ZGlmZiAtLWdpdCBhL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzIxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuY29yZS50ZXN0cyI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvcmUudGVzdHMiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJjdHMgY29yZSB0ZXN0cyIvPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25Db3JlVGVzdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb3JlLnRlc3RzIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iY3RzIGNvcmUgdGVzdHMiLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2Fubm90YXRpb24vc3JjL21haW4vamF2YS9qYXZhL2xhbmcvYW5ub3RhdGlvbi9Jbmhlcml0ZWQuamF2YSBiL2Fubm90YXRpb24vc3JjL21haW4vamF2YS9qYXZhL2xhbmcvYW5ub3RhdGlvbi9Jbmhlcml0ZWQuamF2YQppbmRleCBiMGIyNjk1Li5jZjE2OTI4IDEwMDY0NAotLS0gYS9hbm5vdGF0aW9uL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL2Fubm90YXRpb24vSW5oZXJpdGVkLmphdmEKKysrIGIvYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9hbm5vdGF0aW9uL0luaGVyaXRlZC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiBwYWNrYWdlIGphdmEubGFuZy5hbm5vdGF0aW9uOwogCiAvKioKLSAqIERlZmluZXMgYSBtZXRhLWFubm90YXRpb24gZm9yIGluZGljYXRpbmcgaW5kaWNhdGluZyB0aGF0IGFuIGFubm90YXRpb24gaXMKLSAqIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkLgorICogRGVmaW5lcyBhIG1ldGEtYW5ub3RhdGlvbiBmb3IgaW5kaWNhdGluZyB0aGF0IGFuIGFubm90YXRpb24gaXMgYXV0b21hdGljYWxseQorICogaW5oZXJpdGVkLgogICogCiAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwpkaWZmIC0tZ2l0IGEvYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvbi5qYXZhIGIvYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvbi5qYXZhCmluZGV4IDI1Nzg3N2EuLjFjNDQwYWUgMTAwNjQ0Ci0tLSBhL2Fubm90YXRpb24vc3JjL21haW4vamF2YS9qYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb24uamF2YQorKysgYi9hbm5vdGF0aW9uL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKIHBhY2thZ2UgamF2YS5sYW5nLmFubm90YXRpb247CiAKIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQotLy8gVW4tbGlua2VkIFJldGVudGlvblBvbGljeSNSVU5USU1FIGR1ZSB0byBkcm9pZGRvYyBwcm9ibGVtIChpdCBkb2Vzbid0CisvLyBVbi1saW5rZWQgUmV0ZW50aW9uUG9saWN5I1JVTlRJTUUgZHVlIHRvIGNsZWFyamF2YWRvYyBwcm9ibGVtIChpdCBkb2Vzbid0CiAvLyB5ZXQgZGVhbCB3aXRoIGxpbmtzIHRvIGVudW1zKS4KIC8vIEVORCBhbmRyb2lkLW5vdGUKIApkaWZmIC0tZ2l0IGEvYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhIGIvYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCmluZGV4IDIxODJhZTAuLjkxZjM1NDggMTAwNjQ0Ci0tLSBhL2Fubm90YXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYW5ub3RhdGlvbi9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQorKysgYi9hbm5vdGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2Fubm90YXRpb24vaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKQEAgLTIwLDEyICsyMCwyMiBAQAogICogaWYgdGhpcyB0b29sIHJ1bnMgYWdhaW4uIEJldHRlciBtYWtlIGNoYW5nZXMgaW4gdGhlIHRlbXBsYXRlIGZpbGUuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBSZWR1bmRhbnQgY29kZSBoYXMgYmVlbiByZW1vdmVkIGFuZCBpcyBub3cgY2FsbGVkIGZyb20gTXNnSGVscC4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYW5ub3RhdGlvbi5pbnRlcm5hbC5ubHM7CiAKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAorLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2dIZWxwOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKICAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHN0cmluZ3MgZnJvbSBhIHJlc291cmNlIGJ1bmRsZSBhbmQgcmV0dXJucyB0aGVtLApAQCAtNDMsOCArNTMsMTAgQEAKICAqLwogcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzUmVzb3VyY2UgPQogICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmFubm90YXRpb24uaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsKKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdoaWNoIGhhcyBubyBhcmd1bWVudHMuCkBAIC01NCw3ICs2Niw5IEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKQEAgLTEyMSw2ICsxMzUsMTIgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnLCBhcmdzKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KKworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIER1cGxpY2F0ZSBjb2RlIHdhcyBkcm9wcGVkIGluIGZhdm9yIG9mIHVzaW5nIE1zZ0hlbHAuCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogfQpkaWZmIC0tZ2l0IGEvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25Gb3JtYXRFcnJvclRlc3QuamF2YSBiL2Fubm90YXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYW5ub3RhdGlvbi90ZXN0cy9qYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRm9ybWF0RXJyb3JUZXN0LmphdmEKaW5kZXggYjgwZjNhOS4uNmJkNDUyNiAxMDA2NDQKLS0tIGEvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25Gb3JtYXRFcnJvclRlc3QuamF2YQorKysgYi9hbm5vdGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2Fubm90YXRpb24vdGVzdHMvamF2YS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbkZvcm1hdEVycm9yVGVzdC5qYXZhCkBAIC0xNywxNyArMTcsMzIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYW5ub3RhdGlvbi50ZXN0cy5qYXZhLmxhbmcuYW5ub3RhdGlvbjsKIAotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25Gb3JtYXRFcnJvcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRm9ybWF0RXJyb3I7CisKIC8qKgogICogVGVzdCBjYXNlIG9mIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25Gb3JtYXRFcnJvcgogICovCitAVGVzdFRhcmdldENsYXNzKEFubm90YXRpb25Gb3JtYXRFcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZvcm1hdEVycm9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbkZvcm1hdEVycm9yI0Fubm90YXRpb25Gb3JtYXRFcnJvcihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFubm90YXRpb25Gb3JtYXRFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEFubm90YXRpb25Gb3JtYXRFcnJvciBlID0gbmV3IEFubm90YXRpb25Gb3JtYXRFcnJvcigic29tZSBtZXNzYWdlIik7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRm9ybWF0RXJyb3IjQW5ub3RhdGlvbkZvcm1hdEVycm9yKFRocm93YWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQW5ub3RhdGlvbkZvcm1hdEVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3JMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgQW5ub3RhdGlvbkZvcm1hdEVycm9yIGUgPSBuZXcgQW5ub3RhdGlvbkZvcm1hdEVycm9yKGlhZSk7CkBAIC00Niw2ICs3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRm9ybWF0RXJyb3IjQW5ub3RhdGlvbkZvcm1hdEVycm9yKFN0cmluZyxUaHJvd2FibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFubm90YXRpb25Gb3JtYXRFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKZGlmZiAtLWdpdCBhL2Fubm90YXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYW5ub3RhdGlvbi90ZXN0cy9qYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uVHlwZU1pc21hdGNoRXhjZXB0aW9uVGVzdC5qYXZhIGIvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25UeXBlTWlzbWF0Y2hFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggOTk0OGUyOS4uMjY3NWUwNiAxMDA2NDQKLS0tIGEvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25UeXBlTWlzbWF0Y2hFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25UeXBlTWlzbWF0Y2hFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDE0ICsxNywyMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hbm5vdGF0aW9uLnRlc3RzLmphdmEubGFuZy5hbm5vdGF0aW9uOwogCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvblR5cGVNaXNtYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvblR5cGVNaXNtYXRjaEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKIC8qKgogICogVGVzdCBjYXNlIG9mIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25UeXBlTWlzbWF0Y2hFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhBbm5vdGF0aW9uVHlwZU1pc21hdGNoRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVHlwZU1pc21hdGNoRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgpAQCAtMzMsNiArMzksMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvblR5cGVNaXNtYXRjaEV4Y2VwdGlvbiNBbm5vdGF0aW9uVHlwZU1pc21hdGNoRXhjZXB0aW9uKE1ldGhvZCwKICAgICAgKiAgICAgICAgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBbm5vdGF0aW9uVHlwZU1pc21hdGNoRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25zdHJ1Y3RvckxqYXZhX2xhbmdfcmVmbGVjdF9NZXRob2RMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuU3RyaW5nIikuZ2V0TWV0aG9kcygpOwpkaWZmIC0tZ2l0IGEvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlVGVzdC5qYXZhIGIvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlVGVzdC5qYXZhCmluZGV4IGQ4MWNhYmQuLjY0NDdhOWYgMTAwNjQ0Ci0tLSBhL2Fubm90YXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYW5ub3RhdGlvbi90ZXN0cy9qYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZVRlc3QuamF2YQorKysgYi9hbm5vdGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2Fubm90YXRpb24vdGVzdHMvamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGVUZXN0LmphdmEKQEAgLTE3LDIwICsxNywzNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hbm5vdGF0aW9uLnRlc3RzLmphdmEubGFuZy5hbm5vdGF0aW9uOwogCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCiAvKioKICAqIFRlc3QgY2FzZSBvZiBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZQogICovCitAVGVzdFRhcmdldENsYXNzKEVsZW1lbnRUeXBlLmNsYXNzKQogcHVibGljIGNsYXNzIEVsZW1lbnRUeXBlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlI3ZhbHVlT2YoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFNhbWUoRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFLCBFbGVtZW50VHlwZQpAQCAtNTUsNiArNzAsMTUgQEAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSN2YWx1ZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBFbGVtZW50VHlwZVtdIHZhbHVlcyA9IEVsZW1lbnRUeXBlLnZhbHVlcygpOwpkaWZmIC0tZ2l0IGEvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0luY29tcGxldGVBbm5vdGF0aW9uRXhjZXB0aW9uVGVzdC5qYXZhIGIvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL0luY29tcGxldGVBbm5vdGF0aW9uRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDBhY2Q0ZmEuLmQ2YzgzMzkgMTAwNjQ0Ci0tLSBhL2Fubm90YXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYW5ub3RhdGlvbi90ZXN0cy9qYXZhL2xhbmcvYW5ub3RhdGlvbi9JbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9hbm5vdGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2Fubm90YXRpb24vdGVzdHMvamF2YS9sYW5nL2Fubm90YXRpb24vSW5jb21wbGV0ZUFubm90YXRpb25FeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDE5ICsxNywzMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hbm5vdGF0aW9uLnRlc3RzLmphdmEubGFuZy5hbm5vdGF0aW9uOwogCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uSW5jb21wbGV0ZUFubm90YXRpb25FeGNlcHRpb247CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCi0vKioKLSAqIAotICovCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uSW5jb21wbGV0ZUFubm90YXRpb25FeGNlcHRpb247CisKK0BUZXN0VGFyZ2V0Q2xhc3MoSW5jb21wbGV0ZUFubm90YXRpb25FeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgSW5jb21wbGV0ZUFubm90YXRpb25FeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIEluY29tcGxldGVBbm5vdGF0aW9uRXhjZXB0aW9uKFN0cmluZykKICAgICAgKiBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTI0NzcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2xhc3MuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsVHlwZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBJbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvbihudWxsLCAic3RyIik7CkBAIC00NCw2ICs1NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5JbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvbiNJbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvbihDbGFzcywKICAgICAgKiAgICAgICAgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2xhc3MuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3JMamF2YV9sYW5nX0NsYXNzX0xqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeVRlc3QuamF2YSBiL2Fubm90YXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYW5ub3RhdGlvbi90ZXN0cy9qYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3lUZXN0LmphdmEKaW5kZXggYzRmN2MwMy4uYWRlYjAzOSAxMDA2NDQKLS0tIGEvYW5ub3RhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hbm5vdGF0aW9uL3Rlc3RzL2phdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeVRlc3QuamF2YQorKysgYi9hbm5vdGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2Fubm90YXRpb24vdGVzdHMvamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5VGVzdC5qYXZhCkBAIC0xNywxOSArMTcsMzQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYW5ub3RhdGlvbi50ZXN0cy5qYXZhLmxhbmcuYW5ub3RhdGlvbjsKIAotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCiAvKioKICAqIFRlc3QgY2FzZSBvZiBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kKICAqLworQFRlc3RUYXJnZXRDbGFzcyhSZXRlbnRpb25Qb2xpY3kuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmV0ZW50aW9uUG9saWN5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAvKioKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kjdmFsdWVPZihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0U2FtZShSZXRlbnRpb25Qb2xpY3kuQ0xBU1MsIFJldGVudGlvblBvbGljeQpAQCAtNTAsNiArNjUsMTUgQEAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kjdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUmV0ZW50aW9uUG9saWN5W10gdmFsdWVzID0gUmV0ZW50aW9uUG9saWN5LnZhbHVlcygpOwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvQXR0cmlidXRlcy5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvQXR0cmlidXRlcy5qYXZhCmluZGV4IDAxNjZmNWIuLjVhNGQ5MjMgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0F0dHJpYnV0ZXMuamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9BdHRyaWJ1dGVzLmphdmEKQEAgLTI1LDY0ICsyNSwxOTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS51dGlsLlV0aWw7CiAKIC8qKgotICogVGhlIEF0dHJpYnV0ZXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSB2YWx1ZXMgZm9yIE1hbmlmZXN0IGVudHJpZXMuIEF0dHJpYnV0ZXMKLSAqIGtleXMgYXJlIGdlbmVyYWxseSBpbnN0YW5jZXMgb2YgQXR0cmlidXRlcy5OYW1lLiBWYWx1ZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiBBdHRyaWJ1dGVzIGtleXMgYXJlIG9mIHR5cGUgU3RyaW5nLgorICogVGhlIHtAY29kZSBBdHRyaWJ1dGVzfSBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIHZhbHVlcyBmb3IgbWFuaWZlc3QgZW50cmllcy4KKyAqIEF0dHJpYnV0ZSBrZXlzIGFyZSBnZW5lcmFsbHkgaW5zdGFuY2VzIG9mIHtAY29kZSBBdHRyaWJ1dGVzLk5hbWV9LiBWYWx1ZXMKKyAqIGFzc29jaWF0ZWQgd2l0aCBhdHRyaWJ1dGUga2V5cyBhcmUgb2YgdHlwZSB7QGNvZGUgU3RyaW5nfS4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQXR0cmlidXRlcyBpbXBsZW1lbnRzIENsb25lYWJsZSwgTWFwPE9iamVjdCwgT2JqZWN0PiB7CiAKKyAgICAvKioKKyAgICAgKiBUaGUge0Bjb2RlIEF0dHJpYnV0ZXN9IGFzIG5hbWUvdmFsdWUgcGFpcnMuIE1hcHMgdGhlIGF0dHJpYnV0ZSBuYW1lcyAoYXMKKyAgICAgKiB7QGxpbmsgQXR0cmlidXRlcy5OYW1lfSkgb2YgYSBKQVIgZmlsZSBtYW5pZmVzdCB0byBhcmJpdHJhcnkgdmFsdWVzLiBUaGUKKyAgICAgKiBhdHRyaWJ1dGUgbmFtZXMgdGh1cyBhcmUgb2J0YWluZWQgZnJvbSB0aGUge0BsaW5rIE1hbmlmZXN0fSBmb3IKKyAgICAgKiBjb252ZW5pZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiBtYXA7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBwYXJ0IG9mIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIGNvbnN0aXR1dGluZyBhbiBhdHRyaWJ1dGUgYXMKKyAgICAgKiBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBKQVIgbWFuaWZlc3QuIE1heSBiZSBjb21wb3NlZCBvZiB0aGUKKyAgICAgKiBmb2xsb3dpbmcgQVNDSUkgc2lnbnMgYXMgZGVmaW5lZCBpbiB0aGUgRUJORiBiZWxvdzoKKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqIG5hbWUgICAgICAgPSBhbHBoYW51bSAqaGVhZGVyY2hhcgorICAgICAqIGhlYWRlcmNoYXIgPSBhbHBoYW51bSB8IC0gfCBfCisgICAgICogYWxwaGFudW0gICA9IHtBLVp9IHwge2Eten0gfCB7MC05fSAKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWUgewogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogCiAgICAgICAgIHByaXZhdGUgaW50IGhhc2hDb2RlOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY2xhc3MgcGF0aCAoYSBtYWluIGF0dHJpYnV0ZSkuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmFtZSBDTEFTU19QQVRIID0gbmV3IE5hbWUoIkNsYXNzLVBhdGgiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgbWFuaWZlc3QgZmlsZSAoYSBtYWluIGF0dHJpYnV0ZSkuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmFtZSBNQU5JRkVTVF9WRVJTSU9OID0gbmV3IE5hbWUoCiAgICAgICAgICAgICAgICAgIk1hbmlmZXN0LVZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFpbiBjbGFzcydzIG5hbWUgKGZvciBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbnMpLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWUgTUFJTl9DTEFTUyA9IG5ldyBOYW1lKCJNYWluLUNsYXNzIik7IC8vJE5PTi1OTFMtMSQKIAorICAgICAgICAvKioKKyAgICAgICAgICogRGVmaW5lcyB0aGUgc2lnbmF0dXJlIHZlcnNpb24gb2YgdGhlIEpBUiBmaWxlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWUgU0lHTkFUVVJFX1ZFUlNJT04gPSBuZXcgTmFtZSgKICAgICAgICAgICAgICAgICAiU2lnbmF0dXJlLVZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUge0Bjb2RlIENvbnRlbnQtVHlwZX0gbWFuaWZlc3QgYXR0cmlidXRlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lIENPTlRFTlRfVFlQRSA9IG5ldyBOYW1lKCJDb250ZW50LVR5cGUiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUge0Bjb2RlIFNlYWxlZH0gbWFuaWZlc3QgYXR0cmlidXRlIHdoaWNoIG1heSBoYXZlIHRoZSB2YWx1ZQorICAgICAgICAgKiB7QGNvZGUgdHJ1ZX0gZm9yIHNlYWxlZCBhcmNoaXZlcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lIFNFQUxFRCA9IG5ldyBOYW1lKCJTZWFsZWQiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUge0Bjb2RlIEltcGxlbWVudGF0aW9uLVRpdGxlfSBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcKKyAgICAgICAgICogdGhhdCBkZWZpbmVzIHRoZSB0aXRsZSBvZiB0aGUgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWUgSU1QTEVNRU5UQVRJT05fVElUTEUgPSBuZXcgTmFtZSgKICAgICAgICAgICAgICAgICAiSW1wbGVtZW50YXRpb24tVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUge0Bjb2RlIEltcGxlbWVudGF0aW9uLVZlcnNpb259IGF0dHJpYnV0ZSBkZWZpbmluZyB0aGUgdmVyc2lvbiBvZgorICAgICAgICAgKiB0aGUgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWUgSU1QTEVNRU5UQVRJT05fVkVSU0lPTiA9IG5ldyBOYW1lKAogICAgICAgICAgICAgICAgICJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHtAY29kZSBJbXBsZW1lbnRhdGlvbi1WZW5kb3J9IGF0dHJpYnV0ZSBkZWZpbmluZyB0aGUgb3JnYW5pemF0aW9uCisgICAgICAgICAqIHRoYXQgbWFpbnRhaW5zIHRoZSBleHRlbnNpb24gaW1wbGVtZW50YXRpb24uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmFtZSBJTVBMRU1FTlRBVElPTl9WRU5ET1IgPSBuZXcgTmFtZSgKICAgICAgICAgICAgICAgICAiSW1wbGVtZW50YXRpb24tVmVuZG9yIik7IC8vJE5PTi1OTFMtMSQKIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHtAY29kZSBTcGVjaWZpY2F0aW9uLVRpdGxlfSBhdHRyaWJ1dGUgZGVmaW5pbmcgdGhlIHRpdGxlIG9mIHRoZQorICAgICAgICAgKiBleHRlbnNpb24gc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lIFNQRUNJRklDQVRJT05fVElUTEUgPSBuZXcgTmFtZSgKICAgICAgICAgICAgICAgICAiU3BlY2lmaWNhdGlvbi1UaXRsZSIpOyAvLyROT04tTkxTLTEkCiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB7QGNvZGUgU3BlY2lmaWNhdGlvbi1WZXJzaW9ufSBhdHRyaWJ1dGUgZGVmaW5pbmcgdGhlIHZlcnNpb24gb2YKKyAgICAgICAgICogdGhlIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWUgU1BFQ0lGSUNBVElPTl9WRVJTSU9OID0gbmV3IE5hbWUoCiAgICAgICAgICAgICAgICAgIlNwZWNpZmljYXRpb24tVmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB7QGNvZGUgU3BlY2lmaWNhdGlvbi1WZW5kb3J9IGF0dHJpYnV0ZSBkZWZpbmluZyB0aGUgb3JnYW5pemF0aW9uCisgICAgICAgICAqIHRoYXQgbWFpbnRhaW5zIHRoZSBleHRlbnNpb24gc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lIFNQRUNJRklDQVRJT05fVkVORE9SID0gbmV3IE5hbWUoCiAgICAgICAgICAgICAgICAgIlNwZWNpZmljYXRpb24tVmVuZG9yIik7IC8vJE5PTi1OTFMtMSQKIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHtAY29kZSBFeHRlbnNpb24tTGlzdH0gYXR0cmlidXRlIGRlZmluaW5nIHRoZSBleHRlbnNpb25zIHRoYXQgYXJlCisgICAgICAgICAqIG5lZWRlZCBieSB0aGUgYXBwbGV0LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWUgRVhURU5TSU9OX0xJU1QgPSBuZXcgTmFtZSgiRXh0ZW5zaW9uLUxpc3QiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUge0Bjb2RlIEV4dGVuc2lvbi1OYW1lfSBhdHRyaWJ1dGUgd2hpY2ggZGVmaW5lcyB0aGUgdW5pcXVlIG5hbWUgb2YKKyAgICAgICAgICogdGhlIGV4dGVuc2lvbi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lIEVYVEVOU0lPTl9OQU1FID0gbmV3IE5hbWUoIkV4dGVuc2lvbi1OYW1lIik7IC8vJE5PTi1OTFMtMSQKIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHtAY29kZSBFeHRlbnNpb24tSW5zdGFsbGF0aW9ufSBhdHRyaWJ1dGUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmFtZSBFWFRFTlNJT05fSU5TVEFMTEFUSU9OID0gbmV3IE5hbWUoCiAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbi1JbnN0YWxsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUge0Bjb2RlIEltcGxlbWVudGF0aW9uLVZlbmRvci1JZH0gYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgdmVuZG9yCisgICAgICAgICAqIG9mIGFuIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiBpZiB0aGUgYXBwbGV0IHJlcXVpcmVzIGFuCisgICAgICAgICAqIGltcGxlbWVudGF0aW9uIGZyb20gYSBzcGVjaWZpYyB2ZW5kb3IuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmFtZSBJTVBMRU1FTlRBVElPTl9WRU5ET1JfSUQgPSBuZXcgTmFtZSgKICAgICAgICAgICAgICAgICAiSW1wbGVtZW50YXRpb24tVmVuZG9yLUlkIik7IC8vJE5PTi1OTFMtMSQKIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHtAY29kZSBJbXBsZW1lbnRhdGlvbi1VUkx9IGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIGEgVVJMIHRoYXQgY2FuIGJlCisgICAgICAgICAqIHVzZWQgdG8gb2J0YWluIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBleHRlbnNpb24gaWYgdGhlCisgICAgICAgICAqIHJlcXVpcmVkIHZlcnNpb24gaXMgbm90IGFscmVhZHkgaW5zdGFsbGVkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWUgSU1QTEVNRU5UQVRJT05fVVJMID0gbmV3IE5hbWUoCiAgICAgICAgICAgICAgICAgIkltcGxlbWVudGF0aW9uLVVSTCIpOyAvLyROT04tTkxTLTEkCiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgU3RyaW5nIHdoaWNoIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIEVCTkYgZ3JhbW1hciB0byBzcGVjaWZ5IGFuCisgICAgICAgICAqIGFkZGl0aW9uYWwgYXR0cmlidXRlOgorICAgICAgICAgKiAKKyAgICAgICAgICogPHByZT4KKyAgICAgICAgICogbmFtZSAgICAgICA9IGFscGhhbnVtICpoZWFkZXJjaGFyCisgICAgICAgICAqIGhlYWRlcmNoYXIgPSBhbHBoYW51bSB8IC0gfCBfCisgICAgICAgICAqIGFscGhhbnVtICAgPSB7QS1afSB8IHthLXp9IHwgezAtOX0KKyAgICAgICAgICogPC9wcmU+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gcworICAgICAgICAgKiAgICAgICAgICAgIFRoZSBBdHRyaWJ1dGUgc3RyaW5nLgorICAgICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IHNhdGlzZnkgdGhlIEVCTkYgZ3JhbW1hci4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgTmFtZShTdHJpbmcgcykgewogICAgICAgICAgICAgaW50IGkgPSBzLmxlbmd0aCgpOwogICAgICAgICAgICAgaWYgKGkgPT0gMCB8fCBpID4gNzApIHsKQEAgLTk4LDExICsyMzIsMjYgQEAKICAgICAgICAgICAgIG5hbWUgPSBzOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhpcyBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogcmV0dXJucyB3aGV0aGVyIHRoZSBhcmd1bWVudCBwcm92aWRlZCBpcyB0aGUgc2FtZSBhcyB0aGUgYXR0cmlidXRlCisgICAgICAgICAqIG5hbWUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIGlmIHRoZSBhdHRyaWJ1dGUgbmFtZXMgY29ycmVzcG9uZC4KKyAgICAgICAgICogQHBhcmFtIGFuCisgICAgICAgICAqICAgICAgICAgICAgQW4gYXR0cmlidXRlIG5hbWUgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGlzIG5hbWUuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW4pIHsKICAgICAgICAgICAgIGlmIChhbiA9PSBudWxsKSB7CkBAIC0xMTIsNiArMjYxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKE5hbWUpIGFuKS5uYW1lKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wdXRlcyBhIGhhc2ggY29kZSBvZiB0aGUgbmFtZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIGhhc2ggdmFsdWUgY29tcHV0ZWQgZnJvbSB0aGUgbmFtZS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgICAgIGlmIChoYXNoQ29kZSA9PSAwKSB7CkBAIC0xMjIsMTggKzI3NywyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gQXR0cmlidXRlcyBpbnN0YW5jZQorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIEF0dHJpYnV0ZXN9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBdHRyaWJ1dGVzKCkgewogICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIEF0dHJpYnV0ZXMgaW5zdGFuY2Ugb2J0YWluaW5nIGtleXMgYW5kIHZhbHVlcyBmcm9tIHRoZQotICAgICAqIHBhcmFtZXRlciBBdHRyaWJ1dGVzLCBhdHRyaWIKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHtAY29kZSBBdHRyaWJ1dGVzfSBpbnN0YW5jZSBvYnRhaW5pbmcga2V5cyBhbmQgdmFsdWVzIGZyb20KKyAgICAgKiB0aGUgcGFyYW1ldGVyIHtAY29kZSBhdHRyaWJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhdHRyaWIKLSAgICAgKiAgICAgICAgICAgIFRoZSBBdHRyaWJ1dGVzIHRvIG9idGFpbiBlbnRyaWVzIGZyb20uCisgICAgICogICAgICAgICAgICBUaGUgYXR0cmlidXRlcyB0byBvYnRhaW4gZW50cmllcyBmcm9tLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmliKSB7CkBAIC0xNDEsOTcgKzI5OSwxMDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIEF0dHJpYnV0ZXMgaW5zdGFuY2Ugd2l0aCBpbml0aWFsIGNhcGFjaXR5IG9mIHNpemUgc2l6ZQorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIEF0dHJpYnV0ZXN9IGluc3RhbmNlIHdpdGggaW5pdGlhbCBjYXBhY2l0eSBvZiBzaXplCisgICAgICoge0Bjb2RlIHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICBJbml0aWFsIHNpemUgb2YgdGhpcyBBdHRyaWJ1dGVzIGluc3RhbmNlLgorICAgICAqICAgICAgICAgICAgSW5pdGlhbCBzaXplIG9mIHRoaXMge0Bjb2RlIEF0dHJpYnV0ZXN9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBdHRyaWJ1dGVzKGludCBzaXplKSB7CiAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PihzaXplKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGlzIEF0dHJpYnV0ZXMuCisgICAgICogUmVtb3ZlcyBhbGwga2V5L3ZhbHVlIHBhaXJzIGZyb20gdGhpcyB7QGNvZGUgQXR0cmlidXRlc30uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgIG1hcC5jbGVhcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIEF0dHJpYnV0ZXMgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkKLSAgICAgKiAKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQXR0cmlidXRlc30gY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQogICAgICAqICAgICAgICAgICAgVGhlIGtleSB0byBzZWFyY2ggZm9yLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUga2V5IGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUga2V5IGlzIGZvdW5kLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBBdHRyaWJ1dGVzIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQXR0cmlidXRlc30gY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHZhbHVlIGlzIGZvdW5kLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgY29udGFpbmluZyBNYXBFbnRyeSdzIGZvciBlYWNoIG9mIHRoZSBrZXkvdmFsdWUgcGFpcnMKLSAgICAgKiBjb250YWluZWQgaW4gdGhpcyBBdHRyaWJ1dGVzLgorICAgICAqIFJldHVybnMgYSBzZXQgY29udGFpbmluZyBtYXAgZW50cmllcyBmb3IgZWFjaCBvZiB0aGUga2V5L3ZhbHVlIHBhaXIKKyAgICAgKiBjb250YWluZWQgaW4gdGhpcyB7QGNvZGUgQXR0cmlidXRlc30uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNldCBvZiBNYXBFbnRyeSdzCisgICAgICogQHJldHVybiBhIHNldCBvZiBNYXAuRW50cnkncworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gZW50cnlTZXQoKSB7CiAgICAgICAgIHJldHVybiBtYXAuZW50cnlTZXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlciBrZXkKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlciBrZXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgVGhlIGtleSB0byBzZWFyY2ggZm9yLgotICAgICAqIEByZXR1cm4gT2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBrZXksIG9yIG51bGwgaWYga2V5IGRvZXMgbm90IGV4aXN0LgorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4gT2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBrZXksIG9yIHtAY29kZSBudWxsfSBpZiBrZXkgZG9lcyBub3QKKyAgICAgKiAgICAgICAgIGV4aXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKICAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBBdHRyaWJ1dGVzIGNvbnRhaW5zIGFueSBrZXlzCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMge0Bjb2RlIEF0dHJpYnV0ZXN9IGNvbnRhaW5zIGFueSBrZXlzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBvbmUgb3IgbW9yZSBrZXlzIGV4aXN0LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvbmUgb3IgbW9yZSBrZXlzIGV4aXN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewogICAgICAgICByZXR1cm4gbWFwLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2V0IGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzIGZvdW5kIGluIHRoaXMgQXR0cmlidXRlcy4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIFNldH0gY29udGFpbmluZyBhbGwgdGhlIGtleXMgZm91bmQgaW4gdGhpcyB7QGNvZGUKKyAgICAgKiBBdHRyaWJ1dGVzfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU2V0IG9mIGFsbCBrZXlzCisgICAgICogQHJldHVybiBhIHtAY29kZSBTZXR9IG9mIGFsbCBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBrZXlTZXQoKSB7CiAgICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3RvcmUgdmFsdWUgaW4gdGhpcyBBdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBrZXkuCisgICAgICogU3RvcmVzIGtleS92YWx1ZSBwYWlycyBpbiB0aGlzIHtAY29kZSBBdHRyaWJ1dGVzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICBUaGUga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHZhbHVlLgorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBhc3NvY2lhdGUgd2l0aCB2YWx1ZS4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGlzIEF0dHJpYnV0ZXMKLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBiZWluZyBzdG9yZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGlzIHtAY29kZSBBdHRyaWJ1dGVzfS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBiZWluZyBzdG9yZWQuCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGtleSBpcyBub3QgYW4gQXR0cmlidXRlcy5OYW1lIG9yIHZhbHVlIGlzIG5vdCBhCi0gICAgICogICAgICAgICAgICAgICAgU3RyaW5nCisgICAgICogICAgICAgICAgICAgICAgd2hlbiBrZXkgaXMgbm90IGFuIHtAY29kZSBBdHRyaWJ1dGVzLk5hbWV9IG9yIHZhbHVlIGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgIGEge0Bjb2RlIFN0cmluZ30uCisgICAgICpAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpIC8vIFJlcXVpcmUgY2FzdCB0byBmb3JjZSBDbGFzc0Nhc3RFeGNlcHRpb24KICAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKQEAgLTIzOSwxMCArNDA3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3RvcmUgYWxsIHRoZSBrZXkudmFsdWUgcGFpcnMgaW4gdGhlIGFyZ3VtZW50IGluIHRoaXMgQXR0cmlidXRlcy4KKyAgICAgKiBTdG9yZXMgYWxsIHRoZSBrZXkvdmFsdWUgcGFpcnMgaW4gdGhlIGFyZ3VtZW50IGluIHRoaXMge0Bjb2RlIEF0dHJpYnV0ZXN9CisgICAgICogLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhdHRyaWIKLSAgICAgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGlvbnMgdG8gc3RvcmUgKG11c3QgYmUgb2YgdHlwZSBBdHRyaWJ1dGVzKS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGlvbnMgdG8gc3RvcmUgKG11c3QgYmUgb2YgdHlwZSB7QGNvZGUgQXR0cmlidXRlc30KKyAgICAgKiAgICAgICAgICAgICkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/LCA/PiBhdHRyaWIpIHsKICAgICAgICAgaWYgKGF0dHJpYiA9PSBudWxsIHx8ICEoYXR0cmliIGluc3RhbmNlb2YgQXR0cmlidXRlcykpIHsKQEAgLTI1MiwyOSArNDIzLDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGUga2V5L3ZhbHVlIHBhaXIgd2l0aCBrZXkga2V5IGZyb20gdGhpcyBBdHRyaWJ1dGVzLgorICAgICAqIERlbGV0ZXMgdGhlIGtleS92YWx1ZSBwYWlyIHdpdGgga2V5IHtAY29kZSBrZXl9IGZyb20gdGhpcyB7QGNvZGUKKyAgICAgKiBBdHRyaWJ1dGVzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICBUaGUga2V5IHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbW92ZWQga2V5LCBudWxsIGlmIG5vdCBwcmVzZW50LgorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byByZW1vdmUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVtb3ZlZCBrZXksIHtAY29kZSBudWxsfSBpZiBub3QKKyAgICAgKiAgICAgICAgIHByZXNlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewogICAgICAgICByZXR1cm4gbWFwLnJlbW92ZShrZXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXkudmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQXR0cmlidXRlcy4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZQorICAgICAqIEF0dHJpYnV0ZXN9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBBdHRyaWJ1dGVzCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIHtAY29kZSBBdHRyaWJ1dGVzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBtYXAuc2l6ZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCB0aGUgdmFsdWVzIHByZXNlbnQgaW4gdGhpcyBBdHRyaWJ1dGVzLgorICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgdmFsdWVzIHByZXNlbnQgaW4gdGhpcyB7QGNvZGUgQXR0cmlidXRlc30KKyAgICAgKiAuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIHZhbHVlcyBwcmVzZW50CisgICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgYWxsIHZhbHVlcyBwcmVzZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gdmFsdWVzKCkgewogICAgICAgICByZXR1cm4gbWFwLnZhbHVlcygpOwpAQCAtMjk0LDkgKzQ3MiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhhc2hDb2RlIG9mIHRoaXMgQXR0cmlidXRlcworICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGlzIHtAY29kZSBBdHRyaWJ1dGVzfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoQ29kZSBvZiB0aGlzIE9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTMwNCwxMCArNDgzLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIEF0dHJpYnV0ZXMgYW5kIHRoZSBwYXJhbWV0ZXIgQXR0cmlidXRlcyBhcmUgZXF1YWwuIFR3bwotICAgICAqIEF0dHJpYnV0ZXMgaW5zdGFuY2VzIGFyZSBlcXVhbCBpZiB0aGV5IGNvbnRhaW4gdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzLgorICAgICAqIERldGVybWluZXMgaWYgdGhpcyB7QGNvZGUgQXR0cmlidXRlc30gYW5kIHRoZSBwYXJhbWV0ZXIge0Bjb2RlCisgICAgICogQXR0cmlidXRlc30gYXJlIGVxdWFsLiBUd28ge0Bjb2RlIEF0dHJpYnV0ZXN9IGluc3RhbmNlcyBhcmUgZXF1YWwgaWYgdGhleQorICAgICAqIGNvbnRhaW4gdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQXR0cmlidXRlcyBhcmUgZXF1YWxzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHdpdGggd2hpY2ggdGhpcyB7QGNvZGUgQXR0cmlidXRlc30gaXMgY29tcGFyZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBBdHRyaWJ1dGVzfSBhcmUgZXF1YWwsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtMzIxLDM3ICs1MDUsNDIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlciBBdHRyaWJ1dGVzLk5hbWUga2V5LgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyYW1ldGVyIHtAY29kZSBBdHRyaWJ1dGVzLk5hbWV9CisgICAgICoga2V5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUga2V5IHRvIG9idGFpbiB0aGUgdmFsdWUgZm9yLgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggbmFtZSwgb3IgbnVsbCBpZiBuYW1lIGlzIG5vdCBhIHZhbGlkCi0gICAgICogICAgICAgICBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gb2J0YWluIHRoZSB2YWx1ZSBmb3IuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFN0cmluZ30gYXNzb2NpYXRlZCB3aXRoIG5hbWUsIG9yIHtAY29kZSBudWxsfSBpZiBuYW1lCisgICAgICogICAgICAgICBpcyBub3QgYSB2YWxpZCBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUgbmFtZSkgewogICAgICAgICByZXR1cm4gKFN0cmluZykgbWFwLmdldChuYW1lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgVGhlIGtleSB0byBvYnRhaW4gdGhlIHZhbHVlIGZvci4KLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIG5hbWUsIG9yIG51bGwgaWYgbmFtZSBpcyBub3QgYSB2YWxpZAotICAgICAqICAgICAgICAga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIG9idGFpbiB0aGUgdmFsdWUgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggbmFtZSwgb3Ige0Bjb2RlIG51bGx9IGlmIG5hbWUgaXMgbm90IGEKKyAgICAgKiAgICAgICAgIHZhbGlkIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiAoU3RyaW5nKSBtYXAuZ2V0KG5ldyBBdHRyaWJ1dGVzLk5hbWUobmFtZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN0b3JlcyB2YWx1ZSB2YWwgYWdhaW5zdCBrZXkgbmFtZSBpbiB0aGlzIEF0dHJpYnV0ZXMKKyAgICAgKiBTdG9yZXMgdGhlIHZhbHVlIHtAY29kZSB2YWx9IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IHtAY29kZSBuYW1lfSBpbiB0aGlzCisgICAgICoge0Bjb2RlIEF0dHJpYnV0ZXN9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUga2V5IHRvIHN0b3JlIGFnYWluc3QuCisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHN0b3JlLgogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGlzIEF0dHJpYnV0ZXMKLSAgICAgKiBAcmV0dXJuIHRoZSBWYWx1ZSBiZWluZyBzdG9yZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGlzIHtAY29kZSBBdHRyaWJ1dGVzfS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBiZWluZyBzdG9yZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBwdXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbCkgewogICAgICAgICByZXR1cm4gKFN0cmluZykgbWFwLnB1dChuZXcgQXR0cmlidXRlcy5OYW1lKG5hbWUpLCB2YWwpOwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyRW50cnkuamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phckVudHJ5LmphdmEKaW5kZXggNDllMzRlNi4uYjhkYWJlZSAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyRW50cnkuamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJFbnRyeS5qYXZhCkBAIC0zMCw2ICszMCwxMiBAQAogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CiAKKy8qKgorICogUmVwcmVzZW50cyBhIHNpbmdsZSBmaWxlIGluIGEgSkFSIGFyY2hpdmUgdG9nZXRoZXIgd2l0aCB0aGUgbWFuaWZlc3QKKyAqIGF0dHJpYnV0ZXMgYW5kIGRpZ2l0YWwgc2lnbmF0dXJlcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgSmFyRW50cnkgZXh0ZW5kcyBaaXBFbnRyeSB7CiAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CiAKQEAgLTQzLDMyICs0OSwzNiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZhY3RvcnlDaGVja2VkID0gZmFsc2U7ICAgICAKIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBKYXJFbnRyeSBuYW1lZCBuYW1lCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgSmFyRW50cnl9IG5hbWVkIG5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBuZXcgSmFyRW50cnkKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBuZXcge0Bjb2RlIEphckVudHJ5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSmFyRW50cnkoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEphckVudHJ5IHVzaW5nIHRoZSB2YWx1ZXMgb2J0YWluZWQgZnJvbSBlbnRyeS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBKYXJFbnRyeX0gdXNpbmcgdGhlIHZhbHVlcyBvYnRhaW5lZCBmcm9tIGVudHJ5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBlbnRyeQogICAgICAqICAgICAgICAgICAgVGhlIFppcEVudHJ5IHRvIG9idGFpbiB2YWx1ZXMgZnJvbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSmFyRW50cnkoWmlwRW50cnkgZW50cnkpIHsKICAgICAgICAgc3VwZXIoZW50cnkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEF0dHJpYnV0ZXMgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudHJ5IG9yIG51bGwgaWYgbm9uZQotICAgICAqIGV4aXN0cy4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgQXR0cmlidXRlc30gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudHJ5IG9yCisgICAgICoge0Bjb2RlIG51bGx9IGlmIG5vbmUgZXhpc3RzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIEF0dHJpYnV0ZXMgZm9yIHRoaXMgZW50cnkKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgb2J0YWluaW5nIHRoZSBBdHRyaWJ1dGVzCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIEF0dHJpYnV0ZXN9IGZvciB0aGlzIGVudHJ5LgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgb2J0YWluaW5nIHRoZSB7QGNvZGUgQXR0cmlidXRlc30uCisgICAgICogQHNlZSBBdHRyaWJ1dGVzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwgfHwgcGFyZW50SmFyID09IG51bGwpIHsKQEAgLTgyLDEwICs5MiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgQ2VydGlmaWNhdGUgT2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRyeSBvcgotICAgICAqIG51bGwgaWYgbm9uZSBleGlzdC4KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHtAY29kZSBDZXJ0aWZpY2F0ZX0gT2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIGVudHJ5IG9yIHtAY29kZSBudWxsfSBpZiBub25lIGV4aXN0cy4gTWFrZSBzdXJlIHRoYXQgdGhlIGV2ZXJ5dGhpbmcgaXMKKyAgICAgKiByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbSBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgb3IgZWxzZSB0aGUgbWV0aG9kCisgICAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBDZXJ0aWZpY2F0ZXMgZm9yIHRoaXMgZW50cnkKKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSBmb3IgdGhpcyBlbnRyeS4KKyAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpIHsKICAgICAgICAgaWYgKG51bGwgPT0gcGFyZW50SmFyKSB7CkBAIC0xMDMsMTAgKzExNywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBKYXJFbnRyeSB1c2luZyB0aGUgdmFsdWVzIG9idGFpbmVkIGZyb20gamUuCisgICAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBKYXJFbnRyeX0gdXNpbmcgdGhlIHZhbHVlcyBvYnRhaW5lZCBmcm9tIHRoZQorICAgICAqIGFyZ3VtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBqZQotICAgICAqICAgICAgICAgICAgVGhlIEphckVudHJ5IHRvIG9idGFpbiB2YWx1ZXMgZnJvbQorICAgICAqICAgICAgICAgICAgVGhlIHtAY29kZSBKYXJFbnRyeX0gdG8gb2J0YWluIHZhbHVlcyBmcm9tLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBKYXJFbnRyeShKYXJFbnRyeSBqZSkgewogICAgICAgICBzdXBlcihqZSk7CkBAIC0xMTYsMTIgKzEzMiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvZGUgc2lnbmVycyBmb3IgdGhlIGphciBlbnRyeS4gSWYgdGhlcmUgaXMgbm8gc3VjaCBjb2RlCi0gICAgICogc2lnbmVycywgcmV0dXJucyBudWxsLiBPbmx5IHdoZW4gdGhlIGphciBlbnRyeSBoYXMgYmVlbiBjb21wbGV0ZWx5Ci0gICAgICogdmVyaWZpZWQgYnkgcmVhZGluZyB0aWxsIHRoZSBlbmQgb2YgdGhlIGphciBlbnRyeSwgY2FuIHRoZSBtZXRob2QgYmUKLSAgICAgKiBjYWxsZWQuIE9yIGVsc2UgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBudWxsLgorICAgICAqIFJldHVybnMgdGhlIGNvZGUgc2lnbmVycyBmb3IgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogSkFSIGZpbGUuIElmIHRoZXJlIGlzIG5vIHN1Y2ggY29kZSBzaWduZXIsIGl0IHJldHVybnMge0Bjb2RlIG51bGx9LiBNYWtlCisgICAgICogc3VyZSB0aGF0IHRoZSBldmVyeXRoaW5nIGlzIHJlYWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGJlZm9yZSBjYWxsaW5nCisgICAgICogdGhpcyBtZXRob2QsIG9yIGVsc2UgdGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2RlIHNpZ25lcnMgZm9yIHRoZSBqYXIgZW50cnkuCisgICAgICogQHJldHVybiB0aGUgY29kZSBzaWduZXJzIGZvciB0aGUgSkFSIGVudHJ5LgorICAgICAqIEBzZWUgQ29kZVNpZ25lcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2RlU2lnbmVyW10gZ2V0Q29kZVNpZ25lcnMoKSB7CiAgICAgICAgIGlmIChudWxsID09IHNpZ25lcnMpIHsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phckV4Y2VwdGlvbi5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyRXhjZXB0aW9uLmphdmEKaW5kZXggZTRjOWM3Zi4uZjE4ZDYzOSAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyRXhjZXB0aW9uLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyRXhjZXB0aW9uLmphdmEKQEAgLTIyLDI0ICsyMiwyOSBAQAogLyoqCiAgKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBhIEpBUgogICogZmlsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXJFeGNlcHRpb24gZXh0ZW5kcyBaaXBFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzE1OTc3ODQwMDk2Mzk1NDQ3M0w7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEphckV4Y2VwdGlvbn0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEphckV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSmFyRXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBKYXJFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJGaWxlLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJGaWxlLmphdmEKaW5kZXggYjk2M2QzNy4uOWFmOTA1NiAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyRmlsZS5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phckZpbGUuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAvLyBFTkQgYW5kcm9pZC1hZGRlZAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwpAQCAtMzEsMTkgKzMzLDI0IEBACiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS51dGlsLlV0aWw7CiAKIC8qKgotICogSmFyRmlsZSBpcyB1c2VkIHRvIHJlYWQgamFyIGVudHJpZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YSBmcm9tIGphciBmaWxlcy4KKyAqIHtAY29kZSBKYXJGaWxlfSBpcyB1c2VkIHRvIHJlYWQgamFyIGVudHJpZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YSBmcm9tCisgKiBqYXIgZmlsZXMuCiAgKiAKICAqIEBzZWUgSmFySW5wdXRTdHJlYW0KICAqIEBzZWUgSmFyRW50cnkKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSmFyRmlsZSBleHRlbmRzIFppcEZpbGUgewogCisgICAgLyoqCisgICAgICogVGhlIE1BTklGRVNUIGZpbGUgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9OQU1FID0gIk1FVEEtSU5GL01BTklGRVNULk1GIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0RJUiA9ICJNRVRBLUlORi8iOyAvLyROT04tTkxTLTEkCkBAIC01NCw5ICs2MSw5IEBACiAKICAgICBKYXJWZXJpZmllciB2ZXJpZmllcjsKIAotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICBzdGF0aWMgZmluYWwgY2xhc3MgSmFyRmlsZUlucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewogICAgICAgICBwcml2YXRlIGxvbmcgY291bnQ7CkBAIC0xMzgsMjYgKzE0NSwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBKYXJGaWxlIHVzaW5nIHRoZSBjb250ZW50cyBvZiBmaWxlLgorICAgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgSmFyRmlsZX0gdXNpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgamF2YS5pby5GaWxlCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlIGZpbGUgY2Fubm90IGJlIHJlYWQuCisgICAgICogICAgICAgICAgICB0aGUgSkFSIGZpbGUgYXMge0BsaW5rIEZpbGV9LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgcmVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSmFyRmlsZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoZmlsZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEphckZpbGUgdXNpbmcgdGhlIGNvbnRlbnRzIG9mIGZpbGUuCisgICAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBKYXJGaWxlfSB1c2luZyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBqYXZhLmlvLkZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBKQVIgZmlsZSBhcyB7QGxpbmsgRmlsZX0uCiAgICAgICogQHBhcmFtIHZlcmlmeQotICAgICAqICAgICAgICAgICAgdmVyaWZ5IGEgc2lnbmVkIGphciBmaWxlCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlIGZpbGUgY2Fubm90IGJlIHJlYWQuCisgICAgICogICAgICAgICAgICBpZiB0aGlzIEpBUiBmaWxlIGlzIHNpZ25lZCB3aGV0aGVyIGl0IG11c3QgYmUgdmVyaWZpZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZSBmaWxlIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBKYXJGaWxlKEZpbGUgZmlsZSwgYm9vbGVhbiB2ZXJpZnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKGZpbGUpOwpAQCAtMTY4LDE2ICsxNzcsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgSmFyRmlsZSB1c2luZyB0aGUgY29udGVudHMgb2YgZmlsZS4KKyAgICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIEphckZpbGV9IHVzaW5nIHRoZSBjb250ZW50cyBvZiBmaWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBqYXZhLmlvLkZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBKQVIgZmlsZSBhcyB7QGxpbmsgRmlsZX0uCiAgICAgICogQHBhcmFtIHZlcmlmeQotICAgICAqICAgICAgICAgICAgdmVyaWZ5IGEgc2lnbmVkIGphciBmaWxlCisgICAgICogICAgICAgICAgICBpZiB0aGlzIEpBUiBmaWxlZCBpcyBzaWduZWQgd2hldGhlciBpdCBtdXN0IGJlIHZlcmlmaWVkLgogICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgICAgICAgICB0aGUgbW9kZSB0byB1c2UsIGVpdGhlciBPUEVOX1JFQUQgb3IgT1BFTl9SRUFEIHwgT1BFTl9ERUxFVEUKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgcmVhZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtb2RlIHRvIHVzZSwgZWl0aGVyIHtAbGluayBaaXBGaWxlI09QRU5fUkVBRCBPUEVOX1JFQUR9IG9yCisgICAgICogICAgICAgICAgICB7QGxpbmsgWmlwRmlsZSNPUEVOX0RFTEVURSBPUEVOX0RFTEVURX0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZSBmaWxlIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBKYXJGaWxlKEZpbGUgZmlsZSwgYm9vbGVhbiB2ZXJpZnksIGludCBtb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihmaWxlLCBtb2RlKTsKQEAgLTE4OCwxMiArMTk5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEphckZpbGUgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IGZpbGVuYW1lLgorICAgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgSmFyRmlsZX0gZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5CisgICAgICogZmlsZW5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgZmlsZU5hbWUgY2Fubm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIG5hbWUgcmVmZXJyaW5nIHRvIHRoZSBKQVIgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZmlsZSBuYW1lIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEphckZpbGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzKGZpbGVuYW1lLCB0cnVlKTsKQEAgLTIwMSwxNCArMjE0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEphckZpbGUgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IGZpbGVuYW1lLgorICAgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgSmFyRmlsZX0gZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5CisgICAgICoge0Bjb2RlIGZpbGVuYW1lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIG5hbWUgcmVmZXJyaW5nIHRvIHRoZSBKQVIgZmlsZS4KICAgICAgKiBAcGFyYW0gdmVyaWZ5Ci0gICAgICogICAgICAgICAgICB2ZXJpZnkgYSBzaWduZWQgamFyIGZpbGUKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBmaWxlTmFtZSBjYW5ub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nLgorICAgICAqICAgICAgICAgICAgaWYgdGhpcyBKQVIgZmlsZWQgaXMgc2lnbmVkIHdoZXRoZXIgaXQgbXVzdCBiZSB2ZXJpZmllZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIG9yIHJlYWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEphckZpbGUoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIHZlcmlmeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIoZmlsZW5hbWUpOwpAQCAtMjE5LDExICsyMzQsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gY29udGFpbmluZyB0aGUgSmFyRW50cnlzIGNvbnRhaW5lZCBpbiB0aGlzIEphckZpbGUuCisgICAgICogUmV0dXJuIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgdGhlIHtAY29kZSBKYXJFbnRyeXN9IGNvbnRhaW5lZCBpbiB0aGlzCisgICAgICoge0Bjb2RlIEphckZpbGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS51dGlsLkVudW1lcmF0aW9uCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBKYXJGaWxlIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgRW51bWVyYXRpb259IGNvbnRhaW5pbmcgdGhlIEpBUiBlbnRyaWVzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgSmFyRmlsZX0gaXMgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcygpIHsKQEAgLTI1MSwxOCArMjY4LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBKYXJFbnRyeSBzcGVjaWZpZWQgYnkgbmFtZSBvciBudWxsIGlmIG5vIHN1Y2ggZW50cnkgZXhpc3RzLgorICAgICAqIFJldHVybiB0aGUge0Bjb2RlIEphckVudHJ5fSBzcGVjaWZpZWQgYnkgaXRzIG5hbWUgb3Ige0Bjb2RlIG51bGx9IGlmIG5vCisgICAgICogc3VjaCBlbnRyeSBleGlzdHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgamFyIGZpbGUKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuSmFyRW50cnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgSkFSIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgSkFSIGVudHJ5IGRlZmluZWQgYnkgdGhlIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEphckVudHJ5IGdldEphckVudHJ5KFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiAoSmFyRW50cnkpIGdldEVudHJ5KG5hbWUpOwogICAgIH0KIAogCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIHByaXZhdGUgYnl0ZVtdIGdldEFsbEJ5dGVzRnJvbVN0cmVhbUFuZENsb3NlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyeSB7CkBAIC0yNzgsNDAgKzI5Nyw0NiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBicy50b0J5dGVBcnJheSgpOwogICAgIH0KLS8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1hbmlmZXN0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBKYXJGaWxlIG9yIG51bGwgaWYgbm8KLSAgICAgKiBtYW5pZmVzdCBlbnRyeSBleGlzdHMuCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIE1hbmlmZXN0fSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIEphckZpbGV9CisgICAgICogb3Ige0Bjb2RlIG51bGx9IGlmIG5vIE1BTklGRVNUIGVudHJ5IGV4aXN0cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuTWFuaWZlc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBNQU5JRkVTVC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHJlYWRpbmcgdGhlIE1BTklGRVNUIGZpbGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgamFyIGZpbGUgaXMgY2xvc2VkLgorICAgICAqIEBzZWUgTWFuaWZlc3QKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGlmIChjbG9zZWQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkphckZpbGUgaGFzIGJlZW4gY2xvc2VkLiIpOwogICAgICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0OwogICAgICAgICB9Ci0JCXRyeSB7Ci0vLyBCRUdJTiBhbmRyb2lkLW1vZGlmaWVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW1vZGlmaWVkCiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHN1cGVyLmdldElucHV0U3RyZWFtKG1hbmlmZXN0RW50cnkpOwogICAgICAgICAgICAgaWYgKHZlcmlmaWVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB2ZXJpZmllci5hZGRNZXRhRW50cnkobWFuaWZlc3RFbnRyeS5nZXROYW1lKCksIGdldEFsbEJ5dGVzRnJvbVN0cmVhbUFuZENsb3NlKGlzKSk7CiAgICAgICAgICAgICAgICAgaXMgPSBzdXBlci5nZXRJbnB1dFN0cmVhbShtYW5pZmVzdEVudHJ5KTsKICAgICAgICAgICAgIH0KLS8vIEVORCBhbmRyb2lkLW1vZGlmaWVkCisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1tb2RpZmllZAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpcywgdmVyaWZpZXIgIT0gbnVsbCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CiAgICAgICAgICAgICB9Ci0JICAgICAgICBtYW5pZmVzdEVudHJ5ID0gbnVsbDsKLQkJfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQltYW5pZmVzdEVudHJ5ID0gbnVsbDsKLQkJfQorICAgICAgICAgICAgbWFuaWZlc3RFbnRyeSA9IG51bGw7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbWFuaWZlc3RFbnRyeSA9IG51bGw7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1hbmlmZXN0OwogICAgIH0KIApAQCAtMzM5LDkgKzM2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBVdGlsLkFTQ0lJSWdub3JlQ2FzZVJlZ2lvbk1hdGNoZXMoZW50cnlOYW1lLCBlbnRyeU5hbWUubGVuZ3RoKCkgLSA0LCAiLlJTQSIsIDAgLDQpKSl7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgc2lnbmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBzdXBlci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0vLyBCRUdJTiBhbmRyb2lkLW1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbW9kaWZpZWQKICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IGdldEFsbEJ5dGVzRnJvbVN0cmVhbUFuZENsb3NlKGlzKTsKLS8vIEVORCBhbmRyb2lkLW1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLW1vZGlmaWVkCiAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWVyLmFkZE1ldGFFbnRyeShlbnRyeU5hbWUsIGJ1Zik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzUyLDEzICszNzcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgdGhlIGRlY29tcHJlc3NlZCBjb250ZW50cyBvZiB6ZS4KKyAgICAgKiBSZXR1cm4gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBmb3IgcmVhZGluZyB0aGUgZGVjb21wcmVzc2VkIGNvbnRlbnRzIG9mCisgICAgICogWklQIGVudHJ5LgogICAgICAqIAogICAgICAqIEBwYXJhbSB6ZQotICAgICAqICAgICAgICAgICAgdGhlIFppcEVudHJ5IHRvIHJlYWQgZnJvbQotICAgICAqIEByZXR1cm4gamF2YS5pby5JbnB1dFN0cmVhbQotICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgY3JlYXRpbmcgdGhlIElucHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIFpJUCBlbnRyeSB0byBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFppcEVudHJ5IHplKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzkwLDEyICs0MTcsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEphckVudHJ5IHNwZWNpZmllZCBieSBuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCBlbnRyeSBleGlzdHMKKyAgICAgKiBSZXR1cm4gdGhlIHtAY29kZSBKYXJFbnRyeX0gc3BlY2lmaWVkIGJ5IG5hbWUgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHN1Y2gKKyAgICAgKiBlbnRyeSBleGlzdHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgamFyIGZpbGUKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuSmFyRW50cnkKLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgSkFSIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgWklQIGVudHJ5IGV4dHJhY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgICAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgWmlwRW50cnkgZ2V0RW50cnkoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgWmlwRW50cnkgemUgPSBzdXBlci5nZXRFbnRyeShuYW1lKTsKQEAgLTQwNyw3ICs0MzYsNyBAQAogICAgICAgICByZXR1cm4gamU7CiAgICAgfQogCi0vLyBCRUdJTiBhbmRyb2lkLW1vZGlmaWVkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1tb2RpZmllZAogICAgIHByaXZhdGUgWmlwRW50cnlbXSBnZXRNZXRhRW50cmllc0ltcGwoYnl0ZVtdIGJ1ZikgewogICAgICAgICBpbnQgbiA9IDA7CiAgICAgICAgIApAQCAtNDI5LDE0ICs0NTgsMjEgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQotLy8gRU5EIGFuZHJvaWQtbW9kaWZpZWQKKyAgICAvLyBFTkQgYW5kcm9pZC1tb2RpZmllZAogCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgIC8qKgorICAgICAqIENsb3NlcyB0aGlzIHtAY29kZSBKYXJGaWxlfS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuY2xvc2UoKTsKICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKIH0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGY5MWU3YjUuLmVmMzUzYWIgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW0uamF2YQpAQCAtMjYsNiArMjYsMTMgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLnV0aWwuVXRpbDsKIAorLyoqCisgKiBUaGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdGhlIEpBUiBmaWxlIHRvIGJlIHJlYWQgbWF5IGJlIGZldGNoZWQuIEl0IGlzCisgKiB1c2VkIGxpa2UgdGhlIHtAY29kZSBaaXBJbnB1dFN0cmVhbX0uCisgKiAKKyAqIEBzZWUgWmlwSW5wdXRTdHJlYW0KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgSmFySW5wdXRTdHJlYW0gZXh0ZW5kcyBaaXBJbnB1dFN0cmVhbSB7CiAKICAgICBwcml2YXRlIE1hbmlmZXN0IG1hbmlmZXN0OwpAQCAtNDMsNyArNTAsMTYgQEAKICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSB2ZXJTdHJlYW07CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEphcklucHV0U3RyZWFtIGZyb20gc3RyZWFtCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSmFySW5wdXRTdHJlYW19IGZyb20gYW4gaW5wdXQgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgSkFSIGZpbGUuCisgICAgICogQHBhcmFtIHZlcmlmeQorICAgICAqICAgICAgICAgICAgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHZlcmlmaWVkIHdpdGggYSB7QGNvZGUgSmFyVmVyaWZpZXJ9LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyBlbnRyaWVzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAc2VlIFppcElucHV0U3RyZWFtI1ppcElucHV0U3RyZWFtKElucHV0U3RyZWFtKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBKYXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0sIGJvb2xlYW4gdmVyaWZ5KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTg1LDMyICsxMDEsNTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEphcklucHV0U3RyZWFtfSBmcm9tIGFuIGlucHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIEpBUiBmaWxlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyBlbnRyaWVzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAc2VlIFppcElucHV0U3RyZWFtI1ppcElucHV0U3RyZWFtKElucHV0U3RyZWFtKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBKYXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoc3RyZWFtLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNYW5pZmVzdCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmFySW5wdXRTdHJlYW0gb3IgbnVsbAotICAgICAqIGlmIG5vIG1hbmlmZXN0IGVudHJ5IGV4aXN0cy4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgTWFuaWZlc3R9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiBKYXJJbnB1dFN0cmVhbX0gb3Ige0Bjb2RlIG51bGx9IGlmIG5vIG1hbmlmZXN0IGVudHJ5IGV4aXN0cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuTWFuaWZlc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBNQU5JRkVTVCBzcGVjaWZ5aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgSkFSIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE1hbmlmZXN0IGdldE1hbmlmZXN0KCkgewogICAgICAgICByZXR1cm4gbWFuaWZlc3Q7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBKYXJFbnRyeSBjb250YWluZWQgaW4gdGhpcyBzdHJlYW0gb3IgbnVsbCBpZiBubyBtb3JlCi0gICAgICogZW50cmllcyBhcmUgcHJlc2VudC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHtAY29kZSBKYXJFbnRyeX0gY29udGFpbmVkIGluIHRoaXMgc3RyZWFtIG9yIHtAY29kZQorICAgICAqIG51bGx9IGlmIG5vIG1vcmUgZW50cmllcyBhcmUgcHJlc2VudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuSmFyRW50cnkKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgZW50cnkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IEpBUiBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgdGhlIGVudHJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBKYXJFbnRyeSBnZXROZXh0SmFyRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gKEphckVudHJ5KSBnZXROZXh0RW50cnkoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZWFkcyB1cCB0byB7QGNvZGUgbGVuZ3RofSBvZiBkZWNvbXByZXNzZWQgZGF0YSBhbmQgc3RvcmVzIGl0IGluCisgICAgICoge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQge0Bjb2RlIG9mZnNldH0uCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgQnVmZmVyIHRvIHN0b3JlIGludG8KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmZmVyIHRvIHN0b3JlIGF0CisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHJlYWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAobUVudHJ5ICE9IG51bGwpIHsKQEAgLTE0NSwxMiArMTg4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBaaXBFbnRyeSBjb250YWluZWQgaW4gdGhpcyBzdHJlYW0gb3IgbnVsbCBpZiBubyBtb3JlCi0gICAgICogZW50cmllcyBhcmUgcHJlc2VudC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHtAY29kZSBaaXBFbnRyeX0gY29udGFpbmVkIGluIHRoaXMgc3RyZWFtIG9yIHtAY29kZQorICAgICAqIG51bGx9IGlmIG5vIG1vcmUgZW50cmllcyBhcmUgcHJlc2VudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC56aXAuWmlwRW50cnkKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgZW50cnkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGV4dHJhY3RlZCBaSVAgZW50cnkuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgWmlwRW50cnkgZ2V0TmV4dEVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phck91dHB1dFN0cmVhbS5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggOTc3YzBhZS4uNjQwZjRlZiAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyT3V0cHV0U3RyZWFtLmphdmEKQEAgLTIzLDIzICsyMywyNiBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwogCiAvKioKLSAqIFRoZSBKYXJPdXRwdXRTdHJlYW0gaXMgdXNlZCB0byBvdXRwdXQgZGF0YSBpbiBKYXJGaWxlIGZvcm1hdC4KKyAqIFRoZSB7QGNvZGUgSmFyT3V0cHV0U3RyZWFtfSBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgaW4gdGhlIHtAY29kZSBKYXJGaWxlfQorICogZm9ybWF0IHRvIGFuIGFyYml0cmFyeSBvdXRwdXQgc3RyZWFtCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSmFyT3V0cHV0U3RyZWFtIGV4dGVuZHMgWmlwT3V0cHV0U3RyZWFtIHsKIAogICAgIHByaXZhdGUgTWFuaWZlc3QgbWFuaWZlc3Q7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEphck91dHB1dFN0cmVhbSB1c2luZyBvcyBhcyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAgICogTWFuaWZlc3QgaW5mb3JtYXRpb24gZm9yIHRoZSBKYXJGaWxlIHRvIGJlIHdyaXR0ZW4gaXMgb2J0YWluZWQgZnJvbSB0aGUKLSAgICAgKiBwYXJhbWV0ZXIgTWFuaWZlc3QsIG1mLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEphck91dHB1dFN0cmVhbX0gdXNpbmcgYW4gb3V0cHV0IHN0cmVhbS4gVGhlCisgICAgICogY29udGVudCBvZiB0aGUge0Bjb2RlIE1hbmlmZXN0fSBtdXN0IG1hdGNoIHRoZSBKQVIgZW50cnkgaW5mb3JtYXRpb24KKyAgICAgKiB3cml0dGVuIHN1YnNlcXVlbnRseSB0byB0aGUgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcwotICAgICAqICAgICAgICAgICAgVGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0bworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPdXRwdXRTdHJlYW19IHRvIHdyaXRlIHRvCiAgICAgICogQHBhcmFtIG1mCi0gICAgICogICAgICAgICAgICBUaGUgTWFuaWZlc3QgdG8gb3V0cHV0IGZvciB0aGlzIEphci4KLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBKYXJPdXRwdXRTdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTWFuaWZlc3R9IHRvIG91dHB1dCBmb3IgdGhpcyBKQVIgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSB7QGNvZGUgSmFyT3V0cHV0U3RyZWFtfS4KICAgICAgKi8KICAgICBwdWJsaWMgSmFyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcywgTWFuaWZlc3QgbWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKG9zKTsKQEAgLTU0LDEyICs1NywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSmFyT3V0cHV0U3RyZWFtIHVzaW5nIG9zIGFzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBKYXJPdXRwdXRTdHJlYW19IHVzaW5nIGFuIGFyYml0cmFyeSBvdXRwdXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9zCi0gICAgICogICAgICAgICAgICBUaGUgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRvCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgSmFyT3V0cHV0U3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUge0Bjb2RlIEphck91dHB1dFN0cmVhbX0uCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgcHVibGljIEphck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC02NywxNCArNzEsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBlbnRyeSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIFRoZSBwcmV2aW91cyBlbnRyeQotICAgICAqIGlzIGNsb3NlZCBpZiBpdCBpcyBzdGlsbCBvcGVuLgotICAgICAqIAorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIFpJUCBlbnRyeSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIFRoZSBwcmV2aW91cworICAgICAqIGVudHJ5IGlzIGNsb3NlZCBpZiBpdCBpcyBzdGlsbCBvcGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSB6ZQotICAgICAqICAgICAgICAgICAgVGhlIFppcEVudHJ5IHRvIHdyaXRlCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3cml0aW5nIHRoZSBlbnRyeQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBaaXBFbnRyeX0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3cml0aW5nIHRvIHRoZSBlbnRyeS4KKyAgICAgKiBAc2VlIFppcEVudHJ5CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHV0TmV4dEVudHJ5KFppcEVudHJ5IHplKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyVmVyaWZpZXIuamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phclZlcmlmaWVyLmphdmEKaW5kZXggYTkyYzk5NS4uYjkxNzNmMiAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyVmVyaWZpZXIuamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJWZXJpZmllci5qYXZhCkBAIC00NCwxOSArNDQsMTcgQEAKIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKIC8qKgotICogTm9uLXB1YmxpYyBjbGFzcyB1c2VkIGJ5IHtAbGluayBKYXJGaWxlfSBhbmQKLSAqIHtAbGluayBKYXJJbnB1dFN0cmVhbX0gdG8gbWFuYWdlIHRoZSB2ZXJpZmljYXRpb24gb2Ygc2lnbmVkCi0gKiBqYXJzLiA8Y29kZT5KYXJGaWxlPC9jb2RlPiBhbmQgPGNvZGU+SmFySW5wdXRTdHJlYW08L2NvZGU+IG9iamVjdHMgd2lsbAotICogYmUgZXhwZWN0ZWQgdG8gaGF2ZSBhIDxjb2RlPkphclZlcmlmaWVyPC9jb2RlPiBpbnN0YW5jZSBtZW1iZXIgd2hpY2ggY2FuIGJlCi0gKiB1c2VkIHRvIGNhcnJ5IG91dCB0aGUgdGFza3MgYXNzb2NpYXRlZCB3aXRoIHZlcmlmeWluZyBhIHNpZ25lZCBqYXIuIFRoZXNlCi0gKiB0YXNrcyB3b3VsZCB0eXBpY2FsbHkgaW5jbHVkZToKKyAqIE5vbi1wdWJsaWMgY2xhc3MgdXNlZCBieSB7QGxpbmsgSmFyRmlsZX0gYW5kIHtAbGluayBKYXJJbnB1dFN0cmVhbX0gdG8gbWFuYWdlCisgKiB0aGUgdmVyaWZpY2F0aW9uIG9mIHNpZ25lZCBKQVJzLiB7QGNvZGUgSmFyRmlsZX0gYW5kIHtAY29kZSBKYXJJbnB1dFN0cmVhbX0KKyAqIG9iamVjdHMgYXJlIGV4cGVjdGVkIHRvIGhhdmUgYSB7QGNvZGUgSmFyVmVyaWZpZXJ9IGluc3RhbmNlIG1lbWJlciB3aGljaAorICogY2FuIGJlIHVzZWQgdG8gY2Fycnkgb3V0IHRoZSB0YXNrcyBhc3NvY2lhdGVkIHdpdGggdmVyaWZ5aW5nIGEgc2lnbmVkIEpBUi4KKyAqIFRoZXNlIHRhc2tzIHdvdWxkIHR5cGljYWxseSBpbmNsdWRlOgogICogPHVsPgogICogPGxpPnZlcmlmaWNhdGlvbiBvZiBhbGwgc2lnbmVkIHNpZ25hdHVyZSBmaWxlcwotICogPGxpPmNvbmZpcm1hdGlvbiB0aGF0IGFsbCBzaWduZWQgZGF0YSB3YXMgc2lnbmVkIG9ubHkgYnkgdGhlIHBhcnR5IG9yCi0gKiBwYXJ0aWVzIHNwZWNpZmllZCBpbiB0aGUgc2lnbmF0dXJlIGJsb2NrIGRhdGEKLSAqIDxsaT52ZXJpZmljYXRpb24gdGhhdCB0aGUgY29udGVudHMgb2YgYWxsIHNpZ25hdHVyZSBmaWxlcyAoaS5lLgotICogPGNvZGU+LlNGPC9jb2RlPiBmaWxlcykgYWdyZWUgd2l0aCB0aGUgamFyIGVudHJpZXMgaW5mb3JtYXRpb24gZm91bmQgaW4gdGhlCi0gKiBqYXIgbWFuaWZlc3QuCisgKiA8bGk+Y29uZmlybWF0aW9uIHRoYXQgYWxsIHNpZ25lZCBkYXRhIHdhcyBzaWduZWQgb25seSBieSB0aGUgcGFydHkgb3IgcGFydGllcworICogc3BlY2lmaWVkIGluIHRoZSBzaWduYXR1cmUgYmxvY2sgZGF0YQorICogPGxpPnZlcmlmaWNhdGlvbiB0aGF0IHRoZSBjb250ZW50cyBvZiBhbGwgc2lnbmF0dXJlIGZpbGVzIChpLmUuIHtAY29kZSAuU0Z9CisgKiBmaWxlcykgYWdyZWUgd2l0aCB0aGUgSkFSIGVudHJpZXMgaW5mb3JtYXRpb24gZm91bmQgaW4gdGhlIEpBUiBtYW5pZmVzdC4KICAqIDwvdWw+CiAgKi8KIGNsYXNzIEphclZlcmlmaWVyIHsKQEAgLTEyNCwyNiArMTIyLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBKYXJWZXJpZmllci4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBKYXJWZXJpZmllcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSBiZWluZyB2ZXJpZmllZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBKQVIgZmlsZSBiZWluZyB2ZXJpZmllZC4KICAgICAgKi8KICAgICBKYXJWZXJpZmllcihTdHJpbmcgbmFtZSkgewogICAgICAgICBqYXJOYW1lID0gbmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYWxsZWQgZm9yIGVhY2ggbmV3IGphciBlbnRyeSByZWFkIGluIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBtZXRob2QKLSAgICAgKiBjb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgbmV3IHtAbGluayBWZXJpZmllckVudHJ5fSB3aGljaCBjb250YWlucyB0aGUKLSAgICAgKiBjZXJ0aWZpY2F0ZXMgdXNlZCB0byBzaWduIHRoZSBlbnRyeSBhbmQgaXRzIGhhc2ggdmFsdWUgYXMgc3BlY2lmaWVkIGluCi0gICAgICogdGhlIGphciBtYW5pZmVzdC4KKyAgICAgKiBJbnZva2VkIGZvciBlYWNoIG5ldyBKQVIgZW50cnkgcmVhZCBvcGVyYXRpb24gZnJvbSB0aGUgaW5wdXQKKyAgICAgKiBzdHJlYW0uIFRoaXMgbWV0aG9kIGNvbnN0cnVjdHMgYW5kIHJldHVybnMgYSBuZXcge0BsaW5rIFZlcmlmaWVyRW50cnl9CisgICAgICogd2hpY2ggY29udGFpbnMgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIHNpZ24gdGhlIGVudHJ5IGFuZCBpdHMgaGFzaCB2YWx1ZQorICAgICAqIGFzIHNwZWNpZmllZCBpbiB0aGUgSkFSIE1BTklGRVNUIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgYW4gZW50cnkgaW4gYSBqYXIgZmlsZSB3aGljaCBpcyA8Yj5ub3Q8L2I+IGluIHRoZQotICAgICAqICAgICAgICAgICAgPGNvZGU+TUVUQS1JTkY8L2NvZGU+IGRpcmVjdG9yeS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGFuIGVudHJ5IGluIGEgSkFSIGZpbGUgd2hpY2ggaXMgPGI+bm90PC9iPiBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBNRVRBLUlORn0gZGlyZWN0b3J5LgogICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIFZlcmlmaWVyRW50cnl9IHdoaWNoIGNhbiBiZSB1c2VkIGJ5CiAgICAgICogICAgICAgICBjYWxsZXJzIGFzIGFuIHtAbGluayBPdXRwdXRTdHJlYW19LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFZlcmlmaWVyRW50cnkgaW5pdEVudHJ5KFN0cmluZyBuYW1lKSB7CiAgICAgICAgIC8vIElmIG5vIG1hbmlmZXN0IGlzIHByZXNlbnQgYnkgdGhlIHRpbWUgYW4gZW50cnkgaXMgZm91bmQsCkBAIC0yMDQsMTQgKzIwMywxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAgICAgICAgIC8vIHJldHVybiBuZXcgVmVyaWZpZXJFbnRyeShNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGFsZ29yaXRobSksCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIGhhc2hCeXRlcywgY2VydGlmaWNhdGVzQXJyYXkpOwotICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKLSAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZXJpZmllckVudHJ5KE9wZW5TU0xNZXNzYWdlRGlnZXN0SkRLLmdldEluc3RhbmNlKGFsZ29yaXRobSksCiAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQnl0ZXMsIGNlcnRpZmljYXRlc0FycmF5KTsKLSAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gSWdub3JlZAogICAgICAgICAgICAgfQpAQCAtMjIwLDE2ICsyMTUsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGQgYSBuZXcgbWV0YSBlbnRyeSB0byB0aGUgaW50ZXJuYWwgY29sbGVjdGlvbiBvZiBkYXRhIGhlbGQgb24gZWFjaCBqYXIKLSAgICAgKiBlbnRyeSBpbiB0aGUgPGNvZGU+TUVUQS1JTkY8L2NvZGU+IGRpcmVjdG9yeSBpbmNsdWRpbmcgdGhlIG1hbmlmZXN0Ci0gICAgICogZmlsZSBpdHNlbGYuIEZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmluZyBvZiBhIGphciB3b3VsZCBhbHNvIGJlCisgICAgICogQWRkIGEgbmV3IG1ldGEgZW50cnkgdG8gdGhlIGludGVybmFsIGNvbGxlY3Rpb24gb2YgZGF0YSBoZWxkIG9uIGVhY2ggSkFSCisgICAgICogZW50cnkgaW4gdGhlIHtAY29kZSBNRVRBLUlORn0gZGlyZWN0b3J5IGluY2x1ZGluZyB0aGUgbWFuaWZlc3QKKyAgICAgKiBmaWxlIGl0c2VsZi4gRmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaWduaW5nIG9mIGEgSkFSIHdvdWxkIGFsc28gYmUKICAgICAgKiBhZGRlZCB0byB0aGlzIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGxvY2F0ZWQgaW4gdGhlIDxjb2RlPk1FVEEtSU5GPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgbG9jYXRlZCBpbiB0aGUge0Bjb2RlIE1FVEEtSU5GfQogICAgICAqICAgICAgICAgICAgZGlyZWN0b3J5LgogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIGJ5dGVzIGZvciB0aGUgZmlsZSBjYWxsZWQgPGNvZGU+bmFtZTwvY29kZT4uCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBieXRlcyBmb3IgdGhlIGZpbGUgY2FsbGVkIHtAY29kZSBuYW1lfS4KICAgICAgKiBAc2VlICNyZW1vdmVNZXRhRW50cmllcygpCiAgICAgICovCiAgICAgdm9pZCBhZGRNZXRhRW50cnkoU3RyaW5nIG5hbWUsIGJ5dGVbXSBidWYpIHsKQEAgLTIzNywyMSArMjMyLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgdGhlIGFzc29jaWF0ZWQgamFyIGZpbGUgaXMgc2lnbmVkLCBjaGVjayBvbiB0aGUgdmFsaWRpdHkgb2YgYWxsIG9mIHRoZQorICAgICAqIElmIHRoZSBhc3NvY2lhdGVkIEpBUiBmaWxlIGlzIHNpZ25lZCwgY2hlY2sgb24gdGhlIHZhbGlkaXR5IG9mIGFsbCBvZiB0aGUKICAgICAgKiBrbm93biBzaWduYXR1cmVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFzc29jaWF0ZWQgamFyIGlzIHNpZ25lZCBhbmQgYW4KLSAgICAgKiAgICAgICAgIGludGVybmFsIGNoZWNrIHZlcmlmaWVzIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2lnbmF0dXJlKHMpLgotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBhc3NvY2lhdGVkIGphciBmaWxlIGhhcyBubyBlbnRyaWVzIGF0Ci0gICAgICogICAgICAgICBhbGwgaW4gaXRzIDxjb2RlPk1FVEEtSU5GPC9jb2RlPiBkaXJlY3RvcnkuIFRoaXMgc2l0dWF0aW9uIGlzCi0gICAgICogICAgICAgICBpbmRpY2F0aXZlIG9mIGFuIGludmFsaWQgamFyIGZpbGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGFzc29jaWF0ZWQgSkFSIGlzIHNpZ25lZCBhbmQgYW4gaW50ZXJuYWwKKyAgICAgKiAgICAgICAgIGNoZWNrIHZlcmlmaWVzIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2lnbmF0dXJlKHMpLiB7QGNvZGUgZmFsc2V9IGlmCisgICAgICogICAgICAgICB0aGUgYXNzb2NpYXRlZCBKQVIgZmlsZSBoYXMgbm8gZW50cmllcyBhdCBhbGwgaW4gaXRzIHtAY29kZQorICAgICAqICAgICAgICAgTUVUQS1JTkZ9IGRpcmVjdG9yeS4gVGhpcyBzaXR1YXRpb24gaXMgaW5kaWNhdGl2ZSBvZiBhbiBpbnZhbGlkCisgICAgICogICAgICAgICBKQVIgZmlsZS4KICAgICAgKiAgICAgICAgIDxwPgotICAgICAqICAgICAgICAgV2lsbCBhbHNvIHJldHVybiB0cnVlIGlmIHRoZSBqYXIgZmlsZSBpcyA8aT5ub3Q8L2k+IHNpZ25lZC4KKyAgICAgKiAgICAgICAgIFdpbGwgYWxzbyByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBKQVIgZmlsZSBpcyA8aT5ub3Q8L2k+CisgICAgICogICAgICAgICBzaWduZWQuCiAgICAgICogICAgICAgICA8L3A+CiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBqYXIgZmlsZSBpcyBzaWduZWQgYW5kIGl0IGlzIGRldGVybWluZWQgdGhhdCBhCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEpBUiBmaWxlIGlzIHNpZ25lZCBhbmQgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IGEKICAgICAgKiAgICAgICAgICAgICBzaWduYXR1cmUgYmxvY2sgZmlsZSBjb250YWlucyBhbiBpbnZhbGlkIHNpZ25hdHVyZSBmb3IgdGhlCiAgICAgICogICAgICAgICAgICAgY29ycmVzcG9uZGluZyBzaWduYXR1cmUgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWFkQ2VydGlmaWNhdGVzKCkgewogICAgICAgICBpZiAobWV0YUVudHJpZXMgPT0gbnVsbCkgewpAQCAtMjYxLDE5ICsyNTgsNyBAQAogICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICBTdHJpbmcga2V5ID0gaXQubmV4dCgpOwogICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgiLkRTQSIpIHx8IGtleS5lbmRzV2l0aCgiLlJTQSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZCAodGVtcG9yYXJ5LCB3aWxsIGdvIGF3YXkpCi0gICAgICAgICAgICAgICAgLy9sb2coIkphclZlcmlmaWVyIiwgInZlcmlmeUNlcnRpZmljYXRlKCkgY2FsbGVkIGZvciAiICsga2V5KTsKLSAgICAgICAgICAgICAgICAvL2xvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgICAgICB2ZXJpZnlDZXJ0aWZpY2F0ZShrZXkpOwotICAgICAgICAgICAgICAgIC8vbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIC8vbG9nKCJKYXJWZXJpZmllciIsICJ2ZXJpZnlDZXJ0aWZpY2F0ZSgpIHRvb2sgIiArICh0MSAtIHQwKSArICIgbXMiKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL2F2ZXJhZ2VUaW1lID0gKChtZWFzdXJlQ291bnQgKiBhdmVyYWdlVGltZSkgKyAodDEgLSB0MCkpIC8gKG1lYXN1cmVDb3VudCArIDEpOwotICAgICAgICAgICAgICAgIC8vbWVhc3VyZUNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAvL2xvZygiSmFyVmVyaWZpZXIiLCAidmVyaWZ5Q2VydGlmaWNhdGUoKSBhdmVyYWdlIHRpbWUgaXMgIiArIGF2ZXJhZ2VUaW1lICsgIiBtcyIpOwotICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQgKHRlbXBvcmFyeSwgd2lsbCBnbyBhd2F5KQotICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciByZWN1cnNpdmUgY2xhc3MgbG9hZAogICAgICAgICAgICAgICAgIGlmIChtZXRhRW50cmllcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMwMyw3ICsyODgsNyBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc0Jsb2NrQnl0ZXMpKTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBSZWN1cnNpdmUgY2FsbCBpbiBsb2FkaW5nIHNlY3VyaXR5IHByb3ZpZGVyIHJlbGF0ZWQgY2xhc3Mgd2hpY2gKLSAgICAgICAgICAgICAqIGlzIGluIGEgc2lnbmVkIGphci4gCisgICAgICAgICAgICAgKiBpcyBpbiBhIHNpZ25lZCBKQVIuIAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAobnVsbCA9PSBtZXRhRW50cmllcykgewogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTM4Myw3ICszNjgsNyBAQAogICAgICAqIEFzc29jaWF0ZSB0aGlzIHZlcmlmaWVyIHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgTWFuaWZlc3R9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWYKLSAgICAgKiAgICAgICAgICAgIGEgPGNvZGU+amF2YS51dGlsLmphci5NYW5pZmVzdDwvY29kZT4gb2JqZWN0LgorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgamF2YS51dGlsLmphci5NYW5pZmVzdH0gb2JqZWN0LgogICAgICAqLwogICAgIHZvaWQgc2V0TWFuaWZlc3QoTWFuaWZlc3QgbWYpIHsKICAgICAgICAgbWFuID0gbWY7CkBAIC0zOTcsMTMgKzM4MiwxMyBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSBlbnRyeQogICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBWZXJpZmllckVudHJ5fSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgICAgPGNvZGU+emlwRW50cnk8L2NvZGU+LgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHppcEVudHJ5fS4KICAgICAgKiBAcGFyYW0gemlwRW50cnkKLSAgICAgKiAgICAgICAgICAgIGFuIGVudHJ5IGluIHRoZSBqYXIgZmlsZQorICAgICAqICAgICAgICAgICAgYW4gZW50cnkgaW4gdGhlIEpBUiBmaWxlCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBkaWdlc3QgdmFsdWUgc3RvcmVkIGluIHRoZSBtYW5pZmVzdCBkb2VzIDxpPm5vdDwvaT4KICAgICAgKiAgICAgICAgICAgICBhZ3JlZSB3aXRoIHRoZSBkZWNyeXB0ZWQgZGlnZXN0IGFzIHJlY292ZXJlZCBmcm9tIHRoZQotICAgICAqICAgICAgICAgICAgIDxjb2RlPi5TRjwvY29kZT4gZmlsZS4KKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgLlNGfSBmaWxlLgogICAgICAqIEBzZWUgI2luaXRFbnRyeShTdHJpbmcpCiAgICAgICovCiAgICAgdm9pZCB2ZXJpZnlTaWduYXR1cmVzKFZlcmlmaWVyRW50cnkgZW50cnksIFppcEVudHJ5IHppcEVudHJ5KSB7CkBAIC00MTcsMTAgKzQwMiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgb3Igbm90IHRoZQotICAgICAqIGFzc29jaWF0ZWQgamFyIGZpbGUgaXMgc2lnbmVkLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgYm9vbGVhbn0gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIEpBUiBmaWxlIGlzIHNpZ25lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBqYXIgaXMgc2lnbmVkLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgSkFSIGlzIHNpZ25lZCwge0Bjb2RlIGZhbHNlfQogICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNTaWduZWRKYXIoKSB7CkBAIC00NDMsMTIgKzQyOCw5IEBACiAKICAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQ7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAgICAgICAgIC8vIG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0pOwotICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKLSAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICAgICAgbWQgPSBPcGVuU1NMTWVzc2FnZURpZ2VzdEpESy5nZXRJbnN0YW5jZShhbGdvcml0aG0pOwotICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTQ3MiwxMSArNDU0LDExIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUge0BsaW5rIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZX0gaW5zdGFuY2VzIHRoYXQKLSAgICAgKiB3ZXJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhlIGphciBlbnRyeSBjYWxsZWQKLSAgICAgKiA8Y29kZT5uYW1lPC9jb2RlPi4KKyAgICAgKiB3ZXJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhlIEpBUiBlbnRyeSBjYWxsZWQKKyAgICAgKiB7QGNvZGUgbmFtZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgamFyIGVudHJ5LgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBKQVIgZW50cnkuCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGxpbmsgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlfS4KICAgICAgKi8KICAgICBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcyhTdHJpbmcgbmFtZSkgewpAQCAtNDg5LDcgKzQ3MSw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmUgYWxsIGVudHJpZXMgZnJvbSB0aGUgaW50ZXJuYWwgY29sbGVjdGlvbiBvZiBkYXRhIGhlbGQgYWJvdXQgZWFjaAotICAgICAqIGphciBlbnRyeSBpbiB0aGUgPGNvZGU+TUVUQS1JTkY8L2NvZGU+IGRpcmVjdG9yeS4KKyAgICAgKiBKQVIgZW50cnkgaW4gdGhlIHtAY29kZSBNRVRBLUlORn0gZGlyZWN0b3J5LgogICAgICAqIAogICAgICAqIEBzZWUgI2FkZE1ldGFFbnRyeShTdHJpbmcsIGJ5dGVbXSkKICAgICAgKi8KQEAgLTQ5OCwyMyArNDgwLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPlZlY3RvcjwvY29kZT4gb2YgYWxsIG9mIHRoZQorICAgICAqIFJldHVybnMgYSB7QGNvZGUgVmVjdG9yfSBvZiBhbGwgb2YgdGhlCiAgICAgICoge0BsaW5rIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZX1zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgKiBzaWduaW5nIG9mIHRoZSBuYW1lZCBzaWduYXR1cmUgZmlsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2lnbmF0dXJlRmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgc2lnbmF0dXJlIGZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgc2lnbmF0dXJlIGZpbGUuCiAgICAgICogQHBhcmFtIGNlcnRpZmljYXRlcwotICAgICAqICAgICAgICAgICAgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGFsbCBvZiB0aGUgY2VydGlmaWNhdGUgY2hhaW5zCi0gICAgICogICAgICAgICAgICBkaXNjb3ZlcmVkIHNvIGZhciB3aGlsZSBhdHRlbXB0aW5nIHRvIHZlcmlmeSB0aGUgamFyIHRoYXQKLSAgICAgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBzaWduYXR1cmUgZmlsZSA8Y29kZT5zaWduYXR1cmVGaWxlTmFtZTwvY29kZT4uCi0gICAgICogICAgICAgICAgICBUaGlzIG9iamVjdCB3aWxsIGhhdmUgYmVlbiBwcmV2aW91c2x5IHNldCBpbiB0aGUgY291cnNlIG9mIG9uZQotICAgICAqICAgICAgICAgICAgb3IgbW9yZSBjYWxscyB0bworICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgTWFwfSBvZiBhbGwgb2YgdGhlIGNlcnRpZmljYXRlIGNoYWlucyBkaXNjb3ZlcmVkIHNvCisgICAgICogICAgICAgICAgICBmYXIgd2hpbGUgYXR0ZW1wdGluZyB0byB2ZXJpZnkgdGhlIEpBUiB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAqICAgICAgICAgICAgc2lnbmF0dXJlIGZpbGUge0Bjb2RlIHNpZ25hdHVyZUZpbGVOYW1lfS4gVGhpcyBvYmplY3QgaXMKKyAgICAgKiAgICAgICAgICAgIHByZXZpb3VzbHkgc2V0IGluIHRoZSBjb3Vyc2Ugb2Ygb25lIG9yIG1vcmUgY2FsbHMgdG8KICAgICAgKiAgICAgICAgICAgIHtAbGluayAjdmVyaWZ5SmFyU2lnbmF0dXJlRmlsZShTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBNYXAsIE1hcCl9Ci0gICAgICogICAgICAgICAgICB3aGVyZSBpdCB3YXMgcGFzc2VkIGluIGFzIHRoZSBsYXN0IGFyZ3VtZW50LgotICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT4gZW50cmllcyBmb3IgdGhlIHNpZ25lciBvZgotICAgICAqICAgICAgICAgdGhlIGphciB3aG9zZSBhY3Rpb25zIGxlZCB0byB0aGUgY3JlYXRpb24gb2YgdGhlIG5hbWVkIHNpZ25hdHVyZQotICAgICAqICAgICAgICAgZmlsZS4KKyAgICAgKiAgICAgICAgICAgIHdoZXJlIGl0IHdhcyBwYXNzZWQgYXMgdGhlIGxhc3QgYXJndW1lbnQuCisgICAgICogQHJldHVybiBhbGwgb2YgdGhlIHtAY29kZSBDZXJ0aWZpY2F0ZX0gZW50cmllcyBmb3IgdGhlIHNpZ25lciBvZiB0aGUgSkFSCisgICAgICogICAgICAgICB3aG9zZSBhY3Rpb25zIGxlZCB0byB0aGUgY3JlYXRpb24gb2YgdGhlIG5hbWVkIHNpZ25hdHVyZSBmaWxlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yPENlcnRpZmljYXRlPiBnZXRTaWduZXJDZXJ0aWZpY2F0ZXMoCiAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlRmlsZU5hbWUsIE1hcDxTdHJpbmcsIENlcnRpZmljYXRlW10+IGNlcnRpZmljYXRlcykgewpAQCAtNTI3LDIxICs1MDcsNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIAotICAgIC8vIFRPRE8gSnVzdCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCByZW1vdmUgbGF0ZXIuCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHRhZywgU3RyaW5nIG1zZykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJhbmRyb2lkLnV0aWwuTG9nIik7Ci0gICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJkIiwgbmV3IENsYXNzW10gewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhZywgbXNnCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL01hbmlmZXN0LmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9NYW5pZmVzdC5qYXZhCmluZGV4IGYyMDU0MjguLjNiMGQ4OWEgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL01hbmlmZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvTWFuaWZlc3QuamF2YQpAQCAtMzAsOCArMzAsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uOwogCiAvKioKLSAqIFRoZSBNYW5pZmVzdCBjbGFzcyBpcyB1c2VkIHRvIG9idGFpbiBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gZm9yIGEgSmFyRmlsZSBhbmQgaXRzIGVudHJpZXMuCisgKiBUaGUge0Bjb2RlIE1hbmlmZXN0fSBjbGFzcyBpcyB1c2VkIHRvIG9idGFpbiBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gZm9yIGEKKyAqIHtAY29kZSBKYXJGaWxlfSBhbmQgaXRzIGVudHJpZXMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTWFuaWZlc3QgaW1wbGVtZW50cyBDbG9uZWFibGUgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5FX0xFTkdUSF9MSU1JVCA9IDcwOwpAQCAtNDcsMjQgKzQ5LDI5IEBACiAgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgYnl0ZVtdPiBjaHVua3M7CiAKICAgICAvKioKLSAgICAgKiBUaGUgZGF0YSBjaHVuayBvZiBNYWluIEF0dHJpYnV0ZXMgaW4gdGhlIG1hbmlmZXN0IGlzIG5lZWRlZCBpbiB2ZXJpZmljYXRpb24uCisgICAgICogVGhlIGRhdGEgY2h1bmsgb2YgbWFpbiBhdHRyaWJ1dGVzIGluIHRoZSBtYW5pZmVzdCBpcyBuZWVkZWQgaW4KKyAgICAgKiB2ZXJpZmljYXRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBieXRlW10gbWFpbkF0dHJpYnV0ZXNDaHVuazsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgTWFuaWZlc3QgaW5zdGFuY2UuCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgTWFuaWZlc3R9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNYW5pZmVzdCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1hbmlmZXN0IGluc3RhbmNlIHVzaW5nIHRoZSBhdHRyaWJ1dGVzIG9idGFpbmVkIGZyb20gaXMuCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgTWFuaWZlc3R9IGluc3RhbmNlIHVzaW5nIHRoZSBhdHRyaWJ1dGVzIG9idGFpbmVkCisgICAgICogZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpcyBJbnB1dFN0cmVhbSB0byBwYXJzZSBmb3IgYXR0cmlidXRlcwotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU8gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoaXMgTWFuaWZlc3QKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcGFyc2UgZm9yIGF0dHJpYnV0ZXMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIElPIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHtAY29kZSBNYW5pZmVzdH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWFuaWZlc3QoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC03MiwxMCArNzksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1hbmlmZXN0IGluc3RhbmNlLiBUaGUgbmV3IGluc3RhbmNlIHdpbGwgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzCi0gICAgICogdGhvc2UgZm91bmQgaW4gdGhlIHBhcmFtZXRlciBNYW5pZmVzdC4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBNYW5pZmVzdH0gaW5zdGFuY2UuIFRoZSBuZXcgaW5zdGFuY2Ugd2lsbCBoYXZlIHRoZQorICAgICAqIHNhbWUgYXR0cmlidXRlcyBhcyB0aG9zZSBmb3VuZCBpbiB0aGUgcGFyYW1ldGVyIHtAY29kZSBNYW5pZmVzdH0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG1hbiBNYW5pZmVzdCBpbnN0YW5jZSB0byBvYnRhaW4gYXR0cmlidXRlcyBmcm9tCisgICAgICogQHBhcmFtIG1hbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIE1hbmlmZXN0fSBpbnN0YW5jZSB0byBvYnRhaW4gYXR0cmlidXRlcyBmcm9tLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBNYW5pZmVzdChNYW5pZmVzdCBtYW4pIHsKQEAgLTkxLDggKzEwMCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgYm90aCB0aGUgbWFpbkF0dHJpYnV0ZXMgYXMgd2VsbCBhcyB0aGUgZW50cnkgQXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqIE1hbmlmZXN0LgorICAgICAqIFJlc2V0cyB0aGUgYm90aCB0aGUgbWFpbiBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgdGhlIGVudHJ5IGF0dHJpYnV0ZXMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgTWFuaWZlc3R9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogICAgICAgICBlbnRyeUF0dHJpYnV0ZXMuY2xlYXIoKTsKQEAgLTEwMCwzOCArMTExLDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlciBlbnRyeSBuYW1lCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIEF0dHJpYnV0ZXN9IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyYW1ldGVyIGVudHJ5CisgICAgICoge0Bjb2RlIG5hbWV9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0byBvYnRhaW4gQXR0cmlidXRlcyBmb3IuCi0gICAgICogQHJldHVybiBUaGUgQXR0cmlidXRlcyBmb3IgdGhlIGVudHJ5IG9yIG51bGwgaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZW50cnkgdG8gb2J0YWluIHtAY29kZSBBdHRyaWJ1dGVzfSBmcm9tLgorICAgICAqIEByZXR1cm4gdGhlIEF0dHJpYnV0ZXMgZm9yIHRoZSBlbnRyeSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGVudHJ5IGRvZXMKKyAgICAgKiAgICAgICAgIG5vdCBleGlzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBnZXRFbnRyaWVzKCkuZ2V0KG5hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBNYXAgY29udGFpbmluZyB0aGUgQXR0cmlidXRlcyBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgTWFuaWZlc3QuCisgICAgICogUmV0dXJucyBhIG1hcCBjb250YWluaW5nIHRoZSB7QGNvZGUgQXR0cmlidXRlc30gZm9yIGVhY2ggZW50cnkgaW4gdGhlCisgICAgICoge0Bjb2RlIE1hbmlmZXN0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgTWFwIG9mIGVudHJ5IGF0dHJpYnV0ZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXAgb2YgZW50cnkgYXR0cmlidXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgQXR0cmlidXRlcz4gZ2V0RW50cmllcygpIHsKICAgICAgICAgcmV0dXJuIGVudHJ5QXR0cmlidXRlczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYWluIEF0dHJpYnV0ZXMgb2YgdGhlIEphckZpbGUuCisgICAgICogUmV0dXJucyB0aGUgbWFpbiB7QGNvZGUgQXR0cmlidXRlc30gb2YgdGhlIHtAY29kZSBKYXJGaWxlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1haW4gQXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNvdXJjZSBKYXJGaWxlCisgICAgICogQHJldHVybiBtYWluIHtAY29kZSBBdHRyaWJ1dGVzfSBhc3NvY2lhdGVkIHdpdGggdGhlIHNvdXJjZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIEphckZpbGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldE1haW5BdHRyaWJ1dGVzKCkgewogICAgICAgICByZXR1cm4gbWFpbkF0dHJpYnV0ZXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBNYW5pZmVzdC4gVGhlIHJldHVybmVkIE1hbmlmZXN0IHdpbGwgZXF1YWwgdGhlIE1hbmlmZXN0IGZyb20gd2hpY2gKLSAgICAgKiBpdCB3YXMgY2xvbmVkLgorICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMge0Bjb2RlIE1hbmlmZXN0fS4gVGhlIHJldHVybmVkIHtAY29kZSBNYW5pZmVzdH0KKyAgICAgKiB3aWxsIGVxdWFsIHRoZSB7QGNvZGUgTWFuaWZlc3R9IGZyb20gd2hpY2ggaXQgd2FzIGNsb25lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgY29weSBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMTM5LDIyICsxNTksMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgb3V0IHRoZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gb2YgdGhlIHJlY2VpdmVyIHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtCisgICAgICogV3JpdGVzIG91dCB0aGUgYXR0cmlidXRlIGluZm9ybWF0aW9uIG9mIHRoZSByZWNlaXZlciB0byB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIE91dHB1dFN0cmVhbX0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG9zIFRoZSBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgdG8uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyB0aGUgTWFuaWZlc3QKKyAgICAgKiBAcGFyYW0gb3MKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfSB0byB3cml0ZSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgdGhlIHtAY29kZSBNYW5pZmVzdH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZSh0aGlzLCBvcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBNYW5pZmVzdCBpbnN0YW5jZSBvYnRhaW5pbmcgQXR0cmlidXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBhcmFtZXRlcgotICAgICAqIElucHV0U3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE1hbmlmZXN0fSBpbnN0YW5jZSBvYnRhaW5pbmcgYXR0cmlidXRlCisgICAgICogaW5mb3JtYXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXMgVGhlIElucHV0U3RyZWFtIHRvIHJlYWQgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHJlYWRpbmcgdGhlIE1hbmlmZXN0LgorICAgICAqIEBwYXJhbSBpcworICAgICAqICAgICAgICAgICAgVGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcmVhZCBmcm9tLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyB0aGUge0Bjb2RlIE1hbmlmZXN0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBJbml0TWFuaWZlc3QgaW5pdE1hbmlmZXN0ID0gbmV3IEluaXRNYW5pZmVzdChpcywgbWFpbkF0dHJpYnV0ZXMsIGVudHJ5QXR0cmlidXRlcywKQEAgLTE2Myw5ICsxODksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNoQ29kZSBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGlzIE1hbmlmZXN0J3MgaGFzaENvZGUKKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIE1hbmlmZXN0fSdzIGhhc2hDb2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC0xNzMsMTEgKzIwMCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIHJlY2VpdmVyIGlzIGVxdWFsIHRvIHRoZSBwYXJhbWV0ZXIgT2JqZWN0LiBUd28gTWFuaWZlc3RzIGFyZSBlcXVhbCBpZgotICAgICAqIHRoZXkgaGF2ZSBpZGVudGljYWwgbWFpbiBBdHRyaWJ1dGVzIGFzIHdlbGwgYXMgaWRlbnRpY2FsIGVudHJ5IEF0dHJpYnV0ZXMuCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcmVjZWl2ZXIgaXMgZXF1YWwgdG8gdGhlIHBhcmFtZXRlciBvYmplY3QuIFR3byB7QGNvZGUKKyAgICAgKiBNYW5pZmVzdH1zIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgaWRlbnRpY2FsIG1haW4gYXR0cmlidXRlcyBhcyB3ZWxsIGFzCisgICAgICogaWRlbnRpY2FsIGVudHJ5IGF0dHJpYnV0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gVGhlIE9iamVjdCB0byBjb21wYXJlIGFnYWluc3QuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuaWZlc3RzIGFyZSBlcXVhbCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWFuaWZlc3RzIGFyZSBlcXVhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKQEAgLTIwNiwxMiArMjM2LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIG91dCB0aGUgYXR0cmlidXRlIGluZm9ybWF0aW9uIG9mIHRoZSByZWNlaXZlciB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbQorICAgICAqIFdyaXRlcyBvdXQgdGhlIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1hbmlmZXN0IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgT3V0cHV0U3RyZWFtfQogICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5pZmVzdCB0aGUgYXR0cmlidXRlIGluZm9ybWF0aW9uIG9mIHRoZSByZWNlaXZlcgotICAgICAqIEBwYXJhbSBvdXQgVGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0by4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyB3cml0aW5nIHRoZSBNYW5pZmVzdAorICAgICAqIEBwYXJhbSBtYW5pZmVzdAorICAgICAqICAgICAgICAgICAgdGhlIG1hbmlmZXN0IHRvIHdyaXRlIG91dC4KKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICBUaGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3cml0aW5nIHRoZSB7QGNvZGUgTWFuaWZlc3R9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHN0YXRpYyB2b2lkIHdyaXRlKE1hbmlmZXN0IG1hbmlmZXN0LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBudWxsOwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvUGFjazIwMC5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvUGFjazIwMC5qYXZhCmluZGV4IDcyZThlYjYuLmUwNjg5ZTAgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL1BhY2syMDAuamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9QYWNrMjAwLmphdmEKQEAgLTE2LDggKzE2LDcgQEAKICAqLwogcGFja2FnZSBqYXZhLnV0aWwuamFyOwogCi0vLyBUT0RPIEVuYWJsZSB0aGlzIGFnYWluIGF0IGEgbGF0ZXIgcG9pbnQuCi0vL2ltcG9ydCBhbmRyb2lkLmFjY2Vzcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTI3LDE0ICsyNiwxNSBAQAogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CiAKIC8qKgotICogQ2xhc3MgdGhhdCBpbml0aWFsaXplIFBhY2tlciBhbmQgVW5wYWNrZXIKKyAqIENsYXNzIGZhY3RvcnkgZm9yIHtAbGluayBQYWNrMjAwLlBhY2tlcn0gYW5kIHtAbGluayBQYWNrMjAwLlVucGFja2VyfS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWNrMjAwIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fUFJPUEVSVFlfUEFDS0VSID0gImphdmEudXRpbC5qYXIuUGFjazIwMC5QYWNrZXIiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9QUk9QRVJUWV9QQUNLRVIgPSAiamF2YS51dGlsLmphci5QYWNrMjAwLlBhY2tlciI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fUFJPUEVSVFlfVU5QQUNLRVIgPSAiamF2YS51dGlsLmphci5QYWNrMjAwLlVucGFja2VyIjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fUFJPUEVSVFlfVU5QQUNLRVIgPSAiamF2YS51dGlsLmphci5QYWNrMjAwLlVucGFja2VyIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCiAgICAgICogUHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLgpAQCAtNDMsMjg3ICs0MywzNTYgQEAKICAgICAgICAgLy9kbyBub3RoaW5nCiAgICAgfQogCi0JLyoqCi0JICogVGhlIG1ldGhvZCBmaXJzdCByZWFkIGZyb20gc3lzdGVtIHByb3BlcnR5IGZvciB0aGUgY2xhc3NuYW1lIG9mIGEgUGFja2VyLAotCSAqIGlmIHN1Y2ggcHJvcGVydHkgZXhpc3RzLCB0aGUgY2xhc3Mgc2hhbGwgYmUgaW5pdGlhbGl6ZWQ7IG9yIHRoZSBkZWZhdWx0Ci0JICogUGFja2VyIHdpbGwgYmUgcmV0dXJuZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgaW5zdGFuY2Ugb2YgUGFja2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBQYWNrMjAwLlBhY2tlciBuZXdQYWNrZXIoKSB7Ci0JCXJldHVybiAoUGFja2VyKSBBY2Nlc3NDb250cm9sbGVyCi0JCQkJLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxPYmplY3Q+KCkgewotCQkJCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBTeXN0ZW0KLQkJCQkJCQkJLmdldFByb3BlcnR5KFNZU1RFTV9QUk9QRVJUWV9QQUNLRVIsCi0JCQkJCQkJCQkJIm9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLmludGVybmFsLnBhY2syMDAuUGFjazIwMFBhY2tlckFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBUT0RPIE5vdCBzdXJlIGlmIHRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyB3aXRoCi0JCQkJCQkJLy8gbG9hZGluZyB0aGUgcGFja2VyCi0JCQkJCQkJcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkKLQkJCQkJCQkJCS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGxvYWQgY2xhc3MgIiArIGNsYXNzTmFtZSwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIGEgcGFja2VyIGVuZ2luZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBhY2tlciBlbmdpbmUgaXMgZGVmaW5lZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICoge0Bjb2RlICdqYXZhLnV0aWwuamFyLlBhY2syMDAuUGFja2VyJ30uIElmIHRoaXMgc3lzdGVtIHByb3BlcnR5IGlzCisgICAgICogZGVmaW5lZCBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlCisgICAgICogc3lzdGVtJ3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgUGFja2VyfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFjazIwMC5QYWNrZXIgbmV3UGFja2VyKCkgeworICAgICAgICByZXR1cm4gKFBhY2tlcikgQWNjZXNzQ29udHJvbGxlcgorICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248T2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShTWVNURU1fUFJPUEVSVFlfUEFDS0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS5pbnRlcm5hbC5wYWNrMjAwLlBhY2syMDBQYWNrZXJBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBOb3Qgc3VyZSBpZiB0aGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRpbmcgdGhlIHBhY2tlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBsb2FkIGNsYXNzICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogVGhlIG1ldGhvZCBmaXJzdCByZWFkIGZyb20gc3lzdGVtIHByb3BlcnR5IGZvciB0aGUgY2xhc3NuYW1lIG9mIGEKLQkgKiBVbnBhY2tlciwgaWYgc3VjaCBwcm9wZXJ0eSBleGlzdHMsIHRoZSBjbGFzcyBzaGFsbCBiZSBpbml0aWFsaXplZDsgb3IgdGhlCi0JICogZGVmYXVsdCBVbnBhY2tlciB3aWxsIGJlIHJldHVybmVkCi0JICogCi0JICogQHJldHVybiBhIGluc3RhbmNlIG9mIFVucGFja2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBQYWNrMjAwLlVucGFja2VyIG5ld1VucGFja2VyKCkgewotCQlyZXR1cm4gKFVucGFja2VyKSBBY2Nlc3NDb250cm9sbGVyCi0JCQkJLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxPYmplY3Q+KCkgewotCQkJCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBTeXN0ZW0KLQkJCQkJCQkJLmdldFByb3BlcnR5KFNZU1RFTV9QUk9QRVJUWV9VTlBBQ0tFUiwKLQkJCQkJCQkJCQkib3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUuaW50ZXJuYWwucGFjazIwMC5QYWNrMjAwVW5wYWNrZXJBZGFwdGVyIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZXR1cm4gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKQotCQkJCQkJCQkJLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgbG9hZCBjbGFzcyAiICsgY2xhc3NOYW1lLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIGEgdW5wYWNrZXIgZW5naW5lLgorICAgICAqIDxwPgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5wYWNrZXIgZW5naW5lIGlzIGRlZmluZWQgYnkgdGhlIHN5c3RlbQorICAgICAqIHByb3BlcnR5IHtAY29kZSAnamF2YS51dGlsLmphci5QYWNrMjAwLlVucGFja2VyJ30uIElmIHRoaXMgc3lzdGVtCisgICAgICogcHJvcGVydHkgaXMgZGVmaW5lZCBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIHJldHVybmVkLAorICAgICAqIG90aGVyd2lzZSB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIGluc3RhbmNlIG9mIHtAY29kZSBVbnBhY2tlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYWNrMjAwLlVucGFja2VyIG5ld1VucGFja2VyKCkgeworICAgICAgICByZXR1cm4gKFVucGFja2VyKSBBY2Nlc3NDb250cm9sbGVyCisgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxPYmplY3Q+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFNZU1RFTV9QUk9QRVJUWV9VTlBBQ0tFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUuaW50ZXJuYWwucGFjazIwMC5QYWNrMjAwVW5wYWNrZXJBZGFwdGVyIik7Ly8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FuJ3QgbG9hZCBjbGFzcyAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KIAotCS8qKgotCSAqIGludGVyZmFjZSBvZiBQYWNrZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBQYWNrZXIgeworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcmZhY2UgZGVmaW5pbmcgdGhlIEFQSSBmb3IgY29udmVydGluZyBhIEpBUiBmaWxlIHRvIGFuIG91dHB1dAorICAgICAqIHN0cmVhbSBpbiB0aGUgUGFjazIwMCBmb3JtYXQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUGFja2VyIHsKIAotCQkvKioKLQkJICogdGhlIGZvcm1hdCBvZiBhIGNsYXNzIGF0dHJpYnV0ZSBuYW1lCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQlVURV9QRlggPSAicGFjay5jbGFzcy5hdHRyaWJ1dGUuIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogdGhlIGZvcm1hdCBvZiBhIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQlVURV9QRlggPSAicGFjay5jbGFzcy5hdHRyaWJ1dGUuIjsgLy8kTk9OLU5MUy0xJAogCi0JCS8qKgotCQkgKiB0aGUgZm9ybWF0IG9mIGEgY29kZSBhdHRyaWJ1dGUgbmFtZQotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0FUVFJJQlVURV9QRlggPSAicGFjay5jb2RlLmF0dHJpYnV0ZS4iOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8qKgorICAgICAgICAgKiB0aGUgZm9ybWF0IG9mIGEgY29kZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0FUVFJJQlVURV9QRlggPSAicGFjay5jb2RlLmF0dHJpYnV0ZS4iOyAvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIHRoZSBkZWZsYXRpb24gaGludCB0byBzZXQgaW4gdGhlIG91dHB1dCBhcmNoaXZlCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkxBVEVfSElOVCA9ICJwYWNrLmRlZmxhdGUuaGludCI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogdGhlIGRlZmxhdGlvbiBoaW50IHRvIHNldCBpbiB0aGUgb3V0cHV0IGFyY2hpdmUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGTEFURV9ISU5UID0gInBhY2suZGVmbGF0ZS5oaW50IjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIHRoZSBpbmRpY2F0ZWQgYW1vdW50IG9mIGVmZm9ydCB0byB1c2UgaW4gY29tcHJlc3NpbmcgdGhlIGFyY2hpdmUuCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVGRk9SVCA9ICJwYWNrLmVmZm9ydCI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogdGhlIGluZGljYXRlZCBhbW91bnQgb2YgZWZmb3J0IHRvIHVzZSBpbiBjb21wcmVzc2luZyB0aGUgYXJjaGl2ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZPUlQgPSAicGFjay5lZmZvcnQiOy8vJE5PTi1OTFMtMSQKIAotCQkvKioKLQkJICogYSBTdHJpbmcgb2YgZXJyb3IKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiZXJyb3IiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB7QGNvZGUgZXJyb3J9LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SID0gImVycm9yIjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIGEgU3RyaW5nIG9mIGZhbHNlCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsvLyROT04tTkxTLTEkCisgICAgICAgIC8qKgorICAgICAgICAgKiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgZmFsc2V9LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIHRoZSBmb3JtYXQgb2YgYSBmaWVsZCBhdHRyaWJ1dGUgbmFtZQotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BVFRSSUJVVEVfUEZYID0gInBhY2suZmllbGQuYXR0cmlidXRlLiI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogdGhlIGZvcm1hdCBvZiBhIGZpZWxkIGF0dHJpYnV0ZSBuYW1lLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0FUVFJJQlVURV9QRlggPSAicGFjay5maWVsZC5hdHRyaWJ1dGUuIjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIGEgU3RyaW5nIG9mIGtlZXAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VFUCA9ICJrZWVwIjsvLyROT04tTkxTLTEkCisgICAgICAgIC8qKgorICAgICAgICAgKiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBmb3Ige0Bjb2RlIGtlZXB9LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFRVAgPSAia2VlcCI7Ly8kTk9OLU5MUy0xJAogCi0JCS8qKgotCQkgKiBkZWNpZGUgaWYgYWxsIGVsZW1lbnRzIHNoYWxsIHRyYW5zbWl0IGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEtFRVBfRklMRV9PUkRFUiA9ICJwYWNrLmtlZXAuZmlsZS5vcmRlciI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogZGVjaWRlIGlmIGFsbCBlbGVtZW50cyBzaGFsbCB0cmFuc21pdCBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRUVQX0ZJTEVfT1JERVIgPSAicGFjay5rZWVwLmZpbGUub3JkZXIiOy8vJE5PTi1OTFMtMSQKIAotCQkvKioKLQkJICogYSBTdHJpbmcgb2YgbGF0ZXN0Ci0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIExBVEVTVCA9ICJsYXRlc3QiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB7QGNvZGUgbGF0ZXN0fS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVRFU1QgPSAibGF0ZXN0IjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIHRoZSBmb3JtYXQgb2YgYSBtZXRob2QgYXR0cmlidXRlIG5hbWUKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0FUVFJJQlVURV9QRlggPSAicGFjay5tZXRob2QuYXR0cmlidXRlLiI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogdGhlIGZvcm1hdCBvZiBhIG1ldGhvZCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfQVRUUklCVVRFX1BGWCA9ICJwYWNrLm1ldGhvZC5hdHRyaWJ1dGUuIjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIFBhY2tlciBzaGFsbCBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgbGF0ZXN0IG1vZGlmaWNhdGlvbiB0aW1lIGlmCi0JCSAqIHRoaXMgaXMgc2V0IHRvIExBU1RFU1QKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJQ0FUSU9OX1RJTUUgPSAicGFjay5tb2RpZmljYXRpb24udGltZSI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogaWYgaXQgc2hhbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIGxhdGVzdCBtb2RpZmljYXRpb24gdGltZSBpZiB0aGlzCisgICAgICAgICAqIGlzIHNldCB0byB7QGNvZGUgTEFURVNUfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklDQVRJT05fVElNRSA9ICJwYWNrLm1vZGlmaWNhdGlvbi50aW1lIjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIGEgU3RyaW5nIG9mIHBhc3MKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTUyA9ICJwYXNzIjsvLyROT04tTkxTLTEkCisgICAgICAgIC8qKgorICAgICAgICAgKiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgcGFzc30uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTUyA9ICJwYXNzIjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIHRoZSBmaWxlIHRoYXQgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19GSUxFX1BGWCA9ICJwYWNrLnBhc3MuZmlsZS4iOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBmaWxlIHRoYXQgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTX0ZJTEVfUEZYID0gInBhY2sucGFzcy5maWxlLiI7Ly8kTk9OLU5MUy0xJAogCi0JCS8qKgotCQkgKiBwYWNrZXIgcHJvZ3Jlc3MgYXMgYSBwZXJjZW50YWdlCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSRVNTID0gInBhY2sucHJvZ3Jlc3MiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIHBhY2tlciBwcm9ncmVzcyBhcyBhIHBlcmNlbnRhZ2UuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JFU1MgPSAicGFjay5wcm9ncmVzcyI7Ly8kTk9OLU5MUy0xJAogCi0JCS8qKgotCQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGVhY2ggYXJjaGl2ZSBzZWdtZW50LgotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX0xJTUlUID0gInBhY2suc2VnbWVudC5saW1pdCI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBvZiBlYWNoIGFyY2hpdmUgc2VnbWVudC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX0xJTUlUID0gInBhY2suc2VnbWVudC5saW1pdCI7Ly8kTk9OLU5MUy0xJAogCi0JCS8qKgotCQkgKiBhIFN0cmluZyBvZiBzdHJpcAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJUCA9ICJzdHJpcCI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIHN0cmlwfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJUCA9ICJzdHJpcCI7Ly8kTk9OLU5MUy0xJAogCi0JCS8qKgotCQkgKiBhIFN0cmluZyBvZiB0cnVlCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7Ly8kTk9OLU5MUy0xJAorICAgICAgICAvKioKKyAgICAgICAgICogYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIHRydWV9LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7Ly8kTk9OLU5MUy0xJAogCi0JCS8qKgotCQkgKiB0aGUgYWN0aW9uIHRvIHRha2UgaWYgYW4gdW5rbm93biBhdHRyaWJ1dGUgaXMgZW5jb3VudGVyZWQuCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQVRUUklCVVRFID0gInBhY2sudW5rbm93bi5hdHRyaWJ1dGUiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBhY3Rpb24gdG8gdGFrZSBpZiBhbiB1bmtub3duIGF0dHJpYnV0ZSBpcyBlbmNvdW50ZXJlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0FUVFJJQlVURSA9ICJwYWNrLnVua25vd24uYXR0cmlidXRlIjsvLyROT04tTkxTLTEkCiAKLQkJLyoqCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHBhY2tlcgotCQkgKi8KLQkJU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgc29ydGVkIG1hcCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHBhY2tlci4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBhY2tlci4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMoKTsKIAotCQkvKioKLQkJICogUGFjayBqYXJmaWxlIHdpdGggcGFjayBhcml0aG1ldGljCi0JCSAqIAotCQkgKiBAcGFyYW0gaW4KLQkJICogICAgICAgICAgICBqYXJmaWxlIHRvIGJlIGNvbXBhY3QKLQkJICogQHBhcmFtIG91dAotCQkgKiAgICAgICAgICAgIHN0cmVhbSBvZiBjb21wYWN0IGRhdGEKLQkJICogQHRocm93cyBJT0V4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgICBpZiBJL08gZXhjZXB0aW9uIG9jY3VycwotCQkgKi8KLQkJdm9pZCBwYWNrKEphckZpbGUgaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhY2sgdGhlIHNwZWNpZmllZCBKQVIgZmlsZSB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gaW4KKyAgICAgICAgICogICAgICAgICAgICBKQVIgZmlsZSB0byBiZSBjb21wcmVzc2VkLgorICAgICAgICAgKiBAcGFyYW0gb3V0CisgICAgICAgICAqICAgICAgICAgICAgc3RyZWFtIG9mIGNvbXByZXNzZWQgZGF0YS4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiBJL08gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLworICAgICAgICB2b2lkIHBhY2soSmFyRmlsZSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCi0JCS8qKgotCQkgKiBQYWNrIGphclN0cmVhbSB3aXRoIHBhY2sgYXJpdGhtZXRpYwotCQkgKiAKLQkJICogQHBhcmFtIGluCi0JCSAqICAgICAgICAgICAgc3RyZWFtIG9mIHVuY29tcGFjdCBqYXIgZGF0YQotCQkgKiBAcGFyYW0gb3V0Ci0JCSAqICAgICAgICAgICAgc3RyZWFtIG9mIGNvbXBhY3QgZGF0YQotCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JCSAqICAgICAgICAgICAgIGlmIEkvTyBleGNlcHRpb24gb2NjdXJzCi0JCSAqLwotCQl2b2lkIHBhY2soSmFySW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhY2sgdGhlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGphciBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGluCisgICAgICAgICAqICAgICAgICAgICAgc3RyZWFtIG9mIHVuY29tcHJlc3NlZCBKQVIgZGF0YS4KKyAgICAgICAgICogQHBhcmFtIG91dAorICAgICAgICAgKiAgICAgICAgICAgIHN0cmVhbSBvZiBjb21wcmVzc2VkIGRhdGEuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgSS9PIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwYWNrKEphcklucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKLQkJLyoqCi0JCSAqIGFkZCBhIGxpc3RlbmVyIGZvciBQcm9wZXJ0eUNoYW5nZSBldmVudHMKLQkJICogCi0JCSAqIEBwYXJhbSBsaXN0ZW5lcgotCQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gaWYgUHJvcGVydHlDaGFuZ2UgZXZlbnRzIG9jY3VycwotCQkgKi8KLSAgICAgICAgLy8gVE9ETyBFbmFibGUgdGhpcyBhZ2FpbiBhdCBhIGxhdGVyIHBvaW50LgotICAgICAgICAvL3ZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgICAgIC8qKgorICAgICAgICAgKiBhZGQgYSBsaXN0ZW5lciBmb3IgUHJvcGVydHlDaGFuZ2UgZXZlbnRzCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gbGlzdGVuIGlmIFByb3BlcnR5Q2hhbmdlIGV2ZW50cyBvY2N1cnMKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKIAotCQkvKioKLQkJICogcmVtb3ZlIGEgbGlzdGVuZXIKLQkJICogCi0JCSAqIEBwYXJhbSBsaXN0ZW5lcgotCQkgKiAgICAgICAgICAgIGxpc3RlbmVyIHRvIHJlbW92ZQotCQkgKi8KLSAgICAgICAgLy8gVE9ETyBFbmFibGUgdGhpcyBhZ2FpbiBhdCBhIGxhdGVyIHBvaW50LgotICAgICAgICAvL3ZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQorICAgICAgICAvKioKKyAgICAgICAgICogcmVtb3ZlIGEgbGlzdGVuZXIKKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAgICAgKiAgICAgICAgICAgIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIH0KIAotCS8qKgotCSAqIGludGVyZmFjZSBvZiB1bnBhY2tlcgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFVucGFja2VyIHsKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIGRlZmluaW5nIHRoZSBBUEkgZm9yIGNvbnZlcnRpbmcgYSBwYWNrZWQgc3RyZWFtIGluIHRoZQorICAgICAqIFBhY2syMDAgZm9ybWF0IHRvIGEgSkFSIGZpbGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVW5wYWNrZXIgewogCi0JCS8qKgotCQkgKiBUaGUgU3RyaW5nIGluZGljYXRpbmcgaWYgdGhlIHVucGFja2VyIHNob3VsZCBpZ25vcmUgYWxsIHRyYW5zbWl0dGVkCi0JCSAqIHZhbHVlcyxjYW4gYmUgcmVwbGFjZWQgYnkgZWl0aGVyIHRydWUgb3IgZmFsc2UKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGTEFURV9ISU5UID0gInVucGFjay5kZWZsYXRlLmhpbnQiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBTdHJpbmcgaW5kaWNhdGluZyBpZiB0aGUgdW5wYWNrZXIgc2hvdWxkIGlnbm9yZSBhbGwgdHJhbnNtaXR0ZWQKKyAgICAgICAgICogdmFsdWVzLGNhbiBiZSByZXBsYWNlZCBieSBlaXRoZXIge0Bjb2RlIHRydWV9IG9yIHtAY29kZSBmYWxzZX0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGTEFURV9ISU5UID0gInVucGFjay5kZWZsYXRlLmhpbnQiOy8vJE5PTi1OTFMtMSQKIAotCQkvKioKLQkJICogYSBTdHJpbmcgb2YgZmFsc2UKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBmYWxzZX0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOy8vJE5PTi1OTFMtMSQKIAotCQkvKioKLQkJICogYSBTdHJpbmcgb2Yga2VlcAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBLRUVQID0gImtlZXAiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBrZWVwfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRUVQID0gImtlZXAiOy8vJE5PTi1OTFMtMSQKIAotCQkvKioKLQkJICogdGhlIHByb2dyZXNzIGFzIGEgcGVyY2VudGFnZQotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkVTUyA9ICJ1bnBhY2sucHJvZ3Jlc3MiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBwcm9ncmVzcyBhcyBhIHtAY29kZSBwZXJjZW50YWdlfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkVTUyA9ICJ1bnBhY2sucHJvZ3Jlc3MiOy8vJE5PTi1OTFMtMSQKIAotCQkvKioKLQkJICogYSBTdHJpbmcgb2YgdHJ1ZQotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSB0cnVlfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOy8vJE5PTi1OTFMtMSQKIAotCQkvKioKLQkJICogCi0JCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdW5wYWNrZXIKLQkJICovCi0JCVNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcygpOworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHNvcnRlZCBtYXAgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyB1bnBhY2tlci4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdW5wYWNrZXIuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzKCk7CiAKLQkJLyoqCi0JCSAqIHVucGFjayBzdHJlYW0gaW50byBqYXJmaWxlIHdpdGggcGFjayBhcml0aG1ldGljCi0JCSAqIAotCQkgKiBAcGFyYW0gaW4KLQkJICogICAgICAgICAgICBzdHJlYW0gdG8gdW5jb21wYWN0Ci0JCSAqIEBwYXJhbSBvdXQKLQkJICogICAgICAgICAgICBqYXJzdHJlYW0gb2YgdW5jb21wYWN0IGRhdGEKLQkJICogQHRocm93cyBJT0V4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgICBpZiBJL08gZXhjZXB0aW9uIG9jY3VycwotCQkgKi8KLQkJdm9pZCB1bnBhY2soSW5wdXRTdHJlYW0gaW4sIEphck91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVucGFjayB0aGUgc3BlY2lmaWVkIHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkIEpBUiBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGluCisgICAgICAgICAqICAgICAgICAgICAgc3RyZWFtIHRvIHVuY29tcHJlc3NlZC4KKyAgICAgICAgICogQHBhcmFtIG91dAorICAgICAgICAgKiAgICAgICAgICAgIEpBUiBvdXRwdXQgc3RyZWFtIG9mIHVuY29tcHJlc3NlZCBkYXRhLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIEkvTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgdW5wYWNrKElucHV0U3RyZWFtIGluLCBKYXJPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKLQkJLyoqCi0JCSAqIHVucGFjayBGaWxlIGludG8gamFyZmlsZSB3aXRoIHBhY2sgYXJpdGhtZXRpYwotCQkgKiAKLQkJICogQHBhcmFtIGluCi0JCSAqICAgICAgICAgICAgZmlsZSB0byBiZSB1bmNvbXBhY3QKLQkJICogQHBhcmFtIG91dAotCQkgKiAgICAgICAgICAgIGphcnN0cmVhbSBvZiB1bmNvbXBhY3QgZGF0YQotCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JCSAqICAgICAgICAgICAgIGlmIEkvTyBleGNlcHRpb24gb2NjdXJzCi0JCSAqLwotCQl2b2lkIHVucGFjayhGaWxlIGluLCBKYXJPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgICAgIC8qKgorICAgICAgICAgKiBVbnBhY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIEZpbGV9IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICogSkFSIG91dHB1dCBzdHJlYW0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gaW4KKyAgICAgICAgICogICAgICAgICAgICBmaWxlIHRvIGJlIHVuY29tcHJlc3NlZC4KKyAgICAgICAgICogQHBhcmFtIG91dAorICAgICAgICAgKiAgICAgICAgICAgIEpBUiBvdXRwdXQgc3RyZWFtIG9mIHVuY29tcHJlc3NlZCBkYXRhLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIEkvTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgdW5wYWNrKEZpbGUgaW4sIEphck91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAotCQkvKioKLQkJICogYWRkIGEgbGlzdGVuZXIgZm9yIFByb3BlcnR5Q2hhbmdlIGV2ZW50cwotCQkgKiAKLQkJICogQHBhcmFtIGxpc3RlbmVyCi0JCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBpZiBQcm9wZXJ0eUNoYW5nZSBldmVudHMgb2NjdXJzCi0JCSAqLwotICAgICAgICAvLyBUT0RPIEVuYWJsZSB0aGlzIGFnYWluIGF0IGEgbGF0ZXIgcG9pbnQuCi0gICAgICAgIC8vdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIGFkZCBhIGxpc3RlbmVyIGZvciB7QGNvZGUgUHJvcGVydHlDaGFuZ2V9IGV2ZW50cy4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gaWYge0Bjb2RlIFByb3BlcnR5Q2hhbmdlfSBldmVudHMKKyAgICAgICAgICogICAgICAgICAgICBvY2N1cnMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CiAKLQkJLyoqCi0JCSAqIHJlbW92ZSBhIGxpc3RlbmVyCi0JCSAqIAotCQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkJICogICAgICAgICAgICBsaXN0ZW5lciB0byByZW1vdmUKLQkJICovCi0gICAgICAgIC8vIFRPRE8gRW5hYmxlIHRoaXMgYWdhaW4gYXQgYSBsYXRlciBwb2ludC4KLSAgICAgICAgLy92b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCX0KKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlbW92ZSBhIGxpc3RlbmVyLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICAgICAqICAgICAgICAgICAgbGlzdGVuZXIgdG8gcmVtb3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvcGFja2FnZS5odG1sIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvcGFja2FnZS5odG1sCmluZGV4IDIwZjhjYzUuLjM1ZWFiZTcgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL3BhY2thZ2UuaHRtbAorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9wYWNrYWdlLmh0bWwKQEAgLTEsMTAgKzEsMTIgQEAKIDxodG1sPgogICA8Ym9keT4KICAgICA8cD4KLSAgICAgIFRoZSBqYXZhLmphciBwYWNrYWdlIGdpdmVzIGFjY2VzcyB0byBqYXIgZmlsZXMgY29udGVudC4gVGhlc2UgYXJlCi0gICAgICBhY3R1YWxseSB6aXAgZmlsZXMgd2l0aCB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIG1ldGEgaW5mb3JtYXRpb24gdG8gdGhlCi0gICAgICBqYXJmaWxlIGluIHRoZSBmb3JtIG9mIGEgbWFuaWZlc3QgZmlsZS4gVGhpcyBtYW5pZmVzdCBjYW4gYWxzbyBiZSB1c2VkCi0gICAgICB0byBzaWduIGEgamFyIGZpbGUKKyAgICAgIFRoZSBqYXZhLmphciBwYWNrYWdlIGdpdmVzIGFjY2VzcyB0byByZWFkaW5nIGFuZCB3cml0aW5nIGEgSmF2YSBhcmNoaXZlLCAKKyAgICAgIG9yIEpBUiwgZmlsZXMuIFRoZXNlIGFyZQorICAgICAgYWN0dWFsbHkgWklQIGZpbGVzIHdpdGggdGhlIHBvc3NpYmlsaXR5IHRvIGFkZCBtZXRhLWluZm9ybWF0aW9uIGluIHRoZSAKKyAgICAgIGZvcm0gb2YgYSBNQU5JRkVTVCBmaWxlLiBUaGlzIG1hbmlmZXN0IGNhbiBhbHNvIGJlIHVzZWQKKyAgICAgIHRvIHNpZ24gYSBKQVIgZmlsZS4KICAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0FkbGVyMzIuamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0FkbGVyMzIuamF2YQppbmRleCAyZTRlMmFkLi44ZWFhMThlIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9BZGxlcjMyLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvQWRsZXIzMi5qYXZhCkBAIC0xOSw3MCArMTksODUgQEAKIAogCiAvKioKLSAqIFRoZSBBZGxlcjMyIGNsYXNzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgQWRsZXIzMiBDaGVja3N1bSBmcm9tIGEgc2V0IG9mIGRhdGEuCisgKiBUaGUgQWRsZXItMzIgY2xhc3MgaXMgdXNlZCB0byBjb21wdXRlIHRoZSB7QGNvZGUgQWRsZXIzMn0gY2hlY2tzdW0gZnJvbSBhIHNldAorICogb2YgZGF0YS4gQ29tcGFyZWQgdG8gdGhlIENSQy0zMiBhbGdvcml0aG0gaXQgdHJhZGVzIHJlbGlhYmlsdHkgZm9yIHNwZWVkLgorICogUmVmZXIgdG8gUkZDIDE5NTAgZm9yIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBAc2VlIENSQzMyCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFkbGVyMzIgaW1wbGVtZW50cyBqYXZhLnV0aWwuemlwLkNoZWNrc3VtIHsKIAotCXByaXZhdGUgbG9uZyBhZGxlciA9IDE7CisgICAgcHJpdmF0ZSBsb25nIGFkbGVyID0gMTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIEFkbGVyMzIgY2hlY2tzdW0gZm9yIGFsbCBpbnB1dCByZWNlaXZlZAotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNoZWNrc3VtIGZvciB0aGlzIGluc3RhbmNlCi0JICovCi0JcHVibGljIGxvbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBhZGxlcjsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIEFkbGVyMzJ9IGNoZWNrc3VtIGZvciBhbGwgaW5wdXQgcmVjZWl2ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgY2hlY2tzdW0gZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBhZGxlcjsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXNldCB0aGlzIGluc3RhbmNlIHRvIGl0cyBpbml0aWFsIGNoZWNrc3VtCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWFkbGVyID0gMTsKLQl9CisgICAgLyoqCisgICAgICogUmVzZXQgdGhpcyBpbnN0YW5jZSB0byBpdHMgaW5pdGlhbCBjaGVja3N1bS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgYWRsZXIgPSAxOworICAgIH0KIAotCS8qKgotCSAqIFVwZGF0ZSB0aGlzIEFkbGVyMzIgY2hlY2tzdW0gdXNpbmcgdmFsLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBieXRlIHRvIHVwZGF0ZSBjaGVja3N1bSB3aXRoCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKGludCBpKSB7Ci0JCWFkbGVyID0gdXBkYXRlQnl0ZUltcGwoaSwgYWRsZXIpOwotCX0KKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhpcyB7QGNvZGUgQWRsZXIzMn0gY2hlY2tzdW0gd2l0aCB0aGUgc2luZ2xlIGJ5dGUgcHJvdmlkZWQgYXMKKyAgICAgKiBhcmd1bWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gdXBkYXRlIGNoZWNrc3VtIHdpdGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKGludCBpKSB7CisgICAgICAgIGFkbGVyID0gdXBkYXRlQnl0ZUltcGwoaSwgYWRsZXIpOworICAgIH0KIAotCS8qKgotCSAqIFVwZGF0ZSB0aGlzIEFkbGVyMzIgY2hlY2tzdW0gdXNpbmcgdGhlIGNvbnRlbnRzIG9mIGJ1Zi4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmCi0JICogICAgICAgICAgICBieXRlcyB0byB1cGRhdGUgY2hlY2tzdW0gd2l0aAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmKSB7Ci0JCXVwZGF0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCX0KKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhpcyB7QGNvZGUgQWRsZXIzMn0gY2hlY2tzdW0gdXNpbmcgdGhlIGNvbnRlbnRzIG9mIHtAY29kZSBidWZ9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIGJ5dGVzIHRvIHVwZGF0ZSBjaGVja3N1bSB3aXRoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmKSB7CisgICAgICAgIHVwZGF0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KIAotCS8qKgotCSAqIFVwZGF0ZSB0aGlzIEFkbGVyMzIgY2hlY2tzdW0gd2l0aCB0aGUgY29udGVudHMgb2YgYnVmLCBzdGFydGluZyBmcm9tCi0JICogb2Zmc2V0IGFuZCB1c2luZyBuYnl0ZXMgb2YgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmCi0JICogICAgICAgICAgICBidWZmZXIgdG8gb2J0YWluIGRhdCBmcm9tCi0JICogQHBhcmFtIG9mZgotCSAqICAgICAgICAgICAgb2Zmc2V0IGkgYnVmIHRvIGNvcHkgZnJvbQotCSAqIEBwYXJhbSBuYnl0ZXMKLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBmcm9tIGJ1ZiB0byB1c2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykgewotCQkvLyBhdm9pZCBpbnQgb3ZlcmZsb3csIGNoZWNrIG51bGwgYnVmCi0JCWlmIChvZmYgPD0gYnVmLmxlbmd0aCAmJiBuYnl0ZXMgPj0gMCAmJiBvZmYgPj0gMAotCQkJCSYmIGJ1Zi5sZW5ndGggLSBvZmYgPj0gbmJ5dGVzKSB7CisgICAgLyoqCisgICAgICogVXBkYXRlIHRoaXMge0Bjb2RlIEFkbGVyMzJ9IGNoZWNrc3VtIHdpdGggdGhlIGNvbnRlbnRzIG9mIHtAY29kZSBidWZ9LAorICAgICAqIHN0YXJ0aW5nIGZyb20gdGhlIG9mZnNldCBwcm92aWRlZCBhbmQgcmVhZGluZyBuIGJ5dGVzIG9mIGRhdGEuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgYnVmZmVyIHRvIG9idGFpbiBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIHtAY29kZSBidWZ9IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbS4KKyAgICAgKiBAcGFyYW0gbmJ5dGVzCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgZnJvbSB7QGNvZGUgYnVmfSB0byB1c2UuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0ID4gYnVmLmxlbmd0aH0gb3Ige0Bjb2RlIG5ieXRlc30gaXMgbmVnYXRpdmUKKyAgICAgKiAgICAgICAgICAgICBvciB7QGNvZGUgb2Zmc2V0ICsgbmJ5dGVzID4gYnVmLmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMpIHsKKyAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgorICAgICAgICBpZiAob2ZmIDw9IGJ1Zi5sZW5ndGggJiYgbmJ5dGVzID49IDAgJiYgb2ZmID49IDAKKyAgICAgICAgICAgICAgICAmJiBidWYubGVuZ3RoIC0gb2ZmID49IG5ieXRlcykgewogICAgICAgICAgICAgYWRsZXIgPSB1cGRhdGVJbXBsKGJ1Ziwgb2ZmLCBuYnl0ZXMsIGFkbGVyKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotCX0KKyAgICB9CiAKLQlwcml2YXRlIG5hdGl2ZSBsb25nIHVwZGF0ZUltcGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcywgbG9uZyBhZGxlcjEpOworICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgdXBkYXRlSW1wbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbmJ5dGVzLCBsb25nIGFkbGVyMSk7CiAKLQlwcml2YXRlIG5hdGl2ZSBsb25nIHVwZGF0ZUJ5dGVJbXBsKGludCB2YWwsIGxvbmcgYWRsZXIxKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBsb25nIHVwZGF0ZUJ5dGVJbXBsKGludCB2YWwsIGxvbmcgYWRsZXIxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0NSQzMyLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9DUkMzMi5qYXZhCmluZGV4IGUyODQ4MTMuLjM2ZGMzNzYgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0NSQzMyLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvQ1JDMzIuamF2YQpAQCAtMTksNzEgKzE5LDgzIEBACiAKIAogLyoqCi0gKiBUaGUgQ1JDMzIgY2xhc3MgaXMgdXNlZCB0byBjb21wdXRlIGEgQ1JDMzIgQ2hlY2tzdW0gZnJvbSBhIHNldCBvZiBkYXRhLgorICogVGhlIENSQzMyIGNsYXNzIGlzIHVzZWQgdG8gY29tcHV0ZSBhIENSQzMyIGNoZWNrc3VtIGZyb20gZGF0YSBwcm92aWRlZCBhcworICogaW5wdXQgdmFsdWUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ1JDMzIgaW1wbGVtZW50cyBqYXZhLnV0aWwuemlwLkNoZWNrc3VtIHsKIAotCXByaXZhdGUgbG9uZyBjcmMgPSAwTDsKKyAgICBwcml2YXRlIGxvbmcgY3JjID0gMEw7CiAKLQlsb25nIHRieXRlcyA9IDBMOworICAgIGxvbmcgdGJ5dGVzID0gMEw7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDUkMzMiBDaGVja3N1bSBmb3IgYWxsIGlucHV0IHJlY2VpdmVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNoZWNrc3VtIGZvciB0aGlzIGluc3RhbmNlCi0JICovCi0JcHVibGljIGxvbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBjcmM7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIENSQzMyIGNoZWNrc3VtIGZvciBhbGwgaW5wdXQgcmVjZWl2ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgY2hlY2tzdW0gZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBjcmM7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ1JDMzIgY2hlY2tzdW0gdG8gaXQgaW5pdGlhbCBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJdGJ5dGVzID0gY3JjID0gMDsKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIENSQzMyIGNoZWNrc3VtIHRvIGl0IGluaXRpYWwgc3RhdGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHRieXRlcyA9IGNyYyA9IDA7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIENoZWNrc3VtIHdpdGggdmFsdWUgdmFsCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKGludCB2YWwpIHsKLQkJY3JjID0gdXBkYXRlQnl0ZUltcGwoKGJ5dGUpIHZhbCwgY3JjKTsKLQl9CisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGlzIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGUgdmFsdWUgcHJvdmlkZWQgYXMgaW50ZWdlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsCisgICAgICogICAgICAgICAgICByZXByZXNlbnRzIHRoZSBieXRlIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKGludCB2YWwpIHsKKyAgICAgICAgY3JjID0gdXBkYXRlQnl0ZUltcGwoKGJ5dGUpIHZhbCwgY3JjKTsKKyAgICB9CiAKLQkvKioKLQkgKiBVcGRhdGVzIHRoaXMgQ2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgY29udGFpbmVkIGluIGJ1ZmZlciBidWYuCi0JICogCi0JICogQHBhcmFtIGJ1ZgotCSAqICAgICAgICAgICAgQnVmZmVyIHRvIHVwZGF0ZSBDaGVja3N1bQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmKSB7Ci0JCXVwZGF0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCX0KKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoaXMgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgY29udGFpbmVkIGluIGJ1ZmZlciB7QGNvZGUgYnVmfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmKSB7CisgICAgICAgIHVwZGF0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KIAotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBDaGVja3N1bSB3aXRoIG5ieXRlcyBvZiBkYXRhIGZyb20gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXQKLQkgKiBvZmZzZXQgb2ZmLgotCSAqIAotCSAqIEBwYXJhbSBidWYKLQkgKiAgICAgICAgICAgIEJ1ZmZlciB0byB1cGRhdGUgQ2hlY2tzdW0KLQkgKiBAcGFyYW0gb2ZmCi0JICogICAgICAgICAgICBPZmZzZXQgaW4gYnVmIHRvIG9idGFpbiBkYXRhIGZyb20KLQkgKiBAcGFyYW0gbmJ5dGVzCi0JICogICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIGJ1ZgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbmJ5dGVzKSB7Ci0JCS8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKLQkJaWYgKG9mZiA8PSBidWYubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCi0JCQkJJiYgYnVmLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKLQkJCXRieXRlcyArPSBuYnl0ZXM7Ci0JCQljcmMgPSB1cGRhdGVJbXBsKGJ1Ziwgb2ZmLCBuYnl0ZXMsIGNyYyk7Ci0JCX0gZWxzZSB7CisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGlzIGNoZWNrc3VtIHdpdGggbiBieXRlcyBvZiBkYXRhIG9idGFpbmVkIGZyb20gYnVmZmVyIHtAY29kZQorICAgICAqIGJ1Zn0sIHN0YXJ0aW5nIGF0IG9mZnNldCB7QGNvZGUgb2ZmfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB7QGNvZGUgYnVmfSB0byBvYnRhaW4gZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBuYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHtAY29kZSBidWZ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbmJ5dGVzKSB7CisgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKKyAgICAgICAgaWYgKG9mZiA8PSBidWYubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKKyAgICAgICAgICAgIHRieXRlcyArPSBuYnl0ZXM7CisgICAgICAgICAgICBjcmMgPSB1cGRhdGVJbXBsKGJ1Ziwgb2ZmLCBuYnl0ZXMsIGNyYyk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JcHJpdmF0ZSBuYXRpdmUgbG9uZyB1cGRhdGVJbXBsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMsIGxvbmcgY3JjMSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgbG9uZyB1cGRhdGVJbXBsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMsIGxvbmcgY3JjMSk7CiAKLQlwcml2YXRlIG5hdGl2ZSBsb25nIHVwZGF0ZUJ5dGVJbXBsKGJ5dGUgdmFsLCBsb25nIGNyYzEpOworICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgdXBkYXRlQnl0ZUltcGwoYnl0ZSB2YWwsIGxvbmcgY3JjMSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9DaGVja2VkSW5wdXRTdHJlYW0uamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0NoZWNrZWRJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGZjMTBiYjUuLjY1OTEyNWEgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0NoZWNrZWRJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0NoZWNrZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0yMiwyMSArMjIsMjcgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiAvKioKLSAqIFRoZSBDaGVja2VkSW5wdXRTdHJlYW0gY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiBhIHJ1bm5pbmcgQ2hlY2tzdW0gb2YgYWxsCi0gKiBkYXRhIHJlYWQgZnJvbSBhIHN0cmVhbS4KKyAqIFRoZSB7QGNvZGUgQ2hlY2tlZElucHV0U3RyZWFtfSBjbGFzcyBpcyB1c2VkIHRvIG1haW50YWluIGEgY2hlY2tzdW0gYXQgdGhlCisgKiBzYW1lIHRpbWUgYXMgdGhlIGRhdGEsIG9uIHdoaWNoIHRoZSBjaGVja3N1bSBpcyBjb21wdXRlZCwgaXMgcmVhZCBmcm9tIGEKKyAqIHN0cmVhbS4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjaGVja3N1bSBpcyB0byBlc3RhYmxpc2ggZGF0YSBpbnRlZ3JpdHksCisgKiBjb21wYXJpbmcgdGhlIGNvbXB1dGVkIGNoZWNrc3VtIGFnYWluc3QgYSBwdWJsaXNoZWQgY2hlY2tzdW0gdmFsdWUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2hlY2tlZElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSB7CiAKICAgICBwcml2YXRlIGZpbmFsIENoZWNrc3VtIGNoZWNrOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBDaGVja2VkSW5wdXRTdHJlYW0gb24gSW5wdXRTdHJlYW0gaXMuIFRoZSBDaGVja3N1bSB3aWxsCi0gICAgICogYmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIGltcGxlbWVudGVkIGJ5IGNzdW0uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2hlY2tlZElucHV0U3RyZWFtfSBvbiB7QGNvZGUgSW5wdXRTdHJlYW19CisgICAgICoge0Bjb2RlIGlzfS4gVGhlIGNoZWNrc3VtIHdpbGwgYmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgYWxnb3JpdGhtCisgICAgICogaW1wbGVtZW50ZWQgYnkge0Bjb2RlIGNzdW19LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpcwotICAgICAqICAgICAgICAgICAgSW5wdXRTdHJlYW0gdG8gY2FsY3VsYXRlIGNoZWNrc3VtIGZyb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0gdG8gY2FsY3VsYXRlIGNoZWNrc3VtIGZyb20uCiAgICAgICogQHBhcmFtIGNzdW0KLSAgICAgKiAgICAgICAgICAgIFR5cGUgb2YgQ2hlY2tzdW0gdG8gY2FsY3VsYXRlCisgICAgICogICAgICAgICAgICBhbiBlbnRpdHkgaW1wbGVtZW50aW5nIHRoZSBjaGVja3N1bSBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoZWNrZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgQ2hlY2tzdW0gY3N1bSkgewogICAgICAgICBzdXBlcihpcyk7CkBAIC00NCwxMCArNTAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIGJ5dGUgb2YgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBhbmQgcmVjb21wdXRlcyB0aGUKLSAgICAgKiBDaGVja3N1bSB3aXRoIHRoZSBieXRlIGRhdGEuCisgICAgICogUmVhZHMgb25lIGJ5dGUgb2YgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbSBhbmQgdXBkYXRlcyB0aGUKKyAgICAgKiBjaGVja3N1bSB3aXRoIHRoZSBieXRlIGRhdGEuCiAgICAgICogCi0gICAgICogQHJldHVybiAtMSBpZiBlbmQgb2Ygc3RyZWFtLCBhIHNpbmdsZSBieXRlIHZhbHVlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIC0xfSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGEgc2luZ2xlIGJ5dGUgdmFsdWUKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTU5LDEwICs2OSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIHVwIHRvIG5ieXRlcyBvZiBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLCBzdG9yaW5nIGl0IGluIGJ1ZiwKLSAgICAgKiBzdGFydGluZyBhdCBvZmZzZXQgb2ZmLiBUaGUgQ2hlY2tzdW0gaXMgdXBkYXRlZCB3aXRoIHRoZSBieXRlcyByZWFkLgorICAgICAqIFJlYWRzIHVwIHRvIG4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbSwgc3RvcmluZyBpdAorICAgICAqIGludG8ge0Bjb2RlIGJ1Zn0sIHN0YXJ0aW5nIGF0IG9mZnNldCB7QGNvZGUgb2ZmfS4gVGhlIGNoZWNrc3VtIGlzCisgICAgICogdXBkYXRlZCB3aXRoIHRoZSBieXRlcyByZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQsIC0xIGlmIGVuZCBvZiBzdHJlYW0KKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmfSB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZAorICAgICAqICAgICAgICAgICAgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gbmJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ1Zn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3Ige0Bjb2RlIC0xfSBpZiBhcnJpdmVkIGF0IHRoZQorICAgICAqICAgICAgICAgZW5kIG9mIHRoZSBmaWx0ZXJlZCBzdHJlYW0gd2hpbGUgcmVhZGluZyB0aGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIHNvbWUgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTc0LDIxICs5NiwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIENoZWNrc3VtIGNhbGN1bGF0ZWQgb24gdGhlIHN0cmVhbSB0aHVzIGZhci4KKyAgICAgKiBSZXR1cm5zIHRoZSBjaGVja3N1bSBjYWxjdWxhdGVkIG9uIHRoZSBzdHJlYW0gcmVhZCBzbyBmYXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIGphdmEudXRpbC56aXAuQ2hlY2tzdW0KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGVja3N1bSBnZXRDaGVja3N1bSgpIHsKICAgICAgICAgcmV0dXJuIGNoZWNrOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXAgdXB0byBuYnl0ZXMgb2YgZGF0YSBvbiB0aGUgdW5kZXJseWluZyBzdHJlYW0uIEFueSBza2lwcGVkIGJ5dGVzIGFyZQotICAgICAqIGFkZGVkIHRvIHRoZSBydW5uaW5nIENoZWNrc3VtIHZhbHVlLgorICAgICAqIFNraXAgdXAgdG8gbiBieXRlcyBvZiBkYXRhIG9uIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4gQW55IHNraXBwZWQKKyAgICAgKiBieXRlcyBhcmUgYWRkZWQgdG8gdGhlIHJ1bm5pbmcgY2hlY2tzdW0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ieXRlcwotICAgICAqICAgICAgICAgICAgbG9uZyBOdW1iZXIgb2YgYnl0ZXMgdG8gc2tpcAotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbmJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvQ2hlY2tlZE91dHB1dFN0cmVhbS5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvQ2hlY2tlZE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDhhNmY3ZGUuLjk2OTk0OTIgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0NoZWNrZWRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9DaGVja2VkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTIyLDIxICsyMiwyNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiAvKioKLSAqIFRoZSBDaGVja2VkT3V0cHV0U3RyZWFtIGNsYXNzIGlzIHVzZWQgdG8gbWFpbnRhaW4gYSBydW5uaW5nIENoZWNrc3VtIG9mIGFsbAotICogZGF0YSB3cml0dGVuIHRvIGEgc3RyZWFtLgorICogVGhlIHtAY29kZSBDaGVja2VkT3V0cHV0U3RyZWFtfSBjbGFzcyBpcyB1c2VkIHRvIG1haW50YWluIGEgcnVubmluZyBjaGVja3N1bQorICogb2YgYWxsIGRhdGEgd3JpdHRlbiB0byBhIHN0cmVhbS4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjaGVja3N1bSBpcyB0byBlc3RhYmxpc2gKKyAqIGRhdGEgaW50ZWdyaXR5LCBieSBwdWJsaXNoaW5nIHRoZSBjaGVja3N1bSB0byBvdGhlciBwYXJ0aWVzIHdhbnRpbmcgdG8gcmVhZAorICogdGhlIG5vbiBjb3JydXB0ZWQgZGF0YS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDaGVja2VkT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0gewogCiAgICAgcHJpdmF0ZSBmaW5hbCBDaGVja3N1bSBjaGVjazsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQ2hlY2tlZE91dHB1dFN0cmVhbSBvbiBPdXRwdXRTdHJlYW0gb3MuIFRoZSBDaGVja3N1bQotICAgICAqIHdpbGwgYmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIGltcGxlbWVudGVkIGJ5IGNzdW0uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2hlY2tlZE91dHB1dFN0cmVhbX0gb24ge0Bjb2RlIE91dHB1dFN0cmVhbX0KKyAgICAgKiB7QGNvZGUgb3N9LiBUaGUgY2hlY2tzdW0gaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIGltcGxlbWVudGVkCisgICAgICogYnkge0Bjb2RlIGNzdW19LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcwotICAgICAqICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHRvIGNhbGN1bGF0ZSBjaGVja3N1bSBmcm9tCisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbSB0byBjYWxjdWxhdGUgY2hlY2tzdW0gZm9yLgogICAgICAqIEBwYXJhbSBjcwotICAgICAqICAgICAgICAgICAgVHlwZSBvZiBDaGVja3N1bSB0byBjYWxjdWxhdGUKKyAgICAgKiAgICAgICAgICAgIGFuIGVudGl0eSBpbXBsZW1lbnRpbmcgdGhlIGNoZWNrc3VtIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2hlY2tlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIENoZWNrc3VtIGNzKSB7CiAgICAgICAgIHN1cGVyKG9zKTsKQEAgLTQ0LDIzICs1MCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIENoZWNrc3VtIGNhbGN1bGF0ZWQgb24gdGhlIHN0cmVhbSB0aHVzIGZhci4KKyAgICAgKiBSZXR1cm5zIHRoZSBjaGVja3N1bSBjYWxjdWxhdGVkIG9uIHRoZSBzdHJlYW0gcmVhZCBzbyBmYXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIGphdmEudXRpbC56aXAuQ2hlY2tzdW0KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGVja3N1bSBnZXRDaGVja3N1bSgpIHsKICAgICAgICAgcmV0dXJuIGNoZWNrOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBieXRlIHZhbHVlIHZhbCB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIFRoZSBDaGVja3N1bSBpcyB1cGRhdGVkCi0gICAgICogd2l0aCB2YWwuCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgYnl0ZSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIFRoZSBjaGVja3N1bSBpcworICAgICAqIHVwZGF0ZWQgd2l0aCB7QGNvZGUgdmFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgYnl0ZSB0byB3cml0ZSBvdXQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHZhbHVlIHRvIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkCisgICAgICogICAgICAgICAgICAgaWYgYW4gSU8gZXJyb3IgaGFzIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC02OSwxOCArNzYsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgbmJ5dGVzIG9mIGRhdGEgZnJvbSBidWYgc3RhcnRpbmcgYXQgb2Zmc2V0IG9mZiB0byB0aGUgdW5kZXJseWluZwotICAgICAqIHN0cmVhbS4gVGhlIENoZWNrc3VtIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYnl0ZXMgd3JpdHRlbi4KKyAgICAgKiBXcml0ZXMgbiBieXRlcyBvZiBkYXRhIGZyb20ge0Bjb2RlIGJ1Zn0gc3RhcnRpbmcgYXQgb2Zmc2V0IHtAY29kZSBvZmZ9IHRvCisgICAgICogdGhlIHVuZGVybHlpbmcgc3RyZWFtLiBUaGUgY2hlY2tzdW0gaXMgdXBkYXRlZCB3aXRoIHRoZSBieXRlcyB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIGRhdGEgdG8gd3JpdGUgb3V0CisgICAgICogICAgICAgICAgICBkYXRhIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogQHBhcmFtIG9mZgotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0byBzdGFydCByZWFkaW5nIHRoZSBkYXRhIGZyb20ge0Bjb2RlIGJ1Zn0gd3JpdHRlbgorICAgICAqICAgICAgICAgICAgdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogQHBhcmFtIG5ieXRlcwotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIG91dAotICAgICAqIAorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBJTyBlcnJvciBoYXMgb2NjdXJlZAorICAgICAqICAgICAgICAgICAgIGlmIGFuIElPIGVycm9yIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbmJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvQ2hlY2tzdW0uamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0NoZWNrc3VtLmphdmEKaW5kZXggZjVlZDVkZC4uMDQwNWMwOCAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvQ2hlY2tzdW0uamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9DaGVja3N1bS5qYXZhCkBAIC0xNywxMyArMTcsNDkgQEAKIAogcGFja2FnZSBqYXZhLnV0aWwuemlwOwogCi0KKy8qKgorICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBjaGVja3N1bSB3aGljaCB3YXMgY29tcHV0ZWQgd2l0aCB0aGUgbWV0aG9kcworICogaW1wbGVtZW50aW5nIGEgY2hlY2tzdW0gYWxnb3JpdGhtLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBDaGVja3N1bSB7Ci0JcHVibGljIGxvbmcgZ2V0VmFsdWUoKTsKIAotCXB1YmxpYyB2b2lkIHJlc2V0KCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjYWxjdWxhdGVkIGNoZWNrc3VtIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNoZWNrc3VtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFZhbHVlKCk7CiAKLQlwdWJsaWMgdm9pZCB1cGRhdGUoaW50IHZhbCk7CisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjaGVja3N1bSB2YWx1ZSBhcHBsaWVkIGJlZm9yZSBiZWdpbm5pbmcgY2FsY3VsYXRpb25zIG9uIGEgbmV3CisgICAgICogc3RyZWFtIG9mIGRhdGEuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKTsKIAotCXB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbmJ5dGVzKTsKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBjaGVja3N1bSB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBieXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoaW50IHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBjaGVja3N1bSB3aXRoIHRoZSBnaXZlbiBieXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIGJ5dGVzLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZ9IHRvIHJlYWQgdGhlIGJ5dGVzIGZyb20uCisgICAgICogQHBhcmFtIG5ieXRlcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20ge0Bjb2RlIGJ1Zn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGF0YUZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGF0YUZvcm1hdEV4Y2VwdGlvbi5qYXZhCmluZGV4IGJlOGQyNjAuLjlmZmUyYWIgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0RhdGFGb3JtYXRFeGNlcHRpb24uamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EYXRhRm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDI3ICsxOCwzMSBAQAogcGFja2FnZSBqYXZhLnV0aWwuemlwOwogCiAvKioKLSAqIERhdGFGb3JtYXRFeGNlcHRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBpbiB0aGUgZm9ybWF0IG9mIGEKLSAqIHBhcnRpY3VsYXIgZGF0YSBzdHJlYW0uCisgKiB7QGNvZGUgRGF0YUZvcm1hdEV4Y2VwdGlvbn0gaXMgdXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBpbiB0aGUgZm9ybWF0IG9mIGEKKyAqIHBhcnRpY3VsYXIgZGF0YSBzdHJlYW0gd2hpY2ggaXMgdG8gYmUgdW5jb21wcmVzc2VkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIERhdGFGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjIxOTYzMjg3MDg5MzY0MTQ1Mkw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERhdGFGb3JtYXRFeGNlcHRpb259IGluc3RhbmNlLgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRhRm9ybWF0RXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRhRm9ybWF0RXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRhRm9ybWF0RXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGVmbGF0ZXIuamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0RlZmxhdGVyLmphdmEKaW5kZXggNWIwMjNiNi4uZjkxZjFjYSAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGVmbGF0ZXIuamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EZWZsYXRlci5qYXZhCkBAIC0xOCwzMyArMTgsODQgQEAKIHBhY2thZ2UgamF2YS51dGlsLnppcDsKIAogLyoqCi0gKiBUaGUgRGVmbGF0ZXIgY2xhc3MgaXMgdXNlZCB0byBjb21wcmVzcyBieXRlcyB1c2luZyB0aGUgREVGTEFURSBjb21wcmVzc2lvbgotICogYWxnb3JpdGhtLiBEZWZsYXRpb24gaXMgcGVyZm9ybWVkIGJ5IHRoZSBaTElCIGNvbXByZXNzaW9uIGxpYnJhcnkuCisgKiBUaGlzIGNsYXNzIGNvbXByZXNzZXMgZGF0YSB1c2luZyB0aGUgPGk+REVGTEFURTwvaT4gYWxnb3JpdGhtIChzZWUgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuZ3ppcC5vcmcvYWxnb3JpdGhtLnR4dCI+c3BlY2lmaWNhdGlvbjwvYT4pLgorICogPHA+CisgKiBCYXNpY2FsbHkgdGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBBUEkgdG8gdGhlIHN0cmVhbSBiYXNlZCBaTElCIGNvbXByZXNzaW9uCisgKiBsaWJyYXJ5IGFuZCBpcyB1c2VkIGFzIHN1Y2ggYnkge0Bjb2RlIERlZmxhdGVyT3V0cHV0U3RyZWFtfSBhbmQgaXRzCisgKiBkZXNjZW5kYW50cy4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIHR5cGljYWwgdXNhZ2Ugb2YgYSB7QGNvZGUgRGVmbGF0ZXJ9IGluc3RhbmNlIG91dHNpZGUgdGhpcyBwYWNrYWdlCisgKiBjb25zaXN0cyBvZiBhIHNwZWNpZmljIGNhbGwgdG8gb25lIG9mIGl0cyBjb25zdHJ1Y3RvcnMgYmVmb3JlIGJlaW5nIHBhc3NlZCB0bworICogYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIERlZmxhdGVyT3V0cHV0U3RyZWFtfS4KKyAqIDwvcD4KICAqIAogICogQHNlZSBEZWZsYXRlck91dHB1dFN0cmVhbQogICogQHNlZSBJbmZsYXRlcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEZWZsYXRlciB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRVNUX0NPTVBSRVNTSU9OID0gOTsKKyAgICAvKioKKyAgICAgKiBVcHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzaW9uIGxldmVsIHJhbmdlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFU1RfQ09NUFJFU1NJT04gPSA5OwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVTVF9TUEVFRCA9IDE7CisgICAgLyoqCisgICAgICogTG93ZXIgYm91bmQgZm9yIGNvbXByZXNzaW9uIGxldmVsIHJhbmdlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFU1RfU1BFRUQgPSAxOworICAgIAorICAgIC8qKgorICAgICAqIFVzYWdlIG9mIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciBjb21wcmVzc2lvbiBzdHJhdGVneS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NUUkFURUdZID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciBjb21wcmVzc2lvbiBtZXRob2QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQgPSA4OworICAgIAorICAgIC8qKgorICAgICAqIFBvc3NpYmxlIHZhbHVlIGZvciBjb21wcmVzc2lvbiBzdHJhdGVneS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJFRCA9IDE7CisgICAgCisgICAgLyoqCisgICAgICogUG9zc2libGUgdmFsdWUgZm9yIGNvbXByZXNzaW9uIHN0cmF0ZWd5LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhVRkZNQU5fT05MWSA9IDI7CisgICAgCisgICAgLyoqCisgICAgICogUG9zc2libGUgdmFsdWUgZm9yIGNvbXByZXNzaW9uIGxldmVsLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NPTVBSRVNTSU9OID0gMDsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWl9OT19GTFVTSCA9IDA7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NUUkFURUdZID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkxBVEVEID0gODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUkVEID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhVRkZNQU5fT05MWSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19DT01QUkVTU0lPTiA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWl9OT19GTFVTSCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWl9GSU5JU0ggPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaX0ZJTklTSCA9IDQ7CiAgICAgCiAgICAgLy8gRmlsbCBpbiB0aGUgSk5JIGlkIGNhY2hlcwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG9uZVRpbWVJbml0aWFsaXphdGlvbigpOwpAQCAtNTYsNTIgKzEwNyw1OSBAQAogICAgICAgICBvbmVUaW1lSW5pdGlhbGl6YXRpb24oKTsKICAgICB9CiAKLQlwcml2YXRlIGludCBmbHVzaFBhcm0gPSBaX05PX0ZMVVNIOworICAgIHByaXZhdGUgaW50IGZsdXNoUGFybSA9IFpfTk9fRkxVU0g7CiAKLQlwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOwogCi0JcHJpdmF0ZSBpbnQgY29tcHJlc3NMZXZlbCA9IERFRkFVTFRfQ09NUFJFU1NJT047CisgICAgcHJpdmF0ZSBpbnQgY29tcHJlc3NMZXZlbCA9IERFRkFVTFRfQ09NUFJFU1NJT047CiAKLQlwcml2YXRlIGludCBzdHJhdGVneSA9IERFRkFVTFRfU1RSQVRFR1k7CisgICAgcHJpdmF0ZSBpbnQgc3RyYXRlZ3kgPSBERUZBVUxUX1NUUkFURUdZOwogCi0JcHJpdmF0ZSBsb25nIHN0cmVhbUhhbmRsZSA9IC0xOworICAgIHByaXZhdGUgbG9uZyBzdHJlYW1IYW5kbGUgPSAtMTsKIAotCXByaXZhdGUgYnl0ZVtdIGlucHV0QnVmZmVyOworICAgIHByaXZhdGUgYnl0ZVtdIGlucHV0QnVmZmVyOwogCi0JcHJpdmF0ZSBpbnQgaW5SZWFkOworICAgIHByaXZhdGUgaW50IGluUmVhZDsKICAgICAKICAgICBwcml2YXRlIGludCBpbkxlbmd0aDsKICAgICAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERlZmxhdGVyIGluc3RhbmNlIHdpdGggZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCBhbmQKLSAgICAgKiBzdHJhdGVneS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEZWZsYXRlcn0gaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IGNvbXByZXNzaW9uCisgICAgICogbGV2ZWwuIFRoZSBzdHJhdGVneSBjYW4gYmUgc3BlY2lmaWVkIHdpdGgge0BsaW5rICNzZXRTdHJhdGVneX0sIG9ubHkuIEEKKyAgICAgKiBoZWFkZXIgaXMgYWRkZWQgdG8gdGhlIG91dHB1dCBieSBkZWZhdWx0OyB1c2UgY29uc3RydWN0b3Ige0Bjb2RlCisgICAgICogRGVmbGF0ZXIobGV2ZWwsIGJvb2xlYW4pfSBpZiB5b3UgbmVlZCB0byBvbWl0IHRoZSBoZWFkZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERlZmxhdGVyKCkgewogICAgICAgICB0aGlzKERFRkFVTFRfQ09NUFJFU1NJT04sIGZhbHNlKTsKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEZWZsYXRlciBpbnN0YW5jZSB3aXRoIGNvbXByZXNzaW9uIGxldmVsIGxldmVsIGFuZAotICAgICAqIGRlZmF1bHQgY29tcHJlc3Npb24gc3RyYXRlZ3kuIFRIZSBjb21wcmVzc2lvbiBsZXZlbCBwcm92aWRlZCBtdXN0IGJlCi0gICAgICogYmV0d2VlbiAwIGFuZCA5LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERlZmxhdGVyfSBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWMgY29tcHJlc3Npb24KKyAgICAgKiBsZXZlbC4gVGhlIHN0cmF0ZWd5IGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB7QGNvZGUgc2V0U3RyYXRlZ3l9LCBvbmx5LiBBCisgICAgICogaGVhZGVyIGlzIGFkZGVkIHRvIHRoZSBvdXRwdXQgYnkgZGVmYXVsdDsgdXNlCisgICAgICoge0Bjb2RlIERlZmxhdGVyKGxldmVsLCBib29sZWFuKX0gaWYgeW91IG5lZWQgdG8gb21pdCB0aGUgaGVhZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZXZlbAotICAgICAqICAgICAgICAgICAgdGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbXByZXNzaW9uIGxldmVsIGluIHRoZSByYW5nZSBiZXR3ZWVuIDAgYW5kIDkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERlZmxhdGVyKGludCBsZXZlbCkgewogICAgICAgICB0aGlzKGxldmVsLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEZWZsYXRlciBpbnN0YW5jZSB3aXRoIGNvbXByZXNzaW9uIGxldmVsIGxldmVsIGFuZAotICAgICAqIGRlZmF1bHQgY29tcHJlc3Npb24gc3RyYXRlZ3kuIElmIHRoZSBub0hlYWRlciBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHRoZW4KLSAgICAgKiBubyBaTElCIGhlYWRlciB3aWxsIGJlIHdyaXR0ZW4gYXMgcGFydCBvZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQuIFRoZQotICAgICAqIGNvbXByZXNzaW9uIGxldmVsIHNwZWNpZmllZCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEZWZsYXRlcn0gaW5zdGFuY2Ugd2l0aCBhIHNwZWNpZmljIGNvbXByZXNzaW9uCisgICAgICogbGV2ZWwuIElmIG5vSGVhZGVyIGlzIHBhc3NlZCBhcyB0cnVlIG5vIFpMaWIgaGVhZGVyIGlzIGFkZGVkIHRvIHRoZQorICAgICAqIG91dHB1dC4gSW4gYSBaSVAgYXJjaGl2ZSBldmVyeSBlbnRyeSAoY29tcHJlc3NlZCBmaWxlKSBjb21lcyB3aXRoIHN1Y2ggYQorICAgICAqIGhlYWRlci4gVGhlIHN0cmF0ZWd5IGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgc2V0U3RyYXRlZ3kgbWV0aG9kLCBvbmx5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZXZlbAotICAgICAqICAgICAgICAgICAgdGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbXByZXNzaW9uIGxldmVsIGluIHRoZSByYW5nZSBiZXR3ZWVuIDAgYW5kIDkuCiAgICAgICogQHBhcmFtIG5vSGVhZGVyCi0gICAgICogICAgICAgICAgICBpZiB0cnVlIGRvIG5vdCB3cml0ZSB0aGUgWkxJQiBoZWFkZXIKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpbmRpY2F0ZXMgdGhhdCBubyBaTElCIGhlYWRlciBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGVmbGF0ZXIoaW50IGxldmVsLCBib29sZWFuIG5vSGVhZGVyKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC0xMTIsMzUgKzE3MCwzNSBAQAogICAgICAgICBzdHJlYW1IYW5kbGUgPSBjcmVhdGVTdHJlYW0oY29tcHJlc3NMZXZlbCwgc3RyYXRlZ3ksIG5vSGVhZGVyKTsKICAgICB9CiAKLQkvKioKLQkgKiBEZWZsYXRlcyBkYXRhIGludG8gdGhlIHN1cHBsaWVkIGJ1ZmZlcgotCSAqIAotCSAqIEBwYXJhbSBidWYKLQkgKiAgICAgICAgICAgIGJ1ZmZlciB0byBzdG9yZSBjb21wcmVzc2VkIGRhdGEKLQkgKiAKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBvZiBjb21wcmVzc2VkIGRhdGEgc3RvcmVkCi0JICogCi0JICovCi0JcHVibGljIGludCBkZWZsYXRlKGJ5dGVbXSBidWYpIHsKLQkJcmV0dXJuIGRlZmxhdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQl9CisgICAgLyoqCisgICAgICogRGVmbGF0ZXMgdGhlIGRhdGEgKHByZXZpb3VzbHkgcGFzc2VkIHRvIHtAY29kZSBzZXRJbnB1dH0pIGludG8gdGhlCisgICAgICogc3VwcGxpZWQgYnVmZmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIGJ1ZmZlciB0byB3cml0ZSBjb21wcmVzc2VkIGRhdGEgdG8uCisgICAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgb2YgY29tcHJlc3NlZCBkYXRhIHdyaXR0ZW4gdG8ge0Bjb2RlIGJ1Zn0uCisgICAgICogQHNlZSAjZGVmbGF0ZShieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVmbGF0ZShieXRlW10gYnVmKSB7CisgICAgICAgIHJldHVybiBkZWZsYXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQogCi0JLyoqCi0JICogRGVmbGF0ZXMgZGF0YSBpbnRvIHRoZSBzdXBwbGllZCBidWZmZXIgdXNpbmcgdGhlIHJlZ2lvbiBmcm9tIG9mZiB0bwotCSAqIG5ieXRlcyAtIDEuCi0JICogCi0JICogQHBhcmFtIGJ1ZgotCSAqICAgICAgICAgICAgYnVmZmVyIHRvIHN0b3JlIGNvbXByZXNzZWQgZGF0YQotCSAqIEBwYXJhbSBvZmYKLQkgKiAgICAgICAgICAgIG9mZnNldCBpbmYgYnVmIHRvIHN0YXJ0IHN0b3JpbmcgZGF0YQotCSAqIEBwYXJhbSBuYnl0ZXMKLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBvZiBjb21wcmVzc2VkIGRhdGEgdG8gc3RvcmUgaW4gYnVmCi0JICogCi0JICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgb2YgY29tcHJlc3NlZCBkYXRhIHN0b3JlZAotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRlZmxhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykgewotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgLyoqCisgICAgICogRGVmbGF0ZXMgZGF0YSAocHJldmlvdXNseSBwYXNzZWQgdG8ge0Bjb2RlIHNldElucHV0fSkgaW50byBhIHNwZWNpZmljCisgICAgICogcmVnaW9uIHdpdGhpbiB0aGUgc3VwcGxpZWQgYnVmZmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUgY29tcHJlc3NlZCBkYXRhIHRvLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIHtAY29kZSBidWZ9IGF0IHdoaWNoIHRvIHN0YXJ0IHdyaXRpbmcgdG8uCisgICAgICogQHBhcmFtIG5ieXRlcworICAgICAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb2YgY29tcHJlc3NlZCBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGNvbXByZXNzZWQgZGF0YSB3cml0dGVuIHRvIHtAY29kZSBidWZ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRlZmxhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykgeworICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgpAQCAtMTUyLDI3NCArMjEwLDMxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGRlZmxhdGVJbXBsKGJ1Ziwgb2ZmLCBuYnl0ZXMsIHN0cmVhbUhhbmRsZSwgZmx1c2hQYXJtKTsKICAgICAgICAgfQotCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JfQorICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfQogCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGludCBkZWZsYXRlSW1wbChieXRlW10gYnVmLCBpbnQgb2ZmLAotCQkJaW50IG5ieXRlcywgbG9uZyBoYW5kbGUsIGludCBmbHVzaFBhcm0xKTsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgaW50IGRlZmxhdGVJbXBsKGJ5dGVbXSBidWYsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgbmJ5dGVzLCBsb25nIGhhbmRsZSwgaW50IGZsdXNoUGFybTEpOwogCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIHZvaWQgZW5kSW1wbChsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIHZvaWQgZW5kSW1wbChsb25nIGhhbmRsZSk7CiAKLQkvKioKLQkgKiBGcmVlcyBhbGwgcmVzb3VyY2VzIGhlbGQgb250byBieSB0aGlzIERlZmxhdGVyLiBBbnkgdW51c2VkIGlucHV0IG9yIG91dHB1dAotCSAqIGlzIGRpc2NhcmRlZC4gVGhpcyBpcyBhbHNvIGNhbGxlZCBmcm9tIHRoZSBmaW5hbGl6ZSBtZXRob2QuCi0JICogCi0JICogQHNlZSAjZmluYWxpemUKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5kKCkgewotCQlpZiAoc3RyZWFtSGFuZGxlICE9IC0xKSB7Ci0JCQllbmRJbXBsKHN0cmVhbUhhbmRsZSk7Ci0JCQlpbnB1dEJ1ZmZlciA9IG51bGw7Ci0JCQlzdHJlYW1IYW5kbGUgPSAtMTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBGcmVlcyBhbGwgcmVzb3VyY2VzIGhlbGQgb250byBieSB0aGlzIGRlZmxhdGluZyBhbGdvcml0aG0uIEFueSB1bnVzZWQKKyAgICAgKiBpbnB1dCBvciBvdXRwdXQgaXMgZGlzY2FyZGVkLiBXaGlsZSB0aGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHtAY29kZQorICAgICAqIGZpbmFsaXplKCl9LCBpdCBjYW4gYmUgY2FsbGVkIGV4cGxpY2l0bHkgaW4gb3JkZXIgdG8gZnJlZSBuYXRpdmUKKyAgICAgKiByZXNvdXJjZXMgYmVmb3JlIHRoZSBuZXh0IEdDIGN5Y2xlLiBBZnRlciB7QGNvZGUgZW5kKCl9IHdhcyBjYWxsZWQgb3RoZXIKKyAgICAgKiBtZXRob2RzIHdpbGwgdHlwaWNhbGx5IHRocm93IGFuIHtAY29kZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbmQoKSB7CisgICAgICAgIGlmIChzdHJlYW1IYW5kbGUgIT0gLTEpIHsKKyAgICAgICAgICAgIGVuZEltcGwoc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmVhbUhhbmRsZSA9IC0xOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0JCWVuZCgpOwotCX0KKyAgICAgICAgZW5kKCk7CisgICAgfQogCi0JLyoqCi0JICogSW5kaWNhdGVzIHRvIHRoZSBEZWZsYXRlciB0aGF0IGFsbCB1bmNvbXByZXNzZWQgaW5wdXQgaGFzIGJlZW4gcHJvdmlkZWQKLQkgKiB0byBpdC4KLQkgKiAKLQkgKiBAc2VlICNmaW5pc2hlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmaW5pc2goKSB7Ci0JCWZsdXNoUGFybSA9IFpfRklOSVNIOwotCX0KKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdG8gdGhlIHtAY29kZSBEZWZsYXRlcn0gdGhhdCBhbGwgdW5jb21wcmVzc2VkIGlucHV0IGhhcyBiZWVuIHByb3ZpZGVkCisgICAgICogdG8gaXQuCisgICAgICogCisgICAgICogQHNlZSAjZmluaXNoZWQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmluaXNoKCkgeworICAgICAgICBmbHVzaFBhcm0gPSBaX0ZJTklTSDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFsbCBwcm92aWRlZCBkYXRhIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQotCSAqIGNvbXByZXNzZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGFsbCBkYXRhIGhhcyBiZWVuIGNvbXByZXNzZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBmaW5pc2hlZCgpIHsKLQkJcmV0dXJuIGZpbmlzaGVkOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFsbCBwcm92aWRlZCBkYXRhIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICAgICAqIGNvbXByZXNzZWQuCisgICAgICogCisgICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBkYXRhIGhhcyBiZWVuIGNvbXByZXNzZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZmluaXNoZWQoKSB7CisgICAgICAgIHJldHVybiBmaW5pc2hlZDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBZGxlcjMyIGNoZWNrc3VtIG9mIHVuY29tcHJlc3NlZCBkYXRhIGN1cnJlbnRseSByZWFkLiBJZiBhCi0JICogcHJlc2V0IGRpY3Rpb25hcnkgaXMgdXNlZCBnZXRBZGxlcigpIHdpbGwgcmV0dXJuIHRoZSBBZGxlcjMyIGNoZWNrc3VtIG9mCi0JICogdGhlIGRpY3Rpb25hcnkgdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBBZGxlcjMyIGNoZWNrc3VtIG9mIHVuY29tcHJlc3NlZCBkYXRhIG9yIHByZXNldCBkaWN0aW9uYXJ5IGlmCi0JICogICAgICAgICB1c2VkCi0JICogCi0JICogQHNlZSAjc2V0RGljdGlvbmFyeShieXRlW10pCi0JICogQHNlZSAjc2V0RGljdGlvbmFyeShieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEFkbGVyKCkgewotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQWRsZXIzMiBjaGVja3N1bSBvZiB1bmNvbXByZXNzZWQgZGF0YSBjdXJyZW50bHkgcmVhZC4gSWYgYQorICAgICAqIHByZXNldCBkaWN0aW9uYXJ5IGlzIHVzZWQgZ2V0QWRsZXIoKSB3aWxsIHJldHVybiB0aGUgQWRsZXIzMiBjaGVja3N1bSBvZgorICAgICAqIHRoZSBkaWN0aW9uYXJ5IHVzZWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgQWRsZXIzMiBjaGVja3N1bSBvZiB1bmNvbXByZXNzZWQgZGF0YSBvciBwcmVzZXQgZGljdGlvbmFyeSBpZgorICAgICAqICAgICAgICAgdXNlZC4KKyAgICAgKiBAc2VlICNzZXREaWN0aW9uYXJ5KGJ5dGVbXSkKKyAgICAgKiBAc2VlICNzZXREaWN0aW9uYXJ5KGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0QWRsZXIoKSB7CisgICAgICAgIGlmIChzdHJlYW1IYW5kbGUgPT0gLTEpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQogCi0JCXJldHVybiBnZXRBZGxlckltcGwoc3RyZWFtSGFuZGxlKTsKLQl9CisgICAgICAgIHJldHVybiBnZXRBZGxlckltcGwoc3RyZWFtSGFuZGxlKTsKKyAgICB9CiAKLQlwcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgaW50IGdldEFkbGVySW1wbChsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGludCBnZXRBZGxlckltcGwobG9uZyBoYW5kbGUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG9mIGlucHV0IGNvbnN1bWVkIGJ5IHRoZSBkZWZsYXRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBvZiBpbnB1dCByZWFkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRvdGFsSW4oKSB7Ci0JCWlmIChzdHJlYW1IYW5kbGUgPT0gLTEpIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgaW5wdXQgY29uc3VtZWQgYnkgdGhlIHtAY29kZSBEZWZsYXRlcn0uCisgICAgICogCisgICAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgb2YgaW5wdXQgcmVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUb3RhbEluKCkgeworICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAotCQlyZXR1cm4gKGludClnZXRUb3RhbEluSW1wbChzdHJlYW1IYW5kbGUpOwotCX0KKyAgICAgICAgcmV0dXJuIChpbnQpZ2V0VG90YWxJbkltcGwoc3RyZWFtSGFuZGxlKTsKKyAgICB9CiAKLQlwcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgbG9uZyBnZXRUb3RhbEluSW1wbChsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGxvbmcgZ2V0VG90YWxJbkltcGwobG9uZyBoYW5kbGUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXByZXNzZWQgYnl0ZXMgb3V0cHV0IGJ5IHRoaXMgRGVmbGF0ZXIuCi0JICogCi0JICogQHJldHVybiBudW1iZXIgb2YgY29tcHJlc3NlZCBieXRlcyBvdXRwdXQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0VG90YWxPdXQoKSB7Ci0JCWlmIChzdHJlYW1IYW5kbGUgPT0gLTEpIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tcHJlc3NlZCBieXRlcyBvdXRwdXQgYnkgdGhpcyB7QGNvZGUgRGVmbGF0ZXJ9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGNvbXByZXNzZWQgYnl0ZXMgb3V0cHV0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRvdGFsT3V0KCkgeworICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAotCQlyZXR1cm4gKGludClnZXRUb3RhbE91dEltcGwoc3RyZWFtSGFuZGxlKTsKLQl9CisgICAgICAgIHJldHVybiAoaW50KWdldFRvdGFsT3V0SW1wbChzdHJlYW1IYW5kbGUpOworICAgIH0KIAotCXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSBsb25nIGdldFRvdGFsT3V0SW1wbChsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGxvbmcgZ2V0VG90YWxPdXRJbXBsKGxvbmcgaGFuZGxlKTsKIAotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbGwgYnl0ZXMgb2YgdW5jb21wcmVzc2VkIGlucHV0IGhhdmUgYmVlbgotCSAqIGNvbnN1bWVkIGJ5IHRoZSBEZWZsYXRlci4gSWYgbmVlZHNJbnB1dCgpIHJldHVybnMgdHJ1ZSBzZXRJbnB1dCgpIG11c3QgYmUKLQkgKiBjYWxsZWQgYmVmb3JlIGRlZmxhdGlvbiBjYW4gY29udGludWUuIElmIGFsbCBieXRlcyBvZiB1bmNvbXByZXNzZWQgZGF0YQotCSAqIGhhdmUgYmVlbiBwcm92aWRlZCB0byB0aGUgRGVmbGF0ZXIgZmluaXNoKCkgbXVzdCBiZSBjYWxsZWQgdG8gZW5zdXJlIHRoZQotCSAqIGNvbXByZXNzZWQgZGF0YSBpcyBvdXRwdXQuCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIGlucHV0IGlzIHJlcXVpcmVkIGZvciBkZWZsYXRpb24gdG8gY29udGludWUsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UKLQkgKiBAc2VlICNmaW5pc2hlZCgpCi0JICogQHNlZSAjc2V0SW5wdXQoYnl0ZVtdKQotCSAqIEBzZWUgI3NldElucHV0KGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG5lZWRzSW5wdXQoKSB7Ci0JCWlmIChpbnB1dEJ1ZmZlciA9PSBudWxsKSB7CisgICAgLyoqCisgICAgICogQ291bnRlcnBhcnQgdG8gc2V0SW5wdXQoKS4gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGFsbCBieXRlcyBvZgorICAgICAqIHVuY29tcHJlc3NlZCBpbnB1dCBoYXZlIGJlZW4gY29uc3VtZWQgYnkgdGhlIHtAY29kZSBEZWZsYXRlcn0uIElmIG5lZWRzSW5wdXQoKQorICAgICAqIHJldHVybnMgdHJ1ZSBzZXRJbnB1dCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZWZsYXRpb24gY2FuIGNvbnRpbnVlLiBJZgorICAgICAqIGFsbCBieXRlcyBvZiB1bmNvbXByZXNzZWQgZGF0YSBoYXZlIGJlZW4gcHJvdmlkZWQgdG8gdGhlIHtAY29kZSBEZWZsYXRlcn0KKyAgICAgKiBmaW5pc2goKSBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyBvdXRwdXQuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgaW5wdXQgaXMgcmVxdWlyZWQgZm9yIGRlZmxhdGlvbiB0byBjb250aW51ZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI2ZpbmlzaGVkKCkKKyAgICAgKiBAc2VlICNzZXRJbnB1dChieXRlW10pCisgICAgICogQHNlZSAjc2V0SW5wdXQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbmVlZHNJbnB1dCgpIHsKKyAgICAgICAgaWYgKGlucHV0QnVmZmVyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0JCXJldHVybiBpblJlYWQgPT0gaW5MZW5ndGg7Ci0JfQorICAgICAgICByZXR1cm4gaW5SZWFkID09IGluTGVuZ3RoOworICAgIH0KIAotCS8qKgotCSAqIFJlc2V0cyB0aGUgPGNvZGU+RGVmbGF0ZXI8L2NvZGU+IHRvIGFjY2VwdCBuZXcgaW5wdXQgd2l0aG91dCBhZmZlY3RpbmcKLQkgKiBhbnkgcHJldmlvdXNseSBtYWRlIHNldHRpbmdzIGZvciB0aGUgY29tcHJlc3Npb24gc3RyYXRlZ3kgb3IgbGV2ZWwuIFRoaXMKLQkgKiBvcGVyYXRpb24gPGk+bXVzdDwvaT4gYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmZpbmlzaGVkKCk8L2NvZGU+IHJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+RGVmbGF0ZXI8L2NvZGU+IGlzIHRvIGJlIHJldXNlZC4KLQkgKiAKLQkgKiBAc2VlICNmaW5pc2hlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHsKLQkJaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgeworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUge0Bjb2RlIERlZmxhdGVyfSB0byBhY2NlcHQgbmV3IGlucHV0IHdpdGhvdXQgYWZmZWN0aW5nIGFueQorICAgICAqIHByZXZpb3VzbHkgbWFkZSBzZXR0aW5ncyBmb3IgdGhlIGNvbXByZXNzaW9uIHN0cmF0ZWd5IG9yIGxldmVsLiBUaGlzCisgICAgICogb3BlcmF0aW9uIDxpPm11c3Q8L2k+IGJlIGNhbGxlZCBhZnRlciB7QGNvZGUgZmluaXNoZWQoKX0gcmV0dXJucworICAgICAqIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIERlZmxhdGVyfSBpcyB0byBiZSByZXVzZWQuCisgICAgICogCisgICAgICogQHNlZSAjZmluaXNoZWQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGlmIChzdHJlYW1IYW5kbGUgPT0gLTEpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICB9CiAKLQkJZmx1c2hQYXJtID0gWl9OT19GTFVTSDsKLQkJZmluaXNoZWQgPSBmYWxzZTsKLQkJcmVzZXRJbXBsKHN0cmVhbUhhbmRsZSk7Ci0JCWlucHV0QnVmZmVyID0gbnVsbDsKLQl9CisgICAgICAgIGZsdXNoUGFybSA9IFpfTk9fRkxVU0g7CisgICAgICAgIGZpbmlzaGVkID0gZmFsc2U7CisgICAgICAgIHJlc2V0SW1wbChzdHJlYW1IYW5kbGUpOworICAgICAgICBpbnB1dEJ1ZmZlciA9IG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIHZvaWQgcmVzZXRJbXBsKGxvbmcgaGFuZGxlKTsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCByZXNldEltcGwobG9uZyBoYW5kbGUpOwogCi0JcHVibGljIHZvaWQgc2V0RGljdGlvbmFyeShieXRlW10gYnVmKSB7Ci0JCXNldERpY3Rpb25hcnkoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGljdGlvbmFyeSB0byBiZSB1c2VkIGZvciBjb21wcmVzc2lvbiBieSB0aGlzIHtAY29kZSBEZWZsYXRlcn0uCisgICAgICogc2V0RGljdGlvbmFyeSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGlzIHtAY29kZSBEZWZsYXRlcn0gc3VwcG9ydHMgdGhlIHdyaXRpbmcKKyAgICAgKiBvZiBaTElCIGhlYWRlcnMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbgorICAgICAqIHVzaW5nIHtAY29kZSBEZWZsYXRlcihpbnQsIGJvb2xlYW4pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRpY3Rpb25hcnkgZGF0YSBieXRlcy4KKyAgICAgKiBAc2VlIERlZmxhdGVyI0RlZmxhdGVyKGludCwgYm9vbGVhbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWN0aW9uYXJ5KGJ5dGVbXSBidWYpIHsKKyAgICAgICAgc2V0RGljdGlvbmFyeShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdGhlIGRpY3Rpb25hcnkgdG8gYmUgdXNlZCBmb3IgY29tcHJlc3Npb24gYnkgdGhpcyBEZWZsYXRlci4KLQkgKiBzZXREaWN0aW9uYXJ5KCkgY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgRGVmbGF0ZXIgc3VwcG9ydHMgdGhlIHdyaXRpbmcKLQkgKiBvZiBaTElCIGhlYWRlcnMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbgotCSAqIHVzaW5nIERlZmxhdGVyKGludCwgYm9vbGVhbikuCi0JICogCi0JICogQHNlZSBEZWZsYXRlciNEZWZsYXRlcihpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldERpY3Rpb25hcnkoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykgewotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGljdGlvbmFyeSB0byBiZSB1c2VkIGZvciBjb21wcmVzc2lvbiBieSB0aGlzIHtAY29kZSBEZWZsYXRlcn0uCisgICAgICogc2V0RGljdGlvbmFyeSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGlzIHtAY29kZSBEZWZsYXRlcn0gc3VwcG9ydHMgdGhlIHdyaXRpbmcKKyAgICAgKiBvZiBaTElCIGhlYWRlcnMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbgorICAgICAqIHVzaW5nIHtAY29kZSBEZWZsYXRlcihpbnQsIGJvb2xlYW4pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRpY3Rpb25hcnkgZGF0YSBieXRlcy4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBuYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuCisgICAgICogQHNlZSBEZWZsYXRlciNEZWZsYXRlcihpbnQsIGJvb2xlYW4pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldERpY3Rpb25hcnkoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykgeworICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQkJLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgotCQlpZiAob2ZmIDw9IGJ1Zi5sZW5ndGggJiYgbmJ5dGVzID49IDAgJiYgb2ZmID49IDAKLQkJCQkmJiBidWYubGVuZ3RoIC0gb2ZmID49IG5ieXRlcykgeworICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3csIGNoZWNrIG51bGwgYnVmCisgICAgICAgIGlmIChvZmYgPD0gYnVmLmxlbmd0aCAmJiBuYnl0ZXMgPj0gMCAmJiBvZmYgPj0gMAorICAgICAgICAgICAgICAgICYmIGJ1Zi5sZW5ndGggLSBvZmYgPj0gbmJ5dGVzKSB7CiAgICAgICAgICAgICBzZXREaWN0aW9uYXJ5SW1wbChidWYsIG9mZiwgbmJ5dGVzLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JfQorICAgIH0KIAotCXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSB2b2lkIHNldERpY3Rpb25hcnlJbXBsKGJ5dGVbXSBidWYsIGludCBvZmYsCi0JCQlpbnQgbmJ5dGVzLCBsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIHZvaWQgc2V0RGljdGlvbmFyeUltcGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBuYnl0ZXMsIGxvbmcgaGFuZGxlKTsKIAotCS8qKgotCSAqIFNldHMgdGhlIGlucHV0IGJ1ZmZlciB0aGUgRGVmbGF0ZXIgd2lsbCB1c2UgdG8gZXh0cmFjdCB1bmNvbXByZXNzZWQgYnl0ZXMKLQkgKiBmb3IgbGF0ZXIgY29tcHJlc3Npb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoYnl0ZVtdIGJ1ZikgewotCQlzZXRJbnB1dChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbnB1dCBidWZmZXIgdGhlIHtAY29kZSBEZWZsYXRlcn0gd2lsbCB1c2UgdG8gZXh0cmFjdCB1bmNvbXByZXNzZWQgYnl0ZXMKKyAgICAgKiBmb3IgbGF0ZXIgY29tcHJlc3Npb24uCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChieXRlW10gYnVmKSB7CisgICAgICAgIHNldElucHV0KGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgaW5wdXQgYnVmZmVyIHRoZSBEZWZsYXRlciB3aWxsIHVzZSB0byBleHRyYWN0IHVuY29tcHJlc3NlZCBieXRlcwotCSAqIGZvciBsYXRlciBjb21wcmVzc2lvbi4gSW5wdXQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBidWZmZXIgcmVnaW9uCi0JICogc3RhcnRpbmcgYXQgb2ZmIGFuZCBlbmRpbmcgYXQgbmJ5dGVzIC0gMS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5wdXQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykgewotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaW5wdXQgYnVmZmVyIHRoZSB7QGNvZGUgRGVmbGF0ZXJ9IHdpbGwgdXNlIHRvIGV4dHJhY3QgdW5jb21wcmVzc2VkIGJ5dGVzCisgICAgICogZm9yIGxhdGVyIGNvbXByZXNzaW9uLiBJbnB1dCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIGJ1ZmZlciByZWdpb24KKyAgICAgKiBzdGFydGluZyBhdCBvZmYgYW5kIGVuZGluZyBhdCBuYnl0ZXMgLSAxLgorICAgICAqIAorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgaW5wdXQgZGF0YSBieXRlcy4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBuYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElucHV0KGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMpIHsKKyAgICAgICAgaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCS8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKLQkJaWYgKG9mZiA8PSBidWYubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCi0JCQkJJiYgYnVmLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKLQkJCWluTGVuZ3RoID0gbmJ5dGVzOwotCQkJaW5SZWFkID0gMDsKLQkJCWlmIChpbnB1dEJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKKyAgICAgICAgaWYgKG9mZiA8PSBidWYubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKKyAgICAgICAgICAgIGluTGVuZ3RoID0gbmJ5dGVzOworICAgICAgICAgICAgaW5SZWFkID0gMDsKKyAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc2V0TGV2ZWxzSW1wbChjb21wcmVzc0xldmVsLCBzdHJhdGVneSwgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgICAgIH0KLQkJCWlucHV0QnVmZmVyID0gYnVmOwotCQkJc2V0SW5wdXRJbXBsKGJ1Ziwgb2ZmLCBuYnl0ZXMsIHN0cmVhbUhhbmRsZSk7Ci0JCX0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IGJ1ZjsKKyAgICAgICAgICAgIHNldElucHV0SW1wbChidWYsIG9mZiwgbmJ5dGVzLCBzdHJlYW1IYW5kbGUpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JfQorICAgIH0KIAotCXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSB2b2lkIHNldExldmVsc0ltcGwoaW50IGxldmVsLCBpbnQgc3RyYXRlZ3ksCi0JCQlsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIHZvaWQgc2V0TGV2ZWxzSW1wbChpbnQgbGV2ZWwsIGludCBzdHJhdGVneSwKKyAgICAgICAgICAgIGxvbmcgaGFuZGxlKTsKIAotCXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSB2b2lkIHNldElucHV0SW1wbChieXRlW10gYnVmLCBpbnQgb2ZmLAotCQkJaW50IG5ieXRlcywgbG9uZyBoYW5kbGUpOworICAgIHByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSB2b2lkIHNldElucHV0SW1wbChieXRlW10gYnVmLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IG5ieXRlcywgbG9uZyBoYW5kbGUpOwogCi0JLyoqCi0JICogU2V0cyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCB3aGVuIGNvbXByZXNzaW5nIGRhdGEuIFRoZQotCSAqIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDkuIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQKLQkgKiBwcmlvciB0byBjYWxsaW5nIHNldElucHV0KCkuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2UKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBpbnZhbGlkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRMZXZlbChpbnQgbGV2ZWwpIHsKLQkJaWYgKGxldmVsIDwgREVGQVVMVF9DT01QUkVTU0lPTiB8fCBsZXZlbCA+IEJFU1RfQ09NUFJFU1NJT04pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCQlpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0JCWNvbXByZXNzTGV2ZWwgPSBsZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBzdHJhdGVneSB0byBiZSB1c2VkLiBUaGUgc3RyYXRlZ3kgbXVzdCBiZSBvbmUgb2YKLQkgKiBGSUxURVJFRCwgSFVGRk1BTl9PTkxZIG9yIERFRkFVTFRfU1RSQVRFR1kuVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBwcmlvcgotCSAqIHRvIGNhbGxpbmcgc2V0SW5wdXQoKS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIGNvbXByZXNzaW9uIHN0cmF0ZWd5IHRvIHVzZQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIHN0cmF0ZWd5IHNwZWNpZmllZCBpcyBub3Qgb25lIG9mIEZJTFRFUkVELAotCSAqICAgICAgICAgICAgICAgIEhVRkZNQU5fT05MWSBvciBERUZBVUxUX1NUUkFURUdZLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdHJhdGVneShpbnQgc3RyYXRlZ3kpIHsKLQkJaWYgKHN0cmF0ZWd5IDwgREVGQVVMVF9TVFJBVEVHWSB8fCBzdHJhdGVneSA+IEhVRkZNQU5fT05MWSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0JCWlmIChpbnB1dEJ1ZmZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQkJdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwotCX0KLQkKICAgICAvKioKLQkgKiBSZXR1cm5zIGEgbG9uZyBpbnQgb2YgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgdGhlIERlZmxhdGVyLiBUaGlzCi0JICogbWV0aG9kIHBlcmZvcm1zIHRoZSBzYW1lIGFzIGdldFRvdGFsSW4gZXhjZXB0IGl0IHJldHVybnMgYSBsb25nIHZhbHVlCi0JICogaW5zdGVhZCBvZiBhbiBpbnRlZ2VyCi0JICogCi0JICogQHJldHVybiBieXRlcyBleGFjdGx5IHJlYWQgYnkgZGVmbGF0ZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZXNSZWFkKCkgewotCQkvLyBUaHJvdyBOUEUgaGVyZQotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgICogU2V0cyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCB3aGVuIGNvbXByZXNzaW5nIGRhdGEuIFRoZQorICAgICAqIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDkuIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQKKyAgICAgKiBwcmlvciB0byBjYWxsaW5nIHNldElucHV0KCkuCisgICAgICogCisgICAgICogQHBhcmFtIGxldmVsCisgICAgICogICAgICAgICAgICBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2UKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICAgICAgaWYgKGxldmVsIDwgREVGQVVMVF9DT01QUkVTU0lPTiB8fCBsZXZlbCA+IEJFU1RfQ09NUFJFU1NJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGNvbXByZXNzTGV2ZWwgPSBsZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBzdHJhdGVneSB0byBiZSB1c2VkLiBUaGUgc3RyYXRlZ3kgbXVzdCBiZSBvbmUgb2YKKyAgICAgKiBGSUxURVJFRCwgSFVGRk1BTl9PTkxZIG9yIERFRkFVTFRfU1RSQVRFR1kuVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBwcmlvcgorICAgICAqIHRvIGNhbGxpbmcgc2V0SW5wdXQoKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyYXRlZ3kKKyAgICAgKiAgICAgICAgICAgIGNvbXByZXNzaW9uIHN0cmF0ZWd5IHRvIHVzZQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgSWYgdGhlIHN0cmF0ZWd5IHNwZWNpZmllZCBpcyBub3Qgb25lIG9mIEZJTFRFUkVELAorICAgICAqICAgICAgICAgICAgICAgIEhVRkZNQU5fT05MWSBvciBERUZBVUxUX1NUUkFURUdZLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdHJhdGVneShpbnQgc3RyYXRlZ3kpIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5IDwgREVGQVVMVF9TVFJBVEVHWSB8fCBzdHJhdGVneSA+IEhVRkZNQU5fT05MWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dEJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbG9uZyBpbnQgb2YgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgdGhlIHtAY29kZSBEZWZsYXRlcn0uIFRoaXMKKyAgICAgKiBtZXRob2QgcGVyZm9ybXMgdGhlIHNhbWUgYXMge0Bjb2RlIGdldFRvdGFsSW59IGV4Y2VwdCBpdCByZXR1cm5zIGEgbG9uZyB2YWx1ZQorICAgICAqIGluc3RlYWQgb2YgYW4gaW50ZWdlcgorICAgICAqIAorICAgICAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkge0Bjb2RlIERlZmxhdGVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZXNSZWFkKCkgeworICAgICAgICAvLyBUaHJvdyBOUEUgaGVyZQorICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQotCQlyZXR1cm4gZ2V0VG90YWxJbkltcGwoc3RyZWFtSGFuZGxlKTsKLQl9CisgICAgICAgIHJldHVybiBnZXRUb3RhbEluSW1wbChzdHJlYW1IYW5kbGUpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgYSBsb25nIGludCBvZiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgcmVhZCBieSB0aGUgRGVmbGF0ZXIuIFRoaXMKLQkgKiBtZXRob2QgcGVyZm9ybXMgdGhlIHNhbWUgYXMgZ2V0VG90YWxPdXQgZXhjZXB0IGl0IHJldHVybnMgYSBsb25nIHZhbHVlCi0JICogaW5zdGVhZCBvZiBhbiBpbnRlZ2VyCi0JICogCi0JICogQHJldHVybiBieXRlcyBleGFjdGx5IHdyaXRlIGJ5IGRlZmxhdGVyCi0JICovCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxvbmcgaW50IG9mIHRvdGFsIG51bWJlciBvZiBieXRlcyBvZiByZWFkIGJ5IHRoZSB7QGNvZGUgRGVmbGF0ZXJ9LiBUaGlzCisgICAgICogbWV0aG9kIHBlcmZvcm1zIHRoZSBzYW1lIGFzIHtAY29kZSBnZXRUb3RhbE91dH0gZXhjZXB0IGl0IHJldHVybnMgYSBsb25nCisgICAgICogdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyCisgICAgICogCisgICAgICogQHJldHVybiBieXRlcyBleGFjdGx5IHdyaXRlIGJ5IHtAY29kZSBEZWZsYXRlcn0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZXNXcml0dGVuKCkgewogICAgICAgICAvLyBUaHJvdyBOUEUgaGVyZQogICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CkBAIC00MjgsNSArNTI5LDUgQEAKICAgICAgICAgcmV0dXJuIGdldFRvdGFsT3V0SW1wbChzdHJlYW1IYW5kbGUpOwogICAgIH0KIAotCXByaXZhdGUgbmF0aXZlIGxvbmcgY3JlYXRlU3RyZWFtKGludCBsZXZlbCwgaW50IHN0cmF0ZWd5MSwgYm9vbGVhbiBub0hlYWRlcjEpOworICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgY3JlYXRlU3RyZWFtKGludCBsZXZlbCwgaW50IHN0cmF0ZWd5MSwgYm9vbGVhbiBub0hlYWRlcjEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGVmbGF0ZXJPdXRwdXRTdHJlYW0uamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0RlZmxhdGVyT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNzJhNDFjZC4uNzczZTRjNCAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGVmbGF0ZXJPdXRwdXRTdHJlYW0uamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbS5qYXZhCkBAIC0yNSwxNTkgKzI1LDE4NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gY2xhc3MgaW1wbGVtZW50cyBhIHN0cmVhbSBmaWx0ZXIgZm9yIHRoZSB3cml0aW5nIG9mCi0gKiBjb21wcmVzc2VkIGRhdGEgdG8gYSBzdHJlYW0uIENvbXByZXNzaW9uIGlzIHBlcmZvcm1lZCBieSBhbiBpbnN0YW5jZSBvZgotICogRGVmbGF0ZXIuCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHtAY29kZSBGaWx0ZXJPdXRwdXRTdHJlYW19IHRoYXQKKyAqIGNvbXByZXNzZXMgZGF0YSB1c2luZyB0aGUgPGk+REVGTEFURTwvaT4gYWxnb3JpdGhtLiBCYXNpY2FsbHkgaXQgd3JhcHMgdGhlCisgKiB7QGNvZGUgRGVmbGF0ZXJ9IGNsYXNzIGFuZCB0YWtlcyBjYXJlIG9mIHRoZSBidWZmZXJpbmcuCisgKiAKKyAqIEBzZWUgRGVmbGF0ZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0gewotCXN0YXRpYyBmaW5hbCBpbnQgQlVGX1NJWkUgPSA1MTI7CisgICAgc3RhdGljIGZpbmFsIGludCBCVUZfU0laRSA9IDUxMjsKIAotCXByb3RlY3RlZCBieXRlW10gYnVmOworICAgIC8qKgorICAgICAqIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWY7CiAKLQlwcm90ZWN0ZWQgRGVmbGF0ZXIgZGVmOworICAgIC8qKgorICAgICAqIFRoZSBkZWZsYXRlciB1c2VkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHByb3RlY3RlZCBEZWZsYXRlciBkZWY7CiAKLQlib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gaW5zdGFuY2UgdXNpbmcgb3MgYXMgdGhlIHVuZGVybHlpbmcKLQkgKiBzdHJlYW0uIFRoZSBwcm92aWRlZCBEZWZsYXRlciBpbnN0YW5jZSB3aWxsIGJlIHVzZWQgdG8gY29tcHJlc3MgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiAgICAgICAgICAgIE91dHB1dFN0cmVhbSB0byByZWNlaXZlIGNvbXByZXNzZWQgZGF0YQotCSAqIEBwYXJhbSBkZWYKLQkgKiAgICAgICAgICAgIERlZmxhdGVyIHRvIHBlcmZvcm0gY29tcHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgRGVmbGF0ZXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zLCBEZWZsYXRlciBkZWYpIHsKLQkJdGhpcyhvcywgZGVmLCBCVUZfU0laRSk7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgbGV0cyB5b3UgcGFzcyB0aGUge0Bjb2RlIERlZmxhdGVyfSBzcGVjaWZ5aW5nIHRoZQorICAgICAqIGNvbXByZXNzaW9uIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3MKKyAgICAgKiAgICAgICAgICAgIGlzIHRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfSB3aGVyZSB0byB3cml0ZSB0aGUgY29tcHJlc3NlZCBkYXRhCisgICAgICogICAgICAgICAgICB0by4KKyAgICAgKiBAcGFyYW0gZGVmCisgICAgICogICAgICAgICAgICBpcyB0aGUgc3BlY2lmaWMge0Bjb2RlIERlZmxhdGVyfSB0aGF0IGlzIHVzZWQgdG8gY29tcHJlc3MKKyAgICAgKiAgICAgICAgICAgIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIERlZmxhdGVyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcywgRGVmbGF0ZXIgZGVmKSB7CisgICAgICAgIHRoaXMob3MsIGRlZiwgQlVGX1NJWkUpOworICAgIH0KIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gaW5zdGFuY2UgdXNpbmcgb3MgYXMgdGhlIHVuZGVybHlpbmcKLQkgKiBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIG9zCi0JICogICAgICAgICAgICBPdXRwdXRTdHJlYW0gdG8gcmVjZWl2ZSBjb21wcmVzc2VkIGRhdGEKLQkgKi8KLQlwdWJsaWMgRGVmbGF0ZXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB7Ci0JCXRoaXMob3MsIG5ldyBEZWZsYXRlcigpKTsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBjb25zdHJ1Y3Rvci4gWW91IG9ubHkgbmVlZCB0byBwYXNzIHRoZSB7QGNvZGUKKyAgICAgKiBPdXRwdXRTdHJlYW19IHRvIHdoaWNoIHRoZSBjb21wcmVzc2VkIGRhdGEgc2hhbGwgYmUgd3JpdHRlbiB0by4gVGhlCisgICAgICogZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIHtAY29kZSBEZWZsYXRlcn0gYW5kIGludGVybmFsIGJ1ZmZlciBhcmUgdXNlZC4KKyAgICAgKiBJbiBwYXJ0aWN1bGFyIHRoZSB7QGNvZGUgRGVmbGF0ZXJ9IHByb2R1Y2VzIGEgWkxJQiBoZWFkZXIgaW4gdGhlIG91dHB1dAorICAgICAqIHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3MKKyAgICAgKiAgICAgICAgICAgIGlzIHRoZSBPdXRwdXRTdHJlYW0gd2hlcmUgdG8gd3JpdGUgdGhlIGNvbXByZXNzZWQgZGF0YSB0by4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgRGVmbGF0ZXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgICAgIHRoaXMob3MsIG5ldyBEZWZsYXRlcigpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IERlZmxhdGVyT3V0cHV0U3RyZWFtIGluc3RhbmNlIHVzaW5nIG9zIGFzIHRoZSB1bmRlcmx5aW5nCi0JICogc3RyZWFtLiBUaGUgcHJvdmlkZWQgRGVmbGF0ZXIgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkIHRvIGNvbXByZXNzIGRhdGEuIFRoZQotCSAqIGludGVybmFsIGJ1ZmZlciBmb3Igc3RvcmluZyBjb21wcmVzc2VkIGRhdGEgd2lsbCBiZSBvZiBzaXplIGJzaXplLgotCSAqIAotCSAqIEBwYXJhbSBvcwotCSAqICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHRvIHJlY2VpdmUgY29tcHJlc3NlZCBkYXRhCi0JICogQHBhcmFtIGRlZgotCSAqICAgICAgICAgICAgRGVmbGF0ZXIgdG8gcGVyZm9ybSBjb21wcmVzc2lvbgotCSAqIEBwYXJhbSBic2l6ZQotCSAqICAgICAgICAgICAgc2l6ZSBvZiBpbnRlcm5hbCBjb21wcmVzc2lvbiBidWZmZXIKLQkgKi8KLQlwdWJsaWMgRGVmbGF0ZXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zLCBEZWZsYXRlciBkZWYsIGludCBic2l6ZSkgewotCQlzdXBlcihvcyk7Ci0JCWlmIChvcyA9PSBudWxsIHx8IGRlZiA9PSBudWxsKSB7CisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBsZXRzIHlvdSBzcGVjaWZ5IGJvdGggdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBhcyB3ZWxsCisgICAgICogYXMgdGhlIGludGVybmFsIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9zCisgICAgICogICAgICAgICAgICBpcyB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gd2hlcmUgdG8gd3JpdGUgdGhlIGNvbXByZXNzZWQgZGF0YQorICAgICAqICAgICAgICAgICAgdG8uCisgICAgICogQHBhcmFtIGRlZgorICAgICAqICAgICAgICAgICAgaXMgdGhlIHNwZWNpZmljIHtAY29kZSBEZWZsYXRlcn0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tcHJlc3MKKyAgICAgKiAgICAgICAgICAgIGRhdGEuCisgICAgICogQHBhcmFtIGJzaXplCisgICAgICogICAgICAgICAgICBpcyB0aGUgc2l6ZSB0byBiZSB1c2VkIGZvciB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBEZWZsYXRlck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIERlZmxhdGVyIGRlZiwgaW50IGJzaXplKSB7CisgICAgICAgIHN1cGVyKG9zKTsKKyAgICAgICAgaWYgKG9zID09IG51bGwgfHwgZGVmID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCWlmIChic2l6ZSA8PSAwKSB7CisgICAgICAgIGlmIChic2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQkJdGhpcy5kZWYgPSBkZWY7Ci0JCWJ1ZiA9IG5ldyBieXRlW2JzaXplXTsKLQl9CisgICAgICAgIHRoaXMuZGVmID0gZGVmOworICAgICAgICBidWYgPSBuZXcgYnl0ZVtic2l6ZV07CisgICAgfQogCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIGRhdGEgaW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgd3JpdGUgaXQgdG8gdGhlIHVuZGVybHlpbmcKLQkgKiBzdHJlYW0uCi0JICogCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBkZWZsYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVmbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCB4ID0gMDsKLQkJZG8gewotCQkJeCA9IGRlZi5kZWZsYXRlKGJ1Zik7Ci0JCQlvdXQud3JpdGUoYnVmLCAwLCB4KTsKLQkJfSB3aGlsZSAoIWRlZi5uZWVkc0lucHV0KCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBDb21wcmVzcyB0aGUgZGF0YSBpbiB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3cml0ZSBpdCB0byB0aGUgdW5kZXJseWluZworICAgICAqIHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBkZWZsYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVmbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCB4ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgeCA9IGRlZi5kZWZsYXRlKGJ1Zik7CisgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCB4KTsKKyAgICAgICAgfSB3aGlsZSAoIWRlZi5uZWVkc0lucHV0KCkpOworICAgIH0KIAotCS8qKgotCSAqIFdyaXRlcyBhbnkgdW53cml0dGVuIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0sIHRoZSBjbG9zZXMKLQkgKiBhbGwgdW5kZXJseWluZyBzdHJlYW1zLiBUaGlzIHN0cmVhbSBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgYWZ0ZXIgY2xvc2UoKQotCSAqIGhhcyBiZWVuIGNhbGxlZC4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGNsb3NlLgotCSAqLwotCUBPdmVycmlkZQorICAgIC8qKgorICAgICAqIFdyaXRlcyBhbnkgdW53cml0dGVuIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0sIHRoZSBjbG9zZXMKKyAgICAgKiBhbGwgdW5kZXJseWluZyBzdHJlYW1zLiBUaGlzIHN0cmVhbSBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgYWZ0ZXIgY2xvc2UoKQorICAgICAqIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIGRhdGEgY29tcHJlc3Npb24KKyAgICAgKiAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFkZWYuZmluaXNoZWQoKSkgeworICAgICAgICBpZiAoIWRlZi5maW5pc2hlZCgpKSB7CiAgICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICAgfQotCQlkZWYuZW5kKCk7Ci0JCW91dC5jbG9zZSgpOwotCX0KKyAgICAgICAgZGVmLmVuZCgpOworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBXcml0ZSBhbnkgdW53cml0dGVuIGRhdGEgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiBEbyBub3QgY2xvc2UgdGhlCi0JICogc3RyZWFtLiBUaGlzIGFsbG93cyBzdWJzZXF1ZW50IERlZmxhdGVyJ3MgdG8gd3JpdGUgdG8gdGhlIHNhbWUgc3RyZWFtLgotCSAqIFRoaXMgRGVmbGF0ZXIgY2Fubm90IGJlIHVzZWQgYWdhaW4uCi0JICogCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChkb25lKSB7CisgICAgLyoqCisgICAgICogV3JpdGVzIGFueSB1bndyaXR0ZW4gZGF0YSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIERvZXMgbm90IGNsb3NlIHRoZQorICAgICAqIHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkb25lKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQkJZGVmLmZpbmlzaCgpOwotCQlpbnQgeCA9IDA7Ci0JCXdoaWxlICghZGVmLmZpbmlzaGVkKCkpIHsKLQkJCWlmIChkZWYubmVlZHNJbnB1dCgpKSB7CisgICAgICAgIGRlZi5maW5pc2goKTsKKyAgICAgICAgaW50IHggPSAwOworICAgICAgICB3aGlsZSAoIWRlZi5maW5pc2hlZCgpKSB7CisgICAgICAgICAgICBpZiAoZGVmLm5lZWRzSW5wdXQoKSkgewogICAgICAgICAgICAgICAgIGRlZi5zZXRJbnB1dChidWYsIDAsIDApOwogICAgICAgICAgICAgfQotCQkJeCA9IGRlZi5kZWZsYXRlKGJ1Zik7Ci0JCQlvdXQud3JpdGUoYnVmLCAwLCB4KTsKLQkJfQotCQlkb25lID0gdHJ1ZTsKLQl9CisgICAgICAgICAgICB4ID0gZGVmLmRlZmxhdGUoYnVmKTsKKyAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHgpOworICAgICAgICB9CisgICAgICAgIGRvbmUgPSB0cnVlOworICAgIH0KIAotCUBPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYiA9IG5ldyBieXRlWzFdOwotCQliWzBdID0gKGJ5dGUpIGk7Ci0JCXdyaXRlKGIsIDAsIDEpOwotCX0KKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgYlswXSA9IChieXRlKSBpOworICAgICAgICB3cml0ZShiLCAwLCAxKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDb21wcmVzcyBuYnl0ZXMgb2YgZGF0YSBmcm9tIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIHdyaXRlIGl0IHRvIHRoZQotCSAqIHVuZGVybHlpbmcgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiAgICAgICAgICAgIEJ1ZmZlciBvZiBkYXRhIHRvIGNvbXByZXNzCi0JICogQHBhcmFtIG9mZgotCSAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZmZlciB0byBleHRyYWN0IGRhdGEgZnJvbQotCSAqIEBwYXJhbSBuYnl0ZXMKLQkgKiAgICAgICAgICAgIE51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGNvbXByZXNzIGFuZCB3cml0ZQotCSAqIAotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgd3JpdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBDb21wcmVzc2VzIHtAY29kZSBuYnl0ZXN9IG9mIGRhdGEgZnJvbSB7QGNvZGUgYnVmfSBzdGFydGluZyBhdAorICAgICAqIHtAY29kZSBvZmZ9IGFuZCB3cml0ZXMgaXQgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgb2YgZGF0YSB0byBjb21wcmVzcy4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmZmVyIHRvIGV4dHJhY3QgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBuYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byByZWFkIGZyb20gdGhlIGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB3cml0aW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmYsIGludCBuYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChkb25lKSB7CisgICAgICAgIGlmIChkb25lKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjI2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLQkJLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgotCQlpZiAob2ZmIDw9IGJ1ZmZlci5sZW5ndGggJiYgbmJ5dGVzID49IDAgJiYgb2ZmID49IDAKLQkJCQkmJiBidWZmZXIubGVuZ3RoIC0gb2ZmID49IG5ieXRlcykgewotCQkJaWYgKCFkZWYubmVlZHNJbnB1dCgpKSB7CisgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKKyAgICAgICAgaWYgKG9mZiA8PSBidWZmZXIubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmZmVyLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKKyAgICAgICAgICAgIGlmICghZGVmLm5lZWRzSW5wdXQoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQotCQkJZGVmLnNldElucHV0KGJ1ZmZlciwgb2ZmLCBuYnl0ZXMpOwotCQkJZGVmbGF0ZSgpOwotCQl9IGVsc2UgeworICAgICAgICAgICAgZGVmLnNldElucHV0KGJ1ZmZlciwgb2ZmLCBuYnl0ZXMpOworICAgICAgICAgICAgZGVmbGF0ZSgpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbS5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtLmphdmEKaW5kZXggNDVjZmNlNC4uZmM3MGQ2MiAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtLmphdmEKQEAgLTI1LDExMyArMjUsMTI5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBHWklQSW5wdXRTdHJlYW0gY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgc3RvcmVkIGluIHRoZSBHWklQIGZvcm1hdC4KKyAqIFRoZSB7QGNvZGUgR1pJUElucHV0U3RyZWFtfSBjbGFzcyBpcyB1c2VkIHRvIHJlYWQgZGF0YSBzdG9yZWQgaW4gdGhlIEdaSVAKKyAqIGZvcm1hdCwgcmVhZGluZyBhbmQgZGVjb21wcmVzc2luZyBHWklQIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gaW50bworICogaXRzIGJ1ZmZlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBHWklQSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW0gewotCXByb3RlY3RlZCBDUkMzMiBjcmMgPSBuZXcgQ1JDMzIoKTsKIAotCXByb3RlY3RlZCBib29sZWFuIGVvcyA9IGZhbHNlOworICAgIC8qKgorICAgICAqIFRoZSBjaGVja3N1bSBhbGdvcml0aG0gdXNlZCB3aGVuIGhhbmRsaW5nIHVuY29tcHJlc3NlZCBkYXRhLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHByb3RlY3RlZCBDUkMzMiBjcmMgPSBuZXcgQ1JDMzIoKTsKIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdaSVBfTUFHSUMgPSAweDhiMWY7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlb3MgPSBmYWxzZTsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSENSQyA9IDI7CisgICAgLyoqCisgICAgICogVGhlIG1hZ2ljIGhlYWRlciBmb3IgdGhlIEdaSVAgZm9ybWF0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdaSVBfTUFHSUMgPSAweDhiMWY7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkVYVFJBID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkhDUkMgPSAyOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZOQU1FID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkVYVFJBID0gNDsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQ09NTUVOVCA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTkFNRSA9IDg7CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBHWklQSW5wdXRTdHJlYW0gdG8gcmVhZCBmcm9tIEdaSVAgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nCi0JICogc3RyZWFtCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBJbnB1dFN0cmVhbSB0byByZWFkIGRhdGEgZnJvbQotCSAqLwotCXB1YmxpYyBHWklQSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMoaXMsIEJVRl9TSVpFKTsKLQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZDT01NRU5UID0gMTY7CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBHWklQSW5wdXRTdHJlYW0gdG8gcmVhZCBmcm9tIEdaSVAgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nCi0JICogc3RyZWFtLiBTZXQgdGhlIGludGVybmFsIGJ1ZmZlciBzaXplIHRvIHNpemUKLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIElucHV0U3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIEludGVybmFsIHJlYWQgYnVmZmVyIHNpemUKLQkgKi8KLQlwdWJsaWMgR1pJUElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIoaXMsIG5ldyBJbmZsYXRlcih0cnVlKSwgc2l6ZSk7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVsxMF07Ci0JCXJlYWRGdWxseShoZWFkZXIsIDAsIGhlYWRlci5sZW5ndGgpOwotCQlpZiAoZ2V0U2hvcnQoaGVhZGVyLCAwKSAhPSBHWklQX01BR0lDKSB7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEge0Bjb2RlIEdaSVBJbnB1dFN0cmVhbX0gdG8gcmVhZCBmcm9tIEdaSVAgZGF0YSBmcm9tIHRoZQorICAgICAqIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcmVhZCBkYXRhIGZyb20uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBHWklQSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoaXMsIEJVRl9TSVpFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgR1pJUElucHV0U3RyZWFtfSB0byByZWFkIGZyb20gR1pJUCBkYXRhIGZyb20gdGhlCisgICAgICogdW5kZXJseWluZyBzdHJlYW0uIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdG8ge0Bjb2RlIHNpemV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBpcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcmVhZCBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciBzaXplLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiB7QGNvZGUgSU9FeGNlcHRpb259IG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgR1pJUElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoaXMsIG5ldyBJbmZsYXRlcih0cnVlKSwgc2l6ZSk7CisgICAgICAgIGJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgIHJlYWRGdWxseShoZWFkZXIsIDAsIGhlYWRlci5sZW5ndGgpOworICAgICAgICBpZiAoZ2V0U2hvcnQoaGVhZGVyLCAwKSAhPSBHWklQX01BR0lDKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjFGIikpOyAvLyROT04tTkxTLTEkOwogICAgICAgICB9Ci0JCWludCBmbGFncyA9IGhlYWRlclszXTsKLQkJYm9vbGVhbiBoY3JjID0gKGZsYWdzICYgRkhDUkMpICE9IDA7Ci0JCWlmIChoY3JjKSB7CisgICAgICAgIGludCBmbGFncyA9IGhlYWRlclszXTsKKyAgICAgICAgYm9vbGVhbiBoY3JjID0gKGZsYWdzICYgRkhDUkMpICE9IDA7CisgICAgICAgIGlmIChoY3JjKSB7CiAgICAgICAgICAgICBjcmMudXBkYXRlKGhlYWRlciwgMCwgaGVhZGVyLmxlbmd0aCk7CiAgICAgICAgIH0KLQkJaWYgKChmbGFncyAmIEZFWFRSQSkgIT0gMCkgewotCQkJcmVhZEZ1bGx5KGhlYWRlciwgMCwgMik7Ci0JCQlpZiAoaGNyYykgeworICAgICAgICBpZiAoKGZsYWdzICYgRkVYVFJBKSAhPSAwKSB7CisgICAgICAgICAgICByZWFkRnVsbHkoaGVhZGVyLCAwLCAyKTsKKyAgICAgICAgICAgIGlmIChoY3JjKSB7CiAgICAgICAgICAgICAgICAgY3JjLnVwZGF0ZShoZWFkZXIsIDAsIDIpOwogICAgICAgICAgICAgfQotCQkJaW50IGxlbmd0aCA9IGdldFNob3J0KGhlYWRlciwgMCk7Ci0JCQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQkJCWludCBtYXggPSBsZW5ndGggPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IGxlbmd0aDsKLQkJCQlpbnQgcmVzdWx0ID0gaW4ucmVhZChidWYsIDAsIG1heCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGdldFNob3J0KGhlYWRlciwgMCk7CisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGludCBtYXggPSBsZW5ndGggPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gaW4ucmVhZChidWYsIDAsIG1heCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQotCQkJCWlmIChoY3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKGhjcmMpIHsKICAgICAgICAgICAgICAgICAgICAgY3JjLnVwZGF0ZShidWYsIDAsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgfQotCQkJCWxlbmd0aCAtPSByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKChmbGFncyAmIEZOQU1FKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoIC09IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGZsYWdzICYgRk5BTUUpICE9IDApIHsKICAgICAgICAgICAgIHJlYWRaZXJvVGVybWluYXRlZChoY3JjKTsKICAgICAgICAgfQotCQlpZiAoKGZsYWdzICYgRkNPTU1FTlQpICE9IDApIHsKKyAgICAgICAgaWYgKChmbGFncyAmIEZDT01NRU5UKSAhPSAwKSB7CiAgICAgICAgICAgICByZWFkWmVyb1Rlcm1pbmF0ZWQoaGNyYyk7CiAgICAgICAgIH0KLQkJaWYgKGhjcmMpIHsKLQkJCXJlYWRGdWxseShoZWFkZXIsIDAsIDIpOwotCQkJaW50IGNyYzE2ID0gZ2V0U2hvcnQoaGVhZGVyLCAwKTsKLQkJCWlmICgoY3JjLmdldFZhbHVlKCkgJiAweGZmZmYpICE9IGNyYzE2KSB7CisgICAgICAgIGlmIChoY3JjKSB7CisgICAgICAgICAgICByZWFkRnVsbHkoaGVhZGVyLCAwLCAyKTsKKyAgICAgICAgICAgIGludCBjcmMxNiA9IGdldFNob3J0KGhlYWRlciwgMCk7CisgICAgICAgICAgICBpZiAoKGNyYy5nZXRWYWx1ZSgpICYgMHhmZmZmKSAhPSBjcmMxNikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMjAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLQkJCWNyYy5yZXNldCgpOwotCQl9Ci0JfQorICAgICAgICAgICAgY3JjLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIGxvbmcgZ2V0TG9uZyhieXRlW10gYnVmZmVyLCBpbnQgb2ZmKSB7Ci0JCWxvbmcgbCA9IDA7Ci0JCWwgfD0gKGJ1ZmZlcltvZmZdICYgMHhGRik7Ci0JCWwgfD0gKGJ1ZmZlcltvZmYgKyAxXSAmIDB4RkYpIDw8IDg7Ci0JCWwgfD0gKGJ1ZmZlcltvZmYgKyAyXSAmIDB4RkYpIDw8IDE2OwotCQlsIHw9ICgobG9uZykgKGJ1ZmZlcltvZmYgKyAzXSAmIDB4RkYpKSA8PCAyNDsKLQkJcmV0dXJuIGw7Ci0JfQorICAgIHByaXZhdGUgbG9uZyBnZXRMb25nKGJ5dGVbXSBidWZmZXIsIGludCBvZmYpIHsKKyAgICAgICAgbG9uZyBsID0gMDsKKyAgICAgICAgbCB8PSAoYnVmZmVyW29mZl0gJiAweEZGKTsKKyAgICAgICAgbCB8PSAoYnVmZmVyW29mZiArIDFdICYgMHhGRikgPDwgODsKKyAgICAgICAgbCB8PSAoYnVmZmVyW29mZiArIDJdICYgMHhGRikgPDwgMTY7CisgICAgICAgIGwgfD0gKChsb25nKSAoYnVmZmVyW29mZiArIDNdICYgMHhGRikpIDw8IDI0OworICAgICAgICByZXR1cm4gbDsKKyAgICB9CiAKLQlwcml2YXRlIGludCBnZXRTaG9ydChieXRlW10gYnVmZmVyLCBpbnQgb2ZmKSB7Ci0JCXJldHVybiAoYnVmZmVyW29mZl0gJiAweEZGKSB8ICgoYnVmZmVyW29mZiArIDFdICYgMHhGRikgPDwgOCk7Ci0JfQorICAgIHByaXZhdGUgaW50IGdldFNob3J0KGJ5dGVbXSBidWZmZXIsIGludCBvZmYpIHsKKyAgICAgICAgcmV0dXJuIChidWZmZXJbb2ZmXSAmIDB4RkYpIHwgKChidWZmZXJbb2ZmICsgMV0gJiAweEZGKSA8PCA4KTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZWFkcyBhbmQgZGVjb21wcmVzc2VzIEdaSVAgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBpbnRvIGJ1Zi4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmZmVyCi0JICogICAgICAgICAgICBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhCi0JICogQHBhcmFtIG9mZgotCSAqICAgICAgICAgICAgT2Zmc2V0IGluIGJ1ZmZlciB0byBzdG9yZSBkYXRhCi0JICogQHBhcmFtIG5ieXRlcwotCSAqICAgICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZiwgaW50IG5ieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGNsb3NlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4xRSIpKTsgLy8kTk9OLU5MUy0xJApAQCAtMTM5LDM0ICsxNTUsMTcgQEAKICAgICAgICAgaWYoZW9mKXsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotCQkvLyBhdm9pZCBpbnQgb3ZlcmZsb3csIGNoZWNrIG51bGwgYnVmZmVyCi0JCWlmIChvZmYgPD0gYnVmZmVyLmxlbmd0aCAmJiBuYnl0ZXMgPj0gMCAmJiBvZmYgPj0gMAotCQkJCSYmIGJ1ZmZlci5sZW5ndGggLSBvZmYgPj0gbmJ5dGVzKSB7Ci0JCQlpbnQgdmFsID0gc3VwZXIucmVhZChidWZmZXIsIG9mZiwgbmJ5dGVzKTsKLQkJCWlmICh2YWwgIT0gLTEpIHsKKyAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZmZlcgorICAgICAgICBpZiAob2ZmIDw9IGJ1ZmZlci5sZW5ndGggJiYgbmJ5dGVzID49IDAgJiYgb2ZmID49IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXIubGVuZ3RoIC0gb2ZmID49IG5ieXRlcykgeworICAgICAgICAgICAgaW50IHZhbCA9IHN1cGVyLnJlYWQoYnVmZmVyLCBvZmYsIG5ieXRlcyk7CisgICAgICAgICAgICBpZiAodmFsICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgY3JjLnVwZGF0ZShidWZmZXIsIG9mZiwgdmFsKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVvcykgewotCQkJCWVvcyA9IHRydWU7Ci0JCQkJLy8gR2V0IG5vbi1jb21wcmVzc2VkIGJ5dGVzIHJlYWQgYnkgZmlsbAotCQkJCQotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLwkJCQlpbnQgc2l6ZSA9IDA7Ci0vLwkJCQlieXRlW10gYiA9IG5ldyBieXRlWzhdOwotLy8JCQkJaW50IGluQiA9IGluZi5nZXRUb3RhbEluKCk7Ci0vLwkJCQlpZiAoaW5CID4gMCkgewotLy8JCQkJCWludCBkaWZmID0gaW5CICUgYnVmLmxlbmd0aDsKLS8vCQkJCQlpZiAoZGlmZiAhPSAwIHx8IGxlbiAhPSBidWYubGVuZ3RoKSB7Ci0vLwkJCQkJCXNpemUgPSBsZW4gLSBkaWZmOwotLy8JCQkJCQlpZiAoc2l6ZSA+IGIubGVuZ3RoKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gYi5sZW5ndGg7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vCQkJCQkJU3lzdGVtLmFycmF5Y29weShidWYsIGRpZmYsIGIsIDAsIHNpemUpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCXJlYWRGdWxseShiLCBzaXplLCBiLmxlbmd0aCAtIHNpemUpOwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotCQkJCQotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZCAoZnJvbSBuZXdlciBIYXJtb255KQorICAgICAgICAgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gR2V0IG5vbi1jb21wcmVzc2VkIGJ5dGVzIHJlYWQgYnkgZmlsbAorICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgICAgIC8vIGNvcGllZCBmcm9tIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQogICAgICAgICAgICAgICAgIGludCBzaXplID0gaW5mLmdldFJlbWFpbmluZygpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCB0cmFpbGVyU2l6ZSA9IDg7IC8vIGNyYyAoNCBieXRlcykgKyB0b3RhbCBvdXQgKDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMpCkBAIC0xNzQsNTYgKzE3Myw1MiBAQAogICAgICAgICAgICAgICAgIGludCBjb3B5U2l6ZSA9IChzaXplID4gdHJhaWxlclNpemUpID8gdHJhaWxlclNpemUgOiBzaXplOwogCiAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIGxlbiAtIHNpemUsIGIsIDAsIGNvcHlTaXplKTsKLSAgICAgICAgICAgICAgICByZWFkRnVsbHkoYiwgY29weVNpemUsIHRyYWlsZXJTaXplIC0gY29weVNpemUpOwkJCQkKLS8vIEVORCBhbmRyb2lkLWFkZGVkIChmcm9tIG5ld2VyIEhhcm1vbnkpCi0JCQkJCi0JCQkJaWYgKGdldExvbmcoYiwgMCkgIT0gY3JjLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICByZWFkRnVsbHkoYiwgY29weVNpemUsIHRyYWlsZXJTaXplIC0gY29weVNpemUpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgaWYgKGdldExvbmcoYiwgMCkgIT0gY3JjLmdldFZhbHVlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4yMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIH0KLQkJCQlpZiAoKGludCkgZ2V0TG9uZyhiLCA0KSAhPSBpbmYuZ2V0VG90YWxPdXQoKSkgeworICAgICAgICAgICAgICAgIGlmICgoaW50KSBnZXRMb25nKGIsIDQpICE9IGluZi5nZXRUb3RhbE91dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMjEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhpcyBzdHJlYW0gYW5kIGFueSB1bmRlcmx5aW5nIHN0cmVhbXMuCi0JICovCi0JQE92ZXJyaWRlCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllb3MgPSB0cnVlOwotCQlzdXBlci5jbG9zZSgpOwotCX0KKyAgICAgICAgZW9zID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0OwotCQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQkJcmVzdWx0ID0gaW4ucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICBwcml2YXRlIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgcmVzdWx0ID0gaW4ucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9Ci0JCQlvZmZzZXQgKz0gcmVzdWx0OwotCQkJbGVuZ3RoIC09IHJlc3VsdDsKLQkJfQotCX0KKyAgICAgICAgICAgIG9mZnNldCArPSByZXN1bHQ7CisgICAgICAgICAgICBsZW5ndGggLT0gcmVzdWx0OworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHJlYWRaZXJvVGVybWluYXRlZChib29sZWFuIGhjcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQ7Ci0JCXdoaWxlICgocmVzdWx0ID0gaW4ucmVhZCgpKSA+IDApIHsKLQkJCWlmIChoY3JjKSB7CisgICAgcHJpdmF0ZSB2b2lkIHJlYWRaZXJvVGVybWluYXRlZChib29sZWFuIGhjcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgIHdoaWxlICgocmVzdWx0ID0gaW4ucmVhZCgpKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChoY3JjKSB7CiAgICAgICAgICAgICAgICAgY3JjLnVwZGF0ZShyZXN1bHQpOwogICAgICAgICAgICAgfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQkJLy8gQWRkIHRoZSB6ZXJvCi0JCWlmIChoY3JjKSB7CisgICAgICAgIC8vIEFkZCB0aGUgemVybworICAgICAgICBpZiAoaGNyYykgewogICAgICAgICAgICAgY3JjLnVwZGF0ZShyZXN1bHQpOwogICAgICAgICB9Ci0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW0uamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW0uamF2YQppbmRleCAxOGVlZGI1Li5mYTQxZTE5IDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9HWklQT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvR1pJUE91dHB1dFN0cmVhbS5qYXZhCkBAIC0yMiw3NiArMjIsOTAgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIAogLyoqCi0gKiBUaGUgR1pJUE91dHB1dFN0cmVhbSBjbGFzcyBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gYSBzdHJlYW0gaW4gdGhlIEdaSVAKLSAqIHN0b3JhZ2UgZm9ybWF0LgorICogVGhlIHtAY29kZSBHWklQT3V0cHV0U3RyZWFtfSBjbGFzcyBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gYSBzdHJlYW0gaW4gdGhlCisgKiBHWklQIHN0b3JhZ2UgZm9ybWF0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEdaSVBPdXRwdXRTdHJlYW0gZXh0ZW5kcyBEZWZsYXRlck91dHB1dFN0cmVhbSB7CiAKLQlwcm90ZWN0ZWQgQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7CisgICAgLyoqCisgICAgICogVGhlIGNoZWNrc3VtIGFsZ29yaXRobSB1c2VkIHdoZW4gdHJlYXRpbmcgdW5jb21wcmVzc2VkIGRhdGEuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHJvdGVjdGVkIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwogCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IEdaSVBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgZGF0YSBpbiBHWklQIGZvcm1hdCB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiAgICAgICAgICAgIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0bwotCSAqLwotCXB1YmxpYyBHWklQT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcyhvcywgQlVGX1NJWkUpOwotCX0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcge0Bjb2RlIEdaSVBPdXRwdXRTdHJlYW19IHRvIHdyaXRlIGRhdGEgaW4gR1pJUCBmb3JtYXQgdG8KKyAgICAgKiB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIG9zCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgZGF0YSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIEdaSVBPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKG9zLCBCVUZfU0laRSk7CisgICAgfQogCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IEdaSVBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgZGF0YSBpbiBHWklQIGZvcm1hdCB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIHN0cmVhbS4gU2V0IHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBidWZmZXIgdG8gc2lzZSBzaXplLgotCSAqIAotCSAqIEBwYXJhbSBvcwotCSAqICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRvCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIEludGVybmFsIGJ1ZmZlciBzaXplCi0JICovCi0JcHVibGljIEdaSVBPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIob3MsIG5ldyBEZWZsYXRlcihEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OLCB0cnVlKSwgc2l6ZSk7Ci0JCXdyaXRlU2hvcnQoR1pJUElucHV0U3RyZWFtLkdaSVBfTUFHSUMpOwotCQlvdXQud3JpdGUoRGVmbGF0ZXIuREVGTEFURUQpOwotCQlvdXQud3JpdGUoMCk7IC8vIGZsYWdzCi0JCXdyaXRlTG9uZygwKTsgLy8gbW9kIHRpbWUKLQkJb3V0LndyaXRlKDApOyAvLyBleHRyYSBmbGFncwotCQlvdXQud3JpdGUoMCk7IC8vIG9wZXJhdGluZyBzeXN0ZW0KLQl9CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHtAY29kZSBHWklQT3V0cHV0U3RyZWFtfSB0byB3cml0ZSBkYXRhIGluIEdaSVAgZm9ybWF0IHRvCisgICAgICogdGhlIHVuZGVybHlpbmcgc3RyZWFtLiBTZXQgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIGJ1ZmZlciB0byBzaXplCisgICAgICoge0Bjb2RlIHNpemV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPdXRwdXRTdHJlYW19IHRvIHdyaXRlIHRvLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBHWklQT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKG9zLCBuZXcgRGVmbGF0ZXIoRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTiwgdHJ1ZSksIHNpemUpOworICAgICAgICB3cml0ZVNob3J0KEdaSVBJbnB1dFN0cmVhbS5HWklQX01BR0lDKTsKKyAgICAgICAgb3V0LndyaXRlKERlZmxhdGVyLkRFRkxBVEVEKTsKKyAgICAgICAgb3V0LndyaXRlKDApOyAvLyBmbGFncworICAgICAgICB3cml0ZUxvbmcoMCk7IC8vIG1vZCB0aW1lCisgICAgICAgIG91dC53cml0ZSgwKTsgLy8gZXh0cmEgZmxhZ3MKKyAgICAgICAgb3V0LndyaXRlKDApOyAvLyBvcGVyYXRpbmcgc3lzdGVtCisgICAgfQogCi0JLyoqCi0JICogSW5kaWNhdGVzIHRvIHRoZSBzdHJlYW0gdGhhdCBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIG91dCwgYW5kIGFueSBHWklQCi0JICogdGVybWluYWwgZGF0YSBjYW4gbm93IGJlIG91dHB1dC4KLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdG8gdGhlIHN0cmVhbSB0aGF0IGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LCBhbmQgYW55IEdaSVAKKyAgICAgKiB0ZXJtaW5hbCBkYXRhIGNhbiBub3cgYmUgd3JpdHRlbi4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZmluaXNoKCk7Ci0JCXdyaXRlTG9uZyhjcmMuZ2V0VmFsdWUoKSk7Ci0JCXdyaXRlTG9uZyhjcmMudGJ5dGVzKTsKLQl9CisgICAgICAgIHN1cGVyLmZpbmlzaCgpOworICAgICAgICB3cml0ZUxvbmcoY3JjLmdldFZhbHVlKCkpOworICAgICAgICB3cml0ZUxvbmcoY3JjLnRieXRlcyk7CisgICAgfQogCi0JLyoqCi0JICogV3JpdGUgdXAgdG8gbmJ5dGVzIG9mIGRhdGEgZnJvbSBidWYsIHN0YXJ0aW5nIGF0IG9mZnNldCBvZmYsIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgc3RyZWFtIGluIEdaSVAgZm9ybWF0LgotCSAqLwotCUBPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmYsIGludCBuYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLndyaXRlKGJ1ZmZlciwgb2ZmLCBuYnl0ZXMpOwotCQljcmMudXBkYXRlKGJ1ZmZlciwgb2ZmLCBuYnl0ZXMpOwotCX0KKyAgICAgICAgc3VwZXIud3JpdGUoYnVmZmVyLCBvZmYsIG5ieXRlcyk7CisgICAgICAgIGNyYy51cGRhdGUoYnVmZmVyLCBvZmYsIG5ieXRlcyk7CisgICAgfQogCi0JcHJpdmF0ZSBpbnQgd3JpdGVTaG9ydChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3V0LndyaXRlKGkgJiAweEZGKTsKLQkJb3V0LndyaXRlKChpID4+IDgpICYgMHhGRik7Ci0JCXJldHVybiBpOwotCX0KKyAgICBwcml2YXRlIGludCB3cml0ZVNob3J0KGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGUoaSAmIDB4RkYpOworICAgICAgICBvdXQud3JpdGUoKGkgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQogCi0JcHJpdmF0ZSBsb25nIHdyaXRlTG9uZyhsb25nIGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFdyaXRlIG91dCB0aGUgbG9uZyB2YWx1ZSBhcyBhbiB1bnNpZ25lZCBpbnQKLQkJb3V0LndyaXRlKChpbnQpIChpICYgMHhGRikpOwotCQlvdXQud3JpdGUoKGludCkgKGkgPj4gOCkgJiAweEZGKTsKLQkJb3V0LndyaXRlKChpbnQpIChpID4+IDE2KSAmIDB4RkYpOwotCQlvdXQud3JpdGUoKGludCkgKGkgPj4gMjQpICYgMHhGRik7Ci0JCXJldHVybiBpOwotCX0KKyAgICBwcml2YXRlIGxvbmcgd3JpdGVMb25nKGxvbmcgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBsb25nIHZhbHVlIGFzIGFuIHVuc2lnbmVkIGludAorICAgICAgICBvdXQud3JpdGUoKGludCkgKGkgJiAweEZGKSk7CisgICAgICAgIG91dC53cml0ZSgoaW50KSAoaSA+PiA4KSAmIDB4RkYpOworICAgICAgICBvdXQud3JpdGUoKGludCkgKGkgPj4gMTYpICYgMHhGRik7CisgICAgICAgIG91dC53cml0ZSgoaW50KSAoaSA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvSW5mbGF0ZXIuamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0luZmxhdGVyLmphdmEKaW5kZXggNmY1MTRiYS4uOWI5M2U1NCAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvSW5mbGF0ZXIuamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9JbmZsYXRlci5qYXZhCkBAIC0xOSwxNjUgKzE5LDE5MCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLQorLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogLyoqCi0gKiBUaGUgSW5mbGF0ZXIgY2xhc3MgaXMgdXNlZCB0byBkZWNvbXByZXNzIGJ5dGVzIHVzaW5nIHRoZSBERUZMQVRFIGNvbXByZXNzaW9uCi0gKiBhbGdvcml0aG0uIEluZmxhdGlvbiBpcyBwZXJmb3JtZWQgYnkgdGhlIFpMSUIgY29tcHJlc3Npb24gbGlicmFyeS4KKyAqIFRoaXMgY2xhc3MgdW5jb21wcmVzc2VzIGRhdGEgdGhhdCB3YXMgY29tcHJlc3NlZCB1c2luZyB0aGUgPGk+REVGTEFURTwvaT4KKyAqIGFsZ29yaXRobSAoc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3ppcC5vcmcvYWxnb3JpdGhtLnR4dCI+c3BlY2lmaWNhdGlvbjwvYT4pLgorICogPHA+CisgKiBCYXNpY2FsbHkgdGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBBUEkgdG8gdGhlIHN0cmVhbSBiYXNlZCBaTElCIGNvbXByZXNzaW9uCisgKiBsaWJyYXJ5IGFuZCBpcyB1c2VkIGFzIHN1Y2ggYnkge0Bjb2RlIEluZmxhdGVySW5wdXRTdHJlYW19IGFuZCBpdHMKKyAqIGRlc2NlbmRhbnRzLgorICogPC9wPgorICogPHA+CisgKiBUaGUgdHlwaWNhbCB1c2FnZSBvZiBhIHtAY29kZSBJbmZsYXRlcn0gb3V0c2lkZSB0aGlzIHBhY2thZ2UgY29uc2lzdHMgb2YgYQorICogc3BlY2lmaWMgY2FsbCB0byBvbmUgb2YgaXRzIGNvbnN0cnVjdG9ycyBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIGFuIGluc3RhbmNlCisgKiBvZiB7QGNvZGUgSW5mbGF0ZXJJbnB1dFN0cmVhbX0uCisgKiA8L3A+CiAgKiAKLSAqIEBzZWUgRGVmbGF0ZXJPdXRwdXRTdHJlYW0KLSAqIEBzZWUgSW5mbGF0ZXIKKyAqIEBzZWUgSW5mbGF0ZXJJbnB1dFN0cmVhbQorICogQHNlZSBEZWZsYXRlcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbmZsYXRlciB7CiAKLQlwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQ7IC8vIFNldCBieSB0aGUgaW5mbGF0ZUltcGwgbmF0aXZlCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOyAvLyBTZXQgYnkgdGhlIGluZmxhdGVJbXBsIG5hdGl2ZQogCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRzRGljdGlvbmFyeTsgLy8gU2V0IGJ5IHRoZSBpbmZsYXRlSW1wbCBuYXRpdmUKKyAgICBwcml2YXRlIGJvb2xlYW4gbmVlZHNEaWN0aW9uYXJ5OyAvLyBTZXQgYnkgdGhlIGluZmxhdGVJbXBsIG5hdGl2ZQogCi0JcHJpdmF0ZSBsb25nIHN0cmVhbUhhbmRsZSA9IC0xOworICAgIHByaXZhdGUgbG9uZyBzdHJlYW1IYW5kbGUgPSAtMTsKIAotCWludCBpblJlYWQ7CisgICAgaW50IGluUmVhZDsKICAgICAKICAgICBpbnQgaW5MZW5ndGg7CiAKLQkvLyBGaWxsIGluIHRoZSBKTkkgaWQgY2FjaGVzCi0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgb25lVGltZUluaXRpYWxpemF0aW9uKCk7CisgICAgLy8gRmlsbCBpbiB0aGUgSk5JIGlkIGNhY2hlcworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG9uZVRpbWVJbml0aWFsaXphdGlvbigpOwogCi0Jc3RhdGljIHsKLQkJb25lVGltZUluaXRpYWxpemF0aW9uKCk7Ci0JfQorICAgIHN0YXRpYyB7CisgICAgICAgIG9uZVRpbWVJbml0aWFsaXphdGlvbigpOworICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIE1BR0lDX05VTUJFUiA9IDEyMDsKICAgICBwcml2YXRlIGJvb2xlYW4gZ290Rmlyc3RCeXRlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIHBhc3NfbWFnaWNfbnVtYmVyX2NoZWNrID0gdHJ1ZTsKICAgICAKLQkvKioKLQkgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSW5mbGF0ZXIuIEFueSB1bnVzZWQKLQkgKiBpbnB1dC9vdXRwdXQgaXMgZGlzY2FyZGVkLiBUaGlzIGlzIGFsc28gY2FsbGVkIGJ5IHRoZSBmaW5hbGl6ZSBtZXRob2QuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVuZCgpIHsKLQkJaWYgKHN0cmVhbUhhbmRsZSAhPSAtMSkgewotCQkJZW5kSW1wbChzdHJlYW1IYW5kbGUpOwotCQkJaW5SZWFkID0gMDsKLQkJCWluTGVuZ3RoID0gMDsKLQkJCXN0cmVhbUhhbmRsZSA9IC0xOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgSW5mbGF0ZXJ9LiBBbnkgdW51c2VkCisgICAgICogaW5wdXQvb3V0cHV0IGlzIGRpc2NhcmRlZC4gVGhpcyBpcyBhbHNvIGNhbGxlZCBieSB0aGUgZmluYWxpemUgbWV0aG9kLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbmQoKSB7CisgICAgICAgIGlmIChzdHJlYW1IYW5kbGUgIT0gLTEpIHsKKyAgICAgICAgICAgIGVuZEltcGwoc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgICAgIGluUmVhZCA9IDA7CisgICAgICAgICAgICBpbkxlbmd0aCA9IDA7CisgICAgICAgICAgICBzdHJlYW1IYW5kbGUgPSAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgbmF0aXZlIHN5bmNocm9uaXplZCB2b2lkIGVuZEltcGwobG9uZyBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIHN5bmNocm9uaXplZCB2b2lkIGVuZEltcGwobG9uZyBoYW5kbGUpOwogCi0JQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0JCWVuZCgpOwotCX0KKyAgICAgICAgZW5kKCk7CisgICAgfQogCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBJbmZsYXRlciBoYXMgaW5mbGF0ZWQgdGhlIGVudGlyZSBkZWZsYXRlZCBzdHJlYW0uIElmCi0JICogZGVmbGF0ZWQgYnl0ZXMgcmVtYWluIGFuZCBuZWVkc0lucHV0IHJldHVybnMgdHJ1ZSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgotCSAqIGZhbHNlLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFsbCBkZWZsYXRlZCBpbnB1dCBpcyBzdXBwbGllZAotCSAqIHRvIHRoZSBJbmZsYXRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgYWxsIGlucHV0IGhhcyBiZWVuIGluZmxhdGVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZmluaXNoZWQoKSB7Ci0JCXJldHVybiBmaW5pc2hlZDsKLQl9CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoZSB7QGNvZGUgSW5mbGF0ZXJ9IGhhcyBpbmZsYXRlZCB0aGUgZW50aXJlIGRlZmxhdGVkCisgICAgICogc3RyZWFtLiBJZiBkZWZsYXRlZCBieXRlcyByZW1haW4gYW5kIHtAY29kZSBuZWVkc0lucHV0KCl9IHJldHVybnMge0Bjb2RlCisgICAgICogdHJ1ZX0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4ge0Bjb2RlIGZhbHNlfS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCisgICAgICogY2FsbGVkIGFmdGVyIGFsbCBkZWZsYXRlZCBpbnB1dCBpcyBzdXBwbGllZCB0byB0aGUge0Bjb2RlIEluZmxhdGVyfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhbGwgaW5wdXQgaGFzIGJlZW4gaW5mbGF0ZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZmluaXNoZWQoKSB7CisgICAgICAgIHJldHVybiBmaW5pc2hlZDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBZGxlcjMyIGNoZWNrc3VtIG9mIGVpdGhlciBhbGwgYnl0ZXMgaW5mbGF0ZWQsIG9yIHRoZQotCSAqIGNoZWNrc3VtIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeSBpZiBvbmUgaGFzIGJlZW4gc3VwcGxpZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgQWRsZXIzMiBjaGVja3N1bSBhc3NvY2lhdGVkIHdpdGggdGhpcyBJbmZsYXRlci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRBZGxlcigpIHsKLQkJaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgeworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDxpPkFkbGVyMzI8L2k+IGNoZWNrc3VtIG9mIGVpdGhlciBhbGwgYnl0ZXMgaW5mbGF0ZWQsIG9yIHRoZQorICAgICAqIGNoZWNrc3VtIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeSBpZiBvbmUgaGFzIGJlZW4gc3VwcGxpZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgPGk+QWRsZXIzMjwvaT4gY2hlY2tzdW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBJbmZsYXRlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRBZGxlcigpIHsKKyAgICAgICAgaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCXJldHVybiBnZXRBZGxlckltcGwoc3RyZWFtSGFuZGxlKTsKLQl9CisgICAgICAgIHJldHVybiBnZXRBZGxlckltcGwoc3RyZWFtSGFuZGxlKTsKKyAgICB9CiAKLQlwcml2YXRlIG5hdGl2ZSBzeW5jaHJvbml6ZWQgaW50IGdldEFkbGVySW1wbChsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgc3luY2hyb25pemVkIGludCBnZXRBZGxlckltcGwobG9uZyBoYW5kbGUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGN1cnJlbnQgaW5wdXQgcmVtYWluaW5nIHRvIGJlIHJlYWQgYnkgdGhlCi0JICogaW5mbGF0ZXIKLQkgKiAKLQkgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyBvZiB1bnJlYWQgaW5wdXQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UmVtYWluaW5nKCkgewotCQlyZXR1cm4gaW5MZW5ndGggLSBpblJlYWQ7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBjdXJyZW50IGlucHV0IHJlbWFpbmluZyB0byBiZSByZWFkIGJ5IHRoZQorICAgICAqIGluZmxhdGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiB1bnJlYWQgaW5wdXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UmVtYWluaW5nKCkgeworICAgICAgICByZXR1cm4gaW5MZW5ndGggLSBpblJlYWQ7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgaW5wdXQgcmVhZCBieSB0aGUgSW5mbGF0ZXIuCi0JICogCi0JICogQHJldHVybiBUb3RhbCBieXRlcyByZWFkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0VG90YWxJbigpIHsKLQkJaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgeworICAgIC8qKgorICAgICAqIFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG9mIGlucHV0IHJlYWQgYnkgdGhlIHtAY29kZSBJbmZsYXRlcn0uIFRoZQorICAgICAqIHJlc3VsdCB2YWx1ZSBpcyBsaW1pdGVkIGJ5IHtAY29kZSBJbnRlZ2VyLk1BWF9WQUxVRX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0VG90YWxJbigpIHsKKyAgICAgICAgaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCWxvbmcgdG90YWxJbiA9IGdldFRvdGFsSW5JbXBsKHN0cmVhbUhhbmRsZSk7Ci0JCXJldHVybiAodG90YWxJbiA8PSBJbnRlZ2VyLk1BWF9WQUxVRSA/IChpbnQpIHRvdGFsSW4KLQkJCQk6IEludGVnZXIuTUFYX1ZBTFVFKTsKLQl9CisgICAgICAgIGxvbmcgdG90YWxJbiA9IGdldFRvdGFsSW5JbXBsKHN0cmVhbUhhbmRsZSk7CisgICAgICAgIHJldHVybiAodG90YWxJbiA8PSBJbnRlZ2VyLk1BWF9WQUxVRSA/IChpbnQpIHRvdGFsSW4KKyAgICAgICAgICAgICAgICA6IEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICB9CiAKLQlwcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgbG9uZyBnZXRUb3RhbEluSW1wbChsb25nIGhhbmRsZSk7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGxvbmcgZ2V0VG90YWxJbkltcGwobG9uZyBoYW5kbGUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgaW5wdXQgb3V0cHV0IGJ5IHRoZSBJbmZsYXRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRvdGFsIGJ5dGVzIG91dHB1dAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRvdGFsT3V0KCkgewotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlciBieSB0aGUge0Bjb2RlCisgICAgICogSW5mbGF0ZXJ9LiBUaGUgcmVzdWx0IHZhbHVlIGlzIGxpbWl0ZWQgYnkge0Bjb2RlIEludGVnZXIuTUFYX1ZBTFVFfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBieXRlcyBvZiBvdXRwdXQgZGF0YSB3cml0dGVuLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRvdGFsT3V0KCkgeworICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQkJbG9uZyB0b3RhbE91dCA9IGdldFRvdGFsT3V0SW1wbChzdHJlYW1IYW5kbGUpOwotCQlyZXR1cm4gKHRvdGFsT3V0IDw9IEludGVnZXIuTUFYX1ZBTFVFID8gKGludCkgdG90YWxPdXQKLQkJCQk6IEludGVnZXIuTUFYX1ZBTFVFKTsKLQl9CisgICAgICAgIGxvbmcgdG90YWxPdXQgPSBnZXRUb3RhbE91dEltcGwoc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuICh0b3RhbE91dCA8PSBJbnRlZ2VyLk1BWF9WQUxVRSA/IChpbnQpIHRvdGFsT3V0CisgICAgICAgICAgICAgICAgOiBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQogCi0JcHJpdmF0ZSBuYXRpdmUgc3luY2hyb25pemVkIGxvbmcgZ2V0VG90YWxPdXRJbXBsKGxvbmcgaGFuZGxlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBzeW5jaHJvbml6ZWQgbG9uZyBnZXRUb3RhbE91dEltcGwobG9uZyBoYW5kbGUpOwogCi0JLyoqCi0JICogSW5mbGF0ZXMgYnl0ZXMgZnJvbSBjdXJyZW50IGlucHV0IGFuZCBzdG9yZXMgdGhlbSBpbiBidWYuCi0JICogCi0JICogQHBhcmFtIGJ1ZgotCSAqICAgICAgICAgICAgQnVmZmVyIHRvIG91dHB1dCBpbmZsYXRlZCBieXRlcwotCSAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIGluZmxhdGVkCi0JICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGlzIGNvcnJ1cHRlZCBvciB3YXMgbm90IERFRkxBVEVECi0JICogCi0JICovCi0JcHVibGljIGludCBpbmZsYXRlKGJ5dGVbXSBidWYpIHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluZmxhdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQl9CisgICAgLyoqCisgICAgICogSW5mbGF0ZXMgYnl0ZXMgZnJvbSBjdXJyZW50IGlucHV0IGFuZCBzdG9yZXMgdGhlbSBpbiB7QGNvZGUgYnVmfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHdoZXJlIGRlY29tcHJlc3NlZCBkYXRhIGJ5dGVzIGFyZSB3cml0dGVuLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbmZsYXRlZC4KKyAgICAgKiBAdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdW5kZXJseWluZyBzdHJlYW0gaXMgY29ycnVwdGVkIG9yIHdhcyBub3QgY29tcHJlc3NlZAorICAgICAqICAgICAgICAgICAgIHVzaW5nIGEge0Bjb2RlIERlZmxhdGVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluZmxhdGUoYnl0ZVtdIGJ1ZikgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gaW5mbGF0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KIAotCS8qKgotCSAqIEluZmxhdGVzIHVwIHRvIG5ieXRlcyBieXRlcyBmcm9tIGN1cnJlbnQgaW5wdXQgYW5kIHN0b3JlcyB0aGVtIGluIGJ1ZgotCSAqIHN0YXJ0aW5nIGF0IG9mZi4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmCi0JICogICAgICAgICAgICBCdWZmZXIgdG8gb3V0cHV0IGluZmxhdGVkIGJ5dGVzCi0JICogQHBhcmFtIG9mZgotCSAqICAgICAgICAgICAgT2Zmc2V0IGluIGJ1ZmZlciBpbnRvIHdoaWNoIHRvIHN0b3JlIGluZmxhdGVkIGJ5dGVzCi0JICogQHBhcmFtIG5ieXRlcwotCSAqICAgICAgICAgICAgTnVtYmVyIG9mIGluZmxhdGVkIGJ5dGVzIHRvIHN0b3JlCi0JICogQGV4Y2VwdGlvbiBEYXRhRm9ybWF0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGlzIGNvcnJ1cHRlZCBvciB3YXMgbm90IERFRkxBVEVECi0JICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgaW5mbGF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBpbmZsYXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMpCi0JCQl0aHJvd3MgRGF0YUZvcm1hdEV4Y2VwdGlvbiB7Ci0JCS8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKLQkJaWYgKG9mZiA8PSBidWYubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCi0JCQkJJiYgYnVmLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlcyB1cCB0byBuIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgYW5kIHN0b3JlcyB0aGVtIGluIHtAY29kZQorICAgICAqIGJ1Zn0gc3RhcnRpbmcgYXQge0Bjb2RlIG9mZn0uCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byB3cml0ZSBpbmZsYXRlZCBieXRlcyB0by4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIGJ1ZmZlciB3aGVyZSB0byBzdGFydCB3cml0aW5nIGRlY29tcHJlc3NlZCBkYXRhLgorICAgICAqIEBwYXJhbSBuYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgaW5mbGF0ZWQgYnl0ZXMgdG8gd3JpdGUgdG8ge0Bjb2RlIGJ1Zn0uCisgICAgICogQHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGlzIGNvcnJ1cHRlZCBvciB3YXMgbm90IGNvbXByZXNzZWQKKyAgICAgKiAgICAgICAgICAgICB1c2luZyBhIHtAY29kZSBEZWZsYXRlcn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluZmxhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGluZmxhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IG5ieXRlcykKKyAgICAgICAgICAgIHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgorICAgICAgICBpZiAob2ZmIDw9IGJ1Zi5sZW5ndGggJiYgbmJ5dGVzID49IDAgJiYgb2ZmID49IDAKKyAgICAgICAgICAgICAgICAmJiBidWYubGVuZ3RoIC0gb2ZmID49IG5ieXRlcykgewogICAgICAgICAgICAgaWYgKG5ieXRlcyA9PSAwKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCkBAIC0xODksMTY5ICsyMTQsMjA3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLQkJCWJvb2xlYW4gbmVlZGVkRGljdCA9IG5lZWRzRGljdGlvbmFyeTsKLQkJCW5lZWRzRGljdGlvbmFyeSA9IGZhbHNlOwotCQkJaW50IHJlc3VsdCA9IGluZmxhdGVJbXBsKGJ1Ziwgb2ZmLCBuYnl0ZXMsIHN0cmVhbUhhbmRsZSk7Ci0JCQlpZiAobmVlZHNEaWN0aW9uYXJ5ICYmIG5lZWRlZERpY3QpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZGVkRGljdCA9IG5lZWRzRGljdGlvbmFyeTsKKyAgICAgICAgICAgIG5lZWRzRGljdGlvbmFyeSA9IGZhbHNlOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IGluZmxhdGVJbXBsKGJ1Ziwgb2ZmLCBuYnl0ZXMsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgICAgICBpZiAobmVlZHNEaWN0aW9uYXJ5ICYmIG5lZWRlZERpY3QpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMjciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCX0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgIH0KIAotCXByaXZhdGUgbmF0aXZlIHN5bmNocm9uaXplZCBpbnQgaW5mbGF0ZUltcGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwKLQkJCWludCBuYnl0ZXMsIGxvbmcgaGFuZGxlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBzeW5jaHJvbml6ZWQgaW50IGluZmxhdGVJbXBsKGJ5dGVbXSBidWYsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgbmJ5dGVzLCBsb25nIGhhbmRsZSk7CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEluZmxhdGVyIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbmZsYXRlcigpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbmZsYXRlciB0aGF0IGV4cGVjdHMgYSBoZWFkZXIgZnJvbSB0aGUgaW5wdXQKKyAgICAgKiBzdHJlYW0uIFVzZSB7QGNvZGUgSW5mbGF0ZXIoYm9vbGVhbil9IGlmIHRoZSBpbnB1dCBjb21lcyB3aXRob3V0IGEgWkxJQgorICAgICAqIGhlYWRlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5mbGF0ZXIoKSB7CisgICAgICAgIHRoaXMoZmFsc2UpOworICAgIH0KIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgSW5mbGF0ZXIgaW5zdGFuY2UuIElmIG5vSGVhZGVyIGlzIHRydWUgdGhlIEluZmxhdGVyIHdpbGwKLQkgKiBub3QgYXR0ZW1wdCB0byByZWFkIGEgWkxJQiBoZWFkZXIuCi0JICogCi0JICogQHBhcmFtIG5vSGVhZGVyCi0JICogICAgICAgICAgICBJZiB0cnVlLCByZWFkIGEgWkxJQiBoZWFkZXIgZnJvbSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgSW5mbGF0ZXIoYm9vbGVhbiBub0hlYWRlcikgewotCQlzdHJlYW1IYW5kbGUgPSBjcmVhdGVTdHJlYW0obm9IZWFkZXIpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB0byBjcmVhdGUgYW4gaW5mbGF0ZXIgdGhhdCBleHBlY3RzIG5vIGhlYWRlciBmcm9tCisgICAgICogdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm9IZWFkZXIKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpbmRpY2F0ZXMgdGhhdCBubyBaTElCIGhlYWRlciBjb21lcyB3aXRoIHRoZQorICAgICAqICAgICAgICAgICAgaW5wdXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIEluZmxhdGVyKGJvb2xlYW4gbm9IZWFkZXIpIHsKKyAgICAgICAgc3RyZWFtSGFuZGxlID0gY3JlYXRlU3RyZWFtKG5vSGVhZGVyKTsKKyAgICB9CiAKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5wdXQgYnl0ZXMgd2VyZSBjb21wcmVzc2VkIHdpdGggYSBwcmVzZXQKLQkgKiBkaWN0aW9uYXJ5LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIGluZmxhdGUoKSB0byBkZXRlcm1pbmUKLQkgKiBpZiBhIGRpY3Rpb25hcnkgaXMgcmVxdWlyZWQuIElmIHNvIHNldERpY3Rpb25hcnkoKSBzaG91bGQgYmUgY2FsbGVkIHdpdGgKLQkgKiB0aGUgYXBwcm9wcmlhdGUgZGljdGlvbmFyeSBwcmlvciB0byBjYWxsaW5nIGluZmxhdGUoKS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyByZXF1aXJlZCBmb3IgaW5mbGF0aW9uLgotCSAqIEBzZWUgI3NldERpY3Rpb25hcnkoYnl0ZVtdKQotCSAqIEBzZWUgI3NldERpY3Rpb25hcnkoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbmVlZHNEaWN0aW9uYXJ5KCkgewotCQlyZXR1cm4gbmVlZHNEaWN0aW9uYXJ5OwotCX0KKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5wdXQgYnl0ZXMgd2VyZSBjb21wcmVzc2VkIHdpdGggYSBwcmVzZXQKKyAgICAgKiBkaWN0aW9uYXJ5LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHtAY29kZSBpbmZsYXRlKCl9IHRvCisgICAgICogZGV0ZXJtaW5lIHdoZXRoZXIgYSBkaWN0aW9uYXJ5IGlzIHJlcXVpcmVkLiBJZiBzbyB7QGNvZGUgc2V0RGljdGlvbmFyeSgpfQorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGljdGlvbmFyeSBwcmlvciB0byBjYWxsaW5nIHtAY29kZQorICAgICAqIGluZmxhdGUoKX0uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyByZXF1aXJlZCBmb3IgaW5mbGF0aW9uLgorICAgICAqIEBzZWUgI3NldERpY3Rpb25hcnkoYnl0ZVtdKQorICAgICAqIEBzZWUgI3NldERpY3Rpb25hcnkoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbmVlZHNEaWN0aW9uYXJ5KCkgeworICAgICAgICByZXR1cm4gbmVlZHNEaWN0aW9uYXJ5OworICAgIH0KIAotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBuZWVkc0lucHV0KCkgewotCQlyZXR1cm4gaW5SZWFkID09IGluTGVuZ3RoOwotCX0KKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBpbnB1dCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbmZsYXRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgc2V0SW5wdXR9IGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlCisgICAgICogICAgICAgICBpbmZsYXRpb24gY2FuIHByb2NlZWQuCisgICAgICogQHNlZSAjc2V0SW5wdXQoYnl0ZVtdKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBuZWVkc0lucHV0KCkgeworICAgICAgICByZXR1cm4gaW5SZWFkID09IGluTGVuZ3RoOworICAgIH0KIAotCS8qKgotCSAqIFJlc2V0cyB0aGUgSW5mbGF0ZXIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSB7QGNvZGUgSW5mbGF0ZXJ9LiBTaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIGluZmxhdGluZyBhIG5ldworICAgICAqIHNldCBvZiBkYXRhLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQkJZmluaXNoZWQgPSBmYWxzZTsKLQkJbmVlZHNEaWN0aW9uYXJ5ID0gZmFsc2U7Ci0JCWluTGVuZ3RoID0gaW5SZWFkID0gMDsKLQkJcmVzZXRJbXBsKHN0cmVhbUhhbmRsZSk7Ci0JfQorICAgICAgICBmaW5pc2hlZCA9IGZhbHNlOworICAgICAgICBuZWVkc0RpY3Rpb25hcnkgPSBmYWxzZTsKKyAgICAgICAgaW5MZW5ndGggPSBpblJlYWQgPSAwOworICAgICAgICByZXNldEltcGwoc3RyZWFtSGFuZGxlKTsKKyAgICB9CiAKLQlwcml2YXRlIG5hdGl2ZSBzeW5jaHJvbml6ZWQgdm9pZCByZXNldEltcGwobG9uZyBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0SW1wbChsb25nIGhhbmRsZSk7CiAKLQkvKioKLQkgKiBTZXRzIHRoZSBwcmVzZXQgZGljdGlvbmFyeSB0byBiZSB1c2VkIGZvciBpbmZsYXRpb24gdG8gYnVmLgotCSAqIG5lZWRzRGljdGlvbmFyeSgpIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgaW5wdXQKLQkgKiB3YXMgZGVmbGF0ZWQgdXNpbmcgYSBwcmVzZXQgZGljdGlvbmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmCi0JICogICAgICAgICAgICBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRpY3Rpb25hcnkgYnl0ZXMKLQkgKiBAc2VlICNuZWVkc0RpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGljdGlvbmFyeShieXRlW10gYnVmKSB7Ci0JCXNldERpY3Rpb25hcnkoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJlc2V0IGRpY3Rpb25hcnkgdG8gYmUgdXNlZCBmb3IgaW5mbGF0aW9uIHRvIHtAY29kZSBidWZ9LgorICAgICAqIHtAY29kZSBuZWVkc0RpY3Rpb25hcnkoKX0gY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY3VycmVudAorICAgICAqIGlucHV0IHdhcyBkZWZsYXRlZCB1c2luZyBhIHByZXNldCBkaWN0aW9uYXJ5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGljdGlvbmFyeSBieXRlcy4KKyAgICAgKiBAc2VlICNuZWVkc0RpY3Rpb25hcnkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGljdGlvbmFyeShieXRlW10gYnVmKSB7CisgICAgICAgIHNldERpY3Rpb25hcnkoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICB9CiAKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGljdGlvbmFyeShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbmJ5dGVzKSB7Ci0JCWlmIChzdHJlYW1IYW5kbGUgPT0gLTEpIHsKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAY29kZSBzZXREaWN0aW9uYXJ5KGJ5dGVbXSl9LCBhbGxvd2luZyB0byBkZWZpbmUgYSBzcGVjaWZpYyByZWdpb24KKyAgICAgKiBpbnNpZGUge0Bjb2RlIGJ1Zn0gdG8gYmUgdXNlZCBhcyBhIGRpY3Rpb25hcnkuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkaWN0aW9uYXJ5IGRhdGEgYnl0ZXMuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gbmJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhLgorICAgICAqIEBzZWUgI25lZWRzRGljdGlvbmFyeQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREaWN0aW9uYXJ5KGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMpIHsKKyAgICAgICAgaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCS8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKLQkJaWYgKG9mZiA8PSBidWYubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCi0JCQkJJiYgYnVmLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKKyAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgorICAgICAgICBpZiAob2ZmIDw9IGJ1Zi5sZW5ndGggJiYgbmJ5dGVzID49IDAgJiYgb2ZmID49IDAKKyAgICAgICAgICAgICAgICAmJiBidWYubGVuZ3RoIC0gb2ZmID49IG5ieXRlcykgewogICAgICAgICAgICAgc2V0RGljdGlvbmFyeUltcGwoYnVmLCBvZmYsIG5ieXRlcywgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotCX0KKyAgICB9CiAKLQlwcml2YXRlIG5hdGl2ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXREaWN0aW9uYXJ5SW1wbChieXRlW10gYnVmLCBpbnQgb2ZmLAotCQkJaW50IG5ieXRlcywgbG9uZyBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIHN5bmNocm9uaXplZCB2b2lkIHNldERpY3Rpb25hcnlJbXBsKGJ5dGVbXSBidWYsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgbmJ5dGVzLCBsb25nIGhhbmRsZSk7CiAKLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IGlucHV0IHRvIGJ1Zi4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmCi0JICogbmVlZHNJbnB1dCgpIHJldHVybnMgdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmCi0JICogICAgICAgICAgICBpbnB1dCBidWZmZXIKLQkgKiBAc2VlICNuZWVkc0lucHV0Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElucHV0KGJ5dGVbXSBidWYpIHsKLQkJc2V0SW5wdXQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBpbnB1dCB0byB0byBiZSBkZWNyb21wcmVzc2VkLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZQorICAgICAqIGNhbGxlZCBpZiB7QGNvZGUgbmVlZHNJbnB1dCgpfSByZXR1cm5zIHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBzZWUgI25lZWRzSW5wdXQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5wdXQoYnl0ZVtdIGJ1ZikgeworICAgICAgICBzZXRJbnB1dChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgaW5wdXQgdG8gdGhlIHJlZ2lvbiBvZiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBlbmRpbmcgYXQKLQkgKiBuYnl0ZXMgLSAxLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgbmVlZHNJbnB1dCgpIHJldHVybnMKLQkgKiB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBidWYKLQkgKiAgICAgICAgICAgIGlucHV0IGJ1ZmZlcgotCSAqIEBwYXJhbSBvZmYKLQkgKiAgICAgICAgICAgIG9mZnNldCB0byByZWFkIGZyb20gaW4gYnVmZmVyCi0JICogQHBhcmFtIG5ieXRlcwotCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLQkgKiBAc2VlICNuZWVkc0lucHV0Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElucHV0KGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMpIHsKLQkJaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgaW5wdXQgdG8gdGhlIHJlZ2lvbiBvZiB0aGUgaW5wdXQgYnVmZmVyIHN0YXJ0aW5nIGF0CisgICAgICoge0Bjb2RlIG9mZn0gYW5kIGVuZGluZyBhdCB7QGNvZGUgbmJ5dGVzIC0gMX0gd2hlcmUgZGF0YSBpcyB3cml0dGVuIGFmdGVyCisgICAgICogZGVjb21wcmVzc2lvbi4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHtAY29kZSBuZWVkc0lucHV0KCl9CisgICAgICogcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHJlYWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBuYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAc2VlICNuZWVkc0lucHV0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElucHV0KGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBuYnl0ZXMpIHsKKyAgICAgICAgaWYgKHN0cmVhbUhhbmRsZSA9PSAtMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCS8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWYKLQkJaWYgKG9mZiA8PSBidWYubGVuZ3RoICYmIG5ieXRlcyA+PSAwICYmIG9mZiA+PSAwCi0JCQkJJiYgYnVmLmxlbmd0aCAtIG9mZiA+PSBuYnl0ZXMpIHsKLQkJCWluUmVhZCA9IDA7Ci0JCQlpbkxlbmd0aCA9IG5ieXRlczsKLQkJCXNldElucHV0SW1wbChidWYsIG9mZiwgbmJ5dGVzLCBzdHJlYW1IYW5kbGUpOwotCQl9IGVsc2UgeworICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3csIGNoZWNrIG51bGwgYnVmCisgICAgICAgIGlmIChvZmYgPD0gYnVmLmxlbmd0aCAmJiBuYnl0ZXMgPj0gMCAmJiBvZmYgPj0gMAorICAgICAgICAgICAgICAgICYmIGJ1Zi5sZW5ndGggLSBvZmYgPj0gbmJ5dGVzKSB7CisgICAgICAgICAgICBpblJlYWQgPSAwOworICAgICAgICAgICAgaW5MZW5ndGggPSBuYnl0ZXM7CisgICAgICAgICAgICBzZXRJbnB1dEltcGwoYnVmLCBvZmYsIG5ieXRlcywgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCi0vLyBOb3RlOiBwYXNzX21hZ2ljX251bWJlcl9jaGVjayBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBzZXRJbnB1dCBpcyBjYWxsZWQKLS8vICAgICAgIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgZm9yIGEgc2luZ2xlIGJ5dGUuCi0vLyAgICAgICBTaW5jZSBzZXRJbnB1dCBpcyBjYWxsZWQgb25seSBieSBJbmZsYXRlcklucHV0U3RyZWFtLmZpbGwgd2l0aCBhbgotLy8gICAgICAgYXJiaXRyYXJ5IGJ5dGUgbGVuIHRoaXMgY2hlY2sgc2VlbXMgcXVpdGUgdXNlbGVzcy4KLS8vIEZJWE1FOiBXZSBzaG91bGQgZmluZCBvdXQgd2hldGhlciB0aGUgZmlyc3QgYnl0ZSBoYXMgdG8gYmUgdGhlIG1hZ2ljIG51bWJlcgotLy8gICAgICAgIGluIGFsbCBjYXNlcyBhbmQgY29ycmVjdCB0aGUgY2hlY2sgYXMgd2VsbCBhcyBwbGFjZSBpdCBpbgotLy8gICAgICAgIHNldEZpbGVJbnB1dCBhY2NvcmRpbmdseS4KLS8vICAgICAgICBBbmQgYXQgYSBmaXJzdCBnbGFuY2UgaXQgZG9lc24ndCBsb29rIGxpa2UgdGhlIGZpcnN0IGJ5dGUgaGFzIHRvIGJlIDEyMC4KLS8vIEVORCBhbmRyb2lkLWFkZGVkCi0JCWlmKCFnb3RGaXJzdEJ5dGUgJiYgbmJ5dGVzPjApCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBOb3RlOiAgcGFzc19tYWdpY19udW1iZXJfY2hlY2sgaXMgc2V0IHRvIGZhbHNlIHdoZW4gc2V0SW5wdXQgaXMKKyAgICAgICAgLy8gICAgICAgIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGZvciBhIHNpbmdsZSBieXRlLgorICAgICAgICAvLyAgICAgICAgU2luY2Ugc2V0SW5wdXQgaXMgY2FsbGVkIG9ubHkgYnkgSW5mbGF0ZXJJbnB1dFN0cmVhbS5maWxsCisgICAgICAgIC8vICAgICAgICB3aXRoIGFuIGFyYml0cmFyeSBieXRlIGxlbiB0aGlzIGNoZWNrIHNlZW1zIHF1aXRlIHVzZWxlc3MuCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZmluZCBvdXQgd2hldGhlciB0aGUgZmlyc3QgYnl0ZSBoYXMgdG8gYmUgdGhlIG1hZ2ljCisgICAgICAgIC8vICAgICAgICBudW1iZXIgaW4gYWxsIGNhc2VzIGFuZCBjb3JyZWN0IHRoZSBjaGVjayBhcyB3ZWxsIGFzIHBsYWNlIGl0CisgICAgICAgIC8vICAgICAgICBpbiBzZXRGaWxlSW5wdXQgYWNjb3JkaW5nbHkuCisgICAgICAgIC8vICAgICAgICBBbmQgYXQgYSBmaXJzdCBnbGFuY2UgaXQgZG9lc24ndCBsb29rIGxpa2UgdGhlIGZpcnN0IGJ5dGUgaGFzCisgICAgICAgIC8vICAgICAgICB0byBiZSAxMjAuCisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKKyAgICAgICAgaWYoIWdvdEZpcnN0Qnl0ZSAmJiBuYnl0ZXM+MCkKICAgICAgICAgewogICAgICAgICAgICBwYXNzX21hZ2ljX251bWJlcl9jaGVjayA9IChidWZbb2ZmXSA9PSBNQUdJQ19OVU1CRVIgfHwgbmJ5dGVzID4gMSk7ICAgICAgICAgICAKICAgICAgICAgICAgZ290Rmlyc3RCeXRlID0gdHJ1ZTsKICAgICAgICAgfQotCX0KKyAgICB9CiAKLQorICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGlucHV0IHRvIHRoZSByZWdpb24gd2l0aGluIGEgZmlsZSBzdGFydGluZyBhdCBvZmYgYW5kIGVuZGluZyBhdAotICAgICAqIG5ieXRlcyAtIDEuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBuZWVkc0lucHV0KCkgcmV0dXJucwotICAgICAqIHRydWUuCisgICAgICogU2V0cyB0aGUgY3VycmVudCBpbnB1dCB0byB0aGUgcmVnaW9uIHdpdGhpbiBhIGZpbGUgc3RhcnRpbmcgYXQge0Bjb2RlCisgICAgICogb2ZmfSBhbmQgZW5kaW5nIGF0IHtAY29kZSBuYnl0ZXMgLSAxfS4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAgICogaWYge0Bjb2RlIG5lZWRzSW5wdXQoKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIGlucHV0IGZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLgogICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCB0byByZWFkIGZyb20gaW4gYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHJlYWQgZnJvbSBpbiBidWZmZXIuCiAgICAgICogQHBhcmFtIG5ieXRlcwotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KICAgICAgKiBAc2VlICNuZWVkc0lucHV0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgc3luY2hyb25pemVkIGludCBzZXRGaWxlSW5wdXQoRmlsZURlc2NyaXB0b3IgZmQsIGxvbmcgb2ZmLCBpbnQgbmJ5dGVzKSB7CiAgICAgICAgIGlmIChzdHJlYW1IYW5kbGUgPT0gLTEpIHsKQEAgLTM2MSw0NCArNDI0LDQ3IEBACiAgICAgICAgIGluTGVuZ3RoID0gc2V0RmlsZUlucHV0SW1wbChmZCwgb2ZmLCBuYnl0ZXMsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBpbkxlbmd0aDsKICAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAotCS8qKgotCSAqIFJldHVybnMgYSBsb25nIGludCBvZiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgaW5wdXQgcmVhZCBieSB0aGUKLQkgKiBJbmZsYXRlci4KLQkgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgc2FtZSBhcyBnZXRUb3RhbEluIGV4Y2VwdCBpdCByZXR1cm5zIGEgCi0JICogbG9uZyB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFRvdGFsIGJ5dGVzIHJlYWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZXNSZWFkKCkgewotCQkvLyBUaHJvdyBOUEUgaGVyZQotCQlpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgdGhlIHtAY29kZSBJbmZsYXRlcn0uIFRoaXMKKyAgICAgKiBtZXRob2QgcGVyZm9ybXMgdGhlIHNhbWUgYXMge0Bjb2RlIGdldFRvdGFsSW4oKX0gZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBhCisgICAgICoge0Bjb2RlIGxvbmd9IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZXNSZWFkKCkgeworICAgICAgICAvLyBUaHJvdyBOUEUgaGVyZQorICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQotCQlyZXR1cm4gZ2V0VG90YWxJbkltcGwoc3RyZWFtSGFuZGxlKTsKLQl9CisgICAgICAgIHJldHVybiBnZXRUb3RhbEluSW1wbChzdHJlYW1IYW5kbGUpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgYSBsb25nIGludCBvZiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgaW5wdXQgb3V0cHV0IGJ5IHRoZQotCSAqIEluZmxhdGVyLgotCSAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBzYW1lIGFzIGdldFRvdGFsT3V0IGV4Y2VwdCBpdCByZXR1cm5zIGEgCi0JICogbG9uZyB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFRvdGFsIGJ5dGVzIG91dHB1dAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRCeXRlc1dyaXR0ZW4oKSB7Ci0JCS8vIFRocm93IE5QRSBoZXJlCi0JCWlmIChzdHJlYW1IYW5kbGUgPT0gLTEpIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGJ5IHRoZSB7QGNvZGUgSW5mbGF0ZXJ9LiBUaGlzCisgICAgICogbWV0aG9kIHBlcmZvcm1zIHRoZSBzYW1lIGFzIHtAY29kZSBnZXRUb3RhbE91dH0gZXhjZXB0IGl0IHJldHVybnMgYQorICAgICAqIHtAY29kZSBsb25nfSB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdG90YWwgYnl0ZXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZXNXcml0dGVuKCkgeworICAgICAgICAvLyBUaHJvdyBOUEUgaGVyZQorICAgICAgICBpZiAoc3RyZWFtSGFuZGxlID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQotCQlyZXR1cm4gZ2V0VG90YWxPdXRJbXBsKHN0cmVhbUhhbmRsZSk7Ci0JfQorICAgICAgICByZXR1cm4gZ2V0VG90YWxPdXRJbXBsKHN0cmVhbUhhbmRsZSk7CisgICAgfQogCi0JcHJpdmF0ZSBuYXRpdmUgc3luY2hyb25pemVkIHZvaWQgc2V0SW5wdXRJbXBsKGJ5dGVbXSBidWYsIGludCBvZmYsCi0JCQlpbnQgbmJ5dGVzLCBsb25nIGhhbmRsZSk7Ci0KLSAgICBwcml2YXRlIG5hdGl2ZSBzeW5jaHJvbml6ZWQgaW50IHNldEZpbGVJbnB1dEltcGwoRmlsZURlc2NyaXB0b3IgZmQsIGxvbmcgb2ZmLAorICAgIHByaXZhdGUgbmF0aXZlIHN5bmNocm9uaXplZCB2b2lkIHNldElucHV0SW1wbChieXRlW10gYnVmLCBpbnQgb2ZmLAogICAgICAgICAgICAgaW50IG5ieXRlcywgbG9uZyBoYW5kbGUpOwogCi0JcHJpdmF0ZSBuYXRpdmUgbG9uZyBjcmVhdGVTdHJlYW0oYm9vbGVhbiBub0hlYWRlcjEpOworICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICBwcml2YXRlIG5hdGl2ZSBzeW5jaHJvbml6ZWQgaW50IHNldEZpbGVJbnB1dEltcGwoRmlsZURlc2NyaXB0b3IgZmQsIGxvbmcgb2ZmLAorICAgICAgICAgICAgaW50IG5ieXRlcywgbG9uZyBoYW5kbGUpOworICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCisKKyAgICBwcml2YXRlIG5hdGl2ZSBsb25nIGNyZWF0ZVN0cmVhbShib29sZWFuIG5vSGVhZGVyMSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9JbmZsYXRlcklucHV0U3RyZWFtLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9JbmZsYXRlcklucHV0U3RyZWFtLmphdmEKaW5kZXggMmI1ZjRiMy4uNWQzYmRhMCAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0luZmxhdGVySW5wdXRTdHJlYW0uamF2YQpAQCAtMjIsMjg2ICsyMiwzMzIgQEAKIGltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogSW5mbGF0ZXJPdXRwdXRTdHJlYW0gcmVhZCBkYXRhIHdoaWNoIGhhcyBiZWVuIGNvbXByZXNzZWQgdXNpbmcgdGhlIERFRkxBVEUKLSAqIGNvbXByZXNzaW9uIG1ldGhvZC4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIEZpbHRlcklucHV0U3RyZWFtfSB0aGF0CisgKiB1bmNvbXByZXNzZXMgZGF0YSB0aGF0IHdhcyBjb21wcmVzc2VkIHVzaW5nIHRoZSA8aT5ERUZMQVRFPC9pPiBhbGdvcml0aG0KKyAqIChzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5nemlwLm9yZy9hbGdvcml0aG0udHh0Ij5zcGVjaWZpY2F0aW9uPC9hPikuCisgKiBCYXNpY2FsbHkgaXQgd3JhcHMgdGhlIHtAY29kZSBJbmZsYXRlcn0gY2xhc3MgYW5kIHRha2VzIGNhcmUgb2YgdGhlCisgKiBidWZmZXJpbmcuCiAgKiAKICAqIEBzZWUgSW5mbGF0ZXIKICAqIEBzZWUgRGVmbGF0ZXJPdXRwdXRTdHJlYW0KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW5mbGF0ZXJJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKIAotCXByb3RlY3RlZCBJbmZsYXRlciBpbmY7CisgICAgLyoqCisgICAgICogVGhlIGluZmxhdGVyIHVzZWQgZm9yIHRoaXMgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHByb3RlY3RlZCBJbmZsYXRlciBpbmY7CiAKLQlwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZjsKKyAgICAvKioKKyAgICAgKiBUaGUgaW5wdXQgYnVmZmVyIHVzZWQgZm9yIGRlY29tcHJlc3Npb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWY7CiAKLQlwcm90ZWN0ZWQgaW50IGxlbjsKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBsZW47CiAKLQlib29sZWFuIGNsb3NlZDsKKyAgICBib29sZWFuIGNsb3NlZDsKIAotCWJvb2xlYW4gZW9mOworICAgIGJvb2xlYW4gZW9mOwogCi0Jc3RhdGljIGZpbmFsIGludCBCVUZfU0laRSA9IDUxMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEJVRl9TSVpFID0gNTEyOwogCi0JaW50IG5hdGl2ZUVuZEJ1ZlNpemUgPSAwOworICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICBpbnQgbmF0aXZlRW5kQnVmU2l6ZSA9IDA7CisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgSW5mbGF0ZXJPdXRwdXRTdHJlYW0gb24gaXMKLQkgKiAKLQkgKiBAcGFyYW0gaXMgVGhlIElucHV0U3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tCi0JICovCi0JcHVibGljIEluZmxhdGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLQkJdGhpcyhpcywgbmV3IEluZmxhdGVyKCksIEJVRl9TSVpFKTsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBjb25zdHJ1Y3Rvci4gWW91IG9ubHkgbmVlZCB0byBwYXNzIHRoZSB7QGNvZGUKKyAgICAgKiBJbnB1dFN0cmVhbX0gZnJvbSB3aGljaCB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIHRvIGJlIHJlYWQgZnJvbS4gRGVmYXVsdAorICAgICAqIHNldHRpbmdzIGZvciB0aGUge0Bjb2RlIEluZmxhdGVyfSBhbmQgaW50ZXJuYWwgYnVmZmVyIGFyZSBiZSB1c2VkLiBJbgorICAgICAqIHBhcnRpY3VsYXIgdGhlIEluZmxhdGVyIGV4cGVjdHMgYSBaTElCIGhlYWRlciBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIGlzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIElucHV0U3RyZWFtfSB0byByZWFkIGRhdGEgZnJvbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5mbGF0ZXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgeworICAgICAgICB0aGlzKGlzLCBuZXcgSW5mbGF0ZXIoKSwgQlVGX1NJWkUpOworICAgIH0KIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgSW5mbGF0ZXJPdXRwdXRTdHJlYW0gb24gaXMsIHVzaW5nIHRoZSBJbmZsYXRlciBwcm92aWRlZAotCSAqIGluIGluZi4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIFRoZSBJbnB1dFN0cmVhbSB0byByZWFkIGRhdGEgZnJvbQotCSAqIEBwYXJhbSBpbmYKLQkgKiAgICAgICAgICAgIFRoZSBJbmZsYXRlciB0byB1c2UgZm9yIGRlY29tcHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgSW5mbGF0ZXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgSW5mbGF0ZXIgaW5mKSB7Ci0JCXRoaXMoaXMsIGluZiwgQlVGX1NJWkUpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGxldHMgeW91IHBhc3MgYSBzcGVjaWZpY2FsbHkgaW5pdGlhbGl6ZWQgSW5mbGF0ZXIsCisgICAgICogZm9yIGV4YW1wbGUgb25lIHRoYXQgZXhwZWN0cyBubyBaTElCIGhlYWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIHJlYWQgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBpbmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpYyB7QGNvZGUgSW5mbGF0ZXJ9IGZvciB1bmNvbXByZXNzaW5nIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wIAorICAgICAqLworICAgIHB1YmxpYyBJbmZsYXRlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBJbmZsYXRlciBpbmYpIHsKKyAgICAgICAgdGhpcyhpcywgaW5mLCBCVUZfU0laRSk7CisgICAgfQogCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBJbmZsYXRlck91dHB1dFN0cmVhbSBvbiBpcywgdXNpbmcgdGhlIEluZmxhdGVyIHByb3ZpZGVkCi0JICogaW4gaW5mLiBUaGUgc2l6ZSBvZiB0aGUgaW5mbGF0aW9uIGJ1ZmZlciBpcyBkZXRlcm1pbmVkIGJ5IGJzaXplLgotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqICAgICAgICAgICAgVGhlIElucHV0U3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tCi0JICogQHBhcmFtIGluZgotCSAqICAgICAgICAgICAgVGhlIEluZmxhdGVyIHRvIHVzZSBmb3IgZGVjb21wcmVzc2lvbgotCSAqIEBwYXJhbSBic2l6ZQotCSAqICAgICAgICAgICAgc2l6ZSBvZiB0aGUgaW5mbGF0aW9uIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBJbmZsYXRlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBJbmZsYXRlciBpbmYsIGludCBic2l6ZSkgewotCQlzdXBlcihpcyk7Ci0JCWlmIChpcyA9PSBudWxsIHx8IGluZiA9PSBudWxsKSB7CisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBsZXRzIHlvdSBzcGVjaWZ5IGJvdGggdGhlIHtAY29kZSBJbmZsYXRlcn0gYXMgd2VsbCBhcworICAgICAqIHRoZSBpbnRlcm5hbCBidWZmZXIgc2l6ZSB0byBiZSB1c2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcmVhZCBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIGluZgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmljIHtAY29kZSBJbmZsYXRlcn0gZm9yIHVuY29tcHJlc3NpbmcgZGF0YS4KKyAgICAgKiBAcGFyYW0gYnNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIHRvIGJlIHVzZWQgZm9yIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIEluZmxhdGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMsIEluZmxhdGVyIGluZiwgaW50IGJzaXplKSB7CisgICAgICAgIHN1cGVyKGlzKTsKKyAgICAgICAgaWYgKGlzID09IG51bGwgfHwgaW5mID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCWlmIChic2l6ZSA8PSAwKSB7CisgICAgICAgIGlmIChic2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQkJdGhpcy5pbmYgPSBpbmY7Ci0JCWlmIChpcyBpbnN0YW5jZW9mIFppcEZpbGUuUkFGU3RyZWFtKSB7Ci0JCSAgICBuYXRpdmVFbmRCdWZTaXplID0gYnNpemU7Ci0JCX0gZWxzZSB7Ci0JCSAgICBidWYgPSBuZXcgYnl0ZVtic2l6ZV07Ci0JCX0KLQl9CisgICAgICAgIHRoaXMuaW5mID0gaW5mOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgaWYgKGlzIGluc3RhbmNlb2YgWmlwRmlsZS5SQUZTdHJlYW0pIHsKKyAgICAgICAgICAgIG5hdGl2ZUVuZEJ1ZlNpemUgPSBic2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBieXRlW2JzaXplXTsKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgfQogCi0JLyoqCi0JICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBvZiBkZWNvbXByZXNzZWQgZGF0YS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJ5dGUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZwotCSAqLwotCUBPdmVycmlkZQorICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgb2YgZGVjb21wcmVzc2VkIGRhdGEuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyB0aGUgYnl0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYiA9IG5ldyBieXRlWzFdOwotCQlpZiAocmVhZChiLCAwLCAxKSA9PSAtMSkgeworICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWzFdOworICAgICAgICBpZiAocmVhZChiLCAwLCAxKSA9PSAtMSkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0JCXJldHVybiBiWzBdICYgMHhmZjsKLQl9CisgICAgICAgIHJldHVybiBiWzBdICYgMHhmZjsKKyAgICB9CiAKLQkvKioKLQkgKiBSZWFkcyB1cCB0byBuYnl0ZXMgb2YgZGVjb21wcmVzc2VkIGRhdGEgYW5kIHN0b3JlcyBpdCBpbiBidWYgc3RhcnRpbmcgYXQKLQkgKiBvZmYuCi0JICogCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqICAgICAgICAgICAgQnVmZmVyIHRvIHN0b3JlIGludG8KLQkgKiBAcGFyYW0gb2ZmCi0JICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmZmVyIHRvIHN0b3JlIGF0Ci0JICogQHBhcmFtIG5ieXRlcwotCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlCi0JICogQHJldHVybiBOdW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHJlYWQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHJlYWRpbmcKLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBSZWFkcyB1cCB0byB7QGNvZGUgbmJ5dGVzfSBvZiBkZWNvbXByZXNzZWQgZGF0YSBhbmQgc3RvcmVzIGl0IGluCisgICAgICoge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQge0Bjb2RlIG9mZn0uCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byB3cml0ZSBkYXRhIHRvLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBidWZmZXIgdG8gc3RhcnQgd3JpdGluZy4KKyAgICAgKiBAcGFyYW0gbmJ5dGVzCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgcmVhZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmYsIGludCBuYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8qIGFyY2hpdmUuMUU9U3RyZWFtIGlzIGNsb3NlZCAqLwotCQlpZiAoY2xvc2VkKSB7CisgICAgICAgIC8qIGFyY2hpdmUuMUU9U3RyZWFtIGlzIGNsb3NlZCAqLworICAgICAgICBpZiAoY2xvc2VkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjFFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotCQlpZiAobnVsbCA9PSBidWZmZXIpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gYnVmZmVyKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQogCi0JCWlmIChvZmYgPCAwIHx8IG5ieXRlcyA8IDAgfHwgb2ZmICsgbmJ5dGVzID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgICBpZiAob2ZmIDwgMCB8fCBuYnl0ZXMgPCAwIHx8IG9mZiArIG5ieXRlcyA+IGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAotCQlpZiAobmJ5dGVzID09IDApIHsKKyAgICAgICAgaWYgKG5ieXRlcyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogCi0JCWlmIChpbmYuZmluaXNoZWQoKSkgewotCQkJZW9mID0gdHJ1ZTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoaW5mLmZpbmlzaGVkKCkpIHsKKyAgICAgICAgICAgIGVvZiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQkvLyBhdm9pZCBpbnQgb3ZlcmZsb3csIGNoZWNrIG51bGwgYnVmZmVyCi0JCWlmIChvZmYgPD0gYnVmZmVyLmxlbmd0aCAmJiBuYnl0ZXMgPj0gMCAmJiBvZmYgPj0gMAotCQkJCSYmIGJ1ZmZlci5sZW5ndGggLSBvZmYgPj0gbmJ5dGVzKSB7Ci0JCQlkbyB7Ci0JCQkJaWYgKGluZi5uZWVkc0lucHV0KCkpIHsKKyAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZmZlcgorICAgICAgICBpZiAob2ZmIDw9IGJ1ZmZlci5sZW5ndGggJiYgbmJ5dGVzID49IDAgJiYgb2ZmID49IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXIubGVuZ3RoIC0gb2ZmID49IG5ieXRlcykgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChpbmYubmVlZHNJbnB1dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGwoKTsKICAgICAgICAgICAgICAgICB9Ci0JCQkJaW50IHJlc3VsdDsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHQgPSBpbmYuaW5mbGF0ZShidWZmZXIsIG9mZiwgbmJ5dGVzKTsKLQkJCQl9IGNhdGNoIChEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKGxlbiA9PSAtMSkgeworICAgICAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5mLmluZmxhdGUoYnVmZmVyLCBvZmYsIG5ieXRlcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgfQotCQkJCQl0aHJvdyAoSU9FeGNlcHRpb24pKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCQkJfQotCQkJCWlmIChyZXN1bHQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikobmV3IElPRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZi5maW5pc2hlZCgpKSB7Ci0JCQkJCWVvZiA9IHRydWU7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9IGVsc2UgaWYgKGluZi5uZWVkc0RpY3Rpb25hcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBlb2YgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmYubmVlZHNEaWN0aW9uYXJ5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKLQkJCQkvLyBJZiByZXN1bHQgPT0gMCwgZmlsbCgpIGFuZCB0cnkgYWdhaW4KKyAgICAgICAgICAgICAgICAvLyBJZiByZXN1bHQgPT0gMCwgZmlsbCgpIGFuZCB0cnkgYWdhaW4KICAgICAgICAgICAgICAgICB9Ci0JCQl9IHdoaWxlICh0cnVlKTsKLQkJfQotCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGZpbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoY2xvc2VkKSB7CisgICAgCisgICAgLyoqCisgICAgICogRmlsbHMgdGhlIGlucHV0IGJ1ZmZlciB3aXRoIGRhdGEgdG8gYmUgZGVjb21wcmVzc2VkLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiB7QGNvZGUgSU9FeGNlcHRpb259IG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsb3NlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4xRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0JCWlmIChuYXRpdmVFbmRCdWZTaXplID4gMCkgewotCQkgICAgWmlwRmlsZS5SQUZTdHJlYW0gaXMgPSAoWmlwRmlsZS5SQUZTdHJlYW0paW47Ci0JCSAgICBzeW5jaHJvbml6ZWQgKGlzLm1TaGFyZWRSYWYpIHsKLQkJICAgICAgICBsb25nIGxlbiA9IGlzLm1MZW5ndGggLSBpcy5tT2Zmc2V0OwotCQkgICAgICAgIGlmIChsZW4gPiBuYXRpdmVFbmRCdWZTaXplKSBsZW4gPSBuYXRpdmVFbmRCdWZTaXplOwotCQkgICAgICAgIGludCBjbnQgPSBpbmYuc2V0RmlsZUlucHV0KGlzLm1TaGFyZWRSYWYuZ2V0RkQoKSwgaXMubU9mZnNldCwgKGludCluYXRpdmVFbmRCdWZTaXplKTsKLQkJICAgICAgICBpcy5za2lwKGNudCk7Ci0JCSAgICB9Ci0JCX0gZWxzZSB7Ci0gICAgCQlpZiAoKGxlbiA9IGluLnJlYWQoYnVmKSkgPiAwKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBpZiAobmF0aXZlRW5kQnVmU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIFppcEZpbGUuUkFGU3RyZWFtIGlzID0gKFppcEZpbGUuUkFGU3RyZWFtKWluOworICAgICAgICAgICAgc3luY2hyb25pemVkIChpcy5tU2hhcmVkUmFmKSB7CisgICAgICAgICAgICAgICAgbG9uZyBsZW4gPSBpcy5tTGVuZ3RoIC0gaXMubU9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gbmF0aXZlRW5kQnVmU2l6ZSkgbGVuID0gbmF0aXZlRW5kQnVmU2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQgY250ID0gaW5mLnNldEZpbGVJbnB1dChpcy5tU2hhcmVkUmFmLmdldEZEKCksIGlzLm1PZmZzZXQsIChpbnQpbmF0aXZlRW5kQnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgaXMuc2tpcChjbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgewogICAgICAgICAgICAgICAgIGluZi5zZXRJbnB1dChidWYsIDAsIGxlbik7CiAgICAgICAgICAgICB9Ci0JCX0KLQl9CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorICAgIH0KIAotCS8qKgotCSAqIFNraXBzIHVwIHRvIG5ieXRlcyBvZiB1bmNvbXByZXNzZWQgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gbmJ5dGVzCi0JICogICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gc2tpcAotCSAqIEByZXR1cm4gTnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBza2lwcGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBza2lwcGluZwotCSAqLwotCUBPdmVycmlkZQorICAgIC8qKgorICAgICAqIFNraXBzIHVwIHRvIG4gYnl0ZXMgb2YgdW5jb21wcmVzc2VkIGRhdGEuCisgICAgICogCisgICAgICogQHBhcmFtIG5ieXRlcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgc2tpcHBlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHNraXBwaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChuYnl0ZXMgPj0gMCkgewotCQkJbG9uZyBjb3VudCA9IDAsIHJlbSA9IDA7Ci0JCQl3aGlsZSAoY291bnQgPCBuYnl0ZXMpIHsKLQkJCQlpbnQgeCA9IHJlYWQoYnVmLCAwLAotCQkJCQkJKHJlbSA9IG5ieXRlcyAtIGNvdW50KSA+IGJ1Zi5sZW5ndGggPyBidWYubGVuZ3RoCi0JCQkJCQkJCTogKGludCkgcmVtKTsKLQkJCQlpZiAoeCA9PSAtMSkgewotCQkJCQllb2YgPSB0cnVlOwotCQkJCQlyZXR1cm4gY291bnQ7Ci0JCQkJfQotCQkJCWNvdW50ICs9IHg7Ci0JCQl9Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KKyAgICAgICAgaWYgKG5ieXRlcyA+PSAwKSB7CisgICAgICAgICAgICBsb25nIGNvdW50ID0gMCwgcmVtID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IG5ieXRlcykgeworICAgICAgICAgICAgICAgIGludCB4ID0gcmVhZChidWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAocmVtID0gbmJ5dGVzIC0gY291bnQpID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50KSByZW0pOworICAgICAgICAgICAgICAgIGlmICh4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGVvZiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnQgKz0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyAwIGlmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCwgMSBvdGhlcndpc2UuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycwotCSAqLwotCUBPdmVycmlkZQorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBkYXRhIGNhbiBiZSByZWFkIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogCisgICAgICogQHJldHVybiAwIGlmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCwgMSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChjbG9zZWQpIHsKKyAgICAgICAgaWYgKGNsb3NlZCkgewogICAgICAgICAgICAgLy8gYXJjaGl2ZS4xRT1TdHJlYW0gaXMgY2xvc2VkCiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjFFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLQkJaWYgKGVvZikgeworICAgICAgICBpZiAoZW9mKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAotCS8qKgotCSAqIENsb3NlcyB0aGUgc3RyZWFtCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBjbG9zaW5nIHRoZSBzdHJlYW0KLQkgKi8KLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghY2xvc2VkKSB7Ci0JCQlpbmYuZW5kKCk7Ci0JCQljbG9zZWQgPSB0cnVlOwotCQkJZW9mID0gdHJ1ZTsKLQkJCXN1cGVyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCiAgICAgLyoqCi0JICogTWFya3MgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmVhbS4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG92ZXJyaWRlcyB0aGUgc3VwZXJ0eXBlIGltcGxlbWVudGF0aW9uIHRvIGRvIG5vdGhpbmcKLQkgKiBhdCBhbGwuCi0JICogCi0JICogQHBhcmFtIHJlYWRsaW1pdAotCSAqICAgICAgICAgICAgb2Ygbm8gdXNlCi0JICovCi0JQE92ZXJyaWRlCisgICAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBjbG9zaW5nIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWNsb3NlZCkgeworICAgICAgICAgICAgaW5mLmVuZCgpOworICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGVvZiA9IHRydWU7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb3ZlcnJpZGVzIHRoZSBzdXBlciB0eXBlIGltcGxlbWVudGF0aW9uIHRvIGRvIG5vdGhpbmcKKyAgICAgKiBhdCBhbGwuCisgICAgICogCisgICAgICogQHBhcmFtIHJlYWRsaW1pdAorICAgICAqICAgICAgICAgICAgb2Ygbm8gdXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQorICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQogCiAgICAgLyoqCi0JICogUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdHJlYW0gdG8gdGhlIGxhc3QgbWFyayBwb3NpdGlvbi4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG92ZXJyaWRlcyB0aGUgc3VwZXJ0eXBlIGltcGxlbWVudGF0aW9uIGFuZCBhbHdheXMKLQkgKiB0aHJvd3MgYW4ge0BsaW5rIElPRXhjZXB0aW9uIElPRXhjZXB0aW9ufSB3aGVuIGNhbGxlZC4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQKLQkgKi8KKyAgICAgKiBSZXNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHN0cmVhbSB0byB0aGUgbGFzdCBtYXJrZWQgcG9zaXRpb24uIFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvdmVycmlkZXMgdGhlIHN1cGVydHlwZSBpbXBsZW1lbnRhdGlvbiBhbmQgYWx3YXlzIHRocm93cworICAgICAqIGFuIHtAbGluayBJT0V4Y2VwdGlvbiBJT0V4Y2VwdGlvbn0gd2hlbiBjYWxsZWQuCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBtZXRob2QgaXMgY2FsbGVkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb257CiAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgIH0KICAgICAKICAgICAvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGltcGxlbWVudHMgbWFyayBzZW1hbnRpY3MuICBUaGlzIHR5cGUKLQkgKiBkb2VzIG5vdCBzdXBwb3J0IG1hcmssIHNvIGFsd2F5cyByZXNwb25kcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogQHJldHVybiBmYWxzZSAKLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGltcGxlbWVudHMge0Bjb2RlIG1hcmt9IHNlbWFudGljcy4gVGhpcyB0eXBlCisgICAgICogZG9lcyBub3Qgc3VwcG9ydCB7QGNvZGUgbWFyaygpfSwgc28gYWx3YXlzIHJlc3BvbmRzIHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHJldHVybiBmYWxzZSwgYWx3YXlzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwQ29uc3RhbnRzLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBDb25zdGFudHMuamF2YQppbmRleCA0YmI0Y2QzLi5kODA0YjBlIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBDb25zdGFudHMuamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBDb25zdGFudHMuamF2YQpAQCAtMjAsMTUgKzIwLDE1IEBACiAKIGludGVyZmFjZSBaaXBDb25zdGFudHMgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIExPQ1NJRyA9IDB4NDAzNGI1MCwgRVhUU0lHID0gMHg4MDc0YjUwLAotCQkJQ0VOU0lHID0gMHgyMDE0YjUwLCBFTkRTSUcgPSAweDYwNTRiNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIExPQ1NJRyA9IDB4NDAzNGI1MCwgRVhUU0lHID0gMHg4MDc0YjUwLAorICAgICAgICAgICAgQ0VOU0lHID0gMHgyMDE0YjUwLCBFTkRTSUcgPSAweDYwNTRiNTA7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NIRFIgPSAzMCwgRVhUSERSID0gMTYsIENFTkhEUiA9IDQ2LCBFTkRIRFIgPSAyMiwKLQkJCUxPQ1ZFUiA9IDQsIExPQ0ZMRyA9IDYsIExPQ0hPVyA9IDgsIExPQ1RJTSA9IDEwLCBMT0NDUkMgPSAxNCwKLQkJCUxPQ1NJWiA9IDE4LCBMT0NMRU4gPSAyMiwgTE9DTkFNID0gMjYsIExPQ0VYVCA9IDI4LCBFWFRDUkMgPSA0LAotCQkJRVhUU0laID0gOCwgRVhUTEVOID0gMTIsIENFTlZFTSA9IDQsIENFTlZFUiA9IDYsIENFTkZMRyA9IDgsCi0JCQlDRU5IT1cgPSAxMCwgQ0VOVElNID0gMTIsIENFTkNSQyA9IDE2LCBDRU5TSVogPSAyMCwgQ0VOTEVOID0gMjQsCi0JCQlDRU5OQU0gPSAyOCwgQ0VORVhUID0gMzAsIENFTkNPTSA9IDMyLCBDRU5EU0sgPSAzNCwgQ0VOQVRUID0gMzYsCi0JCQlDRU5BVFggPSAzOCwgQ0VOT0ZGID0gNDIsIEVORFNVQiA9IDgsIEVORFRPVCA9IDEwLCBFTkRTSVogPSAxMiwKLQkJCUVORE9GRiA9IDE2LCBFTkRDT00gPSAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NIRFIgPSAzMCwgRVhUSERSID0gMTYsIENFTkhEUiA9IDQ2LCBFTkRIRFIgPSAyMiwKKyAgICAgICAgICAgIExPQ1ZFUiA9IDQsIExPQ0ZMRyA9IDYsIExPQ0hPVyA9IDgsIExPQ1RJTSA9IDEwLCBMT0NDUkMgPSAxNCwKKyAgICAgICAgICAgIExPQ1NJWiA9IDE4LCBMT0NMRU4gPSAyMiwgTE9DTkFNID0gMjYsIExPQ0VYVCA9IDI4LCBFWFRDUkMgPSA0LAorICAgICAgICAgICAgRVhUU0laID0gOCwgRVhUTEVOID0gMTIsIENFTlZFTSA9IDQsIENFTlZFUiA9IDYsIENFTkZMRyA9IDgsCisgICAgICAgICAgICBDRU5IT1cgPSAxMCwgQ0VOVElNID0gMTIsIENFTkNSQyA9IDE2LCBDRU5TSVogPSAyMCwgQ0VOTEVOID0gMjQsCisgICAgICAgICAgICBDRU5OQU0gPSAyOCwgQ0VORVhUID0gMzAsIENFTkNPTSA9IDMyLCBDRU5EU0sgPSAzNCwgQ0VOQVRUID0gMzYsCisgICAgICAgICAgICBDRU5BVFggPSAzOCwgQ0VOT0ZGID0gNDIsIEVORFNVQiA9IDgsIEVORFRPVCA9IDEwLCBFTkRTSVogPSAxMiwKKyAgICAgICAgICAgIEVORE9GRiA9IDE2LCBFTkRDT00gPSAyMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEVudHJ5LmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBFbnRyeS5qYXZhCmluZGV4IGJkMzdmZWQuLjJjYzdhOWMgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEVudHJ5LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRW50cnkuamF2YQpAQCAtMzAsMjQgKzMwLDMwIEBACiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogCiAvKioKLSAqIFppcEVudHJ5IHJlcHJlc2VudHMgYW4gZW50cnkgaW4gYSB6aXAgZmlsZS4KKyAqIEFuIGluc3RhbmNlIG9mIHtAY29kZSBaaXBFbnRyeX0gcmVwcmVzZW50cyBhbiBlbnRyeSB3aXRoaW4gYSA8aT5aSVAtYXJjaGl2ZTwvaT4uCisgKiBBbiBlbnRyeSBoYXMgYXR0cmlidXRlcyBzdWNoIGFzIG5hbWUgKD0gcGF0aCkgb3IgdGhlIHNpemUgb2YgaXRzIGRhdGEuIFdoaWxlCisgKiBhbiBlbnRyeSBpZGVudGlmaWVzIGRhdGEgc3RvcmVkIGluIGFuIGFyY2hpdmUsIGl0IGRvZXMgbm90IGhvbGQgdGhlIGRhdGEKKyAqIGl0c2VsZi4gRm9yIGV4YW1wbGUgd2hlbiByZWFkaW5nIGEgPGk+WklQLWZpbGU8L2k+IHlvdSB3aWxsIGZpcnN0IHJldHJpZXZlCisgKiBhbGwgaXRzIGVudHJpZXMgaW4gYSBjb2xsZWN0aW9uIGFuZCB0aGVuIHJlYWQgdGhlIGRhdGEgZm9yIGEgc3BlY2lmaWMgZW50cnkKKyAqIHRocm91Z2ggYW4gaW5wdXQgc3RyZWFtLgogICogCiAgKiBAc2VlIFppcEZpbGUKLSAqIEBzZWUgWmlwSW5wdXRTdHJlYW0KKyAqIEBzZWUgWmlwT3V0cHV0U3RyZWFtCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFppcEVudHJ5IGltcGxlbWVudHMgWmlwQ29uc3RhbnRzLCBDbG9uZWFibGUgewotCVN0cmluZyBuYW1lLCBjb21tZW50OworICAgIFN0cmluZyBuYW1lLCBjb21tZW50OwogCi0JbG9uZyBjb21wcmVzc2VkU2l6ZSA9IC0xLCBjcmMgPSAtMSwgc2l6ZSA9IC0xOwotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICAgbG9uZyBkYXRhT2Zmc2V0ID0gLTE7Ci0vLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisgICAgbG9uZyBjb21wcmVzc2VkU2l6ZSA9IC0xLCBjcmMgPSAtMSwgc2l6ZSA9IC0xOworICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgIC8vIGxvbmcgZGF0YU9mZnNldCA9IC0xOworICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAotCWludCBjb21wcmVzc2lvbk1ldGhvZCA9IC0xLCB0aW1lID0gLTEsIG1vZERhdGUgPSAtMTsKKyAgICBpbnQgY29tcHJlc3Npb25NZXRob2QgPSAtMSwgdGltZSA9IC0xLCBtb2REYXRlID0gLTE7CiAKLQlieXRlW10gZXh0cmE7CisgICAgYnl0ZVtdIGV4dHJhOwogCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIC8qCiAgICAgICogRmllbGRzLCBwcmVzZW50IGluIHRoZSBDZW50cmFsIERpcmVjdG9yeSBFbnRyeSBhbmQgTG9jYWwgRmlsZSBFbnRyeS4KICAgICAgKgpAQCAtNjEsMTIgKzY3LDEyIEBACiAgICAgcHJpdmF0ZSBpbnQgbVZlcnNpb25NYWRlQnk7ICAgICAgICAgICAgIC8vIENERQogICAgIHByaXZhdGUgaW50IG1WZXJzaW9uVG9FeHRyYWN0OyAgICAgICAgICAvLyBDREUsIExGRQogICAgIHByaXZhdGUgaW50IG1HUEJpdEZsYWc7ICAgICAgICAgICAgICAgICAvLyBDREUsIExGRQotLy8gICAgcHJpdmF0ZSBpbnQgbUNvbXByZXNzaW9uTWV0aG9kOyAgICAgICAgIC8vIENERSwgTEZFICAgPSBjb21wcmVzc2lvbk1ldGhvZAotLy8gICAgcHJpdmF0ZSBpbnQgbUxhc3RNb2RGaWxlVGltZTsgICAgICAgICAgIC8vIENERSwgTEZFICAgPSB0aW1lCi0vLyAgICBwcml2YXRlIGludCBtTGFzdE1vZEZpbGVEYXRlOyAgICAgICAgICAgLy8gQ0RFLCBMRkUgICA9IG1vZERhdGUKLS8vICAgIHByaXZhdGUgbG9uZyBtQ1JDMzI7ICAgICAgICAgICAgICAgICAgICAvLyBDREUsIExGRSAgID0gY3JjCi0vLyAgICBwcml2YXRlIGxvbmcgbUNvbXByZXNzZWRTaXplOyAgICAgICAgICAgLy8gQ0RFLCBMRkUgICA9IGNvbXByZXNzZWRTaXplCi0vLyAgICBwcml2YXRlIGxvbmcgbVVuY29tcHJlc3NlZFNpemU7ICAgICAgICAgLy8gQ0RFLCBMRkUgICA9IHNpemUKKyAgICAvLyBwcml2YXRlIGludCBtQ29tcHJlc3Npb25NZXRob2Q7ICAgICAgICAgLy8gQ0RFLCBMRkUgICA9IGNvbXByZXNzaW9uTWV0aG9kCisgICAgLy8gcHJpdmF0ZSBpbnQgbUxhc3RNb2RGaWxlVGltZTsgICAgICAgICAgIC8vIENERSwgTEZFICAgPSB0aW1lCisgICAgLy8gcHJpdmF0ZSBpbnQgbUxhc3RNb2RGaWxlRGF0ZTsgICAgICAgICAgIC8vIENERSwgTEZFICAgPSBtb2REYXRlCisgICAgLy8gcHJpdmF0ZSBsb25nIG1DUkMzMjsgICAgICAgICAgICAgICAgICAgIC8vIENERSwgTEZFICAgPSBjcmMKKyAgICAvLyBwcml2YXRlIGxvbmcgbUNvbXByZXNzZWRTaXplOyAgICAgICAgICAgLy8gQ0RFLCBMRkUgICA9IGNvbXByZXNzZWRTaXplCisgICAgLy8gcHJpdmF0ZSBsb25nIG1VbmNvbXByZXNzZWRTaXplOyAgICAgICAgIC8vIENERSwgTEZFICAgPSBzaXplCiAgICAgaW50IG5hbWVMZW4sIGV4dHJhTGVuLCBjb21tZW50TGVuOwogICAgIC8vcHJpdmF0ZSBpbnQgbUZpbGVOYW1lTGVuZ3RoOyAgICAgICAgICAgIC8vIENERSwgTEZFCiAgICAgLy9wcml2YXRlIGludCBtRXh0cmFGaWVsZExlbmd0aDsgICAgICAgICAgLy8gQ0RFLCBMRkUKQEAgLTc1LDQzICs4MSw1MCBAQAogICAgIHByaXZhdGUgaW50IG1JbnRlcm5hbEF0dHJzOyAgICAgICAgICAgICAvLyBDREUKICAgICBwcml2YXRlIGxvbmcgbUV4dGVybmFsQXR0cnM7ICAgICAgICAgICAgLy8gQ0RFCiAgICAgbG9uZyBtTG9jYWxIZWFkZXJSZWxPZmZzZXQ7ICAgICAvLyBDREUgID8gZGF0YU9mZnNldAotLy8gICAgcHJpdmF0ZSBTdHJpbmcgbUZpbGVOYW1lOyAgICAgICAgICAgICAgIC8vIENERSwgTEZFICAgPSBuYW1lCi0vLyAgICBwcml2YXRlIGJ5dGVbXSBtRXh0cmFGaWVsZDsgICAgICAgICAgICAgLy8gQ0RFLCBMRkUgICA9IGV4dHJhCi0vLyAgICBwcml2YXRlIFN0cmluZyBtRmlsZUNvbW1lbnQ7ICAgICAgICAgICAgLy8gQ0RFICAgPSBjb21tZW50CisgICAgLy8gcHJpdmF0ZSBTdHJpbmcgbUZpbGVOYW1lOyAgICAgICAgICAgICAgIC8vIENERSwgTEZFICAgPSBuYW1lCisgICAgLy8gcHJpdmF0ZSBieXRlW10gbUV4dHJhRmllbGQ7ICAgICAgICAgICAgIC8vIENERSwgTEZFICAgPSBleHRyYQorICAgIC8vIHByaXZhdGUgU3RyaW5nIG1GaWxlQ29tbWVudDsgICAgICAgICAgICAvLyBDREUgICA9IGNvbW1lbnQKIAogCiAgICAgLy8gR1BCaXRGbGFnIDM6IHVzZXMgYSBEYXRhIERlc2NyaXB0b3IgYmxvY2sgKG5lZWQgZm9yIGRlZmxhdGVkIGRhdGEpCiAgICAgLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIGludCBVU0VTX0RBVEFfREVTQ1IgPSAweDAwMDg7CiAKLS8vICAgIHByaXZhdGUgc3RhdGljIENhbGVuZGFyIG1DYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgIC8vIHByaXZhdGUgc3RhdGljIENhbGVuZGFyIG1DYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAotCS8qKgotCSAqIFppcCBlbnRyeSBzdGF0ZTogRGVmbGF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZMQVRFRCA9IDg7CisgICAgLyoqCisgICAgICogWmlwIGVudHJ5IHN0YXRlOiBEZWZsYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZMQVRFRCA9IDg7CiAKLQkvKioKLQkgKiBaaXAgZW50cnkgc3RhdGU6IFN0b3JlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFRCA9IDA7CisgICAgLyoqCisgICAgICogWmlwIGVudHJ5IHN0YXRlOiBTdG9yZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVEID0gMDsKIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgWmlwRW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB6aXAgZW50cnkKLQkgKi8KLQlwdWJsaWMgWmlwRW50cnkoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgeworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFppcEVudHJ5fSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIFpJUCBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuYW1lIGxlbmd0aCBpcyBvdXRzaWRlIHRoZSByYW5nZSAoPiAweEZGRkYpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBaaXBFbnRyeShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDB4RkZGRikgeworICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDB4RkZGRikgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCXRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICBtVmVyc2lvbk1hZGVCeSA9IDB4MDMxNzsgICAgICAgIC8vIDAzPVVOSVgsIDE3PXNwZWMgdjIuMwogICAgICAgICBtVmVyc2lvblRvRXh0cmFjdCA9IDIwOyAgICAgICAgIC8vIG5lZWQgZGVmbGF0ZSwgbm90IG11Y2ggZWxzZQogICAgICAgICBtR1BCaXRGbGFnID0gMDsKQEAgLTEyOSwyNjkgKzE0MiwyODQgQEAKICAgICAgICAgbUxvY2FsSGVhZGVyUmVsT2Zmc2V0ID0gLTE7CiAgICAgICAgIGV4dHJhID0gbnVsbDsKICAgICAgICAgY29tbWVudCA9IG51bGw7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAotCX0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKKyAgICB9CiAKLQkvKioKLQkgKiBHZXRzIHRoZSBjb21tZW50IGZvciB0aGlzIFppcEVudHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbW1lbnQgZm9yIHRoaXMgWmlwRW50cnksIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gY29tbWVudAotICAgICAqCi0gICAgICogTm90ZSB0aGUgY29tbWVudCBkb2VzIG5vdCBsaXZlIGluIHRoZQotICAgICAqIExGSCwgb25seSB0aGUgQ0RFLiAgVGhpcyBtZWFucyB0aGF0LCBpZiB3ZSdyZSByZWFkaW5nIGFuIGFyY2hpdmUKLSAgICAgKiB3aXRoIFppcElucHV0U3RyZWFtLCB3ZSB3b24ndCBiZSBhYmxlIHRvIHNlZSB0aGUgY29tbWVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29tbWVudCBmb3IgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbW1lbnQgZm9yIHRoaXMge0Bjb2RlIFppcEVudHJ5fSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlCisgICAgICogICAgICAgICBpcyBubyBjb21tZW50LiBJZiB3ZSdyZSByZWFkaW5nIGFuIGFyY2hpdmUgd2l0aAorICAgICAqICAgICAgICAge0Bjb2RlIFppcElucHV0U3RyZWFtfSB0aGUgY29tbWVudCBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgfQogCi0JLyoqCi0JICogR2V0cyB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoaXMgWmlwRW50cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgY29tcHJlc3NlZCBzaXplLCBvciAtMSBpZiB0aGUgY29tcHJlc3NlZCBzaXplIGhhcyBub3QgYmVlbgotCSAqICAgICAgICAgc2V0Ci0JICovCi0JcHVibGljIGxvbmcgZ2V0Q29tcHJlc3NlZFNpemUoKSB7Ci0JCXJldHVybiBjb21wcmVzc2VkU2l6ZTsKLQl9CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoaXMge0Bjb2RlIFppcEVudHJ5fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wcmVzc2VkIHNpemUsIG9yIC0xIGlmIHRoZSBjb21wcmVzc2VkIHNpemUgaGFzIG5vdCBiZWVuCisgICAgICogICAgICAgICBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q29tcHJlc3NlZFNpemUoKSB7CisgICAgICAgIHJldHVybiBjb21wcmVzc2VkU2l6ZTsKKyAgICB9CiAKLQkvKioKLQkgKiBHZXRzIHRoZSBjcmMgZm9yIHRoaXMgWmlwRW50cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgY3JjLCBvciAtMSBpZiB0aGUgY3JjIGhhcyBub3QgYmVlbiBzZXQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRDcmMoKSB7Ci0JCXJldHVybiBjcmM7Ci0JfQorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNoZWNrc3VtIGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2hlY2tzdW0sIG9yIC0xIGlmIHRoZSBjaGVja3N1bSBoYXMgbm90IGJlZW4gc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENyYygpIHsKKyAgICAgICAgcmV0dXJuIGNyYzsKKyAgICB9CiAKLQkvKioKLQkgKiBHZXRzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBaaXBFbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBleHRyYSBpbmZvcm1hdGlvbiwgb3IgbnVsbCBpZiB0aGVyZQotCSAqICAgICAgICAgaXMgbm9uZQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0RXh0cmEoKSB7Ci0JCXJldHVybiBleHRyYTsKLQl9CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZXh0cmEgaW5mb3JtYXRpb24gZm9yIHRoaXMge0Bjb2RlIFppcEVudHJ5fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBleHRyYSBpbmZvcm1hdGlvbiwgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICB0aGVyZSBpcyBub25lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0RXh0cmEoKSB7CisgICAgICAgIHJldHVybiBleHRyYTsKKyAgICB9CiAKLQkvKioKLQkgKiBHZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgZm9yIHRoaXMgWmlwRW50cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgY29tcHJlc3Npb24gbWV0aG9kLCBlaXRoZXIgREVGTEFURUQsIFNUT1JFRCBvciAtMSBpZiB0aGUKLQkgKiAgICAgICAgIGNvbXByZXNzaW9uIG1ldGhvZCBoYXMgbm90IGJlZW4gc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRNZXRob2QoKSB7Ci0JCXJldHVybiBjb21wcmVzc2lvbk1ldGhvZDsKLQl9CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY29tcHJlc3Npb24gbWV0aG9kLCBlaXRoZXIge0Bjb2RlIERFRkxBVEVEfSwge0Bjb2RlIFNUT1JFRH0KKyAgICAgKiAgICAgICAgIG9yIC0xIGlmIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaGFzIG5vdCBiZWVuIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzaW9uTWV0aG9kOworICAgIH0KIAotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBaaXBFbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbnRyeSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW50cnkgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KIAotCS8qKgotCSAqIEdldHMgdGhlIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoaXMgWmlwRW50cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgdW5jb21wcmVzc2VkIHNpemUsIG9yIC0xIGlmIHRoZSBzaXplIGhhcyBub3QgYmVlbiBzZXQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHVuY29tcHJlc3NlZCBzaXplLCBvciB7QGNvZGUgLTF9IGlmIHRoZSBzaXplIGhhcyBub3QgYmVlbgorICAgICAqICAgICAgICAgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KIAotCS8qKgotCSAqIEdldHMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhpcyBaaXBFbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlCi0JICogICAgICAgICBKYW4uIDEsIDE5NzAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUaW1lKCkgewotCQlpZiAodGltZSAhPSAtMSkgewotCQkJR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0JCQljYWwuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKLQkJCWNhbC5zZXQoMTk4MCArICgobW9kRGF0ZSA+PiA5KSAmIDB4N2YpLCAoKG1vZERhdGUgPj4gNSkgJiAweGYpIC0gMSwKLQkJCQkJbW9kRGF0ZSAmIDB4MWYsICh0aW1lID4+IDExKSAmIDB4MWYsICh0aW1lID4+IDUpICYgMHgzZiwKLQkJCQkJKHRpbWUgJiAweDFmKSA8PCAxKTsKLQkJCXJldHVybiBjYWwuZ2V0VGltZSgpLmdldFRpbWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiAgICAgICAgIEphbi4gMSwgMTk3MC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lKCkgeworICAgICAgICBpZiAodGltZSAhPSAtMSkgeworICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKKyAgICAgICAgICAgIGNhbC5zZXQoMTk4MCArICgobW9kRGF0ZSA+PiA5KSAmIDB4N2YpLCAoKG1vZERhdGUgPj4gNSkgJiAweGYpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgbW9kRGF0ZSAmIDB4MWYsICh0aW1lID4+IDExKSAmIDB4MWYsICh0aW1lID4+IDUpICYgMHgzZiwKKyAgICAgICAgICAgICAgICAgICAgKHRpbWUgJiAweDFmKSA8PCAxKTsKKyAgICAgICAgICAgIHJldHVybiBjYWwuZ2V0VGltZSgpLmdldFRpbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoaXMgWmlwRW50cnkgaXMgYSBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoaXMgWmlwRW50cnkgaXMgYSBkaXJlY3RvcnksCi0JICogICAgICAgICA8Y29kZT5mYWxzZTxjb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAxKSA9PSAnLyc7Ci0JfQorICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHtAY29kZSBaaXBFbnRyeX0gaXMgYSBkaXJlY3RvcnkuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGlzIHtAY29kZSBaaXBFbnRyeX0gaXMgYSBkaXJlY3RvcnksIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAxKSA9PSAnLyc7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgY29tbWVudCBmb3IgdGhpcyBaaXBFbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogICAgICAgICAgICB0aGUgY29tbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmxlbmd0aCgpIDw9IDB4RkZGRikgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbW1lbnQgZm9yIHRoaXMge0Bjb2RlIFppcEVudHJ5fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgY29tbWVudCBmb3IgdGhpcyBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA8PSAweEZGRkYpIHsKICAgICAgICAgICAgIGNvbW1lbnQgPSBzdHJpbmc7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgY29tcHJlc3NlZCBzaXplIGZvciB0aGlzIFppcEVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGNvbXByZXNzZWQgc2l6ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXByZXNzZWRTaXplKGxvbmcgdmFsdWUpIHsKLQkJY29tcHJlc3NlZFNpemUgPSB2YWx1ZTsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcHJlc3NlZCBzaXplIGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgY29tcHJlc3NlZCBzaXplIChpbiBieXRlcykuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3NlZFNpemUobG9uZyB2YWx1ZSkgeworICAgICAgICBjb21wcmVzc2VkU2l6ZSA9IHZhbHVlOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdGhlIGNyYyBmb3IgdGhpcyBaaXBFbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBjcmMKLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHZhbHVlIGlzIDwgMCBvciA+IDB4RkZGRkZGRkZMCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JjKGxvbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMHhGRkZGRkZGRkwpIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGVja3N1bSBmb3IgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGNoZWNrc3VtIGZvciB0aGlzIGVudHJ5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbHVlfSBpcyA8IDAgb3IgPiAweEZGRkZGRkZGTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcmMobG9uZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAweEZGRkZGRkZGTCkgewogICAgICAgICAgICAgY3JjID0gdmFsdWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0cmEgaW5mb3JtYXRpb24gZm9yIHRoaXMgWmlwRW50cnkuCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBleHRyYSBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbGVuZ3RoIG9mIGRhdGEgaXMgPiAweEZGRkYgYnl0ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYShieXRlW10gZGF0YSkgewotCQlpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoIDw9IDB4RkZGRikgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIGxlbmd0aCBvZiBkYXRhIGlzIGdyZWF0ZXIgdGhhbiAweEZGRkYgYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0cmEoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCA8PSAweEZGRkYpIHsKICAgICAgICAgICAgIGV4dHJhID0gZGF0YTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgfQotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgZm9yIHRoaXMgWmlwRW50cnkuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgY29tcHJlc3Npb24gbWV0aG9kLCBlaXRoZXIgREVGTEFURUQgb3IgU1RPUkVECi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB3aGVuIHZhbHVlIGlzIG5vdCBERUZMQVRFRCBvciBTVE9SRUQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2QoaW50IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBTVE9SRUQgJiYgdmFsdWUgIT0gREVGTEFURUQpIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgZm9yIHRoaXMge0Bjb2RlIFppcEVudHJ5fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wcmVzc2lvbiBtZXRob2QsIGVpdGhlciB7QGNvZGUgREVGTEFURUR9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgU1RPUkVEfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdmFsdWUgaXMgbm90IHtAY29kZSBERUZMQVRFRH0gb3Ige0Bjb2RlIFNUT1JFRH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKGludCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gU1RPUkVEICYmIHZhbHVlICE9IERFRkxBVEVEKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQkJY29tcHJlc3Npb25NZXRob2QgPSB2YWx1ZTsKLQl9CisgICAgICAgIGNvbXByZXNzaW9uTWV0aG9kID0gdmFsdWU7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhpcyBaaXBFbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB1bmNvbXByZXNzZWQgc2l6ZQotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdmFsdWUgaXMgPCAwIG9yID4gMHhGRkZGRkZGRkwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKGxvbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMHhGRkZGRkZGRkwpIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdW5jb21wcmVzc2VkIHNpemUgZm9yIHRoaXMgZW50cnkuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsdWV9IDwgMCBvciB7QGNvZGUgdmFsdWV9ID4gMHhGRkZGRkZGRkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2l6ZShsb25nIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDB4RkZGRkZGRkZMKSB7CiAgICAgICAgICAgICBzaXplID0gdmFsdWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGlzIFppcEVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UKLQkgKiAgICAgICAgICAgIEphbi4gMSwgMTk3MAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWUobG9uZyB2YWx1ZSkgewotCQlHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLQkJY2FsLnNldFRpbWUobmV3IERhdGUodmFsdWUpKTsKLQkJaW50IHllYXIgPSBjYWwuZ2V0KENhbGVuZGFyLllFQVIpOwotCQlpZiAoeWVhciA8IDE5ODApIHsKLQkJCW1vZERhdGUgPSAweDIxOwotCQkJdGltZSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQltb2REYXRlID0gY2FsLmdldChDYWxlbmRhci5EQVRFKTsKLQkJCW1vZERhdGUgPSAoY2FsLmdldChDYWxlbmRhci5NT05USCkgKyAxIDw8IDUpIHwgbW9kRGF0ZTsKLQkJCW1vZERhdGUgPSAoKGNhbC5nZXQoQ2FsZW5kYXIuWUVBUikgLSAxOTgwKSA8PCA5KSB8IG1vZERhdGU7Ci0JCQl0aW1lID0gY2FsLmdldChDYWxlbmRhci5TRUNPTkQpID4+IDE7Ci0JCQl0aW1lID0gKGNhbC5nZXQoQ2FsZW5kYXIuTUlOVVRFKSA8PCA1KSB8IHRpbWU7Ci0JCQl0aW1lID0gKGNhbC5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpIDw8IDExKSB8IHRpbWU7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbi4KKyAgICAgKiAgICAgICAgICAgIDEsIDE5NzAuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZShsb25nIHZhbHVlKSB7CisgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICBjYWwuc2V0VGltZShuZXcgRGF0ZSh2YWx1ZSkpOworICAgICAgICBpbnQgeWVhciA9IGNhbC5nZXQoQ2FsZW5kYXIuWUVBUik7CisgICAgICAgIGlmICh5ZWFyIDwgMTk4MCkgeworICAgICAgICAgICAgbW9kRGF0ZSA9IDB4MjE7CisgICAgICAgICAgICB0aW1lID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vZERhdGUgPSBjYWwuZ2V0KENhbGVuZGFyLkRBVEUpOworICAgICAgICAgICAgbW9kRGF0ZSA9IChjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDEgPDwgNSkgfCBtb2REYXRlOworICAgICAgICAgICAgbW9kRGF0ZSA9ICgoY2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIDE5ODApIDw8IDkpIHwgbW9kRGF0ZTsKKyAgICAgICAgICAgIHRpbWUgPSBjYWwuZ2V0KENhbGVuZGFyLlNFQ09ORCkgPj4gMTsKKyAgICAgICAgICAgIHRpbWUgPSAoY2FsLmdldChDYWxlbmRhci5NSU5VVEUpIDw8IDUpIHwgdGltZTsKKyAgICAgICAgICAgIHRpbWUgPSAoY2FsLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSkgPDwgMTEpIHwgdGltZTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFppcEVudHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFppcEVudHJ5Ci0JICovCi0JQE92ZXJyaWRlCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFppcEVudHJ5fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQogCi0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vCVppcEVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgY29tbWVudCwgYnl0ZVtdIGV4dHJhLCBsb25nIG1vZFRpbWUsCi0vLwkJCWxvbmcgc2l6ZSwgbG9uZyBjb21wcmVzc2VkU2l6ZSwgbG9uZyBjcmMsIGludCBjb21wcmVzc2lvbk1ldGhvZCwKLS8vCQkJbG9uZyBtb2REYXRlLCBsb25nIG9mZnNldCkgewotLy8JCXRoaXMubmFtZSA9IG5hbWU7Ci0vLwkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLS8vCQl0aGlzLmV4dHJhID0gZXh0cmE7Ci0vLwkJdGltZSA9IChpbnQpIG1vZFRpbWU7Ci0vLwkJdGhpcy5zaXplID0gc2l6ZTsKLS8vCQl0aGlzLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7Ci0vLwkJdGhpcy5jcmMgPSBjcmM7Ci0vLwkJdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9IGNvbXByZXNzaW9uTWV0aG9kOwotLy8JCXRoaXMubW9kRGF0ZSA9IChpbnQpIG1vZERhdGU7Ci0vLwkJZGF0YU9mZnNldCA9IG9mZnNldDsKLS8vCX0KLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyBaaXBFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbW1lbnQsIGJ5dGVbXSBleHRyYSwgbG9uZyBtb2RUaW1lLAorICAgIC8vICAgICAgICAgbG9uZyBzaXplLCBsb25nIGNvbXByZXNzZWRTaXplLCBsb25nIGNyYywgaW50IGNvbXByZXNzaW9uTWV0aG9kLAorICAgIC8vICAgICAgICAgbG9uZyBtb2REYXRlLCBsb25nIG9mZnNldCkgeworICAgIC8vICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIC8vICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OworICAgIC8vICAgICB0aGlzLmV4dHJhID0gZXh0cmE7CisgICAgLy8gICAgIHRpbWUgPSAoaW50KSBtb2RUaW1lOworICAgIC8vICAgICB0aGlzLnNpemUgPSBzaXplOworICAgIC8vICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7CisgICAgLy8gICAgIHRoaXMuY3JjID0gY3JjOworICAgIC8vICAgICB0aGlzLmNvbXByZXNzaW9uTWV0aG9kID0gY29tcHJlc3Npb25NZXRob2Q7CisgICAgLy8gICAgIHRoaXMubW9kRGF0ZSA9IChpbnQpIG1vZERhdGU7CisgICAgLy8gICAgIGRhdGFPZmZzZXQgPSBvZmZzZXQ7CisgICAgLy8gfQorICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgWmlwRW50cnkgdXNpbmcgdGhlIHZhbHVlcyBvYnRhaW5lZCBmcm9tIHplLgotCSAqIAotCSAqIEBwYXJhbSB6ZQotCSAqICAgICAgICAgICAgWmlwRW50cnkgZnJvbSB3aGljaCB0byBvYnRhaW4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBaaXBFbnRyeShaaXBFbnRyeSB6ZSkgewotCQluYW1lID0gemUubmFtZTsKLQkJY29tbWVudCA9IHplLmNvbW1lbnQ7Ci0JCXRpbWUgPSB6ZS50aW1lOwotCQlzaXplID0gemUuc2l6ZTsKLQkJY29tcHJlc3NlZFNpemUgPSB6ZS5jb21wcmVzc2VkU2l6ZTsKLQkJY3JjID0gemUuY3JjOwotCQljb21wcmVzc2lvbk1ldGhvZCA9IHplLmNvbXByZXNzaW9uTWV0aG9kOwotCQltb2REYXRlID0gemUubW9kRGF0ZTsKLQkJZXh0cmEgPSB6ZS5leHRyYTsKLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8JCWRhdGFPZmZzZXQgPSB6ZS5kYXRhT2Zmc2V0OwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFppcEVudHJ5fSB1c2luZyB0aGUgdmFsdWVzIG9idGFpbmVkIGZyb20ge0Bjb2RlCisgICAgICogemV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB6ZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBaaXBFbnRyeX0gZnJvbSB3aGljaCB0byBvYnRhaW4gdmFsdWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBaaXBFbnRyeShaaXBFbnRyeSB6ZSkgeworICAgICAgICBuYW1lID0gemUubmFtZTsKKyAgICAgICAgY29tbWVudCA9IHplLmNvbW1lbnQ7CisgICAgICAgIHRpbWUgPSB6ZS50aW1lOworICAgICAgICBzaXplID0gemUuc2l6ZTsKKyAgICAgICAgY29tcHJlc3NlZFNpemUgPSB6ZS5jb21wcmVzc2VkU2l6ZTsKKyAgICAgICAgY3JjID0gemUuY3JjOworICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCA9IHplLmNvbXByZXNzaW9uTWV0aG9kOworICAgICAgICBtb2REYXRlID0gemUubW9kRGF0ZTsKKyAgICAgICAgZXh0cmEgPSB6ZS5leHRyYTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGRhdGFPZmZzZXQgPSB6ZS5kYXRhT2Zmc2V0OworICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgbVZlcnNpb25NYWRlQnkgPSB6ZS5tVmVyc2lvbk1hZGVCeTsKICAgICAgICAgbVZlcnNpb25Ub0V4dHJhY3QgPSB6ZS5tVmVyc2lvblRvRXh0cmFjdDsKICAgICAgICAgbUdQQml0RmxhZyA9IHplLm1HUEJpdEZsYWc7CkBAIC00MDEsNTMgKzQyOSwzNCBAQAogICAgICAgICBtSW50ZXJuYWxBdHRycyA9IHplLm1JbnRlcm5hbEF0dHJzOwogICAgICAgICBtRXh0ZXJuYWxBdHRycyA9IHplLm1FeHRlcm5hbEF0dHJzOwogICAgICAgICBtTG9jYWxIZWFkZXJSZWxPZmZzZXQgPSB6ZS5tTG9jYWxIZWFkZXJSZWxPZmZzZXQ7Ci0vLyAgICAgICAgaWYgKGUubUV4dHJhRmllbGQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgbUV4dHJhRmllbGQgPSBlLm1FeHRyYUZpZWxkLmNsb25lKCk7Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgICAgICBtRXh0cmFGaWVsZCA9IG51bGw7Ci0vLyAgICAgICAgbUZpbGVDb21tZW50ID0gZS5tRmlsZUNvbW1lbnQ7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAotCX0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgZW50cnkKLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGVudHJ5Ci0JICovCi0JQE92ZXJyaWRlCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGVudHJ5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgZW50cnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJcmV0dXJuIG5ldyBaaXBFbnRyeSh0aGlzKTsKLQl9Ci0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCi0vLyAgICAvKioKLS8vICAgICAqIFJldHVybiBhIGNvcHkgb2YgdGhpcyBlbnRyeS4gIFRoZSAiZXh0cmEiIGZpZWxkIHJlcXVpcmVzIHNwZWNpYWwKLS8vICAgICAqIGhhbmRsaW5nOyB1bmxpa2UgdGhlIFN0cmluZ3MgaXQncyBtdXRhYmxlLgotLy8gICAgICovCi0vLyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIFppcEVudHJ5IGNsb25lZEVudHJ5ID0gKFppcEVudHJ5KSBzdXBlci5jbG9uZSgpOwotLy8gICAgICAgICAgICBpZiAobUV4dHJhRmllbGQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgIGNsb25lZEVudHJ5Lm1FeHRyYUZpZWxkID0gKGJ5dGVbXSkgbUV4dHJhRmllbGQuY2xvbmUoKTsKLS8vICAgICAgICAgICAgcmV0dXJuIGNsb25lZEVudHJ5OwotLy8gICAgICAgIH0KLS8vICAgICAgICBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLS8vICAgICAgICAgICAgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotLy8gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotLy8gICAgICAgIH0KLS8vICAgIH0KLS8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgICAgIHJldHVybiBuZXcgWmlwRW50cnkodGhpcyk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaENvZGUgZm9yIHRoaXMgWmlwRW50cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgaGFzaENvZGUgb2YgdGhlIGVudHJ5Ci0JICovCi0JQE92ZXJyaWRlCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIG9mIHRoZSBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpOwotCX0KKyAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKKyAgICB9CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgLy8gcmVhZFNob3J0TEUgaXMgbm90IHVzZWQuCisgICAgLy8gcmVhZEludExFIGlzIHVzZWQgb25seSBvbmNlIGluIFppcEZpbGUuCiAgICAgLyoKICAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3Rvci4gIENyZWF0ZXMgYSBuZXcgWmlwRW50cnkgYnkgcmVhZGluZyB0aGUKICAgICAgKiBDZW50cmFsIERpcmVjdG9yeSBFbnRyeSBmcm9tICJpbiIsIHdoaWNoIG11c3QgYmUgcG9zaXRpb25lZCBhdApAQCAtNTUwLDkgKzU1OSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQotCi0KICAgICAvKnBhY2thZ2UqLyB2b2lkIHNldFZlcnNpb25Ub0V4dHJhY3QoaW50IHZlcnNpb24pIHsKICAgICAgICAgbVZlcnNpb25Ub0V4dHJhY3QgPSB2ZXJzaW9uOwogICAgIH0KQEAgLTU3NiwxMyArNTgyLDYgQEAKICAgICAgICAgbW9kRGF0ZSA9IGxhc3RNb2RGaWxlRGF0ZTsKICAgICB9CiAKLQotCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCi0vLyBOb3RlOiByZWFkU2hvcnRMRSBpcyBub3QgdXNlZCEKLS8vIHJlYWRJbnRMRSBpcyB1c2VkIG9ubHkgb25jZSBpbiBaaXBGaWxlLgotLy8gRU5EIGFuZHJvaWQtYWRkZWQKLQogICAgIC8qCiAgICAgICogUmVhZCBhIHR3by1ieXRlIHNob3J0IGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCiAgICAgICoKQEAgLTYxNiw4ICs2MTUsNiBAQAogICAgICAgICByZXR1cm4gYjAgfCAoYjEgPDwgOCkgfCAoYjIgPDwgMTYpIHwgKGIzIDw8IDI0KTsgLy8gQVRURU5USU9OOiBET0VTIFNJR04gRVhURU5TSU9OOiBJUyBUSElTIFdBTlRFRD8KICAgICB9CiAKLQotLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgc3RhdGljIGNsYXNzIExpdHRsZUVuZGlhblJlYWRlciB7CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIGIgPSBuZXcgYnl0ZVs0XTsKICAgICAgICAgYnl0ZVtdIGhkckJ1ZiA9IG5ldyBieXRlW0NFTkhEUl07CkBAIC02NDgsOCArNjQ1LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKLQogCiAgICAgLyoKICAgICAgKiBXcml0ZSBhIHR3by1ieXRlIHNob3J0IGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCkBAIC03ODIsNiArNzc3LDUgQEAKIAogICAgICAgICByZXR1cm4gQ0VOSERSICsgbmFtZUJ5dGVzLmxlbmd0aCArIGV4dHJhTGVuICsgY29tbWVudExlbjsKICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAotCisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIH0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEV4Y2VwdGlvbi5qYXZhIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXhjZXB0aW9uLmphdmEKaW5kZXggMDk1MWFiMS4uNTkwMTE3YiAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXhjZXB0aW9uLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXhjZXB0aW9uLmphdmEKQEAgLTIxLDMyICsyMSwzNiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogVGhpcyBydW50aW1lIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgWmlwRmlsZSBhbmQgWmlwSW5wdXRTdHJlYW0gd2hlbiB0aGUgZmlsZQotICogb3Igc3RyZWFtIGlzIG5vdCBhIHZhbGlkIHppcCBmaWxlLgorICogVGhpcyBydW50aW1lIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkge0Bjb2RlIFppcEZpbGV9IGFuZCB7QGNvZGUKKyAqIFppcElucHV0U3RyZWFtfSB3aGVuIHRoZSBmaWxlIG9yIHN0cmVhbSBpcyBub3QgYSB2YWxpZCBaSVAgZmlsZS4KICAqIAogICogQHNlZSBaaXBGaWxlCiAgKiBAc2VlIFppcElucHV0U3RyZWFtCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFppcEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwMDAxOTY4MzQwNjY3NDg2MjNMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwMDAxOTY4MzQwNjY3NDg2MjNMOwogCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KLQkgKi8KLQlwdWJsaWMgWmlwRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBaaXBFeGNlcHRpb259IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBaaXBFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQogCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0JICogZmlsbGVkIGluLgotCSAqIAotCSAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0JICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBaaXBFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKLQkJc3VwZXIoZGV0YWlsTWVzc2FnZSk7Ci0JfQorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFppcEV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBaaXBFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBGaWxlLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBGaWxlLmphdmEKaW5kZXggNTY4NDY5Yy4uZjE0MTVkOSAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRmlsZS5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEZpbGUuamF2YQpAQCAtMzEsMjIgKzMxLDIzIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiAKLQogLyoqCi0gKiBaaXBGaWxlIGlzIHVzZWQgdG8gcmVhZCB6aXAgZW50cmllcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBkYXRhIGZyb20gemlwIGZpbGVzLgorICogVGhpcyBjbGFzcyBwcm92aWRlcyByYW5kb20gcmVhZCBhY2Nlc3MgdG8gYSA8aT5aSVAtYXJjaGl2ZTwvaT4gZmlsZS4KKyAqIDxwPgorICogV2hpbGUge0Bjb2RlIFppcElucHV0U3RyZWFtfSBwcm92aWRlcyBzdHJlYW0gYmFzZWQgcmVhZCBhY2Nlc3MgdG8gYQorICogPGk+WklQLWFyY2hpdmU8L2k+LCB0aGlzIGNsYXNzIGltcGxlbWVudHMgbW9yZSBlZmZpY2llbnQgKGZpbGUgYmFzZWQpIGFjY2VzcworICogYW5kIG1ha2VzIHVzZSBvZiB0aGUgPGk+Y2VudHJhbCBkaXJlY3Rvcnk8L2k+IHdpdGhpbiBhIDxpPlpJUC1hcmNoaXZlPC9pPi4KKyAqIDwvcD4KKyAqIDxwPgorICogVXNlIHtAY29kZSBaaXBPdXRwdXRTdHJlYW19IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBhcmNoaXZlLgorICogPC9wPgorICogPHA+CisgKiBBIHRlbXBvcmFyeSBaSVAgZmlsZSBjYW4gYmUgbWFya2VkIGZvciBhdXRvbWF0aWMgZGVsZXRpb24gdXBvbiBjbG9zaW5nIGl0LgorICogPC9wPgogICogCi0gKiBAc2VlIFppcElucHV0U3RyZWFtCiAgKiBAc2VlIFppcEVudHJ5Ci0gKi8KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyByZWFkLW9ubHkgcmFuZG9tIGFjY2VzcyB0byBhIFppcCBhcmNoaXZlLgotICoKLSAqIFRoZSBlYXN5IHdheSB0byBkbyB0aGlzIHdvdWxkIGJlIHRvIHVzZSBaaXBJbnB1dFN0cmVhbSB0byBzY2FuIG91dAotICogdGhlIGVudHJpZXMuICBUaGlzIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gcmVhZGluZyB0aGUgY2VudHJhbCBkaXJlY3RvcnksCi0gKiBiZWNhdXNlIGl0IHJlcXVpcmVzIHBlcmZvcm1pbmcgc21hbGwgcmVhZHMgYXQgcG9pbnRzIGFjcm9zcyB0aGUgZW50aXJlCi0gKiBmaWxlLCByYXRoZXIgdGhhbiByZWFkaW5nIG9uZSBjb25jZW50cmF0ZWQgYmxvYi4KLSAqCi0gKiBVc2UgWmlwT3V0cHV0U3RyZWFtIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBhcmNoaXZlLgorICogQHNlZSBaaXBPdXRwdXRTdHJlYW0KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgWmlwRmlsZSBpbXBsZW1lbnRzIFppcENvbnN0YW50cyB7CiAKQEAgLTU2LDU1ICs1Nyw0NSBAQAogCiAgICAgLyoqCiAgICAgICogT3BlbiB6aXAgZmlsZSBmb3IgcmVhZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOX1JFQUQgPSAxOwogCiAgICAgLyoqCiAgICAgICogRGVsZXRlIHppcCBmaWxlIHdoZW4gY2xvc2VkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fREVMRVRFID0gNDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgWmlwRmlsZSBvcGVuZWQgb24gdGhlIHNwZWNpZmllZCBGaWxlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFppcEZpbGV9IHdpdGggdGhlIHNwZWNpZmllZCBmaWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgRmlsZQorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gcmVhZCBmcm9tLgorICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBaSVAgZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiB7QGNvZGUgSU9FeGNlcHRpb259IG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgWmlwRmlsZShGaWxlIGZpbGUpIHRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhmaWxlLCBPUEVOX1JFQUQpOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBaaXBGaWxlIG9wZW5lZCBvbiB0aGUgc3BlY2lmaWVkIEZpbGUgdXNpbmcgdGhlIHNwZWNpZmllZAotICAgICAqIG1vZGUuCisgICAgICogT3BlbnMgYSBmaWxlIGFzIDxpPlpJUC1hcmNoaXZlPC9pPi4gIm1vZGUiIG11c3QgYmUge0Bjb2RlIE9QRU5fUkVBRH0gb3IKKyAgICAgKiB7QGNvZGUgT1BFTl9ERUxFVEV9IC4gVGhlIGxhdHRlciBzZXRzIHRoZSAiZGVsZXRlIG9uIGV4aXQiIGZsYWcgdGhyb3VnaCBhCisgICAgICogZmlsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgdGhlIEZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBaSVAgZmlsZSB0byByZWFkLgogICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgICAgICAgICB0aGUgbW9kZSB0byB1c2UsIGVpdGhlciBPUEVOX1JFQUQgb3IgT1BFTl9SRUFEIHwgT1BFTl9ERUxFVEUKLSAgICAgKi8KLS8vICAgIHB1YmxpYyBaaXBGaWxlKEZpbGUgZmlsZSwgaW50IG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0vLyAgICAgICAgaWYgKG1vZGUgPT0gT1BFTl9SRUFEIHx8IG1vZGUgPT0gKE9QRU5fUkVBRCB8IE9QRU5fREVMRVRFKSkgewotLy8gICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGUuZ2V0UGF0aCgpOwotLy8gICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0vLyAgICAgICAgICAgIGlmIChzZWN1cml0eSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBzZWN1cml0eS5jaGVja1JlYWQoZmlsZU5hbWUpOwotLy8gICAgICAgICAgICAgICAgaWYgKChtb2RlICYgT1BFTl9ERUxFVEUpICE9IDApIHsKLS8vICAgICAgICAgICAgICAgICAgICBzZWN1cml0eS5jaGVja0RlbGV0ZShmaWxlTmFtZSk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKLS8vICAgICAgICAgICAgb3BlblppcCgpOwotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0gICAgLyoqCi0gICAgICogT3BlbiBhIFppcCBmaWxlLgotICAgICAqCi0gICAgICogIm1vZGUiIG11c3QgYmUgT1BFTl9SRUFEIG9yIE9QRU5fUkVBRHxPUEVOX0RFTEVURS4gIFRoZSBsYXR0ZXIKLSAgICAgKiBzZXRzIHRoZSAiZGVsZXRlIG9uIGV4aXQiIGZsYWcgdGhyb3VnaCBhIEZpbGUgb2JqZWN0LgorICAgICAqICAgICAgICAgICAgdGhlIG1vZGUgb2YgdGhlIGZpbGUgb3BlbiBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBaaXBGaWxlKEZpbGUgZmlsZSwgaW50IG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtb2RlID09IChPUEVOX1JFQUQgfCBPUEVOX0RFTEVURSkpCkBAIC0xMzIsNzMgKzEyMywyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgWmlwRmlsZSBvcGVuZWQgb24gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGggbmFtZS4KKyAgICAgKiBPcGVucyBhIFpJUCBhcmNoaXZlZCBmaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgcGF0aCBuYW1lCi0gICAgICovCi0vLyAgICBwdWJsaWMgWmlwRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0vLyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotLy8gICAgICAgIGlmIChzZWN1cml0eSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgIHNlY3VyaXR5LmNoZWNrUmVhZChmaWxlbmFtZSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGZpbGVOYW1lID0gZmlsZW5hbWU7Ci0vLyAgICAgICAgb3BlblppcCgpOwotLy8gICAgfQotICAgIC8qKgotICAgICAqIE9wZW4gYSBaaXAgZmlsZS4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIFpJUCBmaWxlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFppcEZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMobmV3IEZpbGUobmFtZSksIE9QRU5fUkVBRCk7CiAgICAgfQogCi0vKgotICAgIHByaXZhdGUgdm9pZCBvcGVuWmlwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IG9wZW5aaXBJbXBsKFV0aWwuZ2V0Qnl0ZXMoZmlsZU5hbWUpKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjI0IiwgZmlsZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjI1IiwgZmlsZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotKi8KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xvc2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhpcyBaaXBGaWxlLgotICAgICAqLwotLyoKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGNsb3NlIGluaXRpYWxpemVkIGluc3RhbmNlcwotICAgICAgICAgICAgY2xvc2VaaXBJbXBsKCk7Ci0gICAgICAgICAgICBpZiAoKG1vZGUgJiBPUEVOX0RFTEVURSkgIT0gMCkgewotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotKi8KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgWmlwIGZpbGUuCi0gICAgICoKLSAgICAgKiBUaGlzIGNvdWxkIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgZS5nLiBvbmNlIGV4cGxpY2l0bHkgYW5kIGFnYWluCi0gICAgICogYnkgdGhlIGZpbmFsaXplci4KLSAgICAgKgotICAgICAqIFRoZSBKYXZhIGRvYyBkb2Vzbid0IHNheSBhbnl0aGluZyBhYm91dCB3aGF0IG9wZXJhdGlvbnMgbGlrZQotICAgICAqIGVudHJpZXMoKSBvciBnZXROYW1lKCkgYXJlIHN1cHBvc2VkIHRvIGRvIGFmdGVyIHRoZSBmaWxlIGlzIGNsb3NlZC4KKyAgICAgKiBDbG9zZXMgdGhpcyBaSVAgZmlsZS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBtUmFmOwpAQCAtMjIxLDE3ICsxNjgsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIHppcCBlbnRyaWVzIGNvbnRhaW5lZCBpbiB0aGlzIFppcEZpbGUuCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgZW50cmllcy4gVGhlIGVudHJpZXMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgICAgKiBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgWklQIGFyY2hpdmUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBFbnVtZXJhdGlvbiBvZiB0aGUgemlwIGVudHJpZXMKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGVudHJpZXMuCi0gICAgICoKLSAgICAgKiBUaGUgZW50cmllcyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUKLSAgICAgKiBaaXAgYXJjaGl2ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgZW50cmllcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBlbnRyaWVzKCkgewogICAgICAgICByZXR1cm4gbmV3IEVudW1lcmF0aW9uPFppcEVudHJ5PigpIHsKQEAgLTI1MSwxNCArMTkzLDE0IEBACiAgICAgICAgIH07CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB6aXAgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIFppcEZpbGUuCisgICAgICogR2V0cyB0aGUgWklQIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhpcyB7QGNvZGUgWmlwRmlsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGVudHJ5TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IGluIHRoZSB6aXAgZmlsZQotICAgICAqIEByZXR1cm4gYSBaaXBFbnRyeSBvciBudWxsIGlmIHRoZSBlbnRyeSBuYW1lIGRvZXMgbm90IGV4aXN0IGluIHRoZSB6aXAKLSAgICAgKiAgICAgICAgIGZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgWklQIGZpbGUuCisgICAgICogQHJldHVybiBhIHtAY29kZSBaaXBFbnRyeX0gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBlbnRyeSBuYW1lIGRvZXMgbm90CisgICAgICogICAgICAgICBleGlzdCBpbiB0aGUgWklQIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFppcEVudHJ5IGdldEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpIHsKICAgICAgICAgaWYgKGVudHJ5TmFtZSAhPSBudWxsKSB7CkBAIC0yNjksMTMgKzIxMSwxNSBAQAogICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIG9uIHRoZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgWmlwRW50cnkuCisgICAgICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gb24gdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgWmlwRW50cnl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBlbnRyeQotICAgICAqICAgICAgICAgICAgdGhlIFppcEVudHJ5Ci0gICAgICogQHJldHVybiBhbiBpbnB1dCBzdHJlYW0gb24gdGhlIFppcEVudHJ5IGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBaaXBFbnRyeS4KKyAgICAgKiBAcmV0dXJuIGFuIGlucHV0IHN0cmVhbSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShaaXBFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLyoKQEAgLTMxMiwyOCArMjU2LDI3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiWmlwIEZpbGUgY2xvc2VkIik7CiAgICAgfQotICAgIAotICAgIAorCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmlsZSBuYW1lIG9mIHRoaXMgWmlwRmlsZS4KKyAgICAgKiBHZXRzIHRoZSBmaWxlIG5hbWUgb2YgdGhpcyB7QGNvZGUgWmlwRmlsZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlsZSBuYW1lIG9mIHRoaXMgWmlwRmlsZQorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGlzIHtAY29kZSBaaXBGaWxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBmaWxlTmFtZTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBaaXBFbnRyaWVzIGluIHRoaXMgWmlwRmlsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yge0Bjb2RlIFppcEVudHJpZXN9IGluIHRoaXMge0Bjb2RlIFppcEZpbGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBmaWxlCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIG1FbnRyeUxpc3Quc2l6ZSgpOwogICAgIH0KIAotCiAgICAgLyoKICAgICAgKiBGaW5kIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBhbmQgcmVhZCB0aGUgY29udGVudHMuCiAgICAgICoKQEAgLTQyMiw3ICszNjUsNiBAQAogICAgIC8qCiAgICAgICogTG9jYWwgZGF0YSBpdGVtcy4KICAgICAgKi8KLS8vICAgIHByaXZhdGUgU3RyaW5nIG1GaWxlTmFtZTsKICAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgbVJhZjsKIAogICAgIFppcEVudHJ5LkxpdHRsZUVuZGlhblJlYWRlciBsZXIgPSBuZXcgWmlwRW50cnkuTGl0dGxlRW5kaWFuUmVhZGVyKCk7CkBAIC00MzYsNyArMzc4LDYgQEAKICAgICBwcml2YXRlIEFycmF5TGlzdDxaaXBFbnRyeT4gbUVudHJ5TGlzdDsKICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBaaXBFbnRyeT4gbUZhc3RMb29rdXA7CiAKLQogICAgIC8qCiAgICAgICogV3JhcCBhIHN0cmVhbSBhcm91bmQgYSBSYW5kb21BY2Nlc3NGaWxlLiAgVGhlIFJhbmRvbUFjY2Vzc0ZpbGUKICAgICAgKiBpcyBzaGFyZWQgYW1vbmcgYWxsIHN0cmVhbXMgcmV0dXJuZWQgYnkgZ2V0SW5wdXRTdHJlYW0oKSwgc28gd2UKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcElucHV0U3RyZWFtLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDc2NTM3ZjYuLjhjNmE0YzUgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcElucHV0U3RyZWFtLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwSW5wdXRTdHJlYW0uamF2YQpAQCAtMjksNTUgKzI5LDc1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5VdGlsOwogCiAvKioKLSAqIFppcElucHV0U3RyZWFtIGlzIGFuIGlucHV0IHN0cmVhbSBmb3IgcmVhZGluZyB6aXAgZmlsZXMuCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHtAY29kZSBGaWx0ZXJJbnB1dFN0cmVhbX0gdGhhdAorICogdW5jb21wcmVzc2VzIGRhdGEgZnJvbSBhIDxpPlpJUC1hcmNoaXZlPC9pPiBpbnB1dCBzdHJlYW0uCisgKiA8cD4KKyAqIEEgPGk+WklQLWFyY2hpdmU8L2k+IGlzIGEgY29sbGVjdGlvbiBvZiBjb21wcmVzc2VkIChvciB1bmNvbXByZXNzZWQpIGZpbGVzIC0KKyAqIHRoZSBzbyBjYWxsZWQgWklQIGVudHJpZXMuIFRoZXJlZm9yZSB3aGVuIHJlYWRpbmcgZnJvbSBhIHtAY29kZQorICogWmlwSW5wdXRTdHJlYW19IGZpcnN0IHRoZSBlbnRyeSdzIGF0dHJpYnV0ZXMgd2lsbCBiZSByZXRyaWV2ZWQgd2l0aCB7QGNvZGUKKyAqIGdldE5leHRFbnRyeX0gYmVmb3JlIGl0cyBkYXRhIGlzIHJlYWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoaWxlIHtAY29kZSBJbmZsYXRlcklucHV0U3RyZWFtfSBjYW4gcmVhZCBhIGNvbXByZXNzZWQgPGk+WklQLWFyY2hpdmU8L2k+CisgKiBlbnRyeSwgdGhpcyBleHRlbnNpb24gY2FuIHJlYWQgdW5jb21wcmVzc2VkIGVudHJpZXMgYXMgd2VsbC4KKyAqIDwvcD4KKyAqIDxwPgorICogVXNlIHtAY29kZSBaaXBGaWxlfSBpZiB5b3UgY2FuIGFjY2VzcyB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUgZGlyZWN0bHkuCisgKiA8L3A+CiAgKiAKICAqIEBzZWUgWmlwRW50cnkKICAqIEBzZWUgWmlwRmlsZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBaaXBJbnB1dFN0cmVhbSBleHRlbmRzIEluZmxhdGVySW5wdXRTdHJlYW0gaW1wbGVtZW50cyBaaXBDb25zdGFudHMgewotCXN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQgPSA4OworICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQgPSA4OwogCi0Jc3RhdGljIGZpbmFsIGludCBTVE9SRUQgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVEID0gMDsKIAotCXN0YXRpYyBmaW5hbCBpbnQgWklQRGF0YURlc2NyaXB0b3JGbGFnID0gODsKKyAgICBzdGF0aWMgZmluYWwgaW50IFpJUERhdGFEZXNjcmlwdG9yRmxhZyA9IDg7CiAKLQlzdGF0aWMgZmluYWwgaW50IFpJUExvY2FsSGVhZGVyVmVyc2lvbk5lZWRlZCA9IDIwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkID0gMjA7CiAKLQlwcml2YXRlIGJvb2xlYW4gemlwQ2xvc2VkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHppcENsb3NlZCA9IGZhbHNlOwogCi0JcHJpdmF0ZSBib29sZWFuIGVudHJpZXNFbmQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZW50cmllc0VuZCA9IGZhbHNlOwogCi0JcHJpdmF0ZSBib29sZWFuIGhhc0REID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0REID0gZmFsc2U7CiAKLQlwcml2YXRlIGludCBlbnRyeUluID0gMDsKKyAgICBwcml2YXRlIGludCBlbnRyeUluID0gMDsKIAotCXByaXZhdGUgaW50IGluUmVhZCwgbGFzdFJlYWQgPSAwOworICAgIHByaXZhdGUgaW50IGluUmVhZCwgbGFzdFJlYWQgPSAwOwogCi0JWmlwRW50cnkgY3VycmVudEVudHJ5OworICAgIFppcEVudHJ5IGN1cnJlbnRFbnRyeTsKIAotCXByaXZhdGUgZmluYWwgYnl0ZVtdIGhkckJ1ZiA9IG5ldyBieXRlW0xPQ0hEUiAtIExPQ1ZFUl07CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaGRyQnVmID0gbmV3IGJ5dGVbTE9DSERSIC0gTE9DVkVSXTsKIAotCXByaXZhdGUgZmluYWwgQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDUkMzMiBjcmMgPSBuZXcgQ1JDMzIoKTsKIAotCXByaXZhdGUgYnl0ZVtdIG5hbWVCdWYgPSBuZXcgYnl0ZVsyNTZdOworICAgIHByaXZhdGUgYnl0ZVtdIG5hbWVCdWYgPSBuZXcgYnl0ZVsyNTZdOwogCi0JcHJpdmF0ZSBjaGFyW10gY2hhckJ1ZiA9IG5ldyBjaGFyWzI1Nl07CisgICAgcHJpdmF0ZSBjaGFyW10gY2hhckJ1ZiA9IG5ldyBjaGFyWzI1Nl07CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFppcElucHV0U3RyZWFtIG9uIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBzdHJlYW0KLQkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgWmlwSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCXN1cGVyKG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKHN0cmVhbSwgQlVGX1NJWkUpLCBuZXcgSW5mbGF0ZXIodHJ1ZSkpOwotCQlpZiAoc3RyZWFtID09IG51bGwpIHsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBaaXBJbnB1dFN0cmVhbX0gZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlcHJlc2VudGluZyBhIFpJUCBhcmNoaXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBaaXBJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgc3VwZXIobmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oc3RyZWFtLCBCVUZfU0laRSksIG5ldyBJbmZsYXRlcih0cnVlKSk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JLyoqCi0gICAgICogQ2xvc2VzIHRoaXMgWmlwSW5wdXRTdHJlYW0uCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMge0Bjb2RlIFppcElucHV0U3RyZWFtfS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtODgsMjgzICsxMDgsMjk4IEBACiAgICAgICAgIH0KICAgICB9CiAKLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgemlwIGVudHJ5IGFuZCBwb3NpdGlvbnMgdG8gcmVhZCB0aGUgbmV4dCBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHppcENsb3NlZCkgeworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgY3VycmVudCBaSVAgZW50cnkgYW5kIHBvc2l0aW9ucyB0byByZWFkIHRoZSBuZXh0IGVudHJ5LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiB7QGNvZGUgSU9FeGNlcHRpb259IG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHppcENsb3NlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4xRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0JCWlmIChjdXJyZW50RW50cnkgPT0gbnVsbCkgeworICAgICAgICBpZiAoY3VycmVudEVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCQlpZiAoY3VycmVudEVudHJ5IGluc3RhbmNlb2YgamF2YS51dGlsLmphci5KYXJFbnRyeSkgewotCQkJQXR0cmlidXRlcyB0ZW1wID0gKChKYXJFbnRyeSkgY3VycmVudEVudHJ5KS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAuY29udGFpbnNLZXkoImhpZGRlbiIpKSB7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSBpbnN0YW5jZW9mIGphdmEudXRpbC5qYXIuSmFyRW50cnkpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGVtcCA9ICgoSmFyRW50cnkpIGN1cnJlbnRFbnRyeSkuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wLmNvbnRhaW5zS2V5KCJoaWRkZW4iKSkgeyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotCQl9Ci0JCS8vIEVuc3VyZSBhbGwgZW50cnkgYnl0ZXMgYXJlIHJlYWQKLQkJc2tpcChMb25nLk1BWF9WQUxVRSk7Ci0JCWludCBpbkIsIG91dDsKLQkJaWYgKGN1cnJlbnRFbnRyeS5jb21wcmVzc2lvbk1ldGhvZCA9PSBERUZMQVRFRCkgewotCQkJaW5CID0gaW5mLmdldFRvdGFsSW4oKTsKLQkJCW91dCA9IGluZi5nZXRUb3RhbE91dCgpOwotCQl9IGVsc2UgewotCQkJaW5CID0gaW5SZWFkOwotCQkJb3V0ID0gaW5SZWFkOwotCQl9Ci0JCWludCBkaWZmID0gMDsKLQkJLy8gUHVzaGJhY2sgYW55IHJlcXVpcmVkIGJ5dGVzCi0JCWlmICgoZGlmZiA9IGVudHJ5SW4gLSBpbkIpICE9IDApIHsKKyAgICAgICAgfQorICAgICAgICAvLyBFbnN1cmUgYWxsIGVudHJ5IGJ5dGVzIGFyZSByZWFkCisgICAgICAgIHNraXAoTG9uZy5NQVhfVkFMVUUpOworICAgICAgICBpbnQgaW5CLCBvdXQ7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkuY29tcHJlc3Npb25NZXRob2QgPT0gREVGTEFURUQpIHsKKyAgICAgICAgICAgIGluQiA9IGluZi5nZXRUb3RhbEluKCk7CisgICAgICAgICAgICBvdXQgPSBpbmYuZ2V0VG90YWxPdXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluQiA9IGluUmVhZDsKKyAgICAgICAgICAgIG91dCA9IGluUmVhZDsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGlmZiA9IDA7CisgICAgICAgIC8vIFB1c2hiYWNrIGFueSByZXF1aXJlZCBieXRlcworICAgICAgICBpZiAoKGRpZmYgPSBlbnRyeUluIC0gaW5CKSAhPSAwKSB7CiAgICAgICAgICAgICAoKFB1c2hiYWNrSW5wdXRTdHJlYW0pIGluKS51bnJlYWQoYnVmLCBsZW4gLSBkaWZmLCBkaWZmKTsKICAgICAgICAgfQogCi0JCWlmIChoYXNERCkgewotCQkJaW4ucmVhZChoZHJCdWYsIDAsIEVYVEhEUik7Ci0JCQlpZiAoZ2V0TG9uZyhoZHJCdWYsIDApICE9IEVYVFNJRykgeworICAgICAgICBpZiAoaGFzREQpIHsKKyAgICAgICAgICAgIGluLnJlYWQoaGRyQnVmLCAwLCBFWFRIRFIpOworICAgICAgICAgICAgaWYgKGdldExvbmcoaGRyQnVmLCAwKSAhPSBFWFRTSUcpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4xRiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQotCQkJY3VycmVudEVudHJ5LmNyYyA9IGdldExvbmcoaGRyQnVmLCBFWFRDUkMpOwotCQkJY3VycmVudEVudHJ5LmNvbXByZXNzZWRTaXplID0gZ2V0TG9uZyhoZHJCdWYsIEVYVFNJWik7Ci0JCQljdXJyZW50RW50cnkuc2l6ZSA9IGdldExvbmcoaGRyQnVmLCBFWFRMRU4pOwotCQl9Ci0JCWlmIChjdXJyZW50RW50cnkuY3JjICE9IGNyYy5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICBjdXJyZW50RW50cnkuY3JjID0gZ2V0TG9uZyhoZHJCdWYsIEVYVENSQyk7CisgICAgICAgICAgICBjdXJyZW50RW50cnkuY29tcHJlc3NlZFNpemUgPSBnZXRMb25nKGhkckJ1ZiwgRVhUU0laKTsKKyAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5zaXplID0gZ2V0TG9uZyhoZHJCdWYsIEVYVExFTik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5jcmMgIT0gY3JjLmdldFZhbHVlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjIwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLQkJaWYgKGN1cnJlbnRFbnRyeS5jb21wcmVzc2VkU2l6ZSAhPSBpbkIgfHwgY3VycmVudEVudHJ5LnNpemUgIT0gb3V0KSB7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkuY29tcHJlc3NlZFNpemUgIT0gaW5CIHx8IGN1cnJlbnRFbnRyeS5zaXplICE9IG91dCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMjEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0JCWluZi5yZXNldCgpOwotCQlsYXN0UmVhZCA9IGluUmVhZCA9IGVudHJ5SW4gPSBsZW4gPSAwOwotCQljcmMucmVzZXQoKTsKLQkJY3VycmVudEVudHJ5ID0gbnVsbDsKLQl9CisgICAgICAgIGluZi5yZXNldCgpOworICAgICAgICBsYXN0UmVhZCA9IGluUmVhZCA9IGVudHJ5SW4gPSBsZW4gPSAwOworICAgICAgICBjcmMucmVzZXQoKTsKKyAgICAgICAgY3VycmVudEVudHJ5ID0gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZWFkcyB0aGUgbmV4dCB6aXAgZW50cnkgZnJvbSB0aGlzIFppcElucHV0U3RyZWFtLgotCSAqLwotCXB1YmxpYyBaaXBFbnRyeSBnZXROZXh0RW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoY3VycmVudEVudHJ5ICE9IG51bGwpIHsKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoaXMge0Bjb2RlIFppcElucHV0U3RyZWFtfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHtAY29kZSBaaXBFbnRyeX0gY29udGFpbmVkIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdHJlYW0gaXMgbm90IHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBlbnRyeQorICAgICAqICAgICAgICAgICAgIG9yIGlmIGFuIG90aGVyIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgorICAgICAqIEBzZWUgWmlwRW50cnkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwRW50cnkgZ2V0TmV4dEVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjbG9zZUVudHJ5KCk7CiAgICAgICAgIH0KLQkJaWYgKGVudHJpZXNFbmQpIHsKKyAgICAgICAgaWYgKGVudHJpZXNFbmQpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKLQkJaW50IHggPSAwLCBjb3VudCA9IDA7Ci0JCXdoaWxlIChjb3VudCAhPSA0KSB7Ci0JCQljb3VudCArPSB4ID0gaW4ucmVhZChoZHJCdWYsIGNvdW50LCA0IC0gY291bnQpOwotCQkJaWYgKHggPT0gLTEpIHsKKyAgICAgICAgaW50IHggPSAwLCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChjb3VudCAhPSA0KSB7CisgICAgICAgICAgICBjb3VudCArPSB4ID0gaW4ucmVhZChoZHJCdWYsIGNvdW50LCA0IC0gY291bnQpOworICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLQkJfQotCQlsb25nIGhkciA9IGdldExvbmcoaGRyQnVmLCAwKTsKLQkJaWYgKGhkciA9PSBDRU5TSUcpIHsKLQkJCWVudHJpZXNFbmQgPSB0cnVlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGhkciAhPSBMT0NTSUcpIHsKKyAgICAgICAgfQorICAgICAgICBsb25nIGhkciA9IGdldExvbmcoaGRyQnVmLCAwKTsKKyAgICAgICAgaWYgKGhkciA9PSBDRU5TSUcpIHsKKyAgICAgICAgICAgIGVudHJpZXNFbmQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhkciAhPSBMT0NTSUcpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKLQkJLy8gUmVhZCB0aGUgbG9jYWwgaGVhZGVyCi0JCWNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50ICE9IChMT0NIRFIgLSBMT0NWRVIpKSB7Ci0JCQljb3VudCArPSB4ID0gaW4ucmVhZChoZHJCdWYsIGNvdW50LCAoTE9DSERSIC0gTE9DVkVSKSAtIGNvdW50KTsKLQkJCWlmICh4ID09IC0xKSB7CisgICAgICAgIC8vIFJlYWQgdGhlIGxvY2FsIGhlYWRlcgorICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChjb3VudCAhPSAoTE9DSERSIC0gTE9DVkVSKSkgeworICAgICAgICAgICAgY291bnQgKz0geCA9IGluLnJlYWQoaGRyQnVmLCBjb3VudCwgKExPQ0hEUiAtIExPQ1ZFUikgLSBjb3VudCk7CisgICAgICAgICAgICBpZiAoeCA9PSAtMSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0KLQkJfQotCQlpbnQgdmVyc2lvbiA9IGdldFNob3J0KGhkckJ1ZiwgMCkgJiAweGZmOwotCQlpZiAodmVyc2lvbiA+IFpJUExvY2FsSGVhZGVyVmVyc2lvbk5lZWRlZCkgeworICAgICAgICB9CisgICAgICAgIGludCB2ZXJzaW9uID0gZ2V0U2hvcnQoaGRyQnVmLCAwKSAmIDB4ZmY7CisgICAgICAgIGlmICh2ZXJzaW9uID4gWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4yMiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0JCWludCBmbGFncyA9IGdldFNob3J0KGhkckJ1ZiwgTE9DRkxHIC0gTE9DVkVSKTsKLQkJaGFzREQgPSAoKGZsYWdzICYgWklQRGF0YURlc2NyaXB0b3JGbGFnKSA9PSBaSVBEYXRhRGVzY3JpcHRvckZsYWcpOwotCQlpbnQgY2V0aW1lID0gZ2V0U2hvcnQoaGRyQnVmLCBMT0NUSU0gLSBMT0NWRVIpOwotCQlpbnQgY2Vtb2REYXRlID0gZ2V0U2hvcnQoaGRyQnVmLCBMT0NUSU0gLSBMT0NWRVIgKyAyKTsKLQkJaW50IGNlY29tcHJlc3Npb25NZXRob2QgPSBnZXRTaG9ydChoZHJCdWYsIExPQ0hPVyAtIExPQ1ZFUik7Ci0JCWxvbmcgY2VjcmMgPSAwLCBjZWNvbXByZXNzZWRTaXplID0gMCwgY2VzaXplID0gLTE7Ci0JCWlmICghaGFzREQpIHsKLQkJCWNlY3JjID0gZ2V0TG9uZyhoZHJCdWYsIExPQ0NSQyAtIExPQ1ZFUik7Ci0JCQljZWNvbXByZXNzZWRTaXplID0gZ2V0TG9uZyhoZHJCdWYsIExPQ1NJWiAtIExPQ1ZFUik7Ci0JCQljZXNpemUgPSBnZXRMb25nKGhkckJ1ZiwgTE9DTEVOIC0gTE9DVkVSKTsKLQkJfQotCQlpbnQgZmxlbiA9IGdldFNob3J0KGhkckJ1ZiwgTE9DTkFNIC0gTE9DVkVSKTsKLQkJaWYgKGZsZW4gPT0gMCkgeworICAgICAgICBpbnQgZmxhZ3MgPSBnZXRTaG9ydChoZHJCdWYsIExPQ0ZMRyAtIExPQ1ZFUik7CisgICAgICAgIGhhc0REID0gKChmbGFncyAmIFpJUERhdGFEZXNjcmlwdG9yRmxhZykgPT0gWklQRGF0YURlc2NyaXB0b3JGbGFnKTsKKyAgICAgICAgaW50IGNldGltZSA9IGdldFNob3J0KGhkckJ1ZiwgTE9DVElNIC0gTE9DVkVSKTsKKyAgICAgICAgaW50IGNlbW9kRGF0ZSA9IGdldFNob3J0KGhkckJ1ZiwgTE9DVElNIC0gTE9DVkVSICsgMik7CisgICAgICAgIGludCBjZWNvbXByZXNzaW9uTWV0aG9kID0gZ2V0U2hvcnQoaGRyQnVmLCBMT0NIT1cgLSBMT0NWRVIpOworICAgICAgICBsb25nIGNlY3JjID0gMCwgY2Vjb21wcmVzc2VkU2l6ZSA9IDAsIGNlc2l6ZSA9IC0xOworICAgICAgICBpZiAoIWhhc0REKSB7CisgICAgICAgICAgICBjZWNyYyA9IGdldExvbmcoaGRyQnVmLCBMT0NDUkMgLSBMT0NWRVIpOworICAgICAgICAgICAgY2Vjb21wcmVzc2VkU2l6ZSA9IGdldExvbmcoaGRyQnVmLCBMT0NTSVogLSBMT0NWRVIpOworICAgICAgICAgICAgY2VzaXplID0gZ2V0TG9uZyhoZHJCdWYsIExPQ0xFTiAtIExPQ1ZFUik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGZsZW4gPSBnZXRTaG9ydChoZHJCdWYsIExPQ05BTSAtIExPQ1ZFUik7CisgICAgICAgIGlmIChmbGVuID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjIzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLQkJaW50IGVsZW4gPSBnZXRTaG9ydChoZHJCdWYsIExPQ0VYVCAtIExPQ1ZFUik7CisgICAgICAgIGludCBlbGVuID0gZ2V0U2hvcnQoaGRyQnVmLCBMT0NFWFQgLSBMT0NWRVIpOwogCi0JCWNvdW50ID0gMDsKLQkJaWYgKGZsZW4gPiBuYW1lQnVmLmxlbmd0aCkgewotCQkJbmFtZUJ1ZiA9IG5ldyBieXRlW2ZsZW5dOwotCQkJY2hhckJ1ZiA9IG5ldyBjaGFyW2ZsZW5dOwotCQl9Ci0JCXdoaWxlIChjb3VudCAhPSBmbGVuKSB7Ci0JCQljb3VudCArPSB4ID0gaW4ucmVhZChuYW1lQnVmLCBjb3VudCwgZmxlbiAtIGNvdW50KTsKLQkJCWlmICh4ID09IC0xKSB7CisgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgaWYgKGZsZW4gPiBuYW1lQnVmLmxlbmd0aCkgeworICAgICAgICAgICAgbmFtZUJ1ZiA9IG5ldyBieXRlW2ZsZW5dOworICAgICAgICAgICAgY2hhckJ1ZiA9IG5ldyBjaGFyW2ZsZW5dOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjb3VudCAhPSBmbGVuKSB7CisgICAgICAgICAgICBjb3VudCArPSB4ID0gaW4ucmVhZChuYW1lQnVmLCBjb3VudCwgZmxlbiAtIGNvdW50KTsKKyAgICAgICAgICAgIGlmICh4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQotCQl9Ci0JCWN1cnJlbnRFbnRyeSA9IGNyZWF0ZVppcEVudHJ5KFV0aWwuY29udmVydFVURjhXaXRoQnVmKG5hbWVCdWYsIGNoYXJCdWYsCi0JCQkJMCwgZmxlbikpOwotCQljdXJyZW50RW50cnkudGltZSA9IGNldGltZTsKLQkJY3VycmVudEVudHJ5Lm1vZERhdGUgPSBjZW1vZERhdGU7Ci0JCWN1cnJlbnRFbnRyeS5zZXRNZXRob2QoY2Vjb21wcmVzc2lvbk1ldGhvZCk7Ci0JCWlmIChjZXNpemUgIT0gLTEpIHsKLQkJCWN1cnJlbnRFbnRyeS5zZXRDcmMoY2VjcmMpOwotCQkJY3VycmVudEVudHJ5LnNldFNpemUoY2VzaXplKTsKLQkJCWN1cnJlbnRFbnRyeS5zZXRDb21wcmVzc2VkU2l6ZShjZWNvbXByZXNzZWRTaXplKTsKLQkJfQotCQlpZiAoZWxlbiA+IDApIHsKLQkJCWNvdW50ID0gMDsKLQkJCWJ5dGVbXSBlID0gbmV3IGJ5dGVbZWxlbl07Ci0JCQl3aGlsZSAoY291bnQgIT0gZWxlbikgewotCQkJCWNvdW50ICs9IHggPSBpbi5yZWFkKGUsIGNvdW50LCBlbGVuIC0gY291bnQpOwotCQkJCWlmICh4ID09IC0xKSB7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudEVudHJ5ID0gY3JlYXRlWmlwRW50cnkoVXRpbC5jb252ZXJ0VVRGOFdpdGhCdWYobmFtZUJ1ZiwgY2hhckJ1ZiwKKyAgICAgICAgICAgICAgICAwLCBmbGVuKSk7CisgICAgICAgIGN1cnJlbnRFbnRyeS50aW1lID0gY2V0aW1lOworICAgICAgICBjdXJyZW50RW50cnkubW9kRGF0ZSA9IGNlbW9kRGF0ZTsKKyAgICAgICAgY3VycmVudEVudHJ5LnNldE1ldGhvZChjZWNvbXByZXNzaW9uTWV0aG9kKTsKKyAgICAgICAgaWYgKGNlc2l6ZSAhPSAtMSkgeworICAgICAgICAgICAgY3VycmVudEVudHJ5LnNldENyYyhjZWNyYyk7CisgICAgICAgICAgICBjdXJyZW50RW50cnkuc2V0U2l6ZShjZXNpemUpOworICAgICAgICAgICAgY3VycmVudEVudHJ5LnNldENvbXByZXNzZWRTaXplKGNlY29tcHJlc3NlZFNpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChlbGVuID4gMCkgeworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgYnl0ZVtdIGUgPSBuZXcgYnl0ZVtlbGVuXTsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudCAhPSBlbGVuKSB7CisgICAgICAgICAgICAgICAgY291bnQgKz0geCA9IGluLnJlYWQoZSwgY291bnQsIGVsZW4gLSBjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOwogICAgICAgICAgICAgICAgIH0KLQkJCX0KLQkJCWN1cnJlbnRFbnRyeS5zZXRFeHRyYShlKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudEVudHJ5OwotCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5zZXRFeHRyYShlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudEVudHJ5OworICAgIH0KIAotCS8qIFJlYWQgNCBieXRlcyBmcm9tIHRoZSBidWZmZXIgYW5kIHN0b3JlIGl0IGFzIGFuIGludCAqLworICAgIC8qIFJlYWQgNCBieXRlcyBmcm9tIHRoZSBidWZmZXIgYW5kIHN0b3JlIGl0IGFzIGFuIGludCAqLwogCi0JLyoqCi0JICogUmVhZHMgdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGJ1ZmZlcgotCSAqIHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqICAgICAgICAgICAgYSBieXRlIGFycmF5Ci0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlcgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkCi0JICovCi0JQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHppcENsb3NlZCkgeworICAgICAgICBpZiAoemlwQ2xvc2VkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjFFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLQkJaWYgKGluZi5maW5pc2hlZCgpIHx8IGN1cnJlbnRFbnRyeSA9PSBudWxsKSB7CisgICAgICAgIGlmIChpbmYuZmluaXNoZWQoKSB8fCBjdXJyZW50RW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0JCS8vIGF2b2lkIGludCBvdmVyZmxvdywgY2hlY2sgbnVsbCBidWZmZXIKLQkJaWYgKHN0YXJ0IDw9IGJ1ZmZlci5sZW5ndGggJiYgbGVuZ3RoID49IDAgJiYgc3RhcnQgPj0gMAotCQkJCSYmIGJ1ZmZlci5sZW5ndGggLSBzdGFydCA+PSBsZW5ndGgpIHsKLQkJCWlmIChjdXJyZW50RW50cnkuY29tcHJlc3Npb25NZXRob2QgPT0gU1RPUkVEKSB7Ci0JCQkJaW50IGNzaXplID0gKGludCkgY3VycmVudEVudHJ5LnNpemU7Ci0JCQkJaWYgKGluUmVhZCA+PSBjc2l6ZSkgeworICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3csIGNoZWNrIG51bGwgYnVmZmVyCisgICAgICAgIGlmIChzdGFydCA8PSBidWZmZXIubGVuZ3RoICYmIGxlbmd0aCA+PSAwICYmIHN0YXJ0ID49IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXIubGVuZ3RoIC0gc3RhcnQgPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudEVudHJ5LmNvbXByZXNzaW9uTWV0aG9kID09IFNUT1JFRCkgeworICAgICAgICAgICAgICAgIGludCBjc2l6ZSA9IChpbnQpIGN1cnJlbnRFbnRyeS5zaXplOworICAgICAgICAgICAgICAgIGlmIChpblJlYWQgPj0gY3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KLQkJCQlpZiAobGFzdFJlYWQgPj0gbGVuKSB7Ci0JCQkJCWxhc3RSZWFkID0gMDsKLQkJCQkJaWYgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID09IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RSZWFkID49IGxlbikgeworICAgICAgICAgICAgICAgICAgICBsYXN0UmVhZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gaW4ucmVhZChidWYpKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCWVudHJ5SW4gKz0gbGVuOwotCQkJCX0KLQkJCQlpbnQgdG9SZWFkID0gbGVuZ3RoID4gKGxlbiAtIGxhc3RSZWFkKSA/IGxlbiAtIGxhc3RSZWFkIDogbGVuZ3RoOwotCQkJCWlmICgoY3NpemUgLSBpblJlYWQpIDwgdG9SZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvUmVhZCA9IGNzaXplIC0gaW5SZWFkOwotICAgICAgICAgICAgICAgIH0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgbGFzdFJlYWQsIGJ1ZmZlciwgc3RhcnQsIHRvUmVhZCk7Ci0JCQkJbGFzdFJlYWQgKz0gdG9SZWFkOwotCQkJCWluUmVhZCArPSB0b1JlYWQ7Ci0JCQkJY3JjLnVwZGF0ZShidWZmZXIsIHN0YXJ0LCB0b1JlYWQpOwotCQkJCXJldHVybiB0b1JlYWQ7Ci0JCQl9Ci0JCQlpZiAoaW5mLm5lZWRzSW5wdXQoKSkgewotCQkJCWZpbGwoKTsKLQkJCQlpZiAobGVuID4gMCkgewogICAgICAgICAgICAgICAgICAgICBlbnRyeUluICs9IGxlbjsKICAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQlpbnQgcmVhZCA9IDA7Ci0JCQl0cnkgewotCQkJCXJlYWQgPSBpbmYuaW5mbGF0ZShidWZmZXIsIHN0YXJ0LCBsZW5ndGgpOwotCQkJfSBjYXRjaCAoRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlpZiAocmVhZCA9PSAwICYmIGluZi5maW5pc2hlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgaW50IHRvUmVhZCA9IGxlbmd0aCA+IChsZW4gLSBsYXN0UmVhZCkgPyBsZW4gLSBsYXN0UmVhZCA6IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgaWYgKChjc2l6ZSAtIGluUmVhZCkgPCB0b1JlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9SZWFkID0gY3NpemUgLSBpblJlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBsYXN0UmVhZCwgYnVmZmVyLCBzdGFydCwgdG9SZWFkKTsKKyAgICAgICAgICAgICAgICBsYXN0UmVhZCArPSB0b1JlYWQ7CisgICAgICAgICAgICAgICAgaW5SZWFkICs9IHRvUmVhZDsKKyAgICAgICAgICAgICAgICBjcmMudXBkYXRlKGJ1ZmZlciwgc3RhcnQsIHRvUmVhZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmYubmVlZHNJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgZmlsbCgpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5SW4gKz0gbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByZWFkID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVhZCA9IGluZi5pbmZsYXRlKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFkID09IDAgJiYgaW5mLmZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9Ci0JCQljcmMudXBkYXRlKGJ1ZmZlciwgc3RhcnQsIHJlYWQpOwotCQkJcmV0dXJuIHJlYWQ7Ci0JCX0KLQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCX0KKyAgICAgICAgICAgIGNyYy51cGRhdGUoYnVmZmVyLCBzdGFydCwgcmVhZCk7CisgICAgICAgICAgICByZXR1cm4gcmVhZDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfQogCi0JLyoqCi0JICogU2tpcHMgdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGN1cnJlbnQgemlwIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBTa2lwcyB1cCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY3VycmVudCBaSVAgZW50cnkuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHZhbHVlID49IDApIHsKLQkJCWxvbmcgc2tpcHBlZCA9IDA7Ci0JCQlieXRlW10gYiA9IG5ldyBieXRlWzEwMjRdOwotCQkJd2hpbGUgKHNraXBwZWQgIT0gdmFsdWUpIHsKLQkJCQlsb25nIHJlbSA9IHZhbHVlIC0gc2tpcHBlZDsKLQkJCQlpbnQgeCA9IHJlYWQoYiwgMCwgKGludCkgKGIubGVuZ3RoID4gcmVtID8gcmVtIDogYi5sZW5ndGgpKTsKLQkJCQlpZiAoeCA9PSAtMSkgeworICAgICAgICBpZiAodmFsdWUgPj0gMCkgeworICAgICAgICAgICAgbG9uZyBza2lwcGVkID0gMDsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICB3aGlsZSAoc2tpcHBlZCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIGxvbmcgcmVtID0gdmFsdWUgLSBza2lwcGVkOworICAgICAgICAgICAgICAgIGludCB4ID0gcmVhZChiLCAwLCAoaW50KSAoYi5sZW5ndGggPiByZW0gPyByZW0gOiBiLmxlbmd0aCkpOworICAgICAgICAgICAgICAgIGlmICh4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBza2lwcGVkOwogICAgICAgICAgICAgICAgIH0KLQkJCQlza2lwcGVkICs9IHg7Ci0JCQl9Ci0JCQlyZXR1cm4gc2tpcHBlZDsKLQkJfQorICAgICAgICAgICAgICAgIHNraXBwZWQgKz0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBza2lwcGVkOworICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIH0KIAotCS8qKgotCSAqIFJldHVybnMgMSBpZiB0aGUgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIG90aGVyd2lzZSByZXR1cm5zIDAuCi0JICogCi0JICogQHJldHVybiAwIGFmdGVyIEVPRiBvZiBjdXJyZW50IGVudHJ5LCAxIG90aGVyd2lzZQotCSAqLwotCUBPdmVycmlkZQorICAgIC8qKgorICAgICAqIFJldHVybnMgMCBpZiB0aGUge0Bjb2RlIEVPRn0gaGFzIGJlZW4gcmVhY2hlZCwgb3RoZXJ3aXNlIHJldHVybnMgMS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIDAgYWZ0ZXIge0Bjb2RlIEVPRn0gb2YgY3VycmVudCBlbnRyeSwgMSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh6aXBDbG9zZWQpIHsKKyAgICAgICAgaWYgKHppcENsb3NlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4xRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0JCWlmIChjdXJyZW50RW50cnkgPT0gbnVsbCkgeworICAgICAgICBpZiAoY3VycmVudEVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9Ci0JCWlmIChjdXJyZW50RW50cnkuY29tcHJlc3Npb25NZXRob2QgPT0gU1RPUkVEKSB7Ci0JCQlpZiAoaW5SZWFkID49IGN1cnJlbnRFbnRyeS5zaXplKSB7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkuY29tcHJlc3Npb25NZXRob2QgPT0gU1RPUkVEKSB7CisgICAgICAgICAgICBpZiAoaW5SZWFkID49IGN1cnJlbnRFbnRyeS5zaXplKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaW5mLmZpbmlzaGVkKCkpIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbmYuZmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQotCQl9Ci0JCXJldHVybiAxOwotCX0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgWmlwRW50cnkgY3JlYXRlWmlwRW50cnkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBaaXBFbnRyeShuYW1lKTsKLQl9CisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIHtAbGluayBaaXBFbnRyeSB9IHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnRyeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHtAY29kZSBaaXBFbnRyeX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHJvdGVjdGVkIFppcEVudHJ5IGNyZWF0ZVppcEVudHJ5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgWmlwRW50cnkobmFtZSk7CisgICAgfQogCi0JcHJpdmF0ZSBpbnQgZ2V0U2hvcnQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZikgewotCQlyZXR1cm4gKGJ1ZmZlcltvZmZdICYgMHhGRikgfCAoKGJ1ZmZlcltvZmYgKyAxXSAmIDB4RkYpIDw8IDgpOwotCX0KKyAgICBwcml2YXRlIGludCBnZXRTaG9ydChieXRlW10gYnVmZmVyLCBpbnQgb2ZmKSB7CisgICAgICAgIHJldHVybiAoYnVmZmVyW29mZl0gJiAweEZGKSB8ICgoYnVmZmVyW29mZiArIDFdICYgMHhGRikgPDwgOCk7CisgICAgfQogCi0JcHJpdmF0ZSBsb25nIGdldExvbmcoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZikgewotCQlsb25nIGwgPSAwOwotCQlsIHw9IChidWZmZXJbb2ZmXSAmIDB4RkYpOwotCQlsIHw9IChidWZmZXJbb2ZmICsgMV0gJiAweEZGKSA8PCA4OwotCQlsIHw9IChidWZmZXJbb2ZmICsgMl0gJiAweEZGKSA8PCAxNjsKLQkJbCB8PSAoKGxvbmcpIChidWZmZXJbb2ZmICsgM10gJiAweEZGKSkgPDwgMjQ7Ci0JCXJldHVybiBsOwotCX0KKyAgICBwcml2YXRlIGxvbmcgZ2V0TG9uZyhieXRlW10gYnVmZmVyLCBpbnQgb2ZmKSB7CisgICAgICAgIGxvbmcgbCA9IDA7CisgICAgICAgIGwgfD0gKGJ1ZmZlcltvZmZdICYgMHhGRik7CisgICAgICAgIGwgfD0gKGJ1ZmZlcltvZmYgKyAxXSAmIDB4RkYpIDw8IDg7CisgICAgICAgIGwgfD0gKGJ1ZmZlcltvZmYgKyAyXSAmIDB4RkYpIDw8IDE2OworICAgICAgICBsIHw9ICgobG9uZykgKGJ1ZmZlcltvZmYgKyAzXSAmIDB4RkYpKSA8PCAyNDsKKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwT3V0cHV0U3RyZWFtLmphdmEgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YQppbmRleCA5NThhYmZjLi40ZGRmNjQzIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YQorKysgYi9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjYsMzk5ICsyNiw0MzEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogWmlwT3V0cHV0U3RyZWFtIGlzIHVzZWQgdG8gd3JpdGUgWmlwRW50cmllcyB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIE91dHB1dAotICogZnJvbSBaaXBPdXRwdXRTdHJlYW0gY29uZm9ybXMgdG8gdGhlIFppcEZpbGUgZmlsZSBmb3JtYXQuCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHtAY29kZSBGaWx0ZXJPdXRwdXRTdHJlYW19IHRoYXQKKyAqIGNvbXByZXNzZXMgZGF0YSBlbnRyaWVzIGludG8gYSA8aT5aSVAtYXJjaGl2ZTwvaT4gb3V0cHV0IHN0cmVhbS4KKyAqIDxwPgorICoge0Bjb2RlIFppcE91dHB1dFN0cmVhbX0gaXMgdXNlZCB0byB3cml0ZSB7QGNvZGUgWmlwRW50cmllc30gdG8gdGhlIHVuZGVybHlpbmcKKyAqIHN0cmVhbS4gT3V0cHV0IGZyb20ge0Bjb2RlIFppcE91dHB1dFN0cmVhbX0gY29uZm9ybXMgdG8gdGhlIHtAY29kZSBaaXBGaWxlfQorICogZmlsZSBmb3JtYXQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoaWxlIHtAY29kZSBEZWZsYXRlck91dHB1dFN0cmVhbX0gY2FuIHdyaXRlIGEgY29tcHJlc3NlZCA8aT5aSVAtYXJjaGl2ZTwvaT4KKyAqIGVudHJ5LCB0aGlzIGV4dGVuc2lvbiBjYW4gd3JpdGUgdW5jb21wcmVzc2VkIGVudHJpZXMgYXMgd2VsbC4gSW4gdGhpcyBjYXNlCisgKiBzcGVjaWFsIHJ1bGVzIGFwcGx5LCBmb3IgdGhpcyBwdXJwb3NlIHJlZmVyIHRvIHRoZSA8YQorICogaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+ZmlsZSBmb3JtYXQKKyAqIHNwZWNpZmljYXRpb248L2E+LgorICogPC9wPgogICogCi0gKiBAc2VlIFppcElucHV0U3RyZWFtCiAgKiBAc2VlIFppcEVudHJ5CisgKiBAc2VlIFppcEZpbGUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgWmlwT3V0cHV0U3RyZWFtIGV4dGVuZHMgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gaW1wbGVtZW50cwotCQlaaXBDb25zdGFudHMgeworICAgICAgICBaaXBDb25zdGFudHMgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQgPSA4OworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBkZWZsYXRlZCBlbnRyaWVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkxBVEVEID0gODsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFRCA9IDA7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHVuY29tcHJlc3NlZCBlbnRyaWVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFRCA9IDA7CiAKLQlzdGF0aWMgZmluYWwgaW50IFpJUERhdGFEZXNjcmlwdG9yRmxhZyA9IDg7CisgICAgc3RhdGljIGZpbmFsIGludCBaSVBEYXRhRGVzY3JpcHRvckZsYWcgPSA4OwogCi0Jc3RhdGljIGZpbmFsIGludCBaSVBMb2NhbEhlYWRlclZlcnNpb25OZWVkZWQgPSAyMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFpJUExvY2FsSGVhZGVyVmVyc2lvbk5lZWRlZCA9IDIwOwogCi0JcHJpdmF0ZSBTdHJpbmcgY29tbWVudDsKKyAgICBwcml2YXRlIFN0cmluZyBjb21tZW50OwogCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBlbnRyaWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBlbnRyaWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CiAKLQlwcml2YXRlIGludCBjb21wcmVzc01ldGhvZCA9IERFRkxBVEVEOworICAgIHByaXZhdGUgaW50IGNvbXByZXNzTWV0aG9kID0gREVGTEFURUQ7CiAKLQlwcml2YXRlIGludCBjb21wcmVzc0xldmVsID0gRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTjsKKyAgICBwcml2YXRlIGludCBjb21wcmVzc0xldmVsID0gRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTjsKIAotCXByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNEaXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY0RpciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAotCXByaXZhdGUgWmlwRW50cnkgY3VycmVudEVudHJ5OworICAgIHByaXZhdGUgWmlwRW50cnkgY3VycmVudEVudHJ5OwogCi0JcHJpdmF0ZSBmaW5hbCBDUkMzMiBjcmMgPSBuZXcgQ1JDMzIoKTsKKyAgICBwcml2YXRlIGZpbmFsIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwogCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMCwgY3VyT2Zmc2V0ID0gMCwgbmFtZUxlbmd0aDsKKyAgICBwcml2YXRlIGludCBvZmZzZXQgPSAwLCBjdXJPZmZzZXQgPSAwLCBuYW1lTGVuZ3RoOwogCi0JcHJpdmF0ZSBieXRlW10gbmFtZUJ5dGVzOworICAgIHByaXZhdGUgYnl0ZVtdIG5hbWVCeXRlczsKIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgWmlwT3V0cHV0U3RyZWFtIG9uIHAxCi0JICogCi0JICogQHBhcmFtIHAxCi0JICogICAgICAgICAgICBPdXRwdXRTdHJlYW0gVGhlIElucHV0U3RyZWFtIHRvIG91dHB1dCB0bwotCSAqLwotCXB1YmxpYyBaaXBPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHAxKSB7Ci0JCXN1cGVyKHAxLCBuZXcgRGVmbGF0ZXIoRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTiwgdHJ1ZSkpOwotCX0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBaaXBPdXRwdXRTdHJlYW19IHdpdGggdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgKiBzdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIHAxCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdGhlIGRhdGEgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIFppcE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcDEpIHsKKyAgICAgICAgc3VwZXIocDEsIG5ldyBEZWZsYXRlcihEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OLCB0cnVlKSk7CisgICAgfQogCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBjdXJyZW50IFppcEVudHJ5IGlmIGFueS4gQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0uCi0JICogSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBjbG9zaW5nIHRoZSBzdHJlYW0KLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQge0Bjb2RlIFppcEVudHJ5fSwgaWYgYW55LCBhbmQgdGhlIHVuZGVybHlpbmcgb3V0cHV0CisgICAgICogc3RyZWFtLiBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGNsb3NpbmcgdGhlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChvdXQgIT0gbnVsbCkgewotCQkJZmluaXNoKCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJCW91dCA9IG51bGw7Ci0JCX0KLQl9CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIG91dCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgWmlwRW50cnkuIEFueSBlbnRyeSB0ZXJtaW5hbCBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlCi0JICogdW5kZXJseWluZyBzdHJlYW0uCi0JICogCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBjbG9zaW5nIHRoZSBlbnRyeQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoY0RpciA9PSBudWxsKSB7CisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHtAY29kZSBaaXBFbnRyeX0uIEFueSBlbnRyeSB0ZXJtaW5hbCBkYXRhIGlzIHdyaXR0ZW4KKyAgICAgKiB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBjbG9zaW5nIHRoZSBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4xRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0JCWlmIChjdXJyZW50RW50cnkgPT0gbnVsbCkgeworICAgICAgICBpZiAoY3VycmVudEVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCQlpZiAoY3VycmVudEVudHJ5LmdldE1ldGhvZCgpID09IERFRkxBVEVEKSB7Ci0JCQlzdXBlci5maW5pc2goKTsKLQkJfQorICAgICAgICBpZiAoY3VycmVudEVudHJ5LmdldE1ldGhvZCgpID09IERFRkxBVEVEKSB7CisgICAgICAgICAgICBzdXBlci5maW5pc2goKTsKKyAgICAgICAgfQogCi0JCS8vIFZlcmlmeSB2YWx1ZXMgZm9yIFNUT1JFRCB0eXBlcwotCQlpZiAoY3VycmVudEVudHJ5LmdldE1ldGhvZCgpID09IFNUT1JFRCkgewotCQkJaWYgKGNyYy5nZXRWYWx1ZSgpICE9IGN1cnJlbnRFbnRyeS5jcmMpIHsKKyAgICAgICAgLy8gVmVyaWZ5IHZhbHVlcyBmb3IgU1RPUkVEIHR5cGVzCisgICAgICAgIGlmIChjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gU1RPUkVEKSB7CisgICAgICAgICAgICBpZiAoY3JjLmdldFZhbHVlKCkgIT0gY3VycmVudEVudHJ5LmNyYykgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhcmNoaXZlLjIwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9Ci0JCQlpZiAoY3VycmVudEVudHJ5LnNpemUgIT0gY3JjLnRieXRlcykgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5zaXplICE9IGNyYy50Ynl0ZXMpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4yMSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQotCQl9Ci0JCWN1ck9mZnNldCA9IExPQ0hEUjsKKyAgICAgICAgfQorICAgICAgICBjdXJPZmZzZXQgPSBMT0NIRFI7CiAKLQkJLy8gV3JpdGUgdGhlIERhdGFEZXNjcmlwdG9yCi0JCWlmIChjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgIT0gU1RPUkVEKSB7Ci0JCQljdXJPZmZzZXQgKz0gRVhUSERSOwotCQkJd3JpdGVMb25nKG91dCwgRVhUU0lHKTsKLQkJCXdyaXRlTG9uZyhvdXQsIGN1cnJlbnRFbnRyeS5jcmMgPSBjcmMuZ2V0VmFsdWUoKSk7Ci0JCQl3cml0ZUxvbmcob3V0LCBjdXJyZW50RW50cnkuY29tcHJlc3NlZFNpemUgPSBkZWYuZ2V0VG90YWxPdXQoKSk7Ci0JCQl3cml0ZUxvbmcob3V0LCBjdXJyZW50RW50cnkuc2l6ZSA9IGRlZi5nZXRUb3RhbEluKCkpOwotCQl9Ci0JCS8vIFVwZGF0ZSB0aGUgQ2VudHJhbERpcmVjdG9yeQotCQl3cml0ZUxvbmcoY0RpciwgQ0VOU0lHKTsKLQkJd3JpdGVTaG9ydChjRGlyLCBaSVBMb2NhbEhlYWRlclZlcnNpb25OZWVkZWQpOyAvLyBWZXJzaW9uIGNyZWF0ZWQKLQkJd3JpdGVTaG9ydChjRGlyLCBaSVBMb2NhbEhlYWRlclZlcnNpb25OZWVkZWQpOyAvLyBWZXJzaW9uIHRvIGV4dHJhY3QKLQkJd3JpdGVTaG9ydChjRGlyLCBjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gU1RPUkVEID8gMAotCQkJCTogWklQRGF0YURlc2NyaXB0b3JGbGFnKTsKLQkJd3JpdGVTaG9ydChjRGlyLCBjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkpOwotCQl3cml0ZVNob3J0KGNEaXIsIGN1cnJlbnRFbnRyeS50aW1lKTsKLQkJd3JpdGVTaG9ydChjRGlyLCBjdXJyZW50RW50cnkubW9kRGF0ZSk7Ci0JCXdyaXRlTG9uZyhjRGlyLCBjcmMuZ2V0VmFsdWUoKSk7Ci0JCWlmIChjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gREVGTEFURUQpIHsKLQkJCWN1ck9mZnNldCArPSB3cml0ZUxvbmcoY0RpciwgZGVmLmdldFRvdGFsT3V0KCkpOwotCQkJd3JpdGVMb25nKGNEaXIsIGRlZi5nZXRUb3RhbEluKCkpOwotCQl9IGVsc2UgewotCQkJY3VyT2Zmc2V0ICs9IHdyaXRlTG9uZyhjRGlyLCBjcmMudGJ5dGVzKTsKLQkJCXdyaXRlTG9uZyhjRGlyLCBjcmMudGJ5dGVzKTsKLQkJfQotCQljdXJPZmZzZXQgKz0gd3JpdGVTaG9ydChjRGlyLCBuYW1lTGVuZ3RoKTsKLQkJaWYgKGN1cnJlbnRFbnRyeS5leHRyYSAhPSBudWxsKSB7CisgICAgICAgIC8vIFdyaXRlIHRoZSBEYXRhRGVzY3JpcHRvcgorICAgICAgICBpZiAoY3VycmVudEVudHJ5LmdldE1ldGhvZCgpICE9IFNUT1JFRCkgeworICAgICAgICAgICAgY3VyT2Zmc2V0ICs9IEVYVEhEUjsKKyAgICAgICAgICAgIHdyaXRlTG9uZyhvdXQsIEVYVFNJRyk7CisgICAgICAgICAgICB3cml0ZUxvbmcob3V0LCBjdXJyZW50RW50cnkuY3JjID0gY3JjLmdldFZhbHVlKCkpOworICAgICAgICAgICAgd3JpdGVMb25nKG91dCwgY3VycmVudEVudHJ5LmNvbXByZXNzZWRTaXplID0gZGVmLmdldFRvdGFsT3V0KCkpOworICAgICAgICAgICAgd3JpdGVMb25nKG91dCwgY3VycmVudEVudHJ5LnNpemUgPSBkZWYuZ2V0VG90YWxJbigpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBVcGRhdGUgdGhlIENlbnRyYWxEaXJlY3RvcnkKKyAgICAgICAgd3JpdGVMb25nKGNEaXIsIENFTlNJRyk7CisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkKTsgLy8gVmVyc2lvbiBjcmVhdGVkCisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkKTsgLy8gVmVyc2lvbiB0byBleHRyYWN0CisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgY3VycmVudEVudHJ5LmdldE1ldGhvZCgpID09IFNUT1JFRCA/IDAKKyAgICAgICAgICAgICAgICA6IFpJUERhdGFEZXNjcmlwdG9yRmxhZyk7CisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgY3VycmVudEVudHJ5LmdldE1ldGhvZCgpKTsKKyAgICAgICAgd3JpdGVTaG9ydChjRGlyLCBjdXJyZW50RW50cnkudGltZSk7CisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgY3VycmVudEVudHJ5Lm1vZERhdGUpOworICAgICAgICB3cml0ZUxvbmcoY0RpciwgY3JjLmdldFZhbHVlKCkpOworICAgICAgICBpZiAoY3VycmVudEVudHJ5LmdldE1ldGhvZCgpID09IERFRkxBVEVEKSB7CisgICAgICAgICAgICBjdXJPZmZzZXQgKz0gd3JpdGVMb25nKGNEaXIsIGRlZi5nZXRUb3RhbE91dCgpKTsKKyAgICAgICAgICAgIHdyaXRlTG9uZyhjRGlyLCBkZWYuZ2V0VG90YWxJbigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN1ck9mZnNldCArPSB3cml0ZUxvbmcoY0RpciwgY3JjLnRieXRlcyk7CisgICAgICAgICAgICB3cml0ZUxvbmcoY0RpciwgY3JjLnRieXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgY3VyT2Zmc2V0ICs9IHdyaXRlU2hvcnQoY0RpciwgbmFtZUxlbmd0aCk7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkuZXh0cmEgIT0gbnVsbCkgewogICAgICAgICAgICAgY3VyT2Zmc2V0ICs9IHdyaXRlU2hvcnQoY0RpciwgY3VycmVudEVudHJ5LmV4dHJhLmxlbmd0aCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3cml0ZVNob3J0KGNEaXIsIDApOwogICAgICAgICB9Ci0JCVN0cmluZyBjOwotCQlpZiAoKGMgPSBjdXJyZW50RW50cnkuZ2V0Q29tbWVudCgpKSAhPSBudWxsKSB7CisgICAgICAgIFN0cmluZyBjOworICAgICAgICBpZiAoKGMgPSBjdXJyZW50RW50cnkuZ2V0Q29tbWVudCgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICB3cml0ZVNob3J0KGNEaXIsIGMubGVuZ3RoKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgd3JpdGVTaG9ydChjRGlyLCAwKTsKICAgICAgICAgfQotCQl3cml0ZVNob3J0KGNEaXIsIDApOyAvLyBEaXNrIFN0YXJ0Ci0JCXdyaXRlU2hvcnQoY0RpciwgMCk7IC8vIEludGVybmFsIEZpbGUgQXR0cmlidXRlcwotCQl3cml0ZUxvbmcoY0RpciwgMCk7IC8vIEV4dGVybmFsIEZpbGUgQXR0cmlidXRlcwotCQl3cml0ZUxvbmcoY0Rpciwgb2Zmc2V0KTsKLQkJY0Rpci53cml0ZShuYW1lQnl0ZXMpOwotCQluYW1lQnl0ZXMgPSBudWxsOwotCQlpZiAoY3VycmVudEVudHJ5LmV4dHJhICE9IG51bGwpIHsKKyAgICAgICAgd3JpdGVTaG9ydChjRGlyLCAwKTsgLy8gRGlzayBTdGFydAorICAgICAgICB3cml0ZVNob3J0KGNEaXIsIDApOyAvLyBJbnRlcm5hbCBGaWxlIEF0dHJpYnV0ZXMKKyAgICAgICAgd3JpdGVMb25nKGNEaXIsIDApOyAvLyBFeHRlcm5hbCBGaWxlIEF0dHJpYnV0ZXMKKyAgICAgICAgd3JpdGVMb25nKGNEaXIsIG9mZnNldCk7CisgICAgICAgIGNEaXIud3JpdGUobmFtZUJ5dGVzKTsKKyAgICAgICAgbmFtZUJ5dGVzID0gbnVsbDsKKyAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5leHRyYSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjRGlyLndyaXRlKGN1cnJlbnRFbnRyeS5leHRyYSk7CiAgICAgICAgIH0KLQkJb2Zmc2V0ICs9IGN1ck9mZnNldDsKLQkJaWYgKGMgIT0gbnVsbCkgeworICAgICAgICBvZmZzZXQgKz0gY3VyT2Zmc2V0OworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CiAgICAgICAgICAgICBjRGlyLndyaXRlKGMuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgIH0KLQkJY3VycmVudEVudHJ5ID0gbnVsbDsKLQkJY3JjLnJlc2V0KCk7Ci0JCWRlZi5yZXNldCgpOwotCQlkb25lID0gZmFsc2U7Ci0JfQorICAgICAgICBjdXJyZW50RW50cnkgPSBudWxsOworICAgICAgICBjcmMucmVzZXQoKTsKKyAgICAgICAgZGVmLnJlc2V0KCk7CisgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICB9CiAKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCBhbGwgZW50cmllcyBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgc3RyZWFtLiBBbnkgdGVybWluYWwKLQkgKiBaaXBGaWxlIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgotCSAqIAotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZmluaXNoaW5nCi0JICovCi0JQE92ZXJyaWRlCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgYWxsIGVudHJpZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4gQW55IHRlcm1pbmFsCisgICAgICogaW5mb3JtYXRpb24gaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0ZXJtaW5hdGluZyB0aGUgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChvdXQgPT0gbnVsbCkgeworICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMUUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotCQlpZiAoY0RpciA9PSBudWxsKSB7CisgICAgICAgIGlmIChjRGlyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCQlpZiAoZW50cmllcy5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAoZW50cmllcy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMjgiKSk7IC8vJE5PTi1OTFMtMSQ7CiAgICAgICAgIH0KLQkJaWYgKGN1cnJlbnRFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbG9zZUVudHJ5KCk7Ci0gICAgICAgIH0KLQkJaW50IGNkaXJTaXplID0gY0Rpci5zaXplKCk7Ci0JCS8vIFdyaXRlIENlbnRyYWwgRGlyIEVuZAotCQl3cml0ZUxvbmcoY0RpciwgRU5EU0lHKTsKLQkJd3JpdGVTaG9ydChjRGlyLCAwKTsgLy8gRGlzayBOdW1iZXIKLQkJd3JpdGVTaG9ydChjRGlyLCAwKTsgLy8gU3RhcnQgRGlzawotCQl3cml0ZVNob3J0KGNEaXIsIGVudHJpZXMuc2l6ZSgpKTsgLy8gTnVtYmVyIG9mIGVudHJpZXMKLQkJd3JpdGVTaG9ydChjRGlyLCBlbnRyaWVzLnNpemUoKSk7IC8vIE51bWJlciBvZiBlbnRyaWVzCi0JCXdyaXRlTG9uZyhjRGlyLCBjZGlyU2l6ZSk7IC8vIFNpemUgb2YgY2VudHJhbCBkaXIKLQkJd3JpdGVMb25nKGNEaXIsIG9mZnNldCk7IC8vIE9mZnNldCBvZiBjZW50cmFsIGRpcgotCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQl3cml0ZVNob3J0KGNEaXIsIGNvbW1lbnQubGVuZ3RoKCkpOwotCQkJY0Rpci53cml0ZShjb21tZW50LmdldEJ5dGVzKCkpOwotCQl9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVTaG9ydChjRGlyLCAwKTsKLSAgICAgICAgfQotCQkvLyBXcml0ZSB0aGUgY2VudHJhbCBkaXIKLQkJb3V0LndyaXRlKGNEaXIudG9CeXRlQXJyYXkoKSk7Ci0JCWNEaXIgPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogV3JpdGVzIGVudHJ5IGluZm9ybWF0aW9uIGZvciB6ZSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIERhdGEgYXNzb2NpYXRlZAotCSAqIHdpdGggdGhlIGVudHJ5IGNhbiB0aGVuIGJlIHdyaXR0ZW4gdXNpbmcgd3JpdGUoKS4gQWZ0ZXIgZGF0YSBpcyB3cml0dGVuCi0JICogY2xvc2VFbnRyeSgpIG11c3QgYmUgY2FsbGVkIHRvIGNvbXBsZXRlIHRoZSBzdG9yaW5nIG9mIHplIG9uIHRoZQotCSAqIHVuZGVybHlpbmcgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSB6ZQotCSAqICAgICAgICAgICAgWmlwRW50cnkgdG8gc3RvcmUKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHN0b3JpbmcgdGhlIGVudHJ5Ci0JICogQHNlZSAjd3JpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXROZXh0RW50cnkoWmlwRW50cnkgemUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjbG9zZUVudHJ5KCk7CiAgICAgICAgIH0KLQkJaWYgKHplLmdldE1ldGhvZCgpID09IFNUT1JFRAotCQkJCXx8IChjb21wcmVzc01ldGhvZCA9PSBTVE9SRUQgJiYgemUuZ2V0TWV0aG9kKCkgPT0gLTEpKSB7Ci0JCQlpZiAoemUuY3JjID09IC0xKSB7CisgICAgICAgIGludCBjZGlyU2l6ZSA9IGNEaXIuc2l6ZSgpOworICAgICAgICAvLyBXcml0ZSBDZW50cmFsIERpciBFbmQKKyAgICAgICAgd3JpdGVMb25nKGNEaXIsIEVORFNJRyk7CisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgMCk7IC8vIERpc2sgTnVtYmVyCisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgMCk7IC8vIFN0YXJ0IERpc2sKKyAgICAgICAgd3JpdGVTaG9ydChjRGlyLCBlbnRyaWVzLnNpemUoKSk7IC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgZW50cmllcy5zaXplKCkpOyAvLyBOdW1iZXIgb2YgZW50cmllcworICAgICAgICB3cml0ZUxvbmcoY0RpciwgY2RpclNpemUpOyAvLyBTaXplIG9mIGNlbnRyYWwgZGlyCisgICAgICAgIHdyaXRlTG9uZyhjRGlyLCBvZmZzZXQpOyAvLyBPZmZzZXQgb2YgY2VudHJhbCBkaXIKKyAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVTaG9ydChjRGlyLCBjb21tZW50Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGNEaXIud3JpdGUoY29tbWVudC5nZXRCeXRlcygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gV3JpdGUgdGhlIGNlbnRyYWwgZGlyCisgICAgICAgIG91dC53cml0ZShjRGlyLnRvQnl0ZUFycmF5KCkpOworICAgICAgICBjRGlyID0gbnVsbDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBlbnRyeSBpbmZvcm1hdGlvbiB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIERhdGEgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhlIGVudHJ5IGNhbiB0aGVuIGJlIHdyaXR0ZW4gdXNpbmcge0Bjb2RlIHdyaXRlKCl9LiBBZnRlciBkYXRhIGlzCisgICAgICogd3JpdHRlbiB7QGNvZGUgY2xvc2VFbnRyeSgpfSBtdXN0IGJlIGNhbGxlZCB0byBjb21wbGV0ZSB0aGUgd3JpdGluZyBvZgorICAgICAqIHRoZSBlbnRyeSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIHplCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFppcEVudHJ5fSB0byBzdG9yZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHN0b3JpbmcgdGhlIGVudHJ5LgorICAgICAqIEBzZWUgI3dyaXRlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0TmV4dEVudHJ5KFppcEVudHJ5IHplKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgY2xvc2VFbnRyeSgpOworICAgICAgICB9CisgICAgICAgIGlmICh6ZS5nZXRNZXRob2QoKSA9PSBTVE9SRUQKKyAgICAgICAgICAgICAgICB8fCAoY29tcHJlc3NNZXRob2QgPT0gU1RPUkVEICYmIHplLmdldE1ldGhvZCgpID09IC0xKSkgeworICAgICAgICAgICAgaWYgKHplLmNyYyA9PSAtMSkgewogICAgICAgICAgICAgICAgIC8qIFtNU0cgImFyY2hpdmUuMjAiLCAiQ3JjIG1pc21hdGNoIl0gKi8KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4yMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQotCQkJaWYgKHplLnNpemUgPT0gLTEgJiYgemUuY29tcHJlc3NlZFNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgIGlmICh6ZS5zaXplID09IC0xICYmIHplLmNvbXByZXNzZWRTaXplID09IC0xKSB7CiAgICAgICAgICAgICAgICAgLyogW01TRyAiYXJjaGl2ZS4yMSIsICJTaXplIG1pc21hdGNoIl0gKi8KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4yMSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQotCQkJaWYgKHplLnNpemUgIT0gemUuY29tcHJlc3NlZFNpemUgJiYgemUuY29tcHJlc3NlZFNpemUgIT0gLTEKLQkJCQkJJiYgemUuc2l6ZSAhPSAtMSkgeworICAgICAgICAgICAgaWYgKHplLnNpemUgIT0gemUuY29tcHJlc3NlZFNpemUgJiYgemUuY29tcHJlc3NlZFNpemUgIT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgemUuc2l6ZSAhPSAtMSkgewogICAgICAgICAgICAgICAgIC8qIFtNU0cgImFyY2hpdmUuMjEiLCAiU2l6ZSBtaXNtYXRjaCJdICovCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMjEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLQkJfQorICAgICAgICB9CiAgICAgICAgIC8qIFtNU0cgImFyY2hpdmUuMUUiLCAiU3RyZWFtIGlzIGNsb3NlZCJdICovCi0JCWlmIChjRGlyID09IG51bGwpIHsKKyAgICAgICAgaWYgKGNEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4xRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0JCWlmIChlbnRyaWVzLmNvbnRhaW5zKHplLm5hbWUpKSB7CisgICAgICAgIGlmIChlbnRyaWVzLmNvbnRhaW5zKHplLm5hbWUpKSB7CiAgICAgICAgICAgICAvKiBbTVNHICJhcmNoaXZlLjI5IiwgIkVudHJ5IGFscmVhZHkgZXhpc3RzOiB7MH0iXSAqLwogICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMjkiLCB6ZS5uYW1lKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotCQluYW1lTGVuZ3RoID0gdXRmOENvdW50KHplLm5hbWUpOwotCQlpZiAobmFtZUxlbmd0aCA+IDB4ZmZmZikgeworICAgICAgICBuYW1lTGVuZ3RoID0gdXRmOENvdW50KHplLm5hbWUpOworICAgICAgICBpZiAobmFtZUxlbmd0aCA+IDB4ZmZmZikgewogICAgICAgICAgICAgLyogW01TRyAiYXJjaGl2ZS4yQSIsICJOYW1lIHRvbyBsb25nOiB7MH0iXSAqLwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMkEiLCB6ZS5uYW1lKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0JCWRlZi5zZXRMZXZlbChjb21wcmVzc0xldmVsKTsKLQkJY3VycmVudEVudHJ5ID0gemU7Ci0JCWVudHJpZXMuYWRkKGN1cnJlbnRFbnRyeS5uYW1lKTsKLQkJaWYgKGN1cnJlbnRFbnRyeS5nZXRNZXRob2QoKSA9PSAtMSkgeworICAgICAgICBkZWYuc2V0TGV2ZWwoY29tcHJlc3NMZXZlbCk7CisgICAgICAgIGN1cnJlbnRFbnRyeSA9IHplOworICAgICAgICBlbnRyaWVzLmFkZChjdXJyZW50RW50cnkubmFtZSk7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gLTEpIHsKICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5zZXRNZXRob2QoY29tcHJlc3NNZXRob2QpOwogICAgICAgICB9Ci0JCXdyaXRlTG9uZyhvdXQsIExPQ1NJRyk7IC8vIEVudHJ5IGhlYWRlcgotCQl3cml0ZVNob3J0KG91dCwgWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkKTsgLy8gRXh0cmFjdGlvbiB2ZXJzaW9uCi0JCXdyaXRlU2hvcnQob3V0LCBjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gU1RPUkVEID8gMAotCQkJCTogWklQRGF0YURlc2NyaXB0b3JGbGFnKTsKLQkJd3JpdGVTaG9ydChvdXQsIGN1cnJlbnRFbnRyeS5nZXRNZXRob2QoKSk7Ci0JCWlmIChjdXJyZW50RW50cnkuZ2V0VGltZSgpID09IC0xKSB7CisgICAgICAgIHdyaXRlTG9uZyhvdXQsIExPQ1NJRyk7IC8vIEVudHJ5IGhlYWRlcgorICAgICAgICB3cml0ZVNob3J0KG91dCwgWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkKTsgLy8gRXh0cmFjdGlvbiB2ZXJzaW9uCisgICAgICAgIHdyaXRlU2hvcnQob3V0LCBjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gU1RPUkVEID8gMAorICAgICAgICAgICAgICAgIDogWklQRGF0YURlc2NyaXB0b3JGbGFnKTsKKyAgICAgICAgd3JpdGVTaG9ydChvdXQsIGN1cnJlbnRFbnRyeS5nZXRNZXRob2QoKSk7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkuZ2V0VGltZSgpID09IC0xKSB7CiAgICAgICAgICAgICBjdXJyZW50RW50cnkuc2V0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICAgIH0KLQkJd3JpdGVTaG9ydChvdXQsIGN1cnJlbnRFbnRyeS50aW1lKTsKLQkJd3JpdGVTaG9ydChvdXQsIGN1cnJlbnRFbnRyeS5tb2REYXRlKTsKKyAgICAgICAgd3JpdGVTaG9ydChvdXQsIGN1cnJlbnRFbnRyeS50aW1lKTsKKyAgICAgICAgd3JpdGVTaG9ydChvdXQsIGN1cnJlbnRFbnRyeS5tb2REYXRlKTsKIAotCQlpZiAoY3VycmVudEVudHJ5LmdldE1ldGhvZCgpID09IFNUT1JFRCkgewotCQkJaWYgKGN1cnJlbnRFbnRyeS5zaXplID09IC0xKSB7CisgICAgICAgIGlmIChjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gU1RPUkVEKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudEVudHJ5LnNpemUgPT0gLTEpIHsKICAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuc2l6ZSA9IGN1cnJlbnRFbnRyeS5jb21wcmVzc2VkU2l6ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEVudHJ5LmNvbXByZXNzZWRTaXplID09IC0xKSB7CiAgICAgICAgICAgICAgICAgY3VycmVudEVudHJ5LmNvbXByZXNzZWRTaXplID0gY3VycmVudEVudHJ5LnNpemU7CiAgICAgICAgICAgICB9Ci0JCQl3cml0ZUxvbmcob3V0LCBjdXJyZW50RW50cnkuY3JjKTsKLQkJCXdyaXRlTG9uZyhvdXQsIGN1cnJlbnRFbnRyeS5zaXplKTsKLQkJCXdyaXRlTG9uZyhvdXQsIGN1cnJlbnRFbnRyeS5zaXplKTsKLQkJfSBlbHNlIHsKLQkJCXdyaXRlTG9uZyhvdXQsIDApOwotCQkJd3JpdGVMb25nKG91dCwgMCk7Ci0JCQl3cml0ZUxvbmcob3V0LCAwKTsKLQkJfQotCQl3cml0ZVNob3J0KG91dCwgbmFtZUxlbmd0aCk7Ci0JCWlmIChjdXJyZW50RW50cnkuZXh0cmEgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVMb25nKG91dCwgY3VycmVudEVudHJ5LmNyYyk7CisgICAgICAgICAgICB3cml0ZUxvbmcob3V0LCBjdXJyZW50RW50cnkuc2l6ZSk7CisgICAgICAgICAgICB3cml0ZUxvbmcob3V0LCBjdXJyZW50RW50cnkuc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZUxvbmcob3V0LCAwKTsKKyAgICAgICAgICAgIHdyaXRlTG9uZyhvdXQsIDApOworICAgICAgICAgICAgd3JpdGVMb25nKG91dCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVTaG9ydChvdXQsIG5hbWVMZW5ndGgpOworICAgICAgICBpZiAoY3VycmVudEVudHJ5LmV4dHJhICE9IG51bGwpIHsKICAgICAgICAgICAgIHdyaXRlU2hvcnQob3V0LCBjdXJyZW50RW50cnkuZXh0cmEubGVuZ3RoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHdyaXRlU2hvcnQob3V0LCAwKTsKICAgICAgICAgfQotCQluYW1lQnl0ZXMgPSB0b1VURjhCeXRlcyhjdXJyZW50RW50cnkubmFtZSwgbmFtZUxlbmd0aCk7Ci0JCW91dC53cml0ZShuYW1lQnl0ZXMpOwotCQlpZiAoY3VycmVudEVudHJ5LmV4dHJhICE9IG51bGwpIHsKKyAgICAgICAgbmFtZUJ5dGVzID0gdG9VVEY4Qnl0ZXMoY3VycmVudEVudHJ5Lm5hbWUsIG5hbWVMZW5ndGgpOworICAgICAgICBvdXQud3JpdGUobmFtZUJ5dGVzKTsKKyAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5leHRyYSAhPSBudWxsKSB7CiAgICAgICAgICAgICBvdXQud3JpdGUoY3VycmVudEVudHJ5LmV4dHJhKTsKICAgICAgICAgfQotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHRoZSBaaXBGaWxlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGJlaW5nIHdyaXR0ZW4uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlpZiAoY29tbWVudC5sZW5ndGgoKSA+IDB4RkZGRikgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHtAY29kZSBaaXBGaWxlfSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBiZWluZyB3cml0dGVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb21tZW50CisgICAgICogICAgICAgICAgICB0aGUgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBpZiAoY29tbWVudC5sZW5ndGgoKSA+IDB4RkZGRikgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImFyY2hpdmUuMkIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCX0KKyAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byBiZSB1c2VkIGZvciB3cml0aW5nIGVudHJ5IGRhdGEuIFRoaXMgbGV2ZWwKLQkgKiBtYXkgYmUgc2V0IG9uIGEgcGVyIGVudHJ5IGJhc2lzLiBsZXZlbCBtdXN0IGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kCi0JICogMTAuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoaW50IGxldmVsKSB7Ci0JCWlmIChsZXZlbCA8IERlZmxhdGVyLkRFRkFVTFRfQ09NUFJFU1NJT04KLQkJCQl8fCBsZXZlbCA+IERlZmxhdGVyLkJFU1RfQ09NUFJFU1NJT04pIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byBiZSB1c2VkIGZvciB3cml0aW5nIGVudHJ5IGRhdGEuIFRoaXMgbGV2ZWwKKyAgICAgKiBtYXkgYmUgc2V0IG9uIGEgcGVyIGVudHJ5IGJhc2lzLiBUaGUgbGV2ZWwgbXVzdCBoYXZlIGEgdmFsdWUgYmV0d2VlbiAtMQorICAgICAqIGFuZCA4IGFjY29yZGluZyB0byB0aGUge0Bjb2RlIERlZmxhdGVyfSBjb21wcmVzc2lvbiBsZXZlbCBib3VuZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGxldmVsCisgICAgICogICAgICAgICAgICB0aGUgY29tcHJlc3Npb24gbGV2ZWwgKHJhbmdpbmcgZnJvbSAtMSB0byA4KS4KKyAgICAgKiBAc2VlIERlZmxhdGVyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGV2ZWwoaW50IGxldmVsKSB7CisgICAgICAgIGlmIChsZXZlbCA8IERlZmxhdGVyLkRFRkFVTFRfQ09NUFJFU1NJT04KKyAgICAgICAgICAgICAgICB8fCBsZXZlbCA+IERlZmxhdGVyLkJFU1RfQ09NUFJFU1NJT04pIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgfQotCQljb21wcmVzc0xldmVsID0gbGV2ZWw7Ci0JfQorICAgICAgICBjb21wcmVzc0xldmVsID0gbGV2ZWw7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIGJlIHVzZWQgd2hlbiBjb21wcmVzc2luZyBlbnRyeSBkYXRhLgotCSAqIG1ldGhvZCBtdXN0IGJlIG9uZSBvZiBTVE9SRUQgb3IgREVGTEFURUQuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgQ29tcHJlc3Npb24gbWV0aG9kIHRvIHVzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChpbnQgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgIT0gU1RPUkVEICYmIG1ldGhvZCAhPSBERUZMQVRFRCkgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byBiZSB1c2VkIHdoZW4gY29tcHJlc3NpbmcgZW50cnkgZGF0YS4KKyAgICAgKiBtZXRob2QgbXVzdCBiZSBvbmUgb2Yge0Bjb2RlIFNUT1JFRH0gKGZvciBubyBjb21wcmVzc2lvbikgb3Ige0Bjb2RlCisgICAgICogREVGTEFURUR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChpbnQgbWV0aG9kKSB7CisgICAgICAgIGlmIChtZXRob2QgIT0gU1RPUkVEICYmIG1ldGhvZCAhPSBERUZMQVRFRCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0JCWNvbXByZXNzTWV0aG9kID0gbWV0aG9kOworICAgICAgICBjb21wcmVzc01ldGhvZCA9IG1ldGhvZDsKIAotCX0KKyAgICB9CiAKLQlwcml2YXRlIGxvbmcgd3JpdGVMb25nKE91dHB1dFN0cmVhbSBvcywgbG9uZyBpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIFdyaXRlIG91dCB0aGUgbG9uZyB2YWx1ZSBhcyBhbiB1bnNpZ25lZCBpbnQKLQkJb3Mud3JpdGUoKGludCkgKGkgJiAweEZGKSk7Ci0JCW9zLndyaXRlKChpbnQpIChpID4+IDgpICYgMHhGRik7Ci0JCW9zLndyaXRlKChpbnQpIChpID4+IDE2KSAmIDB4RkYpOwotCQlvcy53cml0ZSgoaW50KSAoaSA+PiAyNCkgJiAweEZGKTsKLQkJcmV0dXJuIGk7Ci0JfQorICAgIHByaXZhdGUgbG9uZyB3cml0ZUxvbmcoT3V0cHV0U3RyZWFtIG9zLCBsb25nIGkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBsb25nIHZhbHVlIGFzIGFuIHVuc2lnbmVkIGludAorICAgICAgICBvcy53cml0ZSgoaW50KSAoaSAmIDB4RkYpKTsKKyAgICAgICAgb3Mud3JpdGUoKGludCkgKGkgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgb3Mud3JpdGUoKGludCkgKGkgPj4gMTYpICYgMHhGRik7CisgICAgICAgIG9zLndyaXRlKChpbnQpIChpID4+IDI0KSAmIDB4RkYpOworICAgICAgICByZXR1cm4gaTsKKyAgICB9CiAKLQlwcml2YXRlIGludCB3cml0ZVNob3J0KE91dHB1dFN0cmVhbSBvcywgaW50IGkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGUoaSAmIDB4RkYpOwotCQlvcy53cml0ZSgoaSA+PiA4KSAmIDB4RkYpOwotCQlyZXR1cm4gaTsKKyAgICBwcml2YXRlIGludCB3cml0ZVNob3J0KE91dHB1dFN0cmVhbSBvcywgaW50IGkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgb3Mud3JpdGUoaSAmIDB4RkYpOworICAgICAgICBvcy53cml0ZSgoaSA+PiA4KSAmIDB4RkYpOworICAgICAgICByZXR1cm4gaTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBXcml0ZXMgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZW50cnkgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgotCSAqIAotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyB0byB0aGUgc3RyZWFtCi0JICovCi0JQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZiwgaW50IG5ieXRlcykKLQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgotCQlpZiAoKG9mZiA+IGJ1ZmZlci5sZW5ndGgpIHx8IChuYnl0ZXMgPCAwKSB8fCAob2ZmIDwgMCkKLQkJCQl8fCAoYnVmZmVyLmxlbmd0aCAtIG9mZiA8IG5ieXRlcykpIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KKyAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGJ1ZgorICAgICAgICBpZiAoKG9mZiA+IGJ1ZmZlci5sZW5ndGgpIHx8IChuYnl0ZXMgPCAwKSB8fCAob2ZmIDwgMCkKKyAgICAgICAgICAgICAgICB8fCAoYnVmZmVyLmxlbmd0aCAtIG9mZiA8IG5ieXRlcykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KIAotCQlpZiAoY3VycmVudEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvKiBbTVNHICJhcmNoaXZlLjJDIiwgIk5vIGFjdGl2ZSBlbnRyeSJdICovCiAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXJjaGl2ZS4yQyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLQkJaWYgKGN1cnJlbnRFbnRyeS5nZXRNZXRob2QoKSA9PSBTVE9SRUQpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5nZXRNZXRob2QoKSA9PSBTVE9SRUQpIHsKICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIG9mZiwgbmJ5dGVzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN1cGVyLndyaXRlKGJ1ZmZlciwgb2ZmLCBuYnl0ZXMpOwogICAgICAgICB9Ci0JCWNyYy51cGRhdGUoYnVmZmVyLCBvZmYsIG5ieXRlcyk7Ci0JfQorICAgICAgICBjcmMudXBkYXRlKGJ1ZmZlciwgb2ZmLCBuYnl0ZXMpOworICAgIH0KIAotCXN0YXRpYyBpbnQgdXRmOENvdW50KFN0cmluZyB2YWx1ZSkgewotCQlpbnQgdG90YWwgPSAwOwotCQlmb3IgKGludCBpID0gdmFsdWUubGVuZ3RoKCk7IC0taSA+PSAwOykgewotCQkJY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCWlmIChjaCA8IDB4ODApIHsKKyAgICBzdGF0aWMgaW50IHV0ZjhDb3VudChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHZhbHVlLmxlbmd0aCgpOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoY2ggPCAweDgwKSB7CiAgICAgICAgICAgICAgICAgdG90YWwrKzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPCAweDgwMCkgewogICAgICAgICAgICAgICAgIHRvdGFsICs9IDI7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRvdGFsICs9IDM7CiAgICAgICAgICAgICB9Ci0JCX0KLQkJcmV0dXJuIHRvdGFsOwotCX0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWw7CisgICAgfQogCi0Jc3RhdGljIGJ5dGVbXSB0b1VURjhCeXRlcyhTdHJpbmcgdmFsdWUsIGludCBsZW5ndGgpIHsKLQkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2xlbmd0aF07Ci0JCWludCBwb3MgPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gdmFsdWUubGVuZ3RoKCk7IC0taSA+PSAwOykgewotCQkJY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCWlmIChjaCA8IDB4ODApIHsKKyAgICBzdGF0aWMgYnl0ZVtdIHRvVVRGOEJ5dGVzKFN0cmluZyB2YWx1ZSwgaW50IGxlbmd0aCkgeworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgaW50IHBvcyA9IHJlc3VsdC5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSB2YWx1ZS5sZW5ndGgoKTsgLS1pID49IDA7KSB7CisgICAgICAgICAgICBjaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGNoIDwgMHg4MCkgewogICAgICAgICAgICAgICAgIHJlc3VsdFstLXBvc10gPSAoYnl0ZSkgY2g7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDwgMHg4MDApIHsKLQkJCQlyZXN1bHRbLS1wb3NdID0gKGJ5dGUpICgweDgwIHwgKGNoICYgMHgzZikpOwotCQkJCXJlc3VsdFstLXBvc10gPSAoYnl0ZSkgKDB4YzAgfCAoY2ggPj4gNikpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHRbLS1wb3NdID0gKGJ5dGUpICgweDgwIHwgKGNoICYgMHgzZikpOwotCQkJCXJlc3VsdFstLXBvc10gPSAoYnl0ZSkgKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzZikpOwotCQkJCXJlc3VsdFstLXBvc10gPSAoYnl0ZSkgKDB4ZTAgfCAoY2ggPj4gMTIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgICAgICAgICByZXN1bHRbLS1wb3NdID0gKGJ5dGUpICgweDgwIHwgKGNoICYgMHgzZikpOworICAgICAgICAgICAgICAgIHJlc3VsdFstLXBvc10gPSAoYnl0ZSkgKDB4YzAgfCAoY2ggPj4gNikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbLS1wb3NdID0gKGJ5dGUpICgweDgwIHwgKGNoICYgMHgzZikpOworICAgICAgICAgICAgICAgIHJlc3VsdFstLXBvc10gPSAoYnl0ZSkgKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzZikpOworICAgICAgICAgICAgICAgIHJlc3VsdFstLXBvc10gPSAoYnl0ZSkgKDB4ZTAgfCAoY2ggPj4gMTIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL3BhY2thZ2UuaHRtbCBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL3BhY2thZ2UuaHRtbAppbmRleCA0ODkyMGFiLi4yYTA5YmYxIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9wYWNrYWdlLmh0bWwKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvcGFja2FnZS5odG1sCkBAIC0xLDcgKzEsOSBAQAogPGh0bWw+CiAgIDxib2R5PgogICAgIDxwPgotICAgICAgVGhpcyBwYWNrYWdlIGNhbiByZWFkIGFuZCB3cml0ZSB0aGUgc3RhbmRhcmQgemlwIGZvcm1hdC4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIGZvciBjb21wcmVzc2luZyBhbmQgZGVjb21wcmVzc2luZyBkYXRhIGluIAorICAgICAgWklQIGFuZCBHWklQIGZpbGUgZm9ybWF0cy4KICAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YSBiL2FyY2hpdmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQppbmRleCA5MmM4NjlhLi43NjRmMzRkIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCkBAIC0yMSw2ICsyMSwxMCBAQAogICogaWYgdGhpcyB0b29sIHJ1bnMgYWdhaW4uIEJldHRlciBtYWtlIGNoYW5nZXMgaW4gdGhlIHRlbXBsYXRlIGZpbGUuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBSZWR1bmRhbnQgY29kZSBoYXMgYmVlbiByZW1vdmVkIGFuZCBpcyBub3cgY2FsbGVkIGZyb20gTXNnSGVscC4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS5pbnRlcm5hbC5ubHM7CiAKIApAQCAtMzAsOCArMzQsOSBAQAogaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5WTTsKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgYW5kIHJldHVybnMgdGhlbSwKQEAgLTQ4LDkgKzUzLDExIEBACiAgKiAKICAqLwogcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLSAgICAKKworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzUmVzb3VyY2UgPQogICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUuaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsKKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdoaWNoIGhhcyBubyBhcmd1bWVudHMuCkBAIC02MCw3ICs2Nyw5IEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKQEAgLTEyNyw2ICsxMzYsMTIgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnLCBhcmdzKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KKworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIER1cGxpY2F0ZSBjb2RlIHdhcyBkcm9wcGVkIGluIGZhdm9yIG9mIHVzaW5nIE1zZ0hlbHAuCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvbWFpbi9uYXRpdmUvc2llYi5jIGIvYXJjaGl2ZS9zcmMvbWFpbi9uYXRpdmUvc2llYi5jCmluZGV4IGU2YzlmMzMuLmFiOTQzMGIgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL21haW4vbmF0aXZlL3NpZWIuYworKysgYi9hcmNoaXZlL3NyYy9tYWluL25hdGl2ZS9zaWViLmMKQEAgLTQsMjIgKzQsMTEgQEAKIAogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0vKgotLy8gVGhyb3cgamF2YS51dGlsLnppcC5EYXRhRm9ybWF0RXhjZXB0aW9uCi12b2lkIHRocm93TmV3RGF0YUZvcm1hdEV4Y2VwdGlvbiAoSk5JRW52ICogZW52LCBjb25zdCBjaGFyICptZXNzYWdlKQotewotICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL3V0aWwvemlwL0RhdGFGb3JtYXRFeGNlcHRpb24iLCBtZXNzYWdlKTsKLX0KLSovCi0KLS8qIG1jOiBBbHJlYWR5IGRlZmluZWQgaW4gZGFsdmlrL2xpYmNvcmUvbHVuaS9zcmMvbWFpbi9uYXRpdmUvZXhjZXB0aW9ucy5jCisvLyBUaHJvdyBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvcgogdm9pZCB0aHJvd05ld091dE9mTWVtb3J5RXJyb3IgKEpOSUVudiAqIGVudiwgY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKLS8vIFRocm93IGphdmEudXRpbC56aXAuT3V0T2ZNZW1vcnlFcnJvcgotLy8gIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvdXRpbC96aXAvT3V0T2ZNZW1vcnlFcnJvciIsIG1lc3NhZ2UpOwogICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwgbWVzc2FnZSk7CiB9Ci0qLwogCiAvLyBUaHJvdyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiB2b2lkIHRocm93TmV3SWxsZWdhbFN0YXRlRXhjZXB0aW9uIChKTklFbnYgKiBlbnYsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9BbGxUZXN0cy5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvQWxsVGVzdHMuamF2YQppbmRleCA0NjljNmNkLi5jZGM4ZDBiIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9BbGxUZXN0cy5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0FsbFRlc3RzLmphdmEKQEAgLTM3LDEyICszNywxNSBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQXR0cmlidXRlc1Rlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSmFyRW50cnlUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEphckV4Y2VwdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSmFyRXhlY1Rlc3QuY2xhc3MpOworLy9BbGwgdGVzdHMgaW4gZm9sbG93aW5nIGNsYXNzIGFyZSBmYWlsZWQgb24gdGFyZ2V0IFZNCisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEphckV4ZWNUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEphckZpbGVUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEphcklucHV0U3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShKYXJPdXRwdXRTdHJlYW1UZXN0LmNsYXNzKTsKKy8vQWxsIHRlc3RzIGluIGZvbGxvd2luZyBjbGFzcyBhcmUgZmFpbGVkIG9uIHRhcmdldCBWTQorLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShKYXJPdXRwdXRTdHJlYW1UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1hbmlmZXN0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShaaXBFeGVjVGVzdC5jbGFzcyk7CisvL0FsbCB0ZXN0cyBpbiBmb2xsb3dpbmcgY2xhc3MgYXJlIGZhaWxlZCBvbiB0YXJnZXQgVk0KKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoWmlwRXhlY1Rlc3QuY2xhc3MpOwogICAgICAgICAvLyAkSlVuaXQtRU5EJAogICAgICAgICByZXR1cm4gc3VpdGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvQXR0cmlidXRlc05hbWVUZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9BdHRyaWJ1dGVzTmFtZVRlc3QuamF2YQppbmRleCA5Y2M0MDk3Li43MmY0NWU0IDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9BdHRyaWJ1dGVzTmFtZVRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9BdHRyaWJ1dGVzTmFtZVRlc3QuamF2YQpAQCAtMTcsMTUgKzE3LDI5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudGVzdHMuamF2YS51dGlsLmphcjsKIAotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEF0dHJpYnV0ZXMuTmFtZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQXR0cmlidXRlc05hbWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcy5OYW1lI05hbWUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gQ2hlY2tzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQXR0cmlidXRlc05hbWVfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODUKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0F0dHJpYnV0ZXNUZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9BdHRyaWJ1dGVzVGVzdC5qYXZhCmluZGV4IDkwZGRiMjMuLmJmZjEzNWMgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0F0dHJpYnV0ZXNUZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvQXR0cmlidXRlc1Rlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuamFyOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTI2LDYgKzMxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEF0dHJpYnV0ZXMuY2xhc3MpIAogcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIHByaXZhdGUgQXR0cmlidXRlcyBhOwogCkBAIC00MSw2ICs0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMjQXR0cmlidXRlcyhqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXR0cmlidXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX2phcl9BdHRyaWJ1dGVzKCkgewogICAgICAgICBBdHRyaWJ1dGVzIGEyID0gbmV3IEF0dHJpYnV0ZXMoYSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhhLCBhMik7CkBAIC01MSw2ICs2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMjY2xlYXIoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgYS5jbGVhcigpOwogICAgICAgICBhc3NlcnROdWxsKCJhKSBBbGwgZW50cmllcyBzaG91bGQgYmUgbnVsbCBhZnRlciBjbGVhciIsIGEuZ2V0KCIxIikpOwpAQCAtNjMsNiArODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI2NvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc0tleUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKCJhKSBTaG91bGQgaGF2ZSByZXR1cm5lZCBmYWxzZSIsICFhLmNvbnRhaW5zS2V5KG5ldyBJbnRlZ2VyKDEpKSk7CiAgICAgICAgIGFzc2VydFRydWUoImIpIFNob3VsZCBoYXZlIHJldHVybmVkIGZhbHNlIiwgIWEuY29udGFpbnNLZXkoIjAiKSk7CkBAIC03Miw2ICsxMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI2NvbnRhaW5zVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWluc1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNWYWx1ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSByZXR1cm5lZCBmYWxzZSIsICFhLmNvbnRhaW5zVmFsdWUoIk9uZSIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZSIsIGEuY29udGFpbnNWYWx1ZSgib25lIikpOwpAQCAtODAsNiArMTIyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyNlbnRyeVNldCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cnlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VudHJ5U2V0KCkgewogICAgICAgICBTZXQ8TWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gZW50cnlTZXQgPSBhLmVudHJ5U2V0KCk7CiAgICAgICAgIFNldDxPYmplY3Q+IGtleVNldCA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKQEAgLTEwNiw2ICsxNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI2dldChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoImEpIEluY29ycmVjdCB2YWx1ZSByZXR1cm5lZCIsICJvbmUiLCBhLmdldFZhbHVlKCIxIikpOwogICAgICAgICBhc3NlcnROdWxsKCJiKSBJbmNvcnJlY3QgdmFsdWUgcmV0dXJuZWQiLCBhLmdldFZhbHVlKCIwIikpOwpAQCAtMTE0LDYgKzE3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMjaXNFbXB0eSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFbXB0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBiZSBlbXB0eSIsICFhLmlzRW1wdHkoKSk7CiAgICAgICAgIGEuY2xlYXIoKTsKQEAgLTEyNSw2ICsxOTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI2tleVNldCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXQoKSB7CiAgICAgICAgIFNldDw/PiBzID0gYS5rZXlTZXQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHMuc2l6ZSgpKTsKQEAgLTEzNyw2ICsyMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI3B1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dEFsbExqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICBBdHRyaWJ1dGVzIGIgPSBuZXcgQXR0cmlidXRlcygpOwogICAgICAgICBiLnB1dFZhbHVlKCIzIiwgInNhbiIpOwpAQCAtMTY1LDYgKzI1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMjcHV0QWxsKGphdmEudXRpbC5NYXApCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXRBbGxMamF2YV91dGlsX01hcDIoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDY0CiAgICAgICAgIHRyeSB7CkBAIC0xODksNiArMjg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYS5yZW1vdmUobmV3IEF0dHJpYnV0ZXMuTmFtZSgiMSIpKTsKICAgICAgICAgYS5yZW1vdmUobmV3IEF0dHJpYnV0ZXMuTmFtZSgiMyIpKTsKQEAgLTE5OSw2ICszMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI3NpemUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpemUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNpemUgcmV0dXJuZWQiLCA0LCBhLnNpemUoKSk7CiAgICAgICAgIGEuY2xlYXIoKTsKQEAgLTIwOCw2ICszMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI3ZhbHVlcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZXMoKSB7CiAgICAgICAgIENvbGxlY3Rpb248Pz4gdmFsdWVDb2xsZWN0aW9uID0gYS52YWx1ZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYSkgU2hvdWxkIGNvbnRhaW4gZW50cnkiLCB2YWx1ZUNvbGxlY3Rpb24uY29udGFpbnMoIm9uZSIpKTsKQEAgLTIxOSw2ICszNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzI2Nsb25lKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIEF0dHJpYnV0ZXMgYTIgPSAoQXR0cmlidXRlcykgYS5jbG9uZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYTIpOwpAQCAtMjI5LDYgKzM2MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIEF0dHJpYnV0ZXMuTmFtZSBuMSA9IG5ldyBBdHRyaWJ1dGVzLk5hbWUoIm5hbWUiKSwgbjIgPSBuZXcgQXR0cmlidXRlcy5OYW1lKCJOYW1lIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhuMSwgbjIpOwpAQCAtMjQ0LDYgKzM4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMucHV0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIENoZWNrcyBDbGFzc0Nhc3RFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBBdHRyaWJ1dGVzIGF0dHMgPSBuZXcgQXR0cmlidXRlcygpOwogICAgICAgICBhc3NlcnROdWxsKCJBc3NlcnQgMDogIiwgYXR0cy5wdXQoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgsICJ0b29scy5qYXIiKSk7CkBAIC0yNjYsNiArNDE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcy5wdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNsYXNzQ2FzdEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0TGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX09iamVjdF9OdWxsKCkgewogCiAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZXMoKTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phckVudHJ5VGVzdC5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyRW50cnlUZXN0LmphdmEKaW5kZXggYTVkZWZhZC4uNjVhNGI0YSAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyRW50cnlUZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyRW50cnlUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudGVzdHMuamF2YS51dGlsLmphcjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMjgsNiArMzMsOCBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LnJlc291cmNlLlN1cHBvcnRfUmVzb3VyY2VzOwogCisKK0BUZXN0VGFyZ2V0Q2xhc3MoSmFyRW50cnkuY2xhc3MpIAogcHVibGljIGNsYXNzIEphckVudHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICBwcml2YXRlIFppcEVudHJ5IHppcEVudHJ5OwogCkBAIC02Niw2ICs3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphckVudHJ5I0phckVudHJ5KGphdmEudXRpbC56aXAuWmlwRW50cnkpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSmFyRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLnppcC5aaXBFbnRyeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfemlwX1ppcEVudHJ5KCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKCJKYXIgZmlsZSBpcyBudWxsIiwgamFyRmlsZSk7CiAgICAgICAgIHppcEVudHJ5ID0gamFyRmlsZS5nZXRFbnRyeShlbnRyeU5hbWUpOwpAQCAtNzksNiArOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5KYXJFbnRyeSNnZXRBdHRyaWJ1dGVzKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdHRyaWJ1dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdHRyaWJ1dGVzKCkgewogICAgICAgICBKYXJGaWxlIGF0dHJKYXIgPSBudWxsOwogICAgICAgICBGaWxlIGZpbGUgPSBudWxsOwpAQCAtMTA4LDYgKzEzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphckVudHJ5I2dldENlcnRpZmljYXRlcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDZXJ0aWZpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uewogICAgICAgICB6aXBFbnRyeSA9IGphckZpbGUuZ2V0RW50cnkoZW50cnlOYW1lMik7CiAgICAgICAgIGphckVudHJ5ID0gbmV3IEphckVudHJ5KHppcEVudHJ5KTsKQEAgLTEzMSw2ICsxNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5KYXJFbnRyeSNnZXRDb2RlU2lnbmVycygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29kZVNpZ25lcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvZGVTaWduZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGphckZpbGVOYW1lID0gIlRlc3RDb2RlU2lnbmVycy5qYXIiOwogICAgICAgICBTdXBwb3J0X1Jlc291cmNlcy5jb3B5RmlsZShyZXNvdXJjZXMsIG51bGwsIGphckZpbGVOYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phckV4Y2VwdGlvblRlc3QuamF2YSBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phckV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAyYzk3MDVkLi4xNjkxNzlhIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxNSArMTcsMzEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuamFyOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhKYXJFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEphckV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuSmFyRXhjZXB0aW9uI0phckV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiQW5vdGhlciBmdW5jdGlvbmFsaXR5IGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSmFyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IE1hbmlmZXN0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phckV4ZWNUZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJFeGVjVGVzdC5qYXZhCmluZGV4IGU2YWUzYjUuLjQ4OTdlNTIgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phckV4ZWNUZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyRXhlY1Rlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuamFyOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKQEAgLTM0LDExICszOSwyMSBAQAogICoKICAqLwogCitAVGVzdFRhcmdldENsYXNzKEphck91dHB1dFN0cmVhbS5jbGFzcykKIHB1YmxpYyBjbGFzcyBKYXJFeGVjVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAgICAgLyoqCiAgICAgICogcmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTE1NjIgaXNzdWUgCiAgICAgICoKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gZnVuY3Rpb25hbCB0ZXN0LiBFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dE5leHRFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuemlwLlppcEVudHJ5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0XzE1NjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY3JlYXRlIHRoZSBtYW5pZmVzdAogICAgICAgICBNYW5pZmVzdCBtYW4gPSBuZXcgTWFuaWZlc3QoKTsKQEAgLTc0LDYgKzg5LDE1IEBACiAgICAgICogdGVzdHMgQ2xhc3MtUGF0aCBlbnRyeSBpbiBtYW5pZmVzdAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdHJvdWJsZXMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJKYXJPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3MsIGphdmEudXRpbC5qYXIuTWFuaWZlc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfamFyX2NsYXNzX3BhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmb29KYXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzXyIsICIuamFyIik7CiAgICAgICAgIEZpbGUgYmFySmFyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c18iLCAiLmphciIpOwpAQCAtMTM1LDYgKzE1OSwxNSBAQAogICAgICAqIHRlc3RzIGNhc2Ugd2hlbiBNYWluLUNsYXNzIGlzIG5vdCBpbiB0aGUgamFyIGxhdW5jaGVkIGJ1dCBpbiBhbm90aGVyIGphciByZWZlcmVuY2VkIGJ5IENsYXNzLVBhdGgKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHRyb3VibGVzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSmFyT3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21haW5fY2xhc3NfaW5fYW5vdGhlcl9qYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmb29KYXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzXyIsICIuamFyIik7CiAgICAgICAgIEZpbGUgYmFySmFyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c18iLCAiLmphciIpOwpAQCAtMTY5LDYgKzIwMiwxNSBAQAogICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKCJGT09CQVIiKSk7CiAgICAgfQogICAgIAorQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJKYXJPdXRwdXRTdHJlYW0iLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcywgamF2YS51dGlsLmphci5NYW5pZmVzdC5jbGFzc30KKyAgICAgICAgICApCisgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xhc3NwYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgcmVzb3VyY2VzID0gU3VwcG9ydF9SZXNvdXJjZXMuY3JlYXRlVGVtcEZvbGRlcigpOwogCmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJGaWxlVGVzdC5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyRmlsZVRlc3QuamF2YQppbmRleCAxY2ZhNzZlLi41YjExYjhmIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJGaWxlVGVzdC5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phckZpbGVUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudGVzdHMuamF2YS51dGlsLmphcjsKIAorCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC0zNiw2ICs0Miw4IEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1BsYXRmb3JtRmlsZTsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LnJlc291cmNlLlN1cHBvcnRfUmVzb3VyY2VzOwogCisKK0BUZXN0VGFyZ2V0Q2xhc3MoSmFyRmlsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSmFyRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKQEAgLTc0LDYgKzgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuSmFyRmlsZSNKYXJGaWxlKGphdmEuaW8uRmlsZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIlRlc3QgY29udGFpbnMgZW1wdHkgYnJhY2tldHMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSmFyRmlsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLmphci5KYXJGaWxlKGphdmEuaW8uRmlsZSkKICAgICAgICAgLyoKQEAgLTg3LDYgKzEwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphckZpbGUjSmFyRmlsZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBjb250YWlucyBlbXB0eSBicmFja2V0cy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJKYXJGaWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5qYXIuSmFyRmlsZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICAvKgpAQCAtMTAwLDYgKzEyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphckZpbGUjZW50cmllcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cmllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cmllcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvKgogICAgICAgICAgKiBOb3RlIG9ubHkgKGFuZCBhbGwgb2YpIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZQpAQCAtMTE3LDYgKzE1MiwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoNiwgaSk7CiAgICAgfQogICAgIAorQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cmllcyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cmllczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3VwcG9ydF9SZXNvdXJjZXMuY29weUZpbGUocmVzb3VyY2VzLCBudWxsLCBqYXJOYW1lKTsKICAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUobmV3IEZpbGUocmVzb3VyY2VzLCBqYXJOYW1lKSk7CkBAIC0xNDUsNiArMTg5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuSmFyRmlsZSNnZXRKYXJFbnRyeShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRKYXJFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEphckVudHJ5TGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdXBwb3J0X1Jlc291cmNlcy5jb3B5RmlsZShyZXNvdXJjZXMsIG51bGwsIGphck5hbWUpOwpAQCAtMjI4LDYgKzI4MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphckZpbGUjZ2V0TWFuaWZlc3QoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1hbmlmZXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYW5pZmVzdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5qYXIuTWFuaWZlc3QKICAgICAgICAgLy8gamF2YS51dGlsLmphci5KYXJGaWxlLmdldE1hbmlmZXN0KCkKQEAgLTMwOSw2ICszNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5KYXJGaWxlI2dldElucHV0U3RyZWFtKGphdmEudXRpbC56aXAuWmlwRW50cnkpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC56aXAuWmlwRW50cnkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5wdXRTdHJlYW1MamF2YV91dGlsX2phcl9KYXJFbnRyeSgpIHsKICAgICAgICAgRmlsZSBsb2NhbEZpbGUgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMzIzLDcgKzM5NCw3IEBACiAgICAgICAgICAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUobG9jYWxGaWxlKTsKICAgICAgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gaXMgPSBqZi5nZXRJbnB1dFN0cmVhbShqZi5nZXRFbnRyeShlbnRyeU5hbWUpKTsKIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAgICAgamYuY2xvc2UoKTsKKy8vICAgICAgICAgICAgamYuY2xvc2UoKTsKIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGludmFsaWQgc3RyZWFtIiwgaXMuYXZhaWxhYmxlKCkgPiAwKTsKICAgICAgICAgICAgIGludCByID0gaXMucmVhZChiLCAwLCAxMDI0KTsKQEAgLTM1Myw2ICs0MjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5KYXJGaWxlI2dldElucHV0U3RyZWFtKGphdmEudXRpbC56aXAuWmlwRW50cnkpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGFuZCBmdW5jdGlvbmFsaXR5IGNoZWNrZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5wdXRTdHJlYW0iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC56aXAuWmlwRW50cnkuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnB1dFN0cmVhbUxqYXZhX3V0aWxfamFyX0phckVudHJ5X3N1YnRlc3QwKCkgewogICAgICAgICBGaWxlIHNpZ25lZEZpbGUgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtNDA0LDYgKzQ4NCwxNSBAQAogICAgICAqIFRoZSBqYXIgY3JlYXRlZCBieSAxLjQgd2hpY2ggZG9lcyBub3QgcHJvdmlkZSBhCiAgICAgICogYWxnb3JpdGhtLURpZ2VzdC1NYW5pZmVzdC1NYWluLUF0dHJpYnV0ZXMgZW50cnkgaW4gLlNGIGZpbGUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyaWVzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJfY3JlYXRlZF9iZWZvcmVfamF2YV81KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG1vZGlmaWVkSmFyTmFtZSA9ICJDcmVhdGVkX2J5XzFfNC5qYXIiOwogICAgICAgICBTdXBwb3J0X1Jlc291cmNlcy5jb3B5RmlsZShyZXNvdXJjZXMsIG51bGwsIG1vZGlmaWVkSmFyTmFtZSk7CkBAIC00MTcsNiArNTA2LDE1IEBACiAgICAgfQogCiAgICAgLyogVGhlIGphciBpcyBpbnRhY3QsIHRoZW4gZXZlcnl0aGluZyBpcyBhbGwgcmlnaHQuICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyaWVzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJGaWxlX0ludGVncmF0ZV9KYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgbW9kaWZpZWRKYXJOYW1lID0gIkludGVncmF0ZS5qYXIiOwogICAgICAgICBTdXBwb3J0X1Jlc291cmNlcy5jb3B5RmlsZShyZXNvdXJjZXMsIG51bGwsIG1vZGlmaWVkSmFyTmFtZSk7CkBAIC00MzMsNiArNTMxLDE1IEBACiAgICAgICogSWYgYW5vdGhlciBlbnRyeSBpcyBpbnNlcnRlZCBpbnRvIE1hbmlmZXN0LCBubyBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZQogICAgICAqIHRocm93biBvdXQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyaWVzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJGaWxlX0luc2VydEVudHJ5X2luX01hbmlmZXN0X0phcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBtb2RpZmllZEphck5hbWUgPSAiSW5zZXJ0ZWRfRW50cnlfTWFuaWZlc3QuamFyIjsKICAgICAgICAgU3VwcG9ydF9SZXNvdXJjZXMuY29weUZpbGUocmVzb3VyY2VzLCBudWxsLCBtb2RpZmllZEphck5hbWUpOwpAQCAtNDUzLDYgKzU2MCwxNSBAQAogICAgICAqIElmIGFub3RoZXIgZW50cnkgaXMgaW5zZXJ0ZWQgaW50byBNYW5pZmVzdCwgbm8gc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUKICAgICAgKiB0aHJvd24gb3V0LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cmllcyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSW5zZXJ0ZWRfRW50cnlfTWFuaWZlc3Rfd2l0aF9EaWdlc3RDb2RlKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBtb2RpZmllZEphck5hbWUgPSAiSW5zZXJ0ZWRfRW50cnlfTWFuaWZlc3Rfd2l0aF9EaWdlc3RDb2RlLmphciI7CkBAIC00NzUsNiArNTkxLDE1IEBACiAgICAgICogdGhyb3cgc2VjdXJpdHkgRXhjZXB0aW9uLCBidXQgaXQgd2lsbCBhbnl0aW1lIGJlZm9yZSB0aGUgaW5wdXRTdHJlYW0gZ290CiAgICAgICogZnJvbSBnZXRJbnB1dFN0cmVhbSBtZXRob2QgaGFzIGJlZW4gcmVhZCB0byBlbmQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGFuZCBmdW5jdGlvbmFsaXR5IGNoZWNrZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5wdXRTdHJlYW0iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC56aXAuWmlwRW50cnkuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJGaWxlX01vZGlmaWVkX0NsYXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG1vZGlmaWVkSmFyTmFtZSA9ICJNb2RpZmllZF9DbGFzcy5qYXIiOwogICAgICAgICBTdXBwb3J0X1Jlc291cmNlcy5jb3B5RmlsZShyZXNvdXJjZXMsIG51bGwsIG1vZGlmaWVkSmFyTmFtZSk7CkBAIC01MDQsNiArNjI5LDE1IEBACiAgICAgICogdGFtcGVyZWQgbWFudWFsbHkuIEhlbmNlIHRoZSBSSSA1LjAgSmFyRmlsZS5nZXRJbnB1dFN0cmVhbSBvZiBhbnkKICAgICAgKiBKYXJFbnRyeSB3aWxsIHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbiwgYnV0IHRoZSBhcGFjaGUgaGFybW9ueSB3aWxsIG5vdC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gYW5kIGZ1bmN0aW9uYWxpdHkgY2hlY2tlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnB1dFN0cmVhbSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLnppcC5aaXBFbnRyeS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0phckZpbGVfTW9kaWZpZWRfTWFuaWZlc3RfTWFpbkF0dHJpYnV0ZXMoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG1vZGlmaWVkSmFyTmFtZSA9ICJNb2RpZmllZF9NYW5pZmVzdF9NYWluQXR0cmlidXRlcy5qYXIiOwpAQCAtNTI3LDYgKzY2MSwxNSBAQAogICAgICAqIGV4YW1wbGUgVGVzdC5jbGFzcyBpbiBvdXIgamFyLCB0aGUgamFyRmlsZS5nZXRJbnB1dFN0cmVhbSB3aWxsIHRocm93CiAgICAgICogU2VjdXJpdHkgRXhjZXB0aW9uLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBhbmQgZnVuY3Rpb25hbGl0eSBjaGVja2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldElucHV0U3RyZWFtIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuemlwLlppcEVudHJ5LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSmFyRmlsZV9Nb2RpZmllZF9NYW5pZmVzdF9FbnRyeUF0dHJpYnV0ZXMoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG1vZGlmaWVkSmFyTmFtZSA9ICJNb2RpZmllZF9NYW5pZmVzdF9FbnRyeUF0dHJpYnV0ZXMuamFyIjsKQEAgLTU0OSw2ICs2OTIsMTUgQEAKICAgICAgKiBJZiB0aGUgY29udGVudCBvZiB0aGUgLlNBIGZpbGUgaXMgbW9kaWZpZWQsIG5vIG1hdHRlciB3aGF0IGl0IHJlc2lkZXMsCiAgICAgICogSmFyRmlsZS5nZXRJbnB1dFN0cmVhbSBvZiBhbnkgSmFyRW50cnkgd2lsbCB0aHJvdyBTZWN1cml0eSBFeGNlcHRpb24uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGFuZCBmdW5jdGlvbmFsaXR5IGNoZWNrZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5wdXRTdHJlYW0iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC56aXAuWmlwRW50cnkuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJGaWxlX01vZGlmaWVkX1NGX0VudHJ5QXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBtb2RpZmllZEphck5hbWUgPSAiTW9kaWZpZWRfU0ZfRW50cnlBdHRyaWJ1dGVzLmphciI7CiAgICAgICAgIFN1cHBvcnRfUmVzb3VyY2VzLmNvcHlGaWxlKHJlc291cmNlcywgbnVsbCwgbW9kaWZpZWRKYXJOYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtVGVzdC5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggOWY0Y2QwZS4uNWFiMzk0YyAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudGVzdHMuamF2YS51dGlsLmphcjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuVVJMOwpAQCAtMjksNiArMzQsNyBAQAogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIAorQFRlc3RUYXJnZXRDbGFzcyhKYXJJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSmFySW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICAvLyBhICdub3JtYWwnIGphciBmaWxlCiAgICAgcHJpdmF0ZSBTdHJpbmcgamFyTmFtZTsKQEAgLTUzLDYgKzU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW0jSmFySW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJKYXJJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICAgIHRyeSB7CkBAIC04MSw2ICs5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtI2dldE1hbmlmZXN0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYW5pZmVzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWFuaWZlc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0CiAgICAgICAgIC8vIGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW0uZ2V0TWFuaWZlc3QoKQpAQCAtMTA3LDYgKzEzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtI2dldE5leHRKYXJFbnRyeSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4gQ2FzZTEiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROZXh0SmFyRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5leHRKYXJFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBkZXNpcmVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJmb28vIiwKICAgICAgICAgICAgICAgICAiZm9vL2Jhci8iLCAiZm9vL2Jhci9BLmNsYXNzIiwgIkJsYWgudHh0IiB9KSk7CkBAIC0xMjEsNiArMTU0LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWwsIGRlc2lyZWQpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4gQ2FzZTIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROZXh0SmFyRW50cnkiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0phcklucHV0U3RyZWFtX0ludGVncmF0ZV9KYXJfZ2V0TmV4dEVudHJ5KCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBpbnRKYXJOYW1lID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0VVJMKCJJbnRlZ3JhdGUuamFyIik7CkBAIC0xMzcsNiArMTc5LDE1IEBACiAgICAgICAgIGppbi5jbG9zZSgpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gJiBaaXBFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5leHRFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSmFySW5wdXRTdHJlYW1fTW9kaWZpZWRfQ2xhc3NfZ2V0TmV4dEVudHJ5KCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBtb2RKYXJOYW1lID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0VVJMKCJNb2RpZmllZF9DbGFzcy5qYXIiKTsKQEAgLTE2NCw2ICsyMTUsMTUgQEAKICAgICAgICAgamluLmNsb3NlKCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiAmIFppcEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmV4dEVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJJbnB1dFN0cmVhbV9Nb2RpZmllZF9NYW5pZmVzdF9NYWluQXR0cmlidXRlc19nZXROZXh0RW50cnkoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG1vZEphck5hbWUgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRVUkwoIk1vZGlmaWVkX01hbmlmZXN0X01haW5BdHRyaWJ1dGVzLmphciIpOwpAQCAtMTkyLDYgKzI1MiwxNSBAQAogICAgICAgICBqaW4uY2xvc2UoKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gJiBaaXBFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5leHRFbnRyeSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSmFySW5wdXRTdHJlYW1fTW9kaWZpZWRfTWFuaWZlc3RfRW50cnlBdHRyaWJ1dGVzX2dldE5leHRFbnRyeSgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgbW9kSmFyTmFtZSA9IFN1cHBvcnRfUmVzb3VyY2VzCkBAIC0yMTksNiArMjg4LDE1IEBACiAgICAgICAgIGppbi5jbG9zZSgpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiAmIFppcEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmV4dEVudHJ5IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJJbnB1dFN0cmVhbV9Nb2RpZmllZF9TRl9FbnRyeUF0dHJpYnV0ZXNfZ2V0TmV4dEVudHJ5KCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBtb2RKYXJOYW1lID0gU3VwcG9ydF9SZXNvdXJjZXMKQEAgLTI0Niw2ICszMjQsMTUgQEAKICAgICAgICAgamluLmNsb3NlKCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiAmIFppcEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSmFySW5wdXRTdHJlYW1fTW9kaWZpZWRfQ2xhc3NfcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBtb2RKYXJOYW1lID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0VVJMKCJNb2RpZmllZF9DbGFzcy5qYXIiKTsKICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgVVJMKG1vZEphck5hbWUpLm9wZW5Db25uZWN0aW9uKCkKQEAgLTI3NSw2ICszNjIsMTUgQEAKICAgICAgICAgamluLmNsb3NlKCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSW50ZWdyYXRlX0phcl9yZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGludEphck5hbWUgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRVUkwoIkludGVncmF0ZS5qYXIiKTsKICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgVVJMKGludEphck5hbWUpLm9wZW5Db25uZWN0aW9uKCkKQEAgLTI5Niw2ICszOTIsMTUgQEAKICAgICAgICAgamluLmNsb3NlKCk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uICYgWmlwRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJJbnB1dFN0cmVhbV9Nb2RpZmllZF9NYW5pZmVzdF9NYWluQXR0cmlidXRlc19yZWFkKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBtb2RKYXJOYW1lID0gU3VwcG9ydF9SZXNvdXJjZXMKQEAgLTMyNyw2ICs0MzIsMTUgQEAKICAgICAgICAgamluLmNsb3NlKCk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uICYgWmlwRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9KYXJJbnB1dFN0cmVhbV9Nb2RpZmllZF9TRl9FbnRyeUF0dHJpYnV0ZXNfcmVhZCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgbW9kSmFyTmFtZSA9IFN1cHBvcnRfUmVzb3VyY2VzCmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggOGM1ZmM4OC4uYzU2NGQzZiAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phck91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuamFyOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTI4LDExICszMywyMSBAQAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9FeGVjOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSmFyT3V0cHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBKYXJPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbSNwdXROZXh0RW50cnkoamF2YS51dGlsLnppcC5aaXBFbnRyeSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXROZXh0RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLnppcC5aaXBFbnRyeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXROZXh0RW50cnlMamF2YV91dGlsX3ppcF9aaXBFbnRyeSgpIHsKICAgICAgICAgLy8gdGVzdENsYXNzIGZpbGVgcyBhY3R1YWwgZXh0ZW5zaW9uIGlzIC5jbGFzcywgc2luY2UgaGF2aW5nIC5jbGFzcwogICAgICAgICAvLyBleHRlbnNpb24gZmlsZXMgaW4gc291cmNlIGRpciBjYXVzZXMKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL01hbmlmZXN0VGVzdC5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvTWFuaWZlc3RUZXN0LmphdmEKaW5kZXggNWQ5OTg3OC4uMjljZjQ3NCAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvTWFuaWZlc3RUZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvTWFuaWZlc3RUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudGVzdHMuamF2YS51dGlsLmphcjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0yOSw2ICszNCw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTWFuaWZlc3QuY2xhc3MpIAogcHVibGljIGNsYXNzIE1hbmlmZXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGphck5hbWUgPSAiaHl0c19wYXRjaC5qYXIiOwpAQCAtNjEsNiArNjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLmphci5NYW5pZmVzdCNNYW5pZmVzdCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTWFuaWZlc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLmphci5NYW5pZmVzdCgpCiAgICAgICAgIE1hbmlmZXN0IGVtcHR5TWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoKTsKQEAgLTczLDYgKzg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjTWFuaWZlc3QoamF2YS5pby5JbnB1dFN0cmVhbSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNYW5pZmVzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0KGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICAgIC8qCkBAIC0xMzEsNiArMTU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjY2xlYXIoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLmphci5NYW5pZmVzdC5jbGVhcigpCiAgICAgICAgIG0yLmNsZWFyKCk7CkBAIC0xNDIsNiArMTc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0QXR0cmlidXRlcyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEF0dHJpYnV0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdHRyaWJ1dGVzTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMKICAgICAgICAgLy8gamF2YS51dGlsLmphci5NYW5pZmVzdC5nZXRBdHRyaWJ1dGVzKGphdmEubGFuZy5TdHJpbmcpCkBAIC0xNTQsNiArMTk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0RW50cmllcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW50cmllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50cmllcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5NYXAgamF2YS51dGlsLmphci5NYW5pZmVzdC5nZXRFbnRyaWVzKCkKICAgICAgICAgTWFwPFN0cmluZywgQXR0cmlidXRlcz4gbXlNYXAgPSBtMi5nZXRFbnRyaWVzKCk7CkBAIC0xNjcsNiArMjE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0TWFpbkF0dHJpYnV0ZXMoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1haW5BdHRyaWJ1dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYWluQXR0cmlidXRlcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcwogICAgICAgICAvLyBqYXZhLnV0aWwuamFyLk1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkKQEAgLTE3OCw2ICsyMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjcmVhZChqYXZhLmlvLklucHV0U3RyZWFtKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tlZCBvbmx5LiBSZWdyZXNzaW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZExqYXZhX2lvX0lucHV0U3RyZWFtKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTg5CiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IElucHV0U3RyZWFtSW1wbCgpOwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvWmlwRXhlY1Rlc3QuamF2YSBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL1ppcEV4ZWNUZXN0LmphdmEKaW5kZXggMDcxZmVhMS4uYTBkZWU0ZiAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvWmlwRXhlY1Rlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9aaXBFeGVjVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLnRlc3RzLmphdmEudXRpbC5qYXI7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwpAQCAtMzYsNyArNDEsMTcgQEAKICAqIHNvbWUgdGVzdHMgYXJlIGp1c3QgY29weSBvZiBKYXJFeGVjVGVzdCBvbmVzIAogICovCiAKK0BUZXN0VGFyZ2V0Q2xhc3MoWmlwT3V0cHV0U3RyZWFtLmNsYXNzKQogcHVibGljIGNsYXNzIFppcEV4ZWNUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gZnVuY3Rpb25hbCB0ZXN0LiBFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dE5leHRFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuemlwLlppcEVudHJ5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0XzE1NjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTWFuaWZlc3QgbWFuID0gbmV3IE1hbmlmZXN0KCk7CiAgICAgICAgIEF0dHJpYnV0ZXMgYXR0ID0gbWFuLmdldE1haW5BdHRyaWJ1dGVzKCk7CkBAIC03Miw2ICs4NywxNSBAQAogICAgICAqIHRlc3RzIENsYXNzLVBhdGggZW50cnkgaW4gbWFuaWZlc3QKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHRyb3VibGVzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWmlwT3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ppcF9jbGFzc19wYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZm9vWmlwID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c18iLCAiLnppcCIpOwogICAgICAgICBGaWxlIGJhclppcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImh5dHNfIiwgIi56aXAiKTsKQEAgLTEzNiw2ICsxNjAsMTUgQEAKICAgICB9CiAKICAgICAKK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWmlwT3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ppcF9qYXJfbWl4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZm9vSmFyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c18iLCAiLmphciIpOwogICAgICAgICBGaWxlIGJhclppcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImh5dHNfIiwgIi56aXAiKTsKQEAgLTE3MCw2ICsyMDMsMTUgQEAKICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCgiRk9PQkFSIikpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJaaXBPdXRwdXRTdHJlYW0iLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgICApCisgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfemlwX2phcl9taXhfMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIGZvb1ppcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImh5dHNfIiwgIi56aXAiKTsKICAgICAgICAgRmlsZSBiYXJKYXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzXyIsICIuamFyIik7CkBAIC0yMTAsNiArMjUyLDE1IEBACiAgICAgICogdGVzdHMgY2FzZSB3aGVuIE1haW4tQ2xhc3MgaXMgbm90IGluIHRoZSB6aXAgbGF1bmNoZWQgYnV0IGluIGFub3RoZXIgemlwIHJlZmVyZW5jZWQgYnkgQ2xhc3MtUGF0aAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdHJvdWJsZXMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWmlwT3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21haW5fY2xhc3NfaW5fYW5vdGhlcl96aXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmb29aaXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzXyIsICIuemlwIik7CiAgICAgICAgIEZpbGUgYmFyWmlwID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c18iLCAiLnppcCIpOwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvQWRsZXIzMlRlc3QuamF2YSBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0FkbGVyMzJUZXN0LmphdmEKaW5kZXggM2I2ZDBlNi4uYzNiZjczYyAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvQWRsZXIzMlRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9BZGxlcjMyVGVzdC5qYXZhCkBAIC0xNiwxMyArMTYsMjggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEudXRpbC56aXAuQWRsZXIzMjsKIAorQFRlc3RUYXJnZXRDbGFzcyhBZGxlcjMyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBBZGxlcjMyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5BZGxlcjMyI0FkbGVyMzIoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFkbGVyMzIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBvZiBqYXZhLnV0aWwuemlwLkFkbGVyMzIoKQogICAgICAgICBBZGxlcjMyIGFkbCA9IG5ldyBBZGxlcjMyKCk7CkBAIC0zMiw2ICs0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkFkbGVyMzIjZ2V0VmFsdWUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRWYWx1ZSgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2RzIG9mIGphdmEudXRpbC56aXAuZ2V0VmFsdWUoKQogICAgICAgICBBZGxlcjMyIGFkbCA9IG5ldyBBZGxlcjMyKCk7CkBAIC01OSw2ICs4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkFkbGVyMzIjcmVzZXQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2RzIG9mIGphdmEudXRpbC56aXAucmVzZXQoKQogICAgICAgICBBZGxlcjMyIGFkbCA9IG5ldyBBZGxlcjMyKCk7CkBAIC03NSw2ICsxMDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5BZGxlcjMyI3VwZGF0ZShpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91cGRhdGVJKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZHMgb2YgamF2YS51dGlsLnppcC51cGRhdGUoaW50KQogICAgICAgICBBZGxlcjMyIGFkbCA9IG5ldyBBZGxlcjMyKCk7CkBAIC0xMDIsNiArMTQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuQWRsZXIzMiN1cGRhdGUoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdXBkYXRlJEIoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAudXBkYXRlKGJ5dGVbXSkKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgMSwgMiB9OwpAQCAtMTI1LDYgKzE3NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkFkbGVyMzIjdXBkYXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdXBkYXRlJEJJSSgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2RzIG9mIGphdmEudXRpbC56aXAudXBkYXRlKGJ5dGVbXSxpbnQsaW50KQogICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0geyAxLCAyLCAzIH07CmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9DUkMzMlRlc3QuamF2YSBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0NSQzMyVGVzdC5qYXZhCmluZGV4IDFjNzY3NzQuLjA4OWQ2MjUgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0NSQzMyVGVzdC5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0NSQzMyVGVzdC5qYXZhCkBAIC0xNiwxMyArMTYsMjggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ1JDMzIuY2xhc3MpIAogcHVibGljIGNsYXNzIENSQzMyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5DUkMzMiNDUkMzMigpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ1JDMzIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZHMgb2YgamF2YS51dGlsLnppcC5DUkMzMigpCiAgICAgICAgIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwpAQCAtMzIsNiArNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5DUkMzMiNnZXRWYWx1ZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZhbHVlKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZHMgb2YgamF2YS51dGlsLnppcC5jcmMzMi5nZXRWYWx1ZSgpCiAgICAgICAgIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwpAQCAtNzAsNiArOTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5DUkMzMiNyZXNldCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZHMgb2YgamF2YS51dGlsLnppcC5jcmMzMi5yZXNldCgpCiAgICAgICAgIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwpAQCAtODgsNiArMTIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuQ1JDMzIjdXBkYXRlKGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZUkoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kcyBvZiBqYXZhLnV0aWwuemlwLmNyYzMyLnVwZGF0ZShpbnQpCiAgICAgICAgIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwpAQCAtMTE4LDYgKzE2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkNSQzMyI3VwZGF0ZShieXRlW10pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91cGRhdGUkQigpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2RzIG9mIGphdmEudXRpbC56aXAuY3JjMzIudXBkYXRlKGJ5dGVbXSkKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgMSwgMiB9OwpAQCAtMTQyLDYgKzE5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkNSQzMyI3VwZGF0ZShieXRlW10sIGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZSRCSUkoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kcyBvZiBqYXZhLnV0aWwuemlwLnVwZGF0ZShieXRlW10saW50LGludCkKICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IHsgMSwgMiwgMyB9OwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvQ2hlY2tlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvQ2hlY2tlZElucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDNkYjIwM2YuLjQzMjg2NzMgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0NoZWNrZWRJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9DaGVja2VkSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDE2ICsxNiwyMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLnRlc3RzLmphdmEudXRpbC56aXA7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiBpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkSW5wdXRTdHJlYW07Ci0KIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIAorCitAVGVzdFRhcmdldENsYXNzKENoZWNrZWRJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ2hlY2tlZElucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBAT3ZlcnJpZGUKQEAgLTQzLDYgKzQ5LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuQ2hlY2tlZElucHV0U3RyZWFtI0NoZWNrZWRJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtLAogICAgICAqICAgICAgICBqYXZhLnV0aWwuemlwLkNoZWNrc3VtKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNoZWNrZWRJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwuemlwLkNoZWNrc3VtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW1MamF2YV91dGlsX3ppcF9DaGVja3N1bSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJbnB1dFN0cmVhbSBjaGVja0lucHV0ID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0U3RyZWFtKCJoeXRzX2NoZWNrSW5wdXQudHh0Iik7CiAgICAgICAgIENoZWNrZWRJbnB1dFN0cmVhbSBjaGVja0luID0gbmV3IENoZWNrZWRJbnB1dFN0cmVhbShjaGVja0lucHV0LCBuZXcgQ1JDMzIoKSk7CkBAIC01NCw2ICs2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkNoZWNrZWRJbnB1dFN0cmVhbSNnZXRDaGVja3N1bSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2hlY2tzdW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENoZWNrc3VtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGUgb3V0QnVmW10gPSBuZXcgYnl0ZVsxMDBdOwogICAgICAgICAvLyB0ZXN0aW5nIGdldENoZWNrc3VtIGZvciBhbiBlbXB0eSBmaWxlCkBAIC05MSw2ICsxMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5DaGVja2VkSW5wdXRTdHJlYW0jc2tpcChsb25nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNraXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9za2lwSigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyB0ZXN0aW5nIHRoYXQgdGhlIHJldHVybiBieSBza2lwIGlzIHZhbGlkCiAgICAgICAgIElucHV0U3RyZWFtIGNoZWNrSW5wdXQgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRTdHJlYW0oImh5dHNfY2hlY2tJbnB1dC50eHQiKTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0NoZWNrZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9DaGVja2VkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDdiZGQ5OGMuLjM0MDg0OGYgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0NoZWNrZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvQ2hlY2tlZE91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTIzLDEyICsyOCwyMiBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiBpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkT3V0cHV0U3RyZWFtOwogCitAVGVzdFRhcmdldENsYXNzKENoZWNrZWRPdXRwdXRTdHJlYW0uY2xhc3MpIAogcHVibGljIGNsYXNzIENoZWNrZWRPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkNoZWNrZWRPdXRwdXRTdHJlYW0jQ2hlY2tlZE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSwKICAgICAgKiAgICAgICAgamF2YS51dGlsLnppcC5DaGVja3N1bSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGVja2VkT3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwuemlwLkNoZWNrc3VtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtTGphdmFfdXRpbF96aXBfQ2hlY2tzdW0oKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIGphdmEudXRpbC56aXAuY2hlY2tlZE91dHB1dFN0cmVhbS5jb25zdHJ1Y3RvcgogICAgICAgICB0cnkgewpAQCAtNDksNiArNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5DaGVja2VkT3V0cHV0U3RyZWFtI2dldENoZWNrc3VtKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGVja3N1bSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hlY2tzdW0oKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIGphdmEudXRpbC56aXAuY2hlY2tlZE91dHB1dFN0cmVhbS5nZXRDaGVja3N1bSgpCiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDEsIDIsIDMsICdlJywgJ3InLCAndCcsICdnJywgMywgNiB9OwpAQCAtODEsNiArMTA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuQ2hlY2tlZE91dHB1dFN0cmVhbSN3cml0ZShpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlSSgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2QgamF2YS51dGlsLnppcC5jaGVja2VkT3V0cHV0U3RyZWFtLndyaXRlSSgpCiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDEsIDIsIDMsICdlJywgJ3InLCAndCcsICdnJywgMywgNiB9OwpAQCAtMTA1LDYgKzEzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkNoZWNrZWRPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEJJSSgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2QgamF2YS51dGlsLnppcC5jaGVja091dHB1dFN0cmVhbS53cml0ZUJJSSgpCiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDEsIDIsIDMsICdlJywgJ3InLCAndCcsICdnJywgMywgNiB9OwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvRGVmbGF0ZXJPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAzMzg0MWE2Li5hY2UwMzc4IDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKQEAgLTI5LDYgKzM0LDcgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhEZWZsYXRlck91dHB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRGVmbGF0ZXJPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBjbGFzcyBNeURlZmxhdGVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gewpAQCAtNzYsNiArODIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbSNEZWZsYXRlck91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSwKICAgICAgKiAgICAgICAgamF2YS51dGlsLnppcC5EZWZsYXRlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWZsYXRlck91dHB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcywgamF2YS51dGlsLnppcC5EZWZsYXRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbUxqYXZhX3V0aWxfemlwX0RlZmxhdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDEsIDMsIDQsIDcsIDggfTsKICAgICAgICAgRmlsZSBmMSA9IG5ldyBGaWxlKCJoeXRzX0NvbnN0cnVfT0QudHN0Iik7CkBAIC0xMDMsNiArMTE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW0jRGVmbGF0ZXJPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGVmbGF0ZXJPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmMSA9IG5ldyBGaWxlKCJoeXRzX0NvbnN0cnVfTy50c3QiKTsKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmMSk7CkBAIC0xMjEsNiArMTQ1LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW0jRGVmbGF0ZXJPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0sCiAgICAgICogICAgICAgIGphdmEudXRpbC56aXAuRGVmbGF0ZXIsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWZsYXRlck91dHB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcywgamF2YS51dGlsLnppcC5EZWZsYXRlci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtTGphdmFfdXRpbF96aXBfRGVmbGF0ZXJJKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpbnQgYnVmID0gNTsKQEAgLTE2Nyw2ICsyMDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbSNjbG9zZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZSgiY2xvc2UudHN0Iik7CiAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZjEpOwpAQCAtMjI1LDYgKzI2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtI2ZpbmlzaCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maW5pc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gTmVlZCB0ZXN0IHRvIHNlZSBpZiBtZXRob2QgZmluaXNoKCkgYWN0dWFsbHkgZmluaXNoZXMKICAgICAgICAgLy8gT25seSB0ZXN0aW5nIHBvc3NpYmxlIGVycm9ycywgbm90IGlmIGl0IGFjdHVhbGx5IHdvcmtzCkBAIC0yNzYsNiArMzI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW0jd3JpdGUoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmMSA9IG5ldyBGaWxlKCJ3cml0ZUkxLnRzdCIpOwogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYxKTsKQEAgLTMxMiw2ICszNzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQklJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDEsIDMsIDQsIDcsIDgsIDMsIDYgfTsKIApkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvRGVmbGF0ZXJUZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9EZWZsYXRlclRlc3QuamF2YQppbmRleCBjYjA5YzMxLi4wYzQwNTVmIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9EZWZsYXRlclRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9EZWZsYXRlclRlc3QuamF2YQpAQCAtMTcsOSArMTcsMTUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC56aXAuQWRsZXIzMjsKKwogaW1wb3J0IGphdmEudXRpbC56aXAuRGF0YUZvcm1hdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyOwogaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXI7CkBAIC0yNyw2ICszMyw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRGVmbGF0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIERlZmxhdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIGNsYXNzIE15RGVmbGF0ZXIgZXh0ZW5kcyBEZWZsYXRlciB7CkBAIC02Niw2ICs3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI2RlZmxhdGUoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlZmxhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RlZmxhdGUkQigpIHsKICAgICAgICAgYnl0ZSBvdXRQdXRCdWZbXSA9IG5ldyBieXRlWzUwXTsKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgMSwgMywgNCwgNywgOCB9OwpAQCAtMTA4LDYgKzEyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI2RlZmxhdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWZsYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVmbGF0ZSRCSUkoKSB7CiAgICAgICAgIGJ5dGUgb3V0UHV0QnVmW10gPSBuZXcgYnl0ZVs1MF07CiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDUsIDIsIDMsIDcsIDggfTsKQEAgLTE3Myw2ICsxOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlciNlbmQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW5kKCkgewogICAgICAgICBieXRlIGJ5dGVBcnJheVtdID0geyA1LCAyLCAzLCA3LCA4IH07CiAgICAgICAgIGJ5dGUgb3V0UHV0QnVmW10gPSBuZXcgYnl0ZVsxMDBdOwpAQCAtMTkwLDYgKzIyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI2ZpbmFsaXplKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5hbGl6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmluYWxpemUoKSB7CiAgICAgICAgIE15RGVmbGF0ZXIgbWRlZmwgPSBuZXcgTXlEZWZsYXRlcigpOwogICAgICAgICBtZGVmbC5teUZpbmFsaXplKCk7CkBAIC0yMDAsNiArMjQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjZmluaXNoKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbmlzaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUaGlzIHRlc3QgYWxyZWFkeSBoZXJlLCBpdHMgdGhlIHNhbWUgYXMgdGVzdF9kZWZsYXRlKCkKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgNSwgMiwgMywgNywgOCB9OwpAQCAtMjQzLDYgKzI5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI2ZpbmlzaGVkKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmluaXNoZWQoKSB7CiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDUsIDIsIDMsIDcsIDggfTsKICAgICAgICAgYnl0ZSBvdXRQdXRCdWZbXSA9IG5ldyBieXRlWzEwMF07CkBAIC0yNjMsNiArMzI0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjZ2V0QWRsZXIoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFkbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBZGxlcigpIHsKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgJ2EnLCAnYicsICdjJywgMSwgMiwgMyB9OwogICAgICAgICBieXRlIG91dFB1dEJ1ZltdID0gbmV3IGJ5dGVbMTAwXTsKQEAgLTI4OSw2ICszNTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlciNnZXRUb3RhbEluKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUb3RhbEluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUb3RhbEluKCkgewogICAgICAgICBieXRlIG91dFB1dEJ1ZltdID0gbmV3IGJ5dGVbNV07CiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDEsIDMsIDQsIDcsIDggfTsKQEAgLTMxOCw2ICszOTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlciNnZXRUb3RhbE91dCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VG90YWxPdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRvdGFsT3V0KCkgewogICAgICAgICAvLyB0aGUgZ2V0VG90YWxPdXQgc2hvdWxkIGVxdWFsIHRoZSBzdW0gb2YgdmFsdWUgcmV0dXJuZWQgYnkgZGVmbGF0ZSgpCiAgICAgICAgIGJ5dGUgb3V0UHV0QnVmW10gPSBuZXcgYnl0ZVs1XTsKQEAgLTM0OCw2ICs0MzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlciNuZWVkc0lucHV0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZWVkc0lucHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZWVkc0lucHV0KCkgewogICAgICAgICBEZWZsYXRlciBkZWZsID0gbmV3IERlZmxhdGVyKCk7CiAgICAgICAgIGFzc2VydFRydWUoCkBAIC0zODUsNiArNDgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjcmVzZXQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKICAgICAgICAgYnl0ZSBvdXRQdXRCdWZbXSA9IG5ldyBieXRlWzEwMF07CiAgICAgICAgIGJ5dGUgb3V0UHV0SW5mW10gPSBuZXcgYnl0ZVsxMDBdOwpAQCAtNDQ3LDYgKzU1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI3NldERpY3Rpb25hcnkoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERpY3Rpb25hcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERpY3Rpb25hcnkkQigpIHsKICAgICAgICAgLy8gVGhpcyB0ZXN0IGlzIHZlcnkgY2xvc2UgdG8gZ2V0QWRsZXIoKQogICAgICAgICBieXRlIGRpY3Rpb25hcnlBcnJheVtdID0geyAnZScsICdyJywgJ3QnLCAnYScsICdiJywgMiwgMyB9OwpAQCAtNDg2LDYgKzYwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI3NldERpY3Rpb25hcnkoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREaWN0aW9uYXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGljdGlvbmFyeSRCSUkoKSB7CiAgICAgICAgIC8vIFRoaXMgdGVzdCBpcyB2ZXJ5IGNsb3NlIHRvIGdldEFkbGVyKCkKICAgICAgICAgYnl0ZSBkaWN0aW9uYXJ5QXJyYXlbXSA9IHsgJ2UnLCAncicsICd0JywgJ2EnLCAnYicsIDIsIDMsICdvJywgJ3QnIH07CkBAIC01NDgsNiArNjcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjc2V0SW5wdXQoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldElucHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJbnB1dCRCKCkgewogICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0geyAxLCAyLCAzIH07CiAgICAgICAgIGJ5dGVbXSBvdXRQdXRCdWYgPSBuZXcgYnl0ZVs1MF07CkBAIC01ODUsNiArNzE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjc2V0SW5wdXQoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElucHV0JEJJSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0geyAxLCAyLCAzLCA0LCA1IH07CiAgICAgICAgIGJ5dGVbXSBvdXRQdXRCdWYgPSBuZXcgYnl0ZVs1MF07CkBAIC02MzgsNiArNzgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjc2V0TGV2ZWwoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldExldmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRMZXZlbEkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVmVyeSBzaW1pbGFyIHRvIHRlc3RfQ29uc3RydWN0b3IoaW50KQogICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gbmV3IGJ5dGVbMTAwXTsKQEAgLTY5Nyw2ICs4NDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlciNzZXRTdHJhdGVneShpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3RyYXRlZ3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN0cmF0ZWd5SSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gbmV3IGJ5dGVbMTAwXTsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGluRmlsZSA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbSgiaHl0c19jaGVja0lucHV0LnR4dCIpOwpAQCAtNzU4LDYgKzkxOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI0RlZmxhdGVyKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWZsYXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG5ldyBieXRlWzEwMF07CiAgICAgICAgIElucHV0U3RyZWFtIGluRmlsZSA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbSgiaHl0c19jaGVja0lucHV0LnR4dCIpOwpAQCAtNzk2LDYgKzk2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI0RlZmxhdGVyKGludCwgYm9vbGVhbikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWZsYXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJWigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlIGJ5dGVBcnJheVtdID0geyA0LCA1LCAzLCAyLCAnYScsICdiJywgNiwgNywgOCwgOSwgMCwgJ3MnLCAnMycsCiAgICAgICAgICAgICAgICAgJ3cnLCAncicgfTsKQEAgLTg5MSw2ICsxMDY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjRGVmbGF0ZXIoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRlZmxhdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG5ldyBieXRlWzEwMF07CiAgICAgICAgIElucHV0U3RyZWFtIGluRmlsZSA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbSgiaHl0c19jaGVja0lucHV0LnR4dCIpOwpAQCAtMTAyNiwyMSArMTIxMywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X25lZWRzRGljdGlvbmFyeSgpIHsKLSAgICAgICAgRGVmbGF0ZXIgaW5mID0gbmV3IERlZmxhdGVyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBpbmYuZ2V0VG90YWxJbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluZi5nZXRUb3RhbE91dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluZi5nZXRCeXRlc1JlYWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBpbmYuZ2V0Qnl0ZXNXcml0dGVuKCkpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEB0aHJvd3MgRGF0YUZvcm1hdEV4Y2VwdGlvbgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI2dldEJ5dGVzUmVhZCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qnl0ZXNSZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCeXRlc1JlYWQoKSB0aHJvd3MgRGF0YUZvcm1hdEV4Y2VwdGlvbiwKICAgICAgICAgICAgIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTU4CkBAIC0xMDY3LDYgKzEyNTIsMTUgQEAKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlciNnZXRCeXRlc1JlYWQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5dGVzV3JpdHRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Qnl0ZXNXcml0dGVuKCkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24sCiAgICAgICAgICAgICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTE1OApkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtVGVzdC5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDgzOTIxZTMuLmMzYWRkYjcgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9HWklQSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudGVzdHMuamF2YS51dGlsLnppcDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTIzLDExICsyOCwxMyBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tzdW07CisKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LnJlc291cmNlLlN1cHBvcnRfUmVzb3VyY2VzOwogCitAVGVzdFRhcmdldENsYXNzKEdaSVBJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgR1pJUElucHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAgICAgRmlsZSByZXNvdXJjZXM7CiAKQEAgLTUyLDYgKzU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtI0daSVBJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkdaSVBJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtLmNvbnN0cnVjdG9yCiAgICAgICAgIHRyeSB7CkBAIC03Niw2ICs5MiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbSNHWklQSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKICAgICAgKiAgICAgICAgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR1pJUElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtSSgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2QgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW0uY29uc3RydWN0b3JJCiAgICAgICAgIHRyeSB7CkBAIC05OSw2ICsxMjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtLnJlYWRCSUkKICAgICAgICAgYnl0ZSBvcmdCdWZbXSA9IHsgJzMnLCAnNScsICcyJywgJ3InLCAnZycsICdlJywgJ2YnLCAnZCcsICdlJywgJ3cnIH07CkBAIC0yMTgsNiArMjUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtI2Nsb3NlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtLmNsb3NlCiAgICAgICAgIGJ5dGUgb3V0QnVmW10gPSBuZXcgYnl0ZVsxMDBdOwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvR1pJUE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggYzViNDMxMS4uMzY5ODY3ZSAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvR1pJUE91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9HWklQT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLnRlc3RzLmphdmEudXRpbC56aXA7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yMyw2ICsyOCw3IEBACiBpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja3N1bTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoR1pJUE91dHB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgR1pJUE91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgY2xhc3MgVGVzdEdaSVBPdXRwdXRTdHJlYW0gZXh0ZW5kcyBHWklQT3V0cHV0U3RyZWFtIHsKQEAgLTQyLDYgKzQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbSNHWklQT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkdaSVBPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW0oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dEZpbGUgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgiR1pJUE91dENvbi50eHQiKTsKQEAgLTYxLDYgKzc2LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbSNHWklQT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtLAogICAgICAqICAgICAgICBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR1pJUE91dHB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtSSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0RmlsZSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJHWklQT3V0Q29uLnR4dCIpOwpAQCAtODAsNiArMTA0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbSNmaW5pc2goKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmluaXNoKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW0uZmluaXNoKCkKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgMywgNSwgMiwgJ3InLCAnZycsICdlJywgJ2YnLCAnZCcsICdlJywgJ3cnIH07CkBAIC0xMDcsNiArMTQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbSNjbG9zZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW0uY2xvc2UoKQogICAgICAgICBieXRlIGJ5dGVBcnJheVtdID0geyAzLCA1LCAyLCAncicsICdnJywgJ2UnLCAnZicsICdkJywgJ2UnLCAndycgfTsKQEAgLTEzMSw2ICsxNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbS53cml0ZUJJSQogICAgICAgICBieXRlIGJ5dGVBcnJheVtdID0geyAzLCA1LCAyLCAncicsICdnJywgJ2UnLCAnZicsICdkJywgJ2UnLCAndycgfTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0luZmxhdGVySW5wdXRTdHJlYW1UZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9JbmZsYXRlcklucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IGQwNGQxNDYuLjk1NWU2ZTggMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0luZmxhdGVySW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTYsOSArMTYsMTMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07CkBAIC0yOCw2ICszMiw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSW5mbGF0ZXJJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW5mbGF0ZXJJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvLyBmaWxlcyBoeXRzX2NvbnN0cnUoTyksaHl0c19jb25zdHJ1KE9EKSxoeXRzX2NvbnN0cnUoT0RJKSBuZWVkcyB0byBiZQpAQCAtNTUsNiArNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtI0luZmxhdGVySW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIlRlc3QgaXMgZW1wdHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbmZsYXRlcklucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vRklYTUUgVGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcyBpbiBIYXJtb255IGNsYXNzbGliIG9yIFN1biA1LjBfNyBSSQogICAgICAgICAvKgpAQCAtNzgsNiArOTIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtI0luZmxhdGVySW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKICAgICAgKiAgICAgICAgamF2YS51dGlsLnppcC5JbmZsYXRlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbmZsYXRlcklucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIGphdmEudXRpbC56aXAuSW5mbGF0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbUxqYXZhX3V0aWxfemlwX0luZmxhdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IG5ldyBieXRlWzEwMF07CiAgICAgICAgIElucHV0U3RyZWFtIGluZmlsZSA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbSgiaHl0c19jb25zdHJ1X09ELnR4dCIpOwpAQCAtOTMsNiArMTE2LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbSNJbmZsYXRlcklucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0sCiAgICAgICogICAgICAgIGphdmEudXRpbC56aXAuSW5mbGF0ZXIsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW5mbGF0ZXJJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwuemlwLkluZmxhdGVyLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbUxqYXZhX3V0aWxfemlwX0luZmxhdGVySSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCByZXN1bHQgPSAwOwogICAgICAgICBpbnQgYnVmZmVyW10gPSBuZXcgaW50WzUwMF07CkBAIC0xMTIsNiArMTQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbSNtYXJrKGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXJrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMTBdKTsKICAgICAgICAgSW5mbGF0ZXJJbnB1dFN0cmVhbSBpaXMgPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShpcyk7CkBAIC0xMjQsNiArMTY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbSNtYXJrU3VwcG9ydGVkKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXJrU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXJrU3VwcG9ydGVkKCkgewogICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVsxMF0pOwogICAgICAgICBJbmZsYXRlcklucHV0U3RyZWFtIGlpcyA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKGlzKTsKQEAgLTEzNCw2ICsxODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtI3JlYWQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKICAgICAgICAgaW50IGJ1ZmZlcltdID0gbmV3IGludFs1MDBdOwpAQCAtMTYxLDYgKzIyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gJiBaaXBFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbnsKICAgICAgICAgYnl0ZVtdIHRlc3QgPSBuZXcgYnl0ZVs1MDddOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CkBAIC0xOTUsNiArMjYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbSNyZXNldCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgSU9FeGNlcHRpb24gb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMTBdKTsKICAgICAgICAgSW5mbGF0ZXJJbnB1dFN0cmVhbSBpaXMgPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShpcyk7CkBAIC0yMDksNiArMjg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbSNza2lwKGxvbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2tpcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRTdHJlYW0oImh5dHNfYXZhaWxhYmxlLnRzdCIpOwogICAgICAgICBJbmZsYXRlcklucHV0U3RyZWFtIGlpcyA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKGlzKTsKQEAgLTI0OCw2ICszMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtI3NraXAobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNraXAiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9za2lwSjIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKICAgICAgICAgaW50IGJ1ZmZlcltdID0gbmV3IGludFsxMDBdOwpAQCAtMzA2LDYgKzQwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdmFpbGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0U3RyZWFtKCJoeXRzX2F2YWlsYWJsZS50c3QiKTsKICAgICAgICAgSW5mbGF0ZXJJbnB1dFN0cmVhbSBpaXMgPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShpcyk7CkBAIC0zMzYsNiArNDQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbSNjbG9zZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgSW5mbGF0ZXJJbnB1dFN0cmVhbSBpaW4gPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbSgKICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL0luZmxhdGVyVGVzdC5qYXZhIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJUZXN0LmphdmEKaW5kZXggODdlNGM5Zi4uMWU3OTk1NCAxMDA2NDQKLS0tIGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJUZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudGVzdHMuamF2YS51dGlsLnppcDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjgsNiArMzMsNyBAQAogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbmZsYXRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW5mbGF0ZXJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBieXRlIG91dFB1dEJ1ZmYxW10gPSBuZXcgYnl0ZVs1MDBdOwogCkBAIC0zNiw2ICs0MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVyI2VuZCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbmQoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAuaW5mbGF0ZXIuZW5kKCkKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgNSwgMiwgMywgNywgOCB9OwpAQCAtNjEsNiArNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlciNmaW5pc2hlZCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbmlzaGVkKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBvZiBqYXZhLnV0aWwuemlwLmluZmxhdGVyLmZpbmlzaGVkKCkKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgMSwgMywgNCwgNywgOCwgJ2UnLCAncicsICd0JywgJ3knLCAnNScgfTsKQEAgLTkyLDYgKzExNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVyI2dldEFkbGVyKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWRsZXIoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAuaW5mbGF0ZXIuZ2V0QWRsZXIoKQogICAgICAgICBieXRlIGRpY3Rpb25hcnlBcnJheVtdID0geyAnZScsICdyJywgJ3QnLCAnYScsICdiJywgMiwgMyB9OwpAQCAtMTEyLDYgKzE0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVyI2dldFJlbWFpbmluZygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmVtYWluaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZW1haW5pbmcoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAuaW5mbGF0ZXIuZ2V0UmVtYWluaW5nKCkKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IHsgMSwgMywgNSwgNiwgNyB9OwpAQCAtMTI3LDYgKzE2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVyI2dldFRvdGFsSW4oKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRvdGFsSW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRvdGFsSW4oKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAuaW5mbGF0ZXIuZ2V0VG90YWxJbigpCiAgICAgICAgIC8vIGNyZWF0aW5nIHRoZSBkZWNvbXByZXNzZWQgZGF0YQpAQCAtMTg0LDYgKzIzNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVyI2dldFRvdGFsT3V0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUb3RhbE91dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VG90YWxPdXQoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAuaW5mbGF0ZXIuSW5mbGF0ZXIoKQogICAgICAgICAvLyBjcmVhdGluZyB0aGUgZGVjb21wcmVzc2VkIGRhdGEKQEAgLTI1MCw2ICszMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlciNpbmZsYXRlKGJ5dGVbXSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRhdGFGb3JtYXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluZmxhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luZmxhdGUkQigpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2Qgb2YgamF2YS51dGlsLnppcC5pbmZsYXRlci5pbmZsYXRlKGJ5dGUpCiAKQEAgLTMxNyw2ICszODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlciNpbmZsYXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEYXRhRm9ybWF0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbmZsYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5mbGF0ZSRCSUkoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAuaW5mbGF0ZXIuaW5mbGF0ZShieXRlLGludCxpbnQpCiAKQEAgLTM2NCw2ICs0NDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlciNJbmZsYXRlcigpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW5mbGF0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBvZiBqYXZhLnV0aWwuemlwLmluZmxhdGVyLkluZmxhdGVyKCkKICAgICAgICAgdHJ5IHsKQEAgLTM4MCw2ICs0NjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5JbmZsYXRlciNJbmZsYXRlcihib29sZWFuKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkluZmxhdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JaKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBvZiBqYXZhLnV0aWwuemlwLmluZmxhdGVyLkluZmxhdGVyKGJvb2xlYW4pCiAgICAgICAgIC8vIG5vdGUgZG9lcyBub3QgdGhyb3cgZXhjZXB0aW9uIGlmIGRlZmxhdGVyIGhhcyBhIGhlYWRlciwgYnV0IGluZmxhdGVyCkBAIC00MTIsNiArNTA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXIjbmVlZHNEaWN0aW9uYXJ5KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZWVkc0RpY3Rpb25hcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25lZWRzRGljdGlvbmFyeSgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2Qgb2YgamF2YS51dGlsLnppcC5pbmZsYXRlci5uZWVkc0RpY3Rpb25hcnkoKQogICAgICAgICAvLyBub3RlOiB0aGlzIGZsYWcgaXMgc2V0IGFmdGVyIGluZmxhdGUgaXMgY2FsbGVkCkBAIC00NTcsNiArNTYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXIjbmVlZHNJbnB1dCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmVlZHNJbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmVlZHNJbnB1dCgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2Qgb2YgamF2YS51dGlsLnppcC5pbmZsYXRlci5uZWVkc0lucHV0KCkKICAgICAgICAgSW5mbGF0ZXIgaW5mbGF0ZSA9IG5ldyBJbmZsYXRlcigpOwpAQCAtNDgxLDYgKzU5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVyI3Jlc2V0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEudXRpbC56aXAuaW5mbGF0ZXIucmVzZXQoKQogICAgICAgICBieXRlIGJ5dGVBcnJheVtdID0geyAxLCAzLCA0LCA3LCA4LCAnZScsICdyJywgJ3QnLCAneScsICc1JyB9OwpAQCAtNTMyLDYgKzY1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkluZmxhdGVyI3NldERpY3Rpb25hcnkoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBlbXB0eSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERpY3Rpb25hcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERpY3Rpb25hcnkkQigpIHsKICAgICAgICAgLy9GSVhNRSBUaGlzIHRlc3QgZG9lc24ndCBwYXNzIGluIEhhcm1vbnkgY2xhc3NsaWIgb3IgU3VuIDUuMF83IFJJCiAgICAgICAgIC8qCkBAIC01ODcsNiArNzE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXIjc2V0SW5wdXQoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldElucHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJbnB1dCRCKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBvZiBqYXZhLnV0aWwuemlwLmluZmxhdGVyLnNldElucHV0KGJ5dGUpCiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDIsIDMsIDQsICd0JywgJ3knLCAndScsICdlJywgJ3cnLCA3LCA2LCA1LCA5IH07CkBAIC01OTksNiArNzQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuSW5mbGF0ZXIjc2V0SW5wdXQoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElucHV0JEJJSSgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2Qgb2YgamF2YS51dGlsLnppcC5pbmZsYXRlci5zZXRJbnB1dChieXRlLGludCxpbnQpCiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSB7IDIsIDMsIDQsICd0JywgJ3knLCAndScsICdlJywgJ3cnLCA3LCA2LCA1LCA5IH07CkBAIC02NTMsNiArODAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIjZ2V0Qnl0ZXNSZWFkKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeXRlc1JlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ5dGVzUmVhZCgpIHRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uLAogICAgICAgICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0xNTgKQEAgLTY4MCw2ICs4MzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5EZWZsYXRlciNnZXRCeXRlc1JlYWQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5dGVzV3JpdHRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Qnl0ZXNXcml0dGVuKCkgdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTU4CiAgICAgICAgIERlZmxhdGVyIGRlZiA9IG5ldyBEZWZsYXRlcigpOwpAQCAtNzA2LDYgKzg3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyI2luZmxhdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluZmxhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluZmxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS04MSAKICAgICAgICAgSW5mbGF0ZXIgaW5mID0gbmV3IEluZmxhdGVyKCk7CmRpZmYgLS1naXQgYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9aaXBFbnRyeVRlc3QuamF2YSBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL1ppcEVudHJ5VGVzdC5qYXZhCmluZGV4IGIyY2I5NzQuLjIxMWU5ZTIgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL1ppcEVudHJ5VGVzdC5qYXZhCisrKyBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL1ppcEVudHJ5VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLnRlc3RzLmphdmEudXRpbC56aXA7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtMjQsNiArMjksNyBAQAogaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwogCitAVGVzdFRhcmdldENsYXNzKFppcEVudHJ5LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBaaXBFbnRyeVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCkBAIC02NCw2ICs3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEVudHJ5I1ppcEVudHJ5KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWmlwRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLnppcC5aaXBFbnRyeShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICB6ZW50cnkgPSB6ZmlsZS5nZXRFbnRyeSgiRmlsZTMudHh0Iik7CkBAIC05OSw2ICsxMTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBFbnRyeSNnZXRDb21tZW50KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb21tZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb21tZW50KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuemlwLlppcEVudHJ5LmdldENvbW1lbnQoKQogICAgICAgICBaaXBFbnRyeSB6aXBFbnRyeSA9IG5ldyBaaXBFbnRyeSgiemlwcHkuemlwIik7CkBAIC0xMTEsNiArMTM1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjZ2V0Q29tcHJlc3NlZFNpemUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbXByZXNzZWRTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb21wcmVzc2VkU2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS51dGlsLnppcC5aaXBFbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBjb21wcmVzc2VkIHNpemUgcmV0dXJuZWQiLCB6ZW50cnkKQEAgLTEyMCw2ICsxNTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBFbnRyeSNnZXRDcmMoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENyYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3JjKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLnV0aWwuemlwLlppcEVudHJ5LmdldENyYygpCiAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBnZXQgQ3JjIiwgemVudHJ5LmdldENyYygpID09IG9yZ0NyYyk7CkBAIC0xMjgsNiArMTcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjZ2V0RXh0cmEoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEV4dHJhIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFeHRyYSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJ5dGUgW10gamF2YS51dGlsLnppcC5aaXBFbnRyeS5nZXRFeHRyYSgpCiAgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCBleHRyYSBpbmZvcm1hdGlvbiByZXR1cm5lZCIsCkBAIC0xNDIsNiArMTkzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjZ2V0TWV0aG9kKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNZXRob2QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuemlwLlppcEVudHJ5LmdldE1ldGhvZCgpCiAgICAgICAgIHplbnRyeSA9IHpmaWxlLmdldEVudHJ5KCJGaWxlMS50eHQiKTsKQEAgLTE1Nyw2ICsyMTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBFbnRyeSNnZXROYW1lKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuemlwLlppcEVudHJ5LmdldE5hbWUoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIHJldHVybmVkIC0gTm90ZSByZXR1cm4gcmVzdWx0IHNvbWV3aGF0IGFtYmlndW91cyBpbiBzcGVjIiwKQEAgLTE2Niw2ICsyMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBFbnRyeSNnZXRTaXplKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLnV0aWwuemlwLlppcEVudHJ5LmdldFNpemUoKQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc2l6ZSByZXR1cm5lZCIsIHplbnRyeS5nZXRTaXplKCkgPT0gb3JnU2l6ZSk7CkBAIC0xNzQsNiArMjUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjZ2V0VGltZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGltZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VGltZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS51dGlsLnppcC5aaXBFbnRyeS5nZXRUaW1lKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGdldCB0aW1lIiwgemVudHJ5LmdldFRpbWUoKSA9PSBvcmdUaW1lKTsKQEAgLTE4Miw2ICsyNjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBFbnRyeSNpc0RpcmVjdG9yeSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEaXJlY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRGlyZWN0b3J5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuemlwLlppcEVudHJ5LmlzRGlyZWN0b3J5KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRW50cnkgc2hvdWxkIG5vdCBhbnN3ZXIgdHJ1ZSB0byBpc0RpcmVjdG9yeSIsICF6ZW50cnkKQEAgLTE5NCw2ICsyOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBFbnRyeSNzZXRDb21tZW50KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q29tbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENvbW1lbnRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS51dGlsLnppcC5aaXBFbnRyeS5zZXRDb21tZW50KGphdmEubGFuZy5TdHJpbmcpCkBAIC0yMjQsNiArMzI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjc2V0Q29tcHJlc3NlZFNpemUobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDb21wcmVzc2VkU2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENvbXByZXNzZWRTaXplSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLnppcC5aaXBFbnRyeS5zZXRDb21wcmVzc2VkU2l6ZShsb25nKQogICAgICAgICB6ZW50cnkuc2V0Q29tcHJlc3NlZFNpemUob3JnQ29tcHJlc3NlZFNpemUgKyAxMCk7CkBAIC0yNDMsNiArMzU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjc2V0Q3JjKGxvbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q3JjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3JjSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLnppcC5aaXBFbnRyeS5zZXRDcmMobG9uZykKICAgICAgICAgemVudHJ5LnNldENyYyhvcmdDcmMgKyAxMDApOwpAQCAtMjY5LDYgKzM5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEVudHJ5I3NldEV4dHJhKGJ5dGVbXSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRFeHRyYSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RXh0cmEkQigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLnppcC5aaXBFbnRyeS5zZXRFeHRyYShieXRlIFtdKQogICAgICAgICB6ZW50cnkgPSB6ZmlsZS5nZXRFbnRyeSgiRmlsZTEudHh0Iik7CkBAIC0zMDksNiArNDQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjc2V0TWV0aG9kKGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNZXRob2QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1ldGhvZEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC56aXAuWmlwRW50cnkuc2V0TWV0aG9kKGludCkKICAgICAgICAgemVudHJ5ID0gemZpbGUuZ2V0RW50cnkoIkZpbGUzLnR4dCIpOwpAQCAtMzMwLDYgKzQ3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEVudHJ5I3NldFNpemUobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC56aXAuWmlwRW50cnkuc2V0U2l6ZShsb25nKQogICAgICAgICB6ZW50cnkuc2V0U2l6ZShvcmdTaXplICsgMTApOwpAQCAtMzU2LDYgKzUwNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEVudHJ5I3NldFRpbWUobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VGltZUooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC56aXAuWmlwRW50cnkuc2V0VGltZShsb25nKQogICAgICAgICB6ZW50cnkuc2V0VGltZShvcmdUaW1lICsgMTAwMDApOwpAQCAtMzkyLDYgKzU1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEVudHJ5I3RvU3RyaW5nKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudXRpbC56aXAuWmlwRW50cnkudG9TdHJpbmcoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgZW50cnkgbmFtZSIsIHplbnRyeS50b1N0cmluZygpLmluZGV4T2YoCkBAIC00MDEsNiArNTY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRW50cnkjWmlwRW50cnkoamF2YS51dGlsLnppcC5aaXBFbnRyeSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJaaXBFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuemlwLlppcEVudHJ5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF96aXBfWmlwRW50cnkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuemlwLlppcEVudHJ5KHV0aWwuemlwLlppcEVudHJ5KQogICAgICAgICB6ZW50cnkuc2V0U2l6ZSgyKTsKQEAgLTQyMiw2ICs1OTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBFbnRyeSNjbG9uZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLnppcC5aaXBFbnRyeS5jbG9uZSgpCiAgICAgICAgIE9iamVjdCBvYmogPSB6ZW50cnkuY2xvbmUoKTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL1ppcEZpbGVUZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9aaXBGaWxlVGVzdC5qYXZhCmluZGV4IGQ0YThmZDEuLmU0MmRkNjIgMTAwNjQ0Ci0tLSBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL1ppcEZpbGVUZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvWmlwRmlsZVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9QbGF0Zm9ybUZpbGU7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIApAQCAtMjksNiArMzQsNyBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogCitAVGVzdFRhcmdldENsYXNzKFppcEZpbGUuY2xhc3MpIAogcHVibGljIGNsYXNzIFppcEZpbGVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogLy8gQkVHSU4gYW5kcm9pZC1hZGRlZApAQCAtNTMsNiArNTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBGaWxlI1ppcEZpbGUoamF2YS5pby5GaWxlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gInNldFVwIHByb2NlZHVyZSBjaGVja3MgdGhpcyB0eXBlIG9mIGNvbnN0cnVjdG9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlppcEZpbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC56aXAuWmlwRmlsZShqYXZhLmlvLkZpbGUpCiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwpAQCAtNjEsNiArNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBGaWxlI1ppcEZpbGUoamF2YS5pby5GaWxlLCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJaaXBGaWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgICAgIHpmaWxlLmNsb3NlKCk7IC8vIGFib3V0IHRvIHJlb3BlbiB0aGUgc2FtZSB0ZW1wIGZpbGUKICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZU5hbWUpOwpAQCAtNzMsNiArOTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBGaWxlI1ppcEZpbGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIlRlc3QgY29udGFpbnMgZW1wdHkgYnJhY2tldHMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWmlwRmlsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuemlwLlppcEZpbGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgLyoKQEAgLTkzLDYgKzEyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEZpbGUjZmluYWxpemUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmFsaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maW5hbGl6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbSgiaHl0c19aaXBGaWxlLnppcCIpOwogICAgICAgICAgICAgRmlsZSBmaWxlID0gU3VwcG9ydF9SZXNvdXJjZXMuY3JlYXRlVGVtcEZpbGUoIi5qYXIiKTsKQEAgLTEyMiwxMiArMTY0LDIxIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRmlsZSNjbG9zZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Nsb3NlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuemlwLlppcEZpbGUuY2xvc2UoKQogICAgICAgICB0cnkgewogICAgICAgICAgICAgemZpbGUuY2xvc2UoKTsKICAgICAgICAgICAgIHpmaWxlLmdldElucHV0U3RyZWFtKHpmaWxlLmdldEVudHJ5KCJ6dGVzdC9maWxlMS50eHQiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmYWlsKCJDbG9zZSB0ZXN0IGZhaWxlZCIpOwpAQCAtMTM2LDYgKzE4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEZpbGUjZW50cmllcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cmllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cmllcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5FbnVtZXJhdGlvbiBqYXZhLnV0aWwuemlwLlppcEZpbGUuZW50cmllcygpCiAgICAgICAgIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZW51bWVyID0gemZpbGUuZW50cmllcygpOwpAQCAtMTY1LDYgKzIyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEZpbGUjZ2V0RW50cnkoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRyeUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC56aXAuWmlwRW50cnkKICAgICAgICAgLy8gamF2YS51dGlsLnppcC5aaXBGaWxlLmdldEVudHJ5KGphdmEubGFuZy5TdHJpbmcpCkBAIC0yMDcsNiArMjc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwRmlsZSNnZXRJbnB1dFN0cmVhbShqYXZhLnV0aWwuemlwLlppcEVudHJ5KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uICYgWmlwRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuemlwLlppcEVudHJ5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldElucHV0U3RyZWFtTGphdmFfdXRpbF96aXBfWmlwRW50cnkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLklucHV0U3RyZWFtCiAgICAgICAgIC8vIGphdmEudXRpbC56aXAuWmlwRmlsZS5nZXRJbnB1dFN0cmVhbShqYXZhLnV0aWwuemlwLlppcEVudHJ5KQpAQCAtMjMzLDYgKzMxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcEZpbGUjZ2V0TmFtZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS51dGlsLnppcC5aaXBGaWxlLmdldE5hbWUoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbmFtZTogIiArIHpmaWxlLmdldE5hbWUoKSwgemZpbGUKQEAgLTI0Miw2ICszMjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBGaWxlI3NpemUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uICBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIHpmaWxlLnNpemUoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvWmlwSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9aaXBJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA3MDY3NTVlLi5hNGU3ZWJjIDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9aaXBJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9aaXBJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS50ZXN0cy5qYXZhLnV0aWwuemlwOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI3LDYgKzMyLDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIAorQFRlc3RUYXJnZXRDbGFzcyhaaXBJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgWmlwSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIC8vIHRoZSBmaWxlIGh5dHNfemlwRmlsZS56aXAgdXNlZCBpbiBzZXR1cCBuZWVkcyB0byBpbmNsdWRlZCBhcyBhIHJlc291cmNlCiAgICAgcHJpdmF0ZSBaaXBFbnRyeSB6ZW50cnk7CkBAIC03Myw2ICs3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtI1ppcElucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWmlwSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHplbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKICAgICAgICAgemlzLmNsb3NlRW50cnkoKTsKQEAgLTgxLDYgKzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW0jY2xvc2UoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHppcy5jbG9zZSgpOwpAQCAtOTUsNiArMTE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW0jY2xvc2UoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGNhbGxpbmcgbWV0aG9kIHR3byB0aW1lcyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xMTAxCiAgICAgICAgIHppcy5jbG9zZSgpOwpAQCAtMTA1LDYgKzEzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtI2Nsb3NlRW50cnkoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2VFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2VFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB6ZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7CiAgICAgICAgIHppcy5jbG9zZUVudHJ5KCk7CkBAIC0xMTMsNiArMTU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW0jZ2V0TmV4dEVudHJ5KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5leHRFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmV4dEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdE51bGwoImdldE5leHRFbnRyeSBmYWlsZWQiLCB6aXMuZ2V0TmV4dEVudHJ5KCkpOwogICAgIH0KQEAgLTEyMCw2ICsxNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgemVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwogICAgICAgICBieXRlW10gcmJ1ZiA9IG5ldyBieXRlWyhpbnQpIHplbnRyeS5nZXRTaXplKCldOwpAQCAtMTMxLDYgKzE5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtI3NraXAobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlppcEV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2tpcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHplbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKICAgICAgICAgYnl0ZVtdIHJidWYgPSBuZXcgYnl0ZVsoaW50KSB6ZW50cnkuZ2V0U2l6ZSgpXTsKZGlmZiAtLWdpdCBhL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL2FyY2hpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAyNzMyNTBhLi4wNDIzM2Q4IDEwMDY0NAotLS0gYS9hcmNoaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvYXJjaGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC96aXAvWmlwT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5hcmNoaXZlLnRlc3RzLmphdmEudXRpbC56aXA7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTI3LDYgKzMyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwogCitAVGVzdFRhcmdldENsYXNzKFppcE91dHB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgWmlwT3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBaaXBPdXRwdXRTdHJlYW0gem9zOwpAQCAtNDAsNiArNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0jY2xvc2UoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgem9zLmNsb3NlKCk7CkBAIC02Myw2ICs3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbSNjbG9zZUVudHJ5KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSgidGVzdEVudHJ5Iik7CiAgICAgICAgIHplLnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwpAQCAtNzcsNiArMTAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtI2ZpbmlzaCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJaaXBFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmluaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KCJ0ZXN0Iik7CiAgICAgICAgIHpvcy5wdXROZXh0RW50cnkoemUpOwpAQCAtOTksNiArMTMyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtI3B1dE5leHRFbnRyeShqYXZhLnV0aWwuemlwLlppcEVudHJ5KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiWmlwRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXROZXh0RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLnppcC5aaXBFbnRyeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXROZXh0RW50cnlMamF2YV91dGlsX3ppcF9aaXBFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KCJ0ZXN0RW50cnkiKTsKICAgICAgICAgemUuc2V0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CkBAIC0xMjMsNiArMTY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtI3NldENvbW1lbnQoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDb21tZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29tbWVudExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBjb21tZW50IGJhY2ssIHNvIG5vIHdheSB0byBkZXRlcm1pbmUgaWYKICAgICAgICAgLy8gdGhlIGNvbW1lbnQgaXMgc2V0IGNvcnJlY3QKQEAgLTE0Miw2ICsxOTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0jc2V0TGV2ZWwoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGV2ZWxJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoInRlc3QiKTsKICAgICAgICAgem9zLnB1dE5leHRFbnRyeSh6ZSk7CkBAIC0xNTgsNiArMjE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtI3NldE1ldGhvZChpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1ldGhvZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TWV0aG9kSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KCJ0ZXN0Iik7CiAgICAgICAgIHpvcy5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLlNUT1JFRCk7CkBAIC0xNzksNiArMjQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSgidGVzdCIpOwogICAgICAgICB6b3MucHV0TmV4dEVudHJ5KHplKTsKQEAgLTIzMiw2ICszMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUlfMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNTc3CiAgICAgICAgIEZpbGUgZjEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0WmlwMSIsICJ0c3QiKTsKZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL0F1dGhQZXJtaXNzaW9uLmphdmEgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9BdXRoUGVybWlzc2lvbi5qYXZhCmluZGV4IDMxZjViNTAuLjA2ZWEzZmIgMTAwNjQ0Ci0tLSBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL0F1dGhQZXJtaXNzaW9uLmphdmEKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvQXV0aFBlcm1pc3Npb24uamF2YQpAQCAtMjEsNiArMjEsMzkgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hdXRoLmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiBHb3Zlcm5zIHRoZSB1c2Ugb2YgbWV0aG9kcyBpbiB0aGlzIHBhY2thZ2UgYW5kIGFsc28gaXRzIHN1YnBhY2thZ2VzLiBBCisgKiA8aT50YXJnZXQgbmFtZTwvaT4gb2YgdGhlIHBlcm1pc3Npb24gc3BlY2lmaWVzIHdoaWNoIG1ldGhvZHMgYXJlIGFsbG93ZWQKKyAqIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgY29uY3JldGUgYWN0aW9uIGxpc3RzLiBQb3NzaWJsZSB0YXJnZXQgbmFtZXMgYW5kCisgKiBhc3NvY2lhdGVkIGF1dGhlbnRpY2F0aW9uIHBlcm1pc3Npb25zIGFyZToKKyAqIAorICogPHByZT4KKyAqICAgIGRvQXMgICAgICAgICAgICAgICAgICAgICAgaW52b2tlIFN1YmplY3QuZG9BcyBtZXRob2RzLgorICogICAgZG9Bc1ByaXZpbGVnZWQgICAgICAgICAgICBpbnZva2UgdGhlIFN1YmplY3QuZG9Bc1ByaXZpbGVnZWQgbWV0aG9kcy4KKyAqICAgIGdldFN1YmplY3QgICAgICAgICAgICAgICAgaW52b2tlIFN1YmplY3QuZ2V0U3ViamVjdCgpLgorICogICAgZ2V0U3ViamVjdEZyb21Eb21haW5Db21iaW5lciAgICBpbnZva2UgU3ViamVjdERvbWFpbkNvbWJpbmVyLmdldFN1YmplY3QoKS4KKyAqICAgIHNldFJlYWRPbmx5ICAgICAgICAgICAgICAgaW52b2tlIFN1YmplY3Quc2V0UmVhZG9ubHkoKS4KKyAqICAgIG1vZGlmeVByaW5jaXBhbHMgICAgICAgICAgbW9kaWZ5IHRoZSBzZXQgb2YgcHJpbmNpcGFscyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGEgU3ViamVjdC4KKyAqICAgIG1vZGlmeVB1YmxpY0NyZWRlbnRpYWxzICAgbW9kaWZ5IHRoZSBzZXQgb2YgcHVibGljIGNyZWRlbnRpYWxzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBhIFN1YmplY3QuCisgKiAgICBtb2RpZnlQcml2YXRlQ3JlZGVudGlhbHMgIG1vZGlmeSB0aGUgc2V0IG9mIHByaXZhdGUgY3JlZGVudGlhbHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGEgU3ViamVjdC4KKyAqICAgIHJlZnJlc2hDcmVkZW50aWFsICAgICAgICAgaW52b2tlIHRoZSByZWZyZXNoIG1ldGhvZCBvbiBhIGNyZWRlbnRpYWwgb2YgYSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaGFibGUgY3JlZGVudGlhbCBjbGFzcy4KKyAqICAgIGRlc3Ryb3lDcmVkZW50aWFsICAgICAgICAgaW52b2tlIHRoZSBkZXN0cm95IG1ldGhvZCBvbiBhIGNyZWRlbnRpYWwgb2YgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95YWJsZSBjcmVkZW50aWFsIGNsYXNzLgorICogICAgY3JlYXRlTG9naW5Db250ZXh0LjxpPm5hbWU8L2k+ICAgaW5zdGFudGlhdGUgYSBMb2dpbkNvbnRleHQgd2l0aCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIG5hbWUuIFRoZSB3aWxkY2FyZCBuYW1lICgnKicpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93cyB0byBhIExvZ2luQ29udGV4dCBvZiBhbnkgbmFtZS4KKyAqICAgIGdldExvZ2luQ29uZmlndXJhdGlvbiAgICAgaW52b2tlIHRoZSBnZXRDb25maWd1cmF0aW9uIG1ldGhvZCBvZiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Db25maWd1cmF0aW9uLgorICogICAgcmVmcmVzaExvZ2luQ29uZmlndXJhdGlvbiBJbnZva2UgdGhlIHJlZnJlc2ggbWV0aG9kIG9mIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkNvbmZpZ3VyYXRpb24uCisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBBdXRoUGVybWlzc2lvbiBleHRlbmRzIEJhc2ljUGVybWlzc2lvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1ODA2MDMxNDQ1MDYxNTg3MTc0TDsKQEAgLTQyLDEwICs3NSwyNCBAQAogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGF1dGhlbnRpY2F0aW9uIHBlcm1pc3Npb24gd2l0aCB0aGUgc3BlY2lmaWVkIHRhcmdldCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IG5hbWUgb2YgdGhpcyBhdXRoZW50aWNhdGlvbiBwZXJtaXNzaW9uLgorICAgICAqLwogICAgIHB1YmxpYyBBdXRoUGVybWlzc2lvbihTdHJpbmcgbmFtZSkgewogICAgICAgICBzdXBlcihpbml0KG5hbWUpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGF1dGhlbnRpY2F0aW9uIHBlcm1pc3Npb24gd2l0aCB0aGUgc3BlY2lmaWVkIHRhcmdldCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IG5hbWUgb2YgdGhpcyBhdXRoZW50aWNhdGlvbiBwZXJtaXNzaW9uLgorICAgICAqIEBwYXJhbSBhY3Rpb25zCisgICAgICogICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGFuZCBzaG91bGQgYmUge0Bjb2RlIG51bGx9LgorICAgICAqLwogICAgIHB1YmxpYyBBdXRoUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKICAgICAgICAgc3VwZXIoaW5pdChuYW1lKSwgYWN0aW9ucyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvRGVzdHJveUZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvRGVzdHJveUZhaWxlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDE2ZTlkZmIuLmE1NDM4YTYgMTAwNjQ0Ci0tLSBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL0Rlc3Ryb3lGYWlsZWRFeGNlcHRpb24uamF2YQorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9EZXN0cm95RmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTE3LDE0ICsxNywyOCBAQAogCiBwYWNrYWdlIGphdmF4LnNlY3VyaXR5LmF1dGg7CiAKKy8qKgorICogU2lnbmFscyB0aGF0IHRoZSB7QGxpbmsgRGVzdHJveWFibGUjZGVzdHJveSgpfSBtZXRob2QgZmFpbGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIERlc3Ryb3lGYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc3OTAxNTI4NTcyODI3NDkxNjJMOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBleGNlcHRpb24gb2YgdHlwZSB7QGNvZGUgRGVzdHJveUZhaWxlZEV4Y2VwdGlvbn0uCisgICAgICovCiAgICAgcHVibGljIERlc3Ryb3lGYWlsZWRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBleGNlcHRpb24gb2YgdHlwZSB7QGNvZGUgRGVzdHJveUZhaWxlZEV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIEEgZGV0YWlsIG1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgdGhlIHJlYXNvbiBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICovCiAgICAgcHVibGljIERlc3Ryb3lGYWlsZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvRGVzdHJveWFibGUuamF2YSBiL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL0Rlc3Ryb3lhYmxlLmphdmEKaW5kZXggYTU0Y2JlNi4uNjE5NGRiNiAxMDA2NDQKLS0tIGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvRGVzdHJveWFibGUuamF2YQorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9EZXN0cm95YWJsZS5qYXZhCkBAIC0xNywxMCArMTcsMjkgQEAKIAogcGFja2FnZSBqYXZheC5zZWN1cml0eS5hdXRoOwogCisvKioKKyAqIEFsbG93cyBmb3Igc3BlY2lhbCB0cmVhdG1lbnQgb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLCB3aGVuIGl0IGNvbWVzIHRvCisgKiBkZXN0cm95aW5nIG9yIGNsZWFyaW5nIG9mIHRoZSBkYXRhLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBEZXN0cm95YWJsZSB7CiAKKyAgICAvKioKKyAgICAgKiBFcmFzZXMgdGhlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gT25jZSBhbiBvYmplY3QgaXMgZGVzdHJveWVkIGFueSBjYWxscworICAgICAqIHRvIGl0cyBtZXRob2RzIHdpbGwgdGhyb3cgYW4ge0Bjb2RlIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uIElmIGl0IGRvZXMKKyAgICAgKiBub3Qgc3VjY2VlZCBhIERlc3Ryb3lGYWlsZWRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgRGVzdHJveUZhaWxlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgZXJhc2VkLgorICAgICAqLwogICAgIHZvaWQgZGVzdHJveSgpIHRocm93cyBEZXN0cm95RmFpbGVkRXhjZXB0aW9uOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gb25jZSBhbiBvYmplY3QgaGFzIGJlZW4gc2FmZWx5IGRlc3Ryb3llZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgYmVlbiBzYWZlbHkgZGVzdHJveWVkLgorICAgICAqLwogICAgIGJvb2xlYW4gaXNEZXN0cm95ZWQoKTsKIAogfQpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uLmphdmEgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24uamF2YQppbmRleCAxZjVhNTYwLi5kOTJlZGU1IDEwMDY0NAotLS0gYS9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24uamF2YQorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24uamF2YQpAQCAtMjcsNiArMjcsMjkgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hdXRoLmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiBQcm90ZWN0cyBwcml2YXRlIGNyZWRlbnRpYWwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gYSB7QGNvZGUgU3ViamVjdH0uIEl0IGhhcworICogb25seSBvbmUgYWN0aW9uIHdoaWNoIGlzICJyZWFkIi4gVGhlIHRhcmdldCBuYW1lIG9mIHRoaXMgcGVybWlzc2lvbiBoYXMgYQorICogc3BlY2lhbCBzeW50YXg6CisgKiAKKyAqIDxwcmU+CisgKiB0YXJnZXROYW1lID0gQ3JlZGVudGlhbENsYXNzIHtQcmluY2lwYWxDbGFzcyAmcXVvdDtQcmluY2lwYWxOYW1lJnF1b3Q7fSoKKyAqIDwvcHJlPgorICogCisgKiBGaXJzdCBpdCBzdGF0ZXMgYSBjcmVkZW50aWFsIGNsYXNzIGFuZCBpcyBmb2xsb3dlZCB0aGVuIGJ5IGEgbGlzdCBvZiBvbmUgb3IKKyAqIG1vcmUgcHJpbmNpcGFscyBpZGVudGlmeWluZyB0aGUgc3ViamVjdC4KKyAqIDxwPgorICogVGhlIHByaW5jaXBhbHMgb24gdGhlaXIgcGFydCBhcmUgc3BlY2lmaWVkIGFzIHRoZSBuYW1lIG9mIHRoZSB7QGNvZGUKKyAqIFByaW5jaXBhbH0gY2xhc3MgZm9sbG93ZWQgYnkgdGhlIHByaW5jaXBhbCBuYW1lIGluIHF1b3Rlcy4gRm9yIGV4YW1wbGUsIHRoZQorICogZm9sbG93aW5nIGZpbGUgbWF5IGRlZmluZSBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHByaXZhdGUgY3JlZGVudGlhbHMgb2YgYQorICogcHJpbmNpcGFsIG5hbWVkICJCb2IiOiAiY29tLnN1bi5Qcml2YXRlQ3JlZGVudGlhbCBjb20uc3VuLlByaW5jaXBhbCBcIkJvYlwiIgorICogPC9wPgorICogVGhlIHN5bnRheCBhbHNvIGFsbG93cyB0aGUgdXNlIG9mIHRoZSB3aWxkY2FyZCAiKiIgaW4gcGxhY2Ugb2Yge0Bjb2RlCisgKiBDcmVkZW50aWFsQ2xhc3N9IG9yIHtAY29kZSBQcmluY2lwYWxDbGFzc30gYW5kL29yIHtAY29kZSBQcmluY2lwYWxOYW1lfS4KKyAqIAorICogQHNlZSBQcmluY2lwYWwKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgZmluYWwgY2xhc3MgUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uIGV4dGVuZHMgUGVybWlzc2lvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Mjg0MzcyMTQzNTE3MjM3MDY4TDsKQEAgLTQyLDYgKzY1LDE2IEBACiAgICAgLy8gb3duZXJzIHNldAogICAgIHByaXZhdGUgdHJhbnNpZW50IENyZWRPd25lcltdIHNldDsKICAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHBlcm1pc3Npb24gZm9yIHByaXZhdGUgY3JlZGVudGlhbHMgc3BlY2lmaWVkIGJ5IHRoZSB0YXJnZXQKKyAgICAgKiBuYW1lIHtAY29kZSBuYW1lfSBhbmQgYW4ge0Bjb2RlIGFjdGlvbn0uIFRoZSBhY3Rpb24gaXMgYWx3YXlzCisgICAgICoge0Bjb2RlICJyZWFkIn0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgbmFtZSBvZiB0aGUgcGVybWlzc2lvbi4KKyAgICAgKiBAcGFyYW0gYWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgYWN0aW9uIHtAY29kZSAicmVhZCJ9LgorICAgICAqLwogICAgIHB1YmxpYyBQcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24oU3RyaW5nIG5hbWUsIFN0cmluZyBhY3Rpb24pIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgICAgIGlmIChSRUFELmVxdWFsc0lnbm9yZUNhc2UoYWN0aW9uKSkgewpAQCAtNTIsMTEgKzg1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxjb2RlPlByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbjwvY29kZT4gZnJvbSB0aGUgQ3JlZGVudGlhbCBDbGFzcyAKLSAgICAgKiBhbmQgU2V0IG9mIFByaW5jaXBhbHMKKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbn0gZnJvbSB0aGUge0Bjb2RlIENyZWRlbnRpYWx9CisgICAgICogY2xhc3MgYW5kIHNldCBvZiBwcmluY2lwYWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjcmVkZW50aWFsQ2xhc3MgLSBjcmVkZW50aWFsIGNsYXNzIG5hbWUKLSAgICAgKiBAcGFyYW0gcHJpbmNpcGFscyAtIHByaW5jaXBhbCBzZXQKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbENsYXNzCisgICAgICogICAgICAgICAgICB0aGUgY3JlZGVudGlhbCBjbGFzcyBuYW1lLgorICAgICAqIEBwYXJhbSBwcmluY2lwYWxzCisgICAgICogICAgICAgICAgICB0aGUgc2V0IG9mIHByaW5jaXBhbHMuCiAgICAgICovCiAgICAgUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uKFN0cmluZyBjcmVkZW50aWFsQ2xhc3MsIFNldDxQcmluY2lwYWw+IHByaW5jaXBhbHMpIHsKICAgICAgICAgc3VwZXIoY3JlZGVudGlhbENsYXNzKTsKQEAgLTE1Niw2ICsxOTEsMjIgQEAKICAgICAgICAgaW5pdFRhcmdldE5hbWUoZ2V0TmFtZSgpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmluY2lwYWwncyBjbGFzc2VzIGFuZCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiBQcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb259IGFzIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5LiBUaGUgZmlyc3QKKyAgICAgKiBkaW1lbnNpb24gb2YgdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIHRoZSBudW1iZXIgb2YgcHJpbmNpcGFscy4gVGhlCisgICAgICogc2Vjb25kIGRpbWVuc2lvbiBkZWZpbmVzIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUge0Bjb2RlIFByaW5jaXBhbENsYXNzfQorICAgICAqIFt4XVswXSBvciB0aGUgdmFsdWUgb2Yge0Bjb2RlIFByaW5jaXBhbE5hbWV9IFt4XVsxXS4KKyAgICAgKiAKKyAgICAgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSB0aGUgdGFyZ2V0IG5hbWUncyBzeW50YXg6CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiB0YXJnZXROYW1lID0gQ3JlZGVudGlhbENsYXNzIHtQcmluY2lwYWxDbGFzcyAmcXVvdDtQcmluY2lwYWxOYW1lJnF1b3Q7fSoKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmluY2lwYWwgY2xhc3NlcyBhbmQgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBQcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb259LgorICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXVtdIGdldFByaW5jaXBhbHMoKSB7CiAKICAgICAgICAgU3RyaW5nW11bXSBzID0gbmV3IFN0cmluZ1tvZmZzZXRdWzJdOwpAQCAtMTcyLDYgKzIyMywxMSBAQAogICAgICAgICByZXR1cm4gUkVBRDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjcmVkZW50aWFsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBlcm1pc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgY3JlZGVudGlhbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZXJtaXNzaW9uLgorICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlZGVudGlhbENsYXNzKCkgewogICAgICAgICByZXR1cm4gY3JlZGVudGlhbENsYXNzOwogICAgIH0KZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL1N1YmplY3QuamF2YSBiL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL1N1YmplY3QuamF2YQppbmRleCAxMmMyZmY2Li41YTRjY2ViIDEwMDY0NAotLS0gYS9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9TdWJqZWN0LmphdmEKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvU3ViamVjdC5qYXZhCkBAIC0zOCw2ICszOCwyMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF1dGguaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCisvKioKKyAqIFRoZSBjZW50cmFsIGNsYXNzIG9mIHRoZSB7QGNvZGUgamF2YXguc2VjdXJpdHkuYXV0aH0gcGFja2FnZSByZXByZXNlbnRpbmcgYW4KKyAqIGF1dGhlbnRpY2F0ZWQgdXNlciBvciBlbnRpdHkgKGJvdGggcmVmZXJyZWQgdG8gYXMgInN1YmplY3QiKS4gSVQgZGVmaW5lcyBhbHNvCisgKiB0aGUgc3RhdGljIG1ldGhvZHMgdGhhdCBhbGxvdyBjb2RlIHRvIGJlIHJ1biwgYW5kIGRvIG1vZGlmaWNhdGlvbnMgYWNjb3JkaW5nCisgKiB0byB0aGUgc3ViamVjdCdzIHBlcm1pc3Npb25zLgorICogPHA+CisgKiBBIHN1YmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6CisgKiA8dWw+CisgKiA8bGk+QSBzZXQgb2Yge0Bjb2RlIFByaW5jaXBhbH0gb2JqZWN0cyBzcGVjaWZ5aW5nIHRoZSBpZGVudGl0aWVzIGJvdW5kIHRvIGEKKyAqIHtAY29kZSBTdWJqZWN0fSB0aGF0IGRpc3Rpbmd1aXNoIGl0LjwvbGk+CisgKiA8bGk+Q3JlZGVudGlhbHMgKHB1YmxpYyBhbmQgcHJpdmF0ZSkgc3VjaCBhcyBjZXJ0aWZpY2F0ZXMsIGtleXMsIG9yCisgKiBhdXRoZW50aWNhdGlvbiBwcm9vZnMgc3VjaCBhcyB0aWNrZXRzPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGZpbmFsIGNsYXNzIFN1YmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgzMDg1MjI3NTU2MDAxNTYwNTZMOwpAQCAtNzIsNiArODgsMTAgQEAKICAgICAvLyBzZXQgb2YgcHVibGljIGNyZWRlbnRpYWxzCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VjdXJlU2V0PE9iamVjdD4gcHVibGljQ3JlZGVudGlhbHM7CiAgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaW5pdGlhbGl6aW5nIHRoZSBzZXRzIG9mIHB1YmxpYyBhbmQgcHJpdmF0ZQorICAgICAqIGNyZWRlbnRpYWxzIGFuZCBwcmluY2lwYWxzIHdpdGggdGhlIGVtcHR5IHNldC4KKyAgICAgKi8KICAgICBwdWJsaWMgU3ViamVjdCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgcHJpbmNpcGFscyA9IG5ldyBTZWN1cmVTZXQ8UHJpbmNpcGFsPihfUFJJTkNJUEFMUyk7CkBAIC04MSw2ICsxMDEsMjMgQEAKICAgICAgICAgcmVhZE9ubHkgPSBmYWxzZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBzdWJqZWN0LCBzZXR0aW5nIGl0cyBwdWJsaWMgYW5kIHByaXZhdGUKKyAgICAgKiBjcmVkZW50aWFscyBhbmQgcHJpbmNpcGFscyBhY2NvcmRpbmcgdG8gdGhlIGFyZ3VtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVhZE9ubHkKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBTdWJqZWN0fSBpcyByZWFkLW9ubHksIHRodXMKKyAgICAgKiAgICAgICAgICAgIHByZXZlbnRpbmcgYW55IG1vZGlmaWNhdGlvbnMgdG8gYmUgZG9uZS4KKyAgICAgKiBAcGFyYW0gc3VialByaW5jaXBhbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgUHJpbmNpcGFscyB0aGF0IGFyZSBhdHRyaWJ1dGVkIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICAgICBTdWJqZWN0fS4KKyAgICAgKiBAcGFyYW0gcHViQ3JlZGVudGlhbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgcHVibGljIGNyZWRlbnRpYWxzIHRoYXQgZGlzdGluZ3Vpc2ggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFN1YmplY3R9LgorICAgICAqIEBwYXJhbSBwcml2Q3JlZGVudGlhbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgcHJpdmF0ZSBjcmVkZW50aWFscyB0aGF0IGRpc3Rpbmd1aXNoIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICAgICBTdWJqZWN0fS4KKyAgICAgKi8KICAgICBwdWJsaWMgU3ViamVjdChib29sZWFuIHJlYWRPbmx5LCBTZXQ8PyBleHRlbmRzIFByaW5jaXBhbD4gc3VialByaW5jaXBhbHMsCiAgICAgICAgICAgICBTZXQ8Pz4gcHViQ3JlZGVudGlhbHMsIFNldDw/PiBwcml2Q3JlZGVudGlhbHMpIHsKIApAQCAtOTUsNiArMTMyLDE2IEBACiAgICAgICAgIHRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSBjb2RlIGRlZmluZWQgYnkge0Bjb2RlIGFjdGlvbn0gdXNpbmcgdGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8KKyAgICAgKiB0aGUge0Bjb2RlIFN1YmplY3R9IGl0c2VsZiBhbmQgdG8gdGhlIGNvZGUgYXMgd2VsbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3ViamVjdAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3Rpbmd1aXNoZWQge0Bjb2RlIFN1YmplY3R9LgorICAgICAqIEBwYXJhbSBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHRvIGJlIHJ1bi4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgT2JqZWN0fSByZXR1cm5lZCB3aGVuIHJ1bm5pbmcgdGhlIHtAY29kZSBhY3Rpb259LgorICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRvQXMoU3ViamVjdCBzdWJqZWN0LCBQcml2aWxlZ2VkQWN0aW9uIGFjdGlvbikgewogCkBAIC0xMDMsNiArMTUwLDIxIEBACiAgICAgICAgIHJldHVybiBkb0FzX1ByaXZpbGVnZWRBY3Rpb24oc3ViamVjdCwgYWN0aW9uLCBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUnVuIHRoZSBjb2RlIGRlZmluZWQgYnkge0Bjb2RlIGFjdGlvbn0gdXNpbmcgdGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8KKyAgICAgKiB0aGUge0Bjb2RlIFN1YmplY3R9IGFuZCB0byB0aGUgY29kZSBpdHNlbGYsIGFkZGl0aW9uYWxseSBwcm92aWRpbmcgYSBtb3JlCisgICAgICogc3BlY2lmaWMgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3ViamVjdAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3Rpbmd1aXNoZWQge0Bjb2RlIFN1YmplY3R9LgorICAgICAqIEBwYXJhbSBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHRvIGJlIHJ1bi4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmljIGNvbnRleHQgaW4gd2hpY2ggdGhlIHtAY29kZSBhY3Rpb259IGlzIGludm9rZWQuCisgICAgICogICAgICAgICAgICBpZiB7QGNvZGUgbnVsbH0gYSBuZXcge0BsaW5rIEFjY2Vzc0NvbnRyb2xDb250ZXh0fSBpcworICAgICAqICAgICAgICAgICAgaW5zdGFudGlhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBPYmplY3R9IHJldHVybmVkIHdoZW4gcnVubmluZyB0aGUge0Bjb2RlIGFjdGlvbn0uCisgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZG9Bc1ByaXZpbGVnZWQoU3ViamVjdCBzdWJqZWN0LCBQcml2aWxlZ2VkQWN0aW9uIGFjdGlvbiwKICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGNvbnRleHQpIHsKQEAgLTE0NCw2ICsyMDYsMTggQEAKICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbiwgbmV3Q29udGV4dCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUnVucyB0aGUgY29kZSBkZWZpbmVkIGJ5IHtAY29kZSBhY3Rpb259IHVzaW5nIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvCisgICAgICogdGhlIHN1YmplY3QgYW5kIHRvIHRoZSBjb2RlIGl0c2VsZi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3ViamVjdAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3Rpbmd1aXNoZWQge0Bjb2RlIFN1YmplY3R9LgorICAgICAqIEBwYXJhbSBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHRvIGJlIHJ1bi4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgT2JqZWN0fSByZXR1cm5lZCB3aGVuIHJ1bm5pbmcgdGhlIHtAY29kZSBhY3Rpb259LgorICAgICAqIEB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHJ1bm5pbmcgdGhlIHtAY29kZSBhY3Rpb259IHRocm93cyBhbiBleGNlcHRpb24uCisgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZG9BcyhTdWJqZWN0IHN1YmplY3QsIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gYWN0aW9uKQogICAgICAgICAgICAgdGhyb3dzIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gewpAQCAtMTUzLDYgKzIyNywyMyBAQAogICAgICAgICByZXR1cm4gZG9Bc19Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKHN1YmplY3QsIGFjdGlvbiwgQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIGNvZGUgZGVmaW5lZCBieSB7QGNvZGUgYWN0aW9ufSB1c2luZyB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0bworICAgICAqIHRoZSBzdWJqZWN0IGFuZCB0byB0aGUgY29kZSBpdHNlbGYsIGFkZGl0aW9uYWxseSBwcm92aWRpbmcgYSBtb3JlCisgICAgICogc3BlY2lmaWMgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3ViamVjdAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3Rpbmd1aXNoZWQge0Bjb2RlIFN1YmplY3R9LgorICAgICAqIEBwYXJhbSBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHRvIGJlIHJ1bi4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmljIGNvbnRleHQgaW4gd2hpY2ggdGhlIHtAY29kZSBhY3Rpb259IGlzIGludm9rZWQuCisgICAgICogICAgICAgICAgICBpZiB7QGNvZGUgbnVsbH0gYSBuZXcge0BsaW5rIEFjY2Vzc0NvbnRyb2xDb250ZXh0fSBpcworICAgICAqICAgICAgICAgICAgaW5zdGFudGlhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBPYmplY3R9IHJldHVybmVkIHdoZW4gcnVubmluZyB0aGUge0Bjb2RlIGFjdGlvbn0uCisgICAgICogQHRocm93cyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcnVubmluZyB0aGUge0Bjb2RlIGFjdGlvbn0gdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBkb0FzUHJpdmlsZWdlZChTdWJqZWN0IHN1YmplY3QsCiAgICAgICAgICAgICBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGFjdGlvbiwgQWNjZXNzQ29udHJvbENvbnRleHQgY29udGV4dCkKQEAgLTE5NSw2ICsyODYsMTcgQEAKICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbiwgbmV3Q29udGV4dCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2hlY2tzIHR3byBTdWJqZWN0cyBmb3IgZXF1YWxpdHkuIE1vcmUgc3BlY2lmaWNhbGx5IGlmIHRoZSBwcmluY2lwYWxzLAorICAgICAqIHB1YmxpYyBhbmQgcHJpdmF0ZSBjcmVkZW50aWFscyBhcmUgZXF1YWwsIGVxdWFsaXR5IGZvciB0d28ge0Bjb2RlCisgICAgICogU3ViamVjdHN9IGlzIGltcGxpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3R9IGNoZWNrZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFN1YmplY3R9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQge0Bjb2RlIFN1YmplY3R9IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIG9uZS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCkBAIC0yMTYsNDYgKzMxOCwxMTcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB7QGNvZGUgU3ViamVjdH0ncyB7QGxpbmsgUHJpbmNpcGFsfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIFN1YmplY3R9J3Mge0BsaW5rIFByaW5jaXBhbH0uCisgICAgICovCiAgICAgcHVibGljIFNldDxQcmluY2lwYWw+IGdldFByaW5jaXBhbHMoKSB7CiAgICAgICAgIHJldHVybiBwcmluY2lwYWxzOwogICAgIH0KIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB7QGNvZGUgU3ViamVjdH0ncyB7QGxpbmsgUHJpbmNpcGFsfSB3aGljaCBpcyBhIHN1YmNsYXNzIG9mCisgICAgICogdGhlIHtAY29kZSBDbGFzc30gcHJvdmlkZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2xhc3N9IGFzIGEgY3JpdGVyaWEgd2hpY2ggdGhlIHtAY29kZSBQcmluY2lwYWx9CisgICAgICogICAgICAgICAgICByZXR1cm5lZCBtdXN0IHNhdGlzZnkuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBTdWJqZWN0fSdzIHtAbGluayBQcmluY2lwYWx9LiBNb2RpZmljYXRpb25zIHRvIHRoZQorICAgICAqICAgICAgICAgcmV0dXJuZWQgc2V0IG9mIHtAY29kZSBQcmluY2lwYWx9cyBkbyBub3QgYWZmZWN0IHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBTdWJqZWN0fSdzIHNldC4KKyAgICAgKi8KICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBQcmluY2lwYWw+IFNldDxUPiBnZXRQcmluY2lwYWxzKENsYXNzPFQ+IGMpIHsKICAgICAgICAgcmV0dXJuICgoU2VjdXJlU2V0PFByaW5jaXBhbD4pIHByaW5jaXBhbHMpLmdldChjKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcml2YXRlIGNyZWRlbnRpYWxzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBTdWJqZWN0fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcml2YXRlIGNyZWRlbnRpYWxzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBTdWJqZWN0fS4KKyAgICAgKi8KICAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0UHJpdmF0ZUNyZWRlbnRpYWxzKCkgewogICAgICAgICByZXR1cm4gcHJpdmF0ZUNyZWRlbnRpYWxzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB7QGNvZGUgU3ViamVjdH0ncyBwcml2YXRlIGNyZWRlbnRpYWxzIHdoaWNoIGFyZSBhIHN1YmNsYXNzCisgICAgICogb2YgdGhlIHtAY29kZSBDbGFzc30gcHJvdmlkZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2xhc3N9IGFzIGEgY3JpdGVyaWEgd2hpY2ggdGhlIHByaXZhdGUgY3JlZGVudGlhbHMKKyAgICAgKiAgICAgICAgICAgIHJldHVybmVkIG11c3Qgc2F0aXNmeS4KKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIFN1YmplY3R9J3MgcHJpdmF0ZSBjcmVkZW50aWFscy4gTW9kaWZpY2F0aW9ucyB0byB0aGUKKyAgICAgKiAgICAgICAgIHJldHVybmVkIHNldCBvZiBjcmVkZW50aWFscyBkbyBub3QgYWZmZWN0IHRoaXMge0Bjb2RlIFN1YmplY3R9J3MKKyAgICAgKiAgICAgICAgIGNyZWRlbnRpYWxzLgorICAgICAqLwogICAgIHB1YmxpYyA8VD4gU2V0PFQ+IGdldFByaXZhdGVDcmVkZW50aWFscyhDbGFzczxUPiBjKSB7CiAgICAgICAgIHJldHVybiBwcml2YXRlQ3JlZGVudGlhbHMuZ2V0KGMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHB1YmxpYyBjcmVkZW50aWFscyBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgU3ViamVjdH0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHVibGljIGNyZWRlbnRpYWxzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBTdWJqZWN0fS4KKyAgICAgKi8KICAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0UHVibGljQ3JlZGVudGlhbHMoKSB7CiAgICAgICAgIHJldHVybiBwdWJsaWNDcmVkZW50aWFsczsKICAgICB9CiAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMge0Bjb2RlIFN1YmplY3R9J3MgcHVibGljIGNyZWRlbnRpYWxzIHdoaWNoIGFyZSBhIHN1YmNsYXNzIG9mCisgICAgICogdGhlIHtAY29kZSBDbGFzc30gcHJvdmlkZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2xhc3N9IGFzIGEgY3JpdGVyaWEgd2hpY2ggdGhlIHB1YmxpYyBjcmVkZW50aWFscworICAgICAqICAgICAgICAgICAgcmV0dXJuZWQgbXVzdCBzYXRpc2Z5LgorICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgU3ViamVjdH0ncyBwdWJsaWMgY3JlZGVudGlhbHMuIE1vZGlmaWNhdGlvbnMgdG8gdGhlCisgICAgICogICAgICAgICByZXR1cm5lZCBzZXQgb2YgY3JlZGVudGlhbHMgZG8gbm90IGFmZmVjdCB0aGlzIHtAY29kZSBTdWJqZWN0fSdzCisgICAgICogICAgICAgICBjcmVkZW50aWFscy4KKyAgICAgKi8KICAgICBwdWJsaWMgPFQ+IFNldDxUPiBnZXRQdWJsaWNDcmVkZW50aWFscyhDbGFzczxUPiBjKSB7CiAgICAgICAgIHJldHVybiBwdWJsaWNDcmVkZW50aWFscy5nZXQoYyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBvZiB0aGlzIHtAY29kZSBTdWJqZWN0fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIG9mIHRoaXMge0Bjb2RlIFN1YmplY3R9LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiBwcmluY2lwYWxzLmhhc2hDb2RlKCkgKyBwcml2YXRlQ3JlZGVudGlhbHMuaGFzaENvZGUoKQogICAgICAgICAgICAgICAgICsgcHVibGljQ3JlZGVudGlhbHMuaGFzaENvZGUoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBmcm9tIG1vZGlmaWNhdGlvbnMgYmVpbmcgZG9uZSB0byB0aGUgY3JlZGVudGlhbHMgYW5kIHtAbGluaworICAgICAqIFByaW5jaXBhbH0gc2V0cy4gQWZ0ZXIgc2V0dGluZyBpdCB0byByZWFkLW9ubHkgdGhpcyB7QGNvZGUgU3ViamVjdH0gY2FuCisgICAgICogbm90IGJlIG1hZGUgd3JpdGFibGUgYWdhaW4uIFRoZSBkZXN0cm95IG1ldGhvZCBvbiB0aGUgY3JlZGVudGlhbHMgc3RpbGwKKyAgICAgKiB3b3JrcyB0aG91Z2guCisgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoKSB7CiAgICAgICAgIGNoZWNrUGVybWlzc2lvbihfUkVBRF9PTkxZKTsKIAogICAgICAgICByZWFkT25seSA9IHRydWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMge0Bjb2RlIFN1YmplY3R9IGlzIHJlYWQtb25seSBvciBub3QuCisgICAgICogCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMge0Bjb2RlIFN1YmplY3R9IGlzIHJlYWQtb25seSBvciBub3QuCisgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKICAgICAgICAgcmV0dXJuIHJlYWRPbmx5OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBTdWJqZWN0fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgU3ViamVjdH0uCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIApAQCAtMzAzLDYgKzQ3NiwxNiBAQAogICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFN1YmplY3R9IHRoYXQgd2FzIGxhc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGNvZGUKKyAgICAgKiBjb250ZXh0fSBwcm92aWRlZCBhcyBhcmd1bWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBjb250ZXh0fSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogICAgICAgICAgICB7QGNvZGUgU3ViamVjdH0uCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFN1YmplY3R9IHRoYXQgd2FzIGxhc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIGNvbnRleHR9IHByb3ZpZGVkIGFzIGFyZ3VtZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3ViamVjdCBnZXRTdWJqZWN0KGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKF9TVUJKRUNUKTsKICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewpAQCAtNTk4LDQgKzc4MSw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvU3ViamVjdERvbWFpbkNvbWJpbmVyLmphdmEgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9TdWJqZWN0RG9tYWluQ29tYmluZXIuamF2YQppbmRleCA4MGY5ZDg1Li42YThmMDBiIDEwMDY0NAotLS0gYS9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9TdWJqZWN0RG9tYWluQ29tYmluZXIuamF2YQorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9TdWJqZWN0RG9tYWluQ29tYmluZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW47CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAorLyoqCisgKiBNZXJnZXMgcGVybWlzc2lvbnMgYmFzZWQgb24gY29kZSBzb3VyY2UgYW5kIGNvZGUgc2lnbmVycyB3aXRoIHBlcm1pc3Npb25zCisgKiBncmFudGVkIHRvIHRoZSBzcGVjaWZpZWQge0BsaW5rIFN1YmplY3R9LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIFN1YmplY3REb21haW5Db21iaW5lciBpbXBsZW1lbnRzIERvbWFpbkNvbWJpbmVyIHsKIAogICAgIC8vIHN1YmplY3QgdG8gYmUgYXNzb2NpYXRlZApAQCAtMzEsNiArMzcsMTIgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdXRoUGVybWlzc2lvbiBfR0VUID0gbmV3IEF1dGhQZXJtaXNzaW9uKAogICAgICAgICAgICAgImdldFN1YmplY3RGcm9tRG9tYWluQ29tYmluZXIiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGRvbWFpbiBjb21iaW5lciBmb3IgdGhlIGVudGl0eSBwcm92aWRlZCBpbiB7QGNvZGUgc3ViamVjdH0uCisgICAgICogCisgICAgICogQHBhcmFtIHN1YmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBkb21haW4gY29tYmluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KICAgICBwdWJsaWMgU3ViamVjdERvbWFpbkNvbWJpbmVyKFN1YmplY3Qgc3ViamVjdCkgewogICAgICAgICBzdXBlcigpOwogICAgICAgICBpZiAoc3ViamVjdCA9PSBudWxsKSB7CkBAIC0zOSw2ICs1MSwxMSBAQAogICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGRvbWFpbiBjb21iaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGRvbWFpbiBjb21iaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqLwogICAgIHB1YmxpYyBTdWJqZWN0IGdldFN1YmplY3QoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKQEAgLTQ4LDYgKzY1LDIyIEBACiAgICAgICAgIHJldHVybiBzdWJqZWN0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE1lcmdlcyB0aGUge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IHdpdGggdGhlIHtAY29kZSBQcmluY2lwYWx9cworICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ViamVjdCBvZiB0aGlzIHtAY29kZSBTdWJqZWN0RG9tYWluQ29tYmluZXJ9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjdXJyZW50RG9tYWlucworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG9mCisgICAgICogICAgICAgICAgICB0aGUgY3VycmVudCB0aHJlYWQuIFRoZSBkb21haW5zIG11c3QgYmUgc29ydGVkIGFjY29yZGluZyB0bworICAgICAqICAgICAgICAgICAgdGhlIGV4ZWN1dGlvbiBvcmRlciwgdGhlIG1vc3QgcmVjZW50IHJlc2lkaW5nIGF0IHRoZQorICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nLgorICAgICAqIEBwYXJhbSBhc3NpZ25lZERvbWFpbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn1zIGZyb20gdGhlIHBhcmVudCB0aHJlYWQgYmFzZWQgb24KKyAgICAgKiAgICAgICAgICAgIGNvZGUgc291cmNlIGFuZCBzaWduZXJzLgorICAgICAqIEByZXR1cm4gYSBzaW5nbGUge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IGFycmF5IGNvbXB1dGVkIGZyb20gdGhlIHR3bworICAgICAqICAgICAgICAgcHJvdmlkZWQgYXJyYXlzLCBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHNlZSBQcm90ZWN0aW9uRG9tYWluCisgICAgICovCiAgICAgcHVibGljIFByb3RlY3Rpb25Eb21haW5bXSBjb21iaW5lKFByb3RlY3Rpb25Eb21haW5bXSBjdXJyZW50RG9tYWlucywKICAgICAgICAgICAgIFByb3RlY3Rpb25Eb21haW5bXSBhc3NpZ25lZERvbWFpbnMpIHsKICAgICAgICAgLy8gZ2V0IGFycmF5IGxlbmd0aCBmb3IgY29tYmluaW5nIHByb3RlY3Rpb24gZG9tYWlucwpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svQ2FsbGJhY2suamF2YSBiL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2NhbGxiYWNrL0NhbGxiYWNrLmphdmEKaW5kZXggMTNlNzU3NC4uNmNmNDZiOCAxMDA2NDQKLS0tIGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svQ2FsbGJhY2suamF2YQorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9jYWxsYmFjay9DYWxsYmFjay5qYXZhCkBAIC0xNyw1ICsxNywxMSBAQAogCiBwYWNrYWdlIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2s7CiAKKy8qKgorICogRGVmaW5lcyBhbiBlbXB0eSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIHtAY29kZSBDYWxsYmFja31zIHVzZWQgZHVyaW5nCisgKiBhdXRoZW50aWNhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgewogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2NhbGxiYWNrL0NhbGxiYWNrSGFuZGxlci5qYXZhIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svQ2FsbGJhY2tIYW5kbGVyLmphdmEKaW5kZXggY2VhZWJhNC4uOWNhMzQzNCAxMDA2NDQKLS0tIGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svQ2FsbGJhY2tIYW5kbGVyLmphdmEKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svQ2FsbGJhY2tIYW5kbGVyLmphdmEKQEAgLTE3LDggKzE3LDM4IEBACiAKIHBhY2thZ2UgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjazsKIAorLyoqCisgKiBOZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2FudCB0byBoYW5kbGUgYXV0aGVudGljYXRpb24KKyAqIHtAbGluayBDYWxsYmFja31zLiBBIHNpbmdsZSBtZXRob2Qge0BsaW5rICNoYW5kbGUoQ2FsbGJhY2tbXSl9IG11c3QgYmUKKyAqIHByb3ZpZGVkIHRoYXQgY2hlY2tzIHRoZSB0eXBlIG9mIHRoZSBpbmNvbWluZyB7QGNvZGUgQ2FsbGJhY2t9cyBhbmQgcmVhY3RzCisgKiBhY2NvcmRpbmdseS4ge0Bjb2RlIENhbGxiYWNrSGFuZGxlcn1zIGNhbiBiZSBpbnN0YWxsZWQgcGVyIGFwcGxpY2F0aW9uLiBJdCBpcworICogYWxzbyBwb3NzaWJsZSB0byBjb25maWd1cmUgYSBzeXN0ZW0tZGVmYXVsdCB7QGNvZGUgQ2FsbGJhY2tIYW5kbGVyfSBieQorICogc2V0dGluZyB0aGUge0Bjb2RlIGF1dGgubG9naW4uZGVmYXVsdENhbGxiYWNrSGFuZGxlcn0gcHJvcGVydHkgaW4gdGhlCisgKiBzdGFuZGFyZCB7QGNvZGUgc2VjdXJpdHkucHJvcGVydGllc30gZmlsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2tIYW5kbGVyIHsKIAorICAgIC8qKgorICAgICAqIEhhbmRsZXMgdGhlIGFjdHVhbCB7QGxpbmsgQ2FsbGJhY2t9LiBBIHtAY29kZSBDYWxsYmFja0hhbmRsZXJ9IG5lZWRzIHRvCisgICAgICogaW1wbGVtZW50IHRoaXMgbWV0aG9kLiBJbiB0aGUgbWV0aG9kLCBpdCBpcyBmcmVlIHRvIHNlbGVjdCB3aGljaCB7QGNvZGUKKyAgICAgKiBDYWxsYmFja31zIGl0IGFjdHVhbGx5IHdhbnRzIHRvIGhhbmRsZSBhbmQgaW4gd2hpY2ggd2F5LiBGb3IgZXhhbXBsZSwgYQorICAgICAqIGNvbnNvbGUtYmFzZWQge0Bjb2RlIENhbGxiYWNrSGFuZGxlcn0gbWlnaHQgY2hvb3NlIHRvIHNlcXVlbnRpYWxseSBhc2sKKyAgICAgKiB0aGUgdXNlciBmb3IgbG9naW4gYW5kIHBhc3N3b3JkLCBpZiBpdCBpbXBsZW1lbnRzIHRoZXNlIHtAY29kZSBDYWxsYmFja30KKyAgICAgKiBzLCB3aGVyZWFzIGEgR1VJLWJhc2VkIG9uZSBtaWdodCBvcGVuIGEgc2luZ2xlIGRpYWxvZyB3aW5kb3cgZm9yIGJvdGgKKyAgICAgKiB2YWx1ZXMuIElmIGEge0Bjb2RlIENhbGxiYWNrSGFuZGxlcn0gaXMgbm90IGFibGUgdG8gaGFuZGxlIGEgc3BlY2lmaWMKKyAgICAgKiB7QGNvZGUgQ2FsbGJhY2t9LCBpdCBuZWVkcyB0byB0aHJvdyBhbgorICAgICAqIHtAbGluayBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2tzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Yge0Bjb2RlIENhbGxiYWNrfXMgdGhhdCBuZWVkIGhhbmRsaW5nCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIHJlbGF0ZWQgZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBDYWxsYmFja0hhbmRsZXJ9IGlzIG5vdCBhYmxlIHRvIGhhbmRsZSBhCisgICAgICogICAgICAgICAgICAgc3BlY2lmaWMge0Bjb2RlIENhbGxiYWNrfQorICAgICAqLwogICAgIHZvaWQgaGFuZGxlKENhbGxiYWNrW10gY2FsbGJhY2tzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbjsKIAogfQpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svUGFzc3dvcmRDYWxsYmFjay5qYXZhIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svUGFzc3dvcmRDYWxsYmFjay5qYXZhCmluZGV4IGU4MTkxYmYuLjAwMDIwZmUgMTAwNjQ0Ci0tLSBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2NhbGxiYWNrL1Bhc3N3b3JkQ2FsbGJhY2suamF2YQorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9jYWxsYmFjay9QYXNzd29yZENhbGxiYWNrLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXV0aC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKKy8qKgorICogSXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEge0BsaW5rIENhbGxiYWNrSGFuZGxlcn0gdG8gcmV0cmlldmUgYSBwYXNzd29yZAorICogd2hlbiBuZWVkZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgUGFzc3dvcmRDYWxsYmFjayBpbXBsZW1lbnRzIENhbGxiYWNrLCBTZXJpYWxpemFibGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjI2NzQyMjY0NzQ1NDkwOTkyNkw7CkBAIC0zOSwyMCArNDUsNDkgQEAKICAgICAgICAgdGhpcy5wcm9tcHQgPSBwcm9tcHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUGFzc3dvcmRDYWxsYmFja30gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHByb21wdAorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyCisgICAgICogQHBhcmFtIGVjaG9PbgorICAgICAqICAgICAgICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB1c2VyIGlucHV0IHNob3VsZCBiZSBlY2hvZWQKKyAgICAgKi8KICAgICBwdWJsaWMgUGFzc3dvcmRDYWxsYmFjayhTdHJpbmcgcHJvbXB0LCBib29sZWFuIGVjaG9PbikgewogICAgICAgICBzdXBlcigpOwogICAgICAgICBzZXRQcm9tcHQocHJvbXB0KTsKICAgICAgICAgdGhpcy5lY2hvT24gPSBlY2hvT247CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvbXB0IHRoYXQgd2FzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoaXMge0Bjb2RlCisgICAgICogUGFzc3dvcmRDYWxsYmFja30KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9tcHQKKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFByb21wdCgpIHsKICAgICAgICAgcmV0dXJuIHByb21wdDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgUGFzc3dvcmRDYWxsYmFja30gZXhwZWN0cyB1c2VyIGlucHV0IHRvIGJlCisgICAgICogZWNob2VkLCB3aGljaCBpcyBzcGVjaWZpZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIChhbmQgb25seSBpZikgdXNlciBpbnB1dCBzaG91bGQgYmUgZWNob2VkCisgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFY2hvT24oKSB7CiAgICAgICAgIHJldHVybiBlY2hvT247CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGFzc3dvcmQuIFRoZSB7QGxpbmsgQ2FsbGJhY2tIYW5kbGVyfSB0aGF0IHBlcmZvcm1zIHRoZSBhY3R1YWwKKyAgICAgKiBwcm92aXNpb25pbmcgb3IgaW5wdXQgb2YgdGhlIHBhc3N3b3JkIG5lZWRzIHRvIGNhbGwgdGhpcyBtZXRob2QgdG8gaGFuZAorICAgICAqIGJhY2sgdGhlIHBhc3N3b3JkIHRvIHRoZSBzZWN1cml0eSBzZXJ2aWNlIHRoYXQgcmVxdWVzdGVkIGl0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkLiBBIGNvcHkgb2YgdGhpcyBpcyBzdG9yZWQsIHNvIHN1YnNlcXVlbnQgY2hhbmdlcworICAgICAqICAgICAgICAgICAgdG8gdGhlIGlucHV0IGFycmF5IGRvIG5vdCBhZmZlY3QgdGhlIHtAY29kZSBQYXNzd29yZENhbGxiYWNrfS4KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChjaGFyW10gcGFzc3dvcmQpIHsKICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpIHsKICAgICAgICAgICAgIHRoaXMuaW5wdXRQYXNzd29yZCA9IHBhc3N3b3JkOwpAQCAtNjIsNiArOTcsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhc3N3b3JkLiBUaGUgc2VjdXJpdHkgc2VydmljZSB0aGF0IG5lZWRzIHRoZSBwYXNzd29yZAorICAgICAqIHVzdWFsbHkgY2FsbHMgdGhpcyBtZXRob2Qgb25jZSB0aGUge0BsaW5rIENhbGxiYWNrSGFuZGxlcn0gaGFzIGZpbmlzaGVkCisgICAgICogaXRzIHdvcmsuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcGFzc3dvcmQuIEEgY29weSBvZiB0aGUgaW50ZXJuYWwgcGFzc3dvcmQgaXMgY3JlYXRlZCBhbmQKKyAgICAgKiAgICAgICAgIHJldHVybmVkLCBzbyBzdWJzZXF1ZW50IGNoYW5nZXMgdG8gdGhlIGludGVybmFsIHBhc3N3b3JkIGRvIG5vdAorICAgICAqICAgICAgICAgYWZmZWN0IHRoZSByZXN1bHQuCisgICAgICovCiAgICAgcHVibGljIGNoYXJbXSBnZXRQYXNzd29yZCgpIHsKICAgICAgICAgaWYgKGlucHV0UGFzc3dvcmQgIT0gbnVsbCkgewogICAgICAgICAgICAgY2hhcltdIHRtcCA9IG5ldyBjaGFyW2lucHV0UGFzc3dvcmQubGVuZ3RoXTsKQEAgLTcxLDYgKzExNSw5IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgcGFzc3dvcmQgc3RvcmVkIGluIHRoaXMge0Bjb2RlIFBhc3N3b3JkQ2FsbGJhY2t9LgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyUGFzc3dvcmQoKSB7CiAgICAgICAgIGlmIChpbnB1dFBhc3N3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgIEFycmF5cy5maWxsKGlucHV0UGFzc3dvcmQsICdcdTAwMDAnKTsKZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2NhbGxiYWNrL1Vuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24uamF2YSBiL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2NhbGxiYWNrL1Vuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24uamF2YQppbmRleCBlODE0Nzc0Li5kNDBmZjQ1IDEwMDY0NAotLS0gYS9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9jYWxsYmFjay9VbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uLmphdmEKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbi5qYXZhCkBAIC0xNywyMiArMTcsNDkgQEAKIAogcGFja2FnZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrOwogCisvKioKKyAqIFRocm93biB3aGVuIGEge0BsaW5rIENhbGxiYWNrSGFuZGxlcn0gZG9lcyBub3Qgc3VwcG9ydCBhIHBhcnRpY3VsYXIge0BsaW5rCisgKiBDYWxsYmFja30uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjg3MzU1NjMyNzY1NTY2NjgzOUw7CiAKICAgICBwcml2YXRlIENhbGxiYWNrIGNhbGxiYWNrOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGluaXRpYWxpemVzIGl0IHdpdGgganVzdCB0aGUKKyAgICAgKiB1bnN1cHBvcnRlZCB7QGNvZGUgQ2FsbGJhY2t9LCBidXQgbm8gZXJyb3IgbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsbGJhY2t9CisgICAgICovCiAgICAgcHVibGljIFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24oQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIGJvdGggdGhlCisgICAgICogdW5zdXBwb3J0ZWQge0Bjb2RlIENhbGxiYWNrfSBhbmQgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsbGJhY2t9CisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICovCiAgICAgcHVibGljIFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24oQ2FsbGJhY2sgY2FsbGJhY2ssIFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOwogICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5zdXBwb3J0ZWQge0Bjb2RlIENhbGxiYWNrfSB0aGF0IHRyaWdnZXJlZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2FsbGJhY2t9CisgICAgICovCiAgICAgcHVibGljIENhbGxiYWNrIGdldENhbGxiYWNrKCkgewogICAgICAgICByZXR1cm4gY2FsbGJhY2s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svcGFja2FnZS5odG1sIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvY2FsbGJhY2svcGFja2FnZS5odG1sCmluZGV4IDUwMDczYzcuLjU0NDZhYjggMTAwNjQ0Ci0tLSBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2NhbGxiYWNrL3BhY2thZ2UuaHRtbAorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9jYWxsYmFjay9wYWNrYWdlLmh0bWwKQEAgLTUsMTEgKzUsMTggQEAKIDxodG1sPgogPGJvZHk+CiA8cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyBhbGwgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgbmVlZGVkIHRvIGludGVyYWN0IHdpdGggdGhlIGFwcGxpY2F0aW9uCi1pbiBvcmRlciB0byBleGVjdXRlIHRoZSBhdXRoZW50aWZpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIHByb2Nlc3Nlcy4KLUl0IGlzIGEgY2xhc3NpY2FsIGNhbGxiYWNrIG1lY2hhbmlzbTogb25lIHJldHJpZXZlcyBpbmZvcm1hdGlvbiAoaS5lLiBmb3IgYXV0aGVudGlmaWNhdGlvbgotcHVycG9zZXMpIGFuZCBvbmUgZGlzcGxheSBzb21lIG1lc3NhZ2VzIChmb3IgZXhhbXBsZSBlcnJvciBtZXNzYWdlcykuCi0KK1RoaXMgcGFja2FnZSBwcm92aWRlcyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIG5lZWRlZCB0byBpbnRlcmFjdCB3aXRoIHRoZQorYXBwbGljYXRpb24gaW4gb3JkZXIgdG8gZXhlY3V0ZSB0aGUgYXV0aGVudGlmaWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbgorcHJvY2Vzc2VzLiBJdCBpcyBhIGNsYXNzaWNhbCBjYWxsYmFjayBtZWNoYW5pc206IG9uZSByZXRyaWV2ZXMgaW5mb3JtYXRpb24gKGkuZS4KK2ZvciBhdXRoZW50aWZpY2F0aW9uIHB1cnBvc2VzKSBhbmQgb25lIGRpc3BsYXkgc29tZSBtZXNzYWdlcyAoZm9yIGV4YW1wbGUgZXJyb3IKK21lc3NhZ2VzKS4KIDwvcD4KKzxwPgorTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgcGFja2FnZSBpcyBub3QgY29tcGxldGUsIHRoYXQgaXMsCitub3QgY29tcGF0aWJsZSB3aXRoIGRlc2t0b3AgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgorSXQgY29udGFpbnMgb25seSB3aGF0IHdhcyBuZWVkZWQgdG8gbWFrZSB0aGUgY29tcGlsZXIgaGFwcHksIHRoYXQgaXMsIGNsYXNzZXMKK3JlcXVpcmVkIGJ5IG90aGVyIHBhY2thZ2VzLiAKKzwvcD4KK0BzaW5jZSBBbmRyb2lkIDEuMAogPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2xvZ2luL0xvZ2luRXhjZXB0aW9uLmphdmEgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9sb2dpbi9Mb2dpbkV4Y2VwdGlvbi5qYXZhCmluZGV4IDk5M2Q1YzEuLmExZDZlYzAgMTAwNjQ0Ci0tLSBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2xvZ2luL0xvZ2luRXhjZXB0aW9uLmphdmEKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvbG9naW4vTG9naW5FeGNlcHRpb24uamF2YQpAQCAtMTksMTQgKzE5LDI3IEBACiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKIAorLyoqCisgKiBCYXNlIGNsYXNzIGZvciBleGNlcHRpb25zIHRoYXQgYXJlIHRocm93biB3aGVuIGEgbG9naW4gZXJyb3Igb2NjdXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIExvZ2luRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00Njc5MDkxNjI0MDM1MjMyNDg4TDsKIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICAgICAqLwogICAgIHB1YmxpYyBMb2dpbkV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCBhIGdpdmVuIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KICAgICBwdWJsaWMgTG9naW5FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvbG9naW4vcGFja2FnZS5odG1sIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvbG9naW4vcGFja2FnZS5odG1sCmluZGV4IGY4ZDdhYjkuLjM4MmI0ODcgMTAwNjQ0Ci0tLSBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL2xvZ2luL3BhY2thZ2UuaHRtbAorKysgYi9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9sb2dpbi9wYWNrYWdlLmh0bWwKQEAgLTUsMTEgKzUsMTYgQEAKIDxodG1sPgogPGJvZHk+CiA8cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHBsdWdnYWJsZSBhbmQgc3RhY2thYmxlIGF1dGhlbnRpY2F0aW9uIHN5c3RlbSBiYXNlZCBvbiBpZGVhcyBhbmQgY29uY2VwdHMKLWZyb20gdGhlIFVuaXgtUEFNIG1vZHVsZS4KLU5ldyBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGNhbiBiZSBzcGVjaWZpZWQgc2ltcGx5IHZpYSBhIG5ldyBMb2dpbk1vZHVsZSBhbmQgY2hhaW5lZCB0b2dldGhlcgotd2l0aCB0aGUgZXhpc3Rpbmcgb25lcy4KLQorVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgcGx1Z2dhYmxlIGFuZCBzdGFja2FibGUgYXV0aGVudGljYXRpb24gc3lzdGVtIGJhc2VkIG9uCitpZGVhcyBhbmQgY29uY2VwdHMgZnJvbSB0aGUgVW5peC1QQU0gbW9kdWxlLiBOZXcgYXV0aGVudGljYXRpb24gbWV0aG9kcyBjYW4gYmUKK3NwZWNpZmllZCBzaW1wbHkgdmlhIGEgbmV3IExvZ2luTW9kdWxlIGFuZCBjaGFpbmVkIHRvZ2V0aGVyIHdpdGggdGhlIGV4aXN0aW5nCitvbmVzLgogPC9wPgorTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgcGFja2FnZSBpcyBub3QgY29tcGxldGUsIHRoYXQgaXMsCitub3QgY29tcGF0aWJsZSB3aXRoIGRlc2t0b3AgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgorSXQgY29udGFpbnMgb25seSB3aGF0IHdhcyBuZWVkZWQgdG8gbWFrZSB0aGUgY29tcGlsZXIgaGFwcHksIHRoYXQgaXMsIGNsYXNzZXMKK3JlcXVpcmVkIGJ5IG90aGVyIHBhY2thZ2VzLiAKKzwvcD4KK0BzaW5jZSBBbmRyb2lkIDEuMAogPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL3BhY2thZ2UuaHRtbCBiL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL3BhY2thZ2UuaHRtbAppbmRleCAzZGQ1MzQ0Li4yYmNhMmRiIDEwMDY0NAotLS0gYS9hdXRoL3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvYXV0aC9wYWNrYWdlLmh0bWwKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgvcGFja2FnZS5odG1sCkBAIC01LDE0ICs1LDE0IEBACiA8aHRtbD4KIDxib2R5PgogPHA+Ci1UaGlzIHBhY2thZ2UgcHJvdmlkZXMgYWxsIHRoZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIG5lZWRlZCB0byBpbXBsZW1lbmV0IGFuZCBwcm9ncmFtCitUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgbmVlZGVkIHRvIGltcGxlbWVuZXQgYW5kIHByb2dyYW0KIGRpZmZlcmVudCBtZXRob2RzIG9mIHVzZXJzJyBhdXRoZW50aWZpY2F0aW9uIGFuZCByb2xlIGJhc2VkIHVzZXJzJyBhdXRob3JpemF0aW9uLgotSXQgaW50ZWdyYXRlcyB0aGUgcHJldmlvdXMgc2VwYXJhdGVkIEpBQVMgcGFja2FnZSBpbnRvIHRoZSBKYXZhIFNESy4KIAogQWxsIHN1YmplY3RzJyBhdXRoZW50aWZpY2F0aW9uIGFuZCByb2xlIGJhc2VkIGF1dGhvcml6YXRpb24gYXJlIHN0cm9uZ2x5IGNvdXBsZWQgd2l0aAotdGhlIGphdmEuc2VjdXJpdHkgZmlsZSB0aGF0LCBhcyBhbHdheXMsIGlzIHRoZSB1bHRpbWF0ZSBhcmJpdGVyIG9mIGFsbCAgbWF0dGVycyBzZWN1cmUgaW4gSmF2YS4KLUZvciBleGFtcGxlIHRoZSBjbGFzcyB7QGxpbmsgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0RG9tYWluQ29tYmluZXJ9IHVwZGF0ZXMgdGhlCit0aGUgamF2YS5zZWN1cml0eSBmaWxlIHRoYXQsIGFzIGFsd2F5cywgaXMgdGhlIHVsdGltYXRlIGFyYml0ZXIgb2YgYWxsIG1hdHRlcnMgc2VjdXJlIGluIEFuZHJvaWQuCitGb3IgZXhhbXBsZSB0aGUgY2xhc3MgPGk+amF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0RG9tYWluQ29tYmluZXI8L2k+IHVwZGF0ZXMgdGhlCiBQcm90ZWN0aW9uRG9tYWlucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdHVhbCBjbGFzcyB3aXRoIHRoZSBzdWJqZWN0cyBkZWZpbmVkIHRoZXJlaW4uCiA8L3A+CitAc2luY2UgQW5kcm9pZCAxLjAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL3g1MDAvWDUwMFByaW5jaXBhbC5qYXZhIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgveDUwMC9YNTAwUHJpbmNpcGFsLmphdmEKaW5kZXggYTE2OGRhZS4uZmE5ZGZlOCAxMDA2NDQKLS0tIGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgveDUwMC9YNTAwUHJpbmNpcGFsLmphdmEKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgveDUwMC9YNTAwUHJpbmNpcGFsLmphdmEKQEAgLTI3LDE5ICsyNyw1MSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hdXRoLmludGVybmFsLm5scy5NZXNzYWdlczsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lOwogCisvKioKKyAqIFJlcHJlc2VudHMgYW4gWC41MDAgcHJpbmNpcGFsLCB3aGljaCBob2xkcyB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIG9mIHNvbWUKKyAqIG5ldHdvcmsgZW50aXR5LiBBbiBleGFtcGxlIG9mIGEgZGlzdGluZ3Vpc2hlZCBuYW1lIGlzIHtAY29kZSAiTz1Hb29nbGUsCisgKiBPVT1BbmRyb2lkLCBDPVVTIn0uIFRoZSBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIGZyb20gYSBieXRlIHJlcHJlc2VudGF0aW9uCisgKiBvZiBhbiBvYmplY3QgaWRlbnRpZmllciAoT0lEKSwgYW4gQVNOLjEgREVSLWVuY29kZWQgdmVyc2lvbiwgb3IgYSBzaW1wbGUKKyAqIHN0cmluZyBob2xkaW5nIHRoZSBkaXN0aW5ndWlzaGVkIG5hbWUuIFRoZSByZXByZXNlbnRhdGlvbnMgbXVzdCBmb2xsb3cgZWl0aGVyCisgKiBSRkMgMjI1MywgUkZDIDE3NzksIG9yIFJGQzI0NTkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgZmluYWwgY2xhc3MgWDUwMFByaW5jaXBhbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgUHJpbmNpcGFsIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MDA0NjMzNDgxMTEzNDU3MjFMOwogCisgICAgLyoqCisgICAgICogRGVmaW5lcyBhIGNvbnN0YW50IGZvciB0aGUgY2Fub25pY2FsIHN0cmluZyBmb3JtYXQgb2YgZGlzdGluZ3Vpc2hlZAorICAgICAqIG5hbWVzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTk9OSUNBTCA9ICJDQU5PTklDQUwiOyAvLyROT04tTkxTLTEkCiAKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGEgY29uc3RhbnQgZm9yIHRoZSBSRkMgMTc3OSBzdHJpbmcgZm9ybWF0IG9mIGRpc3Rpbmd1aXNoZWQKKyAgICAgKiBuYW1lcy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRkMxNzc5ID0gIlJGQzE3NzkiOyAvLyROT04tTkxTLTEkCiAKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGEgY29uc3RhbnQgZm9yIHRoZSBSRkMgMjI1MyBzdHJpbmcgZm9ybWF0IG9mIGRpc3Rpbmd1aXNoZWQKKyAgICAgKiBuYW1lcy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRkMyMjUzID0gIlJGQzIyNTMiOyAvLyROT04tTkxTLTEkCiAKICAgICAvL0Rpc3Rpbmd1aXNoZWQgTmFtZQogICAgIHByaXZhdGUgdHJhbnNpZW50IE5hbWUgZG47CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFg1MDBQcmluY2lwYWwgZnJvbSBhIGdpdmVuIEFTTi4xIERFUiBlbmNvZGluZyBvZiBhCisgICAgICogZGlzdGluZ3Vpc2hlZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgQVNOLjEgREVSLWVuY29kZWQgZGlzdGluZ3Vpc2hlZCBuYW1lCisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgQVNOLjEgREVSLWVuY29kZWQgZGlzdGluZ3Vpc2hlZCBuYW1lIGlzIGluY29ycmVjdAorICAgICAqLwogICAgIHB1YmxpYyBYNTAwUHJpbmNpcGFsKGJ5dGVbXSBuYW1lKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKQEAgLTU2LDYgKzg4LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFg1MDBQcmluY2lwYWwgZnJvbSBhIGdpdmVuIEFTTi4xIERFUiBlbmNvZGluZyBvZiBhCisgICAgICogZGlzdGluZ3Vpc2hlZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbgorICAgICAqICAgICAgICAgICAgYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBob2xkaW5nIHRoZSBBU04uMSBERVItZW5jb2RlZAorICAgICAqICAgICAgICAgICAgZGlzdGluZ3Vpc2hlZCBuYW1lCisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgQVNOLjEgREVSLWVuY29kZWQgZGlzdGluZ3Vpc2hlZCBuYW1lIGlzIGluY29ycmVjdAorICAgICAqLwogICAgIHB1YmxpYyBYNTAwUHJpbmNpcGFsKElucHV0U3RyZWFtIGluKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CkBAIC03Miw2ICsxMTUsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgWDUwMFByaW5jaXBhbCBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIGlzCisgICAgICogICAgICAgICAgICAgaW5jb3JyZWN0CisgICAgICovCiAgICAgcHVibGljIFg1MDBQcmluY2lwYWwoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewpAQCAtOTksNiArMTUzLDEyIEBACiAgICAgICAgIHJldHVybiBkbi5nZXROYW1lKENBTk9OSUNBTCkuZXF1YWxzKHByaW5jaXBhbC5kbi5nZXROYW1lKENBTk9OSUNBTCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gQVNOLjEgREVSLWVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZQorICAgICAqIGNvbnRhaW5lZCBpbiB0aGlzIFguNTAwIHByaW5jaXBhbC4gCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgQVNOLjEgREVSLWVuY29kZWQgcmVwcmVzZW50YXRpb24KKyAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CiAgICAgICAgIGJ5dGVbXSBzcmMgPSBkbi5nZXRFbmNvZGVkKCk7CiAgICAgICAgIGJ5dGVbXSBkc3QgPSBuZXcgYnl0ZVtzcmMubGVuZ3RoXTsKQEAgLTEwNiwxMCArMTY2LDM1IEBACiAgICAgICAgIHJldHVybiBkc3Q7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIAorICAgICAqIGNvbnRhaW5lZCBpbiB0aGlzIFguNTAwIHByaW5jaXBhbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBkbi5nZXROYW1lKFJGQzIyNTMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBjb250YWluZWQgaW4KKyAgICAgKiB0aGlzIFguNTAwIHByaW5jaXBhbC4gVGhlIGZvcm1hdCBvZiB0aGUgcmVwcmVzZW50YXRpb24gY2FuIGJlIGNob3Nlbi4KKyAgICAgKiBWYWxpZCBhcmd1bWVudHMgYXJlIHtAbGluayAjUkZDMTc3OX0sIHtAbGluayAjUkZDMjI1M30sIGFuZAorICAgICAqIHtAbGluayAjQ0FOT05JQ0FMfS4gVGhlIHJlcHJlc2VudGF0aW9ucyBhcmUgc3BlY2lmaWVkIGluIFJGQyAxNzc5IGFuZCBSRkMKKyAgICAgKiAyMjUzLCByZXNwZWN0aXZlbHkuIFRoZSBjYW5vbmljYWwgZm9ybSBpcyBiYXNlZCBvbiBSRkMgMjI1MywgYnV0IGFkZHMKKyAgICAgKiBzb21lIGNhbm9uaWNhbGl6aW5nIG9wZXJhdGlvbnMgbGlrZSByZW1vdmluZyBsZWFkaW5nIGFuZCB0cmFpbGluZworICAgICAqIHdoaXRlc3BhY2UsIGxvd2VyLWNhc2luZyB0aGUgd2hvbGUgbmFtZSwgYW5kIGJyaW5naW5nIGl0IGludG8gYQorICAgICAqIG5vcm1hbGl6ZWQgVW5pY29kZSByZXByZXNlbnRhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHJlcHJlc2VudGF0aW9uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGZvcm1hdH0gYXJndW1lbnQgaXMgbm90IG9uZSBvZiB0aGUgdGhyZWUKKyAgICAgKiAgICAgICAgICAgICBtZW50aW9uZWQgYWJvdmUKKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoU3RyaW5nIGZvcm1hdCkgewogICAgICAgICByZXR1cm4gZG4uZ2V0TmFtZShmb3JtYXQpOwogICAgIH0KZGlmZiAtLWdpdCBhL2F1dGgvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9hdXRoL3g1MDAvcGFja2FnZS5odG1sIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgveDUwMC9wYWNrYWdlLmh0bWwKaW5kZXggM2E3MTYzZS4uNThkMjdhYyAxMDA2NDQKLS0tIGEvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgveDUwMC9wYWNrYWdlLmh0bWwKKysrIGIvYXV0aC9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2F1dGgveDUwMC9wYWNrYWdlLmh0bWwKQEAgLTUsMTQgKzUsMTQgQEAKIDxodG1sPgogPGJvZHk+CiA8cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyBhbGwgdGhlIGNsYXNzZXMgIG5lZWRlZCB0byBzdG9yZSBYLjUwMCBwcmluY2lwYWxzIGFuZCB0aGVpciBjcmVkZW50aWFscy4KLVRoZSBjbGFzcyB7QGxpbmsgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWx9IHJlcHJlc2VudHMgc3VjaCBhIHByaW5jaXBhbC4KLVNwZWNpZmljYWxseSwgWDUwMCBwcmluY2lwYWxzIGFyZSBkZWZpbmVkIGJ5IHN1Y2ggdG9rZW5zIChkaXN0aW5ndWlzaGVkIG5hbWVzKSBhcyBPPUdvb2dsZSwKLSBPVT1BbmRyb2lkLCBDPVVTLgotIFRoZSBjbGFzcyBhY2NlcHRzIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgZGlzdGluZ3Vpc2hlZCBuYW1lcyBkZWZpbmVkIGluIGJvdGgKLSBzcGVjaWZpY2F0aW9ucyBSRkMyMjUzIGFuZCAodGhlIG9sZGVyKSBSRkMxNzc5LiBPSUQgKE9iamVjdCBJZGVudGlmaWVycyB1c2VkIHRvIGVuY29kZSB3aXRoCi0gdGhlIEFTTi4xIHN0YW5kYXJkIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIG9mIGRpc3Rpbmd1aXNoZWQgbmFtZSwgYWxnb3JpdGhtIGV0Yy4pIG11c3QKLSBmb2xsb3cgdGhlIFJGQzI0NTkgc3BlY2lmaWNhdGlvbi4KK1RoaXMgcGFja2FnZSBwcm92aWRlcyBjbGFzc2VzIG5lZWRlZCB0byBzdG9yZSBYLjUwMCBwcmluY2lwYWxzIGFuZCB0aGVpcgorY3JlZGVudGlhbHMuCiA8L3A+CitOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwYWNrYWdlIGlzIG5vdCBjb21wbGV0ZSwgdGhhdCBpcywKK25vdCBjb21wYXRpYmxlIHdpdGggZGVza3RvcCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCitJdCBjb250YWlucyBvbmx5IHdoYXQgd2FzIG5lZWRlZCB0byBtYWtlIHRoZSBjb21waWxlciBoYXBweSwgdGhhdCBpcywgY2xhc3NlcworcmVxdWlyZWQgYnkgb3RoZXIgcGFja2FnZXMuIAorPC9wPgorQHNpbmNlIEFuZHJvaWQgMS4wCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9hdXRoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2F1dGgvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEgYi9hdXRoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2F1dGgvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKaW5kZXggMDcyMmU5OS4uNTExYWE3YSAxMDA2NDQKLS0tIGEvYXV0aC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hdXRoL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCisrKyBiL2F1dGgvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXV0aC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQpAQCAtMjEsNiArMjEsMTAgQEAKICAqIGlmIHRoaXMgdG9vbCBydW5zIGFnYWluLiBCZXR0ZXIgbWFrZSBjaGFuZ2VzIGluIHRoZSB0ZW1wbGF0ZSBmaWxlLgogICovCiAKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gUmVkdW5kYW50IGNvZGUgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm93IGNhbGxlZCBmcm9tIE1zZ0hlbHAuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmF1dGguaW50ZXJuYWwubmxzOwogCiAKQEAgLTMwLDggKzM0LDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uVk07CisvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZ0hlbHA7CisvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKIC8qKgogICogVGhpcyBjbGFzcyByZXRyaWV2ZXMgc3RyaW5ncyBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlIGFuZCByZXR1cm5zIHRoZW0sCkBAIC00OCw5ICs1MywxMSBAQAogICogCiAgKi8KIHB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0gICAgCisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1Jlc291cmNlID0KICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5hdXRoLmludGVybmFsLm5scy5tZXNzYWdlcyI7CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIGEgbWVzc2FnZSB3aGljaCBoYXMgbm8gYXJndW1lbnRzLgpAQCAtNjAsNyArNjcsOSBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2cpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjcsNiArMTM2LDEyIEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2csIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZywgYXJncyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gRHVwbGljYXRlIGNvZGUgd2FzIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgTXNnSGVscC4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCit9CmRpZmYgLS1naXQgYS9hd3Qta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9iZWFucy9JbmRleGVkUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvYmVhbnMvSW5kZXhlZFByb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ0YjJlCi0tLSAvZGV2L251bGwKKysrIGIvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvYmVhbnMvSW5kZXhlZFByb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgamF2YS5iZWFuczsKKworLyoqCisgKiBBIHR5cGUgb2Yge0BsaW5rIFByb3BlcnR5Q2hhbmdlRXZlbnR9IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gaW5kZXhlZCBwcm9wZXJ0eQorICogaGFzIGNoYW5nZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCitwdWJsaWMgY2xhc3MgSW5kZXhlZFByb3BlcnR5Q2hhbmdlRXZlbnQgZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZUV2ZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMjAyMjc0NDg0OTU4MDY4NzBMOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHByb3BlcnR5IGNoYW5nZWQgZXZlbnQgd2l0aCBhbiBpbmRpY2F0aW9uIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIGluZGV4LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VkIGJlYW4uCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYW5nZWQgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGluZGljYXRlIGFuCisgICAgICogICAgICAgICAgICB1bnNwZWNpZmllZCBzZXQgb2YgdGhlIHByb3BlcnRpZXMgaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlCisgICAgICogICAgICAgICAgICBwcmV2aW91cyB2YWx1ZSBpcyB1bmtub3duLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqICAgICAgICAgICAgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbmV3CisgICAgICogICAgICAgICAgICB2YWx1ZSBpcyB1bmtub3duLi4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIEluZGV4ZWRQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5zd2VyIHRoZSBpbmRleCBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZCBpbiB0aGlzIGV2ZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGVsZW1lbnQgaW5kZXguCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2F3dC1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YSBiL2F3dC1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNhZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGphdmEuYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CisKKy8qKgorICogQW4gZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIGNvbnN0cmFpbnQgb3IgYSBib3VuZGFyeSBvZiBhIHByb3BlcnR5IGhhcworICogY2hhbmdlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzA0MjY5MzY4ODkzOTY0ODEyM0w7CisKKyAgICBTdHJpbmcgcHJvcGVydHlOYW1lOworCisgICAgT2JqZWN0IG9sZFZhbHVlOworCisgICAgT2JqZWN0IG5ld1ZhbHVlOworCisgICAgT2JqZWN0IHByb3BhZ2F0aW9uSWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYSBuZXcge0Bjb2RlIFByb3BlcnR5Q2hhbmdlRXZlbnR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VkIGJlYW4uCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYW5nZWQgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGluZGljYXRlIGFuCisgICAgICogICAgICAgICAgICB1bnNwZWNpZmllZCBzZXQgb2YgdGhlIHByb3BlcnRpZXMgaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlCisgICAgICogICAgICAgICAgICBwcmV2aW91cyB2YWx1ZSBpcyB1bmtub3duLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqICAgICAgICAgICAgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbmV3CisgICAgICogICAgICAgICAgICB2YWx1ZSBpcyB1bmtub3duLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBzdXBlcihzb3VyY2UpOworCisgICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgICAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7CisgICAgICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkLiBJZiBhbiB1bnNwZWNpZmllZCBzZXQKKyAgICAgKiBvZiBwcm9wZXJ0aWVzIGhhcyBjaGFuZ2VkIGl0IHJldHVybnMgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BhZ2F0aW9uSWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBzZWUgI2dldFByb3BhZ2F0aW9uSWQoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BhZ2F0aW9uSWQoT2JqZWN0IHByb3BhZ2F0aW9uSWQpIHsKKyAgICAgICAgdGhpcy5wcm9wYWdhdGlvbklkID0gcHJvcGFnYXRpb25JZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm9wYWdhdGlvbklkIG9iamVjdC4gVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gQmVhbnMKKyAgICAgKiAxLjAgZGVtYW5kcyB0aGF0IGEgbGlzdGVuZXIgcmVjZWl2aW5nIHRoaXMgcHJvcGVydHkgYW5kIHRoZW4gc2VuZGluZyBpdHMKKyAgICAgKiBvd24gUHJvcGVydHlDaGFuZ2VFdmVudCBzZXRzIHRoZSByZWNlaXZlZCBwcm9wYWdhdGlvbklkIG9uIHRoZSBuZXcKKyAgICAgKiBQcm9wZXJ0eUNoYW5nZUV2ZW50J3MgcHJvcGFnYXRpb25JZCBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wYWdhdGlvbklkIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BhZ2F0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBwcm9wYWdhdGlvbklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9sZCB2YWx1ZSB0aGF0IHRoZSBwcm9wZXJ0eSBoYWQuIElmIHRoZSBvbGQgdmFsdWUgaXMgdW5rbm93bgorICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBvbGQgcHJvcGVydHkgdmFsdWUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIHRoYXQgdGhlIHByb3BlcnR5IG5vdyBoYXMuIElmIHRoZSBuZXcgdmFsdWUgaXMKKyAgICAgKiB1bmtub3duIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBvbGQgcHJvcGVydHkgdmFsdWUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCkgeworICAgICAgICByZXR1cm4gbmV3VmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTU3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hd3Qta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBqYXZhLmJlYW5zOworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKy8qKgorICogQSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhbiBzdWJzY3JpYmUgd2l0aCBhIGV2ZW50IHNvdXJjZS4gV2hlbmV2ZXIgdGhhdAorICogc291cmNlIHJhaXNlcyBhIFByb3BlcnR5Q2hhbmdlRXZlbnQgdGhpcyBsaXN0ZW5lciB3aWxsIGdldCBub3RpZmllZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBiZWFuIGNhbGxzIHRoaXMgbWV0aG9kIHdoZW4gYW4gZXZlbnQgaXMgcmFpc2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBQcm9wZXJ0eUNoYW5nZUV2ZW50fSBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIG5hbWUKKyAgICAgKiAgICAgICAgICAgIGFuZCB0aGUgb2xkIGFuZCBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9hd3Qta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkuamF2YSBiL2F3dC1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyN2U0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hd3Qta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGphdmEuYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lclByb3h5OworCisvKioKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpc3RlbmVyIHByb3h5IGp1c3QgZGVsZWdhdGVzIHRoZSByZWNlaXZlZCBldmVudHMKKyAqIHRvIGl0cyBsaXN0ZW5lci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkgZXh0ZW5kcyBFdmVudExpc3RlbmVyUHJveHkgaW1wbGVtZW50cworICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKKworICAgIFN0cmluZyBwcm9wZXJ0eU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGxpc3RlbmVyIHByb3h5IHRoYXQgYXNzb2NpYXRlcyBhIGxpc3RlbmVyIHdpdGggYSBwcm9wZXJ0eQorICAgICAqIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gZGVsZWdhdGUgaW5jb21pbmcgZXZlbnRzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkoU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3VwZXIobGlzdGVuZXIpOworICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaXN0ZW5lciBwcm94eS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBnZXRMaXN0ZW5lcigpOworICAgICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZShldmVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VTdXBwb3J0LmphdmEgYi9hd3Qta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI1ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw1MDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgamF2YS5iZWFuczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGhpcyB1dGlsaXR5IGNsYXNzICAKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjQwMTI1Mzc3Mzc3OTk1MTgwM2w7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3Qgc291cmNlQmVhbjsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KCk7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PgorICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oKTsKKworICAgIC8vIGZpZWxkcyBmb3Igc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5CisgICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PiBjaGlsZHJlbjsKKworICAgIHByaXZhdGUgT2JqZWN0IHNvdXJjZTsKKworICAgIHByaXZhdGUgaW50IHByb3BlcnR5Q2hhbmdlU3VwcG9ydFNlcmlhbGl6ZWREYXRhVmVyc2lvbiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIHRoYXQgdXNlcyB0aGUgc291cmNlIGJlYW4gYXMgc291cmNlIGZvciBhbnkgZXZlbnQuCisgICAgICogCisgICAgICogQHBhcmFtIHNvdXJjZUJlYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBiZWFuIHVzZWQgYXMgc291cmNlIGZvciBhbGwgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoT2JqZWN0IHNvdXJjZUJlYW4pIHsKKyAgICAgICAgaWYgKHNvdXJjZUJlYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zb3VyY2VCZWFuID0gc291cmNlQmVhbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlcyBhIHtAbGluayBQcm9wZXJ0eUNoYW5nZUV2ZW50fSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvbGQgdmFsdWUgYW5kCisgICAgICogbmV3IHZhbHVlLiBBcyBzb3VyY2UgdGhlIGJlYW4gdXNlZCB0byBpbml0aWFsaXplIHRoaXMgaW5zdGFuY2UgaXMgdXNlZC4KKyAgICAgKiBJZiB0aGUgb2xkIHZhbHVlIGFuZCB0aGUgbmV3IHZhbHVlIGFyZSBub3QgbnVsbCBhbmQgZXF1YWwgdGhlIGV2ZW50IHdpbGwKKyAgICAgKiBub3QgYmUgZmlyZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLAorICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgICAgICBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZXMgYW4ge0BsaW5rIEluZGV4ZWRQcm9wZXJ0eUNoYW5nZUV2ZW50fSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvbGQKKyAgICAgKiB2YWx1ZSwgbmV3IHZhbHVlIGFuZCBpbmRleC4gQXMgc291cmNlIHRoZSBiZWFuIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogaW5zdGFuY2UgaXMgdXNlZC4gSWYgdGhlIG9sZCB2YWx1ZSBhbmQgdGhlIG5ldyB2YWx1ZSBhcmUgbm90IG51bGwgYW5kCisgICAgICogZXF1YWwgdGhlIGV2ZW50IHdpbGwgbm90IGJlIGZpcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4CisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlSW5kZXhlZFByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBpbmRleCwKKyAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisKKyAgICAgICAgLy8gbnVsbHMgYW5kIGVxdWFscyBjaGVjayBkb25lIGluIGRvRmlyZS4uLgorICAgICAgICBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShuZXcgSW5kZXhlZFByb3BlcnR5Q2hhbmdlRXZlbnQoc291cmNlQmVhbiwKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBzcGVjaWZpYyBwcm9wZXJ0eS4gVGhpcyBvbmx5IGhhcHBlbnMgaWYgaXQKKyAgICAgKiB3YXMgcmVnaXN0ZXJlZCB0byB0aGlzIHByb3BlcnR5LiBOb3RoaW5nIGhhcHBlbnMgaWYgaXQgd2FzIG5vdAorICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHByb3BlcnR5IG9yIGlmIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBsaXN0ZW5lciBpcworICAgICAqIG51bGwuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdGhlIGxpc3RlbmVyIGlzIGxpc3RlbmluZyB0bworICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmICgocHJvcGVydHlOYW1lICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgeworICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7CisKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxpc3RlbmVyIHRvIGEgc3BlY2lmaWMgcHJvcGVydHkuIE5vdGhpbmcgaGFwcGVucyBpZiB0aGUgcHJvcGVydHkKKyAgICAgKiBuYW1lIG9yIHRoZSBsaXN0ZW5lciBpcyBudWxsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlZ2lzdGVyIGZvciB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmICgobGlzdGVuZXIgIT0gbnVsbCkgJiYgKHByb3BlcnR5TmFtZSAhPSBudWxsKSkgeworICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7CisKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMucHV0KHByb3BlcnR5TmFtZSwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUkkgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5IHByb3h5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIGxpc3RlbmVyOworCisgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KAorICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkuZ2V0UHJvcGVydHlOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgcHJveHkuZ2V0TGlzdGVuZXIoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIHRoYXQgcmVnaXN0ZXJlZCB0byB0aGUgcHJvcGVydHkgd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBuYW1lLiBJZiB0aGUgcHJvcGVydHkgbmFtZSBpcyBudWxsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBsaXN0ZW5lcnMgc2hvdWxkIGJlIHJldHVybmVkCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgbGlzdGVuZXJzIHRvIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKAorICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IG51bGw7CisKKyAgICAgICAgaWYgKHByb3BlcnR5TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGxpc3RlbmVycyA9PSBudWxsKSA/IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10ge30KKyAgICAgICAgICAgICAgICA6IGxpc3RlbmVycy50b0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlIG9mIGEgYm9vbGVhbiBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUKKyAgICAgKiBvbGQgdmFsdWUgYW5kIHRoZSBuZXcgdmFsdWUgYXJlIG5vdCBudWxsIGFuZCBlcXVhbCB0aGUgZXZlbnQgd2lsbCBub3QgYmUKKyAgICAgKiBmaXJlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCB2YWx1ZQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLAorICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSkgeworICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gY3JlYXRlUHJvcGVydHlDaGFuZ2VFdmVudChwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKyAgICAgICAgZG9GaXJlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlIG9mIGEgYm9vbGVhbiBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUKKyAgICAgKiBvbGQgdmFsdWUgYW5kIHRoZSBuZXcgdmFsdWUgYXJlIG5vdCBudWxsIGFuZCBlcXVhbCB0aGUgZXZlbnQgd2lsbCBub3QgYmUKKyAgICAgKiBmaXJlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5CisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHZhbHVlCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgaW5kZXgsCisgICAgICAgICAgICBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7CisKKyAgICAgICAgaWYgKG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICBmaXJlSW5kZXhlZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgaW5kZXgsIEJvb2xlYW4KKyAgICAgICAgICAgICAgICAgICAgLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlIG9mIGFuIGludGVnZXIgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYKKyAgICAgKiB0aGUgb2xkIHZhbHVlIGFuZCB0aGUgbmV3IHZhbHVlIGFyZSBub3QgbnVsbCBhbmQgZXF1YWwgdGhlIGV2ZW50IHdpbGwgbm90CisgICAgICogYmUgZmlyZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbGQgdmFsdWUKKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLAorICAgICAgICAgICAgaW50IG5ld1ZhbHVlKSB7CisgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgICAgICBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZXMgYSBwcm9wZXJ0eSBjaGFuZ2Ugb2YgYW4gaW50ZWdlciBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZgorICAgICAqIHRoZSBvbGQgdmFsdWUgYW5kIHRoZSBuZXcgdmFsdWUgYXJlIG5vdCBudWxsIGFuZCBlcXVhbCB0aGUgZXZlbnQgd2lsbCBub3QKKyAgICAgKiBiZSBmaXJlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5CisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHZhbHVlCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgaW5kZXgsCisgICAgICAgICAgICBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgeworCisgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgeworICAgICAgICAgICAgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihvbGRWYWx1ZSksIG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGF0IHByb3BlcnR5LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpID4gMDsKKyAgICAgICAgaWYgKCFyZXN1bHQgJiYgKHByb3BlcnR5TmFtZSAhPSBudWxsKSkgeworICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0ZW5lcnMuc2l6ZSgpID4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZXMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCB0byBhbGwgcHJvcGVydGllcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIGxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5TmFtZSgpOworICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHN0ID0gKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgbGlzdGVuZXIpLmdldExpc3RlbmVyKCk7CisKKyAgICAgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5hbWUsIGxzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHdpdGggYWxsIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVnaXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIGxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5TmFtZSgpOworICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHN0ID0gKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgbGlzdGVuZXIpLmdldExpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuYW1lLCBsc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGxpc3RlbmVycyB0aGF0IHJlZ2lzdGVyZWQgdG8gYWxsIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgbGlzdGVuZXJzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7CisgICAgICAgIEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiByZXN1bHQgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzKTsKKworICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gc2VsZWN0ZWRMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7CisKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZExpc3RlbmVycyAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3RlZExpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkocHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW3Jlc3VsdC5zaXplKCldKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG9vcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBhbGxTZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOworCisgICAgICAgIGZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wgOiBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAocGNsIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7CisgICAgICAgICAgICAgICAgYWxsU2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuYWRkKHBjbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PgorICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PigpOworCisgICAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5rZXlTZXQoKSkgeworICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBrZXlWYWx1ZXMgPQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7CisKKyAgICAgICAgICAgIGlmIChrZXlWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gc2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOworCisgICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbCA6IGtleVZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGNsIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5hZGQocGNsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghc2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwgc2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNoaWxkcmVuID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KAorICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMpOworICAgICAgICBjaGlsZHJlbi5wdXQoIiIsIGFsbFNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBvb3Mud3JpdGVPYmplY3QoY2hpbGRyZW4pOworCisgICAgICAgIE9iamVjdCBzb3VyY2UgPSBudWxsOworICAgICAgICBpZiAoc291cmNlQmVhbiBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgeworICAgICAgICAgICAgc291cmNlID0gc291cmNlQmVhbjsKKyAgICAgICAgfQorICAgICAgICBvb3Mud3JpdGVPYmplY3Qoc291cmNlKTsKKworICAgICAgICBvb3Mud3JpdGVJbnQocHJvcGVydHlDaGFuZ2VTdXBwb3J0U2VyaWFsaXplZERhdGFWZXJzaW9uKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBvaXMpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBjaGlsZHJlbiA9IChIYXNodGFibGU8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+Pikgb2lzCisgICAgICAgICAgICAgICAgLnJlYWRPYmplY3QoKTsKKworICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KAorICAgICAgICAgICAgICAgIGNoaWxkcmVuKTsKKyAgICAgICAgYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9IHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycworICAgICAgICAgICAgICAgIC5yZW1vdmUoIiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGlmIChhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICBzb3VyY2VCZWFuID0gb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgcHJvcGVydHlDaGFuZ2VTdXBwb3J0U2VyaWFsaXplZERhdGFWZXJzaW9uID0gb2lzLnJlYWRJbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCB0byBhbGwgbGlzdGVuZXJzIG9mIHRoYXQgcHJvcGVydHkuCisgICAgICogCisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgdG8gZmlyZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGRvRmlyZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY3JlYXRlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZUJlYW4sIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgbmV3VmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChzb3VyY2VCZWFuLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLAorICAgICAgICAgICAgICAgIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY3JlYXRlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZUJlYW4sIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgbmV3VmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKKyAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKKyAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKworICAgICAgICBpZiAoKG5ld1ZhbHVlICE9IG51bGwpICYmIChvbGRWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICYmIG5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGxpc3RlbmVycyBjb2xsZWN0aW9ucyBzbyB0aGV5IGNhbiBiZSBtb2RpZmllZCB3aGlsZSB3ZSBmaXJlCisgICAgICAgICAqIGV2ZW50cy4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8gTGlzdGVuZXJzIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCisgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5zVG9BbGw7CisgICAgICAgIC8vIExpc3RlbnMgdG8gYSBnaXZlbiBwcm9wZXJ0eSBjaGFuZ2UKKyAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbnNUb09uZSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbGlzdGVuc1RvQWxsID0gYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycworICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclthbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKV0pOworCisgICAgICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycworICAgICAgICAgICAgICAgICAgICAuZ2V0KHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5zVG9PbmUgPSBsaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpcmUgdGhlIGxpc3RlbmVycworICAgICAgICBmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5zVG9BbGwpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuc1RvT25lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbnNUb09uZSkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0FycmF5QmxvY2tpbmdRdWV1ZS5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0FycmF5QmxvY2tpbmdRdWV1ZS5qYXZhCmluZGV4IDg4YTA4NTguLjQzYjlmZDAgMTAwNjQ0Ci0tLSBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9BcnJheUJsb2NraW5nUXVldWUuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQXJyYXlCbG9ja2luZ1F1ZXVlLmphdmEKQEAgLTI1NCw2ICsyNTQsNyBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICBwdWJsaWMgRSBwb2xsKCkgewogICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSB0aGlzLmxvY2s7CiAgICAgICAgIGxvY2subG9jaygpOwpAQCAtMjkyLDYgKzI5Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewogICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGZpbmFsIEVbXSBpdGVtcyA9IHRoaXMuaXRlbXM7CkBAIC00MTEsNiArNDEzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKICAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICAgICBmaW5hbCBFW10gaXRlbXMgPSB0aGlzLml0ZW1zOwpAQCAtNDgzLDYgKzQ4Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogICAgICAgICBmaW5hbCBFW10gaXRlbXMgPSB0aGlzLml0ZW1zOwogICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSB0aGlzLmxvY2s7CkBAIC01MzMsNiArNTM3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgcHVibGljIGludCBkcmFpblRvKENvbGxlY3Rpb248PyBzdXBlciBFPiBjLCBpbnQgbWF4RWxlbWVudHMpIHsKICAgICAgICAgaWYgKGMgPT0gbnVsbCkKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwLmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAuamF2YQppbmRleCBjZTBiYjE5Li5mNzJjNmZlIDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAuamF2YQpAQCAtNjAxLDYgKzYwMSw3IEBACiAgICAgICAgIHB1dEFsbCh0KTsKICAgICB9CiAKKyAgICAvLyBpbmhlcml0IE1hcCBqYXZhZG9jCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKICAgICAgICAgZmluYWwgU2VnbWVudFtdIHNlZ21lbnRzID0gdGhpcy5zZWdtZW50czsKICAgICAgICAgLyoKQEAgLTYzMyw2ICs2MzQsNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICAvLyBpbmhlcml0IE1hcCBqYXZhZG9jCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICBmaW5hbCBTZWdtZW50W10gc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzOwogICAgICAgICBpbnRbXSBtYyA9IG5ldyBpbnRbc2VnbWVudHMubGVuZ3RoXTsKQEAgLTkxOSwyOCArOTIxLDI4IEBACiAgICAgfQogCiAKLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAotLy8gICAgICAgIC8qKgotLy8gICAgICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzCi0vLyAgICAgKiA8dHQ+Q29uY3VycmVudEhhc2hNYXA8L3R0PiBpbnN0YW5jZTogdGhlIGtleXMgYW5kCi0vLyAgICAgKiB2YWx1ZXMgdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLS8vICAgICAqCi0vLyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgbWFwLgotLy8gICAgICovCi0vLyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotLy8gICAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIHN1cGVyLmNsb25lLCBzaW5jZSBpdCB3b3VsZCBzaGFyZSBmaW5hbAotLy8gICAgICAgIC8vIHNlZ21lbnRzIGFycmF5LCBhbmQgdGhlcmUncyBubyB3YXkgdG8gcmVhc3NpZ24gZmluYWxzLgotLy8KLS8vICAgICAgICBmbG9hdCBsZiA9IHNlZ21lbnRzWzBdLmxvYWRGYWN0b3I7Ci0vLyAgICAgICAgaW50IHNlZ3MgPSBzZWdtZW50cy5sZW5ndGg7Ci0vLyAgICAgICAgaW50IGNhcCA9IChpbnQpKHNpemUoKSAvIGxmKTsKLS8vICAgICAgICBpZiAoY2FwIDwgc2VncykgY2FwID0gc2VnczsKLS8vICAgICAgICBDb25jdXJyZW50SGFzaE1hcDxLLFY+IHQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SyxWPihjYXAsIGxmLCBzZWdzKTsKLS8vICAgICAgICB0LnB1dEFsbCh0aGlzKTsKLS8vICAgICAgICByZXR1cm4gdDsKLS8vICAgIH0KLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKLSAgICAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyAvKioKKyAgICAvLyAgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMKKyAgICAvLyAgKiA8dHQ+Q29uY3VycmVudEhhc2hNYXA8L3R0PiBpbnN0YW5jZTogdGhlIGtleXMgYW5kCisgICAgLy8gICogdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCisgICAgLy8gICoKKyAgICAvLyAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgbWFwLgorICAgIC8vICAqLworICAgIC8vIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgLy8gICAgIC8vIFdlIGNhbm5vdCBjYWxsIHN1cGVyLmNsb25lLCBzaW5jZSBpdCB3b3VsZCBzaGFyZSBmaW5hbAorICAgIC8vICAgICAvLyBzZWdtZW50cyBhcnJheSwgYW5kIHRoZXJlJ3Mgbm8gd2F5IHRvIHJlYXNzaWduIGZpbmFscy4KKyAgICAvLworICAgIC8vICAgICBmbG9hdCBsZiA9IHNlZ21lbnRzWzBdLmxvYWRGYWN0b3I7CisgICAgLy8gICAgIGludCBzZWdzID0gc2VnbWVudHMubGVuZ3RoOworICAgIC8vICAgICBpbnQgY2FwID0gKGludCkoc2l6ZSgpIC8gbGYpOworICAgIC8vICAgICBpZiAoY2FwIDwgc2VncykgY2FwID0gc2VnczsKKyAgICAvLyAgICAgQ29uY3VycmVudEhhc2hNYXA8SyxWPiB0ID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPEssVj4oY2FwLCBsZiwgc2Vncyk7CisgICAgLy8gICAgIHQucHV0QWxsKHRoaXMpOworICAgIC8vICAgICByZXR1cm4gdDsKKyAgICAvLyB9CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHNldCB2aWV3IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gIFRoZSBzZXQgaXMKICAgICAgKiBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4gdGhlIHNldCwgYW5kCkBAIC0xMzQ5LDYgKzEzNTEsMyBAQAogICAgIH0KIH0KIAotCi0KLQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0NvcHlPbldyaXRlQXJyYXlMaXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3QuamF2YQppbmRleCAyNjE2NWRlLi43Mjc0NTk1IDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3QuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3QuamF2YQpAQCAtNDUxLDYgKzQ1MSw3IEBACiAgICAgICAgIHJldHVybiAoVFtdKSB0b0FycmF5KGEsIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJbIik7CiAKZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5U2V0LmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheVNldC5qYXZhCmluZGV4IDIzYjIyOGIuLjUzMjk1MmIgMTAwNjQ0Ci0tLSBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5U2V0LmphdmEKKysrIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0NvcHlPbldyaXRlQXJyYXlTZXQuamF2YQpAQCAtNjIsMTEgKzYyLDcgQEAKICAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgaGVsZCBpbiB0aGlzIGNvbGxlY3Rpb24KICAqLwogcHVibGljIGNsYXNzIENvcHlPbldyaXRlQXJyYXlTZXQ8RT4gZXh0ZW5kcyBBYnN0cmFjdFNldDxFPgotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKLSAgICAgICAgLy8gcmVtb3ZlZCBDbG9uZWFibGUgZnJvbSBsaXN0IG9mIGltcGxlbWVudGVkIGludGVyZmFjZXMKLSAgICAgICAgLy8gaW1wbGVtZW50cyBDbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKICAgICAgICAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NDU3NzQ3NjUxMzQ0MDM0MjYzTDsKIAogICAgIHByaXZhdGUgZmluYWwgQ29weU9uV3JpdGVBcnJheUxpc3Q8RT4gYWw7CkBAIC04OCw2ICs4NCw3IEBACiAgICAgICAgIGFsLmFkZEFsbEFic2VudChjKTsKICAgICB9CiAKKwogICAgIHB1YmxpYyBpbnQgICAgICBzaXplKCkgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFsLnNpemUoKTsgfQogICAgIHB1YmxpYyBib29sZWFuICBpc0VtcHR5KCkgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFsLmlzRW1wdHkoKTsgfQogICAgIHB1YmxpYyBib29sZWFuICBjb250YWlucyhPYmplY3QgbykgICAgICAgIHsgcmV0dXJuIGFsLmNvbnRhaW5zKG8pOyB9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvRGVsYXlRdWV1ZS5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0RlbGF5UXVldWUuamF2YQppbmRleCA4OGM0MjgwLi4xNTZkYzdlIDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvRGVsYXlRdWV1ZS5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9EZWxheVF1ZXVlLmphdmEKQEAgLTE3MCw2ICsxNzAsNyBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICBwdWJsaWMgRSBwb2xsKCkgewogICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSB0aGlzLmxvY2s7CiAgICAgICAgIGxvY2subG9jaygpOwpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0RlbGF5ZWQuamF2YSBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9EZWxheWVkLmphdmEKaW5kZXggNjJmNzU2OC4uYmQ0ODI5MiAxMDA2NDQKLS0tIGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0RlbGF5ZWQuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvRGVsYXllZC5qYXZhCkBAIC04LDYgKzgsMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC4qOwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIEFkZGVkIGdlbmVyaWMgdHlwZSBEZWxheWVkIHRvIENvbXBhcmFibGUgdG8gYmUgY2xvc2VyIHRvIHRoZSBSSS4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogLyoqCiAgKiBBIG1peC1pbiBzdHlsZSBpbnRlcmZhY2UgZm9yIG1hcmtpbmcgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQogICogYWN0ZWQgdXBvbiBhZnRlciBhIGdpdmVuIGRlbGF5LgpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yU2VydmljZS5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yU2VydmljZS5qYXZhCmluZGV4IGYwYTYzNDYuLmUxNzhlYjIgMTAwNjQ0Ci0tLSBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvclNlcnZpY2UuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JTZXJ2aWNlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIC8qKgogICogQW4ge0BsaW5rIEV4ZWN1dG9yfSB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gbWFuYWdlIHRlcm1pbmF0aW9uIGFuZAogICogbWV0aG9kcyB0aGF0IGNhbiBwcm9kdWNlIGEge0BsaW5rIEZ1dHVyZX0gZm9yIHRyYWNraW5nIHByb2dyZXNzIG9mCi0gKiBvbmUgb3IgbW9yZSBhc3luY2hyb25vdXMgdGFza3MuCisgKiBvbmUgb3IgbW9yZSBhc3luY2hyb25vdXMgdGFza3MuICAKICAqCiAgKiA8cD4KICAqIEFuIDx0dD5FeGVjdXRvclNlcnZpY2U8L3R0PiBjYW4gYmUgc2h1dCBkb3duLCB3aGljaCB3aWxsIGNhdXNlIGl0CkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAvKioKICAgICAgKiBTdWJtaXRzIGEgUnVubmFibGUgdGFzayBmb3IgZXhlY3V0aW9uIGFuZCByZXR1cm5zIGEgRnV0dXJlIAogICAgICAqIHJlcHJlc2VudGluZyB0aGF0IHRhc2sgdGhhdCB3aWxsIHVwb24gY29tcGxldGlvbiByZXR1cm4gCi0gICAgICogdGhlIGdpdmVuIHJlc3VsdC4KKyAgICAgKiB0aGUgZ2l2ZW4gcmVzdWx0CiAgICAgICoKICAgICAgKiBAcGFyYW0gdGFzayB0aGUgdGFzayB0byBzdWJtaXQKICAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgdG8gcmV0dXJuCkBAIC0yMDcsNiArMjA3LDcgQEAKICAgICAgKiBAdGhyb3dzIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGlmIGFueSB0YXNrIGNhbm5vdCBiZSBzY2hlZHVsZWQKICAgICAgKiBmb3IgZXhlY3V0aW9uCiAgICAgICovCisKICAgICA8VD4gTGlzdDxGdXR1cmU8VD4+IGludm9rZUFsbChDb2xsZWN0aW9uPENhbGxhYmxlPFQ+PiB0YXNrcykKICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwogCmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkQmxvY2tpbmdRdWV1ZS5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L0xpbmtlZEJsb2NraW5nUXVldWUuamF2YQppbmRleCBmMmVjMDViLi42NjJmNjNlIDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkQmxvY2tpbmdRdWV1ZS5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9MaW5rZWRCbG9ja2luZ1F1ZXVlLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgKiBpdGVtcyBoYXZlIGJlZW4gZW50ZXJlZCBzaW5jZSB0aGUgc2lnbmFsLiBBbmQgc3ltbWV0cmljYWxseSBmb3IKICAgICAgKiB0YWtlcyBzaWduYWxsaW5nIHB1dHMuIE9wZXJhdGlvbnMgc3VjaCBhcyByZW1vdmUoT2JqZWN0KSBhbmQKICAgICAgKiBpdGVyYXRvcnMgYWNxdWlyZSBib3RoIGxvY2tzLgotICAgICAqLworICAgICovCiAKICAgICAvKioKICAgICAgKiBMaW5rZWQgbGlzdCBub2RlIGNsYXNzCkBAIC0zNDYsNiArMzQ2LDcgQEAKICAgICAgICAgcmV0dXJuIGMgPj0gMDsKICAgICB9CiAKKwogICAgIHB1YmxpYyBFIHRha2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICBFIHg7CiAgICAgICAgIGludCBjID0gLTE7CkBAIC00MjksNiArNDMwLDcgQEAKICAgICAgICAgcmV0dXJuIHg7CiAgICAgfQogCisKICAgICBwdWJsaWMgRSBwZWVrKCkgewogICAgICAgICBpZiAoY291bnQuZ2V0KCkgPT0gMCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L1ByaW9yaXR5QmxvY2tpbmdRdWV1ZS5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L1ByaW9yaXR5QmxvY2tpbmdRdWV1ZS5qYXZhCmluZGV4IDg1YzAxNjUuLjgzZjEwNDAgMTAwNjQ0Ci0tLSBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9Qcmlvcml0eUJsb2NraW5nUXVldWUuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvUHJpb3JpdHlCbG9ja2luZ1F1ZXVlLmphdmEKQEAgLTIxMCw2ICsyMTAsNyBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICBwdWJsaWMgRSBwb2xsKCkgewogICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSB0aGlzLmxvY2s7CiAgICAgICAgIGxvY2subG9jaygpOwpAQCAtMzAyLDYgKzMwMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IHRoaXMubG9jazsKICAgICAgICAgbG9jay5sb2NrKCk7CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvU3luY2hyb25vdXNRdWV1ZS5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L1N5bmNocm9ub3VzUXVldWUuamF2YQppbmRleCA4MTFkYzM4Li5iOGQzNTM2IDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvU3luY2hyb25vdXNRdWV1ZS5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9TeW5jaHJvbm91c1F1ZXVlLmphdmEKQEAgLTY0OSw2ICs2NDksNyBAQAogICAgICAgICByZXR1cm4gYTsKICAgICB9CiAKKwogICAgIHB1YmxpYyBpbnQgZHJhaW5UbyhDb2xsZWN0aW9uPD8gc3VwZXIgRT4gYykgewogICAgICAgICBpZiAoYyA9PSBudWxsKQogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0Jvb2xlYW4uamF2YSBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljQm9vbGVhbi5qYXZhCmluZGV4IDViOWI1NTYuLmZkZDNkNDkgMTAwNjQ0Ci0tLSBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljQm9vbGVhbi5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljQm9vbGVhbi5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBBdG9taWNCb29sZWFuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ2NTQ2NzE0Njk3OTQ1NTY5NzlMOwotCiAgICAgLy8gc2V0dXAgdG8gdXNlIFVuc2FmZS5jb21wYXJlQW5kU3dhcEludCBmb3IgdXBkYXRlcwogICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVuc2FmZSB1bnNhZmUgPSBVbnNhZmVBY2Nlc3MuVEhFX09ORTsKZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljSW50ZWdlckFycmF5LmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0ludGVnZXJBcnJheS5qYXZhCmluZGV4IDVjNDkwMzguLjk1ODA3ZjMgMTAwNjQ0Ci0tLSBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljSW50ZWdlckFycmF5LmphdmEKKysrIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNJbnRlZ2VyQXJyYXkuamF2YQpAQCAtMTksMTEgKzE5LDEwIEBACiBwdWJsaWMgY2xhc3MgQXRvbWljSW50ZWdlckFycmF5IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeyAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyODYyMTMzNTY5NDUzNjA0MjM1TDsKIAotICAgIC8vIHNldHVwIHRvIHVzZSBVbnNhZmUuY29tcGFyZUFuZFN3YXBJbnQgZm9yIHVwZGF0ZXMKKyAgIC8vIHNldHVwIHRvIHVzZSBVbnNhZmUuY29tcGFyZUFuZFN3YXBJbnQgZm9yIHVwZGF0ZXMKICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbnNhZmUgdW5zYWZlID0gVW5zYWZlQWNjZXNzLlRIRV9PTkU7CiAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJhc2UgPSB1bnNhZmUuYXJyYXlCYXNlT2Zmc2V0KGludFtdLmNsYXNzKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc2NhbGUgPSB1bnNhZmUuYXJyYXlJbmRleFNjYWxlKGludFtdLmNsYXNzKTsKICAgICBwcml2YXRlIGZpbmFsIGludFtdIGFycmF5OwpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyLmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIuamF2YQppbmRleCBlM2EwNTE1Li41ZjI4OWMyIDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIuamF2YQpAQCAtMjEwLDcgKzIxMCw2IEBACiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbnNhZmUgdW5zYWZlID0gVW5zYWZlQWNjZXNzLlRIRV9PTkU7CiAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKLQogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgb2Zmc2V0OwogICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IHRjbGFzczsKIApkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNMb25nLmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmcuamF2YQppbmRleCBjYTQ1OTg0Li43ZjQxMzY0IDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmcuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmcuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVuc2FmZSB1bnNhZmUgPSBVbnNhZmVBY2Nlc3MuVEhFX09ORTsKICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHZhbHVlT2Zmc2V0OwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdBcnJheS5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNMb25nQXJyYXkuamF2YQppbmRleCBiOTIwMWIyLi5hMGU3NmI0IDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdBcnJheS5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTG9uZ0FycmF5LmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbnNhZmUgdW5zYWZlID0gVW5zYWZlQWNjZXNzLlRIRV9PTkU7CiAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJhc2UgPSB1bnNhZmUuYXJyYXlCYXNlT2Zmc2V0KGxvbmdbXS5jbGFzcyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNjYWxlID0gdW5zYWZlLmFycmF5SW5kZXhTY2FsZShsb25nW10uY2xhc3MpOwogICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIGFycmF5OwpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNMb25nRmllbGRVcGRhdGVyLmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdGaWVsZFVwZGF0ZXIuamF2YQppbmRleCBhZDVlZGQ4Li5kY2I4YjJlIDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdGaWVsZFVwZGF0ZXIuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdGaWVsZFVwZGF0ZXIuamF2YQpAQCAtMjExLDcgKzIxMSw2IEBACiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbnNhZmUgdW5zYWZlID0gVW5zYWZlQWNjZXNzLlRIRV9PTkU7CiAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKLQogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgb2Zmc2V0OwogICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IHRjbGFzczsKIApAQCAtMjY0LDcgKzI2Myw2IEBACiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbnNhZmUgdW5zYWZlID0gVW5zYWZlQWNjZXNzLlRIRV9PTkU7CiAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKLQogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgb2Zmc2V0OwogICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IHRjbGFzczsKIApAQCAtMjkyLDcgKzI5MCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigpOwogICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKICAgICAgICAgICAgICAgICBsb25nIHYgPSB1bnNhZmUuZ2V0TG9uZyhvYmosIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgIT0gZXhwZWN0KQorICAgICAgICAgICAgICAgIGlmICh2ICE9IGV4cGVjdCkgCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB1bnNhZmUucHV0TG9uZyhvYmosIG9mZnNldCwgdXBkYXRlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlLmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZS5qYXZhCmluZGV4IGQ1MWQ1Y2U2Li44OWMwNTBjIDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZS5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbnNhZmUgdW5zYWZlID0gVW5zYWZlQWNjZXNzLlRIRV9PTkU7CiAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyB2YWx1ZU9mZnNldDsKIAogICAgIHN0YXRpYyB7CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZUFycmF5LmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZUFycmF5LmphdmEKaW5kZXggOThiODNjNC4uOWFkODAwYyAxMDA2NDQKLS0tIGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNSZWZlcmVuY2VBcnJheS5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlQXJyYXkuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVuc2FmZSB1bnNhZmUgPSBVbnNhZmVBY2Nlc3MuVEhFX09ORTsKICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYmFzZSA9IHVuc2FmZS5hcnJheUJhc2VPZmZzZXQoT2JqZWN0W10uY2xhc3MpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzY2FsZSA9IHVuc2FmZS5hcnJheUluZGV4U2NhbGUoT2JqZWN0W10uY2xhc3MpOwogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJyYXk7CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5qYXZhIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIuamF2YQppbmRleCAwNDRkNmNkLi5mMjA2NjFkIDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5qYXZhCisrKyBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyLmphdmEKQEAgLTEzOCw3ICsxMzgsNiBAQAogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVW5zYWZlIHVuc2FmZSA9IFVuc2FmZUFjY2Vzcy5USEVfT05FOwogICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG9mZnNldDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiB0Y2xhc3M7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Vj4gdmNsYXNzOwpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9wYWNrYWdlLmh0bWwgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL3BhY2thZ2UuaHRtbAppbmRleCA1MzE2ZTIyLi5iZGIxNWU4IDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL3BhY2thZ2UuaHRtbAorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL3BhY2thZ2UuaHRtbApAQCAtMTI3LDcgKzEyNyw2IEBACiBjb252ZXJzaW9ucywgYW5kIGRvdWJsZXMgdXNpbmcgPHR0PkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzPC90dD4gYW5kCiA8dHQ+RG91YmxlLmxvbmdCaXRzVG9Eb3VibGU8L3R0PiBjb252ZXJzaW9ucy4KIAotQHNpbmNlIDEuNQogQHNpbmNlIEFuZHJvaWQgMS4wCiAKIDwvYm9keT4gPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2xvY2tzL0Fic3RyYWN0UXVldWVkU3luY2hyb25pemVyLmphdmEgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIuamF2YQppbmRleCBkYTlkODRkLi4yOWU3MmI1IDEwMDY0NAotLS0gYS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIuamF2YQorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIuamF2YQpAQCAtOTI2LDcgKzkyNiw3IEBACiAgICAgLyoqCiAgICAgICogQXR0ZW1wdHMgdG8gc2V0IHRoZSBzdGF0ZSB0byByZWZsZWN0IGEgcmVsZWFzZSBpbiBleGNsdXNpdmUKICAgICAgKiBtb2RlLiAgPHA+VGhpcyBtZXRob2QgaXMgYWx3YXlzIGludm9rZWQgYnkgdGhlIHRocmVhZAotICAgICAqIHBlcmZvcm1pbmcgcmVsZWFzZS4KKyAgICAgKiBwZXJmb3JtaW5nIHJlbGVhc2UuICAKICAgICAgKgogICAgICAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRocm93cwogICAgICAqIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0KQEAgLTE3OTUsNyArMTc5NSw2IEBACiAgICAgICAgICAqIDxsaT4gSWYgaW50ZXJydXB0ZWQgd2hpbGUgYmxvY2tlZCBpbiBzdGVwIDQsIHRocm93IEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgICAgICAqIDwvb2w+CiAgICAgICAgICAqIAotICAgICAgICAgKiAKICAgICAgICAgICogQHBhcmFtIG5hbm9zVGltZW91dCB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQsIGluIG5hbm9zZWNvbmRzCiAgICAgICAgICAqIEByZXR1cm4gQSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyBpZiB0aGUgd2FpdCBoYXMKICAgICAgICAgICogdGltZWQgb3V0OyBvdGhlcndpc2UgYW4gZXN0aW1hdGUsIHRoYXQKQEAgLTE4NDYsNyArMTg0NSw2IEBACiAgICAgICAgICAqIDxsaT4gSWYgdGltZWQgb3V0IHdoaWxlIGJsb2NrZWQgaW4gc3RlcCA0LCByZXR1cm4gZmFsc2UsIGVsc2UgdHJ1ZQogICAgICAgICAgKiA8L29sPgogICAgICAgICAgKiAKLSAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRlYWRsaW5lIHRoZSBhYnNvbHV0ZSB0aW1lIHRvIHdhaXQgdW50aWwKICAgICAgICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgZGVhZGxpbmUgaGFzCiAgICAgICAgICAqIGVsYXBzZWQgdXBvbiByZXR1cm4sIGVsc2UgPHR0PnRydWU8L3R0Pi4KQEAgLTE4OTUsOCArMTg5Myw2IEBACiAgICAgICAgICAqIDxsaT4gSWYgdGltZWQgb3V0IHdoaWxlIGJsb2NrZWQgaW4gc3RlcCA0LCByZXR1cm4gZmFsc2UsIGVsc2UgdHJ1ZQogICAgICAgICAgKiA8L29sPgogICAgICAgICAgKiAKLSAgICAgICAgICogCi0gICAgICAgICAqIAogICAgICAgICAgKiBAcGFyYW0gdGltZSB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQKICAgICAgICAgICogQHBhcmFtIHVuaXQgdGhlIHRpbWUgdW5pdCBvZiB0aGUgPHR0PnRpbWU8L3R0PiBhcmd1bWVudC4KICAgICAgICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgd2FpdGluZyB0aW1lIGRldGVjdGFibHkgZWxhcHNlZApAQCAtMjAxMywxMSArMjAwOSw5IEBACiAgICAgICogYXJlIGF0IGl0LCB3ZSBkbyB0aGUgc2FtZSBmb3Igb3RoZXIgQ0FTYWJsZSBmaWVsZHMgKHdoaWNoIGNvdWxkCiAgICAgICogb3RoZXJ3aXNlIGJlIGRvbmUgd2l0aCBhdG9taWMgZmllbGQgdXBkYXRlcnMpLgogICAgICAqLwotCiAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVW5zYWZlIHVuc2FmZSA9IFVuc2FmZUFjY2Vzcy5USEVfT05FOwogICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc3RhdGVPZmZzZXQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBoZWFkT2Zmc2V0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgdGFpbE9mZnNldDsKZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9wYWNrYWdlLmh0bWwgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvcGFja2FnZS5odG1sCmluZGV4IDVkM2IzZmMuLjFjYzE1NmYgMTAwNjQ0Ci0tLSBhL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9wYWNrYWdlLmh0bWwKKysrIGIvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L2xvY2tzL3BhY2thZ2UuaHRtbApAQCAtMzksNyArMzksNiBAQAogYmxvY2tpbmcgYW5kIHVuYmxvY2tpbmcgc3VwcG9ydCB0aGF0IGlzIHVzZWZ1bCBmb3IgdGhvc2UgZGV2ZWxvcGVycwogaW1wbGVtZW50aW5nIHRoZWlyIG93biBjdXN0b21pemVkIGxvY2sgY2xhc3Nlcy4KIAotQHNpbmNlIDEuNQogQHNpbmNlIEFuZHJvaWQgMS4wCiAKIDwvYm9keT4gPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L3BhY2thZ2UuaHRtbCBiL2NvbmN1cnJlbnQvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvY29uY3VycmVudC9wYWNrYWdlLmh0bWwKaW5kZXggZjdhNGFkMy4uYTViYjhkMiAxMDA2NDQKLS0tIGEvY29uY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9jb25jdXJyZW50L3BhY2thZ2UuaHRtbAorKysgYi9jb25jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YS91dGlsL2NvbmN1cnJlbnQvcGFja2FnZS5odG1sCkBAIC0xMjAsNyArMTIwLDYgQEAKIGZyZWV6ZSB0aGUgY29sbGVjdGlvbiB3aGlsZSBpdGVyYXRpbmcsIHNvIGl0IG1heSAob3IgbWF5IG5vdCkgcmVmbGVjdAogYW55IHVwZGF0ZXMgc2luY2UgdGhlIGl0ZXJhdG9yIHdhcyBjcmVhdGVkLgogCi1Ac2luY2UgMS41CiBAc2luY2UgQW5kcm9pZCAxLjAKIAogPC9ib2R5PiA8L2h0bWw+CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0Fic3RyYWN0RXhlY3V0b3JTZXJ2aWNlVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdEV4ZWN1dG9yU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWEwMDdhCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdEV4ZWN1dG9yU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDgwOCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS4qOworCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RFeGVjdXRvclNlcnZpY2VUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2V7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEFic3RyYWN0RXhlY3V0b3JTZXJ2aWNlVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEEgbm8tZnJpbGxzIGltcGxlbWVudGF0aW9uIG9mIEFic3RyYWN0RXhlY3V0b3JTZXJ2aWNlLCBkZXNpZ25lZAorICAgICAqIHRvIHRlc3QgdGhlIHN1Ym1pdCBtZXRob2RzIG9ubHkuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIERpcmVjdEV4ZWN1dG9yU2VydmljZSBleHRlbmRzIEFic3RyYWN0RXhlY3V0b3JTZXJ2aWNlIHsKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSByKSB7IHIucnVuKCk7IH0KKyAgICAgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7IHNodXRkb3duID0gdHJ1ZTsgfQorICAgICAgICBwdWJsaWMgTGlzdDxSdW5uYWJsZT4gc2h1dGRvd25Ob3coKSB7IHNodXRkb3duID0gdHJ1ZTsgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IH0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaHV0ZG93bigpIHsgcmV0dXJuIHNodXRkb3duOyB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsgcmV0dXJuIGlzU2h1dGRvd24oKTsgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhd2FpdFRlcm1pbmF0aW9uKGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgeyByZXR1cm4gaXNTaHV0ZG93bigpOyB9CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzaHV0ZG93biA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4ZWN1dGUocnVubmFibGUpIHJ1bnMgaXQgdG8gY29tcGxldGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlUnVubmFibGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgICAgIFRyYWNrZWRTaG9ydFJ1bm5hYmxlIHRhc2sgPSBuZXcgVHJhY2tlZFNob3J0UnVubmFibGUoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHRhc2suZG9uZSk7CisgICAgICAgICAgICBGdXR1cmU8Pz4gZnV0dXJlID0gZS5zdWJtaXQodGFzayk7CisgICAgICAgICAgICBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRhc2suZG9uZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21wbGV0ZWQgc3VibWl0KGNhbGxhYmxlKSByZXR1cm5zIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRDYWxsYWJsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICAgICAgRnV0dXJlPFN0cmluZz4gZnV0dXJlID0gZS5zdWJtaXQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZnV0dXJlLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShURVNUX1NUUklORywgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wbGV0ZWQgc3VibWl0KHJ1bm5hYmxlKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRSdW5uYWJsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IGUuc3VibWl0KG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgICAgICBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZ1dHVyZS5pc0RvbmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGxldGVkIHN1Ym1pdChydW5uYWJsZSwgcmVzdWx0KSByZXR1cm5zIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRSdW5uYWJsZTIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGZ1dHVyZSA9IGUuc3VibWl0KG5ldyBOb09wUnVubmFibGUoKSwgVEVTVF9TVFJJTkcpOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoVEVTVF9TVFJJTkcsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHN1Ym1pdHRlZCBwcml2aWxlZ2VkIGFjdGlvbiB0byBjb21wbGV0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN1Ym1pdFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgIFBvbGljeSBzYXZlZFBvbGljeSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYXZlZFBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKKyAgICAgICAgICAgIEFkanVzdGFibGVQb2xpY3kgcG9saWN5ID0gbmV3IEFkanVzdGFibGVQb2xpY3koKTsKKyAgICAgICAgICAgIHBvbGljeS5hZGRQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigiZ2V0Q29udGV4dENsYXNzTG9hZGVyIikpOworICAgICAgICAgICAgcG9saWN5LmFkZFBlcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJzZXRDb250ZXh0Q2xhc3NMb2FkZXIiKSk7CisgICAgICAgICAgICBQb2xpY3kuc2V0UG9saWN5KHBvbGljeSk7CisgICAgICAgIH0gY2F0Y2goQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgICAgIEZ1dHVyZSBmdXR1cmUgPSBlLnN1Ym1pdChFeGVjdXRvcnMuY2FsbGFibGUobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRFU1RfU1RSSU5HOworICAgICAgICAgICAgICAgICAgICB9fSkpOworCisgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gZnV0dXJlLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShURVNUX1NUUklORywgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFBvbGljeS5zZXRQb2xpY3koc2F2ZWRQb2xpY3kpOworICAgICAgICAgICAgfSBjYXRjaChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdWJtaXR0ZWQgYSBwcml2aWxlZ2VkIGV4Y2VwdGlvbiBhY3Rpb24gcnVucyB0byBjb21wbGV0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN1Ym1pdFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CisgICAgICAgIFBvbGljeSBzYXZlZFBvbGljeSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYXZlZFBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKKyAgICAgICAgICAgIEFkanVzdGFibGVQb2xpY3kgcG9saWN5ID0gbmV3IEFkanVzdGFibGVQb2xpY3koKTsKKyAgICAgICAgICAgIHBvbGljeS5hZGRQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigiZ2V0Q29udGV4dENsYXNzTG9hZGVyIikpOworICAgICAgICAgICAgcG9saWN5LmFkZFBlcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJzZXRDb250ZXh0Q2xhc3NMb2FkZXIiKSk7CisgICAgICAgICAgICBQb2xpY3kuc2V0UG9saWN5KHBvbGljeSk7CisgICAgICAgIH0gY2F0Y2goQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICAgICAgRnV0dXJlIGZ1dHVyZSA9IGUuc3VibWl0KEV4ZWN1dG9ycy5jYWxsYWJsZShuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEVTVF9TVFJJTkc7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIFBvbGljeS5zZXRQb2xpY3koc2F2ZWRQb2xpY3kpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdWJtaXR0ZWQgZmFpbGVkIHByaXZpbGVnZWQgZXhjZXB0aW9uIGFjdGlvbiByZXBvcnRzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRGYWlsZWRQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgeworICAgICAgICBQb2xpY3kgc2F2ZWRQb2xpY3kgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2F2ZWRQb2xpY3kgPSBQb2xpY3kuZ2V0UG9saWN5KCk7CisgICAgICAgICAgICBBZGp1c3RhYmxlUG9saWN5IHBvbGljeSA9IG5ldyBBZGp1c3RhYmxlUG9saWN5KCk7CisgICAgICAgICAgICBwb2xpY3kuYWRkUGVybWlzc2lvbihuZXcgUnVudGltZVBlcm1pc3Npb24oImdldENvbnRleHRDbGFzc0xvYWRlciIpKTsKKyAgICAgICAgICAgIHBvbGljeS5hZGRQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigic2V0Q29udGV4dENsYXNzTG9hZGVyIikpOworICAgICAgICAgICAgUG9saWN5LnNldFBvbGljeShwb2xpY3kpOworICAgICAgICB9IGNhdGNoKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICAgICAgRnV0dXJlIGZ1dHVyZSA9IGUuc3VibWl0KEV4ZWN1dG9ycy5jYWxsYWJsZShuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgUG9saWN5LnNldFBvbGljeShzYXZlZFBvbGljeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBleGVjdXRlKG51bGwgcnVubmFibGUpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU51bGxSdW5uYWJsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICAgICAgVHJhY2tlZFNob3J0UnVubmFibGUgdGFzayA9IG51bGw7CisgICAgICAgICAgICBGdXR1cmU8Pz4gZnV0dXJlID0gZS5zdWJtaXQodGFzayk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzdWJtaXQobnVsbCBjYWxsYWJsZSkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXROdWxsQ2FsbGFibGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgICAgIFN0cmluZ1Rhc2sgdCA9IG51bGw7CisgICAgICAgICAgICBGdXR1cmU8U3RyaW5nPiBmdXR1cmUgPSBlLnN1Ym1pdCh0KTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdWJtaXQocnVubmFibGUpIHRocm93cyBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZgorICAgICAqIGV4ZWN1dG9yIGlzIHNhdHVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZTEoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDEsIDYwLCBUaW1lVW5pdC5TRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxKSk7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1OyArK2kpeworICAgICAgICAgICAgICAgIHAuc3VibWl0KG5ldyBNZWRpdW1SdW5uYWJsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICBqb2luUG9vbChwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdWJtaXQoY2FsbGFibGUpIHRocm93cyBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbgorICAgICAqIGlmIGV4ZWN1dG9yIGlzIHNhdHVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZTIoKSB7CisgICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwxLCA2MCwgVGltZVVuaXQuU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgICAgICAgICAgIHAuc3VibWl0KG5ldyBTbWFsbENhbGxhYmxlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKXt9CisgICAgICAgIGpvaW5Qb29sKHApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIEJsb2NraW5nIG9uIHN1Ym1pdChjYWxsYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmCisgICAgICogIGNhbGxlciBpbnRlcnJ1cHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0ZWRTdWJtaXQoKSB7CisgICAgICAgIGZpbmFsIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDEsNjAsIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcC5zdWJtaXQobmV3IENhbGxhYmxlPE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmdldCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGpvaW5Qb29sKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXQgb2Ygc3VibWl0dGVkIGNhbGxhYmxlIHRocm93cyBFeGNlcHRpb24gaWYgY2FsbGFibGUKKyAgICAgKiAgaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VibWl0SUUoKSB7CisgICAgICAgIGZpbmFsIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDEsNjAsIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisKKyAgICAgICAgZmluYWwgQ2FsbGFibGUgYyA9IG5ldyBDYWxsYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwLnN1Ym1pdChuZXcgU21hbGxDYWxsYWJsZSgpKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7fQorICAgICAgICAgICAgICAgICAgICBjYXRjaChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBlMil7fQorICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGVjdXRpb25FeGNlcHRpb24gZTMpe30KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisKKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuY2FsbCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGpvaW5Qb29sKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXQgb2Ygc3VibWl0KGNhbGxhYmxlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIGlmIGNhbGxhYmxlCisgICAgICogIHRocm93cyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VibWl0RUUoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDEsNjAsIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbGxhYmxlIGMgPSBuZXcgQ2FsbGFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gNS8wOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZvcihpbnQgaSA9MDsgaSA8IDU7IGkrKyl7CisgICAgICAgICAgICAgICAgcC5zdWJtaXQoYykuZ2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgam9pblBvb2wocCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52b2tlQW55KG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQW55MSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLmludm9rZUFueShudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbnkoZW1wdHkgY29sbGVjdGlvbikgdGhyb3dzIElBRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbnkyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludm9rZUFueShjKSB0aHJvd3MgTlBFIGlmIGMgaGFzIG51bGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQW55MygpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobnVsbCk7CisgICAgICAgICAgICBlLmludm9rZUFueShsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludm9rZUFueShjKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIGlmIG5vIHRhc2sgaW4gYyBjb21wbGV0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQW55NCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBOUEVUYXNrKCkpOworICAgICAgICAgICAgZS5pbnZva2VBbnkobCk7CisgICAgICAgIH0gY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52b2tlQW55KGMpIHJldHVybnMgcmVzdWx0IG9mIHNvbWUgdGFzayBpbiBjIGlmIGF0IGxlYXN0IG9uZSBjb21wbGV0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQW55NSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZS5pbnZva2VBbnkobCk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbGwxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQWxsKG51bGwpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludm9rZUFsbChlbXB0eSBjb2xsZWN0aW9uKSByZXR1cm5zIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQWxsMigpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByID0gZS5pbnZva2VBbGwobmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoci5pc0VtcHR5KCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbGwoYykgdGhyb3dzIE5QRSBpZiBjIGhhcyBudWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFsbDMoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbGwobCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IG9mIHJldHVybmVkIGVsZW1lbnQgb2YgaW52b2tlQWxsKGMpIHRocm93cyBleGNlcHRpb24gb24gZmFpbGVkIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQWxsNCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBOUEVUYXNrKCkpOworICAgICAgICAgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gcmVzdWx0ID0gZS5pbnZva2VBbGwobCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEZ1dHVyZTxTdHJpbmc+PiBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSAKKyAgICAgICAgICAgICAgICBpdC5uZXh0KCkuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52b2tlQWxsKGMpIHJldHVybnMgcmVzdWx0cyBvZiBhbGwgY29tcGxldGVkIHRhc2tzIGluIGMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQWxsNSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHQgPSBlLmludm9rZUFsbChsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RnV0dXJlPFN0cmluZz4+IGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIAorICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoVEVTVF9TVFJJTkcsIGl0Lm5leHQoKS5nZXQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQW55KG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnkxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KG51bGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkobnVsbCB0aW1lIHVuaXQpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnlOdWxsVGltZVVuaXQoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KGwsIE1FRElVTV9ERUxBWV9NUywgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQW55KGVtcHR5IGNvbGxlY3Rpb24pIHRocm93cyBJQUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnkyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKSwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoYykgdGhyb3dzIE5QRSBpZiBjIGhhcyBudWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQW55MygpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobnVsbCk7CisgICAgICAgICAgICBlLmludm9rZUFueShsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoYykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZiBubyB0YXNrIGNvbXBsZXRlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFueTQoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgTlBFVGFzaygpKTsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoYykgcmV0dXJucyByZXN1bHQgb2Ygc29tZSB0YXNrIGluIGMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnk1KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBlLmludm9rZUFueShsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbDEoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZS5pbnZva2VBbGwobnVsbCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFsbChudWxsIHRpbWUgdW5pdCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbE51bGxUaW1lVW5pdCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgZS5pbnZva2VBbGwobCwgTUVESVVNX0RFTEFZX01TLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbGwoZW1wdHkgY29sbGVjdGlvbikgcmV0dXJucyBlbXB0eSBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQWxsMigpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByID0gZS5pbnZva2VBbGwobmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHIuaXNFbXB0eSgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQWxsKGMpIHRocm93cyBOUEUgaWYgYyBoYXMgbnVsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbDMoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IERpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbGwobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBvZiByZXR1cm5lZCBlbGVtZW50IG9mIGludm9rZUFsbChjKSB0aHJvd3MgZXhjZXB0aW9uIG9uIGZhaWxlZCB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQWxsNCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBOUEVUYXNrKCkpOworICAgICAgICAgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gcmVzdWx0ID0gZS5pbnZva2VBbGwobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxGdXR1cmU8U3RyaW5nPj4gaXQgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgCisgICAgICAgICAgICAgICAgaXQubmV4dCgpLmdldCgpOworICAgICAgICB9IGNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFsbChjKSByZXR1cm5zIHJlc3VsdHMgb2YgYWxsIGNvbXBsZXRlZCB0YXNrcyBpbiBjCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQWxsNSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgRGlyZWN0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHQgPSBlLmludm9rZUFsbChsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEZ1dHVyZTxTdHJpbmc+PiBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSAKKyAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCBpdC5uZXh0KCkuZ2V0KCkpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbGwgY2FuY2VscyB0YXNrcyBub3QgY29tcGxldGVkIGJ5IHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbGw2KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBEaXJlY3RFeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBsLmFkZChFeGVjdXRvcnMuY2FsbGFibGUobmV3IE1lZGl1bVBvc3NpYmx5SW50ZXJydXB0ZWRSdW5uYWJsZSgpLCBURVNUX1NUUklORykpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHQgPSBlLmludm9rZUFsbChsLCBTTUFMTF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yPEZ1dHVyZTxTdHJpbmc+PiBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyAKKyAgICAgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGYxID0gaXQubmV4dCgpOworICAgICAgICAgICAgRnV0dXJlPFN0cmluZz4gZjIgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBGdXR1cmU8U3RyaW5nPiBmMyA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZjEuaXNEb25lKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZjEuaXNDYW5jZWxsZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGYyLmlzRG9uZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZjMuaXNEb25lKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmMy5pc0NhbmNlbGxlZCgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0Fic3RyYWN0UXVldWVUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0Fic3RyYWN0UXVldWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1MTM5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQWJzdHJhY3RRdWV1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFF1ZXVlVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQWJzdHJhY3RRdWV1ZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTdWNjZWVkIGV4dGVuZHMgQWJzdHJhY3RRdWV1ZTxJbnRlZ2VyPiB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9mZmVyKEludGVnZXIgeCkgeyAKKyAgICAgICAgICAgIGlmICh4ID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7IAorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHBlZWsoKSB7IHJldHVybiBvbmU7IH0KKyAgICAgICAgcHVibGljIEludGVnZXIgcG9sbCgpIHsgcmV0dXJuIG9uZTsgfQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7IHJldHVybiAwOyB9CisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsgcmV0dXJuIG51bGw7IH0gLy8gbm90IG5lZWRlZAorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBGYWlsIGV4dGVuZHMgQWJzdHJhY3RRdWV1ZTxJbnRlZ2VyPiB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9mZmVyKEludGVnZXIgeCkgeyAKKyAgICAgICAgICAgIGlmICh4ID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSW50ZWdlciBwZWVrKCkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgICBwdWJsaWMgSW50ZWdlciBwb2xsKCkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7IHJldHVybiAwOyB9CisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsgcmV0dXJuIG51bGw7IH0gLy8gbm90IG5lZWRlZAorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCByZXR1cm5zIHRydWUgaWYgb2ZmZXIgc3VjY2VlZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUygpIHsKKyAgICAgICAgU3VjY2VlZCBxID0gbmV3IFN1Y2NlZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmFkZCh0d28pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgdGhyb3dzIElTRSB0cnVlIGlmIG9mZmVyIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEYoKSB7CisgICAgICAgIEZhaWwgcSA9IG5ldyBGYWlsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmFkZChvbmUpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCB0aHJvd3MgTlBFIGlmIG9mZmVyIGRvZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTlBFKCkgeworICAgICAgICBTdWNjZWVkIHEgPSBuZXcgU3VjY2VlZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5hZGQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgcmV0dXJucyBub3JtYWxseSBpZiBwb2xsIHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVMoKSB7CisgICAgICAgIFN1Y2NlZWQgcSA9IG5ldyBTdWNjZWVkKCk7CisgICAgICAgIHEucmVtb3ZlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlIHRocm93cyBOU0VFIGlmIHBvbGwgcmV0dXJucyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUYoKSB7CisgICAgICAgIEZhaWwgcSA9IG5ldyBGYWlsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGVsZW1lbnQgcmV0dXJucyBub3JtYWxseSBpZiBwZWVrIHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRTKCkgeworICAgICAgICBTdWNjZWVkIHEgPSBuZXcgU3VjY2VlZCgpOworICAgICAgICBxLmVsZW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbGVtZW50IHRocm93cyBOU0VFIGlmIHBlZWsgcmV0dXJucyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRGKCkgeworICAgICAgICBGYWlsIHEgPSBuZXcgRmFpbCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5lbGVtZW50KCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBhZGRBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3VjY2VlZCBxID0gbmV3IFN1Y2NlZWQoKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwodGhpcykgdGhyb3dzIElBRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGxTZWxmKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3VjY2VlZCBxID0gbmV3IFN1Y2NlZWQoKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKHEpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgYWRkQWxsIG9mIGEgY29sbGVjdGlvbiB3aXRoIG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3VjY2VlZCBxID0gbmV3IFN1Y2NlZWQoKTsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIGFkZEFsbCBvZiBhIGNvbGxlY3Rpb24gd2l0aCBhbnkgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFIGFmdGVyCisgICAgICogcG9zc2libHkgYWRkaW5nIHNvbWUgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN1Y2NlZWQgcSA9IG5ldyBTdWNjZWVkKCk7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFLTE7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIGFkZEFsbCB0aHJvd3MgSVNFIGlmIGFuIGFkZCBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmFpbCBxID0gbmV3IEZhaWwoKTsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplclRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkOGQzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAxIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXJUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNpbXBsZSBtdXRleCBjbGFzcywgYWRhcHRlZCBmcm9tIHRoZQorICAgICAqIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyIGphdmFkb2MuICBFeGNsdXNpdmUgYWNxdWlyZSB0ZXN0cworICAgICAqIGV4ZXJjaXNlIHRoaXMgYXMgYSBzYW1wbGUgdXNlciBleHRlbnNpb24uICBPdGhlcgorICAgICAqIG1ldGhvZHMvZmVhdHVyZXMgb2YgQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXJUZXN0IGFyZSB0ZXN0ZWQKKyAgICAgKiB2aWEgb3RoZXIgdGVzdCBjbGFzc2VzLCBpbmNsdWRpbmcgdGhvc2UgZm9yIFJlZW50cmFudExvY2ssCisgICAgICogUmVlbnRyYW50UmVhZFdyaXRlTG9jaywgYW5kIFNlbWFwaG9yZQorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBNdXRleCBleHRlbmRzIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNIZWxkRXhjbHVzaXZlbHkoKSB7IHJldHVybiBnZXRTdGF0ZSgpID09IDE7IH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIHRyeUFjcXVpcmUoaW50IGFjcXVpcmVzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFjcXVpcmVzID09IDEpOyAKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlQW5kU2V0U3RhdGUoMCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIHRyeVJlbGVhc2UoaW50IHJlbGVhc2VzKSB7CisgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSAwKSB0aHJvdyBuZXcgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgc2V0U3RhdGUoMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBuZXdDb25kaXRpb24oKSB7IHJldHVybiBuZXcgQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0KCk7IH0KKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEEgc2ltcGxlIGxhdGNoIGNsYXNzLCB0byB0ZXN0IHNoYXJlZCBtb2RlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCb29sZWFuTGF0Y2ggZXh0ZW5kcyBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciB7IAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NpZ25hbGxlZCgpIHsgcmV0dXJuIGdldFN0YXRlKCkgIT0gMDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgdHJ5QWNxdWlyZVNoYXJlZChpbnQgaWdub3JlKSB7CisgICAgICAgICAgICByZXR1cm4gaXNTaWduYWxsZWQoKT8gMSA6IC0xOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiB0cnlSZWxlYXNlU2hhcmVkKGludCBpZ25vcmUpIHsKKyAgICAgICAgICAgIHNldFN0YXRlKDEpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHJ1bm5hYmxlIGNhbGxpbmcgYWNxdWlyZUludGVycnVwdGlibHkKKyAgICAgKi8KKyAgICBjbGFzcyBJbnRlcnJ1cHRpYmxlU3luY1J1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jOworICAgICAgICBJbnRlcnJ1cHRpYmxlU3luY1J1bm5hYmxlKE11dGV4IGwpIHsgc3luYyA9IGw7IH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzeW5jLmFjcXVpcmVJbnRlcnJ1cHRpYmx5KDEpOworICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgcnVubmFibGUgY2FsbGluZyBhY3F1aXJlSW50ZXJydXB0aWJseSB0aGF0IGV4cGVjdHMgdG8gYmUKKyAgICAgKiBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIGNsYXNzIEludGVycnVwdGVkU3luY1J1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jOworICAgICAgICBJbnRlcnJ1cHRlZFN5bmNSdW5uYWJsZShNdXRleCBsKSB7IHN5bmMgPSBsOyB9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luYy5hY3F1aXJlSW50ZXJydXB0aWJseSgxKTsKKyAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpc0hlbGRFeGNsdXNpdmVseSBpcyBmYWxzZSB1cG9uIGNvbnN0cnVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0hlbGRFeGNsdXNpdmVseSgpIHsgCisgICAgICAgIE11dGV4IHJsID0gbmV3IE11dGV4KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHJsLmlzSGVsZEV4Y2x1c2l2ZWx5KCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBhY3F1aXJpbmcgcmVsZWFzZWQgc3luYyBzdWNjZWVkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBY3F1aXJlKCkgeyAKKyAgICAgICAgTXV0ZXggcmwgPSBuZXcgTXV0ZXgoKTsKKyAgICAgICAgcmwuYWNxdWlyZSgxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShybC5pc0hlbGRFeGNsdXNpdmVseSgpKTsKKyAgICAgICAgcmwucmVsZWFzZSgxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmwuaXNIZWxkRXhjbHVzaXZlbHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdHJ5QWNxdWlyZSBvbiBhbiByZWxlYXNlZCBzeW5jIHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRyeUFjcXVpcmUoKSB7IAorICAgICAgICBNdXRleCBybCA9IG5ldyBNdXRleCgpOworICAgICAgICBhc3NlcnRUcnVlKHJsLnRyeUFjcXVpcmUoMSkpOworICAgICAgICBhc3NlcnRUcnVlKHJsLmlzSGVsZEV4Y2x1c2l2ZWx5KCkpOworICAgICAgICBybC5yZWxlYXNlKDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhc1F1ZXVlZFRocmVhZHMgcmVwb3J0cyB3aGV0aGVyIHRoZXJlIGFyZSB3YWl0aW5nIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0aGFzUXVldWVkVGhyZWFkcygpIHsgCisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRTeW5jUnVubmFibGUoc3luYykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlU3luY1J1bm5hYmxlKHN5bmMpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaGFzUXVldWVkVGhyZWFkcygpKTsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmhhc1F1ZXVlZFRocmVhZHMoKSk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNRdWV1ZWRUaHJlYWRzKCkpOworICAgICAgICAgICAgdDEuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmhhc1F1ZXVlZFRocmVhZHMoKSk7CisgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5oYXNRdWV1ZWRUaHJlYWRzKCkpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAvKioKKyAgICAgKiBpc1F1ZXVlZChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzUXVldWVkTlBFKCkgeyAKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luYy5pc1F1ZXVlZChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGlzUXVldWVkIHJlcG9ydHMgd2hldGhlciBhIHRocmVhZCBpcyBxdWV1ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzUXVldWVkKCkgeyAKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZFN5bmNSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGlibGVTeW5jUnVubmFibGUoc3luYykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5pc1F1ZXVlZCh0MSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5pc1F1ZXVlZCh0MikpOworICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaXNRdWV1ZWQodDEpKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmlzUXVldWVkKHQxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaXNRdWV1ZWQodDIpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaXNRdWV1ZWQodDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5pc1F1ZXVlZCh0MikpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaXNRdWV1ZWQodDEpKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShzeW5jLmlzUXVldWVkKHQyKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIGdldEZpcnN0UXVldWVkVGhyZWFkIHJldHVybnMgZmlyc3Qgd2FpdGluZyB0aHJlYWQgb3IgbnVsbCBpZiBub25lCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpcnN0UXVldWVkVGhyZWFkKCkgeyAKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZFN5bmNSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGlibGVTeW5jUnVubmFibGUoc3luYykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbChzeW5jLmdldEZpcnN0UXVldWVkVGhyZWFkKCkpOworICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModDEsIHN5bmMuZ2V0Rmlyc3RRdWV1ZWRUaHJlYWQoKSk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0MSwgc3luYy5nZXRGaXJzdFF1ZXVlZFRocmVhZCgpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModDIsIHN5bmMuZ2V0Rmlyc3RRdWV1ZWRUaHJlYWQoKSk7CisgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChzeW5jLmdldEZpcnN0UXVldWVkVGhyZWFkKCkpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKworICAgIC8qKgorICAgICAqIGhhc0NvbnRlbmRlZCByZXBvcnRzIGZhbHNlIGlmIG5vIHRocmVhZCBoYXMgZXZlciBibG9ja2VkLCBlbHNlIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQ29udGVuZGVkKCkgeyAKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZFN5bmNSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGlibGVTeW5jUnVubmFibGUoc3luYykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5oYXNDb250ZW5kZWQoKSk7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNDb250ZW5kZWQoKSk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNDb250ZW5kZWQoKSk7CisgICAgICAgICAgICB0MS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaGFzQ29udGVuZGVkKCkpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNDb250ZW5kZWQoKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIGdldFF1ZXVlZFRocmVhZHMgaW5jbHVkZXMgd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXVlZFRocmVhZHMoKSB7IAorICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGVkU3luY1J1bm5hYmxlKHN5bmMpKTsKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0aWJsZVN5bmNSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0UXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0UXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmdldFF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmdldFF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MikpOworICAgICAgICAgICAgdDEuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDIpKTsKKyAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0UXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIGdldEV4Y2x1c2l2ZVF1ZXVlZFRocmVhZHMgaW5jbHVkZXMgd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4Y2x1c2l2ZVF1ZXVlZFRocmVhZHMoKSB7IAorICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGVkU3luY1J1bm5hYmxlKHN5bmMpKTsKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0aWJsZVN5bmNSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0RXhjbHVzaXZlUXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0RXhjbHVzaXZlUXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRFeGNsdXNpdmVRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmdldEV4Y2x1c2l2ZVF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmdldEV4Y2x1c2l2ZVF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MikpOworICAgICAgICAgICAgdDEuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5nZXRFeGNsdXNpdmVRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRFeGNsdXNpdmVRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDIpKTsKKyAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0RXhjbHVzaXZlUXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIGdldFNoYXJlZFF1ZXVlZFRocmVhZHMgZG9lcyBub3QgaW5jbHVkZSBleGNsdXNpdmVseSB3YWl0aW5nIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hhcmVkUXVldWVkVGhyZWFkcygpIHsgCisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRTeW5jUnVubmFibGUoc3luYykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlU3luY1J1bm5hYmxlKHN5bmMpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRTaGFyZWRRdWV1ZWRUaHJlYWRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRTaGFyZWRRdWV1ZWRUaHJlYWRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmdldFNoYXJlZFF1ZXVlZFRocmVhZHMoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0U2hhcmVkUXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB0MS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0U2hhcmVkUXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmdldFNoYXJlZFF1ZXVlZFRocmVhZHMoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAvKioKKyAgICAgKiB0cnlBY3F1aXJlTmFub3MgaXMgaW50ZXJydXB0aWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0ZWRFeGNlcHRpb24yKCkgeyAKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOworICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy50cnlBY3F1aXJlTmFub3MoMSwgTUVESVVNX0RFTEFZX01TICogMTAwMCAqIDEwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVHJ5QWNxdWlyZSBvbiBleGNsdXNpdmVseSBoZWxkIHN5bmMgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ5QWNxdWlyZVdoZW5TeW5jZWQoKSB7IAorICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKHN5bmMudHJ5QWNxdWlyZSgxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogdHJ5QWNxdWlyZU5hbm9zIG9uIGFuIGV4Y2x1c2l2ZWx5IGhlbGQgc3luYyB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNxdWlyZU5hbm9zX1RpbWVvdXQoKSB7IAorICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShzeW5jLnRyeUFjcXVpcmVOYW5vcygxLCAxMDAwICogMTAwMCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKyAgICAKKyAgIAorICAgIC8qKgorICAgICAqIGdldFN0YXRlIGlzIHRydWUgd2hlbiBhY3F1aXJlZCBhbmQgZmFsc2Ugd2hlbiBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3RhdGUoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsKKyAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaXNIZWxkRXhjbHVzaXZlbHkoKSk7CisgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5pc0hlbGRFeGNsdXNpdmVseSgpKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5pc0hlbGRFeGNsdXNpdmVseSgpKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5pc0hlbGRFeGNsdXNpdmVseSgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGFjcXVpcmVJbnRlcnJ1cHRpYmx5IGlzIGludGVycnVwdGlibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVJbnRlcnJ1cHRpYmx5MSgpIHsgCisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsKKyAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGVkU3luY1J1bm5hYmxlKHN5bmMpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogYWNxdWlyZUludGVycnVwdGlibHkgc3VjY2VlZHMgd2hlbiByZWxlYXNlZCwgZWxzZSBpcyBpbnRlcnJ1cHRpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVJbnRlcnJ1cHRpYmx5MigpIHsKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmVJbnRlcnJ1cHRpYmx5KDEpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZFN5bmNSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmlzSGVsZEV4Y2x1c2l2ZWx5KCkpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogb3ducyBpcyB0cnVlIGZvciBhIGNvbmRpdGlvbiBjcmVhdGVkIGJ5IHN5bmMgZWxzZSBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPd25zKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0IGMgPSBzeW5jLm5ld0NvbmRpdGlvbigpOworICAgICAgICBmaW5hbCBNdXRleCBzeW5jMiA9IG5ldyBNdXRleCgpOworICAgICAgICBhc3NlcnRUcnVlKHN5bmMub3ducyhjKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHN5bmMyLm93bnMoYykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxpbmcgYXdhaXQgd2l0aG91dCBob2xkaW5nIHN5bmMgdGhyb3dzIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXRfSWxsZWdhbE1vbml0b3IoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsaW5nIHNpZ25hbCB3aXRob3V0IGhvbGRpbmcgc3luYyB0aHJvd3MgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYWxfSWxsZWdhbE1vbml0b3IoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjLnNpZ25hbCgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXROYW5vcyB3aXRob3V0IGEgc2lnbmFsIHRpbWVzIG91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdE5hbm9zX1RpbWVvdXQoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICBsb25nIHQgPSBjLmF3YWl0TmFub3MoMTAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodCA8PSAwKTsKKyAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgVGltZWQgYXdhaXQgd2l0aG91dCBhIHNpZ25hbCB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXRfVGltZW91dCgpIHsKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOyAgICAgICAgCisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gc3luYy5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGMuYXdhaXQoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGF3YWl0VW50aWwgd2l0aG91dCBhIHNpZ25hbCB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXRVbnRpbF9UaW1lb3V0KCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0IGMgPSBzeW5jLm5ld0NvbmRpdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgamF2YS51dGlsLkRhdGUgZCA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYy5hd2FpdFVudGlsKG5ldyBqYXZhLnV0aWwuRGF0ZShkLmdldFRpbWUoKSArIDEwKSkpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGF3YWl0IHJldHVybnMgd2hlbiBzaWduYWxsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXQoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGMuc2lnbmFsKCk7CisgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICB0LmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBoYXNXYWl0ZXJzIHRocm93cyBOUEUgaWYgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNXYWl0ZXJzTlBFKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jLmhhc1dhaXRlcnMobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0V2FpdFF1ZXVlTGVuZ3RoIHRocm93cyBOUEUgaWYgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0UXVldWVMZW5ndGhOUEUoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmMuZ2V0V2FpdFF1ZXVlTGVuZ3RoKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogZ2V0V2FpdGluZ1RocmVhZHMgdGhyb3dzIE5QRSBpZiBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdhaXRpbmdUaHJlYWRzTlBFKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jLmdldFdhaXRpbmdUaHJlYWRzKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogaGFzV2FpdGVycyB0aHJvd3MgSUFFIGlmIG5vdCBvd25lZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNXYWl0ZXJzSUFFKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gKHN5bmMubmV3Q29uZGl0aW9uKCkpOworICAgICAgICBmaW5hbCBNdXRleCBzeW5jMiA9IG5ldyBNdXRleCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luYzIuaGFzV2FpdGVycyhjKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzV2FpdGVycyB0aHJvd3MgSU1TRSBpZiBub3Qgc3luY2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1dhaXRlcnNJTVNFKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gKHN5bmMubmV3Q29uZGl0aW9uKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luYy5oYXNXYWl0ZXJzKGMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBnZXRXYWl0UXVldWVMZW5ndGggdGhyb3dzIElBRSBpZiBub3Qgb3duZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2FpdFF1ZXVlTGVuZ3RoSUFFKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gKHN5bmMubmV3Q29uZGl0aW9uKCkpOworICAgICAgICBmaW5hbCBNdXRleCBzeW5jMiA9IG5ldyBNdXRleCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luYzIuZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRXYWl0UXVldWVMZW5ndGggdGhyb3dzIElNU0UgaWYgbm90IHN5bmNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0UXVldWVMZW5ndGhJTVNFKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7CisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gKHN5bmMubmV3Q29uZGl0aW9uKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luYy5nZXRXYWl0UXVldWVMZW5ndGgoYyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGdldFdhaXRpbmdUaHJlYWRzIHRocm93cyBJQUUgaWYgbm90IG93bmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdhaXRpbmdUaHJlYWRzSUFFKCkgeworICAgICAgICBmaW5hbCBNdXRleCBzeW5jID0gbmV3IE11dGV4KCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0IGMgPSAoc3luYy5uZXdDb25kaXRpb24oKSk7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMyID0gbmV3IE11dGV4KCk7ICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmMyLmdldFdhaXRpbmdUaHJlYWRzKGMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRXYWl0aW5nVGhyZWFkcyB0aHJvd3MgSU1TRSBpZiBub3Qgc3luY2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdhaXRpbmdUaHJlYWRzSU1TRSgpIHsKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOyAgICAgICAgCisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gKHN5bmMubmV3Q29uZGl0aW9uKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luYy5nZXRXYWl0aW5nVGhyZWFkcyhjKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBoYXNXYWl0ZXJzIHJldHVybnMgdHJ1ZSB3aGVuIGEgdGhyZWFkIGlzIHdhaXRpbmcsIGVsc2UgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzV2FpdGVycygpIHsKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOyAgICAgICAgCisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gc3luYy5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2Uoc3luYy5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscygwLCBzeW5jLmdldFdhaXRRdWV1ZUxlbmd0aChjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3luYy5nZXRXYWl0UXVldWVMZW5ndGgoYykpOworICAgICAgICAgICAgYy5zaWduYWwoKTsKKyAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShzeW5jLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN5bmMuZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0V2FpdFF1ZXVlTGVuZ3RoIHJldHVybnMgbnVtYmVyIG9mIHdhaXRpbmcgdGhyZWFkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0UXVldWVMZW5ndGgoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShzeW5jLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKDAsIHN5bmMuZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShzeW5jLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKDEsIHN5bmMuZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBzeW5jLmdldFdhaXRRdWV1ZUxlbmd0aChjKSk7CisgICAgICAgICAgICBjLnNpZ25hbEFsbCgpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3luYy5nZXRXYWl0UXVldWVMZW5ndGgoYykpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgdDEuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0Mi5qb2luKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQxLmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0Mi5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldFdhaXRpbmdUaHJlYWRzIHJldHVybnMgb25seSBhbmQgYWxsIHdhaXRpbmcgdGhyZWFkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0aW5nVGhyZWFkcygpIHsKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOyAgICAgICAgCisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gc3luYy5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUoc3luYy5nZXRXYWl0aW5nVGhyZWFkcyhjKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShzeW5jLmdldFdhaXRpbmdUaHJlYWRzKGMpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRXYWl0aW5nVGhyZWFkcyhjKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5nZXRXYWl0aW5nVGhyZWFkcyhjKS5jb250YWlucyh0MSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmdldFdhaXRpbmdUaHJlYWRzKGMpLmNvbnRhaW5zKHQyKSk7CisgICAgICAgICAgICBjLnNpZ25hbEFsbCgpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuZ2V0V2FpdGluZ1RocmVhZHMoYykuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgIHQxLmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdDIuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0MS5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodDIuaXNBbGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogYXdhaXRVbmludGVycnVwdGlibHkgZG9lc24ndCBhYm9ydCBvbiBpbnRlcnJ1cHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXRVbmludGVycnVwdGlibHkoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgICAgICAgICBjLmF3YWl0VW5pbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICBjLnNpZ25hbCgpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgYXNzZXJ0KHQuaXNJbnRlcnJ1cHRlZCgpKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXQgaXMgaW50ZXJydXB0aWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdF9JbnRlcnJ1cHQoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQuaXNBbGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhd2FpdE5hbm9zIGlzIGludGVycnVwdGlibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXROYW5vc19JbnRlcnJ1cHQoKSB7CisgICAgICAgIGZpbmFsIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsgICAgICAgIAorICAgICAgICBmaW5hbCBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QgYyA9IHN5bmMubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXROYW5vcygxMDAwICogMTAwMCAqIDEwMDApOyAvLyAxIHNlYworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGF3YWl0VW50aWwgaXMgaW50ZXJydXB0aWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdFVudGlsX0ludGVycnVwdCgpIHsKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOyAgICAgICAgCisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gc3luYy5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkRhdGUgZCA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdFVudGlsKG5ldyBqYXZhLnV0aWwuRGF0ZShkLmdldFRpbWUoKSArIDEwMDAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLnJlbGVhc2UoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2lnbmFsQWxsIHdha2VzIHVwIGFsbCB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hbEFsbCgpIHsKKyAgICAgICAgZmluYWwgTXV0ZXggc3luYyA9IG5ldyBNdXRleCgpOyAgICAgICAgCisgICAgICAgIGZpbmFsIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCBjID0gc3luYy5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5hY3F1aXJlKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgICAgICBjLnNpZ25hbEFsbCgpOworICAgICAgICAgICAgc3luYy5yZWxlYXNlKDEpOworICAgICAgICAgICAgdDEuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0Mi5qb2luKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQxLmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0Mi5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgaW5kaWNhdGVzIGN1cnJlbnQgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIE11dGV4IHN5bmMgPSBuZXcgTXV0ZXgoKTsKKyAgICAgICAgU3RyaW5nIHVzID0gc3luYy50b1N0cmluZygpOworICAgICAgICBhc3NlcnRUcnVlKHVzLmluZGV4T2YoIlN0YXRlID0gMCIpID49IDApOworICAgICAgICBzeW5jLmFjcXVpcmUoMSk7CisgICAgICAgIFN0cmluZyBscyA9IHN5bmMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShscy5pbmRleE9mKCJTdGF0ZSA9IDEiKSA+PSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNlcmlhbGl6ZWQgQVFTIGRlc2VyaWFsaXplcyB3aXRoIGN1cnJlbnQgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgTXV0ZXggbCA9IG5ldyBNdXRleCgpOworICAgICAgICBsLmFjcXVpcmUoMSk7CisgICAgICAgIGFzc2VydFRydWUobC5pc0hlbGRFeGNsdXNpdmVseSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDAwKTsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShib3V0KSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QobCk7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShiaW4pKTsKKyAgICAgICAgICAgIE11dGV4IHIgPSAoTXV0ZXgpIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoci5pc0hlbGRFeGNsdXNpdmVseSgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0cnlSZWxlYXNlU2hhcmVkIHNldHRpbmcgc3RhdGUgY2hhbmdlcyBnZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdGF0ZVdpdGhSZWxlYXNlU2hhcmVkKCkgeworICAgICAgICBmaW5hbCBCb29sZWFuTGF0Y2ggbCA9IG5ldyBCb29sZWFuTGF0Y2goKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobC5pc1NpZ25hbGxlZCgpKTsKKyAgICAgICAgbC5yZWxlYXNlU2hhcmVkKDApOworICAgICAgICBhc3NlcnRUcnVlKGwuaXNTaWduYWxsZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVsZWFzZVNoYXJlZCBoYXMgbm8gZWZmZWN0IHdoZW4gYWxyZWFkeSBzaWduYWxsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsZWFzZVNoYXJlZCgpIHsKKyAgICAgICAgZmluYWwgQm9vbGVhbkxhdGNoIGwgPSBuZXcgQm9vbGVhbkxhdGNoKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGwuaXNTaWduYWxsZWQoKSk7CisgICAgICAgIGwucmVsZWFzZVNoYXJlZCgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsLmlzU2lnbmFsbGVkKCkpOworICAgICAgICBsLnJlbGVhc2VTaGFyZWQoMCk7CisgICAgICAgIGFzc2VydFRydWUobC5pc1NpZ25hbGxlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhY3F1aXJlU2hhcmVkSW50ZXJydXB0aWJseSByZXR1cm5zIGFmdGVyIHJlbGVhc2UsIGJ1dCBub3QgYmVmb3JlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVTaGFyZWRJbnRlcnJ1cHRpYmx5KCkgeworICAgICAgICBmaW5hbCBCb29sZWFuTGF0Y2ggbCA9IG5ldyBCb29sZWFuTGF0Y2goKTsKKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGwuaXNTaWduYWxsZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsLmFjcXVpcmVTaGFyZWRJbnRlcnJ1cHRpYmx5KDApOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShsLmlzU2lnbmFsbGVkKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsLmlzU2lnbmFsbGVkKCkpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGwucmVsZWFzZVNoYXJlZCgwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5pc1NpZ25hbGxlZCgpKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIGFjcXVpcmVTaGFyZWRUaW1lZCByZXR1cm5zIGFmdGVyIHJlbGVhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNxdWlyZVNoYXJlZFRpbWVkKCkgeworICAgICAgICBmaW5hbCBCb29sZWFuTGF0Y2ggbCA9IG5ldyBCb29sZWFuTGF0Y2goKTsKKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGwuaXNTaWduYWxsZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGwudHJ5QWNxdWlyZVNoYXJlZE5hbm9zKDAsIE1FRElVTV9ERUxBWV9NUyogMTAwMCAqIDEwMDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUobC5pc1NpZ25hbGxlZCgpKTsKKworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsLmlzU2lnbmFsbGVkKCkpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGwucmVsZWFzZVNoYXJlZCgwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5pc1NpZ25hbGxlZCgpKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBhY3F1aXJlU2hhcmVkSW50ZXJydXB0aWJseSB0aHJvd3MgSUUgaWYgaW50ZXJydXB0ZWQgYmVmb3JlIHJlbGVhc2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVTaGFyZWRJbnRlcnJ1cHRpYmx5X0ludGVycnVwdGVkRXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBCb29sZWFuTGF0Y2ggbCA9IG5ldyBCb29sZWFuTGF0Y2goKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShsLmlzU2lnbmFsbGVkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbC5hY3F1aXJlU2hhcmVkSW50ZXJydXB0aWJseSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsLmlzU2lnbmFsbGVkKCkpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFjcXVpcmVTaGFyZWRUaW1lZCB0aHJvd3MgSUUgaWYgaW50ZXJydXB0ZWQgYmVmb3JlIHJlbGVhc2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVTaGFyZWROYW5vc19JbnRlcnJ1cHRlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgQm9vbGVhbkxhdGNoIGwgPSBuZXcgQm9vbGVhbkxhdGNoKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UobC5pc1NpZ25hbGxlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwudHJ5QWNxdWlyZVNoYXJlZE5hbm9zKDAsIFNNQUxMX0RFTEFZX01TKiAxMDAwICogMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGwuaXNTaWduYWxsZWQoKSk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWNxdWlyZVNoYXJlZFRpbWVkIHRpbWVzIG91dCBpZiBub3QgcmVsZWFzZWQgYmVmb3JlIHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNxdWlyZVNoYXJlZE5hbm9zX1RpbWVvdXQoKSB7CisgICAgICAgIGZpbmFsIEJvb2xlYW5MYXRjaCBsID0gbmV3IEJvb2xlYW5MYXRjaCgpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGwuaXNTaWduYWxsZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShsLnRyeUFjcXVpcmVTaGFyZWROYW5vcygwLCBTTUFMTF9ERUxBWV9NUyogMTAwMCAqIDEwMDApKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGwuaXNTaWduYWxsZWQoKSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXJyYXlCbG9ja2luZ1F1ZXVlVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BcnJheUJsb2NraW5nUXVldWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGE2OTg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXJyYXlCbG9ja2luZ1F1ZXVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0NSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgQXJyYXlCbG9ja2luZ1F1ZXVlVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBcnJheUJsb2NraW5nUXVldWVUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBxdWV1ZSBvZiBnaXZlbiBzaXplIGNvbnRhaW5pbmcgY29uc2VjdXRpdmUKKyAgICAgKiBJbnRlZ2VycyAwIC4uLiBuLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlCbG9ja2luZ1F1ZXVlIHBvcHVsYXRlZFF1ZXVlKGludCBuKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZShuKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG4sIHEuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIEEgbmV3IHF1ZXVlIGhhcyB0aGUgaW5kaWNhdGVkIGNhcGFjaXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUsIG5ldyBBcnJheUJsb2NraW5nUXVldWUoU0laRSkucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIElBRSBpZiAgY2FwYWNpdHkgYXJndW1lbnQgbm9ucG9zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDApOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gbnVsbCBDb2xsZWN0aW9uIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDEsIHRydWUsIG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXppbmcgZnJvbSBDb2xsZWN0aW9uIG9mIG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKFNJWkUsIGZhbHNlLCBBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gQ29sbGVjdGlvbiB3aXRoIHNvbWUgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkUtMTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZShTSVpFLCBmYWxzZSwgQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemluZyBmcm9tIHRvbyBsYXJnZSBjb2xsZWN0aW9uIHRocm93cyBJQUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I2KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZSgxLCBmYWxzZSwgQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBjb250YWlucyBhbGwgZWxlbWVudHMgb2YgY29sbGVjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I3KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZShTSVpFLCB0cnVlLCBBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnBvbGwoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXVlIHRyYW5zaXRpb25zIGZyb20gZW1wdHkgdG8gZnVsbCB3aGVuIGVsZW1lbnRzIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RnVsbCgpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDIpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgIHEuYWRkKG9uZSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgcS5hZGQodHdvKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5vZmZlcih0aHJlZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbWFpbmluZ0NhcGFjaXR5IGRlY3JlYXNlcyBvbiBhZGQsIGluY3JlYXNlcyBvbiByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluaW5nQ2FwYWNpdHkoKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgcS5zaXplKCkpOworICAgICAgICAgICAgcS5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIG9mZmVyKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXJOdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDEpOworICAgICAgICAgICAgcS5vZmZlcihudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqICBhZGQobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDEpOworICAgICAgICAgICAgcS5hZGQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPZmZlciBzdWNjZWVkcyBpZiBub3QgZnVsbDsgZmFpbHMgaWYgZnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlcigpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDEpOworICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIoemVybykpOworICAgICAgICBhc3NlcnRGYWxzZShxLm9mZmVyKG9uZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBzdWNjZWVkcyBpZiBub3QgZnVsbDsgdGhyb3dzIElTRSBpZiBmdWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmFkZChuZXcgSW50ZWdlcihpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBxLmFkZChuZXcgSW50ZWdlcihTSVpFKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqICBhZGRBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDEpOworICAgICAgICAgICAgcS5hZGRBbGwobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZEFsbCh0aGlzKSB0aHJvd3MgSUFFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbFNlbGYoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgcS5hZGRBbGwocSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBhZGRBbGwgb2YgYSBjb2xsZWN0aW9uIHdpdGggbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgcS5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKyAgICAvKioKKyAgICAgKiBhZGRBbGwgb2YgYSBjb2xsZWN0aW9uIHdpdGggYW55IG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRSBhZnRlcgorICAgICAqIHBvc3NpYmx5IGFkZGluZyBzb21lIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFLTE7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIGFkZEFsbCB0aHJvd3MgSVNFIGlmIG5vdCBlbm91Z2ggcm9vbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDEpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIFF1ZXVlIGNvbnRhaW5zIGFsbCBlbGVtZW50cywgaW4gdHJhdmVyc2FsIG9yZGVyLCBvZiBzdWNjZXNzZnVsIGFkZEFsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGVtcHR5ID0gbmV3IEludGVnZXJbMF07CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocS5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbXB0eSkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRzKSkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEucG9sbCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogIHB1dChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHRlc3RQdXROdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgcS5wdXQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IAorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCisgICAgICogYWxsIGVsZW1lbnRzIHN1Y2Nlc3NmdWxseSBwdXQgYXJlIGNvbnRhaW5lZAorICAgICAqLworICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgSW50ZWdlciBJID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICAgICAgIHEucHV0KEkpOworICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnMoSSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwdXQgYmxvY2tzIGludGVycnVwdGlibHkgaWYgZnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1B1dCgpIHsKKyAgICAgICAgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFkZGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgSW50ZWdlcihTSVpFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHMoYWRkZWQsIFNJWkUpOworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7IAorICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dCBibG9ja3Mgd2FpdGluZyBmb3IgdGFrZSB3aGVuIGZ1bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0V2l0aFRha2UoKSB7CisgICAgICAgIGZpbmFsIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBhZGRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2FkZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShhZGRlZCA+PSAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHEudGFrZSgpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBvZmZlciB0aW1lcyBvdXQgaWYgZnVsbCBhbmQgZWxlbWVudHMgbm90IHRha2VuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkT2ZmZXIoKSB7CisgICAgICAgIGZpbmFsIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKHEub2ZmZXIobmV3IE9iamVjdCgpLCBTSE9SVF9ERUxBWV9NUy8yLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEub2ZmZXIobmV3IE9iamVjdCgpLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRha2UgcmV0cmlldmVzIGVsZW1lbnRzIGluIEZJRk8gb3JkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFrZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS50YWtlKCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHRha2UgYmxvY2tzIGludGVycnVwdGlibHkgd2hlbiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUYWtlRnJvbUVtcHR5KCkgeworICAgICAgICBmaW5hbCBBcnJheUJsb2NraW5nUXVldWUgcSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWUoMik7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcS50YWtlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgcmVtb3ZlcyBleGlzdGluZyBlbGVtZW50cyB1bnRpbCBlbXB0eSwgdGhlbiBibG9ja3MgaW50ZXJydXB0aWJseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1Rha2UoKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnRha2UoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBxLnRha2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7IAorICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBwb2xsIHN1Y2NlZWRzIHVubGVzcyBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQb2xsKCkgeworICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBvbGwoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgcG9vbCB3aXRoIHplcm8gdGltZW91dCBzdWNjZWVkcyB3aGVuIG5vbi1lbXB0eSwgZWxzZSB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRQb2xsMCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5wb2xsKDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpLmludFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgcG9vbCB3aXRoIG5vbnplcm8gdGltZW91dCBzdWNjZWVkcyB3aGVuIG5vbi1lbXB0eSwgZWxzZSB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRQb2xsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpLmludFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVycnVwdGVkIHRpbWVkIHBvbGwgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluc3RlYWQgb2YKKyAgICAgKiByZXR1cm5pbmcgdGltZW91dCBzdGF0dXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0ZWRUaW1lZFBvbGwoKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0TnVsbChxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOyAKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICB0aW1lZCBwb2xsIGJlZm9yZSBhIGRlbGF5ZWQgb2ZmZXIgZmFpbHM7IGFmdGVyIG9mZmVyIHN1Y2NlZWRzOworICAgICAqICBvbiBpbnRlcnJ1cHRpb24gdGhyb3dzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkUG9sbFdpdGhPZmZlcigpIHsKKyAgICAgICAgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDIpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydE51bGwocS5wb2xsKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucG9sbChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wb2xsKExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKHplcm8sIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAgCisKKworICAgIC8qKgorICAgICAqIHBlZWsgcmV0dXJucyBuZXh0IGVsZW1lbnQsIG9yIG51bGwgaWYgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVlaygpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5wZWVrKCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgcS5wb2xsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucGVlaygpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaSAhPSAoKEludGVnZXIpcS5wZWVrKCkpLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE51bGwocS5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVsZW1lbnQgcmV0dXJucyBuZXh0IGVsZW1lbnQsIG9yIHRocm93cyBOU0VFIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnQoKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEuZWxlbWVudCgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHEucG9sbCgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmVsZW1lbnQoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgcmVtb3ZlcyBuZXh0IGVsZW1lbnQsIG9yIHRocm93cyBOU0VFIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5yZW1vdmUoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlKHgpIHJlbW92ZXMgeCBhbmQgcmV0dXJucyB0cnVlIGlmIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudCgpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBTSVpFOyBpKz0yKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKz0yKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLnJlbW92ZShuZXcgSW50ZWdlcihpKzEpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBjb250YWlucyh4KSByZXBvcnRzIHRydWUgd2hlbiBlbGVtZW50cyBhZGRlZCBidXQgbm90IHlldCByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgeworICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnMobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsZWFyIHJlbW92ZXMgYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBxLmNsZWFyKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0laRSwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgcS5hZGQob25lKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBxLmNsZWFyKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnRhaW5zQWxsKGMpIGlzIHRydWUgd2hlbiBjIGNvbnRhaW5zIGEgc3Vic2V0IG9mIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgeworICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnNBbGwocCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocC5jb250YWluc0FsbChxKSk7CisgICAgICAgICAgICBwLmFkZChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmNvbnRhaW5zQWxsKHEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXRhaW5BbGwoYykgcmV0YWlucyBvbmx5IHRob3NlIGVsZW1lbnRzIG9mIGMgYW5kIHJlcG9ydHMgdHJ1ZSBpZiBjaGFuZ2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHAgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IHEucmV0YWluQWxsKHApOworICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShjaGFuZ2VkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNoYW5nZWQpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnNBbGwocCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUtaSwgcS5zaXplKCkpOworICAgICAgICAgICAgcC5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZUFsbChjKSByZW1vdmVzIG9ubHkgdGhvc2UgZWxlbWVudHMgb2YgYyBhbmQgcmVwb3J0cyB0cnVlIGlmIGNoYW5nZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgeworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBJID0gKEludGVnZXIpKHAucmVtb3ZlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnMoSSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIHRvQXJyYXkgY29udGFpbnMgYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIE9iamVjdFtdIG8gPSBxLnRvQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob1tpXSwgcS50YWtlKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b0FycmF5KGEpIGNvbnRhaW5zIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgaW50cyA9IChJbnRlZ2VyW10pcS50b0FycmF5KGludHMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGludHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEudGFrZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogdG9BcnJheShudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXlfQmFkQXJnKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIE9iamVjdCBvW10gPSBxLnRvQXJyYXkobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b0FycmF5IHdpdGggaW5jb21wYXRpYmxlIGFycmF5IHR5cGUgdGhyb3dzIENDRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MV9CYWRBcmcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgT2JqZWN0IG9bXSA9IHEudG9BcnJheShuZXcgU3RyaW5nWzEwXSApOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChBcnJheVN0b3JlRXhjZXB0aW9uICBzdWNjZXNzKXt9CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogaXRlcmF0b3IgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKXsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaXQubmV4dCgpLCBxLnRha2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIGl0ZXJhdG9yLnJlbW92ZSByZW1vdmVzIGN1cnJlbnQgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvclJlbW92ZSAoKSB7CisgICAgICAgIGZpbmFsIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZSgzKTsKKyAgICAgICAgcS5hZGQodHdvKTsKKyAgICAgICAgcS5hZGQob25lKTsKKyAgICAgICAgcS5hZGQodGhyZWUpOworCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAKKyAgICAgICAgaXQgPSBxLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhpdC5uZXh0KCksIG9uZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpdC5uZXh0KCksIHRocmVlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXQuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpdGVyYXRvciBvcmRlcmluZyBpcyBGSUZPCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT3JkZXJpbmcoKSB7CisgICAgICAgIGZpbmFsIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZSgzKTsKKyAgICAgICAgcS5hZGQob25lKTsKKyAgICAgICAgcS5hZGQodHdvKTsKKyAgICAgICAgcS5hZGQodGhyZWUpOworCisgICAgICAgIGFzc2VydEVxdWFscygicXVldWUgc2hvdWxkIGJlIGZ1bGwiLCAwLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworCisgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaW50IGkgPSAoKEludGVnZXIpKGl0Lm5leHQoKSkpLmludFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKytrLCBpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMywgayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpY2F0aW9ucyBkbyBub3QgY2F1c2UgaXRlcmF0b3JzIHRvIGZhaWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vha2x5Q29uc2lzdGVudEl0ZXJhdGlvbiAoKSB7CisgICAgICAgIGZpbmFsIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZSgzKTsKKyAgICAgICAgcS5hZGQob25lKTsKKyAgICAgICAgcS5hZGQodHdvKTsKKyAgICAgICAgcS5hZGQodGhyZWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgaXQubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5zaXplKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgY29udGFpbnMgdG9TdHJpbmdzIG9mIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBTdHJpbmcgcyA9IHEudG9TdHJpbmcoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy5pbmRleE9mKFN0cmluZy52YWx1ZU9mKGkpKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0gICAgICAgIAorCisKKyAgICAvKioKKyAgICAgKiBvZmZlciB0cmFuc2ZlcnMgZWxlbWVudHMgYWNyb3NzIEV4ZWN1dG9yIHRhc2tzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE9mZmVySW5FeGVjdXRvcigpIHsKKyAgICAgICAgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlKDIpOworICAgICAgICBxLmFkZChvbmUpOworICAgICAgICBxLmFkZCh0d28pOworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDIpOworICAgICAgICBleGVjdXRvci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShxLm9mZmVyKHRocmVlKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShxLm9mZmVyKHRocmVlLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKG9uZSwgcS50YWtlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIGpvaW5Qb29sKGV4ZWN1dG9yKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIHBvbGwgcmV0cmlldmVzIGVsZW1lbnRzIGFjcm9zcyBFeGVjdXRvciB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGxJbkV4ZWN1dG9yKCkgeworICAgICAgICBmaW5hbCBBcnJheUJsb2NraW5nUXVldWUgcSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWUoMik7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMik7CisgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydE51bGwocS5wb2xsKCkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUobnVsbCAhPSBxLnBvbGwoTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgICAgIHEucHV0KG9uZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgam9pblBvb2woZXhlY3V0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZGVzZXJpYWxpemVkIHNlcmlhbGl6ZWQgcXVldWUgaGFzIHNhbWUgZWxlbWVudHMgaW4gc2FtZSBvcmRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgeworICAgICAgICBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChxKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHIgPSAoQXJyYXlCbG9ja2luZ1F1ZXVlKWluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhxLnNpemUoKSwgci5zaXplKCkpOworICAgICAgICAgICAgd2hpbGUgKCFxLmlzRW1wdHkoKSkgCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHEucmVtb3ZlKCksIHIucmVtb3ZlKCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8obnVsbCkgdGhyb3dzIE5QRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub051bGwoKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8obnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8odGhpcykgdGhyb3dzIElBRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub1NlbGYoKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8ocSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKGMpIGVtcHRpZXMgcXVldWUgaW50byBhbm90aGVyIGNvbGxlY3Rpb24gYworICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5UbygpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHEuZHJhaW5UbyhsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHEuc2l6ZSgpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwuc2l6ZSgpLCBTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0KGkpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5UbyBlbXB0aWVzIGZ1bGwgcXVldWUsIHVuYmxvY2tpbmcgYSB3YWl0aW5nIHB1dC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9XaXRoQWN0aXZlUHV0KCkgeworICAgICAgICBmaW5hbCBBcnJheUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBJbnRlZ2VyKFNJWkUrMSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7IAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5zaXplKCkgPj0gU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0KGkpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5zaXplKCkgKyBsLnNpemUoKSA+PSBTSVpFKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKG51bGwsIG4pIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9OdWxsTigpIHsKKyAgICAgICAgQXJyYXlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhudWxsLCAwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5Ubyh0aGlzLCBuKSB0aHJvd3MgSUFFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvU2VsZk4oKSB7CisgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8ocSwgMCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKGMsIG4pIGVtcHRpZXMgZmlyc3QgbWF4IHtuLCBzaXplfSBlbGVtZW50cyBvZiBxdWV1ZSBpbnRvIGMKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9OKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkUgKyAyOyArK2kpIHsKKyAgICAgICAgICAgIEFycmF5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsLCBpKTsKKyAgICAgICAgICAgIGludCBrID0gKGkgPCBTSVpFKT8gaSA6IFNJWkU7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIFNJWkUtayk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5zaXplKCksIGspOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrOyArK2opIAorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldChqKSwgbmV3IEludGVnZXIoaikpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljQm9vbGVhblRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljQm9vbGVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzAzNTdhCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNCb29sZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLio7CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgQXRvbWljQm9vbGVhblRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBdG9taWNCb29sZWFuVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdG8gZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIEF0b21pY0Jvb2xlYW4gYWkgPSBuZXcgQXRvbWljQm9vbGVhbih0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlZmF1bHQgY29uc3RydWN0ZWQgaW5pdGlhbGl6ZXMgdG8gZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyKCkgeworICAgICAgICBBdG9taWNCb29sZWFuIGFpID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0KCkgeworICAgICAgICBBdG9taWNCb29sZWFuIGFpID0gbmV3IEF0b21pY0Jvb2xlYW4odHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLGFpLmdldCgpKTsKKyAgICAgICAgYWkuc2V0KGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLGFpLmdldCgpKTsKKyAgICAgICAgYWkuc2V0KHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSxhaS5nZXQoKSk7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWUgaWYgZXF1YWwgdG8gZXhwZWN0ZWQgZWxzZSBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlQW5kU2V0KCkgeworICAgICAgICBBdG9taWNCb29sZWFuIGFpID0gbmV3IEF0b21pY0Jvb2xlYW4odHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldCh0cnVlLGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSxhaS5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChmYWxzZSxmYWxzZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsYWkuZ2V0KCkpOworICAgICAgICBhc3NlcnRGYWxzZShhaS5jb21wYXJlQW5kU2V0KHRydWUsZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoKGFpLmdldCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChmYWxzZSx0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhbm90aGVyIHdhaXRpbmcgZm9yIHZhbHVlCisgICAgICogdG8gc3VjY2VlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlQW5kU2V0SW5NdWx0aXBsZVRocmVhZHMoKSB7CisgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gYWkgPSBuZXcgQXRvbWljQm9vbGVhbih0cnVlKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCFhaS5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGVhdGVkIHdlYWtDb21wYXJlQW5kU2V0IHN1Y2NlZWRzIGluIGNoYW5naW5nIHZhbHVlIHdoZW4gZXF1YWwKKyAgICAgKiB0byBleHBlY3RlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vha0NvbXBhcmVBbmRTZXQoKSB7CisgICAgICAgIEF0b21pY0Jvb2xlYW4gYWkgPSBuZXcgQXRvbWljQm9vbGVhbih0cnVlKTsKKyAgICAgICAgd2hpbGUoIWFpLndlYWtDb21wYXJlQW5kU2V0KHRydWUsZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLGFpLmdldCgpKTsKKyAgICAgICAgd2hpbGUoIWFpLndlYWtDb21wYXJlQW5kU2V0KGZhbHNlLGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSxhaS5nZXQoKSk7CisgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldChmYWxzZSx0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmRTZXQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgc2V0cyB0byBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXQoKSB7CisgICAgICAgIEF0b21pY0Jvb2xlYW4gYWkgPSBuZXcgQXRvbWljQm9vbGVhbih0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsYWkuZ2V0QW5kU2V0KGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSxhaS5nZXRBbmRTZXQoZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLGFpLmdldEFuZFNldCh0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhIGRlc2VyaWFsaXplZCBzZXJpYWxpemVkIGF0b21pYyBob2xkcyBzYW1lIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB7CisgICAgICAgIEF0b21pY0Jvb2xlYW4gbCA9IG5ldyBBdG9taWNCb29sZWFuKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGwuc2V0KHRydWUpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDAwKTsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShib3V0KSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QobCk7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShiaW4pKTsKKyAgICAgICAgICAgIEF0b21pY0Jvb2xlYW4gciA9IChBdG9taWNCb29sZWFuKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5nZXQoKSwgci5nZXQoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvU3RyaW5nIHJldHVybnMgY3VycmVudCB2YWx1ZS4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBBdG9taWNCb29sZWFuIGFpID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsgCisgICAgICAgIGFzc2VydEVxdWFscyhhaS50b1N0cmluZygpLCBCb29sZWFuLnRvU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIGFpLnNldCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFpLnRvU3RyaW5nKCksIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNJbnRlZ2VyQXJyYXlUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY0ludGVnZXJBcnJheVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDEzZmNmCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNJbnRlZ2VyQXJyYXlUZXN0LmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBBdG9taWNJbnRlZ2VyQXJyYXlUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBdG9taWNJbnRlZ2VyQXJyYXlUZXN0LmNsYXNzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYXJyYXkgb2YgZ2l2ZW4gc2l6ZSB3aXRoIGFsbCBlbGVtZW50cyB6ZXJvCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyQXJyYXkgYWkgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5nZXQoaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHdpdGggbnVsbCBhcnJheSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMk5QRSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludFtdIGEgPSBudWxsOworICAgICAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IGFpID0gbmV3IEF0b21pY0ludGVnZXJBcnJheShhKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHdpdGggYXJyYXkgaXMgb2Ygc2FtZSBzaXplIGFuZCBoYXMgYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpIHsKKyAgICAgICAgaW50W10gYSA9IHsgMTcsIDMsIC00MiwgOTksIC03fTsKKyAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IGFpID0gbmV3IEF0b21pY0ludGVnZXJBcnJheShhKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEubGVuZ3RoLCBhaS5sZW5ndGgoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYVtpXSwgYWkuZ2V0KGkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYW5kIHNldCBmb3Igb3V0IG9mIGJvdW5kIGluZGljZXMgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleGluZygpeworICAgICAgICBBdG9taWNJbnRlZ2VyQXJyYXkgYWkgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KFNJWkUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWkuZ2V0KFNJWkUpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpLmdldCgtMSk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYWkuc2V0KFNJWkUsIDApOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpLnNldCgtMSwgMCk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHNldCBhdCBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXQoKSB7CisgICAgICAgIEF0b21pY0ludGVnZXJBcnJheSBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGksIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFpLnNldChpLCAyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmdldChpKSk7CisgICAgICAgICAgICBhaS5zZXQoaSwgLTMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0zLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IHN1Y2NlZWRzIGluIGNoYW5naW5nIHZhbHVlIGlmIGVxdWFsIHRvIGV4cGVjdGVkIGVsc2UgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IGFpID0gbmV3IEF0b21pY0ludGVnZXJBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQoaSwgMSwyKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQoaSwgMiwtNCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC00LGFpLmdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShhaS5jb21wYXJlQW5kU2V0KGksIC01LDcpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCg3ID09IGFpLmdldChpKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KGksIC00LDcpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg3LGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhbm90aGVyIHdhaXRpbmcgZm9yIHZhbHVlCisgICAgICogdG8gc3VjY2VlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlQW5kU2V0SW5NdWx0aXBsZVRocmVhZHMoKSB7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXJBcnJheSBhID0gbmV3IEF0b21pY0ludGVnZXJBcnJheSgxKTsKKyAgICAgICAgYS5zZXQoMCwgMSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSghYS5jb21wYXJlQW5kU2V0KDAsIDIsIDMpKSBUaHJlYWQueWllbGQoKTsKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGEuY29tcGFyZUFuZFNldCgwLCAxLCAyKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYS5nZXQoMCksIDMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXBlYXRlZCB3ZWFrQ29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSB3aGVuIGVxdWFsCisgICAgICogdG8gZXhwZWN0ZWQgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdlYWtDb21wYXJlQW5kU2V0KCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyQXJyYXkgYWkgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpLCAxKTsKKyAgICAgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldChpLCAxLDIpKTsKKyAgICAgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldChpLCAyLC00KSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTQsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldChpLCAtNCw3KSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNyxhaS5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGdldEFuZFNldCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBzZXRzIHRvIGdpdmVuIHZhbHVlIGF0IGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFNldCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IGFpID0gbmV3IEF0b21pY0ludGVnZXJBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmRTZXQoaSwwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5nZXRBbmRTZXQoaSwtMTApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMTAsYWkuZ2V0QW5kU2V0KGksMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGdldEFuZEFkZCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBhZGRzIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZEFkZCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IGFpID0gbmV3IEF0b21pY0ludGVnZXJBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmRBZGQoaSwyKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMyxhaS5nZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYWkuZ2V0QW5kQWRkKGksLTQpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QW5kRGVjcmVtZW50IHJldHVybnMgcHJldmlvdXMgdmFsdWUgYW5kIGRlY3JlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kRGVjcmVtZW50KCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyQXJyYXkgYWkgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpLCAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmdldEFuZERlY3JlbWVudChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5nZXRBbmREZWNyZW1lbnQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldEFuZERlY3JlbWVudChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmRJbmNyZW1lbnQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgaW5jcmVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRJbmNyZW1lbnQoKSB7CisgICAgICAgIEF0b21pY0ludGVnZXJBcnJheSBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGksIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0QW5kSW5jcmVtZW50KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmdldChpKSk7CisgICAgICAgICAgICBhaS5zZXQoaSwtMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTIsYWkuZ2V0QW5kSW5jcmVtZW50KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5nZXRBbmRJbmNyZW1lbnQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZ2V0QW5kSW5jcmVtZW50KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgYWRkQW5kR2V0IGFkZHMgZ2l2ZW4gdmFsdWUgdG8gY3VycmVudCwgYW5kIHJldHVybnMgY3VycmVudCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbmRHZXQoKSB7CisgICAgICAgIEF0b21pY0ludGVnZXJBcnJheSBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGksIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYWkuYWRkQW5kR2V0KGksMikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5hZGRBbmRHZXQoaSwtNCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWNyZW1lbnRBbmRHZXQgZGVjcmVtZW50cyBhbmQgcmV0dXJucyBjdXJyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY3JlbWVudEFuZEdldCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IGFpID0gbmV3IEF0b21pY0ludGVnZXJBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5kZWNyZW1lbnRBbmRHZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmRlY3JlbWVudEFuZEdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTIsYWkuZGVjcmVtZW50QW5kR2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMixhaS5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGluY3JlbWVudEFuZEdldCBpbmNyZW1lbnRzIGFuZCByZXR1cm5zIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50QW5kR2V0KCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyQXJyYXkgYWkgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpLCAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmluY3JlbWVudEFuZEdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMixhaS5nZXQoaSkpOworICAgICAgICAgICAgYWkuc2V0KGksIC0yKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5pbmNyZW1lbnRBbmRHZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuaW5jcmVtZW50QW5kR2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmluY3JlbWVudEFuZEdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGludCBDT1VOVERPV04gPSAxMDAwMDA7CisgICAgCisgICAgY2xhc3MgQ291bnRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlckFycmF5IGFpOworICAgICAgICB2b2xhdGlsZSBpbnQgY291bnRzOworICAgICAgICBDb3VudGVyKEF0b21pY0ludGVnZXJBcnJheSBhKSB7IGFpID0gYTsgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFpLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYgPSBhaS5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUodiA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpLmNvbXBhcmVBbmRTZXQoaSwgdiwgdi0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2NvdW50czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdWx0aXBsZSB0aHJlYWRzIHVzaW5nIHNhbWUgYXJyYXkgb2YgY291bnRlcnMgc3VjY2Vzc2Z1bGx5CisgICAgICogdXBkYXRlIGEgbnVtYmVyIG9mIHRpbWVzIGVxdWFsIHRvIHRvdGFsIGNvdW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvdW50aW5nSW5NdWx0aXBsZVRocmVhZHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyQXJyYXkgYWkgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KFNJWkUpOyAKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSAKKyAgICAgICAgICAgICAgICBhaS5zZXQoaSwgQ09VTlRET1dOKTsKKyAgICAgICAgICAgIENvdW50ZXIgYzEgPSBuZXcgQ291bnRlcihhaSk7CisgICAgICAgICAgICBDb3VudGVyIGMyID0gbmV3IENvdW50ZXIoYWkpOworICAgICAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChjMSk7CisgICAgICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKGMyKTsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGMxLmNvdW50cytjMi5jb3VudHMsIFNJWkUgKiBDT1VOVERPV04pOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGEgZGVzZXJpYWxpemVkIHNlcmlhbGl6ZWQgYXJyYXkgaG9sZHMgc2FtZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IGwgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIAorICAgICAgICAgICAgbC5zZXQoaSwgLWkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChsKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgQXRvbWljSW50ZWdlckFycmF5IHIgPSAoQXRvbWljSW50ZWdlckFycmF5KSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldChpKSwgci5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRvU3RyaW5nIHJldHVybnMgY3VycmVudCB2YWx1ZS4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBpbnRbXSBhID0geyAxNywgMywgLTQyLCA5OSwgLTd9OworICAgICAgICBBdG9taWNJbnRlZ2VyQXJyYXkgYWkgPSBuZXcgQXRvbWljSW50ZWdlckFycmF5KGEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGEpLCBhaS50b1N0cmluZygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wM2ZkMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICB2b2xhdGlsZSBpbnQgeCA9IDA7CisgICAgaW50IHc7CisgICAgbG9uZyB6OworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdGlvbiB3aXRoIG5vbi1leGlzdGVudCBmaWVsZCB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlcjxBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdD4gCisgICAgICAgICAgICAgICAgYSA9IEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcgorICAgICAgICAgICAgICAgIChBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgInkiKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcnQpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0aW9uIHdpdGggZmllbGQgbm90IG9mIGdpdmVuIHR5cGUgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyKCkgeworICAgICAgICB0cnl7CisgICAgICAgICAgICBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0PiAKKyAgICAgICAgICAgICAgICBhID0gQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlci5uZXdVcGRhdGVyCisgICAgICAgICAgICAgICAgKEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieiIpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBydCkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3Rpb24gd2l0aCBub24tdm9sYXRpbGUgZmllbGQgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IzKCkgeworICAgICAgICB0cnl7CisgICAgICAgICAgICBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0PiAKKyAgICAgICAgICAgICAgICBhID0gQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlci5uZXdVcGRhdGVyCisgICAgICAgICAgICAgICAgKEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAidyIpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBydCkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHJldHVybnMgdGhlIGxhc3QgdmFsdWUgc2V0IG9yIGFzc2lnbmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNldCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlcjxBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXQodGhpcykpOworICAgICAgICBhLnNldCh0aGlzLDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMixhLmdldCh0aGlzKSk7CisgICAgICAgIGEuc2V0KHRoaXMsLTMpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTMsYS5nZXQodGhpcykpOworICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSBpZiBlcXVhbCB0byBleHBlY3RlZCBlbHNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXQoKSB7CisgICAgICAgIEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXI8QXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3Q+IGE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhID0gQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeCA9IDE7CisgICAgICAgIGFzc2VydFRydWUoYS5jb21wYXJlQW5kU2V0KHRoaXMsMSwyKSk7CisgICAgICAgIGFzc2VydFRydWUoYS5jb21wYXJlQW5kU2V0KHRoaXMsMiwtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsYS5nZXQodGhpcykpOworICAgICAgICBhc3NlcnRGYWxzZShhLmNvbXBhcmVBbmRTZXQodGhpcywtNSw3KSk7CisgICAgICAgIGFzc2VydEZhbHNlKCg3ID09IGEuZ2V0KHRoaXMpKSk7CisgICAgICAgIGFzc2VydFRydWUoYS5jb21wYXJlQW5kU2V0KHRoaXMsLTQsNykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNyxhLmdldCh0aGlzKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhbm90aGVyIHdhaXRpbmcgZm9yIHZhbHVlCisgICAgICogdG8gc3VjY2VlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlQW5kU2V0SW5NdWx0aXBsZVRocmVhZHMoKSB7CisgICAgICAgIHggPSAxOworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0PmE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhID0gQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIWEuY29tcGFyZUFuZFNldChBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdC50aGlzLCAyLCAzKSkgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhLmNvbXBhcmVBbmRTZXQodGhpcywgMSwgMikpOworICAgICAgICAgICAgdC5qb2luKExPTkdfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGEuZ2V0KHRoaXMpLCAzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwZWF0ZWQgd2Vha0NvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWUgd2hlbiBlcXVhbAorICAgICAqIHRvIGV4cGVjdGVkIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWFrQ29tcGFyZUFuZFNldCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlcjxBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgd2hpbGUoIWEud2Vha0NvbXBhcmVBbmRTZXQodGhpcywxLDIpKTsKKyAgICAgICAgd2hpbGUoIWEud2Vha0NvbXBhcmVBbmRTZXQodGhpcywyLC00KSk7CisgICAgICAgIGFzc2VydEVxdWFscygtNCxhLmdldCh0aGlzKSk7CisgICAgICAgIHdoaWxlKCFhLndlYWtDb21wYXJlQW5kU2V0KHRoaXMsLTQsNykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNyxhLmdldCh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIGdldEFuZFNldCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBzZXRzIHRvIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFNldCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlcjxBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXRBbmRTZXQodGhpcywgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxhLmdldEFuZFNldCh0aGlzLC0xMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEwLGEuZ2V0QW5kU2V0KHRoaXMsMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEFuZEFkZCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBhZGRzIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZEFkZCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlcjxBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXRBbmRBZGQodGhpcywyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYS5nZXRBbmRBZGQodGhpcywtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYS5nZXQodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEFuZERlY3JlbWVudCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBkZWNyZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZERlY3JlbWVudCgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlcjxBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXRBbmREZWNyZW1lbnQodGhpcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxhLmdldEFuZERlY3JlbWVudCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmdldEFuZERlY3JlbWVudCh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QW5kSW5jcmVtZW50IHJldHVybnMgcHJldmlvdXMgdmFsdWUgYW5kIGluY3JlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kSW5jcmVtZW50KCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0PiBhOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgIngiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHggPSAxOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhLmdldEFuZEluY3JlbWVudCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgYS5zZXQodGhpcywtMik7CisgICAgICAgIGFzc2VydEVxdWFscygtMixhLmdldEFuZEluY3JlbWVudCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmdldEFuZEluY3JlbWVudCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLGEuZ2V0QW5kSW5jcmVtZW50KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXQodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZEFuZEdldCBhZGRzIGdpdmVuIHZhbHVlIHRvIGN1cnJlbnQsIGFuZCByZXR1cm5zIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5kR2V0KCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0PiBhOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgIngiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHggPSAxOworICAgICAgICBhc3NlcnRFcXVhbHMoMyxhLmFkZEFuZEdldCh0aGlzLDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYS5nZXQodGhpcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYS5hZGRBbmRHZXQodGhpcywtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYS5nZXQodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlY3JlbWVudEFuZEdldCBkZWNyZW1lbnRzIGFuZCByZXR1cm5zIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50QW5kR2V0KCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0PiBhOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgIngiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHggPSAxOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxhLmRlY3JlbWVudEFuZEdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmRlY3JlbWVudEFuZEdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMixhLmRlY3JlbWVudEFuZEdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMixhLmdldCh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW5jcmVtZW50QW5kR2V0IGluY3JlbWVudHMgYW5kIHJldHVybnMgY3VycmVudCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNyZW1lbnRBbmRHZXQoKSB7CisgICAgICAgIEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXI8QXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3Q+IGE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhID0gQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeCA9IDE7CisgICAgICAgIGFzc2VydEVxdWFscygyLGEuaW5jcmVtZW50QW5kR2V0KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsYS5nZXQodGhpcykpOworICAgICAgICBhLnNldCh0aGlzLC0yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGEuaW5jcmVtZW50QW5kR2V0KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYS5pbmNyZW1lbnRBbmRHZXQodGhpcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhLmluY3JlbWVudEFuZEdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLGEuZ2V0KHRoaXMpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljSW50ZWdlclRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljSW50ZWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNzcxZDgwCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNJbnRlZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLio7CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgQXRvbWljSW50ZWdlclRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBdG9taWNJbnRlZ2VyVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdG8gZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKXsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZGVmYXVsdCBjb25zdHJ1Y3RlZCBpbml0aWFsaXplcyB0byB6ZXJvCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpeworICAgICAgICBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXQoKXsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXQoKSk7CisgICAgICAgIGFpLnNldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsYWkuZ2V0KCkpOworICAgICAgICBhaS5zZXQoLTMpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTMsYWkuZ2V0KCkpOworICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSBpZiBlcXVhbCB0byBleHBlY3RlZCBlbHNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQoMSwyKSk7CisgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldCgyLC00KSk7CisgICAgICAgIGFzc2VydEVxdWFscygtNCxhaS5nZXQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFpLmNvbXBhcmVBbmRTZXQoLTUsNykpOworICAgICAgICBhc3NlcnRGYWxzZSgoNyA9PSBhaS5nZXQoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQoLTQsNykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNyxhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBpbiBvbmUgdGhyZWFkIGVuYWJsZXMgYW5vdGhlciB3YWl0aW5nIGZvciB2YWx1ZQorICAgICAqIHRvIHN1Y2NlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldEluTXVsdGlwbGVUaHJlYWRzKCkgeworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSghYWkuY29tcGFyZUFuZFNldCgyLCAzKSkgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KDEsIDIpKTsKKyAgICAgICAgICAgIHQuam9pbihMT05HX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQuaXNBbGl2ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhaS5nZXQoKSwgMyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGVhdGVkIHdlYWtDb21wYXJlQW5kU2V0IHN1Y2NlZWRzIGluIGNoYW5naW5nIHZhbHVlIHdoZW4gZXF1YWwKKyAgICAgKiB0byBleHBlY3RlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vha0NvbXBhcmVBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQoMSwyKSk7CisgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldCgyLC00KSk7CisgICAgICAgIGFzc2VydEVxdWFscygtNCxhaS5nZXQoKSk7CisgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldCgtNCw3KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmRTZXQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgc2V0cyB0byBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmRTZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5nZXRBbmRTZXQoLTEwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMTAsYWkuZ2V0QW5kU2V0KDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmRBZGQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgYWRkcyBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRBZGQoKXsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmRBZGQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMyxhaS5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLGFpLmdldEFuZEFkZCgtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEFuZERlY3JlbWVudCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBkZWNyZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZERlY3JlbWVudCgpeworICAgICAgICBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmdldEFuZERlY3JlbWVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZ2V0QW5kRGVjcmVtZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuZ2V0QW5kRGVjcmVtZW50KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEFuZEluY3JlbWVudCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBpbmNyZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZEluY3JlbWVudCgpeworICAgICAgICBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmdldEFuZEluY3JlbWVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsYWkuZ2V0KCkpOworICAgICAgICBhaS5zZXQoLTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTIsYWkuZ2V0QW5kSW5jcmVtZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuZ2V0QW5kSW5jcmVtZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5nZXRBbmRJbmNyZW1lbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbmRHZXQgYWRkcyBnaXZlbiB2YWx1ZSB0byBjdXJyZW50LCBhbmQgcmV0dXJucyBjdXJyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFuZEdldCgpeworICAgICAgICBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLGFpLmFkZEFuZEdldCgyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLGFpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmFkZEFuZEdldCgtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlY3JlbWVudEFuZEdldCBkZWNyZW1lbnRzIGFuZCByZXR1cm5zIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50QW5kR2V0KCl7CisgICAgICAgIEF0b21pY0ludGVnZXIgYWkgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZGVjcmVtZW50QW5kR2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuZGVjcmVtZW50QW5kR2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTIsYWkuZGVjcmVtZW50QW5kR2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTIsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGluY3JlbWVudEFuZEdldCBpbmNyZW1lbnRzIGFuZCByZXR1cm5zIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50QW5kR2V0KCl7CisgICAgICAgIEF0b21pY0ludGVnZXIgYWkgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsYWkuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMixhaS5nZXQoKSk7CisgICAgICAgIGFpLnNldCgtMik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5pbmNyZW1lbnRBbmRHZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLGFpLmluY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYSBkZXNlcmlhbGl6ZWQgc2VyaWFsaXplZCBhdG9taWMgaG9sZHMgc2FtZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyIGwgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsLnNldCgyMik7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChsKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgQXRvbWljSW50ZWdlciByID0gKEF0b21pY0ludGVnZXIpIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldCgpLCByLmdldCgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyByZXR1cm5zIGN1cnJlbnQgdmFsdWUuCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAtMTI7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhaS50b1N0cmluZygpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludFZhbHVlIHJldHVybnMgY3VycmVudCB2YWx1ZS4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdEludFZhbHVlKCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IC0xMjsgaSA8IDY7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGFpLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBsb25nVmFsdWUgcmV0dXJucyBjdXJyZW50IHZhbHVlLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ1ZhbHVlKCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IC0xMjsgaSA8IDY7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKWksIGFpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGZsb2F0VmFsdWUgcmV0dXJucyBjdXJyZW50IHZhbHVlLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZSgpIHsKKyAgICAgICAgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAtMTI7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygoZmxvYXQpaSwgYWkuZmxvYXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRvdWJsZVZhbHVlIHJldHVybnMgY3VycmVudCB2YWx1ZS4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlKCkgeworICAgICAgICBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IC0xMjsgaSA8IDY7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKChkb3VibGUpaSwgYWkuZG91YmxlVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY0xvbmdBcnJheVRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljTG9uZ0FycmF5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Y2UyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY0xvbmdBcnJheVRlc3QuamF2YQpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy4qOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIEF0b21pY0xvbmdBcnJheVRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBdG9taWNMb25nQXJyYXlUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciBjcmVhdGVzIGFycmF5IG9mIGdpdmVuIHNpemUgd2l0aCBhbGwgZWxlbWVudHMgemVybworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpeworICAgICAgICBBdG9taWNMb25nQXJyYXkgYWkgPSBuZXcgQXRvbWljTG9uZ0FycmF5KFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5nZXQoaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHdpdGggbnVsbCBhcnJheSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMk5QRSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmdbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIEF0b21pY0xvbmdBcnJheSBhaSA9IG5ldyBBdG9taWNMb25nQXJyYXkoYSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIGFycmF5IGlzIG9mIHNhbWUgc2l6ZSBhbmQgaGFzIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjIoKSB7CisgICAgICAgIGxvbmdbXSBhID0geyAxN0wsIDNMLCAtNDJMLCA5OUwsIC03TH07CisgICAgICAgIEF0b21pY0xvbmdBcnJheSBhaSA9IG5ldyBBdG9taWNMb25nQXJyYXkoYSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmxlbmd0aCwgYWkubGVuZ3RoKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFbaV0sIGFpLmdldChpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGFuZCBzZXQgZm9yIG91dCBvZiBib3VuZCBpbmRpY2VzIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhpbmcoKXsKKyAgICAgICAgQXRvbWljTG9uZ0FycmF5IGFpID0gbmV3IEF0b21pY0xvbmdBcnJheShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpLmdldChTSVpFKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhaS5nZXQoLTEpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpLnNldChTSVpFLCAwKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhaS5zZXQoLTEsIDApOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSBzZXQgYXQgaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0KCl7CisgICAgICAgIEF0b21pY0xvbmdBcnJheSBhaSA9IG5ldyBBdG9taWNMb25nQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGksIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFpLnNldChpLCAyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmdldChpKSk7CisgICAgICAgICAgICBhaS5zZXQoaSwgLTMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0zLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IHN1Y2NlZWRzIGluIGNoYW5naW5nIHZhbHVlIGlmIGVxdWFsIHRvIGV4cGVjdGVkIGVsc2UgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldCgpeworICAgICAgICBBdG9taWNMb25nQXJyYXkgYWkgPSBuZXcgQXRvbWljTG9uZ0FycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpLCAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChpLCAxLDIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChpLCAyLC00KSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTQsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGFpLmNvbXBhcmVBbmRTZXQoaSwgLTUsNykpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKDcgPT0gYWkuZ2V0KGkpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQoaSwgLTQsNykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDcsYWkuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgaW4gb25lIHRocmVhZCBlbmFibGVzIGFub3RoZXIgd2FpdGluZyBmb3IgdmFsdWUKKyAgICAgKiB0byBzdWNjZWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXRJbk11bHRpcGxlVGhyZWFkcygpIHsKKyAgICAgICAgZmluYWwgQXRvbWljTG9uZ0FycmF5IGEgPSBuZXcgQXRvbWljTG9uZ0FycmF5KDEpOworICAgICAgICBhLnNldCgwLCAxKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCFhLmNvbXBhcmVBbmRTZXQoMCwgMiwgMykpIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYS5jb21wYXJlQW5kU2V0KDAsIDEsIDIpKTsKKyAgICAgICAgICAgIHQuam9pbihMT05HX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQuaXNBbGl2ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhLmdldCgwKSwgMyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGVhdGVkIHdlYWtDb21wYXJlQW5kU2V0IHN1Y2NlZWRzIGluIGNoYW5naW5nIHZhbHVlIHdoZW4gZXF1YWwKKyAgICAgKiB0byBleHBlY3RlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vha0NvbXBhcmVBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljTG9uZ0FycmF5IGFpID0gbmV3IEF0b21pY0xvbmdBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQoaSwgMSwyKSk7CisgICAgICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQoaSwgMiwtNCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC00LGFpLmdldChpKSk7CisgICAgICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQoaSwgLTQsNykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDcsYWkuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXRBbmRTZXQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgc2V0cyB0byBnaXZlbiB2YWx1ZSBhdCBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljTG9uZ0FycmF5IGFpID0gbmV3IEF0b21pY0xvbmdBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmRTZXQoaSwwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5nZXRBbmRTZXQoaSwtMTApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMTAsYWkuZ2V0QW5kU2V0KGksMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGdldEFuZEFkZCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBhZGRzIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZEFkZCgpeworICAgICAgICBBdG9taWNMb25nQXJyYXkgYWkgPSBuZXcgQXRvbWljTG9uZ0FycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpLCAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmdldEFuZEFkZChpLDIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLGFpLmdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMyxhaS5nZXRBbmRBZGQoaSwtNCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmREZWNyZW1lbnQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgZGVjcmVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmREZWNyZW1lbnQoKXsKKyAgICAgICAgQXRvbWljTG9uZ0FycmF5IGFpID0gbmV3IEF0b21pY0xvbmdBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmREZWNyZW1lbnQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZ2V0QW5kRGVjcmVtZW50KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5nZXRBbmREZWNyZW1lbnQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QW5kSW5jcmVtZW50IHJldHVybnMgcHJldmlvdXMgdmFsdWUgYW5kIGluY3JlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kSW5jcmVtZW50KCl7CisgICAgICAgIEF0b21pY0xvbmdBcnJheSBhaSA9IG5ldyBBdG9taWNMb25nQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGksIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0QW5kSW5jcmVtZW50KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmdldChpKSk7CisgICAgICAgICAgICBhaS5zZXQoaSwtMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTIsYWkuZ2V0QW5kSW5jcmVtZW50KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5nZXRBbmRJbmNyZW1lbnQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZ2V0QW5kSW5jcmVtZW50KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgYWRkQW5kR2V0IGFkZHMgZ2l2ZW4gdmFsdWUgdG8gY3VycmVudCwgYW5kIHJldHVybnMgY3VycmVudCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbmRHZXQoKSB7CisgICAgICAgIEF0b21pY0xvbmdBcnJheSBhaSA9IG5ldyBBdG9taWNMb25nQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGksIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYWkuYWRkQW5kR2V0KGksMikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5hZGRBbmRHZXQoaSwtNCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWNyZW1lbnRBbmRHZXQgZGVjcmVtZW50cyBhbmQgcmV0dXJucyBjdXJyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY3JlbWVudEFuZEdldCgpeworICAgICAgICBBdG9taWNMb25nQXJyYXkgYWkgPSBuZXcgQXRvbWljTG9uZ0FycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpLCAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLGFpLmRlY3JlbWVudEFuZEdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuZGVjcmVtZW50QW5kR2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMixhaS5kZWNyZW1lbnRBbmRHZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0yLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbmNyZW1lbnRBbmRHZXQgaW5jcmVtZW50cyBhbmQgcmV0dXJucyBjdXJyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudEFuZEdldCgpIHsKKyAgICAgICAgQXRvbWljTG9uZ0FycmF5IGFpID0gbmV3IEF0b21pY0xvbmdBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMixhaS5pbmNyZW1lbnRBbmRHZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFpLnNldChpLCAtMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuaW5jcmVtZW50QW5kR2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLGFpLmluY3JlbWVudEFuZEdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5pbmNyZW1lbnRBbmRHZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBsb25nIENPVU5URE9XTiA9IDEwMDAwMDsKKyAgICAKKyAgICBjbGFzcyBDb3VudGVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBmaW5hbCBBdG9taWNMb25nQXJyYXkgYWk7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgY291bnRzOworICAgICAgICBDb3VudGVyKEF0b21pY0xvbmdBcnJheSBhKSB7IGFpID0gYTsgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFpLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyB2ID0gYWkuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHYgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhaS5jb21wYXJlQW5kU2V0KGksIHYsIHYtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjb3VudHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVsdGlwbGUgdGhyZWFkcyB1c2luZyBzYW1lIGFycmF5IG9mIGNvdW50ZXJzIHN1Y2Nlc3NmdWxseQorICAgICAqIHVwZGF0ZSBhIG51bWJlciBvZiB0aW1lcyBlcXVhbCB0byB0b3RhbCBjb3VudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudGluZ0luTXVsdGlwbGVUaHJlYWRzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQXRvbWljTG9uZ0FycmF5IGFpID0gbmV3IEF0b21pY0xvbmdBcnJheShTSVpFKTsgCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICAgICAgYWkuc2V0KGksIENPVU5URE9XTik7CisgICAgICAgICAgICBDb3VudGVyIGMxID0gbmV3IENvdW50ZXIoYWkpOworICAgICAgICAgICAgQ291bnRlciBjMiA9IG5ldyBDb3VudGVyKGFpKTsKKyAgICAgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoYzEpOworICAgICAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChjMik7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjMS5jb3VudHMrYzIuY291bnRzLCBTSVpFICogQ09VTlRET1dOKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYSBkZXNlcmlhbGl6ZWQgc2VyaWFsaXplZCBhcnJheSBob2xkcyBzYW1lIHZhbHVlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgeworICAgICAgICBBdG9taWNMb25nQXJyYXkgbCA9IG5ldyBBdG9taWNMb25nQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICBsLnNldChpLCAtaSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm91dCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGwpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmluKSk7CisgICAgICAgICAgICBBdG9taWNMb25nQXJyYXkgciA9IChBdG9taWNMb25nQXJyYXkpIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0KGkpLCByLmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgcmV0dXJucyBjdXJyZW50IHZhbHVlLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIGxvbmdbXSBhID0geyAxNywgMywgLTQyLCA5OSwgLTd9OworICAgICAgICBBdG9taWNMb25nQXJyYXkgYWkgPSBuZXcgQXRvbWljTG9uZ0FycmF5KGEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGEpLCBhaS50b1N0cmluZygpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwNzZmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuKjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworICAgIHZvbGF0aWxlIGxvbmcgeCA9IDA7CisgICAgaW50IHo7CisgICAgbG9uZyB3OworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0aW9uIHdpdGggbm9uLWV4aXN0ZW50IGZpZWxkIHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCl7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXI8QXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3Q+IAorICAgICAgICAgICAgICAgIGEgPSBBdG9taWNMb25nRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIKKyAgICAgICAgICAgICAgICAoQXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ5Iik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJ0KSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdGlvbiB3aXRoIGZpZWxkIG5vdCBvZiBnaXZlbiB0eXBlIHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpeworICAgICAgICB0cnl7CisgICAgICAgICAgICBBdG9taWNMb25nRmllbGRVcGRhdGVyPEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0PiAKKyAgICAgICAgICAgICAgICBhID0gQXRvbWljTG9uZ0ZpZWxkVXBkYXRlci5uZXdVcGRhdGVyCisgICAgICAgICAgICAgICAgKEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieiIpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBydCkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3Rpb24gd2l0aCBub24tdm9sYXRpbGUgZmllbGQgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IzKCl7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXI8QXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3Q+IAorICAgICAgICAgICAgICAgIGEgPSBBdG9taWNMb25nRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIKKyAgICAgICAgICAgICAgICAoQXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ3Iik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisKKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcnQpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGdldCByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHNldCBvciBhc3NpZ25lZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXQoKXsKKyAgICAgICAgQXRvbWljTG9uZ0ZpZWxkVXBkYXRlcjxBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNMb25nRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXQodGhpcykpOworICAgICAgICBhLnNldCh0aGlzLDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMixhLmdldCh0aGlzKSk7CisgICAgICAgIGEuc2V0KHRoaXMsLTMpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTMsYS5nZXQodGhpcykpOworICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSBpZiBlcXVhbCB0byBleHBlY3RlZCBlbHNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljTG9uZ0ZpZWxkVXBkYXRlcjxBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNMb25nRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhLmNvbXBhcmVBbmRTZXQodGhpcywxLDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhLmNvbXBhcmVBbmRTZXQodGhpcywyLC00KSk7CisgICAgICAgIGFzc2VydEVxdWFscygtNCxhLmdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGEuY29tcGFyZUFuZFNldCh0aGlzLC01LDcpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoKDcgPT0gYS5nZXQodGhpcykpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhLmNvbXBhcmVBbmRTZXQodGhpcywtNCw3KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LGEuZ2V0KHRoaXMpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgaW4gb25lIHRocmVhZCBlbmFibGVzIGFub3RoZXIgd2FpdGluZyBmb3IgdmFsdWUKKyAgICAgKiB0byBzdWNjZWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXRJbk11bHRpcGxlVGhyZWFkcygpIHsKKyAgICAgICAgeCA9IDE7CisgICAgICAgIGZpbmFsIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXI8QXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3Q+YTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNMb25nRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSghYS5jb21wYXJlQW5kU2V0KEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0LnRoaXMsIDIsIDMpKSBUaHJlYWQueWllbGQoKTsKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGEuY29tcGFyZUFuZFNldCh0aGlzLCAxLCAyKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYS5nZXQodGhpcyksIDMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXBlYXRlZCB3ZWFrQ29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSB3aGVuIGVxdWFsCisgICAgICogdG8gZXhwZWN0ZWQgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdlYWtDb21wYXJlQW5kU2V0KCl7CisgICAgICAgIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXI8QXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3Q+IGE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhID0gQXRvbWljTG9uZ0ZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeCA9IDE7CisgICAgICAgIHdoaWxlKCFhLndlYWtDb21wYXJlQW5kU2V0KHRoaXMsMSwyKSk7CisgICAgICAgIHdoaWxlKCFhLndlYWtDb21wYXJlQW5kU2V0KHRoaXMsMiwtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsYS5nZXQodGhpcykpOworICAgICAgICB3aGlsZSghYS53ZWFrQ29tcGFyZUFuZFNldCh0aGlzLC00LDcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsYS5nZXQodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXRBbmRTZXQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgc2V0cyB0byBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljTG9uZ0ZpZWxkVXBkYXRlcjxBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdD4gYTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNMb25nRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIoQXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3QuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXRBbmRTZXQodGhpcywgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxhLmdldEFuZFNldCh0aGlzLC0xMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEwLGEuZ2V0QW5kU2V0KHRoaXMsMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEFuZEFkZCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBhZGRzIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZEFkZCgpeworICAgICAgICBBdG9taWNMb25nRmllbGRVcGRhdGVyPEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0PiBhOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY0xvbmdGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgIngiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHggPSAxOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhLmdldEFuZEFkZCh0aGlzLDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYS5nZXQodGhpcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMyxhLmdldEFuZEFkZCh0aGlzLC00KSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmdldCh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QW5kRGVjcmVtZW50IHJldHVybnMgcHJldmlvdXMgdmFsdWUgYW5kIGRlY3JlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kRGVjcmVtZW50KCl7CisgICAgICAgIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXI8QXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3Q+IGE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhID0gQXRvbWljTG9uZ0ZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeCA9IDE7CisgICAgICAgIGFzc2VydEVxdWFscygxLGEuZ2V0QW5kRGVjcmVtZW50KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYS5nZXRBbmREZWNyZW1lbnQodGhpcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYS5nZXRBbmREZWNyZW1lbnQodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEFuZEluY3JlbWVudCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBpbmNyZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZEluY3JlbWVudCgpeworICAgICAgICBBdG9taWNMb25nRmllbGRVcGRhdGVyPEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0PiBhOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY0xvbmdGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgIngiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHggPSAxOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhLmdldEFuZEluY3JlbWVudCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgYS5zZXQodGhpcywtMik7CisgICAgICAgIGFzc2VydEVxdWFscygtMixhLmdldEFuZEluY3JlbWVudCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmdldEFuZEluY3JlbWVudCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLGEuZ2V0QW5kSW5jcmVtZW50KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5nZXQodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZEFuZEdldCBhZGRzIGdpdmVuIHZhbHVlIHRvIGN1cnJlbnQsIGFuZCByZXR1cm5zIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5kR2V0KCl7CisgICAgICAgIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXI8QXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3Q+IGE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhID0gQXRvbWljTG9uZ0ZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeCA9IDE7CisgICAgICAgIGFzc2VydEVxdWFscygzLGEuYWRkQW5kR2V0KHRoaXMsMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMyxhLmdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmFkZEFuZEdldCh0aGlzLC00KSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmdldCh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIGRlY3JlbWVudEFuZEdldCBkZWNyZW1lbnRzIGFuZCByZXR1cm5zIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50QW5kR2V0KCl7CisgICAgICAgIEF0b21pY0xvbmdGaWVsZFVwZGF0ZXI8QXRvbWljTG9uZ0ZpZWxkVXBkYXRlclRlc3Q+IGE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhID0gQXRvbWljTG9uZ0ZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeCA9IDE7CisgICAgICAgIGFzc2VydEVxdWFscygwLGEuZGVjcmVtZW50QW5kR2V0KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGEuZGVjcmVtZW50QW5kR2V0KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0yLGEuZGVjcmVtZW50QW5kR2V0KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0yLGEuZ2V0KHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbmNyZW1lbnRBbmRHZXQgaW5jcmVtZW50cyBhbmQgcmV0dXJucyBjdXJyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudEFuZEdldCgpeworICAgICAgICBBdG9taWNMb25nRmllbGRVcGRhdGVyPEF0b21pY0xvbmdGaWVsZFVwZGF0ZXJUZXN0PiBhOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY0xvbmdGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgIngiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHggPSAxOworICAgICAgICBhc3NlcnRFcXVhbHMoMixhLmluY3JlbWVudEFuZEdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgYS5zZXQodGhpcywtMik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhLmluY3JlbWVudEFuZEdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLGEuaW5jcmVtZW50QW5kR2V0KHRoaXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYS5pbmNyZW1lbnRBbmRHZXQodGhpcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhLmdldCh0aGlzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY0xvbmdUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY0xvbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTViOGE0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljTG9uZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIEF0b21pY0xvbmdUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQXRvbWljTG9uZ1Rlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHRvIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCl7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlZmF1bHQgY29uc3RydWN0ZWQgaW5pdGlhbGl6ZXMgdG8gemVybworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjIoKXsKKyAgICAgICAgQXRvbWljTG9uZyBhaSA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0KCl7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0KCkpOworICAgICAgICBhaS5zZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmdldCgpKTsKKyAgICAgICAgYWkuc2V0KC0zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0zLGFpLmdldCgpKTsKKyAgICAgICAgCisgICAgfQorICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWUgaWYgZXF1YWwgdG8gZXhwZWN0ZWQgZWxzZSBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlQW5kU2V0KCl7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KDEsMikpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQoMiwtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsYWkuZ2V0KCkpOworICAgICAgICBhc3NlcnRGYWxzZShhaS5jb21wYXJlQW5kU2V0KC01LDcpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoKDcgPT0gYWkuZ2V0KCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KC00LDcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgaW4gb25lIHRocmVhZCBlbmFibGVzIGFub3RoZXIgd2FpdGluZyBmb3IgdmFsdWUKKyAgICAgKiB0byBzdWNjZWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXRJbk11bHRpcGxlVGhyZWFkcygpIHsKKyAgICAgICAgZmluYWwgQXRvbWljTG9uZyBhaSA9IG5ldyBBdG9taWNMb25nKDEpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIWFpLmNvbXBhcmVBbmRTZXQoMiwgMykpIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldCgxLCAyKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWkuZ2V0KCksIDMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXBlYXRlZCB3ZWFrQ29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSB3aGVuIGVxdWFsCisgICAgICogdG8gZXhwZWN0ZWQgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdlYWtDb21wYXJlQW5kU2V0KCl7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygxKTsKKyAgICAgICAgd2hpbGUoIWFpLndlYWtDb21wYXJlQW5kU2V0KDEsMikpOworICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQoMiwtNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsYWkuZ2V0KCkpOworICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQoLTQsNykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNyxhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QW5kU2V0IHJldHVybnMgcHJldmlvdXMgdmFsdWUgYW5kIHNldHMgdG8gZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kU2V0KCl7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0QW5kU2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZ2V0QW5kU2V0KC0xMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEwLGFpLmdldEFuZFNldCgxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QW5kQWRkIHJldHVybnMgcHJldmlvdXMgdmFsdWUgYW5kIGFkZHMgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kQWRkKCl7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0QW5kQWRkKDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsYWkuZ2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMyxhaS5nZXRBbmRBZGQoLTQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmREZWNyZW1lbnQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgZGVjcmVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmREZWNyZW1lbnQoKXsKKyAgICAgICAgQXRvbWljTG9uZyBhaSA9IG5ldyBBdG9taWNMb25nKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmREZWNyZW1lbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLGFpLmdldEFuZERlY3JlbWVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldEFuZERlY3JlbWVudCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmRJbmNyZW1lbnQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgaW5jcmVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRJbmNyZW1lbnQoKXsKKyAgICAgICAgQXRvbWljTG9uZyBhaSA9IG5ldyBBdG9taWNMb25nKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXRBbmRJbmNyZW1lbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmdldCgpKTsKKyAgICAgICAgYWkuc2V0KC0yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0yLGFpLmdldEFuZEluY3JlbWVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldEFuZEluY3JlbWVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsYWkuZ2V0QW5kSW5jcmVtZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkQW5kR2V0IGFkZHMgZ2l2ZW4gdmFsdWUgdG8gY3VycmVudCwgYW5kIHJldHVybnMgY3VycmVudCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbmRHZXQoKXsKKyAgICAgICAgQXRvbWljTG9uZyBhaSA9IG5ldyBBdG9taWNMb25nKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMyxhaS5hZGRBbmRHZXQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMyxhaS5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSxhaS5hZGRBbmRHZXQoLTQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWNyZW1lbnRBbmRHZXQgZGVjcmVtZW50cyBhbmQgcmV0dXJucyBjdXJyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY3JlbWVudEFuZEdldCgpeworICAgICAgICBBdG9taWNMb25nIGFpID0gbmV3IEF0b21pY0xvbmcoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLGFpLmRlY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLGFpLmRlY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0yLGFpLmRlY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0yLGFpLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbmNyZW1lbnRBbmRHZXQgaW5jcmVtZW50cyBhbmQgcmV0dXJucyBjdXJyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudEFuZEdldCgpeworICAgICAgICBBdG9taWNMb25nIGFpID0gbmV3IEF0b21pY0xvbmcoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLGFpLmluY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsYWkuZ2V0KCkpOworICAgICAgICBhaS5zZXQoLTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsYWkuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxhaS5pbmNyZW1lbnRBbmRHZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLGFpLmluY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGEgZGVzZXJpYWxpemVkIHNlcmlhbGl6ZWQgYXRvbWljIGhvbGRzIHNhbWUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgQXRvbWljTG9uZyBsID0gbmV3IEF0b21pY0xvbmcoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbC5zZXQoLTIyKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm91dCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGwpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmluKSk7CisgICAgICAgICAgICBBdG9taWNMb25nIHIgPSAoQXRvbWljTG9uZykgaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0KCksIHIuZ2V0KCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvU3RyaW5nIHJldHVybnMgY3VycmVudCB2YWx1ZS4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBBdG9taWNMb25nIGFpID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICAgICAgZm9yIChsb25nIGkgPSAtMTI7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhaS50b1N0cmluZygpLCBMb25nLnRvU3RyaW5nKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGxvbmdWYWx1ZSByZXR1cm5zIGN1cnJlbnQgdmFsdWUuCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb25nVmFsdWUoKSB7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBmb3IgKGludCBpID0gLTEyOyBpIDwgNjsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKGxvbmcpaSwgYWkubG9uZ1ZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZmxvYXRWYWx1ZSByZXR1cm5zIGN1cnJlbnQgdmFsdWUuCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlKCkgeworICAgICAgICBBdG9taWNMb25nIGFpID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IC0xMjsgaSA8IDY7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKChmbG9hdClpLCBhaS5mbG9hdFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZG91YmxlVmFsdWUgcmV0dXJucyBjdXJyZW50IHZhbHVlLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWUoKSB7CisgICAgICAgIEF0b21pY0xvbmcgYWkgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBmb3IgKGludCBpID0gLTEyOyBpIDwgNjsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKGRvdWJsZSlpLCBhaS5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY01hcmthYmxlUmVmZXJlbmNlVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNNYXJrYWJsZVJlZmVyZW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjNkY2IxCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNNYXJrYWJsZVJlZmVyZW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy4qOworCitwdWJsaWMgY2xhc3MgQXRvbWljTWFya2FibGVSZWZlcmVuY2VUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2V7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBdG9taWNNYXJrYWJsZVJlZmVyZW5jZVRlc3QuY2xhc3MpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdG8gZ2l2ZW4gcmVmZXJlbmNlIGFuZCBtYXJrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCl7CisgICAgICAgIEF0b21pY01hcmthYmxlUmVmZXJlbmNlIGFpID0gbmV3IEF0b21pY01hcmthYmxlUmVmZXJlbmNlKG9uZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLGFpLmdldFJlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWkuaXNNYXJrZWQoKSk7CisgICAgICAgIEF0b21pY01hcmthYmxlUmVmZXJlbmNlIGEyID0gbmV3IEF0b21pY01hcmthYmxlUmVmZXJlbmNlKG51bGwsIHRydWUpOworICAgICAgICBhc3NlcnROdWxsKGEyLmdldFJlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMi5pc01hcmtlZCgpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXQgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZXMgb2YgcmVmZXJlbmNlIGFuZCBtYXJrIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXQoKXsKKyAgICAgICAgYm9vbGVhbltdIG1hcmsgPSBuZXcgYm9vbGVhblsxXTsKKyAgICAgICAgQXRvbWljTWFya2FibGVSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljTWFya2FibGVSZWZlcmVuY2Uob25lLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvbmUsYWkuZ2V0UmVmZXJlbmNlKCkpOworICAgICAgICBhc3NlcnRGYWxzZShhaS5pc01hcmtlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9uZSwgYWkuZ2V0KG1hcmspKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWFya1swXSk7CisgICAgICAgIGFpLnNldCh0d28sIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHR3byxhaS5nZXRSZWZlcmVuY2UoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFpLmlzTWFya2VkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHdvLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRGYWxzZShtYXJrWzBdKTsKKyAgICAgICAgYWkuc2V0KG9uZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvbmUsYWkuZ2V0UmVmZXJlbmNlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmlzTWFya2VkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRUcnVlKG1hcmtbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIGF0dGVtcHRNYXJrIHN1Y2NlZWRzIGluIHNpbmdsZSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0ZW1wdE1hcmsoKXsKKyAgICAgICAgYm9vbGVhbltdIG1hcmsgPSBuZXcgYm9vbGVhblsxXTsKKyAgICAgICAgQXRvbWljTWFya2FibGVSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljTWFya2FibGVSZWZlcmVuY2Uob25lLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFpLmlzTWFya2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmF0dGVtcHRNYXJrKG9uZSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmlzTWFya2VkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRUcnVlKG1hcmtbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWVzIGlmIGVxdWFsIHRvIGV4cGVjdGVkIHJlZmVyZW5jZQorICAgICAqIGFuZCBtYXJrIGVsc2UgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldCgpeworICAgICAgICBib29sZWFuW10gbWFyayA9IG5ldyBib29sZWFuWzFdOworICAgICAgICBBdG9taWNNYXJrYWJsZVJlZmVyZW5jZSBhaSA9IG5ldyBBdG9taWNNYXJrYWJsZVJlZmVyZW5jZShvbmUsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9uZSwgYWkuZ2V0KG1hcmspKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWkuaXNNYXJrZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcmtbMF0pOworCisgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChvbmUsIHR3bywgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0d28sIGFpLmdldChtYXJrKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcmtbMF0pOworCisgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldCh0d28sIG0zLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobTMsIGFpLmdldChtYXJrKSk7CisgICAgICAgIGFzc2VydFRydWUobWFya1swXSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWkuY29tcGFyZUFuZFNldCh0d28sIG0zLCB0cnVlLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtMywgYWkuZ2V0KG1hcmspKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXJrWzBdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhbm90aGVyIHdhaXRpbmcgZm9yIHJlZmVyZW5jZSB2YWx1ZQorICAgICAqIHRvIHN1Y2NlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldEluTXVsdGlwbGVUaHJlYWRzKCkgeworICAgICAgICBmaW5hbCBBdG9taWNNYXJrYWJsZVJlZmVyZW5jZSBhaSA9IG5ldyBBdG9taWNNYXJrYWJsZVJlZmVyZW5jZShvbmUsIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCFhaS5jb21wYXJlQW5kU2V0KHR3bywgdGhyZWUsIGZhbHNlLCBmYWxzZSkpIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChvbmUsIHR3bywgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWkuZ2V0UmVmZXJlbmNlKCksIHRocmVlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGFpLmlzTWFya2VkKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhbm90aGVyIHdhaXRpbmcgZm9yIG1hcmsgdmFsdWUKKyAgICAgKiB0byBzdWNjZWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXRJbk11bHRpcGxlVGhyZWFkczIoKSB7CisgICAgICAgIGZpbmFsIEF0b21pY01hcmthYmxlUmVmZXJlbmNlIGFpID0gbmV3IEF0b21pY01hcmthYmxlUmVmZXJlbmNlKG9uZSwgZmFsc2UpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIWFpLmNvbXBhcmVBbmRTZXQob25lLCBvbmUsIHRydWUsIGZhbHNlKSkgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KG9uZSwgb25lLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICAgICAgdC5qb2luKExPTkdfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFpLmdldFJlZmVyZW5jZSgpLCBvbmUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWkuaXNNYXJrZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGVhdGVkIHdlYWtDb21wYXJlQW5kU2V0IHN1Y2NlZWRzIGluIGNoYW5naW5nIHZhbHVlcyB3aGVuIGVxdWFsCisgICAgICogdG8gZXhwZWN0ZWQgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdlYWtDb21wYXJlQW5kU2V0KCl7CisgICAgICAgIGJvb2xlYW5bXSBtYXJrID0gbmV3IGJvb2xlYW5bMV07CisgICAgICAgIEF0b21pY01hcmthYmxlUmVmZXJlbmNlIGFpID0gbmV3IEF0b21pY01hcmthYmxlUmVmZXJlbmNlKG9uZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRGYWxzZShhaS5pc01hcmtlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWFya1swXSk7CisKKyAgICAgICAgd2hpbGUoIWFpLndlYWtDb21wYXJlQW5kU2V0KG9uZSwgdHdvLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHR3bywgYWkuZ2V0KG1hcmspKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWFya1swXSk7CisKKyAgICAgICAgd2hpbGUoIWFpLndlYWtDb21wYXJlQW5kU2V0KHR3bywgbTMsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtMywgYWkuZ2V0KG1hcmspKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXJrWzBdKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljUmVmZXJlbmNlQXJyYXlUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY1JlZmVyZW5jZUFycmF5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzBkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY1JlZmVyZW5jZUFycmF5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgQXRvbWljUmVmZXJlbmNlQXJyYXlUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBdG9taWNSZWZlcmVuY2VBcnJheVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYXJyYXkgb2YgZ2l2ZW4gc2l6ZSB3aXRoIGFsbCBlbGVtZW50cyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCl7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PEludGVnZXI+IGFpID0gbmV3IEF0b21pY1JlZmVyZW5jZUFycmF5PEludGVnZXI+KFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbChhaS5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3Igd2l0aCBudWxsIGFycmF5IHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyTlBFKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGEgPSBudWxsOworICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8SW50ZWdlcj4gYWkgPSBuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXk8SW50ZWdlcj4oYSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIGFycmF5IGlzIG9mIHNhbWUgc2l6ZSBhbmQgaGFzIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjIoKSB7CisgICAgICAgIEludGVnZXJbXSBhID0geyB0d28sIG9uZSwgdGhyZWUsIGZvdXIsIHNldmVufTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8SW50ZWdlcj4gYWkgPSBuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXk8SW50ZWdlcj4oYSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmxlbmd0aCwgYWkubGVuZ3RoKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFbaV0sIGFpLmdldChpKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBnZXQgYW5kIHNldCBmb3Igb3V0IG9mIGJvdW5kIGluZGljZXMgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleGluZygpeworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxJbnRlZ2VyPiBhaSA9IG5ldyBBdG9taWNSZWZlcmVuY2VBcnJheTxJbnRlZ2VyPihTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpLmdldChTSVpFKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhaS5nZXQoLTEpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpLnNldChTSVpFLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhaS5zZXQoLTEsIG51bGwpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSBzZXQgYXQgaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0KCl7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5IGFpID0gbmV3IEF0b21pY1JlZmVyZW5jZUFycmF5KFNJWkUpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFpLnNldChpLCBvbmUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9uZSxhaS5nZXQoaSkpOworICAgICAgICAgICAgYWkuc2V0KGksIHR3byk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHdvLGFpLmdldChpKSk7CisgICAgICAgICAgICBhaS5zZXQoaSwgbTMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG0zLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wYXJlQW5kU2V0IHN1Y2NlZWRzIGluIGNoYW5naW5nIHZhbHVlIGlmIGVxdWFsIHRvIGV4cGVjdGVkIGVsc2UgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldCgpeworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheSBhaSA9IG5ldyBBdG9taWNSZWZlcmVuY2VBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgb25lKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChpLCBvbmUsdHdvKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQoaSwgdHdvLG00KSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobTQsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGFpLmNvbXBhcmVBbmRTZXQoaSwgbTUsc2V2ZW4pKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKChzZXZlbi5lcXVhbHMoYWkuZ2V0KGkpKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KGksIG00LHNldmVuKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2V2ZW4sYWkuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgaW4gb25lIHRocmVhZCBlbmFibGVzIGFub3RoZXIgd2FpdGluZyBmb3IgdmFsdWUKKyAgICAgKiB0byBzdWNjZWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXRJbk11bHRpcGxlVGhyZWFkcygpIHsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlQXJyYXkgYSA9IG5ldyBBdG9taWNSZWZlcmVuY2VBcnJheSgxKTsKKyAgICAgICAgYS5zZXQoMCwgb25lKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCFhLmNvbXBhcmVBbmRTZXQoMCwgdHdvLCB0aHJlZSkpIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYS5jb21wYXJlQW5kU2V0KDAsIG9uZSwgdHdvKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYS5nZXQoMCksIHRocmVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwZWF0ZWQgd2Vha0NvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWUgd2hlbiBlcXVhbAorICAgICAqIHRvIGV4cGVjdGVkIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWFrQ29tcGFyZUFuZFNldCgpeworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheSBhaSA9IG5ldyBBdG9taWNSZWZlcmVuY2VBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhaS5zZXQoaSwgb25lKTsKKyAgICAgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldChpLCBvbmUsdHdvKSk7CisgICAgICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQoaSwgdHdvLG00KSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobTQsYWkuZ2V0KGkpKTsKKyAgICAgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldChpLCBtNCxzZXZlbikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNldmVuLGFpLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbmRTZXQgcmV0dXJucyBwcmV2aW91cyB2YWx1ZSBhbmQgc2V0cyB0byBnaXZlbiB2YWx1ZSBhdCBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXkgYWkgPSBuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXkoU0laRSk7IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYWkuc2V0KGksIG9uZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob25lLGFpLmdldEFuZFNldChpLHplcm8pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLGFpLmdldEFuZFNldChpLG0xMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG0xMCxhaS5nZXRBbmRTZXQoaSxvbmUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGEgZGVzZXJpYWxpemVkIHNlcmlhbGl6ZWQgYXJyYXkgaG9sZHMgc2FtZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXkgbCA9IG5ldyBBdG9taWNSZWZlcmVuY2VBcnJheShTSVpFKTsgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBsLnNldChpLCBuZXcgSW50ZWdlcigtaSkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm91dCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGwpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmluKSk7CisgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheSByID0gKEF0b21pY1JlZmVyZW5jZUFycmF5KSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5sZW5ndGgoKSwgci5sZW5ndGgoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLmdldChpKSwgbC5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgcmV0dXJucyBjdXJyZW50IHZhbHVlLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIEludGVnZXJbXSBhID0geyB0d28sIG9uZSwgdGhyZWUsIGZvdXIsIHNldmVufTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8SW50ZWdlcj4gYWkgPSBuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXk8SW50ZWdlcj4oYSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoYSksIGFpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTgzY2EyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXJUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2V7CisgICAgdm9sYXRpbGUgSW50ZWdlciB4ID0gbnVsbDsKKyAgICBPYmplY3QgejsKKyAgICBJbnRlZ2VyIHc7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdGlvbiB3aXRoIG5vbi1leGlzdGVudCBmaWVsZCB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpeworICAgICAgICB0cnl7CisgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI8QXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdCwgSW50ZWdlcj4KKyAgICAgICAgICAgICAgICBhID0gQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyLm5ld1VwZGF0ZXIKKyAgICAgICAgICAgICAgICAoQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdC5jbGFzcywgSW50ZWdlci5jbGFzcywgInkiKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcnQpIHt9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3Rpb24gd2l0aCBmaWVsZCBub3Qgb2YgZ2l2ZW4gdHlwZSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjIoKXsKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyPEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QsIEludGVnZXI+CisgICAgICAgICAgICAgICAgYSA9IEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5uZXdVcGRhdGVyCisgICAgICAgICAgICAgICAgKEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QuY2xhc3MsIEludGVnZXIuY2xhc3MsICJ6Iik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJ0KSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHdpdGggbm9uLXZvbGF0aWxlIGZpZWxkIHRocm93cyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IzKCl7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlcjxBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXJUZXN0LCBJbnRlZ2VyPgorICAgICAgICAgICAgICAgIGEgPSBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcgorICAgICAgICAgICAgICAgIChBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCAidyIpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBydCkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHJldHVybnMgdGhlIGxhc3QgdmFsdWUgc2V0IG9yIGFzc2lnbmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNldCgpeworICAgICAgICBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI8QXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdCwgSW50ZWdlcj5hOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QuY2xhc3MsIEludGVnZXIuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gb25lOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgYS5zZXQodGhpcyx0d28pOworICAgICAgICBhc3NlcnRFcXVhbHModHdvLGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgYS5zZXQodGhpcywtMyk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoLTMpLGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSBpZiBlcXVhbCB0byBleHBlY3RlZCBlbHNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyPEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QsIEludGVnZXI+YTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGEgPSBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXJUZXN0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCAieCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeCA9IG9uZTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhLmNvbXBhcmVBbmRTZXQodGhpcyxvbmUsdHdvKSk7CisgICAgICAgIGFzc2VydFRydWUoYS5jb21wYXJlQW5kU2V0KHRoaXMsdHdvLG00KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtNCxhLmdldCh0aGlzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGEuY29tcGFyZUFuZFNldCh0aGlzLG01LHNldmVuKSk7CisgICAgICAgIGFzc2VydEZhbHNlKChzZXZlbiA9PSBhLmdldCh0aGlzKSkpOworICAgICAgICBhc3NlcnRUcnVlKGEuY29tcGFyZUFuZFNldCh0aGlzLG00LHNldmVuKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXZlbixhLmdldCh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBpbiBvbmUgdGhyZWFkIGVuYWJsZXMgYW5vdGhlciB3YWl0aW5nIGZvciB2YWx1ZQorICAgICAqIHRvIHN1Y2NlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldEluTXVsdGlwbGVUaHJlYWRzKCkgeworICAgICAgICB4ID0gb25lOworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI8QXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdCwgSW50ZWdlcj5hOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QuY2xhc3MsIEludGVnZXIuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSghYS5jb21wYXJlQW5kU2V0KEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QudGhpcywgdHdvLCB0aHJlZSkpIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYS5jb21wYXJlQW5kU2V0KHRoaXMsIG9uZSwgdHdvKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYS5nZXQodGhpcyksIHRocmVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwZWF0ZWQgd2Vha0NvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWUgd2hlbiBlcXVhbAorICAgICAqIHRvIGV4cGVjdGVkIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWFrQ29tcGFyZUFuZFNldCgpeworICAgICAgICBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI8QXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdCwgSW50ZWdlcj5hOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QuY2xhc3MsIEludGVnZXIuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gb25lOworICAgICAgICB3aGlsZSghYS53ZWFrQ29tcGFyZUFuZFNldCh0aGlzLG9uZSx0d28pKTsKKyAgICAgICAgd2hpbGUoIWEud2Vha0NvbXBhcmVBbmRTZXQodGhpcyx0d28sbTQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG00LGEuZ2V0KHRoaXMpKTsKKyAgICAgICAgd2hpbGUoIWEud2Vha0NvbXBhcmVBbmRTZXQodGhpcyxtNCxzZXZlbikpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2V2ZW4sYS5nZXQodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEFuZFNldCByZXR1cm5zIHByZXZpb3VzIHZhbHVlIGFuZCBzZXRzIHRvIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFNldCgpeworICAgICAgICBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI8QXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyVGVzdCwgSW50ZWdlcj5hOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYSA9IEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlclRlc3QuY2xhc3MsIEludGVnZXIuY2xhc3MsICJ4Iik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB4ID0gb25lOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLGEuZ2V0QW5kU2V0KHRoaXMsIHplcm8pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHplcm8sYS5nZXRBbmRTZXQodGhpcyxtMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0xMCxhLmdldEFuZFNldCh0aGlzLDEpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljUmVmZXJlbmNlVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9BdG9taWNSZWZlcmVuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFhNDhjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljUmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLio7CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgQXRvbWljUmVmZXJlbmNlVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEF0b21pY1JlZmVyZW5jZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHRvIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCl7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZSBhaSA9IG5ldyBBdG9taWNSZWZlcmVuY2Uob25lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9uZSxhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZGVmYXVsdCBjb25zdHJ1Y3RlZCBpbml0aWFsaXplcyB0byBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpeworICAgICAgICBBdG9taWNSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljUmVmZXJlbmNlKCk7CisgICAgICAgIGFzc2VydE51bGwoYWkuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXQoKXsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlIGFpID0gbmV3IEF0b21pY1JlZmVyZW5jZShvbmUpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLGFpLmdldCgpKTsKKyAgICAgICAgYWkuc2V0KHR3byk7CisgICAgICAgIGFzc2VydEVxdWFscyh0d28sYWkuZ2V0KCkpOworICAgICAgICBhaS5zZXQobTMpOworICAgICAgICBhc3NlcnRFcXVhbHMobTMsYWkuZ2V0KCkpOworICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZSBpZiBlcXVhbCB0byBleHBlY3RlZCBlbHNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXQoKXsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlIGFpID0gbmV3IEF0b21pY1JlZmVyZW5jZShvbmUpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQob25lLHR3bykpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQodHdvLG00KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtNCxhaS5nZXQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFpLmNvbXBhcmVBbmRTZXQobTUsc2V2ZW4pKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoKHNldmVuLmVxdWFscyhhaS5nZXQoKSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KG00LHNldmVuKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXZlbixhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBpbiBvbmUgdGhyZWFkIGVuYWJsZXMgYW5vdGhlciB3YWl0aW5nIGZvciB2YWx1ZQorICAgICAqIHRvIHN1Y2NlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldEluTXVsdGlwbGVUaHJlYWRzKCkgeworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljUmVmZXJlbmNlKG9uZSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSghYWkuY29tcGFyZUFuZFNldCh0d28sIHRocmVlKSkgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KG9uZSwgdHdvKSk7CisgICAgICAgICAgICB0LmpvaW4oTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWkuZ2V0KCksIHRocmVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwZWF0ZWQgd2Vha0NvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWUgd2hlbiBlcXVhbAorICAgICAqIHRvIGV4cGVjdGVkIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWFrQ29tcGFyZUFuZFNldCgpeworICAgICAgICBBdG9taWNSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljUmVmZXJlbmNlKG9uZSk7CisgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldChvbmUsdHdvKSk7CisgICAgICAgIHdoaWxlKCFhaS53ZWFrQ29tcGFyZUFuZFNldCh0d28sbTQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG00LGFpLmdldCgpKTsKKyAgICAgICAgd2hpbGUoIWFpLndlYWtDb21wYXJlQW5kU2V0KG00LHNldmVuKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXZlbixhaS5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QW5kU2V0IHJldHVybnMgcHJldmlvdXMgdmFsdWUgYW5kIHNldHMgdG8gZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kU2V0KCl7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZSBhaSA9IG5ldyBBdG9taWNSZWZlcmVuY2Uob25lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9uZSxhaS5nZXRBbmRTZXQoemVybykpOworICAgICAgICBhc3NlcnRFcXVhbHMoemVybyxhaS5nZXRBbmRTZXQobTEwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtMTAsYWkuZ2V0QW5kU2V0KG9uZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGEgZGVzZXJpYWxpemVkIHNlcmlhbGl6ZWQgYXRvbWljIGhvbGRzIHNhbWUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlIGwgPSBuZXcgQXRvbWljUmVmZXJlbmNlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGwuc2V0KG9uZSk7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChsKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlIHIgPSAoQXRvbWljUmVmZXJlbmNlKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5nZXQoKSwgci5nZXQoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgcmV0dXJucyBjdXJyZW50IHZhbHVlLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZTxJbnRlZ2VyPiBhaSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8SW50ZWdlcj4ob25lKTsgCisgICAgICAgIGFzc2VydEVxdWFscyhhaS50b1N0cmluZygpLCBvbmUudG9TdHJpbmcoKSk7CisgICAgICAgIGFpLnNldCh0d28pOworICAgICAgICBhc3NlcnRFcXVhbHMoYWkudG9TdHJpbmcoKSwgdHdvLnRvU3RyaW5nKCkpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY1N0YW1wZWRSZWZlcmVuY2VUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0F0b21pY1N0YW1wZWRSZWZlcmVuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZmYzBhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQXRvbWljU3RhbXBlZFJlZmVyZW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy4qOworCitwdWJsaWMgY2xhc3MgQXRvbWljU3RhbXBlZFJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZXsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEF0b21pY1N0YW1wZWRSZWZlcmVuY2VUZXN0LmNsYXNzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdG8gZ2l2ZW4gcmVmZXJlbmNlIGFuZCBzdGFtcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpeworICAgICAgICBBdG9taWNTdGFtcGVkUmVmZXJlbmNlIGFpID0gbmV3IEF0b21pY1N0YW1wZWRSZWZlcmVuY2Uob25lLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9uZSxhaS5nZXRSZWZlcmVuY2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBhaS5nZXRTdGFtcCgpKTsKKyAgICAgICAgQXRvbWljU3RhbXBlZFJlZmVyZW5jZSBhMiA9IG5ldyBBdG9taWNTdGFtcGVkUmVmZXJlbmNlKG51bGwsIDEpOworICAgICAgICBhc3NlcnROdWxsKGEyLmdldFJlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGEyLmdldFN0YW1wKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogIGdldCByZXR1cm5zIHRoZSBsYXN0IHZhbHVlcyBvZiByZWZlcmVuY2UgYW5kIHN0YW1wIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXQoKXsKKyAgICAgICAgaW50W10gbWFyayA9IG5ldyBpbnRbMV07CisgICAgICAgIEF0b21pY1N0YW1wZWRSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljU3RhbXBlZFJlZmVyZW5jZShvbmUsIDApOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLGFpLmdldFJlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFpLmdldFN0YW1wKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbWFya1swXSk7CisgICAgICAgIGFpLnNldCh0d28sIDApOworICAgICAgICBhc3NlcnRFcXVhbHModHdvLGFpLmdldFJlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFpLmdldFN0YW1wKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHdvLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbWFya1swXSk7CisgICAgICAgIGFpLnNldChvbmUsIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLGFpLmdldFJlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFpLmdldFN0YW1wKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxtYXJrWzBdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgYXR0ZW1wdFN0YW1wIHN1Y2NlZWRzIGluIHNpbmdsZSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0ZW1wdFN0YW1wKCl7CisgICAgICAgIGludFtdIG1hcmsgPSBuZXcgaW50WzFdOworICAgICAgICBBdG9taWNTdGFtcGVkUmVmZXJlbmNlIGFpID0gbmV3IEF0b21pY1N0YW1wZWRSZWZlcmVuY2Uob25lLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFpLmdldFN0YW1wKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFpLmF0dGVtcHRTdGFtcChvbmUsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFpLmdldFN0YW1wKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFya1swXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGFyZUFuZFNldCBzdWNjZWVkcyBpbiBjaGFuZ2luZyB2YWx1ZXMgaWYgZXF1YWwgdG8gZXhwZWN0ZWQgcmVmZXJlbmNlCisgICAgICogYW5kIHN0YW1wIGVsc2UgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUFuZFNldCgpeworICAgICAgICBpbnRbXSBtYXJrID0gbmV3IGludFsxXTsKKyAgICAgICAgQXRvbWljU3RhbXBlZFJlZmVyZW5jZSBhaSA9IG5ldyBBdG9taWNTdGFtcGVkUmVmZXJlbmNlKG9uZSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhvbmUsIGFpLmdldChtYXJrKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBhaS5nZXRTdGFtcCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcmtbMF0pOworCisgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChvbmUsIHR3bywgMCwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHdvLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbWFya1swXSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShhaS5jb21wYXJlQW5kU2V0KHR3bywgbTMsIDAsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0zLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFya1swXSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWkuY29tcGFyZUFuZFNldCh0d28sIG0zLCAxLCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtMywgYWkuZ2V0KG1hcmspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcmtbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgaW4gb25lIHRocmVhZCBlbmFibGVzIGFub3RoZXIgd2FpdGluZyBmb3IgcmVmZXJlbmNlIHZhbHVlCisgICAgICogdG8gc3VjY2VlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlQW5kU2V0SW5NdWx0aXBsZVRocmVhZHMoKSB7CisgICAgICAgIGZpbmFsIEF0b21pY1N0YW1wZWRSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljU3RhbXBlZFJlZmVyZW5jZShvbmUsIDApOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIWFpLmNvbXBhcmVBbmRTZXQodHdvLCB0aHJlZSwgMCwgMCkpIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWkuY29tcGFyZUFuZFNldChvbmUsIHR3bywgMCwgMCkpOworICAgICAgICAgICAgdC5qb2luKExPTkdfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFpLmdldFJlZmVyZW5jZSgpLCB0aHJlZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWkuZ2V0U3RhbXAoKSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBhcmVBbmRTZXQgaW4gb25lIHRocmVhZCBlbmFibGVzIGFub3RoZXIgd2FpdGluZyBmb3Igc3RhbXAgdmFsdWUKKyAgICAgKiB0byBzdWNjZWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVBbmRTZXRJbk11bHRpcGxlVGhyZWFkczIoKSB7CisgICAgICAgIGZpbmFsIEF0b21pY1N0YW1wZWRSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljU3RhbXBlZFJlZmVyZW5jZShvbmUsIDApOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIWFpLmNvbXBhcmVBbmRTZXQob25lLCBvbmUsIDEsIDIpKSBUaHJlYWQueWllbGQoKTsKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFpLmNvbXBhcmVBbmRTZXQob25lLCBvbmUsIDAsIDEpKTsKKyAgICAgICAgICAgIHQuam9pbihMT05HX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQuaXNBbGl2ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhaS5nZXRSZWZlcmVuY2UoKSwgb25lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhaS5nZXRTdGFtcCgpLCAyKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwZWF0ZWQgd2Vha0NvbXBhcmVBbmRTZXQgc3VjY2VlZHMgaW4gY2hhbmdpbmcgdmFsdWVzIHdoZW4gZXF1YWwKKyAgICAgKiB0byBleHBlY3RlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vha0NvbXBhcmVBbmRTZXQoKXsKKyAgICAgICAgaW50W10gbWFyayA9IG5ldyBpbnRbMV07CisgICAgICAgIEF0b21pY1N0YW1wZWRSZWZlcmVuY2UgYWkgPSBuZXcgQXRvbWljU3RhbXBlZFJlZmVyZW5jZShvbmUsIDApOworICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBhaS5nZXQobWFyaykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYWkuZ2V0U3RhbXAgKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbWFya1swXSk7CisKKyAgICAgICAgd2hpbGUoIWFpLndlYWtDb21wYXJlQW5kU2V0KG9uZSwgdHdvLCAwLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0d28sIGFpLmdldChtYXJrKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtYXJrWzBdKTsKKworICAgICAgICB3aGlsZSghYWkud2Vha0NvbXBhcmVBbmRTZXQodHdvLCBtMywgMCwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobTMsIGFpLmdldChtYXJrKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtYXJrWzBdKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXBUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliM2VjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgQ29uY3VycmVudEhhc2hNYXBUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2V7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29uY3VycmVudEhhc2hNYXBUZXN0LmNsYXNzKTsKKyAgICB9CisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgIHN0YXRpYyBjbGFzcyBNeUNvbmN1cnJlbnRIYXNoTWFwPFYsIEs+IGV4dGVuZHMgQ29uY3VycmVudEhhc2hNYXA8SywgVj4KKyAgICAgICAgICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgICAgICBwdWJsaWMgTXlDb25jdXJyZW50SGFzaE1hcCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXlDb25jdXJyZW50SGFzaE1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLAorICAgICAgICAgICAgICAgIGludCBjb25jdXJyZW5jeUxldmVsKSB7CisgICAgICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IsIGNvbmN1cnJlbmN5TGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE15Q29uY3VycmVudEhhc2hNYXAoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgICAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeUNvbmN1cnJlbnRIYXNoTWFwKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IHQpIHsKKyAgICAgICAgICAgIHN1cGVyKHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG1hcCBmcm9tIEludGVnZXJzIDEtNSB0byBTdHJpbmdzICJBIi0iRSIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTXlDb25jdXJyZW50SGFzaE1hcCBteU1hcDUoKSB7CisgICAgICAgIE15Q29uY3VycmVudEhhc2hNYXAgbWFwID0gbmV3IE15Q29uY3VycmVudEhhc2hNYXAoNSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmlzRW1wdHkoKSk7CisgICAgICAgIG1hcC5wdXQob25lLCAiQSIpOworICAgICAgICBtYXAucHV0KHR3bywgIkIiKTsKKyAgICAgICAgbWFwLnB1dCh0aHJlZSwgIkMiKTsKKyAgICAgICAgbWFwLnB1dChmb3VyLCAiRCIpOworICAgICAgICBtYXAucHV0KGZpdmUsICJFIik7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcC5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbWFwLnNpemUoKSk7CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbWFwIGZyb20gSW50ZWdlcnMgMS01IHRvIFN0cmluZ3MgIkEiLSJFIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb25jdXJyZW50SGFzaE1hcCBtYXA1KCkgeyAgIAorICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoNSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmlzRW1wdHkoKSk7CisgICAgICAgIG1hcC5wdXQob25lLCAiQSIpOworICAgICAgICBtYXAucHV0KHR3bywgIkIiKTsKKyAgICAgICAgbWFwLnB1dCh0aHJlZSwgIkMiKTsKKyAgICAgICAgbWFwLnB1dChmb3VyLCAiRCIpOworICAgICAgICBtYXAucHV0KGZpdmUsICJFIik7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcC5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbWFwLnNpemUoKSk7CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogIGNsZWFyIHJlbW92ZXMgYWxsIHBhaXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIG1hcC5jbGVhcigpOworICAgICAgICBhc3NlcnRFcXVhbHMobWFwLnNpemUoKSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIE1hcHMgd2l0aCBzYW1lIGNvbnRlbnRzIGFyZSBlcXVhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIG1hcDEgPSBtYXA1KCk7CisgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIG1hcDIgPSBtYXA1KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1hcDIsIG1hcDEpOworICAgICAgICBtYXAxLmNsZWFyKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcDEuZXF1YWxzKG1hcDIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWFwMi5lcXVhbHMobWFwMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBjb250YWlucyByZXR1cm5zIHRydWUgZm9yIGNvbnRhaW5lZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWlucygiQSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWFwLmNvbnRhaW5zKCJaIikpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgY29udGFpbnNLZXkgcmV0dXJucyB0cnVlIGZvciBjb250YWluZWQga2V5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zS2V5KCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KG9uZSkpOworICAgICAgICBhc3NlcnRGYWxzZShtYXAuY29udGFpbnNLZXkoemVybykpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBjb250YWluc1ZhbHVlIHJldHVybnMgdHJ1ZSBmb3IgaGVsZCB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNWYWx1ZSgpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWlucygiQSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWFwLmNvbnRhaW5zKCJaIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgZW51bWVyYXRpb24gcmV0dXJucyBhbiBlbnVtZXJhdGlvbiBjb250YWluaW5nIHRoZSBjb3JyZWN0CisgICAgICogICBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtZXJhdGlvbigpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gbWFwLmVsZW1lbnRzKCk7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoNSwgY291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgQ2xvbmUgY3JlYXRlcyBhbiBlcXVhbCBtYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBNeUNvbmN1cnJlbnRIYXNoTWFwIG1hcCA9bXlNYXA1KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNeUNvbmN1cnJlbnRIYXNoTWFwIG0yID0gKE15Q29uY3VycmVudEhhc2hNYXApKG1hcC5jbG9uZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtYXAsIG0yKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiY2xvbmUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHJldHVybnMgdGhlIGNvcnJlY3QgZWxlbWVudCBhdCB0aGUgZ2l2ZW4ga2V5LAorICAgICAqICBvciBudWxsIGlmIG5vdCBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCAoU3RyaW5nKW1hcC5nZXQob25lKSk7CisgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIGVtcHR5ID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKCk7CisgICAgICAgIGFzc2VydE51bGwobWFwLmdldCgiYW55dGhpbmciKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIGlzRW1wdHkgaXMgdHJ1ZSBvZiBlbXB0eSBtYXAgYW5kIGZhbHNlIGZvciBub24tZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgZW1wdHkgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoKTsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBhc3NlcnRUcnVlKGVtcHR5LmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAga2V5cyByZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzIGZyb20gdGhlIG1hcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlzKCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBtYXAua2V5cygpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKXsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGNvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIGtleVNldCByZXR1cm5zIGEgU2V0IGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEtleVNldCgpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBTZXQgcyA9IG1hcC5rZXlTZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKG9uZSkpOworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnModHdvKSk7CisgICAgICAgIGFzc2VydFRydWUocy5jb250YWlucyh0aHJlZSkpOworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoZm91cikpOworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoZml2ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZhbHVlcyBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzKCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIENvbGxlY3Rpb24gcyA9IG1hcC52YWx1ZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJBIikpOworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoIkIiKSk7CisgICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygiQyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJEIikpOworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoIkUiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZW50cnlTZXQgY29udGFpbnMgYWxsIHBhaXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0KCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIFNldCBzID0gbWFwLmVudHJ5U2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBzLnNpemUoKSk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIAorICAgICAgICAgICAgICAgICAgICAgICAoZS5nZXRLZXkoKS5lcXVhbHMob25lKSAmJiBlLmdldFZhbHVlKCkuZXF1YWxzKCJBIikpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChlLmdldEtleSgpLmVxdWFscyh0d28pICYmIGUuZ2V0VmFsdWUoKS5lcXVhbHMoIkIiKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKGUuZ2V0S2V5KCkuZXF1YWxzKHRocmVlKSAmJiBlLmdldFZhbHVlKCkuZXF1YWxzKCJDIikpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChlLmdldEtleSgpLmVxdWFscyhmb3VyKSAmJiBlLmdldFZhbHVlKCkuZXF1YWxzKCJEIikpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChlLmdldEtleSgpLmVxdWFscyhmaXZlKSAmJiBlLmdldFZhbHVlKCkuZXF1YWxzKCJFIikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICAgcHV0QWxsICBhZGRzIGFsbCBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgZ2l2ZW4gbWFwCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1dEFsbCgpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgZW1wdHkgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoKTsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBlbXB0eS5wdXRBbGwobWFwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGVtcHR5LnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoZW1wdHkuY29udGFpbnNLZXkob25lKSk7CisgICAgICAgIGFzc2VydFRydWUoZW1wdHkuY29udGFpbnNLZXkodHdvKSk7CisgICAgICAgIGFzc2VydFRydWUoZW1wdHkuY29udGFpbnNLZXkodGhyZWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbXB0eS5jb250YWluc0tleShmb3VyKSk7CisgICAgICAgIGFzc2VydFRydWUoZW1wdHkuY29udGFpbnNLZXkoZml2ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgcHV0SWZBYnNlbnQgd29ya3Mgd2hlbiB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1dElmQWJzZW50KCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIG1hcC5wdXRJZkFic2VudChzaXgsICJaIik7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KHNpeCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgcHV0SWZBYnNlbnQgZG9lcyBub3QgYWRkIHRoZSBwYWlyIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1dElmQWJzZW50MigpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCBtYXAucHV0SWZBYnNlbnQob25lLCAiWiIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIHJlcGxhY2UgZmFpbHMgd2hlbiB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2UoKSB7CisgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIG1hcCA9IG1hcDUoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtYXAucmVwbGFjZShzaXgsICJaIikpOworICAgICAgICBhc3NlcnRGYWxzZShtYXAuY29udGFpbnNLZXkoc2l4KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogICByZXBsYWNlIHN1Y2NlZWRzIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2UyKCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFwLnJlcGxhY2Uob25lLCAiWiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJaIiwgbWFwLmdldChvbmUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHJlcGxhY2UgdmFsdWUgZmFpbHMgd2hlbiB0aGUgZ2l2ZW4ga2V5IG5vdCBtYXBwZWQgdG8gZXhwZWN0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVZhbHVlKCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSIsIG1hcC5nZXQob25lKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcC5yZXBsYWNlKG9uZSwgIloiLCAiWiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiwgbWFwLmdldChvbmUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXBsYWNlIHZhbHVlIHN1Y2NlZWRzIHdoZW4gdGhlIGdpdmVuIGtleSBtYXBwZWQgdG8gZXhwZWN0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVZhbHVlMigpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCBtYXAuZ2V0KG9uZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5yZXBsYWNlKG9uZSwgIkEiLCAiWiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJaIiwgbWFwLmdldChvbmUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgcmVtb3ZlIHJlbW92ZXMgdGhlIGNvcnJlY3Qga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgbWFwCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBtYXAucmVtb3ZlKGZpdmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgbWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hcC5jb250YWluc0tleShmaXZlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlKGtleSx2YWx1ZSkgcmVtb3ZlcyBvbmx5IGlmIHBhaXIgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUyKCkgeworICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBtYXA1KCk7CisgICAgICAgIG1hcC5yZW1vdmUoZml2ZSwgIkUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtYXAuY29udGFpbnNLZXkoZml2ZSkpOworICAgICAgICBtYXAucmVtb3ZlKGZvdXIsICJBIik7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoZm91cikpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogICBzaXplIHJldHVybnMgdGhlIGNvcnJlY3QgdmFsdWVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7CisgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIG1hcCA9IG1hcDUoKTsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgZW1wdHkgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVtcHR5LnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBtYXAuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyBjb250YWlucyB0b1N0cmluZyBvZiBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgbWFwID0gbWFwNSgpOworICAgICAgICBTdHJpbmcgcyA9IG1hcC50b1N0cmluZygpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSA1OyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy5pbmRleE9mKFN0cmluZy52YWx1ZU9mKGkpKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0gICAgICAgIAorCisgICAgLy8gRXhjZXB0aW9uIHRlc3RzCisgICAgCisgICAgLyoqCisgICAgICogQ2Fubm90IGNyZWF0ZSB3aXRoIG5lZ2F0aXZlIGNhcGFjaXR5IAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXAoLTEsMCwxKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5ub3QgY3JlYXRlIHdpdGggbmVnYXRpdmUgY29uY3VycmVuY3kgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwKDEsMCwtMSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2Fubm90IGNyZWF0ZSB3aXRoIG9ubHkgbmVnYXRpdmUgY2FwYWNpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwKC0xKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRfTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBjID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKDUpOworICAgICAgICAgICAgYy5nZXQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb250YWluc0tleShudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zS2V5X051bGxQb2ludGVyRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgYyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCg1KTsKKyAgICAgICAgICAgIGMuY29udGFpbnNLZXkobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb250YWluc1ZhbHVlKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNWYWx1ZV9OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIGMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoNSk7CisgICAgICAgICAgICBjLmNvbnRhaW5zVmFsdWUobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb250YWlucyhudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zX051bGxQb2ludGVyRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgYyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCg1KTsKKyAgICAgICAgICAgIGMuY29udGFpbnMobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwdXQobnVsbCx4KSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1dDFfTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBjID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKDUpOworICAgICAgICAgICAgYy5wdXQobnVsbCwgIndoYXRldmVyIik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwdXQoeCwgbnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQyX051bGxQb2ludGVyRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgYyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCg1KTsKKyAgICAgICAgICAgIGMucHV0KCJ3aGF0ZXZlciIsIG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogcHV0SWZBYnNlbnQobnVsbCwgeCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRJZkFic2VudDFfTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBjID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKDUpOworICAgICAgICAgICAgYy5wdXRJZkFic2VudChudWxsLCAid2hhdGV2ZXIiKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGxhY2UobnVsbCwgeCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlX051bGxQb2ludGVyRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgYyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCg1KTsKKyAgICAgICAgICAgIGMucmVwbGFjZShudWxsLCAid2hhdGV2ZXIiKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGxhY2UobnVsbCwgeCwgeSkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlVmFsdWVfTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBjID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKDUpOworICAgICAgICAgICAgYy5yZXBsYWNlKG51bGwsIG9uZSwgIndoYXRldmVyIik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwdXRJZkFic2VudCh4LCBudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1dElmQWJzZW50Ml9OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIGMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoNSk7CisgICAgICAgICAgICBjLnB1dElmQWJzZW50KCJ3aGF0ZXZlciIsIG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKXt9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiByZXBsYWNlKHgsIG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZTJfTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBjID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKDUpOworICAgICAgICAgICAgYy5yZXBsYWNlKCJ3aGF0ZXZlciIsIG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwbGFjZSh4LCBudWxsLCB5KSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VWYWx1ZTJfTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBjID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKDUpOworICAgICAgICAgICAgYy5yZXBsYWNlKCJ3aGF0ZXZlciIsIG51bGwsICJBIik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXBsYWNlKHgsIHksIG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVZhbHVlM19OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIGMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoNSk7CisgICAgICAgICAgICBjLnJlcGxhY2UoIndoYXRldmVyIiwgb25lLCBudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSl7fQorICAgIH0KKworCisgICAgLyoqCisgICAgICogcmVtb3ZlKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMV9OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIGMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoNSk7CisgICAgICAgICAgICBjLnB1dCgic2Fkc2RmIiwgImFzZGFkcyIpOworICAgICAgICAgICAgYy5yZW1vdmUobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUobnVsbCwgeCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUyX051bGxQb2ludGVyRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgYyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCg1KTsKKyAgICAgICAgICAgIGMucHV0KCJzYWRzZGYiLCAiYXNkYWRzIik7CisgICAgICAgICAgICBjLnJlbW92ZShudWxsLCAid2hhdGV2ZXIiKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZGVzZXJpYWxpemVkIG1hcCBlcXVhbHMgb3JpZ2luYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgQ29uY3VycmVudEhhc2hNYXAgcSA9IG1hcDUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDAwKTsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShib3V0KSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QocSk7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShiaW4pKTsKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwIHIgPSAoQ29uY3VycmVudEhhc2hNYXApaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHEuc2l6ZSgpLCByLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuZXF1YWxzKHIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoci5lcXVhbHMocSkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldFZhbHVlIG9mIGFuIEVudHJ5U2V0IGVudHJ5IHNldHMgdmFsdWUgaW4gdGhlIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVXcml0ZVRocm91Z2goKSB7CisgICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBhIGJ1ZyByZXBvcnQgYnkgRXJpYyBab2VybmVyIAorICAgICAgICBDb25jdXJyZW50SGFzaE1hcCBtYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoMiwgNS4wZiwgMSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmlzRW1wdHkoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICAgICAgICAgIG1hcC5wdXQobmV3IEludGVnZXIoaSksIG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWFwLmlzRW1wdHkoKSk7CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTEgPSAoTWFwLkVudHJ5KW1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAKKyAgICAgICAgLy8gYXNzZXJ0IHRoYXQgZW50cnkxIGlzIG5vdCAxNgorICAgICAgICBhc3NlcnRUcnVlKCJlbnRyeSBpcyAxNiwgdGVzdCBub3QgdmFsaWQiLAorICAgICAgICAgICAgICAgICAgICFlbnRyeTEuZ2V0S2V5KCkuZXF1YWxzKG5ldyBJbnRlZ2VyKDE2KSkpOworICAgICAgICAKKyAgICAgICAgLy8gcmVtb3ZlIDE2IChhIGRpZmZlcmVudCBrZXkpIGZyb20gbWFwIAorICAgICAgICAvLyB3aGljaCBqdXN0IGhhcHBlbnMgdG8gY2F1c2UgZW50cnkxIHRvIGJlIGNsb25lZCBpbiBtYXAKKyAgICAgICAgbWFwLnJlbW92ZShuZXcgSW50ZWdlcigxNikpOworICAgICAgICBlbnRyeTEuc2V0VmFsdWUoIlhZWiIpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc1ZhbHVlKCJYWVoiKSk7IC8vIGZhaWxzCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWVUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDhlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWVUZXN0LmphdmEKQEAgLTAsMCArMSw1MzcgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIENvbmN1cnJlbnRMaW5rZWRRdWV1ZVRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENvbmN1cnJlbnRMaW5rZWRRdWV1ZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHF1ZXVlIG9mIGdpdmVuIHNpemUgY29udGFpbmluZyBjb25zZWN1dGl2ZQorICAgICAqIEludGVnZXJzIDAgLi4uIG4uCisgICAgICovCisgICAgcHJpdmF0ZSBDb25jdXJyZW50TGlua2VkUXVldWUgcG9wdWxhdGVkUXVldWUoaW50IG4pIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG4sIHEuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIG5ldyBxdWV1ZSBpcyBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjEoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgSW5pdGlhbGl6aW5nIGZyb20gbnVsbCBDb2xsZWN0aW9uIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKChDb2xsZWN0aW9uKW51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXppbmcgZnJvbSBDb2xsZWN0aW9uIG9mIG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXppbmcgZnJvbSBDb2xsZWN0aW9uIHdpdGggc29tZSBudWxsIGVsZW1lbnRzIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRS0xOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBjb250YWlucyBhbGwgZWxlbWVudHMgb2YgY29sbGVjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I2KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZShBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnBvbGwoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIGlzRW1wdHkgaXMgdHJ1ZSBiZWZvcmUgYWRkLCBmYWxzZSBhZnRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICBxLmFkZChvbmUpOworICAgICAgICBhc3NlcnRGYWxzZShxLmlzRW1wdHkoKSk7CisgICAgICAgIHEuYWRkKHR3byk7CisgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNpemUgY2hhbmdlcyB3aGVuIGVsZW1lbnRzIGFkZGVkIGFuZCByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7CisgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRS1pLCBxLnNpemUoKSk7CisgICAgICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgcS5zaXplKCkpOworICAgICAgICAgICAgcS5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogb2ZmZXIobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlck51bGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWUoKTsKKyAgICAgICAgICAgIHEub2ZmZXIobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCk7CisgICAgICAgICAgICBxLmFkZChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsgfSAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogT2ZmZXIgcmV0dXJucyB0cnVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE9mZmVyKCkgeworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKHplcm8pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKG9uZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCByZXR1cm5zIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgeworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBxLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuYWRkKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCk7CisgICAgICAgICAgICBxLmFkZEFsbChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkQWxsKHRoaXMpIHRocm93cyBJQUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsU2VsZigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBxLmFkZEFsbChxKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZEFsbCBvZiBhIGNvbGxlY3Rpb24gd2l0aCBudWxsIGVsZW1lbnRzIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZSgpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisgICAgLyoqCisgICAgICogIGFkZEFsbCBvZiBhIGNvbGxlY3Rpb24gd2l0aCBhbnkgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFIGFmdGVyCisgICAgICogcG9zc2libHkgYWRkaW5nIHNvbWUgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZSgpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRS0xOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgcS5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXVlIGNvbnRhaW5zIGFsbCBlbGVtZW50cywgaW4gdHJhdmVyc2FsIG9yZGVyLCBvZiBzdWNjZXNzZnVsIGFkZEFsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGVtcHR5ID0gbmV3IEludGVnZXJbMF07CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmFkZEFsbChBcnJheXMuYXNMaXN0KGVtcHR5KSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50c1tpXSwgcS5wb2xsKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwb2xsIHN1Y2NlZWRzIHVubGVzcyBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQb2xsKCkgeworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBvbGwoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGVlayByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgbnVsbCBpZiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgeworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBlZWsoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5wZWVrKCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICBpICE9ICgoSW50ZWdlcilxLnBlZWsoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChxLnBlZWsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZWxlbWVudCByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgdGhyb3dzIE5TRUUgaWYgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudCgpIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5lbGVtZW50KCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgcS5wb2xsKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZWxlbWVudCgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqICByZW1vdmUgcmVtb3ZlcyBuZXh0IGVsZW1lbnQsIG9yIHRocm93cyBOU0VFIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5yZW1vdmUoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlKHgpIHJlbW92ZXMgeCBhbmQgcmV0dXJucyB0cnVlIGlmIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudCgpIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBTSVpFOyBpKz0yKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKz0yKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLnJlbW92ZShuZXcgSW50ZWdlcihpKzEpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBjb250YWlucyh4KSByZXBvcnRzIHRydWUgd2hlbiBlbGVtZW50cyBhZGRlZCBidXQgbm90IHlldCByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgeworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnMobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsZWFyIHJlbW92ZXMgYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBxLmNsZWFyKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5zaXplKCkpOworICAgICAgICBxLmFkZChvbmUpOworICAgICAgICBhc3NlcnRGYWxzZShxLmlzRW1wdHkoKSk7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udGFpbnNBbGwoYykgaXMgdHJ1ZSB3aGVuIGMgY29udGFpbnMgYSBzdWJzZXQgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7CisgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBwID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHAuY29udGFpbnNBbGwocSkpOworICAgICAgICAgICAgcC5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUocC5jb250YWluc0FsbChxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0YWluQWxsKGMpIHJldGFpbnMgb25seSB0aG9zZSBlbGVtZW50cyBvZiBjIGFuZCByZXBvcnRzIHRydWUgaWYgY2hhbmdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHAgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IHEucmV0YWluQWxsKHApOworICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShjaGFuZ2VkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNoYW5nZWQpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnNBbGwocCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUtaSwgcS5zaXplKCkpOworICAgICAgICAgICAgcC5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZUFsbChjKSByZW1vdmVzIG9ubHkgdGhvc2UgZWxlbWVudHMgb2YgYyBhbmQgcmVwb3J0cyB0cnVlIGlmIGNoYW5nZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgeworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBJID0gKEludGVnZXIpKHAucmVtb3ZlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnMoSSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9BcnJheSBjb250YWlucyBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgT2JqZWN0W10gbyA9IHEudG9BcnJheSgpOworICAgICAgICBBcnJheXMuc29ydChvKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob1tpXSwgcS5wb2xsKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICB0b0FycmF5KGEpIGNvbnRhaW5zIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKKyAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgaW50cyA9IChJbnRlZ2VyW10pcS50b0FycmF5KGludHMpOworICAgICAgICBBcnJheXMuc29ydChpbnRzKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGludHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50c1tpXSwgcS5wb2xsKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRvQXJyYXkobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5X0JhZEFyZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBPYmplY3Qgb1tdID0gcS50b0FycmF5KG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9BcnJheSB3aXRoIGluY29tcGF0aWJsZSBhcnJheSB0eXBlIHRocm93cyBDQ0UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTFfQmFkQXJnKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIE9iamVjdCBvW10gPSBxLnRvQXJyYXkobmV3IFN0cmluZ1sxMF0gKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goQXJyYXlTdG9yZUV4Y2VwdGlvbiAgc3VjY2Vzcyl7fQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgaXRlcmF0b3IgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgSXRlcmF0b3IgaXQgPSBxLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKGl0Lm5leHQoKSkpOworICAgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBTSVpFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpdGVyYXRvciBvcmRlcmluZyBpcyBGSUZPCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT3JkZXJpbmcoKSB7CisgICAgICAgIGZpbmFsIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZSgpOworICAgICAgICBxLmFkZChvbmUpOworICAgICAgICBxLmFkZCh0d28pOworICAgICAgICBxLmFkZCh0aHJlZSk7CisKKyAgICAgICAgaW50IGsgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpbnQgaSA9ICgoSW50ZWdlcikoaXQubmV4dCgpKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygrK2ssIGkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGspOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWNhdGlvbnMgZG8gbm90IGNhdXNlIGl0ZXJhdG9ycyB0byBmYWlsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdlYWtseUNvbnNpc3RlbnRJdGVyYXRpb24gKCkgeworICAgICAgICBmaW5hbCBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWUoKTsKKyAgICAgICAgcS5hZGQob25lKTsKKyAgICAgICAgcS5hZGQodHdvKTsKKyAgICAgICAgcS5hZGQodGhyZWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygicXVldWUgc2hvdWxkIGJlIGVtcHR5IGFnYWluIiwgMCwgcS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGl0ZXJhdG9yLnJlbW92ZSByZW1vdmVzIGN1cnJlbnQgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvclJlbW92ZSAoKSB7CisgICAgICAgIGZpbmFsIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZSgpOworICAgICAgICBxLmFkZChvbmUpOworICAgICAgICBxLmFkZCh0d28pOworICAgICAgICBxLmFkZCh0aHJlZSk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICBpdCA9IHEuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0Lm5leHQoKSwgdHdvKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0Lm5leHQoKSwgdGhyZWUpOworICAgICAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgY29udGFpbnMgdG9TdHJpbmdzIG9mIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBTdHJpbmcgcyA9IHEudG9TdHJpbmcoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy5pbmRleE9mKFN0cmluZy52YWx1ZU9mKGkpKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0gICAgICAgIAorCisgICAgLyoqCisgICAgICogQSBkZXNlcmlhbGl6ZWQgc2VyaWFsaXplZCBxdWV1ZSBoYXMgc2FtZSBlbGVtZW50cyBpbiBzYW1lIG9yZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB7CisgICAgICAgIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChxKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgQ29uY3VycmVudExpbmtlZFF1ZXVlIHIgPSAoQ29uY3VycmVudExpbmtlZFF1ZXVlKWluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhxLnNpemUoKSwgci5zaXplKCkpOworICAgICAgICAgICAgd2hpbGUgKCFxLmlzRW1wdHkoKSkgCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHEucmVtb3ZlKCksIHIucmVtb3ZlKCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5TGlzdFRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDIwODAzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3RUZXN0LmphdmEKQEAgLTAsMCArMSw2MjMgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIENvcHlPbldyaXRlQXJyYXlMaXN0VGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNleworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29weU9uV3JpdGVBcnJheUxpc3RUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ29weU9uV3JpdGVBcnJheUxpc3QgcG9wdWxhdGVkQXJyYXkoaW50IG4peworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBhID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoYS5pc0VtcHR5KCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgCisgICAgICAgICAgICBhLmFkZChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG4sIGEuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBhIG5ldyBsaXN0IGlzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBhID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoYS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5ldyBsaXN0IGNvbnRhaW5zIGFsbCBlbGVtZW50cyBvZiBpbml0aWFsaXppbmcgYXJyYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyKCkgeworICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkUtMTsgKytpKQorICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBhID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KGludHMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50c1tpXSwgYS5nZXQoaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5ldyBsaXN0IGNvbnRhaW5zIGFsbCBlbGVtZW50cyBvZiBpbml0aWFsaXppbmcgY29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjMoKSB7CisgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRS0xOyArK2kpCisgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGEgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSAKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBhLmdldChpKSk7CisgICAgfQorICAgICAgICAKKworICAgIC8qKgorICAgICAqICAgYWRkQWxsICBhZGRzIGVhY2ggZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgZnVsbCA9IHBvcHVsYXRlZEFycmF5KDMpOworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdi5hZGQodGhyZWUpOworICAgICAgICB2LmFkZChmb3VyKTsKKyAgICAgICAgdi5hZGQoZml2ZSk7CisgICAgICAgIGZ1bGwuYWRkQWxsKHYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgZnVsbC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgYWRkQWxsQWJzZW50IGFkZHMgZWFjaCBlbGVtZW50IGZyb20gdGhlIGdpdmVuIGNvbGxlY3Rpb24gdGhhdCBkaWQgbm90CisgICAgICogIGFscmVhZHkgZXhpc3QgaW4gdGhlIExpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQWJzZW50KCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoMyk7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICB2LmFkZCh0aHJlZSk7CisgICAgICAgIHYuYWRkKGZvdXIpOworICAgICAgICB2LmFkZChvbmUpOyAvLyB3aWxsIG5vdCBhZGQgdGhpcyBlbGVtZW50CisgICAgICAgIGZ1bGwuYWRkQWxsQWJzZW50KHYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgZnVsbC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgYWRkSWZBYnNlbnQgd2lsbCBub3QgYWRkIHRoZSBlbGVtZW50IGlmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZElmQWJzZW50KCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoU0laRSk7CisgICAgICAgIGZ1bGwuYWRkSWZBYnNlbnQob25lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUsIGZ1bGwuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIGFkZElmQWJzZW50IGFkZHMgdGhlIGVsZW1lbnQgd2hlbiBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRJZkFic2VudDIoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheShTSVpFKTsKKyAgICAgICAgZnVsbC5hZGRJZkFic2VudCh0aHJlZSk7CisgICAgICAgIGFzc2VydFRydWUoZnVsbC5jb250YWlucyh0aHJlZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgY2xlYXIgcmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgZnVsbCA9IHBvcHVsYXRlZEFycmF5KFNJWkUpOworICAgICAgICBmdWxsLmNsZWFyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBmdWxsLnNpemUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgQ2xvbmVkIGxpc3QgaXMgZXF1YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGwxID0gcG9wdWxhdGVkQXJyYXkoU0laRSk7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGwyID0gKENvcHlPbldyaXRlQXJyYXlMaXN0KShsMS5jbG9uZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgICAgIGwxLmNsZWFyKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGwxLmVxdWFscyhsMikpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgY29udGFpbnMgaXMgdHJ1ZSBmb3IgYWRkZWQgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheSgzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmdWxsLmNvbnRhaW5zKG9uZSkpOworICAgICAgICBhc3NlcnRGYWxzZShmdWxsLmNvbnRhaW5zKGZpdmUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRpbmcgYXQgYW4gaW5kZXggcGxhY2VzIGl0IGluIHRoZSBpbmRpY2F0ZWQgaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSW5kZXgoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheSgzKTsKKyAgICAgICAgZnVsbC5hZGQoMCwgbTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZnVsbC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobTEsIGZ1bGwuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHplcm8sIGZ1bGwuZ2V0KDEpKTsKKworICAgICAgICBmdWxsLmFkZCgyLCBtMik7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBmdWxsLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtMiwgZnVsbC5nZXQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHModHdvLCBmdWxsLmdldCg0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbGlzdHMgd2l0aCBzYW1lIGVsZW1lbnRzIGFyZSBlcXVhbCBhbmQgaGF2ZSBzYW1lIGhhc2hDb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYSA9IHBvcHVsYXRlZEFycmF5KDMpOworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBiID0gcG9wdWxhdGVkQXJyYXkoMyk7CisgICAgICAgIGFzc2VydFRydWUoYS5lcXVhbHMoYikpOworICAgICAgICBhc3NlcnRUcnVlKGIuZXF1YWxzKGEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEuaGFzaENvZGUoKSwgYi5oYXNoQ29kZSgpKTsKKyAgICAgICAgYS5hZGQobTEpOworICAgICAgICBhc3NlcnRGYWxzZShhLmVxdWFscyhiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGIuZXF1YWxzKGEpKTsKKyAgICAgICAgYi5hZGQobTEpOworICAgICAgICBhc3NlcnRUcnVlKGEuZXF1YWxzKGIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiLmVxdWFscyhhKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmhhc2hDb2RlKCksIGIuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogICBjb250YWluc0FsbCByZXR1cm5zIHRydWUgZm9yIGNvbGxlY3Rpb24gd2l0aCBzdWJzZXQgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheSgzKTsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHYuYWRkKG9uZSk7CisgICAgICAgIHYuYWRkKHR3byk7CisgICAgICAgIGFzc2VydFRydWUoZnVsbC5jb250YWluc0FsbCh2KSk7CisgICAgICAgIHYuYWRkKHNpeCk7CisgICAgICAgIGFzc2VydEZhbHNlKGZ1bGwuY29udGFpbnNBbGwodikpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgZ2V0IHJldHVybnMgdGhlICB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCAoKEludGVnZXIpZnVsbC5nZXQoMCkpLmludFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgaW5kZXhPZiBnaXZlcyB0aGUgaW5kZXggZm9yIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZigpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgZnVsbCA9IHBvcHVsYXRlZEFycmF5KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZnVsbC5pbmRleE9mKG9uZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGZ1bGwuaW5kZXhPZigicHVwcGllcyIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIGluZGV4T2YgZ2l2ZXMgdGhlIGluZGV4IGJhc2VkIG9uIHRoZSBnaXZlbiBpbmRleAorICAgICAqICBhdCB3aGljaCB0byBzdGFydCBzZWFyY2hpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZjIoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheSgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGZ1bGwuaW5kZXhPZihvbmUsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBmdWxsLmluZGV4T2Yob25lLCAyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogICBpc0VtcHR5IHJldHVybnMgdHJ1ZSB3aGVuIGVtcHR5LCBlbHNlIGZhbHNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGVtcHR5ID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheShTSVpFKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbXB0eS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZShmdWxsLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogICBpdGVyYXRvcigpIHJldHVybnMgYW4gaXRlcmF0b3IgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoU0laRSk7CisgICAgICAgIEl0ZXJhdG9yIGkgPSBmdWxsLml0ZXJhdG9yKCk7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IoaiA9IDA7IGkuaGFzTmV4dCgpOyBqKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaiwgKChJbnRlZ2VyKWkubmV4dCgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUsIGopOworICAgIH0KKworICAgIC8qKgorICAgICAqIGl0ZXJhdG9yLnJlbW92ZSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JSZW1vdmUgKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoU0laRSk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gZnVsbC5pdGVyYXRvcigpOworICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgY29udGFpbnMgdG9TdHJpbmcgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheSgzKTsKKyAgICAgICAgU3RyaW5nIHMgPSBmdWxsLnRvU3RyaW5nKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMuaW5kZXhPZihTdHJpbmcudmFsdWVPZihpKSkgPj0gMCk7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAKKworICAgIC8qKgorICAgICAqICAgbGFzdEluZGV4T2YgcmV0dXJucyB0aGUgaW5kZXggZm9yIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2YxKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoMyk7CisgICAgICAgIGZ1bGwuYWRkKG9uZSk7CisgICAgICAgIGZ1bGwuYWRkKHRocmVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGZ1bGwubGFzdEluZGV4T2Yob25lKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgZnVsbC5sYXN0SW5kZXhPZihzaXgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIGxhc3RJbmRleE9mIHJldHVybnMgdGhlIGluZGV4IGZyb20gdGhlIGdpdmVuIHN0YXJ0aW5nIHBvaW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdGxhc3RJbmRleE9mMigpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgZnVsbCA9IHBvcHVsYXRlZEFycmF5KDMpOworICAgICAgICBmdWxsLmFkZChvbmUpOworICAgICAgICBmdWxsLmFkZCh0aHJlZSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBmdWxsLmxhc3RJbmRleE9mKG9uZSwgNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGZ1bGwubGFzdEluZGV4T2YodGhyZWUsIDMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgbGlzdEl0ZXJhdG9yIHRyYXZlcnNlcyBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yMSgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgZnVsbCA9IHBvcHVsYXRlZEFycmF5KFNJWkUpOworICAgICAgICBMaXN0SXRlcmF0b3IgaSA9IGZ1bGwubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IoaiA9IDA7IGkuaGFzTmV4dCgpOyBqKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaiwgKChJbnRlZ2VyKWkubmV4dCgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUsIGopOworICAgIH0KKworICAgIC8qKgorICAgICAqICBsaXN0SXRlcmF0b3Igb25seSByZXR1cm5zIHRob3NlIGVsZW1lbnRzIGFmdGVyIHRoZSBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IyKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoMyk7CisgICAgICAgIExpc3RJdGVyYXRvciBpID0gZnVsbC5saXN0SXRlcmF0b3IoMSk7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IoaiA9IDA7IGkuaGFzTmV4dCgpOyBqKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaisxLCAoKEludGVnZXIpaS5uZXh0KCkpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogICByZW1vdmUgIHJlbW92ZXMgYW5kIHJldHVybnMgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBmdWxsID0gcG9wdWxhdGVkQXJyYXkoMyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0d28sIGZ1bGwucmVtb3ZlKDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZ1bGwuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIHJlbW92ZUFsbCAgcmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZW4gY29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheSgzKTsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHYuYWRkKG9uZSk7CisgICAgICAgIHYuYWRkKHR3byk7CisgICAgICAgIGZ1bGwucmVtb3ZlQWxsKHYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZnVsbC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgc2V0ICBjaGFuZ2VzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheSgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHR3bywgZnVsbC5zZXQoMiwgZm91cikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgKChJbnRlZ2VyKWZ1bGwuZ2V0KDIpKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIHNpemUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGVtcHR5ID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGZ1bGwgPSBwb3B1bGF0ZWRBcnJheShTSVpFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUsIGZ1bGwuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVtcHR5LnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogICB0b0FycmF5IHJldHVybnMgYW4gT2JqZWN0IGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgZnVsbCA9IHBvcHVsYXRlZEFycmF5KDMpOworICAgICAgICBPYmplY3RbXSBvID0gZnVsbC50b0FycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBvLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCAoKEludGVnZXIpb1swXSkuaW50VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCAoKEludGVnZXIpb1sxXSkuaW50VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCAoKEludGVnZXIpb1syXSkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogICB0b0FycmF5IHJldHVybnMgYW4gSW50ZWdlciBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBmcm9tCisgICAgICogICB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgZnVsbCA9IHBvcHVsYXRlZEFycmF5KDMpOworICAgICAgICBJbnRlZ2VyW10gaSA9IG5ldyBJbnRlZ2VyWzNdOworICAgICAgICBpID0gKEludGVnZXJbXSlmdWxsLnRvQXJyYXkoaSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBpWzBdLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaVsxXS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGlbMl0uaW50VmFsdWUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzdWJsaXN0cyBjb250YWlucyBlbGVtZW50cyBhdCBpbmRleGVzIG9mZnNldCBmcm9tIHRoZWlyIGJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdCgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYSA9IHBvcHVsYXRlZEFycmF5KDEwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhLnN1Ykxpc3QoMSwxKS5pc0VtcHR5KCkpOworICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgOTsgKytqKSB7CisgICAgICAgICAgICBmb3IoaW50IGkgPSBqIDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICAgICAgICAgICBMaXN0IGIgPSBhLnN1Ykxpc3QoaixpKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50IGsgPSBqOyBrIDwgaTsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihrKSwgYi5nZXQoay1qKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTGlzdCBzID0gYS5zdWJMaXN0KDIsIDUpOworICAgICAgICBhc3NlcnRFcXVhbHMocy5zaXplKCksIDMpOworICAgICAgICBzLnNldCgyLCBtMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmdldCg0KSwgbTEpOworICAgICAgICBzLmNsZWFyKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLnNpemUoKSwgNyk7CisgICAgfQorCisgICAgLy8gRXhjZXB0aW9uIHRlc3RzCisKKyAgICAvKioKKyAgICAgKiAgIHRvQXJyYXkgdGhyb3dzIGFuIEFycmF5U3RvcmVFeGNlcHRpb24gd2hlbiB0aGUgZ2l2ZW4gYXJyYXkKKyAgICAgKiAgY2FuIG5vdCBzdG9yZSB0aGUgb2JqZWN0cyBpbnNpZGUgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheV9BcnJheVN0b3JlRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpOworICAgICAgICAgICAgYy5hZGQoInpmYXNkZnNkZiIpOworICAgICAgICAgICAgYy5hZGQoImFzZGFkYXNkIik7CisgICAgICAgICAgICBjLnRvQXJyYXkobmV3IExvbmdbNV0pOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChBcnJheVN0b3JlRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIGdldCB0aHJvd3MgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBhIG5lZ2F0aXZlIGluZGV4CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldDFfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGMuZ2V0KC0xKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXt9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICAgZ2V0IHRocm93cyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uIGEgdG9vIGhpZ2ggaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Ml9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpOworICAgICAgICAgICAgYy5hZGQoImFzZGFzZCIpOworICAgICAgICAgICAgYy5hZGQoImFzZGFkIik7CisgICAgICAgICAgICBjLmdldCgxMDApOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIHNldCB0aHJvd3MgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBhIG5lZ2F0aXZlIGluZGV4CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldDFfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGMuc2V0KC0xLCJxd2VydHkiKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXt9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICAgc2V0IHRocm93cyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uIGEgdG9vIGhpZ2ggaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0MigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGMuYWRkKCJhc2Rhc2QiKTsKKyAgICAgICAgICAgIGMuYWRkKCJhc2RhZCIpOworICAgICAgICAgICAgYy5zZXQoMTAwLCAicXdlcnR5Iik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqICAgYWRkIHRocm93cyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uIGEgbmVnYXRpdmUgaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkMV9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpOworICAgICAgICAgICAgYy5hZGQoLTEsInF3ZXJ0eSIpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpe30KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogICBhZGQgdGhyb3dzIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb24gYSB0b28gaGlnaCBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGQyX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBjID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBjLmFkZCgiYXNkYXNkIik7CisgICAgICAgICAgICBjLmFkZCgiYXNkYXNkYXNkIik7CisgICAgICAgICAgICBjLmFkZCgxMDAsICJxd2VydHkiKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogICByZW1vdmUgdGhyb3dzIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb24gYSBuZWdhdGl2ZSBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUxX0luZGV4T3V0T2ZCb3VuZHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBjID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBjLnJlbW92ZSgtMSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqICAgcmVtb3ZlIHRocm93cyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uIGEgdG9vIGhpZ2ggaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMl9JbmRleE91dE9mQm91bmRzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpOworICAgICAgICAgICAgYy5hZGQoImFzZGFzZCIpOworICAgICAgICAgICAgYy5hZGQoImFkYXNkYXNkIik7CisgICAgICAgICAgICBjLnJlbW92ZSgxMDApOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpe30KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogICBhZGRBbGwgdGhyb3dzIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb24gYSBuZWdhdGl2ZSBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBjID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBjLmFkZEFsbCgtMSxuZXcgTGlua2VkTGlzdCgpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXt9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICAgYWRkQWxsIHRocm93cyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uIGEgdG9vIGhpZ2ggaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMl9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpOworICAgICAgICAgICAgYy5hZGQoImFzZGFzZCIpOworICAgICAgICAgICAgYy5hZGQoImFzZGFzZGFzZCIpOworICAgICAgICAgICAgYy5hZGRBbGwoMTAwLCBuZXcgTGlua2VkTGlzdCgpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogICBsaXN0SXRlcmF0b3IgdGhyb3dzIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb24gYSBuZWdhdGl2ZSBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IxX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBjID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBjLmxpc3RJdGVyYXRvcigtMSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqICAgbGlzdEl0ZXJhdG9yIHRocm93cyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uIGEgdG9vIGhpZ2ggaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yMl9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpOworICAgICAgICAgICAgYy5hZGQoImFkYXNkIik7CisgICAgICAgICAgICBjLmFkZCgiYXNkYXNkYXMiKTsKKyAgICAgICAgICAgIGMubGlzdEl0ZXJhdG9yKDEwMCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqICAgc3ViTGlzdCB0aHJvd3MgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBhIG5lZ2F0aXZlIGluZGV4CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN1Ykxpc3QxX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb3B5T25Xcml0ZUFycmF5TGlzdCBjID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBjLnN1Ykxpc3QoLTEsMTAwKTsKKworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIHN1Ykxpc3QgdGhyb3dzIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb24gYSB0b28gaGlnaCBpbmRleAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJMaXN0Ml9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpOworICAgICAgICAgICAgYy5hZGQoImFzZGFzZCIpOworICAgICAgICAgICAgYy5zdWJMaXN0KDEsMTAwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogICBzdWJMaXN0IHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIHNlY29uZCBpbmRleAorICAgICAqICBpcyBsb3dlciB0aGVuIHRoZSBmaXJzdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdDNfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvcHlPbldyaXRlQXJyYXlMaXN0IGMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGMuc3ViTGlzdCgzLDEpOworCisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIGEgZGVzZXJpYWxpemVkIHNlcmlhbGlzemVkIGxpc3QgaXMgZXF1YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgcSA9IHBvcHVsYXRlZEFycmF5KFNJWkUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChxKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgQ29weU9uV3JpdGVBcnJheUxpc3QgciA9IChDb3B5T25Xcml0ZUFycmF5TGlzdClpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIHIuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5lcXVhbHMocikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmVxdWFscyhxKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5U2V0VGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5U2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwOWZjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0NvcHlPbldyaXRlQXJyYXlTZXRUZXN0LmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIENvcHlPbldyaXRlQXJyYXlTZXRUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsgICAgICAgIAorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENvcHlPbldyaXRlQXJyYXlTZXRUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ29weU9uV3JpdGVBcnJheVNldCBwb3B1bGF0ZWRTZXQoaW50IG4peworICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IGEgPSBuZXcgQ29weU9uV3JpdGVBcnJheVNldCgpOworICAgICAgICBhc3NlcnRUcnVlKGEuaXNFbXB0eSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIAorICAgICAgICAgICAgYS5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICBhc3NlcnRGYWxzZShhLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBhLnNpemUoKSk7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQtY29uc3RydWN0ZWQgc2V0IGlzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IGEgPSBuZXcgQ29weU9uV3JpdGVBcnJheVNldCgpOworICAgICAgICBhc3NlcnRUcnVlKGEuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uLWNvbnN0cnVjdGVkIHNldCBob2xkcyBhbGwgb2YgaXRzIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMygpIHsKKyAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFLTE7ICsraSkKKyAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBhID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSAKKyAgICAgICAgICAgIGFzc2VydFRydWUoYS5jb250YWlucyhpbnRzW2ldKSk7CisgICAgfQorICAgICAgICAKKworICAgIC8qKgorICAgICAqICAgYWRkQWxsICBhZGRzIGVhY2ggZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBmdWxsID0gcG9wdWxhdGVkU2V0KDMpOworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdi5hZGQodGhyZWUpOworICAgICAgICB2LmFkZChmb3VyKTsKKyAgICAgICAgdi5hZGQoZml2ZSk7CisgICAgICAgIGZ1bGwuYWRkQWxsKHYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgZnVsbC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgYWRkQWxsIGFkZHMgZWFjaCBlbGVtZW50IGZyb20gdGhlIGdpdmVuIGNvbGxlY3Rpb24gdGhhdCBkaWQgbm90CisgICAgICogIGFscmVhZHkgZXhpc3QgaW4gdGhlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwyKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IGZ1bGwgPSBwb3B1bGF0ZWRTZXQoMyk7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICB2LmFkZCh0aHJlZSk7CisgICAgICAgIHYuYWRkKGZvdXIpOworICAgICAgICB2LmFkZChvbmUpOyAvLyB3aWxsIG5vdCBhZGQgdGhpcyBlbGVtZW50CisgICAgICAgIGZ1bGwuYWRkQWxsKHYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgZnVsbC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgYWRkIHdpbGwgbm90IGFkZCB0aGUgZWxlbWVudCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZDIoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgZnVsbC5hZGQob25lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGZ1bGwuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIGFkZCAgYWRkcyB0aGUgZWxlbWVudCB3aGVuIGl0IGRvZXMgbm90IGV4aXN0CisgICAgICogICBpbiB0aGUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZDMoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgZnVsbC5hZGQodGhyZWUpOworICAgICAgICBhc3NlcnRUcnVlKGZ1bGwuY29udGFpbnModGhyZWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIGNsZWFyICByZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgZnVsbC5jbGVhcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZnVsbC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgY29udGFpbnMgcmV0dXJucyB0cnVlIGZvciBhZGRlZCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBmdWxsID0gcG9wdWxhdGVkU2V0KDMpOworICAgICAgICBhc3NlcnRUcnVlKGZ1bGwuY29udGFpbnMob25lKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGZ1bGwuY29udGFpbnMoZml2ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2l0aCBlcXVhbCBlbGVtZW50cyBhcmUgZXF1YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IGEgPSBwb3B1bGF0ZWRTZXQoMyk7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgYiA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhLmVxdWFscyhiKSk7CisgICAgICAgIGFzc2VydFRydWUoYi5lcXVhbHMoYSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYS5oYXNoQ29kZSgpLCBiLmhhc2hDb2RlKCkpOworICAgICAgICBhLmFkZChtMSk7CisgICAgICAgIGFzc2VydEZhbHNlKGEuZXF1YWxzKGIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYi5lcXVhbHMoYSkpOworICAgICAgICBiLmFkZChtMSk7CisgICAgICAgIGFzc2VydFRydWUoYS5lcXVhbHMoYikpOworICAgICAgICBhc3NlcnRUcnVlKGIuZXF1YWxzKGEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEuaGFzaENvZGUoKSwgYi5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiAgIGNvbnRhaW5zQWxsIHJldHVybnMgdHJ1ZSBmb3IgY29sbGVjdGlvbnMgd2l0aCBzdWJzZXQgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHYuYWRkKG9uZSk7CisgICAgICAgIHYuYWRkKHR3byk7CisgICAgICAgIGFzc2VydFRydWUoZnVsbC5jb250YWluc0FsbCh2KSk7CisgICAgICAgIHYuYWRkKHNpeCk7CisgICAgICAgIGFzc2VydEZhbHNlKGZ1bGwuY29udGFpbnNBbGwodikpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgaXNFbXB0eSBpcyB0cnVlIHdoZW4gZW1wdHksIGVsc2UgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBlbXB0eSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0KCk7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbXB0eS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZShmdWxsLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogICBpdGVyYXRvcigpIHJldHVybnMgYW4gaXRlcmF0b3IgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNldCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgSXRlcmF0b3IgaSA9IGZ1bGwuaXRlcmF0b3IoKTsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvcihqID0gMDsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhqLCAoKEludGVnZXIpaS5uZXh0KCkpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogaXRlcmF0b3IgcmVtb3ZlIGlzIHVuc3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yUmVtb3ZlICgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBmdWxsID0gcG9wdWxhdGVkU2V0KDMpOworICAgICAgICBJdGVyYXRvciBpdCA9IGZ1bGwuaXRlcmF0b3IoKTsKKyAgICAgICAgaXQubmV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvU3RyaW5nIGhvbGRzIHRvU3RyaW5nIG9mIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IGZ1bGwgPSBwb3B1bGF0ZWRTZXQoMyk7CisgICAgICAgIFN0cmluZyBzID0gZnVsbC50b1N0cmluZygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzLmluZGV4T2YoU3RyaW5nLnZhbHVlT2YoaSkpID49IDApOworICAgICAgICB9CisgICAgfSAgICAgICAgCisKKworICAgIC8qKgorICAgICAqICAgcmVtb3ZlQWxsICByZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBnaXZlbiBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBmdWxsID0gcG9wdWxhdGVkU2V0KDMpOworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdi5hZGQob25lKTsKKyAgICAgICAgdi5hZGQodHdvKTsKKyAgICAgICAgZnVsbC5yZW1vdmVBbGwodik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBmdWxsLnNpemUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgcmVtb3ZlcyBhbiBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBmdWxsID0gcG9wdWxhdGVkU2V0KDMpOworICAgICAgICBmdWxsLnJlbW92ZShvbmUpOworICAgICAgICBhc3NlcnRGYWxzZShmdWxsLmNvbnRhaW5zKG9uZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZnVsbC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgc2l6ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKKyAgICAgICAgQ29weU9uV3JpdGVBcnJheVNldCBlbXB0eSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0KCk7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGZ1bGwuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVtcHR5LnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogICB0b0FycmF5IHJldHVybnMgYW4gT2JqZWN0IGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGZyb20gdGhlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5KCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IGZ1bGwgPSBwb3B1bGF0ZWRTZXQoMyk7CisgICAgICAgIE9iamVjdFtdIG8gPSBmdWxsLnRvQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG8ubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsICgoSW50ZWdlcilvWzBdKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsICgoSW50ZWdlcilvWzFdKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsICgoSW50ZWdlcilvWzJdKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIHRvQXJyYXkgcmV0dXJucyBhbiBJbnRlZ2VyIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGZyb20KKyAgICAgKiAgIHRoZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTIoKSB7CisgICAgICAgIENvcHlPbldyaXRlQXJyYXlTZXQgZnVsbCA9IHBvcHVsYXRlZFNldCgzKTsKKyAgICAgICAgSW50ZWdlcltdIGkgPSBuZXcgSW50ZWdlclszXTsKKyAgICAgICAgaSA9IChJbnRlZ2VyW10pZnVsbC50b0FycmF5KGkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaVswXS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlbMV0uaW50VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpWzJdLmludFZhbHVlKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIHRvQXJyYXkgdGhyb3dzIGFuIEFycmF5U3RvcmVFeGNlcHRpb24gd2hlbiB0aGUgZ2l2ZW4gYXJyYXkgY2FuCisgICAgICogIG5vdCBzdG9yZSB0aGUgb2JqZWN0cyBpbnNpZGUgdGhlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5X0FycmF5U3RvcmVFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IGMgPSBuZXcgQ29weU9uV3JpdGVBcnJheVNldCgpOworICAgICAgICAgICAgYy5hZGQoInpmYXNkZnNkZiIpOworICAgICAgICAgICAgYy5hZGQoImFzZGFkYXNkIik7CisgICAgICAgICAgICBjLnRvQXJyYXkobmV3IExvbmdbNV0pOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChBcnJheVN0b3JlRXhjZXB0aW9uIGUpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGRlc2VyaWFsaXplZCBzZXJpYWxpemVkIHNldCBpcyBlcXVhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgeworICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IHEgPSBwb3B1bGF0ZWRTZXQoU0laRSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm91dCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHEpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmluKSk7CisgICAgICAgICAgICBDb3B5T25Xcml0ZUFycmF5U2V0IHIgPSAoQ29weU9uV3JpdGVBcnJheVNldClpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIHIuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5lcXVhbHMocikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmVxdWFscyhxKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0NvdW50RG93bkxhdGNoVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Db3VudERvd25MYXRjaFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZDY5ODg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Db3VudERvd25MYXRjaFRlc3QuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CisKK3B1YmxpYyBjbGFzcyBDb3VudERvd25MYXRjaFRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ291bnREb3duTGF0Y2hUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBuZWdhdGl2ZSBjb25zdHJ1Y3RvciBhcmd1bWVudCB0aHJvd3MgSUFFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENvdW50RG93bkxhdGNoKC0xKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRDb3VudCByZXR1cm5zIGluaXRpYWwgY291bnQgYW5kIGRlY3JlYXNlcyBhZnRlciBjb3VudERvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q291bnQoKSB7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGwgPSBuZXcgQ291bnREb3duTGF0Y2goMik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBsLmdldENvdW50KCkpOworICAgICAgICBsLmNvdW50RG93bigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb3VudERvd24gZGVjcmVtZW50cyBjb3VudCB3aGVuIHBvc2l0aXZlIGFuZCBoYXMgbm8gZWZmZWN0IHdoZW4gemVybworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudERvd24oKSB7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBsLmdldENvdW50KCkpOworICAgICAgICBsLmNvdW50RG93bigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbC5nZXRDb3VudCgpKTsKKyAgICAgICAgbC5jb3VudERvd24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGwuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXQgcmV0dXJucyBhZnRlciBjb3VudERvd24gdG8gemVybywgYnV0IG5vdCBiZWZvcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXQoKSB7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGwgPSBuZXcgQ291bnREb3duTGF0Y2goMik7CisKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGwuZ2V0Q291bnQoKSA+IDApOworICAgICAgICAgICAgICAgICAgICAgICAgbC5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShsLmdldENvdW50KCkgPT0gMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0Q291bnQoKSwgMik7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldENvdW50KCksIDEpOworICAgICAgICAgICAgbC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldENvdW50KCksIDApOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogdGltZWQgYXdhaXQgcmV0dXJucyBhZnRlciBjb3VudERvd24gdG8gemVybworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEF3YWl0KCkgeworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsID0gbmV3IENvdW50RG93bkxhdGNoKDIpOworCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShsLmdldENvdW50KCkgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUobC5hd2FpdChTTUFMTF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0Q291bnQoKSwgMik7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldENvdW50KCksIDEpOworICAgICAgICAgICAgbC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldENvdW50KCksIDApOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGF3YWl0IHRocm93cyBJRSBpZiBpbnRlcnJ1cHRlZCBiZWZvcmUgY291bnRlZCBkb3duCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0X0ludGVycnVwdGVkRXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUobC5nZXRDb3VudCgpID4gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0Q291bnQoKSwgMSk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgYXdhaXQgdGhyb3dzIElFIGlmIGludGVycnVwdGVkIGJlZm9yZSBjb3VudGVkIGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRBd2FpdF9JbnRlcnJ1cHRlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGwuZ2V0Q291bnQoKSA+IDApOworICAgICAgICAgICAgICAgICAgICAgICAgbC5hd2FpdChNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldENvdW50KCksIDEpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGF3YWl0IHRpbWVzIG91dCBpZiBub3QgY291bnRlZCBkb3duIGJlZm9yZSB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0VGltZW91dCgpIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGwuZ2V0Q291bnQoKSA+IDApOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UobC5hd2FpdChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGwuZ2V0Q291bnQoKSA+IDApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5nZXRDb3VudCgpLCAxKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvU3RyaW5nIGluZGljYXRlcyBjdXJyZW50IGNvdW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBDb3VudERvd25MYXRjaCBzID0gbmV3IENvdW50RG93bkxhdGNoKDIpOworICAgICAgICBTdHJpbmcgdXMgPSBzLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydFRydWUodXMuaW5kZXhPZigiQ291bnQgPSAyIikgPj0gMCk7CisgICAgICAgIHMuY291bnREb3duKCk7CisgICAgICAgIFN0cmluZyBzMSA9IHMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzMS5pbmRleE9mKCJDb3VudCA9IDEiKSA+PSAwKTsKKyAgICAgICAgcy5jb3VudERvd24oKTsKKyAgICAgICAgU3RyaW5nIHMyID0gcy50b1N0cmluZygpOworICAgICAgICBhc3NlcnRUcnVlKHMyLmluZGV4T2YoIkNvdW50ID0gMCIpID49IDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9DeWNsaWNCYXJyaWVyVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9DeWNsaWNCYXJyaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllYWMxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0N5Y2xpY0JhcnJpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworCitwdWJsaWMgY2xhc3MgQ3ljbGljQmFycmllclRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZXsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDeWNsaWNCYXJyaWVyVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgY291bnRBY3Rpb247CisgICAgcHJpdmF0ZSBjbGFzcyBNeUFjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeyArK2NvdW50QWN0aW9uOyB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0aW5nIHdpdGggbmVnYXRpdmUgcGFydGllcyB0aHJvd3MgSUFFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBDeWNsaWNCYXJyaWVyKC0xLCAoUnVubmFibGUpbnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRpbmcgd2l0aCBuZWdhdGl2ZSBwYXJ0aWVzIGFuZCBubyBhY3Rpb24gdGhyb3dzIElBRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgQ3ljbGljQmFycmllcigtMSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0UGFydGllcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFydGllcyBnaXZlbiBpbiBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXJ0aWVzKCkgeworICAgICAgICBDeWNsaWNCYXJyaWVyIGIgPSBuZXcgQ3ljbGljQmFycmllcigyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGIuZ2V0UGFydGllcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGIuZ2V0TnVtYmVyV2FpdGluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIDEtcGFydHkgYmFycmllciB0cmlnZ2VycyBhZnRlciBzaW5nbGUgYXdhaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUGFydHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDeWNsaWNCYXJyaWVyIGIgPSBuZXcgQ3ljbGljQmFycmllcigxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBiLmdldFBhcnRpZXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYi5nZXROdW1iZXJXYWl0aW5nKCkpOworICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGIuZ2V0TnVtYmVyV2FpdGluZygpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzdXBwbGllZCBiYXJyaWVyIGFjdGlvbiBpcyBydW4gYXQgYmFycmllcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXJyaWVyQWN0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY291bnRBY3Rpb24gPSAwOworICAgICAgICAgICAgQ3ljbGljQmFycmllciBiID0gbmV3IEN5Y2xpY0JhcnJpZXIoMSwgbmV3IE15QWN0aW9uKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGIuZ2V0UGFydGllcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBiLmdldE51bWJlcldhaXRpbmcoKSk7CisgICAgICAgICAgICBiLmF3YWl0KCk7CisgICAgICAgICAgICBiLmF3YWl0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYi5nZXROdW1iZXJXYWl0aW5nKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50QWN0aW9uLCAyKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSAyLXBhcnR5L3RocmVhZCBiYXJyaWVyIHRyaWdnZXJzIGFmdGVyIGJvdGggdGhyZWFkcyBpbnZva2UgYXdhaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvUGFydGllcygpIHsKKyAgICAgICAgZmluYWwgQ3ljbGljQmFycmllciBiID0gbmV3IEN5Y2xpY0JhcnJpZXIoMik7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfX19KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgYi5hd2FpdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcnJ1cHRpb24gaW4gb25lIHBhcnR5IGNhdXNlcyBvdGhlcnMgd2FpdGluZyBpbiBhd2FpdCB0bworICAgICAqIHRocm93IEJyb2tlbkJhcnJpZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXQxX0ludGVycnVwdGVkX0Jyb2tlbkJhcnJpZXIoKSB7CisgICAgICAgIGZpbmFsIEN5Y2xpY0JhcnJpZXIgYyA9IG5ldyBDeWNsaWNCYXJyaWVyKDMpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBiKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEJyb2tlbkJhcnJpZXJFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGkpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0MS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsgCisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcnJ1cHRpb24gaW4gb25lIHBhcnR5IGNhdXNlcyBvdGhlcnMgd2FpdGluZyBpbiB0aW1lZCBhd2FpdCB0bworICAgICAqIHRocm93IEJyb2tlbkJhcnJpZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXQyX0ludGVycnVwdGVkX0Jyb2tlbkJhcnJpZXIoKSB7CisgICAgICBmaW5hbCBDeWNsaWNCYXJyaWVyIGMgPSBuZXcgQ3ljbGljQmFycmllcigzKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gYil7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChCcm9rZW5CYXJyaWVyRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdDEuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0MS5qb2luKCk7IAorICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEEgdGltZW91dCBpbiB0aW1lZCBhd2FpdCB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdDNfVGltZU91dEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgQ3ljbGljQmFycmllciBjID0gbmV3IEN5Y2xpY0JhcnJpZXIoMik7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGltZW91dEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gYil7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7IAorICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0aW1lb3V0IGluIG9uZSBwYXJ0eSBjYXVzZXMgb3RoZXJzIHdhaXRpbmcgaW4gdGltZWQgYXdhaXQgdG8KKyAgICAgKiB0aHJvdyBCcm9rZW5CYXJyaWVyRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0NF9UaW1lb3V0X0Jyb2tlbkJhcnJpZXIoKSB7CisgICAgICBmaW5hbCBDeWNsaWNCYXJyaWVyIGMgPSBuZXcgQ3ljbGljQmFycmllcigzKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGltZW91dEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gYil7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdChNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEJyb2tlbkJhcnJpZXJFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGkpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsgCisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRpbWVvdXQgaW4gb25lIHBhcnR5IGNhdXNlcyBvdGhlcnMgd2FpdGluZyBpbiBhd2FpdCB0bworICAgICAqIHRocm93IEJyb2tlbkJhcnJpZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXQ1X1RpbWVvdXRfQnJva2VuQmFycmllcigpIHsKKyAgICAgIGZpbmFsIEN5Y2xpY0JhcnJpZXIgYyA9IG5ldyBDeWNsaWNCYXJyaWVyKDMpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChUaW1lb3V0RXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBiKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEJyb2tlbkJhcnJpZXJFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGkpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsgCisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQSByZXNldCBvZiBhbiBhY3RpdmUgYmFycmllciBjYXVzZXMgd2FpdGluZyB0aHJlYWRzIHRvIHRocm93CisgICAgICogQnJva2VuQmFycmllckV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNldF9Ccm9rZW5CYXJyaWVyKCkgeworICAgICAgICBmaW5hbCBDeWNsaWNCYXJyaWVyIGMgPSBuZXcgQ3ljbGljQmFycmllcigzKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChCcm9rZW5CYXJyaWVyRXhjZXB0aW9uIHN1Y2Nlc3Mpe30gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBiKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEJyb2tlbkJhcnJpZXJFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGkpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBjLnJlc2V0KCk7CisgICAgICAgICAgICB0MS5qb2luKCk7IAorICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSByZXNldCBiZWZvcmUgdGhyZWFkcyBlbnRlciBiYXJyaWVyIGRvZXMgbm90IHRocm93CisgICAgICogQnJva2VuQmFycmllckV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNldF9Ob0Jyb2tlbkJhcnJpZXIoKSB7CisgICAgICAgIGZpbmFsIEN5Y2xpY0JhcnJpZXIgYyA9IG5ldyBDeWNsaWNCYXJyaWVyKDMpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGIpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gaSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMucmVzZXQoKTsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgdDEuam9pbigpOyAKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvRGVsYXlRdWV1ZVRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvRGVsYXlRdWV1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzMyNTEzCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9EZWxheVF1ZXVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTg1IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKKworcHVibGljIGNsYXNzIERlbGF5UXVldWVUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVsYXlRdWV1ZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT0NBUCA9IEludGVnZXIuTUFYX1ZBTFVFOworCisgICAgLyoqCisgICAgICogQSBkZWxheWVkIGltcGxlbWVudGF0aW9uIGZvciB0ZXN0aW5nLgorICAgICAqIE1vc3QgIHRlc3RzIHVzZSBQc2V1ZG9kZWxheXMsIHdoZXJlIGRlbGF5cyBhcmUgYWxsIGVsYXBzZWQKKyAgICAgKiAoc28sIG5vIGJsb2NraW5nIHNvbGVseSBmb3IgZGVsYXlzKSBidXQgYXJlIHN0aWxsIG9yZGVyZWQKKyAgICAgKi8gCisgICAgc3RhdGljIGNsYXNzIFBEZWxheSBpbXBsZW1lbnRzIERlbGF5ZWQgeyAKKyAgICAgICAgaW50IHBzZXVkb2RlbGF5OworICAgICAgICBQRGVsYXkoaW50IGkpIHsgcHNldWRvZGVsYXkgPSBJbnRlZ2VyLk1JTl9WQUxVRSArIGk7IH0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKERlbGF5ZWQgeSkgeworICAgICAgICAgICAgaW50IGkgPSBwc2V1ZG9kZWxheTsKKyAgICAgICAgICAgIGludCBqID0gKChQRGVsYXkpeSkucHNldWRvZGVsYXk7CisgICAgICAgICAgICBpZiAoaSA8IGopIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChpID4gaikgcmV0dXJuIDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFBEZWxheSB5KSB7CisgICAgICAgICAgICBpbnQgaSA9IHBzZXVkb2RlbGF5OworICAgICAgICAgICAgaW50IGogPSAoKFBEZWxheSl5KS5wc2V1ZG9kZWxheTsKKyAgICAgICAgICAgIGlmIChpIDwgaikgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGkgPiBqKSByZXR1cm4gMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICAgICAgcmV0dXJuICgoUERlbGF5KW90aGVyKS5wc2V1ZG9kZWxheSA9PSBwc2V1ZG9kZWxheTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoUERlbGF5IG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gKChQRGVsYXkpb3RoZXIpLnBzZXVkb2RlbGF5ID09IHBzZXVkb2RlbGF5OworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgbG9uZyBnZXREZWxheShUaW1lVW5pdCBpZ25vcmUpIHsKKyAgICAgICAgICAgIHJldHVybiBwc2V1ZG9kZWxheTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHBzZXVkb2RlbGF5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihwc2V1ZG9kZWxheSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlbGF5ZWQgaW1wbGVtZW50YXRpb24gdGhhdCBhY3R1YWxseSBkZWxheXMKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgTmFub0RlbGF5IGltcGxlbWVudHMgRGVsYXllZCB7IAorICAgICAgICBsb25nIHRyaWdnZXI7CisgICAgICAgIE5hbm9EZWxheShsb25nIGkpIHsgCisgICAgICAgICAgICB0cmlnZ2VyID0gU3lzdGVtLm5hbm9UaW1lKCkgKyBpOworICAgICAgICB9CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhEZWxheWVkIHkpIHsKKyAgICAgICAgICAgIGxvbmcgaSA9IHRyaWdnZXI7CisgICAgICAgICAgICBsb25nIGogPSAoKE5hbm9EZWxheSl5KS50cmlnZ2VyOworICAgICAgICAgICAgaWYgKGkgPCBqKSByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoaSA+IGopIHJldHVybiAxOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhOYW5vRGVsYXkgeSkgeworICAgICAgICAgICAgbG9uZyBpID0gdHJpZ2dlcjsKKyAgICAgICAgICAgIGxvbmcgaiA9ICgoTmFub0RlbGF5KXkpLnRyaWdnZXI7CisgICAgICAgICAgICBpZiAoaSA8IGopIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChpID4gaikgcmV0dXJuIDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE5hbm9EZWxheSlvdGhlcikudHJpZ2dlciA9PSB0cmlnZ2VyOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhOYW5vRGVsYXkgb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE5hbm9EZWxheSlvdGhlcikudHJpZ2dlciA9PSB0cmlnZ2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RGVsYXkoVGltZVVuaXQgdW5pdCkgeworICAgICAgICAgICAgbG9uZyBuID0gdHJpZ2dlciAtIFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICAgICAgcmV0dXJuIHVuaXQuY29udmVydChuLCBUaW1lVW5pdC5OQU5PU0VDT05EUyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRUcmlnZ2VyVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih0cmlnZ2VyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcXVldWUgb2YgZ2l2ZW4gc2l6ZSBjb250YWluaW5nIGNvbnNlY3V0aXZlCisgICAgICogUERlbGF5cyAwIC4uLiBuLgorICAgICAqLworICAgIHByaXZhdGUgRGVsYXlRdWV1ZSBwb3B1bGF0ZWRRdWV1ZShpbnQgbikgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBuZXcgRGVsYXlRdWV1ZSgpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgZm9yKGludCBpID0gbi0xOyBpID49IDA7IGktPTIpCisgICAgICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIobmV3IFBEZWxheShpKSkpOworICAgICAgICBmb3IoaW50IGkgPSAobiAmIDEpOyBpIDwgbjsgaSs9MikKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihuZXcgUERlbGF5KGkpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5PQ0FQLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobiwgcS5zaXplKCkpOworICAgICAgICByZXR1cm4gcTsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogQSBuZXcgcXVldWUgaGFzIHVuYm91bmRlZCBjYXBhY2l0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjEoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhOT0NBUCwgbmV3IERlbGF5UXVldWUoKS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXppbmcgZnJvbSBudWxsIENvbGxlY3Rpb24gdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEZWxheVF1ZXVlIHEgPSBuZXcgRGVsYXlRdWV1ZShudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gQ29sbGVjdGlvbiBvZiBudWxsIGVsZW1lbnRzIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUERlbGF5W10gaW50cyA9IG5ldyBQRGVsYXlbU0laRV07CisgICAgICAgICAgICBEZWxheVF1ZXVlIHEgPSBuZXcgRGVsYXlRdWV1ZShBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gQ29sbGVjdGlvbiB3aXRoIHNvbWUgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBEZWxheVtdIGludHMgPSBuZXcgUERlbGF5W1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFLTE7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IFBEZWxheShpKTsKKyAgICAgICAgICAgIERlbGF5UXVldWUgcSA9IG5ldyBEZWxheVF1ZXVlKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBjb250YWlucyBhbGwgZWxlbWVudHMgb2YgY29sbGVjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I2KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUERlbGF5W10gaW50cyA9IG5ldyBQRGVsYXlbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IFBEZWxheShpKTsKKyAgICAgICAgICAgIERlbGF5UXVldWUgcSA9IG5ldyBEZWxheVF1ZXVlKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEucG9sbCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogaXNFbXB0eSBpcyB0cnVlIGJlZm9yZSBhZGQsIGZhbHNlIGFmdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBuZXcgRGVsYXlRdWV1ZSgpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5PQ0FQLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICBxLmFkZChuZXcgUERlbGF5KDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBxLmFkZChuZXcgUERlbGF5KDIpKTsKKyAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtYWluaW5nQ2FwYWNpdHkgZG9lcyBub3QgY2hhbmdlIHdoZW4gZWxlbWVudGEgYWRkZWQgb3IgcmVtb3ZlZCwKKyAgICAgKiBidXQgc2l6ZSBkb2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbWFpbmluZ0NhcGFjaXR5KCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhOT0NBUCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhOT0NBUCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBxLnNpemUoKSk7CisgICAgICAgICAgICBxLmFkZChuZXcgUERlbGF5KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIG9mZmVyKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXJOdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgICAgIHEub2ZmZXIobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgICAgIHEuYWRkKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeyB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogb2ZmZXIgbm9uLW51bGwgc3VjY2VlZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXIoKSB7CisgICAgICAgIERlbGF5UXVldWUgcSA9IG5ldyBEZWxheVF1ZXVlKCk7CisgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihuZXcgUERlbGF5KDApKSk7CisgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihuZXcgUERlbGF5KDEpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKKyAgICAgICAgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBxLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuYWRkKG5ldyBQRGVsYXkoaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZEFsbChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEZWxheVF1ZXVlIHEgPSBuZXcgRGVsYXlRdWV1ZSgpOworICAgICAgICAgICAgcS5hZGRBbGwobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworCisgICAgLyoqCisgICAgICogYWRkQWxsKHRoaXMpIHRocm93cyBJQUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsU2VsZigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgcS5hZGRBbGwocSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwgb2YgYSBjb2xsZWN0aW9uIHdpdGggbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEZWxheVF1ZXVlIHEgPSBuZXcgRGVsYXlRdWV1ZSgpOworICAgICAgICAgICAgUERlbGF5W10gaW50cyA9IG5ldyBQRGVsYXlbU0laRV07CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIGFkZEFsbCBvZiBhIGNvbGxlY3Rpb24gd2l0aCBhbnkgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFIGFmdGVyCisgICAgICogcG9zc2libHkgYWRkaW5nIHNvbWUgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERlbGF5UXVldWUgcSA9IG5ldyBEZWxheVF1ZXVlKCk7CisgICAgICAgICAgICBQRGVsYXlbXSBpbnRzID0gbmV3IFBEZWxheVtTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRS0xOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBQRGVsYXkoaSk7CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVldWUgY29udGFpbnMgYWxsIGVsZW1lbnRzIG9mIHN1Y2Nlc3NmdWwgYWRkQWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQRGVsYXlbXSBlbXB0eSA9IG5ldyBQRGVsYXlbMF07CisgICAgICAgICAgICBQRGVsYXlbXSBpbnRzID0gbmV3IFBEZWxheVtTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBTSVpFLTE7IGkgPj0gMDsgLS1pKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgUERlbGF5KGkpOworICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoZW1wdHkpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnBvbGwoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHRlc3RQdXROdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgICAgIHEucHV0KG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSAKKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9ICAgCisgICAgIH0KKworICAgIC8qKgorICAgICAqIGFsbCBlbGVtZW50cyBzdWNjZXNzZnVsbHkgcHV0IGFyZSBjb250YWluZWQKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgICBQRGVsYXkgSSA9IG5ldyBQRGVsYXkoaSk7CisgICAgICAgICAgICAgICAgIHEucHV0KEkpOworICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnMoSSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRSwgcS5zaXplKCkpOworICAgICAgICAgfQorICAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwdXQgZG9lc24ndCBibG9jayB3YWl0aW5nIGZvciB0YWtlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1dFdpdGhUYWtlKCkgeworICAgICAgICBmaW5hbCBEZWxheVF1ZXVlIHEgPSBuZXcgRGVsYXlRdWV1ZSgpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFkZGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBQRGVsYXkoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBQRGVsYXkoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBQRGVsYXkoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBQRGVsYXkoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUoYWRkZWQgPT0gNCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBxLnRha2UoKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgb2ZmZXIgZG9lcyBub3QgdGltZSBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRPZmZlcigpIHsKKyAgICAgICAgZmluYWwgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgUERlbGF5KDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBQRGVsYXkoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShxLm9mZmVyKG5ldyBQRGVsYXkoMCksIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUocS5vZmZlcihuZXcgUERlbGF5KDApLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRha2UgcmV0cmlldmVzIGVsZW1lbnRzIGluIHByaW9yaXR5IG9yZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRha2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBQRGVsYXkoaSksICgoUERlbGF5KXEudGFrZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogdGFrZSBibG9ja3MgaW50ZXJydXB0aWJseSB3aGVuIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRha2VGcm9tRW1wdHkoKSB7CisgICAgICAgIGZpbmFsIERlbGF5UXVldWUgcSA9IG5ldyBEZWxheVF1ZXVlKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcS50YWtlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgcmVtb3ZlcyBleGlzdGluZyBlbGVtZW50cyB1bnRpbCBlbXB0eSwgdGhlbiBibG9ja3MgaW50ZXJydXB0aWJseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1Rha2UoKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyhuZXcgUERlbGF5KGkpLCAoKFBEZWxheSlxLnRha2UoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcS50YWtlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsgCisgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBwb2xsIHN1Y2NlZWRzIHVubGVzcyBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQb2xsKCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUERlbGF5KGkpLCAoKFBEZWxheSlxLnBvbGwoKSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE51bGwocS5wb2xsKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIHBvb2wgd2l0aCB6ZXJvIHRpbWVvdXQgc3VjY2VlZHMgd2hlbiBub24tZW1wdHksIGVsc2UgdGltZXMgb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkUG9sbDAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBQRGVsYXkoaSksICgoUERlbGF5KXEucG9sbCgwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnROdWxsKHEucG9sbCgwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBwb29sIHdpdGggbm9uemVybyB0aW1lb3V0IHN1Y2NlZWRzIHdoZW4gbm9uLWVtcHR5LCBlbHNlIHRpbWVzIG91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZFBvbGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBQRGVsYXkoaSksICgoUERlbGF5KXEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVycnVwdGVkIHRpbWVkIHBvbGwgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluc3RlYWQgb2YKKyAgICAgKiByZXR1cm5pbmcgdGltZW91dCBzdGF0dXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0ZWRUaW1lZFBvbGwoKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyhuZXcgUERlbGF5KGkpLCAoKFBEZWxheSlxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydE51bGwocS5wb2xsKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7IAorICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICB0aW1lZCBwb2xsIGJlZm9yZSBhIGRlbGF5ZWQgb2ZmZXIgZmFpbHM7IGFmdGVyIG9mZmVyIHN1Y2NlZWRzOworICAgICAqICBvbiBpbnRlcnJ1cHRpb24gdGhyb3dzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkUG9sbFdpdGhPZmZlcigpIHsKKyAgICAgICAgZmluYWwgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnROdWxsKHEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnBvbGwoTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucG9sbChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkRmFpbCgiU2hvdWxkIGJsb2NrIik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIobmV3IFBEZWxheSgwKSwgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9ICAKKworCisgICAgLyoqCisgICAgICogcGVlayByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgbnVsbCBpZiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUERlbGF5KGkpLCAoKFBEZWxheSlxLnBlZWsoKSkpOworICAgICAgICAgICAgcS5wb2xsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucGVlaygpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaSAhPSAoKFBEZWxheSlxLnBlZWsoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChxLnBlZWsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZWxlbWVudCByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgdGhyb3dzIE5TRUUgaWYgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudCgpIHsKKyAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFBEZWxheShpKSwgKChQRGVsYXkpcS5lbGVtZW50KCkpKTsKKyAgICAgICAgICAgIHEucG9sbCgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmVsZW1lbnQoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgcmVtb3ZlcyBuZXh0IGVsZW1lbnQsIG9yIHRocm93cyBOU0VFIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKKyAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFBEZWxheShpKSwgKChQRGVsYXkpcS5yZW1vdmUoKSkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSh4KSByZW1vdmVzIHggYW5kIHJldHVybnMgdHJ1ZSBpZiBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnQoKSB7CisgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IFNJWkU7IGkrPTIpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5yZW1vdmUobmV3IFBEZWxheShpKSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSs9MikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLnJlbW92ZShuZXcgUERlbGF5KGkpKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLnJlbW92ZShuZXcgUERlbGF5KGkrMSkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICB9CisgICAgICAgIAorICAgIC8qKgorICAgICAqIGNvbnRhaW5zKHgpIHJlcG9ydHMgdHJ1ZSB3aGVuIGVsZW1lbnRzIGFkZGVkIGJ1dCBub3QgeWV0IHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKG5ldyBQRGVsYXkoaSkpKTsKKyAgICAgICAgICAgIHEucG9sbCgpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocS5jb250YWlucyhuZXcgUERlbGF5KGkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbGVhciByZW1vdmVzIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKKyAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBxLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOT0NBUCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgcS5hZGQobmV3IFBEZWxheSgxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgcS5jbGVhcigpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb250YWluc0FsbChjKSBpcyB0cnVlIHdoZW4gYyBjb250YWlucyBhIHN1YnNldCBvZiBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbCgpIHsKKyAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIERlbGF5UXVldWUgcCA9IG5ldyBEZWxheVF1ZXVlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnNBbGwocCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocC5jb250YWluc0FsbChxKSk7CisgICAgICAgICAgICBwLmFkZChuZXcgUERlbGF5KGkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHAuY29udGFpbnNBbGwocSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldGFpbkFsbChjKSByZXRhaW5zIG9ubHkgdGhvc2UgZWxlbWVudHMgb2YgYyBhbmQgcmVwb3J0cyB0cnVlIGlmIGNoYW5nZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgRGVsYXlRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBxLnJldGFpbkFsbChwKTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2hhbmdlZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjaGFuZ2VkKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHAucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmVBbGwoYykgcmVtb3ZlcyBvbmx5IHRob3NlIGVsZW1lbnRzIG9mIGMgYW5kIHJlcG9ydHMgdHJ1ZSBpZiBjaGFuZ2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgRGVsYXlRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICAgICAgICAgICAgUERlbGF5IEkgPSAoUERlbGF5KShwLnJlbW92ZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zKEkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvQXJyYXkgY29udGFpbnMgYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7CisgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBPYmplY3RbXSBvID0gcS50b0FycmF5KCk7CisgICAgICAgIEFycmF5cy5zb3J0KG8pOworICAgICAgICB0cnkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgby5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvW2ldLCBxLnRha2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvQXJyYXkoYSkgY29udGFpbnMgYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXkyKCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgUERlbGF5W10gaW50cyA9IG5ldyBQRGVsYXlbU0laRV07CisgICAgICAgIGludHMgPSAoUERlbGF5W10pcS50b0FycmF5KGludHMpOworICAgICAgICBBcnJheXMuc29ydChpbnRzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnRha2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogdG9BcnJheShudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXlfQmFkQXJnKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBPYmplY3Qgb1tdID0gcS50b0FycmF5KG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9BcnJheSB3aXRoIGluY29tcGF0aWJsZSBhcnJheSB0eXBlIHRocm93cyBDQ0UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTFfQmFkQXJnKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBPYmplY3Qgb1tdID0gcS50b0FycmF5KG5ldyBTdHJpbmdbMTBdICk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEFycmF5U3RvcmVFeGNlcHRpb24gIHN1Y2Nlc3Mpe30KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogaXRlcmF0b3IgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWlucyhpdC5uZXh0KCkpKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoaSwgU0laRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaXRlcmF0b3IucmVtb3ZlIHJlbW92ZXMgY3VycmVudCBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yUmVtb3ZlICgpIHsKKyAgICAgICAgZmluYWwgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgcS5hZGQobmV3IFBEZWxheSgyKSk7CisgICAgICAgIHEuYWRkKG5ldyBQRGVsYXkoMSkpOworICAgICAgICBxLmFkZChuZXcgUERlbGF5KDMpKTsKKyAgICAgICAgSXRlcmF0b3IgaXQgPSBxLml0ZXJhdG9yKCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoaXQubmV4dCgpLCBuZXcgUERlbGF5KDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0Lm5leHQoKSwgbmV3IFBEZWxheSgzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0Lmhhc05leHQoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyBjb250YWlucyB0b1N0cmluZ3Mgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBTdHJpbmcgcyA9IHEudG9TdHJpbmcoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy5pbmRleE9mKFN0cmluZy52YWx1ZU9mKEludGVnZXIuTUlOX1ZBTFVFK2kpKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0gICAgICAgIAorCisgICAgLyoqCisgICAgICogb2ZmZXIgdHJhbnNmZXJzIGVsZW1lbnRzIGFjcm9zcyBFeGVjdXRvciB0YXNrcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQb2xsSW5FeGVjdXRvcigpIHsKKyAgICAgICAgZmluYWwgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgyKTsKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0TnVsbChxLnBvbGwoKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShudWxsICE9IHEucG9sbChNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IFBEZWxheSgxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBqb2luUG9vbChleGVjdXRvcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlbGF5ZWQgYWN0aW9ucyBkbyBub3Qgb2NjdXIgdW50aWwgdGhlaXIgZGVsYXkgZWxhcHNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWxheSgpIHsKKyAgICAgICAgRGVsYXlRdWV1ZSBxID0gbmV3IERlbGF5UXVldWUoKTsKKyAgICAgICAgTmFub0RlbGF5W10gZWxlbWVudHMgPSBuZXcgTmFub0RlbGF5W1NJWkVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgZWxlbWVudHNbaV0gPSBuZXcgTmFub0RlbGF5KDEwMDAwMDAwMDBMICsgMTAwMDAwMEwgKiAoU0laRSAtIGkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgcS5hZGQoZWxlbWVudHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgbGFzdCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIE5hbm9EZWxheSBlID0gKE5hbm9EZWxheSkocS50YWtlKCkpOworICAgICAgICAgICAgICAgIGxvbmcgdHQgPSBlLmdldFRyaWdnZXJUaW1lKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0dCA8PSBTeXN0ZW0ubmFub1RpbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUodHQgPj0gbGFzdCk7CisgICAgICAgICAgICAgICAgbGFzdCA9IHR0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGRyYWluVG8obnVsbCkgdGhyb3dzIE5QRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub051bGwoKSB7CisgICAgICAgIERlbGF5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5kcmFpblRvKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKHRoaXMpIHRocm93cyBJQUUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9TZWxmKCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhxKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8oYykgZW1wdGllcyBxdWV1ZSBpbnRvIGFub3RoZXIgY29sbGVjdGlvbiBjCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvKCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHEuZHJhaW5UbyhsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHEuc2l6ZSgpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwuc2l6ZSgpLCBTSVpFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvIGVtcHRpZXMgcXVldWUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9XaXRoQWN0aXZlUHV0KCkgeworICAgICAgICBmaW5hbCBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBQRGVsYXkoU0laRSsxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5zaXplKCkgPj0gU0laRSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5zaXplKCkgKyBsLnNpemUoKSA+PSBTSVpFKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKG51bGwsIG4pIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9OdWxsTigpIHsKKyAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8obnVsbCwgMCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8odGhpcywgbikgdGhyb3dzIElBRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub1NlbGZOKCkgeworICAgICAgICBEZWxheVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhxLCAwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8oYywgbikgZW1wdGllcyBmaXJzdCBtYXgge24sIHNpemV9IGVsZW1lbnRzIG9mIHF1ZXVlIGludG8gYworICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub04oKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRSArIDI7ICsraSkgeworICAgICAgICAgICAgRGVsYXlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsLCBpKTsKKyAgICAgICAgICAgIGludCBrID0gKGkgPCBTSVpFKT8gaSA6IFNJWkU7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIFNJWkUtayk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5zaXplKCksIGspOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvRXhjaGFuZ2VyVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9FeGNoYW5nZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTgxMWU4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvRXhjaGFuZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKKworcHVibGljIGNsYXNzIEV4Y2hhbmdlclRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFeGNoYW5nZXJUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBleGNoYW5nZSBleGNoYW5nZXMgb2JqZWN0cyBhY3Jvc3MgdHdvIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjaGFuZ2UoKSB7CisgICAgICAgIGZpbmFsIEV4Y2hhbmdlciBlID0gbmV3IEV4Y2hhbmdlcigpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHYgPSBlLmV4Y2hhbmdlKG9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHModiwgdHdvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB3ID0gZS5leGNoYW5nZSh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyh3LCBvbmUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCl7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdiA9IGUuZXhjaGFuZ2UodHdvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyh2LCBvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHcgPSBlLmV4Y2hhbmdlKHYpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKHcsIHR3byk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBleGNoYW5nZSBleGNoYW5nZXMgb2JqZWN0cyBhY3Jvc3MgdHdvIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRFeGNoYW5nZSgpIHsKKyAgICAgICAgZmluYWwgRXhjaGFuZ2VyIGUgPSBuZXcgRXhjaGFuZ2VyKCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCl7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdiA9IGUuZXhjaGFuZ2Uob25lLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyh2LCB0d28pOworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHcgPSBlLmV4Y2hhbmdlKHYsIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKHcsIG9uZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGltZW91dEV4Y2VwdGlvbiB0b2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHYgPSBlLmV4Y2hhbmdlKHR3bywgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHModiwgb25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB3ID0gZS5leGNoYW5nZSh2LCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyh3LCB0d28pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKFRpbWVvdXRFeGNlcHRpb24gdG9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnRlcnJ1cHQgZHVyaW5nIHdhaXQgZm9yIGV4Y2hhbmdlIHRocm93cyBJRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNoYW5nZV9JbnRlcnJ1cHRlZEV4Y2VwdGlvbigpeworICAgICAgICBmaW5hbCBFeGNoYW5nZXIgZSA9IG5ldyBFeGNoYW5nZXIoKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhjaGFuZ2Uob25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludGVycnVwdCBkdXJpbmcgd2FpdCBmb3IgdGltZWQgZXhjaGFuZ2UgdGhyb3dzIElFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkRXhjaGFuZ2VfSW50ZXJydXB0ZWRFeGNlcHRpb24oKXsKKyAgICAgICAgZmluYWwgRXhjaGFuZ2VyIGUgPSBuZXcgRXhjaGFuZ2VyKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLmV4Y2hhbmdlKG51bGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUyKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEZhaWwoInNob3VsZCB0aHJvdyBJRSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZW91dCBkdXJpbmcgd2FpdCBmb3IgdGltZWQgZXhjaGFuZ2UgdGhyb3dzIFRPRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNoYW5nZV9UaW1lT3V0RXhjZXB0aW9uKCl7CisgICAgICAgIGZpbmFsIEV4Y2hhbmdlciBlID0gbmV3IEV4Y2hhbmdlcigpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5leGNoYW5nZShudWxsLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGltZW91dEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMil7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRGYWlsKCJzaG91bGQgdGhyb3cgVE9FIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIG9uZSBleGNoYW5naW5nIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCwgYW5vdGhlciBzdWNjZWVkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZW1lbnRBZnRlckV4Y2hhbmdlKCkgeworICAgICAgICBmaW5hbCBFeGNoYW5nZXIgZSA9IG5ldyBFeGNoYW5nZXIoKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2ID0gZS5leGNoYW5nZShvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKHYsIHR3byk7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdyA9IGUuZXhjaGFuZ2Uodik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCl7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdiA9IGUuZXhjaGFuZ2UodHdvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyh2LCBvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB3ID0gZS5leGNoYW5nZSh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyh3LCB0aHJlZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdyA9IGUuZXhjaGFuZ2UodGhyZWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKHcsIG9uZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICB0My5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICAgICAgdDMuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZVRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTIzN2UyCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lio7CisKK3B1YmxpYyBjbGFzcyBFeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNleworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsgIAorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2VUZXN0LmNsYXNzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0aW5nIGEgbmV3IEVDUyB3aXRoIG51bGwgRXhlY3V0b3IgdGhyb3cgTlBFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck5QRSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UgZWNzID0gbmV3IEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGluZyBhIG5ldyBFQ1Mgd2l0aCBudWxsIHF1ZXVlIHRocm93IE5QRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOUEUyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOworICAgICAgICAgICAgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZSBlY3MgPSBuZXcgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZShlLCBudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN1Ym1pdHRpbmcgYSBudWxsIGNhbGxhYmxlIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdFN1Ym1pdE5QRSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOworICAgICAgICBFeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlIGVjcyA9IG5ldyBFeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlKGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2FsbGFibGUgYyA9IG51bGw7CisgICAgICAgICAgICBlY3Muc3VibWl0KGMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXR0aW5nIGEgbnVsbCBydW5uYWJsZSB0aHJvd3MgTlBFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXROUEUyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisgICAgICAgIEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UgZWNzID0gbmV3IEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UoZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSdW5uYWJsZSByID0gbnVsbDsKKyAgICAgICAgICAgIGVjcy5zdWJtaXQociwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWtlbiBzdWJtaXR0ZWQgdGFzayBpcyBjb21wbGV0ZWQKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdFRha2UoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKyAgICAgICAgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZSBlY3MgPSBuZXcgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZShlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbGxhYmxlIGMgPSBuZXcgU3RyaW5nVGFzaygpOworICAgICAgICAgICAgZWNzLnN1Ym1pdChjKTsKKyAgICAgICAgICAgIEZ1dHVyZSBmID0gZWNzLnRha2UoKTsKKyAgICAgICAgICAgIGFzc2VydChmLmlzRG9uZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgcmV0dXJucyB0aGUgc2FtZSBmdXR1cmUgb2JqZWN0IHJldHVybmVkIGJ5IHN1Ym1pdAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFrZTIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKyAgICAgICAgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZSBlY3MgPSBuZXcgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZShlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbGxhYmxlIGMgPSBuZXcgU3RyaW5nVGFzaygpOworICAgICAgICAgICAgRnV0dXJlIGYxID0gZWNzLnN1Ym1pdChjKTsKKyAgICAgICAgICAgIEZ1dHVyZSBmMiA9IGVjcy50YWtlKCk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKGYxLCBmMik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBwb2xsIHJldHVybnMgbm9uLW51bGwsIHRoZSByZXR1cm5lZCB0YXNrIGlzIGNvbXBsZXRlZAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9sbDEoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKyAgICAgICAgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZSBlY3MgPSBuZXcgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZShlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE51bGwoZWNzLnBvbGwoKSk7CisgICAgICAgICAgICBDYWxsYWJsZSBjID0gbmV3IFN0cmluZ1Rhc2soKTsKKyAgICAgICAgICAgIGVjcy5zdWJtaXQoYyk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIEZ1dHVyZSBmID0gZWNzLnBvbGwoKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChmLmlzRG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGltZWQgcG9sbCByZXR1cm5zIG5vbi1udWxsLCB0aGUgcmV0dXJuZWQgdGFzayBpcyBjb21wbGV0ZWQKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGwyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisgICAgICAgIEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UgZWNzID0gbmV3IEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UoZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKGVjcy5wb2xsKCkpOworICAgICAgICAgICAgQ2FsbGFibGUgYyA9IG5ldyBTdHJpbmdUYXNrKCk7CisgICAgICAgICAgICBlY3Muc3VibWl0KGMpOworICAgICAgICAgICAgRnV0dXJlIGYgPSBlY3MucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGlmIChmICE9IG51bGwpIAorICAgICAgICAgICAgICAgIGFzc2VydChmLmlzRG9uZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnNUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGUyM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnNUZXN0LmphdmEKQEAgLTAsMCArMSw2NjYgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKKworcHVibGljIGNsYXNzIEV4ZWN1dG9yc1Rlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZXsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFeGVjdXRvcnNUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVGltZWRDYWxsYWJsZTxUPiBpbXBsZW1lbnRzIENhbGxhYmxlPFQ+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlYzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYWJsZTxUPiBmdW5jOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbXNlY3M7CisgICAgICAgIAorICAgICAgICBUaW1lZENhbGxhYmxlKEV4ZWN1dG9yU2VydmljZSBleGVjLCBDYWxsYWJsZTxUPiBmdW5jLCBsb25nIG1zZWNzKSB7CisgICAgICAgICAgICB0aGlzLmV4ZWMgPSBleGVjOworICAgICAgICAgICAgdGhpcy5mdW5jID0gZnVuYzsKKyAgICAgICAgICAgIHRoaXMubXNlY3MgPSBtc2VjczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgRnV0dXJlPFQ+IGZ0YXNrID0gZXhlYy5zdWJtaXQoZnVuYyk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBmdGFzay5nZXQobXNlY3MsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZ0YXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmliIGltcGxlbWVudHMgQ2FsbGFibGU8QmlnSW50ZWdlcj4geworICAgICAgICBwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgbjsKKyAgICAgICAgRmliKGxvbmcgbikgeworICAgICAgICAgICAgaWYgKG4gPCAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZWVkIG5vbi1uZWdhdGl2ZSBhcmcsIGJ1dCBnb3QgIiArIG4pOworICAgICAgICAgICAgdGhpcy5uID0gQmlnSW50ZWdlci52YWx1ZU9mKG4pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGNhbGwoKSB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIGYxID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIGYyID0gZjE7CisgICAgICAgICAgICBmb3IgKEJpZ0ludGVnZXIgaSA9IEJpZ0ludGVnZXIuWkVSTzsgaS5jb21wYXJlVG8obikgPCAwOyBpID0gaS5hZGQoQmlnSW50ZWdlci5PTkUpKSB7CisgICAgICAgICAgICAgICAgQmlnSW50ZWdlciB0ID0gZjEuYWRkKGYyKTsKKyAgICAgICAgICAgICAgICBmMSA9IGYyOworICAgICAgICAgICAgICAgIGYyID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmMTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIG5ld0NhY2hlZFRocmVhZFBvb2wgY2FuIGV4ZWN1dGUgcnVubmFibGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5ld0NhY2hlZFRocmVhZFBvb2wxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisgICAgICAgIGUuZXhlY3V0ZShuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICBlLmV4ZWN1dGUobmV3IE5vT3BSdW5uYWJsZSgpKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgIGpvaW5Qb29sKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmV3Q2FjaGVkVGhyZWFkUG9vbCB3aXRoIGdpdmVuIFRocmVhZEZhY3RvcnkgY2FuIGV4ZWN1dGUgcnVubmFibGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5ld0NhY2hlZFRocmVhZFBvb2wyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCkpOworICAgICAgICBlLmV4ZWN1dGUobmV3IE5vT3BSdW5uYWJsZSgpKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgIGUuZXhlY3V0ZShuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICBqb2luUG9vbChlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG5ld0NhY2hlZFRocmVhZFBvb2wgd2l0aCBudWxsIFRocmVhZEZhY3RvcnkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdDYWNoZWRUaHJlYWRQb29sMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBuZXcgU2luZ2xlVGhyZWFkRXhlY3V0b3IgY2FuIGV4ZWN1dGUgcnVubmFibGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yMSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgIGUuZXhlY3V0ZShuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICBlLmV4ZWN1dGUobmV3IE5vT3BSdW5uYWJsZSgpKTsKKyAgICAgICAgam9pblBvb2woZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBuZXcgU2luZ2xlVGhyZWFkRXhlY3V0b3Igd2l0aCBnaXZlbiBUaHJlYWRGYWN0b3J5IGNhbiBleGVjdXRlIHJ1bm5hYmxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVUaHJlYWRFeGVjdXRvcjIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCkpOworICAgICAgICBlLmV4ZWN1dGUobmV3IE5vT3BSdW5uYWJsZSgpKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgIGUuZXhlY3V0ZShuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICBqb2luUG9vbChlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG5ldyBTaW5nbGVUaHJlYWRFeGVjdXRvciB3aXRoIG51bGwgVGhyZWFkRmFjdG9yeSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG5ldyBTaW5nbGVUaHJlYWRFeGVjdXRvciBjYW5ub3QgYmUgY2FzdGVkIHRvIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENhc3ROZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciB0cGUgPSAoVGhyZWFkUG9vbEV4ZWN1dG9yKWU7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBuZXcgbmV3Rml4ZWRUaHJlYWRQb29sIGNhbiBleGVjdXRlIHJ1bm5hYmxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdGaXhlZFRocmVhZFBvb2wxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMik7CisgICAgICAgIGUuZXhlY3V0ZShuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICBlLmV4ZWN1dGUobmV3IE5vT3BSdW5uYWJsZSgpKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgIGpvaW5Qb29sKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmV3IG5ld0ZpeGVkVGhyZWFkUG9vbCB3aXRoIGdpdmVuIFRocmVhZEZhY3RvcnkgY2FuIGV4ZWN1dGUgcnVubmFibGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5ld0ZpeGVkVGhyZWFkUG9vbDIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgyLCBuZXcgU2ltcGxlVGhyZWFkRmFjdG9yeSgpKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgIGUuZXhlY3V0ZShuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICBlLmV4ZWN1dGUobmV3IE5vT3BSdW5uYWJsZSgpKTsKKyAgICAgICAgam9pblBvb2woZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBuZXcgbmV3Rml4ZWRUaHJlYWRQb29sIHdpdGggbnVsbCBUaHJlYWRGYWN0b3J5IHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Rml4ZWRUaHJlYWRQb29sMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgyLCBudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBuZXcgbmV3Rml4ZWRUaHJlYWRQb29sIHdpdGggMCB0aHJlYWRzIHRocm93cyBJQUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Rml4ZWRUaHJlYWRQb29sNCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQW4gdW5jb25maWd1cmFibGUgbmV3Rml4ZWRUaHJlYWRQb29sIGNhbiBleGVjdXRlIHJ1bm5hYmxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3R1bmNvbmZpZ3VyYWJsZUV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBFeGVjdXRvcnMudW5jb25maWd1cmFibGVFeGVjdXRvclNlcnZpY2UoRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgyKSk7CisgICAgICAgIGUuZXhlY3V0ZShuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICBlLmV4ZWN1dGUobmV3IE5vT3BSdW5uYWJsZSgpKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgIGpvaW5Qb29sKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVuY29uZmlndXJhYmxlRXhlY3V0b3JTZXJ2aWNlKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0dW5jb25maWd1cmFibGVFeGVjdXRvclNlcnZpY2VOUEUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy51bmNvbmZpZ3VyYWJsZUV4ZWN1dG9yU2VydmljZShudWxsKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5jb25maWd1cmFibGVTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3R1bmNvbmZpZ3VyYWJsZVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZU5QRSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gRXhlY3V0b3JzLnVuY29uZmlndXJhYmxlU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKG51bGwpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGEgbmV3U2luZ2xlVGhyZWFkU2NoZWR1bGVkRXhlY3V0b3Igc3VjY2Vzc2Z1bGx5IHJ1bnMgZGVsYXllZCB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhY2tlZENhbGxhYmxlIGNhbGxhYmxlID0gbmV3IFRyYWNrZWRDYWxsYWJsZSgpOworICAgICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHAxID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKCk7CisgICAgICAgICAgICBGdXR1cmUgZiA9IHAxLnNjaGVkdWxlKGNhbGxhYmxlLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGNhbGxhYmxlLmRvbmUpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNhbGxhYmxlLmRvbmUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZi5nZXQoKSk7CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZSl7fQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYSBuZXdTY2hlZHVsZWRUaHJlYWRQb29sIHN1Y2Nlc3NmdWxseSBydW5zIGRlbGF5ZWQgdGFzaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RuZXdTY2hlZHVsZWRUaHJlYWRQb29sKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhY2tlZENhbGxhYmxlIGNhbGxhYmxlID0gbmV3IFRyYWNrZWRDYWxsYWJsZSgpOworICAgICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHAxID0gRXhlY3V0b3JzLm5ld1NjaGVkdWxlZFRocmVhZFBvb2woMik7CisgICAgICAgICAgICBGdXR1cmUgZiA9IHAxLnNjaGVkdWxlKGNhbGxhYmxlLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGNhbGxhYmxlLmRvbmUpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNhbGxhYmxlLmRvbmUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZi5nZXQoKSk7CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZSl7fQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYW4gdW5jb25maWd1cmFibGUgIG5ld1NjaGVkdWxlZFRocmVhZFBvb2wgc3VjY2Vzc2Z1bGx5IHJ1bnMgZGVsYXllZCB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdHVuY29uZmlndXJhYmxlU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhY2tlZENhbGxhYmxlIGNhbGxhYmxlID0gbmV3IFRyYWNrZWRDYWxsYWJsZSgpOworICAgICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHAxID0gRXhlY3V0b3JzLnVuY29uZmlndXJhYmxlU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKDIpKTsKKyAgICAgICAgICAgIEZ1dHVyZSBmID0gcDEuc2NoZWR1bGUoY2FsbGFibGUsIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2FsbGFibGUuZG9uZSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTUVESVVNX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2FsbGFibGUuZG9uZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBmLmdldCgpKTsKKyAgICAgICAgICAgIGpvaW5Qb29sKHAxKTsKKyAgICAgICAgfSBjYXRjaChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKXt9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgdGltZW91dHMgZnJvbSBleGVjdXRlIHdpbGwgdGltZSBvdXQgaWYgdGhleSBjb21wdXRlIHRvbyBsb25nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZENhbGxhYmxlKCkgeworICAgICAgICBpbnQgTiA9IDEwMDAwOworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgTGlzdDxDYWxsYWJsZTxCaWdJbnRlZ2VyPj4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPEJpZ0ludGVnZXI+PihOKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvbmcgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodGFza3Muc2l6ZSgpIDwgTikgeworICAgICAgICAgICAgICAgIHRhc2tzLmFkZChuZXcgVGltZWRDYWxsYWJsZTxCaWdJbnRlZ2VyPihleGVjdXRvciwgbmV3IEZpYihpKSwgMSkpOworICAgICAgICAgICAgICAgIGkgKz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBpdGVycyA9IDA7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHN1bSA9IEJpZ0ludGVnZXIuWkVSTzsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8Q2FsbGFibGU8QmlnSW50ZWdlcj4+IGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICsraXRlcnM7CisgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1bS5hZGQoaXQubmV4dCgpLmNhbGwoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpdGVycyA+IDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgYnkgY2hhbmNlIHdlIGRpZG4ndCBldmVyIHRpbWUgb3V0LCB0b3RhbCB0aW1lIG11c3QgYmUgc21hbGwKKyAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbGFwc2VkIDwgTik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChleGVjdXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaHJlYWRQb29sRXhlY3V0b3IgdXNpbmcgZGVmYXVsdFRocmVhZEZhY3RvcnkgaGFzCisgICAgICogc3BlY2lmaWVkIGdyb3VwLCBwcmlvcml0eSwgZGFlbW9uIHN0YXR1cywgYW5kIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRocmVhZEZhY3RvcnkoKSB7CisgICAgICAgIGZpbmFsIFRocmVhZEdyb3VwIGVncm91cCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKTsKKyAgICAgICAgUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQgY3VycmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKCFjdXJyZW50LmlzRGFlbW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShjdXJyZW50LmdldFByaW9yaXR5KCkgPT0gVGhyZWFkLk5PUk1fUFJJT1JJVFkpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkR3JvdXAgZyA9IGN1cnJlbnQuZ2V0VGhyZWFkR3JvdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGcgPT0gcy5nZXRUaHJlYWRHcm91cCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGcgPT0gZWdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY3VycmVudC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInRocmVhZC0xIikpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBwYXNzIGlmIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBzZXR0aW5nCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcihFeGVjdXRvcnMuZGVmYXVsdFRocmVhZEZhY3RvcnkoKSk7CisgICAgICAgIAorICAgICAgICBlLmV4ZWN1dGUocik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLnNodXRkb3duKCk7CisgICAgICAgIH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlWCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJlYWRQb29sRXhlY3V0b3IgdXNpbmcgcHJpdmlsZWdlZFRocmVhZEZhY3RvcnkgaGFzCisgICAgICogc3BlY2lmaWVkIGdyb3VwLCBwcmlvcml0eSwgZGFlbW9uIHN0YXR1cywgbmFtZSwKKyAgICAgKiBhY2Nlc3MgY29udHJvbCBjb250ZXh0IGFuZCBjb250ZXh0IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2aWxlZ2VkVGhyZWFkRmFjdG9yeSgpIHsKKyAgICAgICAgUG9saWN5IHNhdmVkUG9saWN5ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNhdmVkUG9saWN5ID0gUG9saWN5LmdldFBvbGljeSgpOworICAgICAgICAgICAgQWRqdXN0YWJsZVBvbGljeSBwb2xpY3kgPSBuZXcgQWRqdXN0YWJsZVBvbGljeSgpOworICAgICAgICAgICAgcG9saWN5LmFkZFBlcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJnZXRDb250ZXh0Q2xhc3NMb2FkZXIiKSk7CisgICAgICAgICAgICBwb2xpY3kuYWRkUGVybWlzc2lvbihuZXcgUnVudGltZVBlcm1pc3Npb24oInNldENvbnRleHRDbGFzc0xvYWRlciIpKTsKKyAgICAgICAgICAgIFBvbGljeS5zZXRQb2xpY3kocG9saWN5KTsKKyAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFRocmVhZEdyb3VwIGVncm91cCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgdGhpc2NjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IHRoaXNhY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKKyAgICAgICAgUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQgY3VycmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKCFjdXJyZW50LmlzRGFlbW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShjdXJyZW50LmdldFByaW9yaXR5KCkgPT0gVGhyZWFkLk5PUk1fUFJJT1JJVFkpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkR3JvdXAgZyA9IGN1cnJlbnQuZ2V0VGhyZWFkR3JvdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGcgPT0gcy5nZXRUaHJlYWRHcm91cCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGcgPT0gZWdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY3VycmVudC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInRocmVhZC0xIikpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZSh0aGlzY2NsID09IGN1cnJlbnQuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZSh0aGlzYWNjLmVxdWFscyhBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIHBhc3MgaWYgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcihFeGVjdXRvcnMucHJpdmlsZWdlZFRocmVhZEZhY3RvcnkoKSk7CisgICAgICAgIAorICAgICAgICBQb2xpY3kuc2V0UG9saWN5KHNhdmVkUG9saWN5KTsKKyAgICAgICAgZS5leGVjdXRlKHIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZS5zaHV0ZG93bigpOworICAgICAgICB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHZvaWQgY2hlY2tDQ0woKSB7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKS5jaGVja1Blcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJnZXRDb250ZXh0Q2xhc3NMb2FkZXIiKSk7CisgICAgfQorCisgICAgY2xhc3MgQ2hlY2tDQ0wgaW1wbGVtZW50cyBDYWxsYWJsZTxPYmplY3Q+IHsKKyAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgeworICAgICAgICAgICAgY2hlY2tDQ0woKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXaXRob3V0IGNsYXNzIGxvYWRlciBwZXJtaXNzaW9ucywgY3JlYXRpbmcKKyAgICAgKiBwcml2aWxlZ2VkQ2FsbGFibGVVc2luZ0N1cnJlbnRDbGFzc0xvYWRlciB0aHJvd3MgQUNFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByaXZpbGVnZWRDYWxsYWJsZVVzaW5nQ0NMV2l0aE5vUHJpdnMoKSB7CisgICAgICAgIFBvbGljeSBzYXZlZFBvbGljeSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYXZlZFBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKKyAgICAgICAgICAgIEFkanVzdGFibGVQb2xpY3kgcG9saWN5ID0gbmV3IEFkanVzdGFibGVQb2xpY3koKTsKKyAgICAgICAgICAgIFBvbGljeS5zZXRQb2xpY3kocG9saWN5KTsKKyAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgcHJvZ3JhbSBzdGlsbCBoYXMgdG9vIG1hbnkgcGVybWlzc2lvbnMgdG8gcnVuIHRlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoZWNrQ0NMKCk7CisgICAgICAgICAgICAvLyB0b28gbWFueSBwcml2aWxlZ2VzIHRvIHRlc3Q7IHNvIHJldHVybgorICAgICAgICAgICAgUG9saWN5LnNldFBvbGljeShzYXZlZFBvbGljeSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2goQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBvaykgeworICAgICAgICB9IAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDYWxsYWJsZSB0YXNrID0gRXhlY3V0b3JzLnByaXZpbGVnZWRDYWxsYWJsZVVzaW5nQ3VycmVudENsYXNzTG9hZGVyKG5ldyBOb09wQ2FsbGFibGUoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIFBvbGljeS5zZXRQb2xpY3koc2F2ZWRQb2xpY3kpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2l0aCBjbGFzcyBsb2FkZXIgcGVybWlzc2lvbnMsIGNhbGxpbmcKKyAgICAgKiBwcml2aWxlZ2VkQ2FsbGFibGVVc2luZ0N1cnJlbnRDbGFzc0xvYWRlciBkb2VzIG5vdCB0aHJvdyBBQ0UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0cHJpdmlsZWdlZENhbGxhYmxlVXNpbmdDQ0xXaXRoUHJpdnMoKSB7CisgICAgICAgIFBvbGljeSBzYXZlZFBvbGljeSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYXZlZFBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKKyAgICAgICAgICAgIEFkanVzdGFibGVQb2xpY3kgcG9saWN5ID0gbmV3IEFkanVzdGFibGVQb2xpY3koKTsKKyAgICAgICAgICAgIHBvbGljeS5hZGRQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigiZ2V0Q29udGV4dENsYXNzTG9hZGVyIikpOworICAgICAgICAgICAgcG9saWN5LmFkZFBlcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJzZXRDb250ZXh0Q2xhc3NMb2FkZXIiKSk7CisgICAgICAgICAgICBQb2xpY3kuc2V0UG9saWN5KHBvbGljeSk7CisgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDYWxsYWJsZSB0YXNrID0gRXhlY3V0b3JzLnByaXZpbGVnZWRDYWxsYWJsZVVzaW5nQ3VycmVudENsYXNzTG9hZGVyKG5ldyBOb09wQ2FsbGFibGUoKSk7CisgICAgICAgICAgICB0YXNrLmNhbGwoKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBQb2xpY3kuc2V0UG9saWN5KHNhdmVkUG9saWN5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdpdGhvdXQgcGVybWlzc2lvbnMsIGNhbGxpbmcgcHJpdmlsZWdlZENhbGxhYmxlIHRocm93cyBBQ0UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0cHJpdmlsZWdlZENhbGxhYmxlV2l0aE5vUHJpdnMoKSB7CisgICAgICAgIENhbGxhYmxlIHRhc2s7CisgICAgICAgIFBvbGljeSBzYXZlZFBvbGljeSA9IG51bGw7CisgICAgICAgIEFkanVzdGFibGVQb2xpY3kgcG9saWN5ID0gbnVsbDsKKyAgICAgICAgQWNjZXNzQ29udHJvbENvbnRleHQgbm9wcml2QWNjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNhdmVkUG9saWN5ID0gUG9saWN5LmdldFBvbGljeSgpOworICAgICAgICAgICAgcG9saWN5ID0gbmV3IEFkanVzdGFibGVQb2xpY3koKTsKKyAgICAgICAgICAgIFBvbGljeS5zZXRQb2xpY3kocG9saWN5KTsKKyAgICAgICAgICAgIG5vcHJpdkFjYyA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgdGFzayA9IEV4ZWN1dG9ycy5wcml2aWxlZ2VkQ2FsbGFibGUobmV3IENoZWNrQ0NMKCkpOworICAgICAgICAgICAgUG9saWN5LnNldFBvbGljeShzYXZlZFBvbGljeSk7CisgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gcHJvZ3JhbSBoYXMgdG9vIGZldyBwZXJtaXNzaW9ucyB0byBzZXQgdXAgdGVzdAorICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgcHJvZ3JhbSBkb2Vzbid0IGhhdmUgdG9vIG1hbnkgcGVybWlzc2lvbnMgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0NDTCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH19LCBub3ByaXZBY2MpOworICAgICAgICAgICAgLy8gdG9vIG1hbnkgcGVybXNzaW9uczsgc2tpcCB0ZXN0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2goQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhc2suY2FsbCgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaXRoIHBlcm1pc3Npb25zLCBjYWxsaW5nIHByaXZpbGVnZWRDYWxsYWJsZSBzdWNjZWVkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3Rwcml2aWxlZ2VkQ2FsbGFibGVXaXRoUHJpdnMoKSB7CisgICAgICAgIFBvbGljeSBzYXZlZFBvbGljeSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYXZlZFBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKKyAgICAgICAgICAgIEFkanVzdGFibGVQb2xpY3kgcG9saWN5ID0gbmV3IEFkanVzdGFibGVQb2xpY3koKTsKKyAgICAgICAgICAgIHBvbGljeS5hZGRQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigiZ2V0Q29udGV4dENsYXNzTG9hZGVyIikpOworICAgICAgICAgICAgcG9saWN5LmFkZFBlcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJzZXRDb250ZXh0Q2xhc3NMb2FkZXIiKSk7CisgICAgICAgICAgICBQb2xpY3kuc2V0UG9saWN5KHBvbGljeSk7CisgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIENhbGxhYmxlIHRhc2sgPSBFeGVjdXRvcnMucHJpdmlsZWdlZENhbGxhYmxlKG5ldyBDaGVja0NDTCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhc2suY2FsbCgpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgUG9saWN5LnNldFBvbGljeShzYXZlZFBvbGljeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYWxsYWJsZShSdW5uYWJsZSkgcmV0dXJucyBudWxsIHdoZW4gY2FsbGVkCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsYWJsZTEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDYWxsYWJsZSBjID0gRXhlY3V0b3JzLmNhbGxhYmxlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGMuY2FsbCgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYWxsYWJsZShSdW5uYWJsZSwgcmVzdWx0KSByZXR1cm5zIHJlc3VsdCB3aGVuIGNhbGxlZAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGFibGUyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2FsbGFibGUgYyA9IEV4ZWN1dG9ycy5jYWxsYWJsZShuZXcgTm9PcFJ1bm5hYmxlKCksIG9uZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob25lLCBjLmNhbGwoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYWxsYWJsZShQcml2aWxlZ2VkQWN0aW9uKSByZXR1cm5zIGl0cyByZXN1bHQgd2hlbiBjYWxsZWQKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxhYmxlMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbGxhYmxlIGMgPSBFeGVjdXRvcnMuY2FsbGFibGUobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeyByZXR1cm4gb25lOyB9fSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvbmUsIGMuY2FsbCgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNhbGxhYmxlKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24pIHJldHVybnMgaXRzIHJlc3VsdCB3aGVuIGNhbGxlZAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGFibGU0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2FsbGFibGUgYyA9IEV4ZWN1dG9ycy5jYWxsYWJsZShuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7IHJldHVybiBvbmU7IH19KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvbmUsIGMuY2FsbCgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogY2FsbGFibGUobnVsbCBSdW5uYWJsZSkgdGhyb3dzIE5QRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGFibGVOUEUxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUnVubmFibGUgciA9IG51bGw7CisgICAgICAgICAgICBDYWxsYWJsZSBjID0gRXhlY3V0b3JzLmNhbGxhYmxlKHIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYWxsYWJsZShudWxsLCByZXN1bHQpIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxhYmxlTlBFMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJ1bm5hYmxlIHIgPSBudWxsOworICAgICAgICAgICAgQ2FsbGFibGUgYyA9IEV4ZWN1dG9ycy5jYWxsYWJsZShyLCBvbmUpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYWxsYWJsZShudWxsIFByaXZpbGVnZWRBY3Rpb24pIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxhYmxlTlBFMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaXZpbGVnZWRBY3Rpb24gciA9IG51bGw7CisgICAgICAgICAgICBDYWxsYWJsZSBjID0gRXhlY3V0b3JzLmNhbGxhYmxlKHIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYWxsYWJsZShudWxsIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24pIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxhYmxlTlBFNCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gciA9IG51bGw7CisgICAgICAgICAgICBDYWxsYWJsZSBjID0gRXhlY3V0b3JzLmNhbGxhYmxlKHIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmVUYXNrVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmVUYXNrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxMDg5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZVRhc2tUZXN0LmphdmEKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgRnV0dXJlVGFza1Rlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShGdXR1cmVUYXNrVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3MgdG8gZXhwb3NlIHByb3RlY3RlZCBtZXRob2RzCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFB1YmxpY0Z1dHVyZVRhc2sgZXh0ZW5kcyBGdXR1cmVUYXNrIHsKKyAgICAgICAgcHVibGljIFB1YmxpY0Z1dHVyZVRhc2soQ2FsbGFibGUgcikgeyBzdXBlcihyKTsgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBydW5BbmRSZXNldCgpIHsgcmV0dXJuIHN1cGVyLnJ1bkFuZFJlc2V0KCk7IH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCB4KSB7IHN1cGVyLnNldCh4KTsgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsgc3VwZXIuc2V0RXhjZXB0aW9uKHQpOyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRpbmcgYSBmdXR1cmUgd2l0aCBhIG51bGwgY2FsbGFibGUgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZ1dHVyZVRhc2sgdGFzayA9IG5ldyBGdXR1cmVUYXNrKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGluZyBhIGZ1dHVyZSB3aXRoIG51bGwgcnVubmFibGUgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRnV0dXJlVGFzayB0YXNrID0gbmV3IEZ1dHVyZVRhc2sobnVsbCwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaXNEb25lIGlzIHRydWUgd2hlbiBhIHRhc2sgY29tcGxldGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzRG9uZSgpIHsKKyAgICAgICAgRnV0dXJlVGFzayB0YXNrID0gbmV3IEZ1dHVyZVRhc2soIG5ldyBOb09wQ2FsbGFibGUoKSk7CisgICAgICAgIHRhc2sucnVuKCk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5pc0RvbmUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRhc2suaXNDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcnVuQW5kUmVzZXQgb2YgYSBub24tY2FuY2VsbGVkIHRhc2sgc3VjY2VlZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuQW5kUmVzZXQoKSB7CisgICAgICAgIFB1YmxpY0Z1dHVyZVRhc2sgdGFzayA9IG5ldyBQdWJsaWNGdXR1cmVUYXNrKG5ldyBOb09wQ2FsbGFibGUoKSk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5ydW5BbmRSZXNldCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodGFzay5pc0RvbmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcnVuQW5kUmVzZXQgYWZ0ZXIgY2FuY2VsbGF0aW9uIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0QWZ0ZXJDYW5jZWwoKSB7CisgICAgICAgIFB1YmxpY0Z1dHVyZVRhc2sgdGFzayA9IG5ldyBQdWJsaWNGdXR1cmVUYXNrKG5ldyBOb09wQ2FsbGFibGUoKSk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5jYW5jZWwoZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodGFzay5ydW5BbmRSZXNldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrLmlzRG9uZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrLmlzQ2FuY2VsbGVkKCkpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBzZXR0aW5nIHZhbHVlIGNhdXNlcyBnZXQgdG8gcmV0dXJuIGl0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldCgpIHsKKyAgICAgICAgUHVibGljRnV0dXJlVGFzayB0YXNrID0gbmV3IFB1YmxpY0Z1dHVyZVRhc2sobmV3IE5vT3BDYWxsYWJsZSgpKTsKKyAgICAgICAgdGFzay5zZXQob25lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0YXNrLmdldCgpLCBvbmUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRFeGNlcHRpb24gY2F1c2VzIGdldCB0byB0aHJvdyBFeGVjdXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RXhjZXB0aW9uKCkgeworICAgICAgICBFeGNlcHRpb24gbnNlID0gbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgUHVibGljRnV0dXJlVGFzayB0YXNrID0gbmV3IFB1YmxpY0Z1dHVyZVRhc2sobmV3IE5vT3BDYWxsYWJsZSgpKTsKKyAgICAgICAgdGFzay5zZXRFeGNlcHRpb24obnNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCB4ID0gdGFzay5nZXQoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhdXNlLCBuc2UpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQ2FuY2VsbGluZyBiZWZvcmUgcnVubmluZyBzdWNjZWVkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxCZWZvcmVSdW4oKSB7CisgICAgICAgIEZ1dHVyZVRhc2sgdGFzayA9IG5ldyBGdXR1cmVUYXNrKCBuZXcgTm9PcENhbGxhYmxlKCkpOworICAgICAgICBhc3NlcnRUcnVlKHRhc2suY2FuY2VsKGZhbHNlKSk7CisgICAgICAgIHRhc2sucnVuKCk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5pc0RvbmUoKSk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5pc0NhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwodHJ1ZSkgYmVmb3JlIHJ1biBzdWNjZWVkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxCZWZvcmVSdW4yKCkgeworICAgICAgICBGdXR1cmVUYXNrIHRhc2sgPSBuZXcgRnV0dXJlVGFzayggbmV3IE5vT3BDYWxsYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrLmNhbmNlbCh0cnVlKSk7CisgICAgICAgIHRhc2sucnVuKCk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5pc0RvbmUoKSk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5pc0NhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYW5jZWwgb2YgYSBjb21wbGV0ZWQgdGFzayBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxBZnRlclJ1bigpIHsKKyAgICAgICAgRnV0dXJlVGFzayB0YXNrID0gbmV3IEZ1dHVyZVRhc2soIG5ldyBOb09wQ2FsbGFibGUoKSk7CisgICAgICAgIHRhc2sucnVuKCk7CisgICAgICAgIGFzc2VydEZhbHNlKHRhc2suY2FuY2VsKGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUodGFzay5pc0RvbmUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRhc2suaXNDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2FuY2VsKHRydWUpIGludGVycnVwdHMgYSBydW5uaW5nIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW50ZXJydXB0KCkgeworICAgICAgICBGdXR1cmVUYXNrIHRhc2sgPSBuZXcgRnV0dXJlVGFzayggbmV3IENhbGxhYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICB9IH0pOworICAgICAgICBUaHJlYWQgdCA9IG5ldyAgVGhyZWFkKHRhc2spOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodGFzay5jYW5jZWwodHJ1ZSkpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRhc2suaXNEb25lKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrLmlzQ2FuY2VsbGVkKCkpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBjYW5jZWwoZmFsc2UpIGRvZXMgbm90IGludGVycnVwdCBhIHJ1bm5pbmcgdGFzaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxOb0ludGVycnVwdCgpIHsKKyAgICAgICAgRnV0dXJlVGFzayB0YXNrID0gbmV3IEZ1dHVyZVRhc2soIG5ldyBDYWxsYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTUVESVVNX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkRmFpbCgic2hvdWxkIG5vdCBpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgICAgIH0gfSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3ICBUaHJlYWQodGFzayk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrLmNhbmNlbChmYWxzZSkpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRhc2suaXNEb25lKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrLmlzQ2FuY2VsbGVkKCkpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IGluIG9uZSB0aHJlYWQgY2F1c2VzIGdldCBpbiBhbm90aGVyIHRocmVhZCB0byByZXRyaWV2ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQxKCkgeworICAgICAgICBmaW5hbCBGdXR1cmVUYXNrIGZ0ID0gbmV3IEZ1dHVyZVRhc2sobmV3IENhbGxhYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZ0LmlzRG9uZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZ0LmlzQ2FuY2VsbGVkKCkpOworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGZ0LnJ1bigpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZ0LmlzRG9uZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZ0LmlzQ2FuY2VsbGVkKCkpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworCisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCBpbiBvbmUgdGhyZWFkIGNhdXNlcyB0aW1lZCBnZXQgaW4gYW5vdGhlciB0aHJlYWQgdG8gcmV0cmlldmUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRHZXQxKCkgeworICAgICAgICBmaW5hbCBGdXR1cmVUYXNrIGZ0ID0gbmV3IEZ1dHVyZVRhc2sobmV3IENhbGxhYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnQuZ2V0KFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKFRpbWVvdXRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZnQuaXNEb25lKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZnQuaXNDYW5jZWxsZWQoKSk7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBmdC5ydW4oKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmdC5pc0RvbmUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShmdC5pc0NhbmNlbGxlZCgpKTsKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQ2FuY2VsbGluZyBhIHRhc2sgY2F1c2VzIHRpbWVkIGdldCBpbiBhbm90aGVyIHRocmVhZCB0byB0aHJvdyBDYW5jZWxsYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRHZXRfQ2FuY2VsbGF0aW9uKCkgeworICAgICAgICBmaW5hbCBGdXR1cmVUYXNrIGZ0ID0gbmV3IEZ1dHVyZVRhc2sobmV3IENhbGxhYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnQuZ2V0KE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDYW5jZWxsYXRpb25FeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoZnQpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsgCisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGZ0LmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxsaW5nIGEgdGFzayBjYXVzZXMgZ2V0IGluIGFub3RoZXIgdGhyZWFkIHRvIHRocm93IENhbmNlbGxhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRfQ2FuY2VsbGF0aW9uKCkgeworICAgICAgICBmaW5hbCBGdXR1cmVUYXNrIGZ0ID0gbmV3IEZ1dHVyZVRhc2sobmV3IENhbGxhYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChmdCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOyAKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgZnQuY2FuY2VsKHRydWUpOworICAgICAgICAgICAgdDEuam9pbigpOworICAgICAgICAgICAgdDIuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogQSBydW50aW1lIGV4Y2VwdGlvbiBpbiB0YXNrIGNhdXNlcyBnZXQgdG8gdGhyb3cgRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldF9FeGVjdXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIEZ1dHVyZVRhc2sgZnQgPSBuZXcgRnV0dXJlVGFzayhuZXcgQ2FsbGFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDUvMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZ0LnJ1bigpOworICAgICAgICAgICAgZnQuZ2V0KCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisgIAorICAgIC8qKgorICAgICAqICBBIHJ1bnRpbWUgZXhjZXB0aW9uIGluIHRhc2sgY2F1c2VzIHRpbWVkIGdldCB0byB0aHJvdyBFeGVjdXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRHZXRfRXhlY3V0aW9uRXhjZXB0aW9uMigpIHsKKyAgICAgICAgZmluYWwgRnV0dXJlVGFzayBmdCA9IG5ldyBGdXR1cmVUYXNrKG5ldyBDYWxsYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpID0gNS8wOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZnQucnVuKCk7CisgICAgICAgICAgICBmdC5nZXQoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKSB7IAorICAgICAgICB9IGNhdGNoKFRpbWVvdXRFeGNlcHRpb24gc3VjY2VzcykgeyB9IC8vIHVubGlrZWx5IGJ1dCBPSworICAgICAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgICAKKworICAgIC8qKgorICAgICAqIEludGVycnVwdGluZyBhIHdhaXRpbmcgZ2V0IGNhdXNlcyBpdCB0byB0aHJvdyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRfSW50ZXJydXB0ZWRFeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIEZ1dHVyZVRhc2sgZnQgPSBuZXcgRnV0dXJlVGFzayhuZXcgTm9PcENhbGxhYmxlKCkpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgSW50ZXJydXB0aW5nIGEgd2FpdGluZyB0aW1lZCBnZXQgY2F1c2VzIGl0IHRvIHRocm93IEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkR2V0X0ludGVycnVwdGVkRXhjZXB0aW9uMigpIHsKKyAgICAgICAgZmluYWwgRnV0dXJlVGFzayBmdCA9IG5ldyBGdXR1cmVUYXNrKG5ldyBOb09wQ2FsbGFibGUoKSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnQuZ2V0KExPTkdfREVMQVlfTVMsVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEEgdGltZWQgb3V0IHRpbWVkIGdldCB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRfVGltZW91dEV4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZ1dHVyZVRhc2sgZnQgPSBuZXcgRnV0dXJlVGFzayhuZXcgTm9PcENhbGxhYmxlKCkpOworICAgICAgICAgICAgZnQuZ2V0KDEsVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goVGltZW91dEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvSlNSMTY2VGVzdENhc2UuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvSlNSMTY2VGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VjN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9KU1IxNjZUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS4qOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIEpTUjE2NiBKdW5pdCBUQ0sgdGVzdHMuICBEZWZpbmVzIHNvbWUgY29uc3RhbnRzLAorICogdXRpbGl0eSBtZXRob2RzIGFuZCBjbGFzc2VzLCBhcyB3ZWxsIGFzIGEgc2ltcGxlIGZyYW1ld29yayBmb3IKKyAqIGhlbHBpbmcgdG8gbWFrZSBzdXJlIHRoYXQgYXNzZXJ0aW9ucyBmYWlsaW5nIGluIGdlbmVyYXRlZCB0aHJlYWRzCisgKiBjYXVzZSB0aGUgYXNzb2NpYXRlZCB0ZXN0IHRoYXQgZ2VuZXJhdGVkIHRoZW0gdG8gaXRzZWxmIGZhaWwgKHdoaWNoCisgKiBKVW5pdCBkb2Ugbm90IG90aGVyd2lzZSBhcnJhbmdlKS4gIFRoZSBydWxlcyBmb3IgY3JlYXRpbmcgc3VjaAorICogdGVzdHMgYXJlOgorICoKKyAqIDxvbD4KKyAqCisgKiA8bGk+IEFsbCBhc3NlcnRpb25zIGluIGNvZGUgcnVubmluZyBpbiBnZW5lcmF0ZWQgdGhyZWFkcyBtdXN0IHVzZQorICogdGhlIGZvcm1zIHtAbGluayAjdGhyZWFkRmFpbH0gLCB7QGxpbmsgI3RocmVhZEFzc2VydFRydWV9IHtAbGluaworICogI3RocmVhZEFzc2VydEVxdWFsc30sIG9yIHtAbGluayAjdGhyZWFkQXNzZXJ0TnVsbH0sIChub3QKKyAqIDx0dD5mYWlsPC90dD4sIDx0dD5hc3NlcnRUcnVlPC90dD4sIGV0Yy4pIEl0IGlzIE9LIChidXQgbm90CisgKiBwYXJ0aWN1bGFybHkgcmVjb21tZW5kZWQpIGZvciBvdGhlciBjb2RlIHRvIHVzZSB0aGVzZSBmb3JtcyB0b28uCisgKiBPbmx5IHRoZSBtb3N0IHR5cGljYWxseSB1c2VkIEpVbml0IGFzc2VydGlvbiBtZXRob2RzIGFyZSBkZWZpbmVkCisgKiB0aGlzIHdheSwgYnV0IGVub3VnaCB0byBsaXZlIHdpdGguPC9saT4KKyAqCisgKiA8bGk+IElmIHlvdSBvdmVycmlkZSB7QGxpbmsgI3NldFVwfSBvciB7QGxpbmsgI3RlYXJEb3dufSwgbWFrZSBzdXJlCisgKiB0byBpbnZva2UgPHR0PnN1cGVyLnNldFVwPC90dD4gYW5kIDx0dD5zdXBlci50ZWFyRG93bjwvdHQ+IHdpdGhpbgorICogdGhlbS4gVGhlc2UgbWV0aG9kcyBhcmUgdXNlZCB0byBjbGVhciBhbmQgY2hlY2sgZm9yIHRocmVhZAorICogYXNzZXJ0aW9uIGZhaWx1cmVzLjwvbGk+CisgKgorICogPGxpPkFsbCBkZWxheXMgYW5kIHRpbWVvdXRzIG11c3QgdXNlIG9uZSBvZiB0aGUgY29uc3RhbnRzIDx0dD4KKyAqIFNIT1JUX0RFTEFZX01TPC90dD4sIDx0dD4gU01BTExfREVMQVlfTVM8L3R0PiwgPHR0PiBNRURJVU1fREVMQVlfTVM8L3R0PiwKKyAqIDx0dD4gTE9OR19ERUxBWV9NUzwvdHQ+LiBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgYSBTSE9SVCBpcyBhbHdheXMKKyAqIGRpc2NyaW1pbmFibGUgZnJvbSB6ZXJvIHRpbWUsIGFuZCBhbHdheXMgYWxsb3dzIGVub3VnaCB0aW1lIGZvciB0aGUKKyAqIHNtYWxsIGFtb3VudHMgb2YgY29tcHV0YXRpb24gKGNyZWF0aW5nIGEgdGhyZWFkLCBjYWxsaW5nIGEgZmV3CisgKiBtZXRob2RzLCBldGMpIG5lZWRlZCB0byByZWFjaCBhIHRpbWVvdXQgcG9pbnQuIFNpbWlsYXJseSwgYSBTTUFMTAorICogaXMgYWx3YXlzIGRpc2NyaW1pbmFibGUgYXMgbGFyZ2VyIHRoYW4gU0hPUlQgYW5kIHNtYWxsZXIgdGhhbgorICogTUVESVVNLiAgQW5kIHNvIG9uLiBUaGVzZSBjb25zdGFudHMgYXJlIHNldCB0byBjb25zZXJ2YXRpdmUgdmFsdWVzLAorICogYnV0IGV2ZW4gc28sIGlmIHRoZXJlIGlzIGV2ZXIgYW55IGRvdWJ0LCB0aGV5IGNhbiBhbGwgYmUgaW5jcmVhc2VkCisgKiBpbiBvbmUgc3BvdCB0byByZXJ1biB0ZXN0cyBvbiBzbG93ZXIgcGxhdGZvcm1zPC9saT4KKyAqCisgKiA8bGk+IEFsbCB0aHJlYWRzIGdlbmVyYXRlZCBtdXN0IGJlIGpvaW5lZCBpbnNpZGUgZWFjaCB0ZXN0IGNhc2UKKyAqIG1ldGhvZCAob3IgPHR0PmZhaWw8L3R0PiB0byBkbyBzbykgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoZQorICogbWV0aG9kLiBUaGUgPHR0PiBqb2luUG9vbDwvdHQ+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkbyB0aGlzIHdoZW4KKyAqIHVzaW5nIEV4ZWN1dG9ycy48L2xpPgorICoKKyAqIDwvb2w+CisgKgorICogPHA+IDxiPk90aGVyIG5vdGVzPC9iPgorICogPHVsPgorICoKKyAqIDxsaT4gVXN1YWxseSwgdGhlcmUgaXMgb25lIHRlc3RjYXNlIG1ldGhvZCBwZXIgSlNSMTY2IG1ldGhvZAorICogY292ZXJpbmcgIm5vcm1hbCIgb3BlcmF0aW9uLCBhbmQgdGhlbiBhcyBtYW55IGV4Y2VwdGlvbi10ZXN0aW5nCisgKiBtZXRob2RzIGFzIHRoZXJlIGFyZSBleGNlcHRpb25zIHRoZSBtZXRob2QgY2FuIHRocm93LiBTb21ldGltZXMKKyAqIHRoZXJlIGFyZSBtdWx0aXBsZSB0ZXN0cyBwZXIgSlNSMTY2IG1ldGhvZCB3aGVuIHRoZSBkaWZmZXJlbnQKKyAqICJub3JtYWwiIGJlaGF2aW9ycyBkaWZmZXIgc2lnbmlmaWNhbnRseS4gQW5kIHNvbWV0aW1lcyB0ZXN0Y2FzZXMKKyAqIGNvdmVyIG11bHRpcGxlIG1ldGhvZHMgd2hlbiB0aGV5IGNhbm5vdCBiZSB0ZXN0ZWQgaW4KKyAqIGlzb2xhdGlvbi48L2xpPgorICogCisgKiA8bGk+IFRoZSBkb2N1bWVudGF0aW9uIHN0eWxlIGZvciB0ZXN0Y2FzZXMgaXMgdG8gcHJvdmlkZSBhcyBqYXZhZG9jCisgKiBhIHNpbXBsZSBzZW50ZW5jZSBvciB0d28gZGVzY3JpYmluZyB0aGUgcHJvcGVydHkgdGhhdCB0aGUgdGVzdGNhc2UKKyAqIG1ldGhvZCBwdXJwb3J0cyB0byB0ZXN0LiBUaGUgamF2YWRvY3MgZG8gbm90IHNheSBhbnl0aGluZyBhYm91dCBob3cKKyAqIHRoZSBwcm9wZXJ0eSBpcyB0ZXN0ZWQuIFRvIGZpbmQgb3V0LCByZWFkIHRoZSBjb2RlLjwvbGk+CisgKgorICogPGxpPiBUaGVzZSB0ZXN0cyBhcmUgImNvbmZvcm1hbmNlIHRlc3RzIiwgYW5kIGRvIG5vdCBhdHRlbXB0IHRvCisgKiB0ZXN0IHRocm91Z2hwdXQsIGxhdGVuY3ksIHNjYWxhYmlsaXR5IG9yIG90aGVyIHBlcmZvcm1hbmNlIGZhY3RvcnMKKyAqIChzZWUgdGhlIHNlcGFyYXRlICJqdHJlZyIgdGVzdHMgZm9yIGEgc2V0IGludGVuZGVkIHRvIGNoZWNrIHRoZXNlCisgKiBmb3IgdGhlIG1vc3QgY2VudHJhbCBhc3BlY3RzIG9mIGZ1bmN0aW9uYWxpdHkuKSBTbywgbW9zdCB0ZXN0cyB1c2UKKyAqIHRoZSBzbWFsbGVzdCBzZW5zaWJsZSBudW1iZXJzIG9mIHRocmVhZHMsIGNvbGxlY3Rpb24gc2l6ZXMsIGV0YworICogbmVlZGVkIHRvIGNoZWNrIGJhc2ljIGNvbmZvcm1hbmNlLjwvbGk+CisgKgorICogPGxpPlRoZSB0ZXN0IGNsYXNzZXMgY3VycmVudGx5IGRvIG5vdCBkZWNsYXJlIGluY2x1c2lvbiBpbgorICogYW55IHBhcnRpY3VsYXIgcGFja2FnZSB0byBzaW1wbGlmeSB0aGluZ3MgZm9yIHBlb3BsZSBpbnRlZ3JhdGluZworICogdGhlbSBpbiBUQ0sgdGVzdCBzdWl0ZXMuPC9saT4KKyAqCisgKiA8bGk+IEFzIGEgY29udmVuaWVuY2UsIHRoZSA8dHQ+bWFpbjwvdHQ+IG9mIHRoaXMgY2xhc3MgKEpTUjE2NlRlc3RDYXNlKQorICogcnVucyBhbGwgSlNSMTY2IHVuaXQgdGVzdHMuPC9saT4KKyAqCisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgSlNSMTY2VGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgLyoqCisgICAgICogUnVucyBhbGwgSlNSMTY2IHVuaXQgdGVzdHMgdXNpbmcganVuaXQudGV4dHVpLlRlc3RSdW5uZXIKKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgaW50IGl0ZXJzID0gMTsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgCisgICAgICAgICAgICBpdGVycyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSk7CisgICAgICAgIFRlc3QgcyA9IHN1aXRlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcnM7ICsraSkgeworICAgICAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuIChzKTsKKyAgICAgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICAgICAgU3lzdGVtLnJ1bkZpbmFsaXphdGlvbigpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3RzIGFsbCBKU1IxNjYgdW5pdCB0ZXN0cyBhcyBvbmUgc3VpdGUKKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlICggKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkpTUjE2NiBVbml0IFRlc3RzIik7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBzdWl0ZS5hZGRUZXN0KEFic3RyYWN0RXhlY3V0b3JTZXJ2aWNlVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBYnN0cmFjdFF1ZXVlVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplclRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoQXJyYXlCbG9ja2luZ1F1ZXVlVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBdG9taWNCb29sZWFuVGVzdC5zdWl0ZSgpKTsgCisgICAgICAgIHN1aXRlLmFkZFRlc3QoQXRvbWljSW50ZWdlckFycmF5VGVzdC5zdWl0ZSgpKTsgCisgICAgICAgIHN1aXRlLmFkZFRlc3QoQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlclRlc3Quc3VpdGUoKSk7IAorICAgICAgICBzdWl0ZS5hZGRUZXN0KEF0b21pY0ludGVnZXJUZXN0LnN1aXRlKCkpOyAKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBdG9taWNMb25nQXJyYXlUZXN0LnN1aXRlKCkpOyAKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBdG9taWNMb25nRmllbGRVcGRhdGVyVGVzdC5zdWl0ZSgpKTsgCisgICAgICAgIHN1aXRlLmFkZFRlc3QoQXRvbWljTG9uZ1Rlc3Quc3VpdGUoKSk7IAorICAgICAgICBzdWl0ZS5hZGRUZXN0KEF0b21pY01hcmthYmxlUmVmZXJlbmNlVGVzdC5zdWl0ZSgpKTsgCisgICAgICAgIHN1aXRlLmFkZFRlc3QoQXRvbWljUmVmZXJlbmNlQXJyYXlUZXN0LnN1aXRlKCkpOyAKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXJUZXN0LnN1aXRlKCkpOyAKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBdG9taWNSZWZlcmVuY2VUZXN0LnN1aXRlKCkpOyAKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBdG9taWNTdGFtcGVkUmVmZXJlbmNlVGVzdC5zdWl0ZSgpKTsgCisgICAgICAgIHN1aXRlLmFkZFRlc3QoQ29uY3VycmVudEhhc2hNYXBUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KENvbmN1cnJlbnRMaW5rZWRRdWV1ZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoQ29weU9uV3JpdGVBcnJheUxpc3RUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KENvcHlPbldyaXRlQXJyYXlTZXRUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KENvdW50RG93bkxhdGNoVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChDeWNsaWNCYXJyaWVyVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChEZWxheVF1ZXVlVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChFeGNoYW5nZXJUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEV4ZWN1dG9yc1Rlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoRnV0dXJlVGFza1Rlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoTGlua2VkQmxvY2tpbmdRdWV1ZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoTGlua2VkTGlzdFRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoTG9ja1N1cHBvcnRUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFByaW9yaXR5QmxvY2tpbmdRdWV1ZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoUHJpb3JpdHlRdWV1ZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoUmVlbnRyYW50TG9ja1Rlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoUmVlbnRyYW50UmVhZFdyaXRlTG9ja1Rlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoU2NoZWR1bGVkRXhlY3V0b3JUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFNlbWFwaG9yZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoU3luY2hyb25vdXNRdWV1ZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoU3lzdGVtVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChUaHJlYWRMb2NhbFRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoVGhyZWFkUG9vbEV4ZWN1dG9yVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChUaHJlYWRUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFRpbWVVbml0VGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgU0hPUlRfREVMQVlfTVM7CisgICAgcHVibGljIHN0YXRpYyBsb25nIFNNQUxMX0RFTEFZX01TOworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBNRURJVU1fREVMQVlfTVM7CisgICAgcHVibGljIHN0YXRpYyBsb25nIExPTkdfREVMQVlfTVM7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2hvcnRlc3QgdGltZWQgZGVsYXkuIFRoaXMgY291bGQKKyAgICAgKiBiZSByZWltcGxlbWVudGVkIHRvIHVzZSBmb3IgZXhhbXBsZSBhIFByb3BlcnR5LgorICAgICAqLyAKKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRTaG9ydERlbGF5KCkgeworICAgICAgICByZXR1cm4gNTA7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgZGVsYXlzIGFzIG11bHRpcGxlcyBvZiBTSE9SVF9ERUxBWS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgIHZvaWQgc2V0RGVsYXlzKCkgeworICAgICAgICBTSE9SVF9ERUxBWV9NUyA9IGdldFNob3J0RGVsYXkoKTsKKyAgICAgICAgU01BTExfREVMQVlfTVMgPSBTSE9SVF9ERUxBWV9NUyAqIDU7CisgICAgICAgIE1FRElVTV9ERUxBWV9NUyA9IFNIT1JUX0RFTEFZX01TICogMTA7CisgICAgICAgIExPTkdfREVMQVlfTVMgPSBTSE9SVF9ERUxBWV9NUyAqIDUwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYWcgc2V0IHRydWUgaWYgYW55IHRocmVhZEFzc2VydCBtZXRob2RzIGZhaWwKKyAgICAgKi8KKyAgICB2b2xhdGlsZSBib29sZWFuIHRocmVhZEZhaWxlZDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGVzdCB0byBpbmRpY2F0ZSB0aGF0IG5vIHRocmVhZCBhc3NlcnRpb25zIGhhdmUgZmFpbGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAorICAgICAgICBzZXREZWxheXMoKTsKKyAgICAgICAgdGhyZWFkRmFpbGVkID0gZmFsc2U7ICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRlc3QgY2FzZSBmYWlsdXJlIGlmIGFueSB0aHJlYWQgYXNzZXJ0aW9ucyBoYXZlIGZhaWxlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeyAKKyAgICAgICAgYXNzZXJ0RmFsc2UodGhyZWFkRmFpbGVkKTsgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWwsIGFsc28gc2V0dGluZyBzdGF0dXMgdG8gaW5kaWNhdGUgY3VycmVudCB0ZXN0Y2FzZSBzaG91bGQgZmFpbAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0aHJlYWRGYWlsKFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgdGhyZWFkRmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgZmFpbChyZWFzb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIGV4cHJlc3Npb24gbm90IHRydWUsIHNldCBzdGF0dXMgdG8gaW5kaWNhdGUgY3VycmVudCB0ZXN0Y2FzZQorICAgICAqIHNob3VsZCBmYWlsCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRocmVhZEFzc2VydFRydWUoYm9vbGVhbiBiKSB7CisgICAgICAgIGlmICghYikgeworICAgICAgICAgICAgdGhyZWFkRmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBleHByZXNzaW9uIG5vdCBmYWxzZSwgc2V0IHN0YXR1cyB0byBpbmRpY2F0ZSBjdXJyZW50IHRlc3RjYXNlCisgICAgICogc2hvdWxkIGZhaWwKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGhyZWFkQXNzZXJ0RmFsc2UoYm9vbGVhbiBiKSB7CisgICAgICAgIGlmIChiKSB7CisgICAgICAgICAgICB0aHJlYWRGYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBhcmd1bWVudCBub3QgbnVsbCwgc2V0IHN0YXR1cyB0byBpbmRpY2F0ZSBjdXJyZW50IHRlc3RjYXNlCisgICAgICogc2hvdWxkIGZhaWwKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGhyZWFkQXNzZXJ0TnVsbChPYmplY3QgeCkgeworICAgICAgICBpZiAoeCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJlYWRGYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgYXNzZXJ0TnVsbCh4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIGFyZ3VtZW50cyBub3QgZXF1YWwsIHNldCBzdGF0dXMgdG8gaW5kaWNhdGUgY3VycmVudCB0ZXN0Y2FzZQorICAgICAqIHNob3VsZCBmYWlsCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRocmVhZEFzc2VydEVxdWFscyhsb25nIHgsIGxvbmcgeSkgeworICAgICAgICBpZiAoeCAhPSB5KSB7CisgICAgICAgICAgICB0aHJlYWRGYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHgsIHkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgYXJndW1lbnRzIG5vdCBlcXVhbCwgc2V0IHN0YXR1cyB0byBpbmRpY2F0ZSBjdXJyZW50IHRlc3RjYXNlCisgICAgICogc2hvdWxkIGZhaWwKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGhyZWFkQXNzZXJ0RXF1YWxzKE9iamVjdCB4LCBPYmplY3QgeSkgeworICAgICAgICBpZiAoeCAhPSB5ICYmICh4ID09IG51bGwgfHwgIXguZXF1YWxzKHkpKSkgeworICAgICAgICAgICAgdGhyZWFkRmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh4LCB5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRocmVhZEZhaWwgd2l0aCBtZXNzYWdlICJzaG91bGQgdGhyb3cgZXhjZXB0aW9uIgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0aHJlYWRTaG91bGRUaHJvdygpIHsKKyAgICAgICAgdGhyZWFkRmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IGV4Y2VwdGlvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRocmVhZEZhaWwgd2l0aCBtZXNzYWdlICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCkgeworICAgICAgICB0aHJlYWRGYWlsZWQgPSB0cnVlOworICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2FpdCBvdXQgdGVybWluYXRpb24gb2YgYSB0aHJlYWQgcG9vbCBvciBmYWlsIGRvaW5nIHNvCisgICAgICovCisgICAgcHVibGljIHZvaWQgam9pblBvb2woRXhlY3V0b3JTZXJ2aWNlIGV4ZWMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWMuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXhlYy5hd2FpdFRlcm1pbmF0aW9uKExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICAvLyBBbGxvd2VkIGluIGNhc2UgdGVzdCBkb2Vzbid0IGhhdmUgcHJpdnMKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogZmFpbCB3aXRoIG1lc3NhZ2UgInNob3VsZCB0aHJvdyBleGNlcHRpb24iCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFRocm93KCkgeworICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgZXhjZXB0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmFpbCB3aXRoIG1lc3NhZ2UgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb24oKSB7CisgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHBsYWNlIGluIGNvbGxlY3Rpb25zLCBhcnJheXMsIGV0Yy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSAyMDsKKworICAgIC8vIFNvbWUgY29udmVuaWVudCBJbnRlZ2VyIGNvbnN0YW50cworCisgICAgc3RhdGljIGZpbmFsIEludGVnZXIgemVybyA9IG5ldyBJbnRlZ2VyKDApOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIG9uZSA9IG5ldyBJbnRlZ2VyKDEpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIHR3byA9IG5ldyBJbnRlZ2VyKDIpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIHRocmVlICA9IG5ldyBJbnRlZ2VyKDMpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIGZvdXIgID0gbmV3IEludGVnZXIoNCk7CisgICAgc3RhdGljIGZpbmFsIEludGVnZXIgZml2ZSAgPSBuZXcgSW50ZWdlcig1KTsKKyAgICBzdGF0aWMgZmluYWwgSW50ZWdlciBzaXggPSBuZXcgSW50ZWdlcig2KTsKKyAgICBzdGF0aWMgZmluYWwgSW50ZWdlciBzZXZlbiA9IG5ldyBJbnRlZ2VyKDcpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIGVpZ2h0ID0gbmV3IEludGVnZXIoOCk7CisgICAgc3RhdGljIGZpbmFsIEludGVnZXIgbmluZSA9IG5ldyBJbnRlZ2VyKDkpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIG0xICA9IG5ldyBJbnRlZ2VyKC0xKTsKKyAgICBzdGF0aWMgZmluYWwgSW50ZWdlciBtMiAgPSBuZXcgSW50ZWdlcigtMik7CisgICAgc3RhdGljIGZpbmFsIEludGVnZXIgbTMgID0gbmV3IEludGVnZXIoLTMpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIG00ID0gbmV3IEludGVnZXIoLTQpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIG01ID0gbmV3IEludGVnZXIoLTUpOworICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIG0xMCA9IG5ldyBJbnRlZ2VyKC0xMCk7CisKKworICAgIC8qKgorICAgICAqIEEgc2VjdXJpdHkgcG9saWN5IHdoZXJlIG5ldyBwZXJtaXNzaW9ucyBjYW4gYmUgZHluYW1pY2FsbHkgYWRkZWQKKyAgICAgKiBvciBhbGwgY2xlYXJlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQWRqdXN0YWJsZVBvbGljeSBleHRlbmRzIGphdmEuc2VjdXJpdHkuUG9saWN5IHsKKyAgICAgICAgUGVybWlzc2lvbnMgcGVybXMgPSBuZXcgUGVybWlzc2lvbnMoKTsKKyAgICAgICAgQWRqdXN0YWJsZVBvbGljeSgpIHsgfQorICAgICAgICB2b2lkIGFkZFBlcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKSB7IHBlcm1zLmFkZChwZXJtKTsgfQorICAgICAgICB2b2lkIGNsZWFyUGVybWlzc2lvbnMoKSB7IHBlcm1zID0gbmV3IFBlcm1pc3Npb25zKCk7IH0KKyAgICAgICAgcHVibGljIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKENvZGVTb3VyY2UgY3MpIHsKKyAgICAgICAgICAgIHJldHVybiBwZXJtczsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoUHJvdGVjdGlvbkRvbWFpbiBwZCkgeworICAgICAgICAgICAgcmV0dXJuIHBlcm1zOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGltcGxpZXMoUHJvdGVjdGlvbkRvbWFpbiBwZCwgUGVybWlzc2lvbiBwKSB7CisgICAgICAgICAgICByZXR1cm4gcGVybXMuaW1wbGllcyhwKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkge30KKyAgICB9CisKKworICAgIC8vIFNvbWUgY29udmVuaWVudCBSdW5uYWJsZSBjbGFzc2VzCisKKyAgICBzdGF0aWMgY2xhc3MgTm9PcFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7fQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBOb09wQ2FsbGFibGUgaW1wbGVtZW50cyBDYWxsYWJsZSB7CisgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsgcmV0dXJuIEJvb2xlYW4uVFJVRTsgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TVFJJTkcgPSAiYSB0ZXN0IHN0cmluZyI7CisKKyAgICBzdGF0aWMgY2xhc3MgU3RyaW5nVGFzayBpbXBsZW1lbnRzIENhbGxhYmxlPFN0cmluZz4geworICAgICAgICBwdWJsaWMgU3RyaW5nIGNhbGwoKSB7IHJldHVybiBURVNUX1NUUklORzsgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBOUEVUYXNrIGltcGxlbWVudHMgQ2FsbGFibGU8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FsbCgpIHsgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ2FsbGFibGVPbmUgaW1wbGVtZW50cyBDYWxsYWJsZTxJbnRlZ2VyPiB7CisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhbGwoKSB7IHJldHVybiBvbmU7IH0KKyAgICB9CisKKyAgICBjbGFzcyBTaG9ydFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNob3J0SW50ZXJydXB0ZWRSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTbWFsbFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNtYWxsUG9zc2libHlJbnRlcnJ1cHRlZFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU21hbGxDYWxsYWJsZSBpbXBsZW1lbnRzIENhbGxhYmxlIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU21hbGxJbnRlcnJ1cHRlZFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgY2xhc3MgTWVkaXVtUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIE1lZGl1bUludGVycnVwdGVkUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIE1lZGl1bVBvc3NpYmx5SW50ZXJydXB0ZWRSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTUVESVVNX0RFTEFZX01TKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIExvbmdQb3NzaWJseUludGVycnVwdGVkUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKExPTkdfREVMQVlfTVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIHVzZSBhcyBUaHJlYWRGYWN0b3J5IGluIGNvbnN0cnVjdG9ycworICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBTaW1wbGVUaHJlYWRGYWN0b3J5IGltcGxlbWVudHMgVGhyZWFkRmFjdG9yeXsKKyAgICAgICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcil7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRocmVhZChyKTsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmFja2VkU2hvcnRSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgdm9sYXRpbGUgYm9vbGVhbiBkb25lID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFRyYWNrZWRNZWRpdW1SdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgdm9sYXRpbGUgYm9vbGVhbiBkb25lID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmFja2VkTG9uZ1J1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICB2b2xhdGlsZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmFja2VkTm9PcFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICB2b2xhdGlsZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVHJhY2tlZENhbGxhYmxlIGltcGxlbWVudHMgQ2FsbGFibGUgeworICAgICAgICB2b2xhdGlsZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGb3IgdXNlIGFzIFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciBpbiBjb25zdHJ1Y3RvcnMKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgTm9PcFJFSGFuZGxlciBpbXBsZW1lbnRzIFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcnsKKyAgICAgICAgcHVibGljIHZvaWQgcmVqZWN0ZWRFeGVjdXRpb24oUnVubmFibGUgciwgVGhyZWFkUG9vbEV4ZWN1dG9yIGV4ZWN1dG9yKXt9IAorICAgIH0KKyAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkQmxvY2tpbmdRdWV1ZVRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkQmxvY2tpbmdRdWV1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NDk2YTRhCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9MaW5rZWRCbG9ja2luZ1F1ZXVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzMSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgTGlua2VkQmxvY2tpbmdRdWV1ZVRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExpbmtlZEJsb2NraW5nUXVldWVUZXN0LmNsYXNzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHF1ZXVlIG9mIGdpdmVuIHNpemUgY29udGFpbmluZyBjb25zZWN1dGl2ZQorICAgICAqIEludGVnZXJzIDAgLi4uIG4uCisgICAgICovCisgICAgcHJpdmF0ZSBMaW5rZWRCbG9ja2luZ1F1ZXVlIHBvcHVsYXRlZFF1ZXVlKGludCBuKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKG4pOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihuZXcgSW50ZWdlcihpKSkpOworICAgICAgICBhc3NlcnRGYWxzZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobiwgcS5zaXplKCkpOworICAgICAgICByZXR1cm4gcTsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogQSBuZXcgcXVldWUgaGFzIHRoZSBpbmRpY2F0ZWQgY2FwYWNpdHksIG9yIEludGVnZXIuTUFYX1ZBTFVFIGlmCisgICAgICogbm9uZSBnaXZlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjEoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLCBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZShTSVpFKS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgpLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBJQUUgaWYgIGNhcGFjaXR5IGFyZ3VtZW50IG5vbnBvc2l0aXZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKDApOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gbnVsbCBDb2xsZWN0aW9uIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemluZyBmcm9tIENvbGxlY3Rpb24gb2YgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZShBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gQ29sbGVjdGlvbiB3aXRoIHNvbWUgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkUtMTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBjb250YWlucyBhbGwgZWxlbWVudHMgb2YgY29sbGVjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I2KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEucG9sbCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVldWUgdHJhbnNpdGlvbnMgZnJvbSBlbXB0eSB0byBmdWxsIHdoZW4gZWxlbWVudHMgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlGdWxsKCkgeworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2hvdWxkIGhhdmUgcm9vbSBmb3IgMiIsIDIsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgIHEuYWRkKG9uZSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgcS5hZGQodHdvKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5vZmZlcih0aHJlZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbWFpbmluZ0NhcGFjaXR5IGRlY3JlYXNlcyBvbiBhZGQsIGluY3JlYXNlcyBvbiByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluaW5nQ2FwYWNpdHkoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRS1pLCBxLnNpemUoKSk7CisgICAgICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRS1pLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHEuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIG9mZmVyKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXJOdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoMSk7CisgICAgICAgICAgICBxLm9mZmVyKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeyB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKDEpOworICAgICAgICAgICAgcS5hZGQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPZmZlciBzdWNjZWVkcyBpZiBub3QgZnVsbDsgZmFpbHMgaWYgZnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlcigpIHsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoMSk7CisgICAgICAgIGFzc2VydFRydWUocS5vZmZlcih6ZXJvKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEub2ZmZXIob25lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIHN1Y2NlZWRzIGlmIG5vdCBmdWxsOyB0aHJvd3MgSVNFIGlmIGZ1bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocS5hZGQobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICAgICAgcS5hZGQobmV3IEludGVnZXIoU0laRSkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoMSk7CisgICAgICAgICAgICBxLmFkZEFsbChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkQWxsKHRoaXMpIHRocm93cyBJQUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsU2VsZigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgcS5hZGRBbGwocSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwgb2YgYSBjb2xsZWN0aW9uIHdpdGggbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIGFkZEFsbCBvZiBhIGNvbGxlY3Rpb24gd2l0aCBhbnkgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFIGFmdGVyCisgICAgICogcG9zc2libHkgYWRkaW5nIHNvbWUgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRS0xOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgcS5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKyAgICAvKioKKyAgICAgKiBhZGRBbGwgdGhyb3dzIElTRSBpZiBub3QgZW5vdWdoIHJvb20KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsNCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKDEpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIFF1ZXVlIGNvbnRhaW5zIGFsbCBlbGVtZW50cywgaW4gdHJhdmVyc2FsIG9yZGVyLCBvZiBzdWNjZXNzZnVsIGFkZEFsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGVtcHR5ID0gbmV3IEludGVnZXJbMF07CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmFkZEFsbChBcnJheXMuYXNMaXN0KGVtcHR5KSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50c1tpXSwgcS5wb2xsKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwdXQobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0TnVsbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgcS5wdXQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IAorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCisgICAgICogYWxsIGVsZW1lbnRzIHN1Y2Nlc3NmdWxseSBwdXQgYXJlIGNvbnRhaW5lZAorICAgICAqLworICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgICBJbnRlZ2VyIEkgPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgICAgICAgcS5wdXQoSSk7CisgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWlucyhJKSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dCBibG9ja3MgaW50ZXJydXB0aWJseSBpZiBmdWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJsb2NraW5nUHV0KCkgeworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFkZGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBJbnRlZ2VyKFNJWkUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscyhhZGRlZCwgU0laRSk7CisgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7IAorICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dCBibG9ja3Mgd2FpdGluZyBmb3IgdGFrZSB3aGVuIGZ1bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0V2l0aFRha2UoKSB7CisgICAgICAgIGZpbmFsIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKDIpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFkZGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2FkZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2FkZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGFkZGVkID49IDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgcS50YWtlKCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIG9mZmVyIHRpbWVzIG91dCBpZiBmdWxsIGFuZCBlbGVtZW50cyBub3QgdGFrZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRPZmZlcigpIHsKKyAgICAgICAgZmluYWwgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoMik7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShxLm9mZmVyKG5ldyBPYmplY3QoKSwgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5vZmZlcihuZXcgT2JqZWN0KCksIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGFrZSByZXRyaWV2ZXMgZWxlbWVudHMgaW4gRklGTyBvcmRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUYWtlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS50YWtlKCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHRha2UgYmxvY2tzIGludGVycnVwdGlibHkgd2hlbiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUYWtlRnJvbUVtcHR5KCkgeworICAgICAgICBmaW5hbCBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnRha2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeyB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZSByZW1vdmVzIGV4aXN0aW5nIGVsZW1lbnRzIHVudGlsIGVtcHR5LCB0aGVuIGJsb2NrcyBpbnRlcnJ1cHRpYmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJsb2NraW5nVGFrZSgpIHsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnRha2UoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBxLnRha2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHRyeSB7IAorICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOyAKKyAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHBvbGwgc3VjY2VlZHMgdW5sZXNzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGwoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBvbGwoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgcG9vbCB3aXRoIHplcm8gdGltZW91dCBzdWNjZWVkcyB3aGVuIG5vbi1lbXB0eSwgZWxzZSB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRQb2xsMCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucG9sbCgwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydE51bGwocS5wb2xsKDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIHBvb2wgd2l0aCBub256ZXJvIHRpbWVvdXQgc3VjY2VlZHMgd2hlbiBub24tZW1wdHksIGVsc2UgdGltZXMgb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkUG9sbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnROdWxsKHEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJydXB0ZWQgdGltZWQgcG9sbCB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaW5zdGVhZCBvZgorICAgICAqIHJldHVybmluZyB0aW1lb3V0IHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRlZFRpbWVkUG9sbCgpIHsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0TnVsbChxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsgCisgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIHRpbWVkIHBvbGwgYmVmb3JlIGEgZGVsYXllZCBvZmZlciBmYWlsczsgYWZ0ZXIgb2ZmZXIgc3VjY2VlZHM7CisgICAgICogIG9uIGludGVycnVwdGlvbiB0aHJvd3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRQb2xsV2l0aE9mZmVyKCkgeworICAgICAgICBmaW5hbCBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnROdWxsKHEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnBvbGwoTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucG9sbChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2VzcykgeyB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5vZmZlcih6ZXJvLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gIAorCisgICAgLyoqCisgICAgICogcGVlayByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgbnVsbCBpZiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgeworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5wZWVrKCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgcS5wb2xsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucGVlaygpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaSAhPSAoKEludGVnZXIpcS5wZWVrKCkpLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE51bGwocS5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVsZW1lbnQgcmV0dXJucyBuZXh0IGVsZW1lbnQsIG9yIHRocm93cyBOU0VFIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnQoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLmVsZW1lbnQoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5lbGVtZW50KCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlIHJlbW92ZXMgbmV4dCBlbGVtZW50LCBvciB0aHJvd3MgTlNFRSBpZiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnJlbW92ZSgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUoeCkgcmVtb3ZlcyB4IGFuZCByZXR1cm5zIHRydWUgaWYgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50KCkgeworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBTSVpFOyBpKz0yKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKz0yKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLnJlbW92ZShuZXcgSW50ZWdlcihpKzEpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBjb250YWlucyh4KSByZXBvcnRzIHRydWUgd2hlbiBlbGVtZW50cyBhZGRlZCBidXQgbm90IHlldCByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgeworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWlucyhuZXcgSW50ZWdlcihpKSkpOworICAgICAgICAgICAgcS5wb2xsKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbGVhciByZW1vdmVzIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBxLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICBxLmFkZChvbmUpOworICAgICAgICBhc3NlcnRGYWxzZShxLmlzRW1wdHkoKSk7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udGFpbnNBbGwoYykgaXMgdHJ1ZSB3aGVuIGMgY29udGFpbnMgYSBzdWJzZXQgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHAgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWluc0FsbChwKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShwLmNvbnRhaW5zQWxsKHEpKTsKKyAgICAgICAgICAgIHAuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHAuY29udGFpbnNBbGwocSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldGFpbkFsbChjKSByZXRhaW5zIG9ubHkgdGhvc2UgZWxlbWVudHMgb2YgYyBhbmQgcmVwb3J0cyB0cnVlIGlmIGNoYW5nZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgeworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBxLnJldGFpbkFsbChwKTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2hhbmdlZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjaGFuZ2VkKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHAucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmVBbGwoYykgcmVtb3ZlcyBvbmx5IHRob3NlIGVsZW1lbnRzIG9mIGMgYW5kIHJlcG9ydHMgdHJ1ZSBpZiBjaGFuZ2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBJID0gKEludGVnZXIpKHAucmVtb3ZlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnMoSSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9BcnJheSBjb250YWlucyBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIE9iamVjdFtdIG8gPSBxLnRvQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob1tpXSwgcS50YWtlKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b0FycmF5KGEpIGNvbnRhaW5zIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgIGludHMgPSAoSW50ZWdlcltdKXEudG9BcnJheShpbnRzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnRha2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvQXJyYXkobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5X0JhZEFyZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgT2JqZWN0IG9bXSA9IHEudG9BcnJheShudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvQXJyYXkgd2l0aCBpbmNvbXBhdGlibGUgYXJyYXkgdHlwZSB0aHJvd3MgQ0NFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXkxX0JhZEFyZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgT2JqZWN0IG9bXSA9IHEudG9BcnJheShuZXcgU3RyaW5nWzEwXSApOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChBcnJheVN0b3JlRXhjZXB0aW9uICBzdWNjZXNzKXt9CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogaXRlcmF0b3IgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSl7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGl0Lm5leHQoKSwgcS50YWtlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpdGVyYXRvci5yZW1vdmUgcmVtb3ZlcyBjdXJyZW50IGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JSZW1vdmUgKCkgeworICAgICAgICBmaW5hbCBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgzKTsKKyAgICAgICAgcS5hZGQodHdvKTsKKyAgICAgICAgcS5hZGQob25lKTsKKyAgICAgICAgcS5hZGQodGhyZWUpOworCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAKKyAgICAgICAgaXQgPSBxLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhpdC5uZXh0KCksIG9uZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpdC5uZXh0KCksIHRocmVlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXQuaGFzTmV4dCgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGl0ZXJhdG9yIG9yZGVyaW5nIGlzIEZJRk8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JPcmRlcmluZygpIHsKKyAgICAgICAgZmluYWwgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoMyk7CisgICAgICAgIHEuYWRkKG9uZSk7CisgICAgICAgIHEuYWRkKHR3byk7CisgICAgICAgIHEuYWRkKHRocmVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaW50IGkgPSAoKEludGVnZXIpKGl0Lm5leHQoKSkpLmludFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKytrLCBpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMywgayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpY2F0aW9ucyBkbyBub3QgY2F1c2UgaXRlcmF0b3JzIHRvIGZhaWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vha2x5Q29uc2lzdGVudEl0ZXJhdGlvbiAoKSB7CisgICAgICAgIGZpbmFsIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKDMpOworICAgICAgICBxLmFkZChvbmUpOworICAgICAgICBxLmFkZCh0d28pOworICAgICAgICBxLmFkZCh0aHJlZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBxLnNpemUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyBjb250YWlucyB0b1N0cmluZ3Mgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBTdHJpbmcgcyA9IHEudG9TdHJpbmcoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy5pbmRleE9mKFN0cmluZy52YWx1ZU9mKGkpKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0gICAgICAgIAorCisKKyAgICAvKioKKyAgICAgKiBvZmZlciB0cmFuc2ZlcnMgZWxlbWVudHMgYWNyb3NzIEV4ZWN1dG9yIHRhc2tzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE9mZmVySW5FeGVjdXRvcigpIHsKKyAgICAgICAgZmluYWwgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoMik7CisgICAgICAgIHEuYWRkKG9uZSk7CisgICAgICAgIHEuYWRkKHR3byk7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMik7CisgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKHEub2ZmZXIodGhyZWUpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHEub2ZmZXIodGhyZWUsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscygwLCBxLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBleGVjdXRvci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHMob25lLCBxLnRha2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgam9pblBvb2woZXhlY3V0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHBvbGwgcmV0cmlldmVzIGVsZW1lbnRzIGFjcm9zcyBFeGVjdXRvciB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGxJbkV4ZWN1dG9yKCkgeworICAgICAgICBmaW5hbCBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgyKTsKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0TnVsbChxLnBvbGwoKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShudWxsICE9IHEucG9sbChNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgcS5wdXQob25lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICBqb2luUG9vbChleGVjdXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBkZXNlcmlhbGl6ZWQgc2VyaWFsaXplZCBxdWV1ZSBoYXMgc2FtZSBlbGVtZW50cyBpbiBzYW1lIG9yZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChxKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSByID0gKExpbmtlZEJsb2NraW5nUXVldWUpaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHEuc2l6ZSgpLCByLnNpemUoKSk7CisgICAgICAgICAgICB3aGlsZSAoIXEuaXNFbXB0eSgpKSAKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5yZW1vdmUoKSwgci5yZW1vdmUoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5UbyhudWxsKSB0aHJvd3MgTlBFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvTnVsbCgpIHsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8obnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8odGhpcykgdGhyb3dzIElBRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub1NlbGYoKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5kcmFpblRvKHEpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5UbyhjKSBlbXB0aWVzIHF1ZXVlIGludG8gYW5vdGhlciBjb2xsZWN0aW9uIGMKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG8oKSB7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcS5kcmFpblRvKGwpOworICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMobC5zaXplKCksIFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5nZXQoaSksIG5ldyBJbnRlZ2VyKGkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvIGVtcHRpZXMgZnVsbCBxdWV1ZSwgdW5ibG9ja2luZyBhIHdhaXRpbmcgcHV0LgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub1dpdGhBY3RpdmVQdXQoKSB7CisgICAgICAgIGZpbmFsIExpbmtlZEJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBJbnRlZ2VyKFNJWkUrMSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7IAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5zaXplKCkgPj0gU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0KGkpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5zaXplKCkgKyBsLnNpemUoKSA+PSBTSVpFKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKG51bGwsIG4pIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9OdWxsTigpIHsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8obnVsbCwgMCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8odGhpcywgbikgdGhyb3dzIElBRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub1NlbGZOKCkgeworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhxLCAwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8oYywgbikgZW1wdGllcyBmaXJzdCBtYXgge24sIHNpemV9IGVsZW1lbnRzIG9mIHF1ZXVlIGludG8gYworICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub04oKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRSArIDI7ICsraSkgeworICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsLCBpKTsKKyAgICAgICAgICAgIGludCBrID0gKGkgPCBTSVpFKT8gaSA6IFNJWkU7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIFNJWkUtayk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5zaXplKCksIGspOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrOyArK2opIAorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmdldChqKSwgbmV3IEludGVnZXIoaikpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0xpbmtlZExpc3RUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0xpbmtlZExpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2EyMDIwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CisKK3B1YmxpYyBjbGFzcyBMaW5rZWRMaXN0VGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExpbmtlZExpc3RUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBxdWV1ZSBvZiBnaXZlbiBzaXplIGNvbnRhaW5pbmcgY29uc2VjdXRpdmUKKyAgICAgKiBJbnRlZ2VycyAwIC4uLiBuLgorICAgICAqLworICAgIHByaXZhdGUgTGlua2VkTGlzdCBwb3B1bGF0ZWRRdWV1ZShpbnQgbikgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihuZXcgSW50ZWdlcihpKSkpOworICAgICAgICBhc3NlcnRGYWxzZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBxLnNpemUoKSk7CisgICAgICAgIHJldHVybiBxOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBuZXcgcXVldWUgaXMgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IxKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IExpbmtlZExpc3QoKS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemluZyBmcm9tIG51bGwgQ29sbGVjdGlvbiB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZExpc3QgcSA9IG5ldyBMaW5rZWRMaXN0KChDb2xsZWN0aW9uKW51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBjb250YWlucyBhbGwgZWxlbWVudHMgb2YgY29sbGVjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUKKworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjYoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgTGlua2VkTGlzdCBxID0gbmV3IExpbmtlZExpc3QoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50c1tpXSwgcS5wb2xsKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpc0VtcHR5IGlzIHRydWUgYmVmb3JlIGFkZCwgZmFsc2UgYWZ0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisgICAgICAgIExpbmtlZExpc3QgcSA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICBxLmFkZChuZXcgSW50ZWdlcigxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgcS5hZGQobmV3IEludGVnZXIoMikpOworICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzaXplIGNoYW5nZXMgd2hlbiBlbGVtZW50cyBhZGRlZCBhbmQgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBxLnNpemUoKSk7CisgICAgICAgICAgICBxLmFkZChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvZmZlcihudWxsKSBzdWNjZWVkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlck51bGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaW5rZWRMaXN0IHEgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgcS5vZmZlcihudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gaWUpIHsgCisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPZmZlciBzdWNjZWVkcyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXIoKSB7CisgICAgICAgIExpbmtlZExpc3QgcSA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihuZXcgSW50ZWdlcigwKSkpOworICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIobmV3IEludGVnZXIoMSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgc3VjY2VlZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5hZGQobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZEFsbChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaW5rZWRMaXN0IHEgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgcS5hZGRBbGwobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXVlIGNvbnRhaW5zIGFsbCBlbGVtZW50cywgaW4gdHJhdmVyc2FsIG9yZGVyLCBvZiBzdWNjZXNzZnVsIGFkZEFsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGVtcHR5ID0gbmV3IEludGVnZXJbMF07CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgTGlua2VkTGlzdCBxID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoZW1wdHkpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnBvbGwoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZEFsbCB3aXRoIHRvbyBsYXJnZSBhbiBpbmRleCB0aHJvd3MgSU9PQkUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMl9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlua2VkTGlzdCBsID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBPYmplY3QoKSk7CisgICAgICAgICAgICBMaW5rZWRMaXN0IG0gPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgbS5hZGQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIGwuYWRkQWxsKDQsbSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkQWxsIHdpdGggbmVnYXRpdmUgaW5kZXggdGhyb3dzIElPT0JFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDRfQmFkSW5kZXgoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaW5rZWRMaXN0IGwgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgbC5hZGQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIExpbmtlZExpc3QgbSA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgICAgICBtLmFkZChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgbC5hZGRBbGwoLTEsbSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgcG9sbCBzdWNjZWVkcyB1bmxlc3MgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9sbCgpIHsKKyAgICAgICAgTGlua2VkTGlzdCBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucG9sbCgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKHEucG9sbCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgcGVlayByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgbnVsbCBpZiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5wZWVrKCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgcS5wb2xsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucGVlaygpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaSAhPSAoKEludGVnZXIpcS5wZWVrKCkpLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE51bGwocS5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVsZW1lbnQgcmV0dXJucyBuZXh0IGVsZW1lbnQsIG9yIHRocm93cyBOU0VFIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnQoKSB7CisgICAgICAgIExpbmtlZExpc3QgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLmVsZW1lbnQoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5lbGVtZW50KCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogIHJlbW92ZSByZW1vdmVzIG5leHQgZWxlbWVudCwgb3IgdGhyb3dzIE5TRUUgaWYgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5yZW1vdmUoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlKHgpIHJlbW92ZXMgeCBhbmQgcmV0dXJucyB0cnVlIGlmIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudCgpIHsKKyAgICAgICAgTGlua2VkTGlzdCBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgU0laRTsgaSs9MikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLnJlbW92ZShuZXcgSW50ZWdlcihpKSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSs9MikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLnJlbW92ZShuZXcgSW50ZWdlcihpKSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocS5yZW1vdmUobmV3IEludGVnZXIoaSsxKSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgIH0KKyAgICAgICAgCisgICAgLyoqCisgICAgICogY29udGFpbnMoeCkgcmVwb3J0cyB0cnVlIHdoZW4gZWxlbWVudHMgYWRkZWQgYnV0IG5vdCB5ZXQgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKyAgICAgICAgTGlua2VkTGlzdCBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnMobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgICAgIHEucG9sbCgpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocS5jb250YWlucyhuZXcgSW50ZWdlcihpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xlYXIgcmVtb3ZlcyBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CisgICAgICAgIExpbmtlZExpc3QgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBxLmNsZWFyKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5zaXplKCkpOworICAgICAgICBxLmFkZChuZXcgSW50ZWdlcigxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgcS5jbGVhcigpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb250YWluc0FsbChjKSBpcyB0cnVlIHdoZW4gYyBjb250YWlucyBhIHN1YnNldCBvZiBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbCgpIHsKKyAgICAgICAgTGlua2VkTGlzdCBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIExpbmtlZExpc3QgcCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnNBbGwocCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocC5jb250YWluc0FsbChxKSk7CisgICAgICAgICAgICBwLmFkZChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmNvbnRhaW5zQWxsKHEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXRhaW5BbGwoYykgcmV0YWlucyBvbmx5IHRob3NlIGVsZW1lbnRzIG9mIGMgYW5kIHJlcG9ydHMgdHJ1ZSBpZiBjaGFuZ2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKKyAgICAgICAgTGlua2VkTGlzdCBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIExpbmtlZExpc3QgcCA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gcS5yZXRhaW5BbGwocCk7CisgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGNoYW5nZWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY2hhbmdlZCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWluc0FsbChwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRS1pLCBxLnNpemUoKSk7CisgICAgICAgICAgICBwLnJlbW92ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlQWxsKGMpIHJlbW92ZXMgb25seSB0aG9zZSBlbGVtZW50cyBvZiBjIGFuZCByZXBvcnRzIHRydWUgaWYgY2hhbmdlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBMaW5rZWRMaXN0IHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIExpbmtlZExpc3QgcCA9IHBvcHVsYXRlZFF1ZXVlKGkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLnJlbW92ZUFsbChwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRS1pLCBxLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgICAgICAgICAgIEludGVnZXIgSSA9IChJbnRlZ2VyKShwLnJlbW92ZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zKEkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICB0b0FycmF5IGNvbnRhaW5zIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5KCkgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgT2JqZWN0W10gbyA9IHEudG9BcnJheSgpOworICAgICAgICBBcnJheXMuc29ydChvKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob1tpXSwgcS5wb2xsKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICB0b0FycmF5KGEpIGNvbnRhaW5zIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKKyAgICAgICAgTGlua2VkTGlzdCBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgIGludHMgPSAoSW50ZWdlcltdKXEudG9BcnJheShpbnRzKTsKKyAgICAgICAgQXJyYXlzLnNvcnQoaW50cyk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEucG9sbCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b0FycmF5KG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheV9CYWRBcmcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaW5rZWRMaXN0IGwgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgbC5hZGQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIE9iamVjdCBvW10gPSBsLnRvQXJyYXkobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b0FycmF5IHdpdGggaW5jb21wYXRhYmxlIGFyYXkgdHlwZSB0aHJvd3MgQ0NFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXkxX0JhZEFyZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmtlZExpc3QgbCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgSW50ZWdlcig1KSk7CisgICAgICAgICAgICBPYmplY3Qgb1tdID0gbC50b0FycmF5KG5ldyBTdHJpbmdbMTBdICk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKEFycmF5U3RvcmVFeGNlcHRpb24gIHN1Y2Nlc3Mpe30KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogIGl0ZXJhdG9yIGl0ZXJhdGVzIHRocm91Z2ggYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnMoaXQubmV4dCgpKSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIFNJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBpdGVyYXRvciBvcmRlcmluZyBpcyBGSUZPCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT3JkZXJpbmcoKSB7CisgICAgICAgIGZpbmFsIExpbmtlZExpc3QgcSA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHEuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKKyAgICAgICAgcS5hZGQobmV3IEludGVnZXIoMikpOworICAgICAgICBxLmFkZChuZXcgSW50ZWdlcigzKSk7CisgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaW50IGkgPSAoKEludGVnZXIpKGl0Lm5leHQoKSkpLmludFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKytrLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygzLCBrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpdGVyYXRvci5yZW1vdmUgcmVtb3ZlcyBjdXJyZW50IGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JSZW1vdmUgKCkgeworICAgICAgICBmaW5hbCBMaW5rZWRMaXN0IHEgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBxLmFkZChuZXcgSW50ZWdlcigxKSk7CisgICAgICAgIHEuYWRkKG5ldyBJbnRlZ2VyKDIpKTsKKyAgICAgICAgcS5hZGQobmV3IEludGVnZXIoMykpOworICAgICAgICBJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsKKyAgICAgICAgaXQubmV4dCgpOworICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgaXQgPSBxLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhpdC5uZXh0KCksIG5ldyBJbnRlZ2VyKDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0Lm5leHQoKSwgbmV3IEludGVnZXIoMykpOworICAgICAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgY29udGFpbnMgdG9TdHJpbmdzIG9mIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBMaW5rZWRMaXN0IHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgU3RyaW5nIHMgPSBxLnRvU3RyaW5nKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMuaW5kZXhPZihTdHJpbmcudmFsdWVPZihpKSkgPj0gMCk7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAKKworICAgIC8qKgorICAgICAqIHBlZWsgcmV0dXJucyBlbGVtZW50IGluc2VydGVkIHdpdGggYWRkRmlyc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRmlyc3QoKSB7CisgICAgICAgIExpbmtlZExpc3QgcSA9IHBvcHVsYXRlZFF1ZXVlKDMpOworICAgICAgICBxLmFkZEZpcnN0KGZvdXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91cixxLnBlZWsoKSk7CisgICAgfSAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvTG9ja1N1cHBvcnRUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0xvY2tTdXBwb3J0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkNzRhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L0xvY2tTdXBwb3J0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy4qOworCitwdWJsaWMgY2xhc3MgTG9ja1N1cHBvcnRUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2V7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9ja1N1cHBvcnRUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYXJrIGlzIHJlbGVhc2VkIGJ5IHVucGFyayBvY2N1cnJpbmcgYWZ0ZXIgcGFyaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJrKCkgeyAKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC5wYXJrKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgTG9ja1N1cHBvcnQudW5wYXJrKHQpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHBhcmsgaXMgcmVsZWFzZWQgYnkgdW5wYXJrIG9jY3VycmluZyBiZWZvcmUgcGFyaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJrMigpIHsgCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2tTdXBwb3J0LnBhcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIExvY2tTdXBwb3J0LnVucGFyayh0KTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYXJrIGlzIHJlbGVhc2VkIGJ5IGludGVycnVwdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyazMoKSB7IAorICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2tTdXBwb3J0LnBhcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUoVGhyZWFkLmludGVycnVwdGVkKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFyayByZXR1cm5zIGlmIGludGVycnVwdGVkIGJlZm9yZSBwYXJrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBhcms0KCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC5wYXJrKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYXJrTmFub3MgdGltZXMgb3V0IGlmIG5vdCB1bnBhcmtlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJrTmFub3MoKSB7IAorICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2tTdXBwb3J0LnBhcmtOYW5vcygxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHBhcmtVbnRpbCB0aW1lcyBvdXQgaWYgbm90IHVucGFya2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmtVbnRpbCgpIHsgCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAxMDA7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC5wYXJrVW50aWwoZCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Qcmlvcml0eUJsb2NraW5nUXVldWVUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1ByaW9yaXR5QmxvY2tpbmdRdWV1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjU4OTYzCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Qcmlvcml0eUJsb2NraW5nUXVldWVUZXN0LmphdmEKQEAgLTAsMCArMSw5NDMgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIFByaW9yaXR5QmxvY2tpbmdRdWV1ZVRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJpb3JpdHlCbG9ja2luZ1F1ZXVlVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PQ0FQID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgICAvKiogU2FtcGxlIENvbXBhcmF0b3IgKi8KKyAgICBzdGF0aWMgY2xhc3MgTXlSZXZlcnNlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeyAKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCB4LCBPYmplY3QgeSkgeworICAgICAgICAgICAgaW50IGkgPSAoKEludGVnZXIpeCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGludCBqID0gKChJbnRlZ2VyKXkpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoaSA8IGopIHJldHVybiAxOworICAgICAgICAgICAgaWYgKGkgPiBqKSByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHF1ZXVlIG9mIGdpdmVuIHNpemUgY29udGFpbmluZyBjb25zZWN1dGl2ZQorICAgICAqIEludGVnZXJzIDAgLi4uIG4uCisgICAgICovCisgICAgcHJpdmF0ZSBQcmlvcml0eUJsb2NraW5nUXVldWUgcG9wdWxhdGVkUXVldWUoaW50IG4pIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlKG4pOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgZm9yKGludCBpID0gbi0xOyBpID49IDA7IGktPTIpCisgICAgICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgZm9yKGludCBpID0gKG4gJiAxKTsgaSA8IG47IGkrPTIpCisgICAgICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTk9DQVAsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBxLnNpemUoKSk7CisgICAgICAgIHJldHVybiBxOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBBIG5ldyBxdWV1ZSBoYXMgdW5ib3VuZGVkIGNhcGFjaXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5PQ0FQLCBuZXcgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlKFNJWkUpLnJlbWFpbmluZ0NhcGFjaXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBJQUUgaWYgIGNhcGFjaXR5IGFyZ3VtZW50IG5vbnBvc2l0aXZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemluZyBmcm9tIG51bGwgQ29sbGVjdGlvbiB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZShudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gQ29sbGVjdGlvbiBvZiBudWxsIGVsZW1lbnRzIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZShBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6aW5nIGZyb20gQ29sbGVjdGlvbiB3aXRoIHNvbWUgbnVsbCBlbGVtZW50cyB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkUtMTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZShBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVldWUgY29udGFpbnMgYWxsIGVsZW1lbnRzIG9mIGNvbGxlY3Rpb24gdXNlZCB0byBpbml0aWFsaXplCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50c1tpXSwgcS5wb2xsKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcGFyYXRvciB1c2VkIGluIGNvbnN0cnVjdG9yIGlzIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I3KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTXlSZXZlcnNlQ29tcGFyYXRvciBjbXAgPSBuZXcgTXlSZXZlcnNlQ29tcGFyYXRvcigpOworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlKFNJWkUsIGNtcCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY21wLCBxLmNvbXBhcmF0b3IoKSk7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgcS5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gU0laRS0xOyBpID49IDA7IC0taSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50c1tpXSwgcS5wb2xsKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpc0VtcHR5IGlzIHRydWUgYmVmb3JlIGFkZCwgZmFsc2UgYWZ0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOT0NBUCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgcS5hZGQob25lKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBxLmFkZCh0d28pOworICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1haW5pbmdDYXBhY2l0eSBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiBlbGVtZW50cyBhZGRlZCBvciByZW1vdmVkLAorICAgICAqIGJ1dCBzaXplIGRvZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluaW5nQ2FwYWNpdHkoKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTk9DQVAsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRS1pLCBxLnNpemUoKSk7CisgICAgICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTk9DQVAsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgcS5zaXplKCkpOworICAgICAgICAgICAgcS5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogb2ZmZXIobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlck51bGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoMSk7CisgICAgICAgICAgICBxLm9mZmVyKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeyB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgxKTsKKyAgICAgICAgICAgIHEuYWRkKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeyB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogT2ZmZXIgb2YgY29tcGFyYWJsZSBlbGVtZW50IHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE9mZmVyKCkgeworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoMSk7CisgICAgICAgIGFzc2VydFRydWUocS5vZmZlcih6ZXJvKSk7CisgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihvbmUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPZmZlciBvZiBub24tQ29tcGFyYWJsZSB0aHJvd3MgQ0NFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE9mZmVyTm9uQ29tcGFyYWJsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgxKTsKKyAgICAgICAgICAgIHEub2ZmZXIobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIHEub2ZmZXIobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIHEub2ZmZXIobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIG9mIGNvbXBhcmFibGUgc3VjY2VlZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgeworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgcS5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmFkZChuZXcgSW50ZWdlcihpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkQWxsKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgxKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwodGhpcykgdGhyb3dzIElBRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGxTZWxmKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKHEpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkQWxsIG9mIGEgY29sbGVjdGlvbiB3aXRoIG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisgICAgLyoqCisgICAgICogYWRkQWxsIG9mIGEgY29sbGVjdGlvbiB3aXRoIGFueSBudWxsIGVsZW1lbnRzIHRocm93cyBOUEUgYWZ0ZXIKKyAgICAgKiBwb3NzaWJseSBhZGRpbmcgc29tZSBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRS0xOyArK2kpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgcS5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXVlIGNvbnRhaW5zIGFsbCBlbGVtZW50cyBvZiBzdWNjZXNzZnVsIGFkZEFsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW50ZWdlcltdIGVtcHR5ID0gbmV3IEludGVnZXJbMF07CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IFNJWkUtMTsgaSA+PSAwOyAtLWkpCisgICAgICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBuZXcgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlKFNJWkUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocS5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbXB0eSkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRzKSkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEucG9sbCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogcHV0KG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgdGVzdFB1dE51bGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoU0laRSk7CisgICAgICAgICAgICBxLnB1dChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gCisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfSAgIAorICAgICB9CisKKyAgICAvKioKKyAgICAgKiBhbGwgZWxlbWVudHMgc3VjY2Vzc2Z1bGx5IHB1dCBhcmUgY29udGFpbmVkCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgICBJbnRlZ2VyIEkgPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgICAgICAgcS5wdXQoSSk7CisgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWlucyhJKSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLCBxLnNpemUoKSk7CisgICAgICAgICB9CisgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dCBkb2Vzbid0IGJsb2NrIHdhaXRpbmcgZm9yIHRha2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0V2l0aFRha2UoKSB7CisgICAgICAgIGZpbmFsIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBhZGRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgSW50ZWdlcigwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2FkZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IEludGVnZXIoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBJbnRlZ2VyKDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgSW50ZWdlcigwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2FkZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShhZGRlZCA9PSA0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHEudGFrZSgpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBvZmZlciBkb2VzIG5vdCB0aW1lIG91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZE9mZmVyKCkgeworICAgICAgICBmaW5hbCBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoMik7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IEludGVnZXIoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IEludGVnZXIoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShxLm9mZmVyKG5ldyBJbnRlZ2VyKDApLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHEub2ZmZXIobmV3IEludGVnZXIoMCksIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGFrZSByZXRyaWV2ZXMgZWxlbWVudHMgaW4gcHJpb3JpdHkgb3JkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFrZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS50YWtlKCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHRha2UgYmxvY2tzIGludGVycnVwdGlibHkgd2hlbiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUYWtlRnJvbUVtcHR5KCkgeworICAgICAgICBmaW5hbCBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoMik7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcS50YWtlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgcmVtb3ZlcyBleGlzdGluZyBlbGVtZW50cyB1bnRpbCBlbXB0eSwgdGhlbiBibG9ja3MgaW50ZXJydXB0aWJseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1Rha2UoKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnRha2UoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBxLnRha2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHRyeSB7IAorICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOyAKKyAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHBvbGwgc3VjY2VlZHMgdW5sZXNzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGwoKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucG9sbCgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKHEucG9sbCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBwb29sIHdpdGggemVybyB0aW1lb3V0IHN1Y2NlZWRzIHdoZW4gbm9uLWVtcHR5LCBlbHNlIHRpbWVzIG91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZFBvbGwwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBvbGwoMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnROdWxsKHEucG9sbCgwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBwb29sIHdpdGggbm9uemVybyB0aW1lb3V0IHN1Y2NlZWRzIHdoZW4gbm9uLWVtcHR5LCBlbHNlIHRpbWVzIG91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZFBvbGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnROdWxsKHEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJydXB0ZWQgdGltZWQgcG9sbCB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaW5zdGVhZCBvZgorICAgICAqIHJldHVybmluZyB0aW1lb3V0IHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRlZFRpbWVkUG9sbCgpIHsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnROdWxsKHEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgfX0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHRyeSB7IAorICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOyAKKyAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgdGltZWQgcG9sbCBiZWZvcmUgYSBkZWxheWVkIG9mZmVyIGZhaWxzOyBhZnRlciBvZmZlciBzdWNjZWVkczsKKyAgICAgKiAgb24gaW50ZXJydXB0aW9uIHRocm93cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZFBvbGxXaXRoT2ZmZXIoKSB7CisgICAgICAgIGZpbmFsIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgyKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnROdWxsKHEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnBvbGwoTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucG9sbChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2VzcykgeyB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5vZmZlcihuZXcgSW50ZWdlcigwKSwgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9ICAKKworCisgICAgLyoqCisgICAgICogcGVlayByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgbnVsbCBpZiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgeworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBlZWsoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5wZWVrKCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICBpICE9ICgoSW50ZWdlcilxLnBlZWsoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChxLnBlZWsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZWxlbWVudCByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgdGhyb3dzIE5TRUUgaWYgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudCgpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCAoKEludGVnZXIpcS5lbGVtZW50KCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgcS5wb2xsKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZWxlbWVudCgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSByZW1vdmVzIG5leHQgZWxlbWVudCwgb3IgdGhyb3dzIE5TRUUgaWYgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnJlbW92ZSgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUoeCkgcmVtb3ZlcyB4IGFuZCByZXR1cm5zIHRydWUgaWYgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50KCkgeworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IFNJWkU7IGkrPTIpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5yZW1vdmUobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrPTIpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5yZW1vdmUobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkrMSkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICB9CisgICAgICAgIAorICAgIC8qKgorICAgICAqIGNvbnRhaW5zKHgpIHJlcG9ydHMgdHJ1ZSB3aGVuIGVsZW1lbnRzIGFkZGVkIGJ1dCBub3QgeWV0IHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnMobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgICAgIHEucG9sbCgpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocS5jb250YWlucyhuZXcgSW50ZWdlcihpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xlYXIgcmVtb3ZlcyBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBxLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOT0NBUCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgcS5hZGQobmV3IEludGVnZXIoMSkpOworICAgICAgICBhc3NlcnRGYWxzZShxLmlzRW1wdHkoKSk7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udGFpbnNBbGwoYykgaXMgdHJ1ZSB3aGVuIGMgY29udGFpbnMgYSBzdWJzZXQgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBwID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWluc0FsbChwKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShwLmNvbnRhaW5zQWxsKHEpKTsKKyAgICAgICAgICAgIHAuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHAuY29udGFpbnNBbGwocSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldGFpbkFsbChjKSByZXRhaW5zIG9ubHkgdGhvc2UgZWxlbWVudHMgb2YgYyBhbmQgcmVwb3J0cyB0cnVlIGlmIGNoYW5nZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgeworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcCA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gcS5yZXRhaW5BbGwocCk7CisgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGNoYW5nZWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY2hhbmdlZCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWluc0FsbChwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0laRS1pLCBxLnNpemUoKSk7CisgICAgICAgICAgICBwLnJlbW92ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlQWxsKGMpIHJlbW92ZXMgb25seSB0aG9zZSBlbGVtZW50cyBvZiBjIGFuZCByZXBvcnRzIHRydWUgaWYgY2hhbmdlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHAgPSBwb3B1bGF0ZWRRdWV1ZShpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5yZW1vdmVBbGwocCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUtaSwgcS5zaXplKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIEkgPSAoSW50ZWdlcikocC5yZW1vdmUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UocS5jb250YWlucyhJKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgdG9BcnJheSBjb250YWlucyBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgT2JqZWN0W10gbyA9IHEudG9BcnJheSgpOworICAgICAgICBBcnJheXMuc29ydChvKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob1tpXSwgcS50YWtlKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b0FycmF5KGEpIGNvbnRhaW5zIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgaW50cyA9IChJbnRlZ2VyW10pcS50b0FycmF5KGludHMpOworICAgICAgICBBcnJheXMuc29ydChpbnRzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnRha2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHRvQXJyYXkobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5X0JhZEFyZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBPYmplY3Qgb1tdID0gcS50b0FycmF5KG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9BcnJheSB3aXRoIGluY29tcGF0aWJsZSBhcnJheSB0eXBlIHRocm93cyBDQ0UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTFfQmFkQXJnKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgICAgIE9iamVjdCBvW10gPSBxLnRvQXJyYXkobmV3IFN0cmluZ1sxMF0gKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goQXJyYXlTdG9yZUV4Y2VwdGlvbiAgc3VjY2Vzcyl7fQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBpdGVyYXRvciBpdGVyYXRlcyB0aHJvdWdoIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnMoaXQubmV4dCgpKSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIFNJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGl0ZXJhdG9yLnJlbW92ZSByZW1vdmVzIGN1cnJlbnQgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvclJlbW92ZSAoKSB7CisgICAgICAgIGZpbmFsIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZSgzKTsKKyAgICAgICAgcS5hZGQobmV3IEludGVnZXIoMikpOworICAgICAgICBxLmFkZChuZXcgSW50ZWdlcigxKSk7CisgICAgICAgIHEuYWRkKG5ldyBJbnRlZ2VyKDMpKTsKKworICAgICAgICBJdGVyYXRvciBpdCA9IHEuaXRlcmF0b3IoKTsKKyAgICAgICAgaXQubmV4dCgpOworICAgICAgICBpdC5yZW1vdmUoKTsKKworICAgICAgICBpdCA9IHEuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0Lm5leHQoKSwgbmV3IEludGVnZXIoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoaXQubmV4dCgpLCBuZXcgSW50ZWdlcigzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0Lmhhc05leHQoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyBjb250YWlucyB0b1N0cmluZ3Mgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIFN0cmluZyBzID0gcS50b1N0cmluZygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzLmluZGV4T2YoU3RyaW5nLnZhbHVlT2YoaSkpID49IDApOworICAgICAgICB9CisgICAgfSAgICAgICAgCisKKyAgICAvKioKKyAgICAgKiBvZmZlciB0cmFuc2ZlcnMgZWxlbWVudHMgYWNyb3NzIEV4ZWN1dG9yIHRhc2tzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGxJbkV4ZWN1dG9yKCkgeworICAgICAgICBmaW5hbCBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IG5ldyBQcmlvcml0eUJsb2NraW5nUXVldWUoMik7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMik7CisgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydE51bGwocS5wb2xsKCkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUobnVsbCAhPSBxLnBvbGwoTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBJbnRlZ2VyKDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICBqb2luUG9vbChleGVjdXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBkZXNlcmlhbGl6ZWQgc2VyaWFsaXplZCBxdWV1ZSBoYXMgc2FtZSBlbGVtZW50cyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm91dCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHEpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmluKSk7CisgICAgICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgciA9IChQcmlvcml0eUJsb2NraW5nUXVldWUpaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHEuc2l6ZSgpLCByLnNpemUoKSk7CisgICAgICAgICAgICB3aGlsZSAoIXEuaXNFbXB0eSgpKSAKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5yZW1vdmUoKSwgci5yZW1vdmUoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5UbyhudWxsKSB0aHJvd3MgTlBFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvTnVsbCgpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5Ubyh0aGlzKSB0aHJvd3MgSUFFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvU2VsZigpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhxKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8oYykgZW1wdGllcyBxdWV1ZSBpbnRvIGFub3RoZXIgY29sbGVjdGlvbiBjCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvKCkgeworICAgICAgICBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcS5kcmFpblRvKGwpOworICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMobC5zaXplKCksIFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5nZXQoaSksIG5ldyBJbnRlZ2VyKGkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvIGVtcHRpZXMgcXVldWUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9XaXRoQWN0aXZlUHV0KCkgeworICAgICAgICBmaW5hbCBQcmlvcml0eUJsb2NraW5nUXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IEludGVnZXIoU0laRSsxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5zaXplKCkgPj0gU0laRSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0KGkpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5zaXplKCkgKyBsLnNpemUoKSA+PSBTSVpFKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKG51bGwsIG4pIHRocm93cyBOUEUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9OdWxsTigpIHsKKyAgICAgICAgUHJpb3JpdHlCbG9ja2luZ1F1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhudWxsLCAwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5Ubyh0aGlzLCBuKSB0aHJvd3MgSUFFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvU2VsZk4oKSB7CisgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8ocSwgMCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvKGMsIG4pIGVtcHRpZXMgZmlyc3QgbWF4IHtuLCBzaXplfSBlbGVtZW50cyBvZiBxdWV1ZSBpbnRvIGMKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9OKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkUgKyAyOyArK2kpIHsKKyAgICAgICAgICAgIFByaW9yaXR5QmxvY2tpbmdRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsLCBpKTsKKyAgICAgICAgICAgIGludCBrID0gKGkgPCBTSVpFKT8gaSA6IFNJWkU7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5zaXplKCksIFNJWkUtayk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5zaXplKCksIGspOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrOyArK2opIAorICAgICAgICAgICAgICAgIGFzc2VydFRydWUobC5jb250YWlucyhuZXcgSW50ZWdlcihqKSkpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvUHJpb3JpdHlRdWV1ZVRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvUHJpb3JpdHlRdWV1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDllMWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9Qcmlvcml0eVF1ZXVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisKK3B1YmxpYyBjbGFzcyBQcmlvcml0eVF1ZXVlVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQcmlvcml0eVF1ZXVlVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIE15UmV2ZXJzZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsgCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgeCwgT2JqZWN0IHkpIHsKKyAgICAgICAgICAgIGludCBpID0gKChJbnRlZ2VyKXgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgaiA9ICgoSW50ZWdlcil5KS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGkgPCBqKSByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmIChpID4gaikgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBxdWV1ZSBvZiBnaXZlbiBzaXplIGNvbnRhaW5pbmcgY29uc2VjdXRpdmUKKyAgICAgKiBJbnRlZ2VycyAwIC4uLiBuLgorICAgICAqLworICAgIHByaXZhdGUgUHJpb3JpdHlRdWV1ZSBwb3B1bGF0ZWRRdWV1ZShpbnQgbikgeworICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZShuKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIGZvcihpbnQgaSA9IG4tMTsgaSA+PSAwOyBpLT0yKQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIGZvcihpbnQgaSA9IChuICYgMSk7IGkgPCBuOyBpKz0yKQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG4sIHEuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIEEgbmV3IHF1ZXVlIGhhcyB1bmJvdW5kZWQgY2FwYWNpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IxKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IFByaW9yaXR5UXVldWUoU0laRSkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgSUFFIGlmICBjYXBhY2l0eSBhcmd1bWVudCBub25wb3NpdGl2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgwKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemluZyBmcm9tIG51bGwgQ29sbGVjdGlvbiB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IG5ldyBQcmlvcml0eVF1ZXVlKChDb2xsZWN0aW9uKW51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXppbmcgZnJvbSBDb2xsZWN0aW9uIG9mIG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gbmV3IFByaW9yaXR5UXVldWUoQXJyYXlzLmFzTGlzdChpbnRzKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemluZyBmcm9tIENvbGxlY3Rpb24gd2l0aCBzb21lIG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFLTE7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZShBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVldWUgY29udGFpbnMgYWxsIGVsZW1lbnRzIG9mIGNvbGxlY3Rpb24gdXNlZCB0byBpbml0aWFsaXplCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZShBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnRzW2ldLCBxLnBvbGwoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb21wYXJhdG9yIHVzZWQgaW4gY29uc3RydWN0b3IgaXMgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNeVJldmVyc2VDb21wYXJhdG9yIGNtcCA9IG5ldyBNeVJldmVyc2VDb21wYXJhdG9yKCk7CisgICAgICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZShTSVpFLCBjbXApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNtcCwgcS5jb21wYXJhdG9yKCkpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKQorICAgICAgICAgICAgICAgIGludHNbaV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IFNJWkUtMTsgaSA+PSAwOyAtLWkpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEucG9sbCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogaXNFbXB0eSBpcyB0cnVlIGJlZm9yZSBhZGQsIGZhbHNlIGFmdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgeworICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgIHEuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5pc0VtcHR5KCkpOworICAgICAgICBxLmFkZChuZXcgSW50ZWdlcigyKSk7CisgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgIHEucmVtb3ZlKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNpemUgY2hhbmdlcyB3aGVuIGVsZW1lbnRzIGFkZGVkIGFuZCByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUtaSwgcS5zaXplKCkpOworICAgICAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHEuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIG9mZmVyKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXJOdWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gbmV3IFByaW9yaXR5UXVldWUoMSk7CisgICAgICAgICAgICBxLm9mZmVyKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeyB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IG5ldyBQcmlvcml0eVF1ZXVlKDEpOworICAgICAgICAgICAgcS5hZGQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPZmZlciBvZiBjb21wYXJhYmxlIGVsZW1lbnQgc3VjY2VlZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXIoKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IG5ldyBQcmlvcml0eVF1ZXVlKDEpOworICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIoemVybykpOworICAgICAgICBhc3NlcnRUcnVlKHEub2ZmZXIob25lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2ZmZXIgb2Ygbm9uLUNvbXBhcmFibGUgdGhyb3dzIENDRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlck5vbkNvbXBhcmFibGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgxKTsKKyAgICAgICAgICAgIHEub2ZmZXIobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIHEub2ZmZXIobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIHEub2ZmZXIobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIG9mIGNvbXBhcmFibGUgc3VjY2VlZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgeworICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBuZXcgUHJpb3JpdHlRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBxLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuYWRkKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gbmV3IFByaW9yaXR5UXVldWUoMSk7CisgICAgICAgICAgICBxLmFkZEFsbChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIGFkZEFsbCBvZiBhIGNvbGxlY3Rpb24gd2l0aCBudWxsIGVsZW1lbnRzIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IG5ldyBQcmlvcml0eVF1ZXVlKFNJWkUpOworICAgICAgICAgICAgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltTSVpFXTsKKyAgICAgICAgICAgIHEuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW50cykpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisgICAgLyoqCisgICAgICogYWRkQWxsIG9mIGEgY29sbGVjdGlvbiB3aXRoIGFueSBudWxsIGVsZW1lbnRzIHRocm93cyBOUEUgYWZ0ZXIKKyAgICAgKiBwb3NzaWJseSBhZGRpbmcgc29tZSBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gbmV3IFByaW9yaXR5UXVldWUoU0laRSk7CisgICAgICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFLTE7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVldWUgY29udGFpbnMgYWxsIGVsZW1lbnRzIG9mIHN1Y2Nlc3NmdWwgYWRkQWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbDUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyW10gZW1wdHkgPSBuZXcgSW50ZWdlclswXTsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoU0laRS0xLWkpOworICAgICAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gbmV3IFByaW9yaXR5UXVldWUoU0laRSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmFkZEFsbChBcnJheXMuYXNMaXN0KGVtcHR5KSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSksIHEucG9sbCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogcG9sbCBzdWNjZWVkcyB1bmxlc3MgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9sbCgpIHsKKyAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucG9sbCgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKHEucG9sbCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwZWVrIHJldHVybnMgbmV4dCBlbGVtZW50LCBvciBudWxsIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBlZWsoKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksICgoSW50ZWdlcilxLnBlZWsoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5wZWVrKCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICBpICE9ICgoSW50ZWdlcilxLnBlZWsoKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChxLnBlZWsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZWxlbWVudCByZXR1cm5zIG5leHQgZWxlbWVudCwgb3IgdGhyb3dzIE5TRUUgaWYgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudCgpIHsKKyAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEuZWxlbWVudCgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHEucG9sbCgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmVsZW1lbnQoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgcmVtb3ZlcyBuZXh0IGVsZW1lbnQsIG9yIHRocm93cyBOU0VFIGlmIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKKyAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKChJbnRlZ2VyKXEucmVtb3ZlKCkpLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSh4KSByZW1vdmVzIHggYW5kIHJldHVybnMgdHJ1ZSBpZiBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnQoKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IFNJWkU7IGkrPTIpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5yZW1vdmUobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrPTIpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5yZW1vdmUobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEucmVtb3ZlKG5ldyBJbnRlZ2VyKGkrMSkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICB9CisgICAgICAgIAorICAgIC8qKgorICAgICAqIGNvbnRhaW5zKHgpIHJlcG9ydHMgdHJ1ZSB3aGVuIGVsZW1lbnRzIGFkZGVkIGJ1dCBub3QgeWV0IHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGkpKSk7CisgICAgICAgICAgICBxLnBvbGwoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnMobmV3IEludGVnZXIoaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsZWFyIHJlbW92ZXMgYWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgcS5jbGVhcigpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHEuc2l6ZSgpKTsKKyAgICAgICAgcS5hZGQobmV3IEludGVnZXIoMSkpOworICAgICAgICBhc3NlcnRGYWxzZShxLmlzRW1wdHkoKSk7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udGFpbnNBbGwoYykgaXMgdHJ1ZSB3aGVuIGMgY29udGFpbnMgYSBzdWJzZXQgb2YgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBQcmlvcml0eVF1ZXVlIHAgPSBuZXcgUHJpb3JpdHlRdWV1ZShTSVpFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWluc0FsbChwKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShwLmNvbnRhaW5zQWxsKHEpKTsKKyAgICAgICAgICAgIHAuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHAuY29udGFpbnNBbGwocSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldGFpbkFsbChjKSByZXRhaW5zIG9ubHkgdGhvc2UgZWxlbWVudHMgb2YgYyBhbmQgcmVwb3J0cyB0cnVlIGlmIGNoYW5nZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgeworICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgUHJpb3JpdHlRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBxLnJldGFpbkFsbChwKTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2hhbmdlZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjaGFuZ2VkKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIHAucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmVBbGwoYykgcmVtb3ZlcyBvbmx5IHRob3NlIGVsZW1lbnRzIG9mIGMgYW5kIHJlcG9ydHMgdHJ1ZSBpZiBjaGFuZ2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICAgICAgUHJpb3JpdHlRdWV1ZSBwID0gcG9wdWxhdGVkUXVldWUoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEucmVtb3ZlQWxsKHApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFLWksIHEuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBJID0gKEludGVnZXIpKHAucmVtb3ZlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnMoSSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9BcnJheSBjb250YWlucyBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKKyAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIE9iamVjdFtdIG8gPSBxLnRvQXJyYXkoKTsKKyAgICAgICAgQXJyYXlzLnNvcnQobyk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBvLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9baV0sIHEucG9sbCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b0FycmF5KGEpIGNvbnRhaW5zIGFsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKKyAgICAgICAgUHJpb3JpdHlRdWV1ZSBxID0gcG9wdWxhdGVkUXVldWUoU0laRSk7CisgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbU0laRV07CisgICAgICAgIGludHMgPSAoSW50ZWdlcltdKXEudG9BcnJheShpbnRzKTsKKyAgICAgICAgQXJyYXlzLnNvcnQoaW50cyk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludHNbaV0sIHEucG9sbCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogaXRlcmF0b3IgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWlucyhpdC5uZXh0KCkpKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoaSwgU0laRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaXRlcmF0b3IucmVtb3ZlIHJlbW92ZXMgY3VycmVudCBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yUmVtb3ZlICgpIHsKKyAgICAgICAgZmluYWwgUHJpb3JpdHlRdWV1ZSBxID0gbmV3IFByaW9yaXR5UXVldWUoMyk7CisgICAgICAgIHEuYWRkKG5ldyBJbnRlZ2VyKDIpKTsKKyAgICAgICAgcS5hZGQobmV3IEludGVnZXIoMSkpOworICAgICAgICBxLmFkZChuZXcgSW50ZWdlcigzKSk7CisKKyAgICAgICAgSXRlcmF0b3IgaXQgPSBxLml0ZXJhdG9yKCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICAgICAgaXQucmVtb3ZlKCk7CisKKyAgICAgICAgaXQgPSBxLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhpdC5uZXh0KCksIG5ldyBJbnRlZ2VyKDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0Lm5leHQoKSwgbmV3IEludGVnZXIoMykpOworICAgICAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgY29udGFpbnMgdG9TdHJpbmdzIG9mIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBQcmlvcml0eVF1ZXVlIHEgPSBwb3B1bGF0ZWRRdWV1ZShTSVpFKTsKKyAgICAgICAgU3RyaW5nIHMgPSBxLnRvU3RyaW5nKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMuaW5kZXhPZihTdHJpbmcudmFsdWVPZihpKSkgPj0gMCk7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAKKworICAgIC8qKgorICAgICAqIEEgZGVzZXJpYWxpemVkIHNlcmlhbGl6ZWQgcXVldWUgaGFzIHNhbWUgZWxlbWVudHMgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB7CisgICAgICAgIFByaW9yaXR5UXVldWUgcSA9IHBvcHVsYXRlZFF1ZXVlKFNJWkUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDAwKTsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShib3V0KSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QocSk7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShiaW4pKTsKKyAgICAgICAgICAgIFByaW9yaXR5UXVldWUgciA9IChQcmlvcml0eVF1ZXVlKWluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhxLnNpemUoKSwgci5zaXplKCkpOworICAgICAgICAgICAgd2hpbGUgKCFxLmlzRW1wdHkoKSkgCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHEucmVtb3ZlKCksIHIucmVtb3ZlKCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvUmVlbnRyYW50TG9ja1Rlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvUmVlbnRyYW50TG9ja1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZGM5ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9SZWVudHJhbnRMb2NrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4MCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisKK3B1YmxpYyBjbGFzcyBSZWVudHJhbnRMb2NrVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWVudHJhbnRMb2NrVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBydW5uYWJsZSBjYWxsaW5nIGxvY2tJbnRlcnJ1cHRpYmx5CisgICAgICovCisgICAgY2xhc3MgSW50ZXJydXB0aWJsZUxvY2tSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrOworICAgICAgICBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKFJlZW50cmFudExvY2sgbCkgeyBsb2NrID0gbDsgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvY2subG9ja0ludGVycnVwdGlibHkoKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHJ1bm5hYmxlIGNhbGxpbmcgbG9ja0ludGVycnVwdGlibHkgdGhhdCBleHBlY3RzIHRvIGJlCisgICAgICogaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBjbGFzcyBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrOworICAgICAgICBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZShSZWVudHJhbnRMb2NrIGwpIHsgbG9jayA9IGw7IH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2tJbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3MgdG8gZXhwb3NlIHByb3RlY3RlZCBtZXRob2RzCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFB1YmxpY1JlZW50cmFudExvY2sgZXh0ZW5kcyBSZWVudHJhbnRMb2NrIHsKKyAgICAgICAgUHVibGljUmVlbnRyYW50TG9jaygpIHsgc3VwZXIoKTsgfQorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxUaHJlYWQ+IGdldFF1ZXVlZFRocmVhZHMoKSB7IAorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFF1ZXVlZFRocmVhZHMoKTsgCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248VGhyZWFkPiBnZXRXYWl0aW5nVGhyZWFkcyhDb25kaXRpb24gYykgeyAKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRXYWl0aW5nVGhyZWFkcyhjKTsgCisgICAgICAgIH0KKworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igc2V0cyBnaXZlbiBmYWlybmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsgCisgICAgICAgIFJlZW50cmFudExvY2sgcmwgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc0ZhaXIoKSk7CisgICAgICAgIFJlZW50cmFudExvY2sgcjIgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyMi5pc0ZhaXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbG9ja2luZyBhbiB1bmxvY2tlZCBsb2NrIHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExvY2soKSB7IAorICAgICAgICBSZWVudHJhbnRMb2NrIHJsID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgcmwubG9jaygpOworICAgICAgICBhc3NlcnRUcnVlKHJsLmlzTG9ja2VkKCkpOworICAgICAgICBybC51bmxvY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsb2NraW5nIGFuIHVubG9ja2VkIGZhaXIgbG9jayBzdWNjZWVkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlyTG9jaygpIHsgCisgICAgICAgIFJlZW50cmFudExvY2sgcmwgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKKyAgICAgICAgcmwubG9jaygpOworICAgICAgICBhc3NlcnRUcnVlKHJsLmlzTG9ja2VkKCkpOworICAgICAgICBybC51bmxvY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmxvY2tpbmcgYW4gdW5sb2NrZWQgbG9jayB0aHJvd3MgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmxvY2tfSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbigpIHsgCisgICAgICAgIFJlZW50cmFudExvY2sgcmwgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmwudW5sb2NrKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworCisgICAgICAgIH0gY2F0Y2goSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqCisgICAgICogdHJ5TG9jayBvbiBhbiB1bmxvY2tlZCBsb2NrIHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRyeUxvY2soKSB7IAorICAgICAgICBSZWVudHJhbnRMb2NrIHJsID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShybC50cnlMb2NrKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJsLmlzTG9ja2VkKCkpOworICAgICAgICBybC51bmxvY2soKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGhhc1F1ZXVlZFRocmVhZHMgcmVwb3J0cyB3aGV0aGVyIHRoZXJlIGFyZSB3YWl0aW5nIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0aGFzUXVldWVkVGhyZWFkcygpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGVkTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0aWJsZUxvY2tSdW5uYWJsZShsb2NrKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsb2NrLmhhc1F1ZXVlZFRocmVhZHMoKSk7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmhhc1F1ZXVlZFRocmVhZHMoKSk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5oYXNRdWV1ZWRUaHJlYWRzKCkpOworICAgICAgICAgICAgdDEuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmhhc1F1ZXVlZFRocmVhZHMoKSk7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGxvY2suaGFzUXVldWVkVGhyZWFkcygpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogZ2V0UXVldWVMZW5ndGggcmVwb3J0cyBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXVlTGVuZ3RoKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogZ2V0UXVldWVMZW5ndGggcmVwb3J0cyBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXVlTGVuZ3RoX2ZhaXIoKSB7IAorICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogaGFzUXVldWVkVGhyZWFkKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzUXVldWVkVGhyZWFkTlBFKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBzeW5jID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmMuaGFzUXVldWVkVGhyZWFkKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzUXVldWVkVGhyZWFkIHJlcG9ydHMgd2hldGhlciBhIHRocmVhZCBpcyBxdWV1ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1F1ZXVlZFRocmVhZCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgc3luYyA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGVkTG9ja1J1bm5hYmxlKHN5bmMpKTsKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0aWJsZUxvY2tSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShzeW5jLmhhc1F1ZXVlZFRocmVhZCh0MSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5oYXNRdWV1ZWRUaHJlYWQodDIpKTsKKyAgICAgICAgICAgIHN5bmMubG9jaygpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQxKSk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNRdWV1ZWRUaHJlYWQodDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3luYy5oYXNRdWV1ZWRUaHJlYWQodDIpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQyKSk7CisgICAgICAgICAgICBzeW5jLnVubG9jaygpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQxKSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5oYXNRdWV1ZWRUaHJlYWQodDIpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisKKyAgICAvKioKKyAgICAgKiBnZXRRdWV1ZWRUaHJlYWRzIGluY2x1ZGVzIHdhaXRpbmcgdGhyZWFkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWV1ZWRUaHJlYWRzKCkgeyAKKyAgICAgICAgZmluYWwgUHVibGljUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFB1YmxpY1JlZW50cmFudExvY2soKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFF1ZXVlZFRocmVhZHMoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmNvbnRhaW5zKHQxKSk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDIpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmNvbnRhaW5zKHQxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmNvbnRhaW5zKHQyKSk7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisKKyAgICAvKioKKyAgICAgKiB0aW1lZCB0cnlMb2NrIGlzIGludGVycnVwdGlibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdGVkRXhjZXB0aW9uMigpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudHJ5TG9jayhNRURJVU1fREVMQVlfTVMsVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRyeUxvY2sgb24gYSBsb2NrZWQgbG9jayBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUcnlMb2NrV2hlbkxvY2tlZCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UobG9jay50cnlMb2NrKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAvKioKKyAgICAgKiBUaW1lZCB0cnlMb2NrIG9uIGEgbG9ja2VkIGxvY2sgdGltZXMgb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRyeUxvY2tfVGltZW91dCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGxvY2sudHJ5TG9jaygxLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorICAgIAorICAgIC8qKgorICAgICAqIGdldEhvbGRDb3VudCByZXR1cm5zIG51bWJlciBvZiByZWN1cnNpdmUgaG9sZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SG9sZENvdW50KCkgeworICAgICAgICBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDw9IFNJWkU7IGkrKykgeworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSxsb2NrLmdldEhvbGRDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoaW50IGkgPSBTSVpFOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGktMSxsb2NrLmdldEhvbGRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgIAorICAgIC8qKgorICAgICAqIGlzTG9ja2VkIGlzIHRydWUgd2hlbiBsb2NrZWQgYW5kIGZhbHNlIHdoZW4gbm90CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzTG9ja2VkKCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBhc3NlcnRGYWxzZShsb2NrLmlzTG9ja2VkKCkpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsb2NrLmlzTG9ja2VkKCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogbG9ja0ludGVycnVwdGlibHkgaXMgaW50ZXJydXB0aWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ja0ludGVycnVwdGlibHkxKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogbG9ja0ludGVycnVwdGlibHkgc3VjY2VlZHMgd2hlbiB1bmxvY2tlZCwgZWxzZSBpcyBpbnRlcnJ1cHRpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExvY2tJbnRlcnJ1cHRpYmx5MigpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay5sb2NrSW50ZXJydXB0aWJseSgpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZShsb2NrKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxpbmcgYXdhaXQgd2l0aG91dCBob2xkaW5nIGxvY2sgdGhyb3dzIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXRfSWxsZWdhbE1vbml0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLm5ld0NvbmRpdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGluZyBzaWduYWwgd2l0aG91dCBob2xkaW5nIGxvY2sgdGhyb3dzIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbmFsX0lsbGVnYWxNb25pdG9yKCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMuc2lnbmFsKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhd2FpdE5hbm9zIHdpdGhvdXQgYSBzaWduYWwgdGltZXMgb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0TmFub3NfVGltZW91dCgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2submV3Q29uZGl0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGxvbmcgdCA9IGMuYXdhaXROYW5vcygxMDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0IDw9IDApOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgdGltZWQgYXdhaXQgd2l0aG91dCBhIHNpZ25hbCB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXRfVGltZW91dCgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2submV3Q29uZGl0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGMuYXdhaXQoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhd2FpdFVudGlsIHdpdGhvdXQgYSBzaWduYWwgdGltZXMgb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0VW50aWxfVGltZW91dCgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2submV3Q29uZGl0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGphdmEudXRpbC5EYXRlIGQgPSBuZXcgamF2YS51dGlsLkRhdGUoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGMuYXdhaXRVbnRpbChuZXcgamF2YS51dGlsLkRhdGUoZC5nZXRUaW1lKCkgKyAxMCkpKTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXQgcmV0dXJucyB3aGVuIHNpZ25hbGxlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdCgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2submV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgYy5zaWduYWwoKTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB0LmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhhc1dhaXRlcnMgdGhyb3dzIE5QRSBpZiBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1dhaXRlcnNOUEUoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmhhc1dhaXRlcnMobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0V2FpdFF1ZXVlTGVuZ3RoIHRocm93cyBOUEUgaWYgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0UXVldWVMZW5ndGhOUEUoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmdldFdhaXRRdWV1ZUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGdldFdhaXRpbmdUaHJlYWRzIHRocm93cyBOUEUgaWYgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0aW5nVGhyZWFkc05QRSgpIHsKKyAgICAgICAgZmluYWwgUHVibGljUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFB1YmxpY1JlZW50cmFudExvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2suZ2V0V2FpdGluZ1RocmVhZHMobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBoYXNXYWl0ZXJzIHRocm93cyBJQUUgaWYgbm90IG93bmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1dhaXRlcnNJQUUoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gKGxvY2submV3Q29uZGl0aW9uKCkpOworICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2syID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2syLmhhc1dhaXRlcnMoYyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhhc1dhaXRlcnMgdGhyb3dzIElNU0UgaWYgbm90IGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNXYWl0ZXJzSU1TRSgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSAobG9jay5uZXdDb25kaXRpb24oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmhhc1dhaXRlcnMoYyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGdldFdhaXRRdWV1ZUxlbmd0aCB0aHJvd3MgSUFFIGlmIG5vdCBvd25lZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0UXVldWVMZW5ndGhJQUUoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gKGxvY2submV3Q29uZGl0aW9uKCkpOworICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2syID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2syLmdldFdhaXRRdWV1ZUxlbmd0aChjKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0V2FpdFF1ZXVlTGVuZ3RoIHRocm93cyBJTVNFIGlmIG5vdCBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2FpdFF1ZXVlTGVuZ3RoSU1TRSgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSAobG9jay5uZXdDb25kaXRpb24oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmdldFdhaXRRdWV1ZUxlbmd0aChjKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogZ2V0V2FpdGluZ1RocmVhZHMgdGhyb3dzIElBRSBpZiBub3Qgb3duZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2FpdGluZ1RocmVhZHNJQUUoKSB7CisgICAgICAgIGZpbmFsIFB1YmxpY1JlZW50cmFudExvY2sgbG9jayA9IG5ldyBQdWJsaWNSZWVudHJhbnRMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSAobG9jay5uZXdDb25kaXRpb24oKSk7CisgICAgICAgIGZpbmFsIFB1YmxpY1JlZW50cmFudExvY2sgbG9jazIgPSBuZXcgUHVibGljUmVlbnRyYW50TG9jaygpOyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrMi5nZXRXYWl0aW5nVGhyZWFkcyhjKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0V2FpdGluZ1RocmVhZHMgdGhyb3dzIElNU0UgaWYgbm90IGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0aW5nVGhyZWFkc0lNU0UoKSB7CisgICAgICAgIGZpbmFsIFB1YmxpY1JlZW50cmFudExvY2sgbG9jayA9IG5ldyBQdWJsaWNSZWVudHJhbnRMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSAobG9jay5uZXdDb25kaXRpb24oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmdldFdhaXRpbmdUaHJlYWRzKGMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIGhhc1dhaXRlcnMgcmV0dXJucyB0cnVlIHdoZW4gYSB0aHJlYWQgaXMgd2FpdGluZywgZWxzZSBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNXYWl0ZXJzKCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShsb2NrLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKDAsIGxvY2suZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFdhaXRRdWV1ZUxlbmd0aChjKSk7CisgICAgICAgICAgICBjLnNpZ25hbCgpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGxvY2suaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbG9jay5nZXRXYWl0UXVldWVMZW5ndGgoYykpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0V2FpdFF1ZXVlTGVuZ3RoIHJldHVybnMgbnVtYmVyIG9mIHdhaXRpbmcgdGhyZWFkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0UXVldWVMZW5ndGgoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLm5ld0NvbmRpdGlvbigpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShsb2NrLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKDAsIGxvY2suZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShsb2NrLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKDEsIGxvY2suZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBsb2NrLmdldFdhaXRRdWV1ZUxlbmd0aChjKSk7CisgICAgICAgICAgICBjLnNpZ25hbEFsbCgpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGxvY2suaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbG9jay5nZXRXYWl0UXVldWVMZW5ndGgoYykpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHQxLmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdDIuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0MS5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodDIuaXNBbGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRXYWl0aW5nVGhyZWFkcyByZXR1cm5zIG9ubHkgYW5kIGFsbCB3YWl0aW5nIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2FpdGluZ1RocmVhZHMoKSB7CisgICAgICAgIGZpbmFsIFB1YmxpY1JlZW50cmFudExvY2sgbG9jayA9IG5ldyBQdWJsaWNSZWVudHJhbnRMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLm5ld0NvbmRpdGlvbigpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKGxvY2suZ2V0V2FpdGluZ1RocmVhZHMoYykuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UobG9jay5nZXRXYWl0aW5nVGhyZWFkcyhjKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0V2FpdGluZ1RocmVhZHMoYykuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0V2FpdGluZ1RocmVhZHMoYykuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRXYWl0aW5nVGhyZWFkcyhjKS5jb250YWlucyh0MikpOworICAgICAgICAgICAgYy5zaWduYWxBbGwoKTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsb2NrLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFdhaXRpbmdUaHJlYWRzKGMpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgdDEuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0Mi5qb2luKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQxLmlzQWxpdmUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0Mi5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBhd2FpdFVuaW50ZXJydXB0aWJseSBkb2Vzbid0IGFib3J0IG9uIGludGVycnVwdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdFVuaW50ZXJydXB0aWJseSgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2submV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGMuYXdhaXRVbmludGVycnVwdGlibHkoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGMuc2lnbmFsKCk7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0KHQuaXNJbnRlcnJ1cHRlZCgpKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXQgaXMgaW50ZXJydXB0aWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdF9JbnRlcnJ1cHQoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLm5ld0NvbmRpdGlvbigpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXROYW5vcyBpcyBpbnRlcnJ1cHRpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0TmFub3NfSW50ZXJydXB0KCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0TmFub3MoMTAwMCAqIDEwMDAgKiAxMDAwKTsgLy8gMSBzZWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXRVbnRpbCBpcyBpbnRlcnJ1cHRpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0VW50aWxfSW50ZXJydXB0KCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuRGF0ZSBkID0gbmV3IGphdmEudXRpbC5EYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0VW50aWwobmV3IGphdmEudXRpbC5EYXRlKGQuZ2V0VGltZSgpICsgMTAwMDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2lnbmFsQWxsIHdha2VzIHVwIGFsbCB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hbEFsbCgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2submV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBjLnNpZ25hbEFsbCgpOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHQxLmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdDIuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0MS5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodDIuaXNBbGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNlcmlhbGl6ZWQgbG9jayBkZXNlcmlhbGl6ZXMgYXMgdW5sb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgUmVlbnRyYW50TG9jayBsID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgbC5sb2NrKCk7CisgICAgICAgIGwudW5sb2NrKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm91dCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGwpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmluKSk7CisgICAgICAgICAgICBSZWVudHJhbnRMb2NrIHIgPSAoUmVlbnRyYW50TG9jaykgaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgci5sb2NrKCk7CisgICAgICAgICAgICByLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyBpbmRpY2F0ZXMgY3VycmVudCBsb2NrIHN0YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICBTdHJpbmcgdXMgPSBsb2NrLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydFRydWUodXMuaW5kZXhPZigiVW5sb2NrZWQiKSA+PSAwKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIFN0cmluZyBscyA9IGxvY2sudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShscy5pbmRleE9mKCJMb2NrZWQiKSA+PSAwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvUmVlbnRyYW50UmVhZFdyaXRlTG9ja1Rlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvUmVlbnRyYW50UmVhZFdyaXRlTG9ja1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI1YjQyCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9SZWVudHJhbnRSZWFkV3JpdGVMb2NrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMyMSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWVudHJhbnRSZWFkV3JpdGVMb2NrVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBydW5uYWJsZSBjYWxsaW5nIGxvY2tJbnRlcnJ1cHRpYmx5CisgICAgICovCisgICAgY2xhc3MgSW50ZXJydXB0aWJsZUxvY2tSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrOworICAgICAgICBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbCkgeyBsb2NrID0gbDsgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9ja0ludGVycnVwdGlibHkoKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHJ1bm5hYmxlIGNhbGxpbmcgbG9ja0ludGVycnVwdGlibHkgdGhhdCBleHBlY3RzIHRvIGJlCisgICAgICogaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBjbGFzcyBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrOworICAgICAgICBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZShSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGwpIHsgbG9jayA9IGw7IH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2tJbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3MgdG8gZXhwb3NlIHByb3RlY3RlZCBtZXRob2RzCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFB1YmxpY1JlZW50cmFudFJlYWRXcml0ZUxvY2sgZXh0ZW5kcyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHsKKyAgICAgICAgUHVibGljUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpIHsgc3VwZXIoKTsgfQorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxUaHJlYWQ+IGdldFF1ZXVlZFRocmVhZHMoKSB7IAorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFF1ZXVlZFRocmVhZHMoKTsgCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248VGhyZWFkPiBnZXRXYWl0aW5nVGhyZWFkcyhDb25kaXRpb24gYykgeyAKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRXYWl0aW5nVGhyZWFkcyhjKTsgCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBzZXRzIGdpdmVuIGZhaXJuZXNzLCBhbmQgaXMgaW4gdW5sb2NrZWQgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7IAorICAgICAgICBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHJsID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmwuaXNGYWlyKCkpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc1dyaXRlTG9ja2VkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmwuZ2V0UmVhZExvY2tDb3VudCgpKTsKKyAgICAgICAgUmVlbnRyYW50UmVhZFdyaXRlTG9jayByMiA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKHIyLmlzRmFpcigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocjIuaXNXcml0ZUxvY2tlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHIyLmdldFJlYWRMb2NrQ291bnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogd3JpdGUtbG9ja2luZyBhbmQgcmVhZC1sb2NraW5nIGFuIHVubG9ja2VkIGxvY2sgc3VjY2VlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NrKCkgeyAKKyAgICAgICAgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBybCA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHJsLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShybC5pc1dyaXRlTG9ja2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJsLmlzV3JpdGVMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBybC5nZXRSZWFkTG9ja0NvdW50KCkpOworICAgICAgICBybC53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmwuaXNXcml0ZUxvY2tlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmwuaXNXcml0ZUxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJsLmdldFJlYWRMb2NrQ291bnQoKSk7CisgICAgICAgIHJsLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc1dyaXRlTG9ja2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc1dyaXRlTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmwuZ2V0UmVhZExvY2tDb3VudCgpKTsKKyAgICAgICAgcmwucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmwuaXNXcml0ZUxvY2tlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmwuaXNXcml0ZUxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJsLmdldFJlYWRMb2NrQ291bnQoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBsb2NraW5nIGFuIHVubG9ja2VkIGZhaXIgbG9jayBzdWNjZWVkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlyTG9jaygpIHsgCisgICAgICAgIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgcmwgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jayh0cnVlKTsKKyAgICAgICAgcmwud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICBhc3NlcnRUcnVlKHJsLmlzV3JpdGVMb2NrZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUocmwuaXNXcml0ZUxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJsLmdldFJlYWRMb2NrQ291bnQoKSk7CisgICAgICAgIHJsLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc1dyaXRlTG9ja2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc1dyaXRlTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmwuZ2V0UmVhZExvY2tDb3VudCgpKTsKKyAgICAgICAgcmwucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIGFzc2VydEZhbHNlKHJsLmlzV3JpdGVMb2NrZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJsLmlzV3JpdGVMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBybC5nZXRSZWFkTG9ja0NvdW50KCkpOworICAgICAgICBybC5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc1dyaXRlTG9ja2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShybC5pc1dyaXRlTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmwuZ2V0UmVhZExvY2tDb3VudCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRXcml0ZUhvbGRDb3VudCByZXR1cm5zIG51bWJlciBvZiByZWN1cnNpdmUgaG9sZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SG9sZENvdW50KCkgeworICAgICAgICBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDw9IFNJWkU7IGkrKykgeworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSxsb2NrLmdldFdyaXRlSG9sZENvdW50KCkpOworICAgICAgICB9CisgICAgICAgIGZvcihpbnQgaSA9IFNJWkU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaS0xLGxvY2suZ2V0V3JpdGVIb2xkQ291bnQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiB3cml0ZS11bmxvY2tpbmcgYW4gdW5sb2NrZWQgbG9jayB0aHJvd3MgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmxvY2tfSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbigpIHsgCisgICAgICAgIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgcmwgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmwud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworCisgICAgLyoqCisgICAgICogd3JpdGUtbG9ja0ludGVycnVwdGlibHkgaXMgaW50ZXJydXB0aWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUxvY2tJbnRlcnJ1cHRpYmx5X0ludGVycnVwdGVkKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2tJbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrSW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIHRpbWVkIHdyaXRlLXRyeUxvY2sgaXMgaW50ZXJydXB0aWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRyeUxvY2tfSW50ZXJydXB0ZWQoKSB7IAorICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnRyeUxvY2soMTAwMCxUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZC1sb2NrSW50ZXJydXB0aWJseSBpcyBpbnRlcnJ1cHRpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRMb2NrSW50ZXJydXB0aWJseV9JbnRlcnJ1cHRlZCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sucmVhZExvY2soKS5sb2NrSW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIHRpbWVkIHJlYWQtdHJ5TG9jayBpcyBpbnRlcnJ1cHRpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRUcnlMb2NrX0ludGVycnVwdGVkKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnRyeUxvY2soMTAwMCxUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogd3JpdGUtdHJ5TG9jayBmYWlscyBpZiBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUcnlMb2NrV2hlbkxvY2tlZCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UobG9jay53cml0ZUxvY2soKS50cnlMb2NrKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAvKioKKyAgICAgKiByZWFkLXRyeUxvY2sgZmFpbHMgaWYgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRUcnlMb2NrV2hlbkxvY2tlZCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UobG9jay5yZWFkTG9jaygpLnRyeUxvY2soKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIE11bHRpcGxlIHRocmVhZHMgY2FuIGhvbGQgYSByZWFkIGxvY2sgd2hlbiBub3Qgd3JpdGUtbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUmVhZExvY2tzKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUobG9jay5yZWFkTG9jaygpLnRyeUxvY2soKSk7CisgICAgICAgICAgICAgICAgICAgIGxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAvKioKKyAgICAgKiBBIHdyaXRlbG9jayBzdWNjZWVkcyBhZnRlciByZWFkaW5nIHRocmVhZHMgdW5sb2NrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQWZ0ZXJNdWx0aXBsZVJlYWRMb2NrcygpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICB0MS5qb2luKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICB0Mi5qb2luKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCF0MS5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghdDIuaXNBbGl2ZSgpKTsKKyAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIFJlYWRsb2NrcyBzdWNjZWVkIGFmdGVyIGEgd3JpdGluZyB0aHJlYWQgdW5sb2NrcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQWZ0ZXJXcml0ZUxvY2soKSB7IAorICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgICAgICBsb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgdDEuam9pbihNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgdDIuam9pbihNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghdDEuaXNBbGl2ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIXQyLmlzQWxpdmUoKSk7CisgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKworICAgIC8qKgorICAgICAqIFJlYWQgdHJ5TG9jayBzdWNjZWVkcyBpZiByZWFkbG9ja2VkIGJ1dCBub3Qgd3JpdGVsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ5TG9ja1doZW5SZWFkTG9ja2VkKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUobG9jay5yZWFkTG9jaygpLnRyeUxvY2soKSk7CisgICAgICAgICAgICAgICAgICAgIGxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAKKworICAgIC8qKgorICAgICAqIHdyaXRlIHRyeUxvY2sgZmFpbHMgd2hlbiByZWFkbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlVHJ5TG9ja1doZW5SZWFkTG9ja2VkKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGxvY2sud3JpdGVMb2NrKCkudHJ5TG9jaygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAKKworICAgIC8qKgorICAgICAqIHdyaXRlIHRpbWVkIHRyeUxvY2sgdGltZXMgb3V0IGlmIGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRyeUxvY2tfVGltZW91dCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGxvY2sud3JpdGVMb2NrKCkudHJ5TG9jaygxLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogcmVhZCB0aW1lZCB0cnlMb2NrIHRpbWVzIG91dCBpZiB3cml0ZS1sb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFRyeUxvY2tfVGltZW91dCgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGxvY2sucmVhZExvY2soKS50cnlMb2NrKDEsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0gCisKKworICAgIC8qKgorICAgICAqIHdyaXRlIGxvY2tJbnRlcnJ1cHRpYmx5IHN1Y2NlZWRzIGlmIGxvY2sgZnJlZSBlbHNlIGlzIGludGVycnVwdGlibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVMb2NrSW50ZXJydXB0aWJseSgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9ja0ludGVycnVwdGlibHkoKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9ja0ludGVycnVwdGlibHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICByZWFkIGxvY2tJbnRlcnJ1cHRpYmx5IHN1Y2NlZWRzIGlmIGxvY2sgZnJlZSBlbHNlIGlzIGludGVycnVwdGlibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZExvY2tJbnRlcnJ1cHRpYmx5KCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrSW50ZXJydXB0aWJseSgpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2tJbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsaW5nIGF3YWl0IHdpdGhvdXQgaG9sZGluZyBsb2NrIHRocm93cyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0X0lsbGVnYWxNb25pdG9yKCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay53cml0ZUxvY2soKS5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsaW5nIHNpZ25hbCB3aXRob3V0IGhvbGRpbmcgbG9jayB0aHJvd3MgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYWxfSWxsZWdhbE1vbml0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYy5zaWduYWwoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGF3YWl0TmFub3Mgd2l0aG91dCBhIHNpZ25hbCB0aW1lcyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXROYW5vc19UaW1lb3V0KCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay53cml0ZUxvY2soKS5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgbG9uZyB0ID0gYy5hd2FpdE5hbm9zKDEwMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHQgPD0gMCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIHRpbWVkIGF3YWl0IHdpdGhvdXQgYSBzaWduYWwgdGltZXMgb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0X1RpbWVvdXQoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShjLmF3YWl0KDEwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXRVbnRpbCB3aXRob3V0IGEgc2lnbmFsIHRpbWVzIG91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdFVudGlsX1RpbWVvdXQoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBqYXZhLnV0aWwuRGF0ZSBkID0gbmV3IGphdmEudXRpbC5EYXRlKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShjLmF3YWl0VW50aWwobmV3IGphdmEudXRpbC5EYXRlKGQuZ2V0VGltZSgpICsgMTApKSk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGF3YWl0IHJldHVybnMgd2hlbiBzaWduYWxsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXdhaXQoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIGMuc2lnbmFsKCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgdC5qb2luKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQuaXNBbGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhd2FpdFVuaW50ZXJydXB0aWJseSBkb2Vzbid0IGFib3J0IG9uIGludGVycnVwdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdFVuaW50ZXJydXB0aWJseSgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2sud3JpdGVMb2NrKCkubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGMuYXdhaXRVbmludGVycnVwdGlibHkoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIGMuc2lnbmFsKCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0KHQuaXNJbnRlcnJ1cHRlZCgpKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXQgaXMgaW50ZXJydXB0aWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdF9JbnRlcnJ1cHQoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0LmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXdhaXROYW5vcyBpcyBpbnRlcnJ1cHRpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEF3YWl0TmFub3NfSW50ZXJydXB0KCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay53cml0ZUxvY2soKS5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0TmFub3MoU0hPUlRfREVMQVlfTVMgKiAyICogMTAwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGF3YWl0VW50aWwgaXMgaW50ZXJydXB0aWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBd2FpdFVudGlsX0ludGVycnVwdCgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsgICAgICAgIAorICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IGxvY2sud3JpdGVMb2NrKCkubmV3Q29uZGl0aW9uKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkRhdGUgZCA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdFVudGlsKG5ldyBqYXZhLnV0aWwuRGF0ZShkLmdldFRpbWUoKSArIDEwMDAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHNpZ25hbEFsbCB3YWtlcyB1cCBhbGwgdGhyZWFkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYWxBbGwoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7ICAgICAgICAKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSBsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgYy5zaWduYWxBbGwoKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICB0MS5qb2luKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQyLmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodDEuaXNBbGl2ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQyLmlzQWxpdmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzZXJpYWxpemVkIGxvY2sgZGVzZXJpYWxpemVzIGFzIHVubG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB7CisgICAgICAgIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbCA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGwucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIGwucmVhZExvY2soKS51bmxvY2soKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDAwKTsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShib3V0KSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QobCk7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShiaW4pKTsKKyAgICAgICAgICAgIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgciA9IChSZWVudHJhbnRSZWFkV3JpdGVMb2NrKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICByLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICAgICAgci5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoYXNRdWV1ZWRUaHJlYWRzIHJlcG9ydHMgd2hldGhlciB0aGVyZSBhcmUgd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdGhhc1F1ZXVlZFRocmVhZHMoKSB7IAorICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZShsb2NrKSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGlibGVMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobG9jay5oYXNRdWV1ZWRUaHJlYWRzKCkpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5oYXNRdWV1ZWRUaHJlYWRzKCkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suaGFzUXVldWVkVGhyZWFkcygpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5oYXNRdWV1ZWRUaHJlYWRzKCkpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsb2NrLmhhc1F1ZXVlZFRocmVhZHMoKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIGhhc1F1ZXVlZFRocmVhZChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1F1ZXVlZFRocmVhZE5QRSgpIHsgCisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgc3luYyA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jLmhhc1F1ZXVlZFRocmVhZChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhhc1F1ZXVlZFRocmVhZCByZXBvcnRzIHdoZXRoZXIgYSB0aHJlYWQgaXMgcXVldWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNRdWV1ZWRUaHJlYWQoKSB7IAorICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHN5bmMgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZShzeW5jKSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGlibGVMb2NrUnVubmFibGUoc3luYykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3luYy5oYXNRdWV1ZWRUaHJlYWQodDEpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQyKSk7CisgICAgICAgICAgICBzeW5jLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmhhc1F1ZXVlZFRocmVhZCh0MSkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQyKSk7CisgICAgICAgICAgICB0MS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShzeW5jLmhhc1F1ZXVlZFRocmVhZCh0MSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzeW5jLmhhc1F1ZXVlZFRocmVhZCh0MikpOworICAgICAgICAgICAgc3luYy53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShzeW5jLmhhc1F1ZXVlZFRocmVhZCh0MSkpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN5bmMuaGFzUXVldWVkVGhyZWFkKHQyKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworCisgICAgLyoqCisgICAgICogZ2V0UXVldWVMZW5ndGggcmVwb3J0cyBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXVlTGVuZ3RoKCkgeyAKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogZ2V0UXVldWVkVGhyZWFkcyBpbmNsdWRlcyB3YWl0aW5nIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVldWVkVGhyZWFkcygpIHsgCisgICAgICAgIGZpbmFsIFB1YmxpY1JlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBQdWJsaWNSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGVkTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0aWJsZUxvY2tSdW5uYWJsZShsb2NrKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MSkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmNvbnRhaW5zKHQxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmNvbnRhaW5zKHQyKSk7CisgICAgICAgICAgICB0MS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsb2NrLmdldFF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MikpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIGhhc1dhaXRlcnMgdGhyb3dzIE5QRSBpZiBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1dhaXRlcnNOUEUoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmhhc1dhaXRlcnMobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0V2FpdFF1ZXVlTGVuZ3RoIHRocm93cyBOUEUgaWYgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0UXVldWVMZW5ndGhOUEUoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmdldFdhaXRRdWV1ZUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGdldFdhaXRpbmdUaHJlYWRzIHRocm93cyBOUEUgaWYgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWl0aW5nVGhyZWFkc05QRSgpIHsKKyAgICAgICAgZmluYWwgUHVibGljUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFB1YmxpY1JlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2suZ2V0V2FpdGluZ1RocmVhZHMobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzV2FpdGVycyB0aHJvd3MgSUFFIGlmIG5vdCBvd25lZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNXYWl0ZXJzSUFFKCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IChsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpKTsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrMiA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrMi5oYXNXYWl0ZXJzKGMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoYXNXYWl0ZXJzIHRocm93cyBJTVNFIGlmIG5vdCBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzV2FpdGVyc0lNU0UoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gKGxvY2sud3JpdGVMb2NrKCkubmV3Q29uZGl0aW9uKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay5oYXNXYWl0ZXJzKGMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBnZXRXYWl0UXVldWVMZW5ndGggdGhyb3dzIElBRSBpZiBub3Qgb3duZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2FpdFF1ZXVlTGVuZ3RoSUFFKCkgeworICAgICAgICBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBmaW5hbCBDb25kaXRpb24gYyA9IChsb2NrLndyaXRlTG9jaygpLm5ld0NvbmRpdGlvbigpKTsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrMiA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrMi5nZXRXYWl0UXVldWVMZW5ndGgoYyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldFdhaXRRdWV1ZUxlbmd0aCB0aHJvd3MgSU1TRSBpZiBub3QgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdhaXRRdWV1ZUxlbmd0aElNU0UoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gKGxvY2sud3JpdGVMb2NrKCkubmV3Q29uZGl0aW9uKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay5nZXRXYWl0UXVldWVMZW5ndGgoYyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGdldFdhaXRpbmdUaHJlYWRzIHRocm93cyBJQUUgaWYgbm90IG93bmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdhaXRpbmdUaHJlYWRzSUFFKCkgeworICAgICAgICBmaW5hbCBQdWJsaWNSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUHVibGljUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gKGxvY2sud3JpdGVMb2NrKCkubmV3Q29uZGl0aW9uKCkpOworICAgICAgICBmaW5hbCBQdWJsaWNSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2syID0gbmV3IFB1YmxpY1JlZW50cmFudFJlYWRXcml0ZUxvY2soKTsgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jazIuZ2V0V2FpdGluZ1RocmVhZHMoYyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldFdhaXRpbmdUaHJlYWRzIHRocm93cyBJTVNFIGlmIG5vdCBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2FpdGluZ1RocmVhZHNJTVNFKCkgeworICAgICAgICBmaW5hbCBQdWJsaWNSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUHVibGljUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gKGxvY2sud3JpdGVMb2NrKCkubmV3Q29uZGl0aW9uKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay5nZXRXYWl0aW5nVGhyZWFkcyhjKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogaGFzV2FpdGVycyByZXR1cm5zIHRydWUgd2hlbiBhIHRocmVhZCBpcyB3YWl0aW5nLCBlbHNlIGZhbHNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1dhaXRlcnMoKSB7CisgICAgICAgIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gKGxvY2sud3JpdGVMb2NrKCkubmV3Q29uZGl0aW9uKCkpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGxvY2suaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHMoMCwgbG9jay5nZXRXYWl0UXVldWVMZW5ndGgoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5hd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGxvY2suZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgIGMuc2lnbmFsKCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobG9jay5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsb2NrLmdldFdhaXRRdWV1ZUxlbmd0aChjKSk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgdC5qb2luKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHQuaXNBbGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRXYWl0UXVldWVMZW5ndGggcmV0dXJucyBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdhaXRRdWV1ZUxlbmd0aCgpIHsKKyAgICAgICAgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uIGMgPSAobG9jay53cml0ZUxvY2soKS5uZXdDb25kaXRpb24oKSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UobG9jay5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEVxdWFscygwLCBsb2NrLmdldFdhaXRRdWV1ZUxlbmd0aChjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suaGFzV2FpdGVycyhjKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbG9jay5nZXRXYWl0UXVldWVMZW5ndGgoYykpOworICAgICAgICAgICAgYy5zaWduYWwoKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShsb2NrLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxvY2suZ2V0V2FpdFF1ZXVlTGVuZ3RoKGMpKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICB0LmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodC5pc0FsaXZlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogZ2V0V2FpdGluZ1RocmVhZHMgcmV0dXJucyBvbmx5IGFuZCBhbGwgd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdhaXRpbmdUaHJlYWRzKCkgeworICAgICAgICBmaW5hbCBQdWJsaWNSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUHVibGljUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbmRpdGlvbiBjID0gbG9jay53cml0ZUxvY2soKS5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShsb2NrLmdldFdhaXRpbmdUaHJlYWRzKGMpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKGxvY2suZ2V0V2FpdGluZ1RocmVhZHMoYykuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFdhaXRpbmdUaHJlYWRzKGMpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmhhc1dhaXRlcnMoYykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFdhaXRpbmdUaHJlYWRzKGMpLmNvbnRhaW5zKHQxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0V2FpdGluZ1RocmVhZHMoYykuY29udGFpbnModDIpKTsKKyAgICAgICAgICAgIGMuc2lnbmFsQWxsKCk7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobG9jay5oYXNXYWl0ZXJzKGMpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRXYWl0aW5nVGhyZWFkcyhjKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIHQxLmpvaW4oU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdDIuam9pbihTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0MS5pc0FsaXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodDIuaXNBbGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyBpbmRpY2F0ZXMgY3VycmVudCBsb2NrIHN0YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgICAgICBTdHJpbmcgdXMgPSBsb2NrLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydFRydWUodXMuaW5kZXhPZigiV3JpdGUgbG9ja3MgPSAwIikgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUodXMuaW5kZXhPZigiUmVhZCBsb2NrcyA9IDAiKSA+PSAwKTsKKyAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIFN0cmluZyB3cyA9IGxvY2sudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh3cy5pbmRleE9mKCJXcml0ZSBsb2NrcyA9IDEiKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh3cy5pbmRleE9mKCJSZWFkIGxvY2tzID0gMCIpID49IDApOworICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICBTdHJpbmcgcnMgPSBsb2NrLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydFRydWUocnMuaW5kZXhPZigiV3JpdGUgbG9ja3MgPSAwIikgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUocnMuaW5kZXhPZigiUmVhZCBsb2NrcyA9IDIiKSA+PSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkTG9jay50b1N0cmluZyBpbmRpY2F0ZXMgY3VycmVudCBsb2NrIHN0YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRMb2NrVG9TdHJpbmcoKSB7CisgICAgICAgIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIFN0cmluZyB1cyA9IGxvY2sucmVhZExvY2soKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRUcnVlKHVzLmluZGV4T2YoIlJlYWQgbG9ja3MgPSAwIikgPj0gMCk7CisgICAgICAgIGxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIGxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIFN0cmluZyBycyA9IGxvY2sucmVhZExvY2soKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRUcnVlKHJzLmluZGV4T2YoIlJlYWQgbG9ja3MgPSAyIikgPj0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogd3JpdGVMb2NrLnRvU3RyaW5nIGluZGljYXRlcyBjdXJyZW50IGxvY2sgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVMb2NrVG9TdHJpbmcoKSB7CisgICAgICAgIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgICAgIFN0cmluZyB1cyA9IGxvY2sud3JpdGVMb2NrKCkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1cy5pbmRleE9mKCJVbmxvY2tlZCIpID49IDApOworICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgU3RyaW5nIGxzID0gbG9jay53cml0ZUxvY2soKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRUcnVlKGxzLmluZGV4T2YoIkxvY2tlZCIpID49IDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9TY2hlZHVsZWRFeGVjdXRvclRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkRXhlY3V0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGE1NzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkRXhlY3V0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMTQ5IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuKjsKKworcHVibGljIGNsYXNzIFNjaGVkdWxlZEV4ZWN1dG9yVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShTY2hlZHVsZWRFeGVjdXRvclRlc3QuY2xhc3MpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogZXhlY3V0ZSBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMgYSBydW5uYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhY2tlZFNob3J0UnVubmFibGUgcnVubmFibGUgPW5ldyBUcmFja2VkU2hvcnRSdW5uYWJsZSgpOworICAgICAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgICAgIHAxLmV4ZWN1dGUocnVubmFibGUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnVubmFibGUuZG9uZSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdHJ5IHsgcDEuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUocnVubmFibGUuZG9uZSk7CisgICAgICAgICAgICB0cnkgeyBwMS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICAgICAgam9pblBvb2wocDEpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGRlbGF5ZWQgc2NoZWR1bGUgb2YgY2FsbGFibGUgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzIGFmdGVyIGRlbGF5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlMSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRyYWNrZWRDYWxsYWJsZSBjYWxsYWJsZSA9IG5ldyBUcmFja2VkQ2FsbGFibGUoKTsKKyAgICAgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgICAgICBGdXR1cmUgZiA9IHAxLnNjaGVkdWxlKGNhbGxhYmxlLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGNhbGxhYmxlLmRvbmUpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNhbGxhYmxlLmRvbmUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZi5nZXQoKSk7CisgICAgICAgICAgICB0cnkgeyBwMS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICAgICAgam9pblBvb2wocDEpOworICAgICAgICB9IGNhdGNoKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGUpe30KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBkZWxheWVkIHNjaGVkdWxlIG9mIHJ1bm5hYmxlIHN1Y2Nlc3NmdWxseSBleGVjdXRlcyBhZnRlciBkZWxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlZHVsZTMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFja2VkU2hvcnRSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBUcmFja2VkU2hvcnRSdW5uYWJsZSgpOworICAgICAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgICAgIHAxLnNjaGVkdWxlKHJ1bm5hYmxlLCBTTUFMTF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShydW5uYWJsZS5kb25lKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShydW5uYWJsZS5kb25lKTsKKyAgICAgICAgICAgIHRyeSB7IHAxLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHNjaGVkdWxlQXRGaXhlZFJhdGUgZXhlY3V0ZXMgcnVubmFibGUgYWZ0ZXIgZ2l2ZW4gaW5pdGlhbCBkZWxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlZHVsZTQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFja2VkU2hvcnRSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBUcmFja2VkU2hvcnRSdW5uYWJsZSgpOworICAgICAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgICAgIFNjaGVkdWxlZEZ1dHVyZSBoID0gcDEuc2NoZWR1bGVBdEZpeGVkUmF0ZShydW5uYWJsZSwgU0hPUlRfREVMQVlfTVMsIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnVubmFibGUuZG9uZSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTUVESVVNX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocnVubmFibGUuZG9uZSk7CisgICAgICAgICAgICBoLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgIGpvaW5Qb29sKHAxKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUnVubmFibGVDb3VudGVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBBdG9taWNJbnRlZ2VyIGNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsgY291bnQuZ2V0QW5kSW5jcmVtZW50KCk7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzY2hlZHVsZVdpdGhGaXhlZERlbGF5IGV4ZWN1dGVzIHJ1bm5hYmxlIGFmdGVyIGdpdmVuIGluaXRpYWwgZGVsYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZWR1bGU1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhY2tlZFNob3J0UnVubmFibGUgcnVubmFibGUgPSBuZXcgVHJhY2tlZFNob3J0UnVubmFibGUoKTsKKyAgICAgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgICAgICBTY2hlZHVsZWRGdXR1cmUgaCA9IHAxLnNjaGVkdWxlV2l0aEZpeGVkRGVsYXkocnVubmFibGUsIFNIT1JUX0RFTEFZX01TLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJ1bm5hYmxlLmRvbmUpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1FRElVTV9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJ1bm5hYmxlLmRvbmUpOworICAgICAgICAgICAgaC5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHNjaGVkdWxlQXRGaXhlZFJhdGUgZXhlY3V0ZXMgc2VyaWVzIG9mIHRhc2tzIGF0IGdpdmVuIHJhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRSYXRlU2VxdWVuY2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICAgICAgUnVubmFibGVDb3VudGVyIGNvdW50ZXIgPSBuZXcgUnVubmFibGVDb3VudGVyKCk7CisgICAgICAgICAgICBTY2hlZHVsZWRGdXR1cmUgaCA9IAorICAgICAgICAgICAgICAgIHAxLnNjaGVkdWxlQXRGaXhlZFJhdGUoY291bnRlciwgMCwgMSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgICAgICBoLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgIGludCBjID0gY291bnRlci5jb3VudC5nZXQoKTsKKyAgICAgICAgICAgIC8vIEJ5IHRpbWUgc2NhbGluZyBjb252ZW50aW9ucywgd2UgbXVzdCBoYXZlIGF0IGxlYXN0CisgICAgICAgICAgICAvLyBhbiBleGVjdXRpb24gcGVyIFNIT1JUIGRlbGF5LCBidXQgbm8gbW9yZSB0aGFuIG9uZSBTSE9SVCBtb3JlCisgICAgICAgICAgICBhc3NlcnRUcnVlKGMgPj0gU01BTExfREVMQVlfTVMgLyBTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGMgPD0gU01BTExfREVMQVlfTVMgKyBTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2NoZWR1bGVXaXRoRml4ZWREZWxheSBleGVjdXRlcyBzZXJpZXMgb2YgdGFza3Mgd2l0aCBnaXZlbiBwZXJpb2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWREZWxheVNlcXVlbmNlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgICAgIFJ1bm5hYmxlQ291bnRlciBjb3VudGVyID0gbmV3IFJ1bm5hYmxlQ291bnRlcigpOworICAgICAgICAgICAgU2NoZWR1bGVkRnV0dXJlIGggPSAKKyAgICAgICAgICAgICAgICBwMS5zY2hlZHVsZVdpdGhGaXhlZERlbGF5KGNvdW50ZXIsIDAsIDEsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgaC5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICBpbnQgYyA9IGNvdW50ZXIuY291bnQuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGMgPj0gU01BTExfREVMQVlfTVMgLyBTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGMgPD0gU01BTExfREVMQVlfTVMgKyBTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZXhlY3V0ZSAobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTnVsbCgpIHsKKyAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgICAgIHNlLmV4ZWN1dGUobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBqb2luUG9vbChzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2NoZWR1bGUgKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZWR1bGVOdWxsKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3Igc2UgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhY2tlZENhbGxhYmxlIGNhbGxhYmxlID0gbnVsbDsKKyAgICAgICAgICAgIEZ1dHVyZSBmID0gc2Uuc2NoZWR1bGUoY2FsbGFibGUsIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBqb2luUG9vbChzZSk7CisgICAgfQorICAgCisgICAgLyoqCisgICAgICogZXhlY3V0ZSB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgc2h1dGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZWR1bGUxX1JlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3Igc2UgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2Uuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIHNlLnNjaGVkdWxlKG5ldyBOb09wUnVubmFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGpvaW5Qb29sKHNlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIHNjaGVkdWxlIHRocm93cyBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZiBzaHV0ZG93bgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlZHVsZTJfUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBzZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZS5zaHV0ZG93bigpOworICAgICAgICAgICAgc2Uuc2NoZWR1bGUobmV3IE5vT3BDYWxsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorICAgICAgICBqb2luUG9vbChzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2NoZWR1bGUgY2FsbGFibGUgdGhyb3dzIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGlmIHNodXRkb3duCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlZHVsZTNfUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3Igc2UgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlLnNodXRkb3duKCk7CisgICAgICAgICAgICBzZS5zY2hlZHVsZShuZXcgTm9PcENhbGxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgICAgICBqb2luUG9vbChzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIHNjaGVkdWxlQXRGaXhlZFJhdGUgdGhyb3dzIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGlmIHNodXRkb3duCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlQXRGaXhlZFJhdGUxX1JlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3Igc2UgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2Uuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIHNlLnNjaGVkdWxlQXRGaXhlZFJhdGUobmV3IE5vT3BSdW5uYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJVU1fREVMQVlfTVMsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0gCisgICAgICAgIGpvaW5Qb29sKHNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogc2NoZWR1bGVXaXRoRml4ZWREZWxheSB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgc2h1dGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZWR1bGVXaXRoRml4ZWREZWxheTFfUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBzZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZS5zaHV0ZG93bigpOworICAgICAgICAgICAgc2Uuc2NoZWR1bGVXaXRoRml4ZWREZWxheShuZXcgTm9PcFJ1bm5hYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElVTV9ERUxBWV9NUywgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfSAKKyAgICAgICAgam9pblBvb2woc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXRBY3RpdmVDb3VudCBpbmNyZWFzZXMgYnV0IGRvZXNuJ3Qgb3ZlcmVzdGltYXRlLCB3aGVuIGEKKyAgICAgKiAgdGhyZWFkIGJlY29tZXMgYWN0aXZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2ZUNvdW50KCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDIgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcDIuZ2V0QWN0aXZlQ291bnQoKSk7CisgICAgICAgIHAyLmV4ZWN1dGUobmV3IFNtYWxsUnVubmFibGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcDIuZ2V0QWN0aXZlQ291bnQoKSk7CisgICAgICAgIGpvaW5Qb29sKHAyKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogICAgZ2V0Q29tcGxldGVkVGFza0NvdW50IGluY3JlYXNlcywgYnV0IGRvZXNuJ3Qgb3ZlcmVzdGltYXRlLAorICAgICAqICAgd2hlbiB0YXNrcyBjb21wbGV0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wbGV0ZWRUYXNrQ291bnQoKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMiA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwMi5nZXRDb21wbGV0ZWRUYXNrQ291bnQoKSk7CisgICAgICAgIHAyLmV4ZWN1dGUobmV3IFNtYWxsUnVubmFibGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTUVESVVNX0RFTEFZX01TKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHAyLmdldENvbXBsZXRlZFRhc2tDb3VudCgpKTsKKyAgICAgICAgam9pblBvb2wocDIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgZ2V0Q29yZVBvb2xTaXplIHJldHVybnMgc2l6ZSBnaXZlbiBpbiBjb25zdHJ1Y3RvciBpZiBub3Qgb3RoZXJ3aXNlIHNldCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29yZVBvb2xTaXplKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcDEuZ2V0Q29yZVBvb2xTaXplKCkpOworICAgICAgICBqb2luUG9vbChwMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICAgIGdldExhcmdlc3RQb29sU2l6ZSBpbmNyZWFzZXMsIGJ1dCBkb2Vzbid0IG92ZXJlc3RpbWF0ZSwgd2hlbgorICAgICAqICAgbXVsdGlwbGUgdGhyZWFkcyBhY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFyZ2VzdFBvb2xTaXplKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDIgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcDIuZ2V0TGFyZ2VzdFBvb2xTaXplKCkpOworICAgICAgICBwMi5leGVjdXRlKG5ldyBTbWFsbFJ1bm5hYmxlKCkpOworICAgICAgICBwMi5leGVjdXRlKG5ldyBTbWFsbFJ1bm5hYmxlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHAyLmdldExhcmdlc3RQb29sU2l6ZSgpKTsKKyAgICAgICAgam9pblBvb2wocDIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgIGdldFBvb2xTaXplIGluY3JlYXNlcywgYnV0IGRvZXNuJ3Qgb3ZlcmVzdGltYXRlLCB3aGVuIHRocmVhZHMKKyAgICAgKiAgIGJlY29tZSBhY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9vbFNpemUoKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwMS5nZXRQb29sU2l6ZSgpKTsKKyAgICAgICAgcDEuZXhlY3V0ZShuZXcgU21hbGxSdW5uYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHAxLmdldFBvb2xTaXplKCkpOworICAgICAgICBqb2luUG9vbChwMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICAgIGdldFRhc2tDb3VudCBpbmNyZWFzZXMsIGJ1dCBkb2Vzbid0IG92ZXJlc3RpbWF0ZSwgd2hlbiB0YXNrcworICAgICAqICAgIHN1Ym1pdHRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYXNrQ291bnQoKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwMS5nZXRUYXNrQ291bnQoKSk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgICAgICBwMS5leGVjdXRlKG5ldyBTbWFsbFJ1bm5hYmxlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHAxLmdldFRhc2tDb3VudCgpKTsKKyAgICAgICAgam9pblBvb2wocDEpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBnZXRUaHJlYWRGYWN0b3J5IHJldHVybnMgZmFjdG9yeSBpbiBjb25zdHJ1Y3RvciBpZiBub3Qgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRocmVhZEZhY3RvcnkoKSB7CisgICAgICAgIFRocmVhZEZhY3RvcnkgdGYgPSBuZXcgU2ltcGxlVGhyZWFkRmFjdG9yeSgpOworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSwgdGYpOworICAgICAgICBhc3NlcnRTYW1lKHRmLCBwLmdldFRocmVhZEZhY3RvcnkoKSk7CisgICAgICAgIGpvaW5Qb29sKHApOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBzZXRUaHJlYWRGYWN0b3J5IHNldHMgdGhlIHRocmVhZCBmYWN0b3J5IHJldHVybmVkIGJ5IGdldFRocmVhZEZhY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGhyZWFkRmFjdG9yeSgpIHsKKyAgICAgICAgVGhyZWFkRmFjdG9yeSB0ZiA9IG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCk7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgcC5zZXRUaHJlYWRGYWN0b3J5KHRmKTsKKyAgICAgICAgYXNzZXJ0U2FtZSh0ZiwgcC5nZXRUaHJlYWRGYWN0b3J5KCkpOworICAgICAgICBqb2luUG9vbChwKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogc2V0VGhyZWFkRmFjdG9yeShudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldFRocmVhZEZhY3RvcnlOdWxsKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnNldFRocmVhZEZhY3RvcnkobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgIGlzIGlzU2h1dERvd24gaXMgZmFsc2UgYmVmb3JlIHNodXRkb3duLCB0cnVlIGFmdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzU2h1dGRvd24oKSB7CisgICAgICAgIAorICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocDEuaXNTaHV0ZG93bigpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7IHAxLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShwMS5pc1NodXRkb3duKCkpOworICAgIH0KKworICAgICAgICAKKyAgICAvKioKKyAgICAgKiAgIGlzVGVybWluYXRlZCBpcyBmYWxzZSBiZWZvcmUgdGVybWluYXRpb24sIHRydWUgYWZ0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUZXJtaW5hdGVkKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcDEuZXhlY3V0ZShuZXcgU21hbGxSdW5uYWJsZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7IHAxLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocDEuYXdhaXRUZXJtaW5hdGlvbihMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocDEuaXNUZXJtaW5hdGVkKCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogIGlzVGVybWluYXRpbmcgaXMgbm90IHRydWUgd2hlbiBydW5uaW5nIG9yIHdoZW4gdGVybWluYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJc1Rlcm1pbmF0aW5nKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICBhc3NlcnRGYWxzZShwMS5pc1Rlcm1pbmF0aW5nKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcDEuZXhlY3V0ZShuZXcgU21hbGxSdW5uYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHAxLmlzVGVybWluYXRpbmcoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyBwMS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmF3YWl0VGVybWluYXRpb24oTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmlzVGVybWluYXRlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHAxLmlzVGVybWluYXRpbmcoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRRdWV1ZSByZXR1cm5zIHRoZSB3b3JrIHF1ZXVlLCB3aGljaCBjb250YWlucyBxdWV1ZWQgdGFza3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVldWUoKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIFNjaGVkdWxlZEZ1dHVyZVtdIHRhc2tzID0gbmV3IFNjaGVkdWxlZEZ1dHVyZVs1XTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICAgICAgICB0YXNrc1tpXSA9IHAxLnNjaGVkdWxlKG5ldyBTbWFsbFBvc3NpYmx5SW50ZXJydXB0ZWRSdW5uYWJsZSgpLCAxLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4gcSA9IHAxLmdldFF1ZXVlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnModGFza3NbNF0pKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHEuY29udGFpbnModGFza3NbMF0pKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2wocDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlKHRhc2spIHJlbW92ZXMgcXVldWVkIHRhc2ssIGFuZCBmYWlscyB0byByZW1vdmUgYWN0aXZlIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICBTY2hlZHVsZWRGdXR1cmVbXSB0YXNrcyA9IG5ldyBTY2hlZHVsZWRGdXR1cmVbNV07CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1OyBpKyspeworICAgICAgICAgICAgdGFza3NbaV0gPSBwMS5zY2hlZHVsZShuZXcgU21hbGxQb3NzaWJseUludGVycnVwdGVkUnVubmFibGUoKSwgMSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIEJsb2NraW5nUXVldWU8UnVubmFibGU+IHEgPSBwMS5nZXRRdWV1ZSgpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocDEucmVtb3ZlKChSdW5uYWJsZSl0YXNrc1swXSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKChSdW5uYWJsZSl0YXNrc1s0XSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKChSdW5uYWJsZSl0YXNrc1szXSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwMS5yZW1vdmUoKFJ1bm5hYmxlKXRhc2tzWzRdKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShwMS5yZW1vdmUoKFJ1bm5hYmxlKXRhc2tzWzRdKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zKChSdW5uYWJsZSl0YXNrc1s0XSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKChSdW5uYWJsZSl0YXNrc1szXSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwMS5yZW1vdmUoKFJ1bm5hYmxlKXRhc2tzWzNdKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zKChSdW5uYWJsZSl0YXNrc1szXSkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgcHVyZ2UgcmVtb3ZlcyBjYW5jZWxsZWQgdGFza3MgZnJvbSB0aGUgcXVldWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVyZ2UoKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIFNjaGVkdWxlZEZ1dHVyZVtdIHRhc2tzID0gbmV3IFNjaGVkdWxlZEZ1dHVyZVs1XTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICAgICAgICB0YXNrc1tpXSA9IHAxLnNjaGVkdWxlKG5ldyBTbWFsbFBvc3NpYmx5SW50ZXJydXB0ZWRSdW5uYWJsZSgpLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IG1heCA9IDU7CisgICAgICAgICAgICBpZiAodGFza3NbNF0uY2FuY2VsKHRydWUpKSAtLW1heDsKKyAgICAgICAgICAgIGlmICh0YXNrc1szXS5jYW5jZWwodHJ1ZSkpIC0tbWF4OworICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBldmVudHVhbGx5IGJlIGFuIGludGVyZmVyZW5jZS1mcmVlIHBvaW50IGF0CisgICAgICAgICAgICAvLyB3aGljaCBwdXJnZSB3aWxsIG5vdCBmYWlsLiAoQXQgd29yc3QsIHdoZW4gcXVldWUgaXMgZW1wdHkuKQorICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgU01BTExfREVMQVlfTVM7ICsraykgeworICAgICAgICAgICAgICAgIHAxLnB1cmdlKCk7CisgICAgICAgICAgICAgICAgbG9uZyBjb3VudCA9IHAxLmdldFRhc2tDb3VudCgpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSAwICYmIGNvdW50IDw9IG1heCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShrIDwgU01BTExfREVMQVlfTVMpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgc2h1dERvd25Ob3cgcmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0YXNrcyB0aGF0IHdlcmUgbm90IHJ1bgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaHV0RG93bk5vdygpIHsKKyAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHAxLnNjaGVkdWxlKG5ldyBTbWFsbFBvc3NpYmx5SW50ZXJydXB0ZWRSdW5uYWJsZSgpLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgTGlzdCBsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbCA9IHAxLnNodXRkb3duTm93KCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUocDEuaXNTaHV0ZG93bigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsLnNpemUoKSA+IDAgJiYgbC5zaXplKCkgPD0gNSk7CisgICAgICAgIGpvaW5Qb29sKHAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbiBkZWZhdWx0IHNldHRpbmcsIHNodXRkb3duIGNhbmNlbHMgcGVyaW9kaWMgYnV0IG5vdCBkZWxheWVkCisgICAgICogdGFza3MgYXQgc2h1dGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2h1dERvd24xKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocDEuZ2V0RXhlY3V0ZUV4aXN0aW5nRGVsYXllZFRhc2tzQWZ0ZXJTaHV0ZG93blBvbGljeSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHAxLmdldENvbnRpbnVlRXhpc3RpbmdQZXJpb2RpY1Rhc2tzQWZ0ZXJTaHV0ZG93blBvbGljeSgpKTsKKworICAgICAgICAgICAgU2NoZWR1bGVkRnV0dXJlW10gdGFza3MgPSBuZXcgU2NoZWR1bGVkRnV0dXJlWzVdOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB0YXNrc1tpXSA9IHAxLnNjaGVkdWxlKG5ldyBOb09wUnVubmFibGUoKSwgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB0cnkgeyBwMS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICAgICAgQmxvY2tpbmdRdWV1ZSBxID0gcDEuZ2V0UXVldWUoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBxLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTY2hlZHVsZWRGdXR1cmUgdCA9IChTY2hlZHVsZWRGdXR1cmUpaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHQuaXNDYW5jZWxsZWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmlzU2h1dGRvd24oKSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRhc2tzW2ldLmlzRG9uZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSh0YXNrc1tpXS5pc0NhbmNlbGxlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZiBzZXRFeGVjdXRlRXhpc3RpbmdEZWxheWVkVGFza3NBZnRlclNodXRkb3duUG9saWN5IGlzIGZhbHNlLAorICAgICAqIGRlbGF5ZWQgdGFza3MgYXJlIGNhbmNlbGxlZCBhdCBzaHV0ZG93bgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaHV0RG93bjIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEpOworICAgICAgICAgICAgcDEuc2V0RXhlY3V0ZUV4aXN0aW5nRGVsYXllZFRhc2tzQWZ0ZXJTaHV0ZG93blBvbGljeShmYWxzZSk7CisgICAgICAgICAgICBTY2hlZHVsZWRGdXR1cmVbXSB0YXNrcyA9IG5ldyBTY2hlZHVsZWRGdXR1cmVbNV07CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHRhc2tzW2ldID0gcDEuc2NoZWR1bGUobmV3IE5vT3BSdW5uYWJsZSgpLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIHRyeSB7IHAxLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmlzU2h1dGRvd24oKSk7CisgICAgICAgICAgICBCbG9ja2luZ1F1ZXVlIHEgPSBwMS5nZXRRdWV1ZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwMS5pc1Rlcm1pbmF0ZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElmIHNldENvbnRpbnVlRXhpc3RpbmdQZXJpb2RpY1Rhc2tzQWZ0ZXJTaHV0ZG93blBvbGljeSBpcyBzZXQgZmFsc2UsCisgICAgICogcGVyaW9kaWMgdGFza3MgYXJlIG5vdCBjYW5jZWxsZWQgYXQgc2h1dGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2h1dERvd24zKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxKTsKKyAgICAgICAgICAgIHAxLnNldENvbnRpbnVlRXhpc3RpbmdQZXJpb2RpY1Rhc2tzQWZ0ZXJTaHV0ZG93blBvbGljeShmYWxzZSk7CisgICAgICAgICAgICBTY2hlZHVsZWRGdXR1cmUgdGFzayA9CisgICAgICAgICAgICAgICAgcDEuc2NoZWR1bGVBdEZpeGVkUmF0ZShuZXcgTm9PcFJ1bm5hYmxlKCksIDUsIDUsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB0cnkgeyBwMS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwMS5pc1NodXRkb3duKCkpOworICAgICAgICAgICAgQmxvY2tpbmdRdWV1ZSBxID0gcDEuZ2V0UXVldWUoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocDEuaXNUZXJtaW5hdGVkKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaWYgc2V0Q29udGludWVFeGlzdGluZ1BlcmlvZGljVGFza3NBZnRlclNodXRkb3duUG9saWN5IGlzIHRydWUsCisgICAgICogcGVyaW9kaWMgdGFza3MgYXJlIGNhbmNlbGxlZCBhdCBzaHV0ZG93bgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaHV0RG93bjQoKSB7CisgICAgICAgIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwMS5zZXRDb250aW51ZUV4aXN0aW5nUGVyaW9kaWNUYXNrc0FmdGVyU2h1dGRvd25Qb2xpY3kodHJ1ZSk7CisgICAgICAgICAgICBTY2hlZHVsZWRGdXR1cmUgdGFzayA9CisgICAgICAgICAgICAgICAgcDEuc2NoZWR1bGVBdEZpeGVkUmF0ZShuZXcgTm9PcFJ1bm5hYmxlKCksIDEsIDEsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0YXNrLmlzQ2FuY2VsbGVkKCkpOworICAgICAgICAgICAgdHJ5IHsgcDEuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHRhc2suaXNDYW5jZWxsZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShwMS5pc1Rlcm1pbmF0ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmlzU2h1dGRvd24oKSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGFzay5pc0NhbmNlbGxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodGFzay5jYW5jZWwodHJ1ZSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrLmlzRG9uZSgpKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmlzVGVybWluYXRlZCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsgCisgICAgICAgICAgICBqb2luUG9vbChwMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wbGV0ZWQgc3VibWl0IG9mIGNhbGxhYmxlIHJldHVybnMgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN1Ym1pdENhbGxhYmxlKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGdXR1cmU8U3RyaW5nPiBmdXR1cmUgPSBlLnN1Ym1pdChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGxldGVkIHN1Ym1pdCBvZiBydW5uYWJsZSByZXR1cm5zIHN1Y2Nlc3NmdWxseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRSdW5uYWJsZSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IGUuc3VibWl0KG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgICAgICBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZ1dHVyZS5pc0RvbmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21wbGV0ZWQgc3VibWl0IG9mIChydW5uYWJsZSwgcmVzdWx0KSByZXR1cm5zIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRSdW5uYWJsZTIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGZ1dHVyZSA9IGUuc3VibWl0KG5ldyBOb09wUnVubmFibGUoKSwgVEVTVF9TVFJJTkcpOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoVEVTVF9TVFJJTkcsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbnkobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbnkxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLmludm9rZUFueShudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbnkoZW1wdHkgY29sbGVjdGlvbikgdGhyb3dzIElBRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbnkyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLmludm9rZUFueShuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbnkoYykgdGhyb3dzIE5QRSBpZiBjIGhhcyBudWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFueTMoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBsLmFkZChudWxsKTsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KGwpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludm9rZUFueShjKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIGlmIG5vIHRhc2sgY29tcGxldGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFueTQoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IE5QRVRhc2soKSk7CisgICAgICAgICAgICBlLmludm9rZUFueShsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52b2tlQW55KGMpIHJldHVybnMgcmVzdWx0IG9mIHNvbWUgdGFzaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbnk1KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZS5pbnZva2VBbnkobCk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbGwxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLmludm9rZUFsbChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbGwoZW1wdHkgY29sbGVjdGlvbikgcmV0dXJucyBlbXB0eSBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFsbDIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8RnV0dXJlPFN0cmluZz4+IHIgPSBlLmludm9rZUFsbChuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmlzRW1wdHkoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludm9rZUFsbChjKSB0aHJvd3MgTlBFIGlmIGMgaGFzIG51bGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQWxsMygpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbGwobCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IG9mIGludm9rZUFsbChjKSB0aHJvd3MgZXhjZXB0aW9uIG9uIGZhaWxlZCB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFsbDQoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IE5QRVRhc2soKSk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHQgPSBlLmludm9rZUFsbChsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RnV0dXJlPFN0cmluZz4+IGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIAorICAgICAgICAgICAgICAgIGl0Lm5leHQoKS5nZXQoKTsKKyAgICAgICAgfSBjYXRjaChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbGwoYykgcmV0dXJucyByZXN1bHRzIG9mIGFsbCBjb21wbGV0ZWQgdGFza3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQWxsNSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gcmVzdWx0ID0gZS5pbnZva2VBbGwobCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEZ1dHVyZTxTdHJpbmc+PiBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSAKKyAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCBpdC5uZXh0KCkuZ2V0KCkpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFueTEoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KG51bGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoLCxudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQW55TnVsbFRpbWVVbml0KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgZS5pbnZva2VBbnkobCwgTUVESVVNX0RFTEFZX01TLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoZW1wdHkgY29sbGVjdGlvbikgdGhyb3dzIElBRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFueTIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKSwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoYykgdGhyb3dzIE5QRSBpZiBjIGhhcyBudWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQW55MygpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbnkobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQW55KGMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgbm8gdGFzayBjb21wbGV0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnk0KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBOUEVUYXNrKCkpOworICAgICAgICAgICAgZS5pbnZva2VBbnkobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFueShjKSByZXR1cm5zIHJlc3VsdCBvZiBzb21lIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnk1KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZS5pbnZva2VBbnkobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShURVNUX1NUUklORywgcmVzdWx0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQWxsKG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbGwxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLmludm9rZUFsbChudWxsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQWxsKCwsbnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbE51bGxUaW1lVW5pdCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGUuaW52b2tlQWxsKGwsIE1FRElVTV9ERUxBWV9NUywgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQWxsKGVtcHR5IGNvbGxlY3Rpb24pIHJldHVybnMgZW1wdHkgY29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbDIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8RnV0dXJlPFN0cmluZz4+IHIgPSBlLmludm9rZUFsbChuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCksIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoci5pc0VtcHR5KCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbGwoYykgdGhyb3dzIE5QRSBpZiBjIGhhcyBudWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQWxsMygpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbGwobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBvZiBlbGVtZW50IG9mIGludm9rZUFsbChjKSB0aHJvd3MgZXhjZXB0aW9uIG9uIGZhaWxlZCB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQWxsNCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgTlBFVGFzaygpKTsKKyAgICAgICAgICAgIExpc3Q8RnV0dXJlPFN0cmluZz4+IHJlc3VsdCA9IGUuaW52b2tlQWxsKGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RnV0dXJlPFN0cmluZz4+IGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIAorICAgICAgICAgICAgICAgIGl0Lm5leHQoKS5nZXQoKTsKKyAgICAgICAgfSBjYXRjaChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbGwoYykgcmV0dXJucyByZXN1bHRzIG9mIGFsbCBjb21wbGV0ZWQgdGFza3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbGw1KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHQgPSBlLmludm9rZUFsbChsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEZ1dHVyZTxTdHJpbmc+PiBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSAKKyAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCBpdC5uZXh0KCkuZ2V0KCkpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbGwoYykgY2FuY2VscyB0YXNrcyBub3QgY29tcGxldGVkIGJ5IHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbGw2KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQoRXhlY3V0b3JzLmNhbGxhYmxlKG5ldyBNZWRpdW1Qb3NzaWJseUludGVycnVwdGVkUnVubmFibGUoKSwgVEVTVF9TVFJJTkcpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gcmVzdWx0ID0gZS5pbnZva2VBbGwobCwgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBJdGVyYXRvcjxGdXR1cmU8U3RyaW5nPj4gaXQgPSByZXN1bHQuaXRlcmF0b3IoKTsgCisgICAgICAgICAgICBGdXR1cmU8U3RyaW5nPiBmMSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGYyID0gaXQubmV4dCgpOworICAgICAgICAgICAgRnV0dXJlPFN0cmluZz4gZjMgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGYxLmlzRG9uZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZjIuaXNEb25lKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmMy5pc0RvbmUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShmMS5pc0NhbmNlbGxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZjIuaXNDYW5jZWxsZWQoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1NlbWFwaG9yZVRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvU2VtYXBob3JlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQwMTk4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1NlbWFwaG9yZVRlc3QuamF2YQpAQCAtMCwwICsxLDkxOSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgU2VtYXBob3JlVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShTZW1hcGhvcmVUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzcyB0byBleHBvc2UgcHJvdGVjdGVkIG1ldGhvZHMKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgUHVibGljU2VtYXBob3JlIGV4dGVuZHMgU2VtYXBob3JlIHsKKyAgICAgICAgUHVibGljU2VtYXBob3JlKGludCBwLCBib29sZWFuIGYpIHsgc3VwZXIocCwgZik7IH0KKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248VGhyZWFkPiBnZXRRdWV1ZWRUaHJlYWRzKCkgeyAKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRRdWV1ZWRUaHJlYWRzKCk7IAorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHJlZHVjZVBlcm1pdHMoaW50IHApIHsgCisgICAgICAgICAgICBzdXBlci5yZWR1Y2VQZXJtaXRzKHApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBydW5uYWJsZSBjYWxsaW5nIGFjcXVpcmUKKyAgICAgKi8KKyAgICBjbGFzcyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBmaW5hbCBTZW1hcGhvcmUgbG9jazsKKyAgICAgICAgSW50ZXJydXB0aWJsZUxvY2tSdW5uYWJsZShTZW1hcGhvcmUgbCkgeyBsb2NrID0gbDsgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgcnVubmFibGUgY2FsbGluZyBhY3F1aXJlIHRoYXQgZXhwZWN0cyB0byBiZQorICAgICAqIGludGVycnVwdGVkCisgICAgICovCisgICAgY2xhc3MgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIGZpbmFsIFNlbWFwaG9yZSBsb2NrOworICAgICAgICBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZShTZW1hcGhvcmUgbCkgeyBsb2NrID0gbDsgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFplcm8sIG5lZ2F0aXZlLCBhbmQgcG9zaXRpdmUgaW5pdGlhbCB2YWx1ZXMgYXJlIGFsbG93ZWQgaW4gY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIFNlbWFwaG9yZSBzMCA9IG5ldyBTZW1hcGhvcmUoMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgczAuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoczAuaXNGYWlyKCkpOworICAgICAgICBTZW1hcGhvcmUgczEgPSBuZXcgU2VtYXBob3JlKC0xLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgczEuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoczEuaXNGYWlyKCkpOworICAgICAgICBTZW1hcGhvcmUgczIgPSBuZXcgU2VtYXBob3JlKC0xLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgczIuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoczIuaXNGYWlyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHdpdGhvdXQgZmFpcm5lc3MgYXJndW1lbnQgYmVoYXZlcyBhcyBub25mYWlyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpIHsKKyAgICAgICAgU2VtYXBob3JlIHMwID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHMwLmF2YWlsYWJsZVBlcm1pdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHMwLmlzRmFpcigpKTsKKyAgICAgICAgU2VtYXBob3JlIHMxID0gbmV3IFNlbWFwaG9yZSgtMSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgczEuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoczEuaXNGYWlyKCkpOworICAgICAgICBTZW1hcGhvcmUgczIgPSBuZXcgU2VtYXBob3JlKC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzMi5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShzMi5pc0ZhaXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdHJ5QWNxdWlyZSBzdWNjZWVkcyB3aGVuIHN1ZmZpY2llbnQgcGVybWl0cywgZWxzZSBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUcnlBY3F1aXJlSW5TYW1lVGhyZWFkKCkgeworICAgICAgICBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMiwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzLmF2YWlsYWJsZVBlcm1pdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHMudHJ5QWNxdWlyZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlIGFuZCByZWxlYXNlIG9mIHNlbWFwaG9yZSBzdWNjZWVkIGlmIGluaXRpYWxseSBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNxdWlyZVJlbGVhc2VJblNhbWVUaHJlYWQoKSB7CisgICAgICAgIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgxLCBmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmF2YWlsYWJsZVBlcm1pdHMoKSk7CisgICAgICAgIH0gY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5pbnRlcnJ1cHRpYmxlIGFjcXVpcmUgYW5kIHJlbGVhc2Ugb2Ygc2VtYXBob3JlIHN1Y2NlZWQgaWYKKyAgICAgKiBpbml0aWFsbHkgYXZhaWxhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVVbmludGVycnVwdGlibHlSZWxlYXNlSW5TYW1lVGhyZWFkKCkgeworICAgICAgICBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMSwgZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5hY3F1aXJlVW5pbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZVVuaW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLmFjcXVpcmVVbmludGVycnVwdGlibHkoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5hY3F1aXJlVW5pbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZVVuaW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGltZWQgQWNxdWlyZSBhbmQgcmVsZWFzZSBvZiBzZW1hcGhvcmUgc3VjY2VlZCBpZgorICAgICAqIGluaXRpYWxseSBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRBY3F1aXJlUmVsZWFzZUluU2FtZVRocmVhZCgpIHsKKyAgICAgICAgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDEsIGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy50cnlBY3F1aXJlKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZShTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy50cnlBY3F1aXJlKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICB9IGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcmVsZWFzZSBpbiBvbmUgdGhyZWFkIGVuYWJsZXMgYW4gYWNxdWlyZSBpbiBhbm90aGVyIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBY3F1aXJlUmVsZWFzZUluRGlmZmVyZW50VGhyZWFkcygpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDAsIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSByZWxlYXNlIGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhbiB1bmludGVycnVwdGlibGUgYWNxdWlyZSBpbiBhbm90aGVyIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmludGVycnVwdGlibGVBY3F1aXJlUmVsZWFzZUluRGlmZmVyZW50VGhyZWFkcygpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDAsIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHMuYWNxdWlyZVVuaW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIHMuYWNxdWlyZVVuaW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLmFjcXVpcmVVbmludGVycnVwdGlibHkoKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZVVuaW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBBIHJlbGVhc2UgaW4gb25lIHRocmVhZCBlbmFibGVzIGEgdGltZWQgYWNxdWlyZSBpbiBhbm90aGVyIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEFjcXVpcmVSZWxlYXNlSW5EaWZmZXJlbnRUaHJlYWRzKCkgeworICAgICAgICBmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMSwgZmFsc2UpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHMudHJ5QWNxdWlyZShTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy50cnlBY3F1aXJlKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgd2FpdGluZyBhY3F1aXJlIGJsb2NrcyBpbnRlcnJ1cHRpYmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVfSW50ZXJydXB0ZWRFeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgwLCBmYWxzZSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgQSB3YWl0aW5nIHRpbWVkIGFjcXVpcmUgYmxvY2tzIGludGVycnVwdGlibHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ5QWNxdWlyZV9JbnRlcnJ1cHRlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDAsIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLnRyeUFjcXVpcmUoTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzUXVldWVkVGhyZWFkcyByZXBvcnRzIHdoZXRoZXIgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNRdWV1ZWRUaHJlYWRzKCkgeyAKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIGxvY2sgPSBuZXcgU2VtYXBob3JlKDEsIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGxvY2suaGFzUXVldWVkVGhyZWFkcygpKTsKKyAgICAgICAgICAgIGxvY2suYWNxdWlyZVVuaW50ZXJydXB0aWJseSgpOworICAgICAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suaGFzUXVldWVkVGhyZWFkcygpKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmhhc1F1ZXVlZFRocmVhZHMoKSk7CisgICAgICAgICAgICB0MS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suaGFzUXVldWVkVGhyZWFkcygpKTsKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGxvY2suaGFzUXVldWVkVGhyZWFkcygpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogZ2V0UXVldWVMZW5ndGggcmVwb3J0cyBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXVlTGVuZ3RoKCkgeyAKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIGxvY2sgPSBuZXcgU2VtYXBob3JlKDEsIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay5hY3F1aXJlVW5pbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxvY2suZ2V0UXVldWVMZW5ndGgoKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworICAgIC8qKgorICAgICAqIGdldFF1ZXVlZFRocmVhZHMgaW5jbHVkZXMgd2FpdGluZyB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXVlZFRocmVhZHMoKSB7IAorICAgICAgICBmaW5hbCBQdWJsaWNTZW1hcGhvcmUgbG9jayA9IG5ldyBQdWJsaWNTZW1hcGhvcmUoMSwgZmFsc2UpOworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRlZExvY2tSdW5uYWJsZShsb2NrKSk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IEludGVycnVwdGlibGVMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFF1ZXVlZFRocmVhZHMoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgbG9jay5hY3F1aXJlVW5pbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvY2suZ2V0UXVldWVkVGhyZWFkcygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NrLmdldFF1ZXVlZFRocmVhZHMoKS5jb250YWlucyh0MikpOworICAgICAgICAgICAgdDEuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuY29udGFpbnModDIpKTsKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jay5nZXRRdWV1ZWRUaHJlYWRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgICAgIHQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyoqCisgICAgICogZHJhaW5QZXJtaXRzIHJlcG9ydHMgYW5kIHJlbW92ZXMgZ2l2ZW4gbnVtYmVyIG9mIHBlcm1pdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5QZXJtaXRzKCkgeworICAgICAgICBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcy5kcmFpblBlcm1pdHMoKSk7CisgICAgICAgIHMucmVsZWFzZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHMuZHJhaW5QZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcy5kcmFpblBlcm1pdHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVkdWNlUGVybWl0cyByZWR1Y2VzIG51bWJlciBvZiBwZXJtaXRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlZHVjZVBlcm1pdHMoKSB7CisgICAgICAgIFB1YmxpY1NlbWFwaG9yZSBzID0gbmV3IFB1YmxpY1NlbWFwaG9yZSgxMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHMuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgcy5yZWR1Y2VQZXJtaXRzKDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBzLnJlZHVjZVBlcm1pdHMoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHMuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhIGRlc2VyaWFsaXplZCBzZXJpYWxpemVkIHNlbWFwaG9yZSBoYXMgc2FtZSBudW1iZXIgb2YgcGVybWl0cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgeworICAgICAgICBTZW1hcGhvcmUgbCA9IG5ldyBTZW1hcGhvcmUoMywgZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbC5hY3F1aXJlKCk7CisgICAgICAgICAgICBsLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm91dCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGwpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmluKSk7CisgICAgICAgICAgICBTZW1hcGhvcmUgciA9IChTZW1hcGhvcmUpIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByLmF2YWlsYWJsZVBlcm1pdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShyLmlzRmFpcigpKTsKKyAgICAgICAgICAgIHIuYWNxdWlyZSgpOworICAgICAgICAgICAgci5yZWxlYXNlKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBaZXJvLCBuZWdhdGl2ZSwgYW5kIHBvc2l0aXZlIGluaXRpYWwgdmFsdWVzIGFyZSBhbGxvd2VkIGluIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX2ZhaXIoKSB7CisgICAgICAgIFNlbWFwaG9yZSBzMCA9IG5ldyBTZW1hcGhvcmUoMCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzMC5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHMwLmlzRmFpcigpKTsKKyAgICAgICAgU2VtYXBob3JlIHMxID0gbmV3IFNlbWFwaG9yZSgtMSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgczEuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgU2VtYXBob3JlIHMyID0gbmV3IFNlbWFwaG9yZSgtMSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgczIuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0cnlBY3F1aXJlIHN1Y2NlZWRzIHdoZW4gc3VmZmljaWVudCBwZXJtaXRzLCBlbHNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRyeUFjcXVpcmVJblNhbWVUaHJlYWRfZmFpcigpIHsKKyAgICAgICAgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDIsIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzLmF2YWlsYWJsZVBlcm1pdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHMudHJ5QWNxdWlyZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0cnlBY3F1aXJlKG4pIHN1Y2NlZWRzIHdoZW4gc3VmZmljaWVudCBwZXJtaXRzLCBlbHNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRyeUFjcXVpcmVOSW5TYW1lVGhyZWFkX2ZhaXIoKSB7CisgICAgICAgIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgyLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHMuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShzLnRyeUFjcXVpcmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNxdWlyZSBhbmQgcmVsZWFzZSBvZiBzZW1hcGhvcmUgc3VjY2VlZCBpZiBpbml0aWFsbHkgYXZhaWxhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVSZWxlYXNlSW5TYW1lVGhyZWFkX2ZhaXIoKSB7CisgICAgICAgIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgxLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuYWNxdWlyZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgfSBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlKG4pIGFuZCByZWxlYXNlKG4pIG9mIHNlbWFwaG9yZSBzdWNjZWVkIGlmIGluaXRpYWxseSBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNxdWlyZVJlbGVhc2VOSW5TYW1lVGhyZWFkX2ZhaXIoKSB7CisgICAgICAgIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgxLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMucmVsZWFzZSgxKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZSgxKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgyKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZSgyKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgzKTsKKyAgICAgICAgICAgIHMuYWNxdWlyZSgzKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSg0KTsKKyAgICAgICAgICAgIHMuYWNxdWlyZSg0KTsKKyAgICAgICAgICAgIHMucmVsZWFzZSg1KTsKKyAgICAgICAgICAgIHMuYWNxdWlyZSg1KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmF2YWlsYWJsZVBlcm1pdHMoKSk7CisgICAgICAgIH0gY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNxdWlyZShuKSBhbmQgcmVsZWFzZShuKSBvZiBzZW1hcGhvcmUgc3VjY2VlZCBpZiBpbml0aWFsbHkgYXZhaWxhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVVbmludGVycnVwdGlibHlSZWxlYXNlTkluU2FtZVRocmVhZF9mYWlyKCkgeworICAgICAgICBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLnJlbGVhc2UoMSk7CisgICAgICAgICAgICBzLmFjcXVpcmVVbmludGVycnVwdGlibHkoMSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoMik7CisgICAgICAgICAgICBzLmFjcXVpcmVVbmludGVycnVwdGlibHkoMik7CisgICAgICAgICAgICBzLnJlbGVhc2UoMyk7CisgICAgICAgICAgICBzLmFjcXVpcmVVbmludGVycnVwdGlibHkoMyk7CisgICAgICAgICAgICBzLnJlbGVhc2UoNCk7CisgICAgICAgICAgICBzLmFjcXVpcmVVbmludGVycnVwdGlibHkoNCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoNSk7CisgICAgICAgICAgICBzLmFjcXVpcmVVbmludGVycnVwdGlibHkoNSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVsZWFzZShuKSBpbiBvbmUgdGhyZWFkIGVuYWJsZXMgdGltZWQgYWNxdWlyZShuKSBpbiBhbm90aGVyIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEFjcXVpcmVSZWxlYXNlTkluU2FtZVRocmVhZF9mYWlyKCkgeworICAgICAgICBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLnJlbGVhc2UoMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSgxLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoMik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSgyLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoMyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSgzLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoNCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSg0LCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoNSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSg1LCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcy5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICB9IGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbGVhc2UgaW4gb25lIHRocmVhZCBlbmFibGVzIHRpbWVkIGFjcXVpcmUgaW4gYW5vdGhlciB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRBY3F1aXJlUmVsZWFzZUluU2FtZVRocmVhZF9mYWlyKCkgeworICAgICAgICBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZShTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy50cnlBY3F1aXJlKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHMudHJ5QWNxdWlyZShTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy50cnlBY3F1aXJlKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgfSBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHJlbGVhc2UgaW4gb25lIHRocmVhZCBlbmFibGVzIGFuIGFjcXVpcmUgaW4gYW5vdGhlciB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNxdWlyZVJlbGVhc2VJbkRpZmZlcmVudFRocmVhZHNfZmFpcigpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDAsIHRydWUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHMuYXZhaWxhYmxlUGVybWl0cygpKTsKKyAgICAgICAgfSBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWxlYXNlKG4pIGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhY3F1aXJlKG4pIGluIGFub3RoZXIgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVSZWxlYXNlTkluRGlmZmVyZW50VGhyZWFkc19mYWlyKCkgeworICAgICAgICBmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMCwgdHJ1ZSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLnJlbGVhc2UoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBzLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBzLnJlbGVhc2UoMik7CisgICAgICAgICAgICBzLmFjcXVpcmUoMik7CisgICAgICAgICAgICBzLnJlbGVhc2UoMSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWxlYXNlKG4pIGluIG9uZSB0aHJlYWQgZW5hYmxlcyBhY3F1aXJlKG4pIGluIGFub3RoZXIgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVSZWxlYXNlTkluRGlmZmVyZW50VGhyZWFkc19mYWlyMigpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDAsIHRydWUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYWNxdWlyZSgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYWNxdWlyZSgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMucmVsZWFzZSg0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBzLnJlbGVhc2UoNik7CisgICAgICAgICAgICBzLmFjcXVpcmUoMik7CisgICAgICAgICAgICBzLmFjcXVpcmUoMik7CisgICAgICAgICAgICBzLnJlbGVhc2UoMik7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworCisKKworICAgIC8qKgorICAgICAqIHJlbGVhc2UgaW4gb25lIHRocmVhZCBlbmFibGVzIHRpbWVkIGFjcXVpcmUgaW4gYW5vdGhlciB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRBY3F1aXJlUmVsZWFzZUluRGlmZmVyZW50VGhyZWFkc19mYWlyKCkgeworICAgICAgICBmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMSwgdHJ1ZSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0VHJ1ZShzLnRyeUFjcXVpcmUoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWxlYXNlKG4pIGluIG9uZSB0aHJlYWQgZW5hYmxlcyB0aW1lZCBhY3F1aXJlKG4pIGluIGFub3RoZXIgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkQWNxdWlyZVJlbGVhc2VOSW5EaWZmZXJlbnRUaHJlYWRzX2ZhaXIoKSB7CisgICAgICAgIGZpbmFsIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgyLCB0cnVlKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSgyLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLnJlbGVhc2UoMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHMudHJ5QWNxdWlyZSgyLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLnJlbGVhc2UoMik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy50cnlBY3F1aXJlKDIsIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy50cnlBY3F1aXJlKDIsIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHMucmVsZWFzZSgyKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgd2FpdGluZyBhY3F1aXJlIGJsb2NrcyBpbnRlcnJ1cHRpYmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjcXVpcmVfSW50ZXJydXB0ZWRFeGNlcHRpb25fZmFpcigpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDAsIHRydWUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHdhaXRpbmcgYWNxdWlyZShuKSBibG9ja3MgaW50ZXJydXB0aWJseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBY3F1aXJlTl9JbnRlcnJ1cHRlZEV4Y2VwdGlvbl9mYWlyKCkgeworICAgICAgICBmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMiwgdHJ1ZSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy5hY3F1aXJlKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogIEEgd2FpdGluZyB0cnlBY3F1aXJlIGJsb2NrcyBpbnRlcnJ1cHRpYmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRyeUFjcXVpcmVfSW50ZXJydXB0ZWRFeGNlcHRpb25fZmFpcigpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDAsIHRydWUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMudHJ5QWNxdWlyZShNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQSB3YWl0aW5nIHRyeUFjcXVpcmUobikgYmxvY2tzIGludGVycnVwdGlibHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ5QWNxdWlyZU5fSW50ZXJydXB0ZWRFeGNlcHRpb25fZmFpcigpIHsKKyAgICAgICAgZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDEsIHRydWUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMudHJ5QWNxdWlyZSg0LCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRRdWV1ZUxlbmd0aCByZXBvcnRzIG51bWJlciBvZiB3YWl0aW5nIHRocmVhZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVldWVMZW5ndGhfZmFpcigpIHsgCisgICAgICAgIGZpbmFsIFNlbWFwaG9yZSBsb2NrID0gbmV3IFNlbWFwaG9yZSgxLCB0cnVlKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgSW50ZXJydXB0ZWRMb2NrUnVubmFibGUobG9jaykpOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBJbnRlcnJ1cHRpYmxlTG9ja1J1bm5hYmxlKGxvY2spKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay5hY3F1aXJlVW5pbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbG9jay5nZXRRdWV1ZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIHQxLmludGVycnVwdCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NrLmdldFF1ZXVlTGVuZ3RoKCkpOworICAgICAgICAgICAgbG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxvY2suZ2V0UXVldWVMZW5ndGgoKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAKKworCisgICAgLyoqCisgICAgICogYSBkZXNlcmlhbGl6ZWQgc2VyaWFsaXplZCBzZW1hcGhvcmUgaGFzIHNhbWUgbnVtYmVyIG9mIHBlcm1pdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbl9mYWlyKCkgeworICAgICAgICBTZW1hcGhvcmUgbCA9IG5ldyBTZW1hcGhvcmUoMywgdHJ1ZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGwuYWNxdWlyZSgpOworICAgICAgICAgICAgbC5yZWxlYXNlKCk7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChsKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgU2VtYXBob3JlIHIgPSAoU2VtYXBob3JlKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgci5hdmFpbGFibGVQZXJtaXRzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmlzRmFpcigpKTsKKyAgICAgICAgICAgIHIuYWNxdWlyZSgpOworICAgICAgICAgICAgci5yZWxlYXNlKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9TdHJpbmcgaW5kaWNhdGVzIGN1cnJlbnQgbnVtYmVyIG9mIHBlcm1pdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICAgICAgU3RyaW5nIHVzID0gcy50b1N0cmluZygpOworICAgICAgICBhc3NlcnRUcnVlKHVzLmluZGV4T2YoIlBlcm1pdHMgPSAwIikgPj0gMCk7CisgICAgICAgIHMucmVsZWFzZSgpOworICAgICAgICBTdHJpbmcgczEgPSBzLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydFRydWUoczEuaW5kZXhPZigiUGVybWl0cyA9IDEiKSA+PSAwKTsKKyAgICAgICAgcy5yZWxlYXNlKCk7CisgICAgICAgIFN0cmluZyBzMiA9IHMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzMi5pbmRleE9mKCJQZXJtaXRzID0gMiIpID49IDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9TeW5jaHJvbm91c1F1ZXVlVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9TeW5jaHJvbm91c1F1ZXVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5YmRlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1N5bmNocm9ub3VzUXVldWVUZXN0LmphdmEKQEAgLTAsMCArMSw4OTUgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIFN5bmNocm9ub3VzUXVldWVUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShTeW5jaHJvbm91c1F1ZXVlVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBTeW5jaHJvbm91c1F1ZXVlIGlzIGJvdGggZW1wdHkgYW5kIGZ1bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlGdWxsKCkgeworICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBhc3NlcnRUcnVlKHEuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHEuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHEucmVtYWluaW5nQ2FwYWNpdHkoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHEub2ZmZXIoemVybykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZmFpciBTeW5jaHJvbm91c1F1ZXVlIGlzIGJvdGggZW1wdHkgYW5kIGZ1bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpckVtcHR5RnVsbCgpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5vZmZlcih6ZXJvKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb2ZmZXIobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlck51bGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICAgICAgcS5vZmZlcihudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsgfSAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZE51bGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICAgICAgcS5hZGQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvZmZlciBmYWlscyBpZiBubyBhY3RpdmUgdGFrZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2ZmZXIoKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKHEub2ZmZXIob25lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIHRocm93cyBJU0UgaWYgbm8gYWN0aXZlIHRha2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIHEuYWRkKG9uZSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRBbGwodGhpcykgdGhyb3dzIElBRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGxTZWxmKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgICAgIHEuYWRkQWxsKHEpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkQWxsIG9mIGEgY29sbGVjdGlvbiB3aXRoIG51bGwgZWxlbWVudHMgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbMV07CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorICAgIC8qKgorICAgICAqIGFkZEFsbCB0aHJvd3MgSVNFIGlmIG5vIGFjdGl2ZSB0YWtlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGw0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7ICsraSkKKyAgICAgICAgICAgICAgICBpbnRzW2ldID0gbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBxLmFkZEFsbChBcnJheXMuYXNMaXN0KGludHMpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1dE51bGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICAgICAgcS5wdXQobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IAorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCisgICAgICogcHV0IGJsb2NrcyBpbnRlcnJ1cHRpYmx5IGlmIG5vIGFjdGl2ZSB0YWtlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1B1dCgpIHsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQoemVybyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7IAorICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dCBibG9ja3Mgd2FpdGluZyBmb3IgdGFrZSAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0V2l0aFRha2UoKSB7CisgICAgICAgIGZpbmFsIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWRkZWQgPSAwOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2FkZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRkZWQgPj0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBxLnRha2UoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIG9mZmVyIHRpbWVzIG91dCBpZiBlbGVtZW50cyBub3QgdGFrZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRPZmZlcigpIHsKKyAgICAgICAgZmluYWwgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydEZhbHNlKHEub2ZmZXIobmV3IE9iamVjdCgpLCBTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBxLm9mZmVyKG5ldyBPYmplY3QoKSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRha2UgYmxvY2tzIGludGVycnVwdGlibHkgd2hlbiBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUYWtlRnJvbUVtcHR5KCkgeworICAgICAgICBmaW5hbCBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEudGFrZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7IH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHB1dCBibG9ja3MgaW50ZXJydXB0aWJseSBpZiBubyBhY3RpdmUgdGFrZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpckJsb2NraW5nUHV0KCkgeworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQoemVybyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7CisgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7IAorICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHB1dCBibG9ja3Mgd2FpdGluZyBmb3IgdGFrZSAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpclB1dFdpdGhUYWtlKCkgeworICAgICAgICBmaW5hbCBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSh0cnVlKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBhZGRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2FkZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNob3VsZFRocm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGRlZCA+PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHEudGFrZSgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgb2ZmZXIgdGltZXMgb3V0IGlmIGVsZW1lbnRzIG5vdCB0YWtlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlyVGltZWRPZmZlcigpIHsKKyAgICAgICAgZmluYWwgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUodHJ1ZSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRGYWxzZShxLm9mZmVyKG5ldyBPYmplY3QoKSwgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5vZmZlcihuZXcgT2JqZWN0KCksIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0YWtlIGJsb2NrcyBpbnRlcnJ1cHRpYmx5IHdoZW4gZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpclRha2VGcm9tRW1wdHkoKSB7CisgICAgICAgIGZpbmFsIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKHRydWUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEudGFrZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7IH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwb2xsIGZhaWxzIHVubGVzcyBhY3RpdmUgdGFrZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9sbCgpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgcG9vbCB3aXRoIHplcm8gdGltZW91dCB0aW1lcyBvdXQgaWYgbm8gYWN0aXZlIHRha2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkUG9sbDAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgcG9vbCB3aXRoIG5vbnplcm8gdGltZW91dCB0aW1lcyBvdXQgaWYgbm8gYWN0aXZlIHRha2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkUG9sbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgICAgICBhc3NlcnROdWxsKHEucG9sbChTSE9SVF9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJydXB0ZWQgdGltZWQgcG9sbCB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaW5zdGVhZCBvZgorICAgICAqIHJldHVybmluZyB0aW1lb3V0IHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRlZFRpbWVkUG9sbCgpIHsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChxLnBvbGwoU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsgCisgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIHRpbWVkIHBvbGwgYmVmb3JlIGEgZGVsYXllZCBvZmZlciBmYWlsczsgYWZ0ZXIgb2ZmZXIgc3VjY2VlZHM7CisgICAgICogIG9uIGludGVycnVwdGlvbiB0aHJvd3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRQb2xsV2l0aE9mZmVyKCkgeworICAgICAgICBmaW5hbCBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydE51bGwocS5wb2xsKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucG9sbChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wb2xsKExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKHplcm8sIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAgCisKKyAgICAvKioKKyAgICAgKiBJbnRlcnJ1cHRlZCB0aW1lZCBwb2xsIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbnN0ZWFkIG9mCisgICAgICogcmV0dXJuaW5nIHRpbWVvdXQgc3RhdHVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZhaXJJbnRlcnJ1cHRlZFRpbWVkUG9sbCgpIHsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwocS5wb2xsKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7IAorICAgICAgICAgICB0LmludGVycnVwdCgpOworICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICB0aW1lZCBwb2xsIGJlZm9yZSBhIGRlbGF5ZWQgb2ZmZXIgZmFpbHM7IGFmdGVyIG9mZmVyIHN1Y2NlZWRzOworICAgICAqICBvbiBpbnRlcnJ1cHRpb24gdGhyb3dzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZhaXJUaW1lZFBvbGxXaXRoT2ZmZXIoKSB7CisgICAgICAgIGZpbmFsIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKHRydWUpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydE51bGwocS5wb2xsKFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucG9sbChMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgcS5wb2xsKExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7IH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLm9mZmVyKHplcm8sIFNIT1JUX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfSAgCisKKworICAgIC8qKgorICAgICAqIHBlZWsgcmV0dXJucyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBlZWsoKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIGFzc2VydE51bGwocS5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVsZW1lbnQgdGhyb3dzIE5TRUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudCgpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZWxlbWVudCgpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSB0aHJvd3MgTlNFRSBpZiBubyBhY3RpdmUgdGFrZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5yZW1vdmUoKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUoeCkgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50KCkgeworICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBhc3NlcnRGYWxzZShxLnJlbW92ZSh6ZXJvKSk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgIH0KKyAgICAgICAgCisgICAgLyoqCisgICAgICogY29udGFpbnMgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5jb250YWlucyh6ZXJvKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xlYXIgZW5zdXJlcyBpc0VtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBxLmNsZWFyKCk7CisgICAgICAgIGFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnRhaW5zQWxsIHJldHVybnMgZmFsc2UgdW5sZXNzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgeworICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBJbnRlZ2VyW10gZW1wdHkgPSBuZXcgSW50ZWdlclswXTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QoZW1wdHkpKSk7CisgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbMV07IGludHNbMF0gPSB6ZXJvOworICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QoaW50cykpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXRhaW5BbGwgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGwoKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIEludGVnZXJbXSBlbXB0eSA9IG5ldyBJbnRlZ2VyWzBdOworICAgICAgICBhc3NlcnRGYWxzZShxLnJldGFpbkFsbChBcnJheXMuYXNMaXN0KGVtcHR5KSkpOworICAgICAgICBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyWzFdOyBpbnRzWzBdID0gemVybzsKKyAgICAgICAgYXNzZXJ0RmFsc2UocS5yZXRhaW5BbGwoQXJyYXlzLmFzTGlzdChpbnRzKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZUFsbCByZXR1cm5zIGZhbHNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgSW50ZWdlcltdIGVtcHR5ID0gbmV3IEludGVnZXJbMF07CisgICAgICAgIGFzc2VydEZhbHNlKHEucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QoZW1wdHkpKSk7CisgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbMV07IGludHNbMF0gPSB6ZXJvOworICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QoaW50cykpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRvQXJyYXkgaXMgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgT2JqZWN0W10gbyA9IHEudG9BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoby5sZW5ndGgsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRvQXJyYXkoYSkgaXMgbnVsbGVkIGF0IHBvc2l0aW9uIDAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTIoKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIEludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbMV07CisgICAgICAgIGFzc2VydE51bGwoaW50c1swXSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHRvQXJyYXkobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5X0JhZEFyZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgICAgICBPYmplY3Qgb1tdID0gcS50b0FycmF5KG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBpdGVyYXRvciBkb2VzIG5vdCB0cmF2ZXJzZSBhbnkgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHggPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogaXRlcmF0b3IgcmVtb3ZlIHRocm93cyBJU0UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JSZW1vdmUoKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcS5pdGVyYXRvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gc3VjY2Vzcykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyByZXR1cm5zIGEgbm9uLW51bGwgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBTdHJpbmcgcyA9IHEudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsKKyAgICB9ICAgICAgICAKKworCisgICAgLyoqCisgICAgICogb2ZmZXIgdHJhbnNmZXJzIGVsZW1lbnRzIGFjcm9zcyBFeGVjdXRvciB0YXNrcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPZmZlckluRXhlY3V0b3IoKSB7CisgICAgICAgIGZpbmFsIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMik7CisgICAgICAgIGZpbmFsIEludGVnZXIgb25lID0gbmV3IEludGVnZXIoMSk7CisKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RmFsc2UocS5vZmZlcihvbmUpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKHEub2ZmZXIob25lLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRFcXVhbHMoMCwgcS5yZW1haW5pbmdDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXNzZXJ0RXF1YWxzKG9uZSwgcS50YWtlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIGpvaW5Qb29sKGV4ZWN1dG9yKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIHBvbGwgcmV0cmlldmVzIGVsZW1lbnRzIGFjcm9zcyBFeGVjdXRvciB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGxJbkV4ZWN1dG9yKCkgeworICAgICAgICBmaW5hbCBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDIpOworICAgICAgICBleGVjdXRvci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnROdWxsKHEucG9sbCgpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRBc3NlcnRUcnVlKG51bGwgIT0gcS5wb2xsKE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEFzc2VydFRydWUocS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBleGVjdXRvci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU01BTExfREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICBxLnB1dChuZXcgSW50ZWdlcigxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgam9pblBvb2woZXhlY3V0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGEgZGVzZXJpYWxpemVkIHNlcmlhbGl6ZWQgcXVldWUgaXMgdXNhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChxKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgU3luY2hyb25vdXNRdWV1ZSByID0gKFN5bmNocm9ub3VzUXVldWUpaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHEuc2l6ZSgpLCByLnNpemUoKSk7CisgICAgICAgICAgICB3aGlsZSAoIXEuaXNFbXB0eSgpKSAKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocS5yZW1vdmUoKSwgci5yZW1vdmUoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5UbyhudWxsKSB0aHJvd3MgTlBFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvTnVsbCgpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5Ubyh0aGlzKSB0aHJvd3MgSUFFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvU2VsZigpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhxKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8oYykgb2YgZW1wdHkgcXVldWUgZG9lc24ndCB0cmFuc2ZlciBlbGVtZW50cworICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5UbygpIHsKKyAgICAgICAgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHEuZHJhaW5UbyhsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHEuc2l6ZSgpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwuc2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkcmFpblRvIGVtcHRpZXMgcXVldWUsIHVuYmxvY2tpbmcgYSB3YWl0aW5nIHB1dC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgdGVzdERyYWluVG9XaXRoQWN0aXZlUHV0KCkgeworICAgICAgICBmaW5hbCBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEucHV0KG5ldyBJbnRlZ2VyKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpeyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgcS5kcmFpblRvKGwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsLnNpemUoKSA8PSAxKTsKKyAgICAgICAgICAgIGlmIChsLnNpemUoKSA+IDApCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0KDApLCBuZXcgSW50ZWdlcigxKSk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5zaXplKCkgPD0gMSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5UbyhudWxsLCBuKSB0aHJvd3MgTlBFCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvTnVsbE4oKSB7CisgICAgICAgIFN5bmNocm9ub3VzUXVldWUgcSA9IG5ldyBTeW5jaHJvbm91c1F1ZXVlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxLmRyYWluVG8obnVsbCwgMCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRyYWluVG8odGhpcywgbikgdGhyb3dzIElBRQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhaW5Ub1NlbGZOKCkgeworICAgICAgICBTeW5jaHJvbm91c1F1ZXVlIHEgPSBuZXcgU3luY2hyb25vdXNRdWV1ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcS5kcmFpblRvKHEsIDApOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZHJhaW5UbyhjLCBuKSBlbXB0aWVzIHVwIHRvIG4gZWxlbWVudHMgb2YgcXVldWUgaW50byBjCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmFpblRvTigpIHsKKyAgICAgICAgZmluYWwgU3luY2hyb25vdXNRdWV1ZSBxID0gbmV3IFN5bmNocm9ub3VzUXVldWUoKTsKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXQob25lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpeyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLnB1dCh0d28pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSl7IAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgcS5kcmFpblRvKGwsIDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsLnNpemUoKSA9PSAxKTsKKyAgICAgICAgICAgIHEuZHJhaW5UbyhsLCAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobC5zaXplKCkgPT0gMik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGwuY29udGFpbnMob25lKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGwuY29udGFpbnModHdvKSk7CisgICAgICAgICAgICB0MS5qb2luKCk7CisgICAgICAgICAgICB0Mi5qb2luKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvU3lzdGVtVGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9TeXN0ZW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzM2NiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvU3lzdGVtVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKworcHVibGljIGNsYXNzIFN5c3RlbVRlc3QgZXh0ZW5kcyBKU1IxNjZUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7ICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3lzdGVtVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFdvcnN0IGNhc2Ugcm91bmRpbmcgZm9yIG1pbGxpc2Vjczsgc2V0IGZvciA2MCBjeWNsZSBtaWxsaXMgY2xvY2suCisgICAgICogVGhpcyB2YWx1ZSBtaWdodCBuZWVkIHRvIGJlIGNoYW5nZWQgb3MgSlZNcyB3aXRoIGNvYXJzZXIKKyAgICAgKiAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzIGNsb2Nrcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgbG9uZyBNSUxMSVNfUk9VTkQgPSAxNzsKKworICAgIC8qKgorICAgICAqIE5hbm9zIGJldHdlZW4gcmVhZGluZ3Mgb2YgbWlsbGlzIGlzIG5vIGxvbmdlciB0aGFuIG1pbGxpcyAocGx1cworICAgICAqIHBvc3NpYmxlIHJvdW5kaW5nKS4KKyAgICAgKiBUaGlzIHNob3dzIG9ubHkgdGhhdCBuYW5vIHRpbWluZyBub3QgKG11Y2gpIHdvcnNlIHRoYW4gbWlsbGkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5hbm9UaW1lMSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgbTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxKTsKKyAgICAgICAgICAgIGxvbmcgbjEgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBsb25nIG4yID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMSk7CisgICAgICAgICAgICBsb25nIG0yID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb25nIG1pbGxpcyA9IG0yIC0gbTE7CisgICAgICAgICAgICBsb25nIG5hbm9zID0gbjIgLSBuMTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobmFub3MgPj0gMCk7CisgICAgICAgICAgICBsb25nIG5hbm9zQXNNaWxsaXMgPSBuYW5vcyAvIDEwMDAwMDA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG5hbm9zQXNNaWxsaXMgPD0gbWlsbGlzICsgTUlMTElTX1JPVU5EKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWlsbGlzIGJldHdlZW4gcmVhZGluZ3Mgb2YgbmFub3MgaXMgbGVzcyB0aGFuIG5hbm9zLCBhZGp1c3RpbmcKKyAgICAgKiBmb3Igcm91bmRpbmcuCisgICAgICogVGhpcyBzaG93cyBvbmx5IHRoYXQgbmFubyB0aW1pbmcgbm90IChtdWNoKSB3b3JzZSB0aGFuIG1pbGxpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROYW5vVGltZTIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIG4xID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMSk7CisgICAgICAgICAgICBsb25nIG0xID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgbG9uZyBtMiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOworICAgICAgICAgICAgbG9uZyBuMiA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICAgICAgbG9uZyBtaWxsaXMgPSBtMiAtIG0xOworICAgICAgICAgICAgbG9uZyBuYW5vcyA9IG4yIC0gbjE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFRydWUobmFub3MgPj0gMCk7CisgICAgICAgICAgICBsb25nIG5hbm9zQXNNaWxsaXMgPSBuYW5vcyAvIDEwMDAwMDA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1pbGxpcyA8PSBuYW5vc0FzTWlsbGlzICsgTUlMTElTX1JPVU5EKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkTG9jYWxUZXN0LmphdmEgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZExvY2FsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjI1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZExvY2FsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitwdWJsaWMgY2xhc3MgVGhyZWFkTG9jYWxUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGhyZWFkTG9jYWxUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVGhyZWFkTG9jYWw8SW50ZWdlcj4gdGwgPSBuZXcgVGhyZWFkTG9jYWw8SW50ZWdlcj4oKSB7CisgICAgICAgICAgICBwdWJsaWMgSW50ZWdlciBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHN0YXRpYyBJbmhlcml0YWJsZVRocmVhZExvY2FsPEludGVnZXI+IGl0bCA9CisgICAgICAgIG5ldyBJbmhlcml0YWJsZVRocmVhZExvY2FsPEludGVnZXI+KCkgeworICAgICAgICAgICAgcHJvdGVjdGVkIEludGVnZXIgaW5pdGlhbFZhbHVlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwcm90ZWN0ZWQgSW50ZWdlciBjaGlsZFZhbHVlKEludGVnZXIgcGFyZW50VmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIocGFyZW50VmFsdWUuaW50VmFsdWUoKSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgLyoqCisgICAgICogcmVtb3ZlIGNhdXNlcyBuZXh0IGFjY2VzcyB0byByZXR1cm4gaW5pdGlhbCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyh0bC5nZXQoKSwgb25lKTsKKyAgICAgICAgdGwuc2V0KHR3byk7CisgICAgICAgIGFzc2VydEVxdWFscyh0bC5nZXQoKSwgdHdvKTsKKyAgICAgICAgdGwucmVtb3ZlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0bC5nZXQoKSwgb25lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgaW4gSW5oZXJpdGFibGVUaHJlYWRMb2NhbCBjYXVzZXMgbmV4dCBhY2Nlc3MgdG8gcmV0dXJuCisgICAgICogaW5pdGlhbCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJVEwoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhpdGwuZ2V0KCksIHplcm8pOworICAgICAgICBpdGwuc2V0KHR3byk7CisgICAgICAgIGFzc2VydEVxdWFscyhpdGwuZ2V0KCksIHR3byk7CisgICAgICAgIGl0bC5yZW1vdmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0bC5nZXQoKSwgemVybyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBJVExUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBmaW5hbCBpbnRbXSB4OworICAgICAgICBJVExUaHJlYWQoaW50W10gYXJyYXkpIHsgeCA9IGFycmF5OyB9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIFRocmVhZCBjaGlsZCA9IG51bGw7CisgICAgICAgICAgICBpZiAoaXRsLmdldCgpLmludFZhbHVlKCkgPCB4Lmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBjaGlsZCA9IG5ldyBJVExUaHJlYWQoeCk7CisgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkueWllbGQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IHRocmVhZElkID0gaXRsLmdldCgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRocmVhZElkOyBqKyspIHsKKyAgICAgICAgICAgICAgICB4W3RocmVhZElkXSsrOworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkueWllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsgLy8gV2FpdCBmb3IgY2hpbGQgKGlmIGFueSkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5qb2luKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmhlcml0YWJsZVRocmVhZExvY2FsIHByb3BhZ2F0ZXMgZ2VuZXJpYyB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNJVEwoKSB7CisgICAgICAgIGZpbmFsIGludCB0aHJlYWRDb3VudCA9IDEwOworICAgICAgICBmaW5hbCBpbnQgeFtdID0gbmV3IGludFt0aHJlYWRDb3VudF07CisgICAgICAgIFRocmVhZCBwcm9nZW5pdG9yID0gbmV3IElUTFRocmVhZCh4KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2dlbml0b3Iuc3RhcnQoKTsKKyAgICAgICAgICAgIHByb2dlbml0b3Iuam9pbigpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHRocmVhZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgeFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFBvb2xFeGVjdXRvclRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkUG9vbEV4ZWN1dG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhNGJhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFBvb2xFeGVjdXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDE1MDQgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLCAKKyAqIFBhdCBGaXNoZXIsIE1pa2UgSnVkZC4gCisgKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgVGhyZWFkUG9vbEV4ZWN1dG9yVGVzdCBleHRlbmRzIEpTUjE2NlRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7ICAgICAgICAKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUaHJlYWRQb29sRXhlY3V0b3JUZXN0LmNsYXNzKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIGNsYXNzIEV4dGVuZGVkVFBFIGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yIHsKKyAgICAgICAgdm9sYXRpbGUgYm9vbGVhbiBiZWZvcmVDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdm9sYXRpbGUgYm9vbGVhbiBhZnRlckNhbGxlZCA9IGZhbHNlOworICAgICAgICB2b2xhdGlsZSBib29sZWFuIHRlcm1pbmF0ZWRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIEV4dGVuZGVkVFBFKCkgeworICAgICAgICAgICAgc3VwZXIoMSwgMSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgU3luY2hyb25vdXNRdWV1ZTxSdW5uYWJsZT4oKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlRXhlY3V0ZShUaHJlYWQgdCwgUnVubmFibGUgcikgeworICAgICAgICAgICAgYmVmb3JlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZnRlckV4ZWN1dGUoUnVubmFibGUgciwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGFmdGVyQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXJtaW5hdGVkKCkgeworICAgICAgICAgICAgdGVybWluYXRlZENhbGxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZXhlY3V0ZSBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMgYSBydW5uYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIDEsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAxLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNNQUxMX0RFTEFZX01TKTsKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAKKyAgICAgICAgam9pblBvb2wocDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXRBY3RpdmVDb3VudCBpbmNyZWFzZXMgYnV0IGRvZXNuJ3Qgb3ZlcmVzdGltYXRlLCB3aGVuIGEKKyAgICAgKiAgdGhyZWFkIGJlY29tZXMgYWN0aXZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2ZUNvdW50KCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcDIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAyLmdldEFjdGl2ZUNvdW50KCkpOworICAgICAgICBwMi5leGVjdXRlKG5ldyBNZWRpdW1SdW5uYWJsZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwMi5nZXRBY3RpdmVDb3VudCgpKTsKKyAgICAgICAgam9pblBvb2wocDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBwcmVzdGFydENvcmVUaHJlYWQgc3RhcnRzIGEgdGhyZWFkIGlmIHVuZGVyIGNvcmVQb29sU2l6ZSwgZWxzZSBkb2Vzbid0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByZXN0YXJ0Q29yZVRocmVhZCgpIHsKKyAgICAgICAgVGhyZWFkUG9vbEV4ZWN1dG9yIHAyID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwMi5nZXRQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwMi5wcmVzdGFydENvcmVUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwMi5nZXRQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwMi5wcmVzdGFydENvcmVUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwMi5nZXRQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocDIucHJlc3RhcnRDb3JlVGhyZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcDIuZ2V0UG9vbFNpemUoKSk7CisgICAgICAgIGpvaW5Qb29sKHAyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgcHJlc3RhcnRBbGxDb3JlVGhyZWFkcyBzdGFydHMgYWxsIGNvcmVQb29sU2l6ZSB0aHJlYWRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByZXN0YXJ0QWxsQ29yZVRocmVhZHMoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwMiA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcDIuZ2V0UG9vbFNpemUoKSk7CisgICAgICAgIHAyLnByZXN0YXJ0QWxsQ29yZVRocmVhZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHAyLmdldFBvb2xTaXplKCkpOworICAgICAgICBwMi5wcmVzdGFydEFsbENvcmVUaHJlYWRzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwMi5nZXRQb29sU2l6ZSgpKTsKKyAgICAgICAgam9pblBvb2wocDIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgIGdldENvbXBsZXRlZFRhc2tDb3VudCBpbmNyZWFzZXMsIGJ1dCBkb2Vzbid0IG92ZXJlc3RpbWF0ZSwKKyAgICAgKiAgIHdoZW4gdGFza3MgY29tcGxldGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcGxldGVkVGFza0NvdW50KCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcDIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAyLmdldENvbXBsZXRlZFRhc2tDb3VudCgpKTsKKyAgICAgICAgcDIuZXhlY3V0ZShuZXcgU2hvcnRSdW5uYWJsZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9ERUxBWV9NUyk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwMi5nZXRDb21wbGV0ZWRUYXNrQ291bnQoKSk7CisgICAgICAgIHRyeSB7IHAyLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIGpvaW5Qb29sKHAyKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogICBnZXRDb3JlUG9vbFNpemUgcmV0dXJucyBzaXplIGdpdmVuIGluIGNvbnN0cnVjdG9yIGlmIG5vdCBvdGhlcndpc2Ugc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvcmVQb29sU2l6ZSgpIHsKKyAgICAgICAgVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLCAxLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwMS5nZXRDb3JlUG9vbFNpemUoKSk7CisgICAgICAgIGpvaW5Qb29sKHAxKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogICBnZXRLZWVwQWxpdmVUaW1lIHJldHVybnMgdmFsdWUgZ2l2ZW4gaW4gY29uc3RydWN0b3IgaWYgbm90IG90aGVyd2lzZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0S2VlcEFsaXZlVGltZSgpIHsKKyAgICAgICAgVGhyZWFkUG9vbEV4ZWN1dG9yIHAyID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCAxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwMi5nZXRLZWVwQWxpdmVUaW1lKFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgam9pblBvb2wocDIpOworICAgIH0KKworCisgICAgLyoqIAorICAgICAqIGdldFRocmVhZEZhY3RvcnkgcmV0dXJucyBmYWN0b3J5IGluIGNvbnN0cnVjdG9yIGlmIG5vdCBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGhyZWFkRmFjdG9yeSgpIHsKKyAgICAgICAgVGhyZWFkRmFjdG9yeSB0ZiA9IG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCk7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksIHRmLCBuZXcgTm9PcFJFSGFuZGxlcigpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSh0ZiwgcC5nZXRUaHJlYWRGYWN0b3J5KCkpOworICAgICAgICBqb2luUG9vbChwKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogc2V0VGhyZWFkRmFjdG9yeSBzZXRzIHRoZSB0aHJlYWQgZmFjdG9yeSByZXR1cm5lZCBieSBnZXRUaHJlYWRGYWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldFRocmVhZEZhY3RvcnkoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICBUaHJlYWRGYWN0b3J5IHRmID0gbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKTsKKyAgICAgICAgcC5zZXRUaHJlYWRGYWN0b3J5KHRmKTsKKyAgICAgICAgYXNzZXJ0U2FtZSh0ZiwgcC5nZXRUaHJlYWRGYWN0b3J5KCkpOworICAgICAgICBqb2luUG9vbChwKTsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBzZXRUaHJlYWRGYWN0b3J5KG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGhyZWFkRmFjdG9yeU51bGwoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5zZXRUaHJlYWRGYWN0b3J5KG51bGwpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2wocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogCisgICAgICogZ2V0UmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyIHJldHVybnMgaGFuZGxlciBpbiBjb25zdHJ1Y3RvciBpZiBub3Qgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyIGggPSBuZXcgTm9PcFJFSGFuZGxlcigpOworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwyLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLCBoKTsKKyAgICAgICAgYXNzZXJ0U2FtZShoLCBwLmdldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcigpKTsKKyAgICAgICAgam9pblBvb2wocCk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIHNldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciBzZXRzIHRoZSBoYW5kbGVyIHJldHVybmVkIGJ5CisgICAgICogZ2V0UmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgVGhyZWFkUG9vbEV4ZWN1dG9yIHAgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMixMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciBoID0gbmV3IE5vT3BSRUhhbmRsZXIoKTsKKyAgICAgICAgcC5zZXRSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIoaCk7CisgICAgICAgIGFzc2VydFNhbWUoaCwgcC5nZXRSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIoKSk7CisgICAgICAgIGpvaW5Qb29sKHApOworICAgIH0KKworCisgICAgLyoqIAorICAgICAqIHNldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcihudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlck51bGwoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5zZXRSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqICAgZ2V0TGFyZ2VzdFBvb2xTaXplIGluY3JlYXNlcywgYnV0IGRvZXNuJ3Qgb3ZlcmVzdGltYXRlLCB3aGVuCisgICAgICogICBtdWx0aXBsZSB0aHJlYWRzIGFjdGl2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYXJnZXN0UG9vbFNpemUoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwMiA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAyLmdldExhcmdlc3RQb29sU2l6ZSgpKTsKKyAgICAgICAgICAgIHAyLmV4ZWN1dGUobmV3IE1lZGl1bVJ1bm5hYmxlKCkpOworICAgICAgICAgICAgcDIuZXhlY3V0ZShuZXcgTWVkaXVtUnVubmFibGUoKSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHAyLmdldExhcmdlc3RQb29sU2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gCisgICAgICAgIGpvaW5Qb29sKHAyKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogICBnZXRNYXhpbXVtUG9vbFNpemUgcmV0dXJucyB2YWx1ZSBnaXZlbiBpbiBjb25zdHJ1Y3RvciBpZiBub3QKKyAgICAgKiAgIG90aGVyd2lzZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWF4aW11bVBvb2xTaXplKCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcDIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHAyLmdldE1heGltdW1Qb29sU2l6ZSgpKTsKKyAgICAgICAgam9pblBvb2wocDIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgIGdldFBvb2xTaXplIGluY3JlYXNlcywgYnV0IGRvZXNuJ3Qgb3ZlcmVzdGltYXRlLCB3aGVuIHRocmVhZHMKKyAgICAgKiAgIGJlY29tZSBhY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9vbFNpemUoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwgMSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcDEuZ2V0UG9vbFNpemUoKSk7CisgICAgICAgIHAxLmV4ZWN1dGUobmV3IE1lZGl1bVJ1bm5hYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcDEuZ2V0UG9vbFNpemUoKSk7CisgICAgICAgIGpvaW5Qb29sKHAxKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogIGdldFRhc2tDb3VudCBpbmNyZWFzZXMsIGJ1dCBkb2Vzbid0IG92ZXJlc3RpbWF0ZSwgd2hlbiB0YXNrcyBzdWJtaXR0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGFza0NvdW50KCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIDEsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBwMS5nZXRUYXNrQ291bnQoKSk7CisgICAgICAgICAgICBwMS5leGVjdXRlKG5ldyBNZWRpdW1SdW5uYWJsZSgpKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcDEuZ2V0VGFza0NvdW50KCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSAKKyAgICAgICAgam9pblBvb2wocDEpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgIGlzU2h1dERvd24gaXMgZmFsc2UgYmVmb3JlIHNodXRkb3duLCB0cnVlIGFmdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzU2h1dGRvd24oKSB7CisgICAgICAgIAorICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIDEsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocDEuaXNTaHV0ZG93bigpKTsKKyAgICAgICAgdHJ5IHsgcDEuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShwMS5pc1NodXRkb3duKCkpOworICAgICAgICBqb2luUG9vbChwMSk7CisgICAgfQorCisgICAgICAgIAorICAgIC8qKgorICAgICAqICBpc1Rlcm1pbmF0ZWQgaXMgZmFsc2UgYmVmb3JlIHRlcm1pbmF0aW9uLCB0cnVlIGFmdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzVGVybWluYXRlZCgpIHsKKyAgICAgICAgVGhyZWFkUG9vbEV4ZWN1dG9yIHAxID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLCAxLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHAxLmlzVGVybWluYXRlZCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAxLmV4ZWN1dGUobmV3IE1lZGl1bVJ1bm5hYmxlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsgcDEuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwMS5hd2FpdFRlcm1pbmF0aW9uKExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwMS5pc1Rlcm1pbmF0ZWQoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgaXNUZXJtaW5hdGluZyBpcyBub3QgdHJ1ZSB3aGVuIHJ1bm5pbmcgb3Igd2hlbiB0ZXJtaW5hdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzVGVybWluYXRpbmcoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwgMSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICBhc3NlcnRGYWxzZShwMS5pc1Rlcm1pbmF0aW5nKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcDEuZXhlY3V0ZShuZXcgU21hbGxSdW5uYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHAxLmlzVGVybWluYXRpbmcoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyBwMS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmF3YWl0VGVybWluYXRpb24oTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLmlzVGVybWluYXRlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHAxLmlzVGVybWluYXRpbmcoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRRdWV1ZSByZXR1cm5zIHRoZSB3b3JrIHF1ZXVlLCB3aGljaCBjb250YWlucyBxdWV1ZWQgdGFza3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVldWUoKSB7CisgICAgICAgIEJsb2NraW5nUXVldWU8UnVubmFibGU+IHEgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCk7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwgMSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBxKTsKKyAgICAgICAgRnV0dXJlVGFza1tdIHRhc2tzID0gbmV3IEZ1dHVyZVRhc2tbNV07CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1OyBpKyspeworICAgICAgICAgICAgdGFza3NbaV0gPSBuZXcgRnV0dXJlVGFzayhuZXcgTWVkaXVtUG9zc2libHlJbnRlcnJ1cHRlZFJ1bm5hYmxlKCksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICBwMS5leGVjdXRlKHRhc2tzW2ldKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIEJsb2NraW5nUXVldWU8UnVubmFibGU+IHdxID0gcDEuZ2V0UXVldWUoKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUocSwgd3EpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uod3EuY29udGFpbnModGFza3NbMF0pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUod3EuY29udGFpbnModGFza3NbNF0pKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2wocDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlKHRhc2spIHJlbW92ZXMgcXVldWVkIHRhc2ssIGFuZCBmYWlscyB0byByZW1vdmUgYWN0aXZlIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPiBxID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApOworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcDEgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIDEsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgcSk7CisgICAgICAgIEZ1dHVyZVRhc2tbXSB0YXNrcyA9IG5ldyBGdXR1cmVUYXNrWzVdOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTsgaSsrKXsKKyAgICAgICAgICAgIHRhc2tzW2ldID0gbmV3IEZ1dHVyZVRhc2sobmV3IE1lZGl1bVBvc3NpYmx5SW50ZXJydXB0ZWRSdW5uYWJsZSgpLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgcDEuZXhlY3V0ZSh0YXNrc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTSE9SVF9ERUxBWV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShwMS5yZW1vdmUodGFza3NbMF0pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5jb250YWlucyh0YXNrc1s0XSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmNvbnRhaW5zKHRhc2tzWzNdKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHAxLnJlbW92ZSh0YXNrc1s0XSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocDEucmVtb3ZlKHRhc2tzWzRdKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zKHRhc2tzWzRdKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuY29udGFpbnModGFza3NbM10pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocDEucmVtb3ZlKHRhc2tzWzNdKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShxLmNvbnRhaW5zKHRhc2tzWzNdKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKHAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICAgcHVyZ2UgcmVtb3ZlcyBjYW5jZWxsZWQgdGFza3MgZnJvbSB0aGUgcXVldWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVyZ2UoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwgMSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICBGdXR1cmVUYXNrW10gdGFza3MgPSBuZXcgRnV0dXJlVGFza1s1XTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICAgICAgICB0YXNrc1tpXSA9IG5ldyBGdXR1cmVUYXNrKG5ldyBNZWRpdW1Qb3NzaWJseUludGVycnVwdGVkUnVubmFibGUoKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIHAxLmV4ZWN1dGUodGFza3NbaV0pOworICAgICAgICB9CisgICAgICAgIHRhc2tzWzRdLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgdGFza3NbM10uY2FuY2VsKHRydWUpOworICAgICAgICBwMS5wdXJnZSgpOworICAgICAgICBsb25nIGNvdW50ID0gcDEuZ2V0VGFza0NvdW50KCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnQgPj0gMiAmJiBjb3VudCA8IDUpOworICAgICAgICBqb2luUG9vbChwMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIHNodXREb3duTm93IHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGFza3MgdGhhdCB3ZXJlIG5vdCBydW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2h1dERvd25Ob3coKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwMSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwgMSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICBMaXN0IGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHAxLmV4ZWN1dGUobmV3IE1lZGl1bVBvc3NpYmx5SW50ZXJydXB0ZWRSdW5uYWJsZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbCA9IHAxLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUocDEuaXNTaHV0ZG93bigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsLnNpemUoKSA8PSA0KTsKKyAgICB9CisKKyAgICAvLyBFeGNlcHRpb24gVGVzdHMKKyAgICAKKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgY29yZVBvb2xTaXplIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKC0xLDEsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiBtYXhpbXVtUG9vbFNpemUgaXMgbGVzcyB0aGFuIHplcm8gCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwtMSxMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKyAgICAKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIG1heGltdW1Qb29sU2l6ZSBpcyBlcXVhbCB0byB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMCxMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYga2VlcEFsaXZlVGltZSBpcyBsZXNzIHRoYW4gemVybyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsLTFMLFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiBjb3JlUG9vbFNpemUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtUG9vbFNpemUgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwxLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorICAgICAgICAKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIHdvcmtRdWV1ZSBpcyBzZXQgdG8gbnVsbCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwyLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyxudWxsKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3Mpe30gIAorICAgIH0KKyAgICAKKworICAgIAorICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgY29yZVBvb2xTaXplIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjYoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKC0xLDEsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKyAgICAKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIG1heGltdW1Qb29sU2l6ZSBpcyBsZXNzIHRoYW4gemVybyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I3KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLC0xLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIG1heGltdW1Qb29sU2l6ZSBpcyBlcXVhbCB0byB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjgoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMCxMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSxuZXcgU2ltcGxlVGhyZWFkRmFjdG9yeSgpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiBrZWVwQWxpdmVUaW1lIGlzIGxlc3MgdGhhbiB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMiwtMUwsVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgY29yZVBvb2xTaXplIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVBvb2xTaXplIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjEwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLDEsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgd29ya1F1ZXVlIGlzIHNldCB0byBudWxsIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck51bGxQb2ludGVyRXhjZXB0aW9uMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwyLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyxudWxsLG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcyl7fSAgCisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiB0aHJlYWRGYWN0b3J5IGlzIHNldCB0byBudWxsIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck51bGxQb2ludGVyRXhjZXB0aW9uMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZEZhY3RvcnkgZiA9IG51bGw7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMixMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLGYpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcyl7fSAgCisgICAgfQorIAorICAgIAorICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgY29yZVBvb2xTaXplIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjExKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigtMSwxLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLG5ldyBOb09wUkVIYW5kbGVyKCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIG1heGltdW1Qb29sU2l6ZSBpcyBsZXNzIHRoYW4gemVybyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IxMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwtMSxMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSxuZXcgTm9PcFJFSGFuZGxlcigpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiBtYXhpbXVtUG9vbFNpemUgaXMgZXF1YWwgdG8gemVybyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IxMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwwLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLG5ldyBOb09wUkVIYW5kbGVyKCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIGtlZXBBbGl2ZVRpbWUgaXMgbGVzcyB0aGFuIHplcm8gCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMTQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMiwtMUwsVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksbmV3IE5vT3BSRUhhbmRsZXIoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgY29yZVBvb2xTaXplIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVBvb2xTaXplIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjE1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLDEsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksbmV3IE5vT3BSRUhhbmRsZXIoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgd29ya1F1ZXVlIGlzIHNldCB0byBudWxsIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck51bGxQb2ludGVyRXhjZXB0aW9uNCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwyLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyxudWxsLG5ldyBOb09wUkVIYW5kbGVyKCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2Vzcyl7fSAgCisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiBoYW5kbGVyIGlzIHNldCB0byBudWxsIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck51bGxQb2ludGVyRXhjZXB0aW9uNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciByID0gbnVsbDsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwyLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyxuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkscik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXt9ICAKKyAgICB9CisKKyAgICAKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIGNvcmVQb29sU2l6ZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4gemVybyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IxNigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoLTEsMSxMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSxuZXcgU2ltcGxlVGhyZWFkRmFjdG9yeSgpLG5ldyBOb09wUkVIYW5kbGVyKCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIG1heGltdW1Qb29sU2l6ZSBpcyBsZXNzIHRoYW4gemVybyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IxNygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwtMSxMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSxuZXcgU2ltcGxlVGhyZWFkRmFjdG9yeSgpLG5ldyBOb09wUkVIYW5kbGVyKCkpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIG1heGltdW1Qb29sU2l6ZSBpcyBlcXVhbCB0byB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjE4KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDAsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKSxuZXcgTm9PcFJFSGFuZGxlcigpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiBrZWVwQWxpdmVUaW1lIGlzIGxlc3MgdGhhbiB6ZXJvIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjE5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsLTFMLFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCksbmV3IE5vT3BSRUhhbmRsZXIoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgY29yZVBvb2xTaXplIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVBvb2xTaXplIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjIwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLDEsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCksbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKSxuZXcgTm9PcFJFSGFuZGxlcigpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKXt9CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdG9yIHRocm93cyBpZiB3b3JrUXVldWUgaXMgc2V0IHRvIG51bGwgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yTnVsbFBvaW50ZXJFeGNlcHRpb242KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLG51bGwsbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKSxuZXcgTm9PcFJFSGFuZGxlcigpKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3Mpe30gIAorICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RvciB0aHJvd3MgaWYgaGFuZGxlciBpcyBzZXQgdG8gbnVsbCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOdWxsUG9pbnRlckV4Y2VwdGlvbjcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgciA9IG51bGw7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMixMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCkscik7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKXt9ICAKKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29uc3RydWN0b3IgdGhyb3dzIGlmIFRocmVhZEZhY3RvcnkgaXMgc2V0IHRvcCBudWxsIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck51bGxQb2ludGVyRXhjZXB0aW9uOCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZEZhY3RvcnkgZiA9IG51bGw7CisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMixMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApLGYsbmV3IE5vT3BSRUhhbmRsZXIoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzZG44KXt9ICAKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiAgZXhlY3V0ZSB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24KKyAgICAgKiAgaWYgc2F0dXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTYXR1cmF0ZWRFeGVjdXRlKCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwxLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7ICsraSl7CisgICAgICAgICAgICAgICAgcC5leGVjdXRlKG5ldyBNZWRpdW1SdW5uYWJsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICBqb2luUG9vbChwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZXhlY3V0b3IgdXNpbmcgQ2FsbGVyUnVuc1BvbGljeSBydW5zIHRhc2sgaWYgc2F0dXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTYXR1cmF0ZWRFeGVjdXRlMigpIHsKKyAgICAgICAgUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyIGggPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yLkNhbGxlclJ1bnNQb2xpY3koKTsKKyAgICAgICAgVGhyZWFkUG9vbEV4ZWN1dG9yIHAgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMSwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxKSwgaCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFRyYWNrZWROb09wUnVubmFibGVbXSB0YXNrcyA9IG5ldyBUcmFja2VkTm9PcFJ1bm5hYmxlWzVdOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7ICsraSl7CisgICAgICAgICAgICAgICAgdGFza3NbaV0gPSBuZXcgVHJhY2tlZE5vT3BSdW5uYWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2tlZExvbmdSdW5uYWJsZSBtciA9IG5ldyBUcmFja2VkTG9uZ1J1bm5hYmxlKCk7CisgICAgICAgICAgICBwLmV4ZWN1dGUobXIpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7ICsraSl7CisgICAgICAgICAgICAgICAgcC5leGVjdXRlKHRhc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRhc2tzW2ldLmRvbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsgcC5zaHV0ZG93bk5vdygpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICB9IGNhdGNoKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKHApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGV4ZWN1dG9yIHVzaW5nIERpc2NhcmRQb2xpY3kgZHJvcHMgdGFzayBpZiBzYXR1cmF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNhdHVyYXRlZEV4ZWN1dGUzKCkgeworICAgICAgICBSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgaCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IuRGlzY2FyZFBvbGljeSgpOworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwxLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEpLCBoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVHJhY2tlZE5vT3BSdW5uYWJsZVtdIHRhc2tzID0gbmV3IFRyYWNrZWROb09wUnVubmFibGVbNV07CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTsgKytpKXsKKyAgICAgICAgICAgICAgICB0YXNrc1tpXSA9IG5ldyBUcmFja2VkTm9PcFJ1bm5hYmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwLmV4ZWN1dGUobmV3IFRyYWNrZWRMb25nUnVubmFibGUoKSk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTsgKytpKXsKKyAgICAgICAgICAgICAgICBwLmV4ZWN1dGUodGFza3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDU7ICsraSl7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGFza3NbaV0uZG9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeyBwLnNodXRkb3duTm93KCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2wocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZXhlY3V0b3IgdXNpbmcgRGlzY2FyZE9sZGVzdFBvbGljeSBkcm9wcyBvbGRlc3QgdGFzayBpZiBzYXR1cmF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNhdHVyYXRlZEV4ZWN1dGU0KCkgeworICAgICAgICBSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgaCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IuRGlzY2FyZE9sZGVzdFBvbGljeSgpOworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwxLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEpLCBoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZXhlY3V0ZShuZXcgVHJhY2tlZExvbmdSdW5uYWJsZSgpKTsKKyAgICAgICAgICAgIFRyYWNrZWRMb25nUnVubmFibGUgcjIgPSBuZXcgVHJhY2tlZExvbmdSdW5uYWJsZSgpOworICAgICAgICAgICAgcC5leGVjdXRlKHIyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocC5nZXRRdWV1ZSgpLmNvbnRhaW5zKHIyKSk7CisgICAgICAgICAgICBUcmFja2VkTm9PcFJ1bm5hYmxlIHIzID0gbmV3IFRyYWNrZWROb09wUnVubmFibGUoKTsKKyAgICAgICAgICAgIHAuZXhlY3V0ZShyMyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShwLmdldFF1ZXVlKCkuY29udGFpbnMocjIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocC5nZXRRdWV1ZSgpLmNvbnRhaW5zKHIzKSk7CisgICAgICAgICAgICB0cnkgeyBwLnNodXRkb3duTm93KCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIH0gY2F0Y2goUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2wocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZXhlY3V0ZSB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgc2h1dGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb25PblNodXRkb3duKCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgdHBlID0gCisgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsMSxMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMSkpOworICAgICAgICB0cnkgeyB0cGUuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRwZS5leGVjdXRlKG5ldyBOb09wUnVubmFibGUoKSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgCisgICAgICAgIGpvaW5Qb29sKHRwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIGV4ZWN1dGUgdXNpbmcgQ2FsbGVyUnVuc1BvbGljeSBkcm9wcyB0YXNrIG9uIHNodXRkb3duCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxlclJ1bnNPblNodXRkb3duKCkgeworICAgICAgICBSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgaCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IuQ2FsbGVyUnVuc1BvbGljeSgpOworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwxLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEpLCBoKTsKKworICAgICAgICB0cnkgeyBwLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFja2VkTm9PcFJ1bm5hYmxlIHIgPSBuZXcgVHJhY2tlZE5vT3BSdW5uYWJsZSgpOworICAgICAgICAgICAgcC5leGVjdXRlKHIpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoci5kb25lKTsKKyAgICAgICAgfSBjYXRjaChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKHApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGV4ZWN1dGUgdXNpbmcgRGlzY2FyZFBvbGljeSBkcm9wcyB0YXNrIG9uIHNodXRkb3duCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERpc2NhcmRPblNodXRkb3duKCkgeworICAgICAgICBSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgaCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IuRGlzY2FyZFBvbGljeSgpOworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcCA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwxLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEpLCBoKTsKKworICAgICAgICB0cnkgeyBwLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFja2VkTm9PcFJ1bm5hYmxlIHIgPSBuZXcgVHJhY2tlZE5vT3BSdW5uYWJsZSgpOworICAgICAgICAgICAgcC5leGVjdXRlKHIpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoci5kb25lKTsKKyAgICAgICAgfSBjYXRjaChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKHApOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZXhlY3V0ZSB1c2luZyBEaXNjYXJkT2xkZXN0UG9saWN5IGRyb3BzIHRhc2sgb24gc2h1dGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY2FyZE9sZGVzdE9uU2h1dGRvd24oKSB7CisgICAgICAgIFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciBoID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvci5EaXNjYXJkT2xkZXN0UG9saWN5KCk7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciBwID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDEsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMSksIGgpOworCisgICAgICAgIHRyeSB7IHAuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRyYWNrZWROb09wUnVubmFibGUgciA9IG5ldyBUcmFja2VkTm9PcFJ1bm5hYmxlKCk7CisgICAgICAgICAgICBwLmV4ZWN1dGUocik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShyLmRvbmUpOworICAgICAgICB9IGNhdGNoKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2wocCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBleGVjdXRlIChudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVOdWxsKCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgdHBlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRwZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwyLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyxuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICAgICAgdHBlLmV4ZWN1dGUobnVsbCk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3Mpe30KKyAgICAgICAgCisgICAgICAgIGpvaW5Qb29sKHRwZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICBzZXRDb3JlUG9vbFNpemUgb2YgbmVnYXRpdmUgdmFsdWUgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JlUG9vbFNpemVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciB0cGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLDIsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpe30KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRwZS5zZXRDb3JlUG9vbFNpemUoLTEpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyB0cGUuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgfQorICAgICAgICBqb2luUG9vbCh0cGUpOworICAgIH0gICAKKworICAgIC8qKgorICAgICAqICBzZXRNYXhpbXVtUG9vbFNpemUoaW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmCisgICAgICogIGdpdmVuIGEgdmFsdWUgbGVzcyB0aGUgY29yZSBwb29sIHNpemUKKyAgICAgKi8gIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhpbXVtUG9vbFNpemVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciB0cGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLDMsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpe30KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRwZS5zZXRNYXhpbXVtUG9vbFNpemUoMSk7CisgICAgICAgICAgICBzaG91bGRUaHJvdygpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKXsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7IHRwZS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICB9CisgICAgICAgIGpvaW5Qb29sKHRwZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICBzZXRNYXhpbXVtUG9vbFNpemUgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBpZiBnaXZlbiBhIG5lZ2F0aXZlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE1heGltdW1Qb29sU2l6ZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjIoKSB7CisgICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciB0cGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLDMsTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpe30KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRwZS5zZXRNYXhpbXVtUG9vbFNpemUoLTEpOworICAgICAgICAgICAgc2hvdWxkVGhyb3coKTsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2Vzcyl7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyB0cGUuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgfQorICAgICAgICBqb2luUG9vbCh0cGUpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqICBzZXRLZWVwQWxpdmVUaW1lICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIHdoZW4gZ2l2ZW4gYSBuZWdhdGl2ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RLZWVwQWxpdmVUaW1lSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgeworICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgdHBlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRwZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwzLExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyxuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXt9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgdHBlLnNldEtlZXBBbGl2ZVRpbWUoLTEsVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIHNob3VsZFRocm93KCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHN1Y2Nlc3MpeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsgdHBlLnNodXRkb3duKCk7IH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsgcmV0dXJuOyB9CisgICAgICAgIH0KKyAgICAgICAgam9pblBvb2wodHBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXJtaW5hdGVkKCkgaXMgY2FsbGVkIG9uIHRlcm1pbmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRlcm1pbmF0ZWQoKSB7CisgICAgICAgIEV4dGVuZGVkVFBFIHRwZSA9IG5ldyBFeHRlbmRlZFRQRSgpOworICAgICAgICB0cnkgeyB0cGUuc2h1dGRvd24oKTsgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBvaykgeyByZXR1cm47IH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSh0cGUudGVybWluYXRlZENhbGxlZCk7CisgICAgICAgIGpvaW5Qb29sKHRwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYmVmb3JlRXhlY3V0ZSBhbmQgYWZ0ZXJFeGVjdXRlIGFyZSBjYWxsZWQgd2hlbiBleGVjdXRpbmcgdGFzaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCZWZvcmVBZnRlcigpIHsKKyAgICAgICAgRXh0ZW5kZWRUUEUgdHBlID0gbmV3IEV4dGVuZGVkVFBFKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFja2VkTm9PcFJ1bm5hYmxlIHIgPSBuZXcgVHJhY2tlZE5vT3BSdW5uYWJsZSgpOworICAgICAgICAgICAgdHBlLmV4ZWN1dGUocik7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0hPUlRfREVMQVlfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmRvbmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cGUuYmVmb3JlQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHBlLmFmdGVyQ2FsbGVkKTsKKyAgICAgICAgICAgIHRyeSB7IHRwZS5zaHV0ZG93bigpOyB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIG9rKSB7IHJldHVybjsgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2wodHBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBsZXRlZCBzdWJtaXQgb2YgY2FsbGFibGUgcmV0dXJucyByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VibWl0Q2FsbGFibGUoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGdXR1cmU8U3RyaW5nPiBmdXR1cmUgPSBlLnN1Ym1pdChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGxldGVkIHN1Ym1pdCBvZiBydW5uYWJsZSByZXR1cm5zIHN1Y2Nlc3NmdWxseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRSdW5uYWJsZSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBlLnN1Ym1pdChuZXcgTm9PcFJ1bm5hYmxlKCkpOworICAgICAgICAgICAgZnV0dXJlLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmdXR1cmUuaXNEb25lKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGxldGVkIHN1Ym1pdCBvZiAocnVubmFibGUsIHJlc3VsdCkgcmV0dXJucyByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VibWl0UnVubmFibGUyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRnV0dXJlPFN0cmluZz4gZnV0dXJlID0gZS5zdWJtaXQobmV3IE5vT3BSdW5uYWJsZSgpLCBURVNUX1NUUklORyk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZnV0dXJlLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShURVNUX1NUUklORywgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKworCisgICAgLyoqCisgICAgICogaW52b2tlQW55KG51bGwpIHRocm93cyBOUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQW55MSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KG51bGwpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludm9rZUFueShlbXB0eSBjb2xsZWN0aW9uKSB0aHJvd3MgSUFFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFueTIoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLmludm9rZUFueShuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbnkoYykgdGhyb3dzIE5QRSBpZiBjIGhhcyBudWxsIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFueTMoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobnVsbCk7CisgICAgICAgICAgICBlLmludm9rZUFueShsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbnkoYykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZiBubyB0YXNrIGNvbXBsZXRlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbnk0KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgTlBFVGFzaygpKTsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KGwpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbnkoYykgcmV0dXJucyByZXN1bHQgb2Ygc29tZSB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFueTUoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZS5pbnZva2VBbnkobCk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbGwxKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZS5pbnZva2VBbGwobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52b2tlQWxsKGVtcHR5IGNvbGxlY3Rpb24pIHJldHVybnMgZW1wdHkgY29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbGwyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gciA9IGUuaW52b2tlQWxsKG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHIuaXNFbXB0eSgpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52b2tlQWxsKGMpIHRocm93cyBOUEUgaWYgYyBoYXMgbnVsbCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBbGwzKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbGwobCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IG9mIGVsZW1lbnQgb2YgaW52b2tlQWxsKGMpIHRocm93cyBleGNlcHRpb24gb24gZmFpbGVkIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQWxsNCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IE5QRVRhc2soKSk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHQgPSBlLmludm9rZUFsbChsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RnV0dXJlPFN0cmluZz4+IGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIAorICAgICAgICAgICAgICAgIGl0Lm5leHQoKS5nZXQoKTsKKyAgICAgICAgfSBjYXRjaChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZva2VBbGwoYykgcmV0dXJucyByZXN1bHRzIG9mIGFsbCBjb21wbGV0ZWQgdGFza3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQWxsNSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIExpc3Q8RnV0dXJlPFN0cmluZz4+IHJlc3VsdCA9IGUuaW52b2tlQWxsKGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxGdXR1cmU8U3RyaW5nPj4gaXQgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgCisgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShURVNUX1NUUklORywgaXQubmV4dCgpLmdldCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFueShudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQW55MSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KG51bGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoLCxudWxsKSB0aHJvd3MgTlBFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQW55TnVsbFRpbWVVbml0KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KGwsIE1FRElVTV9ERUxBWV9NUywgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQW55KGVtcHR5IGNvbGxlY3Rpb24pIHRocm93cyBJQUUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnkyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZS5pbnZva2VBbnkobmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFueShjKSB0aHJvd3MgTlBFIGlmIGMgaGFzIG51bGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnkzKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbnkobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQW55KGMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgbm8gdGFzayBjb21wbGV0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbnk0KCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgTlBFVGFzaygpKTsKKyAgICAgICAgICAgIGUuaW52b2tlQW55KGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbnkoYykgcmV0dXJucyByZXN1bHQgb2Ygc29tZSB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQW55NSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBlLmludm9rZUFueShsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFRFU1RfU1RSSU5HLCByZXN1bHQpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gc3VjY2VzcykgeworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgam9pblBvb2woZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aW1lZCBpbnZva2VBbGwobnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbDEoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlLmludm9rZUFsbChudWxsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQWxsKCwsbnVsbCkgdGhyb3dzIE5QRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbE51bGxUaW1lVW5pdCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBlLmludm9rZUFsbChsLCBNRURJVU1fREVMQVlfTVMsIG51bGwpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFsbChlbXB0eSBjb2xsZWN0aW9uKSByZXR1cm5zIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbGwyKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gciA9IGUuaW52b2tlQWxsKG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKSwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmlzRW1wdHkoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFsbChjKSB0aHJvd3MgTlBFIGlmIGMgaGFzIG51bGwgZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWRJbnZva2VBbGwzKCkgeworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMiwgMiwgTE9OR19ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigxMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+IGwgPSBuZXcgQXJyYXlMaXN0PENhbGxhYmxlPFN0cmluZz4+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIGwuYWRkKG51bGwpOworICAgICAgICAgICAgZS5pbnZva2VBbGwobCwgTUVESVVNX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBvZiBlbGVtZW50IG9mIGludm9rZUFsbChjKSB0aHJvd3MgZXhjZXB0aW9uIG9uIGZhaWxlZCB0YXNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQWxsNCgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IE5QRVRhc2soKSk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHQgPSBlLmludm9rZUFsbChsLCBNRURJVU1fREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEZ1dHVyZTxTdHJpbmc+PiBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSAKKyAgICAgICAgICAgICAgICBpdC5uZXh0KCkuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpvaW5Qb29sKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGltZWQgaW52b2tlQWxsKGMpIHJldHVybnMgcmVzdWx0cyBvZiBhbGwgY29tcGxldGVkIHRhc2tzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkSW52b2tlQWxsNSgpIHsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGUgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIDIsIExPTkdfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PiBsID0gbmV3IEFycmF5TGlzdDxDYWxsYWJsZTxTdHJpbmc+PigpOworICAgICAgICAgICAgbC5hZGQobmV3IFN0cmluZ1Rhc2soKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgU3RyaW5nVGFzaygpKTsKKyAgICAgICAgICAgIExpc3Q8RnV0dXJlPFN0cmluZz4+IHJlc3VsdCA9IGUuaW52b2tlQWxsKGwsIE1FRElVTV9ERUxBWV9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RnV0dXJlPFN0cmluZz4+IGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIAorICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoVEVTVF9TVFJJTkcsIGl0Lm5leHQoKS5nZXQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBzdWNjZXNzKSB7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRpbWVkIGludm9rZUFsbChjKSBjYW5jZWxzIHRhc2tzIG5vdCBjb21wbGV0ZWQgYnkgdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEludm9rZUFsbDYoKSB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigyLCAyLCBMT05HX0RFTEFZX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDEwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4gbCA9IG5ldyBBcnJheUxpc3Q8Q2FsbGFibGU8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgbC5hZGQoRXhlY3V0b3JzLmNhbGxhYmxlKG5ldyBNZWRpdW1Qb3NzaWJseUludGVycnVwdGVkUnVubmFibGUoKSwgVEVTVF9TVFJJTkcpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBTdHJpbmdUYXNrKCkpOworICAgICAgICAgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gcmVzdWx0ID0gZS5pbnZva2VBbGwobCwgU0hPUlRfREVMQVlfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBJdGVyYXRvcjxGdXR1cmU8U3RyaW5nPj4gaXQgPSByZXN1bHQuaXRlcmF0b3IoKTsgCisgICAgICAgICAgICBGdXR1cmU8U3RyaW5nPiBmMSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGYyID0gaXQubmV4dCgpOworICAgICAgICAgICAgRnV0dXJlPFN0cmluZz4gZjMgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGYxLmlzRG9uZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZjIuaXNEb25lKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmMy5pc0RvbmUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShmMS5pc0NhbmNlbGxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZjIuaXNDYW5jZWxsZWQoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBqb2luUG9vbChlKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFRlc3QuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1YzYzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgQW5kcmV3IFdyaWdodCwgSmVmZnJleSBIYXllcywgCisgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuIAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKK3B1YmxpYyBjbGFzcyBUaHJlYWRUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGhyZWFkVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIE15SGFuZGxlciBpbXBsZW1lbnRzIFRocmVhZC5VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgeworICAgICAgICBwdWJsaWMgdm9pZCB1bmNhdWdodEV4Y2VwdGlvbihUaHJlYWQgdCwgVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogZ2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHJldHVybnMgVGhyZWFkR3JvdXAgdW5sZXNzIHNldCwKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuaW5nIHZhbHVlIG9mIGxhc3Qgc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSB7CisgICAgICAgIC8vIHRoZXNlIG11c3QgYmUgZG9uZSBhbGwgYXQgb25jZSB0byBhdm9pZCBzdGF0ZQorICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYWNyb3NzIHRlc3RzCisgICAgICAgIFRocmVhZCBjdXJyZW50ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkR3JvdXAgdGcgPSBjdXJyZW50LmdldFRocmVhZEdyb3VwKCk7CisgICAgICAgIE15SGFuZGxlciBlaCA9IG5ldyBNeUhhbmRsZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRnLCBjdXJyZW50LmdldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKTsKKyAgICAgICAgY3VycmVudC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoZWgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZWgsIGN1cnJlbnQuZ2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpOworICAgICAgICBjdXJyZW50LnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRnLCBjdXJyZW50LmdldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHJldHVybnMgdmFsdWUgb2YgbGFzdAorICAgICAqIHNldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIuIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgVGhyZWFkLmdldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSk7CisgICAgICAgIC8vIGZhaWx1cmUgZHVlIHRvIHNlY3VyaXR5RXhjZXB0aW9uIGlzIE9LLgorICAgICAgICAvLyBXb3VsZCBiZSBuaWNlIHRvIGV4cGxpY2l0bHkgdGVzdCBib3RoIHdheXMsIGJ1dCBjYW5ub3QgeWV0LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgVGhyZWFkR3JvdXAgdGcgPSBjdXJyZW50LmdldFRocmVhZEdyb3VwKCk7CisgICAgICAgICAgICBNeUhhbmRsZXIgZWggPSBuZXcgTXlIYW5kbGVyKCk7CisgICAgICAgICAgICBUaHJlYWQuc2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihlaCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWgsIFRocmVhZC5nZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpOworICAgICAgICAgICAgVGhyZWFkLnNldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgVGhyZWFkLmdldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSk7CisgICAgfQorCisgICAgCisgICAgLy8gSG93IHRvIHRlc3QgYWN0dWFsbHkgdXNpbmcgVUVIIHdpdGhpbiBqdW5pdD8KKworfQorCmRpZmYgLS1naXQgYS9jb25jdXJyZW50L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0VGVzdC5qYXZhIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTlhMDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdFRlc3QuamF2YQpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqIE90aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIEFuZHJldyBXcmlnaHQsIEplZmZyZXkgSGF5ZXMsIAorICogUGF0IEZpc2hlciwgTWlrZSBKdWRkLiAKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgVGltZVVuaXRUZXN0IGV4dGVuZHMgSlNSMTY2VGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGltZVVuaXRUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb252ZXJ0IGNvcnJlY3RseSBjb252ZXJ0cyBzYW1wbGUgdmFsdWVzIGFjcm9zcyB0aGUgZm91ciB1bml0cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0KCkgeworICAgICAgICBmb3IgKGxvbmcgdCA9IDA7IHQgPCAxMDsgKyt0KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUy5jb252ZXJ0KHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUy5jb252ZXJ0KDEwMDAgKiB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUy5jb252ZXJ0KDEwMDAwMDAgKiB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlDUk9TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUy5jb252ZXJ0KDEwMDAwMDAwMDAgKiB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTkFOT1NFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAwICogdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQodCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoMTAwMCAqIHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUNST1NFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCgxMDAwMDAwICogdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDAwMCAqIHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JQ1JPU0VDT05EUy5jb252ZXJ0KHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMCAqIHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JQ1JPU0VDT05EUy5jb252ZXJ0KHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUNST1NFQ09ORFMuY29udmVydCh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlDUk9TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlDUk9TRUNPTkRTLmNvbnZlcnQoMTAwMCAqIHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDAwMDAwMDAgKiB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUy5jb252ZXJ0KHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDAwMCAqIHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLmNvbnZlcnQodCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDAgKiB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUy5jb252ZXJ0KHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUNST1NFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUy5jb252ZXJ0KHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUykpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9OYW5vcyBjb3JyZWN0bHkgY29udmVydHMgc2FtcGxlIHZhbHVlcyBpbiBkaWZmZXJlbnQgdW5pdHMgdG8KKyAgICAgKiBuYW5vc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb05hbm9zKCkgeworICAgICAgICBmb3IgKGxvbmcgdCA9IDA7IHQgPCAxMDsgKyt0KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDAwMDAwMCAqIHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMudG9OYW5vcyh0KSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAwMDAwICogdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnRvTmFub3ModCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDAgKiB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUNST1NFQ09ORFMudG9OYW5vcyh0KSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9OYW5vcyh0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b01pY3JvcyBjb3JyZWN0bHkgY29udmVydHMgc2FtcGxlIHZhbHVlcyBpbiBkaWZmZXJlbnQgdW5pdHMgdG8KKyAgICAgKiBtaWNyb3NlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9NaWNyb3MoKSB7CisgICAgICAgIGZvciAobG9uZyB0ID0gMDsgdCA8IDEwOyArK3QpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAwMDAwICogdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUy50b01pY3Jvcyh0KSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAwICogdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnRvTWljcm9zKHQpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUNST1NFQ09ORFMudG9NaWNyb3ModCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLnRvTWljcm9zKHQgKiAxMDAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b01pbGxpcyBjb3JyZWN0bHkgY29udmVydHMgc2FtcGxlIHZhbHVlcyBpbiBkaWZmZXJlbnQgdW5pdHMgdG8KKyAgICAgKiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9NaWxsaXMoKSB7CisgICAgICAgIGZvciAobG9uZyB0ID0gMDsgdCA8IDEwOyArK3QpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAwICogdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcyh0KSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMudG9NaWxsaXModCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JQ1JPU0VDT05EUy50b01pbGxpcyh0ICogMTAwMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLnRvTWlsbGlzKHQgKiAxMDAwMDAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b1NlY29uZHMgY29ycmVjdGx5IGNvbnZlcnRzIHNhbXBsZSB2YWx1ZXMgaW4gZGlmZmVyZW50IHVuaXRzIHRvCisgICAgICogc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb1NlY29uZHMoKSB7CisgICAgICAgIGZvciAobG9uZyB0ID0gMDsgdCA8IDEwOyArK3QpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTLnRvU2Vjb25kcyh0KSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMudG9TZWNvbmRzKHQgKiAxMDAwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlDUk9TRUNPTkRTLnRvU2Vjb25kcyh0ICogMTAwMDAwMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLnRvU2Vjb25kcyh0ICogMTAwMDAwMDAwMCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBjb252ZXJ0IHNhdHVyYXRlcyBwb3NpdGl2ZSB0b28tbGFyZ2UgdmFsdWVzIHRvIExvbmcuTUFYX1ZBTFVFIAorICAgICAqIGFuZCBuZWdhdGl2ZSB0byBMT05HLk1JTl9WQUxVRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0U2F0dXJhdGUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1BWF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLmNvbnZlcnQoTG9uZy5NQVhfVkFMVUUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLmNvbnZlcnQoLUxvbmcuTUFYX1ZBTFVFIC8gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRvTmFub3Mgc2F0dXJhdGVzIHBvc2l0aXZlIHRvby1sYXJnZSB2YWx1ZXMgdG8gTG9uZy5NQVhfVkFMVUUgCisgICAgICogYW5kIG5lZ2F0aXZlIHRvIExPTkcuTUlOX1ZBTFVFCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvTmFub3NTYXR1cmF0ZSgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1BWF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMudG9OYW5vcyhMb25nLk1BWF9WQUxVRSAvIDIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMudG9OYW5vcygtTG9uZy5NQVhfVkFMVUUgLyAzKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0b1N0cmluZyByZXR1cm5zIHN0cmluZyBjb250YWluaW5nIGNvbW1vbiBuYW1lIG9mIHVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBzID0gVGltZVVuaXQuU0VDT05EUy50b1N0cmluZygpOworICAgICAgICBhc3NlcnRUcnVlKHMuaW5kZXhPZigiRUNPTkQiKSA+PSAwKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiAgVGltZWQgd2FpdCB3aXRob3V0IGhvbGRpbmcgbG9jayB0aHJvd3MKKyAgICAgKiAgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZFdhaXRfSWxsZWdhbE1vbml0b3JFeGNlcHRpb24oKSB7CisgICAgICAgIC8vY3JlYXRlZCBhIG5ldyB0aHJlYWQgd2l0aCBhbm9ueW1vdXMgcnVubmFibGUKKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0IHR1ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHUudGltZWRXYWl0KG8sTE9OR19ERUxBWV9NUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTaG91bGRUaHJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkVW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHRpbWVkV2FpdCB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gd2hlbiBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZFdhaXQoKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0IHR1ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dS50aW1lZFdhaXQobyxNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7fSAKKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBmYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRVbmV4cGVjdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIHRpbWVkSm9pbiB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gd2hlbiBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lZEpvaW4oKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCB0dSA9IFRpbWVVbml0Lk1JTExJU0VDT05EUzsgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkIHMgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTUVESVVNX0RFTEFZX01TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gc3VjY2Vzcyl7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0dS50aW1lZEpvaW4ocyxNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqICB0aW1lZFNsZWVwIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3aGVuIGludGVycnVwdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVkU2xlZXAoKSB7CisgICAgICAgIC8vY3JlYXRlZCBhIG5ldyB0aHJlYWQgd2l0aCBhbm9ueW1vdXMgcnVubmFibGUKKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgdHUgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFM7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0dS5zbGVlcChNRURJVU1fREVMQVlfTVMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU2hvdWxkVGhyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBzdWNjZXNzKSB7fSAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNIT1JUX0RFTEFZX01TKTsKKyAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYSBkZXNlcmlhbGl6ZWQgc2VyaWFsaXplZCB1bml0IGlzIGVxdWFsIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgeworICAgICAgICBUaW1lVW5pdCBxID0gVGltZVVuaXQuTUlMTElTRUNPTkRTOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDApOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvdXQpKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChxKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpbikpOworICAgICAgICAgICAgVGltZVVuaXQgciA9IChUaW1lVW5pdClpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhxLnRvU3RyaW5nKCksIHIudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29uY3VycmVudC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2NvbmN1cnJlbnQvQWxsVGVzdHMuamF2YSBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9jb25jdXJyZW50L0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2YzM0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmN1cnJlbnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9jb25jdXJyZW50L0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMuY29uY3VycmVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogVGVzdCBzdWl0ZSBmb3IgdGhlIGNvbmN1cnJlbnQgbW9kdWxlCisgKi8KK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0cyBhbGwgSlNSMTY2IHVuaXQgdGVzdHMgYXMgb25lIHN1aXRlCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSAoICkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJKU1IxNjYgVW5pdCBUZXN0cyIpOworCisgICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMuYXBpLmphdmEudXRpbC5jb25jdXJyZW50LkpTUjE2NlRlc3RDYXNlLnN1aXRlKCkpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IDFiNjliYzIuLjE5ZmRhYTggMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb24uamF2YQpAQCAtMTUsMTggKzE1LDE1IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYSBwYWRkaW5nIG1lY2hhbmlzbSBpcyBleHBlY3RlZCBmb3IgdGhlCisgKiBpbnB1dCBkYXRhLCBidXQgdGhlIGlucHV0IGRhdGEgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHBhZGRpbmcgYnl0ZXMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQmFkUGFkZGluZ0V4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7CiAKQEAgLTM2LDE2ICszMywyMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzE1MDMzODkzOTg0NzI4NDQzTDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQmFkUGFkZGluZ0V4Y2VwdGlvbn0gd2l0aCBhIG1lc3NhZ2UuCiAgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmFkUGFkZGluZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBCYWRQYWRkaW5nRXhjZXB0aW9ufSB3aXRoIG5vIG1lc3NhZ2UuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJhZFBhZGRpbmdFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0NpcGhlci5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0NpcGhlci5qYXZhCmluZGV4IGZmOTQyNDUuLmFlNzIyMjYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9DaXBoZXIuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vQ2lwaGVyLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQm9yaXMgVi4gS3V6bmV0c292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKQEAgLTQ0LDUwICszOSw4MCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmU7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIGltcGxlbWVudGF0aW9ucyBvZiBjcnlwdG9ncmFwaGljIGNpcGhlcnMgZm9yCisgKiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uLiBDaXBoZXIgY2xhc3NlcyBjYW4gbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSwKKyAqIG9uZSBoYXMgdG8gY2FsbCB0aGUgQ2lwaGVyJ3Mge0Bjb2RlIGdldEluc3RhbmNlfSBtZXRob2Qgd2l0aCB0aGUgbmFtZSBvZiBhCisgKiByZXF1ZXN0ZWQgdHJhbnNmb3JtYXRpb24sIG9wdGlvbmFsbHkgd2l0aCBhIHByb3ZpZGVyLiBBIHRyYW5zZm9ybWF0aW9uCisgKiBzcGVjaWZpZXMgYW4gb3BlcmF0aW9uIChvciBhIHNldCBvZiBvcGVyYXRpb25zKSBhcyBhIHN0cmluZyBpbiB0aGUgZm9ybToKKyAqIDx1bD4KKyAqIDxsaT48aT4iYWxnb3JpdGhtL21vZGUvcGFkZGluZyI8L2k+PC9saT4gb3IKKyAqIDxsaT48aT4iYWxnb3JpdGhtIjwvaT48L2xpPgorICogPC91bD4KKyAqIDxpPmFsZ29yaXRobTwvaT4gaXMgdGhlIG5hbWUgb2YgYSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSwgPGk+bW9kZTwvaT4gaXMgdGhlCisgKiBuYW1lIG9mIGEgZmVlZGJhY2sgbW9kZSBhbmQgPGk+cGFkZGluZzwvaT4gaXMgdGhlIG5hbWUgb2YgYSBwYWRkaW5nIHNjaGVtZS4KKyAqIElmIDxpPm1vZGU8L2k+IGFuZC9vciA8aT5wYWRkaW5nPC9pPiB2YWx1ZXMgYXJlIG9taXR0ZWQsIHByb3ZpZGVyIHNwZWNpZmljCisgKiBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHVzZWQuCisgKiA8cD4KKyAqIEEgdmFsaWQgdHJhbnNmb3JtYXRpb24gd291bGQgYmU6CisgKiA8dWw+CisgKiB7QGNvZGUgQ2lwaGVyIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUy9DQkMvUEtDUzVQYWRkaW5nIik7fQorICogPC91bD4KKyAqIFdoZW4gYSBibG9jayBjaXBoZXIgaXMgcmVxdWVzdGVkIGluIGluIHN0cmVhbSBjaXBoZXIgbW9kZSwgdGhlIG51bWJlciBvZiBiaXRzCisgKiB0byBiZSBwcm9jZXNzZWQgYXQgYSB0aW1lIGNhbiBiZSBvcHRpb25hbGx5IHNwZWNpZmllZCBieSBhcHBlbmRpbmcgaXQgdG8gdGhlCisgKiBtb2RlIG5hbWUuIGUuZy4gPGk+IkFFUy9DRkI4L05vUGFkZGluZyI8L2k+LiBJZiBubyBudW1iZXIgaXMgc3BlY2lmaWVkLCBhCisgKiBwcm92aWRlciBzcGVjaWZpYyBkZWZhdWx0IHZhbHVlIGlzIHVzZWQuCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2lwaGVyIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0YW50IGZvciBkZWNyeXB0aW9uIG9wZXJhdGlvbiBtb2RlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ1JZUFRfTU9ERSA9IDI7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb25zdGFudCBmb3IgZW5jcnlwdGlvbiBvcGVyYXRpb24gbW9kZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNSWVBUX01PREUgPSAxOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBrZXkgdG8gYmUgdW53cmFwcGVkIGlzIGEgcHJpdmF0ZSBrZXkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9LRVkgPSAyOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBrZXkgdG8gYmUgdW53cmFwcGVkIGlzIGEgcHVibGljIGtleS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSUNfS0VZID0gMTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUga2V5IHRvIGJlIHVud3JhcHBlZCBpcyBhIHNlY3JldCBrZXkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDUkVUX0tFWSA9IDM7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb25zdGFudCBmb3Iga2V5IHVud3JhcHBpbmcgb3BlcmF0aW9uIG1vZGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5XUkFQX01PREUgPSA0OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29uc3RhbnQgZm9yIGtleSB3cmFwcGluZyBvcGVyYXRpb24gbW9kZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUkFQX01PREUgPSAzOwogCkBAIC05OSwxMiArMTI0LDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAiQ2lwaGVyIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogVXNlZCB0byBhY2Nlc3MgY29tbW9uIGVuZ2luZSBmdW5jdGlvbmFsaXR5CisgICAgICogVXNlZCB0byBhY2Nlc3MgY29tbW9uIGVuZ2luZSBmdW5jdGlvbmFsaXR5LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVuZ2luZSBlbmdpbmUgPSBuZXcgRW5naW5lKFNFUlZJQ0UpOwogCiAgICAgLyoqCi0gICAgICogVGhlIHByb3ZpZGVyCisgICAgICogVGhlIHByb3ZpZGVyLgogICAgICAqLwogICAgIHByaXZhdGUgUHJvdmlkZXIgcHJvdmlkZXI7CiAKQEAgLTEyMSw4ICsxNDYsMTggQEAKICAgICBwcml2YXRlIHN0YXRpYyBTZWN1cmVSYW5kb20gc2VjX3JhbmQ7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IENpcGhlciBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2lwaGVyU3BpCisgICAgICogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gZGVsZWdhdGUgb2YgdGhlIGNpcGhlci4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjaXBoZXIuCisgICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gdGhhdCB0aGlzIGNpcGhlciBwZXJmb3Jtcy4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZWl0aGVyIGNpcGhlclNwaSBpcyB7QGNvZGUgbnVsbH0gb3IgcHJvdmlkZXIgaXMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgbnVsbH0gYW5kIHtAY29kZSBjaXBoZXJTcGl9IGlzIGEge0Bjb2RlIE51bGxDaXBoZXJTcGl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBDaXBoZXIoQ2lwaGVyU3BpIGNpcGhlclNwaSwgUHJvdmlkZXIgcHJvdmlkZXIsCiAgICAgICAgICAgICBTdHJpbmcgdHJhbnNmb3JtYXRpb24pIHsKQEAgLTEzOCw4ICsxNzMsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IENpcGhlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm1hdGlvbi4gVGhlIGluc3RhbGxlZAorICAgICAqIHByb3ZpZGVycyBhcmUgc2VhcmNoZWQgaW4gb3JkZXIgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbi4gVGhlIGZpcnN0IGZvdW5kIHByb3ZpZGVyIHByb3ZpZGluZyB0aGUgdHJhbnNmb3JtYXRpb24gaXMKKyAgICAgKiB1c2VkIHRvIGNyZWF0ZSB0aGUgY2lwaGVyLiBJZiBubyBwcm92aWRlciBpcyBmb3VuZCBhbiBleGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uCisgICAgICogCisgICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gdG8gY3JlYXRlIGEgY2lwaGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIGEgY2lwaGVyIGZvciB0aGUgcmVxdWVzdGVkIHRyYW5zZm9ybWF0aW9uLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gaW5zdGFsbGVkIHByb3ZpZGVyIGNhbiBwcm92aWRlIHRoZQorICAgICAqICAgICAgICAgICAgIDxpPnRyYW5zZm9ybWF0aW9uPC9pPiwgb3IgaXQgaXMge0Bjb2RlIG51bGx9LCBlbXB0eSBvciBpbiBhbgorICAgICAqICAgICAgICAgICAgIGludmFsaWQgZm9ybWF0LgorICAgICAqIEB0aHJvd3MgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIGluc3RhbGxlZCBwcm92aWRlciBjYW4gcHJvdmlkZSB0aGUgcGFkZGluZyBzY2hlbWUgaW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgPGk+dHJhbnNmb3JtYXRpb248L2k+LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2lwaGVyIGdldEluc3RhbmNlKFN0cmluZyB0cmFuc2Zvcm1hdGlvbikKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24gewpAQCAtMTQ3LDggKzE5NywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcgY2lwaGVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZQorICAgICAqIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBjcmVhdGUgYSBjaXBoZXIgZm9yLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHRvIGFzayBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uLgorICAgICAqIEByZXR1cm4gYSBjaXBoZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGNhbiBub3QgcHJvdmlkZSB0aGUKKyAgICAgKiAgICAgICAgICAgICA8aT50cmFuc2Zvcm1hdGlvbjwvaT4sIG9yIGl0IGlzIHtAY29kZSBudWxsfSwgZW1wdHkgb3IgaW4gYW4KKyAgICAgKiAgICAgICAgICAgICBpbnZhbGlkIGZvcm1hdC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gcHJvdmlkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgY2FuIGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgcGFkZGluZyBzY2hlbWUgaW4gdGhlIDxpPnRyYW5zZm9ybWF0aW9uPC9pPgorICAgICAqICAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENpcGhlciBnZXRJbnN0YW5jZShTdHJpbmcgdHJhbnNmb3JtYXRpb24sCiAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCkBAIC0xNjYsOCArMjM0LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyBjaXBoZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gdG8gY3JlYXRlIGEgY2lwaGVyIGZvci4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciB0byBhc2sgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgY2lwaGVyIGZvciB0aGUgcmVxdWVzdGVkIHRyYW5zZm9ybWF0aW9uLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW4gbm90IHByb3ZpZGUgdGhlCisgICAgICogICAgICAgICAgICAgPGk+dHJhbnNmb3JtYXRpb248L2k+LCBvciBpdCBpcyB7QGNvZGUgbnVsbH0sIGVtcHR5IG9yIGluIGFuCisgICAgICogICAgICAgICAgICAgaW52YWxpZCBmb3JtYXQuCisgICAgICogQHRocm93cyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBwYWRkaW5nIHNjaGVtZSBpbiB0aGUgPGk+dHJhbnNmb3JtYXRpb248L2k+CisgICAgICogICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlciBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaXBoZXIgZ2V0SW5zdGFuY2UoU3RyaW5nIHRyYW5zZm9ybWF0aW9uLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCkBAIC0yODksMzIgKzM3Miw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIG9mIHRoaXMgY2lwaGVyIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG9mIHRoaXMgY2lwaGVyIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlciBnZXRQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBvZiB0aGlzIGNpcGhlciBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSA8aT50cmFuc2Zvcm1hdGlvbjwvaT4gYXJndW1lbnQgdXNlZCBpbiB0aGUKKyAgICAgKiB7QGNvZGUgZ2V0SW5zdGFuY2V9IGNhbGwgY3JlYXRpbmcgdGhpcyBvYmplY3QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBvZiB0aGlzIGNpcGhlciBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1hdGlvbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoaXMgY2lwaGVycyBibG9jayBzaXplIChpbiBieXRlcykuCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzIGNpcGhlcnMgYmxvY2sgc2l6ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldEJsb2NrU2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lR2V0QmxvY2tTaXplKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIGluIGJ5dGVzIGFuIG91dHB1dCBidWZmZXIgbmVlZHMgdG8gYmUgd2hlbiB0aGlzIGNpcGhlcgorICAgICAqIGlzIHVwZGF0ZWQgd2l0aCB7QGNvZGUgaW5wdXRMZW59IGJ5dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dExlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgaW5wdXQuCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlciBsZW5ndGggZm9yIHRoZSBpbnB1dCBsZW5ndGguCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0T3V0cHV0U2l6ZShpbnQgaW5wdXRMZW4pIHsKICAgICAgICAgaWYgKG1vZGUgPT0gMCkgewpAQCAtMzI1LDI0ICs0MjUsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSA8aT5pbml0aWFsaXphdGlvbiB2ZWN0b3I8L2k+IGZvciB0aGlzIGNpcGhlciBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSA8aT5pbml0aWFsaXphdGlvbiB2ZWN0b3I8L2k+IGZvciB0aGlzIGNpcGhlciBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldElWKCkgewogICAgICAgICByZXR1cm4gc3BpSW1wbC5lbmdpbmVHZXRJVigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgdGhhdCB3aGVyZSB1c2VkIHRvIGNyZWF0ZSB0aGlzIGNpcGhlciBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGVzZSBtYXkgYmUgYSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSB0aGlzIGNpcGhlcgorICAgICAqIGluc3RhbmNlLCBvciBtYXkgYmUgYSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0IGFuZCByYW5kb20gcGFyYW1ldGVycywKKyAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgY2lwaGVyIGltcGxlbWVudGF0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgdGhhdCB3aGVyZSB1c2VkIHRvIGNyZWF0ZSB0aGlzIGNpcGhlciBpbnN0YW5jZSwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGFueQorICAgICAqICAgICAgICAgcGFyYW1ldGVycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQWxnb3JpdGhtUGFyYW1ldGVycyBnZXRQYXJhbWV0ZXJzKCkgewogICAgICAgICByZXR1cm4gc3BpSW1wbC5lbmdpbmVHZXRQYXJhbWV0ZXJzKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgZXhlbXB0aW9uIG1lY2hhbmlzbSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjaXBoZXIuCisgICAgICogCisgICAgICogQHJldHVybiBjdXJyZW50bHkge0Bjb2RlIG51bGx9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEV4ZW1wdGlvbk1lY2hhbmlzbSBnZXRFeGVtcHRpb25NZWNoYW5pc20oKSB7CiAgICAgICAgIC8vRklYTUUgaW1wbGVtZW50IGdldEV4ZW1wdGlvbk1lY2hhbmlzbQpAQCAtMzU2LDggKzQ2OCwzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMgY2lwaGVyIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogPHA+CisgICAgICogVGhlIGNpcGhlciBpcyBpbml0aWFsaXplZCBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb25hbCBtb2RlIChvbmUgb2Y6CisgICAgICogZW5jcnlwdGlvbiwgZGVjcnlwdGlvbiwga2V5IHdyYXBwaW5nIG9yIGtleSB1bndyYXBwaW5nKSBkZXBlbmRpbmcgb24KKyAgICAgKiB7QGNvZGUgb3Btb2RlfS4KKyAgICAgKiA8L3A+CisgICAgICogSWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgbmVlZHMgYW55IGFsZ29yaXRobSBwYXJhbWV0ZXJzIG9yIHJhbmRvbSB2YWx1ZXMKKyAgICAgKiB0aGF0IHRoZSBzcGVjaWZpZWQga2V5IGNhbiBub3QgcHJvdmlkZSwgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiB0aGlzIGNpcGhlciBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyAodXNpbmcgaXRzCisgICAgICogcHJvdmlkZXIgb3IgcmFuZG9tIHZhbHVlcykuCisgICAgICogPHA+CisgICAgICogV2hlbiBhIGNpcGhlciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gYW55IG9mIHRoZSB7QGNvZGUKKyAgICAgKiBpbml0fSBtZXRob2RzLCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGlzIG92ZXJyaWRkZW4sIG1lYW5pbmcgdGhhdCBpdAorICAgICAqIGlzIGVxdWl2YWxlbnQgdG8gY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UgYW5kIGNhbGxpbmcgaXRzIHtAY29kZSBpbml0fQorICAgICAqIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG9wbW9kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0aGlzIGNpcGhlciBpbnN0YW5jZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgZm9yCisgICAgICogICAgICAgICAgICAob25lIG9mOiB7QGNvZGUgRU5DUllQVF9NT0RFfSwge0Bjb2RlIERFQ1JZUFRfTU9ERX0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgV1JBUF9NT0RFfSBvciB7QGNvZGUgVU5XUkFQX01PREV9KS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQga2V5IGZvciB0aGUgb3BlcmF0aW9uLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbiBub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChpbnQgb3Btb2RlLCBLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzZWNfcmFuZCA9PSBudWxsKSB7CkBAIC0zNzAsOCArNTA3LDM4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjaXBoZXIgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgYSBzb3VyY2Ugb2YKKyAgICAgKiByYW5kb21uZXNzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaXBoZXIgaXMgaW5pdGlhbGl6ZWQgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uYWwgbW9kZSAob25lIG9mOgorICAgICAqIGVuY3J5cHRpb24sIGRlY3J5cHRpb24sIGtleSB3cmFwcGluZyBvciBrZXkgdW53cmFwcGluZykgZGVwZW5kaW5nIG9uCisgICAgICoge0Bjb2RlIG9wbW9kZX0uCisgICAgICogPC9wPgorICAgICAqIElmIHRoaXMgY2lwaGVyIGluc3RhbmNlIG5lZWRzIGFueSBhbGdvcml0aG0gcGFyYW1ldGVycyBvciByYW5kb20gdmFsdWVzCisgICAgICogdGhhdCB0aGUgc3BlY2lmaWVkIGtleSBjYW4gbm90IHByb3ZpZGUsIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mCisgICAgICogdGhpcyBjaXBoZXIgaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgKHVzaW5nIGl0cworICAgICAqIHByb3ZpZGVyIG9yIHJhbmRvbSB2YWx1ZXMpLiBSYW5kb20gdmFsdWVzIGFyZSBnZW5lcmF0ZWQgdXNpbmcge0Bjb2RlCisgICAgICogcmFuZG9tfTsKKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgY2lwaGVyIGluc3RhbmNlIGlzIGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBhbnkgb2YgdGhlIHtAY29kZQorICAgICAqIGluaXR9IG1ldGhvZHMsIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgaXMgb3ZlcnJpZGRlbiwgbWVhbnMgaXQgaXMKKyAgICAgKiBlcXVpdmFsZW50IHRvIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIGFuZCBjYWxsaW5nIGl0IHtAY29kZSBpbml0fSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdGhpcyBjaXBoZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIGZvcgorICAgICAqICAgICAgICAgICAgKG9uZSBvZjoge0Bjb2RlIEVOQ1JZUFRfTU9ERX0sIHtAY29kZSBERUNSWVBUX01PREV9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFdSQVBfTU9ERX0gb3Ige0Bjb2RlIFVOV1JBUF9NT0RFfSkuCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGtleSBmb3IgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9mIHJhbmRvbW5lc3MgdG8gdXNlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbiBub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBvcG1vZGUgaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KGludCBvcG1vZGUsIEtleSBrZXksIFNlY3VyZVJhbmRvbSByYW5kb20pCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CkBAIC0zODcsOCArNTU0LDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjaXBoZXIgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgYWxnb3JpdGhtCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2lwaGVyIGlzIGluaXRpYWxpemVkIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbmFsIG1vZGUgKG9uZSBvZjoKKyAgICAgKiBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLCBrZXkgd3JhcHBpbmcgb3Iga2V5IHVud3JhcHBpbmcpLgorICAgICAqIDwvcD4KKyAgICAgKiBJZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBuZWVkcyBhbnkgYWxnb3JpdGhtIHBhcmFtZXRlcnMgYW5kIHtAY29kZSBwYXJhbXN9CisgICAgICogaXMge0Bjb2RlIG51bGx9LCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNpcGhlciBpcyBzdXBwb3NlZAorICAgICAqIHRvIGdlbmVyYXRlIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzICh1c2luZyBpdHMgcHJvdmlkZXIgb3IgcmFuZG9tCisgICAgICogdmFsdWVzKS4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgY2lwaGVyIGluc3RhbmNlIGlzIGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBhbnkgb2YgdGhlIHtAY29kZQorICAgICAqIGluaXR9IG1ldGhvZHMsIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgaXMgb3ZlcnJpZGRlbiwgbWVhbnMgaXQgaXMKKyAgICAgKiBlcXVpdmFsZW50IHRvIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIGFuZCBjYWxsaW5nIGl0IHtAY29kZSBpbml0fSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdGhpcyBjaXBoZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIGZvcgorICAgICAqICAgICAgICAgICAgKG9uZSBvZjoge0Bjb2RlIEVOQ1JZUFRfTU9ERX0sIHtAY29kZSBERUNSWVBUX01PREV9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFdSQVBfTU9ERX0gb3Ige0Bjb2RlIFVOV1JBUF9NT0RFfSkuCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGtleSBmb3IgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtIHBhcmFtZXRlcnMuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2FuIG5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcworICAgICAqICAgICAgICAgICAgIGNpcGhlciBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpdCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChpbnQgb3Btb2RlLCBLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKQEAgLTM5OSw4ICs1OTUsNDIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIGNpcGhlciBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbGdvcml0aG0KKyAgICAgKiBwYXJhbWV0ZXJzIGFuZCBhIHNvdXJjZSBvZiByYW5kb21uZXNzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaXBoZXIgaXMgaW5pdGlhbGl6ZWQgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uYWwgbW9kZSAob25lIG9mOgorICAgICAqIGVuY3J5cHRpb24sIGRlY3J5cHRpb24sIGtleSB3cmFwcGluZyBvciBrZXkgdW53cmFwcGluZykgZGVwZW5kaW5nIG9uCisgICAgICoge0Bjb2RlIG9wbW9kZX0uCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgbmVlZHMgYW55IGFsZ29yaXRobSBwYXJhbWV0ZXJzIGFuZCB7QGNvZGUgcGFyYW1zfQorICAgICAqIGlzIHtAY29kZSBudWxsfSwgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjaXBoZXIgaXMgc3VwcG9zZWQKKyAgICAgKiB0byBnZW5lcmF0ZSB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyAodXNpbmcgaXRzIHByb3ZpZGVyIG9yIHJhbmRvbQorICAgICAqIHZhbHVlcykuIFJhbmRvbSB2YWx1ZXMgYXJlIGdlbmVyYXRlZCB1c2luZyB7QGNvZGUgcmFuZG9tfTsKKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgY2lwaGVyIGluc3RhbmNlIGlzIGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBhbnkgb2YgdGhlIHtAY29kZQorICAgICAqIGluaXR9IG1ldGhvZHMsIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgaXMgb3ZlcnJpZGRlbiwgbWVhbmluZyB0aGF0IGl0CisgICAgICogaXMgZXF1aXZhbGVudCB0byBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBhbmQgY2FsbGluZyBpdCB7QGNvZGUgaW5pdH0KKyAgICAgKiBtZXRob2QuCisgICAgICogCisgICAgICogQHBhcmFtIG9wbW9kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0aGlzIGNpcGhlciBpbnN0YW5jZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgZm9yCisgICAgICogICAgICAgICAgICAob25lIG9mOiB7QGNvZGUgRU5DUllQVF9NT0RFfSwge0Bjb2RlIERFQ1JZUFRfTU9ERX0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgV1JBUF9NT0RFfSBvciB7QGNvZGUgVU5XUkFQX01PREV9KS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQga2V5IGZvciB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9mIHJhbmRvbW5lc3MgdG8gdXNlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbiBub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaXQgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFyZSBpbmFwcHJvcHJpYXRlIGZvciB0aGlzCisgICAgICogICAgICAgICAgICAgY2lwaGVyLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQge0Bjb2RlIG9wbW9kZX0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KGludCBvcG1vZGUsIEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLAogICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCkBAIC00MjAsOCArNjUwLDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjaXBoZXIgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgYWxnb3JpdGhtCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2lwaGVyIGlzIGluaXRpYWxpemVkIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiAob25lIG9mOgorICAgICAqIGVuY3J5cHRpb24sIGRlY3J5cHRpb24sIGtleSB3cmFwcGluZyBvciBrZXkgdW53cmFwcGluZykgZGVwZW5kaW5nIG9uCisgICAgICoge0Bjb2RlIG9wbW9kZX0uCisgICAgICogPC9wPgorICAgICAqIElmIHRoaXMgY2lwaGVyIGluc3RhbmNlIG5lZWRzIGFueSBhbGdvcml0aG0gcGFyYW1ldGVycyBhbmQge0Bjb2RlIHBhcmFtc30KKyAgICAgKiBpcyB7QGNvZGUgbnVsbH0sIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2lwaGVyIGlzIHN1cHBvc2VkCisgICAgICogdG8gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgKHVzaW5nIGl0cyBwcm92aWRlciBvciByYW5kb20KKyAgICAgKiB2YWx1ZXMpLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYSBjaXBoZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIGFueSBvZiB0aGUge0Bjb2RlCisgICAgICogaW5pdH0gbWV0aG9kcywgdGhlIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSBpcyBvdmVycmlkZGVuLCBtZWFuaW5nIHRoYXQgaXQKKyAgICAgKiBpcyBlcXVpdmFsZW50IHRvIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIGFuZCBjYWxsaW5nIGl0IHtAY29kZSBpbml0fQorICAgICAqIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG9wbW9kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0aGlzIGNpcGhlciBpbnN0YW5jZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgZm9yCisgICAgICogICAgICAgICAgICAob25lIG9mOiB7QGNvZGUgRU5DUllQVF9NT0RFfSwge0Bjb2RlIERFQ1JZUFRfTU9ERX0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgV1JBUF9NT0RFfSBvciB7QGNvZGUgVU5XUkFQX01PREV9KS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQga2V5IGZvciB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBjYW4gbm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogICAgICAgICAgICAgY2lwaGVyIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGl0IHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgIGNpcGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KGludCBvcG1vZGUsIEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW1zKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpAQCAtNDMyLDggKzY5Myw0MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMgY2lwaGVyIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFsZ29yaXRobQorICAgICAqIHBhcmFtZXRlcnMgYW5kIGEgc291cmNlIG9mIHJhbmRvbW5lc3MuCisgICAgICogPHA+CisgICAgICogVGhlIGNpcGhlciB3aWxsIGJlIGluaXRpYWxpemVkIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiAob25lIG9mOgorICAgICAqIGVuY3J5cHRpb24sIGRlY3J5cHRpb24sIGtleSB3cmFwcGluZyBvciBrZXkgdW53cmFwcGluZykgZGVwZW5kaW5nIG9uCisgICAgICoge0Bjb2RlIG9wbW9kZX0uCisgICAgICogPC9wPgorICAgICAqIElmIHRoaXMgY2lwaGVyIGluc3RhbmNlIG5lZWRzIGFueSBhbGdvcml0aG0gcGFyYW1ldGVycyBhbmQge0Bjb2RlIHBhcmFtc30KKyAgICAgKiBpcyB7QGNvZGUgbnVsbH0sIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2lwaGVyIGlzIHN1cHBvc2VkCisgICAgICogdG8gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgKHVzaW5nIGl0cyBwcm92aWRlciBvciByYW5kb20KKyAgICAgKiB2YWx1ZXMpLiBSYW5kb20gdmFsdWVzIGFyZSBnZW5lcmF0ZWQgdXNpbmcge0Bjb2RlIHJhbmRvbX0uCisgICAgICogPHA+CisgICAgICogV2hlbiBhIGNpcGhlciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gYW55IG9mIHRoZSB7QGNvZGUKKyAgICAgKiBpbml0fSBtZXRob2RzLCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGlzIG92ZXJyaWRkZW4sIG1lYW5zIGl0IGlzCisgICAgICogZXF1aXZhbGVudCB0byBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBhbmQgY2FsbGluZyBpdCB7QGNvZGUgaW5pdH0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3Btb2RlCisgICAgICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uIHRoaXMgY2lwaGVyIGluc3RhbmNlIHNob3VsZCBiZSBpbml0aWFsaXplZCBmb3IKKyAgICAgKiAgICAgICAgICAgIChvbmUgb2Y6IHtAY29kZSBFTkNSWVBUX01PREV9LCB7QGNvZGUgREVDUllQVF9NT0RFfSwge0Bjb2RlCisgICAgICogICAgICAgICAgICBXUkFQX01PREV9IG9yIHtAY29kZSBVTldSQVBfTU9ERX0pLgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBrZXkgZm9yIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIGFsZ29yaXRobSBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgcmFuZG9tbmVzcyB0byB1c2UuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2FuIG5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcworICAgICAqICAgICAgICAgICAgIGNpcGhlciBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIuCisgICAgICogQHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCB7QGNvZGUgb3Btb2RlfSBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoaW50IG9wbW9kZSwgS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMsCiAgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwKQEAgLTQ1Myw4ICs3NDgsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIGNpcGhlciBpbnN0YW5jZSB3aXRoIHRoZSBwdWJsaWMga2V5IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIGNlcnRpZmljYXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaXBoZXIgd2lsbCBiZSBpbml0aWFsaXplZCBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gKG9uZSBvZjoKKyAgICAgKiBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLCBrZXkgd3JhcHBpbmcgb3Iga2V5IHVud3JhcHBpbmcpIGRlcGVuZGluZyBvbgorICAgICAqIHtAY29kZSBvcG1vZGV9LgorICAgICAqIDxwPgorICAgICAqIEl0IHRoZSB0eXBlIG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBYLjUwOSBhbmQgdGhlIGNlcnRpZmljYXRlIGhhcyBhIDxpPmtleQorICAgICAqIHVzYWdlPC9pPiBleHRlbnNpb24gZmllbGQgbWFya2VkIGFzIGNyaXRpY2FsLCB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIG9wbW9kZX0gaGFzIHRoZSBiZSBlbmFibGVkIGZvciB0aGlzIGtleSwgb3RoZXJ3aXNlIGFuIHtAY29kZQorICAgICAqIEludmFsaWRLZXlFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBuZWVkcyBhbnkgYWxnb3JpdGhtIHBhcmFtZXRlcnMgdGhhdCB0aGUga2V5IGluCisgICAgICogdGhlIGNlcnRpZmljYXRlIGNhbiBub3QgcHJvdmlkZSwgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhpcworICAgICAqIGNpcGhlciBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyAodXNpbmcgaXRzCisgICAgICogcHJvdmlkZXIgb3IgcmFuZG9tIHZhbHVlcykuCisgICAgICogPHA+CisgICAgICogV2hlbiBhIGNpcGhlciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gYW55IG9mIHRoZSB7QGNvZGUKKyAgICAgKiBpbml0fSBtZXRob2RzLCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGlzIG92ZXJyaWRkZW4sIG1lYW5zIGl0IGlzCisgICAgICogZXF1aXZhbGVudCB0byBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBhbmQgY2FsbGluZyBpdCB7QGNvZGUgaW5pdH0gbWV0aG9kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdGhpcyBjaXBoZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIGZvcgorICAgICAqICAgICAgICAgICAgKG9uZSBvZjoge0Bjb2RlIEVOQ1JZUFRfTU9ERX0sIHtAY29kZSBERUNSWVBUX01PREV9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFdSQVBfTU9ERX0gb3Ige0Bjb2RlIFVOV1JBUF9NT0RFfSkuCisgICAgICogQHBhcmFtIGNlcnRpZmljYXRlCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIGNlcnRpZmljYXRlIGNhbiBub3QgYmUgdXNlZCB0bworICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemUgdGhpcyBjaXBoZXIgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChpbnQgb3Btb2RlLCBDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKQEAgLTQ2NSw4ICs3ODksNDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIGNpcGhlciBpbnN0YW5jZSB3aXRoIHRoZSBwdWJsaWMga2V5IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIGNlcnRpZmljYXRlIGFuZCBhIHNvdXJjZSBvZiByYW5kb21uZXNzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaXBoZXIgd2lsbCBiZSBpbml0aWFsaXplZCBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gKG9uZSBvZjoKKyAgICAgKiBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLCBrZXkgd3JhcHBpbmcgb3Iga2V5IHVud3JhcHBpbmcpIGRlcGVuZGluZyBvbgorICAgICAqIHtAY29kZSBvcG1vZGV9LgorICAgICAqIDwvcD4KKyAgICAgKiBJdCB0aGUgdHlwZSBvZiB0aGUgY2VydGlmaWNhdGUgaXMgWC41MDkgYW5kIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgYSA8aT5rZXkKKyAgICAgKiB1c2FnZTwvaT4gZXh0ZW5zaW9uIGZpZWxkIG1hcmtlZCBhcyBjcml0aWNhbCwgdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBvcG1vZGV9IGhhcyB0aGUgYmUgZW5hYmxlZCBmb3IgdGhpcyBrZXksIG90aGVyd2lzZSBhbiB7QGNvZGUKKyAgICAgKiBJbnZhbGlkS2V5RXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgbmVlZHMgYW55IGFsZ29yaXRobSBwYXJhbWV0ZXJzIHRoYXQgdGhlIGtleSBpbgorICAgICAqIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gbm90IHByb3ZpZGUsIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKKyAgICAgKiBjaXBoZXIgaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgKHVzaW5nIGl0cworICAgICAqIHByb3ZpZGVyIG9yIHJhbmRvbSB2YWx1ZXMpLiBSYW5kb20gdmFsdWVzIGFyZSBnZW5lcmF0ZWQgdXNpbmcge0Bjb2RlCisgICAgICogcmFuZG9tfS4KKyAgICAgKiA8L3A+CisgICAgICogV2hlbiBhIGNpcGhlciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gYW55IG9mIHRoZSB7QGNvZGUKKyAgICAgKiBpbml0fSBtZXRob2RzLCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGlzIG92ZXJyaWRkZW4sIG1lYW5zIGl0IGlzCisgICAgICogZXF1aXZhbGVudCB0byBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBhbmQgY2FsbGluZyBpdCB7QGNvZGUgaW5pdH0gbWV0aG9kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdGhpcyBjaXBoZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIGZvcgorICAgICAqICAgICAgICAgICAgKG9uZSBvZjoge0Bjb2RlIEVOQ1JZUFRfTU9ERX0sIHtAY29kZSBERUNSWVBUX01PREV9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFdSQVBfTU9ERX0gb3Ige0Bjb2RlIFVOV1JBUF9NT0RFfSkuCisgICAgICogQHBhcmFtIGNlcnRpZmljYXRlCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUuCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiByYW5kb21uZXNzIHRvIGJlIHVzZWQuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIGNlcnRpZmljYXRlIGNhbiBub3QgYmUgdXNlZCB0bworICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemUgdGhpcyBjaXBoZXIgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChpbnQgb3Btb2RlLCBDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20pIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKQEAgLTUxNiw4ICs4NzIsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb250aW51ZXMgYSBtdWx0aS1wYXJ0IHRyYW5zZm9ybWF0aW9uIChlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24pLiBUaGUKKyAgICAgKiB0cmFuc2Zvcm1lZCBieXRlcyBhcmUgcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnl0ZXMgdG8gdHJhbnNmb3JtLgorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIGJ5dGVzIGluIGEgbmV3IGJ1ZmZlciwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqICAgICAgICAgaW5wdXQgaGFzIHplcm8gbGVuZ3RoLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSB1cGRhdGUoYnl0ZVtdIGlucHV0KSB7CiAgICAgICAgIGlmIChtb2RlICE9IEVOQ1JZUFRfTU9ERSAmJiBtb2RlICE9IERFQ1JZUFRfTU9ERSkgewpAQCAtNTM0LDggKzkwMSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnRpbnVlcyBhIG11bHRpLXBhcnQgdHJhbnNmb3JtYXRpb24gKGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbikuIFRoZQorICAgICAqIHRyYW5zZm9ybWVkIGJ5dGVzIGFyZSByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBieXRlcyB0byB0cmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGlucHV0T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBpbnB1dCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gaW5wdXRMZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBieXRlcyBpbiBhIG5ldyBidWZmZXIsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGlucHV0IGhhcyB6ZXJvIGxlbmd0aC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2lwaGVyIGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZCBmb3IgZW5jcnlwdGlvbiBvcgorICAgICAqICAgICAgICAgICAgIGRlY3J5cHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW5wdXQgaXMge0Bjb2RlIG51bGx9LCBvciBpZiB7QGNvZGUgaW5wdXRPZmZzZXR9IGFuZAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBpbnB1dExlbn0gZG8gbm90IHNwZWNpZnkgYSB2YWxpZCBjaHVuayBpbiB0aGUgaW5wdXQKKyAgICAgKiAgICAgICAgICAgICBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSB1cGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbikgewogICAgICAgICBpZiAobW9kZSAhPSBFTkNSWVBUX01PREUgJiYgbW9kZSAhPSBERUNSWVBUX01PREUpIHsKQEAgLTU1OCw4ICs5NDIsMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb250aW51ZXMgYSBtdWx0aS1wYXJ0IHRyYW5zZm9ybWF0aW9uIChlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24pLiBUaGUKKyAgICAgKiB0cmFuc2Zvcm1lZCBieXRlcyBhcmUgc3RvcmVkIGluIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNpemUgb2YgdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlciBpcyB0b28gc21hbGwgdG8gaG9sZCB0aGUgcmVzdWx0LAorICAgICAqIGEge0Bjb2RlIFNob3J0QnVmZmVyRXhjZXB0aW9ufSBpcyB0aHJvd24uIFVzZQorICAgICAqIHtAbGluayBDaXBoZXIjZ2V0T3V0cHV0U2l6ZSBnZXRPdXRwdXRTaXplfSB0byBjaGVjayBmb3IgdGhlIHNpemUgb2YgdGhlCisgICAgICogb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnl0ZXMgdG8gdHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBpbnB1dE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgaW5wdXQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIGlucHV0TGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCB0byB0cmFuc2Zvcm0uCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbiBvdXRwdXQuCisgICAgICogQHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBpcyB7QGNvZGUgbnVsbH0sIHRoZSBvdXRwdXQgaXMge0Bjb2RlIG51bGx9LCBvcgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbnB1dE9mZnNldH0gYW5kIHtAY29kZSBpbnB1dExlbn0gZG8gbm90IHNwZWNpZnkgYQorICAgICAqICAgICAgICAgICAgIHZhbGlkIGNodW5rIGluIHRoZSBpbnB1dCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCB1cGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwKICAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CkBAIC01NjcsOCArOTc3LDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29udGludWVzIGEgbXVsdGktcGFydCB0cmFuc2Zvcm1hdGlvbiAoZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uKS4gVGhlCisgICAgICogdHJhbnNmb3JtZWQgYnl0ZXMgYXJlIHN0b3JlZCBpbiB0aGUge0Bjb2RlIG91dHB1dH0gYnVmZmVyLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIHJlc3VsdCwKKyAgICAgKiBhIHtAY29kZSBTaG9ydEJ1ZmZlckV4Y2VwdGlvbn0gaXMgdGhyb3duLiBVc2UKKyAgICAgKiB7QGxpbmsgQ2lwaGVyI2dldE91dHB1dFNpemUgZ2V0T3V0cHV0U2l6ZX0gdG8gY2hlY2sgZm9yIHRoZSBzaXplIG9mIHRoZQorICAgICAqIG91dHB1dCBidWZmZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ5dGVzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAcGFyYW0gaW5wdXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGlucHV0IHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSBpbnB1dExlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgdG8gdHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBvdXRwdXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbiBvdXRwdXQuCisgICAgICogQHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBpcyB7QGNvZGUgbnVsbH0sIHRoZSBvdXRwdXQgaXMge0Bjb2RlIG51bGx9LCBvcgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbnB1dE9mZnNldH0gYW5kIHtAY29kZSBpbnB1dExlbn0gZG8gbm90IHNwZWNpZnkgYQorICAgICAqICAgICAgICAgICAgIHZhbGlkIGNodW5rIGluIHRoZSBpbnB1dCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCB1cGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwKICAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQsIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CkBAIC02MDAsOCArMTAzOCwzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnRpbnVlcyBhIG11bHRpLXBhcnQgdHJhbnNmb3JtYXRpb24gKGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbikuIFRoZQorICAgICAqIHtAY29kZSBpbnB1dC5yZW1haW5pbmcoKX0gYnl0ZXMgc3RhcnRpbmcgYXQge0Bjb2RlIGlucHV0LnBvc2l0aW9uKCl9IGFyZQorICAgICAqIHRyYW5zZm9ybWVkIGFuZCBzdG9yZWQgaW4gdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIG91dHB1dC5yZW1haW5pbmcoKX0gaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIHRyYW5zZm9ybWVkCisgICAgICogYnl0ZXMgYSB7QGNvZGUgU2hvcnRCdWZmZXJFeGNlcHRpb259IGlzIHRocm93bi4gVXNlCisgICAgICoge0BsaW5rIENpcGhlciNnZXRPdXRwdXRTaXplIGdldE91dHB1dFNpemV9IHRvIGNoZWNrIGZvciB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgKiBvdXRwdXQgYnVmZmVyLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBidWZmZXIgdG8gdHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHQgd2l0aGluLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBzdG9yZWQgaW4gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgYnVmZmVyIGFyZSB0aGUgaWRlbnRpY2FsCisgICAgICogICAgICAgICAgICAgb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgdXBkYXRlKEJ5dGVCdWZmZXIgaW5wdXQsIEJ5dGVCdWZmZXIgb3V0cHV0KQogICAgICAgICAgICAgdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uIHsKQEAgLTYxNyw4ICsxMDc3LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogRmluaXNoZXMgYSBtdWx0aS1wYXJ0IHRyYW5zZm9ybWF0aW9uIChlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24pLgorICAgICAqIDxwPgorICAgICAqIFByb2Nlc3NlcyBhbnkgYnl0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGJ1ZmZlcmVkIGluIHByZXZpb3VzIHtAY29kZQorICAgICAqIHVwZGF0ZX0gY2FsbHMuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZpbmFsIGJ5dGVzIGZyb20gdGhlIHRyYW5zZm9ybWF0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYnl0ZXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlCisgICAgICogICAgICAgICAgICAgY2lwaGVyIGJsb2NrIHNpemUuCisgICAgICogQHRocm93cyBCYWRQYWRkaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhZGRpbmcgb2YgdGhlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBhZGRpbmcgc2NoZW1lLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGRvRmluYWwoKSB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwKICAgICAgICAgICAgIEJhZFBhZGRpbmdFeGNlcHRpb24gewpAQCAtNjMwLDggKzExMDQsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBGaW5pc2hlcyBhIG11bHRpLXBhcnQgdHJhbnNmb3JtYXRpb24gKGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbikuCisgICAgICogPHA+CisgICAgICogUHJvY2Vzc2VzIGFueSBieXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gYnVmZmVyZWQgaW4gcHJldmlvdXMge0Bjb2RlCisgICAgICogdXBkYXRlfSBjYWxscy4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIGZpbmFsIHRyYW5zZm9ybWVkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gb3V0cHV0T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW4gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBieXRlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgYmxvY2sgc2l6ZS4KKyAgICAgKiBAdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICogQHRocm93cyBCYWRQYWRkaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhZGRpbmcgb2YgdGhlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBhZGRpbmcgc2NoZW1lLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGRvRmluYWwoYnl0ZVtdIG91dHB1dCwgaW50IG91dHB1dE9mZnNldCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLCBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwKQEAgLTY0OCw4ICsxMTQzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogRmluaXNoZXMgYSBtdWx0aS1wYXJ0IHRyYW5zZm9ybWF0aW9uIChlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24pLgorICAgICAqIDxwPgorICAgICAqIFByb2Nlc3NlcyB0aGUgYnl0ZXMgaW4ge0Bjb2RlIGlucHV0fSBidWZmZXIsIGFuZCBhbnkgYnl0ZXMgdGhhdCBoYXZlIGJlZW4KKyAgICAgKiBidWZmZXJlZCBpbiBwcmV2aW91cyB7QGNvZGUgdXBkYXRlfSBjYWxscy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEByZXR1cm4gdGhlIGZpbmFsIGJ5dGVzIGZyb20gdGhlIHRyYW5zZm9ybWF0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYnl0ZXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlCisgICAgICogICAgICAgICAgICAgY2lwaGVyIGJsb2NrIHNpemUuCisgICAgICogQHRocm93cyBCYWRQYWRkaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhZGRpbmcgb2YgdGhlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBhZGRpbmcgc2NoZW1lLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGRvRmluYWwoYnl0ZVtdIGlucHV0KSB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwKICAgICAgICAgICAgIEJhZFBhZGRpbmdFeGNlcHRpb24gewpAQCAtNjYxLDggKzExNzIsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBGaW5pc2hlcyBhIG11bHRpLXBhcnQgdHJhbnNmb3JtYXRpb24gKGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbikuCisgICAgICogPHA+CisgICAgICogUHJvY2Vzc2VzIHRoZSB7QGNvZGUgaW5wdXRMZW59IGJ5dGVzIGluIHtAY29kZSBpbnB1dH0gYnVmZmVyIGF0IHtAY29kZQorICAgICAqIGlucHV0T2Zmc2V0fSwgYW5kIGFueSBieXRlcyB0aGF0IGhhdmUgYmVlbiBidWZmZXJlZCBpbiBwcmV2aW91cyB7QGNvZGUKKyAgICAgKiB1cGRhdGV9IGNhbGxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaW5wdXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGlucHV0IGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaW5wdXRMZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0CisgICAgICogQHJldHVybiB0aGUgZmluYWwgYnl0ZXMgZnJvbSB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBieXRlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgYmxvY2sgc2l6ZS4KKyAgICAgKiBAdGhyb3dzIEJhZFBhZGRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFkZGluZyBvZiB0aGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFkZGluZyBzY2hlbWUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBpcyBub3QgaW5pdGlhbGl6ZWQgZm9yIGVuY3J5cHRpb24gb3IKKyAgICAgKiAgICAgICAgICAgICBkZWNyeXB0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGlucHV0T2Zmc2V0fSBhbmQge0Bjb2RlIGlucHV0TGVufSBkbyBub3Qgc3BlY2lmeSBhbgorICAgICAqICAgICAgICAgICAgIHZhbGlkIGNodW5rIGluIHRoZSBpbnB1dCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBkb0ZpbmFsKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LCBpbnQgaW5wdXRMZW4pCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwgQmFkUGFkZGluZ0V4Y2VwdGlvbiB7CkBAIC02NzksOCArMTIxMywzNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEZpbmlzaGVzIGEgbXVsdGktcGFydCB0cmFuc2Zvcm1hdGlvbiAoZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uKS4KKyAgICAgKiA8cD4KKyAgICAgKiBQcm9jZXNzZXMgdGhlIHtAY29kZSBpbnB1dExlbn0gYnl0ZXMgaW4ge0Bjb2RlIGlucHV0fSBidWZmZXIgYXQge0Bjb2RlCisgICAgICogaW5wdXRPZmZzZXR9LCBhbmQgYW55IGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGJ1ZmZlcmVkIGluIHByZXZpb3VzIHtAY29kZQorICAgICAqIHVwZGF0ZX0gY2FsbHMuCisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBpbnB1dE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBpbnB1dExlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSB0cmFuc2Zvcm1lZCBieXRlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUge0Bjb2RlIG91dHB1dH0gYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGJ5dGVzIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIGNpcGhlciBibG9jayBzaXplLgorICAgICAqIEB0aHJvd3MgQmFkUGFkZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYWRkaW5nIG9mIHRoZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBwYWRkaW5nIHNjaGVtZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2lwaGVyIGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZCBmb3IgZW5jcnlwdGlvbiBvcgorICAgICAqICAgICAgICAgICAgIGRlY3J5cHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5wdXRPZmZzZXR9IGFuZCB7QGNvZGUgaW5wdXRMZW59IGRvIG5vdCBzcGVjaWZ5IGFuCisgICAgICogICAgICAgICAgICAgdmFsaWQgY2h1bmsgaW4gdGhlIGlucHV0IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGRvRmluYWwoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwKICAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwKQEAgLTY4OSw4ICsxMjUwLDM4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogRmluaXNoZXMgYSBtdWx0aS1wYXJ0IHRyYW5zZm9ybWF0aW9uIChlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24pLgorICAgICAqIDxwPgorICAgICAqIFByb2Nlc3NlcyB0aGUge0Bjb2RlIGlucHV0TGVufSBieXRlcyBpbiB7QGNvZGUgaW5wdXR9IGJ1ZmZlciBhdCB7QGNvZGUKKyAgICAgKiBpbnB1dE9mZnNldH0sIGFuZCBhbnkgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gYnVmZmVyZWQgaW4gcHJldmlvdXMge0Bjb2RlCisgICAgICogdXBkYXRlfSBjYWxscy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBpbnB1dE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBpbnB1dExlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSB0cmFuc2Zvcm1lZCBieXRlcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW4gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYnl0ZXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlCisgICAgICogICAgICAgICAgICAgY2lwaGVyIGJsb2NrIHNpemUuCisgICAgICogQHRocm93cyBCYWRQYWRkaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhZGRpbmcgb2YgdGhlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBhZGRpbmcgc2NoZW1lLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbnB1dE9mZnNldH0gYW5kIHtAY29kZSBpbnB1dExlbn0gZG8gbm90IHNwZWNpZnkgYW4KKyAgICAgKiAgICAgICAgICAgICB2YWxpZCBjaHVuayBpbiB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZG9GaW5hbChieXRlW10gaW5wdXQsIGludCBpbnB1dE9mZnNldCwgaW50IGlucHV0TGVuLAogICAgICAgICAgICAgYnl0ZVtdIG91dHB1dCwgaW50IG91dHB1dE9mZnNldCkgdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uLApAQCAtNzA5LDggKzEzMDAsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBGaW5pc2hlcyBhIG11bHRpLXBhcnQgdHJhbnNmb3JtYXRpb24gKGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbikuCisgICAgICogPHA+CisgICAgICogUHJvY2Vzc2VzIHRoZSB7QGNvZGUgaW5wdXQucmVtYWluaW5nKCl9IGJ5dGVzIGluIHtAY29kZSBpbnB1dH0gYnVmZmVyIGF0CisgICAgICoge0Bjb2RlIGlucHV0LnBvc2l0aW9uKCl9LCBhbmQgYW55IGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGJ1ZmZlcmVkIGluCisgICAgICogcHJldmlvdXMge0Bjb2RlIHVwZGF0ZX0gY2FsbHMuIFRoZSB0cmFuc2Zvcm1lZCBieXRlcyBhcmUgcGxhY2VkIGludG8KKyAgICAgKiB7QGNvZGUgb3V0cHV0fSBidWZmZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYnl0ZXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlCisgICAgICogICAgICAgICAgICAgY2lwaGVyIGJsb2NrIHNpemUuCisgICAgICogQHRocm93cyBCYWRQYWRkaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhZGRpbmcgb2YgdGhlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBhZGRpbmcgc2NoZW1lLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGlucHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBidWZmZXIgYXJlIHRoZSBzYW1lCisgICAgICogICAgICAgICAgICAgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGRvRmluYWwoQnl0ZUJ1ZmZlciBpbnB1dCwgQnl0ZUJ1ZmZlciBvdXRwdXQpCiAgICAgICAgICAgICB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24sIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sCkBAIC03MjcsOCArMTM0MywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFdyYXBzIGEga2V5IHVzaW5nIHRoaXMgY2lwaGVyIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gd3JhcC4KKyAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIGtleS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGJ5dGVzIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIGNpcGhlciBibG9jayBzaXplLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2lwaGVyIGluc3RhbmNlIGNhbiBub3Qgd3JhcCB0aGlzIGtleS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2lwaGVyIGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZCBmb3Igd3JhcHBpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSB3cmFwKEtleSBrZXkpIHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLAogICAgICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiB7CkBAIC03NDAsOCArMTM2NywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFVud3JhcHMgYSBrZXkgdXNpbmcgdGhpcyBjaXBoZXIgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHdyYXBwZWRLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSB3cmFwcGVkIGtleSB0byB1bndyYXAuCisgICAgICogQHBhcmFtIHdyYXBwZWRLZXlBbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gZm9yIHRoZSB3cmFwcGVkIGtleS4KKyAgICAgKiBAcGFyYW0gd3JhcHBlZEtleVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIGtleSAob25lIG9mOiB7QGNvZGUgU0VDUkVUX0tFWQorICAgICAqICAgICAgICAgICAgPGNvZGU+LCA8Y29kZT5QUklWQVRFX0tFWX0gb3Ige0Bjb2RlIFBVQkxJQ19LRVl9KQorICAgICAqIEByZXR1cm4gdGhlIHVud3JhcHBlZCBrZXkKKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIHdyYXBwZWRLZXl9IGNhbiBub3QgYmUgdW53cmFwcGVkIHRvIGEga2V5IG9mCisgICAgICogICAgICAgICAgICAgdHlwZSB7QGNvZGUgd3JhcHBlZEtleVR5cGV9IGZvciB0aGUge0Bjb2RlCisgICAgICogICAgICAgICAgICAgd3JhcHBlZEtleUFsZ29yaXRobX0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBwcm92aWRlciBjYW4gYmUgZm91bmQgdGhhdCBjYW4gY3JlYXRlIGEga2V5IG9mIHR5cGUKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgd3JhcHBlZEtleVR5cGV9IGZvciB0aGUge0Bjb2RlIHdyYXBwZWRLZXlBbGdvcml0aG19LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciB1bndyYXBwaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBLZXkgdW53cmFwKGJ5dGVbXSB3cmFwcGVkS2V5LCBTdHJpbmcgd3JhcHBlZEtleUFsZ29yaXRobSwKICAgICAgICAgICAgIGludCB3cmFwcGVkS2V5VHlwZSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCkBAIC03NTUsOCArMTQwMCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0ga2V5IGxlbmd0aCBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm1hdGlvbiBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0ga2V5IGxlbmd0aCwgY3VycmVudGx5IHtAY29kZSBJbnRlZ2VyLk1BWF9WQUxVRX0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBwcm92aWRlciBmb3IgdGhlIHNwZWNpZmllZCB7QGNvZGUgdHJhbnNmb3JtYXRpb259IGNhbgorICAgICAqICAgICAgICAgICAgIGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdHJhbnNmb3JtYXRpb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXRNYXhBbGxvd2VkS2V5TGVuZ3RoKFN0cmluZyB0cmFuc2Zvcm1hdGlvbikKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtNzY5LDggKzE0MjMsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGNpcGhlciBwYXJhbWV0ZXIgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbi4gSWYgdGhlcmUgaXMgbm8gbWF4aW11bSBsaW1pdCwge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9uIG5hbWUuCisgICAgICogQHJldHVybiBhIHBhcmFtZXRlciBzcGVjIGhvbGRpbmcgdGhlIG1heGltdW0gdmFsdWUgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqICAgICAgICAgQ3VycmVudGx5IHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZSB0cmFuc2Zvcm1hdGlvbn0gY2FuCisgICAgICogICAgICAgICAgICAgYmUgZm91bmQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0cmFuc2Zvcm1hdGlvbn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBnZXRNYXhBbGxvd2VkUGFyYW1ldGVyU3BlYygKICAgICAgICAgICAgIFN0cmluZyB0cmFuc2Zvcm1hdGlvbikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vQ2lwaGVySW5wdXRTdHJlYW0uamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9DaXBoZXJJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGE5MjU4ZWQuLmNhNjRjNDkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9DaXBoZXJJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9DaXBoZXJJbnB1dFN0cmVhbS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG87CiAKIGltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwpAQCAtMjksNyArMjQsMTcgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhpcyBjbGFzcyB3cmFwcyBhbiB7QGNvZGUgSW5wdXRTdHJlYW19IGFuZCBhIGNpcGhlciBzbyB0aGF0IHtAY29kZSByZWFkKCl9CisgKiBtZXRob2RzIHJldHVybiBkYXRhIHRoYXQgYXJlIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB7QGNvZGUgSW5wdXRTdHJlYW19IGFuZAorICogcHJvY2Vzc2VkIGJ5IHRoZSBjaXBoZXIuCisgKiA8cD4KKyAqIFRoZSBjaXBoZXIgbXVzdCBiZSBpbml0aWFsaXplZCBmb3IgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gYmVmb3JlIGJlaW5nIHVzZWQKKyAqIGJ5IGEge0Bjb2RlIENpcGhlcklucHV0U3RyZWFtfS4gRm9yIGV4YW1wbGUsIGlmIGEgY2lwaGVyIGluaXRpYWxpemVkIGZvcgorICogZGVjcnlwdGlvbiBpcyB1c2VkIHdpdGggYSB7QGNvZGUgQ2lwaGVySW5wdXRTdHJlYW19LCB0aGUge0Bjb2RlCisgKiBDaXBoZXJJbnB1dFN0cmVhbX0gdHJpZXMgdG8gcmVhZCB0aGUgZGF0YSBhbiBkZWNyeXB0IHRoZW0gYmVmb3JlIHJldHVybmluZy4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDaXBoZXJJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKIApAQCAtNDEsNyArNDYsMTQgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQ7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENpcGhlcklucHV0U3RyZWFtfSBpbnN0YW5jZSBmb3IgYW4ge0Bjb2RlCisgICAgICogSW5wdXRTdHJlYW19IGFuZCBhIGNpcGhlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaXBoZXIgdG8gcHJvY2VzcyB0aGUgZGF0YSB3aXRoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaXBoZXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgQ2lwaGVyIGMpIHsKICAgICAgICAgc3VwZXIoaXMpOwpAQCAtNDksMTQgKzYxLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDaXBoZXJJbnB1dFN0cmVhbX0gaW5zdGFuY2UgZm9yIGFuIHtAY29kZQorICAgICAqIElucHV0U3RyZWFtfSB3aXRob3V0IGEgY2lwaGVyLgorICAgICAqIDxwPgorICAgICAqIEEge0Bjb2RlIE51bGxDaXBoZXJ9IGlzIGNyZWF0ZWQgYW5kIHVzZWQgdG8gcHJvY2VzcyB0aGUgZGF0YS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlzCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBDaXBoZXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICB0aGlzKGlzLCBuZXcgTnVsbENpcGhlcigpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJlYWRzIHRoZSBuZXh0IGJ5dGUgZnJvbSB0aGlzIGNpcGhlciBpbnB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBieXRlLCBvciB7QGNvZGUgLTF9IGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTg3LDcgKzExMiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmVhZHMgdGhlIG5leHQge0Bjb2RlIGIubGVuZ3RofSBieXRlcyBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtIGludG8gYnVmZmVyCisgICAgICoge0Bjb2RlIGJ9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZpbGxlZCBpbnRvIGJ1ZmZlciB7QGNvZGUgYn0sIG9yIHtAY29kZSAtMX0KKyAgICAgKiAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtOTUsNyArMTI5LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZWFkcyB0aGUgbmV4dCB7QGNvZGUgbGVufSBieXRlcyBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtIGludG8gYnVmZmVyCisgICAgICoge0Bjb2RlIGJ9IHN0YXJ0aW5nIGF0IG9mZnNldCB7QGNvZGUgb2ZmfS4KKyAgICAgKiA8cD4KKyAgICAgKiBpZiB7QGNvZGUgYn0gaXMge0Bjb2RlIG51bGx9LCB0aGUgbmV4dCB7QGNvZGUgbGVufSBieXRlcyBhcmUgcmVhZCBhbmQKKyAgICAgKiBkaXNjYXJkZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0byBzdGFydCBpbiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBmaWxsZWQgaW50byBidWZmZXIge0Bjb2RlIGJ9LCBvciB7QGNvZGUgLTF9CisgICAgICogICAgICAgICBvZiB0aGUgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTE3LDcgKzE3MCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2tpcHMgdXAgdG8gbiBieXRlcyBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtLgorICAgICAqIDxwPgorICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZCBkZXBlbmRzIG9uIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvCisgICAgICoge0BsaW5rIENpcGhlcklucHV0U3RyZWFtI2F2YWlsYWJsZSgpIGF2YWlsYWJsZX0uIFRoZSBzbWFsbGVyIG9mIG4gYW5kIHRoZQorICAgICAqIHJlc3VsdCBhcmUgdGhlIG51bWJlciBvZiBieXRlcyBiZWluZyBza2lwcGVkLgorICAgICAqIDwvcD4KKyAgICAgKiBTa2lwcGluZyBpcyAoY3VycmVudGx5KSBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQuCisgICAgICogCisgICAgICogQHBhcmFtIG4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc2tpcHBlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMzMsNyArMTk5LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHdpdGhvdXQgYmxvY2tpbmcuIEl0IChjdXJyZW50bHkpCisgICAgICogYWx3YXlzIHJldHVybnMge0Bjb2RlIDB9IGluIEFuZHJvaWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgY3VycmVudGx5IHplcm8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE0MSw3ICsyMTMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb3NlcyB0aGlzIHtAY29kZSBDaXBoZXJJbnB1dFN0cmVhbX0sIGFsc28gY2xvc2VzIHRoZSB1bmRlcmx5aW5nIGlucHV0CisgICAgICogc3RyZWFtIGFuZCBjYWxsIHtAY29kZSBkb0ZpbmFsfSBvbiB0aGUgY2lwaGVyIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE1NSwxMSArMjMyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnB1dCBzdHJlYW0gc3VwcG9ydHMge0Bjb2RlIG1hcmt9IGFuZCB7QGNvZGUgcmVzZXR9CisgICAgICogLCB3aGljaCBpdCBkb2VzIG5vdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGZhbHNlLCBzaW5jZSB0aGlzIGlucHV0IHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHtAY29kZSBtYXJrfSBhbmQKKyAgICAgKiAgICAgICAgIHtAY29kZSByZXNldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0NpcGhlck91dHB1dFN0cmVhbS5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0NpcGhlck91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDczOWQxODUuLjhiY2U0MmIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9DaXBoZXJPdXRwdXRTdHJlYW0uamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vQ2lwaGVyT3V0cHV0U3RyZWFtLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOwpAQCAtMjgsNyArMjMsMTcgQEAKIGltcG9ydCBqYXZheC5jcnlwdG8uTnVsbENpcGhlcjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhpcyBjbGFzcyB3cmFwcyBhbiBvdXRwdXQgc3RyZWFtIGFuZCBhIGNpcGhlciBzbyB0aGF0IHtAY29kZSB3cml0ZX0gbWV0aG9kcworICogc2VuZCB0aGUgZGF0YSB0aHJvdWdoIHRoZSBjaXBoZXIgYmVmb3JlIHdyaXRpbmcgdGhlbSB0byB0aGUgdW5kZXJseWluZyBvdXRwdXQKKyAqIHN0cmVhbS4KKyAqIDxwPgorICogVGhlIGNpcGhlciBtdXN0IGJlIGluaXRpYWxpemVkIGZvciB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBiZWZvcmUgYmVpbmcgdXNlZAorICogYnkgYSB7QGNvZGUgQ2lwaGVyT3V0cHV0U3RyZWFtfS4gRm9yIGV4YW1wbGUsIGlmIGEgY2lwaGVyIGluaXRpYWxpemVkIGZvcgorICogZW5jcnlwdGlvbiBpcyB1c2VkIHdpdGggYSB7QGNvZGUgQ2lwaGVyT3V0cHV0U3RyZWFtfSwgdGhlIHtAY29kZQorICogQ2lwaGVyT3V0cHV0U3RyZWFtfSB0cmllcyB0byBlbmNyeXB0IHRoZSBkYXRhIHdyaXRpbmcgaXQgb3V0LgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENpcGhlck91dHB1dFN0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7CiAKQEAgLTM2LDcgKzQxLDE0IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYXJyID0gbmV3IGJ5dGVbMV07CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENpcGhlck91dHB1dFN0cmVhbX0gaW5zdGFuY2UgZm9yIGFuIHtAY29kZQorICAgICAqIE91dHB1dFN0cmVhbX0gYW5kIGEge0Bjb2RlIENpcGhlcn0uCisgICAgICogCisgICAgICogQHBhcmFtIG9zCisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY2lwaGVyIHRvIHByb2Nlc3MgdGhlIGRhdGEgd2l0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2lwaGVyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcywgQ2lwaGVyIGMpIHsKICAgICAgICAgc3VwZXIob3MpOwpAQCAtNDQsMTQgKzU2LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDaXBoZXJPdXRwdXRTdHJlYW19IGluc3RhbmNlIGZvciBhbiB7QGNvZGUKKyAgICAgKiBPdXRwdXRTdHJlYW19IHdpdGhvdXQgYSBjaXBoZXIuCisgICAgICogPHA+CisgICAgICogQSB7QGNvZGUgTnVsbENpcGhlcn0gaXMgY3JlYXRlZCB0byBwcm9jZXNzIHRoZSBkYXRhLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRoZSBkYXRhIHRvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBDaXBoZXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB7CiAgICAgICAgIHRoaXMob3MsIG5ldyBOdWxsQ2lwaGVyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogV3JpdGVzIHRoZSBzaW5nbGUgYnl0ZSB0byB0aGlzIGNpcGhlciBvdXRwdXQgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNjQsNyArOTAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFdyaXRlcyB0aGUgYnVmZmVyIG9mIGJ5dGVzIHRvIHRoaXMgY2lwaGVyIG91dHB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgb2YgYnl0ZXMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTcyLDcgKzEwNCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogV3JpdGVzIHRoZSB7QGNvZGUgbGVufSBieXRlcyBmcm9tIGJ1ZmZlciB7QGNvZGUgYn0gc3RhcnRpbmcgYXQgb2Zmc2V0CisgICAgICoge0Bjb2RlIG9mZn0gdG8gdGhpcyBjaXBoZXIgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHN0YXJ0IGF0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTg2LDcgKzEyOSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogRmx1c2hlcyB0aGlzIGNpcGhlciBvdXRwdXQgc3RyZWFtLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC05NCw3ICsxNDAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb3NlIHRoaXMgY2lwaGVyIG91dHB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogT24gdGhlIHVuZGVybHlpbmcgY2lwaGVyIHtAY29kZSBkb0ZpbmFsfSB3aWxsIGJlIGludm9rZWQsIGFuZCBhbnkKKyAgICAgKiBidWZmZXJlZCBieXRlcyBmcm9tIHRoZSBjaXBoZXIgYXJlIGFsc28gd3JpdHRlbiBvdXQsIGFuZCB0aGUgY2lwaGVyIGlzCisgICAgICogcmVzZXQgdG8gaXRzIGluaXRpYWwgc3RhdGUuIFRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaXMgYWxzbyBjbG9zZWQuCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMjAsNCArMTczLDMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0NpcGhlclNwaS5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0NpcGhlclNwaS5qYXZhCmluZGV4IDE4NmIyM2IuLmY2ZGE5MjkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9DaXBoZXJTcGkuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vQ2lwaGVyU3BpLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKQEAgLTM0LDk4ICsyOSwzMjkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSA8aT5TZXJ2aWNlIFByb3ZpZGVyIEludGVyZmFjZTwvaT4gKDxiPlNQSTwvYj4pIGZvcgorICogY3J5cHRvZ3JhcGhpYyBjaXBoZXJzLgorICogPHA+CisgKiBJbXBsZW1lbnRlcnMgb2YgY3J5cHRvZ3JhcGhpYyBjaXBoZXJzIG11c3QgaW1wbGVtZW50IGFsbCB0aGUgYWJzdHJhY3QgbWV0aG9kcworICogZm9yIGV2ZXJ5IGNpcGhlciB0aGV5IGltcGxlbWVudC4ge0Bjb2RlIENpcGhlclNwaX0gaW5zdGFuY2VzIGFyZSBjcmVhdGVkCisgKiBhbG9uZyB3aXRoIGNpcGhlcnMgd2hlbiB0aGUge0BsaW5rIENpcGhlciNnZXRJbnN0YW5jZX0gbWV0aG9kIGlzIGNhbGxlZC4gQQorICoge0Bjb2RlIENpcGhlcn0gaXMgcmVmZXJlbmNlZCBieSBhIDxpPnRyYW5zZm9ybWF0aW9uPC9pPiwgd2hpY2ggaXMgYSBzdHJpbmcKKyAqIHRoYXQgZGVzY3JpYmVzIHRoZSBvcGVyYXRpb24gKG9yIHNldCBvZiBvcGVyYXRpb25zKSwgYWx3YXlzIGNvbnNpc3Rpbmcgb2YgdGhlCisgKiBjaXBoZXIncyBuYW1lIGFuZCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgbW9kZSBhbmQgYSBwYWRkaW5nLCBpbiB0aGUgZm9ybToKKyAqIDx1bD4KKyAqIDxsaT4iYWxnb3JpdGhtIjwvbGk+b3IKKyAqIDxsaT4iYWxnb3JpdGhtL21vZGUvcGFkZGluZyI8L2xpPgorICogPC91bD4KKyAqIFRoZSBmb2xsb3dpbmcgYmVoYXZpb3Igc2hvdWxkIGJlIGltcGxlbWVudGVkIGZvciBvYnRhaW5pbmcge0Bjb2RlIENpcGhlcn0KKyAqIGluc3RhbmNlcy4KKyAqIDwvcD4KKyAqIFdoZW4gb25lIG9mIHRoZSB7QGxpbmsgQ2lwaGVyI2dldEluc3RhbmNlfSBmYWN0b3J5IG1ldGhvZHMgaXMgY2FsbGVkIHdpdGggYQorICogPGk+dHJhbnNmb3JtYXRpb248L2k+IHRoYXQgaXMgb25seSBhbiA8aT5hbGdvcml0aG08L2k+LCBjaGVjayBpZiB0aGUgcHJvdmlkZXIKKyAqIGRlZmluZXMgYSB7QGNvZGUgQ2lwaGVyU3BpfSBmb3IgImFsZ29yaXRobSIsIGlmIHNvOiByZXR1cm4gaXQsIG90aGVyd2lzZQorICogdGhyb3cgYSB7QGxpbmsgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9ufS4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseSB3aGVuIGEgPGk+dHJhbnNmb3JtYXRpb248L2k+IGlzIG9mIHRoZSBmb3JtCisgKiAiYWxnb3JpdGhtL21vZGUvcGFkZGluZyI6CisgKiA8dWw+CisgKiAxLiBUaGUgUHJvdmlkZXIgaGFzIGEge0Bjb2RlIENpcGhlclNwaX0gc3ViY2xhc3MgcmVnaXN0ZXJlZCBmb3IKKyAqICJhbGdvcml0aG0vbW9kZS9wYWRkaW5nIjogcmV0dXJuIGl0LCBvdGhlcndpc2UgZ28gdG8gc3RlcCAyLgorICogPC91bD4KKyAqIDx1bD4KKyAqIDIuIFRoZSBQcm92aWRlciBoYXMgYSB7QGNvZGUgQ2lwaGVyU3BpfSBzdWJjbGFzcyByZWdpc3RlcmVkIGZvcgorICogImFsZ29yaXRobS9tb2RlIjogaW5zdGFudGlhdGUgaXQsIGNhbGwKKyAqIHtAbGluayBDaXBoZXJTcGkjZW5naW5lU2V0UGFkZGluZyhTdHJpbmcpIGVuZ2luZVNldFBhZGRpbmcoU3RyaW5nKX0gZm9yIHRoZQorICogcGFkZGluZyBuYW1lIGFuZCByZXR1cm4gaXQsIG90aGVyd2lzZSBnbyB0byBzdGVwIDMuCisgKiA8L3VsPgorICogPHVsPgorICogMy4gVGhlIFByb3ZpZGVyIGhhcyBhIHtAY29kZSBDaXBoZXJTcGl9IHN1YmNsYXNzIHJlZ2lzdGVyZWQgZm9yCisgKiAiYWxnb3JpdGhtLy9wYWRkaW5nIjogaW5zdGFudGlhdGUgaXQsIGNhbGwKKyAqIHtAbGluayBDaXBoZXJTcGkjZW5naW5lU2V0TW9kZShTdHJpbmcpIGVuZ2luZVNldE1vZGUoU3RyaW5nKX0gZm9yIHRoZSBtb2RlCisgKiBuYW1lIGFuZCByZXR1cm4gaXQsIG90aGVyd2lzZSBnbyB0byBzdGVwIDQuCisgKiA8L3VsPgorICogPHVsPgorICogNC4gVGhlIFByb3ZpZGVyIGhhcyBhIHtAY29kZSBDaXBoZXJTcGl9IHN1YmNsYXNzIHJlZ2lzdGVyZWQgZm9yICJhbGdvcml0aG0iOgorICogaW5zdGFudGlhdGUgaXQsIGNhbGwge0BsaW5rIENpcGhlclNwaSNlbmdpbmVTZXRNb2RlKFN0cmluZykKKyAqIGVuZ2luZVNldE1vZGUoU3RyaW5nKX0gZm9yIHRoZSBtb2RlIG5hbWUgLCBjYWxsCisgKiB7QGxpbmsgQ2lwaGVyU3BpI2VuZ2luZVNldFBhZGRpbmcoU3RyaW5nKSBlbmdpbmVTZXRQYWRkaW5nKFN0cmluZyl9IGZvciB0aGUKKyAqIHBhZGRpbmcgbmFtZSBhbmQgcmV0dXJuIGl0LCBvdGhlcndpc2UgdGhyb3cgYQorICoge0BsaW5rIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbn0uCisgKiA8L3VsPgorICogPC9wPgogICogCisgKiBAc2VlIENpcGhlcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGFic3RyYWN0IGNsYXNzIENpcGhlclNwaSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDaXBoZXJTcGl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaXBoZXJTcGkoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogU2V0cyB0aGUgbW9kZSBmb3IgdGhpcyBjaXBoZXIuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaXBoZXIgbW9kZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY2lwaGVyIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzCisgICAgICogICAgICAgICAgICAgcHJvdmlkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lU2V0TW9kZShTdHJpbmcgbW9kZSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBTZXRzIHRoZSBwYWRkaW5nIG1ldGhvZCBmb3IgdGhpcyBjaXBoZXIuCisgICAgICogCisgICAgICogQHBhcmFtIHBhZGRpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYWRkaW5nIG1ldGhvZC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBhZGRpbmcgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqICAgICAgICAgICAgIGNpcGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVTZXRQYWRkaW5nKFN0cmluZyBwYWRkaW5nKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaFBhZGRpbmdFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBibG9jayBzaXplIG9mIHRoaXMgY2lwaGVyIChpbiBieXRlcykKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBibG9jayBzaXplIG9mIHRoaXMgY2lwaGVyLCBvciB6ZXJvIGlmIHRoaXMgY2lwaGVyIGlzIG5vdCBhCisgICAgICogICAgICAgICBibG9jayBjaXBoZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZXRCbG9ja1NpemUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHNpemUgZm9yIGEgYnVmZmVyIChpbiBieXRlcyksIHRoYXQgdGhlIG5leHQgY2FsbCB0byB7QGNvZGUKKyAgICAgKiB1cGRhdGV9IG9mIHtAY29kZSBkb0ZpbmFsfSB3b3VsZCByZXR1cm4sIHRha2luZyBpbnRvIGFjY291bnQgYW55IGJ1ZmZlcmVkCisgICAgICogZGF0YSBmcm9tIHByZXZpb3VzIHtAY29kZSB1cGRhdGV9IGNhbGxzIGFuZCBwYWRkaW5nLgorICAgICAqIDxwPgorICAgICAqIFRoZSBhY3R1YWwgb3V0cHV0IGxlbmd0aCBvZiB0aGUgbmV4dCBjYWxsIHRvIHtAY29kZSB1cGRhdGV9IG9yIHtAY29kZQorICAgICAqIGRvRmluYWx9IG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0TGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCAoaW4gYnl0ZXMpLgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgZm9yIGEgYnVmZmVyIChpbiBieXRlcykuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZXRPdXRwdXRTaXplKGludCBpbnB1dExlbik7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSB0aGF0IHdhcyB1c2VkIHRvIGluaXRpYWxpemUgdGhpcworICAgICAqIGNpcGhlciBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSB3YXMgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgd2FzIHVzZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVHZXRJVigpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyB0aGF0IHdoZXJlIHVzZWQgdG8gY3JlYXRlIHRoaXMgY2lwaGVyIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFRoZXNlIG1heSBiZSBhIHRoZSBzYW1lIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHVzZWQgdG8gY3JlYXRlIHRoaXMgY2lwaGVyCisgICAgICogaW5zdGFuY2UsIG9yIG1heSBiZSBhIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHQgYW5kIHJhbmRvbSBwYXJhbWV0ZXJzLAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBjaXBoZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgdGhhdCB3aGVyZSB1c2VkIHRvIGNyZWF0ZSB0aGlzIGNpcGhlciBpbnN0YW5jZSwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGFueSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICBhdCBhbGwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2V0UGFyYW1ldGVycygpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjaXBoZXIgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgYSBzb3VyY2Ugb2YKKyAgICAgKiByYW5kb21uZXNzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaXBoZXIgd2lsbCBiZSBpbml0aWFsaXplZCBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gKG9uZSBvZjoKKyAgICAgKiBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLCBrZXkgd3JhcHBpbmcgb3Iga2V5IHVud3JhcHBpbmcpIGRlcGVuZGluZyBvbgorICAgICAqIHtAY29kZSBvcG1vZGV9LgorICAgICAqIDwvcD4KKyAgICAgKiBJZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBuZWVkcyBhbnkgYWxnb3JpdGhtIHBhcmFtZXRlcnMgb3IgcmFuZG9tIHZhbHVlcworICAgICAqIHRoYXQgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IHByb3ZpZGUsIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mCisgICAgICogdGhpcyBjaXBoZXIgaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgKHVzaW5nIGl0cworICAgICAqIHByb3ZpZGVyIG9yIHJhbmRvbSB2YWx1ZXMpLiBSYW5kb20gdmFsdWVzIHdpbGwgYmUgZ2VuZXJhdGVkIHVzaW5nIHtAY29kZQorICAgICAqIHJhbmRvbX07CisgICAgICogPHA+CisgICAgICogV2hlbiBhIGNpcGhlciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gYW55IG9mIHRoZSB7QGNvZGUKKyAgICAgKiBpbml0fSBtZXRob2RzLCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGlzIG92ZXJyaWRkZW4sIG1lYW5zIGl0IGlzCisgICAgICogZXF1aXZhbGVudCB0byBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBhbmQgY2FsbGluZyBpdCB7QGNvZGUgaW5pdH0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3Btb2RlCisgICAgICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uIHRoaXMgY2lwaGVyIGluc3RhbmNlIHNob3VsZCBiZSBpbml0aWFsaXplZCBmb3IKKyAgICAgKiAgICAgICAgICAgIChvbmUgb2Y6IHtAY29kZSBFTkNSWVBUX01PREV9LCB7QGNvZGUgREVDUllQVF9NT0RFfSwge0Bjb2RlCisgICAgICogICAgICAgICAgICBXUkFQX01PREV9IG9yIHtAY29kZSBVTldSQVBfTU9ERX0pLgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBrZXkgZm9yIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiByYW5kb21uZXNzIHRvIHVzZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBjYW5ub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMgY2lwaGVyCisgICAgICogICAgICAgICAgICAgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdChpbnQgb3Btb2RlLCBLZXkga2V5LCBTZWN1cmVSYW5kb20gcmFuZG9tKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIGNpcGhlciBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbGdvcml0aG0KKyAgICAgKiBwYXJhbWV0ZXJzIGFuZCBhIHNvdXJjZSBvZiByYW5kb21uZXNzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaXBoZXIgd2lsbCBiZSBpbml0aWFsaXplZCBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gKG9uZSBvZjoKKyAgICAgKiBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLCBrZXkgd3JhcHBpbmcgb3Iga2V5IHVud3JhcHBpbmcpIGRlcGVuZGluZyBvbgorICAgICAqIHtAY29kZSBvcG1vZGV9LgorICAgICAqIDwvcD4KKyAgICAgKiBJZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBuZWVkcyBhbnkgYWxnb3JpdGhtIHBhcmFtZXRlcnMgYW5kIHtAY29kZSBwYXJhbXN9CisgICAgICogaXMge0Bjb2RlIG51bGx9LCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNpcGhlciBpcyBzdXBwb3NlZAorICAgICAqIHRvIGdlbmVyYXRlIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzICh1c2luZyBpdHMgcHJvdmlkZXIgb3IgcmFuZG9tCisgICAgICogdmFsdWVzKS4gUmFuZG9tIHZhbHVlcyBhcmUgZ2VuZXJhdGVkIHVzaW5nIHtAY29kZSByYW5kb219LgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYSBjaXBoZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIGFueSBvZiB0aGUge0Bjb2RlCisgICAgICogaW5pdH0gbWV0aG9kcywgdGhlIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSBpcyBvdmVycmlkZGVuLCBtZWFucyBpdCBpcworICAgICAqIGVxdWl2YWxlbnQgdG8gY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UgYW5kIGNhbGxpbmcgaXQge0Bjb2RlIGluaXR9IG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG9wbW9kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0aGlzIGNpcGhlciBpbnN0YW5jZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgZm9yCisgICAgICogICAgICAgICAgICAob25lIG9mOiB7QGNvZGUgRU5DUllQVF9NT0RFfSwge0Bjb2RlIERFQ1JZUFRfTU9ERX0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgV1JBUF9NT0RFfSBvciB7QGNvZGUgVU5XUkFQX01PREV9KS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQga2V5IGZvciB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9mIHJhbmRvbW5lc3MgdG8gdXNlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBjaXBoZXIKKyAgICAgKiAgICAgICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpdCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdChpbnQgb3Btb2RlLCBLZXkga2V5LAogICAgICAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMsIFNlY3VyZVJhbmRvbSByYW5kb20pCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMgY2lwaGVyIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFsZ29yaXRobQorICAgICAqIHBhcmFtZXRlcnMgYW5kIGEgc291cmNlIG9mIHJhbmRvbW5lc3MuCisgICAgICogPHA+CisgICAgICogVGhlIGNpcGhlciB3aWxsIGJlIGluaXRpYWxpemVkIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiAob25lIG9mOgorICAgICAqIGVuY3J5cHRpb24sIGRlY3J5cHRpb24sIGtleSB3cmFwcGluZyBvciBrZXkgdW53cmFwcGluZykgZGVwZW5kaW5nIG9uCisgICAgICoge0Bjb2RlIG9wbW9kZX0uCisgICAgICogPC9wPgorICAgICAqIElmIHRoaXMgY2lwaGVyIGluc3RhbmNlIG5lZWRzIGFueSBhbGdvcml0aG0gcGFyYW1ldGVycyBhbmQge0Bjb2RlIHBhcmFtc30KKyAgICAgKiBpcyB7QGNvZGUgbnVsbH0sIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2lwaGVyIGlzIHN1cHBvc2VkCisgICAgICogdG8gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgKHVzaW5nIGl0cyBwcm92aWRlciBvciByYW5kb20KKyAgICAgKiB2YWx1ZXMpLiBSYW5kb20gdmFsdWVzIGFyZSBnZW5lcmF0ZWQgdXNpbmcge0Bjb2RlIHJhbmRvbX0uCisgICAgICogPHA+CisgICAgICogV2hlbiBhIGNpcGhlciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gYW55IG9mIHRoZSB7QGNvZGUKKyAgICAgKiBpbml0fSBtZXRob2RzLCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGlzIG92ZXJyaWRkZW4sIG1lYW5zIGl0IGlzCisgICAgICogZXF1aXZhbGVudCB0byBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBhbmQgY2FsbGluZyBpdCB7QGNvZGUgaW5pdH0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3Btb2RlCisgICAgICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uIHRoaXMgY2lwaGVyIGluc3RhbmNlIHNob3VsZCBiZSBpbml0aWFsaXplZCBmb3IKKyAgICAgKiAgICAgICAgICAgIChvbmUgb2Y6IHtAY29kZSBFTkNSWVBUX01PREV9LCB7QGNvZGUgREVDUllQVF9NT0RFfSwge0Bjb2RlCisgICAgICogICAgICAgICAgICBXUkFQX01PREV9IG9yIHtAY29kZSBVTldSQVBfTU9ERX0pLgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBrZXkgZm9yIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIGFsZ29yaXRobSBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgcmFuZG9tbmVzcyB0byB1c2UuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIGNpcGhlcgorICAgICAqICAgICAgICAgICAgIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgIGNpcGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KGludCBvcG1vZGUsIEtleSBrZXksCiAgICAgICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJzIHBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29udGludWVzIGEgbXVsdGktcGFydCB0cmFuc2Zvcm1hdGlvbiAoZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uKS4gVGhlCisgICAgICogdHJhbnNmb3JtZWQgYnl0ZXMgYXJlIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ5dGVzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAcGFyYW0gaW5wdXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGlucHV0IHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSBpbnB1dExlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgdG8gdHJhbnNmb3JtLgorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIGJ5dGVzIGluIGEgbmV3IGJ1ZmZlciwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqICAgICAgICAgaW5wdXQgaGFzIHplcm8gbGVuZ3RoLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaXBoZXIgaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBlbmNyeXB0aW9uIG9yCisgICAgICogICAgICAgICAgICAgZGVjcnlwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBpcyBudWxsLCBvciBpZiB7QGNvZGUgaW5wdXRPZmZzZXR9IGFuZCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBpbnB1dExlbn0gZG8gbm90IHNwZWNpZnkgYSB2YWxpZCBjaHVuayBpbiB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gZW5naW5lVXBkYXRlKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LAogICAgICAgICAgICAgaW50IGlucHV0TGVuKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnRpbnVlcyBhIG11bHRpLXBhcnQgdHJhbnNmb3JtYXRpb24gKGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbikuIFRoZQorICAgICAqIHRyYW5zZm9ybWVkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc2l6ZSBvZiB0aGUge0Bjb2RlIG91dHB1dH0gYnVmZmVyIGlzIHRvbyBzbWFsbCB0byBob2xkIHRoZSByZXN1bHQsCisgICAgICogYSB7QGNvZGUgU2hvcnRCdWZmZXJFeGNlcHRpb259IGlzIHRocm93bi4gVXNlCisgICAgICoge0BsaW5rIENpcGhlciNnZXRPdXRwdXRTaXplIGdldE91dHB1dFNpemV9IHRvIGNoZWNrIGZvciB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgKiBvdXRwdXQgYnVmZmVyLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBieXRlcyB0byB0cmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGlucHV0T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBpbnB1dCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gaW5wdXRMZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gb3V0cHV0T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW4gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUge0Bjb2RlIG91dHB1dH0gYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGVuZ2luZVVwZGF0ZShieXRlW10gaW5wdXQsIGludCBpbnB1dE9mZnNldCwKICAgICAgICAgICAgIGludCBpbnB1dExlbiwgYnl0ZVtdIG91dHB1dCwgaW50IG91dHB1dE9mZnNldCkKICAgICAgICAgICAgIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnRpbnVlcyBhIG11bHRpLXBhcnQgdHJhbnNmb3JtYXRpb24gKGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbikuIFRoZQorICAgICAqIHtAY29kZSBpbnB1dC5yZW1haW5pbmcoKX0gYnl0ZXMgc3RhcnRpbmcgYXQge0Bjb2RlIGlucHV0LnBvc2l0aW9uKCl9IGFyZQorICAgICAqIHRyYW5zZm9ybWVkIGFuZCBzdG9yZWQgaW4gdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIG91dHB1dC5yZW1haW5pbmcoKX0gaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIHRyYW5zZm9ybWVkCisgICAgICogYnl0ZXMgYSB7QGNvZGUgU2hvcnRCdWZmZXJFeGNlcHRpb259IGlzIHRocm93bi4gVXNlCisgICAgICoge0BsaW5rIENpcGhlciNnZXRPdXRwdXRTaXplIGdldE91dHB1dFNpemV9IHRvIGNoZWNrIGZvciB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgKiBvdXRwdXQgYnVmZmVyLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBidWZmZXIgdG8gdHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHQgd2l0aGluLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBzdG9yZWQgaW4gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZW5naW5lVXBkYXRlKEJ5dGVCdWZmZXIgaW5wdXQsIEJ5dGVCdWZmZXIgb3V0cHV0KQogICAgICAgICAgICAgdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uIHsKQEAgLTE2NCwxNSArMzkwLDU3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogRmluaXNoZXMgYSBtdWx0aS1wYXJ0IHRyYW5zZm9ybWF0aW9uIChlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24pLgorICAgICAqIDxwPgorICAgICAqIFByb2Nlc3NlcyB0aGUge0Bjb2RlIGlucHV0TGVufSBieXRlcyBpbiB7QGNvZGUgaW5wdXR9IGJ1ZmZlciBhdCB7QGNvZGUKKyAgICAgKiBpbnB1dE9mZnNldH0sIGFuZCBhbnkgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gYnVmZmVyZWQgaW4gcHJldmlvdXMge0Bjb2RlCisgICAgICogdXBkYXRlfSBjYWxscy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBpbnB1dE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBpbnB1dExlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuCisgICAgICogQHJldHVybiB0aGUgZmluYWwgYnl0ZXMgZnJvbSB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBieXRlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgYmxvY2sgc2l6ZS4KKyAgICAgKiBAdGhyb3dzIEJhZFBhZGRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFkZGluZyBvZiB0aGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFkZGluZyBzY2hlbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVEb0ZpbmFsKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LAogICAgICAgICAgICAgaW50IGlucHV0TGVuKSB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwgQmFkUGFkZGluZ0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEZpbmlzaGVzIGEgbXVsdGktcGFydCB0cmFuc2Zvcm1hdGlvbiAoZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uKS4KKyAgICAgKiA8cD4KKyAgICAgKiBQcm9jZXNzZXMgdGhlIHtAY29kZSBpbnB1dExlbn0gYnl0ZXMgaW4ge0Bjb2RlIGlucHV0fSBidWZmZXIgYXQKKyAgICAgKiB7QGNvZGUgaW5wdXRPZmZzZXR9LCBhbmQgYW55IGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGJ1ZmZlcmVkIGluIHByZXZpb3VzIAorICAgICAqIHtAY29kZSB1cGRhdGV9IGNhbGxzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBidWZmZXIuCisgICAgICogQHBhcmFtIGlucHV0T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBpbnB1dCBidWZmZXIuCisgICAgICogQHBhcmFtIGlucHV0TGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dC4KKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIHRyYW5zZm9ybWVkIGJ5dGVzLgorICAgICAqIEBwYXJhbSBvdXRwdXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBieXRlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgYmxvY2sgc2l6ZS4KKyAgICAgKiBAdGhyb3dzIEJhZFBhZGRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFkZGluZyBvZiB0aGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFkZGluZyBzY2hlbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVEb0ZpbmFsKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LAogICAgICAgICAgICAgaW50IGlucHV0TGVuLCBieXRlW10gb3V0cHV0LCBpbnQgb3V0cHV0T2Zmc2V0KQpAQCAtMTgwLDggKzQ0OCwzMiBAQAogICAgICAgICAgICAgQmFkUGFkZGluZ0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEZpbmlzaGVzIGEgbXVsdGktcGFydCB0cmFuc2Zvcm1hdGlvbiAoZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uKS4KKyAgICAgKiA8cD4KKyAgICAgKiBQcm9jZXNzZXMgdGhlIHtAY29kZSBpbnB1dC5yZW1haW5pbmcoKX0gYnl0ZXMgaW4ge0Bjb2RlIGlucHV0fSBidWZmZXIgYXQKKyAgICAgKiB7QGNvZGUgaW5wdXQucG9zaXRpb24oKX0sIGFuZCBhbnkgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gYnVmZmVyZWQgaW4KKyAgICAgKiBwcmV2aW91cyB7QGNvZGUgdXBkYXRlfSBjYWxscy4gVGhlIHRyYW5zZm9ybWVkIGJ5dGVzIGFyZSBwbGFjZWQgaW50bworICAgICAqIHtAY29kZSBvdXRwdXR9IGJ1ZmZlci4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBieXRlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgYmxvY2sgc2l6ZS4KKyAgICAgKiBAdGhyb3dzIEJhZFBhZGRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFkZGluZyBvZiB0aGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFkZGluZyBzY2hlbWUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW5wdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGJ1ZmZlciBhcmUgdGhlIHNhbWUKKyAgICAgKiAgICAgICAgICAgICBvYmplY3QuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBpcyBub3QgaW5pdGlhbGl6ZWQgZm9yIGVuY3J5cHRpb24gb3IKKyAgICAgKiAgICAgICAgICAgICBkZWNyeXB0aW9uLgogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZW5naW5lRG9GaW5hbChCeXRlQnVmZmVyIGlucHV0LCBCeXRlQnVmZmVyIG91dHB1dCkKICAgICAgICAgICAgIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwKQEAgLTIyMyw4ICs1MTUsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBXcmFwcyBhIGtleSB1c2luZyB0aGlzIGNpcGhlciBpbnN0YW5jZS4gVGhpcyBtZXRob2QgaGFzIGJlZW4gYWRkZWQgdG8KKyAgICAgKiB0aGlzIGNsYXNzIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGl0IGNhbm5vdCBiZSBhYnN0cmFjdCkuIElmIHRoaXMKKyAgICAgKiBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4sIGl0IHRocm93cyBhbiB7QGNvZGUKKyAgICAgKiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byB3cmFwLgorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQga2V5CisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBieXRlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBjaXBoZXIgYmxvY2sgc2l6ZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNpcGhlciBpbnN0YW5jZSBjYW5ub3Qgd3JhcCB0aGlzIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVdyYXAoS2V5IGtleSkgdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sCiAgICAgICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKQEAgLTIzMyw4ICs1MzcsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBVbndyYXBzIGEga2V5IHVzaW5nIHRoaXMgY2lwaGVyIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgY2xhc3MgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaXQKKyAgICAgKiBjYW5ub3QgYmUgYWJzdHJhY3QpLiBJZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiwgaXQgdGhyb3dzIGFuCisgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHdyYXBwZWRLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSB3cmFwcGVkIGtleSB0byB1bndyYXAuCisgICAgICogQHBhcmFtIHdyYXBwZWRLZXlBbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gZm9yIHRoZSB3cmFwcGVkIGtleS4KKyAgICAgKiBAcGFyYW0gd3JhcHBlZEtleVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIGtleSAob25lIG9mOiB7QGNvZGUgU0VDUkVUX0tFWX0sCisgICAgICogICAgICAgICAgICB7QGNvZGUgUFJJVkFURV9LRVl9IG9yIHtAY29kZSBQVUJMSUNfS0VZfSkKKyAgICAgKiBAcmV0dXJuIHRoZSB1bndyYXBwZWQga2V5LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgd3JhcHBlZEtleX0gY2Fubm90IGJlIHVud3JhcHBlZCB0byBhIGtleSBvZgorICAgICAqICAgICAgICAgICAgIHR5cGUge0Bjb2RlIHdyYXBwZWRLZXlUeXBlfSBmb3IgdGhlIHtAY29kZQorICAgICAqICAgICAgICAgICAgIHdyYXBwZWRLZXlBbGdvcml0aG19LgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gcHJvdmlkZXIgY2FuIGJlIGZvdW5kIHRoYXQgY2FuIGNyZWF0ZSBhIGtleSBvZiB0eXBlCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHdyYXBwZWRLZXlUeXBlfSBmb3IgdGhlIHtAY29kZSB3cmFwcGVkS2V5QWxnb3JpdGhtfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgS2V5IGVuZ2luZVVud3JhcChieXRlW10gd3JhcHBlZEtleSwgU3RyaW5nIHdyYXBwZWRLZXlBbGdvcml0aG0sCiAgICAgICAgICAgICBpbnQgd3JhcHBlZEtleVR5cGUpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLApAQCAtMjQ0LDExICs1NjksMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIGEgc3BlY2lmaWVkIGtleSBvYmplY3QgaW4gYml0cy4gVGhpcyBtZXRob2QgaGFzIGJlZW4KKyAgICAgKiBhZGRlZCB0byB0aGlzIGNsYXNzIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGl0IGNhbm5vdCBiZSBhYnN0cmFjdCkuCisgICAgICogSWYgdGhpcyBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4sIGl0IHRocm93cyBhbiB7QGNvZGUKKyAgICAgKiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBnZXQgdGhlIHNpemUgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSBzcGVjaWZpZWQga2V5IG9iamVjdCBpbiBiaXRzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBrZXkgY2Fubm90IGJlIGRldGVybWluZWQgYnkgdGhpcworICAgICAqICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZW5naW5lR2V0S2V5U2l6ZShLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoImNyeXB0by4xMiIpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8uamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FbmNyeXB0ZWRQcml2YXRlS2V5SW5mby5qYXZhCmluZGV4IDI4ODc3OTQuLjMwMWNkNDkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FbmNyeXB0ZWRQcml2YXRlS2V5SW5mby5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FbmNyeXB0ZWRQcml2YXRlS2V5SW5mby5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292LCBTdGVwYW4gTS4gTWlzaHVyYQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00Niw3ICs0MSwyNCBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0Bjb2RlIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvfSBBU04uMSB0eXBlIGFzCisgKiBzcGVjaWZpZWQgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNTIwOC50eHQiPlBLQ1MKKyAqICM4IC0gUHJpdmF0ZS1LZXkgSW5mb3JtYXRpb24gU3ludGF4IFN0YW5kYXJkPC9hPi4KKyAqIDxwPgorICogVGhlIGRlZmluaXRpb24gb2YgQVNOLjEgaXMgYXMgZm9sbG93czoKKyAqIDwvcD4KKyAqIDxkbD4KKyAqIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIDo6PSBTRVFVRU5DRSB7CisgKiA8ZGQ+ZW5jcnlwdGlvbkFsZ29yaXRobSBBbGdvcml0aG1JZGVudGlmaWVyLDwvZGQ+CisgKiA8ZGQ+ZW5jcnlwdGVkRGF0YSBPQ1RFVCBTVFJJTkcgfTwvZGQ+CisgKiA8L2RsPgorICogPGRsPgorICogQWxnb3JpdGhtSWRlbnRpZmllciA6Oj0gU0VRVUVOQ0UgeworICogPGRkPmFsZ29yaXRobSBPQkpFQ1QgSURFTlRJRklFUiw8L2RkPgorICogPGRkPnBhcmFtZXRlcnMgQU5ZIERFRklORUQgQlkgYWxnb3JpdGhtIE9QVElPTkFMIH08L2RkPgorICogPC9kbD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyB7CiAgICAgLy8gRW5jcnlwdGlvbiBhbGdvcml0aG0gbmFtZQpAQCAtNjEsNyArNzMsMTYgQEAKICAgICBwcml2YXRlIHZvbGF0aWxlIGJ5dGVbXSBlbmNvZGVkOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb30gaW5zdGFuY2UgZnJvbSBpdHMgZW5jb2RlZAorICAgICAqIHJlcHJlc2VudGF0aW9uIGJ5IHBhcnNpbmcgaXQuCisgICAgICogCisgICAgICogQHBhcmFtIGVuY29kZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgdGhlIGVuY29kZWQgcmVwcmVzZW50YXRpb24gZmFpbHMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbmNvZGVkfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGJ5dGVbXSBlbmNvZGVkKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEwNCw3ICsxMjUsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvfSBpbnN0YW5jZSBmcm9tIGFuIGFsZ29yaXRobQorICAgICAqIG5hbWUgYW5kIGl0cyBlbmNyeXB0ZWQgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW5jckFsZ05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGFuIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gZW5jcnlwdGVkRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGVuY3J5cHRlZCBkYXRhLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBlbmNyQWxnTmFtZX0gaXMgbm90IGEgc3VwcG9ydGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGVuY3JBbGdOYW1lfSBvciB7QGNvZGUgZW5jcnlwdGVkRGF0YX0gaXMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgbnVsbH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZW5jcnlwdGVkRGF0YX0gaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKFN0cmluZyBlbmNyQWxnTmFtZSwgYnl0ZVtdIGVuY3J5cHRlZERhdGEpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTI5LDcgKzE2NCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm99IGluc3RhbmNlIGZyb20gdGhlCisgICAgICogZW5jcnlwdGlvbiBhbGdvcml0aG0gcGFyYW1ldGVycyBhbiBpdHMgZW5jcnlwdGVkIGRhdGEuCisgICAgICogCisgICAgICogQHBhcmFtIGFsZ1BhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGVuY3J5cHRlZERhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNyeXB0ZWQgZGF0YS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhbGdvcml0aG0gbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBhbGdQYXJhbXN9CisgICAgICogICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdQYXJhbXN9IG9yIHtAY29kZSBlbmNyeXB0ZWREYXRhfSBpcworICAgICAqICAgICAgICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oQWxnb3JpdGhtUGFyYW1ldGVycyBhbGdQYXJhbXMsCiAgICAgICAgICAgICBieXRlW10gZW5jcnlwdGVkRGF0YSkKQEAgLTE1NSwyMSArMjAzLDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ05hbWUoKSB7CiAgICAgICAgIHJldHVybiBhbGdOYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBbGdvcml0aG1QYXJhbWV0ZXJzIGdldEFsZ1BhcmFtZXRlcnMoKSB7CiAgICAgICAgIHJldHVybiBhbGdQYXJhbWV0ZXJzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgZW5jcnlwdGVkIGRhdGEgb2YgdGhpcyBrZXkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW5jcnlwdGVkIGRhdGEgb2YgdGhpcyBrZXksIGVhY2ggdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYQorICAgICAqICAgICAgICAgbmV3IGFycmF5IGlzIHJldHVybmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jcnlwdGVkRGF0YSgpIHsKICAgICAgICAgYnl0ZVtdIHJldCA9IG5ldyBieXRlW2VuY3J5cHRlZERhdGEubGVuZ3RoXTsKQEAgLTE3OCw3ICsyMzYsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBQS0NTOEVuY29kZWRLZXlTcGVjfSBvYmplY3QgZXh0cmFjdGVkIGZyb20gdGhlCisgICAgICogZW5jcnlwdGVkIGRhdGEuCisgICAgICogPHA+CisgICAgICogVGhlIGNpcGhlciBtdXN0IGJlIGluaXRpYWxpemUgaW4gZWl0aGVyIHtAY29kZSBDaXBoZXIuREVDUllQVF9NT0RFfSBvcgorICAgICAqIHtAY29kZSBDaXBoZXIuVU5XUkFQX01PREV9IHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQga2V5IHVzZWQgZm9yCisgICAgICogZW5jcnlwdGluZyB0aGlzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2lwaGVyCisgICAgICogICAgICAgICAgICB0aGUgY2lwaGVyIGluaXRpYWxpemVkIGZvciBkZWNyeXB0aW5nIHRoZSBlbmNyeXB0ZWQgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYWN0ZWQge0Bjb2RlIFBLQ1M4RW5jb2RlZEtleVNwZWN9LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNpcGhlciBpcyBub3Qgc3VpdGVkIHRvIGRlY3J5cHQgdGhlCisgICAgICogICAgICAgICAgICAgZW5jcnlwdGVkIGRhdGEuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjaXBoZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUEtDUzhFbmNvZGVkS2V5U3BlYyBnZXRLZXlTcGVjKENpcGhlciBjaXBoZXIpCiAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CkBAIC0yMDQsNyArMjc4LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgUEtDUzhFbmNvZGVkS2V5U3BlY30gb2JqZWN0IGV4dHJhY3RlZCBmcm9tIHRoZQorICAgICAqIGVuY3J5cHRlZCBkYXRhLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZWNyeXB0S2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGVuY3J5cHRlZCBkYXRhIHdpdGguCisgICAgICogQHJldHVybiB0aGUgZXh0cmFjdGVkIHtAY29kZSBQS0NTOEVuY29kZWRLZXlTcGVjfS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIHVzYWJsZSBjaXBoZXIgY2FuIGJlIGZvdW5kIHRvIGRlY3J5cHQgdGhlIGVuY3J5cHRlZAorICAgICAqICAgICAgICAgICAgIGRhdGEuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRlY3J5cHRLZXl9IGlzIG5vdCB1c2FibGUgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkCisgICAgICogICAgICAgICAgICAgZGF0YS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRlY3J5cHRLZXl9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUEtDUzhFbmNvZGVkS2V5U3BlYyBnZXRLZXlTcGVjKEtleSBkZWNyeXB0S2V5KQogICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLApAQCAtMjQxLDcgKzMyOSwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFBLQ1M4RW5jb2RlZEtleVNwZWN9IG9iamVjdCBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgKiBlbmNyeXB0ZWQgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVjcnlwdEtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQgZGF0YSB3aXRoLgorICAgICAqIEBwYXJhbSBwcm92aWRlck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgcHJvdmlkZXIgd2hvc2UgY2lwaGVyIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYWN0ZWQge0Bjb2RlIFBLQ1M4RW5jb2RlZEtleVNwZWN9LgorICAgICAqIEB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBwcm92aWRlciB3aXRoIHtAY29kZSBwcm92aWRlck5hbWV9IGNhbiBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIHVzYWJsZSBjaXBoZXIgY2FuIGJlIGZvdW5kIHRvIGRlY3J5cHQgdGhlIGVuY3J5cHRlZAorICAgICAqICAgICAgICAgICAgIGRhdGEuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRlY3J5cHRLZXl9IGlzIG5vdCB1c2FibGUgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkCisgICAgICogICAgICAgICAgICAgZGF0YS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRlY3J5cHRLZXl9IG9yIHtAY29kZSBwcm92aWRlck5hbWV9IGlzIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgICAgIC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUEtDUzhFbmNvZGVkS2V5U3BlYyBnZXRLZXlTcGVjKEtleSBkZWNyeXB0S2V5LCBTdHJpbmcgcHJvdmlkZXJOYW1lKQogICAgICAgICB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIApAQCAtMjgzLDcgKzM5MSwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFBLQ1M4RW5jb2RlZEtleVNwZWN9IG9iamVjdCBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgKiBlbmNyeXB0ZWQgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVjcnlwdEtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQgZGF0YSB3aXRoLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyIHdob3NlIGNpcGhlciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYWN0ZWQge0Bjb2RlIFBLQ1M4RW5jb2RlZEtleVNwZWN9LgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gdXNhYmxlIGNpcGhlciBjYW4gYmUgZm91bmQgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkCisgICAgICogICAgICAgICAgICAgZGF0YS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGVjcnlwdEtleX0gaXMgbm90IHVzYWJsZSB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQKKyAgICAgKiAgICAgICAgICAgICBkYXRhLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGVjcnlwdEtleX0gb3Ige0Bjb2RlIHByb3ZpZGVyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBLQ1M4RW5jb2RlZEtleVNwZWMgZ2V0S2V5U3BlYyhLZXkgZGVjcnlwdEtleSwgUHJvdmlkZXIgcHJvdmlkZXIpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCkBAIC0zMjMsNyArNDQ3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBBU04uMSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIEFTTi4xIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVuY29kaW5nIHRoaXMgb2JqZWN0IGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChlbmNvZGVkID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc20uamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc20uamF2YQppbmRleCAzNDlhMTkwLi43YzY4ZDI4IDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0V4ZW1wdGlvbk1lY2hhbmlzbS5qYXZhCkBAIC0zMSw2ICszMSwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8uaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmU7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIGV4ZW1wdGlvbiBtZWNoYW5pc20gc3VjaCBhcworICogPGk+a2V5IHJlY292ZXJ5PC9pPiwgPGk+a2V5IHdlYWtlbmluZzwvaT4sIG9yIDxpPmtleSBlc2Nyb3c8L2k+LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEV4ZW1wdGlvbk1lY2hhbmlzbSB7CiAKICAgICAvLyBVc2VkIHRvIGFjY2VzcyBjb21tb24gZW5naW5lIGZ1bmN0aW9uYWxpdHkKQEAgLTU0LDYgKzYwLDE3IEBACiAgICAgLy8gSW5kaWNhdGVzIGlmIGJsb2IgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseQogICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZWQ7CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGV4bWVjaFNwaQorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIGRlbGVnYXRlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIG1lY2hhbmlzbQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG1lY2hhbmlzbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgRXhlbXB0aW9uTWVjaGFuaXNtKEV4ZW1wdGlvbk1lY2hhbmlzbVNwaSBleG1lY2hTcGksCiAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlciwgU3RyaW5nIG1lY2hhbmlzbSkgewogICAgICAgICB0aGlzLm1lY2hhbmlzbSA9IG1lY2hhbmlzbTsKQEAgLTYyLDEwICs3OSwyOSBAQAogICAgICAgICBpc0luaXQgPSBmYWxzZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1lY2hhbmlzbTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219IGluc3RhbmNlIHRoYXQgcHJvdmlkZXMgdGhlCisgICAgICogc3BlY2lmaWVkIGV4ZW1wdGlvbiBtZWNoYW5pc20gYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZXhlbXB0aW9uIG1lY2hhbmlzbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlIGJ5IGFueSBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFsZ29yaXRobSBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRXhlbXB0aW9uTWVjaGFuaXNtIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGFsZ29yaXRobSA9PSBudWxsKSB7CkBAIC03OCw2ICsxMTQsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbnNtfSBpbnN0YW5jZSB0aGF0IHByb3ZpZGVzIHRoZQorICAgICAqIHNwZWNpZmllZCBleGVtcHRpb24gbWVjaGFuaXNtIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBleGVtcHRpb24gbWVjaGFuaXNtLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHRoYXQgaXMgcHJvdmlkaW5nIHRoZSBhbGdvcml0aG0uCisgICAgICogQHJldHVybiB0aGUgbmV3IHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWxnb3JpdGhtIHBhcmFtZXRlciBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgcGFyYW1ldGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4ZW1wdGlvbk1lY2hhbmlzbSBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewpAQCAtOTQsNiArMTUwLDI0IEBACiAgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZShhbGdvcml0aG0sIGltcFByb3ZpZGVyKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219IGluc3RhbmNlIHRoYXQgcHJvdmlkZXMgdGhlCisgICAgICogc3BlY2lmaWVkIGV4ZW1wdGlvbiBtZWNoYW5pc20gYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGV4ZW1wdGlvbiBtZWNoYW5pc20uCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgdGhhdCBpcyBwcm92aWRpbmcgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWxnb3JpdGhtIHBhcmFtZXRlciBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgcGFyYW1ldGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4ZW1wdGlvbk1lY2hhbmlzbSBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoYWxnb3JpdGhtID09IG51bGwpIHsKQEAgLTEwOSwxMCArMTgzLDMwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBvZiB0aGlzIHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG9mIHRoaXMge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZXN1bHQgYmxvYiBmb3IgdGhpcyB7QGNvZGUgRXhlbXB0aW9uTWVjaGFuaXNtfQorICAgICAqIGluc3RhbmNlIGhhcyBiZWVuIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHkgYW5kIHRoYXQgdGhlIHNwZWNpZmllZCBrZXkgaXMKKyAgICAgKiB0aGUgc2FtZSBhcyB0aGUgb25lIHRoYXQgd2FzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbmQgZ2VuZXJhdGUuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byB2ZXJpZnkuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSByZXN1bHQgYmxvYiBmb3IgdGhpcyB7QGNvZGUgRXhlbXB0aW9uTWVjaGFuaXNtfQorICAgICAqICAgICAgICAgaW5zdGFuY2UgaGFzIGJlZW4gZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBAdGhyb3dzIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSByZXN1bHQgYmxvYgorICAgICAqICAgICAgICAgICAgIGhhcyBiZWVuIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDcnlwdG9BbGxvd2VkKEtleSBrZXkpCiAgICAgICAgICAgICB0aHJvd3MgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIHsKIApAQCAtMTI0LDYgKzIxOCwxOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBmb3IgdGhlIG91dHB1dCBidWZmZXIgbmVlZGVkIHRvIGhvbGQgdGhlIG91dHB1dAorICAgICAqIG9mIHRoZSBuZXh0IHtAbGluayAjZ2VuRXhlbXB0aW9uQmxvYn0gY2FsbCwgZ2l2ZW4gdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBpbnB1dExlbn0gKGluIGJ5dGVzKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXRMZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW5wdXQgbGVuZ3RoIChpbiBieXRlcykuCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBmb3IgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219IGluc3RhbmNlIGlzIG5vdAorICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0T3V0cHV0U2l6ZShpbnQgaW5wdXRMZW4pIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBpZiAoIWlzSW5pdCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImNyeXB0by4yRCIpKTsKQEAgLTEzMSw2ICsyMzgsMTggQEAKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lR2V0T3V0cHV0U2l6ZShpbnB1dExlbik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgRXhlbXB0aW9uTWVjaGFuaXNtfSBpbnN0YW5jZSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBrZXkuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBpbml0aWFsaXplIHRoaXMgaW5zdGFuY2Ugd2l0aC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBtZWNoYW5pc20uCisgICAgICogQHRocm93cyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlcnJvcihzKSBvY2N1ciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwKICAgICAgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB7CiAgICAgICAgIGdlbmVyYXRlZCA9IGZhbHNlOwpAQCAtMTM5LDYgKzI1OCwyMyBAQAogICAgICAgICBpc0luaXQgPSB0cnVlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2Ugd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQga2V5IGFuZCBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGluaXRpYWxpemUgdGhpcyBpbnN0YW5jZSB3aXRoLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgZXhlbXB0aW9uIG1lY2hhbmlzbSBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBjYW5ub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMgbWVjaGFuaXNtLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXJzIGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcworICAgICAqICAgICAgICAgICAgIG1lY2hhbmlzbS4KKyAgICAgKiBAdGhyb3dzIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9yKHMpIG9jY3VyIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW0pCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKICAgICAgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB7CkBAIC0xNDgsNiArMjg0LDIzIEBACiAgICAgICAgIGlzSW5pdCA9IHRydWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgRXhlbXB0aW9uTWVjaGFuaXNtfSBpbnN0YW5jZSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBrZXkgYW5kIGFsZ29yaXRobSBwYXJhbWV0ZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gaW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlIHdpdGguCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBleGVtcHRpb24gbWVjaGFuaXNtIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBtZWNoYW5pc20uCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIHRoZSBwYXJhbWV0ZXJzIGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcworICAgICAqICAgICAgICAgICAgIG1lY2hhbmlzbS4KKyAgICAgKiBAdGhyb3dzIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9yKHMpIG9jY3VyIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW0pCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKICAgICAgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB7CkBAIC0xNTcsNiArMzEwLDE3IEBACiAgICAgICAgIGlzSW5pdCA9IHRydWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSByZXN1bHQga2V5IGJsb2IgZm9yIHRoaXMgZXhlbXB0aW9uIG1lY2hhbmlzbS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQga2V5IGJsb2IgZm9yIHRoaXMgZXhlbXB0aW9uIG1lY2hhbmlzbS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2UgaXMgbm90CisgICAgICogICAgICAgICAgICAgaW5pdGlhbGl6ZWQuCisgICAgICogQHRocm93cyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlcnJvcihzKSBvY2N1ciBkdXJpbmcgZ2VuZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdlbkV4ZW1wdGlvbkJsb2IoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLAogICAgICAgICAgICAgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc0luaXQpIHsKQEAgLTE2OCwxMiArMzMyLDQ2IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSByZXN1bHQga2V5IGJsb2IgZm9yIHRoaXMgZXhlbXB0aW9uIG1lY2hhbmlzbSBhbmQgc3RvcmVzIGl0CisgICAgICogaW50byB0aGUge0Bjb2RlIG91dHB1dH0gYnVmZmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGtleSBibG9iLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219IGluc3RhbmNlIGlzIG5vdAorICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemVkLgorICAgICAqIEB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZWQgYnVmZmVyIGlzIHRvbyBzbWFsbCBmb3IgdGhlIHJlc3VsdCBrZXkgYmxvYi4KKyAgICAgKiBAdGhyb3dzIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9yKHMpIG9jY3VyIGR1cmluZyBnZW5lcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2VuRXhlbXB0aW9uQmxvYihieXRlW10gb3V0cHV0KQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgU2hvcnRCdWZmZXJFeGNlcHRpb24sCiAgICAgICAgICAgICBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2VuRXhlbXB0aW9uQmxvYihvdXRwdXQsIDApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgcmVzdWx0IGtleSBibG9iIGZvciB0aGlzIGV4ZW1wdGlvbiBtZWNoYW5pc20gYW5kIHN0b3JlcyBpdAorICAgICAqIGludG8gdGhlIHtAY29kZSBvdXRwdXR9IGJ1ZmZlciBhdCBvZmZzZXQge0Bjb2RlIG91dHB1dE9mZnNldH0uCisgICAgICogCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSByZXN1bHQga2V5IGJsb2IuCisgICAgICogQHBhcmFtIG91dHB1dE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0byBzdGFydC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUge0Bjb2RlIG91dHB1dH0gYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgRXhlbXB0aW9uTWVjaGFuaXNtfSBpbnN0YW5jZSBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpbml0aWFsaXplZC4KKyAgICAgKiBAdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3ZpZGVkIGJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIHRoZSByZXN1bHQga2V5IGJsb2IuCisgICAgICogQHRocm93cyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlcnJvcihzKSBvY2N1ciBkdXJpbmcgZ2VuZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdlbkV4ZW1wdGlvbkJsb2IoYnl0ZVtdIG91dHB1dCwgaW50IG91dHB1dE9mZnNldCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFNob3J0QnVmZmVyRXhjZXB0aW9uLAogICAgICAgICAgICAgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIHsKQEAgLTE4Niw2ICszODQsMTEgQEAKICAgICAgICAgcmV0dXJuIGxlbjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGcmVlcyB0aGUgcmVmZXJlbmNlcyB0byB0aGUga2V5IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICBpbml0S2V5ID0gbnVsbDsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24uamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24uamF2YQppbmRleCAxYzFiYTJjLi4zYWY0OThiIDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbi5qYXZhCkBAIC0xNSwxOCArMTUsMTQgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb259LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7CiAKQEAgLTM2LDE2ICszMiwyMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE1NzI2OTk0MjkyNzc5NTcxMDlMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UuCiAgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9ufSB3aXRoIG5vIG1lc3NhZ2UuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbigpIHsKICAgICB9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtU3BpLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtU3BpLmphdmEKaW5kZXggZDQ4NjViMS4uY2VmMTUxNiAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0V4ZW1wdGlvbk1lY2hhbmlzbVNwaS5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21TcGkuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOwpAQCAtMjksNTYgKzI0LDExNCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgPGk+U2VydmljZSBQcm92aWRlciBJbnRlcmZhY2U8L2k+ICg8Yj5TUEk8L2I+KSBkZWZpbml0aW9uIGZvciB0aGUge0Bjb2RlCisgKiBFeGVtcHRpb25NZWNoYW5pc219IGNsYXNzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEV4ZW1wdGlvbk1lY2hhbmlzbVNwaSB7CisKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc21TcGl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFeGVtcHRpb25NZWNoYW5pc21TcGkoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIHRoZSByZXN1bHQga2V5IGJsb2IgZm9yIHRoaXMgZXhlbXB0aW9uIG1lY2hhbmlzbS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQga2V5IGJsb2IgZm9yIHRoaXMgZXhlbXB0aW9uIG1lY2hhbmlzbS4KKyAgICAgKiBAdGhyb3dzIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9yKHMpIG9jY3VyIGR1cmluZyBnZW5lcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gZW5naW5lR2VuRXhlbXB0aW9uQmxvYigpCiAgICAgICAgICAgICB0aHJvd3MgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIHRoZSByZXN1bHQga2V5IGJsb2IgZm9yIHRoaXMgZXhlbXB0aW9uIG1lY2hhbmlzbSBhbmQgc3RvcmVzIGl0CisgICAgICogaW50byB0aGUge0Bjb2RlIG91dHB1dH0gYnVmZmVyIGF0IG9mZnNldCB7QGNvZGUgb3V0cHV0T2Zmc2V0fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBrZXkgYmxvYi4KKyAgICAgKiBAcGFyYW0gb3V0cHV0T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0YXJ0LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSB7QGNvZGUgb3V0cHV0fSBidWZmZXIuCisgICAgICogQHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlZCBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciB0aGUgcmVzdWx0IGtleSBibG9iLgorICAgICAqIEB0aHJvd3MgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZXJyb3Iocykgb2NjdXIgZHVyaW5nIGdlbmVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZW5FeGVtcHRpb25CbG9iKGJ5dGVbXSBvdXRwdXQsCiAgICAgICAgICAgICBpbnQgb3V0cHV0T2Zmc2V0KSB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24sCiAgICAgICAgICAgICBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIGZvciB0aGUgb3V0cHV0IGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCB0aGUgb3V0cHV0CisgICAgICogb2YgdGhlIG5leHQge0BsaW5rICNlbmdpbmVHZW5FeGVtcHRpb25CbG9ifSBjYWxsLCBnaXZlbiB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIGlucHV0TGVufSAoaW4gYnl0ZXMpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dExlbgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBpbnB1dCBsZW5ndGggKGluIGJ5dGVzKS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGVuZ2luZUdldE91dHB1dFNpemUoaW50IGlucHV0TGVuKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICoga2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gaW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlIHdpdGguCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBjYW5ub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMgbWVjaGFuaXNtLgorICAgICAqIEB0aHJvd3MgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZXJyb3Iocykgb2NjdXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCiAgICAgICAgICAgICBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBFeGVtcHRpb25NZWNoYW5pc219IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGtleSBhbmQgYWxnb3JpdGhtIHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBpbml0aWFsaXplIHRoaXMgaW5zdGFuY2Ugd2l0aC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBleGVtcHRpb24gbWVjaGFuaXNtIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBtZWNoYW5pc20uCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogICAgICAgICAgICAgbWVjaGFuaXNtLgorICAgICAqIEB0aHJvd3MgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZXJyb3Iocykgb2NjdXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKICAgICAgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEV4ZW1wdGlvbk1lY2hhbmlzbX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICoga2V5IGFuZCBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGluaXRpYWxpemUgdGhpcyBpbnN0YW5jZSB3aXRoLgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGV4ZW1wdGlvbiBtZWNoYW5pc20gYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIG1lY2hhbmlzbS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgdGhlIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogICAgICAgICAgICAgbWVjaGFuaXNtLgorICAgICAqIEB0aHJvd3MgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZXJyb3Iocykgb2NjdXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9IbWFjU3BpLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vSG1hY1NwaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg2MmQwLi4wMDAwMDAwCi0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9IbWFjU3BpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZheC5jcnlwdG87Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwotCi0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MgaW1wbGVtZW50aW5nIEhNQUMKLSAqLwotY2xhc3MgSG1hY1NwaSBleHRlbmRzIE1hY1NwaQotewotICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbCgpCi0gICAgewotICAgICAgICBieXRlW10gcmVzdWx0ID0gbmF0aXZlX2NvbXB1dGVfc2hhMV9obWFjKG1LZXkuZ2V0RW5jb2RlZCgpLCBtRGF0YS50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgZW5naW5lUmVzZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE1hY0xlbmd0aCgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1LZXkgPSBrZXk7Ci0gICAgICAgIG1EYXRhID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVSZXNldCgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7Ci0gICAgICAgICAgICBtRGF0YSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZSBpbnB1dCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKLSAgICAgICAgICAgIGlmIChtRGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURhdGEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRGF0YS53cml0ZShpbnB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewotICAgICAgICAgICAgaWYgKG1EYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGF0YSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EYXRhLndyaXRlKGlucHV0LCBvZmZzZXQsIGxlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIG5hdGl2ZSBieXRlW10gbmF0aXZlX2NvbXB1dGVfc2hhMV9obWFjKGJ5dGVbXSBrZXksIGJ5dGVbXSBkYXRhKTsKLQotICAgIHByaXZhdGUgS2V5IG1LZXk7Ci0gICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbURhdGE7Ci0gICAgcHJpdmF0ZSBPYmplY3QgbVN5bmMgPSBuZXcgT2JqZWN0KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDlhNmM0ZDEuLmUzNzZiODUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24uamF2YQpAQCAtMTUsMTggKzE1LDE1IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uLCB0aGF0IGlzIHRocm93biB3aGVuIHRoZSBkYXRhIGxlbmd0aCBwcm92aWRlZCB0byBhIGJsb2NrIGNpcGhlcgorICogZG9lcyBub3QgbWF0Y2ggdGhlIGJsb2NrIHNpemUgb2YgdGhlIGNpcGhlci4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKIApAQCAtMzYsMTYgKzMzLDIxIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE5NjUxNDQ4MTE5NTM1NDAzOTJMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbn0uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0tleUFncmVlbWVudC5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0tleUFncmVlbWVudC5qYXZhCmluZGV4IDNhMjMxODEuLmVlMWYxOTUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9LZXlBZ3JlZW1lbnQuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vS2V5QWdyZWVtZW50LmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKQEAgLTM1LDEyICszMCwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8uaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmU7CiAKLQogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYSBrZXkgZXhjaGFuZ2UgcHJvdG9jb2wuIFRoaXMKKyAqIGVuYWJsZXMgdHdvIG9yIG1vcmUgcGFydGllcyB0byBhZ3JlZSBvbiBhIHNlY3JldCBrZXkgZm9yIHN5bW1ldHJpYworICogY3J5cHRvZ3JhcGh5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgY2xhc3MgS2V5QWdyZWVtZW50IHsKIAogICAgIC8vIFVzZWQgdG8gYWNjZXNzIGNvbW1vbiBlbmdpbmUgZnVuY3Rpb25hbGl0eQpAQCAtNTksOCArNTUsMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbGdvcml0aG07CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlBZ3JlZW1lbnR9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlBZ3JlZVNwaQorICAgICAqICAgICAgICAgICAgdGhlIDxiPlNQSTwvYj4gZGVsZWdhdGUuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgcHJvdmlkaW5nIHRoaXMgS2V5QWdyZWVtZW50LgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBrZXkgYWdyZWVtZW50IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgS2V5QWdyZWVtZW50KEtleUFncmVlbWVudFNwaSBrZXlBZ3JlZVNwaSwgUHJvdmlkZXIgcHJvdmlkZXIsCiAgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtKSB7CkBAIC03MCwyNCArNzMsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBrZXkgYWdyZWVtZW50IGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBrZXkgYWdyZWVtZW50IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBmb3IgdGhpcyB7QGNvZGUgS2V5QWdyZWVtZW50fSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBmb3IgdGhpcyB7QGNvZGUgS2V5QWdyZWVtZW50fSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlBZ3JlZW1lbnR9IGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUga2V5IGFncmVlbWVudCBhbGdvcml0aG0gdG8gY3JlYXRlLgorICAgICAqIEByZXR1cm4gYSBrZXkgYWdyZWVtZW50IGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIGluc3RhbGxlZCBwcm92aWRlciBjYW4gcHJvdmlkZSB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5QWdyZWVtZW50IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTEwMiw4ICsxMTcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlBZ3JlZW1lbnR9IGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUga2V5IGFncmVlbWVudCBhbGdvcml0aG0gdG8gY3JlYXRlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZAorICAgICAqICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gYSBrZXkgYWdyZWVtZW50IGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGRvZXMgbm90IGV4aXN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBuYW1lIGlzIHtAY29kZSBudWxsfSBvciBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEtleUFncmVlbWVudCBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLApAQCAtMTE5LDggKzE1MCwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgS2V5QWdyZWVtZW50fSBmb3IgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gZnJvbSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcHJvdmlkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGtleSBhZ3JlZW1lbnQgYWxnb3JpdGhtIHRvIGNyZWF0ZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciB0aGF0IHByb3ZpZGVzIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gYSBrZXkgYWdyZWVtZW50IGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIG5hbWUgaXMge0Bjb2RlIG51bGx9LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5QWdyZWVtZW50IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sCiAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC0xMzgsMTYgKzE4MywzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEtleUFncmVlbWVudH0gd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGluaXRpYWxpemUgdGhpcyBrZXkgYWdyZWVtZW50LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBrZXkKKyAgICAgKiAgICAgICAgICAgICBhZ3JlZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CiAgICAgICAgIHNwaUltcGwuZW5naW5lSW5pdChrZXksIHJuZG0pOy8vbmV3IFNlY3VyZVJhbmRvbSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBLZXlBZ3JlZW1lbnR9IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCByYW5kb21uZXNzIHNvdXJjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGluaXRpYWxpemUgdGhpcyBrZXkgYWdyZWVtZW50LgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZm9yIGFueSByYW5kb21uZXNzIG5lZWRlZC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBjYW5ub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMga2V5CisgICAgICogICAgICAgICAgICAgYWdyZWVtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoS2V5IGtleSwgU2VjdXJlUmFuZG9tIHJhbmRvbSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKQEAgLTE1NSw4ICsyMTUsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBLZXlBZ3JlZW1lbnR9IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIHRoZQorICAgICAqIGFsZ29yaXRobSBwYXJhbWV0ZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gaW5pdGlhbGl6ZSB0aGlzIGtleSBhZ3JlZW1lbnQuCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMga2V5IGFncmVlbWVudCBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIGtleQorICAgICAqICAgICAgICAgICAgIGFncmVlbWVudC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYXJlIGludmFsaWQgZm9yIHRoaXMga2V5CisgICAgICogICAgICAgICAgICAgYWdyZWVtZW50IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpAQCAtMTY0LDggKzIzNiwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEtleUFncmVlbWVudH0gd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYWxnb3JpdGhtCisgICAgICogcGFyYW1ldGVycyBhbmQgcmFuZG9tbmVzcyBzb3VyY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBpbml0aWFsaXplIHRoaXMga2V5IGFncmVlbWVudC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBrZXkgYWdyZWVtZW50IGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGZvciBhbnkgcmFuZG9tbmVzcyBuZWVkZWQuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIGtleQorICAgICAqICAgICAgICAgICAgIGFncmVlbWVudC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYXJlIGludmFsaWQgZm9yIHRoaXMga2V5CisgICAgICogICAgICAgICAgICAgYWdyZWVtZW50IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLAogICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCkBAIC0xNzQsOCArMjYwLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogRG9lcyB0aGUgbmV4dCAob3IgdGhlIGxhc3QpIHBoYXNlIG9mIHRoZSBrZXkgYWdyZWVtZW50LCB1c2luZyB0aGUKKyAgICAgKiBzcGVjaWZpZWQga2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgcGFydHkgZm9yIHRoaXMgcGhhc2UuCisgICAgICogQHBhcmFtIGxhc3RQaGFzZQorICAgICAqICAgICAgICAgICAgc2V0IHRvIHtAY29kZSB0cnVlfSBpZiB0aGlzIGlzIHRoZSBsYXN0IHBoYXNlIG9mIHRoaXMga2V5CisgICAgICogICAgICAgICAgICBhZ3JlZW1lbnQuCisgICAgICogQHJldHVybiB0aGUgaW50ZXJtZWRpYXRlIGtleSBmcm9tIHRoaXMgcGhhc2Ugb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzCisgICAgICogICAgICAgICBubyBpbnRlcm1lZGlhdGUga2V5IGZvciB0aGlzIHBoYXNlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIGluIHRoaXMga2V5IGFncmVlbWVudCBvcgorICAgICAqICAgICAgICAgICAgIHRoaXMgcGhhc2UsCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGluc3RhbmNlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgS2V5IGRvUGhhc2UoS2V5IGtleSwgYm9vbGVhbiBsYXN0UGhhc2UpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKQEAgLTE4MywxNiArMjgzLDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIHRoZSBzaGFyZWQgc2VjcmV0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBzaGFyZWQgc2VjcmV0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBrZXkgYWdyZWVtZW50IGlzIG5vdCBjb21wbGV0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdlbmVyYXRlU2VjcmV0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBzcGlJbXBsLmVuZ2luZUdlbmVyYXRlU2VjcmV0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIHRoZSBzaGFyZWQgc2VjcmV0IGFuZCBzdG9yZXMgaXQgaW50byB0aGUgYnVmZmVyIHtAY29kZQorICAgICAqIHNoYXJlZFNlY3JlZH0gYXQge0Bjb2RlIG9mZnNldH0uCisgICAgICogCisgICAgICogQHBhcmFtIHNoYXJlZFNlY3JldAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgc2hhcmVkIHNlY3JldC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbiB0aGUgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBrZXkgYWdyZWVtZW50IGlzIG5vdCBjb21wbGV0ZS4KKyAgICAgKiBAdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciB0aGUgc2hhcmVkIHNlY3JldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdlbmVyYXRlU2VjcmV0KGJ5dGVbXSBzaGFyZWRTZWNyZXQsIGludCBvZmZzZXQpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CkBAIC0yMDAsOCArMzE1LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIHRoZSBzaGFyZWQgc2VjcmV0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gdG8gZm9yIHRoZSB7QGNvZGUgU2VjcmV0S2V5fQorICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBzZWNyZXQgYXMgYSB7QGNvZGUgU2VjcmV0S2V5fSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGtleSBhZ3JlZW1lbnQgaXMgbm90IGNvbXBsZXRlLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gZm9yIHRoZSBzZWNyZXQga2V5IGRvZXMgbm90CisgICAgICogICAgICAgICAgICAgZXhpc3RzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3JldEtleX0gd2l0aCB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBjYW5ub3QgYmUKKyAgICAgKiAgICAgICAgICAgICBjcmVhdGVkIHVzaW5nIHRoZSBnZW5lcmF0ZWQgc2hhcmVkIHNlY3JldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU2VjcmV0S2V5IGdlbmVyYXRlU2VjcmV0KFN0cmluZyBhbGdvcml0aG0pCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vS2V5QWdyZWVtZW50U3BpLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vS2V5QWdyZWVtZW50U3BpLmphdmEKaW5kZXggMjNhNTM2Yi4uZmE5ZjM3NyAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0tleUFncmVlbWVudFNwaS5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9LZXlBZ3JlZW1lbnRTcGkuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwpAQCAtMzAsNTcgKzI1LDEyNSBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgPGk+U2VydmljZSBQcm92aWRlciBJbnRlcmZhY2U8L2k+ICg8Yj5TUEk8L2I+KSBkZWZpbml0aW9uIGZvciB0aGUKKyAqIHtAY29kZSBLZXlBZ3JlZW1lbnR9IGNsYXNzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEtleUFncmVlbWVudFNwaSB7CisgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgS2V5QWdyZWVtZW50U3BpfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLQogICAgIHB1YmxpYyBLZXlBZ3JlZW1lbnRTcGkoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogRG9lcyB0aGUgbmV4dCAob3IgdGhlIGxhc3QpIHBoYXNlIG9mIHRoZSBrZXkgYWdyZWVtZW50LCB1c2luZyB0aGUKKyAgICAgKiBzcGVjaWZpZWQga2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgcGFydHkgZm9yIHRoaXMgcGhhc2UuCisgICAgICogQHBhcmFtIGxhc3RQaGFzZQorICAgICAqICAgICAgICAgICAgc2V0IHRvIHtAY29kZSB0cnVlfSBpZiB0aGlzIGlzIHRoZSBsYXN0IHBoYXNlIG9mIHRoaXMga2V5CisgICAgICogICAgICAgICAgICBhZ3JlZW1lbnQuCisgICAgICogQHJldHVybiB0aGUgaW50ZXJtZWRpYXRlIGtleSBmcm9tIHRoaXMgcGhhc2Ugb3IgbnVsbCBpZiB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgaW50ZXJtZWRpYXRlIGtleSBmb3IgdGhpcyBwaGFzZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBjYW5ub3QgYmUgdXNlZCBpbiB0aGlzIGtleSBhZ3JlZW1lbnQgb3IKKyAgICAgKiAgICAgICAgICAgICB0aGlzIHBoYXNlLAorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBpbnN0YW5jZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEtleSBlbmdpbmVEb1BoYXNlKEtleSBrZXksIGJvb2xlYW4gbGFzdFBoYXNlKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEdlbmVyYXRlcyB0aGUgc2hhcmVkIHNlY3JldC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgc2hhcmVkIHNlY3JldC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMga2V5IGFncmVlbWVudCBpcyBub3QgY29tcGxldGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVHZW5lcmF0ZVNlY3JldCgpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIHRoZSBzaGFyZWQgc2VjcmV0IGFuZCBzdG9yZXMgaXQgaW50byB0aGUgYnVmZmVyIHtAY29kZQorICAgICAqIHNoYXJlZFNlY3JlZH0gYXQge0Bjb2RlIG9mZnNldH0uCisgICAgICogCisgICAgICogQHBhcmFtIHNoYXJlZFNlY3JldAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgc2hhcmVkIHNlY3JldC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbiB0aGUgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBrZXkgYWdyZWVtZW50IGlzIG5vdCBjb21wbGV0ZS4KKyAgICAgKiBAdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciB0aGUgc2hhcmVkIHNlY3JldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGVuZ2luZUdlbmVyYXRlU2VjcmV0KGJ5dGVbXSBzaGFyZWRTZWNyZXQsIGludCBvZmZzZXQpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBTaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEdlbmVyYXRlcyB0aGUgc2hhcmVkIHNlY3JldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtIHRvIGZvciB0aGUge0Bjb2RlIFNlY3JldEtleX0KKyAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgc2VjcmV0IGFzIGEge0Bjb2RlIFNlY3JldEtleX0gb2YgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBrZXkgYWdyZWVtZW50IGlzIG5vdCBjb21wbGV0ZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGZvciB0aGUgc2VjcmV0IGtleSBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGV4aXN0cy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWNyZXRLZXl9IHdpdGggdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgY3JlYXRlZCB1c2luZyB0aGUgZ2VuZXJhdGVkIHNoYXJlZCBzZWNyZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldChTdHJpbmcgYWxnb3JpdGhtKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEtleUFncmVlbWVudFNwaX0gd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIHJhbmRvbW5lc3Mgc291cmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gaW5pdGlhbGl6ZSB0aGlzIGtleSBhZ3JlZW1lbnQuCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmb3IgYW55IHJhbmRvbW5lc3MgbmVlZGVkLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBrZXkKKyAgICAgKiAgICAgICAgICAgICBhZ3JlZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBTZWN1cmVSYW5kb20gcmFuZG9tKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBLZXlBZ3JlZW1lbnRTcGl9IHdpdGggdGhlIHNwZWNpZmllZCBrZXksCisgICAgICogYWxnb3JpdGhtIHBhcmFtZXRlcnMgYW5kIHJhbmRvbW5lc3Mgc291cmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gaW5pdGlhbGl6ZSB0aGlzIGtleSBhZ3JlZW1lbnQuCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMga2V5IGFncmVlbWVudCBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmb3IgYW55IHJhbmRvbW5lc3MgbmVlZGVkLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBrZXkKKyAgICAgKiAgICAgICAgICAgICBhZ3JlZW1lbnQuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIGZvciB0aGlzIGtleQorICAgICAqICAgICAgICAgICAgIGFncmVlbWVudCBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcywKICAgICAgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20pIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLApkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0tleUdlbmVyYXRvci5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0tleUdlbmVyYXRvci5qYXZhCmluZGV4IDBmOTUyYjguLjMyNDNiMzkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9LZXlHZW5lcmF0b3IuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vS2V5R2VuZXJhdG9yLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKQEAgLTM1LDEwICszMCwxMSBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIHB1YmxpYyBBUEkgZm9yIGdlbmVyYXRpbmcgc3ltbWV0cmljIGNyeXB0b2dyYXBoaWMKKyAqIGtleXMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBLZXlHZW5lcmF0b3IgewogCiAgICAgLy8gVXNlZCB0byBhY2Nlc3MgY29tbW9uIGVuZ2luZSBmdW5jdGlvbmFsaXR5CkBAIC01Nyw4ICs1MywxNSBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFsZ29yaXRobTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEtleUdlbmVyYXRvcn0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGtleUdlblNwaQorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIGRlbGVnYXRlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEtleUdlbmVyYXRvcihLZXlHZW5lcmF0b3JTcGkga2V5R2VuU3BpLCBQcm92aWRlciBwcm92aWRlciwKICAgICAgICAgICAgIFN0cmluZyBhbGdvcml0aG0pIHsKQEAgLTY4LDI0ICs3MSwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGtleSBnZW5lcmF0aW9uIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBrZXkgZ2VuZXJhdGlvbiBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcHJvdmlkZXIgb2YgdGhpcyB7QGNvZGUgS2V5R2VuZXJhdG9yfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBvZiB0aGlzIHtAY29kZSBLZXlHZW5lcmF0b3J9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlciBnZXRQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEtleUdlbmVyYXRvcn0gaW5zdGFuY2UgdGhhdCBwcm92aWRlcyB0aGUgc3BlY2lmaWVkCisgICAgICoga2V5IGFsZ29yaXRobSwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGtleSBhbGdvcml0aG0KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcge0Bjb2RlIEtleUdlbmVyYXRvcn0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlIGJ5IGFueSBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5R2VuZXJhdG9yIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTEwMCw4ICsxMTYsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlHZW5lcmF0b3J9IGluc3RhbmNlIHRoYXQgcHJvdmlkZXMgdGhlIHNwZWNpZmllZAorICAgICAqIGtleSBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQga2V5IGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciB0aGF0IGlzIHByb3ZpZGluZyB0aGUgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgS2V5R2VuZXJhdG9yfSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbmFtZSBpcyB7QGNvZGUgbnVsbH0gb3IgZW1wdHkuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIG5hbWUgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5R2VuZXJhdG9yIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sCiAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCkBAIC0xMTcsOCArMTQ5LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgS2V5R2VuZXJhdG9yfSBpbnN0YW5jZSB0aGF0IHByb3ZpZGVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBrZXkgYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGtleSBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgdGhhdCBpcyBwcm92aWRpbmcgdGhlIGFsZ29yaXRobQorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgS2V5R2VuZXJhdG9yfSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gbmFtZSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXlHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTEzNiwxNiArMTgyLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIGEgc2VjcmV0IGtleS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgc2VjcmV0IGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU2VjcmV0S2V5IGdlbmVyYXRlS2V5KCkgewogICAgICAgICByZXR1cm4gc3BpSW1wbC5lbmdpbmVHZW5lcmF0ZUtleSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEtleUdlbmVyYXRvcn0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogYWxnb3JpdGhtIHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBrZXkgZ2VuZXJhdGlvbiBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIGtleQorICAgICAqICAgICAgICAgICAgIGdlbmVyYXRvciBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKQEAgLTE1Myw4ICsyMDgsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBLZXlHZW5lcmF0b3J9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGFsZ29yaXRobSBwYXJhbWV0ZXJzIGFuZCByYW5kb21uZXNzIHNvdXJjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGtleSBnZW5lcmF0aW9uIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgcmFuZG9tbmVzcyBzb3VyY2UgZm9yIGFueSByYW5kb20gYnl0ZXMuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZXMgdG8gaW5pdGlhbGl6ZSB0aGlzIGtleQorICAgICAqICAgICAgICAgICAgIGdlbmVyYXRvciBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKQEAgLTE2MiwyNCArMjI2LDM4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5R2VuZXJhdG9yfSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgc2l6ZQorICAgICAqIChpbiBiaXRzKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5c2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGtleSAoaW4gYml0cykuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChpbnQga2V5c2l6ZSkgewogICAgICAgICBzcGlJbXBsLmVuZ2luZUluaXQoa2V5c2l6ZSwgcm5kbSk7Ly9uZXcgU2VjdXJlUmFuZG9tKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEtleUdlbmVyYXRvcn0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQga2V5IHNpemUKKyAgICAgKiAoaW4gYml0cykgdXNpbmcgdGhlIHNwZWNpZmllZCByYW5kb21uZXNzIHNvdXJjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5c2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGtleSAoaW4gYml0cykuCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHJhbmRvbW5lc3Mgc291cmNlIGZvciBhbnkgcmFuZG9tIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoaW50IGtleXNpemUsIFNlY3VyZVJhbmRvbSByYW5kb20pIHsKICAgICAgICAgc3BpSW1wbC5lbmdpbmVJbml0KGtleXNpemUsIHJhbmRvbSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5R2VuZXJhdG9yfSB3aXRoIHRoZSBzcGVjaWZpZWQgcmFuZG9tbmVzcworICAgICAqIHNvdXJjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgcmFuZG9tbmVzcyBzb3VyY2UgZm9yIGFueSByYW5kb20gYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChTZWN1cmVSYW5kb20gcmFuZG9tKSB7CiAgICAgICAgIHNwaUltcGwuZW5naW5lSW5pdChyYW5kb20pOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0tleUdlbmVyYXRvclNwaS5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL0tleUdlbmVyYXRvclNwaS5qYXZhCmluZGV4IDQ2ZGQ3OGYuLjE2NWRiNjkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9LZXlHZW5lcmF0b3JTcGkuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vS2V5R2VuZXJhdG9yU3BpLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKQEAgLTI3LDM5ICsyMiw2NSBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgPGk+U2VydmljZSBQcm92aWRlciBJbnRlcmZhY2U8L2k+ICg8Yj5TUEk8L2I+KSBkZWZpbml0aW9uIGZvciB0aGUKKyAqIHtAY29kZSBLZXlHZW5lcmF0b3J9IGNsYXNzLgogICogCisgKiBAc2VlIEtleUdlbmVyYXRvcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBLZXlHZW5lcmF0b3JTcGkgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgS2V5R2VuZXJhdG9yU3BpfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5R2VuZXJhdG9yU3BpKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEdlbmVyYXRlcyBhIHNlY3JldCBrZXkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIHNlY3JldCBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZUtleSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5R2VuZXJhdG9yU3BpfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhbGdvcml0aG0gcGFyYW1ldGVycyBhbmQgcmFuZG9tbmVzcyBzb3VyY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBrZXkgZ2VuZXJhdGlvbiBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHJhbmRvbW5lc3Mgc291cmNlIGZvciBhbnkgcmFuZG9tIGJ5dGVzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXJzIGNhbm5vdCBiZSB1c2VzIHRvIGluaXRpYWxpemUgdGhpcyBrZXkKKyAgICAgKiAgICAgICAgICAgICBnZW5lcmF0b3IgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMsCiAgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tKSB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEtleUdlbmVyYXRvcn0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQga2V5CisgICAgICogc2l6ZSAoaW4gYml0cykgdXNpbmcgdGhlIHNwZWNpZmllZCByYW5kb21uZXNzIHNvdXJjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5c2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGtleSAoaW4gYml0cykuCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHJhbmRvbW5lc3Mgc291cmNlIGZvciBhbnkgcmFuZG9tIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoaW50IGtleXNpemUsIFNlY3VyZVJhbmRvbSByYW5kb20pOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5R2VuZXJhdG9yfSB3aXRoIHRoZSBzcGVjaWZpZWQgcmFuZG9tbmVzcworICAgICAqIHNvdXJjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgcmFuZG9tbmVzcyBzb3VyY2UgZm9yIGFueSByYW5kb20gYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdChTZWN1cmVSYW5kb20gcmFuZG9tKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTWFjLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTWFjLmphdmEKaW5kZXggYzYwOTMxMC4uOTVmNDUzOSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL01hYy5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9NYWMuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKQEAgLTM3LDEwICszMiwxMSBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIHB1YmxpYyBBUEkgZm9yIDxpPk1lc3NhZ2UgQXV0aGVudGljYXRpb24gQ29kZTwvaT4KKyAqIChNQUMpIGFsZ29yaXRobXMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBNYWMgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCiAgICAgLy9Vc2VkIHRvIGFjY2VzcyBjb21tb24gZW5naW5lIGZ1bmN0aW9uYWxpdHkKQEAgLTU5LDggKzU1LDE1IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdE1hYzsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIE1hY30gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1hY1NwaQorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIGRlbGVnYXRlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBNQUMgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBNYWMoTWFjU3BpIG1hY1NwaSwgUHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyBhbGdvcml0aG0pIHsKICAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwpAQCAtNzAsMjYgKzczLDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgTUFDIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBNQUMgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gYWxnb3JpdGhtOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIG9mIHRoaXMge0Bjb2RlIE1hY30gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgb2YgdGhpcyB7QGNvZGUgTWFjfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIE1hY30gaW5zdGFuY2UgdGhhdCBwcm92aWRlcyB0aGUgc3BlY2lmaWVkIE1BQworICAgICAqIGFsZ29yaXRobS4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYWxnb3JpdGhtIGlzIG51bGwgKGluc3RlYWQgb2YKLSAgICAgKiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBNQUMgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgTWFjfSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUgYnkgYW55IHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYWMgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTAzLDEwICsxMTcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIE1hY30gaW5zdGFuY2UgdGhhdCBwcm92aWRlcyB0aGUgc3BlY2lmaWVkIE1BQworICAgICAqIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFsZ29yaXRobSBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgTUFDIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciB0aGF0IGlzIHByb3ZpZGluZyB0aGUgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgTWFjfSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgbmFtZSBpcyB7QGNvZGUgbnVsbH0gb3IgZW1wdHkuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hYyBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CkBAIC0xMjEsMTAgKzE0OSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgTWFjfSBpbnN0YW5jZSB0aGF0IHByb3ZpZGVzIHRoZSBzcGVjaWZpZWQgTUFDCisgICAgICogYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYWxnb3JpdGhtIGlzIG51bGwgKGluc3RlYWQgb2YKLSAgICAgKiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBNQUMgYWxnb3JpdGhtLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyIHRoYXQgaXMgcHJvdmlkaW5nIHRoZSBhbGdvcml0aG0uCisgICAgICogQHJldHVybiB0aGUgbmV3IHtAY29kZSBNYWN9IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwcm92aWRlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYWMgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTE0MSwxNiArMTgxLDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgTUFDIChpbiBieXRlcykuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoaXMgTUFDIChpbiBieXRlcykuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRNYWNMZW5ndGgoKSB7CiAgICAgICAgIHJldHVybiBzcGlJbXBsLmVuZ2luZUdldE1hY0xlbmd0aCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIE1hY30gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQKKyAgICAgKiBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGluaXRpYWxpemUgdGhpcyBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcworICAgICAqICAgICAgICAgICAgIGFsZ29yaXRobSwgb3IgaXQgaXMgbnVsbC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC0xNjIsOCArMjE1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgTWFjfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gaW5pdGlhbGl6ZSB0aGlzIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBpbml0aWFsaXphdGlvbiBmYWlscyBiZWNhdXNlIHRoZSBwcm92aWRlZCBrZXkgaXMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgbnVsbH0uCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoS2V5IGtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewogICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKQEAgLTE3OCw4ICsyNDAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBVcGRhdGVzIHRoaXMge0Bjb2RlIE1hY30gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGJ5dGUuCisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgYnl0ZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBNQUMgaXMgbm90IGluaXRpYWxpemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZShieXRlIGlucHV0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc0luaXRNYWMpIHsKQEAgLTE4OSw4ICsyNTYsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBVcGRhdGVzIHRoaXMge0Bjb2RlIE1hY30gaW5zdGFuY2Ugd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICoge0Bjb2RlIGlucHV0fSBmcm9tIHRoZSBzcGVjaWZpZWQge0Bjb2RlIG9mZnNldH0gYW5kIGxlbmd0aCB7QGNvZGUgbGVufS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgTUFDIGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXR9IGFuZCB7QGNvZGUgbGVufSBkbyBub3Qgc3BlY2lmaWVkIGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICBjaHVuayBpbiB7QGNvZGUgaW5wdXR9IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CkBAIC0yMDcsOCArMjg3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29waWVzIHRoZSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIE1BQyBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlKGJ5dGVbXSBpbnB1dCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaXNJbml0TWFjKSB7CkBAIC0yMjAsOCArMzA1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGlzIHtAY29kZSBNYWN9IGluc3RhbmNlIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogYnVmZmVyLCBzdGFydGluZyBhdCB7QGxpbmsgQnl0ZUJ1ZmZlciNwb3NpdGlvbigpfSwgaW5jbHVkaW5nIHRoZSBuZXh0CisgICAgICoge0BsaW5rIEJ5dGVCdWZmZXIjcmVtYWluaW5nKCl9IGJ5dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgTUFDIGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoQnl0ZUJ1ZmZlciBpbnB1dCkgewogICAgICAgICBpZiAoIWlzSW5pdE1hYykgewpAQCAtMjM1LDggKzMyNywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbXB1dGVzIHRoZSBkaWdlc3Qgb2YgdGhpcyBNQUMgYmFzZWQgb24gdGhlIGRhdGEgcHJldmlvdXNseSBzcGVjaWZpZWQgaW4KKyAgICAgKiB7QGxpbmsgI3VwZGF0ZX0gY2FsbHMuCisgICAgICogPHA+CisgICAgICogVGhpcyB7QGNvZGUgTWFjfSBpbnN0YW5jZSBpcyByZXZlcnRlZCB0byBpdHMgaW5pdGlhbCBzdGF0ZSBhbmQgY2FuIGJlCisgICAgICogdXNlZCB0byBzdGFydCB0aGUgbmV4dCBNQUMgY29tcHV0YXRpb24gd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIG9yCisgICAgICogaW5pdGlhbGl6ZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGRpZ2VzdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgTUFDIGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGRvRmluYWwoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc0luaXRNYWMpIHsKQEAgLTI0Niw4ICszNDgsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb21wdXRlcyB0aGUgZGlnZXN0IG9mIHRoaXMgTUFDIGJhc2VkIG9uIHRoZSBkYXRhIHByZXZpb3VzbHkgc3BlY2lmaWVkIGluCisgICAgICoge0BsaW5rICN1cGRhdGV9IGNhbGxzIGFuZCBzdG9yZXMgdGhlIGRpZ2VzdCBpbiB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIG91dHB1dH0gYnVmZmVyIGF0IG9mZnNldCB7QGNvZGUgb3V0T2Zmc2V0fS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHtAY29kZSBNYWN9IGluc3RhbmNlIGlzIHJldmVydGVkIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFuZCBjYW4gYmUKKyAgICAgKiB1c2VkIHRvIHN0YXJ0IHRoZSBuZXh0IE1BQyBjb21wdXRhdGlvbiB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb3IKKyAgICAgKiBpbml0aWFsaXplZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAqIEBwYXJhbSBvdXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgKiBAdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBvdXRwdXQgYnVmZmVyIGlzIGVpdGhlciB0b28gc21hbGwgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgIGRpZ2VzdCB0byBiZSBzdG9yZWQsIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGJ1ZmZlciBpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBudWxsfSwgb3IgdGhlIHNwZWNpZmllZCBvZmZzZXQgaXMgbmVnYXRpdmUgb3IgcGFzdCB0aGUgbGVuZ3RoCisgICAgICogICAgICAgICAgICAgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIE1BQyBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZG9GaW5hbChieXRlW10gb3V0cHV0LCBpbnQgb3V0T2Zmc2V0KQogICAgICAgICAgICAgdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewpAQCAtMjczLDggKzM5NCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbXB1dGVzIHRoZSBkaWdlc3Qgb2YgdGhpcyBNQUMgYmFzZWQgb24gdGhlIGRhdGEgcHJldmlvdXNseSBzcGVjaWZpZWQgb24KKyAgICAgKiB7QGxpbmsgI3VwZGF0ZX0gY2FsbHMgYW5kIG9uIHRoZSBmaW5hbCBieXRlcyBzcGVjaWZpZWQgYnkge0Bjb2RlIGlucHV0fQorICAgICAqIChvciBiYXNlZCBvbiB0aG9zZSBieXRlcyBvbmx5KS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHtAY29kZSBNYWN9IGluc3RhbmNlIGlzIHJldmVydGVkIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFuZCBjYW4gYmUKKyAgICAgKiB1c2VkIHRvIHN0YXJ0IHRoZSBuZXh0IE1BQyBjb21wdXRhdGlvbiB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb3IKKyAgICAgKiBpbml0aWFsaXplZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaW5hbCBieXRlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgZGlnZXN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBNQUMgaXMgbm90IGluaXRpYWxpemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZG9GaW5hbChieXRlW10gaW5wdXQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBpZiAoIWlzSW5pdE1hYykgewpAQCAtMjg3LDE2ICs0MjEsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXNldHMgdGhpcyB7QGNvZGUgTWFjfSBpbnN0YW5jZSB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHtAY29kZSBNYWN9IGluc3RhbmNlIGlzIHJldmVydGVkIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFuZCBjYW4gYmUKKyAgICAgKiB1c2VkIHRvIHN0YXJ0IHRoZSBuZXh0IE1BQyBjb21wdXRhdGlvbiB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb3IKKyAgICAgKiBpbml0aWFsaXplZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCByZXNldCgpIHsKICAgICAgICAgc3BpSW1wbC5lbmdpbmVSZXNldCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENsb25lcyB0aGlzIHtAY29kZSBNYWN9IGluc3RhbmNlIGFuZCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgY2xvbmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9NYWNTcGkuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9NYWNTcGkuamF2YQppbmRleCBiMDI1NjBkLi40NzU2MTg0IDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTWFjU3BpLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL01hY1NwaS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG87CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKQEAgLTI5LDQ2ICsyNCw4MSBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSA8aT5TZXJ2aWNlLVByb3ZpZGVyIEludGVyZmFjZTwvaT4gKDxiPlNQSTwvYj4pIGRlZmluaXRpb24gZm9yIHRoZSB7QGNvZGUKKyAqIE1hY30gY2xhc3MuCiAgKiAKKyAqIEBzZWUgTWFjCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFjU3BpIHsKKyAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBNYWNTcGl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNYWNTcGkoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgTUFDIChpbiBieXRlcykuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoaXMgTUFDIChpbiBieXRlcykuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZXRNYWNMZW5ndGgoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIE1hY1NwaX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQKKyAgICAgKiBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGluaXRpYWxpemUgdGhpcyBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhpcworICAgICAqICAgICAgICAgICAgIGFsZ29yaXRobSwgb3IgaXQgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBjYW5ub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGlzIHtAY29kZSBNYWNTcGl9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBieXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lVXBkYXRlKGJ5dGUgaW5wdXQpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGlzIHtAY29kZSBNYWNTcGl9IGluc3RhbmNlIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogYnVmZmVyIHtAY29kZSBpbnB1dH0gZnJvbSB0aGUgc3BlY2lmaWVkIHtAY29kZSBvZmZzZXR9IGFuZCBsZW5ndGgge0Bjb2RlCisgICAgICogbGVufS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFVwZGF0ZXMgdGhpcyB7QGNvZGUgTWFjU3BpfSBpbnN0YW5jZSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIGJ1ZmZlciwgc3RhcnRpbmcgYXQge0BsaW5rIEJ5dGVCdWZmZXIjcG9zaXRpb24oKX0sIGluY2x1ZGluZyB0aGUgbmV4dAorICAgICAqIHtAbGluayBCeXRlQnVmZmVyI3JlbWFpbmluZygpfSBieXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKEJ5dGVCdWZmZXIgaW5wdXQpIHsKICAgICAgICAgaWYgKCFpbnB1dC5oYXNSZW1haW5pbmcoKSkgewpAQCAtOTAsMjAgKzEyMCwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbXB1dGVzIHRoZSBkaWdlc3Qgb2YgdGhpcyBNQUMgYmFzZWQgb24gdGhlIGRhdGEgcHJldmlvdXNseSBzcGVjaWZpZWQgaW4KKyAgICAgKiB7QGxpbmsgI2VuZ2luZVVwZGF0ZX0gY2FsbHMuCisgICAgICogPHA+CisgICAgICogVGhpcyB7QGNvZGUgTWFjU3BpfSBpbnN0YW5jZSBpcyByZXZlcnRlZCB0byBpdHMgaW5pdGlhbCBzdGF0ZSBhbmQKKyAgICAgKiBjYW4gYmUgdXNlZCB0byBzdGFydCB0aGUgbmV4dCBNQUMgY29tcHV0YXRpb24gd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIG9yCisgICAgICogaW5pdGlhbGl6ZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGRpZ2VzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGVuZ2luZURvRmluYWwoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJlc2V0cyB0aGlzIHtAY29kZSBNYWNTcGl9IGluc3RhbmNlIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMge0Bjb2RlIE1hY1NwaX0gaW5zdGFuY2UgaXMgcmV2ZXJ0ZWQgdG8gaXRzIGluaXRpYWwgc3RhdGUgYW5kIGNhbiBiZQorICAgICAqIHVzZWQgdG8gc3RhcnQgdGhlIG5leHQgTUFDIGNvbXB1dGF0aW9uIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBvcgorICAgICAqIGluaXRpYWxpemVkIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVJlc2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDbG9uZXMgdGhpcyB7QGNvZGUgTWFjU3BpfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGNsb25pbmcgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IDBmYjE5NmYuLjRhZmI4YWIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL05vU3VjaFBhZGRpbmdFeGNlcHRpb24uamF2YQpAQCAtMTUsMTggKzE1LDE1IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gdGhlIHJlcXVlc3RlZCBwYWRkaW5nIG1lY2hhbmlzbSBpcyBub3QKKyAqIHN1cHBvcnRlZC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKIApAQCAtMzYsMTYgKzMzLDIxIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1NzI4ODUyMDEyMDAxNzU0NjZMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIE5vU3VjaFBhZGRpbmdFeGNlcHRpb259LgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uKCkgewogICAgIH0KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9OdWxsQ2lwaGVyLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTnVsbENpcGhlci5qYXZhCmluZGV4IDM0YjNlODU3Li40OWY5NmMyIDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTnVsbENpcGhlci5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9OdWxsQ2lwaGVyLmphdmEKQEAgLTMwLDE0ICszMCwxNSBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGlkZW50aXR5IGNpcGhlciB0aGF0IGRvZXMgbm90IHRyYW5zZm9ybSB0aGUgaW5wdXQgZGF0YQorICogaW4gYW55IHdheS4gVGhlIDxpPmVuY3J5cHRlZDwvaT4gZGF0YSBpcyBpZGVudGljYWwgdG8gdGhlIDxpPnBsYWluIHRleHQ8L2k+LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE51bGxDaXBoZXIgZXh0ZW5kcyBDaXBoZXIgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBOdWxsQ2lwaGVyfSBpbnN0YW5jZS4KICAgICAgKi8KICAgICBwdWJsaWMgTnVsbENpcGhlcigpIHsKICAgICAgICAgc3VwZXIobmV3IE51bGxDaXBoZXJTcGkoKSwgbnVsbCwgbnVsbCk7CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2VhbGVkT2JqZWN0LmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2VhbGVkT2JqZWN0LmphdmEKaW5kZXggNjViNjBlNC4uNGU3MTQ1MyAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL1NlYWxlZE9iamVjdC5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9TZWFsZWRPYmplY3QuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKQEAgLTQwLDcgKzM1LDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIEEge0Bjb2RlIFNlYWxlZE9iamVjdH0gaXMgYSB3cmFwcGVyIGFyb3VuZCBhIHtAY29kZSBzZXJpYWxpemFibGV9IG9iamVjdAorICogaW5zdGFuY2UgYW5kIGVuY3J5cHRzIGl0IHVzaW5nIGEgY3J5cHRvZ3JhcGhpYyBjaXBoZXIuCisgKiA8cD4KKyAqIFNpbmNlIGEge0Bjb2RlIFNlYWxlZE9iamVjdH0gaW5zdGFuY2UgaXMgYSBzZXJpYWxpemFibGUgb2JqZWN0IGl0c2VsZiBpdCBjYW4KKyAqIGVpdGhlciBiZSBzdG9yZWQgb3IgdHJhbnNtaXR0ZWQgb3ZlciBhbiBpbnNlY3VyZSBjaGFubmVsLgorICogPC9wPgorICogVGhlIHdyYXBwZWQgb2JqZWN0IGNhbiBsYXRlciBiZSBkZWNyeXB0ZWQgKHVuc2VhbGVkKSB1c2luZyB0aGUgY29ycmVzcG9uZGluZworICoga2V5IGFuZCB0aGVuIGJlIGRlc2VyaWFsaXplZCB0byByZXRyaWV2ZSB0aGUgb3JpZ2luYWwgb2JqZWN0LlRoZSBzZWFsZWQKKyAqIG9iamVjdCBpdHNlbGYga2VlcHMgdHJhY2sgb2YgdGhlIGNpcGhlciBhbmQgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNlYWxlZE9iamVjdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTUxLDcgKzU2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NDgyODM4MjY1NTUxMzQ0NzUyTDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHtAbGluayBBbGdvcml0aG1QYXJhbWV0ZXJzfSBpbiBlbmNvZGVkIGZvcm1hdC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuY29kZWRQYXJhbXM7CiAgICAgcHJpdmF0ZSBieXRlW10gZW5jcnlwdGVkQ29udGVudDsKQEAgLTY3LDcgKzcyLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTZWFsZWRPYmplY3R9IGluc3RhbmNlIHdyYXBwaW5nIHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgICAgICogYW5kIHNlYWxpbmcgaXQgdXNpbmcgdGhlIHNwZWNpZmllZCBjaXBoZXIuCisgICAgICogPHA+CisgICAgICogVGhlIGNpcGhlciBtdXN0IGJlIGZ1bGx5IGluaXRpYWxpemVkLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYWwsIGNhbiBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaXBoZXIgdG8gZW5jcnlwdCB0aGUgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2VyaWFsaXphdGlvbiBmYWlscy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNpcGhlciBpcyBhIGJsb2NrIGNpcGhlciBhbmQgdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHRoZSBzZXJpYWxpemVkIGRhdGEgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGNpcGhlcnMgYmxvY2sKKyAgICAgKiAgICAgICAgICAgICBzaXplLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2lwaGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2VhbGVkT2JqZWN0KFNlcmlhbGl6YWJsZSBvYmplY3QsIENpcGhlciBjKQogICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiB7CkBAIC05Miw3ICsxMTUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNlYWxlZE9iamVjdH0gaW5zdGFuY2UgYnkgY29weWluZyB0aGUgZGF0YSBmcm9tCisgICAgICogdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIHNvCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvcHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNlYWxlZE9iamVjdChTZWFsZWRPYmplY3Qgc28pIHsKICAgICAgICAgaWYgKHNvID09IG51bGwpIHsKQEAgLTEwNSwxOCArMTMzLDQwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGdvcml0aG0gdGhpcyBvYmplY3Qgd2FzIHNlYWxlZCB3aXRoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFsZ29yaXRobSB0aGlzIG9iamVjdCB3YXMgc2VhbGVkIHdpdGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBzZWFsQWxnOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgd3JhcHBlZCBvYmplY3QsIGRlY3J5cHRpbmcgaXQgdXNpbmcgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBkYXRhIHdpdGguCisgICAgICogQHJldHVybiB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZGVzZXJpYWxpemF0aW9uIGZhaWxzLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhbGdvcml0aG0gdG8gZGVjcnlwdCB0aGUgZGF0YSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRPYmplY3QoS2V5IGtleSkKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJjcnlwdG8uMDUiKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2Uoc2VhbEFsZyk7CiAgICAgICAgICAgICBpZiAoKHBhcmFtc0FsZyAhPSBudWxsKSAmJiAocGFyYW1zQWxnLmxlbmd0aCgpICE9IDApKSB7CkBAIC0xNTUsNyArMjA1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIG9iamVjdCwgZGVjcnlwdGluZyBpdCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogY2lwaGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY2lwaGVyIHRvIGRlY3J5cHQgdGhlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZGVzZXJpYWxpemF0aW9uIGZhaWxzLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNpcGhlciBpcyBhIGJsb2NrIGNpcGhlciBhbmQgdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHRoZSBzZXJpYWxpemVkIGRhdGEgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGNpcGhlcnMgYmxvY2sKKyAgICAgKiAgICAgICAgICAgICBzaXplLgorICAgICAqIEB0aHJvd3MgQmFkUGFkZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYWRkaW5nIG9mIHRoZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBwYWRkaW5nIHNjaGVtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldE9iamVjdChDaXBoZXIgYykKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCkBAIC0xNzEsNyArMjM3LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIG9iamVjdCwgZGVjcnlwdGluZyBpdCB1c2luZyB0aGUgc3BlY2lmaWVkIGtleS4gVGhlCisgICAgICogc3BlY2lmaWVkIHByb3ZpZGVyIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNpcGhlciBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIGNpcGhlciBhbGdvcml0aG0uCisgICAgICogQHJldHVybiB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZGVzZXJpYWxpemF0aW9uIGZhaWxzLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhbGdvcml0aG0gdXNlZCB0byBkZWNyeXB0IHRoZSBkYXRhIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBjYW5ub3QgYmUgdXNlZCB0byBkZWNyeXB0IHRoZSBkYXRhLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0T2JqZWN0KEtleSBrZXksIFN0cmluZyBwcm92aWRlcikKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2VjcmV0S2V5LmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2VjcmV0S2V5LmphdmEKaW5kZXggM2MxMGNkYS4uMTAyZjg4OCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL1NlY3JldEtleS5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9TZWNyZXRLZXkuamF2YQpAQCAtMTUsMjUgKzE1LDMwIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0bzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBBIGNyeXB0b2dyYXBoaWMgc2VjcmV0IChzeW1tZXRyaWMpIGtleS4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgYSA8aT5tYXJrZXIgaW50ZXJmYWNlPC9pPiB0byBncm91cCBzZWNyZXQga2V5cyBhbmQgdG8KKyAqIHByb3ZpZGUgdHlwZSBzYWZldHkgZm9yLgorICogPC9wPgorICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGhhdmUgdG8gb3ZlcndyaXRlIHRoZQorICoge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KSBlcXVhbHN9IGFuZCB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlKCkgaGFzaENvZGV9CisgKiBmcm9tIHtAbGluayBqYXZhLmxhbmcuT2JqZWN0fSBzbyBjb21wYXJpc29uIGlzIGRvbmUgdXNpbmcgdGhlIGFjdHVhbCBrZXkgZGF0YQorICogYW5kIG5vdCB0aGUgb2JqZWN0IHJlZmVyZW5jZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgU2VjcmV0S2V5IGV4dGVuZHMgS2V5IHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBpZGVudGlmaWVyLgorICAgICAqIAogICAgICAqIEBzZXJpYWwKLSAgICAgKiAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDc5NTg3ODcwOTU5NTE0Njk1Mkw7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL1NlY3JldEtleUZhY3RvcnkuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9TZWNyZXRLZXlGYWN0b3J5LmphdmEKaW5kZXggYWRlYjQ1Ni4uYTQyMGRhYiAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL1NlY3JldEtleUZhY3RvcnkuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2VjcmV0S2V5RmFjdG9yeS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG87CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CkBAIC0zNSw4ICszMCwxOSBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBwdWJsaWMgQVBJIGZvciB7QGNvZGUgU2VjcmV0S2V5RmFjdG9yeX0gaW1wbGVtZW50YXRpb25zLgorICogPHA+CisgKiBTZWNyZXQga2V5IGZhY3RvcmllcyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25hbGl0eToKKyAqIDx1bD4KKyAqIDxsaT5jb252ZXJ0IHtAbGluayBTZWNyZXRLZXl9IG9iamVjdHMgdG8gYW5kIGZyb20ge0BsaW5rIEtleVNwZWN9IG9iamVjdHM8L2xpPgorICogPGxpPnRyYW5zbGF0ZSB7QGxpbmsgU2VjcmV0S2V5fSBvYmplY3RzIGZyb20gb25lIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHRvCisgKiBhbm90aGVyPC9saT4KKyAqIDwvdWw+CisgKiBXaGljaCBrZXkgc3BlY2lmaWNhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUge0BsaW5rICNnZW5lcmF0ZVNlY3JldH0gYW5kCisgKiB7QGxpbmsgI2dldEtleVNwZWN9IGlzIHByb3ZpZGVyIGRlcGVuZGVudC4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWNyZXRLZXlGYWN0b3J5IHsKIApAQCAtNTMsOCArNTksMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbGdvcml0aG07CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTZWNyZXRLZXlGYWN0b3J5fQorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlGYWNTcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBTUEkgZGVsZWdhdGUuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgcHJvdmlkaW5nIHRoaXMga2V5IGZhY3RvcnkuCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIGFsZ29yaXRobSBuYW1lIGZvciB0aGUgc2VjcmV0IGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU2VjcmV0S2V5RmFjdG9yeShTZWNyZXRLZXlGYWN0b3J5U3BpIGtleUZhY1NwaSwKICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyLCBTdHJpbmcgYWxnb3JpdGhtKSB7CkBAIC02NCwyNCArNzcsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzZWNyZXQga2V5IGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZWNyZXQga2V5IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBmb3IgdGhpcyB7QGNvZGUgU2VjcmV0S2V5RmFjdG9yeX0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgZm9yIHRoaXMge0Bjb2RlIFNlY3JldEtleUZhY3Rvcnl9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlciBnZXRQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNlY3JldEtleUZhY3Rvcnl9IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUga2V5IGFsZ29yaXRobS4KKyAgICAgKiBAcmV0dXJuIGEgc2VjcmV0IGtleSBmYWN0b3J5IGZvciB0aGUgc3BlY2lmaWVkIGtleSBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBpbnN0YWxsZWQgcHJvdmlkZXIgY2FuIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlY3JldEtleUZhY3RvcnkgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtOTYsOCArMTIyLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU2VjcmV0S2V5RmFjdG9yeX0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQga2V5CisgICAgICogYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCB7QGNvZGUgcHJvdmlkZXJ9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBrZXkgYWxnb3JpdGhtLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZAorICAgICAqICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gYSBzZWNyZXQga2V5IGZhY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGFsZ29yaXRobSBmcm9tIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGRvZXMgbm90IGV4aXN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBuYW1lIGlzIHtAY29kZSBudWxsfSBvciBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlY3JldEtleUZhY3RvcnkgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKQEAgLTExMyw4ICsxNTUsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTZWNyZXRLZXlGYWN0b3J5fSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkKKyAgICAgKiBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBrZXkgYWxnb3JpdGhtLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHJldHVybiBhIHNlY3JldCBrZXkgZmFjdG9yeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgYWxnb3JpdGhtIGZyb20gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGNhbm5vdCBwcm92aWRlciB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlzIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIG5hbWUgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VjcmV0S2V5RmFjdG9yeSBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTMyLDggKzE4OSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEdlbmVyYXRlIGEgc2VjcmV0IGtleSBmcm9tIHRoZSBzcGVjaWZpZWQga2V5IHNwZWNpZmljYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGtleVNwZWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgc2VjcmV0IGtleS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgc3BlY2lmaWNhdGlvbiBjYW5ub3QgYmUgdXNlZCB0byBnZW5lcmF0ZQorICAgICAqICAgICAgICAgICAgIGEgc2VjcmV0IGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU2VjcmV0S2V5IGdlbmVyYXRlU2VjcmV0KEtleVNwZWMga2V5U3BlYykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CkBAIC0xNDEsOCArMjA1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUga2V5IHNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZCBzZWNyZXQga2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNyZXQga2V5IHRvIGdldCB0aGUgc3BlY2lmaWNhdGlvbiBmcm9tLgorICAgICAqIEBwYXJhbSBrZXlTcGVjCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGtleSBzcGVjaWZpY2F0aW9uIGNsYXNzLgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBrZXkgc3BlY2lmaWNhdGlvbiBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBzZWNyZXQga2V5IGNhbm5vdCBiZSB0cmFuc2Zvcm1lZCBpbnRvIHRoZQorICAgICAqICAgICAgICAgICAgIHJlcXVlc3RlZCBrZXkgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgZmluYWwgS2V5U3BlYyBnZXRLZXlTcGVjKFNlY3JldEtleSBrZXksIENsYXNzIGtleVNwZWMpCkBAIC0xNTEsOCArMjI0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHNlY3JldCBrZXkgaW50byBhbiBpbnN0YW5jZSBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGtleSBmcm9tIHRoZSBwcm92aWRlciBvZiB0aGlzIGtleSBmYWN0b3J5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNyZXQga2V5IHRvIHRyYW5zbGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHRyYW5zbGF0ZWQga2V5LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSB0cmFuc2xhdGVkIHVzaW5nIHRoaXMga2V5CisgICAgICogICAgICAgICAgICAgZmFjdG9yeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU2VjcmV0S2V5IHRyYW5zbGF0ZUtleShTZWNyZXRLZXkga2V5KQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL1NlY3JldEtleUZhY3RvcnlTcGkuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9TZWNyZXRLZXlGYWN0b3J5U3BpLmphdmEKaW5kZXggZDcyZjZkNS4uZjgzNGRiYiAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL1NlY3JldEtleUZhY3RvcnlTcGkuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2VjcmV0S2V5RmFjdG9yeVNwaS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG87CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CkBAIC0yNywzNiArMjIsNjIgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYzsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIDxpPlNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlPC9pPiAoPGI+U1BJPC9iPikgZGVmaW5pdGlvbiBmb3IgdGhlIHtAY29kZQorICogU2VjcmV0S2V5RmFjdG9yeX0gY2xhc3MuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VjcmV0S2V5RmFjdG9yeVNwaSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTZWNyZXRLZXlGYWN0b3J5U3BpfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2VjcmV0S2V5RmFjdG9yeVNwaSgpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBHZW5lcmF0ZSBhIHNlY3JldCBrZXkgZnJvbSB0aGUgc3BlY2lmaWVkIGtleSBzcGVjaWZpY2F0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlTcGVjCisgICAgICogICAgICAgICAgICB0aGUga2V5IHNwZWNpZmljYXRpb24uCisgICAgICogQHJldHVybiBhIHNlY3JldCBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IHNwZWNpZmljYXRpb24gY2Fubm90IGJlIHVzZWQgdG8gZ2VuZXJhdGUKKyAgICAgKiAgICAgICAgICAgICBhIHNlY3JldCBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldChLZXlTcGVjIGtleVNwZWMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBrZXkgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHNlY3JldCBrZXkuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHNlY3JldCBrZXkgdG8gZ2V0IHRoZSBzcGVjaWZpY2F0aW9uIGZyb20uCisgICAgICogQHBhcmFtIGtleVNwZWMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQga2V5IHNwZWNpZmljYXRpb24gY2xhc3MuCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGtleSBzcGVjaWZpY2F0aW9uIGNsYXNzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHNlY3JldCBrZXkgY2Fubm90IGJlIHRyYW5zZm9ybWVkIGludG8gdGhlCisgICAgICogICAgICAgICAgICAgcmVxdWVzdGVkIGtleSBzcGVjaWZpY2F0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBLZXlTcGVjIGVuZ2luZUdldEtleVNwZWMoU2VjcmV0S2V5IGtleSwgQ2xhc3Mga2V5U3BlYykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFRyYW5zbGF0ZXMgdGhlIHNwZWNpZmllZCBzZWNyZXQga2V5IGludG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBrZXkgZnJvbSB0aGUgcHJvdmlkZXIgb2YgdGhpcyBrZXkgZmFjdG9yeS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgc2VjcmV0IGtleSB0byB0cmFuc2xhdGUuCisgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB0cmFuc2xhdGVkIGtleS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBjYW5ub3QgYmUgdHJhbnNsYXRlZCB1c2luZyB0aGlzIGtleQorICAgICAqICAgICAgICAgICAgIGZhY3RvcnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNlY3JldEtleSBlbmdpbmVUcmFuc2xhdGVLZXkoU2VjcmV0S2V5IGtleSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb24uamF2YQppbmRleCBkMWU0NGE4Li41OTNhMzFlIDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb24uamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb24uamF2YQpAQCAtMjUsOCArMjUsMTAgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIHRoZSByZXN1bHQgb2YgYW4gb3BlcmF0aW9uIGlzIGF0dGVtcHRlZCB0bworICogc3RvcmUgaW4gYSB1c2VyIHByb3ZpZGVkIGJ1ZmZlciB0aGF0IGlzIHRvbyBzbWFsbC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7CiAKQEAgLTM2LDE2ICszOCwyMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg0Mjc3MTg2NDA4MzI5NDM3NDdMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTaG9ydEJ1ZmZlckV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbWVzc2FnZQogICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2hvcnRCdWZmZXJFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2hvcnRCdWZmZXJFeGNlcHRpb259LgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbigpIHsKICAgICB9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESEtleS5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvREhLZXkuamF2YQppbmRleCBmMTI4MDMzLi5mNjg2ODQ0IDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESEtleS5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0RIS2V5LmphdmEKQEAgLTE1LDI0ICsxNSwyMSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG8uaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkRIUGFyYW1ldGVyU3BlYzsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSBmb3IgYSBEaWZmaWUtSGVsbG1hbiBrZXkuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERIS2V5IHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMga2V5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBESFBhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCk7CiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESFByaXZhdGVLZXkuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0RIUHJpdmF0ZUtleS5qYXZhCmluZGV4IDdlZGE3ZDQuLmQzOTI2OGIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0RIUHJpdmF0ZUtleS5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0RIUHJpdmF0ZUtleS5qYXZhCkBAIC0xNSwzMSArMTUsMjYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvLmludGVyZmFjZXM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcHJpdmF0ZSBrZXkgaW4gdGhlIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZSBwcm90b2NvbC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgREhQcml2YXRlS2V5IGV4dGVuZHMgREhLZXksIFByaXZhdGVLZXkgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiBAc2VyaWFsCisgICAgICogVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBpZGVudGlmaWVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjIxMTc5MTExMzM4MDM5NjU1M0w7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoaXMga2V5J3MgcHJpdmF0ZSB2YWx1ZSB4LgorICAgICAqIEByZXR1cm4gdGhpcyBrZXkncyBwcml2YXRlIHZhbHVlIHguCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0WCgpOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESFB1YmxpY0tleS5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvREhQdWJsaWNLZXkuamF2YQppbmRleCA0ZDNmYjZhLi43NTIwMWE3IDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESFB1YmxpY0tleS5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0RIUHVibGljS2V5LmphdmEKQEAgLTE1LDMxICsxNSwyNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG8uaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIGZvciBhIHB1YmxpYyBrZXkgaW4gdGhlIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZSBwcm90b2NvbC4gCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERIUHVibGljS2V5IGV4dGVuZHMgREhLZXksIFB1YmxpY0tleSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqIEBzZXJpYWwKKyAgICAgKiBUaGUgc2VyaWFsIHZlcnNpb24gaWRlbnRpZmllci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02NjI4MTAzNTYzMzUyNTE5MTkzTDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhpcyBrZXkncyBwdWJsaWMgdmFsdWUgWS4KKyAgICAgKiBAcmV0dXJuIHRoaXMga2V5J3MgcHVibGljIHZhbHVlIFkuCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0WSgpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL1BCRUtleS5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvUEJFS2V5LmphdmEKaW5kZXggOTkxYTRjMC4uNDYxMmFkMiAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvUEJFS2V5LmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvUEJFS2V5LmphdmEKQEAgLTE1LDQyICsxNSw0MCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG8uaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBpbnRlcmZhY2UgdG8gYSA8aT5wYXNzd29yZC1iYXNlZC1lbmNyeXB0aW9uPC9pPiAga2V5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBQQkVLZXkgZXh0ZW5kcyBTZWNyZXRLZXkgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiBAc2VyaWFsCisgICAgICogVGhlIHNlcmlhbCB2ZXJzaW9uIGlkZW50aWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTQzMDAxNTk5MzMwNDMzMzkyMUw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRpb24gY291bnQsIDAgaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRpb24gY291bnQsIDAgaWYgbm90IHNwZWNpZmllZC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEl0ZXJhdGlvbkNvdW50KCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgc2FsdCBkYXRhIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgc2FsdCBkYXRhIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZC4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldFNhbHQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgYSBjb3B5IHRvIHRoZSBwYXNzd29yZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29weSB0byB0aGUgcGFzc3dvcmQuCiAgICAgICovCiAgICAgcHVibGljIGNoYXJbXSBnZXRQYXNzd29yZCgpOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9wYWNrYWdlLmh0bWwgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9wYWNrYWdlLmh0bWwKaW5kZXggZTU4MTdkMS4uMDRhN2MwYiAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvcGFja2FnZS5odG1sCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL3BhY2thZ2UuaHRtbApAQCAtMSwxNiArMSwxMiBAQAogPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIj4KLTwvaGVhZD4KLTxodG1sPgotPGJvZHk+Ci08cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBEaWZmaWUtSGVsbG1hbiAoREgpCi1rZXkgYWdyZWVtZW50J3MgYWxnb3JpdGhtIGFzIHNwZWNpZmllZCBieSBQS0NTIzMuCisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIAorICAgICAgRGlmZmllLUhlbGxtYW4gKERIKSBrZXkgYWdyZWVtZW50J3MgYWxnb3JpdGhtIGFzIHNwZWNpZmllZCBieSBQS0NTIzMuCiAKLVRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgREggYWxnb3JpdGhtIG11c3QgYmUgYWNjZXNzZWQgd2l0aG91dCB1bmR1bHkgcmVzdHJpY3Rpb24gYXMgZm9yIGV4YW1wbGUKLWhhcmR3YXJlIHJlcG9zaXRvcnkgZm9yIHRoZSBwYXJhbWV0ZXJzIG1hdGVyaWFsLgotCi08L3A+Ci08L2JvZHk+CisgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIERIIGFsZ29yaXRobSBtdXN0IGJlIGFjY2Vzc2VkIHdpdGhvdXQgdW5kdWx5IAorICAgICAgcmVzdHJpY3Rpb24gYXMgZm9yIGV4YW1wbGUgaGFyZHdhcmUgcmVwb3NpdG9yeSBmb3IgdGhlIHBhcmFtZXRlcnMgbWF0ZXJpYWwuCisgICAgPC9wPgorICAgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+CiA8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3BhY2thZ2UuaHRtbCBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9wYWNrYWdlLmh0bWwKaW5kZXggMjBjMGM2My4uM2YzYmI0NyAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3BhY2thZ2UuaHRtbAorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vcGFja2FnZS5odG1sCkBAIC01LDE1ICs1LDE1IEBACiA8aHRtbD4KIDxib2R5PgogPHA+Ci1UaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgbmVlZGVkIHRvIGRlZmluZSBlbmNyeXB0aW9uIGFsZ29yaXRobSwKLWtleXMnIGFncmVlbWVudCBhbGdvcml0aG1zIGFuZCBNQUMgKE1lc3NhZ2UgQXV0aGVudGljYXRpb24gQ29kZSkuIFN0cmVhbSBjaXBoZXJzIGFyZSBzdXBwb3J0ZWQKLWFzIHdlbGwgYXMgYXN5bW1ldHJpYywgc3ltbWV0cmljLCBibG9jayBjaXBoZXJzLgotV2l0aCBjbGFzcyB7QGxpbmsgamF2YXguY3J5cHRvLlNlYWxlZE9iamVjdH0gYSBwcm9ncmFtbWVyIGNhbiBzZWN1cmUgYW4gb2JqZWN0IGJ5Ci1lbmNyeXB0aW5nIGl0IHdpdGggYSBzdXBwb3J0ZWQgY2lwaGVyLgotTm90IG9ubHkgTUFDIGJ1dCBhbHNvIEhNQUMgKEhhc2ggTUFDKSB3aXRoIHNoYS0xIGFyciBzdXBwb3J0ZWQuCi0KLUNpcGhlcnMnIGltcGxlbWVudGF0aW9ucyBmcm9tIGRpZmZlcmVudCBwcm92aWRlcnMgYWUgZWFzaWx5IGludGVncmF0ZWQgaW4gdGhlIHBhY2thZ2UgdGhhbmtzCi10byB0aGUgU1BJIChTZWN1cml0eSBQcm92aWRlciBJbnRlcmZhY2UpIGFic3RyYWN0IGNsYXNzZXMuCitUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgZm9yIGNyeXB0b2dyYXBoaWMgYXBwbGljYXRpb25zIGltcGxlbWVudGluZyBhbGdvcml0aG1zIGZvciBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLCBvcgora2V5IGFncmVlbWVudC4gCis8L3A+PHA+CitTdHJlYW0gY2lwaGVycyBhcmUgc3VwcG9ydGVkIGFzIHdlbGwgYXMgYXN5bW1ldHJpYywgc3ltbWV0cmljIGFuZCBibG9jayBjaXBoZXJzLiBDaXBoZXIgaW1wbGVtZW50YXRpb25zIGZyb20gZGlmZmVyZW50IHByb3ZpZGVycyBhcmUgZWFzaWx5IGludGVncmF0YWJsZSB0aGFua3MKK3RvIHRoZSBTUEkgKFNlY3VyaXR5IFByb3ZpZGVyIEludGVyZmFjZSkgYWJzdHJhY3QgY2xhc3Nlcy4gV2l0aCBjbGFzcyB7QGxpbmsgamF2YXguY3J5cHRvLlNlYWxlZE9iamVjdH0gYSBwcm9ncmFtbWVyIGNhbiBzZWN1cmUgYW4gb2JqZWN0IGJ5CitlbmNyeXB0aW5nIGl0IHdpdGggYSBjaXBoZXIuCis8L3A+PHA+CitBdXRoZW50aWNhdGlvbiBtYXkgYmUgYmFzZWQgb24gTUFDIChNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIENvZGUpIHN1Y2ggYXMgSE1BQyAoSGFzaCBNQUMsIGkuZS4gd2l0aCBhIFNIQS0xIGhhc2ggZnVuY3Rpb24pLgogPC9wPgorQHNpbmNlIEFuZHJvaWQgMS4wCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ERVNLZXlTcGVjLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ERVNLZXlTcGVjLmphdmEKaW5kZXggNjcxNjZhYi4uMmE5OTRkNSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvREVTS2V5U3BlYy5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RFU0tleVNwZWMuamF2YQpAQCAtMjMsMTIgKzIzLDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBrZXkgc3BlY2lmaWNhdGlvbiBmb3IgYSBERVMga2V5LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIERFU0tleVNwZWMgaW1wbGVtZW50cyBLZXlTcGVjIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIGxlbmd0aCBvZiBhIERFUyBrZXkgaW4gYnl0ZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTX0tFWV9MRU4gPSA4OwogCkBAIC05MiwxNCArOTQsMjkgQEAKICAgICAgICAgICAgICAgICB9OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRFU0tleVNwZWM8L2NvZGU+IGZyb20gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGtleSBkYXRhLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgZGF0YS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBzcGVjaWZpZWQga2V5IGRhdGEgaXMgbGVzcyB0aGFuIDguCiAgICAgICovCiAgICAgcHVibGljIERFU0tleVNwZWMoYnl0ZVtdIGtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewogICAgICAgICB0aGlzKGtleSwgMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRFU0tleVNwZWM8L2NvZGU+IGZyb20gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGtleSBkYXRhIHN0YXJ0aW5nIGF0IDxjb2RlPm9mZnNldDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBkYXRhCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0byBzdGFydCBhdC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBzcGVjaWZpZWQga2V5IGRhdGEgc3RhcnRpbmcgYXQgb2Zmc2V0IGlzCisgICAgICogICAgICAgICAgICAgbGVzcyB0aGFuIDguCiAgICAgICovCiAgICAgcHVibGljIERFU0tleVNwZWMoYnl0ZVtdIGtleSwgaW50IG9mZnNldCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CkBAIC0xMTUsNyArMTMyLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBrZXkuCisgICAgICogCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEtleSgpIHsKICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW0RFU19LRVlfTEVOXTsKQEAgLTEyNCw3ICsxNDMsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGtleSBkYXRhIHN0YXJ0aW5nIGF0IDxjb2RlPm9mZnNldDwvY29kZT4gaXMKKyAgICAgKiA8aT5wYXJpdHktYWRqdXN0ZWQ8L2k+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgZGF0YS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHN0YXJ0IGNoZWNraW5nIGF0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQga2V5IGRhdGEgaXMgcGFyaXR5LWFkanVzdGVkLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGRhdGEgc3RhcnRpbmcgYXQgb2Zmc2V0IGlzIGxlc3MgdGhhbgorICAgICAqICAgICAgICAgICAgIDgsIG9yIHRoZSBrZXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXJpdHlBZGp1c3RlZChieXRlW10ga2V5LCBpbnQgb2Zmc2V0KQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewpAQCAtMTUzLDcgKzE4MywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQga2V5IGRhdGEgc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcworICAgICAqIHdlYWsgb3Igc2VtaS13ZWFrLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgZGF0YS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHN0YXJ0IGNoZWNraW5nIGF0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQga2V5IGRhdGEgaXMgd2VhayBvciBzZW1pLXdlYWsuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGRhdGEgc3RhcnRpbmcgYXQgb2Zmc2V0IGlzIGxlc3MgdGhhbgorICAgICAqICAgICAgICAgICAgIDgsIG9yIGl0IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2VhayhieXRlW10ga2V5LCBpbnQgb2Zmc2V0KQogICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ERVNlZGVLZXlTcGVjLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ERVNlZGVLZXlTcGVjLmphdmEKaW5kZXggM2MwNDU0Ny4uMTg2ZjA3ZCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvREVTZWRlS2V5U3BlYy5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RFU2VkZUtleVNwZWMuamF2YQpAQCAtMTQsMTAgKzE0LDYgQEAKICAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KIAogcGFja2FnZSBqYXZheC5jcnlwdG8uc3BlYzsKIApAQCAtMjcsMTkgKzIzLDI5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBrZXkgc3BlY2lmaWNhdGlvbiBmb3IgYSB0cmlwbGUtREVTIChERVMtRURFKSBrZXkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgREVTZWRlS2V5U3BlYyBpbXBsZW1lbnRzIEtleVNwZWMgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIGEgREVTLUVERSBrZXkgaW4gYnl0ZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTX0VERV9LRVlfTEVOID0gMjQ7CiAKICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBrZXk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+REVTZWRlS2V5U3BlYzwvY29kZT4gaW5zdGFuY2UgZnJvbSB0aGUgZmlyc3QgMjQgKAorICAgICAqIHtAbGluayAjREVTX0VERV9LRVlfTEVOfSkgYnl0ZXMgb2YgdGhlIHNwZWNpZmllZCBrZXkgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IGRhdGEuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGRhdGEgaXMgbGVzcyB0aGFuIDI0LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGRhdGEgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgREVTZWRlS2V5U3BlYyhieXRlW10ga2V5KQogICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKQEAgLTU1LDcgKzYxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRFU2VkZUtleVNwZWM8L2NvZGU+IGluc3RhbmNlIGZyb20gdGhlIGZpcnN0IDI0ICgKKyAgICAgKiB7QGxpbmsgI0RFU19FREVfS0VZX0xFTn0gKSBieXRlcyBvZiB0aGUgc3BlY2lmaWVkIGtleSBkYXRhIHN0YXJ0aW5nIGF0CisgICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IGRhdGEKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHN0YXJ0IGF0LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsZW5ndGggb2YgdGhlIGtleSBkYXRhIHN0YXJ0aW5nIGF0IG9mZnNldCBpcyBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgICAyNC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBkYXRhIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIERFU2VkZUtleVNwZWMoYnl0ZVtdIGtleSwgaW50IG9mZnNldCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CkBAIC03MSw3ICs4OSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUga2V5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBrZXkuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRLZXkoKSB7CiAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZSBbREVTX0VERV9LRVlfTEVOXTsKQEAgLTgwLDcgKzEwMCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQga2V5IGRhdGEgc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcworICAgICAqIDxpPnBhcml0eS1hZGp1c3RlZDwvaT4uCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBkYXRhLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdG8gc3RhcnQgY2hlY2tpbmcgYXQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBrZXkgZGF0YSBpcyBwYXJpdHktYWRqdXN0ZWQsCisgICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgZGF0YSBzdGFydGluZyBhdCBvZmZzZXQgaXMgbGVzcyB0aGFuCisgICAgICogICAgICAgICAgICAgMjQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFyaXR5QWRqdXN0ZWQoYnl0ZVtdIGtleSwgaW50IG9mZnNldCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ESEdlblBhcmFtZXRlclNwZWMuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIR2VuUGFyYW1ldGVyU3BlYy5qYXZhCmluZGV4IDdiZWVhNGIuLmExNDkzMTggMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIR2VuUGFyYW1ldGVyU3BlYy5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIR2VuUGFyYW1ldGVyU3BlYy5qYXZhCkBAIC0xNSwxNyArMTUsMTUgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvLnNwZWM7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGFsZ29yaXRobSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiBmb3IgZ2VuZXJhdGluZyBEaWZmaWUtSGVsbG1hbgorICogcGFyYW1ldGVycyB1c2VkIGluIERpZmZpZS1IZWxsbWFuIGtleSBhZ3JlZW1lbnQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgREhHZW5QYXJhbWV0ZXJTcGVjIGltcGxlbWVudHMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyB7CiAKQEAgLTMzLDcgKzMxLDEzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXhwb25lbnRTaXplOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRIR2VuUGFyYW1ldGVyU3BlYzwvY29kZT4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJpbWVTaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgPGk+cHJpbWUgbW9kdWx1czwvaT4gaW4gYml0cy4KKyAgICAgKiBAcGFyYW0gZXhwb25lbnRTaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgPGk+cmFuZG9tIGV4cG9uZW50PC9pPiBpbiBiaXRzLgogICAgICAqLwogICAgIHB1YmxpYyBESEdlblBhcmFtZXRlclNwZWMoaW50IHByaW1lU2l6ZSwgaW50IGV4cG9uZW50U2l6ZSkgewogICAgICAgICB0aGlzLnByaW1lU2l6ZSA9IHByaW1lU2l6ZTsKQEAgLTQxLDE0ICs0NSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgPGk+cHJpbWUgbW9kdWx1czwvaT4gaW4gYml0cy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwcmltZSBtb2R1bHVzIGluIGJpdHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQcmltZVNpemUoKSB7CiAgICAgICAgIHJldHVybiBwcmltZVNpemU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSA8aT5yYW5kb20gZXhwb25lbnQ8L2k+IGluIGJpdHMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcmFuZG9tIGV4cG9uZW50IGluIGJpdHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRFeHBvbmVudFNpemUoKSB7CiAgICAgICAgIHJldHVybiBleHBvbmVudFNpemU7CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ESFBhcmFtZXRlclNwZWMuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIUGFyYW1ldGVyU3BlYy5qYXZhCmluZGV4IDAzMGNmY2IuLjliYjk0YjUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIUGFyYW1ldGVyU3BlYy5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIUGFyYW1ldGVyU3BlYy5qYXZhCkBAIC0xNSwxOCArMTUsMTUgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvLnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGFsZ29yaXRobSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIERpZmZpZS1IZWxsbWFuIGFsZ29yaXRobS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBESFBhcmFtZXRlclNwZWMgaW1wbGVtZW50cyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHsKIApAQCAtMzUsNyArMzIsMTMgQEAKICAgICBwcml2YXRlIGZpbmFsIGludCBsOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRIUGFyYW1ldGVyU3BlYzwvY29kZT4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogPGk+cHJpbWUgbW9kdWx1czwvaT4gYW5kIDxpPmJhc2UgZ2VuZXJhdG9yPC9pPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHByaW1lIG1vZHVsdXMuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYXNlIGdlbmVyYXRvci4KICAgICAgKi8KICAgICBwdWJsaWMgREhQYXJhbWV0ZXJTcGVjKEJpZ0ludGVnZXIgcCwgQmlnSW50ZWdlciBnKSB7CiAgICAgICAgIHRoaXMucCA9IHA7CkBAIC00NCw3ICs0NywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5ESFBhcmFtZXRlclNwZWM8L2NvZGU+IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIDxpPnByaW1lIG1vZHVsdXM8L2k+LCA8aT5iYXNlIGdlbmVyYXRvcjwvaT4gYW5kIHNpemUgKGluIGJpdHMpIG9mIHRoZQorICAgICAqIDxpPnJhbmRvbSBleHBvbmVudDwvaT4uCisgICAgICogCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltZSBtb2R1bHVzLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgYmFzZSBnZW5lcmF0b3IuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSByYW5kb20gZXhwb25lbnQgKGluIGJpdHMpLgogICAgICAqLwogICAgIHB1YmxpYyBESFBhcmFtZXRlclNwZWMoQmlnSW50ZWdlciBwLCBCaWdJbnRlZ2VyIGcsIGludCBsKSB7CiAgICAgICAgIHRoaXMucCA9IHA7CkBAIC01MywyMSArNjUsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIDxpPnByaW1lIG1vZHVsdXM8L2k+IG9mIHRoaXMgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUgbW9kdWx1cy4KICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQKCkgewogICAgICAgICByZXR1cm4gcDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIDxpPmJhc2UgZ2VuZXJhdG9yPC9pPiBvZiB0aGlzIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJhc2UgZ2VuZXJhdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEcoKSB7CiAgICAgICAgIHJldHVybiBnOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSAoaW4gYml0cykgb2YgdGhlIDxpPnJhbmRvbSBleHBvbmVudDwvaT4uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2l6ZSAoaW4gYml0cykgb2YgdGhlIHJhbmRvbSBleHBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEwoKSB7CiAgICAgICAgIHJldHVybiBsOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvREhQcml2YXRlS2V5U3BlYy5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvREhQcml2YXRlS2V5U3BlYy5qYXZhCmluZGV4IDcxMWQzYTcuLjY2NTJkZTggMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIUHJpdmF0ZUtleVNwZWMuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ESFByaXZhdGVLZXlTcGVjLmphdmEKQEAgLTE1LDE4ICsxNSwxNSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG8uc3BlYzsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUga2V5IHNwZWNpZmljYXRpb24gZm9yIGEgRGlmZmllLUhlbGxtYW4gcHJpdmF0ZSBrZXkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgREhQcml2YXRlS2V5U3BlYyBpbXBsZW1lbnRzIEtleVNwZWMgewogCkBAIC0zNSw3ICszMiwxNiBAQAogICAgIHByaXZhdGUgZmluYWwgQmlnSW50ZWdlciBnOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRIUHJpdmF0ZUtleVNwZWM8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCA8aT5wcml2YXRlCisgICAgICogdmFsdWU8L2k+IDxjb2RlPng8L2NvZGU+LiA8aT5wcmltZSBtb2R1bHVzPC9pPiA8Y29kZT5wPC9jb2RlPiBhbmQgPGk+YmFzZQorICAgICAqIGdlbmVyYXRvcjwvaT4gPGNvZGU+ZzwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIHZhbHVlLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgcHJpbWUgbW9kdWx1cy4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGJhc2UgZ2VuZXJhdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBESFByaXZhdGVLZXlTcGVjKEJpZ0ludGVnZXIgeCwgQmlnSW50ZWdlciBwLCBCaWdJbnRlZ2VyIGcpIHsKICAgICAgICAgdGhpcy54ID0geDsKQEAgLTQ0LDI0ICs1MCwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgPGk+cHJpdmF0ZSB2YWx1ZTwvaT4gPGNvZGU+eDwvY29kZT4uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSB2YWx1ZSA8Y29kZT54PC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRYKCkgewogICAgICAgICByZXR1cm4geDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIDxpPnByaW1lIG1vZHVsdXM8L2k+IDxjb2RlPnA8L2NvZGU+LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaW1lIG1vZHVsdXMgPGNvZGU+cDwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UCgpIHsKICAgICAgICAgcmV0dXJuIHA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSA8aT5iYXNlIGdlbmVyYXRvcjwvaT4gPGNvZGU+ZzwvY29kZT4uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYmFzZSBnZW5lcmF0b3IgPGNvZGU+ZzwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0RygpIHsKICAgICAgICAgcmV0dXJuIGc7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9ESFB1YmxpY0tleVNwZWMuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIUHVibGljS2V5U3BlYy5qYXZhCmluZGV4IGU4MzY0MGEuLjY4ZDMyNjcgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIUHVibGljS2V5U3BlYy5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL0RIUHVibGljS2V5U3BlYy5qYXZhCkBAIC0xNSwxOCArMTUsMTUgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvLnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYzsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGtleSBzcGVjaWZpY2F0aW9uIGZvciBhIERpZmZpZS1IZWxsbWFuIHB1YmxpYyBrZXkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgREhQdWJsaWNLZXlTcGVjIGltcGxlbWVudHMgS2V5U3BlYyB7CiAKQEAgLTM1LDcgKzMyLDE2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBCaWdJbnRlZ2VyIGc7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+REhQdWJsaWNLZXlTcGVjPC9jb2RlPiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8aT5wdWJsaWMgdmFsdWU8L2k+IDxjb2RlPnk8L2NvZGU+LCB0aGUgPGk+cHJpbWUgbW9kdWx1czwvaT4KKyAgICAgKiA8Y29kZT5wPC9jb2RlPiBhbmQgdGhlIDxpPmJhc2UgZ2VuZXJhdG9yPC9pPiA8Y29kZT5nPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHByaW1lIG1vZHVsdXMuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYXNlIGdlbmVyYXRvci4KICAgICAgKi8KICAgICBwdWJsaWMgREhQdWJsaWNLZXlTcGVjKEJpZ0ludGVnZXIgeSwgQmlnSW50ZWdlciBwLCBCaWdJbnRlZ2VyIGcpIHsKICAgICAgICAgdGhpcy55ID0geTsKQEAgLTQ0LDIxICs1MCwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgPGk+cHVibGljIHZhbHVlPC9pPiA8Y29kZT55PC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgdmFsdWUgPGNvZGU+eTwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0WSgpIHsKICAgICAgICAgcmV0dXJuIHk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSA8aT5wcmltZSBtb2R1bHVzPC9pPiA8Y29kZT5wPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltZSBtb2R1bHVzIDxjb2RlPnA8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFAoKSB7CiAgICAgICAgIHJldHVybiBwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgPGk+YmFzZSBnZW5lcmF0b3I8L2k+IDxjb2RlPmc8L2NvZGU+OworICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJhc2UgZ2VuZXJhdG9yIDxjb2RlPmc8L2NvZGU+OwogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEcoKSB7CiAgICAgICAgIHJldHVybiBnOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvSXZQYXJhbWV0ZXJTcGVjLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9JdlBhcmFtZXRlclNwZWMuamF2YQppbmRleCBiZDc3MDI5Li4yZjUzMmE4IDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9JdlBhcmFtZXRlclNwZWMuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9JdlBhcmFtZXRlclNwZWMuamF2YQpAQCAtMjYsMTQgKzI2LDIwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBhbGdvcml0aG0gcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gZm9yIGFuIDxpPmluaXRpYWxpemF0aW9uIHZlY3RvcjwvaT4uCiAgKi8KIHB1YmxpYyBjbGFzcyBJdlBhcmFtZXRlclNwZWMgaW1wbGVtZW50cyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHsKIAogICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGl2OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkl2UGFyYW1ldGVyU3BlYzwvY29kZT4gaW5zdGFuY2Ugd2l0aCB0aGUgYnl0ZXMgZnJvbQorICAgICAqIHRoZSBzcGVjaWZpZWQgYnVmZmVyIDxpPml2PC9pPiB1c2VkIGFzIDxpPmluaXRpYWxpemF0aW9uIHZlY3RvcjwvaT4uCisgICAgICogCisgICAgICogQHBhcmFtIGl2CisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHVzZWQgYXMgaW5pdGlhbGl6YXRpb24gdmVjdG9yLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBJdlBhcmFtZXRlclNwZWMoYnl0ZVtdIGl2KSB7CiAgICAgICAgIGlmIChpdiA9PSBudWxsKSB7CkBAIC00NCw3ICs1MCwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JdlBhcmFtZXRlclNwZWM8L2NvZGU+IGluc3RhbmNlIHdpdGggPGNvZGU+bGVuPC9jb2RlPgorICAgICAqIGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIgPGNvZGU+aXY8L2NvZGU+IHN0YXJ0aW5nIGF0CisgICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXYKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdXNlZCBhcyBpbml0aWFsaXphdGlvbiB2ZWN0b3IuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0byBzdGFydCBpbiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyBudWxsIG9yIDxjb2RlPm9mZnNldDwvY29kZT4gYW5kCisgICAgICogICAgICAgICAgICAgPGNvZGU+bGVuPC9jb2RlPiBkbyBub3Qgc3BlY2lmeSBhIHZhbGlkIGNodW5rIGluIHRoZQorICAgICAqICAgICAgICAgICAgIHNwZWNpZmllZCBidWZmZXIuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gYXJlIG5lZ2F0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBJdlBhcmFtZXRlclNwZWMoYnl0ZVtdIGl2LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CiAgICAgICAgIGlmICgoaXYgPT0gbnVsbCkgfHwgKGl2Lmxlbmd0aCAtIG9mZnNldCA8IGxlbikpIHsKQEAgLTU5LDcgKzgwLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSA8aT5pbml0aWFsaXphdGlvbiB2ZWN0b3I8L2k+IGRhdGEuCisgICAgICogCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0SVYoKSB7CiAgICAgICAgIGJ5dGVbXSByZXMgPSBuZXcgYnl0ZVtpdi5sZW5ndGhdOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvT0FFUFBhcmFtZXRlclNwZWMuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL09BRVBQYXJhbWV0ZXJTcGVjLmphdmEKaW5kZXggYTYyNWNiMS4uZWJiNmNjZSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvT0FFUFBhcmFtZXRlclNwZWMuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9PQUVQUGFyYW1ldGVyU3BlYy5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG8uc3BlYzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5NR0YxUGFyYW1ldGVyU3BlYzsKQEAgLTI3LDcgKzIyLDEyIEBACiBpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUFNvdXJjZTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGFsZ29yaXRobSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIDxpPk9BRVAgUGFkZGluZzwvaT4gYWxnb3JpdGhtLgorICogPHA+CisgKiBUaGlzIHBhZGRpbmcgYWxnb3JpdGhtIGlzIGRlZmluZWQgaW4gdGhlIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzNDQ3LnR4dCI+UEtDUyAjMTwvYT4gc3RhbmRhcmQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgT0FFUFBhcmFtZXRlclNwZWMgaW1wbGVtZW50cyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHsKIApAQCAtMzcsNyArMzcsMTQgQEAKICAgICBwcml2YXRlIGZpbmFsIFBTb3VyY2UgcFNyYzsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIGFsZ29yaXRobSBwYXJhbWV0ZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCB1c2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICAgKiA8dWw+PGxpPm1lc3NhZ2UgZGlnZXN0IDogPGNvZGU+IlNIQS0xIjwvY29kZT48L2xpPgorICAgICAqIDxsaT5tYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gKDxpPm1nZjwvaT4pIDogPGNvZGU+Ik1HRjEiPC9jb2RlPjwvbGk+CisgICAgICogPGxpPnBhcmFtZXRlcnMgZm9yIHRoZSA8aT5tZ2Y8L2k+IDogIlNIQS0xIiB7QGxpbmsgTUdGMVBhcmFtZXRlclNwZWMjU0hBMX08L2xpPgorICAgICAqIDxsaT50aGUgc291cmNlIG9mIHRoZSBsYWJlbCA8Y29kZT5MPC9jb2RlPjoge0BsaW5rIFBTb3VyY2UuUFNwZWNpZmllZCNERUZBVUxUfTwvbGk+CisgICAgICogPC91bD4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9BRVBQYXJhbWV0ZXJTcGVjIERFRkFVTFQgPSBuZXcgT0FFUFBhcmFtZXRlclNwZWMoKTsKIApAQCAtNDksNyArNTYsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T0FFUFBhcmFtZXRlclNwZWM8L2NvZGU+IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIDxpPm1lc3NhZ2UgZGlnZXN0PC9pPiBhbGdvcml0aG0gbmFtZSwgPGk+bWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uPC9pPgorICAgICAqICg8aT5tZ2Y8L2k+KSBhbGdvcml0aG0gbmFtZSwgPGk+cGFyYW1ldGVyczwvaT4gZm9yIHRoZSA8aT5tZ2Y8L2k+CisgICAgICogYWxnb3JpdGhtIGFuZCB0aGUgPGk+c291cmNlIG9mIHRoZSBsYWJlbCA8Y29kZT5MPC9jb2RlPjwvaT4uCisgICAgICogCisgICAgICogQHBhcmFtIG1kTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBwYXJhbSBtZ2ZOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBwYXJhbSBtZ2ZTcGVjCisgICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uIGZvciB0aGUgbWFzayBnZW5lcmF0aW9uCisgICAgICogICAgICAgICAgICBmdW5jdGlvbiBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIHBTcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIGxhYmVsIDxjb2RlPkw8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgPGNvZGU+bWROYW1lPC9jb2RlPiwgPGNvZGU+bWdmTmFtZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5wU3JjPC9jb2RlPiBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBPQUVQUGFyYW1ldGVyU3BlYyhTdHJpbmcgbWROYW1lLCBTdHJpbmcgbWdmTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBtZ2ZTcGVjLCBQU291cmNlIHBTcmMpIHsKQEAgLTYzLDI4ICs4NiwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgYWxnb3JpdGhtIG5hbWUgb2YgdGhlIDxpPm1lc3NhZ2UgZGlnZXN0PC9pPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhbGdvcml0aG0gbmFtZSBvZiB0aGUgbWVzc2FnZSBkaWdlc3QuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXREaWdlc3RBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBtZE5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGdvcml0aG0gbmFtZSBvZiB0aGUgPGk+bWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uPC9pPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhbGdvcml0aG0gbmFtZSBvZiB0aGUgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TUdGQWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gbWdmTmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGFsZ29yaXRobSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIG1hc2sgZ2VuZXJhdGlvbgorICAgICAqIGZ1bmN0aW9uIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhbGdvcml0aG0gcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gZm9yIHRoZSBtYXNrIGdlbmVyYXRpb24KKyAgICAgKiAgICAgICAgIGZ1bmN0aW9uIGFsZ29yaXRobS4KICAgICAgKi8KICAgICBwdWJsaWMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBnZXRNR0ZQYXJhbWV0ZXJzKCkgewogICAgICAgICByZXR1cm4gbWdmU3BlYzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBvZiB0aGUgbGFiZWwgPGNvZGU+TDwvY29kZT4uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBsYWJlbCA8Y29kZT5MPC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgUFNvdXJjZSBnZXRQU291cmNlKCkgewogICAgICAgICByZXR1cm4gcFNyYzsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1BCRUtleVNwZWMuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1BCRUtleVNwZWMuamF2YQppbmRleCA4MGUzNDBlLi5jNDY2MTdlIDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9QQkVLZXlTcGVjLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvUEJFS2V5U3BlYy5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG8uc3BlYzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOwpAQCAtMjgsNyArMjMsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGtleSBzcGVjaWZpY2F0aW9uIGZvciBhIDxpPnBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb248L2k+IGtleS4KKyAqIDxwPgorICogUGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBpcyBkZXNjcmliZWQgaW4gPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI4OTgudHh0Ij5QS0NTICM1PC9hPi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQQkVLZXlTcGVjIGltcGxlbWVudHMgS2V5U3BlYyB7CiAKQEAgLTM4LDcgKzM4LDEwIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQga2V5TGVuZ3RoOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBCRUtleVNwZWM8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCBwYXNzd29yZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXNzd29yZC4KICAgICAgKi8KICAgICBwdWJsaWMgUEJFS2V5U3BlYyhjaGFyW10gcGFzc3dvcmQpIHsKICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpIHsKQEAgLTUzLDcgKzU2LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBCRUtleVNwZWM8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCBwYXNzd29yZCwgc2FsdCwKKyAgICAgKiBpdGVyYXRpb24gY291bnQgYW5kIHRoZSBkZXNpcmVkIGxlbmd0aCBvZiB0aGUgZGVyaXZlZCBrZXkuCisgICAgICogCisgICAgICogQHBhcmFtIHBhc3N3b3JkCisgICAgICogICAgICAgICAgICB0aGUgcGFzc3dvcmQuCisgICAgICogQHBhcmFtIHNhbHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzYWx0LgorICAgICAqIEBwYXJhbSBpdGVyYXRpb25Db3VudAorICAgICAqICAgICAgICAgICAgdGhlIGl0ZXJhdGlvbiBjb3VudC4KKyAgICAgKiBAcGFyYW0ga2V5TGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgZGVzaXJlZCBrZXkgbGVuZ3RoIG9mIHRoZSBkZXJpdmVkIGtleSwKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNhbHQgaXMgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzYWx0IGlzIGVtcHR5LCBpdGVyYXRpb24gY291bnQgaXMgemVybyBvciBuZWdhdGl2ZSBvcgorICAgICAqICAgICAgICAgICAgIHRoZSBrZXkgbGVuZ3RoIGlzIHplcm8gb3IgbmVnYXRpdmUuCiAgICAgICovCiAgICAgcHVibGljIFBCRUtleVNwZWMoY2hhcltdIHBhc3N3b3JkLCBieXRlW10gc2FsdCwgaW50IGl0ZXJhdGlvbkNvdW50LAogICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlMZW5ndGgpIHsKQEAgLTg0LDcgKzEwMiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QQkVLZXlTcGVjPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQgcGFzc3dvcmQsIHNhbHQKKyAgICAgKiBhbmQgaXRlcmF0aW9uIGNvdW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkLgorICAgICAqIEBwYXJhbSBzYWx0CisgICAgICogICAgICAgICAgICB0aGUgc2FsdC4KKyAgICAgKiBAcGFyYW0gaXRlcmF0aW9uQ291bnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpdGVyYXRpb24gY291bnQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHNhbHQgaXMgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzYWx0IGlzIGVtcHR5IG9yIGl0ZXJhdGlvbiBjb3VudCBpcyB6ZXJvIG9yIG5lZ2F0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBQQkVLZXlTcGVjKGNoYXJbXSBwYXNzd29yZCwgYnl0ZVtdIHNhbHQsIGludCBpdGVyYXRpb25Db3VudCkgewogICAgICAgICBpZiAoc2FsdCA9PSBudWxsKSB7CkBAIC0xMTEsNyArMTQxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsZWFycyB0aGUgcGFzc3dvcmQgYnkgb3ZlcndyaXRpbmcgaXQuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXJQYXNzd29yZCgpIHsKICAgICAgICAgQXJyYXlzLmZpbGwocGFzc3dvcmQsICc/Jyk7CkBAIC0xMTksNyArMTQ5LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgcGFzc3dvcmQgb2YgdGhpcyBrZXkgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgcGFzc3dvcmQgb2YgdGhpcyBrZXkgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXNzd29yZCBoYXMgYmVlbiBjbGVhcmVkIGJlZm9yZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgY2hhcltdIGdldFBhc3N3b3JkKCkgewogICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkgewpAQCAtMTMxLDcgKzE2NSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIHNhbHQgb2YgdGhpcyBrZXkgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgc2FsdCBvZiB0aGlzIGtleSBzcGVjaWZpY2F0aW9uIG9yIG51bGwgaWYgbm9uZSBpcworICAgICAqICAgICAgICAgc3BlY2lmaWVkLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZ2V0U2FsdCgpIHsKICAgICAgICAgaWYgKHNhbHQgPT0gbnVsbCkgewpAQCAtMTQzLDE0ICsxODAsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGl0ZXJhdGlvbiBjb3VudCBvZiB0aGlzIGtleSBzcGVjaWZpY2F0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdGlvbiBjb3VudCBvZiB0aGlzIGtleSBzcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SXRlcmF0aW9uQ291bnQoKSB7CiAgICAgICAgIHJldHVybiBpdGVyYXRpb25Db3VudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGRlc2lyZWQga2V5IGxlbmd0aCBvZiB0aGUgZGVyaXZlZCBrZXkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZGVzaXJlZCBrZXkgbGVuZ3RoIG9mIHRoZSBkZXJpdmVkIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldEtleUxlbmd0aCgpIHsKICAgICAgICAgcmV0dXJuIGtleUxlbmd0aDsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1BCRVBhcmFtZXRlclNwZWMuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1BCRVBhcmFtZXRlclNwZWMuamF2YQppbmRleCA2ZTIyMGI4Li4xOTA5ODZlIDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9QQkVQYXJhbWV0ZXJTcGVjLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvUEJFUGFyYW1ldGVyU3BlYy5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5jcnlwdG8uc3BlYzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwpAQCAtMjcsNyArMjIsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGFsZ29yaXRobSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiBmb3IgYSA8aT5wYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uPC9pPgorICogYWxnb3JpdGhtLiAKKyAqIDxwPgorICogUGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBpcyBkZXNjcmliZWQgaW4gPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI4OTgudHh0Ij5QS0NTICM1PC9hPi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKgogICovCiBwdWJsaWMgY2xhc3MgUEJFUGFyYW1ldGVyU3BlYyBpbXBsZW1lbnRzIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgewogCkBAIC0zNSw3ICszNywxNSBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IGl0ZXJhdGlvbkNvdW50OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBCRVBhcmFtZXRlclNwZWM8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCBzYWx0IGFuZAorICAgICAqIGl0ZXJhdGlvbiBjb3VudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2FsdAorICAgICAqICAgICAgICAgICAgdGhlIHNhbHQuCisgICAgICogQHBhcmFtIGl0ZXJhdGlvbkNvdW50CisgICAgICogICAgICAgICAgICB0aGUgaXRlcmF0aW9uIGNvdW50LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBzYWx0IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIFBCRVBhcmFtZXRlclNwZWMoYnl0ZVtdIHNhbHQsIGludCBpdGVyYXRpb25Db3VudCkgewogICAgICAgICBpZiAoc2FsdCA9PSBudWxsKSB7CkBAIC00Nyw3ICs1Nyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgY29weSB0byB0aGUgc2FsdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29weSB0byB0aGUgc2FsdC4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldFNhbHQoKSB7CiAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtzYWx0Lmxlbmd0aF07CkBAIC01Niw3ICs2OCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRpb24gY291bnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaXRlcmF0aW9uIGNvdW50LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uQ291bnQoKSB7CiAgICAgICAgIHJldHVybiBpdGVyYXRpb25Db3VudDsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1BTb3VyY2UuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1BTb3VyY2UuamF2YQppbmRleCBlODNiNDIzLi5kNWJkZjFiIDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9QU291cmNlLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvUFNvdXJjZS5qYXZhCkBAIC0xNSwxNyArMTUsMTUgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvLnNwZWM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHNvdXJjZSBvZiB0aGUgbGFiZWwgPGNvZGU+TDwvY29kZT4gYXMgc3BlY2lmaWVkIGluIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzNDQ3LnR4dCI+IFBLQ1MgIzE8L2E+LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBTb3VyY2UgewogCkBAIC0zNCw3ICszMiwxMyBAQAogICAgIHByaXZhdGUgUFNvdXJjZSgpIHt9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UFNvdXJjZTwvY29kZT4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQorICAgICAqIGFsZ29yaXRobSBpZGVudGlmaWVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwU3JjTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBhbGdvcml0aG0gaWRlbnRpZmllci4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcFNyY05hbWUgaXMgbnVsbC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUFNvdXJjZShTdHJpbmcgcFNyY05hbWUpIHsKICAgICAgICAgaWYgKHBTcmNOYW1lID09IG51bGwpIHsKQEAgLTQ0LDIxICs0OCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc291cmNlIGFsZ29yaXRobSBpZGVudGlmaWVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBhbGdvcml0aG0gaWRlbnRpZmllci4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIHBTcmNOYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIGV4cGxpY2l0IHNwZWNpZmljYXRpb24gb2YgdGhlIHBhcmFtZXRlciA8Y29kZT5QPC9jb2RlPiB1c2VkIGluIHRoZQorICAgICAqIHNvdXJjZSBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQU3BlY2lmaWVkIGV4dGVuZHMgUFNvdXJjZSB7CiAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gcDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgICAgICogVGhlIGluc3RhbmNlIG9mIDxjb2RlPlBTcGVjaWZpZWQ8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgPGNvZGU+Ynl0ZVswXTwvY29kZT4gZm9yIDxjb2RlPlA8L2NvZGU+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBTcGVjaWZpZWQgREVGQVVMVCA9IG5ldyBQU3BlY2lmaWVkKCk7CiAKQEAgLTY4LDcgKzc3LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5QU3BlY2lmaWVkPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICogcGFyYW1ldGVyIDxjb2RlPlA8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHAKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIDxjb2RlPlA8L2NvZGU+LgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnA8L2NvZGU+IGlzIG51bGwuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgUFNwZWNpZmllZChieXRlW10gcCkgewogICAgICAgICAgICAgc3VwZXIoIlBTcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJApAQCAtODIsNyArOTcsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIDxjb2RlPlA8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgPGNvZGU+UDwvY29kZT4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0VmFsdWUoKSB7CiAgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbcC5sZW5ndGhdOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvUkMyUGFyYW1ldGVyU3BlYy5qYXZhIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvUkMyUGFyYW1ldGVyU3BlYy5qYXZhCmluZGV4IDZhMjQ5NjQuLmJkNzZjZjQgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1JDMlBhcmFtZXRlclNwZWMuamF2YQorKysgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9SQzJQYXJhbWV0ZXJTcGVjLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4LmNyeXB0by5zcGVjOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CkBAIC0yOCw3ICsyMywxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8uaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgYWxnb3JpdGhtIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uIGZvciB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIyNjgudHh0Ij5SQzI8L2E+IGFsZ29yaXRobS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSQzJQYXJhbWV0ZXJTcGVjIGltcGxlbWVudHMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyB7CiAKQEAgLTM2LDcgKzM0LDExIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaXY7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UkMyUGFyYW1ldGVyU3BlYzwvY29kZT4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogZWZmZWN0aXZlIGtleSBsZW5ndGggKGluIGJpdHMpLAorICAgICAqIAorICAgICAqIEBwYXJhbSBlZmZlY3RpdmVLZXlCaXRzCisgICAgICogICAgICAgICAgICB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGggKGluIGJpdHMpLgogICAgICAqLwogICAgIHB1YmxpYyBSQzJQYXJhbWV0ZXJTcGVjKGludCBlZmZlY3RpdmVLZXlCaXRzKSB7CiAgICAgICAgIHRoaXMuZWZmZWN0aXZlS2V5Qml0cyA9IGVmZmVjdGl2ZUtleUJpdHM7CkBAIC00NCw3ICs0NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SQzJQYXJhbWV0ZXJTcGVjPC9jb2RlPiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBlZmZlY3RpdmUga2V5IGxlbmd0aCAoaW4gYml0cykgYW5kIDxpPmluaXRpYWxpemF0aW9uIHZlY3RvcjwvaT4uCisgICAgICogPHA+CisgICAgICogVGhlIHNpemUgb2YgdGhlIDxpPmluaXRpYWxpemF0aW9uIHZlY3RvcjwvaT4gbXVzdCBiZSBhdCBsZWFzdCA4IGJ5dGVzCisgICAgICogd2hpY2ggYXJlIGNvcGllZCB0byBwcm90ZWN0IHRoZW0gYWdhaW5zdCBtb2RpZmljYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGVmZmVjdGl2ZUtleUJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBlZmZlY3RpdmUga2V5IGxlbmd0aCAoaW4gYml0cykuCisgICAgICogQHBhcmFtIGl2CisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBpcyBudWxsIG9yIHNob3J0ZXIgdGhhbiA4IGJ5dGVzLgogICAgICAqLwogICAgIHB1YmxpYyBSQzJQYXJhbWV0ZXJTcGVjKGludCBlZmZlY3RpdmVLZXlCaXRzLCBieXRlW10gaXYpIHsKICAgICAgICAgaWYgKGl2ID09IG51bGwpIHsKQEAgLTU5LDcgKzcyLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJDMlBhcmFtZXRlclNwZWM8L2NvZGU+IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIChpbiBiaXRzKSBhbmQgPGk+aW5pdGlhbGl6YXRpb24gdmVjdG9yPGk+LgorICAgICAqIDxwPgorICAgICAqIFRoZSBzaXplIG9mIHRoZSA8aT5pbml0aWFsaXphdGlvbiB2ZWN0b3I8L2k+IHN0YXJ0aW5nIGF0CisgICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPiBtdXN0IGJlIGF0IGxlYXN0IDggYnl0ZXMgd2hpY2ggYXJlIGNvcGllZCB0byBwcm90ZWN0CisgICAgICogdGhlbSBhZ2FpbnN0IG1vZGlmaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWZmZWN0aXZlS2V5Qml0cworICAgICAqICAgICAgICAgICAgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIChpbiBiaXRzKS4KKyAgICAgKiBAcGFyYW0gaXYKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHRvIHN0YXJ0IGF0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBpcyBudWxsIG9yIHN0YXJ0aW5nIGF0CisgICAgICogICAgICAgICAgICAgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyBzaG9ydGVyIHRoYW4gOCBieXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgUkMyUGFyYW1ldGVyU3BlYyhpbnQgZWZmZWN0aXZlS2V5Qml0cywgYnl0ZVtdIGl2LCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIGlmIChpdiA9PSBudWxsKSB7CkBAIC03NCwxNCArMTAyLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBlZmZlY3RpdmUga2V5IGxlbmd0aCAoaW4gYml0cykuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGggKGluIGJpdHMpLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RWZmZWN0aXZlS2V5Qml0cygpIHsKICAgICAgICAgcmV0dXJuIGVmZmVjdGl2ZUtleUJpdHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IsIG9yIG51bGwgaWYgbm9uZSBzcGVjaWZpZWQuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRJVigpIHsKICAgICAgICAgaWYgKGl2ID09IG51bGwpIHsKQEAgLTkzLDcgKzEyNSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyA8Y29kZT5SQzJQYXJhbWV0ZXJTcGVjPC9jb2RlPgorICAgICAqIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIGFuZCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIG9mCisgICAgICogICAgICAgICBib3RoIG9iamVjdHMgYXJlIGVxdWFsLCBvdGhlcndpc2UgZmFsc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKQEAgLTEwOSw3ICsxNDcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIG9mIHRoaXMgPGNvZGU+UkMyUGFyYW1ldGVyU3BlYzwvY29kZT4gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9SQzVQYXJhbWV0ZXJTcGVjLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9SQzVQYXJhbWV0ZXJTcGVjLmphdmEKaW5kZXggYjRhN2ZjYy4uZjcxMWY0MSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvUkM1UGFyYW1ldGVyU3BlYy5qYXZhCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1JDNVBhcmFtZXRlclNwZWMuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguY3J5cHRvLnNwZWM7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKQEAgLTI4LDcgKzIzLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBhbGdvcml0aG0gcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gZm9yIHRoZSA8YQorICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0MC50eHQiPlJDNTwvYT4gYWxnb3JpdGhtLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJDNVBhcmFtZXRlclNwZWMgaW1wbGVtZW50cyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHsKIApAQCAtMzgsNyArMzYsMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpdjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SQzVQYXJhbWV0ZXJTcGVjPC9jb2RlPiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB2ZXJzaW9uLCByb3VuZCBjb3VudCBhbiB3b3JkIHNpemUgKGluIGJpdHMpLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gcm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgcm91bmQgY291bnQuCisgICAgICogQHBhcmFtIHdvcmRTaXplCisgICAgICogICAgICAgICAgICB0aGUgd29yZCBzaXplIChpbiBiaXRzKS4KICAgICAgKi8KICAgICBwdWJsaWMgUkM1UGFyYW1ldGVyU3BlYyhpbnQgdmVyc2lvbiwgaW50IHJvdW5kcywgaW50IHdvcmRTaXplKSB7CiAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CkBAIC00OCw3ICs1NCwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SQzVQYXJhbWV0ZXJTcGVjPC9jb2RlPiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB2ZXJzaW9uLCByb3VuZCBjb3VudCwgd29yZCBzaXplIChpbiBiaXRzKSBhbmQgYW4gPGk+aW5pdGlhbGl6YXRpb24KKyAgICAgKiB2ZWN0b3I8L2k+LgorICAgICAqIDxwPgorICAgICAqIFRoZSBzaXplIG9mIHRoZSA8aT5pbml0aWFsaXphdGlvbiB2ZWN0b3I8L2k+IG11c3QgYmUgYXQgbGVhc3QKKyAgICAgKiA8Y29kZT4yICogKHdvcmRTaXplIC8gOCk8L2NvZGU+IGJ5dGVzIHdoaWNoIGFyZSBjb3BpZWQgdG8gcHJvdGVjdCB0aGVtCisgICAgICogYWdhaW5zdCBtb2RpZmljYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSByb3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByb3VuZCBjb3VudC4KKyAgICAgKiBAcGFyYW0gd29yZFNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSB3b3JkIHNpemUgKGluIGJpdHMpLgorICAgICAqIEBwYXJhbSBpdgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWxpemF0aW9uIHZlY3Rvci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgaXMgbnVsbCBvciBzaG9ydGVyIHRoYW4gPGNvZGU+MgorICAgICAqICAgICAgICAgICAgICogKHdvcmRTaXplIC8gOCk8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyBSQzVQYXJhbWV0ZXJTcGVjKGludCB2ZXJzaW9uLCBpbnQgcm91bmRzLCBpbnQgd29yZFNpemUsIGJ5dGVbXSBpdikgewogICAgICAgICBpZiAoaXYgPT0gbnVsbCkgewpAQCAtNjYsNyArOTAsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UkM1UGFyYW1ldGVyU3BlYzwvY29kZT4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogdmVyc2lvbiwgcm91bmQgY291bnQsIHdvcmRTaXplIChpbiBiaXRzKSwgYW4gPGk+aW5pdGlhbGl6YXRpb24gdmVjdG9yPC9pPgorICAgICAqIGFuZCBhbiBvZmZzZXQuCisgICAgICogPHA+CisgICAgICogVGhlIHNpemUgb2YgdGhlIDxpPmluaXRpYWxpemF0aW9uIHZlY3RvcjwvaT4gbXVzdCBiZSBhdCBsZWFzdAorICAgICAqIDxjb2RlPm9mZnNldCArICgyICogKHdvcmRTaXplIC8gOCkpPC9jb2RlPiBieXRlcy4gVGhlIGJ5dGVzIHN0YXJ0aW5nIGF0CisgICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPiBhcmUgY29waWVkIHRvIHByb3RlY3QgdGhlbSBhZ2FpbnN0IG1vZGlmaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24uCisgICAgICogQHBhcmFtIHJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIHJvdW5kIGNvdW50LgorICAgICAqIEBwYXJhbSB3b3JkU2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHdvcmQgc2l6ZSAoaW4gYml0cykuCisgICAgICogQHBhcmFtIGl2CisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGluaXRpYWxpemF0aW9uIHZlY3Rvci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgaXMgbnVsbCBvZiBzaG9ydGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5vZmZzZXQgKyAoMiAqICh3b3JkU2l6ZSAvIDgpKTwvY29kZT4uCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIG5lZ2F0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBSQzVQYXJhbWV0ZXJTcGVjKGludCB2ZXJzaW9uLCBpbnQgcm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29yZFNpemUsIGJ5dGVbXSBpdiwgaW50IG9mZnNldCkgewpAQCAtODgsMjggKzEzNCwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgdmVyc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKICAgICAgICAgcmV0dXJuIHZlcnNpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSByb3VuZCBjb3VudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByb3VuZCBjb3VudC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFJvdW5kcygpIHsKICAgICAgICAgcmV0dXJuIHJvdW5kczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHdvcmQgc2l6ZSAoaW4gYml0cykuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgd29yZCBzaXplIChpbiBiaXRzKS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFdvcmRTaXplKCkgewogICAgICAgICByZXR1cm4gd29yZFNpemU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IsIG9yIG51bGwgaWYgbm9uZSBzcGVjaWZpZWQuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRJVigpIHsKICAgICAgICAgaWYgKGl2ID09IG51bGwpIHsKQEAgLTEyMSw3ICsxNzUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyA8Y29kZT5SQzVQYXJhbWV0ZXJTcGVjPC9jb2RlPgorICAgICAqIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmVyc2lvbiwgcm91bmQgY291bnQsIHdvcmQgc2l6ZSBhbmQgaW5pdGlhbGl6YWlvbiB2ZWN0b3IKKyAgICAgKiAgICAgICAgIG9mIGJvdGggb2JqZWN0cyBhcmUgZXF1YWwsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtMTM5LDcgKzE5OSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyA8Y29kZT5SQzVQYXJhbWV0ZXJTcGVjPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMuamF2YSBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMuamF2YQppbmRleCAxYWVmNDBjLi44OTc5NDhjIDEwMDY0NAotLS0gYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvU2VjcmV0S2V5U3BlYy5qYXZhCkBAIC0zMCw3ICszMCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8uaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBBIGtleSBzcGVjaWZpY2F0aW9uIGZvciBhIDxjb2RlPlNlY3JldEtleTwvY29kZT4gYW5kIGFsc28gYSBzZWNyZXQga2V5CisgKiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHByb3ZpZGVyLWluZGVwZW5kZW50LiBJdCBjYW4gYmUgdXNlZCBmb3IgcmF3IHNlY3JldAorICoga2V5cyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgYXMgPGNvZGU+Ynl0ZVtdPC9jb2RlPi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWNyZXRLZXlTcGVjIGltcGxlbWVudHMgU2VjcmV0S2V5LCBLZXlTcGVjLCBTZXJpYWxpemFibGUgewogCkBAIC00NCw3ICs0OCwxNiBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZvcm1hdCA9ICJSQVciOyAvLyROT04tTkxTLTEkCiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjcmV0S2V5U3BlYzwvY29kZT4gZm9yIHRoZSBzcGVjaWZpZWQga2V5IGRhdGEgYW5kCisgICAgICogYWxnb3JpdGhtIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBkYXRhLgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgZGF0YSBvciB0aGUgYWxnb3JpdGhtIG5hbWUgaXMgbnVsbCBvciBpZiB0aGUga2V5CisgICAgICogICAgICAgICAgICAgZGF0YSBpcyBlbXB0eS4KICAgICAgKi8KICAgICBwdWJsaWMgU2VjcmV0S2V5U3BlYyhieXRlW10ga2V5LCBTdHJpbmcgYWxnb3JpdGhtKSB7CiAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewpAQCAtNjMsNyArNzYsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjcmV0S2V5U3BlYzwvY29kZT4gZm9yIHRoZSBrZXkgZGF0YSBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBidWZmZXIgPGNvZGU+a2V5PC9jb2RlPiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHdpdGgKKyAgICAgKiBsZW5ndGggPGNvZGU+bGVuPC9jb2RlPiBhbmQgdGhlIHNwZWNpZmllZCA8Y29kZT5hbGdvcml0aG08L2NvZGU+IG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBkYXRhLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGtleSBkYXRhLgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgZGF0YSBvciB0aGUgYWxnb3JpdGhtIG5hbWUgaXMgbnVsbCwgdGhlIGtleSBkYXRhCisgICAgICogICAgICAgICAgICAgaXMgZW1wdHkgb3IgPGNvZGU+b2Zmc2V0PC9jb2RlPiBhbmQgPGNvZGU+bGVuPC9jb2RlPiBkbyBub3QKKyAgICAgKiAgICAgICAgICAgICBzcGVjaWZ5IGEgdmFsaWQgY2h1bmsgaW4gdGhlIGJ1ZmZlciA8Y29kZT5rZXk8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBvciA8Y29kZT5sZW48L2NvZGU+IGlzIG5lZ2F0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBTZWNyZXRLZXlTcGVjKGJ5dGVbXSBrZXksIGludCBvZmZzZXQsIGludCBsZW4sIFN0cmluZyBhbGdvcml0aG0pIHsKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CkBAIC03Miw5ICsxMDIsMTEgQEAKICAgICAgICAgaWYgKGtleS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImNyeXB0by4zNSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBpZiAobGVuIDwgMCB8fCBvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiY3J5cHRvLjM2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAoKGtleS5sZW5ndGggLSBvZmZzZXQgPCBsZW4pKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiY3J5cHRvLjM3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTg3LDIxICsxMTksMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGFsZ29yaXRobSBuYW1lLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFsZ29yaXRobSBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gYWxnb3JpdGhtOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0IHVzZWQgdG8gZW5jb2RlIHRoZSBrZXkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0IG5hbWUgIlJBVyIuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKSB7CiAgICAgICAgIHJldHVybiBmb3JtYXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBlbmNvZGVkIGZvcm0gb2YgdGhpcyBzZWNyZXQga2V5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgZm9ybSBvZiB0aGlzIHNlY3JldCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgewogICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVba2V5Lmxlbmd0aF07CkBAIC0xMTAsNyArMTQ4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGlzIDxjb2RlPlNlY3JldEtleVNwZWM8L2NvZGU+IG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTEyMiw3ICsxNjIsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyA8Y29kZT5TZWNyZXRLZXlTcGVjPC9jb2RlPgorICAgICAqIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFsZ29yaXRobSBuYW1lIGFuZCBrZXkgb2YgYm90aCBvYmplY3QgYXJlIGVxdWFsLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9wYWNrYWdlLmh0bWwgYi9jcnlwdG8vc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vc3BlYy9wYWNrYWdlLmh0bWwKaW5kZXggZGEwMzc3OS4uZjY0N2Y3NSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL3NwZWMvcGFja2FnZS5odG1sCisrKyBiL2NyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9zcGVjL3BhY2thZ2UuaHRtbApAQCAtMSwxOSArMSwxNyBAQAogPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIj4KLTwvaGVhZD4KLTxodG1sPgotPGJvZHk+Ci08cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyB0aGUgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3BlY2lmeSBrZXlzIGFuZCBwYXJhbWV0ZXIgZm9yCi1lbmNyeXB0aW9uLiBGb2xsb3dpbmcgc3RhbmRhcmRzIGFyZSBzdXBwb3J0ZWQ6Ci0oMSkgUEtDUyMzIERpZmZpZS1IZWxsbWFuIGVrZXkgYWdyZWVtZW50J3Mgc3RhbmRhcmQ7Ci0oMikgRklQUy00Ni0yIERhdGEgRW5jcnlwdGlvbiBTdGFuZGFyZCAoREVTKTsKLSgzKSBQS0NTIzUgUGFzc3dvcmQgQmFzZWQgRW5jcnlwdGlvbiAoUEJFKSBzdGFuZGFyZC4KLUtleXMgbWF5IGJlIHNwZWNpZmllZCB2aWEgYWxnb3JpdGhtIG9yIGluIGEgbW9yZSBhYnN0cmFjdCBhbmQgZ2VuZXJhbCB3YXkgd2l0aCBBU04uMS4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgbmVlZGVkIHRvIHNwZWNpZnkga2V5cworICAgICAgYW5kIHBhcmFtZXRlciBmb3IgZW5jcnlwdGlvbi4gRm9sbG93aW5nIHN0YW5kYXJkcyBhcmUgc3VwcG9ydGVkOgorICAgICAgKDEpIFBLQ1MjMyBEaWZmaWUtSGVsbG1hbiBla2V5IGFncmVlbWVudCdzIHN0YW5kYXJkOworICAgICAgKDIpIEZJUFMtNDYtMiBEYXRhIEVuY3J5cHRpb24gU3RhbmRhcmQgKERFUyk7CisgICAgICAoMykgUEtDUyM1IFBhc3N3b3JkIEJhc2VkIEVuY3J5cHRpb24gKFBCRSkgc3RhbmRhcmQuCisgICAgICBLZXlzIG1heSBiZSBzcGVjaWZpZWQgdmlhIGFsZ29yaXRobSBvciBpbiBhIG1vcmUgYWJzdHJhY3QgYW5kIGdlbmVyYWwgd2F5CisgICAgICB3aXRoIEFTTi4xLgogCi1LZXlzIGFuZCBhbGdvcml0aG0gcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkIGZvciB0aGUgZm9sbG93aW5nIHByb2NlZHVyZXM6Ci0oaSkgREgsIChpaSkgREVTLCAoaWlpKSBUcmlwbGVERVMsIChpdikgUEJFLCAodikgUkMyIGFuZCAodmkpIFJDNS4KLTwvcD4KLTwvYm9keT4KKyAgICAgIEtleXMgYW5kIGFsZ29yaXRobSBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlczoKKyAgICAgIChpKSBESCwgKGlpKSBERVMsIChpaWkpIFRyaXBsZURFUywgKGl2KSBQQkUsICh2KSBSQzIgYW5kICh2aSkgUkM1LgorICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEgYi9jcnlwdG8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCmluZGV4IDY3MzFlMDAuLmI2MWE1Y2YgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvY3J5cHRvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQpAQCAtMjEsNiArMjEsMTAgQEAKICAqIGlmIHRoaXMgdG9vbCBydW5zIGFnYWluLiBCZXR0ZXIgbWFrZSBjaGFuZ2VzIGluIHRoZSB0ZW1wbGF0ZSBmaWxlLgogICovCiAKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gUmVkdW5kYW50IGNvZGUgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm93IGNhbGxlZCBmcm9tIE1zZ0hlbHAuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by5pbnRlcm5hbC5ubHM7CiAKIApAQCAtMzAsOCArMzQsOSBAQAogaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5WTTsKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgYW5kIHJldHVybnMgdGhlbSwKQEAgLTQ5LDggKzU0LDEwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1Jlc291cmNlID0KICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8uaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8qKgogICAgICAqIFJldHJpZXZlcyBhIG1lc3NhZ2Ugd2hpY2ggaGFzIG5vIGFyZ3VtZW50cy4KQEAgLTYwLDcgKzY3LDkgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgpAQCAtMTI3LDYgKzEzNiwxMiBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2csIGFyZ3MpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gRHVwbGljYXRlIGNvZGUgd2FzIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgTXNnSGVscC4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL21haW4vbmF0aXZlL2phdmF4X2NyeXB0b19IbWFjU3BpLmNwcCBiL2NyeXB0by9zcmMvbWFpbi9uYXRpdmUvamF2YXhfY3J5cHRvX0htYWNTcGkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWQ0ZWM5Li4wMDAwMDAwCi0tLSBhL2NyeXB0by9zcmMvbWFpbi9uYXRpdmUvamF2YXhfY3J5cHRvX0htYWNTcGkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlIDxKTklIZWxwLmg+Ci0vLyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLWpieXRlQXJyYXkgbmF0aXZlX2NvbXB1dGVfc2hhMV9obWFjKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlQXJyYXkga2V5QXJyYXksIGpieXRlQXJyYXkgZGF0YUFycmF5KQotewotICAgIHVpbnQ4X3QgKiBvdXRwdXQgPSAodWludDhfdCAqKW1hbGxvYyhFVlBfTUFYX01EX1NJWkUpOwotICAgIGlmICghb3V0cHV0KSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwgTlVMTCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB1aW50MzJfdCBvdXRwdXRTaXplOwotCi0gICAgamJ5dGUgKiBrZXkgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGtleUFycmF5LCBOVUxMKTsKLSAgICBpbnQga2V5U2l6ZSA9IGVudi0+R2V0QXJyYXlMZW5ndGgoa2V5QXJyYXkpOwotCi0gICAgamJ5dGUgKiBkYXRhID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhQXJyYXksIE5VTEwpOwotICAgIGludCBkYXRhU2l6ZSA9IGVudi0+R2V0QXJyYXlMZW5ndGgoZGF0YUFycmF5KTsKLQotICAgIEhNQUMoRVZQX3NoYTEoKSwKLSAgICAgICAgKHVuc2lnbmVkIGNoYXIgY29uc3QgKilrZXksIGtleVNpemUsCi0gICAgICAgICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopZGF0YSwgZGF0YVNpemUsCi0gICAgICAgIG91dHB1dCwgJm91dHB1dFNpemUpOwotCi0gICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoa2V5QXJyYXksIGtleSwgMCk7Ci0gICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZGF0YUFycmF5LCBkYXRhLCAwKTsKLQotICAgIGpieXRlQXJyYXkgb3V0cHV0QXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheShvdXRwdXRTaXplKTsKLSAgICBpZiAoIW91dHB1dCkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIsIE5VTEwpOwotICAgICAgICBmcmVlKG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gICAgCi0KLSAgICBqYnl0ZSAqIG91dHB1dEJ5dGVzID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhvdXRwdXRBcnJheSwgTlVMTCk7Ci0gICAgbWVtY3B5KG91dHB1dEJ5dGVzLCBvdXRwdXQsIG91dHB1dFNpemUpOwotICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKG91dHB1dEFycmF5LCBvdXRwdXRCeXRlcywgMCk7Ci0KLSAgICBmcmVlKG91dHB1dCk7Ci0KLSAgICByZXR1cm4gb3V0cHV0QXJyYXk7Ci19Ci0KLS8qCi0gKiBKTkkgcmVnaXN0cmF0aW9uLgotICovCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7Ci0gICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyAibmF0aXZlX2NvbXB1dGVfc2hhMV9obWFjIiwgIihbQltCKVtCIiwgKHZvaWQqKW5hdGl2ZV9jb21wdXRlX3NoYTFfaG1hYyB9LAotfTsKLQotZXh0ZXJuICJDIiBpbnQgcmVnaXN0ZXJfamF2YXhfY3J5cHRvX0htYWNTcGkoSk5JRW52KiBlbnYpCi17Ci0gICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJqYXZheC9jcnlwdG8vSG1hY1NwaSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwotfQotCi0KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvbWFpbi9uYXRpdmUvc3ViLm1rIGIvY3J5cHRvL3NyYy9tYWluL25hdGl2ZS9zdWIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmY1MDguLjAwMDAwMDAKLS0tIGEvY3J5cHRvL3NyYy9tYWluL25hdGl2ZS9zdWIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSB0aGUgdG9wLWxldmVsIGxpYmNvcmUgQW5kcm9pZC5tay4KLSMgSXQncyBub3QgYSBub3JtYWwgbWFrZWZpbGUsIHNvIHdlIGRvbid0IGluY2x1ZGUgQ0xFQVJfVkFSUwotIyBvciBCVUlMRF8qX0xJQlJBUlkuCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JamF2YXhfY3J5cHRvX0htYWNTcGkuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotCWV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQotCi0jIEFueSBzaGFyZWQvc3RhdGljIGxpYnMgdGhhdCBhcmUgbGlzdGVkIGhlcmUgbXVzdCBhbHNvCi0jIGJlIGxpc3RlZCBpbiBsaWJzL25hdGl2ZWhlbHBlci9BbmRyb2lkLm1rLgotIyBUT0RPOiBmaXggdGhpcyByZXF1aXJlbWVudAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLQlsaWJjcnlwdG8KLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQWxsVGVzdHMuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwYzkzNQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogVGhpcyBpcyBhdXRvZ2VuZXJhdGVkIHNvdXJjZSBmaWxlLiBJbmNsdWRlcyB0ZXN0cyBmb3IgcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKyAqLworCitwdWJsaWMgY2xhc3MgQWxsVGVzdHMgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJBbGwgdGVzdHMgZm9yIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmFkUGFkZGluZ0V4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2lwaGVySW5wdXRTdHJlYW0xVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaXBoZXJJbnB1dFN0cmVhbVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2lwaGVyT3V0cHV0U3RyZWFtMVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2lwaGVyT3V0cHV0U3RyZWFtVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaXBoZXJTcGlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENpcGhlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRXhlbXB0aW9uTWVjaGFuaXNtU3BpVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShFeGVtcHRpb25NZWNoYW5pc21UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEtleUFncmVlbWVudFNwaVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoS2V5QWdyZWVtZW50VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShLZXlHZW5lcmF0b3JTcGlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEtleUdlbmVyYXRvclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWFjU3BpVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNYWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5vU3VjaFBhZGRpbmdFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxDaXBoZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlYWxlZE9iamVjdFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VjcmV0S2V5RmFjdG9yeVNwaVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VjcmV0S2V5RmFjdG9yeVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VjcmV0S2V5VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3QuY2xhc3MpOworCisgICAgICAgIC8vICRKVW5pdC1FTkQkCisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODcyMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+QmFkUGFkZGluZ0V4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQmFkUGFkZGluZ0V4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBCYWRQYWRkaW5nRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQmFkUGFkZGluZ0V4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIEJhZFBhZGRpbmdFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIiB9OworCisgICAgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+QmFkUGFkZGluZ0V4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBCYWRQYWRkaW5nRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCYWRQYWRkaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEJhZFBhZGRpbmdFeGNlcHRpb24wMSgpIHsKKyAgICAgICAgQmFkUGFkZGluZ0V4Y2VwdGlvbiB0RSA9IG5ldyBCYWRQYWRkaW5nRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkJhZFBhZGRpbmdFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQmFkUGFkZGluZ0V4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KKyAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCYWRQYWRkaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQYWRkaW5nRXhjZXB0aW9uMDIoKSB7CisgICAgICAgIEJhZFBhZGRpbmdFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQmFkUGFkZGluZ0V4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkJhZFBhZGRpbmdFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQmFkUGFkZGluZ0V4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmFkUGFkZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUGFkZGluZ0V4Y2VwdGlvbjAzKCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgQmFkUGFkZGluZ0V4Y2VwdGlvbiB0RSA9IG5ldyBCYWRQYWRkaW5nRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlcklucHV0U3RyZWFtMVRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlcklucHV0U3RyZWFtMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWE4MGQzMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlcklucHV0U3RyZWFtMVRlc3QuamF2YQpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uTnVsbENpcGhlcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2lwaGVySW5wdXRTdHJlYW0uY2xhc3MpCisvKioKKyAqLworCitwdWJsaWMgY2xhc3MgQ2lwaGVySW5wdXRTdHJlYW0xVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RJbnB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheUlucHV0U3RyZWFtIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBUZXN0SW5wdXRTdHJlYW0oYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHN1cGVyKGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gd2FzQ2xvc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsb3NlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENpcGhlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdAorICAgICAqIENpcGhlcklucHV0U3RyZWFtIHVzZXMgTnVsbENpcGhlciBpZiBDaXBoZXIgaXMgbm90IHNwZWNpZmllZAorICAgICAqIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaXBoZXJJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lwaGVySW5wdXRTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsgLTEyNywgLTEwMCwgLTUwLCAtMTAsIC0xLCAwLCAxLCAxMCwgNTAsIDEyNyB9OworICAgICAgICBUZXN0SW5wdXRTdHJlYW0gdGlzID0gbmV3IFRlc3RJbnB1dFN0cmVhbShkYXRhKTsKKyAgICAgICAgQ2lwaGVySW5wdXRTdHJlYW0gY2lzID0gbmV3IENpcGhlcklucHV0U3RyZWFtKHRpcyl7fTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoYnl0ZSkgY2lzLnJlYWQoKSAhPSBkYXRhW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiTnVsbENpcGhlciBzaG91bGQgYmUgdXNlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJpZiBDaXBoZXIgaXMgbm90IHNwZWNpZmllZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2lzLnJlYWQoKSAhPSAtMSkgeworICAgICAgICAgICAgZmFpbCgiTnVsbENpcGhlciBzaG91bGQgYmUgdXNlZCBpZiBDaXBoZXIgaXMgbm90IHNwZWNpZmllZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlYWQoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCBtZXRob2QgcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZQorICAgICAqIChyZWxhdGVkIHRvIHRoZSBJbnB1dFN0cmVhbSkgYW5kIHRoYXQgaXQgcmV0dXJucyAtMSBhdCB0aGUgZW5kIG9mIHN0cmVhbS4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IC0xMjcsIC0xMDAsIC01MCwgLTEwLCAtMSwgMCwgMSwgMTAsIDUwLCAxMjcgfTsKKyAgICAgICAgVGVzdElucHV0U3RyZWFtIHRpcyA9IG5ldyBUZXN0SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgIENpcGhlcklucHV0U3RyZWFtIGNpcyA9IG5ldyBDaXBoZXJJbnB1dFN0cmVhbSh0aXMsIG5ldyBOdWxsQ2lwaGVyKCkpOworICAgICAgICBieXRlIHJlczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHJlcyA9IChieXRlKSBjaXMucmVhZCgpKSAhPSBkYXRhW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgicmVhZCgpIHJldHVybmVkIHRoZSBpbmNvcnJlY3QgdmFsdWUuICIgKyAiRXhwZWN0ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVtpXSArICIsIEdvdDogIiArIHJlcyArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNpcy5yZWFkKCkgIT0gLTEpIHsKKyAgICAgICAgICAgIGZhaWwoInJlYWQoKSBzaG91bGQgcmV0dXJuIC0xIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlYWQoYnl0ZVtdIGIpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IG1ldGhvZCByZXR1cm5zIHRoZSBjb3JyZWN0CisgICAgICogdmFsdWUgKHJlbGF0ZWQgdG8gdGhlIElucHV0U3RyZWFtKSBhbmQgdGhhdCBpdCByZXR1cm5zIC0xIGF0IHRoZSBlbmQgb2YKKyAgICAgKiBzdHJlYW0uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAtMTI3LCAtMTAwLCAtNTAsIC0xMCwgLTEsIDAsIDEsIDEwLCA1MCwgMTI3IH07CisgICAgICAgIFRlc3RJbnB1dFN0cmVhbSB0aXMgPSBuZXcgVGVzdElucHV0U3RyZWFtKGRhdGEpOworICAgICAgICBDaXBoZXJJbnB1dFN0cmVhbSBjaXMgPSBuZXcgQ2lwaGVySW5wdXRTdHJlYW0odGlzLCBuZXcgTnVsbENpcGhlcigpKTsKKworICAgICAgICBpbnQgZXhwZWN0ZWQgPSBkYXRhLmxlbmd0aDsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2V4cGVjdGVkXTsKKworICAgICAgICBpbnQgaW5kID0gMDsgLy8gaW5kZXggaW50byB0aGUgZGF0YSBhcnJheSAodG8gY2hlY2sgdGhlIGdvdCBkYXRhKQorICAgICAgICBpbnQgZ290ID0gY2lzLnJlYWQocmVzdWx0KTsgLy8gdGhlIG51bWJlciBvZiBnb3QgYnl0ZXMKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ290IC0gaW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0W2pdICE9IGRhdGFbaW5kICsgal0pIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgicmVhZChieXRlW10gYikgcmV0dXJuZWQgaW5jb3JyZWN0IGRhdGEuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdvdCA9PSBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChnb3QgPiBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBkYXRhIHJldHVybmVkIGJ5IHJlYWQoYnl0ZVtdIGIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIGxhcmdlciB0aGFuIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmQgPSBnb3Q7CisgICAgICAgICAgICAgICAgZ290ICs9IGNpcy5yZWFkKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNpcy5yZWFkKHJlc3VsdCkgIT0gLTEpIHsKKyAgICAgICAgICAgIGZhaWwoInJlYWQoYnl0ZVtdIGIpIHNob3VsZCByZXR1cm4gLTEgIgorICAgICAgICAgICAgICAgICAgICArICJhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCBtZXRob2QKKyAgICAgKiByZXR1cm5zIHRoZSBjb3JyZWN0IHZhbHVlIChyZWxhdGVkIHRvIHRoZSBJbnB1dFN0cmVhbSksIHRoYXQgaXQgZGlzY2FyZHMKKyAgICAgKiBieXRlcyBpbiB0aGUgY2FzZSBvZiBudWxsIGJ1ZmZlciwgYW5kIHRoYXQgaXQgcmV0dXJucyAtMSBhdCB0aGUgZW5kIG9mCisgICAgICogc3RyZWFtLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IC0xMjcsIC0xMDAsIC01MCwgLTEwLCAtMSwgMCwgMSwgMTAsIDUwLCAxMjcgfTsKKyAgICAgICAgVGVzdElucHV0U3RyZWFtIHRpcyA9IG5ldyBUZXN0SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgIENpcGhlcklucHV0U3RyZWFtIGNpcyA9IG5ldyBDaXBoZXJJbnB1dFN0cmVhbSh0aXMsIG5ldyBOdWxsQ2lwaGVyKCkpOworCisgICAgICAgIGludCBleHBlY3RlZCA9IGRhdGEubGVuZ3RoOworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbZXhwZWN0ZWRdOworCisgICAgICAgIGludCBza2lwID0gMjsKKyAgICAgICAgaW50IGluZCA9IHNraXA7IC8vIGluZGV4IGludG8gdGhlIGRhdGEgYXJyYXkgKHRvIGNoZWNrIHRoZSBnb3QgZGF0YSkKKyAgICAgICAgLy8gc2hvdWxkIHJlYWQgYW5kIGRpc2NhcmQgYnl0ZXM7CisgICAgICAgIGNpcy5yZWFkKG51bGwsIDAsIHNraXApOworICAgICAgICBpbnQgZ290ID0gc2tpcCArIGNpcy5yZWFkKHJlc3VsdCwgMCwgMSk7IC8vIHRoZSBudW1iZXIgb2YgZ290IGJ5dGVzCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdvdCAtIGluZDsgaisrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJyZXR1cm5lZCBpbmNvcnJlY3QgZGF0YS4iLCByZXN1bHRbal0sIGRhdGFbaW5kICsgal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdvdCA9PSBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChnb3QgPiBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBkYXRhIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIGxhcmdlciB0aGFuIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmQgPSBnb3Q7CisgICAgICAgICAgICAgICAgZ290ICs9IGNpcy5yZWFkKHJlc3VsdCwgMCwgMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNpcy5yZWFkKHJlc3VsdCwgMCwgMSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGZhaWwoInJlYWQoKSBzaG91bGQgcmV0dXJuIC0xIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHNraXAobG9uZyBuKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCB0aGUgbWV0aG9kIGNvcnJlY3RseSBza2lwcyB0aGUKKyAgICAgKiBieXRlcy4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJza2lwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IC0xMjcsIC0xMDAsIC01MCwgLTEwLCAtMSwgMCwgMSwgMTAsIDUwLCAxMjcgfTsKKyAgICAgICAgVGVzdElucHV0U3RyZWFtIHRpcyA9IG5ldyBUZXN0SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgIENpcGhlcklucHV0U3RyZWFtIGNpcyA9IG5ldyBDaXBoZXJJbnB1dFN0cmVhbSh0aXMsIG5ldyBOdWxsQ2lwaGVyKCkpOworICAgICAgICBpbnQgZXhwZWN0ZWQgPSBkYXRhLmxlbmd0aDsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2V4cGVjdGVkXTsKKworICAgICAgICBpbnQgc2tpcHBlZCA9IChpbnQpIGNpcy5za2lwKDIpOworICAgICAgICBpbnQgaW5kID0gc2tpcHBlZDsKKyAgICAgICAgaW50IGdvdCA9IHNraXBwZWQgKyBjaXMucmVhZChyZXN1bHQsIDAsIDEpOyAvLyB0aGUgbnVtYmVyIG9mIGdvdCBieXRlcworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBnb3QgLSBpbmQ7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbal0gIT0gZGF0YVtpbmQgKyBqXSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJyZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmV0dXJuZWQgaW5jb3JyZWN0IGRhdGE6IEV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFbaW5kICsgal0gKyAiLCBnb3Q6ICIgKyByZXN1bHRbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnb3QgPT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ290ID4gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaGUgZGF0YSByZXR1cm5lZCBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJyZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJpcyBsYXJnZXIgdGhhbiBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kID0gZ290OworICAgICAgICAgICAgICAgIGdvdCArPSBjaXMucmVhZChyZXN1bHQsIDAsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZ290ID0gY2lzLnJlYWQocmVzdWx0LCAwLCAxKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGZhaWwoInJlYWQoKSBzaG91bGQgcmV0dXJuIC0xIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIgorICAgICAgICAgICAgICAgICAgICArICJPdXRwdXQgaXM6ICIgKyBnb3QgKyAiLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXZhaWxhYmxlKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgdGhlIG1ldGhvZCBhbHdheXMgcmV0dXJuIDAuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZhaWxhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEF2YWlsYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAtMTI3LCAtMTAwLCAtNTAsIC0xMCwgLTEsIDAsIDEsIDEwLCA1MCwgMTI3IH07CisgICAgICAgIFRlc3RJbnB1dFN0cmVhbSB0aXMgPSBuZXcgVGVzdElucHV0U3RyZWFtKGRhdGEpOworICAgICAgICBDaXBoZXJJbnB1dFN0cmVhbSBjaXMgPSBuZXcgQ2lwaGVySW5wdXRTdHJlYW0odGlzLCBuZXcgTnVsbENpcGhlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcmV0dXJuZWQgYnkgYXZhaWxhYmxlKCkgbWV0aG9kIHZhbHVlICIKKyAgICAgICAgICAgICAgICArICJzaG91bGQgYmUgMC4iLCBjaXMuYXZhaWxhYmxlKCksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb3NlKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgdGhlIG1ldGhvZCBjYWxscyB0aGUgY2xvc2UoKQorICAgICAqIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsgLTEyNywgLTEwMCwgLTUwLCAtMTAsIC0xLCAwLCAxLCAxMCwgNTAsIDEyNyB9OworICAgICAgICBUZXN0SW5wdXRTdHJlYW0gdGlzID0gbmV3IFRlc3RJbnB1dFN0cmVhbShkYXRhKTsKKyAgICAgICAgQ2lwaGVySW5wdXRTdHJlYW0gY2lzID0gbmV3IENpcGhlcklucHV0U3RyZWFtKHRpcywgbmV3IE51bGxDaXBoZXIoKSk7CisgICAgICAgIGNpcy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2xvc2UoKSBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIGNsb3NlKCkgbWV0aG9kICIKKyAgICAgICAgICAgICAgICArICJvZiBpdHMgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0uIiwgdGlzLndhc0Nsb3NlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtYXJrU3VwcG9ydGVkKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgbWFyayBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImF2YWlsYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXJrU3VwcG9ydGVkKCkgeworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10gey0xMjcsIC0xMDAsIC01MCwgLTEwLCAtMSwgMCwgMSwgMTAsIDUwLCAxMjd9OworICAgICAgICBUZXN0SW5wdXRTdHJlYW0gdGlzID0gbmV3IFRlc3RJbnB1dFN0cmVhbShkYXRhKTsKKyAgICAgICAgQ2lwaGVySW5wdXRTdHJlYW0gY2lzID0gbmV3IENpcGhlcklucHV0U3RyZWFtKHRpcywgbmV3IE51bGxDaXBoZXIoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgYnkgbWFya1N1cHBvcnRlZCgpIG1ldGhvZCB2YWx1ZSAiCisgICAgICAgICAgICAgICAgKyAic2hvdWxkIGJlIGZhbHNlLiIsIGNpcy5tYXJrU3VwcG9ydGVkKCkpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9DaXBoZXJJbnB1dFN0cmVhbVRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlcklucHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMmI0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9DaXBoZXJJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7CitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcklucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LmNyeXB0by5OdWxsQ2lwaGVyOworCitAVGVzdFRhcmdldENsYXNzKENpcGhlcklucHV0U3RyZWFtLmNsYXNzKQorcHVibGljIGNsYXNzIENpcGhlcklucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gQ2hlY2tzIE51bGxQb2ludGVyRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJJSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTEwODAKKyAgICAgICAgQ2lwaGVySW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IENpcGhlcklucHV0U3RyZWFtKG51bGwsIG5ldyBOdWxsQ2lwaGVyKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLnJlYWQobmV3IGJ5dGVbMV0sIDEsIDApOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVySW5wdXRTdHJlYW0jY2xvc2UoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiBDaGVja3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xMDg3CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgQ2lwaGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pLAorICAgICAgICAgICAgICAgICAgICBDaXBoZXIuZ2V0SW5zdGFuY2UoIkRFUy9DQkMvUEtDUzVQYWRkaW5nIikpLmNsb3NlKCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQhIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgQ2lwaGVySW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oKElucHV0U3RyZWFtKSBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgQ2lwaGVyLmdldEluc3RhbmNlKCJERVMvQ0JDL1BLQ1M1UGFkZGluZyIpKS5jbG9zZSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkISIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQ2lwaGVyT3V0cHV0U3RyZWFtMVRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlck91dHB1dFN0cmVhbTFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMWI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlck91dHB1dFN0cmVhbTFUZXN0LmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5jcnlwdG8uTnVsbENpcGhlcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2lwaGVyT3V0cHV0U3RyZWFtLmNsYXNzKQorLyoqCisgKi8KKworcHVibGljIGNsYXNzIENpcGhlck91dHB1dFN0cmVhbTFUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE91dHB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNDbG9zZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gY2xvc2VkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2lwaGVyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQKKyAgICAgKiBDaXBoZXJPdXRwdXRTdHJlYW0gdXNlcyBOdWxsQ2lwaGVyIGlmIENpcGhlciBpcyBub3Qgc3BlY2lmaWVkCisgICAgICogaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNpcGhlck91dHB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENpcGhlck91dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAtMTI3LCAtMTAwLCAtNTAsIC0xMCwgLTEsIDAsIDEsIDEwLCA1MCwgMTI3IH07CisgICAgICAgIFRlc3RPdXRwdXRTdHJlYW0gdG9zID0gbmV3IFRlc3RPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ2lwaGVyT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDaXBoZXJPdXRwdXRTdHJlYW0odG9zKXt9OworICAgICAgICBjb3Mud3JpdGUoZGF0YSk7CisgICAgICAgIGNvcy5mbHVzaCgpOworICAgICAgICBieXRlW10gcmVzdWx0ID0gdG9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhyZXN1bHQsIGRhdGEpKSB7CisgICAgICAgICAgICBmYWlsKCJOdWxsQ2lwaGVyIHNob3VsZCBiZSB1c2VkICIgKyAiaWYgQ2lwaGVyIGlzIG5vdCBzcGVjaWZpZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3cml0ZShpbnQgYikgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgbWV0aG9kIHdyaXRlcyBjb3JyZWN0IHZhbHVlcyB0bworICAgICAqIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IC0xMjcsIC0xMDAsIC01MCwgLTEwLCAtMSwgMCwgMSwgMTAsIDUwLCAxMjcgfTsKKyAgICAgICAgVGVzdE91dHB1dFN0cmVhbSB0b3MgPSBuZXcgVGVzdE91dHB1dFN0cmVhbSgpOworICAgICAgICBDaXBoZXJPdXRwdXRTdHJlYW0gY29zID0gbmV3IENpcGhlck91dHB1dFN0cmVhbSh0b3MsIG5ldyBOdWxsQ2lwaGVyKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvcy53cml0ZShkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICBjb3MuZmx1c2goKTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHRvcy50b0J5dGVBcnJheSgpOworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMocmVzdWx0LCBkYXRhKSkgeworICAgICAgICAgICAgZmFpbCgiQ2lwaGVyT3V0cHV0U3RyZWFtIHdyb3RlIGluY29ycmVjdCBkYXRhLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogd3JpdGUoYnl0ZVtdIGIpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IG1ldGhvZCB3cml0ZXMgY29ycmVjdCB2YWx1ZXMKKyAgICAgKiB0byB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gJiBJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IC0xMjcsIC0xMDAsIC01MCwgLTEwLCAtMSwgMCwgMSwgMTAsIDUwLCAxMjcgfTsKKyAgICAgICAgVGVzdE91dHB1dFN0cmVhbSB0b3MgPSBuZXcgVGVzdE91dHB1dFN0cmVhbSgpOworICAgICAgICBDaXBoZXJPdXRwdXRTdHJlYW0gY29zID0gbmV3IENpcGhlck91dHB1dFN0cmVhbSh0b3MsIG5ldyBOdWxsQ2lwaGVyKCkpOworICAgICAgICBjb3Mud3JpdGUoZGF0YSk7CisgICAgICAgIGNvcy5mbHVzaCgpOworICAgICAgICBieXRlW10gcmVzdWx0ID0gdG9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhyZXN1bHQsIGRhdGEpKSB7CisgICAgICAgICAgICBmYWlsKCJDaXBoZXJPdXRwdXRTdHJlYW0gd3JvdGUgaW5jb3JyZWN0IGRhdGEuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlMygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAtMTI3LCAtMTAwLCAtNTAsIC0xMCwgLTEsIDAsIDEsIDEwLCA1MCwgMTI3IH07CisgICAgICAgIFRlc3RPdXRwdXRTdHJlYW0gdG9zID0gbmV3IFRlc3RPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ2lwaGVyT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDaXBoZXJPdXRwdXRTdHJlYW0odG9zLCBuZXcgTnVsbENpcGhlcigpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb3Mud3JpdGUoZGF0YSwgaSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgY29zLmZsdXNoKCk7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSB0b3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHJlc3VsdCwgZGF0YSkpIHsKKyAgICAgICAgICAgIGZhaWwoIkNpcGhlck91dHB1dFN0cmVhbSB3cm90ZSBpbmNvcnJlY3QgZGF0YS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNzU4CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgQ2lwaGVyT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgoT3V0cHV0U3RyZWFtKSBudWxsKSwgbmV3IE51bGxDaXBoZXIoKSkud3JpdGUobmV3IGJ5dGVbXSB7MH0sIDEsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gRnVuY3Rpb25hbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03NTgKKyAgICAgICAgQ2lwaGVyIGNmID0gQ2lwaGVyLmdldEluc3RhbmNlKCJERVMvQ0JDL1BLQ1M1UGFkZGluZyIpOworICAgICAgICBOdWxsQ2lwaGVyIG5jID0gbmV3IE51bGxDaXBoZXIoKTsKKyAgICAgICAgQ2lwaGVyT3V0cHV0U3RyZWFtIHN0cmVhbTEgPSBuZXcgQ2lwaGVyT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgoT3V0cHV0U3RyZWFtKSBudWxsKSwgbmMpOworICAgICAgICBDaXBoZXJPdXRwdXRTdHJlYW0gc3RyZWFtMiA9IG5ldyBDaXBoZXJPdXRwdXRTdHJlYW0oc3RyZWFtMSwgY2YpOworICAgICAgICBDaXBoZXJPdXRwdXRTdHJlYW0gc3RyZWFtMyA9IG5ldyBDaXBoZXJPdXRwdXRTdHJlYW0oc3RyZWFtMiwgbmMpOworICAgICAgICBzdHJlYW0zLndyaXRlKG5ldyBieXRlW10gezB9LCAwLCAwKTsKKyAgICAgICAgICAgLy9ubyBleGNlcHRpb24gZXhwZWN0ZWQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmbHVzaCgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IG1ldGhvZCBmbHVzaGVzIHRoZSBkYXRhIHRvIHRoZQorICAgICAqIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAtMTI3LCAtMTAwLCAtNTAsIC0xMCwgLTEsIDAsIDEsIDEwLCA1MCwgMTI3IH07CisgICAgICAgIFRlc3RPdXRwdXRTdHJlYW0gdG9zID0gbmV3IFRlc3RPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ2lwaGVyT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDaXBoZXJPdXRwdXRTdHJlYW0odG9zKXt9OworICAgICAgICBjb3Mud3JpdGUoZGF0YSk7CisgICAgICAgIGNvcy5mbHVzaCgpOworICAgICAgICBieXRlW10gcmVzdWx0ID0gdG9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhyZXN1bHQsIGRhdGEpKSB7CisgICAgICAgICAgICBmYWlsKCJDaXBoZXJPdXRwdXRTdHJlYW0gZGlkIG5vdCBmbHVzaCB0aGUgZGF0YS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb3NlKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgdGhlIG1ldGhvZCBjYWxscyB0aGUgY2xvc2UoKSBtZXRob2Qgb2YKKyAgICAgKiB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsgLTEyNywgLTEwMCwgLTUwLCAtMTAsIC0xLCAwLCAxLCAxMCwgNTAsIDEyNyB9OworICAgICAgICBUZXN0T3V0cHV0U3RyZWFtIHRvcyA9IG5ldyBUZXN0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENpcGhlck91dHB1dFN0cmVhbSBjb3MgPSBuZXcgQ2lwaGVyT3V0cHV0U3RyZWFtKHRvcyl7fTsKKyAgICAgICAgY29zLndyaXRlKGRhdGEpOworICAgICAgICBjb3MuY2xvc2UoKTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHRvcy50b0J5dGVBcnJheSgpOworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMocmVzdWx0LCBkYXRhKSkgeworICAgICAgICAgICAgZmFpbCgiQ2lwaGVyT3V0cHV0U3RyZWFtIGRpZCBub3QgZmx1c2ggdGhlIGRhdGEuIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNsb3NlKCkgbWV0aG9kIHNob3VsZCBjYWxsIHRoZSBjbG9zZSgpIG1ldGhvZCAiCisgICAgICAgICAgICAgICAgKyAib2YgaXRzIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbS4iLCB0b3Mud2FzQ2xvc2VkKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQ2lwaGVyT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQ2lwaGVyT3V0cHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGI0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9DaXBoZXJPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7CitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlck91dHB1dFN0cmVhbTsKKworQFRlc3RUYXJnZXRDbGFzcyhDaXBoZXJPdXRwdXRTdHJlYW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2lwaGVyT3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXguY3J5cHRvLkNpcGhlck91dHB1dFN0cmVhbSNjbG9zZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIENoZWNrcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0xMTM5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgQ2lwaGVyT3V0cHV0U3RyZWFtKChPdXRwdXRTdHJlYW0pIG51bGwsIENpcGhlcgorICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoIkRFUy9DQkMvUEtDUzVQYWRkaW5nIikpLmNsb3NlKCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICBDaXBoZXJPdXRwdXRTdHJlYW0gY2ggPSBuZXcgQ2lwaGVyT3V0cHV0U3RyZWFtKChPdXRwdXRTdHJlYW0pIG51bGwpIHt9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENpcGhlck91dHB1dFN0cmVhbShjaCwgQ2lwaGVyCisgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgiREVTL0NCQy9QS0NTNVBhZGRpbmciKSkuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlclNwaVRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlclNwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTliZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQ2lwaGVyU3BpVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZheC5jcnlwdG8uQmFkUGFkZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2hvcnRCdWZmZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlclNwaTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2lwaGVyU3BpLmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q2lwaGVyU3BpPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworcHVibGljIGNsYXNzIENpcGhlclNwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgY2xhc3MgTW9ja19DaXBoZXJTcGkgZXh0ZW5kcyBteUNpcGhlclNwaSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbChieXRlW10gaW5wdXQsIGludCBpbnB1dE9mZnNldCwgaW50IGlucHV0TGVuKSB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwgQmFkUGFkZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gIHN1cGVyLmVuZ2luZURvRmluYWwoaW5wdXQsIGlucHV0T2Zmc2V0LCBpbnB1dExlbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBlbmdpbmVEb0ZpbmFsKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LCBpbnQgaW5wdXRMZW4sIGJ5dGVbXSBvdXRwdXQsIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwgQmFkUGFkZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lRG9GaW5hbChpbnB1dCwgaW5wdXRPZmZzZXQsIGlucHV0TGVuLCBvdXRwdXQsIG91dHB1dE9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBlbmdpbmVHZXRCbG9ja1NpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lR2V0QmxvY2tTaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRJVigpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5lbmdpbmVHZXRJVigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBpbnQgZW5naW5lR2V0T3V0cHV0U2l6ZShpbnQgaW5wdXRMZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5lbmdpbmVHZXRPdXRwdXRTaXplKGlucHV0TGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQWxnb3JpdGhtUGFyYW1ldGVycyBlbmdpbmVHZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KGludCBvcG1vZGUsIEtleSBrZXksIFNlY3VyZVJhbmRvbSByYW5kb20pIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLmVuZ2luZUluaXQob3Btb2RlLCBrZXksIHJhbmRvbSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChpbnQgb3Btb2RlLCBLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIuZW5naW5lSW5pdChvcG1vZGUsIGtleSwgcGFyYW1zLCByYW5kb20pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IG9wbW9kZSwgS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMsIFNlY3VyZVJhbmRvbSByYW5kb20pIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLmVuZ2luZUluaXQob3Btb2RlLCBrZXksIHBhcmFtcywgcmFuZG9tKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRNb2RlKFN0cmluZyBtb2RlKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLmVuZ2luZVNldE1vZGUobW9kZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0UGFkZGluZyhTdHJpbmcgcGFkZGluZykgdGhyb3dzIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIuZW5naW5lU2V0UGFkZGluZyhwYWRkaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVVwZGF0ZShieXRlW10gaW5wdXQsIGludCBpbnB1dE9mZnNldCwgaW50IGlucHV0TGVuKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lVXBkYXRlKGlucHV0LCBpbnB1dE9mZnNldCwgaW5wdXRMZW4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBpbnQgZW5naW5lVXBkYXRlKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LCBpbnQgaW5wdXRMZW4sIGJ5dGVbXSBvdXRwdXQsIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lVXBkYXRlKGlucHV0LCBpbnB1dE9mZnNldCwgaW5wdXRMZW4sIG91dHB1dCwgb3V0cHV0T2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldEtleVNpemUoS2V5IGtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdldEtleVNpemUoa2V5KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lV3JhcChLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lV3JhcChrZXkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEtleSBlbmdpbmVVbndyYXAoYnl0ZVtdIHdyYXBwZWRLZXksIFN0cmluZyB3cmFwcGVkS2V5QWxnb3JpdGhtLCBpbnQgd3JhcHBlZEtleVR5cGUpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZVVud3JhcCh3cmFwcGVkS2V5LCB3cmFwcGVkS2V5QWxnb3JpdGhtLCB3cmFwcGVkS2V5VHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2lwaGVyU3BpVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2lwaGVyU3BpVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DaXBoZXJTcGk8L2NvZGU+IGNvbnN0cnVjdG9yIAorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDaXBoZXJTcGkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaXBoZXJTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lwaGVyU3BpVGVzdHMwMSgpIHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLAorICAgICAgICAgICAgQmFkUGFkZGluZ0V4Y2VwdGlvbiwgU2hvcnRCdWZmZXJFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTW9ja19DaXBoZXJTcGkgY1NwaSA9IG5ldyBNb2NrX0NpcGhlclNwaSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJsb2NrU2l6ZSBpcyBub3QgMCIsIGNTcGkuZW5naW5lR2V0QmxvY2tTaXplKCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIk91dHB1dFNpemUgaXMgbm90IDAiLCBjU3BpLmVuZ2luZUdldE91dHB1dFNpemUoMSksIDApOworICAgICAgICBieXRlW10gYmIgPSBjU3BpLmVuZ2luZUdldElWKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGVuZ3RoIG9mIHJlc3VsdCBieXRlIGFycmF5IGlzIG5vdCAwIiwgYmIubGVuZ3RoLCAwKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgcmVzdWx0IiwgY1NwaS5lbmdpbmVHZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICBieXRlW10gYmIxID0gbmV3IGJ5dGVbMTBdOworICAgICAgICBieXRlW10gYmIyID0gbmV3IGJ5dGVbMTBdOworICAgICAgICBiYiA9IGNTcGkuZW5naW5lVXBkYXRlKGJiMSwgMSwgMik7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJlc3VsdCBvZiBlbmdpbmVVcGRhdGUoYnl0ZSwgaW50LCBpbnQpIiwKKyAgICAgICAgICAgICAgICBiYi5sZW5ndGgsIDIpOworICAgICAgICBiYiA9IGNTcGkuZW5naW5lRG9GaW5hbChiYjEsIDEsIDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCByZXN1bHQgb2YgZW5naW5lRG9GaW5hbChieXRlLCBpbnQsIGludCkiLCAyLAorICAgICAgICAgICAgICAgIGJiLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IHJlc3VsdCBvZiBlbmdpbmVVcGRhdGUoYnl0ZSwgaW50LCBpbnQsIGJ5dGUsIGludCkiLAorICAgICAgICAgICAgICAgIGNTcGkuZW5naW5lVXBkYXRlKGJiMSwgMSwgMiwgYmIyLCA3KSwgMik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IHJlc3VsdCBvZiBlbmdpbmVEb0ZpbmFsKGJ5dGUsIGludCwgaW50LCBieXRlLCBpbnQpIiwKKyAgICAgICAgICAgICAgICAyLCBjU3BpLmVuZ2luZURvRmluYWwoYmIxLCAxLCAyLCBiYjIsIDApKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZW5naW5lR2V0S2V5U2l6ZShLZXkpPC9jb2RlPiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uOiBJdCB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgaXQgaXMgbm90IG92ZXJyaWRkZW4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgbm90IHRlc3RlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVHZXRLZXlTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lwaGVyU3BpMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja19DaXBoZXJTcGkgY1NwaSA9IG5ldyBNb2NrX0NpcGhlclNwaSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY1NwaS5lbmdpbmVHZXRLZXlTaXplKG51bGwpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZW5naW5lV3JhcChLZXkpPC9jb2RlPiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uOiBJdCB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgaXQgaXMgbm90IG92ZXJyaWRkZW4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgbm90IHRlc3RlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVXcmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lwaGVyU3BpMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja19DaXBoZXJTcGkgY1NwaSA9IG5ldyBNb2NrX0NpcGhlclNwaSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY1NwaS5lbmdpbmVXcmFwKG51bGwpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZW5naW5lVW53cmFwKGJ5dGVbXSwgU3RyaW5nLCBpbnQpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IEl0IHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBpdCBpcyBub3Qgb3ZlcnJpZGRlbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSBub3QgdGVzdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZ2luZVVud3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENpcGhlclNwaTA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1vY2tfQ2lwaGVyU3BpIGNTcGkgPSBuZXcgTW9ja19DaXBoZXJTcGkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNTcGkuZW5naW5lVW53cmFwKG5ldyBieXRlWzBdLCAiIiwgMCk7CisgICAgICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZW5naW5lVXBkYXRlKEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb25zOgorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlc2UgYnVmZmVycyBpcyBudWxsOworICAgICAqIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBubyBzcGFjZSBpbiBvdXRwdXQgdG8gaG9sZCByZXN1bHQKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVVcGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENpcGhlclNwaTA1KCkgdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja19DaXBoZXJTcGkgY1NwaSA9IG5ldyBNb2NrX0NpcGhlclNwaSgpOworICAgICAgICBieXRlW10gYmIgPSB7IChieXRlKSAwLCAoYnl0ZSkgMSwgKGJ5dGUpIDIsIChieXRlKSAzLCAoYnl0ZSkgNCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgNSwgKGJ5dGUpIDYsIChieXRlKSA3LCAoYnl0ZSkgOCwgKGJ5dGUpIDksIChieXRlKSAxMCB9OworICAgICAgICBpbnQgcG9zID0gNTsKKyAgICAgICAgaW50IGxlbiA9IGJiLmxlbmd0aDsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYk51bGwgPSBudWxsOworICAgICAgICBCeXRlQnVmZmVyIGJiMSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobGVuKTsKKyAgICAgICAgYmIxLnB1dChiYik7CisgICAgICAgIGJiMS5wb3NpdGlvbigwKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNTcGkuZW5naW5lVXBkYXRlKGJiTnVsbCwgYmIxKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY1NwaS5lbmdpbmVVcGRhdGUoYmIxLCBiYk51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIEJ5dGVCdWZmZXIgYmIyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShiYi5sZW5ndGgpOworICAgICAgICBiYjEucG9zaXRpb24obGVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHN0b3JlZCBieXRlcyIsIDAsIGNTcGkuZW5naW5lVXBkYXRlKAorICAgICAgICAgICAgICAgIGJiMSwgYmIyKSk7CisKKyAgICAgICAgYmIxLnBvc2l0aW9uKDApOworICAgICAgICBiYjIucG9zaXRpb24obGVuIC0gMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjU3BpLmVuZ2luZVVwZGF0ZShiYjEsIGJiMik7CisgICAgICAgICAgICBmYWlsKCJTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBidXN0IGJlIHRocm93bi4gT3V0cHV0IGJ1ZmZlciByZW1haW5pbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChJbnRlZ2VyLnRvU3RyaW5nKGJiMi5yZW1haW5pbmcoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoU2hvcnRCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGJiMS5wb3NpdGlvbigxMCk7CisgICAgICAgIGJiMi5wb3NpdGlvbigwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiBzdG9yZWQgYnl0ZXMiLCBjU3BpLmVuZ2luZVVwZGF0ZShiYjEsCisgICAgICAgICAgICAgICAgYmIyKSA+IDApOworICAgICAgICBiYjEucG9zaXRpb24oYmIubGVuZ3RoKTsKKyAgICAgICAgY1NwaS5lbmdpbmVVcGRhdGUoYmIxLCBiYjIpOworCisgICAgICAgIGJiMS5wb3NpdGlvbihwb3MpOworICAgICAgICBiYjIucG9zaXRpb24oMCk7CisgICAgICAgIGludCByZXMgPSBjU3BpLmVuZ2luZVVwZGF0ZShiYjEsIGJiMik7CisgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCByZXN1bHQiLCByZXMgPiAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5lbmdpbmVEb0ZpbmFsKEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb25zOiAKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgb25lIG9mIHRoZXNlIGJ1ZmZlcnMgaXMgbnVsbDsKKyAgICAgKiB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24gaXMgdGhlcmUgaXMgbm8gc3BhY2UgaW4gb3V0cHV0IHRvIGhvbGQgcmVzdWx0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJCYWRQYWRkaW5nRXhjZXB0aW9uICYgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lRG9GaW5hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lwaGVyU3BpMDYoKSB0aHJvd3MgQmFkUGFkZGluZ0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNob3J0QnVmZmVyRXhjZXB0aW9uLCBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja19DaXBoZXJTcGkgY1NwaSA9IG5ldyBNb2NrX0NpcGhlclNwaSgpOworICAgICAgICBpbnQgbGVuID0gMTA7CisgICAgICAgIGJ5dGVbXSBiYnVmID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYnVmLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBiYnVmW2ldID0gKGJ5dGUpIGk7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZUJ1ZmZlciBiYjEgPSBCeXRlQnVmZmVyLndyYXAoYmJ1Zik7CisgICAgICAgIEJ5dGVCdWZmZXIgYmJOdWxsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNTcGkuZW5naW5lRG9GaW5hbChiYk51bGwsIGJiMSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNTcGkuZW5naW5lRG9GaW5hbChiYjEsIGJiTnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZUJ1ZmZlciBiYjIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGxlbik7CisgICAgICAgIGJiMS5wb3NpdGlvbihiYjEubGltaXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJlc3VsdCIsIDAsIGNTcGkuZW5naW5lRG9GaW5hbChiYjEsIGJiMikpOworCisgICAgICAgIGJiMS5wb3NpdGlvbigwKTsKKyAgICAgICAgYmIyLnBvc2l0aW9uKGxlbiAtIDIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY1NwaS5lbmdpbmVEb0ZpbmFsKGJiMSwgYmIyKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3J0QnVmZmVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duLiBPdXRwdXQgYnVmZmVyIHJlbWFpbmluZzogIgorICAgICAgICAgICAgICAgICAgICAuY29uY2F0KEludGVnZXIudG9TdHJpbmcoYmIyLnJlbWFpbmluZygpKSkpOworICAgICAgICB9IGNhdGNoIChTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgaW50IHBvcyA9IDU7CisgICAgICAgIGJiMS5wb3NpdGlvbihwb3MpOworICAgICAgICBiYjIucG9zaXRpb24oMCk7CisgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCByZXN1bHQiLCBjU3BpLmVuZ2luZURvRmluYWwoYmIxLCBiYjIpID4gMCk7CisgICAgfQorfQorLyoqCisgKiAKKyAqIEFkZGl0aW9uYWwgY2xhc3MgZm9yIENpcGhlckdlbmVyYXRvclNwaSBjb25zdHJ1Y3RvciB2ZXJpZmljYXRpb24KKyAqLworCitjbGFzcyBteUNpcGhlclNwaSBleHRlbmRzIENpcGhlclNwaSB7CisgICAgcHJpdmF0ZSBieXRlW10gaW5pdFY7CisKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gcmVzViA9IHsgKGJ5dGUpIDcsIChieXRlKSA2LCAoYnl0ZSkgNSwgKGJ5dGUpIDQsCisgICAgICAgICAgICAoYnl0ZSkgMywgKGJ5dGUpIDIsIChieXRlKSAxLCAoYnl0ZSkgMCB9OworCisgICAgcHVibGljIG15Q2lwaGVyU3BpKCkgeworICAgICAgICB0aGlzLmluaXRWID0gbmV3IGJ5dGVbMF07CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0TW9kZShTdHJpbmcgbW9kZSkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0UGFkZGluZyhTdHJpbmcgcGFkZGluZykKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldEJsb2NrU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBlbmdpbmVHZXRPdXRwdXRTaXplKGludCBpbnB1dExlbikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldElWKCkgeworICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChpbnQgb3Btb2RlLCBLZXkga2V5LCBTZWN1cmVSYW5kb20gcmFuZG9tKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IG9wbW9kZSwgS2V5IGtleSwKKyAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IG9wbW9kZSwgS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMsCisgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lVXBkYXRlKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LCBpbnQgaW5wdXRMZW4pIHsKKyAgICAgICAgaWYgKGluaXRWLmxlbmd0aCA8IGlucHV0TGVuKSB7CisgICAgICAgICAgICBpbml0ViA9IG5ldyBieXRlW2lucHV0TGVuXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0TGVuOyBpKyspIHsKKyAgICAgICAgICAgIGluaXRWW2ldID0gaW5wdXRbaW5wdXRPZmZzZXQgKyBpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5pdFY7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwKKyAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQsIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGUgW11yZXMgPSBlbmdpbmVVcGRhdGUoaW5wdXQsIGlucHV0T2Zmc2V0LCBpbnB1dExlbik7CisgICAgICAgIGludCB0ID0gcmVzLmxlbmd0aDsKKyAgICAgICAgaWYgKChvdXRwdXQubGVuZ3RoIC0gb3V0cHV0T2Zmc2V0KSA8IHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbigiVXBkYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0OyBpKyspIHsKKyAgICAgICAgICAgIG91dHB1dFtpICsgb3V0cHV0T2Zmc2V0XSA9IGluaXRWW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbChieXRlW10gaW5wdXQsIGludCBpbnB1dE9mZnNldCwgaW50IGlucHV0TGVuKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24geworICAgICAgICBpZiAocmVzVi5sZW5ndGggPiBpbnB1dExlbikgeworICAgICAgICAgICAgYnl0ZVtdIGJiID0gbmV3IGJ5dGVbaW5wdXRMZW5dOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dExlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmJbaV0gPSByZXNWW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJiOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNWOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZW5naW5lRG9GaW5hbChieXRlW10gaW5wdXQsIGludCBpbnB1dE9mZnNldCwgaW50IGlucHV0TGVuLAorICAgICAgICAgICAgYnl0ZVtdIG91dHB1dCwgaW50IG91dHB1dE9mZnNldCkgdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwgQmFkUGFkZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSByZXMgPSBlbmdpbmVEb0ZpbmFsKGlucHV0LCBpbnB1dE9mZnNldCwgaW5wdXRMZW4pOworICAgICAgICAKKyAgICAgICAgaW50IHQgPSByZXMubGVuZ3RoOworICAgICAgICBpZiAoKG91dHB1dC5sZW5ndGggLSBvdXRwdXRPZmZzZXQpIDwgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNob3J0QnVmZmVyRXhjZXB0aW9uKCJEb0ZpbmFsIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0OyBpKyspIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dHB1dFtpICsgb3V0cHV0T2Zmc2V0XSA9IHJlc1tpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICAKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZVVwZGF0ZShCeXRlQnVmZmVyIGlucHV0LCBCeXRlQnVmZmVyIG91dHB1dCkKKyAgICB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lVXBkYXRlKGlucHV0LCBvdXRwdXQpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZURvRmluYWwoQnl0ZUJ1ZmZlciBpbnB1dCwgQnl0ZUJ1ZmZlciBvdXRwdXQpCisgICAgdGhyb3dzIFNob3J0QnVmZmVyRXhjZXB0aW9uLCBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLAorICAgIEJhZFBhZGRpbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lRG9GaW5hbChpbnB1dCwgb3V0cHV0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9DaXBoZXJUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9DaXBoZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0NTAxMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlclRlc3QuamF2YQpAQCAtMCwwICsxLDY1MSBAQAorLyogCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOworaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXJTcGk7CitpbXBvcnQgamF2YXguY3J5cHRvLktleUdlbmVyYXRvcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5RmFjdG9yeTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2hvcnRCdWZmZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREVTZWRlS2V5U3BlYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5JdlBhcmFtZXRlclNwZWM7CisKK2ltcG9ydCB0ZXN0cy5zdXBwb3J0LnJlc291cmNlLlN1cHBvcnRfUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydC5NeUNpcGhlcjsKKworQFRlc3RUYXJnZXRDbGFzcyhDaXBoZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2lwaGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CisKKyAgICBzdGF0aWMgS2V5IGNpcGhlcktleTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGFsZ29yaXRobSA9ICJERVNlZGUiOworICAgIHN0YXRpYyBmaW5hbCBpbnQga2V5TGVuID0gMTY4OworICAgIAorICAgIHN0YXRpYyB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgICAgIGtnLmluaXQoa2V5TGVuLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgY2lwaGVyS2V5ID0ga2cuZ2VuZXJhdGVLZXkoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIk5vIGtleSAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4LmNyeXB0by5DaXBoZXIjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDaXBoZXIgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKCJERVNlZGUvQ0JDL1BLQ1M1UGFkZGluZyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZWNlaXZlZCBhIG51bGwgQ2lwaGVyIGluc3RhbmNlIiwgY2lwaGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXguY3J5cHRvLkNpcGhlciNnZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoIkNpcGhlci5ERVMiKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBpbnN0YWxsZWQgcHJvdmlkZXJzIHN1cHBvcnQgQ2lwaGVyLkRFUyIsIHByb3ZpZGVycyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkRFUyIsIHByb3ZpZGVyc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2lwaGVyLmdldEluc3RhbmNlKCkgcmV0dXJuZWQgYSBudWxsIHZhbHVlIiwgY2lwaGVyKTsKKworICAgICAgICAgICAgLy8gRXhjZXB0aW9uIGNhc2UKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKCJEb0JlRG9CZURvIiwgcHJvdmlkZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFeGNlcHRpb24gY2FzZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2lwaGVyLmdldEluc3RhbmNlKCJERVMiLCAoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICAvLyBFeGNlcHRpb24gY2FzZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2lwaGVyLmdldEluc3RhbmNlKCJERVMiLCAiSUhhdmVOb3RCZWVuQ29uZmlndXJlZCIpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXguY3J5cHRvLkNpcGhlciNnZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoIkNpcGhlci5ERVMiKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBpbnN0YWxsZWQgcHJvdmlkZXJzIHN1cHBvcnQgQ2lwaGVyLkRFUyIsIHByb3ZpZGVycyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkRFUyIsIHByb3ZpZGVyc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJDaXBoZXIuZ2V0SW5zdGFuY2UoKSByZXR1cm5lZCBhIG51bGwgdmFsdWUiLCBjaXBoZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4LmNyeXB0by5DaXBoZXIjZ2V0UHJvdmlkZXIoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCJDaXBoZXIuQUVTIik7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gcHJvdmlkZXJzIHN1cHBvcnQgQ2lwaGVyLkFFUyIsIHByb3ZpZGVycyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gcHJvdmlkZXJzW2ldOworICAgICAgICAgICAgQ2lwaGVyIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZSgiQUVTIiwgcHJvdmlkZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIFByb3ZpZGVyIGNpcGhlclByb3ZpZGVyID0gY2lwaGVyLmdldFByb3ZpZGVyKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJDaXBoZXIgcHJvdmlkZXIgaXMgbm90IHRoZSBzYW1lIGFzIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICArICJwcm92aWRlZCBhcyBwYXJhbWV0ZXIgdG8gZ2V0SW5zdGFuY2UoKSIsIGNpcGhlclByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocHJvdmlkZXIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVyI2dldEFsZ29yaXRobSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBbGdvcml0aG0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsZ29yaXRobSA9ICJERVNlZGUvQ0JDL1BLQ1M1UGFkZGluZyI7CisKKyAgICAgICAgQ2lwaGVyIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgICAgICBhc3NlcnRUcnVlKCJDaXBoZXIgYWxnb3JpdGhtIGRvZXMgbm90IG1hdGNoIiwgY2lwaGVyLmdldEFsZ29yaXRobSgpCisgICAgICAgICAgICAgICAgLmVxdWFscyhhbGdvcml0aG0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXguY3J5cHRvLkNpcGhlciNnZXRCbG9ja1NpemUoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJsb2NrU2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QmxvY2tTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGdvcml0aG0gPSAiREVTZWRlL0NCQy9QS0NTNVBhZGRpbmciOworCisgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCbG9jayBzaXplIGRvZXMgbm90IG1hdGNoIiwgOCwgY2lwaGVyLmdldEJsb2NrU2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXguY3J5cHRvLkNpcGhlciNnZXRPdXRwdXRTaXplKGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0T3V0cHV0U2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0T3V0cHV0U2l6ZUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTZWN1cmVSYW5kb20gc3IgPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtICsgIi9FQ0IvUEtDUzVQYWRkaW5nIik7CisgICAgICAgIGNpcGhlci5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIGNpcGhlcktleSwgc3IpOworCisgICAgICAgIC8vIEEgMjUtYnl0ZSBpbnB1dCBjb3VsZCByZXN1bHQgaW4gYXQgbGVhc3QgNCA4LWJ5dGUgYmxvY2tzCisgICAgICAgIGludCByZXN1bHQgPSBjaXBoZXIuZ2V0T3V0cHV0U2l6ZSgyNSk7CisgICAgICAgIGFzc2VydFRydWUoIk91dHB1dCBzaXplIHRvbyBzbWFsbCIsIHJlc3VsdCA+IDMxKTsKKworICAgICAgICAvLyBBIDgtYnl0ZSBpbnB1dCBzaG91bGQgcmVzdWx0IGluIDIgOC1ieXRlIGJsb2NrcworICAgICAgICByZXN1bHQgPSBjaXBoZXIuZ2V0T3V0cHV0U2l6ZSg4KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT3V0cHV0IHNpemUgdG9vIHNtYWxsIiwgcmVzdWx0ID4gMTUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVyI2luaXQoaW50LCBqYXZhLnNlY3VyaXR5LktleSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLnNlY3VyaXR5LktleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9pbml0SUxqYXZhX3NlY3VyaXR5X0tleSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDaXBoZXIgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKGFsZ29yaXRobSArICIvRUNCL1BLQ1M1UGFkZGluZyIpOworICAgICAgICBjaXBoZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBjaXBoZXJLZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVyI2luaXQoaW50LCBqYXZhLnNlY3VyaXR5LktleSwKKyAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRJTGphdmFfc2VjdXJpdHlfS2V5TGphdmFfc2VjdXJpdHlfU2VjdXJlUmFuZG9tKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWN1cmVSYW5kb20gc3IgPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtICsgIi9FQ0IvUEtDUzVQYWRkaW5nIik7CisgICAgICAgIGNpcGhlci5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIGNpcGhlcktleSwgc3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVyI2luaXQoaW50LCBqYXZhLnNlY3VyaXR5LktleSwKKyAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRJTGphdmFfc2VjdXJpdHlfS2V5TGphdmFfc2VjdXJpdHlfc3BlY19BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWN1cmVSYW5kb20gc3IgPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisgICAgICAgIENpcGhlciBjaXBoZXIgPSBudWxsOworCisgICAgICAgIGJ5dGVbXSBpdiA9IG51bGw7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgaXZBVlAgPSBudWxsOworCisgICAgICAgIGl2ID0gbmV3IGJ5dGVbOF07CisgICAgICAgIHNyLm5leHRCeXRlcyhpdik7CisgICAgICAgIGl2QVZQID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhpdik7CisKKyAgICAgICAgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKGFsZ29yaXRobSArICIvQ0JDL1BLQ1M1UGFkZGluZyIpOworCisgICAgICAgIGNpcGhlci5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIGNpcGhlcktleSwgaXZBVlApOworCisgICAgICAgIGJ5dGVbXSBjaXBoZXJJViA9IGNpcGhlci5nZXRJVigpOworCisgICAgICAgIGFzc2VydFRydWUoIklWcyBkaWZmZXIiLCBBcnJheXMuZXF1YWxzKGNpcGhlcklWLCBpdikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVyI2luaXQoaW50LCBqYXZhLnNlY3VyaXR5LktleSwKKyAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMsCisgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdElMamF2YV9zZWN1cml0eV9LZXlMamF2YV9zZWN1cml0eV9zcGVjX0FsZ29yaXRobVBhcmFtZXRlclNwZWNMamF2YV9zZWN1cml0eV9TZWN1cmVSYW5kb20oKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNlY3VyZVJhbmRvbSBzciA9IG5ldyBTZWN1cmVSYW5kb20oKTsKKyAgICAgICAgQ2lwaGVyIGNpcGhlciA9IG51bGw7CisKKyAgICAgICAgYnl0ZVtdIGl2ID0gbnVsbDsKKyAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBpdkFWUCA9IG51bGw7CisKKyAgICAgICAgaXYgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgc3IubmV4dEJ5dGVzKGl2KTsKKyAgICAgICAgaXZBVlAgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKGl2KTsKKworICAgICAgICBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtICsgIi9DQkMvUEtDUzVQYWRkaW5nIik7CisKKyAgICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgY2lwaGVyS2V5LCBpdkFWUCwgc3IpOworCisgICAgICAgIGJ5dGVbXSBjaXBoZXJJViA9IGNpcGhlci5nZXRJVigpOworCisgICAgICAgIGFzc2VydFRydWUoIklWcyBkaWZmZXIiLCBBcnJheXMuZXF1YWxzKGNpcGhlcklWLCBpdikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVyI3VwZGF0ZShieXRlW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3VwZGF0ZSRCSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAxOyBpbmRleCA8IDQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIENpcGhlciBjID0gQ2lwaGVyLmdldEluc3RhbmNlKCJERVNFREUvQ0JDL1BLQ1M1UGFkZGluZyIpOworCisgICAgICAgICAgICBieXRlW10ga2V5TWF0ZXJpYWwgPSBsb2FkQnl0ZXMoImh5dHNfIiArICJkZXMtZWRlMy1jYmMudGVzdCIKKyAgICAgICAgICAgICAgICAgICAgKyBpbmRleCArICIua2V5Iik7CisgICAgICAgICAgICBERVNlZGVLZXlTcGVjIGtleVNwZWMgPSBuZXcgREVTZWRlS2V5U3BlYyhrZXlNYXRlcmlhbCk7CisgICAgICAgICAgICBTZWNyZXRLZXlGYWN0b3J5IHNrZiA9IFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIkRFU0VERSIpOworICAgICAgICAgICAgS2V5IGsgPSBza2YuZ2VuZXJhdGVTZWNyZXQoa2V5U3BlYyk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBpdk1hdGVyaWFsID0gbG9hZEJ5dGVzKCJoeXRzXyIgKyAiZGVzLWVkZTMtY2JjLnRlc3QiICsgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKyAiLml2Iik7CisgICAgICAgICAgICBJdlBhcmFtZXRlclNwZWMgaXYgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKGl2TWF0ZXJpYWwpOworCisgICAgICAgICAgICBjLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgaywgaXYpOworCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlWzI1Nl07CisgICAgICAgICAgICBTdHJpbmcgcmVzUGF0aCA9ICJoeXRzXyIgKyAiZGVzLWVkZTMtY2JjLnRlc3QiICsgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKyAiLmNpcGhlcnRleHQiOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRSZXNvdXJjZVN0cmVhbShyZXNQYXRoKTsKKworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQoaW5wdXQsIDAsIDI1Nik7CisgICAgICAgICAgICB3aGlsZSAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBjLnVwZGF0ZShpbnB1dCwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShvdXRwdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBieXRlc1JlYWQgPSBpcy5yZWFkKGlucHV0LCAwLCAyNTYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gYy5kb0ZpbmFsKCk7CisgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiYW9zLndyaXRlKG91dHB1dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVbXSBkZWNpcGhlcmVkQ2lwaGVyVGV4dCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBwbGFpbnRleHRCeXRlcyA9IGxvYWRCeXRlcygiaHl0c18iICsgImRlcy1lZGUzLWNiYy50ZXN0IgorICAgICAgICAgICAgICAgICAgICArIGluZGV4ICsgIi5wbGFpbnRleHQiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk9wZXJhdGlvbiBwcm9kdWNlZCBpbmNvcnJlY3QgcmVzdWx0cyIsIEFycmF5cy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dEJ5dGVzLCBkZWNpcGhlcmVkQ2lwaGVyVGV4dCkpOworICAgICAgICB9Ly8gZW5kIGZvcgorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5jcnlwdG8uQ2lwaGVyI2RvRmluYWwoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9GaW5hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2RvRmluYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAxOyBpbmRleCA8IDQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIENpcGhlciBjID0gQ2lwaGVyLmdldEluc3RhbmNlKCJERVNFREUvQ0JDL1BLQ1M1UGFkZGluZyIpOworCisgICAgICAgICAgICBieXRlW10ga2V5TWF0ZXJpYWwgPSBsb2FkQnl0ZXMoImh5dHNfIiArICJkZXMtZWRlMy1jYmMudGVzdCIKKyAgICAgICAgICAgICAgICAgICAgKyBpbmRleCArICIua2V5Iik7CisgICAgICAgICAgICBERVNlZGVLZXlTcGVjIGtleVNwZWMgPSBuZXcgREVTZWRlS2V5U3BlYyhrZXlNYXRlcmlhbCk7CisgICAgICAgICAgICBTZWNyZXRLZXlGYWN0b3J5IHNrZiA9IFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIkRFU0VERSIpOworICAgICAgICAgICAgS2V5IGsgPSBza2YuZ2VuZXJhdGVTZWNyZXQoa2V5U3BlYyk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBpdk1hdGVyaWFsID0gbG9hZEJ5dGVzKCJoeXRzXyIgKyAiZGVzLWVkZTMtY2JjLnRlc3QiICsgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKyAiLml2Iik7CisgICAgICAgICAgICBJdlBhcmFtZXRlclNwZWMgaXYgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKGl2TWF0ZXJpYWwpOworCisgICAgICAgICAgICBjLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgaywgaXYpOworCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlWzI1Nl07CisgICAgICAgICAgICBTdHJpbmcgcmVzUGF0aCA9ICJoeXRzXyIgKyAiZGVzLWVkZTMtY2JjLnRlc3QiICsgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKyAiLnBsYWludGV4dCI7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFJlc291cmNlU3RyZWFtKHJlc1BhdGgpOworCisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChpbnB1dCwgMCwgMjU2KTsKKyAgICAgICAgICAgIHdoaWxlIChieXRlc1JlYWQgPiAwKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIG91dHB1dCA9IGMudXBkYXRlKGlucHV0LCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiYW9zLndyaXRlKG91dHB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGlzLnJlYWQoaW5wdXQsIDAsIDI1Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gYy5kb0ZpbmFsKCk7CisgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiYW9zLndyaXRlKG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlW10gZW5jcnlwdGVkUGxhaW50ZXh0ID0gYmFvcy50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgaXMuY2xvc2UoKTsKKworICAgICAgICAgICAgYnl0ZVtdIGNpcGhlclRleHQgPSBsb2FkQnl0ZXMoImh5dHNfIiArICJkZXMtZWRlMy1jYmMudGVzdCIgKyBpbmRleAorICAgICAgICAgICAgICAgICAgICArICIuY2lwaGVydGV4dCIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiT3BlcmF0aW9uIHByb2R1Y2VkIGluY29ycmVjdCByZXN1bHRzIiwgQXJyYXlzLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkUGxhaW50ZXh0LCBjaXBoZXJUZXh0KSk7CisgICAgICAgIH0vLyBlbmQgZm9yCisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gbG9hZEJ5dGVzKFN0cmluZyByZXNQYXRoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFJlc291cmNlU3RyZWFtKHJlc1BhdGgpOworCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgIGludCByZWFkbGVuOworICAgICAgICAgICAgd2hpbGUgKChyZWFkbGVuID0gaXMucmVhZChidWZmKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmYsIDAsIHJlYWRsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENpcGhlciBjID0gQ2lwaGVyLmdldEluc3RhbmNlKCJERVMiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjLmdldFBhcmFtZXRlcnMoKSk7CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgaW50IHVwZGF0ZShieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZWJ5dGVBcnJheWludGludGJ5dGVBcnJheWludCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDaXBoZXIgYyA9IENpcGhlci5nZXRJbnN0YW5jZSgiREVTZWRlIik7CisgICAgICAgIGMuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBjaXBoZXJLZXkpOworICAgICAgICBieXRlW10gYiA9IHsxLDIsMyw0LDUsNiw3LDgsOSwxMH07CisgICAgICAgIGJ5dGVbXSBiMSA9IG5ldyBieXRlWzZdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYy51cGRhdGUoYiwgMCwgMTAsIGIxLCA1KTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4cGVjdGVkIFNob3J0QnVmZmVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNob3J0QnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGludCBkb0ZpbmFsKGJ5dGVbXSwgaW50LCBpbnQsIGJ5dGVbXSwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9GaW5hbGJ5dGVBcnJheWludGludGJ5dGVBcnJheWludCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDaXBoZXIgYyA9IENpcGhlci5nZXRJbnN0YW5jZSgiREVTZWRlIik7CisgICAgICAgIGMuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBjaXBoZXJLZXkpOworICAgICAgICBieXRlW10gYiA9IHsxLDIsMyw0LDUsNiw3LDgsOSwxMH07CisgICAgICAgIGJ5dGVbXSBiMSA9IG5ldyBieXRlWzZdOworICAgIC8vIEZJWE1FIEZhaWxlZCBvbiBCQyBwcm92aWRlcgorICAgIC8vICAgIHRyeSB7CisgICAgLy8gICAgICAgIGMuZG9GaW5hbChiLCAzLCA2LCBiMSwgNSk7CisgICAgLy8gICAgICAgIGZhaWwoIk5vIGV4cGVjdGVkIFNob3J0QnVmZmVyRXhjZXB0aW9uIik7CisgICAgLy8gICAgfSBjYXRjaCAoU2hvcnRCdWZmZXJFeGNlcHRpb24gZSkgeworICAgIC8vICAgIH0KKyAgICB9CisgICAgCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNrZWQgb25seS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhBbGxvd2VkS2V5TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNYXhBbGxvd2VkS2V5TGVuZ3RoKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDaXBoZXIuZ2V0TWF4QWxsb3dlZEtleUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoIi8vQ0JDL1BLQ1M1UGFkZGluIik7CisgICAgICAgICAgICBmYWlsKCJObyBleHBlY3RlZCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoIi9ERVMvQ0JDL1BLQ1M1UGFkZGluLzEiKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4cGVjdGVkIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNrZWQgb25seS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhBbGxvd2VkUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWF4QWxsb3dlZFBhcmFtZXRlclNwZWMoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDaXBoZXIuZ2V0TWF4QWxsb3dlZFBhcmFtZXRlclNwZWMobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJObyBleHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENpcGhlci5nZXRNYXhBbGxvd2VkUGFyYW1ldGVyU3BlYygiL0RFUy8vUEtDUzVQYWRkaW4iKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4cGVjdGVkIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDaXBoZXIuZ2V0TWF4QWxsb3dlZFBhcmFtZXRlclNwZWMoIi9ERVMvQ0JDLyAvMSIpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhwZWN0ZWQgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXguY3J5cHRvLkNpcGhlciNDaXBoZXIoQ2lwaGVyU3BpIGNpcGhlclNwaSwgUHJvdmlkZXIgcHJvdmlkZXIsCisgICAgICogICAgICAgIFN0cmluZyB0cmFuc2Zvcm1hdGlvbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaXBoZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguY3J5cHRvLkNpcGhlclNwaS5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9DdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhhcm1vbnktMTE4NAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IHRlc3RDaXBoZXIobnVsbCwgbnVsbCwgInMiKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IHRlc3RDaXBoZXIobmV3IE15Q2lwaGVyKCksIG51bGwsICJzIik7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCBmb3IgJ251bGwnIHByb3ZpZGVyIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IHRlc3RDaXBoZXIobnVsbCwgbmV3IFByb3ZpZGVyKCJxd2VydHkiLCAxLjAsICJxd2VydHkiKSB7fSwgInMiKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIGZvciAnbnVsbCcgY2lwaGVyU3BpIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyB0ZXN0Q2lwaGVyIGV4dGVuZHMgQ2lwaGVyIHsKKyAgICAgICAgdGVzdENpcGhlcihDaXBoZXJTcGkgYywgUHJvdmlkZXIgcCwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMsIHAsIHMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9UZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9FbmNyeXB0ZWRQcml2YXRlS2V5SW5mb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBiYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9UZXN0LmphdmEKQEAgLTAsMCArMSwyMzAyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5QS0NTOEVuY29kZWRLZXlTcGVjOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uQmFkUGFkZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOworaW1wb3J0IGphdmF4LmNyeXB0by5FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yOworaW1wb3J0IGphdmF4LmNyeXB0by5Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5OworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlBCRUtleVNwZWM7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUEJFUGFyYW1ldGVyU3BlYzsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydC5FbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8uY2xhc3MpCisvKioKKyAqIFRlc3QgZm9yIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIGNsYXNzLgorICogCisgKiBBbGwgYmluYXJ5IGRhdGEgZm9yIHRoaXMgdGVzdCB3ZXJlIGdlbmVyYXRlZCB1c2luZyBCRUEgSlJvY2tpdCBqMnNkazEuNC4yXzA0CisgKiAoaHR0cDovL3d3dy5iZWEuY29tKSB3aXRoIHNlY3VyaXR5IHByb3ZpZGVycyBsaXN0IGV4dGVuZGVkIGJ5IEJvdW5jeSBDYXN0bGUncworICogb25lIChodHRwOi8vd3d3LmJvdW5jeWNhc3RsZS5vcmcpCisgKi8KK3B1YmxpYyBjbGFzcyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm92aWRlcltdIHByb3ZpZGVyID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBBbGdvcml0aG0gbmFtZXMvdHJhbnNmb3JtYXRpb25zIHVzZWQgaW4gcm91bmR0cmlwIHRlc3RzIG9mCisgICAgICogZ2V0S2V5U3BlYyguLi4pIG1ldGhvZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIGFsZ05hbWUgPSB7CisgICAgLy8gQUVTCisgICAgICAgICAgICB7ICJBRVMiLCBudWxsIH0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiQUVTIiwgIkFFUy9FQ0IvUEtDUzVQYWRkaW5nIn0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiQUVTIiwgIkFFUy9DQkMvUEtDUzVQYWRkaW5nIn0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiQUVTIiwgIkFFUy9PRkIvUEtDUzVQYWRkaW5nIn0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiQUVTIiwgIkFFUy9DRkIvUEtDUzVQYWRkaW5nIn0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiMi4xNi44NDAuMS4xMDEuMy40LjEuMSIsIG51bGx9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IjIuMTYuODQwLjEuMTAxLjMuNC4xLjIiLCBudWxsfSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4zIiwgbnVsbH0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiMi4xNi44NDAuMS4xMDEuMy40LjEuNCIsIG51bGx9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IjIuMTYuODQwLjEuMTAxLjMuNC4xLjUiLCBudWxsfSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMSIsIG51bGx9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IjIuMTYuODQwLjEuMTAxLjMuNC4xLjIyIiwgbnVsbH0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiMi4xNi44NDAuMS4xMDEuMy40LjEuMjMiLCBudWxsfSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yNCIsIG51bGx9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IjIuMTYuODQwLjEuMTAxLjMuNC4xLjI1IiwgbnVsbH0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiMi4xNi44NDAuMS4xMDEuMy40LjEuNDEiLCBudWxsfSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MiIsIG51bGx9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IjIuMTYuODQwLjEuMTAxLjMuNC4xLjQzIiwgbnVsbH0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiMi4xNi44NDAuMS4xMDEuMy40LjEuNDQiLCBudWxsfSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40NSIsIG51bGx9LAorCisgICAgICAgICAgICAvLyBCbG93ZmlzaAorICAgICAgICAgICAgLy8gTk8gT0lEcyBmb3IgQmxvd2Zpc2ggZGVmaW5lZCAoPykKKyAgICAgICAgICAgIHsgIkJsb3dmaXNoIiwgbnVsbCB9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IkJsb3dmaXNoIiwiQmxvd2Zpc2gvQ0JDL1BLQ1M1UGFkZGluZyJ9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IkJsb3dmaXNoIiwiQmxvd2Zpc2gvQ0ZCL1BLQ1M1UGFkZGluZyJ9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IkJsb3dmaXNoIiwiQmxvd2Zpc2gvT0ZCL1BLQ1M1UGFkZGluZyJ9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IkJsb3dmaXNoIiwiQmxvd2Zpc2gvUENCQy9QS0NTNVBhZGRpbmcifSwKKworICAgICAgICAgICAgLy8gREVTOiBPSVcgT0lEcyBvbmx5CisgICAgICAgICAgICAvLyB7aXNvKDEpIGlkZW50aWZpZWQtb3JnYW5pemF0aW9uKDMpIG9pdygxNCkgc2Vjc2lnKDMpCisgICAgICAgICAgICAvLyBhbGdvcml0aG1zKDIpIGRlc0VDQig2KX0KKyAgICAgICAgICAgIC8vIDEuMy4xNC4zLjIuNgorICAgICAgICAgICAgLy8gMS4zLjE0LjMuMi43CisgICAgICAgICAgICAvLyAxLjMuMTQuMy4yLjgKKyAgICAgICAgICAgIC8vIDEuMy4xNC4zLjIuOQorICAgICAgICAgICAgeyAiREVTIiwgbnVsbCB9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IkRFUyIsICJERVMvQ0JDL1BLQ1M1UGFkZGluZyJ9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IkRFUyIsIkRFUy9DRkIvUEtDUzVQYWRkaW5nIn0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiREVTIiwiREVTL09GQi9QS0NTNVBhZGRpbmcifSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyJERVMiLCJERVMvUENCQy9QS0NTNVBhZGRpbmcifSwKKworICAgICAgICAgICAgLy8gREVTZWRlICg9VHJpcGxlRGVzKQorICAgICAgICAgICAgLy97aXNvKDEpIGlkZW50aWZpZWQtb3JnYW5pemF0aW9uKDMpIG9pdygxNCkgc2Vjc2lnKDMpCisgICAgICAgICAgICAvLyBhbGdvcml0aG1zKDIpIGRlc0VERSgxNyl9CisgICAgICAgICAgICAvLyAxLjMuMTQuMy4yLjE3CisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiREVTZWRlIixudWxsfSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyJERVNlZGUiLCJERVNlZGUvQ0JDL1BLQ1M1UGFkZGluZyJ9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IkRFU2VkZSIsIkRFU2VkZS9DRkIvUEtDUzVQYWRkaW5nIn0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiREVTZWRlIiwiREVTZWRlL09GQi9QS0NTNVBhZGRpbmcifSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyJERVNlZGUiLCJERVNlZGUvUENCQy9QS0NTNVBhZGRpbmcifSwKKyAgICAgICAgICAgIHsgIlRyaXBsZURFUyIsIG51bGwgfSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyJUcmlwbGVERVMiLCJUcmlwbGVERVMvQ0JDL1BLQ1M1UGFkZGluZyJ9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IlRyaXBsZURFUyIsIlRyaXBsZURFUy9DRkIvUEtDUzVQYWRkaW5nIn0sCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiVHJpcGxlREVTIiwiVHJpcGxlREVTL09GQi9QS0NTNVBhZGRpbmcifSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyJUcmlwbGVERVMiLCJUcmlwbGVERVMvUENCQy9QS0NTNVBhZGRpbmcifSwKKworICAgICAgICAgICAgLy8gUEJFV2l0aDxkaWdlc3Q+QW5kPGVuY3J5cHRpb24+CisgICAgICAgICAgICB7ICJQQkVXaXRoTUQ1QW5kVHJpcGxlREVTIiwgbnVsbCB9LAorICAgICAgICAgICAgLy8ge2lzbygxKSBtZW1iZXItYm9keSgyKSB1cyg4NDApIHJzYWRzaSgxMTM1NDkpIHBrY3MoMSkgcGtjcy01KDUpCisgICAgICAgICAgICAvLyBwYmVXaXRoTUQ1QW5kREVTLUNCQygzKX0KKyAgICAgICAgICAgIHsgIlBCRVdpdGhNRDVBbmRERVMiLCAiUEJFV2l0aE1ENUFuZERFUy9DQkMvUEtDUzVQYWRkaW5nIiB9LAorICAgICAgICAgICAgeyAiUEJFV2l0aE1ENUFuZERFUyIsIG51bGwgfSwgeyAiUEJFV2l0aEhtYWNTSEExQW5kREVTZWRlIiwgbnVsbCB9LAorICAgICAgICAgICAgLy8gbW9yZSBvaWRzOgorICAgICAgICAgICAgLy8ge2lzbygxKSBtZW1iZXItYm9keSgyKSB1cyg4NDApIG5vcnRlbG5ldHdvcmtzKDExMzUzMykgZW50cnVzdCg3KQorICAgICAgICAgICAgLy8gYWxnb3JpdGhtcyg2NikgcGJlV2l0aE1ENUFuZENBU1Q1LUNCQygxMil9CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gYWxzbyBuYW1lZCBwYmVXaXRoU0hBQW5kMTI4Qml0UkM0LCBwYmVXaXRoU0hBMUFuZDEyOEJpdFJDNDoKKyAgICAgICAgICAgIC8vIHtpc28oMSkgbWVtYmVyLWJvZHkoMikgdXMoODQwKSByc2Fkc2koMTEzNTQ5KSBwa2NzKDEpIHBrY3MtMTIoMTIpCisgICAgICAgICAgICAvLyBwa2NzLTEyLVBiZUlkcygxKSBwa2NzLTEyLU9mZmxpbmVUcmFuc3BvcnRNb2RlKDEpfQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHtpc28oMSkgbWVtYmVyLWJvZHkoMikgdXMoODQwKSByc2Fkc2koMTEzNTQ5KSBwa2NzKDEpIHBrY3MtMTIoMTIpCisgICAgICAgICAgICAvLyBwa2NzLTEyLVBiZUlkcygxKX0gKworICAgICAgICAgICAgLy8gcGJlV2l0aFNIQUFuZDQwQml0UkM0KDIpIHBiZVdpdGhTSEFBbmQzLUtleVRyaXBsZURFUy1DQkMoMykKKyAgICAgICAgICAgIC8vIHBiZVdpdGhTSEFBbmQyLUtleVRyaXBsZURFUy1DQkMoNCkgcGJlV2l0aFNIQUFuZDEyOEJpdFJDMi1DQkMoNSkKKyAgICAgICAgICAgIC8vIHBiZVdpdGhTSEFBbmQ0MEJpdFJDMi1DQkMoNikKKworICAgICAgICAgICAgLy8gRGlmZmllSGVsbG1hbgorICAgICAgICAgICAgeyAiRGlmZmllSGVsbG1hbiIsIG51bGwgfSwgLy8gMS4yLjg0MC4xMDA0Ni4yLjEKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgeyJESCIsbnVsbH0sIC8vIDEuMi44NDAuMTAwNDYuMi4xCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMS4zLjEiLCBudWxsfSwKKworICAgICAgICAgICAgeyAiRFNBIiwgbnVsbCB9LCAvLyAxLjIuODQwLjEwMDQwLjQuMQorCisgICAgICAgICAgICB7ICJSQzIiLCBudWxsIH0sCisKKyAgICAgICAgICAgIHsgIlJDNCIsIG51bGwgfSwKKworICAgICAgICAgICAgeyAiUkM1IiwgbnVsbCB9LAorCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMS4xMi4xLjEiLG51bGx9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjEuMTIuMS4yIixudWxsfSwKKyAgICAgICAgICAgIHsgIjEuMi44NDAuMTEzNTQ5LjEuMTIuMS4zIiwgbnVsbCB9LAorICAgICAgICAgICAgeyAiUEJFV2l0aFNIQTFBbmRERVNlZGUiLCBudWxsIH0sCisgICAgLy8gICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjEuMTIuMS40IixudWxsfSwKKyAgICAvLyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMS4xMi4xLjUiLG51bGx9LAorICAgIC8vICAgICAgICAgICAgeyIxLjIuODQwLjExMzU0OS4xLjEyLjEuNiIsbnVsbH0sCisgICAgLy8gICAgICAgICAgICB7IkVMR0FNQUwvUEtDUzEiLCAiRUxHQU1BTC9FQ0IvUEtDUzFQQURESU5HIn0sCisgICAgLy8gICAgICAgICAgICB7IkVMR0FNQUwvUEtDUzEiLCJFTEdBTUFML05PTkUvUEtDUzFQQURESU5HIn0sCisgICAgLy8gICAgICAgICAgICB7IlBCRVdJVEhTSEFBTkQzLUtFWVRSSVBMRURFUy1DQkMiLCBudWxsfSwKKyAgICAvLyAgICAgICAgICAgIHsiUEJFV0lUSFNIQTFBTkRERVNFREUiLCBudWxsfSwKKyAgICAvLyAgICAgICAgICAgIHsiUEJFV2l0aFNIQUFuZDNLZXlUcmlwbGVERVMiLG51bGx9LAorICAgIC8vICAgICAgICAgICAgeyJQQkVXSVRIU0hBQU5EMy1LRVlUUklQTEVERVMtQ0JDIixudWxsfSwKKyAgICAvLworICAgIC8vICAgICAgICAgICAgeyJSQzUtMzIiLG51bGx9LAorICAgIC8vCisgICAgLy8gICAgICAgICAgICB7IlJTQS8xIiwgIlJTQS8xL1BLQ1MxUEFERElORyJ9LAorICAgIC8vICAgICAgICAgICAgeyJSU0EvMiIsICJSU0EvMi9QS0NTMVBBRERJTkcifSwKKyAgICAvLyAgICAgICAgICAgIHsiUlNBL0lTTzk3OTYtMSIsICJSU0EvRUNCL0lTTzk3OTYtMVBBRERJTkcifSwKKyAgICAvLyAgICAgICAgICAgIHsiUlNBIiwgIlJTQS9FQ0IvTk9QQURESU5HIn0sCisgICAgLy8gICAgICAgICAgICB7IlJTQS9PQUVQIiwgIlJTQS9FQ0IvT0FFUFBBRERJTkcifSwKKyAgICAvLyAgICAgICAgICAgIHsiUlNBL1BLQ1MxIiwgIlJTQS9FQ0IvUEtDUzFQQURESU5HIn0sCisgICAgLy8gICAgICAgICAgICB7IlJTQS9JU085Nzk2LTEiLCAiUlNBL05PTkUvSVNPOTc5Ni0xUEFERElORyJ9LAorICAgIC8vICAgICAgICAgICAgeyJSU0EiLCAiUlNBL05PTkUvTk9QQURESU5HIn0sCisgICAgLy8gICAgICAgICAgICB7IlJTQS9PQUVQIiwgIlJTQS9OT05FL09BRVBQQURESU5HIn0sCisgICAgLy8gICAgICAgICAgICB7IlJTQS9QS0NTMSIsICJSU0EvTk9ORS9QS0NTMVBBRERJTkcifSwKKyAgICAvLyAgICAgICAgICAgIHsiUlNBIixudWxsfSwgLy8gMS4yLjg0MC4xMTM1NDkuMS4xLjEKKyAgICAvLyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMS4xLjEiLCBudWxsfSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiA8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIDxjb2RlPkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvPC9jb2RlPiBpbnN0YW5jZSA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB2YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCA8YnI+CisgICAgICogRXhwZWN0ZWQ6IG11c3QgcGFzcyB3aXRob3V0IGFueSBleGNlcHRpb25zCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvYnl0ZUFycmF5MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgLmdldFZhbGlkRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9FbmNvZGluZygiREgiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiA8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4gaWYgZW5jb2RpbmcgaXMKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IDxjb2RlPm51bGw8L2NvZGU+IHBhc3NlZCBhcyBhIHBhcmFtZXRlciA8YnI+CisgICAgICogRXhwZWN0ZWQ6IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb2J5dGVBcnJheTIoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiA8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4gaWYgZW5jb2RpbmcgaXMgd3JvbmcgPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogd3JvbmcgZW5jb2RpbmcgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIDxicj4KKyAgICAgKiBFeHBlY3RlZDogPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RW5jcnlwdGVkUHJpdmF0ZUtleUluZm9ieXRlQXJyYXkzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKG5ldyBieXRlWzBdKTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogSU9FeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiA8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4gaWYgZW5jb2RpbmcgaXMgd3JvbmcgPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogd3JvbmcgZW5jb2RpbmcgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIDxicj4KKyAgICAgKiBFeHBlY3RlZDogPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RW5jcnlwdGVkUHJpdmF0ZUtleUluZm9ieXRlQXJyYXk0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgICAgICAgICAxMCB9KTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogSU9FeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiA8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4gaWYgZW5jb2RpbmcgaXMgd3JvbmcgPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogd3JvbmcgZW5jb2RpbmcgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIDxicj4KKyAgICAgKiBFeHBlY3RlZDogPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RW5jcnlwdGVkUHJpdmF0ZUtleUluZm9ieXRlQXJyYXk1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBlbmMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gMTogZ2V0IHZhbGlkIGVuY29kaW5nCisgICAgICAgICAgICBlbmMgPSBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEKKyAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9FbmNvZGluZygiRFNBIik7CisKKyAgICAgICAgICAgIC8vIC4uLiBhbmQgY29ycnVwdCBpdCAoc2V0IHdyb25nIGFsZyBPSUQgbGVuZ3RoKQorICAgICAgICAgICAgZW5jWzldID0gKGJ5dGUpIDY7CisKKyAgICAgICAgICAgIG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhlbmMpOworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiKDEpOiBJT0V4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gMjogZ2V0IHZhbGlkIGVuY29kaW5nCisgICAgICAgICAgICBlbmMgPSBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEKKyAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9FbmNvZGluZygiRFNBIik7CisgICAgICAgICAgICAvLyAuLi4gYW5kIGNvcnJ1cHQgaXQgKHNldCB3cm9uZyBlbmNyeXB0ZWQgZGF0YSB0YWcpCisgICAgICAgICAgICBlbmNbMzA3XSA9IChieXRlKSA2OworICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGVuYyk7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICIoMik6IElPRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAzOiBnZXQgdmFsaWQgZW5jb2RpbmcKKyAgICAgICAgICAgIGVuYyA9IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YQorICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0VuY29kaW5nKCJEU0EiKTsKKyAgICAgICAgICAgIC8vIC4uLiBhbmQgY29ycnVwdCBpdCAoc2V0IHdyb25nIGVuY3J5cHRlZCBkYXRhIGxlbmd0aCkKKyAgICAgICAgICAgIGVuY1szMTBdID0gKGJ5dGUpIDE7CisgICAgICAgICAgICBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oZW5jKTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIigzKTogSU9FeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIDQ6IGdldCB2YWxpZCBlbmNvZGluZworICAgICAgICAgICAgZW5jID0gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRW5jb2RpbmcoIkRTQSIpOworICAgICAgICAgICAgLy8gLi4uIGFuZCBjb3JydXB0IGl0IChzZXQgd3JvbmcgdGFnIGZvciBhbGcgcGFyYW1zIHNlcXVlbmNlKQorICAgICAgICAgICAgZW5jWzE3XSA9IChieXRlKSAweDI5OworICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhlbmMpOworCisgICAgICAgICAgICBpZiAoZXBraS5nZXRBbGdQYXJhbWV0ZXJzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMga2luZCBvZiBlbmNvZGluZyBjb3JydXB0aW9uIGNhbgorICAgICAgICAgICAgICAgIC8vIGJlIG9ubHkgZGV0ZXJtaW5lZCB3aGlsZSBBbGdvcml0aG1QYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gQlVUIE5vIEFsZ29yaXRobVBhcmFtZXRlcnMgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgZm9yIGFsZ05hbWUwW2ldWzBdLgorICAgICAgICAgICAgICAgIC8vIFNvIGp1c3Qgc2tpcCB0aGlzIHN1YiB0ZXN0CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIig0KTogSU9FeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gNTogZ2V0IHZhbGlkIGVuY29kaW5nCisgICAgICAgICAgICBlbmMgPSBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEKKyAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9FbmNvZGluZygiRFNBIik7CisgICAgICAgICAgICAvLyAuLi4gYW5kIGNvcnJ1cHQgaXQgKHNldCB3cm9uZyBsZW5ndGggZm9yIGFsZyBwYXJhbXMgc2VxdWVuY2UpCisgICAgICAgICAgICBlbmNbMjBdID0gKGJ5dGUpIDB4MWQ7CisgICAgICAgICAgICBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oZW5jKTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIig1KTogSU9FeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIDY6IGdldCB2YWxpZCBlbmNvZGluZworICAgICAgICAgICAgZW5jID0gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRW5jb2RpbmcoIkRTQSIpOworICAgICAgICAgICAgLy8gLi4uIGFuZCBjb3JydXB0IGl0IChzZXQgd3JvbmcgbGVuZ3RoIGZvciBhbGcgcGFyYW1zIHNlcXVlbmNlKQorICAgICAgICAgICAgZW5jWzIwXSA9IChieXRlKSAweDFmOworICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGVuYyk7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICIoNik6IElPRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzYgZm9yIDxjb2RlPkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGJ5dGVbXSk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogPGJyPgorICAgICAqIEFzc2VydGlvbjogYnl0ZSBhcnJheSBpcyBjb3BpZWQgdG8gcHJldmVudCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB2YWxpZCBhcnJheSBwYXNzZWQgdGhlbiBtb2RpZmllZCA8YnI+CisgICAgICogRXhwZWN0ZWQ6IGdldEVuY29kZWQoKSwgaW52b2tlZCBhZnRlciBhYm92ZSBtb2RpZmljYXRpb24sIG11c3QgcmV0dXJuCisgICAgICogYXJyYXkgYXMgaXQgd2FzIGJlZm9yZSB0aGUgbW9kaWZpY2F0aW9uCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvYnl0ZUFycmF5NigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZW5jb2RlZCA9IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YQorICAgICAgICAgICAgICAgIC5nZXRWYWxpZEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRW5jb2RpbmcoIkRTQSIpOworICAgICAgICBieXRlW10gZW5jb2RlZENvcHkgPSBlbmNvZGVkLmNsb25lKCk7CisgICAgICAgIC8vIHBhc3MgdmFsaWQgYXJyYXkKKyAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhlbmNvZGVkQ29weSk7CisgICAgICAgIC8vIG1vZGlmeSBhcnJheSBwYXNzZWQKKyAgICAgICAgZW5jb2RlZENvcHlbOV0gPSAoYnl0ZSkgNjsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbnRlcm5hbCBzdGF0ZSBoYXMgbm90IGJlZW4gYWZmZWN0ZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGVuY29kZWQsIGVwa2kuZ2V0RW5jb2RlZCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oU3RyaW5nLCBieXRlW10pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIDxicj4KKyAgICAgKiBBc3NlcnRpb246IGNyZWF0ZXMgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm88L2NvZGU+IGluc3RhbmNlIDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkIDxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCBwYXNzIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKFN0cmluZywgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb1N0cmluZ2J5dGVBcnJheTEoKSB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEpOworICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhTdHJpbmcsIGJ5dGVbXSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+Tm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uPC9jb2RlPi0gaWYgdGhlIHNwZWNpZmllZAorICAgICAqIGFsZ29yaXRobSBpcyBub3Qgc3VwcG9ydGVkIDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHBhc3Mgbm9uZXhpc3RlbnQgYWxnb3JpdGhtIG5hbWUgPGJyPgorICAgICAqIEV4cGVjdGVkOiA8Y29kZT5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb248L2NvZGU+CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKFN0cmluZywgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb1N0cmluZ2J5dGVBcnJheTIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oImJsYS1ibGEiLAorICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSk7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygiIiwKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEpOworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKFN0cmluZywgYnl0ZVtdKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciA8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4tIGlmIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhbGdvcml0aG0gb3IgZW5jcnlwdGVkIGRhdGEgaXMgPGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBwYXNzIDxjb2RlPm51bGw8L2NvZGU+IGFzIGFsZ29yaXRobSBuYW1lIHRoZW4gYXMKKyAgICAgKiBlbmNyeXB0ZWQgZGF0YSA8YnI+CisgICAgICogRXhwZWN0ZWQ6IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiBpbiBib3RoIGNhc2VzCisgICAgICogCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oU3RyaW5nLCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvU3RyaW5nYnl0ZUFycmF5MygpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcGFzcyBudWxsIGFzIG5hbWUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygoU3RyaW5nKSBudWxsLAorICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSk7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IE51bGxQb2ludGVyRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhc3MgbnVsbCBhcyBlbmNyeXB0ZWQgZGF0YQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKCJEU0EiLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oU3RyaW5nLCBieXRlW10pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIDxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4tIGlmIGVuY3J5cHRlZCBkYXRhIGlzCisgICAgICogZW1wdHksIGkuZS4gMC1sZW5ndGggPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogcGFzcyBlbXB0eSBlbmNyeXB0ZWQgZGF0YSA8YnI+CisgICAgICogRXhwZWN0ZWQ6IDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oU3RyaW5nLCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvU3RyaW5nYnl0ZUFycmF5NCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygiRFNBIiwgbmV3IGJ5dGVbXSB7fSk7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IgPGNvZGU+RW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oU3RyaW5nLCBieXRlW10pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIDxicj4KKyAgICAgKiBBc3NlcnRpb246IGJ5dGUgYXJyYXkgaXMgY29waWVkIHRvIHByZXZlbnQgc3Vic2VxdWVudCBtb2RpZmljYXRpb24gPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdmFsaWQgYXJyYXkgcGFzc2VkIHRoZW4gbW9kaWZpZWQgPGJyPgorICAgICAqIEV4cGVjdGVkOiBnZXRFbmNyeXB0ZWREYXRhKCksIGludm9rZWQgYWZ0ZXIgYWJvdmUgbW9kaWZpY2F0aW9uLCBtdXN0CisgICAgICogcmV0dXJuIGFycmF5IGFzIGl0IHdhcyBiZWZvcmUgdGhlIG1vZGlmaWNhdGlvbgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oU3RyaW5nLCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvU3RyaW5nYnl0ZUFycmF5NSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGVuY3J5cHRlZERhdGFDb3B5ID0gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEKKyAgICAgICAgICAgICAgICAuY2xvbmUoKTsKKyAgICAgICAgLy8gcGFzcyB2YWxpZCBhcnJheQorICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKCJEU0EiLAorICAgICAgICAgICAgICAgIGVuY3J5cHRlZERhdGFDb3B5KTsKKyAgICAgICAgLy8gbW9kaWZ5IGFycmF5IHBhc3NlZAorICAgICAgICBlbmNyeXB0ZWREYXRhQ29weVswXSA9IChieXRlKSA2OworICAgICAgICAvLyBjaGVjayB0aGF0IGludGVybmFsIHN0YXRlIGhhcyBub3QgYmVlbiBhZmZlY3RlZAorICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEsCisgICAgICAgICAgICAgICAgZXBraS5nZXRFbmNyeXB0ZWREYXRhKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXgvY3J5cHRvL0VuY3J5cHRlZFByaXZhdGVLZXlJbmZvKFN0cmluZywgYnl0ZVtdKQorICAgICAqIENoZWNrcyBleGNlcHRpb24gb3JkZXIKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oU3RyaW5nLCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvU3RyaW5nYnl0ZUFycmF5NigpIHsKKyAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTc2OAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKCIwIiwgbmV3IGJ5dGVbXSB7fSk7CisgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvcgorICAgICAqIDxjb2RlPkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycywgYnl0ZVtdKQorICAgICAqIDwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciA8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIDxjb2RlPkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvPC9jb2RlPiBpbnN0YW5jZSA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB2YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCA8YnI+CisgICAgICogRXhwZWN0ZWQ6IG11c3QgcGFzcyB3aXRob3V0IGFueSBleGNlcHRpb25zCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSBjaGVja2VkLiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gc2hvdWxkIGJlIHRlc3RlZCBmb3IgY29tcGxldGUgdGVzdHMgc3Vic2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycy5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RW5jcnlwdGVkUHJpdmF0ZUtleUluZm9BbGdvcml0aG1QYXJhbWV0ZXJzYnl0ZUFycmF5MSgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnMgYXAgPSBBbGdvcml0aG1QYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdKTsKKyAgICAgICAgICAgICAgICAvLyB1c2UgcHJlZ2VuZXJhdGVkIEFsZ29yaXRobVBhcmFtZXRlcnMgZW5jb2RpbmdzCisgICAgICAgICAgICAgICAgYXAuaW5pdChFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZ2V0UGFyYW1ldGVyc0VuY29kaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdKSk7CisKKyAgICAgICAgICAgICAgICBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSk7CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvcgorICAgICAqIDxjb2RlPkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycywgYnl0ZVtdKQorICAgICAqIDwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciA8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4tIGlmIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhbGdvcml0aG0gcGFyYW1ldGVycyBvciBlbmNyeXB0ZWQgZGF0YSBpcyA8Y29kZT5udWxsPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHBhc3MgPGNvZGU+bnVsbDwvY29kZT4gYXMgYWxnb3JpdGhtIHBhcmFtZXRlcnMgdGhlbgorICAgICAqIGFzIGVuY3J5cHRlZCBkYXRhIDxicj4KKyAgICAgKiBFeHBlY3RlZDogPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+IGluIGJvdGggY2FzZXMKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0FsZ29yaXRobVBhcmFtZXRlcnNieXRlQXJyYXkyKCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gMTogcGFzcyBudWxsIGFzIEFsZ29yaXRobVBhcmFtZXRlcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygoQWxnb3JpdGhtUGFyYW1ldGVycykgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEpOworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyAyOiBwYXNzIG51bGwgYXMgZW5jcnlwdGVkIGRhdGEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnMgYXAgPSBBbGdvcml0aG1QYXJhbWV0ZXJzLmdldEluc3RhbmNlKCJEU0EiKTsKKyAgICAgICAgICAgIC8vIHVzZSBwcmVnZW5lcmF0ZWQgQWxnb3JpdGhtUGFyYW1ldGVycyBlbmNvZGluZ3MKKyAgICAgICAgICAgIGFwLmluaXQoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmdldFBhcmFtZXRlcnNFbmNvZGluZygiRFNBIikpOworICAgICAgICAgICAgbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGFwLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IKKyAgICAgKiA8Y29kZT5FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMsIGJ5dGVbXSkKKyAgICAgKiA8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPi0gaWYgZW5jcnlwdGVkIGRhdGEgaXMKKyAgICAgKiBlbXB0eSwgaS5lLiAwLWxlbmd0aCA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBwYXNzIGVtcHR5IGVuY3J5cHRlZCBkYXRhIDxicj4KKyAgICAgKiBFeHBlY3RlZDogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPgorICAgICAqIAorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0FsZ29yaXRobVBhcmFtZXRlcnNieXRlQXJyYXkzKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVycyBhcCA9IEFsZ29yaXRobVBhcmFtZXRlcnMuZ2V0SW5zdGFuY2UoIkRTQSIpOworICAgICAgICAgICAgLy8gdXNlIHByZWdlbmVyYXRlZCBBbGdvcml0aG1QYXJhbWV0ZXJzIGVuY29kaW5ncworICAgICAgICAgICAgYXAuaW5pdChFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZ2V0UGFyYW1ldGVyc0VuY29kaW5nKCJEU0EiKSk7CisKKyAgICAgICAgICAgIG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhhcCwgbmV3IGJ5dGVbXSB7fSk7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvcgorICAgICAqIDxjb2RlPkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycywgYnl0ZVtdKQorICAgICAqIDwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciA8YnI+CisgICAgICogQXNzZXJ0aW9uOiBieXRlIGFycmF5IGlzIGNvcGllZCB0byBwcmV2ZW50IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uIDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHZhbGlkIGFycmF5IHBhc3NlZCB0aGVuIG1vZGlmaWVkIDxicj4KKyAgICAgKiBFeHBlY3RlZDogZ2V0RW5jcnlwdGVkRGF0YSgpLCBpbnZva2VkIGFmdGVyIGFib3ZlIG1vZGlmaWNhdGlvbiwgbXVzdAorICAgICAqIHJldHVybiBhcnJheSBhcyBpdCB3YXMgYmVmb3JlIHRoZSBtb2RpZmljYXRpb24KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0FsZ29yaXRobVBhcmFtZXRlcnNieXRlQXJyYXk0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJzIGFwID0gQWxnb3JpdGhtUGFyYW1ldGVycy5nZXRJbnN0YW5jZSgiRFNBIik7CisgICAgICAgIC8vIHVzZSBwcmVnZW5lcmF0ZWQgQWxnb3JpdGhtUGFyYW1ldGVycyBlbmNvZGluZ3MKKyAgICAgICAgYXAuaW5pdChFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZ2V0UGFyYW1ldGVyc0VuY29kaW5nKCJEU0EiKSk7CisKKyAgICAgICAgYnl0ZVtdIGVuY3J5cHRlZERhdGFDb3B5ID0gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEuY2xvbmUoKTsKKyAgICAgICAgLy8gcGFzcyB2YWxpZCBhcnJheQorICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGFwLAorICAgICAgICAgICAgICAgIGVuY3J5cHRlZERhdGFDb3B5KTsKKworICAgICAgICAvLyBtb2RpZnkgYXJyYXkgcGFzc2VkCisgICAgICAgIGVuY3J5cHRlZERhdGFDb3B5WzBdID0gKGJ5dGUpIDY7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbnRlcm5hbCBzdGF0ZSBoYXMgbm90IGJlZW4gYWZmZWN0ZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhLAorICAgICAgICAgICAgICAgIGVwa2kuZ2V0RW5jcnlwdGVkRGF0YSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0QWxnUGFyYW1ldGVycygpPC9jb2RlPiBtZXRob2QgPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgYWxnb3JpdGhtIHBhcmFtZXRlcnMgPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdGVzdCBvYmplY3QgY3JlYXRlZCB1c2luZyBjdG9yIHdoaWNoIHRha2VzIGVuY29kZWQKKyAgICAgKiBmb3JtIGFzIHRoZSBvbmx5IHBhcmFtZXRlcjsgZW5jb2RlZCBmb3JtIHBhc3NlZCBjb250YWlucyBhbGdvcml0aG0KKyAgICAgKiBwYXJhbWV0ZXJzIGVuY29kaW5nIDxicj4KKyAgICAgKiBFeHBlY3RlZDogY29ycmVzcG9uZGluZyBhbGdvcml0aG0gcGFyYW1ldGVycyBtdXN0IGJlIHJldHVybmVkCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0QWxnUGFyYW1ldGVycyBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRBbGdQYXJhbWV0ZXJzMDEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBib29sZWFuIHBlcmZvcm1lZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRW5jb2RpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdKSk7CisKKyAgICAgICAgICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJzIGFwYXIgPSBlcGtpLmdldEFsZ1BhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXBhciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgcmV0dXJucworICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgd2l0aCB0aGUgc2FtZSBlbmNvZGVkIGZvcm0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cworICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcnNFbmNvZGluZyhFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTBbaV1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLmdldEVuY29kZWQoKSkpOworICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXRBbGdQYXJhbWV0ZXJzIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGdQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEFsZ1BhcmFtZXRlcnMwMV8wMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gdmFsaWRFbmNvZGluZ1dpdGhVbmtub3duQWxnT0lEID0gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgLmdldFZhbGlkRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9FbmNvZGluZygiREgiKTsKKyAgICAgICAgLy8gY29ycmVjdCBvaWQgdmFsdWUKKyAgICAgICAgdmFsaWRFbmNvZGluZ1dpdGhVbmtub3duQWxnT0lEWzE4XSA9IDA7CisgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oCisgICAgICAgICAgICAgICAgdmFsaWRFbmNvZGluZ1dpdGhVbmtub3duQWxnT0lEKTsKKworICAgICAgICBhc3NlcnROdWxsKGVwa2kuZ2V0QWxnUGFyYW1ldGVycygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5nZXRBbGdQYXJhbWV0ZXJzKCk8L2NvZGU+IG1ldGhvZCA8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBhbGdvcml0aG0gcGFyYW1ldGVycyA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB0ZXN0IG9iamVjdCBjcmVhdGVkIHVzaW5nIGN0b3Igd2hpY2ggdGFrZXMgZW5jb2RlZAorICAgICAqIGZvcm0gYXMgdGhlIG9ubHkgcGFyYW1ldGVyOyBlbmNvZGVkIGZvcm0gcGFzc2VkIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiBhbGdvcml0aG0gcGFyYW1ldGVycyBlbmNvZGluZyA8YnI+CisgICAgICogRXhwZWN0ZWQ6IDxjb2RlPm51bGw8L2NvZGU+IG11c3QgYmUgcmV0dXJuZWQKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEFsZ1BhcmFtZXRlcnMgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ1BhcmFtZXRlcnMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QWxnUGFyYW1ldGVyczAyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0VuY29kaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBtZXRob2QgdW5kZXIgdGVzdCByZXR1cm5zIG51bGwKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKGVwa2kuZ2V0QWxnUGFyYW1ldGVycygpKTsKKworICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPmdldEFsZ1BhcmFtZXRlcnMoKTwvY29kZT4gbWV0aG9kIDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIGFsZ29yaXRobSBwYXJhbWV0ZXJzIDxicj4KKyAgICAgKiBUZXN0ICM2IGZvciA8Y29kZT5FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhTdHJpbmcsIGJ5dGVbXSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgPGJyPgorICAgICAqIEFzc2VydGlvbjogLi4uVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBudWxsIGFzIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgKiBhbGdvcml0aG0gcGFyYW1ldGVycy4gPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdGVzdCBvYmplY3QgY3JlYXRlZCB1c2luZyBjdG9yIHdoaWNoIHRha2VzIGFsZ29yaXRobQorICAgICAqIG5hbWUgYW5kIGVuY3J5cHRlZCBkYXRhIGFzIGEgcGFyYW1ldGVycyA8YnI+CisgICAgICogRXhwZWN0ZWQ6IDxjb2RlPm51bGw8L2NvZGU+IG11c3QgYmUgcmV0dXJuZWQKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEFsZ1BhcmFtZXRlcnMgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ1BhcmFtZXRlcnMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QWxnUGFyYW1ldGVyczAzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgcmV0dXJucyBudWxsCisgICAgICAgICAgICAgICAgLy8gZm9yIG9iamVjdCBjb25zdHJ1Y3RlZCBpbiBzdWNoIGEgd2F5CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChlcGtpLmdldEFsZ1BhcmFtZXRlcnMoKSk7CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5nZXRBbGdQYXJhbWV0ZXJzKCk8L2NvZGU+IG1ldGhvZCA8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBhbGdvcml0aG0gcGFyYW1ldGVycyA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB0ZXN0IG9iamVjdCBjcmVhdGVkIHVzaW5nIGN0b3Igd2hpY2ggdGFrZXMKKyAgICAgKiBBbGdvcml0aG1QYXJhbWV0ZXJzIGFuZCBlbmNyeXB0ZWQgZGF0YSBhcyBhIHBhcmFtZXRlcnM7IDxicj4KKyAgICAgKiBFeHBlY3RlZDogdGhlIHNhbWUgYWxnb3JpdGhtIHBhcmFtZXRlcnMgYXMgb25lcyBwYXNzZWQgdG8gdGhlIGN0b3IgbXVzdCBiZQorICAgICAqIHJldHVybmVkCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXRBbGdQYXJhbWV0ZXJzIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGdQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEFsZ1BhcmFtZXRlcnMwNCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnMgYXAgPSBBbGdvcml0aG1QYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdKTsKKyAgICAgICAgICAgICAgICAvLyB1c2UgcHJlZ2VuZXJhdGVkIEFsZ29yaXRobVBhcmFtZXRlcnMgZW5jb2RpbmdzCisgICAgICAgICAgICAgICAgYXAKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0KEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyc0VuY29kaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSkpOworCisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgcmV0dXJucworICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIHBhcmFtZXRlcnMgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKGFwLCBlcGtpLmdldEFsZ1BhcmFtZXRlcnMoKSk7CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRFbmNyeXB0ZWREYXRhKCk8L2NvZGU+IG1ldGhvZCA8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBlbmNyeXB0ZWQgZGF0YSA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB0ZXN0IG9iamVjdCBjcmVhdGVkIHVzaW5nIGN0b3Igd2hpY2ggdGFrZXMgZW5jb2RlZAorICAgICAqIGZvcm0gYXMgdGhlIG9ubHkgcGFyYW1ldGVyOyBlbmNvZGVkIGZvcm0gcGFzc2VkIGNvbnRhaW5zIGVuY3J5cHRlZCBkYXRhCisgICAgICogPGJyPgorICAgICAqIEV4cGVjdGVkOiB0aGUgZXF1aXZhbGVudCBlbmNyeXB0ZWQgZGF0YSBtdXN0IGJlIHJldHVybmVkCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0RW5jcnlwdGVkRGF0YSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jcnlwdGVkRGF0YSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRFbmNyeXB0ZWREYXRhMDEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBib29sZWFuIHBlcmZvcm1lZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRW5jb2RpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdKSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IG1ldGhvZCB1bmRlciB0ZXN0IHJldHVybnMKKyAgICAgICAgICAgICAgICAvLyB2YWxpZCBlbmNyeXB0ZWQgZGF0YQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhLCBlcGtpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmNyeXB0ZWREYXRhKCkpKTsKKworICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmdldEVuY3J5cHRlZERhdGEoKTwvY29kZT4gbWV0aG9kIDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIGVuY3J5cHRlZCBkYXRhIDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHRlc3Qgb2JqZWN0IGNyZWF0ZWQgdXNpbmcgY3RvciB3aGljaCB0YWtlcyBhbGdvcml0aG0KKyAgICAgKiBuYW1lIGFuZCBlbmNyeXB0ZWQgZGF0YSBhcyBhIHBhcmFtZXRlcnMgPGJyPgorICAgICAqIEV4cGVjdGVkOiB0aGUgZXF1aXZhbGVudCBlbmNyeXB0ZWQgZGF0YSBtdXN0IGJlIHJldHVybmVkCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEVuY3J5cHRlZERhdGEgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY3J5cHRlZERhdGEiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RW5jcnlwdGVkRGF0YTAyKCkgeworICAgICAgICBib29sZWFuIHBlcmZvcm1lZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEpOworCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBtZXRob2QgdW5kZXIgdGVzdCByZXR1cm5zCisgICAgICAgICAgICAgICAgLy8gdmFsaWQgZW5jcnlwdGVkIGRhdGEKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSwgZXBraQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5jcnlwdGVkRGF0YSgpKSk7CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5nZXRFbmNyeXB0ZWREYXRhKCk8L2NvZGU+IG1ldGhvZCA8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBlbmNyeXB0ZWQgZGF0YSA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB0ZXN0IG9iamVjdCBjcmVhdGVkIHVzaW5nIGN0b3Igd2hpY2ggdGFrZXMgYWxnb3JpdGhtCisgICAgICogcGFyYW1ldGVycyBhbmQgZW5jcnlwdGVkIGRhdGEgYXMgYSBwYXJhbWV0ZXJzIDxicj4KKyAgICAgKiBFeHBlY3RlZDogdGhlIGVxdWl2YWxlbnQgZW5jcnlwdGVkIGRhdGEgbXVzdCBiZSByZXR1cm5lZAorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0RW5jcnlwdGVkRGF0YSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jcnlwdGVkRGF0YSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRFbmNyeXB0ZWREYXRhMDMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBib29sZWFuIHBlcmZvcm1lZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJzIGFwID0gQWxnb3JpdGhtUGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSk7CisgICAgICAgICAgICAgICAgLy8gdXNlIHByZWdlbmVyYXRlZCBBbGdvcml0aG1QYXJhbWV0ZXJzIGVuY29kaW5ncworICAgICAgICAgICAgICAgIGFwLmluaXQoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmdldFBhcmFtZXRlcnNFbmNvZGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSkpOworCisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgcmV0dXJucworICAgICAgICAgICAgICAgIC8vIHZhbGlkIGVuY3J5cHRlZCBkYXRhCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEsIGVwa2kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuY3J5cHRlZERhdGEoKSkpOworCisgICAgICAgICAgICAgICAgcGVyZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRlc3Qgbm90IHBlcmZvcm1lZCIsIHBlcmZvcm1lZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+Z2V0RW5jcnlwdGVkRGF0YSgpPC9jb2RlPiBtZXRob2QgPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBhIG5ldyBhcnJheSBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHRlc3Qgb2JqZWN0IGNyZWF0ZWQgdXNpbmcgY3RvciB3aGljaCB0YWtlcyBhbGdvcml0aG0KKyAgICAgKiBuYW1lIGFuZCBlbmNyeXB0ZWQgZGF0YSBhcyBhIHBhcmFtZXRlcnMgPGJyPgorICAgICAqIEV4cGVjdGVkOiByZWZzIHRvIGVuY3J5cHRlZCBkYXRhIGJ5dGUgYXJyYXkgcGFzc2VkIHRvIHRoZSBjdG9yIGFuZAorICAgICAqIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgdW5kZXIgdGVzdCBtdXN0IGJlIGRpZmZlcmVudAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXRFbmNyeXB0ZWREYXRhIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNyeXB0ZWREYXRhIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEVuY3J5cHRlZERhdGEwNCgpIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgcmV0dXJucworICAgICAgICAgICAgICAgIC8vIG5ldyBhcnJheSBlYWNoIHRpbWUKKyAgICAgICAgICAgICAgICBieXRlW10gZWNkMSA9IGVwa2kuZ2V0RW5jcnlwdGVkRGF0YSgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBlY2QyID0gZXBraS5nZXRFbmNyeXB0ZWREYXRhKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSwgZWNkMSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSwgZWNkMik7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShlY2QxLCBlY2QyKTsKKworICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldEVuY29kZWQoKTwvY29kZT4gbWV0aG9kIDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIEFTTi4xIGVuY29kaW5nIG9mIHRoaXMgb2JqZWN0IDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHRlc3Qgb2JqZWN0IGNyZWF0ZWQgdXNpbmcgY3RvciB3aGljaCB0YWtlcyBlbmNvZGVkCisgICAgICogZm9ybSBhcyB0aGUgb25seSBwYXJhbWV0ZXIgPGJyPgorICAgICAqIEV4cGVjdGVkOiBlcXVpdmFsZW50IGVuY29kZWQgZm9ybSBtdXN0IGJlIHJldHVybmVkCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RW5jb2RlZDAxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGVuYyA9IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9FbmNvZGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdKTsKKyAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGVuYyk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IG1ldGhvZCB1bmRlciB0ZXN0IHJldHVybnMKKyAgICAgICAgICAgICAgICAvLyB2YWxpZCBlbmNvZGVkIGZvcm0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZW5jLCBlcGtpLmdldEVuY29kZWQoKSkpOworCisgICAgICAgICAgICAgICAgcGVyZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRlc3Qgbm90IHBlcmZvcm1lZCIsIHBlcmZvcm1lZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0RW5jb2RlZCgpPC9jb2RlPiBtZXRob2QgPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgQVNOLjEgZW5jb2Rpbmcgb2YgdGhpcyBvYmplY3QgPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdGVzdCBvYmplY3QgY3JlYXRlZCB1c2luZyBjdG9yIHdoaWNoIHRha2VzIGFsZ29yaXRobQorICAgICAqIG5hbWUgYW5kIGVuY3J5cHRlZCBkYXRhIGFzIGEgcGFyYW1ldGVycyA8YnI+CisgICAgICogRXhwZWN0ZWQ6IGVxdWl2YWxlbnQgZW5jb2RlZCBmb3JtICh3aXRob3V0IGFsZyBwYXJhbXMpIG11c3QgYmUgcmV0dXJuZWQKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEVuY29kZWQwMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTBbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IG1ldGhvZCB1bmRlciB0ZXN0IHJldHVybnMKKyAgICAgICAgICAgICAgICAvLyB2YWxpZCBlbmNvZGVkIGZvcm0KKyAgICAgICAgICAgICAgICBieXRlW10gcmVmRW5jID0gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0VuY29kaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTBbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXkudG9TdHJpbmcocmVmRW5jLCAiICIpKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYWN0RW5jID0gZXBraS5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5LnRvU3RyaW5nKGFjdEVuYywgIiAiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlZkVuYywgYWN0RW5jKSk7CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5nZXRFbmNvZGVkKCk8L2NvZGU+IG1ldGhvZCA8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBBU04uMSBlbmNvZGluZyBvZiB0aGlzIG9iamVjdCA8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB0ZXN0IG9iamVjdCBjcmVhdGVkIHVzaW5nIGN0b3Igd2hpY2ggdGFrZXMgYWxnb3JpdGhtCisgICAgICogbmFtZSBhbmQgZW5jcnlwdGVkIGRhdGEgYXMgYSBwYXJhbWV0ZXJzIDxicj4KKyAgICAgKiBFeHBlY3RlZDogZXF1aXZhbGVudCBlbmNvZGVkIGZvcm0gKHdpdGhvdXQgYWxnIHBhcmFtcykgbXVzdCBiZSByZXR1cm5lZAorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RW5jb2RlZDAzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVycyBhcCA9IEFsZ29yaXRobVBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTBbaV1bMF0pOworICAgICAgICAgICAgICAgIC8vIHVzZSBwcmVnZW5lcmF0ZWQgQWxnb3JpdGhtUGFyYW1ldGVycyBlbmNvZGluZ3MKKyAgICAgICAgICAgICAgICBhcC5pbml0KEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5nZXRQYXJhbWV0ZXJzRW5jb2RpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTBbaV1bMF0pKTsKKworICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IG1ldGhvZCB1bmRlciB0ZXN0IHJldHVybnMKKyAgICAgICAgICAgICAgICAvLyB2YWxpZCBlbmNvZGVkIGZvcm0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0VuY29kaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTBbaV1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGtpLmdldEVuY29kZWQoKSkpOworCisgICAgICAgICAgICAgICAgcGVyZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRlc3Qgbm90IHBlcmZvcm1lZCIsIHBlcmZvcm1lZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+Z2V0RW5jb2RlZCgpPC9jb2RlPiBtZXRob2QgPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBhIG5ldyBhcnJheSBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHRlc3Qgb2JqZWN0IGNyZWF0ZWQgdXNpbmcgY3RvciB3aGljaCB0YWtlcyBhbGdvcml0aG0KKyAgICAgKiBuYW1lIGFuZCBlbmNyeXB0ZWQgZGF0YSBhcyBhIHBhcmFtZXRlcnMgPGJyPgorICAgICAqIEV4cGVjdGVkOiBzZXZlcmFsIHJlZnMgdG8gYnl0ZSBhcnJheSByZXR1cm5lZCBieSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgKiBtdXN0IGJlIGRpZmZlcmVudAorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RW5jb2RlZDA0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgcmV0dXJucworICAgICAgICAgICAgICAgIC8vIG5ldyBhcnJheSBlYWNoIHRpbWUKKyAgICAgICAgICAgICAgICBieXRlW10gZWMxID0gZXBraS5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGVjMiA9IGVwa2kuZ2V0RW5jb2RlZCgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBlYzMgPSBlcGtpLmdldEVuY29kZWQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKGVjMSwgZWMyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKGVjMiwgZWMzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKGVjMSwgZWMzKTsKKworICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0S2V5U3BlYyBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5jcnlwdG8uQ2lwaGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0S2V5U3BlY0NpcGhlcjAxKCkgeworICAgICAgICBib29sZWFuIHBlcmZvcm1lZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmVuY3J5cHRlZERhdGEpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IG1ldGhvZCB1bmRlciB0ZXN0IHRocm93cyBOUEUKKyAgICAgICAgICAgICAgICAgICAgZXBraS5nZXRLZXlTcGVjKChDaXBoZXIpIG51bGwpOworICAgICAgICAgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNyeXB0ZWQgZGF0YSBjb250YWlucyB2YWxpZCBQS0NTOCBrZXkgaW5mbyBlbmNvZGluZworICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXRLZXlTcGVjIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRLZXlTcGVjIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5jcnlwdG8uQ2lwaGVyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfUk9VTkRUUklQX0dldEtleVNwZWNDaXBoZXIwMSgpIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsZ05hbWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGVzdCBkYXRhCisgICAgICAgICAgICAgICAgVGVzdERhdGFHZW5lcmF0b3IgZyA9IG5ldyBUZXN0RGF0YUdlbmVyYXRvcihhbGdOYW1lW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxnTmFtZVtpXVsxXSwgcHJpdmF0ZUtleUluZm8sIG51bGwpOworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRlc3Qgb2JqZWN0CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraTsKKyAgICAgICAgICAgICAgICBpZiAoZy5hcCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhhbGdOYW1lW2ldWzBdLCBnLmN0KCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oZy5hcCgpLCBnLmN0KCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNhbGwgbWV0aG9kcyB1bmRlciB0ZXN0CisgICAgICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgICAgICBQS0NTOEVuY29kZWRLZXlTcGVjIGVrcyA9IGVwa2kuZ2V0S2V5U3BlYyhnLmMoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHByaXZhdGVLZXlJbmZvLCBla3MuZ2V0RW5jb2RlZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChhbGdOYW1lW2ldWzBdICsgIiAhPSAiICsgYWxnTmFtZVtpXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoYWxnTmFtZVtpXVswXSArICIsICIgKyBhbGdOYW1lW2ldWzFdICsgZSArICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworCisgICAgICAgICAgICB9IGNhdGNoIChUZXN0RGF0YUdlbmVyYXRvci5BbGxvd2VkRmFpbHVyZSBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY3J5cHRlZCBkYXRhIGNvbnRhaW5zIGludmFsaWQgUEtDUzgga2V5IGluZm8gZW5jb2RpbmcKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0S2V5U3BlYyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5U3BlYyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguY3J5cHRvLkNpcGhlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X1JPVU5EVFJJUF9HZXRLZXlTcGVjQ2lwaGVyMDIoKSB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxnTmFtZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0ZXN0IGRhdGEKKyAgICAgICAgICAgICAgICBUZXN0RGF0YUdlbmVyYXRvciBnID0gbmV3IFRlc3REYXRhR2VuZXJhdG9yKGFsZ05hbWVbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBhbGdOYW1lW2ldWzFdLCBwcml2YXRlS2V5SW5mb0RhbWFnZWQsIG51bGwpOworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRlc3Qgb2JqZWN0CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraTsKKyAgICAgICAgICAgICAgICBpZiAoZy5hcCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhhbGdOYW1lW2ldWzBdLCBnLmN0KCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oZy5hcCgpLCBnLmN0KCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNhbGwgbWV0aG9kcyB1bmRlciB0ZXN0CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZXBraS5nZXRLZXlTcGVjKGcuYygpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IG5vdCBnZXQgaGVyZSBiZWNhdXNlIGRlY3J5cHRlZCBkYXRhIGRvZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IHJlcHJlc2VudCB2YWxpZCBQS0NTOCBlbmNvZGluZworICAgICAgICAgICAgICAgICAgICBmYWlsKGFsZ05hbWVbaV1bMF0gKyAiLCAiICsgYWxnTmFtZVtpXVsxXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleVNwZWNFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoVGVzdERhdGFHZW5lcmF0b3IuQWxsb3dlZEZhaWx1cmUgYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRlc3Qgbm90IHBlcmZvcm1lZCIsIHBlcmZvcm1lZCk7CisgICAgfQorCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdWJzZXQgZG9lcyBub3QgY2hlY2tzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRLZXlTcGVjS2V5MDEoKSB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmFsZ05hbWUwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTBbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuZW5jcnlwdGVkRGF0YSk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgdGhyb3dzIE5QRQorICAgICAgICAgICAgICAgICAgICBlcGtpLmdldEtleVNwZWMoKEtleSkgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIk51bGxQb2ludGVyRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGVyZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRlc3Qgbm90IHBlcmZvcm1lZCIsIHBlcmZvcm1lZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jcnlwdGVkIGRhdGEgY29udGFpbnMgdmFsaWQgUEtDUzgga2V5IGluZm8gZW5jb2RpbmcKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiU3Vic2V0IGRvZXMgbm90IGNoZWNrcyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRLZXlTcGVjIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X1JPVU5EVFJJUF9HZXRLZXlTcGVjS2V5MDEoKSB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxnTmFtZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0ZXN0IGRhdGEKKyAgICAgICAgICAgICAgICBUZXN0RGF0YUdlbmVyYXRvciBnID0gbmV3IFRlc3REYXRhR2VuZXJhdG9yKGFsZ05hbWVbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBhbGdOYW1lW2ldWzFdLCBwcml2YXRlS2V5SW5mbywgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGVzdCBvYmplY3QKKyAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpOworICAgICAgICAgICAgICAgIGlmIChnLmFwKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGFsZ05hbWVbaV1bMF0sIGcuY3QoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhnLmFwKCksIGcuY3QoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUEtDUzhFbmNvZGVkS2V5U3BlYyBla3MgPSBlcGtpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEtleVNwZWMoZy5wdWJLKCkgPT0gbnVsbCA/IGcuaygpIDogZy5wdWJLKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhwcml2YXRlS2V5SW5mbywgZWtzLmdldEVuY29kZWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoYWxnTmFtZVtpXVswXSArICIgIT0gIiArIGFsZ05hbWVbaV1bMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoYWxnTmFtZVtpXVswXSArICIsICIgKyBhbGdOYW1lW2ldWzFdICsgIjogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChUZXN0RGF0YUdlbmVyYXRvci5BbGxvd2VkRmFpbHVyZSBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNyeXB0ZWQgZGF0YSBjb250YWlucyBpbnZhbGlkIFBLQ1M4IGtleSBpbmZvIGVuY29kaW5nCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlN1YnNldCBkb2VzIG5vdCBjaGVja3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5U3BlYyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9ST1VORFRSSVBfR2V0S2V5U3BlY0tleTAyKCkgeworICAgICAgICBib29sZWFuIHBlcmZvcm1lZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsZ05hbWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGVzdCBkYXRhCisgICAgICAgICAgICAgICAgVGVzdERhdGFHZW5lcmF0b3IgZyA9IG5ldyBUZXN0RGF0YUdlbmVyYXRvcihhbGdOYW1lW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxnTmFtZVtpXVsxXSwgcHJpdmF0ZUtleUluZm9EYW1hZ2VkLCBudWxsKTsKKworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0ZXN0IG9iamVjdAorICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIGVwa2k7CisgICAgICAgICAgICAgICAgaWYgKGcuYXAoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYWxnTmFtZVtpXVswXSwgZy5jdCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGcuYXAoKSwgZy5jdCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBlcGtpLmdldEtleVNwZWMoZy5wdWJLKCkgPT0gbnVsbCA/IGcuaygpIDogZy5wdWJLKCkpOworICAgICAgICAgICAgICAgICAgICBmYWlsKGFsZ05hbWVbaV1bMF0gKyAiLCAiICsgYWxnTmFtZVtpXVsxXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGVyZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRlc3REYXRhR2VuZXJhdG9yLkFsbG93ZWRGYWlsdXJlIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW4gc3Vic2V0IG1pc3NlZCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiAmIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBjaGVja2luZyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRLZXlTcGVjS2V5U3RyaW5nMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBtZXRob2QgdW5kZXIgdGVzdCB0aHJvd3MgTlBFCisgICAgICAgICAgICAgICAgICAgIGVwa2kuZ2V0S2V5U3BlYygoS2V5KSBudWxsLCAiU29tZVByb3ZpZGVyTmFtZSIpOworICAgICAgICAgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBtZXRob2QgdW5kZXIgdGVzdCB0aHJvd3MgTlBFCisgICAgICAgICAgICAgICAgICAgIGVwa2kuZ2V0S2V5U3BlYyhuZXcgS2V5KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJhbGciOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImZtdCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwgKFN0cmluZykgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNyeXB0ZWQgZGF0YSBjb250YWlucyB2YWxpZCBQS0NTOCBrZXkgaW5mbyBlbmNvZGluZworICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJJbiBzdWJzZXQgbWlzc2VkIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICYgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGNoZWNraW5nIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5U3BlYyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9ST1VORFRSSVBfR2V0S2V5U3BlY0tleVN0cmluZzAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxnTmFtZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBwcm92aWRlci5sZW5ndGg7IGwrKykgeworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlcltsXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUZXN0RGF0YUdlbmVyYXRvciBnOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRlc3QgZGF0YQorICAgICAgICAgICAgICAgICAgICBnID0gbmV3IFRlc3REYXRhR2VuZXJhdG9yKGFsZ05hbWVbaV1bMF0sIGFsZ05hbWVbaV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZUtleUluZm8sIHByb3ZpZGVyW2xdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUZXN0RGF0YUdlbmVyYXRvci5BbGxvd2VkRmFpbHVyZSBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGVzdCBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGcuYXAoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGFsZ05hbWVbaV1bMF0sIGcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmN0KCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhnLmFwKCksIGcuY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhFbmNvZGVkS2V5U3BlYyBla3MgPSBlcGtpLmdldEtleVNwZWMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcucHViSygpID09IG51bGwgPyBnLmsoKSA6IGcucHViSygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcltsXS5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMocHJpdmF0ZUtleUluZm8sIGVrcy5nZXRFbmNvZGVkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChhbGdOYW1lW2ldWzBdICsgIiAhPSAiICsgYWxnTmFtZVtpXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChhbGdOYW1lW2ldWzBdICsgIiwgIiArIGFsZ05hbWVbaV1bMV0gKyAiOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY3J5cHRlZCBkYXRhIGNvbnRhaW5zIGludmFsaWQgUEtDUzgga2V5IGluZm8gZW5jb2RpbmcKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiSW4gc3Vic2V0IG1pc3NlZCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiAmIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBjaGVja2luZyIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleVNwZWMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfUk9VTkRUUklQX0dldEtleVNwZWNLZXlTdHJpbmcwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIHBlcmZvcm1lZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsZ05hbWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgcHJvdmlkZXIubGVuZ3RoOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJbbF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVGVzdERhdGFHZW5lcmF0b3IgZzsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0ZXN0IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgZyA9IG5ldyBUZXN0RGF0YUdlbmVyYXRvcihhbGdOYW1lW2ldWzBdLCBhbGdOYW1lW2ldWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGVLZXlJbmZvRGFtYWdlZCwgcHJvdmlkZXJbbF0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRlc3REYXRhR2VuZXJhdG9yLkFsbG93ZWRGYWlsdXJlIGFsbG93ZWRGYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0ZXN0IG9iamVjdAorICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpOworICAgICAgICAgICAgICAgICAgICBpZiAoZy5hcCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYWxnTmFtZVtpXVswXSwgZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGcuYXAoKSwgZy5jdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwa2kuZ2V0S2V5U3BlYyhnLnB1YksoKSA9PSBudWxsID8gZy5rKCkgOiBnLnB1YksoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJbbF0uZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChhbGdOYW1lW2ldWzBdICsgIiwgIiArIGFsZ05hbWVbaV1bMV0pOworCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluIHN1YnNldCBtaXNzZWQgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGNoZWNraW5nIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEtleVNwZWNLZXlQcm92aWRlcjAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEuYWxnTmFtZTAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5hbGdOYW1lMFtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5lbmNyeXB0ZWREYXRhKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBtZXRob2QgdW5kZXIgdGVzdCB0aHJvd3MgTlBFCisgICAgICAgICAgICAgICAgICAgIGVwa2kuZ2V0S2V5U3BlYygoS2V5KSBudWxsLCAoUHJvdmlkZXIpIG51bGwpOworICAgICAgICAgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gb2spIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbWV0aG9kIHVuZGVyIHRlc3QgdGhyb3dzIE5QRQorICAgICAgICAgICAgICAgICAgICBlcGtpLmdldEtleVNwZWMobmV3IEtleSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYWxnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJmbXQiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10ge307CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sIChQcm92aWRlcikgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG9rKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGVyZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRlc3Qgbm90IHBlcmZvcm1lZCIsIHBlcmZvcm1lZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jcnlwdGVkIGRhdGEgY29udGFpbnMgdmFsaWQgUEtDUzgga2V5IGluZm8gZW5jb2RpbmcKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiSW4gc3Vic2V0IG1pc3NlZCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gY2hlY2tpbmciLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRLZXlTcGVjIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X1JPVU5EVFJJUF9HZXRLZXlTcGVjS2V5UHJvdmlkZXIwMSgpIHsKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtZWQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsZ05hbWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgcHJvdmlkZXIubGVuZ3RoOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJbbF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVGVzdERhdGFHZW5lcmF0b3IgZzsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0ZXN0IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgZyA9IG5ldyBUZXN0RGF0YUdlbmVyYXRvcihhbGdOYW1lW2ldWzBdLCBhbGdOYW1lW2ldWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGVLZXlJbmZvLCBwcm92aWRlcltsXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGVzdERhdGFHZW5lcmF0b3IuQWxsb3dlZEZhaWx1cmUgYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0ZXN0IG9iamVjdAorICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBlcGtpOworICAgICAgICAgICAgICAgICAgICBpZiAoZy5hcCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwa2kgPSBuZXcgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8oYWxnTmFtZVtpXVswXSwgZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGcuYXAoKSwgZy5jdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOEVuY29kZWRLZXlTcGVjIGVrcyA9IGVwa2kuZ2V0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5wdWJLKCkgPT0gbnVsbCA/IGcuaygpIDogZy5wdWJLKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyW2xdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHByaXZhdGVLZXlJbmZvLCBla3MuZ2V0RW5jb2RlZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoYWxnTmFtZVtpXVswXSArICIgIT0gIiArIGFsZ05hbWVbaV1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoYWxnTmFtZVtpXVswXSArICIsICIgKyBhbGdOYW1lW2ldWzFdICsgIjogIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYWxsb3dlZEZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBub3QgcGVyZm9ybWVkIiwgcGVyZm9ybWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNyeXB0ZWQgZGF0YSBjb250YWlucyBpbnZhbGlkIFBLQ1M4IGtleSBpbmZvIGVuY29kaW5nCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkluIHN1YnNldCBtaXNzZWQgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGNoZWNraW5nIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5U3BlYyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9ST1VORFRSSVBfR2V0S2V5U3BlY0tleVByb3ZpZGVyMDIoKSB7CisgICAgICAgIGJvb2xlYW4gcGVyZm9ybWVkID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGdOYW1lLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IHByb3ZpZGVyLmxlbmd0aDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyW2xdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFRlc3REYXRhR2VuZXJhdG9yIGc7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGVzdCBkYXRhCisgICAgICAgICAgICAgICAgICAgIGcgPSBuZXcgVGVzdERhdGFHZW5lcmF0b3IoYWxnTmFtZVtpXVswXSwgYWxnTmFtZVtpXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlS2V5SW5mb0RhbWFnZWQsIHByb3ZpZGVyW2xdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUZXN0RGF0YUdlbmVyYXRvci5BbGxvd2VkRmFpbHVyZSBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGVzdCBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXBraTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGcuYXAoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcGtpID0gbmV3IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKGFsZ05hbWVbaV1bMF0sIGcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmN0KCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXBraSA9IG5ldyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyhnLmFwKCksIGcuY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZXBraS5nZXRLZXlTcGVjKGcucHViSygpID09IG51bGwgPyBnLmsoKSA6IGcucHViSygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcltsXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoYWxnTmFtZVtpXVswXSArICIsICIgKyBhbGdOYW1lW2ldWzFdKTsKKworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbGxvd2VkRmFpbHVyZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG5vdCBwZXJmb3JtZWQiLCBwZXJmb3JtZWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdERhdGFHZW5lcmF0b3IgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxsb3dlZEZhaWx1cmUgZXh0ZW5kcyBFeGNlcHRpb24geworICAgICAgICAgICAgQWxsb3dlZEZhaWx1cmUoU3RyaW5nIG1zZykgeworICAgICAgICAgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENpcGhlciBjID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIEtleSBrID0gbnVsbCwgcHViSyA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSBBbGdvcml0aG1QYXJhbWV0ZXJzIGFwID0gbnVsbDsKKworICAgICAgICBieXRlW10gY3Q7CisKKyAgICAgICAgcHVibGljIFRlc3REYXRhR2VuZXJhdG9yKFN0cmluZyBhbGdOYW1lLCBTdHJpbmcgdHJhbnNmb3JtYXRpb24sCisgICAgICAgICAgICAgICAgYnl0ZVtdIHByaXZhdGVLZXlJbmZvLCBQcm92aWRlciBwcm92aWRlcikgdGhyb3dzIEFsbG93ZWRGYWlsdXJlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYyA9IChwcm92aWRlciA9PSBudWxsKSA/IENpcGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKHRyYW5zZm9ybWF0aW9uICE9IG51bGwgPyB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFsZ05hbWUpIDogQ2lwaGVyLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gIT0gbnVsbCA/IHRyYW5zZm9ybWF0aW9uIDogYWxnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFsbG93ZWRGYWlsdXJlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFBhZGRpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbGxvd2VkRmFpbHVyZShlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgS2V5R2VuZXJhdG9yIGtnID0gKHByb3ZpZGVyID09IG51bGwpID8gS2V5R2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoYWxnTmFtZSkgOiBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBhbGdOYW1lLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgayA9IGtnLmdlbmVyYXRlS2V5KCk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrcGcgPSAocHJvdmlkZXIgPT0gbnVsbCkgPyBLZXlQYWlyR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKGFsZ05hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKGFsZ05hbWUsIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgS2V5UGFpciBrcCA9IGtwZy5nZW5LZXlQYWlyKCk7CisgICAgICAgICAgICAgICAgICAgIGsgPSBrcC5nZXRQcml2YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHB1YksgPSBrcC5nZXRQdWJsaWMoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUEJFUGFyYW1ldGVyU3BlYyBwYmVQYXJhbVNwZWMgPSBudWxsOworICAgICAgICAgICAgaWYgKGsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHBiZVBhcmFtU3BlYyA9IG5ldyBQQkVQYXJhbWV0ZXJTcGVjKG5ldyBieXRlW10geyAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDUsIDYsIDcsIDggfSwgMTApOworICAgICAgICAgICAgICAgICAgICBTZWNyZXRLZXlGYWN0b3J5IHNrZiA9IChwcm92aWRlciA9PSBudWxsKSA/IFNlY3JldEtleUZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoYWxnTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoYWxnTmFtZSwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBQQkVLZXlTcGVjIGtzID0gbmV3IFBCRUtleVNwZWMoIjEyMzQ1Njc4Ii50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBza2YuZ2VuZXJhdGVTZWNyZXQoa3MpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxsb3dlZEZhaWx1cmUoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxsb3dlZEZhaWx1cmUoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocGJlUGFyYW1TcGVjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYy5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIGspOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGMuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrLCBwYmVQYXJhbVNwZWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbGxvd2VkRmFpbHVyZShlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFsbG93ZWRGYWlsdXJlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbGxvd2VkRmFpbHVyZShlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFwID0gYy5nZXRQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY3QgPSBjLmRvRmluYWwocHJpdmF0ZUtleUluZm8pOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxsb3dlZEZhaWx1cmUoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFsbG93ZWRGYWlsdXJlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJhZFBhZGRpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbGxvd2VkRmFpbHVyZShlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxsb3dlZEZhaWx1cmUoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHRyeSB0byBjb252ZXJ0IHBiZVBhcmFtU3BlYy0+YXAKKyAgICAgICAgICAgICAgICBpZiAocGJlUGFyYW1TcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gKHByb3ZpZGVyID09IG51bGwpID8gQWxnb3JpdGhtUGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoYWxnTmFtZSkgOiBBbGdvcml0aG1QYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShhbGdOYW1lLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5pbml0KHBiZVBhcmFtU3BlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYmVQYXJhbVNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgY29udmVydAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFsbG93ZWRGYWlsdXJlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgY29udmVydAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFsbG93ZWRGYWlsdXJlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGMuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBwdWJLID09IG51bGwgPyBrIDogcHViSyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYy5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIHB1YksgPT0gbnVsbCA/IGsgOiBwdWJLLCBhcCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxsb3dlZEZhaWx1cmUoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbGxvd2VkRmFpbHVyZShlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxsb3dlZEZhaWx1cmUoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEtleSBrKCkgeworICAgICAgICAgICAgcmV0dXJuIGs7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgS2V5IHB1YksoKSB7CisgICAgICAgICAgICByZXR1cm4gcHViSzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDaXBoZXIgYygpIHsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBbGdvcml0aG1QYXJhbWV0ZXJzIGFwKCkgeworICAgICAgICAgICAgcmV0dXJuIGFwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdmFsaWQgUHJpdmF0ZUtleUluZm8gZW5jb2RpbmcKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gcHJpdmF0ZUtleUluZm8gPSB7IChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MiwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwKKyAgICAgICAgICAgIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgyYSwKKyAgICAgICAgICAgIChieXRlKSAweDg2LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4ODYsIChieXRlKSAweGY3LCAoYnl0ZSkgMHgwZCwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwMCwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDYxLCAoYnl0ZSkgMHgzMCwKKyAgICAgICAgICAgIChieXRlKSAweDgyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NWQsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgxLCAoYnl0ZSkgMHgwMCwKKyAgICAgICAgICAgIChieXRlKSAweGIyLCAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDViLCAoYnl0ZSkgMHhiYSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4Y2QsIChieXRlKSAweDY1LCAoYnl0ZSkgMHgwOSwKKyAgICAgICAgICAgIChieXRlKSAweDYzLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDVhLCAoYnl0ZSkgMHgxYiwKKyAgICAgICAgICAgIChieXRlKSAweDkyLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4ZjgsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1ZSwKKyAgICAgICAgICAgIChieXRlKSAweDdjLCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4NTAsIChieXRlKSAweDE3LCAoYnl0ZSkgMHhlYywKKyAgICAgICAgICAgIChieXRlKSAweDQ0LCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4NTgsIChieXRlKSAweDQyLCAoYnl0ZSkgMHgyYiwKKyAgICAgICAgICAgIChieXRlKSAweDQxLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4NTksIChieXRlKSAweGYyLCAoYnl0ZSkgMHhlMSwKKyAgICAgICAgICAgIChieXRlKSAweDVkLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NzEsIChieXRlKSAweDRkLCAoYnl0ZSkgMHg5MiwKKyAgICAgICAgICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4YjYsIChieXRlKSAweDZjLCAoYnl0ZSkgMHg3ZiwKKyAgICAgICAgICAgIChieXRlKSAweDVkLCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4Y2QsIChieXRlKSAweDE3LCAoYnl0ZSkgMHhlYywKKyAgICAgICAgICAgIChieXRlKSAweGQ3LCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4MzksIChieXRlKSAweGIxLCAoYnl0ZSkgMHg3YiwKKyAgICAgICAgICAgIChieXRlKSAweGUyLCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4OTYsIChieXRlKSAweDc3LCAoYnl0ZSkgMHhiZSwKKyAgICAgICAgICAgIChieXRlKSAweGQwLCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweDJkLCAoYnl0ZSkgMHg2YiwKKyAgICAgICAgICAgIChieXRlKSAweDI0LCAoYnl0ZSkgMHhhYSwgKGJ5dGUpIDB4MTQsIChieXRlKSAweGJhLCAoYnl0ZSkgMHg4MiwKKyAgICAgICAgICAgIChieXRlKSAweDc5LCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDE2LCAoYnl0ZSkgMHg2OCwKKyAgICAgICAgICAgIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4NTQsIChieXRlKSAweGEyLCAoYnl0ZSkgMHhmYSwKKyAgICAgICAgICAgIChieXRlKSAweDkxLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4MGEsIChieXRlKSAweDJhLCAoYnl0ZSkgMHg1MywKKyAgICAgICAgICAgIChieXRlKSAweGE2LCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4OWUsIChieXRlKSAweDdkLCAoYnl0ZSkgMHgyOSwKKyAgICAgICAgICAgIChieXRlKSAweDMzLCAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweGZjLCAoYnl0ZSkgMHgwMiwKKyAgICAgICAgICAgIChieXRlKSAweDNmLCAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4YzcsIChieXRlKSAweDZlLCAoYnl0ZSkgMHhlZCwKKyAgICAgICAgICAgIChieXRlKSAweGFhLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg1MiwKKyAgICAgICAgICAgIChieXRlKSAweGVkLCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDRiLCAoYnl0ZSkgMHgwZSwKKyAgICAgICAgICAgIChieXRlKSAweGM4LCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEwLCAoYnl0ZSkgMHg1NiwKKyAgICAgICAgICAgIChieXRlKSAweDM3LCAoYnl0ZSkgMHhhZiwgKGJ5dGUpIDB4MTEsIChieXRlKSAweGZhLCAoYnl0ZSkgMHgyMSwKKyAgICAgICAgICAgIChieXRlKSAweDBlLCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4ZmYsIChieXRlKSAweGZhLCAoYnl0ZSkgMHg4YywKKyAgICAgICAgICAgIChieXRlKSAweDY1LCAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4NmQsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg4MSwKKyAgICAgICAgICAgIChieXRlKSAweDgwLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg0MCwKKyAgICAgICAgICAgIChieXRlKSAweDkwLCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4OTYsIChieXRlKSAweDVkLCAoYnl0ZSkgMHhmMywKKyAgICAgICAgICAgIChieXRlKSAweDg0LCAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4OTksIChieXRlKSAweGQ5LCAoYnl0ZSkgMHg0ZSwKKyAgICAgICAgICAgIChieXRlKSAweDUxLCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg4ZCwKKyAgICAgICAgICAgIChieXRlKSAweGQyLCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDczLCAoYnl0ZSkgMHgxZSwKKyAgICAgICAgICAgIChieXRlKSAweDZmLCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDdjLCAoYnl0ZSkgMHg2NiwKKyAgICAgICAgICAgIChieXRlKSAweDQ1LCAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4N2MsIChieXRlKSAweGRjLCAoYnl0ZSkgMHgzYSwKKyAgICAgICAgICAgIChieXRlKSAweGMyLCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4NTEsIChieXRlKSAweDlhLCAoYnl0ZSkgMHgxZSwKKyAgICAgICAgICAgIChieXRlKSAweGE0LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4OGQsIChieXRlKSAweGY0LCAoYnl0ZSkgMHhmOSwKKyAgICAgICAgICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4YmUsIChieXRlKSAweDE3LCAoYnl0ZSkgMHhmNywKKyAgICAgICAgICAgIChieXRlKSAweGM3LCAoYnl0ZSkgMHgzYywgKGJ5dGUpIDB4MDAsIChieXRlKSAweGExLCAoYnl0ZSkgMHhmOSwKKyAgICAgICAgICAgIChieXRlKSAweDYwLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDhmLCAoYnl0ZSkgMHg5YywKKyAgICAgICAgICAgIChieXRlKSAweGZkLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDQyLCAoYnl0ZSkgMHgxYiwKKyAgICAgICAgICAgIChieXRlKSAweDdmLCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4ZjEsIChieXRlKSAweDMxLCAoYnl0ZSkgMHhjMywKKyAgICAgICAgICAgIChieXRlKSAweDYzLCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NWMsIChieXRlKSAweGMxLCAoYnl0ZSkgMHhiMiwKKyAgICAgICAgICAgIChieXRlKSAweDVmLCAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4ZWUsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg5ZiwKKyAgICAgICAgICAgIChieXRlKSAweDVlLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4NDgsIChieXRlKSAweGJhLCAoYnl0ZSkgMHg3NCwKKyAgICAgICAgICAgIChieXRlKSAweGJhLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4YjcsIChieXRlKSAweDMwLCAoYnl0ZSkgMHhhYywKKyAgICAgICAgICAgIChieXRlKSAweDRjLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MzUsIChieXRlKSAweGNlLCAoYnl0ZSkgMHg0NiwKKyAgICAgICAgICAgIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg4YywgKGJ5dGUpIDB4ZTQsIChieXRlKSAweDYyLCAoYnl0ZSkgMHgzNiwKKyAgICAgICAgICAgIChieXRlKSAweDFhLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4MGUsIChieXRlKSAweDMzLCAoYnl0ZSkgMHg1NiwKKyAgICAgICAgICAgIChieXRlKSAweGY5LCAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4YTAsIChieXRlKSAweGM0LCAoYnl0ZSkgMHhiNiwKKyAgICAgICAgICAgIChieXRlKSAweDgyLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4N2QsIChieXRlKSAweDM2LCAoYnl0ZSkgMHg1NSwKKyAgICAgICAgICAgIChieXRlKSAweGMwLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDM1LCAoYnl0ZSkgMHg1NCwKKyAgICAgICAgICAgIChieXRlKSAweGJkLCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHhiZiwKKyAgICAgICAgICAgIChieXRlKSAweDEwLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4MWIsIChieXRlKSAweDUxLCAoYnl0ZSkgMHgwMiwKKyAgICAgICAgICAgIChieXRlKSAweDQxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4ZTcsIChieXRlKSAweDY4LCAoYnl0ZSkgMHgwMywKKyAgICAgICAgICAgIChieXRlKSAweDNlLCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHgyNCwKKyAgICAgICAgICAgIChieXRlKSAweDdiLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweGEwLCAoYnl0ZSkgMHhhMiwKKyAgICAgICAgICAgIChieXRlKSAweGQ5LCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4NmQsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg4MSwKKyAgICAgICAgICAgIChieXRlKSAweDhmLCAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4MmQsIChieXRlKSAweDdhLCAoYnl0ZSkgMHg5NSwKKyAgICAgICAgICAgIChieXRlKSAweDJlLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4OWYsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHg4NiwKKyAgICAgICAgICAgIChieXRlKSAweDI5LCAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4YmQsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg3ZSwKKyAgICAgICAgICAgIChieXRlKSAweDRmLCAoYnl0ZSkgMHhkYiwgKGJ5dGUpIDB4NTYsIChieXRlKSAweGYxLCAoYnl0ZSkgMHg3NSwKKyAgICAgICAgICAgIChieXRlKSAweGQwLCAoYnl0ZSkgMHg0YiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDNhLCAoYnl0ZSkgMHhlMCwKKyAgICAgICAgICAgIChieXRlKSAweDI2LCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4YWIsIChieXRlKSAweDllLCAoYnl0ZSkgMHgwYiwKKyAgICAgICAgICAgIChieXRlKSAweDJhLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4YTgsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhmZiwKKyAgICAgICAgICAgIChieXRlKSAweGJlLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweDliLCAoYnl0ZSkgMHg4MSwKKyAgICAgICAgICAgIChieXRlKSAweGM3LCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDczLCAoYnl0ZSkgMHhlMSwKKyAgICAgICAgICAgIChieXRlKSAweDJiLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHhjNSwKKyAgICAgICAgICAgIChieXRlKSAweDNkLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4YWIsIChieXRlKSAweGU2LCAoYnl0ZSkgMHhhYiwKKyAgICAgICAgICAgIChieXRlKSAweDNlLCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4ZmQsIChieXRlKSAweDk4LCAoYnl0ZSkgMHhkMCwKKyAgICAgICAgICAgIChieXRlKSAweGE0LCAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4NTgsIChieXRlKSAweGVlLCAoYnl0ZSkgMHg0OCwKKyAgICAgICAgICAgIChieXRlKSAweDQ1LCAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4NjYsIChieXRlKSAweGFjLCAoYnl0ZSkgMHhlOSwKKyAgICAgICAgICAgIChieXRlKSAweDRkLCAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4NjAsIChieXRlKSAweGVhLCAoYnl0ZSkgMHgyNCwKKyAgICAgICAgICAgIChieXRlKSAweGZmLCAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDY3LCAoYnl0ZSkgMHhjNSwKKyAgICAgICAgICAgIChieXRlKSAweGZkLCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MjgsIChieXRlKSAweGVhLCAoYnl0ZSkgMHg3NCwKKyAgICAgICAgICAgIChieXRlKSAweDg4LCAoYnl0ZSkgMHhkMSwgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGFkLCAoYnl0ZSkgMHg1OCwKKyAgICAgICAgICAgIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4NjcsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhjMSwKKyAgICAgICAgICAgIChieXRlKSAweGUzLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4ZGIsIChieXRlKSAweDUyLCAoYnl0ZSkgMHhhZCwKKyAgICAgICAgICAgIChieXRlKSAweGYzLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4MjEsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHg4YywKKyAgICAgICAgICAgIChieXRlKSAweDRjLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4MjcsIChieXRlKSAweGRiLCAoYnl0ZSkgMHhkMCwKKyAgICAgICAgICAgIChieXRlKSAweDM1LCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4YzcsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4OTksIChieXRlKSAweDQyLCAoYnl0ZSkgMHhiNCwKKyAgICAgICAgICAgIChieXRlKSAweDc2LCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4OTcsIChieXRlKSAweDU1LCAoYnl0ZSkgMHhmOSwKKyAgICAgICAgICAgIChieXRlKSAweGRhLCAoYnl0ZSkgMHgzYiwgKGJ5dGUpIDB4YTAsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHgwZSwKKyAgICAgICAgICAgIChieXRlKSAweGRjLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4MzMsIChieXRlKSAweDdmLCAoYnl0ZSkgMHhiZCwKKyAgICAgICAgICAgIChieXRlKSAweGNmLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg4OSwKKyAgICAgICAgICAgIChieXRlKSAweGY3LCAoYnl0ZSkgMHg0ZiwgKGJ5dGUpIDB4NWEsIChieXRlKSAweDA3LCAoYnl0ZSkgMHg3YywKKyAgICAgICAgICAgIChieXRlKSAweGE5LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NDcsIChieXRlKSAweDY4LCAoYnl0ZSkgMHgzNSwKKyAgICAgICAgICAgIChieXRlKSAweGE4LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4M2QsIChieXRlKSAweGZkLCAoYnl0ZSkgMHgwNCwKKyAgICAgICAgICAgIChieXRlKSAweDdiLCAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MzEsIChieXRlKSAweDBkLCAoYnl0ZSkgMHhjOCwKKyAgICAgICAgICAgIChieXRlKSAweGEzLCAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4MzQsIChieXRlKSAweGEwLCAoYnl0ZSkgMHg1MCwKKyAgICAgICAgICAgIChieXRlKSAweDQ0LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4ZjEsIChieXRlKSAweDBjLCAoYnl0ZSkgMHhlNiwKKyAgICAgICAgICAgIChieXRlKSAweGU1LCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDNkLCAoYnl0ZSkgMHhmOCwKKyAgICAgICAgICAgIChieXRlKSAweDNkLCAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDFjLCAoYnl0ZSkgMHhkYiwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDgyLCAoYnl0ZSkgMHg5YiwKKyAgICAgICAgICAgIChieXRlKSAweDhhLCAoYnl0ZSkgMHhmZCwgKGJ5dGUpIDB4YTEsIChieXRlKSAweDk4LCAoYnl0ZSkgMHg0MSwKKyAgICAgICAgICAgIChieXRlKSAweDY4LCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGRmLCAoYnl0ZSkgMHg0ZSwKKyAgICAgICAgICAgIChieXRlKSAweGYzLCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4MjYsIChieXRlKSAweDUzLCAoYnl0ZSkgMHg1YiwKKyAgICAgICAgICAgIChieXRlKSAweDMxLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4N2EsIChieXRlKSAweGNjLCAoYnl0ZSkgMHg1ZSwKKyAgICAgICAgICAgIChieXRlKSAweGJiLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4YTIsIChieXRlKSAweGUyLCAoYnl0ZSkgMHg2ZiwKKyAgICAgICAgICAgIChieXRlKSAweDRhLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MGQsIChieXRlKSAweGVmLCAoYnl0ZSkgMHg5MCwKKyAgICAgICAgICAgIChieXRlKSAweDE1LCAoYnl0ZSkgMHhiZSwgKGJ5dGUpIDB4MTAsIChieXRlKSAweDRhLCAoYnl0ZSkgMHhhYywKKyAgICAgICAgICAgIChieXRlKSAweDkyLCAoYnl0ZSkgMHhlYiwgKGJ5dGUpIDB4ZGEsIChieXRlKSAweDcyLCAoYnl0ZSkgMHhkYiwKKyAgICAgICAgICAgIChieXRlKSAweDQzLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4YjcsIChieXRlKSAweDJiLCAoYnl0ZSkgMHg0YywKKyAgICAgICAgICAgIChieXRlKSAweGUxLCAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4NTgsIChieXRlKSAweGNiLCAoYnl0ZSkgMHg3MSwKKyAgICAgICAgICAgIChieXRlKSAweDgwLCAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4YmMsIChieXRlKSAweGRjLCAoYnl0ZSkgMHg2MiwKKyAgICAgICAgICAgIChieXRlKSAweDVlLCAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4Y2IsIChieXRlKSAweDkyLCAoYnl0ZSkgMHhkYSwKKyAgICAgICAgICAgIChieXRlKSAweGY2LCAoYnl0ZSkgMHhkZiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDQwLCAoYnl0ZSkgMHg0ZCwKKyAgICAgICAgICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4YzUsIChieXRlKSAweDc3LCAoYnl0ZSkgMHgzMCwKKyAgICAgICAgICAgIChieXRlKSAweGI3LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweGE4LCAoYnl0ZSkgMHhmMSwKKyAgICAgICAgICAgIChieXRlKSAweGI0LCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDYzLCAoYnl0ZSkgMHgwMCwKKyAgICAgICAgICAgIChieXRlKSAweGIyLCAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4M2UsIChieXRlKSAweDdkLCAoYnl0ZSkgMHhkNiwKKyAgICAgICAgICAgIChieXRlKSAweDRkLCAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4OGEsIChieXRlKSAweGMxLCAoYnl0ZSkgMHhiMSwKKyAgICAgICAgICAgIChieXRlKSAweDk4LCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDQwLCAoYnl0ZSkgMHgxNCwKKyAgICAgICAgICAgIChieXRlKSAweDFiLCAoYnl0ZSkgMHgwZSwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDhmLCAoYnl0ZSkgMHhmNCwKKyAgICAgICAgICAgIChieXRlKSAweGJlLCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4NzksIChieXRlKSAweDc5LCAoYnl0ZSkgMHg5NSwKKyAgICAgICAgICAgIChieXRlKSAweDE5LCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NTEsIChieXRlKSAweDA4LCAoYnl0ZSkgMHg2NiwKKyAgICAgICAgICAgIChieXRlKSAweGMxLCAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweGIzLCAoYnl0ZSkgMHg3YSwKKyAgICAgICAgICAgIChieXRlKSAweDg2LCAoYnl0ZSkgMHg5ZiwgKGJ5dGUpIDB4M2UsIChieXRlKSAweGY1LCAoYnl0ZSkgMHgxOSwKKyAgICAgICAgICAgIChieXRlKSAweGEzLCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY5LCAoYnl0ZSkgMHgxNCwKKyAgICAgICAgICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHg1MCwgKGJ5dGUpIDB4OTcsIH07CisKKyAgICAvLyB2YWxpZCBQcml2YXRlS2V5SW5mbyBlbmNvZGluZyAoRGFtYWdlZCkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gcHJpdmF0ZUtleUluZm9EYW1hZ2VkID0geyAoYnl0ZSkgMHgzMCwKKyAgICAgICAgICAgIChieXRlKSAweDgyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MGQsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwOSwKKyAgICAgICAgICAgIChieXRlKSAweDJhLCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDg2LCAoYnl0ZSkgMHhmNywKKyAgICAgICAgICAgIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwNSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNCwgLy8gcHJpdmF0ZSBrZXkgb2N0ZXQgc3RyCisgICAgICAgICAgICAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDYyLCAvLyBEYW1hZ2U6IGw9NDYwLT40NjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICgweDYxLT4weDYyKQorICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDgyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NWQsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweGIyLCAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDViLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4Y2QsIChieXRlKSAweDY1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDYzLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWIsIChieXRlKSAweDkyLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4ZjgsIChieXRlKSAweDU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NWUsIChieXRlKSAweDdjLCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4NTAsIChieXRlKSAweDE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWMsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4NTgsIChieXRlKSAweDQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmIsIChieXRlKSAweDQxLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4NTksIChieXRlKSAweGYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTEsIChieXRlKSAweDVkLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NzEsIChieXRlKSAweDRkLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4YjYsIChieXRlKSAweDZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2YsIChieXRlKSAweDVkLCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4Y2QsIChieXRlKSAweDE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWMsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4MzksIChieXRlKSAweGIxLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2IsIChieXRlKSAweGUyLCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4OTYsIChieXRlKSAweDc3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YmUsIChieXRlKSAweGQwLCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweDJkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmIsIChieXRlKSAweDI0LCAoYnl0ZSkgMHhhYSwgKGJ5dGUpIDB4MTQsIChieXRlKSAweGJhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDc5LCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjgsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4NTQsIChieXRlKSAweGEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmEsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4MGEsIChieXRlKSAweDJhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweGE2LCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4OWUsIChieXRlKSAweDdkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjksIChieXRlKSAweDMzLCAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweGZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDNmLCAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4YzcsIChieXRlKSAweDZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWQsIChieXRlKSAweGFhLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTIsIChieXRlKSAweGVkLCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDRiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGUsIChieXRlKSAweGM4LCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTYsIChieXRlKSAweDM3LCAoYnl0ZSkgMHhhZiwgKGJ5dGUpIDB4MTEsIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDBlLCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4ZmYsIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGMsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4NmQsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgwLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDcyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDAsIChieXRlKSAweDkwLCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4OTYsIChieXRlKSAweDVkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjMsIChieXRlKSAweDg0LCAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4OTksIChieXRlKSAweGQ5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NGUsIChieXRlKSAweDUxLCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGQsIChieXRlKSAweGQyLCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDczLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDdjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjYsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4N2MsIChieXRlKSAweGRjLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2EsIChieXRlKSAweGMyLCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4NTEsIChieXRlKSAweDlhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWUsIChieXRlKSAweGE0LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4OGQsIChieXRlKSAweGY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjksIChieXRlKSAweDgxLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4YmUsIChieXRlKSAweDE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGM3LCAoYnl0ZSkgMHgzYywgKGJ5dGUpIDB4MDAsIChieXRlKSAweGExLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjksIChieXRlKSAweDYwLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDhmLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWMsIChieXRlKSAweGZkLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWIsIChieXRlKSAweDdmLCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4ZjEsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzMsIChieXRlKSAweDYzLCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NWMsIChieXRlKSAweGMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjIsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4ZWUsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWYsIChieXRlKSAweDVlLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4NDgsIChieXRlKSAweGJhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweGJhLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4YjcsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWMsIChieXRlKSAweDRjLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MzUsIChieXRlKSAweGNlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDYsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg4YywgKGJ5dGUpIDB4ZTQsIChieXRlKSAweDYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzYsIChieXRlKSAweDFhLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4MGUsIChieXRlKSAweDMzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTYsIChieXRlKSAweGY5LCAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4YTAsIChieXRlKSAweGM0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjYsIChieXRlKSAweDgyLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4N2QsIChieXRlKSAweDM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTUsIChieXRlKSAweGMwLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweGJkLCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmYsIChieXRlKSAweDEwLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4MWIsIChieXRlKSAweDUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDQxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4ZTcsIChieXRlKSAweDY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDNlLCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjQsIChieXRlKSAweDdiLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweGEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTIsIChieXRlKSAweGQ5LCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4NmQsIChieXRlKSAweDc5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweDhmLCAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4MmQsIChieXRlKSAweDdhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTUsIChieXRlKSAweDJlLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4OWYsIChieXRlKSAweGQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODYsIChieXRlKSAweDI5LCAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4YmQsIChieXRlKSAweDA0LAorICAgICAgICAgICAgKGJ5dGUpIDB4N2UsIChieXRlKSAweDRmLCAoYnl0ZSkgMHhkYiwgKGJ5dGUpIDB4NTYsIChieXRlKSAweGYxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsIChieXRlKSAweGQwLCAoYnl0ZSkgMHg0YiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDNhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTAsIChieXRlKSAweDI2LCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4YWIsIChieXRlKSAweDllLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDJhLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4YTgsIChieXRlKSAweGQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsIChieXRlKSAweGJlLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweDliLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweGM3LCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDczLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTEsIChieXRlKSAweDJiLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzUsIChieXRlKSAweDNkLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4YWIsIChieXRlKSAweGU2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YWIsIChieXRlKSAweDNlLCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4ZmQsIC8vIDg4CisgICAgICAgICAgICAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGE0LCAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4NTgsCisgICAgICAgICAgICAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4NjYsCisgICAgICAgICAgICAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4ZTksIChieXRlKSAweDRkLCAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4NjAsCisgICAgICAgICAgICAoYnl0ZSkgMHhlYSwgKGJ5dGUpIDB4MjQsIChieXRlKSAweGZmLCAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4MGMsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NywgKGJ5dGUpIDB4YzUsIChieXRlKSAweGZkLCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MjgsCisgICAgICAgICAgICAoYnl0ZSkgMHhlYSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDg4LCAoYnl0ZSkgMHhkMSwgKGJ5dGUpIDB4ZDEsCisgICAgICAgICAgICAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4NTgsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4NjcsCisgICAgICAgICAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4YzEsIChieXRlKSAweGUzLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4ZGIsCisgICAgICAgICAgICAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4YWQsIChieXRlKSAweGYzLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4MjEsCisgICAgICAgICAgICAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4OGMsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4MjcsCisgICAgICAgICAgICAoYnl0ZSkgMHhkYiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweDM1LCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4YzcsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4OTksCisgICAgICAgICAgICAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4YjQsIChieXRlKSAweDc2LCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4OTcsCisgICAgICAgICAgICAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4ZjksIChieXRlKSAweGRhLCAoYnl0ZSkgMHgzYiwgKGJ5dGUpIDB4YTAsCisgICAgICAgICAgICAoYnl0ZSkgMHhkNywgKGJ5dGUpIDB4MGUsIChieXRlKSAweGRjLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4MzMsCisgICAgICAgICAgICAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4YmQsIChieXRlKSAweGNmLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZWIsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4ODksIChieXRlKSAweGY3LCAoYnl0ZSkgMHg0ZiwgKGJ5dGUpIDB4NWEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4N2MsIChieXRlKSAweGE5LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NDcsCisgICAgICAgICAgICAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4MzUsIChieXRlKSAweGE4LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4M2QsCisgICAgICAgICAgICAoYnl0ZSkgMHhmZCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDdiLCAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MzEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4YzgsIChieXRlKSAweGEzLCAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4MzQsCisgICAgICAgICAgICAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4NTAsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4ZjEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4ZTYsIChieXRlKSAweGU1LCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4NDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4ZjgsIChieXRlKSAweDNkLCAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4MGIsIC8vIDExOAorICAgICAgICAgICAgKGJ5dGUpIDB4MWMsIChieXRlKSAweGRiLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDliLCAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4ZmQsIChieXRlKSAweGExLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTgsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4YzIsIChieXRlKSAweGQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGYsIChieXRlKSAweDRlLCAoYnl0ZSkgMHhmMywgKGJ5dGUpIDB4MmUsIChieXRlKSAweDI2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDViLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4YjEsIChieXRlKSAweDdhLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2MsIChieXRlKSAweDVlLCAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4MDksIChieXRlKSAweGEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDBkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWYsIChieXRlKSAweDkwLCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4YmUsIChieXRlKSAweDEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGEsIChieXRlKSAweGFjLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzIsIChieXRlKSAweGRiLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4MDgsIChieXRlKSAweGI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MmIsIChieXRlKSAweDRjLCAoYnl0ZSkgMHhlMSwgKGJ5dGUpIDB4YmIsIChieXRlKSAweDU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2IsIChieXRlKSAweDcxLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4YWQsIChieXRlKSAweGJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGMsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg1ZSwgKGJ5dGUpIDB4M2UsIChieXRlKSAweGNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTIsIChieXRlKSAweGRhLCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4ZGYsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDAsIChieXRlKSAweDRkLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4OTAsIChieXRlKSAweGM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweDMwLCAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4MjksIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTgsIChieXRlKSAweGYxLCAoYnl0ZSkgMHhiNCwgKGJ5dGUpIDB4YWUsIChieXRlKSAweDUyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHhiMiwgLy8gMTQwCisgICAgICAgICAgICAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4M2UsIChieXRlKSAweDdkLCAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4NGQsCisgICAgICAgICAgICAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4OGEsIChieXRlKSAweGMxLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4OTgsCisgICAgICAgICAgICAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDQwLCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4MWIsCisgICAgICAgICAgICAoYnl0ZSkgMHgwZSwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDhmLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4YmUsCisgICAgICAgICAgICAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4NzksIChieXRlKSAweDc5LCAoYnl0ZSkgMHg5NSwgKGJ5dGUpIDB4MTksCisgICAgICAgICAgICAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NTEsIChieXRlKSAweDA4LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4YzEsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweGIzLCAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4ODYsCisgICAgICAgICAgICAoYnl0ZSkgMHg5ZiwgKGJ5dGUpIDB4M2UsIChieXRlKSAweGY1LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4YTMsIC8vIDE1MAorICAgICAgICAgICAgKGJ5dGUpIDB4YWUsIChieXRlKSAweDY0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4MTQsIChieXRlKSAweDA3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTAsIChieXRlKSAweDk3LCB9OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGEzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworQFRlc3RUYXJnZXRDbGFzcyhFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24uY2xhc3MpCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQKKyAqIG1ldGhvZHMuCisgKiAKKyAqLworcHVibGljIGNsYXNzIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UiIH07CisKKyAgICBzdGF0aWMgVGhyb3dhYmxlIHRDYXVzZSA9IG5ldyBUaHJvd2FibGUoIlRocm93YWJsZSBmb3IgZXhjZXB0aW9uIik7CisKKyAgICBzdGF0aWMgU3RyaW5nIGNyZWF0ZUVycihFeGNlcHRpb24gdEUsIEV4Y2VwdGlvbiBlRSkgeworICAgICAgICByZXR1cm4gIkV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbjogIi5jb25jYXQodEUudG9TdHJpbmcoKSkuY29uY2F0KAorICAgICAgICAgICAgICAgICIgaXMgbm90IGVxdWFsIHRvIGNhdWdodCBleGNlcHRpb246ICIpLmNvbmNhdChlRS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uMDEoKSB7CisgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB0RSA9IG5ldyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24oKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJvdyB0RTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY3JlYXRlRXJyKHRFLCBlKSwgdEUuZXF1YWxzKGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZQorICAgICAqIG1zZy4gUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24wMigpIHsKKyAgICAgICAgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhyb3cgdEU7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY3JlYXRlRXJyKHRFLCBlKSwgdEUuZXF1YWxzKGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24gd2hlbiA8Y29kZT5tc2c8L2NvZGU+CisgICAgICogaXMgbnVsbAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24wMygpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB0RSA9IG5ldyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24obXNnKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJvdyB0RTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY3JlYXRlRXJyKHRFLCBlKSwgdEUuZXF1YWxzKGUpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtU3BpVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtU3BpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjgyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21TcGlUZXN0LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLlNob3J0QnVmZmVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21TcGk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0Lk15RXhlbXB0aW9uTWVjaGFuaXNtU3BpOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKK0BUZXN0VGFyZ2V0Q2xhc3MoRXhlbXB0aW9uTWVjaGFuaXNtU3BpLmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RXhlbXB0aW9uTWVjaGFuaXNtU3BpPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCisgKiBtZXRob2RzLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVtcHRpb25NZWNoYW5pc21TcGlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworY2xhc3MgTW9ja19FeGVtcHRpb25NZWNoYW5pc21TcGkgZXh0ZW5kcyBNeUV4ZW1wdGlvbk1lY2hhbmlzbVNwaXsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lR2VuRXhlbXB0aW9uQmxvYigpIHRocm93cyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lR2VuRXhlbXB0aW9uQmxvYigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZW5naW5lR2VuRXhlbXB0aW9uQmxvYihieXRlW10gb3V0cHV0LCBpbnQgb3V0cHV0T2Zmc2V0KSB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24sIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzdXBlci5lbmdpbmVHZW5FeGVtcHRpb25CbG9iKG91dHB1dCwgb3V0cHV0T2Zmc2V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE91dHB1dFNpemUoaW50IGlucHV0TGVuKSB7CisgICAgICAgIHJldHVybiBzdXBlci5lbmdpbmVHZXRPdXRwdXRTaXplKGlucHV0TGVuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KEtleSBrZXkpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmdpbmVJbml0KGtleSk7CisgICAgICAgIAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmdpbmVJbml0KGtleSwgcGFyYW1zKTsKKyAgICAgICAgCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmVuZ2luZUluaXQoa2V5LCBwYXJhbXMpOworICAgICAgICAKKyAgICB9CisgICAgCit9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEV4ZW1wdGlvbk1lY2hhbmlzbVNwaVRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIEV4ZW1wdGlvbk1lY2hhbmlzbVNwaVRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+RXhlbXB0aW9uTWVjaGFuaXNtU3BpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBFeGVtcHRpb25NZWNoYW5pc21TcGkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFeGVtcHRpb25NZWNoYW5pc21TcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlbXB0aW9uTWVjaGFuaXNtU3BpMDEoKSAKKyAgICAgICAgICAgIHRocm93cyAgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hvcnRCdWZmZXJFeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja19FeGVtcHRpb25NZWNoYW5pc21TcGkgZW1TcGkgPSBuZXcgTW9ja19FeGVtcHRpb25NZWNoYW5pc21TcGkoKXt9OworICAgICAgICBpbnQgbGVuID0gTXlFeGVtcHRpb25NZWNoYW5pc21TcGkuZ2V0TGVuZ3RoKCk7CisgICAgICAgIGJ5dGUgW10gYmJSZXMgPSBlbVNwaS5lbmdpbmVHZW5FeGVtcHRpb25CbG9iKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxlbmd0aCIsIGJiUmVzLmxlbmd0aCwgbGVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcmVzdWx0IiwgCisgICAgICAgICAgICAgICAgZW1TcGkuZW5naW5lR2VuRXhlbXB0aW9uQmxvYihuZXcgYnl0ZVsxXSwgbGVuKSwgbGVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IHNpemUiLCAxMCwgZW1TcGkuZW5naW5lR2V0T3V0cHV0U2l6ZSgxMDApKTsKKyAgICAgICAgS2V5IGtleSA9IG51bGw7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW1zID0gbnVsbDsgICAgICAgIAorICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhclNwZWMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW1TcGkuZW5naW5lSW5pdChrZXkpOworICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZW1TcGkuZW5naW5lSW5pdChrZXksIHBhcmFtcyk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkS2V5RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbVNwaS5lbmdpbmVJbml0KGtleSwgcGFyU3BlYyk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkS2V5RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGtleSA9ICgoTXlFeGVtcHRpb25NZWNoYW5pc21TcGkpZW1TcGkpLm5ldyB0bXAxS2V5KCJQcm9iYSIsIG5ldyBieXRlWzBdKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtU3BpLmVuZ2luZUluaXQoa2V5KTsKKyAgICAgICAgICAgIGZhaWwoIkV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbVNwaS5lbmdpbmVJbml0KGtleSwgcGFyYW1zKTsKKyAgICAgICAgICAgIGZhaWwoIkV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbVNwaS5lbmdpbmVJbml0KGtleSwgcGFyU3BlYyk7CisgICAgICAgICAgICBmYWlsKCJFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBrZXkgPSAoKE15RXhlbXB0aW9uTWVjaGFuaXNtU3BpKWVtU3BpKS5uZXcgdG1wS2V5KCJQcm9iYSIsIG5ldyBieXRlWzBdKTsKKyAgICAgICAgZW1TcGkuZW5naW5lSW5pdChrZXkpOworICAgICAgICBlbVNwaS5lbmdpbmVJbml0KGtleSwgcGFyYW1zKTsKKyAgICAgICAgZW1TcGkuZW5naW5lSW5pdChrZXksIHBhclNwZWMpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcmVzdWx0IiwgMTAsIGVtU3BpLmVuZ2luZUdldE91dHB1dFNpemUoMTAwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzY5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21UZXN0LmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguY3J5cHRvLkV4ZW1wdGlvbk1lY2hhbmlzbTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uRXhlbXB0aW9uTWVjaGFuaXNtU3BpOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0Lk15RXhlbXB0aW9uTWVjaGFuaXNtU3BpOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydC5NeUV4ZW1wdGlvbk1lY2hhbmlzbVNwaS50bXBLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3BpRW5nVXRpbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRXhlbXB0aW9uTWVjaGFuaXNtLmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RXhlbXB0aW9uTWVjaGFuaXNtPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBFeGVtcHRpb25NZWNoYW5pc21UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNydkV4ZW1wdGlvbk1lY2hhbmlzbSA9ICJFeGVtcHRpb25NZWNoYW5pc20iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRBbGcgPSAiRU1lY2giOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEV4ZW1wdGlvbk1lY2hhbmlzbVByb3ZpZGVyQ2xhc3MgPSAib3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0Lk15RXhlbXB0aW9uTWVjaGFuaXNtU3BpIjsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkV4ZW1wdGlvbk1lY2hhbmlzbTwvY29kZT4gY29uc3RydWN0b3IgCisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIG5ldyBvYmplY3QgdXNpbmcgcHJvdmlkZXIgYW5kIG1lY2hhbmlzbSBuYW1lCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRXhlbXB0aW9uTWVjaGFuaXNtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21TcGkuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVtcHRpb25NZWNoYW5pc20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvdmlkZXIgbVByb3YgPSAobmV3IFNwaUVuZ1V0aWxzKCkpLm5ldyBNeVByb3ZpZGVyKCJNeUV4TWVjaFByb3ZpZGVyIiwKKyAgICAgICAgICAgICAgICAiUHJvdmlkZXIgZm9yIEV4ZW1wdGlvbk1lY2hhbmlzbSB0ZXN0aW5nIiwKKyAgICAgICAgICAgICAgICBzcnZFeGVtcHRpb25NZWNoYW5pc20uY29uY2F0KCIuIikuY29uY2F0KGRlZmF1bHRBbGcpLAorICAgICAgICAgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbVByb3ZpZGVyQ2xhc3MpOworCisgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbVNwaSBzcGkgPSBuZXcgTXlFeGVtcHRpb25NZWNoYW5pc21TcGkoKTsKKworICAgICAgICBFeGVtcHRpb25NZWNoYW5pc20gZW0gPSBuZXcgRXhlbXB0aW9uTWVjaGFuaXNtKHNwaSwgbVByb3YsIGRlZmF1bHRBbGcpIHt9OworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGVtLmdldFByb3ZpZGVyKCksIG1Qcm92KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgZW0uZ2V0TmFtZSgpLCBkZWZhdWx0QWxnKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmluaXQobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkS2V5RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkge30KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uZ2V0T3V0cHV0U2l6ZSgxMDApOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7fQorCisKKyAgICAgICAgZW0gPSBuZXcgRXhlbXB0aW9uTWVjaGFuaXNtKG51bGwsIG51bGwsIG51bGwpIHt9OworICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgbWVjaGFuaXNtIiwgZW0uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IHByb3ZpZGVyIiwgZW0uZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5pbml0KG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkge30KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmdldE91dHB1dFNpemUoMTAwKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXgvY3J5cHRvL0V4ZW1wdGlvbk1lY2hhbmlzbSNnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpCisgICAgICogQ2hlY2tzIGV4Y2VwdGlvbiBvcmRlcgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNzYyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVtcHRpb25NZWNoYW5pc20uZ2V0SW5zdGFuY2UoKFN0cmluZykgbnVsbCwgImFhYSIpOworICAgICAgICAgICAgZmFpbCgiTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5pc0NyeXB0b0FsbG93ZWQoS2V5IGtleSk8L2NvZGU+IG1ldGhvZCAKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0NyeXB0b0FsbG93ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0NyeXB0b0FsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTAyOQorICAgICAgICBQcm92aWRlciBtUHJvdiA9IChuZXcgU3BpRW5nVXRpbHMoKSkubmV3IE15UHJvdmlkZXIoIk15RXhNZWNoUHJvdmlkZXIiLAorICAgICAgICAgICAgICAgICJQcm92aWRlciBmb3IgRXhlbXB0aW9uTWVjaGFuaXNtIHRlc3RpbmciLAorICAgICAgICAgICAgICAgIHNydkV4ZW1wdGlvbk1lY2hhbmlzbS5jb25jYXQoIi4iKS5jb25jYXQoZGVmYXVsdEFsZyksCisgICAgICAgICAgICAgICAgRXhlbXB0aW9uTWVjaGFuaXNtUHJvdmlkZXJDbGFzcyk7CisKKyAgICAgICAgRXhlbXB0aW9uTWVjaGFuaXNtIGVtID0gbmV3IEV4ZW1wdGlvbk1lY2hhbmlzbSgKKyAgICAgICAgICAgICAgICBuZXcgTXlFeGVtcHRpb25NZWNoYW5pc21TcGkoKSwgbVByb3YsIGRlZmF1bHRBbGcpIHsKKyAgICAgICAgfTsKKworICAgICAgICBLZXkga2V5ID0gbmV3IE15RXhlbXB0aW9uTWVjaGFuaXNtU3BpKCkubmV3IHRtcEtleSgiUHJvYmEiLCBuZXcgYnl0ZVswXSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoZW0uaXNDcnlwdG9BbGxvd2VkKGtleSkpOworCisgICAgICAgIGVtLmluaXQoa2V5KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZW0uaXNDcnlwdG9BbGxvd2VkKGtleSkpOworCisgICAgICAgIGVtLmdlbkV4ZW1wdGlvbkJsb2IoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbS5pc0NyeXB0b0FsbG93ZWQoa2V5KSk7CisKKyAgICAgICAgS2V5IGtleTEgPSBuZXcgTXlFeGVtcHRpb25NZWNoYW5pc21TcGkoKS5uZXcgdG1wS2V5KCJQcm9iYSIsCisgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDEgfSk7CisgICAgICAgIGFzc2VydEZhbHNlKGVtLmlzQ3J5cHRvQWxsb3dlZChrZXkxKSk7CisKKyAgICAgICAgZW0uaW5pdChrZXkxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZW0uaXNDcnlwdG9BbGxvd2VkKGtleSkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZW5FeGVtcHRpb25CbG9iKChieXRlW10gb3V0cHV0LCBpbnQgb3V0cHV0T2Zmc2V0KTwvY29kZT4gbWV0aG9kCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5FeGVtcHRpb25CbG9iIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuRXhlbXB0aW9uQmxvYigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xMDI5CisgICAgICAgIFByb3ZpZGVyIG1Qcm92ID0gKG5ldyBTcGlFbmdVdGlscygpKS5uZXcgTXlQcm92aWRlcigiTXlFeE1lY2hQcm92aWRlciIsCisgICAgICAgICAgICAgICAgIlByb3ZpZGVyIGZvciBFeGVtcHRpb25NZWNoYW5pc20gdGVzdGluZyIsCisgICAgICAgICAgICAgICAgc3J2RXhlbXB0aW9uTWVjaGFuaXNtLmNvbmNhdCgiLiIpLmNvbmNhdChkZWZhdWx0QWxnKSwKKyAgICAgICAgICAgICAgICBFeGVtcHRpb25NZWNoYW5pc21Qcm92aWRlckNsYXNzKTsKKworICAgICAgICBFeGVtcHRpb25NZWNoYW5pc20gZW0gPSBuZXcgRXhlbXB0aW9uTWVjaGFuaXNtKAorICAgICAgICAgICAgICAgIG5ldyBNeUV4ZW1wdGlvbk1lY2hhbmlzbVNwaSgpLCBtUHJvdiwgZGVmYXVsdEFsZykgeworICAgICAgICB9OworCisgICAgICAgIEtleSBrZXkgPSBuZXcgTXlFeGVtcHRpb25NZWNoYW5pc21TcGkoKS5uZXcgdG1wS2V5KCJQcm9iYSIsIG5ldyBieXRlWzBdKTsKKworICAgICAgICBlbS5pbml0KGtleSk7CisgICAgICAgIC8vIEV4ZW1wdGlvbk1lY2hhbmlzbSBkb2Vzbid0IGNoZWNrIHBhcmFtZXRlcnMKKyAgICAgICAgLy8gaXQgaXMgYSByZXNwb25zaWJpbGl0eSBvZiBFeGVtcHRpb25NZWNoYW5pc21TcGkKKyAgICAgICAgZW0uZ2VuRXhlbXB0aW9uQmxvYihudWxsLCAwKTsKKyAgICAgICAgZW0uZ2VuRXhlbXB0aW9uQmxvYihuZXcgYnl0ZVswXSwgMCk7CisgICAgICAgIGVtLmdlbkV4ZW1wdGlvbkJsb2IobmV3IGJ5dGVbMTBdLCAtNSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb25UZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzgzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCitAVGVzdFRhcmdldENsYXNzKElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24uY2xhc3MpCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCisgKiBtZXRob2RzLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIiB9OworCisgICAgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+SWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24wMSgpIHsKKyAgICAgICAgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiB0RSA9IG5ldyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPklsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KKyAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uMDIoKSB7CisgICAgICAgIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPklsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIHRFID0gbmV3IElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24obXNnKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vS2V5QWdyZWVtZW50U3BpVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vS2V5QWdyZWVtZW50U3BpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzQ2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9LZXlBZ3JlZW1lbnRTcGlUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworaW1wb3J0IGphdmF4LmNyeXB0by5TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5QWdyZWVtZW50U3BpOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0Lk15S2V5QWdyZWVtZW50U3BpOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitAVGVzdFRhcmdldENsYXNzKEtleUFncmVlbWVudFNwaS5jbGFzcykKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPktleUFncmVlbWVudFNwaTwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgorICogCisgKi8KKworcHVibGljIGNsYXNzIEtleUFncmVlbWVudFNwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgY2xhc3MgTW9ja19LZXlBZ3JlZW1lbnRTcGkgZXh0ZW5kcyBNeUtleUFncmVlbWVudFNwaSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBLZXkgZW5naW5lRG9QaGFzZShLZXkga2V5LCBib29sZWFuIGxhc3RQaGFzZSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lRG9QaGFzZShrZXksIGxhc3RQaGFzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZW5lcmF0ZVNlY3JldCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdlbmVyYXRlU2VjcmV0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldChTdHJpbmcgYWxnb3JpdGhtKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdlbmVyYXRlU2VjcmV0KGFsZ29yaXRobSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBlbmdpbmVHZW5lcmF0ZVNlY3JldChieXRlW10gc2hhcmVkU2VjcmV0LCBpbnQgb2Zmc2V0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lR2VuZXJhdGVTZWNyZXQoc2hhcmVkU2VjcmV0LCBvZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIuZW5naW5lSW5pdChrZXksIHJhbmRvbSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIuZW5naW5lSW5pdChrZXksIHBhcmFtcywgcmFuZG9tKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEtleUFncmVlbWVudFNwaVRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIEtleUFncmVlbWVudFNwaVRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+S2V5QWdyZWVtZW50U3BpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMKKyAgICAgKiBLZXlBZ3JlZW1lbnRTcGkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlBZ3JlZW1lbnRTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5QWdyZWVtZW50U3BpMDEoKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNob3J0QnVmZmVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIAorICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIE1vY2tfS2V5QWdyZWVtZW50U3BpIGthU3BpID0gbmV3IE1vY2tfS2V5QWdyZWVtZW50U3BpKCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgcmVzdWx0Iiwga2FTcGkuZW5naW5lRG9QaGFzZShudWxsLCB0cnVlKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrYVNwaS5lbmdpbmVEb1BoYXNlKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBiYiA9IGthU3BpLmVuZ2luZUdlbmVyYXRlU2VjcmV0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGVuZ3RoIGlzIG5vdCAwIiwgYmIubGVuZ3RoLCAwKTsgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGludGVnZXIgaXMgbm90IDAiLCAKKyAgICAgICAgICAgICAgICBrYVNwaS5lbmdpbmVHZW5lcmF0ZVNlY3JldChuZXcgYnl0ZVsxXSwgMTApLCAKKyAgICAgICAgICAgICAgICAtMSk7CisgICAgICAgIGFzc2VydE51bGwoIk5vdCBudWxsIHJlc3VsdCIsIGthU3BpLmVuZ2luZUdlbmVyYXRlU2VjcmV0KCJhYWEiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrYVNwaS5lbmdpbmVHZW5lcmF0ZVNlY3JldCgiIik7CisgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBLZXkga2V5ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGthU3BpLmVuZ2luZUluaXQoa2V5LCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAga2FTcGkuZW5naW5lSW5pdChrZXksIHBhcmFtcywgbmV3IFNlY3VyZVJhbmRvbSgpKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9ICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9LZXlBZ3JlZW1lbnRUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9LZXlBZ3JlZW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlZDZlOAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0tleUFncmVlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDcxNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjOworCitpbXBvcnQgamF2YXguY3J5cHRvLktleUFncmVlbWVudDsKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5QWdyZWVtZW50U3BpOworaW1wb3J0IGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5ESFBhcmFtZXRlclNwZWM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLnN1cHBvcnQuTXlLZXlBZ3JlZW1lbnRTcGk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3BpRW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuVGVzdEtleVBhaXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworQFRlc3RUYXJnZXRDbGFzcyhLZXlBZ3JlZW1lbnQuY2xhc3MpCisvKioKKyAqIFRlc3RzIGZvciBLZXlBZ3JlZW1lbnQgY29uc3RydWN0b3IgYW5kIG1ldGhvZHMKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBLZXlBZ3JlZW1lbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3J2S2V5QWdyZWVtZW50ID0gIktleUFncmVlbWVudCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEFsZ29yaXRobSA9ICJESCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFByb3ZpZGVyTmFtZSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUZTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOb3RTdXBwb3J0TXNnID0gIlRoZXJlIGlzIG5vIHN1aXRhYmxlIHByb3ZpZGVyIGZvciBLZXlBZ3JlZW1lbnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW52YWxpZFZhbHVlcyA9IFNwaUVuZ1V0aWxzLmludmFsaWRWYWx1ZXM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IHsgIkRIIiwgImRIIiwKKyAgICAgICAgICAgICJEaCIsICJkaCIgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFByaXZhdGVLZXkgcHJpdktleSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQdWJsaWNLZXkgcHVibEtleSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRLZXlzID0gZmFsc2U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBkZWZhdWx0UHJvdmlkZXIgPSBTcGlFbmdVdGlscy5pc1N1cHBvcnQoZGVmYXVsdEFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICBzcnZLZXlBZ3JlZW1lbnQpOworICAgICAgICBERUZTdXBwb3J0ZWQgPSAoZGVmYXVsdFByb3ZpZGVyICE9IG51bGwpOworICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lID0gKERFRlN1cHBvcnRlZCA/IGRlZmF1bHRQcm92aWRlci5nZXROYW1lKCkgOiBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlS2V5cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRLZXlzKSB7CisgICAgICAgICAgICBUZXN0S2V5UGFpciB0a3AgPSBuZXcgVGVzdEtleVBhaXIoZGVmYXVsdEFsZ29yaXRobSk7CisgICAgICAgICAgICBwcml2S2V5ID0gdGtwLmdldFByaXZhdGUoKTsKKyAgICAgICAgICAgIHB1YmxLZXkgPSB0a3AuZ2V0UHVibGljKCk7CisgICAgICAgICAgICBpbml0S2V5cyA9IHRydWU7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgS2V5QWdyZWVtZW50W10gY3JlYXRlS0FzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICB9CisKKyAgICAgICAgS2V5QWdyZWVtZW50W10ga2EgPSBuZXcgS2V5QWdyZWVtZW50WzNdOworICAgICAgICBrYVswXSA9IEtleUFncmVlbWVudC5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKTsKKyAgICAgICAga2FbMV0gPSBLZXlBZ3JlZW1lbnQuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAga2FbMl0gPSBLZXlBZ3JlZW1lbnQuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgcmV0dXJuIGthOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZkFsZygpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBbGdvcml0aG07CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pIDwvY29kZT4gbWV0aG9kIEFzc2VydGlvbnM6CisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwgdGhyb3dzCisgICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzbm90IGF2YWlsYWJsZQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZzAxKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBLZXlBZ3JlZW1lbnQuZ2V0SW5zdGFuY2UobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEtleUFncmVlbWVudC5nZXRJbnN0YW5jZShpbnZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT4gZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkgPC9jb2RlPiBtZXRob2QgQXNzZXJ0aW9uczoKKyAgICAgKiByZXR1cm5zIEtleUFncmVlbWVudCBvYmplY3QKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZzAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtleUFncmVlbWVudCBrZXlBOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBrZXlBID0gS2V5QWdyZWVtZW50LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIGtleUEuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPiBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPgorICAgICAqIG1ldGhvZCBBc3NlcnRpb25zOiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZ1N0cmluZzAxKCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEtleUFncmVlbWVudC5nZXRJbnN0YW5jZShudWxsLCBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGlmIGFsZ29yaXRobSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgS2V5QWdyZWVtZW50LmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPiBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPgorICAgICAqIG1ldGhvZCBBc3NlcnRpb25zOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbAorICAgICAqIG9yIGVtcHR5IHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGhhcyBub3QgYmUKKyAgICAgKiBjb25maWd1cmVkCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2VTdHJpbmdTdHJpbmcwMigpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwcm92aWRlciA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgS2V5QWdyZWVtZW50LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgS2V5QWdyZWVtZW50LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgZW1wdHkiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBLZXlBZ3JlZW1lbnQuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIGludmFsaWRWYWx1ZXNbal0pOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biAoYWxnb3JpdGhtOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh2YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIgcHJvdmlkZXI6ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChpbnZhbGlkVmFsdWVzW2pdKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPiBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPgorICAgICAqIG1ldGhvZCBBc3NlcnRpb25zOiByZXR1cm5zIEtleUFncmVlbWVudCBvYmplY3QKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZ1N0cmluZzAzKCkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgS2V5QWdyZWVtZW50IGtleUE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGtleUEgPSBLZXlBZ3JlZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIGtleUEuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwga2V5QS5nZXRQcm92aWRlcigpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT4gZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpPC9jb2RlPgorICAgICAqIG1ldGhvZCBBc3NlcnRpb25zOiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXNub3QgYXZhaWxhYmxlCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXRJbnN0YW5jZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlU3RyaW5nUHJvdmlkZXIwMSgpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgS2V5QWdyZWVtZW50LmdldEluc3RhbmNlKG51bGwsIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEtleUFncmVlbWVudC5nZXRJbnN0YW5jZShpbnZhbGlkVmFsdWVzW2ldLCBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPiBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CisgICAgICogbWV0aG9kIEFzc2VydGlvbnM6IHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2VTdHJpbmdQcm92aWRlcjAyKCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEtleUFncmVlbWVudC5nZXRJbnN0YW5jZShpbnZhbGlkVmFsdWVzW2ldLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBtZXRob2QgQXNzZXJ0aW9uczogcmV0dXJucyBLZXlBZ3JlZW1lbnQgb2JqZWN0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2VTdHJpbmdQcm92aWRlcjAzKCkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtleUFncmVlbWVudCBrZXlBOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBrZXlBID0gS2V5QWdyZWVtZW50LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwga2V5QS5nZXRBbGdvcml0aG0oKSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBrZXlBLmdldFByb3ZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciB0aGUgbWV0aG9kczogPGNvZGU+aW5pdChLZXkga2V5KTwvY29kZT4KKyAgICAgKiA8Y29kZT5nZW5lcmF0ZVNlY3JldCgpPC9jb2RlPiAKKyAgICAgKiA8Y29kZT5nZW5lcmF0ZVNlY3JldChieXRlW10gc2hhcmVkc2VjcmV0LCBpbnQgb2Zmc2V0KTwvY29kZT4KKyAgICAgKiA8Y29kZT5nZW5lcmF0ZVNlY3JldChTdHJpbmcgYWxnb3JpdGhtKTwvY29kZT4KKyAgICAgKiBBc3NlcnRpb25zOiBpbml0aWFsaXplcyBLZXlBZ3JlZW1lbnQ7IHJldHVybnMgc2hhcmVkU2VjcmV0OyBwdXRzCisgICAgICogc2hhcmVkc2VjcmV0IGluIGJ1ZmZlciBhbmQgcmV0dXJuIG51bWJlcnMgb2YgYnl0ZXM7IHJldHVybnMgU2VjcmV0S2V5CisgICAgICogb2JqZWN0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgZnVuY3Rpb25hbGl0eSBvbmx5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVTZWNyZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlU2VjcmV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlU2VjcmV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVNlY3JldDAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZUtleXMoKTsKKyAgICAgICAgS2V5QWdyZWVtZW50W10ga0FncyA9IGNyZWF0ZUtBcygpOworCisgICAgICAgIGJ5dGVbXSBiYjsKKyAgICAgICAgYnl0ZVtdIGJiMSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQWdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBrQWdzW2ldLmluaXQocHJpdktleSk7CisgICAgICAgICAgICBrQWdzW2ldLmRvUGhhc2UocHVibEtleSwgdHJ1ZSk7CisgICAgICAgICAgICBiYiA9IGtBZ3NbaV0uZ2VuZXJhdGVTZWNyZXQoKTsKKyAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwcml2S2V5KTsKKyAgICAgICAgICAgIGtBZ3NbaV0uZG9QaGFzZShwdWJsS2V5LCB0cnVlKTsKKyAgICAgICAgICAgIGJiMSA9IG5ldyBieXRlW2JiLmxlbmd0aCArIDEwXTsKKyAgICAgICAgICAgIGtBZ3NbaV0uZ2VuZXJhdGVTZWNyZXQoYmIxLCA5KTsKKyAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwcml2S2V5KTsKKyAgICAgICAgICAgIGtBZ3NbaV0uZG9QaGFzZShwdWJsS2V5LCB0cnVlKTsKKyAgICAgICAgICAgIGtBZ3NbaV0uZ2VuZXJhdGVTZWNyZXQoIkRFUyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZG9QaGFzZShLZXkga2V5LCBib29sZWFuIGxhc3RQaGFzZSk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gaWYga2V5IGlzIG5vdCBhcHByb3ByaWF0ZQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIEludmFsaWRLZXlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9QaGFzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERvUGhhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlS2V5cygpOworICAgICAgICBLZXlBZ3JlZW1lbnRbXSBrQWdzID0gY3JlYXRlS0FzKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQWdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBrQWdzW2ldLmluaXQocHJpdktleSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGtBZ3NbaV0uZG9QaGFzZShwcml2S2V5LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBrQWdzW2ldLmRvUGhhc2UocHJpdktleSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIHRoZSBtZXRob2RzIDxjb2RlPmluaXQoS2V5IGtleSk8L2NvZGU+CisgICAgICogPGNvZGU+aW5pdChLZXkga2V5LCBTZWN1cmVSYW5kb20gcmFuZG9tKTwvY29kZT4KKyAgICAgKiA8Y29kZT5pbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zKTwvY29kZT4KKyAgICAgKiA8Y29kZT5pbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKTwvY29kZT4KKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHdoZW4ga2V5IGlzIGluYXBwcm9wcmlhdGUKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBJbnZhbGlkS2V5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzcywgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzcywgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3MsIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdDAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZUtleXMoKTsKKyAgICAgICAgS2V5QWdyZWVtZW50W10ga0FncyA9IGNyZWF0ZUtBcygpOworCisgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBudWxsOworICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGFwcyA9IG51bGw7CisgICAgICAgIERIUGFyYW1ldGVyU3BlYyBkaFBzID0gbmV3IERIUGFyYW1ldGVyU3BlYyhuZXcgQmlnSW50ZWdlcigiNTYiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiNTYiKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0Fncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBrQWdzW2ldLmluaXQocHVibEtleSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAga0Fnc1tpXS5pbml0KHB1YmxLZXksIG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAga0Fnc1tpXS5pbml0KHB1YmxLZXksIHJhbmRvbSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAga0Fnc1tpXS5pbml0KHB1YmxLZXksIGRoUHMpOworICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWRLZXlFeGNlcHRpb24gbXVzdCBiZSB0aHJvdyIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwdWJsS2V5LCBhcHMpOworICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWRLZXlFeGNlcHRpb24gbXVzdCBiZSB0aHJvdyIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwdWJsS2V5LCBkaFBzLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWRLZXlFeGNlcHRpb24gbXVzdCBiZSB0aHJvdyIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciB0aGUgbWV0aG9kcworICAgICAqIDxjb2RlPmluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpPC9jb2RlPgorICAgICAqIDxjb2RlPmluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMsIFNlY3VyZVJhbmRvbSByYW5kb20pPC9jb2RlPgorICAgICAqIEFzc2VydGlvbjogdGhyb3dzIEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuIHBhcmFtcyBhcmUKKyAgICAgKiBpbmFwcHJvcHJpYXRlCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIkNoZWNrcyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGV4Y2VwdGlvbnMgY2hlY2tpbmcgZm9yIGluaXQgbWV0aG9kcyBncm91cCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzc30KKyAgICAgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEluaXQwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVLZXlzKCk7CisgICAgICAgIEtleUFncmVlbWVudFtdIGtBZ3MgPSBjcmVhdGVLQXMoKTsKKworICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbnVsbDsKKyAgICAgICAgRFNBUGFyYW1ldGVyU3BlYyBkc2EgPSBuZXcgRFNBUGFyYW1ldGVyU3BlYyhuZXcgQmlnSW50ZWdlcigiNTYiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiNTYiKSwgbmV3IEJpZ0ludGVnZXIoIjU2IikpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtBZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAga0Fnc1tpXS5pbml0KHByaXZLZXksIGRzYSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBvciBJbnZhbGlkS2V5RXhjZXB0aW9uIG11c3QgYmUgdGhyb3ciKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwcml2S2V5LCBkc2EsIG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBvciBJbnZhbGlkS2V5RXhjZXB0aW9uIG11c3QgYmUgdGhyb3ciKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwcml2S2V5LCBkc2EsIHJhbmRvbSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBvciBJbnZhbGlkS2V5RXhjZXB0aW9uIG11c3QgYmUgdGhyb3ciKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciB0aGUgbWV0aG9kczogPGNvZGU+aW5pdChLZXkga2V5KTwvY29kZT4KKyAgICAgKiA8Y29kZT5pbml0KEtleSBrZXksIFNlY3VyZVJhbmRvbSByYW5kb20pPC9jb2RlPgorICAgICAqIDxjb2RlPmdlbmVyYXRlU2VjcmV0KCk8L2NvZGU+CisgICAgICogQXNzZXJ0aW9uczogaW5pdGlhbGl6ZXMgS2V5QWdyZWVtZW50IGFuZCByZXR1cm5zIGJ5dGUgYXJyYXkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3N9CisgICAgICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzcywgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlU2VjcmV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0MDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlS2V5cygpOworICAgICAgICBLZXlBZ3JlZW1lbnRbXSBrQWdzID0gY3JlYXRlS0FzKCk7CisKKyAgICAgICAgYnl0ZVtdIGJiUmVzMTsKKyAgICAgICAgYnl0ZVtdIGJiUmVzMjsKKyAgICAgICAgYnl0ZVtdIGJiUmVzMzsKKyAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbU51bGwgPSBudWxsOworICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtBZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwcml2S2V5KTsKKyAgICAgICAgICAgIGtBZ3NbaV0uZG9QaGFzZShwdWJsS2V5LCB0cnVlKTsKKyAgICAgICAgICAgIGJiUmVzMSA9IGtBZ3NbaV0uZ2VuZXJhdGVTZWNyZXQoKTsKKyAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwcml2S2V5LCByYW5kb20pOworICAgICAgICAgICAga0Fnc1tpXS5kb1BoYXNlKHB1YmxLZXksIHRydWUpOworICAgICAgICAgICAgYmJSZXMyID0ga0Fnc1tpXS5nZW5lcmF0ZVNlY3JldCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSBhcnJheSBsZW5ndGgiLCBiYlJlczEubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBiYlJlczIubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmJSZXMxLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSAoaW5kZXg6ICIuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhpKSkuY29uY2F0KCIpIiksIGJiUmVzMVtqXSwgYmJSZXMyW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtBZ3NbaV0uaW5pdChwcml2S2V5LCByYW5kb21OdWxsKTsKKyAgICAgICAgICAgIGtBZ3NbaV0uZG9QaGFzZShwdWJsS2V5LCB0cnVlKTsKKyAgICAgICAgICAgIGJiUmVzMyA9IGtBZ3NbaV0uZ2VuZXJhdGVTZWNyZXQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGJ5dGUgYXJyYXkgbGVuZ3RoIiwgYmJSZXMxLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgYmJSZXMzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJiUmVzMS5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGJ5dGUgKGluZGV4OiAiLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoaSkpLmNvbmNhdCgiKSIpLCBiYlJlczFbal0sIGJiUmVzM1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciB0aGUgbWV0aG9kczoKKyAgICAgKiA8Y29kZT5pbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zKTwvY29kZT4KKyAgICAgKiA8Y29kZT5pbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKTwvY29kZT4KKyAgICAgKiA8Y29kZT5nZW5lcmF0ZVNlY3JldCgpPC9jb2RlPgorICAgICAqIEFzc2VydGlvbnM6IGluaXRpYWxpemVzIEtleUFncmVlbWVudCBhbmQgcmV0dXJucyBieXRlIGFycmF5CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkNoZWNrcyBmdW5jdGlvbmFsaXR5LiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzc30KKyAgICAgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlU2VjcmV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdDA0KCkgdGhyb3dzIEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVLZXlzKCk7CisgICAgICAgIEtleUFncmVlbWVudFtdIGtBZ3MgPSBjcmVhdGVLQXMoKTsKKworICAgICAgICBESFBhcmFtZXRlclNwZWMgZGhQcyA9ICgoREhQcml2YXRlS2V5KSBwcml2S2V5KS5nZXRQYXJhbXMoKTsKKworICAgICAgICBieXRlW10gYmJSZXMxOworICAgICAgICBieXRlW10gYmJSZXMyOworICAgICAgICBieXRlW10gYmJSZXMzOworICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tTnVsbCA9IG51bGw7CisgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0Fncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAga0Fnc1tpXS5pbml0KHByaXZLZXksIGRoUHMpOworICAgICAgICAgICAga0Fnc1tpXS5kb1BoYXNlKHB1YmxLZXksIHRydWUpOworICAgICAgICAgICAgYmJSZXMxID0ga0Fnc1tpXS5nZW5lcmF0ZVNlY3JldCgpOworICAgICAgICAgICAga0Fnc1tpXS5pbml0KHByaXZLZXksIGRoUHMsIHJhbmRvbSk7CisgICAgICAgICAgICBrQWdzW2ldLmRvUGhhc2UocHVibEtleSwgdHJ1ZSk7CisgICAgICAgICAgICBiYlJlczIgPSBrQWdzW2ldLmdlbmVyYXRlU2VjcmV0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBieXRlIGFycmF5IGxlbmd0aCIsIGJiUmVzMS5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGJiUmVzMi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiYlJlczEubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBieXRlIChpbmRleDogIi5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGkpKS5jb25jYXQoIikiKSwgYmJSZXMxW2pdLCBiYlJlczJbal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAga0Fnc1tpXS5pbml0KHByaXZLZXksIGRoUHMsIHJhbmRvbU51bGwpOworICAgICAgICAgICAga0Fnc1tpXS5kb1BoYXNlKHB1YmxLZXksIHRydWUpOworICAgICAgICAgICAgYmJSZXMzID0ga0Fnc1tpXS5nZW5lcmF0ZVNlY3JldCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSBhcnJheSBsZW5ndGgiLCBiYlJlczEubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBiYlJlczMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmJSZXMxLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSAoaW5kZXg6ICIuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhpKSkuY29uY2F0KCIpIiksIGJiUmVzMVtqXSwgYmJSZXMzW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vS2V5R2VuZXJhdG9yU3BpVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vS2V5R2VuZXJhdG9yU3BpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzNmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9LZXlHZW5lcmF0b3JTcGlUZXN0LmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yU3BpOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLnN1cHBvcnQuTXlLZXlHZW5lcmF0b3JTcGk7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5R2VuZXJhdG9yU3BpLmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+S2V5R2VuZXJhdG9yU3BpPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgS2V5R2VuZXJhdG9yU3BpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKK2NsYXNzIE1vY2tfS2V5R2VuZXJhdG9yU3BpIGV4dGVuZHMgTXlLZXlHZW5lcmF0b3JTcGkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZUtleSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdlbmVyYXRlS2V5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChTZWN1cmVSYW5kb20gcmFuZG9tKSB7CisgICAgICAgIHN1cGVyLmVuZ2luZUluaXQocmFuZG9tKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKSB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmVuZ2luZUluaXQocGFyYW1zLCByYW5kb20pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IGtleXNpemUsIFNlY3VyZVJhbmRvbSByYW5kb20pIHsKKyAgICAgICAgc3VwZXIuZW5naW5lSW5pdChrZXlzaXplLCByYW5kb20pOworICAgIH0KKyAgICAKK30KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgS2V5R2VuZXJhdG9yU3BpVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5R2VuZXJhdG9yU3BpVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5LZXlHZW5lcmF0b3JTcGk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cworICAgICAqIEtleUdlbmVyYXRvclNwaQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleUdlbmVyYXRvclNwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlHZW5lcmF0b3JTcGkwMSgpIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja19LZXlHZW5lcmF0b3JTcGkga2dTcGkgPSBuZXcgTW9ja19LZXlHZW5lcmF0b3JTcGkoKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgcmVzdWx0Iiwga2dTcGkuZW5naW5lR2VuZXJhdGVLZXkoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrZ1NwaS5lbmdpbmVJbml0KDc3LCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtnU3BpLmVuZ2luZUluaXQobmV3IFNlY3VyZVJhbmRvbSgpKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgYXBzID0gbnVsbDsgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAga2dTcGkuZW5naW5lSW5pdChhcHMsIG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcGFyYW1ldGVyIGlzIG51bGwiKTsgICAgICAgICAgICAKKyAgICAgICB9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICB9CisgICAgICAgYXBzID0gbmV3IEFQU3BlY1NwaSgpOworICAgICAgIGtnU3BpLmVuZ2luZUluaXQoYXBzLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgIH0KKworfQorY2xhc3MgQVBTcGVjU3BpIGltcGxlbWVudHMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyB7CisgICAgCit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9LZXlHZW5lcmF0b3JUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9LZXlHZW5lcmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiMTk4NQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0tleUdlbmVyYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yOworaW1wb3J0IGphdmF4LmNyeXB0by5LZXlHZW5lcmF0b3JTcGk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydC5NeUtleUdlbmVyYXRvclNwaTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCitAVGVzdFRhcmdldENsYXNzKEtleUdlbmVyYXRvci5jbGFzcykKKy8qKgorICogVGVzdHMgZm9yIEtleUdlbmVyYXRvciBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcworICogCisgKi8KKworcHVibGljIGNsYXNzIEtleUdlbmVyYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3J2S2V5R2VuZXJhdG9yID0gIktleUdlbmVyYXRvciI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdmFsaWRBbGdvcml0aG1zS2V5R2VuZXJhdG9yIFtdID0KKyAgICAgICAgeyJERVNlZGUiLCAiREVTIiwgIkJsb3dmaXNoIiwgIkFFUyIsICJIbWFjTUQ1In07CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIHZhbGlkS2V5U2l6ZXMgPSB7IDE2OCwgNTYsIDU2LCAyNTYsIDU2fTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBkZWZhdWx0S2V5U2l6ZSA9IC0xOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0QWxnb3JpdGhtID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFByb3ZpZGVyTmFtZSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUZTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOb3RTdXBwb3J0TXNnID0gIlRoZXJlIGlzIG5vIHN1aXRhYmxlIHByb3ZpZGVyIGZvciBLZXlHZW5lcmF0b3IiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW52YWxpZFZhbHVlcyA9IFNwaUVuZ1V0aWxzLmludmFsaWRWYWx1ZXM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IG5ldyBTdHJpbmdbM107CisKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkQWxnb3JpdGhtc0tleUdlbmVyYXRvci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gU3BpRW5nVXRpbHMuaXNTdXBwb3J0KHZhbGlkQWxnb3JpdGhtc0tleUdlbmVyYXRvcltpXSwKKyAgICAgICAgICAgICAgICBzcnZLZXlHZW5lcmF0b3IpOworICAgICAgICAgICAgREVGU3VwcG9ydGVkID0gKGRlZmF1bHRQcm92aWRlciAhPSBudWxsKTsKKyAgICAgICAgICAgIGlmIChERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtID0gdmFsaWRBbGdvcml0aG1zS2V5R2VuZXJhdG9yW2ldOworICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlTaXplID0gdmFsaWRLZXlTaXplc1tpXTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lID0gZGVmYXVsdFByb3ZpZGVyLmdldE5hbWUoKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbMF0gPSBkZWZhdWx0QWxnb3JpdGhtOworICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzWzFdID0gZGVmYXVsdEFsZ29yaXRobS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzWzJdID0gZGVmYXVsdEFsZ29yaXRobS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgS2V5R2VuZXJhdG9yW10gY3JlYXRlS0dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICB9CisKKyAgICAgICAgS2V5R2VuZXJhdG9yIFtdIGtnID0gbmV3IEtleUdlbmVyYXRvclszXTsKKyAgICAgICAga2dbMF0gPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSk7CisgICAgICAgIGtnWzFdID0gS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0sIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIGtnWzJdID0gS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0sIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICByZXR1cm4ga2c7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5LZXlHZW5lcmF0b3I8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjogcmV0dXJucworICAgICAqIEtleUdlbmVyYXRvciBvYmplY3QKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlHZW5lcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguY3J5cHRvLktleUdlbmVyYXRvclNwaS5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEtleUdlbmVyYXRvcigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgS2V5R2VuZXJhdG9yU3BpIHNwaSA9IG5ldyBNeUtleUdlbmVyYXRvclNwaSgpOworICAgICAgICBLZXlHZW5lcmF0b3Iga2V5RyA9IG5ldyBteUtleUdlbmVyYXRvcihzcGksIGRlZmF1bHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwga2V5Ry5nZXRBbGdvcml0aG0oKSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBrZXlHLmdldFByb3ZpZGVyKCksIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zID0gbnVsbDsKKyAgICAgICAgaW50IGtleXNpemUgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAga2V5Ry5pbml0KHBhcmFtcywgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrZXlHLmluaXQoa2V5c2l6ZSwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBrZXlHID0gbmV3IG15S2V5R2VuZXJhdG9yKG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKCJBbGdvcml0aG0gbXVzdCBiZSBudWxsIiwga2V5Ry5nZXRBbGdvcml0aG0oKSk7CisgICAgICAgIGFzc2VydE51bGwoIlByb3ZpZGVyIG11c3QgYmUgbnVsbCIsIGtleUcuZ2V0UHJvdmlkZXIoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtleUcuaW5pdChwYXJhbXMsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrZXlHLmluaXQoa2V5c2l6ZSwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPiBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKSA8L2NvZGU+IG1ldGhvZCBBc3NlcnRpb25zOgorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsIHRocm93cworICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpc25vdCBhdmFpbGFibGUKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2VTdHJpbmcwMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaWYgYWxnb3JpdGhtIGlzIG51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPiBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKSA8L2NvZGU+IG1ldGhvZCAKKyAgICAgKiBBc3NlcnRpb25zOiByZXR1cm5zIEtleUdlbmVyYXRvciBvYmplY3QKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZzAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtleUdlbmVyYXRvciBrZXlHOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBrZXlHID0gS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIGtleUcuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdCBmb3IgPGNvZGU+IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZCAKKyAgICAgKiBBc3NlcnRpb25zOgorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsCisgICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpc25vdCBhdmFpbGFibGUKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2VTdHJpbmdTdHJpbmcwMSgpIHRocm93cworICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKG51bGwsIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaWYgYWxnb3JpdGhtIGlzIG51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXN0IGZvciA8Y29kZT4gZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6CisgICAgICogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGwgb3IgZW1wdHkKKyAgICAgKiB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gd2hlbiBwcm92aWRlciBoYXMgbm90IGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZ1N0cmluZzAyKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJvdmlkZXIgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHByb3ZpZGVyIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgIiIpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHByb3ZpZGVyIGlzIGVtcHR5Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBpbnZhbGlkVmFsdWVzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gKGFsZ29yaXRobTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiIHByb3ZpZGVyOiAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoaW52YWxpZFZhbHVlc1tqXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPiBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uczogcmV0dXJucyBLZXlHZW5lcmF0b3Igb2JqZWN0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2VTdHJpbmdTdHJpbmcwMygpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgS2V5R2VuZXJhdG9yIGtleUc7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGtleUcgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwga2V5Ry5nZXRBbGdvcml0aG0oKSwgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBrZXlHLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLCBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdCBmb3IgPGNvZGU+IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6CisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzbm90IGF2YWlsYWJsZQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZ1Byb3ZpZGVyMDEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCAKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UobnVsbCwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGlmIGFsZ29yaXRobSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogVGVzdCBmb3IgPGNvZGU+IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6CisgICAgICogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGwKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZ1Byb3ZpZGVyMDIoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCAKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZShpbnZhbGlkVmFsdWVzW2ldLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogVGVzdCBmb3IgPGNvZGU+IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6IHJldHVybnMgS2V5R2VuZXJhdG9yIG9iamVjdAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXRJbnN0YW5jZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlU3RyaW5nUHJvdmlkZXIwMygpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBLZXlHZW5lcmF0b3Iga2V5QTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAga2V5QSA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIGtleUEuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwga2V5QS5nZXRQcm92aWRlcigpLCBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5pbml0KGludCBrZXlzaXplKTwvY29kZT4gYW5kCisgICAgICogPGNvZGU+aW5pdChpbnQga2V5c2l6ZSwgU2VjdXJlUmFuZG9tIHJhbmRvbSk8L2NvZGU+IG1ldGhvZHMgCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBpZiBrZXlzaXplIGlzIHdyb25nCisgICAgICogCisgICAgICovICAgIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGV4Y2VwdGlvbnMgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdEtleSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmYXVsdEFsZ29yaXRobQorICAgICAgICAgICAgICAgIC5lcXVhbHModmFsaWRBbGdvcml0aG1zS2V5R2VuZXJhdG9yW3ZhbGlkQWxnb3JpdGhtc0tleUdlbmVyYXRvci5sZW5ndGggLSAxXSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnRbXSBzaXplID0geyBJbnRlZ2VyLk1JTl9WQUxVRSwgLTEsIDAsIEludGVnZXIuTUFYX1ZBTFVFIH07CisgICAgICAgIEtleUdlbmVyYXRvcltdIGtncyA9IGNyZWF0ZUtHcygpOworICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemUubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBrZ3NbaV0uaW5pdChzaXplW2pdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtnc1tpXS5pbml0KHNpemVbal0sIHJhbmRvbSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmluaXQoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpPC9jb2RlPiBhbmQgCisgICAgICogPGNvZGU+aW5pdChBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSk8L2NvZGU+IG1ldGhvZHMKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHdoZW4gcGFyYW1zIGlzIG51bGwKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBleGNlcHRpb25zIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3MsIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdFBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBLZXlHZW5lcmF0b3IgW10ga2dzID0gY3JlYXRlS0dzKCk7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgYXBzID0gbnVsbDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBrZ3NbaV0uaW5pdChhcHMpOworICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBrZ3NbaV0uaW5pdChhcHMsIG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdlbmVyYXRlS2V5KCk8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPmluaXQoU2VjdXJlUmFuZG9tIHJhbmRvbSk8L2NvZGU+IG1ldGhvZHMgCisgICAgICogPGNvZGU+aW5pdChpbnQga2V5c2l6ZSwgU2VjdXJlUmFuZG9tIHJhbmRvbSk8L2NvZGU+IG1ldGhvZHMgCisgICAgICogPGNvZGU+aW5pdChpbnQga2V5c2l6ZSk8L2NvZGU+IG1ldGhvZHMgCisgICAgICogPGNvZGU+aW5pdChBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSk8L2NvZGU+IG1ldGhvZHMgCisgICAgICogPGNvZGU+aW5pdChBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcyk8L2NvZGU+IG1ldGhvZHMgCisgICAgICogQXNzZXJ0aW9uczoKKyAgICAgKiBpbml0aWFsaXplcyBLZXlHZW5lcmF0b3I7IAorICAgICAqIHJldHVybnMgU2VjcmV0S2V5IG9iamVjdAorICAgICAqIAorICAgICAqLyAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUtleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUtleSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZWNyZXRLZXkgc0tleTsKKyAgICAgICAgU3RyaW5nIGRBbCA9IGRlZmF1bHRBbGdvcml0aG0udG9VcHBlckNhc2UoKTsKKworICAgICAgICBLZXlHZW5lcmF0b3JbXSBrZ3MgPSBjcmVhdGVLR3MoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc0tleSA9IGtnc1tpXS5nZW5lcmF0ZUtleSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgc0tleS5nZXRBbGdvcml0aG0oKQorICAgICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKSwgZEFsKTsKKyAgICAgICAgICAgIGtnc1tpXS5pbml0KG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgICAgICAgICBzS2V5ID0ga2dzW2ldLmdlbmVyYXRlS2V5KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBzS2V5LmdldEFsZ29yaXRobSgpCisgICAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpLCBkQWwpOworICAgICAgICAgICAga2dzW2ldLmluaXQoZGVmYXVsdEtleVNpemUpOworICAgICAgICAgICAgc0tleSA9IGtnc1tpXS5nZW5lcmF0ZUtleSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgc0tleS5nZXRBbGdvcml0aG0oKQorICAgICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKSwgZEFsKTsKKyAgICAgICAgICAgIGtnc1tpXS5pbml0KGRlZmF1bHRLZXlTaXplLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgc0tleSA9IGtnc1tpXS5nZW5lcmF0ZUtleSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgc0tleS5nZXRBbGdvcml0aG0oKQorICAgICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKSwgZEFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKK30KKworLyoqCisgKiBBZGRpdGlvbmFsIGNsYXNzIGZvciBLZXlHZW5lcmF0b3IgY29uc3RydWN0b3IgdmVyaWZpY2F0aW9uCisgKi8KK2NsYXNzIG15S2V5R2VuZXJhdG9yIGV4dGVuZHMgS2V5R2VuZXJhdG9yIHsKKworICAgIHB1YmxpYyBteUtleUdlbmVyYXRvcihLZXlHZW5lcmF0b3JTcGkga2V5QWdyZWVTcGksIFByb3ZpZGVyIHByb3ZpZGVyLAorICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSkgeworICAgICAgICBzdXBlcihrZXlBZ3JlZVNwaSwgcHJvdmlkZXIsIGFsZ29yaXRobSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vTWFjU3BpVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vTWFjU3BpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZWNmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9NYWNTcGlUZXN0LmphdmEKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKKworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CitpbXBvcnQgamF2YXguY3J5cHRvLk1hY1NwaTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydC5NeU1hY1NwaTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCitAVGVzdFRhcmdldENsYXNzKE1hY1NwaS5jbGFzcykKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPk1hY1NwaTwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgorICogCisgKi8KKworcHVibGljIGNsYXNzIE1hY1NwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CitjbGFzcyBNb2NrX01hY1NwaSBleHRlbmRzIE15TWFjU3BpIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbCgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZURvRmluYWwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE1hY0xlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdldE1hY0xlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuZW5naW5lSW5pdChrZXksIHBhcmFtcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lUmVzZXQoKSB7CisgICAgICAgIHN1cGVyLmVuZ2luZVJlc2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKGJ5dGUgaW5wdXQpIHsKKyAgICAgICAgc3VwZXIuZW5naW5lVXBkYXRlKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisgICAgICAgIHN1cGVyLmVuZ2luZVVwZGF0ZShpbnB1dCwgb2Zmc2V0LCBsZW4pOworICAgIH0KKyAgICAKK30KKworY2xhc3MgTW9ja19NYWNTcGkxIGV4dGVuZHMgTXlNYWNTcGkxIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbCgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZURvRmluYWwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE1hY0xlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdldE1hY0xlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuZW5naW5lSW5pdChrZXksIHBhcmFtcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lUmVzZXQoKSB7CisgICAgICAgIHN1cGVyLmVuZ2luZVJlc2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKGJ5dGUgaW5wdXQpIHsKKyAgICAgICAgc3VwZXIuZW5naW5lVXBkYXRlKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisgICAgICAgIHN1cGVyLmVuZ2luZVVwZGF0ZShpbnB1dCwgb2Zmc2V0LCBsZW4pOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoQnl0ZUJ1ZmZlciBpbnB1dCkgeworICAgICAgICBzdXBlci5lbmdpbmVVcGRhdGUoaW5wdXQpOworICAgIH0KKyAgICAKK30KKworCitjbGFzcyBNb2NrX01hY1NwaTIgZXh0ZW5kcyBNeU1hY1NwaTIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVEb0ZpbmFsKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lRG9GaW5hbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZW5naW5lR2V0TWFjTGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lR2V0TWFjTGVuZ3RoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmdpbmVJbml0KGtleSwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVSZXNldCgpIHsKKyAgICAgICAgc3VwZXIuZW5naW5lUmVzZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZSBpbnB1dCkgeworICAgICAgICBzdXBlci5lbmdpbmVVcGRhdGUoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZShieXRlW10gaW5wdXQsIGludCBvZmZzZXQsIGludCBsZW4pIHsKKyAgICAgICAgc3VwZXIuZW5naW5lVXBkYXRlKGlucHV0LCBvZmZzZXQsIGxlbik7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZShCeXRlQnVmZmVyIGlucHV0KSB7CisgICAgICAgIHN1cGVyLmVuZ2luZVVwZGF0ZShpbnB1dCk7CisgICAgfQorICAgIAorfQorCisKKy8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBNYWNTcGlUZXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBNYWNTcGlUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5NYWNTcGk8L2NvZGU+IGNvbnN0cnVjdG9yIAorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBNYWNTcGkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJBbGwgb3RoZXJzIG1ldGhvZHMgYXJlIGFic3RyYWN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk1hY1NwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lVXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjU3BpVGVzdHMwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNb2NrX01hY1NwaSBtU3BpID0gbmV3IE1vY2tfTWFjU3BpKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGJ5dGUgW10gYmIxID0geyhieXRlKTEsIChieXRlKTIsIChieXRlKTMsIChieXRlKTQsIChieXRlKTV9OworICAgICAgICBTZWNyZXRLZXlTcGVjIHNrcyA9IG5ldyBTZWNyZXRLZXlTcGVjKGJiMSwgIlNIQTEiKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTWFjTGVuZ3RoIiwgbVNwaS5lbmdpbmVHZXRNYWNMZW5ndGgoKSwgMCk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNwaS5lbmdpbmVJbml0KG51bGwsIG51bGwpOyAgICAgICAgICAgIAorICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBtU3BpLmVuZ2luZUluaXQoc2tzLCBudWxsKTsKKworICAgICAgICBieXRlW10gYmIgPSBtU3BpLmVuZ2luZURvRmluYWwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJiLmxlbmd0aCwgMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU3BpLmNsb25lKCk7CisgICAgICAgICAgICBmYWlsKCJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBhcyBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE1vY2tfTWFjU3BpMSBtU3BpMSA9IG5ldyBNb2NrX01hY1NwaTEoKTsKKyAgICAgICAgbVNwaTEuY2xvbmUoKTsKKyAgICAgICAgCisgICAgICAgIGJ5dGUgW10gYmJiID0gbmV3IGJ5dGVbMTBdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJiYi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYmJiW2ldID0gKGJ5dGUpaTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNwaTEuZW5naW5lSW5pdChudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIG1TcGkxLmVuZ2luZUluaXQoc2tzLCBudWxsKTsKKyAgICAgICAgCisgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTApOworICAgICAgICBieXRlQnVmLnB1dChiYmIpOworICAgICAgICBieXRlQnVmLnBvc2l0aW9uKDUpOworICAgICAgICBpbnQgYmVmb3JlVXAgPSBieXRlQnVmLnJlbWFpbmluZygpOworICAgICAgICBtU3BpMS5lbmdpbmVVcGRhdGUoYnl0ZUJ1Zik7CisgICAgICAgIGJiID0gbVNwaTEuZW5naW5lRG9GaW5hbCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCByZXN1bHQgb2YgZW5naW5lRG9GaW5hbCIsIGJiLmxlbmd0aCwgYmVmb3JlVXApOworICAgICAgICAKKyAgICAgICAgTW9ja19NYWNTcGkyIG1TcGkyID0gbmV3IE1vY2tfTWFjU3BpMigpOworICAgICAgICAKKyAgICAgICAgbVNwaTIuZW5naW5lSW5pdChudWxsLCBudWxsKTsKKyAgICAgICAgbVNwaTIuZW5naW5lSW5pdChza3MsIG51bGwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU3BpMi5jbG9uZSgpOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBieXRlIFtdIGJidWYgPSB7KGJ5dGUpNSwgKGJ5dGUpNCwgKGJ5dGUpMywgKGJ5dGUpMiwgKGJ5dGUpMX07CisgICAgICAgIGJ5dGVCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDUpOyAgICAgICAgCisgICAgICAgIGJ5dGVCdWYucHV0KGJidWYpOworICAgICAgICBieXRlQnVmLnBvc2l0aW9uKDUpOworICAgICAgICBpZiAoIWJ5dGVCdWYuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgIG1TcGkyLmVuZ2luZVVwZGF0ZShieXRlQnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitjbGFzcyBNeU1hY1NwaTEgZXh0ZW5kcyBNeU1hY1NwaSB7CisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgTXlNYWNTcGkxKCk7CisgICAgfQorfQorCitjbGFzcyBNeU1hY1NwaTIgZXh0ZW5kcyBNYWNTcGkgeworICAgIHByb3RlY3RlZCBpbnQgZW5naW5lR2V0TWFjTGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZShieXRlIGlucHV0KSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKGJ5dGVbXSBpbnB1dCwgaW50IG9mZnNldCwgaW50IGxlbikgeworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVJlc2V0KCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL01hY1Rlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL01hY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY2NjNjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vTWFjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmNyeXB0by5NYWM7CitpbXBvcnQgamF2YXguY3J5cHRvLk1hY1NwaTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2hvcnRCdWZmZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREhHZW5QYXJhbWV0ZXJTcGVjOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYzsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydC5NeU1hY1NwaTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoTWFjLmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgTWFjIGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcworICogCisgKi8KKworcHVibGljIGNsYXNzIE1hY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzcnZNYWMgPSAiTWFjIjsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0QWxnb3JpdGhtID0gbnVsbDsKKyAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRQcm92aWRlck5hbWUgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVGU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTm90U3VwcG9ydGVkTXNnID0gIlRoZXJlIGlzIG5vIHN1aXRhYmxlIHByb3ZpZGVyIGZvciBNYWMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW52YWxpZFZhbHVlcyA9IFNwaUVuZ1V0aWxzLmludmFsaWRWYWx1ZXM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IG5ldyBTdHJpbmdbM107CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdmFsaWRBbGdvcml0aG1zTWFjIFtdID0gCisgICAgICAgIHsiSG1hY1NIQTEiLCAiSG1hY01ENSIsICJIbWFjU0hBMjU2IiwgIkhtYWNTSEEzODQiLCAiSG1hY1NIQTUxMiJ9OworCisgICAgICAgIAorICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRBbGdvcml0aG1zTWFjLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIgPSBTcGlFbmdVdGlscy5pc1N1cHBvcnQodmFsaWRBbGdvcml0aG1zTWFjW2ldLAorICAgICAgICAgICAgICAgICAgICBzcnZNYWMpOworICAgICAgICAgICAgREVGU3VwcG9ydGVkID0gKGRlZmF1bHRQcm92aWRlciAhPSBudWxsKTsKKyAgICAgICAgICAgIGlmIChERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtID0gdmFsaWRBbGdvcml0aG1zTWFjW2ldOworICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUgPSBkZWZhdWx0UHJvdmlkZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzWzBdID0gZGVmYXVsdEFsZ29yaXRobTsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlc1sxXSA9IGRlZmF1bHRBbGdvcml0aG0udG9VcHBlckNhc2UoKTsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlc1syXSA9IGRlZmF1bHRBbGdvcml0aG0udG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWFjIFtdIGNyZWF0ZU1hY3MoKSB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTWFjIG0gW10gPSBuZXcgTWFjWzNdOworICAgICAgICAgICAgbVswXSA9IE1hYy5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKTsKKyAgICAgICAgICAgIG1bMV0gPSBNYWMuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIG1bMl0gPSBNYWMuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogCisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMDEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYWMuZ2V0SW5zdGFuY2UobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biB3aGVuIGFsZ29yaXRobSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWFjLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGludmFsaWRWYWx1ZXNbaV0pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBNYWMgb2JqZWN0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMDIoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgbWFjOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtYWMgPSBNYWMuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgbWFjLmdldEFsZ29yaXRobSgpLCB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiAKKyAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eQorICAgICAqIHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMDMoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNYWMuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBwcm92aWRlciBpcyBudWxsIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNYWMuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sICIiKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBwcm92aWRlciBpcyBlbXB0eSIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE1hYy5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgaW52YWxpZFZhbHVlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIChhbGdvcml0aG06ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIiBwcm92aWRlcjogIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGludmFsaWRWYWx1ZXNbal0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogCisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWMwNCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1hYy5nZXRJbnN0YW5jZShudWxsLCBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNYWMuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3dzIHdoZW4gYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoaW52YWxpZFZhbHVlc1tpXSkpOworICAgICAgICAgICAgfSBjYXRjaCggTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgTWFjIG9iamVjdAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXRJbnN0YW5jZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdE1hYzA1KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1hYyBtYWM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1hYyA9IE1hYy5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBtYWMuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgbWFjLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGwKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMDYoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1hYy5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHByb3ZpZGVyIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsCisgICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMDcoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCAKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYWMuZ2V0SW5zdGFuY2UobnVsbCwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNYWMuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChpbnZhbGlkVmFsdWVzW2ldKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIE1hYyBvYmplY3QKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWMwOCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgbWFjOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtYWMgPSBNYWMuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBtYWMuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgbWFjLmdldFByb3ZpZGVyKCksIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+dXBkYXRlPC9jb2RlPiBhbmQgPGNvZGU+ZG9GaW5hbDwvY29kZT4gbWV0aG9kcworICAgICAqIEFzc2VydGlvbjogdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aGVuIE1hYyBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gb25seSBidXQgZm9yIGFsbCBtZXRob2RzLiIgKworICAgICAgICAgICAgICAiIE5vdCBlbm91Z2ggZm9yIGRvRmluYWwoYnl0ZVtdIG91dHB1dCwgaW50IG91dE9mZnNldCkgLSBpdCBjYW4gdGhyb3cgU2hvcnRCdWZmZXJFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvRmluYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9GaW5hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlLmNsYXNzfQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWMwOSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFNob3J0QnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBieXRlIFtdIGJ1ZiA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiQnVmID0gQnl0ZUJ1ZmZlci53cmFwKGJ1ZiwgMCwgMTApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUoKGJ5dGUpMCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWNzW2ldLnVwZGF0ZShidWYpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUoYnVmLCAwLCAzKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0udXBkYXRlKGJCdWYpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFjc1tpXS5kb0ZpbmFsKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWNzW2ldLmRvRmluYWwobmV3IGJ5dGVbMTBdKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0uZG9GaW5hbChuZXcgYnl0ZVsxMF0sIDApOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5kb0ZpbmFsKGJ5dGVbXSBvdXRwdXQsIGludCBvdXRPZmZzZXQpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBTaG90QnVmZmVyRXhjZXB0aW9uIHdoZW4gb3V0T2Zmc2V0ICBpcyBuZWdhdGl2ZSBvciAgCisgICAgICogb3V0T2Zmc2V0ID49IG91dHB1dC5sZW5ndGggIG9yIHdoZW4gZ2l2ZW4gYnVmZmVyIGlzIHNtYWxsCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgU2hvcnRCdWZmZXJFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMTAoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWFjW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBieXRlW10gYiA9IHsgKGJ5dGUpIDAsIChieXRlKSAwLCAoYnl0ZSkgMCwgKGJ5dGUpIDAsIChieXRlKSAwIH07CisgICAgICAgIGJ5dGVbXSBieXRlQSA9IG5ldyBieXRlW2IubGVuZ3RoXTsKKyAgICAgICAgU2VjcmV0S2V5U3BlYyBza3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhiLCAiU0hBMSIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1hY3NbaV0uaW5pdChza3MpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWNzW2ldLmRvRmluYWwobnVsbCwgMTApOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3J0QnVmZmVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0uZG9GaW5hbChieXRlQSwgLTQpOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3J0QnVmZmVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0uZG9GaW5hbChieXRlQSwgMTApOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3J0QnVmZmVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0uZG9GaW5hbChuZXcgYnl0ZVsxXSwgMCk7CisgICAgICAgICAgICAgICAgZmFpbCgiU2hvcnRCdWZmZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNob3J0QnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gICAgICAgICAgIAorICAgICAgICAgICAgYnl0ZVtdIHJlcyA9IG1hY3NbaV0uZG9GaW5hbCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWNzW2ldLmRvRmluYWwobmV3IGJ5dGVbcmVzLmxlbmd0aCAtIDFdLCAwKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoU2hvcnRCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmRvRmluYWwoYnl0ZVtdIG91dHB1dCwgaW50IG91dE9mZnNldCk8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPmRvRmluYWwoKTwvY29kZT4gbWV0aG9kcyBBc3NlcnRpb246IE1hYyByZXN1bHQgaXMgc3RvcmVkIGluCisgICAgICogb3V0cHV0IGJ1ZmZlcgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9GaW5hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMTEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiwgU2hvcnRCdWZmZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1hYyBbXSBtYWNzID0gY3JlYXRlTWFjcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJNYWMgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgbWFjcyk7CisgICAgICAgIGJ5dGUgW10gYiA9IHsoYnl0ZSkwLCAoYnl0ZSkwLCAoYnl0ZSkwLCAoYnl0ZSkwLCAoYnl0ZSkwfTsKKyAgICAgICAgU2VjcmV0S2V5U3BlYyBzY3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhiLCAiU0hBMSIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1hY3NbaV0uaW5pdChzY3MpOworICAgICAgICAgICAgYnl0ZSBbXSByZXMxID0gbWFjc1tpXS5kb0ZpbmFsKCk7CisgICAgICAgICAgICBieXRlIFtdIHJlczIgPSBuZXcgYnl0ZVtyZXMxLmxlbmd0aCArIDEwXTsKKyAgICAgICAgICAgIG1hY3NbaV0uZG9GaW5hbChyZXMyLCAwKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzMS5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm90IGVxdWFscyBieXRlIG51bWJlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChJbnRlZ2VyLnRvU3RyaW5nKGopKSwgcmVzMVtqXSwgcmVzMltqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZG9GaW5hbChieXRlW10gaW5wdXQpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHVwZGF0ZSBNYWMgYW5kIHJldHVybnMgcmVzdWx0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdE1hYzEyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24gIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBieXRlIFtdIGIgPSB7KGJ5dGUpMCwgKGJ5dGUpMCwgKGJ5dGUpMCwgKGJ5dGUpMCwgKGJ5dGUpMH07CisgICAgICAgIGJ5dGUgW10gdXBkID0geyhieXRlKTUsIChieXRlKTQsIChieXRlKTMsIChieXRlKTIsIChieXRlKTEsIChieXRlKTB9OworICAgICAgICBTZWNyZXRLZXlTcGVjIHNjcyA9IG5ldyBTZWNyZXRLZXlTcGVjKGIsICJTSEExIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFjcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbWFjc1tpXS5pbml0KHNjcyk7CisgICAgICAgICAgICBieXRlIFtdIHJlczEgPSBtYWNzW2ldLmRvRmluYWwoKTsKKyAgICAgICAgICAgIGJ5dGUgW10gcmVzMiA9IG1hY3NbaV0uZG9GaW5hbCgpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHRzIGFyZSBub3QgdGhlIHNhbWUiLCByZXMxLmxlbmd0aCwgcmVzMi5sZW5ndGgpOworICAgICAgICAgICAgZm9yKGludCB0ID0gMDsgdCA8IHJlczEubGVuZ3RoOyB0KyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3VsdHMgYXJlIG5vdCB0aGUgc2FtZSIsIHJlczFbdF0sIHJlczJbdF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzMiA9IG1hY3NbaV0uZG9GaW5hbCh1cGQpOworICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUodXBkKTsKKyAgICAgICAgICAgIHJlczEgPSBtYWNzW2ldLmRvRmluYWwoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0cyBhcmUgbm90IHRoZSBzYW1lIiwgcmVzMS5sZW5ndGgsIHJlczIubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvcihpbnQgdCA9IDA7IHQgPCByZXMxLmxlbmd0aDsgdCsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHRzIGFyZSBub3QgdGhlIHNhbWUiLCByZXMxW3RdLCByZXMyW3RdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT51cGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb3V0c2V0LCBpbnQgbGVuKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gb2Zmc2V0IG9yIGxlbiBpcyBuZWdhdGl2ZSwKKyAgICAgKiBvZmZzZXQgKyBsZW4gPj0gaW5wdXQubGVuZ3RoCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWMxMygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWFjIFtdIG1hY3MgPSBjcmVhdGVNYWNzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIk1hYyBvYmplY3RzIHdlcmUgbm90IGNyZWF0ZWQiLCBtYWNzKTsKKyAgICAgICAgYnl0ZSBbXSBiID0geyhieXRlKTAsIChieXRlKTAsIChieXRlKTAsIChieXRlKTAsIChieXRlKTB9OworICAgICAgICBTZWNyZXRLZXlTcGVjIHNjcyA9IG5ldyBTZWNyZXRLZXlTcGVjKGIsICJTSEExIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFjcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbWFjc1tpXS5pbml0KHNjcyk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0udXBkYXRlKGIsIC0xMCwgYi5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUoYiwgMCwgLTEwKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0udXBkYXRlKGIsIDAsIGIubGVuZ3RoICsgMSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWNzW2ldLnVwZGF0ZShiLCBiLmxlbmd0aCAtIDEsIDIpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0gICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+dXBkYXRlKGJ5dGVbXSBpbnB1dCwgaW50IG91dHNldCwgaW50IGxlbik8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnVwZGF0ZShieXRlW10gaW5wdXQ8L2NvZGU+IAorICAgICAqIG1ldGhvZHMKKyAgICAgKiBBc3NlcnRpb246IHVwZGF0ZXMgTWFjCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZS5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjMTQoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCAKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1hYyBbXSBtYWNzID0gY3JlYXRlTWFjcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJNYWMgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgbWFjcyk7CisgICAgICAgIGJ5dGUgW10gYiA9IHsoYnl0ZSkwLCAoYnl0ZSkwLCAoYnl0ZSkwLCAoYnl0ZSkwLCAoYnl0ZSkwfTsKKyAgICAgICAgYnl0ZSBbXSB1cGQxID0geyhieXRlKTAsIChieXRlKTEsIChieXRlKTUsIChieXRlKTQsIChieXRlKTMsIChieXRlKTJ9OworICAgICAgICBieXRlIFtdIHVwZDIgPSB7KGJ5dGUpNSwgKGJ5dGUpNCwgKGJ5dGUpMywgKGJ5dGUpMn07CisgICAgICAgIGJ5dGUgW10gcmVzMTsKKyAgICAgICAgYnl0ZSBbXSByZXMyOworICAgICAgICBTZWNyZXRLZXlTcGVjIHNjcyA9IG5ldyBTZWNyZXRLZXlTcGVjKGIsICJTSEExIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFjcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbWFjc1tpXS5pbml0KHNjcyk7CisgICAgICAgICAgICBtYWNzW2ldLnVwZGF0ZSh1cGQxLCAyLCA0KTsKKyAgICAgICAgICAgIHJlczEgPSBtYWNzW2ldLmRvRmluYWwoKTsKKyAgICAgICAgICAgIG1hY3NbaV0uaW5pdChzY3MpOworICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUodXBkMik7CisgICAgICAgICAgICByZXMyID0gbWFjc1tpXS5kb0ZpbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3VsdHMgYXJlIG5vdCB0aGUgc2FtZSIsIHJlczEubGVuZ3RoLCByZXMyLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IoaW50IHQgPSAwOyB0IDwgcmVzMS5sZW5ndGg7IHQrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0cyBhcmUgbm90IHRoZSBzYW1lIiwgcmVzMVt0XSwgcmVzMlt0XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWNzW2ldLmluaXQoc2NzKTsKKyAgICAgICAgICAgIG1hY3NbaV0udXBkYXRlKChieXRlKTUpOworICAgICAgICAgICAgcmVzMSA9IG1hY3NbaV0uZG9GaW5hbCgpOworICAgICAgICAgICAgbWFjc1tpXS5pbml0KHNjcyk7CisgICAgICAgICAgICBtYWNzW2ldLnVwZGF0ZSh1cGQxLDIsMSk7CisgICAgICAgICAgICByZXMyID0gbWFjc1tpXS5kb0ZpbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3VsdHMgYXJlIG5vdCB0aGUgc2FtZSIsIHJlczEubGVuZ3RoLCByZXMyLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IoaW50IHQgPSAwOyB0IDwgcmVzMS5sZW5ndGg7IHQrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0cyBhcmUgbm90IHRoZSBzYW1lIiwgcmVzMVt0XSwgcmVzMlt0XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmNsb25lKCk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBNYWMgb2JqZWN0IG9yIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgorICAgICAqLyAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWNDbG9uZSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWFjIG1hYzEgPSAoTWFjKSBtYWNzW2ldLmNsb25lKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1hYzEuZ2V0QWxnb3JpdGhtKCksIG1hY3NbaV0uZ2V0QWxnb3JpdGhtKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhtYWMxLmdldFByb3ZpZGVyKCksIG1hY3NbaV0uZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobWFjc1tpXS5lcXVhbHMobWFjMSkpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIAorICAgICAqIDxjb2RlPmluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpPC9jb2RlPiAKKyAgICAgKiA8Y29kZT5pbml0KEtleSBrZXkpPC9jb2RlPiAKKyAgICAgKiBtZXRob2RzCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiBhbmQgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqIHdoZW4gcGFyYW1ldGVycyBhcmUgbm90IGFwcHJvcHJpYXRlIAorICAgICAqLyAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBleGNlcHRpb25zIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleS5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBieXRlIFtdIGIgPSB7KGJ5dGUpMSwgKGJ5dGUpMiwgKGJ5dGUpMywgKGJ5dGUpNCwgKGJ5dGUpNX07CisgICAgICAgIFNlY3JldEtleVNwZWMgc2tzID0gbmV3IFNlY3JldEtleVNwZWMoYiwgIlNIQTEiKTsKKyAgICAgICAgREhHZW5QYXJhbWV0ZXJTcGVjIGFsZ1BTID0gbmV3IERIR2VuUGFyYW1ldGVyU3BlYygxLCAyKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFjc1tpXS5pbml0KHNrcywgYWxnUFMpOworICAgICAgICAgICAgICAgIGZhaWwoImluaXQoLi4pIGFjY2VwdHMgaW5jb3JyZWN0IEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWNzW2ldLmluaXQobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hY3NbaV0uaW5pdChudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbnZhbGlkS2V5RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+dXBkYXRlKEJ5dGVCdWZmZXIgaW5wdXQpPC9jb2RlPgorICAgICAqIDxjb2RlPnVwZGF0ZShieXRlW10gaW5wdXQsIGludCBvZmZzZXQsIGludCBsZW4pPC9jb2RlPgorICAgICAqIG1ldGhvZHMKKyAgICAgKiBBc3NlcnRpb246IHByb2Nlc3NlcyBNYWM7IGlmIGlucHV0IGlzIG51bGwgdGhlbiBkbyBub3RoaW5nIAorICAgICAqLyAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBmdW5jdGlvbmFsaXR5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUJ5dGVCdWZmZXIwMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBieXRlIFtdIGJiID0geyhieXRlKTEsIChieXRlKTIsIChieXRlKTMsIChieXRlKTQsIChieXRlKTV9OworICAgICAgICBTZWNyZXRLZXlTcGVjIHNrcyA9IG5ldyBTZWNyZXRLZXlTcGVjKGJiLCAiU0hBMSIpOworICAgICAgICBCeXRlQnVmZmVyIGJ5dGVOdWxsID0gbnVsbDsKKyAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCk7CisgICAgICAgIGJ5dGUgW10gYmIxOworICAgICAgICBieXRlIFtdIGJiMjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYWNzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtYWNzW2ldLmluaXQoc2tzKTsKKyAgICAgICAgICAgIGJiMSA9IG1hY3NbaV0uZG9GaW5hbCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWNzW2ldLnVwZGF0ZShieXRlTnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGJlY2F1c2UgYnVmZmVyIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWNzW2ldLnVwZGF0ZShieXRlQnVmZik7CisgICAgICAgICAgICBiYjIgPSBtYWNzW2ldLmRvRmluYWwoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgYmIxLmxlbmd0aDsgdCsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG9GaW5hbCByZXN1bHQiLCBiYjFbdF0sIGJiMlt0XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWNzW2ldLmluaXQoc2tzKTsKKyAgICAgICAgICAgIGJiMSA9IG1hY3NbaV0uZG9GaW5hbCgpOworICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUobnVsbCwgMCwgMCk7CisgICAgICAgICAgICBiYjIgPSBtYWNzW2ldLmRvRmluYWwoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgYmIxLmxlbmd0aDsgdCsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG9GaW5hbCByZXN1bHQiLCBiYjFbdF0sIGJiMlt0XSk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+dXBkYXRlKEJ5dGVCdWZmZXIgaW5wdXQpPC9jb2RlPgorICAgICAqIDxjb2RlPnVwZGF0ZShieXRlW10gaW5wdXQsIGludCBvZmZzZXQsIGludCBsZW4pPC9jb2RlPgorICAgICAqIG1ldGhvZHMKKyAgICAgKiBBc3NlcnRpb246IHByb2Nlc3NlcyBNYWMgCisgICAgICovICAgIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGZ1bmN0aW9uYWxpdHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQnl0ZUJ1ZmZlcjAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1hYyBbXSBtYWNzID0gY3JlYXRlTWFjcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJNYWMgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgbWFjcyk7CisgICAgICAgIGJ5dGUgW10gYmIgPSB7KGJ5dGUpMSwgKGJ5dGUpMiwgKGJ5dGUpMywgKGJ5dGUpNCwgKGJ5dGUpNX07CisgICAgICAgIFNlY3JldEtleVNwZWMgc2tzID0gbmV3IFNlY3JldEtleVNwZWMoYmIsICJTSEExIik7CisgICAgICAgIGJ5dGUgW10gYmJ1ZiA9IHsoYnl0ZSk1LCAoYnl0ZSk0LCAoYnl0ZSkzLCAoYnl0ZSkyLCAoYnl0ZSkxfTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmOworICAgICAgICBieXRlIFtdIGJiMTsKKyAgICAgICAgYnl0ZSBbXSBiYjI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFjcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYnl0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNSk7ICAgICAgICAKKyAgICAgICAgICAgIGJ5dGVCdWYucHV0KGJidWYpOworICAgICAgICAgICAgYnl0ZUJ1Zi5wb3NpdGlvbigyKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIG1hY3NbaV0uaW5pdChza3MpOyAgICAgICAgICAgIAorICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUoYnl0ZUJ1Zik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYmIxID0gbWFjc1tpXS5kb0ZpbmFsKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1hY3NbaV0uaW5pdChza3MpOworICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUoYmJ1ZiwgMiwgMyk7CisgICAgICAgICAgICBiYjIgPSBtYWNzW2ldLmRvRmluYWwoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgYmIxLmxlbmd0aDsgdCsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG9GaW5hbCByZXN1bHQiLCBiYjFbdF0sIGJiMlt0XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Y2xvbmUoKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiBjbG9uZSBpZiBwcm92aWRlciBpcyBjbG8gIAorICAgICAqLyAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpICB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWFjIFtdIG1hY3MgPSBjcmVhdGVNYWNzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIk1hYyBvYmplY3RzIHdlcmUgbm90IGNyZWF0ZWQiLCBtYWNzKTsKKyAgICAgICAgTWFjIHJlczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYWNzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlcyA9IChNYWMpbWFjc1tpXS5jbG9uZSgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk9iamVjdCBzaG91bGQgbm90IGJlIGVxdWFscyIsICFtYWNzW2ldLmVxdWFscyhyZXMpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjbGFzcyIsIG1hY3NbaV0uZ2V0Q2xhc3MoKSwgcmVzLmdldENsYXNzKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldE1hY0xlbmd0aCgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybiBNYWMgbGVuZ3RoCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWFjTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1hY0xlbmd0aCgpIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkxlbmd0aCBzaG91bGQgYmUgcG9zaXRpdmUiLCAobWFjc1tpXS5nZXRNYWNMZW5ndGgoKSA+PSAwKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+cmVzZXQoKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm4gTWFjIGxlbmd0aAorICAgICAqLyAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWMgW10gbWFjcyA9IGNyZWF0ZU1hY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFjIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIG1hY3MpOworICAgICAgICBieXRlIFtdIGJiID0geyhieXRlKTEsIChieXRlKTIsIChieXRlKTMsIChieXRlKTQsIChieXRlKTV9OworICAgICAgICBTZWNyZXRLZXlTcGVjIHNrcyA9IG5ldyBTZWNyZXRLZXlTcGVjKGJiLCAiU0hBMSIpOworICAgICAgICBieXRlIFtdIGJidWYgPSB7KGJ5dGUpNSwgKGJ5dGUpNCwgKGJ5dGUpMywgKGJ5dGUpMiwgKGJ5dGUpMX07CisgICAgICAgIGJ5dGUgW10gYmIxOworICAgICAgICBieXRlIFtdIGJiMjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYWNzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtYWNzW2ldLmluaXQoc2tzKTsKKyAgICAgICAgICAgIGJiMSA9IG1hY3NbaV0uZG9GaW5hbCgpOworICAgICAgICAgICAgbWFjc1tpXS5yZXNldCgpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYmIyID0gbWFjc1tpXS5kb0ZpbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImluY29ycmVjdCByZXN1bHQiLGJiMS5sZW5ndGgsIGJiMi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBiYjEubGVuZ3RoOyB0KyspIHsKKyAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRvRmluYWwgcmVzdWx0IiwgYmIxW3RdLCBiYjJbdF0pOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFjc1tpXS5yZXNldCgpOworICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUoYmJ1Zik7CisgICAgICAgICAgICBiYjEgPSBtYWNzW2ldLmRvRmluYWwoKTsKKyAgICAgICAgICAgIG1hY3NbaV0ucmVzZXQoKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIG1hY3NbaV0udXBkYXRlKGJidWYsIDAsIGJidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIGJiMiA9IG1hY3NbaV0uZG9GaW5hbCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgcmVzdWx0IixiYjEubGVuZ3RoLCBiYjIubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgYmIxLmxlbmd0aDsgdCsrKSB7CisgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkb0ZpbmFsIHJlc3VsdCIsIGJiMVt0XSwgYmIyW3RdKTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5NYWM8L2NvZGU+IGNvbnN0cnVjdG9yIAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBNYWMgb2JqZWN0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTWFjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmF4LmNyeXB0by5NYWNTcGkuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWNDb25zdHJ1Y3RvcigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNYWNTcGkgc3BpID0gbmV3IE15TWFjU3BpKCk7CisgICAgICAgIE1hYyBtYWMgPSBuZXcgbXlNYWMoc3BpLCBkZWZhdWx0UHJvdmlkZXIsIGRlZmF1bHRBbGdvcml0aG0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBtYWMuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgZGVmYXVsdEFsZ29yaXRobSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgbWFjLmdldFByb3ZpZGVyKCksIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYWMuaW5pdChudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGJlY2F1c2UgaW5pdCguLikgdXNlcyBpbmNvcnJlY3QgcGFyYW1ldGVycyIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBtYWMgbGVuZ3RoIiwgbWFjLmdldE1hY0xlbmd0aCgpLCAwKTsKKyAgICAgICAgCisgICAgICAgIG1hYyA9IG5ldyBteU1hYyhudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiQWxnb3JpdGhtIG11c3QgYmUgbnVsbCIsIG1hYy5nZXRBbGdvcml0aG0oKSk7CisgICAgICAgIGFzc2VydE51bGwoIlByb3ZpZGVyIG11c3QgYmUgbnVsbCIsIG1hYy5nZXRQcm92aWRlcigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hYy5pbml0KG51bGwsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gYmVjYXVzZSBpbml0KC4uKSB1c2VzIGluY29ycmVjdCBwYXJhbWV0ZXJzIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hYy5nZXRNYWNMZW5ndGgoKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1hY1Rlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsgICAgICAgIAorICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgICAgIAorICAgIH0gICAgICAgIAorfQorLyoqCisgKiBBZGRpdGlvbmFsIGNsYXNzIGZvciBNYWMgY29uc3RydWN0b3IgdmVyaWZpY2F0aW9uCisgKi8KK2NsYXNzIG15TWFjIGV4dGVuZHMgTWFjIHsKKworICAgIHB1YmxpYyBteU1hYyhNYWNTcGkgbWFjU3BpLCBQcm92aWRlciBwcm92aWRlciwKKyAgICAgICAgICAgIFN0cmluZyBhbGdvcml0aG0pIHsKKyAgICAgICAgc3VwZXIobWFjU3BpLCBwcm92aWRlciwgYWxnb3JpdGhtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGIxYmRhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YXguY3J5cHRvLk5vU3VjaFBhZGRpbmdFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworQFRlc3RUYXJnZXRDbGFzcyhOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uLmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Tm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZAorICogbWV0aG9kcy4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIE5vU3VjaFBhZGRpbmdFeGNlcHRpb25UZXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSIgfTsKKworICAgIHN0YXRpYyBUaHJvd2FibGUgdENhdXNlID0gbmV3IFRocm93YWJsZSgiVGhyb3dhYmxlIGZvciBleGNlcHRpb24iKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPk5vU3VjaFBhZGRpbmdFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgorICAgICAqIGNvbnN0cnVjdHMgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hQYWRkaW5nRXhjZXB0aW9uMDEoKSB7CisgICAgICAgIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24gdEUgPSBuZXcgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuCisgICAgICogUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjAyKCkgeworICAgICAgICBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IE5vU3VjaFBhZGRpbmdFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24gd2hlbiA8Y29kZT5tc2c8L2NvZGU+IGlzCisgICAgICogbnVsbAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjAzKCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiB0RSA9IG5ldyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL051bGxDaXBoZXJUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9OdWxsQ2lwaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTRiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9OdWxsQ2lwaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBCb3JpcyBWLiBLdXpuZXRzb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOworaW1wb3J0IGphdmF4LmNyeXB0by5OdWxsQ2lwaGVyOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoTnVsbENpcGhlci5jbGFzcykKKy8qKgorICoKKyAqIFRlc3RzIGZvciBOdWxsQ2lwaGVyCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsQ2lwaGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgQ2lwaGVyIGM7CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgYyA9IG5ldyBOdWxsQ2lwaGVyKCk7CisgICAgfQorCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2xhc3MgY2hlY2tzIGluaGVyaXRlZCBtZXRob2RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGdvcml0aG0oKSB7CisgICAgICAgIGMuZ2V0QWxnb3JpdGhtKCk7CisgICAgfQorCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICBwdXJwb3NlID0gIkNoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJsb2NrU2l6ZSIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICApCisgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCbG9ja1NpemUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IEJsb2NrU2l6ZSIsIDEsIGMuZ2V0QmxvY2tTaXplKCkpOworICAgIH0KKworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldE91dHB1dFNpemUiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0U2l6ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgT3V0cHV0U2l6ZSIsIDExMSwgYy5nZXRPdXRwdXRTaXplKDExMSkpOworICAgIH0KKworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgcHVycG9zZSA9ICJDaGVja3MgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIENpcGhlci4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJViIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICApIAorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SVYoKSB7CisgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBJViIsIEFycmF5cy5lcXVhbHMoYy5nZXRJVigpLCBuZXcgYnl0ZVs4XSkpOworICAgIH0KKworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgcHVycG9zZSA9ICJDaGVja3MgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIENpcGhlci4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCBQYXJhbWV0ZXJzIiwgYy5nZXRQYXJhbWV0ZXJzKCkpOworICAgIH0KKworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgcHVycG9zZSA9ICJDaGVja3MgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIENpcGhlci4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFeGVtcHRpb25NZWNoYW5pc20iLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhlbXB0aW9uTWVjaGFuaXNtKCkgeworICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgRXhlbXB0aW9uTWVjaGFuaXNtIiwgYy5nZXRFeGVtcHRpb25NZWNoYW5pc20oKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGluaXQoaW50LCBLZXkpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEuc2VjdXJpdHkuS2V5LmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEluaXRpbnRLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYy5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIG5ldyBTZWNyZXRLZXlTcGVjKG5ldyBieXRlWzFdLCAiYWxnb3JpdGhtIikpOworICAgIAorICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBpbml0KGludCwgS2V5LCBTZWN1cmVSYW5kb20pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbS5jbGFzc30KKyAgICAgICAgICApCisgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0aW50S2V5U2VjdXJlUmFuZG9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGMuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBuZXcgU2VjcmV0S2V5U3BlYyhuZXcgYnl0ZVsxXSwKKyAgICAgICAgICAgICAgICAiYWxnb3JpdGhtIiksIG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGluaXQoaW50LCBLZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEuc2VjdXJpdHkuS2V5LmNsYXNzLCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzc30KKyAgICAgICAgICApCisgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0aW50S2V5QWxnb3JpdGhtUGFyYW1ldGVyU3BlYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjbGFzcyBteUFsZ29yaXRobVBhcmFtZXRlclNwZWMgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyB7fQorICAgICAgICBjLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgbmV3IFNlY3JldEtleVNwZWMobmV3IGJ5dGVbMV0sCisgICAgICAgICAgICAgICAgImFsZ29yaXRobSIpLCBuZXcgbXlBbGdvcml0aG1QYXJhbWV0ZXJTcGVjKCkpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgYnl0ZVtdIHVwZGF0ZShieXRlW10pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gQ2hlY2tzIGluaGVyaXRlZCBtZXRob2QgZnJvbSBDaXBoZXIuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZWJ5dGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlIFtdIGIgPSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIGJ5dGUgW10gciA9IGMudXBkYXRlKGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpZmZlcmVudCBsZW5ndGgiLCBiLmxlbmd0aCwgci5sZW5ndGgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaWZmZXJlbnQgY29udGVudCIsIEFycmF5cy5lcXVhbHMoYiwgcikpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgYnl0ZVtdIHVwZGF0ZShieXRlW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlYnl0ZUFycmF5aW50aW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGUgW10gYiA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgYnl0ZSBbXSByID0gYy51cGRhdGUoYiwgMCwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlmZmVyZW50IGxlbmd0aCIsIGIubGVuZ3RoLCByLmxlbmd0aCk7CisgICAgICAgIGFzc2VydFRydWUoImRpZmZlcmVudCBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhiLCByKSk7CisgICAgICAgIAorICAgICAgICByID0gYy51cGRhdGUoYiwgMSwgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlmZmVyZW50IGxlbmd0aCIsIDMsIHIubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZGlmZmVyZW50IGNvbnRlbnQiLCBiW2kgKyAxXSwgcltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGludCB1cGRhdGUoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZVtdKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiBDaGVja3MgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIENpcGhlci4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlYnl0ZUFycmF5aW50aW50Ynl0ZUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGUgW10gYiA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgYnl0ZSBbXSByID0gbmV3IGJ5dGVbNV07IAorICAgICAgICBjLnVwZGF0ZShiLCAwLCA1LCByKTsgICAgICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlmZmVyZW50IGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGIsIHIpKTsgICAgICAgIAorICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgaW50IHVwZGF0ZShieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4gQ2hlY2tzIGluaGVyaXRlZCBtZXRob2QgZnJvbSBDaXBoZXIuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlYnl0ZUFycmF5aW50aW50Ynl0ZUFycmF5aW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGUgW10gYiA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgYnl0ZSBbXSByID0gbmV3IGJ5dGVbNV07IAorICAgICAgICBjLnVwZGF0ZShiLCAwLCA1LCByLCAwKTsgICAgICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlmZmVyZW50IGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGIsIHIpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJ5dGVbXSBkb0ZpbmFsKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiBDaGVja3MgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIENpcGhlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERvRmluYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZG9GaW5hbCBmYWlsZWQiLCBjLmRvRmluYWwoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgZG9GaW5hbChieXRlW10sIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4gQ2hlY2tzIGluaGVyaXRlZCBtZXRob2QgZnJvbSBDaXBoZXIuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9GaW5hbCIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERvRmluYWxieXRlQXJyYXlpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZSBbXSByID0gbmV3IGJ5dGVbNV07CisgICAgICAgIGFzc2VydEVxdWFscygiZG9GaW5hbCBmYWlsZWQiLCAwLCBjLmRvRmluYWwociwgMCkpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgYnl0ZVtdIGRvRmluYWwoYnl0ZVtdKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiBDaGVja3MgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIENpcGhlci4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERvRmluYWxieXRlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZSBbXSBiID0gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBieXRlIFtdIHIgPSBudWxsOyAKKyAgICAgICAgciA9IGMuZG9GaW5hbChiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaWZmZXJlbnQgbGVuZ3RoIiwgYi5sZW5ndGgsIHIubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlmZmVyZW50IGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGIsIHIpKTsgICAgICAgIAorICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgYnl0ZVtdIGRvRmluYWwoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4gQ2hlY2tzIGluaGVyaXRlZCBtZXRob2QgZnJvbSBDaXBoZXIuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9GaW5hbCIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9GaW5hbGJ5dGVBcnJheWludGludCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlIFtdIGIgPSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIGJ5dGUgW10gciA9IG51bGw7CisgICAgICAgIHIgPSBjLmRvRmluYWwoYiwgMCwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlmZmVyZW50IGxlbmd0aCIsIGIubGVuZ3RoLCByLmxlbmd0aCk7CisgICAgICAgIGFzc2VydFRydWUoImRpZmZlcmVudCBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhiLCByKSk7CisgICAgICAgIAorICAgICAgICByID0gYy5kb0ZpbmFsKGIsIDEsIDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpZmZlcmVudCBsZW5ndGgiLCAzLCByLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRpZmZlcmVudCBjb250ZW50IiwgYltpICsgMV0sIHJbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBieXRlW10gdXBkYXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlYnl0ZUFycmF5aW50aW50MigpIHsKKyAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTc1OAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IE51bGxDaXBoZXIoKS51cGRhdGUobmV3IGJ5dGVbMV0sIDEsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgZG9GaW5hbChieXRlW10sIGludCwgaW50LCBieXRlW10pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvRmluYWwiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9GaW5hbGJ5dGVBcnJheWludGludGJ5dGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlIFtdIGIgPSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIGJ5dGUgW10gciA9IG5ldyBieXRlWzVdOyAKKyAgICAgICAgYy5kb0ZpbmFsKGIsIDAsIDUsIHIpOyAgICAgICAgICAgIAorICAgICAgICBhc3NlcnRUcnVlKCJkaWZmZXJlbnQgY29udGVudCIsIEFycmF5cy5lcXVhbHMoYiwgcikpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgaW50IGRvRmluYWwoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZVtdKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiBDaGVja3MgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIENpcGhlci4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb0ZpbmFsIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERvRmluYWxieXRlQXJyYXlpbnRpbnRieXRlQXJyYXkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03NTgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBOdWxsQ2lwaGVyKCkudXBkYXRlKG5ldyBieXRlWzFdLCAxLCBJbnRlZ2VyLk1BWF9WQUxVRSwgCisgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlWzFdKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgZG9GaW5hbChieXRlW10sIGludCwgaW50LCBieXRlW10pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvRmluYWwiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdERvRmluYWxieXRlQXJyYXlpbnRpbnRieXRlQXJyYXkzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03NTgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBOdWxsQ2lwaGVyKCkudXBkYXRlKG5ldyBieXRlWzFdLCAwLCAxLCBuZXcgYnl0ZVswXSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgaW50IGRvRmluYWwoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZVtdLCBpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIENoZWNrcyBpbmhlcml0ZWQgbWV0aG9kIGZyb20gQ2lwaGVyLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvRmluYWwiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICApCisgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3REb0ZpbmFsYnl0ZUFycmF5aW50aW50Ynl0ZUFycmF5aW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGUgW10gYiA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgYnl0ZSBbXSByID0gbmV3IGJ5dGVbNV07IAorICAgICAgICBjLmRvRmluYWwoYiwgMCwgNSwgciwgMCk7CisgICAgICAgIGFzc2VydFRydWUoImRpZmZlcmVudCBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhiLCByKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgZG9GaW5hbChieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4gQ2hlY2tzIGluaGVyaXRlZCBtZXRob2QgZnJvbSBDaXBoZXIuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9GaW5hbCIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERvRmluYWxieXRlQXJyYXlpbnRpbnRieXRlQXJyYXlpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03NTgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBOdWxsQ2lwaGVyKCkudXBkYXRlKG5ldyBieXRlWzFdLCAxLCBJbnRlZ2VyLk1BWF9WQUxVRSwgCisgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlWzFdLCAwKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgZG9GaW5hbChieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4gQ2hlY2tzIGluaGVyaXRlZCBtZXRob2QgZnJvbSBDaXBoZXIuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG9GaW5hbCIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3REb0ZpbmFsYnl0ZUFycmF5aW50aW50Ynl0ZUFycmF5aW50MygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNzU4CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgTnVsbENpcGhlcigpLnVwZGF0ZShuZXcgYnl0ZVsxXSwgMCwgMSwgCisgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlWzBdLCAwKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vU2VhbGVkT2JqZWN0VGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vU2VhbGVkT2JqZWN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZGNjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TZWFsZWRPYmplY3RUZXN0LmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0bzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yOworaW1wb3J0IGphdmF4LmNyeXB0by5OdWxsQ2lwaGVyOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWFsZWRPYmplY3Q7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuSXZQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoU2VhbGVkT2JqZWN0LmNsYXNzKQorLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFsZWRPYmplY3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIGNsYXNzIE1vY2tfU2VhbGVkT2JqZWN0IGV4dGVuZHMgU2VhbGVkT2JqZWN0IHsKKyAgICAgICAgcHVibGljIE1vY2tfU2VhbGVkT2JqZWN0KFNlcmlhbGl6YWJsZSBvYmplY3QsIENpcGhlciBjKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihvYmplY3QsIGMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRfZW5jb2RlZFBhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5lbmNvZGVkUGFyYW1zOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHMpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiB0aGUKKyAgICAgKiBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiB3b3JrcyBjb3JyZWN0bHk6IG9iamVjdCBpcyBzZXJpYWxpemVkLAorICAgICAqIGRlc2VyaWFsaXplZCwgdGhlIGNvbnRlbnQgb2QgZGVzZXJpYWxpemVkIG9iamVjdCBlcXVhbHMgdG8gdGhlIGNvbnRlbnQgb2YKKyAgICAgKiBpbml0aWFsIG9iamVjdC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzZWNyZXQgPSAic2VjcmV0IHN0cmluZyI7CisgICAgICAgIFNlYWxlZE9iamVjdCBzbyA9IG5ldyBTZWFsZWRPYmplY3Qoc2VjcmV0LCBuZXcgTnVsbENpcGhlcigpKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYm9zKTsKKyAgICAgICAgb29zLndyaXRlT2JqZWN0KHNvKTsKKworICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIGJvcy50b0J5dGVBcnJheSgpKSk7CisKKyAgICAgICAgU2VhbGVkT2JqZWN0IHNvX2RlcyA9IChTZWFsZWRPYmplY3QpIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHNlY3JldCBjb250ZW50IG9mIGRlc2VyaWFsaXplZCBvYmplY3QgIgorICAgICAgICAgICAgICAgICsgInNob3VsZCBiZSBlcXVhbCB0byB0aGUgc2VjcmV0IGNvbnRlbnQgb2YgaW5pdGlhbCBvYmplY3QiLAorICAgICAgICAgICAgICAgIHNlY3JldCwgc29fZGVzLmdldE9iamVjdChuZXcgTnVsbENpcGhlcigpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldEFsZ29yaXRobSgpIG1ldGhvZCBvZiAiCisgICAgICAgICAgICAgICAgKyAiZGVzZXJpYWxpemVkIG9iamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkICIKKyAgICAgICAgICAgICAgICArICJieSBnZXRBbGdvcml0aG0oKSBtZXRob2Qgb2YgaW5pdGlhbCBvYmplY3QiLCBzbworICAgICAgICAgICAgICAgIC5nZXRBbGdvcml0aG0oKSwgc29fZGVzLmdldEFsZ29yaXRobSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFsZWRPYmplY3QoU2VyaWFsaXphYmxlIG9iamVjdCwgQ2lwaGVyIGMpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiB0aGUKKyAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgbnVsbCBjaXBoZXIuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IGNoZWNrZWQgaW4gdGVzdFNlYWxlZE9iamVjdDIsIG1pc3NlZCBJT0V4Y2VwdGlvbiAmIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24gY2hlY2tpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZWFsZWRPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5TZXJpYWxpemFibGUuY2xhc3MsIGphdmF4LmNyeXB0by5DaXBoZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWFsZWRPYmplY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzZWNyZXQgPSAic2VjcmV0IHN0cmluZyI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VhbGVkT2JqZWN0KHNlY3JldCwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGluIHRoZSBjYXNlICIKKyAgICAgICAgICAgICAgICAgICAgKyAib2YgbnVsbCBjaXBoZXIuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlYWxlZE9iamVjdChTZWFsZWRPYmplY3Qgc28pIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiB0aGUKKyAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgbnVsbCBTZWFsZWRPYmplY3QuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VhbGVkT2JqZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmF4LmNyeXB0by5TZWFsZWRPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWFsZWRPYmplY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VhbGVkT2JqZWN0KG51bGwpIHt9OworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpbiB0aGUgY2FzZSAiCisgICAgICAgICAgICAgICAgICAgICsgIm9mIG51bGwgU2VhbGVkT2JqZWN0LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgc2VjcmV0ID0gInNlY3JldCBzdHJpbmciOworICAgICAgICBDaXBoZXIgY2lwaGVyID0gbmV3IE51bGxDaXBoZXIoKTsKKyAgICAgICAgU2VhbGVkT2JqZWN0IHNvMSA9IG5ldyBTZWFsZWRPYmplY3Qoc2VjcmV0LCBjaXBoZXIpOworICAgICAgICBTZWFsZWRPYmplY3Qgc28yID0gbmV3IFNlYWxlZE9iamVjdChzbzEpIHt9OworCisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHNlY3JldCBjb250ZW50IG9mIHRoZSBvYmplY3Qgc2hvdWxkIGVxdWFscyAiCisgICAgICAgICAgICAgICAgKyAidG8gdGhlIHNlY3JldCBjb250ZW50IG9mIGluaXRpYWwgb2JqZWN0LiIsIHNlY3JldCwgc28yCisgICAgICAgICAgICAgICAgLmdldE9iamVjdChjaXBoZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgYWxnb3JpdGhtIHdoaWNoIHdhcyB1c2VkIHRvIHNlYWwgdGhlIG9iamVjdCAiCisgICAgICAgICAgICAgICAgKyAic2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBhbGdvcml0aG0gdXNlZCB0byBzZWFsIHRoZSAiCisgICAgICAgICAgICAgICAgKyAiaW5pdGlhbCBvYmplY3QiLCBzbzEuZ2V0QWxnb3JpdGhtKCksIHNvMi5nZXRBbGdvcml0aG0oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0QWxnb3JpdGhtKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIGlmIHRoZSByZXR1cm5lZCB2YWx1ZSBlcXVhbHMgdG8gdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2YWx1ZSBvZiBDaXBoZXIgb2JqZWN0LgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGdvcml0aG0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNlY3JldCA9ICJzZWNyZXQgc3RyaW5nIjsKKyAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9ICJERVMiOworICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgS2V5IGtleSA9IGtnLmdlbmVyYXRlS2V5KCk7CisKKyAgICAgICAgQ2lwaGVyIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgICAgICBjaXBoZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXkpOworICAgICAgICBTZWFsZWRPYmplY3Qgc28gPSBuZXcgU2VhbGVkT2JqZWN0KHNlY3JldCwgY2lwaGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBhbGdvcml0aG0gbmFtZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdXNlZCAiCisgICAgICAgICAgICAgICAgKyAiaW4gY2lwaGVyLiIsIGFsZ29yaXRobSwgc28uZ2V0QWxnb3JpdGhtKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldE9iamVjdChLZXkga2V5KSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgdGhlIG9iamVjdCBzZWFsZWQgd2l0aAorICAgICAqIGVuY3J5cHRpb24gYWxnb3JpdGhtIGFuZCBzcGVjaWZpZWQgcGFyYW1ldGVycyBjYW4gYmUgcmV0cmlldmVkIGJ5CisgICAgICogc3BlY2lmeWluZyB0aGUgY3J5cHRvZ3JhcGhpYyBrZXkuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleUdlbmVyYXRvciBrZyA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZSgiREVTIik7CisgICAgICAgIEtleSBrZXkgPSBrZy5nZW5lcmF0ZUtleSgpOworCisgICAgICAgIEl2UGFyYW1ldGVyU3BlYyBpcHMgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKG5ldyBieXRlW10geworICAgICAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9KTsKKworICAgICAgICBDaXBoZXIgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKCJERVMvQ0JDL1BLQ1M1UGFkZGluZyIpOworICAgICAgICBjaXBoZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXksIGlwcyk7CisKKyAgICAgICAgU3RyaW5nIHNlY3JldCA9ICJzZWNyZXQgc3RyaW5nIjsKKyAgICAgICAgTW9ja19TZWFsZWRPYmplY3Qgc28gPSBuZXcgTW9ja19TZWFsZWRPYmplY3Qoc2VjcmV0LCBjaXBoZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIG9iamVjdCBkb2VzIG5vdCBlcXVhbHMgdG8gdGhlICIKKyAgICAgICAgICAgICAgICArICJvcmlnaW5hbCBvYmplY3QuIiwgc2VjcmV0LCBzby5nZXRPYmplY3Qoa2V5KSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVuY29kZWRQYXJhbXMgZmllbGQgb2YgU2VhbGVkT2JqZWN0IG9iamVjdCAiCisgICAgICAgICAgICAgICAgKyAic2hvdWxkIGNvbnRhaW4gdGhlIGVuY29kZWQgYWxnb3JpdGhtIHBhcmFtZXRlcnMuIiwgQXJyYXlzCisgICAgICAgICAgICAgICAgLmVxdWFscyhzby5nZXRfZW5jb2RlZFBhcmFtcygpLCBjaXBoZXIuZ2V0UGFyYW1ldGVycygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5jb2RlZCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0T2JqZWN0KENpcGhlciBjKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgdGhlIHByb3BlciBleGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgaW5jb3JyZWN0IGlucHV0IHBhcmFtZXRlcnMgYW5kIGlmIHRoZSBvYmplY3Qgc2VhbGVkCisgICAgICogd2l0aCBlbmNyeXB0aW9uIGFsZ29yaXRobSBhbmQgc3BlY2lmaWVkIHBhcmFtZXRlcnMgY2FuIGJlIHJldHJpZXZlZCBieQorICAgICAqIHNwZWNpZnlpbmcgdGhlIGluaXRpYWxpemVkIENpcGhlciBvYmplY3QuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguY3J5cHRvLkNpcGhlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldE9iamVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBTZWFsZWRPYmplY3QoInNlY3JldCBzdHJpbmciLCBuZXcgTnVsbENpcGhlcigpKQorICAgICAgICAgICAgICAgICAgICAuZ2V0T2JqZWN0KChDaXBoZXIpIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpbiB0aGUgY2FzZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgIm51bGwgY2lwaGVyLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkRFUyIpOworICAgICAgICBLZXkga2V5ID0ga2cuZ2VuZXJhdGVLZXkoKTsKKworICAgICAgICBJdlBhcmFtZXRlclNwZWMgaXBzID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhuZXcgYnl0ZVtdIHsKKyAgICAgICAgICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fSk7CisKKyAgICAgICAgQ2lwaGVyIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZSgiREVTL0NCQy9QS0NTNVBhZGRpbmciKTsKKyAgICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5LCBpcHMpOworCisgICAgICAgIFN0cmluZyBzZWNyZXQgPSAic2VjcmV0IHN0cmluZyI7CisgICAgICAgIFNlYWxlZE9iamVjdCBzbyA9IG5ldyBTZWFsZWRPYmplY3Qoc2VjcmV0LCBjaXBoZXIpOworCisgICAgICAgIGNpcGhlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGtleSwgaXBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcmV0dXJuZWQgb2JqZWN0IGRvZXMgbm90IGVxdWFscyB0byB0aGUgIgorICAgICAgICAgICAgICAgICsgIm9yaWdpbmFsIG9iamVjdC4iLCBzZWNyZXQsIHNvLmdldE9iamVjdChjaXBoZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRPYmplY3QoS2V5IGtleSwgU3RyaW5nIHByb3ZpZGVyKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgdGhlIHByb3BlcgorICAgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgaW5jb3JyZWN0IGlucHV0IHBhcmFtZXRlcnMgYW5kIGlmIHRoZQorICAgICAqIG9iamVjdCBzZWFsZWQgd2l0aCBlbmNyeXB0aW9uIGFsZ29yaXRobSBjYW4gYmUgcmV0cmlldmVkIGJ5IHNwZWNpZnlpbmcKKyAgICAgKiB0aGUgY3J5cHRvZ3JhcGhpYyBrZXkgYW5kIHByb3ZpZGVyIG5hbWUuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VhbGVkT2JqZWN0KCJzZWNyZXQgc3RyaW5nIiwgbmV3IE51bGxDaXBoZXIoKSkuZ2V0T2JqZWN0KAorICAgICAgICAgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhuZXcgYnl0ZVtdIHswLCAwLCAwfSwgImFsZ29yaXRobSIpLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGluIHRoZSBjYXNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgKyAibnVsbCBwcm92aWRlci4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VhbGVkT2JqZWN0KCJzZWNyZXQgc3RyaW5nIiwgbmV3IE51bGxDaXBoZXIoKSkuZ2V0T2JqZWN0KAorICAgICAgICAgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhuZXcgYnl0ZVtdIHswLCAwLCAwfSwgImFsZ29yaXRobSIpLCAiIik7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpbiB0aGUgY2FzZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgImVtcHR5IHByb3ZpZGVyLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgS2V5R2VuZXJhdG9yIGtnID0gS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKCJERVMiKTsKKyAgICAgICAgS2V5IGtleSA9IGtnLmdlbmVyYXRlS2V5KCk7CisKKyAgICAgICAgQ2lwaGVyIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZSgiREVTIik7CisgICAgICAgIFN0cmluZyBwcm92aWRlciA9IGNpcGhlci5nZXRQcm92aWRlcigpLmdldE5hbWUoKTsKKyAgICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5KTsKKworICAgICAgICBTdHJpbmcgc2VjcmV0ID0gInNlY3JldCBzdHJpbmciOworICAgICAgICBTZWFsZWRPYmplY3Qgc28gPSBuZXcgU2VhbGVkT2JqZWN0KHNlY3JldCwgY2lwaGVyKTsKKworICAgICAgICBjaXBoZXIuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBrZXkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCBvYmplY3QgZG9lcyBub3QgZXF1YWxzIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgKyAib3JpZ2luYWwgb2JqZWN0LiIsIHNlY3JldCwgc28uZ2V0T2JqZWN0KGtleSwgcHJvdmlkZXIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL1NlY3JldEtleUZhY3RvcnlTcGlUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TZWNyZXRLZXlGYWN0b3J5U3BpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmFlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TZWNyZXRLZXlGYWN0b3J5U3BpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5U3BpOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0Lk15U2VjcmV0S2V5RmFjdG9yeVNwaTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5TZWNyZXRLZXlGYWN0b3J5U3BpPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworCitAVGVzdFRhcmdldENsYXNzKFNlY3JldEtleUZhY3RvcnlTcGkuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2VjcmV0S2V5RmFjdG9yeVNwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgY2xhc3MgTW9ja19TZWNyZXRLZXlGYWN0b3J5U3BpIGV4dGVuZHMgTXlTZWNyZXRLZXlGYWN0b3J5U3BpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldChLZXlTcGVjIGtleVNwZWMpIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lR2VuZXJhdGVTZWNyZXQoa2V5U3BlYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEtleVNwZWMgZW5naW5lR2V0S2V5U3BlYyhTZWNyZXRLZXkga2V5LCBDbGFzcyBrZXlTcGVjKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdldEtleVNwZWMoa2V5LCBrZXlTcGVjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU2VjcmV0S2V5IGVuZ2luZVRyYW5zbGF0ZUtleShTZWNyZXRLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lVHJhbnNsYXRlS2V5KGtleSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNlY3JldEtleWZhY3RvcnlTcGlUZXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBTZWNyZXRLZXlGYWN0b3J5U3BpVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5TZWNyZXRLZXlGYWN0b3J5U3BpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBTZWNyZXRLZXlGYWN0b3J5U3BpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VjcmV0S2V5RmFjdG9yeVNwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNyZXRLZXlGYWN0b3J5U3BpMDEoKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja19TZWNyZXRLZXlGYWN0b3J5U3BpIHNrZlNwaSA9IG5ldyBNb2NrX1NlY3JldEtleUZhY3RvcnlTcGkoKTsKKyAgICAgICAgU2VjcmV0S2V5IHNrID0gbnVsbDsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgcmVzdWx0Iiwgc2tmU3BpLmVuZ2luZVRyYW5zbGF0ZUtleShzaykpOworCisgICAgICAgIEtleVNwZWMga3NwZWMgPSBudWxsOworICAgICAgICBhc3NlcnROdWxsKCJOb3QgbnVsbCByZXN1bHQiLCBza2ZTcGkuZW5naW5lR2VuZXJhdGVTZWNyZXQoa3NwZWMpKTsKKworICAgICAgICBhc3NlcnROdWxsKCJOb3QgbnVsbCByZXN1bHQiLCBza2ZTcGkuZW5naW5lR2V0S2V5U3BlYyhzaywgbnVsbCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL1NlY3JldEtleUZhY3RvcnlUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TZWNyZXRLZXlGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjhkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TZWNyZXRLZXlGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTI0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYzsKKworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleUZhY3Rvcnk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleUZhY3RvcnlTcGk7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREVTS2V5U3BlYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5ERVNlZGVLZXlTcGVjOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLnN1cHBvcnQuTXlTZWNyZXRLZXlGYWN0b3J5U3BpOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlNwaUVuZ1V0aWxzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitAVGVzdFRhcmdldENsYXNzKFNlY3JldEtleUZhY3RvcnkuY2xhc3MpCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5TZWNyZXRLZXlGYWN0b3J5PC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgU2VjcmV0S2V5RmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3J2U2VjcmV0S2V5RmFjdG9yeSA9ICJTZWNyZXRLZXlGYWN0b3J5IjsKKyAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBbGdvcml0aG0xID0gIkRFU2VkZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBbGdvcml0aG0yID0gIkRFUyI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEFsZ29yaXRobSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFByb3ZpZGVyTmFtZSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW52YWxpZFZhbHVlcyA9IFNwaUVuZ1V0aWxzLmludmFsaWRWYWx1ZXM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHZhbGlkVmFsdWVzID0gbmV3IFN0cmluZ1syXTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERFRlN1cHBvcnRlZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5vdFN1cHBvcnRNc2cgPSAiRGVmYXVsdCBhbGdvcml0aG0gaXMgbm90IHN1cHBvcnRlZCI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBkZWZhdWx0UHJvdmlkZXIgPSBTcGlFbmdVdGlscy5pc1N1cHBvcnQoZGVmYXVsdEFsZ29yaXRobTEsCisgICAgICAgICAgICAgICAgc3J2U2VjcmV0S2V5RmFjdG9yeSk7CisgICAgICAgIERFRlN1cHBvcnRlZCA9IChkZWZhdWx0UHJvdmlkZXIgIT0gbnVsbCk7CisgICAgICAgIGlmIChERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGRlZmF1bHRBbGdvcml0aG0gPSBkZWZhdWx0QWxnb3JpdGhtMTsKKyAgICAgICAgICAgIHZhbGlkVmFsdWVzWzBdID0gZGVmYXVsdEFsZ29yaXRobS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgdmFsaWRWYWx1ZXNbMV0gPSBkZWZhdWx0QWxnb3JpdGhtLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lID0gZGVmYXVsdFByb3ZpZGVyLmdldE5hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlciA9IFNwaUVuZ1V0aWxzLmlzU3VwcG9ydChkZWZhdWx0QWxnb3JpdGhtMiwKKyAgICAgICAgICAgICAgICAgICAgc3J2U2VjcmV0S2V5RmFjdG9yeSk7CisgICAgICAgICAgICBERUZTdXBwb3J0ZWQgPSAoZGVmYXVsdFByb3ZpZGVyICE9IG51bGwpOworICAgICAgICAgICAgaWYgKERFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRBbGdvcml0aG0gPSBkZWZhdWx0QWxnb3JpdGhtMjsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlc1swXSA9IGRlZmF1bHRBbGdvcml0aG0udG9VcHBlckNhc2UoKTsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlc1syXSA9IGRlZmF1bHRBbGdvcml0aG0udG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lID0gZGVmYXVsdFByb3ZpZGVyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdEFsZ29yaXRobSA9IG51bGw7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBTZWNyZXRLZXlGYWN0b3J5W10gY3JlYXRlU0tGYWMoKSB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKGRlZmF1bHRBbGdvcml0aG0gKyAiIGFsZ29yaXRobSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTZWNyZXRLZXlGYWN0b3J5W10gc2tGID0gbmV3IFNlY3JldEtleUZhY3RvcnlbM107CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBza0ZbMF0gPSBTZWNyZXRLZXlGYWN0b3J5LmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0pOworICAgICAgICAgICAgc2tGWzFdID0gU2VjcmV0S2V5RmFjdG9yeS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgc2tGWzJdID0gU2VjcmV0S2V5RmFjdG9yeS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBza0Y7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5TZWNyZXRLZXlGYWN0b3J5PC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBTZWNyZXRLZXlGYWN0b3J5IG9iamVjdAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3JldEtleUZhY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguY3J5cHRvLlNlY3JldEtleUZhY3RvcnlTcGkuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNyZXRLZXlGYWN0b3J5MDEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52YWxpZEtleVNwZWNFeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZWNyZXRLZXlGYWN0b3J5U3BpIHNwaSA9IG5ldyBNeVNlY3JldEtleUZhY3RvcnlTcGkoKTsKKyAgICAgICAgU2VjcmV0S2V5RmFjdG9yeSBzZWNLRiA9IG5ldyBteVNlY3JldEtleUZhY3Rvcnkoc3BpLCBkZWZhdWx0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgZGVmYXVsdEFsZ29yaXRobSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIHNlY0tGLmdldEFsZ29yaXRobSgpLAorICAgICAgICAgICAgICAgIGRlZmF1bHRBbGdvcml0aG0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIHNlY0tGLmdldFByb3ZpZGVyKCksIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCByZXN1bHQiLCBzZWNLRi5nZW5lcmF0ZVNlY3JldChudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCByZXN1bHQiLCBzZWNLRi5nZXRLZXlTcGVjKG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IHJlc3VsdCIsIHNlY0tGLnRyYW5zbGF0ZUtleShudWxsKSk7CisgICAgICAgIHNlY0tGID0gbmV3IG15U2VjcmV0S2V5RmFjdG9yeShudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiQWxnb3JpdGhtIG11c3QgYmUgbnVsbCIsIHNlY0tGLmdldEFsZ29yaXRobSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiUHJvdmlkZXIgbXVzdCBiZSBudWxsIiwgc2VjS0YuZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWNLRi50cmFuc2xhdGVLZXkobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6CisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGw7IAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaGFzIGludmFsaWQgdmFsdWUKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZWNyZXRLZXlGYWN0b3J5LmdldEluc3RhbmNlKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaWYgYWxnb3JpdGhtIGlzIG51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTZWNyZXRLZXlGYWN0b3J5LmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBhcyBleHBlY3RlZCIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgU2VjcmV0S2V5T2JqZWN0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTAzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNlY3JldEtleUZhY3Rvcnkgc2VjS0YgPSBTZWNyZXRLZXlGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBzZWNLRi5nZXRBbGdvcml0aG0oKSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uOiAKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbDsKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIGludmFsaWQKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTA0KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UobnVsbCwgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBhcyBleHBlY3RlZCAoYWxnb3JpdGhtOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGludmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPgorICAgICAqIG1ldGhvZCAKKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsIG9yIGVtcHR5OworICAgICAqIHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGhhcyBpbnZhbGlkIHZhbHVlCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTA1KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByb3YgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIHByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBhcyBleHBlY3RlZCAoYWxnb3JpdGhtOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIiBwcm92aWRlcjogbnVsbCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sICIiKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24gYXMgZXhwZWN0ZWQgKGFsZ29yaXRobTogIgorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh2YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIgcHJvdmlkZXI6IGVtcHR5IikpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIGFzIGV4cGVjdGVkIChhbGdvcml0aG06ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIiBwcm92aWRlcjogIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGludmFsaWRWYWx1ZXNbal0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIFNlY3JldEtleUZhY3Rvcnkgb2JqZWN0CisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTA2KCkgdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2VjcmV0S2V5RmFjdG9yeSBzZWNLRiA9IFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldLCBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIHNlY0tGLmdldEFsZ29yaXRobSgpLAorICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIHNlY0tGLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbDsKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIGludmFsaWQKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTA3KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZWNyZXRLZXlGYWN0b3J5LmdldEluc3RhbmNlKG51bGwsIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2FzIG5vdCB0aHJvd24gYXMgZXhwZWN0ZWQgKGFsZ29yaXRobTogIgorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChpbnZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpPC9jb2RlPgorICAgICAqIG1ldGhvZCAKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldEluc3RhbmNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTA4KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFByb3ZpZGVyIHByb3YgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIHByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBhcyBleHBlY3RlZCAocHJvdmlkZXIgaXMgbnVsbCwgYWxnb3JpdGhtOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpPC9jb2RlPgorICAgICAqIG1ldGhvZCAKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgU2VjcmV0S2V5RmFjdG9yeSBvYmplY3QKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0SW5zdGFuY2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNyZXRLZXlGYWN0b3J5MDkoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2VjcmV0S2V5RmFjdG9yeSBzZWNLRiA9IFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldLCBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgc2VjS0YuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgc2VjS0YuZ2V0UHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdlbmVyYXRlU2VjcmV0KEtleVNwZWMga2V5U3BlYyk8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPmdldEtleVNwZWMoU2VjcmV0S2V5IGtleSwgQ2xhc3Mga2V5U3BlYykKKyAgICAgKiBtZXRob2RzCisgICAgICogQXNzZXJ0aW9uOiAKKyAgICAgKiB0aHJvdyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBpZiBwYXJhbWV0ZXIgaXMgaW5hcHByb3ByaWF0ZQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlRpcyB0ZXN0IGlzIGNoZWNraW5nIHR3byBtZXRob2RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlU2VjcmV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguY3J5cHRvLlNlY3JldEtleS5jbGFzcywgamF2YS5sYW5nLkNsYXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjcmV0S2V5RmFjdG9yeTEwKCkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBiYiA9IG5ldyBieXRlWzI0XTsKKyAgICAgICAgS2V5U3BlYyBrcyA9IChkZWZhdWx0QWxnb3JpdGhtLmVxdWFscyhkZWZhdWx0QWxnb3JpdGhtMikgPyAoS2V5U3BlYyluZXcgREVTS2V5U3BlYyhiYikgOgorICAgICAgICAgICAgKEtleVNwZWMpbmV3IERFU2VkZUtleVNwZWMoYmIpKTsKKyAgICAgICAgS2V5U3BlYyBya3MgPSBudWxsOworICAgICAgICBTZWNyZXRLZXlTcGVjIHNlY0tleVNwZWMgPSBuZXcgU2VjcmV0S2V5U3BlYyhiYiwgZGVmYXVsdEFsZ29yaXRobSk7CisgICAgICAgIFNlY3JldEtleSBzZWNLZXkgPSBudWxsOworICAgICAgICBTZWNyZXRLZXlGYWN0b3J5W10gc2tGID0gY3JlYXRlU0tGYWMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2VjcmV0S2V5RmFjdG9yeSBvYmplY3Qgd2VyZSBub3QgY3JlYXRlZCIsIHNrRik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2tGLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNrRltpXS5nZW5lcmF0ZVNlY3JldChudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJnZW5lcmF0ZVNlY3JldChudWxsKTogSW52YWxpZEtleVNwZWNFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VjS2V5ID0gc2tGW2ldLmdlbmVyYXRlU2VjcmV0KGtzKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2tGW2ldLmdldEtleVNwZWMobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiZ2V0S2V5U3BlYyhudWxsLG51bGwpOiBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleVNwZWNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBza0ZbaV0uZ2V0S2V5U3BlYyhudWxsLCBrcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJnZXRLZXlTcGVjKG51bGwsIENsYXNzKTogSW52YWxpZEtleVNwZWNFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2tGW2ldLmdldEtleVNwZWMoc2VjS2V5LCBudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJnZXRLZXlTcGVjKHNlY0tleSwgbnVsbCk6IE51bGxQb2ludGVyRXhjZXB0aW9uIG9yIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjOworICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0QWxnb3JpdGhtLmVxdWFscyhkZWZhdWx0QWxnb3JpdGhtMikpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IERFU2VkZUtleVNwZWMuY2xhc3M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IERFU0tleVNwZWMuY2xhc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNrRltpXS5nZXRLZXlTcGVjKHNlY0tleVNwZWMsIGMpOworICAgICAgICAgICAgICAgIGZhaWwoImdldEtleVNwZWMoc2VjS2V5LCBDbGFzcyk6IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBya3MgPSBza0ZbaV0uZ2V0S2V5U3BlYyhzZWNLZXlTcGVjLCBrcy5nZXRDbGFzcygpKTsgICAgICAgICAgCisgICAgICAgICAgICBpZiAoZGVmYXVsdEFsZ29yaXRobS5lcXVhbHMoZGVmYXVsdEFsZ29yaXRobTEpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGdldEtleVNwZWMoKSByZXN1bHQgMSIsCisgICAgICAgICAgICAgICAgICAgICAgICBya3MgaW5zdGFuY2VvZiBERVNlZGVLZXlTcGVjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGdldEtleVNwZWMoKSByZXN1bHQgMSIsCisgICAgICAgICAgICAgICAgICAgICAgICBya3MgaW5zdGFuY2VvZiBERVNLZXlTcGVjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmtzID0gc2tGW2ldLmdldEtleVNwZWMoc2VjS2V5LCBrcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0QWxnb3JpdGhtLmVxdWFscyhkZWZhdWx0QWxnb3JpdGhtMSkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZ2V0S2V5U3BlYygpIHJlc3VsdCAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJrcyBpbnN0YW5jZW9mIERFU2VkZUtleVNwZWMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZ2V0S2V5U3BlYygpIHJlc3VsdCAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJrcyBpbnN0YW5jZW9mIERFU0tleVNwZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBteVNlY3JldEtleUZhY3RvcnkgZXh0ZW5kcyBTZWNyZXRLZXlGYWN0b3J5IHsKKyAgICBwdWJsaWMgbXlTZWNyZXRLZXlGYWN0b3J5KFNlY3JldEtleUZhY3RvcnlTcGkgc3BpLCBQcm92aWRlciBwcm92LCBTdHJpbmcgYWxnKSB7CisgICAgICAgIHN1cGVyKHNwaSwgcHJvdiwgYWxnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TZWNyZXRLZXlUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TZWNyZXRLZXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4YzZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL1NlY3JldEtleVRlc3QuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG87CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjcmV0S2V5LmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+U2VjcmV0S2V5PC9jb2RlPiBjbGFzcyBmaWVsZAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTZWNyZXRLZXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNlY3JldEtleVRlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjcmV0S2V5VGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPiBmaWVsZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkKCkgeworICAgICAgICBjaGVja1NlY3JldEtleSBzayA9IG5ldyBjaGVja1NlY3JldEtleSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXJpYWxWZXJzaW9uVUlEIiwgCisgICAgICAgICAgICAgICAgc2suZ2V0U2VyVmVyVUlEKCksIC8vU2VjcmV0S2V5LnNlcmlhbFZlcnNpb25VSUQKKyAgICAgICAgICAgICAgICAtNDc5NTg3ODcwOTU5NTE0Njk1MkwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2xhc3MgY2hlY2tTZWNyZXRLZXkgaW1wbGVtZW50cyBTZWNyZXRLZXkgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiU2VjcmV0S2V5IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiRm9ybWF0IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2VyVmVyVUlEKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbFZlcnNpb25VSUQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YmEyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YXguY3J5cHRvLlNob3J0QnVmZmVyRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitAVGVzdFRhcmdldENsYXNzKFNob3J0QnVmZmVyRXhjZXB0aW9uLmNsYXNzKQorLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+U2hvcnRCdWZmZXJFeGNlcHRpb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgU2hvcnRCdWZmZXJFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBTaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIFNob3J0QnVmZmVyRXhjZXB0aW9uVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSIgfTsKKworICAgIHN0YXRpYyBUaHJvd2FibGUgdENhdXNlID0gbmV3IFRocm93YWJsZSgiVGhyb3dhYmxlIGZvciBleGNlcHRpb24iKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPlNob3J0QnVmZmVyRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKKyAgICAgKiBjb25zdHJ1Y3RzIFNob3J0QnVmZmVyRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaG9ydEJ1ZmZlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydEJ1ZmZlckV4Y2VwdGlvbjAxKCkgeworICAgICAgICBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB0RSA9IG5ldyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5TaG9ydEJ1ZmZlckV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KKyAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaG9ydEJ1ZmZlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRCdWZmZXJFeGNlcHRpb24wMigpIHsKKyAgICAgICAgU2hvcnRCdWZmZXJFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgU2hvcnRCdWZmZXJFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5TaG9ydEJ1ZmZlckV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMKKyAgICAgKiBudWxsCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2hvcnRCdWZmZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFNob3J0QnVmZmVyRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB0RSA9IG5ldyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbihtc2cpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0FsbFRlc3RzLmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhNjNlNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLmludGVyZmFjZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIFRoaXMgaXMgYXV0b2dlbmVyYXRlZCBzb3VyY2UgZmlsZS4gSW5jbHVkZXMgdGVzdHMgZm9yIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uaW50ZXJmYWNlczsKKyAqLworCitwdWJsaWMgY2xhc3MgQWxsVGVzdHMgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJBbGwgdGVzdHMgZm9yIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uaW50ZXJmYWNlczsiKTsKKyAgICAgICAgLy8gJEpVbml0LUJFR0lOJAorCisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShESFByaXZhdGVLZXlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERIUHVibGljS2V5VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQQkVLZXlUZXN0LmNsYXNzKTsKKworICAgICAgICAvLyAkSlVuaXQtRU5EJAorICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESFByaXZhdGVLZXlUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0RIUHJpdmF0ZUtleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzY1ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESFByaXZhdGVLZXlUZXN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLmludGVyZmFjZXM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uaW50ZXJmYWNlcy5ESFByaXZhdGVLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREhQYXJhbWV0ZXJTcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+REhQcml2YXRlS2V5PC9jb2RlPiBjbGFzcyBmaWVsZAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBESFByaXZhdGVLZXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERIUHJpdmF0ZUtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBESFByaXZhdGVLZXlUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+IGZpZWxkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkKCkgeworICAgICAgICBjaGVja0RIUHJpdmF0ZUtleSBrZXkgPSBuZXcgY2hlY2tESFByaXZhdGVLZXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2VyaWFsVmVyc2lvblVJRCIsCisgICAgICAgICAgICAgICAga2V5LmdldFNlclZlclVJRCgpLCAvL0RIUHJpdmF0ZUtleS5zZXJpYWxWZXJzaW9uVUlECisgICAgICAgICAgICAgICAgMjIxMTc5MTExMzM4MDM5NjU1M0wpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2xhc3MgY2hlY2tESFByaXZhdGVLZXkgaW1wbGVtZW50cyBESFByaXZhdGVLZXkgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiU2VjcmV0S2V5IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiRm9ybWF0IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2VyVmVyVUlEKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbFZlcnNpb25VSUQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0WCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBESFBhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL0RIUHVibGljS2V5VGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESFB1YmxpY0tleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTEyMWVlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vaW50ZXJmYWNlcy9ESFB1YmxpY0tleVRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uaW50ZXJmYWNlczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YXguY3J5cHRvLmludGVyZmFjZXMuREhQdWJsaWNLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREhQYXJhbWV0ZXJTcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkRIUHVibGljS2V5PC9jb2RlPiBjbGFzcyBmaWVsZAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBESFB1YmxpY0tleVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERIUHVibGljS2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIERIUHVibGljS2V5VGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPiBmaWVsZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZCgpIHsKKyAgICAgICAgY2hlY2tESFB1YmxpY0tleSBrZXkgPSBuZXcgY2hlY2tESFB1YmxpY0tleSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXJpYWxWZXJzaW9uVUlEIiwKKyAgICAgICAgICAgICAgICBrZXkuZ2V0U2VyVmVyVUlEKCksIC8vREhQdWJsaWNLZXkuc2VyaWFsVmVyc2lvblVJRAorICAgICAgICAgICAgICAgIC02NjI4MTAzNTYzMzUyNTE5MTkzTCk7CisgICAgfQorICAgIHB1YmxpYyBjbGFzcyBjaGVja0RIUHVibGljS2V5IGltcGxlbWVudHMgREhQdWJsaWNLZXkgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiU2VjcmV0S2V5IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiRm9ybWF0IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2VyVmVyVUlEKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbFZlcnNpb25VSUQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBESFBhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL1BCRUtleVRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL2ludGVyZmFjZXMvUEJFS2V5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMGMyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9pbnRlcmZhY2VzL1BCRUtleVRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uaW50ZXJmYWNlczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YXguY3J5cHRvLmludGVyZmFjZXMuUEJFS2V5OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPlBCRUtleTwvY29kZT4gY2xhc3MgZmllbGQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUEJFS2V5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFBCRUtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBQQkVLZXlUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+IGZpZWxkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkKCkgeworICAgICAgICBjaGVja1BCRUtleSBrZXkgPSBuZXcgY2hlY2tQQkVLZXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2VyaWFsVmVyc2lvblVJRCIsIAorICAgICAgICAgICAgICAgIGtleS5nZXRTZXJWZXJVSUQoKSwgLy9QQkVLZXkuc2VyaWFsVmVyc2lvblVJRAorICAgICAgICAgICAgICAgIC0xNDMwMDE1OTkzMzA0MzMzOTIxTCk7CisgICAgfQorICAgIHB1YmxpYyBjbGFzcyBjaGVja1BCRUtleSBpbXBsZW1lbnRzIFBCRUtleSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgeworICAgICAgICAgICAgcmV0dXJuICJTZWNyZXRLZXkiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0KCkgeworICAgICAgICAgICAgcmV0dXJuICJGb3JtYXQiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTZXJWZXJVSUQoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VyaWFsVmVyc2lvblVJRDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRZKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBnZXRJdGVyYXRpb25Db3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0U2FsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgY2hhcltdIGdldFBhc3N3b3JkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBjaGFyWzBdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9BbGxUZXN0cy5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9BbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZmExM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zZXJpYWxpemF0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNlcmlhbGl6YXRpb247CisgKi8KKworcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKEFsbFRlc3RzLnN1aXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIHRlc3RzIGZvciBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNlcmlhbGl6YXRpb247Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmFkUGFkZGluZ0V4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3QuY2xhc3MpOworCisgICAgICAgIC8vICRKVW5pdC1FTkQkCisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0JhZFBhZGRpbmdFeGNlcHRpb25UZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0JhZFBhZGRpbmdFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2MzJhZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vQmFkUGFkZGluZ0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uc2VyaWFsaXphdGlvbjsKKworaW1wb3J0IGphdmF4LmNyeXB0by5CYWRQYWRkaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKKworCisvKioKKyAqIFRlc3QgZm9yIEJhZFBhZGRpbmdFeGNlcHRpb24gc2VyaWFsaXphdGlvbgorICogCisgKi8KKworcHVibGljIGNsYXNzIEJhZFBhZGRpbmdFeGNlcHRpb25UZXN0IGV4dGVuZHMgU2VyaWFsaXphdGlvblRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIk5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJMb25nIG1lc3NhZ2UgZm9yIEV4Y2VwdGlvbi4gTG9uZyBtZXNzYWdlIGZvciBFeGNlcHRpb24uIExvbmcgbWVzc2FnZSBmb3IgRXhjZXB0aW9uLiIgfTsKKworICAgIHByb3RlY3RlZCBPYmplY3RbXSBnZXREYXRhKCkgeworICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IEJhZFBhZGRpbmdFeGNlcHRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgQmFkUGFkZGluZ0V4Y2VwdGlvbihudWxsKSwgbmV3IEJhZFBhZGRpbmdFeGNlcHRpb24obXNnc1sxXSkgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihCYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb25UZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ4Y2QwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNlcmlhbGl6YXRpb247CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKKworCisvKioKKyAqIFRlc3QgZm9yIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiBzZXJpYWxpemF0aW9uCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdCBleHRlbmRzIFNlcmlhbGl6YXRpb25UZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICJOZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiTG9uZyBtZXNzYWdlIGZvciBFeGNlcHRpb24uIExvbmcgbWVzc2FnZSBmb3IgRXhjZXB0aW9uLiBMb25nIG1lc3NhZ2UgZm9yIEV4Y2VwdGlvbi4iIH07CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uKG51bGwpLCBuZXcgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uKG1zZ3NbMV0pIH07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYzFkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNlcmlhbGl6YXRpb247CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CisKKworLyoqCisgKiBUZXN0IGZvciBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIHNlcmlhbGl6YXRpb24KKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdCBleHRlbmRzIFNlcmlhbGl6YXRpb25UZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICJOZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiTG9uZyBtZXNzYWdlIGZvciBFeGNlcHRpb24uIExvbmcgbWVzc2FnZSBmb3IgRXhjZXB0aW9uLiBMb25nIG1lc3NhZ2UgZm9yIEV4Y2VwdGlvbi4iIH07CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24obnVsbCksIG5ldyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uKG1zZ3NbMV0pIH07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvblRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzViZDJmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zZXJpYWxpemF0aW9uOworCitpbXBvcnQgamF2YXguY3J5cHRvLk5vU3VjaFBhZGRpbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OworCisKKy8qKgorICogVGVzdCBmb3IgTnVTdWNoUGFkZGluZ0V4Y2VwdGlvbiBzZXJpYWxpemF0aW9uCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBTZXJpYWxpemF0aW9uVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiTmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkxvbmcgbWVzc2FnZSBmb3IgRXhjZXB0aW9uLiBMb25nIG1lc3NhZ2UgZm9yIEV4Y2VwdGlvbi4gTG9uZyBtZXNzYWdlIGZvciBFeGNlcHRpb24uIiB9OworCisgICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBuZXcgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uKG51bGwpLCBuZXcgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbihtc2dzWzFdKSB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKE5vU3VjaFBhZGRpbmdFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9TaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY5NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9TaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uc2VyaWFsaXphdGlvbjsKKworaW1wb3J0IGphdmF4LmNyeXB0by5TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CisKKworLyoqCisgKiBUZXN0IGZvciBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBzZXJpYWxpemF0aW9uCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgU2hvcnRCdWZmZXJFeGNlcHRpb25UZXN0IGV4dGVuZHMgU2VyaWFsaXphdGlvblRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIk5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJMb25nIG1lc3NhZ2UgZm9yIEV4Y2VwdGlvbi4gTG9uZyBtZXNzYWdlIGZvciBFeGNlcHRpb24uIExvbmcgbWVzc2FnZSBmb3IgRXhjZXB0aW9uLiIgfTsKKworICAgIHByb3RlY3RlZCBPYmplY3RbXSBnZXREYXRhKCkgeworICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IFNob3J0QnVmZmVyRXhjZXB0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IFNob3J0QnVmZmVyRXhjZXB0aW9uKG51bGwpLCBuZXcgU2hvcnRCdWZmZXJFeGNlcHRpb24obXNnc1sxXSkgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihTaG9ydEJ1ZmZlckV4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvQWxsVGVzdHMuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWZkNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9BbGxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uc3BlYzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogVGhpcyBpcyBhdXRvZ2VuZXJhdGVkIHNvdXJjZSBmaWxlLiBJbmNsdWRlcyB0ZXN0cyBmb3IgcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zcGVjOworICovCisKK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihBbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCB0ZXN0cyBmb3IgcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zcGVjOyIpOworICAgICAgICAvLyAkSlVuaXQtQkVHSU4kCisKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERFU0tleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERFU2VkZUtleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERIR2VuUGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoREhQYXJhbWV0ZXJTcGVjVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShESFByaXZhdGVLZXlTcGVjVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShESFB1YmxpY0tleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEl2UGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoT0FFUFBhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBCRUtleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBCRVBhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBTb3VyY2VUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJDMlBhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJDNVBhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlY3JldEtleVNwZWNUZXN0LmNsYXNzKTsKKworICAgICAgICAvLyAkSlVuaXQtRU5EJAorICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9ERVNLZXlTcGVjVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9ERVNLZXlTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjEwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL0RFU0tleVNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkRFU0tleVNwZWM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworQFRlc3RUYXJnZXRDbGFzcyhERVNLZXlTcGVjLmNsYXNzKQorLyoqCisgKi8KKworcHVibGljIGNsYXNzIERFU0tleVNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLy8gREVTIHdlYWsgYW5kIHNlbWktd2VhayBrZXlzCisgICAgLy8gR290IGZyb206CisgICAgLy8gRklQIFBVQiA3NAorICAgIC8vIEZFREVSQUwgSU5GT1JNQVRJT04gUFJPQ0VTU0lORyBTVEFOREFSRFMgUFVCTElDQVRJT04gMTk4MQorICAgIC8vIEdVSURFTElORVMgRk9SIElNUExFTUVOVElORyBBTkQgVVNJTkcgVEhFIE5CUyBEQVRBIEVOQ1JZUFRJT04gU1RBTkRBUkQgCisgICAgLy8gaHR0cDovL3d3dy5kaWNlLnVjbC5hYy5iZS9jcnlwdG8vc3RhbmRhcmRzL2ZpcHMvZmlwNzQvZmlwNzQtMS5wZGYKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW11bXSBzZW1pd2Vha3MgPSB7CisgICAgICAgICAgICAgICAgeyhieXRlKSAweEUwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4RTAsIChieXRlKSAweDAxLAorICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhGMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweEYxLCAoYnl0ZSkgMHgwMX0sCisKKyAgICAgICAgICAgICAgICB7KGJ5dGUpIDB4MDEsIChieXRlKSAweEUwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4RTAsCisgICAgICAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHhGMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweEYxfSwKKworICAgICAgICAgICAgICAgIHsoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4MUYsIChieXRlKSAweEZFLCAoYnl0ZSkgMHgxRiwKKyAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4RkUsIChieXRlKSAweDBFLCAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4MEV9LAorCisgICAgICAgICAgICAgICAgeyhieXRlKSAweDFGLCAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4MUYsIChieXRlKSAweEZFLAorICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4RkUsIChieXRlKSAweDBFLCAoYnl0ZSkgMHhGRX0sCisKKyAgICAgICAgICAgICAgICB7KGJ5dGUpIDB4RTAsIChieXRlKSAweDFGLCAoYnl0ZSkgMHhFMCwgKGJ5dGUpIDB4MUYsCisgICAgICAgICAgICAgICAgIChieXRlKSAweEYxLCAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4RjEsIChieXRlKSAweDBFfSwKKworICAgICAgICAgICAgICAgIHsoYnl0ZSkgMHgxRiwgKGJ5dGUpIDB4RTAsIChieXRlKSAweDFGLCAoYnl0ZSkgMHhFMCwKKyAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MEUsIChieXRlKSAweEYxLCAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4RjF9LAorCisgICAgICAgICAgICAgICAgeyhieXRlKSAweDAxLCAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweEZFLAorICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4RkUsIChieXRlKSAweDAxLCAoYnl0ZSkgMHhGRX0sCisKKyAgICAgICAgICAgICAgICB7KGJ5dGUpIDB4RkUsIChieXRlKSAweDAxLCAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAgICAgIChieXRlKSAweEZFLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4RkUsIChieXRlKSAweDAxfSwKKworICAgICAgICAgICAgICAgIHsoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MUYsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgxRiwKKyAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBFLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MEV9LAorCisgICAgICAgICAgICAgICAgeyhieXRlKSAweDFGLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MUYsIChieXRlKSAweDAxLAorICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBFLCAoYnl0ZSkgMHgwMX0sCisKKyAgICAgICAgICAgICAgICB7KGJ5dGUpIDB4RTAsIChieXRlKSAweEZFLCAoYnl0ZSkgMHhFMCwgKGJ5dGUpIDB4RkUsCisgICAgICAgICAgICAgICAgIChieXRlKSAweEYxLCAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4RjEsIChieXRlKSAweEZFfSwKKworICAgICAgICAgICAgICAgIHsoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4RTAsIChieXRlKSAweEZFLCAoYnl0ZSkgMHhFMCwKKyAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4RkUsIChieXRlKSAweEYxLCAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4RjF9LAorCisgICAgICAgICAgICAgICAgeyhieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAKKyAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDF9LAorCisgICAgICAgICAgICAgICAgeyhieXRlKSAweEZFLCAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4RkUsIChieXRlKSAweEZFLAorICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4RkUsIChieXRlKSAweEZFLCAoYnl0ZSkgMHhGRX0sCisKKyAgICAgICAgICAgICAgICB7KGJ5dGUpIDB4RTAsIChieXRlKSAweEUwLCAoYnl0ZSkgMHhFMCwgKGJ5dGUpIDB4RTAsCisgICAgICAgICAgICAgICAgIChieXRlKSAweEYxLCAoYnl0ZSkgMHhGMSwgKGJ5dGUpIDB4RjEsIChieXRlKSAweEYxfSwKKworICAgICAgICAgICAgICAgIHsoYnl0ZSkgMHgxRiwgKGJ5dGUpIDB4MUYsIChieXRlKSAweDFGLCAoYnl0ZSkgMHgxRiwKKyAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBFLCAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4MEV9LAorICAgICAgICAgICAgfTsKKworICAgIC8qIERFUyBub3Qgd2VhayBvciBzZW1pLXdlYWsga2V5cyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXVtdIG5vdHNlbWl3ZWFrcyA9IHsKKyAgICAgICAgICAgICAgICB7KGJ5dGUpIDB4MWYsIChieXRlKSAweDFmLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MWYsCisgICAgICAgICAgICAgICAgIChieXRlKSAweDFmLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MWYsIChieXRlKSAweDFmfSwKKworICAgICAgICAgICAgICAgIHsoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwKKyAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTB9CisgICAgICAgICAgICB9OworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9ycyB0ZXN0aW5nLiBUZXN0cyBiZWhhdmlvciBvZiBlYWNoIG9mIHR3byBjb25zdHJ1Y3RvcnMKKyAgICAgKiBpbiB0aGUgY2FzZXMgb2Y6IG51bGwgYXJyYXksIHNob3J0IGFycmF5LCBub3JtYWwgYXJyYXkuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGJvdGggY29uc3RydWN0b3JzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRFU0tleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRFU0tleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RERVNLZXlTcGVjKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU0tleVNwZWMoKGJ5dGUgW10pIG51bGwpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIE51bGxQb2ludGVyRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gY2FzZSBvZiBudWxsIGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gTnVsbFBvaW50ZXJFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjYXNlIG9mIG51bGwgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU0tleVNwZWMobmV3IGJ5dGUgW10gezEsIDIsIDN9KTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCByYWlzZSBhbiBJbnZhbGlkS2V5RXhjZXB0aW9uIG9uIGEgc2hvcnQgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU0tleVNwZWMobmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOH0pOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbnZhbGlkS2V5RXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBERVNLZXlTcGVjKChieXRlIFtdKSBudWxsLCAxKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCByYWlzZSBhbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICsgImluIGNhc2Ugb2YgbnVsbCBieXRlIGFycmF5LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIE51bGxQb2ludGVyRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gY2FzZSBvZiBudWxsIGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBERVNLZXlTcGVjKG5ldyBieXRlIFtdICB7MSwgMiwgMywgNCwgNSwgNiwgNywgOH0sIDEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIEludmFsaWRLZXlFeGNlcHRpb24gb24gYSBzaG9ydCBieXRlIGFycmF5LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgREVTS2V5U3BlYyhuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fSwgMSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEludmFsaWRLZXlFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEtleSgpIG1ldGhvZCB0ZXN0aW5nLiBDaGVja3MgdGhhdCBtb2RpZmljYXRpb24gb2YgcmV0dXJuZWQga2V5CisgICAgICogZG9lcyBub3QgYWZmZWN0IHRoZSBpbnRlcm5hbCBrZXkuIEFsc28gdGVzdCBjaGVjayBhbiBlcXVhbGl0eSBvZgorICAgICAqIHRoZSBrZXkgd2l0aCB0aGUga2V5IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIFRoZSBvYmplY3QgdW5kZXIgCisgICAgICogdGhlIHRlc3QgaXMgY3JlYXRlZCBieSBkaWZmZXJlbnQgY29uc3RydWN0b3JzLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRLZXkoKSB7CisgICAgICAgIGJ5dGVbXSBrZXkgPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisgICAgICAgIERFU0tleVNwZWMga3M7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrcyA9IG5ldyBERVNLZXlTcGVjKGtleSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93bi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gcmVzID0ga3MuZ2V0S2V5KCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBhcnJheSBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICsgImluIGNvbnN0cnVjdG9yLiIsIEFycmF5cy5lcXVhbHMoa2V5LCByZXMpKTsKKyAgICAgICAgcmVzWzBdICs9IDE7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgbW9kaWZpY2F0aW9uIG9mIHJldHVybmVkIGtleSBzaG91bGQgbm90IGFmZmVjdCIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhlIHVuZGVybHlpbmcga2V5LiIsIGtleVswXSA9PSByZXNbMF0pOworCisgICAgICAgIGJ5dGVbXSBrZXkxID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDB9OworICAgICAgICB0cnkgeworICAgICAgICAgICAga3MgPSBuZXcgREVTS2V5U3BlYyhrZXkxLCAyKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkS2V5RXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlcyA9IGtzLmdldEtleSgpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJUaGUgcmV0dXJuZWQgYXJyYXkgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSBvYmplY3QgIgorICAgICAgICAgICAgICAgICAgICArICJhcyBzcGVjaWZpZWQgaW4gYSBjb25zdHJ1Y3Rvci4iLCBrZXkxLCByZXMpOworICAgICAgICBieXRlW10gZXhwID0gbmV3IGJ5dGVbOF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoa2V5MSwgMiwgZXhwLCAwLCA4KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBiZSBlcXVhbCB0byB0aGUgc3BlY2lmaWVkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gY29uc3RydWN0b3IuIiwgQXJyYXlzLmVxdWFscyhleHAsIHJlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlzUGFyaXR5QWRqdXN0ZWQoYnl0ZVtdIGtleSwgb2Zmc2V0KSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgdGhlCisgICAgICogbWV0aG9kIHRocm93cyBhcHByb3ByaWF0ZSBleGNlcHRpb25zIG9uIGluY29ycmVjdCBieXRlIGFycmF5LCBpZgorICAgICAqIGl0IHJldHVybnMgZmFsc2Ugb24gdGhlIGtleSB3aGljaCBpcyBub3QgcGFyaXR5IGFkanVzdGVkLCBhbmQgaWYKKyAgICAgKiBpdCByZXR1cm5zIHRydWUgb24gcGFyaXR5IGFkanVzdGVkIGtleS4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1Bhcml0eUFkanVzdGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQYXJpdHlBZGp1c3RlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERFU0tleVNwZWMuaXNQYXJpdHlBZGp1c3RlZChudWxsLCAxKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCByYWlzZSBhbiBJbnZhbGlkS2V5RXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gY2FzZSBvZiBudWxsIGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10ga2V5ID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgREVTS2V5U3BlYy5pc1Bhcml0eUFkanVzdGVkKGtleSwgMSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gSW52YWxpZEtleUV4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICsgImluIGNhc2Ugb2Ygc2hvcnQgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBrZXlfbm90X3BhID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIk1ldGhvZCByZXR1cm5zIHRydWUgd2hlbiBmYWxzZSBpcyBleHBlY3RlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgREVTS2V5U3BlYy5pc1Bhcml0eUFkanVzdGVkKGtleV9ub3RfcGEsIDApKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSW52YWxpZEtleUV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGtleV9wYSA9IHsoYnl0ZSkgMTI4LCAoYnl0ZSkgMTMxLCAoYnl0ZSkgMTMzLCAoYnl0ZSkgMTM0LAorICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAxMzcsIChieXRlKSAxMzgsIChieXRlKSAxNDAsIChieXRlKSAxNDN9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTWV0aG9kIHJldHVybnMgZmFsc2Ugd2hlbiB0cnVlIGlzIGV4cGVjdGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBERVNLZXlTcGVjLmlzUGFyaXR5QWRqdXN0ZWQoa2V5X3BhLCAwKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEludmFsaWRLZXlFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGlzV2VhayhieXRlW10ga2V5LCBpbnQgb2Zmc2V0KSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgdGhlCisgICAgICogbWV0aG9kIHRocm93cyBhcHByb3ByaWF0ZSBleGNlcHRpb25zIG9uIGluY29ycmVjdCBieXRlIGFycmF5LCBpZgorICAgICAqIGl0IHJldHVybnMgdHJ1ZSBvbiB3ZWFrIG9yIHNlbWktd2VhayBrZXlzLCBhbmQgaWYgaXQgcmV0dXJucyAKKyAgICAgKiBmYWxzZSBvbiBvdGhlciBrZXlzLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzV2VhayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdElzV2VhaygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERFU0tleVNwZWMuaXNXZWFrKG51bGwsIDEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIEludmFsaWRLZXlFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjYXNlIG9mIG51bGwgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBrZXkgPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBERVNLZXlTcGVjLmlzV2VhayhrZXksIDEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIEludmFsaWRLZXlFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjYXNlIG9mIHNob3J0IGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8c2VtaXdlYWtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk1ldGhvZCByZXR1cm5zIGZhbHNlIHdoZW4gdHJ1ZSBpcyBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBERVNLZXlTcGVjLmlzV2VhayhzZW1pd2Vha3NbaV0sIDApKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSW52YWxpZEtleUV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxub3RzZW1pd2Vha3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIk1ldGhvZCByZXR1cm5zIHRydWUgd2hlbiBmYWxzZSBpcyBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBERVNLZXlTcGVjLmlzV2Vhayhub3RzZW1pd2Vha3NbaV0sIDApKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSW52YWxpZEtleUV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShERVNLZXlTcGVjVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL0RFU2VkZUtleVNwZWNUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL0RFU2VkZUtleVNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZTNmYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvREVTZWRlS2V5U3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5ERVNlZGVLZXlTcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoREVTZWRlS2V5U3BlYy5jbGFzcykKKy8qKgorICovCisKK3B1YmxpYyBjbGFzcyBERVNlZGVLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9ycyB0ZXN0aW5nLiBUZXN0cyBiZWhhdmlvciBvZiBlYWNoIG9mIHR3byBjb25zdHJ1Y3RvcnMKKyAgICAgKiBpbiB0aGUgY2FzZXMgb2Y6IG51bGwgYXJyYXksIHNob3J0IGFycmF5LCBub3JtYWwgYXJyYXkuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGJvdGggY29uc3RydWN0b3JzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRFU2VkZUtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRFU2VkZUtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RERVNlZGVLZXlTcGVjKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU2VkZUtleVNwZWMoKGJ5dGUgW10pIG51bGwpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIE51bGxQb2ludGVyRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gY2FzZSBvZiBudWxsIGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gTnVsbFBvaW50ZXJFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjYXNlIG9mIG51bGwgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU2VkZUtleVNwZWMobmV3IGJ5dGUgW10gezEsIDIsIDN9KTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCByYWlzZSBhbiBJbnZhbGlkS2V5RXhjZXB0aW9uIG9uIGEgc2hvcnQgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU2VkZUtleVNwZWMobmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0fSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEludmFsaWRLZXlFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU2VkZUtleVNwZWMoKGJ5dGUgW10pIG51bGwsIDEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIE51bGxQb2ludGVyRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gY2FzZSBvZiBudWxsIGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gTnVsbFBvaW50ZXJFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjYXNlIG9mIG51bGwgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IERFU2VkZUtleVNwZWMobmV3IGJ5dGUgW10gIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0fSwgMSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gSW52YWxpZEtleUV4Y2VwdGlvbiBvbiBhIHNob3J0IGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBERVNlZGVLZXlTcGVjKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMywgNCwgNX0sIDEpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbnZhbGlkS2V5RXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRLZXkoKSBtZXRob2QgdGVzdGluZy4gQ2hlY2tzIHRoYXQgbW9kaWZpY2F0aW9uIG9mIHJldHVybmVkIGtleQorICAgICAqIGRvZXMgbm90IGFmZmVjdCB0aGUgaW50ZXJuYWwga2V5LiBBbHNvIHRlc3QgY2hlY2sgYW4gZXF1YWxpdHkgb2YKKyAgICAgKiB0aGUga2V5IHdpdGggdGhlIGtleSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBUaGUgb2JqZWN0IHVuZGVyIAorICAgICAqIHRoZSB0ZXN0IGlzIGNyZWF0ZWQgYnkgZGlmZmVyZW50IGNvbnN0cnVjdG9ycy4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0S2V5KCkgeworICAgICAgICBieXRlW10ga2V5ID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsIDEsIDIsCisgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMn07CisgICAgICAgIERFU2VkZUtleVNwZWMga3M7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrcyA9IG5ldyBERVNlZGVLZXlTcGVjKGtleSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSW52YWxpZEtleUV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93bi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gcmVzID0ga3MuZ2V0S2V5KCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBhcnJheSBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICsgImluIGNvbnN0cnVjdG9yLiIsIEFycmF5cy5lcXVhbHMoa2V5LCByZXMpKTsKKyAgICAgICAgcmVzWzBdICs9IDE7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgbW9kaWZpY2F0aW9uIG9mIHJldHVybmVkIGtleSBzaG91bGQgbm90IGFmZmVjdCIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhlIHVuZGVybHlpbmcga2V5LiIsIGtleVswXSA9PSByZXNbMF0pOworCisgICAgICAgIGJ5dGVbXSBrZXkxID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsIDEsIDIsIDN9OworICAgICAgICB0cnkgeworICAgICAgICAgICAga3MgPSBuZXcgREVTZWRlS2V5U3BlYyhrZXkxLCAyKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkS2V5RXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlcyA9IGtzLmdldEtleSgpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJUaGUgcmV0dXJuZWQgYXJyYXkgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSBvYmplY3QgIgorICAgICAgICAgICAgICAgICAgICArICJhcyBzcGVjaWZpZWQgaW4gYSBjb25zdHJ1Y3Rvci4iLCBrZXkxLCByZXMpOworICAgICAgICBieXRlW10gZXhwID0gbmV3IGJ5dGVbMjRdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGtleTEsIDIsIGV4cCwgMCwgMjQpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgYXJyYXkgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjb25zdHJ1Y3Rvci4iLCBBcnJheXMuZXF1YWxzKGV4cCwgcmVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaXNQYXJpdHlBZGp1c3RlZChieXRlW10ga2V5LCBvZmZzZXQpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiB0aGUKKyAgICAgKiBtZXRob2QgdGhyb3dzIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbnMgb24gaW5jb3JyZWN0IGJ5dGUgYXJyYXksIGlmCisgICAgICogaXQgcmV0dXJucyBmYWxzZSBvbiB0aGUga2V5IHdoaWNoIGlzIG5vdCBwYXJpdHkgYWRqdXN0ZWQsIGFuZCBpZgorICAgICAqIGl0IHJldHVybnMgdHJ1ZSBvbiBwYXJpdHkgYWRqdXN0ZWQga2V5LgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUGFyaXR5QWRqdXN0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1Bhcml0eUFkanVzdGVkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgREVTZWRlS2V5U3BlYy5pc1Bhcml0eUFkanVzdGVkKG51bGwsIDEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIE51bGxQb2ludGVyRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gY2FzZSBvZiBudWxsIGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gTnVsbFBvaW50ZXJFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjYXNlIG9mIG51bGwgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBrZXkgPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwfTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERFU2VkZUtleVNwZWMuaXNQYXJpdHlBZGp1c3RlZChrZXksIDEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIEludmFsaWRLZXlFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiBjYXNlIG9mIHNob3J0IGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10ga2V5X25vdF9wYSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyfTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJNZXRob2QgcmV0dXJucyB0cnVlIHdoZW4gZmFsc2UgaXMgZXhwZWN0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFU2VkZUtleVNwZWMuaXNQYXJpdHlBZGp1c3RlZChrZXlfbm90X3BhLCAwKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEludmFsaWRLZXlFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBrZXlfcGEgPSB7KGJ5dGUpIDEyOCwgKGJ5dGUpIDEzMSwgKGJ5dGUpIDEzMywgKGJ5dGUpIDEzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMTM3LCAoYnl0ZSkgMTM4LCAoYnl0ZSkgMTQwLCAoYnl0ZSkgMTQzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAxNDUsIChieXRlKSAxNDYsIChieXRlKSAxNDgsIChieXRlKSAxNTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDE1MiwgKGJ5dGUpIDE1NSwgKGJ5dGUpIDE1NywgKGJ5dGUpIDE1OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMTYxLCAoYnl0ZSkgMTYyLCAoYnl0ZSkgMTY0LCAoYnl0ZSkgMTY3LAorICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAxNjgsIChieXRlKSAxNzEsIChieXRlKSAxNzMsIChieXRlKSAxNzR9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTWV0aG9kIHJldHVybnMgZmFsc2Ugd2hlbiB0cnVlIGlzIGV4cGVjdGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBERVNlZGVLZXlTcGVjLmlzUGFyaXR5QWRqdXN0ZWQoa2V5X3BhLCAwKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEludmFsaWRLZXlFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoREVTZWRlS2V5U3BlY1Rlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9ESEdlblBhcmFtZXRlclNwZWNUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL0RIR2VuUGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjM3OWMzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9ESEdlblBhcmFtZXRlclNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkRIR2VuUGFyYW1ldGVyU3BlYzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitAVGVzdFRhcmdldENsYXNzKERIR2VuUGFyYW1ldGVyU3BlYy5jbGFzcykKKy8qKgorICovCisKK3B1YmxpYyBjbGFzcyBESEdlblBhcmFtZXRlclNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogREhHZW5QYXJhbWV0ZXJTcGVjIGNsYXNzIHRlc3RpbmcuIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZgorICAgICAqIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSB2YWx1ZXMgcmV0dXJuZWQKKyAgICAgKiBieSBnZXR0ZXJzLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFsbCBmdW5jdGlvbmFsaXR5IHRlc3RlZCBpbiBvbmUgbWV0aG9kLiBQcm9iYWJseSBpdCBzaG91bGQgYmUgZGl2aWRlZCBpbnRvIHNldmVyYWwgdGVzdHMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiREhHZW5QYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEV4cG9uZW50U2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbWVTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERIR2VuUGFyYW1ldGVyU3BlYygpIHsKKyAgICAgICAgaW50W10gcHJpbWVzID0ge0ludGVnZXIuTUlOX1ZBTFVFLCAtMSwgMCwgMSwgSW50ZWdlci5NQVhfVkFMVUV9OworICAgICAgICBpbnRbXSBleHBvbmVudHMgPSB7SW50ZWdlci5NSU5fVkFMVUUsIC0xLCAwLCAxLCBJbnRlZ2VyLk1BWF9WQUxVRX07CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxwcmltZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIERIR2VuUGFyYW1ldGVyU3BlYyBwcyA9IG5ldyBESEdlblBhcmFtZXRlclNwZWMocHJpbWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb25lbnRzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFByaW1lU2l6ZSgpIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgcHMuZ2V0UHJpbWVTaXplKCksIHByaW1lc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB2YWx1ZSByZXR1cm5lZCBieSBnZXRFeHBvbmVudFNpemUoKSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzLmdldFByaW1lU2l6ZSgpLCBleHBvbmVudHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShESEdlblBhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvREhQYXJhbWV0ZXJTcGVjVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9ESFBhcmFtZXRlclNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmZDM0MAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvREhQYXJhbWV0ZXJTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEubGFuZy5JbnRlZ2VyOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREhQYXJhbWV0ZXJTcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoREhQYXJhbWV0ZXJTcGVjLmNsYXNzKQorLyoqCisgKi8KKworcHVibGljIGNsYXNzIERIUGFyYW1ldGVyU3BlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBESFBhcmFtZXRlclNwZWMgY2xhc3MgdGVzdGluZy4gVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIHBhcmFtZXRlcnMKKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpdGggdGhlIHZhbHVlcyByZXR1cm5lZCBieSBnZXR0ZXJzLgorICAgICAqIFRoZSB0ZXN0ZWQgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgZGlmZmVyZW50IGNvbnN0cnVjdG9ycy4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJBbGwgZnVuY3Rpb25hbGl0eSB0ZXN0ZWQgaW4gb25lIG1ldGhvZC4gUHJvYmFibHkgaXQgc2hvdWxkIGJlIGRpdmlkZWQgaW50byBzZXZlcmFsIHRlc3RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRIUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiREhQYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0REhQYXJhbWV0ZXJTcGVjKCkgeworICAgICAgICBCaWdJbnRlZ2VyW10gcHMgPSB7bmV3IEJpZ0ludGVnZXIoIi0xMDAwMDAwMDAwMDAwIiksIEJpZ0ludGVnZXIuWkVSTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwgbmV3IEJpZ0ludGVnZXIoIjEwMDAwMDAwMDAwMDAiKX07CisgICAgICAgIEJpZ0ludGVnZXJbXSBncyA9IHtuZXcgQmlnSW50ZWdlcigiLTEwMDAwMDAwMDAwMDAiKSwgQmlnSW50ZWdlci5aRVJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLCBuZXcgQmlnSW50ZWdlcigiMTAwMDAwMDAwMDAwMCIpfTsKKyAgICAgICAgaW50W10gbHMgPSB7SW50ZWdlci5NSU5fVkFMVUUsIDAsIDEsIEludGVnZXIuTUFYX1ZBTFVFfTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBESFBhcmFtZXRlclNwZWMgZGhwcyA9IG5ldyBESFBhcmFtZXRlclNwZWMocHNbaV0sIGdzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFAoKSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRocHMuZ2V0UCgpLCBwc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB2YWx1ZSByZXR1cm5lZCBieSBnZXRHKCkgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJlcXVhbCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICBkaHBzLmdldEcoKSwgZ3NbaV0pOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgREhQYXJhbWV0ZXJTcGVjIGRocHMgPSBuZXcgREhQYXJhbWV0ZXJTcGVjKHBzW2ldLCBnc1tpXSwgbHNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0UCgpIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGhwcy5nZXRQKCksIHBzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldEcoKSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRocHMuZ2V0RygpLCBnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB2YWx1ZSByZXR1cm5lZCBieSBnZXRMKCkgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJlcXVhbCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICBkaHBzLmdldEwoKSwgbHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShESFBhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvREhQcml2YXRlS2V5U3BlY1Rlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvREhQcml2YXRlS2V5U3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODMwMzJlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9ESFByaXZhdGVLZXlTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5ESFByaXZhdGVLZXlTcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoREhQcml2YXRlS2V5U3BlYy5jbGFzcykKKy8qKgorICovCisKK3B1YmxpYyBjbGFzcyBESFByaXZhdGVLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIERIUHJpdmF0ZUtleVNwZWMgY2xhc3MgdGVzdGluZy4gVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIHBhcmFtZXRlcnMKKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpdGggdGhlIHZhbHVlcyByZXR1cm5lZCBieSBnZXR0ZXJzLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFsbCBmdW5jdGlvbmFsaXR5IHRlc3RlZCBpbiBvbmUgbWV0aG9kLiBQcm9iYWJseSBpdCBzaG91bGQgYmUgZGl2aWRlZCBpbnRvIHNldmVyYWwgdGVzdHMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiREhQcml2YXRlS2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0REhQcml2YXRlS2V5U3BlYygpIHsKKyAgICAgICAgQmlnSW50ZWdlcltdIHhzID0ge25ldyBCaWdJbnRlZ2VyKCItMTAwMDAwMDAwMDAwMCIpLCBCaWdJbnRlZ2VyLlpFUk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsIG5ldyBCaWdJbnRlZ2VyKCIxMDAwMDAwMDAwMDAwIil9OworICAgICAgICBCaWdJbnRlZ2VyW10gcHMgPSB7bmV3IEJpZ0ludGVnZXIoIi0xMDAwMDAwMDAwMDAwIiksIEJpZ0ludGVnZXIuWkVSTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwgbmV3IEJpZ0ludGVnZXIoIjEwMDAwMDAwMDAwMDAiKX07CisgICAgICAgIEJpZ0ludGVnZXJbXSBncyA9IHtuZXcgQmlnSW50ZWdlcigiLTEwMDAwMDAwMDAwMDAiKSwgQmlnSW50ZWdlci5aRVJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLCBuZXcgQmlnSW50ZWdlcigiMTAwMDAwMDAwMDAwMCIpfTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBESFByaXZhdGVLZXlTcGVjIGRocGtzID0gbmV3IERIUHJpdmF0ZUtleVNwZWMoeHNbaV0sIHBzW2ldLCBnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB2YWx1ZSByZXR1cm5lZCBieSBnZXRYKCkgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJlcXVhbCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICBkaHBrcy5nZXRYKCksIHhzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFAoKSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRocGtzLmdldFAoKSwgcHNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0RygpIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGhwa3MuZ2V0RygpLCBnc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKERIUHJpdmF0ZUtleVNwZWNUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvREhQdWJsaWNLZXlTcGVjVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9ESFB1YmxpY0tleVNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNGNkYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvREhQdWJsaWNLZXlTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5ESFB1YmxpY0tleVNwZWM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworQFRlc3RUYXJnZXRDbGFzcyhESFB1YmxpY0tleVNwZWMuY2xhc3MpCisvKioKKyAqLworCitwdWJsaWMgY2xhc3MgREhQdWJsaWNLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIERIUHVibGljS2V5U3BlYyBjbGFzcyB0ZXN0aW5nLiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgcGFyYW1ldGVycworICAgICAqIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3Igd2l0aCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGdldHRlcnMuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQWxsIGZ1bmN0aW9uYWxpdHkgdGVzdGVkIGluIG9uZSBtZXRob2QuIFByb2JhYmx5IGl0IHNob3VsZCBiZSBkaXZpZGVkIGludG8gc2V2ZXJhbCB0ZXN0cy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJESFB1YmxpY0tleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRZIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdERIUHJpdmF0ZUtleVNwZWMoKSB7CisgICAgICAgIEJpZ0ludGVnZXJbXSB5cyA9IHtuZXcgQmlnSW50ZWdlcigiLTEwMDAwMDAwMDAwMDAiKSwgQmlnSW50ZWdlci5aRVJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLCBuZXcgQmlnSW50ZWdlcigiMTAwMDAwMDAwMDAwMCIpfTsKKyAgICAgICAgQmlnSW50ZWdlcltdIHBzID0ge25ldyBCaWdJbnRlZ2VyKCItMTAwMDAwMDAwMDAwMCIpLCBCaWdJbnRlZ2VyLlpFUk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsIG5ldyBCaWdJbnRlZ2VyKCIxMDAwMDAwMDAwMDAwIil9OworICAgICAgICBCaWdJbnRlZ2VyW10gZ3MgPSB7bmV3IEJpZ0ludGVnZXIoIi0xMDAwMDAwMDAwMDAwIiksIEJpZ0ludGVnZXIuWkVSTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwgbmV3IEJpZ0ludGVnZXIoIjEwMDAwMDAwMDAwMDAiKX07CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgREhQdWJsaWNLZXlTcGVjIGRocGtzID0gbmV3IERIUHVibGljS2V5U3BlYyh5c1tpXSwgcHNbaV0sIGdzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFkoKSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRocGtzLmdldFkoKSwgeXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0UCgpIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGhwa3MuZ2V0UCgpLCBwc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB2YWx1ZSByZXR1cm5lZCBieSBnZXRHKCkgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJlcXVhbCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICBkaHBrcy5nZXRHKCksIGdzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoREhQdWJsaWNLZXlTcGVjVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL0l2UGFyYW1ldGVyU3BlY1Rlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvSXZQYXJhbWV0ZXJTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNWJlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL0l2UGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuSXZQYXJhbWV0ZXJTcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoSXZQYXJhbWV0ZXJTcGVjLmNsYXNzKQorLyoqCisgKi8KKworcHVibGljIGNsYXNzIEl2UGFyYW1ldGVyU3BlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBJdlBhcmFtZXRlclNwZWMoYnl0ZVtdIGl2KSBjb25zdHJ1Y3RvciB0ZXN0aW5nLiBDaGVja3MgdGhhdAorICAgICAqIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUgY2FzZSBvZiBudWxsIGlucHV0CisgICAgICogYXJyYXkgYW5kIHRoYXQgaW5wdXQgYXJyYXkgaXMgY29waWVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJdlBhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXZQYXJhbWV0ZXJTcGVjMSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBJdlBhcmFtZXRlclNwZWMobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gTnVsbFBvaW50ZXJFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGJ5dGUgYXJyYXkuIik7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGl2ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIEl2UGFyYW1ldGVyU3BlYyBpdnBzID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhpdik7CisgICAgICAgIGl2WzBdICsrOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNoYW5nZSBvZiBpbnB1dCBhcnJheSdzIGNvbnRlbnQgc2hvdWxkIG5vdCBjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICsgInRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkiLCBpdlswXSA9PSBpdnBzLmdldElWKClbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl2UGFyYW1ldGVyU3BlYyhieXRlW10gaXYpIGNvbnN0cnVjdG9yIHRlc3RpbmcuIENoZWNrcyB0aGF0CisgICAgICogTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBjYXNlIG9mIG51bGwgaW5wdXQKKyAgICAgKiBhcnJheSBhbmQgdGhhdCBpbnB1dCBhcnJheSBpcyBjb3BpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkl2UGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXZQYXJhbWV0ZXJTcGVjMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBJdlBhcmFtZXRlclNwZWMobnVsbCwgMSwgMSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgcmFpc2UgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBieXRlIGFycmF5LiIpOworICAgICAgICB9IGNhdGNoKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3YXMgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSXZQYXJhbWV0ZXJTcGVjKG5ldyBieXRlW10gezEsIDIsIDN9LCAyLCAyKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCByYWlzZSBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICArICJpZiAoaXYubGVuZ3RoIC0gb2Zmc2V0IDwgbGVuKS4iKTsKKyAgICAgICAgfSBjYXRjaChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2FzIHRocm93biIpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEl2UGFyYW1ldGVyU3BlYyhuZXcgYnl0ZVtdIHsxLCAyLCAzfSwgLTEsIDEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICsgImlmIG9mZnNldCBpbmRleCBieXRlcyBvdXRzaWRlIHRoZSBpdi4iKTsKKyAgICAgICAgfSBjYXRjaChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBUT0RPOiBEUkwgZmFpbCB3aXRoIGphdmEubGFuZy5OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEl2UGFyYW1ldGVyU3BlYyhuZXcgYnl0ZVtdIHsxLCAyLCAzfSwgMSwgLTIpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHJhaXNlIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICsgImlmIGxlbiBpbmRleCBieXRlcyBvdXRzaWRlIHRoZSBpdi4iKTsKKyAgICAgICAgfSBjYXRjaChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBieXRlW10gaXYgPSBuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgSXZQYXJhbWV0ZXJTcGVjIGl2cHMgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKGl2LCAwLCBpdi5sZW5ndGgpOworICAgICAgICBpdlswXSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2YgaW5wdXQgYXJyYXkncyBjb250ZW50IHNob3VsZCBub3QgY2F1c2UgIgorICAgICAgICAgICAgICAgICAgICArICJ0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5IiwgaXZbMF0gPT0gaXZwcy5nZXRJVigpWzBdKTsKKworICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTA4OQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEl2UGFyYW1ldGVyU3BlYyhuZXcgYnl0ZVsyXSwgMiwgIC0xKTsKKyAgICAgICAgICAgIGZhaWwoIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQorCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SVYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SVYoKSB7CisgICAgICAgIGJ5dGVbXSBpdiA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBJdlBhcmFtZXRlclNwZWMgaXZwcyA9IG5ldyBJdlBhcmFtZXRlclNwZWMoaXYpOworICAgICAgICBpdiA9IGl2cHMuZ2V0SVYoKTsKKyAgICAgICAgaXZbMF0gKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIHJldHVybmVkIGFycmF5IHNob3VsZCBub3QgY2F1c2UgIgorICAgICAgICAgICAgICAgICAgICArICJ0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5IiwgaXZbMF0gPT0gaXZwcy5nZXRJVigpWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEl2UGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9PQUVQUGFyYW1ldGVyU3BlY1Rlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvT0FFUFBhcmFtZXRlclNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlMzhjNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvT0FFUFBhcmFtZXRlclNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLk1HRjFQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuT0FFUFBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUFNvdXJjZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitAVGVzdFRhcmdldENsYXNzKE9BRVBQYXJhbWV0ZXJTcGVjLmNsYXNzKQorLyoqCisgKi8KKworcHVibGljIGNsYXNzIE9BRVBQYXJhbWV0ZXJTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIE9BRVBQYXJhbWV0ZXJTcGVjKFN0cmluZyBtZE5hbWUsIFN0cmluZyBtZ2ZOYW1lLCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjCisgICAgICogbWdmU3BlYywgUFNvdXJjZSBwU3JjKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqIGlzIHRocm93biBpbiB0aGUgY2FzZSBvZiBpbmFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgYW5kIGNoZWNrcworICAgICAqIHRoZSB2YWx1ZSBvZiBERUZBVUxUIGZpZWxkLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk9BRVBQYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzLCBqYXZheC5jcnlwdG8uc3BlYy5QU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T0FFUFBhcmFtZXRlclNwZWMoKSB7CisgICAgICAgIC8vIHVzaW5nIGluaXQgdmFsdWVzIGZvciBPQUVQUGFyYW1ldGVyU3BlYy5ERUZBVUxUCisgICAgICAgIFN0cmluZyBtZE5hbWUgPSAiU0hBLTEiOworICAgICAgICBTdHJpbmcgbWdmTmFtZSA9ICJNR0YxIjsKKyAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBtZ2ZTcGVjID0gTUdGMVBhcmFtZXRlclNwZWMuU0hBMTsKKyAgICAgICAgUFNvdXJjZSBwU3JjID0gUFNvdXJjZS5QU3BlY2lmaWVkLkRFRkFVTFQ7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPQUVQUGFyYW1ldGVyU3BlYyhudWxsLCBtZ2ZOYW1lLCBtZ2ZTcGVjLCBwU3JjKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgIgorICAgICAgICAgICAgICAgICAgICArICJudWxsIG1kTmFtZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPQUVQUGFyYW1ldGVyU3BlYyhtZE5hbWUsIG51bGwsIG1nZlNwZWMsIHBTcmMpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpbiB0aGUgY2FzZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgIm51bGwgbWdmTmFtZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPQUVQUGFyYW1ldGVyU3BlYyhtZE5hbWUsIG1nZk5hbWUsIG1nZlNwZWMsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpbiB0aGUgY2FzZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgIm51bGwgcFNyYy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBuYW1lIG9mICIKKyAgICAgICAgICAgICAgICArICJPQUVQUGFyYW1ldGVyU3BlYy5ERUZBVUxUIGZpZWxkIHNob3VsZCBiZSAiICsgbWROYW1lLAorICAgICAgICAgICAgICAgIE9BRVBQYXJhbWV0ZXJTcGVjLkRFRkFVTFQuZ2V0RGlnZXN0QWxnb3JpdGhtKCkuZXF1YWxzKG1kTmFtZSkpOworCisgICAgICAgIGFzc2VydFRydWUoIlRoZSBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gYWxnb3JpdGhtIG5hbWUgb2YgIgorICAgICAgICAgICAgICAgICsgIk9BRVBQYXJhbWV0ZXJTcGVjLkRFRkFVTFQgZmllbGQgc2hvdWxkIGJlICIgKyBtZ2ZOYW1lLAorICAgICAgICAgICAgICAgIE9BRVBQYXJhbWV0ZXJTcGVjLkRFRkFVTFQuZ2V0TUdGQWxnb3JpdGhtKCkuZXF1YWxzKG1nZk5hbWUpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIHBhcmFtZXRlcnMgb2YgIgorICAgICAgICAgICAgICAgICsgIk9BRVBQYXJhbWV0ZXJTcGVjLkRFRkFVTFQgZmllbGQgc2hvdWxkIGJlIHRoZSBzYW1lIG9iamVjdCAiCisgICAgICAgICAgICAgICAgKyAiYXMgTUdGMVBhcmFtZXRlclNwZWMuU0hBMSIsCisgICAgICAgICAgICAgICAgT0FFUFBhcmFtZXRlclNwZWMuREVGQVVMVC5nZXRNR0ZQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNR0YxUGFyYW1ldGVyU3BlYy5TSEExKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHNvdXJjZSBvZiB0aGUgZW5jb2RpbmcgaW5wdXQgUCBvZiAiCisgICAgICAgICAgICAgICAgKyAiT0FFUFBhcmFtZXRlclNwZWMuREVGQVVMVCBmaWVsZCBzaG91bGQgYmUgdGhlIHNhbWUgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICArICJQU291cmNlLlBTcGVjaWZpZWQuREVGQVVMVCIsCisgICAgICAgICAgICAgICAgT0FFUFBhcmFtZXRlclNwZWMuREVGQVVMVC5nZXRQU291cmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFBTb3VyY2UuUFNwZWNpZmllZC5ERUZBVUxUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXREaWdlc3RBbGdvcml0aG0oKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREaWdlc3RBbGdvcml0aG0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGlnZXN0QWxnb3JpdGhtKCkgeworICAgICAgICBTdHJpbmcgbWROYW1lID0gIlNIQS0xIjsKKyAgICAgICAgU3RyaW5nIG1nZk5hbWUgPSAiTUdGMSI7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgbWdmU3BlYyA9IE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTE7CisgICAgICAgIFBTb3VyY2UgcFNyYyA9IFBTb3VyY2UuUFNwZWNpZmllZC5ERUZBVUxUOworCisgICAgICAgIE9BRVBQYXJhbWV0ZXJTcGVjIHBzID0gbmV3IE9BRVBQYXJhbWV0ZXJTcGVjKG1kTmFtZSwgbWdmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ2ZTcGVjLCBwU3JjKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHZhbHVlIGRvZXMgbm90IGVxdWFsIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgKyAidmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgICAgIHBzLmdldERpZ2VzdEFsZ29yaXRobSgpLmVxdWFscyhtZE5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRNR0ZBbGdvcml0aG0oKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNR0ZBbGdvcml0aG0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TUdGQWxnb3JpdGhtKCkgeworICAgICAgICBTdHJpbmcgbWROYW1lID0gIlNIQS0xIjsKKyAgICAgICAgU3RyaW5nIG1nZk5hbWUgPSAiTUdGMSI7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgbWdmU3BlYyA9IE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTE7CisgICAgICAgIFBTb3VyY2UgcFNyYyA9IFBTb3VyY2UuUFNwZWNpZmllZC5ERUZBVUxUOworCisgICAgICAgIE9BRVBQYXJhbWV0ZXJTcGVjIHBzID0gbmV3IE9BRVBQYXJhbWV0ZXJTcGVjKG1kTmFtZSwgbWdmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ2ZTcGVjLCBwU3JjKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHZhbHVlIGRvZXMgbm90IGVxdWFsIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgKyAidmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgICAgIHBzLmdldE1HRkFsZ29yaXRobSgpLmVxdWFscyhtZ2ZOYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0TUdGUGFyYW1ldGVycygpIG1ldGhvZCB0ZXN0aW5nLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1HRlBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TUdGUGFyYW1ldGVycygpIHsKKyAgICAgICAgU3RyaW5nIG1kTmFtZSA9ICJTSEEtMSI7CisgICAgICAgIFN0cmluZyBtZ2ZOYW1lID0gIk1HRjEiOworICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIG1nZlNwZWMgPSBNR0YxUGFyYW1ldGVyU3BlYy5TSEExOworICAgICAgICBQU291cmNlIHBTcmMgPSBQU291cmNlLlBTcGVjaWZpZWQuREVGQVVMVDsKKworICAgICAgICBPQUVQUGFyYW1ldGVyU3BlYyBwcyA9IG5ldyBPQUVQUGFyYW1ldGVyU3BlYyhtZE5hbWUsIG1nZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdmU3BlYywgcFNyYyk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCB2YWx1ZSBkb2VzIG5vdCBlcXVhbCB0byB0aGUgIgorICAgICAgICAgICAgICAgICsgInZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgICAgICBwcy5nZXRNR0ZQYXJhbWV0ZXJzKCkgPT0gbWdmU3BlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0UFNvdXJjZSgpIG1ldGhvZCB0ZXN0aW5nLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBTb3VyY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UFNvdXJjZSgpIHsKKyAgICAgICAgU3RyaW5nIG1kTmFtZSA9ICJTSEEtMSI7CisgICAgICAgIFN0cmluZyBtZ2ZOYW1lID0gIk1HRjEiOworICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIG1nZlNwZWMgPSBNR0YxUGFyYW1ldGVyU3BlYy5TSEExOworICAgICAgICBQU291cmNlIHBTcmMgPSBQU291cmNlLlBTcGVjaWZpZWQuREVGQVVMVDsKKworICAgICAgICBPQUVQUGFyYW1ldGVyU3BlYyBwcyA9IG5ldyBPQUVQUGFyYW1ldGVyU3BlYyhtZE5hbWUsIG1nZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdmU3BlYywgcFNyYyk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCB2YWx1ZSBkb2VzIG5vdCBlcXVhbCB0byB0aGUgIgorICAgICAgICAgICAgICAgICsgInZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgICAgICBwcy5nZXRQU291cmNlKCkgPT0gcFNyYyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShPQUVQUGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9QQkVLZXlTcGVjVGVzdC5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9QQkVLZXlTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmE3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1BCRUtleVNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlBCRUtleVNwZWM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworQFRlc3RUYXJnZXRDbGFzcyhQQkVLZXlTcGVjLmNsYXNzKQorLyoqCisgKi8KKworcHVibGljIGNsYXNzIFBCRUtleVNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogUEJFS2V5U3BlYyhjaGFyW10gcGFzc3dvcmQpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGUgYmVoYXZpb3Igb2YKKyAgICAgKiB0aGUgbWV0aG9kIGluIHRoZSBjYXNlIG9mIG51bGwgaW5wdXQgY2hhciBhcnJheSBhbmQgdGVzdHMgdGhhdCBpbnB1dAorICAgICAqIGFycmF5IGlzIGNvcGllZCBkdXJpbmcgdGhlIG9iamVjdCBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQQkVLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFBCRUtleVNwZWMxKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUEJFS2V5U3BlYyBwYmVrcyA9IG5ldyBQQkVLZXlTcGVjKG51bGwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW4gZW1wdHkgY2hhcltdIHNob3VsZCBiZSB1c2VkIGluIGNhc2Ugb2YgbnVsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJjaGFyIGFycmF5LiIsIHBiZWtzLmdldFBhc3N3b3JkKCkubGVuZ3RoID09IDApOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gcGFzc3dvcmQgPSBuZXcgY2hhcltdIHsnMScsICcyJywgJzMnLCAnNCcsICc1J307CisgICAgICAgIFBCRUtleVNwZWMgcGJla3MgPSBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCk7CisgICAgICAgIHBhc3N3b3JkWzBdICsrOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNoYW5nZSBvZiBwYXNzd29yZCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkWzBdID09IHBiZWtzLmdldFBhc3N3b3JkKClbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBCRUtleVNwZWMoY2hhcltdIHBhc3N3b3JkLCBieXRlW10gc2FsdCwgaW50IGl0ZXJhdGlvbkNvdW50LCBpbnQKKyAgICAgKiBrZXlMZW5ndGgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIG1ldGhvZCBpbiB0aGUgY2FzZQorICAgICAqIG9mIGluYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBhbmQgY2hlY2tzIHRoYXQgYXJyYXkgb2JqZWN0cyBzcGVjaWZpZWQgYXMKKyAgICAgKiBhIHBhcmFtZXRlcnMgYXJlIGNvcGllZCBkdXJpbmcgdGhlIG9iamVjdCBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQQkVLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFBCRUtleVNwZWMyKCkgeworICAgICAgICBjaGFyW10gcGFzc3dvcmQgPSBuZXcgY2hhcltdIHsnMScsICcyJywgJzMnLCAnNCcsICc1J307CisgICAgICAgIGJ5dGVbXSBzYWx0ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIGludCBpdGVyYXRpb25Db3VudCA9IDEwOworICAgICAgICBpbnQga2V5TGVuZ3RoID0gMTA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBCRUtleVNwZWMgcGJla3MgPSBuZXcgUEJFS2V5U3BlYyhudWxsLCBzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQsIGtleUxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBbiBlbXB0eSBjaGFyW10gc2hvdWxkIGJlIHVzZWQgaW4gY2FzZSBvZiBudWxsIGlucHV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImNoYXIgYXJyYXkuIiwgcGJla3MuZ2V0UGFzc3dvcmQoKS5sZW5ndGggPT0gMCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBCRUtleVNwZWMocGFzc3dvcmQsIG51bGwsIGl0ZXJhdGlvbkNvdW50LCBrZXlMZW5ndGgpOworICAgICAgICAgICAgZmFpbCgiQSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgd2FzIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgc2FsdC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCwgbmV3IGJ5dGUgWzBdLCBpdGVyYXRpb25Db3VudCwga2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc2FsdC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCwgc2FsdCwgLTEsIGtleUxlbmd0aCk7CisgICAgICAgICAgICBmYWlsKCJBbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG5lZ2F0aXZlIGl0ZXJhdGlvbkNvdW50LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBQQkVLZXlTcGVjKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25Db3VudCwgLTEpOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBuZWdhdGl2ZSBrZXlMZW5ndGguIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBCRUtleVNwZWMocGFzc3dvcmQsIHNhbHQsIDAsIGtleUxlbmd0aCk7CisgICAgICAgICAgICBmYWlsKCJBbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIHplcm8gaXRlcmF0aW9uQ291bnQuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBCRUtleVNwZWMocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbkNvdW50LCAwKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgemVybyBrZXlMZW5ndGguIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBQQkVLZXlTcGVjIHBiZWtzID0gbmV3IFBCRUtleVNwZWMocGFzc3dvcmQsIHNhbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25Db3VudCwga2V5TGVuZ3RoKTsKKyAgICAgICAgcGFzc3dvcmRbMF0gKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIHBhc3N3b3JkIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgIgorICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IGNhdXNlIHRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRbMF0gPT0gcGJla3MuZ2V0UGFzc3dvcmQoKVswXSk7CisgICAgICAgIHNhbHRbMF0gKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIHNhbHQgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciAiCisgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgbm90IGNhdXNlIHRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAgc2FsdFswXSA9PSBwYmVrcy5nZXRTYWx0KClbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBCRUtleVNwZWMoY2hhcltdIHBhc3N3b3JkLCBieXRlW10gc2FsdCwgaW50IGl0ZXJhdGlvbkNvdW50KSBtZXRob2QKKyAgICAgKiB0ZXN0aW5nLiBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIG1ldGhvZCBpbiB0aGUgY2FzZQorICAgICAqIG9mIGluYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBhbmQgY2hlY2tzIHRoYXQgYXJyYXkgb2JqZWN0cyBzcGVjaWZpZWQgYXMKKyAgICAgKiBhIHBhcmFtZXRlcnMgYXJlIGNvcGllZCBkdXJpbmcgdGhlIG9iamVjdCBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQQkVLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RQQkVLZXlTcGVjMygpIHsKKyAgICAgICAgY2hhcltdIHBhc3N3b3JkID0gbmV3IGNoYXJbXSB7JzEnLCAnMicsICczJywgJzQnLCAnNSd9OworICAgICAgICBieXRlW10gc2FsdCA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBpbnQgaXRlcmF0aW9uQ291bnQgPSAxMDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUEJFS2V5U3BlYyBwYmVrcyA9IG5ldyBQQkVLZXlTcGVjKG51bGwsIHNhbHQsIGl0ZXJhdGlvbkNvdW50KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFuIGVtcHR5IGNoYXJbXSBzaG91bGQgYmUgdXNlZCBpbiBjYXNlIG9mIG51bGwgaW5wdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2hhciBhcnJheS4iLCBwYmVrcy5nZXRQYXNzd29yZCgpLmxlbmd0aCA9PSAwKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCwgbnVsbCwgaXRlcmF0aW9uQ291bnQpOworICAgICAgICAgICAgZmFpbCgiQSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgd2FzIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgc2FsdC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCwgbmV3IGJ5dGUgWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQpOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBlbXB0eSBzYWx0LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBQQkVLZXlTcGVjKHBhc3N3b3JkLCBzYWx0LCAtMSk7CisgICAgICAgICAgICBmYWlsKCJBbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG5lZ2F0aXZlIGl0ZXJhdGlvbkNvdW50LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBQQkVLZXlTcGVjKHBhc3N3b3JkLCBzYWx0LCAwKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgemVybyBpdGVyYXRpb25Db3VudC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIFBCRUtleVNwZWMgcGJla3MgPSBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCwgc2FsdCwgaXRlcmF0aW9uQ291bnQpOworICAgICAgICBwYXNzd29yZFswXSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2YgcGFzc3dvcmQgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciAiCisgICAgICAgICAgICAgICAgICAgICsgInNob3VsZCBub3QgY2F1c2UgdGhlIGNoYW5nZSBvZiBpbnRlcm5hbCBhcnJheS4iLAorICAgICAgICAgICAgICAgICAgICBwYXNzd29yZFswXSA9PSBwYmVrcy5nZXRQYXNzd29yZCgpWzBdKTsKKyAgICAgICAgc2FsdFswXSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2Ygc2FsdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNob3VsZCBub3QgY2F1c2UgdGhlIGNoYW5nZSBvZiBpbnRlcm5hbCBhcnJheS4iLAorICAgICAgICAgICAgICAgICAgICBzYWx0WzBdID09IHBiZWtzLmdldFNhbHQoKVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xlYXJQYXNzd29yZCgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IGludGVybmFsIGNvcHkgb2YgcGFzc3dvcmQKKyAgICAgKiBpcyBjbGVhcmVkIGFmdGVyIHRoZSBtZXRob2QgY2FsbC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhclBhc3N3b3JkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyUGFzc3dvcmQoKSB7CisgICAgICAgIGNoYXJbXSBwYXNzd29yZCA9IG5ldyBjaGFyW10geycxJywgJzInLCAnMycsICc0JywgJzUnfTsKKyAgICAgICAgUEJFS2V5U3BlYyBwYmVrcyA9IG5ldyBQQkVLZXlTcGVjKHBhc3N3b3JkKTsKKyAgICAgICAgcGJla3MuY2xlYXJQYXNzd29yZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGJla3MuZ2V0UGFzc3dvcmQoKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBzaG91bGQgYmUgd2FzIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImFmdGVyIHRoZSBjbGVhcmluZyB0aGUgcGFzc3dvcmQuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRQYXNzd29yZCgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIHBhc3N3b3JkIGlzIGVxdWFsCisgICAgICogdG8gdGhlIHBhc3N3b3JkIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgYW5kIHRoYXQgdGhlIGNoYW5nZSBvZgorICAgICAqIHJldHVybmVkIGFycmF5IGRvZXMgbm90IGNhdXNlIHRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9uIHdhcyBjaGVja2VkIGluIHRlc3RDbGVhclBhc3N3b3JkKCkgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhc3N3b3JkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhc3N3b3JkKCkgeworICAgICAgICBjaGFyW10gcGFzc3dvcmQgPSBuZXcgY2hhcltdIHsnMScsICcyJywgJzMnLCAnNCcsICc1J307CisgICAgICAgIFBCRUtleVNwZWMgcGJla3MgPSBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCk7CisgICAgICAgIGNoYXJbXSByZXN1bHQgPSBwYmVrcy5nZXRQYXNzd29yZCgpOworICAgICAgICBpZiAoISBBcnJheXMuZXF1YWxzKHBhc3N3b3JkLCByZXN1bHQpKSB7CisgICAgICAgICAgICBmYWlsKCJUaGUgcmV0dXJuZWQgcGFzc3dvcmQgaXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY29uc3RydWN0b3IuIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0WzBdICsrOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNoYW5nZSBvZiByZXR1cm5lZCBieSBnZXRQYXNzd29yZCgpIG1ldGhvZCBwYXNzd29yZCAiCisgICAgICAgICAgICAgICAgICAgICsgInNob3VsZCBub3QgY2F1c2UgdGhlIGNoYW5nZSBvZiBpbnRlcm5hbCBhcnJheS4iLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPT0gcGJla3MuZ2V0UGFzc3dvcmQoKVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0U2FsdCgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIHNhbHQgaXMgZXF1YWwKKyAgICAgKiB0byB0aGUgc2FsdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGF0IHRoZSBjaGFuZ2Ugb2YKKyAgICAgKiByZXR1cm5lZCBhcnJheSBkb2VzIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LgorICAgICAqIEFsc28gaXQgY2hlY2tzIHRoYXQgdGhlIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgc2FsdCBpcyBub3QKKyAgICAgKiBzcGVjaWZpZWQuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2FsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTYWx0KCkgeworICAgICAgICBjaGFyW10gcGFzc3dvcmQgPSBuZXcgY2hhcltdIHsnMScsICcyJywgJzMnLCAnNCcsICc1J307CisgICAgICAgIGJ5dGVbXSBzYWx0ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIGludCBpdGVyYXRpb25Db3VudCA9IDEwOworICAgICAgICBQQkVLZXlTcGVjIHBiZWtzID0gbmV3IFBCRUtleVNwZWMocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbkNvdW50KTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHBiZWtzLmdldFNhbHQoKTsKKyAgICAgICAgaWYgKCEgQXJyYXlzLmVxdWFscyhzYWx0LCByZXN1bHQpKSB7CisgICAgICAgICAgICBmYWlsKCJUaGUgcmV0dXJuZWQgc2FsdCBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjb25zdHJ1Y3Rvci4iKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHRbMF0gKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIHJldHVybmVkIGJ5IGdldFNhbHQoKSBtZXRob2Qgc2FsdCIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9PSBwYmVrcy5nZXRTYWx0KClbMF0pOworICAgICAgICBwYmVrcyA9IG5ldyBQQkVLZXlTcGVjKHBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIGdldFNhbHQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiBudWxsIGlmIHRoZSBzYWx0ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm90IHNwZWNpZmllZC4iLCBwYmVrcy5nZXRTYWx0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEl0ZXJhdGlvbkNvdW50KCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgcmV0dXJuZWQgdmFsdWUgaXMgZXF1YWwKKyAgICAgKiB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBBbHNvIGl0IGNoZWNrcyB0aGF0IHRoZSBtZXRob2QgcmV0dXJucyAwIGlmIGl0ZXJhdGlvbkNvdW50IGlzIG5vdAorICAgICAqIHNwZWNpZmllZC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJdGVyYXRpb25Db3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJdGVyYXRpb25Db3VudCgpIHsKKyAgICAgICAgY2hhcltdIHBhc3N3b3JkID0gbmV3IGNoYXJbXSB7JzEnLCAnMicsICczJywgJzQnLCAnNSd9OworICAgICAgICBieXRlW10gc2FsdCA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBpbnQgaXRlcmF0aW9uQ291bnQgPSAxMDsKKyAgICAgICAgUEJFS2V5U3BlYyBwYmVrcyA9IG5ldyBQQkVLZXlTcGVjKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25Db3VudCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBpdGVyYXRpb25Db3VudCBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICAgICAgcGJla3MuZ2V0SXRlcmF0aW9uQ291bnQoKSA9PSBpdGVyYXRpb25Db3VudCk7CisgICAgICAgIHBiZWtzID0gbmV3IFBCRUtleVNwZWMocGFzc3dvcmQpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZ2V0SXRlcmF0aW9uQ291bnQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiAwICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaWYgdGhlIGl0ZXJhdGlvbkNvdW50IGlzIG5vdCBzcGVjaWZpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgcGJla3MuZ2V0SXRlcmF0aW9uQ291bnQoKSA9PSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRLZXlMZW5ndGgoKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRLZXlMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0S2V5TGVuZ3RoKCkgeworICAgICAgICBjaGFyW10gcGFzc3dvcmQgPSBuZXcgY2hhcltdIHsnMScsICcyJywgJzMnLCAnNCcsICc1J307CisgICAgICAgIGJ5dGVbXSBzYWx0ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIGludCBpdGVyYXRpb25Db3VudCA9IDEwOworICAgICAgICBpbnQga2V5TGVuZ3RoID0gMTA7CisgICAgICAgIFBCRUtleVNwZWMgcGJla3MgPSBuZXcgUEJFS2V5U3BlYyhwYXNzd29yZCwgc2FsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbkNvdW50LCBrZXlMZW5ndGgpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQga2V5TGVuZ3RoIGlzIG5vdCBlcXVhbCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkICIKKyAgICAgICAgICAgICAgICArICJpbiB0aGUgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgICAgICBwYmVrcy5nZXRLZXlMZW5ndGgoKSA9PSBrZXlMZW5ndGgpOworICAgICAgICBwYmVrcyA9IG5ldyBQQkVLZXlTcGVjKHBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGdldEtleUxlbmd0aCgpIG1ldGhvZCBzaG91bGQgcmV0dXJuIDAgIgorICAgICAgICAgICAgICAgICAgICArICJpZiB0aGUga2V5TGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgcGJla3MuZ2V0S2V5TGVuZ3RoKCkgPT0gMCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQQkVLZXlTcGVjVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1BCRVBhcmFtZXRlclNwZWNUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1BCRVBhcmFtZXRlclNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyN2QxMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvUEJFUGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUEJFUGFyYW1ldGVyU3BlYzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitAVGVzdFRhcmdldENsYXNzKFBCRVBhcmFtZXRlclNwZWMuY2xhc3MpCisvKioKKyAqLworCitwdWJsaWMgY2xhc3MgUEJFUGFyYW1ldGVyU3BlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBQQkVQYXJhbWV0ZXJTcGVjKGJ5dGVbXSBzYWx0LCBpbnQgaXRlcmF0aW9uQ291bnQpIG1ldGhvZCB0ZXN0aW5nLgorICAgICAqIFRlc3RzIHRoZSBiZWhhdmlvciBvZiB0aGUgbWV0aG9kIGluIHRoZSBjYXNlIG9mIG51bGwgaW5wdXQgYXJyYXkKKyAgICAgKiBhbmQgdGVzdHMgdGhhdCBpbnB1dCBhcnJheSBpcyBjb3BpZWQgZHVyaW5nIHRoZSBvYmplY3QgaW5pdGlhbGl6YXRpb24uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEJFUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFBCRVBhcmFtZXRlclNwZWMoKSB7CisgICAgICAgIGJ5dGVbXSBzYWx0ID0gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBpbnQgaXRlcmF0aW9uQ291bnQgPSAxMDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBCRVBhcmFtZXRlclNwZWMobnVsbCwgaXRlcmF0aW9uQ291bnQpOworICAgICAgICAgICAgZmFpbCgiQSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgd2FzIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgc2FsdC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgUEJFUGFyYW1ldGVyU3BlYyBwYmVwcyA9IG5ldyBQQkVQYXJhbWV0ZXJTcGVjKHNhbHQsIGl0ZXJhdGlvbkNvdW50KTsKKyAgICAgICAgc2FsdFswXSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2Ygc2FsdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgIHNhbHRbMF0gPT0gcGJlcHMuZ2V0U2FsdCgpWzBdKTsKKyAgIH0KKworICAgIC8qKgorICAgICAqIGdldFNhbHQoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCByZXR1cm5lZCBzYWx0IGlzIGVxdWFsCisgICAgICogdG8gdGhlIHNhbHQgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgdGhhdCB0aGUgY2hhbmdlIG9mCisgICAgICogcmV0dXJuZWQgYXJyYXkgZG9lcyBub3QgY2F1c2UgdGhlIGNoYW5nZSBvZiBpbnRlcm5hbCBhcnJheS4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTYWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNhbHQoKSB7CisgICAgICAgIGJ5dGVbXSBzYWx0ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIGludCBpdGVyYXRpb25Db3VudCA9IDEwOworICAgICAgICBQQkVQYXJhbWV0ZXJTcGVjIHBiZXBzID0gbmV3IFBCRVBhcmFtZXRlclNwZWMoc2FsdCwgaXRlcmF0aW9uQ291bnQpOworICAgICAgICBieXRlW10gcmVzdWx0ID0gcGJlcHMuZ2V0U2FsdCgpOworICAgICAgICBpZiAoISBBcnJheXMuZXF1YWxzKHNhbHQsIHJlc3VsdCkpIHsKKyAgICAgICAgICAgIGZhaWwoIlRoZSByZXR1cm5lZCBzYWx0IGlzIG5vdCBlcXVhbCB0byB0aGUgc3BlY2lmaWVkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNvbnN0cnVjdG9yLiIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdFswXSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2YgcmV0dXJuZWQgYnkgZ2V0U2FsdCgpIG1ldGhvZCBzYWx0IgorICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IGNhdXNlIHRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdID09IHBiZXBzLmdldFNhbHQoKVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0SXRlcmF0aW9uQ291bnQoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCByZXR1cm5lZCB2YWx1ZSBpcyBlcXVhbAorICAgICAqIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEl0ZXJhdGlvbkNvdW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdGlvbkNvdW50KCkgeworICAgICAgICBieXRlW10gc2FsdCA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBpbnQgaXRlcmF0aW9uQ291bnQgPSAxMDsKKyAgICAgICAgUEJFUGFyYW1ldGVyU3BlYyBwYmVwcyA9IG5ldyBQQkVQYXJhbWV0ZXJTcGVjKHNhbHQsIGl0ZXJhdGlvbkNvdW50KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGl0ZXJhdGlvbkNvdW50IGlzIG5vdCBlcXVhbCB0byB0aGUgc3BlY2lmaWVkICIKKyAgICAgICAgICAgICAgICArICJpbiB0aGUgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgICAgICBwYmVwcy5nZXRJdGVyYXRpb25Db3VudCgpID09IGl0ZXJhdGlvbkNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFBCRVBhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvUFNvdXJjZVRlc3QuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvUFNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzEzY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc3BlYy9QU291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUFNvdXJjZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitAVGVzdFRhcmdldENsYXNzKFBTb3VyY2UuY2xhc3MpCisvKioKKyAqLworcHVibGljIGNsYXNzIFBTb3VyY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogUFNwZWNpZmllZChieXRlW10gcCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiBpcyB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgbnVsbCBwIGFycmF5LiBBbHNvIGl0IGNoZWNrcyB0aGUgdmFsdWUgb2YKKyAgICAgKiBERUZBVUxUIGZpZWxkLCBhbmQgdGhhdCBpbnB1dCBwIGFycmF5IGlzIGNvcGllZCB0byBwcm90ZWN0IGFnYWluc3QKKyAgICAgKiBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJOZXN0ZWQgY2xhc3MuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUFNvdXJjZS5QU3BlY2lmaWVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFBTcGVjaWZpZWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUFNvdXJjZS5QU3BlY2lmaWVkKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpbiB0aGUgY2FzZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgIm51bGwgcCBhcnJheS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgUFNvdXJjZS5QU3BlY2lmaWVkIERFRkFVTFQgdmFsdWUgc2hvdWxkIGJlIGJ5dGVbMF0iLAorICAgICAgICAgICAgICAgIDAsIFBTb3VyY2UuUFNwZWNpZmllZC5ERUZBVUxULmdldFZhbHVlKCkubGVuZ3RoKTsKKworICAgICAgICBieXRlW10gcCA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBQU291cmNlLlBTcGVjaWZpZWQgcHMgPSBuZXcgUFNvdXJjZS5QU3BlY2lmaWVkKHApOworICAgICAgICBwWzBdKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIHAgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciAiCisgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsIHBbMF0gPT0gcHMKKyAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0VmFsdWUoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCByZXR1cm5lZCBhcnJheSBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBhcnJheSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBDaGVja3MgdGhhdCBtb2RpZmljYXRpb24KKyAgICAgKiBvZiByZXR1cm5lZCBhcnJheSBkb2VzIG5vdCBhZmZlY3QgdGhlIGludGVybmFsIGFycmF5LgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7CisgICAgICAgIGJ5dGVbXSBwID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX07CisKKyAgICAgICAgUFNvdXJjZS5QU3BlY2lmaWVkIHBzID0gbmV3IFBTb3VyY2UuUFNwZWNpZmllZChwKTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHBzLmdldFZhbHVlKCk7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhwLCByZXN1bHQpKSB7CisgICAgICAgICAgICBmYWlsKCJUaGUgcmV0dXJuZWQgYXJyYXkgZG9lcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjb25zdHJ1Y3Rvci4iKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHRbMF0rKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2YgcmV0dXJuZWQgYnkgZ2V0VmFsdWUoKSBhcnJheSAiCisgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgcmVzdWx0WzBdID09IHBzLmdldFZhbHVlKClbMF0pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUFNvdXJjZShTdHJpbmcgcFNyY05hbWUpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIHZhbHVlIGlzCisgICAgICogZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssIHB1cnBvc2UgPSAiQ2hlY2tzIE51bGxQb2ludGVyRXhjZXB0aW9uIiwgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIlBTb3VyY2UiLCBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KX0pCisgICAgcHVibGljIHZvaWQgdGVzdFBTb3VyY2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUFNvdXJjZShudWxsKSB7fTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgIgorICAgICAgICAgICAgICAgICAgICArICJudWxsIHBTcmNOYW1lLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbGdvcml0aG0oKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCByZXR1cm5lZCB2YWx1ZSBpcworICAgICAqIGVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRBbGdvcml0aG0iLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJQU291cmNlIiwgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSl9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGdvcml0aG0oKSB7CisgICAgICAgIFN0cmluZyBwU3JjTmFtZSA9ICJwU3JjTmFtZSI7CisgICAgICAgIFBTb3VyY2UgcHMgPSBuZXcgUFNvdXJjZShwU3JjTmFtZSkge307CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgKyAiaW4gY29uc3RydWN0b3IiLCBwU3JjTmFtZS5lcXVhbHMocHMuZ2V0QWxnb3JpdGhtKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFBTb3VyY2VUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1JDMlBhcmFtZXRlclNwZWNUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1JDMlBhcmFtZXRlclNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiMTFiMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvUkMyUGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5SQzJQYXJhbWV0ZXJTcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoUkMyUGFyYW1ldGVyU3BlYy5jbGFzcykKKy8qKgorICovCisKK3B1YmxpYyBjbGFzcyBSQzJQYXJhbWV0ZXJTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFJDMlBhcmFtZXRlclNwZWMoaW50IGVmZmVjdGl2ZUtleUJpdHMsIGJ5dGVbXSBpdikgbWV0aG9kIHRlc3RpbmcuCisgICAgICogVGVzdHMgdGhhdCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBjYXNlIG9mCisgICAgICogaW5hcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGFuZCB0aGF0IGlucHV0IGl2IGFycmF5IGlzCisgICAgICogY29waWVkIHRvIHByb3RlY3QgYWdhaW5zdCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSQzJQYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UkMyUGFyYW1ldGVyU3BlYzEoKSB7CisgICAgICAgIGludCBlZmZlY3RpdmVLZXlCaXRzID0gMTA7CisgICAgICAgIGJ5dGVbXSBpdiA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJDMlBhcmFtZXRlclNwZWMoZWZmZWN0aXZlS2V5Qml0cywgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJBbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgaXYuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJDMlBhcmFtZXRlclNwZWMoZWZmZWN0aXZlS2V5Qml0cywgbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX0pOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBzaG9ydCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIFJDMlBhcmFtZXRlclNwZWMgcHMgPSBuZXcgUkMyUGFyYW1ldGVyU3BlYyhlZmZlY3RpdmVLZXlCaXRzLCBpdik7CisgICAgICAgIGl2WzBdICsrOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNoYW5nZSBvZiBpdiBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgIGl2WzBdID09IHBzLmdldElWKClbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJDMlBhcmFtZXRlclNwZWMoaW50IGVmZmVjdGl2ZUtleUJpdHMsIGJ5dGVbXSBpdiwgaW50IG9mZnNldCkgbWV0aG9kCisgICAgICogdGVzdGluZy4gVGVzdHMgdGhhdCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBjYXNlIG9mCisgICAgICogaW5hcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGFuZCB0aGF0IGlucHV0IGl2IGFycmF5IGlzCisgICAgICogY29waWVkIHRvIHByb3RlY3QgYWdhaW5zdCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSQzJQYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSQzJQYXJhbWV0ZXJTcGVjMigpIHsKKyAgICAgICAgaW50IGVmZmVjdGl2ZUtleUJpdHMgPSAxMDsKKyAgICAgICAgYnl0ZVtdIGl2ID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDB9OworICAgICAgICBpbnQgb2Zmc2V0ID0gMjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJDMlBhcmFtZXRlclNwZWMoZWZmZWN0aXZlS2V5Qml0cywgbnVsbCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUkMyUGFyYW1ldGVyU3BlYyhlZmZlY3RpdmVLZXlCaXRzLCBpdiwgNCk7CisgICAgICAgICAgICBmYWlsKCJBbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIHNob3J0IGl2LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgUkMyUGFyYW1ldGVyU3BlYyBwcyA9IG5ldyBSQzJQYXJhbWV0ZXJTcGVjKGVmZmVjdGl2ZUtleUJpdHMsIGl2LCBvZmZzZXQpOworICAgICAgICBpdltvZmZzZXRdICsrOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNoYW5nZSBvZiBpdiBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgIGl2W29mZnNldF0gPT0gcHMuZ2V0SVYoKVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0RWZmZWN0aXZlS2V5Qml0cygpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIHZhbHVlIGlzCisgICAgICogZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWZmZWN0aXZlS2V5Qml0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFZmZlY3RpdmVLZXlCaXRzKCkgeworICAgICAgICBpbnQgZWZmZWN0aXZlS2V5Qml0cyA9IDEwOworICAgICAgICBieXRlW10gaXYgPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisKKyAgICAgICAgUkMyUGFyYW1ldGVyU3BlYyBwcyA9IG5ldyBSQzJQYXJhbWV0ZXJTcGVjKGVmZmVjdGl2ZUtleUJpdHMsIGl2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGVmZmVjdGl2ZUtleUJpdHMgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgKyAidmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUtleUJpdHMgPT0gcHMuZ2V0RWZmZWN0aXZlS2V5Qml0cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRJVigpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIGFycmF5IGlzIGVxdWFsIHRvIHRoZQorICAgICAqIGFycmF5IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIENoZWNrcyB0aGF0IG1vZGlmaWNhdGlvbgorICAgICAqIG9mIHJldHVybmVkIGFycmF5IGRvZXMgbm90IGFmZmVjdCB0aGUgaW50ZXJuYWwgYXJyYXkuIEFsc28gaXQgY2hlY2tzCisgICAgICogdGhhdCBnZXRJVigpIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgaXYgaXMgbm90IHNwZWNpZmllZC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJViIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJVigpIHsKKyAgICAgICAgaW50IGVmZmVjdGl2ZUtleUJpdHMgPSAxMDsKKyAgICAgICAgYnl0ZVtdIGl2ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisKKyAgICAgICAgUkMyUGFyYW1ldGVyU3BlYyBwcyA9IG5ldyBSQzJQYXJhbWV0ZXJTcGVjKGVmZmVjdGl2ZUtleUJpdHMsIGl2KTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHBzLmdldElWKCk7CisgICAgICAgIGlmICghIEFycmF5cy5lcXVhbHMoaXYsIHJlc3VsdCkpIHsKKyAgICAgICAgICAgIGZhaWwoIlRoZSByZXR1cm5lZCBpdiBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjb25zdHJ1Y3Rvci4iKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHRbMF0gKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIHJldHVybmVkIGJ5IGdldElWKCkgbWV0aG9kIGl2ICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9PSBwcy5nZXRJVigpWzBdKTsKKyAgICAgICAgcHMgPSBuZXcgUkMyUGFyYW1ldGVyU3BlYyhlZmZlY3RpdmVLZXlCaXRzKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIGdldElWKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gbnVsbCBpZiB0aGUgcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2V0IGRvZXMgbm90IGNvbnRhaW4gaXYuIiwgcHMuZ2V0SVYoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXF1YWxzKE9iamVjdCBvYmopIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGUgY29ycmVjdG5lc3Mgb2YgZXF1YWwKKyAgICAgKiBvcGVyYXRpb246IGl0IHNob3VsZCBiZSByZWZsZXhpdmUsIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgY29uc2lzdGVudAorICAgICAqIGFuZCBzaG91bGQgYmUgZmFsc2Ugb24gbnVsbCBvYmplY3QuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgICAgIGludCBlZmZlY3RpdmVLZXlCaXRzID0gMTA7CisgICAgICAgIGJ5dGVbXSBpdiA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9OworCisgICAgICAgIFJDMlBhcmFtZXRlclNwZWMgcHMxID0gbmV3IFJDMlBhcmFtZXRlclNwZWMoZWZmZWN0aXZlS2V5Qml0cywgaXYpOworICAgICAgICBSQzJQYXJhbWV0ZXJTcGVjIHBzMiA9IG5ldyBSQzJQYXJhbWV0ZXJTcGVjKGVmZmVjdGl2ZUtleUJpdHMsIGl2KTsKKyAgICAgICAgUkMyUGFyYW1ldGVyU3BlYyBwczMgPSBuZXcgUkMyUGFyYW1ldGVyU3BlYygxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9KTsKKworICAgICAgICAvLyBjaGVja2luZyBmb3IgcmVmbGV4aXZlIGxhdzoKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIHNob3VsZCBiZSByZWZsZXhpdmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHMxLmVxdWFscyhwczEpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJPYmplY3RzIGJ1aWx0IG9uIHRoZSBzYW1lIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGVxdWFsLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzMS5lcXVhbHMocHMyKSk7CisgICAgICAgIC8vIGNoZWNraW5nIGZvciBzeW1tZXRyaWMgbGF3OgorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gc2hvdWxkIGJlIHN5bW1ldHJpYy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwczIuZXF1YWxzKHBzMSkpOworCisgICAgICAgIGFzc2VydFRydWUoIk9iamVjdHMgYnVpbHQgb24gdGhlIGVxdWFsIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGVxdWFsLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzMi5lcXVhbHMocHMzKSk7CisKKyAgICAgICAgLy8gY2hlY2tpbmcgZm9yIHRyYW5zaXRpdmUgbGF3OgorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gc2hvdWxkIGJlIHRyYW5zaXRpdmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHMxLmVxdWFscyhwczMpKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiU2hvdWxkIHJldHVybiBub3QgYmUgZXF1YWwgdG8gbnVsbCBvYmplY3QuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHMxLmVxdWFscyhudWxsKSk7CisKKyAgICAgICAgcHMyID0gbmV3IFJDMlBhcmFtZXRlclNwZWMoMTEsIGl2KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9iamVjdHMgc2hvdWxkIG5vdCBiZSBlcXVhbC4iLCBwczEuZXF1YWxzKHBzMikpOworCisgICAgICAgIHBzMiA9IG5ldyBSQzJQYXJhbWV0ZXJTcGVjKDExLCBuZXcgYnl0ZVtdIHs5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJPYmplY3RzIHNob3VsZCBub3QgYmUgZXF1YWwuIiwgcHMxLmVxdWFscyhwczIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoYXNoQ29kZSgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IGZvciBlcXVhbCBvYmplY3RzIGhhc2ggY29kZXMKKyAgICAgKiBhcmUgZXF1YWwuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7CisgICAgICAgIGludCBlZmZlY3RpdmVLZXlCaXRzID0gMDsKKyAgICAgICAgYnl0ZVtdIGl2ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisKKyAgICAgICAgUkMyUGFyYW1ldGVyU3BlYyBwczEgPSBuZXcgUkMyUGFyYW1ldGVyU3BlYyhlZmZlY3RpdmVLZXlCaXRzLCBpdik7CisgICAgICAgIFJDMlBhcmFtZXRlclNwZWMgcHMyID0gbmV3IFJDMlBhcmFtZXRlclNwZWMoZWZmZWN0aXZlS2V5Qml0cywgaXYpOworCisgICAgICAgIGFzc2VydFRydWUoIkVxdWFsIG9iamVjdHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2Rlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwczEuaGFzaENvZGUoKSA9PSBwczIuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSQzJQYXJhbWV0ZXJTcGVjVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1JDNVBhcmFtZXRlclNwZWNUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1JDNVBhcmFtZXRlclNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmMDQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvUkM1UGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUkM1UGFyYW1ldGVyU3BlYzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitAVGVzdFRhcmdldENsYXNzKFJDNVBhcmFtZXRlclNwZWMuY2xhc3MpCisvKioKKyAqLworCitwdWJsaWMgY2xhc3MgUkM1UGFyYW1ldGVyU3BlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBSQzVQYXJhbWV0ZXJTcGVjKGludCB2ZXJzaW9uLCBpbnQgcm91bmRzLCBpbnQgd29yZFNpemUsIGJ5dGVbXSBpdikgbWV0aG9kCisgICAgICogdGVzdGluZy4gVGVzdHMgdGhhdCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBjYXNlIG9mCisgICAgICogaW5hcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGFuZCB0aGF0IGlucHV0IGl2IGFycmF5IGlzCisgICAgICogY29waWVkIHRvIHByb3RlY3QgYWdhaW5zdCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbi4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSQzVQYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJDNVBhcmFtZXRlclNwZWMxKCkgeworICAgICAgICBpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgIGludCByb3VuZHMgPSA1OworICAgICAgICBpbnQgd29yZFNpemUgPSAxNjsKKyAgICAgICAgYnl0ZVtdIGl2ID0gezEsIDIsIDMsIDR9OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplKzgsIGl2KTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2Ygc2hvcnQgaXYuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJDNVBhcmFtZXRlclNwZWModmVyc2lvbiwgcm91bmRzLCB3b3JkU2l6ZSwgbmV3IGJ5dGVbXSB7MSwgMiwgM30pOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBzaG9ydCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIFJDNVBhcmFtZXRlclNwZWMgcHMgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFNpemUsIGl2KTsKKyAgICAgICAgaXZbMF0gKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIGl2IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgIgorICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IGNhdXNlIHRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAgaXZbMF0gPT0gcHMuZ2V0SVYoKVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUkM1UGFyYW1ldGVyU3BlYyhpbnQgdmVyc2lvbiwgaW50IHJvdW5kcywgaW50IHdvcmRTaXplLCBieXRlW10gaXYsIGludAorICAgICAqIG9mZnNldCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93biBpbgorICAgICAqIHRoZSBjYXNlIG9mIGluYXBwcm9wcmlhdGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyBhbmQgdGhhdCBpbnB1dCBpdiBhcnJheQorICAgICAqIGlzIGNvcGllZCB0byBwcm90ZWN0IGFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb24uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUkM1UGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJDNVBhcmFtZXRlclNwZWMyKCkgeworICAgICAgICBpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgIGludCByb3VuZHMgPSA1OworICAgICAgICBpbnQgd29yZFNpemUgPSAxNjsKKyAgICAgICAgYnl0ZVtdIGl2ID0gezEsIDIsIDMsIDQsIDUsIDZ9OworICAgICAgICBpbnQgb2Zmc2V0ID0gMjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJDNVBhcmFtZXRlclNwZWModmVyc2lvbiwgcm91bmRzLCB3b3JkU2l6ZSwgbnVsbCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplKzgsIGl2LCBvZmZzZXQpOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBzaG9ydCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplLCBpdiwgb2Zmc2V0KzEpOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBzaG9ydCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplLCBuZXcgYnl0ZVtdIHsgMSwgMiwKKyAgICAgICAgICAgICAgICAgICAgMywgNCB9LCBvZmZzZXQpOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBzaG9ydCBpdi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIFJDNVBhcmFtZXRlclNwZWMgcHMgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdiwgb2Zmc2V0KTsKKyAgICAgICAgaXZbb2Zmc2V0XSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2YgaXYgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciAiCisgICAgICAgICAgICAgICAgICAgICsgInNob3VsZCBub3QgY2F1c2UgdGhlIGNoYW5nZSBvZiBpbnRlcm5hbCBhcnJheS4iLAorICAgICAgICAgICAgICAgICAgICBpdltvZmZzZXRdID09IHBzLmdldElWKClbMF0pOworCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0xMDc3CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUkM1UGFyYW1ldGVyU3BlYygwLCA5LCA3NywgbmV3IGJ5dGVbXSB7IDIgfSwgLTEwMCk7CisgICAgICAgICAgICBmYWlsKCJBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRWZXJzaW9uKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgcmV0dXJuZWQgdmFsdWUgaXMKKyAgICAgKiBlcXVhbCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRWZXJzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb24oKSB7CisgICAgICAgIGludCB2ZXJzaW9uID0gMTsKKyAgICAgICAgaW50IHJvdW5kcyA9IDU7CisgICAgICAgIGludCB3b3JkU2l6ZSA9IDE2OworCisgICAgICAgIFJDNVBhcmFtZXRlclNwZWMgcHMgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHZlcnNpb24gdmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgKyAidmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgICAgIHBzLmdldFZlcnNpb24oKSA9PSB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRSb3VuZHMoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCByZXR1cm5lZCB2YWx1ZSBpcworICAgICAqIGVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJvdW5kcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSb3VuZHMoKSB7CisgICAgICAgIGludCB2ZXJzaW9uID0gMTsKKyAgICAgICAgaW50IHJvdW5kcyA9IDU7CisgICAgICAgIGludCB3b3JkU2l6ZSA9IDE2OworCisgICAgICAgIFJDNVBhcmFtZXRlclNwZWMgcHMgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHJvdW5kcyB2YWx1ZSBzaG91bGQgYmUgZXF1YWwgdG8gdGhlICIKKyAgICAgICAgICAgICAgICArICJ2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICAgICAgcHMuZ2V0Um91bmRzKCkgPT0gcm91bmRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRXb3JkU2l6ZSgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIHZhbHVlIGlzCisgICAgICogZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0V29yZFNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29yZFNpemUoKSB7CisgICAgICAgIGludCB2ZXJzaW9uID0gMTsKKyAgICAgICAgaW50IHJvdW5kcyA9IDU7CisgICAgICAgIGludCB3b3JkU2l6ZSA9IDE2OworCisgICAgICAgIFJDNVBhcmFtZXRlclNwZWMgcHMgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHdvcmRTaXplIHZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgIgorICAgICAgICAgICAgICAgICsgInZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgICAgICBwcy5nZXRXb3JkU2l6ZSgpID09IHdvcmRTaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRJVigpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIGFycmF5IGlzIGVxdWFsIHRvIHRoZQorICAgICAqIGFycmF5IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIENoZWNrcyB0aGF0IG1vZGlmaWNhdGlvbgorICAgICAqIG9mIHJldHVybmVkIGFycmF5IGRvZXMgbm90IGFmZmVjdCB0aGUgaW50ZXJuYWwgYXJyYXkuIEFsc28gaXQgY2hlY2tzCisgICAgICogdGhhdCBnZXRJVigpIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgaXYgaXMgbm90IHNwZWNpZmllZC4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJViIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJVigpIHsKKyAgICAgICAgaW50IHZlcnNpb24gPSAxOworICAgICAgICBpbnQgcm91bmRzID0gNTsKKyAgICAgICAgaW50IHdvcmRTaXplID0gMTY7CisgICAgICAgIGJ5dGVbXSBpdiA9IHsxLCAyLCAzLCA0fTsKKworICAgICAgICBSQzVQYXJhbWV0ZXJTcGVjIHBzID0gbmV3IFJDNVBhcmFtZXRlclNwZWModmVyc2lvbiwgcm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFNpemUsIGl2KTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHBzLmdldElWKCk7CisgICAgICAgIGlmICghIEFycmF5cy5lcXVhbHMoaXYsIHJlc3VsdCkpIHsKKyAgICAgICAgICAgIGZhaWwoIlRoZSByZXR1cm5lZCBpdiBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjb25zdHJ1Y3Rvci4iKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHRbMF0gKys7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2hhbmdlIG9mIHJldHVybmVkIGJ5IGdldElWKCkgbWV0aG9kIGl2ICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGludGVybmFsIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9PSBwcy5nZXRJVigpWzBdKTsKKyAgICAgICAgcHMgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIGdldElWKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gbnVsbCBpZiB0aGUgcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2V0IGRvZXMgbm90IGNvbnRhaW4gSVYuIiwgcHMuZ2V0SVYoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXF1YWxzKE9iamVjdCBvYmopIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGUgY29ycmVjdG5lc3Mgb2YgZXF1YWwKKyAgICAgKiBvcGVyYXRpb246IGl0IHNob3VsZCBiZSByZWZsZXhpdmUsIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgY29uc2lzdGVudAorICAgICAqIGFuZCBzaG91bGQgYmUgZmFsc2Ugb24gbnVsbCBvYmplY3QuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgICAgIGludCB2ZXJzaW9uID0gMTsKKyAgICAgICAgaW50IHJvdW5kcyA9IDU7CisgICAgICAgIGludCB3b3JkU2l6ZSA9IDE2OworICAgICAgICBieXRlW10gaXYgPSB7MSwgMiwgMywgNCwgNSwgNn07CisKKyAgICAgICAgUkM1UGFyYW1ldGVyU3BlYyBwczEgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFNpemUsIGl2KTsKKyAgICAgICAgUkM1UGFyYW1ldGVyU3BlYyBwczIgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFNpemUsIGl2KTsKKyAgICAgICAgUkM1UGFyYW1ldGVyU3BlYyBwczMgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10gezEsIDIsIDMsIDR9KTsKKyAgICAgICAgLy8gY2hlY2tpbmcgZm9yIHJlZmxleGl2ZSBsYXc6CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBzaG91bGQgYmUgcmVmbGV4aXZlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzMS5lcXVhbHMocHMxKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0cyBidWlsdCBvbiB0aGUgc2FtZSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBlcXVhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwczEuZXF1YWxzKHBzMikpOworICAgICAgICAvLyBjaGVja2luZyBmb3Igc3ltbWV0cmljIGxhdzoKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIHNob3VsZCBiZSBzeW1tZXRyaWMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHMyLmVxdWFscyhwczEpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJPYmplY3RzIGJ1aWx0IG9uIHRoZSBlcXVhbCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBlcXVhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwczIuZXF1YWxzKHBzMykpOworCisgICAgICAgIC8vIGNoZWNraW5nIGZvciB0cmFuc2l0aXZlIGxhdzoKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIHNob3VsZCBiZSB0cmFuc2l0aXZlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzMS5lcXVhbHMocHMzKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNob3VsZCByZXR1cm4gbm90IGJlIGVxdWFsIHRvIG51bGwgb2JqZWN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzMS5lcXVhbHMobnVsbCkpOworCisgICAgICAgIHBzMiA9IG5ldyBSQzVQYXJhbWV0ZXJTcGVjKHZlcnNpb24rMSwgcm91bmRzLCB3b3JkU2l6ZSwgaXYpOworICAgICAgICBhc3NlcnRGYWxzZSgiT2JqZWN0cyBzaG91bGQgbm90IGJlIGVxdWFsLiIsIHBzMS5lcXVhbHMocHMyKSk7CisKKyAgICAgICAgcHMyID0gbmV3IFJDNVBhcmFtZXRlclNwZWModmVyc2lvbiwgcm91bmRzKzEsIHdvcmRTaXplLCBpdik7CisgICAgICAgIGFzc2VydEZhbHNlKCJPYmplY3RzIHNob3VsZCBub3QgYmUgZXF1YWwuIiwgcHMxLmVxdWFscyhwczIpKTsKKworICAgICAgICBwczIgPSBuZXcgUkM1UGFyYW1ldGVyU3BlYyh2ZXJzaW9uLCByb3VuZHMsIHdvcmRTaXplLzIsIGl2KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9iamVjdHMgc2hvdWxkIG5vdCBiZSBlcXVhbC4iLCBwczEuZXF1YWxzKHBzMikpOworCisgICAgICAgIHBzMiA9IG5ldyBSQzVQYXJhbWV0ZXJTcGVjKHZlcnNpb24sIHJvdW5kcywgd29yZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7NCwgMywgMiwgMX0pOworICAgICAgICBhc3NlcnRGYWxzZSgiT2JqZWN0cyBzaG91bGQgbm90IGJlIGVxdWFsLiIsIHBzMS5lcXVhbHMocHMyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzaENvZGUoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCBmb3IgZXF1YWwgb2JqZWN0cyBoYXNoIGNvZGVzCisgICAgICogYXJlIGVxdWFsLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgeworICAgICAgICBpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgIGludCByb3VuZHMgPSA1OworICAgICAgICBpbnQgd29yZFNpemUgPSAxNjsKKyAgICAgICAgYnl0ZVtdIGl2ID0gezEsIDIsIDMsIDQsIDUsIDZ9OworCisgICAgICAgIFJDNVBhcmFtZXRlclNwZWMgcHMxID0gbmV3IFJDNVBhcmFtZXRlclNwZWModmVyc2lvbiwgcm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTaXplLCBpdik7CisgICAgICAgIFJDNVBhcmFtZXRlclNwZWMgcHMyID0gbmV3IFJDNVBhcmFtZXRlclNwZWModmVyc2lvbiwgcm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTaXplLCBpdik7CisgICAgICAgIGFzc2VydFRydWUoIkVxdWFsIG9iamVjdHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2Rlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwczEuaGFzaENvZGUoKSA9PSBwczIuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSQzVQYXJhbWV0ZXJTcGVjVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWNUZXN0LmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNzFhYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NwZWMvU2VjcmV0S2V5U3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitAVGVzdFRhcmdldENsYXNzKFNlY3JldEtleVNwZWMuY2xhc3MpCisvKioKKyAqLworCitwdWJsaWMgY2xhc3MgU2VjcmV0S2V5U3BlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBTZWNyZXRLZXlTcGVjKGJ5dGVbXSBrZXksIFN0cmluZyBhbGdvcml0aG0pIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0CisgICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUgY2FzZSBvZiBpbmFwcHJvcHJpYXRlCisgICAgICogY29uc3RydWN0b3IgcGFyYW1ldGVycyBhbmQgdGhhdCBpbnB1dCBpdiBhcnJheSBpcworICAgICAqIGNvcGllZCB0byBwcm90ZWN0IGFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb24uCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VjcmV0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNyZXRLZXlTcGVjMSgpIHsKKyAgICAgICAgYnl0ZVtdIGtleSA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBTdHJpbmcgYWxnb3JpdGhtID0gIkFsZ29yaXRobSI7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKG5ldyBieXRlW10ge30sIGFsZ29yaXRobSk7CisgICAgICAgICAgICBmYWlsKCJBbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIGVtcHR5IGtleS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhudWxsLCBhbGdvcml0aG0pOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGtleS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIG51bGwpOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGFsZ29yaXRobS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIFNlY3JldEtleVNwZWMga3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIGFsZ29yaXRobSk7CisgICAgICAgIGtleVswXSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2Yga2V5IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgIgorICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IGNhdXNlIHRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAga2V5WzBdID09IGtzLmdldEVuY29kZWQoKVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VjcmV0S2V5U3BlYyhieXRlW10ga2V5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBTdHJpbmcgYWxnb3JpdGhtKSBtZXRob2QKKyAgICAgKiB0ZXN0aW5nLiBUZXN0cyB0aGF0IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24gaW4KKyAgICAgKiB0aGUgY2FzZSBvZiBpbmFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgYW5kIHRoYXQgaW5wdXQgaXYgYXJyYXkKKyAgICAgKiBpcyBjb3BpZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3JldEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RTZWNyZXRLZXlTcGVjMigpIHsKKyAgICAgICAgYnl0ZVtdIGtleSA9IG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9OworICAgICAgICBpbnQgb2Zmc2V0ID0gMTsKKyAgICAgICAgaW50IGxlbiA9IDQ7CisgICAgICAgIFN0cmluZyBhbGdvcml0aG0gPSAiQWxnb3JpdGhtIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFNlY3JldEtleVNwZWMobmV3IGJ5dGVbXSB7fSwgMCwgMCwgYWxnb3JpdGhtKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgZW1wdHkga2V5LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKG51bGwsIDAsIDAsIGFsZ29yaXRobSk7CisgICAgICAgICAgICBmYWlsKCJBbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAiCisgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwga2V5LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKGtleSwgb2Zmc2V0LCBsZW4sIG51bGwpOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBzaG9ydCBrZXkgYWxnb3JpdGhtLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKGtleSwgb2Zmc2V0LCBrZXkubGVuZ3RoLCBhbGdvcml0aG0pOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGtleS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIC0xLCBrZXkubGVuZ3RoLCBhbGdvcml0aG0pOworICAgICAgICAgICAgZmFpbCgiQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGtleS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIk5vdCBleHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIG9mZnNldCwgbGVuLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBhbGdvcml0aG0uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBTZWNyZXRLZXlTcGVjIGtzID0gbmV3IFNlY3JldEtleVNwZWMoa2V5LCBhbGdvcml0aG0pOworICAgICAgICBrZXlbb2Zmc2V0XSArKzsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjaGFuZ2Ugb2Yga2V5IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgIgorICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IGNhdXNlIHRoZSBjaGFuZ2Ugb2YgaW50ZXJuYWwgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAga2V5W29mZnNldF0gPT0ga3MuZ2V0RW5jb2RlZCgpWzBdKTsKKworICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTA3NworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFNlY3JldEtleVNwZWMobmV3IGJ5dGVbXSB7IDIgfSwgNCwgLTEwMCwgIkNDQyIpOworICAgICAgICAgICAgZmFpbCgiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBbGdvcml0aG0oKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCByZXR1cm5lZCB2YWx1ZSBpcworICAgICAqIGVxdWFsIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGdvcml0aG0oKSB7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9ICJBbGdvcml0aG0iOworCisgICAgICAgIFNlY3JldEtleVNwZWMga3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIGFsZ29yaXRobSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIHZhbHVlIGRvZXMgbm90IGVxdWFsIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgKyAidmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgICAgIGFsZ29yaXRobSwga3MuZ2V0QWxnb3JpdGhtKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldEZvcm1hdCgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IHJldHVybmVkIHZhbHVlIGlzICJSQVciLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGb3JtYXQoKSB7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9ICJBbGdvcml0aG0iOworCisgICAgICAgIFNlY3JldEtleVNwZWMga3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIGFsZ29yaXRobSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCB2YWx1ZSBpcyBub3QgXCJSQVdcIi4iLAorICAgICAgICAgICAgICAgIGtzLmdldEZvcm1hdCgpID09ICJSQVciKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRFbmNvZGVkKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgcmV0dXJuZWQgYXJyYXkgaXMgZXF1YWwgdG8gdGhlCisgICAgICogYXJyYXkgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4gQ2hlY2tzIHRoYXQgbW9kaWZpY2F0aW9uCisgICAgICogb2YgcmV0dXJuZWQgYXJyYXkgZG9lcyBub3QgYWZmZWN0IHRoZSBpbnRlcm5hbCBhcnJheS4KKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEVuY29kZWQoKSB7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9ICJBbGdvcml0aG0iOworCisgICAgICAgIFNlY3JldEtleVNwZWMga3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIGFsZ29yaXRobSk7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBrcy5nZXRFbmNvZGVkKCk7CisgICAgICAgIGlmICghIEFycmF5cy5lcXVhbHMoa2V5LCByZXN1bHQpKSB7CisgICAgICAgICAgICBmYWlsKCJUaGUgcmV0dXJuZWQga2V5IGRvZXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY29uc3RydWN0b3IuIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0WzBdICsrOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNoYW5nZSBvZiByZXR1cm5lZCBieSBnZXRFbmNvZGVkKCkgbWV0aG9kIGtleSAiCisgICAgICAgICAgICAgICAgICAgICsgInNob3VsZCBub3QgY2F1c2UgdGhlIGNoYW5nZSBvZiBpbnRlcm5hbCBhcnJheS4iLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPT0ga3MuZ2V0RW5jb2RlZCgpWzBdKTsKKworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTc4CisgICAgICAgIGludCBvZmZzZXQgPSAxOworICAgICAgICBpbnQgbGVuID0gNDsKKyAgICAgICAgU2VjcmV0S2V5U3BlYyBza3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIG9mZnNldCwgbGVuLCBhbGdvcml0aG0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIktleSBsZW5ndGggaXMgaW5jb3JyZWN0IiwgbGVuLCBza3MuZ2V0RW5jb2RlZCgpLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzaENvZGUoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCBmb3IgZXF1YWwgb2JqZWN0cyBoYXNoIGNvZGVzCisgICAgICogYXJlIGVxdWFsLgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgeworICAgICAgICBieXRlW10ga2V5ID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX07CisgICAgICAgIFN0cmluZyBhbGdvcml0aG0gPSAiQWxnb3JpdGhtIjsKKworICAgICAgICBTZWNyZXRLZXlTcGVjIGtzMSA9IG5ldyBTZWNyZXRLZXlTcGVjKGtleSwgYWxnb3JpdGhtKTsKKyAgICAgICAgU2VjcmV0S2V5U3BlYyBrczIgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIGFsZ29yaXRobSk7CisgICAgICAgIGFzc2VydFRydWUoIkVxdWFsIG9iamVjdHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2Rlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrczEuaGFzaENvZGUoKSA9PSBrczIuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXF1YWxzKE9iamVjdCBvYmopIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGUgY29ycmVjdG5lc3Mgb2YgZXF1YWwKKyAgICAgKiBvcGVyYXRpb246IGl0IHNob3VsZCBiZSByZWZsZXhpdmUsIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgY29uc2lzdGVudAorICAgICAqIGFuZCBzaG91bGQgYmUgZmFsc2Ugb24gbnVsbCBvYmplY3QuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fTsKKyAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9ICJBbGdvcml0aG0iOworCisgICAgICAgIFNlY3JldEtleVNwZWMga3MxID0gbmV3IFNlY3JldEtleVNwZWMoa2V5LCBhbGdvcml0aG0pOworICAgICAgICBTZWNyZXRLZXlTcGVjIGtzMiA9IG5ldyBTZWNyZXRLZXlTcGVjKGtleSwgYWxnb3JpdGhtKTsKKyAgICAgICAgU2VjcmV0S2V5U3BlYyBrczMgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIGFsZ29yaXRobSk7CisKKyAgICAgICAgLy8gY2hlY2tpbmcgZm9yIHJlZmxleGl2ZSBsYXc6CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBzaG91bGQgYmUgcmVmbGV4aXZlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzMS5lcXVhbHMoa3MxKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0cyBidWlsdCBvbiB0aGUgc2FtZSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBlcXVhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrczEuZXF1YWxzKGtzMikpOworICAgICAgICAvLyBjaGVja2luZyBmb3Igc3ltbWV0cmljIGxhdzoKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIHNob3VsZCBiZSBzeW1tZXRyaWMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3MyLmVxdWFscyhrczEpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJPYmplY3RzIGJ1aWx0IG9uIHRoZSBlcXVhbCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBlcXVhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrczIuZXF1YWxzKGtzMykpOworICAgICAgICAvLyBjaGVja2luZyBmb3IgdHJhbnNpdGl2ZSBsYXc6CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrczEuZXF1YWxzKGtzMykpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJTaG91bGQgbm90IGJlIGVxdWFsIHRvIG51bGwgb2JqZWN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzMS5lcXVhbHMobnVsbCkpOworCisgICAgICAgIGtzMiA9IG5ldyBTZWNyZXRLZXlTcGVjKG5ldyBieXRlW10gezF9LCBhbGdvcml0aG0pOworICAgICAgICBhc3NlcnRGYWxzZSgiT2JqZWN0cyBzaG91bGQgbm90IGJlIGVxdWFsLiIsIGtzMS5lcXVhbHMoa3MyKSk7CisKKyAgICAgICAga3MyID0gbmV3IFNlY3JldEtleVNwZWMoa2V5LCAiQW5vdGhlciBBbGdvcml0aG0iKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9iamVjdHMgc2hvdWxkIG5vdCBiZSBlcXVhbC4iLCBrczEuZXF1YWxzKGtzMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VjcmV0S2V5U3BlY1Rlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9zdXBwb3J0L0VuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9zdXBwb3J0L0VuY3J5cHRlZFByaXZhdGVLZXlJbmZvRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTBlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9EYXRhLmphdmEKQEAgLTAsMCArMSwxMjI5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqCisgKiBTdXBwb3J0IGNsYXNzIGZvciBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb19JbXBsVGVzdCBhbmQgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9fVGVzdAorICogCisgKiBBbGwgYmluYXJ5IGRhdGEgZm9yIHRoZXNlIHRlc3RzIHdlcmUgZ2VuZXJhdGVkIHVzaW5nCisgKiBCRUEgSlJvY2tpdCBqMnNkazEuNC4yXzA0IChodHRwOi8vd3d3LmJlYS5jb20pIHdpdGgKKyAqIHNlY3VyaXR5IHByb3ZpZGVycyBsaXN0IGV4dGVuZGVkIGJ5IEJvdW5jeSBDYXN0bGUncyBvbmUKKyAqIChodHRwOi8vd3d3LmJvdW5jeWNhc3RsZS5vcmcpCisgKi8KK3B1YmxpYyBjbGFzcyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0RhdGEgeworCisKKyAgICAvKioKKyAgICAgKiAidmFsaWQiIGVuY29kaW5nIGZvciBEU0Egd2l0aCBhbGcgcGFyYW1zCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGRzYUVuY3J5cHRlZFByaXZhdGVLZXlJbmZvID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzAsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDJiLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDcsCisgICAgICAgICAgICAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4MzgsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHg5ZiwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDc2LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4NTksCisgICAgICAgICAgICAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweDZiLCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4NmQsCisgICAgICAgICAgICAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4N2UsIChieXRlKSAweDE0LCAoYnl0ZSkgMHgyNywgKGJ5dGUpIDB4MjUsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4NTksIChieXRlKSAweDJjLCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4MjEsCisgICAgICAgICAgICAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4YjcsIChieXRlKSAweGQ0LCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4YTAsCisgICAgICAgICAgICAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4NGUsIChieXRlKSAweDcyLCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4MTgsCisgICAgICAgICAgICAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4MWMsIChieXRlKSAweDlhLCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4Y2QsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4MWIsIChieXRlKSAweDM5LCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4OWUsCisgICAgICAgICAgICAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4MTYsIChieXRlKSAweGViLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4ODQsCisgICAgICAgICAgICAoYnl0ZSkgMHgyOCwgKGJ5dGUpIDB4MmEsIChieXRlKSAweGI5LCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4YzcsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDk5LCAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4YTUsCisgICAgICAgICAgICAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4NjYsIChieXRlKSAweGUxLCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4ZGQsCisgICAgICAgICAgICAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4Y2YsIChieXRlKSAweGZlLCAoYnl0ZSkgMHhiOSwgKGJ5dGUpIDB4NmEsCisgICAgICAgICAgICAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4MTIsIChieXRlKSAweDRiLCAoYnl0ZSkgMHhhNCwgKGJ5dGUpIDB4YTgsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4ZDcsIChieXRlKSAweGFiLCAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4ZDYsCisgICAgICAgICAgICAoYnl0ZSkgMHhjMywgKGJ5dGUpIDB4ZDEsIChieXRlKSAweDNiLCAoYnl0ZSkgMHg5NSwgKGJ5dGUpIDB4YzQsCisgICAgICAgICAgICAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4MmMsIChieXRlKSAweGRjLCAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4NWQsCisgICAgICAgICAgICAoYnl0ZSkgMHhmNSwgKGJ5dGUpIDB4NTUsIChieXRlKSAweGFlLCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4NjgsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDk5LCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4ZDMsCisgICAgICAgICAgICAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZDksIChieXRlKSAweGQzLCAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4ZjUsCisgICAgICAgICAgICAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweGEyLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4NjEsCisgICAgICAgICAgICAoYnl0ZSkgMHhmOCwgKGJ5dGUpIDB4YjEsIChieXRlKSAweGU2LCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4NjUsCisgICAgICAgICAgICAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4YTQsIChieXRlKSAweDk3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MWQsCisgICAgICAgICAgICAoYnl0ZSkgMHgzZiwgKGJ5dGUpIDB4MmIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4ZDUsCisgICAgICAgICAgICAoYnl0ZSkgMHhjYiwgKGJ5dGUpIDB4OGQsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg5YSwgKGJ5dGUpIDB4YWMsCisgICAgICAgICAgICAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4NWYsIChieXRlKSAweGM3LCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MTUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4OWEsIChieXRlKSAweGZiLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NzIsCisgICAgICAgICAgICAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MmEsCisgICAgICAgICAgICAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4Y2EsIChieXRlKSAweDYwLCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4NDcsCisgICAgICAgICAgICAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4NGIsIChieXRlKSAweDBmLCAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4NzMsCisgICAgICAgICAgICAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4NWQsCisgICAgICAgICAgICAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4MjgsIChieXRlKSAweDY0LCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4MmIsCisgICAgICAgICAgICAoYnl0ZSkgMHhlYiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweGI0LCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4MGQsCisgICAgICAgICAgICAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4ZWMsIChieXRlKSAweGM4LCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4OTYsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4NmEsIChieXRlKSAweDUyLCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4MGIsCisgICAgICAgICAgICAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4YjAsIChieXRlKSAweDMzLCAoYnl0ZSkgMHhhMSwgKGJ5dGUpIDB4ZDEsCisgICAgICAgICAgICAoYnl0ZSkgMHhiYywgKGJ5dGUpIDB4NjQsIChieXRlKSAweGQ2LCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4ZWYsCisgICAgICAgICAgICAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4ODksIChieXRlKSAweGM3LCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4NzUsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4ODIsIChieXRlKSAweDYxLCAoYnl0ZSkgMHhiZSwgKGJ5dGUpIDB4ZDEsCisgICAgICAgICAgICAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4NzAsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4OTksCisgICAgICAgICAgICAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NzUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4YzAsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4ZjEsIChieXRlKSAweDBjLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4MWYsCisgICAgICAgICAgICAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDVkLCAoYnl0ZSkgMHhmYSwgKGJ5dGUpIDB4MzcsCisgICAgICAgICAgICAoYnl0ZSkgMHhjMSwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDk3LCAoYnl0ZSkgMHg3NiwgKGJ5dGUpIDB4YTUsCisgICAgICAgICAgICAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NWIsIChieXRlKSAweDg4LCAoYnl0ZSkgMHhlNCwgKGJ5dGUpIDB4ZDUsCisgICAgICAgICAgICAoYnl0ZSkgMHhiOCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweGY1LCAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4OTIsCisgICAgICAgICAgICAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4OTksIChieXRlKSAweGE1LCAoYnl0ZSkgMHg1YSwgKGJ5dGUpIDB4NjQsCisgICAgICAgICAgICAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDJjLCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4NTgsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4YTYsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4NzEsCisgICAgICAgICAgICAoYnl0ZSkgMHhmYiwgKGJ5dGUpIDB4NDksIChieXRlKSAweDI0LCAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4MzQsCisgICAgICAgICAgICAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4YTAsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4MTQsCisgICAgICAgICAgICAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4YzIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4ZGQsCisgICAgICAgICAgICAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4NzgsIChieXRlKSAweDJhLCAoYnl0ZSkgMHg1YSwgKGJ5dGUpIDB4MjQsCisgICAgICAgICAgICAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4MTksIChieXRlKSAweGY0LCAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4MmUsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4OTIsIChieXRlKSAweDgwLCAoYnl0ZSkgMHhlNSwgKGJ5dGUpIDB4ZTQsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MjgsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg1YywgLy8gMzgKKyAgICAgICAgICAgIChieXRlKSAweDM0LCAoYnl0ZSkgMHhjOCwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg4MiwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIC8vIAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA3LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDBhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDBjLCAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MGUsIChieXRlKSAweDBmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTAsIChieXRlKSAweDExLCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTUsIChieXRlKSAweDE2LCAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MTgsIChieXRlKSAweDE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MWEsIChieXRlKSAweDFiLCAoYnl0ZSkgMHgxYywgKGJ5dGUpIDB4MWQsIChieXRlKSAweDFlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWYsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDIzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjQsIChieXRlKSAweDI1LCAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4MjcsIChieXRlKSAweDI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjksIChieXRlKSAweDJhLCAoYnl0ZSkgMHgyYiwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDJkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmUsIChieXRlKSAweDJmLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzMsIChieXRlKSAweDM0LCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzgsIChieXRlKSAweDM5LCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4M2IsIChieXRlKSAweDNjLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2QsIChieXRlKSAweDNlLCAoYnl0ZSkgMHgzZiwgKGJ5dGUpIDB4NDAsIChieXRlKSAweDQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDIsIChieXRlKSAweDQzLCAoYnl0ZSkgMHg0NCwgKGJ5dGUpIDB4NDUsIChieXRlKSAweDQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDcsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NGEsIChieXRlKSAweDRiLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGMsIChieXRlKSAweDRkLCAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4NGYsIChieXRlKSAweDUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTEsIChieXRlKSAweDUyLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NTQsIChieXRlKSAweDU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTYsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4NTksIChieXRlKSAweDVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWIsIChieXRlKSAweDVjLCAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NywgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NmEsIChieXRlKSAweDZiLCAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4NmQsIChieXRlKSAweDZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmYsIChieXRlKSAweDcwLCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc1LCAoYnl0ZSkgMHg3NiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDc4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzksIChieXRlKSAweDdhLCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4N2MsIChieXRlKSAweDdkLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2UsIChieXRlKSAweDdmLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODMsIChieXRlKSAweDg0LCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDg3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODgsIChieXRlKSAweDg5LCAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4OGIsIChieXRlKSAweDhjLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGQsIChieXRlKSAweDhlLCAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4OTAsIChieXRlKSAweDkxLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTIsIChieXRlKSAweDkzLCAoYnl0ZSkgMHg5NCwgKGJ5dGUpIDB4OTUsIChieXRlKSAweDk2LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTcsIChieXRlKSAweDk4LCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4OWEsIChieXRlKSAweDliLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWMsIChieXRlKSAweDlkLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4OWYsIChieXRlKSAweGEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTEsIChieXRlKSAweGEyLCAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4YTQsIChieXRlKSAweGE1LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTYsIChieXRlKSAweGE3LCAoYnl0ZSkgMHhhOCwgKGJ5dGUpIDB4YTksIChieXRlKSAweGFhLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWIsIChieXRlKSAweGFjLCAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4YWUsIChieXRlKSAweGFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjAsIChieXRlKSAweGIxLCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4YjMsIChieXRlKSAweGI0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjUsIChieXRlKSAweGI2LCAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4YjgsIChieXRlKSAweGI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YmEsIChieXRlKSAweGJiLCAoYnl0ZSkgMHhiYywgKGJ5dGUpIDB4YmQsIChieXRlKSAweGJlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmYsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMSwgKGJ5dGUpIDB4YzIsIChieXRlKSAweGMzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzQsIChieXRlKSAweGM1LCAoYnl0ZSkgMHhjNiwgKGJ5dGUpIDB4YzcsIChieXRlKSAweGM4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzksIChieXRlKSAweGNhLCAoYnl0ZSkgMHhjYiwgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGNkLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGNmLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDMsIChieXRlKSAweGQ0LCAoYnl0ZSkgMHhkNSwgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDgsIChieXRlKSAweGQ5LCAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGRjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGQsIChieXRlKSAweGRlLCAoYnl0ZSkgMHhkZiwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweGUzLCAoYnl0ZSkgMHhlNCwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweGU2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTcsIChieXRlKSAweGU4LCAoYnl0ZSkgMHhlOSwgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGViLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWMsIChieXRlKSAweGVkLCAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGYwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjEsIChieXRlKSAweGYyLCAoYnl0ZSkgMHhmMywgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGY1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjYsIChieXRlKSAweGY3LCAoYnl0ZSkgMHhmOCwgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmIsIChieXRlKSAweGZjLCAoYnl0ZSkgMHhmZCwgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDA0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDUsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MDgsIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MGEsIChieXRlKSAweDBiLCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MGQsIChieXRlKSAweDBlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGYsIChieXRlKSAweDEwLCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTQsIChieXRlKSAweDE1LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MTcsIChieXRlKSAweDE4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTksIChieXRlKSAweDFhLCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4MWMsIChieXRlKSAweDFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWUsIChieXRlKSAweDFmLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjMsIChieXRlKSAweDI0LCAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4MjYsIChieXRlKSAweDI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjgsIChieXRlKSAweDI5LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4MmIsIChieXRlKSAweDJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmQsIChieXRlKSAweDJlLCAoYnl0ZSkgMHgyZiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzIsIChieXRlKSAweDMzLCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzcsIChieXRlKSAweDM4LCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4M2EsIChieXRlKSAweDNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2MsIChieXRlKSAweDNkLCAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4M2YsIChieXRlKSAweDQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDEsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NDQsIChieXRlKSAweDQ1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDYsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGIsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4NGUsIChieXRlKSAweDRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTAsIChieXRlKSAweDUxLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTUsIChieXRlKSAweDU2LCAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4NTgsIChieXRlKSAweDU5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NWEsIChieXRlKSAweDViLCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NWQsIChieXRlKSAweDVlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWYsIChieXRlKSAweDYwLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjcsIChieXRlKSAweDY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjksIChieXRlKSAweDZhLCAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDZkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4NzEsIChieXRlKSAweDcyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NzYsIChieXRlKSAweDc3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzgsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4N2IsIChieXRlKSAweDdjLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2QsIChieXRlKSAweDdlLCAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDgzLCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4ODUsIChieXRlKSAweDg2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODcsIChieXRlKSAweDg4LCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4OGEsIChieXRlKSAweDhiLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGMsIChieXRlKSAweDhkLCAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4OGYsIChieXRlKSAweDkwLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTEsIChieXRlKSAweDkyLCAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4OTQsIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTYsIChieXRlKSAweDk3LCAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4OTksIChieXRlKSAweDlhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWIsIChieXRlKSAweDljLCAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4OWUsIChieXRlKSAweDlmLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTAsIChieXRlKSAweGExLCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4YTMsIChieXRlKSAweGE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTUsIChieXRlKSAweGE2LCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4YTgsIChieXRlKSAweGE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YWEsIChieXRlKSAweGFiLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4YWQsIChieXRlKSAweGFlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWYsIChieXRlKSAweGIwLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4YjIsIChieXRlKSAweGIzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjQsIChieXRlKSAweGI1LCAoYnl0ZSkgMHhiNiwgKGJ5dGUpIDB4YjcsIChieXRlKSAweGI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjksIChieXRlKSAweGJhLCAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4YmMsIChieXRlKSAweGJkLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmUsIChieXRlKSAweGJmLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzEsIChieXRlKSAweGMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzMsIChieXRlKSAweGM0LCAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4YzYsIChieXRlKSAweGM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzgsIChieXRlKSAweGM5LCAoYnl0ZSkgMHhjYSwgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGNjLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2QsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhjZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDIsIChieXRlKSAweGQzLCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDcsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4ZGEsIChieXRlKSAweGRiLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGMsIChieXRlKSAweGRkLCAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTEsIChieXRlKSAweGUyLCAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTYsIChieXRlKSAweGU3LCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4ZTksIChieXRlKSAweGVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGVjLCAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYxLCAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4ZjMsIChieXRlKSAweGY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjUsIChieXRlKSAweGY2LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmEsIChieXRlKSAweGZiLCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4ZmQsIChieXRlKSAweGZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDcsIChieXRlKSAweDA4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDBhLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDBkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGUsIChieXRlKSAweDBmLCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4MTEsIChieXRlKSAweDEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTMsIChieXRlKSAweDE0LCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MTYsIChieXRlKSAweDE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTgsIChieXRlKSAweDE5LCAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4MWIsIChieXRlKSAweDFjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWQsIChieXRlKSAweDFlLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDIxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjIsIChieXRlKSAweDIzLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4MjUsIChieXRlKSAweDI2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjcsIChieXRlKSAweDI4LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDJiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmMsIChieXRlKSAweDJkLCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4MmYsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzQsIChieXRlKSAweDM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM3LCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzksIChieXRlKSAweDNhLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2IsIChieXRlKSAweDNjLCAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4M2UsIChieXRlKSAweDNmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDAsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4NDMsIChieXRlKSAweDQ0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDUsIChieXRlKSAweDQ2LCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NGEsIChieXRlKSAweDRiLCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4NGQsIChieXRlKSAweDRlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGYsIChieXRlKSAweDUwLCAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDUzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTksIChieXRlKSAweDVhLCAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4NWMsIChieXRlKSAweDVkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWUsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjMsIChieXRlKSAweDY0LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4NmIsIChieXRlKSAweDZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmQsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NzAsIChieXRlKSAweDcxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzUsIChieXRlKSAweDc2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweDc4LCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4N2EsIChieXRlKSAweDdiLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2MsIChieXRlKSAweDdkLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4N2YsIChieXRlKSAweDgwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgyLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4ODQsIChieXRlKSAweDg1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODYsIChieXRlKSAweDg3LCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4ODksIChieXRlKSAweDhhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGIsIChieXRlKSAweDhjLCAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4OGUsIChieXRlKSAweDhmLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTAsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4OTMsIChieXRlKSAweDk0LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTUsIChieXRlKSAweDk2LCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4OTgsIChieXRlKSAweDk5LAorICAgICAgICAgICAgKGJ5dGUpIDB4OWEsIChieXRlKSAweDliLCAoYnl0ZSkgMHg5YywgKGJ5dGUpIDB4OWQsIChieXRlKSAweDllLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWYsIChieXRlKSAweGEwLCAoYnl0ZSkgMHhhMSwgKGJ5dGUpIDB4YTIsIChieXRlKSAweGEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTQsIChieXRlKSAweGE1LCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4YTcsIChieXRlKSAweGE4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTksIChieXRlKSAweGFhLCAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4YWMsIChieXRlKSAweGFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWUsIChieXRlKSAweGFmLCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4YjEsIChieXRlKSAweGIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjMsIChieXRlKSAweGI0LCAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4YjYsIChieXRlKSAweGI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjgsIChieXRlKSAweGI5LCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4YmIsIChieXRlKSAweGJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmQsIChieXRlKSAweGJlLCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzIsIChieXRlKSAweGMzLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4YzUsIChieXRlKSAweGM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzcsIChieXRlKSAweGM4LCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4Y2EsIChieXRlKSAweGNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGNkLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4Y2YsIChieXRlKSAweGQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGQyLCAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGQ1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4ZDksIChieXRlKSAweGRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGRjLCAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4ZGUsIChieXRlKSAweGRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUxLCAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ZTMsIChieXRlKSAweGU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTUsIChieXRlKSAweGU2LCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4ZTgsIChieXRlKSAweGU5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGViLCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4ZWQsIChieXRlKSAweGVlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4ZjIsIChieXRlKSAweGYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGY1LCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZhLCAoYnl0ZSkgMHhmYiwgKGJ5dGUpIDB4ZmMsIChieXRlKSAweGZkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZmLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDgsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDBjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGQsIChieXRlKSAweDBlLCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4MTAsIChieXRlKSAweDExLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4MTUsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTcsIChieXRlKSAweDE4LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4MWEsIChieXRlKSAweDFiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWMsIChieXRlKSAweDFkLCAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4MWYsIChieXRlKSAweDIwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIyLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4MjQsIChieXRlKSAweDI1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjYsIChieXRlKSAweDI3LCAoYnl0ZSkgMHgyOCwgKGJ5dGUpIDB4MjksIChieXRlKSAweDJhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmIsIChieXRlKSAweDJjLCAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4MmUsIChieXRlKSAweDJmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgzMiwgKGJ5dGUpIDB4MzMsIChieXRlKSAweDM0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4MzgsIChieXRlKSAweDM5LAorICAgICAgICAgICAgKGJ5dGUpIDB4M2EsIChieXRlKSAweDNiLCAoYnl0ZSkgMHgzYywgKGJ5dGUpIDB4M2QsIChieXRlKSAweDNlLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2YsIChieXRlKSAweDQwLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4NDIsIChieXRlKSAweDQzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDQsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4NDcsIChieXRlKSAweDQ4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDksIChieXRlKSAweDRhLCAoYnl0ZSkgMHg0YiwgKGJ5dGUpIDB4NGMsIChieXRlKSAweDRkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGUsIChieXRlKSAweDRmLCAoYnl0ZSkgMHg1MCwgKGJ5dGUpIDB4NTEsIChieXRlKSAweDUyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NTYsIChieXRlKSAweDU3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTgsIChieXRlKSAweDU5LCAoYnl0ZSkgMHg1YSwgKGJ5dGUpIDB4NWIsIChieXRlKSAweDVjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWQsIChieXRlKSAweDVlLCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4NjAsIChieXRlKSAweDYxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYzLCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjcsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NmEsIChieXRlKSAweDZiLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmMsIChieXRlKSAweDZkLCAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4NmYsIChieXRlKSAweDcwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzEsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzYsIChieXRlKSAweDc3LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4NzksIChieXRlKSAweDdhLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2IsIChieXRlKSAweDdjLCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4N2UsIChieXRlKSAweDdmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4ODMsIChieXRlKSAweDg0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODUsIChieXRlKSAweDg2LCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4ODgsIChieXRlKSAweDg5LAorICAgICAgICAgICAgKGJ5dGUpIDB4OGEsIChieXRlKSAweDhiLCAoYnl0ZSkgMHg4YywgKGJ5dGUpIDB4OGQsIChieXRlKSAweDhlLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGYsIChieXRlKSAweDkwLCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4OTIsIChieXRlKSAweDkzLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTQsIChieXRlKSAweDk1LCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4OTcsIChieXRlKSAweDk4LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTksIChieXRlKSAweDlhLCAoYnl0ZSkgMHg5YiwgKGJ5dGUpIDB4OWMsIChieXRlKSAweDlkLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWUsIChieXRlKSAweDlmLCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4YTEsIChieXRlKSAweGEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTMsIChieXRlKSAweGE0LCAoYnl0ZSkgMHhhNSwgKGJ5dGUpIDB4YTYsIChieXRlKSAweGE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTgsIChieXRlKSAweGE5LCAoYnl0ZSkgMHhhYSwgKGJ5dGUpIDB4YWIsIChieXRlKSAweGFjLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWQsIChieXRlKSAweGFlLCAoYnl0ZSkgMHhhZiwgKGJ5dGUpIDB4YjAsIChieXRlKSAweGIxLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjIsIChieXRlKSAweGIzLCAoYnl0ZSkgMHhiNCwgKGJ5dGUpIDB4YjUsIChieXRlKSAweGI2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjcsIChieXRlKSAweGI4LCAoYnl0ZSkgMHhiOSwgKGJ5dGUpIDB4YmEsIChieXRlKSAweGJiLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmMsIChieXRlKSAweGJkLCAoYnl0ZSkgMHhiZSwgKGJ5dGUpIDB4YmYsIChieXRlKSAweGMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzEsIChieXRlKSAweGMyLCAoYnl0ZSkgMHhjMywgKGJ5dGUpIDB4YzQsIChieXRlKSAweGM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzYsIChieXRlKSAweGM3LCAoYnl0ZSkgMHhjOCwgKGJ5dGUpIDB4YzksIChieXRlKSAweGNhLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGNjLCAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGNmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGQxLCAoYnl0ZSkgMHhkMiwgKGJ5dGUpIDB4ZDMsIChieXRlKSAweGQ0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGQ2LCAoYnl0ZSkgMHhkNywgKGJ5dGUpIDB4ZDgsIChieXRlKSAweGQ5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGEsIChieXRlKSAweGRiLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4ZGQsIChieXRlKSAweGRlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweGUzLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGU1LCAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4ZTcsIChieXRlKSAweGU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTksIChieXRlKSAweGVhLCAoYnl0ZSkgMHhlYiwgKGJ5dGUpIDB4ZWMsIChieXRlKSAweGVkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGVmLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjEsIChieXRlKSAweGYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjMsIChieXRlKSAweGY0LCAoYnl0ZSkgMHhmNSwgKGJ5dGUpIDB4ZjYsIChieXRlKSAweGY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGY5LCAoYnl0ZSkgMHhmYSwgKGJ5dGUpIDB4ZmIsIChieXRlKSAweGZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmQsIChieXRlKSAweGZlLCAoYnl0ZSkgMHhmZiB9OworCisgICAgLyoqCisgICAgICogInZhbGlkIiBlbmNvZGluZyBmb3IgRFNBIC0gbm8gYWxnIHBhcmFtcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBkc2FFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb05QID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4MzAsCisgICAgICAgICAgICAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA3LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4ODYsCisgICAgICAgICAgICAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDM4LCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDQsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MDgsCisgICAgICAgICAgICAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MGEsIChieXRlKSAweDBiLCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MGQsCisgICAgICAgICAgICAoYnl0ZSkgMHgwZSwgKGJ5dGUpIDB4MGYsIChieXRlKSAweDEwLCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4MTIsCisgICAgICAgICAgICAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4MTQsIChieXRlKSAweDE1LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MTcsCisgICAgICAgICAgICAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MTksIChieXRlKSAweDFhLCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4MWMsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4MWUsIChieXRlKSAweDFmLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjEsCisgICAgICAgICAgICAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MjMsIChieXRlKSAweDI0LCAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4MjYsCisgICAgICAgICAgICAoYnl0ZSkgMHgyNywgKGJ5dGUpIDB4MjgsIChieXRlKSAweDI5LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4MmIsCisgICAgICAgICAgICAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4MmQsIChieXRlKSAweDJlLCAoYnl0ZSkgMHgyZiwgKGJ5dGUpIDB4MzAsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDMzLCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MzUsCisgICAgICAgICAgICAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MzcsIChieXRlKSAweDM4LCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4M2EsCisgICAgICAgICAgICAoYnl0ZSkgMHgzYiwgKGJ5dGUpIDB4M2MsIChieXRlKSAweDNkLCAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4M2YsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NDQsCisgICAgICAgICAgICAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4NDYsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksCisgICAgICAgICAgICAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4NGIsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4NGUsCisgICAgICAgICAgICAoYnl0ZSkgMHg0ZiwgKGJ5dGUpIDB4NTAsIChieXRlKSAweDUxLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4NTMsCisgICAgICAgICAgICAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NTUsIChieXRlKSAweDU2LCAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4NTgsCisgICAgICAgICAgICAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4NWEsIChieXRlKSAweDViLCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NWQsCisgICAgICAgICAgICAoYnl0ZSkgMHg1ZSwgKGJ5dGUpIDB4NWYsIChieXRlKSAweDYwLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NjIsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjcsCisgICAgICAgICAgICAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4NjksIChieXRlKSAweDZhLCAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4NmMsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4NzEsCisgICAgICAgICAgICAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NzYsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4NzgsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4N2IsCisgICAgICAgICAgICAoYnl0ZSkgMHg3YywgKGJ5dGUpIDB4N2QsIChieXRlKSAweDdlLCAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4ODAsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDgzLCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4ODUsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4ODcsIChieXRlKSAweDg4LCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4OGEsCisgICAgICAgICAgICAoYnl0ZSkgMHg4YiwgKGJ5dGUpIDB4OGMsIChieXRlKSAweDhkLCAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4OGYsCisgICAgICAgICAgICAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDkyLCAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4OTQsCisgICAgICAgICAgICAoYnl0ZSkgMHg5NSwgKGJ5dGUpIDB4OTYsIChieXRlKSAweDk3LCAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4OTksCisgICAgICAgICAgICAoYnl0ZSkgMHg5YSwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDljLCAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4OWUsCisgICAgICAgICAgICAoYnl0ZSkgMHg5ZiwgKGJ5dGUpIDB4YTAsIChieXRlKSAweGExLCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4YTMsCisgICAgICAgICAgICAoYnl0ZSkgMHhhNCwgKGJ5dGUpIDB4YTUsIChieXRlKSAweGE2LCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4YTgsCisgICAgICAgICAgICAoYnl0ZSkgMHhhOSwgKGJ5dGUpIDB4YWEsIChieXRlKSAweGFiLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4YWQsCisgICAgICAgICAgICAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4YWYsIChieXRlKSAweGIwLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4YjIsCisgICAgICAgICAgICAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4YjQsIChieXRlKSAweGI1LCAoYnl0ZSkgMHhiNiwgKGJ5dGUpIDB4YjcsCisgICAgICAgICAgICAoYnl0ZSkgMHhiOCwgKGJ5dGUpIDB4YjksIChieXRlKSAweGJhLCAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4YmMsCisgICAgICAgICAgICAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4YmUsIChieXRlKSAweGJmLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzEsCisgICAgICAgICAgICAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4YzMsIChieXRlKSAweGM0LCAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4YzYsCisgICAgICAgICAgICAoYnl0ZSkgMHhjNywgKGJ5dGUpIDB4YzgsIChieXRlKSAweGM5LCAoYnl0ZSkgMHhjYSwgKGJ5dGUpIDB4Y2IsCisgICAgICAgICAgICAoYnl0ZSkgMHhjYywgKGJ5dGUpIDB4Y2QsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhjZiwgKGJ5dGUpIDB4ZDAsCisgICAgICAgICAgICAoYnl0ZSkgMHhkMSwgKGJ5dGUpIDB4ZDIsIChieXRlKSAweGQzLCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZDUsCisgICAgICAgICAgICAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4ZDcsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4ZGEsCisgICAgICAgICAgICAoYnl0ZSkgMHhkYiwgKGJ5dGUpIDB4ZGMsIChieXRlKSAweGRkLCAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4ZGYsCisgICAgICAgICAgICAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTEsIChieXRlKSAweGUyLCAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4ZTQsCisgICAgICAgICAgICAoYnl0ZSkgMHhlNSwgKGJ5dGUpIDB4ZTYsIChieXRlKSAweGU3LCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4ZTksCisgICAgICAgICAgICAoYnl0ZSkgMHhlYSwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGVjLCAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4ZWUsCisgICAgICAgICAgICAoYnl0ZSkgMHhlZiwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYxLCAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4ZjMsCisgICAgICAgICAgICAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4ZjUsIChieXRlKSAweGY2LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4ZjgsCisgICAgICAgICAgICAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4ZmEsIChieXRlKSAweGZiLCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4ZmQsCisgICAgICAgICAgICAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4ZmYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDcsCisgICAgICAgICAgICAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDBhLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MGMsCisgICAgICAgICAgICAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MGUsIChieXRlKSAweDBmLCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4MTEsCisgICAgICAgICAgICAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDE0LCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MTYsCisgICAgICAgICAgICAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MTgsIChieXRlKSAweDE5LCAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4MWIsCisgICAgICAgICAgICAoYnl0ZSkgMHgxYywgKGJ5dGUpIDB4MWQsIChieXRlKSAweDFlLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MjAsCisgICAgICAgICAgICAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDIzLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4MjUsCisgICAgICAgICAgICAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4MjcsIChieXRlKSAweDI4LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4MmEsCisgICAgICAgICAgICAoYnl0ZSkgMHgyYiwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDJkLCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4MmYsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzQsCisgICAgICAgICAgICAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM3LCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzksCisgICAgICAgICAgICAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4M2IsIChieXRlKSAweDNjLCAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4M2UsCisgICAgICAgICAgICAoYnl0ZSkgMHgzZiwgKGJ5dGUpIDB4NDAsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4NDMsCisgICAgICAgICAgICAoYnl0ZSkgMHg0NCwgKGJ5dGUpIDB4NDUsIChieXRlKSAweDQ2LCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NDgsCisgICAgICAgICAgICAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NGEsIChieXRlKSAweDRiLCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4NGQsCisgICAgICAgICAgICAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4NGYsIChieXRlKSAweDUwLCAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4NTIsCisgICAgICAgICAgICAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NTQsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4NTcsCisgICAgICAgICAgICAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4NTksIChieXRlKSAweDVhLCAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4NWMsCisgICAgICAgICAgICAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4NjEsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDY0LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjYsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NywgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4NmIsCisgICAgICAgICAgICAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4NmQsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NzAsCisgICAgICAgICAgICAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzUsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDc4LCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4N2EsCisgICAgICAgICAgICAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4N2MsIChieXRlKSAweDdkLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4N2YsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgyLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4ODQsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDg3LCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4ODksCisgICAgICAgICAgICAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4OGIsIChieXRlKSAweDhjLCAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4OGUsCisgICAgICAgICAgICAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4OTAsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4OTMsCisgICAgICAgICAgICAoYnl0ZSkgMHg5NCwgKGJ5dGUpIDB4OTUsIChieXRlKSAweDk2LCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4OTgsCisgICAgICAgICAgICAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4OWEsIChieXRlKSAweDliLCAoYnl0ZSkgMHg5YywgKGJ5dGUpIDB4OWQsCisgICAgICAgICAgICAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4OWYsIChieXRlKSAweGEwLCAoYnl0ZSkgMHhhMSwgKGJ5dGUpIDB4YTIsCisgICAgICAgICAgICAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4YTQsIChieXRlKSAweGE1LCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4YTcsCisgICAgICAgICAgICAoYnl0ZSkgMHhhOCwgKGJ5dGUpIDB4YTksIChieXRlKSAweGFhLCAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4YWMsCisgICAgICAgICAgICAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4YWUsIChieXRlKSAweGFmLCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4YjEsCisgICAgICAgICAgICAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4YjMsIChieXRlKSAweGI0LCAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4YjYsCisgICAgICAgICAgICAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4YjgsIChieXRlKSAweGI5LCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4YmIsCisgICAgICAgICAgICAoYnl0ZSkgMHhiYywgKGJ5dGUpIDB4YmQsIChieXRlKSAweGJlLCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4YzAsCisgICAgICAgICAgICAoYnl0ZSkgMHhjMSwgKGJ5dGUpIDB4YzIsIChieXRlKSAweGMzLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4YzUsCisgICAgICAgICAgICAoYnl0ZSkgMHhjNiwgKGJ5dGUpIDB4YzcsIChieXRlKSAweGM4LCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4Y2EsCisgICAgICAgICAgICAoYnl0ZSkgMHhjYiwgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGNkLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4Y2YsCisgICAgICAgICAgICAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGQyLCAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ZDQsCisgICAgICAgICAgICAoYnl0ZSkgMHhkNSwgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4ZDksCisgICAgICAgICAgICAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGRjLCAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4ZGUsCisgICAgICAgICAgICAoYnl0ZSkgMHhkZiwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUxLCAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ZTMsCisgICAgICAgICAgICAoYnl0ZSkgMHhlNCwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweGU2LCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4ZTgsCisgICAgICAgICAgICAoYnl0ZSkgMHhlOSwgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGViLCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4ZWQsCisgICAgICAgICAgICAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4ZjIsCisgICAgICAgICAgICAoYnl0ZSkgMHhmMywgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGY1LCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4ZjcsCisgICAgICAgICAgICAoYnl0ZSkgMHhmOCwgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZhLCAoYnl0ZSkgMHhmYiwgKGJ5dGUpIDB4ZmMsCisgICAgICAgICAgICAoYnl0ZSkgMHhmZCwgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZmLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDYsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MDgsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4MGIsCisgICAgICAgICAgICAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MGQsIChieXRlKSAweDBlLCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4MTAsCisgICAgICAgICAgICAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4MTUsCisgICAgICAgICAgICAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MTcsIChieXRlKSAweDE4LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4MWEsCisgICAgICAgICAgICAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4MWMsIChieXRlKSAweDFkLCAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4MWYsCisgICAgICAgICAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIyLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4MjQsCisgICAgICAgICAgICAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4MjYsIChieXRlKSAweDI3LCAoYnl0ZSkgMHgyOCwgKGJ5dGUpIDB4MjksCisgICAgICAgICAgICAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4MmIsIChieXRlKSAweDJjLCAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4MmUsCisgICAgICAgICAgICAoYnl0ZSkgMHgyZiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgzMiwgKGJ5dGUpIDB4MzMsCisgICAgICAgICAgICAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4MzgsCisgICAgICAgICAgICAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4M2EsIChieXRlKSAweDNiLCAoYnl0ZSkgMHgzYywgKGJ5dGUpIDB4M2QsCisgICAgICAgICAgICAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4M2YsIChieXRlKSAweDQwLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4NDIsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NDQsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4NDcsCisgICAgICAgICAgICAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDRhLCAoYnl0ZSkgMHg0YiwgKGJ5dGUpIDB4NGMsCisgICAgICAgICAgICAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4NGUsIChieXRlKSAweDRmLCAoYnl0ZSkgMHg1MCwgKGJ5dGUpIDB4NTEsCisgICAgICAgICAgICAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NTYsCisgICAgICAgICAgICAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4NTgsIChieXRlKSAweDU5LCAoYnl0ZSkgMHg1YSwgKGJ5dGUpIDB4NWIsCisgICAgICAgICAgICAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NWQsIChieXRlKSAweDVlLCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4NjAsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYzLCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4NjUsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjcsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NmEsCisgICAgICAgICAgICAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDZkLCAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4NmYsCisgICAgICAgICAgICAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4NzEsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NzQsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NzYsIChieXRlKSAweDc3LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4NzksCisgICAgICAgICAgICAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4N2IsIChieXRlKSAweDdjLCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4N2UsCisgICAgICAgICAgICAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4ODMsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4ODUsIChieXRlKSAweDg2LCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4ODgsCisgICAgICAgICAgICAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4OGEsIChieXRlKSAweDhiLCAoYnl0ZSkgMHg4YywgKGJ5dGUpIDB4OGQsCisgICAgICAgICAgICAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4OGYsIChieXRlKSAweDkwLCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4OTIsCisgICAgICAgICAgICAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4OTQsIChieXRlKSAweDk1LCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4OTcsCisgICAgICAgICAgICAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4OTksIChieXRlKSAweDlhLCAoYnl0ZSkgMHg5YiwgKGJ5dGUpIDB4OWMsCisgICAgICAgICAgICAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4OWUsIChieXRlKSAweDlmLCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4YTEsCisgICAgICAgICAgICAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4YTMsIChieXRlKSAweGE0LCAoYnl0ZSkgMHhhNSwgKGJ5dGUpIDB4YTYsCisgICAgICAgICAgICAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4YTgsIChieXRlKSAweGE5LCAoYnl0ZSkgMHhhYSwgKGJ5dGUpIDB4YWIsCisgICAgICAgICAgICAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4YWQsIChieXRlKSAweGFlLCAoYnl0ZSkgMHhhZiwgKGJ5dGUpIDB4YjAsCisgICAgICAgICAgICAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4YjIsIChieXRlKSAweGIzLCAoYnl0ZSkgMHhiNCwgKGJ5dGUpIDB4YjUsCisgICAgICAgICAgICAoYnl0ZSkgMHhiNiwgKGJ5dGUpIDB4YjcsIChieXRlKSAweGI4LCAoYnl0ZSkgMHhiOSwgKGJ5dGUpIDB4YmEsCisgICAgICAgICAgICAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4YmMsIChieXRlKSAweGJkLCAoYnl0ZSkgMHhiZSwgKGJ5dGUpIDB4YmYsCisgICAgICAgICAgICAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzEsIChieXRlKSAweGMyLCAoYnl0ZSkgMHhjMywgKGJ5dGUpIDB4YzQsCisgICAgICAgICAgICAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4YzYsIChieXRlKSAweGM3LCAoYnl0ZSkgMHhjOCwgKGJ5dGUpIDB4YzksCisgICAgICAgICAgICAoYnl0ZSkgMHhjYSwgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGNjLCAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4Y2UsCisgICAgICAgICAgICAoYnl0ZSkgMHhjZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGQxLCAoYnl0ZSkgMHhkMiwgKGJ5dGUpIDB4ZDMsCisgICAgICAgICAgICAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGQ2LCAoYnl0ZSkgMHhkNywgKGJ5dGUpIDB4ZDgsCisgICAgICAgICAgICAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4ZGEsIChieXRlKSAweGRiLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4ZGQsCisgICAgICAgICAgICAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMSwgKGJ5dGUpIDB4ZTIsCisgICAgICAgICAgICAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGU1LCAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4ZTcsCisgICAgICAgICAgICAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4ZTksIChieXRlKSAweGVhLCAoYnl0ZSkgMHhlYiwgKGJ5dGUpIDB4ZWMsCisgICAgICAgICAgICAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGVmLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjEsCisgICAgICAgICAgICAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4ZjMsIChieXRlKSAweGY0LCAoYnl0ZSkgMHhmNSwgKGJ5dGUpIDB4ZjYsCisgICAgICAgICAgICAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGY5LCAoYnl0ZSkgMHhmYSwgKGJ5dGUpIDB4ZmIsCisgICAgICAgICAgICAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4ZmQsIChieXRlKSAweGZlLCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDcsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MGEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwZSwgKGJ5dGUpIDB4MGYsCisgICAgICAgICAgICAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4MTEsIChieXRlKSAweDEyLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4MTQsCisgICAgICAgICAgICAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MTYsIChieXRlKSAweDE3LCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MTksCisgICAgICAgICAgICAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4MWIsIChieXRlKSAweDFjLCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4MWUsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MjMsCisgICAgICAgICAgICAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4MjUsIChieXRlKSAweDI2LCAoYnl0ZSkgMHgyNywgKGJ5dGUpIDB4MjgsCisgICAgICAgICAgICAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDJiLCAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4MmQsCisgICAgICAgICAgICAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4MmYsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MzIsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzQsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MzcsCisgICAgICAgICAgICAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzksIChieXRlKSAweDNhLCAoYnl0ZSkgMHgzYiwgKGJ5dGUpIDB4M2MsCisgICAgICAgICAgICAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4M2UsIChieXRlKSAweDNmLCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4NDEsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4NDMsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4NDYsCisgICAgICAgICAgICAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ5LCAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4NGIsCisgICAgICAgICAgICAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4NGQsIChieXRlKSAweDRlLCAoYnl0ZSkgMHg0ZiwgKGJ5dGUpIDB4NTAsCisgICAgICAgICAgICAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDUzLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NTUsCisgICAgICAgICAgICAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDU4LCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4NWEsCisgICAgICAgICAgICAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4NWMsIChieXRlKSAweDVkLCAoYnl0ZSkgMHg1ZSwgKGJ5dGUpIDB4NWYsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4NjQsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY3LCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4NjksCisgICAgICAgICAgICAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4NmIsIChieXRlKSAweDZjLCAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4NmUsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NzAsIChieXRlKSAweDcxLCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NzMsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzUsIChieXRlKSAweDc2LCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4NzgsCisgICAgICAgICAgICAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4N2EsIChieXRlKSAweDdiLCAoYnl0ZSkgMHg3YywgKGJ5dGUpIDB4N2QsCisgICAgICAgICAgICAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4N2YsIChieXRlKSAweDgwLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ODIsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4ODQsIChieXRlKSAweDg1LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4ODcsCisgICAgICAgICAgICAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4ODksIChieXRlKSAweDhhLCAoYnl0ZSkgMHg4YiwgKGJ5dGUpIDB4OGMsCisgICAgICAgICAgICAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4OGUsIChieXRlKSAweDhmLCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4OTEsCisgICAgICAgICAgICAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4OTMsIChieXRlKSAweDk0LCAoYnl0ZSkgMHg5NSwgKGJ5dGUpIDB4OTYsCisgICAgICAgICAgICAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4OTgsIChieXRlKSAweDk5LCAoYnl0ZSkgMHg5YSwgKGJ5dGUpIDB4OWIsCisgICAgICAgICAgICAoYnl0ZSkgMHg5YywgKGJ5dGUpIDB4OWQsIChieXRlKSAweDllLCAoYnl0ZSkgMHg5ZiwgKGJ5dGUpIDB4YTAsCisgICAgICAgICAgICAoYnl0ZSkgMHhhMSwgKGJ5dGUpIDB4YTIsIChieXRlKSAweGEzLCAoYnl0ZSkgMHhhNCwgKGJ5dGUpIDB4YTUsCisgICAgICAgICAgICAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4YTcsIChieXRlKSAweGE4LCAoYnl0ZSkgMHhhOSwgKGJ5dGUpIDB4YWEsCisgICAgICAgICAgICAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4YWMsIChieXRlKSAweGFkLCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4YWYsCisgICAgICAgICAgICAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4YjEsIChieXRlKSAweGIyLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4YjQsCisgICAgICAgICAgICAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4YjYsIChieXRlKSAweGI3LCAoYnl0ZSkgMHhiOCwgKGJ5dGUpIDB4YjksCisgICAgICAgICAgICAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4YmIsIChieXRlKSAweGJjLCAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4YmUsCisgICAgICAgICAgICAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMxLCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4YzMsCisgICAgICAgICAgICAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4YzUsIChieXRlKSAweGM2LCAoYnl0ZSkgMHhjNywgKGJ5dGUpIDB4YzgsCisgICAgICAgICAgICAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4Y2EsIChieXRlKSAweGNiLCAoYnl0ZSkgMHhjYywgKGJ5dGUpIDB4Y2QsCisgICAgICAgICAgICAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4Y2YsIChieXRlKSAweGQwLCAoYnl0ZSkgMHhkMSwgKGJ5dGUpIDB4ZDIsCisgICAgICAgICAgICAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGQ1LCAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4ZDcsCisgICAgICAgICAgICAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4ZDksIChieXRlKSAweGRhLCAoYnl0ZSkgMHhkYiwgKGJ5dGUpIDB4ZGMsCisgICAgICAgICAgICAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4ZGUsIChieXRlKSAweGRmLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTEsCisgICAgICAgICAgICAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ZTMsIChieXRlKSAweGU0LCAoYnl0ZSkgMHhlNSwgKGJ5dGUpIDB4ZTYsCisgICAgICAgICAgICAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4ZTgsIChieXRlKSAweGU5LCAoYnl0ZSkgMHhlYSwgKGJ5dGUpIDB4ZWIsCisgICAgICAgICAgICAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4ZWQsIChieXRlKSAweGVlLCAoYnl0ZSkgMHhlZiwgKGJ5dGUpIDB4ZjAsCisgICAgICAgICAgICAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4ZjIsIChieXRlKSAweGYzLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4ZjUsCisgICAgICAgICAgICAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGY4LCAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4ZmEsCisgICAgICAgICAgICAoYnl0ZSkgMHhmYiwgKGJ5dGUpIDB4ZmMsIChieXRlKSAweGZkLCAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4ZmYsIH07CisKKyAgICAvKioKKyAgICAgKiAidmFsaWQiIGVuY29kaW5nIGZvciBESCB3aXRoIGFsZyBwYXJhbXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZGhFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyA9IG5ldyBieXRlW10geworICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDgyLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MmEsIChieXRlKSAweDg2LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4ODYsIChieXRlKSAweGY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MGQsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGYyLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4YzUsIChieXRlKSAweDM4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzksIChieXRlKSAweGI2LCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTcsIChieXRlKSAweGExLCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4NGMsIChieXRlKSAweGVjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmIsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4MWEsIChieXRlKSAweDM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODUsIChieXRlKSAweDU0LCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDUyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjQsIChieXRlKSAweGJmLCAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4MzIsIChieXRlKSAweGQ4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDIsIChieXRlKSAweGFjLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4MjgsIChieXRlKSAweDRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweGY2LCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzIsIChieXRlKSAweGNmLCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4N2IsIChieXRlKSAweGUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzIsIChieXRlKSAweGZhLCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MTIsIChieXRlKSAweGE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDIsIChieXRlKSAweGJhLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGZiLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmQsIChieXRlKSAweDlmLCAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4OWEsIChieXRlKSAweDU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NmIsIChieXRlKSAweGI2LCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDNhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzEsIChieXRlKSAweGYzLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NWUsIChieXRlKSAweDZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGEsIChieXRlKSAweGQwLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4ZTUsIChieXRlKSAweDYwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzYsIChieXRlKSAweDU3LCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4ODMsIChieXRlKSAweDRkLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmMsIChieXRlKSAweGFhLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTksIChieXRlKSAweGFjLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzksIChieXRlKSAweDAxLCAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4YWIsIChieXRlKSAweGFiLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDE5LCAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4ZjgsIChieXRlKSAweDRjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDMsIChieXRlKSAweDlmLCAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4YTYsIChieXRlKSAweDcxLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTIsIChieXRlKSAweDA2LCAoYnl0ZSkgMHhjNywgKGJ5dGUpIDB4ODksIChieXRlKSAweDcwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzQsIChieXRlKSAweGM2LCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4MWYsIChieXRlKSAweDA1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NGEsIChieXRlKSAweDViLCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZiLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTgsIChieXRlKSAweDYzLCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4OWMsIChieXRlKSAweDEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTMsIChieXRlKSAweGIzLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MGMsIChieXRlKSAweGNkLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2MsIChieXRlKSAweGMzLCAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4YTMsIChieXRlKSAweDhhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDcsIChieXRlKSAweGI0LCAoYnl0ZSkgMHhlOSwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTksIChieXRlKSAweGE4LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweGI4LCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZTcsIChieXRlKSAweDg3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NGUsIChieXRlKSAweGYzLCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4MTAsIChieXRlKSAweGRkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsIChieXRlKSAweDVkLCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGYwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWYsIChieXRlKSAweDZhLCAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4YjAsIChieXRlKSAweGYxLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGEsIChieXRlKSAweGI2LCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4MzksIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDUsIChieXRlKSAweDI0LCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4MTAsIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzQsIChieXRlKSAweDA4LCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MWQsIChieXRlKSAweGFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjksIChieXRlKSAweGYwLCAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4ZGIsIChieXRlKSAweDI0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODksIChieXRlKSAweDcyLCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4MGQsIChieXRlKSAweDU3LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTQsIChieXRlKSAweGIwLCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4YzIsIChieXRlKSAweDM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDUsIChieXRlKSAweDVhLCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4YTEsIChieXRlKSAweGEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDEsIChieXRlKSAweGU0LCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4YTMsIChieXRlKSAweDQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGIsIChieXRlKSAweDljLCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDYxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDksIChieXRlKSAweDA1LCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4YzUsIChieXRlKSAweGU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGJkLCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4ZjUsIChieXRlKSAweDc4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzIsIChieXRlKSAweDkyLCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4NjAsIChieXRlKSAweDA3LAorICAgICAgICAgICAgKGJ5dGUpIDB4M2UsIChieXRlKSAweDU3LCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4ZjYsIChieXRlKSAweDk3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MWYsIChieXRlKSAweGVhLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4YTMsIChieXRlKSAweDE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTcsIChieXRlKSAweDVhLCAoYnl0ZSkgMHg5YiwgKGJ5dGUpIDB4ZjYsIChieXRlKSAweGQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGYsIChieXRlKSAweGU5LCAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTMsIChieXRlKSAweDlhLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4NGYsIChieXRlKSAweGQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjksIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweGZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDgyLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA3LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDBhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDBjLCAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MGUsIChieXRlKSAweDBmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTAsIChieXRlKSAweDExLCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTUsIChieXRlKSAweDE2LCAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MTgsIChieXRlKSAweDE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MWEsIChieXRlKSAweDFiLCAoYnl0ZSkgMHgxYywgKGJ5dGUpIDB4MWQsIChieXRlKSAweDFlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWYsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDIzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjQsIChieXRlKSAweDI1LCAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4MjcsIChieXRlKSAweDI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjksIChieXRlKSAweDJhLCAoYnl0ZSkgMHgyYiwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDJkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmUsIChieXRlKSAweDJmLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzMsIChieXRlKSAweDM0LCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzgsIChieXRlKSAweDM5LCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4M2IsIChieXRlKSAweDNjLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2QsIChieXRlKSAweDNlLCAoYnl0ZSkgMHgzZiwgKGJ5dGUpIDB4NDAsIChieXRlKSAweDQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDIsIChieXRlKSAweDQzLCAoYnl0ZSkgMHg0NCwgKGJ5dGUpIDB4NDUsIChieXRlKSAweDQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDcsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NGEsIChieXRlKSAweDRiLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGMsIChieXRlKSAweDRkLCAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4NGYsIChieXRlKSAweDUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTEsIChieXRlKSAweDUyLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NTQsIChieXRlKSAweDU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTYsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4NTksIChieXRlKSAweDVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWIsIChieXRlKSAweDVjLCAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NywgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NmEsIChieXRlKSAweDZiLCAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4NmQsIChieXRlKSAweDZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmYsIChieXRlKSAweDcwLCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc1LCAoYnl0ZSkgMHg3NiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDc4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzksIChieXRlKSAweDdhLCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4N2MsIChieXRlKSAweDdkLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2UsIChieXRlKSAweDdmLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODMsIChieXRlKSAweDg0LCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDg3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODgsIChieXRlKSAweDg5LCAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4OGIsIChieXRlKSAweDhjLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGQsIChieXRlKSAweDhlLCAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4OTAsIChieXRlKSAweDkxLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTIsIChieXRlKSAweDkzLCAoYnl0ZSkgMHg5NCwgKGJ5dGUpIDB4OTUsIChieXRlKSAweDk2LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTcsIChieXRlKSAweDk4LCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4OWEsIChieXRlKSAweDliLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWMsIChieXRlKSAweDlkLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4OWYsIChieXRlKSAweGEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTEsIChieXRlKSAweGEyLCAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4YTQsIChieXRlKSAweGE1LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTYsIChieXRlKSAweGE3LCAoYnl0ZSkgMHhhOCwgKGJ5dGUpIDB4YTksIChieXRlKSAweGFhLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWIsIChieXRlKSAweGFjLCAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4YWUsIChieXRlKSAweGFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjAsIChieXRlKSAweGIxLCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4YjMsIChieXRlKSAweGI0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjUsIChieXRlKSAweGI2LCAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4YjgsIChieXRlKSAweGI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YmEsIChieXRlKSAweGJiLCAoYnl0ZSkgMHhiYywgKGJ5dGUpIDB4YmQsIChieXRlKSAweGJlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmYsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMSwgKGJ5dGUpIDB4YzIsIChieXRlKSAweGMzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzQsIChieXRlKSAweGM1LCAoYnl0ZSkgMHhjNiwgKGJ5dGUpIDB4YzcsIChieXRlKSAweGM4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzksIChieXRlKSAweGNhLCAoYnl0ZSkgMHhjYiwgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGNkLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGNmLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDMsIChieXRlKSAweGQ0LCAoYnl0ZSkgMHhkNSwgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDgsIChieXRlKSAweGQ5LCAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGRjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGQsIChieXRlKSAweGRlLCAoYnl0ZSkgMHhkZiwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweGUzLCAoYnl0ZSkgMHhlNCwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweGU2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTcsIChieXRlKSAweGU4LCAoYnl0ZSkgMHhlOSwgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGViLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWMsIChieXRlKSAweGVkLCAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGYwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjEsIChieXRlKSAweGYyLCAoYnl0ZSkgMHhmMywgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGY1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjYsIChieXRlKSAweGY3LCAoYnl0ZSkgMHhmOCwgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmIsIChieXRlKSAweGZjLCAoYnl0ZSkgMHhmZCwgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDA0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDUsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MDgsIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MGEsIChieXRlKSAweDBiLCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MGQsIChieXRlKSAweDBlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGYsIChieXRlKSAweDEwLCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTQsIChieXRlKSAweDE1LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MTcsIChieXRlKSAweDE4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTksIChieXRlKSAweDFhLCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4MWMsIChieXRlKSAweDFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWUsIChieXRlKSAweDFmLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjMsIChieXRlKSAweDI0LCAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4MjYsIChieXRlKSAweDI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjgsIChieXRlKSAweDI5LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4MmIsIChieXRlKSAweDJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmQsIChieXRlKSAweDJlLCAoYnl0ZSkgMHgyZiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzIsIChieXRlKSAweDMzLCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzcsIChieXRlKSAweDM4LCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4M2EsIChieXRlKSAweDNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2MsIChieXRlKSAweDNkLCAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4M2YsIChieXRlKSAweDQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDEsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NDQsIChieXRlKSAweDQ1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDYsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGIsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4NGUsIChieXRlKSAweDRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTAsIChieXRlKSAweDUxLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTUsIChieXRlKSAweDU2LCAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4NTgsIChieXRlKSAweDU5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NWEsIChieXRlKSAweDViLCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NWQsIChieXRlKSAweDVlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWYsIChieXRlKSAweDYwLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjcsIChieXRlKSAweDY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjksIChieXRlKSAweDZhLCAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDZkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4NzEsIChieXRlKSAweDcyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NzYsIChieXRlKSAweDc3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzgsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4N2IsIChieXRlKSAweDdjLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2QsIChieXRlKSAweDdlLCAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDgzLCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4ODUsIChieXRlKSAweDg2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODcsIChieXRlKSAweDg4LCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4OGEsIChieXRlKSAweDhiLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGMsIChieXRlKSAweDhkLCAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4OGYsIChieXRlKSAweDkwLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTEsIChieXRlKSAweDkyLCAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4OTQsIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTYsIChieXRlKSAweDk3LCAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4OTksIChieXRlKSAweDlhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWIsIChieXRlKSAweDljLCAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4OWUsIChieXRlKSAweDlmLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTAsIChieXRlKSAweGExLCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4YTMsIChieXRlKSAweGE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTUsIChieXRlKSAweGE2LCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4YTgsIChieXRlKSAweGE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YWEsIChieXRlKSAweGFiLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4YWQsIChieXRlKSAweGFlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWYsIChieXRlKSAweGIwLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4YjIsIChieXRlKSAweGIzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjQsIChieXRlKSAweGI1LCAoYnl0ZSkgMHhiNiwgKGJ5dGUpIDB4YjcsIChieXRlKSAweGI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjksIChieXRlKSAweGJhLCAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4YmMsIChieXRlKSAweGJkLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmUsIChieXRlKSAweGJmLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzEsIChieXRlKSAweGMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzMsIChieXRlKSAweGM0LCAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4YzYsIChieXRlKSAweGM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzgsIChieXRlKSAweGM5LCAoYnl0ZSkgMHhjYSwgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGNjLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2QsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhjZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDIsIChieXRlKSAweGQzLCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDcsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4ZGEsIChieXRlKSAweGRiLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGMsIChieXRlKSAweGRkLCAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTEsIChieXRlKSAweGUyLCAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTYsIChieXRlKSAweGU3LCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4ZTksIChieXRlKSAweGVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGVjLCAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYxLCAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4ZjMsIChieXRlKSAweGY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjUsIChieXRlKSAweGY2LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmEsIChieXRlKSAweGZiLCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4ZmQsIChieXRlKSAweGZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDcsIChieXRlKSAweDA4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDBhLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDBkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGUsIChieXRlKSAweDBmLCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4MTEsIChieXRlKSAweDEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTMsIChieXRlKSAweDE0LCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MTYsIChieXRlKSAweDE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTgsIChieXRlKSAweDE5LCAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4MWIsIChieXRlKSAweDFjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWQsIChieXRlKSAweDFlLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDIxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjIsIChieXRlKSAweDIzLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4MjUsIChieXRlKSAweDI2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjcsIChieXRlKSAweDI4LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDJiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmMsIChieXRlKSAweDJkLCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4MmYsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzQsIChieXRlKSAweDM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM3LCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzksIChieXRlKSAweDNhLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2IsIChieXRlKSAweDNjLCAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4M2UsIChieXRlKSAweDNmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDAsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4NDMsIChieXRlKSAweDQ0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDUsIChieXRlKSAweDQ2LCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NGEsIChieXRlKSAweDRiLCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4NGQsIChieXRlKSAweDRlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGYsIChieXRlKSAweDUwLCAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDUzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTksIChieXRlKSAweDVhLCAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4NWMsIChieXRlKSAweDVkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWUsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjMsIChieXRlKSAweDY0LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4NmIsIChieXRlKSAweDZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmQsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NzAsIChieXRlKSAweDcxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzUsIChieXRlKSAweDc2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweDc4LCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4N2EsIChieXRlKSAweDdiLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2MsIChieXRlKSAweDdkLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4N2YsIChieXRlKSAweDgwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgyLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4ODQsIChieXRlKSAweDg1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODYsIChieXRlKSAweDg3LCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4ODksIChieXRlKSAweDhhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGIsIChieXRlKSAweDhjLCAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4OGUsIChieXRlKSAweDhmLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTAsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4OTMsIChieXRlKSAweDk0LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTUsIChieXRlKSAweDk2LCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4OTgsIChieXRlKSAweDk5LAorICAgICAgICAgICAgKGJ5dGUpIDB4OWEsIChieXRlKSAweDliLCAoYnl0ZSkgMHg5YywgKGJ5dGUpIDB4OWQsIChieXRlKSAweDllLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWYsIChieXRlKSAweGEwLCAoYnl0ZSkgMHhhMSwgKGJ5dGUpIDB4YTIsIChieXRlKSAweGEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTQsIChieXRlKSAweGE1LCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4YTcsIChieXRlKSAweGE4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTksIChieXRlKSAweGFhLCAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4YWMsIChieXRlKSAweGFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWUsIChieXRlKSAweGFmLCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4YjEsIChieXRlKSAweGIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjMsIChieXRlKSAweGI0LCAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4YjYsIChieXRlKSAweGI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjgsIChieXRlKSAweGI5LCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4YmIsIChieXRlKSAweGJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmQsIChieXRlKSAweGJlLCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzIsIChieXRlKSAweGMzLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4YzUsIChieXRlKSAweGM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzcsIChieXRlKSAweGM4LCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4Y2EsIChieXRlKSAweGNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGNkLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4Y2YsIChieXRlKSAweGQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGQyLCAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGQ1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4ZDksIChieXRlKSAweGRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGRjLCAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4ZGUsIChieXRlKSAweGRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUxLCAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ZTMsIChieXRlKSAweGU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTUsIChieXRlKSAweGU2LCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4ZTgsIChieXRlKSAweGU5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGViLCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4ZWQsIChieXRlKSAweGVlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4ZjIsIChieXRlKSAweGYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGY1LCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZhLCAoYnl0ZSkgMHhmYiwgKGJ5dGUpIDB4ZmMsIChieXRlKSAweGZkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZmLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDgsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDBjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGQsIChieXRlKSAweDBlLCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4MTAsIChieXRlKSAweDExLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4MTUsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTcsIChieXRlKSAweDE4LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4MWEsIChieXRlKSAweDFiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWMsIChieXRlKSAweDFkLCAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4MWYsIChieXRlKSAweDIwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIyLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4MjQsIChieXRlKSAweDI1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjYsIChieXRlKSAweDI3LCAoYnl0ZSkgMHgyOCwgKGJ5dGUpIDB4MjksIChieXRlKSAweDJhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmIsIChieXRlKSAweDJjLCAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4MmUsIChieXRlKSAweDJmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgzMiwgKGJ5dGUpIDB4MzMsIChieXRlKSAweDM0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4MzgsIChieXRlKSAweDM5LAorICAgICAgICAgICAgKGJ5dGUpIDB4M2EsIChieXRlKSAweDNiLCAoYnl0ZSkgMHgzYywgKGJ5dGUpIDB4M2QsIChieXRlKSAweDNlLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2YsIChieXRlKSAweDQwLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4NDIsIChieXRlKSAweDQzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDQsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4NDcsIChieXRlKSAweDQ4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDksIChieXRlKSAweDRhLCAoYnl0ZSkgMHg0YiwgKGJ5dGUpIDB4NGMsIChieXRlKSAweDRkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGUsIChieXRlKSAweDRmLCAoYnl0ZSkgMHg1MCwgKGJ5dGUpIDB4NTEsIChieXRlKSAweDUyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NTYsIChieXRlKSAweDU3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTgsIChieXRlKSAweDU5LCAoYnl0ZSkgMHg1YSwgKGJ5dGUpIDB4NWIsIChieXRlKSAweDVjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWQsIChieXRlKSAweDVlLCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4NjAsIChieXRlKSAweDYxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYzLCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjcsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NmEsIChieXRlKSAweDZiLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmMsIChieXRlKSAweDZkLCAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4NmYsIChieXRlKSAweDcwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzEsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzYsIChieXRlKSAweDc3LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4NzksIChieXRlKSAweDdhLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2IsIChieXRlKSAweDdjLCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4N2UsIChieXRlKSAweDdmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4ODMsIChieXRlKSAweDg0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODUsIChieXRlKSAweDg2LCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4ODgsIChieXRlKSAweDg5LAorICAgICAgICAgICAgKGJ5dGUpIDB4OGEsIChieXRlKSAweDhiLCAoYnl0ZSkgMHg4YywgKGJ5dGUpIDB4OGQsIChieXRlKSAweDhlLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGYsIChieXRlKSAweDkwLCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4OTIsIChieXRlKSAweDkzLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTQsIChieXRlKSAweDk1LCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4OTcsIChieXRlKSAweDk4LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTksIChieXRlKSAweDlhLCAoYnl0ZSkgMHg5YiwgKGJ5dGUpIDB4OWMsIChieXRlKSAweDlkLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWUsIChieXRlKSAweDlmLCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4YTEsIChieXRlKSAweGEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTMsIChieXRlKSAweGE0LCAoYnl0ZSkgMHhhNSwgKGJ5dGUpIDB4YTYsIChieXRlKSAweGE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTgsIChieXRlKSAweGE5LCAoYnl0ZSkgMHhhYSwgKGJ5dGUpIDB4YWIsIChieXRlKSAweGFjLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWQsIChieXRlKSAweGFlLCAoYnl0ZSkgMHhhZiwgKGJ5dGUpIDB4YjAsIChieXRlKSAweGIxLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjIsIChieXRlKSAweGIzLCAoYnl0ZSkgMHhiNCwgKGJ5dGUpIDB4YjUsIChieXRlKSAweGI2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjcsIChieXRlKSAweGI4LCAoYnl0ZSkgMHhiOSwgKGJ5dGUpIDB4YmEsIChieXRlKSAweGJiLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmMsIChieXRlKSAweGJkLCAoYnl0ZSkgMHhiZSwgKGJ5dGUpIDB4YmYsIChieXRlKSAweGMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzEsIChieXRlKSAweGMyLCAoYnl0ZSkgMHhjMywgKGJ5dGUpIDB4YzQsIChieXRlKSAweGM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzYsIChieXRlKSAweGM3LCAoYnl0ZSkgMHhjOCwgKGJ5dGUpIDB4YzksIChieXRlKSAweGNhLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGNjLCAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGNmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGQxLCAoYnl0ZSkgMHhkMiwgKGJ5dGUpIDB4ZDMsIChieXRlKSAweGQ0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGQ2LCAoYnl0ZSkgMHhkNywgKGJ5dGUpIDB4ZDgsIChieXRlKSAweGQ5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGEsIChieXRlKSAweGRiLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4ZGQsIChieXRlKSAweGRlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweGUzLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGU1LCAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4ZTcsIChieXRlKSAweGU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTksIChieXRlKSAweGVhLCAoYnl0ZSkgMHhlYiwgKGJ5dGUpIDB4ZWMsIChieXRlKSAweGVkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGVmLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjEsIChieXRlKSAweGYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjMsIChieXRlKSAweGY0LCAoYnl0ZSkgMHhmNSwgKGJ5dGUpIDB4ZjYsIChieXRlKSAweGY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGY5LCAoYnl0ZSkgMHhmYSwgKGJ5dGUpIDB4ZmIsIChieXRlKSAweGZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmQsIChieXRlKSAweGZlLCAoYnl0ZSkgMHhmZiB9OworCisgICAgLyoqCisgICAgICogInZhbGlkIiBlbmNvZGluZyBmb3IgREggLSBubyBhbGcgcGFyYW1zCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGRoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9OUCA9IG5ldyBieXRlW10geworICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDgyLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGQsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDg2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDgsIChieXRlKSAweDg2LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4MGQsIChieXRlKSAweDAxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDA2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDcsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MGEsIChieXRlKSAweDBiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGMsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwZSwgKGJ5dGUpIDB4MGYsIChieXRlKSAweDEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTEsIChieXRlKSAweDEyLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4MTQsIChieXRlKSAweDE1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTYsIChieXRlKSAweDE3LCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MTksIChieXRlKSAweDFhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWIsIChieXRlKSAweDFjLCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4MWUsIChieXRlKSAweDFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MjMsIChieXRlKSAweDI0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjUsIChieXRlKSAweDI2LCAoYnl0ZSkgMHgyNywgKGJ5dGUpIDB4MjgsIChieXRlKSAweDI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MmEsIChieXRlKSAweDJiLCAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4MmQsIChieXRlKSAweDJlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmYsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDMzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzQsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MzcsIChieXRlKSAweDM4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzksIChieXRlKSAweDNhLCAoYnl0ZSkgMHgzYiwgKGJ5dGUpIDB4M2MsIChieXRlKSAweDNkLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2UsIChieXRlKSAweDNmLCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDMsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4NDYsIChieXRlKSAweDQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ5LCAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4NGIsIChieXRlKSAweDRjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGQsIChieXRlKSAweDRlLCAoYnl0ZSkgMHg0ZiwgKGJ5dGUpIDB4NTAsIChieXRlKSAweDUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTIsIChieXRlKSAweDUzLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NTUsIChieXRlKSAweDU2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTcsIChieXRlKSAweDU4LCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4NWEsIChieXRlKSAweDViLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWMsIChieXRlKSAweDVkLCAoYnl0ZSkgMHg1ZSwgKGJ5dGUpIDB4NWYsIChieXRlKSAweDYwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjEsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY3LCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4NjksIChieXRlKSAweDZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmIsIChieXRlKSAweDZjLCAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzAsIChieXRlKSAweDcxLCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDc0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsIChieXRlKSAweDc2LCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4NzgsIChieXRlKSAweDc5LAorICAgICAgICAgICAgKGJ5dGUpIDB4N2EsIChieXRlKSAweDdiLCAoYnl0ZSkgMHg3YywgKGJ5dGUpIDB4N2QsIChieXRlKSAweDdlLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2YsIChieXRlKSAweDgwLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDgzLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODQsIChieXRlKSAweDg1LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4ODcsIChieXRlKSAweDg4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODksIChieXRlKSAweDhhLCAoYnl0ZSkgMHg4YiwgKGJ5dGUpIDB4OGMsIChieXRlKSAweDhkLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGUsIChieXRlKSAweDhmLCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDkyLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTMsIChieXRlKSAweDk0LCAoYnl0ZSkgMHg5NSwgKGJ5dGUpIDB4OTYsIChieXRlKSAweDk3LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTgsIChieXRlKSAweDk5LCAoYnl0ZSkgMHg5YSwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDljLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWQsIChieXRlKSAweDllLCAoYnl0ZSkgMHg5ZiwgKGJ5dGUpIDB4YTAsIChieXRlKSAweGExLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTIsIChieXRlKSAweGEzLCAoYnl0ZSkgMHhhNCwgKGJ5dGUpIDB4YTUsIChieXRlKSAweGE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTcsIChieXRlKSAweGE4LCAoYnl0ZSkgMHhhOSwgKGJ5dGUpIDB4YWEsIChieXRlKSAweGFiLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWMsIChieXRlKSAweGFkLCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4YWYsIChieXRlKSAweGIwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjEsIChieXRlKSAweGIyLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4YjQsIChieXRlKSAweGI1LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjYsIChieXRlKSAweGI3LCAoYnl0ZSkgMHhiOCwgKGJ5dGUpIDB4YjksIChieXRlKSAweGJhLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmIsIChieXRlKSAweGJjLCAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4YmUsIChieXRlKSAweGJmLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMxLCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4YzMsIChieXRlKSAweGM0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzUsIChieXRlKSAweGM2LCAoYnl0ZSkgMHhjNywgKGJ5dGUpIDB4YzgsIChieXRlKSAweGM5LAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2EsIChieXRlKSAweGNiLCAoYnl0ZSkgMHhjYywgKGJ5dGUpIDB4Y2QsIChieXRlKSAweGNlLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2YsIChieXRlKSAweGQwLCAoYnl0ZSkgMHhkMSwgKGJ5dGUpIDB4ZDIsIChieXRlKSAweGQzLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGQ1LCAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4ZDcsIChieXRlKSAweGQ4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDksIChieXRlKSAweGRhLCAoYnl0ZSkgMHhkYiwgKGJ5dGUpIDB4ZGMsIChieXRlKSAweGRkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGUsIChieXRlKSAweGRmLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTEsIChieXRlKSAweGUyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTMsIChieXRlKSAweGU0LCAoYnl0ZSkgMHhlNSwgKGJ5dGUpIDB4ZTYsIChieXRlKSAweGU3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTgsIChieXRlKSAweGU5LCAoYnl0ZSkgMHhlYSwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGVjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWQsIChieXRlKSAweGVlLCAoYnl0ZSkgMHhlZiwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjIsIChieXRlKSAweGYzLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4ZjUsIChieXRlKSAweGY2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGY4LCAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4ZmEsIChieXRlKSAweGZiLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmMsIChieXRlKSAweGZkLCAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4ZmYsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA3LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDBhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDBjLCAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MGUsIChieXRlKSAweDBmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTAsIChieXRlKSAweDExLCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTUsIChieXRlKSAweDE2LCAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MTgsIChieXRlKSAweDE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MWEsIChieXRlKSAweDFiLCAoYnl0ZSkgMHgxYywgKGJ5dGUpIDB4MWQsIChieXRlKSAweDFlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWYsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDIzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjQsIChieXRlKSAweDI1LCAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4MjcsIChieXRlKSAweDI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjksIChieXRlKSAweDJhLCAoYnl0ZSkgMHgyYiwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDJkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmUsIChieXRlKSAweDJmLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzMsIChieXRlKSAweDM0LCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzgsIChieXRlKSAweDM5LCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4M2IsIChieXRlKSAweDNjLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2QsIChieXRlKSAweDNlLCAoYnl0ZSkgMHgzZiwgKGJ5dGUpIDB4NDAsIChieXRlKSAweDQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDIsIChieXRlKSAweDQzLCAoYnl0ZSkgMHg0NCwgKGJ5dGUpIDB4NDUsIChieXRlKSAweDQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDcsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NGEsIChieXRlKSAweDRiLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGMsIChieXRlKSAweDRkLCAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4NGYsIChieXRlKSAweDUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTEsIChieXRlKSAweDUyLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NTQsIChieXRlKSAweDU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTYsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4NTksIChieXRlKSAweDVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWIsIChieXRlKSAweDVjLCAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NywgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NmEsIChieXRlKSAweDZiLCAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4NmQsIChieXRlKSAweDZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmYsIChieXRlKSAweDcwLCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc1LCAoYnl0ZSkgMHg3NiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDc4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzksIChieXRlKSAweDdhLCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4N2MsIChieXRlKSAweDdkLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2UsIChieXRlKSAweDdmLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODMsIChieXRlKSAweDg0LCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDg3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODgsIChieXRlKSAweDg5LCAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4OGIsIChieXRlKSAweDhjLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGQsIChieXRlKSAweDhlLCAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4OTAsIChieXRlKSAweDkxLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTIsIChieXRlKSAweDkzLCAoYnl0ZSkgMHg5NCwgKGJ5dGUpIDB4OTUsIChieXRlKSAweDk2LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTcsIChieXRlKSAweDk4LCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4OWEsIChieXRlKSAweDliLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWMsIChieXRlKSAweDlkLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4OWYsIChieXRlKSAweGEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTEsIChieXRlKSAweGEyLCAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4YTQsIChieXRlKSAweGE1LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTYsIChieXRlKSAweGE3LCAoYnl0ZSkgMHhhOCwgKGJ5dGUpIDB4YTksIChieXRlKSAweGFhLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWIsIChieXRlKSAweGFjLCAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4YWUsIChieXRlKSAweGFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjAsIChieXRlKSAweGIxLCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4YjMsIChieXRlKSAweGI0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjUsIChieXRlKSAweGI2LCAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4YjgsIChieXRlKSAweGI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YmEsIChieXRlKSAweGJiLCAoYnl0ZSkgMHhiYywgKGJ5dGUpIDB4YmQsIChieXRlKSAweGJlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmYsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMSwgKGJ5dGUpIDB4YzIsIChieXRlKSAweGMzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzQsIChieXRlKSAweGM1LCAoYnl0ZSkgMHhjNiwgKGJ5dGUpIDB4YzcsIChieXRlKSAweGM4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzksIChieXRlKSAweGNhLCAoYnl0ZSkgMHhjYiwgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGNkLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGNmLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDMsIChieXRlKSAweGQ0LCAoYnl0ZSkgMHhkNSwgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDgsIChieXRlKSAweGQ5LCAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGRjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGQsIChieXRlKSAweGRlLCAoYnl0ZSkgMHhkZiwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweGUzLCAoYnl0ZSkgMHhlNCwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweGU2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTcsIChieXRlKSAweGU4LCAoYnl0ZSkgMHhlOSwgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGViLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWMsIChieXRlKSAweGVkLCAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGYwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjEsIChieXRlKSAweGYyLCAoYnl0ZSkgMHhmMywgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGY1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjYsIChieXRlKSAweGY3LCAoYnl0ZSkgMHhmOCwgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmIsIChieXRlKSAweGZjLCAoYnl0ZSkgMHhmZCwgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDA0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDUsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MDgsIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MGEsIChieXRlKSAweDBiLCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MGQsIChieXRlKSAweDBlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGYsIChieXRlKSAweDEwLCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4MTIsIChieXRlKSAweDEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTQsIChieXRlKSAweDE1LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MTcsIChieXRlKSAweDE4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTksIChieXRlKSAweDFhLCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4MWMsIChieXRlKSAweDFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWUsIChieXRlKSAweDFmLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjMsIChieXRlKSAweDI0LCAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4MjYsIChieXRlKSAweDI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjgsIChieXRlKSAweDI5LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4MmIsIChieXRlKSAweDJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmQsIChieXRlKSAweDJlLCAoYnl0ZSkgMHgyZiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzIsIChieXRlKSAweDMzLCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzcsIChieXRlKSAweDM4LCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4M2EsIChieXRlKSAweDNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2MsIChieXRlKSAweDNkLCAoYnl0ZSkgMHgzZSwgKGJ5dGUpIDB4M2YsIChieXRlKSAweDQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDEsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NDQsIChieXRlKSAweDQ1LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDYsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGIsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4NGUsIChieXRlKSAweDRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTAsIChieXRlKSAweDUxLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTUsIChieXRlKSAweDU2LCAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4NTgsIChieXRlKSAweDU5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NWEsIChieXRlKSAweDViLCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NWQsIChieXRlKSAweDVlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWYsIChieXRlKSAweDYwLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjcsIChieXRlKSAweDY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjksIChieXRlKSAweDZhLCAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDZkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4NzEsIChieXRlKSAweDcyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NzYsIChieXRlKSAweDc3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzgsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4N2IsIChieXRlKSAweDdjLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2QsIChieXRlKSAweDdlLCAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDgzLCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4ODUsIChieXRlKSAweDg2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODcsIChieXRlKSAweDg4LCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4OGEsIChieXRlKSAweDhiLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGMsIChieXRlKSAweDhkLCAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4OGYsIChieXRlKSAweDkwLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTEsIChieXRlKSAweDkyLCAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4OTQsIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTYsIChieXRlKSAweDk3LCAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4OTksIChieXRlKSAweDlhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWIsIChieXRlKSAweDljLCAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4OWUsIChieXRlKSAweDlmLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTAsIChieXRlKSAweGExLCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4YTMsIChieXRlKSAweGE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTUsIChieXRlKSAweGE2LCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4YTgsIChieXRlKSAweGE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YWEsIChieXRlKSAweGFiLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4YWQsIChieXRlKSAweGFlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWYsIChieXRlKSAweGIwLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4YjIsIChieXRlKSAweGIzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjQsIChieXRlKSAweGI1LCAoYnl0ZSkgMHhiNiwgKGJ5dGUpIDB4YjcsIChieXRlKSAweGI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjksIChieXRlKSAweGJhLCAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4YmMsIChieXRlKSAweGJkLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmUsIChieXRlKSAweGJmLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzEsIChieXRlKSAweGMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzMsIChieXRlKSAweGM0LCAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4YzYsIChieXRlKSAweGM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzgsIChieXRlKSAweGM5LCAoYnl0ZSkgMHhjYSwgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGNjLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2QsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhjZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDIsIChieXRlKSAweGQzLCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDcsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4ZGEsIChieXRlKSAweGRiLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGMsIChieXRlKSAweGRkLCAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTEsIChieXRlKSAweGUyLCAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTYsIChieXRlKSAweGU3LCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4ZTksIChieXRlKSAweGVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGVjLCAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYxLCAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4ZjMsIChieXRlKSAweGY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjUsIChieXRlKSAweGY2LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmEsIChieXRlKSAweGZiLCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4ZmQsIChieXRlKSAweGZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDcsIChieXRlKSAweDA4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDBhLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDBkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGUsIChieXRlKSAweDBmLCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4MTEsIChieXRlKSAweDEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTMsIChieXRlKSAweDE0LCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MTYsIChieXRlKSAweDE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTgsIChieXRlKSAweDE5LCAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4MWIsIChieXRlKSAweDFjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWQsIChieXRlKSAweDFlLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDIxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjIsIChieXRlKSAweDIzLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4MjUsIChieXRlKSAweDI2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjcsIChieXRlKSAweDI4LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDJiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmMsIChieXRlKSAweDJkLCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4MmYsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzQsIChieXRlKSAweDM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM3LCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzksIChieXRlKSAweDNhLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2IsIChieXRlKSAweDNjLCAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4M2UsIChieXRlKSAweDNmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDAsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4NDMsIChieXRlKSAweDQ0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDUsIChieXRlKSAweDQ2LCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NGEsIChieXRlKSAweDRiLCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4NGQsIChieXRlKSAweDRlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGYsIChieXRlKSAweDUwLCAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDUzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTksIChieXRlKSAweDVhLCAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4NWMsIChieXRlKSAweDVkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWUsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjMsIChieXRlKSAweDY0LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4NmIsIChieXRlKSAweDZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmQsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NzAsIChieXRlKSAweDcxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzUsIChieXRlKSAweDc2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweDc4LCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4N2EsIChieXRlKSAweDdiLAorICAgICAgICAgICAgKGJ5dGUpIDB4N2MsIChieXRlKSAweDdkLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4N2YsIChieXRlKSAweDgwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgyLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4ODQsIChieXRlKSAweDg1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODYsIChieXRlKSAweDg3LCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4ODksIChieXRlKSAweDhhLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGIsIChieXRlKSAweDhjLCAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4OGUsIChieXRlKSAweDhmLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTAsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4OTMsIChieXRlKSAweDk0LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTUsIChieXRlKSAweDk2LCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4OTgsIChieXRlKSAweDk5LAorICAgICAgICAgICAgKGJ5dGUpIDB4OWEsIChieXRlKSAweDliLCAoYnl0ZSkgMHg5YywgKGJ5dGUpIDB4OWQsIChieXRlKSAweDllLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWYsIChieXRlKSAweGEwLCAoYnl0ZSkgMHhhMSwgKGJ5dGUpIDB4YTIsIChieXRlKSAweGEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTQsIChieXRlKSAweGE1LCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4YTcsIChieXRlKSAweGE4LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTksIChieXRlKSAweGFhLCAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4YWMsIChieXRlKSAweGFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWUsIChieXRlKSAweGFmLCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4YjEsIChieXRlKSAweGIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjMsIChieXRlKSAweGI0LCAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4YjYsIChieXRlKSAweGI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YjgsIChieXRlKSAweGI5LCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4YmIsIChieXRlKSAweGJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmQsIChieXRlKSAweGJlLCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzIsIChieXRlKSAweGMzLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4YzUsIChieXRlKSAweGM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzcsIChieXRlKSAweGM4LCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4Y2EsIChieXRlKSAweGNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGNkLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4Y2YsIChieXRlKSAweGQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGQyLCAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGQ1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4ZDksIChieXRlKSAweGRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGRjLCAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4ZGUsIChieXRlKSAweGRmLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUxLCAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ZTMsIChieXRlKSAweGU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTUsIChieXRlKSAweGU2LCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4ZTgsIChieXRlKSAweGU5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGViLCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4ZWQsIChieXRlKSAweGVlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4ZjIsIChieXRlKSAweGYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGY1LCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGY4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZhLCAoYnl0ZSkgMHhmYiwgKGJ5dGUpIDB4ZmMsIChieXRlKSAweGZkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZmLCB9OworCisgICAgLyoqCisgICAgICogVmFsaWQgRFNBIHBhcmFtZXRlcnMgZW5jb2RpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZHNhUGFyYW1zRW5jb2RlZCA9IHsgKGJ5dGUpIDB4MzAsIChieXRlKSAweDgyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDFlLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDlmLCAoYnl0ZSkgMHg1ZSwgKGJ5dGUpIDB4NzYsIChieXRlKSAweDE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTksIChieXRlKSAweGQ4LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4NmIsIChieXRlKSAweDkxLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmQsIChieXRlKSAweDE1LCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4MTQsIChieXRlKSAweDI3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjUsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4MmMsIChieXRlKSAweGVjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDdhLCAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTAsIChieXRlKSAweDI2LCAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTgsIChieXRlKSAweDRhLCAoYnl0ZSkgMHgxYywgKGJ5dGUpIDB4OWEsIChieXRlKSAweGM5LAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2QsIChieXRlKSAweDg1LCAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4MzksIChieXRlKSAweDQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWUsIChieXRlKSAweDU4LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweDIwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODQsIChieXRlKSAweDI4LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4YjksIChieXRlKSAweGNlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzcsIChieXRlKSAweDZkLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4OTksIChieXRlKSAweGZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YTUsIChieXRlKSAweGU4LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4ZTEsIChieXRlKSAweDQ4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGQsIChieXRlKSAweDJlLCAoYnl0ZSkgMHhjZiwgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NmEsIChieXRlKSAweDhlLCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4NGIsIChieXRlKSAweGE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTgsIChieXRlKSAweDg3LCAoYnl0ZSkgMHhkNywgKGJ5dGUpIDB4YWIsIChieXRlKSAweDI2LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGMzLCAoYnl0ZSkgMHhkMSwgKGJ5dGUpIDB4M2IsIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzQsIChieXRlKSAweDk3LCAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4ZGMsIChieXRlKSAweGFiLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWQsIChieXRlKSAweGY1LCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4YWUsIChieXRlKSAweDU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjgsIChieXRlKSAweDg0LCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4OTksIChieXRlKSAweDFiLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDMsIChieXRlKSAweGQwLCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4ZDMsIChieXRlKSAweGRkLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjUsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4YTIsIChieXRlKSAweDkyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjEsIChieXRlKSAweGY4LCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4ZTYsIChieXRlKSAweDI0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjUsIChieXRlKSAweDhmLCAoYnl0ZSkgMHhhNCwgKGJ5dGUpIDB4OTcsIChieXRlKSAweDQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWQsIChieXRlKSAweDNmLCAoYnl0ZSkgMHgyYiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGNiLCAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDlhLAorICAgICAgICAgICAgKGJ5dGUpIDB4YWMsIChieXRlKSAweDdiLCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4YzcsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHg5YSwgKGJ5dGUpIDB4ZmIsIChieXRlKSAweDZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzIsIChieXRlKSAweDE1LCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MmEsIChieXRlKSAweGQ2LCAoYnl0ZSkgMHhjYSwgKGJ5dGUpIDB4NjAsIChieXRlKSAweDEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDcsIChieXRlKSAweGRlLCAoYnl0ZSkgMHg0YiwgKGJ5dGUpIDB4MGYsIChieXRlKSAweGQ2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDM3LCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWQsIChieXRlKSAweDUxLCAoYnl0ZSkgMHgyOCwgKGJ5dGUpIDB4NjQsIChieXRlKSAweGIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmIsIChieXRlKSAweGViLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4YjQsIChieXRlKSAweDE0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MGQsIChieXRlKSAweGFkLCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4YzgsIChieXRlKSAweDFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTYsIChieXRlKSAweDFlLCAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4NTIsIChieXRlKSAweGQ0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDY5LCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4MzMsIChieXRlKSAweGExLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGJjLCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4ZDYsIChieXRlKSAweDY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWYsIChieXRlKSAweDJjLCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4YzcsIChieXRlKSAweDM5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsIChieXRlKSAweDg3LCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4NjEsIChieXRlKSAweGJlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDEsIChieXRlKSAweGNkLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDg1LAorICAgICAgICAgICAgKGJ5dGUpIDB4OTksIChieXRlKSAweDU1LCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NmYsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzAsIChieXRlKSAweDQwLCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDc4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MWYsIChieXRlKSAweGU4LCAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4NWQsIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzcsIChieXRlKSAweGMxLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4OTcsIChieXRlKSAweDc2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTUsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4ODgsIChieXRlKSAweGU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGI4LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4ZjUsIChieXRlKSAweDdmLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTIsIChieXRlKSAweGRhLCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4YTUsIChieXRlKSAweDVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjQsIChieXRlKSAweGM5LCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDc3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTgsIChieXRlKSAweDYwLCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4MzUsIChieXRlKSAweDFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzEsIChieXRlKSAweGZiLCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4MjQsIChieXRlKSAweDZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzQsIChieXRlKSAweDI5LCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4NDcsIChieXRlKSAweGYxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTQsIChieXRlKSAweGFkLCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweDQxLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGQsIChieXRlKSAweDJjLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDVhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjQsIChieXRlKSAweDdmLCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4ZjQsIChieXRlKSAweDBhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmUsIChieXRlKSAweDFkLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweGU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTQsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgyOCwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDVjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzQsIChieXRlKSAweGM4LCAoYnl0ZSkgMHgyMiB9OworCisgICAgLyoqCisgICAgICogVmFsaWQgREggcGFyYW1ldGVycyBlbmNvZGluZworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBkaFBhcmFtc0VuY29kZWQgPSB7IChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MiwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDRmLCAoYnl0ZSkgMHhlYSwKKyAgICAgICAgICAgIChieXRlKSAweGYyLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4YzUsIChieXRlKSAweDM4LCAoYnl0ZSkgMHhjOSwKKyAgICAgICAgICAgIChieXRlKSAweGI2LCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZjgsIChieXRlKSAweGI4LCAoYnl0ZSkgMHgxNywKKyAgICAgICAgICAgIChieXRlKSAweGExLCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4NGMsIChieXRlKSAweGVjLCAoYnl0ZSkgMHg2YiwKKyAgICAgICAgICAgIChieXRlKSAweGQ3LCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4MWEsIChieXRlKSAweDM1LCAoYnl0ZSkgMHg4NSwKKyAgICAgICAgICAgIChieXRlKSAweDU0LCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4NmMsIChieXRlKSAweDUyLCAoYnl0ZSkgMHgyNCwKKyAgICAgICAgICAgIChieXRlKSAweGJmLCAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4MzIsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHg0MiwKKyAgICAgICAgICAgIChieXRlKSAweGFjLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4MjgsIChieXRlKSAweDRmLCAoYnl0ZSkgMHg3NywKKyAgICAgICAgICAgIChieXRlKSAweGY2LCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4ZWEsIChieXRlKSAweGVhLCAoYnl0ZSkgMHg3MiwKKyAgICAgICAgICAgIChieXRlKSAweGNmLCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4N2IsIChieXRlKSAweGUxLCAoYnl0ZSkgMHg3MiwKKyAgICAgICAgICAgIChieXRlKSAweGZhLCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MTIsIChieXRlKSAweGE5LCAoYnl0ZSkgMHg0MiwKKyAgICAgICAgICAgIChieXRlKSAweGJhLCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4ZjQsIChieXRlKSAweGZiLCAoYnl0ZSkgMHhiZCwKKyAgICAgICAgICAgIChieXRlKSAweDlmLCAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4OWEsIChieXRlKSAweDU4LCAoYnl0ZSkgMHg2YiwKKyAgICAgICAgICAgIChieXRlKSAweGI2LCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDNhLCAoYnl0ZSkgMHg3MSwKKyAgICAgICAgICAgIChieXRlKSAweGYzLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NWUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg4YSwKKyAgICAgICAgICAgIChieXRlKSAweGQwLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4ZTUsIChieXRlKSAweDYwLCAoYnl0ZSkgMHg3NiwKKyAgICAgICAgICAgIChieXRlKSAweDU3LCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4ODMsIChieXRlKSAweDRkLCAoYnl0ZSkgMHhiYywKKyAgICAgICAgICAgIChieXRlKSAweGFhLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDQwLCAoYnl0ZSkgMHgxOSwKKyAgICAgICAgICAgIChieXRlKSAweGFjLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4ZDQsIChieXRlKSAweGZjLCAoYnl0ZSkgMHgzOSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4YWIsIChieXRlKSAweGFiLCAoYnl0ZSkgMHg1MywKKyAgICAgICAgICAgIChieXRlKSAweDE5LCAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4ZjgsIChieXRlKSAweDRjLCAoYnl0ZSkgMHhkMywKKyAgICAgICAgICAgIChieXRlKSAweDlmLCAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4YTYsIChieXRlKSAweDcxLCAoYnl0ZSkgMHg5MiwKKyAgICAgICAgICAgIChieXRlKSAweDA2LCAoYnl0ZSkgMHhjNywgKGJ5dGUpIDB4ODksIChieXRlKSAweDcwLCAoYnl0ZSkgMHhjNCwKKyAgICAgICAgICAgIChieXRlKSAweGM2LCAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4MWYsIChieXRlKSAweDA1LCAoYnl0ZSkgMHg0YSwKKyAgICAgICAgICAgIChieXRlKSAweDViLCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4ZjksIChieXRlKSAweGZiLCAoYnl0ZSkgMHg5OCwKKyAgICAgICAgICAgIChieXRlKSAweDYzLCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4OWMsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgwMiwKKyAgICAgICAgICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg5MywKKyAgICAgICAgICAgIChieXRlKSAweGIzLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MGMsIChieXRlKSAweGNkLCAoYnl0ZSkgMHg3YywKKyAgICAgICAgICAgIChieXRlKSAweGMzLCAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4YTMsIChieXRlKSAweDhhLCAoYnl0ZSkgMHhkNywKKyAgICAgICAgICAgIChieXRlKSAweGI0LCAoYnl0ZSkgMHhlOSwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGZhLCAoYnl0ZSkgMHhhOSwKKyAgICAgICAgICAgIChieXRlKSAweGE4LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4ZDYsIChieXRlKSAweGE2LCAoYnl0ZSkgMHgyMCwKKyAgICAgICAgICAgIChieXRlKSAweGI4LCAoYnl0ZSkgMHhkNCwgKGJ5dGUpIDB4ZTcsIChieXRlKSAweDg3LCAoYnl0ZSkgMHg0ZSwKKyAgICAgICAgICAgIChieXRlKSAweGYzLCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4MTAsIChieXRlKSAweGRkLCAoYnl0ZSkgMHg3NSwKKyAgICAgICAgICAgIChieXRlKSAweDVkLCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhlZiwKKyAgICAgICAgICAgIChieXRlKSAweDZhLCAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4YjAsIChieXRlKSAweGYxLCAoYnl0ZSkgMHg4YSwKKyAgICAgICAgICAgIChieXRlKSAweGI2LCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4MzksIChieXRlKSAweDk1LCAoYnl0ZSkgMHhkNSwKKyAgICAgICAgICAgIChieXRlKSAweDI0LCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4MTAsIChieXRlKSAweDk1LCAoYnl0ZSkgMHgzNCwKKyAgICAgICAgICAgIChieXRlKSAweDA4LCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MWQsIChieXRlKSAweGFmLCAoYnl0ZSkgMHg2OSwKKyAgICAgICAgICAgIChieXRlKSAweGYwLCAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4ZGIsIChieXRlKSAweDI0LCAoYnl0ZSkgMHg4OSwKKyAgICAgICAgICAgIChieXRlKSAweDcyLCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4MGQsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg5NCwKKyAgICAgICAgICAgIChieXRlKSAweGIwLCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4YzIsIChieXRlKSAweDM3LCAoYnl0ZSkgMHg0NSwKKyAgICAgICAgICAgIChieXRlKSAweDVhLCAoYnl0ZSkgMHhmYywgKGJ5dGUpIDB4YTEsIChieXRlKSAweGEwLCAoYnl0ZSkgMHg0MSwKKyAgICAgICAgICAgIChieXRlKSAweGU0LCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4YTMsIChieXRlKSAweDQwLCAoYnl0ZSkgMHg4YiwKKyAgICAgICAgICAgIChieXRlKSAweDljLCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4NjMsIChieXRlKSAweDYxLCAoYnl0ZSkgMHhkOSwKKyAgICAgICAgICAgIChieXRlKSAweDA1LCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4YzUsIChieXRlKSAweGU4LCAoYnl0ZSkgMHhmNywKKyAgICAgICAgICAgIChieXRlKSAweGJkLCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4ZjUsIChieXRlKSAweDc4LCAoYnl0ZSkgMHhjMiwKKyAgICAgICAgICAgIChieXRlKSAweDkyLCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4NjAsIChieXRlKSAweDA3LCAoYnl0ZSkgMHgzZSwKKyAgICAgICAgICAgIChieXRlKSAweDU3LCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4ZjYsIChieXRlKSAweDk3LCAoYnl0ZSkgMHgxZiwKKyAgICAgICAgICAgIChieXRlKSAweGVhLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4YTMsIChieXRlKSAweDE5LCAoYnl0ZSkgMHhhNywKKyAgICAgICAgICAgIChieXRlKSAweDVhLCAoYnl0ZSkgMHg5YiwgKGJ5dGUpIDB4ZjYsIChieXRlKSAweGQyLCAoYnl0ZSkgMHgwZiwKKyAgICAgICAgICAgIChieXRlKSAweGU5LCAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHg5MywKKyAgICAgICAgICAgIChieXRlKSAweDlhLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4NGYsIChieXRlKSAweGQ2LCAoYnl0ZSkgMHgyOSwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweGZmIH07CisKKyAgICAvKioKKyAgICAgKiBwcmV0ZW5kcyB0byBiZSBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBlbmNyeXB0ZWREYXRhOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIGJ5dGVbXT4gdmFsaWRFUEtJRW5jb2RpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBieXRlW10+KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgYnl0ZVtdPiB2YWxpZEVQS0lFbmNvZGluZ3NOUCA9IG5ldyBIYXNoTWFwPFN0cmluZywgYnl0ZVtdPigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIGJ5dGVbXT4gdmFsaWRBUEVuY29kaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgYnl0ZVtdPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdmFsaWRFUEtJRW5jb2RpbmdzLnB1dCgiREgiLCBkaEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKTsKKyAgICAgICAgdmFsaWRFUEtJRW5jb2RpbmdzLnB1dCgiRElGRklFSEVMTE1BTiIsIGRoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8pOworICAgICAgICB2YWxpZEVQS0lFbmNvZGluZ3MucHV0KCJESUZGSUUtSEVMTE1BTiIsIGRoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8pOworICAgICAgICB2YWxpZEVQS0lFbmNvZGluZ3MucHV0KCIxLjIuODQwLjExMzU0OS4xLjMuMSIsCisgICAgICAgICAgICAgICAgZGhFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyk7CisgICAgICAgIHZhbGlkRVBLSUVuY29kaW5nc05QLnB1dCgiREgiLCBkaEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvTlApOworICAgICAgICB2YWxpZEVQS0lFbmNvZGluZ3NOUC5wdXQoIkRJRkZJRUhFTExNQU4iLCBkaEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvTlApOworICAgICAgICB2YWxpZEVQS0lFbmNvZGluZ3NOUC5wdXQoIkRJRkZJRS1IRUxMTUFOIiwgZGhFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb05QKTsKKyAgICAgICAgdmFsaWRFUEtJRW5jb2RpbmdzLnB1dCgiRFNBIiwgZHNhRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8pOworICAgICAgICB2YWxpZEVQS0lFbmNvZGluZ3MucHV0KCIxLjIuODQwLjEwMDQwLjQuMSIsIGRzYUVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKTsKKyAgICAgICAgdmFsaWRFUEtJRW5jb2RpbmdzTlAucHV0KCJESUZGSUUtSEVMTE1BTiIsIGRoRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9OUCk7CisgICAgICAgIHZhbGlkRVBLSUVuY29kaW5nc05QLnB1dCgiRFNBIiwgZHNhRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9OUCk7CisgICAgICAgIHZhbGlkQVBFbmNvZGluZ3MucHV0KCJESCIsIGRoUGFyYW1zRW5jb2RlZCk7CisgICAgICAgIHZhbGlkQVBFbmNvZGluZ3MucHV0KCJESUZGSUVIRUxMTUFOIiwgZGhQYXJhbXNFbmNvZGVkKTsKKyAgICAgICAgdmFsaWRBUEVuY29kaW5ncy5wdXQoIkRJRkZJRS1IRUxMTUFOIiwgZGhQYXJhbXNFbmNvZGVkKTsKKyAgICAgICAgdmFsaWRBUEVuY29kaW5ncy5wdXQoIjEuMi44NDAuMTEzNTQ5LjEuMy4xIiwgZGhQYXJhbXNFbmNvZGVkKTsKKyAgICAgICAgdmFsaWRBUEVuY29kaW5ncy5wdXQoIkRTQSIsIGRzYVBhcmFtc0VuY29kZWQpOworICAgICAgICB2YWxpZEFQRW5jb2RpbmdzLnB1dCgiMS4yLjg0MC4xMDA0MC40LjEiLCBkc2FQYXJhbXNFbmNvZGVkKTsKKworICAgICAgICBlbmNyeXB0ZWREYXRhID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5jcnlwdGVkRGF0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZW5jcnlwdGVkRGF0YVtpXSA9IChieXRlKSBpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxnb3JpdGhtX25hbWVzL3N0YW5kYXJkX25hbWVzIHRvIGJlIHVzZWQgaW4gdGVzdHMgIkRTQSIgYW5kICJESCIgbXVzdCBiZQorICAgICAqIGFsd2F5cyBwcmVzZW50ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdW10gYWxnTmFtZTAgPSBuZXcgU3RyaW5nW11bXSB7CisgICAgICAgICAgICB7ICJEU0EiLCAiRFNBIiB9LAorICAgICAgICAgICAgeyAiREgiLCAiRGlmZmllSGVsbG1hbiIsICJEaWZmaWUtSGVsbG1hbiIgfSwKKyAgICAgICAgICAgIHsgIjEuMi44NDAuMTAwNDAuNC4xIiwgIkRTQSIgfSwgCisgICAgICAgICAgICB7ICIxLjIuODQwLjExMzU0OS4xLjEuMSIsICJSU0EiIH0sCisgICAgICAgICAgICB7ICIxLjIuODQwLjExMzU0OS4xLjMuMSIsICJEaWZmaWVIZWxsbWFuIiB9LAorICAgICAgICAgICAgeyAiMS4yLjg0MC4xMTM1NDkuMS41LjMiLCAicGJlV2l0aE1ENUFuZERFUy1DQkMiIH0sCisgICAgICAgICAgICB7ICIxLjIuODQwLjExMzU0OS4xLjEyLjEuMyIsICJwYmVXaXRoU0hBQW5kMy1LZXlUcmlwbGVERVMtQ0JDIiB9LAorICAgICAgICAgICAgLy8gICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjEuMTIuMS42IiwgInBiZVdpdGhTSEFBbmQ0MEJpdFJDMi1DQkMifSwKKyAgICAgICAgICAgIHsgIjEuMi44NDAuMTEzNTQ5LjMuMiIsICJSQzItQ0JDIiB9LAorICAgICAgICAgICAgeyAiMS4yLjg0MC4xMTM1NDkuMy4zIiwgIlJDMi1FQkMiIH0sCisgICAgICAgICAgICB7ICIxLjIuODQwLjExMzU0OS4zLjQiLCAiUkM0IiB9LAorICAgICAgICAgICAgeyAiMS4yLjg0MC4xMTM1NDkuMy41IiwgIlJDNFdpdGhNQUMiIH0sCisgICAgICAgICAgICB7ICIxLjIuODQwLjExMzU0OS4zLjYiLCAiREVTeC1DQkMiIH0sCisgICAgICAgICAgICB7ICIxLjIuODQwLjExMzU0OS4zLjciLCAiVHJpcGxlREVTLUNCQyIgfSwKKyAgICAgICAgICAgIHsgIjEuMi44NDAuMTEzNTQ5LjMuOCIsICJyYzVDQkMiIH0sCisgICAgICAgICAgICB7ICIxLjIuODQwLjExMzU0OS4zLjkiLCAiUkM1LUNCQyIgfSwKKyAgICAgICAgICAgIHsgIjEuMi44NDAuMTEzNTQ5LjMuMTAiLCAiREVTQ0RNRiIgfSwgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdmFsaWQgZW5jb2Rpbmcgb2YgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gSG93ZXZlciBlbmNvZGVkIHByaXZhdGUKKyAgICAgKiBrZXkgZmllbGQgKGVuY3J5cHRlZERhdGEpIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgZW5jcnlwdGVkIGRhdGEuCisgICAgICogCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRWYWxpZEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRW5jb2RpbmcoCisgICAgICAgICAgICBTdHJpbmcgYWxnTmFtZSwgYm9vbGVhbiBpbmNsdWRpbmdBbGdQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhbGdOYW1lVUMgPSBhbGdOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIGJ5dGVbXSByZXQgPSBpbmNsdWRpbmdBbGdQYXJhbWV0ZXJzID8gdmFsaWRFUEtJRW5jb2RpbmdzCisgICAgICAgICAgICAgICAgLmdldChhbGdOYW1lVUMpIDogdmFsaWRFUEtJRW5jb2RpbmdzTlAuZ2V0KGFsZ05hbWVVQyk7CisgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJldC5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oIk5vIGVuY29kaW5nIGF2YWlsYWJsZSBmb3IgIgorICAgICAgICAgICAgICAgICsgYWxnTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0VmFsaWRFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb0VuY29kaW5nKFN0cmluZyBhbGdOYW1lKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRWYWxpZEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvRW5jb2RpbmcoYWxnTmFtZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB2YWxpZCBlbmNvZGluZyBvZiBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBIb3dldmVyIGVuY29kZWQgcHJpdmF0ZQorICAgICAqIGtleSBmaWVsZCAoZW5jcnlwdGVkRGF0YSkgZG9lcyBub3QgY29udGFpbiB2YWxpZCBlbmNyeXB0ZWQgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFBhcmFtZXRlcnNFbmNvZGluZyhTdHJpbmcgYWxnTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYWxnTmFtZVVDID0gYWxnTmFtZS50b1VwcGVyQ2FzZSgpOworICAgICAgICBieXRlW10gcmV0ID0gdmFsaWRBUEVuY29kaW5ncy5nZXQoYWxnTmFtZVVDKTsKKyAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oIk5vIEFQIGVuY29kaW5nIGF2YWlsYWJsZSBmb3IgIgorICAgICAgICAgICAgICAgICsgYWxnTmFtZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlDaXBoZXIuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeUNpcGhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWIyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlDaXBoZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuc3VwcG9ydDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworCitpbXBvcnQgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlclNwaTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2hvcnRCdWZmZXJFeGNlcHRpb247CisKKy8qKgorICoKKyAqIENpcGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGVzdGluZworICovCitwdWJsaWMgY2xhc3MgTXlDaXBoZXIgZXh0ZW5kcyBDaXBoZXJTcGkgeworCisgICAgcHVibGljIE15Q2lwaGVyKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVNldE1vZGUoU3RyaW5nIG1vZGUpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVNldFBhZGRpbmcoU3RyaW5nIHBhZGRpbmcpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghIlBLQ1M1UGFkZGluZyIuZXF1YWxzKHBhZGRpbmcpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24ocGFkZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldEJsb2NrU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIDExMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE91dHB1dFNpemUoaW50IGlucHV0TGVuKSB7CisgICAgICAgIHJldHVybiBpbnB1dExlbiArIDEwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0SVYoKSB7CisgICAgICAgIGJ5dGVbXSBiID0gezEsMiwzfTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChpbnQgb3Btb2RlLCBLZXkga2V5LCBTZWN1cmVSYW5kb20gcmFuZG9tKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IG9wbW9kZSwgS2V5IGtleSwKKyAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IG9wbW9kZSwgS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMsCisgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lVXBkYXRlKGJ5dGVbXSBpbnB1dCwgaW50IGlucHV0T2Zmc2V0LCBpbnQgaW5wdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwKKyAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQsIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbChieXRlW10gaW5wdXQsIGludCBpbnB1dE9mZnNldCwgaW50IGlucHV0TGVuKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZURvRmluYWwoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwKKyAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQsIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeUV4ZW1wdGlvbk1lY2hhbmlzbVNwaS5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9zdXBwb3J0L015RXhlbXB0aW9uTWVjaGFuaXNtU3BpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwNzY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeUV4ZW1wdGlvbk1lY2hhbmlzbVNwaS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21TcGk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNob3J0QnVmZmVyRXhjZXB0aW9uOworCisvKioKKyAqIEFkZGl0aW9uYWwgY2xhc3MgZm9yIHZlcmlmaWNhdGlvbiBFeGVtcHRpb25NZWNoYW5pc21TcGkgCisgKiBhbmQgRXhlbXB0aW9uTWVjaGFuaXNtIGNsYXNzZXMKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBNeUV4ZW1wdGlvbk1lY2hhbmlzbVNwaSAgZXh0ZW5kcyBFeGVtcHRpb25NZWNoYW5pc21TcGkgeworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBieXRlQXJyYXlMZW5ndGggPSA1OworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdldExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVBcnJheUxlbmd0aDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZW5FeGVtcHRpb25CbG9iKCkKKyAgICAgICAgICAgIHRocm93cyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IGJ5dGVbYnl0ZUFycmF5TGVuZ3RoXTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdlbkV4ZW1wdGlvbkJsb2IoYnl0ZVtdIG91dHB1dCwgaW50IG91dHB1dE9mZnNldCkKKyAgICAgICAgICAgIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVBcnJheUxlbmd0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE91dHB1dFNpemUoaW50IGlucHV0TGVuKSB7CisgICAgICAgIHJldHVybiAxMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KEtleSBrZXkpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLAorICAgICAgICAgICAgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigia2V5IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiB0bXBLZXkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uKCJJbmNvcnJlY3Qga2V5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW1zKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCisgICAgICAgICAgICBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24geworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJrZXkgaXMgbnVsbCIpOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmICghKGtleSBpbnN0YW5jZW9mIHRtcEtleSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24oIkluY29ycmVjdCBrZXkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oImtleSBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoa2V5IGluc3RhbmNlb2YgdG1wS2V5KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbigiSW5jb3JyZWN0IGtleSIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHB1YmxpYyBjbGFzcyB0bXBLZXkgaW1wbGVtZW50cyBLZXkgeworICAgICAgICBwcml2YXRlIFN0cmluZyBhbGc7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGVuYzsKKyAgICAgICAgcHVibGljIHRtcEtleShTdHJpbmcgYWxnLCBieXRlW10gZW5jKSB7CisgICAgICAgICAgICB0aGlzLmFsZyA9IGFsZzsKKyAgICAgICAgICAgIHRoaXMuZW5jID0gZW5jOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0bXBLZXkiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgeworICAgICAgICAgICAgcmV0dXJuIGFsZzsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZW5jOworICAgICAgICB9CisgICAgfQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHB1YmxpYyBjbGFzcyB0bXAxS2V5IGltcGxlbWVudHMgS2V5IHsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gZW5jOworICAgICAgICBwdWJsaWMgdG1wMUtleShTdHJpbmcgYWxnLCBieXRlW10gZW5jKSB7CisgICAgICAgICAgICB0aGlzLmVuYyA9IGVuYzsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgICAgIHJldHVybiAidG1wMUtleSI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInRtcDFLZXkiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBlbmM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlLZXlBZ3JlZW1lbnRTcGkuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeUtleUFncmVlbWVudFNwaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTU0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlLZXlBZ3JlZW1lbnRTcGkuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKKworaW1wb3J0IGphdmF4LmNyeXB0by5LZXlBZ3JlZW1lbnRTcGk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2hvcnRCdWZmZXJFeGNlcHRpb247CisKKy8qKgorICogQWRkaXRpb25hbCBjbGFzcyBmb3IgdmVyaWZpY2F0aW9uIG9mIEtleUFncmVlbWVudFNwaQorICogYW5kIEtleUFncmVlbWVudCBmdW5jdGlvbmFsaXR5CisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgTXlLZXlBZ3JlZW1lbnRTcGkgZXh0ZW5kcyBLZXlBZ3JlZW1lbnRTcGkgeworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBLZXkgZW5naW5lRG9QaGFzZShLZXkga2V5LCBib29sZWFuIGxhc3RQaGFzZSkKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIWxhc3RQaGFzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibGFzdCBQaGFzZSBpcyBmYWxzZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lR2VuZXJhdGVTZWNyZXQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZW5naW5lR2VuZXJhdGVTZWNyZXQoYnl0ZVtdIHNoYXJlZFNlY3JldCwgaW50IG9mZnNldCkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFNob3J0QnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZWNyZXRLZXkgZW5naW5lR2VuZXJhdGVTZWNyZXQoU3RyaW5nIGFsZ29yaXRobSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICBpZiAoYWxnb3JpdGhtLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oIkFsZ29yaXRobSBpcyBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5IGtleSwgU2VjdXJlUmFuZG9tIHJhbmRvbSkKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXIiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLAorICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlLZXlHZW5lcmF0b3JTcGkuamF2YSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeUtleUdlbmVyYXRvclNwaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjIxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlLZXlHZW5lcmF0b3JTcGkuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworCitpbXBvcnQgamF2YXguY3J5cHRvLktleUdlbmVyYXRvclNwaTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworCisvKioKKyAqIEFkZGl0aW9uYWwgY2xhc3MgZm9yIHZlcmlmaWNhdGlvbiBvZiAKKyAqIEtleUdlbmVyYXRvclNwaSBhbmQgS2V5R2VuZXJhdG9yIGZ1bmN0aW9uYWxpdHkKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBNeUtleUdlbmVyYXRvclNwaSAgZXh0ZW5kcyBLZXlHZW5lcmF0b3JTcGkgeworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZWNyZXRLZXkgZW5naW5lR2VuZXJhdGVLZXkoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMsIFNlY3VyZVJhbmRvbSByYW5kb20pCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oInBhcmFtcyBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KGludCBrZXlzaXplLCBTZWN1cmVSYW5kb20gcmFuZG9tKSB7CisgICAgICAgIGlmIChrZXlzaXplIDw9IDc3KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGtleXNpemUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoU2VjdXJlUmFuZG9tIHJhbmRvbSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJhbmRvbSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeU1hY1NwaS5qYXZhIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9zdXBwb3J0L015TWFjU3BpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxM2MyZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeU1hY1NwaS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworCitpbXBvcnQgamF2YXguY3J5cHRvLk1hY1NwaTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjOworCisvKioKKyAqIEFkZGl0aW9uYWwgY2xhc3MgZm9yIHZlcmlmaWNhdGlvbiBvZiBNYWNHZW5lcmF0b3JTcGkgYW5kIE1hY1NwaQorICogCisgKi8KKworcHVibGljIGNsYXNzIE15TWFjU3BpIGV4dGVuZHMgTWFjU3BpIHsKKyAgIAorICAgIHByaXZhdGUgaW50IGxlbmd0aCA9IDA7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBlbmdpbmVHZXRNYWNMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBTZWNyZXRLZXlTcGVjKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtcyBpcyBudWxsIGFuZCBrZXkgaXMgU2VjcmV0S2V5U3BlYyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKGJ5dGUgaW5wdXQpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisgICAgICAgIGlmIChvZmZzZXQgPj0gMCAmJiBsZW4gPj0gMCkgeworICAgICAgICAgICAgbGVuZ3RoID0gbGVuOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVEb0ZpbmFsKCkgeworICAgICAgICByZXR1cm4gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVSZXNldCgpIHsKKyAgICAgICAgbGVuZ3RoKys7CisgICAgfSAgCit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlTZWNyZXRLZXlGYWN0b3J5U3BpLmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL3N1cHBvcnQvTXlTZWNyZXRLZXlGYWN0b3J5U3BpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiZmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvc3VwcG9ydC9NeVNlY3JldEtleUZhY3RvcnlTcGkuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5zdXBwb3J0OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYzsKKworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleUZhY3RvcnlTcGk7CisKKy8qKgorICogQWRkaXRpb25hbCBjbGFzcyBmb3IgdmVyaWZpY2F0aW9uIG9mIFNlY3JldEtleUZhY3RvcnlTcGkgCisgKiBhbmQgU2VjcmV0S2V5RmFjdG9yeSBmdW5jdGlvbmFsaXR5CisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgTXlTZWNyZXRLZXlGYWN0b3J5U3BpICBleHRlbmRzIFNlY3JldEtleUZhY3RvcnlTcGkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZWNyZXRLZXkgZW5naW5lR2VuZXJhdGVTZWNyZXQoS2V5U3BlYyBrZXlTcGVjKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEtleVNwZWMgZW5naW5lR2V0S2V5U3BlYyhTZWNyZXRLZXkga2V5LCBDbGFzcyBrZXlTcGVjKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFNlY3JldEtleSBlbmdpbmVUcmFuc2xhdGVLZXkoU2VjcmV0S2V5IGtleSkKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvcmVzb3VyY2VzL2h5dHNfZGVzLWVkZTMtY2JjLnRlc3QxLmNpcGhlcnRleHQgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDEuY2lwaGVydGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDdiOTRiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvcmVzb3VyY2VzL2h5dHNfZGVzLWVkZTMtY2JjLnRlc3QxLmNpcGhlcnRleHQKQEAgLTAsMCArMSBAQAorIZ0jb057pkAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDEuaXYgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDEuaXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxZjMzNQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0MS5pdgpAQCAtMCwwICsxIEBACiue9FEGMiNQXApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0MS5rZXkgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDEua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmI1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDEua2V5CkBAIC0wLDAgKzEgQEAKK2ln6o5rWIzctHTqeUEjmHsgHoaP9Bn2JApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0MS5wbGFpbnRleHQgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDEucGxhaW50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODdlZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvcmVzb3VyY2VzL2h5dHNfZGVzLWVkZTMtY2JjLnRlc3QxLnBsYWludGV4dApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIuY2lwaGVydGV4dCBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0Mi5jaXBoZXJ0ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTNmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIuY2lwaGVydGV4dApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIuaXYgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIuaXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NjBmYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0Mi5pdgpAQCAtMCwwICsxIEBACitA9iKNFdCXPApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0Mi5rZXkgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NzZmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIua2V5CkBAIC0wLDAgKzEgQEAKK3GSPLvFKBNH5eLBzqHUkYAfSZ46xuG5JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0Mi5wbGFpbnRleHQgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIucGxhaW50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNWVmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9yZXNvdXJjZXMvaHl0c19kZXMtZWRlMy1jYmMudGVzdDIucGxhaW50ZXh0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5jaXBoZXJ0ZXh0IGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvcmVzb3VyY2VzL2h5dHNfZGVzLWVkZTMtY2JjLnRlc3QzLmNpcGhlcnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkZDYwMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5jaXBoZXJ0ZXh0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5pdiBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5pdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZkZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvcmVzb3VyY2VzL2h5dHNfZGVzLWVkZTMtY2JjLnRlc3QzLml2CkBAIC0wLDAgKzEgQEAKK/eWft5TclsJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvcmVzb3VyY2VzL2h5dHNfZGVzLWVkZTMtY2JjLnRlc3QzLmtleSBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZmQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5rZXkKQEAgLTAsMCArMSBAQAor790vXW+zqETQzrWeUGXJBbWu4LgwPwY2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvcmVzb3VyY2VzL2h5dHNfZGVzLWVkZTMtY2JjLnRlc3QzLnBsYWludGV4dCBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5wbGFpbnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1YmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3Jlc291cmNlcy9oeXRzX2Rlcy1lZGUzLWNiYy50ZXN0My5wbGFpbnRleHQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0JhZFBhZGRpbmdFeGNlcHRpb25UZXN0LmdvbGRlbi4wLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9CYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkNjMzMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9CYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0JhZFBhZGRpbmdFeGNlcHRpb25UZXN0LmdvbGRlbi4xLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9CYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3YzFmNAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9CYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0JhZFBhZGRpbmdFeGNlcHRpb25UZXN0LmdvbGRlbi4yLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9CYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwMjhiZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9CYWRQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuZ29sZGVuLjAuc2VyIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuZ29sZGVuLjAuc2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzY3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9zZXJpYWxpemF0aW9uL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuZ29sZGVuLjEuc2VyIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuZ29sZGVuLjEuc2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YjMwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9zZXJpYWxpemF0aW9uL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuZ29sZGVuLjIuc2VyIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvblRlc3QuZ29sZGVuLjIuc2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDFhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9zZXJpYWxpemF0aW9uL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb25UZXN0LmdvbGRlbi4wLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4MjNmYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb25UZXN0LmdvbGRlbi4xLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5YWU1NgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb25UZXN0LmdvbGRlbi4yLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzODI2YwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL05vU3VjaFBhZGRpbmdFeGNlcHRpb25UZXN0LmdvbGRlbi4wLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkYzA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL05vU3VjaFBhZGRpbmdFeGNlcHRpb25UZXN0LmdvbGRlbi4xLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExMjE4NwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL05vU3VjaFBhZGRpbmdFeGNlcHRpb25UZXN0LmdvbGRlbi4yLnNlciBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxOGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zcmMvdGVzdC9qYXZhL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vc2VyaWFsaXphdGlvbi9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9zZXJpYWxpemF0aW9uL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vU2hvcnRCdWZmZXJFeGNlcHRpb25UZXN0LmdvbGRlbi4wLnNlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhlNTVmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5nb2xkZW4uMC5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9zZXJpYWxpemF0aW9uL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vU2hvcnRCdWZmZXJFeGNlcHRpb25UZXN0LmdvbGRlbi4xLnNlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZhZGIyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5nb2xkZW4uMS5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS9zZXJpYWxpemF0aW9uL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL3NlcmlhbGl6YXRpb24vU2hvcnRCdWZmZXJFeGNlcHRpb25UZXN0LmdvbGRlbi4yLnNlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWRmMjYwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NyYy90ZXN0L2phdmEvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9zZXJpYWxpemF0aW9uL1Nob3J0QnVmZmVyRXhjZXB0aW9uVGVzdC5nb2xkZW4uMi5zZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9uZXQvc3NsL0FsbFRlc3RzLmphdmEgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS90ZXN0cy9jcnlwdG8vQWxsVGVzdHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDY3JQpjb3B5IGZyb20geC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9uZXQvc3NsL0FsbFRlc3RzLmphdmEKY29weSB0byBjcnlwdG8vc3JjL3Rlc3QvamF2YS90ZXN0cy9jcnlwdG8vQWxsVGVzdHMuamF2YQppbmRleCBiMTRiMjgyLi44MDc5ZDNlIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL25ldC9zc2wvQWxsVGVzdHMuamF2YQorKysgYi9jcnlwdG8vc3JjL3Rlc3QvamF2YS90ZXN0cy9jcnlwdG8vQWxsVGVzdHMuamF2YQpAQCAtMTQsMjUgKzE0LDI4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIHRlc3RzLm5ldC5zc2w7CitwYWNrYWdlIHRlc3RzLmNyeXB0bzsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CiAKIC8qKgotICogVGVzdCBzdWl0ZSB0aGF0IGluY2x1ZGVzIGFsbCB0ZXN0cyBmb3IgdGhlIE1hdGggcHJvamVjdC4KKyAqIFRlc3Qgc3VpdGUgdGhhdCBpbmNsdWRlcyBhbGwgdGVzdHMgZm9yIHRoZSByZWdleCBwcm9qZWN0LgogICovCiBwdWJsaWMgY2xhc3MgQWxsVGVzdHMgewogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oQWxsVGVzdHMuc3VpdGUoKSk7CisvL0FsbFRlc3RzLmphdmEgCiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJBbGwgbmV0LnNzbCB0ZXN0IHN1aXRlcyIpOworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJBbGwgY3J5cHRvIHRlc3Qgc3VpdGVzIik7CiAgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKLSAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5hcGkuamF2YXgubmV0LkFsbFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsLkFsbFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLmludGVyZmFjZXMuQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3Qob3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by50ZXN0cy5qYXZheC5jcnlwdG8uc2VyaWFsaXphdGlvbi5BbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5zcGVjLkFsbFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLkFsbFRlc3RzLnN1aXRlKCkpOwogICAgICAgICAvLyAkSlVuaXQtRU5EJAogICAgICAgICByZXR1cm4gc3VpdGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vQW5kcm9pZE9ubHkuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL0FuZHJvaWRPbmx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1OTkxYgotLS0gL2Rldi9udWxsCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL0FuZHJvaWRPbmx5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZGFsdmlrLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBNYXJrcyBhIHRlc3QtY2FzZSBhcyBBbmRyb2lkLW9ubHksIHRoYXQgaXMsIGl0IHNob3VsZCBub3QgYmUgZXhlY3V0ZWQgb24KKyAqIG90aGVyIHN5c3RlbXMuCisgKiAKKyAqIEBoaWRlCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5UWVBFIH0pCitwdWJsaWMgQGludGVyZmFjZSBBbmRyb2lkT25seSB7CisKKyAgICAvKioKKyAgICAgKiBQbGFpbiB0ZXh0IHJlYXNvbiBmb3IgYWRkaW5nIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBTdHJpbmcgdmFsdWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vQnJva2VuVGVzdC5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vQnJva2VuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWRlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9Ccm9rZW5UZXN0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZGFsdmlrLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBNYXJrcyBhIHRlc3QgY2FzZSBhcyBicm9rZW4uIFRoaXMgbWVhbnMgdGhlIHRlc3QgY2FzZSBzaG91bGQgYmUgZml4ZWQuCisgKiAKKyAqIEBoaWRlCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuTUVUSE9EIH0pCitwdWJsaWMgQGludGVyZmFjZSBCcm9rZW5UZXN0IHsKKworICAgIC8qKgorICAgICAqIFBsYWluIHRleHQgcmVhc29uIGZvciBhZGRpbmcgdGhpcyBhbm5vdGF0aW9uLgorICAgICAqLworICAgIFN0cmluZyB2YWx1ZSgpOworCit9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9Ib3N0Q29udHJvbGxlci5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vSG9zdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2NjMjkyCi0tLSAvZGV2L251bGwKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vSG9zdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkYWx2aWsuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIFJlY29yZCB0aGUgaG9zdCBzaWRlIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gZm9yIGEgdGVzdCBtZXRob2QsCisgKiBzbyB0aGF0IHRoZSBDVFMgaG9zdCBjYW4gbG9jYXRlIGNvcnJlc3BvbmQgaG9zdCBzaWRlIHVuaXQgd2hpbGUgcnVubmluZyBpdC4KKyAqIHtAaGlkZSBwZW5kaW5nIEFQSSBDb3VuY2lsIGFwcHJvdmFsfQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoeyBFbGVtZW50VHlwZS5NRVRIT0QgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIEhvc3RDb250cm9sbGVyIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBjb250cm9sbGVyIG1ldGhvZCBuYW1lLgorICAgICAqLworICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgIAorfQpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vS25vd25GYWlsdXJlLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9Lbm93bkZhaWx1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTA0MGJiCi0tLSAvZGV2L251bGwKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vS25vd25GYWlsdXJlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZGFsdmlrLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBNYXJrcyBhIHRlc3QgY2FzZSBhcyBhIGtub3duIGZhaWx1cmUuIFRoaXMgbWVhbnMgdGhlIHVuZGVybHlpbmcKKyAqIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBmaXhlZC4gU2VlbXMgdG8gYmUgc2ltaWxhciB0byBAY29kZXtAVG9CZUZpeGVkfSwgc28KKyAqIG1heWJlIHRoZSB0d28gY2FuIGJlIG1lcmdlZCBhdCBzb21lIHBvaW50LgorICogCisgKiBAaGlkZQorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7IEVsZW1lbnRUeXBlLk1FVEhPRCB9KQorcHVibGljIEBpbnRlcmZhY2UgS25vd25GYWlsdXJlIHsKKworICAgIC8qKgorICAgICAqIFBsYWluIHRleHQgcmVhc29uIGZvciBhZGRpbmcgdGhpcyBhbm5vdGF0aW9uLgorICAgICAqLworICAgIFN0cmluZyB2YWx1ZSgpOworCit9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0SW5mby5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVGVzdEluZm8uamF2YQppbmRleCBlOWMyMTI4Li44NzZlMGJmIDEwMDY0NAotLS0gYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0SW5mby5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL1Rlc3RJbmZvLmphdmEKQEAgLTQzLDYgKzQzLDE5IEBACiAgICAgU3RyaW5nIG5vdGVzKCkgZGVmYXVsdCAiIjsKICAgICAKICAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgbGV2ZWwgb2YgY292ZXJhZ2UgdGhlIHRlc3QgaGFzLgorICAgICAqLworICAgIFRlc3RMZXZlbCBsZXZlbCgpIGRlZmF1bHQgVGVzdExldmVsLlBBUlRJQUw7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHB1cnBvc2UgKGVpdGhlciBpZiBpdCBpcyBub3Rld29ydGggdG8gbWVudGlvbiBzdWNoIGFzIGlmIAorICAgICAqIGl0IGlzIHRlc3RpbmcgYSBzcGVjaWZpYyBwYXJhbWV0ZXIgY29tYmluYXRpb24pIG9yIHRoZSBjb3ZlcmVkIHRlc3QKKyAgICAgKiBhc3BlY3RzIChleGNlcHRpb25zLCBub3JtYWwgY2FzZXMsIGJvcmRlciBlZGdlIGNhc2VzLCBldGMuKSBpbiAKKyAgICAgKiBjYXNlIHRoZSBsZXZlbCBpcyBMZXZlbC5QQVJUSUFMCisgICAgICovCisgICAgU3RyaW5nIHB1cnBvc2UoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCiAgICAgICogU3BlY2lmaWVzIGFuIGFycmF5IG9mIHRhcmdldCBtZXRob2RzLgogICAgICAqLwogICAgIFRlc3RUYXJnZXRbXSB0YXJnZXRzKCk7CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0TGV2ZWwuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL1Rlc3RMZXZlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOWRkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0TGV2ZWwuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkYWx2aWsuYW5ub3RhdGlvbjsKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHN0YXRlcyBhIHRlc3QgY2FzZSBjYW4gYmUgaW4uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICogQGhpZGUKKyAqLworcHVibGljIGVudW0gVGVzdExldmVsIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIHRlc3QgbWV0aG9kIGNvbXBsZXRlbHkgdGVzdHMgaXRzIHRhcmdldCBBUEkgbWV0aG9kLgorICAgICAqLyAgICAKKyAgICBDT01QTEVURSwKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIHRlc3QgbWV0aG9kIHBhcnRpYWxseSB0ZXN0cyBpdHMgdGFyZ2V0IEFQSSBtZXRob2QgYW5kCisgICAgICogdGhhdCB0b2dldGhlciB3aXRoIGFsbCBvdGhlciB7QGNvZGUgUEFSVElBTF9DT01QTEVURX0gdGVzdHMgZm9yIHRoZSBzYW1lCisgICAgICogbWV0aG9kIGl0IGlzIHN1ZmZpY2llbnQuCisgICAgICovCisgICAgUEFSVElBTF9DT01QTEVURSwKKworICAgIC8qKgorICAgICAqIEp1c3QgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZXMsIHdpbGwgYmUgcmVtb3ZlZCBsYXRlci4KKyAgICAgKi8KKyAgICBQQVJUSUFMX09LLAorICAgIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IGEgdGVzdCBtZXRob2QgcGFydGlhbGx5IHRlc3RzIGl0cyB0YXJnZXQgQVBJIG1ldGhvZC4gSXQKKyAgICAgKiBuZWVkcyBhIHNlY29uZCByZXZpZXcgcGhhc2UgdG8gZmluZCBvdXQgaWYgdGhlIHN1bSBvZiBhbGwgcGFydGlhbCB0ZXN0cworICAgICAqIGlzIHN1ZmZpY2llbnQgZm9yIGNvbXBsZXRlbHkgdGVzdGluZyB0aGUgdGFyZ2V0IEFQSSBtZXRob2QuIElmIHllcywgdGhlCisgICAgICogbGV2ZWwgaGFzIHRvIGJlIGNoYW5nZWQgdG8ge0Bjb2RlIFBBUlRJQUxfQ09NUExFVEV9LgorICAgICAqLworICAgIFBBUlRJQUwsIAorICAgIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IGEgdGVzdCBtZXRob2QgaXMga25vd24gdG8gbm90IGNvbXBsZXRlbHkgdGVzdCBhbiBBUEkKKyAgICAgKiBtZXRob2QgYnV0IHRoZSBtaXNzaW5nIHRlc3Qgc3RlcHMgYXJlIHRvbyBjb21wbGV4IGFuZCBjb3N0bHkgdG8KKyAgICAgKiBpbXBsZW1lbnQuIFRoaXMgbGV2ZWwgaXMgcG9zaXRpb25lZCBzb21ld2hlcmUgYmV0d2VlbiB7QGNvZGUgUEFSVElBTH0KKyAgICAgKiBhbmQge0Bjb2RlIENPTVBMRVRFfS4KKyAgICAgKi8KKyAgICBTVUZGSUNJRU5ULAorICAgIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IGEgdGVzdCBtZXRob2QgcHJvdmlkZXMgYWRkaXRpb25hbCB0ZXN0aW5nIGZvciBhbiBBUEkKKyAgICAgKiBtZXRob2QgZm9yIHdoaWNoIHRoZXJlIGFscmVhZHkgZXhpc3RzIG9uZSB7QGNvZGUgQ09NUExFVEV9IG9yIGEgc2V0IG9mIAorICAgICAqIHtAY29kZSBQQVJUSUFMX0NPTVBMRVRFfSB0ZXN0cy4gVGhpcyBsZXZlbCBtYXkgYWxzbyBiZSB1c2VkIGZvciB0ZXN0CisgICAgICogbWV0aG9kcyB0aGF0IHRlc3QgYSBjb25jZXB0IHdoaWNoIGNhbiBub3QgYmUgZGlyZWN0bHkgYXR0cmlidXRlZCB0byAKKyAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhbiBBUEkgbWV0aG9kIG9yIGNsYXNzLgorICAgICAqLworICAgIEFERElUSU9OQUwsIAorICAgIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdCBpbiBhbiBBUEkgbWV0aG9kLCBmb3IgZXhhbXBsZSBpZgorICAgICAqIHRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IGEgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKi8KKyAgICBOT1RfTkVDRVNTQVJZLAorICAgIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IGl0IGlzIHZlcnkgaGFyZCBvciBpbXBvc3NpYmxlIHRvIHRlc3QgYW4gQVBJIG1ldGhvZC4KKyAgICAgKi8KKyAgICBOT1RfRkVBU0lCTEUsCisgICAgCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHRlc3RzIGlzIGVpdGhlciBpbnN1ZmZpY2llbnQgb3Igd3JvbmcuIFNvbWV0aGluZyBuZWVkcworICAgICAqIHRvIGJlIGRvbmUgYWJvdXQgaXQuCisgICAgICovCisgICAgVE9ETywKKyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0VGFyZ2V0LmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0VGFyZ2V0LmphdmEKaW5kZXggZmVlZmEwNS4uN2NiZGRjYSAxMDA2NDQKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVGVzdFRhcmdldC5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL1Rlc3RUYXJnZXQuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogICogRGVmaW5lcyBhbiBhbm5vdGF0aW9uIHVzZWQgYmUgdXNlZCB3aXRoaW4gdGhlIFRlc3RJbmZvIGFubm90YXRpb24uIEl0CiAgKiBzcGVjaWZpZXMgYSBzaW5nbGUgbWV0aG9kIHRhcmdldCBmb3IgdGhlIHRlc3QgKGJ1dCBjYW4gYmUgdXNlZCBtdWx0aXBsZQogICogdGltZXMpLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKIEBUYXJnZXQoeyBFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUgfSkKQEAgLTMzLDcgKzM1LDE5IEBACiAgICAgLyoqCiAgICAgICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuCiAgICAgICovCi0gICAgU3RyaW5nIG1ldGhvZE5hbWUoKTsKKyAgICBTdHJpbmcgbWV0aG9kTmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjb25jZXB0IGJlaW5nIHRlc3RlZC4gVXNlIHRoaXMgaWYKKyAgICAgKiB7QGNvZGUgbWV0aG9kTmFtZX0gaXMgbm90IGFjY3VyYXRlIGVub3VnaC4gRS5nLiBmb3IKKyAgICAgKiB7QGxpbmsgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4jY29tcGlsZShTdHJpbmcpfSB7QGNvZGUgbWV0aG9kTmFtZX0gaXMgbm90CisgICAgICogc3VmZmljaWVudCBzaW5jZSB0aGUgU3RyaW5nIGNvbnRhaW5zIGEgcGF0dGVybiB3aXRoIGl0cyBvd24gc3ludGF4IHdoaWNoCisgICAgICogaGFzIHRvIGJlIHRlc3RlZCB3aXRoIGRpZmZlcmVudCBhc3BlY3RzLiBBcmVhcyBjb25jZXJuZWQgYXJlIGUuZy4gSkRCQworICAgICAqIChTRUxFQ1QsIElOU0VSVCwgVVBEQVRFLCBERUxFVEUsIC4uLiksIHJlZ2V4IChjaGFyYWN0ZXIgc2V0cywKKyAgICAgKiBvcGVyYXRvcnMsLi4uKSwgZm9ybWF0dGVycyAoRGVjaW1hbEZvcm1hdCwgRGF0ZUZvcm1hdCwgQ2hvaWNlRm9ybWF0LAorICAgICAqIC4uLiksIC4uLgorICAgICAqLworICAgIFN0cmluZyBjb25jZXB0TmFtZSgpIGRlZmF1bHQgIiI7CiAgICAgCiAgICAgLyoqCiAgICAgICogU3BlY2lmaWVzIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIHRlc3RlZCwgaW4gdGVybXMgb2YKZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL1Rlc3RUYXJnZXRDbGFzcy5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVGVzdFRhcmdldENsYXNzLmphdmEKaW5kZXggNTlkMTA0YS4uYWNiYzFmMSAxMDA2NDQKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVGVzdFRhcmdldENsYXNzLmphdmEKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVGVzdFRhcmdldENsYXNzLmphdmEKQEAgLTIxLDExICsyMSwxNSBAQAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0TmV3OworCiAvKioKICAqIERlZmluZXMgYW4gYW5ub3RhdGlvbiBmb3IgdGVzdCBjbGFzc2VzIHRoYXQgYWxsb3dzIHRvIGxpbmsgdGhlbSB0byB0aGUgY2xhc3MKICAqIHRoYXQgaXMgYmVpbmcgdGVzdGVkLiBUaGUgY3VycmVudCBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIHRlc3QgYXJlIHNvbWV3aGF0CiAgKiBvcmdhbml6ZWQgYWNjb3JkaW5nIHRvIHRoZSBBUEkgY2xhc3NlcyB0aGV5IHRlc3QuIE1pZ2h0IGJlIHRvbyBzdHJpY3QgZm9yCiAgKiBzb21lIGNhc2VzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKIEBUYXJnZXQoeyBFbGVtZW50VHlwZS5UWVBFIH0pCkBAIC0zNiw0ICs0MCw5IEBACiAgICAgICovCiAgICAgQ2xhc3M8Pz4gdmFsdWUoKTsKICAgICAKLX0KKyAgICAvKioKKyAgICAgKiBPcHRpb24gdG8gc3BlY2lmeSB1bnRlc3RlZCBtZXRob2RzIGZvciB0aGUgY2xhc3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBUZXN0VGFyZ2V0TmV3W10gdW50ZXN0ZWRNZXRob2RzKCkgZGVmYXVsdCB7fTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0VGFyZ2V0TmV3LmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0VGFyZ2V0TmV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiZTBjYgotLS0gL2Rldi9udWxsCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL1Rlc3RUYXJnZXROZXcuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkYWx2aWsuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIERlZmluZXMgYW4gYW5ub3RhdGlvbiB1c2VkIGJlIHVzZWQgd2l0aGluIHRoZSBUZXN0SW5mbyBhbm5vdGF0aW9uLiBJdAorICogc3BlY2lmaWVzIGEgc2luZ2xlIG1ldGhvZCB0YXJnZXQgZm9yIHRoZSB0ZXN0IChidXQgY2FuIGJlIHVzZWQgbXVsdGlwbGUKKyAqIHRpbWVzKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKiBAaGlkZQorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7IEVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EIH0pCitwdWJsaWMgQGludGVyZmFjZSBUZXN0VGFyZ2V0TmV3IHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIEFQSSBtZXRob2QgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuIFRoaXMgZmllbGQKKyAgICAgKiBtYXkgYmUgbGVmdCBlbXB0eSBpZiB0aGUgdGVzdCB0YXJnZXQgaXMgYSBjb25jZXB0IGltcGxlbWVudGVkIGluIGEKKyAgICAgKiBjbGFzcyByYXRoZXIgdGhhbiBhIGNvbmNyZXRlIEFQSSBtZXRob2QuCisgICAgICovCisgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgQVBJIG1ldGhvZCB0aGF0IGlzIGJlaW5nIHRlc3RlZCwgaW4gdGVybXMKKyAgICAgKiBvZiBKYXZhIGNsYXNzZXMuCisgICAgICovCisgICAgQ2xhc3M8Pz5bXSBhcmdzKCkgZGVmYXVsdCB7fTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIHRlc3RlZCBtZXRob2QgYmVsb25ncy4gSWYgdGhpcyB2YWx1ZSBpcworICAgICAqIG5vdCBwcm92aWRlZCwgdGhlIGNsYXNzIGlkZW50aWZpZWQgaW4gQFRlc3RUYXJnZXRDbGFzcyBpcyB1c2VkIGJ5IHRoZQorICAgICAqIHRlc3QgcHJvZ3Jlc3MgZG9jbGV0LgorICAgICAqLworICAgIENsYXNzPD8+IGNsYXp6KCk7IC8vIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGxldmVsIG9mIGNvdmVyYWdlIHRoZSB0ZXN0ZWQgQVBJIG1ldGhvZCBoYXMuCisgICAgICovCisgICAgVGVzdExldmVsIGxldmVsKCk7CisgICAgCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIG5vdGV3b3J0aHkgcGxhaW4tdGV4dCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVzdCwgZm9yIGV4YW1wbGUKKyAgICAgKiBpZiBzb21ldGhpbmcgaXMgTk9UIGNvdmVyZWQgYnkgdGhlIHRlc3QgbWV0aG9kLgorICAgICAqLworICAgIFN0cmluZyBub3RlcygpIGRlZmF1bHQgIiI7Cit9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9UZXN0VGFyZ2V0cy5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVGVzdFRhcmdldHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ2MTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVGVzdFRhcmdldHMuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkYWx2aWsuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldE5ldzsKKworLyoqCisgKiBEZWZpbmVzIGFuIGFubm90YXRpb24gZm9yIHRlc3QgY2xhc3NlcyB0aGF0IGFsbG93cyB0byBsaW5rIHRoZW0gdG8gdGhlIGNsYXNzCisgKiB0aGF0IGlzIGJlaW5nIHRlc3RlZC4gVGhlIGN1cnJlbnQgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB0ZXN0IGFyZSBzb21ld2hhdAorICogb3JnYW5pemVkIGFjY29yZGluZyB0byB0aGUgQVBJIGNsYXNzZXMgdGhleSB0ZXN0LiBNaWdodCBiZSB0b28gc3RyaWN0IGZvcgorICogc29tZSBjYXNlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKiBAaGlkZQorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7IEVsZW1lbnRUeXBlLk1FVEhPRCB9KQorcHVibGljIEBpbnRlcmZhY2UgVGVzdFRhcmdldHMgeworICAgIAorICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgQVBJIG1ldGhvZHMgdGhhdCBhcmUgdGVzdGVkIGJ5IHRoZSBhbm5vdGF0ZWQgdGVzdCBtZXRob2QuCisgICAgICovCisgICAgVGVzdFRhcmdldE5ld1tdIHZhbHVlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVG9CZUZpeGVkLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9Ub0JlRml4ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg1OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vVG9CZUZpeGVkLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZGFsdmlrLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBEZWZpbmVzIGFuIGFubm90YXRpb24gZm9yIHRlc3QgbWV0aG9kcyB0aGF0IGluZGljYXRlIHRoZSB0ZXN0IG1ldGhvZAorICogbmVlZCB0byBiZSBmaXhlZCBpbiBmdXR1cmUuCisgKiB7QGhpZGUgcGVuZGluZyBBUEkgQ291bmNpbCBhcHByb3ZhbH0KKyAqCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoeyBFbGVtZW50VHlwZS5NRVRIT0QgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFRvQmVGaXhlZCB7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHJlbGF0ZWQgYnVnIG51bWJlciBvbiBDVFMgYnVnIHRyYWNraW5nIHN5c3RlbS4KKyAgICAgKi8KKyAgICBTdHJpbmcgYnVnKCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aHkgdGhpcyBtZXRob2QgbmVlZCB0byBiZSBmaXhlZC4gSWYgd2UgdGhpbmsgaXQncyBhIGJ1ZywgZXhwbGFpbgorICAgICAqIHRoZSBleHBlY3RhdGlvbiBhbmQgdGhlIGFjdHVhbCByZXN1bHQuCisgICAgICovCisgICAgU3RyaW5nIGV4cGxhbmF0aW9uKCkgZGVmYXVsdCAiIjsKK30KZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL1ZpcnR1YWxUZXN0VGFyZ2V0LmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9WaXJ0dWFsVGVzdFRhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOWU0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9WaXJ0dWFsVGVzdFRhcmdldC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRhbHZpay5hbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQW5ub3RhdGlvbiBmb3IgInZpcnR1YWwiIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuIFRoZXNlIGFyZSBjbGFzc2VzIHRoYXQgaGF2ZQorICogdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICogPHVsPgorICogPGxpPnRoZXkgaW1wbGVtZW50IGEgcHVibGljIGludGVyZmFjZSBvciBhcmUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhCisgKiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MsPC9saT4KKyAqIDxsaT50aGV5IGFyZSBub3QgcHVibGljLDwvbGk+CisgKiA8bGk+aW5zdGFuY2VzIGNhbiBvbmx5IGJlIHJldHJpZXZlZCB0aHJvdWdoIHNvbWUga2luZCBvZiBmYWN0b3J5IG1ldGhvZC48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogRXhhbXBsZToge0Bjb2RlIE1lc3NhZ2VEaWdlc3R9IGlzIGFuIGFic3RyYWN0IGNsYXNzLiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMKKyAqIG9mIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobXMgc3VjaCBhcyBNRDUgYW5kIFNIQS0xIGNhbiBvbmx5IGJlIHJldHJpZXZlZAorICogdGhyb3VnaCBvbmUgb2YgdGhlIHN0YXRpYyB7QGNvZGUgZ2V0SW5zdGFuY2V9IG1ldGhvZHMgb2YKKyAqIHtAY29kZSBNZXNzYWdlRGlnZXN0fSwgd2hpY2ggYWNjZXB0IHRoZSBkZXNpcmVkIGFsZ29yaXRobSBhcyBhIHN0cmluZworICogcGFyYW1ldGVyIGFuZCByZXR1cm4gYW4gaW1wbGVtZW50YXRpb24gYWNjb3JkaW5nbHkuCisgKiA8L3A+CisgKiA8cD4KKyAqIEV2ZW4gdGhvdWdoIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0KKyAqIGlzIG5vdCBrbm93biwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGluZGljYXRlIHRoYXQgc3VjaCBhIGNsYXNzIGV4aXN0cyBhbmQKKyAqIHRoYXQgaXQgbXVzdCBiZSB0ZXN0ZWQuIFRoaXMgaXMgZG9uZSBieSBkZWZpbmluZyBjb3JyZXNwb25kaW5nIGNsYXNzZXMgYW5kCisgKiBhbm5vdGF0aW5nIHRoZW0gd2l0aCB7QGNvZGUgQFZpcnR1YWxUZXN0VGFyZ2V0fS4gVGhpcyBjbGFzcyBjYW4gdGhlbiBiZQorICogdXNlZCBpbiB0aGUge0Bjb2RlIEBUZXN0VGFyZ2V0Q2xhc3N9IGFubm90YXRpb24gd2l0aCB3aGljaCB3ZSBhbm5vdGF0ZSAKKyAqIHtAY29kZSBUZXN0Q2FzZX0gc3ViY2xhc3Nlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKiBAaGlkZQorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7IEVsZW1lbnRUeXBlLlRZUEUgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFZpcnR1YWxUZXN0VGFyZ2V0IHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBGaWVsZCBmb3IgY29tbWVudHMuCisgICAgICovCisgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3Y2YwNwotLS0gL2Rldi9udWxsCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDkgQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIERlZmluZXMgc29tZSBhbm5vdGF0aW9ucyB0aGF0IGFyZSB1c2VkIHdpdGhpbiB0aGUgQW5kcm9pZCBzeXN0ZW0sIGVpdGhlcgorICAgICAgZm9yIHRoZSBjb3JlIGxpYnJhcmllcyBvciBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9ieXRlY29kZS9wYWNrYWdlLmh0bWwgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYnl0ZWNvZGUvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNmQ3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYnl0ZWNvZGUvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgUHJvdmlkZXMgY2xhc3NlcyBzdXJyb3VuZGluZyB0aGUgRGFsdmlrIGJ5dGVjb2RlLiAKKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vQWxsb2NhdGlvbkxpbWl0RXJyb3IuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vQWxsb2NhdGlvbkxpbWl0RXJyb3IuamF2YQppbmRleCA5NzQ3NTc4Li44NWY3ZGU2IDEwMDY0NAotLS0gYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL0FsbG9jYXRpb25MaW1pdEVycm9yLmphdmEKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9BbGxvY2F0aW9uTGltaXRFcnJvci5qYXZhCkBAIC0xNywxOCArMTcsMjIgQEAKIHBhY2thZ2UgZGFsdmlrLnN5c3RlbTsKIAogLyoqCi0gKiBUaGlzIGlzIHRocm93biB3aGVuIGFuIGFsbG9jYXRpb24gbGltaXQgaXMgZXhjZWVkZWQuCisgKiBJcyB0aHJvd24gd2hlbiBhbiBhbGxvY2F0aW9uIGxpbWl0IGlzIGV4Y2VlZGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFsbG9jYXRpb25MaW1pdEVycm9yIGV4dGVuZHMgVmlydHVhbE1hY2hpbmVFcnJvciB7CiAgICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBleGNlcHRpb24gd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAgKi8KICAgICBwdWJsaWMgQWxsb2NhdGlvbkxpbWl0RXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBleGNlcHRpb24gd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZSBzdHJpbmcuCisgICAgICogQ3JlYXRlcyBhIG5ldyBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGluaXRpYWxpemVzIGl0IHdpdGggYSBnaXZlbiBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCiAgICAgICovCiAgICAgcHVibGljIEFsbG9jYXRpb25MaW1pdEVycm9yKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9EZXhDbGFzc0xvYWRlci5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9EZXhDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMmY3NmQzCi0tLSAvZGV2L251bGwKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9EZXhDbGFzc0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkYWx2aWsuc3lzdGVtOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CisKK2ltcG9ydCBkYWx2aWsuc3lzdGVtLkRleEZpbGU7CisKKy8qKgorICogUHJvdmlkZXMgYSBzaW1wbGUge0BsaW5rIENsYXNzTG9hZGVyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IG9wZXJhdGVzIG9uIGEKKyAqIGxpc3Qgb2YgamFyL2FwayBmaWxlcyB3aXRoIGNsYXNzZXMuZGV4IGVudHJpZXMuICBUaGUgZGlyZWN0b3J5IHRoYXQKKyAqIGhvbGRzIHRoZSBvcHRpbWl6ZWQgZm9ybSBvZiB0aGUgZmlsZXMgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkuICBUaGlzCisgKiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgbm90IGluc3RhbGxlZCBhcyBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uLgorICoKKyAqIFRoZSBiZXN0IHBsYWNlIHRvIHB1dCB0aGUgb3B0aW1pemVkIERFWCBmaWxlcyBpcyBpbiBhcHAtc3BlY2lmaWMKKyAqIHN0b3JhZ2UsIHNvIHRoYXQgcmVtb3ZhbCBvZiB0aGUgYXBwIHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhlCisgKiBvcHRpbWl6ZWQgREVYIGZpbGVzLiAgSWYgb3RoZXIgc3RvcmFnZSBpcyB1c2VkIChlLmcuIC9zZGNhcmQpLCB0aGUKKyAqIGFwcCBtYXkgbm90IGhhdmUgYW4gb3Bwb3J0dW5pdHkgdG8gcmVtb3ZlIHRoZW0uCisgKi8KK3B1YmxpYyBjbGFzcyBEZXhDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRV9ERUJVRyA9IGZhbHNlOworCisgICAgLyogY29uc3RydWN0b3IgYXJncywgaGVsZCBmb3IgaW5pdCAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1SYXdEZXhQYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1SYXdMaWJQYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1EZXhPdXRwdXRQYXRoOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZDsKKworICAgIC8qCisgICAgICogUGFyYWxsZWwgYXJyYXlzIGZvciBqYXIvYXBrIGZpbGVzLgorICAgICAqCisgICAgICogKGNvdWxkIHN0dWZmIHRoZXNlIGludG8gYW4gb2JqZWN0IGFuZCBoYXZlIGEgc2luZ2xlIGFycmF5OworICAgICAqIGltcHJvdmVzIGNsYXJpdHkgYnV0IGFkZHMgb3ZlcmhlYWQpCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlW10gbUZpbGVzOyAgICAgICAgICAgICAgLy8gc291cmNlIGZpbGUgRmlsZXMsIGZvciByc3JjIFVSTHMKKyAgICBwcml2YXRlIFppcEZpbGVbXSBtWmlwczsgICAgICAgICAgICAvLyBzb3VyY2UgemlwIGZpbGVzLCB3aXRoIHJlc291cmNlcworICAgIHByaXZhdGUgRGV4RmlsZVtdIG1EZXhzOyAgICAgICAgICAgIC8vIG9wZW5lZCwgcHJlcHBlZCBERVggZmlsZXMKKworICAgIC8qCisgICAgICogTmF0aXZlIGxpYnJhcnkgcGF0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIG1MaWJQYXRoczsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBEZXhDbGFzc0xvYWRlcn0gdGhhdCBmaW5kcyBpbnRlcnByZXRlZCBhbmQgbmF0aXZlCisgICAgICogY29kZS4gIEludGVycHJldGVkIGNsYXNzZXMgYXJlIGZvdW5kIGluIGEgc2V0IG9mIERFWCBmaWxlcyBjb250YWluZWQKKyAgICAgKiBpbiBKYXIgb3IgQVBLIGZpbGVzLgorICAgICAqCisgICAgICogVGhlIHBhdGggbGlzdHMgYXJlIHNlcGFyYXRlZCB1c2luZyB0aGUgY2hhcmFjdGVyIHNwZWNpZmllZCBieQorICAgICAqIHRoZSAicGF0aC5zZXBhcmF0b3IiIHN5c3RlbSBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gIjoiLgorICAgICAqCisgICAgICogQHBhcmFtIGRleFBhdGgKKyAgICAgKiAgdGhlIGxpc3Qgb2YgamFyL2FwayBmaWxlcyBjb250YWluaW5nIGNsYXNzZXMgYW5kIHJlc291cmNlcworICAgICAqIEBwYXJhbSBkZXhPdXRwdXREaXIKKyAgICAgKiAgZGlyZWN0b3J5IHdoZXJlIG9wdGltaXplZCBERVggZmlsZXMgc2hvdWxkIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gbGliUGF0aAorICAgICAqICB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBsaWJyYXJpZXM7IG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIHBhcmVudAorICAgICAqICB0aGUgcGFyZW50IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBEZXhDbGFzc0xvYWRlcihTdHJpbmcgZGV4UGF0aCwgU3RyaW5nIGRleE91dHB1dERpciwgU3RyaW5nIGxpYlBhdGgsCisgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCkgeworCisgICAgICAgIHN1cGVyKHBhcmVudCk7CisKKyAgICAgICAgaWYgKGRleFBhdGggPT0gbnVsbCB8fCBkZXhPdXRwdXREaXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCisgICAgICAgIG1SYXdEZXhQYXRoID0gZGV4UGF0aDsKKyAgICAgICAgbURleE91dHB1dFBhdGggPSBkZXhPdXRwdXREaXI7CisgICAgICAgIG1SYXdMaWJQYXRoID0gbGliUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wbGV0ZSBpbml0aWFsaXphdGlvbiBvbiBmaXJzdCB1c2Ugb2YgdGhlIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5pdCgpIHsKKyAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gZGV4UGF0aExpc3Q7CisKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBkZXhQYXRoTGlzdCA9IG1SYXdEZXhQYXRoLnNwbGl0KCI6Iik7CisgICAgICAgIGludCBsZW5ndGggPSBkZXhQYXRoTGlzdC5sZW5ndGg7CisKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRleENsYXNzTG9hZGVyOiAiICsgZGV4UGF0aExpc3QpOworICAgICAgICBtRmlsZXMgPSBuZXcgRmlsZVtsZW5ndGhdOworICAgICAgICBtWmlwcyA9IG5ldyBaaXBGaWxlW2xlbmd0aF07CisgICAgICAgIG1EZXhzID0gbmV3IERleEZpbGVbbGVuZ3RoXTsKKworICAgICAgICAvKiBvcGVuIGFsbCBaaXAgYW5kIERFWCBmaWxlcyB1cCBmcm9udCAqLworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk15IHBhdGggaXM6ICIgKyBkZXhQYXRoTGlzdFtpXSk7CisgICAgICAgICAgICBGaWxlIHBhdGhGaWxlID0gbmV3IEZpbGUoZGV4UGF0aExpc3RbaV0pOworICAgICAgICAgICAgbUZpbGVzW2ldID0gcGF0aEZpbGU7CisKKyAgICAgICAgICAgIGlmIChwYXRoRmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1aaXBzW2ldID0gbmV3IFppcEZpbGUocGF0aEZpbGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0aW5nIElPRXhjZXB0aW9uIGFuZCBaaXBFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsZWQgb3BlbmluZyAnIiArIHBhdGhGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICArICInOiAiICsgaW9leCk7CisgICAgICAgICAgICAgICAgICAgIC8vaW9leC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIGJvdGggREVYIGFuZCBaaXAsIGJlY2F1c2UgZGV4IGhhcyBubyByZXNvdXJjZXMgKi8KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU91dHB1dE5hbWUoZGV4UGF0aExpc3RbaV0sIG1EZXhPdXRwdXRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgbURleHNbaV0gPSBEZXhGaWxlLmxvYWREZXgoZGV4UGF0aExpc3RbaV0sIG91dHB1dE5hbWUsIDApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWlnaHQgYmUgYSByZXNvdXJjZS1vbmx5IHppcAorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCBsb2FkRGV4ICciICsgcGF0aEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIic6ICIgKyBpb2V4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChWRVJCT1NFX0RFQlVHKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdCBmb3VuZDogIiArIHBhdGhGaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBQcmVwIGZvciBuYXRpdmUgbGlicmFyeSBsb2FkaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHBhdGhMaXN0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmxpYnJhcnkucGF0aCIsICIuIik7CisgICAgICAgIFN0cmluZyBwYXRoU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIsICI6Iik7CisgICAgICAgIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIsICIvIik7CisKKyAgICAgICAgaWYgKG1SYXdMaWJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwYXRoTGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXRoTGlzdCArPSBwYXRoU2VwICsgbVJhd0xpYlBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXRoTGlzdCA9IG1SYXdMaWJQYXRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUxpYlBhdGhzID0gcGF0aExpc3Quc3BsaXQocGF0aFNlcCk7CisgICAgICAgIGxlbmd0aCA9IG1MaWJQYXRocy5sZW5ndGg7CisKKyAgICAgICAgLy8gQWRkIGEgJy8nIHRvIHRoZSBlbmQgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyB0aGUgcHJvcGVydHkgbG9va3VwCisgICAgICAgIC8vIGFuZCBjb25jYXRlbmF0aW9uIGxhdGVyLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIW1MaWJQYXRoc1tpXS5lbmRzV2l0aChmaWxlU2VwKSkKKyAgICAgICAgICAgICAgICBtTGliUGF0aHNbaV0gKz0gZmlsZVNlcDsKKyAgICAgICAgICAgIGlmIChWRVJCT1NFX0RFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmF0aXZlIGxpYiBwYXRoICIgK2krICI6ICAiICsgbUxpYlBhdGhzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBzb3VyY2UgcGF0aCBuYW1lIGFuZCBhbiBvdXRwdXQgZGlyZWN0b3J5IHRvIGFuIG91dHB1dAorICAgICAqIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVPdXRwdXROYW1lKFN0cmluZyBzb3VyY2VQYXRoTmFtZSwKKyAgICAgICAgU3RyaW5nIG91dHB1dERpcikgeworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbmV3U3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoODApOworCisgICAgICAgIC8qIHN0YXJ0IHdpdGggdGhlIG91dHB1dCBkaXJlY3RvcnkgKi8KKyAgICAgICAgbmV3U3RyLmFwcGVuZChvdXRwdXREaXIpOworICAgICAgICBpZiAoIW91dHB1dERpci5lbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgbmV3U3RyLmFwcGVuZCgiLyIpOworCisgICAgICAgIC8qIGdldCB0aGUgZmlsZW5hbWUgY29tcG9uZW50IG9mIHRoZSBwYXRoICovCisgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlTmFtZTsKKyAgICAgICAgaW50IGxhc3RTbGFzaCA9IHNvdXJjZVBhdGhOYW1lLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgIGlmIChsYXN0U2xhc2ggPCAwKQorICAgICAgICAgICAgc291cmNlRmlsZU5hbWUgPSBzb3VyY2VQYXRoTmFtZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc291cmNlRmlsZU5hbWUgPSBzb3VyY2VQYXRoTmFtZS5zdWJzdHJpbmcobGFzdFNsYXNoKzEpOworCisgICAgICAgIC8qIHJlcGxhY2UgIi5qYXIiLCAiLnppcCIsIHdoYXRldmVyIHdpdGggIi5vZGV4IiAqLworICAgICAgICBpbnQgbGFzdERvdCA9IHNvdXJjZUZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgIGlmIChsYXN0RG90IDwgMCkKKyAgICAgICAgICAgIG5ld1N0ci5hcHBlbmQoc291cmNlRmlsZU5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuZXdTdHIuYXBwZW5kKHNvdXJjZUZpbGVOYW1lLCAwLCBsYXN0RG90KTsKKyAgICAgICAgbmV3U3RyLmFwcGVuZCgiLm9kZXgiKTsKKworICAgICAgICBpZiAoVkVSQk9TRV9ERUJVRykKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3V0cHV0IGZpbGUgd2lsbCBiZSAiICsgbmV3U3RyLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gbmV3U3RyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBjbGFzcy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHtAY29kZSBsb2FkQ2xhc3MoKX0gYWZ0ZXIgdGhlCisgICAgICogcGFyZW50IENsYXNzTG9hZGVyIGhhcyBmYWlsZWQgdG8gZmluZCBhIGxvYWRlZCBjbGFzcyBvZiB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBzZWFyY2ggZm9yLCBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0KKyAgICAgKiAgICAgICAgICAgIGxpa2UgImphdmEubGFuZy5TdHJpbmciIG9yICJqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciQzJDEiLgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBDbGFzc30gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2xhc3MKKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGZvdW5kCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENsYXNzPD8+IGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBlbnN1cmVJbml0KCk7CisKKyAgICAgICAgaWYgKFZFUkJPU0VfREVCVUcpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRleENsYXNzTG9hZGVyICIgKyB0aGlzCisgICAgICAgICAgICAgICAgKyAiOiBmaW5kQ2xhc3MgJyIgKyBuYW1lICsgIiciKTsKKworICAgICAgICBieXRlW10gZGF0YSA9IG51bGw7CisgICAgICAgIGludCBsZW5ndGggPSBtRmlsZXMubGVuZ3RoOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChWRVJCT1NFX0RFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBOb3cgc2VhcmNoaW5nOiAiICsgbUZpbGVzW2ldLmdldFBhdGgoKSk7CisKKyAgICAgICAgICAgIGlmIChtRGV4c1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNsYXNoTmFtZSA9IG5hbWUucmVwbGFjZSgnLicsICcvJyk7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBtRGV4c1tpXS5sb2FkQ2xhc3Moc2xhc2hOYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoVkVSQk9TRV9ERUJVRykKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIGZvdW5kIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6ejsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lICsgIiBpbiBsb2FkZXIgIiArIHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGNvZGUgZ2V0UmVzb3VyY2UoKX0gYWZ0ZXIKKyAgICAgKiB0aGUgcGFyZW50IENsYXNzTG9hZGVyIGhhcyBmYWlsZWQgdG8gZmluZCBhIGxvYWRlZCByZXNvdXJjZSBvZiB0aGUgc2FtZQorICAgICAqIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGZpbmQKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYXMgYSBVUkwsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIHJlc291cmNlIGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworICAgICAgICBlbnN1cmVJbml0KCk7CisKKyAgICAgICAgaW50IGxlbmd0aCA9IG1GaWxlcy5sZW5ndGg7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBwYXRoRmlsZSA9IG1GaWxlc1tpXTsKKyAgICAgICAgICAgIFppcEZpbGUgemlwID0gbVppcHNbaV07CisKKyAgICAgICAgICAgIGlmICh6aXAuZ2V0RW50cnkobmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChWRVJCT1NFX0RFQlVHKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgZm91bmQgIiArIG5hbWUgKyAiIGluICIgKyBwYXRoRmlsZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsZS50b1VSTCgpIGlzIGNvbXBsaWFudCB3aXRoIFJGQyAxNzM4IGluIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZyBhYnNvbHV0ZSBwYXRoIG5hbWVzLiBJZiB3ZSBjb25zdHJ1Y3QgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIFVSTCBieSBjb25jYXRlbmF0aW5nIHN0cmluZ3MsIHdlIG1pZ2h0IGVuZCB1cCB3aXRoCisgICAgICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwgVVJMcyBmb3IgcmVsYXRpdmUgbmFtZXMuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKCJqYXI6IiArIHBhdGhGaWxlLnRvVVJMKCkgKyAiIS8iICsgbmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFZFUkJPU0VfREVCVUcpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgcmVzb3VyY2UgIiArIG5hbWUgKyAiIG5vdCBmb3VuZCIpOworCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgbmF0aXZlIGxpYnJhcnkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgcGFyZW50CisgICAgICogQ2xhc3NMb2FkZXIgaGFzIGZhaWxlZCB0byBmaW5kIGEgbmF0aXZlIGxpYnJhcnkgb2YgdGhlIHNhbWUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaWJuYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBmaW5kCisgICAgICogQHJldHVybiB0aGUgY29tcGxldGUgcGF0aCBvZiB0aGUgbGlicmFyeSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBsaWJyYXJ5CisgICAgICogICAgICAgICBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kTGlicmFyeShTdHJpbmcgbGlibmFtZSkgeworICAgICAgICBlbnN1cmVJbml0KCk7CisKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gU3lzdGVtLm1hcExpYnJhcnlOYW1lKGxpYm5hbWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MaWJQYXRocy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHBhdGhOYW1lID0gbUxpYlBhdGhzW2ldICsgZmlsZU5hbWU7CisgICAgICAgICAgICBGaWxlIHRlc3QgPSBuZXcgRmlsZShwYXRoTmFtZSk7CisKKyAgICAgICAgICAgIGlmICh0ZXN0LmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKFZFUkJPU0VfREVCVUcpCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBmb3VuZCAiICsgbGlibmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFZFUkJPU0VfREVCVUcpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgbGlicmFyeSAiICsgbGlibmFtZSArICIgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuIFVuZm9ydHVuYXRlbHksIHRoZQorICAgICAqIERleENsYXNzTG9hZGVyIGRvZXNuJ3QgcmVhbGx5IGhhdmUgdGhpcyBpbmZvcm1hdGlvbiwgYW5kIGFzIGEgbm9uLXNlY3VyZQorICAgICAqIENsYXNzTG9hZGVyLCBpdCBpc24ndCBldmVuIHJlcXVpcmVkIHRvLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWMuIFlldCwgd2UKKyAgICAgKiB3YW50IHRvIHByb3ZpZGUgaXQsIGluIG9yZGVyIHRvIG1ha2UgYWxsIHRob3NlIGhvcGVmdWwgY2FsbGVycyBvZgorICAgICAqIDxjb2RlPm15Q2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTwvY29kZT4gaGFwcHkuIFRodXMgd2UgY29uc3RydWN0IGEKKyAgICAgKiBQYWNrYWdlIG9iamVjdCB0aGUgZmlyc3QgdGltZSBpdCBpcyBiZWluZyByZXF1ZXN0ZWQgYW5kIGZpbGwgbW9zdCBvZiB0aGUKKyAgICAgKiBmaWVsZHMgd2l0aCBkdW1teSB2YWx1ZXMuIFRoZSBQYWNrYWdlIG9iamVjdCBpcyB0aGVuIHB1dCBpbnRvIHRoZQorICAgICAqIENsYXNzTG9hZGVyJ3MgUGFja2FnZSBjYWNoZSwgc28gd2Ugc2VlIHRoZSBzYW1lIG9uZSBuZXh0IHRpbWUuIFdlIGRvbid0CisgICAgICogY3JlYXRlIFBhY2thZ2Ugb2JqZWN0cyBmb3IgbnVsbCBhcmd1bWVudHMgb3IgZm9yIHRoZSBkZWZhdWx0IHBhY2thZ2UuCisgICAgICogPHA+CisgICAgICogVGhlcmUgYSBsaW1pdGVkIGNoYW5jZSB0aGF0IHdlIGVuZCB1cCB3aXRoIG11bHRpcGxlIFBhY2thZ2Ugb2JqZWN0cworICAgICAqIHJlcHJlc2VudGluZyB0aGUgc2FtZSBwYWNrYWdlOiBJdCBjYW4gaGFwcGVuIHdoZW4gd2hlbiBhIHBhY2thZ2UgaXMKKyAgICAgKiBzY2F0dGVyZWQgYWNyb3NzIGRpZmZlcmVudCBKQVIgZmlsZXMgYmVpbmcgbG9hZGVkIGJ5IGRpZmZlcmVudAorICAgICAqIENsYXNzTG9hZGVycy4gUmF0aGVyIHVubGlrZWx5LCBhbmQgZ2l2ZW4gdGhhdCB0aGlzIHdob2xlIHRoaW5nIGlzIG1vcmUgb3IKKyAgICAgKiBsZXNzIGEgd29ya2Fyb3VuZCwgcHJvYmFibHkgbm90IHdvcnRoIHRoZSBlZmZvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNsYXNzLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUKKyAgICAgKiAgICAgICAgIGlzIG5vdCBwYWNrYWdlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmb3IgaXQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUGFja2FnZSBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBQYWNrYWdlIHBhY2sgPSBzdXBlci5nZXRQYWNrYWdlKG5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKHBhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYWNrID0gZGVmaW5lUGFja2FnZShuYW1lLCAiVW5rbm93biIsICIwLjAiLCAiVW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLCAiMC4wIiwgIlVua25vd24iLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9EZXhGaWxlLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL0RleEZpbGUuamF2YQppbmRleCA4ZmExMDYyLi5kYTUxZTQ1IDEwMDY0NAotLS0gYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL0RleEZpbGUuamF2YQorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL0RleEZpbGUuamF2YQpAQCAtMjQsODAgKzI0LDE4NSBAQAogCiAKIC8qKgotICogTWFuaXB1bGF0ZSBERVggZmlsZXMuICBTaW1pbGFyIGluIHByaW5jaXBsZSB0byBqYXZhLnV0aWwuemlwLlppcEZpbGUuCi0gKiBVc2VkIHByaW1hcmlseSBieSBjbGFzcyBsb2FkZXJzLgotICoKLSAqIFdlIGRvbid0IGRpcmVjdGx5IG9wZW4gYW5kIHJlYWQgdGhlIERFWCBmaWxlIGhlcmUuICBUaGV5J3JlIG1hcHBlZCByZWFkLW9ubHkKLSAqIGJ5IHRoZSBWTS4KKyAqIE1hbmlwdWxhdGVzIERFWCBmaWxlcy4gVGhlIGNsYXNzIGlzIHNpbWlsYXIgaW4gcHJpbmNpcGxlIHRvCisgKiB7QGxpbmsgamF2YS51dGlsLnppcC5aaXBGaWxlfS4gSXQgaXMgdXNlZCBwcmltYXJpbHkgYnkgY2xhc3MgbG9hZGVycy4KKyAqIDxwPgorICogTm90ZSB3ZSBkb24ndCBkaXJlY3RseSBvcGVuIGFuZCByZWFkIHRoZSBERVggZmlsZSBoZXJlLiBUaGV5J3JlIG1lbW9yeS1tYXBwZWQKKyAqIHJlYWQtb25seSBieSB0aGUgVk0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRGV4RmlsZSB7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvb2tpZTsKICAgICBwcml2YXRlIFN0cmluZyBtRmlsZU5hbWU7CiAKICAgICAvKioKLSAgICAgKiBPcGVuIGEgREVYIGZpbGUgZnJvbSBhIEZpbGUgb2JqZWN0LgorICAgICAqIE9wZW5zIGEgREVYIGZpbGUgZnJvbSBhIGdpdmVuIEZpbGUgb2JqZWN0LiBUaGlzIHdpbGwgdXN1YWxseSBiZSBhIFpJUC9KQVIKKyAgICAgKiBmaWxlIHdpdGggYSAiY2xhc3Nlcy5kZXgiIGluc2lkZS4gVGhlIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGZpbGVzCisgICAgICogaW5zaWRlIHRoZSBEYWx2aWsgY2FjaGUuCisgICAgICogCisgICAgICogQGN0cyBXaGF0IHdpbGwgaGFwcGVuIGlmIHdlIHJlZmVyIHRvIHRoZSBEYWx2aWsgY2FjaGU/IFNob3VsZCBiZSBlaXRoZXIKKyAgICAgKiAgICAgIHNwZWNpZmllZCBvciB0aHJvdyBhbiBleGNlcHRpb24uLi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZQorICAgICAqICAgICAgICAgICAgdGhlIEZpbGUgb2JqZWN0IHJlZmVyZW5jaW5nIHRoZSBhY3R1YWwgREVYIGZpbGUKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycywgc3VjaCBhcyB0aGUgZmlsZSBub3QgYmVpbmcgZm91bmQgb3IKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MgcmlnaHRzIG1pc3NpbmcgZm9yIG9wZW5pbmcgaXQKICAgICAgKi8KICAgICBwdWJsaWMgRGV4RmlsZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoZmlsZS5nZXRQYXRoKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9wZW4gYSBERVggZmlsZSBmcm9tIGEgZmlsZW5hbWUgKHByZWZlcnJhYmx5IGEgZnVsbCBwYXRoKS4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCB1c3VhbGx5IGJlIGEgWmlwL0phciB3aXRoIGEgImNsYXNzZXMuZGV4IiBpbnNpZGUuICBEbyBub3QKLSAgICAgKiBzcGVjaWZ5IHRoZSAiZGFsdmlrLWNhY2hlIiB2ZXJzaW9uIGRpcmVjdGx5LgorICAgICAqIE9wZW5zIGEgREVYIGZpbGUgZnJvbSBhIGdpdmVuIGZpbGVuYW1lLiBUaGlzIHdpbGwgdXN1YWxseSBiZSBhIFpJUC9KQVIKKyAgICAgKiBmaWxlIHdpdGggYSAiY2xhc3Nlcy5kZXgiIGluc2lkZS4gVGhlIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGZpbGVzCisgICAgICogaW5zaWRlIHRoZSBEYWx2aWsgY2FjaGUuCisgICAgICogCisgICAgICogQGN0cyBXaGF0IHdpbGwgaGFwcGVuIGlmIHdlIHJlZmVyIHRvIHRoZSBEYWx2aWsgY2FjaGU/IFNob3VsZCBiZSBlaXRoZXIKKyAgICAgKiAgICAgIHNwZWNpZmllZCBvciB0aHJvdyBhbiBleGNlcHRpb24uLi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlbmFtZSBvZiB0aGUgREVYIGZpbGUKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycywgc3VjaCBhcyB0aGUgZmlsZSBub3QgYmVpbmcgZm91bmQgb3IKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MgcmlnaHRzIG1pc3NpbmcgZm9yIG9wZW5pbmcgaXQKICAgICAgKi8KICAgICBwdWJsaWMgRGV4RmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyB3YW50RGV4ID0gU3lzdGVtLmdldFByb3BlcnR5KCJhbmRyb2lkLnZtLmRleGZpbGUiLCAiZmFsc2UiKTsKICAgICAgICAgaWYgKCF3YW50RGV4LmVxdWFscygidHJ1ZSIpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJObyBkZXggaW4gdGhpcyBWTSIpOwogCi0gICAgICAgIG1Db29raWUgPSBvcGVuRGV4RmlsZShmaWxlTmFtZSk7CisgICAgICAgIG1Db29raWUgPSBvcGVuRGV4RmlsZShmaWxlTmFtZSwgbnVsbCwgMCk7CiAgICAgICAgIG1GaWxlTmFtZSA9IGZpbGVOYW1lOwogICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiREVYIEZJTEUgY29va2llIGlzICIgKyBtQ29va2llKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG9wZW4gZmlsZS4KKyAgICAgKiBPcGVucyBhIERFWCBmaWxlIGZyb20gYSBnaXZlbiBmaWxlbmFtZSwgdXNpbmcgYSBzcGVjaWZpZWQgZmlsZQorICAgICAqIHRvIGhvbGQgdGhlIG9wdGltaXplZCBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZU5hbWUKKyAgICAgKiAgSmFyIG9yIEFQSyBmaWxlIHdpdGggImNsYXNzZXMuZGV4Ii4KKyAgICAgKiBAcGFyYW0gb3V0cHV0TmFtZQorICAgICAqICBGaWxlIHRoYXQgd2lsbCBob2xkIHRoZSBvcHRpbWl6ZWQgZm9ybSBvZiB0aGUgREVYIGRhdGEuCisgICAgICogQHBhcmFtIGZsYWdzCisgICAgICogIEVuYWJsZSBvcHRpb25hbCBmZWF0dXJlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIERleEZpbGUoU3RyaW5nIHNvdXJjZU5hbWUsIFN0cmluZyBvdXRwdXROYW1lLCBpbnQgZmxhZ3MpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHdhbnREZXggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImFuZHJvaWQudm0uZGV4ZmlsZSIsICJmYWxzZSIpOworICAgICAgICBpZiAoIXdhbnREZXguZXF1YWxzKCJ0cnVlIikpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIGRleCBpbiB0aGlzIFZNIik7CisKKyAgICAgICAgbUNvb2tpZSA9IG9wZW5EZXhGaWxlKHNvdXJjZU5hbWUsIG91dHB1dE5hbWUsIGZsYWdzKTsKKyAgICAgICAgbUZpbGVOYW1lID0gc291cmNlTmFtZTsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRFWCBGSUxFIGNvb2tpZSBpcyAiICsgbUNvb2tpZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiBhIERFWCBmaWxlLCBzcGVjaWZ5aW5nIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBvcHRpbWl6ZWQgREVYCisgICAgICogZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4gIElmIHRoZSBvcHRpbWl6ZWQgZm9ybSBleGlzdHMgYW5kIGFwcGVhcnMKKyAgICAgKiB0byBiZSBjdXJyZW50LCBpdCB3aWxsIGJlIHVzZWQ7IGlmIG5vdCwgdGhlIFZNIHdpbGwgYXR0ZW1wdCB0bworICAgICAqIHJlZ2VuZXJhdGUgaXQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgYnkgYXBwbGljYXRpb25zIHRoYXQgd2lzaCB0byBkb3dubG9hZAorICAgICAqIGFuZCBleGVjdXRlIERFWCBmaWxlcyBvdXRzaWRlIHRoZSB1c3VhbCBhcHBsaWNhdGlvbiBpbnN0YWxsYXRpb24KKyAgICAgKiBtZWNoYW5pc20uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuCisgICAgICogYXBwbGljYXRpb247IGluc3RlYWQsIHVzZSBhIGNsYXNzIGxvYWRlciBzdWNoIGFzCisgICAgICogZGFsdmlrLnN5c3RlbS5EZXhDbGFzc0xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VQYXRoTmFtZQorICAgICAqICBKYXIgb3IgQVBLIGZpbGUgd2l0aCAiY2xhc3Nlcy5kZXgiLiAgKE1heSBleHBhbmQgdGhpcyB0byBpbmNsdWRlCisgICAgICogICJyYXcgREVYIiBpbiB0aGUgZnV0dXJlLikKKyAgICAgKiBAcGFyYW0gb3V0cHV0UGF0aE5hbWUKKyAgICAgKiAgRmlsZSB0aGF0IHdpbGwgaG9sZCB0aGUgb3B0aW1pemVkIGZvcm0gb2YgdGhlIERFWCBkYXRhLgorICAgICAqIEBwYXJhbSBmbGFncworICAgICAqICBFbmFibGUgb3B0aW9uYWwgZmVhdHVyZXMuICAoQ3VycmVudGx5IG5vbmUgZGVmaW5lZC4pCisgICAgICogQHJldHVybgorICAgICAqICBBIG5ldyBvciBwcmV2aW91c2x5LW9wZW5lZCBEZXhGaWxlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgSWYgdW5hYmxlIHRvIG9wZW4gdGhlIHNvdXJjZSBvciBvdXRwdXQgZmlsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIERleEZpbGUgbG9hZERleChTdHJpbmcgc291cmNlUGF0aE5hbWUsIFN0cmluZyBvdXRwdXRQYXRoTmFtZSwKKyAgICAgICAgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8qCisgICAgICAgICAqIFRPRE86IHdlIG1heSB3YW50IHRvIGNhY2hlIHByZXZpb3VzbHktb3BlbmVkIERleEZpbGUgb2JqZWN0cy4KKyAgICAgICAgICogVGhlIGNhY2hlIHdvdWxkIGJlIHN5bmNocm9uaXplZCB3aXRoIGNsb3NlKCkuICBUaGlzIHdvdWxkIGhlbHAKKyAgICAgICAgICogdXMgYXZvaWQgbWFwcGluZyB0aGUgc2FtZSBERVggbW9yZSB0aGFuIG9uY2Ugd2hlbiBhbiBhcHAKKyAgICAgICAgICogZGVjaWRlZCB0byBvcGVuIGl0IG11bHRpcGxlIHRpbWVzLiAgSW4gcHJhY3RpY2UgdGhpcyBtYXkgbm90CisgICAgICAgICAqIGJlIGEgcmVhbCBpc3N1ZS4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBuZXcgRGV4RmlsZShzb3VyY2VQYXRoTmFtZSwgb3V0cHV0UGF0aE5hbWUsIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSAoYWxyZWFkeSBvcGVuZWQpIERFWCBmaWxlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1GaWxlTmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSBhIERFWCBmaWxlLgotICAgICAqCi0gICAgICogVGhpcyBtYXkgbm90IGJlIGFibGUgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzLiAgSWYgY2xhc3NlcyBoYXZlCi0gICAgICogYmVlbiBsb2FkZWQsIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgY2FuJ3QgYmUgZGlzY2FyZGVkLgorICAgICAqIENsb3NlcyB0aGUgREVYIGZpbGUuCisgICAgICogPHA+CisgICAgICogVGhpcyBtYXkgbm90IGJlIGFibGUgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzLiBJZiBjbGFzc2VzIGhhdmUgYmVlbgorICAgICAqIGxvYWRlZCwgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBjYW4ndCBiZSBkaXNjYXJkZWQuCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgZHVyaW5nIGNsb3NpbmcgdGhlIGZpbGUsIHdoaWNoCisgICAgICogICAgICAgICAgICAgbm9ybWFsbHkgc2hvdWxkIG5vdCBoYXBwZW4KKyAgICAgKiAKKyAgICAgKiBAY3RzIFNlY29uZCBzZW50ZW5jZSBpcyBhIGJpdCBjcnlwdGljLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xvc2VEZXhGaWxlKG1Db29raWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgYSBjbGFzcy4gIFJldHVybnMgdGhlIGNsYXNzIG9uIHN1Y2Nlc3MsIG9yIGEgbnVsbCByZWZlcmVuY2UKKyAgICAgKiBMb2FkcyBhIGNsYXNzLiBSZXR1cm5zIHRoZSBjbGFzcyBvbiBzdWNjZXNzLCBvciBhIHtAY29kZSBudWxsfSByZWZlcmVuY2UKICAgICAgKiBvbiBmYWlsdXJlLgotICAgICAqCi0gICAgICogSWYgeW91IGFyZSBub3QgY2FsbGluZyB0aGlzIGZyb20gYSBjbGFzcyBsb2FkZXIsIHRoaXMgaXMgbW9zdCBsaWtlbHkKLSAgICAgKiBub3QgZ29pbmcgdG8gZG8gd2hhdCB5b3Ugd2FudC4gIFVzZSBDbGFzcy5mb3JOYW1lKCkgaW5zdGVhZC4KLSAgICAgKgotICAgICAqICJuYW1lIiBzaG91bGQgbG9vayBsaWtlICJqYXZhL2xhbmcvU3RyaW5nIi4KLSAgICAgKgotICAgICAqIEknbSBub3QgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBpc24ndCBmb3VuZCBiZWNhdXNlIEkKLSAgICAgKiBkb24ndCB3YW50IHRvIGJlIHRocm93aW5nIGV4Y2VwdGlvbnMgd2lsZGx5IGV2ZXJ5IHRpbWUgd2UgbG9hZCBhCi0gICAgICogY2xhc3MgdGhhdCBpc24ndCBpbiB0aGUgZmlyc3QgREVYIGZpbGUgd2UgbG9vayBhdC4gIFRoaXMgbWV0aG9kCi0gICAgICogKndpbGwqIHRocm93IGV4Y2VwdGlvbnMgZm9yIGFueXRoaW5nIHRoYXQgaXNuJ3QgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB5b3UgYXJlIG5vdCBjYWxsaW5nIHRoaXMgZnJvbSBhIGNsYXNzIGxvYWRlciwgdGhpcyBpcyBtb3N0IGxpa2VseSBub3QKKyAgICAgKiBnb2luZyB0byBkbyB3aGF0IHlvdSB3YW50LiBVc2Uge0BsaW5rIENsYXNzI2Zvck5hbWUoU3RyaW5nKX0gaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGRvZXMgbm90IHRocm93IHtAbGluayBDbGFzc05vdEZvdW5kRXhjZXB0aW9ufSBpZiB0aGUgY2xhc3MKKyAgICAgKiBpc24ndCBmb3VuZCBiZWNhdXNlIGl0IGlzbid0IGZlYXNpYmxlIHRvIHRocm93IGV4Y2VwdGlvbnMgd2lsZGx5IGV2ZXJ5CisgICAgICogdGltZSBhIGNsYXNzIGlzIG5vdCBmb3VuZCBpbiB0aGUgZmlyc3QgREVYIGZpbGUgd2UgbG9vayBhdC4gSXQgd2lsbAorICAgICAqIHRocm93IGV4Y2VwdGlvbnMgZm9yIG90aGVyIGZhaWx1cmVzLCB0aG91Z2guCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBuYW1lLCB3aGljaCBzaG91bGQgbG9vayBsaWtlICJqYXZhL2xhbmcvU3RyaW5nIgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2FkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBsb2FkZXIgdGhhdCB0cmllcyB0byBsb2FkIHRoZSBjbGFzcyAoaW4gbW9zdCBjYXNlcworICAgICAqICAgICAgICAgICAgdGhlIGNhbGxlciBvZiB0aGUgbWV0aG9kCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIENsYXNzfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjbGFzcywgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGxvYWRlZAorICAgICAqIAorICAgICAqIEBjdHMgRXhjZXB0aW9uIGNvbW1lbnQgaXMgYSBiaXQgY3J5cHRpYy4gV2hhdCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24/CiAgICAgICovCiAgICAgcHVibGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CiAgICAgICAgIHJldHVybiBkZWZpbmVDbGFzcyhuYW1lLCBsb2FkZXIsIG1Db29raWUsCiAgICAgICAgICAgICBudWxsKTsKICAgICAgICAgICAgIC8vbmV3IFByb3RlY3Rpb25Eb21haW4obmFtZSkgLypERUJVRyBPTkxZKi8pOwogICAgIH0KKyAgICAKICAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZGVmaW5lQ2xhc3MoU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGxvYWRlciwKICAgICAgICAgaW50IGNvb2tpZSwgUHJvdGVjdGlvbkRvbWFpbiBwZCk7CiAKICAgICAvKioKICAgICAgKiBFbnVtZXJhdGUgdGhlIG5hbWVzIG9mIHRoZSBjbGFzc2VzIGluIHRoaXMgREVYIGZpbGUuCisgICAgICogCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBuYW1lcyBvZiBjbGFzc2VzIGNvbnRhaW5lZCBpbiB0aGUgREVYIGZpbGUsIGluCisgICAgICogICAgICAgICB0aGUgdXN1YWwgaW50ZXJuYWwgZm9ybSAobGlrZSAiamF2YS9sYW5nL1N0cmluZyIpLgogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGVudHJpZXMoKSB7CiAgICAgICAgIHJldHVybiBuZXcgREZFbnVtKHRoaXMpOwpAQCAtMTI4LDcgKzIzMywxMSBAQAogICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRDbGFzc05hbWVMaXN0KGludCBjb29raWUpOwogCiAgICAgLyoqIAotICAgICAqIEdDIGhlbHBlci4KKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2xhc3MgaXMgZmluYWxpemVkLiBNYWtlcyBzdXJlIHRoZSBERVggZmlsZSBpcyBjbG9zZWQuCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgZHVyaW5nIGNsb3NpbmcgdGhlIGZpbGUsIHdoaWNoCisgICAgICogICAgICAgICAgICAgbm9ybWFsbHkgc2hvdWxkIG5vdCBoYXBwZW4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNsb3NlKCk7CkBAIC0xMzgsNyArMjQ3LDEyIEBACiAgICAgICogT3BlbiBhIERFWCBmaWxlLiAgVGhlIHZhbHVlIHJldHVybmVkIGlzIGEgbWFnaWMgVk0gY29va2llLiAgT24KICAgICAgKiBmYWlsdXJlLCBhbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICovCi0gICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIGludCBvcGVuRGV4RmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgaW50IG9wZW5EZXhGaWxlKFN0cmluZyBzb3VyY2VOYW1lLCBTdHJpbmcgb3V0cHV0TmFtZSwKKyAgICAgICAgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKgorICAgICAqIENsb3NlIERFWCBmaWxlLgorICAgICAqLwogICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlRGV4RmlsZShpbnQgY29va2llKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9QYXRoQ2xhc3NMb2FkZXIuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vUGF0aENsYXNzTG9hZGVyLmphdmEKaW5kZXggNGRhY2YzZi4uOTRlZGZhMSAxMDA2NDQKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9QYXRoQ2xhc3NMb2FkZXIuamF2YQorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1BhdGhDbGFzc0xvYWRlci5qYXZhCkBAIC0yMyw2ICsyMyw5IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CiBpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKQEAgLTMwLDkgKzMzLDEyIEBACiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5EZXhGaWxlOwogCiAvKioKLSAqIFNpbXBsZSBDbGFzc0xvYWRlciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBUaGlzIGxvYWRzIGNsYXNzZXMgZnJvbSBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0LgorICogUHJvdmlkZXMgYSBzaW1wbGUge0BsaW5rIENsYXNzTG9hZGVyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IG9wZXJhdGVzIG9uIGEgbGlzdAorICogb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgYnV0IGRvZXMgbm90IGF0dGVtcHQgdG8KKyAqIGxvYWQgY2xhc3NlcyBmcm9tIHRoZSBuZXR3b3JrLiBBbmRyb2lkIHVzZXMgdGhpcyBjbGFzcyBmb3IgaXRzIHN5c3RlbSBjbGFzcworICogbG9hZGVyIGFuZCBmb3IgaXRzIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlcihzKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXRoQ2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CiAKQEAgLTQ4LDIyICs1NCw0MyBAQAogICAgIHByaXZhdGUgU3RyaW5nW10gbUxpYlBhdGhzOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQ2xhc3NMb2FkZXIgdGhhdCBmaW5kcyBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIHBhdGguCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBQYXRoQ2xhc3NMb2FkZXJ9IHRoYXQgb3BlcmF0ZXMgb24gYSBnaXZlbiBsaXN0IG9mIGZpbGVzCisgICAgICogYW5kIGRpcmVjdG9yaWVzLiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgI1BhdGhDbGFzc0xvYWRlcihTdHJpbmcsIFN0cmluZywgQ2xhc3NMb2FkZXIpIHdpdGggYSB7QGNvZGUgbnVsbH0KKyAgICAgKiB2YWx1ZSBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCAoc2VlIGRlc2NyaXB0aW9uIHRoZXJlKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmVudAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIKICAgICAgKi8KICAgICBwdWJsaWMgUGF0aENsYXNzTG9hZGVyKFN0cmluZyBwYXRoLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKICAgICAgICAgdGhpcyhwYXRoLCBudWxsLCBwYXJlbnQpOwogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBDbGFzc0xvYWRlciB0aGF0IGZpbmRzIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgcGF0aC4KLSAgICAgKgotICAgICAqIFRoZSBwYXRoIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiAgRm9yCi0gICAgICogRGFsdmlrLCB0aGlzIGlzIHVzdWFsbHkgYSBsaXN0IG9mIC5qYXIgYW5kIC5hcGsgZmlsZW5hbWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggQSBjb2xvbi1zZXBhcmF0ZWQgY2xhc3MgcGF0aC4KLSAgICAgKiBAcGFyYW0gbGliUGF0aCBBIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoZXJlIG5hdGl2ZQotICAgICAqIGxpYnJhcmllcyBjYW4gYmUgZm91bmQuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNsYXNzIGxvYWRlci4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFBhdGhDbGFzc0xvYWRlcn0gdGhhdCBvcGVyYXRlcyBvbiB0d28gZ2l2ZW4gbGlzdHMgb2YKKyAgICAgKiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIFRoZSBlbnRyaWVzIG9mIHRoZSBmaXJzdCBsaXN0IHNob3VsZCBiZSBvbmUgb2YgdGhlCisgICAgICogZm9sbG93aW5nOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+RGlyZWN0b3JpZXMgY29udGFpbmluZyBjbGFzc2VzIG9yIHJlc291cmNlcy4KKyAgICAgKiA8bGk+SkFSL1pJUC9BUEsgZmlsZXMsIHBvc3NpYmx5IGNvbnRhaW5pbmcgYSAiY2xhc3Nlcy5kZXgiIGZpbGUuCisgICAgICogPGxpPiJjbGFzc2VzLmRleCIgZmlsZXMuCisgICAgICogPC91bD4KKyAgICAgKiBUaGUgZW50cmllcyBvZiB0aGUgc2Vjb25kIGxpc3Qgc2hvdWxkIGJlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbmF0aXZlCisgICAgICogbGlicmFyeSBmaWxlcy4gQm90aCBsaXN0cyBhcmUgc2VwYXJhdGVkIHVzaW5nIHRoZSBjaGFyYWN0ZXIgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlICJwYXRoLnNlcGFyYXRvciIgc3lzdGVtIHByb3BlcnR5LCB3aGljaCwgb24gQW5kcm9pZCwgZGVmYXVsdHMgdG8gIjoiLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgY29udGFpbmluZyBjbGFzc2VzIGFuZAorICAgICAqICAgICAgICAgICAgcmVzb3VyY2VzCisgICAgICogCisgICAgICogQHBhcmFtIGxpYlBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbmF0aXZlIGxpYnJhcmllcworICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyCiAgICAgICovCiAgICAgcHVibGljIFBhdGhDbGFzc0xvYWRlcihTdHJpbmcgcGF0aCwgU3RyaW5nIGxpYlBhdGgsIENsYXNzTG9hZGVyIHBhcmVudCkgewogICAgICAgICBzdXBlcihwYXJlbnQpOwpAQCAtMTQ4LDE0ICsxNzUsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gIE5vbmUgb2Ygb3VyIGFuY2VzdG9ycyB3ZXJlCi0gICAgICogYWJsZSB0byBmaW5kIGl0LCBzbyBpdCdzIHVwIHRvIHVzIG5vdy4KLSAgICAgKgotICAgICAqICJuYW1lIiBpcyBhICJiaW5hcnkgbmFtZSIsIGUuZy4gImphdmEubGFuZy5TdHJpbmciIG9yCi0gICAgICogImphdmEubmV0LlVSTENsYXNzTG9hZGVyJDMkMSIuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGVpdGhlciByZXR1cm4gYSB2YWxpZCBDbGFzcyBvYmplY3Qgb3IgdGhyb3cgYW4KLSAgICAgKiBleGNlcHRpb24uICBEb2VzIG5vdCByZXR1cm4gbnVsbC4KKyAgICAgKiBGaW5kcyBhIGNsYXNzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0Bjb2RlIGxvYWRDbGFzcygpfSBhZnRlciB0aGUKKyAgICAgKiBwYXJlbnQgQ2xhc3NMb2FkZXIgaGFzIGZhaWxlZCB0byBmaW5kIGEgbG9hZGVkIGNsYXNzIG9mIHRoZSBzYW1lIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBzZWFyY2ggZm9yLCBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0KKyAgICAgKiAgICAgICAgICAgIGxpa2UgImphdmEubGFuZy5TdHJpbmciIG9yICJqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciQzJDEiLgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBDbGFzc30gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2xhc3MKKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGZvdW5kCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENsYXNzPD8+IGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KQEAgLTIxNSwxMCArMjQzLDE3IEBACiAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUgKyAiIGluIGxvYWRlciAiICsgdGhpcyk7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBGaW5kIGEgcmVzb3VyY2UgYnkgbmFtZS4gIFRoaXMgY291bGQgYmUgaW4gYSBkaXJlY3Rvcnkgb3IgaW4gYW4KLSAgICAgKiBhcmNoaXZlLgorICAgIC8qKgorICAgICAqIEZpbmRzIGEgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGNvZGUgZ2V0UmVzb3VyY2UoKX0gYWZ0ZXIKKyAgICAgKiB0aGUgcGFyZW50IENsYXNzTG9hZGVyIGhhcyBmYWlsZWQgdG8gZmluZCBhIGxvYWRlZCByZXNvdXJjZSBvZiB0aGUgc2FtZQorICAgICAqIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGFzIGEgVVJMLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICByZXNvdXJjZSBpcyBub3QgZm91bmQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgZW5zdXJlSW5pdCgpOwogCkBAIC0yMjcsNDQgKzI2Miw3NSBAQAogICAgICAgICBpbnQgbGVuZ3RoID0gbVBhdGhzLmxlbmd0aDsKICAgICAgICAgCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgcGF0aEZpbGUgPSBtRmlsZXNbaV07Ci0gICAgICAgICAgICBaaXBGaWxlIHppcCA9IG1aaXBzW2ldOwotICAgICAgICAgICAgaWYgKHppcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSW5BcmNoaXZlKHppcCwgbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgZm91bmQgIiArIG5hbWUgKyAiIGluICIgKyBwYXRoRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlLnRvVVJMKCkgaXMgY29tcGxpYW50IHdpdGggUkZDIDE3MzggaW4gYWx3YXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZyBhYnNvbHV0ZSBwYXRoIG5hbWVzLiBJZiB3ZSBjb25zdHJ1Y3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVUkwgYnkgY29uY2F0ZW5hdGluZyBzdHJpbmdzLCB3ZSBtaWdodCBlbmQgdXAgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWxsZWdhbCBVUkxzIGZvciByZWxhdGl2ZSBuYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKCJqYXI6IiArIHBhdGhGaWxlLnRvVVJMKCkgKyAiIS8iICsgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIEZpbGUgZGF0YUZpbGUgPSBuZXcgRmlsZShtUGF0aHNbaV0gKyAiLyIgKyBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgZm91bmQgcmVzb3VyY2UgIiArIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhcyBhcmNoaXZlIGNhc2UgcmVnYXJkaW5nIFVSTCBjb25zdHJ1Y3Rpb24uIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFGaWxlLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQYXRoQ2xhc3NMb2FkZXI6IGNhbid0IGZpbmQgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBtUGF0aHNbaV0gKyAiJyIpOworICAgICAgICAgICAgVVJMIHJlc3VsdCA9IGZpbmRSZXNvdXJjZShuYW1lLCBpKTsKKyAgICAgICAgICAgIGlmKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZpbmRzIGFuIGVudW1lcmF0aW9uIG9mIFVSTHMgZm9yIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGZpbmQuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB7QGNvZGUgVVJMfSBvYmplY3RzIGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBFbnVtZXJhdGlvbjxVUkw+IGZpbmRSZXNvdXJjZXMoU3RyaW5nIHJlc05hbWUpIHsKKyAgICAgICAgZW5zdXJlSW5pdCgpOworCisgICAgICAgIGludCBsZW5ndGggPSBtUGF0aHMubGVuZ3RoOworICAgICAgICBBcnJheUxpc3Q8VVJMPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxVUkw+KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBVUkwgcmVzdWx0ID0gZmluZFJlc291cmNlKHJlc05hbWUsIGkpOworICAgICAgICAgICAgaWYocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRlTGlzdEFycmF5PFVSTD4ocmVzdWx0cyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSwgaW50IGkpIHsKKyAgICAgICAgRmlsZSBwYXRoRmlsZSA9IG1GaWxlc1tpXTsKKyAgICAgICAgWmlwRmlsZSB6aXAgPSBtWmlwc1tpXTsKKyAgICAgICAgaWYgKHppcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaXNJbkFyY2hpdmUoemlwLCBuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgIGZvdW5kICIgKyBuYW1lICsgIiBpbiAiICsgcGF0aEZpbGUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUudG9VUkwoKSBpcyBjb21wbGlhbnQgd2l0aCBSRkMgMTczOCBpbiBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmcgYWJzb2x1dGUgcGF0aCBuYW1lcy4gSWYgd2UgY29uc3RydWN0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBVUkwgYnkgY29uY2F0ZW5hdGluZyBzdHJpbmdzLCB3ZSBtaWdodCBlbmQgdXAgd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsIFVSTHMgZm9yIHJlbGF0aXZlIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCgiamFyOiIgKyBwYXRoRmlsZS50b1VSTCgpICsgIiEvIiArIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBhdGhGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIEZpbGUgZGF0YUZpbGUgPSBuZXcgRmlsZShtUGF0aHNbaV0gKyAiLyIgKyBuYW1lKTsKKyAgICAgICAgICAgIGlmIChkYXRhRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgIGZvdW5kIHJlc291cmNlICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFzIGFyY2hpdmUgY2FzZSByZWdhcmRpbmcgVVJMIGNvbnN0cnVjdGlvbi4gCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhRmlsZS50b1VSTCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBhdGhGaWxlLmlzRmlsZSgpKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBhdGhDbGFzc0xvYWRlcjogY2FuJ3QgZmluZCAnIgorICAgICAgICAgICAgICAgICsgbVBhdGhzW2ldICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKICAgICAvKgogICAgICAqIExvYWQgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBmcm9tIGEgZmlsZSBpbiBhIGRpcmVjdG9yeS4KQEAgLTM0NSwxMSArNDExLDE0IEBACiAgICAgICAgIHJldHVybiB6aXAuZ2V0RW50cnkobmFtZSkgIT0gbnVsbDsKICAgICB9CiAKLSAgICAvKiogICAgICAgICAKLSAgICAgKiBGaW5kIGEgbmF0aXZlIGxpYnJhcnkuCi0gICAgICoKLSAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGZpcnN0IGFwcHJvcHJpYXRlLWxvb2tpbmcgZmlsZQotICAgICAqIHdlIGZpbmQuCisgICAgLyoqCisgICAgICogRmluZHMgYSBuYXRpdmUgbGlicmFyeS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBwYXJlbnQKKyAgICAgKiBDbGFzc0xvYWRlciBoYXMgZmFpbGVkIHRvIGZpbmQgYSBuYXRpdmUgbGlicmFyeSBvZiB0aGUgc2FtZSBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsaWJuYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBmaW5kCisgICAgICogQHJldHVybiB0aGUgY29tcGxldGUgcGF0aCBvZiB0aGUgbGlicmFyeSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBsaWJyYXJ5CisgICAgICogICAgICAgICBpcyBub3QgZm91bmQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kTGlicmFyeShTdHJpbmcgbGlibmFtZSkgewogICAgICAgICBlbnN1cmVJbml0KCk7CkBAIC0zNjgsOSArNDM3LDkgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuIFVuZm9ydHVuYXRlbHksIHRoZQotICAgICAqIFBhdGhDbGFzc0xvYWRlciBkb2Vzbid0IHJlYWxseSBoYXZlIHRoaXMgaW5mb3JtYXRpb24sIGFuZCBhcyBhCi0gICAgICogbm9uLXNlY3VyZSBDbGFzc0xvYWRlciwgaXQgaXNuJ3QgZXZlbiByZXF1aXJlZCB0bywgYWNjb3JkaW5nIHRvIHRoZSBzcGVjLgotICAgICAqIFlldCwgd2Ugd2FudCB0byBwcm92aWRlIGl0LCBpbiBvcmRlciB0byBtYWtlIGFsbCB0aG9zZSBob3BlZnVsIGNhbGxlcnMgb2YKKyAgICAgKiBQYXRoQ2xhc3NMb2FkZXIgZG9lc24ndCByZWFsbHkgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLCBhbmQgYXMgYSBub24tc2VjdXJlCisgICAgICogQ2xhc3NMb2FkZXIsIGl0IGlzbid0IGV2ZW4gcmVxdWlyZWQgdG8sIGFjY29yZGluZyB0byB0aGUgc3BlYy4gWWV0LCB3ZQorICAgICAqIHdhbnQgdG8gcHJvdmlkZSBpdCwgaW4gb3JkZXIgdG8gbWFrZSBhbGwgdGhvc2UgaG9wZWZ1bCBjYWxsZXJzIG9mCiAgICAgICogPGNvZGU+bXlDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpPC9jb2RlPiBoYXBweS4gVGh1cyB3ZSBjb25zdHJ1Y3QgYQogICAgICAqIFBhY2thZ2Ugb2JqZWN0IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGJlaW5nIHJlcXVlc3RlZCBhbmQgZmlsbCBtb3N0IG9mIHRoZQogICAgICAqIGZpZWxkcyB3aXRoIGR1bW15IHZhbHVlcy4gVGhlIFBhY2thZ2Ugb2JqZWN0IGlzIHRoZW4gcHV0IGludG8gdGhlCkBAIC0zODIsNiArNDUxLDExIEBACiAgICAgICogc2NhdHRlcmVkIGFjcm9zcyBkaWZmZXJlbnQgSkFSIGZpbGVzIGJlaW5nIGxvYWRlZCBieSBkaWZmZXJlbnQKICAgICAgKiBDbGFzc0xvYWRlcnMuIFJhdGhlciB1bmxpa2VseSwgYW5kIGdpdmVuIHRoYXQgdGhpcyB3aG9sZSB0aGluZyBpcyBtb3JlIG9yCiAgICAgICogbGVzcyBhIHdvcmthcm91bmQsIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUgZWZmb3J0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciB0aGUgY2xhc3MsIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZQorICAgICAqICAgICAgICAgaXMgbm90IHBhY2thZ2UgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZvciBpdAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBQYWNrYWdlIGdldFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKQEAgLTQwMCw0ICs0NzQsMjUgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoKKyAgICAgKiBDcmVhdGUgYW4gRW51bWVyYXRpb24gZm9yIGFuIEFycmF5TGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnVtZXJhdGVMaXN0QXJyYXk8VD4gaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxUPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0IG1MaXN0OworICAgICAgICBwcml2YXRlIGludCBpID0gMDsKKworICAgICAgICBFbnVtZXJhdGVMaXN0QXJyYXkoQXJyYXlMaXN0IGxpc3QpIHsKKyAgICAgICAgICAgIG1MaXN0ID0gbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiBpIDwgbUxpc3Quc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgbmV4dEVsZW1lbnQoKSB7CisgICAgICAgICAgICBpZiAoaSA+PSBtTGlzdC5zaXplKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiAoVCkgbUxpc3QuZ2V0KGkrKyk7CisgICAgICAgIH0KKyAgICB9OwogfQpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9Qb3RlbnRpYWxEZWFkbG9ja0Vycm9yLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1BvdGVudGlhbERlYWRsb2NrRXJyb3IuamF2YQppbmRleCBkZWZhMTgyLi5jODVjYWVlIDEwMDY0NAotLS0gYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1BvdGVudGlhbERlYWRsb2NrRXJyb3IuamF2YQorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1BvdGVudGlhbERlYWRsb2NrRXJyb3IuamF2YQpAQCAtMTcsMTggKzE3LDIyIEBACiBwYWNrYWdlIGRhbHZpay5zeXN0ZW07CiAKIC8qKgotICogVGhpcyBpcyB0aHJvd24gd2hlbiB0aGUgVk0gaWRlbnRpZmllcyBhIHBvdGVudGlhbCBkZWFkbG9jay4KKyAqIElzIHRocm93biB3aGVuIHRoZSBWTSBpZGVudGlmaWVzIGEgcG90ZW50aWFsIGRlYWRsb2NrLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBvdGVudGlhbERlYWRsb2NrRXJyb3IgZXh0ZW5kcyBWaXJ0dWFsTWFjaGluZUVycm9yIHsKICAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGV4Y2VwdGlvbiB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIGRlZmF1bHQgdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyBQb3RlbnRpYWxEZWFkbG9ja0Vycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgZXhjZXB0aW9uIHdpdGggdGhlIHN1cHBsaWVkIG1lc3NhZ2Ugc3RyaW5nLgorICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIGEgZ2l2ZW4gbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQogICAgICAqLwogICAgIHB1YmxpYyBQb3RlbnRpYWxEZWFkbG9ja0Vycm9yKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9TdGFsZURleENhY2hlRXJyb3IuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vU3RhbGVEZXhDYWNoZUVycm9yLmphdmEKaW5kZXggYTEyNDA1OC4uNDRhNDBhNSAxMDA2NDQKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9TdGFsZURleENhY2hlRXJyb3IuamF2YQorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1N0YWxlRGV4Q2FjaGVFcnJvci5qYXZhCkBAIC0xNywxOSArMTcsMjEgQEAKIHBhY2thZ2UgZGFsdmlrLnN5c3RlbTsKIAogLyoqCi0gKiBUaGlzIGlzIHRocm93biB3aGVuIHRoZSBWTSBkZXRlcm1pbmVzIHRoYXQgYSBkZXggZmlsZSdzIGNhY2hlCi0gKiBpcyBvdXQgb2YgZGF0ZSwgYW5kIHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIHJlY3JlYXRlIGl0LgorICogSXMgdGhyb3duIHdoZW4gdGhlIFZNIGRldGVybWluZXMgdGhhdCBhIERFWCBmaWxlJ3MgY2FjaGUgaXMgb3V0IG9mIGRhdGUsIGFuZAorICogdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8gcmVjcmVhdGUgaXQuCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGFsZURleENhY2hlRXJyb3IgZXh0ZW5kcyBWaXJ0dWFsTWFjaGluZUVycm9yIHsKICAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGV4Y2VwdGlvbiB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIGRlZmF1bHQgdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyBTdGFsZURleENhY2hlRXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBleGNlcHRpb24gd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZSBzdHJpbmcuCisgICAgICogQ3JlYXRlcyBhIG5ldyBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGluaXRpYWxpemVzIGl0IHdpdGggYSBnaXZlbiBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCiAgICAgICovCiAgICAgcHVibGljIFN0YWxlRGV4Q2FjaGVFcnJvcihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVGVtcG9yYXJ5RGlyZWN0b3J5LmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1RlbXBvcmFyeURpcmVjdG9yeS5qYXZhCmluZGV4IGFlMGVjYjIuLjJmOTA5YWMgMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVGVtcG9yYXJ5RGlyZWN0b3J5LmphdmEKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9UZW1wb3JhcnlEaXJlY3RvcnkuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogICogY2FsbCBpbnRvIHRoaXMgY2xhc3Mgd2l0aCBhbiBhcHByb3ByaWF0ZSBiYXNlIGRpcmVjdG9yeSBkdXJpbmcgaXRzCiAgKiBzdGFydHVwLCBhcyBhIHJlYXNvbmFibHkgZWFzeSB3YXkgdG8gZ2V0IHRoZSBzdGFuZGFyZCBwcm9wZXJ0eQogICogPGNvZGU+amF2YS5pby50bXBkaXI8L2NvZGU+IHRvIHBvaW50IGF0IHNvbWV0aGluZyB1c2VmdWwuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVGVtcG9yYXJ5RGlyZWN0b3J5IHsKICAgICAvKiogc3lzdGVtIHByb3BlcnR5IG5hbWUgZm9yIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ICovCmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1RvdWNoRGV4LmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1RvdWNoRGV4LmphdmEKaW5kZXggNWFlZGJmNS4uMmRiYzNlYSAxMDA2NDQKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9Ub3VjaERleC5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVG91Y2hEZXguamF2YQpAQCAtMjMsMjQgKzIzLDMwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKIAogLyoqCi0gKiBJbmR1Y2Ugb3B0aW1pemF0aW9uL3ZlcmlmaWNhdGlvbiBvZiBhIHNldCBvZiBERVggZmlsZXMuCisgKiBJbmR1Y2VzIG9wdGltaXphdGlvbi92ZXJpZmljYXRpb24gb2YgYSBzZXQgb2YgREVYIGZpbGVzLgogICoKICAqIFRPRE86IFRoaXMgY2xhc3MgaXMgcHVibGljLCBzbyBTeXN0ZW1TZXJ2ZXIgY2FuIGFjY2VzcyBpdC4gIFRoaXMgaXMgTk9UCiAgKiB0aGUgY29ycmVjdCBsb25nLXRlcm0gc29sdXRpb247IG9uY2Ugd2UgaGF2ZSBhIHJlYWwgaW5zdGFsbGVyIGFuZC9vcgogICogZGFsdmlrLWNhY2hlIG1hbmFnZXIsIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlbW92ZWQuCisgKiAKKyAqIEBjdHMgU2VlIHRvLWRvIGFib3V0IHJlbW92aW5nIHRoaXMgY2xhc3MuLi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBUb3VjaERleCB7CiAKICAgICAvKioKLSAgICAgKiBGb3JrIGEgcHJvY2VzcywgbWFrZSBzdXJlIHRoZSBERVggZmlsZXMgYXJlIHByZXBwZWQsIGFuZCByZXR1cm4KKyAgICAgKiBGb3JrcyBhIHByb2Nlc3MsIG1ha2VzIHN1cmUgdGhlIERFWCBmaWxlcyBhcmUgcHJlcGFyZWQsIGFuZCByZXR1cm5zCiAgICAgICogd2hlbiBldmVyeXRoaW5nIGlzIGZpbmlzaGVkLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogVGhlIGZpbGVuYW1lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBmaWxlcyBhcmUKICAgICAgKiBhY3R1YWxseSBvcGVuZWQsIGJlY2F1c2UgdGhlIGRhbHZpay1jYWNoZSBmaWxlbmFtZSBpcyBiYXNlZCB1cG9uCi0gICAgICogdGhpcyBmaWxlbmFtZS4gIChUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgamFyL2FwayBzaG91bGQgd29yay4pCisgICAgICogdGhpcyBmaWxlbmFtZS4gIChUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgSkFSL1pJUC9BUEsgc2hvdWxkIHdvcmsuKQogICAgICAqCi0gICAgICogQHBhcmFtIGRleEZpbGVzIENvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIERFWCBmaWxlcy4KKyAgICAgKiBAcGFyYW0gZGV4RmlsZXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBERVggZmlsZXMuCiAgICAgICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MKKyAgICAgKiAKKyAgICAgKiBAY3RzIFdoYXQgYWJvdXQgZXJyb3IgY2FzZXM/CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgc3RhcnQoU3RyaW5nIGRleEZpbGVzKSB7CiAgICAgICAgIHJldHVybiB0cmFtcG9saW5lKGRleEZpbGVzLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuYm9vdC5jbGFzcy5wYXRoIikpOwpAQCAtNTUsOSArNjEsOSBAQAogICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyBpbnQgdHJhbXBvbGluZShTdHJpbmcgZGV4RmlsZXMsIFN0cmluZyBiY3ApOwogCiAgICAgLyoqCi0gICAgICogV2UgY29udGludWUgaGVyZSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gYXJnc1swXSBjYW4gYmUgYSBjb2xvbi1zZXBhcmF0ZWQKKyAgICAgKiBUaGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjaGlsZCBwcm9jZXNzLiBhcmdzWzBdIGNhbiBiZSBhIGNvbG9uLXNlcGFyYXRlZAogICAgICAqIHBhdGggbGlzdCwgb3IgIi0iIHRvIHJlYWQgZnJvbSBzdGRpbi4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIEFsdGVybmF0aXZlbHksIGlmIHdlJ3JlIGludm9rZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHdlCiAgICAgICoganVzdCBzdGFydCBoZXJlIChza2lwcGluZyB0aGUgZm9yay9leGVjIHN0dWZmKS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9WTURlYnVnLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1ZNRGVidWcuamF2YQppbmRleCA2NGE4MzIxLi45MDM0YWMxIDEwMDY0NAotLS0gYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1ZNRGVidWcuamF2YQorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1ZNRGVidWcuamF2YQpAQCAtMTcsMTQgKzE3LDIwIEBACiBwYWNrYWdlIGRhbHZpay5zeXN0ZW07CiAKIC8qKgotICogVk0tc3BlY2lmaWMgZGVidWcgZmVhdHVyZXMuIFRob3VnaCB0aGlzIGNsYXNzIGFuZCBtYW55IG9mIGl0cyBtZW1iZXJzCi0gKiBhcmUgcHVibGljLCB0aGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIHdyYXBwZWQgaW4gYSBtb3JlIGZyaWVuZGx5IHdheQotICogZm9yIHVzZSBieSBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzLiBPbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSwgdGhlCisgKiBQcm92aWRlcyBhY2Nlc3MgdG8gc29tZSBWTS1zcGVjaWZpYyBkZWJ1ZyBmZWF0dXJlcy4gVGhvdWdoIHRoaXMgY2xhc3MgYW5kCisgKiBtYW55IG9mIGl0cyBtZW1iZXJzIGFyZSBwdWJsaWMsIHRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgd3JhcHBlZCBpbiBhIG1vcmUKKyAqIGZyaWVuZGx5IHdheSBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuIE9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLCB0aGUKICAqIHJlY29tbWVuZGVkIHdheSB0byBhY2Nlc3MgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHRocm91Z2ggdGhlIGNsYXNzCiAgKiA8Y29kZT5hbmRyb2lkLm9zLkRlYnVnPC9jb2RlPi4KKyAqIAorICogQGN0cyBQbGVhc2UgY29tcGxldGUgdGhlIHNwZWMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgVk1EZWJ1ZyB7Ci0gICAgLyoqIGRlZmF1bHQgbWV0aG9kIHRyYWNlIGRhdGEgZmlsZSBuYW1lICovCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IG1ldGhvZCB0cmFjZSBkYXRhIGZpbGUgbmFtZS4KKyAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01FVEhPRF9UUkFDRV9GSUxFX05BTUUgPSAiL3NkY2FyZC9kbXRyYWNlLnRyYWNlIjsKIAogICAgIC8qKgpAQCAtODgsMTMgKzk0LDI0IEBACiAgICAgcHJpdmF0ZSBWTURlYnVnKCkge30KIAogICAgIC8qKgotICAgICAqIFRpbWUsIGluIG1zZWMsIHNpbmNlIHRoZSBsYXN0IGRlYnVnZ2VyIGFjdGl2aXR5LiAgLTEgaWYgZGVidWdnZXIgaXMKLSAgICAgKiBub3QgY29ubmVjdGVkLgorICAgICAqIFJldHVybnMgdGhlIHRpbWUgc2luY2UgdGhlIGxhc3Qga25vd24gZGVidWdnZXIgYWN0aXZpdHkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMsIG9yIC0xIGlmIHRoZSBkZWJ1Z2dlciBpcyBub3QgY29ubmVjdGVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBsYXN0RGVidWdnZXJBY3Rpdml0eSgpOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIGEgZGVidWdnZXIgaXMgY3VycmVudGx5IGF0dGFjaGVkLgorICAgICAqIERldGVybWluZXMgaWYgZGVidWdnaW5nIGlzIGVuYWJsZWQgaW4gdGhpcyBWTS4gIElmIGRlYnVnZ2luZyBpcyBub3QKKyAgICAgKiBlbmFibGVkLCBhIGRlYnVnZ2VyIGNhbm5vdCBiZSBhdHRhY2hlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNEZWJ1Z2dpbmdFbmFibGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGEgZGVidWdnZXIgaXMgY3VycmVudGx5IGF0dGFjaGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAoYW5kIG9ubHkgaWYpIGEgZGVidWdnZXIgaXMgY29ubmVjdGVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc0RlYnVnZ2VyQ29ubmVjdGVkKCk7CiAKQEAgLTEzNCwzMCArMTUxLDMxIEBACiAgICAgICAgIGludCBidWZmZXJTaXplLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCi0gICAgICogU3RvcCBtZXRob2QgdHJhY2luZy4KKyAgICAgKiBTdG9wcyBtZXRob2QgdHJhY2luZy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0b3BNZXRob2RUcmFjaW5nKCk7CiAKICAgICAvKioKLSAgICAgKiBTdGFydCBzZW5kaW5nIERhbHZpayBtZXRob2QgdHJhY2UgaW5mbyB0byB0aGUgZW11bGF0b3IuCisgICAgICogU3RhcnRzIHNlbmRpbmcgRGFsdmlrIG1ldGhvZCB0cmFjZSBpbmZvIHRvIHRoZSBlbXVsYXRvci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0YXJ0RW11bGF0b3JUcmFjaW5nKCk7CiAKICAgICAvKioKLSAgICAgKiBTdG9wIHNlbmRpbmcgRGFsdmlrIG1ldGhvZCB0cmFjZSBpbmZvIHRvIHRoZSBlbXVsYXRvci4KKyAgICAgKiBTdG9wcyBzZW5kaW5nIERhbHZpayBtZXRob2QgdHJhY2UgaW5mbyB0byB0aGUgZW11bGF0b3IuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdG9wRW11bGF0b3JUcmFjaW5nKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXQgYW4gaW5kaWNhdGlvbiBvZiB0aHJlYWQgQ1BVIHVzYWdlLiAgVGhlIHZhbHVlIHJldHVybmVkCi0gICAgICogaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBjdXJyZW50IHRocmVhZCBoYXMgc3BlbnQKLSAgICAgKiBleGVjdXRpbmcgY29kZSBvciB3YWl0aW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIEkvTy4KLSAgICAgKgotICAgICAqIFRoZSB0aW1lIGlzIGV4cHJlc3NlZCBpbiBuYW5vc2Vjb25kcywgYW5kIGlzIG9ubHkgbWVhbmluZ2Z1bAotICAgICAqIHdoZW4gY29tcGFyZWQgdG8gdGhlIHJlc3VsdCBmcm9tIGFuIGVhcmxpZXIgY2FsbC4gIE5vdGUgdGhhdAotICAgICAqIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBkb2VzIG5vdCBpbXBseSBuYW5vc2Vjb25kIGFjY3VyYWN5LgotICAgICAqCi0gICAgICogT24gc3lzdGVtIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIHRoZSBjYWxsIHJldHVybnMgLTEuCisgICAgICogR2V0IGFuIGluZGljYXRpb24gb2YgdGhyZWFkIENQVSB1c2FnZS4gVGhlIHZhbHVlIHJldHVybmVkIGluZGljYXRlcyB0aGUKKyAgICAgKiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBjdXJyZW50IHRocmVhZCBoYXMgc3BlbnQgZXhlY3V0aW5nIGNvZGUgb3IKKyAgICAgKiB3YWl0aW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIEkvTy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdGltZSBpcyBleHByZXNzZWQgaW4gbmFub3NlY29uZHMsIGFuZCBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgorICAgICAqIGNvbXBhcmVkIHRvIHRoZSByZXN1bHQgZnJvbSBhbiBlYXJsaWVyIGNhbGwuIE5vdGUgdGhhdCBuYW5vc2Vjb25kCisgICAgICogcmVzb2x1dGlvbiBkb2VzIG5vdCBpbXBseSBuYW5vc2Vjb25kIGFjY3VyYWN5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIENQVSB1c2FnZS4gQSB2YWx1ZSBvZiAtMSBtZWFucyB0aGUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiAgICAgICAgIHRoaXMgZmVhdHVyZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIHRocmVhZENwdVRpbWVOYW5vcygpOwogCkBAIC0xNzEsMjMgKzE4OSwzNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgcmVzZXRBbGxvY0NvdW50KGludCBraW5kcyk7CiAKICAgICAvKioKLSAgICAgKiBFc3RhYmxpc2ggYW4gb2JqZWN0IGFsbG9jYXRpb24gbGltaXQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLiAgVXNlZnVsCi0gICAgICogZm9yIGNhdGNoaW5nIHJlZ3Jlc3Npb25zIGluIGNvZGUgdGhhdCBpcyBleHBlY3RlZCB0byBvcGVyYXRlCi0gICAgICogd2l0aG91dCBjYXVzaW5nIGFueSBhbGxvY2F0aW9ucy4KLSAgICAgKgotICAgICAqIFVzZSAtMSB0byBkaXNhYmxlIHRoZSBsaW1pdC4KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIGxpbWl0LgorICAgICAqIEVzdGFibGlzaGVzIGFuIG9iamVjdCBhbGxvY2F0aW9uIGxpbWl0IGluIHRoZSBjdXJyZW50IHRocmVhZC4gVXNlZnVsIGZvcgorICAgICAqIGNhdGNoaW5nIHJlZ3Jlc3Npb25zIGluIGNvZGUgdGhhdCBpcyBleHBlY3RlZCB0byBvcGVyYXRlIHdpdGhvdXQgY2F1c2luZworICAgICAqIGFueSBhbGxvY2F0aW9ucy4gVGhlIGxpbWl0IGlzIHZhbGlkIGZyb20gdGhlIHJldHVybiBvZiB0aGlzIG1ldGhvZCB1bnRpbAorICAgICAqIGl0IGlzIGVpdGhlciBjaGFuZ2VkIG9yIHRoZSB0aHJlYWQgdGVybWluYXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbGltaXQuIEEgdmFsdWUgb2YgMCBtZWFucyBub3QgYSBzaW5nbGUgbmV3IG9iamVjdCBtYXkKKyAgICAgKiAgICAgICAgICAgIGJlIGFsbG9jYXRlZC4gQSB2YWx1ZSBvZiAtMSBkaXNhYmxlcyB0aGUgbGltaXQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgbGltaXQsIG9yIC0xIGlmIG5vIGxpbWl0IHdhcyBzZXQKKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRHbG9iYWxBbGxvY2F0aW9uTGltaXQoaW50KQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzZXRBbGxvY2F0aW9uTGltaXQoaW50IGxpbWl0KTsKIAogICAgIC8qKgotICAgICAqIEVzdGFibGlzaCBhbiBvYmplY3QgYWxsb2NhdGlvbiBsaW1pdCBmb3IgdGhlIGVudGlyZSBWTS4gIFZlcnkgbXVjaAotICAgICAqIGxpa2Ugc2V0QWxsb2NhdGlvbkxpbWl0KCkuCi0gICAgICoKLSAgICAgKiBVc2UgLTEgdG8gZGlzYWJsZSB0aGUgbGltaXQuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBsaW1pdC4KKyAgICAgKiBFc3RhYmxpc2hlcyBhbiBvYmplY3QgYWxsb2NhdGlvbiBsaW1pdCBmb3IgdGhlIGVudGlyZSBWTS4gVXNlZnVsIGZvcgorICAgICAqIGNhdGNoaW5nIHJlZ3Jlc3Npb25zIGluIGNvZGUgdGhhdCBpcyBleHBlY3RlZCB0byBvcGVyYXRlIHdpdGhvdXQgY2F1c2luZworICAgICAqIGFueSBhbGxvY2F0aW9ucy4gVGhlIGxpbWl0IGlzIHZhbGlkIGZyb20gdGhlIHJldHVybiBvZiB0aGlzIG1ldGhvZCB1bnRpbAorICAgICAqIGl0IGlzIGVpdGhlciBjaGFuZ2VkIG9yIHRoZSB0aHJlYWQgdGVybWluYXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbGltaXQuIEEgdmFsdWUgb2YgMCBtZWFucyBub3QgYSBzaW5nbGUgbmV3IG9iamVjdCBtYXkKKyAgICAgKiAgICAgICAgICAgIGJlIGFsbG9jYXRlZC4gQSB2YWx1ZSBvZiAtMSBkaXNhYmxlcyB0aGUgbGltaXQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgbGltaXQsIG9yIC0xIGlmIG5vIGxpbWl0IHdhcyBzZXQKKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRBbGxvY2F0aW9uTGltaXQoaW50KQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzZXRHbG9iYWxBbGxvY2F0aW9uTGltaXQoaW50IGxpbWl0KTsKIApAQCAtMjAwLDEyICsyMjksMTQgQEAKICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHJlc2V0SW5zdHJ1Y3Rpb25Db3VudCgpOwogCiAgICAgLyoqCi0gICAgICogRHVtcCBhIGxpc3Qgb2YgbG9hZGVkIGNsYXNzIHRvIHRoZSBsb2cgZmlsZS4KKyAgICAgKiBEdW1wcyBhIGxpc3Qgb2YgbG9hZGVkIGNsYXNzIHRvIHRoZSBsb2cgZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHByaW50TG9hZGVkQ2xhc3NlcyhpbnQgZmxhZ3MpOwogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgbG9hZGVkIGNsYXNzZXMuCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGxvYWRlZCBjbGFzc2VzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsb2FkZWQgY2xhc3NlcwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRMb2FkZWRDbGFzc0NvdW50KCk7CiAKZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1SdW50aW1lLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1ZNUnVudGltZS5qYXZhCmluZGV4IDYxNWQzMDEuLjVkNWU2MDAgMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1SdW50aW1lLmphdmEKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9WTVJ1bnRpbWUuamF2YQpAQCAtMjAsNiArMjAsOCBAQAogICogUHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIFZNLWdsb2JhbCwgRGFsdmlrLXNwZWNpZmljIGZlYXR1cmVzLgogICogQW4gYXBwbGljYXRpb24gY2Fubm90IGNyZWF0ZSBpdHMgb3duIFJ1bnRpbWUgaW5zdGFuY2UsIGFuZCBtdXN0IG9idGFpbgogICogb25lIGZyb20gdGhlIGdldFJ1bnRpbWUgbWV0aG9kLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFZNUnVudGltZSB7CiAKQEAgLTE3Myw2ICsxNzUsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBleHRlcm5hbGx5LWFsbG9jYXRlZCBieXRlcyBiZWluZyB0cmFja2VkIGJ5CiAgICAgICogdHJhY2tFeHRlcm5hbEFsbG9jYXRpb24vRnJlZSgpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcwogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgbG9uZyBnZXRFeHRlcm5hbEJ5dGVzQWxsb2NhdGVkKCk7CiB9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1ZNU3RhY2suamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1TdGFjay5qYXZhCmluZGV4IDVkN2E3ZDMuLjkzMzBjNjggMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1TdGFjay5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1TdGFjay5qYXZhCkBAIC0xNywzMiArMTcsNDEgQEAKIHBhY2thZ2UgZGFsdmlrLnN5c3RlbTsKIAogLyoqCi0gKiBWTS1pbnRlcm5hbCBjbGFzc2VzIGZvciBleGFtaW5pbmcgYSBzdGFjay4KKyAqIFByb3ZpZGVzIGEgbGltaXRlZCBpbnRlcmZhY2UgdG8gdGhlIERhbHZpayBWTSBzdGFjay4gVGhpcyBjbGFzcyBpcyBtb3N0bHkKKyAqIHVzZWQgZm9yIGltcGxlbWVudGluZyBzZWN1cml0eSBjaGVja3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgVk1TdGFjayB7CiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBkZWZpbmluZyBjbGFzcyBsb2FkZXIgb2YgdGhlIGNhbGxlcidzIGNhbGxlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBkZWZpbmluZyBjbGFzcyBsb2FkZXIgb2YgdGhlIGNhbGxlcidzIGNhbGxlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgY2xhc3MgbG9hZGVyLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcyBpcyB0aGUKKyAgICAgKiAgICAgICAgIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIuCiAgICAgICovCiAgICAgbmF0aXZlIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGRlZmluaW5nIGNsYXNzIGxvYWRlciBvZiB0aGUgY2FsbGVyJ3MgY2FsbGVyJ3MgY2FsbGVyLgorICAgICAqIFJldHVybnMgdGhlIGRlZmluaW5nIGNsYXNzIGxvYWRlciBvZiB0aGUgY2FsbGVyJ3MgY2FsbGVyJ3MgY2FsbGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBjbGFzcyBsb2FkZXIsIG9yIHtAY29kZSBudWxsfSBpZiB0aGlzIGlzIHRoZQorICAgICAqICAgICAgICAgYm9vdHN0cmFwIGNsYXNzIGxvYWRlci4KICAgICAgKi8KICAgICBuYXRpdmUgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDYWxsaW5nQ2xhc3NMb2FkZXIyKCk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gYXJyYXkgb2YgY2xhc3NlcyBmcm9tIHRoZSBtZXRob2RzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgY2xhc3NlcyBmcm9tIHRoZSBtZXRob2RzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgogICAgICAqIFdlIGNvbnRpbnVlIHVudGlsIHdlIHJlYWNoIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrIG9yIGV4Y2VlZCB0aGUKICAgICAgKiBzcGVjaWZpZWQgbWF4aW11bSBkZXB0aC4gIElmIHN0b3BBdFByaXZpbGVnZWQgaXMgc2V0LCB0aGUgbGFzdAogICAgICAqIGVsZW1lbnQgb2YgdGhlIGFycmF5IHdpbGwgYmUgdGhlIGNhbGxlciBvZiB0aGUgbW9zdC1yZWNlbnQgcHJpdmlsZWdlZAogICAgICAqIG1ldGhvZC4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIFRoZSB0b3Btb3N0IHN0YWNrIGZyYW1lICh0aGlzIG1ldGhvZCkgYW5kIHRoZSBvbmUgYWJvdmUgdGhhdCAodGhlCiAgICAgICogY2FsbGVyKSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgYXJyYXkuICBGcmFtZXMgd2l0aCBqYXZhLmxhbmcucmVmbGVjdAogICAgICAqIGNsYXNzZXMgYXJlIHNraXBwZWQgb3Zlci4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIFRoZSBjbGFzc2VzIGluIHRoZSBhcnJheSBhcmUgdGhlIGRlZmluaW5nIGNsYXNzZXMgb2YgdGhlIG1ldGhvZHMuCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGlkZW50aWNhbCB0byBIYXJtb255J3MgVk1TdGFjay5nZXRDbGFzc2VzLgogICAgICAqCiAgICAgICogQHBhcmFtIG1heERlcHRoCkBAIC01NSw3ICs2NCw3IEBACiAgICAgICAgIGJvb2xlYW4gc3RvcEF0UHJpdmlsZWdlZCk7CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgc3RhY2sgdHJhY2UgZnJvbSB0aGUgc3BlY2lmaWVkIHRocmVhZC4KKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHN0YWNrIHRyYWNlIGZyb20gdGhlIHNwZWNpZmllZCB0aHJlYWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdAogICAgICAqICAgICAgdGhyZWFkIG9mIGludGVyZXN0CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1p5Z290ZS5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9aeWdvdGUuamF2YQppbmRleCA1YzUyN2FjLi45ZDk4YmIyIDEwMDY0NAotLS0gYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1p5Z290ZS5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vWnlnb3RlLmphdmEKQEAgLTEsMTQgKzEsNDAgQEAKLS8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBkYWx2aWsuc3lzdGVtOwogCiAvKioKLSAqIEludGVyZmFjZXMgZm9yIHN1cHBvcnRpbmcgdGhlIERhbHZpayAienlnb3RlIiBmZWF0dXJlLCB3aGljaCBhbGxvd3MKLSAqIGEgVk0gaW5zdGFuY2UgdG8gYmUgcGFydGlhbGx5IGluaXRpYWxpemVkIGFuZCB0aGVuIGZvcmsoKSdkIGZyb20KLSAqIHRoZSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgc3RhdGUuCisgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIERhbHZpayAienlnb3RlIiBmZWF0dXJlLCB3aGljaCBhbGxvd3MgYSBWTSBpbnN0YW5jZSB0bworICogYmUgcGFydGlhbGx5IGluaXRpYWxpemVkIGFuZCB0aGVuIGZvcmsoKSdkIGZyb20gdGhlIHBhcnRpYWxseSBpbml0aWFsaXplZAorICogc3RhdGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBaeWdvdGUgeworICAgIC8qCisgICAgICogQml0IHZhbHVlcyBmb3IgImRlYnVnRmxhZ3MiIGFyZ3VtZW50LiAgVGhlIGRlZmluaXRpb25zIGFyZSBkdXBsaWNhdGVkCisgICAgICogaW4gdGhlIG5hdGl2ZSBjb2RlLgorICAgICAqLworICAgIC8qKiBlbmFibGUgZGVidWdnaW5nIG92ZXIgSkRXUCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHX0VOQUJMRV9ERUJVR0dFUiAgID0gMTsKKyAgICAvKiogZW5hYmxlIEpOSSBjaGVja3MgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUJVR19FTkFCTEVfQ0hFQ0tKTkkgICA9IDEgPDwgMTsKKyAgICAvKiogZW5hYmxlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgImFzc2VydCIgc3RhdGVtZW50cyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHX0VOQUJMRV9BU1NFUlQgICAgID0gMSA8PCAyOworCiAgICAgcHJpdmF0ZSBaeWdvdGUoKSB7fQogCiAgICAgLyoqCkBAIC0yNCw3ICs1MCw3IEBACiAgICAgLyoqCiAgICAgICogRm9ya3MgYSBuZXcgVk0gaW5zdGFuY2UuICBUaGUgY3VycmVudCBWTSBtdXN0IGhhdmUgYmVlbiBzdGFydGVkCiAgICAgICogd2l0aCB0aGUgLVh6eWdvdGUgZmxhZy4gPGI+Tk9URTogbmV3IGluc3RhbmNlIGtlZXBzIGFsbAotICAgICAqIHJvb3QgY2FwYWJpbGl0aWVzLiBUaGUgbmV3IHByb2Nlc3MgaXMgZXhwZWN0ZWQgdG8gY2FsbCBjYXBzZXQoKTxiPi4KKyAgICAgKiByb290IGNhcGFiaWxpdGllcy4gVGhlIG5ldyBwcm9jZXNzIGlzIGV4cGVjdGVkIHRvIGNhbGwgY2Fwc2V0KCk8L2I+LgogICAgICAqCiAgICAgICogQHBhcmFtIHVpZCB0aGUgVU5JWCB1aWQgdGhhdCB0aGUgbmV3IHByb2Nlc3Mgc2hvdWxkIHNldHVpZCgpIHRvIGFmdGVyCiAgICAgICogZm9yaygpaW5nIGFuZCBhbmQgYmVmb3JlIHNwYXduaW5nIGFueSB0aHJlYWRzLgpAQCAtMzIsNyArNTgsNyBAQAogICAgICAqIGZvcmsoKWluZyBhbmQgYW5kIGJlZm9yZSBzcGF3bmluZyBhbnkgdGhyZWFkcy4KICAgICAgKiBAcGFyYW0gZ2lkcyBudWxsLW9rOyBhIGxpc3Qgb2YgVU5JWCBnaWRzIHRoYXQgdGhlIG5ldyBwcm9jZXNzIHNob3VsZAogICAgICAqIHNldGdyb3VwcygpIHRvIGFmdGVyIGZvcmsgYW5kIGJlZm9yZSBzcGF3bmluZyBhbnkgdGhyZWFkcy4KLSAgICAgKiBAcGFyYW0gZW5hYmxlRGVidWdnZXIgdHJ1ZSBpZiBKRFdQIHNob3VsZCBiZSBlbmFibGVkLgorICAgICAqIEBwYXJhbSBkZWJ1Z0ZsYWdzIGJpdCBmbGFncyB0aGF0IGVuYWJsZSBkZWJ1Z2dpbmcgZmVhdHVyZXMuCiAgICAgICogQHBhcmFtIHJsaW1pdHMgbnVsbC1vayBhbiBhcnJheSBvZiBybGltaXQgdHVwbGVzLCB3aXRoIHRoZSBzZWNvbmQKICAgICAgKiBkaW1lbnNpb24gaGF2aW5nIGEgbGVuZ3RoIG9mIDMgYW5kIHJlcHJlc2VudGluZwogICAgICAqIChyZXNvdXJjZSwgcmxpbV9jdXIsIHJsaW1fbWF4KS4gVGhlc2UgYXJlIHNldCB2aWEgdGhlIHBvc2l4CkBAIC00Miw3ICs2OCwxOCBAQAogICAgICAqIGlmIHRoaXMgaXMgdGhlIHBhcmVudCwgb3IgLTEgb24gZXJyb3IuCiAgICAgICovCiAgICAgbmF0aXZlIHB1YmxpYyBzdGF0aWMgaW50IGZvcmtBbmRTcGVjaWFsaXplKGludCB1aWQsIGludCBnaWQsIGludFtdIGdpZHMsCi0gICAgICAgICAgICBib29sZWFuIGVuYWJsZURlYnVnZ2VyLCBpbnRbXVtdIHJsaW1pdHMpOworICAgICAgICAgICAgaW50IGRlYnVnRmxhZ3MsIGludFtdW10gcmxpbWl0cyk7CisKKyAgICAvKioKKyAgICAgKiBGb3JrcyBhIG5ldyBWTSBpbnN0YW5jZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFp5Z290ZSNmb3JrQW5kU3BlY2lhbGl6ZShpbnQsIGludCwgaW50W10sIGludCwgaW50W11bXSl9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGludCBmb3JrQW5kU3BlY2lhbGl6ZShpbnQgdWlkLCBpbnQgZ2lkLCBpbnRbXSBnaWRzLAorICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVEZWJ1Z2dlciwgaW50W11bXSBybGltaXRzKSB7CisgICAgICAgIGludCBkZWJ1Z0ZsYWdzID0gZW5hYmxlRGVidWdnZXIgPyBERUJVR19FTkFCTEVfREVCVUdHRVIgOiAwOworICAgICAgICByZXR1cm4gZm9ya0FuZFNwZWNpYWxpemUodWlkLCBnaWQsIGdpZHMsIGRlYnVnRmxhZ3MsIHJsaW1pdHMpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNwZWNpYWwgbWV0aG9kIHRvIHN0YXJ0IHRoZSBzeXN0ZW0gc2VydmVyIHByb2Nlc3MuIEluIGFkZGl0aW9uIHRvIHRoZQpAQCAtNTYsNyArOTMsNyBAQAogICAgICAqIGZvcmsoKWluZyBhbmQgYW5kIGJlZm9yZSBzcGF3bmluZyBhbnkgdGhyZWFkcy4KICAgICAgKiBAcGFyYW0gZ2lkcyBudWxsLW9rOyBhIGxpc3Qgb2YgVU5JWCBnaWRzIHRoYXQgdGhlIG5ldyBwcm9jZXNzIHNob3VsZAogICAgICAqIHNldGdyb3VwcygpIHRvIGFmdGVyIGZvcmsgYW5kIGJlZm9yZSBzcGF3bmluZyBhbnkgdGhyZWFkcy4KLSAgICAgKiBAcGFyYW0gZW5hYmxlRGVidWdnZXIgdHJ1ZSBpZiBKRFdQIHNob3VsZCBiZSBlbmFibGVkLgorICAgICAqIEBwYXJhbSBkZWJ1Z0ZsYWdzIGJpdCBmbGFncyB0aGF0IGVuYWJsZSBkZWJ1Z2dpbmcgZmVhdHVyZXMuCiAgICAgICogQHBhcmFtIHJsaW1pdHMgbnVsbC1vayBhbiBhcnJheSBvZiBybGltaXQgdHVwbGVzLCB3aXRoIHRoZSBzZWNvbmQKICAgICAgKiBkaW1lbnNpb24gaGF2aW5nIGEgbGVuZ3RoIG9mIDMgYW5kIHJlcHJlc2VudGluZwogICAgICAqIChyZXNvdXJjZSwgcmxpbV9jdXIsIHJsaW1fbWF4KS4gVGhlc2UgYXJlIHNldCB2aWEgdGhlIHBvc2l4CkBAIC02Niw1ICsxMDMsMTcgQEAKICAgICAgKiBpZiB0aGlzIGlzIHRoZSBwYXJlbnQsIG9yIC0xIG9uIGVycm9yLgogICAgICAqLwogICAgIG5hdGl2ZSBwdWJsaWMgc3RhdGljIGludCBmb3JrU3lzdGVtU2VydmVyKGludCB1aWQsIGludCBnaWQsIAotICAgICAgICAgICAgaW50W10gZ2lkcywgYm9vbGVhbiBlbmFibGVEZWJ1Z2dlciwgaW50W11bXSBybGltaXRzKTsKKyAgICAgICAgICAgIGludFtdIGdpZHMsIGludCBkZWJ1Z0ZsYWdzLCBpbnRbXVtdIHJsaW1pdHMpOworCisgICAgLyoqCisgICAgICogU3BlY2lhbCBtZXRob2QgdG8gc3RhcnQgdGhlIHN5c3RlbSBzZXJ2ZXIgcHJvY2Vzcy4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFp5Z290ZSNmb3JrU3lzdGVtU2VydmVyKGludCwgaW50LCBpbnRbXSwgaW50LCBpbnRbXVtdKX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgaW50IGZvcmtTeXN0ZW1TZXJ2ZXIoaW50IHVpZCwgaW50IGdpZCwgaW50W10gZ2lkcywKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlRGVidWdnZXIsIGludFtdW10gcmxpbWl0cykgeworICAgICAgICBpbnQgZGVidWdGbGFncyA9IGVuYWJsZURlYnVnZ2VyID8gREVCVUdfRU5BQkxFX0RFQlVHR0VSIDogMDsKKyAgICAgICAgcmV0dXJuIGZvcmtBbmRTcGVjaWFsaXplKHVpZCwgZ2lkLCBnaWRzLCBkZWJ1Z0ZsYWdzLCBybGltaXRzKTsKKyAgICB9CiB9CisKZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vcGFja2FnZS5odG1sIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1NjcxYwotLS0gL2Rldi9udWxsCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgUHJvdmlkZXMgdXRpbGl0eSBhbmQgc3lzdGVtIGluZm9ybWF0aW9uIGNsYXNzZXMgc3BlY2lmaWMgdG8gdGhlIERhbHZpayBWTS4KKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS9jaGFyc2V0L0NoYXJzZXREZWNvZGVySUNVLmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0RGVjb2RlcklDVS5qYXZhCmluZGV4IDlkNTM4N2UuLmUzM2UxYjIgMTAwNjQ0Ci0tLSBhL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS9jaGFyc2V0L0NoYXJzZXREZWNvZGVySUNVLmphdmEKKysrIGIvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NoYXJzZXQvQ2hhcnNldERlY29kZXJJQ1UuamF2YQpAQCAtMTUsNyArMTUsOSBAQAogcGFja2FnZSBjb20uaWJtLmljdTRqbmkuY2hhcnNldDsKIAogaW1wb3J0IGNvbS5pYm0uaWN1NGpuaS5jb21tb24uRXJyb3JDb2RlOwotaW1wb3J0IGNvbS5pYm0uaWN1NGpuaS5jb252ZXJ0ZXJzLk5hdGl2ZUNvbnZlcnRlcjsKKy8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorLy8gaW1wb3J0IGNvbS5pYm0uaWN1NGpuaS5jb252ZXJ0ZXJzLk5hdGl2ZUNvbnZlcnRlcjsKKy8vIEVOZCBhbmRyb2lkLXJlbW92ZWQKIAogCiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKQEAgLTI1Myw3ICsyNTUsNyBAQAogICAgICAgICAgICAgfWVsc2UgaWYoZWM9PUVycm9yQ29kZS5VX0lOVkFMSURfQ0hBUl9GT1VORCl7CiAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LnVubWFwcGFibGVGb3JMZW5ndGgoZGF0YVtJTlZBTElEX0JZVEVTXSk7CiAgICAgICAgICAgICB9ZWxzZSBpZihlYz09RXJyb3JDb2RlLlVfSUxMRUdBTF9DSEFSX0ZPVU5EKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29kZXJSZXN1bHQubWFsZm9ybWVkRm9yTGVuZ3RoKGRhdGFbSU5WQUxJRF9CWVRFU10pOworICAgICAgICAgICAgICAgIHJldHVybiBDb2RlclJlc3VsdC51bm1hcHBhYmxlRm9yTGVuZ3RoKGRhdGFbSU5WQUxJRF9CWVRFU10pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogZGVjb2RpbmcgYWN0aW9uIHN1Y2NlZGVkICovCiAgICAgICAgICAgICByZXR1cm4gQ29kZXJSZXN1bHQuVU5ERVJGTE9XOwpkaWZmIC0tZ2l0IGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NoYXJzZXQvQ2hhcnNldEVuY29kZXJJQ1UuamF2YSBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS9jaGFyc2V0L0NoYXJzZXRFbmNvZGVySUNVLmphdmEKaW5kZXggY2RjOThhNy4uMGZkYjJjNSAxMDA2NDQKLS0tIGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NoYXJzZXQvQ2hhcnNldEVuY29kZXJJQ1UuamF2YQorKysgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0RW5jb2RlcklDVS5qYXZhCkBAIC0yMiw3ICsyMiw5IEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKIAogaW1wb3J0IGNvbS5pYm0uaWN1NGpuaS5jb21tb24uRXJyb3JDb2RlOwotaW1wb3J0IGNvbS5pYm0uaWN1NGpuaS5jb252ZXJ0ZXJzLk5hdGl2ZUNvbnZlcnRlcjsKKy8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorLy8gaW1wb3J0IGNvbS5pYm0uaWN1NGpuaS5jb252ZXJ0ZXJzLk5hdGl2ZUNvbnZlcnRlcjsKKy8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAogcHVibGljIGZpbmFsIGNsYXNzIENoYXJzZXRFbmNvZGVySUNVIGV4dGVuZHMgQ2hhcnNldEVuY29kZXIgewogCmRpZmYgLS1naXQgYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0SUNVLmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0SUNVLmphdmEKaW5kZXggY2MwZTA0YS4uZGY2ZjdkYyAxMDA2NDQKLS0tIGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NoYXJzZXQvQ2hhcnNldElDVS5qYXZhCisrKyBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS9jaGFyc2V0L0NoYXJzZXRJQ1UuamF2YQpAQCAtMTUsOSArMTUsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1pbXBvcnQgY29tLmlibS5pY3U0am5pLmNvbW1vbi5FcnJvckNvZGU7Ci1pbXBvcnQgY29tLmlibS5pY3U0am5pLmNvbnZlcnRlcnMuTmF0aXZlQ29udmVydGVyOwotCisvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKy8vIGltcG9ydCBjb20uaWJtLmljdTRqbmkuY29tbW9uLkVycm9yQ29kZTsKKy8vIGltcG9ydCBjb20uaWJtLmljdTRqbmkuY29udmVydGVycy5OYXRpdmVDb252ZXJ0ZXI7CisvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAKIAogcHVibGljIGZpbmFsIGNsYXNzIENoYXJzZXRJQ1UgZXh0ZW5kcyBDaGFyc2V0ewpkaWZmIC0tZ2l0IGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NoYXJzZXQvQ2hhcnNldFByb3ZpZGVySUNVLmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0UHJvdmlkZXJJQ1UuamF2YQppbmRleCA0MmQ5Zjk5Li42ZjYzNDc5IDEwMDY0NAotLS0gYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0UHJvdmlkZXJJQ1UuamF2YQorKysgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0UHJvdmlkZXJJQ1UuamF2YQpAQCAtMTMsNyArMTMsOSBAQAogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuc3BpLkNoYXJzZXRQcm92aWRlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgY29tLmlibS5pY3U0am5pLmNvbnZlcnRlcnMuTmF0aXZlQ29udmVydGVyOworLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisvLyBpbXBvcnQgY29tLmlibS5pY3U0am5pLmNvbnZlcnRlcnMuTmF0aXZlQ29udmVydGVyOworLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogCiBwdWJsaWMgZmluYWwgY2xhc3MgQ2hhcnNldFByb3ZpZGVySUNVIGV4dGVuZHMgQ2hhcnNldFByb3ZpZGVyewogICAgIApkaWZmIC0tZ2l0IGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NvbnZlcnRlcnMvTmF0aXZlQ29udmVydGVyLmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY2hhcnNldC9OYXRpdmVDb252ZXJ0ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBpY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvY29udmVydGVycy9OYXRpdmVDb252ZXJ0ZXIuamF2YQpyZW5hbWUgdG8gaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NoYXJzZXQvTmF0aXZlQ29udmVydGVyLmphdmEKaW5kZXggYWEwY2QyNi4uMmJmYjA1MCAxMDA2NDQKLS0tIGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NvbnZlcnRlcnMvTmF0aXZlQ29udmVydGVyLmphdmEKKysrIGIvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2NoYXJzZXQvTmF0aXZlQ29udmVydGVyLmphdmEKQEAgLTcsMTMgKzcsMTMgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovIAogCi1wYWNrYWdlIGNvbS5pYm0uaWN1NGpuaS5jb252ZXJ0ZXJzOworcGFja2FnZSBjb20uaWJtLmljdTRqbmkuY2hhcnNldDsKIAogLyoqCiAgKiBDbGFzcyBmb3IgYWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIEpOSSBtZXRob2RzCiAgKiBAaW50ZXJuYWwgSUNVIDIuNAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmF0aXZlQ29udmVydGVyeworZmluYWwgY2xhc3MgTmF0aXZlQ29udmVydGVyewogICAKICAgICAvL05hdGl2ZSBtZXRob2RzCiAgICAgCmRpZmYgLS1naXQgYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvbGFuZy9VQ2hhcmFjdGVyLmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvbGFuZy9VQ2hhcmFjdGVyLmphdmEKaW5kZXggY2EyNzhhYy4uN2FiMTg0MyAxMDA2NDQKLS0tIGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL2xhbmcvVUNoYXJhY3Rlci5qYXZhCisrKyBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS9sYW5nL1VDaGFyYWN0ZXIuamF2YQpAQCAtMTQxLDYgKzE0MSw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNMb3dlckNhc2VJbXBsKGludCBjb2RlUG9pbnQpOwogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZm9yTmFtZShTdHJpbmcgYmxvY2tOYW1lKSB7CisgICAgICAgIGlmIChibG9ja05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZvcm5hbWUoYmxvY2tOYW1lKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L0NvbGxhdG9yLmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9Db2xsYXRvci5qYXZhCmluZGV4IDQ4MzQ1N2QuLjRhN2UxYmYgMTAwNjQ0Ci0tLSBhL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L0NvbGxhdG9yLmphdmEKKysrIGIvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL3RleHQvQ29sbGF0b3IuamF2YQpAQCAtNDA3LDIxICs0MDcsMjEgQEAKICAgICAgIAogICAgICAgZm9yKGludCBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGVzW2ldOwotICAgICAgICAgIAorCiAgICAgICAgICAgaW5kZXggPSBsb2NhbGUuaW5kZXhPZignXycpOwogICAgICAgICAgIGluZGV4MiA9IGxvY2FsZS5sYXN0SW5kZXhPZignXycpOwotICAgICAgICAgIAorCiAgICAgICAgICAgaWYoaW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IExvY2FsZShsb2NhbGVzW2ldKTsKICAgICAgICAgICB9IGVsc2UgaWYoaW5kZXggPT0gMiAmJiBpbmRleCA9PSBpbmRleDIpIHsKICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IExvY2FsZSgKICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUuc3Vic3RyaW5nKDAsMiksCiAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnN1YnN0cmluZygzLDUpKTsKLSAgICAgICAgICB9IGVsc2UgaWYoaW5kZXggPT0gMiAmJiBpbmRleDIgPT0gNSkgeworICAgICAgICAgIH0gZWxzZSBpZihpbmRleCA9PSAyICYmIGluZGV4MiA+IGluZGV4KSB7CiAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBMb2NhbGUoCi0gICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnN1YnN0cmluZygwLDIpLAotICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5zdWJzdHJpbmcoMyw1KSwKLSAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUuc3Vic3RyaW5nKDYpKTsKKyAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUuc3Vic3RyaW5nKDAsaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5zdWJzdHJpbmcoaW5kZXggKyAxLGluZGV4MiksCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnN1YnN0cmluZyhpbmRleDIgKyAxKSk7CiAgICAgICAgICAgfQogICAgICAgfQogICAgICAgCmRpZmYgLS1naXQgYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9EZWNpbWFsRm9ybWF0LmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9EZWNpbWFsRm9ybWF0LmphdmEKaW5kZXggNGRiYzdlMy4uZGRkNDA2MiAxMDA2NDQKLS0tIGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL3RleHQvRGVjaW1hbEZvcm1hdC5qYXZhCisrKyBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L0RlY2ltYWxGb3JtYXQuamF2YQpAQCAtNDIsNiArNDIsMTEgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gdXNlRXhwb25lbnRpYWxOb3RhdGlvbiA9IGZhbHNlOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgYnl0ZSBtaW5FeHBvbmVudERpZ2l0cyA9IDA7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbmVnUHJlZk51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIG5lZ1N1ZmZOdWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBwb3NQcmVmTnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcG9zU3VmZk51bGw7CiAgICAgCiAgICAgcHVibGljIERlY2ltYWxGb3JtYXQoU3RyaW5nIHBhdHRlcm4sIERlY2ltYWxGb3JtYXRTeW1ib2xzIGljdVN5bWJvbHMpIHsKICAgICAgICAgdGhpcy5hZGRyID0gaWN1U3ltYm9scy5nZXRBZGRyKCk7CkBAIC0xMjMsMTAgKzEyOCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgU3RyaW5nIGZpZWxkVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmKGZpZWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpZWxkVHlwZSA9IGdldEZpZWxkVHlwZShmaWVsZC5nZXRGaWVsZEF0dHJpYnV0ZSgpKTsKLSAgICAgICAgfQorICAgICAgICBTdHJpbmcgZmllbGRUeXBlID0gZ2V0RmllbGRUeXBlKGZpZWxkLmdldEZpZWxkQXR0cmlidXRlKCkpOwogICAgICAgICAKICAgICAgICAgTnVtYmVyIG51bWJlciA9IChOdW1iZXIpIHZhbHVlOwogICAgICAgICAKQEAgLTE1OCwxNSArMTYwLDExIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQobG9uZyB2YWx1ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgRmllbGRQb3NpdGlvbiBmaWVsZCkgewogCi0gICAgICAgIGlmKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgIGlmKGJ1ZmZlciA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBTdHJpbmcgZmllbGRUeXBlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmKGZpZWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpZWxkVHlwZSA9IGdldEZpZWxkVHlwZShmaWVsZC5nZXRGaWVsZEF0dHJpYnV0ZSgpKTsKLSAgICAgICAgfQorICAgICAgICBTdHJpbmcgZmllbGRUeXBlID0gZ2V0RmllbGRUeXBlKGZpZWxkLmdldEZpZWxkQXR0cmlidXRlKCkpOwogICAgICAgICAKICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IE5hdGl2ZURlY2ltYWxGb3JtYXQuZm9ybWF0KHRoaXMuYWRkciwgdmFsdWUsIGZpZWxkLCAKICAgICAgICAgICAgICAgICBmaWVsZFR5cGUsIG51bGwpOwpAQCAtMTc5LDE1ICsxNzcsMTEgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChkb3VibGUgdmFsdWUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIEZpZWxkUG9zaXRpb24gZmllbGQpIHsKIAotICAgICAgICBpZihidWZmZXIgPT0gbnVsbCkgeworICAgICAgICBpZihidWZmZXIgPT0gbnVsbCB8fCBmaWVsZCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgU3RyaW5nIGZpZWxkVHlwZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZihmaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWVsZFR5cGUgPSBnZXRGaWVsZFR5cGUoZmllbGQuZ2V0RmllbGRBdHRyaWJ1dGUoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGZpZWxkVHlwZSA9IGdldEZpZWxkVHlwZShmaWVsZC5nZXRGaWVsZEF0dHJpYnV0ZSgpKTsKICAgICAgICAgCiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBOYXRpdmVEZWNpbWFsRm9ybWF0LmZvcm1hdCh0aGlzLmFkZHIsIHZhbHVlLCBmaWVsZCwgCiAgICAgICAgICAgICAgICAgZmllbGRUeXBlLCBudWxsKTsKQEAgLTIzMiwyMiArMjI2LDEzIEBACiAgICAgICAgIAogICAgICAgICBpZihudW1iZXIgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKSB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyIHZhbEJpZ0ludGVnZXIgPSAoQmlnSW50ZWdlcikgbnVtYmVyOwotICAgICAgICAgICAgaWYodmFsQmlnSW50ZWdlci5jb21wYXJlVG8oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKSkpID4gMCkgewotICAgICAgICAgICAgICAgIHRocm93KG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgdG9vIGJpZy4gQmlnSW50ZWdlciA+IExvbmcuTUFYX1ZBTFVFIG5vdCB5ZXQgc3VwcG9ydGVkLiIpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRleHQgPSBOYXRpdmVEZWNpbWFsRm9ybWF0LmZvcm1hdCh0aGlzLmFkZHIsIAotICAgICAgICAgICAgICAgICAgICB2YWxCaWdJbnRlZ2VyLmxvbmdWYWx1ZSgpLCBudWxsLCBudWxsLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsQmlnSW50ZWdlci50b1N0cmluZygxMCksIG51bGwsIG51bGwsIGF0dHJpYnV0ZXMsIDApOwogICAgICAgICB9IGVsc2UgaWYobnVtYmVyIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgewogICAgICAgICAgICAgQmlnRGVjaW1hbCB2YWxCaWdEZWNpbWFsID0gKEJpZ0RlY2ltYWwpIG51bWJlcjsKLSAgICAgICAgICAgIGlmKHZhbEJpZ0RlY2ltYWwuY29tcGFyZVRvKAotICAgICAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbChTdHJpbmcudmFsdWVPZihEb3VibGUuTUFYX1ZBTFVFKSkpID4gMCkgewotICAgICAgICAgICAgICAgIHRocm93KG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgdG9vIGJpZy4gQmlnRGVjaW1hbCA+IERvdWJsZS5NQVhfVkFMVUUgbm90IHlldCBzdXBwb3J0ZWQuIikpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgdGV4dCA9IE5hdGl2ZURlY2ltYWxGb3JtYXQuZm9ybWF0KHRoaXMuYWRkciwgCi0gICAgICAgICAgICAgICAgICAgIHZhbEJpZ0RlY2ltYWwuZG91YmxlVmFsdWUoKSwgbnVsbCwgbnVsbCwgYXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgICAgIHZhbEJpZ0RlY2ltYWwudW5zY2FsZWRWYWx1ZSgpLnRvU3RyaW5nKDEwKSwgbnVsbCxudWxsLAorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCB2YWxCaWdEZWNpbWFsLnNjYWxlKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZG91YmxlIGR2ID0gbnVtYmVyLmRvdWJsZVZhbHVlKCk7CiAgICAgICAgICAgICBsb25nIGx2ID0gbnVtYmVyLmxvbmdWYWx1ZSgpOwpAQCAtMzMzLDIxICszMTgsMzMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5lZ2F0aXZlUHJlZml4KCkgeworICAgICAgICBpZiAobmVnUHJlZk51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBOYXRpdmVEZWNpbWFsRm9ybWF0LmdldFRleHRBdHRyaWJ1dGUodGhpcy5hZGRyLCAKICAgICAgICAgICAgICAgICBVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZS5VTlVNX05FR0FUSVZFX1BSRUZJWC5vcmRpbmFsKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmVnYXRpdmVTdWZmaXgoKSB7CisgICAgICAgIGlmIChuZWdTdWZmTnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5hdGl2ZURlY2ltYWxGb3JtYXQuZ2V0VGV4dEF0dHJpYnV0ZSh0aGlzLmFkZHIsIAogICAgICAgICAgICAgICAgIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlLlVOVU1fTkVHQVRJVkVfU1VGRklYLm9yZGluYWwoKSk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRQb3NpdGl2ZVByZWZpeCgpIHsKKyAgICAgICAgaWYgKHBvc1ByZWZOdWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gTmF0aXZlRGVjaW1hbEZvcm1hdC5nZXRUZXh0QXR0cmlidXRlKHRoaXMuYWRkciwgCiAgICAgICAgICAgICAgICAgVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUuVU5VTV9QT1NJVElWRV9QUkVGSVgub3JkaW5hbCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFBvc2l0aXZlU3VmZml4KCkgeworICAgICAgICBpZiAocG9zU3VmZk51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBOYXRpdmVEZWNpbWFsRm9ybWF0LmdldFRleHRBdHRyaWJ1dGUodGhpcy5hZGRyLCAKICAgICAgICAgICAgICAgICBVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZS5VTlVNX1BPU0lUSVZFX1NVRkZJWC5vcmRpbmFsKCkpOwogICAgIH0KQEAgLTQzMCwyMyArNDI3LDM5IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TmVnYXRpdmVQcmVmaXgoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE5hdGl2ZURlY2ltYWxGb3JtYXQuc2V0VGV4dEF0dHJpYnV0ZSh0aGlzLmFkZHIsCi0gICAgICAgICAgICAgICAgVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUuVU5VTV9ORUdBVElWRV9QUkVGSVgub3JkaW5hbCgpLCB2YWx1ZSk7CisgICAgICAgIG5lZ1ByZWZOdWxsID0gdmFsdWUgPT0gbnVsbDsKKyAgICAgICAgaWYgKCFuZWdQcmVmTnVsbCkgeworICAgICAgICAgICAgTmF0aXZlRGVjaW1hbEZvcm1hdC5zZXRUZXh0QXR0cmlidXRlKHRoaXMuYWRkciwKKyAgICAgICAgICAgICAgICAgICAgVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUuVU5VTV9ORUdBVElWRV9QUkVGSVgub3JkaW5hbCgpLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXROZWdhdGl2ZVN1ZmZpeChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTmF0aXZlRGVjaW1hbEZvcm1hdC5zZXRUZXh0QXR0cmlidXRlKHRoaXMuYWRkciwKLSAgICAgICAgICAgICAgICBVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZS5VTlVNX05FR0FUSVZFX1NVRkZJWC5vcmRpbmFsKCksIHZhbHVlKTsKKyAgICAgICAgbmVnU3VmZk51bGwgPSB2YWx1ZSA9PSBudWxsOworICAgICAgICBpZiAoIW5lZ1N1ZmZOdWxsKSB7CisgICAgICAgICAgICBOYXRpdmVEZWNpbWFsRm9ybWF0LnNldFRleHRBdHRyaWJ1dGUodGhpcy5hZGRyLAorICAgICAgICAgICAgICAgICAgICBVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZS5VTlVNX05FR0FUSVZFX1NVRkZJWC5vcmRpbmFsKCksCisgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aXZlUHJlZml4KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBOYXRpdmVEZWNpbWFsRm9ybWF0LnNldFRleHRBdHRyaWJ1dGUodGhpcy5hZGRyLAotICAgICAgICAgICAgICAgIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlLlVOVU1fUE9TSVRJVkVfUFJFRklYLm9yZGluYWwoKSwgdmFsdWUpOworICAgICAgICBwb3NQcmVmTnVsbCA9IHZhbHVlID09IG51bGw7CisgICAgICAgIGlmICghcG9zUHJlZk51bGwpIHsKKyAgICAgICAgICAgIE5hdGl2ZURlY2ltYWxGb3JtYXQuc2V0VGV4dEF0dHJpYnV0ZSh0aGlzLmFkZHIsCisgICAgICAgICAgICAgICAgICAgIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlLlVOVU1fUE9TSVRJVkVfUFJFRklYLm9yZGluYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0UG9zaXRpdmVTdWZmaXgoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE5hdGl2ZURlY2ltYWxGb3JtYXQuc2V0VGV4dEF0dHJpYnV0ZSh0aGlzLmFkZHIsCi0gICAgICAgICAgICAgICAgVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUuVU5VTV9QT1NJVElWRV9TVUZGSVgub3JkaW5hbCgpLCB2YWx1ZSk7CisgICAgICAgIHBvc1N1ZmZOdWxsID0gdmFsdWUgPT0gbnVsbDsKKyAgICAgICAgaWYgKCFwb3NTdWZmTnVsbCkgeworICAgICAgICAgICAgTmF0aXZlRGVjaW1hbEZvcm1hdC5zZXRUZXh0QXR0cmlidXRlKHRoaXMuYWRkciwKKyAgICAgICAgICAgICAgICAgICAgVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUuVU5VTV9QT1NJVElWRV9TVUZGSVgub3JkaW5hbCgpLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L05hdGl2ZUJyZWFrSXRlcmF0b3IuamF2YSBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L05hdGl2ZUJyZWFrSXRlcmF0b3IuamF2YQppbmRleCBjNDhmMWQ5Li4yNTI0OWM3IDEwMDY0NAotLS0gYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9OYXRpdmVCcmVha0l0ZXJhdG9yLmphdmEKKysrIGIvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlQnJlYWtJdGVyYXRvci5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmlibS5pY3U0am5pLnRleHQ7CiAgCi1wdWJsaWMgZmluYWwgY2xhc3MgTmF0aXZlQnJlYWtJdGVyYXRvcgorZmluYWwgY2xhc3MgTmF0aXZlQnJlYWtJdGVyYXRvcgogeyAgCiAgICAgcHVibGljIE5hdGl2ZUJyZWFrSXRlcmF0b3IoKSB7CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlQ29sbGF0aW9uLmphdmEgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9OYXRpdmVDb2xsYXRpb24uamF2YQppbmRleCA4NjA2YTg2Li4yMjQyYjY5IDEwMDY0NAotLS0gYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9OYXRpdmVDb2xsYXRpb24uamF2YQorKysgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9OYXRpdmVDb2xsYXRpb24uamF2YQpAQCAtMTYsNyArMTYsNyBAQAogKiBAaW50ZXJuYWwgSUNVIDIuNAogKi8KICAgICAKLXB1YmxpYyBmaW5hbCBjbGFzcyBOYXRpdmVDb2xsYXRpb24KK2ZpbmFsIGNsYXNzIE5hdGl2ZUNvbGxhdGlvbgogewogICAvLyBjb2xsYXRvciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAKZGlmZiAtLWdpdCBhL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L05hdGl2ZURlY2ltYWxGb3JtYXQuamF2YSBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L05hdGl2ZURlY2ltYWxGb3JtYXQuamF2YQppbmRleCBiM2I5MjY1Li4zOWY3MzA3IDEwMDY0NAotLS0gYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9OYXRpdmVEZWNpbWFsRm9ybWF0LmphdmEKKysrIGIvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiBpbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247CiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CiAKLXB1YmxpYyBmaW5hbCBjbGFzcyBOYXRpdmVEZWNpbWFsRm9ybWF0IHsKK2ZpbmFsIGNsYXNzIE5hdGl2ZURlY2ltYWxGb3JtYXQgewogCiAgICAgZW51bSBVTnVtYmVyRm9ybWF0U3ltYm9sIHsKICAgICAgICAgVU5VTV9ERUNJTUFMX1NFUEFSQVRPUl9TWU1CT0wsIApkaWZmIC0tZ2l0IGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL3RleHQvUnVsZUJhc2VkQ29sbGF0b3IuamF2YSBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L1J1bGVCYXNlZENvbGxhdG9yLmphdmEKaW5kZXggOTkzMWYyZC4uYzBhY2EzYiAxMDA2NDQKLS0tIGEvaWN1L3NyYy9tYWluL2phdmEvY29tL2libS9pY3U0am5pL3RleHQvUnVsZUJhc2VkQ29sbGF0b3IuamF2YQorKysgYi9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9SdWxlQmFzZWRDb2xsYXRvci5qYXZhCkBAIC0yNjAsOSArMjYwLDEzIEBACiAgICovCiAgIHB1YmxpYyBSdWxlQmFzZWRDb2xsYXRvcihTdHJpbmcgcnVsZXMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgogICB7Ci0gICAgCi0gICAgaWYgKHJ1bGVzLmxlbmd0aCgpID09IDApCi0gICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkJ1aWxkIHJ1bGVzIGVtcHR5LiIsIDApOworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIGlmIChydWxlcyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgLy8gaWYgKHJ1bGVzLmxlbmd0aCgpID09IDApCisgICAgLy8gICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkJ1aWxkIHJ1bGVzIGVtcHR5LiIsIDApOworICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICBtX2NvbGxhdG9yXyA9IE5hdGl2ZUNvbGxhdGlvbi5vcGVuQ29sbGF0b3JGcm9tUnVsZXMocnVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXRpb25BdHRyaWJ1dGUuVkFMVUVfT0ZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uQXR0cmlidXRlLlZBTFVFX0RFRkFVTFRfU1RSRU5HVEgpOwpAQCAtMjg1LDggKzI4OSwxMyBAQAogICAqLwogICBwdWJsaWMgUnVsZUJhc2VkQ29sbGF0b3IoU3RyaW5nIHJ1bGVzLCBpbnQgc3RyZW5ndGgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgogICB7Ci0gICAgaWYgKHJ1bGVzLmxlbmd0aCgpID09IDApCi0gICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkJ1aWxkIHJ1bGVzIGVtcHR5LiIsIDApOworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIGlmIChydWxlcyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgLy8gaWYgKHJ1bGVzLmxlbmd0aCgpID09IDApCisgICAgLy8gICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkJ1aWxkIHJ1bGVzIGVtcHR5LiIsIDApOworICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICBpZiAoIUNvbGxhdGlvbkF0dHJpYnV0ZS5jaGVja1N0cmVuZ3RoKHN0cmVuZ3RoKSkKICAgICAgIHRocm93IEVycm9yQ29kZS5nZXRFeGNlcHRpb24oRXJyb3JDb2RlLlVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUik7CiAgICAgICAKQEAgLTMyMCw2ICszMjksMTEgQEAKICAgKi8KICAgcHVibGljIFJ1bGVCYXNlZENvbGxhdG9yKFN0cmluZyBydWxlcywgaW50IG5vcm1hbGl6YXRpb25tb2RlLCBpbnQgc3RyZW5ndGgpCiAgIHsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgaWYgKHJ1bGVzID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgIGlmICghQ29sbGF0aW9uQXR0cmlidXRlLmNoZWNrU3RyZW5ndGgoc3RyZW5ndGgpIHx8IAogICAgICAgICAhQ29sbGF0aW9uQXR0cmlidXRlLmNoZWNrTm9ybWFsaXphdGlvbihub3JtYWxpemF0aW9ubW9kZSkpIHsKICAgICAgIHRocm93IEVycm9yQ29kZS5nZXRFeGNlcHRpb24oRXJyb3JDb2RlLlVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUik7CmRpZmYgLS1naXQgYS9pY3Uvc3JjL21haW4vamF2YS9jb20vaWJtL2ljdTRqbmkvdGV4dC9SdWxlQmFzZWROdW1iZXJGb3JtYXQuamF2YSBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L1J1bGVCYXNlZE51bWJlckZvcm1hdC5qYXZhCmluZGV4IDU4ZGRmMGUuLjNjODY1ZDggMTAwNjQ0Ci0tLSBhL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L1J1bGVCYXNlZE51bWJlckZvcm1hdC5qYXZhCisrKyBiL2ljdS9zcmMvbWFpbi9qYXZhL2NvbS9pYm0vaWN1NGpuaS90ZXh0L1J1bGVCYXNlZE51bWJlckZvcm1hdC5qYXZhCkBAIC04NSw4ICs4NSwxMSBAQAogICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSB0byB1c2UgZm9yIHRoaXMgcnVsZSBiYXNlZCBudW1iZXIgZm9ybWF0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb3BlbihSQk5GVHlwZSB0eXBlLCBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIHRoaXMuYWRkciA9IG9wZW5SQk5GSW1wbCh0eXBlLmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICBsb2NhbGUudG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZyBsb2MgPSBsb2NhbGUudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKGxvYyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFkZHIgPSBvcGVuUkJORkltcGwodHlwZS5nZXRUeXBlKCksIGxvYyk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgb3BlblJCTkZJbXBsKGludCB0eXBlLCBTdHJpbmcgbG9jKTsKQEAgLTk5LDYgKzEwMiw5IEBACiAgICAgICogQHBhcmFtIHJ1bGUgdGhlIHJ1bGUgZm9yIHRoZSBydWxlIGJhc2VkIG51bWJlciBmb3JtYXQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvcGVuKFN0cmluZyBydWxlKSB7CisgICAgICAgIGlmIChydWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CiAgICAgICAgIHRoaXMuYWRkciA9IG9wZW5SQk5GSW1wbChydWxlLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIApAQCAtMTExLDYgKzExNywxMCBAQAogICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSB0byB1c2UgZm9yIHRoaXMgcnVsZSBiYXNlZCBudW1iZXIgZm9ybWF0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb3BlbihTdHJpbmcgcnVsZSwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBTdHJpbmcgbG9jID0gbG9jYWxlLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChsb2MgPT0gbnVsbCB8fCBydWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CiAgICAgICAgIHRoaXMuYWRkciA9IG9wZW5SQk5GSW1wbChydWxlLCBsb2NhbGUudG9TdHJpbmcoKSk7CiAgICAgfQogICAgIApAQCAtMTc4LDYgKzE4OCw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyBzdHJpbmcsIFBhcnNlUG9zaXRpb24gcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHBvc2l0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBwYXJzZVJCTkZJbXBsKHRoaXMuYWRkciwgc3RyaW5nLCBwb3NpdGlvbiwgZmFsc2UpOwogICAgIH0KICAgICAKQEAgLTE5NCw2ICsyMDcsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIE51bWJlciByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIG51bGwgaWYgdGhlcmUgaXMgYW4gZXJyb3IKICAgICAgKi8KICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlTGVuaWVudChTdHJpbmcgc3RyaW5nLCBQYXJzZVBvc2l0aW9uIHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCB8fCBwb3NpdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcGFyc2VSQk5GSW1wbCh0aGlzLmFkZHIsIHN0cmluZywgcG9zaXRpb24sIHRydWUpOwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2ljdS9zcmMvbWFpbi9uYXRpdmUvQ29udmVydGVySW50ZXJmYWNlLmMgYi9pY3Uvc3JjL21haW4vbmF0aXZlL0NvbnZlcnRlckludGVyZmFjZS5jCmluZGV4IDFhMTYxOTcuLjM5OTYxNDYgMTAwNjQ0Ci0tLSBhL2ljdS9zcmMvbWFpbi9uYXRpdmUvQ29udmVydGVySW50ZXJmYWNlLmMKKysrIGIvaWN1L3NyYy9tYWluL25hdGl2ZS9Db252ZXJ0ZXJJbnRlcmZhY2UuYwpAQCAtODk1LDE1ICs4OTUsMTcgQEAKICAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOwogICAgIGNvbnN0IGNoYXIqIGVuY05hbWUgPSAoKmVudiktPkdldFN0cmluZ1VURkNoYXJzKGVudixlbmMsTlVMTCk7CiAgICAgY29uc3QgY2hhciogY2Fub25pY2FsTmFtZSA9ICIiOwotICAgIGpzdHJpbmcgcmV0OworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIGpzdHJpbmcgcmV0ID0gTlVMTDsKICAgICBpZihlbmNOYW1lKSB7CiAgICAgICAgIGNhbm9uaWNhbE5hbWUgPSB1Y252X2dldEFsaWFzKGVuY05hbWUsMCwmZXJyb3IpOwogICAgICAgICBpZihjYW5vbmljYWxOYW1lICE9TlVMTCAmJiBzdHJzdHIoY2Fub25pY2FsTmFtZSwiLCIpIT0wKSB7CiAgICAgICAgICAgICBjYW5vbmljYWxOYW1lID0gdWNudl9nZXRBbGlhcyhjYW5vbmljYWxOYW1lLDEsJmVycm9yKTsKICAgICAgICAgfQogICAgICAgICByZXQgPSAoKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBjYW5vbmljYWxOYW1lKSk7CisgICAgICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVudixlbmMsZW5jTmFtZSk7CiAgICAgfQotICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVudixlbmMsZW5jTmFtZSk7CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTEwNzcsMTQgKzEwNzksMTUgQEAKICAgICAgICAgfQogICAgICAgICBmcm9tVU5ld0NvbnRleHQtPm9uTWFsZm9ybWVkSW5wdXQgPSBnZXRGcm9tVUNhbGxiYWNrKG9uTWFsZm9ybWVkSW5wdXQpOwogICAgICAgICBmcm9tVU5ld0NvbnRleHQtPm9uVW5tYXBwYWJsZUlucHV0ID0gZ2V0RnJvbVVDYWxsYmFjayhvblVubWFwcGFibGVJbnB1dCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZihzdWIhPU5VTEwpIHsKICAgICAgICAgICAgIGZyb21VTmV3Q29udGV4dC0+bGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICAgc3RybmNweShmcm9tVU5ld0NvbnRleHQtPnN1YkNoYXJzLCBzdWIsIGxlbmd0aCk7CisgICAgICAgICAgICAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudixzdWJDaGFycywgc3ViLCAwKTsKICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICBlcnJvckNvZGUgPSBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CiAgICAgICAgIH0KLQotICAgICAgICAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudixzdWJDaGFycywgTlVMTCwgMCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgICAgICB1Y252X3NldEZyb21VQ2FsbEJhY2soY29udiwKICAgICAgICAgICAgZnJvbVVOZXdBY3Rpb24sCkBAIC0xMjAzLDEzICsxMjA2LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgdG9VTmV3Q29udGV4dC0+b25NYWxmb3JtZWRJbnB1dCA9IGdldFRvVUNhbGxiYWNrKG9uTWFsZm9ybWVkSW5wdXQpOwogICAgICAgICB0b1VOZXdDb250ZXh0LT5vblVubWFwcGFibGVJbnB1dCA9IGdldFRvVUNhbGxiYWNrKG9uVW5tYXBwYWJsZUlucHV0KTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGlmKHN1YiE9TlVMTCkgewogICAgICAgICAgICAgdG9VTmV3Q29udGV4dC0+bGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICAgdV9zdHJuY3B5KHRvVU5ld0NvbnRleHQtPnN1YlVDaGFycywgc3ViLCBsZW5ndGgpOworICAgICAgICAgICAgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsc3ViQ2hhcnMsIHN1YiwgMCk7CiAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgZXJyb3JDb2RlID0gIFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKICAgICAgICAgfQotICAgICAgICAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudixzdWJDaGFycywgTlVMTCwgMCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgdWNudl9zZXRUb1VDYWxsQmFjayhjb252LAogICAgICAgICAgICB0b1VOZXdBY3Rpb24sCiAgICAgICAgICAgIHRvVU5ld0NvbnRleHQsCkBAIC0xMzU4LDcgKzEzNjMsNyBAQAogfTsKIAogaW50IHJlZ2lzdGVyX2NvbV9pYm1faWN1NGpuaV9jb252ZXJ0ZXJzX05hdGl2ZUNvbnZlcnRlcihKTklFbnYgKl9lbnYpIHsKLSAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKF9lbnYsICJjb20vaWJtL2ljdTRqbmkvY29udmVydGVycy9OYXRpdmVDb252ZXJ0ZXIiLAorICAgIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoX2VudiwgImNvbS9pYm0vaWN1NGpuaS9jaGFyc2V0L05hdGl2ZUNvbnZlcnRlciIsCiAgICAgICAgICAgICAgICAgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ljdS9zcmMvbWFpbi9uYXRpdmUvRGVjaW1hbEZvcm1hdEludGVyZmFjZS5jcHAgYi9pY3Uvc3JjL21haW4vbmF0aXZlL0RlY2ltYWxGb3JtYXRJbnRlcmZhY2UuY3BwCmluZGV4IGI4N2NiYjcuLjI0M2VmZWIgMTAwNjQ0Ci0tLSBhL2ljdS9zcmMvbWFpbi9uYXRpdmUvRGVjaW1hbEZvcm1hdEludGVyZmFjZS5jcHAKKysrIGIvaWN1L3NyYy9tYWluL25hdGl2ZS9EZWNpbWFsRm9ybWF0SW50ZXJmYWNlLmNwcApAQCAtMTIxLDcgKzEyMSw3IEBACiAKICAgICB1aW50MzJfdCByZXN1bHRsZW5ndGgsIHJlc2xlbm5lZWRlZDsKIAotICAgIC8vIHRoZSBlcnJvcmNvZGUgcmV0dXJuZWQgYnkgdW51bV9zZXRTeW1ib2wKKyAgICAvLyB0aGUgZXJyb3Jjb2RlIHJldHVybmVkIGJ5IHVudW1fZ2V0U3ltYm9sCiAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAKICAgICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG51bWJlciBmb3JtYXQgICAgCkBAIC0xNzMsNyArMTczLDcgQEAKIHN0YXRpYyB2b2lkIHNldFRleHRBdHRyaWJ1dGUoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamludCBhZGRyLCBqaW50IHN5bWJvbCwgCiAgICAgICAgIGpzdHJpbmcgdGV4dCkgewogCi0gICAgLy8gdGhlIGVycm9yY29kZSByZXR1cm5lZCBieSB1bnVtX3NldFN5bWJvbAorICAgIC8vIHRoZSBlcnJvcmNvZGUgcmV0dXJuZWQgYnkgdW51bV9zZXRUZXh0QXR0cmlidXRlCiAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAKICAgICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG51bWJlciBmb3JtYXQgICAgCkBAIC0xOTUsNyArMTk1LDcgQEAKIAogICAgIHVpbnQzMl90IHJlc3VsdGxlbmd0aCwgcmVzbGVubmVlZGVkOwogCi0gICAgLy8gdGhlIGVycm9yY29kZSByZXR1cm5lZCBieSB1bnVtX3NldFN5bWJvbAorICAgIC8vIHRoZSBlcnJvcmNvZGUgcmV0dXJuZWQgYnkgdW51bV9nZXRUZXh0QXR0cmlidXRlCiAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAKICAgICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG51bWJlciBmb3JtYXQgICAgCkBAIC0yMzEsNyArMjMxLDcgQEAKIHN0YXRpYyB2b2lkIGFwcGx5UGF0dGVybkltcGwoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamludCBhZGRyLCAKICAgICAgICAgamJvb2xlYW4gbG9jYWxpemVkLCBqc3RyaW5nIHBhdHRlcm4pIHsKIAotICAgIC8vIHRoZSBlcnJvcmNvZGUgcmV0dXJuZWQgYnkgdW51bV9zZXRTeW1ib2wKKyAgICAvLyB0aGUgZXJyb3Jjb2RlIHJldHVybmVkIGJ5IHVudW1fYXBwbHlQYXR0ZXJuCiAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAKICAgICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG51bWJlciBmb3JtYXQgICAgCkBAIC0yNTIsNyArMjUyLDcgQEAKIAogICAgIHVpbnQzMl90IHJlc3VsdGxlbmd0aCwgcmVzbGVubmVlZGVkOwogCi0gICAgLy8gdGhlIGVycm9yY29kZSByZXR1cm5lZCBieSB1bnVtX3NldFN5bWJvbAorICAgIC8vIHRoZSBlcnJvcmNvZGUgcmV0dXJuZWQgYnkgdW51bV90b1BhdHRlcm4KICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKIAogICAgIC8vIGdldCB0aGUgcG9pbnRlciB0byB0aGUgbnVtYmVyIGZvcm1hdCAgICAKQEAgLTc0NCwxMyArNzQ0LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gZW52LT5OZXdPYmplY3QobG9uZ0NsYXNzLCBsb25nSW5pdE1ldGhvZElELCAKICAgICAgICAgICAgICAgICAgICAgKGpsb25nKSByZXN1bHRJbnQ2NCk7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGludCBzY2FsZSA9IGRpZ2l0cy5mQ291bnQgLSBkaWdpdHMuZkRlY2ltYWxBdDsKLSAgICAgICAgZGlnaXRzLmZEaWdpdHNbZGlnaXRzLmZDb3VudF0gPSAwOyAgLy8gbWM6IEFUVEVOVElPTjogQWJ1c2Ugb2YgSW1wbGVtZW50YXRpb24gS25vd2xlZ2RlIQorICAgICAgICAvLyBBVFRFTlRJT046IEFidXNlIG9mIEltcGxlbWVudGF0aW9uIEtub3dsZWdkZSEKKyAgICAgICAgZGlnaXRzLmZEaWdpdHNbZGlnaXRzLmZDb3VudF0gPSAwOwogICAgICAgICBpZiAoZGlnaXRzLmZJc1Bvc2l0aXZlKSB7CiAgICAgICAgICAgICByZXN1bHRTdHIgPSBlbnYtPk5ld1N0cmluZ1VURihkaWdpdHMuZkRpZ2l0cyk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NTgsNyArNzU5LDggQEAKICAgICAgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHBvc2l0aW9uLCBzZXRJbmRleE1ldGhvZElELCAoamludCkgcGFyc2VQb3MpOwogICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPk5ld09iamVjdChkb3VibGVDbGFzcywgZGJsSW5pdE1ldGhvZElELCAoamRvdWJsZSktMCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICooZGlnaXRzLmZEaWdpdHMgLSAxKSA9ICctJzsgIC8vIG1jOiBBVFRFTlRJT046IEFidXNlIG9mIEltcGxlbWVudGF0aW9uIEtub3dsZWdkZSEKKyAgICAgICAgICAgICAgICAvLyBBVFRFTlRJT046IEFidXNlIG9mIEltcGxlbWVudGF0aW9uIEtub3dsZWdkZSEKKyAgICAgICAgICAgICAgICAqKGRpZ2l0cy5mRGlnaXRzIC0gMSkgPSAnLSc7CiAgICAgICAgICAgICAgICAgcmVzdWx0U3RyID0gZW52LT5OZXdTdHJpbmdVVEYoZGlnaXRzLmZEaWdpdHMgLSAxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzY5LDcgKzc3MSw2IEBACiAgICAgICAgIHJlc3VsdE9iamVjdDIgPSBlbnYtPk5ld09iamVjdChiaWdEZWNpbWFsQ2xhc3MsIGJpZ0RlY2ltYWxJbml0TWV0aG9kSUQsIHJlc3VsdE9iamVjdDEsIHNjYWxlKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdE9iamVjdDI7CiAgICAgfQotICAgIHJldHVybiBOVUxMOyAgICAvLyBEb24ndCBzZWUgV0hZLCBob3dldmVyISEhIChDb250cm9sIG5ldmVyIHJlYWNoZXMgaGVyZSEhISkKIH0KIAogc3RhdGljIGppbnQgY2xvbmVJbXBsKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGppbnQgYWRkcikgewpkaWZmIC0tZ2l0IGEvaWN1L3NyYy9tYWluL25hdGl2ZS9SQk5GSW50ZXJmYWNlLmNwcCBiL2ljdS9zcmMvbWFpbi9uYXRpdmUvUkJORkludGVyZmFjZS5jcHAKaW5kZXggMTdlNzE1NS4uZDliZjQ2MCAxMDA2NDQKLS0tIGEvaWN1L3NyYy9tYWluL25hdGl2ZS9SQk5GSW50ZXJmYWNlLmNwcAorKysgYi9pY3Uvc3JjL21haW4vbmF0aXZlL1JCTkZJbnRlcmZhY2UuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAgICAgfSBlbHNlIGlmKHR5cGUgPT0gMykgewogICAgICAgICBzdHlsZSA9IFVSQk5GX0NPVU5UOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiZXJyb3IiKTsKKyAgICAgICAgaWN1RXJyb3IoZW52LCBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IpOwogICAgIH0KICAgICAKICAgICBMb2NhbGUgbG9jID0gTG9jYWxlOjpjcmVhdGVGcm9tTmFtZShsb2NhbGVDaGFycyk7CmRpZmYgLS1naXQgYS9pY3Uvc3JjL21haW4vbmF0aXZlL1Jlc291cmNlSW50ZXJmYWNlLmNwcCBiL2ljdS9zcmMvbWFpbi9uYXRpdmUvUmVzb3VyY2VJbnRlcmZhY2UuY3BwCmluZGV4IGEwYzY5MjIuLjU2MmY0ODAgMTAwNjQ0Ci0tLSBhL2ljdS9zcmMvbWFpbi9uYXRpdmUvUmVzb3VyY2VJbnRlcmZhY2UuY3BwCisrKyBiL2ljdS9zcmMvbWFpbi9uYXRpdmUvUmVzb3VyY2VJbnRlcmZhY2UuY3BwCkBAIC00MjAsNiArNDIwLDcgQEAKICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyB6b25lSUQoKFVDaGFyICopcmVzLCBsZW5ndGgpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhzdHJPYmosIHJlcyk7CiAgICAgICAgIHpvbmVzW2ldID0gVGltZVpvbmU6OmNyZWF0ZVRpbWVab25lKHpvbmVJRCk7CisgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoc3RyT2JqKTsKICAgICB9CiAKICAgICAvLyAxNXRoIEphbnVhcnkgMjAwOApkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0NvbnNvbGVIYW5kbGVyLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvQ29uc29sZUhhbmRsZXIuamF2YQppbmRleCA5Y2VhNjBmYS4uYTg4Y2YwYyAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0NvbnNvbGVIYW5kbGVyLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0NvbnNvbGVIYW5kbGVyLmphdmEKQEAgLTE5LDQzICsxOSw0NyBAQAogCiAvKioKICAqIEEgaGFuZGxlciB0aGF0IHdyaXRlcyBsb2cgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0KLSAqIDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+LgorICoge0Bjb2RlIFN5c3RlbS5lcnJ9LgogICogPHA+CiAgKiBUaGlzIGhhbmRsZXIgcmVhZHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIGxvZyBtYW5hZ2VyIHRvCiAgKiBpbml0aWFsaXplIGl0c2VsZjoKICAqIDx1bD4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCBzcGVjaWZpZXMgdGhlIGxvZ2dpbmcgbGV2ZWwsCi0gKiBkZWZhdWx0cyB0byA8Y29kZT5MZXZlbC5JTkZPPC9jb2RlPiBpZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvciBoYXMgYW4KLSAqIGludmFsaWQgdmFsdWU7CisgKiBkZWZhdWx0cyB0byB7QGNvZGUgTGV2ZWwuSU5GT30gaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZm91bmQgb3IgaGFzIGFuCisgKiBpbnZhbGlkIHZhbHVlLgogICogPGxpPmphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZpbHRlciBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbHRlcgotICogY2xhc3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciwgZGVmYXVsdHMgdG8gPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAqIHRoaXMgcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlOworICogY2xhc3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciwgZGVmYXVsdHMgdG8ge0Bjb2RlIG51bGx9IGlmIHRoaXMKKyAqIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvciBoYXMgYW4gaW52YWxpZCB2YWx1ZS4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZQogICogZm9ybWF0dGVyIGNsYXNzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhhbmRsZXIsIGRlZmF1bHRzIHRvCi0gKiA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXI8L2NvZGU+IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90Ci0gKiBmb3VuZCBvciBoYXMgYW4gaW52YWxpZCB2YWx1ZTsKKyAqIHtAY29kZSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXJ9IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yCisgKiBoYXMgYW4gaW52YWxpZCB2YWx1ZS4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5lbmNvZGluZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHRoaXMKLSAqIGhhbmRsZXIgd2lsbCB1c2UgdG8gZW5jb2RlIGxvZyBtZXNzYWdlcywgZGVmYXVsdHMgdG8gPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAqIHRoaXMgcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLgorICogaGFuZGxlciB3aWxsIHVzZSB0byBlbmNvZGUgbG9nIG1lc3NhZ2VzLCBkZWZhdWx0cyB0byB7QGNvZGUgbnVsbH0gaWYgdGhpcworICogcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLgogICogPC91bD4KICAqIDwvcD4KICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCiAgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ29uc29sZUhhbmRsZXIgZXh0ZW5kcyBTdHJlYW1IYW5kbGVyIHsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5Db25zb2xlSGFuZGxlcjwvY29kZT4gb2JqZWN0LgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgQ29uc29sZUhhbmRsZXJ9IG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29uc29sZUhhbmRsZXIoKSB7CiAgICAgICAgIHN1cGVyKFN5c3RlbS5lcnIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIGhhbmRsZXIuIFRoZSA8Y29kZT5TeXN0ZW0uZXJyPC9jb2RlPiBpcyBmbHVzaGVkIGJ1dCBub3QKLSAgICAgKiBjbG9zZWQuCisgICAgICogQ2xvc2VzIHRoaXMgaGFuZGxlci4gVGhlIHtAY29kZSBTeXN0ZW0uZXJyfSBpcyBmbHVzaGVkIGJ1dCBub3QgY2xvc2VkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewpAQCAtNjUsNyArNjksMTAgQEAKICAgICAvKioKICAgICAgKiBMb2dzIGEgcmVjb3JkIGlmIG5lY2Vzc2FyeS4gQSBmbHVzaCBvcGVyYXRpb24gd2lsbCBiZSBkb25lLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWNvcmQgdGhlIGxvZyByZWNvcmQgdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIHJlY29yZAorICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgbG9nZ2VkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2goTG9nUmVjb3JkIHJlY29yZCkgewpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0Vycm9yTWFuYWdlci5qYXZhIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0Vycm9yTWFuYWdlci5qYXZhCmluZGV4IDBiMTJkZjEuLjZmNTA4NGMgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9FcnJvck1hbmFnZXIuamF2YQorKysgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvRXJyb3JNYW5hZ2VyLmphdmEKQEAgLTIwLDQzICsyMCw1NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiA8cD4KICAqIEFuIGVycm9yIHJlcG9ydGluZyBmYWNpbGl0eSBmb3Ige0BsaW5rIEhhbmRsZXJ9IGltcGxlbWVudGF0aW9ucyB0byByZWNvcmQgYW55Ci0gKiBlcnJvciB0aGF0IG1heSBoYXBwZW4gZHVyaW5nIGxvZ2dpbmcuIDxjb2RlPkhhbmRsZXJzPC9jb2RlPiBzaG91bGQgcmVwb3J0Ci0gKiBlcnJvcnMgdG8gYW4gPGNvZGU+RXJyb3JNYW5hZ2VyPC9jb2RlPiwgaW5zdGVhZCBvZiB0aHJvd2luZyBleGNlcHRpb25zLAotICogd2hpY2ggd291bGQgaW50ZXJmZXJlIHdpdGggdGhlIGxvZyBpc3N1ZXIncyBleGVjdXRpb24uCi0gKiA8L3A+CisgKiBlcnJvciB0aGF0IG1heSBoYXBwZW4gZHVyaW5nIGxvZ2dpbmcuIHtAY29kZSBIYW5kbGVyc30gc2hvdWxkIHJlcG9ydCBlcnJvcnMKKyAqIHRvIGFuIHtAY29kZSBFcnJvck1hbmFnZXJ9LCBpbnN0ZWFkIG9mIHRocm93aW5nIGV4Y2VwdGlvbnMsIHdoaWNoIHdvdWxkCisgKiBpbnRlcmZlcmUgd2l0aCB0aGUgbG9nIGlzc3VlcidzIGV4ZWN1dGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBFcnJvck1hbmFnZXIgewogCiAgICAgLyoqCiAgICAgICogVGhlIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhIGZhaWx1cmUgdGhhdCBkb2VzIG5vdCBmaXQgaW4gYW55IG9mIHRoZQogICAgICAqIHNwZWNpZmljIHR5cGVzIG9mIGZhaWx1cmVzIHRoYXQgZm9sbG93LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFTkVSSUNfRkFJTFVSRSA9IDA7CiAKICAgICAvKioKICAgICAgKiBUaGUgZXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgZmFpbHVyZSB3aGVuIHdyaXRpbmcgdG8gYW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUklURV9GQUlMVVJFID0gMTsKIAogICAgIC8qKgogICAgICAqIFRoZSBlcnJvciBjb2RlIGluZGljYXRpbmcgYSBmYWlsdXJlIHdoZW4gZmx1c2hpbmcgYW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTFVTSF9GQUlMVVJFID0gMjsKIAogICAgIC8qKgogICAgICAqIFRoZSBlcnJvciBjb2RlIGluZGljYXRpbmcgYSBmYWlsdXJlIHdoZW4gY2xvc2luZyBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT1NFX0ZBSUxVUkUgPSAzOwogCiAgICAgLyoqCiAgICAgICogVGhlIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhIGZhaWx1cmUgd2hlbiBvcGVuaW5nIGFuIG91dHB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BFTl9GQUlMVVJFID0gNDsKIAogICAgIC8qKgogICAgICAqIFRoZSBlcnJvciBjb2RlIGluZGljYXRpbmcgYSBmYWlsdXJlIHdoZW4gZm9ybWF0dGluZyB0aGUgZXJyb3IgbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0ZBSUxVUkUgPSA1OwogCkBAIC03Miw3ICs4NCw5IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbGxlZDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+RXJyb3JNYW5hZ2VyPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHtAY29kZSBFcnJvck1hbmFnZXJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFcnJvck1hbmFnZXIoKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC04NywxMyArMTAxLDE1IEBACiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSwgd2hpY2ggbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UsIHdoaWNoIG1heSBiZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHBhcmFtIGV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLCB3aGljaCBtYXkgYmUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLCB3aGljaCBtYXkgYmUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gZXJyb3JDb2RlCi0gICAgICogICAgICAgICAgICBUaGUgZXJyb3IgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZXJyb3I7IHNlZSB0aGUKLSAgICAgKiAgICAgICAgICAgIGNvbnN0YW50IGZpZWxkcyBvbiB0aGlzIGNsYXNzLgorICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGVycm9yOyBzZWUgdGhlCisgICAgICogICAgICAgICAgICBjb25zdGFudCBmaWVsZHMgb2YgdGhpcyBjbGFzcyBmb3IgcG9zc2libGUgdmFsdWVzLgorICAgICAqICAgICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBlcnJvckNvZGUpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvRmlsZUhhbmRsZXIuamF2YSBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlci5qYXZhCmluZGV4IGJlMjFlYmMuLmFmNzFhNmQgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlci5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlci5qYXZhCkBAIC0zMiw3NCArMzIsNzQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQSA8Y29kZT5IYW5kbGVyPC9jb2RlPiB3cml0ZXMgZGVzY3JpcHRpb24gb2YgbG9nZ2luZyBldmVudCBpbnRvIGEgc3BlY2lmaWVkCi0gKiBmaWxlIG9yIGEgcm90YXRpbmcgc2V0IG9mIGZpbGVzLgorICogQSB7QGNvZGUgRmlsZUhhbmRsZXJ9IHdyaXRlcyBsb2dnaW5nIHJlY29yZHMgaW50byBhIHNwZWNpZmllZCBmaWxlIG9yIGEKKyAqIHJvdGF0aW5nIHNldCBvZiBmaWxlcy4KICAqIDxwPgotICogSWYgYSBzZXQgb2YgZmlsZXMgYXJlIHVzZWQsIHdoZW4gYSBnaXZlbiBhbW91bnQgb2YgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvCi0gKiBvbmUgZmlsZSwgdGhpcyBmaWxlIGlzIGNsb3NlZCwgYW5kIGFub3RoZXIgZmlsZSBpcyBvcGVuZWQuIFRoZSBuYW1lIG9mIHRoZXNlCi0gKiBmaWxlcyBhcmUgZ2VuZXJhdGVkIGJ5IGdpdmVuIG5hbWUgcGF0dGVybiwgc2VlIGJlbG93IGZvciBkZXRhaWxzLgorICogV2hlbiBhIHNldCBvZiBmaWxlcyBpcyB1c2VkIGFuZCBhIGdpdmVuIGFtb3VudCBvZiBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdG8KKyAqIG9uZSBmaWxlLCB0aGVuIHRoaXMgZmlsZSBpcyBjbG9zZWQgYW5kIGFub3RoZXIgZmlsZSBpcyBvcGVuZWQuIFRoZSBuYW1lIG9mCisgKiB0aGVzZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGJ5IGdpdmVuIG5hbWUgcGF0dGVybiwgc2VlIGJlbG93IGZvciBkZXRhaWxzLgogICogPC9wPgogICogPHA+Ci0gKiBCeSBkZWZhdWx0IHRoZSBJTyBidWZmZXJpbmcgbWVjaGFuaXNtIGlzIGVuYWJsZWQsIGJ1dCB3aGVuIGVhY2ggbG9nIHJlY29yZCBpcwotICogY29tcGxldGUsIGl0IGlzIGZsdXNoZWQgb3V0LgorICogQnkgZGVmYXVsdCwgdGhlIEkvTyBidWZmZXJpbmcgbWVjaGFuaXNtIGlzIGVuYWJsZWQsIGJ1dCB3aGVuIGVhY2ggbG9nIHJlY29yZAorICogaXMgY29tcGxldGUsIGl0IGlzIGZsdXNoZWQgb3V0LgogICogPC9wPgogICogPHA+Ci0gKiA8Y29kZT5YTUxGb3JtYXR0ZXI8L2NvZGU+IGlzIGRlZmF1bHQgZm9ybWF0dGVyIGZvciA8Y29kZT5GaWxlSGFuZGxlcjwvY29kZT4uCisgKiB7QGNvZGUgWE1MRm9ybWF0dGVyfSBpcyB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgZm9yIHtAY29kZSBGaWxlSGFuZGxlcn0uCiAgKiA8L3A+CiAgKiA8cD4KLSAqIDxjb2RlPk1lbW9yeUhhbmRsZXI8L2NvZGU+IHdpbGwgcmVhZCBmb2xsb3dpbmcgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4KLSAqIHByb3BlcnRpZXMgZm9yIGluaXRpYWxpemF0aW9uLCBpZiBnaXZlbiBwcm9wZXJ0aWVzIGFyZSBub3QgZGVmaW5lZCBvciBoYXMKLSAqIGludmFsaWQgdmFsdWVzLCBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC4KKyAqIHtAY29kZSBGaWxlSGFuZGxlcn0gcmVhZHMgdGhlIGZvbGxvd2luZyB7QGNvZGUgTG9nTWFuYWdlcn0gcHJvcGVydGllcyBmb3IKKyAqIGluaXRpYWxpemF0aW9uOyBpZiBhIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLCBhCisgKiBkZWZhdWx0IHZhbHVlIGlzIHVzZWQuCiAgKiA8dWw+CiAgKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWwgc3BlY2lmaWVzIHRoZSBsZXZlbCBmb3IgdGhpcwotICogPGNvZGU+SGFuZGxlcjwvY29kZT4sIGRlZmF1bHRzIHRvIDxjb2RlPkxldmVsLkFMTDwvY29kZT4uPC9saT4KLSAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5maWx0ZXIgc3BlY2lmaWVzIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gKiBjbGFzcyBuYW1lLCBkZWZhdWx0cyB0byBubyA8Y29kZT5GaWx0ZXI8L2NvZGU+LjwvbGk+Ci0gKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyIHNwZWNpZmllcyB0aGUKLSAqIDxjb2RlPkZvcm1hdHRlcjwvY29kZT4gY2xhc3MsIGRlZmF1bHRzIHRvCi0gKiA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5YTUxGb3JtYXR0ZXI8L2NvZGU+LjwvbGk+CisgKiB7QGNvZGUgSGFuZGxlcn0sIGRlZmF1bHRzIHRvIHtAY29kZSBMZXZlbC5BTEx9LjwvbGk+CisgKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZmlsdGVyIHNwZWNpZmllcyB0aGUge0Bjb2RlIEZpbHRlcn0gY2xhc3MKKyAqIG5hbWUsIGRlZmF1bHRzIHRvIG5vIHtAY29kZSBGaWx0ZXJ9LjwvbGk+CisgKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyIHNwZWNpZmllcyB0aGUge0Bjb2RlIEZvcm1hdHRlcn0KKyAqIGNsYXNzLCBkZWZhdWx0cyB0byB7QGNvZGUgamF2YS51dGlsLmxvZ2dpbmcuWE1MRm9ybWF0dGVyfS48L2xpPgogICogPGxpPmphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmVuY29kaW5nIHNwZWNpZmllcyB0aGUgY2hhcmFjdGVyIHNldAogICogZW5jb2RpbmcgbmFtZSwgZGVmYXVsdHMgdG8gdGhlIGRlZmF1bHQgcGxhdGZvcm0gZW5jb2RpbmcuPC9saT4KLSAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5saW1pdCBzcGVjaWZpZXMgYW4gbWF4aW11bSBieXRlcyB0byB3cml0ZQotICogdG8gYW55IG9uZSBmaWxlLCBkZWZhdWx0cyB0byB6ZXJvLCB3aGljaCBtZWFucyBubyBsaW1pdC48L2xpPgorICogPGxpPmphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxpbWl0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAqIGJ5dGVzIHRvIHdyaXRlIHRvIGFueSBvbmUgZmlsZSwgZGVmYXVsdHMgdG8gemVybywgd2hpY2ggbWVhbnMgbm8gbGltaXQuPC9saT4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5jb3VudCBzcGVjaWZpZXMgaG93IG1hbnkgb3V0cHV0IGZpbGVzIHRvCiAgKiByb3RhdGUsIGRlZmF1bHRzIHRvIDEuPC9saT4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuIHNwZWNpZmllcyBuYW1lIHBhdHRlcm4gZm9yIHRoZQogICogb3V0cHV0IGZpbGVzLiBTZWUgYmVsb3cgZm9yIGRldGFpbHMuIERlZmF1bHRzIHRvICIlaC9qYXZhJXUubG9nIi48L2xpPgogICogPGxpPmphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmFwcGVuZCBzcGVjaWZpZXMgd2hldGhlciB0aGlzCi0gKiA8Y29kZT5GaWxlSGFuZGxlcjwvY29kZT4gc2hvdWxkIGFwcGVuZCBvbnRvIGV4aXN0aW5nIGZpbGVzLCBkZWZhdWx0cyB0bwotICogZmFsc2UuPC9saT4KKyAqIHtAY29kZSBGaWxlSGFuZGxlcn0gc2hvdWxkIGFwcGVuZCBvbnRvIGV4aXN0aW5nIGZpbGVzLCBkZWZhdWx0cyB0bworICoge0Bjb2RlIGZhbHNlfS48L2xpPgogICogPC91bD4KICAqIDwvcD4KICAqIDxwPgotICogTmFtZSBwYXR0ZXJuIGlzIGEgc3RyaW5nIHRoYXQgbWF5IGluY2x1ZGVzIHNvbWUgc3BlY2lhbCBzdWItc3RyaW5ncywgd2hpY2gKLSAqIHdpbGwgYmUgcmVwbGFjZWQgdG8gZ2VuZXJhdGUgb3V0cHV0IGZpbGVzOgorICogTmFtZSBwYXR0ZXJuIGlzIGEgc3RyaW5nIHRoYXQgbWF5IGluY2x1ZGUgc29tZSBzcGVjaWFsIHN1YnN0cmluZ3MsIHdoaWNoIHdpbGwKKyAqIGJlIHJlcGxhY2VkIHRvIGdlbmVyYXRlIG91dHB1dCBmaWxlczoKKyAqIDwvcD4KICAqIDx1bD4KICAqIDxsaT4iLyIgcmVwcmVzZW50cyB0aGUgbG9jYWwgcGF0aG5hbWUgc2VwYXJhdG9yPC9saT4KLSAqIDxsaT4iJXQiIHJlcHJlc2VudHMgdGhlIHN5c3RlbSB0ZW1wb3JhcnkgZGlyZWN0b3J5PC9saT4KLSAqIDxsaT4iJWgiIHJlcHJlc2VudHMgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIGN1cnJlbnQgdXNlciwgd2hpY2ggaXMgc3BlY2lmaWVkCi0gKiBieSAidXNlci5ob21lIiBzeXN0ZW0gcHJvcGVydHk8L2xpPgorICogPGxpPiIldCIgcmVwcmVzZW50cyB0aGUgc3lzdGVtJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeTwvbGk+CisgKiA8bGk+IiVoIiByZXByZXNlbnRzIHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyLCB3aGljaCBpcworICogc3BlY2lmaWVkIGJ5ICJ1c2VyLmhvbWUiIHN5c3RlbSBwcm9wZXJ0eTwvbGk+CiAgKiA8bGk+IiVnIiByZXByZXNlbnRzIHRoZSBnZW5lcmF0aW9uIG51bWJlciB0byBkaXN0aW5ndWlzaCByb3RhdGVkIGxvZ3M8L2xpPgogICogPGxpPiIldSIgcmVwcmVzZW50cyBhIHVuaXF1ZSBudW1iZXIgdG8gcmVzb2x2ZSBjb25mbGljdHM8L2xpPgotICogPGxpPiIlJSIgcmVwcmVzZW50cyBwZXJjZW50IHNpZ24gY2hhcmFjdGVyICclJzwvbGk+CisgKiA8bGk+IiUlIiByZXByZXNlbnRzIHRoZSBwZXJjZW50IHNpZ24gY2hhcmFjdGVyICclJzwvbGk+CiAgKiA8L3VsPgotICogPC9wPgotICogTm9ybWFsbHksIHRoZSBnZW5lcmF0aW9uIG51bWJlcnMgYXJlIG5vdCBsYXJnZXIgdGhhbiBnaXZlbiBmaWxlIGNvdW50IGFuZAorICogPHA+CisgKiBOb3JtYWxseSwgdGhlIGdlbmVyYXRpb24gbnVtYmVycyBhcmUgbm90IGxhcmdlciB0aGFuIHRoZSBnaXZlbiBmaWxlIGNvdW50IGFuZAogICogZm9sbG93IHRoZSBzZXF1ZW5jZSAwLCAxLCAyLi4uLiBJZiB0aGUgZmlsZSBjb3VudCBpcyBsYXJnZXIgdGhhbiBvbmUsIGJ1dCB0aGUKICAqIGdlbmVyYXRpb24gZmllbGQoIiVnIikgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBpbiB0aGUgcGF0dGVybiwgdGhlbiB0aGUKLSAqIGdlbmVyYXRpb24gbnVtYmVyIGFmdGVyIGEgZG90IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBuYW1lLAorICogZ2VuZXJhdGlvbiBudW1iZXIgYWZ0ZXIgYSBkb3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSAiJXUiIHVuaXF1ZSBmaWVsZCBpcyB1c2VkIHRvIGF2b2lkIGNvbmZsaWN0cyBhbmQgc2V0IHRvIDAgYXQgZmlyc3QuIElmCi0gKiBvbmUgPGNvZGU+RmlsZUhhbmRsZXI8L2NvZGU+IHRyaWVzIHRvIG9wZW4gdGhlIGZpbGVuYW1lIHdoaWNoIGlzIGN1cnJlbnRseQotICogaW4gdXNlIGJ5IGFub3RoZXIgcHJvY2VzcywgaXQgd2lsbCByZXBlYXRlZGx5IGluY3JlbWVudCB0aGUgdW5pcXVlIG51bWJlcgotICogZmllbGQgYW5kIHRyeSBhZ2Fpbi4gSWYgdGhlICIldSIgY29tcG9uZW50IGhhcyBub3QgYmVlbiBpbmNsdWRlZCBpbiB0aGUgZmlsZQotICogbmFtZSBwYXR0ZXJuIGFuZCBzb21lIGNvbnRlbnRpb24gb24gYSBmaWxlIGRvZXMgb2NjdXIgdGhlbiBhIHVuaXF1ZSBudW1lcmljYWwKKyAqIFRoZSAiJXUiIHVuaXF1ZSBmaWVsZCBpcyB1c2VkIHRvIGF2b2lkIGNvbmZsaWN0cyBhbmQgaXMgc2V0IHRvIDAgYXQgZmlyc3QuIElmCisgKiBvbmUge0Bjb2RlIEZpbGVIYW5kbGVyfSB0cmllcyB0byBvcGVuIHRoZSBmaWxlbmFtZSB3aGljaCBpcyBjdXJyZW50bHkgaW4gdXNlCisgKiBieSBhbm90aGVyIHByb2Nlc3MsIGl0IHdpbGwgcmVwZWF0ZWRseSBpbmNyZW1lbnQgdGhlIHVuaXF1ZSBudW1iZXIgZmllbGQgYW5kCisgKiB0cnkgYWdhaW4uIElmIHRoZSAiJXUiIGNvbXBvbmVudCBoYXMgbm90IGJlZW4gaW5jbHVkZWQgaW4gdGhlIGZpbGUgbmFtZQorICogcGF0dGVybiBhbmQgc29tZSBjb250ZW50aW9uIG9uIGEgZmlsZSBkb2VzIG9jY3VyLCB0aGVuIGEgdW5pcXVlIG51bWVyaWNhbAogICogdmFsdWUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlbmFtZSBpbiBxdWVzdGlvbiBpbW1lZGlhdGVseSB0byB0aGUKLSAqIHJpZ2h0IG9mIGEgZG90LiBUaGUgdW5pcXVlIElEcyBmb3IgYXZvaWRpbmcgY29uZmxpY3RzIGlzIG9ubHkgZ3VhcmFudGVlZCB0bwotICogd29yayByZWxpYWJseSB3aGVuIHVzaW5nIGEgbG9jYWwgZGlzayBmaWxlIHN5c3RlbS4KKyAqIHJpZ2h0IG9mIGEgZG90LiBUaGUgZ2VuZXJhdGlvbiBvZiB1bmlxdWUgSURzIGZvciBhdm9pZGluZyBjb25mbGljdHMgaXMgb25seQorICogZ3VhcmFudGVlZCB0byB3b3JrIHJlbGlhYmx5IHdoZW4gdXNpbmcgYSBsb2NhbCBkaXNrIGZpbGUgc3lzdGVtLgogICogPC9wPgotICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZpbGVIYW5kbGVyIGV4dGVuZHMgU3RyZWFtSGFuZGxlciB7CiAKQEAgLTE0OCwxNyArMTQ4LDE4IEBACiAgICAgaW50IHVuaXF1ZUlEID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5GaWxlSGFuZGxlcjwvY29kZT4gdXNpbmcgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4KLSAgICAgKiBwcm9wZXJ0aWVzIG9yIHRoZWlyIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgRmlsZUhhbmRsZXJ9IHVzaW5nIHtAY29kZSBMb2dNYW5hZ2VyfSBwcm9wZXJ0aWVzIG9yCisgICAgICogdGhlaXIgZGVmYXVsdCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW55IElPIGV4Y2VwdGlvbiBoYXBwZW5lZAorICAgICAqICAgICAgICAgICAgIGlmIGFueSBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGV0ZXJtaW5lcyB0aGF0IGNhbGxlciBkb2VzCi0gICAgICogICAgICAgICAgICAgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNvbnRyb2wgdGhpcyBoYW5kbGVyLAotICAgICAqICAgICAgICAgICAgIHJlcXVpcmVkIHBlcm1pc3Npb25zIGluY2x1ZGUKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5Mb2dQZXJtaXNzaW9uKCJjb250cm9sIik8L2NvZGU+IGFuZCBvdGhlciBwZXJtaXNzaW9uCi0gICAgICogICAgICAgICAgICAgbGlrZSA8Y29kZT5GaWxlUGVybWlzc2lvbigid3JpdGUiKTwvY29kZT4sIGV0Yy4KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkZXRlcm1pbmVzIHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgY2FsbGVyIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNvbnRyb2wgdGhpcworICAgICAqICAgICAgICAgICAgIGhhbmRsZXI7IHJlcXVpcmVkIHBlcm1pc3Npb25zIGluY2x1ZGUKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgTG9nUGVybWlzc2lvbigiY29udHJvbCIpfSwKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgRmlsZVBlcm1pc3Npb24oIndyaXRlIil9IGV0Yy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUhhbmRsZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbml0KG51bGwsIG51bGwsIG51bGwsIG51bGwpOwpAQCAtMjc3LDExICsyNzgsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFRyYW5zZm9ybSB0aGUgcGF0dGVybiB0byB0aGUgdmFsaWQgZmlsZSBuYW1lLCByZXBsYWNpbmcgYW55IHBhdHRlcm5zLCBhbmQKLSAgICAgKiBhcHBseWluZyBnZW5lcmF0aW9uIGFuZCB1bmlxdWVJRCBpZiBwcmVzZW50CisgICAgICogYXBwbHlpbmcgZ2VuZXJhdGlvbiBhbmQgdW5pcXVlSUQgaWYgcHJlc2VudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZ2VuCiAgICAgICogICAgICAgICAgICBnZW5lcmF0aW9uIG9mIHRoaXMgZmlsZQotICAgICAqIEByZXR1cm4gdHJhbnNmb3JtZWQgZmlsZW5hbWUgcmVhZHkgZm9yIHVzZQorICAgICAqIEByZXR1cm4gdHJhbnNmb3JtZWQgZmlsZW5hbWUgcmVhZHkgZm9yIHVzZS4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBwYXJzZUZpbGVOYW1lKGludCBnZW4pIHsKICAgICAgICAgaW50IGN1ciA9IDA7CkBAIC0zOTIsMjcgKzM5MywyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPkZpbGVIYW5kbGVyPC9jb2RlPiwgdGhlIGdpdmVuIG5hbWUgcGF0dGVybiBpcyB1c2VkCi0gICAgICogYXMgb3V0cHV0IGZpbGVuYW1lLCB0aGUgZmlsZSBsaW1pdCBpcyBzZXQgdG8gemVybyhubyBsaW1pdCksIGFuZCB0aGUgZmlsZQotICAgICAqIGNvdW50IGlzIHNldCB0byBvbmUsIG90aGVyIGNvbmZpZ3VyYXRpb24gdXNpbmcgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4KLSAgICAgKiBwcm9wZXJ0aWVzIG9yIHRoZWlyIGRlZmF1bHQgdmFsdWUKLSAgICAgKiAKLSAgICAgKiBUaGlzIGhhbmRsZXIgd3JpdGUgdG8gb25seSBvbmUgZmlsZSBhbmQgbm8gYW1vdW50IGxpbWl0LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZpbGVIYW5kbGVyfS4gVGhlIGdpdmVuIG5hbWUgcGF0dGVybiBpcyB1c2VkIGFzCisgICAgICogb3V0cHV0IGZpbGVuYW1lLCB0aGUgZmlsZSBsaW1pdCBpcyBzZXQgdG8gemVybyAobm8gbGltaXQpLCB0aGUgZmlsZSBjb3VudAorICAgICAqIGlzIHNldCB0byBvbmU7IHRoZSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBpcyBkb25lIHVzaW5nCisgICAgICoge0Bjb2RlIExvZ01hbmFnZXJ9IHByb3BlcnRpZXMgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIFRoaXMgaGFuZGxlciB3cml0ZQorICAgICAqIHRvIG9ubHkgb25lIGZpbGUgd2l0aG91dCBzaXplIGxpbWl0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBwYXR0ZXJuIG9mIG91dHB1dCBmaWxlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBwYXR0ZXJuIGZvciB0aGUgb3V0cHV0IGZpbGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBJTyBleGNlcHRpb24gaGFwcGVuZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgZG9lcwotICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjb250cm9sIHRoaXMgaGFuZGxlciwKLSAgICAgKiAgICAgICAgICAgICByZXF1aXJlZCBwZXJtaXNzaW9ucyBpbmNsdWRlCi0gICAgICogICAgICAgICAgICAgPGNvZGU+TG9nUGVybWlzc2lvbigiY29udHJvbCIpPC9jb2RlPiBhbmQgb3RoZXIgcGVybWlzc2lvbgotICAgICAqICAgICAgICAgICAgIGxpa2UgPGNvZGU+RmlsZVBlcm1pc3Npb24oIndyaXRlIik8L2NvZGU+LCBldGMuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXR0ZXJuIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICBjYWxsZXIgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY29udHJvbCB0aGlzCisgICAgICogICAgICAgICAgICAgaGFuZGxlcjsgcmVxdWlyZWQgcGVybWlzc2lvbnMgaW5jbHVkZQorICAgICAqICAgICAgICAgICAgIHtAY29kZSBMb2dQZXJtaXNzaW9uKCJjb250cm9sIil9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBGaWxlUGVybWlzc2lvbigid3JpdGUiKX0gZXRjLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gaXMgZW1wdHkuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXR0ZXJuIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUhhbmRsZXIoU3RyaW5nIHBhdHRlcm4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwYXR0ZXJuLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJApAQCAtNDI0LDMwICs0MjUsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5GaWxlSGFuZGxlcjwvY29kZT4sIHRoZSBnaXZlbiBuYW1lIHBhdHRlcm4gaXMgdXNlZAotICAgICAqIGFzIG91dHB1dCBmaWxlbmFtZSwgdGhlIGZpbGUgbGltaXQgaXMgc2V0IHRvIHplcm8oaS5lLiBubyBsaW1pdCBhcHBsaWVzKSwKLSAgICAgKiB0aGUgZmlsZSBjb3VudCBpcyBpbml0aWFsaXplZCB0byBvbmUsIGFuZCB0aGUgdmFsdWUgb2YKLSAgICAgKiA8Y29kZT5hcHBlbmQ8L2NvZGU+IGJlY29tZXMgdGhlIG5ldyBpbnN0YW5jZSdzIGFwcGVuZCBtb2RlLiBPdGhlcgotICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSB1c2luZyA8Y29kZT5Mb2dNYW5hZ2VyPC9jb2RlPiBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIFRoaXMgaGFuZGxlciB3cml0ZSB0byBvbmx5IG9uZSBmaWxlIGFuZCBubyBhbW91bnQgbGltaXQuCisgICAgICogQ29uc3RydWN0IGEgbmV3IHtAY29kZSBGaWxlSGFuZGxlcn0uIFRoZSBnaXZlbiBuYW1lIHBhdHRlcm4gaXMgdXNlZCBhcworICAgICAqIG91dHB1dCBmaWxlbmFtZSwgdGhlIGZpbGUgbGltaXQgaXMgc2V0IHRvIHplcm8gKG5vIGxpbWl0KSwgdGhlIGZpbGUgY291bnQKKyAgICAgKiBpcyBpbml0aWFsaXplZCB0byBvbmUgYW5kIHRoZSB2YWx1ZSBvZiB7QGNvZGUgYXBwZW5kfSBiZWNvbWVzIHRoZSBuZXcKKyAgICAgKiBpbnN0YW5jZSdzIGFwcGVuZCBtb2RlLiBUaGUgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSB1c2luZworICAgICAqIHtAY29kZSBMb2dNYW5hZ2VyfSBwcm9wZXJ0aWVzLiBUaGlzIGhhbmRsZXIgd3JpdGUgdG8gb25seSBvbmUgZmlsZQorICAgICAqIHdpdGhvdXQgc2l6ZSBsaW1pdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgcGF0dGVybiBvZiBvdXRwdXQgZmlsZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgcGF0dGVybiBmb3IgdGhlIG91dHB1dCBmaWxlLgogICAgICAqIEBwYXJhbSBhcHBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcHBlbmQgbW9kZQorICAgICAqICAgICAgICAgICAgdGhlIGFwcGVuZCBtb2RlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSU8gZXhjZXB0aW9uIGhhcHBlbmVkCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkZXRlcm1pbmVzIHRoYXQgY2FsbGVyIGRvZXMKLSAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY29udHJvbCB0aGlzIGhhbmRsZXIsCi0gICAgICogICAgICAgICAgICAgcmVxdWlyZWQgcGVybWlzc2lvbnMgaW5jbHVkZQotICAgICAqICAgICAgICAgICAgIDxjb2RlPkxvZ1Blcm1pc3Npb24oImNvbnRyb2wiKTwvY29kZT4gYW5kIG90aGVyIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgICBsaWtlIDxjb2RlPkZpbGVQZXJtaXNzaW9uKCJ3cml0ZSIpPC9jb2RlPiwgZXRjLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGF0dGVybiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkZXRlcm1pbmVzIHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgY2FsbGVyIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNvbnRyb2wgdGhpcworICAgICAqICAgICAgICAgICAgIGhhbmRsZXI7IHJlcXVpcmVkIHBlcm1pc3Npb25zIGluY2x1ZGUKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgTG9nUGVybWlzc2lvbigiY29udHJvbCIpfSwKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgRmlsZVBlcm1pc3Npb24oIndyaXRlIil9IGV0Yy4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXR0ZXJuIGlzIGVtcHR5LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwYXR0ZXJufSBpcyBlbXB0eS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBhdHRlcm59IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUhhbmRsZXIoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gYXBwZW5kKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAocGF0dGVybi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKQEAgLTQ1OSwzNCArNDYwLDM0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgPGNvZGU+RmlsZUhhbmRsZXI8L2NvZGU+LCB0aGUgZ2l2ZW4gbmFtZSBwYXR0ZXJuIGlzIHVzZWQKLSAgICAgKiBhcyBvdXRwdXQgZmlsZW5hbWUsIHRoZSBmaWxlIGxpbWl0IGlzIHNldCB0byBnaXZlbiBsaW1pdCBhcmd1bWVudCwgYW5kCi0gICAgICogdGhlIGZpbGUgY291bnQgaXMgc2V0IHRvIGdpdmVuIGNvdW50IGFyZ3VtZW50LCBvdGhlciBjb25maWd1cmF0aW9uIHVzaW5nCi0gICAgICogPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gcHJvcGVydGllcyBvciB0aGVpciBkZWZhdWx0IHZhbHVlCi0gICAgICogCi0gICAgICogVGhpcyBoYW5kbGVyIGlzIGNvbmZpZ3VyZWQgdG8gd3JpdGUgdG8gYSByb3RhdGluZyBzZXQgb2YgY291bnQgZmlsZXMsCi0gICAgICogd2hlbiB0aGUgbGltaXQgb2YgYnl0ZXMgaGFzIGJlZW4gd3JpdHRlbiB0byBvbmUgb3V0cHV0IGZpbGUsIGFub3RoZXIgZmlsZQotICAgICAqIHdpbGwgYmUgb3BlbmVkIGluc3RlYWQuCisgICAgICogQ29uc3RydWN0IGEgbmV3IHtAY29kZSBGaWxlSGFuZGxlcn0uIFRoZSBnaXZlbiBuYW1lIHBhdHRlcm4gaXMgdXNlZCBhcworICAgICAqIG91dHB1dCBmaWxlbmFtZSwgdGhlIG1heGltdW0gZmlsZSBzaXplIGlzIHNldCB0byB7QGNvZGUgbGltaXR9IGFuZCB0aGUKKyAgICAgKiBmaWxlIGNvdW50IGlzIGluaXRpYWxpemVkIHRvIHtAY29kZSBjb3VudH0uIFRoZSByZW1haW5pbmcgY29uZmlndXJhdGlvbgorICAgICAqIGlzIGRvbmUgdXNpbmcge0Bjb2RlIExvZ01hbmFnZXJ9IHByb3BlcnRpZXMuIFRoaXMgaGFuZGxlciBpcyBjb25maWd1cmVkCisgICAgICogdG8gd3JpdGUgdG8gYSByb3RhdGluZyBzZXQgb2YgY291bnQgZmlsZXMsIHdoZW4gdGhlIGxpbWl0IG9mIGJ5dGVzIGhhcworICAgICAqIGJlZW4gd3JpdHRlbiB0byBvbmUgb3V0cHV0IGZpbGUsIGFub3RoZXIgZmlsZSB3aWxsIGJlIG9wZW5lZCBpbnN0ZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBwYXR0ZXJuIG9mIG91dHB1dCBmaWxlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBwYXR0ZXJuIGZvciB0aGUgb3V0cHV0IGZpbGUuCiAgICAgICogQHBhcmFtIGxpbWl0Ci0gICAgICogICAgICAgICAgICB0aGUgZGF0YSBhbW91bnQgbGltaXQgaW4gYnl0ZXMgb2Ygb25lIG91dHB1dCBmaWxlLCBjYW5ub3QgbGVzcwotICAgICAqICAgICAgICAgICAgdGhhbiBvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFtb3VudCBsaW1pdCBpbiBieXRlcyBvZiBvbmUgb3V0cHV0IGZpbGUsIGNhbiBub3QgYmUKKyAgICAgKiAgICAgICAgICAgIG5lZ2F0aXZlLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIGNhbiBiZSB1c2VkLCBjYW5ub3QgbGVzcyB0aGFuIG9uZQorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIHVzZSwgY2FuIG5vdCBiZSBsZXNzIHRoYW4gb25lLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSU8gZXhjZXB0aW9uIGhhcHBlbmVkCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkZXRlcm1pbmVzIHRoYXQgY2FsbGVyIGRvZXMKLSAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY29udHJvbCB0aGlzIGhhbmRsZXIsCi0gICAgICogICAgICAgICAgICAgcmVxdWlyZWQgcGVybWlzc2lvbnMgaW5jbHVkZQotICAgICAqICAgICAgICAgICAgIDxjb2RlPkxvZ1Blcm1pc3Npb24oImNvbnRyb2wiKTwvY29kZT4gYW5kIG90aGVyIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgICBsaWtlIDxjb2RlPkZpbGVQZXJtaXNzaW9uKCJ3cml0ZSIpPC9jb2RlPiwgZXRjLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBwYXR0ZXJuIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICBjYWxsZXIgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY29udHJvbCB0aGlzCisgICAgICogICAgICAgICAgICAgaGFuZGxlcjsgcmVxdWlyZWQgcGVybWlzc2lvbnMgaW5jbHVkZQorICAgICAqICAgICAgICAgICAgIHtAY29kZSBMb2dQZXJtaXNzaW9uKCJjb250cm9sIil9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBGaWxlUGVybWlzc2lvbigid3JpdGUiKX0gZXRjLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgY291bnQ8MSwgb3IgbGltaXQ8MAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwYXR0ZXJufSBpcyBlbXB0eSwge0Bjb2RlIGxpbWl0IDwgMH0gb3IKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgY291bnQgPCAxfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBhdHRlcm59IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUhhbmRsZXIoU3RyaW5nIHBhdHRlcm4sIGludCBsaW1pdCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAocGF0dGVybi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKQEAgLTUwMSwzNyArNTAyLDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgPGNvZGU+RmlsZUhhbmRsZXI8L2NvZGU+LCB0aGUgZ2l2ZW4gbmFtZSBwYXR0ZXJuIGlzIHVzZWQKLSAgICAgKiBhcyBvdXRwdXQgZmlsZW5hbWUsIHRoZSBmaWxlIGxpbWl0IGlzIHNldCB0byBnaXZlbiBsaW1pdCBhcmd1bWVudCwgdGhlCi0gICAgICogZmlsZSBjb3VudCBpcyBzZXQgdG8gZ2l2ZW4gY291bnQgYXJndW1lbnQsIGFuZCB0aGUgYXBwZW5kIG1vZGUgaXMgc2V0IHRvCi0gICAgICogZ2l2ZW4gYXBwZW5kIGFyZ3VtZW50LCBvdGhlciBjb25maWd1cmF0aW9uIHVzaW5nIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+Ci0gICAgICogcHJvcGVydGllcyBvciB0aGVpciBkZWZhdWx0IHZhbHVlCi0gICAgICogCi0gICAgICogVGhpcyBoYW5kbGVyIGlzIGNvbmZpZ3VyZWQgdG8gd3JpdGUgdG8gYSByb3RhdGluZyBzZXQgb2YgY291bnQgZmlsZXMsCi0gICAgICogd2hlbiB0aGUgbGltaXQgb2YgYnl0ZXMgaGFzIGJlZW4gd3JpdHRlbiB0byBvbmUgb3V0cHV0IGZpbGUsIGFub3RoZXIgZmlsZQotICAgICAqIHdpbGwgYmUgb3BlbmVkIGluc3RlYWQuCisgICAgICogQ29uc3RydWN0IGEgbmV3IHtAY29kZSBGaWxlSGFuZGxlcn0uIFRoZSBnaXZlbiBuYW1lIHBhdHRlcm4gaXMgdXNlZCBhcworICAgICAqIG91dHB1dCBmaWxlbmFtZSwgdGhlIG1heGltdW0gZmlsZSBzaXplIGlzIHNldCB0byB7QGNvZGUgbGltaXR9LCB0aGUgZmlsZQorICAgICAqIGNvdW50IGlzIGluaXRpYWxpemVkIHRvIHtAY29kZSBjb3VudH0gYW5kIHRoZSBhcHBlbmQgbW9kZSBpcyBzZXQgdG8KKyAgICAgKiB7QGNvZGUgYXBwZW5kfS4gVGhlIHJlbWFpbmluZyBjb25maWd1cmF0aW9uIGlzIGRvbmUgdXNpbmcKKyAgICAgKiB7QGNvZGUgTG9nTWFuYWdlcn0gcHJvcGVydGllcy4gVGhpcyBoYW5kbGVyIGlzIGNvbmZpZ3VyZWQgdG8gd3JpdGUgdG8gYQorICAgICAqIHJvdGF0aW5nIHNldCBvZiBjb3VudCBmaWxlcywgd2hlbiB0aGUgbGltaXQgb2YgYnl0ZXMgaGFzIGJlZW4gd3JpdHRlbiB0bworICAgICAqIG9uZSBvdXRwdXQgZmlsZSwgYW5vdGhlciBmaWxlIHdpbGwgYmUgb3BlbmVkIGluc3RlYWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhdHRlcm4KLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHBhdHRlcm4gb2Ygb3V0cHV0IGZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHBhdHRlcm4gZm9yIHRoZSBvdXRwdXQgZmlsZS4KICAgICAgKiBAcGFyYW0gbGltaXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFtb3VudCBsaW1pdCBpbiBieXRlcyBvZiBvbmUgb3V0cHV0IGZpbGUsIGNhbm5vdCBsZXNzCi0gICAgICogICAgICAgICAgICB0aGFuIG9uZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYW1vdW50IGxpbWl0IGluIGJ5dGVzIG9mIG9uZSBvdXRwdXQgZmlsZSwgY2FuIG5vdCBiZQorICAgICAqICAgICAgICAgICAgbmVnYXRpdmUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgY2FuIGJlIHVzZWQsIGNhbm5vdCBsZXNzIHRoYW4gb25lCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgdG8gdXNlLCBjYW4gbm90IGJlIGxlc3MgdGhhbiBvbmUuCiAgICAgICogQHBhcmFtIGFwcGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGFwcGVuZCBtb2RlCisgICAgICogICAgICAgICAgICB0aGUgYXBwZW5kIG1vZGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBJTyBleGNlcHRpb24gaGFwcGVuZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgZG9lcwotICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjb250cm9sIHRoaXMgaGFuZGxlciwKLSAgICAgKiAgICAgICAgICAgICByZXF1aXJlZCBwZXJtaXNzaW9ucyBpbmNsdWRlCi0gICAgICogICAgICAgICAgICAgPGNvZGU+TG9nUGVybWlzc2lvbigiY29udHJvbCIpPC9jb2RlPiBhbmQgb3RoZXIgcGVybWlzc2lvbgotICAgICAqICAgICAgICAgICAgIGxpa2UgPGNvZGU+RmlsZVBlcm1pc3Npb24oIndyaXRlIik8L2NvZGU+LCBldGMuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHBhdHRlcm4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGV0ZXJtaW5lcyB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgIGNhbGxlciBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjb250cm9sIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBoYW5kbGVyOyByZXF1aXJlZCBwZXJtaXNzaW9ucyBpbmNsdWRlCisgICAgICogICAgICAgICAgICAge0Bjb2RlIExvZ1Blcm1pc3Npb24oImNvbnRyb2wiKX0sCisgICAgICogICAgICAgICAgICAge0Bjb2RlIEZpbGVQZXJtaXNzaW9uKCJ3cml0ZSIpfSBldGMuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBjb3VudDwxLCBvciBsaW1pdDwwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBhdHRlcm59IGlzIGVtcHR5LCB7QGNvZGUgbGltaXQgPCAwfSBvcgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBjb3VudCA8IDF9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcGF0dGVybn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSGFuZGxlcihTdHJpbmcgcGF0dGVybiwgaW50IGxpbWl0LCBpbnQgY291bnQsIGJvb2xlYW4gYXBwZW5kKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTU0OCwxNCArNTQ5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmx1c2ggYW5kIGNsb3NlIGFsbCBvcGVuZWQgZmlsZXMuCisgICAgICogRmx1c2hlcyBhbmQgY2xvc2VzIGFsbCBvcGVuZWQgZmlsZXMuCiAgICAgICogCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkZXRlcm1pbmVzIHRoYXQgY2FsbGVyIGRvZXMKLSAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY29udHJvbCB0aGlzIGhhbmRsZXIsCi0gICAgICogICAgICAgICAgICAgcmVxdWlyZWQgcGVybWlzc2lvbnMgaW5jbHVkZQotICAgICAqICAgICAgICAgICAgIDxjb2RlPkxvZ1Blcm1pc3Npb24oImNvbnRyb2wiKTwvY29kZT4gYW5kIG90aGVyIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgICBsaWtlIDxjb2RlPkZpbGVQZXJtaXNzaW9uKCJ3cml0ZSIpPC9jb2RlPiwgZXRjLgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICBjYWxsZXIgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY29udHJvbCB0aGlzCisgICAgICogICAgICAgICAgICAgaGFuZGxlcjsgcmVxdWlyZWQgcGVybWlzc2lvbnMgaW5jbHVkZQorICAgICAqICAgICAgICAgICAgIHtAY29kZSBMb2dQZXJtaXNzaW9uKCJjb250cm9sIil9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBGaWxlUGVybWlzc2lvbigid3JpdGUiKX0gZXRjLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewpAQCAtNTc0LDEwICs1NzYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQdWJsaXNoIGEgPGNvZGU+TG9nUmVjb3JkPC9jb2RlPgorICAgICAqIFB1Ymxpc2ggYSB7QGNvZGUgTG9nUmVjb3JkfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVjb3JkCi0gICAgICogICAgICAgICAgICB0aGUgbG9nIHJlY29yZCB0byBiZSBwdWJsaXNoZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2cgcmVjb3JkIHRvIHB1Ymxpc2guCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHVibGlzaChMb2dSZWNvcmQgcmVjb3JkKSB7CkBAIC01OTQsOSArNTk3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG91dHB1dCBzdHJlYW0gdXNlIGRlY29yYXRvciBwYXR0ZXJuIHRvIGFkZCBtZWFzdXJlIGZlYXR1cmUgdG8KLSAgICAgKiBPdXRwdXRTdHJlYW0gd2hpY2ggY2FuIGRldGVjdCB0aGUgdG90YWwgc2l6ZShpbiBieXRlcykgb2Ygb3V0cHV0LCB0aGUKLSAgICAgKiBpbml0aWFsIHNpemUgY2FuIGJlIHNldAorICAgICAqIFRoaXMgb3V0cHV0IHN0cmVhbSB1c2VzIHRoZSBkZWNvcmF0b3IgcGF0dGVybiB0byBhZGQgbWVhc3VyZW1lbnQgZmVhdHVyZXMKKyAgICAgKiB0byBPdXRwdXRTdHJlYW0gd2hpY2ggY2FuIGRldGVjdCB0aGUgdG90YWwgc2l6ZShpbiBieXRlcykgb2Ygb3V0cHV0LCB0aGUKKyAgICAgKiBpbml0aWFsIHNpemUgY2FuIGJlIHNldC4KICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgTWVhc3VyZU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CiAKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9GaWx0ZXIuamF2YSBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9GaWx0ZXIuamF2YQppbmRleCBkOTZmM2NlLi5lODFmMjE2IDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvRmlsdGVyLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0ZpbHRlci5qYXZhCkBAIC0xOCwxNyArMTgsMjEgQEAKIHBhY2thZ2UgamF2YS51dGlsLmxvZ2dpbmc7CiAKIC8qKgotICogPHA+QSBGaWx0ZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGV4ZXJjaXNpbmcgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlcgotICogd2hhdCByZWNvcmRzIGdldCBsb2dnZWQuPC9wPiAKKyAqIEEge0Bjb2RlIEZpbHRlcn0gcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGV4ZXJjaXNpbmcgZmluZS1ncmFpbmVkIGNvbnRyb2wKKyAqIG92ZXIgd2hpY2ggcmVjb3JkcyBnZXQgbG9nZ2VkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBGaWx0ZXIgewogCiAgICAgLyoqCi0gICAgICogPHA+Q2hlY2tzIHRoZSB7QGxpbmsgTG9nUmVjb3JkfSB0byBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkIGJlIGxvZ2dlZC48L3A+CisgICAgICogQ2hlY2tzIHtAY29kZSByZWNvcmR9IHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgbG9nZ2VkLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWNvcmQgVGhlIHtAbGluayBMb2dSZWNvcmR9IHRvIGJlIGNoZWNrZWQuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VwcGxpZWQgbG9nIHJlY29yZCBuZWVkcyB0byBiZQotICAgICAqICAgICAgICAgbG9nZ2VkLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogQHBhcmFtIHJlY29yZAorICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBMb2dSZWNvcmR9IHRvIGJlIGNoZWNrZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN1cHBsaWVkIGxvZyByZWNvcmQgbmVlZHMgdG8gYmUgbG9nZ2VkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0xvZ2dhYmxlKExvZ1JlY29yZCByZWNvcmQpOwogfQpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0Zvcm1hdHRlci5qYXZhIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0Zvcm1hdHRlci5qYXZhCmluZGV4IDczMjFhYTIuLjI5NDFjMjQgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Gb3JtYXR0ZXIuamF2YQorKysgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvRm9ybWF0dGVyLmphdmEKQEAgLTIyLDExICsyMiwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAogLyoqCi0gKiA8Y29kZT5Gb3JtYXR0ZXI8L2NvZGU+IG9iamVjdHMgYXJlIHVzZWQgdG8gZm9ybWF0IDxjb2RlPkxvZ1JlY29yZDwvY29kZT4KLSAqIG9iamVjdHMgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4gSGVhZCBhbmQgdGFpbCBzdHJpbmdzIGFyZSBzb21ldGltZSB1c2VkCi0gKiB0byB3cmFwIGEgc2V0IG9mIHJlY29yZHMuIFRoZSA8Y29kZT5nZXRIZWFkPC9jb2RlPiBhbmQgPGNvZGU+Z2V0VGFpbDwvY29kZT4KLSAqIG1ldGhvZHMgYXJlIHByZXNlbnRlZCBmb3IgdGhpcyBwdXJwb3NlLgorICoge0Bjb2RlIEZvcm1hdHRlcn0gb2JqZWN0cyBhcmUgdXNlZCB0byBmb3JtYXQge0BsaW5rIExvZ1JlY29yZH0gb2JqZWN0cyBpbnRvIGEKKyAqIHN0cmluZyByZXByZXNlbnRhdGlvbi4gSGVhZCBhbmQgdGFpbCBzdHJpbmdzIGFyZSBzb21ldGltZXMgdXNlZCB0byB3cmFwIGEgc2V0CisgKiBvZiByZWNvcmRzLiBUaGUge0Bjb2RlIGdldEhlYWR9IGFuZCB7QGNvZGUgZ2V0VGFpbH0gbWV0aG9kcyBhcmUgdXNlZCBmb3IgdGhpcworICogcHVycG9zZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtYXR0ZXIgewogCkBAIC0zNyw3ICszOCw5IEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+Rm9ybWF0dGVyPC9jb2RlPiBvYmplY3QuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBGb3JtYXR0ZXJ9IG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRm9ybWF0dGVyKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtNTAsMjkgKzUzLDM0IEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIGEgPGNvZGU+TG9nUmVjb3JkPC9jb2RlPiBvYmplY3QgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKiBUaGUgcmVzdWx0ZWQgc3RyaW5nIGlzIHVzdWFsbHkgbG9jYWxpemVkIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBmaWVsZAotICAgICAqIG9mIHRoZSBzdXBwbGllZCA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBDb252ZXJ0cyBhIHtAbGluayBMb2dSZWNvcmR9IG9iamVjdCBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBUaGUKKyAgICAgKiByZXN1bHRlZCBzdHJpbmcgaXMgdXN1YWxseSBsb2NhbGl6ZWQgYW5kIGluY2x1ZGVzIHRoZSBtZXNzYWdlIGZpZWxkIG9mCisgICAgICogdGhlIHJlY29yZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcgotICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgZm9ybWF0dGVkIGludG8gYSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVzdWx0ZWQgZnJvbSB0aGUgZm9ybWF0dGluZworICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgZm9ybWF0dGVkIGludG8gYSBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGZvcm1hdChMb2dSZWNvcmQgcik7CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIGEgPGNvZGU+TG9nUmVjb3JkPC9jb2RlPiBvYmplY3QgaW50byBhIGxvY2FsaXplZCBzdHJpbmcKLSAgICAgKiByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2QgY2FuIGJlIHJlZ2FyZGVkIGFzIGEgY29udmVuaWVuY2UgZm9yCi0gICAgICogc3ViY2xhc3NlcyBvZiA8Y29kZT5Gb3JtYXR0ZXI8L2NvZGU+IHRvIHVzZS4KKyAgICAgKiBGb3JtYXRzIGEge0Bjb2RlIExvZ1JlY29yZH0gb2JqZWN0IGludG8gYSBsb2NhbGl6ZWQgc3RyaW5nCisgICAgICogcmVwcmVzZW50YXRpb24uIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMgb2Yge0Bjb2RlCisgICAgICogRm9ybWF0dGVyfS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVzc2FnZSBzdHJpbmcgaXMgZmlyc3RseSBsb2NhbGl6ZWQgdXNpbmcgdGhlCi0gICAgICogPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkCi0gICAgICogPGNvZGU+TG9nUmVjb3JkPC9jb2RlPi4KKyAgICAgKiBUaGUgbWVzc2FnZSBzdHJpbmcgaXMgZmlyc3RseSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHtAY29kZSBSZXNvdXJjZUJ1bmRsZX0KKyAgICAgKiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdXBwbGllZCB7QGNvZGUgTG9nUmVjb3JkfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogTm90aWNlIDogaWYgbWVzc2FnZSBjb250YWlucyAiezAiLCB0aGVuIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGlzIHVzZWQuCisgICAgICogT3RoZXJ3aXNlIG5vIGZvcm1hdHRpbmcgaXMgcGVyZm9ybWVkLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcgotICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgZm9ybWF0dGVkCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlc3VsdGVkIGZyb20gdGhlIGZvcm1hdHRpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2cgcmVjb3JkIHRvIGJlIGZvcm1hdHRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVzdWx0ZWQgZnJvbSB0aGUgZm9ybWF0dGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoTG9nUmVjb3JkIHIpIHsKICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSByLmdldE1lc3NhZ2UoKTsKQEAgLTEwNSwxMSArMTEzLDEzIEBACiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoZWFkIHN0cmluZyB1c2VkIHRvIHdyYXAgYSBzZXQgb2YgbG9nIHJlY29yZHMuIFRoaXMgYmFzZSBjbGFzcwotICAgICAqIGFsd2F5cyByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICogYWx3YXlzIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBoCi0gICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGhhbmRsZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWFkIHN0cmluZyB1c2VkIHRvIHdyYXAgYSBzZXQgb2YgbG9nIHJlY29yZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgaGFuZGxlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkIHN0cmluZyB1c2VkIHRvIHdyYXAgYSBzZXQgb2YgbG9nIHJlY29yZHMsIGVtcHR5IGluIHRoaXMKKyAgICAgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZChIYW5kbGVyIGgpIHsKQEAgLTEyMSw4ICsxMzEsMTAgQEAKICAgICAgKiBhbHdheXMgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBoCi0gICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGhhbmRsZXIKLSAgICAgKiBAcmV0dXJuIHRoZSB0YWlsIHN0cmluZyB1c2VkIHRvIHdyYXAgYSBzZXQgb2YgbG9nIHJlY29yZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgaGFuZGxlci4KKyAgICAgKiBAcmV0dXJuIHRoZSB0YWlsIHN0cmluZyB1c2VkIHRvIHdyYXAgYSBzZXQgb2YgbG9nIHJlY29yZHMsIGVtcHR5IGluIHRoaXMKKyAgICAgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFpbChIYW5kbGVyIGgpIHsKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9IYW5kbGVyLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvSGFuZGxlci5qYXZhCmluZGV4IDliYWQ0NTkuLmQyOGJjZTAgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9IYW5kbGVyLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0hhbmRsZXIuamF2YQpAQCAtMjYsMTAgKzI2LDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEEgPGNvZGU+SGFuZGxlcjwvY29kZT4gb2JqZWN0IGFjY2VwdHMgYSBsb2dnaW5nIHJlcXVlc3QgYW5kIGV4cG9ydHMgdGhlCi0gKiBkZXNpcmVkIG1lc3NhZ2VzIHRvIGEgdGFyZ2V0LCBmb3IgZXhhbXBsZSwgYSBmaWxlLCB0aGUgY29uc29sZSwgZXRjLiBJdCBjYW4KLSAqIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgaXRzIGxvZ2dpbmcgbGV2ZWwgdG8gPGNvZGU+TGV2ZWwuT0ZGPC9jb2RlPi4KKyAqIEEge0Bjb2RlIEhhbmRsZXJ9IG9iamVjdCBhY2NlcHRzIGEgbG9nZ2luZyByZXF1ZXN0IGFuZCBleHBvcnRzIHRoZSBkZXNpcmVkCisgKiBtZXNzYWdlcyB0byBhIHRhcmdldCwgZm9yIGV4YW1wbGUsIGEgZmlsZSwgdGhlIGNvbnNvbGUsIGV0Yy4gSXQgY2FuIGJlCisgKiBkaXNhYmxlZCBieSBzZXR0aW5nIGl0cyBsb2dnaW5nIGxldmVsIHRvIHtAY29kZSBMZXZlbC5PRkZ9LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEhhbmRsZXIgewogCkBAIC03MSw5ICs3MiwxMSBAQAogICAgICAqLwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkhhbmRsZXI8L2NvZGU+IG9iamVjdCB3aXRoIGEgZGVmYXVsdCBlcnJvciBtYW5hZ2VyLAotICAgICAqIHRoZSBkZWZhdWx0IGVuY29kaW5nLCBhbmQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbAotICAgICAqIDxjb2RlPkxldmVsLkFMTDwvY29kZT4uIEl0IGhhcyBubyBmaWx0ZXIgYW5kIG5vIGZvcm1hdHRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIEhhbmRsZXJ9IG9iamVjdCB3aXRoIGEgZGVmYXVsdCBlcnJvciBtYW5hZ2VyIGluc3RhbmNlCisgICAgICoge0Bjb2RlIEVycm9yTWFuYWdlcn0sIHRoZSBkZWZhdWx0IGVuY29kaW5nLCBhbmQgdGhlIGRlZmF1bHQgbG9nZ2luZworICAgICAqIGxldmVsIHtAY29kZSBMZXZlbC5BTEx9LiBJdCBoYXMgbm8gZmlsdGVyIGFuZCBubyBmb3JtYXR0ZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEhhbmRsZXIoKSB7CiAgICAgICAgIHRoaXMuZXJyb3JNYW4gPSBuZXcgRXJyb3JNYW5hZ2VyKCk7CkBAIC0xODcsMzMgKzE5MCw0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIGhhbmRsZXIuIEEgZmx1c2ggb3BlcmF0aW9uIHdpbGwgdXN1YWxseSBiZSBwZXJmb3JtZWQgYW5kIGFsbAotICAgICAqIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlcyB3aWxsIGJlIGZyZWVkLiBDbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBub3QKLSAgICAgKiB1c2UgYSBoYW5kbGVyIGFmdGVyIGNsb3NpbmcgaXQuCisgICAgICogQ2xvc2VzIHRoaXMgaGFuZGxlci4gQSBmbHVzaCBvcGVyYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgYW5kIGFsbCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIHJlc291cmNlcyB3aWxsIGJlIGZyZWVkLiBDbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBub3QgdXNlCisgICAgICogdGhpcyBoYW5kbGVyIGFmdGVyIGNsb3NpbmcgaXQuCiAgICAgICogCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAogICAgICAqICAgICAgICAgICAgIGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKTsKIAogICAgIC8qKgogICAgICAqIEZsdXNoZXMgYW55IGJ1ZmZlcmVkIG91dHB1dC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpOwogCiAgICAgLyoqCi0gICAgICogQWNjZXB0cyBhbiBhY3R1YWwgbG9nZ2luZyByZXF1ZXN0LgorICAgICAqIEFjY2VwdHMgYSBsb2dnaW5nIHJlcXVlc3QgYW5kIHNlbmRzIGl0IHRvIHRoZSB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSByZWNvcmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2cgcmVjb3JkIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgbG9nZ2VkOyB7QGNvZGUgbnVsbH0gcmVjb3JkcyBhcmUgaWdub3JlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdWJsaXNoKExvZ1JlY29yZCByZWNvcmQpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgYnkgdGhpcyBoYW5kbGVyLgorICAgICAqIEdldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIGJ5IHRoaXMgaGFuZGxlciwge0Bjb2RlIG51bGx9IGZvcgorICAgICAqIGRlZmF1bHQgZW5jb2RpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgYnkgdGhpcyBoYW5kbGVyCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgYnkgdGhpcyBoYW5kbGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmVuY29kaW5nOwpAQCAtMjIzLDEwICsyMzMsMTEgQEAKICAgICAgKiBHZXRzIHRoZSBlcnJvciBtYW5hZ2VyIHVzZWQgYnkgdGhpcyBoYW5kbGVyIHRvIHJlcG9ydCBlcnJvcnMgZHVyaW5nCiAgICAgICogbG9nZ2luZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlcnJvciBtYW5hZ2VyIHVzZWQgYnkgdGhpcyBoYW5kbGVyCisgICAgICogQHJldHVybiB0aGUgZXJyb3IgbWFuYWdlciB1c2VkIGJ5IHRoaXMgaGFuZGxlci4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CiAgICAgICogICAgICAgICAgICAgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgICAKICAgICAgKi8KICAgICBwdWJsaWMgRXJyb3JNYW5hZ2VyIGdldEVycm9yTWFuYWdlcigpIHsKICAgICAgICAgTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuY2hlY2tBY2Nlc3MoKTsKQEAgLTIzNiw3ICsyNDcsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGZpbHRlciB1c2VkIGJ5IHRoaXMgaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXIgdXNlZCBieSB0aGlzIGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXIgdXNlZCBieSB0aGlzIGhhbmRsZXIgKHBvc3NpYmx5IHtAY29kZSBudWxsfSkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbHRlciBnZXRGaWx0ZXIoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjsKQEAgLTI0NSwyOSArMjU3LDMzIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZm9ybWF0dGVyIHVzZWQgYnkgdGhpcyBoYW5kbGVyIHRvIGZvcm1hdCB0aGUgbG9nZ2luZyBtZXNzYWdlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZXIgdXNlZCBieSB0aGlzIGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZXIgdXNlZCBieSB0aGlzIGhhbmRsZXIgKHBvc3NpYmx5IHtAY29kZSBudWxsfSkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoaXMgaGFuZGxlci4KKyAgICAgKiBHZXRzIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoaXMgaGFuZGxlciwgcmVjb3JkcyB3aXRoIGxldmVscyBsb3dlciB0aGFuCisgICAgICogdGhpcyB2YWx1ZSB3aWxsIGJlIGRyb3BwZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9nZ2luZyBsZXZlbCBvZiB0aGlzIGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoaXMgaGFuZGxlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGV2ZWwgZ2V0TGV2ZWwoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmxldmVsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3VwcGxpZWQgbG9nIHJlY29yZCBuZWVkIHRvIGJlIGxvZ2dlZC4gVGhlIGxvZ2dpbmcKLSAgICAgKiBsZXZlbHMgd2lsbCBiZSBjaGVja2VkIGFzIHdlbGwgYXMgdGhlIGZpbHRlci4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGxvZyByZWNvcmQgbmVlZHMgdG8gYmUgbG9nZ2VkLiBUaGUKKyAgICAgKiBsb2dnaW5nIGxldmVscyB3aWxsIGJlIGNoZWNrZWQgYXMgd2VsbCBhcyB0aGUgZmlsdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSByZWNvcmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2cgcmVjb3JkIHRvIGJlIGNoZWNrZWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdXBwbGllZCBsb2cgcmVjb3JkIG5lZWQgdG8gYmUgbG9nZ2VkLAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpZWQgbG9nIHJlY29yZCBuZWVkcyB0byBiZSBsb2dnZWQsCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2dhYmxlKExvZ1JlY29yZCByZWNvcmQpIHsKICAgICAgICAgaWYgKG51bGwgPT0gcmVjb3JkKSB7CkBAIC0yODIsMjggKzI5OCwzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydCBhbiBlcnJvciB0byB0aGUgZXJyb3IgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBoYW5kbGVyLgorICAgICAqIFJlcG9ydHMgYW4gZXJyb3IgdG8gdGhlIGVycm9yIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciwKKyAgICAgKiB7QGNvZGUgRXJyb3JNYW5hZ2VyfSBpcyB1c2VkIGZvciB0aGF0IHB1cnBvc2UuIE5vIHNlY3VyaXR5IGNoZWNrcyBhcmUKKyAgICAgKiBkb25lLCB0aGVyZWZvcmUgdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIHRoZSBjYWxsZXIKKyAgICAgKiBpcyBub24tcHJpdmlsZWdlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UsIG1heSBiZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHBhcmFtIGV4Ci0gICAgICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIGNvZGUKKyAgICAgKiAgICAgICAgICAgIGFuIHtAY29kZSBFcnJvck1hbmFnZXJ9IGVycm9yIGNvZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIG1zZywgRXhjZXB0aW9uIGV4LCBpbnQgY29kZSkgewogICAgICAgICB0aGlzLmVycm9yTWFuLmVycm9yKG1zZywgZXgsIGNvZGUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIGJ5IHRoaXMgaGFuZGxlci4gQSA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIHZhbHVlIGluZGljYXRlcyB0aGUgdXNpbmcgb2YgdGhlIGRlZmF1bHQgZW5jb2RpbmcuIFRoaXMgaW50ZXJuYWwgbWV0aG9kCi0gICAgICogZG9lcyBub3QgY2hlY2sgc2VjdXJpdHkuCisgICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgYnkgdGhpcyBoYW5kbGVyLiBBIHtAY29kZSBudWxsfSB2YWx1ZQorICAgICAqIGluZGljYXRlcyB0aGUgdXNlIG9mIHRoZSBkZWZhdWx0IGVuY29kaW5nLiBUaGlzIGludGVybmFsIG1ldGhvZCBkb2VzCisgICAgICogbm90IGNoZWNrIHNlY3VyaXR5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdFbmNvZGluZwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gc2V0LgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgdm9pZCBpbnRlcm5hbFNldEVuY29kaW5nKFN0cmluZyBuZXdFbmNvZGluZykKICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTMyNCwxNiArMzQ1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgYnkgdGhpcyBoYW5kbGVyLiBBIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogdmFsdWUgaW5kaWNhdGVzIHRoZSB1c2luZyBvZiB0aGUgZGVmYXVsdCBlbmNvZGluZy4KKyAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCBieSB0aGlzIGhhbmRsZXIsIHtAY29kZSBudWxsfSBpbmRpY2F0ZXMKKyAgICAgKiBhIGRlZmF1bHQgZW5jb2RpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVuY29kaW5nCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBzZXQuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAogICAgICAqICAgICAgICAgICAgIGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24uCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sCiAgICAgICAgICAgICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTM0NSwxMCArMzY3LDEzIEBACiAgICAgICogU2V0cyB0aGUgZXJyb3IgbWFuYWdlciBmb3IgdGhpcyBoYW5kbGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBlbQotICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIG1hbmFnZXIgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgZXJyb3IgbWFuYWdlciB0byBzZXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbX0gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKICAgICAgKiAgICAgICAgICAgICBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWFuYWdlcihFcnJvck1hbmFnZXIgZW0pIHsKICAgICAgICAgTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuY2hlY2tBY2Nlc3MoKTsKQEAgLTM2MiwxMCArMzg3LDExIEBACiAgICAgICogU2V0cyB0aGUgZmlsdGVyIHRvIGJlIHVzZWQgYnkgdGhpcyBoYW5kbGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdGaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWx0ZXIgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgZmlsdGVyIHRvIHNldCwgbWF5IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CiAgICAgICogICAgICAgICAgICAgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoRmlsdGVyIG5ld0ZpbHRlcikgewogICAgICAgICBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5jaGVja0FjY2VzcygpOwpAQCAtMzc3LDcgKzQwMyw3IEBACiAgICAgICogbm90IGNoZWNrIHNlY3VyaXR5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdGb3JtYXR0ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXR0ZXIgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0dGVyIHRvIHNldC4KICAgICAgKi8KICAgICB2b2lkIGludGVybmFsU2V0Rm9ybWF0dGVyKEZvcm1hdHRlciBuZXdGb3JtYXR0ZXIpIHsKICAgICAgICAgaWYgKG51bGwgPT0gbmV3Rm9ybWF0dGVyKSB7CkBAIC0zOTAsMTAgKzQxNiwxMyBAQAogICAgICAqIFNldHMgdGhlIGZvcm1hdHRlciB0byBiZSB1c2VkIGJ5IHRoaXMgaGFuZGxlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3Rm9ybWF0dGVyCi0gICAgICogICAgICAgICAgICB0aGUgZm9ybWF0dGVyIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdHRlciB0byBzZXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuZXdGb3JtYXR0ZXJ9IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CiAgICAgICogICAgICAgICAgICAgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXR0ZXIoRm9ybWF0dGVyIG5ld0Zvcm1hdHRlcikgewogICAgICAgICBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5jaGVja0FjY2VzcygpOwpAQCAtNDAxLDEzICs0MzAsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoaXMgaGFuZGxlci4KKyAgICAgKiBTZXRzIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoZSBtZXNzYWdlcyBsb2dnZWQgYnkgdGhpcyBoYW5kbGVyLCBsZXZlbHMKKyAgICAgKiBsb3dlciB0aGFuIHRoaXMgdmFsdWUgd2lsbCBiZSBkcm9wcGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdMZXZlbAotICAgICAqICAgICAgICAgICAgdGhlIGxvZ2dpbmcgbGV2ZWwgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgbG9nZ2luZyBsZXZlbCB0byBzZXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuZXdMZXZlbH0gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKICAgICAgKiAgICAgICAgICAgICBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExldmVsKExldmVsIG5ld0xldmVsKSB7CiAgICAgICAgIGlmIChudWxsID09IG5ld0xldmVsKSB7CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTGV2ZWwuamF2YSBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9MZXZlbC5qYXZhCmluZGV4IGJiMzlkNTEuLjMyYmEwMTcgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9MZXZlbC5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9MZXZlbC5qYXZhCkBAIC0yNywyMCArMjcsMjIgQEAKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5WTTsKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAoraW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1TdGFjazsKKy8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogLyoqCi0gKiA8Y29kZT5MZXZlbDwvY29kZT4gb2JqZWN0cyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbGV2ZWwgb2YgbG9nZ2luZy4gVGhlcmUKLSAqIGFyZSBhIHNldCBvZiBwcmVkZWZpbmVkIGxvZ2dpbmcgbGV2ZWxzLCBlYWNoIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnRlZ2VyCi0gKiB2YWx1ZS4gRW5hYmxpbmcgYSBjZXJ0YWluIGxvZ2dpbmcgbGV2ZWwgYWxzbyBlbmFibGVzIGFsbCBsb2dnaW5nIGxldmVscyB3aXRoCi0gKiBsYXJnZXIgdmFsdWVzLgorICoge0Bjb2RlIExldmVsfSBvYmplY3RzIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSBsZXZlbCBvZiBsb2dnaW5nLiBUaGVyZSBhcmUgYQorICogc2V0IG9mIHByZWRlZmluZWQgbG9nZ2luZyBsZXZlbHMsIGVhY2ggYXNzb2NpYXRlZCB3aXRoIGFuIGludGVnZXIgdmFsdWUuCisgKiBFbmFibGluZyBhIGNlcnRhaW4gbG9nZ2luZyBsZXZlbCBhbHNvIGVuYWJsZXMgYWxsIGxvZ2dpbmcgbGV2ZWxzIHdpdGggbGFyZ2VyCisgKiB2YWx1ZXMuCiAgKiA8cD4KICAqIFRoZSBwcmVkZWZpbmVkIGxldmVscyBpbiBhc2NlbmRpbmcgb3JkZXIgYXJlIEZJTkVTVCwgRklORVIsIEZJTkUsIENPTkZJRywKICAqIElORk8sIFdBUk5JTkcsIFNFVkVSRS4gVGhlcmUgYXJlIHR3byBhZGRpdGlvbmFsIHByZWRlZmluZWQgbGV2ZWxzLCB3aGljaCBhcmUKICAqIEFMTCBhbmQgT0ZGLiBBTEwgaW5kaWNhdGVzIGxvZ2dpbmcgYWxsIG1lc3NhZ2VzLCBhbmQgT0ZGIGluZGljYXRlcyBsb2dnaW5nIG5vCiAgKiBtZXNzYWdlcy4KICAqIDwvcD4KLSAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBMZXZlbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTUwLDYxICs1Miw4NSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIE9GRiBsZXZlbCBwcm92aWRlcyBubyBsb2dnaW5nIG1lc3NhZ2VzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGV2ZWwgT0ZGID0gbmV3IExldmVsKCJPRkYiLCBJbnRlZ2VyLk1BWF9WQUxVRSk7IC8vJE5PTi1OTFMtMSQKIAogICAgIC8qKgotICAgICAqIFRoZSBTRVZFUkUgbGV2ZWwgaW5kaWNhdGVzIGEgc2V2ZXJlIGZhaWx1cmUuCisgICAgICogVGhlIFNFVkVSRSBsZXZlbCBwcm92aWRlcyBzZXZlcmUgZmFpbHVyZSBtZXNzYWdlcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExldmVsIFNFVkVSRSA9IG5ldyBMZXZlbCgiU0VWRVJFIiwgMTAwMCk7IC8vJE5PTi1OTFMtMSQKIAogICAgIC8qKgotICAgICAqIFRoZSBXQVJOSU5HIGxldmVsIGluZGljYXRlcyBhIHdhcm5pbmcuCisgICAgICogVGhlIFdBUk5JTkcgbGV2ZWwgcHJvdmlkZXMgd2FybmluZ3MuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXZlbCBXQVJOSU5HID0gbmV3IExldmVsKCJXQVJOSU5HIiwgOTAwKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogVGhlIElORk8gbGV2ZWwgaW5kaWNhdGVzIGFuIGluZm9ybWF0aXZlIG1lc3NhZ2UuCisgICAgICogVGhlIElORk8gbGV2ZWwgcHJvdmlkZXMgaW5mb3JtYXRpdmUgbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXZlbCBJTkZPID0gbmV3IExldmVsKCJJTkZPIiwgODAwKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogVGhlIENPTkZJRyBsZXZlbCBpbmRpY2F0ZXMgYSBzdGF0aWMgY29uZmlndXJhdGlvbiBtZXNzYWdlLgorICAgICAqIFRoZSBDT05GSUcgbGV2ZWwgcHJvdmlkZXMgc3RhdGljIGNvbmZpZ3VyYXRpb24gbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXZlbCBDT05GSUcgPSBuZXcgTGV2ZWwoIkNPTkZJRyIsIDcwMCk7IC8vJE5PTi1OTFMtMSQKIAogICAgIC8qKgogICAgICAqIFRoZSBGSU5FIGxldmVsIHByb3ZpZGVzIHRyYWNpbmcgbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXZlbCBGSU5FID0gbmV3IExldmVsKCJGSU5FIiwgNTAwKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCiAgICAgICogVGhlIEZJTkVSIGxldmVsIHByb3ZpZGVzIG1vcmUgZGV0YWlsZWQgdHJhY2luZyBtZXNzYWdlcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExldmVsIEZJTkVSID0gbmV3IExldmVsKCJGSU5FUiIsIDQwMCk7IC8vJE5PTi1OTFMtMSQKIAogICAgIC8qKgogICAgICAqIFRoZSBGSU5FU1QgbGV2ZWwgcHJvdmlkZXMgaGlnaGx5IGRldGFpbGVkIHRyYWNpbmcgbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXZlbCBGSU5FU1QgPSBuZXcgTGV2ZWwoIkZJTkVTVCIsIDMwMCk7IC8vJE5PTi1OTFMtMSQKIAogICAgIC8qKgogICAgICAqIFRoZSBBTEwgbGV2ZWwgcHJvdmlkZXMgYWxsIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXZlbCBBTEwgPSBuZXcgTGV2ZWwoIkFMTCIsIEludGVnZXIuTUlOX1ZBTFVFKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogUGFyc2VzIGEgbGV2ZWwgbmFtZSBpbnRvIGEgPGNvZGU+TGV2ZWw8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBQYXJzZXMgYSBsZXZlbCBuYW1lIGludG8gYSB7QGNvZGUgTGV2ZWx9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgbGV2ZWwsIHdoaWNoIGNhbm5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIDxjb2RlPkxldmVsPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHtAY29kZSBsZXZlbH0sIHdoaWNoIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gdGhlIGxldmVsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgbm90IHZhbGlkLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuYW1lfSBpcyBub3QgdmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZXZlbCBwYXJzZShTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGV2ZWwgcGFyc2UoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gZmluYWwgbW9kaWZpZXIgcmVtb3ZlZCBhbmQgSUFFIGFkZGVkIHRvIGdldCBjbG9zZXIgdG8gdGhlIFJJCisgICAgICAgIC8vIGNvcGllZCBmcm9tIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGxvZ2dpbmcuMUM9VGhlICduYW1lJyBwYXJhbWV0ZXIgaXMgbnVsbC4KICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImxvZ2dpbmcuMUMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTE3NiwyNSArMjAyLDM0IEBACiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgUmVzb3VyY2VCdW5kbGUgcmI7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkxldmVsPC9jb2RlPiB0YWtpbmcgdGhlIHN1cHBsaWVkIG5hbWUKLSAgICAgKiBhbmQgbGV2ZWwgdmFsdWUuCisgICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgTGV2ZWx9IHRha2luZyB0aGUgc3VwcGxpZWQgbmFtZSBhbmQKKyAgICAgKiBsZXZlbCB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBsZXZlbAotICAgICAqIEBwYXJhbSBsZXZlbCBhbiBpbnRlZ2VyIHZhbHVlIGluZGljYXRpbmcgdGhlIGxldmVsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGxldmVsLgorICAgICAqIEBwYXJhbSBsZXZlbAorICAgICAqICAgICAgICAgICAgYW4gaW50ZWdlciB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBsZXZlbC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5hbWV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHJvdGVjdGVkIExldmVsKFN0cmluZyBuYW1lLCBpbnQgbGV2ZWwpIHsKICAgICAgICAgdGhpcyhuYW1lLCBsZXZlbCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5MZXZlbDwvY29kZT4gdGFraW5nIHRoZSBzdXBwbGllZCBuYW1lCi0gICAgICogYW5kIGxldmVsIHZhbHVlLgorICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIExldmVsfSB0YWtpbmcgdGhlIHN1cHBsaWVkIG5hbWUsIGxldmVsCisgICAgICogdmFsdWUgYW5kIHJlc291cmNlIGJ1bmRsZSBuYW1lLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGxldmVsCi0gICAgICogQHBhcmFtIGxldmVsIGFuIGludGVnZXIgdmFsdWUgaW5kaWNhdGluZyB0aGUgbGV2ZWwKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gdXNlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGxldmVsLgorICAgICAqIEBwYXJhbSBsZXZlbAorICAgICAqICAgICAgICAgICAgYW4gaW50ZWdlciB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBsZXZlbC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIHVzZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5hbWV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgTGV2ZWwoU3RyaW5nIG5hbWUsIGludCBsZXZlbCwgU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkgewogICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CkBAIC0yMDYsMTEgKzI0MSwxMCBAQAogICAgICAgICB0aGlzLnJlc291cmNlQnVuZGxlTmFtZSA9IHJlc291cmNlQnVuZGxlTmFtZTsKICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBrZXJuZWwudm0uVk0uY2FsbGVyQ2xhc3NMb2FkZXIsIG9yIGZpbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgd2F5IHRvIGdldCB0aGUgY2FsbGVyIGNsYXNzIGxvYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWxlLmdldERlZmF1bHQoKSwgVk0uY2FsbGVyQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZS5nZXREZWZhdWx0KCksIFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHJiID0gbnVsbDsKICAgICAgICAgICAgIH0KQEAgLTIyMSwyOSArMjU1LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIDxjb2RlPkxldmVsPC9jb2RlPi4KKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoaXMgbGV2ZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIDxjb2RlPkxldmVsPC9jb2RlPgorICAgICAqIEByZXR1cm4gdGhpcyBsZXZlbCdzIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqIDxjb2RlPkxldmVsPC9jb2RlPi4KKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGV2ZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICogICAgICAgICA8Y29kZT5MZXZlbDwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbGV2ZWwncyByZXNvdXJjZSBidW5kbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlQnVuZGxlTmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbnRlZ2VyIHZhbHVlIGluZGljYXRpbmcgdGhpcyA8Y29kZT5MZXZlbDwvY29kZT4uCisgICAgICogR2V0cyB0aGUgaW50ZWdlciB2YWx1ZSBpbmRpY2F0aW5nIHRoaXMgbGV2ZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBpbmRpY2F0aW5nIHRoaXMgPGNvZGU+TGV2ZWw8L2NvZGU+CisgICAgICogQHJldHVybiB0aGlzIGxldmVsJ3MgaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGludFZhbHVlKCkgewogICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKQEAgLTI1NSw3ICsyOTAsNyBAQAogICAgICAqIGxldmVscy4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgcmVzb2x2ZWQgaW5zdGFuY2UuCisgICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuCiAgICAgICovCiAgICAgcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobGV2ZWxzKSB7CkBAIC0yODAsMTAgKzMxNSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPlNlcmlhbGl6YXRpb24gaGVscGVyIHRvIHNldHVwIHRyYW5zaWVudCByZXNvdXJjZSBidW5kbGUgaW5zdGFuY2UuPC9wPgotICAgICAqIEBwYXJhbSBpbiBUaGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgdGhlIGluc3RhbmNlIGRhdGEgZnJvbS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYSBjbGFzcyBpcyBub3QgZm91bmQuIAorICAgICAqIFNlcmlhbGl6YXRpb24gaGVscGVyIHRvIHNldHVwIHRyYW5zaWVudCByZXNvdXJjZSBidW5kbGUgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGluCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgdGhlIGluc3RhbmNlIGRhdGEgZnJvbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSU8gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgY2xhc3MgaXMgbm90IGZvdW5kLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwpAQCAtMjk4LDEwICszMzcsMTEgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgbGV2ZWwuIFRoZSBkZWZhdWx0IGxvY2FsZSBpcyB1c2VkLiBJZiBubwotICAgICAqIHJlc291cmNlIGJ1bmRsZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Y29kZT5MZXZlbDwvY29kZT4sIHRoZQotICAgICAqIG9yaWdpbmFsIGxldmVsIG5hbWUgaXMgcmV0dXJuZWQuCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxldmVsIHRoZW4gdGhlIG9yaWdpbmFsIGxldmVsCisgICAgICogbmFtZSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGxldmVsCisgICAgICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyBsZXZlbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE5hbWUoKSB7CiAgICAgICAgIGlmIChyYiA9PSBudWxsKSB7CkBAIC0zMTYsMTIgKzM1NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byA8Y29kZT5MZXZlbDwvY29kZT4gb2JqZWN0cyBmb3IgZXF1YWxpdHkuIFRoZXkgYXJlCi0gICAgICogY29uc2lkZXJlZCB0byBiZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgdmFsdWUuCisgICAgICogQ29tcGFyZXMgdHdvIHtAY29kZSBMZXZlbH0gb2JqZWN0cyBmb3IgZXF1YWxpdHkuIFRoZXkgYXJlIGNvbnNpZGVyZWQgdG8KKyAgICAgKiBiZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGV2ZWwgdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIG90aGVyIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBlcXVhbHMgdG8gdGhlIHN1cHBsaWVkIG9iamVjdCwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlIHRoaXMgbGV2ZWwgdG8uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBvYmplY3QgZXF1YWxzIHRvIHRoZSBzdXBwbGllZCBvYmplY3QsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKQEAgLTMzNyw5ICszNzksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyA8Y29kZT5MZXZlbDwvY29kZT4gb2JqZWN0LgorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGlzIHtAY29kZSBMZXZlbH0gb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBvZiB0aGlzIDxjb2RlPkxldmVsPC9jb2RlPiBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoaXMgbGV2ZWwncyBoYXNoIGNvZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTM0NywxNCArMzkwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+TGV2ZWw8L2NvZGU+IG9iamVjdC4KLSAgICAgKiBVc3VhbGx5IHRoaXMgd2lsbCBpbmNsdWRlIGl0cyBuYW1lLgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBMZXZlbH0gb2JqZWN0LiBJbgorICAgICAqIHRoaXMgY2FzZSwgaXQgaXMgdGhlIGxldmVsJ3MgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5MZXZlbDwvY29kZT4gb2JqZWN0CisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbGV2ZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dNYW5hZ2VyLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nTWFuYWdlci5qYXZhCmluZGV4IDQ2MmI2NTguLjg0MDliODEgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dNYW5hZ2VyLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ01hbmFnZXIuamF2YQpAQCAtMTcsMTAgKzE3LDggQEAKIAogcGFja2FnZSBqYXZhLnV0aWwubG9nZ2luZzsKIAotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyBpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotLy8gaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAoraW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwpAQCAtNDcsMjkgKzQ1LDMwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+IGlzIHVzZWQgdG8gbWFpbnRhaW4gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZQorICoge0Bjb2RlIExvZ01hbmFnZXJ9IGlzIHVzZWQgdG8gbWFpbnRhaW4gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZQogICogbG9nZ2luZyBmcmFtZXdvcmssIGFuZCB0byBtYW5hZ2UgYSBoaWVyYXJjaGljYWwgbmFtZXNwYWNlIG9mIGFsbCBuYW1lZAotICogPGNvZGU+TG9nZ2VyPC9jb2RlPiBvYmplY3RzLgorICoge0Bjb2RlIExvZ2dlcn0gb2JqZWN0cy4KICAqIDxwPgotICogVGhlcmUgaXMgb25seSBvbmUgZ2xvYmFsIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+IGluc3RhbmNlIGluIHRoZQorICoKKyAqIFRoZXJlIGlzIG9ubHkgb25lIGdsb2JhbCB7QGNvZGUgTG9nTWFuYWdlcn0gaW5zdGFuY2UgaW4gdGhlCiAgKiBhcHBsaWNhdGlvbiwgd2hpY2ggY2FuIGJlIGdldCBieSBjYWxsaW5nIHN0YXRpYyBtZXRob2QKLSAqIDxjb2RlPkxvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpPC9jb2RlPi4gVGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZAorICoge0BsaW5rICNnZXRMb2dNYW5hZ2VyKCl9LiBUaGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kCiAgKiBpbml0aWFsaXplZCBkdXJpbmcgY2xhc3MgaW5pdGlhbGl6YXRpb24gYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLgogICogPC9wPgogICogPHA+Ci0gKiBUaGUgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gY2xhc3MgY2FuIGJlIHNwZWNpZmllZCBieQorICogVGhlIHtAY29kZSBMb2dNYW5hZ2VyfSBjbGFzcyBjYW4gYmUgc3BlY2lmaWVkIGJ5CiAgKiBqYXZhLnV0aWwubG9nZ2luZy5tYW5hZ2VyIHN5c3RlbSBwcm9wZXJ0eSwgaWYgdGhlIHByb3BlcnR5IGlzIHVuYXZhaWxhYmxlIG9yCi0gKiBpbnZhbGlkLCB0aGUgZGVmYXVsdCBjbGFzcyA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyPC9jb2RlPiB3aWxsCisgKiBpbnZhbGlkLCB0aGUgZGVmYXVsdCBjbGFzcyB7QGxpbmsgamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlcn0gd2lsbAogICogYmUgdXNlZC4KICAqIDwvcD4KICAqIDxwPgotICogV2hlbiBpbml0aWFsaXphdGlvbiwgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gcmVhZCBpdHMgY29uZmlndXJhdGlvbiBmcm9tIGEKKyAqIFdoZW4gaW5pdGlhbGl6YXRpb24sIHtAY29kZSBMb2dNYW5hZ2VyfSByZWFkIGl0cyBjb25maWd1cmF0aW9uIGZyb20gYQogICogcHJvcGVydGllcyBmaWxlLCB3aGljaCBieSBkZWZhdWx0IGlzIHRoZSAibGliL2xvZ2dpbmcucHJvcGVydGllcyIgaW4gdGhlIEpSRQogICogZGlyZWN0b3J5LgogICogPC9wPgogICogPHA+CiAgKiBIb3dldmVyLCB0d28gb3B0aW9uYWwgc3lzdGVtIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBpbml0aWFsCi0gKiBjb25maWd1cmF0aW9uIHByb2Nlc3Mgb2YgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4uCisgKiBjb25maWd1cmF0aW9uIHByb2Nlc3Mgb2Yge0Bjb2RlIExvZ01hbmFnZXJ9LgogICogPHVsPgogICogPGxpPiJqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuY2xhc3MiPC9saT4KICAqIDxsaT4iamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGUiPC9saT4KQEAgLTgzLDIwICs4MiwyMCBAQAogICogPHA+CiAgKiBUaGUgImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5jbGFzcyIgc2hvdWxkIHNwZWNpZmllcyBhIGNsYXNzIG5hbWUuIElmIGl0IGlzCiAgKiBzZXQsIHRoaXMgZ2l2ZW4gY2xhc3Mgd2lsbCBiZSBsb2FkZWQgYW5kIGluc3RhbnRpYXRlZCBkdXJpbmcKLSAqIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+IGluaXRpYWxpemF0aW9uLCBzbyB0aGF0IHRoaXMgb2JqZWN0J3MgZGVmYXVsdAorICoge0Bjb2RlIExvZ01hbmFnZXJ9IGluaXRpYWxpemF0aW9uLCBzbyB0aGF0IHRoaXMgb2JqZWN0J3MgZGVmYXVsdAogICogY29uc3RydWN0b3IgY2FuIHJlYWQgdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBhbmQgZGVmaW5lIHByb3BlcnRpZXMgZm9yCi0gKiA8Y29kZT5Mb2dNYW5hZ2VyPC9jb2RlPi4KKyAqIHtAY29kZSBMb2dNYW5hZ2VyfS4KICAqIDwvcD4KICAqIDxwPgogICogSWYgImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5jbGFzcyIgcHJvcGVydHkgaXMgbm90IHNldCwgb3IgaXQgaXMgaW52YWxpZCwgb3IKICAqIHNvbWUgZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgdGhlIGluc3RhbnRpYXRpb24sIHRoZW4gdGhlCiAgKiAiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGUiIHN5c3RlbSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEKLSAqIHByb3BlcnRpZXMgZmlsZS4gVGhlIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+IHdpbGwgcmVhZCBpbml0aWFsCisgKiBwcm9wZXJ0aWVzIGZpbGUuIFRoZSB7QGNvZGUgTG9nTWFuYWdlcn0gd2lsbCByZWFkIGluaXRpYWwKICAqIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGlzIGZpbGUuCiAgKiA8L3A+CiAgKiA8cD4KICAqIElmIG5laXRoZXIgb2YgdGhlc2UgcHJvcGVydGllcyBpcyBkZWZpbmVkLCBvciBzb21lIGV4Y2VwdGlvbiBpcyB0aHJvd24KLSAqIGR1cmluZyB0aGVzZSB0d28gcHJvcGVydGllcyB1c2luZywgdGhlIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+IHdpbGwgcmVhZAorICogZHVyaW5nIHRoZXNlIHR3byBwcm9wZXJ0aWVzIHVzaW5nLCB0aGUge0Bjb2RlIExvZ01hbmFnZXJ9IHdpbGwgcmVhZAogICogaXRzIGluaXRpYWwgY29uZmlndXJhdGlvbiBmcm9tIGRlZmF1bHQgcHJvcGVydGllcyBmaWxlLCBhcyBkZXNjcmliZWQgYWJvdmUuCiAgKiA8L3A+CiAgKiA8cD4KQEAgLTEwNCwyMSArMTAzLDIxIEBACiAgKiA8dWw+CiAgKiA8bGk+ImhhbmRsZXJzIi4gVGhpcyBwcm9wZXJ0eSdzIHZhbHVlcyBzaG91bGQgYmUgYSBsaXN0IG9mIGNsYXNzIG5hbWVzIGZvcgogICogaGFuZGxlciBjbGFzc2VzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLCB0aGVzZSBjbGFzc2VzIG11c3QgYmUgc3ViY2xhc3NlcyBvZgotICogPGNvZGU+SGFuZGxlcjwvY29kZT4gYW5kIGVhY2ggbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgdGhlc2UKKyAqIHtAY29kZSBIYW5kbGVyfSBhbmQgZWFjaCBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCB0aGVzZQogICogY2xhc3NlcyB3aWxsIGJlIGxvYWRlZCwgaW5zdGFudGlhdGVkIGFuZCByZWdpc3RlcmVkIGFzIGhhbmRsZXJzIG9uIHRoZSByb290Ci0gKiA8Y29kZT5Mb2dnZXI8L2NvZGU+ICh0aGUgPGNvZGU+TG9nZ2VyPC9jb2RlPiBuYW1lZCAiIikuIFRoZXNlCi0gKiA8Y29kZT5IYW5kbGVyPC9jb2RlPnMgbWF5YmUgaW5pdGlhbGl6ZWQgbGF6aWx5LjwvbGk+CisgKiB7QGNvZGUgTG9nZ2VyfSAodGhlIHtAY29kZSBMb2dnZXJ9IG5hbWVkICIiKS4gVGhlc2UKKyAqIHtAY29kZSBIYW5kbGVyfXMgbWF5YmUgaW5pdGlhbGl6ZWQgbGF6aWx5LjwvbGk+CiAgKiA8bGk+ImNvbmZpZyIuIFRoZSBwcm9wZXJ0eSBkZWZpbmVzIGEgbGlzdCBvZiBjbGFzcyBuYW1lcyBzZXBhcmF0ZWQgYnkKICAqIHdoaXRlc3BhY2UuIEVhY2ggY2xhc3MgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgaW4gd2hpY2ggaXQgY2FuCiAgKiB1cGRhdGUgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiwgc3VjaCBhcyBsZXZlbHMsIGhhbmRsZXJzLCBvciBmaWx0ZXJzIGZvcgogICogc29tZSBsb2dnZXIsIGV0Yy4gVGhlc2UgY2xhc3NlcyB3aWxsIGJlIGxvYWRlZCBhbmQgaW5zdGFudGlhdGVkIGR1cmluZwotICogPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gY29uZmlndXJhdGlvbjwvbGk+CisgKiB7QGNvZGUgTG9nTWFuYWdlcn0gY29uZmlndXJhdGlvbjwvbGk+CiAgKiA8L3VsPgogICogPC9wPgogICogPHA+CiAgKiBUaGlzIGNsYXNzLCB0b2dldGhlciB3aXRoIGFueSBoYW5kbGVyIGFuZCBjb25maWd1cmF0aW9uIGNsYXNzZXMgYXNzb2NpYXRlZAogICogd2l0aCBpdCwgPGI+bXVzdDwvYj4gYmUgbG9hZGVkIGZyb20gdGhlIHN5c3RlbSBjbGFzc3BhdGggd2hlbgotICogPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gY29uZmlndXJhdGlvbiBvY2N1cnMuCisgKiB7QGNvZGUgTG9nTWFuYWdlcn0gY29uZmlndXJhdGlvbiBvY2N1cnMuCiAgKiA8L3A+CiAgKiA8cD4KICAqIEJlc2lkZXMgZ2xvYmFsIHByb3BlcnRpZXMsIHRoZSBwcm9wZXJ0aWVzIGZvciBsb2dnZXJzIGFuZCBIYW5kbGVycyBjYW4gYmUKQEAgLTEyNiwxMiArMTI1LDEyIEBACiAgKiB3aXRoIHRoZSBjb21wbGV0ZSBkb3Qgc2VwYXJhdGVkIG5hbWVzIGZvciB0aGUgaGFuZGxlcnMgb3IgbG9nZ2Vycy4KICAqIDwvcD4KICAqIDxwPgotICogSW4gdGhlIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+J3MgaGllcmFyY2hpY2FsIG5hbWVzcGFjZSwKLSAqIDxjb2RlPkxvZ2dlcnM8L2NvZGU+IGFyZSBvcmdhbml6ZWQgYmFzZWQgb24gdGhlaXIgZG90IHNlcGFyYXRlZCBuYW1lcy4gRm9yCisgKiBJbiB0aGUge0Bjb2RlIExvZ01hbmFnZXJ9J3MgaGllcmFyY2hpY2FsIG5hbWVzcGFjZSwKKyAqIHtAY29kZSBMb2dnZXJzfSBhcmUgb3JnYW5pemVkIGJhc2VkIG9uIHRoZWlyIGRvdCBzZXBhcmF0ZWQgbmFtZXMuIEZvcgogICogZXhhbXBsZSwgIngueS56IiBpcyBjaGlsZCBvZiAieC55Ii4KICAqIDwvcD4KICAqIDxwPgotICogTGV2ZWxzIGZvciA8Y29kZT5Mb2dnZXJzPC9jb2RlPiBjYW4gYmUgZGVmaW5lZCBieSBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgZW5kCisgKiBMZXZlbHMgZm9yIHtAY29kZSBMb2dnZXJzfSBjYW4gYmUgZGVmaW5lZCBieSBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgZW5kCiAgKiB3aXRoICIubGV2ZWwiLiBUaHVzICJhbG9nZ2VyLmxldmVsIiBkZWZpbmVzIGEgbGV2ZWwgZm9yIHRoZSBsb2dnZXIgbmFtZWQgYXMKICAqICJhbG9nZ2VyIiBhbmQgZm9yIGFsbCBpdHMgY2hpbGRyZW4gaW4gdGhlIG5hbWluZyBoaWVyYXJjaHkuIExvZyBsZXZlbHMKICAqIHByb3BlcnRpZXMgYXJlIHJlYWQgYW5kIGFwcGxpZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcmUgc3BlY2lmaWVkIGluCkBAIC0xNjMsNDggKzE2Miw1NCBAQAogICAgIHN0YXRpYyBMb2dNYW5hZ2VyIG1hbmFnZXI7CiAgICAgCiAgICAgLyoqCi0gICAgICogPHA+VGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUge0BsaW5rIExvZ2dpbmdNWEJlYW59J3MgT2JqZWN0TmFtZS48L3A+CisgICAgICogVGhlIHtAY29kZSBTdHJpbmd9IHZhbHVlIG9mIHRoZSB7QGxpbmsgTG9nZ2luZ01YQmVhbn0ncyBPYmplY3ROYW1lLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfTVhCRUFOX05BTUUgPQogICAgICAgICAgICAgImphdmEudXRpbC5sb2dnaW5nOnR5cGU9TG9nZ2luZyI7IC8vJE5PTi1OTFMtMSQKIAotLy8gQkVOR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgLyoqCi0vLyAgICAgKiBHZXQgdGhlIDxjb2RlPkxvZ2dpbmdNWEJlYW48L2NvZGU+IGluc3RhbmNlCi0vLyAgICAgKiAKLS8vICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkxvZ2dpbmdNWEJlYW48L2NvZGU+IGluc3RhbmNlCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2luZ01YQmVhbiBnZXRMb2dnaW5nTVhCZWFuKCkgewotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIE9iamVjdE5hbWUgbG9nZ2luZ01YQmVhbk5hbWUgPSBuZXcgT2JqZWN0TmFtZShMT0dHSU5HX01YQkVBTl9OQU1FKTsKLS8vICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgcGxhdGZvcm1CZWFuU2VydmVyID0KLS8vICAgICAgICAgICAgICAgICAgICBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7Ci0vLyAgICAgICAgICAgIFNldCBsb2dnaW5nTVhCZWFuU2V0ID0gcGxhdGZvcm1CZWFuU2VydmVyLnF1ZXJ5TUJlYW5zKAotLy8gICAgICAgICAgICAgICAgICAgIGxvZ2dpbmdNWEJlYW5OYW1lLCBudWxsKTsKLS8vCi0vLyAgICAgICAgICAgIGlmIChsb2dnaW5nTVhCZWFuU2V0LnNpemUoKSAhPSAxKSB7Ci0vLyAgICAgICAgICAgICAgICAvLyBsb2dnaW5nLjIxPVRoZXJlIENhbiBCZSBPbmx5IE9uZSBsb2dnaW5nIE1YIGJlYW4uCi0vLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoTWVzc2FnZXMuZ2V0U3RyaW5nKCJsb2dnaW5nLjIxIikpOwotLy8gICAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgICBJdGVyYXRvciBpID0gbG9nZ2luZ01YQmVhblNldC5pdGVyYXRvcigpOwotLy8gICAgICAgICAgICBPYmplY3RJbnN0YW5jZSBsb2dnaW5nTVhCZWFuT0kgPSAoT2JqZWN0SW5zdGFuY2UpIGkubmV4dCgpOwotLy8gICAgICAgICAgICBTdHJpbmcgbG14YmNuID0gbG9nZ2luZ01YQmVhbk9JLmdldENsYXNzTmFtZSgpOwotLy8gICAgICAgICAgICBDbGFzcyBsbXhiYyA9IENsYXNzLmZvck5hbWUobG14YmNuKTsKLS8vICAgICAgICAgICAgTWV0aG9kIGdpTWV0aG9kID0gbG14YmMuZ2V0RGVjbGFyZWRNZXRob2QoImdldEluc3RhbmNlIik7Ci0vLyAgICAgICAgICAgIGdpTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0vLyAgICAgICAgICAgIExvZ2dpbmdNWEJlYW4gbG14YiA9IChMb2dnaW5nTVhCZWFuKQotLy8gICAgICAgICAgICAgICAgICAgIGdpTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge30pOwotLy8KLS8vICAgICAgICAgICAgcmV0dXJuIGxteGI7Ci0vLyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgLy9UT0RPCi0vLyAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgLy8gbG9nZ2luZy4yMj1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyB0aGUgbG9nZ2luZyBNWCBiZWFuLgotLy8gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihNZXNzYWdlcy5nZXRTdHJpbmcoImxvZ2dpbmcuMjIiKSk7IC8vJE5PTi1OTFMtMSQKLS8vICAgIH0KLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAY29kZSBMb2dnaW5nTVhCZWFufSBpbnN0YW5jZS4gdGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzCisgICAgICogYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIExvZ2dpbmdNWEJlYW59IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMb2dnaW5nTVhCZWFuIGdldExvZ2dpbmdNWEJlYW4oKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkICAgICAgICAKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIHRyeSB7CisgICAgICAgIC8vICAgICBPYmplY3ROYW1lIGxvZ2dpbmdNWEJlYW5OYW1lID0gbmV3IE9iamVjdE5hbWUoTE9HR0lOR19NWEJFQU5fTkFNRSk7CisgICAgICAgIC8vICAgICBNQmVhblNlcnZlciBwbGF0Zm9ybUJlYW5TZXJ2ZXIgPQorICAgICAgICAvLyAgICAgICAgICAgICBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgICAgIC8vICAgICBTZXQgbG9nZ2luZ01YQmVhblNldCA9IHBsYXRmb3JtQmVhblNlcnZlci5xdWVyeU1CZWFucygKKyAgICAgICAgLy8gICAgICAgICAgICAgbG9nZ2luZ01YQmVhbk5hbWUsIG51bGwpOworICAgICAgICAvLyAKKyAgICAgICAgLy8gICAgIGlmIChsb2dnaW5nTVhCZWFuU2V0LnNpemUoKSAhPSAxKSB7CisgICAgICAgIC8vICAgICAgICAgLy8gbG9nZ2luZy4yMT1UaGVyZSBDYW4gQmUgT25seSBPbmUgbG9nZ2luZyBNWCBiZWFuLgorICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihNZXNzYWdlcy5nZXRTdHJpbmcoImxvZ2dpbmcuMjEiKSk7CisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBJdGVyYXRvciBpID0gbG9nZ2luZ01YQmVhblNldC5pdGVyYXRvcigpOworICAgICAgICAvLyAgICAgT2JqZWN0SW5zdGFuY2UgbG9nZ2luZ01YQmVhbk9JID0gKE9iamVjdEluc3RhbmNlKSBpLm5leHQoKTsKKyAgICAgICAgLy8gICAgIFN0cmluZyBsbXhiY24gPSBsb2dnaW5nTVhCZWFuT0kuZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgIC8vICAgICBDbGFzcyBsbXhiYyA9IENsYXNzLmZvck5hbWUobG14YmNuKTsKKyAgICAgICAgLy8gICAgIE1ldGhvZCBnaU1ldGhvZCA9IGxteGJjLmdldERlY2xhcmVkTWV0aG9kKCJnZXRJbnN0YW5jZSIpOworICAgICAgICAvLyAgICAgZ2lNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgLy8gICAgIExvZ2dpbmdNWEJlYW4gbG14YiA9IChMb2dnaW5nTVhCZWFuKQorICAgICAgICAvLyAgICAgICAgICAgICBnaU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHt9KTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIHJldHVybiBsbXhiOworICAgICAgICAvLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAvLyAgICAgLy9UT0RPCisgICAgICAgIC8vICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gLy8gbG9nZ2luZy4yMj1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyB0aGUgbG9nZ2luZyBNWCBiZWFuLgorICAgICAgICAvLyB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoTWVzc2FnZXMuZ2V0U3RyaW5nKCJsb2dnaW5nLjIyIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAgfQogCiAgICAgLyoKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTgsOSArMjIzLDcgQEAKICAgICBwcml2YXRlIFByb3BlcnRpZXMgcHJvcHM7CiAKICAgICAvLyB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IGxpc3RlbmVyczsKLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBsaXN0ZW5lcnM7CiAKICAgICAvKgogICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI2MywxNiArMjY2LDE0IEBACiAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiBUaGlzIGlzIG5vdCBwdWJsaWMgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUKLSAgICAgKiA8Y29kZT5Mb2dNYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIGdldCBieQotICAgICAqIDxjb2RlPkxvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcig8L2NvZGU+LiBUaGlzIGlzIHByb3RlY3RlZCBzbyB0aGF0CisgICAgICoge0Bjb2RlIExvZ01hbmFnZXJ9IGluc3RhbmNlLCB3aGljaCBjYW4gYmUgZ2V0IGJ5CisgICAgICoge0Bjb2RlIExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcih9LiBUaGlzIGlzIHByb3RlY3RlZCBzbyB0aGF0CiAgICAgICogYXBwbGljYXRpb24gY2FuIHN1YmNsYXNzIHRoZSBvYmplY3QuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIExvZ01hbmFnZXIoKSB7CiAgICAgICAgIGxvZ2dlcnMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgTG9nZ2VyPigpOwogICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOwogICAgICAgICAvLyBhZGQgc2h1dGRvd24gaG9vayB0byBlbnN1cmUgdGhhdCB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZSB3aWxsIGJlCiAgICAgICAgIC8vIGZyZWVkIHdoZW4gSlZNIGV4aXRzCiAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+KCkgewpAQCAtMzAyLDE1ICszMDMsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IHRoZSBjYWxsZXIgaGFzIDxjb2RlPkxvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIik8L2NvZGU+IHNvCisgICAgICogQ2hlY2sgdGhhdCB0aGUgY2FsbGVyIGhhcyB7QGNvZGUgTG9nZ2luZ1Blcm1pc3Npb24oImNvbnRyb2wiKX0gc28KICAgICAgKiB0aGF0IGl0IGlzIHRydXN0ZWQgdG8gbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIGZvciBsb2dnaW5nIGZyYW1ld29yay4gSWYKLSAgICAgKiB0aGUgY2hlY2sgcGFzc2VzLCBqdXN0IHJldHVybiwgb3RoZXJ3aXNlIDxjb2RlPlNlY3VyaXR5RXhjZXB0aW9uPC9jb2RlPgorICAgICAqIHRoZSBjaGVjayBwYXNzZXMsIGp1c3QgcmV0dXJuLCBvdGhlcndpc2Uge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufQogICAgICAqIHdpbGwgYmUgdGhyb3duLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIgaW4gb3BlcmF0aW9uIGFuZCB0aGUgaW52b2tlcgogICAgICAqICAgICAgICAgICAgIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpfQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrQWNjZXNzKCkgewogICAgICAgICBpZiAobnVsbCAhPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpIHsKQEAgLTMyMCwyMSArMzIxLDIwIEBACiAKICAgICAvKioKICAgICAgKiBBZGQgYSBnaXZlbiBsb2dnZXIgaW50byB0aGUgaGllcmFyY2hpY2FsIG5hbWVzcGFjZS4gVGhlCi0gICAgICogPGNvZGU+TG9nZ2VyLmFkZExvZ2dlcigpPC9jb2RlPiBmYWN0b3J5IG1ldGhvZHMgY2FsbCB0aGlzIG1ldGhvZCB0byBhZGQKLSAgICAgKiBuZXdseSBjcmVhdGVkIExvZ2dlci4gVGhpcyByZXR1cm5zIGZhbHNlIGlmIGEgbG9nZ2VyIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiBoYXMgZXhpc3RlZCBpbiB0aGUgbmFtZXNwYWNlCisgICAgICoge0Bjb2RlIExvZ2dlci5hZGRMb2dnZXIoKX0gZmFjdG9yeSBtZXRob2RzIGNhbGwgdGhpcyBtZXRob2QgdG8gYWRkIG5ld2x5CisgICAgICogY3JlYXRlZCBMb2dnZXIuIFRoaXMgcmV0dXJucyBmYWxzZSBpZiBhIGxvZ2dlciB3aXRoIHRoZSBnaXZlbiBuYW1lIGhhcworICAgICAqIGV4aXN0ZWQgaW4gdGhlIG5hbWVzcGFjZQogICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gbWF5IG9ubHkgcmV0YWluIHdlYWsgcmVmZXJlbmNlcwotICAgICAqIHRvIHJlZ2lzdGVyZWQgbG9nZ2Vycy4gSW4gb3JkZXIgdG8gcHJldmVudCA8Y29kZT5Mb2dnZXI8L2NvZGU+IG9iamVjdHMKLSAgICAgKiBmcm9tIGJlaW5nIHVuZXhwZWN0ZWRseSBnYXJiYWdlIGNvbGxlY3RlZCBpdCBpcyBuZWNlc3NhcnkgZm9yCi0gICAgICogPGk+YXBwbGljYXRpb25zPC9pPiB0byBtYWludGFpbiByZWZlcmVuY2VzIHRvIHRoZW0uCisgICAgICogTm90ZSB0aGF0IHRoZSB7QGNvZGUgTG9nTWFuYWdlcn0gbWF5IG9ubHkgcmV0YWluIHdlYWsgcmVmZXJlbmNlcyB0bworICAgICAqIHJlZ2lzdGVyZWQgbG9nZ2Vycy4gSW4gb3JkZXIgdG8gcHJldmVudCB7QGNvZGUgTG9nZ2VyfSBvYmplY3RzIGZyb20gYmVpbmcKKyAgICAgKiB1bmV4cGVjdGVkbHkgZ2FyYmFnZSBjb2xsZWN0ZWQgaXQgaXMgbmVjZXNzYXJ5IGZvciA8aT5hcHBsaWNhdGlvbnM8L2k+CisgICAgICogdG8gbWFpbnRhaW4gcmVmZXJlbmNlcyB0byB0aGVtLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9nZ2VyCi0gICAgICogICAgICAgICAgICB0aGUgbG9nZ2VyIHRvIGJlIGFkZGVkCisgICAgICogICAgICAgICAgICB0aGUgbG9nZ2VyIHRvIGJlIGFkZGVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbG9nZ2VyIGlzIGFkZGVkIGludG8gdGhlIG5hbWVzcGFjZQotICAgICAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiB0aGUgbG9nZ2VyIG9mIGdpdmVuIG5hbWUgaGFzIGV4aXN0ZWQgaW4KLSAgICAgKiAgICAgICAgIHRoZSBuYW1lc3BhY2UKKyAgICAgKiAgICAgICAgIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgdGhlIGdpdmVuIGxvZ2dlciBleGlzdHMgaW4gdGhlIG5hbWVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkTG9nZ2VyKExvZ2dlciBsb2dnZXIpIHsKICAgICAgICAgU3RyaW5nIG5hbWUgPSBsb2dnZXIuZ2V0TmFtZSgpOwpAQCAtMzg4LDE4ICszODgsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxvZ2dlciB3aXRoIHRoZSBnaXZlbiBuYW1lCisgICAgICogR2V0IHRoZSBsb2dnZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAqICAgICAgICAgICAgbmFtZSBvZiBsb2dnZXIKLSAgICAgKiBAcmV0dXJuIGxvZ2dlciB3aXRoIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm90aGluZyBpcyBmb3VuZAorICAgICAqIEByZXR1cm4gbG9nZ2VyIHdpdGggZ2l2ZW4gbmFtZSwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdGhpbmcgaXMgZm91bmQuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBMb2dnZXIgZ2V0TG9nZ2VyKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBsb2dnZXJzLmdldChuYW1lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgYSA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgYWxsIHJlZ2lzdGVyZWQgbG9nZ2VyIG5hbWVzCisgICAgICogR2V0IGEge0Bjb2RlIEVudW1lcmF0aW9ufSBvZiBhbGwgcmVnaXN0ZXJlZCBsb2dnZXIgbmFtZXMuCiAgICAgICogCiAgICAgICogQHJldHVybiBlbnVtZXJhdGlvbiBvZiByZWdpc3RlcmVkIGxvZ2dlciBuYW1lcwogICAgICAqLwpAQCAtNDA4LDE2ICs0MDgsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGdsb2JhbCA8Y29kZT5Mb2dNYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZQorICAgICAqIEdldCB0aGUgZ2xvYmFsIHtAY29kZSBMb2dNYW5hZ2VyfSBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBnbG9iYWwgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gaW5zdGFuY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBnbG9iYWwge0Bjb2RlIExvZ01hbmFnZXJ9IGluc3RhbmNlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2dNYW5hZ2VyIGdldExvZ01hbmFnZXIoKSB7CiAgICAgICAgIHJldHVybiBtYW5hZ2VyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgcHJvcGVydHkgd2l0aCBnaXZlbiBuYW1lCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eSB3aXRoIGdpdmVuIG5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHByb3BlcnR5CkBAIC00MjgsMTcgKzQyOCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlLWluaXRpYWxpemUgdGhlIHByb3BlcnRpZXMgYW5kIGNvbmZpZ3VyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzCi0gICAgICogaXMgc2FtZSBhcyB0aGUgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gaW5zdGFudGlhdGlvbi4KKyAgICAgKiBSZS1pbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIGFuZCBjb25maWd1cmF0aW9uLiBUaGUgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBwcm9jZXNzIGlzIHNhbWUgYXMgdGhlIHtAY29kZSBMb2dNYW5hZ2VyfSBpbnN0YW50aWF0aW9uLgogICAgICAqIDxwPgotICAgICAqIEEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gbXVzdCBiZSBmaXJlZC4KKyAgICAgKiBOb3RpY2UgOiBObyB7QGNvZGUgUHJvcGVydHlDaGFuZ2VFdmVudH0gYXJlIGZpcmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW55IElPIHJlbGF0ZWQgcHJvYmxlbXMgaGFwcGVuZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSU8gcmVsYXRlZCBwcm9ibGVtcyBoYXBwZW5lZC4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgZG9lcwotICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBwZXJmb3JtIHRoaXMgYWN0aW9uCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVhZENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0FjY2VzcygpOwpAQCAtNDY2LDEwICs0NjYsMTMgQEAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCA4MTkyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCA4MTkyKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VsdCBmaXhlZCByZXNvdXJjZSBhcyBhIGxhc3QgcmVzb3J0Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJsb2dnaW5nLnByb3BlcnRpZXMiKSwgODE5Mik7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ2dpbmcucHJvcGVydGllcyIpLCA4MTkyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgICAgICAgICByZWFkQ29uZmlndXJhdGlvbkltcGwoaW5wdXQpOwpAQCAtNTIwLDcgKzUyMyw3IEBACiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXNldCgpOwogICAgICAgICBwcm9wcy5sb2FkKGlucyk7Ci0KKyAgICAgICAgCiAgICAgICAgIC8vIHBhcnNlIHByb3BlcnR5ICJjb25maWciIGFuZCBhcHBseSBzZXR0aW5nCiAgICAgICAgIFN0cmluZyBjb25maWdzID0gcHJvcHMuZ2V0UHJvcGVydHkoImNvbmZpZyIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIGlmIChudWxsICE9IGNvbmZpZ3MpIHsKQEAgLTU0MCwyNiArNTQzLDI0IEBACiAgICAgICAgICAgICAgICAgbG9nZ2VyLnNldExldmVsKExldmVsLnBhcnNlKHByb3BlcnR5KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgICAgIGxpc3RlbmVycy5maXJlUHJvcGVydHlDaGFuZ2UobnVsbCwgbnVsbCwgbnVsbCk7Ci0vLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIGxpc3RlbmVycy5maXJlUHJvcGVydHlDaGFuZ2UobnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgfQogCiAKICAgICAvKioKICAgICAgKiBSZS1pbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIGFuZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuCi0gICAgICogPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+CisgICAgICoge0Bjb2RlIElucHV0U3RyZWFtfQogICAgICAqIDxwPgotICAgICAqIEEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gbXVzdCBiZSBmaXJlZC4KKyAgICAgKiBOb3RpY2UgOiBObyB7QGNvZGUgUHJvcGVydHlDaGFuZ2VFdmVudH0gYXJlIGZpcmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5zCi0gICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbQogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSU8gcmVsYXRlZCBwcm9ibGVtcyBoYXBwZW5lZAorICAgICAqICAgICAgICAgICAgIGlmIGFueSBJTyByZWxhdGVkIHByb2JsZW1zIGhhcHBlbmVkLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGV0ZXJtaW5lcyB0aGF0IGNhbGxlciBkb2VzCi0gICAgICogICAgICAgICAgICAgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWFkQ29uZmlndXJhdGlvbihJbnB1dFN0cmVhbSBpbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQWNjZXNzKCk7CkBAIC01NzEsMTIgKzU3MiwxMiBAQAogICAgICAqIDxwPgogICAgICAqIEFsbCBoYW5kbGVycyBhcmUgY2xvc2VkIGFuZCByZW1vdmVkIGZyb20gYW55IG5hbWVkIGxvZ2dlcnMuIEFsbCBsb2dnZXJzJwogICAgICAqIGxldmVsIGlzIHNldCB0byBudWxsLCBleGNlcHQgdGhlIHJvb3QgbG9nZ2VyJ3MgbGV2ZWwgaXMgc2V0IHRvCi0gICAgICogPGNvZGU+TGV2ZWwuSU5GTzwvY29kZT4uCisgICAgICoge0Bjb2RlIExldmVsLklORk99LgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgZG9lcwotICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBwZXJmb3JtIHRoaXMgYWN0aW9uCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIGNoZWNrQWNjZXNzKCk7CkBAIC01OTYsMzkgKzU5NywzNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZCBhIDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+LCB3aGljaCB3aWxsIGJlIGludm9rZWQgd2hlbgorICAgICAqIEFkZCBhIHtAY29kZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSwgd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW4KICAgICAgKiB0aGUgcHJvcGVydGllcyBhcmUgcmVyZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gdG8gYmUgYWRkZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0gdG8gYmUgYWRkZWQuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkZXRlcm1pbmVzIHRoYXQgY2FsbGVyIGRvZXMKLSAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbgorICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLgogICAgICAqLwotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGwpIHsKLS8vICAgICAgICBpZihsID09IG51bGwpewotLy8gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgY2hlY2tBY2Nlc3MoKTsKLS8vICAgICAgICBsaXN0ZW5lcnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLS8vICAgIH0KLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbCkgeworICAgICAgICBpZihsID09IG51bGwpeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tBY2Nlc3MoKTsKKyAgICAgICAgbGlzdGVuZXJzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7CisgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4sIGRvIG5vdGhpbmcgaWYgdGhlIGdpdmVuCisgICAgICogUmVtb3ZlIGEge0Bjb2RlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9LCBkbyBub3RoaW5nIGlmIHRoZSBnaXZlbgogICAgICAqIGxpc3RlbmVyIGlzIG5vdCBmb3VuZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+IHRvIGJlIHJlbW92ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0gdG8gYmUgcmVtb3ZlZC4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgZG9lcwotICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBwZXJmb3JtIHRoaXMgYWN0aW9uCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uCiAgICAgICovCi0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbCkgewotLy8gICAgICAgIGNoZWNrQWNjZXNzKCk7Ci0vLyAgICAgICAgbGlzdGVuZXJzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0vLyAgICB9Ci0vLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGwpIHsKKyAgICAgICAgY2hlY2tBY2Nlc3MoKTsKKyAgICAgICAgbGlzdGVuZXJzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ1JlY29yZC5qYXZhIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ1JlY29yZC5qYXZhCmluZGV4IGUxMzM3OTcuLmI4YTk4ZWYgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dSZWNvcmQuamF2YQorKysgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nUmVjb3JkLmphdmEKQEAgLTI3LDIxICsyNywyMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBBIDxjb2RlPkxvZ1JlY29yZDwvY29kZT4gb2JqZWN0IHJlcHJlc2VudHMgYSBsb2dnaW5nIHJlcXVlc3QuIEl0IGlzIHBhc3NlZAotICogYmV0d2VlbiB0aGUgbG9nZ2luZyBmcmFtZXdvcmsgYW5kIGluZGl2aWR1YWwgbG9nZ2luZyBoYW5kbGVycy4gQ2xpZW50Ci0gKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBtb2RpZnkgYSA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+IG9iamVjdCB0aGF0IGhhcwotICogYmVlbiBwYXNzZWQgaW50byB0aGUgbG9nZ2luZyBmcmFtZXdvcmsuCisgKiBBIHtAY29kZSBMb2dSZWNvcmR9IG9iamVjdCByZXByZXNlbnRzIGEgbG9nZ2luZyByZXF1ZXN0LiBJdCBpcyBwYXNzZWQgYmV0d2VlbgorICogdGhlIGxvZ2dpbmcgZnJhbWV3b3JrIGFuZCBpbmRpdmlkdWFsIGxvZ2dpbmcgaGFuZGxlcnMuIENsaWVudCBhcHBsaWNhdGlvbnMKKyAqIHNob3VsZCBub3QgbW9kaWZ5IGEge0Bjb2RlIExvZ1JlY29yZH0gb2JqZWN0IHRoYXQgaGFzIGJlZW4gcGFzc2VkIGludG8gdGhlCisgKiBsb2dnaW5nIGZyYW1ld29yay4KICAqIDxwPgotICogVGhlIDxjb2RlPkxvZ1JlY29yZDwvY29kZT4gY2xhc3Mgd2lsbCBpbmZlciB0aGUgc291cmNlIG1ldGhvZCBuYW1lIGFuZAotICogc291cmNlIGNsYXNzIG5hbWUgdGhlIGZpcnN0IHRpbWUgdGhleSBhcmUgYWNjZXNzZWQgaWYgdGhlIGNsaWVudCBhcHBsaWNhdGlvbgotICogZGlkbid0IHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5LiBUaGlzIGF1dG9tYXRpYyBpbmZlcmVuY2UgaXMgYmFzZWQgb24gdGhlCi0gKiBhbmFseXNpcyBvZiB0aGUgY2FsbCBzdGFjayBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgcHJlY2lzZS4gQ2xpZW50Ci0gKiBhcHBsaWNhdGlvbnMgc2hvdWxkIGZvcmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGVzZSB0d28gZmllbGRzIGJ5IGNhbGxpbmcKLSAqIDxjb2RlPmdldFNvdXJjZUNsYXNzTmFtZTwvY29kZT4gb3IgPGNvZGU+Z2V0U291cmNlTWV0aG9kTmFtZTwvY29kZT4gaWYKLSAqIHRoZXkgZXhwZWN0IHRvIHVzZSB0aGVtIGFmdGVyIHBhc3NpbmcgdGhlIDxjb2RlPkxvZ1JlY29yZDwvY29kZT4gb2JqZWN0IHRvCi0gKiBhbm90aGVyIHRocmVhZCBvciB0cmFuc21pdHRpbmcgaXQgb3ZlciBSTUkuCisgKiBUaGUge0Bjb2RlIExvZ1JlY29yZH0gY2xhc3Mgd2lsbCBpbmZlciB0aGUgc291cmNlIG1ldGhvZCBuYW1lIGFuZCBzb3VyY2UKKyAqIGNsYXNzIG5hbWUgdGhlIGZpcnN0IHRpbWUgdGhleSBhcmUgYWNjZXNzZWQgaWYgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBkaWRuJ3QKKyAqIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5LiBUaGlzIGF1dG9tYXRpYyBpbmZlcmVuY2UgaXMgYmFzZWQgb24gdGhlIGFuYWx5c2lzIG9mCisgKiB0aGUgY2FsbCBzdGFjayBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgcHJlY2lzZS4gQ2xpZW50IGFwcGxpY2F0aW9ucworICogc2hvdWxkIGZvcmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGVzZSB0d28gZmllbGRzIGJ5IGNhbGxpbmcKKyAqIHtAY29kZSBnZXRTb3VyY2VDbGFzc05hbWV9IG9yIHtAY29kZSBnZXRTb3VyY2VNZXRob2ROYW1lfSBpZiB0aGV5IGV4cGVjdCB0bworICogdXNlIHRoZW0gYWZ0ZXIgcGFzc2luZyB0aGUge0Bjb2RlIExvZ1JlY29yZH0gb2JqZWN0IHRvIGFub3RoZXIgdGhyZWFkIG9yCisgKiB0cmFuc21pdHRpbmcgaXQgb3ZlciBSTUkuCiAgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTG9nUmVjb3JkIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIApAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgcHJpdmF0ZSBsb25nIG1pbGxpczsKIAogICAgIC8qKgotICAgICAqIFRoZSBhc3NvY2lhdGVkIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0IGlmIGFueS4KKyAgICAgKiBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgVGhyb3dhYmxlfSBvYmplY3QgaWYgYW55LgogICAgICAqIAogICAgICAqIEBzZXJpYWwKICAgICAgKi8KQEAgLTE0MiwxNiArMTQzLDE5IEBACiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBzb3VyY2VJbml0ZWQ7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+TG9nUmVjb3JkPC9jb2RlPiBvYmplY3QgdXNpbmcgdGhlIHN1cHBsaWVkIHRoZQotICAgICAqIGxvZ2dpbmcgbGV2ZWwgYW5kIG1lc3NhZ2UuIFRoZSBtaWxsaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRoZSBjdXJyZW50Ci0gICAgICogdGltZS4gVGhlIHNlcXVlbmNlIHByb3BlcnR5IGlzIHNldCB0byBhIG5ldyB1bmlxdWUgdmFsdWUsIGFsbG9jYXRlZCBpbgotICAgICAqIGluY3JlYXNpbmcgb3JkZXIgd2l0aGluIGEgVk0uIFRoZSB0aHJlYWQgSUQgaXMgc2V0IHRvIGEgdW5pcXVlIHZhbHVlIGZvcgotICAgICAqIHRoZSBjdXJyZW50IHRocmVhZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIExvZ1JlY29yZH0gb2JqZWN0IHVzaW5nIHRoZSBzdXBwbGllZCB0aGUgbG9nZ2luZworICAgICAqIGxldmVsIGFuZCBtZXNzYWdlLiBUaGUgbWlsbGlzIHByb3BlcnR5IGlzIHNldCB0byB0aGUgY3VycmVudCB0aW1lLiBUaGUKKyAgICAgKiBzZXF1ZW5jZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBuZXcgdW5pcXVlIHZhbHVlLCBhbGxvY2F0ZWQgaW4gaW5jcmVhc2luZworICAgICAqIG9yZGVyIHdpdGhpbiB0aGUgdmlydHVhbCBtYWNoaW5lLiBUaGUgdGhyZWFkIElEIGlzIHNldCB0byBhIHVuaXF1ZSB2YWx1ZQorICAgICAqIGZvciB0aGUgY3VycmVudCB0aHJlYWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBzZXQgdG8ge0Bjb2RlIG51bGx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZXZlbAotICAgICAqICAgICAgICAgICAgdGhlIGxvZ2dpbmcgbGV2ZWwgd2hpY2ggbWF5IG5vdCBiZSBudWxsCisgICAgICogICAgICAgICAgICB0aGUgbG9nZ2luZyBsZXZlbCwgbWF5IG5vdCBiZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgdGhlIHJhdyBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgcmF3IG1lc3NhZ2UuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsZXZlbH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMb2dSZWNvcmQoTGV2ZWwgbGV2ZWwsIFN0cmluZyBtc2cpIHsKICAgICAgICAgaWYgKG51bGwgPT0gbGV2ZWwpIHsKQEAgLTE4NSw3ICsxODksOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxvZ2dpbmcgbGV2ZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9nZ2luZyBsZXZlbAorICAgICAqIEByZXR1cm4gdGhlIGxvZ2dpbmcgbGV2ZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExldmVsIGdldExldmVsKCkgewogICAgICAgICByZXR1cm4gbGV2ZWw7CkBAIC0xOTUsNyArMjAwLDEwIEBACiAgICAgICogU2V0cyB0aGUgbG9nZ2luZyBsZXZlbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCB0byBzZXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsZXZlbH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExldmVsKExldmVsIGxldmVsKSB7CiAgICAgICAgIGlmIChudWxsID09IGxldmVsKSB7CkBAIC0yMDgsNyArMjE2LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBsb2dnZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9nZ2VyIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2dnZXIgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldExvZ2dlck5hbWUoKSB7CiAgICAgICAgIHJldHVybiBsb2dnZXJOYW1lOwpAQCAtMjE4LDcgKzIyNyw4IEBACiAgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgbG9nZ2VyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2dnZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbG9nZ2VyIG5hbWUgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgbG9nZ2VyIG5hbWUgdG8gc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvZ2dlck5hbWUoU3RyaW5nIGxvZ2dlck5hbWUpIHsKICAgICAgICAgdGhpcy5sb2dnZXJOYW1lID0gbG9nZ2VyTmFtZTsKQEAgLTIyNywzNiArMjM3LDQyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcmF3IG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmF3IG1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSByYXcgbWVzc2FnZSwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJhdyBtZXNzYWdlLgorICAgICAqIFNldHMgdGhlIHJhdyBtZXNzYWdlLiBXaGVuIHRoaXMgcmVjb3JkIGlzIGZvcm1hdHRlZCBieSBhIGxvZ2dlciB0aGF0IGhhcworICAgICAqIGEgbG9jYWxpemF0aW9uIHJlc291cmNlIGJ1bmRsZSB0aGF0IGNvbnRhaW5zIGFuIGVudHJ5IGZvciB7QGNvZGUgbWVzc2FnZX0sCisgICAgICogdGhlbiB0aGUgcmF3IG1lc3NhZ2UgaXMgcmVwbGFjZWQgd2l0aCBpdHMgbG9jYWxpemVkIHZlcnNpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSByYXcgbWVzc2FnZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSByYXcgbWVzc2FnZSB0byBzZXQsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwLgorICAgICAqIEdldHMgdGhlIHRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lIHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MAorICAgICAqIEByZXR1cm4gdGhlIHRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRNaWxsaXMoKSB7CiAgICAgICAgIHJldHVybiBtaWxsaXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZSB0aGF0IHRoZSBldmVudCBvY2N1cnJlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIDE5NzAuCisgICAgICogU2V0cyB0aGUgdGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtaWxsaXMKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNaWxsaXMobG9uZyBtaWxsaXMpIHsKICAgICAgICAgdGhpcy5taWxsaXMgPSBtaWxsaXM7CkBAIC0yNjUsNyArMjgxLDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHBhcmFtZXRlcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJzIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBhcmUgbm8KKyAgICAgKiAgICAgICAgIHBhcmFtZXRlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdFtdIGdldFBhcmFtZXRlcnMoKSB7CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwpAQCAtMjc1LDcgKzI5Myw4IEBACiAgICAgICogU2V0cyB0aGUgcGFyYW1ldGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcGFyYW1ldGVycyB0byBzZXQsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhPYmplY3RbXSBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CkBAIC0yODUsMTggKzMwNCwyMCBAQAogICAgICAqIEdldHMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIHRvIGxvY2FsaXplIHRoZSByYXcgbWVzc2FnZSBkdXJpbmcKICAgICAgKiBmb3JtYXR0aW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UgYnVuZGxlCisgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZSBidW5kbGUsIHtAY29kZSBudWxsfSBpZiBub25lIGlzCisgICAgICogICAgICAgICBhdmFpbGFibGUgb3IgdGhlIG1lc3NhZ2UgaXMgbm90IGxvY2FsaXphYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKICAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIHRvIGxvY2FsaXplIHRoZSByYXcgbWVzc2FnZSBkdXJpbmcKLSAgICAgKiBmb3JtYXR0aW5nLgorICAgICAqIFNldHMgdGhlIHJlc291cmNlIGJ1bmRsZS4gCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0gICAgICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUpIHsKICAgICAgICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwpAQCAtMzA1LDcgKzMyNiw5IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSwge0Bjb2RlIG51bGx9IGlmIG5vbmUgaXMKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZSBvciB0aGUgbWVzc2FnZSBpcyBub3QgbG9jYWxpemFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiByZXNvdXJjZUJ1bmRsZU5hbWU7CkBAIC0zMTUsNyArMzM4LDggQEAKICAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMCAgICAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlTmFtZShTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lKSB7CiAgICAgICAgIHRoaXMucmVzb3VyY2VCdW5kbGVOYW1lID0gcmVzb3VyY2VCdW5kbGVOYW1lOwpAQCAtMzI0LDI4ICszNDgsMzIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzZXF1ZW5jZSBudW1iZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2VxdWVuY2UgbnVtYmVyCisgICAgICogQHJldHVybiB0aGUgc2VxdWVuY2UgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldFNlcXVlbmNlTnVtYmVyKCkgewogICAgICAgICByZXR1cm4gc2VxdWVuY2VOdW1iZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2VxdWVuY2UgbnVtYmVyLiBJdCBpcyB1c3VhbGx5IHVubmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBtZXRob2QKKyAgICAgKiBTZXRzIHRoZSBzZXF1ZW5jZSBudW1iZXIuIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgbWV0aG9kCiAgICAgICogdG8gY2hhbmdlIHRoZSBzZXF1ZW5jZSBudW1iZXIgYmVjYXVzZSB0aGUgbnVtYmVyIGlzIGFsbG9jYXRlZCB3aGVuIHRoaXMKICAgICAgKiBpbnN0YW5jZSBpcyBjb25zdHJ1Y3RlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2VxdWVuY2VOdW1iZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZXF1ZW5jZSBudW1iZXIgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZU51bWJlcihsb25nIHNlcXVlbmNlTnVtYmVyKSB7CiAgICAgICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgPSBzZXF1ZW5jZU51bWJlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGlzc3VlZCB0aGUgbG9nZ2luZyBjYWxsLgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaXMgdGhlIHNvdXJjZSBvZiB0aGlzIGxvZyByZWNvcmQuIFRoaXMKKyAgICAgKiBpbmZvcm1hdGlvbiBjYW4gYmUgY2hhbmdlZCwgbWF5IGJlIHtAY29kZSBudWxsfSBhbmQgaXMgdW50cnVzdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaXNzdWVkIHRoZSBsb2dnaW5nIGNhbGwKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgY2xhc3Mgb2YgdGhpcyBsb2cgcmVjb3JkIChwb3NzaWJsaXR5IHtAY29kZSBudWxsfSkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUNsYXNzTmFtZSgpIHsKICAgICAgICAgaW5pdFNvdXJjZSgpOwpAQCAtMzc4LDEwICs0MDYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGlzc3VlZCB0aGUgbG9nZ2luZyBjYWxsLgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaXMgdGhlIHNvdXJjZSBvZiB0aGlzIGxvZyByZWNvcmQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNvdXJjZUNsYXNzTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaXNzdWVkIHRoZSBsb2dnaW5nIGNhbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgY2xhc3Mgb2YgdGhpcyBsb2cgcmVjb3JkLCBtYXkgYmUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VDbGFzc05hbWUoU3RyaW5nIHNvdXJjZUNsYXNzTmFtZSkgewogICAgICAgICBzb3VyY2VJbml0ZWQgPSB0cnVlOwpAQCAtMzg5LDkgKzQxOSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzc3VlZCB0aGUgbG9nZ2luZyBjYWxsLgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHRoZSBzb3VyY2Ugb2YgdGhpcyBsb2cgcmVjb3JkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzc3VlZCB0aGUgbG9nZ2luZyBjYWxsCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIG1ldGhvZCBvZiB0aGlzIGxvZyByZWNvcmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VNZXRob2ROYW1lKCkgewogICAgICAgICBpbml0U291cmNlKCk7CkBAIC0zOTksMTAgKzQzMCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzc3VlZCB0aGUgbG9nZ2luZyBjYWxsLgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHRoZSBzb3VyY2Ugb2YgdGhpcyBsb2cgcmVjb3JkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2VNZXRob2ROYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRoYXQgaXNzdWVkIHRoZSBsb2dnaW5nIGNhbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgbWV0aG9kIG9mIHRoaXMgbG9nIHJlY29yZCwgbWF5IGJlCisgICAgICogICAgICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U291cmNlTWV0aG9kTmFtZShTdHJpbmcgc291cmNlTWV0aG9kTmFtZSkgewogICAgICAgICBzb3VyY2VJbml0ZWQgPSB0cnVlOwpAQCAtNDEwLDQwICs0NDMsNDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJRCBvZiB0aGUgdGhyZWFkIG9yaWdpbmF0aW5nIHRoZSBtZXNzYWdlLgorICAgICAqIEdldHMgYSB1bmlxdWUgSUQgb2YgdGhlIHRocmVhZCBvcmlnaW5hdGluZyB0aGUgbG9nIHJlY29yZC4gRXZlcnkgdGhyZWFkCisgICAgICogYmVjb21lcyBhIGRpZmZlcmVudCBJRC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RpY2UgOiB0aGUgSUQgZG9lc24ndCBuZWNlc3NhcnkgbWFwIHRoZSBPUyB0aHJlYWQgSUQKKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgSUQgb2YgdGhlIHRocmVhZCBvcmlnaW5hdGluZyB0aGUgbWVzc2FnZQorICAgICAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSB0aHJlYWQgb3JpZ2luYXRpbmcgdGhpcyBsb2cgcmVjb3JkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGhyZWFkSUQoKSB7CiAgICAgICAgIHJldHVybiB0aHJlYWRJRDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBJRCBvZiB0aGUgdGhyZWFkIG9yaWdpbmF0aW5nIHRoZSBtZXNzYWdlLgorICAgICAqIFNldHMgdGhlIElEIG9mIHRoZSB0aHJlYWQgb3JpZ2luYXRpbmcgdGhpcyBsb2cgcmVjb3JkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aHJlYWRJRAotICAgICAqICAgICAgICAgICAgdGhlIElEIG9mIHRoZSB0aHJlYWQgb3JpZ2luYXRpbmcgdGhlIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgSUQgb2YgdGhlIHRocmVhZCBvcmlnaW5hdGluZyB0aGlzIGxvZyByZWNvcmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGhyZWFkSUQoaW50IHRocmVhZElEKSB7CiAgICAgICAgIHRoaXMudGhyZWFkSUQgPSB0aHJlYWRJRDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2cgcmVjb3JkLgorICAgICAqIEdldHMgdGhlIHtAY29kZSBUaHJvd2FibGV9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2cgcmVjb3JkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvZwotICAgICAqICAgICAgICAgcmVjb3JkCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFRocm93YWJsZX0gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvZyByZWNvcmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd24oKSB7CiAgICAgICAgIHJldHVybiB0aHJvd247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9nIHJlY29yZC4KKyAgICAgKiBTZXRzIHRoZSB7QGNvZGUgVGhyb3dhYmxlfSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9nIHJlY29yZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhyb3duCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9nCi0gICAgICogICAgICAgICAgICByZWNvcmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcge0Bjb2RlIFRocm93YWJsZX0gb2JqZWN0IHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgbG9nCisgICAgICogICAgICAgICAgICByZWNvcmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGhyb3duKFRocm93YWJsZSB0aHJvd24pIHsKICAgICAgICAgdGhpcy50aHJvd24gPSB0aHJvd247CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyLmphdmEKaW5kZXggZmJlMzJlZC4uY2Q4OGNhMCAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlci5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXIuamF2YQpAQCAtMzMsMjIgKzMzLDIyIEBACiAgKiBldGMuIFRoZXkgdXNlIHZhcmlvdXMgaGFuZGxlcnMgdG8gYWN0dWFsbHkgZG8gdGhlIG91dHB1dC1kZXBlbmRlbnQKICAqIG9wZXJhdGlvbnMuCiAgKiA8cD4KLSAqIENsaWVudCBhcHBsaWNhdGlvbnMgY2FuIGdldCBuYW1lZCBsb2dnZXJzIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZHMKLSAqIDxjb2RlPmdldExvZ2dlcjwvY29kZT4uIFRoZXkgY2FuIGFsc28gZ2V0IGFub255bW91cyBsb2dnZXJzIGJ5IGNhbGxpbmcgdGhlCi0gKiBtZXRob2RzIDxjb2RlPmdldEFub255bW91c0xvZ2dlcjwvY29kZT4uIE5hbWVkIGxvZ2dlcnMgYXJlIG9yZ2FuaXplZCBpbiBhCisgKiBDbGllbnQgYXBwbGljYXRpb25zIGNhbiBnZXQgbmFtZWQgbG9nZ2VycyBieSBjYWxsaW5nIHRoZSB7QGNvZGUgZ2V0TG9nZ2VyfQorICogbWV0aG9kcy4gVGhleSBjYW4gYWxzbyBnZXQgYW5vbnltb3VzIGxvZ2dlcnMgYnkgY2FsbGluZyB0aGUKKyAqIHtAY29kZSBnZXRBbm9ueW1vdXNMb2dnZXJ9IG1ldGhvZHMuIE5hbWVkIGxvZ2dlcnMgYXJlIG9yZ2FuaXplZCBpbiBhCiAgKiBuYW1lc3BhY2UgaGllcmFyY2h5IG1hbmFnZWQgYnkgYSBsb2cgbWFuYWdlci4gVGhlIG5hbWluZyBjb252ZW50aW9uIGlzCi0gKiB1c3VhbGx5IHRoZSBzYW1lIGFzIGphdmEgcGFja2FnZSdzIG5hbWluZyBjb252ZW50aW9uLCBpLmUuLCB1c2luZworICogdXN1YWxseSB0aGUgc2FtZSBhcyBqYXZhIHBhY2thZ2UncyBuYW1pbmcgY29udmVudGlvbiwgdGhhdCBpcyB1c2luZwogICogZG90LXNlcGFyYXRlZCBzdHJpbmdzLiBBbm9ueW1vdXMgbG9nZ2VycyBkbyBub3QgYmVsb25nIHRvIGFueSBuYW1lc3BhY2UuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIExvZ2dlcnMgImluaGVyaXQiIGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gdGhlaXIgcGFyZW50IGlmIGl0cyBvd24gbGV2ZWwgaXMgc2V0Ci0gKiB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBpcyBhbHNvIHRydWUgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUuIFRoZQotICogbG9nZ2VyJ3MgcmVzb3VyY2UgYnVuZGxlIGlzIHVzZWQgdG8gbG9jYWxpemUgdGhlIGxvZyBtZXNzYWdlcyBpZiBubyByZXNvdXJjZQotICogYnVuZGxlIG5hbWUgaXMgZ2l2ZW4gd2hlbiBhIGxvZyBtZXRob2QgaXMgY2FsbGVkLiBJZgotICogPGNvZGU+Z2V0VXNlUGFyZW50SGFuZGxlcnM8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LCBsb2dnZXJzIGFsc28KLSAqIGluaGVyaXQgdGhlaXIgcGFyZW50J3MgaGFuZGxlcnMuIEhlcmUgImluaGVyaXQiIG9ubHkgbWVhbnMgdGhlICJiZWhhdmlvcnMiCi0gKiBhcmUgaW5oZXJpdGVkLiBUaGUgaW50ZXJuYWwgZmllbGRzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSwgZm9yIGV4YW1wbGUsCi0gKiA8Y29kZT5nZXRMZXZlbCgpPC9jb2RlPiBzdGlsbCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICogTG9nZ2VycyAiaW5oZXJpdCIgbG9nIGxldmVsIHNldHRpbmcgZnJvbSB0aGVpciBwYXJlbnQgaWYgdGhlaXIgb3duIGxldmVsIGlzCisgKiBzZXQgdG8ge0Bjb2RlIG51bGx9LiBUaGlzIGlzIGFsc28gdHJ1ZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZS4gVGhlIGxvZ2dlcidzCisgKiByZXNvdXJjZSBidW5kbGUgaXMgdXNlZCB0byBsb2NhbGl6ZSB0aGUgbG9nIG1lc3NhZ2VzIGlmIG5vIHJlc291cmNlIGJ1bmRsZQorICogbmFtZSBpcyBnaXZlbiB3aGVuIGEgbG9nIG1ldGhvZCBpcyBjYWxsZWQuIElmIHtAY29kZSBnZXRVc2VQYXJlbnRIYW5kbGVycygpfQorICogcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGxvZ2dlcnMgYWxzbyBpbmhlcml0IHRoZWlyIHBhcmVudCdzIGhhbmRsZXJzLiBJbiB0aGlzCisgKiBjb250ZXh0LCAiaW5oZXJpdCIgb25seSBtZWFucyB0aGF0ICJiZWhhdmlvciIgaXMgaW5oZXJpdGVkLiBUaGUgaW50ZXJuYWwKKyAqIGZpZWxkIHZhbHVlcyB3aWxsIG5vdCBjaGFuZ2UsIGZvciBleGFtcGxlLCB7QGNvZGUgZ2V0TGV2ZWwoKX0gc3RpbGwgcmV0dXJucworICoge0Bjb2RlIG51bGx9LgogICogPC9wPgogICogPHA+CiAgKiBXaGVuIGxvYWRpbmcgYSBnaXZlbiByZXNvdXJjZSBidW5kbGUsIHRoZSBsb2dnZXIgZmlyc3QgdHJpZXMgdG8gdXNlIHRoZQpAQCAtNTksMjMgKzU5LDI2IEBACiAgKiA8cD4KICAqIFNvbWUgbG9nIG1ldGhvZHMgYWNjZXB0IGxvZyByZXF1ZXN0cyB0aGF0IGRvIG5vdCBzcGVjaWZ5IHRoZSBzb3VyY2UgY2xhc3MgYW5kCiAgKiBzb3VyY2UgbWV0aG9kLiBJbiB0aGVzZSBjYXNlcywgdGhlIGxvZ2dpbmcgZnJhbWV3b3JrIHdpbGwgYXV0b21hdGljYWxseSBpbmZlcgotICogdGhlIGNhbGxpbmcgY2xhc3MgYW5kIG1ldGhvZCwgYnV0IG5vdCBndWFyYW50ZWVkIHRvIGJlIGFjY3VyYXRlLgorICogdGhlIGNhbGxpbmcgY2xhc3MgYW5kIG1ldGhvZCwgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgYWNjdXJhdGUuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIE9uY2UgYSA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+IG9iamVjdCBoYXMgYmVlbiBwYXNzZWQgaW50byB0aGUgbG9nZ2luZwotICogZnJhbWV3b3JrLCBpdCBpcyBvd25lZCBieSB0aGUgbG9nZ2luZyBmcmFtZXdvcmsgYW5kIHRoZSBjbGllbnQgYXBwbGljYXRpb25zCi0gKiBzaG91bGQgbm90IHVzZSBpdCBhbnkgbG9uZ2VyLgorICogT25jZSBhIHtAY29kZSBMb2dSZWNvcmR9IG9iamVjdCBoYXMgYmVlbiBwYXNzZWQgaW50byB0aGUgbG9nZ2luZyBmcmFtZXdvcmssCisgKiBpdCBpcyBvd25lZCBieSB0aGUgbG9nZ2luZyBmcmFtZXdvcmsgYW5kIHRoZSBjbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBub3QKKyAqIHVzZSBpdCBhbnkgbG9uZ2VyLgogICogPC9wPgogICogPHA+CiAgKiBBbGwgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGFyZSB0aHJlYWQtc2FmZS4KICAqIDwvcD4KICAqIAogICogQHNlZSBMb2dNYW5hZ2VyCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIExvZ2dlciB7CiAKICAgICAvKioKICAgICAgKiBUaGUgZ2xvYmFsIGxvZ2dlciBpcyBwcm92aWRlZCBhcyBjb252ZW5pZW5jZSBmb3IgY2FzdWFsIHVzZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIExvZ2dlciBnbG9iYWwgPSBuZXcgTG9nZ2VyKCJnbG9iYWwiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAogCkBAIC0xMTYsNyArMTE5LDkgQEAKICAgICAKICAgICBwcml2YXRlIExvZ01hbmFnZXIgbWFuYWdlcjsKIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBoYW5kbGVySW5pdGVkOworICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogCiAgICAgLyoKQEAgLTEyNiwxNiArMTMxLDIxIEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+TG9nZ2VyPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgc3VwcGxpZWQgbmFtZSBhbmQKLSAgICAgKiByZXNvdXJjZSBidW5kbGUgbmFtZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIExvZ2dlcn0gb2JqZWN0IHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIHJlc291cmNlCisgICAgICogYnVuZGxlIG5hbWU7IHtAY29kZSBub3RpZml5UGFyZW50SGFuZGxlcnN9IGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0uCisgICAgICogPHA+CisgICAgICogTm90aWNlIDogTG9nZ2VycyB1c2UgYSBuYW1pbmcgaGllcmFyY2h5LiBUaHVzICJ6LngueSIgaXMgYSBjaGlsZCBvZiAiei54Ii4gCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIGxvZ2dlciwgbWF5IGJlIG51bGwgZm9yIGFub255bW91cyBsb2dnZXJzCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIGxvZ2dlciwgbWF5IGJlIHtAY29kZSBudWxsfSBmb3IgYW5vbnltb3VzCisgICAgICogICAgICAgICAgICBsb2dnZXJzLgogICAgICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZU5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCB0byBsb2NhbGl6ZSBsb2dnaW5nCi0gICAgICogICAgICAgICAgICBtZXNzYWdlcywgbWF5IGJlIG51bGwKKyAgICAgKiAgICAgICAgICAgIG1lc3NhZ2VzLCBtYXkgYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGUgY2FuIG5vdCBiZSBsb2FkZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGUgY2FuIG5vdCBiZSBsb2FkZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIExvZ2dlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkgewogICAgICAgICAvLyB0cnkgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGJ1bmRsZSBmaXJzdApAQCAtMTk5LDEwICsyMDksMTAgQEAKICAgICAgKiBMb2FkIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgYnVuZGxlLCB1c2UgcHJpdmlsZWdlZCBjb2RlLgogICAgICAqIAogICAgICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gbG9hZCwgY2Fubm90IGJlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gbG9hZCwgY2Fubm90IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAcmV0dXJuIHRoZSBsb2FkZWQgcmVzb3VyY2UgYnVuZGxlLgogICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGUgY2FuIG5vdCBiZSBsb2FkZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGUgY2FuIG5vdCBiZSBsb2FkZWQuCiAgICAgICovCiAgICAgc3RhdGljIFJlc291cmNlQnVuZGxlIGxvYWRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lKSB7CiAgICAgICAgIC8vIHRyeSBjb250ZXh0IGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSByZXNvdXJjZQpAQCAtMjcwLDE0ICsyODAsMTQgQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFub255bW91cyBsb2dnZXIgdG8gdXNlIGludGVybmFsbHkgaW4gYSB0aHJlYWQuIEFub255bW91cyBsb2dnZXJzCiAgICAgICogYXJlIG5vdCByZWdpc3RlcmVkIGluIHRoZSBsb2cgbWFuYWdlcidzIG5hbWVzcGFjZS4gTm8gc2VjdXJpdHkgY2hlY2tzCi0gICAgICogd2lsbCBiZSBwZXJmb3JtZWQgd2hlbiB1cGRhdGluZyBhbiBhbm9ueW1vdXMgbG9nZ2VyJ3MgY29udHJvbCBzZXR0aW5ncwotICAgICAqIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBpbiBhcHBsZXRzLgorICAgICAqIHdpbGwgYmUgcGVyZm9ybWVkIHdoZW4gdXBkYXRpbmcgYW4gYW5vbnltb3VzIGxvZ2dlcidzIGNvbnRyb2wgc2V0dGluZ3MuCiAgICAgICogPHA+Ci0gICAgICogQW5vbnltb3VzIGxvZ2dlcnMnIHBhcmVudCBpcyBzZXQgdG8gYmUgdGhlIHJvb3QgbG9nZ2VyLiBUaGlzIGVuYWJsZXMKLSAgICAgKiB0aGVtIHRvIGluaGVyaXQgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGFuZCBoYW5kbGVycyBmcm9tIHRoZSByb290IGxvZ2dlci4KKyAgICAgKiBUaGUgYW5vbnltb3VzIGxvZ2dlcnMnIHBhcmVudCBpcyBzZXQgdG8gYmUgdGhlIHJvb3QgbG9nZ2VyLiBUaGlzIHdheSBpdAorICAgICAqIGluaGVyaXRzIHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgYW5kIGhhbmRsZXJzIGZyb20gdGhlIHJvb3QgbG9nZ2VyLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGFub255bW91cyBsb2dnZXIKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGFub255bW91cyBsb2dnZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0QW5vbnltb3VzTG9nZ2VyKCkgewogICAgICAgICByZXR1cm4gZ2V0QW5vbnltb3VzTG9nZ2VyKG51bGwpOwpAQCAtMjg2LDE4ICsyOTYsMTggQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFub255bW91cyBsb2dnZXIgdG8gdXNlIGludGVybmFsbHkgaW4gYSB0aHJlYWQuIEFub255bW91cyBsb2dnZXJzCiAgICAgICogYXJlIG5vdCByZWdpc3RlcmVkIGluIHRoZSBsb2cgbWFuYWdlcidzIG5hbWVzcGFjZS4gTm8gc2VjdXJpdHkgY2hlY2tzCi0gICAgICogd2lsbCBiZSBwZXJmb3JtZWQgd2hlbiB1cGRhdGluZyBhbiBhbm9ueW1vdXMgbG9nZ2VyJ3MgY29udHJvbCBzZXR0aW5ncwotICAgICAqIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBpbiBhcHBsZXRzLgorICAgICAqIHdpbGwgYmUgcGVyZm9ybWVkIHdoZW4gdXBkYXRpbmcgYW4gYW5vbnltb3VzIGxvZ2dlcidzIGNvbnRyb2wgc2V0dGluZ3MuCiAgICAgICogPHA+Ci0gICAgICogQW5vbnltb3VzIGxvZ2dlcnMnIHBhcmVudCBpcyBzZXQgdG8gYmUgdGhlIHJvb3QgbG9nZ2VyLiBUaGlzIGVuYWJsZXMKLSAgICAgKiB0aGVtIHRvIGluaGVyaXQgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGFuZCBoYW5kbGVycyBmcm9tIHRoZSByb290IGxvZ2dlci4KKyAgICAgKiBUaGUgYW5vbnltb3VzIGxvZ2dlcnMnIHBhcmVudCBpcyBzZXQgdG8gYmUgdGhlIHJvb3QgbG9nZ2VyLiBUaGlzIHdheSBpdAorICAgICAqIGluaGVyaXRzIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBhbmQgaGFuZGxlcnMgZnJvbSB0aGUgcm9vdCBsb2dnZXIuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCB0byBsb2NhbGl6ZSBsb2cgbWVzc2FnZXMKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGFub255bW91cyBsb2dnZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCB0byBsb2NhbGl6ZSBsb2cgbWVzc2FnZXMuCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBhbm9ueW1vdXMgbG9nZ2VyLgogICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGUgY2FuIG5vdCBiZSBsb2FkZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGUgY2FuIG5vdCBiZSBsb2FkZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0QW5vbnltb3VzTG9nZ2VyKFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpIHsKICAgICAgICAgZmluYWwgTG9nZ2VyIGwgPSBuZXcgTG9nZ2VyKG51bGwsIHJlc291cmNlQnVuZGxlTmFtZSk7CkBAIC0zNjUsMTUgKzM3NSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBuYW1lZCBsb2dnZXIuIFRoZSByZXR1cm5lZCBsb2dnZXIgbWF5IGFscmVhZHkgZXhpc3QsIG9yIG1heSBiZQotICAgICAqIG5ld2x5IGNyZWF0ZWQuIElmIHRoZSBsYXR0ZXIsIGl0cyBsZXZlbCB3aWxsIGJlIHNldCB0byB0aGUgY29uZmlndXJlZAotICAgICAqIGxldmVsIGFjY29yZGluZyB0byB0aGUgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4ncyBwcm9wZXJ0aWVzIGlmIGFueS4KKyAgICAgKiBHZXRzIGEgbmFtZWQgbG9nZ2VyLiBUaGUgcmV0dXJuZWQgbG9nZ2VyIG1heSBhbHJlYWR5IGV4aXN0IG9yIG1heSBiZQorICAgICAqIG5ld2x5IGNyZWF0ZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgaXRzIGxldmVsIHdpbGwgYmUgc2V0IHRvIHRoZQorICAgICAqIGNvbmZpZ3VyZWQgbGV2ZWwgYWNjb3JkaW5nIHRvIHRoZSB7QGNvZGUgTG9nTWFuYWdlcn0ncyBwcm9wZXJ0aWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbG9nZ2VyIHRvIGdldCwgY2Fubm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmFtZWQgbG9nZ2VyCi0gICAgICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGJ1bmRsZSBjYW4gbm90IGJlIGxvYWRlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgdG8gZ2V0LCBjYW5ub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gYSBuYW1lZCBsb2dnZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0TG9nZ2VyKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBnZXRMb2dnZXJXaXRoUmVzKG5hbWUsIG51bGwsIGZhbHNlKTsKQEAgLTM4NCwyNCArMzkzLDMyIEBACiAgICAgICogcmVzb3VyY2UgYnVuZGxlIHdpbGwgYmUgdXNlZCB0byBsb2NhbGl6ZSBsb2dnaW5nIG1lc3NhZ2VzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbG9nZ2VyIHRvIGdldCwgY2Fubm90IGJlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgdG8gZ2V0LCBjYW5ub3QgYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUsIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiBhIG5hbWVkIGxvZ2dlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsb2dnZXIgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0gaXMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAgKiAgICAgICAgICAgICByZXNvdXJjZSBidW5kbGUgYW5kIGl0cyBuYW1lIGlzIG5vdCBlcXVhbCB0bworICAgICAqICAgICAgICAgICAgIHtAY29kZSByZXNvdXJjZUJ1bmRsZU5hbWV9LgorICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHJldHVybiBhIG5hbWVkIGxvZ2dlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRMb2dnZXIoU3RyaW5nIG5hbWUsIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpIHsKICAgICAgICAgcmV0dXJuIGdldExvZ2dlcldpdGhSZXMobmFtZSwgcmVzb3VyY2VCdW5kbGVOYW1lLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGEgaGFuZGxlciB0byB0aGlzIGxvZ2dlci4gVGhlIGhhbmRsZXIgd2lsbCBiZSBmZWQgd2l0aCBsb2cgcmVjb3JkcwotICAgICAqIHJlY2VpdmVkIGJ5IHRoaXMgbG9nZ2VyLgorICAgICAqIEFkZHMgYSBoYW5kbGVyIHRvIHRoaXMgbG9nZ2VyLiBUaGUge0Bjb2RlIG5hbWV9IHdpbGwgYmUgZmVkIHdpdGggbG9nCisgICAgICogcmVjb3JkcyByZWNlaXZlZCBieSB0aGlzIGxvZ2dlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaGFuZGxlcgotICAgICAqICAgICAgICAgICAgdGhlIGhhbmRsZXIgb2JqZWN0IHRvIGFkZCwgY2Fubm90IGJlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBoYW5kbGVyIG9iamVjdCB0byBhZGQsIGNhbm5vdCBiZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAogICAgICAqICAgICAgICAgICAgIGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyIGhhbmRsZXIpIHsKICAgICAgICAgaWYgKG51bGwgPT0gaGFuZGxlcikgewpAQCAtNDM0LDcgKzQ1MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAqLyAKICAgICAgICAgICAgICAgICAgICAgTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCi0KICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTAsOCArNDY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihoYW5kbGVyU3RyLCAiICIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGVyTmFtZSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQ6IGRlYWwgd2l0aCBub24tZXhpc3RpbmcgaGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggbm9uLWV4aXN0aW5nIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIExvZ01hbmFnZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZUJ5Q2xhc3MoaGFuZGxlck5hbWUpOwpAQCAtNDY1LDcgKzQ4MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBoYW5kbGVySW5pdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CkBAIC00NzYsNyArNDkxLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFsbCB0aGUgaGFuZGxlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9nZ2VyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIHRoZSBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2dnZXIKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgaGFuZGxlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9nZ2VyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBIYW5kbGVyW10gZ2V0SGFuZGxlcnMoKSB7CiAgICAgICAgIGluaXRIYW5kbGVyKCk7CkBAIC00ODYsMTQgKzUwMiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBoYW5kbGVyIGZvciB0aGlzIGxvZ2dlci4gSWYgdGhlIHNwZWNpZmllZCBoYW5kbGVyIGRvZXMgbm90Ci0gICAgICogZXhpc3QsIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCisgICAgICogUmVtb3ZlcyBhIGhhbmRsZXIgZnJvbSB0aGlzIGxvZ2dlci4gSWYgdGhlIHNwZWNpZmllZCBoYW5kbGVyIGRvZXMgbm90CisgICAgICogZXhpc3QgdGhlbiB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBoYW5kbGVyCi0gICAgICogICAgICAgICAgICB0aGUgaGFuZGxlciB0byBiZSByZW1vdmVkLCBjYW5ub3QgYmUgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGhhbmRsZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CiAgICAgICogICAgICAgICAgICAgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVIYW5kbGVyKEhhbmRsZXIgaGFuZGxlcikgewogICAgICAgICAvLyBBbm9ueW1vdXMgbG9nZ2VycyBjYW4gYWx3YXlzIHJlbW92ZSBoYW5kbGVycwpAQCAtNTEyLDcgKzUyOSw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZmlsdGVyIHVzZWQgYnkgdGhpcyBsb2dnZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlsdGVyIHVzZWQgYnkgdGhpcyBsb2dnZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXIgdXNlZCBieSB0aGlzIGxvZ2dlciwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsdGVyIGdldEZpbHRlcigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyOwpAQCAtNTIyLDEwICs1NDAsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBmaWx0ZXIgdXNlZCBieSB0aGlzIGxvZ2dlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3RmlsdGVyCi0gICAgICogICAgICAgICAgICB0aGUgZmlsdGVyIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIGZpbHRlciB0byBzZXQsIG1heSBiZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAogICAgICAqICAgICAgICAgICAgIGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyKEZpbHRlciBuZXdGaWx0ZXIpIHsKICAgICAgICAgLy8gQW5vbnltb3VzIGxvZ2dlcnMgY2FuIGFsd2F5cyBzZXQgdGhlIGZpbHRlcgpAQCAtNTM2LDIzICs1NTUsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoaXMgbG9nZ2VyLgorICAgICAqIEdldHMgdGhlIGxvZ2dpbmcgbGV2ZWwgb2YgdGhpcyBsb2dnZXIuIEEge0Bjb2RlIG51bGx9IGxldmVsIGluZGljYXRlcworICAgICAqIHRoYXQgdGhpcyBsb2dnZXIgaW5oZXJpdHMgaXRzIHBhcmVudCdzIGxldmVsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvZ2dpbmcgbGV2ZWwgb2YgdGhpcyBsb2dnZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoaXMgbG9nZ2VyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMZXZlbCBnZXRMZXZlbCgpIHsKICAgICAgICAgcmV0dXJuIGxldmVsT2JqVmFsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvZ2dpbmcgbGV2ZWwgZm9yIHRoaXMgbG9nZ2VyLiBBIDxjb2RlPm51bGw8L2NvZGU+IGxldmVsCi0gICAgICogaW5kaWNhdGVzIHRoaXMgbG9nZ2VyIHdpbGwgaW5oZXJpdCBpdHMgcGFyZW50J3MgbGV2ZWwuCisgICAgICogU2V0cyB0aGUgbG9nZ2luZyBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuIEEge0Bjb2RlIG51bGx9IGxldmVsIGluZGljYXRlcworICAgICAqIHRoYXQgdGhpcyBsb2dnZXIgd2lsbCBpbmhlcml0IGl0cyBwYXJlbnQncyBsZXZlbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3TGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2dnaW5nIGxldmVsIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIGxvZ2dpbmcgbGV2ZWwgdG8gc2V0LgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKICAgICAgKiAgICAgICAgICAgICBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExldmVsKExldmVsIG5ld0xldmVsKSB7CiAgICAgICAgIC8vIEFub255bW91cyBsb2dnZXJzIGNhbiBhbHdheXMgc2V0IHRoZSBsZXZlbApAQCAtNTY1LDI1ICs1ODcsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSBwYXJlbnQncyBoYW5kbGVycyB0byBwdWJsaXNoCi0gICAgICogaW5jb21pbmcgbG9nIHJlY29yZHMsIHBvdGVudGlhbGx5IHJlY3Vyc2l2ZWx5IHVwIHRoZSBuYW1lc3BhY2UuCisgICAgICogR2V0cyB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIGhhbmRsZXJzIG9mIHRoaXMKKyAgICAgKiBsb2dnZXIncyBwYXJlbnQgdG8gcHVibGlzaCBpbmNvbWluZyBsb2cgcmVjb3JkcywgcG90ZW50aWFsbHkgcmVjdXJzaXZlbHkKKyAgICAgKiB1cCB0aGUgbmFtZXNwYWNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2V0IHRvIHVzZSBwYXJlbnQncyBoYW5kbGVycywgb3RoZXJ3aXNlCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBzZXQgdG8gdXNlIHBhcmVudCdzIGhhbmRsZXJzLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlUGFyZW50SGFuZGxlcnMoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLm5vdGlmeVBhcmVudEhhbmRsZXJzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHBhcmVudCdzIGhhbmRsZXJzIHRvIHB1Ymxpc2gKLSAgICAgKiBpbmNvbWluZyBsb2cgcmVjb3JkcywgcG90ZW50aWFsbHkgcmVjdXJzaXZlbHkgdXAgdGhlIG5hbWVzcGFjZS4KKyAgICAgKiBTZXRzIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB0aGUgaGFuZGxlcnMgb2YgdGhpcworICAgICAqIGxvZ2dlcidzIHBhcmVudCwgcG90ZW50aWFsbHkgcmVjdXJzaXZlbHkgdXAgdGhlIG5hbWVzcGFjZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbm90aWZ5UGFyZW50SGFuZGxlcnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoZXRoZXIgdG8gdXNlIHBhcmVudCdzIGhhbmRsZXJzCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHVzZSB0aGUgcGFyZW50J3MgaGFuZGxlcnMuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAogICAgICAqICAgICAgICAgICAgIGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VXNlUGFyZW50SGFuZGxlcnMoYm9vbGVhbiBub3RpZnlQYXJlbnRIYW5kbGVycykgewogICAgICAgICAvLyBBbm9ueW1vdXMgbG9nZ2VycyBjYW4gYWx3YXlzIHNldCB0aGUgdXNlUGFyZW50SGFuZGxlcnMgZmxhZwpAQCAtNTk0LDkgKzYxOSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhcmVudCBvZiB0aGlzIGxvZ2dlciBpbiB0aGUgbmFtZXNwYWNlLgorICAgICAqIEdldHMgdGhlIG5lYXJlc3QgcGFyZW50IG9mIHRoaXMgbG9nZ2VyIGluIHRoZSBuYW1lc3BhY2UsIGEge0Bjb2RlIG51bGx9CisgICAgICogdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBpZiBjYWxsZWQgb24gdGhlIHJvb3QgbG9nZ2VyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIGxvZ2dlciBpbiB0aGUgbmFtZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgbG9nZ2VyIGluIHRoZSBuYW1lc3BhY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExvZ2dlciBnZXRQYXJlbnQoKSB7CiAgICAgICAgIHJldHVybiBwYXJlbnQ7CkBAIC02MDQsMTEgKzYzMSwxMiBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgbG9nZ2VyIGluIHRoZSBuYW1lc3BhY2UuIFRoaXMgbWV0aG9kIHNob3VsZAotICAgICAqIHVzdWFsbHkgYmUgdXNlZCBieSB0aGUgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gb2JqZWN0IG9ubHkuIFRoaXMKLSAgICAgKiBtZXRob2QgZG9lcyBub3QgY2hlY2sgc2VjdXJpdHkuCisgICAgICogdXN1YWxseSBiZSB1c2VkIGJ5IHRoZSB7QGNvZGUgTG9nTWFuYWdlcn0gb2JqZWN0IG9ubHkuIFRoaXMgbWV0aG9kIGRvZXMKKyAgICAgKiBub3QgY2hlY2sgc2VjdXJpdHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld1BhcmVudAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBsb2dnZXIgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGxvZ2dlciB0byBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgdm9pZCBpbnRlcm5hbFNldFBhcmVudChMb2dnZXIgbmV3UGFyZW50KSB7CiAgICAgICAgIC8vQWxsIGhpZXJhcmNoeSByZWxhdGVkIG1vZGlmaWNhdGlvbnMgc2hvdWxkIGdldCBMb2dNYW5hZ2VyIGxvY2sgYXQgZmlyc3QKQEAgLTYyNCwxNCArNjUyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgbG9nZ2VyIGluIHRoZSBuYW1lc3BhY2UuIFRoaXMgbWV0aG9kIHNob3VsZAotICAgICAqIHVzdWFsbHkgYmUgdXNlZCBieSB0aGUgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gb2JqZWN0IG9ubHkuCisgICAgICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgbG9nZ2VyIGluIHRoZSBuYW1lc3BhY2UuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQorICAgICAqIHVzZWQgYnkgdGhlIHtAY29kZSBMb2dNYW5hZ2VyfSBvYmplY3Qgb25seS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGxvZ2dlciB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgbG9nZ2VyIHRvIHNldC4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRldGVybWluZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CiAgICAgICogICAgICAgICAgICAgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgICAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTG9nZ2VyIHBhcmVudCkgewogICAgICAgICBpZiAobnVsbCA9PSBwYXJlbnQpIHsKQEAgLTY1Myw5ICs2ODIsMTAgQEAKIAogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIGxvZ2dlci4KKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoaXMgbG9nZ2VyLCB7QGNvZGUgbnVsbH0gZm9yIGFub255bW91cyBsb2dnZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBsb2dnZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbG9nZ2VyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKQEAgLTY2Myw5ICs2OTMsMTEgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxvYWRlZCByZXNvdXJjZSBidW5kbGUgdXNlZCBieSB0aGlzIGxvZ2dlciB0byBsb2NhbGl6ZSBsb2dnaW5nCi0gICAgICogbWVzc2FnZXMuIElmIGl0J3MgbnVsbCwgdGhlIHBhcmVudCdzIHJlc291cmNlIGJ1bmRsZSB3aWxsIGJlIGluaGVyaXRlZC4KKyAgICAgKiBtZXNzYWdlcy4gSWYgdGhlIHZhbHVlIGlzIHtAY29kZSBudWxsfSwgdGhlIHBhcmVudCdzIHJlc291cmNlIGJ1bmRsZSB3aWxsIGJlCisgICAgICogaW5oZXJpdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvYWRlZCByZXNvdXJjZSBidW5kbGUgdXNlZCBieSB0aGlzIGxvZ2dlcgorICAgICAqIEByZXR1cm4gdGhlIGxvYWRlZCByZXNvdXJjZSBidW5kbGUgdXNlZCBieSB0aGlzIGxvZ2dlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlc0J1bmRsZTsKQEAgLTY3MywxOSArNzA1LDIwIEBACiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBsb2FkZWQgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgdGhpcyBsb2dnZXIgdG8KLSAgICAgKiBsb2NhbGl6ZSBsb2dnaW5nIG1lc3NhZ2VzLiBJZiBpdCdzIG51bGwsIHRoZSBwYXJlbnQncyByZXNvdXJjZSBidW5kbGUKLSAgICAgKiBuYW1lIHdpbGwgYmUgaW5oZXJpdGVkLgorICAgICAqIGxvY2FsaXplIGxvZ2dpbmcgbWVzc2FnZXMuIElmIHRoZSB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0sIHRoZSBwYXJlbnQncyByZXNvdXJjZQorICAgICAqIGJ1bmRsZSBuYW1lIHdpbGwgYmUgaW5oZXJpdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxvYWRlZCByZXNvdXJjZSBidW5kbGUgdXNlZCBieSB0aGlzIGxvZ2dlcgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxvYWRlZCByZXNvdXJjZSBidW5kbGUgdXNlZCBieSB0aGlzIGxvZ2dlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucmVzQnVuZGxlTmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBmb3IgY29tcGF0aWJpbGl0eS4gVGVzdHMgd3JpdHRlbiB0byB0aGUgcmVmZXJlbmNlIAotICAgICAqIGltcGxlbWVudGF0aW9uIEFQSSBpbXBseSB0aGF0IHRoZSBpc0xvZ2dhYmxlKCkgbWV0aG9kIGlzIG5vdCBjYWxsZWQgCi0gICAgICogZGlyZWN0bHkuIFRoaXMgYmVoYXZpb3IgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc3ViY2xhc3MgbWF5IG92ZXJyaWRlIAorICAgICAqIFRoaXMgbWV0aG9kIGlzIGZvciBjb21wYXRpYmlsaXR5LiBUZXN0cyB3cml0dGVuIHRvIHRoZSByZWZlcmVuY2UKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBBUEkgaW1wbHkgdGhhdCB0aGUgaXNMb2dnYWJsZSgpIG1ldGhvZCBpcyBub3QgY2FsbGVkCisgICAgICogZGlyZWN0bHkuIFRoaXMgYmVoYXZpb3IgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc3ViY2xhc3MgbWF5IG92ZXJyaWRlCiAgICAgICogaXNMb2dnYWJsZSgpIG1ldGhvZCwgc28gdGhhdCBhZmZlY3QgdGhlIHJlc3VsdCBvZiBsb2cgbWV0aG9kcy4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxJc0xvZ2dhYmxlKExldmVsIGwpIHsKQEAgLTcwMCwxMiArNzMzLDEzIEBACiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgbG9nZ2VyIHdpbGwgYWN0dWFsbHkgbG9nIG1lc3NhZ2VzIG9mIHRoZQogICAgICAqIHNwZWNpZmllZCBsZXZlbC4gVGhlIGVmZmVjdGl2ZSBsZXZlbCB1c2VkIHRvIGRvIHRoZSBkZXRlcm1pbmF0aW9uIG1heSBiZQotICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQuIFRoZSBkZWZhdWx0IGxldmVsIGlzIDxjb2RlPkxldmVsLklORk88L2NvZGU+LgorICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQuIFRoZSBkZWZhdWx0IGxldmVsIGlzIHtAY29kZSBMZXZlbC5JTkZPfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIHRvIGNoZWNrCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGxvZ2dlciB3aWxsIGFjdHVhbGx5IGxvZyB0aGlzIGxldmVsLAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgbG9nZ2VyIHdpbGwgYWN0dWFsbHkgbG9nIHRoaXMgbGV2ZWwsCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2dhYmxlKExldmVsIGwpIHsKICAgICAgICAgcmV0dXJuIGludGVybmFsSXNMb2dnYWJsZShsKTsKQEAgLTczOCwxNCArNzcyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2UgaW5kaWNhdGluZyBlbnRlcmluZyBhIG1ldGhvZC4gQSBsb2cgcmVjb3JkIHdpdGggbG9nIGxldmVsCi0gICAgICogPGNvZGU+TGV2ZWwuRklORVI8L2NvZGU+LCBsb2cgbWVzc2FnZSAiRU5UUlkiLCBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqIExvZ3MgYSBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBhIG1ldGhvZCBoYXMgYmVlbiBlbnRlcmVkLiBBIGxvZyByZWNvcmQKKyAgICAgKiB3aXRoIGxvZyBsZXZlbCB7QGNvZGUgTGV2ZWwuRklORVJ9LCBsb2cgbWVzc2FnZSAiRU5UUlkiLCB0aGUgc3BlY2lmaWVkCiAgICAgICogc291cmNlIGNsYXNzIG5hbWUgYW5kIHNvdXJjZSBtZXRob2QgbmFtZSBpcyBzdWJtaXR0ZWQgZm9yIGxvZ2dpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNvdXJjZUNsYXNzCi0gICAgICogICAgICAgICAgICB0aGUgY2FsbGluZyBjbGFzcyBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgY2FsbGluZyBjbGFzcyBuYW1lLgogICAgICAqIEBwYXJhbSBzb3VyY2VNZXRob2QKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVudGVyaW5nKFN0cmluZyBzb3VyY2VDbGFzcywgU3RyaW5nIHNvdXJjZU1ldGhvZCkgewogICAgICAgICBpZiAoaW50ZXJuYWxJc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgewpAQCAtNzU5LDE3ICs3OTQsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBpbmRpY2F0aW5nIGVudGVyaW5nIGEgbWV0aG9kLiBBIGxvZyByZWNvcmQgd2l0aCBsb2cgbGV2ZWwKLSAgICAgKiA8Y29kZT5MZXZlbC5GSU5FUjwvY29kZT4sIGxvZyBtZXNzYWdlICJFTlRSWSIsIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogc291cmNlIGNsYXNzIG5hbWUgYW5kIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgb25lIHBhcmFtZXRlciBpcyBzdWJtaXR0ZWQKLSAgICAgKiBmb3IgbG9nZ2luZy4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgYSBtZXRob2QgaGFzIGJlZW4gZW50ZXJlZC4gQSBsb2cgcmVjb3JkCisgICAgICogd2l0aCBsb2cgbGV2ZWwge0Bjb2RlIExldmVsLkZJTkVSfSwgbG9nIG1lc3NhZ2UgIkVOVFJZIiwgdGhlIHNwZWNpZmllZAorICAgICAqIHNvdXJjZSBjbGFzcyBuYW1lLCBzb3VyY2UgbWV0aG9kIG5hbWUgYW5kIG9uZSBwYXJhbWV0ZXIgaXMgc3VibWl0dGVkIGZvcgorICAgICAqIGxvZ2dpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNvdXJjZUNsYXNzCi0gICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNsYXNzIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2xhc3MgbmFtZS4KICAgICAgKiBAcGFyYW0gc291cmNlTWV0aG9kCi0gICAgICogICAgICAgICAgICB0aGUgc291cmNlIG1ldGhvZCBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG1ldGhvZCBuYW1lLgogICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBmb3IgdGhlIG1ldGhvZCBjYWxsCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGZvciB0aGUgbWV0aG9kIGNhbGwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW50ZXJpbmcoU3RyaW5nIHNvdXJjZUNsYXNzLCBTdHJpbmcgc291cmNlTWV0aG9kLCBPYmplY3QgcGFyYW0pIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShMZXZlbC5GSU5FUikpIHsKQEAgLTc4NCwxNyArODIwLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2UgaW5kaWNhdGluZyBlbnRlcmluZyBhIG1ldGhvZC4gQSBsb2cgcmVjb3JkIHdpdGggbG9nIGxldmVsCi0gICAgICogPGNvZGU+TGV2ZWwuRklORVI8L2NvZGU+LCBsb2cgbWVzc2FnZSAiRU5UUlkiLCBhbmQgdGhlIHNwZWNpZmllZAotICAgICAqIHNvdXJjZSBjbGFzcyBuYW1lIGFuZCBzb3VyY2UgbWV0aG9kIG5hbWUgYW5kIHBhcmFtZXRlcnMgaXMgc3VibWl0dGVkIGZvcgotICAgICAqIGxvZ2dpbmcuCisgICAgICogTG9ncyBhIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IGEgbWV0aG9kIGhhcyBiZWVuIGVudGVyZWQuIEEgbG9nIHJlY29yZAorICAgICAqIHdpdGggbG9nIGxldmVsIHtAY29kZSBMZXZlbC5GSU5FUn0sIGxvZyBtZXNzYWdlICJFTlRSWSIsIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzb3VyY2UgY2xhc3MgbmFtZSwgc291cmNlIG1ldGhvZCBuYW1lIGFuZCBhcnJheSBvZiBwYXJhbWV0ZXJzIGlzCisgICAgICogc3VibWl0dGVkIGZvciBsb2dnaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2VDbGFzcwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNsYXNzIG5hbWUuCiAgICAgICogQHBhcmFtIHNvdXJjZU1ldGhvZAotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZS4KICAgICAgKiBAcGFyYW0gcGFyYW1zCi0gICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgbWV0aG9kIGNhbGwKKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXRob2QgY2FsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbnRlcmluZyhTdHJpbmcgc291cmNlQ2xhc3MsIFN0cmluZyBzb3VyY2VNZXRob2QsCiAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbXMpIHsKQEAgLTgxOCwxNCArODU1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2UgaW5kaWNhdGluZyBleGlzdGluZyBhIG1ldGhvZC4gQSBsb2cgcmVjb3JkIHdpdGggbG9nIGxldmVsCi0gICAgICogPGNvZGU+TGV2ZWwuRklORVI8L2NvZGU+LCBsb2cgbWVzc2FnZSAiUkVUVVJOIiwgYW5kIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzb3VyY2UgY2xhc3MgbmFtZSBhbmQgc291cmNlIG1ldGhvZCBuYW1lIGlzIHN1Ym1pdHRlZCBmb3IgbG9nZ2luZy4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgYSBtZXRob2QgaXMgZXhpdGVkLiBBIGxvZyByZWNvcmQgd2l0aCBsb2cKKyAgICAgKiBsZXZlbCB7QGNvZGUgTGV2ZWwuRklORVJ9LCBsb2cgbWVzc2FnZSAiUkVUVVJOIiwgdGhlIHNwZWNpZmllZCBzb3VyY2UKKyAgICAgKiBjbGFzcyBuYW1lIGFuZCBzb3VyY2UgbWV0aG9kIG5hbWUgaXMgc3VibWl0dGVkIGZvciBsb2dnaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2VDbGFzcwotICAgICAqICAgICAgICAgICAgdGhlIGNhbGxpbmcgY2xhc3MgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNhbGxpbmcgY2xhc3MgbmFtZS4KICAgICAgKiBAcGFyYW0gc291cmNlTWV0aG9kCi0gICAgICogICAgICAgICAgICB0aGUgbWV0aG9kIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGl0aW5nKFN0cmluZyBzb3VyY2VDbGFzcywgU3RyaW5nIHNvdXJjZU1ldGhvZCkgewogICAgICAgICBpZiAoaW50ZXJuYWxJc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgewpAQCAtODM5LDE3ICs4NzcsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBpbmRpY2F0aW5nIGV4aXRpbmcgYSBtZXRob2QuIEEgbG9nIHJlY29yZCB3aXRoIGxvZyBsZXZlbAotICAgICAqIDxjb2RlPkxldmVsLkZJTkVSPC9jb2RlPiwgbG9nIG1lc3NhZ2UgIlJFVFVSTiIsIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogc291cmNlIGNsYXNzIG5hbWUgYW5kIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgcmV0dXJuIHZhbHVlIGlzIHN1Ym1pdHRlZAotICAgICAqIGZvciBsb2dnaW5nLgorICAgICAqIExvZ3MgYSBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBhIG1ldGhvZCBpcyBleGl0ZWQuIEEgbG9nIHJlY29yZCB3aXRoIGxvZworICAgICAqIGxldmVsIHtAY29kZSBMZXZlbC5GSU5FUn0sIGxvZyBtZXNzYWdlICJSRVRVUk4iLCB0aGUgc3BlY2lmaWVkIHNvdXJjZQorICAgICAqIGNsYXNzIG5hbWUsIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgcmV0dXJuIHZhbHVlIGlzIHN1Ym1pdHRlZCBmb3IgbG9nZ2luZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc291cmNlQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2xhc3MgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lLgogICAgICAqIEBwYXJhbSBzb3VyY2VNZXRob2QKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbWV0aG9kIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbWV0aG9kIG5hbWUuCiAgICAgICogQHBhcmFtIHJlc3VsdAotICAgICAqICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kIGNhbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBjYWxsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4aXRpbmcoU3RyaW5nIHNvdXJjZUNsYXNzLCBTdHJpbmcgc291cmNlTWV0aG9kLCBPYmplY3QgcmVzdWx0KSB7CiAgICAgICAgIGlmIChpbnRlcm5hbElzTG9nZ2FibGUoTGV2ZWwuRklORVIpKSB7CkBAIC04NjQsMTcgKzkwMiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIGluZGljYXRpbmcgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiBBIGxvZyByZWNvcmQgd2l0aCBsb2cKLSAgICAgKiBsZXZlbCA8Y29kZT5MZXZlbC5GSU5FUjwvY29kZT4sIGxvZyBtZXNzYWdlICJUSFJPVyIsIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogc291cmNlIGNsYXNzIG5hbWUgYW5kIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPgotICAgICAqIG9iamVjdCBpcyBzdWJtaXR0ZWQgZm9yIGxvZ2dpbmcuCisgICAgICogTG9ncyBhIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEEgbG9nIHJlY29yZCB3aXRoCisgICAgICogbG9nIGxldmVsIHtAY29kZSBMZXZlbC5GSU5FUn0sIGxvZyBtZXNzYWdlICJUSFJPVyIsIHRoZSBzcGVjaWZpZWQgc291cmNlCisgICAgICogY2xhc3MgbmFtZSwgc291cmNlIG1ldGhvZCBuYW1lIGFuZCB0aGUge0Bjb2RlIFRocm93YWJsZX0gb2JqZWN0IGlzCisgICAgICogc3VibWl0dGVkIGZvciBsb2dnaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2VDbGFzcwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNsYXNzIG5hbWUuCiAgICAgICogQHBhcmFtIHNvdXJjZU1ldGhvZAotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZS4KICAgICAgKiBAcGFyYW0gdGhyb3duCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgVGhyb3dhYmxlfSBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGhyb3dpbmcoU3RyaW5nIHNvdXJjZUNsYXNzLCBTdHJpbmcgc291cmNlTWV0aG9kLAogICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93bikgewpAQCAtODkwLDEwICs5MjksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiBsZXZlbCA8Y29kZT5MZXZlbC5TRVZFUkU8L2NvZGU+LgorICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIGxldmVsIHtAY29kZSBMZXZlbC5TRVZFUkV9OyB0aGUgbWVzc2FnZSBpcyB0cmFuc21pdHRlZAorICAgICAqIHRvIGFsbCBzdWJzY3JpYmVkIGhhbmRsZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGxvZworICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldmVyZShTdHJpbmcgbXNnKSB7CiAgICAgICAgIGlmIChpbnRlcm5hbElzTG9nZ2FibGUoTGV2ZWwuU0VWRVJFKSkgewpAQCAtOTA1LDEwICs5NDYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiBsZXZlbCA8Y29kZT5MZXZlbC5XQVJOSU5HPC9jb2RlPi4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiBsZXZlbCB7QGNvZGUgTGV2ZWwuV0FSTklOR307IHRoZSBtZXNzYWdlIGlzCisgICAgICogdHJhbnNtaXR0ZWQgdG8gYWxsIHN1YnNjcmliZWQgaGFuZGxlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAgICAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBtc2cpIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShMZXZlbC5XQVJOSU5HKSkgewpAQCAtOTIwLDEwICs5NjMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiBsZXZlbCA8Y29kZT5MZXZlbC5JTkZPPC9jb2RlPi4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiBsZXZlbCB7QGNvZGUgTGV2ZWwuSU5GT307IHRoZSBtZXNzYWdlIGlzIHRyYW5zbWl0dGVkCisgICAgICogdG8gYWxsIHN1YnNjcmliZWQgaGFuZGxlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAgICAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbmZvKFN0cmluZyBtc2cpIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShMZXZlbC5JTkZPKSkgewpAQCAtOTM1LDEwICs5ODAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiBsZXZlbCA8Y29kZT5MZXZlbC5DT05GSUc8L2NvZGU+LgorICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIGxldmVsIHtAY29kZSBMZXZlbC5DT05GSUd9OyB0aGUgbWVzc2FnZSBpcyB0cmFuc21pdHRlZAorICAgICAqIHRvIGFsbCBzdWJzY3JpYmVkIGhhbmRsZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGxvZworICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMCAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29uZmlnKFN0cmluZyBtc2cpIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShMZXZlbC5DT05GSUcpKSB7CkBAIC05NTAsMTAgKzk5NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIGxldmVsIDxjb2RlPkxldmVsLkZJTkU8L2NvZGU+LgorICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIGxldmVsIHtAY29kZSBMZXZlbC5GSU5FfTsgdGhlIG1lc3NhZ2UgaXMgdHJhbnNtaXR0ZWQKKyAgICAgKiB0byBhbGwgc3Vic2NyaWJlZCBoYW5kbGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpbmUoU3RyaW5nIG1zZykgewogICAgICAgICBpZiAoaW50ZXJuYWxJc0xvZ2dhYmxlKExldmVsLkZJTkUpKSB7CkBAIC05NjUsMTAgKzEwMTQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiBsZXZlbCA8Y29kZT5MZXZlbC5GSU5FUjwvY29kZT4uCisgICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgbGV2ZWwge0Bjb2RlIExldmVsLkZJTkVSfTsgdGhlIG1lc3NhZ2UgaXMgdHJhbnNtaXR0ZWQKKyAgICAgKiB0byBhbGwgc3Vic2NyaWJlZCBoYW5kbGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpbmVyKFN0cmluZyBtc2cpIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShMZXZlbC5GSU5FUikpIHsKQEAgLTk4MCwxMCArMTAzMSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIGxldmVsIDxjb2RlPkxldmVsLkZJTkVTVDwvY29kZT4uCisgICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgbGV2ZWwge0Bjb2RlIExldmVsLkZJTkVTVH07IHRoZSBtZXNzYWdlIGlzIHRyYW5zbWl0dGVkCisgICAgICogdG8gYWxsIHN1YnNjcmliZWQgaGFuZGxlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmluZXN0KFN0cmluZyBtc2cpIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShMZXZlbC5GSU5FU1QpKSB7CkBAIC05OTUsMTIgKzEwNDgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgc3BlY2lmaWVkIGxldmVsLgorICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgbGV2ZWwuIFRoZSBtZXNzYWdlIGlzIHRyYW5zbWl0dGVkIHRvIGFsbAorICAgICAqIHN1YnNjcmliZWQgaGFuZGxlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvZ0xldmVsCi0gICAgICogICAgICAgICAgICB0aGUgbGV2ZWwgb2YgdGhlIGdpdmVuIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG9nKExldmVsIGxvZ0xldmVsLCBTdHJpbmcgbXNnKSB7CiAgICAgICAgIGlmIChpbnRlcm5hbElzTG9nZ2FibGUobG9nTGV2ZWwpKSB7CkBAIC0xMDEyLDE0ICsxMDY3LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZCBsZXZlbCB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIuCisgICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZCBsZXZlbCB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIuIFRoZQorICAgICAqIG1lc3NhZ2UgaXMgdGhlbiB0cmFuc21pdHRlZCB0byBhbGwgc3Vic2NyaWJlZCBoYW5kbGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9nTGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIG9mIHRoZSBnaXZlbiBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGxvZworICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nLgogICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRoYXQgbmVlZCB0byBiZSBsb2dnZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0aGF0IGlzIGxvZ2dlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsb2coTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyBtc2csIE9iamVjdCBwYXJhbSkgewogICAgICAgICBpZiAoaW50ZXJuYWxJc0xvZ2dhYmxlKGxvZ0xldmVsKSkgewpAQCAtMTAzMywxNCArMTA5MCwxNSBAQAogCiAgICAgLyoqCiAgICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZCBsZXZlbCB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgYXJyYXkuCisgICAgICogVGhlIG1lc3NhZ2UgaXMgdGhlbiB0cmFuc21pdHRlZCB0byBhbGwgc3Vic2NyaWJlZCBoYW5kbGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9nTGV2ZWwKICAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZQogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGxvZworICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gbG9nLgogICAgICAqIEBwYXJhbSBwYXJhbXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0aGF0IG5lZWQgdG8gYmUKLSAgICAgKiAgICAgICAgICAgIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBhcnJheSBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRoYXQgaXMgbG9nZ2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvZyhMZXZlbCBsb2dMZXZlbCwgU3RyaW5nIG1zZywgT2JqZWN0W10gcGFyYW1zKSB7CiAgICAgICAgIGlmIChpbnRlcm5hbElzTG9nZ2FibGUobG9nTGV2ZWwpKSB7CkBAIC0xMDUzLDE2ICsxMTExLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZCBsZXZlbCB3aXRoIHRoZSBzdXBwbGllZAotICAgICAqIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0LgorICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgbGV2ZWwgd2l0aCB0aGUgc3VwcGxpZWQge0Bjb2RlIFRocm93YWJsZX0KKyAgICAgKiBvYmplY3QuIFRoZSBtZXNzYWdlIGlzIHRoZW4gdHJhbnNtaXR0ZWQgdG8gYWxsIHN1YnNjcmliZWQgaGFuZGxlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvZ0xldmVsCi0gICAgICogICAgICAgICAgICB0aGUgbGV2ZWwgb2YgdGhlIGdpdmVuIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGxvZy4KICAgICAgKiBAcGFyYW0gdGhyb3duCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudAotICAgICAqICAgICAgICAgICAgdGhhdCBuZWVkIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBUaHJvd2FibGV9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRoYXQgaXMKKyAgICAgKiAgICAgICAgICAgIGxvZ2dlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsb2coTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd24pIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShsb2dMZXZlbCkpIHsKQEAgLTEwNzUsMTEgKzExMzQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgZ2l2ZW4gbG9nIHJlY29yZC4gT25seSB0aG9zZSB3aXRoIGEgbG9nZ2luZyBsZXZlbCBubyBsb3dlciB0aGFuCi0gICAgICogdGhpcyBsb2dnZXIncyBsZXZlbCB3aWxsIGJlIHN1Ym1pdHRlZCB0byB0aGlzIGxvZ2dlcidzIGhhbmRsZXJzIGZvcgotICAgICAqIGxvZ2dpbmcuIElmIDxjb2RlPmdldFVzZVBhcmVudEhhbmRsZXJzKCk8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LAotICAgICAqIHRoZSBsb2cgcmVjb3JkIHdpbGwgYWxzbyBiZSBzdWJtaXR0ZWQgdG8gdGhlIHBhcmVudCBsb2dnZXIncyBoYW5kbGVycywKLSAgICAgKiBwb3RlbnRpYWxseSByZWN1cnNpdmVseSB1cCB0aGUgbmFtZXNwYWNlLgorICAgICAqIExvZ3MgYSBnaXZlbiBsb2cgcmVjb3JkLiBPbmx5IHJlY29yZHMgd2l0aCBhIGxvZ2dpbmcgbGV2ZWwgdGhhdCBpcyBlcXVhbAorICAgICAqIG9yIGdyZWF0ZXIgdGhhbiB0aGlzIGxvZ2dlcidzIGxldmVsIHdpbGwgYmUgc3VibWl0dGVkIHRvIHRoaXMgbG9nZ2VyJ3MKKyAgICAgKiBoYW5kbGVycyBmb3IgbG9nZ2luZy4gSWYge0Bjb2RlIGdldFVzZVBhcmVudEhhbmRsZXJzKCl9IHJldHVybnMge0Bjb2RlCisgICAgICogdHJ1ZX0sIHRoZSBsb2cgcmVjb3JkIHdpbGwgYWxzbyBiZSBzdWJtaXR0ZWQgdG8gdGhlIGhhbmRsZXJzIG9mIHRoaXMKKyAgICAgKiBsb2dnZXIncyBwYXJlbnQsIHBvdGVudGlhbGx5IHJlY3Vyc2l2ZWx5IHVwIHRoZSBuYW1lc3BhY2UuCiAgICAgICogPHA+CiAgICAgICogU2luY2UgYWxsIG90aGVyIGxvZyBtZXRob2RzIGNhbGwgdGhpcyBtZXRob2QgdG8gYWN0dWFsbHkgcGVyZm9ybSB0aGUKICAgICAgKiBsb2dnaW5nIGFjdGlvbiwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0bwpAQCAtMTA4Nyw3ICsxMTQ2LDggQEAKICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHJlY29yZAotICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgbG9nZ2VkCisgICAgICogICAgICAgICAgICB0aGUgbG9nIHJlY29yZCB0byBiZSBsb2dnZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG9nKExvZ1JlY29yZCByZWNvcmQpIHsKICAgICAgICAgaWYgKGludGVybmFsSXNMb2dnYWJsZShyZWNvcmQuZ2V0TGV2ZWwoKSkpIHsKQEAgLTExMjQsMTMgKzExODQsMTQgQEAKICAgICAgKiBhbmQgc291cmNlIG1ldGhvZCBuYW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2dMZXZlbAotICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIG9mIHRoZSBnaXZlbiBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgbGV2ZWwgb2YgdGhlIGdpdmVuIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIHNvdXJjZUNsYXNzCi0gICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNsYXNzIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2xhc3MgbmFtZS4KICAgICAgKiBAcGFyYW0gc291cmNlTWV0aG9kCi0gICAgICogICAgICAgICAgICB0aGUgc291cmNlIG1ldGhvZCBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG1ldGhvZCBuYW1lLgogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvZ3AoTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyBzb3VyY2VDbGFzcywgU3RyaW5nIHNvdXJjZU1ldGhvZCwKICAgICAgICAgICAgIFN0cmluZyBtc2cpIHsKQEAgLTExNDUsOCArMTIwNiw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIGxldmVsIHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgY2xhc3MgbmFtZQotICAgICAqIGFuZCBzb3VyY2UgbWV0aG9kIG5hbWUgYW5kIHBhcmFtZXRlci4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gbGV2ZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjbGFzcyBuYW1lLAorICAgICAqIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgcGFyYW1ldGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2dMZXZlbAogICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIG9mIHRoZSBnaXZlbiBtZXNzYWdlCkBAIC0xMTU3LDcgKzEyMTgsOCBAQAogICAgICAqIEBwYXJhbSBtc2cKICAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAogICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRoYXQgbmVlZCB0byBiZSBsb2dnZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0aGF0IGlzIGxvZ2dlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsb2dwKExldmVsIGxvZ0xldmVsLCBTdHJpbmcgc291cmNlQ2xhc3MsIFN0cmluZyBzb3VyY2VNZXRob2QsCiAgICAgICAgICAgICBTdHJpbmcgbXNnLCBPYmplY3QgcGFyYW0pIHsKQEAgLTExNzMsMjAgKzEyMzUsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gbGV2ZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjbGFzcyBuYW1lCi0gICAgICogYW5kIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgcGFyYW1ldGVyIGFycmF5LgorICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiBsZXZlbCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGNsYXNzIG5hbWUsCisgICAgICogc291cmNlIG1ldGhvZCBuYW1lIGFuZCBwYXJhbWV0ZXIgYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvZ0xldmVsCi0gICAgICogICAgICAgICAgICB0aGUgbGV2ZWwgb2YgdGhlIGdpdmVuIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gc291cmNlQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2xhc3MgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lLgogICAgICAqIEBwYXJhbSBzb3VyY2VNZXRob2QKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbWV0aG9kIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbWV0aG9kIG5hbWUuCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuCiAgICAgICogQHBhcmFtIHBhcmFtcwotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBhcnJheSBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRoYXQgbmVlZCB0byBiZQotICAgICAqICAgICAgICAgICAgbG9nZ2VkCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGFycmF5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGhhdCBpcyBsb2dnZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG9ncChMZXZlbCBsb2dMZXZlbCwgU3RyaW5nIHNvdXJjZUNsYXNzLCBTdHJpbmcgc291cmNlTWV0aG9kLAogICAgICAgICAgICAgU3RyaW5nIG1zZywgT2JqZWN0W10gcGFyYW1zKSB7CkBAIC0xMjAyLDE5ICsxMjY0LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIGxldmVsIHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgY2xhc3MgbmFtZQotICAgICAqIGFuZCBzb3VyY2UgbWV0aG9kIG5hbWUgYW5kIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0LgorICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiBsZXZlbCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGNsYXNzIG5hbWUsCisgICAgICogc291cmNlIG1ldGhvZCBuYW1lIGFuZCB7QGNvZGUgVGhyb3dhYmxlfSBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvZ0xldmVsCi0gICAgICogICAgICAgICAgICB0aGUgbGV2ZWwgb2YgdGhlIGdpdmVuIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gc291cmNlQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2xhc3MgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lLgogICAgICAqIEBwYXJhbSBzb3VyY2VNZXRob2QKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbWV0aG9kIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbWV0aG9kIG5hbWUuCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuCiAgICAgICogQHBhcmFtIHRocm93bgotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFRocm93YWJsZX0gb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvZ3AoTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyBzb3VyY2VDbGFzcywgU3RyaW5nIHNvdXJjZU1ldGhvZCwKICAgICAgICAgICAgIFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd24pIHsKQEAgLTEyMzIsMTggKzEyOTUsMjAgQEAKICAgICAvKioKICAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gbGV2ZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjbGFzcyBuYW1lCiAgICAgICogYW5kIHNvdXJjZSBtZXRob2QgbmFtZSwgdXNpbmcgdGhlIGdpdmVuIHJlc291cmNlIGJ1bmRsZSB0byBsb2NhbGl6ZSB0aGUKLSAgICAgKiBtZXNzYWdlLgorICAgICAqIG1lc3NhZ2UuIElmIHtAY29kZSBidW5kbGVOYW1lfSBpcyBudWxsLCB0aGUgZW1wdHkgc3RyaW5nIG9yIG5vdCB2YWxpZCB0aGVuCisgICAgICogdGhlIG1lc3NhZ2UgaXMgbm90IGxvY2FsaXplZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9nTGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIG9mIHRoZSBnaXZlbiBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBzb3VyY2VDbGFzcwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNsYXNzIG5hbWUuCiAgICAgICogQHBhcmFtIHNvdXJjZU1ldGhvZAotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZS4KICAgICAgKiBAcGFyYW0gYnVuZGxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSwgdXNlZCB0byBsb2NhbGl6ZSB0aGUgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIHRvIGxvY2FsaXplIHRoZSBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvZ3JiKExldmVsIGxvZ0xldmVsLCBTdHJpbmcgc291cmNlQ2xhc3MsIFN0cmluZyBzb3VyY2VNZXRob2QsCiAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZykgewpAQCAtMTI2NSwyMiArMTMzMCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiBsZXZlbCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGNsYXNzIG5hbWUKLSAgICAgKiBhbmQgc291cmNlIG1ldGhvZCBuYW1lIGFuZCBwYXJhbWV0ZXIsIHVzaW5nIHRoZSBnaXZlbiByZXNvdXJjZSBidW5kbGUgdG8KLSAgICAgKiBsb2NhbGl6ZSB0aGUgbWVzc2FnZS4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gbGV2ZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjbGFzcyBuYW1lLAorICAgICAqIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgcGFyYW1ldGVyLCB1c2luZyB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlIHRvCisgICAgICogbG9jYWxpemUgdGhlIG1lc3NhZ2UuIElmIHtAY29kZSBidW5kbGVOYW1lfSBpcyBudWxsLCB0aGUgZW1wdHkgc3RyaW5nCisgICAgICogb3Igbm90IHZhbGlkIHRoZW4gdGhlIG1lc3NhZ2UgaXMgbm90IGxvY2FsaXplZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9nTGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIG9mIHRoZSBnaXZlbiBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBzb3VyY2VDbGFzcwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNsYXNzIG5hbWUuCiAgICAgICogQHBhcmFtIHNvdXJjZU1ldGhvZAotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZS4KICAgICAgKiBAcGFyYW0gYnVuZGxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSwgdXNlZCB0byBsb2NhbGl6ZSB0aGUgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIHRvIGxvY2FsaXplIHRoZSBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgogICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRoYXQgbmVlZCB0byBiZSBsb2dnZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0aGF0IGlzIGxvZ2dlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsb2dyYihMZXZlbCBsb2dMZXZlbCwgU3RyaW5nIHNvdXJjZUNsYXNzLCBTdHJpbmcgc291cmNlTWV0aG9kLAogICAgICAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2csIE9iamVjdCBwYXJhbSkgewpAQCAtMTMwMywyMyArMTM3MCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiBsZXZlbCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGNsYXNzIG5hbWUKLSAgICAgKiBhbmQgc291cmNlIG1ldGhvZCBuYW1lIGFuZCBwYXJhbWV0ZXIgYXJyYXksIHVzaW5nIHRoZSBnaXZlbiByZXNvdXJjZQotICAgICAqIGJ1bmRsZSB0byBsb2NhbGl6ZSB0aGUgbWVzc2FnZS4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gbGV2ZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjbGFzcyBuYW1lLAorICAgICAqIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgcGFyYW1ldGVyIGFycmF5LCB1c2luZyB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlCisgICAgICogdG8gbG9jYWxpemUgdGhlIG1lc3NhZ2UuIElmIHtAY29kZSBidW5kbGVOYW1lfSBpcyBudWxsLCB0aGUgZW1wdHkgc3RyaW5nCisgICAgICogb3Igbm90IHZhbGlkIHRoZW4gdGhlIG1lc3NhZ2UgaXMgbm90IGxvY2FsaXplZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9nTGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIG9mIHRoZSBnaXZlbiBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBzb3VyY2VDbGFzcwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjbGFzcyBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNsYXNzIG5hbWUuCiAgICAgICogQHBhcmFtIHNvdXJjZU1ldGhvZAotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBtZXRob2QgbmFtZS4KICAgICAgKiBAcGFyYW0gYnVuZGxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSwgdXNlZCB0byBsb2NhbGl6ZSB0aGUgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIHRvIGxvY2FsaXplIHRoZSBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgogICAgICAqIEBwYXJhbSBwYXJhbXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0aGF0IG5lZWQgdG8gYmUKLSAgICAgKiAgICAgICAgICAgIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBhcnJheSBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRoYXQgaXMgbG9nZ2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvZ3JiKExldmVsIGxvZ0xldmVsLCBTdHJpbmcgc291cmNlQ2xhc3MsIFN0cmluZyBzb3VyY2VNZXRob2QsCiAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZywgT2JqZWN0W10gcGFyYW1zKSB7CkBAIC0xMzQyLDkgKzE0MTAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gbGV2ZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjbGFzcyBuYW1lCi0gICAgICogYW5kIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QsIHVzaW5nIHRoZQotICAgICAqIGdpdmVuIHJlc291cmNlIGJ1bmRsZSB0byBsb2NhbGl6ZSB0aGUgbWVzc2FnZS4KKyAgICAgKiBMb2dzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gbGV2ZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjbGFzcyBuYW1lLAorICAgICAqIHNvdXJjZSBtZXRob2QgbmFtZSBhbmQge0Bjb2RlIFRocm93YWJsZX0gb2JqZWN0LCB1c2luZyB0aGUgZ2l2ZW4gcmVzb3VyY2UKKyAgICAgKiBidW5kbGUgdG8gbG9jYWxpemUgdGhlIG1lc3NhZ2UuIElmIHtAY29kZSBidW5kbGVOYW1lfSBpcyBudWxsLCB0aGUgZW1wdHkKKyAgICAgKiBzdHJpbmcgb3Igbm90IHZhbGlkIHRoZW4gdGhlIG1lc3NhZ2UgaXMgbm90IGxvY2FsaXplZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9nTGV2ZWwKICAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZQpAQCAtMTM1MywxMSArMTQyMiwxMiBAQAogICAgICAqIEBwYXJhbSBzb3VyY2VNZXRob2QKICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbWV0aG9kIG5hbWUKICAgICAgKiBAcGFyYW0gYnVuZGxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSwgdXNlZCB0byBsb2NhbGl6ZSB0aGUgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIHRvIGxvY2FsaXplIHRoZSBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgogICAgICAqIEBwYXJhbSB0aHJvd24KLSAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBUaHJvd2FibGV9IG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsb2dyYihMZXZlbCBsb2dMZXZlbCwgU3RyaW5nIHNvdXJjZUNsYXNzLCBTdHJpbmcgc291cmNlTWV0aG9kLAogICAgICAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd24pIHsKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ01YQmVhbi5qYXZhCmluZGV4IDcxZWE2NWQuLmY2YjQ5YTYgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdNWEJlYW4uamF2YQpAQCAtMjAsNjcgKzIwLDY2IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgorICoge0Bjb2RlIExvZ2dpbmdNWEJlYW59IGlzIHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZSBmb3IgdGhlIGxvZ2dpbmcgc3ViLXN5c3RlbS4KICAqIDxwPgotICogVGhlIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGZvciB0aGUgbG9nZ2luZyBzdWItc3lzdGVtLgorICogVGhlIE9iamVjdE5hbWUgZm9yIGlkZW50aWZ5aW5nIHRoZSB7QGNvZGUgTG9nZ2luZ01YQmVhbn0gaW4gYSBiZWFuIHNlcnZlciBpcworICoge0BsaW5rIExvZ01hbmFnZXIjTE9HR0lOR19NWEJFQU5fTkFNRX0uCiAgKiA8L3A+CiAgKiAKLSAqIDxwPgotICogT2JqZWN0TmFtZSA9Ci0gKiB7QGxpbmsgTG9nTWFuYWdlciNMT0dHSU5HX01YQkVBTl9OQU1FIGphdmEudXRpbC5sb2dnaW5nOnR5cGU9TG9nZ2luZ30KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuNQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTG9nZ2luZ01YQmVhbiB7CiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2V0cyB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBsb2dnaW5nIGxldmVsIG9mIGEgbG9nZ2VyLiBBbiBlbXB0eSBTdHJpbmcKLSAgICAgKiBpcyByZXR1cm5lZCB3aGVuIHRoZSBsb2dnZXIncyBsZXZlbCBpcyBkZWZpbmVkIGJ5IGl0cyBwYXJlbnQuCi0gICAgICogPC9wPgorICAgICAqIEdldHMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgbG9nZ2luZyBsZXZlbCBvZiBhIGxvZ2dlci4gQW4gZW1wdHkgc3RyaW5nCisgICAgICogaXMgcmV0dXJuZWQgd2hlbiB0aGUgbG9nZ2VyJ3MgbGV2ZWwgaXMgZGVmaW5lZCBieSBpdHMgcGFyZW50LiBBCisgICAgICoge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkIGlmIHRoZSBzcGVjaWZpZWQgbG9nZ2VyIGRvZXMgbm90IGV4aXN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2dnZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgbG9va3VwLgotICAgICAqIEByZXR1cm4gQSBTdHJpbmcgaWYgdGhlIGxvZ2dlciB3YXMgZm91bmQsIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbG9nZ2VyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGxvZ2dlciBsb29rdXAuCisgICAgICogQHJldHVybiBhIHtAY29kZSBTdHJpbmd9IGlmIHRoZSBsb2dnZXIgaXMgZm91bmQsIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHNlZSBMZXZlbCNnZXROYW1lKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBTdHJpbmcgZ2V0TG9nZ2VyTGV2ZWwoU3RyaW5nIGxvZ2dlck5hbWUpOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2V0cyBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSByZWdpc3RlcmVkIGxvZ2dlcidzIG5hbWVzLiBUaGlzIGlzIHBlcmZvcm1lZAorICAgICAqIEdldHMgYSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgcmVnaXN0ZXJlZCBsb2dnZXIgbmFtZXMuIFRoaXMgaXMgcGVyZm9ybWVkCiAgICAgICogdXNpbmcgdGhlIHtAbGluayBMb2dNYW5hZ2VyI2dldExvZ2dlck5hbWVzKCl9LgotICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgTGlzdCBvZiBTdHJpbmcgaW5zdGFuY2VzLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGxvZ2dlciBuYW1lcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBMaXN0PFN0cmluZz4gZ2V0TG9nZ2VyTmFtZXMoKTsKIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBsb2dnZXIgb2YgYSBsb2dnZXIuIElmIHRoZSBsb2dnZXIgZG9lc24ndAotICAgICAqIGV4aXN0IHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuIElmIHRoZSBsb2dnZXIgaXMgdGhlIHJvb3QKLSAgICAgKiBsb2dnZXIsIHRoZW4gYW4gZW1wdHkgU3RyaW5nIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBleGlzdCB0aGVuIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZC4gSWYgdGhlIGxvZ2dlciBpcyB0aGUgcm9vdCBsb2dnZXIsCisgICAgICogdGhlbiBhbiBlbXB0eSB7QGNvZGUgU3RyaW5nfSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9nZ2VyTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9nZ2VyIHRvIGxvb2t1cC4KLSAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIGlmIHRoZSBsb2dnZXIgd2FzIGZvdW5kLCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGxvZ2dlck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgdG8gbG9va3VwLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgU3RyaW5nfSBpZiB0aGUgbG9nZ2VyIHdhcyBmb3VuZCwgb3RoZXJ3aXNlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBTdHJpbmcgZ2V0UGFyZW50TG9nZ2VyTmFtZShTdHJpbmcgbG9nZ2VyTmFtZSk7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTZXRzIHRoZSBsb2cgbGV2ZWwgb2YgYSBsb2dnZXIuCi0gICAgICogPC9wPgorICAgICAqIFNldHMgdGhlIGxvZyBsZXZlbCBvZiBhIGxvZ2dlci4gTGV2ZWxOYW1lIHNldCB0byB7QGNvZGUgbnVsbH0gbWVhbnMgdGhlCisgICAgICogbGV2ZWwgaXMgaW5oZXJpdGVkIGZyb20gdGhlIG5lYXJlc3Qgbm9uLW51bGwgYW5jZXN0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvZ2dlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvZ2dlciB0byBzZXQgdGhlIGxldmVsIG9uLCB3aGljaCBtdXN0Ci0gICAgICogICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gbGV2ZWxOYW1lIFRoZSBsZXZlbCB0byBzZXQgb24gdGhlIGxvZ2dlciwgd2hpY2ggbWF5IGJlCi0gICAgICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmxvZ2dlck5hbWU8L2NvZGU+IGlzIG5vdCBhCi0gICAgICogICAgICAgICByZWdpc3RlcmVkIGxvZ2dlciBvciBpZiA8Y29kZT5sZXZlbE5hbWU8L2NvZGU+IGlzIG5vdCBudWxsIGFuZAotICAgICAqICAgICAgICAgYW4gaW52YWxpZCB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHRoZSBjYWxsZXIKLSAgICAgKiAgICAgICAgIGRvZXNuJ3QgaGF2ZSBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpLgorICAgICAqIEBwYXJhbSBsb2dnZXJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbG9nZ2VyIHRvIHNldCB0aGUgbGV2ZWwgb24sIHdoaWNoIG11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGxldmVsTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGxldmVsIHRvIHNldCBvbiB0aGUgbG9nZ2VyLCB3aGljaCBtYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxvZ2dlck5hbWV9IGlzIG5vdCBhIHJlZ2lzdGVyZWQgbG9nZ2VyIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxldmVsTmFtZX0gaXMgbm90IG51bGwgYW5kIG5vdCB2YWxpZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUKKyAgICAgKiAgICAgICAgICAgICBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpLgogICAgICAqIEBzZWUgTGV2ZWwjcGFyc2UoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHZvaWQgc2V0TG9nZ2VyTGV2ZWwoU3RyaW5nIGxvZ2dlck5hbWUsIFN0cmluZyBsZXZlbE5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdQZXJtaXNzaW9uLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ1Blcm1pc3Npb24uamF2YQppbmRleCA2OTYyMTI3Li5mYjZkNGY4IDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ1Blcm1pc3Npb24uamF2YQorKysgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ1Blcm1pc3Npb24uamF2YQpAQCAtMjYsNyArMjYsNyBAQAogCiAvKioKICAqIFRoZSBwZXJtaXNzaW9uIHJlcXVpcmVkIHRvIGNvbnRyb2wgdGhlIGxvZ2dpbmcgd2hlbiBydW4gd2l0aCBhCi0gKiA8Y29kZT5TZWN1cml0eU1hbmFnZXI8L2NvZGU+LgorICoge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0uCiAgKiAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIExvZ2dpbmdQZXJtaXNzaW9uIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIGltcGxlbWVudHMgR3VhcmQsCkBAIC00MywxNCArNDMsMjAgQEAKICAgICAgKi8KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5Mb2dnaW5nUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0IHJlcXVpcmVkIHRvIGNvbnRyb2wKLSAgICAgKiB0aGUgbG9nZ2luZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIExvZ2dpbmdQZXJtaXNzaW9ufSBvYmplY3QgcmVxdWlyZWQgdG8gY29udHJvbCB0aGUKKyAgICAgKiBsb2dnaW5nLiBUaGUge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gY2hlY2tzIHRoZSBwZXJtaXNzaW9ucy4KKyAgICAgKiA8cD4KKyAgICAgKiB7QGNvZGUgTG9nZ2luZ1Blcm1pc3Npb259IG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIHNlY3VyaXR5IHBvbGljeSBjb2RlCisgICAgICogYW5kIGRlcGVuZHMgb24gdGhlIHNlY3VyaXR5IHBvbGljeSBmaWxlLCB0aGVyZWZvcmUgcHJvZ3JhbW1lcnMgc2hvdWxkbid0CisgICAgICogbm9ybWFsbHkgdXNlIHRoZW0gZGlyZWN0bHkuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBDdXJyZW50bHkgbXVzdCBiZSAiY29udHJvbCIuCisgICAgICogICAgICAgICAgICBjdXJyZW50bHkgbXVzdCBiZSAiY29udHJvbCIuCiAgICAgICogQHBhcmFtIGFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIEN1cnJlbnRseSBtdXN0IGJlIGVpdGhlciA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgZW1wdHkKLSAgICAgKiAgICAgICAgICAgIHN0cmluZy4KKyAgICAgKiAgICAgICAgICAgIGN1cnJlbnRseSBtdXN0IGJlIGVpdGhlciB7QGNvZGUgbnVsbH0gb3IgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5hbWUgbnVsbCBvciBkaWZmZXJlbnQgZnJvbSB7QGNvZGUgc3RyaW5nfSBjb250cm9sLgogICAgICAqLwogICAgIHB1YmxpYyBMb2dnaW5nUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKICAgICAgICAgc3VwZXIobmFtZSwgYWN0aW9ucyk7CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTWVtb3J5SGFuZGxlci5qYXZhIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL01lbW9yeUhhbmRsZXIuamF2YQppbmRleCBjYTk2ZGM1Li5jMWU4NjcwIDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTWVtb3J5SGFuZGxlci5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9NZW1vcnlIYW5kbGVyLmphdmEKQEAgLTI0LDQ2ICsyNCw0NyBAQAogCiAKIC8qKgotICogQSA8Y29kZT5IYW5kbGVyPC9jb2RlPiBwdXQgdGhlIGRlc2NyaXB0aW9uIG9mIGxvZyBldmVudHMgaW50byBhIGN5Y2xlZCBtZW1vcnkgCisgKiBBIHtAY29kZSBIYW5kbGVyfSBwdXQgdGhlIGRlc2NyaXB0aW9uIG9mIGxvZyBldmVudHMgaW50byBhIGN5Y2xlZCBtZW1vcnkKICAqIGJ1ZmZlci4KLSAqIDxwPiAKLSAqIE1vc3RseSB0aGlzIDxjb2RlPk1lbW9yeUhhbmRsZXI8L2NvZGU+IGp1c3QgcHV0cyB0aGUgZ2l2ZW4gPGNvZGU+TG9nUmVjb3JkPC9jb2RlPgotICogaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyIGFuZCBkb2Vzbid0IHBlcmZvcm0gYW55IGZvcm1hdHRpbmcgb3IgYW55IG90aGVyIHByb2Nlc3MuCi0gKiBXaGVuIHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIGVhcmxpZXN0IGJ1ZmZlcmVkIHJlY29yZHMgd2lsbCBiZSBkaXNjYXJkZWQuICAKKyAqIDxwPgorICogTW9zdGx5IHRoaXMge0Bjb2RlIE1lbW9yeUhhbmRsZXJ9IGp1c3QgcHV0cyB0aGUgZ2l2ZW4ge0Bjb2RlIExvZ1JlY29yZH0gaW50bworICogdGhlIGludGVybmFsIGJ1ZmZlciBhbmQgZG9lc24ndCBwZXJmb3JtIGFueSBmb3JtYXR0aW5nIG9yIGFueSBvdGhlciBwcm9jZXNzLgorICogV2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHRoZSBlYXJsaWVzdCBidWZmZXJlZCByZWNvcmRzIHdpbGwgYmUgZGlzY2FyZGVkLgogICogPC9wPgogICogPHA+Ci0gKiBFdmVyeSA8Y29kZT5NZW1vcnlIYW5kbGVyPC9jb2RlPiBoYXMgYSB0YXJnZXQgaGFuZGxlciwgYW5kIHB1c2ggYWN0aW9uIGNhbiBiZSAKLSAqIHRyaWdnZXJlZCBzbyB0aGF0IGFsbCBidWZmZXJlZCByZWNvcmRzIHdpbGwgYmUgb3V0cHV0IHRvIHRoZSB0YXJnZXQgaGFuZGxlciAKLSAqIGFuZCBub3JtYWxseSB0aGUgbGF0dGVyIHdpbGwgcHVibGlzaCB0aGUgcmVjb3Jkcy4gQWZ0ZXIgdGhlIHB1c2ggYWN0aW9uLCB0aGUgCi0gKiBidWZmZXIgd2lsbCBiZSBjbGVhcmVkLiAgICAKKyAqIEV2ZXJ5IHtAY29kZSBNZW1vcnlIYW5kbGVyfSBoYXMgYSB0YXJnZXQgaGFuZGxlciwgYW5kIHB1c2ggYWN0aW9uIGNhbiBiZQorICogdHJpZ2dlcmVkIHNvIHRoYXQgYWxsIGJ1ZmZlcmVkIHJlY29yZHMgd2lsbCBiZSBvdXRwdXQgdG8gdGhlIHRhcmdldCBoYW5kbGVyCisgKiBhbmQgbm9ybWFsbHkgdGhlIGxhdHRlciB3aWxsIHB1Ymxpc2ggdGhlIHJlY29yZHMuIEFmdGVyIHRoZSBwdXNoIGFjdGlvbiwgdGhlCisgKiBidWZmZXIgd2lsbCBiZSBjbGVhcmVkLgogICogPC9wPgogICogPHA+CiAgKiBUaGUgcHVzaCBhY3Rpb24gY2FuIGJlIHRyaWdnZXJlZCBpbiB0aHJlZSB3YXlzOgogICogPHVsPgogICogPGxpPlRoZSBwdXNoIG1ldGhvZCBpcyBjYWxsZWQgZXhwbGljaXRseTwvbGk+Ci0gKiA8bGk+V2hlbiBhIG5ldyA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+IGlzIHB1dCBpbnRvIHRoZSBpbnRlcm5hbCBidWZmZXIsIGFuZCBpdCBoYXMgYSBsZXZlbCB3aGljaCBpcyBub3QgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgcHVzaCBsZXZlbC48L2xpPgotICogPGxpPkEgc3ViY2xhc3MgZXh0ZW5kcyB0aGlzIDxjb2RlPk1lbW9yeUhhbmRsZXI8L2NvZGU+IGFuZCBjYWxsIHB1c2ggbWV0aG9kIGltcGxpY2l0bHkgYWNjb3JkaW5nIHRvIHNvbWUgY3JpdGVyaWEuPC9saT4KKyAqIDxsaT5XaGVuIGEgbmV3IHtAY29kZSBMb2dSZWNvcmR9IGlzIHB1dCBpbnRvIHRoZSBpbnRlcm5hbCBidWZmZXIsIGFuZCBpdCBoYXMKKyAqIGEgbGV2ZWwgd2hpY2ggaXMgbm90IGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHB1c2ggbGV2ZWwuPC9saT4KKyAqIDxsaT5BIHN1YmNsYXNzIGV4dGVuZHMgdGhpcyB7QGNvZGUgTWVtb3J5SGFuZGxlcn0gYW5kIGNhbGwgcHVzaCBtZXRob2QKKyAqIGltcGxpY2l0bHkgYWNjb3JkaW5nIHRvIHNvbWUgY3JpdGVyaWEuPC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CiAgKiA8cD4KLSAqIDxjb2RlPk1lbW9yeUhhbmRsZXI8L2NvZGU+IHdpbGwgcmVhZCBmb2xsb3dpbmcgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gCi0gKiBwcm9wZXJ0aWVzIGZvciBpbml0aWFsaXphdGlvbiwgaWYgZ2l2ZW4gcHJvcGVydGllcyBhcmUgbm90IGRlZmluZWQgb3IgaGFzIAotICogaW52YWxpZCB2YWx1ZXMsIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLgorICoge0Bjb2RlIE1lbW9yeUhhbmRsZXJ9IHdpbGwgcmVhZCBmb2xsb3dpbmcge0Bjb2RlIExvZ01hbmFnZXJ9IHByb3BlcnRpZXMgZm9yCisgKiBpbml0aWFsaXphdGlvbiwgaWYgZ2l2ZW4gcHJvcGVydGllcyBhcmUgbm90IGRlZmluZWQgb3IgaGFzIGludmFsaWQgdmFsdWVzLAorICogZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuCiAgKiA8dWw+Ci0gKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuTWVtb3J5SGFuZGxlci5sZXZlbCBzcGVjaWZpZXMgdGhlIGxldmVsIGZvciB0aGlzIAotICogPGNvZGU+SGFuZGxlcjwvY29kZT4sIGRlZmF1bHRzIHRvIDxjb2RlPkxldmVsLkFMTDwvY29kZT4uPC9saT4KLSAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5NZW1vcnlIYW5kbGVyLmZpbHRlciBzcGVjaWZpZXMgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4gCi0gKiBjbGFzcyBuYW1lLCBkZWZhdWx0cyB0byBubyA8Y29kZT5GaWx0ZXI8L2NvZGU+LjwvbGk+Ci0gKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuTWVtb3J5SGFuZGxlci5zaXplIHNwZWNpZmllcyB0aGUgYnVmZmVyIHNpemUgaW4gbnVtYmVyIAotICogb2YgPGNvZGU+TG9nUmVjb3JkPC9jb2RlPiwgZGVmYXVsdHMgdG8gMTAwMC48L2xpPgotICogPGxpPmphdmEudXRpbC5sb2dnaW5nLk1lbW9yeUhhbmRsZXIucHVzaCBzcGVjaWZpZXMgdGhlIHB1c2ggbGV2ZWwsIGRlZmF1bHRzIAorICogPGxpPmphdmEudXRpbC5sb2dnaW5nLk1lbW9yeUhhbmRsZXIubGV2ZWwgc3BlY2lmaWVzIHRoZSBsZXZlbCBmb3IgdGhpcworICoge0Bjb2RlIEhhbmRsZXJ9LCBkZWZhdWx0cyB0byB7QGNvZGUgTGV2ZWwuQUxMfS48L2xpPgorICogPGxpPmphdmEudXRpbC5sb2dnaW5nLk1lbW9yeUhhbmRsZXIuZmlsdGVyIHNwZWNpZmllcyB0aGUge0Bjb2RlIEZpbHRlcn0KKyAqIGNsYXNzIG5hbWUsIGRlZmF1bHRzIHRvIG5vIHtAY29kZSBGaWx0ZXJ9LjwvbGk+CisgKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuTWVtb3J5SGFuZGxlci5zaXplIHNwZWNpZmllcyB0aGUgYnVmZmVyIHNpemUgaW4gbnVtYmVyCisgKiBvZiB7QGNvZGUgTG9nUmVjb3JkfSwgZGVmYXVsdHMgdG8gMTAwMC48L2xpPgorICogPGxpPmphdmEudXRpbC5sb2dnaW5nLk1lbW9yeUhhbmRsZXIucHVzaCBzcGVjaWZpZXMgdGhlIHB1c2ggbGV2ZWwsIGRlZmF1bHRzCiAgKiB0byBsZXZlbC5TRVZFUkUuPC9saT4KLSAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5NZW1vcnlIYW5kbGVyLnRhcmdldCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIHRoZSB0YXJnZXQgCi0gKiA8Y29kZT5IYW5kbGVyPC9jb2RlPiwgbm8gZGVmYXVsdCB2YWx1ZSwgd2hpY2ggbWVhbnMgdGhpcyBwcm9wZXJ0eSBtdXN0IGJlIAotICogc3BlY2lmaWVkIGVpdGhlciBieSBwcm9wZXJ0eSBzZXR0aW5nIG9yIGJ5IGNvbnN0cnVjdG9yLjwvbGk+IAorICogPGxpPmphdmEudXRpbC5sb2dnaW5nLk1lbW9yeUhhbmRsZXIudGFyZ2V0IHNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgdGhlIHRhcmdldAorICoge0Bjb2RlIEhhbmRsZXJ9LCBubyBkZWZhdWx0IHZhbHVlLCB3aGljaCBtZWFucyB0aGlzIHByb3BlcnR5IG11c3QgYmUKKyAqIHNwZWNpZmllZCBlaXRoZXIgYnkgcHJvcGVydHkgc2V0dGluZyBvciBieSBjb25zdHJ1Y3Rvci48L2xpPgogICogPC91bD4KICAqIDwvcD4KLSAqIAogICovCiBwdWJsaWMgY2xhc3MgTWVtb3J5SGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewogCkBAIC04OCw4ICs4OSwxMiBAQAogICAgIHByaXZhdGUgaW50IGN1cnNvcjsKICAgICAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBjb25zdHJ1Y3QgYW5kIGluaXQgYSA8Y29kZT5NZW1vcnlIYW5kbGVyPC9jb2RlPiB1c2luZyAKLSAgICAgKiA8Y29kZT5Mb2dNYW5hZ2VyPC9jb2RlPiBwcm9wZXJ0aWVzIG9yIGRlZmF1bHQgdmFsdWVzCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgY29uc3RydWN0IGFuZCBpbml0IGEge0Bjb2RlIE1lbW9yeUhhbmRsZXJ9IHVzaW5nCisgICAgICoge0Bjb2RlIExvZ01hbmFnZXJ9IHByb3BlcnRpZXMgb3IgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcHJvcGVydHkgdmFsdWUgYXJlIGludmFsaWQgYW5kIG5vIGRlZmF1bHQgdmFsdWUgY291bGQgYmUKKyAgICAgKiAgICAgICAgICAgICB1c2VkLgogICAgICAqLwogICAgIHB1YmxpYyBNZW1vcnlIYW5kbGVyKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtMTM5LDE3ICsxNDQsMjIgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGFuZCBpbml0IGEgPGNvZGU+TWVtb3J5SGFuZGxlcjwvY29kZT4gdXNpbmcgZ2l2ZW4gdGFyZ2V0LCBzaXplIAotICAgICAqIGFuZCBwdXNoIGxldmVsLCBvdGhlciBwcm9wZXJ0aWVzIHVzaW5nIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+IHByb3BlcnRpZXMKLSAgICAgKiBvciBkZWZhdWx0IHZhbHVlcworICAgICAqIENvbnN0cnVjdCBhbmQgaW5pdCBhIHtAY29kZSBNZW1vcnlIYW5kbGVyfSB1c2luZyBnaXZlbiB0YXJnZXQsIHNpemUgYW5kCisgICAgICogcHVzaCBsZXZlbCwgb3RoZXIgcHJvcGVydGllcyB1c2luZyB7QGNvZGUgTG9nTWFuYWdlcn0gcHJvcGVydGllcyBvcgorICAgICAqIGRlZmF1bHQgdmFsdWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPkhhbmRsZXI8L2NvZGU+IHRvIG91dHB1dAotICAgICAqIEBwYXJhbSBzaXplICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJlZCA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4ge0Bjb2RlIEhhbmRsZXJ9IHRvIG91dHB1dAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVyZWQge0Bjb2RlIExvZ1JlY29yZH0sIGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAgemVybwogICAgICAqIEBwYXJhbSBwdXNoTGV2ZWwKLSAgICAgKiAgICAgICAgICAgICAgICAgdGhlIHB1c2ggbGV2ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwdXNoIGxldmVsCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgc2l6ZTw9MAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzaXplfTw9MAorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHByb3BlcnR5IHZhbHVlIGFyZSBpbnZhbGlkIGFuZCBubyBkZWZhdWx0IHZhbHVlIGNvdWxkIGJlCisgICAgICogICAgICAgICAgICAgdXNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgTWVtb3J5SGFuZGxlcihIYW5kbGVyIHRhcmdldCwgaW50IHNpemUsIExldmVsIHB1c2hMZXZlbCkgewogICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7CkBAIC0xNjYsMTEgKzE3NiwxMSBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIGhhbmRsZXIgYW5kIHRhcmdldCBoYW5kbGVyLCBmcmVlIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcworICAgICAqIENsb3NlIHRoaXMgaGFuZGxlciBhbmQgdGFyZ2V0IGhhbmRsZXIsIGZyZWUgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgCi0gICAgICogICAgICAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNvbnRyb2wgdGhpcyBoYW5kbGVyCisgICAgICogICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjb250cm9sIHRoaXMgaGFuZGxlci4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKQEAgLTE4MCwxMCArMTkwLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYWxsIHRhcmdldCBoYW5kbGVyIHRvIGZsdXNoIGFueSBidWZmZXJlZCBvdXRwdXQuCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBjYXVzZSB0aGlzIDxjb2RlPk1lbW9yeUhhbmRsZXI8L2NvZGU+IHRvIHB1c2guCi0gICAgICogCisgICAgICogQ2FsbCB0YXJnZXQgaGFuZGxlciB0byBmbHVzaCBhbnkgYnVmZmVyZWQgb3V0cHV0LiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0CisgICAgICogY2F1c2UgdGhpcyB7QGNvZGUgTWVtb3J5SGFuZGxlcn0gdG8gcHVzaC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKQEAgLTE5MSwxNCArMTk5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHV0IGEgZ2l2ZW4gPGNvZGU+TG9nUmVjb3JkPC9jb2RlPiBpbnRvIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKiBQdXQgYSBnaXZlbiB7QGNvZGUgTG9nUmVjb3JkfSBpbnRvIGludGVybmFsIGJ1ZmZlci4gSWYgZ2l2ZW4gcmVjb3JkIGlzCisgICAgICogbm90IGxvZ2dhYmxlLCBqdXN0IHJldHVybi4gT3RoZXJ3aXNlIGl0IGlzIHN0b3JlZCBpbiB0aGUgYnVmZmVyLgorICAgICAqIEZ1cnRoZXJtb3JlIGlmIHRoZSByZWNvcmQncyBsZXZlbCBpcyBub3QgbGVzcyB0aGFuIHRoZSBwdXNoIGxldmVsLCB0aGUKKyAgICAgKiBwdXNoIGFjdGlvbiBpcyB0cmlnZ2VyZWQgdG8gb3V0cHV0IGFsbCB0aGUgYnVmZmVyZWQgcmVjb3JkcyB0byB0aGUgdGFyZ2V0CisgICAgICogaGFuZGxlciwgYW5kIHRoZSB0YXJnZXQgaGFuZGxlciB3aWxsIHB1Ymxpc2ggdGhlbS4KICAgICAgKiAKLSAgICAgKiBJZiBnaXZlbiByZWNvcmQgaXMgbm90IGxvZ2dhYmxlLCBqdXN0IHJldHVybi4gT3RoZXJ3aXNlIGl0IGlzIHN0b3JlZCBpbiAKLSAgICAgKiB0aGUgYnVmZmVyLiBGdXJ0aGVybW9yZSBpZiB0aGUgcmVjb3JkJ3MgbGV2ZWwgaXMgbm90IGxlc3MgdGhhbiB0aGUgcHVzaAotICAgICAqIGxldmVsLCB0aGUgcHVzaCBhY3Rpb24gaXMgdHJpZ2dlcmVkIHRvIG91dHB1dCBhbGwgdGhlIGJ1ZmZlcmVkIHJlY29yZHMgCi0gICAgICogdG8gdGhlIHRhcmdldCBoYW5kbGVyLCBhbmQgdGhlIHRhcmdldCBoYW5kbGVyIHdpbGwgcHVibGlzaCB0aGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWNvcmQgdGhlIGxvZyByZWNvcmQuCisgICAgICogQHBhcmFtIHJlY29yZAorICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHVibGlzaChMb2dSZWNvcmQgcmVjb3JkKSB7CkBAIC0yMjUsMTkgKzIzMywyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPkNoZWNrIGlmIGdpdmVuIDxjb2RlPkxvZ1JlY29yZDwvY29kZT4gd291bGQgYmUgcHV0IGludG8gdGhpcyAKLSAgICAgKiA8Y29kZT5NZW1vcnlIYW5kbGVyPC9jb2RlPidzIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBDaGVjayBpZiBnaXZlbiB7QGNvZGUgTG9nUmVjb3JkfSB3b3VsZCBiZSBwdXQgaW50byB0aGlzCisgICAgICoge0Bjb2RlIE1lbW9yeUhhbmRsZXJ9J3MgaW50ZXJuYWwgYnVmZmVyLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZ2l2ZW4gPGNvZGU+TG9nUmVjb3JkPC9jb2RlPiBpcyBsb2dnYWJsZSBpZiBhbmQgb25seSBpZiBpdCBoYXMgCi0gICAgICogYXBwcm9wcmlhdGUgbGV2ZWwgYW5kIGl0IHBhc3MgYW55IGFzc29jaWF0ZWQgZmlsdGVyJ3MgY2hlY2suIAorICAgICAqIFRoZSBnaXZlbiB7QGNvZGUgTG9nUmVjb3JkfSBpcyBsb2dnYWJsZSBpZiBhbmQgb25seSBpZiBpdCBoYXMgYXBwcm9wcmlhdGUKKyAgICAgKiBsZXZlbCBhbmQgaXQgcGFzcyBhbnkgYXNzb2NpYXRlZCBmaWx0ZXIncyBjaGVjay4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwdXNoIGxldmVsIGlzIG5vdCB1c2VkIGZvciB0aGlzIGNoZWNrLiAKKyAgICAgKiBOb3RlIHRoYXQgdGhlIHB1c2ggbGV2ZWwgaXMgbm90IHVzZWQgZm9yIHRoaXMgY2hlY2suCiAgICAgICogPC9wPgorICAgICAqIAogICAgICAqIEBwYXJhbSByZWNvcmQKLSAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPkxvZ1JlY29yZDwvY29kZT4KLSAgICAgKiBAcmV0dXJuICAgICAgICAgaWYgdGhlIGdpdmVuIDxjb2RlPkxvZ1JlY29yZDwvY29kZT4gc2hvdWxkIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIHtAY29kZSBMb2dSZWNvcmR9CisgICAgICogQHJldHVybiB0aGUgZ2l2ZW4ge0Bjb2RlIExvZ1JlY29yZH0gaWYgaXQgc2hvdWxkIGJlIGxvZ2dlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgaWYge0Bjb2RlIExvZ1JlY29yZH0gaXMge0Bjb2RlIG51bGx9LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTG9nZ2FibGUoTG9nUmVjb3JkIHJlY29yZCkgewpAQCAtMjY2LDE1ICsyNzcsMTUgQEAKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgcHVzaCBsZXZlbC4gVGhlIHB1c2ggbGV2ZWwgaXMgdXNlZCB0byBjaGVjayB0aGUgcHVzaCBhY3Rpb24gCi0gICAgICogdHJpZ2dlcmluZy4gV2hlbiBhIG5ldyA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+IGlzIHB1dCBpbnRvIHRoZSBpbnRlcm5hbAorICAgICAqIHRyaWdnZXJpbmcuIFdoZW4gYSBuZXcge0Bjb2RlIExvZ1JlY29yZH0gaXMgcHV0IGludG8gdGhlIGludGVybmFsCiAgICAgICogYnVmZmVyIGFuZCBpdHMgbGV2ZWwgaXMgbm90IGxlc3MgdGhhbiB0aGUgcHVzaCBsZXZlbCwgdGhlIHB1c2ggYWN0aW9uIAogICAgICAqIHdpbGwgYmUgdHJpZ2dlcmVkLiBOb3RlIHRoYXQgc2V0IG5ldyBwdXNoIGxldmVsIHdvbid0IHRyaWdnZXIgcHVzaCBhY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld0xldmVsCi0gICAgICogICAgICAgICAgICAgICAgIHRoZSBuZXcgbGV2ZWwgdG8gc2V0CisgICAgICogICAgICAgICAgICAgICAgIHRoZSBuZXcgbGV2ZWwgdG8gc2V0LgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICAgaWYgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRldGVybWluZXMgdGhhdCBjYWxsZXIgCi0gICAgICogICAgICAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNvbnRyb2wgdGhpcyBoYW5kbGVyCisgICAgICogICAgICAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNvbnRyb2wgdGhpcyBoYW5kbGVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFB1c2hMZXZlbChMZXZlbCBuZXdMZXZlbCkgewogICAgICAgICBtYW5hZ2VyLmNoZWNrQWNjZXNzKCk7CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvU2ltcGxlRm9ybWF0dGVyLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvU2ltcGxlRm9ybWF0dGVyLmphdmEKaW5kZXggY2ZjY2RhMC4uMTU5NTc5NiAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL1NpbXBsZUZvcm1hdHRlci5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9TaW1wbGVGb3JtYXR0ZXIuamF2YQpAQCAtMjQsMTkgKzI0LDI5IEBACiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiAKIC8qKgotICogPGNvZGU+U2ltcGxlRm9ybWF0dGVyPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBwcmludCBhIHN1bW1hcnkgb2YgdGhlCi0gKiBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gYSA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+IG9iamVjdCBpbiBhIGh1bWFuCi0gKiByZWFkYWJsZSBmb3JtYXQuCi0gKiAKKyAqIHtAY29kZSBTaW1wbGVGb3JtYXR0ZXJ9IGNhbiBiZSB1c2VkIHRvIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgaW5mb3JtYXRpb24KKyAqIGNvbnRhaW5lZCBpbiBhIHtAY29kZSBMb2dSZWNvcmR9IG9iamVjdCBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU2ltcGxlRm9ybWF0dGVyIGV4dGVuZHMgRm9ybWF0dGVyIHsKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+U2ltcGxlRm9ybWF0dGVyPC9jb2RlPiBvYmplY3QuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU2ltcGxlRm9ybWF0dGVyfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2ltcGxlRm9ybWF0dGVyKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEge0BsaW5rIExvZ1JlY29yZH0gb2JqZWN0IGludG8gYSBodW1hbiByZWFkYWJsZSBzdHJpbmcKKyAgICAgKiByZXByZXNlbnRhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgZm9ybWF0dGVkIGludG8gYSBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChMb2dSZWNvcmQgcikgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Tb2NrZXRIYW5kbGVyLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvU29ja2V0SGFuZGxlci5qYXZhCmluZGV4IDNkOWFiMjkuLjg2MjYwMDcgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9Tb2NrZXRIYW5kbGVyLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL1NvY2tldEhhbmRsZXIuamF2YQpAQCAtMzEsMTggKzMxLDE4IEBACiAgKiBpbml0aWFsaXplIGl0c2VsZjoKICAqIDx1bD4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCBzcGVjaWZpZXMgdGhlIGxvZ2dpbmcgbGV2ZWwsCi0gKiBkZWZhdWx0cyB0byA8Y29kZT5MZXZlbC5BTEw8L2NvZGU+IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbgotICogaW52YWxpZCB2YWx1ZTsKKyAqIGRlZmF1bHRzIHRvIHtAY29kZSBMZXZlbC5BTEx9IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkCisgKiB2YWx1ZS4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmZpbHRlciBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbHRlcgotICogY2xhc3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciwgZGVmYXVsdHMgdG8gPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAqIHRoaXMgcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlOworICogY2xhc3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciwgZGVmYXVsdHMgdG8ge0Bjb2RlIG51bGx9IGlmIHRoaXMKKyAqIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvciBoYXMgYW4gaW52YWxpZCB2YWx1ZS4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmZvcm1hdHRlciBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlCiAgKiBmb3JtYXR0ZXIgY2xhc3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciwgZGVmYXVsdHMgdG8KLSAqIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLlhNTEZvcm1hdHRlcjwvY29kZT4gaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZm91bmQKLSAqIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlOworICoge0Bjb2RlIGphdmEudXRpbC5sb2dnaW5nLlhNTEZvcm1hdHRlcn0gaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZm91bmQgb3IgaGFzCisgKiBhbiBpbnZhbGlkIHZhbHVlLgogICogPGxpPmphdmEudXRpbC5sb2dnaW5nLlNvY2tldEhhbmRsZXIuZW5jb2Rpbmcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB0aGlzCi0gKiBoYW5kbGVyIHdpbGwgdXNlIHRvIGVuY29kZSBsb2cgbWVzc2FnZXMsIGRlZmF1bHRzIHRvIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gKiB0aGlzIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvciBoYXMgYW4gaW52YWxpZCB2YWx1ZS4KKyAqIGhhbmRsZXIgd2lsbCB1c2UgdG8gZW5jb2RlIGxvZyBtZXNzYWdlcywgZGVmYXVsdHMgdG8ge0Bjb2RlIG51bGx9IGlmIHRoaXMKKyAqIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvciBoYXMgYW4gaW52YWxpZCB2YWx1ZS4KICAqIDxsaT5qYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmhvc3Qgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBob3N0IHRoYXQKICAqIHRoaXMgaGFuZGxlciBzaG91bGQgY29ubmVjdCB0by4gVGhlcmUncyBubyBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LgogICogPGxpPmphdmEudXRpbC5sb2dnaW5nLlNvY2tldEhhbmRsZXIuZW5jb2Rpbmcgc3BlY2lmaWVzIHRoZSBwb3J0IG51bWJlciB0aGF0CkBAIC01Niw3ICs1Niw2IEBACiAgKiA8cD4KICAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLgogICogPC9wPgotICogCiAgKi8KIHB1YmxpYyBjbGFzcyBTb2NrZXRIYW5kbGVyIGV4dGVuZHMgU3RyZWFtSGFuZGxlciB7CiAgICAgLy8gZGVmYXVsdCBsZXZlbApAQCAtNjksMTUgKzY4LDE2IEBACiAgICAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPlNvY2tldEhhbmRsZXI8L2NvZGU+IG9iamVjdCB1c2luZyB0aGUgcHJvcGVydGllcwotICAgICAqIHJlYWQgYnkgdGhlIGxvZyBtYW5hZ2VyLCBpbmNsdWRpbmcgdGhlIGhvc3QgbmFtZSBhbmQgcG9ydCBudW1iZXIuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBTb2NrZXRIYW5kbGVyfSBvYmplY3QgdXNpbmcgdGhlIHByb3BlcnRpZXMgcmVhZCBieQorICAgICAqIHRoZSBsb2cgbWFuYWdlciwgaW5jbHVkaW5nIHRoZSBob3N0IG5hbWUgYW5kIHBvcnQgbnVtYmVyLiBEZWZhdWx0CisgICAgICogZm9ybWF0dGluZyB1c2VzIHRoZSBYTUxGb3JtYXR0ZXIgY2xhc3MgYW5kIGxldmVsIGlzIHNldCB0byBBTEwuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KKyAgICAgKiAgICAgICAgICAgICBpZiBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgaG9zdCBuYW1lIG9yIHBvcnQgbnVtYmVyIGlzIGlsbGVnYWwuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGhvc3QgbmFtZSBvciBwb3J0IG51bWJlciBpcyBpbGxlZ2FsLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKICAgICAgKiAgICAgICAgICAgICBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIHRvIGNvbnRyb2wgdGhpcyBoYW5kbGVyLgogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXRIYW5kbGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTg5LDIwICs4OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5Tb2NrZXRIYW5kbGVyPC9jb2RlPiBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCBob3N0Ci0gICAgICogbmFtZSBhbmQgcG9ydCBudW1iZXIgdG9nZXRoZXIgd2l0aCBvdGhlciBwcm9wZXJ0aWVzIHJlYWQgYnkgdGhlIGxvZwotICAgICAqIG1hbmFnZXIuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBTb2NrZXRIYW5kbGVyfSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCBob3N0IG5hbWUKKyAgICAgKiBhbmQgcG9ydCBudW1iZXIgdG9nZXRoZXIgd2l0aCBvdGhlciBwcm9wZXJ0aWVzIHJlYWQgYnkgdGhlIGxvZyBtYW5hZ2VyLgorICAgICAqIERlZmF1bHQgZm9ybWF0dGluZyB1c2VzIHRoZSBYTUxGb3JtYXR0ZXIgY2xhc3MgYW5kIGxldmVsIGlzIHNldCB0byBBTEwuCiAgICAgICogCiAgICAgICogQHBhcmFtIGhvc3QKICAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUKICAgICAgKiBAcGFyYW0gcG9ydAogICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KKyAgICAgKiAgICAgICAgICAgICBpZiBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgaG9zdCBuYW1lIG9yIHBvcnQgbnVtYmVyIGlzIGlsbGVnYWwuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGhvc3QgbmFtZSBvciBwb3J0IG51bWJlciBpcyBpbGxlZ2FsLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKICAgICAgKiAgICAgICAgICAgICBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIHRvIGNvbnRyb2wgdGhpcyBoYW5kbGVyLgogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXRIYW5kbGVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgICAqIExvZ3MgYSByZWNvcmQgaWYgbmVjZXNzYXJ5LiBBIGZsdXNoIG9wZXJhdGlvbiB3aWxsIGJlIGRvbmUgYWZ0ZXJ3YXJkcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVjb3JkCi0gICAgICogICAgICAgICAgICB0aGUgbG9nIHJlY29yZCB0byBiZSBsb2dnZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2cgcmVjb3JkIHRvIGJlIGxvZ2dlZC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKExvZ1JlY29yZCByZWNvcmQpIHsKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9TdHJlYW1IYW5kbGVyLmphdmEgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvU3RyZWFtSGFuZGxlci5qYXZhCmluZGV4IGZiNDhjMmEuLmVlMTIxOTAgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9TdHJlYW1IYW5kbGVyLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL1N0cmVhbUhhbmRsZXIuamF2YQpAQCAtMjYsMzEgKzI2LDMyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEEgPGNvZGU+U3RyZWFtSGFuZGxlcjwvY29kZT4gb2JqZWN0IHdyaXRlcyBsb2cgbWVzc2FnZXMgdG8gYW4gb3V0cHV0Ci0gKiBzdHJlYW0sIHRoYXQgaXMsIG9iamVjdHMgb2YgdGhlIGNsYXNzIDxjb2RlPmphdmEuaW8uT3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAqIEEge0Bjb2RlIFN0cmVhbUhhbmRsZXJ9IG9iamVjdCB3cml0ZXMgbG9nIG1lc3NhZ2VzIHRvIGFuIG91dHB1dCBzdHJlYW0sIHRoYXQKKyAqIGlzLCBvYmplY3RzIG9mIHRoZSBjbGFzcyB7QGxpbmsgamF2YS5pby5PdXRwdXRTdHJlYW19LgogICogPHA+Ci0gKiBBIDxjb2RlPlN0cmVhbUhhbmRsZXI8L2NvZGU+IG9iamVjdCByZWFkcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0aGUKLSAqIGxvZyBtYW5hZ2VyIHRvIGluaXRpYWxpemUgaXRzZWxmOgorICogQSB7QGNvZGUgU3RyZWFtSGFuZGxlcn0gb2JqZWN0IHJlYWRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBsb2cKKyAqIG1hbmFnZXIgdG8gaW5pdGlhbGl6ZSBpdHNlbGY6CiAgKiA8dWw+CiAgKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuU3RyZWFtSGFuZGxlci5sZXZlbCBzcGVjaWZpZXMgdGhlIGxvZ2dpbmcgbGV2ZWwsCi0gKiBkZWZhdWx0cyB0byA8Y29kZT5MZXZlbC5JTkZPPC9jb2RlPiBpZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvciBoYXMgYW4KLSAqIGludmFsaWQgdmFsdWU7CisgKiBkZWZhdWx0cyB0byB7QGNvZGUgTGV2ZWwuSU5GT30gaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZm91bmQgb3IgaGFzIGFuCisgKiBpbnZhbGlkIHZhbHVlLgogICogPGxpPmphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXIuZmlsdGVyIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZmlsdGVyCi0gKiBjbGFzcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBoYW5kbGVyLCBkZWZhdWx0cyB0byA8Y29kZT5udWxsPC9jb2RlPiBpZgotICogdGhpcyBwcm9wZXJ0eSBpcyBub3QgZm91bmQgb3IgaGFzIGFuIGludmFsaWQgdmFsdWU7CisgKiBjbGFzcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBoYW5kbGVyLCBkZWZhdWx0cyB0byB7QGNvZGUgbnVsbH0gaWYgdGhpcworICogcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLgogICogPGxpPmphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXIuZm9ybWF0dGVyIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUKICAqIGZvcm1hdHRlciBjbGFzcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBoYW5kbGVyLCBkZWZhdWx0cyB0bwotICogPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyPC9jb2RlPiBpZiB0aGlzIHByb3BlcnR5IGlzIG5vdAotICogZm91bmQgb3IgaGFzIGFuIGludmFsaWQgdmFsdWU7CisgKiB7QGNvZGUgamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyfSBpZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvcgorICogaGFzIGFuIGludmFsaWQgdmFsdWUuCiAgKiA8bGk+amF2YS51dGlsLmxvZ2dpbmcuU3RyZWFtSGFuZGxlci5lbmNvZGluZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHRoaXMKLSAqIGhhbmRsZXIgd2lsbCB1c2UgdG8gZW5jb2RlIGxvZyBtZXNzYWdlcywgZGVmYXVsdHMgdG8gPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAqIHRoaXMgcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLgorICogaGFuZGxlciB3aWxsIHVzZSB0byBlbmNvZGUgbG9nIG1lc3NhZ2VzLCBkZWZhdWx0cyB0byB7QGNvZGUgbnVsbH0gaWYgdGhpcworICogcHJvcGVydHkgaXMgbm90IGZvdW5kIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLgogICogPC91bD4KICAqIDwvcD4KICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCiAgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU3RyZWFtSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewogICAgIC8vIHRoZSBvdXRwdXQgc3RyZWFtIHRoaXMgaGFuZGxlciB3cml0ZXMgdG8KQEAgLTYzLDggKzY0LDEwIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHdyaXRlck5vdEluaXRpYWxpemVkOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPlN0cmVhbUhhbmRsZXI8L2NvZGU+IG9iamVjdC4gVGhlIG5ldyBzdHJlYW0gaGFuZGxlcgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgU3RyZWFtSGFuZGxlcn0gb2JqZWN0LiBUaGUgbmV3IHN0cmVhbSBoYW5kbGVyCiAgICAgICogZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIG91dHB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmVhbUhhbmRsZXIoKSB7CiAgICAgICAgIGluaXRQcm9wZXJ0aWVzKCJJTkZPIiwgbnVsbCwgImphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlciIsICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJApAQCAtNzUsMTEgKzc4LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPlN0cmVhbUhhbmRsZXI8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBzdXBwbGllZCBvdXRwdXQKKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIFN0cmVhbUhhbmRsZXJ9IG9iamVjdCB3aXRoIHRoZSBzdXBwbGllZCBvdXRwdXQKICAgICAgKiBzdHJlYW0uIERlZmF1bHQgcHJvcGVydGllcyBhcmUgcmVhZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtIHRoaXMgaGFuZGxlciB3cml0ZXMgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtIHRoaXMgaGFuZGxlciB3cml0ZXMgdG8uCiAgICAgICovCiAgICAgU3RyZWFtSGFuZGxlcihPdXRwdXRTdHJlYW0gb3MpIHsKICAgICAgICAgdGhpcygpOwpAQCAtODcsOCArOTAsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5TdHJlYW1IYW5kbGVyPC9jb2RlPiBvYmplY3QuIFNwZWNpZmllZCBkZWZhdWx0Ci0gICAgICogdmFsdWVzIHdpbGwgYmUgdXNlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGFyZSBmb3VuZCBpbiBsb2cKKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIFN0cmVhbUhhbmRsZXJ9IG9iamVjdC4gVGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlcworICAgICAqIHdpbGwgYmUgdXNlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGFyZSBub3QgZm91bmQgaW4gdGhlIGxvZwogICAgICAqIG1hbmFnZXIncyBwcm9wZXJ0aWVzLgogICAgICAqLwogICAgIFN0cmVhbUhhbmRsZXIoU3RyaW5nIGRlZmF1bHRMZXZlbCwgU3RyaW5nIGRlZmF1bHRGaWx0ZXIsCkBAIC0xMDEsMTMgKzEwNCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5TdHJlYW1IYW5kbGVyPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgc3VwcGxpZWQgb3V0cHV0Ci0gICAgICogc3RyZWFtIGFuZCBmb3JtYXR0ZXIuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBTdHJlYW1IYW5kbGVyfSBvYmplY3Qgd2l0aCB0aGUgc3VwcGxpZWQgb3V0cHV0IHN0cmVhbQorICAgICAqIGFuZCBmb3JtYXR0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9zCi0gICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbSB0aGlzIGhhbmRsZXIgd3JpdGVzIHRvCisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbSB0aGlzIGhhbmRsZXIgd3JpdGVzIHRvLgogICAgICAqIEBwYXJhbSBmb3JtYXR0ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXR0ZXIgdGhpcyBoYW5kbGVyIHVzZXMgdG8gZm9ybWF0IHRoZSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXR0ZXIgdGhpcyBoYW5kbGVyIHVzZXMgdG8gZm9ybWF0IHRoZSBvdXRwdXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvc30gb3Ige0Bjb2RlIGZvcm1hdHRlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJlYW1IYW5kbGVyKE91dHB1dFN0cmVhbSBvcywgRm9ybWF0dGVyIGZvcm1hdHRlcikgewogICAgICAgICB0aGlzKCk7CkBAIC0xNjYsMTMgKzE3MiwxNiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG91dHB1dCBzdHJlYW0gdGhpcyBoYW5kbGVyIHdyaXRlcyB0by4gSWYgdGhlcmUncyBhbiBleGlzdGluZwogICAgICAqIG91dHB1dCBzdHJlYW0sIHRoZSB0YWlsIHN0cmluZyBvZiB0aGUgYXNzb2NpYXRlZCBmb3JtYXR0ZXIgd2lsbCBiZQotICAgICAqIHdyaXR0ZW4gdG8gaXQuIFRoZW4gaXQgd2lsbCBiZSBmbHVzaGVkIGFuZCBjbG9zZWQuCisgICAgICogd3JpdHRlbiB0byBpdC4gVGhlbiBpdCB3aWxsIGJlIGZsdXNoZWQsIGNsb3NlZCBhbmQgcmVwbGFjZWQgd2l0aCAKKyAgICAgKiB7QGNvZGUgb3N9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcwotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBvdXRwdXQgc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG91dHB1dCBzdHJlYW0uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAogICAgICAqICAgICAgICAgICAgIGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvc30gaXMge0Bjb2RlIG51bGx9LgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MpIHsKICAgICAgICAgaWYgKG51bGwgPT0gb3MpIHsKQEAgLTE4NiwxNiArMTk1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgYnkgdGhpcyBoYW5kbGVyLiBBIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogdmFsdWUgaW5kaWNhdGVzIHRoZSB1c2luZyBvZiB0aGUgZGVmYXVsdCBlbmNvZGluZy4KKyAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCBieSB0aGlzIGhhbmRsZXIuIEEge0Bjb2RlIG51bGx9IHZhbHVlCisgICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgc2hvdWxkIGJlIHVzZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVuY29kaW5nCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBzZXQuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBkZXRlcm1pbmVzIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAogICAgICAqICAgICAgICAgICAgIGhhdmUgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24uCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwKQEAgLTIyMiwxMSArMjMyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2VzIHRoaXMgaGFuZGxlciwgYnV0IHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaXMgb25seSBjbG9zZWQgd2hlbgotICAgICAqIDxjb2RlPmNsb3NlU3RyZWFtPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gU2VjdXJpdHkgaXMgbm90IGNoZWNrZWQuCisgICAgICogQ2xvc2VzIHRoaXMgaGFuZGxlciwgYnV0IHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaXMgb25seSBjbG9zZWQgaWYKKyAgICAgKiB7QGNvZGUgY2xvc2VTdHJlYW19IGlzIHtAY29kZSB0cnVlfS4gU2VjdXJpdHkgaXMgbm90IGNoZWNrZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNsb3NlU3RyZWFtCi0gICAgICogICAgICAgICAgICB3aGV0aGVyIHRvIGNsb3NlIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gY2xvc2UgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbS4KICAgICAgKi8KICAgICB2b2lkIGNsb3NlKGJvb2xlYW4gY2xvc2VTdHJlYW0pIHsKICAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5vcykgewpAQCAtMjUxLDEzICsyNjEsMTQgQEAKIAogICAgIC8qKgogICAgICAqIENsb3NlcyB0aGlzIGhhbmRsZXIuIFRoZSB0YWlsIHN0cmluZyBvZiB0aGUgZm9ybWF0dGVyIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIHRoaXMgaGFuZGxlciB3aWxsIGJlIHdyaXR0ZW4gb3V0LiBBIGZsdXNoIG9wZXJhdGlvbiBhIHN1YnNlcXVlbnQgY2xvc2UKLSAgICAgKiBvcGVyYXRpb24gd2lsbCB0aGVuIGJlIHBlcmZvcm1lZCB1cG9uIHRoZSBvdXRwdXRzdHJlYW0uIENsaWVudAotICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHVzZSBhIGhhbmRsZXIgYWZ0ZXIgY2xvc2luZyBpdC4KKyAgICAgKiB0aGlzIGhhbmRsZXIgaXMgd3JpdHRlbiBvdXQuIEEgZmx1c2ggb3BlcmF0aW9uIGFuZCBhIHN1YnNlcXVlbnQgY2xvc2UKKyAgICAgKiBvcGVyYXRpb24gaXMgdGhlbiBwZXJmb3JtZWQgdXBvbiB0aGUgb3V0cHV0IHN0cmVhbS4gQ2xpZW50IGFwcGxpY2F0aW9ucworICAgICAqIHNob3VsZCBub3QgdXNlIGEgaGFuZGxlciBhZnRlciBjbG9zaW5nIGl0LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKICAgICAgKiAgICAgICAgICAgICBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewpAQCAtMjY3LDYgKzI3OCw4IEBACiAKICAgICAvKioKICAgICAgKiBGbHVzaGVzIGFueSBidWZmZXJlZCBvdXRwdXQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7CkBAIC0yODYsMjEgKzI5OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFjY2VwdHMgYW4gYWN0dWFsIGxvZ2dpbmcgcmVxdWVzdC4gVGhlIGxvZyByZWNvcmQgd2lsbCBiZSBmb3JtYXR0ZWQgYW5kCi0gICAgICogd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBpZiB0aGUgZm9sbG93aW5nIHRocmVlIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgICAgKiBBY2NlcHRzIGEgbG9nZ2luZyByZXF1ZXN0LiBUaGUgbG9nIHJlY29yZCBpcyBmb3JtYXR0ZWQgYW5kIHdyaXR0ZW4gdG8gdGhlCisgICAgICogb3V0cHV0IHN0cmVhbSBpZiB0aGUgZm9sbG93aW5nIHRocmVlIGNvbmRpdGlvbnMgYXJlIG1ldDoKICAgICAgKiA8dWw+CiAgICAgICogPGxpPnRoZSBzdXBwbGllZCBsb2cgcmVjb3JkIGhhcyBhdCBsZWFzdCB0aGUgcmVxdWlyZWQgbG9nZ2luZyBsZXZlbDsKICAgICAgKiA8bGk+dGhlIHN1cHBsaWVkIGxvZyByZWNvcmQgcGFzc2VzIHRoZSBmaWx0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiBoYW5kbGVyIGlmIGFueTsKLSAgICAgKiA8bGk+dGhlIG91dHB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciBpcyBub3QKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBoYW5kbGVyLCBpZiBhbnk7CisgICAgICogPGxpPnRoZSBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhhbmRsZXIgaXMgbm90IHtAY29kZSBudWxsfS4KICAgICAgKiA8L3VsPgotICAgICAqIElmIGl0IGlzIHRoZSBmaXJzdCB0aW1lIGEgbG9nIHJlY29yZCBuZWVkIHRvIGJlIHdyaXR0ZW4gb3V0LCB0aGUgaGVhZAotICAgICAqIHN0cmluZyBvZiB0aGUgZm9ybWF0dGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhhbmRsZXIgd2lsbCBiZSB3cml0dGVuIG91dAotICAgICAqIGZpcnN0LgorICAgICAqIElmIGl0IGlzIHRoZSBmaXJzdCB0aW1lIGEgbG9nIHJlY29yZCBpcyB3cml0dGVuIG91dCwgdGhlIGhlYWQgc3RyaW5nIG9mCisgICAgICogdGhlIGZvcm1hdHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBoYW5kbGVyIGlzIHdyaXR0ZW4gb3V0IGZpcnN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSByZWNvcmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2cgcmVjb3JkIHRvIGJlIGxvZ2dlZAorICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgbG9nZ2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdWJsaXNoKExvZ1JlY29yZCByZWNvcmQpIHsKQEAgLTMyNywxNCArMzM5LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBsb2cgcmVjb3JkIG5lZWQgdG8gYmUgbG9nZ2VkLiBUaGUgbG9nZ2luZwotICAgICAqIGxldmVscyB3aWxsIGJlIGNoZWNrZWQgYXMgd2VsbCBhcyB0aGUgZmlsdGVyLiBUaGUgb3V0cHV0IHN0cmVhbSBvZiB0aGlzCi0gICAgICogaGFuZGxlciBpcyBhbHNvIGNoZWNrZWQuIElmIGl0J3MgbnVsbCwgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGxvZyByZWNvcmQgbmVlZHMgdG8gYmUgbG9nZ2VkLiBUaGUKKyAgICAgKiBsb2dnaW5nIGxldmVscyBhcmUgY2hlY2tlZCBhcyB3ZWxsIGFzIHRoZSBmaWx0ZXIuIFRoZSBvdXRwdXQgc3RyZWFtIG9mCisgICAgICogdGhpcyBoYW5kbGVyIGlzIGFsc28gY2hlY2tlZC4gSWYgaXQgaXMge0Bjb2RlIG51bGx9LCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICoge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RpY2UgOiBDYXNlIG9mIG5vIG91dHB1dCBzdHJlYW0gd2lsbCByZXR1cm4ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHJlY29yZAotICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgY2hlY2tlZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1cHBsaWVkIGxvZyByZWNvcmQgbmVlZCB0byBiZSBsb2dnZWQsCi0gICAgICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgbG9nIHJlY29yZCB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSByZWNvcmR9IG5lZWRzIHRvIGJlIGxvZ2dlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTG9nZ2FibGUoTG9nUmVjb3JkIHJlY29yZCkgewpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL1hNTEZvcm1hdHRlci5qYXZhIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL1hNTEZvcm1hdHRlci5qYXZhCmluZGV4IGYzZmYyODAuLjYyNzlkOGMgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9YTUxGb3JtYXR0ZXIuamF2YQorKysgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvWE1MRm9ybWF0dGVyLmphdmEKQEAgLTI1LDEyICsyNSwxMyBAQAogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAogLyoqCi0gKiBGb3JtYXQgYSBnaXZlbiA8Y29kZT5Mb2dSZWNvcmQ8L2NvZGU+IGludG8gc3RyaW5nIHJlcHJlc2VudHMgWE1MLiBUaGUgRFREIHNwZWNpZmllZCBpbiAKLSAqIEFwcGVuZGl4IEEgdG8gSmF2YSBMb2dnaW5nIEFQSXMgc3BlY2lmaWNhdGlvbiBpcyB1c2VkLgorICogRm9ybWF0dGVyIHRvIGNvbnZlcnQgYSB7QGxpbmsgTG9nUmVjb3JkfSBpbnRvIGFuIFhNTCBzdHJpbmcuIFRoZSBEVEQKKyAqIHNwZWNpZmllZCBpbiBBcHBlbmRpeCBBIHRvIHRoZSBKYXZhIExvZ2dpbmcgQVBJcyBzcGVjaWZpY2F0aW9uIGlzIHVzZWQuCisgKiB7QGNvZGUgWE1MRm9ybWF0dGVyfSB1c2VzIHRoZSBvdXRwdXQgaGFuZGxlcidzIGVuY29kaW5nIGlmIGl0IGlzIHNwZWNpZmllZCwKKyAqIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBlbmNvZGluZyBpcyB1c2VkIGluc3RlYWQuIFVURi04IGlzIHRoZQorICogcmVjb21tZW5kZWQgZW5jb2RpbmcuCiAgKiAKLSAqIDxjb2RlPlhNTEZvcm1hdHRlcjwvY29kZT4gdXNlcyBnaXZlbiA8Y29kZT5IYW5kbGVyPC9jb2RlPidzIGVuY29kaW5nIGlmIGhhcywgb3RoZXJ3aXNlCi0gKiB1c2VzIGRlZmF1bHQgcGxhdGZvcm0gZW5jb2RpbmcgaW5zdGVhZC4gSG93ZXZlciwgdGhlIFVURi04IGlzIHJlY29tbWVuZGVkIGVuY29kaW5nLiAKLSAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0ZXIgZXh0ZW5kcyBGb3JtYXR0ZXIgewogCkBAIC00MCwxNyArNDEsMjEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5kZW50ID0gIiAgICAiOyAvLyROT04tTkxTLTEkCiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgWE1MRm9ybWF0dGVyfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgWE1MRm9ybWF0dGVyKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdCBhIDxjb2RlPkxvZ1JlY29yZDwvY29kZT4gaW50byBzdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBYTUwgCisgICAgICogQ29udmVydHMgYSB7QGNvZGUgTG9nUmVjb3JkfSBpbnRvIGFuIFhNTCBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIGdpdmVuIExvZ1JlY29yZCBpbnN0YW5jZSB0byBiZSBmb3JtYXR0ZWQKLSAgICAgKiBAcmV0dXJuIHN0cmluZyB3aGljaCByZXByZXNlbnRzIFhNTCAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIGxvZyByZWNvcmQgdG8gYmUgZm9ybWF0dGVkLgorICAgICAqIEByZXR1cm4gdGhlIGxvZyByZWNvcmQgZm9ybWF0dGVkIGFzIGFuIFhNTCBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBmb3JtYXQoTG9nUmVjb3JkIHIpIHsKQEAgLTE2MCwxMSArMTY1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBoZWFkZXIgc3RyaW5nIGZvciBYTUwsIHVzZSBnaXZlbiBoYW5kbGVyJ3MgZW5jb2RpbmcgaWYgaGFzLCAKLSAgICAgKiBvdGhlciB3aXNlIHVzZSBkZWZhdWx0IHBsYXRmb3JtIGVuY29kaW5nIAorICAgICAqIFJldHVybnMgdGhlIGhlYWRlciBzdHJpbmcgZm9yIGEgc2V0IG9mIGxvZyByZWNvcmRzIGZvcm1hdHRlZCBhcyBYTUwKKyAgICAgKiBzdHJpbmdzLCB1c2luZyB0aGUgb3V0cHV0IGhhbmRsZXIncyBlbmNvZGluZyBpZiBpdCBpcyBkZWZpbmVkLCBvdGhlcndpc2UKKyAgICAgKiB1c2luZyB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBlbmNvZGluZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaCB0aGUgZ2l2ZW4gaGFuZGxlcgotICAgICAqIEByZXR1cm4gdGhlIGhlYWRlciBzdHJpbmcgZm9yIFhNTAorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGhhbmRsZXIsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiB0aGUgaGVhZGVyIHN0cmluZyBmb3IgbG9nIHJlY29yZHMgZm9ybWF0dGVkIGFzIFhNTCBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZChIYW5kbGVyIGgpIHsKQEAgLTE4NCwxMCArMTkyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB0YWlsIHN0cmluZyBmb3IgWE1MCisgICAgICogUmV0dXJucyB0aGUgdGFpbCBzdHJpbmcgZm9yIGEgc2V0IG9mIGxvZyByZWNvcmRzIGZvcm1hdHRlZCBhcyBYTUwKKyAgICAgKiBzdHJpbmdzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBoIHRoZSBnaXZlbiBoYW5kbGVyCi0gICAgICogQHJldHVybiB0aGUgdGFpbCBzdHJpbmcgZm9yIFhNTAorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGhhbmRsZXIsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiB0aGUgdGFpbCBzdHJpbmcgZm9yIGxvZyByZWNvcmRzIGZvcm1hdHRlZCBhcyBYTUwgc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9wYWNrYWdlLmh0bWwgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvcGFja2FnZS5odG1sCmluZGV4IDRjYzkwYzkuLmM1MjNjN2EgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9wYWNrYWdlLmh0bWwKKysrIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL3BhY2thZ2UuaHRtbApAQCAtMyw3ICszLDggQEAKICAgICA8cD4KICAgICAgIFRoaXMgcGFja2FnZSBhbGxvd3MgdG8gYWRkIGxvZ2dpbmcgdG8gYW55IGFwcGxpY2F0aW9uLiBJdAogICAgICAgc3VwcG9ydHMgZGlmZmVyZW50IGxldmVscyBvZiBpbXBvcnRhbmNlIG9mIGEgbWVzc2FnZSB0aGF0IG5lZWRzIHRvIGJlCi0gICAgICBsb2dnZWQuIExhdGVyIHRoZSBvdXRwdXQgY2FuIGJlIGZpbHRlcmVkIGJ5IHRoaXMgbGV2ZWwuCisgICAgICBsb2dnZWQuIFRoZSBvdXRwdXQgd3JpdHRlbiB0byB0aGUgdGFyZ2V0IGNhbiBiZSBmaWx0ZXJlZCBieSB0aGlzIGxldmVsLgogICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKICAgPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhIGIvbG9nZ2luZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCmluZGV4IGUwNTI3NzMuLjg3NTM1YWUgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQorKysgYi9sb2dnaW5nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKQEAgLTIxLDYgKzIxLDEwIEBACiAgKiBpZiB0aGlzIHRvb2wgcnVucyBhZ2Fpbi4gQmV0dGVyIG1ha2UgY2hhbmdlcyBpbiB0aGUgdGVtcGxhdGUgZmlsZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFJlZHVuZGFudCBjb2RlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vdyBjYWxsZWQgZnJvbSBNc2dIZWxwLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLmludGVybmFsLm5sczsKIAogCkBAIC0zMCw4ICszNCw5IEBACiBpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOworLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2dIZWxwOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKICAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHN0cmluZ3MgZnJvbSBhIHJlc291cmNlIGJ1bmRsZSBhbmQgcmV0dXJucyB0aGVtLApAQCAtNDgsOSArNTMsMTEgQEAKICAqIAogICovCiBwdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotICAgIAorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNSZXNvdXJjZSA9CiAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy5pbnRlcm5hbC5ubHMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIGEgbWVzc2FnZSB3aGljaCBoYXMgbm8gYXJndW1lbnRzLgpAQCAtNjAsNyArNjcsOSBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2cpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjcsNiArMTM2LDEyIEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2csIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZywgYXJncyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBEdXBsaWNhdGUgY29kZSB3YXMgZHJvcHBlZCBpbiBmYXZvciBvZiB1c2luZyBNc2dIZWxwLgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIH0KZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9BbGxUZXN0cy5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0FsbFRlc3RzLmphdmEKaW5kZXggZWU0YTkzMi4uOGM4YmFhMSAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0FsbFRlc3RzLmphdmEKKysrIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0FsbFRlc3RzLmphdmEKQEAgLTMyLDEwICszMiwxMSBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRXJyb3JNYW5hZ2VyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGaWxlSGFuZGxlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGb3JtYXR0ZXJUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRm9ybWF0dGVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShIYW5kbGVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMZXZlbFRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTG9nZ2VyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2dnaW5nTVhCZWFuVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2dnaW5nUGVybWlzc2lvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTG9nTWFuYWdlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTG9nUmVjb3JkVGVzdC5jbGFzcyk7CkBAIC00NCw2ICs0NSw3IEBACiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTb2NrZXRIYW5kbGVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdHJlYW1IYW5kbGVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShYTUxGb3JtYXR0ZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1lc3NhZ2VzVGVzdC5jbGFzcyk7CiAgICAgICAgIC8vICRKVW5pdC1FTkQkCiAgICAgICAgIHJldHVybiBzdWl0ZTsKICAgICB9CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvQ29uc29sZUhhbmRsZXJUZXN0LmphdmEgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvQ29uc29sZUhhbmRsZXJUZXN0LmphdmEKaW5kZXggYmI5NzE3ZC4uMTg4YTEzOCAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0NvbnNvbGVIYW5kbGVyVGVzdC5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Db25zb2xlSGFuZGxlclRlc3QuamF2YQpAQCAtMTcsMTEgKzE3LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworaW1wb3J0IGphdmEudXRpbC5DdXJyZW5jeTsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXI7CkBAIC00Miw2ICs0OCw3IEBACiAvKioKICAqIFRlc3QgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIKICAqLworQFRlc3RUYXJnZXRDbGFzcyhDb25zb2xlSGFuZGxlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ29uc29sZUhhbmRsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVkFMSURfTEVWRUwgPSAiaW1wb3NzaWJsZV9sZXZlbCI7CkBAIC03NSw2ICs4MiwxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBubyByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGNvbnN0cnVjdG9yIHdpdGggbm8gcmVsZXZhbnQgbG9nIG1hbmFnZXIgIiArCisgICAgICAgICAgICAicHJvcGVydGllcyBhcmUgc2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvbnNvbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX05vUHJvcGVydGllcygpIHsKICAgICAgICAgYXNzZXJ0TnVsbChMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRQcm9wZXJ0eSgKICAgICAgICAgICAgICAgICAiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwiKSk7CkBAIC05NSw2ICsxMTIsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvbnNvbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX0luc3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgYXNzZXJ0TnVsbChMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRQcm9wZXJ0eSgKICAgICAgICAgICAgICAgICAiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwiKSk7CkBAIC0xMjIsNiArMTQ4LDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aXRoIHZhbGlkIHJlbGV2YW50IGxvZyBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCB2YWxpZCByZWxldmFudCBsb2cgbWFuYWdlciAiICsKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIGFyZSBzZXQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ29uc29sZUhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfVmFsaWRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCIsICJGSU5FIik7CkBAIC0xNDgsNiArMTg0LDE2IEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBpbnZhbGlkIHJlbGV2YW50IGxvZyBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlCiAgICAgICogc2V0LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGludmFsaWQgcmVsZXZhbnQgIiArCisgICAgICAgICAgICAibG9nIG1hbmFnZXIgcHJvcGVydGllcyBhcmUgc2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvbnNvbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX0ludmFsaWRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCIsIElOVkFMSURfTEVWRUwpOwpAQCAtMTc0LDYgKzIyMCwxNiBAQAogICAgICAqIFRlc3QgY2xvc2UoKSB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgYW5kIGEgcmVjb3JkIGhhcyBiZWVuCiAgICAgICogd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjbG9zZSgpIHdoZW4gaGF2aW5nIHN1ZmZpY2llbnQgcHJpdmlsZWdlLCAiICsKKyAgICAgICAgICAgICJhbmQgYSByZWNvcmQgaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZV9TdWZmaWNpZW50UHJpdmlsZWdlX05vcm1hbENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIiLCBjbGFzc05hbWUKQEAgLTE5NCw2ICsyNTAsMTYgQEAKICAgICAgKiBUZXN0IGNsb3NlKCkgd2hlbiBoYXZpbmcgc3VmZmljaWVudCBwcml2aWxlZ2UsIGFuZCBhbiBvdXRwdXQgc3RyZWFtIHRoYXQKICAgICAgKiBhbHdheXMgdGhyb3dzIGV4Y2VwdGlvbnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2xvc2UoKSB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgIiArCisgICAgICAgICAgICAiYW5kIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBhbHdheXMgdGhyb3dzIGV4Y2VwdGlvbnMiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZV9TdWZmaWNpZW50UHJpdmlsZWdlX0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC0yMTIsNiArMjc4LDE2IEBACiAgICAgICogVGVzdCBjbG9zZSgpIHdoZW4gaGF2aW5nIHN1ZmZpY2llbnQgcHJpdmlsZWdlLCBhbmQgbm8gcmVjb3JkIGhhcyBiZWVuCiAgICAgICogd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgY2xvc2UoKSB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgYW5kIG5vIHJlY29yZCAiICsKKyAgICAgICAgICAgICJoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VfU3VmZmljaWVudFByaXZpbGVnZV9EaXJlY3RDbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC0yMzAsNiArMzA2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGNsb3NlKCkgd2hlbiBoYXZpbmcgaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjbG9zZSgpIHdoZW4gaW5zdWZmaWNpZW50IHByaXZpbGVnZSBpcyBzZXQgdXAuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIiLCBjbGFzc05hbWUKQEAgLTI0OSw2ICszMzQsMTYgQEAKICAgICAvKgogICAgICAqIFRlc3QgcHVibGlzaCgpLCB1c2Ugbm8gZmlsdGVyLCBoYXZpbmcgb3V0cHV0IHN0cmVhbSwgbm9ybWFsIGxvZyByZWNvcmQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCB1c2Ugbm8gZmlsdGVyLCBoYXZpbmcgb3V0cHV0IHN0cmVhbSwgIiArCisgICAgICAgICAgICAibm9ybWFsIGxvZyByZWNvcmQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaXNoX05vRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIiLCBjbGFzc05hbWUKQEAgLTI4Nyw2ICszODIsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgcHVibGlzaCgpLCBhZnRlciBzeXN0ZW0gZXJyIGlzIHJlc2V0LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHB1Ymxpc2goKSwgYWZ0ZXIgc3lzdGVtIGVyciBpcyByZXNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfQWZ0ZXJSZXNldFN5c3RlbUVycigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC0zMDksNiArNDEzLDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHB1Ymxpc2goKSwgdXNlIGEgZmlsdGVyLCBoYXZpbmcgb3V0cHV0IHN0cmVhbSwgbm9ybWFsIGxvZyByZWNvcmQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgIHB1Ymxpc2goKSwgdXNlIGEgZmlsdGVyLCBoYXZpbmcgb3V0cHV0IHN0cmVhbSwgIiArCisgICAgICAgICAgICAibm9ybWFsIGxvZyByZWNvcmQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaXNoX1dpdGhGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlciIsIGNsYXNzTmFtZQpAQCAtMzUwLDYgKzQ2NCwxNyBAQAogICAgICAqIHJhdGhlciB0aGFuIHRocm93IGV4Y2VwdGlvbiwgaGFuZGxlciBzaG91bGQgY2FsbCBlcnJvcm1hbmFnZXIgdG8gaGFuZGxlCiAgICAgICogZXhjZXB0aW9uIGNhc2UsIHNvIE51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZG4ndCBiZSB0aHJvd24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCBudWxsIGxvZyByZWNvcmQsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCBzcGVjIHNhaWQgIiArIAorICAgICAgICAgICAgInJhdGhlciB0aGFuIHRocm93IGV4Y2VwdGlvbiwgaGFuZGxlciBzaG91bGQgY2FsbCBlcnJvcm1hbmFnZXIgdG8gaGFuZGxlICIgKyAKKyAgICAgICAgICAgICJleGNlcHRpb24gY2FzZSwgc28gTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkbid0IGJlIHRocm93bi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC0zNjMsNiArNDg4LDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHB1Ymxpc2goKSwgYSBsb2cgcmVjb3JkIHdpdGggZW1wdHkgbXNnLCBoYXZpbmcgb3V0cHV0IHN0cmVhbQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHB1Ymxpc2goKSwgYSBsb2cgcmVjb3JkIHdpdGggZW1wdHkgbXNnLCAiICsKKyAgICAgICAgICAgICJoYXZpbmcgb3V0cHV0IHN0cmVhbS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfRW1wdHlNc2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlciIsIGNsYXNzTmFtZQpAQCAtMzc5LDYgKzUxNCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBwdWJsaXNoKCksIGEgbG9nIHJlY29yZCB3aXRoIG51bGwgbXNnLCBoYXZpbmcgb3V0cHV0IHN0cmVhbQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHB1Ymxpc2goKSwgYSBsb2cgcmVjb3JkIHdpdGggbnVsbCBtc2csIGhhdmluZyBvdXRwdXQgc3RyZWFtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1Ymxpc2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGlzaF9OdWxsTXNnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIiLCBjbGFzc05hbWUKQEAgLTM5Miw3ICs1MzYsMTUgQEAKICAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKCJNb2NrRm9ybWF0dGVyX0hlYWQiLAogICAgICAgICAvLyB0aGlzLmVyclN1YnN0aXR1dGVTdHJlYW0udG9TdHJpbmcoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCBtZXRob2QgYWZ0ZXIgY2xvc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaXNoX0FmdGVyQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJpbnRTdHJlYW0gYmFja3VwID0gU3lzdGVtLmVycjsKICAgICAgICAgdHJ5IHsKQEAgLTQyOSw2ICs1ODEsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0T3V0cHV0U3RyZWFtKCkgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2V0T3V0cHV0U3RyZWFtKCkgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPdXRwdXRTdHJlYW1fTm9ybWFsKCkgewogICAgICAgICBNb2NrU3RyZWFtSGFuZGxlciBoID0gbmV3IE1vY2tTdHJlYW1IYW5kbGVyKCk7CiAgICAgICAgIGguc2V0Rm9ybWF0dGVyKG5ldyBNb2NrRm9ybWF0dGVyKCkpOwpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0Vycm9yTWFuYWdlclRlc3QuamF2YSBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9FcnJvck1hbmFnZXJUZXN0LmphdmEKaW5kZXggZGVjNjFmYi4uZDJmMjcyMyAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0Vycm9yTWFuYWdlclRlc3QuamF2YQorKysgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvRXJyb3JNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNywxNCArMTcsMjEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy50ZXN0cy5qYXZhLnV0aWwubG9nZ2luZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXJUZXN0Lk51bGxPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkVycm9yTWFuYWdlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXJUZXN0Lk51bGxPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoRXJyb3JNYW5hZ2VyLmNsYXNzKQogcHVibGljIGNsYXNzIEVycm9yTWFuYWdlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgCkBAIC00MiwxNCArNDksNTAgQEAKICAgICAgICAgU3lzdGVtLnNldEVycihlcnIpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KKyAgICAKKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlIG9ubHkgd2l0aCBFcnJvck1hbmFnZXIuR0VORVJJQ19GQUlMVVJFLCBpbXBvdmUgTW9ja1N0cmVhbSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5FeGNlcHRpb24uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9lcnJvckNoZWNrKCkgeworICAgICAgICBFcnJvck1hbmFnZXIgZW0gPSBuZXcgRXJyb3JNYW5hZ2VyKCk7CisgICAgICAgIE1vY2tTdHJlYW0gYW9zID0gbmV3IE1vY2tTdHJlYW0oKTsKKyAgICAgICAgUHJpbnRTdHJlYW0gc3QgPSBuZXcgUHJpbnRTdHJlYW0oYW9zKTsKKyAgICAgICAgU3lzdGVtLnNldEVycihzdCk7CisgICAgICAgIFN5c3RlbS5zZXRPdXQoc3QpOworICAgICAgICBlbS5lcnJvcigic3VwZXJ0ZXN0IiwgbnVsbCwgRXJyb3JNYW5hZ2VyLkdFTkVSSUNfRkFJTFVSRSk7CisgICAgICAgIHN0LmZsdXNoKCk7CiAKKyAgICAgICBhc3NlcnRUcnVlKCJtZXNzYWdlIGFwcGVhcnMgKHN1cGVydGVzdCkiLCBhb3MuZ2V0V3JpdHRlbkRhdGEoKS5pbmRleE9mKCJzdXBlcnRlc3QiKSAhPSAtMSk7CisgICAgfQorICAgIAorICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLCAKKyAgICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2Ugb25seSB3aXRoIEVycm9yTWFuYWdlci5HRU5FUklDX0ZBSUxVUkUiLCAKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZXJyb3IiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7IGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5FeGNlcHRpb24uY2xhc3MsIGludC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Vycm9yU3RyaW5nU3RyaW5naW50KCkgewogICAgICAgICBFcnJvck1hbmFnZXIgZW0gPSBuZXcgRXJyb3JNYW5hZ2VyKCk7Ci0gICAgICAgIGVtLmVycm9yKG51bGwsIG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpLCBFcnJvck1hbmFnZXIuR0VORVJJQ19GQUlMVVJFKTsKKyAgICAgICAgZW0uZXJyb3IobnVsbCwgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuR0VORVJJQ19GQUlMVVJFKTsKICAgICAgICAgZW0uZXJyb3IoIkFuIGVycm9yIG1lc3NhZ2UuIiwgbnVsbCwgRXJyb3JNYW5hZ2VyLkdFTkVSSUNfRkFJTFVSRSk7CiAgICAgICAgIGVtLmVycm9yKG51bGwsIG51bGwsIEVycm9yTWFuYWdlci5HRU5FUklDX0ZBSUxVUkUpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFcnJvck1hbmFnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0YW50cygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEVycm9yTWFuYWdlci5DTE9TRV9GQUlMVVJFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIEVycm9yTWFuYWdlci5GTFVTSF9GQUlMVVJFKTsKQEAgLTU4LDUgKzEwMSwyNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoNCwgRXJyb3JNYW5hZ2VyLk9QRU5fRkFJTFVSRSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBFcnJvck1hbmFnZXIuV1JJVEVfRkFJTFVSRSk7CiAgICAgfQorICAgIAorICAgIHB1YmxpYyBjbGFzcyBNb2NrU3RyZWFtIGV4dGVuZHMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBsaW5lc1dyaXR0ZW4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7fQorICAgICAgICBwdWJsaWMgIHZvaWQgY2xvc2UoKSB7fQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIpIHsKKyAgICAgICAgICAgIGxpbmVzV3JpdHRlbi5hcHBlbmQobmV3IFN0cmluZyhidWZmZXIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisgICAgICAgICAgICBsaW5lc1dyaXR0ZW4uYXBwZW5kKG5ldyBTdHJpbmcoYnVmZmVyLCBvZmZzZXQsIGxlbikpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdHRlbkRhdGEoKSB7cmV0dXJuIGxpbmVzV3JpdHRlbi50b1N0cmluZygpO30KKworICAgIH0KKwogCiB9CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvRmlsZUhhbmRsZXJUZXN0LmphdmEgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvRmlsZUhhbmRsZXJUZXN0LmphdmEKaW5kZXggNzQ1YzU2MC4uNDQ1YmQ5NiAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0ZpbGVIYW5kbGVyVGVzdC5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy50ZXN0cy5qYXZhLnV0aWwubG9nZ2luZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDcsNiArNTIsNyBAQAogCiAvKioKICAqLworQFRlc3RUYXJnZXRDbGFzcyhGaWxlSGFuZGxlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsZUhhbmRsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgc3RhdGljIExvZ01hbmFnZXIgbWFuYWdlciA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpOwpAQCAtNzksMjEgKzg1LDggQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBtYW5hZ2VyLnJlc2V0KCk7Ci0gICAgICAgIGluaXRQcm9wcygpOwotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShURU1QUEFUSCArIFNFUCArICJsb2ciKTsKLSAgICAgICAgZmlsZS5ta2RpcigpOwotICAgICAgICBtYW5hZ2VyLnJlYWRDb25maWd1cmF0aW9uKEVudmlyb25tZW50SGVscGVyCi0gICAgICAgICAgICAgICAgLlByb3BlcnRpZXNUb0lucHV0U3RyZWFtKHByb3BzKSk7Ci0gICAgICAgIGhhbmRsZXIgPSBuZXcgRmlsZUhhbmRsZXIoKTsKLSAgICAgICAgciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuQ09ORklHLCAibXNnIik7Ci0gICAgICAgIGVyclN1YnN0aXR1dGVTdHJlYW0gPSBuZXcgTnVsbE91dHB1dFN0cmVhbSgpOwotICAgICAgICBTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShlcnJTdWJzdGl0dXRlU3RyZWFtKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9wcygpIHsKKyAgICAgICAgCisgICAgICAgIC8vaW5pdFByb3AKICAgICAgICAgcHJvcHMuY2xlYXIoKTsKICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCIsICJGSU5FIik7CiAgICAgICAgIHByb3BzLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZmlsdGVyIiwgY2xhc3NOYW1lCkBAIC0xMDcsMTQgKzEwMCwyNSBAQAogICAgICAgICBwcm9wcy5wdXQoImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmNvdW50IiwgIjIiKTsKICAgICAgICAgLy8gdXNpbmcgYXBwZW5kIG1vZGUKICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5hcHBlbmQiLCAidHJ1ZSIpOwotICAgICAgICBwcm9wcwotICAgICAgICAgICAgICAgIC5wdXQoImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLnBhdHRlcm4iLAorICAgICAgICBwcm9wcy5wdXQoImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLnBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIiV0L2xvZy9qYXZhJXUudGVzdCIpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKFRFTVBQQVRIICsgU0VQICsgImxvZyIpOworICAgICAgICBmaWxlLm1rZGlyKCk7CisgICAgICAgIG1hbmFnZXIucmVhZENvbmZpZ3VyYXRpb24oRW52aXJvbm1lbnRIZWxwZXIKKyAgICAgICAgICAgICAgICAuUHJvcGVydGllc1RvSW5wdXRTdHJlYW0ocHJvcHMpKTsKKyAgICAgICAgaGFuZGxlciA9IG5ldyBGaWxlSGFuZGxlcigpOworICAgICAgICByID0gbmV3IExvZ1JlY29yZChMZXZlbC5DT05GSUcsICJtc2ciKTsKKyAgICAgICAgZXJyU3Vic3RpdHV0ZVN0cmVhbSA9IG5ldyBOdWxsT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKGVyclN1YnN0aXR1dGVTdHJlYW0pKTsKICAgICB9CiAKKwogICAgIC8qCiAgICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCiAgICAgICovCisgICAgCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgIT0gaGFuZGxlcikgewogICAgICAgICAgICAgaGFuZGxlci5jbG9zZSgpOwpAQCAtMTIzLDIxICsxMjcsMzcgQEAKICAgICAgICAgU3lzdGVtLnNldEVycihlcnIpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEZvcm1hdHRlcigpIG1ldGhvZCBhZnRlciBjbG9zZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdExvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShURU1QUEFUSCArIFNFUCArICJsb2ciCi0gICAgICAgICAgICAgICAgKyBTRVAgKyAiamF2YTEudGVzdC4wIik7CisgICAgICAgICAgICAgICAgKyBTRVAgKyAiamF2YTEudGVzdC5Mb2NrIik7CiAgICAgICAgIEZpbGVIYW5kbGVyIGggPSBuZXcgRmlsZUhhbmRsZXIoKTsKICAgICAgICAgaC5wdWJsaXNoKHIpOwogICAgICAgICBoLmNsb3NlKCk7Ci0gICAgICAgIGFzc2VydEZpbGVDb250ZW50KFRFTVBQQVRIICsgU0VQICsgImxvZyIsICJqYXZhMS50ZXN0LjAiLCBoCi0gICAgICAgICAgICAgICAgLmdldEZvcm1hdHRlcigpKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRlbnQoVEVNUFBBVEggKyBTRVAgKyAibG9nIiwgImphdmExLnRlc3QuTG9jayIsIGguZ2V0Rm9ybWF0dGVyKCkpOwogICAgICAgICBvdXRwdXQuY2xvc2UoKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIHRlc3QgZm9yIGNvbnN0cnVjdG9yIHZvaWQgRmlsZUhhbmRsZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmlsZUhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFyYWN0ZXIgZW5jb2RpbmcgaXMgbm9uIGVxdWFsIHRvIGFjdHVhbCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgImlzby04ODU5LTEiLCBoYW5kbGVyLmdldEVuY29kaW5nKCkpOwpAQCAtMTYzLDYgKzE4MywxNSBAQAogICAgIC8qCiAgICAgICogdGVzdCBmb3IgY29uc3RydWN0b3Igdm9pZCBGaWxlSGFuZGxlcihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUhhbmRsZXJfMXBhcmFtcygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGhhbmRsZXIgPSBuZXcgRmlsZUhhbmRsZXIoIiV0L2xvZy9zdHJpbmciKTsKQEAgLTIzOSw2ICsyNjgsMTUgQEAKICAgICAvKgogICAgICAqIHRlc3QgZm9yIGNvbnN0cnVjdG9yIHZvaWQgRmlsZUhhbmRsZXIoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gYXBwZW5kKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmlsZUhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVIYW5kbGVyXzJwYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYm9vbGVhbiBhcHBlbmQgPSBmYWxzZTsKICAgICAgICAgZG8gewpAQCAtMjc1LDYgKzMxMywxNSBAQAogICAgICAqIHRlc3QgZm9yIGNvbnN0cnVjdG9yIHZvaWQgRmlsZUhhbmRsZXIoU3RyaW5nIHBhdHRlcm4sIGludCBsaW1pdCwgaW50CiAgICAgICogY291bnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVIYW5kbGVyXzNwYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGxpbWl0ID0gMTIwOwogICAgICAgICBpbnQgY291bnQgPSAxOwpAQCAtMzAzLDYgKzM1MCwxNSBAQAogICAgICAqIHRlc3QgZm9yIGNvbnN0cnVjdG9yIHB1YmxpYyBGaWxlSGFuZGxlcihTdHJpbmcgcGF0dGVybiwgaW50IGxpbWl0LCBpbnQKICAgICAgKiBjb3VudCwgYm9vbGVhbiBhcHBlbmQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVIYW5kbGVyXzRwYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGxpbWl0ID0gMTIwOwogICAgICAgICBpbnQgY291bnQgPSAxOwpAQCAtMzM2LDcgKzM5MiwzMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IHdoaWxlIChhcHBlbmQpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaWx0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVycm9yTWFuYWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaGFuZGxlci5wdWJsaXNoKHIpOwogICAgICAgICBoYW5kbGVyLmNsb3NlKCk7CkBAIC00NDEsNyArNTIxLDE1IEBACiAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGltaXRBbmRDb3VudCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBoYW5kbGVyLmNsb3NlKCk7CiAgICAgICAgIC8vIHZlcnkgc21hbGwgbGltaXQgdmFsdWUsIGNvdW50PTIKQEAgLTUyNCw3ICs2MTIsMzEgQEAKICAgICAgICAgICAgIHJlc2V0KCJsb2ciLCAiIik7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmlsZUhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjdXJpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgY3VycmVudE1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CiAKQEAgLTU2OCw3ICs2ODAsMzUgQEAKICAgICAgICAgfQogCiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmlsZUhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmlsZUhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU2VjdXJpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgY3VycmVudE1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CiAKQEAgLTYxMSw3ICs3NTEsMTUgQEAKICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIoY3VycmVudE1hbmFnZXIpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsZUhhbmRsZXIgd2hlbiBjb25maWd1cmF0aW9uIGZpbGUgaXMgaW52YWxpZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCIsICJudWxsIik7CiAgICAgICAgIHByb3BzLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZmlsdGVyIiwgY2xhc3NOYW1lCkBAIC02NDYsOCArNzk0LDI5IEBACiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaWxsZWdhbCBwYXJhbWV0ZXJzIGFuZCBleGNlcHRpb25zOiAiICsKKyAgICAgICAgICAgICJJT0V4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmlsZUhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0SW52YWxpZFBhcmFtcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gJXQgYW5kICVwIHBhcnNpbmcgY2FuIGFkZCBmaWxlIHNlcGFyYXRvciBhdXRvbWF0aWNhbGx5CiAgICAgICAgIEZpbGVIYW5kbGVyIGgxID0gbmV3IEZpbGVIYW5kbGVyKCIldGFhYSIpOwpAQCAtNjk1LDYgKzg2NCwzOSBAQAogICAgICAgICB9CiAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShURU1QUEFUSCArIFNFUCArICJiYWRkaXIiICsgU0VQICsgIm11bHRpMCIpOwogICAgICAgICBhc3NlcnRGYWxzZShmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgCisgICAgIC8vIGJhZCBkaXJlY3RvcnksIElPRXhjZXB0aW9uLCBhcHBlbmQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGgxID0gbmV3IEZpbGVIYW5kbGVyKCIldC9iYWRkaXIvbXVsdGklZyIsIHRydWUpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFRFTVBQQVRIICsgU0VQICsgImJhZGRpciIgKyBTRVAgKyAibXVsdGkwIik7CisgICAgICAgIGFzc2VydEZhbHNlKGZpbGUuZXhpc3RzKCkpOyAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBoMSA9IG5ldyBGaWxlSGFuZGxlcigiJXQvYmFkZGlyL211bHRpJWciLCBmYWxzZSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSU8gZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmaWxlID0gbmV3IEZpbGUoVEVNUFBBVEggKyBTRVAgKyAiYmFkZGlyIiArIFNFUCArICJtdWx0aTAiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZmlsZS5leGlzdHMoKSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaDEgPSBuZXcgRmlsZUhhbmRsZXIoIiV0L2JhZGRpci9tdWx0aSVnIiwgMTIsIDQpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFRFTVBQQVRIICsgU0VQICsgImJhZGRpciIgKyBTRVAgKyAibXVsdGkwIik7CisgICAgICAgIGFzc2VydEZhbHNlKGZpbGUuZXhpc3RzKCkpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGgxID0gbmV3IEZpbGVIYW5kbGVyKCIldC9iYWRkaXIvbXVsdGklZyIsIDEyLCA0LCB0cnVlKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJTyBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZpbGUgPSBuZXcgRmlsZShURU1QUEFUSCArIFNFUCArICJiYWRkaXIiICsgU0VQICsgIm11bHRpMCIpOworICAgICAgICBhc3NlcnRGYWxzZShmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgCiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBGaWxlSGFuZGxlcihudWxsKTsKQEAgLTcxMiw3ICs5MTQsNiBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0xMjk5CiAgICAgICAgICAgICBuZXcgRmlsZUhhbmRsZXIoIiIpOwogICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewpAQCAtNzI4LDExICs5MjksMjYgQEAKICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRmlsZUhhbmRsZXIoIiV0L2phdmEldSIsIC0xLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKgogICAgICAqIHRlc3QgZm9yIG1ldGhvZCBwdWJsaWMgdm9pZCBwdWJsaXNoKExvZ1JlY29yZCByZWNvcmQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1Ymxpc2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGlzaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBMb2dSZWNvcmRbXSByID0gbmV3IExvZ1JlY29yZFtdIHsgbmV3IExvZ1JlY29yZChMZXZlbC5DT05GSUcsICJtc2dfXyIpLAogICAgICAgICAgICAgICAgIG5ldyBMb2dSZWNvcmQoTGV2ZWwuV0FSTklORywgIm1lc3NhZ2UiKSwKQEAgLTc1MCw2ICs5NjYsMTUgQEAKICAgICAvKgogICAgICAqIHRlc3QgZm9yIG1ldGhvZCBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGVIYW5kbGVyIGggPSBuZXcgRmlsZUhhbmRsZXIoIiV0L2xvZy9zdHJpbmdQdWJsaXNoIik7CiAgICAgICAgIGgucHVibGlzaChyKTsKQEAgLTc1Nyw3ICs5ODIsMTUgQEAKICAgICAgICAgYXNzZXJ0RmlsZUNvbnRlbnQoVEVNUFBBVEggKyBTRVAgKyAibG9nIiwgInN0cmluZ1B1Ymxpc2giLCBoCiAgICAgICAgICAgICAgICAgLmdldEZvcm1hdHRlcigpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldE91dHB1dFN0cmVhbSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgLy8gc2V0IG91dHB1dCBzdHJlYW0gc3RpbGwgd29ya3MsIGp1c3QgbGlrZSBzdXBlciBTdHJlYW1IYW5kbGVyCiAgICAgcHVibGljIHZvaWQgdGVzdFNldE91dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrRmlsZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNb2NrRmlsZUhhbmRsZXIoIiVoL3NldG91dHB1dC5sb2ciKTsKQEAgLTc3MywxMCArMTAwNiwxOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBmLmdldEhlYWQoaGFuZGxlcikgKyBmLmZvcm1hdChyKSArIGYuZ2V0VGFpbChoYW5kbGVyKSk7CiAgICAgICAgIGFzc2VydEZpbGVDb250ZW50KEhPTUVQQVRILCAic2V0b3V0cHV0LmxvZyIsIGhhbmRsZXIuZ2V0Rm9ybWF0dGVyKCkpOwogICAgIH0KLQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UGF0dGVybl8zcGFyYW1zKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLAogICAgICAgICAgICAgSU9FeGNlcHRpb24gewotICAgICAgICAvLyByZWdyZXNzaW9uIEhBUk1PTlktMjQyMQogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IEZpbGVIYW5kbGVyKG5ldyBTdHJpbmcoKSwgMSwgMSk7CiAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKQEAgLTc4NCwxMCArMTAyNSwxNyBAQAogICAgICAgICAgICAgLy8gRXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQYXR0ZXJuXzJwYXJhbXMoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJlZ3Jlc3Npb24gSEFSTU9OWS0yNDIxCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgRmlsZUhhbmRsZXIobmV3IFN0cmluZygpLCB0cnVlKTsKICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwpAQCAtNzk1LDEwICsxMDQzLDE3IEBACiAgICAgICAgICAgICAvLyBFeHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQYXR0ZXJuXzRwYXJhbXMoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJlZ3Jlc3Npb24gSEFSTU9OWS0yNDIxCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgRmlsZUhhbmRsZXIobmV3IFN0cmluZygpLCAxLCAxLCB0cnVlKTsKICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0ZpbHRlclRlc3QuamF2YSBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9GaWx0ZXJUZXN0LmphdmEKaW5kZXggNzEwZDc1Ny4uM2M4MmQ3MCAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0ZpbHRlclRlc3QuamF2YQorKysgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvRmlsdGVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwyNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy9UT0RPIDoKKy8qCisgKiAxLiBEb24ndCBmb3JnZXQgdG8gd3JpdGUgdGVzdHMgZm9yIG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLmludGVybmFsLm5scy9NZXNzYWdlcy5qYXZhIHRoaXMgZmlsZSBpcyBpbiBsb2dnaW5nL3NyYy9tYWluL2phdmEgZm9sZGVyCisgKiAyLiBpbnJ0ZWZhY2UgZmlsdGVyIC8gTG9nZ2luZ01YQmVhbiB0ZXN0cyBtYWNoZW4KKyAqIDMuIFhNTEZvcm1hdHRlci5qYXZhIHNob3VsZCBiZSBmaW5pc2ggZm9yIE1vbmRheSAobm90IGEgbG90IHRvIGRvKSBidXQgYXMgSSBiZWdpbm4gd2FudCB0byBmaW5pc2guICAKKyAqIDMuIEluIG15IGNhc2UKKyAqICAgIEkgZGlkbid0IHVzZSB0aGUgUEFSVElBTF9PSywgc28gSSBiZWxpZXZlIHRoYXQgOTglIG9mIENPTVBMRVRFIGFyZSBQQVJUSUFMX09LCisgKiAgICBDT01QTEVURSA9IFRlc3RzIGZpbmlzaCBhbmQgc2hvdWxkIGJlIHdvcmtpbmcuIElmIGVycm9yIGNoZWNrIHRoZSB0ZXN0IGJlZm9yZSB0byBtYWtlIGEgdGlja2V0LgorICogICAgUEFSVElBTCA9IFRlc3RzIGZpbmlzaCwgYnV0IG5lZWQgc3BlY2lhbCByZXZpZXdpbmcKKyAqICAgIFRPRE8gPSBBIHRlc3QgdG8gZG8gKG9yIG5vdCkuIE1vc3RseSBhIHRlc3QgdG8gY29tcGxldGUKKyAqIDQuIEZvciBxdWVzdGlvbnMgY2hyaXN0aWFuLndpZWRlcnNlaW5lcgorICovCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOwogCkBAIC0yNiwxMCArNDQsMjAgQEAKICAqIFRoaXMgdGVzdGNhc2UgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgaW50ZXJmYWNlIEZpbHRlci4KICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKEZpbHRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaW50ZXJmYWNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTG9nZ2FibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgewogICAgICAgICBNb2NrRmlsdGVyIGYgPSBuZXcgTW9ja0ZpbHRlcigpOwotICAgICAgICBmLmlzTG9nZ2FibGUobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGYuaXNMb2dnYWJsZShudWxsKSk7CiAgICAgfQogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Gb3JtYXR0ZXJUZXN0LmphdmEgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvRm9ybWF0dGVyVGVzdC5qYXZhCmluZGV4IDAwMTIwMzUuLmQ4YjZkZWYgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Gb3JtYXR0ZXJUZXN0LmphdmEKKysrIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0Zvcm1hdHRlclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy50ZXN0cy5qYXZhLnV0aWwubG9nZ2luZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwpAQCAtMjcsNiArMzIsNyBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEZvcm1hdHRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRm9ybWF0dGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICBGb3JtYXR0ZXIgZjsKIApAQCAtNDQsMjYgKzUwLDY3IEBACiAgICAgICAgIGYgPSBuZXcgTW9ja0Zvcm1hdHRlcigpOwogICAgICAgICByID0gbmV3IExvZ1JlY29yZChMZXZlbC5GSU5FLCBNU0cpOwogICAgICAgICBoID0gbmV3IEZpbGVIYW5kbGVyKCk7CisgICAgICAKICAgICB9CiAKICAgICAvKgogICAgICAqIHRlc3QgZm9yIGNvbnN0cnVjdG9yIHByb3RlY3RlZCBGb3JtYXR0ZXIoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXR0ZXIoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0Rm9ybWF0dGVyKCkgewogICAgICAgICBGb3JtYXR0ZXIgZm9ybWF0dGVyOwogICAgICAgICBmb3JtYXR0ZXIgPSBuZXcgTW9ja0Zvcm1hdHRlcigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImhlYWQgc3RyaW5nIGlzIG5vdCBlbXB0eSIsICIiLCBmb3JtYXR0ZXIuZ2V0SGVhZChudWxsKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidGFpbCBzdHJpbmcgaXMgbm90IGVtcHR5IiwgIiIsIGZvcm1hdHRlci5nZXRUYWlsKG51bGwpKTsKKwogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0KCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJBYnN0cmFjdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RGb3JtYXQoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiZm9ybWF0IiwgZi5mb3JtYXQocikpOwogICAgIH0KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICAgICAgICBwdWJsaWMgdm9pZCBfdGVzdEZvcm1hdE51bGwoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9ybWF0IixmLmZvcm1hdChudWxsKSk7CisgICAgICAgICAgfQogCiAgICAgLyoKICAgICAgKiB0ZXN0IGZvciBtZXRob2QgcHVibGljIFN0cmluZyBnZXRIZWFkKEhhbmRsZXIgaCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGVhZCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SGVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEdldEhlYWQoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiaGVhZCBzdHJpbmcgaXMgbm90IGVtcHR5IiwgIiIsIGYuZ2V0SGVhZChudWxsKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiaGVhZCBzdHJpbmcgaXMgbm90IGVtcHR5IiwgIiIsIGYuZ2V0SGVhZChoKSk7CiAgICAgICAgIGgucHVibGlzaChyKTsKQEAgLTczLDE0ICsxMjAsMzEgQEAKICAgICAvKgogICAgICAqIHRlc3QgZm9yIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFRhaWwoSGFuZGxlciBoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYWlsKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUYWlsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0VGFpbCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0YWlsIHN0cmluZyBpcyBub3QgZW1wdHkiLCAiIiwgZi5nZXRUYWlsKG51bGwpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0YWlsIHN0cmluZyBpcyBub3QgZW1wdHkiLCAiIiwgZi5nZXRUYWlsKGgpKTsKICAgICAgICAgaC5wdWJsaXNoKHIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRhaWwgc3RyaW5nIGlzIG5vdCBlbXB0eSIsICIiLCBmLmdldFRhaWwoaCkpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXRNZXNzYWdlKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXRNZXNzYWdlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RGb3JtYXRNZXNzYWdlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoTVNHLCBmLmZvcm1hdE1lc3NhZ2UocikpOwogCiAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gInRlc3QgZm9ybWF0dGVyIHswLCBudW1iZXJ9IjsKQEAgLTEwOSw5ICsxNzMsMjEgQEAKICAgICAgICAgcGF0dGVybiA9IG51bGw7CiAgICAgICAgIHIuc2V0TWVzc2FnZShwYXR0ZXJuKTsKICAgICAgICAgYXNzZXJ0TnVsbChmLmZvcm1hdE1lc3NhZ2UocikpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGFzc2VydE51bGwoZi5mb3JtYXRNZXNzYWdlKG51bGwpKTsKKyAgICAgICAgCiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExvY2FsaXplZEZvcm1hdE1lc3NhZ2UoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0TWVzc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0TG9jYWxpemVkRm9ybWF0TWVzc2FnZSgpIHsKICAgICAgICAgLy8gbm9ybWFsIGNhc2UKICAgICAgICAgci5zZXRNZXNzYWdlKCJtc2ciKTsKICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZQpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0hhbmRsZXJUZXN0LmphdmEgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvSGFuZGxlclRlc3QuamF2YQppbmRleCA5ZWRmYjgzLi5kM2VkYzQ1IDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvSGFuZGxlclRlc3QuamF2YQorKysgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvSGFuZGxlclRlc3QuamF2YQpAQCAtMTcsMTAgKzE3LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CitpbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRXJyb3JNYW5hZ2VyOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkZpbHRlcjsKQEAgLTQwLDYgKzQ2LDcgQEAKICAqIFRlc3Qgc3VpdGUgZm9yIHRoZSBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoSGFuZGxlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSGFuZGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZSA9IEhhbmRsZXJUZXN0LmNsYXNzLmdldE5hbWUoKTsKIApAQCAtNzAsNiArNzcsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIGFzc2VydFNhbWUoaC5nZXRMZXZlbCgpLCBMZXZlbC5BTEwpOwpAQCAtODIsMTIgKzk4LDIwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3Rvciwgd2l0aCBwcm9wZXJ0aWVzIHNldAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX1Byb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLk1vY2tIYW5kbGVyLmxldmVsIiwgIkZJTkUiKTsKLSAgICAgICAgcAotICAgICAgICAgICAgICAgIC5wdXQoImphdmEudXRpbC5sb2dnaW5nLk1vY2tIYW5kbGVyLmZpbHRlciIsIGNsYXNzTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJE1vY2tGaWx0ZXIiKTsKKyAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLk1vY2tIYW5kbGVyLmZpbHRlciIsIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICsgIiRNb2NrRmlsdGVyIik7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLmZvcm1hdHRlciIsIGNsYXNzTmFtZQogICAgICAgICAgICAgICAgICsgIiRNb2NrRm9ybWF0dGVyIik7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Nb2NrSGFuZGxlci5lbmNvZGluZyIsICJ1dGYtOCIpOwpAQCAtOTUsOSArMTE5LDkgQEAKICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudEhlbHBlci5Qcm9wZXJ0aWVzVG9JbnB1dFN0cmVhbShwKSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICJqYXZhLnV0aWwubG9nZ2luZy5Nb2NrSGFuZGxlci5sZXZlbCIpLCAiRklORSIpOworICAgICAgICAiamF2YS51dGlsLmxvZ2dpbmcuTW9ja0hhbmRsZXIubGV2ZWwiKSwgIkZJTkUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICJqYXZhLnV0aWwubG9nZ2luZy5Nb2NrSGFuZGxlci5lbmNvZGluZyIpLCAidXRmLTgiKTsKKyAgICAgICAgImphdmEudXRpbC5sb2dnaW5nLk1vY2tIYW5kbGVyLmVuY29kaW5nIiksICJ1dGYtOCIpOwogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIGFzc2VydFNhbWUoaC5nZXRMZXZlbCgpLCBMZXZlbC5BTEwpOwogICAgICAgICBhc3NlcnROdWxsKGguZ2V0Rm9ybWF0dGVyKCkpOwpAQCAtMTEwLDYgKzEzNCwxNSBAQAogICAgIC8qCiAgICAgICogQWJzdHJhY3QgbWV0aG9kLCBubyB0ZXN0IG5lZWRlZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQWJzdHJhY3QgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIGguY2xvc2UoKTsKQEAgLTExOCw2ICsxNTEsMTUgQEAKICAgICAvKgogICAgICAqIEFic3RyYWN0IG1ldGhvZCwgbm8gdGVzdCBuZWVkZWQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFic3RyYWN0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaCgpIHsKICAgICAgICAgTW9ja0hhbmRsZXIgaCA9IG5ldyBNb2NrSGFuZGxlcigpOwogICAgICAgICBoLmZsdXNoKCk7CkBAIC0xMjYsNiArMTY4LDE1IEBACiAgICAgLyoKICAgICAgKiBBYnN0cmFjdCBtZXRob2QsIG5vIHRlc3QgbmVlZGVkLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJBYnN0cmFjdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaXNoKCkgewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIGgucHVibGlzaChudWxsKTsKQEAgLTEzNCw2ICsxODUsMTkgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0RW5jb2RpbmcgJiBzZXRFbmNvZGluZyBtZXRob2RzIHdpdGggc3VwcG9ydGVkIGVuY29kaW5nLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEVuY29kaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRFbmNvZGluZ19Ob3JtYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0hhbmRsZXIgaCA9IG5ldyBNb2NrSGFuZGxlcigpOwogICAgICAgICBoLnNldEVuY29kaW5nKCJpc28tODg1OS0xIik7CkBAIC0xNDMsNiArMjA3LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldEVuY29kaW5nICYgc2V0RW5jb2RpbmcgbWV0aG9kcyB3aXRoIG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRFbmNvZGluZ19OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgaC5zZXRFbmNvZGluZyhudWxsKTsKQEAgLTE1Miw2ICsyMjUsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0RW5jb2RpbmcgJiBzZXRFbmNvZGluZyBtZXRob2RzIHdpdGggdW5zdXBwb3J0ZWQgZW5jb2RpbmcuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRFbmNvZGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0RW5jb2RpbmdfVW5zdXBwb3J0ZWQoKSB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgdHJ5IHsKQEAgLTE2NSw2ICsyNDcsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0RW5jb2Rpbmcgd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEVuY29kaW5nX0luc3VmZmljaWVudFByaXZpbGVnZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xOTQsNiArMjg1LDE5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldEVycm9yTWFuYWdlciAmIHNldEVycm9yTWFuYWdlciBtZXRob2RzIHdpdGggbm9uLW51bGwgdmFsdWUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RXJyb3JNYW5hZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkVycm9yTWFuYWdlci5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFcnJvck1hbmFnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0RXJyb3JNYW5hZ2VyX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIEVycm9yTWFuYWdlciBtYW4gPSBuZXcgRXJyb3JNYW5hZ2VyKCk7CkBAIC0yMDQsNiArMzA4LDE5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldEVycm9yTWFuYWdlciAmIHNldEVycm9yTWFuYWdlciBtZXRob2RzIHdpdGggbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVycm9yTWFuYWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RXJyb3JNYW5hZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkVycm9yTWFuYWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldEVycm9yTWFuYWdlcl9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgLy8gdGVzdCBzZXQgbnVsbApAQCAtMjI1LDYgKzM0MiwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRFcnJvck1hbmFnZXIgd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVycm9yTWFuYWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFcnJvck1hbmFnZXJfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZE1hbiA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTI0Miw2ICszNjgsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0RXJyb3JNYW5hZ2VyIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXRFcnJvck1hbmFnZXIgd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEVycm9yTWFuYWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5FcnJvck1hbmFnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRFcnJvck1hbmFnZXJfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZE1hbiA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTI3MSw2ICs0MDYsMTkgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0RmlsdGVyICYgc2V0RmlsdGVyIG1ldGhvZHMgd2l0aCBub24tbnVsbCB2YWx1ZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGaWx0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuRmlsdGVyLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZpbHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRGaWx0ZXJfTm9ybWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgRmlsdGVyIGYgPSBuZXcgTW9ja0ZpbHRlcigpOwpAQCAtMjgxLDYgKzQyOSwxOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRGaWx0ZXIgJiBzZXRGaWx0ZXIgbWV0aG9kcyB3aXRoIG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaWx0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEZpbHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRGaWx0ZXJfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIC8vIHRlc3Qgc2V0IG51bGwKQEAgLTI5NCw2ICs0NTUsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0RmlsdGVyIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGaWx0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuRmlsdGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmlsdGVyX0luc3VmZmljaWVudFByaXZpbGVnZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0zMjMsNiArNDkzLDE5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldEZvcm1hdHRlciAmIHNldEZvcm1hdHRlciBtZXRob2RzIHdpdGggbm9uLW51bGwgdmFsdWUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Rm9ybWF0dGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0Rm9ybWF0dGVyX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IFNpbXBsZUZvcm1hdHRlcigpOwpAQCAtMzMzLDYgKzUxNiwxOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRGb3JtYXR0ZXIgJiBzZXRGb3JtYXR0ZXIgbWV0aG9kcyB3aXRoIG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRGb3JtYXR0ZXJfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIC8vIHRlc3Qgc2V0IG51bGwKQEAgLTM1NCw2ICs1NTAsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0Rm9ybWF0dGVyIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Rm9ybWF0dGVyX0luc3VmZmljaWVudFByaXZpbGVnZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0zODMsNiArNTg4LDE5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldExldmVsICYgc2V0TGV2ZWwgbWV0aG9kcyB3aXRoIG5vbi1udWxsIHZhbHVlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldExldmVsX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIExldmVsIGYgPSBMZXZlbC5DT05GSUc7CkBAIC0zOTMsNiArNjExLDE5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldExldmVsICYgc2V0TGV2ZWwgbWV0aG9kcyB3aXRoIG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0TGV2ZWwgJiBzZXRMZXZlbCBtZXRob2RzIHdpdGggbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TGV2ZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRMZXZlbF9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgLy8gdGVzdCBzZXQgbnVsbApAQCAtNDE0LDYgKzY0NSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXRMZXZlbCB3aXRoIGluc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgIE51bGxQb2ludGVyRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldExldmVsX0luc3VmZmljaWVudFByaXZpbGVnZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC00NDMsNiArNjgzLDE1IEBACiAgICAgLyoKICAgICAgKiBVc2Ugbm8gZmlsdGVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb2dnYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0xvZ2dhYmxlX05vRmlsdGVyKCkgewogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CiAgICAgICAgIExvZ1JlY29yZCByID0gbmV3IExvZ1JlY29yZChMZXZlbC5DT05GSUcsIG51bGwpOwpAQCAtNDYyLDI0ICs3MTEsNTEgQEAKICAgICAvKgogICAgICAqIFVzZSBhIGZpbHRlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc0xvZ2dhYmxlIG1ldGhvZCB3aXRoIGZpbHRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xvZ2dhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzTG9nZ2FibGVfV2l0aEZpbHRlcigpIHsKICAgICAgICAgTW9ja0hhbmRsZXIgaCA9IG5ldyBNb2NrSGFuZGxlcigpOwogICAgICAgICBMb2dSZWNvcmQgciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuQ09ORklHLCBudWxsKTsKKyAgICAgICAgTG9nUmVjb3JkIHIxID0gbmV3IExvZ1JlY29yZChMZXZlbC5DT05GSUcsIG51bGwpOworICAgICAgICBMb2dSZWNvcmQgcjIgPSBuZXcgTG9nUmVjb3JkKExldmVsLkNPTkZJRywgbnVsbCk7CisgICAgICAgIAogICAgICAgICBoLnNldEZpbHRlcihuZXcgTW9ja0ZpbHRlcigpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoaC5pc0xvZ2dhYmxlKHIpKTsKLQorICAgICAgICBhc3NlcnRTYW1lKHIsQ2FsbFZlcmlmaWNhdGlvblN0YWNrLmdldEluc3RhbmNlKCkucG9wKCkpOworICAgICAgICAKICAgICAgICAgaC5zZXRMZXZlbChMZXZlbC5DT05GSUcpOwotICAgICAgICBhc3NlcnRGYWxzZShoLmlzTG9nZ2FibGUocikpOwotICAgICAgICBhc3NlcnRTYW1lKHIsIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLnBvcCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaC5pc0xvZ2dhYmxlKHIxKSk7CisgICAgICAgIGFzc2VydFNhbWUocjEsIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLnBvcCgpKTsKIAogICAgICAgICBoLnNldExldmVsKExldmVsLlNFVkVSRSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGguaXNMb2dnYWJsZShyKSk7Ci0gICAgICAgIGFzc2VydFNhbWUociwgQ2FsbFZlcmlmaWNhdGlvblN0YWNrLmdldEluc3RhbmNlKCkucG9wKCkpOworICAgICAgICBhc3NlcnRGYWxzZShoLmlzTG9nZ2FibGUocjIpKTsKKyAgICAgICAKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgQ2FsbFZlcmlmaWNhdGlvblN0YWNrLmdldEluc3RhbmNlKCkucG9wKCk7CisgICAgICAgIH1jYXRjaChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgLy9ub3JtYWwKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyI2lzTG9nZ2FibGUoTG9nUmVjb3JkKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb2dnYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0xvZ2dhYmxlX051bGwoKSB7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKICAgICAgICAgdHJ5IHsKQEAgLTQ5NCw2ICs3NzAsMTUgQEAKICAgICAgKiBUZXN0IHdoZXRoZXIgdGhlIGVycm9yIG1hbmFnZXIgaXMgYWN0dWFsbHkgY2FsbGVkIHdpdGggZXhwZWN0ZWQKICAgICAgKiBwYXJhbWV0ZXJzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXBvcnRFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuRXhjZXB0aW9uLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBvcnRFcnJvcigpIHsKICAgICAgICAgTW9ja0hhbmRsZXIgaCA9IG5ldyBNb2NrSGFuZGxlcigpOwogICAgICAgICBoLnNldEVycm9yTWFuYWdlcihuZXcgTW9ja0Vycm9yTWFuYWdlcigpKTsKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9MZXZlbFRlc3QuamF2YSBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9MZXZlbFRlc3QuamF2YQppbmRleCA3ZjFmYzVhLi5iZjY5MjBmIDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTGV2ZWxUZXN0LmphdmEKKysrIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xldmVsVGVzdC5qYXZhCkBAIC0xNyw4ICsxNywxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CkBAIC0zMCw2ICszNiw3IEBACiAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBzbyB0aGF0IHRoZSBub24tc3RhdGljIGlubmVyIGNsYXNzCiAgKiBNb2NrTGV2ZWwgY2FuIGJlIFNlcmlhbGl6YWJsZS4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhMZXZlbC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTGV2ZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CkBAIC0zOCw2ICs0NSwyMCBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGhvdXQgcmVzb3VyY2UgYnVuZGxlIHBhcmFtZXRlciB1c2luZyBub3JtYWwKICAgICAgKiB2YWx1ZXMuIEFzIGJ5cHJvZHVjdHMsIGdldE5hbWUgJiBpbnRWYWx1ZSBhcmUgYWxzbyB0ZXN0ZWQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzICB0aGUgY29uc3RydWN0b3Igd2l0aG91dCByZXNvdXJjZSBidW5kbGUgcGFyYW1ldGVyICIgKworICAgICAgICAgICAgInVzaW5nIG5vcm1hbCB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGV2ZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOb1Jlc0J1bmRsZV9Ob3JtYWwoKSB7CiAgICAgICAgIE1vY2tMZXZlbCBsID0gbmV3IE1vY2tMZXZlbCgibGV2ZWwxIiwgMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibGV2ZWwxIiwgbC5nZXROYW1lKCkpOwpAQCAtNDksNiArNzAsMjAgQEAKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aXRob3V0IHJlc291cmNlIGJ1bmRsZSBwYXJhbWV0ZXIgdXNpbmcgbnVsbCBuYW1lLgogICAgICAqIEFzIGJ5cHJvZHVjdHMsIGdldE5hbWUgJiBpbnRWYWx1ZSBhcmUgYWxzbyB0ZXN0ZWQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIHRoZSBjb25zdHJ1Y3RvciB3aXRob3V0IHJlc291cmNlIGJ1bmRsZSBwYXJhbWV0ZXIgIiArCisgICAgICAgICAgICAidXNpbmcgbnVsbCBuYW1lLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxldmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yTm9SZXNCdW5kbGVfTnVsbE5hbWUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0xldmVsKG51bGwsIC0yKTsKQEAgLTYyLDYgKzk3LDIwIEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aG91dCByZXNvdXJjZSBidW5kbGUgcGFyYW1ldGVyIHVzaW5nIGVtcHR5IG5hbWUuCiAgICAgICogQXMgYnlwcm9kdWN0cywgZ2V0TmFtZSAmIGludFZhbHVlIGFyZSBhbHNvIHRlc3RlZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgdGhlIGNvbnN0cnVjdG9yIHdpdGhvdXQgcmVzb3VyY2UgYnVuZGxlIHBhcmFtZXRlciAiICsKKyAgICAgICAgICAgICJ1c2luZyBlbXB0eSBuYW1lLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxldmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck5vUmVzQnVuZGxlX0VtcHR5TmFtZSgpIHsKICAgICAgICAgTW9ja0xldmVsIGwgPSBuZXcgTW9ja0xldmVsKCIiLCAtMyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgbC5nZXROYW1lKCkpOwpAQCAtNzMsNiArMTIyLDE5IEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3IgaGF2aW5nIHJlc291cmNlIGJ1bmRsZSBwYXJhbWV0ZXIgdXNpbmcgbm9ybWFsCiAgICAgICogdmFsdWVzLiBBcyBieXByb2R1Y3RzLCBnZXROYW1lICYgaW50VmFsdWUgYXJlIGFsc28gdGVzdGVkLgogICAgICAqLworICAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGludC5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JIYXZpbmdSZXNCdW5kbGVfTm9ybWFsKCkgewogICAgICAgICBNb2NrTGV2ZWwgbCA9IG5ldyBNb2NrTGV2ZWwoImxldmVsMSIsIDEsICJyZXNvdXJjZUJ1bmRsZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImxldmVsMSIsIGwuZ2V0TmFtZSgpKTsKQEAgLTg0LDYgKzE0NiwxNiBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIGhhdmluZyByZXNvdXJjZSBidW5kbGUgcGFyYW1ldGVyIHVzaW5nIG51bGwgbmFtZXMuCiAgICAgICogQXMgYnlwcm9kdWN0cywgZ2V0TmFtZSAmIGludFZhbHVlIGFyZSBhbHNvIHRlc3RlZC4KICAgICAgKi8KKyAgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxldmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JIYXZpbmdSZXNCdW5kbGVfTnVsbE5hbWUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0xldmVsKG51bGwsIC0xMjMsICJxd2UiKTsKQEAgLTk4LDYgKzE3MCwxNiBAQAogICAgICBuYW1lcy4KICAgICAgKiBBcyBieXByb2R1Y3RzLCBnZXROYW1lICYgaW50VmFsdWUgYXJlIGFsc28gdGVzdGVkLgogICAgICAqLworICAgICBAVGVzdEluZm8oCisgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBjb25zdHJ1Y3RvciBoYXZpbmcgcmVzb3VyY2UgYnVuZGxlIHBhcmFtZXRlciAiICsKKyAgICAgICAgICAgICJ1c2luZyBlbXB0eSBuYW1lcy4iLAorICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMZXZlbCIsCisgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgICkKKyAgICAgfSkKICAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9ySGF2aW5nUmVzQnVuZGxlX0VtcHR5TmFtZSgpIHsKICAgICAgTW9ja0xldmVsIGwgPSBuZXcgTW9ja0xldmVsKCIiLCAtMTAwMCwgIiIpOwogICAgICBhc3NlcnRFcXVhbHMoIiIsIGwuZ2V0TmFtZSgpKTsKQEAgLTEwOCw2ICsxOTAsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIHBhcnNlLCB3aXRoIHRoZSBwcmUtZGVmaW5lZCBzdHJpbmcgY29uc3RzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBhcnNlLCB3aXRoIHRoZSBwcmUtZGVmaW5lZCBzdHJpbmcgY29uc3RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9QcmVkZWZpbmVkQ29uc3RTdHJpbmdzKCkgewogICAgICAgICBhc3NlcnRTYW1lKExldmVsLlNFVkVSRSwgTGV2ZWwucGFyc2UoIlNFVkVSRSIpKTsKICAgICAgICAgYXNzZXJ0U2FtZShMZXZlbC5XQVJOSU5HLCBMZXZlbC5wYXJzZSgiV0FSTklORyIpKTsKQEAgLTEyMyw2ICsyMTQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIHBhcnNlLCB3aXRoIGFuIHVuZGVmaW5lZCBzdHJpbmcuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9JbGxlZ2FsQ29uc3RTdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBMZXZlbC5wYXJzZSgiU0VWRVJlIik7CkBAIC0xMzUsNiArMjM1LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBwYXJzZSwgd2l0aCBhIG51bGwgc3RyaW5nLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlX051bGxTdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBMZXZlbC5wYXJzZShudWxsKTsKQEAgLTE0Nyw2ICsyNTYsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIHBhcnNlLCB3aXRoIHByZS1kZWZpbmVkIHZhbGlkIG51bWJlciBzdHJpbmdzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBhcnNlLCB3aXRoIHByZS1kZWZpbmVkIHZhbGlkIG51bWJlciBzdHJpbmdzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9QcmVkZWZpbmVkTnVtYmVyKCkgewogICAgICAgICBhc3NlcnRTYW1lKExldmVsLlNFVkVSRSwgTGV2ZWwucGFyc2UoIlNFVkVSRSIpKTsKICAgICAgICAgYXNzZXJ0U2FtZShMZXZlbC5XQVJOSU5HLCBMZXZlbC5wYXJzZSgiV0FSTklORyIpKTsKQEAgLTE3MSw2ICsyODksMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIHBhcnNlLCB3aXRoIGFuIHVuZGVmaW5lZCB2YWxpZCBudW1iZXIgc3RyaW5ncy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwYXJzZSwgd2l0aCBhbiB1bmRlZmluZWQgdmFsaWQgbnVtYmVyIHN0cmluZ3MuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlX1VuZGVmaW5lZE51bWJlcigpIHsKICAgICAgICAgTGV2ZWwgbCA9IExldmVsLnBhcnNlKCIwIik7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBsLmludFZhbHVlKCkpOwpAQCAtMTgxLDYgKzMwOCwxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgcGFyc2UsIHdpdGggYW4gdW5kZWZpbmVkIHZhbGlkIG51bWJlciBzdHJpbmdzIHdpdGggc3BhY2VzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBhcnNlLCB3aXRoIGFuIHVuZGVmaW5lZCB2YWxpZCBudW1iZXIgc3RyaW5ncyAiICsKKyAgICAgICAgICAgICJ3aXRoIHNwYWNlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfVW5kZWZpbmVkTnVtYmVyV2l0aFNwYWNlcygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIExldmVsLnBhcnNlKCIgMCIpOwpAQCAtMTg4LDcgKzMyNSwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG5lZ2F0aXZlIG51bWJlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfTmVnYXRpdmVOdW1iZXIoKSB7CiAgICAgICAgIExldmVsIGwgPSBMZXZlbC5wYXJzZSgiLTQiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC00LCBsLmludFZhbHVlKCkpOwpAQCAtMjAwLDYgKzM0NSwxNiBAQAogICAgICAqIFRlc3QgbWV0aG9kIHBhcnNlLCBleHBlY3RpbmcgdGhlIHNhbWUgb2JqZWN0cyB3aWxsIGJlIHJldHVybmVkIGdpdmVuIHRoZQogICAgICAqIHNhbWUgbmFtZSwgZXZlbiBmb3Igbm9uLXByZWRlZmluZWQgbGV2ZWxzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBhcnNlLCBleHBlY3RpbmcgdGhlIHNhbWUgb2JqZWN0cyB3aWxsIGJlIHJldHVybmVkICIgKworICAgICAgICAgICAgImdpdmVuIHRoZSBzYW1lIG5hbWUsIGV2ZW4gZm9yIG5vbi1wcmVkZWZpbmVkIGxldmVscy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfU2FtZU9iamVjdCgpIHsKICAgICAgICAgTGV2ZWwgbCA9IExldmVsLnBhcnNlKCItMTAwIik7CiAgICAgICAgIGFzc2VydFNhbWUobCwgTGV2ZWwucGFyc2UoIi0xMDAiKSk7CkBAIC0yMDgsNiArMzYzLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBoYXNoQ29kZSwgd2l0aCBub3JtYWwgZmllbGRzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZV9Ob3JtYWwoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxMDAsIExldmVsLnBhcnNlKCIxMDAiKS5oYXNoQ29kZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBMZXZlbC5wYXJzZSgiLTEiKS5oYXNoQ29kZSgpKTsKQEAgLTIxOCw2ICszODIsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZXF1YWxzIHdoZW4gdHdvIG9iamVjdHMgYXJlIGVxdWFsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgbmVnYXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19FcXVhbCgpIHsKICAgICAgICAgTW9ja0xldmVsIGwxID0gbmV3IE1vY2tMZXZlbCgibGV2ZWwxIiwgMSk7CiAgICAgICAgIE1vY2tMZXZlbCBsMiA9IG5ldyBNb2NrTGV2ZWwoImxldmVsMiIsIDEpOwpAQCAtMjI4LDYgKzQwMSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBlcXVhbHMgd2hlbiB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBuZWdhdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzX05vdEVxdWFsKCkgewogICAgICAgICBNb2NrTGV2ZWwgbDEgPSBuZXcgTW9ja0xldmVsKCJsZXZlbDEiLCAxKTsKICAgICAgICAgTW9ja0xldmVsIGwyID0gbmV3IE1vY2tMZXZlbCgibGV2ZWwxIiwgMik7CkBAIC0yMzgsNiArNDIwLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGVxdWFscyB3aGVuIHRoZSBvdGhlciBvYmplY3QgaXMgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19OdWxsKCkgewogICAgICAgICBhc3NlcnRGYWxzZShMZXZlbC5BTEwuZXF1YWxzKG51bGwpKTsKICAgICB9CkBAIC0yNDUsNiArNDM2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGVxdWFscyB3aGVuIHRoZSBvdGhlciBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIExldmVsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBuZWdhdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzX05vdExldmVsKCkgewogICAgICAgICBhc3NlcnRGYWxzZShMZXZlbC5BTEwuZXF1YWxzKG5ldyBPYmplY3QoKSkpOwogICAgIH0KQEAgLTI1Miw2ICs0NTIsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZXF1YWxzIHdoZW4gdGhlIG90aGVyIG9iamVjdCBpcyBpdHNlbGYuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGVxdWFscyB3aGVuIHRoZSBvdGhlciBvYmplY3QgaXMgaXRzZWxmLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzX0l0c2VsZigpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShMZXZlbC5BTEwuZXF1YWxzKExldmVsLkFMTCkpOwogICAgIH0KQEAgLTI1OSw2ICs0NjgsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdG9TdHJpbmcgb2YgYSBub3JtYWwgTGV2ZWwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nX05vcm1hbCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBTEwiLCBMZXZlbC5BTEwudG9TdHJpbmcoKSk7CiAKQEAgLTI5Myw2ICs1MTEsMTUgQEAKICAgICAgKiBUZXN0IHNlcmlhbGl6YXRpb24gb2YgcHJlLWRlZmluZWQgY29uc3QgbGV2ZWxzLiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZQogICAgICAqIGRlc2VyaWFsaXplZCBjb3N0IGxldmVsIHNob3VsZCBiZSB0aGUgc2FtZSBpbnN0YW5jZSBhcyB0aGUgZXhpc3Rpbmcgb25lLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJTZXJpYWxpemF0aW9uIG9mIHByZS1kZWZpbmVkIGNvbnN0IGxldmVscy4gIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25fQ29uc3RMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYoTGV2ZWwuQUxMLApAQCAtMzA1LDYgKzUzMiwxNSBAQAogICAgICAqIFRlc3Qgc2VyaWFsaXphdGlvbiBvZiBub3JtYWwgaW5zdGFuY2Ugb2YgTGV2ZWwuIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlCiAgICAgICogZGVzZXJpYWxpemVkIGxldmVsIG9iamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG9yaWdpbmFsIG9uZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBzZXJpYWxpemF0aW9uIG9mIG5vcm1hbCBpbnN0YW5jZSBvZiBMZXZlbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbl9JbnN0YW5jZUxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gdGVzdHMgdGhhdCBvYmplY3RzIGFyZSB0aGUgc2FtZQpAQCAtMzI0LDEyICs1NjAsMjkgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJTZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywKICAgICAgICAgICAgICAgICBuZXcgTW9ja0xldmVsKCIxMjMiLCAxMjMsICJidW5kbGUiKSwgTEVWRUxfQ09NUEFSQVRPUik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsaXplZE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYWxOYW1lKCkgewogICAgICAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiYnVuZGxlcy9qYXZhL3V0aWwvbG9nZ2luZy9yZXMiKTsKICAgICAgICAgTGV2ZWwgbCA9IG5ldyBNb2NrTGV2ZWwoImxldmVsMSIsIDEyMCwKQEAgLTM1Niw2ICs2MDksMTUgQEAKICAgICAvKgogICAgICAqIHRlc3QgZm9yIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlc291cmNlQnVuZGxlTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9ICJidW5kbGVzL2phdmEvdXRpbC9sb2dnaW5nL3JlcyI7CiAgICAgICAgIExldmVsIGwgPSBuZXcgTW9ja0xldmVsKCJsZXZlbDEiLCAxMjApOwpAQCAtMzcyLDYgKzYzNCwxNSBAQAogICAgICAvKgogICAgICAqIHRlc3QgZm9yIG1ldGhvZCBwdWJsaWMgZmluYWwgaW50IGludFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50VmFsdWUoKSB7CiAgICAgICAgIGludCB2YWx1ZTEgPSAxMjA7CiAgICAgICAgIExldmVsIGwgPSBuZXcgTW9ja0xldmVsKCJsZXZlbDEiLCB2YWx1ZTEpOwpAQCAtMzgzLDYgKzY1NCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBkZWZpbmluZyBuZXcgbGV2ZWxzIGluIHN1YmNsYXNzZXMgb2YgTGV2ZWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBkZWZpbmluZyBuZXcgbGV2ZWxzIGluIHN1YmNsYXNzZXMgb2YgTGV2ZWwiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJjbGFzc05ld0xldmVsKCkgewogICAgICAgICBNeUxldmVsLkRVUExJQ0FURU5BTUUuZ2V0TmFtZSgpOy8vIGp1c3QgdG8gbG9hZCBNeUxldmVsIGNsYXNzCiAgICAgICAgIApkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xldmVsVGVzdFJlc291cmNlLmphdmEgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTGV2ZWxUZXN0UmVzb3VyY2UuamF2YQppbmRleCA1ZTA2YjcwLi45YjQxYTlkIDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTGV2ZWxUZXN0UmVzb3VyY2UuamF2YQorKysgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTGV2ZWxUZXN0UmVzb3VyY2UuamF2YQpAQCAtMTcsOCArMTcsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy50ZXN0cy5qYXZhLnV0aWwubG9nZ2luZzsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCitpbXBvcnQgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLy9AVGVzdFRhcmdldENsYXNzID0gTm8gdGVzdCBuZWVkZWQsIGp1c3QgdGVzdCBjbGFzcyBoZWxwZXIKIHB1YmxpYyBjbGFzcyBMZXZlbFRlc3RSZXNvdXJjZSBleHRlbmRzIExpc3RSZXNvdXJjZUJ1bmRsZSB7CiAgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiBjb250ZW50czsKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dNYW5hZ2VyVGVzdC5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ01hbmFnZXJUZXN0LmphdmEKaW5kZXggNjE0MDZmZi4uOGU2MjU2ZSAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ01hbmFnZXJUZXN0LmphdmEKKysrIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ01hbmFnZXJUZXN0LmphdmEKQEAgLTE5LDYgKzE5LDkgQEAKIAogLy9pbXBvcnQgYW5kcm9pZC5hY2Nlc3MuSVByb3BlcnR5Q2hhbmdlRXZlbnQ7CiAvL2ltcG9ydCBhbmRyb2lkLmFjY2Vzcy47CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uKjsKKworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CkBAIC0zMyw2ICszNiw3IEBACiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dpbmdQZXJtaXNzaW9uOwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXJUZXN0Lk51bGxPdXRwdXRTdHJlYW07CkBAIC00Myw2ICs0Nyw3IEBACiAgKiBhZGQvZ2V0IGxvZ2dlcihkb3QpCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhMb2dNYW5hZ2VyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBMb2dNYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT08gPSAiTG9nTWFuYWdlclRlc3RGb28iOwpAQCAtNzcsMTEgKzgyLDcgQEAKICAgICAgICAgbW9ja01hbmFnZXIgPSBuZXcgTW9ja0xvZ01hbmFnZXIoKTsKICAgICAgICAgLy8gICAgICAgIGxpc3RlbmVyID0gbmV3IE1vY2tQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7CiAgICAgICAgIGhhbmRsZXIgPSBuZXcgTW9ja0hhbmRsZXIoKTsKLSAgICAgICAgcHJvcHMgPSBpbml0UHJvcHMoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgUHJvcGVydGllcyBpbml0UHJvcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcHMucHV0KCJoYW5kbGVycyIsIGNsYXNzTmFtZSArICIkTW9ja0hhbmRsZXIgIiArIGNsYXNzTmFtZSArICIkTW9ja0hhbmRsZXIiKTsKICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuIiwgIiVoL2phdmEldS5sb2ciKTsKICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5saW1pdCIsICI1MDAwMCIpOwpAQCAtODksMTMgKzkwLDEyIEBACiAgICAgICAgIHByb3BzLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyIiwgImphdmEudXRpbC5sb2dnaW5nLlhNTEZvcm1hdHRlciIpOwogICAgICAgICBwcm9wcy5wdXQoIi5sZXZlbCIsICJGSU5FIik7CiAgICAgICAgIHByb3BzLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwiLCAiT0ZGIik7Ci0gICAgICAgIHByb3BzCi0gICAgICAgICAgICAgICAgLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIiKTsKKyAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIiLCJqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIiKTsKICAgICAgICAgcHJvcHMucHV0KCJMb2dNYW5hZ2VyVGVzdEZvby5oYW5kbGVycyIsICJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciIpOwogICAgICAgICBwcm9wcy5wdXQoIkxvZ01hbmFnZXJUZXN0Rm9vLmxldmVsIiwgIldBUk5JTkciKTsKLSAgICAgICAgcmV0dXJuIHByb3BzOwogICAgIH0KKyAgICAKKwogCiAgICAgLyoKICAgICAgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKQEAgLTEwNSw2ICsxMDUsMzYgQEAKICAgICAgICAgaGFuZGxlciA9IG51bGw7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAibm90IHJlYWxseSBuZWNlc3NhcnksIGFscmVhZHkgdGVzdGVkIHdpdGggdGhlIHNpbmdsZXRvbiAiICsKKyAgICAgICAgICAgICAgICAgICAgImdldExvZ01hbmFnZXIuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkxvZ01hbmFnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TG9nZ2VyLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nTWFuYWdlcigpIHsKKyAgICAgICAKKyAgICB9CisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZExvZ2dlciIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtMb2dnZXIuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRHZXRMb2dnZXIoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBuZXcgTW9ja0xvZ2dlcihGT08sIG51bGwpOwogICAgICAgICBMb2dnZXIgZm9vID0gbW9ja01hbmFnZXIuZ2V0TG9nZ2VyKEZPTyk7CkBAIC0xMzgsNiArMTY4LDIxIEBACiAgICAgICAgIGFzc2VydEVxdWFscyhpLCAxKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkTG9nZ2VyIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0xvZ2dlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9nZ2VyIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEdldExvZ2dlcl9kdXBsaWNhdGVOYW1lKCkgewogICAgICAgICAvLyBhZGQgbG9nZ2VyIHdpdGggZHVwbGljYXRlIG5hbWUgaGFzIG5vIGVmZmVjdAogICAgICAgICBMb2dnZXIgZm9vID0gbmV3IE1vY2tMb2dnZXIoRk9PLCBudWxsKTsKQEAgLTE1NSw2ICsyMDAsMjEgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRMb2dnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TG9nZ2VyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkR2V0TG9nZ2VyX0hpZXJhY2h5KCkgewogICAgICAgICBMb2dnZXIgZm9vID0gbmV3IE1vY2tMb2dnZXIoInRlc3RBZGRHZXRMb2dnZXJfSGllcmFjaHkuZm9vIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBjaGlsZCA9IG5ldyBNb2NrTG9nZ2VyKCJ0ZXN0QWRkR2V0TG9nZ2VyX0hpZXJhY2h5LmZvby5jaGlsZCIsIG51bGwpOwpAQCAtMTk0LDYgKzI1NCwyMSBAQAogICAgICAgICBhc3NlcnRTYW1lKG90aGVyQ2hpbGQsIGdyYW5kc29uLmdldFBhcmVudCgpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkTG9nZ2VyIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0xvZ2dlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9nZ2VyIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZExvZ2dlclJldmVyc2VPcmRlcigpIHsKICAgICAgICAgTG9nZ2VyIHJvb3QgPSBuZXcgTW9ja0xvZ2dlcigidGVzdEFkZExvZ2dlclJldmVyc2VPcmRlciIsIG51bGwpOwogICAgICAgICBMb2dnZXIgZm9vID0gbmV3IE1vY2tMb2dnZXIoInRlc3RBZGRMb2dnZXJSZXZlcnNlT3JkZXIuZm9vIiwgbnVsbCk7CkBAIC0yMjYsNiArMzAxLDE3IEBACiAgICAgICAgIGFzc2VydFNhbWUocmVhbFJvb3QsIHJvb3QuZ2V0UGFyZW50KCkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRMb2dnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TG9nZ2VyLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZFNpbWlsaWFyTG9nZ2VyKCkgewogICAgICAgICBMb2dnZXIgcm9vdCA9IG5ldyBNb2NrTG9nZ2VyKCJ0ZXN0QWRkU2ltaWxpYXJMb2dnZXIiLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIGZvbyA9IG5ldyBNb2NrTG9nZ2VyKCJ0ZXN0QWRkU2ltaWxpYXJMb2dnZXIuZm9vIiwgbnVsbCk7CkBAIC0yNTcsNiArMzQzLDIxIEBACiAgICAgICAgIGFzc2VydFNhbWUoZm9vbywgZm9vb0NoaWxkLmdldFBhcmVudCgpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkTG9nZ2VyIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0xvZ2dlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEdldExvZ2dlcl9uYW1lV2l0aFNwYWNlKCkgewogICAgICAgICBMb2dnZXIgZm9vID0gbmV3IE1vY2tMb2dnZXIoRk9PLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIGZvb0JlZm9yZVNwYWNlID0gbmV3IE1vY2tMb2dnZXIoRk9PICsgIiAiLCBudWxsKTsKQEAgLTI3Myw2ICszNzQsMjIgQEAKICAgICAgICAgYXNzZXJ0U2FtZShmb29XaXRoQm90aFNwYWNlLCBtb2NrTWFuYWdlci5nZXRMb2dnZXIoIiAiICsgRk9PICsgIiAiKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24gb2YgYWRkTG9nZ2VyICIgKworICAgICAgICAgICAgICAgICAgICAibWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRMb2dnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TG9nZ2VyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkR2V0TG9nZ2VyX2FkZFJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBMb2dnZXIgZm9vID0gbmV3IE1vY2tMb2dnZXIoRk9PLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIGZvb0NoaWxkID0gbmV3IE1vY2tMb2dnZXIoRk9PICsgIi5jaGlsZCIsIG51bGwpOwpAQCAtMzAzLDYgKzQyMCwyMSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyI2FkZExvZ2dlcihMb2dnZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworCisgICAgICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkTG9nZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0xvZ2dlci5jbGFzc30KKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dNYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkTG9nZ2VyTExvZ2dlcl9TZWN1cml0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMTI4NgogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb3JpZ2luYWxTZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0zMTYsNyArNDQ4LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdExvZ2dlclByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZENvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7SW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0RGVmYXVsdExvZ2dlclByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gbW9jayBMb2dNYW5hZ2VyIGhhcyBubyBkZWZhdWx0IGxvZ2dlcgogICAgICAgICBhc3NlcnROdWxsKG1vY2tNYW5hZ2VyLmdldExvZ2dlcigiIikpOwogICAgICAgICBhc3NlcnROdWxsKG1vY2tNYW5hZ2VyLmdldExvZ2dlcigiZ2xvYmFsIikpOwpAQCAtMzQ5LDYgKzQ5MCwyMiBAQAogICAgICAqIGNhc2UgMzogdGVzdCBiYWQgbmFtZQogICAgICAqIGNhc2UgNDogY2hlY2sgY29ycmVjdCB0ZXN0ZWQgdmFsdWUKICAgICAgKi8KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9nZ2VyTmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8vIGNhc2UgMTogdGVzdCBkZWZhdWx0IGFuZCB2YWxpZCB2YWx1ZQpAQCAtMzg1LDYgKzU0MiwyMCBAQAogICAgIC8qCiAgICAgICogdGVzdCBmb3IgbWV0aG9kIHB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKFN0cmluZyBuYW1lKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlck5hbWVzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dnZXJfZHVwbGljYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyB0ZXN0IGR1cGxpY2F0ZSBuYW1lCiAgICAgICAgIC8vIGFkZCBsb2dnZXIgd2l0aCBkdXBsaWNhdGUgbmFtZSBoYXMgbm8gZWZmZWN0CkBAIC00MDgsNiArNTc5LDE3IEBACiAgICAgLyoKICAgICAgKiB0ZXN0IGZvciBtZXRob2QgcHVibGljIExvZ2dlciBnZXRMb2dnZXIoU3RyaW5nIG5hbWUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyX2hpZXJhY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHRlc3QgaGllcmFjaHkKICAgICAgICAgTG9nZ2VyIGZvbyA9IG5ldyBNb2NrTG9nZ2VyKCJ0ZXN0R2V0TG9nZ2VyX2hpZXJhY2h5LmZvbyIsIG51bGwpOwpAQCAtNDIwLDYgKzYwMiwxNyBAQAogICAgIC8qCiAgICAgICogdGVzdCBmb3IgbWV0aG9kIHB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKFN0cmluZyBuYW1lKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcl9uYW1lU3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gdGVzdCBuYW1lIHdpdGggc3BhY2UKICAgICAgICAgTG9nZ2VyIGZvbyA9IG5ldyBNb2NrTG9nZ2VyKEZPTywgbnVsbCk7CkBAIC00NDAsNiArNjMzLDIyIEBACiAgICAgLyoKICAgICAgKiB0ZXN0IGZvciBtZXRob2QgcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrQWNjZXNzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dNYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FjY2VzcygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1hbmFnZXIuY2hlY2tBY2Nlc3MoKTsKQEAgLTQ2MSw2ICs2NzAsMzMgQEAKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzZWN1cml0eU1hbmFnZXIpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzfSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkQ29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tBY2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9nTWFuYWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2luZ1Blcm1pc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyTG9nUGVybWlzc2lvbigpKTsKICAgICAgICAgbW9ja01hbmFnZXIuYWRkTG9nZ2VyKG5ldyBNb2NrTG9nZ2VyKCJhYmMiLCBudWxsKSk7CkBAIC01MTIsNiArNzQ4LDIwIEBACiAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIoc2VjdXJpdHlNYW5hZ2VyKTsKICAgICB9CiAKKworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1vY2tHZXRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBtb2NrIG1hbmFnZXIgZG9lc24ndCByZWFkIGNvbmZpZ3VyYXRpb24gdW50aWwgeW91IGNhbGwKICAgICAgICAgLy8gcmVhZENvbmZpZ3VyYXRpb24oKQpAQCAtNTMwLDE1ICs3ODAsMTkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tNYW5hZ2VyLmdldExvZ2dlcigiIikuZ2V0SGFuZGxlcnMoKS5sZW5ndGgpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvcGVydHkiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFByb3BlcnR5KCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vICAgICAgLy9GSVhNRTogbW92ZSBpdCB0byBleGVjCi0gICAgICAgIC8vICAgICAgICBtYW5hZ2VyLnJlYWRDb25maWd1cmF0aW9uKEVudmlyb25tZW50SGVscGVyLlByb3BlcnRpZXNUb0lucHV0U3RyZWFtKHByb3BzKSk7Ci0gICAgICAgIC8vICAgICAgICBMb2dnZXIgcm9vdCA9IG1hbmFnZXIuZ2V0TG9nZ2VyKCIiKTsKLSAgICAgICAgLy8vLyAgICAgICAgY2hlY2tQcm9wZXJ0eShtYW5hZ2VyKTsKLSAgICAgICAgLy8gICAgICAgIGFzc2VydEVxdWFscyhMZXZlbC5GSU5FLCByb290LmdldExldmVsKCkpOwotICAgICAgICAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJvb3QuZ2V0SGFuZGxlcnMoKS5sZW5ndGgpOwogCi0gICAgICAgIC8vIGJ1dCBub24tbW9jayBtYW5hZ2VyIERPIHJlYWQgaXQgZnJvbSB0aGUgdmVyeSBiZWdpbm5pbmcKICAgICAgICAgTG9nZ2VyIHJvb3QgPSBtYW5hZ2VyLmdldExvZ2dlcigiIik7CiAgICAgICAgIG1hbmFnZXIucmVhZENvbmZpZ3VyYXRpb24oRW52aXJvbm1lbnRIZWxwZXIuUHJvcGVydGllc1RvSW5wdXRTdHJlYW0ocHJvcHMpKTsKICAgICAgICAgY2hlY2tQcm9wZXJ0eShtYW5hZ2VyKTsKQEAgLTU1Miw2ICs4MDYsMTcgQEAKICAgICAgICAgbWFuYWdlci5yZWFkQ29uZmlndXJhdGlvbihFbnZpcm9ubWVudEhlbHBlci5Qcm9wZXJ0aWVzVG9JbnB1dFN0cmVhbShwcm9wcykpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkQ29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtJbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQ29uZmlndXJhdGlvbl9udWxsKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtYW5hZ2VyLnJlYWRDb25maWd1cmF0aW9uKG51bGwpOwpAQCAtNTYwLDcgKzgyNSwyMCBAQAogICAgICAgICB9CiAKICAgICB9CisgICAgCisgICAgCiAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9KQogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQcm9wZXJ0eU51bGwoTG9nTWFuYWdlciBtKSB7CiAgICAgICAgIC8vIGFzc2VydE51bGwobS5nZXRQcm9wZXJ0eSgiLmxldmVsIikpOwogICAgICAgICBhc3NlcnROdWxsKG0uZ2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxpbWl0IikpOwpAQCAtNTczLDYgKzg1MSwxNyBAQAogICAgICAgICBhc3NlcnROdWxsKG0uZ2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLnBhdHRlcm4iKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSkKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUHJvcGVydHkoTG9nTWFuYWdlciBtKSB7CiAgICAgICAgIC8vIGFzc2VydEVxdWFscyhtLmdldFByb3BlcnR5KCIubGV2ZWwiKSwgIklORk8iKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG0uZ2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxpbWl0IiksICI1MDAwMCIpOwpAQCAtNjE4LDEwICs5MDcsMjEgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgcmVhZENvbmZpZ3VyYXRpb24oSW5wdXRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRDb25maWd1cmF0aW9uSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBtb2NrIExvZ01hbmFnZXIKICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gRW52aXJvbm1lbnRIZWxwZXIuUHJvcGVydGllc1RvSW5wdXRTdHJlYW0ocHJvcHMpOwotCisgICAgICAgIAogICAgICAgICBMb2dnZXIgZm9vID0gbmV3IE1vY2tMb2dnZXIoRk9PLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbChmb28uZ2V0TGV2ZWwoKSk7CiAgICAgICAgIGFzc2VydFRydWUobW9ja01hbmFnZXIuYWRkTG9nZ2VyKGZvbykpOwpAQCAtNjMyLDcgKzkzMiw3IEBACiAKICAgICAgICAgSGFuZGxlciBoID0gbmV3IENvbnNvbGVIYW5kbGVyKCk7CiAgICAgICAgIExldmVsIGwgPSBoLmdldExldmVsKCk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUoTGV2ZWwuT0ZGLCBoLmdldExldmVsKCkpOworICAgICAgICBhc3NlcnRTYW1lKExldmVsLk9GRiwgaC5nZXRMZXZlbCgpKTsKIAogICAgICAgICAvLyByZWFkIGNvbmZpZ3VyYXRpb24gZnJvbSBzdHJlYW0KICAgICAgICAgbW9ja01hbmFnZXIucmVhZENvbmZpZ3VyYXRpb24oc3RyZWFtKTsKQEAgLTY0NSwxMCArOTQ1LDIxIEBACiAgICAgICAgIGFzc2VydE51bGwoZm8uZ2V0TGV2ZWwoKSk7CiAKICAgICAgICAgLy8gcmVhZCBwcm9wZXJ0aWVzIGRvbid0IGFmZmVjdCBoYW5kbGVyCi0gICAgICAgIGFzc2VydE5vdFNhbWUoTGV2ZWwuT0ZGLCBoLmdldExldmVsKCkpOworICAgICAgICBhc3NlcnRTYW1lKExldmVsLk9GRiwgaC5nZXRMZXZlbCgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShsLCBoLmdldExldmVsKCkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkQ29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtJbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQ29uZmlndXJhdGlvbklucHV0U3RyZWFtX251bGwoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1vY2tNYW5hZ2VyLnJlYWRDb25maWd1cmF0aW9uKG51bGwpOwpAQCAtNjU3LDcgKzk2OCwzOCBAQAogICAgICAgICB9CiAKICAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSU9FeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRDb25maWd1cmF0aW9uSW5wdXRTdHJlYW1fSU9FeGNlcHRpb25fMXBhcm0oKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbW9ja01hbmFnZXIucmVhZENvbmZpZ3VyYXRpb24obmV3IE1vY2tJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICB9CiAKKyAgICB9CisKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZENvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7SW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZENvbmZpZ3VyYXRpb25JbnB1dFN0cmVhbV9yb290KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gRW52aXJvbm1lbnRIZWxwZXIuUHJvcGVydGllc1RvSW5wdXRTdHJlYW0ocHJvcHMpOwogICAgICAgICBtYW5hZ2VyLnJlYWRDb25maWd1cmF0aW9uKEVudmlyb25tZW50SGVscGVyLlByb3BlcnRpZXNUb0lucHV0U3RyZWFtKHByb3BzKSk7CkBAIC03NDQsNiArMTA4NiwxNyBAQAogICAgIC8vICAgICAgICBtb2NrTWFuYWdlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG51bGwpOwogICAgIC8vICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gbW9jayBMb2dNYW5hZ2VyCiAgICAgICAgIG1vY2tNYW5hZ2VyLnJlYWRDb25maWd1cmF0aW9uKEVudmlyb25tZW50SGVscGVyLlByb3BlcnRpZXNUb0lucHV0U3RyZWFtKHByb3BzKSk7CkBAIC03NzgsNiArMTEzMSwxOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcm9vdC5nZXRIYW5kbGVycygpLmxlbmd0aCk7CiAgICAgfQogCisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdsb2JhbFByb3BlcnR5Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByaW50U3RyZWFtIGVyciA9IFN5c3RlbS5lcnI7CiAgICAgICAgIHRyeSB7CkBAIC04NTAsNyArMTIxNSwxNyBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZENvbmZpZ0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBvbGRQcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmNsYXNzIik7CiAgICAgICAgIHRyeSB7CkBAIC04NzIsMjEgKzEyNDcsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzA3NQotICAgIC8vPz8/IGxvZ2dpbmc6IE1YIGlzIGJhc2VkIG9uIE1hbmFnZW1lbnQgcGFja2FnZTogbm90IHN1cHBvcnRlZC4KLSAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2luZ01YQmVhbigpIHRocm93cyBFeGNlcHRpb257Ci0gICAgLy8gICAgICAgIGFzc2VydE5vdE51bGwoTG9nTWFuYWdlci5nZXRMb2dnaW5nTVhCZWFuKCkpOwotICAgIC8vICAgIH0KLQogICAgIC8qCiAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgKiBtb2NrIGNsYXNzZXMKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCisgICAgCisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ0NsYXNzIHsKICAgICAgICAgcHVibGljIENvbmZpZ0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBMb2dNYW5hZ2VyIG1hbiA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpOwotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IExvZ01hbmFnZXJUZXN0LmluaXRQcm9wcygpOworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwcm9wcy5wdXQoImhhbmRsZXJzIiwgY2xhc3NOYW1lICsgIiRNb2NrSGFuZGxlciAiICsgY2xhc3NOYW1lICsgIiRNb2NrSGFuZGxlciIpOworICAgICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuIiwgIiVoL2phdmEldS5sb2ciKTsKKyAgICAgICAgICAgIHByb3BzLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGltaXQiLCAiNTAwMDAiKTsKKyAgICAgICAgICAgIHByb3BzLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuY291bnQiLCAiNSIpOworICAgICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXIiLCAiamF2YS51dGlsLmxvZ2dpbmcuWE1MRm9ybWF0dGVyIik7CisgICAgICAgICAgICBwcm9wcy5wdXQoIi5sZXZlbCIsICJGSU5FIik7CisgICAgICAgICAgICBwcm9wcy5wdXQoImphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsIiwgIk9GRiIpOworICAgICAgICAgICAgcHJvcHMucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIiLCJqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIiKTsKKyAgICAgICAgICAgIHByb3BzLnB1dCgiTG9nTWFuYWdlclRlc3RGb28uaGFuZGxlcnMiLCAiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIiKTsKKyAgICAgICAgICAgIHByb3BzLnB1dCgiTG9nTWFuYWdlclRlc3RGb28ubGV2ZWwiLCAiV0FSTklORyIpOwogICAgICAgICAgICAgcHJvcHMucHV0KCJ0ZXN0Q29uZmlnQ2xhc3MuZm9vLmxldmVsIiwgIk9GRiIpOwogICAgICAgICAgICAgcHJvcHMucHV0KCJ0ZXN0Q29uZmlnQ2xhc3MuZm9vLmhhbmRsZXJzIiwgImphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyIik7CiAgICAgICAgICAgICBwcm9wcy5wdXQoIi5sZXZlbCIsICJGSU5FU1QiKTsKQEAgLTExOTQsNCArMTU3NSwxNiBAQAogICAgICAgICBzdGF0aWMgY2xhc3MgTW9ja0Vycm9yIGV4dGVuZHMgRXJyb3IgewogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgCisgICAgfQorICAgIAorICAgIAogfQpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ1JlY29yZFRlc3QuamF2YSBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dSZWNvcmRUZXN0LmphdmEKaW5kZXggNTY1NmY2ZC4uMTY2NDgzZSAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ1JlY29yZFRlc3QuamF2YQorKysgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTG9nUmVjb3JkVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CkBAIC0yNSwxMSArMzAsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwogCisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKExvZ1JlY29yZC5jbGFzcykKIHB1YmxpYyBjbGFzcyBMb2dSZWNvcmRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNU0cgPSAidGVzdCBtc2csIHBscy4gaWdub3JlIGl0YiI7CkBAIC00MSw5ICs0OCwxMyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIGxyID0gbmV3IExvZ1JlY29yZChMZXZlbC5DT05GSUcsIE1TRyk7Ci0KICAgICB9CiAKKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJMb2dSZWNvcmQiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzfSkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dSZWNvcmRXaXRoTnVsbFBvaW50ZXJzKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IExvZ1JlY29yZChudWxsLCBudWxsKTsKQEAgLTYwLDYgKzcxLDEwIEBACiAgICAgICAgIGFzc2VydE51bGwoci5nZXRNZXNzYWdlKCkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICJub3JtYWxseSBzZXQvZ2V0IGRvbid0IG5lZWQgdG8gYmUgdGVzdGVkIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TG9nZ2VyTmFtZSIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldExvZ2dlck5hbWUiLCBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0TG9nZ2VyTmFtZSgpIHsKICAgICAgICAgYXNzZXJ0TnVsbChsci5nZXRMb2dnZXJOYW1lKCkpOwogICAgICAgICBsci5zZXRMb2dnZXJOYW1lKG51bGwpOwpAQCAtNjgsNiArODMsMTEgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IGxvZ2dlciBuYW1lIiwgbHIuZ2V0TG9nZ2VyTmFtZSgpKTsKICAgICB9CiAKKworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZUJ1bmRsZSIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFJlc291cmNlQnVuZGxlIiwgbWV0aG9kQXJncyA9IHtSZXNvdXJjZUJ1bmRsZS5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0UmVzb3VyY2VCdW5kbGUoKSB7CiAgICAgICAgIGFzc2VydE51bGwobHIuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOwogICAgICAgICBhc3NlcnROdWxsKGxyLmdldFJlc291cmNlQnVuZGxlKCkpOwpAQCAtODYsNiArMTA2LDEwIEBACiAgICAgICAgIGFzc2VydE51bGwobHIuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZUJ1bmRsZU5hbWUiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRSZXNvdXJjZUJ1bmRsZU5hbWUiLCBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICBhc3NlcnROdWxsKGxyLmdldFJlc291cmNlQnVuZGxlTmFtZSgpKTsKICAgICAgICAgbHIuc2V0UmVzb3VyY2VCdW5kbGVOYW1lKG51bGwpOwpAQCAtOTMsOCArMTE3LDI0IEBACiAgICAgICAgIGxyLnNldFJlc291cmNlQnVuZGxlTmFtZSgidGVzdCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBsci5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSk7CiAgICAgfQorICAgIAorICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICJub3JtYWwgYmVoYXZpb3Igb2YgZ2V0dGVyL3NldHRlciBkb24ndCBuZWVkIHRvIGJlIHRlc3RlZCAobm9ybWFsbHkpIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWwiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRMZXZlbCIsIG1ldGhvZEFyZ3MgPSB7TGV2ZWwuY2xhc3N9KQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNldExldmVsTm9ybWFsKCkgeyAgICAgICAgICAgCisgICAgICAgIGFzc2VydFNhbWUobHIuZ2V0TGV2ZWwoKSwgTGV2ZWwuQ09ORklHKTsKKyAgICAgICAgbHIuc2V0TGV2ZWwoTGV2ZWwuQUxMKTsKKyAgICAgICAgYXNzZXJ0U2FtZShsci5nZXRMZXZlbCgpLCBMZXZlbC5BTEwpOworICAgICAgICBsci5zZXRMZXZlbChMZXZlbC5GSU5FU1QpOworICAgICAgICBhc3NlcnRTYW1lKGxyLmdldExldmVsKCksIExldmVsLkZJTkVTVCk7CisgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNldExldmVsKCkgeworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRMZXZlbCIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldExldmVsIiwgbWV0aG9kQXJncyA9IHtMZXZlbC5jbGFzc30pCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0TGV2ZWxOdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxyLnNldExldmVsKG51bGwpOwogICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7CkBAIC0xMDMsMTYgKzE0MywyNCBAQAogICAgICAgICBhc3NlcnRTYW1lKGxyLmdldExldmVsKCksIExldmVsLkNPTkZJRyk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFNlcXVlbmNlTnVtYmVyIiwgbWV0aG9kQXJncyA9IHt9KSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0U2VxdWVuY2VOdW1iZXIiLCBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldFNlcXVlbmNlTnVtYmVyKCkgewogICAgICAgICBsb25nIGwgPSBsci5nZXRTZXF1ZW5jZU51bWJlcigpOwogICAgICAgICBsci5zZXRTZXF1ZW5jZU51bWJlcigtMTExKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGxyLmdldFNlcXVlbmNlTnVtYmVyKCksIC0xMTFMKTsKICAgICAgICAgbHIuc2V0U2VxdWVuY2VOdW1iZXIoMCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhsci5nZXRTZXF1ZW5jZU51bWJlcigpLCAwTCk7Ci0gICAgICAgIGxyID0gbmV3IExvZ1JlY29yZChMZXZlbC5BTEwsIG51bGwpOworICAgICAgICBsciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuQUxMLCBudWxsKTsgLy9zZXF1ZW5jZU51bWJlciBpcyB1cGRhdGVkIHRvIGEgcHJpdmF0ZSBzdGF0aWMgY291bnRlcgogICAgICAgICBhc3NlcnRFcXVhbHMobHIuZ2V0U2VxdWVuY2VOdW1iZXIoKSwgbCArIDEpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRTb3VyY2VDbGFzc05hbWUiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRTb3VyY2VDbGFzc05hbWUiLCBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0U291cmNlQ2xhc3NOYW1lKCkgewogICAgICAgICBsci5zZXRTb3VyY2VDbGFzc05hbWUobnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwobHIuZ2V0U291cmNlQ2xhc3NOYW1lKCkpOwpAQCAtMTIyLDYgKzE3MCwxMCBAQAogICAgICAgICBhc3NlcnRFcXVhbHModGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgbHIuZ2V0U291cmNlQ2xhc3NOYW1lKCkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFNvdXJjZU1ldGhvZE5hbWUiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRTb3VyY2VNZXRob2ROYW1lIiwgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldFNvdXJjZU1ldGhvZE5hbWUoKSB7CiAgICAgICAgIGxyLnNldFNvdXJjZU1ldGhvZE5hbWUobnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwobHIuZ2V0U291cmNlTWV0aG9kTmFtZSgpKTsKQEAgLTEzMSw2ICsxODMsMTIgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGxyLmdldFNvdXJjZU1ldGhvZE5hbWUoKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0U291cmNlTWV0aG9kTmFtZSIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFNvdXJjZU1ldGhvZE5hbWUiLCBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRTb3VyY2VDbGFzc05hbWUiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRTb3VyY2VDbGFzc05hbWUiLCBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U291cmNlRGVmYXVsdFZhbHVlKCkgewogICAgICAgICBhc3NlcnROdWxsKGxyLmdldFNvdXJjZU1ldGhvZE5hbWUoKSk7CiAgICAgICAgIGFzc2VydE51bGwobHIuZ2V0U291cmNlQ2xhc3NOYW1lKCkpOwpAQCAtMTYwLDEwICsyMTgsMTAgQEAKICAgICAgICAgLy8gc2V0IGJvdGgKICAgICAgICAgbHIgPSBuZXcgTG9nUmVjb3JkKExldmVsLlNFVkVSRSwgTVNHKTsKICAgICAgICAgbHIuc2V0U291cmNlQ2xhc3NOYW1lKCJjbGFzc05hbWUiKTsKLSAgICAgICAgbHIuc2V0U291cmNlTWV0aG9kTmFtZShudWxsKTsKKyAgICAgICAgbHIuc2V0U291cmNlTWV0aG9kTmFtZSgibWV0aG9kTmFtZSIpOwogICAgICAgICBsb2dnZXIubG9nKGxyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzc05hbWUiLCBoYW5kbGVyLmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldFNvdXJjZU1ldGhvZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kTmFtZSIsIGhhbmRsZXIuZ2V0U291cmNlTWV0aG9kTmFtZSgpKTsKIAogICAgICAgICAvLyB0ZXN0IGlmIExvZ1JlY29yZCBpcyBjb25zdHJ1Y3RlZCBpbiBhbm90aGVyIGNsYXNzLCBhbmQgaXMgcHVibGlzaGVkCiAgICAgICAgIC8vIGJ5IExvZ2dlcgpAQCAtMTcyLDggKzIzMCw2IEBACiAgICAgICAgIGFzc2VydEVxdWFscygidGVzdEdldFNvdXJjZURlZmF1bHRWYWx1ZSIsIGhhbmRsZXIuZ2V0U291cmNlTWV0aG9kTmFtZSgpKTsKIAogICAgICAgICBsciA9IFJlY29yZEZhY3RvcnkuZ2V0RGVmYXVsdFJlY29yZCgpOwotICAgICAgICAvLyBhc3NlcnROdWxsKGxyLmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKLSAgICAgICAgLy8gYXNzZXJ0TnVsbChsci5nZXRTb3VyY2VNZXRob2ROYW1lKCkpOwogICAgICAgICBSZWNvcmRGYWN0b3J5LmxvZyhsb2dnZXIsIGxyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlY29yZEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgLmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKQEAgLTE4NywyMSArMjQzLDE4IEBACiAgICAgICAgIGFzc2VydE51bGwoaGFuZGxlci5nZXRTb3VyY2VDbGFzc05hbWUoKSk7CiAgICAgICAgIGFzc2VydE51bGwoaGFuZGxlci5nZXRTb3VyY2VNZXRob2ROYW1lKCkpOwogCi0gICAgICAgIC8vIGl0IGNhbm5vdCBmaW5kIGNvcnJlY3QgZGVmYXVsdCB2YWx1ZSB3aGVuIGxvZ2dlciBpcyBzdWJjbGFzcwogICAgICAgICBNb2NrTG9nZ2VyIG1sID0gbmV3IE1vY2tMb2dnZXIoImZvbyIsIG51bGwpOwogICAgICAgICBtbC5hZGRIYW5kbGVyKGhhbmRsZXIpOwogICAgICAgICBtbC5pbmZvKE1TRyk7CiAgICAgICAgIGFzc2VydEVxdWFscyhjbGFzc05hbWUgKyAiJE1vY2tMb2dnZXIiLCBoYW5kbGVyLmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmZvIiwgaGFuZGxlci5nZXRTb3VyY2VNZXRob2ROYW1lKCkpOwogCi0gICAgICAgIC8vIGl0IGNhbiBmaW5kIG5vdGhpbmcgd2hlbiBvbmx5IGNhbGwgU3ViY2xhc3MKICAgICAgICAgbWwgPSBuZXcgTW9ja0xvZ2dlcigiZm9vIiwgbnVsbCk7CiAgICAgICAgIG1sLmFkZEhhbmRsZXIoaGFuZGxlcik7CiAgICAgICAgIG1sLmxvZyhMZXZlbC5TRVZFUkUsIE1TRyk7CiAgICAgICAgIGFzc2VydE51bGwoaGFuZGxlci5nZXRTb3VyY2VDbGFzc05hbWUoKSk7CiAgICAgICAgIGFzc2VydE51bGwoaGFuZGxlci5nZXRTb3VyY2VNZXRob2ROYW1lKCkpOwogCi0gICAgICAgIC8vIHRlc3QgaWYgZG9uJ3QgY2FsbCBsb2dnZXIsIHdoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgbHIgPSBuZXcgTG9nUmVjb3JkKExldmVsLlNFVkVSRSwgTVNHKTsKICAgICAgICAgaGFuZGxlci5wdWJsaXNoKGxyKTsKICAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKQEAgLTIwOSw2ICsyNjIsMTAgQEAKICAgICAgICAgbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaGFuZGxlcik7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRNZXNzYWdlIiwgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldE1lc3NhZ2UoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhNU0csIGxyLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIGxyLnNldE1lc3NhZ2UobnVsbCk7CkBAIC0yMTcsNiArMjc0LDEwIEBACiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgbHIuZ2V0TWVzc2FnZSgpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0UGFyYW1ldGVycyIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFBhcmFtZXRlcnMiLCBtZXRob2RBcmdzID0ge09iamVjdFtdLmNsYXNzfSkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRQYXJhbWV0ZXJzKCkgewogICAgICAgICBhc3NlcnROdWxsKGxyLmdldFBhcmFtZXRlcnMoKSk7CiAgICAgICAgIGxyLnNldFBhcmFtZXRlcnMobnVsbCk7CkBAIC0yMjQsMTEgKzI4NSwxNSBAQAogICAgICAgICBPYmplY3RbXSBvYSA9IG5ldyBPYmplY3RbMF07CiAgICAgICAgIGxyLnNldFBhcmFtZXRlcnMob2EpOwogICAgICAgICBhc3NlcnRFcXVhbHMob2EsIGxyLmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgIG9hID0gbmV3IE9iamVjdFtdIHsgbmV3IE9iamVjdCgpLCBuZXcgT2JqZWN0KCkgfTsKKyAgICAgICAgb2EgPSBuZXcgT2JqZWN0W10ge25ldyBPYmplY3QoKSwgbmV3IE9iamVjdCgpfTsKICAgICAgICAgbHIuc2V0UGFyYW1ldGVycyhvYSk7CiAgICAgICAgIGFzc2VydFNhbWUob2EsIGxyLmdldFBhcmFtZXRlcnMoKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldE1pbGxpcyIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldE1pbGxpcyIsIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0TWlsbGlzKCkgewogICAgICAgICBsb25nIG1pbGxpID0gbHIuZ2V0TWlsbGlzKCk7CiAgICAgICAgIGFzc2VydFRydWUobWlsbGkgPiAwKTsKQEAgLTIzNyw5ICszMDIsMzAgQEAKICAgICAgICAgbHIuc2V0TWlsbGlzKDApOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbHIuZ2V0TWlsbGlzKCkpOwogICAgIH0KKyAgICAKKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TWlsbGlzIiwgbWV0aG9kQXJncyA9IHt9KSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0TWlsbGlzIiwgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfSkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRUaW1lQ2hlY2soKSB7CisgICAgICAgIGxvbmcgYmVmb3JlID0gbHIuZ2V0TWlsbGlzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMik7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgTG9nUmVjb3JkIGxyMiA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuQ09ORklHLCAiTVNHMiIpOworICAgICAgICBsb25nIGFmdGVyID0gbHIyLmdldE1pbGxpcygpOworICAgICAgICBhc3NlcnRUcnVlKGFmdGVyLWJlZm9yZT4wKTsgICAgCisgICAgfQorICAgIAogCisKKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0VGhyZWFkSUQiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRUaHJlYWRJRCIsIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRUaHJlYWRJRCgpIHsKLSAgICAgICAgLy8gVE9ETyBob3cgdG8gdGVzdCB0aGUgZGlmZmVyZW50IHRocmVhZAogICAgICAgICBpbnQgaWQgPSBsci5nZXRUaHJlYWRJRCgpOwogICAgICAgICBsciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuQUxMLCAiYTEiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkLCBsci5nZXRUaHJlYWRJRCgpKTsKQEAgLTI0OCw3ICszMzQsNDMgQEAKICAgICAgICAgbHIgPSBuZXcgTG9nUmVjb3JkKExldmVsLkFMTCwgImExIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhpZCwgbHIuZ2V0VGhyZWFkSUQoKSk7CiAgICAgfQorICAgIAorICAgIC8qCisgICAgICogQ2hlY2sgdGhyZWFkSUQgYXJlIGRpZmZlcmVudAorICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRUaHJlYWRJRCIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFRocmVhZElEIiwgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNldFRocmVhZElEX0RpZmZlcmVudFRocmVhZCgpIHsKKyAgICAgICAgaW50IGlkID0gbHIuZ2V0VGhyZWFkSUQoKTsKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBzdGFydCB0aGUgdGhyZWFkCisgICAgICAgIE1vY2tUaHJlYWQgdGhyZWFkID0gbmV3IE1vY2tUaHJlYWQoKTsKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJlYWQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9ICAKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBzdGFydCB0aGUgdGhyZWFkMgorICAgICAgICBNb2NrVGhyZWFkIHRocmVhZDIgPSBuZXcgTW9ja1RocmVhZCgpOworICAgICAgICB0aHJlYWQyLnN0YXJ0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJlYWQyLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQogCisgICAgICAgIC8vQWxsIHRocmVhZElEIG11c3QgYmUgZGlmZmVyZW50LCBiYXNlZCBvbiB0aGUgVGhyZWFkTG9jYWwuamF2YSBJRAorICAgICAgICBhc3NlcnRUcnVlKGxyLmdldFRocmVhZElEKCkgIT0gdGhyZWFkLmxyLmdldFRocmVhZElEKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxyLmdldFRocmVhZElEKCkgIT0gdGhyZWFkMi5sci5nZXRUaHJlYWRJRCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJlYWQubHIuZ2V0VGhyZWFkSUQoKSAhPSB0aHJlYWQyLmxyLmdldFRocmVhZElEKCkpOworICAgIH0KKworCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFRocm93biIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFRocm93biIsIG1ldGhvZEFyZ3MgPSB7VGhyb3dhYmxlLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRUaHJvd24oKSB7CiAgICAgICAgIGFzc2VydE51bGwobHIuZ2V0VGhyb3duKCkpOwogICAgICAgICBsci5zZXRUaHJvd24obnVsbCk7CkBAIC0yNTYsNiArMzc4LDkgQEAKICAgICAgICAgVGhyb3dhYmxlIGUgPSBuZXcgRXhjZXB0aW9uKCk7CiAgICAgICAgIGxyLnNldFRocm93bihlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGUsIGxyLmdldFRocm93bigpKTsKKyAgICAgICAgVGhyb3dhYmxlIG4gPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgbHIuc2V0VGhyb3duKG4pOworICAgICAgICBhc3NlcnRFcXVhbHMobiwgbHIuZ2V0VGhyb3duKCkpOwogICAgIH0KIAogICAgIC8vIGNvbXBhcmF0b3IgZm9yIExvZ1JlY29yZCBvYmplY3RzCkBAIC0zMDMsNiArNDI4LDggQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAic2VyaWFsaXNhdGlvbi9kZXNlcmlhbGl6YXRpb24iLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLCBtZXRob2RBcmdzID0ge30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTG9nUmVjb3JkIHIgPSBuZXcgTG9nUmVjb3JkKExldmVsLkFMTCwgIm1zZyIpOwogICAgICAgICByLnNldExvZ2dlck5hbWUoIkxvZ2dlck5hbWUiKTsKQEAgLTMxMSw5ICs0MzgsNyBAQAogICAgICAgICByLnNldFNlcXVlbmNlTnVtYmVyKDk4NzY1NDMyMSk7CiAgICAgICAgIHIuc2V0U291cmNlQ2xhc3NOYW1lKCJTb3VyY2VDbGFzc05hbWUiKTsKICAgICAgICAgci5zZXRTb3VyY2VNZXRob2ROYW1lKCJTb3VyY2VNZXRob2ROYW1lIik7Ci0gICAgICAgIHIKLSAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhuZXcgT2JqZWN0W10geyAidGVzdCBzdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigiZXgtbXNnIikgfSk7CisgICAgICAgIHIuc2V0UGFyYW1ldGVycyhuZXcgT2JqZWN0W10geyJ0ZXN0IHN0cmluZyIsIG5ldyBFeGNlcHRpb24oImV4LW1zZyIpfSk7CiAgICAgICAgIHIuc2V0VGhyZWFkSUQoMzIzMik7CiAgICAgICAgIHIuc2V0VGhyb3duKG5ldyBFeGNlcHRpb24oIkV4Y2VwdGlvbk1lc3NhZ2UiKSk7CiAKQEAgLTMyMyw2ICs0NDgsMTEgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgcmVzb2x1dGlvbiBvZiByZXNvdXJjZSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICBwdXJwb3NlID0gInRlc3RzIHJlc29sdXRpb24gb2YgcmVzb3VyY2UgYnVuZGxlIGR1cmluZyBkZXNlcmlhbGl6YXRpb24iLCAKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwgbWV0aG9kQXJncyA9IHt9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25SZXNvdXJjZUJ1bmRsZSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8vIHRlc3QgY2FzZTogdmFsaWQgcmVzb3VyY2UgYnVuZGxlIG5hbWUKQEAgLTM0Niw2ICs0NzYsOCBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwgbWV0aG9kQXJncyA9IHt9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZ1JlY29yZCByID0gbmV3IExvZ1JlY29yZChMZXZlbC5BTEwsICJtc2ciKTsKICAgICAgICAgci5zZXRMb2dnZXJOYW1lKCJMb2dnZXJOYW1lIik7CkBAIC0zNTQsOSArNDg2LDcgQEAKICAgICAgICAgci5zZXRTZXF1ZW5jZU51bWJlcig5ODc2NTQzMjEpOwogICAgICAgICByLnNldFNvdXJjZUNsYXNzTmFtZSgiU291cmNlQ2xhc3NOYW1lIik7CiAgICAgICAgIHIuc2V0U291cmNlTWV0aG9kTmFtZSgiU291cmNlTWV0aG9kTmFtZSIpOwotICAgICAgICByCi0gICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMobmV3IE9iamVjdFtdIHsgInRlc3Qgc3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oImV4LW1zZyIpIH0pOworICAgICAgICByLnNldFBhcmFtZXRlcnMobmV3IE9iamVjdFtdIHsidGVzdCBzdHJpbmciLCBuZXcgRXhjZXB0aW9uKCJleC1tc2ciKX0pOwogICAgICAgICByLnNldFRocmVhZElEKDMyMzIpOwogICAgICAgICByLnNldFRocm93bihuZXcgRXhjZXB0aW9uKCJFeGNlcHRpb25NZXNzYWdlIikpOwogCkBAIC00NDUsNCArNTc1LDIyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgcHVibGljIGNsYXNzIE1vY2tUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgICAgIHB1YmxpYyBMb2dSZWNvcmQgbHIgPSBudWxsOyAvL3dpbGwgYmUgdXBkYXRlIGJ5IHRoZSB0aHJlYWQKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNb2NrVGhyZWFkKCl7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZSgpeworICAgICAgICAgICAgbHIgPSBuZXcgTG9nUmVjb3JkKExldmVsLkNPTkZJRywgIm1zZyB0aHJlYWQiKTsKKyAgICAgICAgfQorCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlckV4dGVuc2lvbi5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI4ZDk0Li4wMDAwMDAwCi0tLSBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIAotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBFeGFtcGxlIG9mIGEgdHlwZSBpbmplY3RlZCBpbnRvIGxvZ2dpbmcgdG8gYWNjZXNzIHBhY2thZ2UgcHJpdmF0ZSBtZW1iZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyRXh0ZW5zaW9uIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgbG9hZFJlc291cmNlQnVuZGxlKFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpIHsKLS8vICAgICAgICByZXR1cm4gTG9nZ2VyLmxvYWRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUpOwotICAgICAgICByZXR1cm4gTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcihyZXNvdXJjZUJ1bmRsZU5hbWUpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyVGVzdC5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlclRlc3QuamF2YQppbmRleCBjYTlkYzFjLi4xOWM2ZWIzIDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyVGVzdC5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXJUZXN0LmphdmEKQEAgLTE3LDggKzE3LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmc7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmcudXRpbC5FbnZpcm9ubWVudEhlbHBlcjsKKworaW1wb3J0IHRlc3RzLnV0aWwuQ2FsbFZlcmlmaWNhdGlvblN0YWNrOworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKQEAgLTMyLDE2ICs0MSwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnaW5nUGVybWlzc2lvbjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nLnV0aWwuRW52aXJvbm1lbnRIZWxwZXI7Ci0KLWltcG9ydCB0ZXN0cy51dGlsLkNhbGxWZXJpZmljYXRpb25TdGFjazsKLQogLyoqCiAgKiBUZXN0IHN1aXRlIGZvciB0aGUgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLgotICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTG9nZ2VyLmNsYXNzKQogcHVibGljIGNsYXNzIExvZ2dlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURfUkVTT1VSQ0VfQlVORExFID0gImJ1bmRsZXMvamF2YS91dGlsL2xvZ2dpbmcvcmVzIjsKQEAgLTUxLDggKzU0LDggQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURfUkVTT1VSQ0VfQlVORExFMyA9ICJidW5kbGVzL2phdmEvdXRpbC9sb2dnaW5nL3JlczMiOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVkFMSURfUkVTT1VSQ0VfQlVORExFID0gImltcG9zc2libGVfbm90X2V4aXN0aW5nIjsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HR0lOR19DT05GSUdfRklMRT0gInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvamF2YS91dGlsL2xvZ2dpbmcvbG9nZ2luZy5jb25maWciOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR0dJTkdfQ09ORklHX0ZJTEUgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9qYXZhL3V0aWwvbG9nZ2luZy9sb2dnaW5nLmNvbmZpZyI7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURfS0VZID0gIkxPR0dFUlRFU1QiOwogCkBAIC02Myw5ICs2NiwxMCBAQAogICAgIHByaXZhdGUgTG9nZ2VyIHNoYXJlZExvZ2dlciA9IG51bGw7CiAKICAgICBwcml2YXRlIExvY2FsZSBvbGRMb2NhbGUgPSBudWxsOwotICAgIAorCiAgICAgLyoKLSAgICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkgTm90aWNlIDogTG9nZ2VyIGNvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCA9PgorICAgICAqIE1vY2tMb2dnZXIKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtODEsNiArODUsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLmNsZWFyKCk7CiAgICAgICAgIExvY2FsZS5zZXREZWZhdWx0KG9sZExvY2FsZSk7CisgICAgICAgIExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLnJlc2V0KCk7CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCkBAIC05Niw2ICsxMDEsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgZ2xvYmFsIGxvZ2dlcgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJMb2dnZXIiLCBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iYWxMb2dnZXIoKSB7CiAgICAgICAgIGFzc2VydE51bGwoTG9nZ2VyLmdsb2JhbC5nZXRGaWx0ZXIoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBMb2dnZXIuZ2xvYmFsLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKQEAgLTExMiw5ICsxMjAsMTYgQEAKIAogICAgIC8qCiAgICAgICogVGVzdCBjb25zdHJ1Y3RvciB1bmRlciBub3JtYWwgY29uZGl0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBUT0RPOiB1c2luZyBhIHNlcmllcyBvZiBjbGFzcyBsb2FkZXJzIHRvIGxvYWQgcmVzb3VyY2UgYnVuZGxlcwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxvZ2dlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfTm9ybWFsKCkgewogICAgICAgICBNb2NrTG9nZ2VyIG1sb2cgPSBuZXcgTW9ja0xvZ2dlcigibXluYW1lIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFKTsKICAgICAgICAgYXNzZXJ0TnVsbChtbG9nLmdldEZpbHRlcigpKTsKQEAgLTEzMSw2ICsxNDYsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgY29uc3RydWN0b3Igd2l0aCBudWxsIHBhcmFtZXRlcnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCBudWxsIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTG9nZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9OdWxsKCkgewogICAgICAgICBNb2NrTG9nZ2VyIG1sb2cgPSBuZXcgTW9ja0xvZ2dlcihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbChtbG9nLmdldEZpbHRlcigpKTsKQEAgLTE0Niw2ICsxNzAsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgY29uc3RydWN0b3Igd2l0aCBpbnZhbGlkIG5hbWUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCBpbnZhbGlkIG5hbWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTG9nZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9JbnZhbGlkTmFtZSgpIHsKICAgICAgICAgTW9ja0xvZ2dlciBtbG9nID0gbmV3IE1vY2tMb2dnZXIoIi4uLiMkJSVeJiYoKS1fKz0hQH4uLyxbXXt9OzonXFxcIj98IiwKICAgICAgICAgICAgICAgICBudWxsKTsKQEAgLTE1NSw2ICsxODgsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgY29uc3RydWN0b3Igd2l0aCBlbXB0eSBuYW1lLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggZW1wdHkgbmFtZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX0VtcHR5TmFtZSgpIHsKICAgICAgICAgTW9ja0xvZ2dlciBtbG9nID0gbmV3IE1vY2tMb2dnZXIoIiIsIG51bGwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG1sb2cuZ2V0TmFtZSgpKTsKQEAgLTE2Myw0OSArMjA1LDgxIEBACiAgICAgLyoKICAgICAgKiBUZXN0IGNvbnN0cnVjdG9yIHdpdGggaW52YWxpZCByZXNvdXJjZSBidW5kbGUgbmFtZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTG9nZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9JbnZhbGlkUmVzb3VyY2VCdW5kbGUoKSB7CisKKyAgICAgICAgLy8gdHJ5IGFub255bW91cyB3aXRoIGludmFsaWQgcmVzb3VyY2UKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBNb2NrTG9nZ2VyKG51bGwsIElOVkFMSURfUkVTT1VSQ0VfQlVORExFKTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24hIik7CiAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBvayAhCisgICAgICAgIH0KKyAgICAgICAgLy8gdHJ5IG5hbWVkIExvZ2dlciB3aXRoIGludmFsaWQgcmVzb3VyY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBNb2NrTG9nZ2VyKCJ0ZXN0Q29uc3RydWN0b3JfSW52YWxpZFJlc291cmNlQnVuZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9SRVNPVVJDRV9CVU5ETEUpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiEiKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG9rICEKICAgICAgICAgfQogICAgICAgICAvLyB0cnkgZW1wdHkgc3RyaW5nCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0xvZ2dlcihudWxsLCAiIik7CiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uISIpOwogICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb2sgIQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBUZXN0IGdldEFub255bW91c0xvZ2dlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFub255bW91c0xvZ2dlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbm9ueW1vdXNMb2dnZXIoKSB7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IE1vY2tTZWN1cml0eU1hbmFnZXIoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZ2dlciBhbG9nID0gTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpOwotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShhbG9nLCBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCkpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldEZpbHRlcigpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhbG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXRMZXZlbCgpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldFBhcmVudCgpLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFsb2cuZ2V0VXNlUGFyZW50SGFuZGxlcnMoKSk7Ci0gICAgICAgICAgICAvLyBmYWlsKCJTaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24hIik7Ci0gICAgICAgICAgICAvLyB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZE1hbik7Ci0gICAgICAgIH0KKyAgICAgICAgTG9nZ2VyIGFsb2cgPSBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoYWxvZywgTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldEZpbHRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFsb2cuZ2V0SGFuZGxlcnMoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnROdWxsKGFsb2cuZ2V0TGV2ZWwoKSk7CisgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFsb2cuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldFBhcmVudCgpLmdldFBhcmVudCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldFJlc291cmNlQnVuZGxlKCkpOworICAgICAgICBhc3NlcnROdWxsKGFsb2cuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFsb2cuZ2V0VXNlUGFyZW50SGFuZGxlcnMoKSk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBUZXN0IGdldEFub255bW91c0xvZ2dlcihTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lKSB3aXRoIHZhbGlkIHJlc291cmNlCiAgICAgICogYnVuZGxlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEFub255bW91c0xvZ2dlcihTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lKSAiICsKKyAgICAgICAgICAgICJ3aXRoIHZhbGlkIHJlc291cmNlIGJ1bmRsZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbm9ueW1vdXNMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFub255bW91c0xvZ2dlcl9WYWxpZFJlc291cmNlQnVuZGxlKCkgewogICAgICAgICBMb2dnZXIgYWxvZyA9IExvZ2dlci5nZXRBbm9ueW1vdXNMb2dnZXIoVkFMSURfUkVTT1VSQ0VfQlVORExFKTsKICAgICAgICAgYXNzZXJ0Tm90U2FtZShhbG9nLCBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKFZBTElEX1JFU09VUkNFX0JVTkRMRSkpOwpAQCAtMjEzLDYgKzI4Nyw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCBhbG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldExldmVsKCkpOwogICAgICAgICBhc3NlcnROdWxsKGFsb2cuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhbG9nLmdldFBhcmVudCgpLmdldE5hbWUoKSk7CiAgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhWQUxJRF9WQUxVRSwgYWxvZy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhWQUxJRF9LRVkpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsb2cuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCksIFZBTElEX1JFU09VUkNFX0JVTkRMRSk7CkBAIC0yMjMsNiArMjk4LDE2IEBACiAgICAgICogVGVzdCBnZXRBbm9ueW1vdXNMb2dnZXIoU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkgd2l0aCBudWxsIHJlc291cmNlCiAgICAgICogYnVuZGxlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEFub255bW91c0xvZ2dlcihTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lKSAiICsKKyAgICAgICAgICAgICJ3aXRoIG51bGwgcmVzb3VyY2UgYnVuZGxlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFub255bW91c0xvZ2dlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5vbnltb3VzTG9nZ2VyX051bGxSZXNvdXJjZUJ1bmRsZSgpIHsKICAgICAgICAgTG9nZ2VyIGFsb2cgPSBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKG51bGwpOwogICAgICAgICBhc3NlcnROb3RTYW1lKGFsb2csIExvZ2dlci5nZXRBbm9ueW1vdXNMb2dnZXIobnVsbCkpOwpAQCAtMjMwLDYgKzMxNSw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCBhbG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldExldmVsKCkpOwogICAgICAgICBhc3NlcnROdWxsKGFsb2cuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhbG9nLmdldFBhcmVudCgpLmdldE5hbWUoKSk7CiAgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSk7CiAgICAgICAgIGFzc2VydE51bGwoYWxvZy5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKICAgICAgICAgYXNzZXJ0TnVsbChhbG9nLmdldFJlc291cmNlQnVuZGxlTmFtZSgpKTsKQEAgLTI0MCw2ICszMjYsMTYgQEAKICAgICAgKiBUZXN0IGdldEFub255bW91c0xvZ2dlcihTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lKSB3aXRoIGludmFsaWQgcmVzb3VyY2UKICAgICAgKiBidW5kbGUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0QW5vbnltb3VzTG9nZ2VyKFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpICIgKworICAgICAgICAgICAgIndpdGggaW52YWxpZCByZXNvdXJjZSBidW5kbGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QW5vbnltb3VzTG9nZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbm9ueW1vdXNMb2dnZXJfSW52YWxpZFJlc291cmNlQnVuZGxlKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcihJTlZBTElEX1JFU09VUkNFX0JVTkRMRSk7CkBAIC0yNTcsNiArMzUzLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcpLCBnZXR0aW5nIGEgbG9nZ2VyIHdpdGggbm8gcGFyZW50LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExvZ2dlcihTdHJpbmcpLCBnZXR0aW5nIGEgbG9nZ2VyIHdpdGggbm8gcGFyZW50LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjb25maWcgdGhlIGxldmVsCiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0yODMsMTEgKzM4OCwyMyBAQAogICAgICAgICBhc3NlcnROdWxsKGxvZy5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKICAgICAgICAgYXNzZXJ0TnVsbChsb2cuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOwogICAgICAgICBhc3NlcnRUcnVlKGxvZy5nZXRVc2VQYXJlbnRIYW5kbGVycygpKTsKKworCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcpLCBnZXR0aW5nIGEgbG9nZ2VyIHdpdGggaW52YWxpZCBsZXZlbCBjb25maWd1cmVkLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExvZ2dlcihTdHJpbmcpLCBnZXR0aW5nIGEgbG9nZ2VyIHdpdGggIiArCisgICAgICAgICAgICAiaW52YWxpZCBsZXZlbCBjb25maWd1cmVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyX0ludmFsaWRMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjb25maWcgdGhlIGxldmVsCiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0zMTMsMjAgKzQzMCw0MiBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRMb2dnZXIoU3RyaW5nKSB3aXRoIG51bGwgbmFtZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRMb2dnZXIoU3RyaW5nKSB3aXRoIG51bGwgbmFtZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcl9OdWxsKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihudWxsKTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiEiKTsKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb2sgIQogICAgICAgICB9Ci0gICAgICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCIiLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChsb2dnZXIuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKGxvZ2dlci5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiEiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb2sgIQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcpIHdpdGggaW52YWxpZCBuYW1lLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExvZ2dlcihTdHJpbmcpIHdpdGggaW52YWxpZCBuYW1lLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyX0ludmFsaWQoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCIuLi4jJCUlXiYmKCktXys9IUB+Li8sW117fTs6J1xcXCI/fCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIi4uLiMkJSVeJiYoKS1fKz0hQH4uLyxbXXt9OzonXFxcIj98IiwgbG9nLmdldE5hbWUoKSk7CkBAIC0zMzUsNyArNDc0LDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcpIHdpdGggZW1wdHkgbmFtZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyX0VtcHR5KCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExvZ2dlcihTdHJpbmcpIHdpdGggZW1wdHkgbmFtZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRMb2dnZXJfRW1wdHkoKSB7CiAgICAgICAgIGFzc2VydE5vdE51bGwoTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0TG9nZ2VyKCIiKSk7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCIiKTsKICAgICAgICAgYXNzZXJ0U2FtZShsb2csIExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlcigiIikpOwpAQCAtMzUzLDkgKzUwMSwyMiBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRMb2dnZXIoU3RyaW5nKSwgZ2V0dGluZyBhIGxvZ2dlciB3aXRoIGV4aXN0aW5nIHBhcmVudC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyX1dpdGhQYXJlbnROb3JtYWwoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0TG9nZ2VyKFN0cmluZyksIGdldHRpbmcgYSBsb2dnZXIgIiArCisgICAgICAgICAgICAid2l0aCBleGlzdGluZyBwYXJlbnQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9nZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudCgpIHsKICAgICAgICAgYXNzZXJ0TnVsbChMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRMb2dnZXIoCiAgICAgICAgICAgICAgICAgInRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudF9QYXJlbnRMb2dnZXIiKSk7CisKKyAgICAgICAgLy8gZ2V0IHJvb3Qgb2YgaGllcmFyY2h5CisgICAgICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldExvZ2dlcigiIik7CiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcGFyZW50IGxvZ2dlcgogICAgICAgICBMb2dnZXIgcExvZyA9IExvZ2dlci5nZXRMb2dnZXIoInRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudF9QYXJlbnRMb2dnZXIiLAogICAgICAgICAgICAgICAgIFZBTElEX1JFU09VUkNFX0JVTkRMRSk7CkBAIC0zNjMsMzggKzUyNCw4OSBAQAogICAgICAgICBwTG9nLmFkZEhhbmRsZXIobmV3IE1vY2tIYW5kbGVyKCkpOwogICAgICAgICBwTG9nLnNldEZpbHRlcihuZXcgTW9ja0ZpbHRlcigpKTsKICAgICAgICAgcExvZy5zZXRVc2VQYXJlbnRIYW5kbGVycyhmYWxzZSk7CisgICAgICAgIC8vIGNoZWNrIHJvb3QgcGFyZW50CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdEdldExvZ2dlcl9XaXRoUGFyZW50X1BhcmVudExvZ2dlciIsIHBMb2cuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShwTG9nLmdldFBhcmVudCgpLCByb290KTsKIAorICAgICAgICAvLyBjaGlsZCBwYXJ0CiAgICAgICAgIGFzc2VydE51bGwoTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0TG9nZ2VyKAogICAgICAgICAgICAgICAgICJ0ZXN0R2V0TG9nZ2VyX1dpdGhQYXJlbnRfUGFyZW50TG9nZ2VyLmNoaWxkIikpOwogICAgICAgICAvLyBjcmVhdGUgdGhlIGNoaWxkIGxvZ2dlcgotICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyCisgICAgICAgIExvZ2dlciBjaGlsZCA9IExvZ2dlcgogICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoInRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudF9QYXJlbnRMb2dnZXIuY2hpbGQiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChsb2cuZ2V0RmlsdGVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChsb2cuZ2V0TGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdEdldExvZ2dlcl9XaXRoUGFyZW50X1BhcmVudExvZ2dlci5jaGlsZCIsIGxvZworICAgICAgICBhc3NlcnROdWxsKGNoaWxkLmdldEZpbHRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNoaWxkLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjaGlsZC5nZXRMZXZlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0R2V0TG9nZ2VyX1dpdGhQYXJlbnRfUGFyZW50TG9nZ2VyLmNoaWxkIiwgY2hpbGQKICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0U2FtZShsb2cuZ2V0UGFyZW50KCksIHBMb2cpOwotICAgICAgICBhc3NlcnROdWxsKGxvZy5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChsb2cuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGxvZy5nZXRVc2VQYXJlbnRIYW5kbGVycygpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShjaGlsZC5nZXRQYXJlbnQoKSwgcExvZyk7CisgICAgICAgIGFzc2VydE51bGwoY2hpbGQuZ2V0UmVzb3VyY2VCdW5kbGUoKSk7CisgICAgICAgIGFzc2VydE51bGwoY2hpbGQuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNoaWxkLmdldFVzZVBhcmVudEhhbmRsZXJzKCkpOworCisgICAgICAgIC8vIGNyZWF0ZSBub3QgdmFsaWQgY2hpbGQKKyAgICAgICAgTG9nZ2VyIG5vdENoaWxkID0gTG9nZ2VyCisgICAgICAgICAgICAgICAgLmdldExvZ2dlcigidGVzdEdldExvZ2dlcl9XaXRoUGFyZW50X1BhcmVudExvZ2dlcjEuY2hpbGQiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChub3RDaGlsZC5nZXRGaWx0ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBub3RDaGlsZC5nZXRIYW5kbGVycygpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydE51bGwobm90Q2hpbGQuZ2V0TGV2ZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdEdldExvZ2dlcl9XaXRoUGFyZW50X1BhcmVudExvZ2dlcjEuY2hpbGQiLCBub3RDaGlsZAorICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnROb3RTYW1lKG5vdENoaWxkLmdldFBhcmVudCgpLCBwTG9nKTsKKyAgICAgICAgYXNzZXJ0TnVsbChub3RDaGlsZC5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChub3RDaGlsZC5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUobm90Q2hpbGQuZ2V0VXNlUGFyZW50SGFuZGxlcnMoKSk7CisgICAgICAgIC8vIHZlcmlmeSB0d28gbGV2ZWwgcm9vdC5wYXJlbnQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0R2V0TG9nZ2VyX1dpdGhQYXJlbnRfUGFyZW50TG9nZ2VyLmNoaWxkIiwgY2hpbGQKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShjaGlsZC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSwgcm9vdCk7CisKKworICAgICAgICAvLyBjcmVhdGUgdGhyZWUgbGV2ZWwgY2hpbGQKKyAgICAgICAgTG9nZ2VyIGNoaWxkT2ZDaGlsZCA9IExvZ2dlcgorICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoInRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudF9QYXJlbnRMb2dnZXIuY2hpbGQuY2hpbGQiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjaGlsZE9mQ2hpbGQuZ2V0RmlsdGVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY2hpbGRPZkNoaWxkLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0U2FtZShjaGlsZC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSwgcm9vdCk7CisgICAgICAgIGFzc2VydE51bGwoY2hpbGRPZkNoaWxkLmdldExldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudF9QYXJlbnRMb2dnZXIuY2hpbGQuY2hpbGQiLAorICAgICAgICAgICAgICAgIGNoaWxkT2ZDaGlsZC5nZXROYW1lKCkpOworCisgICAgICAgIGFzc2VydFNhbWUoY2hpbGRPZkNoaWxkLmdldFBhcmVudCgpLCBjaGlsZCk7CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGRPZkNoaWxkLmdldFBhcmVudCgpLmdldFBhcmVudCgpLCBwTG9nKTsKKyAgICAgICAgYXNzZXJ0U2FtZShjaGlsZE9mQ2hpbGQuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCksIHJvb3QpOworICAgICAgICBhc3NlcnROdWxsKGNoaWxkT2ZDaGlsZC5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjaGlsZE9mQ2hpbGQuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNoaWxkT2ZDaGlsZC5nZXRVc2VQYXJlbnRIYW5kbGVycygpKTsKKworICAgICAgICAvLyBhYm5vcm1hbCBjYXNlIDogbG9va3VwIHRvIHJvb3QgcGFyZW50IGluIGEgaGllcmFyY2h5IHdpdGhvdXQgYSBsb2dnZXIKKyAgICAgICAgLy8gcGFyZW50IGNyZWF0ZWQgYmV0d2VlbgorICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudF9QYXJlbnRMb2dnZXIxLmNoaWxkIiwgbm90Q2hpbGQKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShjaGlsZC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSwgcm9vdCk7IAorICAgICAgICBhc3NlcnROb3RTYW1lKGNoaWxkLmdldFBhcmVudCgpLCByb290KTsgCisKKyAgICAgICAgLy8gYWJub3JtYWwgY2FzZXMKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShyb290LmdldFBhcmVudCgpLCByb290KTsKKyAgICAgICAgTG9nZ2VyIHR3b0RvdCA9IExvZ2dlci5nZXRMb2dnZXIoIi4uIik7CisgICAgICAgIGFzc2VydFNhbWUodHdvRG90LmdldFBhcmVudCgpLCByb290KTsKKwogICAgIH0KIAotICAgIC8vIC8qCi0gICAgLy8gKiBUZXN0IGdldExvZ2dlcihTdHJpbmcpLCBnZXR0aW5nIGEgbG9nZ2VyIHdpdGggZXhpc3RpbmcgcGFyZW50LCB1c2luZwotICAgIC8vICogYWJub3JtYWwgbmFtZXMgKGNvbnRhaW5pbmcgJy4nKS4KLSAgICAvLyAqLwotICAgIC8vIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dnZXJfV2l0aFBhcmVudEFibm9ybWFsKCkgewotICAgIC8vIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCIuIik7Ci0gICAgLy8gYXNzZXJ0U2FtZShsb2cuZ2V0UGFyZW50KCksIExvZ2dlci5nZXRMb2dnZXIoIiIpKTsKLSAgICAvLyBMb2dnZXIgbG9nMiA9IExvZ2dlci5nZXRMb2dnZXIoIi4uIik7Ci0gICAgLy8gYXNzZXJ0U2FtZShsb2cyLmdldFBhcmVudCgpLCBMb2dnZXIuZ2V0TG9nZ2VyKCIiKSk7Ci0gICAgLy8gLy9UT0RPOiBhIGxvdCBtb3JlIGNhbiBiZSB0ZXN0ZWQKLSAgICAvLyB9CiAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0TG9nZ2VyKFN0cmluZywgU3RyaW5nKSwgZ2V0dGluZyBhIGxvZ2dlciB3aXRoIG5vIHBhcmVudC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRMb2dnZXIoU3RyaW5nLCBTdHJpbmcpLCBnZXR0aW5nIGEgbG9nZ2VyICIgKworICAgICAgICAgICAgIndpdGggbm8gcGFyZW50LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyV2l0aFJlc19Ob3JtYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY29uZmlnIHRoZSBsZXZlbAogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtNDI4LDYgKzY0MCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRMb2dnZXIoU3RyaW5nLCBTdHJpbmcpIHdpdGggbnVsbCBwYXJhbWV0ZXJzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExvZ2dlcihTdHJpbmcsIFN0cmluZykgd2l0aCBudWxsIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9nZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dnZXJXaXRoUmVzX051bGwoKSB7CiAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoInRlc3RHZXRMb2dnZXJXaXRoUmVzX051bGxfQU5ld0xvZ2dlciIsIG51bGwpOwogICAgICAgICB0cnkgewpAQCAtNDM3LDI5ICs2NTgsNzEgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcsIFN0cmluZykgd2l0aCBpbnZhbGlkIHJlc291cmNlIGJ1bmRsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nZ2VyV2l0aFJlc19JbnZhbGlkUmVzKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExvZ2dlcihTdHJpbmcsIFN0cmluZykgd2l0aCBpbnZhbGlkICIgKworICAgICAgICAgICAgInJlc291cmNlIGJ1bmRsZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRMb2dnZXJXaXRoUmVzX0ludmFsaWRSZXNvdXJjZUJ1bmRsZSgpIHsKKworICAgICAgICBhc3NlcnROdWxsKExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlcigKKyAgICAgICAgICAgICAgICAidGVzdE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiIpKTsKKwogICAgICAgICB0cnkgewotICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigiIiwgSU5WQUxJRF9SRVNPVVJDRV9CVU5ETEUpOworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigidGVzdE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIElOVkFMSURfUkVTT1VSQ0VfQlVORExFKTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24hIik7CiAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0TnVsbChMb2dnZXIuZ2V0TG9nZ2VyKCIiKS5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChMb2dnZXIuZ2V0TG9nZ2VyKCIiKS5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSk7CisgICAgICAgIGFzc2VydE51bGwoTG9nZ2VyLmdldExvZ2dlcigidGVzdE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQnVuZGxlKCkpOworICAgICAgICBhc3NlcnROdWxsKExvZ2dlci5nZXRMb2dnZXIoInRlc3RNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24iKQorICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSk7CiAgICAgICAgIC8vIHRyeSBlbXB0eSBzdHJpbmcKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoIiIsICIiKTsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoInRlc3RNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24iLCAiIik7CiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uISIpOwogICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0TnVsbChMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRMb2dnZXIoIiIpKTsKKyAgICAgICAgLy8gVGhlIHJvb3QgbG9nZ2VyIGFsd2F5cyBleGlzdHMgVE9ETworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoIiIsIElOVkFMSURfUkVTT1VSQ0VfQlVORExFKTsgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsgCisgICAgICAgICAgICAvL2NvcnJlY3QgCisgICAgICAgIH0KKworCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcsIFN0cmluZykgd2l0aCB2YWxpZCByZXNvdXJjZSBidW5kbGUsIHRvIGdldCBhbgogICAgICAqIGV4aXN0aW5nIGxvZ2dlciB3aXRoIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2UgYnVuZGxlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExvZ2dlcihTdHJpbmcsIFN0cmluZykgd2l0aCB2YWxpZCByZXNvdXJjZSAiICsKKyAgICAgICAgICAgICJidW5kbGUsIHRvIGdldCBhbiBleGlzdGluZyBsb2dnZXIgd2l0aCBubyBhc3NvY2lhdGVkICIgKworICAgICAgICAgICAgInJlc291cmNlIGJ1bmRsZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcldpdGhSZXNfRXhpc3RpbmdMb2dnZXJXaXRoTm9SZXMoKSB7CiAgICAgICAgIGFzc2VydE51bGwoTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0TG9nZ2VyKAogICAgICAgICAgICAgICAgICJ0ZXN0R2V0TG9nZ2VyV2l0aFJlc19FeGlzdGluZ0xvZ2dlcldpdGhOb1Jlc19BTmV3TG9nZ2VyIikpOwpAQCAtNDczLDEyICs3MzYsMjQgQEAKICAgICAgICAgYXNzZXJ0U2FtZShsb2cxLCBsb2cyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFZBTElEX1ZBTFVFLCBsb2cxLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKFZBTElEX0tFWSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9nMS5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSwgVkFMSURfUkVTT1VSQ0VfQlVORExFKTsKKwogICAgIH0KIAogICAgIC8qCiAgICAgICogVGVzdCBnZXRMb2dnZXIoU3RyaW5nLCBTdHJpbmcpIHdpdGggdmFsaWQgcmVzb3VyY2UgYnVuZGxlLCB0byBnZXQgYW4KICAgICAgKiBleGlzdGluZyBsb2dnZXIgd2l0aCB0aGUgc2FtZSBhc3NvY2lhdGVkIHJlc291cmNlIGJ1bmRsZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRMb2dnZXIoU3RyaW5nLCBTdHJpbmcpIHdpdGggdmFsaWQgcmVzb3VyY2UgIiArCisgICAgICAgICAgICAiYnVuZGxlLCB0byBnZXQgYW4gZXhpc3RpbmcgbG9nZ2VyIHdpdGggdGhlIHNhbWUgYXNzb2NpYXRlZCAiICsKKyAgICAgICAgICAgICJyZXNvdXJjZSBidW5kbGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9nZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dnZXJXaXRoUmVzX0V4aXN0aW5nTG9nZ2VyV2l0aFNhbWVSZXMoKSB7CiAgICAgICAgIGFzc2VydE51bGwoTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0TG9nZ2VyKAogICAgICAgICAgICAgICAgICJ0ZXN0R2V0TG9nZ2VyV2l0aFJlc19FeGlzdGluZ0xvZ2dlcldpdGhTYW1lUmVzX0FOZXdMb2dnZXIiKSk7CkBAIC00OTksNiArNzc0LDE3IEBACiAgICAgICogVGVzdCBnZXRMb2dnZXIoU3RyaW5nLCBTdHJpbmcpIHdpdGggdmFsaWQgcmVzb3VyY2UgYnVuZGxlLCB0byBnZXQgYW4KICAgICAgKiBleGlzdGluZyBsb2dnZXIgd2l0aCBkaWZmZXJlbnQgYXNzb2NpYXRlZCByZXNvdXJjZSBidW5kbGUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0TG9nZ2VyKFN0cmluZywgU3RyaW5nKSB3aXRoIHZhbGlkIHJlc291cmNlICIgKworICAgICAgICAgICAgImJ1bmRsZSwgdG8gZ2V0IGFuIGV4aXN0aW5nIGxvZ2dlciB3aXRoIGRpZmZlcmVudCBhc3NvY2lhdGVkICIgKworICAgICAgICAgICAgInJlc291cmNlIGJ1bmRsZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcldpdGhSZXNfRXhpc3RpbmdMb2dnZXJXaXRoRGlmZlJlcygpIHsKICAgICAgICAgYXNzZXJ0TnVsbChMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRMb2dnZXIoCiAgICAgICAgICAgICAgICAgInRlc3RHZXRMb2dnZXJXaXRoUmVzX0V4aXN0aW5nTG9nZ2VyV2l0aERpZmZSZXNfQU5ld0xvZ2dlciIpKTsKQEAgLTUwOSwxNCArNzk1LDE5IEBACiAgICAgICAgIGFzc2VydE5vdE51bGwobG9nMSk7CiAgICAgICAgIC8vIGdldCBhbiBleGlzdGluZyBsb2dnZXIKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoInRlc3RHZXRMb2dnZXJXaXRoUmVzX0V4aXN0aW5nTG9nZ2VyV2l0aERpZmZSZXNfQU5ld0xvZ2dlciIsCi0gICAgICAgICAgICAgICAgICAgIFZBTElEX1JFU09VUkNFX0JVTkRMRTIpOworICAgICAgICAgICAgTG9nZ2VyCisgICAgICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RHZXRMb2dnZXJXaXRoUmVzX0V4aXN0aW5nTG9nZ2VyV2l0aERpZmZSZXNfQU5ld0xvZ2dlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uISIpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoInRlc3RHZXRMb2dnZXJXaXRoUmVzX0V4aXN0aW5nTG9nZ2VyV2l0aERpZmZSZXNfQU5ld0xvZ2dlciIsIG51bGwpOworICAgICAgICAgICAgTG9nZ2VyCisgICAgICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RHZXRMb2dnZXJXaXRoUmVzX0V4aXN0aW5nTG9nZ2VyV2l0aERpZmZSZXNfQU5ld0xvZ2dlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uISIpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICB9CkBAIC01MjUsNiArODE2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcsIFN0cmluZykgd2l0aCBpbnZhbGlkIG5hbWUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0TG9nZ2VyKFN0cmluZywgU3RyaW5nKSB3aXRoIGludmFsaWQgbmFtZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcldpdGhSZXNfSW52YWxpZE5hbWUoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKAogICAgICAgICAgICAgICAgICIuLi4jJCUlXiYmKCktXys9IUB+Li8sW117fTs6J1xcXCI/fFdpdGhSZXMiLApAQCAtNTM2LDYgKzgzNiwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRMb2dnZXIoU3RyaW5nLCBTdHJpbmcpIHdpdGggZW1wdHkgbmFtZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRMb2dnZXIoU3RyaW5nLCBTdHJpbmcpIHdpdGggZW1wdHkgbmFtZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcldpdGhSZXNfRW1wdHkoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUpOwogICAgICAgICBhc3NlcnRTYW1lKGxvZywgTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0TG9nZ2VyKCIiKSk7CkBAIC01NTMsNiArODYyLDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldExvZ2dlcihTdHJpbmcsIFN0cmluZyksIGdldHRpbmcgYSBsb2dnZXIgd2l0aCBleGlzdGluZyBwYXJlbnQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0TG9nZ2VyKFN0cmluZywgU3RyaW5nKSwgZ2V0dGluZyBhIGxvZ2dlciAiICsKKyAgICAgICAgICAgICJ3aXRoIGV4aXN0aW5nIHBhcmVudC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlcldpdGhSZXNfV2l0aFBhcmVudE5vcm1hbCgpIHsKICAgICAgICAgYXNzZXJ0TnVsbChMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRMb2dnZXIoCiAgICAgICAgICAgICAgICAgInRlc3RHZXRMb2dnZXJXaXRoUmVzX1dpdGhQYXJlbnRfUGFyZW50TG9nZ2VyIikpOwpAQCAtNTg0LDYgKzkwMywxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBhZGRIYW5kbGVyKEhhbmRsZXIpIGZvciBhIG5hbWVkIGxvZ2dlciB3aXRoIHN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEhhbmRsZXJfTmFtZWRMb2dnZXJTdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyCiAgICAgICAgICAgICAgICAgLmdldExvZ2dlcigidGVzdEFkZEhhbmRsZXJfTmFtZWRMb2dnZXJTdWZmaWNpZW50UHJpdmlsZWdlIik7CkBAIC01OTEsMjggKzkxOSw0OCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoLCAwKTsKICAgICAgICAgbG9nLmFkZEhhbmRsZXIoaCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhsb2cuZ2V0SGFuZGxlcnMoKS5sZW5ndGgsIDEpOwotICAgICAgICBhc3NlcnRTYW1lKGxvZy5nZXRIYW5kbGVycygpWzBdLCBoKTsKKwogICAgIH0KIAogICAgIC8qCiAgICAgICogVGVzdCBhZGRIYW5kbGVyKEhhbmRsZXIpIGZvciBhIG5hbWVkIGxvZ2dlciB3aXRoIHN1ZmZpY2llbnQgcHJpdmlsZWdlLAogICAgICAqIGFkZCBkdXBsaWNhdGUgaGFuZGxlcnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSGFuZGxlcl9OYW1lZExvZ2dlclN1ZmZpY2llbnRQcml2aWxlZ2VEdXBsaWNhdGUoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIKICAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKCJ0ZXN0QWRkSGFuZGxlcl9OYW1lZExvZ2dlclN1ZmZpY2llbnRQcml2aWxlZ2VEdXBsaWNhdGUiKTsKICAgICAgICAgTW9ja0hhbmRsZXIgaCA9IG5ldyBNb2NrSGFuZGxlcigpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoLCAwKTsKLSAgICAgICAgbG9nLmFkZEhhbmRsZXIoaCk7Ci0gICAgICAgIGxvZy5hZGRIYW5kbGVyKGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoLCAyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgICAgICBsb2cuYWRkSGFuZGxlcihoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMobG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoLCAxMik7CiAgICAgICAgIGFzc2VydFNhbWUobG9nLmdldEhhbmRsZXJzKClbMF0sIGgpOwotICAgICAgICBhc3NlcnRTYW1lKGxvZy5nZXRIYW5kbGVycygpWzFdLCBoKTsKKyAgICAgICAgYXNzZXJ0U2FtZShsb2cuZ2V0SGFuZGxlcnMoKVs1XSwgaCk7CisgICAgICAgIGFzc2VydFNhbWUobG9nLmdldEhhbmRsZXJzKClbMTFdLCBoKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFRlc3QgYWRkSGFuZGxlcihIYW5kbGVyKSB3aXRoIGEgbnVsbCBoYW5kbGVyLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSGFuZGxlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSGFuZGxlcl9OdWxsKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcigidGVzdEFkZEhhbmRsZXJfTnVsbCIpOwogICAgICAgICB0cnkgewpAQCAtNjI2LDYgKzk3NCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBhZGRIYW5kbGVyKEhhbmRsZXIpIGZvciBhIG5hbWVkIGxvZ2dlciB3aXRoIGluc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSGFuZGxlcl9OYW1lZExvZ2dlckluc3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlcgogICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoInRlc3RBZGRIYW5kbGVyX05hbWVkTG9nZ2VySW5zdWZmaWNpZW50UHJpdmlsZWdlIik7CkBAIC02NDYsNiArMTAwMywxNSBAQAogICAgICAqIFRlc3QgYWRkSGFuZGxlcihIYW5kbGVyKSBmb3IgYSBuYW1lZCBsb2dnZXIgd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLAogICAgICAqIHVzaW5nIGEgbnVsbCBoYW5kbGVyLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEhhbmRsZXJfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2VOdWxsKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyCiAgICAgICAgICAgICAgICAgLmdldExvZ2dlcigidGVzdEFkZEhhbmRsZXJfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UiKTsKQEAgLTY2NSw2ICsxMDMxLDE1IEBACiAgICAgICogVGVzdCBhZGRIYW5kbGVyKEhhbmRsZXIpIGZvciBhbiBhbm9ueW1vdXMgbG9nZ2VyIHdpdGggc3VmZmljaWVudAogICAgICAqIHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRIYW5kbGVyX0Fub255TG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRBbm9ueW1vdXNMb2dnZXIoKTsKICAgICAgICAgTW9ja0hhbmRsZXIgaCA9IG5ldyBNb2NrSGFuZGxlcigpOwpAQCAtNjc4LDYgKzEwNTMsMTUgQEAKICAgICAgKiBUZXN0IGFkZEhhbmRsZXIoSGFuZGxlcikgZm9yIGFuIGFub255bW91cyBsb2dnZXIgd2l0aCBpbnN1ZmZpY2llbnQKICAgICAgKiBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSGFuZGxlcl9Bbm9ueUxvZ2dlckluc3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRBbm9ueW1vdXNMb2dnZXIoKTsKICAgICAgICAgTW9ja0hhbmRsZXIgaCA9IG5ldyBNb2NrSGFuZGxlcigpOwpAQCAtNjk3LDYgKzEwODEsMTYgQEAKICAgICAgKiBUZXN0IGFkZEhhbmRsZXIoSGFuZGxlcikgZm9yIGEgbnVsbC1uYW1lZCBtb2NrIGxvZ2dlciB3aXRoIGluc3VmZmljaWVudAogICAgICAqIHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhZGRIYW5kbGVyKEhhbmRsZXIpIGZvciBhIG51bGwtbmFtZWQgbW9jayBsb2dnZXIgIiArCisgICAgICAgICAgICAid2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLCBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRIYW5kbGVyX051bGxOYW1lZE1vY2tMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIE1vY2tMb2dnZXIgbWxvZyA9IG5ldyBNb2NrTG9nZ2VyKG51bGwsIG51bGwpOwogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CkBAIC03MTUsNiArMTEwOSw5IEBACiAgICAgICogVGVzdCByZW1vdmVIYW5kbGVyKEhhbmRsZXIpIGZvciBhIG5hbWVkIGxvZ2dlciB3aXRoIHN1ZmZpY2llbnQgcHJpdmlsZWdlLAogICAgICAqIHJlbW92ZSBhbiBleGlzdGluZyBoYW5kbGVyLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJhZGRIYW5kbGVyIiwgbWV0aG9kQXJncyA9IHtIYW5kbGVyLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIYW5kbGVyX05hbWVkTG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlcgogICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoInRlc3RSZW1vdmVIYW5kbGVyX05hbWVkTG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZSIpOwpAQCAtNzI5LDYgKzExMjYsOSBAQAogICAgICAqIFRlc3QgcmVtb3ZlSGFuZGxlcihIYW5kbGVyKSBmb3IgYSBuYW1lZCBsb2dnZXIgd2l0aCBzdWZmaWNpZW50IHByaXZpbGVnZSwKICAgICAgKiByZW1vdmUgYSBub24tZXhpc3RpbmcgaGFuZGxlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVtb3ZlSGFuZGxlciIsIG1ldGhvZEFyZ3MgPSB7SGFuZGxlci5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGFuZGxlcl9OYW1lZExvZ2dlclN1ZmZpY2llbnRQcml2aWxlZ2VOb3RFeGlzdGluZygpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlcgogICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoInRlc3RSZW1vdmVIYW5kbGVyX05hbWVkTG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZU5vdEV4aXN0aW5nIik7CkBAIC03NDEsNiArMTE0MSw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHJlbW92ZUhhbmRsZXIoSGFuZGxlcikgd2l0aCBhIG51bGwgaGFuZGxlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVtb3ZlSGFuZGxlciIsIG1ldGhvZEFyZ3MgPSB7SGFuZGxlci5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGFuZGxlcl9OdWxsKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcigidGVzdFJlbW92ZUhhbmRsZXJfTnVsbCIpOwogICAgICAgICBsb2cucmVtb3ZlSGFuZGxlcihudWxsKTsKQEAgLTc1MSw2ICsxMTU0LDkgQEAKICAgICAgKiBUZXN0IHJlbW92ZUhhbmRsZXIoSGFuZGxlcikgZm9yIGEgbmFtZWQgbG9nZ2VyIHdpdGggaW5zdWZmaWNpZW50CiAgICAgICogcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZW1vdmVIYW5kbGVyIiwgbWV0aG9kQXJncyA9IHtIYW5kbGVyLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIYW5kbGVyX05hbWVkTG9nZ2VySW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyCiAgICAgICAgICAgICAgICAgLmdldExvZ2dlcigidGVzdFJlbW92ZUhhbmRsZXJfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UiKTsKQEAgLTc3MSw2ICsxMTc3LDkgQEAKICAgICAgKiBUZXN0IHJlbW92ZUhhbmRsZXIoSGFuZGxlcikgZm9yIGEgbmFtZWQgbG9nZ2VyIHdpdGggaW5zdWZmaWNpZW50CiAgICAgICogcHJpdmlsZWdlLCB1c2luZyBhIG51bGwgaGFuZGxlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVtb3ZlSGFuZGxlciIsIG1ldGhvZEFyZ3MgPSB7SGFuZGxlci5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGFuZGxlcl9OYW1lZExvZ2dlckluc3VmZmljaWVudFByaXZpbGVnZU51bGwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIKICAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKCJ0ZXN0UmVtb3ZlSGFuZGxlcl9OYW1lZExvZ2dlckluc3VmZmljaWVudFByaXZpbGVnZSIpOwpAQCAtNzkwLDYgKzExOTksOSBAQAogICAgICAqIFRlc3QgcmVtb3ZlSGFuZGxlcihIYW5kbGVyKSBmb3IgYW4gYW5vbnltb3VzIGxvZ2dlciB3aXRoIHN1ZmZpY2llbnQKICAgICAgKiBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlbW92ZUhhbmRsZXIiLCBtZXRob2RBcmdzID0ge0hhbmRsZXIuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUhhbmRsZXJfQW5vbnlMb2dnZXJTdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpOwogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CkBAIC04MDMsNiArMTIxNSw5IEBACiAgICAgICogVGVzdCByZW1vdmVIYW5kbGVyKEhhbmRsZXIpIGZvciBhbiBhbm9ueW1vdXMgbG9nZ2VyIHdpdGggaW5zdWZmaWNpZW50CiAgICAgICogcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZW1vdmVIYW5kbGVyIiwgbWV0aG9kQXJncyA9IHtIYW5kbGVyLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIYW5kbGVyX0Fub255TG9nZ2VySW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpOwogICAgICAgICBNb2NrSGFuZGxlciBoID0gbmV3IE1vY2tIYW5kbGVyKCk7CkBAIC04MjIsNiArMTIzNyw5IEBACiAgICAgICogVGVzdCByZW1vdmVIYW5kbGVyKEhhbmRsZXIpIGZvciBhIG51bGwtbmFtZWQgbW9jayBsb2dnZXIgd2l0aAogICAgICAqIGluc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlbW92ZUhhbmRsZXIiLCBtZXRob2RBcmdzID0ge0hhbmRsZXIuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUhhbmRsZXJfTnVsbE5hbWVkTW9ja0xvZ2dlckluc3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTW9ja0xvZ2dlciBtbG9nID0gbmV3IE1vY2tMb2dnZXIobnVsbCwgbnVsbCk7CiAgICAgICAgIE1vY2tIYW5kbGVyIGggPSBuZXcgTW9ja0hhbmRsZXIoKTsKQEAgLTgzOSw2ICsxMjU3LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldEhhbmRsZXJzKCkgd2hlbiB0aGVyZSdzIG5vIGhhbmRsZXIuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0SGFuZGxlcnMoKSB3aGVuIHRoZXJlJ3Mgbm8gaGFuZGxlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRIYW5kbGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRIYW5kbGVyc19Ob25lKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcigidGVzdEdldEhhbmRsZXJzX05vbmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGxvZy5nZXRIYW5kbGVycygpLmxlbmd0aCwgMCk7CkBAIC04NDcsNiArMTI3NCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBnZXRIYW5kbGVycygpIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgaGFuZGxlcnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0SGFuZGxlcnMoKSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIGhhbmRsZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEhhbmRsZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEhhbmRsZXJzX1NldmVyYWwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ0ZXN0R2V0SGFuZGxlcnNfTm9uZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoLCAwKTsKQEAgLTg2NSwxMiArMTMwMSwyNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobG9nLmdldEhhbmRsZXJzKCkubGVuZ3RoLCAyKTsKICAgICAgICAgYXNzZXJ0U2FtZShsb2cuZ2V0SGFuZGxlcnMoKVswXSwgaDEpOwogICAgICAgICBhc3NlcnRTYW1lKGxvZy5nZXRIYW5kbGVycygpWzFdLCBoMyk7CisKICAgICB9CiAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0RmlsdGVyICYgc2V0RmlsdGVyIHdpdGggbm9ybWFsIHZhbHVlIGZvciBhIG5hbWVkIGxvZ2dlciwgaGF2aW5nCiAgICAgICogc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0RmlsdGVyICYgc2V0RmlsdGVyIHdpdGggbm9ybWFsIHZhbHVlICIgKworICAgICAgICAgICAgImZvciBhIG5hbWVkIGxvZ2dlciwgaGF2aW5nIHN1ZmZpY2llbnQgcHJpdmlsZWdlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZpbHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RmlsdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkZpbHRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldEZpbHRlcl9OYW1lZExvZ2dlclN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIKICAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKCJ0ZXN0R2V0U2V0RmlsdGVyX05hbWVkTG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZSIpOwpAQCAtODg0LDYgKzEzMzUsMjAgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0RmlsdGVyICYgc2V0RmlsdGVyIHdpdGggbnVsbCB2YWx1ZSwgaGF2aW5nIHN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEZpbHRlciAmIHNldEZpbHRlciB3aXRoIG51bGwgdmFsdWUsICIgKworICAgICAgICAgICAgImhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaWx0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEZpbHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXRGaWx0ZXJfTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoInRlc3RHZXRTZXRGaWx0ZXJfTnVsbCIpOwogCkBAIC04OTksNiArMTM2NCwxOCBAQAogICAgICAqIFRlc3Qgc2V0RmlsdGVyIHdpdGggbm9ybWFsIHZhbHVlIGZvciBhIG5hbWVkIGxvZ2dlciwgaGF2aW5nIGluc3VmZmljaWVudAogICAgICAqIHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLCAKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2V0RmlsdGVyIHdpdGggbm9ybWFsIHZhbHVlIGZvciBhIG5hbWVkIGxvZ2dlciwgIiArCisgICAgICAgICAgICAiaGF2aW5nIGluc3VmZmljaWVudCBwcml2aWxlZ2UuIiwgCisgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmlsdGVyIiwgCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGaWx0ZXIiLCAKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtGaWx0ZXIuY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldEZpbHRlcl9OYW1lZExvZ2dlckluc3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlcgogICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoInRlc3RHZXRTZXRGaWx0ZXJfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UiKTsKQEAgLTkxNyw2ICsxMzk0LDEwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldEZpbHRlciBmb3IgYW4gYW5vbnltb3VzIGxvZ2dlciB3aXRoIHN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldEZpbHRlciIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldEZpbHRlciIsIG1ldGhvZEFyZ3MgPSB7RmlsdGVyLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGaWx0ZXJfQW5vbnlMb2dnZXJTdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpOwogICAgICAgICBGaWx0ZXIgZiA9IG5ldyBNb2NrRmlsdGVyKCk7CkBAIC05MjgsNiArMTQwOSwxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXRGaWx0ZXIgZm9yIGFuIGFub255bW91cyBsb2dnZXIgd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldEZpbHRlciIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldEZpbHRlciIsIG1ldGhvZEFyZ3MgPSB7RmlsdGVyLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGaWx0ZXJfQW5vbnlMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCk7CiAgICAgICAgIEZpbHRlciBmID0gbmV3IE1vY2tGaWx0ZXIoKTsKQEAgLTk0NSw2ICsxNDMwLDEwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldEZpbHRlciBmb3IgYSBudWxsLW5hbWVkIG1vY2sgbG9nZ2VyIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRGaWx0ZXIiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRGaWx0ZXIiLCBtZXRob2RBcmdzID0ge0ZpbHRlci5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmlsdGVyX051bGxOYW1lZE1vY2tMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIE1vY2tMb2dnZXIgbWxvZyA9IG5ldyBNb2NrTG9nZ2VyKG51bGwsIG51bGwpOwogICAgICAgICBGaWx0ZXIgZiA9IG5ldyBNb2NrRmlsdGVyKCk7CkBAIC05NjMsNiArMTQ1MiwyMCBAQAogICAgICAqIFRlc3QgZ2V0TGV2ZWwgJiBzZXRMZXZlbCB3aXRoIG5vcm1hbCB2YWx1ZSBmb3IgYSBuYW1lZCBsb2dnZXIsIGhhdmluZwogICAgICAqIHN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldExldmVsICYgc2V0TGV2ZWwgd2l0aCBub3JtYWwgdmFsdWUgZm9yICIgKworICAgICAgICAgICAgImEgbmFtZWQgbG9nZ2VyLCBoYXZpbmcgc3VmZmljaWVudCBwcml2aWxlZ2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TGV2ZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0TGV2ZWxfTmFtZWRMb2dnZXJTdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyCiAgICAgICAgICAgICAgICAgLmdldExvZ2dlcigidGVzdEdldFNldExldmVsX05hbWVkTG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZSIpOwpAQCAtOTc1LDYgKzE0NzgsMjAgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0TGV2ZWwgJiBzZXRMZXZlbCB3aXRoIG51bGwgdmFsdWUsIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRMZXZlbCAmIHNldExldmVsIHdpdGggbnVsbCB2YWx1ZSwgIiArCisgICAgICAgICAgICAiaGF2aW5nIHN1ZmZpY2llbnQgcHJpdmlsZWdlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNldExldmVsX051bGwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ0ZXN0R2V0U2V0TGV2ZWxfTnVsbCIpOwogCkBAIC05OTAsNiArMTUwNywyMCBAQAogICAgICAqIFRlc3Qgc2V0TGV2ZWwgd2l0aCBub3JtYWwgdmFsdWUgZm9yIGEgbmFtZWQgbG9nZ2VyLCBoYXZpbmcgaW5zdWZmaWNpZW50CiAgICAgICogcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNldExldmVsIHdpdGggbm9ybWFsIHZhbHVlIGZvciBhIG5hbWVkIGxvZ2dlciwgIiArCisgICAgICAgICAgICAiaGF2aW5nIGluc3VmZmljaWVudCBwcml2aWxlZ2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TGV2ZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0TGV2ZWxfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIKICAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKCJ0ZXN0R2V0U2V0TGV2ZWxfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UiKTsKQEAgLTEwMDcsNiArMTUzOCwxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXRMZXZlbCBmb3IgYW4gYW5vbnltb3VzIGxvZ2dlciB3aXRoIHN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldExldmVsIiwgbWV0aG9kQXJncyA9IHt9KSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0TGV2ZWwiLCBtZXRob2RBcmdzID0ge0xldmVsLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMZXZlbF9Bbm9ueUxvZ2dlclN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCk7CiAgICAgICAgIGFzc2VydE51bGwobG9nLmdldExldmVsKCkpOwpAQCAtMTAxNyw2ICsxNTUyLDEwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldExldmVsIGZvciBhbiBhbm9ueW1vdXMgbG9nZ2VyIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRMZXZlbCIsIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldExldmVsIiwgbWV0aG9kQXJncyA9IHtMZXZlbC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TGV2ZWxfQW5vbnlMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xMDMzLDYgKzE1NzIsMTAgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0TGV2ZWwgZm9yIGEgbnVsbC1uYW1lZCBtb2NrIGxvZ2dlciB3aXRoIGluc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWwiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRMZXZlbCIsIG1ldGhvZEFyZ3MgPSB7TGV2ZWwuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldExldmVsX051bGxOYW1lZE1vY2tMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIE1vY2tMb2dnZXIgbWxvZyA9IG5ldyBNb2NrTG9nZ2VyKG51bGwsIG51bGwpOwogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkTWFuID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMTA1MCw2ICsxNTkzLDEwIEBACiAgICAgICogVGVzdCBnZXRVc2VQYXJlbnRIYW5kbGVycyAmIHNldFVzZVBhcmVudEhhbmRsZXJzIHdpdGggbm9ybWFsIHZhbHVlIGZvciBhCiAgICAgICogbmFtZWQgbG9nZ2VyLCBoYXZpbmcgc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0VXNlUGFyZW50SGFuZGxlcnMiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRVc2VQYXJlbnRIYW5kbGVycyIsIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0VXNlUGFyZW50SGFuZGxlcnNfTmFtZWRMb2dnZXJTdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyCiAgICAgICAgICAgICAgICAgLmdldExvZ2dlcigidGVzdEdldFNldFVzZVBhcmVudEhhbmRsZXJzX05hbWVkTG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZSIpOwpAQCAtMTA2Myw2ICsxNjEwLDEwIEBACiAgICAgICogVGVzdCBzZXRVc2VQYXJlbnRIYW5kbGVycyB3aXRoIG5vcm1hbCB2YWx1ZSBmb3IgYSBuYW1lZCBsb2dnZXIsIGhhdmluZwogICAgICAqIGluc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0VXNlUGFyZW50SGFuZGxlcnMiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRVc2VQYXJlbnRIYW5kbGVycyIsIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2V0VXNlUGFyZW50SGFuZGxlcnNfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIKICAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKCJ0ZXN0R2V0U2V0VXNlUGFyZW50SGFuZGxlcnNfTmFtZWRMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UiKTsKQEAgLTEwODEsNiArMTYzMiwxMCBAQAogICAgICAqIFRlc3Qgc2V0VXNlUGFyZW50SGFuZGxlcnMgZm9yIGFuIGFub255bW91cyBsb2dnZXIgd2l0aCBzdWZmaWNpZW50CiAgICAgICogcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFVzZVBhcmVudEhhbmRsZXJzIiwgbWV0aG9kQXJncyA9IHt9KSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0VXNlUGFyZW50SGFuZGxlcnMiLCBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFVzZVBhcmVudEhhbmRsZXJzX0Fub255TG9nZ2VyU3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRBbm9ueW1vdXNMb2dnZXIoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShsb2cuZ2V0VXNlUGFyZW50SGFuZGxlcnMoKSk7CkBAIC0xMDkyLDYgKzE2NDcsMTAgQEAKICAgICAgKiBUZXN0IHNldFVzZVBhcmVudEhhbmRsZXJzIGZvciBhbiBhbm9ueW1vdXMgbG9nZ2VyIHdpdGggaW5zdWZmaWNpZW50CiAgICAgICogcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFVzZVBhcmVudEhhbmRsZXJzIiwgbWV0aG9kQXJncyA9IHt9KSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0VXNlUGFyZW50SGFuZGxlcnMiLCBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFVzZVBhcmVudEhhbmRsZXJzX0Fub255TG9nZ2VySW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpOwogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkTWFuID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMTEwOSw2ICsxNjY4LDEwIEBACiAgICAgICogVGVzdCBzZXRVc2VQYXJlbnRIYW5kbGVycyBmb3IgYSBudWxsLW5hbWVkIG1vY2sgbG9nZ2VyIHdpdGggaW5zdWZmaWNpZW50CiAgICAgICogcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFVzZVBhcmVudEhhbmRsZXJzIiwgbWV0aG9kQXJncyA9IHt9KSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0VXNlUGFyZW50SGFuZGxlcnMiLCBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFVzZVBhcmVudEhhbmRsZXJzX051bGxOYW1lZE1vY2tMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIE1vY2tMb2dnZXIgbWxvZyA9IG5ldyBNb2NrTG9nZ2VyKG51bGwsIG51bGwpOwogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkTWFuID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMTEyNSw2ICsxNjg4LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldFBhcmVudCgpIGZvciByb290IGxvZ2dlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRQYXJlbnQoKSBmb3Igcm9vdCBsb2dnZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFyZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmVudF9Sb290KCkgewogICAgICAgICBhc3NlcnROdWxsKExvZ2dlci5nZXRMb2dnZXIoIiIpLmdldFBhcmVudCgpKTsKICAgICB9CkBAIC0xMTMyLDYgKzE3MDQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0UGFyZW50KCkgZm9yIG5vcm1hbCBuYW1lZCBsb2dnZXJzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldFBhcmVudCgpIGZvciBub3JtYWwgbmFtZWQgbG9nZ2Vycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJlbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyZW50X05vcm1hbE5hbWVkKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcigidGVzdEdldFBhcmVudF9Ob3JtYWxOYW1lZCIpOwogICAgICAgICBhc3NlcnRTYW1lKGxvZy5nZXRQYXJlbnQoKSwgTG9nZ2VyLmdldExvZ2dlcigiIikpOwpAQCAtMTE0NCw2ICsxNzI1LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldFBhcmVudCgpIGZvciBhbm9ueW1vdXMgbG9nZ2Vycy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRQYXJlbnQoKSBmb3IgYW5vbnltb3VzIGxvZ2dlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFyZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmVudF9Bbm9ueW1vdXMoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpLmdldFBhcmVudCgpLCBMb2dnZXIKICAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKCIiKSk7CkBAIC0xMTUzLDYgKzE3NDMsOSBAQAogICAgICAqIFRlc3Qgc2V0UGFyZW50KExvZ2dlcikgZm9yIHRoZSBtb2NrIGxvZ2dlciBzaW5jZSBpdCBpcyBhZHZpc2VkIG5vdCB0bwogICAgICAqIGNhbGwgdGhpcyBtZXRob2Qgb24gbmFtZWQgbG9nZ2Vycy4gVGVzdCBub3JtYWwgY29uZGl0aW9ucy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0UGFyZW50IiwgbWV0aG9kQXJncyA9IHtMb2dnZXIuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFBhcmVudF9Ob3JtYWwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBuZXcgTW9ja0xvZ2dlcihudWxsLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKG51bGwsIG51bGwpOwpAQCAtMTE2NCw2ICsxNzU3LDkgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0UGFyZW50KExvZ2dlcikgd2l0aCBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRQYXJlbnQiLCBtZXRob2RBcmdzID0ge0xvZ2dlci5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGFyZW50X051bGwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAobmV3IE1vY2tMb2dnZXIobnVsbCwgbnVsbCkpLnNldFBhcmVudChudWxsKTsKQEAgLTExNzUsNiArMTc3MSw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldFBhcmVudChMb2dnZXIpLCBoYXZpbmcgaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0UGFyZW50IiwgbWV0aG9kQXJncyA9IHtMb2dnZXIuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFBhcmVudF9JbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIE1vY2tMb2dnZXIgbG9nID0gbmV3IE1vY2tMb2dnZXIobnVsbCwgbnVsbCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xMTkxLDYgKzE3OTAsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXRQYXJlbnQoTG9nZ2VyKSB3aXRoIG51bGwsIGhhdmluZyBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRQYXJlbnQiLCBtZXRob2RBcmdzID0ge0xvZ2dlci5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGFyZW50X0luc3VmZmljaWVudFByaXZpbGVnZU51bGwoKSB7CiAgICAgICAgIE1vY2tMb2dnZXIgbG9nID0gbmV3IE1vY2tMb2dnZXIobnVsbCwgbnVsbCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xMjA4LDYgKzE4MTAsOSBAQAogICAgICAqIFRlc3Qgc2V0UGFyZW50KExvZ2dlcikgZm9yIGFuIGFub255bW91cyBsb2dnZXIgd2l0aCBpbnN1ZmZpY2llbnQKICAgICAgKiBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFBhcmVudCIsIG1ldGhvZEFyZ3MgPSB7TG9nZ2VyLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQYXJlbnRfQW5vbnlMb2dnZXJJbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xMjI0LDYgKzE4MjksMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0TmFtZSgpIGZvciBub3JtYWwgbmFtZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0TmFtZSgpIGZvciBub3JtYWwgbmFtZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lX05vcm1hbCgpIHsKICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoInRlc3RHZXROYW1lX05vcm1hbCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RHZXROYW1lX05vcm1hbCIsIGxvZy5nZXROYW1lKCkpOwpAQCAtMTIzNSw2ICsxODQ5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldE5hbWUoKSBmb3IgZW1wdHkgbmFtZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXROYW1lKCkgZm9yIGVtcHR5IG5hbWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lX0VtcHR5KCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcigiIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgbG9nLmdldE5hbWUoKSk7CkBAIC0xMjQ2LDYgKzE4NjksMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0TmFtZSgpIGZvciBudWxsIG5hbWUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0TmFtZSgpIGZvciBudWxsIG5hbWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lX051bGwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCk7CiAgICAgICAgIGFzc2VydE51bGwobG9nLmdldE5hbWUoKSk7CkBAIC0xMjU3LDYgKzE4ODksMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0UmVzb3VyY2VCdW5kbGUoKSB3aGVuIGl0IGl0IG5vdCBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldFJlc291cmNlQnVuZGxlKCkgd2hlbiBpdCBpdCBub3QgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZUJ1bmRsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZUJ1bmRsZV9Ob3JtYWwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ0ZXN0R2V0UmVzb3VyY2VCdW5kbGVfTm9ybWFsIiwKICAgICAgICAgICAgICAgICBWQUxJRF9SRVNPVVJDRV9CVU5ETEUpOwpAQCAtMTI2OSw2ICsxOTEwLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGdldFJlc291cmNlQnVuZGxlKCkgd2hlbiBpdCBpdCBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldFJlc291cmNlQnVuZGxlKCkgd2hlbiBpdCBpdCBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlc291cmNlQnVuZGxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlQnVuZGxlX051bGwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ0ZXN0R2V0UmVzb3VyY2VCdW5kbGVfTnVsbCIsIG51bGwpOwogICAgICAgICBhc3NlcnROdWxsKGxvZy5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKQEAgLTEyNzcsOSArMTkyNywxOSBAQAogICAgICAgICBhc3NlcnROdWxsKG1sb2cuZ2V0UmVzb3VyY2VCdW5kbGUoKSk7CiAgICAgfQogCisKICAgICAvKgogICAgICAqIFRlc3QgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgd2hlbiBpdCBpdCBub3QgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB3aGVuIGl0IGl0IG5vdCBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlc291cmNlQnVuZGxlTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZUJ1bmRsZU5hbWVfTm9ybWFsKCkgewogICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcigidGVzdEdldFJlc291cmNlQnVuZGxlTmFtZV9Ob3JtYWwiLAogICAgICAgICAgICAgICAgIFZBTElEX1JFU09VUkNFX0JVTkRMRSk7CkBAIC0xMjkyLDYgKzE5NTIsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgd2hlbiBpdCBpdCBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHdoZW4gaXQgaXQgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZUJ1bmRsZU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VCdW5kbGVOYW1lX051bGwoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ0ZXN0R2V0UmVzb3VyY2VCdW5kbGVOYW1lX051bGwiLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbChsb2cuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOwpAQCAtMTMwMCw5ICsxOTY5LDEzIEBACiAgICAgICAgIGFzc2VydE51bGwobWxvZy5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSk7CiAgICAgfQogCisKICAgICAvKgogICAgICAqIFRlc3QgaXNMb2dnYWJsZShMZXZlbCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImlzTG9nZ2FibGUiLCBtZXRob2RBcmdzID0ge0xldmVsLmNsYXNzfSkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0xvZ2dhYmxlKCkgewogICAgICAgICBNb2NrTG9nZ2VyIG1sb2cgPSBuZXcgTW9ja0xvZ2dlcihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbChtbG9nLmdldExldmVsKCkpOwpAQCAtMTMzNiw2ICsyMDA5LDEwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRocm93aW5nKFN0cmluZywgU3RyaW5nLCBUaHJvd2FibGUpIHdpdGggbm9ybWFsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidGhyb3dpbmciLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfSkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd2luZ19Ob3JtYWwoKSB7CiAgICAgICAgIFRocm93YWJsZSB0ID0gbmV3IFRocm93YWJsZSgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5GSU5FUik7CkBAIC0xMzUzLDE0ICsyMDMwLDIxIEBACiAgICAgICAgIGFzc2VydFNhbWUoci5nZXRQYXJhbWV0ZXJzKCksIG51bGwpOwogICAgICAgICBhc3NlcnRTYW1lKHIuZ2V0VGhyb3duKCksIHQpOwogCisKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuRklORSk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnRocm93aW5nKCJzb3VyY2VDbGFzcyIsICJzb3VyY2VNZXRob2QiLCB0KTsKKworICAgICAgICAvLyBGSU5FIGlzIGEgbGV2ZWwgdG9vIGxvdywgbWVzc2FnZSB3aWxsIGJlIGxvc3QgPT4gZW1wdHkKICAgICAgICAgYXNzZXJ0VHJ1ZShDYWxsVmVyaWZpY2F0aW9uU3RhY2suZ2V0SW5zdGFuY2UoKS5lbXB0eSgpKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFRlc3QgdGhyb3dpbmcoU3RyaW5nLCBTdHJpbmcsIFRocm93YWJsZSkgd2l0aCBudWxsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidGhyb3dpbmciLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfSkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd2luZ19OdWxsKCkgewogICAgICAgICBMb2dnZXIgY2hpbGQgPSBuZXcgTW9ja0xvZ2dlcigiY2hpbGRMb2dnZXIiLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKCJwYXJlbnRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyKTsKQEAgLTEzODUsNiArMjA2OSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBlbnRlcmluZyhTdHJpbmcsIFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGVudGVyaW5nKFN0cmluZywgU3RyaW5nKSB3aXRoIG5vcm1hbCB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50ZXJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVudGVyaW5nX1N0cmluZ1N0cmluZ19Ob3JtYWwoKSB7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLkZJTkVSKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuZW50ZXJpbmcoInNvdXJjZUNsYXNzIiwgInNvdXJjZU1ldGhvZCIpOwpAQCAtMTQwOSw2ICsyMTAyLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGVudGVyaW5nKFN0cmluZywgU3RyaW5nKSB3aXRoIG51bGwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGVudGVyaW5nKFN0cmluZywgU3RyaW5nKSB3aXRoIG51bGwgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudGVyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlcmluZ19TdHJpbmdTdHJpbmdfTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0xNDMzLDYgKzIxMzUsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZW50ZXJpbmcoU3RyaW5nLCBTdHJpbmcsIE9iamVjdCkgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGVudGVyaW5nKFN0cmluZywgU3RyaW5nLCBPYmplY3QpIHdpdGggbm9ybWFsIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRlcmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJpbmdfU3RyaW5nU3RyaW5nT2JqZWN0X05vcm1hbCgpIHsKICAgICAgICAgT2JqZWN0IHBhcmFtID0gbmV3IE9iamVjdCgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5GSU5FUik7CkBAIC0xNDU5LDYgKzIxNzAsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZW50ZXJpbmcoU3RyaW5nLCBTdHJpbmcsIE9iamVjdCkgd2l0aCBudWxsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBlbnRlcmluZyhTdHJpbmcsIFN0cmluZywgT2JqZWN0KSB3aXRoIG51bGwgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudGVyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlcmluZ19TdHJpbmdTdHJpbmdPYmplY3RfTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0xNDg0LDYgKzIyMDQsMTYgQEAKICAgICAvKgogICAgICAqIFRlc3QgZW50ZXJpbmcoU3RyaW5nLCBTdHJpbmcsIE9iamVjdFtdKSB3aXRoIG5vcm1hbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZW50ZXJpbmcoU3RyaW5nLCBTdHJpbmcsIE9iamVjdFtdKSB3aXRoIG5vcm1hbCAiICsKKyAgICAgICAgICAgICJ2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50ZXJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJpbmdfU3RyaW5nU3RyaW5nT2JqZWN0c19Ob3JtYWwoKSB7CiAgICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMl07CiAgICAgICAgIHBhcmFtc1swXSA9IG5ldyBPYmplY3QoKTsKQEAgLTE1MTQsNiArMjI0NCwxNyBAQAogICAgICAqIFRlc3QgZW50ZXJpbmcoU3RyaW5nLCBTdHJpbmcsIE9iamVjdFtdKSB3aXRoIG51bGwgY2xhc3MgbmFtZSBhbmQgbWV0aG9kCiAgICAgICogbmFtZSBhbmQgZW1wdHkgcGFyYW1ldGVyIGFycmF5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGVudGVyaW5nKFN0cmluZywgU3RyaW5nLCBPYmplY3RbXSkgd2l0aCBudWxsIGNsYXNzICIgKworICAgICAgICAgICAgIm5hbWUgYW5kIG1ldGhvZCBuYW1lIGFuZCBlbXB0eSBwYXJhbWV0ZXIgYXJyYXkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50ZXJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlcmluZ19TdHJpbmdTdHJpbmdPYmplY3RzX051bGxFbXB0eSgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0xNTM5LDYgKzIyODAsMTcgQEAKICAgICAgKiBUZXN0IGVudGVyaW5nKFN0cmluZywgU3RyaW5nLCBPYmplY3RbXSkgd2l0aCBudWxsIHZhbHVlcyB3aXRoIGFwcHJvcHJpYXRlCiAgICAgICogbG9nZ2luZyBsZXZlbCBzZXQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgIGVudGVyaW5nKFN0cmluZywgU3RyaW5nLCBPYmplY3RbXSkgd2l0aCBudWxsICIgKworICAgICAgICAgICAgInZhbHVlcyB3aXRoIGFwcHJvcHJpYXRlIGxvZ2dpbmcgbGV2ZWwgc2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudGVyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJpbmdfU3RyaW5nU3RyaW5nT2JqZWN0c19OdWxsKCkgewogICAgICAgICBzaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuRklORVIpOwogICAgICAgICBzaGFyZWRMb2dnZXIuZW50ZXJpbmcobnVsbCwgbnVsbCwgKE9iamVjdFtdKSBudWxsKTsKQEAgLTE1NjEsNiArMjMxMywxNyBAQAogICAgICAqIFRlc3QgZW50ZXJpbmcoU3RyaW5nLCBTdHJpbmcsIE9iamVjdFtdKSB3aXRoIG51bGwgdmFsdWVzIHdpdGgKICAgICAgKiBpbmFwcHJvcHJpYXRlIGxvZ2dpbmcgbGV2ZWwgc2V0LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGVudGVyaW5nKFN0cmluZywgU3RyaW5nLCBPYmplY3RbXSkgd2l0aCBudWxsICIgKworICAgICAgICAgICAgInZhbHVlcyB3aXRoIGluYXBwcm9wcmlhdGUgbG9nZ2luZyBsZXZlbCBzZXQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50ZXJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlcmluZ19TdHJpbmdTdHJpbmdPYmplY3RzX051bGxEaXNhYmxlZCgpIHsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuRklORSk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLmVudGVyaW5nKG51bGwsIG51bGwsIChPYmplY3RbXSkgbnVsbCk7CkBAIC0xNTcwLDYgKzIzMzMsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZXhpdGluZyhTdHJpbmcsIFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4aXRpbmcoU3RyaW5nLCBTdHJpbmcpIHdpdGggbm9ybWFsIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRlcmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhpdGluZ19TdHJpbmdTdHJpbmdfTm9ybWFsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5GSU5FUik7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLmV4aXRpbmcoInNvdXJjZUNsYXNzIiwgInNvdXJjZU1ldGhvZCIpOwpAQCAtMTU5NCw2ICsyMzY2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGV4aXRpbmcoU3RyaW5nLCBTdHJpbmcpIHdpdGggbnVsbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZXhpdGluZyhTdHJpbmcsIFN0cmluZykgd2l0aCBudWxsIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGl0aW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGl0aW5nX1N0cmluZ1N0cmluZ19OdWxsKCkgewogICAgICAgICBMb2dnZXIgY2hpbGQgPSBuZXcgTW9ja0xvZ2dlcigiY2hpbGRMb2dnZXIiLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKCJwYXJlbnRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyKTsKQEAgLTE2MTgsNiArMjM5OSwxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCBleGl0aW5nKFN0cmluZywgU3RyaW5nLCBPYmplY3QpIHdpdGggbm9ybWFsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBleGl0aW5nKFN0cmluZywgU3RyaW5nLCBPYmplY3QpIHdpdGggbm9ybWFsIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGl0aW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEV4aXRpbmdfU3RyaW5nU3RyaW5nT2JqZWN0X05vcm1hbCgpIHsKICAgICAgICAgT2JqZWN0IHBhcmFtID0gbmV3IE9iamVjdCgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5GSU5FUik7CkBAIC0xNjQ0LDYgKzI0MzUsMTYgQEAKICAgICAvKgogICAgICAqIFRlc3QgZXhpdGluZyhTdHJpbmcsIFN0cmluZywgT2JqZWN0KSB3aXRoIG51bGwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4aXRpbmcoU3RyaW5nLCBTdHJpbmcsIE9iamVjdCkgd2l0aCBudWxsIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGl0aW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEV4aXRpbmdfU3RyaW5nU3RyaW5nT2JqZWN0X051bGwoKSB7CiAgICAgICAgIExvZ2dlciBjaGlsZCA9IG5ldyBNb2NrTG9nZ2VyKCJjaGlsZExvZ2dlciIsIG51bGwpOwogICAgICAgICBMb2dnZXIgcGFyZW50ID0gbmV3IE1vY2tMb2dnZXIoInBhcmVudExvZ2dlciIsIFZBTElEX1JFU09VUkNFX0JVTkRMRTIpOwpAQCAtMTY2OSw2ICsyNDcwLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGNvbmZpZyhTdHJpbmcpIHdpdGggbm9ybWFsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25maWciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ19Ob3JtYWwoKSB7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLkNPTkZJRyk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLmNvbmZpZygiY29uZmlnIG1zZyIpOwpAQCAtMTY5Myw2ICsyNTAzLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGNvbmZpZyhTdHJpbmcpIHdpdGggbnVsbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25maWciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ19OdWxsKCkgewogICAgICAgICBMb2dnZXIgY2hpbGQgPSBuZXcgTW9ja0xvZ2dlcigiY2hpbGRMb2dnZXIiLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKCJwYXJlbnRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyKTsKQEAgLTE3MjEsNiArMjU0MCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBmaW5lKFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmVfTm9ybWFsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5GSU5FKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuZmluZSgiZmluZSBtc2ciKTsKQEAgLTE3NDUsNiArMjU3MywxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBmaW5lKFN0cmluZykgd2l0aCBudWxsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmaW5lKFN0cmluZykgd2l0aCBudWxsIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5lX051bGwoKSB7CiAgICAgICAgIExvZ2dlciBjaGlsZCA9IG5ldyBNb2NrTG9nZ2VyKCJjaGlsZExvZ2dlciIsIG51bGwpOwogICAgICAgICBMb2dnZXIgcGFyZW50ID0gbmV3IE1vY2tMb2dnZXIoInBhcmVudExvZ2dlciIsIFZBTElEX1JFU09VUkNFX0JVTkRMRTIpOwpAQCAtMTc3Myw2ICsyNjEwLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGZpbmVyKFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZpbmVyKFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5lcl9Ob3JtYWwoKSB7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLkZJTkVSKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuZmluZXIoImZpbmVyIG1zZyIpOwpAQCAtMTc5Nyw2ICsyNjQzLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGZpbmVyKFN0cmluZykgd2l0aCBudWxsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmaW5lcihTdHJpbmcpIHdpdGggbnVsbCB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmVyX051bGwoKSB7CiAgICAgICAgIExvZ2dlciBjaGlsZCA9IG5ldyBNb2NrTG9nZ2VyKCJjaGlsZExvZ2dlciIsIG51bGwpOwogICAgICAgICBMb2dnZXIgcGFyZW50ID0gbmV3IE1vY2tMb2dnZXIoInBhcmVudExvZ2dlciIsIFZBTElEX1JFU09VUkNFX0JVTkRMRTIpOwpAQCAtMTgyNSw2ICsyNjgwLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGZpbmVzdChTdHJpbmcpIHdpdGggbm9ybWFsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmaW5lc3QoU3RyaW5nKSB3aXRoIG5vcm1hbCB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluZXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5lc3RfTm9ybWFsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5GSU5FU1QpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5maW5lc3QoImZpbmVzdCBtc2ciKTsKQEAgLTE4NDksNiArMjcxMywxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBmaW5lc3QoU3RyaW5nKSB3aXRoIG51bGwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZpbmVzdChTdHJpbmcpIHdpdGggbnVsbCB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluZXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5lc3RfTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0xODc3LDYgKzI3NTAsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBpbmZvKFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJpbmZvIiwgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluZm9fTm9ybWFsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuaW5mbygiaW5mbyBtc2ciKTsKQEAgLTE5MDEsNiArMjc3Nyw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGluZm8oU3RyaW5nKSB3aXRoIG51bGwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJpbmZvIiwgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluZm9fTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0xOTI5LDYgKzI4MDgsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCB3YXJuaW5nKFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3YXJuaW5nIiwgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdhcm5pbmdfTm9ybWFsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5XQVJOSU5HKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIud2FybmluZygid2FybmluZyBtc2ciKTsKQEAgLTE5NTMsNiArMjgzNSw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHdhcm5pbmcoU3RyaW5nKSB3aXRoIG51bGwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3YXJuaW5nIiwgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdhcm5pbmdfTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0xOTgxLDYgKzI4NjYsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXZlcmUoU3RyaW5nKSB3aXRoIG5vcm1hbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldmVyZSIsIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZlcmVfTm9ybWFsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5TRVZFUkUpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXZlcmUoInNldmVyZSBtc2ciKTsKQEAgLTIwMDUsNiArMjg5Myw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldmVyZShTdHJpbmcpIHdpdGggbnVsbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldmVyZSIsIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZlcmVfTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0yMDMzLDYgKzI5MjQsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZykgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19MZXZlbFN0cmluZ19Ob3JtYWwoKSB7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLklORk8pOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5sb2coTGV2ZWwuSU5GTywgImxvZyhMZXZlbCwgU3RyaW5nKSBtc2ciKTsKQEAgLTIwNTksNiArMjk1Myw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGxvZyhMZXZlbCwgU3RyaW5nKSB3aXRoIG51bGwgbWVzc2FnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9nIiwgbWV0aG9kQXJncyA9IHtMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfTGV2ZWxTdHJpbmdfTnVsbE1zZygpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0yMDgzLDYgKzI5ODAsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZykgd2l0aCBudWxsIGxldmVsLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19MZXZlbFN0cmluZ19OdWxsTGV2ZWwoKSB7CiAgICAgICAgIC8vIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLk9GRik7CiAgICAgICAgIHRyeSB7CkBAIC0yMDk1LDYgKzI5OTUsMTAgQEAKICAgICAvKgogICAgICAqIFRlc3QgbG9nKExldmVsLCBTdHJpbmcsIE9iamVjdCkgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfTGV2ZWxTdHJpbmdPYmplY3RfTm9ybWFsKCkgewogICAgICAgICBPYmplY3QgcGFyYW0gPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLklORk8pOwpAQCAtMjEyNiw2ICszMDMwLDEwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IGxvZyhMZXZlbCwgU3RyaW5nLCBPYmplY3QpIHdpdGggbnVsbCBtZXNzYWdlIGFuZCBvYmplY3QuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19MZXZlbFN0cmluZ09iamVjdF9OdWxsTXNnT2JqKCkgewogICAgICAgICBMb2dnZXIgY2hpbGQgPSBuZXcgTW9ja0xvZ2dlcigiY2hpbGRMb2dnZXIiLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKCJwYXJlbnRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyKTsKQEAgLTIxNTEsNiArMzA1OSwxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZywgT2JqZWN0KSB3aXRoIG51bGwgbGV2ZWwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19MZXZlbFN0cmluZ09iamVjdF9OdWxsTGV2ZWwoKSB7CiAgICAgICAgIC8vIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLk9GRik7CiAgICAgICAgIHRyeSB7CkBAIC0yMTY0LDYgKzMwNzYsMTEgQEAKICAgICAvKgogICAgICAqIFRlc3QgbG9nKExldmVsLCBTdHJpbmcsIE9iamVjdFtdKSB3aXRoIG5vcm1hbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0W10uY2xhc3N9KQorICAgIH0pCisgICAgICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX0xldmVsU3RyaW5nT2JqZWN0c19Ob3JtYWwoKSB7CiAgICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMl07CiAgICAgICAgIHBhcmFtc1swXSA9IG5ldyBPYmplY3QoKTsKQEAgLTIxOTgsNiArMzExNSwxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZywgT2JqZWN0W10pIHdpdGggbnVsbCBtZXNzYWdlIGFuZCBvYmplY3QuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBPYmplY3RbXS5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX0xldmVsU3RyaW5nT2JqZWN0c19OdWxsTXNnT2JqKCkgewogICAgICAgICBMb2dnZXIgY2hpbGQgPSBuZXcgTW9ja0xvZ2dlcigiY2hpbGRMb2dnZXIiLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKCJwYXJlbnRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyKTsKQEAgLTIyMjIsOCArMzE0MywxMSBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZywgT2JqZWN0W10pIHdpdGggbnVsbCBsZXZlbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9nIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIE9iamVjdFtdLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfTGV2ZWxTdHJpbmdPYmplY3RzX051bGxMZXZlbCgpIHsKLSAgICAgICAgLy8gdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuT0ZGKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLmxvZyhudWxsLCAibG9nKExldmVsLCBTdHJpbmcsIE9iamVjdFtdKSBtc2ciLAogICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0WzBdKTsKQEAgLTIyMzUsNiArMzE1OSwxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZywgVGhyb3dhYmxlKSB3aXRoIG5vcm1hbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9nIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19MZXZlbFN0cmluZ1Rocm93YWJsZV9Ob3JtYWwoKSB7CiAgICAgICAgIFRocm93YWJsZSB0ID0gbmV3IFRocm93YWJsZSgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKQEAgLTIyNjUsNiArMzE5MywxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZywgVGhyb3dhYmxlKSB3aXRoIG51bGwgbWVzc2FnZSBhbmQgdGhyb3dhYmxlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19MZXZlbFN0cmluZ1Rocm93YWJsZV9OdWxsKCkgewogICAgICAgICBMb2dnZXIgY2hpbGQgPSBuZXcgTW9ja0xvZ2dlcigiY2hpbGRMb2dnZXIiLCBudWxsKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKCJwYXJlbnRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyKTsKQEAgLTIyODksNiArMzIyMSwxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2coTGV2ZWwsIFN0cmluZywgVGhyb3dhYmxlKSB3aXRoIG51bGwgbGV2ZWwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX0xldmVsU3RyaW5nVGhyb3dhYmxlX051bGxMZXZlbCgpIHsKICAgICAgICAgLy8gdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuT0ZGKTsKICAgICAgICAgdHJ5IHsKQEAgLTIzMDIsNiArMzIzOCw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGxvZ3AoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpIHdpdGggbm9ybWFsIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncCIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dwX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nX05vcm1hbCgpIHsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLmxvZ3AoTGV2ZWwuSU5GTywgInNvdXJjZUNsYXNzIiwgInNvdXJjZU1ldGhvZCIsCkBAIC0yMzMxLDYgKzMyNzAsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2dwKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKSB3aXRoIG51bGwgbWVzc2FnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncCIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dwX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nX051bGxNc2coKSB7CiAgICAgICAgIExvZ2dlciBjaGlsZCA9IG5ldyBNb2NrTG9nZ2VyKCJjaGlsZExvZ2dlciIsIG51bGwpOwogICAgICAgICBMb2dnZXIgcGFyZW50ID0gbmV3IE1vY2tMb2dnZXIoInBhcmVudExvZ2dlciIsIFZBTElEX1JFU09VUkNFX0JVTkRMRTIpOwpAQCAtMjM1NSw2ICszMjk3LDkgQEAKICAgICAvKgogICAgICAqIFRlc3QgbG9ncChMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZykgd2l0aCBudWxsIGxldmVsLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2dwIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3BfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdfTnVsbExldmVsKCkgewogICAgICAgICAvLyB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5PRkYpOwogICAgICAgICB0cnkgewpAQCAtMjM2OCw2ICszMzEzLDkgQEAKICAgICAvKgogICAgICAqIFRlc3QgbG9ncChMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0KSB3aXRoIG5vcm1hbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3AiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dwX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nT2JqZWN0X05vcm1hbCgpIHsKICAgICAgICAgT2JqZWN0IHBhcmFtID0gbmV3IE9iamVjdCgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKQEAgLTI0MDEsNiArMzM0OSw5IEBACiAgICAgICogVGVzdCBsb2dwKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBPYmplY3QpIHdpdGggbnVsbCBtZXNzYWdlIGFuZAogICAgICAqIG9iamVjdC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncCIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3BfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdPYmplY3RfTnVsbE1zZ09iaigpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0yNDI2LDYgKzMzNzcsMTAgQEAKICAgICAvKgogICAgICAqIFRlc3QgbG9ncChMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0KSB3aXRoIG51bGwgbGV2ZWwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3AiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzfSl9KQorICAgICAgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3BfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdPYmplY3RfTnVsbExldmVsKCkgewogICAgICAgICAvLyB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5PRkYpOwogICAgICAgICB0cnkgewpAQCAtMjQ0MCw2ICszMzk1LDExIEBACiAgICAgLyoKICAgICAgKiBUZXN0IGxvZ3AoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIE9iamVjdFtdKSB3aXRoIG5vcm1hbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3AiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0W10uY2xhc3N9KQorICAgIH0pCisgICAgICAgICAgICAgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dwX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nT2JqZWN0c19Ob3JtYWwoKSB7CiAgICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMl07CiAgICAgICAgIHBhcmFtc1swXSA9IG5ldyBPYmplY3QoKTsKQEAgLTI0NzYsNiArMzQzNiwxMCBAQAogICAgICAqIFRlc3QgbG9ncChMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0W10pIHdpdGggbnVsbCBtZXNzYWdlIGFuZAogICAgICAqIG9iamVjdC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncCIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBPYmplY3RbXS5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncF9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ09iamVjdHNfTnVsbE1zZ09iaigpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0yNTAwLDYgKzM0NjQsMTAgQEAKICAgICAvKgogICAgICAqIFRlc3QgbG9ncChMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0W10pIHdpdGggbnVsbCBsZXZlbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncCIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBPYmplY3RbXS5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncF9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ09iamVjdHNfTnVsbExldmVsKCkgewogICAgICAgICAvLyB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5PRkYpOwogICAgICAgICB0cnkgewpAQCAtMjUxNCw2ICszNDgyLDEwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IGxvZ3AoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFRocm93YWJsZSkgd2l0aCBub3JtYWwgdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2dwIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZS5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncF9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ1Rocm93YWJsZV9Ob3JtYWwoKSB7CiAgICAgICAgIFRocm93YWJsZSB0ID0gbmV3IFRocm93YWJsZSgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKQEAgLTI1NDYsNyArMzUxOCwxMSBAQAogICAgICAqIFRlc3QgbG9ncChMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgVGhyb3dhYmxlKSB3aXRoIG51bGwgbWVzc2FnZSBhbmQKICAgICAgKiB0aHJvd2FibGUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExvZ3BfTGV2ZWxTdHJpbmdUU3RyaW5nU3RyaW5naHJvd2FibGVfTnVsbCgpIHsKKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncCIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUuY2xhc3N9KX0pCisgICAgcHVibGljIHZvaWQgdGVzdExvZ3BfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdUaHJvd2FibGVfTnVsbCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CiAgICAgICAgIGNoaWxkLmFkZEhhbmRsZXIobmV3IE1vY2tIYW5kbGVyKCkpOwpAQCAtMjU3MCw2ICszNTQ2LDEwIEBACiAgICAgLyoKICAgICAgKiBUZXN0IGxvZ3AoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFRocm93YWJsZSkgd2l0aCBudWxsIGxldmVsLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2dwIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZS5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncF9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ1Rocm93YWJsZV9OdWxsTGV2ZWwoKSB7CiAgICAgICAgIC8vIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLk9GRik7CiAgICAgICAgIHRyeSB7CkBAIC0yNTg0LDYgKzM1NjQsOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2dyYihMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKSB3aXRoIG5vcm1hbCB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3JiIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncmJfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdfTm9ybWFsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIubG9ncmIoTGV2ZWwuSU5GTywgInNvdXJjZUNsYXNzIiwgInNvdXJjZU1ldGhvZCIsCkBAIC0yNjE2LDYgKzM1OTksOSBAQAogICAgIC8qCiAgICAgICogVGVzdCBsb2dyYihMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKSB3aXRoIG51bGwgbWVzc2FnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncmIiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dyYl9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ19OdWxsTXNnKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIubG9ncmIoTGV2ZWwuSU5GTywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CkBAIC0yNjM0LDggKzM2MjAsMTAgQEAKICAgICAvKgogICAgICAqIFRlc3QgbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpIHdpdGggbnVsbCBsZXZlbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncmIiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dyYl9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ19OdWxsTGV2ZWwoKSB7Ci0gICAgICAgIC8vIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLk9GRik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5sb2dyYihudWxsLCAic291cmNlQ2xhc3MiLCAic291cmNlTWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgVkFMSURfUkVTT1VSQ0VfQlVORExFMiwKQEAgLTI2NDksNiArMzYzNyw5IEBACiAgICAgICogVGVzdCBsb2dyYihMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKSB3aXRoIGludmFsaWQgcmVzb3VyY2UKICAgICAgKiBidW5kbGUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3JiIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncmJfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdfSW52YWxpZFJlcygpIHsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuQUxMKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIubG9ncmIoTGV2ZWwuQUxMLCAic291cmNlQ2xhc3MiLCAic291cmNlTWV0aG9kIiwKQEAgLTI2NzIsNiArMzY2MywxMCBAQAogICAgICAqIFRlc3QgbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0KSB3aXRoIG5vcm1hbAogICAgICAqIHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncmIiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3JiX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nT2JqZWN0X05vcm1hbCgpIHsKICAgICAgICAgT2JqZWN0IHBhcmFtID0gbmV3IE9iamVjdCgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKQEAgLTI3MDksNiArMzcwNCwxMCBAQAogICAgICAqIFRlc3QgbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0KSB3aXRoIG51bGwKICAgICAgKiBtZXNzYWdlIGFuZCBvYmplY3QuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3JiIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dyYl9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ09iamVjdF9OdWxsTXNnT2JqKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIubG9ncmIoTGV2ZWwuSU5GTywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKQEAgLTI3MjUsMTEgKzM3MjQsMjIgQEAKICAgICAgICAgYXNzZXJ0TnVsbChyLmdldFBhcmFtZXRlcnMoKVswXSk7CiAgICAgICAgIGFzc2VydFNhbWUoci5nZXRUaHJvd24oKSwgbnVsbCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQHRlc3RzIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlciNsb2dyYihMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywKLSAgICAgKiAgICAgICAgU3RyaW5nLCBPYmplY3QpCisgICAgICogamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyI2xvZ3JiKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsCisgICAgICogT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2dyYiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9ncmJMTGV2ZWxfTFN0cmluZ19MU3RyaW5nX0xPYmplY3RfU2VjdXJpdHkoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0xMjkwCkBAIC0yNzQ2LDYgKzM3NTYsMTAgQEAKICAgICAgKiBUZXN0IGxvZ3JiKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIE9iamVjdCkgd2l0aCBudWxsCiAgICAgICogbGV2ZWwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3JiIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dyYl9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ09iamVjdF9OdWxsTGV2ZWwoKSB7CiAgICAgICAgIC8vIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLk9GRik7CiAgICAgICAgIHRyeSB7CkBAIC0yNzYyLDYgKzM3NzYsMTAgQEAKICAgICAgKiBUZXN0IGxvZ3JiKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIE9iamVjdCkgd2l0aCBpbnZhbGlkCiAgICAgICogcmVzb3VyY2UgYnVuZGxlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2dyYiIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncmJfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdPYmplY3RfSW52YWxpZFJlcygpIHsKICAgICAgICAgT2JqZWN0IHBhcmFtID0gbmV3IE9iamVjdCgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5BTEwpOwpAQCAtMjc4Nyw2ICszODA1LDExIEBACiAgICAgICogVGVzdCBsb2dyYihMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBPYmplY3RbXSkgd2l0aCBub3JtYWwKICAgICAgKiB2YWx1ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3JiIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgT2JqZWN0W10uY2xhc3N9KQorICAgIH0pICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3JiX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nT2JqZWN0c19Ob3JtYWwoKSB7CiAgICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMl07CiAgICAgICAgIHBhcmFtc1swXSA9IG5ldyBPYmplY3QoKTsKQEAgLTI4MjcsNiArMzg1MCwxMSBAQAogICAgICAqIFRlc3QgbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0W10pIHdpdGggbnVsbAogICAgICAqIG1lc3NhZ2UgYW5kIG9iamVjdC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncmIiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIE9iamVjdFtdLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dyYl9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ09iamVjdHNfTnVsbE1zZ09iaigpIHsKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLmxvZ3JiKExldmVsLklORk8sIG51bGwsIG51bGwsIG51bGwsIG51bGwsCkBAIC0yODQ3LDE3ICszODc1LDIwIEBACiAgICAgICogVGVzdCBsb2dyYihMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBPYmplY3RbXSkgd2l0aCBudWxsCiAgICAgICogbGV2ZWwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3JiIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgT2JqZWN0W10uY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3JiX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nT2JqZWN0c19OdWxsTGV2ZWwoKSB7Ci0gICAgICAgIC8vIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLk9GRik7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnNoYXJlZExvZ2dlcgotICAgICAgICAgICAgICAgICAgICAubG9ncmIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlQ2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VNZXRob2QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEX1JFU09VUkNFX0JVTkRMRTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ3JiKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIE9iamVjdFtdKSBtc2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0pOworICAgICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIubG9ncmIoCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VNZXRob2QiLAorICAgICAgICAgICAgICAgICAgICBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyLAorICAgICAgICAgICAgICAgICAgICAibG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0W10pIG1zZyIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0pOwogICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uISIpOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KQEAgLTI4NjcsNiArMzg5OCwxMSBAQAogICAgICAqIFRlc3QgbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0W10pIHdpdGggaW52YWxpZAogICAgICAqIHJlc291cmNlIGJ1bmRsZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncmIiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgTGV2ZWwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIE9iamVjdFtdLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dyYl9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ09iamVjdHNfSW52YWxpZFJlcygpIHsKICAgICAgICAgT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFsyXTsKICAgICAgICAgcGFyYW1zWzBdID0gbmV3IE9iamVjdCgpOwpAQCAtMjg5NSw2ICszOTMxLDExIEBACiAgICAgICogVGVzdCBsb2dyYihMZXZlbCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBUaHJvd2FibGUpIHdpdGggbm9ybWFsCiAgICAgICogdmFsdWVzLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2dyYiIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywKKyAgICAgICAgICAgIFN0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dyYl9MZXZlbFN0cmluZ1N0cmluZ1N0cmluZ1Rocm93YWJsZV9Ob3JtYWwoKSB7CiAgICAgICAgIFRocm93YWJsZSB0ID0gbmV3IFRocm93YWJsZSgpOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKQEAgLTI5MzIsNiArMzk3MywxMSBAQAogICAgICAqIFRlc3QgbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgVGhyb3dhYmxlKSB3aXRoIG51bGwKICAgICAgKiBtZXNzYWdlIGFuZCB0aHJvd2FibGUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZ3JiIiwgbWV0aG9kQXJncyA9IHsKKyAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3JiX0xldmVsU3RyaW5nVFN0cmluZ1N0cmluZ2hyb3dhYmxlX051bGxNc2dPYmooKSB7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLklORk8pOwogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5sb2dyYihMZXZlbC5JTkZPLCBudWxsLCBudWxsLCBudWxsLCBudWxsLApAQCAtMjk1MiwxNyArMzk5OCwyMSBAQAogICAgICAqIFRlc3QgbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgVGhyb3dhYmxlKSB3aXRoIG51bGwKICAgICAgKiBsZXZlbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9ncmIiLCBtZXRob2RBcmdzID0geworICAgICAgICAgICAgICAgICAgICBMZXZlbC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9KQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ3JiX0xldmVsU3RyaW5nU3RyaW5nU3RyaW5nVGhyb3dhYmxlX051bGxMZXZlbCgpIHsKICAgICAgICAgLy8gdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuT0ZGKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyCi0gICAgICAgICAgICAgICAgICAgIC5sb2dyYigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VDbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZU1ldGhvZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURfUkVTT1VSQ0VfQlVORExFMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFRocm93YWJsZSkgbXNnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGhyb3dhYmxlKCkpOworICAgICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIubG9ncmIoCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VNZXRob2QiLAorICAgICAgICAgICAgICAgICAgICBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyLAorICAgICAgICAgICAgICAgICAgICAibG9nKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFRocm93YWJsZSkgbXNnIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFRocm93YWJsZSgpKTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiEiKTsKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICB9CkBAIC0yOTcyLDYgKzQwMjIsMTEgQEAKICAgICAgKiBUZXN0IGxvZ3JiKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFRocm93YWJsZSkgd2l0aCBpbnZhbGlkCiAgICAgICogcmVzb3VyY2UgYnVuZGxlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2dyYiIsIG1ldGhvZEFyZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIExldmVsLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ncmJfTGV2ZWxTdHJpbmdTdHJpbmdTdHJpbmdUaHJvd2FibGVfSW52YWxpZFJlcygpIHsKICAgICAgICAgVGhyb3dhYmxlIHQgPSBuZXcgVGhyb3dhYmxlKCk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLnNldExldmVsKExldmVsLkFMTCk7CkBAIC0yOTgyLDcgKzQwMzcsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLmVtcHR5KCkpOwogICAgICAgICBhc3NlcnRTYW1lKHIuZ2V0TG9nZ2VyTmFtZSgpLCB0aGlzLnNoYXJlZExvZ2dlci5nZXROYW1lKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgImxvZ3JiKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpIG1zZyIpOworICAgICAgICAibG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZykgbXNnIik7CiAgICAgICAgIGFzc2VydFNhbWUoci5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSwgSU5WQUxJRF9SRVNPVVJDRV9CVU5ETEUpOwogICAgICAgICBhc3NlcnRTYW1lKHIuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgbnVsbCk7CiAgICAgICAgIGFzc2VydFNhbWUoci5nZXRTb3VyY2VDbGFzc05hbWUoKSwgInNvdXJjZUNsYXNzIik7CkBAIC0yOTk2LDkgKzQwNTEsMTIgQEAKICAgICAgKiBUZXN0IGxvZyhMb2dSZWNvcmQpIGZvciBhIG5vcm1hbCBsb2cgcmVjb3JkLiBNZWFud2hpbGUgdGhlIGxvZ2dlciBoYXMgYW4KICAgICAgKiBhcHByb3ByaWF0ZSBsZXZlbCwgbm8gZmlsdGVyLCBubyBwYXJlbnQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7TG9nUmVjb3JkLmNsYXNzfSkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfTG9nUmVjb3JkX0FwcHJvcHJpYXRlTGV2ZWxOb0ZpbHRlck5vUGFyZW50KCkgewogICAgICAgICBMb2dSZWNvcmQgciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuSU5GTywKLSAgICAgICAgICAgICAgICAidGVzdExvZ19Mb2dSZWNvcmRfQXBwcm9wcmlhdGVMZXZlbE5vRmlsdGVyTm9QYXJlbnQiKTsKKyAgICAgICAgInRlc3RMb2dfTG9nUmVjb3JkX0FwcHJvcHJpYXRlTGV2ZWxOb0ZpbHRlck5vUGFyZW50Iik7CiAKICAgICAgICAgdGhpcy5zaGFyZWRMb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CiAgICAgICAgIHRoaXMuc2hhcmVkTG9nZ2VyLmxvZyhyKTsKQEAgLTMwMDcsNyArNDA2NSw3IEBACiAgICAgICAgIGFzc2VydFRydWUoQ2FsbFZlcmlmaWNhdGlvblN0YWNrLmdldEluc3RhbmNlKCkuZW1wdHkoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoci5nZXRMb2dnZXJOYW1lKCksIG51bGwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgInRlc3RMb2dfTG9nUmVjb3JkX0FwcHJvcHJpYXRlTGV2ZWxOb0ZpbHRlck5vUGFyZW50Iik7CisgICAgICAgICJ0ZXN0TG9nX0xvZ1JlY29yZF9BcHByb3ByaWF0ZUxldmVsTm9GaWx0ZXJOb1BhcmVudCIpOwogICAgICAgICBhc3NlcnRTYW1lKHIuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCksIG51bGwpOwogICAgICAgICBhc3NlcnRTYW1lKHIuZ2V0U291cmNlQ2xhc3NOYW1lKCksIG51bGwpOwogICAgICAgICBhc3NlcnRTYW1lKHIuZ2V0U291cmNlTWV0aG9kTmFtZSgpLCBudWxsKTsKQEAgLTMwMTksNiArNDA3Nyw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGxvZyhMb2dSZWNvcmQpIHdpdGggbnVsbCBsb2cgcmVjb3JkLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX0xvZ1JlY29yZF9OdWxsKCkgewogICAgICAgICB0aGlzLnNoYXJlZExvZ2dlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKICAgICAgICAgdHJ5IHsKQEAgLTMwMzIsNiArNDA5Myw5IEBACiAgICAgICogVGVzdCBsb2coTG9nUmVjb3JkKSBmb3IgYSBub3JtYWwgbG9nIHJlY29yZC4gTWVhbndoaWxlIHRoZSBsb2dnZXIgaGFzIGFuCiAgICAgICogaW5hcHByb3ByaWF0ZSBsZXZlbCwgbm8gZmlsdGVyLCBubyBwYXJlbnQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7TG9nUmVjb3JkLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfTG9nUmVjb3JkX0lucHByb3ByaWF0ZUxldmVsTm9GaWx0ZXJOb1BhcmVudCgpIHsKICAgICAgICAgTG9nUmVjb3JkIHIgPSBuZXcgTG9nUmVjb3JkKExldmVsLklORk8sCiAgICAgICAgICAgICAgICAgInRlc3RMb2dfTG9nUmVjb3JkX0lucHByb3ByaWF0ZUxldmVsTm9GaWx0ZXJOb1BhcmVudCIpOwpAQCAtMzA1MCw2ICs0MTE0LDkgQEAKICAgICAgKiBUZXN0IGxvZyhMb2dSZWNvcmQpIGZvciBhIG5vcm1hbCBsb2cgcmVjb3JkLiBNZWFud2hpbGUgdGhlIGxvZ2dlciBoYXMgYW4KICAgICAgKiBhcHByb3ByaWF0ZSBsZXZlbCwgYSBmaWx0ZXIgdGhhdCBhY2NlcHRzIHRoZSBmZWQgbG9nIHJlY29yZCwgbm8gcGFyZW50LgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX0xvZ1JlY29yZF9BcHByb3ByaWF0ZUxldmVsVHJ1ZUZpbHRlck5vUGFyZW50KCkgewogICAgICAgICBMb2dSZWNvcmQgciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuSU5GTywKICAgICAgICAgICAgICAgICAidGVzdExvZ19Mb2dSZWNvcmRfQXBwcm9wcmlhdGVMZXZlbFRydWVGaWx0ZXJOb1BhcmVudCIpOwpAQCAtMzA3OCw2ICs0MTQ1LDkgQEAKICAgICAgKiBUZXN0IGxvZyhMb2dSZWNvcmQpIGZvciBhIG5vcm1hbCBsb2cgcmVjb3JkLiBNZWFud2hpbGUgdGhlIGxvZ2dlciBoYXMgYW4KICAgICAgKiBhcHByb3ByaWF0ZSBsZXZlbCwgYSBmaWx0ZXIgdGhhdCByZWplY3RzIHRoZSBmZWQgbG9nIHJlY29yZCwgbm8gcGFyZW50LgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX0xvZ1JlY29yZF9BcHByb3ByaWF0ZUxldmVsRmFsc2VGaWx0ZXJOb1BhcmVudCgpIHsKICAgICAgICAgTG9nUmVjb3JkIHIgPSBuZXcgTG9nUmVjb3JkKExldmVsLklORk8sCiAgICAgICAgICAgICAgICAgInRlc3RMb2dfTG9nUmVjb3JkX0FwcHJvcHJpYXRlTGV2ZWxGYWxzZUZpbHRlck5vUGFyZW50Iik7CkBAIC0zMTA1LDYgKzQxNzUsOSBAQAogICAgICAqIFRlc3QgdGhhdCB0aGUgcGFyZW50J3MgaGFuZGxlciBpcyBub3RpZmllZCBmb3IgYSBuZXcgbG9nIHJlY29yZCB3aGVuCiAgICAgICogZ2V0VXNlUGFyZW50SGFuZGxlcnMoKSBpcyB0cnVlLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX1BhcmVudEluZm9ybWVkKCkgewogICAgICAgICBMb2dnZXIgY2hpbGQgPSBuZXcgTW9ja0xvZ2dlcigiY2hpbGRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUpOwogICAgICAgICBMb2dnZXIgcGFyZW50ID0gbmV3IE1vY2tQYXJlbnRMb2dnZXIoInBhcmVudExvZ2dlciIsCkBAIC0zMTU3LDYgKzQyMzAsOSBAQAogICAgICAqIFRlc3QgdGhhdCB0aGUgYW5jZXN0b3IncyBoYW5kbGVyIGlzIG5vdGlmaWVkIGZvciBhIG5ldyBsb2cgcmVjb3JkIHdoZW4KICAgICAgKiBnZXRVc2VQYXJlbnRIYW5kbGVycygpIGlzIHRydWUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7TG9nUmVjb3JkLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfQW5jZXN0b3JJbmZvcm1lZCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrUGFyZW50TG9nZ2VyKCJwYXJlbnRMb2dnZXIiLApAQCAtMzIwMyw2ICs0Mjc5LDkgQEAKICAgICAgKiBUZXN0IHRoYXQgdGhlIHBhcmVudCdzIGhhbmRsZXIgaXMgbm90aWZpZWQgZm9yIGEgbmV3IGxvZyByZWNvcmQgd2hlbgogICAgICAqIGdldFVzZVBhcmVudEhhbmRsZXJzKCkgaXMgZmFsc2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7TG9nUmVjb3JkLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfUGFyZW50Tm90SW5mb3JtZWQoKSB7CiAgICAgICAgIExvZ2dlciBjaGlsZCA9IG5ldyBNb2NrTG9nZ2VyKCJjaGlsZExvZ2dlciIsIFZBTElEX1JFU09VUkNFX0JVTkRMRSk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja1BhcmVudExvZ2dlcigicGFyZW50TG9nZ2VyIiwKQEAgLTMyMjMsNiArNDMwMiw5IEBACiAgICAgICogVGVzdCB0aGF0IGEgbG9nZ2VyIHdpdGggbnVsbCBsZXZlbCBhbmQgbm8gcGFyZW50LiBEZWZhdWx0ZWQgdG8KICAgICAgKiBMZXZlbC5JTkZPLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX051bGxMZXZlbE5vUGFyZW50KCkgewogICAgICAgICBMb2dSZWNvcmQgciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuSU5GTywgInRlc3RMb2dfTnVsbExldmVsTm9QYXJlbnQiKTsKICAgICAgICAgYXNzZXJ0TnVsbCh0aGlzLnNoYXJlZExvZ2dlci5nZXRMZXZlbCgpKTsKQEAgLTMyNDgsNiArNDMzMCw5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoYXQgYSBsb2dnZXIgaW5oZXJpdHMgaXRzIHBhcmVudCBsZXZlbCB3aGVuIGl0cyBsZXZlbCBpcyBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX051bGxMZXZlbEhhc1BhcmVudCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFKTsKICAgICAgICAgTG9nZ2VyIHBhcmVudCA9IG5ldyBNb2NrTG9nZ2VyKCJwYXJlbnRMb2dnZXIiLCBWQUxJRF9SRVNPVVJDRV9CVU5ETEUyKTsKQEAgLTMzMDAsNiArNDM4NSw5IEBACiAgICAgICogVGVzdCB0aGF0IGEgbG9nZ2VyIHdpdGggbnVsbCByZXNvdXJjZSBidW5kbGUgYW5kIG5vIHBhcmVudC4gRGVmYXVsdGVkIHRvCiAgICAgICogbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9nIiwgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19OdWxsUmVzTm9QYXJlbnQoKSB7CiAgICAgICAgIExvZ2dlciBsb2cgPSBuZXcgTW9ja0xvZ2dlcigiTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIGxvZy5hZGRIYW5kbGVyKG5ldyBNb2NrSGFuZGxlcigpKTsKQEAgLTMzMjEsNiArNDQwOSw5IEBACiAgICAgICogVGVzdCB0aGF0IGEgbG9nZ2VyIGluaGVyaXRzIGl0cyBwYXJlbnQgcmVzb3VyY2UgYnVuZGxlIHdoZW4gaXRzIHJlc291cmNlCiAgICAgICogYnVuZGxlIGlzIG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7CisKKyAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvZyIsIG1ldGhvZEFyZ3MgPSB7TG9nUmVjb3JkLmNsYXNzfSl9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dfTnVsbFJlc0hhc1BhcmVudCgpIHsKICAgICAgICAgTG9nZ2VyIGNoaWxkID0gbmV3IE1vY2tMb2dnZXIoImNoaWxkTG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIExvZ2dlciBwYXJlbnQgPSBuZXcgTW9ja0xvZ2dlcigicGFyZW50TG9nZ2VyIiwgVkFMSURfUkVTT1VSQ0VfQlVORExFMik7CkBAIC0zMzUxLDYgKzQ0NDIsOSBAQAogICAgICAqIFRlc3QgdGhhdCBhIGxvZ2dlciBpbmhlcml0cyBpdHMgYW5jZXN0b3IncyByZXNvdXJjZSBidW5kbGUgd2hlbiBpdHMKICAgICAgKiByZXNvdXJjZSBidW5kbGUgYW5kIGl0cyBwYXJlbnQncyByZXNvdXJjZSBidW5kbGUgYXJlIGJvdGggbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgdGFyZ2V0cyA9IHsKKworICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9nIiwgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9KX0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvZ19OdWxsUmVzSGFzQW5jZXN0b3IoKSB7CiAgICAgICAgIExvZ2dlciBjaGlsZCA9IG5ldyBNb2NrTG9nZ2VyKCJjaGlsZExvZ2dlciIsIG51bGwpOwogICAgICAgICBMb2dnZXIgcGFyZW50ID0gbmV3IE1vY2tMb2dnZXIoInBhcmVudExvZ2dlciIsIG51bGwpOwpAQCAtMzM4Myw2ICs0NDc3LDkgQEAKICAgICAvKgogICAgICAqIFRlc3Qgd2hlbiBvbmUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbyhsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgcHVycG9zZSA9ICIiLCB0YXJnZXRzID0geworCisgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsb2ciLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nX0V4Y2VwdGlvbmFsSGFuZGxlcigpIHsKICAgICAgICAgTW9ja0xvZ2dlciBsID0gbmV3IE1vY2tMb2dnZXIoInRlc3RMb2dfRXhjZXB0aW9uYWxIYW5kbGVyIiwgbnVsbCk7CiAgICAgICAgIGwuYWRkSGFuZGxlcihuZXcgTW9ja0V4Y2VwdGlvbmFsSGFuZGxlcigpKTsKQEAgLTMzOTgsNiArNDQ5NSwxMCBAQAogICAgIC8qCiAgICAgICogVGVzdCB3aGV0aGVyIHByaXZpbGVnZWQgY29kZSBpcyB1c2VkIHRvIGxvYWQgcmVzb3VyY2UgYnVuZGxlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8obGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIHB1cnBvc2UgPSAiIiwgCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRBbm9ueW1vdXNMb2dnZXIiLCBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30pCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFJlc291cmNlQnVuZGxlKCkgewogICAgICAgICAvLyAKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZE1hbiA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTM0MDgsMjQgKzQ1MDksMjIgQEAKICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob2xkTWFuKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFJlc291cmNlQnVuZGxlTm9uRXhpc3RlbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUcnkgYSBsb2FkIGEgbm9uLWV4aXN0ZW50IHJlc291cmNlIGJ1bmRsZS4KLSAgICAgICAgICAgIExvZ2dlckV4dGVuc2lvbi5sb2FkUmVzb3VyY2VCdW5kbGUoIm1pc3Npbmdsb2dnZXIucHJvcGVydGllcyIpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYW4gZXhjZXB0aW9uLiIpOwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBpcyBwcmVjaXNlbHkgYSBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXguZ2V0Q2xhc3MoKSA9PSBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICB9Ci0gICAgfQotICAgIAorCisKICAgICAvKioKLSAgICAgKiBAdGVzdHMgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyI2xvZ3JiKExldmVsLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLAotICAgICAqICAgICAgICBTdHJpbmcsIE9iamVjdCkKKyAgICAgKiBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIjbG9ncmIoTGV2ZWwsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywKKyAgICAgKiBPYmplY3QpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9pbml0X2xvZ2dlcigpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaW5pdF9sb2dnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoInRlc3RHZXRMb2dnZXJfTm9ybWFsX0FOZXdMb2dnZXIyLmxldmVsIiwgIkFMTCIpOwogICAgICAgICBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5yZWFkQ29uZmlndXJhdGlvbigKQEAgLTM0MzUsNDAgKzQ1MzQsMjggQEAKICAgICAgICAgICAgICAgICAidGVzdEdldExvZ2dlcl9Ob3JtYWxfQU5ld0xvZ2dlcjIiKSk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvcmlnaW5hbFNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IE1vY2tTZWN1cml0eU1hbmFnZXJPdGhlclBlcm1pc3Npb24oKSk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyKCkpOwogICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCB0aHJvdyBleHBlY3Rpb24KLSAgICAgICAgICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ0ZXN0R2V0TG9nZ2VyX05vcm1hbF9BTmV3TG9nZ2VyMiIpOworICAgICAgICAgICAgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlcgorICAgICAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKCJ0ZXN0R2V0TG9nZ2VyX05vcm1hbF9BTmV3TG9nZ2VyMiIpOwogICAgICAgICAgICAgLy8gc2hvdWxkIHRocm93IGV4Y2VwdGlvbgotICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBsb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuQUxMKTsKICAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpeworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnNldFBhcmVudChMb2dnZXIuZ2V0TG9nZ2VyKCJyb290IikpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuc2V0UGFyZW50KExvZ2dlci5nZXRMb2dnZXIoIiIpKTsKICAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpeworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9yaWdpbmFsU2VjdXJpdHlNYW5hZ2VyKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIHRlc3QgaW5pdEhhbmRsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRIYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgbG9nUHJvcHMgPSBuZXcgRmlsZShMT0dHSU5HX0NPTkZJR19GSUxFKTsKLSAgICAgICAgTG9nTWFuYWdlciBsbSA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpOwotICAgICAgICBsbS5yZWFkQ29uZmlndXJhdGlvbihuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ1Byb3BzKSk7CiAKLSAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoIiIpOwotICAgICAgICAvLyBjYW4gbG9nIHByb3Blcmx5Ci0gICAgICAgIEhhbmRsZXJbXSBoYW5kbGVycyA9IGxvZy5nZXRIYW5kbGVycygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaGFuZGxlcnMubGVuZ3RoKTsKLSAgICB9CiAKICAgICAvKgogICAgICAqIEEgbW9jayBsb2dnZXIsIHVzZWQgdG8gdGVzdCB0aGUgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhbmQgZmllbGRzLgpAQCAtMzU4NCwzNSArNDY3MSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tTZWN1cml0eU1hbmFnZXJPdGhlclBlcm1pc3Npb24gZXh0ZW5kcwotICAgICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uLCBPYmplY3QgY29udGV4dCkgewotICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBMb2dnaW5nUGVybWlzc2lvbikgewotICAgICAgICAgICAgICAgIGlmICghcGVybWlzc2lvbi5nZXROYW1lKCkuZXF1YWxzKCJjb250cm9sIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLmdldE5hbWUoKS5lcXVhbHMoInNldFNlY3VyaXR5TWFuYWdlciIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0gICAgICAgICAgICBpZiAocGVybWlzc2lvbiBpbnN0YW5jZW9mIExvZ2dpbmdQZXJtaXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9uLmdldE5hbWUoKS5lcXVhbHMoImNvbnRyb2wiKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24uZ2V0TmFtZSgpLmVxdWFscygic2V0U2VjdXJpdHlNYW5hZ2VyIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KIAogICAgIC8qCiAgICAgICogQSBtb2NrIGZpbHRlciwgYWx3YXlzIHJldHVybiBmYWxzZS4KZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuVGVzdC5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdNWEJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiZjIxMwotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKiAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmc7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCB0ZXN0cy51dGlsLkNhbGxWZXJpZmljYXRpb25TdGFjazsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dpbmdNWEJlYW47CisvKioKKyAqIFRoaXMgdGVzdGNhc2UgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgaW50ZXJmYWNlIEZpbHRlci4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKExvZ2dpbmdNWEJlYW4uY2xhc3MpIAorcHVibGljIGNsYXNzIExvZ2dpbmdNWEJlYW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIHByaXZhdGUgTW9ja0xvZ2dpbmdNWEJlYW4gbSA9IG51bGw7CisgICAgCisgICAgLyoKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICAgbSA9IG5ldyBNb2NrTG9nZ2luZ01YQmVhbigpOworICAgIH0KKworICAgIC8qCisgICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgCisgICAgICAgCisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ2dlckxldmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ2dlckxldmVsKCkgeworICAgICAgICBhc3NlcnROdWxsKG0uZ2V0TG9nZ2VyTGV2ZWwobnVsbCkpOworICAgIH0KKworICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dnZXJOYW1lcyIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dnZXJOYW1lcygpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKG0uZ2V0TG9nZ2VyTmFtZXMoKSk7CisgICAgICAgICAgfQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJlbnRMb2dnZXJOYW1lIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgICAgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmVudExvZ2dlck5hbWUoKSB7CisgICAgICAgICAgICAgIGFzc2VydE51bGwobS5nZXRQYXJlbnRMb2dnZXJOYW1lKG51bGwpKTsKKyAgICAgICAgICB9CisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldExvZ2dlckxldmVsIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9nZ2VyTGV2ZWwoKSB7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgbS5zZXRMb2dnZXJMZXZlbChudWxsLG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAvKgorICAgICAqIFRoaXMgaW5uZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIEZpbHRlciB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE1vY2tMb2dnaW5nTVhCZWFuIGltcGxlbWVudHMgTG9nZ2luZ01YQmVhbiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2dnZXJMZXZlbChTdHJpbmcgbG9nZ2VyTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldExvZ2dlck5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudExvZ2dlck5hbWUoU3RyaW5nIGxvZ2dlck5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TG9nZ2VyTGV2ZWwoU3RyaW5nIGxvZ2dlck5hbWUsIFN0cmluZyBsZXZlbE5hbWUpIHsKKyAgICAgICAgICAgCisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdQZXJtaXNzaW9uVGVzdC5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IGNkM2VlZTkuLmJjODJkNjUgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nUGVybWlzc2lvblRlc3QuamF2YQorKysgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ1Blcm1pc3Npb25UZXN0LmphdmEKQEAgLTE3LDE3ICsxNywzMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2luZ1Blcm1pc3Npb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKExvZ2dpbmdQZXJtaXNzaW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBMb2dnaW5nUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIsICIiKSk7CiAgICAgfQpAQCAtMzUsMTIgKzUxLDMyIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgIiIpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkxvZ2dpbmdQZXJtaXNzaW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2luZ1Blcm1pc3Npb24oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTG9nZ2luZ1Blcm1pc3Npb24obnVsbCwgbnVsbCk7CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTWVtb3J5SGFuZGxlclRlc3QuamF2YSBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9NZW1vcnlIYW5kbGVyVGVzdC5qYXZhCmluZGV4IDRhNmI1MmMuLmVkYTc1MTQgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9NZW1vcnlIYW5kbGVyVGVzdC5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9NZW1vcnlIYW5kbGVyVGVzdC5qYXZhCkBAIC0xNywxMiArMTcsMTggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy50ZXN0cy5qYXZhLnV0aWwubG9nZ2luZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkZpbHRlcjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcjsKQEAgLTQxLDYgKzQ3LDcgQEAKIC8qKgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTWVtb3J5SGFuZGxlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBNZW1vcnlIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIGZpbmFsIHN0YXRpYyBMb2dNYW5hZ2VyIG1hbmFnZXIgPSBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKTsKQEAgLTEwMCw3ICsxMDcsNDEgQEAKICAgICAgICAgU3lzdGVtLnNldEVycihlcnIpOyAgICAgICAgCiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdFNlY3VyaXR5KCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQdXNoTGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TGV2ZWwuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInB1c2giLAorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFB1c2hMZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb2dnYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsU2VjdXJpdHkoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBjdXJyZW50TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzZWN1cml0eU1hbmFnZXIpOwogICAgICAgICB0cnkgewpAQCAtMTI1LDYgKzE2NiwxNSBAQAogCiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAibm90IGEgZ29vZCB0ZXN0LCB0cnkgdG8gaW1wcm92ZSIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgewogICAgICAgICBGaWx0ZXIgZmlsdGVyID0gaGFuZGxlci5nZXRGaWx0ZXIoKTsKICAgICAgICAgRm9ybWF0dGVyIGZvcm1hdHRlciA9IGhhbmRsZXIuZ2V0Rm9ybWF0dGVyKCk7CkBAIC0xNDAsNiArMTkwLDE1IEBACiAgICAgICAgIGFzc2VydEZhbHNlKGhhbmRsZXIuaXNMb2dnYWJsZShuZXcgTG9nUmVjb3JkKExldmVsLlNFVkVSRSwgInRlc3QiKSkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJub3QgYSBnb29kIHRlc3QsIHRyeSB0byBpbXByb3ZlIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rmx1c2goKSB7CiAgICAgICAgIEZpbHRlciBmaWx0ZXIgPSBoYW5kbGVyLmdldEZpbHRlcigpOwogICAgICAgICBGb3JtYXR0ZXIgZm9ybWF0dGVyID0gaGFuZGxlci5nZXRGb3JtYXR0ZXIoKTsKQEAgLTE1NSw2ICsyMTQsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShoYW5kbGVyLmlzTG9nZ2FibGUobmV3IExvZ1JlY29yZChMZXZlbC5TRVZFUkUsICJ0ZXN0IikpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb2dnYWJsZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICAgICAgICkgCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNMb2dnYWJsZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGhhbmRsZXIuaXNMb2dnYWJsZShudWxsKTsKQEAgLTE2NSw5ICsyMzMsMTMgQEAKICAgICAgICAgTG9nUmVjb3JkIHJlY29yZCA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuRklORVIsICJNU0cxIik7CiAgICAgICAgIGFzc2VydEZhbHNlKGhhbmRsZXIuaXNMb2dnYWJsZShyZWNvcmQpKTsKIAorCiAgICAgICAgIHJlY29yZCA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuRklORSwgIk1TRzIiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShoYW5kbGVyLmlzTG9nZ2FibGUocmVjb3JkKSk7Ci0KKyAgICAgICAgYXNzZXJ0VHJ1ZShoYW5kbGVyLmlzTG9nZ2FibGUobmV3IExvZ1JlY29yZChMZXZlbC5JTkZPLCAiMSIpKSk7CisgICAgICAgIGFzc2VydFRydWUoaGFuZGxlci5pc0xvZ2dhYmxlKG5ldyBMb2dSZWNvcmQoTGV2ZWwuV0FSTklORywgIjIiKSkpOworICAgICAgICBhc3NlcnRUcnVlKGhhbmRsZXIuaXNMb2dnYWJsZShuZXcgTG9nUmVjb3JkKExldmVsLlNFVkVSRSwgIjMiKSkpOworICAgICAgICAKICAgICAgICAgcmVjb3JkID0gbmV3IExvZ1JlY29yZChMZXZlbC5DT05GSUcsICJNU0czIik7CiAgICAgICAgIGFzc2VydFRydWUoaGFuZGxlci5pc0xvZ2dhYmxlKHJlY29yZCkpOwogCkBAIC0xODIsNyArMjU0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIE1lbW9yeUhhbmRsZXIoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1vcnlIYW5kbGVyKCkgeworICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLCAKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiY2hlY2sgZXJyb3JzIiwgCisgICAgICAgICAgICB0YXJnZXRzID0gCisgICAgICAgICAgICB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIk1lbW9yeUhhbmRsZXIiLCBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtb3J5SGFuZGxlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkZpbHRlciBzaG91bGQgbm90IGJlIG51bGwiLCBoYW5kbGVyLmdldEZpbHRlcigpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRm9ybWF0dGVyIHNob3VsZCBub3QgYmUgbnVsbCIsIGhhbmRsZXIuZ2V0Rm9ybWF0dGVyKCkpOwogICAgICAgICBhc3NlcnROdWxsKCJjaGFyYWN0ZXIgZW5jb2Rpbmcgc2hvdWxkIGJlIG51bGwiLCBoYW5kbGVyLmdldEVuY29kaW5nKCkpOwpAQCAtMTkxLDggKzI3MSwzMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIkxldmVsIHNob3VsZCBiZSBGSU5FIiwgTGV2ZWwuRklORSwgaGFuZGxlci5nZXRMZXZlbCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMZXZlbCBzaG91bGQgYmUgV0FSTklORyIsIExldmVsLldBUk5JTkcsIGhhbmRsZXIKICAgICAgICAgICAgICAgICAuZ2V0UHVzaExldmVsKCkpOworCisgICAgICAgIHByb3BzLmNsZWFyKCk7CisgICAgICAgIHByb3BzLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuTWVtb3J5SGFuZGxlci50YXJnZXQiLCBiYXNlQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgKyAiJE1vY2tIYW5kbGVyIik7CisKKyAgICAgICAgbWFuYWdlci5yZWFkQ29uZmlndXJhdGlvbihFbnZpcm9ubWVudEhlbHBlcgorICAgICAgICAgICAgICAgIC5Qcm9wZXJ0aWVzVG9JbnB1dFN0cmVhbShwcm9wcykpOworICAgICAgICBoYW5kbGVyID0gbmV3IE1lbW9yeUhhbmRsZXIoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldEZpbHRlcigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoYW5kbGVyLmdldEZvcm1hdHRlcigpIGluc3RhbmNlb2YgU2ltcGxlRm9ybWF0dGVyKTsKKyAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldEVuY29kaW5nKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGhhbmRsZXIuZ2V0RXJyb3JNYW5hZ2VyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaGFuZGxlci5nZXRMZXZlbCgpLCBMZXZlbC5BTEwpOworICAgICAgICBhc3NlcnRFcXVhbHMoaGFuZGxlci5nZXRQdXNoTGV2ZWwoKSwgTGV2ZWwuU0VWRVJFKTsKKyAKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiTWVtb3J5SGFuZGxlciIsIG1ldGhvZEFyZ3MgPSB7fSkKKyAgICAgICAgICAgIH0KKyAgICAgKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1vcnlIYW5kbGVySW52YWxpZFByb3BzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gbnVsbCB0YXJnZXQKICAgICAgICAgdHJ5IHsKQEAgLTI2MCw2ICszNjMsMTQgQEAKIAogICAgIH0KIAorICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IAorICAgICAgICAgICAgeworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJNZW1vcnlIYW5kbGVyIiwgbWV0aG9kQXJncyA9IHt9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdE1lbW9yeUhhbmRsZXJEZWZhdWx0VmFsdWUoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHByb3BzLmNsZWFyKCk7CkBAIC0yODAsNiArMzkxLDE0IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIE1lbW9yeUhhbmRsZXIoSGFuZGxlciwgaW50LCBMZXZlbCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiTWVtb3J5SGFuZGxlciIsIG1ldGhvZEFyZ3MgPSB7SGFuZGxlci5jbGFzcywgaW50LmNsYXNzLCBMZXZlbC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtb3J5SGFuZGxlckhhbmRsZXJpbnRMZXZlbCgpIHsKICAgICAgICAgaGFuZGxlciA9IG5ldyBNZW1vcnlIYW5kbGVyKHRhcmdldCwgMiwgTGV2ZWwuRklORVNUKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmlsdGVyIHNob3VsZCBub3QgYmUgbnVsbCIsIGhhbmRsZXIuZ2V0RmlsdGVyKCkpOwpAQCAtMzE0LDYgKzQzMywxNCBAQAogCiAgICAgfQogCisgICAgQFRlc3RJbmZvCisgICAgKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCAKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwgCisgICAgICAgICAgICB0YXJnZXRzID0gCisgICAgICAgICAgICB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFB1c2hMZXZlbCIsIG1ldGhvZEFyZ3MgPSB7fSkKKyAgICAgICAgICAgIH0KKyAgICAgKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQdXNoTGV2ZWwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBoYW5kbGVyLnNldFB1c2hMZXZlbChudWxsKTsKQEAgLTMyNCw2ICs0NTEsMTQgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGhhbmRsZXIuZ2V0UHVzaExldmVsKCksIExldmVsLnBhcnNlKCIxMjMiKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvCisgICAgKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCAKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwgCisgICAgICAgICAgICB0YXJnZXRzID0gCisgICAgICAgICAgICB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFB1c2hMZXZlbCIsIG1ldGhvZEFyZ3MgPSB7TGV2ZWwuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFB1c2hMZXZlbCgpIHsKICAgICAgICAgLy8gY2hhbmdlIHB1c2ggbGV2ZWwgZG9uJ3QgdHJpZ2dlciBwdXNoIGFjdGlvbgogICAgICAgICB3cml0ZXIuZ2V0QnVmZmVyKCkuc2V0TGVuZ3RoKDApOwpAQCAtMzMxLDcgKzQ2Niw2IEBACiAgICAgICAgIGFzc2VydFRydWUoaGFuZGxlci5pc0xvZ2dhYmxlKGxyKSk7CiAgICAgICAgIGhhbmRsZXIucHVibGlzaChscik7CiAgICAgICAgIGFzc2VydEVxdWFscyh3cml0ZXIudG9TdHJpbmcoKSwgIiIpOwotICAgICAgICAvLyBhc3NlcnRFcXVhbHMod3JpdGVyLnRvU3RyaW5nKCksICJmbHVzaCIpOwogICAgICAgICB3cml0ZXIuZ2V0QnVmZmVyKCkuc2V0TGVuZ3RoKDApOwogICAgICAgICBoYW5kbGVyLnNldFB1c2hMZXZlbChMZXZlbC5GSU5FKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHdyaXRlci50b1N0cmluZygpLCAiIik7CkBAIC0zMzksNiArNDczLDE0IEBACiAgICAgICAgIGFzc2VydEVxdWFscyh3cml0ZXIudG9TdHJpbmcoKSwgbHIuZ2V0TWVzc2FnZSgpICsgbHIuZ2V0TWVzc2FnZSgpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicHVzaCIsIG1ldGhvZEFyZ3MgPSB7fSkKKyAgICAgICAgICAgIH0KKyAgICAgKQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXNoUHVibGljKCkgewogICAgICAgICB3cml0ZXIuZ2V0QnVmZmVyKCkuc2V0TGVuZ3RoKDApOwogICAgICAgICAvLyBsb2dnYWJsZSBidXQgZG9uJ3QgdHJpZyBwdXNoCmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTWVzc2FnZXNUZXN0LmphdmEgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvTWVzc2FnZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2YzBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9NZXNzYWdlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyogCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy50ZXN0cy5qYXZhLnV0aWwubG9nZ2luZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLmludGVybmFsLm5scy5NZXNzYWdlczsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRXJyb3JNYW5hZ2VyOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCisKKworQFRlc3RUYXJnZXRDbGFzcyhNZXNzYWdlcy5jbGFzcykgCitwdWJsaWMgY2xhc3MgTWVzc2FnZXNUZXN0IGV4dGVuZHMgVGVzdENhc2V7CisKKworICAgICAgICBwcml2YXRlIE1lc3NhZ2VzIG0gPSBudWxsOworICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgICAgIG0gPSBuZXcgTWVzc2FnZXMoKTsKKyAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJKdXN0IGNoZWNrIHNpZ25hdHVyZSwgY2Fubm90IG1ha2UgdXNlIG9mIG1vY2ssICIgKworICAgICAgICAgICAgICAgICJtZXRob2QgZGVwZW5kIG9uIGx1bmkiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdHJpbmciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdHJpbmdfU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIG0uZ2V0U3RyaW5nKG5ldyBTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgICBwdXJwb3NlID0gIkp1c3RlIGNoZWNrIHNpZ25hdHVyZSwgY2Fubm90IG1ha2UgdXNlIG9mIG1vY2ssIGRlcGVuZCBvbiBsdW5pIiwKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdHJpbmdfU3RyaW5nT2JqZWN0KCkgeworICAgICAgICAgICAgICAgIG0uZ2V0U3RyaW5nKG5ldyBTdHJpbmcoKSxuZXcgT2JqZWN0KCkpOworIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgICBwdXJwb3NlID0gIkp1c3RlIGNoZWNrIHNpZ25hdHVyZSwgY2Fubm90IG1ha2UgdXNlIG9mIG1vY2ssIGRlcGVuZCBvbiBsdW5pIiwKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdHJpbmdfU3RyaW5nSW50KCkgeworICAgICAgICAgICAgICAgIG0uZ2V0U3RyaW5nKG5ldyBTdHJpbmcoKSwwKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgICAgcHVycG9zZSA9ICJKdXN0ZSBjaGVjayBzaWduYXR1cmUsIGNhbm5vdCBtYWtlIHVzZSBvZiBtb2NrLCBkZXBlbmQgb24gbHVuaSIsCisgICAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEdldFN0cmluZ19TdHJpbmdDaGFyKCkgeworICAgICAgICAgICAgICAgIG0uZ2V0U3RyaW5nKG5ldyBTdHJpbmcoKSwgJ2EnKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgICAgcHVycG9zZSA9ICJKdXN0ZSBjaGVjayBzaWduYXR1cmUsIGNhbm5vdCBtYWtlIHVzZSBvZiBtb2NrLCBkZXBlbmQgb24gbHVuaSIsCisgICAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdHJpbmdfU3RyaW5nT2JqZWN0T2JqZWN0KCkgeworICAgICAgICAgICAgICAgIG0uZ2V0U3RyaW5nKG5ldyBTdHJpbmcoKSwgbmV3IE9iamVjdCgpLCBuZXcgT2JqZWN0KCkgKTsKKyAgICAgICAgfQorICAgICAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgICBwdXJwb3NlID0gIkp1c3RlIGNoZWNrIHNpZ25hdHVyZSwgY2Fubm90IG1ha2UgdXNlIG9mIG1vY2ssIGRlcGVuZCBvbiBsdW5pIiwKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBPYmplY3RbXS5jbGFzc30KKyAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEdldFN0cmluZ19TdHJpbmdPYmplY3RBcnJheSgpIHsKKyAgICAgICAgICAgICAgICBtLmdldFN0cmluZyhuZXcgU3RyaW5nKCksIG5ldyBPYmplY3RbMV0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9TaW1wbGVGb3JtYXR0ZXJUZXN0LmphdmEgYi9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvU2ltcGxlRm9ybWF0dGVyVGVzdC5qYXZhCmluZGV4IDY1MTExYWYuLmJjOTk5MGMgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9TaW1wbGVGb3JtYXR0ZXJUZXN0LmphdmEKKysrIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL1NpbXBsZUZvcm1hdHRlclRlc3QuamF2YQpAQCAtMTcsMTAgKzE3LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLk1lbW9yeUhhbmRsZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMjgsNiArMzUsNyBAQAogLyoqCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhTaW1wbGVGb3JtYXR0ZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2ltcGxlRm9ybWF0dGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIFNpbXBsZUZvcm1hdHRlciBzZjsKQEAgLTQ4LDEzICs1NiwzMCBAQAogICAgIC8qCiAgICAgICogdGVzdCBmb3IgY29uc3RydWN0b3IgcHJvdGVjdGVkIFNpbXBsZUZvcm1hdHRlcgogICAgICAqLworICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IAorICAgICAgICAgICAgeworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJTaW1wbGVGb3JtYXR0ZXIiLCBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRIZWFkIiwgbWV0aG9kQXJncyA9IHtIYW5kbGVyLmNsYXNzfSksCisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFRhaWwiLCBtZXRob2RBcmdzID0ge0hhbmRsZXIuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUZvcm1hdHRlcigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWFkIGZvciB0aGlzIFNpbXBsZUZvcm1hdHRlciBzaG91bGQgYmUgZW1wdHkiLCAiIiwgc2YKICAgICAgICAgICAgICAgICAuZ2V0SGVhZChudWxsKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiVGFpbCBmb3IgdGhpcyBTaW1wbGVGb3JtYXR0ZXIgc2hvdWxkIGJlIGVtcHR5IiwgIiIsIHNmCiAgICAgICAgICAgICAgICAgLmdldFRhaWwobnVsbCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IAorICAgICAgICAgICAgeworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmb3JtYXQiLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVsbCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHNmLmZvcm1hdChudWxsKTsKQEAgLTY0LDYgKzg5LDE0IEBACiAgICAgICAgIHNmLmZvcm1hdChuZXcgTG9nUmVjb3JkKExldmVsLlNFVkVSRSwgbnVsbCkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IAorICAgICAgICAgICAgeworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmb3JtYXQiLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxpemVkRm9ybWF0KCkgewogICAgICAgICAvLyBpZiBidW5kbGUgc2V0LCBzaG91bGQgdXNlIGxvY2FsaXplZCBtZXNzYWdlCiAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUKQEAgLTgzLDYgKzExNiwxNCBAQAogICAgICAgICBhc3NlcnRUcnVlKHN0ci5pbmRleE9mKGxvY2FsZU1zZykgPCAwKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdEZvcm1hdCgpIHsKICAgICAgICAgU3RyaW5nIHN0ciA9IHNmLmZvcm1hdChscik7CiAgICAgICAgIFRocm93YWJsZSB0OwpAQCAtMTE0LDEwICsxNTUsMjYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShzdHIuaW5kZXhPZihMZXZlbC5GSU5FLmdldExvY2FsaXplZE5hbWUoKSkgPiAwKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0SGVhZCIsIG1ldGhvZEFyZ3MgPSB7SGFuZGxlci5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGVhZCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzZi5nZXRIZWFkKG51bGwpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0VGFpbCIsIG1ldGhvZEFyZ3MgPSB7SGFuZGxlci5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGFpbCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzZi5nZXRUYWlsKG51bGwpKTsKICAgICB9CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvU29ja2V0SGFuZGxlclRlc3QuamF2YSBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Tb2NrZXRIYW5kbGVyVGVzdC5qYXZhCmluZGV4IDc1OTE1ZTcuLjZkNWYyODAgMTAwNjQ0Ci0tLSBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Tb2NrZXRIYW5kbGVyVGVzdC5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9Tb2NrZXRIYW5kbGVyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sb2dnaW5nLnRlc3RzLmphdmEudXRpbC5sb2dnaW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwpAQCAtMzMsNiArMzgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dpbmdQZXJtaXNzaW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLlhNTEZvcm1hdHRlcjsKIApAQCAtNDYsNiArNTIsNyBAQAogLyoqCiAgKiBUZXN0IGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoU29ja2V0SGFuZGxlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBTb2NrZXRIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ01hbmFnZXIgTE9HX01BTkFHRVIgPSBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKTsKQEAgLTc1LDIxICs4Miw3IEBACiAgICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW5pdFByb3BzKCk7Ci0gICAgICAgIExPR19NQU5BR0VSLnJlc2V0KCk7Ci0gICAgICAgIExPR19NQU5BR0VSLnJlYWRDb25maWd1cmF0aW9uKEVudmlyb25tZW50SGVscGVyCi0gICAgICAgICAgICAgICAgLlByb3BlcnRpZXNUb0lucHV0U3RyZWFtKHByb3BzKSk7Ci0gICAgICAgIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLmNsZWFyKCk7Ci0gICAgICAgIGlmIChudWxsICE9IGgpIHsKLSAgICAgICAgICAgIGguY2xvc2UoKTsKLSAgICAgICAgICAgIGggPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5zZXRFcnIoZXJyKTsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0gICAgCi0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByb3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vaW5pdFByb3BzCiAgICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcHMucHV0KCJoYW5kbGVycyIsIGNsYXNzTmFtZSArICIkTW9ja0hhbmRsZXIgIiArIGNsYXNzTmFtZQogICAgICAgICAgICAgICAgICsgIiRNb2NrSGFuZGxlciIpOwpAQCAtMTA1LDExICs5OCwzOCBAQAogICAgICAgICBwcm9wcy5wdXQoImZvby5oYW5kbGVycyIsICJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciIpOwogICAgICAgICBwcm9wcy5wdXQoImZvby5sZXZlbCIsICJXQVJOSU5HIik7CiAgICAgICAgIHByb3BzLnB1dCgiY29tLnh5ei5mb28ubGV2ZWwiLCAiU0VWRVJFIik7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTE9HX01BTkFHRVIucmVzZXQoKTsKKyAgICAgICAgTE9HX01BTkFHRVIucmVhZENvbmZpZ3VyYXRpb24oRW52aXJvbm1lbnRIZWxwZXIKKyAgICAgICAgICAgICAgICAuUHJvcGVydGllc1RvSW5wdXRTdHJlYW0ocHJvcHMpKTsKKyAgICAgICAgQ2FsbFZlcmlmaWNhdGlvblN0YWNrLmdldEluc3RhbmNlKCkuY2xlYXIoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gaCkgeworICAgICAgICAgICAgaC5jbG9zZSgpOworICAgICAgICAgICAgaCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLnNldEVycihlcnIpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KKyAgICAKIAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBubyByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGNvbnN0cnVjdG9yIHdpdGggbm8gcmVsZXZhbnQgbG9nIG1hbmFnZXIgIiArCisgICAgICAgICAgICAicHJvcGVydGllcyBhcmUgc2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfTm9Qcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE51bGwoTE9HX01BTkFHRVIuZ2V0UHJvcGVydHkoCiAgICAgICAgICAgICAgICAgImphdmEudXRpbC5sb2dnaW5nLlNvY2tldEhhbmRsZXIubGV2ZWwiKSk7CkBAIC0xODUsNiArMjA1LDIwIEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBubyByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQKICAgICAgKiBleGNlcHQgaG9zdCBhbmQgcG9ydC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBubyByZWxldmFudCBsb2cgbWFuYWdlciAiICsKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIGFyZSBzZXQgZXhjZXB0IGhvc3QgYW5kIHBvcnQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9Ob0Jhc2ljUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnROdWxsKExPR19NQU5BR0VSLmdldFByb3BlcnR5KAogICAgICAgICAgICAgICAgICJqYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmxldmVsIikpOwpAQCAtMjI0LDYgKzI1OCwxOSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlIGZvciBjb25uZWN0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBudWxsOwogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMjYwLDYgKzMwNywyMCBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCB2YWxpZCByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGNvbnN0cnVjdG9yIHdpdGggdmFsaWQgcmVsZXZhbnQgbG9nIG1hbmFnZXIgIiArCisgICAgICAgICAgICAicHJvcGVydGllcyBhcmUgc2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldEhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfVmFsaWRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmxldmVsIiwgIkZJTkUiKTsKQEAgLTMwNiw2ICszNjcsMjAgQEAKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aXRoIGludmFsaWQgcmVsZXZhbnQgbG9nIG1hbmFnZXIgcHJvcGVydGllcyBhcmUgc2V0CiAgICAgICogZXhjZXB0IGhvc3QgYW5kIHBvcnQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGNvbnN0cnVjdG9yIHdpdGggaW52YWxpZCByZWxldmFudCBsb2cgbWFuYWdlciAiICsKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIGFyZSBzZXQgZXhjZXB0IGhvc3QgYW5kIHBvcnQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9JbnZhbGlkQmFzaWNQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmxldmVsIiwgSU5WQUxJRF9MRVZFTCk7CkBAIC0zNTQsNiArNDI5LDE1IEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCB2YWxpZCByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQKICAgICAgKiBleGNlcHQgcG9ydC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9JbnZhbGlkUG9ydCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuU29ja2V0SGFuZGxlci5sZXZlbCIsICJGSU5FIik7CkBAIC0zNzksNiArNDYzLDIwIEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCB2YWxpZCByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQsCiAgICAgICogYnV0IHRoZSBwb3J0IGlzIG5vdCBvcGVuLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgdGhlIGNvbnN0cnVjdG9yIHdpdGggdmFsaWQgcmVsZXZhbnQgbG9nIG1hbmFnZXIgIiArCisgICAgICAgICAgICAicHJvcGVydGllcyBhcmUgc2V0LCBidXQgdGhlIHBvcnQgaXMgbm90IG9wZW4uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9Ob3RPcGVuUG9ydCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuU29ja2V0SGFuZGxlci5sZXZlbCIsICJGSU5FIik7CkBAIC00MTEsNiArNTA5LDE5IEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCB2YWxpZCByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQKICAgICAgKiBleGNlcHQgcG9ydC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTb2NrZXRIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTb2NrZXRIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX0ludmFsaWRIb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmxldmVsIiwgIkZJTkUiKTsKQEAgLTQ0Myw2ICs1NTQsMTYgQEAKICAgICAgKiBUZXN0IGNsb3NlKCkgd2hlbiBoYXZpbmcgc3VmZmljaWVudCBwcml2aWxlZ2UsIGFuZCBhIHJlY29yZCBoYXMgYmVlbgogICAgICAqIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2xvc2UoKSB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgIiArCisgICAgICAgICAgICAiYW5kIGEgcmVjb3JkIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VfU3VmZmljaWVudFByaXZpbGVnZV9Ob3JtYWxDbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuU29ja2V0SGFuZGxlci5mb3JtYXR0ZXIiLCBjbGFzc05hbWUKQEAgLTQ3MSw2ICs1OTIsMTUgQEAKICAgICAgKiBUZXN0IGNsb3NlKCkgd2hlbiBoYXZpbmcgc3VmZmljaWVudCBwcml2aWxlZ2UsIGFuZCBubyByZWNvcmQgaGFzIGJlZW4KICAgICAgKiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqLworICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLCAKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2xvc2UoKSB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgIiArCisgICAgICAgICAgICAgICAgICAgICJhbmQgbm8gcmVjb3JkIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uIiwgCisgICAgICAgICAgICB0YXJnZXRzID0gCisgICAgICAgICAgICB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgbWV0aG9kQXJncyA9IHt9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlX1N1ZmZpY2llbnRQcml2aWxlZ2VfRGlyZWN0Q2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLlNvY2tldEhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC00OTYsNiArNjI2LDE0IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGNsb3NlKCkgd2hlbiBoYXZpbmcgaW5zdWZmaWNpZW50IHByaXZpbGVnZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywgCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNsb3NlKCkgd2hlbiBoYXZpbmcgaW5zdWZmaWNpZW50IHByaXZpbGVnZS4iLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY2xvc2UiLCBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmZvcm1hdHRlciIsIGNsYXNzTmFtZQpAQCAtNTMwLDYgKzY2OCwxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCBwdWJsaXNoKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCBub3JtYWwgbG9nIHJlY29yZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwdWJsaXNoKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCAiICsKKyAgICAgICAgICAgICJub3JtYWwgbG9nIHJlY29yZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfTm9GaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLlNvY2tldEhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC01NjksNiArNzE3LDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHB1Ymxpc2goKSwgdXNlIGEgZmlsdGVyLCBoYXZpbmcgb3V0cHV0IHN0cmVhbSwgbm9ybWFsIGxvZyByZWNvcmQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCB1c2UgYSBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCAiICsKKyAgICAgICAgICAgICJub3JtYWwgbG9nIHJlY29yZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfV2l0aEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuU29ja2V0SGFuZGxlci5mb3JtYXR0ZXIiLCBjbGFzc05hbWUKQEAgLTU5OSw2ICs3NTcsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgcHVibGlzaCgpLCBudWxsIGxvZyByZWNvcmQsIGhhdmluZyBvdXRwdXQgc3RyZWFtCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCBudWxsIGxvZyByZWNvcmQsIGhhdmluZyBvdXRwdXQgc3RyZWFtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1Ymxpc2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGlzaF9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5Tb2NrZXRIYW5kbGVyLmZvcm1hdHRlciIsIGNsYXNzTmFtZQpAQCAtNjI2LDYgKzc5MywxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCBwdWJsaXNoKCksIGEgbG9nIHJlY29yZCB3aXRoIGVtcHR5IG1zZywgaGF2aW5nIG91dHB1dCBzdHJlYW0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyAgcHVibGlzaCgpIG1ldGhvZCwgYSBsb2cgcmVjb3JkIHdpdGggZW1wdHkgbXNnLCAiICsKKyAgICAgICAgICAgICJoYXZpbmcgb3V0cHV0IHN0cmVhbS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfRW1wdHlNc2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLlNvY2tldEhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC02NTEsNiArODI4LDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHB1Ymxpc2goKSwgYSBsb2cgcmVjb3JkIHdpdGggbnVsbCBtc2csIGhhdmluZyBvdXRwdXQgc3RyZWFtCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCBhIGxvZyByZWNvcmQgd2l0aCBudWxsIG1zZywgIiArCisgICAgICAgICAgICAiaGF2aW5nIG91dHB1dCBzdHJlYW0uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaXNoX051bGxNc2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLlNvY2tldEhhbmRsZXIuZm9ybWF0dGVyIiwgY2xhc3NOYW1lCkBAIC02NzYsNiArODYzLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHB1Ymxpc2goKSwgYWZ0ZXIgY2xvc2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpIG1ldGhvZCBhZnRlciBjbG9zZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfQWZ0ZXJDbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBwLnB1dCgiamF2YS51dGlsLmxvZ2dpbmcuU29ja2V0SGFuZGxlci5mb3JtYXR0ZXIiLCBjbGFzc05hbWUKZGlmZiAtLWdpdCBhL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9TdHJlYW1IYW5kbGVyVGVzdC5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL1N0cmVhbUhhbmRsZXJUZXN0LmphdmEKaW5kZXggYmE5ZDc3NS4uNjE0OWYwNiAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL1N0cmVhbUhhbmRsZXJUZXN0LmphdmEKKysrIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL1N0cmVhbUhhbmRsZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy50ZXN0cy5qYXZhLnV0aWwubG9nZ2luZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLio7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtMzcsNiArMzksNyBAQAogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnaW5nUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuU29ja2V0SGFuZGxlcjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5TdHJlYW1IYW5kbGVyOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtNDgsNiArNTEsNyBAQAogLyoqCiAgKiBUZXN0IHRoZSBjbGFzcyBTdHJlYW1IYW5kbGVyLgogICovCitAVGVzdFRhcmdldENsYXNzKFN0cmVhbUhhbmRsZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU3RyZWFtSGFuZGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9MRVZFTCA9ICJpbXBvc3NpYmxlX2xldmVsIjsKQEAgLTg5LDYgKzkzLDE2IEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXIsIGFuZCBubyByZWxldmFudCBsb2cgbWFuYWdlcgogICAgICAqIHByb3BlcnRpZXMgYXJlIHNldC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXIsICIgKworICAgICAgICAgICAgImFuZCBubyByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyZWFtSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9Ob1BhcmFtZXRlcl9Ob1Byb3BlcnRpZXMoKSB7CiAgICAgICAgIGFzc2VydE51bGwoTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0UHJvcGVydHkoCiAgICAgICAgICAgICAgICAgImphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXIubGV2ZWwiKSk7CkBAIC0xMDksNiArMTIzLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aXRoIGluc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGNvbnN0cnVjdG9yIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1IYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9Ob1BhcmFtZXRlcl9JbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CiAgICAgICAgIGFzc2VydE51bGwoTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0UHJvcGVydHkoCiAgICAgICAgICAgICAgICAgImphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXIubGV2ZWwiKSk7CkBAIC0xMzcsNiArMTYwLDE2IEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXIsIGFuZCB2YWxpZCByZWxldmFudCBsb2cgbWFuYWdlcgogICAgICAqIHByb3BlcnRpZXMgYXJlIHNldC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXIsIGFuZCB2YWxpZCAiICsKKyAgICAgICAgICAgICJyZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyZWFtSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9Ob1BhcmFtZXRlcl9WYWxpZFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcC5wdXQoImphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXIubGV2ZWwiLCAiRklORSIpOwpAQCAtMTYzLDYgKzE5NiwxNiBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVyLCBhbmQgaW52YWxpZCByZWxldmFudCBsb2cgbWFuYWdlcgogICAgICAqIHByb3BlcnRpZXMgYXJlIHNldC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXIsIGFuZCBpbnZhbGlkICIgKworICAgICAgICAgICAgInJlbGV2YW50IGxvZyBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1IYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX05vUGFyYW1ldGVyX0ludmFsaWRQcm9wZXJ0aWVzKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMTkxLDYgKzIzNCwxNyBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggbm9ybWFsIHBhcmFtZXRlciB2YWx1ZXMsIGFuZCBubyByZWxldmFudCBsb2cKICAgICAgKiBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBub3JtYWwgcGFyYW1ldGVyIHZhbHVlcywgIiArCisgICAgICAgICAgICAiYW5kIG5vIHJlbGV2YW50IGxvZyBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1IYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5sb2dnaW5nLkZvcm1hdHRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX0hhc1BhcmFtZXRlcnNfTm9Qcm9wZXJ0aWVzKCkgewogICAgICAgICBhc3NlcnROdWxsKExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldFByb3BlcnR5KAogICAgICAgICAgICAgICAgICJqYXZhLnV0aWwubG9nZ2luZy5TdHJlYW1IYW5kbGVyLmxldmVsIikpOwpAQCAtMjEyLDYgKzI2NiwxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGluc3VmZmljaWVudCBwcml2aWxlZ2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyZWFtSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9IYXNQYXJhbWV0ZXJfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgewogICAgICAgICBhc3NlcnROdWxsKExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldFByb3BlcnR5KAogICAgICAgICAgICAgICAgICJqYXZhLnV0aWwubG9nZ2luZy5TdHJlYW1IYW5kbGVyLmxldmVsIikpOwpAQCAtMjQxLDYgKzMwNSwxNiBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggbm9ybWFsIHBhcmFtZXRlciB2YWx1ZXMsIGFuZCB2YWxpZCByZWxldmFudCBsb2cKICAgICAgKiBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBub3JtYWwgcGFyYW1ldGVyIHZhbHVlcywgIiArCisgICAgICAgICAgICAiYW5kIHZhbGlkIHJlbGV2YW50IGxvZyBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1IYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9IYXNQYXJhbWV0ZXJzX1ZhbGlkUHJvcGVydGllcygpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKQEAgLTI2OSw2ICszNDMsMTYgQEAKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aXRoIG5vcm1hbCBwYXJhbWV0ZXIsIGFuZCBpbnZhbGlkIHJlbGV2YW50IGxvZwogICAgICAqIG1hbmFnZXIgcHJvcGVydGllcyBhcmUgc2V0LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBjb25zdHJ1Y3RvciB3aXRoIG5vcm1hbCBwYXJhbWV0ZXIsICIgKworICAgICAgICAgICAgImFuZCBpbnZhbGlkIHJlbGV2YW50IGxvZyBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1IYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9IYXNQYXJhbWV0ZXJzX0ludmFsaWRQcm9wZXJ0aWVzKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMjk1LDYgKzM3OSwxNiBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggbnVsbCBmb3JtYXR0ZXIsIGFuZCBpbnZhbGlkIHJlbGV2YW50IGxvZyBtYW5hZ2VyCiAgICAgICogcHJvcGVydGllcyBhcmUgc2V0LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBjb25zdHJ1Y3RvciB3aXRoIG51bGwgZm9ybWF0dGVyLCAiICsKKyAgICAgICAgICAgICJhbmQgaW52YWxpZCByZWxldmFudCBsb2cgbWFuYWdlciBwcm9wZXJ0aWVzIGFyZSBzZXQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyZWFtSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcywgamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfSGFzUGFyYW1ldGVyc19WYWxpZFByb3BlcnRpZXNOdWxsU3RyZWFtKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMzIzLDYgKzQxNywxNiBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggbnVsbCBvdXRwdXQgc3RyZWFtLCBhbmQgaW52YWxpZCByZWxldmFudCBsb2cKICAgICAgKiBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgY29uc3RydWN0b3Igd2l0aCBudWxsIG91dHB1dCBzdHJlYW0sICIgKworICAgICAgICAgICAgImFuZCBpbnZhbGlkIHJlbGV2YW50IGxvZyBtYW5hZ2VyIHByb3BlcnRpZXMgYXJlIHNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1IYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9IYXNQYXJhbWV0ZXJzX1ZhbGlkUHJvcGVydGllc051bGxGb3JtYXR0ZXIoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0zNTEsNiArNDU1LDE2IEBACiAgICAgICogVGVzdCBjbG9zZSgpIHdoZW4gaGF2aW5nIHN1ZmZpY2llbnQgcHJpdmlsZWdlLCBhbmQgYSByZWNvcmQgaGFzIGJlZW4KICAgICAgKiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNsb3NlKCkgd2hlbiBoYXZpbmcgc3VmZmljaWVudCBwcml2aWxlZ2UsICIgKworICAgICAgICAgICAgImFuZCBhIHJlY29yZCBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlX1N1ZmZpY2llbnRQcml2aWxlZ2VfTm9ybWFsQ2xvc2UoKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhb3MgPSBuZXcgTW9ja091dHB1dFN0cmVhbSgpOwogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihhb3MsIG5ldyBNb2NrRm9ybWF0dGVyKCkpOwpAQCAtMzcxLDYgKzQ4NSwxNSBAQAogICAgICAqIFRlc3QgY2xvc2UoKSB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgYW5kIGFuIG91dHB1dCBzdHJlYW0gdGhhdAogICAgICAqIGFsd2F5cyB0aHJvd3MgZXhjZXB0aW9ucy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywgCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNsb3NlKCkgd2hlbiBoYXZpbmcgc3VmZmljaWVudCBwcml2aWxlZ2UsICIgKworICAgICAgICAgICAgICAgICAgICAiYW5kIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBhbHdheXMgdGhyb3dzIGV4Y2VwdGlvbnMuIiwgCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VfU3VmZmljaWVudFByaXZpbGVnZV9FeGNlcHRpb24oKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhb3MgPSBuZXcgTW9ja0V4Y2VwdGlvbk91dHB1dFN0cmVhbSgpOwogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihhb3MsIG5ldyBNb2NrRm9ybWF0dGVyKCkpOwpAQCAtMzg0LDYgKzUwNywxNSBAQAogICAgICAqIFRlc3QgY2xvc2UoKSB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgYW5kIG5vIHJlY29yZCBoYXMgYmVlbgogICAgICAqIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICovCisgICAgQFRlc3RJbmZvCisgICAgKGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssIAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjbG9zZSgpIG1ldGhvZCB3aGVuIGhhdmluZyBzdWZmaWNpZW50IHByaXZpbGVnZSwgIiArCisgICAgICAgICAgICAgICAgICAgICJhbmQgbm8gcmVjb3JkIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uIiwgCisgICAgICAgICAgICB0YXJnZXRzID0gCisgICAgICAgICAgICB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgbWV0aG9kQXJncyA9IHt9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlX1N1ZmZpY2llbnRQcml2aWxlZ2VfRGlyZWN0Q2xvc2UoKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhb3MgPSBuZXcgTW9ja091dHB1dFN0cmVhbSgpOwogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihhb3MsIG5ldyBNb2NrRm9ybWF0dGVyKCkpOwpAQCAtMzk0LDE5ICs1MjYsMjcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbHVzaCIsIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpCiAgICAgICAgICAgICAgICAgLmdldEN1cnJlbnRTb3VyY2VNZXRob2QoKSk7CiAgICAgICAgIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLmNsZWFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTW9ja0Zvcm1hdHRlcl9IZWFkTW9ja0Zvcm1hdHRlcl9UYWlsIiwgYW9zLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICApOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1vY2tGb3JtYXR0ZXJfSGVhZE1vY2tGb3JtYXR0ZXJfVGFpbCIsIGFvcy50b1N0cmluZygpKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFRlc3QgY2xvc2UoKSB3aGVuIGhhdmluZyBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZV9JbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB7CisgICAgQFRlc3RJbmZvCisgICAgKGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssIAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY2xvc2UiLCBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgICkKKyAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlX0luc3VmZmljaWVudFByaXZpbGVnZSgpIHsgICAgICAgICAgCisgICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICBuZXcgTW9ja0Zvcm1hdHRlcigpKTsKKwogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkTWFuID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyKCkpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICBuZXcgTW9ja0Zvcm1hdHRlcigpKTsKICAgICAgICAgICAgIGguY2xvc2UoKTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiEiKTsKICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewpAQCAtNDE5LDYgKzU1OSwxNCBAQAogICAgIC8qCiAgICAgICogVGVzdCBjbG9zZSgpIHdoZW4gaGF2aW5nIG5vIG91dHB1dCBzdHJlYW0uCiAgICAgICovCisgICAgQFRlc3RJbmZvCisgICAgKGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssIAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjbG9zZSgpIG1ldGhvZCB3aGVuIGhhdmluZyBubyBvdXRwdXQgc3RyZWFtLiIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IAorICAgICAgICAgICAgeworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjbG9zZSIsIG1ldGhvZEFyZ3MgPSB7fSkKKyAgICAgICAgICAgIH0KKyAgICAgKQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZV9Ob091dHB1dFN0cmVhbSgpIHsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIoKTsKICAgICAgICAgaC5jbG9zZSgpOwpAQCAtNDI3LDEyICs1NzUsMjAgQEAKICAgICAvKgogICAgICAqIFRlc3QgZmx1c2goKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmbHVzaCgpIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaF9Ob3JtYWwoKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhb3MgPSBuZXcgTW9ja091dHB1dFN0cmVhbSgpOwogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihhb3MsIG5ldyBNb2NrRm9ybWF0dGVyKCkpOwogICAgICAgICBoLmZsdXNoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmx1c2giLCBDYWxsVmVyaWZpY2F0aW9uU3RhY2suZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50U291cmNlTWV0aG9kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsdXNoIiwgQ2FsbFZlcmlmaWNhdGlvblN0YWNrLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFNvdXJjZU1ldGhvZCgpKTsKICAgICAgICAgYXNzZXJ0TnVsbChDYWxsVmVyaWZpY2F0aW9uU3RhY2suZ2V0SW5zdGFuY2UoKS5wb3AoKSk7CiAgICAgICAgIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLmNsZWFyKCk7CiAgICAgfQpAQCAtNDQwLDE0ICs1OTYsMzIgQEAKICAgICAvKgogICAgICAqIFRlc3QgZmx1c2goKSB3aGVuIGhhdmluZyBubyBvdXRwdXQgc3RyZWFtLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZsdXNoKCkgd2hlbiBoYXZpbmcgbm8gb3V0cHV0IHN0cmVhbS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaF9Ob091dHB1dFN0cmVhbSgpIHsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIoKTsKICAgICAgICAgaC5mbHVzaCgpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogVGVzdCBpc0xvZ2dhYmxlKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtCisgICAgICogVGVzdCBpc0xvZ2dhYmxlKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBubyBvdXRwdXQgc3RyZWFtCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNMb2dnYWJsZSgpLCB1c2Ugbm8gZmlsdGVyLCBoYXZpbmcgbm8gb3V0cHV0IHN0cmVhbS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xvZ2dhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzTG9nZ2FibGVfTm9PdXRwdXRTdHJlYW0oKSB7CiAgICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKCk7CiAgICAgICAgIExvZ1JlY29yZCByID0gbmV3IExvZ1JlY29yZChMZXZlbC5JTkZPLCBudWxsKTsKQEAgLTQ2Nyw2ICs2NDEsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgaXNMb2dnYWJsZSgpLCB1c2Ugbm8gZmlsdGVyLCBoYXZpbmcgb3V0cHV0IHN0cmVhbQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGlzTG9nZ2FibGUoKSwgdXNlIG5vIGZpbHRlciwgaGF2aW5nIG91dHB1dCBzdHJlYW0uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb2dnYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0xvZ2dhYmxlX05vRmlsdGVyKCkgewogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksCiAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUZvcm1hdHRlcigpKTsKQEAgLTQ4Nyw2ICs2NzAsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgaXNMb2dnYWJsZSgpLCB1c2UgYSBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNMb2dnYWJsZSgpLCB1c2UgYSBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTG9nZ2FibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNMb2dnYWJsZV9XaXRoRmlsdGVyKCkgewogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksCiAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUZvcm1hdHRlcigpKTsKQEAgLTUwMCw3ICs2OTIsNyBAQAogICAgICAgICBhc3NlcnRTYW1lKHIsIENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLnBvcCgpKTsKIAogICAgICAgICBoLnNldExldmVsKExldmVsLldBUk5JTkcpOwotICAgICAgICBhc3NlcnRGYWxzZShoLmlzTG9nZ2FibGUocikpOworICAgICAgICBhc3NlcnRGYWxzZShoLmlzTG9nZ2FibGUocikpOyAvL2xldmVsIHRvIGhpZ2gsIGRhdGEgd2lsbCBub3QgcmVhY2ggdGhlIGZpbHRlcgogICAgICAgICBhc3NlcnRUcnVlKENhbGxWZXJpZmljYXRpb25TdGFjay5nZXRJbnN0YW5jZSgpLmVtcHR5KCkpOwogICAgIH0KIApAQCAtNTA4LDYgKzcwMCwxNiBAQAogICAgICAqIFRlc3QgaXNMb2dnYWJsZSgpLCBudWxsIGxvZyByZWNvcmQsIGhhdmluZyBvdXRwdXQgc3RyZWFtLiBIYW5kbGVyIHNob3VsZAogICAgICAqIGNhbGwgRXJyb3JNYW5hZ2VyIHRvIGhhbmRsZSBleGNlcHRpb25hbCBjYXNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNMb2dnYWJsZSgpLCBudWxsIGxvZyByZWNvcmQsIGhhdmluZyBvdXRwdXQgc3RyZWFtLiAiICsKKyAgICAgICAgICAgICJIYW5kbGVyIHNob3VsZCBjYWxsIEVycm9yTWFuYWdlciB0byBoYW5kbGUgZXhjZXB0aW9uYWwgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xvZ2dhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzTG9nZ2FibGVfTnVsbCgpIHsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLAogICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVGb3JtYXR0ZXIoKSk7CkBAIC01MTcsNiArNzE5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGlzTG9nZ2FibGUoKSwgbnVsbCBsb2cgcmVjb3JkLCB3aXRob3V0IG91dHB1dCBzdHJlYW0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc0xvZ2dhYmxlKCksIG51bGwgbG9nIHJlY29yZCwgd2l0aG91dCBvdXRwdXQgc3RyZWFtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTG9nZ2FibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNMb2dnYWJsZV9OdWxsX05vT3V0cHV0U3RyZWFtKCkgewogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcigpOwogICAgICAgICBhc3NlcnRGYWxzZShoLmlzTG9nZ2FibGUobnVsbCkpOwpAQCAtNTI1LDggKzczNiwxOCBAQAogICAgIC8qCiAgICAgICogVGVzdCBwdWJsaXNoKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCBub3JtYWwgbG9nIHJlY29yZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwdWJsaXNoKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCAiICsKKyAgICAgICAgICAgICJub3JtYWwgbG9nIHJlY29yZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfTm9PdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKCk7CisgICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKCk7IAogICAgICAgICBMb2dSZWNvcmQgciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuSU5GTywgInRlc3RQdWJsaXNoX05vT3V0cHV0U3RyZWFtIik7CiAgICAgICAgIGgucHVibGlzaChyKTsKIApAQCAtNTQ0LDYgKzc2NSwxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCBwdWJsaXNoKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCBub3JtYWwgbG9nIHJlY29yZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwdWJsaXNoKCksIHVzZSBubyBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCAiICsKKyAgICAgICAgICAgICJub3JtYWwgbG9nIHJlY29yZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfTm9GaWx0ZXIoKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKGFvcywgbmV3IE1vY2tGb3JtYXR0ZXIoKSk7CkBAIC01NzgsNiArODA5LDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHB1Ymxpc2goKSwgdXNlIGEgZmlsdGVyLCBoYXZpbmcgb3V0cHV0IHN0cmVhbSwgbm9ybWFsIGxvZyByZWNvcmQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCB1c2UgYSBmaWx0ZXIsIGhhdmluZyBvdXRwdXQgc3RyZWFtLCAiICsKKyAgICAgICAgICAgICJub3JtYWwgbG9nIHJlY29yZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfV2l0aEZpbHRlcigpIHsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIoYW9zLCBuZXcgTW9ja0Zvcm1hdHRlcigpKTsKQEAgLTYxNCw2ICs4NTUsMTYgQEAKICAgICAgKiBUZXN0IHB1Ymxpc2goKSwgbnVsbCBsb2cgcmVjb3JkLCBoYW5kbGVyIHNob3VsZCBjYWxsIEVycm9yTWFuYWdlciB0bwogICAgICAqIGhhbmRsZSBleGNlcHRpb25hbCBjYXNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCBudWxsIGxvZyByZWNvcmQsIGhhbmRsZXIgc2hvdWxkIGNhbGwgIiArCisgICAgICAgICAgICAiRXJyb3JNYW5hZ2VyIHRvIGhhbmRsZSBleGNlcHRpb25hbCBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1Ymxpc2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGlzaF9OdWxsKCkgewogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksCiAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUZvcm1hdHRlcigpKTsKQEAgLTYyMyw2ICs4NzQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgcHVibGlzaCgpLCBudWxsIGxvZyByZWNvcmQsIHdpdGhvdXQgb3V0cHV0IHN0cmVhbQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHB1Ymxpc2goKSwgbnVsbCBsb2cgcmVjb3JkLCB3aXRob3V0IG91dHB1dCBzdHJlYW0uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVibGlzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaXNoX051bGxfTm9PdXRwdXRTdHJlYW0oKSB7CiAgICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKCk7CiAgICAgICAgIGgucHVibGlzaChudWxsKTsKQEAgLTY0MCw2ICs5MDAsMTYgQEAKICAgICAvKgogICAgICAqIFRlc3QgcHVibGlzaCgpLCBhIGxvZyByZWNvcmQgd2l0aCBlbXB0eSBtc2csIGhhdmluZyBvdXRwdXQgc3RyZWFtCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcHVibGlzaCgpLCBhIGxvZyByZWNvcmQgd2l0aCBlbXB0eSBtc2csICIgKworICAgICAgICAgICAgImhhdmluZyBvdXRwdXQgc3RyZWFtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1Ymxpc2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGlzaF9FbXB0eU1zZygpIHsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIoYW9zLCBuZXcgTW9ja0Zvcm1hdHRlcigpKTsKQEAgLTY1Miw2ICs5MjIsMTYgQEAKICAgICAvKgogICAgICAqIFRlc3QgcHVibGlzaCgpLCBhIGxvZyByZWNvcmQgd2l0aCBudWxsIG1zZywgaGF2aW5nIG91dHB1dCBzdHJlYW0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwdWJsaXNoKCksIGEgbG9nIHJlY29yZCB3aXRoIG51bGwgbXNnLCAiICsKKyAgICAgICAgICAgICJoYXZpbmcgb3V0cHV0IHN0cmVhbS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdWJsaXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1Ymxpc2hfTnVsbE1zZygpIHsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIoYW9zLCBuZXcgTW9ja0Zvcm1hdHRlcigpKTsKQEAgLTY2NCw2ICs5NDQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgcHVibGlzaCgpLCBhZnRlciBjbG9zZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwdWJsaXNoKCksIGFmdGVyIGNsb3NlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1Ymxpc2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGlzaF9BZnRlckNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHAucHV0KCJqYXZhLnV0aWwubG9nZ2luZy5TdHJlYW1IYW5kbGVyLmxldmVsIiwgIkZJTkUiKTsKQEAgLTY4NSw2ICs5NzQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0RW5jb2RpbmcoKSBtZXRob2Qgd2l0aCBzdXBwb3J0ZWQgZW5jb2RpbmcuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2V0RW5jb2RpbmcoKSBtZXRob2Qgd2l0aCBzdXBwb3J0ZWQgZW5jb2RpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEVuY29kaW5nX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihhb3MsIG5ldyBNb2NrRm9ybWF0dGVyKCkpOwpAQCAtNzA0LDYgKzEwMDIsMTYgQEAKICAgICAgKiBUZXN0IHNldEVuY29kaW5nKCkgbWV0aG9kIHdpdGggc3VwcG9ydGVkIGVuY29kaW5nLCBhZnRlciBhIGxvZyByZWNvcmQKICAgICAgKiBoYXMgYmVlbiB3cml0dGVuLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNldEVuY29kaW5nKCkgbWV0aG9kIHdpdGggc3VwcG9ydGVkIGVuY29kaW5nLCAiICsKKyAgICAgICAgICAgICJhZnRlciBhIGxvZyByZWNvcmQgaGFzIGJlZW4gd3JpdHRlbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRFbmNvZGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RW5jb2RpbmdfQWZ0ZXJQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKGFvcywgbmV3IE1vY2tGb3JtYXR0ZXIoKSk7CkBAIC03MzksNiArMTA0NywxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXRFbmNvZGluZygpIG1ldGhvZHMgd2l0aCBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNldEVuY29kaW5nKCkgbWV0aG9kcyB3aXRoIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEVuY29kaW5nX051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIoKTsKICAgICAgICAgaC5zZXRFbmNvZGluZyhudWxsKTsKQEAgLTc0OCw2ICsxMDY1LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldEVuY29kaW5nKCkgbWV0aG9kcyB3aXRoIHVuc3VwcG9ydGVkIGVuY29kaW5nLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNldEVuY29kaW5nKCkgbWV0aG9kcyB3aXRoIHVuc3VwcG9ydGVkIGVuY29kaW5nLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEVuY29kaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRFbmNvZGluZ19VbnN1cHBvcnRlZCgpIHsKICAgICAgICAgU3RyZWFtSGFuZGxlciBoID0gbmV3IFN0cmVhbUhhbmRsZXIoKTsKICAgICAgICAgdHJ5IHsKQEAgLTc2Miw2ICsxMDg4LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldEVuY29kaW5nKCkgd2l0aCBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNldEVuY29kaW5nKCkgbWV0aG9kIHdpdGggaW5zdWZmaWNpZW50IHByaXZpbGVnZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRFbmNvZGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RW5jb2RpbmdfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmVhbUhhbmRsZXIgaCA9IG5ldyBTdHJlYW1IYW5kbGVyKCk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRNYW4gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC03OTMsNiArMTEyOCwxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXRFbmNvZGluZygpIG1ldGhvZHMgd2lsbCBmbHVzaCBhIHN0cmVhbSBiZWZvcmUgc2V0dGluZy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHNldEVuY29kaW5nKCkgbWV0aG9kIHdpbGwgZmx1c2ggYSBzdHJlYW0gIiArCisgICAgICAgICAgICAiYmVmb3JlIHNldHRpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEVuY29kaW5nX0ZsdXNoQmVmb3JlU2V0dGluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICBTdHJlYW1IYW5kbGVyIGggPSBuZXcgU3RyZWFtSGFuZGxlcihhb3MsIG5ldyBNb2NrRm9ybWF0dGVyKCkpOwpAQCAtODA2LDYgKzExNTEsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0T3V0cHV0U3RyZWFtKCkgd2l0aCBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNldE91dHB1dFN0cmVhbSgpIG1ldGhvZCB3aXRoIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0T3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3V0cHV0U3RyZWFtX251bGwoKSB7CiAgICAgICAgIE1vY2tTdHJlYW1IYW5kbGVyIGggPSBuZXcgTW9ja1N0cmVhbUhhbmRsZXIoCiAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLCBuZXcgU2ltcGxlRm9ybWF0dGVyKCkpOwpAQCAtODIwLDYgKzExNzQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgc2V0T3V0cHV0U3RyZWFtKCkgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXRPdXRwdXRTdHJlYW0oKSBtZXRob2QgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPdXRwdXRTdHJlYW1fTm9ybWFsKCkgewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICBNb2NrU3RyZWFtSGFuZGxlciBoID0gbmV3IE1vY2tTdHJlYW1IYW5kbGVyKGFvcywgbmV3IE1vY2tGb3JtYXR0ZXIoKSk7CkBAIC04NTAsNiArMTIxMywxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBzZXRPdXRwdXRTdHJlYW0oKSBhZnRlciBjbG9zZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXRPdXRwdXRTdHJlYW0oKSBtZXRob2QgYWZ0ZXIgY2xvc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0T3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3V0cHV0U3RyZWFtX0FmdGVyQ2xvc2UoKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIE1vY2tTdHJlYW1IYW5kbGVyIGggPSBuZXcgTW9ja1N0cmVhbUhhbmRsZXIoYW9zLCBuZXcgTW9ja0Zvcm1hdHRlcigpKTsKQEAgLTg4MSw2ICsxMjUzLDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHNldE91dHB1dFN0cmVhbSgpIHdoZW4gaGF2aW5nIGluc3VmZmljaWVudCBwcml2aWxlZ2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2V0T3V0cHV0U3RyZWFtKCkgbWV0aG9kIHdoZW4gaGF2aW5nIGluc3VmZmljaWVudCAiICsKKyAgICAgICAgICAgICJwcml2aWxlZ2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0T3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3V0cHV0U3RyZWFtX0luc3VmZmljaWVudFByaXZpbGVnZSgpIHsKICAgICAgICAgTW9ja1N0cmVhbUhhbmRsZXIgaCA9IG5ldyBNb2NrU3RyZWFtSGFuZGxlcigpOwogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkTWFuID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMTAwOSw3ICsxMzkxLDYgQEAKICAgICAgICAgICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShpbnQpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgb25lQnl0ZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICAgICAgc3VwZXIud3JpdGUob25lQnl0ZSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvWE1MRm9ybWF0dGVyVGVzdC5qYXZhIGIvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sb2dnaW5nL3Rlc3RzL2phdmEvdXRpbC9sb2dnaW5nL1hNTEZvcm1hdHRlclRlc3QuamF2YQppbmRleCA1NDU4MmQxLi40ZDE1NjdhIDEwMDY0NAotLS0gYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xvZ2dpbmcvdGVzdHMvamF2YS91dGlsL2xvZ2dpbmcvWE1MRm9ybWF0dGVyVGVzdC5qYXZhCisrKyBiL2xvZ2dpbmcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbG9nZ2luZy90ZXN0cy9qYXZhL3V0aWwvbG9nZ2luZy9YTUxGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDEzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmxvZ2dpbmcudGVzdHMuamF2YS51dGlsLmxvZ2dpbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CkBAIC0yNCw4ICszMSw3IEBACiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLlhNTEZvcm1hdHRlcjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhYTUxGb3JtYXR0ZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIFhNTEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwpAQCAtNDMsNyArNDksMTYgQEAKIAogICAgIC8qCiAgICAgICogdGVzdCBmb3IgY29uc3RydWN0b3IgcHVibGljIFhNTEZvcm1hdHRlcigpCisgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvCisgICAgKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCAKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwgCisgICAgICAgICAgICB0YXJnZXRzID0gCisgICAgICAgICAgICB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIlhNTEZvcm1hdHRlciIsIG1ldGhvZEFyZ3MgPSB7fSkKKyAgICAgICAgICAgIH0KKyAgICAgKQogICAgIHB1YmxpYyB2b2lkIHRlc3RYTUxGb3JtYXR0ZXIoKSB7CiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBmb3JtYXR0ZXIuZ2V0SGVhZChoYW5kbGVyKTsKICAgICAgICAgaW50IGhlYWRQb3MgPSByZXN1bHQKQEAgLTYxLDYgKzc2LDE0IEBACiAgICAgICAgICAgICAgICAgLmdldFRhaWwoaGFuZGxlcikuaW5kZXhPZigiL2xvZz4iKSA+IDApOwogICAgIH0KIAorICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IAorICAgICAgICAgICAgeworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmb3JtYXQiLCBtZXRob2RBcmdzID0ge0xvZ1JlY29yZC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxGb3JtYXQoKSB7CiAgICAgICAgIC8vIGlmIHNldCByZXNvdXJjZSBidW5kbGUsIG91dHB1dCB3aWxsIHVzZSBsb2NhbGl6ZWQgbWVzc2FnZSwKICAgICAgICAgLy8gYnV0IHB1dCB0aGUgb3JpZ2luYWwgbWVzc2FnZSBpbnRvIHRoZSBrZXkgZWxlbWVudApAQCAtOTIsNiArMTE1LDE0IEBACiAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmluZGV4T2YoIjxrZXk+IikgPCAwKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxGb3JtYXQoKSB7CiAgICAgICAgIGxyLnNldFNvdXJjZUNsYXNzTmFtZSgic291cmNlIGNsYXNzIik7CiAgICAgICAgIGxyLnNldFNvdXJjZU1ldGhvZE5hbWUoInNvdXJjZSBtZXRob2QiKTsKQEAgLTEyNCw2ICsxNTUsMTQgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQuaW5kZXhPZigiPGtleT5wYXR0ZXJuPC9rZXk+IikgPiAwKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdEZvcm1hdCgpIHsKICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGZvcm1hdHRlci5mb3JtYXQobHIpOwogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0KTsKQEAgLTE0Myw2ICsxODIsMTQgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQuaW5kZXhPZigiPGtleT4iKSA8IDApOwogICAgIH0KIAorICAgIEBUZXN0SW5mbworICAgIChsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwgCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IAorICAgICAgICAgICAgeworICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRIZWFkIiwgbWV0aG9kQXJncyA9IHtIYW5kbGVyLmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICAgKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRIZWFkKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLAogICAgICAgICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBmb3JtYXR0ZXIuZ2V0SGVhZChoYW5kbGVyKTsKQEAgLTE2NSw5ICsyMTIsNyBAQAogICAgICAgICBoYW5kbGVyLnNldEVuY29kaW5nKG51bGwpOwogICAgICAgICByZXN1bHQgPSBmb3JtYXR0ZXIuZ2V0SGVhZChoYW5kbGVyKTsKICAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldEVuY29kaW5nKCkpOwotICAgICAgICAvLyBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKGRlZmF1bHRFbmNvZGluZyk+MCk7CiAgICAgICAgIAotICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMTI4MAogICAgICAgICAvLyBtYWtlIHN1cmUgbm8gTlBFIGlzIHRocm93bgogICAgICAgICBmb3JtYXR0ZXIuZ2V0SGVhZChudWxsKTsKIApAQCAtMTc2LDYgKzIyMSwxNCBAQAogICAgIC8qCiAgICAgICogdGVzdCBmb3IgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VGFpbChIYW5kbGVyIGgpCiAgICAgICovCisgICAgQFRlc3RJbmZvCisgICAgKGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLCAKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwgCisgICAgICAgICAgICB0YXJnZXRzID0gCisgICAgICAgICAgICB7CisgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFRhaWwiLCBtZXRob2RBcmdzID0ge0hhbmRsZXIuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICApCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFRhaWwoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygKICAgICAgICAgICAgICAgICAiVGFpbCBzdHJpbmcgd2l0aCBudWxsIGhhbmRsZXIgc2hvdWxkIGJlIGVxdWFsIGV4cGVjdGVkIHZhbHVlIiwKQEAgLTE4OCw2ICsyNDEsMTYgQEAKICAgICAgICAgICAgICAgICAiPC9sb2c+IiwgZm9ybWF0dGVyLmdldFRhaWwoaGFuZGxlcikudHJpbSgpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8KKyAgICAobGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsIAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLCAKKyAgICAgICAgICAgIHRhcmdldHMgPSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwgbWV0aG9kQXJncyA9IHtMb2dSZWNvcmQuY2xhc3N9KSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0VGFpbCIsIG1ldGhvZEFyZ3MgPSB7SGFuZGxlci5jbGFzc30pLAorICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJYTUxGb3JtYXR0ZXIiLCBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlcigpIHsKICAgICAgICAgZm9ybWF0dGVyLmdldFRhaWwobnVsbCk7CiAgICAgICAgIHRyeSB7CkBAIC0xOTksNyArMjYyLDcgQEAKICAgICAgICAgZm9ybWF0dGVyID0gbmV3IFhNTEZvcm1hdHRlcigpOwogICAgICAgICBsciA9IG5ldyBMb2dSZWNvcmQoTGV2ZWwuU0VWRVJFLCBudWxsKTsKICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGZvcm1hdHRlci5mb3JtYXQobHIpOwotICAgICAgICBhc3NlcnRUcnVlKG91dHB1dC5pbmRleE9mKCI8bWVzc2FnZSIpIDwgMCk7CisgICAgICAgIGFzc2VydFRydWUob3V0cHV0LmluZGV4T2YoIjxtZXNzYWdlLz4iKSAhPSAtMSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2NrSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3MuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzLmphdmEKaW5kZXggZTMxN2Y4MC4uYzY1ZGVkOSAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3MuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzcy5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKQEAgLTMwLDE1ICsyOSwxNCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBqYXZhLmxhbmc7CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNU3RhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5HZW5lcmljU2lnbmF0dXJlUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5UeXBlczsKLS8vIEVORCBhbmRyb2lkLWFkZGVkCiAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwpAQCAtNjIsNTEgKzYwLDY1IEBACiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkNsYXNzQ2FjaGUuUkVGTEVDVDsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkNsYXNzQ2FjaGUuY29tcGFyZUNsYXNzTGlzdHM7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5DbGFzc0NhY2hlLmdldE1hdGNoaW5nTWV0aG9kOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NDYWNoZS5maW5kTWV0aG9kQnlOYW1lOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NDYWNoZS5maW5kRmllbGRCeU5hbWU7CiAKIC8qKgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBWTSB2ZW5kb3IuIFRoZSBkb2N1bWVudGVkIG5hdGl2ZXMgbXVzdAotICogYmUgaW1wbGVtZW50ZWQgdG8gc3VwcG9ydCBvdGhlciBwcm92aWRlZCBjbGFzcyBpbXBsZW1lbnRhdGlvbnMgaW4gdGhpcwotICogcGFja2FnZS4gQW4gaW5zdGFuY2Ugb2YgY2xhc3MgQ2xhc3MgaXMgdGhlIGluLWltYWdlIHJlcHJlc2VudGF0aW9uIG9mIGEgSmF2YQotICogY2xhc3MuIFRoZXJlIGFyZSB0aHJlZSBiYXNpYyB0eXBlcyBvZiBDbGFzc2VzCi0gKiA8ZGw+Ci0gKiA8ZHQ+PGVtPkNsYXNzZXMgcmVwcmVzZW50aW5nIG9iamVjdCB0eXBlcyAoY2xhc3NlcyBvciBpbnRlcmZhY2VzKTwvZW0+Ci0gKiA8L2R0PgotICogPGRkPlRoZXNlIGFyZSBDbGFzc2VzIHdoaWNoIHJlcHJlc2VudCB0aGUgY2xhc3Mgb2YgYSBzaW1wbGUgaW5zdGFuY2UgYXMKLSAqIGZvdW5kIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIFRoZSBuYW1lIG9mIG9uZSBvZiB0aGVzZSBDbGFzc2VzIGlzIHNpbXBseSB0aGUKLSAqIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBpdCByZXByZXNlbnRzLiBJdHMKLSAqIDxlbT5zaWduYXR1cmU8L2VtPiBpcyB0aGUgbGV0dGVyICJMIiwgZm9sbG93ZWQgYnkgaXRzIG5hbWUsIGZvbGxvd2VkIGJ5IGEKLSAqIHNlbWktY29sb24gKCI7IikuPC9kZD4KLSAqIDxkdD48ZW0+Q2xhc3NlcyByZXByZXNlbnRpbmcgYmFzZSB0eXBlczwvZW0+PC9kdD4KLSAqIDxkZD5UaGVzZSBDbGFzc2VzIHJlcHJlc2VudCB0aGUgc3RhbmRhcmQgSmF2YSBiYXNlIHR5cGVzLiBBbHRob3VnaCBpdCBpcyBub3QKLSAqIHBvc3NpYmxlIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHRoZXNlIENsYXNzZXMsIHRoZXkgYXJlIHN0aWxsIHVzZWZ1bCBmb3IKLSAqIHByb3ZpZGluZyByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBhbmQgYXMgdGhlIGNvbXBvbmVudCB0eXBlIG9mIGFycmF5IGNsYXNzZXMuCi0gKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgQ2xhc3NlcyBmb3IgZWFjaCBiYXNlIHR5cGUsIGFuZCB0aGVpciBzaWduYXR1cmVzIGFyZToKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5CPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmJ5dGU8L2NvZGU+IGJhc2UgdHlwZTwvbGk+Ci0gKiA8bGk+PGNvZGU+UzwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5zaG9ydDwvY29kZT4gYmFzZSB0eXBlPC9saT4KLSAqIDxsaT48Y29kZT5JPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmludDwvY29kZT4gYmFzZSB0eXBlPC9saT4KLSAqIDxsaT48Y29kZT5KPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmxvbmc8L2NvZGU+IGJhc2UgdHlwZTwvbGk+Ci0gKiA8bGk+PGNvZGU+RjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5mbG9hdDwvY29kZT4gYmFzZSB0eXBlPC9saT4KLSAqIDxsaT48Y29kZT5EPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gYmFzZSB0eXBlPC9saT4KLSAqIDxsaT48Y29kZT5DPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IGJhc2UgdHlwZTwvbGk+Ci0gKiA8bGk+PGNvZGU+WjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiBiYXNlIHR5cGU8L2xpPgotICogPGxpPjxjb2RlPlY8L2NvZGU+IHJlcHJlc2VudGluZyB2b2lkIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXM8L2xpPgotICogPC91bD4KLSAqIFRoZSBuYW1lIG9mIGEgQ2xhc3MgcmVwcmVzZW50aW5nIGEgYmFzZSB0eXBlIGlzIHRoZSBrZXl3b3JkIHdoaWNoIGlzIHVzZWQgdG8KLSAqIHJlcHJlc2VudCB0aGUgdHlwZSBpbiBKYXZhIHNvdXJjZSBjb2RlIChpLmUuICJpbnQiIGZvciB0aGUgPGNvZGU+aW50PC9jb2RlPgotICogYmFzZSB0eXBlLjwvZGQ+Ci0gKiA8ZHQ+PGVtPkNsYXNzZXMgcmVwcmVzZW50aW5nIGFycmF5IGNsYXNzZXM8L2VtPjwvZHQ+Ci0gKiA8ZGQ+VGhlc2UgYXJlIENsYXNzZXMgd2hpY2ggcmVwcmVzZW50IHRoZSBjbGFzc2VzIG9mIEphdmEgYXJyYXlzLiBUaGVyZSBpcwotICogb25lIHN1Y2ggQ2xhc3MgZm9yIGFsbCBhcnJheSBpbnN0YW5jZXMgb2YgYSBnaXZlbiBhcml0eSAobnVtYmVyIG9mCi0gKiBkaW1lbnNpb25zKSBhbmQgbGVhZiBjb21wb25lbnQgdHlwZS4gSW4gdGhpcyBjYXNlLCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMKLSAqIG9uZSBvciBtb3JlIGxlZnQgc3F1YXJlIGJyYWNrZXRzIChvbmUgcGVyIGRpbWVuc2lvbiBpbiB0aGUgYXJyYXkpIGZvbGxvd2VkIGJ5Ci0gKiB0aGUgc2lnbmF0dXJlIG9mIHRoZSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGxlYWYgY29tcG9uZW50IHR5cGUsIHdoaWNoIGNhbgotICogYmUgZWl0aGVyIGFuIG9iamVjdCB0eXBlIG9yIGEgYmFzZSB0eXBlLiBUaGUgc2lnbmF0dXJlIG9mIGEgQ2xhc3MKLSAqIHJlcHJlc2VudGluZyBhbiBhcnJheSB0eXBlIGlzIHRoZSBzYW1lIGFzIGl0cyBuYW1lLjwvZGQ+Ci0gKiA8L2RsPgorICogVGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBhIEphdmEgY2xhc3MuIFRoaXMgcmVwcmVzZW50YXRpb24gc2VydmVzIGFzCisgKiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHF1ZXJ5aW5nIGNsYXNzLXJlbGF0ZWQgaW5mb3JtYXRpb24sIGEgcHJvY2VzcyB1c3VhbGx5CisgKiBjYWxsZWQgInJlZmxlY3Rpb24iLiBUaGVyZSBhcmUgYmFzaWNhbGx5IHRocmVlIHR5cGVzIG9mIHtAY29kZSBDbGFzc30KKyAqIGluc3RhbmNlczogdGhvc2UgcmVwcmVzZW50aW5nIHJlYWwgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgdGhvc2UgcmVwcmVzZW50aW5nCisgKiBwcmltaXRpdmUgdHlwZXMsIGFuZCB0aG9zZSByZXByZXNlbnRpbmcgYXJyYXkgY2xhc3Nlcy4KICAqIAotICogQHNpbmNlIDEuMAorICogPGg0PkNsYXNzIGluc3RhbmNlcyByZXByZXNlbnRpbmcgb2JqZWN0IHR5cGVzIChjbGFzc2VzIG9yIGludGVyZmFjZXMpPC9oND4KKyAqIDxwPgorICogVGhlc2UgcmVwcmVzZW50IGFuIG9yZGluYXJ5IGNsYXNzIG9yIGludGVyZmFjZSBhcyBmb3VuZCBpbiB0aGUgY2xhc3MKKyAqIGhpZXJhcmNoeS4gVGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIHtAY29kZSBDbGFzc30gaW5zdGFuY2VzIGlzIHNpbXBseQorICogdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBpdCByZXByZXNlbnRzLgorICogSW4gYWRkaXRpb24gdG8gdGhpcyBodW1hbi1yZWFkYWJsZSBuYW1lLCBlYWNoIGNsYXNzIGlzIGFsc28gYXNzb2NpYXRlZCBieSBhCisgKiBzby1jYWxsZWQgPGVtPnNpZ25hdHVyZTwvZW0+LCB3aGljaCBpcyB0aGUgbGV0dGVyICJMIiwgZm9sbG93ZWQgYnkgdGhlCisgKiBjbGFzcyBuYW1lIGFuZCBhIHNlbWljb2xvbiAoIjsiKS4gVGhlIHNpZ25hdHVyZSBpcyB3aGF0IHRoZSBydW50aW1lIHN5c3RlbQorICogdXNlcyBpbnRlcm5hbGx5IGZvciBpZGVudGlmeWluZyB0aGUgY2xhc3MgKGZvciBleGFtcGxlIGluIGEgREVYIGZpbGUpLgorICogPC9wPgorICogPGg0PkNsYXNzZXMgcmVwcmVzZW50aW5nIHByaW1pdGl2ZSB0eXBlczwvaDQ+CisgKiA8cD4KKyAqIFRoZXNlIHJlcHJlc2VudCB0aGUgc3RhbmRhcmQgSmF2YSBwcmltaXRpdmUgdHlwZXMgYW5kIGhlbmNlIHNoYXJlIHRoZWlyCisgKiBuYW1lcyAoZm9yIGV4YW1wbGUgImludCIgZm9yIHRoZSB7QGNvZGUgaW50fSBwcmltaXRpdmUgdHlwZSkuIEFsdGhvdWdoIGl0IGlzCisgKiBub3QgcG9zc2libGUgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgYmFzZWQgb24gdGhlc2Uge0Bjb2RlIENsYXNzfSBpbnN0YW5jZXMsCisgKiB0aGV5IGFyZSBzdGlsbCB1c2VmdWwgZm9yIHByb3ZpZGluZyByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBhbmQgYXMgdGhlCisgKiBjb21wb25lbnQgdHlwZSBvZiBhcnJheSBjbGFzc2VzLiBUaGVyZSBpcyBvbmUge0Bjb2RlIENsYXNzfSBpbnN0YW5jZSBmb3IgZWFjaAorICogcHJpbWl0aXZlIHR5cGUsIGFuZCB0aGVpciBzaWduYXR1cmVzIGFyZToKKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxsaT57QGNvZGUgQn0gcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgYnl0ZX0gcHJpbWl0aXZlIHR5cGU8L2xpPgorICogPGxpPntAY29kZSBTfSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBzaG9ydH0gcHJpbWl0aXZlIHR5cGU8L2xpPgorICogPGxpPntAY29kZSBJfSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBpbnR9IHByaW1pdGl2ZSB0eXBlPC9saT4KKyAqIDxsaT57QGNvZGUgSn0gcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgbG9uZ30gcHJpbWl0aXZlIHR5cGU8L2xpPgorICogPGxpPntAY29kZSBGfSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBmbG9hdH0gcHJpbWl0aXZlIHR5cGU8L2xpPgorICogPGxpPntAY29kZSBEfSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBkb3VibGV9IHByaW1pdGl2ZSB0eXBlPC9saT4KKyAqIDxsaT57QGNvZGUgQ30gcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgY2hhcn0gcHJpbWl0aXZlIHR5cGU8L2xpPgorICogPGxpPntAY29kZSBafSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBib29sZWFufSBwcmltaXRpdmUgdHlwZTwvbGk+CisgKiA8bGk+e0Bjb2RlIFZ9IHJlcHJlc2VudGluZyB2b2lkIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXM8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogPGg0PkNsYXNzZXMgcmVwcmVzZW50aW5nIGFycmF5IGNsYXNzZXM8L2g0PgorICogPHA+CisgKiBUaGVzZSByZXByZXNlbnQgdGhlIGNsYXNzZXMgb2YgSmF2YSBhcnJheXMuIFRoZXJlIGlzIG9uZSBzdWNoIHtAY29kZSBDbGFzc30KKyAqIGluc3RhbmNlIHBlciBjb21iaW5hdGlvbiBvZiBhcnJheSBsZWFmIGNvbXBvbmVudCB0eXBlIGFuZCBhcml0eSAobnVtYmVyIG9mCisgKiBkaW1lbnNpb25zKS4gSW4gdGhpcyBjYXNlLCB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAY29kZSBDbGFzc30KKyAqIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIGxlZnQgc3F1YXJlIGJyYWNrZXRzIChvbmUgcGVyIGRpbWVuc2lvbiBpbiB0aGUgYXJyYXkpCisgKiBmb2xsb3dlZCBieSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGxlYWYgY29tcG9uZW50IHR5cGUsCisgKiB3aGljaCBjYW4gYmUgZWl0aGVyIGFuIG9iamVjdCB0eXBlIG9yIGEgcHJpbWl0aXZlIHR5cGUuIFRoZSBzaWduYXR1cmUgb2YgYQorICoge0Bjb2RlIENsYXNzfSByZXByZXNlbnRpbmcgYW4gYXJyYXkgdHlwZSBpcyB0aGUgc2FtZSBhcyBpdHMgbmFtZS4gRXhhbXBsZXMKKyAqIG9mIGFycmF5IGNsYXNzIHNpZ25hdHVyZXMgYXJlOgorICogPC9wPgorICogPHVsPgorICogPGxpPntAY29kZSBbSX0gcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgaW50W119IHR5cGU8L2xpPgorICogPGxpPntAY29kZSBbTGphdmEvbGFuZy9TdHJpbmc7fSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBTdHJpbmdbXX0gdHlwZTwvbGk+CisgKiA8bGk+e0Bjb2RlIFtbW0N9IHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIGNoYXJbXVtdW119IHR5cGUgKHRocmVlIGRpbWVuc2lvbnMhKTwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENsYXNzPFQ+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBBbm5vdGF0ZWRFbGVtZW50LCBHZW5lcmljRGVjbGFyYXRpb24sIFR5cGUgewogCkBAIC0xNDUsMzMgKzE1Nyw2MCBAQAogICAgIG5hdGl2ZSBwcml2YXRlIE9iamVjdFtdIGdldFNpZ25hdHVyZUFubm90YXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDbGFzcyBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2xhc3MgbmFtZWQgYnkgdGhlIGFyZ3VtZW50LgotICAgICAqIFRoZSBuYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIGNsYXNzIGFzIGRlc2NyaWJlZCBpbiB0aGUgY2xhc3MKLSAgICAgKiBkZWZpbml0aW9uIG9mIHtAbGluayBDbGFzc30sIGhvd2V2ZXIgQ2xhc3NlcyByZXByZXNlbnRpbmcgYmFzZSB0eXBlcyBjYW4KLSAgICAgKiBub3QgYmUgZm91bmQgdXNpbmcgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBDbGFzc30gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGNsYXNzIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIGNsYXNzIGFzIGRlc2NyaWJlZCBpbgorICAgICAqIHRoZSB7QGxpbmsgQ2xhc3MgY2xhc3MgZGVmaW5pdGlvbn07IGhvd2V2ZXIsIHtAY29kZSBDbGFzc31lcyByZXByZXNlbnRpbmcKKyAgICAgKiBwcmltaXRpdmUgdHlwZXMgY2FuIG5vdCBiZSBmb3VuZCB1c2luZyB0aGlzIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgY2xhc3MgaGFzIG5vdCBiZWVuIGxvYWRlZCBzbyBmYXIsIGl0IGlzIGJlaW5nIGxvYWRlZCBhbmQgbGlua2VkCisgICAgICogZmlyc3QuIFRoaXMgaXMgZG9uZSB0aHJvdWdoIGVpdGhlciB0aGUgY2xhc3MgbG9hZGVyIG9mIHRoZSBjYWxsaW5nIGNsYXNzCisgICAgICogb3Igb25lIG9mIGl0cyBwYXJlbnQgY2xhc3MgbG9hZGVycy4gVGhlIGNsYXNzIGlzIGFsc28gYmVpbmcgaW5pdGlhbGl6ZWQsCisgICAgICogd2hpY2ggbWVhbnMgdGhhdCBhIHBvc3NpYmxlIHN0YXRpYyBpbml0aWFsaXplciBibG9jayBpcyBleGVjdXRlZC4gIAogICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIG5vbi1iYXNlIHR5cGUgY2xhc3MgdG8gZmluZAotICAgICAqIEByZXR1cm4gdGhlIG5hbWVkIENsYXNzCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIElmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQKLSAgICAgKiBAc2VlIENsYXNzCisgICAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5vbi1wcmltaXRpdmUtdHlwZSBjbGFzcyB0byBmaW5kLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVkIHtAY29kZSBDbGFzc30gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBjbGFzcyBjYW4gbm90IGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgTGlua2FnZUVycm9yCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBsaW5rYWdlCisgICAgICogQHRocm93cyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgYQorICAgICAqICAgICAgICAgICAgIGNsYXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBmb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIENsYXNzIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBjbGFzcyBuYW1lZCBieSB0aGUgYXJndW1lbnQuCi0gICAgICogVGhlIG5hbWUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBjbGFzcwotICAgICAqIGRlZmluaXRpb24gb2Yge0BsaW5rIENsYXNzfSwgaG93ZXZlciBDbGFzc2VzIHJlcHJlc2VudGluZyBiYXNlIHR5cGVzIGNhbgotICAgICAqIG5vdCBiZSBmb3VuZCB1c2luZyB0aGlzIG1ldGhvZC4gU2VjdXJpdHkgcnVsZXMgd2lsbCBiZSBvYmV5ZWQuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBDbGFzc30gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGNsYXNzIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIGNsYXNzIGFzIGRlc2NyaWJlZCBpbgorICAgICAqIHRoZSB7QGxpbmsgQ2xhc3MgY2xhc3MgZGVmaW5pdGlvbn0sIGhvd2V2ZXIge0Bjb2RlIENsYXNzfWVzIHJlcHJlc2VudGluZworICAgICAqIHByaW1pdGl2ZSB0eXBlcyBjYW4gbm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgbWV0aG9kLiBTZWN1cml0eSBydWxlcyB3aWxsCisgICAgICogYmUgb2JleWVkLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBjbGFzcyBoYXMgbm90IGJlZW4gbG9hZGVkIHNvIGZhciwgaXQgaXMgYmVpbmcgbG9hZGVkIGFuZCBsaW5rZWQKKyAgICAgKiBmaXJzdC4gVGhpcyBpcyBkb25lIHRocm91Z2ggZWl0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyIG9yIG9uZSBvZgorICAgICAqIGl0cyBwYXJlbnQgY2xhc3MgbG9hZGVycy4gVGhlIGNhbGxlciBjYW4gYWxzbyByZXF1ZXN0IHRoZSBjbGFzcyB0byBiZQorICAgICAqIGluaXRpYWxpemVkLCB3aGljaCBtZWFucyB0aGF0IGEgcG9zc2libGUgc3RhdGljIGluaXRpYWxpemVyIGJsb2NrIGlzCisgICAgICogZXhlY3V0ZWQuICAKICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBub24tYmFzZSB0eXBlIGNsYXNzIHRvIGZpbmQKLSAgICAgKiBAcGFyYW0gaW5pdGlhbGl6ZUJvb2xlYW4gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2xhc3Mgc2hvdWxkIGJlCi0gICAgICogICAgICAgIGluaXRpYWxpemVkCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgbmFtZWQgY2xhc3MuCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIElmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQKLSAgICAgKiBAc2VlIENsYXNzCisgICAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5vbi1wcmltaXRpdmUtdHlwZSBjbGFzcyB0byBmaW5kLgorICAgICAqIEBwYXJhbSBpbml0aWFsaXplQm9vbGVhbgorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsYXNzIHNob3VsZCBiZSBpbml0aWFsaXplZC4KKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGNsYXNzLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVkIHtAY29kZSBDbGFzc30gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBjbGFzcyBjYW4gbm90IGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgTGlua2FnZUVycm9yCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBsaW5rYWdlCisgICAgICogQHRocm93cyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgYQorICAgICAqICAgICAgICAgICAgIGNsYXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIGluaXRpYWxpemVCb29sZWFuLAogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKQEAgLTE4NywxNCArMjI2LDMwIEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNsYXNzRm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemVCb29sZWFuLCBjbGFzc0xvYWRlcik7CisgICAgICAgIC8vIENhdGNoIGFuIEV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHVuZGVybHlpbmcgbmF0aXZlIGNvZGUuIEl0IHdyYXBzCisgICAgICAgIC8vIHVwIGV2ZXJ5dGhpbmcgaW5zaWRlIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgZXZlbiBpZiBlLmcuIGFuCisgICAgICAgIC8vIEVycm9yIG9jY3VycmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gVGhpcyBhcyBhIHdvcmthcm91bmQgZm9yCisgICAgICAgIC8vIGFuIEV4Y2VwdGlvbkluSW5pdGlsYWl6ZXJFcnJvciB0aGF0J3MgYWxzbyB3cmFwcGVkLiBJdCBpcyBhY3R1YWxseQorICAgICAgICAvLyBleHBlY3RlZCB0byBiZSB0aHJvd24uIE1heWJlIHRoZSBzYW1lIGdvZXMgZm9yIG90aGVyIGVycm9ycy4KKyAgICAgICAgLy8gTm90IHdyYXBwaW5nIHVwIGFsbCB0aGUgZXJyb3JzIHdpbGwgYnJlYWsgYW5kcm9pZCB0aG91Z2guCisgICAgICAgIENsYXNzPD8+IHJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNsYXNzRm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemVCb29sZWFuLAorICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOyAKKyAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IChFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IpIGNhdXNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qCiAgICAgICogUmV0dXJucyBhIGNsYXNzIGJ5IG5hbWUgd2l0aG91dCBhbnkgc2VjdXJpdHkgY2hlY2tzLgogICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgbm9uLWJhc2UgdHlwZSBjbGFzcyB0byBmaW5kCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgbm9uLXByaW1pdGl2ZSB0eXBlIGNsYXNzIHRvIGZpbmQKICAgICAgKiBAcGFyYW0gaW5pdGlhbGl6ZUJvb2xlYW4gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2xhc3Mgc2hvdWxkIGJlCiAgICAgICogICAgICAgIGluaXRpYWxpemVkCiAgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGNsYXNzCkBAIC0yMDUsMjUgKzI2MCwzNiBAQAogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOwogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgcHVibGljIGNsYXNzIG1lbWJlcnMgb2YgdGhlIGNsYXNzIHdoaWNoCi0gICAgICogdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMgYW5kIGl0cyBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCisgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHtAY29kZSBDbGFzc30gb2JqZWN0cyBmb3IgYWxsIHB1YmxpYyBjbGFzc2VzCisgICAgICogYW5kIGludGVyZmFjZXMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGlzIGNsYXNzLiBUaGlzIGluY2x1ZGVzIHB1YmxpYworICAgICAqIG1lbWJlcnMgaW5oZXJpdGVkIGZyb20gc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2gKKyAgICAgKiBjbGFzcyBtZW1iZXJzIG9yIGlmIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZSB0aGVuIGFuIGFycmF5CisgICAgICogb2YgbGVuZ3RoIDAgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MnIHB1YmxpYyBjbGFzcyBtZW1iZXJzCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiBtZW1iZXIgYWNjZXNzIGlzIG5vdCBhbGxvd2VkCi0gICAgICogQHNlZSBDbGFzcworICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBjbGFzcyBtZW1iZXJzIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PltdIGdldENsYXNzZXMoKSB7CisgICAgcHVibGljIENsYXNzW10gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIHRyeWluZyB0byBnZXQgY2xvc2VyIHRvIHRoZSBSSSB3aGljaCByZXR1cm5zIGEgcmF3IGNsYXNzIGFycmF5LgorICAgICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciB2ZXJzaW9uIG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICBjaGVja1B1YmxpY01lbWJlckFjY2VzcygpOwogICAgICAgICByZXR1cm4gZ2V0RnVsbExpc3RPZkNsYXNzZXModHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgdGhlcmUgaXMgbm8gYW5ub3RhdGlvbiB0aGUKLSAgICAgKiBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9uIG9mIHRoZSBnaXZlbiB0eXBlLiBJZiB0aGVyZSBpcyBubyBzdWNoIGFubm90YXRpb24KKyAgICAgKiB0aGVuIHRoZSBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyB0aGUgYW5ub3RhdGlvbiB0eXBlLgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gb2YgdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBvZiB0aGUgZ2l2ZW4gdHlwZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICBzdWNoIGFubm90YXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gQSBnZXRBbm5vdGF0aW9uKENsYXNzPEE+IGFubm90YXRpb25DbGFzcykgewpAQCAtMjM4LDEwICszMDQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgYW5ub3RhdGlvbnMgb2YgdGhlIHJlY2VpdmVyLiBJZiB0aGVyZSBhcmUgbm8gYW5ub3RhdGlvbnMKLSAgICAgKiB0aGVuIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCisgICAgICogUmV0dXJucyBhbGwgdGhlIGFubm90YXRpb25zIG9mIHRoaXMgY2xhc3MuIElmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucworICAgICAqIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVyJ3MgYW5ub3RhdGlvbnMuCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhpcyBjbGFzcycgYW5ub3RhdGlvbnMuCisgICAgICogQHNlZSAjZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHsKICAgICAgICAgLyoKQEAgLTI3OSwxMSArMzQ3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIHJlY2VpdmVyLiBJZiB0aGUgcmVjZWl2ZXIgZG9lcyBub3QgaGF2ZQotICAgICAqIGEgY2Fub25pY2FsIG5hbWUsIGFzIGRlZmluZWQgaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgdGhlbiB0aGUKLSAgICAgKiBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGlzIGNsYXNzLiBJZiB0aGlzIGNsYXNzIGRvZXMgbm90IGhhdmUgYQorICAgICAqIGNhbm9uaWNhbCBuYW1lIGFzIGRlZmluZWQgaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgdGhlbiB0aGUKKyAgICAgKiBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIgY2Fub25pY2FsIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhpcyBjbGFzcycgY2Fub25pY2FsIG5hbWUsIG9yIHtAY29kZSBudWxsfSBpZiBpdCBkb2VzIG5vdCBoYXZlIGEKKyAgICAgKiAgICAgICAgIGNhbm9uaWNhbCBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsTmFtZSgpIHsKICAgICAgICAgaWYgKGlzTG9jYWxDbGFzcygpIHx8IGlzQW5vbnltb3VzQ2xhc3MoKSkKQEAgLTMxMiw4ICszODIsNiBAQAogICAgICAgICAgICAgICogVGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdG9wLWxldmVsIGNsYXNzIG9yIHByaW1pdGl2ZSB0eXBlIGlzCiAgICAgICAgICAgICAgKiBlcXVhbCB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE8gQ2hlY2sgaWYgdGhpcyB3b3JrcyBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlcy4KICAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCk7CiAgICAgICAgIH0KICAgICAgICAgCkBAIC0zMjUsMjQgKzM5MywzMyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xhc3MgbG9hZGVyIHdoaWNoIHdhcyB1c2VkIHRvIGxvYWQgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5Ci0gICAgICogdGhlIHJlY2VpdmVyLiBSZXR1cm5zIG51bGwgaWYgdGhlIGNsYXNzIHdhcyBsb2FkZWQgYnkgdGhlIGJvb3RzdHJhcCBjbGFzcwotICAgICAqIGxvYWRlcgorICAgICAqIHRoaXMge0Bjb2RlIENsYXNzfS4gSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIHJldHVybiB7QGNvZGUgbnVsbH0gZm9yCisgICAgICogY2xhc3NlcyB0aGF0IHdlcmUgbG9hZGVkIGJ5IHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyLiBUaGUgQW5kcm9pZAorICAgICAqIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgdGhvdWdoLCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGFuIGFjdHVhbAorICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgY2xhc3MgbG9hZGVyIG9yIG5pbAorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIGxvYWRlciBmb3IgdGhlIHJlcHJlc2VudGVkIGNsYXNzLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyBhY2Nlc3NpbmcKKyAgICAgKiAgICAgICAgICAgICB0aGUgY2xhc3MgbG9hZGVyLgogICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbWdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAoc21nciAhPSBudWxsKSB7CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzTG9hZGVySW1wbCgpOworICAgICAgICBpZiAoc21nciAhPSBudWxsICYmIGxvYWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBDbGFzc0xvYWRlciBjYWxsaW5nID0gVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGN1cnJlbnQgPSBnZXRDbGFzc0xvYWRlckltcGwoKTsKIAotICAgICAgICAgICAgaWYgKGNhbGxpbmcgIT0gbnVsbCAmJiAhY2FsbGluZy5nZXRDbGFzcygpLmlzSW5zdGFuY2UoY3VycmVudCkpIHsKKyAgICAgICAgICAgIGlmIChjYWxsaW5nICE9IG51bGwgJiYgIWNhbGxpbmcuaXNBbmNlc3Rvck9mKGxvYWRlcikpIHsKICAgICAgICAgICAgICAgICBzbWdyLmNoZWNrUGVybWlzc2lvbihuZXcgUnVudGltZVBlcm1pc3Npb24oImdldENsYXNzTG9hZGVyIikpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlckltcGwoKTsKKyAgICAgICAgaWYgKHRoaXMuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgbG9hZGVyID0gQm9vdENsYXNzTG9hZGVyLmdldEluc3RhbmNlKCk7CiAgICAgICAgIH0KQEAgLTM3NSwyNCArNDUyLDMwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzPD8+IGNsYXp6KTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ2xhc3Mgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIHJlY2VpdmVyJ3MgY29tcG9uZW50IHR5cGUgaWYKLSAgICAgKiB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cyBhbiBhcnJheSB0eXBlLiBPdGhlcndpc2UgcmV0dXJucyBuaWwuIFRoZQotICAgICAqIGNvbXBvbmVudCB0eXBlIG9mIGFuIGFycmF5IHR5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIENsYXNzfSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcG9uZW50IHR5cGUgaWYKKyAgICAgKiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYXJyYXkgdHlwZS4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgdGhpcyBjbGFzcworICAgICAqIGRvZXMgbm90IHJlcHJlc2VudCBhbiBhcnJheSB0eXBlLiBUaGUgY29tcG9uZW50IHR5cGUgb2YgYW4gYXJyYXkgdHlwZSBpcworICAgICAqIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIHJlY2VpdmVyLgotICAgICAqIEBzZWUgQ2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGNsYXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgQ2xhc3M8Pz4gZ2V0Q29tcG9uZW50VHlwZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHB1YmxpYyBDb25zdHJ1Y3RvciBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgY29uc3RydWN0b3IKLSAgICAgKiBkZXNjcmliZWQgYnkgdGhlIGFyZ3VtZW50cy4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIENvbnN0cnVjdG9yfSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgcHVibGljCisgICAgICogY29uc3RydWN0b3IgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgdHlwZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGRlc2NyaWJlZCBieSB0aGUgYXJndW1lbnRzLgotICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBjb3VsZCBub3QgYmUgZm91bmQuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBtZW1iZXIgYWNjZXNzIGlzIG5vdCBhbGxvd2VkCi0gICAgICogQHNlZSAjZ2V0Q29uc3RydWN0b3JzCisgICAgICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSByZXF1ZXN0ZWQgY29uc3RydWN0b3IuCisgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0b3IgZGVzY3JpYmVkIGJ5IHtAY29kZSBwYXJhbWV0ZXJUeXBlc30uCisgICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29uc3RydWN0b3IgY2FuIG5vdCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgorICAgICAqIEBzZWUgI2dldERlY2xhcmVkQ29uc3RydWN0b3IoQ2xhc3MuLi4pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yKENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLApAQCAtNDAyLDM5ICs0ODUsNjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgQ29uc3RydWN0b3Igb2JqZWN0cyBkZXNjcmliaW5nIGFsbAotICAgICAqIGNvbnN0cnVjdG9ycyB3aGljaCBhcmUgdmlzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB7QGNvZGUgQ29uc3RydWN0b3J9IG9iamVjdHMgZm9yIGFsbCBwdWJsaWMKKyAgICAgKiBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uIElmIHRoZXJlCisgICAgICogYXJlIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcnMgb3IgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkKKyAgICAgKiBjbGFzcywgYSBwcmltaXRpdmUgdHlwZSBvciB2b2lkIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbGwgdmlzaWJsZSBjb25zdHJ1Y3RvcnMgc3RhcnRpbmcgZnJvbSB0aGUgcmVjZWl2ZXIuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBtZW1iZXIgYWNjZXNzIGlzIG5vdCBhbGxvd2VkCi0gICAgICogQHNlZSAjZ2V0TWV0aG9kcworICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgcHVibGljIGNvbnN0cnVjdG9ycyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiAgICAgICAgIHRoaXMge0Bjb2RlIENsYXNzfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgorICAgICAqIEBzZWUgI2dldERlY2xhcmVkQ29uc3RydWN0b3JzKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RydWN0b3I8VD5bXSBnZXRDb25zdHJ1Y3RvcnMoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgIHB1YmxpYyBDb25zdHJ1Y3RvcltdIGdldENvbnN0cnVjdG9ycygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyB0cnlpbmcgdG8gZ2V0IGNsb3NlciB0byB0aGUgUkkgd2hpY2ggcmV0dXJucyBhIHJhdyBjb25zdHJ1Y3RvciBhcnJheS4KKyAgICAgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgY2hlY2tQdWJsaWNNZW1iZXJBY2Nlc3MoKTsKICAgICAgICAgcmV0dXJuIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKHRoaXMsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb25zIHRoYXQgYXJlIGRpcmVjdGx5IGRlZmluZWQgb24gdGhpcyB0eXBlLgotICAgICAqIEFubm90YXRpb25zIHRoYXQgYXJlIGluaGVyaXRlZCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHQuIElmIHRoZXJlCi0gICAgICogYXJlIG5vIGFubm90YXRpb25zLCByZXR1cm5zIGFuIGVtcHR5IGFycmF5LgorICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb25zIHRoYXQgYXJlIGRpcmVjdGx5IGRlZmluZWQgb24gdGhlIGNsYXNzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LiBBbm5vdGF0aW9ucyB0aGF0IGFyZSBpbmhlcml0ZWQgYXJlIG5vdAorICAgICAqIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuIElmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucyBhdCBhbGwsIGFuIGVtcHR5CisgICAgICogYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVyJ3MgZGVmaW5lZAotICAgICAqICAgICAgICAgYW5ub3RhdGlvbnMuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBhbm5vdGF0aW9ucyBkZWZpbmVkIGZvciB0aGUKKyAgICAgKiAgICAgICAgIGNsYXNzIHRoYXQgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMuCisgICAgICogQHNlZSAjZ2V0QW5ub3RhdGlvbnMoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIG5hdGl2ZSBwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgY2xhc3MgbWVtYmVycyBvZiB0aGUgY2xhc3Mgd2hpY2ggdGhlCi0gICAgICogcmVjZWl2ZXIgcmVwcmVzZW50cy4gTm90ZSB0aGF0IHNvbWUgb2YgdGhlIGZpZWxkcyB3aGljaCBhcmUgcmV0dXJuZWQgbWF5Ci0gICAgICogbm90IGJlIHZpc2libGUgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHtAY29kZSBDbGFzc30gb2JqZWN0cyBmb3IgYWxsIGNsYXNzZXMgYW5kCisgICAgICogaW50ZXJmYWNlcyB0aGF0IGFyZSBkZWNsYXJlZCBhcyBtZW1iZXJzIG9mIHRoZSBjbGFzcyB3aGljaCB0aGlzIHtAY29kZQorICAgICAqIENsYXNzfSByZXByZXNlbnRzLiBJZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBvciBpbnRlcmZhY2VzIGRlY2xhcmVkIG9yIGlmCisgICAgICogdGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFycmF5IGNsYXNzLCBhIHByaW1pdGl2ZSB0eXBlIG9yIHZvaWQsIHRoZW4gYW4KKyAgICAgKiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcycgY2xhc3MgbWVtYmVycwotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgbWVtYmVyIGFjY2VzcyBpcyBub3QgYWxsb3dlZAotICAgICAqIEBzZWUgQ2xhc3MKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGgge0Bjb2RlIENsYXNzfSBvYmplY3RzIGZvciBhbGwgdGhlIGNsYXNzZXMgYW5kCisgICAgICogICAgICAgICBpbnRlcmZhY2VzIHRoYXQgYXJlIHVzZWQgaW4gbWVtYmVyIGRlY2xhcmF0aW9ucy4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PltdIGdldERlY2xhcmVkQ2xhc3NlcygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgcHVibGljIENsYXNzW10gZ2V0RGVjbGFyZWRDbGFzc2VzKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIHRyeWluZyB0byBnZXQgY2xvc2VyIHRvIHRoZSBSSSB3aGljaCByZXR1cm5zIGEgcmF3IGNsYXNzIGFycmF5LgorICAgICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciB2ZXJzaW9uIG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICBjaGVja0RlY2xhcmVkTWVtYmVyQWNjZXNzKCk7CiAgICAgICAgIHJldHVybiBnZXREZWNsYXJlZENsYXNzZXModGhpcywgZmFsc2UpOwogICAgIH0KQEAgLTQ3NiwxNCArNTgwLDIwIEBACiAgICAgICAgIGJvb2xlYW4gcHVibGljT25seSk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIENvbnN0cnVjdG9yIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBjb25zdHJ1Y3RvciBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgYXJndW1lbnRzLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgQ29uc3RydWN0b3J9IG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBjb25zdHJ1Y3RvcgorICAgICAqIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIHR5cGVzIHRoYXQgaXMgZGVjbGFyZWQgYnkgdGhlIGNsYXNzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4KLSAgICAgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBkZXNjcmliZWQgYnkgdGhlIGFyZ3VtZW50cy4KLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgY291bGQgbm90IGJlIGZvdW5kLgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgbWVtYmVyIGFjY2VzcyBpcyBub3QgYWxsb3dlZAotICAgICAqIEBzZWUgI2dldENvbnN0cnVjdG9ycworICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiB0aGUgcmVxdWVzdGVkIGNvbnN0cnVjdG9yLgorICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGRlc2NyaWJlZCBieSB7QGNvZGUgcGFyYW1ldGVyVHlwZXN9LgorICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBjb25zdHJ1Y3RvciBjYW4gbm90IGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MuCisgICAgICogQHNlZSAjZ2V0Q29uc3RydWN0b3IoQ2xhc3MuLi4pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIENvbnN0cnVjdG9yPFQ+IGdldERlY2xhcmVkQ29uc3RydWN0b3IoQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCkBAIC00OTMsMTYgKzYwMywyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBDb25zdHJ1Y3RvciBvYmplY3RzIGRlc2NyaWJpbmcgYWxsCi0gICAgICogY29uc3RydWN0b3Igd2hpY2ggYXJlIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyLiBOb3RlIHRoYXQgc29tZSBvZiB0aGUKLSAgICAgKiBmaWVsZHMgd2hpY2ggYXJlIHJldHVybmVkIG1heSBub3QgYmUgdmlzaWJsZSBpbiB0aGUgY3VycmVudCBleGVjdXRpb24KLSAgICAgKiBjb250ZXh0LgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB7QGNvZGUgQ29uc3RydWN0b3J9IG9iamVjdHMgZm9yIGFsbAorICAgICAqIGNvbnN0cnVjdG9ycyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LiBJZgorICAgICAqIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMgb3IgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkKKyAgICAgKiBjbGFzcywgYSBwcmltaXRpdmUgdHlwZSBvciB2b2lkIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBjb25zdHJ1Y3RvcnMuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBtZW1iZXIgYWNjZXNzIGlzIG5vdCBhbGxvd2VkCi0gICAgICogQHNlZSAjZ2V0TWV0aG9kcworICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgY29uc3RydWN0b3JzIGRlY2xhcmVkIGluIHRoZSBjbGFzcyByZXByZXNlbnRlZAorICAgICAqICAgICAgICAgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MuCisgICAgICogQHNlZSAjZ2V0Q29uc3RydWN0b3JzKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RydWN0b3I8VD5bXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgcHVibGljIENvbnN0cnVjdG9yW10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gdHJ5aW5nIHRvIGdldCBjbG9zZXIgdG8gdGhlIFJJIHdoaWNoIHJldHVybnMgYSByYXcgY29uc3RydWN0b3IgYXJyYXkuCisgICAgICAgIC8vIGNvcGllZCBmcm9tIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIGNoZWNrRGVjbGFyZWRNZW1iZXJBY2Nlc3MoKTsKICAgICAgICAgcmV0dXJuIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKHRoaXMsIGZhbHNlKTsKICAgICB9CkBAIC01MzgsNTggKzY1Nyw1NCBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRmllbGQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGZpZWxkIGluIHRoZSByZWNlaXZlciBuYW1lZCBieSB0aGUKLSAgICAgKiBhcmd1bWVudC4gTm90ZSB0aGF0IHRoZSBDb25zdHJ1Y3RvciBtYXkgbm90IGJlIHZpc2libGUgZnJvbSB0aGUgY3VycmVudAotICAgICAqIGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgRmllbGR9IG9iamVjdCBmb3IgdGhlIGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICogd2hpY2ggaXMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gbG9vayBmb3IuCi0gICAgICogQHJldHVybiB0aGUgZmllbGQgaW4gdGhlIHJlY2VpdmVyIG5hbWVkIGJ5IHRoZSBhcmd1bWVudC4KLSAgICAgKiBAdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgZmllbGQgY291bGQgbm90IGJlIGZvdW5kCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBtZW1iZXIgYWNjZXNzIGlzIG5vdCBhbGxvd2VkCi0gICAgICogQHNlZSAjZ2V0RGVjbGFyZWRGaWVsZHMoKQorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBmaWVsZCBpbiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBmaWVsZCBjYW4gbm90IGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MuCisgICAgICogQHNlZSAjZ2V0RmllbGQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBGaWVsZCBnZXREZWNsYXJlZEZpZWxkKFN0cmluZyBuYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgRmllbGQgZ2V0RGVjbGFyZWRGaWVsZChTdHJpbmcgbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBjaGVja0RlY2xhcmVkTWVtYmVyQWNjZXNzKCk7Ci0gICAgICAgIHJldHVybiBnZXRNYXRjaGluZ0ZpZWxkKGdldERlY2xhcmVkRmllbGRzKHRoaXMsIGZhbHNlKSwgbmFtZSk7CisKKyAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBnZXRDbGFzc0NhY2hlKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgRmllbGQgZmllbGQgPSBmaW5kRmllbGRCeU5hbWUoZmllbGRzLCBuYW1lKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYWtlIGEgY29weSBvZiB0aGUgcHJpdmF0ZSAodG8gdGhlIHBhY2thZ2UpIG9iamVjdCwgc28gdGhhdAorICAgICAgICAgKiBzZXRBY2Nlc3NpYmxlKCkgd29uJ3QgYWx0ZXIgdGhlIHByaXZhdGUgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gUkVGTEVDVC5jbG9uZShmaWVsZCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIEZpZWxkIG9iamVjdHMgZGVzY3JpYmluZyBhbGwgZmllbGRzIHdoaWNoIGFyZQotICAgICAqIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyLiBOb3RlIHRoYXQgc29tZSBvZiB0aGUgZmllbGRzIHdoaWNoIGFyZSByZXR1cm5lZAotICAgICAqIG1heSBub3QgYmUgdmlzaWJsZSBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dC4KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcge0Bjb2RlIEZpZWxkfSBvYmplY3RzIGZvciBhbGwgZmllbGRzIGRlY2xhcmVkCisgICAgICogaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gSWYgdGhlcmUgYXJlIG5vIGZpZWxkcyBvcgorICAgICAqIGlmIHRoaXMge0Bjb2RlIENsYXNzfSByZXByZXNlbnRzIGFuIGFycmF5IGNsYXNzLCBhIHByaW1pdGl2ZSB0eXBlIG9yIHZvaWQKKyAgICAgKiB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgZmllbGRzLgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgbWVtYmVyIGFjY2VzcyBpcyBub3QgYWxsb3dlZAotICAgICAqIEBzZWUgI2dldEZpZWxkcworICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgZmllbGRzIGRlY2xhcmVkIGluIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieQorICAgICAqICAgICAgICAgdGhpcyBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgorICAgICAqIEBzZWUgI2dldEZpZWxkcygpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpZWxkW10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBjaGVja0RlY2xhcmVkTWVtYmVyQWNjZXNzKCk7Ci0gICAgICAgIHJldHVybiBnZXREZWNsYXJlZEZpZWxkcyh0aGlzLCBmYWxzZSk7Ci0gICAgfQogCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZpZWxkcyB3aXRob3V0IHBlcmZvcm1pbmcgYW55IHNlY3VyaXR5IGNoZWNrcwotICAgICAqIGZpcnN0LiBUaGlzIGluY2x1ZGVzIHRoZSBmaWVsZHMgaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzLiBJZiBubwotICAgICAqIGZpZWxkcyBleGlzdCBhdCBhbGwsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwdWJsaWNPbmx5IHJlZmxlY3RzIHdoZXRoZXIgd2Ugd2FudCBvbmx5IHB1YmxpYyBmaWVsZHMgb3IgYWxsIG9mIHRoZW0KLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpZWxkcyAKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpZWxkW10gZ2V0RnVsbExpc3RPZkZpZWxkcyhib29sZWFuIHB1YmxpY09ubHkpIHsKLSAgICAgICAgRmllbGRbXSByZXN1bHQgPSBnZXREZWNsYXJlZEZpZWxkcyh0aGlzLCBwdWJsaWNPbmx5KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRyYXZlcnNlIGFsbCBzdXBlcmNsYXNzZXMKLSAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSB0aGlzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgd2hpbGUgKGNsYXp6ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpZWxkW10gdGVtcCA9IGdldERlY2xhcmVkRmllbGRzKGNsYXp6LCBwdWJsaWNPbmx5KTsKLSAgICAgICAgICAgIGlmICh0ZW1wLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXJyYXljb3B5KG5ldyBGaWVsZFtyZXN1bHQubGVuZ3RoICsgdGVtcC5sZW5ndGhdLCByZXN1bHQsIHRlbXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgcHJpdmF0ZSAodG8gdGhlIHBhY2thZ2UpIGFycmF5LgorICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGdldENsYXNzQ2FjaGUoKS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICByZXR1cm4gQ2xhc3NDYWNoZS5kZWVwQ29weShmaWVsZHMpOwogICAgIH0KICAgICAKICAgICAvKgpAQCAtNjAxLDQ2ICs3MTYsMzMgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpZWxkcyAKICAgICAgKi8KICAgICBzdGF0aWMgbmF0aXZlIEZpZWxkW10gZ2V0RGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gY2xhenosIGJvb2xlYW4gcHVibGljT25seSk7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBGaW5kcyBhIGZpZWxkIHdpdGggYSBnaXZlbiBuYW1lIGluIGEgbGlzdCBvZiBmaWVsZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpZWxkcyB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gc2VhcmNoIHRocm91Z2gKLSAgICAgKiBAbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZAotICAgICAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEZpZWxkIGdldE1hdGNoaW5nRmllbGQoRmllbGRbXSBmaWVsZHMsIFN0cmluZyBuYW1lKQotICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRzW2ldOwotICAgICAgICB9CiAKLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEZpZWxkRXhjZXB0aW9uKG5hbWUpOwotICAgIH0KLQotICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAotICAgIC8vIENoYW5nZWQgdG8gcmF3IHR5cGUgdG8gYmUgY2xvc2VyIHRvIHRoZSBSSQogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBNZXRob2Qgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIG1ldGhvZCBkZXNjcmliZWQgYnkgdGhlCi0gICAgICogYXJndW1lbnRzLiBOb3RlIHRoYXQgdGhlIGFzc29jaWF0ZWQgbWV0aG9kIG1heSBub3QgYmUgdmlzaWJsZSBmcm9tIHRoZQotICAgICAqIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBNZXRob2R9IG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBtZXRob2QgbWF0Y2hpbmcgdGhlCisgICAgICogc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlciB0eXBlcyB0aGF0IGlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcworICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0gICAgICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgotICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZCBkZXNjcmliZWQgYnkgdGhlIGFyZ3VtZW50cy4KLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGNvdWxkIG5vdCBiZSBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIElmIG1lbWJlciBhY2Nlc3MgaXMgbm90IGFsbG93ZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBuYW1lIHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2VlICNnZXRNZXRob2RzCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHJlcXVlc3RlZCBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kIGRlc2NyaWJlZCBieSB7QGNvZGUgbmFtZX0gYW5kIHtAY29kZSBwYXJhbWV0ZXJUeXBlc30uCisgICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIGNvbnN0cnVjdG9yIGNhbiBub3QgYmUgZm91bmQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuYW1lfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRvZXMgbm90IGFsbG93IG1lbWJlcgorICAgICAqICAgICAgICAgICAgIGFjY2Vzcy4KKyAgICAgKiBAc2VlICNnZXRNZXRob2QoU3RyaW5nLCBDbGFzcy4uLikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kIGdldERlY2xhcmVkTWV0aG9kKFN0cmluZyBuYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tEZWNsYXJlZE1lbWJlckFjY2VzcygpOwogCiAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBnZXRDbGFzc0NhY2hlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRNYXRjaGluZ01ldGhvZChtZXRob2RzLCBuYW1lLCBwYXJhbWV0ZXJUeXBlcyk7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBmaW5kTWV0aG9kQnlOYW1lKG1ldGhvZHMsIG5hbWUsIHBhcmFtZXRlclR5cGVzKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBNYWtlIGEgY29weSBvZiB0aGUgcHJpdmF0ZSAodG8gdGhlIHBhY2thZ2UpIG9iamVjdCwgc28gdGhhdApAQCAtNjQ4LDE2ICs3NTAsMjAgQEAKICAgICAgICAgICovCiAgICAgICAgIHJldHVybiBSRUZMRUNULmNsb25lKG1ldGhvZCk7CiAgICAgfQotICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgTWV0aG9kIG9iamVjdHMgZGVzY3JpYmluZyBhbGwgbWV0aG9kcyB3aGljaAotICAgICAqIGFyZSBkZWZpbmVkIGJ5IHRoZSByZWNlaXZlci4gTm90ZSB0aGF0IHNvbWUgb2YgdGhlIG1ldGhvZHMgd2hpY2ggYXJlCi0gICAgICogcmV0dXJuZWQgbWF5IG5vdCBiZSB2aXNpYmxlIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB7QGNvZGUgTWV0aG9kfSBvYmplY3RzIGZvciBhbGwgbWV0aG9kcworICAgICAqIGRlY2xhcmVkIGluIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uIElmIHRoZXJlIGFyZSBubworICAgICAqIG1ldGhvZHMgb3IgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkgY2xhc3MsIGEgcHJpbWl0aXZlCisgICAgICogdHlwZSBvciB2b2lkIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBtZXRob2RzLgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgbWVtYmVyIGFjY2VzcyBpcyBub3QgYWxsb3dlZAotICAgICAqIEBzZWUgI2dldE1ldGhvZHMKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIG1ldGhvZHMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5CisgICAgICogICAgICAgICB0aGlzIHtAY29kZSBDbGFzc30uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRvZXMgbm90IGFsbG93IG1lbWJlcgorICAgICAqICAgICAgICAgICAgIGFjY2Vzcy4KKyAgICAgKiBAc2VlICNnZXRNZXRob2RzKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kW10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tEZWNsYXJlZE1lbWJlckFjY2VzcygpOwpAQCAtNjk4LDQ4ICs4MDQsNDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyB3aGljaCBkZWNsYXJlZCB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhlIHJlY2VpdmVyLgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBtZW1iZXIgb2YgYW5vdGhlciBjbGFzcy4KKyAgICAgKiBSZXR1cm5zIHRoZSBkZWNsYXJpbmcge0Bjb2RlIENsYXNzfSBvZiB0aGlzIHtAY29kZSBDbGFzc30uIFJldHVybnMKKyAgICAgKiB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGlzIG5vdCBhIG1lbWJlciBvZiBhbm90aGVyIGNsYXNzIG9yIGlmIHRoaXMKKyAgICAgKiB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkgY2xhc3MsIGEgcHJpbWl0aXZlIHR5cGUgb3Igdm9pZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gdGhlIGRlY2xhcmluZyB7QGNvZGUgQ2xhc3N9IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBuYXRpdmUgcHVibGljIENsYXNzPD8+IGdldERlY2xhcmluZ0NsYXNzKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyB0aGF0IGRpcmVjdGx5IGVuY2xvc2VzIHRoZSByZWNlaXZlci4gSWYgdGhlcmUgaXMgbm8KLSAgICAgKiBlbmNsb3NpbmcgY2xhc3MgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIFJldHVybnMgdGhlIGVuY2xvc2luZyB7QGNvZGUgQ2xhc3N9IG9mIHRoaXMge0Bjb2RlIENsYXNzfS4gSWYgdGhlcmUgaXMgbm8KKyAgICAgKiBlbmNsb3NpbmcgY2xhc3MgdGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmNsb3NpbmcgY2xhc3Mgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgZW5jbG9zaW5nIHtAY29kZSBDbGFzc30gb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIG5hdGl2ZSBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RW5jbG9zaW5nQ2xhc3MoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBDb25zdHJ1Y3Rvcn0sIHdoaWNoIGVuY2xvc2VzIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGlzCi0gICAgICogY2xhc3MsIGlmIGl0IGlzIGFuIGFub255bW91cyBvciBsb2NhbC9hdXRvbWF0aWMgY2xhc3MsIG90aGVyd2lzZQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEdldHMgdGhlIGVuY2xvc2luZyB7QGNvZGUgQ29uc3RydWN0b3J9IG9mIHRoaXMge0Bjb2RlIENsYXNzfSwgaWYgaXQgaXMgYW4KKyAgICAgKiBhbm9ueW1vdXMgb3IgbG9jYWwvYXV0b21hdGljIGNsYXNzOyBvdGhlcndpc2Uge0Bjb2RlIG51bGx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSB7QGxpbmsgQ29uc3RydWN0b3J9IGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNsb3Npbmcge0Bjb2RlIENvbnN0cnVjdG9yfSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgbmF0aXZlIHB1YmxpYyBDb25zdHJ1Y3Rvcjw/PiBnZXRFbmNsb3NpbmdDb25zdHJ1Y3RvcigpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUge0BsaW5rIE1ldGhvZH0sIHdoaWNoIGVuY2xvc2VzIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGlzIGNsYXNzLAotICAgICAqIGlmIGl0IGlzIGFuIGFub255bW91cyBvciBsb2NhbC9hdXRvbWF0aWMgY2xhc3MsIG90aGVyd2lzZQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEdldHMgdGhlIGVuY2xvc2luZyB7QGNvZGUgTWV0aG9kfSBvZiB0aGlzIHtAY29kZSBDbGFzc30sIGlmIGl0IGlzIGFuCisgICAgICogYW5vbnltb3VzIG9yIGxvY2FsL2F1dG9tYXRpYyBjbGFzczsgb3RoZXJ3aXNlIHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEge0BsaW5rIE1ldGhvZH0gaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEByZXR1cm4gdGhlIGVuY2xvc2luZyB7QGNvZGUgTWV0aG9kfSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgbmF0aXZlIHB1YmxpYyBNZXRob2QgZ2V0RW5jbG9zaW5nTWV0aG9kKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Y29kZT5lbnVtPC9jb2RlPiBjb25zdGFudHMvZmllbGRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzCi0gICAgICogaWYgaXQgaXMgYW4ge0BsaW5rcGxhaW4gI2lzRW51bSgpIGVudW19LCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogR2V0cyB0aGUge0Bjb2RlIGVudW19IGNvbnN0YW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQ2xhc3N9LgorICAgICAqIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHRoaXMge0Bjb2RlIENsYXNzfSBkb2VzIG5vdCByZXByZXNlbnQgYW4ge0Bjb2RlCisgICAgICogZW51bX0gdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHRoZSA8Y29kZT5lbnVtPC9jb2RlPiBjb25zdGFudHMgZm9yIHRoaXMgY2xhc3Mgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHtAY29kZSBlbnVtfSBjb25zdGFudHMgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBUW10gZ2V0RW51bUNvbnN0YW50cygpIHsKQEAgLTc1NSw5MSArODYyLDEzMyBAQAogICAgIH0KICAgICAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIEZpZWxkIG9iamVjdCBkZXNjcmliaW5nIHRoZSBmaWVsZCBpbiB0aGUgcmVjZWl2ZXIgbmFtZWQgYnkgdGhlCi0gICAgICogYXJndW1lbnQgd2hpY2ggbXVzdCBiZSB2aXNpYmxlIGZyb20gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBGaWVsZH0gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIHB1YmxpYyBmaWVsZCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBuYW1lLiBUaGlzIG1ldGhvZCBmaXJzdCBzZWFyY2hlcyB0aGUgY2xhc3MgQyByZXByZXNlbnRlZCBieQorICAgICAqIHRoaXMge0Bjb2RlIENsYXNzfSwgdGhlbiB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSBDIGFuZCBmaW5hbGx5IHRoZQorICAgICAqIHN1cGVyY2xhc3NlcyBvZiBDLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZCBpbiB0aGUgcmVjZWl2ZXIgbmFtZWQgYnkgdGhlIGFyZ3VtZW50LgotICAgICAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIGZpZWxkIGRvZXMgbm90IGV4aXN0Ci0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiBhY2Nlc3MgaXMgZGVuaWVkCi0gICAgICogQHNlZSAjZ2V0RGVjbGFyZWRGaWVsZHMoKQorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBmaWVsZCBzcGVjaWZpZWQgYnkge0Bjb2RlIG5hbWV9LgorICAgICAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmllbGQgY2FuIG5vdCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgorICAgICAqIEBzZWUgI2dldERlY2xhcmVkRmllbGQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWVsZCBnZXRGaWVsZChTdHJpbmcgbmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrUHVibGljTWVtYmVyQWNjZXNzKCk7Ci0gICAgICAgIHJldHVybiBnZXRNYXRjaGluZ0ZpZWxkKGdldEZ1bGxMaXN0T2ZGaWVsZHModHJ1ZSksIG5hbWUpOworCisgICAgICAgIEZpZWxkW10gZmllbGRzID0gZ2V0Q2xhc3NDYWNoZSgpLmdldEFsbFB1YmxpY0ZpZWxkcygpOworICAgICAgICBGaWVsZCBmaWVsZCA9IGZpbmRGaWVsZEJ5TmFtZShmaWVsZHMsIG5hbWUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2UgYSBjb3B5IG9mIHRoZSBwcml2YXRlICh0byB0aGUgcGFja2FnZSkgb2JqZWN0LCBzbyB0aGF0CisgICAgICAgICAqIHNldEFjY2Vzc2libGUoKSB3b24ndCBhbHRlciB0aGUgcHJpdmF0ZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBSRUZMRUNULmNsb25lKGZpZWxkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgRmllbGQgb2JqZWN0cyBkZXNjcmliaW5nIGFsbCBmaWVsZHMgd2hpY2ggYXJlCi0gICAgICogdmlzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB7QGNvZGUgRmllbGR9IG9iamVjdHMgZm9yIGFsbCBwdWJsaWMgZmllbGRzCisgICAgICogZm9yIHRoZSBjbGFzcyBDIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gRmllbGRzIG1heSBiZSBkZWNsYXJlZAorICAgICAqIGluIEMsIHRoZSBpbnRlcmZhY2VzIGl0IGltcGxlbWVudHMgb3IgaW4gdGhlIHN1cGVyY2xhc3NlcyBvZiBDLiBUaGUKKyAgICAgKiBlbGVtZW50cyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlcmUgYXJlIG5vIHB1YmxpYyBmaWVsZHMgb3IgaWYgdGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFycmF5IGNsYXNzLAorICAgICAqIGEgcHJpbWl0aXZlIHR5cGUgb3Ige0Bjb2RlIHZvaWR9IHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gYWxsIHZpc2libGUgZmllbGRzIHN0YXJ0aW5nIGZyb20gdGhlIHJlY2VpdmVyLgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgbWVtYmVyIGFjY2VzcyBpcyBub3QgYWxsb3dlZAorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgcHVibGljIGZpZWxkcyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIENsYXNzfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgogICAgICAqIEBzZWUgI2dldERlY2xhcmVkRmllbGRzKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmllbGRbXSBnZXRGaWVsZHMoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBjaGVja1B1YmxpY01lbWJlckFjY2VzcygpOwotICAgICAgICByZXR1cm4gZ2V0RnVsbExpc3RPZkZpZWxkcyh0cnVlKTsKKworICAgICAgICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBwcml2YXRlICh0byB0aGUgcGFja2FnZSkgYXJyYXkuCisgICAgICAgIEZpZWxkW10gZmllbGRzID0gZ2V0Q2xhc3NDYWNoZSgpLmdldEFsbFB1YmxpY0ZpZWxkcygpOworICAgICAgICByZXR1cm4gQ2xhc3NDYWNoZS5kZWVwQ29weShmaWVsZHMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBUeXBlIHR5cGVzfSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgdGhpcyBjbGFzcyBkaXJlY3RseQotICAgICAqIGltcGxlbWVudHMuCisgICAgICogR2V0cyB0aGUge0BsaW5rIFR5cGV9cyBvZiB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMge0Bjb2RlIENsYXNzfSBkaXJlY3RseQorICAgICAqIGltcGxlbWVudHMuIElmIHRoZSB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZSBvciB7QGNvZGUKKyAgICAgKiB2b2lkfSB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Yge0BsaW5rIFR5cGV9IGluc3RhbmNlcy4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGxpbmsgVHlwZX0gaW5zdGFuY2VzIGRpcmVjdGx5IGltcGxlbWVudGVkIGJ5IHRoZQorICAgICAqICAgICAgICAgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgY2xhc3N9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUeXBlW10gZ2V0R2VuZXJpY0ludGVyZmFjZXMoKSB7Ci0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBHZW5lcmljU2lnbmF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBHZW5lcmljU2lnbmF0dXJlUGFyc2VyKCk7CiAgICAgICAgIHBhcnNlci5wYXJzZUZvckNsYXNzKHRoaXMsIGdldFNpZ25hdHVyZUF0dHJpYnV0ZSgpKTsKICAgICAgICAgcmV0dXJuIFR5cGVzLmdldENsb25lZFR5cGVBcnJheShwYXJzZXIuaW50ZXJmYWNlVHlwZXMpOwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBUeXBlfSB0aGF0IHJlcHJlc2VudHMgdGhlIHN1cGVyIGNsYXNzIG9mIHRoaXMgY2xhc3MuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIFR5cGV9IHRoYXQgcmVwcmVzZW50cyB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIHtAY29kZQorICAgICAqIGNsYXNzfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHtAbGluayBUeXBlfQotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAY29kZSBUeXBlfSByZXByZXNlbnRpbmcgdGhlIHN1cGVyY2xhc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFR5cGUgZ2V0R2VuZXJpY1N1cGVyY2xhc3MoKSB7Ci0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBHZW5lcmljU2lnbmF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBHZW5lcmljU2lnbmF0dXJlUGFyc2VyKCk7CiAgICAgICAgIHBhcnNlci5wYXJzZUZvckNsYXNzKHRoaXMsIGdldFNpZ25hdHVyZUF0dHJpYnV0ZSgpKTsKICAgICAgICAgcmV0dXJuIFR5cGVzLmdldFR5cGUocGFyc2VyLnN1cGVyY2xhc3NUeXBlKTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgQ2xhc3Mgb2JqZWN0cyB3aGljaCBtYXRjaCB0aGUgaW50ZXJmYWNlcyBzcGVjaWZpZWQgaW4KLSAgICAgKiB0aGUgcmVjZWl2ZXIgY2xhc3NlcyA8Y29kZT5pbXBsZW1lbnRzPC9jb2RlPiBkZWNsYXJhdGlvbi4gVGhlIG9yZGVyIG9mCi0gICAgICogZW50cmllcyBlcXVhbHMgdGhlIG9yZGVyIGluIHRoZSBvcmlnaW5hbCBjbGFzcyBkZWNsYXJhdGlvbi4gSWYgdGhlCi0gICAgICogY2xhc3MgZG9lc24ndCBpbXBsZW1lbnQgYW55IGludGVyZmFjZXMsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Yge0Bjb2RlIENsYXNzfSBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIGludGVyZmFjZXMKKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIHtAY29kZSBpbXBsZW1lbnRzfSBkZWNsYXJhdGlvbiBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQKKyAgICAgKiBieSB0aGlzIHtAY29kZSBDbGFzc30uIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IGlzCisgICAgICogaWRlbnRpY2FsIHRvIHRoZSBvcmRlciBpbiB0aGUgb3JpZ2luYWwgY2xhc3MgZGVjbGFyYXRpb24uIElmIHRoZSBjbGFzcworICAgICAqIGRvZXMgbm90IGltcGxlbWVudCBhbnkgaW50ZXJmYWNlcywgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBDbGFzc1tdIHRoZSBpbnRlcmZhY2VzIHRoZSByZWNlaXZlciBjbGFpbXMgdG8gaW1wbGVtZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgaW50ZXJmYWNlcyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgICAqICAgICAgICAgY2xhc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIG5hdGl2ZSBDbGFzczw/PltdIGdldEludGVyZmFjZXMoKTsKKyAgICBwdWJsaWMgbmF0aXZlIENsYXNzW10gZ2V0SW50ZXJmYWNlcygpOworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIHRyeWluZyB0byBnZXQgY2xvc2VyIHRvIHRoZSBSSSB3aGljaCByZXR1cm5zIGEgcmF3IGNsYXNzIGFycmF5LgorICAgIC8vIGNvcGllZCBmcm9tIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIC8vIENoYW5nZWQgdG8gcmF3IHR5cGUgdG8gYmUgY2xvc2VyIHRvIHRoZSBSSQogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBNZXRob2Qgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIG1ldGhvZCBkZXNjcmliZWQgYnkgdGhlCi0gICAgICogYXJndW1lbnRzLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgTWV0aG9kfSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgcHVibGljIG1ldGhvZCB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIgdHlwZXMuIFRoaXMgbWV0aG9kIGZpcnN0IHNlYXJjaGVzIHRoZQorICAgICAqIGNsYXNzIEMgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LCB0aGVuIHRoZSBzdXBlcmNsYXNzZXMgb2YgQyBhbmQKKyAgICAgKiBmaW5hbGx5IHRoZSBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IEMgYW5kIGZpbmFsbHkgdGhlIHN1cGVyY2xhc3NlcyBvZiBDCisgICAgICogZm9yIGEgbWV0aG9kIHdpdGggbWF0Y2hpbmcgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyBDbGFzc1tdIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgotICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBhcmd1bWVudHMuCi0gICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBjb3VsZCBub3QgYmUgZm91bmQuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBtZW1iZXIgYWNjZXNzIGlzIG5vdCBhbGxvd2VkCi0gICAgICogQHNlZSAjZ2V0TWV0aG9kcworICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcmVxdWVzdGVkIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSByZXF1ZXN0ZWQgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBmaWVsZCBzcGVjaWZpZWQgYnkge0Bjb2RlIG5hbWV9LgorICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG1ldGhvZCBjYW4gbm90IGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MuCisgICAgICogQHNlZSAjZ2V0RGVjbGFyZWRNZXRob2QoU3RyaW5nLCBDbGFzcy4uLikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIAogICAgICAgICAgICAgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBjaGVja1B1YmxpY01lbWJlckFjY2VzcygpOwogCiAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBnZXRDbGFzc0NhY2hlKCkuZ2V0QWxsUHVibGljTWV0aG9kcygpOwotICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0TWF0Y2hpbmdNZXRob2QobWV0aG9kcywgbmFtZSwgcGFyYW1ldGVyVHlwZXMpOworICAgICAgICBNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZEJ5TmFtZShtZXRob2RzLCBuYW1lLCBwYXJhbWV0ZXJUeXBlcyk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSBhIGNvcHkgb2YgdGhlIHByaXZhdGUgKHRvIHRoZSBwYWNrYWdlKSBvYmplY3QsIHNvIHRoYXQKQEAgLTg0NywxNSArOTk2LDI0IEBACiAgICAgICAgICAqLwogICAgICAgICByZXR1cm4gUkVGTEVDVC5jbG9uZShtZXRob2QpOwogICAgIH0KLSAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgTWV0aG9kIG9iamVjdHMgZGVzY3JpYmluZyBhbGwgbWV0aG9kcyB3aGljaAotICAgICAqIGFyZSB2aXNpYmxlIGZyb20gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHtAY29kZSBNZXRob2R9IG9iamVjdHMgZm9yIGFsbCBwdWJsaWMgbWV0aG9kcworICAgICAqIGZvciB0aGUgY2xhc3MgQyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uIE1ldGhvZHMgbWF5IGJlCisgICAgICogZGVjbGFyZWQgaW4gQywgdGhlIGludGVyZmFjZXMgaXQgaW1wbGVtZW50cyBvciBpbiB0aGUgc3VwZXJjbGFzc2VzIG9mIEMuCisgICAgICogVGhlIGVsZW1lbnRzIGluIHRoZSByZXR1cm5lZCBhcnJheSBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGVyZSBhcmUgbm8gcHVibGljIG1ldGhvZHMgb3IgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYQorICAgICAqIHByaW1pdGl2ZSB0eXBlIG9yIHtAY29kZSB2b2lkfSB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1ldGhvZFtdIGFsbCB2aXNpYmxlIG1ldGhvZHMgc3RhcnRpbmcgZnJvbSB0aGUgcmVjZWl2ZXIuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBtZW1iZXIgYWNjZXNzIGlzIG5vdCBhbGxvd2VkCisgICAgICogQHJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgQ2xhc3N9LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MuCiAgICAgICogQHNlZSAjZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kW10gZ2V0TWV0aG9kcygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrUHVibGljTWVtYmVyQWNjZXNzKCk7CkBAIC04NjcsOSArMTAyNSw5IEBACiAgICAgCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgdGhlIHNlY3VyaXR5IGNoZWNrcyByZWdhcmRpbmcgdGhlIGFjY2VzcyBvZiBhIHB1YmxpYwotICAgICAqIG1lbWJlciBvZiB0aGlzIGNsYXNzLgorICAgICAqIG1lbWJlciBvZiB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICogCi0gICAgICogPHA+PGI+Tm90ZTo8L2I+IEJlY2F1c2Ugb2YgdGhlIDxjb2RlPmdldENhbGxpbmdDbGFzc0xvYWRlcjIoKTwvY29kZT4KKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gQmVjYXVzZSBvZiB0aGUge0Bjb2RlIGdldENhbGxpbmdDbGFzc0xvYWRlcjIoKX0KICAgICAgKiBjaGVjaywgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmUgbGV2ZWwgZGVlcCBpbnRvIGEKICAgICAgKiBwdWJsaWMgbWV0aG9kIG9uIHRoaXMgaW5zdGFuY2UuPC9wPgogICAgICAqLwpAQCAtODgyLDcgKzEwNDAsNyBAQAogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2FsbGluZyA9IFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyMigpOwogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY3VycmVudCA9IGdldENsYXNzTG9hZGVyKCk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYWxsaW5nICE9IG51bGwgJiYgIWNhbGxpbmcuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKGN1cnJlbnQpKSB7CisgICAgICAgICAgICBpZiAoY2FsbGluZyAhPSBudWxsICYmICFjYWxsaW5nLmlzQW5jZXN0b3JPZihjdXJyZW50KSkgewogICAgICAgICAgICAgICAgIHNtZ3IuY2hlY2tQYWNrYWdlQWNjZXNzKHRoaXMuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg5MCw5ICsxMDQ4LDkgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIHRoZSBzZWN1cml0eSBjaGVja3MgcmVnYXJkaW5nIHRoZSBhY2Nlc3Mgb2YgYSBkZWNsYXJlZAotICAgICAqIG1lbWJlciBvZiB0aGlzIGNsYXNzLgorICAgICAqIG1lbWJlciBvZiB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICogCi0gICAgICogPHA+PGI+Tm90ZTo8L2I+IEJlY2F1c2Ugb2YgdGhlIDxjb2RlPmdldENhbGxpbmdDbGFzc0xvYWRlcjIoKTwvY29kZT4KKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gQmVjYXVzZSBvZiB0aGUge0Bjb2RlIGdldENhbGxpbmdDbGFzc0xvYWRlcjIoKX0KICAgICAgKiBjaGVjaywgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmUgbGV2ZWwgZGVlcCBpbnRvIGEKICAgICAgKiBwdWJsaWMgbWV0aG9kIG9uIHRoaXMgaW5zdGFuY2UuPC9wPgogICAgICAqLwpAQCAtOTA0LDE4ICsxMDYyLDE5IEBACiAgICAgICAgICAgICBDbGFzc0xvYWRlciBjYWxsaW5nID0gVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIyKCk7CiAgICAgICAgICAgICBDbGFzc0xvYWRlciBjdXJyZW50ID0gZ2V0Q2xhc3NMb2FkZXIoKTsKIAotICAgICAgICAgICAgaWYgKGNhbGxpbmcgIT0gbnVsbCAmJiAhY2FsbGluZy5nZXRDbGFzcygpLmlzSW5zdGFuY2UoY3VycmVudCkpIHsKKyAgICAgICAgICAgIGlmIChjYWxsaW5nICE9IG51bGwgJiYgIWNhbGxpbmcuaXNBbmNlc3Rvck9mKGN1cnJlbnQpKSB7CiAgICAgICAgICAgICAgICAgc21nci5jaGVja1BhY2thZ2VBY2Nlc3ModGhpcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgd2hpY2ggd2hpY2ggaXMgdGhlIHJlY2VpdmVyJ3MgbW9kaWZpZXJzLiBOb3RlIHRoYXQgdGhlCi0gICAgICogY29uc3RhbnRzIHdoaWNoIGRlc2NyaWJlIHRoZSBiaXRzIHdoaWNoIGFyZSByZXR1cm5lZCBhcmUgaW1wbGVtZW50ZWQgaW4KLSAgICAgKiBjbGFzcyB7QGxpbmsgTW9kaWZpZXJ9IHdoaWNoIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIHRoZSB0YXJnZXQuCisgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9kaWZpZXJzIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZAorICAgICAqIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGEgY29tYmluYXRpb24gb2YgYml0cworICAgICAqIGRlZmluZWQgYnkgY29uc3RhbnRzIGluIHRoZSB7QGxpbmsgTW9kaWZpZXJ9IGNsYXNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgbW9kaWZpZXJzCisgICAgICogQHJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CiAgICAgICAgIHJldHVybiBnZXRNb2RpZmllcnModGhpcywgZmFsc2UpOwpAQCAtOTMxLDIyICsxMDkwLDI0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRNb2RpZmllcnMoQ2xhc3M8Pz4gY2xhenosIGJvb2xlYW4gaWdub3JlSW5uZXJDbGFzc2VzQXR0cmliKTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cy4gRm9yIGEKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uIEZvciBhCiAgICAgICogZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCB3aGljaCBpcyB1c2VkLCBzZWUgdGhlIGNsYXNzIGRlZmluaXRpb24gb2YKICAgICAgKiB7QGxpbmsgQ2xhc3N9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgbmFtZS4KLSAgICAgKiBAc2VlIENsYXNzCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgU3RyaW5nIGdldE5hbWUoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSByZWNlaXZlciBhcyBkZWZpbmVkIGluIHRoZSBzb3VyY2UgY29kZS4gSWYKLSAgICAgKiB0aGVyZSBpcyBubyBuYW1lICh0aGUgY2xhc3MgaXMgYW5vbnltb3VzKSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgYW5kIGlmCi0gICAgICogdGhlIHJlY2VpdmVyIGlzIGFuIGFycmF5IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHVuZGVybHlpbmcgdHlwZSB3aXRoCi0gICAgICogc3F1YXJlIGJyYWNlcyBhcHBlbmRlZCAoZS5nLiA8Y29kZT4mcXVvdDtJbnRlZ2VyW10mcXVvdDs8L2NvZGU+KS4KKyAgICAgKiBSZXR1cm5zIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGFzCisgICAgICogZGVmaW5lZCBpbiB0aGUgc291cmNlIGNvZGUuIElmIHRoZXJlIGlzIG5vIG5hbWUgKHRoYXQgaXMsIHRoZSBjbGFzcyBpcworICAgICAqIGFub255bW91cykgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIElmIHRoZSByZWNlaXZlciBpcyBhbiBhcnJheQorICAgICAqIHRoZW4gdGhlIG5hbWUgb2YgdGhlIHVuZGVybHlpbmcgdHlwZSB3aXRoIHNxdWFyZSBicmFjZXMgYXBwZW5kZWQgKGZvcgorICAgICAqIGV4YW1wbGUge0Bjb2RlICZxdW90O0ludGVnZXJbXSZxdW90O30pIGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKICAgICAgICAgaWYgKGlzQXJyYXkoKSkgewpAQCAtOTc5LDM5ICsxMTQwLDQzIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGdldElubmVyQ2xhc3NOYW1lKCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUHJvdGVjdGlvbkRvbWFpbiBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICogY2xhc3MuCiAgICAgICogPHA+Ci0gICAgICogTm90ZTogSW4gb3JkZXIgdG8gY29uc2VydmUgc3BhY2UgaW4gZW1iZWRkZWQgdGFyZ2V0cywgd2UgYWxsb3cgdGhpcwotICAgICAqIG1ldGhvZCB0byBhbnN3ZXIgbnVsbCBmb3IgY2xhc3NlcyBpbiB0aGUgc3lzdGVtIHByb3RlY3Rpb24gZG9tYWluIChpLmUuCi0gICAgICogZm9yIHN5c3RlbSBjbGFzc2VzKS4gU3lzdGVtIGNsYXNzZXMgYXJlIGFsd2F5cyBnaXZlbiBmdWxsIHBlcm1pc3Npb25zCi0gICAgICogKGkuZS4gQWxsUGVybWlzc2lvbikuIFRoaXMgaXMgbm90IGNoYW5nZWFibGUgdmlhIHRoZQotICAgICAqIGphdmEuc2VjdXJpdHkuUG9saWN5LgorICAgICAqIE5vdGU6IEluIG9yZGVyIHRvIGNvbnNlcnZlIHNwYWNlIGluIGFuIGVtYmVkZGVkIHRhcmdldCBsaWtlIEFuZHJvaWQsIHdlCisgICAgICogYWxsb3cgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHtAY29kZSBudWxsfSBmb3IgY2xhc3NlcyBpbiB0aGUgc3lzdGVtCisgICAgICogcHJvdGVjdGlvbiBkb21haW4gKHRoYXQgaXMsIGZvciBzeXN0ZW0gY2xhc3NlcykuIFN5c3RlbSBjbGFzc2VzIGFyZQorICAgICAqIGFsd2F5cyBnaXZlbiBmdWxsIHBlcm1pc3Npb25zICh0aGF0IGlzLCBBbGxQZXJtaXNzaW9uKS4gVGhpcyBjYW4gbm90IGJlCisgICAgICogY2hhbmdlZCB0aHJvdWdoIHRoZSB7QGxpbmsgamF2YS5zZWN1cml0eS5Qb2xpY3l9IGNsYXNzLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFByb3RlY3Rpb25Eb21haW4gdGhlIHJlY2VpdmVyJ3MgUHJvdGVjdGlvbkRvbWFpbi4KLSAgICAgKiBAc2VlIENsYXNzCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICogICAgICAgICBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgbWVtYmVyCisgICAgICogICAgICAgICAgICAgYWNjZXNzLgogICAgICAqLwogICAgIHB1YmxpYyBQcm90ZWN0aW9uRG9tYWluIGdldFByb3RlY3Rpb25Eb21haW4oKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbWdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc21nciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjYWxsaW5nID0gVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGN1cnJlbnQgPSBnZXRDbGFzc0xvYWRlckltcGwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhbGxpbmcgIT0gbnVsbCAmJiAhY2FsbGluZy5nZXRDbGFzcygpLmlzSW5zdGFuY2UoY3VycmVudCkpIHsKLSAgICAgICAgICAgICAgICBzbWdyLmNoZWNrUGVybWlzc2lvbihuZXcgUnVudGltZVBlcm1pc3Npb24oImdldFByb3RlY3Rpb25Eb21haW4iKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTZWN1cml0eSBjaGVjayBpcyBpbmRlcGVuZGVudCBvZiBjYWxsaW5nIGNsYXNzIGxvYWRlci4KKyAgICAgICAgICAgIHNtZ3IuY2hlY2tQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigiZ2V0UHJvdGVjdGlvbkRvbWFpbiIpKTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcmV0dXJuIHBkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSByZWFkLW9ubHkgc3RyZWFtIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5Ci0gICAgICogcmVzTmFtZS4gVGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgcmVzb3VyY2UgbmFtZSBhbmQgdGhlIHN0cmVhbSBpcyBtYW5hZ2VkCi0gICAgICogYnkgdGhlIGNsYXNzJyBjbGFzcyBsb2FkZXIuCisgICAgICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgYnkge0Bjb2RlIHJlc05hbWV9LiBUaGUgbWFwcGluZworICAgICAqIGJldHdlZW4gdGhlIHJlc291cmNlIG5hbWUgYW5kIHRoZSBVUkwgaXMgbWFuYWdlZCBieSB0aGUgY2xhc3MnIGNsYXNzCisgICAgICogbG9hZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZXNOYW1lIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLSAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIG9uIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gcmVzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSdzIHtAY29kZSBVUkx9IG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoZSByZXNvdXJjZSBjYW4gbm90IGJlIGZvdW5kLgogICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyByZXNOYW1lKSB7CiAgICAgICAgIC8vIEdldCBhYnNvbHV0ZSByZXNvdXJjZSBuYW1lLCBidXQgd2l0aG91dCB0aGUgbGVhZGluZyBzbGFzaApAQCAtMTAzOSwxNCArMTIwNCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSByZWFkLW9ubHkgc3RyZWFtIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5Ci0gICAgICogcmVzTmFtZS4gVGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgcmVzb3VyY2UgbmFtZSBhbmQgdGhlIHN0cmVhbSBpcyBtYW5hZ2VkCi0gICAgICogYnkgdGhlIGNsYXNzJyBjbGFzcyBsb2FkZXIuCisgICAgICogUmV0dXJucyBhIHJlYWQtb25seSBzdHJlYW0gZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5CisgICAgICoge0Bjb2RlIHJlc05hbWV9LiBUaGUgbWFwcGluZyBiZXR3ZWVuIHRoZSByZXNvdXJjZSBuYW1lIGFuZCB0aGUgc3RyZWFtIGlzCisgICAgICogbWFuYWdlZCBieSB0aGUgY2xhc3MnIGNsYXNzIGxvYWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzTmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICogQHJldHVybiBhIHN0cmVhbSBvbiB0aGUgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIHJlc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlIG9yIHtAY29kZSBudWxsfSBpZiBubworICAgICAqICAgICAgICAgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgY2FuIGJlIGZvdW5kLgogICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIKLSAgICAgKi8KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlc05hbWUpIHsKICAgICAgICAgLy8gR2V0IGFic29sdXRlIHJlc291cmNlIG5hbWUsIGJ1dCB3aXRob3V0IHRoZSBsZWFkaW5nIHNsYXNoCiAgICAgICAgIGlmIChyZXNOYW1lLnN0YXJ0c1dpdGgoIi8iKSkgewpAQCAtMTA3MywxMSArMTI0MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpZ25lcnMgZm9yIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGUgcmVjZWl2ZXIsIG9yIG51bGwgaWYKLSAgICAgKiB0aGVyZSBhcmUgbm8gc2lnbmVycy4KKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduZXJzIGZvciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IG9yCisgICAgICoge0Bjb2RlIG51bGx9IGlmIGVpdGhlciB0aGVyZSBhcmUgbm8gc2lnbmVycyBvciB0aGlzIHtAY29kZSBDbGFzc30KKyAgICAgKiByZXByZXNlbnRzIGEgcHJpbWl0aXZlIHR5cGUgb3Igdm9pZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaWduZXJzIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiBAc2VlICNnZXRNZXRob2RzCisgICAgICogQHJldHVybiB0aGUgc2lnbmVycyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTaWduZXJzKCkgewogICAgICAgICAvLyBUT0RPIERlbGVnYXRlIHRoaXMgdG8gY2xhc3MgbG9hZGVyIHNvbWVob3c/IFdoYXQgYXJlIHRoZXNlIHNpZ25lcnM/CkBAIC0xMDg1LDM3ICsxMjU0LDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ2xhc3Mgd2hpY2ggcmVwcmVzZW50cyB0aGUgcmVjZWl2ZXIncyBzdXBlcmNsYXNzLiBGb3IgQ2xhc3NlcwotICAgICAqIHdoaWNoIHJlcHJlc2VudCBiYXNlIHR5cGVzLCBpbnRlcmZhY2VzLCBhbmQgZm9yIHtAbGluayBPYmplY3R9IHRoZSBtZXRob2QKLSAgICAgKiByZXR1cm5zIG51bGwuCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIENsYXNzfSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgc3VwZXJjbGFzcyBvZiB0aGUKKyAgICAgKiBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uIElmIHRoaXMge0Bjb2RlIENsYXNzfSByZXByZXNlbnRzCisgICAgICogdGhlIHtAY29kZSBPYmplY3R9IGNsYXNzLCBhIHByaW1pdGl2ZSB0eXBlLCBhbiBpbnRlcmZhY2Ugb3Igdm9pZCB0aGVuIHRoZQorICAgICAqIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4gSWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkKKyAgICAgKiBjbGFzcyB0aGVuIHRoZSB7QGNvZGUgT2JqZWN0fSBjbGFzcyBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHN1cGVyY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgQ2xhc3M8PyBzdXBlciBUPiBnZXRTdXBlcmNsYXNzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcy4gUmV0dXJucyBhbiBlbXB0eQotICAgICAqIGFycmF5IGlmIHRoZSBjbGFzcyBpcyBub3QgZ2VuZXJpYyBvciBkb2VzIG5vdCBtYWtlIHVzZSBvZiB0eXBlCi0gICAgICogdmFyaWFibGVzIG90aGVyd2lzZS4KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcge0Bjb2RlIFR5cGVWYXJpYWJsZX0gb2JqZWN0cyBmb3IgdHlwZQorICAgICAqIHZhcmlhYmxlcyBkZWNsYXJlZCBieSB0aGUgZ2VuZXJpYyBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZQorICAgICAqIENsYXNzfS4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgY2xhc3MgaXMgbm90IGdlbmVyaWMuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiB7QGxpbmsgVHlwZVZhcmlhYmxlfSBpbnN0YW5jZXMuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgIGNsYXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVHlwZVZhcmlhYmxlPENsYXNzPFQ+PltdIGdldFR5cGVQYXJhbWV0ZXJzKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgR2VuZXJpY1NpZ25hdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgR2VuZXJpY1NpZ25hdHVyZVBhcnNlcigpOwogICAgICAgICBwYXJzZXIucGFyc2VGb3JDbGFzcyh0aGlzLCBnZXRTaWduYXR1cmVBdHRyaWJ1dGUoKSk7CiAgICAgICAgIHJldHVybiBwYXJzZXIuZm9ybWFsVHlwZVBhcmFtZXRlcnMuY2xvbmUoKTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNsYXNzIGlzIGFuIGFubm90YXRpb24uCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbiBjbGFzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjbGFzcyBpcyBhbiBhbm5vdGF0aW9uLAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbgorICAgICAqICAgICAgICAgY2xhc3M7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbigpIHsKICAgICAgICAgZmluYWwgaW50IEFDQ19BTk5PVEFUSU9OID0gMHgyMDAwOyAgLy8gbm90IHB1YmxpYyBpbiByZWZsZWN0Lk1vZGlmaWVycwpAQCAtMTEyNCw4NiArMTI5NSwxMDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGFubm90YXRpb24gaXMgcHJlc2VudCBmb3IgdGhpcyBjbGFzcy4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaXMgcHJlc2VudCBmb3IgdGhlIGNsYXNzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MgVGhlIGFubm90YXRpb24gdG8gbG9vayBmb3IgaW4gdGhpcyBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIEEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudCwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30gaXMKKyAgICAgKiAgICAgICAgIGFubm90YXRlZCB3aXRoIHtAY29kZSBhbm5vdGF0aW9uQ2xhc3N9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb24oYW5ub3RhdGlvbkNsYXNzKSAhPSBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNsYXNzIHdhcyBhbm9ueW1vdXNseSBkZWNsYXJlZC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGlzCisgICAgICogYW5vbnltb3VzbHkgZGVjbGFyZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2xhc3MgaXMgYW5vbnltb3VzLAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcworICAgICAqICAgICAgICAgYW5vbnltb3VzOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBuYXRpdmUgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXNDbGFzcygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIGFuIGFycmF5IGNsYXNzLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30gaXMgYW4gYXJyYXkKKyAgICAgKiBjbGFzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIGFuIGFycmF5IGNsYXNzCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIGFycmF5IGNsYXNzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhbgorICAgICAqICAgICAgICAgYXJyYXkgY2xhc3M7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7CiAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnRUeXBlKCkgIT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50IGNhbiBiZSBjb252ZXJ0ZWQgdmlhCi0gICAgICogYW4gaWRlbnRpdHkgY29udmVyc2lvbiBvciBhIHdpZGVuaW5nIHJlZmVyZW5jZSBjb252ZXJzaW9uIChpLmUuIGlmIGVpdGhlcgotICAgICAqIHRoZSByZWNlaXZlciBvciB0aGUgYXJndW1lbnQgcmVwcmVzZW50IHByaW1pdGl2ZSB0eXBlcywgb25seSB0aGUgaWRlbnRpdHkKLSAgICAgKiBjb252ZXJzaW9uIGFwcGxpZXMpLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIHRoZSBjbGFzcworICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gQ29udmVyc2lvbiBtYXkgYmUgZG9uZSB2aWEgYW4gaWRlbnRpdHkKKyAgICAgKiBjb252ZXJzaW9uIG9yIGEgd2lkZW5pbmcgcmVmZXJlbmNlIGNvbnZlcnNpb24gKGlmIGVpdGhlciB0aGUgcmVjZWl2ZXIgb3IKKyAgICAgKiB0aGUgYXJndW1lbnQgcmVwcmVzZW50IHByaW1pdGl2ZSB0eXBlcywgb25seSB0aGUgaWRlbnRpdHkgY29udmVyc2lvbgorICAgICAqIGFwcGxpZXMpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGFyZ3VtZW50IGNhbiBiZSBhc3NpZ25lZCBpbnRvIHRoZQotICAgICAqICAgICAgICAgcmVjZWl2ZXIgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSBhcmd1bWVudCBjYW5ub3QgYmUgYXNzaWduZWQKLSAgICAgKiAgICAgICAgIGludG8gdGhlIHJlY2VpdmVyCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGUgY2xhc3MgdG8gdGVzdAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHBhcmFtZXRlciBpcyBudWxsCisgICAgICogQHBhcmFtIGNscworICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjbHN9IGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIGNsYXNzCisgICAgICogICAgICAgICByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc307IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY2xzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIG5hdGl2ZSBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oQ2xhc3M8Pz4gY2xzKTsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNsYXNzIGlzIGFuIDxjb2RlPmVudW08L2NvZGU+LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30gaXMgYW4KKyAgICAgKiB7QGNvZGUgZW51bX0uCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEVudW19LAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhbgorICAgICAqICAgICAgICAge0Bjb2RlIGVudW19OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW0oKSB7CiAgICAgICAgIHJldHVybiAoKGdldE1vZGlmaWVycygpICYgMHg0MDAwKSAhPSAwKSAmJiAoZ2V0U3VwZXJjbGFzcygpID09IEVudW0uY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgbm9uLW51bGwgYW5kIGNhbiBiZSBjYXN0IHRvIHRoZSB0eXBlIG9mCi0gICAgICogdGhlIHJlY2VpdmVyLiBUaGlzIGlzIHRoZSBydW50aW1lIHZlcnNpb24gb2YgdGhlIDxjb2RlPmluc3RhbmNlb2Y8L2NvZGU+Ci0gICAgICogb3BlcmF0b3IuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgY2FuIGJlIGNhc3QgdG8gdGhlIGNsYXNzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LiBUaGlzIGlzIHRoZSBydW50aW1lIHZlcnNpb24gb2YgdGhlCisgICAgICoge0Bjb2RlIGluc3RhbmNlb2Z9IG9wZXJhdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGFyZ3VtZW50IGNhbiBiZSBjYXN0IHRvIHRoZSB0eXBlIG9mIHRoZQotICAgICAqICAgICAgICAgcmVjZWl2ZXIgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSBhcmd1bWVudCBpcyBudWxsIG9yIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgY2FzdCB0byB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIKLSAgICAgKiBAcGFyYW0gb2JqZWN0IE9iamVjdCB0aGUgb2JqZWN0IHRvIHRlc3QKKyAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBvYmplY3R9IGNhbiBiZSBjYXN0IHRvIHRoZSB0eXBlCisgICAgICogICAgICAgICByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc307IHtAY29kZSBmYWxzZX0gaWYge0Bjb2RlCisgICAgICogICAgICAgICBvYmplY3R9IGlzIHtAY29kZSBudWxsfSBvciBjYW5ub3QgYmUgY2FzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNJbnN0YW5jZShPYmplY3Qgb2JqZWN0KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIGludGVyZmFjZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIENsYXNzfSByZXByZXNlbnRzIGFuIGludGVyZmFjZTsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc0ludGVyZmFjZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWNlaXZlciBpcyBkZWZpbmVkIGxvY2FsbHkuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBkZWZpbmVkCisgICAgICogbG9jYWxseS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGFzcyBpcyBsb2NhbCwgb3RoZXJ3aXNlCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcworICAgICAqICAgICAgICAgZGVmaW5lZCBsb2NhbGx5OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2FsQ2xhc3MoKSB7CiAgICAgICAgIGJvb2xlYW4gZW5jbG9zZWQgPSAoZ2V0RW5jbG9zaW5nTWV0aG9kKCkgIT0gbnVsbCB8fApAQCAtMTIxMiwyOCArMTM5NywzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjZWl2ZXIgaXMgYSBtZW1iZXIgY2xhc3MuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhIG1lbWJlcgorICAgICAqIGNsYXNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsYXNzIGlzIGEgbWVtYmVyIGNsYXNzLCBvdGhlcndpc2UKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGlzIGEKKyAgICAgKiAgICAgICAgIG1lbWJlciBjbGFzczsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNZW1iZXJDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIGdldERlY2xhcmluZ0NsYXNzKCkgIT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMgYSBiYXNlIHR5cGUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIGEgYmFzZSB0eXBlCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgZG9lcyBub3QgcmVwcmVzZW50IGEgYmFzZSB0eXBlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZTsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWNlaXZlciBpcyBhIHN5bnRoZXRpYyB0eXBlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMge0Bjb2RlIENsYXNzfSByZXByZXNlbnRzIGEgc3ludGhldGljIHR5cGUuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBzeW50aGV0aWMgdHlwZSBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYSBzeW50aGV0aWMgdHlwZTsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkgewogICAgICAgICBmaW5hbCBpbnQgQUNDX1NZTlRIRVRJQyA9IDB4MTAwMDsgICAvLyBub3QgcHVibGljIGluIHJlZmxlY3QuTW9kaWZpZXJzCkBAIC0xMjQyLDI3ICsxNDMxLDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhlIHJlY2VpdmVyLCBjcmVhdGVkCi0gICAgICogYnkgaW52b2tpbmcgdGhlIGRlZmF1bHQgKGkuZS4gemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuIElmIHRoZXJlIGlzIG5vCi0gICAgICogc3VjaCBjb25zdHJ1Y3Rvciwgb3IgaWYgdGhlIGNyZWF0aW9uIGZhaWxzIChlaXRoZXIgYmVjYXVzZSBvZiBhIGxhY2sgb2YKLSAgICAgKiBhdmFpbGFibGUgbWVtb3J5IG9yIGJlY2F1c2UgYW4gZXhjZXB0aW9uIGlzIHRocm93biBieSB0aGUgY29uc3RydWN0b3IpLAotICAgICAqIGFuIEluc3RhbnRpYXRpb25FeGNlcHRpb24gaXMgdGhyb3duLiBJZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBleGlzdHMsCi0gICAgICogYnV0IGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGNvbnRleHQgd2hlcmUgdGhpcyBtZXNzYWdlIGlzIHNlbnQsIGFuCi0gICAgICogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LAorICAgICAqIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIGRlZmF1bHQgKHRoYXQgaXMsIHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLiBJZgorICAgICAqIHRoZXJlIGlzIG5vIHN1Y2ggY29uc3RydWN0b3IsIG9yIGlmIHRoZSBjcmVhdGlvbiBmYWlscyAoZWl0aGVyIGJlY2F1c2Ugb2YKKyAgICAgKiBhIGxhY2sgb2YgYXZhaWxhYmxlIG1lbW9yeSBvciBiZWNhdXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgdGhlCisgICAgICogY29uc3RydWN0b3IpLCBhbiB7QGNvZGUgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duLiBJZiB0aGUgZGVmYXVsdAorICAgICAqIGNvbnN0cnVjdG9yIGV4aXN0cyBidXQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY29udGV4dCB3aGVyZSB0aGlzCisgICAgICogbWV0aG9kIGlzIGludm9rZWQsIGFuIHtAY29kZSBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhlIHJlY2VpdmVyLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IHZpc2libGUgdG8gdGhlCi0gICAgICogICAgICAgICBzZW5kZXIuCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIHRoZSBpbnN0YW5jZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IHZpc2libGUuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluc3RhbmNlIGNhbiBub3QgYmUgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgY3JlYXRpbmcKKyAgICAgKiAgICAgICAgICAgICBuZXcgaW5zdGFuY2VzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBuYXRpdmUgVCBuZXdJbnN0YW5jZSgpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uOworICAgIHB1YmxpYyBUIG5ld0luc3RhbmNlKCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tQdWJsaWNNZW1iZXJBY2Nlc3MoKTsgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2VJbXBsKCk7CisgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIFQgbmV3SW5zdGFuY2VJbXBsKCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKCkpIHsKQEAgLTEyNzMsMTAgKzE0NjgsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBQYWNrYWdlIG9mIHdoaWNoIHRoaXMgY2xhc3MgaXMgYSBtZW1iZXIuIEEgY2xhc3MgaGFzIGEKLSAgICAgKiBQYWNrYWdlIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIFNlY3VyZUNsYXNzTG9hZGVyCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFBhY2thZ2V9IG9mIHdoaWNoIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICoge0Bjb2RlIENsYXNzfSBpcyBhIG1lbWJlci4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgbm8ge0Bjb2RlIFBhY2thZ2V9CisgICAgICogb2JqZWN0IHdhcyBjcmVhdGVkIGJ5IHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIGNsYXNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gUGFja2FnZSB0aGUgUGFja2FnZSBvZiB3aGljaCB0aGlzIGNsYXNzIGlzIGEgbWVtYmVyIG9yIG51bGwKKyAgICAgKiBAcmV0dXJuIFBhY2thZ2UgdGhlIHtAY29kZSBQYWNrYWdlfSBvZiB3aGljaCB0aGlzIHtAY29kZSBDbGFzc30gaXMgYQorICAgICAqICAgICAgICAgbWVtYmVyIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGFja2FnZSBnZXRQYWNrYWdlKCkgewogICAgICAgICAvLyBUT0RPIFRoaXMgbWlnaHQgYmUgYSBoYWNrLCBidXQgdGhlIFZNIGRvZXNuJ3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IGluZm8uCkBAIC0xMjkxLDQwICsxNDg5LDU1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXNzZXJ0aW9uIHN0YXR1cyBmb3IgdGhpcyBjbGFzcy4gQXNzZXJ0aW9uIGlzCi0gICAgICogZW5hYmxlZC9kaXNhYmxlZCBiYXNlZCBvbiBjbGFzcyBsb2FkZXIgZGVmYXVsdCwgcGFja2FnZSBvciBjbGFzcyBkZWZhdWx0Ci0gICAgICogYXQgcnVudGltZQorICAgICAqIFJldHVybnMgdGhlIGFzc2VydGlvbiBzdGF0dXMgZm9yIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZQorICAgICAqIENsYXNzfS4gQXNzZXJ0aW9uIGlzIGVuYWJsZWQgLyBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgY2xhc3MgbG9hZGVyLAorICAgICAqIHBhY2thZ2Ugb3IgY2xhc3MgZGVmYXVsdCBhdCBydW50aW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFzc2VydGlvbiBzdGF0dXMgZm9yIHRoaXMgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBhc3NlcnRpb24gc3RhdHVzIGZvciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIENsYXNzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gZGVzaXJlZEFzc2VydGlvblN0YXR1cygpOwogCiAgICAgLyoqCi0gICAgICogQ2FzdHMgdGhlIHJlY2VpdmVyIHRvIGEgc3ViY2xhc3Mgb2YgdGhlIGdpdmVuIGNsYXNzLiAgSWYgc3VjY2Vzc2Z1bAotICAgICAqIHJldHVybnMgdGhlIHJlY2VpdmVyLCBvdGhlcndpc2UgaWYgdGhlIGNhc3QgY2Fubm90IGJlIG1hZGUgdGhyb3dzIGEKLSAgICAgKiA8Y29kZT5DbGFzc0Nhc3RFeGNlcHRpb248L2NvZGU+LgorICAgICAqIENhc3RzIHRoaXMge0Bjb2RlIENsYXNzfSB0byByZXByZXNlbnQgYSBzdWJjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgorICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoaXMge0Bjb2RlIENsYXNzfSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlIGEge0Bjb2RlCisgICAgICogQ2xhc3NDYXN0RXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGNsYXp6IHRoZSByZXF1aXJlZCB0eXBlLgotICAgICAqIEByZXR1cm4gdGhpcyBjbGFzcyBjYXN0IGFzIGEgc3ViY2xhc3Mgb2YgdGhlIGdpdmVuIHR5cGUuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBjYXN0IHRvIHRoZSBnaXZlbiB0eXBlLgorICAgICAqIEBwYXJhbSBjbGF6egorICAgICAqICAgICAgICAgICAgdGhlIHJlcXVpcmVkIHR5cGUuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBDbGFzc30gY2FzdCBhcyBhIHN1YmNsYXNzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IGNhbm5vdCBiZSBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFU+IENsYXNzPD8gZXh0ZW5kcyBVPiBhc1N1YmNsYXNzKENsYXNzPFU+IGNsYXp6KSB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3M8PyBleHRlbmRzIFU+KXRoaXM7CisgICAgICAgIGlmIChjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm4gKENsYXNzPD8gZXh0ZW5kcyBVPil0aGlzOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYXN0IHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIHR5cGUgPGNvZGU+VDwvY29kZT4uCi0gICAgICogSWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgcmVzdWx0IGlzIGFsc28KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBDYXN0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uCisgICAgICogSWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0gdGhlbiB0aGUgcmVzdWx0IGlzIGFsc28ge0Bjb2RlIG51bGx9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBjYXN0Ci0gICAgICogQHJldHVybiBUaGUgb2JqZWN0IHRoYXQgaGFzIGJlZW4gY2FzdC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBjYXN0IHRvIHRoZSBnaXZlbiB0eXBlLgorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY2FzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBoYXMgYmVlbiBjYXN0LgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIFQgY2FzdChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiAoVClvYmo7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0luc3RhbmNlKG9iaikpIHsKKyAgICAgICAgICAgIHJldHVybiAoVClvYmo7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM5NSwxNyArMTYwOCwzIEBACiAgICAgfQogICAgIAogfQotCi0vKioKLSAqIFRPRE8gT3BlbiBpc3N1ZXMKLSAqIC0gQ2hlY2sgd2hldGhlciBjb250cmFjdHMgb2YgYWxsIChuYXRpdmUpIG1ldGhvZHMgYXJlIG9rLiBTb21lIHJldHVybiBudWxsLAotICogICBvdGhlcnMgcmV0dXJuIGVtcHR5IGFycmF5cy4gU2FtZSB0aHJvdyBleGNlcHRpb25zLCBvdGhlciBkb24ndC4KLSAqIC0gQ2hlY2sgd2hldGhlciByZWZsZWN0aW9uIG1ldGhvZHMgZm9yIGxpc3RzIG9mIGZpZWxkcyBldGMuIGFyZSBvay4gU29tZSB0YWtlCi0gKiAgIHN1cGVyY2xhc3NlcyBpbnRvIGFjY291bnQsIG90aGVycyBkb24ndC4KLSAqIC0gQ2hlY2sgd2hldGhlciBoYW5kbGluZyBvZiBuYW1pbmcgZm9yIHByaW1pdGl2ZSBjbGFzc2VzIGlzIG9rLgotICogLSBTZWFyY2hpbmcgZm9yIHNwZWNpZmljIG1lbWJlcnMgY291bGQgYmUgaW1wbGVtZW50ZWQgbW9yZSBlZmZpY2VudGx5LgotICogLSBUZXN0IGdldEludGVyZmFjZXMoKQotICogLSBUZXN0IGdldEVudW1Db25zdGFudHMoKQotICogLSBDaGVjayB2YXJpb3VzIFRPRE9zIGluIGNvZGUuCi0gKiAtIENvbXBsZXRlIHRpY2tldAotICovCmRpZmYgLS1naXQgYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzc0NhY2hlLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzc0NhY2hlLmphdmEKaW5kZXggYzdlMDg3Yy4uNWVhNjk5MiAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NDYWNoZS5qYXZhCisrKyBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzQ2FjaGUuamF2YQpAQCAtNjgsNiArNjgsMTggQEAKICAgICAvKiogbnVsbC1vazsgbGlzdCBvZiBhbGwgcHVibGljIG1ldGhvZHMsIGJvdGggZGlyZWN0IGFuZCBpbmhlcml0ZWQgKi8KICAgICBwcml2YXRlIHZvbGF0aWxlIE1ldGhvZFtdIGFsbFB1YmxpY01ldGhvZHM7CiAKKyAgICAvKiogbnVsbC1vazsgbGlzdCBvZiBhbGwgZGVjbGFyZWQgZmllbGRzICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBGaWVsZFtdIGRlY2xhcmVkRmllbGRzOworCisgICAgLyoqIG51bGwtb2s7IGxpc3Qgb2YgYWxsIHB1YmxpYyBkZWNsYXJlZCBmaWVsZHMgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIEZpZWxkW10gZGVjbGFyZWRQdWJsaWNGaWVsZHM7CisKKyAgICAvKiogbnVsbC1vazsgbGlzdCBvZiBhbGwgZmllbGRzLCBib3RoIGRpcmVjdCBhbmQgaW5oZXJpdGVkICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBGaWVsZFtdIGFsbEZpZWxkczsKKworICAgIC8qKiBudWxsLW9rOyBsaXN0IG9mIGFsbCBwdWJsaWMgZmllbGRzLCBib3RoIGRpcmVjdCBhbmQgaW5oZXJpdGVkICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBGaWVsZFtdIGFsbFB1YmxpY0ZpZWxkczsKKwogICAgIC8qKgogICAgICAqIG51bGwtb2s7IGFycmF5IG9mIGVudW1lcmF0ZWQgdmFsdWVzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLCBpZiB0aGlzCiAgICAgICogaW5zdGFuY2UncyBjbGFzcyBpcyBhbiBlbnVtZXJhdGlvbgpAQCAtMTI1LDYgKzEzNywxMCBAQAogICAgICAgICB0aGlzLmFsbFB1YmxpY01ldGhvZHMgPSBudWxsOwogICAgICAgICB0aGlzLmVudW1WYWx1ZXNJbk9yZGVyID0gbnVsbDsKICAgICAgICAgdGhpcy5lbnVtVmFsdWVzQnlOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5kZWNsYXJlZEZpZWxkcyA9IG51bGw7CisgICAgICAgIHRoaXMuZGVjbGFyZWRQdWJsaWNGaWVsZHMgPSBudWxsOworICAgICAgICB0aGlzLmFsbEZpZWxkcyA9IG51bGw7CisgICAgICAgIHRoaXMuYWxsUHVibGljRmllbGRzID0gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTIwNCw3ICsyMjAsNyBAQAogICAgICAgICBBcnJheUxpc3Q8TWV0aG9kPiBtZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7CiAgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBzZWVuID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogCi0gICAgICAgIGdldEZ1bGxMaXN0T2ZNZXRob2RzKGNsYXp6LCBtZXRob2RzLCBzZWVuLCBwdWJsaWNPbmx5KTsKKyAgICAgICAgZmluZEFsbE1ldGhvZHMoY2xhenosIG1ldGhvZHMsIHNlZW4sIHB1YmxpY09ubHkpOwogICAgICAgICAKICAgICAgICAgcmV0dXJuIG1ldGhvZHMudG9BcnJheShuZXcgTWV0aG9kW21ldGhvZHMuc2l6ZSgpXSk7CiAgICAgfQpAQCAtMjIyLDcgKzIzOCw3IEBACiAgICAgICogQHBhcmFtIHB1YmxpY09ubHkgcmVmbGVjdHMgd2hldGhlciB3ZSB3YW50IG9ubHkgcHVibGljIG1ldGhvZHMKICAgICAgKiBvciBhbGwgb2YgdGhlbQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RnVsbExpc3RPZk1ldGhvZHMoQ2xhc3M8Pz4gY2xhenosCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kQWxsTWV0aG9kcyhDbGFzczw/PiBjbGF6eiwKICAgICAgICAgICAgIEFycmF5TGlzdDxNZXRob2Q+IG1ldGhvZHMsIEhhc2hTZXQ8U3RyaW5nPiBzZWVuLAogICAgICAgICAgICAgYm9vbGVhbiBwdWJsaWNPbmx5KSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC0yMzQsMTEgKzI1MCwxMSBAQAogICAgICAgICAgICAgICAgIGNsYXp6LmdldENsYXNzQ2FjaGUoKS5nZXREZWNsYXJlZE1ldGhvZHMocHVibGljT25seSk7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZGVjbGFyZWRNZXRob2RzLmxlbmd0aDsKICAgICAgICAgICAgIGlmIChsZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBkZWNsYXJlZE1ldGhvZHMpIHsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRlY2xhcmVkTWV0aG9kc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJygnKTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz5bXSB0eXBlcyA9IGRlY2xhcmVkTWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgICAgICBDbGFzczw/PltdIHR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZXNbMF0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgdHlwZXMubGVuZ3RoOyBqKyspIHsKQEAgLTI1MCw3ICsyNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKGRlY2xhcmVkTWV0aG9kc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQoc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTI2MSw4ICsyNzcsOCBAQAogICAgICAgICAKICAgICAgICAgLy8gVHJhdmVyc2UgYWxsIGludGVyZmFjZXMsIGFuZCBkbyB0aGUgc2FtZSByZWN1cnNpdmVseS4KICAgICAgICAgQ2xhc3M8Pz5bXSBpbnRlcmZhY2VzID0gb3JpZ0NsYXNzLmdldEludGVyZmFjZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBnZXRGdWxsTGlzdE9mTWV0aG9kcyhpbnRlcmZhY2VzW2ldLCBtZXRob2RzLCBzZWVuLCBwdWJsaWNPbmx5KTsKKyAgICAgICAgZm9yIChDbGFzczw/PiBpbnRmIDogaW50ZXJmYWNlcykgeworICAgICAgICAgICAgZmluZEFsbE1ldGhvZHMoaW50ZiwgbWV0aG9kcywgc2VlbiwgcHVibGljT25seSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI3MywxMCArMjg5LDEzIEBACiAgICAgICogQHBhcmFtIGxpc3Qgbm9uLW51bGw7IHRoZSBsaXN0IG9mIG1ldGhvZHMgdG8gc2VhcmNoIHRocm91Z2gKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgbm9uLW51bGw7IHRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3QKICAgICAgKiBAcmV0dXJuIG5vbi1udWxsOyB0aGUgbWF0Y2hpbmcgbWV0aG9kCi0gICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNwZXRpb24gdGhyb3duIGlmIHRoZSBtZXRob2QgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIG1ldGhvZCBkb2VzIG5vdCBleGlzdAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1hdGNoaW5nTWV0aG9kKE1ldGhvZFtdIGxpc3QsIFN0cmluZyBuYW1lLAorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpbmRNZXRob2RCeU5hbWUoTWV0aG9kW10gbGlzdCwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJNZXRob2QgbmFtZSBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gbGlzdFtpXTsKICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSAKQEAgLTM0OCw2ICszNjcsMTczIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgZGVjbGFyZWQgZmllbGRzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gbm9uLW51bGw7IHRoZSBsaXN0IG9mIGFsbCBkZWNsYXJlZCBmaWVsZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKKyAgICAgICAgaWYgKGRlY2xhcmVkRmllbGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlY2xhcmVkRmllbGRzID0gQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoY2xhenosIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWNsYXJlZEZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCBkZWNsYXJlZCBwdWJsaWMgZmllbGRzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gbm9uLW51bGw7IHRoZSBsaXN0IG9mIGFsbCBkZWNsYXJlZCBwdWJsaWMgZmllbGRzCisgICAgICovCisgICAgcHVibGljIEZpZWxkW10gZ2V0RGVjbGFyZWRQdWJsaWNGaWVsZHMoKSB7CisgICAgICAgIGlmIChkZWNsYXJlZFB1YmxpY0ZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWNsYXJlZFB1YmxpY0ZpZWxkcyA9IENsYXNzLmdldERlY2xhcmVkRmllbGRzKGNsYXp6LCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWNsYXJlZFB1YmxpY0ZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGVpdGhlciB0aGUgbGlzdCBvZiBkZWNsYXJlZCBmaWVsZHMgb3IgdGhlIGxpc3Qgb2YgZGVjbGFyZWQKKyAgICAgKiBwdWJsaWMgZmllbGRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwdWJsaWNPbmx5IHdoZXRoZXIgdG8gb25seSByZXR1cm4gcHVibGljIGZpZWxkcworICAgICAqLworICAgIHB1YmxpYyBGaWVsZFtdIGdldERlY2xhcmVkRmllbGRzKGJvb2xlYW4gcHVibGljT25seSkgeworICAgICAgICByZXR1cm4gcHVibGljT25seSA/IGdldERlY2xhcmVkUHVibGljRmllbGRzKCkgOiBnZXREZWNsYXJlZEZpZWxkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGZpZWxkcywgYm90aCBkaXJlY3RseQorICAgICAqIGRlY2xhcmVkIGFuZCBpbmhlcml0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBub24tbnVsbDsgdGhlIGxpc3Qgb2YgYWxsIGZpZWxkcworICAgICAqLworICAgIHB1YmxpYyBGaWVsZFtdIGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgaWYgKGFsbEZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBhbGxGaWVsZHMgPSBnZXRGdWxsTGlzdE9mRmllbGRzKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhbGxGaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgcHVibGljIGZpZWxkcywgYm90aCBkaXJlY3RseQorICAgICAqIGRlY2xhcmVkIGFuZCBpbmhlcml0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBub24tbnVsbDsgdGhlIGxpc3Qgb2YgYWxsIHB1YmxpYyBmaWVsZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRbXSBnZXRBbGxQdWJsaWNGaWVsZHMoKSB7CisgICAgICAgIGlmIChhbGxQdWJsaWNGaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgYWxsUHVibGljRmllbGRzID0gZ2V0RnVsbExpc3RPZkZpZWxkcyh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhbGxQdWJsaWNGaWVsZHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZpZWxkcyB3aXRob3V0IHBlcmZvcm1pbmcgYW55IHNlY3VyaXR5IGNoZWNrcworICAgICAqIGZpcnN0LiBUaGlzIGluY2x1ZGVzIHRoZSBmaWVsZHMgaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzLiBJZiBubworICAgICAqIGZpZWxkcyBleGlzdCBhdCBhbGwsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwdWJsaWNPbmx5IHJlZmxlY3RzIHdoZXRoZXIgd2Ugd2FudCBvbmx5IHB1YmxpYyBmaWVsZHMKKyAgICAgKiBvciBhbGwgb2YgdGhlbQorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmllbGRzIAorICAgICAqLworICAgIHByaXZhdGUgRmllbGRbXSBnZXRGdWxsTGlzdE9mRmllbGRzKGJvb2xlYW4gcHVibGljT25seSkgeworICAgICAgICBBcnJheUxpc3Q8RmllbGQ+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RmllbGQ+KCk7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBzZWVuID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgICAgIGZpbmRBbGxmaWVsZHMoY2xhenosIGZpZWxkcywgc2VlbiwgcHVibGljT25seSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gZmllbGRzLnRvQXJyYXkobmV3IEZpZWxkW2ZpZWxkcy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0cyB0aGUgbGlzdCBvZiBmaWVsZHMgd2l0aG91dCBwZXJmb3JtaW5nIGFueSBzZWN1cml0eSBjaGVja3MKKyAgICAgKiBmaXJzdC4gVGhpcyBpbmNsdWRlcyB0aGUgZmllbGRzIGluaGVyaXRlZCBmcm9tIHN1cGVyY2xhc3NlcyBhbmQgZnJvbQorICAgICAqIGFsbCBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzLiBUaGUgbGF0dGVyIG1heSBhbHNvIGltcGxlbWVudCBtdWx0aXBsZQorICAgICAqIGludGVyZmFjZXMsIHNvIHdlIChwb3RlbnRpYWxseSkgcmVjdXJzaXZlbHkgd2FsayB0aHJvdWdoIGEgd2hvbGUgdHJlZSBvZgorICAgICAqIGNsYXNzZXMuIElmIG5vIGZpZWxkcyBleGlzdCBhdCBhbGwsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGF6eiBub24tbnVsbDsgY2xhc3MgdG8gaW5zcGVjdAorICAgICAqIEBwYXJhbSBmaWVsZHMgbm9uLW51bGw7IHRoZSB0YXJnZXQgbGlzdCB0byBhZGQgdGhlIHJlc3VsdHMgdG8KKyAgICAgKiBAcGFyYW0gc2VlbiBub24tbnVsbDsgYSBzZXQgb2Ygc2lnbmF0dXJlcyB3ZSd2ZSBhbHJlYWR5IHNlZW4KKyAgICAgKiBAcGFyYW0gcHVibGljT25seSByZWZsZWN0cyB3aGV0aGVyIHdlIHdhbnQgb25seSBwdWJsaWMgZmllbGRzCisgICAgICogb3IgYWxsIG9mIHRoZW0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbmRBbGxmaWVsZHMoQ2xhc3M8Pz4gY2xhenosCisgICAgICAgICAgICBBcnJheUxpc3Q8RmllbGQ+IGZpZWxkcywgSGFzaFNldDxTdHJpbmc+IHNlZW4sCisgICAgICAgICAgICBib29sZWFuIHB1YmxpY09ubHkpIHsKKyAgICAgICAgCisgICAgICAgIC8vIFRyYXZlcnNlIGNsYXNzIGFuZCBzdXBlcmNsYXNzZXMsIGdldCByaWQgb2YgZHVwZXMgYnkgc2lnbmF0dXJlCisgICAgICAgIHdoaWxlIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWVsZFtdIGRlY2xhcmVkRmllbGRzID0KKyAgICAgICAgICAgICAgICAgICAgY2xhenouZ2V0Q2xhc3NDYWNoZSgpLmdldERlY2xhcmVkRmllbGRzKHB1YmxpY09ubHkpOworICAgICAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGRlY2xhcmVkRmllbGRzKSB7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gZmllbGQudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlZW4uY29udGFpbnMoc2lnbmF0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICBmaWVsZHMuYWRkKGZpZWxkKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRyYXZlcnNlIGFsbCBpbnRlcmZhY2VzLCBhbmQgZG8gdGhlIHNhbWUgcmVjdXJzaXZlbHkuCisgICAgICAgICAgICBDbGFzczw/PltdIGludGVyZmFjZXMgPSBjbGF6ei5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICBmb3IgKENsYXNzPD8+IGludGYgOiBpbnRlcmZhY2VzKSB7CisgICAgICAgICAgICAgICAgZmluZEFsbGZpZWxkcyhpbnRmLCBmaWVsZHMsIHNlZW4sIHB1YmxpY09ubHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGFuZCByZXR1cm5zIGEgZmllbGQgd2l0aCBhIGdpdmVuIG5hbWUgYW5kIHNpZ25hdHVyZS4gVXNlCisgICAgICogdGhpcyB3aXRoIG9uZSBvZiB0aGUgZmllbGQgbGlzdHMgcmV0dXJuZWQgYnkgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3Qgbm9uLW51bGw7IHRoZSBsaXN0IG9mIGZpZWxkcyB0byBzZWFyY2ggdGhyb3VnaAorICAgICAqIEByZXR1cm4gbm9uLW51bGw7IHRoZSBtYXRjaGluZyBmaWVsZAorICAgICAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmllbGQgZmluZEZpZWxkQnlOYW1lKEZpZWxkW10gbGlzdCwgU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkZpZWxkIG5hbWUgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gbGlzdFtpXTsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRmllbGRFeGNlcHRpb24obmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5IG9mIGZpZWxkcy4gVGhpcyBpcyB1c2VmdWwKKyAgICAgKiB3aGVuIGhhbmRpbmcgb3V0IGFycmF5cyBmcm9tIHRoZSBwdWJsaWMgQVBJLgorICAgICAqIAorICAgICAqIDxwPjxiPk5vdGU6PC9iPiBJbiBzdWNoIGNhc2VzLCBpdCBpcyBpbnN1ZmZpY2llbnQgdG8ganVzdCBtYWtlCisgICAgICogYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFycmF5LCBzaW5jZSBmaWVsZCBvYmplY3RzIGFyZW4ndAorICAgICAqIGltbXV0YWJsZSBkdWUgdG8gdGhlIGV4aXN0ZW5jZSBvZiB7QGxpbmsKKyAgICAgKiBBY2Nlc3NpYmxlT2JqZWN0I3NldEFjY2Vzc2libGV9LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcmlnIG5vbi1udWxsOyBhcnJheSB0byBjb3B5CisgICAgICogQHJldHVybiBub24tbnVsbDsgYSBkZWVwIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWVsZFtdIGRlZXBDb3B5KEZpZWxkW10gb3JpZykgeworICAgICAgICBpbnQgbGVuZ3RoID0gb3JpZy5sZW5ndGg7CisgICAgICAgIEZpZWxkW10gcmVzdWx0ID0gbmV3IEZpZWxkW2xlbmd0aF07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBSRUZMRUNULmNsb25lKG9yaWdbaV0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHZXRzIHRoZSBlbnVtZXJhdGVkIHZhbHVlIHdpdGggYSBnaXZlbiBuYW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lIG5vbi1udWxsOyBuYW1lIG9mIHRoZSB2YWx1ZQpAQCAtNDQ0LDcgKzYzMCw3IEBACiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBnZXREZWNsYXJlZFB1YmxpY01ldGhvZHMoKTsKLSAgICAgICAgICAgIG1ldGhvZCA9IGdldE1hdGNoaW5nTWV0aG9kKG1ldGhvZHMsICJ2YWx1ZXMiLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICBtZXRob2QgPSBmaW5kTWV0aG9kQnlOYW1lKG1ldGhvZHMsICJ2YWx1ZXMiLCAoQ2xhc3NbXSkgbnVsbCk7CiAgICAgICAgICAgICBtZXRob2QgPSBSRUZMRUNULmFjY2Vzc2libGVDbG9uZShtZXRob2QpOwogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBpZiB0aGUgY2xhc3MgaXMgYSB3ZWxsLWZvcm1lZCBlbnVtLgpAQCAtNDg1LDcgKzY3MSw3IEBACiAgICAgICAgICAgICBDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoQWNjZXNzaWJsZU9iamVjdC5jbGFzcywgZmFsc2UpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0TWF0Y2hpbmdNZXRob2QobWV0aG9kcywgImdldFJlZmxlY3Rpb25BY2Nlc3MiLAorICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGZpbmRNZXRob2RCeU5hbWUobWV0aG9kcywgImdldFJlZmxlY3Rpb25BY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICAoQ2xhc3NbXSkgbnVsbCk7CiAgICAgICAgICAgICBDbGFzcy5zZXRBY2Nlc3NpYmxlTm9DaGVjayhtZXRob2QsIHRydWUpOwogICAgICAgICAgICAgcmV0dXJuIChSZWZsZWN0aW9uQWNjZXNzKSBtZXRob2QuaW52b2tlKChPYmplY3RbXSkgbnVsbCk7CmRpZmYgLS1naXQgYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzc0xvYWRlci5qYXZhIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuamF2YQppbmRleCBkNTdhYmViLi45NWJmZDQxIDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzc0xvYWRlci5qYXZhCisrKyBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzTG9hZGVyLmphdmEKQEAgLTMxLDQxICszMSw0NCBAQAogaW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1TdGFjazsKIAogLyoqCisgKiBMb2FkcyBjbGFzc2VzIGFuZCByZXNvdXJjZXMgZnJvbSBhIHJlcG9zaXRvcnkuIE9uZSBvciBtb3JlIGNsYXNzIGxvYWRlcnMgYXJlCisgKiBpbnN0YWxsZWQgYXQgcnVudGltZS4gVGhlc2UgYXJlIGNvbnN1bHRlZCB3aGVuZXZlciB0aGUgcnVudGltZSBzeXN0ZW0gbmVlZHMgYQorICogc3BlY2lmaWMgY2xhc3MgdGhhdCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbi1tZW1vcnkuIFR5cGljYWxseSwgY2xhc3MgbG9hZGVycworICogYXJlIGdyb3VwZWQgaW50byBhIHRyZWUgd2hlcmUgY2hpbGQgY2xhc3MgbG9hZGVycyBkZWxlZ2F0ZSBhbGwgcmVxdWVzdHMgdG8KKyAqIHBhcmVudCBjbGFzcyBsb2FkZXJzLiBPbmx5IGlmIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIGNhbm5vdCBzYXRpc2Z5IHRoZQorICogcmVxdWVzdCwgdGhlIGNoaWxkIGNsYXNzIGxvYWRlciBpdHNlbGYgdHJpZXMgdG8gaGFuZGxlIGl0LgogICogPHA+Ci0gKiBBIENsYXNzTG9hZGVyIGlzIHVzZWQgZm9yIGxvYWRpbmcgY2xhc3Nlcy4KKyAqIHtAY29kZSBDbGFzc0xvYWRlcn0gaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb21tb24KKyAqIGluZnJhc3RydWN0dXJlIHJlcXVpcmVkIGJ5IGFsbCBjbGFzcyBsb2FkZXJzLiBBbmRyb2lkIHByb3ZpZGVzIHNldmVyYWwKKyAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgY2xhc3MsIHdpdGgKKyAqIHtAbGluayBkYWx2aWsuc3lzdGVtLlBhdGhDbGFzc0xvYWRlcn0gYmVpbmcgdGhlIG9uZSB0eXBpY2FsbHkgdXNlZC4gT3RoZXIKKyAqIGFwcGxpY2F0aW9ucyBtYXkgaW1wbGVtZW50IHN1YmNsYXNzZXMgb2Yge0Bjb2RlIENsYXNzTG9hZGVyfSB0byBwcm92aWRlCisgKiBzcGVjaWFsIHdheXMgZm9yIGxvYWRpbmcgY2xhc3Nlcy4KICAqIDwvcD4KICAqIAotICogPGg0PlZNIEltcGxlbWVudG9ycyBOb3RlPC9oND4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBWTS4gVGhlIGRvY3VtZW50ZWQgbWV0aG9kcyBhbmQgbmF0aXZlcwotICogbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IG90aGVyIHByb3ZpZGVkIGNsYXNzIGltcGxlbWVudGF0aW9ucyBpbiB0aGlzCi0gKiBwYWNrYWdlLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqIEBzZWUgQ2xhc3MKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzTG9hZGVyIHsKIAotLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCiAgICAgLyoKLSAgICAgKiBCZWNhdXNlIG9mIGEgcG90ZW50aWFsIGNsYXNzIGluaXRpYWxpemF0aW9uIHJhY2UgYmV0d2VlbiBDbGFzc0xvYWRlcgotICAgICAqIGFuZCBqYXZhLmxhbmcuU3lzdGVtLCByZXByb2R1Y2libGUgd2hlbiB1c2luZyBKRFdQIHdpdGggInN1c3BlbmQ9eSIsCi0gICAgICogd2UgZGVmZXIgY3JlYXRpb24gb2YgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgdW50aWwgZmlyc3QgdXNlLiAgV2UKLSAgICAgKiB1c2UgYSBzdGF0aWMgaW5uZXIgY2xhc3MgdG8gZ2V0IHN5bmNocm9uaXphdGlvbiBhdCBpbml0IHRpbWUgd2l0aG91dAotICAgICAqIGhhdmluZyB0byBzeW5jIG9uIGV2ZXJ5IGFjY2Vzcy4KKyAgICAgKiBCZWNhdXNlIG9mIGEgcG90ZW50aWFsIGNsYXNzIGluaXRpYWxpemF0aW9uIHJhY2UgYmV0d2VlbiBDbGFzc0xvYWRlciBhbmQKKyAgICAgKiBqYXZhLmxhbmcuU3lzdGVtLCByZXByb2R1Y2libGUgd2hlbiB1c2luZyBKRFdQIHdpdGggInN1c3BlbmQ9eSIsIHdlIGRlZmVyCisgICAgICogY3JlYXRpb24gb2YgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgdW50aWwgZmlyc3QgdXNlLiBXZSB1c2UgYSBzdGF0aWMKKyAgICAgKiBpbm5lciBjbGFzcyB0byBnZXQgc3luY2hyb25pemF0aW9uIGF0IGluaXQgdGltZSB3aXRob3V0IGhhdmluZyB0byBzeW5jIG9uCisgICAgICogZXZlcnkgYWNjZXNzLgogICAgICAqLwotLy8gRU5EIGFuZHJvaWQtbm90ZQotCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgIC8qKgogICAgICAqIFRoZSAnU3lzdGVtJyBDbGFzc0xvYWRlciAtIHRoZSBvbmUgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZwotICAgICAqIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NwYXRoLiBJdCBpcyBub3QgZXF1YWwgdG8gdGhlICBib290c3RyYXAgY2xhc3MKLSAgICAgKiBsb2FkZXIgLSB0aGF0IG9uZSBoYW5kbGVzIHRoZSBidWlsdC1pbiBjbGFzc2VzLgotICAgICAqCisgICAgICogY2xhc3NlcyBmcm9tIHRoZSBjbGFzc3BhdGguIEl0IGlzIG5vdCBlcXVhbCB0byB0aGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlciAtCisgICAgICogdGhhdCBvbmUgaGFuZGxlcyB0aGUgYnVpbHQtaW4gY2xhc3Nlcy4KKyAgICAgKiAKICAgICAgKiBAc2VlICNnZXRTeXN0ZW1DbGFzc0xvYWRlcigpCiAgICAgICovCiAgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU3lzdGVtQ2xhc3NMb2FkZXIgewotICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGxvYWRlcj0gQ2xhc3NMb2FkZXIuY3JlYXRlU3lzdGVtQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBsb2FkZXIgPSBDbGFzc0xvYWRlci5jcmVhdGVTeXN0ZW1DbGFzc0xvYWRlcigpOwogICAgIH07CiAKICAgICAvKioKQEAgLTc5LDUzICs4Miw1MSBAQAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgUGFja2FnZT4gcGFja2FnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhY2thZ2U+KCk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoaXMgaXMgTk9UIHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyICh3aGljaCBpcyBtYW5hZ2VkIGJ5Ci0gICAgICogdGhlIFZNKS4gIFdlIHVzZSBhIG51bGwgdmFsdWUgZm9yIHRoZSBwYXJlbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGUKLSAgICAgKiBib290c3RyYXAgbG9hZGVyIGlzIG91ciBwYXJlbnQuCisgICAgICogQ3JlYXRlIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLiBOb3RlIHRoaXMgaXMgTk9UIHRoZSBib290c3RyYXAgY2xhc3MKKyAgICAgKiBsb2FkZXIgKHdoaWNoIGlzIG1hbmFnZWQgYnkgdGhlIFZNKS4gV2UgdXNlIGEgbnVsbCB2YWx1ZSBmb3IgdGhlIHBhcmVudAorICAgICAqIHRvIGluZGljYXRlIHRoYXQgdGhlIGJvb3RzdHJhcCBsb2FkZXIgaXMgb3VyIHBhcmVudC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVTeXN0ZW1DbGFzc0xvYWRlcigpIHsKICAgICAgICAgU3RyaW5nIGNsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIiwgIi4iKTsKIAotLy8gICAgICAgIFN0cmluZ1tdIHBhdGhzID0gY2xhc3NQYXRoLnNwbGl0KCI6Iik7Ci0vLyAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbcGF0aHMubGVuZ3RoXTsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IFVSTCgiZmlsZTovLyIgKyBwYXRoc1tpXSk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotLy8gICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgICAgIAotLy8gICAgICAgIHJldHVybiBuZXcgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIodXJscywgbnVsbCk7ICAKLSAgICAgICAgCisgICAgICAgIC8vIFN0cmluZ1tdIHBhdGhzID0gY2xhc3NQYXRoLnNwbGl0KCI6Iik7CisgICAgICAgIC8vIFVSTFtdIHVybHMgPSBuZXcgVVJMW3BhdGhzLmxlbmd0aF07CisgICAgICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgLy8gdHJ5IHsKKyAgICAgICAgLy8gdXJsc1tpXSA9IG5ldyBVUkwoImZpbGU6Ly8iICsgcGF0aHNbaV0pOworICAgICAgICAvLyB9CisgICAgICAgIC8vIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgLy8gZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gfQorICAgICAgICAvLyAgICAgICAgICAgIAorICAgICAgICAvLyByZXR1cm4gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKHVybHMsIG51bGwpOworCiAgICAgICAgIC8vIFRPRE8gTWFrZSB0aGlzIGEgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgb25jZSB3ZSBoYXZlIHRob3NlPwogICAgICAgICByZXR1cm4gbmV3IFBhdGhDbGFzc0xvYWRlcihjbGFzc1BhdGgsIEJvb3RDbGFzc0xvYWRlci5nZXRJbnN0YW5jZSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLiBUaGlzIGlzIHRoZSBwYXJlbnQgZm9yIG5ldyBDbGFzc0xvYWRlcgotICAgICAqIGluc3RhbmNlcywgYW5kIGlzIHR5cGljYWxseSB0aGUgY2xhc3MgbG9hZGVyIHVzZWQgdG8gc3RhcnQgdGhlCi0gICAgICogYXBwbGljYXRpb24uIElmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBwcmVzZW50LCBhbmQgdGhlIGNhbGxlcidzIGNsYXNzCi0gICAgICogbG9hZGVyIGlzIG5vdCBudWxsIGFuZCB0aGUgY2FsbGVyJ3MgY2xhc3MgbG9hZGVyIGlzIG5vdCB0aGUgc2FtZSBhcyBvciBhbgotICAgICAqIGFuY2VzdG9yIG9mIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLCB0aGVuIHRoaXMgbWV0aG9kIGNhbGxzIHRoZSBzZWN1cml0eQotICAgICAqIG1hbmFnZXIncyBjaGVja1Blcm1pc3Npb24gbWV0aG9kIHdpdGggYQotICAgICAqIFJ1bnRpbWVQZXJtaXNzaW9uKCJnZXRDbGFzc0xvYWRlciIpIHBlcm1pc3Npb24gdG8gZW5zdXJlIGl0J3Mgb2sgdG8KLSAgICAgKiBhY2Nlc3MgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuIElmIG5vdCwgYSBTZWN1cml0eUV4Y2VwdGlvbiB3aWxsIGJlCi0gICAgICogdGhyb3duLgorICAgICAqIFJldHVybnMgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuIFRoaXMgaXMgdGhlIHBhcmVudCBmb3IgbmV3CisgICAgICoge0Bjb2RlIENsYXNzTG9hZGVyfSBpbnN0YW5jZXMgYW5kIGlzIHR5cGljYWxseSB0aGUgY2xhc3MgbG9hZGVyIHVzZWQgdG8KKyAgICAgKiBzdGFydCB0aGUgYXBwbGljYXRpb24uIElmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBwcmVzZW50IGFuZCB0aGUgY2FsbGVyJ3MKKyAgICAgKiBjbGFzcyBsb2FkZXIgaXMgbmVpdGhlciB7QGNvZGUgbnVsbH0gbm9yIHRoZSBzYW1lIGFzIG9yIGFuIGFuY2VzdG9yIG9mCisgICAgICogdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIsIHRoZW4gdGhpcyBtZXRob2QgY2FsbHMgdGhlIHNlY3VyaXR5IG1hbmFnZXIncworICAgICAqIGNoZWNrUGVybWlzc2lvbiBtZXRob2Qgd2l0aCBhIFJ1bnRpbWVQZXJtaXNzaW9uKCJnZXRDbGFzc0xvYWRlciIpCisgICAgICogcGVybWlzc2lvbiB0byBlbnN1cmUgdGhhdCBpdCBpcyBvayB0byBhY2Nlc3MgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuIElmCisgICAgICogbm90LCBhIHtAY29kZSBTZWN1cml0eUV4Y2VwdGlvbn0gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHN5c3RlbSBjbGFzc0xvYWRlci4KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRvZXMgbm90Ci0gICAgICogICAgICAgICBhbGxvdyBhY2Nlc3MgdG8gdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuCisgICAgICogQHJldHVybiB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgYWNjZXNzIHRvCisgICAgICogICAgICAgICAgICAgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRTeXN0ZW1DbGFzc0xvYWRlcigpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtZ3IgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CiAgICAgICAgIGlmIChzbWdyICE9IG51bGwpIHsKICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNhbGxlciA9IFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGVyICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAhY2FsbGVyLmlzQW5jZXN0b3JPZihTeXN0ZW1DbGFzc0xvYWRlci5sb2FkZXIpKSB7CisgICAgICAgICAgICBpZiAoY2FsbGVyICE9IG51bGwgJiYgIWNhbGxlci5pc0FuY2VzdG9yT2YoU3lzdGVtQ2xhc3NMb2FkZXIubG9hZGVyKSkgewogICAgICAgICAgICAgICAgIHNtZ3IuY2hlY2tQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigiZ2V0Q2xhc3NMb2FkZXIiKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNCwzOCArMTM1LDQ4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBVUkwgc3BlY2lmeWluZyBhIHJlc291cmNlIHdoaWNoIGNhbiBiZSBmb3VuZCBieSBsb29raW5nIHVwCi0gICAgICogcmVzTmFtZSB1c2luZyB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlcidzIHJlc291cmNlIGxvb2t1cCBhbGdvcml0aG0uCisgICAgICogRmluZHMgdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBzeXN0ZW0gY2xhc3MKKyAgICAgKiBsb2FkZXIncyByZXNvdXJjZSBsb29rdXAgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZmluZCB0aGUgcmVzb3VyY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIFVSTCBzcGVjaWZ5aW5nIGEgc3lzdGVtIHJlc291cmNlIG9yIG51bGwuCi0gICAgICogQHBhcmFtIHJlc05hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGZpbmQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFVSTH0gb2JqZWN0IGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgdGhlIHJlc291cmNlIGNhbiBub3QgYmUgZm91bmQuCisgICAgICogQHBhcmFtIHJlc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgogICAgICAqIEBzZWUgQ2xhc3MjZ2V0UmVzb3VyY2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFVSTCBnZXRTeXN0ZW1SZXNvdXJjZShTdHJpbmcgcmVzTmFtZSkgewogICAgICAgICByZXR1cm4gU3lzdGVtQ2xhc3NMb2FkZXIubG9hZGVyLmdldFJlc291cmNlKHJlc05hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gb2YgVVJMcyBjb250YWluaW5nIGFsbCByZXNvdXJjZXMgd2hpY2ggY2FuIGJlCi0gICAgICogZm91bmQgYnkgbG9va2luZyB1cCByZXNOYW1lIHVzaW5nIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyJ3MgcmVzb3VyY2UKLSAgICAgKiBsb29rdXAgYWxnb3JpdGhtLgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgVVJMcyBmb3IgdGhlIHJlc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIFRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyJ3MgcmVzb3VyY2UgbG9va3VwIGFsZ29yaXRobSBpcyB1c2VkIHRvIGZpbmQgdGhlCisgICAgICogcmVzb3VyY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBFbnVtZXJhdGlvbiBvZiBVUkxzIGNvbnRhaW5pbmcgdGhlIHN5c3RlbSByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gcmVzTmFtZSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGZpbmQuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB7QGNvZGUgVVJMfSBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZAorICAgICAqICAgICAgICAgcmVzb3VyY2VzLgorICAgICAqIEBwYXJhbSByZXNOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gZmluZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uPFVSTD4gZ2V0U3lzdGVtUmVzb3VyY2VzKFN0cmluZyByZXNOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gU3lzdGVtQ2xhc3NMb2FkZXIubG9hZGVyLmdldFJlc291cmNlcyhyZXNOYW1lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIG9uIGEgcmVzb3VyY2UgZm91bmQgYnkgbG9va2luZyB1cCByZXNOYW1lIHVzaW5nIHRoZQotICAgICAqIHN5c3RlbSBjbGFzcyBsb2FkZXIncyByZXNvdXJjZSBsb29rdXAgYWxnb3JpdGhtLiBCYXNpY2FsbHksIHRoZSBjb250ZW50cwotICAgICAqIG9mIHRoZSBqYXZhLmNsYXNzLnBhdGggYXJlIHNlYXJjaGVkIGluIG9yZGVyLCBsb29raW5nIGZvciBhIHBhdGggd2hpY2gKLSAgICAgKiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICogUmV0dXJucyBhIHN0cmVhbSBmb3IgdGhlIHJlc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgc3lzdGVtCisgICAgICogY2xhc3MgbG9hZGVyJ3MgcmVzb3VyY2UgbG9va3VwIGFsZ29yaXRobSBpcyB1c2VkIHRvIGZpbmQgdGhlIHJlc291cmNlLgorICAgICAqIEJhc2ljYWxseSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBqYXZhLmNsYXNzLnBhdGggYXJlIHNlYXJjaGVkIGluIG9yZGVyLAorICAgICAqIGxvb2tpbmcgZm9yIGEgcGF0aCB3aGljaCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHN0cmVhbSBvbiB0aGUgcmVzb3VyY2Ugb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gcmVzTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gZmluZC4KKyAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIGZvciB0aGUgcmVzb3VyY2Ugb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSByZXNOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gZmluZC4KICAgICAgKiBAc2VlIENsYXNzI2dldFJlc291cmNlQXNTdHJlYW0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlc05hbWUpIHsKICAgICAgICAgcmV0dXJuIFN5c3RlbUNsYXNzTG9hZGVyLmxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc05hbWUpOwpAQCAtMTc1LDI3ICsxODYsMzEgQEAKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlciBhcwogICAgICAqIGl0cyBwYXJlbnQuCiAgICAgICogCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdAotICAgICAqICAgICAgICAgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIG5ldyBDbGFzc0xvYWRlcnMuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRvZXMgbm90IGFsbG93IHRoZQorICAgICAqICAgICAgICAgICAgIGNyZWF0aW9uIG9mIGEgbmV3IHtAY29kZSBDbGFzc0xvYWRlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyKCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc21nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtZ3IgIT0gbnVsbCkgewogICAgICAgICAgICAgc21nci5jaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcGFyZW50ID0gZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyIGFzCi0gICAgICogaXRzIHBhcmVudC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlcgorICAgICAqIGFzIGl0cyBwYXJlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudExvYWRlciBUaGUgQ2xhc3NMb2FkZXIgdG8gdXNlIGFzIHRoZSBuZXcgY2xhc3MgbG9hZGVycwotICAgICAqICAgICAgICBwYXJlbnQuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdAotICAgICAqICAgICAgICAgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIG5ldyBDbGFzc0xvYWRlcnMuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGlzIG51bGwuCisgICAgICogQHBhcmFtIHBhcmVudExvYWRlcgorICAgICAqICAgICAgICAgICAgVGhlIHtAY29kZSBDbGFzc0xvYWRlcn0gdG8gdXNlIGFzIHRoZSBuZXcgY2xhc3MgbG9hZGVyJ3MKKyAgICAgKiAgICAgICAgICAgIHBhcmVudC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZG9lcyBub3QgYWxsb3cgdGhlCisgICAgICogICAgICAgICAgICAgY3JlYXRpb24gb2YgbmV3IGEgbmV3IHtAY29kZSBDbGFzc0xvYWRlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudExvYWRlcikgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc21nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTIwNCwxMCArMjE5LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPIFNob3VsZG4ndCB3ZSBjaGVjayBmb3IgbnVsbCB2YWx1ZXMgaGVyZT8KLS8vICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLS8vICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0vLyAgICAgICAgfQotICAgICAgICAKKyAgICAgICAgLy8gaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgIC8vIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAvLyB9CisKICAgICAgICAgcGFyZW50ID0gcGFyZW50TG9hZGVyOwogICAgIH0KIApAQCAtMjE1LDE1ICsyMzAsMjcgQEAKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsYXNzIGZyb20gYW4gYXJyYXkgb2YgYnl0ZXMgY29udGFpbmluZyBhIGNsYXNzCiAgICAgICogZGVmaW5pdGlvbiBpbiBjbGFzcyBmaWxlIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xhc3NSZXAgQSBtZW1vcnkgaW1hZ2Ugb2YgYSBjbGFzcyBmaWxlLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBjbGFzc1JlcC4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGNsYXNzIGZpbGUuCisgICAgICogQHBhcmFtIGNsYXNzUmVwCisgICAgICogICAgICAgICAgICB0aGUgbWVtb3J5IGltYWdlIG9mIGEgY2xhc3MgZmlsZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGludG8ge0Bjb2RlIGNsYXNzUmVwfS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBjbGFzcyBmaWxlLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDbGFzc30gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHN1YnNldCBvZgorICAgICAqICAgICAgICAgZGF0YSBpbiB7QGNvZGUgY2xhc3NSZXB9LgorICAgICAqIEB0aHJvd3MgQ2xhc3NGb3JtYXRFcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjbGFzc1JlcH0gZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGNsYXNzLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSwge0Bjb2RlIGxlbmd0aCA8IDB9IG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgY2xhc3NSZXB9LgogICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2RlZmluZUNsYXNzKFN0cmluZywgYnl0ZVtdLCBpbnQsIGludCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8Pz4gZGVmaW5lQ2xhc3MoYnl0ZVtdIGNsYXNzUmVwLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQogICAgICAgICAgICAgdGhyb3dzIENsYXNzRm9ybWF0RXJyb3IgewotICAgICAgICAKKwogICAgICAgICByZXR1cm4gVk1DbGFzc0xvYWRlci5kZWZpbmVDbGFzcyh0aGlzLCBjbGFzc1JlcCwgb2Zmc2V0LCBsZW5ndGgsIG51bGwpOwogICAgIH0KIApAQCAtMjMxLDEzICsyNTgsMjcgQEAKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsYXNzIGZyb20gYW4gYXJyYXkgb2YgYnl0ZXMgY29udGFpbmluZyBhIGNsYXNzCiAgICAgICogZGVmaW5pdGlvbiBpbiBjbGFzcyBmaWxlIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBuZXcgY2xhc3MKLSAgICAgKiBAcGFyYW0gY2xhc3NSZXAgQSBtZW1vcnkgaW1hZ2Ugb2YgYSBjbGFzcyBmaWxlCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGNsYXNzUmVwCi0gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBjbGFzcyBmaWxlCisgICAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGV4cGVjdGVkIG5hbWUgb2YgdGhlIG5ldyBjbGFzcywgbWF5IGJlIHtAY29kZSBudWxsfSBpZiBub3QKKyAgICAgKiAgICAgICAgICAgIGtub3duLgorICAgICAqIEBwYXJhbSBjbGFzc1JlcAorICAgICAqICAgICAgICAgICAgdGhlIG1lbW9yeSBpbWFnZSBvZiBhIGNsYXNzIGZpbGUuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbnRvIHtAY29kZSBjbGFzc1JlcH0uCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgY2xhc3MgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2xhc3N9IG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHNwZWNpZmllZCBzdWJzZXQgb2YKKyAgICAgKiAgICAgICAgIGRhdGEgaW4ge0Bjb2RlIGNsYXNzUmVwfS4KKyAgICAgKiBAdGhyb3dzIENsYXNzRm9ybWF0RXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY2xhc3NSZXB9IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0sIHtAY29kZSBsZW5ndGggPCAwfSBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBsZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGNsYXNzUmVwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8Pz4gZGVmaW5lQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgYnl0ZVtdIGNsYXNzUmVwLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgaW50IGxlbmd0aCkgdGhyb3dzIENsYXNzRm9ybWF0RXJyb3IgeworICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzczw/PiBkZWZpbmVDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBieXRlW10gY2xhc3NSZXAsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgQ2xhc3NGb3JtYXRFcnJvciB7CiAKICAgICAgICAgLy8gVE9ETyBEZWZpbmUgYSBkZWZhdWx0IFByb3RlY3Rpb25Eb21haW4gb24gZmlyc3QgdXNlCiAgICAgICAgIHJldHVybiBkZWZpbmVDbGFzcyhjbGFzc05hbWUsIGNsYXNzUmVwLCBvZmZzZXQsIGxlbmd0aCwgbnVsbCk7CkBAIC0yNDUsMTEyICsyODYsMTUzIEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsYXNzIGZyb20gYW4gYXJyYXkgb2YgYnl0ZXMgY29udGFpbmluZyBhIGNsYXNzCi0gICAgICogZGVmaW5pdGlvbiBpbiBjbGFzcyBmaWxlIGZvcm1hdCBhbmQgYXNzaWducyB0aGUgbmV3IGNsYXNzIHRvIHRoZQotICAgICAqIHNwZWNpZmllZCBwcm90ZWN0aW9uIGRvbWFpbi4KKyAgICAgKiBkZWZpbml0aW9uIGluIGNsYXNzIGZpbGUgZm9ybWF0IGFuZCBhc3NpZ25zIHRoZSBzcGVjaWZpZWQgcHJvdGVjdGlvbgorICAgICAqIGRvbWFpbiB0byB0aGUgbmV3IGNsYXNzLiBJZiB0aGUgcHJvdmlkZWQgcHJvdGVjdGlvbiBkb21haW4gaXMKKyAgICAgKiB7QGNvZGUgbnVsbH0gdGhlbiBhIGRlZmF1bHQgcHJvdGVjdGlvbiBkb21haW4gaXMgYXNzaWduZWQgdG8gdGhlIGNsYXNzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIG5ldyBjbGFzcy4KLSAgICAgKiBAcGFyYW0gY2xhc3NSZXAgQSBtZW1vcnkgaW1hZ2Ugb2YgYSBjbGFzcyBmaWxlLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBjbGFzc1JlcC4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGNsYXNzIGZpbGUuCi0gICAgICogQHBhcmFtIHByb3RlY3Rpb25Eb21haW4gVGhlIHByb3RlY3Rpb24gZG9tYWluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlbG9uZ3MKLSAgICAgKiAgICAgICAgdG8uCisgICAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGV4cGVjdGVkIG5hbWUgb2YgdGhlIG5ldyBjbGFzcywgbWF5IGJlIHtAY29kZSBudWxsfSBpZiBub3QKKyAgICAgKiAgICAgICAgICAgIGtub3duLgorICAgICAqIEBwYXJhbSBjbGFzc1JlcAorICAgICAqICAgICAgICAgICAgdGhlIG1lbW9yeSBpbWFnZSBvZiBhIGNsYXNzIGZpbGUuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbnRvIHtAY29kZSBjbGFzc1JlcH0uCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgY2xhc3MgZmlsZS4KKyAgICAgKiBAcGFyYW0gcHJvdGVjdGlvbkRvbWFpbgorICAgICAqICAgICAgICAgICAgdGhlIHByb3RlY3Rpb24gZG9tYWluIHRvIGFzc2lnbiB0byB0aGUgbG9hZGVkIGNsYXNzLCBtYXkgYmUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2xhc3N9IG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHNwZWNpZmllZCBzdWJzZXQgb2YKKyAgICAgKiAgICAgICAgIGRhdGEgaW4ge0Bjb2RlIGNsYXNzUmVwfS4KKyAgICAgKiBAdGhyb3dzIENsYXNzRm9ybWF0RXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY2xhc3NSZXB9IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0sIHtAY29kZSBsZW5ndGggPCAwfSBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBsZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGNsYXNzUmVwfS4KKyAgICAgKiBAdGhyb3dzIE5vQ2xhc3NEZWZGb3VuZEVycm9yCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNsYXNzTmFtZX0gaXMgbm90IGVxdWFsIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB7QGNvZGUgY2xhc3NSZXB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzczw/PiBkZWZpbmVDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBieXRlW10gY2xhc3NSZXAsIGludCBvZmZzZXQsCi0gICAgICAgICAgICBpbnQgbGVuZ3RoLCBQcm90ZWN0aW9uRG9tYWluIHByb3RlY3Rpb25Eb21haW4pIHRocm93cyBqYXZhLmxhbmcuQ2xhc3NGb3JtYXRFcnJvciB7Ci0gICAgICAgIAorICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzczw/PiBkZWZpbmVDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBieXRlW10gY2xhc3NSZXAsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBQcm90ZWN0aW9uRG9tYWluIHByb3RlY3Rpb25Eb21haW4pIHRocm93cyBqYXZhLmxhbmcuQ2xhc3NGb3JtYXRFcnJvciB7CisKICAgICAgICAgcmV0dXJuIFZNQ2xhc3NMb2FkZXIuZGVmaW5lQ2xhc3ModGhpcywgY2xhc3NOYW1lLCBjbGFzc1JlcCwgb2Zmc2V0LCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgcHJvdGVjdGlvbkRvbWFpbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGVmaW5lcyBhIG5ldyBjbGFzcyBmb3IgdGhlIG5hbWUsIGJ5dGVjb2RlcyBpbiB0aGUgYnl0ZSBidWZmZXIgYW5kIHRoZQotICAgICAqIHByb3RlY3Rpb24gZG9tYWluLgotICAgICAqIDwvcD4KKyAgICAgKiBEZWZpbmVzIGEgbmV3IGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBieXRlIGNvZGUgZnJvbSB0aGUgYnl0ZQorICAgICAqIGJ1ZmZlciBhbmQgdGhlIG9wdGlvbmFsIHByb3RlY3Rpb24gZG9tYWluLiBJZiB0aGUgcHJvdmlkZWQgcHJvdGVjdGlvbgorICAgICAqIGRvbWFpbiBpcyB7QGNvZGUgbnVsbH0gdGhlbiBhIGRlZmF1bHQgcHJvdGVjdGlvbiBkb21haW4gaXMgYXNzaWduZWQgdG8KKyAgICAgKiB0aGUgY2xhc3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGRlZmluZS4KLSAgICAgKiBAcGFyYW0gYiBUaGUgYnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgYnl0ZWNvZGVzIG9mIHRoZSBuZXcgY2xhc3MuCi0gICAgICogQHBhcmFtIHByb3RlY3Rpb25Eb21haW4gVGhlIHByb3RlY3Rpb24gZG9tYWluIHRoaXMgY2xhc3MgYmVsb25ncyB0by4KLSAgICAgKiBAcmV0dXJuIFRoZSBkZWZpbmVkIGNsYXNzLgotICAgICAqIEB0aHJvd3MgQ2xhc3NGb3JtYXRFcnJvciBpZiBhbiBpbnZhbGlkIGNsYXNzIGZpbGUgaXMgZGVmaW5lZC4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHBlY3RlZCBuYW1lIG9mIHRoZSBuZXcgY2xhc3MsIG1heSBiZSB7QGNvZGUgbnVsbH0gaWYgbm90CisgICAgICogICAgICAgICAgICBrbm93bi4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJ5dGUgY29kZSBvZiB0aGUgbmV3IGNsYXNzLgorICAgICAqIEBwYXJhbSBwcm90ZWN0aW9uRG9tYWluCisgICAgICogICAgICAgICAgICB0aGUgcHJvdGVjdGlvbiBkb21haW4gdG8gYXNzaWduIHRvIHRoZSBsb2FkZWQgY2xhc3MsIG1heSBiZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDbGFzc30gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgZGF0YSBpbiB7QGNvZGUgYn0uCisgICAgICogQHRocm93cyBDbGFzc0Zvcm1hdEVycm9yCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGJ9IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIE5vQ2xhc3NEZWZGb3VuZEVycm9yCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNsYXNzTmFtZX0gaXMgbm90IGVxdWFsIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB7QGNvZGUgYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIENsYXNzPD8+IGRlZmluZUNsYXNzKFN0cmluZyBuYW1lLCBCeXRlQnVmZmVyIGIsCiAgICAgICAgICAgICBQcm90ZWN0aW9uRG9tYWluIHByb3RlY3Rpb25Eb21haW4pIHRocm93cyBDbGFzc0Zvcm1hdEVycm9yIHsKLSAgICAgICAgCisKICAgICAgICAgYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVtiLnJlbWFpbmluZygpXTsKICAgICAgICAgYi5nZXQodGVtcCk7CiAgICAgICAgIHJldHVybiBkZWZpbmVDbGFzcyhuYW1lLCB0ZW1wLCAwLCB0ZW1wLmxlbmd0aCwgcHJvdGVjdGlvbkRvbWFpbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLCBieSBkZWZhdWx0IHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLiBUaGlzCi0gICAgICogbWV0aG9kIGlzIGNhbGxlZCBieSBsb2FkQ2xhc3MoKSBhZnRlciB0aGUgcGFyZW50IENsYXNzTG9hZGVyIGhhcyBmYWlsZWQKLSAgICAgKiB0byBmaW5kIGEgbG9hZGVkIGNsYXNzIG9mIHRoZSBzYW1lIG5hbWUuCisgICAgICogT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLCB0aHJvd3MgYSB7QGNvZGUgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0gYnkKKyAgICAgKiBkZWZhdWx0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0Bjb2RlIGxvYWRDbGFzc30gYWZ0ZXIgdGhlIHBhcmVudAorICAgICAqIHtAY29kZSBDbGFzc0xvYWRlcn0gaGFzIGZhaWxlZCB0byBmaW5kIGEgbG9hZGVkIGNsYXNzIG9mIHRoZSBzYW1lIG5hbWUuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgY2xhc3Mgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBzZWFyY2ggZm9yLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGZvdW5kLgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2xhc3N9IG9iamVjdCB0aGF0IGlzIGZvdW5kLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENsYXNzPD8+IGZpbmRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGNsYXNzTmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gZmluZCBhbmQgcmV0dXJuIGEgY2xhc3Mgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgYnkgdGhlCi0gICAgICogdmlydHVhbCBtYWNoaW5lLiBOb3RlIHRoYXQgdGhlIGNsYXNzIG1heSBub3QgaGF2ZSBiZWVuIGxpbmtlZCBhbmQgdGhlCi0gICAgICogY2FsbGVyIHNob3VsZCBjYWxsIHJlc29sdmVDbGFzcygpIG9uIHRoZSByZXN1bHQgaWYgbmVjZXNzYXJ5LgorICAgICAqIFJldHVybnMgdGhlIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkCisgICAgICogYnkgdGhlIHZpcnR1YWwgbWFjaGluZSBvciB7QGNvZGUgbnVsbH0gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBsb2FkZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgY2xhc3Mgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBzZWFyY2ggZm9yLgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2xhc3N9IG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJlcXVlc3RlZCBjbGFzcworICAgICAqICAgICAgICAgaGFzIG5vdCBiZWVuIGxvYWRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8Pz4gZmluZExvYWRlZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcjsKICAgICAgICAgaWYgKHRoaXMgPT0gQm9vdENsYXNzTG9hZGVyLmdldEluc3RhbmNlKCkpCiAgICAgICAgICAgICBsb2FkZXIgPSBudWxsOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBsb2FkZXIgPSB0aGlzOwogICAgICAgICByZXR1cm4gVk1DbGFzc0xvYWRlci5maW5kTG9hZGVkQ2xhc3MobG9hZGVyLCBjbGFzc05hbWUpOwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gbG9hZCBhIGNsYXNzIHVzaW5nIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLiBOb3RlIHRoYXQgdGhlCi0gICAgICogY2xhc3MgaGFzIGFscmVhZHkgYmVlbiBiZWVuIGxpbmtlZC4KKyAgICAgKiBGaW5kcyB0aGUgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGxvYWRpbmcgaXQgdXNpbmcgdGhlIHN5c3RlbQorICAgICAqIGNsYXNzIGxvYWRlciBpZiBuZWNlc3NhcnkuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgY2xhc3Mgd2hpY2ggd2FzIGxvYWRlZC4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBzZWFyY2ggZm9yLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGZvdW5kLgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2xhc3N9IG9iamVjdCB3aXRoIHRoZSByZXF1ZXN0ZWQge0Bjb2RlIGNsYXNzTmFtZX0uCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIGNhbiBub3QgYmUgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIENsYXNzPD8+IGZpbmRTeXN0ZW1DbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBDbGFzc0xvYWRlcidzIHBhcmVudC4KKyAgICAgKiBSZXR1cm5zIHRoaXMgY2xhc3MgbG9hZGVyJ3MgcGFyZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIG9yIG51bGwuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdAotICAgICAqICAgICAgICAgYWxsb3cgdGhlIHBhcmVudCBsb2FkZXIgdG8gYmUgcmV0cmlldmVkLgorICAgICAqIEByZXR1cm4gdGhpcyBjbGFzcyBsb2FkZXIncyBwYXJlbnQgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyB0bworICAgICAqICAgICAgICAgICAgIHJldHJpZXZlIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDbGFzc0xvYWRlciBnZXRQYXJlbnQoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbWdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc21nciAhPSBudWxsKSB7CiAgICAgICAgICAgICBzbWdyLmNoZWNrUGVybWlzc2lvbihuZXcgUnVudGltZVBlcm1pc3Npb24oImdldENsYXNzTG9hZGVyIikpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBVUkwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSByZXNvdXJjZSBkZXNjcmliZWQgYnkKLSAgICAgKiByZXNOYW1lLCB1c2luZyB0aGUgY2xhc3MgbG9hZGVyJ3MgcmVzb3VyY2UgbG9va3VwIGFsZ29yaXRobS4gVGhlIGRlZmF1bHQKLSAgICAgKiBiZWhhdmlvciBpcyBqdXN0IHRvIHJldHVybiBudWxsLgorICAgICAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBmaXJzdCB0cmllcyB0byB1c2UgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgdG8gZmluZCB0aGUKKyAgICAgKiByZXNvdXJjZTsgaWYgdGhpcyBmYWlscyB0aGVuIHtAbGluayAjZmluZFJlc291cmNlKFN0cmluZyl9IGlzIGNhbGxlZCB0bworICAgICAqIGZpbmQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICogQHBhcmFtIHJlc05hbWUgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgorICAgICAqIEBwYXJhbSByZXNOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gZmluZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgVVJMfSBvYmplY3QgZm9yIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2Ugb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiBlaXRoZXIgdGhlIHJlc291cmNlIGNhbiBub3QgYmUgZm91bmQgb3IgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICogICAgICAgICBkb2VzIG5vdCBhbGxvdyB0byBhY2Nlc3MgdGhlIHJlc291cmNlLgogICAgICAqIEBzZWUgQ2xhc3MjZ2V0UmVzb3VyY2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyByZXNOYW1lKSB7CiAgICAgICAgIFVSTCByZXNvdXJjZSA9IG51bGw7CkBAIC0zNjcsMTIgKzQ0OSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gb2YgVVJMIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2VzCi0gICAgICogZGVzY3JpYmVkIGJ5IHJlc05hbWUsIHVzaW5nIHRoZSBjbGFzcyBsb2FkZXIncyByZXNvdXJjZSBsb29rdXAgYWxnb3JpdGhtLgotICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGp1c3QgdG8gcmV0dXJuIGFuIGVtcHR5IEVudW1lcmF0aW9uLgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgVVJMcyBmb3IgdGhlIHJlc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZmlyc3QgdXNlcyB0aGlzIGNsYXNzIGxvYWRlcidzIHBhcmVudCB0byBmaW5kIHRoZQorICAgICAqIHJlc291cmNlLCB0aGVuIGl0IGNhbGxzIHtAbGluayAjZmluZFJlc291cmNlcyhTdHJpbmcpfSB0byBnZXQgYWRkaXRpb25hbAorICAgICAqIFVSTHMuIFRoZSByZXR1cm5lZCBlbnVtZXJhdGlvbiBjb250YWlucyB0aGUge0Bjb2RlIFVSTH0gb2JqZWN0cyBvZiBib3RoCisgICAgICogZmluZCBvcGVyYXRpb25zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZXMuCi0gICAgICogQHBhcmFtIHJlc05hbWUgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2Yge0Bjb2RlIFVSTH0gb2JqZWN0cyBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gcmVzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGZpbmQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFVSTD4gZ2V0UmVzb3VyY2VzKFN0cmluZyByZXNOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzg4LDEzICs0NzYsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIG9uIGEgcmVzb3VyY2UgZm91bmQgYnkgbG9va2luZyB1cCByZXNOYW1lIHVzaW5nIHRoZQotICAgICAqIGNsYXNzIGxvYWRlcidzIHJlc291cmNlIGxvb2t1cCBhbGdvcml0aG0uIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGp1c3QgdG8KLSAgICAgKiByZXR1cm4gbnVsbC4KKyAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIGZvciB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFNlZQorICAgICAqIHtAbGluayAjZ2V0UmVzb3VyY2UoU3RyaW5nKX0gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGxvb2t1cCBhbGdvcml0aG0KKyAgICAgKiB1c2VkIHRvIGZpbmQgdGhlIHJlc291cmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSBzdHJlYW0gb24gdGhlIHJlc291cmNlIG9yIG51bGwuCi0gICAgICogQHBhcmFtIHJlc05hbWUgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gZm9yIHRoZSByZXNvdXJjZSBvciB7QGNvZGUgbnVsbH0gaWYgZWl0aGVyIHRoZSByZXNvdXJjZQorICAgICAqICAgICAgICAgY2FuIG5vdCBiZSBmb3VuZCBvciBhIHNlY3VyaXR5IG1hbmFnZXIgZG9lcyBub3QgYWxsb3cgdG8gYWNjZXNzCisgICAgICogICAgICAgICB0aGUgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIHJlc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgogICAgICAqIEBzZWUgQ2xhc3MjZ2V0UmVzb3VyY2VBc1N0cmVhbQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNOYW1lKSB7CiAgICAgICAgIHRyeSB7CkBAIC00MDMsNDEgKzQ5NSw2MCBAQAogICAgICAgICAgICAgICAgIHJldHVybiB1cmwub3BlblN0cmVhbSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0byBzZWUgdGhlIGV4Y2VwdGlvbi4gCisgICAgICAgICAgICAvLyBEb24ndCB3YW50IHRvIHNlZSB0aGUgZXhjZXB0aW9uLgogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEludm9rZWQgYnkgdGhlIFZpcnR1YWwgTWFjaGluZSB3aGVuIHJlc29sdmluZyBjbGFzcyByZWZlcmVuY2VzLgotICAgICAqIEVxdWl2YWxlbnQgdG8gbG9hZENsYXNzKGNsYXNzTmFtZSwgZmFsc2UpOworICAgICAqIExvYWRzIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gSW52b2tpbmcgdGhpcyBtZXRob2QgaXMKKyAgICAgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcge0Bjb2RlIGxvYWRDbGFzcyhjbGFzc05hbWUsIGZhbHNlKX0uCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJbiB0aGUgQW5kcm9pZCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sIHRoZQorICAgICAqIHNlY29uZCBwYXJhbWV0ZXIgb2Yge0BsaW5rICNsb2FkQ2xhc3MoU3RyaW5nLCBib29sZWFuKX0gaXMgaWdub3JlZAorICAgICAqIGFueXdheS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgQ2xhc3Mgb2JqZWN0LgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHNlYXJjaCBmb3IuCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIENsYXNzfSBvYmplY3QuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvb2sgZm9yLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBjYW4gbm90IGJlIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzczw/PiBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbG9hZENsYXNzKGNsYXNzTmFtZSwgZmFsc2UpOwogICAgIH0KIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAotICAgIC8vIE1hZGUgcmVzb2x2ZUNsYXNzIGEgbm8tb3AgYW5kIGNoYW5nZWQgdGhlIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCiAgICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBvcHRpb25hbGx5IGxpbmtpbmcgdGhlIGNsYXNzCi0gICAgICogYWZ0ZXIgbG9hZC4gU3RlcHMgYXJlOiAxKSBDYWxsIGZpbmRMb2FkZWRDbGFzcyhjbGFzc05hbWUpIHRvIGRldGVybWluZSBpZgotICAgICAqIGNsYXNzIGlzIGxvYWRlZCAyKSBDYWxsIGxvYWRDbGFzcyhjbGFzc05hbWUsIHJlc29sdmVDbGFzcykgb24gdGhlIHBhcmVudAotICAgICAqIGxvYWRlci4gMykgQ2FsbCBmaW5kQ2xhc3MoY2xhc3NOYW1lKSB0byBmaW5kIHRoZSBjbGFzcworICAgICAqIExvYWRzIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgb3B0aW9uYWxseSBsaW5raW5nIGl0IGFmdGVyCisgICAgICogbG9hZGluZy4gVGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgcGVyZm9ybWVkOgorICAgICAqIDxvbD4KKyAgICAgKiA8bGk+IENhbGwge0BsaW5rICNmaW5kTG9hZGVkQ2xhc3MoU3RyaW5nKX0gdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBsb2FkZWQ6IEludm9rZSB0aGlzIG1ldGhvZCBvbiB0aGUKKyAgICAgKiBwYXJlbnQgY2xhc3MgbG9hZGVyLjwvbGk+CisgICAgICogPGxpPklmIHRoZSBjbGFzcyBoYXMgc3RpbGwgbm90IGJlZW4gbG9hZGVkOiBDYWxsCisgICAgICoge0BsaW5rICNmaW5kQ2xhc3MoU3RyaW5nKX0gdG8gZmluZCB0aGUgY2xhc3MuPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSW4gdGhlIEFuZHJvaWQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB0aGUKKyAgICAgKiB7QGNvZGUgcmVzb2x2ZX0gcGFyYW1ldGVyIGlzIGlnbm9yZWQ7IGNsYXNzZXMgYXJlIG5ldmVyIGxpbmtlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgQ2xhc3Mgb2JqZWN0LgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHNlYXJjaCBmb3IuCi0gICAgICogQHBhcmFtIHJlc29sdmUgSW5kaWNhdGVzIGlmIGNsYXNzIHNob3VsZCBiZSByZXNvbHZlZCBhZnRlciBsb2FkaW5nLiAKLSAgICAgKiAgICAgTm90ZTogT24gdGhlIGFuZHJvaWQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHRoaXMgcGFyYW1ldGVyIAotICAgICAqICAgICBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QuCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIENsYXNzfSBvYmplY3QuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvb2sgZm9yLgorICAgICAqIEBwYXJhbSByZXNvbHZlCisgICAgICogICAgICAgICAgICBJbmRpY2F0ZXMgaWYgdGhlIGNsYXNzIHNob3VsZCBiZSByZXNvbHZlZCBhZnRlciBsb2FkaW5nLiBUaGlzCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgaWdub3JlZCBvbiB0aGUgQW5kcm9pZCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb247CisgICAgICogICAgICAgICAgICBjbGFzc2VzIGFyZSBub3QgcmVzb2x2ZWQuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIGNhbiBub3QgYmUgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzPD8+IGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIHJlc29sdmUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIENsYXNzPD8+IGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIHJlc29sdmUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBmaW5kTG9hZGVkQ2xhc3MoY2xhc3NOYW1lKTsKIAogICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgewpAQCAtNDYwLDM1ICs1NzEsMzUgQEAKICAgICAvKioKICAgICAgKiBGb3JjZXMgYSBjbGFzcyB0byBiZSBsaW5rZWQgKGluaXRpYWxpemVkKS4gSWYgdGhlIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4KICAgICAgKiBsaW5rZWQgdGhpcyBvcGVyYXRpb24gaGFzIG5vIGVmZmVjdC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEluIHRoZSBBbmRyb2lkIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgdGhpcworICAgICAqIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgZm9yIHRoZSBhbmRyb2lkIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiB0aGlzIG1ldGhvZCBkb2VzIG5vdCAKLSAgICAgKiBoYXZlIGFueSBlZmZlY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsYXp6IFRoZSBDbGFzcyB0byBsaW5rLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgY2xhenogaXMgbnVsbC4KLSAgICAgKiBAc2VlIENsYXNzI2dldFJlc291cmNlCisgICAgICogQHBhcmFtIGNsYXp6CisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgdG8gbGluay4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNvbHZlQ2xhc3MoQ2xhc3M8Pz4gY2xhenopIHsKICAgICAgICAgLy8gbm8tb3AsIGRvZXNuJ3QgbWFrZSBzZW5zZSBvbiBhbmRyb2lkLgogICAgIH0KLSAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0gICAgCisKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBWTSB2ZW5kb3IsIGFzIGl0IGlzIHVzZWQgYnkgb3RoZXIKLSAgICAgKiBwcm92aWRlZCBjbGFzcyBpbXBsZW1lbnRhdGlvbnMgaW4gdGhpcyBwYWNrYWdlLiBBIHNhbXBsZSBpbXBsZW1lbnRhdGlvbgotICAgICAqIG9mIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uIFRoaXMgbWV0aG9kCi0gICAgICogaXMgdXNlZCBieSBTZWN1cml0eU1hbmFnZXIuY2xhc3NMb2FkZXJEZXB0aCgpLCBjdXJyZW50Q2xhc3NMb2FkZXIoKSBhbmQKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGNsYXNzIGxvYWRlciBpcyB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4gVGhpcworICAgICAqIG1ldGhvZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSB2aXJ0dWFsIG1hY2hpbmUgdmVuZG9yLCBhcyBpdCBpcyB1c2VkIGJ5CisgICAgICogb3RoZXIgcHJvdmlkZWQgY2xhc3MgaW1wbGVtZW50YXRpb25zIGluIHRoaXMgcGFja2FnZS4gQSBzYW1wbGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBieSB0aGUgcmVmZXJlbmNlCisgICAgICogaW1wbGVtZW50YXRpb24uIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkKKyAgICAgKiBTZWN1cml0eU1hbmFnZXIuY2xhc3NMb2FkZXJEZXB0aCgpLCBjdXJyZW50Q2xhc3NMb2FkZXIoKSBhbmQKICAgICAgKiBjdXJyZW50TG9hZGVkQ2xhc3MoKS4gUmV0dXJucyB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHN5c3RlbSBjbGFzcwogICAgICAqIGxvYWRlci4KLSAgICAgKiA8L3A+CiAgICAgICogPHA+CiAgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGhhcyBwYWNrYWdlIHZpc2liaWxpdHkgb25seS4gSXQgaXMgZGVmaW5lZCBoZXJlIHRvCiAgICAgICogYXZvaWQgdGhlIHNlY3VyaXR5IG1hbmFnZXIgY2hlY2sgaW4gZ2V0U3lzdGVtQ2xhc3NMb2FkZXIsIHdoaWNoIHdvdWxkIGJlCiAgICAgICogcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kIGFueXdoZXJlIGVsc2UuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlY2VpdmVyIGlzIGEgc3lzdGVtIGNsYXNzIGxvYWRlcgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSByZWNlaXZlciBpcyBhIHN5c3RlbSBjbGFzcyBsb2FkZXIKICAgICAgKiBAc2VlIENsYXNzI2dldENsYXNzTG9hZGVySW1wbCgpCiAgICAgICovCiAgICAgZmluYWwgYm9vbGVhbiBpc1N5c3RlbUNsYXNzTG9hZGVyKCkgewpAQCAtNTA3LDM5ICs2MTgsNDggQEAKICAgICAgKiBwbGFjZXMgd2hlcmUgY2xhc3MgbG9hZGVycyBhcmUgYWNjZXNzZXMuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGlsZCBBIGNoaWxkIGNhbmRpZGF0ZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlY2VpdmVyIGlzIGFuY2VzdG9yIG9mLCBvciBlcXVhbCB0bywKKyAgICAgKiBAcGFyYW0gY2hpbGQKKyAgICAgKiAgICAgICAgICAgIEEgY2hpbGQgY2FuZGlkYXRlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlY2VpdmVyIGlzIGFuY2VzdG9yIG9mLCBvciBlcXVhbCB0bywKICAgICAgKiAgICAgICAgIHRoZSBwYXJhbWV0ZXIKICAgICAgKi8KICAgICBmaW5hbCBib29sZWFuIGlzQW5jZXN0b3JPZihDbGFzc0xvYWRlciBjaGlsZCkgewotICAgICAgICByZXR1cm4gKGNoaWxkID09IHRoaXMgfHwgaXNBbmNlc3Rvck9mKGNoaWxkLmdldFBhcmVudCgpKSk7CisgICAgICAgIGZvciAoQ2xhc3NMb2FkZXIgY3VycmVudCA9IGNoaWxkOyBjdXJyZW50ICE9IG51bGw7CisgICAgICAgICAgICAgICAgY3VycmVudCA9IGNoaWxkLnBhcmVudCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gdGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFVSTCB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHJlc291cmNlIGRlc2NyaWJlZCBieQotICAgICAqIHJlc05hbWUsIHVzaW5nIHRoZSBjbGFzcyBsb2FkZXIncyByZXNvdXJjZSBsb29rdXAgYWxnb3JpdGhtLiBUaGUgZGVmYXVsdAotICAgICAqIGJlaGF2aW9yIGlzIGp1c3QgdG8gcmV0dXJuIG51bGwuIFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGEKLSAgICAgKiBDbGFzc0xvYWRlci4KKyAgICAgKiBGaW5kcyB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyB7QGNvZGUgbnVsbH07IGl0IHNob3VsZCBiZSBvdmVycmlkZGVuIGluCisgICAgICogc3ViY2xhc3Nlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICogQHBhcmFtIHJlc05hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGZpbmQuCisgICAgICogQHBhcmFtIHJlc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBVUkx9IG9iamVjdCBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgcmVzTmFtZSkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEVudW1lcmF0aW9uIG9mIFVSTCB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHJlc291cmNlcwotICAgICAqIGRlc2NyaWJlZCBieSByZXNOYW1lLCB1c2luZyB0aGUgY2xhc3MgbG9hZGVyJ3MgcmVzb3VyY2UgbG9va3VwIGFsZ29yaXRobS4KLSAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBqdXN0IHRvIHJldHVybiBhbiBlbXB0eSBFbnVtZXJhdGlvbi4KKyAgICAgKiBGaW5kcyBhbiBlbnVtZXJhdGlvbiBvZiBVUkxzIGZvciB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgYW4gZW1wdHkge0Bjb2RlIEVudW1lcmF0aW9ufTsgaXQgc2hvdWxkCisgICAgICogYmUgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZXNOYW1lIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGxvY2F0aW9ucyBvZiB0aGUgcmVzb3VyY2VzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiBAcGFyYW0gcmVzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGZpbmQuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB7QGNvZGUgVVJMfSBvYmplY3RzIGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyggewogICAgICAgICAgICAgInVuY2hlY2tlZCIsICJ1bnVzZWQiCiAgICAgfSkKICAgICBwcm90ZWN0ZWQgRW51bWVyYXRpb248VVJMPiBmaW5kUmVzb3VyY2VzKFN0cmluZyByZXNOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNTQ3LDIzICs2NjcsMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpYnJhcnkgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwuIElmIG51bGwgaXMgYW5zd2VyZWQsIHRoZSBzeXN0ZW0gc2VhcmNoZXMKLSAgICAgKiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IHRoZSBzeXN0ZW0gcHJvcGVydHkgImphdmEubGlicmFyeS5wYXRoIi4KKyAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBuYXRpdmUgbGlicmFyeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwKKyAgICAgKiBvciB7QGNvZGUgbnVsbH0uIElmIHRoaXMgbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9IHRoZW4gdGhlIHZpcnR1YWwKKyAgICAgKiBtYWNoaW5lIHNlYXJjaGVzIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgdGhlIHN5c3RlbSBwcm9wZXJ0eQorICAgICAqICJqYXZhLmxpYnJhcnkucGF0aCIuCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGxpYnJhcnkgZmlsZSBuYW1lIG9yIG51bGwuCi0gICAgICogQHBhcmFtIGxpYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdG8gZmluZC4KKyAgICAgKiBAcGFyYW0gbGliTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdG8gZmluZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBsaWJyYXJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgZmluZExpYnJhcnkoU3RyaW5nIGxpYk5hbWUpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVlc3RlZCBwYWNrYWdlLiBJZiBubyBwYWNrYWdlIGluZm9ybWF0aW9uIGNhbiBiZQotICAgICAqIGxvY2F0ZWQsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICogUmV0dXJucyB0aGUgcGFja2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gUGFja2FnZSBpbmZvcm1hdGlvbiBpcworICAgICAqIHNlYXJjaGVkIGluIHRoaXMgY2xhc3MgbG9hZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIHJlcXVlc3RlZCwgb3IgbnVsbAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBmaW5kLgorICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWU7IHtAY29kZSBudWxsfSBpZiB0aGUgcGFja2FnZQorICAgICAqICAgICAgICAgY2FuIG5vdCBiZSBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUGFja2FnZSBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAocGFja2FnZXMpIHsKQEAgLTU3Myw3NyArNzAyLDEwMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEF0dGVtcHQgdG8gbG9jYXRlIHRoZSByZXF1ZXN0ZWQgcGFja2FnZSB1c2luZyB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgotICAgICAqIElmIG5vIHBhY2thZ2UgaW5mb3JtYXRpb24gY2FuIGJlIGxvY2F0ZWQsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICogR2V0cyB0aGUgcGFja2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgc2VhcmNoaW5nIGl0IGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjbGFzcyBsb2FkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZQotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIHJlcXVlc3RlZCwgb3IgbnVsbAorICAgICAqIEBwYXJhbSBsb2FkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBsb2FkZXIgdG8gc2VhcmNoIHRoZSBwYWNrYWdlIGluLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBmaW5kLgorICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWU7IHtAY29kZSBudWxsfSBpZiB0aGUgcGFja2FnZQorICAgICAqICAgICAgICAgY2FuIG5vdCBiZSBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBzdGF0aWMgUGFja2FnZSBnZXRQYWNrYWdlKENsYXNzTG9hZGVyIGxvYWRlciwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIGxvYWRlci5nZXRQYWNrYWdlKG5hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgdGhlIHBhY2thZ2VzIGtub3duIHRvIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqIFJldHVybnMgYWxsIHRoZSBwYWNrYWdlcyBrbm93biB0byB0aGlzIGNsYXNzIGxvYWRlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFsbCB0aGUgcGFja2FnZXMga25vd24gdG8gdGhpcyBjbGFzc2xvYWRlcgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCBhbGwgcGFja2FnZXMga25vd24gdG8gdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFBhY2thZ2VbXSBnZXRQYWNrYWdlcygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChwYWNrYWdlcykgewogICAgICAgICAgICAgQ29sbGVjdGlvbjxQYWNrYWdlPiBjb2wgPSBwYWNrYWdlcy52YWx1ZXMoKTsKLSAgICAgICAgICAgIHJldHVybiAoUGFja2FnZVtdKSBjb2wudG9BcnJheSgpOworICAgICAgICAgICAgcmV0dXJuIChQYWNrYWdlW10pY29sLnRvQXJyYXkoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlZmluZSBhIG5ldyBQYWNrYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uCisgICAgICogRGVmaW5lcyBhbmQgcmV0dXJucyBhIG5ldyB7QGNvZGUgUGFja2FnZX0gdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGluZm9ybWF0aW9uLiBJZiB7QGNvZGUgc2VhbEJhc2V9IGlzIHtAY29kZSBudWxsfSwgdGhlIHBhY2thZ2UgaXMgbGVmdAorICAgICAqIHVuc2VhbGVkLiBPdGhlcndpc2UsIHRoZSBwYWNrYWdlIGlzIHNlYWxlZCB1c2luZyB0aGlzIFVSTC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZQotICAgICAqIEBwYXJhbSBzcGVjVGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgUGFja2FnZQotICAgICAqIEBwYXJhbSBzcGVjVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIFBhY2thZ2UKLSAgICAgKiBAcGFyYW0gc3BlY1ZlbmRvciBUaGUgdmVuZG9yIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgUGFja2FnZQotICAgICAqIEBwYXJhbSBpbXBsVGl0bGUgVGhlIGltcGxlbWVudGF0aW9uIHRpdGxlIG9mIHRoZSBQYWNrYWdlCi0gICAgICogQHBhcmFtIGltcGxWZXJzaW9uIFRoZSBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIG9mIHRoZSBQYWNrYWdlCi0gICAgICogQHBhcmFtIGltcGxWZW5kb3IgVGhlIHNwZWNpZmljYXRpb24gdmVuZG9yIG9mIHRoZSBQYWNrYWdlCi0gICAgICogQHBhcmFtIHNlYWxCYXNlIElmIHNlYWxCYXNlIGlzIG51bGwsIHRoZSBwYWNrYWdlIGlzIGxlZnQgdW5zZWFsZWQuCi0gICAgICogICAgICAgIE90aGVyd2lzZSwgdGhlIHRoZSBwYWNrYWdlIGlzIHNlYWxlZCB1c2luZyB0aGlzIFVSTC4KLSAgICAgKiBAcmV0dXJuIFRoZSBQYWNrYWdlIGNyZWF0ZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgUGFja2FnZSBhbHJlYWR5IGV4aXN0cworICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZS4KKyAgICAgKiBAcGFyYW0gc3BlY1RpdGxlCisgICAgICogICAgICAgICAgICB0aGUgdGl0bGUgb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgICogQHBhcmFtIHNwZWNWZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3BlY1ZlbmRvcgorICAgICAqICAgICAgICAgICAgdGhlIHZlbmRvciBvZiB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gaW1wbFRpdGxlCisgICAgICogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gdGl0bGUuCisgICAgICogQHBhcmFtIGltcGxWZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gaW1wbFZlbmRvcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gdmVuZG9yLgorICAgICAqIEBwYXJhbSBzZWFsQmFzZQorICAgICAqICAgICAgICAgICAgdGhlIFVSTCB1c2VkIHRvIHNlYWwgdGhpcyBwYWNrYWdlIG9yIHtAY29kZSBudWxsfSB0byBsZWF2ZSB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhY2thZ2UgdW5zZWFsZWQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFBhY2thZ2V9IG9iamVjdCB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHBhY2thZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYWxyZWFkeSBleGlzdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFBhY2thZ2UgZGVmaW5lUGFja2FnZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNwZWNUaXRsZSwgU3RyaW5nIHNwZWNWZXJzaW9uLAotICAgICAgICAgICAgU3RyaW5nIHNwZWNWZW5kb3IsIFN0cmluZyBpbXBsVGl0bGUsIFN0cmluZyBpbXBsVmVyc2lvbiwgU3RyaW5nIGltcGxWZW5kb3IsCi0gICAgICAgICAgICBVUkwgc2VhbEJhc2UpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIHNwZWNWZW5kb3IsIFN0cmluZyBpbXBsVGl0bGUsIFN0cmluZyBpbXBsVmVyc2lvbiwgU3RyaW5nIGltcGxWZW5kb3IsIFVSTCBzZWFsQmFzZSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCi0gICAgICAgIHN5bmNocm9uaXplZChwYWNrYWdlcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhY2thZ2VzKSB7CiAgICAgICAgICAgICBpZiAocGFja2FnZXMuY29udGFpbnNLZXkobmFtZSkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlICIgKyBuYW1lICsgIiBhbHJlYWR5IGRlZmluZWQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICBQYWNrYWdlIG5ld1BhY2thZ2UgPSBuZXcgUGFja2FnZShuYW1lLCBzcGVjVGl0bGUsIHNwZWNWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBzcGVjVmVuZG9yLCBpbXBsVGl0bGUsIGltcGxWZXJzaW9uLCBpbXBsVmVuZG9yLCBzZWFsQmFzZSk7CisKKyAgICAgICAgICAgIFBhY2thZ2UgbmV3UGFja2FnZSA9IG5ldyBQYWNrYWdlKG5hbWUsIHNwZWNUaXRsZSwgc3BlY1ZlcnNpb24sIHNwZWNWZW5kb3IsIGltcGxUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgaW1wbFZlcnNpb24sIGltcGxWZW5kb3IsIHNlYWxCYXNlKTsKIAogICAgICAgICAgICAgcGFja2FnZXMucHV0KG5hbWUsIG5ld1BhY2thZ2UpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHJldHVybiBuZXdQYWNrYWdlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2lnbmVycyBvZiBhIGNsYXNzLgorICAgICAqIEdldHMgdGhlIHNpZ25lcnMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zCisgICAgICoge0Bjb2RlIG51bGx9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIFRoZSBDbGFzcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHNpZ25lcnMgVGhlIHNpZ25lcnMgZm9yIHRoZSBjbGFzcworICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENsYXNzfSBvYmplY3QgZm9yIHdoaWNoIHRvIGdldCB0aGUgc2lnbmVycy4KKyAgICAgKiBAcmV0dXJuIHNpZ25lcnMgdGhlIHNpZ25lcnMgb2Yge0Bjb2RlIGN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGZpbmFsIE9iamVjdFtdIGdldFNpZ25lcnMoQ2xhc3M8Pz4gYykgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaWduZXJzIG9mIGEgY2xhc3MuCisgICAgICogU2V0cyB0aGUgc2lnbmVycyBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMKKyAgICAgKiBub3RoaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIFRoZSBDbGFzcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gc2lnbmVycyBUaGUgc2lnbmVycyBmb3IgdGhlIGNsYXNzCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2xhc3N9IG9iamVjdCBmb3Igd2hpY2ggdG8gc2V0IHRoZSBzaWduZXJzLgorICAgICAqIEBwYXJhbSBzaWduZXJzCisgICAgICogICAgICAgICAgICB0aGUgc2lnbmVycyBmb3Ige0Bjb2RlIGN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNpZ25lcnMoQ2xhc3M8Pz4gYywgT2JqZWN0W10gc2lnbmVycykgewogICAgICAgICByZXR1cm47CkBAIC02NzUsMjUgKzgyOCwxNiBAQAogICAgICAqIDxsaT5UaGUgaXRlbSBhdCBkZXB0aCB6ZXJvIGlzIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2Q8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogCi0gICAgICogQHBhcmFtIGRlcHRoIHRoZSBzdGFjayBkZXB0aCBvZiB0aGUgcmVxdWVzdGVkIENsYXNzTG9hZGVyCisgICAgICogQHBhcmFtIGRlcHRoCisgICAgICogICAgICAgICAgICB0aGUgc3RhY2sgZGVwdGggb2YgdGhlIHJlcXVlc3RlZCBDbGFzc0xvYWRlcgogICAgICAqIEByZXR1cm4gdGhlIENsYXNzTG9hZGVyIGF0IHRoZSBzcGVjaWZpZWQgZGVwdGgKICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgZ2V0U3RhY2tDbGFzc0xvYWRlcihpbnQgZGVwdGgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbmNsdWRlZCwgYXMgaXQgaXMgdXNlZCBieSBTeXN0ZW0ubG9hZCgpLAotICAgICAqIFN5c3RlbS5sb2FkTGlicmFyeSgpLiBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHVzZXMKLSAgICAgKiB0aGUgZ2V0U3RhY2tDbGFzc0xvYWRlcigpIG1ldGhvZC4gUmV0dXJucyB0aGUgQ2xhc3NMb2FkZXIgb2YgdGhlIG1ldGhvZAotICAgICAqIHRoYXQgY2FsbGVkIHRoZSBjYWxsZXIuIGkuZS4gQS54KCkgY2FsbHMgQi55KCkgY2FsbHMgY2FsbGVyQ2xhc3NMb2FkZXIoKSwKLSAgICAgKiBBJ3MgQ2xhc3NMb2FkZXIgd2lsbCBiZSByZXR1cm5lZC4gUmV0dXJucyBudWxsIGZvciB0aGUgYm9vdHN0cmFwCi0gICAgICogQ2xhc3NMb2FkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIENsYXNzTG9hZGVyIG9yIG51bGwgZm9yIHRoZSBib290c3RyYXAgQ2xhc3NMb2FkZXIKLSAgICAgKi8KLSAgICBzdGF0aWMgQ2xhc3NMb2FkZXIgY2FsbGVyQ2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICBDbGFzczw/PltdIHN0YWNrID0gVk1TdGFjay5nZXRDbGFzc2VzKGRlcHRoICsgMSwgZmFsc2UpOworICAgICAgICBpZihzdGFjay5sZW5ndGggPCBkZXB0aCArIDEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGFja1tkZXB0aF0uZ2V0Q2xhc3NMb2FkZXIoKTsgCiAgICAgfQogCiAgICAgLyoqCkBAIC03MDMsMTAgKzg0NywxOCBAQAogICAgICAqIENsYXNzTG9hZGVyIG9mIHRoZSBjYWxsaW5nIG1ldGhvZC4gTG9hZHMgYW5kIGxpbmtzIHRoZSBsaWJyYXJ5IHNwZWNpZmllZAogICAgICAqIGJ5IHRoZSBhcmd1bWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGliTmFtZSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBsb2FkCi0gICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3Nsb2FkZXIgaW4gd2hpY2ggdG8gbG9hZCB0aGUgbGlicmFyeQotICAgICAqIEB0aHJvd3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3IgaWYgdGhlIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZAotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGxpYnJhcnkgd2FzIG5vdCBhbGxvd2VkIHRvIGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSBsaWJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBsb2FkCisgICAgICogQHBhcmFtIGxvYWRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzbG9hZGVyIGluIHdoaWNoIHRvIGxvYWQgdGhlIGxpYnJhcnkKKyAgICAgKiBAdGhyb3dzIFVuc2F0aXNmaWVkTGlua0Vycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGlicmFyeSB3YXMgbm90IGFsbG93ZWQgdG8gYmUgbG9hZGVkCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz5UaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgaW4gdGhlIEFuZHJvaWQgcmVmZXJlbmNlCisgICAgICogaW1wbGVtZW50YXRpb24uCisgICAgICogPC9wPgogICAgICAqLwogICAgIHN0YXRpYyB2b2lkIGxvYWRMaWJyYXJ5V2l0aENsYXNzTG9hZGVyKFN0cmluZyBsaWJOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNzE4LDQ4ICs4NzAsODIgQEAKICAgICAgKiB0aGUgbGlicmFyeSBpcyBsb2FkZWQgdXNpbmcgdGhlIENsYXNzTG9hZGVyIG9mIHRoZSBjYWxsaW5nIG1ldGhvZC4gTG9hZHMKICAgICAgKiBhbmQgbGlua3MgdGhlIGxpYnJhcnkgc3BlY2lmaWVkIGJ5IHRoZSBhcmd1bWVudC4gTm8gc2VjdXJpdHkgY2hlY2sgaXMKICAgICAgKiBkb25lLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+VGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGluIHRoZSBBbmRyb2lkIHJlZmVyZW5jZQorICAgICAqIGltcGxlbWVudGF0aW9uLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGliTmFtZSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBsb2FkCi0gICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3Nsb2FkZXIgaW4gd2hpY2ggdG8gbG9hZCB0aGUgbGlicmFyeQotICAgICAqIEBwYXJhbSBsaWJyYXJ5UGF0aCB0aGUgbGlicmFyeSBwYXRoIHRvIHNlYXJjaCwgb3IgbnVsbAotICAgICAqIEB0aHJvd3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3IgaWYgdGhlIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSBsaWJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBsb2FkCisgICAgICogQHBhcmFtIGxvYWRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzbG9hZGVyIGluIHdoaWNoIHRvIGxvYWQgdGhlIGxpYnJhcnkKKyAgICAgKiBAcGFyYW0gbGlicmFyeVBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHBhdGggdG8gc2VhcmNoLCBvciBudWxsCisgICAgICogQHRocm93cyBVbnNhdGlzZmllZExpbmtFcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQKICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBsb2FkTGlicmFyeVdpdGhQYXRoKFN0cmluZyBsaWJOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBsaWJyYXJ5UGF0aCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXNzZXJ0aW9uIHN0YXR1cyBvZiBhIGNsYXNzLgorICAgICAqIFNldHMgdGhlIGFzc2VydGlvbiBzdGF0dXMgb2YgdGhlIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+VGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGluIHRoZSBBbmRyb2lkIHJlZmVyZW5jZQorICAgICAqIGltcGxlbWVudGF0aW9uLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY25hbWUgQ2xhc3MgbmFtZQotICAgICAqIEBwYXJhbSBlbmFibGUgRW5hYmxlIG9yIGRpc2FibGUgYXNzZXJ0aW9uCisgICAgICogQHBhcmFtIGNuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHdoaWNoIHRvIHNldCB0aGUgYXNzZXJ0aW9uIHN0YXR1cy4KKyAgICAgKiBAcGFyYW0gZW5hYmxlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGFzc2VydGlvbiBzdGF0dXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NBc3NlcnRpb25TdGF0dXMoU3RyaW5nIGNuYW1lLCBib29sZWFuIGVuYWJsZSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXNzZXJ0aW9uIHN0YXR1cyBvZiBhIHBhY2thZ2UuCisgICAgICogU2V0cyB0aGUgYXNzZXJ0aW9uIHN0YXR1cyBvZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6IDwvc3Ryb25nPlRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpbiB0aGUgQW5kcm9pZCByZWZlcmVuY2UKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIHBuYW1lIFBhY2thZ2UgbmFtZQotICAgICAqIEBwYXJhbSBlbmFibGUgRW5hYmxlIG9yIGRpc2FibGUgYXNzZXJ0aW9uCi0gICAgICovCisgICAgICogQHBhcmFtIHBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBmb3Igd2hpY2ggdG8gc2V0IHRoZSBhc3NlcnRpb24gc3RhdHVzLgorICAgICAqIEBwYXJhbSBlbmFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYXNzZXJ0aW9uIHN0YXR1cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZUFzc2VydGlvblN0YXR1cyhTdHJpbmcgcG5hbWUsIGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IGFzc2VydGlvbiBzdGF0dXMgb2YgYSBjbGFzc2xvYWRlcgorICAgICAqIFNldHMgdGhlIGRlZmF1bHQgYXNzZXJ0aW9uIHN0YXR1cyBmb3IgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz5UaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgaW4gdGhlIEFuZHJvaWQgcmVmZXJlbmNlCisgICAgICogaW1wbGVtZW50YXRpb24uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbmFibGUgRW5hYmxlIG9yIGRpc2FibGUgYXNzZXJ0aW9uCisgICAgICogQHBhcmFtIGVuYWJsZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhc3NlcnRpb24gc3RhdHVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRBc3NlcnRpb25TdGF0dXMoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgZGVmYXVsdCwgcGFja2FnZSBhbmQgY2xhc3MgYXNzZXJ0aW9uIHN0YXR1cyBvZiBhIGNsYXNzbG9hZGVyCisgICAgICogU2V0cyB0aGUgZGVmYXVsdCBhc3NlcnRpb24gc3RhdHVzIGZvciB0aGlzIGNsYXNzIGxvYWRlciB0byB7QGNvZGUgZmFsc2V9CisgICAgICogYW5kIHJlbW92ZXMgYW55IHBhY2thZ2UgZGVmYXVsdCBhbmQgY2xhc3MgYXNzZXJ0aW9uIHN0YXR1cyBzZXR0aW5ncy4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpbiB0aGUgQW5kcm9pZCByZWZlcmVuY2UKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiA8L3A+CiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJBc3NlcnRpb25TdGF0dXMoKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTc3Myw3ICs5NTksOCBAQAogICAgICAqIDAgZm9yIGRpc2FibGVkLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFzc2VydGlvbiBzdGF0dXMuCi0gICAgICogQHBhcmFtIGNuYW1lIHRoZSBuYW1lIG9mIGNsYXNzLgorICAgICAqIEBwYXJhbSBjbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgY2xhc3MuCiAgICAgICovCiAgICAgYm9vbGVhbiBnZXRDbGFzc0Fzc2VydGlvblN0YXR1cyhTdHJpbmcgY25hbWUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzg2LDcgKzk3Myw4IEBACiAgICAgICogMCBmb3IgZGlzYWJsZWQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXNzZXJ0aW9uIHN0YXR1cy4KLSAgICAgKiBAcGFyYW0gcG5hbWUgdGhlIG5hbWUgb2YgcGFja2FnZS4KKyAgICAgKiBAcGFyYW0gcG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHBhY2thZ2UuCiAgICAgICovCiAgICAgYm9vbGVhbiBnZXRQYWNrYWdlQXNzZXJ0aW9uU3RhdHVzKFN0cmluZyBwbmFtZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03OTUsNyArOTgzLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGFzc2VydGlvbiBzdGF0dXMKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdGhlIGRlZmF1bHQgYXNzZXJ0aW9uIHN0YXR1cy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGFzc2VydGlvbiBzdGF0dXMuCiAgICAgICovCiAgICAgYm9vbGVhbiBnZXREZWZhdWx0QXNzZXJ0aW9uU3RhdHVzKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC04MTAsMTQgKzk5OCwxNCBAQAogY2xhc3MgVHdvRW51bWVyYXRpb25zSW5PbmUgaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxVUkw+IHsKIAogICAgIHByaXZhdGUgRW51bWVyYXRpb248VVJMPiBmaXJzdDsKLSAgICAKKwogICAgIHByaXZhdGUgRW51bWVyYXRpb248VVJMPiBzZWNvbmQ7Ci0gICAgCisKICAgICBwdWJsaWMgVHdvRW51bWVyYXRpb25zSW5PbmUoRW51bWVyYXRpb248VVJMPiBmaXJzdCwgRW51bWVyYXRpb248VVJMPiBzZWNvbmQpIHsKICAgICAgICAgdGhpcy5maXJzdCA9IGZpcnN0OwogICAgICAgICB0aGlzLnNlY29uZCA9IHNlY29uZDsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CiAgICAgICAgIHJldHVybiBmaXJzdC5oYXNNb3JlRWxlbWVudHMoKSB8fCBzZWNvbmQuaGFzTW9yZUVsZW1lbnRzKCk7CiAgICAgfQpAQCAtODI1LDExICsxMDEzLDExIEBACiAgICAgcHVibGljIFVSTCBuZXh0RWxlbWVudCgpIHsKICAgICAgICAgaWYgKGZpcnN0Lmhhc01vcmVFbGVtZW50cygpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmlyc3QubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gc2Vjb25kLm5leHRFbGVtZW50KCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKIH0KIAogLyoqCkBAIC04NzgsMTQgKzEwNjYsMTQgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuIFVuZm9ydHVuYXRlbHksIHRoZQotICAgICAqIEJvb3RDbGFzc0xvYWRlciBkb2Vzbid0IHJlYWxseSBoYXZlIHRoaXMgaW5mb3JtYXRpb24sIGFuZCBhcyBhCisgICAgICogQW5kcm9pZCBCb290Q2xhc3NMb2FkZXIgZG9lc24ndCByZWFsbHkgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLCBhbmQgYXMgYQogICAgICAqIG5vbi1zZWN1cmUgQ2xhc3NMb2FkZXIsIGl0IGlzbid0IGV2ZW4gcmVxdWlyZWQgdG8sIGFjY29yZGluZyB0byB0aGUgc3BlYy4KICAgICAgKiBZZXQsIHdlIHdhbnQgdG8gcHJvdmlkZSBpdCwgaW4gb3JkZXIgdG8gbWFrZSBhbGwgdGhvc2UgaG9wZWZ1bCBjYWxsZXJzIG9mCi0gICAgICogPGNvZGU+bXlDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpPC9jb2RlPiBoYXBweS4gVGh1cyB3ZSBjb25zdHJ1Y3QgYQotICAgICAqIFBhY2thZ2Ugb2JqZWN0IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGJlaW5nIHJlcXVlc3RlZCBhbmQgZmlsbCBtb3N0IG9mIHRoZQotICAgICAqIGZpZWxkcyB3aXRoIGR1bW15IHZhbHVlcy4gVGhlIFBhY2thZ2Ugb2JqZWN0IGlzIHRoZW4gcHV0IGludG8gdGhlCi0gICAgICogQ2xhc3NMb2FkZXIncyBQYWNrYWdlIGNhY2hlLCBzbyB3ZSBzZWUgdGhlIHNhbWUgb25lIG5leHQgdGltZS4gV2UgZG9uJ3QKLSAgICAgKiBjcmVhdGUgUGFja2FnZSBvYmplY3RzIGZvciBudWxsIGFyZ3VtZW50cyBvciBmb3IgdGhlIGRlZmF1bHQgcGFja2FnZS4KKyAgICAgKiB7QGNvZGUgbXlDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpfSBoYXBweS4gVGh1cyB3ZSBjb25zdHJ1Y3QgYSBQYWNrYWdlCisgICAgICogb2JqZWN0IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGJlaW5nIHJlcXVlc3RlZCBhbmQgZmlsbCBtb3N0IG9mIHRoZSBmaWVsZHMKKyAgICAgKiB3aXRoIGR1bW15IHZhbHVlcy4gVGhlIFBhY2thZ2Ugb2JqZWN0IGlzIHRoZW4gcHV0IGludG8gdGhlIENsYXNzTG9hZGVyJ3MKKyAgICAgKiBQYWNrYWdlIGNhY2hlLCBzbyB3ZSBzZWUgdGhlIHNhbWUgb25lIG5leHQgdGltZS4gV2UgZG9uJ3QgY3JlYXRlIFBhY2thZ2UKKyAgICAgKiBvYmplY3RzIGZvciBudWxsIGFyZ3VtZW50cyBvciBmb3IgdGhlIGRlZmF1bHQgcGFja2FnZS4KICAgICAgKiA8cD4KICAgICAgKiBUaGVyZSBhIGxpbWl0ZWQgY2hhbmNlIHRoYXQgd2UgZW5kIHVwIHdpdGggbXVsdGlwbGUgUGFja2FnZSBvYmplY3RzCiAgICAgICogcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBhY2thZ2U6IEl0IGNhbiBoYXBwZW4gd2hlbiB3aGVuIGEgcGFja2FnZSBpcwpAQCAtODk2LDI2ICsxMDg0LDI0IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFBhY2thZ2UgZ2V0UGFja2FnZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgICAgICBQYWNrYWdlIHBhY2sgPSBzdXBlci5nZXRQYWNrYWdlKG5hbWUpOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgaWYgKHBhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYWNrID0gZGVmaW5lUGFja2FnZShuYW1lLCAiVW5rbm93biIsICIwLjAiLCAiVW5rbm93biIsICJVbmtub3duIiwgIjAuMCIsICJVbmtub3duIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHBhY2sgPSBkZWZpbmVQYWNrYWdlKG5hbWUsICJVbmtub3duIiwgIjAuMCIsICJVbmtub3duIiwgIlVua25vd24iLCAiMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsIG51bGwpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIHJldHVybiBwYWNrOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogfQogCiAvKioKLSAqIFRPRE8gT3BlbiBpc3N1ZXMKLSAqIC0gTWlzc2luZyAvIGVtcHR5IG1ldGhvZHMKLSAqIC0gU2lnbmVyIHN0dWZmCi0gKiAtIFByb3RlY3Rpb24gZG9tYWlucwotICogLSBBc3NlcnRpb25zCisgKiBUT0RPIE9wZW4gaXNzdWVzIC0gTWlzc2luZyAvIGVtcHR5IG1ldGhvZHMgLSBTaWduZXIgc3R1ZmYgLSBQcm90ZWN0aW9uCisgKiBkb21haW5zIC0gQXNzZXJ0aW9ucwogICovCmRpZmYgLS1naXQgYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Db21waWxlci5qYXZhIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ29tcGlsZXIuamF2YQppbmRleCAwNmMxNWJmLi5jZjQxZjA2IDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Db21waWxlci5qYXZhCisrKyBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NvbXBpbGVyLmphdmEKQEAgLTE4LDExICsxOCwxMyBAQAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBWTSB2ZW5kb3IuIFRoaXMgY2xhc3MgaXMgYSBwbGFjZWhvbGRlcgotICogZm9yIGVudmlyb25tZW50cyB3aGljaCBleHBsaWNpdGx5IG1hbmFnZSB0aGUgYWN0aW9uIG9mIGEgIkp1c3QgSW4gVGltZSIKLSAqIGNvbXBpbGVyLgorICogUGxhY2Vob2xkZXIgY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGljaCBleHBsaWNpdGx5IG1hbmFnZSB0aGUgYWN0aW9uIG9mIGEKKyAqIDxlbT5KdXN0IEluIFRpbWUgKEpJVCk8L2VtPiBjb21waWxlci4gVGhpcyBjbGFzcyBpcyB1c3VhbGx5IGltcGxlbWVudGVkIGJ5CisgKiB0aGUgdmlydHVhbCBtYWNoaW5lIHZlbmRvci4gVGhlIEFuZHJvaWQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90CisgKiAoeWV0KSBjb250YWluIHN1Y2ggYSBKSVQgY29tcGlsZXIsIHRob3VnaCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSB0bworICogcHJvdmlkZSBvbmUuCiAgKiAKLSAqIEBzZWUgQ2xvbmVhYmxlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENvbXBpbGVyIHsKIApAQCAtMzQsNTEgKzM2LDYyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG93IGxldmVsIGludGVyZmFjZSB0byB0aGUgSklUIGNvbXBpbGVyLiBDYW4gcmV0dXJuIGFueSBvYmplY3QsIG9yIG51bGwKLSAgICAgKiBpZiBubyBKSVQgY29tcGlsZXIgaXMgYXZhaWxhYmxlLgorICAgICAqIEV4ZWN1dGVzIGFuIG9wZXJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjb21tYW5kIG9iamVjdC4gVGhpcworICAgICAqIG1ldGhvZCBpcyB0aGUgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgSklUIGNvbXBpbGVyLiBJdCBtYXkgcmV0dXJuIGFueQorICAgICAqIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gSklUIGNvbXBpbGVyIGlzIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE9iamVjdCByZXN1bHQgb2YgZXhlY3V0aW5nIGNvbW1hbmQKLSAgICAgKiBAcGFyYW0gY21kIE9iamVjdCBhIGNvbW1hbmQgZm9yIHRoZSBKSVQgY29tcGlsZXIKKyAgICAgKiBAcGFyYW0gY21kCisgICAgICogICAgICAgICAgICB0aGUgY29tbWFuZCBvYmplY3QgZm9yIHRoZSBKSVQgY29tcGlsZXIuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyBjb21tYW5kIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb21tYW5kKE9iamVjdCBjbWQpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGlsZXMgdGhlIGNsYXNzIHVzaW5nIHRoZSBKSVQgY29tcGlsZXIuIFJldHVybnMgdHJ1ZSBpZiB0aGUKLSAgICAgKiBjb21waWxhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3IgZmFsc2UgaWYgaXQgZmFpbGVkIG9yIHRoZXJlIHdhcyBubyBKSVQKLSAgICAgKiBjb21waWxlciBhdmFpbGFibGUuCisgICAgICogQ29tcGlsZXMgdGhlIHNwZWNpZmllZCBjbGFzcyB1c2luZyB0aGUgSklUIGNvbXBpbGVyIGFuZCBpbmRpY2F0ZXMgaWYKKyAgICAgKiBjb21waWxhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGNvbXBpbGF0aW9uIHN1Y2Nlc3MKLSAgICAgKiBAcGFyYW0gY2xhc3NUb0NvbXBpbGUgamF2YS5sYW5nLkNsYXNzIHRoZSBjbGFzcyB0byBKSVQgY29tcGlsZQorICAgICAqIEBwYXJhbSBjbGFzc1RvQ29tcGlsZQorICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzIHRoZSBjbGFzcyB0byBKSVQgY29tcGlsZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb21waWxhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsOworICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBpdCBoYXMgZmFpbGVkIG9yIGlmIHRoZXJlIGlzIG5vIEpJVCBjb21waWxlcgorICAgICAqICAgICAgICAgYXZhaWxhYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlQ2xhc3MoQ2xhc3M8Pz4gY2xhc3NUb0NvbXBpbGUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBpbGVzIGFsbCBjbGFzc2VzIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgYXJndW1lbnQgdXNpbmcgdGhlIEpJVAotICAgICAqIGNvbXBpbGVyLiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBpbGF0aW9uIHdhcyBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiBpdAotICAgICAqIGZhaWxlZCBvciB0aGVyZSB3YXMgbm8gSklUIGNvbXBpbGVyIGF2YWlsYWJsZS4KKyAgICAgKiBDb21waWxlcyBhbGwgY2xhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBuYW1lIHVzaW5nIHRoZSBKSVQKKyAgICAgKiBjb21waWxlciBhbmQgaW5kaWNhdGVzIGlmIGNvbXBpbGF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWwuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIGluZGljYXRpbmcgY29tcGlsYXRpb24gc3VjY2VzcwotICAgICAqIEBwYXJhbSBuYW1lUm9vdCBTdHJpbmcgdGhlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0IGNsYXNzIG5hbWVzCisgICAgICogQHBhcmFtIG5hbWVSb290CisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIG1hdGNoIGNsYXNzIG5hbWVzIHdpdGguCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNvbXBpbGF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWw7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIGl0IGhhcyBmYWlsZWQgb3IgaWYgdGhlcmUgaXMgbm8gSklUIGNvbXBpbGVyCisgICAgICogICAgICAgICBhdmFpbGFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGVDbGFzc2VzKFN0cmluZyBuYW1lUm9vdCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzYWJsZSB0aGUgSklUIGNvbXBpbGVyCisgICAgICogRGlzYWJsZXMgdGhlIEpJVCBjb21waWxlci4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZSgpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc2FibGUgdGhlIEpJVCBjb21waWxlcgorICAgICAqIEVuYWJsZXMgdGhlIEpJVCBjb21waWxlci4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlKCkgewogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9PYmplY3QuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL09iamVjdC5qYXZhCmluZGV4IDcwZDA1ZGEuLjRmZWY2MDkgMTAwNjQ0Ci0tLSBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL09iamVjdC5qYXZhCisrKyBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL09iamVjdC5qYXZhCkBAIC0xNCwzMyArMTQsNjUgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSB2bSB2ZW5kb3IuIE9iamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUKLSAqIGphdmEgY2xhc3MgaGllcmFyY2h5LiBBbGwgbm9uLWJhc2UgdHlwZXMgcmVzcG9uZCB0byB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbgotICogdGhpcyBjbGFzcy4KKyAqIFRoZSByb290IGNsYXNzIG9mIHRoZSBKYXZhIGNsYXNzIGhpZXJhcmNoeS4gQWxsIG5vbi1wcmltaXRpdmUgdHlwZXMKKyAqIChpbmNsdWRpbmcgYXJyYXlzKSBpbmhlcml0IGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gdGhpcyBjbGFzcy4KKyAqIDxwPgorICoge0Bjb2RlIE9iamVjdH0gcHJvdmlkZXMgc29tZSBmdW5kYW1lbnRhbCBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlCisgKiB7QGxpbmsgQ2xhc3N9IG9mIGFuIG9iamVjdCwgZ2V0dGluZyBpdHMge0BsaW5rICNoYXNoQ29kZSgpfSwgb3IgY2hlY2tpbmcKKyAqIHdoZXRoZXIgb25lIG9iamVjdCB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSBhbm90aGVyLiBUaGUge0BsaW5rICN0b1N0cmluZygpfQorICogbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYW4gb2JqZWN0IHJlZmVyZW5jZSBpbnRvIGEgcHJpbnRhYmxlIHN0cmluZyBhbmQKKyAqIGlzIG9mdGVuIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3Nlcy4KKyAqIDxwPgorICogVGhlIHtAbGluayAjd2FpdCgpfSBhbmQge0BsaW5rICNub3RpZnkoKX0gbWV0aG9kcyBwcm92aWRlIGEgZm91bmRhdGlvbiBmb3IKKyAqIHN5bmNocm9uaXphdGlvbiwgYWNxdWlyaW5nIGFuZCByZWxlYXNpbmcgYW4gaW50ZXJuYWwgbW9uaXRvciBhc3NvY2lhdGVkIHdpdGgKKyAqIGVhY2gge0Bjb2RlIE9iamVjdH0uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgT2JqZWN0IHsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBPYmplY3R9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBhcyB0aGUgcmVjZWl2ZXIsIHdob3NlIHNsb3RzCi0gICAgICogaGF2ZSBiZWVuIGZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZXMgaW4gdGhlIHNsb3RzIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGFzc2VzIHdoaWNoIHdpc2ggdG8gc3VwcG9ydCBjbG9uaW5nIG11c3Qgc3BlY2lmeSB0aGF0IHRoZXkgaW1wbGVtZW50Ci0gICAgICogdGhlIENsb25lYWJsZSBpbnRlcmZhY2UsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGVja3MgZm9yIHRoaXMuCisgICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhpcyB7QGNvZGUgT2JqZWN0fS4gVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgc28tY2FsbGVkICJzaGFsbG93IiBjb3B5OiBJdCBjcmVhdGVzIGEgbmV3CisgICAgICogaW5zdGFuY2Ugb2YgdGhlIHNhbWUgY2xhc3MgYW5kIHRoZW4gY29waWVzIHRoZSBmaWVsZCB2YWx1ZXMgKGluY2x1ZGluZworICAgICAqIG9iamVjdCByZWZlcmVuY2VzKSBmcm9tIHRoaXMgaW5zdGFuY2UgdG8gdGhlIG5ldyBpbnN0YW5jZS4gQSAiZGVlcCIgY29weSwKKyAgICAgKiBpbiBjb250cmFzdCwgd291bGQgYWxzbyByZWN1cnNpdmVseSBjbG9uZSBuZXN0ZWQgb2JqZWN0cy4gQSBzdWJjbGFzcyB0aGF0CisgICAgICogbmVlZHMgdG8gaW1wbGVtZW50IHRoaXMga2luZCBvZiBjbG9uaW5nIHNob3VsZCBjYWxsIHtAY29kZSBzdXBlci5jbG9uZSgpfQorICAgICAqIHRvIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVuIGNyZWF0ZSBkZWVwIGNvcGllcyBvZiB0aGUgbmVzdGVkLAorICAgICAqIG11dGFibGUgb2JqZWN0cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE9iamVjdCBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSByZWNlaXZlcidzIGNsYXNzIGRvZXMgbm90Ci0gICAgICogICAgICAgICBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBDbG9uZWFibGUuCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBvYmplY3QuCisgICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBDbG9uZWFibGV9IGludGVyZmFjZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENsb25lYWJsZSkpIHsKQEAgLTU2LDc3ICs4OCwxNDYgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBPYmplY3QgaW50ZXJuYWxDbG9uZShDbG9uZWFibGUgbyk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudAotICAgICAqIHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uIFRoZQotICAgICAqIGltcGxlbWVudGF0aW9uIGluIE9iamVjdCByZXR1cm5zIHRydWUgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgdGhlIGV4YWN0Ci0gICAgICogc2FtZSBvYmplY3QgYXMgdGhlIHJlY2VpdmVyICg9PSkuCisgICAgICogQ29tcGFyZXMgdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBpbmRpY2F0ZXMgaWYgdGhleQorICAgICAqIGFyZSBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvfSBtdXN0IHJlcHJlc2VudCB0aGUgc2FtZSBvYmplY3QKKyAgICAgKiBhcyB0aGlzIGluc3RhbmNlIHVzaW5nIGEgY2xhc3Mtc3BlY2lmaWMgY29tcGFyaXNvbi4gVGhlIGdlbmVyYWwgY29udHJhY3QKKyAgICAgKiBpcyB0aGF0IHRoaXMgY29tcGFyaXNvbiBzaG91bGQgYmUgYm90aCB0cmFuc2l0aXZlIGFuZCByZWZsZXhpdmUuCisgICAgICogPHA+CisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGluIHtAY29kZSBPYmplY3R9IHJldHVybnMge0Bjb2RlIHRydWV9IG9ubHkgaWYge0Bjb2RlCisgICAgICogb30gaXMgdGhlIGV4YWN0IHNhbWUgb2JqZWN0IGFzIHRoZSByZWNlaXZlciAodXNpbmcgdGhlID09IG9wZXJhdG9yIGZvcgorICAgICAqIGNvbXBhcmlzb24pLiBTdWJjbGFzc2VzIG9mdGVuIGltcGxlbWVudCB7QGNvZGUgZXF1YWxzKE9iamVjdCl9IHNvIHRoYXQKKyAgICAgKiBpdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHR3byBvYmplY3QncyB0eXBlcyBhbmQgc3RhdGVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZ2VuZXJhbCBjb250cmFjdCBmb3IgdGhlIHtAY29kZSBlcXVhbHMoT2JqZWN0KX0gYW5kIHtAbGluaworICAgICAqICNoYXNoQ29kZSgpfSBtZXRob2RzIGlzIHRoYXQgaWYge0Bjb2RlIGVxdWFsc30gcmV0dXJucyB7QGNvZGUgdHJ1ZX0gZm9yCisgICAgICogYW55IHR3byBvYmplY3RzLCB0aGVuIHtAY29kZSBoYXNoQ29kZSgpfSBtdXN0IHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IKKyAgICAgKiB0aGVzZSBvYmplY3RzLiBUaGlzIG1lYW5zIHRoYXQgc3ViY2xhc3NlcyBvZiB7QGNvZGUgT2JqZWN0fSB1c3VhbGx5CisgICAgICogb3ZlcnJpZGUgZWl0aGVyIGJvdGggbWV0aG9kcyBvciBub25lIG9mIHRoZW0uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBvIE9iamVjdCB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzCi0gICAgICogICAgICAgICBvYmplY3QgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0LgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBpbnN0YW5jZSB3aXRoLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBPYmplY3R9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogICAgICAgICByZXR1cm4gdGhpcyA9PSBvOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgdmlydHVhbCBtYWNoaW5lIHdoZW4gdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgKG5vbi13ZWFrKQotICAgICAqIHJlZmVyZW5jZXMgdG8gdGhlIHJlY2VpdmVyLiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyBmYWNpbGl0eSB0byBndWFyYW50ZWUKLSAgICAgKiB0aGF0IGFueSBhc3NvY2lhdGVkIHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCBiZWZvcmUgdGhlIHJlY2VpdmVyIGlzCi0gICAgICogZ2FyYmFnZSBjb2xsZWN0ZWQuIFVuY2F1Z2h0IGV4Y2VwdGlvbnMgd2hpY2ggYXJlIHRocm93biBkdXJpbmcgdGhlCi0gICAgICogcnVubmluZyBvZiB0aGUgbWV0aG9kIGNhdXNlIGl0IHRvIHRlcm1pbmF0ZSBpbW1lZGlhdGVseSwgYnV0IGFyZQotICAgICAqIG90aGVyd2lzZSBpZ25vcmVkLgorICAgICAqIElzIGNhbGxlZCBiZWZvcmUgdGhlIG9iamVjdCdzIG1lbW9yeSBpcyBiZWluZyByZWNsYWltZWQgYnkgdGhlIFZNLiBUaGlzCisgICAgICogY2FuIG9ubHkgaGFwcGVuIG9uY2UgdGhlIFZNIGhhcyBkZXRlY3RlZCwgZHVyaW5nIGEgcnVuIG9mIHRoZSBnYXJiYWdlCisgICAgICogY29sbGVjdG9yLCB0aGF0IHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIHJlYWNoYWJsZSBieSBhbnkgdGhyZWFkIG9mIHRoZQorICAgICAqIHJ1bm5pbmcgYXBwbGljYXRpb24uICAKICAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBUaGUgdmlydHVhbCBtYWNoaW5lIGFzc3VtZXMgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gaW4gY2xhc3MgT2JqZWN0Ci0gICAgICogaXMgZW1wdHkuCisgICAgICogVGhlIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmcmVlIHN5c3RlbSByZXNvdXJjZXMgb3IgcGVyZm9ybSBvdGhlciBjbGVhbnVwCisgICAgICogYmVmb3JlIHRoZSBvYmplY3QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAgICAqIG1ldGhvZCBpcyBlbXB0eSwgd2hpY2ggaXMgYWxzbyBleHBlY3RlZCBieSB0aGUgVk0sIGJ1dCBzdWJjbGFzc2VzIGNhbgorICAgICAqIG92ZXJyaWRlIHtAY29kZSBmaW5hbGl6ZSgpfSBhcyByZXF1aXJlZC4gVW5jYXVnaHQgZXhjZXB0aW9ucyB3aGljaCBhcmUKKyAgICAgKiB0aHJvd24gZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QgY2F1c2UgaXQgdG8gdGVybWluYXRlCisgICAgICogaW1tZWRpYXRlbHkgYnV0IGFyZSBvdGhlcndpc2UgaWdub3JlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIFZNIGRvZXMgZ3VhcmFudGVlIHRoYXQge0Bjb2RlIGZpbmFsaXplKCl9IGlzIGNhbGxlZCBhdCBtb3N0CisgICAgICogb25jZSBmb3IgYW55IG9iamVjdCwgYnV0IGl0IGRvZXNuJ3QgZ3VhcmFudGVlIHdoZW4gKGlmIGF0IGFsbCkge0Bjb2RlCisgICAgICogZmluYWxpemUoKX0gd2lsbCBiZSBjYWxsZWQuIEZvciBleGFtcGxlLCBvYmplY3QgQidzIHtAY29kZSBmaW5hbGl6ZSgpfQorICAgICAqIGNhbiBkZWxheSB0aGUgZXhlY3V0aW9uIG9mIG9iamVjdCBBJ3Mge0Bjb2RlIGZpbmFsaXplKCl9IG1ldGhvZCBhbmQKKyAgICAgKiB0aGVyZWZvcmUgaXQgY2FuIGRlbGF5IHRoZSByZWNsYW1hdGlvbiBvZiBBJ3MgbWVtb3J5LiBUbyBiZSBzYWZlLCB1c2UgYQorICAgICAqIHtAbGluayBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlfSwgYmVjYXVzZSBpdCBwcm92aWRlcyBtb3JlIGNvbnRyb2wKKyAgICAgKiBvdmVyIHRoZSB3YXkgdGhlIFZNIGRlYWxzIHdpdGggcmVmZXJlbmNlcyBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFRocm93YWJsZSBUaGUgdmlydHVhbCBtYWNoaW5lIGlnbm9yZXMgYW55IGV4Y2VwdGlvbnMgd2hpY2ggYXJlCi0gICAgICogICAgICAgICB0aHJvd24gZHVyaW5nIGZpbmFsaXphdGlvbi4KKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqICAgICAgICAgICAgIGFueSBleGNlcHRpb24gd2hpY2ggaXMgcmFpc2VkIGR1cmluZyBmaW5hbGl6YXRpb247IHRoZXNlIGFyZQorICAgICAqICAgICAgICAgICAgIGlnbm9yZWQgYnkgdGhlIHZpcnR1YWwgbWFjaGluZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBpbnN0YW5jZSBvZiBqYXZhLmxhbmcuQ2xhc3Mgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2xhc3MKLSAgICAgKiBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIGluc3RhbmNlIG9mIHtAbGluayBDbGFzc30gd2hpY2ggcmVwcmVzZW50cyB0aGlzCisgICAgICogb2JqZWN0J3MgY2xhc3MuIE5vdGUgdGhhdCB7QGNvZGUgZ2V0Q2xhc3MoKX0gaXMgYSBzcGVjaWFsIGNhc2UgaW4gdGhhdCBpdAorICAgICAqIGFjdHVhbGx5IHJldHVybnMge0Bjb2RlIENsYXNzPD8gZXh0ZW5kcyBGb28+fSB3aGVyZSB7QGNvZGUgRm9vfSBpcyB0aGUKKyAgICAgKiBlcmFzdXJlIG9mIHRoZSB0eXBlIG9mIGV4cHJlc3Npb24ge0Bjb2RlIGdldENsYXNzKCl9IHdhcyBjYWxsZWQgdXBvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBBcyBhbiBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgYWN0dWFsbHkgY29tcGlsZXMsIGFsdGhvdWdoIG9uZSBtaWdodAorICAgICAqIHRoaW5rIGl0IHNob3VsZG4ndDoKKyAgICAgKiA8cD4KKyAgICAgKiA8cHJlPgorICAgICAqIExpc3Q8SW50ZWdlcj4gbCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgKiBDbGFzczw/IGV4dGVuZHMgTGlzdD4gYyA9IGwuZ2V0Q2xhc3MoKTsKKyAgICAgKiA8L3ByZT4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENsYXNzIHRoZSByZWNlaXZlcidzIENsYXNzCisgICAgICogQHJldHVybiB0aGlzIG9iamVjdCdzIHtAY29kZSBDbGFzc30gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIG5hdGl2ZSBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBnZXRDbGFzcygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIG9iamVjdHMgd2hpY2gKLSAgICAgKiBhbnN3ZXIgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gPGNvZGU+LmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhpcyBvYmplY3QuIEJ5IGNvbnRyYWN0LCBhbnkgdHdvCisgICAgICogb2JqZWN0cyBmb3Igd2hpY2gge0Bjb2RlIGVxdWFscyhPYmplY3QpfSByZXR1cm5zIHtAY29kZSB0cnVlfSBtdXN0IHJldHVybgorICAgICAqIHRoZSBzYW1lIGhhc2ggY29kZSB2YWx1ZS4gVGhpcyBtZWFucyB0aGF0IHN1YmNsYXNzZXMgb2Yge0Bjb2RlIE9iamVjdH0KKyAgICAgKiB1c3VhbGx5IG92ZXJyaWRlIGJvdGggbWV0aG9kcyBvciBuZWl0aGVyIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgcmVjZWl2ZXIncyBoYXNoLgorICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QncyBoYXNoIGNvZGUuCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIG5hdGl2ZSBpbnQgaGFzaENvZGUoKTsKIAogICAgIC8qKgotICAgICAqIENhdXNlcyBvbmUgdGhyZWFkIHdoaWNoIGlzIDxjb2RlPndhaXQ8L2NvZGU+IGluZyBvbiB0aGUgcmVjZWl2ZXIgdG8gYmUKLSAgICAgKiBtYWRlIHJlYWR5IHRvIHJ1bi4gVGhpcyBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgdGhyZWFkIHdpbGwKLSAgICAgKiBpbW1lZGlhdGVseSBydW4uIFRoZSBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBieSBhIHRocmVhZCB3aGljaCBvd25zCi0gICAgICogdGhlIHJlY2VpdmVyJ3MgbW9uaXRvci4KKyAgICAgKiBDYXVzZXMgYSB0aHJlYWQgd2hpY2ggaXMgd2FpdGluZyBvbiB0aGlzIG9iamVjdCdzIG1vbml0b3IgKGJ5IG1lYW5zIG9mCisgICAgICogY2FsbGluZyBvbmUgb2YgdGhlIHtAY29kZSB3YWl0KCl9IG1ldGhvZHMpIHRvIGJlIHdva2VuIHVwLiBJZiBtb3JlIHRoYW4KKyAgICAgKiBvbmUgdGhyZWFkIGlzIHdhaXRpbmcsIG9uZSBvZiB0aGVtIGlzIGNob3NlbiBhdCB0aGUgZGlzY3JldGlvbiBvZiB0aGUKKyAgICAgKiB2aXJ0dWFsIG1hY2hpbmUuIFRoZSBjaG9zZW4gdGhyZWFkIHdpbGwgbm90IHJ1biBpbW1lZGlhdGVseS4gVGhlIHRocmVhZAorICAgICAqIHRoYXQgY2FsbGVkIHtAY29kZSBub3RpZnkoKX0gaGFzIHRvIHJlbGVhc2UgdGhlIG9iamVjdCdzIG1vbml0b3IgZmlyc3QuCisgICAgICogQWxzbywgdGhlIGNob3NlbiB0aHJlYWQgc3RpbGwgaGFzIHRvIGNvbXBldGUgYWdhaW5zdCBvdGhlciB0aHJlYWRzIHRoYXQKKyAgICAgKiB0cnkgdG8gc3luY2hyb25pemUgb24gdGhlIHNhbWUgb2JqZWN0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgYnkgYSB0aHJlYWQgd2hpY2ggb3ducyB0aGlzIG9iamVjdCdzCisgICAgICogbW9uaXRvci4gQSB0aHJlYWQgYmVjb21lcyBvd25lciBvZiBhbiBvYmplY3QncyBtb25pdG9yCisgICAgICogPC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YnkgZXhlY3V0aW5nIGEgc3luY2hyb25pemVkIG1ldGhvZCBvZiB0aGF0IG9iamVjdDs8L2xpPgorICAgICAqIDxsaT5ieSBleGVjdXRpbmcgdGhlIGJvZHkgb2YgYSB7QGNvZGUgc3luY2hyb25pemVkfSBzdGF0ZW1lbnQgdGhhdAorICAgICAqIHN5bmNocm9uaXplcyBvbiB0aGUgb2JqZWN0OzwvbGk+CisgICAgICogPGxpPmJ5IGV4ZWN1dGluZyBhIHN5bmNocm9uaXplZCBzdGF0aWMgbWV0aG9kIGlmIHRoZSBvYmplY3QgaXMgb2YgdHlwZQorICAgICAqIHtAY29kZSBDbGFzc30uPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAogICAgICAqIEBzZWUgI25vdGlmeUFsbAogICAgICAqIEBzZWUgI3dhaXQoKQogICAgICAqIEBzZWUgI3dhaXQobG9uZykKICAgICAgKiBAc2VlICN3YWl0KGxvbmcsaW50KQogICAgICAqIEBzZWUgamF2YS5sYW5nLlRocmVhZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBub3RpZnkoKTsKIAogICAgIC8qKgotICAgICAqIENhdXNlcyBhbGwgdGhyZWFkcyB3aGljaCBhcmUgPGNvZGU+d2FpdDwvY29kZT4gaW5nIG9uIHRoZSByZWNlaXZlciB0bwotICAgICAqIGJlIG1hZGUgcmVhZHkgdG8gcnVuLiBUaGUgdGhyZWFkcyBhcmUgc2NoZWR1bGVkIGFjY29yZGluZyB0byB0aGVpcgotICAgICAqIHByaW9yaXRpZXMgYXMgc3BlY2lmaWVkIGluIGNsYXNzIFRocmVhZC4gQmV0d2VlbiBhbnkgdHdvIHRocmVhZHMgb2YgdGhlCi0gICAgICogc2FtZSBwcmlvcml0eSB0aGUgb25lIHdoaWNoIHdhaXRlZCBmaXJzdCB3aWxsIGJlIHRoZSBmaXJzdCB0aHJlYWQgdGhhdAotICAgICAqIHJ1bnMgYWZ0ZXIgYmVpbmcgbm90aWZpZWQuIFRoZSBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBieSBhIHRocmVhZAotICAgICAqIHdoaWNoIG93bnMgdGhlIHJlY2VpdmVyJ3MgbW9uaXRvci4KKyAgICAgKiBDYXVzZXMgYWxsIHRocmVhZHMgd2hpY2ggYXJlIHdhaXRpbmcgb24gdGhpcyBvYmplY3QncyBtb25pdG9yIChieSBtZWFucworICAgICAqIG9mIGNhbGxpbmcgb25lIG9mIHRoZSB7QGNvZGUgd2FpdCgpfSBtZXRob2RzKSB0byBiZSB3b2tlbiB1cC4gVGhlIHRocmVhZHMKKyAgICAgKiB3aWxsIG5vdCBydW4gaW1tZWRpYXRlbHkuIFRoZSB0aHJlYWQgdGhhdCBjYWxsZWQge0Bjb2RlIG5vdGlmeSgpfSBoYXMgdG8KKyAgICAgKiByZWxlYXNlIHRoZSBvYmplY3QncyBtb25pdG9yIGZpcnN0LiBBbHNvLCB0aGUgdGhyZWFkcyBzdGlsbCBoYXZlIHRvCisgICAgICogY29tcGV0ZSBhZ2FpbnN0IG90aGVyIHRocmVhZHMgdGhhdCB0cnkgdG8gc3luY2hyb25pemUgb24gdGhlIHNhbWUgb2JqZWN0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgYnkgYSB0aHJlYWQgd2hpY2ggb3ducyB0aGlzIG9iamVjdCdzCisgICAgICogbW9uaXRvci4gQSB0aHJlYWQgYmVjb21lcyBvd25lciBvZiBhbiBvYmplY3QncyBtb25pdG9yCisgICAgICogPC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YnkgZXhlY3V0aW5nIGEgc3luY2hyb25pemVkIG1ldGhvZCBvZiB0aGF0IG9iamVjdDs8L2xpPgorICAgICAqIDxsaT5ieSBleGVjdXRpbmcgdGhlIGJvZHkgb2YgYSB7QGNvZGUgc3luY2hyb25pemVkfSBzdGF0ZW1lbnQgdGhhdAorICAgICAqIHN5bmNocm9uaXplcyBvbiB0aGUgb2JqZWN0OzwvbGk+CisgICAgICogPGxpPmJ5IGV4ZWN1dGluZyBhIHN5bmNocm9uaXplZCBzdGF0aWMgbWV0aG9kIGlmIHRoZSBvYmplY3QgaXMgb2YgdHlwZQorICAgICAqIHtAY29kZSBDbGFzc30uPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyBub3QgdGhlIG93bmVyIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBvYmplY3QncyBtb25pdG9yLgogICAgICAqIEBzZWUgI25vdGlmeQogICAgICAqIEBzZWUgI3dhaXQoKQogICAgICAqIEBzZWUgI3dhaXQobG9uZykKQEAgLTEzNiw4NiArMjM3LDEzMiBAQAogICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBub3RpZnlBbGwoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMKKyAgICAgKiBvYmplY3QuIFN1YmNsYXNzZXMgYXJlIGVuY291cmFnZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHByb3ZpZGUgYW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiB0aGF0IHRha2VzIGludG8gYWNjb3VudCB0aGUgb2JqZWN0J3MgdHlwZSBhbmQgZGF0YS4gVGhlCisgICAgICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY29uY2F0ZW5hdGVzIHRoZSBjbGFzcyBuYW1lLCB0aGUgJ0AnIHNpZ24KKyAgICAgKiBhbmQgYSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0J3Mge0BsaW5rICNoYXNoQ29kZSgpfSwKKyAgICAgKiB0aGF0IGlzLCBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbjoKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgorICAgICAqIDxwcmU+CisgICAgICogZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2hDb2RlKCkpCisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2hDb2RlKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgdGhyZWFkIHdoaWNoIHNlbnQgdGhpcyBtZXNzYWdlIHRvIGJlIG1hZGUgbm90IHJlYWR5IHRvIHJ1bgotICAgICAqIHBlbmRpbmcgc29tZSBjaGFuZ2UgaW4gdGhlIHJlY2VpdmVyIChhcyBpbmRpY2F0ZWQgYnkgPGNvZGU+bm90aWZ5PC9jb2RlPgotICAgICAqIG9yIDxjb2RlPm5vdGlmeUFsbDwvY29kZT4pLiBUaGUgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgYnkgYSB0aHJlYWQKLSAgICAgKiB3aGljaCBvd25zIHRoZSByZWNlaXZlcidzIG1vbml0b3IuIEEgd2FpdGluZyB0aHJlYWQgY2FuIGJlIHNlbnQKLSAgICAgKiA8Y29kZT5pbnRlcnJ1cHQoKTwvY29kZT4gdG8gY2F1c2UgaXQgdG8gcHJlbWF0dXJlbHkgc3RvcCB3YWl0aW5nLCBzbwotICAgICAqIHNlbmRlcnMgb2Ygd2FpdCBzaG91bGQgY2hlY2sgdGhhdCB0aGUgY29uZGl0aW9uIHRoZXkgd2VyZSB3YWl0aW5nIGZvciBoYXMKLSAgICAgKiBiZWVuIG1ldC4KKyAgICAgKiBDYXVzZXMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHdhaXQgdW50aWwgYW5vdGhlciB0aHJlYWQgY2FsbHMgdGhlIHtAY29kZQorICAgICAqIG5vdGlmeSgpfSBvciB7QGNvZGUgbm90aWZ5QWxsKCl9IG1ldGhvZCBvZiB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgY2FuCisgICAgICogb25seSBiZSBpbnZva2VkIGJ5IGEgdGhyZWFkIHdoaWNoIG93bnMgdGhpcyBvYmplY3QncyBtb25pdG9yOyBzZWUKKyAgICAgKiB7QGxpbmsgI25vdGlmeSgpfSBvbiBob3cgYSB0aHJlYWQgY2FuIGJlY29tZSB0aGUgb3duZXIgb2YgYSBtb25pdG9yLgogICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhlIHRocmVhZCB3YWl0cywgaXQgZ2l2ZXMgdXAgb3duZXJzaGlwIG9mIHRoZSByZWNlaXZlcidzIG1vbml0b3IuCi0gICAgICogV2hlbiBpdCBpcyBub3RpZmllZCAob3IgaW50ZXJydXB0ZWQpIGl0IHJlLWFjcXVpcmVzIHRoZSBtb25pdG9yIGJlZm9yZSBpdAotICAgICAqIHN0YXJ0cyBydW5uaW5nLgorICAgICAqIEEgd2FpdGluZyB0aHJlYWQgY2FuIGJlIHNlbnQge0Bjb2RlIGludGVycnVwdCgpfSB0byBjYXVzZSBpdCB0bworICAgICAqIHByZW1hdHVyZWx5IHN0b3Agd2FpdGluZywgc28ge0Bjb2RlIHdhaXR9IHNob3VsZCBiZSBjYWxsZWQgaW4gYSBsb29wIHRvCisgICAgICogY2hlY2sgdGhhdCB0aGUgY29uZGl0aW9uIHRoYXQgaGFzIGJlZW4gd2FpdGVkIGZvciBoYXMgYmVlbiBtZXQgYmVmb3JlCisgICAgICogY29udGludWluZy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hpbGUgdGhlIHRocmVhZCB3YWl0cywgaXQgZ2l2ZXMgdXAgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0J3MgbW9uaXRvci4KKyAgICAgKiBXaGVuIGl0IGlzIG5vdGlmaWVkIChvciBpbnRlcnJ1cHRlZCksIGl0IHJlLWFjcXVpcmVzIHRoZSBtb25pdG9yIGJlZm9yZQorICAgICAqIGl0IHN0YXJ0cyBydW5uaW5nLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRvIGludGVycnVwdCB0aGUgd2FpdC4KLSAgICAgKiBAc2VlIFRocmVhZCNpbnRlcnJ1cHQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgbm90IHRoZSBvd25lciBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgb2JqZWN0J3MgbW9uaXRvci4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGlzIHRocmVhZCB3aGlsZSBpdCBpcyB3YWl0aW5nLgogICAgICAqIEBzZWUgI25vdGlmeQogICAgICAqIEBzZWUgI25vdGlmeUFsbAogICAgICAqIEBzZWUgI3dhaXQobG9uZykKICAgICAgKiBAc2VlICN3YWl0KGxvbmcsaW50KQogICAgICAqIEBzZWUgamF2YS5sYW5nLlRocmVhZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdhaXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICB3YWl0KDAgLDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgdGhyZWFkIHdoaWNoIHNlbnQgdGhpcyBtZXNzYWdlIHRvIGJlIG1hZGUgbm90IHJlYWR5IHRvIHJ1bgotICAgICAqIGVpdGhlciBwZW5kaW5nIHNvbWUgY2hhbmdlIGluIHRoZSByZWNlaXZlciAoYXMgaW5kaWNhdGVkIGJ5Ci0gICAgICogPGNvZGU+bm90aWZ5PC9jb2RlPiBvciA8Y29kZT5ub3RpZnlBbGw8L2NvZGU+KSBvciB0aGUgZXhwaXJhdGlvbiBvZgotICAgICAqIHRoZSB0aW1lb3V0LiBUaGUgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgYnkgYSB0aHJlYWQgd2hpY2ggb3ducyB0aGUKLSAgICAgKiByZWNlaXZlcidzIG1vbml0b3IuIEEgd2FpdGluZyB0aHJlYWQgY2FuIGJlIHNlbnQgPGNvZGU+aW50ZXJydXB0KCk8L2NvZGU+Ci0gICAgICogdG8gY2F1c2UgaXQgdG8gcHJlbWF0dXJlbHkgc3RvcCB3YWl0aW5nLCBzbyBzZW5kZXJzIG9mIHdhaXQgc2hvdWxkIGNoZWNrCi0gICAgICogdGhhdCB0aGUgY29uZGl0aW9uIHRoZXkgd2VyZSB3YWl0aW5nIGZvciBoYXMgYmVlbiBtZXQuCisgICAgICogQ2F1c2VzIHRoZSBjYWxsaW5nIHRocmVhZCB0byB3YWl0IHVudGlsIGFub3RoZXIgdGhyZWFkIGNhbGxzIHRoZSB7QGNvZGUKKyAgICAgKiBub3RpZnkoKX0gb3Ige0Bjb2RlIG5vdGlmeUFsbCgpfSBtZXRob2Qgb2YgdGhpcyBvYmplY3Qgb3IgdW50aWwgdGhlCisgICAgICogc3BlY2lmaWVkIHRpbWVvdXQgZXhwaXJlcy4gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBieSBhIHRocmVhZAorICAgICAqIHdoaWNoIG93bnMgdGhpcyBvYmplY3QncyBtb25pdG9yOyBzZWUge0BsaW5rICNub3RpZnkoKX0gb24gaG93IGEgdGhyZWFkCisgICAgICogY2FuIGJlY29tZSB0aGUgb3duZXIgb2YgYSBtb25pdG9yLgogICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhlIHRocmVhZCB3YWl0cywgaXQgZ2l2ZXMgdXAgb3duZXJzaGlwIG9mIHRoZSByZWNlaXZlcidzIG1vbml0b3IuCi0gICAgICogV2hlbiBpdCBpcyBub3RpZmllZCAob3IgaW50ZXJydXB0ZWQpIGl0IHJlLWFjcXVpcmVzIHRoZSBtb25pdG9yIGJlZm9yZSBpdAotICAgICAqIHN0YXJ0cyBydW5uaW5nLgorICAgICAqIEEgd2FpdGluZyB0aHJlYWQgY2FuIGJlIHNlbnQge0Bjb2RlIGludGVycnVwdCgpfSB0byBjYXVzZSBpdCB0bworICAgICAqIHByZW1hdHVyZWx5IHN0b3Agd2FpdGluZywgc28ge0Bjb2RlIHdhaXR9IHNob3VsZCBiZSBjYWxsZWQgaW4gYSBsb29wIHRvCisgICAgICogY2hlY2sgdGhhdCB0aGUgY29uZGl0aW9uIHRoYXQgaGFzIGJlZW4gd2FpdGVkIGZvciBoYXMgYmVlbiBtZXQgYmVmb3JlCisgICAgICogY29udGludWluZy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hpbGUgdGhlIHRocmVhZCB3YWl0cywgaXQgZ2l2ZXMgdXAgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0J3MgbW9uaXRvci4KKyAgICAgKiBXaGVuIGl0IGlzIG5vdGlmaWVkIChvciBpbnRlcnJ1cHRlZCksIGl0IHJlLWFjcXVpcmVzIHRoZSBtb25pdG9yIGJlZm9yZQorICAgICAqIGl0IHN0YXJ0cyBydW5uaW5nLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGltZSBsb25nIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0byBpbnRlcnJ1cHQgdGhlIHdhaXQuCisgICAgICogQHBhcmFtIG1pbGxpcworICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBtaWxsaXMgPCAwfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgbm90IHRoZSBvd25lciBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgb2JqZWN0J3MgbW9uaXRvci4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGlzIHRocmVhZCB3aGlsZSBpdCBpcyB3YWl0aW5nLgogICAgICAqIEBzZWUgI25vdGlmeQogICAgICAqIEBzZWUgI25vdGlmeUFsbAogICAgICAqIEBzZWUgI3dhaXQoKQogICAgICAqIEBzZWUgI3dhaXQobG9uZyxpbnQpCiAgICAgICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd2FpdChsb25nIHRpbWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXQodGltZSwgMCk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgd2FpdChsb25nIG1pbGxpcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgd2FpdChtaWxsaXMsIDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgdGhyZWFkIHdoaWNoIHNlbnQgdGhpcyBtZXNzYWdlIHRvIGJlIG1hZGUgbm90IHJlYWR5IHRvIHJ1bgotICAgICAqIGVpdGhlciBwZW5kaW5nIHNvbWUgY2hhbmdlIGluIHRoZSByZWNlaXZlciAoYXMgaW5kaWNhdGVkIGJ5Ci0gICAgICogPGNvZGU+bm90aWZ5PC9jb2RlPiBvciA8Y29kZT5ub3RpZnlBbGw8L2NvZGU+KSBvciB0aGUgZXhwaXJhdGlvbiBvZgotICAgICAqIHRoZSB0aW1lb3V0LiBUaGUgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgYnkgYSB0aHJlYWQgd2hpY2ggb3ducyB0aGUKLSAgICAgKiByZWNlaXZlcidzIG1vbml0b3IuIEEgd2FpdGluZyB0aHJlYWQgY2FuIGJlIHNlbnQgPGNvZGU+aW50ZXJydXB0KCk8L2NvZGU+Ci0gICAgICogdG8gY2F1c2UgaXQgdG8gcHJlbWF0dXJlbHkgc3RvcCB3YWl0aW5nLCBzbyBzZW5kZXJzIG9mIHdhaXQgc2hvdWxkIGNoZWNrCi0gICAgICogdGhhdCB0aGUgY29uZGl0aW9uIHRoZXkgd2VyZSB3YWl0aW5nIGZvciBoYXMgYmVlbiBtZXQuCisgICAgICogQ2F1c2VzIHRoZSBjYWxsaW5nIHRocmVhZCB0byB3YWl0IHVudGlsIGFub3RoZXIgdGhyZWFkIGNhbGxzIHRoZSB7QGNvZGUKKyAgICAgKiBub3RpZnkoKX0gb3Ige0Bjb2RlIG5vdGlmeUFsbCgpfSBtZXRob2Qgb2YgdGhpcyBvYmplY3Qgb3IgdW50aWwgdGhlCisgICAgICogc3BlY2lmaWVkIHRpbWVvdXQgZXhwaXJlcy4gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBieSBhIHRocmVhZAorICAgICAqIHRoYXQgb3ducyB0aGlzIG9iamVjdCdzIG1vbml0b3I7IHNlZSB7QGxpbmsgI25vdGlmeSgpfSBvbiBob3cgYSB0aHJlYWQKKyAgICAgKiBjYW4gYmVjb21lIHRoZSBvd25lciBvZiBhIG1vbml0b3IuCiAgICAgICogPHA+Ci0gICAgICogV2hlbiB0aGUgdGhyZWFkIHdhaXRzLCBpdCBnaXZlcyB1cCBvd25lcnNoaXAgb2YgdGhlIHJlY2VpdmVyJ3MgbW9uaXRvci4KLSAgICAgKiBXaGVuIGl0IGlzIG5vdGlmaWVkIChvciBpbnRlcnJ1cHRlZCkgaXQgcmUtYWNxdWlyZXMgdGhlIG1vbml0b3IgYmVmb3JlIGl0Ci0gICAgICogc3RhcnRzIHJ1bm5pbmcuCisgICAgICogQSB3YWl0aW5nIHRocmVhZCBjYW4gYmUgc2VudCB7QGNvZGUgaW50ZXJydXB0KCl9IHRvIGNhdXNlIGl0IHRvCisgICAgICogcHJlbWF0dXJlbHkgc3RvcCB3YWl0aW5nLCBzbyB7QGNvZGUgd2FpdH0gc2hvdWxkIGJlIGNhbGxlZCBpbiBhIGxvb3AgdG8KKyAgICAgKiBjaGVjayB0aGF0IHRoZSBjb25kaXRpb24gdGhhdCBoYXMgYmVlbiB3YWl0ZWQgZm9yIGhhcyBiZWVuIG1ldCBiZWZvcmUKKyAgICAgKiBjb250aW51aW5nLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGlsZSB0aGUgdGhyZWFkIHdhaXRzLCBpdCBnaXZlcyB1cCBvd25lcnNoaXAgb2YgdGhpcyBvYmplY3QncyBtb25pdG9yLgorICAgICAqIFdoZW4gaXQgaXMgbm90aWZpZWQgKG9yIGludGVycnVwdGVkKSwgaXQgcmUtYWNxdWlyZXMgdGhlIG1vbml0b3IgYmVmb3JlCisgICAgICogaXQgc3RhcnRzIHJ1bm5pbmcuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aW1lIGxvbmcgVGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAcGFyYW0gZnJhYyBpbnQgVGhlIGZyYWN0aW9uIG9mIGEgbVNlYyB0byB3YWl0LCBzcGVjaWZpZWQgaW4gbmFub3NlY29uZHMuCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0byBpbnRlcnJ1cHQgdGhlIHdhaXQuCisgICAgICogQHBhcmFtIG1pbGxpcworICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gbmFub3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBmcmFjdGlvbiBvZiBhIG1pbGxpc2Vjb25kIHRvIHdhaXQsIHNwZWNpZmllZCBpbgorICAgICAqICAgICAgICAgICAgbmFub3NlY29uZHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbWlsbGlzIDwgMH0sIHtAY29kZSBuYW5vcyA8IDB9IG9yIHtAY29kZSBuYW5vcyA+CisgICAgICogICAgICAgICAgICAgOTk5OTk5fS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgbm90IHRoZSBvd25lciBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgb2JqZWN0J3MgbW9uaXRvci4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGlzIHRocmVhZCB3aGlsZSBpdCBpcyB3YWl0aW5nLgogICAgICAqIEBzZWUgI25vdGlmeQogICAgICAqIEBzZWUgI25vdGlmeUFsbAogICAgICAqIEBzZWUgI3dhaXQoKQotICAgICAqIEBzZWUgI3dhaXQobG9uZykKKyAgICAgKiBAc2VlICN3YWl0KGxvbmcsaW50KQogICAgICAqIEBzZWUgamF2YS5sYW5nLlRocmVhZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCB3YWl0KGxvbmcgdGltZSwgaW50IGZyYWMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgd2FpdChsb25nIG1pbGxpcywgaW50IG5hbm9zKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9QYWNrYWdlLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9QYWNrYWdlLmphdmEKaW5kZXggOGM2ZWIyYi4uMjgxNzQwNCAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUGFja2FnZS5qYXZhCisrKyBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1BhY2thZ2UuamF2YQpAQCAtMTQsMjMgKzE0LDM5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVN0YWNrOworCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwogaW1wb3J0IGphdmEubmV0LlVSTDsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHZtIHZlbmRvci4KLSAqIAotICogQW4gaW5zdGFuY2Ugb2YgY2xhc3MgUGFja2FnZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIEphdmEgcGFja2FnZS4gVGhpcwotICogaW5jbHVkZXMgaW1wbGVtZW50YXRpb24gYW5kIHNwZWNpZmljYXRpb24gdmVyc2lvbnMuIFR5cGljYWxseSB0aGlzCi0gKiBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgbWFuaWZlc3QuCisgKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIEphdmEgcGFja2FnZS4gVGhpcyBpbmNsdWRlcyBpbXBsZW1lbnRhdGlvbiBhbmQKKyAqIHNwZWNpZmljYXRpb24gdmVyc2lvbnMuIFR5cGljYWxseSB0aGlzIGluZm9ybWF0aW9uIGlzIHJldHJpZXZlZCBmcm9tIHRoZQorICogbWFuaWZlc3QuCiAgKiA8cD4KICAqIFBhY2thZ2VzIGFyZSBtYW5hZ2VkIGJ5IGNsYXNzIGxvYWRlcnMuIEFsbCBjbGFzc2VzIGxvYWRlZCBieSB0aGUgc2FtZSBsb2FkZXIKLSAqIGZyb20gdGhlIHNhbWUgcGFja2FnZSBzaGFyZSBhIFBhY2thZ2UgaW5zdGFuY2UuCi0gKiAKKyAqIGZyb20gdGhlIHNhbWUgcGFja2FnZSBzaGFyZSBhIHtAY29kZSBQYWNrYWdlfSBpbnN0YW5jZS4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICogCiAgKiBAc2VlIGphdmEubGFuZy5DbGFzc0xvYWRlcgogICovCkBAIC01MywxMiArNjksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhbm5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiB0eXBlIGFuZCB0aGlzCi0gICAgICogcGFja2FnZS4KKyAgICAgKiBHZXRzIHRoZSBhbm5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdHlwZSBhbmQKKyAgICAgKiB0aGlzIHBhY2thZ2UsIGlmIHByZXNlbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQW5ub3RhdGlvbn0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGFubm90YXRpb24gdHlwZSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBBbm5vdGF0aW9ufSBvciB7QGNvZGUgbnVsbH0uCiAgICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50I2dldEFubm90YXRpb24oamF2YS5sYW5nLkNsYXNzKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IFQgZ2V0QW5ub3RhdGlvbihDbGFzczxUPiBhbm5vdGF0aW9uVHlwZSkgewpAQCAtNzMsMjIgKzkxLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbGwgb2YgdGhlIGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UuCisgICAgICogR2V0cyBhbGwgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZSwgaWYgYW55LgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Yge0BsaW5rIEFubm90YXRpb259IGluc3RhbmNlcywgd2hpY2ggbWF5IGJlIGVtcHR5LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAbGluayBBbm5vdGF0aW9ufSBpbnN0YW5jZXMsIHdoaWNoIG1heSBiZSBlbXB0eS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQjZ2V0QW5ub3RhdGlvbnMoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7CiAgICAgICAgIHJldHVybiBnZXREZWNsYXJlZEFubm90YXRpb25zKHRoaXMsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYWxsIG9mIHRoZSBhbm5vdGF0aW9ucyBkaXJlY3RseSBkZWNsYXJlZCBvbiB0aGlzIGVsZW1lbnQuCisgICAgICogR2V0cyBhbGwgYW5ub3RhdGlvbnMgZGlyZWN0bHkgZGVjbGFyZWQgb24gdGhpcyBwYWNrYWdlLCBpZiBhbnkuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiB7QGxpbmsgQW5ub3RhdGlvbn0gaW5zdGFuY2VzLCB3aGljaCBtYXkgYmUgZW1wdHkuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0BsaW5rIEFubm90YXRpb259IGluc3RhbmNlcywgd2hpY2ggbWF5IGJlIGVtcHR5LgogICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudCNnZXREZWNsYXJlZEFubm90YXRpb25zKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSB7CiAgICAgICAgIHJldHVybiBnZXREZWNsYXJlZEFubm90YXRpb25zKHRoaXMsIGZhbHNlKTsKQEAgLTk5LDE0NyArMTE3LDE1NCBAQAogICAgICAqIElmIG5vIGFubm90YXRpb25zIGV4aXN0LCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGtnIHRoZSBwYWNrYWdlIG9mIGludGVyZXN0Ci0gICAgICogQHBhcmFtIHB1YmxpY09ubHkgcmVmbGVjdHMgd2hldGhlciB3ZSB3YW50IG9ubHkgcHVibGljIGFubm90YXRpb24gb3IgYWxsIG9mIHRoZW0KKyAgICAgKiBAcGFyYW0gcHVibGljT25seSByZWZsZWN0cyB3aGV0aGVyIHdlIHdhbnQgb25seSBwdWJsaWMgYW5ub3RhdGlvbiBvciBhbGwKKyAgICAgKiBvZiB0aGVtLgogICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYW5ub3RhdGlvbnMKICAgICAgKi8KICAgICAvLyBUT0RPKEdvb2dsZSkgUHJvdmlkZSBwcm9wZXIgKG5hdGl2ZSkgaW1wbGVtZW50YXRpb24uCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKFBhY2thZ2UgcGtnLCBib29sZWFuIHB1YmxpY09ubHkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBBbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucyhQYWNrYWdlIHBrZywKKyAgICAgICAgICAgIGJvb2xlYW4gcHVibGljT25seSk7CiAgICAgCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBhbm5vdGF0aW9uIGlzIHByZXNlbnQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGlzIHByZXNlbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHByZXNlbnQsCi0gICAgICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uIHR5cGUgdG8gbG9vayBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudDsge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudCNpc0Fubm90YXRpb25QcmVzZW50KGphdmEubGFuZy5DbGFzcykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSkgeworICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoCisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb24oYW5ub3RhdGlvblR5cGUpICE9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwYWNrYWdlLCBvciBudWxsIGlmIHRoaXMKLSAgICAgKiBpcyB1bmtub3duLiBUaGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzIHVuc3BlY2lmaWVkLgorICAgICAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHBhY2thZ2UsIG9yIHtAY29kZSBudWxsfQorICAgICAqIGlmIHRoaXMgaXMgdW5rbm93bi4gVGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyBpcyB1bnNwZWNpZmllZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBpbXBsZW1lbnRhdGlvbiB0aXRsZSwgb3IgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIHRpdGxlLCBtYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25UaXRsZSgpIHsKICAgICAgICAgcmV0dXJuIGltcGxUaXRsZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZlbmRvciBvciBvcmdhbml6YXRpb24gdGhhdCBwcm92aWRlZCB0aGlzCi0gICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIG51bGwgaWYgdGhpcyBpcyB1bmtub3duLiBUaGUgZm9ybWF0IG9mCi0gICAgICogdGhpcyBzdHJpbmcgaXMgdW5zcGVjaWZpZWQuCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmVuZG9yIG9yIG9yZ2FuaXphdGlvbiB0aGF0IHByb3ZpZGVzIHRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFja2FnZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgaXMgdW5rbm93bi4gVGhlCisgICAgICogZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzIHVuc3BlY2lmaWVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGltcGxlbWVudGF0aW9uIHZlbmRvciBuYW1lLCBvciBudWxsCisgICAgICogQHJldHVybiB0aGUgaW1wbGVtZW50YXRpb24gdmVuZG9yIG5hbWUsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlbmRvcigpIHsKICAgICAgICAgcmV0dXJuIGltcGxWZW5kb3I7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHBhY2thZ2UsIG9yIG51bGwgaWYgdGhpcwotICAgICAqIGlzIHVua25vd24uIFRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgaXMgdW5zcGVjaWZpZWQuCisgICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwYWNrYWdlLCBvciB7QGNvZGUKKyAgICAgKiBudWxsfSBpZiB0aGlzIGlzIHVua25vd24uIFRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgaXMgdW5zcGVjaWZpZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgaW1wbGVtZW50YXRpb24gdmVyc2lvbiwgb3IgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIHZlcnNpb24sIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSB7CiAgICAgICAgIHJldHVybiBpbXBsVmVyc2lvbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGluIHRoZSBzdGFuZGFyZCBkb3Qgbm90YXRpb247IGZvcgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGluIHRoZSBzdGFuZGFyZCBkb3Qgbm90YXRpb247IGZvcgogICAgICAqIGV4YW1wbGU6ICJqYXZhLmxhbmciLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhpcyBwYWNrYWdlCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHBhY2thZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWVzdGVkIHBhY2thZ2UgaW4gdGhlIGNhbGxlcidzIGNsYXNzIGxvYWRlci4gSWYKLSAgICAgKiBubyBwYWNrYWdlIGluZm9ybWF0aW9uIGNhbiBiZSBsb2NhdGVkLCBudWxsIGlzIHJldHVybmVkLgorICAgICAqIEF0dGVtcHRzIHRvIGxvY2F0ZSB0aGUgcmVxdWVzdGVkIHBhY2thZ2UgaW4gdGhlIGNhbGxlcidzIGNsYXNzIGxvYWRlci4gSWYKKyAgICAgKiBubyBwYWNrYWdlIGluZm9ybWF0aW9uIGNhbiBiZSBsb2NhdGVkLCB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBmaW5kCi0gICAgICogQHJldHVybiBUaGUgcGFja2FnZSByZXF1ZXN0ZWQsIG9yIG51bGwKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmQuCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHBhY2thZ2UsIG9yIHtAY29kZSBudWxsfS4KICAgICAgKiBAc2VlIENsYXNzTG9hZGVyI2dldFBhY2thZ2UoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFBhY2thZ2UgZ2V0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIgPSBDbGFzc0xvYWRlci5jYWxsZXJDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc2xvYWRlciA9IFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCk7CiAgICAgICAgIHJldHVybiBjbGFzc2xvYWRlci5nZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYWxsIHRoZSBwYWNrYWdlcyBrbm93biB0byB0aGUgY2FsbGVyJ3MgY2xhc3MgbG9hZGVyLgorICAgICAqIFJldHVybnMgYWxsIHRoZSBwYWNrYWdlcyBrbm93biB0byB0aGUgY2FsbGVyJ3MgY2xhc3MgbG9hZGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQWxsIHRoZSBwYWNrYWdlcyBrbm93biB0byB0aGUgY2FsbGVyJ3MgY2xhc3Nsb2FkZXIKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFsbCB0aGUgcGFja2FnZXMga25vd24gdG8gdGhlIGNhbGxlcidzIGNsYXNzIGxvYWRlci4KICAgICAgKiBAc2VlIENsYXNzTG9hZGVyI2dldFBhY2thZ2VzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQYWNrYWdlW10gZ2V0UGFja2FnZXMoKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyID0gQ2xhc3NMb2FkZXIuY2FsbGVyQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIgPSBWTVN0YWNrLmdldENhbGxpbmdDbGFzc0xvYWRlcigpOwogICAgICAgICByZXR1cm4gY2xhc3Nsb2FkZXIuZ2V0UGFja2FnZXMoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRpdGxlIG9mIHRoZSBzcGVjaWZpY2F0aW9uIHRoaXMgcGFja2FnZSBpbXBsZW1lbnRzLCBvciBudWxsIGlmCi0gICAgICogdGhpcyBpcyB1bmtub3duLgorICAgICAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBzcGVjaWZpY2F0aW9uIHRoaXMgcGFja2FnZSBpbXBsZW1lbnRzLCBvcgorICAgICAqIHtAY29kZSBudWxsfSBpZiB0aGlzIGlzIHVua25vd24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3BlY2lmaWNhdGlvbiB0aXRsZSwgb3IgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljYXRpb24gdGl0bGUsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVGl0bGUoKSB7CiAgICAgICAgIHJldHVybiBzcGVjVGl0bGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB2ZW5kb3Igb3Igb3JnYW5pemF0aW9uIHRoYXQgb3ducyBhbmQgbWFpbnRhaW5zIHRoZQotICAgICAqIHNwZWNpZmljYXRpb24gdGhpcyBwYWNrYWdlIGltcGxlbWVudHMsIG9yIG51bGwgaWYgdGhpcyBpcyB1bmtub3duLgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvciBvciBvcmdhbml6YXRpb24gdGhhdCBvd25zIGFuZCBtYWludGFpbnMKKyAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiB0aGlzIHBhY2thZ2UgaW1wbGVtZW50cywgb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgaXMKKyAgICAgKiB1bmtub3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHNwZWNpZmljYXRpb24gdmVuZG9yIG5hbWUsIG9yIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWZpY2F0aW9uIHZlbmRvciBuYW1lLCBtYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlbmRvcigpIHsKICAgICAgICAgcmV0dXJuIHNwZWNWZW5kb3I7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIHRoaXMgcGFja2FnZSBpbXBsZW1lbnRzLCBvciBudWxsCi0gICAgICogaWYgdGhpcyBpcyB1bmtub3duLiBUaGUgdmVyc2lvbiBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBub24tbmVnYXRpdmUKLSAgICAgKiBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgZG90czsgZm9yIGV4YW1wbGU6ICIxLjIuMyIuCisgICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiB0aGlzIHBhY2thZ2UgaW1wbGVtZW50cywgb3IKKyAgICAgKiB7QGNvZGUgbnVsbH0gaWYgdGhpcyBpcyB1bmtub3duLiBUaGUgdmVyc2lvbiBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZgorICAgICAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgZG90czsgZm9yIGV4YW1wbGU6ICIxLjIuMyIuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIHN0cmluZywgb3IgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdHJpbmcsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpIHsKICAgICAgICAgcmV0dXJuIHNwZWNWZXJzaW9uOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byBvYmplY3RzIHdoaWNoCi0gICAgICogYW5zd2VyIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhY2thZ2UncyBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaXMgY29tcGF0aWJsZSB3aXRoCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwYWNrYWdlJ3Mgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGlzIGNvbXBhdGlibGUgd2l0aAogICAgICAqIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiBzdHJpbmcuIFZlcnNpb24gc3RyaW5ncyBhcmUgY29tcGFyZWQgYnkgY29tcGFyaW5nCiAgICAgICogZWFjaCBkb3Qgc2VwYXJhdGVkIHBhcnQgb2YgdGhlIHZlcnNpb24gYXMgYW4gaW50ZWdlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmVyc2lvbgotICAgICAqICAgICAgICAgICAgVGhlIHZlcnNpb24gc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFja2FnZSB2ZXJzaW9ucyBhcmUgY29tcGF0aWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbiBzdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwYWNrYWdlIHZlcnNpb25zIGFyZSBjb21wYXRpYmxlOyB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFja2FnZSdzIHZlcnNpb24gc3RyaW5nIG9yIHRoZSBvbmUgcHJvdmlkZWQgaXMgbm90IGluCi0gICAgICogICAgICAgICAgICAgdGhlIGNvcnJlY3QgZm9ybWF0CisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBwYWNrYWdlJ3MgdmVyc2lvbiBzdHJpbmcgb3IgdGhlIG9uZSBwcm92aWRlZCBhcmUgbm90CisgICAgICogICAgICAgICAgICAgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGgoU3RyaW5nIHZlcnNpb24pCiAgICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKQEAgLTI2NSwzMiArMjkwLDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBwYWNrYWdlIGlzIHNlYWxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFja2FnZSBpcyBzZWFsZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcGFja2FnZSBpcyBzZWFsZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcGFja2FnZSBpcyBzZWFsZWQ7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VhbGVkKCkgewogICAgICAgICByZXR1cm4gc2VhbEJhc2UgIT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhY2thZ2UgaXMgc2VhbGVkIHdpdGggcmVzcGVjdCB0byB0aGUgc3BlY2lmaWVkIFVSTCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGlzIHNlYWxlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIFVSTC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICB0aGUgVVJMIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwYWNrYWdlIGlzIHNlYWxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgVVJMIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcGFja2FnZSBpcyBzZWFsZWQgd2l0aCB7QGNvZGUgdXJsfTsge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZWFsZWQoVVJMIHVybCkgewogICAgICAgICByZXR1cm4gc2VhbEJhc2UgIT0gbnVsbCAmJiBzZWFsQmFzZS5zYW1lRmlsZSh1cmwpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gInBhY2thZ2UgIiArIG5hbWU7CmRpZmYgLS1naXQgYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Qcm9jZXNzTWFuYWdlci5qYXZhIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUHJvY2Vzc01hbmFnZXIuamF2YQppbmRleCAwZGZhNzhkLi4wOWVlMDY3IDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Qcm9jZXNzTWFuYWdlci5qYXZhCisrKyBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Byb2Nlc3NNYW5hZ2VyLmphdmEKQEAgLTMyNCw3ICszMjQsNyBAQAogICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCAmJiBmZC52YWxpZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NNYW5hZ2VyLmNsb3NlKGZkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CkBAIC0zNTIsNyArMzUyLDcgQEAKICAgICAgICAgICAgICAgICBzdXBlci5jbG9zZSgpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZkICE9IG51bGwgJiYgZmQudmFsaWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzTWFuYWdlci5jbG9zZShmZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVudGltZS5qYXZhIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVudGltZS5qYXZhCmluZGV4IDc2ODFhZmUuLjI4Y2M5NmYgMTAwNjQ0Ci0tLSBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1J1bnRpbWUuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9SdW50aW1lLmphdmEKQEAgLTE0LDMzICsxNCw1MiBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiBwYWNrYWdlIGphdmEubGFuZzsKIAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNRGVidWc7CiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVN0YWNrOwotLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGV4ZWMoKSBBUElzLCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZQotICogVk0gdmVuZG9yLiBUaGUgZXhlYygpIEFQSXMgbXVzdCBmaXJzdCBkbyBhbnkgcmVxdWlyZWQgc2VjdXJpdHkgY2hlY2tzLCBhbmQKLSAqIHRoZW4gY2FsbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5wcm9jZXNzLlN5c3RlbVByb2Nlc3MuY3JlYXRlKCkuCi0gKiBUaGUgUnVudGltZSBpbnRlcmZhY2UuCisgKiBBbGxvd3MgSmF2YSBhcHBsaWNhdGlvbnMgdG8gaW50ZXJmYWNlIHdpdGggdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZXkgYXJlCisgKiBydW5uaW5nLiBBcHBsaWNhdGlvbnMgY2FuIG5vdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgYnV0IHRoZXkgY2FuCisgKiBnZXQgYSBzaW5nbGV0b24gaW5zdGFuY2UgYnkgaW52b2tpbmcge0BsaW5rICNnZXRSdW50aW1lKCl9LgorICogCisgKiBAc2VlIFN5c3RlbQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJ1bnRpbWUgewogICAgIApAQCAtMTAxLDUyICsxMjAsNzcgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSBwcm9nQXJyYXlbMF0gaW4gYSBzZXBhcmF0ZSBwbGF0Zm9ybSBwcm9jZXNzIFRoZSBuZXcgcHJvY2VzcwotICAgICAqIGluaGVyaXRzIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgY2FsbGVyLgorICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIG5hdGl2ZQorICAgICAqIHByb2Nlc3MuIFRoZSBuZXcgcHJvY2VzcyBpbmhlcml0cyB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGNhbGxlci4gQ2FsbGluZworICAgICAqIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGNvZGUgZXhlYyhwcm9nQXJyYXksIG51bGwsIG51bGwpfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvZ0FycmF5IHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUgYXMgd2VsbCBhcwotICAgICAqICAgICAgICBhbnkgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGUgcHJvZ3JhbSBjYW5ub3QgYmUgZXhlY3V0ZWQKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBkaXNhbGxvd3MKLSAgICAgKiAgICAgICAgIHByb2dyYW0gZXhlY3V0aW9uCisgICAgICogQHBhcmFtIHByb2dBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZSBhcyB3ZWxsIGFzIGFueQorICAgICAqICAgICAgICAgICAgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgUHJvY2Vzc30gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbmF0aXZlCisgICAgICogICAgICAgICBwcm9jZXNzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIHByb2dyYW0gY2FuIG5vdCBiZSBleGVjdXRlZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGN1cnJlbnQge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gZGlzYWxsb3dzIHByb2dyYW0KKyAgICAgKiAgICAgICAgICAgICBleGVjdXRpb24uCiAgICAgICogQHNlZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tFeGVjCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhTdHJpbmdbXSBwcm9nQXJyYXkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGV4ZWMocHJvZ0FycmF5LCBudWxsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHByb2dBcnJheVswXSBpbiBhIHNlcGFyYXRlIHBsYXRmb3JtIHByb2Nlc3MgVGhlIG5ldyBwcm9jZXNzIHVzZXMKLSAgICAgKiB0aGUgZW52aXJvbm1lbnQgcHJvdmlkZWQgaW4gZW52cAorICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIG5hdGl2ZQorICAgICAqIHByb2Nlc3MuIFRoZSBuZXcgcHJvY2VzcyB1c2VzIHRoZSBlbnZpcm9ubWVudCBwcm92aWRlZCBpbiB7QGNvZGUgZW52cH0uCisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiB7QGNvZGUgZXhlYyhwcm9nQXJyYXksIGVudnAsIG51bGwpfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvZ0FycmF5IHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUgYSB3ZWxsIGFzCi0gICAgICogICAgICAgIGFueSBhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0uCi0gICAgICogQHBhcmFtIGVudnAgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHRvIHN0YXJ0IHRoZSBuZXcgcHJvY2VzcwotICAgICAqICAgICAgICBpbi4KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgdGhlIHByb2dyYW0gY2Fubm90IGJlIGV4ZWN1dGVkCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBTZWN1cml0eU1hbmFnZXIgZGlzYWxsb3dzCi0gICAgICogICAgICAgICBwcm9ncmFtIGV4ZWN1dGlvbgorICAgICAqIEBwYXJhbSBwcm9nQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUgYXMgd2VsbCBhcyBhbnkKKyAgICAgKiAgICAgICAgICAgIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KKyAgICAgKiBAcGFyYW0gZW52cAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHRvIHN0YXJ0IHRoZSBuZXcgcHJvY2VzcworICAgICAqICAgICAgICAgICAgaW4uCisgICAgICogQHJldHVybiB0aGUgbmV3IHtAY29kZSBQcm9jZXNzfSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBuYXRpdmUKKyAgICAgKiAgICAgICAgIHByb2Nlc3MuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgcHJvZ3JhbSBjYW4gbm90IGJlIGV4ZWN1dGVkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3VycmVudCB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBkaXNhbGxvd3MgcHJvZ3JhbQorICAgICAqICAgICAgICAgICAgIGV4ZWN1dGlvbi4KICAgICAgKiBAc2VlIFNlY3VyaXR5TWFuYWdlciNjaGVja0V4ZWMKLSAgICAgKi8KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhTdHJpbmdbXSBwcm9nQXJyYXksIFN0cmluZ1tdIGVudnApIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGV4ZWMocHJvZ0FycmF5LCBlbnZwLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHByb2dBcnJheVswXSBpbiBhIHNlcGFyYXRlIHBsYXRmb3JtIHByb2Nlc3MuIFRoZSBuZXcgcHJvY2VzcyB1c2VzCi0gICAgICogdGhlIGVudmlyb25tZW50IHByb3ZpZGVkIGluIGVudnAKKyAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMgaW4gYSBzZXBhcmF0ZSBuYXRpdmUKKyAgICAgKiBwcm9jZXNzLiBUaGUgbmV3IHByb2Nlc3MgdXNlcyB0aGUgZW52aXJvbm1lbnQgcHJvdmlkZWQgaW4ge0Bjb2RlIGVudnB9CisgICAgICogYW5kIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkge0Bjb2RlIGRpcmVjdG9yeX0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb2dBcnJheSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgcHJvZ3JhbSB0byBleGVjdXRlIGEgd2VsbCBhcwotICAgICAqICAgICAgICBhbnkgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgotICAgICAqIEBwYXJhbSBlbnZwIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB0byBzdGFydCB0aGUgbmV3IHByb2Nlc3MKLSAgICAgKiAgICAgICAgaW4uCi0gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGV4ZWN1dGUgcHJvZ0FycmF5WzBdLiBJZiBudWxsLAotICAgICAqICAgICAgICBleGVjdXRlIGluIHNhbWUgZGlyZWN0b3J5IGFzIHBhcmVudCBwcm9jZXNzLgotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGUgcHJvZ3JhbSBjYW5ub3QgYmUgZXhlY3V0ZWQKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBkaXNhbGxvd3MKLSAgICAgKiAgICAgICAgIHByb2dyYW0gZXhlY3V0aW9uCisgICAgICogQHBhcmFtIHByb2dBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZSBhcyB3ZWxsIGFzIGFueQorICAgICAqICAgICAgICAgICAgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgorICAgICAqIEBwYXJhbSBlbnZwCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdG8gc3RhcnQgdGhlIG5ldyBwcm9jZXNzCisgICAgICogICAgICAgICAgICBpbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5CisgICAgICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIHByb2dyYW0uIElmIHtAY29kZSBudWxsfSwKKyAgICAgKiAgICAgICAgICAgIGV4ZWN1dGUgaWYgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcge0Bjb2RlIFByb2Nlc3N9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG5hdGl2ZQorICAgICAqICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBwcm9ncmFtIGNhbiBub3QgYmUgZXhlY3V0ZWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJyZW50IHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGRpc2FsbG93cyBwcm9ncmFtCisgICAgICogICAgICAgICAgICAgZXhlY3V0aW9uLgogICAgICAqIEBzZWUgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRXhlYwotICAgICAqLworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgICAKICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFN0cmluZ1tdIHByb2dBcnJheSwgU3RyaW5nW10gZW52cCwgRmlsZSBkaXJlY3RvcnkpCiAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAgICAgICAgIApAQCAtMTgyLDQ4ICsyMjYsNzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHByb2dyYW0gaW4gYSBzZXBhcmF0ZSBwbGF0Zm9ybSBwcm9jZXNzIFRoZSBuZXcgcHJvY2VzcyBpbmhlcml0cwotICAgICAqIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgY2FsbGVyLgorICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSBpbiBhIHNlcGFyYXRlIG5hdGl2ZSBwcm9jZXNzLiBUaGUgbmV3CisgICAgICogcHJvY2VzcyBpbmhlcml0cyB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGNhbGxlci4gQ2FsbGluZyB0aGlzIG1ldGhvZCBpcworICAgICAqIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGNvZGUgZXhlYyhwcm9nLCBudWxsLCBudWxsKX0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb2cgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZQotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGUgcHJvZ3JhbSBjYW5ub3QgYmUgZXhlY3V0ZWQKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBkaXNhbGxvd3MKLSAgICAgKiAgICAgICAgIHByb2dyYW0gZXhlY3V0aW9uCisgICAgICogQHBhcmFtIHByb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUuCisgICAgICogQHJldHVybiB0aGUgbmV3IHtAY29kZSBQcm9jZXNzfSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBuYXRpdmUKKyAgICAgKiAgICAgICAgIHByb2Nlc3MuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgcHJvZ3JhbSBjYW4gbm90IGJlIGV4ZWN1dGVkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3VycmVudCB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBkaXNhbGxvd3MgcHJvZ3JhbQorICAgICAqICAgICAgICAgICAgIGV4ZWN1dGlvbi4KICAgICAgKiBAc2VlIFNlY3VyaXR5TWFuYWdlciNjaGVja0V4ZWMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFN0cmluZyBwcm9nKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBleGVjKHByb2csIG51bGwsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgcHJvZyBpbiBhIHNlcGFyYXRlIHBsYXRmb3JtIHByb2Nlc3MgVGhlIG5ldyBwcm9jZXNzIHVzZXMgdGhlCi0gICAgICogZW52aXJvbm1lbnQgcHJvdmlkZWQgaW4gZW52cAorICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSBpbiBhIHNlcGFyYXRlIG5hdGl2ZSBwcm9jZXNzLiBUaGUgbmV3CisgICAgICogcHJvY2VzcyB1c2VzIHRoZSBlbnZpcm9ubWVudCBwcm92aWRlZCBpbiB7QGNvZGUgZW52cH0uIENhbGxpbmcgdGhpcworICAgICAqIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcge0Bjb2RlIGV4ZWMocHJvZywgZW52cCwgbnVsbCl9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9nIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUKLSAgICAgKiBAcGFyYW0gZW52cCB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdG8gc3RhcnQgdGhlIG5ldyBwcm9jZXNzCi0gICAgICogICAgICAgIGluLgotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGUgcHJvZ3JhbSBjYW5ub3QgYmUgZXhlY3V0ZWQKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBkaXNhbGxvd3MKLSAgICAgKiAgICAgICAgIHByb2dyYW0gZXhlY3V0aW9uCisgICAgICogQHBhcmFtIHByb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUuCisgICAgICogQHBhcmFtIGVudnAKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB0byBzdGFydCB0aGUgbmV3IHByb2Nlc3MKKyAgICAgKiAgICAgICAgICAgIGluLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgUHJvY2Vzc30gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbmF0aXZlCisgICAgICogICAgICAgICBwcm9jZXNzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIHByb2dyYW0gY2FuIG5vdCBiZSBleGVjdXRlZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGN1cnJlbnQge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gZGlzYWxsb3dzIHByb2dyYW0KKyAgICAgKiAgICAgICAgICAgICBleGVjdXRpb24uCiAgICAgICogQHNlZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tFeGVjCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhTdHJpbmcgcHJvZywgU3RyaW5nW10gZW52cCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZXhlYyhwcm9nLCBlbnZwLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHByb2cgaW4gYSBzZXBhcmF0ZSBwbGF0Zm9ybSBwcm9jZXNzIFRoZSBuZXcgcHJvY2VzcyB1c2VzIHRoZQotICAgICAqIGVudmlyb25tZW50IHByb3ZpZGVkIGluIGVudnAKKyAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIHByb2dyYW0gaW4gYSBzZXBhcmF0ZSBuYXRpdmUgcHJvY2Vzcy4gVGhlIG5ldworICAgICAqIHByb2Nlc3MgdXNlcyB0aGUgZW52aXJvbm1lbnQgcHJvdmlkZWQgaW4ge0Bjb2RlIGVudnB9IGFuZCB0aGUgd29ya2luZworICAgICAqIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkge0Bjb2RlIGRpcmVjdG9yeX0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb2cgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZQotICAgICAqIEBwYXJhbSBlbnZwIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB0byBzdGFydCB0aGUgbmV3IHByb2Nlc3MKLSAgICAgKiAgICAgICAgaW4uCi0gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgaW5pdGlhbCBkaXJlY3RvcnkgZm9yIHRoZSBzdWJwcm9jZXNzLCBvciBudWxsIHRvIHVzZQotICAgICAqICAgICAgICB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgdGhlIHByb2dyYW0gY2Fubm90IGJlIGV4ZWN1dGVkCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBTZWN1cml0eU1hbmFnZXIgZGlzYWxsb3dzCi0gICAgICogICAgICAgICBwcm9ncmFtIGV4ZWN1dGlvbgorICAgICAqIEBwYXJhbSBwcm9nCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byBleGVjdXRlLgorICAgICAqIEBwYXJhbSBlbnZwCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdG8gc3RhcnQgdGhlIG5ldyBwcm9jZXNzCisgICAgICogICAgICAgICAgICBpbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5CisgICAgICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIHByb2dyYW0uIElmIHtAY29kZSBudWxsfSwKKyAgICAgKiAgICAgICAgICAgIGV4ZWN1dGUgaWYgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcge0Bjb2RlIFByb2Nlc3N9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG5hdGl2ZQorICAgICAqICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBwcm9ncmFtIGNhbiBub3QgYmUgZXhlY3V0ZWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJyZW50IHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGRpc2FsbG93cyBwcm9ncmFtCisgICAgICogICAgICAgICAgICAgZXhlY3V0aW9uLgogICAgICAqIEBzZWUgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRXhlYworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoU3RyaW5nIHByb2csIFN0cmluZ1tdIGVudnAsIEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNhbml0eSBjaGVja3MKQEAgLTI0NiwxNCArMzE0LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2F1c2VzIHRoZSB2aXJ0dWFsIG1hY2hpbmUgdG8gc3RvcCBydW5uaW5nLCBhbmQgdGhlIHByb2dyYW0gdG8gZXhpdC4gSWYKLSAgICAgKiBydW5GaW5hbGl6ZXJzT25FeGl0KHRydWUpIGhhcyBiZWVuIGludm9rZWQsIHRoZW4gYWxsIGZpbmFsaXplcnMgd2lsbCBiZQotICAgICAqIHJ1biBmaXJzdC4KKyAgICAgKiBDYXVzZXMgdGhlIHZpcnR1YWwgbWFjaGluZSB0byBzdG9wIHJ1bm5pbmcgYW5kIHRoZSBwcm9ncmFtIHRvIGV4aXQuIElmCisgICAgICoge0BsaW5rICNydW5GaW5hbGl6ZXJzT25FeGl0KGJvb2xlYW4pfSBoYXMgYmVlbiBwcmV2aW91c2x5IGludm9rZWQgd2l0aCBhCisgICAgICoge0Bjb2RlIHRydWV9IGFyZ3VtZW50LCB0aGVuIGFsbCBhbGwgb2JqZWN0cyB3aWxsIGJlIHByb3Blcmx5CisgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgYW5kIGZpbmFsaXplZCBmaXJzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29kZSB0aGUgcmV0dXJuIGNvZGUuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgcnVubmluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gY2F1c2UKLSAgICAgKiAgICAgICAgIHRoZSB2bSB0byBleGl0LgorICAgICAqIEBwYXJhbSBjb2RlCisgICAgICogICAgICAgICAgICB0aGUgcmV0dXJuIGNvZGUuIEJ5IGNvbnZlbnRpb24sIG5vbi16ZXJvIHJldHVybiBjb2RlcyBpbmRpY2F0ZQorICAgICAqICAgICAgICAgICAgYWJub3JtYWwgdGVybWluYXRpb25zLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3VycmVudCB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBkb2VzIG5vdCBhbGxvdyB0aGUKKyAgICAgKiAgICAgICAgICAgICBydW5uaW5nIHRocmVhZCB0byB0ZXJtaW5hdGUgdGhlIHZpcnR1YWwgbWFjaGluZS4KICAgICAgKiBAc2VlIFNlY3VyaXR5TWFuYWdlciNjaGVja0V4aXQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGl0KGludCBjb2RlKSB7CiAgICAgICAgIC8vIFNlY3VyaXR5IGNoZWNrcwpAQCAtMjY2LDI2ICszMzksMzMgQEAKICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKICAgICAgICAgICAgIGlmICghc2h1dHRpbmdEb3duKSB7CiAgICAgICAgICAgICAgICAgc2h1dHRpbmdEb3duID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBTdGFydCBhbGwgc2h1dGRvd24gaG9va3MgY29uY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaHV0ZG93bkhvb2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNodXRkb3duSG9va3MuZ2V0KGkpLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICBUaHJlYWRbXSBob29rczsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNodXRkb3duSG9va3MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgY29weSBvZiB0aGUgaG9va3MKKyAgICAgICAgICAgICAgICAgICAgaG9va3MgPSBuZXcgVGhyZWFkW3NodXRkb3duSG9va3Muc2l6ZSgpXTsKKyAgICAgICAgICAgICAgICAgICAgc2h1dGRvd25Ib29rcy50b0FycmF5KGhvb2tzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIAorCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgYWxsIHNodXRkb3duIGhvb2tzIGNvbmN1cnJlbnRseQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaG9va3NbaV0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciBhbGwgc2h1dGRvd24gaG9va3MgdG8gZmluaXNoCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaHV0ZG93bkhvb2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChUaHJlYWQgaG9vayA6IGhvb2tzKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bkhvb2tzLmdldChpKS5qb2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBob29rLmpvaW4oKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSwgc2luY2Ugd2UgYXJlIGF0IFZNIHNodXRkb3duLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBmaW5hbGl6YXRpb24gb24gZXhpdCwgaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplT25FeGl0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJ1bkZpbmFsaXphdGlvbih0cnVlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAvLyBHZXQgb3V0IG9mIGhlcmUgZmluYWxseS4uLgogICAgICAgICAgICAgICAgIG5hdGl2ZUV4aXQoY29kZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CkBAIC0yOTYsMzEgKzM3Niw0NSBAQAogICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBmcmVlIG1lbW9yeSByZXNvdXJjZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSB0byB0aGUKICAgICAgKiBydW5uaW5nIHByb2dyYW0uCiAgICAgICogCisgICAgICogQHJldHVybiB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIGZyZWUgbWVtb3J5LCBtZWFzdXJlZCBpbiBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGxvbmcgZnJlZU1lbW9yeSgpOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRvIHRoZSB2aXJ0dWFsIG1hY2hpbmUgdGhhdCBpdCB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byBjb2xsZWN0Ci0gICAgICogYXZhaWxhYmxlIG1lbW9yeS4gTm90ZSB0aGF0LCB0aGlzIGlzIGEgaGludCBvbmx5LgorICAgICAqIEluZGljYXRlcyB0byB0aGUgdmlydHVhbCBtYWNoaW5lIHRoYXQgaXQgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcnVuIHRoZQorICAgICAqIGdhcmJhZ2UgY29sbGVjdG9yLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGhpbnQgb25seS4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlCisgICAgICogdGhhdCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbCBhY3R1YWxseSBiZSBydW4uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdjKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNpbmdsZSBSdW50aW1lIGluc3RhbmNlCisgICAgICogUmV0dXJucyB0aGUgc2luZ2xlIHtAY29kZSBSdW50aW1lfSBpbnN0YW5jZS4KICAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUnVudGltZX0gb2JqZWN0IGZvciB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKICAgICAgICAgcmV0dXJuIG1SdW50aW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWRzIGFuZCBsaW5rcyB0aGUgbGlicmFyeSBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50LgorICAgICAqIExvYWRzIGFuZCBsaW5rcyB0aGUgZHluYW1pYyBsaWJyYXJ5IHRoYXQgaXMgaWRlbnRpZmllZCB0aHJvdWdoIHRoZQorICAgICAqIHNwZWNpZmllZCBwYXRoLiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHtAbGluayAjbG9hZExpYnJhcnkoU3RyaW5nKX0sCisgICAgICogYnV0IGl0IGFjY2VwdHMgYSBmdWxsIHBhdGggc3BlY2lmaWNhdGlvbiB3aGVyZWFzIHtAY29kZSBsb2FkTGlicmFyeX0ganVzdAorICAgICAqIGFjY2VwdHMgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdG8gbG9hZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aE5hbWUgdGhlIGFic29sdXRlIChpZTogcGxhdGZvcm0gZGVwZW5kZW50KSBwYXRoIHRvIHRoZSBsaWJyYXJ5Ci0gICAgICogICAgICAgIHRvIGxvYWQKLSAgICAgKiBAdGhyb3dzIFVuc2F0aXNmaWVkTGlua0Vycm9yIGlmIHRoZSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBsaWJyYXJ5IHdhcyBub3QgYWxsb3dlZCB0byBiZSBsb2FkZWQKKyAgICAgKiBAcGFyYW0gcGF0aE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSAocGxhdGZvcm0gZGVwZW5kZW50KSBwYXRoIHRvIHRoZSBsaWJyYXJ5IHRvIGxvYWQuCisgICAgICogQHRocm93cyBVbnNhdGlzZmllZExpbmtFcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsaWJyYXJ5IGNhbiBub3QgYmUgbG9hZGVkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3VycmVudCB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBkb2VzIG5vdCBhbGxvdyB0byBsb2FkCisgICAgICogICAgICAgICAgICAgdGhlIGxpYnJhcnkuCisgICAgICogQHNlZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tMaW5rCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG9hZChTdHJpbmcgcGF0aE5hbWUpIHsKICAgICAgICAgLy8gU2VjdXJpdHkgY2hlY2tzCkBAIC0zMjksMjQgKzQyMywzNiBAQAogICAgICAgICAgICAgc21nci5jaGVja0xpbmsocGF0aE5hbWUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGxvYWQocGF0aE5hbWUsIFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCkpOwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBMb2FkcyBhbmQgbGlua3MgYSBsaWJyYXJ5IHdpdGhvdXQgc2VjdXJpdHkgY2hlY2tzLgogICAgICAqLwogICAgIHZvaWQgbG9hZChTdHJpbmcgZmlsZW5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgewotICAgICAgICBuYXRpdmVMb2FkKGZpbGVuYW1lLCBsb2FkZXIpOworICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJsaWJyYXJ5IHBhdGggd2FzIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFuYXRpdmVMb2FkKGZpbGVuYW1lLCBsb2FkZXIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zYXRpc2ZpZWRMaW5rRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJMaWJyYXJ5ICIgKyBmaWxlbmFtZSArICIgbm90IGZvdW5kIik7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogTG9hZHMgYW5kIGxpbmtzIHRoZSBsaWJyYXJ5IHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQuCisgICAgICogTG9hZHMgYW5kIGxpbmtzIHRoZSBsaWJyYXJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgbWFwcGluZyBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbGlicmFyeSBuYW1lIHRvIHRoZSBmdWxsIHBhdGggZm9yIGxvYWRpbmcgdGhlIGxpYnJhcnkgaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpYk5hbWUgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdG8gbG9hZAotICAgICAqIEB0aHJvd3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3IgaWYgdGhlIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZAotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGxpYnJhcnkgd2FzIG5vdCBhbGxvd2VkIHRvIGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSBsaWJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBsb2FkLgorICAgICAqIEB0aHJvd3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGlicmFyeSBjYW4gbm90IGJlIGxvYWRlZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGN1cnJlbnQge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gZG9lcyBub3QgYWxsb3cgdG8gbG9hZAorICAgICAqICAgICAgICAgICAgIHRoZSBsaWJyYXJ5LgorICAgICAqIEBzZWUgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTGluaworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvYWRMaWJyYXJ5KFN0cmluZyBsaWJOYW1lKSB7CiAgICAgICAgIC8vIFNlY3VyaXR5IGNoZWNrcwpAQCAtMzU0LDEwICs0NjAsOCBAQAogICAgICAgICBpZiAoc21nciAhPSBudWxsKSB7CiAgICAgICAgICAgICBzbWdyLmNoZWNrTGluayhsaWJOYW1lKTsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisKICAgICAgICAgbG9hZExpYnJhcnkobGliTmFtZSwgVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKgpAQCAtNDAyLDM1ICs1MDYsNTEgQEAKICAgICAvKioKICAgICAgKiBQcm92aWRlcyBhIGhpbnQgdG8gdGhlIHZpcnR1YWwgbWFjaGluZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCB0byBhdHRlbXB0CiAgICAgICogdG8gcGVyZm9ybSBhbnkgb3V0c3RhbmRpbmcgb2JqZWN0IGZpbmFsaXphdGlvbnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcnVuRmluYWxpemF0aW9uKCkgewogICAgICAgICBydW5GaW5hbGl6YXRpb24oZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0LCB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgYWJvdXQgdG8gZXhpdCwgYWxsIG9iamVjdHMgYXJlCi0gICAgICogZmluYWxpemVkLiBOb3RlIHRoYXQgYWxsIGZpbmFsaXphdGlvbiB3aGljaCBvY2N1cnMgd2hlbiB0aGUgc3lzdGVtIGlzCi0gICAgICogZXhpdGluZyBpcyBwZXJmb3JtZWQgYWZ0ZXIgYWxsIHJ1bm5pbmcgdGhyZWFkcyBoYXZlIGJlZW4gdGVybWluYXRlZC4KKyAgICAgKiBTZXRzIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgYWxsIG9iamVjdHMgYXJlIGZpbmFsaXplZCB3aGVuIHRoZQorICAgICAqIHZpcnR1YWwgbWFjaGluZSBpcyBhYm91dCB0byBleGl0LiBOb3RlIHRoYXQgYWxsIGZpbmFsaXphdGlvbiB3aGljaCBvY2N1cnMKKyAgICAgKiB3aGVuIHRoZSBzeXN0ZW0gaXMgZXhpdGluZyBpcyBwZXJmb3JtZWQgYWZ0ZXIgYWxsIHJ1bm5pbmcgdGhyZWFkcyBoYXZlCisgICAgICogYmVlbiB0ZXJtaW5hdGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydW4gdHJ1ZSBtZWFucyBmaW5hbGl6ZSBhbGwgb24gZXhpdC4KKyAgICAgKiBAcGFyYW0gcnVuCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlIGZpbmFsaXphdGlvbiBvbiBleGl0LCB7QGNvZGUgZmFsc2V9IHRvCisgICAgICogICAgICAgICAgICBkaXNhYmxlIGl0LgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIHVuc2FmZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5GaW5hbGl6ZXJzT25FeGl0KGJvb2xlYW4gcnVuKSB7Ci0gICAgICAgIGZpbmFsaXplT25FeGl0ID0gdHJ1ZTsKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtZ3IgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzbWdyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNtZ3IuY2hlY2tFeGl0KDApOworICAgICAgICB9CisgICAgICAgIGZpbmFsaXplT25FeGl0ID0gcnVuOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgcmVzb3VyY2VzIHdoaWNoIGlzIGF2YWlsYWJsZSB0byAob3IgaW4KLSAgICAgKiB1c2UgYnkpIHRoZSBydW5uaW5nIHByb2dyYW0uCisgICAgICogUmV0dXJucyB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB3aGljaCBpcyBhdmFpbGFibGUgdG8gdGhlIHJ1bm5pbmcKKyAgICAgKiBwcm9ncmFtLgogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnksIG1lYXN1cmVkIGluIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgbG9uZyB0b3RhbE1lbW9yeSgpOwogCiAgICAgLyoqCi0gICAgICogVHVybnMgdGhlIG91dHB1dCBvZiBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zIG9uIG9yIG9mZi4KKyAgICAgKiBTd2l0Y2hlcyB0aGUgb3V0cHV0IG9mIGRlYnVnIGluZm9ybWF0aW9uIGZvciBpbnN0cnVjdGlvbnMgb24gb3Igb2ZmLgorICAgICAqIEZvciB0aGUgQW5kcm9pZCAxLjAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVuYWJsZSBpZiB0cnVlLCB0dXJuIHRyYWNlIG9uLiBmYWxzZSB0dXJucyB0cmFjZSBvZmYuCisgICAgICogQHBhcmFtIGVuYWJsZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHN3aXRjaCB0cmFjaW5nIG9uLCB7QGNvZGUgZmFsc2V9IHRvIHN3aXRjaCBpdAorICAgICAqICAgICAgICAgICAgb2ZmLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYWNlSW5zdHJ1Y3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgIC8vIFRPRE8oR29vZ2xlKSBQcm92aWRlIHNvbWUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMuCkBAIC00MzgsMTIgKzU1OCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFR1cm5zIHRoZSBvdXRwdXQgb2YgZGVidWcgaW5mb3JtYXRpb24gZm9yIG1ldGhvZHMgb24gb3Igb2ZmLgorICAgICAqIFN3aXRjaGVzIHRoZSBvdXRwdXQgb2YgZGVidWcgaW5mb3JtYXRpb24gZm9yIG1ldGhvZHMgb24gb3Igb2ZmLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbmFibGUgaWYgdHJ1ZSwgdHVybiB0cmFjZSBvbi4gZmFsc2UgdHVybnMgdHJhY2Ugb2ZmLgorICAgICAqIEBwYXJhbSBlbmFibGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBzd2l0Y2ggdHJhY2luZyBvbiwge0Bjb2RlIGZhbHNlfSB0byBzd2l0Y2ggaXQKKyAgICAgKiAgICAgICAgICAgIG9mZi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFjZU1ldGhvZENhbGxzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAoZW5hYmxlICE9IHRyYWNpbmdNZXRob2RzKSB7CiAgICAgICAgICAgICBpZiAoZW5hYmxlKSB7CiAgICAgICAgICAgICAgICAgVk1EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoKTsKQEAgLTQ1Miw4NiArNTc0LDE2MSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJhY2luZ01ldGhvZHMgPSBlbmFibGU7CiAgICAgICAgIH0KLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSW5wdXRTdHJlYW1SZWFkZXJ9CisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0uIFRoZSBpbnB1dAorICAgICAqIHN0cmVhbSB0aGF0IGlzIHJldHVybmVkIGF1dG9tYXRpY2FsbHkgY29udmVydHMgYWxsIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyAgICAgKiBsb2NhbCBjaGFyYWN0ZXIgc2V0IHRvIFVuaWNvZGUgYWZ0ZXIgcmVhZGluZyB0aGVtIGZyb20gdGhlIHVuZGVybHlpbmcKKyAgICAgKiBzdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byBsb2NhbGl6ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSW5wdXRTdHJlYW1SZWFkZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldExvY2FsaXplZElucHV0U3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWFkZXJJbnB1dFN0cmVhbShuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtLCAiVVRGLTgiKSk7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciLCAiVVRGLTgiKS5lcXVhbHMoIlVURi04IikpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW07CiAgICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4sIHNpbmNlIFVURi04IGlzIG1hbmRhdG9yeS4KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJlYWRlcklucHV0U3RyZWFtKHN0cmVhbSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBPdXRwdXRTdHJlYW1Xcml0ZXJ9Ci0gICAgICovCisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQgc3RyZWFtLiBUaGUgb3V0cHV0CisgICAgICogc3RyZWFtIHRoYXQgaXMgcmV0dXJuZWQgYXV0b21hdGljYWxseSBjb252ZXJ0cyBhbGwgY2hhcmFjdGVycyBmcm9tCisgICAgICogVW5pY29kZSB0byB0aGUgbG9jYWwgY2hhcmFjdGVyIHNldCBiZWZvcmUgd3JpdGluZyB0aGVtIHRvIHRoZSB1bmRlcmx5aW5nCisgICAgICogc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtIHRvIGxvY2FsaXplLgorICAgICAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBvdXRwdXQgc3RyZWFtLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgT3V0cHV0U3RyZWFtV3JpdGVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldExvY2FsaXplZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlck91dHB1dFN0cmVhbShuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSwgIlVURi04IikpOworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIiwgIlVURi04IikuZXF1YWxzKCJVVEYtOCIpKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBzaW5jZSBVVEYtOCBpcyBtYW5kYXRvcnkuCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBXcml0ZXJPdXRwdXRTdHJlYW0oc3RyZWFtICk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbmV3IHZpcnR1YWwtbWFjaGluZSBzaHV0ZG93biBob29rLgorICAgICAqIFJlZ2lzdGVycyBhIHZpcnR1YWwtbWFjaGluZSBzaHV0ZG93biBob29rLiBBIHNodXRkb3duIGhvb2sgaXMgYQorICAgICAqIHtAY29kZSBUaHJlYWR9IHRoYXQgaXMgcmVhZHkgdG8gcnVuLCBidXQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLiBBbGwKKyAgICAgKiByZWdpc3RlcmVkIHNodXRkb3duIGhvb2tzIHdpbGwgYmUgZXhlY3V0ZWQgb25jZSB0aGUgdmlydHVhbCBtYWNoaW5lIHNodXRzCisgICAgICogZG93biBwcm9wZXJseS4gQSBwcm9wZXIgc2h1dGRvd24gaGFwcGVucyB3aGVuIGVpdGhlciB0aGUKKyAgICAgKiB7QGxpbmsgI2V4aXQoaW50KX0gbWV0aG9kIGlzIGNhbGxlZCBvciB0aGUgc3Vycm91bmRpbmcgc3lzdGVtIGRlY2lkZXMgdG8KKyAgICAgKiB0ZXJtaW5hdGUgdGhlIGFwcGxpY2F0aW9uLCBmb3IgZXhhbXBsZSBpbiByZXNwb25zZSB0byBhIHtAY29kZSBDVFJMLUN9IG9yCisgICAgICogYSBzeXN0ZW0td2lkZSBzaHV0ZG93bi4gQSB0ZXJtaW5hdGlvbiBvZiB0aGUgdmlydHVhbCBtYWNoaW5lIGR1ZSB0byB0aGUKKyAgICAgKiB7QGxpbmsgI2hhbHQoaW50KX0gbWV0aG9kLCBhbiB7QGxpbmsgRXJyb3J9IG9yIGEge0Bjb2RlIFNJR0tJTEx9LCBpbgorICAgICAqIGNvbnRyYXN0LCBpcyBub3QgY29uc2lkZXJlZCBhIHByb3BlciBzaHV0ZG93bi4gSW4gdGhlc2UgY2FzZXMgdGhlCisgICAgICogc2h1dGRvd24gaG9va3Mgd2lsbCBub3QgYmUgcnVuLgorICAgICAqIDxwPgorICAgICAqIFNodXRkb3duIGhvb2tzIGFyZSBydW4gY29uY3VycmVudGx5IGFuZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gSG9va3MKKyAgICAgKiBmYWlsaW5nIGR1ZSB0byBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGFyZSBub3QgYSBwcm9ibGVtLCBidXQgdGhlIHN0YWNrCisgICAgICogdHJhY2UgbWlnaHQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZS4gT25jZSBpbml0aWF0ZWQsIHRoZSB3aG9sZSBzaHV0ZG93bgorICAgICAqIHByb2Nlc3MgY2FuIG9ubHkgYmUgdGVybWluYXRlZCBieSBjYWxsaW5nIHtAY29kZSBoYWx0KCl9LgorICAgICAqIDxwPgorICAgICAqIElmIHtAbGluayAjcnVuRmluYWxpemVyc09uRXhpdChib29sZWFuKX0gaGFzIGJlZW4gY2FsbGVkIHdpdGggYSB7QGNvZGUKKyAgICAgKiB0cnVlfSBhcmd1bWVudCwgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBmaW5hbGl6YXRpb24gd2lsbCB0YWtlIHBsYWNlIGFmdGVyCisgICAgICogYWxsIGhvb2tzIGFyZSBlaXRoZXIgZmluaXNoZWQgb3IgaGF2ZSBmYWlsZWQuIFRoZW4gdGhlIHZpcnR1YWwgbWFjaGluZQorICAgICAqIHRlcm1pbmF0ZXMuCisgICAgICogPHA+CisgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBzaHV0ZG93biBob29rcyBkbyBub3QgZG8gYW55IHRpbWUtY29uc3VtaW5nCisgICAgICogYWN0aXZpdGllcywgaW4gb3JkZXIgdG8gbm90IGhvbGQgdXAgdGhlIHNodXRkb3duIHByb2Nlc3MgbG9uZ2VyIHRoYW4KKyAgICAgKiBuZWNlc3NhcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhvb2sgdGhlIGhvb2sgKGEgVGhyZWFkKSB0byByZWdpc3RlcgorICAgICAqIEBwYXJhbSBob29rCisgICAgICogICAgICAgICAgICB0aGUgc2h1dGRvd24gaG9vayB0byByZWdpc3Rlci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBob29rIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBvciBpZiBpdCBoYXMgYWxyZWFkeQorICAgICAqICAgICAgICAgICAgIGJlZW4gcmVnaXN0ZXJlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgYWxyZWFkeSBzaHV0dGluZyBkb3duLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIFNlY3VyaXR5TWFuYWdlciBpcyByZWdpc3RlcmVkIGFuZCB0aGUgY2FsbGluZyBjb2RlCisgICAgICogICAgICAgICAgICAgZG9lc24ndCBoYXZlIHRoZSBSdW50aW1lUGVybWlzc2lvbigic2h1dGRvd25Ib29rcyIpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFNodXRkb3duSG9vayhUaHJlYWQgaG9vaykgewogICAgICAgICAvLyBTYW5pdHkgY2hlY2tzCiAgICAgICAgIGlmIChob29rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBpcyBub3QgYWxsb3dlZCBoZXJlIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkhvb2sgbWF5IG5vdCBiZSBudWxsLiIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNodXR0aW5nRG93bikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVk0gYWxyZWFkeSBzaHV0dGluZyBkb3duIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJWTSBhbHJlYWR5IHNodXR0aW5nIGRvd24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChob29rLmhhc0JlZW5TdGFydGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIb29rIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBpZiAoc20gIT0gbnVsbCkgeworICAgICAgICAgICAgc20uY2hlY2tQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigic2h1dGRvd25Ib29rcyIpKTsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaWYgKCFzaHV0ZG93bkhvb2tzLmNvbnRhaW5zKGhvb2spKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc2h1dGRvd25Ib29rcykgeworICAgICAgICAgICAgaWYgKHNodXRkb3duSG9va3MuY29udGFpbnMoaG9vaykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIb29rIGFscmVhZHkgcmVnaXN0ZXJlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAKICAgICAgICAgICAgIHNodXRkb3duSG9va3MuYWRkKGhvb2spOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGUtcmVnaXN0ZXJzIGEgcHJldmlvdXNseS1yZWdpc3RlcmVkIHZpcnR1YWwtbWFjaGluZSBzaHV0ZG93biBob29rLgorICAgICAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHZpcnR1YWwgbWFjaGluZSBzaHV0ZG93biBob29rLgogICAgICAqIAotICAgICAqIEBwYXJhbSBob29rIHRoZSBob29rIChhIFRocmVhZCkgdG8gZGUtcmVnaXN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGhvb2sgY291bGQgYmUgZGUtcmVnaXN0ZXJlZAorICAgICAqIEBwYXJhbSBob29rCisgICAgICogICAgICAgICAgICB0aGUgc2h1dGRvd24gaG9vayB0byByZW1vdmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGhvb2sgaGFzIGJlZW4gcmVtb3ZlZCBzdWNjZXNzZnVsbHk7IHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgYWxyZWFkeSBzaHV0dGluZyBkb3duLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIFNlY3VyaXR5TWFuYWdlciBpcyByZWdpc3RlcmVkIGFuZCB0aGUgY2FsbGluZyBjb2RlCisgICAgICogICAgICAgICAgICAgZG9lc24ndCBoYXZlIHRoZSBSdW50aW1lUGVybWlzc2lvbigic2h1dGRvd25Ib29rcyIpLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVNodXRkb3duSG9vayhUaHJlYWQgaG9vaykgewogICAgICAgICAvLyBTYW5pdHkgY2hlY2tzCiAgICAgICAgIGlmIChob29rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBpcyBub3QgYWxsb3dlZCBoZXJlIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkhvb2sgbWF5IG5vdCBiZSBudWxsLiIpOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBpZiAoc2h1dHRpbmdEb3duKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWTSBhbHJlYWR5IHNodXR0aW5nIGRvd24iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlZNIGFscmVhZHkgc2h1dHRpbmcgZG93biIpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2h1dGRvd25Ib29rcy5yZW1vdmUoaG9vayk7CisKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBpZiAoc20gIT0gbnVsbCkgeworICAgICAgICAgICAgc20uY2hlY2tQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigic2h1dGRvd25Ib29rcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAoc2h1dGRvd25Ib29rcykgeworICAgICAgICAgICAgcmV0dXJuIHNodXRkb3duSG9va3MucmVtb3ZlKGhvb2spOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2F1c2VzIHRoZSB2aXJ0dWFsIG1hY2hpbmUgdG8gc3RvcCBydW5uaW5nLCBhbmQgdGhlIHByb2dyYW0gdG8gZXhpdC4KLSAgICAgKiBGaW5hbGl6ZXJzIHdpbGwgbm90IGJlIHJ1biBmaXJzdC4gU2h1dGRvd24gaG9va3Mgd2lsbCBub3QgYmUgcnVuLgorICAgICAqIE5laXRoZXIgc2h1dGRvd24gaG9va3Mgbm9yIGZpbmFsaXplcnMgYXJlIHJ1biBiZWZvcmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gY29kZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gY29kZS4gQnkgY29udmVudGlvbiwgbm9uLXplcm8gcmV0dXJuIGNvZGVzIGluZGljYXRlCisgICAgICogICAgICAgICAgICBhYm5vcm1hbCB0ZXJtaW5hdGlvbnMuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBydW5uaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byBjYXVzZSB0aGUgdm0gdG8KLSAgICAgKiAgICAgICAgICAgICAgICBleGl0LgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJyZW50IHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGRvZXMgbm90IGFsbG93IHRoZQorICAgICAqICAgICAgICAgICAgIHJ1bm5pbmcgdGhyZWFkIHRvIHRlcm1pbmF0ZSB0aGUgdmlydHVhbCBtYWNoaW5lLgogICAgICAqIEBzZWUgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRXhpdAorICAgICAqIEBzZWUgI2FkZFNodXRkb3duSG9vayhUaHJlYWQpCisgICAgICogQHNlZSAjcmVtb3ZlU2h1dGRvd25Ib29rKFRocmVhZCkKKyAgICAgKiBAc2VlICNydW5GaW5hbGl6ZXJzT25FeGl0KGJvb2xlYW4pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFsdChpbnQgY29kZSkgewogICAgICAgICAvLyBTZWN1cml0eSBjaGVja3MKQEAgLTU0NSwxNSArNzQyLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycywgYWx3YXlzIGF0IGxlYXN0IG9uZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgdG8gdGhlIHZpcnR1YWwgbWFjaGluZS4gVGhlCisgICAgICogQW5kcm9pZCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gKGN1cnJlbnRseSkgYWx3YXlzIHJldHVybnMgMS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHByb2Nlc3NvcnMsIGF0IGxlYXN0IDEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBhdmFpbGFibGVQcm9jZXNzb3JzKCkgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gbWVtb3J5IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSB2aXJ0dWFsIG1hY2hpbmUsIG9yCi0gICAgICogTG9uZy5NQVhfVkFMVUUuCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgbWF5IGJlIHVzZWQgYnkgdGhlIHZpcnR1YWwKKyAgICAgKiBtYWNoaW5lLCBvciB7QGNvZGUgTG9uZy5NQVhfVkFMVUV9IGlmIHRoZXJlIGlzIG5vIHN1Y2ggbGltaXQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgdGhlIHZpcnR1YWwgbWFjaGluZSB3aWxsIHRyeSB0bworICAgICAqICAgICAgICAgYWxsb2NhdGUsIG1lYXN1cmVkIGluIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgbG9uZyBtYXhNZW1vcnkoKTsKIApAQCAtNTYxLDIzICs3NjYsMzUgQEAKIAogLyoKICAqIEludGVybmFsIGhlbHBlciBjbGFzcyBmb3IgY3JlYXRpbmcgYSBsb2NhbGl6ZWQgSW5wdXRTdHJlYW0uIEEgcmVhZGVyCi0gKiB3cmFwcGVkIGluIGFuIElucHV0U3RyZWFtLiBCeXRlcyBhcmUgcmVhZCBmcm9tIGNoYXJhY3RlcnMgaW4gYmlnLWVuZGlhbgotICogZmFzaGlvbi4KKyAqIHdyYXBwZWQgaW4gYW4gSW5wdXRTdHJlYW0uCiAgKi8KIGNsYXNzIFJlYWRlcklucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotICAgIAorCiAgICAgcHJpdmF0ZSBSZWFkZXIgcmVhZGVyOwogICAgIAotICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMjU2XTsKKyAgICBwcml2YXRlIFdyaXRlciB3cml0ZXI7CisKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgyNTYpOworICAgIAorICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVzOwogICAgIAogICAgIHByaXZhdGUgaW50IG5leHRCeXRlOwogICAgIAogICAgIHByaXZhdGUgaW50IG51bUJ5dGVzOwogICAgIAotICAgIHB1YmxpYyBSZWFkZXJJbnB1dFN0cmVhbShSZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgIH0KKyAgICBTdHJpbmcgZW5jb2RpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciLCAiVVRGLTgiKTsKICAgICAKKyAgICBwdWJsaWMgUmVhZGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtLCAiVVRGLTgiKTsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBlbmNvZGluZyk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2UgVVRGLTggYW5kIHBsYXRmb3JtIGVuY29kaW5nIG11c3QgYmUKKyAgICAgICAgICAgIC8vIHN1cHBvcnRlZC4KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG5leHRCeXRlID49IG51bUJ5dGVzKSB7CkBAIC01ODYsMTcgKzgwMywxOSBAQAogCiAgICAgICAgIHJldHVybiAobnVtQnl0ZXMgPCAwKSA/IC0xIDogYnl0ZXNbbmV4dEJ5dGUrK107CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsxMjhdOwotICAgICAgICBpbnQgbnVtQ2hhcnMgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBieXRlc1syICogaSAgICBdID0gKGJ5dGUpKGNoYXJzW2ldID4+IDgpOwotICAgICAgICAgICAgYnl0ZXNbMiAqIGkgKyAxXSA9IChieXRlKShjaGFyc1tpXSAmIDB4RkYpOworICAgICAgICBpbnQgcmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKKyAgICAgICAgaWYgKHJlYWQgPCAwKSB7CisgICAgICAgICAgICBudW1CeXRlcyA9IHJlYWQ7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG51bUJ5dGVzID0gbnVtQ2hhcnMgKiAyOworCisgICAgICAgIHdyaXRlci53cml0ZShjaGFycywgMCwgcmVhZCk7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICBieXRlcyA9IG91dC50b0J5dGVBcnJheSgpOworICAgICAgICBudW1CeXRlcyA9IGJ5dGVzLmxlbmd0aDsKICAgICAgICAgbmV4dEJ5dGUgPSAwOwogICAgIH0gICAgICAgIAogICAgIApAQCAtNjA4LDM4ICs4MjcsNjMgQEAKICAqIGZhc2hpb24uCiAgKi8KIGNsYXNzIFdyaXRlck91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0gICAgCisKKyAgICBwcml2YXRlIFJlYWRlciByZWFkZXI7CisKICAgICBwcml2YXRlIFdyaXRlciB3cml0ZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsyNTZdOwotICAgIAorCisgICAgcHJpdmF0ZSBQaXBlZE91dHB1dFN0cmVhbSBvdXQ7CisKKyAgICBwcml2YXRlIFBpcGVkSW5wdXRTdHJlYW0gcGlwZTsKKwogICAgIHByaXZhdGUgaW50IG51bUJ5dGVzOwotICAgIAotICAgIHB1YmxpYyBXcml0ZXJPdXRwdXRTdHJlYW0oV3JpdGVyIHdyaXRlcikgewotICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKKworICAgIHByaXZhdGUgU3RyaW5nIGVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIsICJVVEYtOCIpOworCisgICAgcHVibGljIFdyaXRlck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzaW5rCisgICAgICAgICAgICB0aGlzLndyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCBlbmMpOworCisgICAgICAgICAgICAvLyB0cmFuc2NyaWJlcgorICAgICAgICAgICAgb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBwaXBlID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0ob3V0KTsKKyAgICAgICAgICAgIHRoaXMucmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHBpcGUsICJVVEYtOCIpOworCisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2UgcGxhdGZvcm0gZW5jb2RpbmcgbXVzdCBiZSBzdXBwb3J0ZWQuCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZXNbbnVtQnl0ZXMrK10gPSAoYnl0ZSliOwotICAgICAgICAKLSAgICAgICAgaWYgKG51bUJ5dGVzID49IGJ5dGVzLmxlbmd0aCkgewotICAgICAgICAgICAgd3JpdGVCdWZmZXIoKTsKKyAgICAgICAgb3V0LndyaXRlKGIpOworICAgICAgICBpZiggKytudW1CeXRlcyA+IDI1NikgeworICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIG51bUJ5dGVzID0gMDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVCdWZmZXIoKTsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEyOF07CisgICAgICAgIGlmIChwaXBlLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgaW50IHJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7CisgICAgICAgICAgICBpZiAocmVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY2hhcnMsIDAsIHJlYWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHdyaXRlci5mbHVzaCgpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgd3JpdGVCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsxMjhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyc1tpXSA9IChjaGFyKShieXRlc1syICogaV0gPDwgOCB8IGJ5dGVzWzIgKiBpICsgMV0pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB3cml0ZXIud3JpdGUoY2hhcnMpOwotICAgIH0gICAgCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICBmbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudC5qYXZhIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQuamF2YQppbmRleCBjZGZhOTdmLi41Mzk0YWU5IDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudC5qYXZhCisrKyBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50LmphdmEKQEAgLTIwLDE5ICsyMCwyMCBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgcHJvdmlkZWQsIGJ1dCB0aGUgZG9jdW1lbnRlZCBjb25zdHJ1Y3RvcgotICogY2FuIGJlIHVzZWQgYnkgdGhlIFZNIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZSBpbnN0YW5jZXMuCi0gKiAKLSAqIFN0YWNrVHJhY2VFbGVtZW50IHJlcHJlc2VudHMgYSBzdGFjayBmcmFtZS4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc3RhY2sgZnJhbWUuIEFycmF5cyBvZiB7QGNvZGUgU3RhY2tUcmFjZUVsZW1lbnR9CisgKiBhcmUgc3RvcmVkIGluIHtAbGluayBUaHJvd2FibGV9IG9iamVjdHMgdG8gcmVwcmVzZW50IHRoZSB3aG9sZSBzdGF0ZSBvZiB0aGUKKyAqIGNhbGwgc3RhY2sgYXQgdGhlIHRpbWUgYSB7QGNvZGUgVGhyb3dhYmxlfSBnZXRzIHRocm93bi4KICAqIAogICogQHNlZSBUaHJvd2FibGUjZ2V0U3RhY2tUcmFjZSgpCi0gKiBAc2luY2UgMS40CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFN0YWNrVHJhY2VFbGVtZW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY5OTIzMzcxNjIzMjYxNzEwMTNMOwogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQVRJVkVfTElORV9OVU1CRVIgPSAtMjsKKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgIAogICAgIFN0cmluZyBkZWNsYXJpbmdDbGFzczsKIApAQCAtNDMsMjIgKzQ0LDIyIEBACiAgICAgaW50IGxpbmVOdW1iZXI7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+U3RhY2tUcmFjZUVsZW1lbnQ8L2NvZGU+IGZvciBhbiBleGVjdXRpb24gcG9pbnQuCi0gICAgICogPC9wPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFN0YWNrVHJhY2VFbGVtZW50fSBmb3IgYSBzcGVjaWZpZWQgZXhlY3V0aW9uCisgICAgICogcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNscyBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHdoZXJlIGV4ZWN1dGlvbiBpcyBhdC4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hlcmUgZXhlY3V0aW9uIGlzIGF0LgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIGV4ZWN1dGlvbiBpcyBhdCBvcgotICAgICAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBvZiB0aGUgZmlsZSB3aGVyZSBleGVjdXRpb24gaXMgYXQsIGEgbmVnYXRpdmUgbnVtYmVyCi0gICAgICogICAgICAgIGlmIHVua25vd24gb3IgPGNvZGU+LTI8L2NvZGU+IGlmIHRoZSBleGVjdXRpb24gaXMgaW4gYSBuYXRpdmUKLSAgICAgKiAgICAgICAgbWV0aG9kLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+Y2xzPC9jb2RlPiBvciA8Y29kZT5tZXRob2Q8L2NvZGU+Ci0gICAgICogICAgICAgICBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIGNscworICAgICAqICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aGVyZSBleGVjdXRpb24gaXMgYXQuCisgICAgICogQHBhcmFtIG1ldGhvZAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aGVyZSBleGVjdXRpb24gaXMgYXQuCisgICAgICogQHBhcmFtIGZpbGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIGV4ZWN1dGlvbiBpcyBhdCBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGxpbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaW5lIG9mIHRoZSBmaWxlIHdoZXJlIGV4ZWN1dGlvbiBpcyBhdCwgYSBuZWdhdGl2ZSBudW1iZXIKKyAgICAgKiAgICAgICAgICAgIGlmIHVua25vd24gb3Ige0Bjb2RlIC0yfSBpZiB0aGUgZXhlY3V0aW9uIGlzIGluIGEgbmF0aXZlCisgICAgICogICAgICAgICAgICBtZXRob2QuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjbHN9IG9yIHtAY29kZSBtZXRob2R9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RhY2tUcmFjZUVsZW1lbnQoU3RyaW5nIGNscywgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIGZpbGUsIGludCBsaW5lKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC03NiwxNSArNzcsMjggQEAKICAgICAgKiBQcml2YXRlLCBudWxsYXJ5IGNvbnN0cnVjdG9yIGZvciBWTSB1c2Ugb25seS4KICAgICAgKiA8L3A+CiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgcHJpdmF0ZSBTdGFja1RyYWNlRWxlbWVudCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoaXMgb2JqZWN0IHdpdGggdGhlIG9iamVjdCBwYXNzZWQgaW4KKyAgICAgKiBDb21wYXJlcyB0aGlzIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGluZGljYXRlcyBpZiB0aGV5CisgICAgICogYXJlIGVxdWFsLiBJbiBvcmRlciB0byBiZSBlcXVhbCwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYmUKKyAgICAgKiBmdWxmaWxsZWQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgb2JqfSBtdXN0IGJlIGEgc3RhY2sgdHJhY2UgZWxlbWVudCw8L2xpPgorICAgICAqIDxsaT50aGUgbWV0aG9kIG5hbWVzIG9mIHRoaXMgc3RhY2sgdHJhY2UgZWxlbWVudCBhbmQgb2Yge0Bjb2RlIG9ian0gbXVzdAorICAgICAqIG5vdCBiZSB7QGNvZGUgbnVsbH0sPC9saT4KKyAgICAgKiA8bGk+dGhlIGNsYXNzLCBtZXRob2QgYW5kIGZpbGUgbmFtZXMgYXMgd2VsbCBhcyB0aGUgbGluZSBudW1iZXIgb2YgdGhpcworICAgICAqIHN0YWNrIHRyYWNlIGVsZW1lbnQgYW5kIG9mIHtAY29kZSBvYmp9IG11c3QgYmUgZXF1YWwuPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIGNvbXBhcmUgd2l0aAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIGluc3RhbmNlIHdpdGguCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIFN0YWNrVHJhY2VFbGVtZW50fTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtMTI1LDU3ICsxMzksNTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIG5hbWUgKGkuZS4gaW5jbHVkaW5nIHRoZSBwYWNrYWdlKSBvZiB0aGUgY2xhc3Mgd2hlcmUKLSAgICAgKiB0aGlzIHN0YWNrIHRyYWNlIGVsZW1lbnQgaXMgZXhlY3V0aW5nLgorICAgICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyBiZWxvbmdpbmcgdG8gdGhpcworICAgICAqIHtAY29kZSBTdGFja1RyYWNlRWxlbWVudH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBzdGFjayB0cmFjZQotICAgICAqICAgICAgICAgZWxlbWVudCBpcyBleGVjdXRpbmcuCisgICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIChkZWNsYXJpbmdDbGFzcyA9PSBudWxsKSA/ICI8dW5rbm93biBjbGFzcz4iIDogZGVjbGFyaW5nQ2xhc3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgYXZhaWxhYmxlLCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIEphdmEgY29kZQotICAgICAqIHNvdXJjZSB3aGljaCB3YXMgY29tcGlsZWQgaW50byB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBzdGFjayB0cmFjZSBlbGVtZW50Ci0gICAgICogaXMgZXhlY3V0aW5nLgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIEphdmEgc291cmNlIGZpbGUgY29udGFpbmluZyBjbGFzcyBiZWxvbmdpbmcgdG8KKyAgICAgKiB0aGlzIHtAY29kZSBTdGFja1RyYWNlRWxlbWVudH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBpZiBhdmFpbGFibGUsIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIEphdmEgY29kZQotICAgICAqICAgICAgICAgc291cmNlIGZvciB0aGUgc3RhY2sgdHJhY2UgZWxlbWVudCdzIGV4ZWN1dGluZyBjbGFzcy4gSWYgbm8gc3VjaAotICAgICAqICAgICAgICAgZGV0YWlsIGlzIGF2YWlsYWJsZSwgYSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gZmlsZU5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgYXZhaWxhYmxlLCByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIGZvciB0aGUgY2xhc3Mgd2hlcmUKLSAgICAgKiB0aGlzIHN0YWNrIHRyYWNlIGVsZW1lbnQgaXMgZXhlY3V0aW5nLgorICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2UgZm9yIHRoZSBjbGFzcyBiZWxvbmdpbmcgdG8gdGhpcworICAgICAqIHtAY29kZSBTdGFja1RyYWNlRWxlbWVudH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBpZiBhdmFpbGFibGUsIHRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIGZpbGUgZm9yIHRoZSBjbGFzcwotICAgICAqICAgICAgICAgd2hlcmUgdGhpcyBzdGFjayB0cmFjZSBlbGVtZW50IGlzIGV4ZWN1dGluZy4gSWYgbm8gc3VjaCBkZXRhaWwgaXMKLSAgICAgKiAgICAgICAgIGF2YWlsYWJsZSwgYSBudW1iZXIgbGVzcyB0aGFuIDxjb2RlPjA8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyLCBvciBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdAorICAgICAqICAgICAgICAgYXZhaWxhYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKICAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdoZXJlIHRoaXMgc3RhY2sgdHJhY2UgZWxlbWVudCBpcwotICAgICAqIGV4ZWN1dGluZy4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVsb25naW5nIHRvIHRoaXMge0Bjb2RlCisgICAgICogU3RhY2tUcmFjZUVsZW1lbnR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aGVyZSB0aGlzIHN0YWNrIHRyYWNlIGVsZW1lbnQgaXMKLSAgICAgKiAgICAgICAgIGV4ZWN1dGluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QsIG9yICI8dW5rbm93biBtZXRob2Q+IiBpZiB0aGlzIGluZm9ybWF0aW9uCisgICAgICogICAgICAgICBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIChtZXRob2ROYW1lID09IG51bGwpID8gIjx1bmtub3duIG1ldGhvZD4iIDogbWV0aG9kTmFtZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhpcyBTdGFja1RyYWNlRWxlbWVudCBvYmplY3RzIGhhc2ggY29kZQotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhpcyBvYmplY3RzIGhhc2ggY29kZQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIC8qCkBAIC0xOTEsMjEgKzIwMCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBuYW1lIHJldHVybmVkIGJ5Ci0gICAgICoge0BsaW5rICNnZXRNZXRob2ROYW1lKCl9IGlzIGltcGxlbWVudGVkIGFzIGEgbmF0aXZlIG1ldGhvZC4KKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIG1ldGhvZCBuYW1lIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0TWV0aG9kTmFtZSgpfSBpcworICAgICAqIGltcGxlbWVudGVkIGFzIGEgbmF0aXZlIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtZXRob2QgaW4gd2hpY2ggdGhpcyBzdGFjayB0cmFjZSBlbGVtZW50IGlzIGV4ZWN1dGluZyBpcyBhCi0gICAgICogICAgICAgICBuYXRpdmUgbWV0aG9kCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1ldGhvZCBpbiB3aGljaCB0aGlzIHN0YWNrIHRyYWNlIGVsZW1lbnQgaXMKKyAgICAgKiAgICAgICAgIGV4ZWN1dGluZyBpcyBhIG5hdGl2ZSBtZXRob2Q7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzTmF0aXZlTWV0aG9kKCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXIgPT0gTkFUSVZFX0xJTkVfTlVNQkVSOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIFN0YWNrVHJhY2VFbGVtZW50IG9iamVjdAotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIG9iamVjdAotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoODApOwpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3lzdGVtLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TeXN0ZW0uamF2YQppbmRleCA3MDc1OWMwLi5iOTdhNzVhIDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TeXN0ZW0uamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TeXN0ZW0uamF2YQpAQCAtMTQsNiArMTQsMjEgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKQEAgLTIzLDEwICszOCw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwotCiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0zNSwzOSArNDgsNDggQEAKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNU3RhY2s7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAvKioKLSAqIENsYXNzIFN5c3RlbSBwcm92aWRlcyBhIHN0YW5kYXJkIHBsYWNlIGZvciBwcm9ncmFtcyB0byBmaW5kIHN5c3RlbSByZWxhdGVkCi0gKiBpbmZvcm1hdGlvbi4gQWxsIFN5c3RlbSBBUEkgaXMgc3RhdGljLgorICogUHJvdmlkZXMgYWNjZXNzIHRvIHN5c3RlbS1yZWxhdGVkIGluZm9ybWF0aW9uIGFuZCByZXNvdXJjZXMgaW5jbHVkaW5nCisgKiBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0LiBFbmFibGVzIGNsaWVudHMgdG8gZHluYW1pY2FsbHkgbG9hZCBuYXRpdmUKKyAqIGxpYnJhcmllcy4gQWxsIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBhcmUgYWNjZXNzZWQgaW4gYSBzdGF0aWMgd2F5IGFuZCB0aGUKKyAqIGNsYXNzIGl0c2VsZiBjYW4gbm90IGJlIGluc3RhbnRpYXRlZC4KICAqIAorICogQHNlZSBSdW50aW1lCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU3lzdGVtIHsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgaW5wdXQgc3RyZWFtCisgICAgICogRGVmYXVsdCBpbnB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnB1dFN0cmVhbSBpbjsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgb3V0cHV0IHN0cmVhbQorICAgICAqIERlZmF1bHQgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByaW50U3RyZWFtIG91dDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgZXJyb3Igb3V0cHV0IHN0cmVhbQorICAgICAqIERlZmF1bHQgZXJyb3Igb3V0cHV0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByaW50U3RyZWFtIGVycjsKIAogICAgIC8qKgotICAgICAqIFRoZSBTeXN0ZW0gUHJvcGVydGllcyB0YWJsZQorICAgICAqIFRoZSBTeXN0ZW0gUHJvcGVydGllcyB0YWJsZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIHN5c3RlbVByb3BlcnRpZXM7CiAKICAgICAvKioKLSAgICAgKiBUaGUgU3lzdGVtIGRlZmF1bHQgU2VjdXJpdHlNYW5hZ2VyCisgICAgICogVGhlIFN5c3RlbSBkZWZhdWx0IFNlY3VyaXR5TWFuYWdlci4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyOwogCkBAIC03NiwxMCArOTgsOSBAQAogICAgICAqLwogICAgIHN0YXRpYyB7CiAgICAgICAgIC8qCi0gICAgICAgICAqIFNldCB1cCBzdGFuZGFyZCBpbiwgb3V0LCBhbmQgZXJyLgotICAgICAgICAgKiAKLSAgICAgICAgICogVE9ETyBlcnIgYW5kIG91dCBhcmUgU3RyaW5nLkNvbnNvbGVQcmludFN0cmVhbS4gQWxsIHRocmVlIGFyZQotICAgICAgICAgKiBidWZmZXJlZCBpbiBIYXJtb255LiBDaGVjayBhbmQgcG9zc2libHkgY2hhbmdlIHRoaXMgbGF0ZXIuCisgICAgICAgICAqIFNldCB1cCBzdGFuZGFyZCBpbiwgb3V0LCBhbmQgZXJyLiBUT0RPIGVyciBhbmQgb3V0IGFyZQorICAgICAgICAgKiBTdHJpbmcuQ29uc29sZVByaW50U3RyZWFtLiBBbGwgdGhyZWUgYXJlIGJ1ZmZlcmVkIGluIEhhcm1vbnkuIENoZWNrCisgICAgICAgICAqIGFuZCBwb3NzaWJseSBjaGFuZ2UgdGhpcyBsYXRlci4KICAgICAgICAgICovCiAgICAgICAgIGVyciA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShGaWxlRGVzY3JpcHRvci5lcnIpKTsKICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKEZpbGVEZXNjcmlwdG9yLm91dCkpOwpAQCAtODcsMzggKzEwOCw2MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzdGF0aWMgc2xvdCAiaW4iIGluIHRoZSByZWNlaXZlciB0byB0aGUgcGFzc2VkIGluCi0gICAgICogYXJndW1lbnQuCisgICAgICogU2V0cyB0aGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtIHRvIHRoZSBnaXZlbiB1c2VyIGRlZmluZWQgaW5wdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdJbiB0aGUgbmV3IHZhbHVlIGZvciBpbi4KKyAgICAgKiBAcGFyYW0gbmV3SW4KKyAgICAgKiAgICAgICAgICAgIHRoZSB1c2VyIGRlZmluZWQgaW5wdXQgc3RyZWFtIHRvIHNldCBhcyB0aGUgc3RhbmRhcmQgaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0cyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBjaGVja1Blcm1pc3Npb24oKX0gbWV0aG9kIGRvZXMgbm90IGFsbG93IHRoZSBjaGFuZ2Ugb2YgdGhlCisgICAgICogICAgICAgICAgICAgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbihJbnB1dFN0cmVhbSBuZXdJbikgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjTWdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBpZihzZWNNZ3IgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VjTWdyLmNoZWNrUGVybWlzc2lvbihSdW50aW1lUGVybWlzc2lvbi5wZXJtaXNzaW9uVG9TZXRJTyk7CisgICAgICAgIH0KICAgICAgICAgc2V0RmllbGRJbXBsKCJpbiIsICJMamF2YS9pby9JbnB1dFN0cmVhbTsiLCBuZXdJbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0YXRpYyBzbG90ICJvdXQiIGluIHRoZSByZWNlaXZlciB0byB0aGUgcGFzc2VkIGluCi0gICAgICogYXJndW1lbnQuCisgICAgICogU2V0cyB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSB0byB0aGUgZ2l2ZW4gdXNlciBkZWZpbmVkIG91dHB1dCBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld091dCB0aGUgbmV3IHZhbHVlIGZvciBvdXQuCisgICAgICogQHBhcmFtIG5ld091dAorICAgICAqICAgICAgICAgICAgdGhlIHVzZXIgZGVmaW5lZCBvdXRwdXQgc3RyZWFtIHRvIHNldCBhcyB0aGUgc3RhbmRhcmQgb3V0cHV0CisgICAgICogICAgICAgICAgICBzdHJlYW0uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0BsaW5rIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdHMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCl9IG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB0aGUgY2hhbmdlIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0KGphdmEuaW8uUHJpbnRTdHJlYW0gbmV3T3V0KSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzZWNNZ3IgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIGlmKHNlY01nciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZWNNZ3IuY2hlY2tQZXJtaXNzaW9uKFJ1bnRpbWVQZXJtaXNzaW9uLnBlcm1pc3Npb25Ub1NldElPKTsKKyAgICAgICAgfQogICAgICAgICBzZXRGaWVsZEltcGwoIm91dCIsICJMamF2YS9pby9QcmludFN0cmVhbTsiLCBuZXdPdXQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzdGF0aWMgc2xvdCAiZXJyIiBpbiB0aGUgcmVjZWl2ZXIgdG8gdGhlIHBhc3NlZCBpbgotICAgICAqIGFyZ3VtZW50LgorICAgICAqIFNldHMgdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBzdHJlYW0gdG8gdGhlIGdpdmVuIHVzZXIgZGVmaW5lZCBvdXRwdXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld0VyciB0aGUgbmV3IHZhbHVlIGZvciBlcnIuCisgICAgICogQHBhcmFtIG5ld0VycgorICAgICAqICAgICAgICAgICAgdGhlIHVzZXIgZGVmaW5lZCBvdXRwdXQgc3RyZWFtIHRvIHNldCBhcyB0aGUgc3RhbmRhcmQgZXJyb3IKKyAgICAgKiAgICAgICAgICAgIG91dHB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0BsaW5rIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdHMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCl9IG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB0aGUgY2hhbmdlIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXJyKGphdmEuaW8uUHJpbnRTdHJlYW0gbmV3RXJyKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzZWNNZ3IgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIGlmKHNlY01nciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZWNNZ3IuY2hlY2tQZXJtaXNzaW9uKFJ1bnRpbWVQZXJtaXNzaW9uLnBlcm1pc3Npb25Ub1NldElPKTsKKyAgICAgICAgfQogICAgICAgICBzZXRGaWVsZEltcGwoImVyciIsICJMamF2YS9pby9QcmludFN0cmVhbTsiLCBuZXdFcnIpOwogICAgIH0KIApAQCAtMTI5LDkzICsxNzUsMTIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiA8Y29kZT5hcnJheTE8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldAotICAgICAqIDxjb2RlPnN0YXJ0MTwvY29kZT4gaW50byA8Y29kZT5hcnJheTI8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldAotICAgICAqIDxjb2RlPnN0YXJ0MjwvY29kZT4gZm9yIDxjb2RlPmxlbmd0aDwvY29kZT4gZWxlbWVudHMuCisgICAgICogQ29waWVzIHRoZSBudW1iZXIgb2Yge0Bjb2RlIGxlbmd0aH0gZWxlbWVudHMgb2YgdGhlIEFycmF5IHtAY29kZSBzcmN9CisgICAgICogc3RhcnRpbmcgYXQgdGhlIG9mZnNldCB7QGNvZGUgc3JjUG9zfSBpbnRvIHRoZSBBcnJheSB7QGNvZGUgZGVzdH0gYXQKKyAgICAgKiB0aGUgcG9zaXRpb24ge0Bjb2RlIGRlc3RQb3N9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhcnJheTEgdGhlIGFycmF5IHRvIGNvcHkgb3V0IG9mCi0gICAgICogQHBhcmFtIHN0YXJ0MSB0aGUgc3RhcnRpbmcgaW5kZXggaW4gYXJyYXkxCi0gICAgICogQHBhcmFtIGFycmF5MiB0aGUgYXJyYXkgdG8gY29weSBpbnRvCi0gICAgICogQHBhcmFtIHN0YXJ0MiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gYXJyYXkyCi0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSB0byBjb3B5CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBhcnJheSB0byBjb3B5IHRoZSBjb250ZW50LgorICAgICAqIEBwYXJhbSBzcmNQb3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgY29udGVudCBpbiB7QGNvZGUgc3JjfS4KKyAgICAgKiBAcGFyYW0gZGVzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgaW50by4KKyAgICAgKiBAcGFyYW0gZGVzdFBvcworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGV4IGZvciB0aGUgY29waWVkIGNvbnRlbnQgaW4ge0Bjb2RlIGRlc3R9LgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIHtAY29kZSBhcnJheTF9IGNvbnRlbnQgdGhleSBoYXZlCisgICAgICogICAgICAgICAgICB0byBiZSBjb3BpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWNvcHkoT2JqZWN0IGFycmF5MSwgaW50IHN0YXJ0MSwgT2JqZWN0IGFycmF5MiwgaW50IHN0YXJ0MiwgaW50IGxlbmd0aCk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWNvcHkoT2JqZWN0IHNyYywgaW50IHNyY1BvcywgT2JqZWN0IGRlc3QsCisgICAgICAgICAgICBpbnQgZGVzdFBvcywgaW50IGxlbmd0aCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgZXhwcmVzc2VkIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgdGltZQotICAgICAqIDAwOjAwOjAwIFVUQyBvbiBKYW51YXJ5IDEsIDE5NzAuCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwCisgICAgICogMDA6MDA6MDAgVVRDLiBUaGlzIG1ldGhvZCBzaG91bGRuJ3QgYmUgdXNlZCBmb3IgbWVhc3VyaW5nIHRpbWVvdXRzIG9yCisgICAgICogb3RoZXIgZWxhcHNlZCB0aW1lIG1lYXN1cmVtZW50cywgYXMgY2hhbmdpbmcgdGhlIHN5c3RlbSB0aW1lIGNhbiBhZmZlY3QKKyAgICAgKiB0aGUgcmVzdWx0cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBzeXN0ZW0gdGltZSBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBjdXJyZW50VGltZU1pbGxpcygpOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgbW9zdCBwcmVjaXNlIHRpbWUgbWVhc3VyZW1lbnQgaW4gbmFub3NlY29uZHMgdGhhdCdzCi0gICAgICogYXZhaWxhYmxlLgotICAgICAqIDwvcD4KKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgbW9zdCBwcmVjaXNlIHRpbWVyIGF2YWlsYWJsZSBvbiB0aGUKKyAgICAgKiBsb2NhbCBzeXN0ZW0uIFRoaXMgdGltZXN0YW1wIGNhbiBvbmx5IGJlIHVzZWQgdG8gbWVhc3VyZSBhbiBlbGFwc2VkCisgICAgICogcGVyaW9kIGJ5IGNvbXBhcmluZyBpdCBhZ2FpbnN0IGFub3RoZXIgdGltZXN0YW1wLiBJdCBjYW5ub3QgYmUgdXNlZCBhcyBhCisgICAgICogdmVyeSBleGFjdCBzeXN0ZW0gdGltZSBleHByZXNzaW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdGltZSBpbiBuYW5vc2Vjb25kcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBpbiBuYW5vc2Vjb25kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIG5hbm9UaW1lKCk7CiAKICAgICAvKioKLSAgICAgKiBDYXVzZXMgdGhlIHZpcnR1YWwgbWFjaGluZSB0byBzdG9wIHJ1bm5pbmcsIGFuZCB0aGUgcHJvZ3JhbSB0byBleGl0LiBJZgotICAgICAqIHJ1bkZpbmFsaXplcnNPbkV4aXQodHJ1ZSkgaGFzIGJlZW4gaW52b2tlZCwgdGhlbiBhbGwgZmluYWxpemVycyB3aWxsIGJlCi0gICAgICogcnVuIGZpcnN0LgorICAgICAqIENhdXNlcyB0aGUgdmlydHVhbCBtYWNoaW5lIHRvIHN0b3AgcnVubmluZyBhbmQgdGhlIHByb2dyYW0gdG8gZXhpdC4gSWYKKyAgICAgKiB7QGxpbmsgI3J1bkZpbmFsaXplcnNPbkV4aXQoYm9vbGVhbil9IGhhcyBiZWVuIHByZXZpb3VzbHkgaW52b2tlZCB3aXRoIGEKKyAgICAgKiB7QGNvZGUgdHJ1ZX0gYXJndW1lbnQsIHRoZW4gYWxsIGFsbCBvYmplY3RzIHdpbGwgYmUgcHJvcGVybHkKKyAgICAgKiBnYXJiYWdlLWNvbGxlY3RlZCBhbmQgZmluYWxpemVkIGZpcnN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2RlIHRoZSByZXR1cm4gY29kZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBydW5uaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byBjYXVzZQotICAgICAqICAgICAgICAgdGhlIHZtIHRvIGV4aXQuCi0gICAgICogCisgICAgICogQHBhcmFtIGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gY29kZS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJ1bm5pbmcgdGhyZWFkIGhhcyBub3QgZW5vdWdoIHBlcm1pc3Npb24gdG8gZXhpdCB0aGUKKyAgICAgKiAgICAgICAgICAgICB2aXJ0dWFsIG1hY2hpbmUuCiAgICAgICogQHNlZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tFeGl0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGV4aXQoaW50IGNvZGUpIHsKICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhpdChjb2RlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0byB0aGUgdmlydHVhbCBtYWNoaW5lIHRoYXQgaXQgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gY29sbGVjdAotICAgICAqIGF2YWlsYWJsZSBtZW1vcnkuIE5vdGUgdGhhdCwgdGhpcyBpcyBhIGhpbnQgb25seS4KKyAgICAgKiBJbmRpY2F0ZXMgdG8gdGhlIHZpcnR1YWwgbWFjaGluZSB0aGF0IGl0IHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJ1biB0aGUKKyAgICAgKiBnYXJiYWdlIGNvbGxlY3Rvci4gTm90ZSB0aGF0IHRoaXMgaXMgYSBoaW50IG9ubHkuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQorICAgICAqIHRoYXQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgYWN0dWFsbHkgYmUgcnVuLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnYygpIHsKICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHtAY29kZQorICAgICAqIHZhcn0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHZhciB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgbm8gdmFyaWFibGUgZXhpc3RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0BsaW5rIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdHMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCl9IG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB0aGUgcXVlcnlpbmcgb2YKKyAgICAgKiAgICAgICAgICAgICBzaW5nbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldGVudihTdHJpbmcgdmFyKSB7Ci0gICAgICAgIGlmICh2YXIgPT0gbnVsbCkgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldGVudihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjTWdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc2VjTWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlY01nci5jaGVja1Blcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJnZXRlbnYuIiArIHZhcikpOworICAgICAgICAgICAgc2VjTWdyLmNoZWNrUGVybWlzc2lvbihuZXcgUnVudGltZVBlcm1pc3Npb24oImdldGVudi4iICsgbmFtZSkpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGdldEVudkJ5TmFtZSh2YXIpOworICAgICAgICByZXR1cm4gZ2V0RW52QnlOYW1lKG5hbWUpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogUmV0dXJucyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTm8gc2VjdXJpdHkgY2hlY2tzIGFyZQotICAgICAqIHBlcmZvcm1lZC4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLiBObyBzZWN1cml0eSBjaGVja3MgYXJlIHBlcmZvcm1lZC4KICAgICAgKiBAcGFyYW0gdmFyIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldEVudkJ5TmFtZShTdHJpbmcgdmFyKTsKLSAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldEVudkJ5TmFtZShTdHJpbmcgbmFtZSk7CisKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIG1hcCBvZiBhbGwgYXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgTWFwIG9mIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgICogQHJldHVybiB0aGUgbWFwIHJlcHJlc2VudGluZyBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAbGluayBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXRzIHtAY29kZQorICAgICAqICAgICAgICAgICAgIGNoZWNrUGVybWlzc2lvbigpfSBtZXRob2QgZG9lcyBub3QgYWxsb3cgdGhlIHF1ZXJ5aW5nIG9mCisgICAgICogICAgICAgICAgICAgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0ZW52KCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjTWdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMjI0LDE1ICsyOTcsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIAorCiAgICAgICAgIGludCBpbmRleCA9IDA7CiAgICAgICAgIFN0cmluZyBlbnRyeSA9IGdldEVudkJ5SW5kZXgoaW5kZXgrKyk7Ci0gICAgICAgIHdoaWxlKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgIGludCBwb3MgPSBlbnRyeS5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICBpZiAocG9zICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgbWFwLnB1dChlbnRyeS5zdWJzdHJpbmcoMCwgcG9zKSwgZW50cnkuc3Vic3RyaW5nKHBvcyArIDEpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBlbnRyeSA9IGdldEVudkJ5SW5kZXgoaW5kZXgrKyk7CiAgICAgICAgIH0KIApAQCAtMjQwLDI2ICszMTMsMjUgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIFJldHVybnMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuIE5vIHNlY3VyaXR5IGNoZWNrcyBhcmUKLSAgICAgKiBwZXJmb3JtZWQuIFRoZSBzYWZlIHdheSBvZiB0cmF2ZXJzaW5nIHRoZSBlbnZpcm9ubWVudCBpcwotICAgICAqIHRvIHN0YXJ0IGF0IGluZGV4IHplcm8gYW5kIGNvdW50IHVwd2FyZHMgdW50aWwgYSBudWxsCi0gICAgICogcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gVGhpcyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBVbml4Ci0gICAgICogZW52aXJvbm1lbnQuCi0gICAgICogCisgICAgICogUmV0dXJucyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTm8gc2VjdXJpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQuIFRoZQorICAgICAqIHNhZmUgd2F5IG9mIHRyYXZlcnNpbmcgdGhlIGVudmlyb25tZW50IGlzIHRvIHN0YXJ0IGF0IGluZGV4IHplcm8gYW5kCisgICAgICogY291bnQgdXB3YXJkcyB1bnRpbCBhIG51bGwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gVGhpcyBtYXJrcyB0aGUgZW5kIG9mCisgICAgICogdGhlIFVuaXggZW52aXJvbm1lbnQuCiAgICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRFbnZCeUluZGV4KGludCBpbmRleCk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRoZSBpbmhlcml0ZWQgY2hhbm5lbCBmcm9tIHRoZSBzeXN0ZW0td2lkZSBwcm92aWRlci4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGUgaW5oZXJpdGVkIGNoYW5uZWwgZnJvbSB0aGUgY3JlYXRvciBvZiB0aGUgY3VycmVudCB2aXJ0dWFsCisgICAgICogbWFjaGluZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEge0BsaW5rIENoYW5uZWx9IG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIGluaGVyaXRlZCB7QGxpbmsgQ2hhbm5lbH0gb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgZXhpc3RzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJyZWQuCiAgICAgICogQHNlZSBTZWxlY3RvclByb3ZpZGVyCiAgICAgICogQHNlZSBTZWxlY3RvclByb3ZpZGVyI2luaGVyaXRlZENoYW5uZWwoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2hhbm5lbCBpbmhlcml0ZWRDaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKS5pbmhlcml0ZWRDaGFubmVsKCk7CkBAIC0yNjksMTcgKzM0MSwxOSBAQAogICAgICAqIFJldHVybnMgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBjb3B5LCBzbyB0aGF0CiAgICAgICogY2hhbmdlcyBtYWRlIHRvIHRoZSByZXR1cm5lZCBQcm9wZXJ0aWVzIG9iamVjdCB3aWxsIGJlIHJlZmxlY3RlZCBpbgogICAgICAqIHN1YnNlcXVlbnQgY2FsbHMgdG8gZ2V0UHJvcGVydHkgYW5kIGdldFByb3BlcnRpZXMuCi0gICAgICogPHA+Ci0gICAgICogU2VjdXJpdHkgbWFuYWdlcnMgc2hvdWxkIHJlc3RyaWN0IGFjY2VzcyB0byB0aGlzIEFQSSBpZiBwb3NzaWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcworICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAbGluayBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXRzIHtAY29kZQorICAgICAqICAgICAgICAgICAgIGNoZWNrUHJvcGVydGllc0FjY2VzcygpfSBtZXRob2QgZG9lcyBub3QgYWxsb3cgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY01nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNlY01nciAhPSBudWxsKSB7CiAgICAgICAgICAgICBzZWNNZ3IuY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIGludGVybmFsR2V0UHJvcGVydGllcygpOwogICAgIH0KIApAQCAtMjk2LDEzICszNzAsMTMgQEAKICAgICAgICAgICAgIHByb3BzLnBvc3RJbml0KCk7CiAgICAgICAgICAgICBTeXN0ZW0uc3lzdGVtUHJvcGVydGllcyA9IHByb3BzOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBzeXN0ZW1Qcm9wZXJ0aWVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzeXN0ZW0gcHJvcGVydHkuIFJldHVybnMgbnVsbCBpZiBubwotICAgICAqIHN1Y2ggcHJvcGVydHkgZXhpc3RzLAorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzeXN0ZW0gcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9IGlmIG5vCisgICAgICogc3VjaCBwcm9wZXJ0eSBleGlzdHMuCiAgICAgICogPHA+CiAgICAgICogVGhlIHByb3BlcnRpZXMgY3VycmVudGx5IHByb3ZpZGVkIGJ5IHRoZSB2aXJ0dWFsIG1hY2hpbmUgYXJlOgogICAgICAqIApAQCAtMzI1LDIyICszOTksMzQgQEAKICAgICAgKiAgICAgICAgamF2YS5ob21lCiAgICAgICogPC9wcmU+CiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3AgdGhlIHN5c3RlbSBwcm9wZXJ0eSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzeXN0ZW0gcHJvcGVydHksIG9yIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0CisgICAgICogQHBhcmFtIHByb3AKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzeXN0ZW0gcHJvcGVydHkgdG8gbG9vayB1cC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN5c3RlbSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAbGluayBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXRzIHtAY29kZQorICAgICAqICAgICAgICAgICAgIGNoZWNrUHJvcGVydHlBY2Nlc3MoKX0gbWV0aG9kIGRvZXMgbm90IGFsbG93IHRoZSBvcGVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3ApIHsKICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5KHByb3AsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzeXN0ZW0gcHJvcGVydHkuIElmIG5vIHN1Y2ggcHJvcGVydHkgaXMKLSAgICAgKiBmb3VuZCwgcmV0dXJucyB0aGUgZGVmYXVsdFZhbHVlLgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzeXN0ZW0gcHJvcGVydHkuIFRoZSB7QGNvZGUKKyAgICAgKiBkZWZhdWx0VmFsdWV9IHdpbGwgYmUgcmV0dXJuZWQgaWYgbm8gc3VjaCBwcm9wZXJ0eSBoYXMgYmVlbiBmb3VuZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcCB0aGUgc3lzdGVtIHByb3BlcnR5IHRvIGxvb2sgdXAKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHJldHVybiB2YWx1ZSBpZiBzeXN0ZW0gcHJvcGVydHkgaXMgbm90IGZvdW5kCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzeXN0ZW0gcHJvcGVydHksIG9yIGRlZmF1bHRWYWx1ZSBpZgotICAgICAqICAgICAgICAgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QKKyAgICAgKiBAcGFyYW0gcHJvcAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSB0byBsb29rIHVwLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgaWYgdGhlIHN5c3RlbSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgICAgICogICAgICAgICAgICBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN5c3RlbSBwcm9wZXJ0eSBvciB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBkZWZhdWx0VmFsdWV9IGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0cyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBjaGVja1Byb3BlcnR5QWNjZXNzKCl9IG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgIGlmIChwcm9wLmxlbmd0aCgpID09IDApIHsKQEAgLTM1MCwxNiArNDM2LDIzIEBACiAgICAgICAgIGlmIChzZWNNZ3IgIT0gbnVsbCkgewogICAgICAgICAgICAgc2VjTWdyLmNoZWNrUHJvcGVydHlBY2Nlc3MocHJvcCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIGludGVybmFsR2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KHByb3AsIGRlZmF1bHRWYWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHN5c3RlbSBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcCB0aGUgc3lzdGVtIHByb3BlcnR5IHRvIGNoYW5nZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggcHJvcAotICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIG51bGwKKyAgICAgKiBAcGFyYW0gcHJvcAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0eSB7QGNvZGUgcHJvcH0uCisgICAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5CisgICAgICogICAgICAgICBkaWRuJ3QgZXhpc3QuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHdyaXRlIGFjY2VzcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICBzcGVjaWZpZWQgcHJvcGVydHkgaXMgbm90IGFsbG93ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0UHJvcGVydHkoU3RyaW5nIHByb3AsIFN0cmluZyB2YWx1ZSkgewogICAgICAgICBpZiAocHJvcC5sZW5ndGgoKSA9PSAwKSB7CkBAIC0zNjksMjkgKzQ2MiwyMyBAQAogICAgICAgICBpZiAoc2VjTWdyICE9IG51bGwpIHsKICAgICAgICAgICAgIHNlY01nci5jaGVja1Blcm1pc3Npb24obmV3IFByb3BlcnR5UGVybWlzc2lvbihwcm9wLCAid3JpdGUiKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGludGVybmFsR2V0UHJvcGVydGllcygpLnNldFByb3BlcnR5KHByb3AsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKCkuc2V0UHJvcGVydHkocHJvcCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJlbW92ZXMgdGhlIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogPC9wPgorICAgICAqIFJlbW92ZXMgYSBzcGVjaWZpYyBzeXN0ZW0gcHJvcGVydHkuCiAgICAgICogCi0gICAgICogPHA+Ci0gICAgICogUGxlYXNlIHNlZSB0aGUgSmF2YSBTRSBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlcgotICAgICAqIGluZm9ybWF0aW9uIG9uIHRoaXMgbWV0aG9kLgotICAgICAqIDxwPgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIHN5c3RlbSBwcm9wZXJ0eSB0byBiZSByZW1vdmVkLgotICAgICAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgb3IgbnVsbCBpZiBubyB2YWx1ZSBleGlzdGVkCi0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+a2V5PC9jb2RlPiBhcmd1bWVudCBpcwotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPmtleTwvY29kZT4gYXJndW1lbnQgaXMKLSAgICAgKiAgICAgICAgIGVtcHR5LgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgd3JpdGUgYWNjZXNzCi0gICAgICogICAgICAgICB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIG5vdCBhbGxvd2VkLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgc3lzdGVtIHByb3BlcnR5IHRvIGJlIHJlbW92ZWQuCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eSBkaWRuJ3QgZXhpc3QuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCB7QGNvZGUga2V5fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQge0Bjb2RlIGtleX0gaXMgZW1wdHkuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHdyaXRlIGFjY2VzcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICBzcGVjaWZpZWQgcHJvcGVydHkgaXMgbm90IGFsbG93ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJQcm9wZXJ0eShTdHJpbmcga2V5KSB7CiAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewpAQCAtNDA1LDEzICs0OTIsMTQgQEAKICAgICAgICAgaWYgKHNlY01nciAhPSBudWxsKSB7CiAgICAgICAgICAgICBzZWNNZ3IuY2hlY2tQZXJtaXNzaW9uKG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oa2V5LCAid3JpdGUiKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGludGVybmFsR2V0UHJvcGVydGllcygpLnJlbW92ZShrZXkpOworICAgICAgICByZXR1cm4gKFN0cmluZylpbnRlcm5hbEdldFByb3BlcnRpZXMoKS5yZW1vdmUoa2V5KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgc2VjdXJpdHkgbWFuYWdlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gc2VjdXJpdHkgbWFuYWdlciBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTZWN1cml0eU1hbmFnZXIgZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgewogICAgICAgICByZXR1cm4gc2VjdXJpdHlNYW5hZ2VyOwpAQCAtNDE5LDYzICs1MDcsNzUgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSBwYXJhbWV0ZXIuIFRoZSBoYXNoIGNvZGUgcmV0dXJuZWQgaXMKLSAgICAgKiB0aGUgc2FtZSBvbmUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBqYXZhLmxhbmcuT2JqZWN0Lmhhc2hDb2RlKCksCi0gICAgICogd2hldGhlciBvciBub3QgdGhlIG9iamVjdCdzIGNsYXNzIGhhcyBvdmVycmlkZGVuIGhhc2hDb2RlKCkuIFRoZSBoYXNoCi0gICAgICogY29kZSBmb3IgbnVsbCBpcyAwLgorICAgICAqIHRoZSBzYW1lIG9uZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IHRoZSBtZXRob2Qge0Bjb2RlCisgICAgICogamF2YS5sYW5nLk9iamVjdC5oYXNoQ29kZSgpfSwgd2hldGhlciBvciBub3QgdGhlIG9iamVjdCdzIGNsYXNzIGhhcworICAgICAqIG92ZXJyaWRkZW4gaGFzaENvZGUoKS4gVGhlIGhhc2ggY29kZSBmb3Ige0Bjb2RlIG51bGx9IGlzIHtAY29kZSAwfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5PYmplY3QgdGhlIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgdGhlIG9iamVjdAotICAgICAqIAorICAgICAqIEBwYXJhbSBhbk9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIGhhc2ggY29kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGlkZW50aXR5SGFzaENvZGUoT2JqZWN0IGFuT2JqZWN0KTsKIAogICAgIC8qKgogICAgICAqIExvYWRzIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBhIGR5bmFtaWMgbGlicmFyeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aE5hbWUgdGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkCisgICAgICogQHBhcmFtIHBhdGhOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsaWJyYXJ5IHdhcyBub3QgYWxsb3dlZCB0byBiZSBsb2FkZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWQoU3RyaW5nIHBhdGhOYW1lKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbW5nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtbmdyICE9IG51bGwpIHsKICAgICAgICAgICAgIHNtbmdyLmNoZWNrTGluayhwYXRoTmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmxvYWQocGF0aE5hbWUsIFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCkpOwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9hZHMgYW5kIGxpbmtzIHRoZSBsaWJyYXJ5IHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQuCisgICAgICogTG9hZHMgYW5kIGxpbmtzIHRoZSBzaGFyZWQgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIHtAY29kZSBsaWJOYW1lfS4KKyAgICAgKiBUaGUgZmlsZSB3aWxsIGJlIHNlYXJjaGVkIGluIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3Igc2hhcmVkIGxpYnJhcmllcworICAgICAqIG9mIHRoZSBsb2NhbCBzeXN0ZW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpYk5hbWUgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdG8gbG9hZAotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3IgaWYgdGhlIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZAotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGxpYnJhcnkgd2FzIG5vdCBhbGxvd2VkIHRvIGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSBsaWJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBsb2FkLgorICAgICAqIEB0aHJvd3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGlicmFyeSB3YXMgbm90IGFsbG93ZWQgdG8gYmUgbG9hZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkTGlicmFyeShTdHJpbmcgbGliTmFtZSkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtbmdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBpZiAoc21uZ3IgIT0gbnVsbCkgeworICAgICAgICAgICAgc21uZ3IuY2hlY2tMaW5rKGxpYk5hbWUpOworICAgICAgICB9CiAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmxvYWRMaWJyYXJ5KGxpYk5hbWUsIFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCkpOwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUHJvdmlkZXMgYSBoaW50IHRvIHRoZSB2aXJ0dWFsIG1hY2hpbmUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gYXR0ZW1wdAogICAgICAqIHRvIHBlcmZvcm0gYW55IG91dHN0YW5kaW5nIG9iamVjdCBmaW5hbGl6YXRpb25zLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5GaW5hbGl6YXRpb24oKSB7CiAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnJ1bkZpbmFsaXphdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0LCB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgYWJvdXQgdG8gZXhpdCwgYWxsIG9iamVjdHMgYXJlCisgICAgICogRW5zdXJlcyB0aGF0LCB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgYWJvdXQgdG8gZXhpdCwgYWxsIG9iamVjdHMgYXJlCiAgICAgICogZmluYWxpemVkLiBOb3RlIHRoYXQgYWxsIGZpbmFsaXphdGlvbiB3aGljaCBvY2N1cnMgd2hlbiB0aGUgc3lzdGVtIGlzCiAgICAgICogZXhpdGluZyBpcyBwZXJmb3JtZWQgYWZ0ZXIgYWxsIHJ1bm5pbmcgdGhyZWFkcyBoYXZlIGJlZW4gdGVybWluYXRlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmxhZwotICAgICAqICAgICAgICAgICAgdHJ1ZSBtZWFucyBmaW5hbGl6ZSBhbGwgb24gZXhpdC4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyB1bnNhZmUuCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyBkZXRlcm1pbmVzIGlmIGZpbmFsaXphdGlvbiBvbiBleGl0IGlzIGVuYWJsZWQuCisgICAgICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaXMgdW5zYWZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKQEAgLTQ4NCwxNCArNTg0LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3lzdGVtIHByb3BlcnRpZXMuIE5vdGUgdGhhdCB0aGUgb2JqZWN0IHdoaWNoIGlzIHBhc3NlZCBpbgotICAgICAqIG5vdCBjb3BpZWQsIHNvIHRoYXQgc3Vic2VxdWVudCBjaGFuZ2VzIG1hZGUgdG8gdGhlIG9iamVjdCB3aWxsIGJlCi0gICAgICogcmVmbGVjdGVkIGluIGNhbGxzIHRvIGdldFByb3BlcnR5IGFuZCBnZXRQcm9wZXJ0aWVzLgotICAgICAqIDxwPgotICAgICAqIFNlY3VyaXR5IG1hbmFnZXJzIHNob3VsZCByZXN0cmljdCBhY2Nlc3MgdG8gdGhpcyBBUEkgaWYgcG9zc2libGUuCisgICAgICogU2V0cyBhbGwgc3lzdGVtIHByb3BlcnRpZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHAKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc3lzdGVtIHByb3BlcnR5LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAbGluayBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXRzIHtAY29kZQorICAgICAqICAgICAgICAgICAgIGNoZWNrUHJvcGVydGllc0FjY2VzcygpfSBtZXRob2QgZG9lcyBub3QgYWxsb3cgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHApIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY01nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTUwNCwzNSArNjA0LDM2IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBhY3RpdmUgc2VjdXJpdHkgbWFuYWdlci4gTm90ZSB0aGF0IG9uY2UgdGhlIHNlY3VyaXR5IG1hbmFnZXIgaGFzCi0gICAgICogYmVlbiBzZXQsIGl0IGNhbiBub3QgYmUgY2hhbmdlZC4gQXR0ZW1wdHMgdG8gZG8gc28gd2lsbCBjYXVzZSBhIHNlY3VyaXR5Ci0gICAgICogZXhjZXB0aW9uLgorICAgICAqIGJlZW4gc2V0LCBpdCBjYW4gbm90IGJlIGNoYW5nZWQuIEF0dGVtcHRzIHRvIGRvIHRoYXQgd2lsbCBjYXVzZSBhCisgICAgICogc2VjdXJpdHkgZXhjZXB0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzbQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzZWN1cml0eSBtYW5hZ2VyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNlY3VyaXR5IG1hbmFnZXIuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzZWN1cml0eSBtYW5hZ2VyIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGFuZCBpZiBpdHMKICAgICAgKiAgICAgICAgICAgICBjaGVja1Blcm1pc3Npb24gbWV0aG9kIGRvZXMgbm90IGFsbG93IHRvIHJlZGVmaW5lIHRoZQotICAgICAqICAgICAgICAgICAgIHNlY3VyaXR5IG1hbmFnZXIuIAorICAgICAqICAgICAgICAgICAgIHNlY3VyaXR5IG1hbmFnZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNlY3VyaXR5TWFuYWdlcihmaW5hbCBTZWN1cml0eU1hbmFnZXIgc20pIHsKICAgICAgICAgaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZWN1cml0eU1hbmFnZXIKLSAgICAgICAgICAgICAgICAgIC5jaGVja1Blcm1pc3Npb24obmV3IGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbigic2V0U2VjdXJpdHlNYW5hZ2VyIikpOworICAgICAgICAgICAgc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihuZXcgamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uKCJzZXRTZWN1cml0eU1hbmFnZXIiKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBuZXcgbWFuYWdlciBhc3N1bWVkIG9mZmljZSwgbWFrZSBhIHBhc3MgdGhyb3VnaCAKKyAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgbmV3IG1hbmFnZXIgYXNzdW1lZCBvZmZpY2UsIG1ha2UgYSBwYXNzIHRocm91Z2gKICAgICAgICAgICAgIC8vIHRoZSBjb21tb24gb3BlcmF0aW9ucyBhbmQgbGV0IGl0IGxvYWQgbmVlZGVkIGNsYXNzZXMgKGlmIGFueSksCi0gICAgICAgICAgICAvLyB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gbGF0ZXIgb24gCisgICAgICAgICAgICAvLyB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gbGF0ZXIgb24KICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc20uY2hlY2tQZXJtaXNzaW9uKG5ldyBTZWN1cml0eVBlcm1pc3Npb24oImdldFByb3BlcnR5LnBhY2thZ2UuYWNjZXNzIikpOyAKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisgICAgICAgICAgICAgICAgc20uY2hlY2tQZXJtaXNzaW9uKG5ldyBTZWN1cml0eVBlcm1pc3Npb24oImdldFByb3BlcnR5LnBhY2thZ2UuYWNjZXNzIikpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzbS5jaGVja1BhY2thZ2VBY2Nlc3MoImphdmEubGFuZyIpOyAKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisgICAgICAgICAgICAgICAgc20uY2hlY2tQYWNrYWdlQWNjZXNzKCJqYXZhLmxhbmciKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBzZWN1cml0eU1hbmFnZXIgPSBzbTsKICAgICB9CiAKQEAgLTU0Miw3ICs2NDMsOCBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSB1c2VyTGliTmFtZQogICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdG8gbG9vayB1cC4KLSAgICAgKiBAcmV0dXJuIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBmaWxlbmFtZSBmb3IgdGhlIGxpYnJhcnkKKyAgICAgKiBAcmV0dXJuIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBmaWxlbmFtZSBmb3IgdGhlIGxpYnJhcnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIG1hcExpYnJhcnlOYW1lKFN0cmluZyB1c2VyTGliTmFtZSk7CiAKQEAgLTU2MCwxMyArNjYyLDEzIEBACiB9CiAKIC8qKgotICogSW50ZXJuYWwgY2xhc3MgaG9sZGluZyB0aGUgU3lzdGVtIHByb3BlcnRpZXMuIE5lZWRlZCBieSB0aGUgRGFsdmlrIFZNIGZvcgotICogdGhlIHR3byBuYXRpdmUgbWV0aG9kcy4gTXVzdCBub3QgYmUgYSBsb2NhbCBjbGFzcywgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhCi0gKiBTeXN0ZW0gaW5zdGFuY2UuIAorICogSW50ZXJuYWwgY2xhc3MgaG9sZGluZyB0aGUgU3lzdGVtIHByb3BlcnRpZXMuIE5lZWRlZCBieSB0aGUgRGFsdmlrIFZNIGZvciB0aGUKKyAqIHR3byBuYXRpdmUgbWV0aG9kcy4gTXVzdCBub3QgYmUgYSBsb2NhbCBjbGFzcywgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIFN5c3RlbQorICogaW5zdGFuY2UuCiAgKi8KIGNsYXNzIFN5c3RlbVByb3BlcnRpZXMgZXh0ZW5kcyBQcm9wZXJ0aWVzIHsKICAgICAvLyBEdW1teSwganVzdCB0byBtYWtlIHRoZSBjb21waWxlciBoYXBweS4KLSAgICAKKwogICAgIG5hdGl2ZSB2b2lkIHByZUluaXQoKTsKIAogICAgIG5hdGl2ZSB2b2lkIHBvc3RJbml0KCk7CkBAIC01ODIsMTMgKzY4NCwxMyBAQAogY2xhc3MgU3lzdGVtRW52aXJvbm1lbnQgaW1wbGVtZW50cyBNYXAgewogCiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcDsKLSAgICAKKwogICAgIHB1YmxpYyBTeXN0ZW1FbnZpcm9ubWVudChNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCkgewogICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBtb2RpZnkgZW52aXJvbm1lbnQiKTsgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IG1vZGlmeSBlbnZpcm9ubWVudCIpOwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKQEAgLTYzMSwxNSArNzMzLDE1IEBACiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgbW9kaWZ5IGVudmlyb25tZW50Iik7ICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBtb2RpZnkgZW52aXJvbm1lbnQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IG1vZGlmeSBlbnZpcm9ubWVudCIpOyAgICAgICAgCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgbW9kaWZ5IGVudmlyb25tZW50Iik7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IG1vZGlmeSBlbnZpcm9ubWVudCIpOyAgICAgICAgCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgbW9kaWZ5IGVudmlyb25tZW50Iik7CiAgICAgfQogCiAgICAgcHVibGljIGludCBzaXplKCkgewpAQCAtNjQ5LDUgKzc1MSw1IEBACiAgICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewogICAgICAgICByZXR1cm4gbWFwLnZhbHVlcygpOwogICAgIH0KLSAgICAKKwogfQpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVGhyZWFkLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWQuamF2YQppbmRleCBiM2FmYzczLi5kMzc5NWY4IDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWQuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWQuamF2YQpAQCAtMSw3ICsxLDMgQEAKLS8vIEJFR0lOIGFuZHJvaWQtbm90ZQotLy8gUmV3b3JkZWQgZGVzY3JpcHRpb24gb2YgVGhyZWFkCi0vLyBFTkQgYW5kcm9pZC1ub3RlCi0KIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtMTgsMzcgKzE0LDY1IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVN0YWNrOwotLy8gRU5EIGFuZHJvaWQtYWRkZWQKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0vLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKLS8vaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLlNlY3VyaXR5VXRpbHM7CiAKIC8qKgotICogQSBUaHJlYWQgaXMgYSB1bml0IG9mIGNvbmN1cnJlbnQgZXhlY3V0aW9uLiBJdCBoYXMgaXRzIG93bgotICogY2FsbCBzdGFjayBmb3IgbWV0aG9kcyBiZWluZyBjYWxsZWQgYW5kIHRoZWlyIHBhcmFtZXRlcnMuIFRocmVhZHMgaW4gdGhlIHNhbWUKLSAqIFZNIGludGVyYWN0IGFuZCBzeW5jaHJvbml6ZSBieSB0aGUgdXNlIG9mIHNoYXJlZCBPYmplY3RzIGFuZCBtb25pdG9ycwotICogYXNzb2NpYXRlZCB3aXRoIHRoZXNlIG9iamVjdHMuIFN5bmNocm9uaXplZCBtZXRob2RzIGFuZCBwYXJ0IG9mIHRoZSBBUEkgaW4KLSAqIE9iamVjdCBhbHNvIGFsbG93IFRocmVhZHMgdG8gY29vcGVyYXRlLgotICoKKyAqIEEge0Bjb2RlIFRocmVhZH0gaXMgYSBjb25jdXJyZW50IHVuaXQgb2YgZXhlY3V0aW9uLiBJdCBoYXMgaXRzIG93biBjYWxsIHN0YWNrCisgKiBmb3IgbWV0aG9kcyBiZWluZyBpbnZva2VkLCB0aGVpciBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcy4gRWFjaCB2aXJ0dWFsCisgKiBtYWNoaW5lIGluc3RhbmNlIGhhcyBhdCBsZWFzdCBvbmUgbWFpbiB7QGNvZGUgVGhyZWFkfSBydW5uaW5nIHdoZW4gaXQgaXMKKyAqIHN0YXJ0ZWQ7IHR5cGljYWxseSwgdGhlcmUgYXJlIHNldmVyYWwgb3RoZXJzIGZvciBob3VzZWtlZXBpbmcuIFRoZQorICogYXBwbGljYXRpb24gbWlnaHQgZGVjaWRlIHRvIGxhdW5jaCBhZGRpdGlvbmFsIHtAY29kZSBUaHJlYWR9cyBmb3Igc3BlY2lmaWMKKyAqIHB1cnBvc2VzLgorICogPHA+CisgKiB7QGNvZGUgVGhyZWFkfXMgaW4gdGhlIHNhbWUgVk0gaW50ZXJhY3QgYW5kIHN5bmNocm9uaXplIGJ5IHRoZSB1c2Ugb2Ygc2hhcmVkCisgKiBvYmplY3RzIGFuZCBtb25pdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlc2Ugb2JqZWN0cy4gU3luY2hyb25pemVkIG1ldGhvZHMgYW5kCisgKiBwYXJ0IG9mIHRoZSBBUEkgaW4ge0BsaW5rIE9iamVjdH0gYWxzbyBhbGxvdyB7QGNvZGUgVGhyZWFkfXMgdG8gY29vcGVyYXRlLgorICogPHA+CisgKiBUaGVyZSBhcmUgYmFzaWNhbGx5IHR3byBtYWluIHdheXMgb2YgaGF2aW5nIGEge0Bjb2RlIFRocmVhZH0gZXhlY3V0ZQorICogYXBwbGljYXRpb24gY29kZS4gT25lIGlzIHByb3ZpZGluZyBhIG5ldyBjbGFzcyB0aGF0IGV4dGVuZHMge0Bjb2RlIFRocmVhZH0KKyAqIGFuZCBvdmVycmlkaW5nIGl0cyB7QGxpbmsgI3J1bigpfSBtZXRob2QuIFRoZSBvdGhlciBpcyBwcm92aWRpbmcgYSBuZXcKKyAqIHtAY29kZSBUaHJlYWR9IGluc3RhbmNlIHdpdGggYSB7QGxpbmsgUnVubmFibGV9IG9iamVjdCBkdXJpbmcgaXRzIGNyZWF0aW9uLgorICogSW4gYm90aCBjYXNlcywgdGhlIHtAbGluayAjc3RhcnQoKX0gbWV0aG9kIG11c3QgYmUgY2FsbGVkIHRvIGFjdHVhbGx5IGV4ZWN1dGUKKyAqIHRoZSBuZXcge0Bjb2RlIFRocmVhZH0uCisgKiA8cD4KKyAqIEVhY2gge0Bjb2RlIFRocmVhZH0gaGFzIGFuIGludGVnZXIgcHJpb3JpdHkgdGhhdCBiYXNpY2FsbHkgZGV0ZXJtaW5lcyB0aGUKKyAqIGFtb3VudCBvZiBDUFUgdGltZSB0aGUge0Bjb2RlIFRocmVhZH0gZ2V0cy4gSXQgY2FuIGJlIHNldCB1c2luZyB0aGUKKyAqIHtAbGluayAjc2V0UHJpb3JpdHkoaW50KX0gbWV0aG9kLiBBIHtAY29kZSBUaHJlYWR9IGNhbiBhbHNvIGJlIG1hZGUgYSBkYWVtb24sCisgKiB3aGljaCBtYWtlcyBpdCBydW4gaW4gdGhlIGJhY2tncm91bmQuIFRoZSBsYXR0ZXIgYWxzbyBhZmZlY3RzIFZNIHRlcm1pbmF0aW9uCisgKiBiZWhhdmlvcjogdGhlIFZNIGRvZXMgbm90IHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGFzIGxvbmcgYXMgdGhlcmUgYXJlCisgKiBub24tZGFlbW9uIHRocmVhZHMgcnVubmluZy4KKyAqICAgIAogICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0CiAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWRHcm91cAorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKLQogICAgIC8qKiBQYXJrIHN0YXRlcyAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhcmtTdGF0ZSB7CiAgICAgICAgIC8qKiBwYXJrIHN0YXRlIGluZGljYXRpbmcgdW5wYXJrZWQgKi8KQEAgLTU5LDIyICs4MywxNiBAQAogICAgIAogICAgICAgICAvKiogcGFyayBzdGF0ZSBpbmRpY2F0aW5nIHBhcmtlZCAqLwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSS0VEID0gMzsKLSAgICB9OwotCi0gICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyZWFkJ3Mgc3RhdGUuIEEgZ2l2ZW4gdGhyZWFkIG1heSBvbmx5IGJlIGluIG9uZQogICAgICAqIHN0YXRlIGF0IGEgdGltZS4KICAgICAgKgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZW51bSBTdGF0ZSB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGhyZWFkIGlzIGJsb2NrZWQgYW5kIHdhaXRpbmcgZm9yIGEgbG9jay4KLSAgICAgICAgICovCi0gICAgICAgIEJMT0NLRUQsCi0gICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgdGhyZWFkIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCBoYXMgbmV2ZXIgYmVlbiBzdGFydGVkLgogICAgICAgICAgKi8KICAgICAgICAgTkVXLApAQCAtODMsMzcgKzEwMSw0MSBAQAogICAgICAgICAgKi8KICAgICAgICAgUlVOTkFCTEUsCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGhyZWFkIGhhcyBiZWVuIHRlcm1pbmF0ZWQuCisgICAgICAgICAqIFRoZSB0aHJlYWQgaXMgYmxvY2tlZCBhbmQgd2FpdGluZyBmb3IgYSBsb2NrLgogICAgICAgICAgKi8KLSAgICAgICAgVEVSTUlOQVRFRCwKKyAgICAgICAgQkxPQ0tFRCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aHJlYWQgaXMgd2FpdGluZy4KKyAgICAgICAgICovCisgICAgICAgIFdBSVRJTkcsCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgdGhyZWFkIGlzIHdhaXRpbmcgZm9yIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLgogICAgICAgICAgKi8KICAgICAgICAgVElNRURfV0FJVElORywKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aHJlYWQgaXMgd2FpdGluZy4KKyAgICAgICAgICogVGhlIHRocmVhZCBoYXMgYmVlbiB0ZXJtaW5hdGVkLgogICAgICAgICAgKi8KLSAgICAgICAgV0FJVElORworICAgICAgICBURVJNSU5BVEVECiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogVGhlIG1heGltdW0gcHJpb3JpdHkgdmFsdWUgYWxsb3dlZCBmb3IgYSB0aHJlYWQuCi0gICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1BWF9QUklPUklUWSA9IDEwOwogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogVGhlIG1pbmltdW0gcHJpb3JpdHkgdmFsdWUgYWxsb3dlZCBmb3IgYSB0aHJlYWQuCi0gICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1JTl9QUklPUklUWSA9IDE7CiAKICAgICAvKioKLSAgICAgKiA8cD4KICAgICAgKiBUaGUgbm9ybWFsIChkZWZhdWx0KSBwcmlvcml0eSB2YWx1ZSBhc3NpZ25lZCB0byB0aHJlYWRzLgotICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT1JNX1BSSU9SSVRZID0gNTsKIApAQCAtMTMzLDcgKzE1NSw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBsb25nIGlkOwogCi0vLyBCRUdJTiBhbmRyb2lkLWNobmdlZAogICAgIC8qKgogICAgICAqIE5vcm1hbCB0aHJlYWQgbG9jYWwgdmFsdWVzLgogICAgICAqLwpAQCAtMTQzLDcgKzE2NCw2IEBACiAgICAgICogSW5oZXJpdGFibGUgdGhyZWFkIGxvY2FsIHZhbHVlcy4KICAgICAgKi8KICAgICBUaHJlYWRMb2NhbC5WYWx1ZXMgaW5oZXJpdGFibGVWYWx1ZXM7Ci0vLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKICAgICAgKiBIb2xkcyB0aGUgaW50ZXJydXB0IGFjdGlvbiBmb3IgdGhpcyBUaHJlYWQsIGlmIGFueS4KQEAgLTE3Niw0NiArMTk2LDU2IEBACiAgICAgICovCiAgICAgYm9vbGVhbiBoYXNCZWVuU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIC8qKiB0aGUgcGFyayBzdGF0ZSBvZiB0aGUgdGhyZWFkICovCiAgICAgcHJpdmF0ZSBpbnQgcGFya1N0YXRlID0gUGFya1N0YXRlLlVOUEFSS0VEOwotICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGhyZWFkIHdpdGggbm8gcnVubmFibGUgb2JqZWN0IGFuZCBhIG5ld2x5IGdlbmVyYXRlZAotICAgICAqIG5hbWUuIFRoZSBuZXcgVGhyZWFkIHdpbGwgYmVsb25nIHRvIHRoZSBzYW1lIFRocmVhZEdyb3VwIGFzIHRoZSBUaHJlYWQKLSAgICAgKiBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVGhyZWFkfSB3aXRoIG5vIHtAY29kZSBSdW5uYWJsZX0gb2JqZWN0IGFuZCBhCisgICAgICogbmV3bHkgZ2VuZXJhdGVkIG5hbWUuIFRoZSBuZXcge0Bjb2RlIFRocmVhZH0gd2lsbCBiZWxvbmcgdG8gdGhlIHNhbWUKKyAgICAgKiB7QGNvZGUgVGhyZWFkR3JvdXB9IGFzIHRoZSB7QGNvZGUgVGhyZWFkfSBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IuCiAgICAgICoKICAgICAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWRHcm91cAorICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRocmVhZCgpIHsKICAgICAgICAgY3JlYXRlKG51bGwsIG51bGwsIG51bGwsIDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGhyZWFkIHdpdGggYSBydW5uYWJsZSBvYmplY3QgYW5kIGEgbmV3bHkgZ2VuZXJhdGVkCi0gICAgICogbmFtZS4gVGhlIG5ldyBUaHJlYWQgd2lsbCBiZWxvbmcgdG8gdGhlIHNhbWUgVGhyZWFkR3JvdXAgYXMgdGhlIFRocmVhZAotICAgICAqIGNhbGxpbmcgdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBUaHJlYWR9IHdpdGggYSB7QGNvZGUgUnVubmFibGV9IG9iamVjdCBhbmQgYQorICAgICAqIG5ld2x5IGdlbmVyYXRlZCBuYW1lLiBUaGUgbmV3IHtAY29kZSBUaHJlYWR9IHdpbGwgYmVsb25nIHRvIHRoZSBzYW1lCisgICAgICoge0Bjb2RlIFRocmVhZEdyb3VwfSBhcyB0aGUge0Bjb2RlIFRocmVhZH0gY2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBydW5uYWJsZQorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgUnVubmFibGV9IHdob3NlIG1ldGhvZCA8Y29kZT5ydW48L2NvZGU+IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIGV4ZWN1dGVkIGJ5IHRoZSBuZXcge0Bjb2RlIFRocmVhZH0KICAgICAgKgotICAgICAqIEBwYXJhbSBydW5uYWJsZSBhIGphdmEubGFuZy5SdW5uYWJsZSB3aG9zZSBtZXRob2QgPGNvZGU+cnVuPC9jb2RlPiB3aWxsCi0gICAgICogICAgICAgIGJlIGV4ZWN1dGVkIGJ5IHRoZSBuZXcgVGhyZWFkCiAgICAgICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkR3JvdXAKICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaHJlYWQoUnVubmFibGUgcnVubmFibGUpIHsKICAgICAgICAgY3JlYXRlKG51bGwsIHJ1bm5hYmxlLCBudWxsLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRocmVhZCB3aXRoIGEgcnVubmFibGUgb2JqZWN0IGFuZCBuYW1lIHByb3ZpZGVkLiBUaGUgbmV3Ci0gICAgICogVGhyZWFkIHdpbGwgYmVsb25nIHRvIHRoZSBzYW1lIFRocmVhZEdyb3VwIGFzIHRoZSBUaHJlYWQgY2FsbGluZyB0aGlzCi0gICAgICogY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgYSBqYXZhLmxhbmcuUnVubmFibGUgd2hvc2UgbWV0aG9kIDxjb2RlPnJ1bjwvY29kZT4gd2lsbAotICAgICAqICAgICAgICBiZSBleGVjdXRlZCBieSB0aGUgbmV3IFRocmVhZAotICAgICAqIEBwYXJhbSB0aHJlYWROYW1lIE5hbWUgZm9yIHRoZSBUaHJlYWQgYmVpbmcgY3JlYXRlZAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRocmVhZH0gd2l0aCBhIHtAY29kZSBSdW5uYWJsZX0gb2JqZWN0IGFuZCBuYW1lCisgICAgICogcHJvdmlkZWQuIFRoZSBuZXcge0Bjb2RlIFRocmVhZH0gd2lsbCBiZWxvbmcgdG8gdGhlIHNhbWUge0Bjb2RlCisgICAgICogVGhyZWFkR3JvdXB9IGFzIHRoZSB7QGNvZGUgVGhyZWFkfSBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHJ1bm5hYmxlCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBSdW5uYWJsZX0gd2hvc2UgbWV0aG9kIDxjb2RlPnJ1bjwvY29kZT4gd2lsbCBiZQorICAgICAqICAgICAgICAgICAgZXhlY3V0ZWQgYnkgdGhlIG5ldyB7QGNvZGUgVGhyZWFkfQorICAgICAqIEBwYXJhbSB0aHJlYWROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBmb3IgdGhlIHtAY29kZSBUaHJlYWR9IGJlaW5nIGNyZWF0ZWQKKyAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWRHcm91cAogICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlCisgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlLCBTdHJpbmcgdGhyZWFkTmFtZSkgewogICAgICAgICBpZiAodGhyZWFkTmFtZSA9PSBudWxsKSB7CkBAIC0yMjYsMTMgKzI1NiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGhyZWFkIHdpdGggbm8gcnVubmFibGUgb2JqZWN0IGFuZCB0aGUgbmFtZSBwcm92aWRlZC4KLSAgICAgKiBUaGUgbmV3IFRocmVhZCB3aWxsIGJlbG9uZyB0byB0aGUgc2FtZSBUaHJlYWRHcm91cCBhcyB0aGUgVGhyZWFkIGNhbGxpbmcKLSAgICAgKiB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHRocmVhZE5hbWUgTmFtZSBmb3IgdGhlIFRocmVhZCBiZWluZyBjcmVhdGVkCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVGhyZWFkfSB3aXRoIG5vIHtAY29kZSBSdW5uYWJsZX0gb2JqZWN0IGFuZCB0aGUKKyAgICAgKiBuYW1lIHByb3ZpZGVkLiBUaGUgbmV3IHtAY29kZSBUaHJlYWR9IHdpbGwgYmVsb25nIHRvIHRoZSBzYW1lIHtAY29kZQorICAgICAqIFRocmVhZEdyb3VwfSBhcyB0aGUge0Bjb2RlIFRocmVhZH0gY2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0aHJlYWROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBmb3IgdGhlIHtAY29kZSBUaHJlYWR9IGJlaW5nIGNyZWF0ZWQKKyAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWRHcm91cAogICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlCisgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyZWFkKFN0cmluZyB0aHJlYWROYW1lKSB7CiAgICAgICAgIGlmICh0aHJlYWROYW1lID09IG51bGwpIHsKQEAgLTI0Myw0MSArMjc3LDU0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBUaHJlYWQgd2l0aCBhIHJ1bm5hYmxlIG9iamVjdCBhbmQgYSBuZXdseSBnZW5lcmF0ZWQKLSAgICAgKiBuYW1lLiBUaGUgbmV3IFRocmVhZCB3aWxsIGJlbG9uZyB0byB0aGUgVGhyZWFkR3JvdXAgcGFzc2VkIGFzIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBncm91cCBUaHJlYWRHcm91cCB0byB3aGljaCB0aGUgbmV3IFRocmVhZCB3aWxsIGJlbG9uZwotICAgICAqIEBwYXJhbSBydW5uYWJsZSBhIGphdmEubGFuZy5SdW5uYWJsZSB3aG9zZSBtZXRob2QgPGNvZGU+cnVuPC9jb2RlPiB3aWxsCi0gICAgICogICAgICAgIGJlIGV4ZWN1dGVkIGJ5IHRoZSBuZXcgVGhyZWFkCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiA8Y29kZT5ncm91cC5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscwotICAgICAqICAgICAgICAgd2l0aCBhIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z3JvdXAuZGVzdHJveSgpPC9jb2RlPiBoYXMKLSAgICAgKiAgICAgICAgIGFscmVhZHkgYmVlbiBkb25lCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVGhyZWFkfSB3aXRoIGEge0Bjb2RlIFJ1bm5hYmxlfSBvYmplY3QgYW5kIGEKKyAgICAgKiBuZXdseSBnZW5lcmF0ZWQgbmFtZS4gVGhlIG5ldyB7QGNvZGUgVGhyZWFkfSB3aWxsIGJlbG9uZyB0byB0aGUge0Bjb2RlCisgICAgICogVGhyZWFkR3JvdXB9IHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGdyb3VwCisgICAgICogICAgICAgICAgICB7QGNvZGUgVGhyZWFkR3JvdXB9IHRvIHdoaWNoIHRoZSBuZXcge0Bjb2RlIFRocmVhZH0gd2lsbAorICAgICAqICAgICAgICAgICAgYmVsb25nCisgICAgICogQHBhcmFtIHJ1bm5hYmxlCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBSdW5uYWJsZX0gd2hvc2UgbWV0aG9kIDxjb2RlPnJ1bjwvY29kZT4gd2lsbCBiZQorICAgICAqICAgICAgICAgICAgZXhlY3V0ZWQgYnkgdGhlIG5ldyB7QGNvZGUgVGhyZWFkfQorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5ncm91cC5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoIGEKKyAgICAgKiAgICAgICAgICAgICBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+Z3JvdXAuZGVzdHJveSgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUKICAgICAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWRHcm91cAogICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyZWFkKFRocmVhZEdyb3VwIGdyb3VwLCBSdW5uYWJsZSBydW5uYWJsZSkgewogICAgICAgICBjcmVhdGUoZ3JvdXAsIHJ1bm5hYmxlLCBudWxsLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRocmVhZCB3aXRoIGEgcnVubmFibGUgb2JqZWN0LCB0aGUgZ2l2ZW4gbmFtZSBhbmQKLSAgICAgKiBiZWxvbmdpbmcgdG8gdGhlIFRocmVhZEdyb3VwIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZ3JvdXAgVGhyZWFkR3JvdXAgdG8gd2hpY2ggdGhlIG5ldyBUaHJlYWQgd2lsbCBiZWxvbmcKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgYSBqYXZhLmxhbmcuUnVubmFibGUgd2hvc2UgbWV0aG9kIDxjb2RlPnJ1bjwvY29kZT4gd2lsbAotICAgICAqICAgICAgICBiZSBleGVjdXRlZCBieSB0aGUgbmV3IFRocmVhZAotICAgICAqIEBwYXJhbSB0aHJlYWROYW1lIE5hbWUgZm9yIHRoZSBUaHJlYWQgYmVpbmcgY3JlYXRlZAotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgPGNvZGU+Z3JvdXAuY2hlY2tBY2Nlc3MoKTwvY29kZT4gZmFpbHMKLSAgICAgKiAgICAgICAgIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPmdyb3VwLmRlc3Ryb3koKTwvY29kZT4gaGFzCi0gICAgICogICAgICAgICBhbHJlYWR5IGJlZW4gZG9uZQorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRocmVhZH0gd2l0aCBhIHtAY29kZSBSdW5uYWJsZX0gb2JqZWN0LCB0aGUgZ2l2ZW4KKyAgICAgKiBuYW1lIGFuZCBiZWxvbmdpbmcgdG8gdGhlIHtAY29kZSBUaHJlYWRHcm91cH0gcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ3JvdXAKKyAgICAgKiAgICAgICAgICAgIFRocmVhZEdyb3VwIHRvIHdoaWNoIHRoZSBuZXcge0Bjb2RlIFRocmVhZH0gd2lsbCBiZWxvbmcKKyAgICAgKiBAcGFyYW0gcnVubmFibGUKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIFJ1bm5hYmxlfSB3aG9zZSBtZXRob2QgPGNvZGU+cnVuPC9jb2RlPiB3aWxsIGJlCisgICAgICogICAgICAgICAgICBleGVjdXRlZCBieSB0aGUgbmV3IHtAY29kZSBUaHJlYWR9CisgICAgICogQHBhcmFtIHRocmVhZE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciB0aGUge0Bjb2RlIFRocmVhZH0gYmVpbmcgY3JlYXRlZAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5ncm91cC5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoIGEKKyAgICAgKiAgICAgICAgICAgICBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+Z3JvdXAuZGVzdHJveSgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUKICAgICAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWRHcm91cAogICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyZWFkKFRocmVhZEdyb3VwIGdyb3VwLCBSdW5uYWJsZSBydW5uYWJsZSwgU3RyaW5nIHRocmVhZE5hbWUpIHsKICAgICAgICAgaWYgKHRocmVhZE5hbWUgPT0gbnVsbCkgewpAQCAtMjg4LDE4ICszMzUsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRocmVhZCB3aXRoIG5vIHJ1bm5hYmxlIG9iamVjdCwgdGhlIGdpdmVuIG5hbWUgYW5kCi0gICAgICogYmVsb25naW5nIHRvIHRoZSBUaHJlYWRHcm91cCBwYXNzZWQgYXMgcGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGdyb3VwIFRocmVhZEdyb3VwIHRvIHdoaWNoIHRoZSBuZXcgVGhyZWFkIHdpbGwgYmVsb25nCi0gICAgICogQHBhcmFtIHRocmVhZE5hbWUgTmFtZSBmb3IgdGhlIFRocmVhZCBiZWluZyBjcmVhdGVkCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiA8Y29kZT5ncm91cC5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscwotICAgICAqICAgICAgICAgd2l0aCBhIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z3JvdXAuZGVzdHJveSgpPC9jb2RlPiBoYXMKLSAgICAgKiAgICAgICAgIGFscmVhZHkgYmVlbiBkb25lCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVGhyZWFkfSB3aXRoIG5vIHtAY29kZSBSdW5uYWJsZX0gb2JqZWN0LCB0aGUKKyAgICAgKiBnaXZlbiBuYW1lIGFuZCBiZWxvbmdpbmcgdG8gdGhlIHtAY29kZSBUaHJlYWRHcm91cH0gcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ3JvdXAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBUaHJlYWRHcm91cH0gdG8gd2hpY2ggdGhlIG5ldyB7QGNvZGUgVGhyZWFkfSB3aWxsIGJlbG9uZworICAgICAqIEBwYXJhbSB0aHJlYWROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBmb3IgdGhlIHtAY29kZSBUaHJlYWR9IGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+Z3JvdXAuY2hlY2tBY2Nlc3MoKTwvY29kZT4gZmFpbHMgd2l0aCBhCisgICAgICogICAgICAgICAgICAgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmdyb3VwLmRlc3Ryb3koKTwvY29kZT4gaGFzIGFscmVhZHkgYmVlbiBkb25lCiAgICAgICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkR3JvdXAKKyAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZQogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRocmVhZChUaHJlYWRHcm91cCBncm91cCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKICAgICAgICAgaWYgKHRocmVhZE5hbWUgPT0gbnVsbCkgewpAQCAtMzEwLDIyICszNjMsMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRocmVhZCB3aXRoIGEgcnVubmFibGUgb2JqZWN0LCB0aGUgZ2l2ZW4gbmFtZSBhbmQKLSAgICAgKiBiZWxvbmdpbmcgdG8gdGhlIFRocmVhZEdyb3VwIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZ3JvdXAgVGhyZWFkR3JvdXAgdG8gd2hpY2ggdGhlIG5ldyBUaHJlYWQgd2lsbCBiZWxvbmcKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgYSBqYXZhLmxhbmcuUnVubmFibGUgd2hvc2UgbWV0aG9kIDxjb2RlPnJ1bjwvY29kZT4gd2lsbAotICAgICAqICAgICAgICBiZSBleGVjdXRlZCBieSB0aGUgbmV3IFRocmVhZAotICAgICAqIEBwYXJhbSB0aHJlYWROYW1lIE5hbWUgZm9yIHRoZSBUaHJlYWQgYmVpbmcgY3JlYXRlZAotICAgICAqIEBwYXJhbSBzdGFja1NpemUgUGxhdGZvcm0gZGVwZW5kZW50IHN0YWNrIHNpemUKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPmdyb3VwLmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzCi0gICAgICogICAgICAgICB3aXRoIGEgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5ncm91cC5kZXN0cm95KCk8L2NvZGU+IGhhcwotICAgICAqICAgICAgICAgYWxyZWFkeSBiZWVuIGRvbmUKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBUaHJlYWR9IHdpdGggYSB7QGNvZGUgUnVubmFibGV9IG9iamVjdCwgdGhlIGdpdmVuCisgICAgICogbmFtZSBhbmQgYmVsb25naW5nIHRvIHRoZSB7QGNvZGUgVGhyZWFkR3JvdXB9IHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGdyb3VwCisgICAgICogICAgICAgICAgICB7QGNvZGUgVGhyZWFkR3JvdXB9IHRvIHdoaWNoIHRoZSBuZXcge0Bjb2RlIFRocmVhZH0gd2lsbAorICAgICAqICAgICAgICAgICAgYmVsb25nCisgICAgICogQHBhcmFtIHJ1bm5hYmxlCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBSdW5uYWJsZX0gd2hvc2UgbWV0aG9kIDxjb2RlPnJ1bjwvY29kZT4gd2lsbCBiZQorICAgICAqICAgICAgICAgICAgZXhlY3V0ZWQgYnkgdGhlIG5ldyB7QGNvZGUgVGhyZWFkfQorICAgICAqIEBwYXJhbSB0aHJlYWROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBmb3IgdGhlIHtAY29kZSBUaHJlYWR9IGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gc3RhY2tTaXplCisgICAgICogICAgICAgICAgICBhIHN0YWNrIHNpemUgZm9yIHRoZSBuZXcge0Bjb2RlIFRocmVhZH0uIFRoaXMgaGFzIGEgaGlnaGx5CisgICAgICogICAgICAgICAgICBwbGF0Zm9ybS1kZXBlbmRlbnQgaW50ZXJwcmV0YXRpb24uIEl0IG1heSBldmVuIGJlIGlnbm9yZWQKKyAgICAgKiAgICAgICAgICAgIGNvbXBsZXRlbHkuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmdyb3VwLmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYQorICAgICAqICAgICAgICAgICAgIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5ncm91cC5kZXN0cm95KCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gZG9uZQogICAgICAqIEBzZWUgamF2YS5sYW5nLlRocmVhZEdyb3VwCiAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUKICAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlcgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaHJlYWQoVGhyZWFkR3JvdXAgZ3JvdXAsIFJ1bm5hYmxlIHJ1bm5hYmxlLCBTdHJpbmcgdGhyZWFkTmFtZSwgbG9uZyBzdGFja1NpemUpIHsKICAgICAgICAgaWYgKHRocmVhZE5hbWUgPT0gbnVsbCkgewpAQCAtNDE4LDcgKzQ4MSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIFRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKICAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKICAgICAgICAgICAgIGdyb3VwID0gY3VycmVudFRocmVhZC5nZXRUaHJlYWRHcm91cCgpOwpAQCAtNDUxLDcgKzUxMyw2IEBACiAgICAgICAgICAgICBpbmhlcml0YWJsZVZhbHVlcwogICAgICAgICAgICAgICAgICAgICA9IG5ldyBUaHJlYWRMb2NhbC5WYWx1ZXMoY3VycmVudFRocmVhZC5pbmhlcml0YWJsZVZhbHVlcyk7CiAgICAgICAgIH0KLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgICAgICAvLyBzdG9yZSBjdXJyZW50IEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFzIGluaGVyaXRlZCBjb250ZXh0IGZvciB0aGlzIHRocmVhZAogICAgICAgICBTZWN1cml0eVV0aWxzLnB1dENvbnRleHQodGhpcywgQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCkpOwpAQCAtNDYxLDI0ICs1MjIsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWN0aXZlIHRocmVhZHMgaW4gdGhlIHJ1bm5pbmcgdGhyZWFkJ3MgVGhyZWFkR3JvdXAKLSAgICAgKiBhbmQgaXRzIHN1Ymdyb3Vwcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIFRocmVhZHMKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWN0aXZlIHtAY29kZSBUaHJlYWR9cyBpbiB0aGUgcnVubmluZyB7QGNvZGUKKyAgICAgKiBUaHJlYWR9J3MgZ3JvdXAgYW5kIGl0cyBzdWJncm91cHMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHtAY29kZSBUaHJlYWR9cworICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGFjdGl2ZUNvdW50KCkgewogICAgICAgICByZXR1cm4gY3VycmVudFRocmVhZCgpLmdldFRocmVhZEdyb3VwKCkuYWN0aXZlQ291bnQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBhcHByb3ZhbCBmcm9tIGEKLSAgICAgKiBTZWN1cml0eU1hbmFnZXIuIElmIHRoZXJlJ3Mgbm9uZSBpbnN0YWxsZWQsIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AuIElmCi0gICAgICogdGhlcmUncyBhIFNlY3VyaXR5TWFuYWdlciBpbnN0YWxsZWQgLAotICAgICAqIHtAbGluayBTZWN1cml0eU1hbmFnZXIjY2hlY2tBY2Nlc3MoVGhyZWFkKX0gaXMgY2FsbGVkIGZvciB0aGF0Ci0gICAgICogU2VjdXJpdHlNYW5hZ2VyLgotICAgICAqCisgICAgICogSXMgdXNlZCBmb3Igb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgYXBwcm92YWwgZnJvbSBhIFNlY3VyaXR5TWFuYWdlci4gSWYKKyAgICAgKiB0aGVyZSdzIG5vbmUgaW5zdGFsbGVkLCB0aGlzIG1ldGhvZCBpcyBhIG5vLW9wLiBJZiB0aGVyZSdzIGEKKyAgICAgKiBTZWN1cml0eU1hbmFnZXIgaW5zdGFsbGVkLCB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXNzKFRocmVhZCl9IGlzCisgICAgICogY2FsbGVkIGZvciB0aGF0IFNlY3VyaXR5TWFuYWdlci4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBTZWN1cml0eU1hbmFnZXIgaXMgaW5zdGFsbGVkIGFuZCBpdCBkb2VzIG5vdCBhbGxvdworICAgICAqICAgICAgICAgICAgIGFjY2VzcyB0byB0aGUgVGhyZWFkLgorICAgICAqIAogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2hlY2tBY2Nlc3MoKSB7CiAgICAgICAgIC8vIEZvcndhcmRzIHRoZSBtZXNzYWdlIHRvIHRoZSBTZWN1cml0eU1hbmFnZXIgKGlmIHRoZXJlJ3Mgb25lKSBwYXNzaW5nCkBAIC00OTIsMTEgKzU2MCwxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyBpbiB0aGlzIHRocmVhZC4KLSAgICAgKgorICAgICAqIAogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIHN0YWNrIGZyYW1lcwogICAgICAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRzIG9mIHRoaXMgY2FsbCB3ZXJlIG5ldmVyIHdlbGwgZGVmaW5lZC4gVG8gbWFrZQotICAgICAqICAgICAgICAgICAgIHRoaW5ncyB3b3JzZSwgaXQgd291bGQgZGVwZW5kIGlmIHRoZSBUaHJlYWQgd2FzIHN1c3BlbmRlZCBvcgotICAgICAqICAgICAgICAgICAgIG5vdCwgYW5kIHN1c3BlbmQgd2FzIGRlcHJlY2F0ZWQgdG9vLgorICAgICAqICAgICAgICAgICAgIHRoaW5ncyB3b3JzZSwgaXQgd291bGQgZGVwZW5kIG9uIHdoZXRoZXIgdGhlIFRocmVhZCB3YXMKKyAgICAgKiAgICAgICAgICAgICBzdXNwZW5kZWQgb3Igbm90LCBhbmQgc3VzcGVuZCB3YXMgZGVwcmVjYXRlZCB0b28uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGNvdW50U3RhY2tGcmFtZXMoKSB7CkBAIC01MDQsMTEgKzU3NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIFRocmVhZCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBydW5uaW5nIFRocmVhZAotICAgICAqIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIFJldHVybnMgdGhlIFRocmVhZCBvZiB0aGUgY2FsbGVyLCB0aGF0IGlzLCB0aGUgY3VycmVudCBUaHJlYWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGEgamF2YS5sYW5nLlRocmVhZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2RlIHRoYXQgY2FsbGVkCi0gICAgICogICAgICAgICA8Y29kZT5jdXJyZW50VGhyZWFkKCk8L2NvZGU+CisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBUaHJlYWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUaHJlYWQgY3VycmVudFRocmVhZCgpIHsKICAgICAgICAgcmV0dXJuIFZNVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKQEAgLTUxOCw2ICs1ODgsOCBAQAogICAgICAqIERlc3Ryb3lzIHRoZSByZWNlaXZlciB3aXRob3V0IGFueSBtb25pdG9yIGNsZWFudXAuCiAgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCBOb3QgaW1wbGVtZW50ZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewpAQCAtNTI1LDggKzU5NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YWNrIGZvciB0aGlzIFRocmVhZC4KLSAgICAgKgorICAgICAqIFByaW50cyB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIGZvciB0aGlzIFRocmVhZC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoKQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wU3RhY2soKSB7CiAgICAgICAgIG5ldyBUaHJvd2FibGUoInN0YWNrIGR1bXAiKS5wcmludFN0YWNrVHJhY2UoKTsKQEAgLTUzNCwxNiArNjEwLDIwIEBACiAKICAgICAvKioKICAgICAgKiBDb3BpZXMgYW4gYXJyYXkgd2l0aCBhbGwgVGhyZWFkcyB3aGljaCBhcmUgaW4gdGhlIHNhbWUgVGhyZWFkR3JvdXAgYXMgdGhlCi0gICAgICogcmVjZWl2ZXIgLSBhbmQgc3ViZ3JvdXBzIC0gaW50byB0aGUgYXJyYXkgPGNvZGU+dGhyZWFkczwvY29kZT4gcGFzc2VkCi0gICAgICogYXMgcGFyYW1ldGVyLiBJZiB0aGUgYXJyYXkgcGFzc2VkIGFzIHBhcmFtZXRlciBpcyB0b28gc21hbGwgbm8gZXhjZXB0aW9uCi0gICAgICogaXMgdGhyb3duIC0gdGhlIGV4dHJhIGVsZW1lbnRzIGFyZSBzaW1wbHkgbm90IGNvcGllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aHJlYWRzIGFycmF5IGludG8gd2hpY2ggdGhlIFRocmVhZHMgd2lsbCBiZSBjb3BpZWQKKyAgICAgKiByZWNlaXZlciAtIGFuZCBzdWJncm91cHMgLSBpbnRvIHRoZSBhcnJheSA8Y29kZT50aHJlYWRzPC9jb2RlPiBwYXNzZWQgYXMKKyAgICAgKiBwYXJhbWV0ZXIuIElmIHRoZSBhcnJheSBwYXNzZWQgYXMgcGFyYW1ldGVyIGlzIHRvbyBzbWFsbCBubyBleGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24gLSB0aGUgZXh0cmEgZWxlbWVudHMgYXJlIHNpbXBseSBub3QgY29waWVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0aHJlYWRzCisgICAgICogICAgICAgICAgICBhcnJheSBpbnRvIHdoaWNoIHRoZSBUaHJlYWRzIHdpbGwgYmUgY29waWVkCiAgICAgICogQHJldHVybiBIb3cgbWFueSBUaHJlYWRzIHdlcmUgY29waWVkIG92ZXIKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsZWQgU2VjdXJpdHlNYW5hZ2VyIGZhaWxzCi0gICAgICogICAgICAgICB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXNzKFRocmVhZCl9CisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnN0YWxsZWQgU2VjdXJpdHlNYW5hZ2VyIGZhaWxzCisgICAgICogICAgICAgICAgICAge0BsaW5rIFNlY3VyaXR5TWFuYWdlciNjaGVja0FjY2VzcyhUaHJlYWQpfQogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZW51bWVyYXRlKFRocmVhZFtdIHRocmVhZHMpIHsKICAgICAgICAgVGhyZWFkIHRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CkBAIC01NTMsMTUgKzYzMywxNyBAQAogCiAgICAgLyoqCiAgICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgc3RhY2sgdHJhY2VzIG9mIGFsbCB0aGUgY3VycmVudGx5IGxpdmUgdGhyZWFkcyBhbmQgcHV0cyB0aGVtIGludG8KLSAgICAgKiB0aGUgZ2l2ZW4gbWFwLgorICAgICAqIFJldHVybnMgdGhlIHN0YWNrIHRyYWNlcyBvZiBhbGwgdGhlIGN1cnJlbnRseSBsaXZlIHRocmVhZHMgYW5kIHB1dHMgdGhlbQorICAgICAqIGludG8gdGhlIGdpdmVuIG1hcC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIEEgTWFwIG9mIGN1cnJlbnQgVGhyZWFkcyB0byBTdGFja1RyYWNlRWxlbWVudCBhcnJheXMuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBTZWN1cml0eU1hbmFnZXIgZmFpbHMgdGhlCi0gICAgICogICAgICAgICB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGVybWlzc2lvbihqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pfQotICAgICAqICAgICAgICAgY2FsbC4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBmYWlscyB0aGUKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGVybWlzc2lvbihqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pfQorICAgICAqICAgICAgICAgICAgIGNhbGwuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBNYXA8VGhyZWFkLCBTdGFja1RyYWNlRWxlbWVudFtdPiBnZXRBbGxTdGFja1RyYWNlcygpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTU4Nyw0NSArNjY5LDQwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGV4dCBDbGFzc0xvYWRlciBmb3IgdGhlIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIgZm9yIHRoaXMgVGhyZWFkLgogICAgICAqIDxwPgogICAgICAqIElmIHRoZSBjb25kaXRpb25zCiAgICAgICogPG9sPgotICAgICAqICAgPGxpPiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIKLSAgICAgKiAgIDxsaT4gdGhlIGNhbGxlcidzIGNsYXNzIGxvYWRlciBpcyBub3QgbnVsbAotICAgICAqICAgPGxpPiB0aGUgY2FsbGVyJ3MgY2xhc3MgbG9hZGVyIGlzIG5vdCB0aGUgc2FtZSBhcyBvciBhbgotICAgICAqICAgICAgICBhbmNlc3RvciBvZiBjb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgKiA8bGk+dGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICogPGxpPnRoZSBjYWxsZXIncyBjbGFzcyBsb2FkZXIgaXMgbm90IG51bGwKKyAgICAgKiA8bGk+dGhlIGNhbGxlcidzIGNsYXNzIGxvYWRlciBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZAorICAgICAqIGNvbnRleHQgY2xhc3MgbG9hZGVyIGFuZCBub3QgYW4gYW5jZXN0b3IgdGhlcmVvZgogICAgICAqIDwvb2w+CiAgICAgICogYXJlIHNhdGlzZmllZCwgYSBzZWN1cml0eSBjaGVjayBmb3IKICAgICAgKiA8Y29kZT5SdW50aW1lUGVybWlzc2lvbigiZ2V0Q2xhc3NMb2FkZXIiKTwvY29kZT4gaXMgcGVyZm9ybWVkIGZpcnN0LgotICAgICAqCisgICAgICogCiAgICAgICogQHJldHVybiBDbGFzc0xvYWRlciBUaGUgY29udGV4dCBDbGFzc0xvYWRlcgogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsYXNzTG9hZGVyCiAgICAgICogQHNlZSAjZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkKLSAgICAgKgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgYWZvcmVtZW50aW9uZWQgc2VjdXJpdHkgY2hlY2sgZmFpbHMuCisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhZm9yZW1lbnRpb25lZCBzZWN1cml0eSBjaGVjayBmYWlscy4KKyAgICAgKiAgICAgICAgICAgICAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewogICAgICAgICAvLyBGaXJzdCwgaWYgdGhlIGNvbmRpdGlvbnMKICAgICAgICAgLy8gICAgMSkgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyCiAgICAgICAgIC8vICAgIDIpIHRoZSBjYWxsZXIncyBjbGFzcyBsb2FkZXIgaXMgbm90IG51bGwKLSAgICAgICAgLy8gICAgMykgdGhlIGNhbGxlcidzIGNsYXNzIGxvYWRlciBpcyBub3QgdGhlIHNhbWUgYXMgb3IgYW4KLSAgICAgICAgLy8gICAgYW5jZXN0b3Igb2YgY29udGV4dENsYXNzTG9hZGVyCisgICAgICAgIC8vICAgIDMpIHRoZSBjYWxsZXIncyBjbGFzcyBsb2FkZXIgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjb250ZXh0CisgICAgICAgIC8vICAgIGNsYXNzIGxvYWRlciBhbmQgbm90IGFuIGFuY2VzdG9yIHRoZXJlb2YKICAgICAgICAgLy8gYXJlIHNhdGlzZmllZCB3ZSBzaG91bGQgcGVyZm9ybSBhIHNlY3VyaXR5IGNoZWNrLgotICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNhbGxlckNsYXNzTG9hZGVyID0KLSAgICAgICAgICAgICAgICAgICAgVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIGlmIChjYWxsZXJDbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBjb250ZXh0Q2xhc3NMb2FkZXI7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyID09IGNhbGxlckNsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dENsYXNzTG9hZGVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlY3VyaXR5TWFuYWdlci5jaGVja1Blcm1pc3Npb24obmV3IFJ1bnRpbWVQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgImdldENsYXNzTG9hZGVyIikpOworICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzbSAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBjYWxsaW5nID0gVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKTsKKworICAgICAgICAgICAgaWYgKGNhbGxpbmcgIT0gbnVsbCAmJiAhY2FsbGluZy5pc0FuY2VzdG9yT2YoY29udGV4dENsYXNzTG9hZGVyKSkgeworICAgICAgICAgICAgICAgIHNtLmNoZWNrUGVybWlzc2lvbihuZXcgUnVudGltZVBlcm1pc3Npb24oImdldENsYXNzTG9hZGVyIikpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTYzMyw2NyArNzEwLDcwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBleGNlcHRpb24gaGFuZGxlciB0aGF0J3MgZXhlY3V0ZWQgd2hlbiB1bmNhdWdodAogICAgICAqIGV4Y2VwdGlvbiB0ZXJtaW5hdGVzIGEgdGhyZWFkLgotICAgICAqIDwvcD4KICAgICAgKgotICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcn0gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiBAcmV0dXJuIGFuIHtAbGluayBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXJ9IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAgICAgICogICAgICAgICBub25lIGV4aXN0cy4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgZ2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpIHsKICAgICAgICAgcmV0dXJuIGRlZmF1bHRVbmNhdWdodEhhbmRsZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogUmV0dXJucyB0aGUgdGhyZWFkJ3MgaWRlbnRpZmllci4gVGhlIElEIGlzIGEgcG9zaXRpdmUgPGNvZGU+bG9uZzwvY29kZT4KLSAgICAgKiBnZW5lcmF0ZWQgb24gdGhyZWFkIGNyZWF0aW9uLCBpcyB1bmlxdWUgdG8gdGhlIHRocmVhZCBhbmQgZG9lc24ndCBjaGFuZ2UKLSAgICAgKiBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlIHRocmVhZDsgdGhlIElEIG1heSBiZSByZXVzZWQgYWZ0ZXIgdGhlIHRocmVhZCBoYXMKLSAgICAgKiBiZWVuIHRlcm1pbmF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdGhyZWFkJ3MgSUQuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIGdlbmVyYXRlZCBvbiB0aHJlYWQgY3JlYXRpb24sIGlzIHVuaXF1ZSB0byB0aGUgdGhyZWFkLCBhbmQgZG9lc24ndCBjaGFuZ2UKKyAgICAgKiBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSB0aHJlYWQ7IHRoZSBJRCBtYXkgYmUgcmV1c2VkIGFmdGVyIHRoZSB0aHJlYWQKKyAgICAgKiBoYXMgYmVlbiB0ZXJtaW5hdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHRocmVhZCdzIElELgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldElkKCkgewogICAgICAgICByZXR1cm4gaWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgVGhyZWFkLgogICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBuYW1lIChhIGphdmEubGFuZy5TdHJpbmcpCisgICAgICogQHJldHVybiB0aGUgVGhyZWFkJ3MgbmFtZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJpb3JpdHkgb2YgdGhlIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgdGhlIHByaW9yaXR5IG9mIHRoZSBUaHJlYWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHByaW9yaXR5IChhbiA8Y29kZT5pbnQ8L2NvZGU+KQorICAgICAqIEByZXR1cm4gdGhlIFRocmVhZCdzIHByaW9yaXR5CiAgICAgICogQHNlZSBUaHJlYWQjc2V0UHJpb3JpdHkKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFByaW9yaXR5KCkgewogICAgICAgICByZXR1cm4gcHJpb3JpdHk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBvZiB0aGUgdGhyZWFkLgotICAgICAqIDwvcD4KKyAgICAgKiBSZXR1cm5zIHRoZSBhIHN0YWNrIHRyYWNlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhdGUgb2YKKyAgICAgKiB0aGlzIFRocmVhZC4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgPGNvZGU+UnVudGltZVBlcm1pc3Npb24oImdldFN0YWNrVHJhY2UiKTwvY29kZT4gaXMgY2hlY2tlZCBiZWZvcmUKICAgICAgKiByZXR1cm5pbmcgYSByZXN1bHQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBTdGFja1RyYWNlRWxlbWVudHMuCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBTZWN1cml0eU1hbmFnZXIgZmFpbHMgdGhlCi0gICAgICogICAgICAgICB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGVybWlzc2lvbihqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pfQotICAgICAqICAgICAgICAgY2FsbC4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBTdGFja1RyYWNlRWxlbWVudHMuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBmYWlscyB0aGUKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGVybWlzc2lvbihqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pfQorICAgICAqICAgICAgICAgICAgIGNhbGwuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0YWNrVHJhY2VFbGVtZW50W10gZ2V0U3RhY2tUcmFjZSgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTcwNiwxNSArNzg2LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdGhyZWFkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBTdGF0ZSB2YWx1ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgVGhyZWFkLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yCisgICAgICogbW9uaXRvcmluZyBwdXJwb3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0YXRlfSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RhdGUgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIC8vIFRPRE8gVGlja2V0IDE2NDogVGhpcyBpcyB1Z2x5IGFuZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYmV0dGVyLgorICAgICAgICAvLyBUT0RPIFRoaXMgaXMgdWdseSBhbmQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJldHRlci4KICAgICAgICAgVk1UaHJlYWQgdm10ID0gdGhpcy52bVRocmVhZDsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byBhbiBvYmplY3QuIElmIG5hdGl2ZSBjb2RlCkBAIC03MzIsMTIgKzgxMiwxNCBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBUaHJlYWRHcm91cCB0byB3aGljaCB0aGUgcmVjZWl2ZXIgYmVsb25ncwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBUaHJlYWRHcm91cAorICAgICAqIFJldHVybnMgdGhlIFRocmVhZEdyb3VwIHRvIHdoaWNoIHRoaXMgVGhyZWFkIGJlbG9uZ3MuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgVGhyZWFkJ3MgVGhyZWFkR3JvdXAKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgVGhyZWFkR3JvdXAgZ2V0VGhyZWFkR3JvdXAoKSB7Ci0gICAgICAgIC8vIFRPRE8gVGlja2V0IDE2NDogVGhpcyBzaG91bGQgYWN0dWFsbHkgYmUgZG9uZSBhdCBuYXRpdmUgdGVybWluYXRpb24uCisgICAgICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgYWN0dWFsbHkgYmUgZG9uZSBhdCBuYXRpdmUgdGVybWluYXRpb24uCiAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IFRocmVhZC5TdGF0ZS5URVJNSU5BVEVEKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTc0NiwxNCArODI4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogUmV0dXJucyB0aGUgdGhyZWFkJ3MgdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXIuIElmIG5vdCBleHBsaWNpdGx5IHNldCwKICAgICAgKiB0aGVuIHRoZSBUaHJlYWRHcm91cCdzIGhhbmRsZXIgaXMgcmV0dXJuZWQuIElmIHRoZSB0aHJlYWQgaXMgdGVybWluYXRlZCwKICAgICAgKiB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4gVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIHtAbGluayBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXJ9IGluc3RhbmNlIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIGdldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpIHsKICAgICAgICAgaWYgKHVuY2F1Z2h0SGFuZGxlciAhPSBudWxsKQpAQCAtNzYzLDE0ICs4NDQsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQb3N0cyBhbiBpbnRlcnJ1cHQgcmVxdWVzdCB0byB0aGUgcmVjZWl2ZXIuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzCi0gICAgICogICAgICAgICB3aXRoIGEgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiBQb3N0cyBhbiBpbnRlcnJ1cHQgcmVxdWVzdCB0byB0aGlzIHtAY29kZSBUaHJlYWR9LiBVbmxlc3MgdGhlIGNhbGxlciBpcworICAgICAqIHRoZSB7QGxpbmsgI2N1cnJlbnRUaHJlYWQoKX0sIHRoZSBtZXRob2Qge0Bjb2RlIGNoZWNrQWNjZXNzKCl9IGlzIGNhbGxlZAorICAgICAqIGZvciB0aGUgaW5zdGFsbGVkIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9LCBpZiBhbnkuIFRoaXMgbWF5IHJlc3VsdCBpbiBhCisgICAgICoge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufSBiZWluZyB0aHJvd24uIFRoZSBmdXJ0aGVyIGJlaGF2aW9yIGRlcGVuZHMgb24KKyAgICAgKiB0aGUgc3RhdGUgb2YgdGhpcyB7QGNvZGUgVGhyZWFkfToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIHtAY29kZSBUaHJlYWR9cyBibG9ja2VkIGluIG9uZSBvZiB7QGNvZGUgT2JqZWN0fSdzIHtAY29kZSB3YWl0KCl9IG1ldGhvZHMKKyAgICAgKiBvciBvbmUgb2Yge0Bjb2RlIFRocmVhZH0ncyB7QGNvZGUgam9pbigpfSBvciB7QGNvZGUgc2xlZXAoKX0gbWV0aG9kcyB3aWxsCisgICAgICogYmUgd29rZW4gdXAsIHRoZWlyIGludGVycnVwdCBzdGF0dXMgd2lsbCBiZSBjbGVhcmVkLCBhbmQgdGhleSByZWNlaXZlIGFuCisgICAgICoge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KKyAgICAgKiA8bGk+CisgICAgICoge0Bjb2RlIFRocmVhZH1zIGJsb2NrZWQgaW4gYW4gSS9PIG9wZXJhdGlvbiBvZiBhbgorICAgICAqIHtAbGluayBqYXZhLm5pby5jaGFubmVscy5JbnRlcnJ1cHRpYmxlQ2hhbm5lbH0gd2lsbCBoYXZlIHRoZWlyIGludGVycnVwdAorICAgICAqIHN0YXR1cyBzZXQgYW5kIHJlY2VpdmUgYW4KKyAgICAgKiB7QGxpbmsgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb259LiBBbHNvLCB0aGUgY2hhbm5lbAorICAgICAqIHdpbGwgYmUgY2xvc2VkLgorICAgICAqIDxsaT4KKyAgICAgKiB7QGNvZGUgVGhyZWFkfXMgYmxvY2tlZCBpbiBhIHtAbGluayBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rvcn0gd2lsbCBoYXZlCisgICAgICogdGhlaXIgaW50ZXJydXB0IHN0YXR1cyBzZXQgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gVGhleSBkb24ndCByZWNlaXZlIGFuCisgICAgICogZXhjZXB0aW9uIGluIHRoaXMgY2FzZS4KKyAgICAgKiA8dWw+CisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyCiAgICAgICogQHNlZSBUaHJlYWQjaW50ZXJydXB0ZWQKICAgICAgKiBAc2VlIFRocmVhZCNpc0ludGVycnVwdGVkCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW50ZXJydXB0KCkgewogICAgICAgICBjaGVja0FjY2VzcygpOwpAQCAtNzg3LDE0ICs4OTEsMTYgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgVGhyZWFkICgKLSAgICAgKiA8Y29kZT5jdXJyZW50VGhyZWFkKCk8L2NvZGU+KSBoYXMgYSBwZW5kaW5nIGludGVycnVwdCByZXF1ZXN0ICgKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPikgb3Igbm90ICg8Y29kZT5mYWxzZTwvY29kZT4pLiBJdCBhbHNvIGhhcyB0aGUKLSAgICAgKiBzaWRlLWVmZmVjdCBvZiBjbGVhcmluZyB0aGUgZmxhZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPgorICAgICAqIDxjb2RlPmN1cnJlbnRUaHJlYWQoKTwvY29kZT4pIGhhcyBhIHBlbmRpbmcgaW50ZXJydXB0IHJlcXVlc3QgKDxjb2RlPgorICAgICAqIHRydWU8L2NvZGU+KSBvciBub3QgKDxjb2RlPmZhbHNlPC9jb2RlPikuIEl0IGFsc28gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZgorICAgICAqIGNsZWFyaW5nIHRoZSBmbGFnLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHRoZSBpbnRlcnJ1cHQgc3RhdHVzCiAgICAgICogQHNlZSBUaHJlYWQjY3VycmVudFRocmVhZAogICAgICAqIEBzZWUgVGhyZWFkI2ludGVycnVwdAogICAgICAqIEBzZWUgVGhyZWFkI2lzSW50ZXJydXB0ZWQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW50ZXJydXB0ZWQoKSB7CiAgICAgICAgIHJldHVybiBWTVRocmVhZC5pbnRlcnJ1cHRlZCgpOwpAQCAtODA1LDkgKzkxMSwxMSBAQAogICAgICAqIHN0aWxsIHJ1bnMgY29kZSAoaGFzbid0IGRpZWQgeWV0KS4gUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gZWl0aGVyIGlmCiAgICAgICogdGhlIHJlY2VpdmVyIGhhc24ndCBiZWVuIHN0YXJ0ZWQgeWV0IG9yIGlmIGl0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgYW5kIHJ1bgogICAgICAqIHRvIGNvbXBsZXRpb24gYW5kIGRpZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB0aGUgbGlmZW5lc3Mgb2YgdGhlIFRocmVhZAogICAgICAqIEBzZWUgVGhyZWFkI3N0YXJ0CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGl2ZSgpIHsKICAgICAgICAgVGhyZWFkLlN0YXRlIHN0YXRlID0gZ2V0U3RhdGUoKTsKQEAgLTgyMiw4ICs5MzAsMTAgQEAKICAgICAgKiBXaGVuIHRoZSBsYXN0IG5vbi1kYWVtb24gVGhyZWFkIGVuZHMsIHRoZSB3aG9sZSBwcm9ncmFtIGVuZHMgbm8gbWF0dGVyIGlmCiAgICAgICogaXQgaGFkIGRhZW1vbiBUaHJlYWRzIHN0aWxsIHJ1bm5pbmcgb3Igbm90LgogICAgICAqCi0gICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+CisgICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciB0aGUgVGhyZWFkIGlzIGEgZGFlbW9uCiAgICAgICogQHNlZSBUaHJlYWQjc2V0RGFlbW9uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEYWVtb24oKSB7CiAgICAgICAgIHJldHVybiBkYWVtb247CkBAIC04MzQsOSArOTQ0LDExIEBACiAgICAgICogcGVuZGluZyBpbnRlcnJ1cHQgcmVxdWVzdCAoPGNvZGU+dHJ1ZTwvY29kZT4pIG9yIG5vdCAoCiAgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+KQogICAgICAqCi0gICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+CisgICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgdGhlIGludGVycnVwdCBzdGF0dXMKICAgICAgKiBAc2VlIFRocmVhZCNpbnRlcnJ1cHQKICAgICAgKiBAc2VlIFRocmVhZCNpbnRlcnJ1cHRlZAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJydXB0ZWQoKSB7CiAgICAgICAgIFZNVGhyZWFkIHZtdCA9IHRoaXMudm1UaHJlYWQ7CkBAIC04NTUsNiArOTY3LDggQEAKICAgICAgKiAgICAgICAgIHRoZSByZWNlaXZlciB3aGlsZSBpdCB3YXMgaW4gdGhlIDxjb2RlPmpvaW4oKTwvY29kZT4gY2FsbAogICAgICAqIEBzZWUgT2JqZWN0I25vdGlmeUFsbAogICAgICAqIEBzZWUgamF2YS5sYW5nLlRocmVhZERlYXRoCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgam9pbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGpvaW4oMCwgMCk7CkBAIC04NzAsNiArOTg0LDggQEAKICAgICAgKiAgICAgICAgIHRoZSByZWNlaXZlciB3aGlsZSBpdCB3YXMgaW4gdGhlIDxjb2RlPmpvaW4oKTwvY29kZT4gY2FsbAogICAgICAqIEBzZWUgT2JqZWN0I25vdGlmeUFsbAogICAgICAqIEBzZWUgamF2YS5sYW5nLlRocmVhZERlYXRoCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgam9pbihsb25nIG1pbGxpcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgam9pbihtaWxsaXMsIDApOwpAQCAtODg2LDYgKzEwMDIsOCBAQAogICAgICAqICAgICAgICAgdGhlIHJlY2VpdmVyIHdoaWxlIGl0IHdhcyBpbiB0aGUgPGNvZGU+am9pbigpPC9jb2RlPiBjYWxsCiAgICAgICogQHNlZSBPYmplY3Qjbm90aWZ5QWxsCiAgICAgICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkRGVhdGgKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBqb2luKGxvbmcgbWlsbGlzLCBpbnQgbmFub3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtaWxsaXMgPCAwIHx8IG5hbm9zIDwgMCB8fCBuYW5vcyA+IDk5OTk5OSkgewpAQCAtOTA1LDE0ICsxMDIzLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBpcyBhIG5vLW9wIGlmIHRoZSByZWNlaXZlciB3YXMgbmV2ZXIgc3VzcGVuZGVkLCBvciBzdXNwZW5kZWQgYW5kCi0gICAgICogYWxyZWFkeSByZXN1bWVkLiBJZiB0aGUgcmVjZWl2ZXIgaXMgc3VzcGVuZGVkLCBob3dldmVyLCBtYWtlcyBpdCByZXN1bWUKLSAgICAgKiB0byB0aGUgcG9pbnQgd2hlcmUgaXQgd2FzIHdoZW4gaXQgd2FzIHN1c3BlbmRlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgPGNvZGU+Y2hlY2tBY2Nlc3MoKTwvY29kZT4gZmFpbHMgd2l0aCBhCi0gICAgICogICAgICAgICBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqIFJlc3VtZXMgYSBzdXNwZW5kZWQgVGhyZWFkLiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIHJlY2VpdmVyIHdhcyBuZXZlcgorICAgICAqIHN1c3BlbmRlZCwgb3Igc3VzcGVuZGVkIGFuZCBhbHJlYWR5IHJlc3VtZWQuIElmIHRoZSByZWNlaXZlciBpcworICAgICAqIHN1c3BlbmRlZCwgaG93ZXZlciwgbWFrZXMgaXQgcmVzdW1lIHRvIHRoZSBwb2ludCB3aGVyZSBpdCB3YXMgd2hlbiBpdCB3YXMKKyAgICAgKiBzdXNwZW5kZWQuCisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIEBzZWUgVGhyZWFkI3N1c3BlbmQoKQogICAgICAqIEBkZXByZWNhdGVkIFVzZWQgd2l0aCBkZXByZWNhdGVkIG1ldGhvZCB7QGxpbmsgVGhyZWFkI3N1c3BlbmR9CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgdm9pZCByZXN1bWUoKSB7CkBAIC05MjksNiArMTA1MCw4IEBACiAgICAgICogaG9sZHMuIElmIG5vIFJ1bm5hYmxlIGlzIHNldCwgZG9lcyBub3RoaW5nLgogICAgICAqCiAgICAgICogQHNlZSBUaHJlYWQjc3RhcnQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewpAQCAtOTQ4LDYgKzEwNzEsOCBAQAogICAgICAqICAgICAgICAgY2hlY2tQZXJtaXNzaW9uIGNhbGwuCiAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKICAgICAgKiBAc2VlICNnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtOTYxLDEyICsxMDg2LDE0IEBACiAgICAgLyoqCiAgICAgICogU2V0IGlmIHRoZSByZWNlaXZlciBpcyBhIGRhZW1vbiBUaHJlYWQgb3Igbm90LiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUKICAgICAgKiBiZWZvcmUgdGhlIFRocmVhZCBzdGFydHMgcnVubmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpc0RhZW1vbiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgVGhyZWFkIHNob3VsZCBiZSBkYWVtb24gb3IKLSAgICAgKiAgICAgICAgbm90Ci0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiA8Y29kZT5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoIGEKLSAgICAgKiAgICAgICAgIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogCisgICAgICogQHBhcmFtIGlzRGFlbW9uCisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgVGhyZWFkIHNob3VsZCBiZSBkYWVtb24gb3Igbm90CisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIEBzZWUgVGhyZWFkI2lzRGFlbW9uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGFlbW9uKGJvb2xlYW4gaXNEYWVtb24pIHsKICAgICAgICAgY2hlY2tBY2Nlc3MoKTsKQEAgLTk4MiwxNyArMTEwOSwyMSBAQAogCiAgICAgLyoqCiAgICAgICogPHA+Ci0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlci4KKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyLiBUaGlzIGhhbmRsZXIgaXMgaW52b2tlZCBpbgorICAgICAqIGNhc2UgYW55IFRocmVhZCBkaWVzIGR1ZSB0byBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgPGNvZGU+UnVudGltZVBlcm1pc3Npb24oInNldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIiKTwvY29kZT4KICAgICAgKiBpcyBjaGVja2VkIHByaW9yIHRvIHNldHRpbmcgdGhlIGhhbmRsZXIuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgU2VjdXJpdHlNYW5hZ2VyIGZhaWxzIHRoZQotICAgICAqICAgICAgICAgY2hlY2tQZXJtaXNzaW9uIGNhbGwuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIAorICAgICAqIEBwYXJhbSBoYW5kbGVyCisgICAgICogICAgICAgICAgICBUaGUgaGFuZGxlciB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBmYWlscyB0aGUgY2hlY2tQZXJtaXNzaW9uCisgICAgICogICAgICAgICAgICAgY2FsbC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgaGFuZGxlcikgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMTAyMCwxMiArMTE1MSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHJlY2VpdmVyLgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIFRocmVhZC4KICAgICAgKgotICAgICAqIEBwYXJhbSB0aHJlYWROYW1lIG5ldyBuYW1lIGZvciB0aGUgVGhyZWFkCisgICAgICogQHBhcmFtIHRocmVhZE5hbWUgdGhlIG5ldyBuYW1lIGZvciB0aGUgVGhyZWFkCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiA8Y29kZT5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoIGEKICAgICAgKiAgICAgICAgIFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogQHNlZSBUaHJlYWQjZ2V0TmFtZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE5hbWUoU3RyaW5nIHRocmVhZE5hbWUpIHsKICAgICAgICAgaWYgKHRocmVhZE5hbWUgPT0gbnVsbCkgewpAQCAtMTA0MywxNyArMTE3NiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByaW9yaXR5IG9mIHRoZSByZWNlaXZlci4gTm90ZSB0aGF0IHRoZSBmaW5hbCBwcmlvcml0eSBzZXQgbWF5Ci0gICAgICogbm90IGJlIHRoZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIC0gaXQgd2lsbCBkZXBlbmQgb24gdGhlIHJlY2VpdmVyJ3MKKyAgICAgKiBTZXRzIHRoZSBwcmlvcml0eSBvZiB0aGUgVGhyZWFkLiBOb3RlIHRoYXQgdGhlIGZpbmFsIHByaW9yaXR5IHNldCBtYXkgbm90CisgICAgICogYmUgdGhlIHBhcmFtZXRlciB0aGF0IHdhcyBwYXNzZWQgLSBpdCB3aWxsIGRlcGVuZCBvbiB0aGUgcmVjZWl2ZXIncwogICAgICAqIFRocmVhZEdyb3VwLiBUaGUgcHJpb3JpdHkgY2Fubm90IGJlIHNldCB0byBiZSBoaWdoZXIgdGhhbiB0aGUgcmVjZWl2ZXIncwogICAgICAqIFRocmVhZEdyb3VwJ3MgbWF4UHJpb3JpdHkoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmlvcml0eSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBUaHJlYWQKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYQotICAgICAqICAgICAgICAgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgVGhyZWFkLk1BWF9QUklPUklUWSBvciBsZXNzIHRoYW4gVGhyZWFkLk1JTl9QUklPUklUWQorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmlvcml0eQorICAgICAqICAgICAgICAgICAgbmV3IHByaW9yaXR5IGZvciB0aGUgVGhyZWFkCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gVGhyZWFkLk1BWF9QUklPUklUWSBvcgorICAgICAqICAgICAgICAgICAgIGxlc3MgdGhhbiBUaHJlYWQuTUlOX1BSSU9SSVRZCiAgICAgICogQHNlZSBUaHJlYWQjZ2V0UHJpb3JpdHkKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKICAgICAgICAgY2hlY2tBY2Nlc3MoKTsKQEAgLTEwNzYsMTMgKzEyMTMsMTYgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXIuCisgICAgICogU2V0cyB0aGUgdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBpbnZva2VkIGluIGNhc2UgdGhpcworICAgICAqIFRocmVhZCBkaWVzIGR1ZSB0byBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBmYWlscyB0aGUKLSAgICAgKiAgICAgICAgIGNoZWNrQWNjZXNzIGNhbGwuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIAorICAgICAqIEBwYXJhbSBoYW5kbGVyCisgICAgICogICAgICAgICAgICBUaGUgaGFuZGxlciB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJyZW50IFNlY3VyaXR5TWFuYWdlciBmYWlscyB0aGUgY2hlY2tBY2Nlc3MgY2FsbC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIGhhbmRsZXIpIHsKICAgICAgICAgY2hlY2tBY2Nlc3MoKTsKQEAgLTEwOTEsMzIgKzEyMzEsNDEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYXVzZXMgdGhlIHRocmVhZCB3aGljaCBzZW50IHRoaXMgbWVzc2FnZSB0byBzbGVlcCBhbiBpbnRlcnZhbCBvZiB0aW1lCi0gICAgICogKGdpdmVuIGluIG1pbGxpc2Vjb25kcykuIFRoZSBwcmVjaXNpb24gaXMgbm90IGd1YXJhbnRlZWQgLSB0aGUgVGhyZWFkIG1heQotICAgICAqIHNsZWVwIG1vcmUgb3IgbGVzcyB0aGFuIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIHRvIHNsZWVwIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIDxjb2RlPmludGVycnVwdCgpPC9jb2RlPiB3YXMgY2FsbGVkIGZvcgotICAgICAqICAgICAgICAgdGhpcyBUaHJlYWQgd2hpbGUgaXQgd2FzIHNsZWVwaW5nCisgICAgICogQ2F1c2VzIHRoZSB0aHJlYWQgd2hpY2ggc2VudCB0aGlzIG1lc3NhZ2UgdG8gc2xlZXAgZm9yIHRoZSBnaXZlbiBpbnRlcnZhbAorICAgICAqIG9mIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcykuIFRoZSBwcmVjaXNpb24gaXMgbm90IGd1YXJhbnRlZWQgLSB0aGUKKyAgICAgKiBUaHJlYWQgbWF5IHNsZWVwIG1vcmUgb3IgbGVzcyB0aGFuIHJlcXVlc3RlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGltZQorICAgICAqICAgICAgICAgICAgVGhlIHRpbWUgdG8gc2xlZXAgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5pbnRlcnJ1cHQoKTwvY29kZT4gd2FzIGNhbGxlZCBmb3IgdGhpcyBUaHJlYWQgd2hpbGUKKyAgICAgKiAgICAgICAgICAgICBpdCB3YXMgc2xlZXBpbmcKICAgICAgKiBAc2VlIFRocmVhZCNpbnRlcnJ1cHQoKQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcChsb25nIHRpbWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIFRocmVhZC5zbGVlcCh0aW1lLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYXVzZXMgdGhlIHRocmVhZCB3aGljaCBzZW50IHRoaXMgbWVzc2FnZSB0byBzbGVlcCBhbiBpbnRlcnZhbCBvZiB0aW1lCi0gICAgICogKGdpdmVuIGluIG1pbGxpc2Vjb25kcykuIFRoZSBwcmVjaXNpb24gaXMgbm90IGd1YXJhbnRlZWQgLSB0aGUgVGhyZWFkIG1heQotICAgICAqIHNsZWVwIG1vcmUgb3IgbGVzcyB0aGFuIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIHRvIHNsZWVwIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAcGFyYW0gbmFub3MgRXh0cmEgbmFub3NlY29uZCBwcmVjaXNpb24KLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIDxjb2RlPmludGVycnVwdCgpPC9jb2RlPiB3YXMgY2FsbGVkIGZvcgotICAgICAqICAgICAgICAgdGhpcyBUaHJlYWQgd2hpbGUgaXQgd2FzIHNsZWVwaW5nCisgICAgICogQ2F1c2VzIHRoZSB0aHJlYWQgd2hpY2ggc2VudCB0aGlzIG1lc3NhZ2UgdG8gc2xlZXAgZm9yIHRoZSBnaXZlbiBpbnRlcnZhbAorICAgICAqIG9mIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcyBhbmQgbmFub3NlY29uZHMpLiBUaGUgcHJlY2lzaW9uIGlzIG5vdAorICAgICAqIGd1YXJhbnRlZWQgLSB0aGUgVGhyZWFkIG1heSBzbGVlcCBtb3JlIG9yIGxlc3MgdGhhbiByZXF1ZXN0ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1pbGxpcworICAgICAqICAgICAgICAgICAgVGhlIHRpbWUgdG8gc2xlZXAgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSBuYW5vcworICAgICAqICAgICAgICAgICAgRXh0cmEgbmFub3NlY29uZCBwcmVjaXNpb24KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+aW50ZXJydXB0KCk8L2NvZGU+IHdhcyBjYWxsZWQgZm9yIHRoaXMgVGhyZWFkIHdoaWxlCisgICAgICogICAgICAgICAgICAgaXQgd2FzIHNsZWVwaW5nCiAgICAgICogQHNlZSBUaHJlYWQjaW50ZXJydXB0KCkKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyB0aW1lLCBpbnQgbmFub3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFZNVGhyZWFkLnNsZWVwKHRpbWUsIG5hbm9zKTsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMsIGludCBuYW5vcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgVk1UaHJlYWQuc2xlZXAobWlsbGlzLCBuYW5vcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTI0LDkgKzEyNzMsMTEgQEAKICAgICAgKiB0aGUgcmVjZWl2ZXIgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHJlY2VpdmVyIFRocmVhZCBpdHNlbGYgKGFuZCBub3QgdGhlCiAgICAgICogVGhyZWFkIGNhbGxpbmcgPGNvZGU+c3RhcnQoKTwvY29kZT4pLgogICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gVW5zcGVjaWZpZWQgaW4gdGhlIEphdmEgbGFuZ3VhZ2UKLSAgICAgKiAgICAgICAgIHNwZWNpZmljYXRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgVGhyZWFkIGhhcyBiZWVuIHN0YXJ0ZWQgYmVmb3JlCisgICAgICogCiAgICAgICogQHNlZSBUaHJlYWQjcnVuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewogICAgICAgICBpZiAoaGFzQmVlblN0YXJ0ZWQpIHsKQEAgLTExNDUsNyArMTI5NiwxMCBAQAogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiA8Y29kZT5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoIGEKICAgICAgKiAgICAgICAgIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiBAZGVwcmVjYXRlZCBiZWNhdXNlIHN0b3BwaW5nIGEgdGhyZWFkIGluIHRoaXMgbWFubmVyIGlzIHVuc2FmZSBhbmQgY2FuCisgICAgICogbGVhdmUgeW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlIFZNIGluIGFuIHVucHJlZGljdGFibGUgc3RhdGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzdG9wKCkgewpAQCAtMTE2Myw3ICsxMzE3LDEwIEBACiAgICAgICogICAgICAgICBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+dGhyb3dhYmxlKCk8L2NvZGU+IGlzCiAgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBkZXByZWNhdGVkCisgICAgICogQGRlcHJlY2F0ZWQgYmVjYXVzZSBzdG9wcGluZyBhIHRocmVhZCBpbiB0aGlzIG1hbm5lciBpcyB1bnNhZmUgYW5kIGNhbgorICAgICAqIGxlYXZlIHlvdXIgYXBwbGljYXRpb24gYW5kIHRoZSBWTSBpbiBhbiB1bnByZWRpY3RhYmxlIHN0YXRlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoVGhyb3dhYmxlIHRocm93YWJsZSkgewpAQCAtMTE4NiwxNiArMTM0MywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBuby1vcCBpZiB0aGUgcmVjZWl2ZXIgaXMgc3VzcGVuZGVkLiBJZiB0aGUgcmVjZWl2ZXIKLSAgICAgKiA8Y29kZT5pc0FsaXZlKCk8L2NvZGU+IGhvd2V2ZXIsIHN1c3BlbmRlZCBpdCB1bnRpbAotICAgICAqIDxjb2RlPnJlc3VtZSgpPC9jb2RlPiBpcyBzZW50IHRvIGl0LiBTdXNwZW5kIHJlcXVlc3RzIGFyZSBub3QgcXVldWVkLAotICAgICAqIHdoaWNoIG1lYW5zIHRoYXQgTiByZXF1ZXN0cyBhcmUgZXF1aXZhbGVudCB0byBqdXN0IG9uZSAtIG9ubHkgb25lIHJlc3VtZQorICAgICAqIFN1c3BlbmRzIHRoaXMgVGhyZWFkLiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIHJlY2VpdmVyIGlzIHN1c3BlbmRlZC4gSWYKKyAgICAgKiB0aGUgcmVjZWl2ZXIgPGNvZGU+aXNBbGl2ZSgpPC9jb2RlPiBob3dldmVyLCBzdXNwZW5kZWQgaXQgdW50aWwgPGNvZGU+CisgICAgICogcmVzdW1lKCk8L2NvZGU+IGlzIHNlbnQgdG8gaXQuIFN1c3BlbmQgcmVxdWVzdHMgYXJlIG5vdCBxdWV1ZWQsIHdoaWNoCisgICAgICogbWVhbnMgdGhhdCBOIHJlcXVlc3RzIGFyZSBlcXVpdmFsZW50IHRvIGp1c3Qgb25lIC0gb25seSBvbmUgcmVzdW1lCiAgICAgICogcmVxdWVzdCBpcyBuZWVkZWQgaW4gdGhpcyBjYXNlLgotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiA8Y29kZT5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoIGEKLSAgICAgKiAgICAgICAgIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIEBzZWUgVGhyZWFkI3Jlc3VtZSgpCiAgICAgICogQGRlcHJlY2F0ZWQgTWF5IGNhdXNlIGRlYWRsb2Nrcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN1c3BlbmQoKSB7CkBAIC0xMjA5LDkgKzEzNjgsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgotICAgICAqCisgICAgICogVGhyZWFkLiBJdCBpbmNsdWRlcyB0aGUgVGhyZWFkJ3MgbmFtZSwgcHJpb3JpdHksIGFuZCBncm91cCBuYW1lLgorICAgICAqIAogICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMTIxOSwyMiArMTM4MCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgdGhyZWFkIHdoaWNoIHNlbnQgdGhpcyBtZXNzYWdlIHRvIHlpZWxkIGV4ZWN1dGlvbiB0byBhbm90aGVyCi0gICAgICogVGhyZWFkIHRoYXQgaXMgcmVhZHkgdG8gcnVuLiBUaGUgYWN0dWFsIHNjaGVkdWxpbmcgaXMKLSAgICAgKiBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCi0gICAgICoKKyAgICAgKiBDYXVzZXMgdGhlIGNhbGxpbmcgVGhyZWFkIHRvIHlpZWxkIGV4ZWN1dGlvbiB0aW1lIHRvIGFub3RoZXIgVGhyZWFkIHRoYXQKKyAgICAgKiBpcyByZWFkeSB0byBydW4uIFRoZSBhY3R1YWwgc2NoZWR1bGluZyBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHlpZWxkKCkgewogICAgICAgICBWTVRocmVhZC55aWVsZCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQgaGFzIGEgbW9uaXRvciBsb2NrIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBUaHJlYWQgaGFzIGEgbW9uaXRvciBsb2NrIG9uIHRoZSBzcGVjaWZpZWQKICAgICAgKiBvYmplY3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gdGVzdCBmb3IgdGhlIG1vbml0b3IgbG9jawotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHRocmVhZCBoYXMgYSBtb25pdG9yIGxvY2sgb24gdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgb2JqZWN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHRocmVhZCBoYXMgYSBtb25pdG9yIGxvY2sgb24gdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgb2JqZWN0OyBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBob2xkc0xvY2soT2JqZWN0IG9iamVjdCkgewogICAgICAgICByZXR1cm4gY3VycmVudFRocmVhZCgpLnZtVGhyZWFkLmhvbGRzTG9jayhvYmplY3QpOwpAQCAtMTI0NSw2ICsxNDA4LDggQEAKICAgICAgKiB0ZXJtaW5hdGVkIGJ5IGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbi4gVXBvbiBzdWNoIHRlcm1pbmF0aW9uLCB0aGUgaGFuZGxlcgogICAgICAqIGlzIG5vdGlmaWVkIG9mIHRoZSB0ZXJtaW5hdGluZyB0aHJlYWQgYW5kIGNhdXNhbCBleGNlcHRpb24uIElmIHRoZXJlIGlzCiAgICAgICogbm8gZXhwbGljaXQgaGFuZGxlciBzZXQgdGhlbiB0aGUgdGhyZWFkJ3MgZ3JvdXAgaXMgdGhlIGRlZmF1bHQgaGFuZGxlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgewogICAgICAgICAvKioKQEAgLTEyNTQsMTIgKzE0MTksMTIgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHRocmVhZCB0aGUgdGhyZWFkIHRoYXQgaGFzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbgogICAgICAgICAgKiBAcGFyYW0gZXggdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgdm9pZCB1bmNhdWdodEV4Y2VwdGlvbihUaHJlYWQgdGhyZWFkLCBUaHJvd2FibGUgZXgpOwogICAgIH0KIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKLQogICAgIC8qKgogICAgICAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnVucGFyaygpPC9jb2RlPi4gU2VlIHtAbGluayBMYW5nQWNjZXNzSW1wbH0uCiAgICAgICovCkBAIC0xMzkxLDYgKzE1NTYsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIH0KZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1RocmVhZEdyb3VwLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWRHcm91cC5qYXZhCmluZGV4IDRjZmFhNzYuLjMzZmEzMWUgMTAwNjQ0Ci0tLSBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1RocmVhZEdyb3VwLmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVGhyZWFkR3JvdXAuamF2YQpAQCAtMTgsMzIgKzE4LDM5IEBACiBwYWNrYWdlIGphdmEubGFuZzsKIAogLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHByb3ZpZGVkLCBidXQgdGhlIGRvY3VtZW50ZWQgY29uc3RydWN0b3JzCi0gKiBhcmUgdXNlZCBieSB0aGUgdm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlIHRoZSByZXF1aXJlZCAic3lzdGVtIgotICogYW5kICJtYWluIiBUaHJlYWRHcm91cHMuIFRoZSBkb2N1bWVudGVkIG1ldGhvZHMgYXJlIHVzZWQgYnkgamF2YS5sYW5nLlRocmVhZAotICogdG8gYWRkIGFuZCByZW1vdmUgVGhyZWFkcyBmcm9tIHRoZWlyIFRocmVhZEdyb3Vwcy4KLSAqIAotICogVGhyZWFkR3JvdXBzIGFyZSBjb250YWluZXJzIG9mIFRocmVhZHMgYW5kIFRocmVhZEdyb3VwcywgdGhlcmVmb3JlIHByb3ZpZGluZwotICogYSB0cmVlLWxpa2Ugc3RydWN0dXJlIHRvIG9yZ2FuaXplIFRocmVhZHMuIFRoZSByb290IFRocmVhZEdyb3VwIG5hbWUgaXMKLSAqICJzeXN0ZW0iIGFuZCBpdCBoYXMgbm8gcGFyZW50IFRocmVhZEdyb3VwLiBBbGwgb3RoZXIgVGhyZWFkR3JvdXBzIGhhdmUKLSAqIGV4YWN0bHkgb25lIHBhcmVudCBUaHJlYWRHcm91cC4gQWxsIFRocmVhZHMgYmVsb25nIHRvIGV4YWN0bHkgb25lCi0gKiBUaHJlYWRHcm91cC4KKyAqIEEge0Bjb2RlIFRocmVhZEdyb3VwfSBpcyBhIG1lYW5zIG9mIG9yZ2FuaXppbmcge0BsaW5rIFRocmVhZH1zIGludG8gYQorICogaGllcmFyY2hpY2FsIHN0cnVjdHVyZS4gQSB7QGNvZGUgVGhyZWFkR3JvdXB9IGNhbiBjb250YWluIHplcm8gb3IgbW9yZQorICoge0Bjb2RlIFRocmVhZH1zIGFuZCB6ZXJvIG9yIG1vcmUgb3RoZXIge0Bjb2RlIFRocmVhZEdyb3VwfXMuIEVhY2gge0Bjb2RlCisgKiBUaHJlYWR9IGFuZCBlYWNoIHtAY29kZSBUaHJlYWRHcm91cH0gKGV4Y2VwdCB0aGUgcm9vdCBncm91cCkgaGFzIGEgdW5pcXVlCisgKiBwYXJlbnQge0Bjb2RlIFRocmVhZEdyb3VwfS4gVGhlIHJlc3VsdCBpcyBhIHRyZWUgd2hvc2UgaW5uZXIgbm9kZXMgYXJlCisgKiB7QGNvZGUgVGhyZWFkR3JvdXB9cyBhbmQgd2hvc2UgbGVhZiBub2RlcyBhcmUge0Bjb2RlIFRocmVhZHN9LiBUaGUgdW5pcXVlCisgKiByb290IG9mIHRoZSB0cmVlIGlzIGEge0Bjb2RlIFRocmVhZEdyb3VwfSB0aGF0IGlzIGNyZWF0ZWQgYXQgVk0gc3RhcnR1cCBhbmQKKyAqIGhhcyB0aGUgbmFtZSAic3lzdGVtIi4gVGhlIGJlbmVmaXQgb2YgdXNpbmcge0Bjb2RlIFRocmVhZEdyb3VwfXMsIGluIGFkZGl0aW9uCisgKiB0byB0aGUgbWVyZSBob3VzZWtlZXBpbmcgYXNwZWN0LCBpcyB0aGF0IGFsbCB7QGNvZGUgVGhyZWFkfXMgaW4gYSB7QGNvZGUKKyAqIFRocmVhZEdyb3VwfSBjYW4gYmUgbWFuaXB1bGF0ZWQgdG9nZXRoZXIsIHRoYXQgaXMsIHRoZSB7QGNvZGUgVGhyZWFkR3JvdXB9CisgKiBoYXMgbWV0aG9kcyB0aGF0IGRlbGVnYXRlIHRvIGFsbCBpdHMgYWxsIHtAY29kZSBUaHJlYWR9cy4KICAqIAogICogQHNlZSBUaHJlYWQKICAqIEBzZWUgU2VjdXJpdHlNYW5hZ2VyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVGhyZWFkR3JvdXAgaW1wbGVtZW50cyBUaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHsKIAotICAgIC8vIE5hbWUgb2YgdGhpcyBUaHJlYWRHcm91cC4KLSAgICAvLyBWTSBuZWVkcyB0aGlzIGZpZWxkIG5hbWUgZm9yIGRlYnVnZ2luZy4gCisgICAgLy8gTmFtZSBvZiB0aGlzIFRocmVhZEdyb3VwCiAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBWTSBuZWVkcyB0aGlzIGZpZWxkIG5hbWUgZm9yIGRlYnVnZ2luZy4gCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogCiAgICAgLy8gTWF4aW11bSBwcmlvcml0eSBmb3IgVGhyZWFkcyBpbnNpZGUgdGhpcyBUaHJlYWRHcm91cAogICAgIHByaXZhdGUgaW50IG1heFByaW9yaXR5ID0gVGhyZWFkLk1BWF9QUklPUklUWTsKIAotICAgIC8vIFRoZSBUaHJlYWRHcm91cCB0byB3aGljaCB0aGlzIFRocmVhZEdyb3VwIGJlbG9uZ3MuCi0gICAgLy8gVk0gbmVlZHMgdGhpcyBmaWVsZCBuYW1lIGZvciBkZWJ1Z2dpbmcuIAorICAgIC8vIFRoZSBUaHJlYWRHcm91cCB0byB3aGljaCB0aGlzIFRocmVhZEdyb3VwIGJlbG9uZ3MKICAgICBUaHJlYWRHcm91cCBwYXJlbnQ7CisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gVk0gbmVlZHMgdGhpcyBmaWVsZCBuYW1lIGZvciBkZWJ1Z2dpbmcuIAorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIAogICAgIGludCBudW1UaHJlYWRzOwogCkBAIC03MCwyMSArNzcsMzAgQEAKICAgICAvLyBXaGV0aGVyIHRoaXMgVGhyZWFkR3JvdXAgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgb3Igbm90CiAgICAgcHJpdmF0ZSBib29sZWFuIGlzRGVzdHJveWVkOwogCi0gICAgLyogYW4gb2xkZXIgcmVxdWlyZWQgdGhpcywgYnV0IHdlIGRvbid0IGFjdHVhbGx5IHVzZSBpdCAqLwotICAgIC8vcHJpdmF0ZSBzdGF0aWMgVGhyZWFkR3JvdXAgcm9vdCA9IG51bGw7Ci0KKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgLyogdGhlIFZNIHVzZXMgdGhlc2UgZGlyZWN0bHk7IGRvIG5vdCByZW5hbWUgKi8KICAgICBzdGF0aWMgVGhyZWFkR3JvdXAgbVN5c3RlbSA9IG5ldyBUaHJlYWRHcm91cCgpOwogICAgIHN0YXRpYyBUaHJlYWRHcm91cCBtTWFpbiA9IG5ldyBUaHJlYWRHcm91cChtU3lzdGVtLCAibWFpbiIpOworICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyAvKioKKyAgICAvLyAgKiBVc2VkIGJ5IHRoZSBKVk0gdG8gY3JlYXRlIHRoZSAic3lzdGVtIiBUaHJlYWRHcm91cC4gQ29uc3RydWN0IGEKKyAgICAvLyAgKiBUaHJlYWRHcm91cCBpbnN0YW5jZSwgYW5kIGFzc2lnbiB0aGUgbmFtZSAic3lzdGVtIi4KKyAgICAvLyAgKi8KKyAgICAvLyBwcml2YXRlIFRocmVhZEdyb3VwKCkgeworICAgIC8vICAgICBuYW1lID0gInN5c3RlbSI7CisgICAgLy8gfQorICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGhyZWFkR3JvdXAgd2l0aCB0aGUgbmFtZSBwcm92aWRlZC4gVGhlIG5ldyBUaHJlYWRHcm91cAogICAgICAqIHdpbGwgYmUgY2hpbGQgb2YgdGhlIFRocmVhZEdyb3VwIHRvIHdoaWNoIHRoZQotICAgICAqIDxjb2RlPlRocmVhZC5jdXJyZW50VGhyZWFkKCk8L2NvZGU+IGJlbG9uZ3MuCisgICAgICoge0Bjb2RlIFRocmVhZC5jdXJyZW50VGhyZWFkKCl9IGJlbG9uZ3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIFRocmVhZEdyb3VwIGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBmb3IgdGhlIFRocmVhZEdyb3VwIGJlaW5nIGNyZWF0ZWQKICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZvciB0aGUgcGFyZW50CisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB7QGNvZGUgY2hlY2tBY2Nlc3MoKX0gZm9yIHRoZSBwYXJlbnQKICAgICAgKiAgICAgICAgIGdyb3VwIGZhaWxzIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5sYW5nLlRocmVhZCNjdXJyZW50VGhyZWFkCkBAIC05NiwxNiArMTEyLDE2IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRocmVhZEdyb3VwIHdpdGggdGhlIG5hbWUgcHJvdmlkZWQsIGFzIGNoaWxkIG9mIHRoZQotICAgICAqIFRocmVhZEdyb3VwIDxjb2RlPnBhcmVudDwvY29kZT4KKyAgICAgKiBUaHJlYWRHcm91cCB7QGNvZGUgcGFyZW50fS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBUaHJlYWRHcm91cAotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBUaHJlYWRHcm91cCBiZWluZyBjcmVhdGVkCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IFRocmVhZEdyb3VwCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgZm9yIHRoZSBUaHJlYWRHcm91cCBiZWluZyBjcmVhdGVkCiAgICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wYXJlbnQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgPGNvZGU+Y2hlY2tBY2Nlc3MoKTwvY29kZT4gZm9yIHRoZSBwYXJlbnQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSBwYXJlbnR9IGlzCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHtAY29kZSBjaGVja0FjY2VzcygpfSBmb3IgdGhlIHBhcmVudAogICAgICAqICAgICAgICAgZ3JvdXAgZmFpbHMgd2l0aCBhIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+cGFyZW50PC9jb2RlPiBoYXMgYmVlbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGlmIHtAY29kZSBwYXJlbnR9IGhhcyBiZWVuCiAgICAgICogICAgICAgICBkZXN0cm95ZWQgYWxyZWFkeQogICAgICAqLwogICAgIHB1YmxpYyBUaHJlYWRHcm91cChUaHJlYWRHcm91cCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CkBAIC0xMzcsMTMgKzE1MywyMyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRocmVhZHMgd2hpY2ggYXJlIGNoaWxkcmVuIG9mIHRoZSByZWNlaXZlciwKLSAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYW5kIGFyZSBydW5uaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGNoaWxkcmVuIFRocmVhZHMKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gVGhyZWFkcwogICAgICAqLwogCiAgICAgcHVibGljIGludCBhY3RpdmVDb3VudCgpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbnVtVGhyZWFkczsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIC8vIExvY2sgdGhlIGNoaWxkcmVuIHRocmVhZCBsaXN0CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5jaGlsZHJlblRocmVhZHNMb2NrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuVGhyZWFkc1tpXS5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAvLyBMb2NrIHRoaXMgc3VicGFydCBvZiB0aGUgdHJlZSBhcyB3ZSB3YWxrCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5jaGlsZHJlbkdyb3Vwc0xvY2spIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR3JvdXBzOyBpKyspIHsKQEAgLTE1Nyw3ICsxODMsNyBAQAogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBUaHJlYWRHcm91cHMgd2hpY2ggYXJlIGNoaWxkcmVuIG9mIHRoZSByZWNlaXZlciwKICAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGNoaWxkcmVuIFRocmVhZEdyb3VwcworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBUaHJlYWRHcm91cHMKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGFjdGl2ZUdyb3VwQ291bnQoKSB7CiAgICAgICAgIGludCBjb3VudCA9IDA7CkBAIC0yMjYsMTAgKzI1MiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24gdGhlIGRlcHJlY2F0ZWQgbWV0aG9kCi0gICAgICogPGNvZGU+c3VzcGVuZCgpPC9jb2RlPi4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgY2FsbCB3YXMgbmV2ZXIgc3BlY2lmaWVkLgorICAgICAqIERvZXMgbm90aGluZy4gVGhlIGRlZmluaXRpb24gb2YgdGhpcyBtZXRob2QgZGVwZW5kcyBvbiB0aGUgZGVwcmVjYXRlZAorICAgICAqIG1ldGhvZCB7QGxpbmsgI3N1c3BlbmQoKX0uIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIGNhbGwgd2FzIG5ldmVyCisgICAgICogc3BlY2lmaWVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBiIFVzZWQgdG8gY29udHJvbCBsb3cgbWVtb3J5IGltcGxpY2l0IHN1c3BlbnNpb24KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSAoYWx3YXlzKQogICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcXVpcmVkIGRlcHJlY2F0ZWQgbWV0aG9kIHN1c3BlbmQoKS4KICAgICAgKi8KQEAgLTI0MCwyOSArMjY4LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgdGhlcmUgaXMgYSBTZWN1cml0eU1hbmFnZXIgaW5zdGFsbGVkLCBjYWxsIDxjb2RlPmNoZWNrQWNjZXNzPC9jb2RlPgotICAgICAqIGluIGl0IHBhc3NpbmcgdGhlIHJlY2VpdmVyIGFzIHBhcmFtZXRlciwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcuCisgICAgICogQ2hlY2tzIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBUaHJlYWRHcm91cCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUKKyAgICAgKiBjYWxsZXIuIElmIHRoZXJlIGlzIGEgU2VjdXJpdHlNYW5hZ2VyIGluc3RhbGxlZCwgY2FsbHMKKyAgICAgKiB7QGNvZGUgY2hlY2tBY2Nlc3N9IHdpdGggdGhlIHJlY2VpdmVyIGFzIGEgcGFyYW1ldGVyLCBvdGhlcndpc2UgZG9lcworICAgICAqIG5vdGhpbmcuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2hlY2tBY2Nlc3MoKSB7CiAgICAgICAgIC8vIEZvcndhcmRzIHRoZSBtZXNzYWdlIHRvIHRoZSBTZWN1cml0eU1hbmFnZXIgKGlmIHRoZXJlJ3Mgb25lKSBwYXNzaW5nCiAgICAgICAgIC8vIHRoZSByZWNlaXZlciBhcyBwYXJhbWV0ZXIKLSAgICAgICAgCi0vLyBUT0RPIFJlZmVyZW5jZXMgdG8gU3lzdGVtIGNyYXNoIERhbHZpayBkdWUgdG8gc3RhcnR1cCBvcmRlci4gQ2hhbmdlIGxhdGVyLiAgICAgICAgCi0vLyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIGN1cnJlbnRNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotLy8gICAgICAgIGlmIChjdXJyZW50TWFuYWdlciAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgIGN1cnJlbnRNYW5hZ2VyLmNoZWNrQWNjZXNzKHRoaXMpOwotLy8gICAgICAgIH0KKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIGN1cnJlbnRNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBpZiAoY3VycmVudE1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgY3VycmVudE1hbmFnZXIuY2hlY2tBY2Nlc3ModGhpcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBEZXN0cm95cyB0aGUgcmVjZWl2ZXIgYW5kIHJlY3Vyc2l2ZWx5IGFsbCBpdHMgc3ViZ3JvdXBzLiBJdCBpcyBvbmx5IGxlZ2FsCi0gICAgICogdG8gZGVzdHJveSBhIFRocmVhZEdyb3VwIHRoYXQgaGFzIG5vIFRocmVhZHMuIEFueSBkYWVtb24gVGhyZWFkR3JvdXAgaXMKLSAgICAgKiBkZXN0cm95ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGJlY29tZXMgZW1wdHkgKG5vIFRocmVhZHMgYW5kIG5vCi0gICAgICogVGhyZWFkR3JvdXBzIGluIGl0KS4KKyAgICAgKiB0byBkZXN0cm95IGEgVGhyZWFkR3JvdXAgdGhhdCBoYXMgbm8gVGhyZWFkcyBpbiBpdC4gQW55IGRhZW1vbgorICAgICAqIFRocmVhZEdyb3VwIGlzIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgYmVjb21lcyBlbXB0eSAobm8gVGhyZWFkcworICAgICAqIGFuZCBubyBUaHJlYWRHcm91cHMgaW4gaXQpLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGlmIHRoZSByZWNlaXZlciBvciBhbnkgb2YgaXRzCi0gICAgICogICAgICAgICBzdWJncm91cHMgaGFzIGJlZW4gZGVzdHJveWVkIGFscmVhZHkKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPnRoaXMuY2hlY2tBY2Nlc3MoKTwvY29kZT4gZmFpbHMgd2l0aAorICAgICAqICAgICAgICAgc3ViZ3JvdXBzIGhhcyBiZWVuIGRlc3Ryb3llZCBhbHJlYWR5IG9yIGlmIGl0IHN0aWxsIGNvbnRhaW5zCisgICAgICogICAgICAgICB0aHJlYWRzLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYge0Bjb2RlIHRoaXMuY2hlY2tBY2Nlc3MoKX0gZmFpbHMgd2l0aAogICAgICAqICAgICAgICAgYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqLwogCkBAIC0yNzIsNiArMzAxLDE4IEBACiAgICAgICAgIC8vIExvY2sgdGhpcyBzdWJwYXJ0IG9mIHRoZSB0cmVlIGFzIHdlIHdhbGsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmNoaWxkcmVuVGhyZWFkc0xvY2spIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5jaGlsZHJlbkdyb3Vwc0xvY2spIHsKKyAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyZWFkIGdyb3VwIHdhcyBhbHJlYWR5IGRlc3Ryb3llZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHRoaXMubmFtZSAhPSBudWxsID8gdGhpcy5uYW1lIDogIm4vYSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtVGhyZWFkcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyZWFkIGdyb3VwIHN0aWxsIGNvbnRhaW5zIHRocmVhZHM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh0aGlzLm5hbWUgIT0gbnVsbCA/IHRoaXMubmFtZSA6ICJuL2EiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICAgICAgaW50IHRvRGVzdHJveSA9IG51bUdyb3VwczsKICAgICAgICAgICAgICAgICAvLyBDYWxsIHJlY3Vyc2l2ZWx5IGZvciBzdWJncm91cHMKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvRGVzdHJveTsgaSsrKSB7CkBAIC0zMTQsMzIgKzM1NSwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyBhbiBhcnJheSB3aXRoIGFsbCBUaHJlYWRzIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB0aGUgcmVjZWl2ZXIKLSAgICAgKiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgaW50byB0aGUgYXJyYXkgPGNvZGU+dGhyZWFkczwvY29kZT4gcGFzc2VkIGFzCi0gICAgICogcGFyYW1ldGVycy4gSWYgdGhlIGFycmF5IHBhc3NlZCBhcyBwYXJhbWV0ZXIgaXMgdG9vIHNtYWxsIG5vIGV4Y2VwdGlvbiBpcwotICAgICAqIHRocm93biAtIHRoZSBleHRyYSBlbGVtZW50cyBhcmUgc2ltcGx5IG5vdCBjb3BpZWQuCisgICAgICogSXRlcmF0ZXMgb3ZlciBhbGwgYWN0aXZlIHRocmVhZHMgaW4gdGhpcyBncm91cCAoYW5kIGl0cyBzdWItZ3JvdXBzKSBhbmQKKyAgICAgKiBzdG9yZXMgdGhlIHRocmVhZHMgaW4gdGhlIGdpdmVuIGFycmF5LiBSZXR1cm5zIHdoZW4gdGhlIGFycmF5IGlzIGZ1bGwgb3IKKyAgICAgKiBubyBtb3JlIHRocmVhZHMgcmVtYWluLCB3aGljaGV2ZXIgaGFwcGVucyBmaXJzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhyZWFkcyBUaHJlYWQgYXJyYXkgaW50byB3aGljaCB0aGUgVGhyZWFkcyB3aWxsIGJlIGNvcGllZAotICAgICAqIEByZXR1cm4gSG93IG1hbnkgVGhyZWFkcyB3ZXJlIGNvcGllZCBvdmVyCi0gICAgICogCisgICAgICogQHBhcmFtIHRocmVhZHMgdGhlIGFycmF5IGludG8gd2hpY2ggdGhlIFRocmVhZHMgd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgVGhyZWFkcyB0aGF0IHdlcmUgY29waWVkCiAgICAgICovCiAgICAgcHVibGljIGludCBlbnVtZXJhdGUoVGhyZWFkW10gdGhyZWFkcykgewogICAgICAgICByZXR1cm4gZW51bWVyYXRlKHRocmVhZHMsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyBhbiBhcnJheSB3aXRoIGFsbCBUaHJlYWRzIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB0aGUgcmVjZWl2ZXIgaW50bwotICAgICAqIHRoZSBhcnJheSA8Y29kZT50aHJlYWRzPC9jb2RlPiBwYXNzZWQgYXMgcGFyYW1ldGVyLiBDaGlsZHJlbiBUaHJlYWRzIG9mCi0gICAgICogc3ViZ3JvdXBzIGFyZSByZWN1cnNpdmVseSBjb3BpZWQgYXMgd2VsbCBpZiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5yZWN1cnNlPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBJdGVyYXRlcyBvdmVyIGFsbCBhY3RpdmUgdGhyZWFkcyBpbiB0aGlzIGdyb3VwIChhbmQsIG9wdGlvbmFsbHksIGl0cworICAgICAqIHN1Yi1ncm91cHMpIGFuZCBzdG9yZXMgdGhlIHRocmVhZHMgaW4gdGhlIGdpdmVuIGFycmF5LiBSZXR1cm5zIHdoZW4gdGhlCisgICAgICogYXJyYXkgaXMgZnVsbCBvciBubyBtb3JlIHRocmVhZHMgcmVtYWluLCB3aGljaGV2ZXIgaGFwcGVucyBmaXJzdC4KICAgICAgKiAKLSAgICAgKiBJZiB0aGUgYXJyYXkgcGFzc2VkIGFzIHBhcmFtZXRlciBpcyB0b28gc21hbGwgbm8gZXhjZXB0aW9uIGlzIHRocm93biAtCi0gICAgICogdGhlIGV4dHJhIGVsZW1lbnRzIGFyZSBzaW1wbHkgbm90IGNvcGllZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhyZWFkcyBhcnJheSBpbnRvIHdoaWNoIHRoZSBUaHJlYWRzIHdpbGwgYmUgY29waWVkCi0gICAgICogQHBhcmFtIHJlY3Vyc2UgSW5kaWNhdGVzIHdoZXRoZXIgVGhyZWFkcyBpbiBzdWJncm91cHMgc2hvdWxkIGJlCi0gICAgICogICAgICAgIHJlY3Vyc2l2ZWx5IGNvcGllZCBhcyB3ZWxsIG9yIG5vdAotICAgICAqIEByZXR1cm4gSG93IG1hbnkgVGhyZWFkcyB3ZXJlIGNvcGllZCBvdmVyCisgICAgICogQHBhcmFtIHRocmVhZHMgdGhlIGFycmF5IGludG8gd2hpY2ggdGhlIFRocmVhZHMgd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcGFyYW0gcmVjdXJzZSBpbmRpY2F0ZXMgd2hldGhlciBUaHJlYWRzIGluIHN1Ymdyb3VwcyBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgcmVjdXJzaXZlbHkgY29waWVkIGFzIHdlbGwKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgVGhyZWFkcyB0aGF0IHdlcmUgY29waWVkCiAgICAgICogCiAgICAgICovCiAgICAgcHVibGljIGludCBlbnVtZXJhdGUoVGhyZWFkW10gdGhyZWFkcywgYm9vbGVhbiByZWN1cnNlKSB7CkBAIC0zNDcsMTMgKzM4MiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyBhbiBhcnJheSB3aXRoIGFsbCBUaHJlYWRHcm91cHMgd2hpY2ggYXJlIGNoaWxkcmVuIG9mIHRoZSByZWNlaXZlcgotICAgICAqIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBpbnRvIHRoZSBhcnJheSA8Y29kZT5ncm91cHM8L2NvZGU+IHBhc3NlZCBhcwotICAgICAqIHBhcmFtZXRlcnMuIElmIHRoZSBhcnJheSBwYXNzZWQgYXMgcGFyYW1ldGVyIGlzIHRvbyBzbWFsbCBubyBleGNlcHRpb24gaXMKLSAgICAgKiB0aHJvd24gLSB0aGUgZXh0cmEgZWxlbWVudHMgYXJlIHNpbXBseSBub3QgY29waWVkLgorICAgICAqIEl0ZXJhdGVzIG92ZXIgYWxsIHRocmVhZCBncm91cHMgaW4gdGhpcyBncm91cCAoYW5kIGl0cyBzdWItZ3JvdXBzKSBhbmQKKyAgICAgKiBhbmQgc3RvcmVzIHRoZSBncm91cHMgaW4gdGhlIGdpdmVuIGFycmF5LiBSZXR1cm5zIHdoZW4gdGhlIGFycmF5IGlzIGZ1bGwKKyAgICAgKiBvciBubyBtb3JlIGdyb3VwcyByZW1haW4sIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBncm91cHMgYXJyYXkgaW50byB3aGljaCB0aGUgVGhyZWFkR3JvdXBzIHdpbGwgYmUgY29waWVkCi0gICAgICogQHJldHVybiBIb3cgbWFueSBUaHJlYWRHcm91cHMgd2VyZSBjb3BpZWQgb3ZlcgorICAgICAqIEBwYXJhbSBncm91cHMgdGhlIGFycmF5IGludG8gd2hpY2ggdGhlIFRocmVhZEdyb3VwcyB3aWxsIGJlIGNvcGllZAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBUaHJlYWRHcm91cHMgdGhhdCB3ZXJlIGNvcGllZAogICAgICAqIAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZW51bWVyYXRlKFRocmVhZEdyb3VwW10gZ3JvdXBzKSB7CkBAIC0zNjEsMTggKzM5NSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyBhbiBhcnJheSB3aXRoIGFsbCBUaHJlYWRHcm91cHMgd2hpY2ggYXJlIGNoaWxkcmVuIG9mIHRoZSByZWNlaXZlcgotICAgICAqIGludG8gdGhlIGFycmF5IDxjb2RlPmdyb3VwczwvY29kZT4gcGFzc2VkIGFzIHBhcmFtZXRlci4gQ2hpbGRyZW4KLSAgICAgKiBUaHJlYWRHcm91cHMgb2Ygc3ViZ3JvdXBzIGFyZSByZWN1cnNpdmVseSBjb3BpZWQgYXMgd2VsbCBpZiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5yZWN1cnNlPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBJdGVyYXRlcyBvdmVyIGFsbCB0aHJlYWQgZ3JvdXBzIGluIHRoaXMgZ3JvdXAgKGFuZCwgb3B0aW9uYWxseSwgaXRzCisgICAgICogc3ViLWdyb3VwcykgYW5kIGFuZCBzdG9yZXMgdGhlIGdyb3VwcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuIFJldHVybnMgd2hlbgorICAgICAqIHRoZSBhcnJheSBpcyBmdWxsIG9yIG5vIG1vcmUgZ3JvdXBzIHJlbWFpbiwgd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuCiAgICAgICogCi0gICAgICogSWYgdGhlIGFycmF5IHBhc3NlZCBhcyBwYXJhbWV0ZXIgaXMgdG9vIHNtYWxsIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24gLQotICAgICAqIHRoZSBleHRyYSBlbGVtZW50cyBhcmUgc2ltcGx5IG5vdCBjb3BpZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGdyb3VwcyBhcnJheSBpbnRvIHdoaWNoIHRoZSBUaHJlYWRHcm91cHMgd2lsbCBiZSBjb3BpZWQKLSAgICAgKiBAcGFyYW0gcmVjdXJzZSBJbmRpY2F0ZXMgd2hldGhlciBUaHJlYWRHcm91cHMgaW4gc3ViZ3JvdXBzIHNob3VsZCBiZQorICAgICAqIEBwYXJhbSBncm91cHMgdGhlIGFycmF5IGludG8gd2hpY2ggdGhlIFRocmVhZEdyb3VwcyB3aWxsIGJlIGNvcGllZAorICAgICAqIEBwYXJhbSByZWN1cnNlIGluZGljYXRlcyB3aGV0aGVyIFRocmVhZEdyb3VwcyBpbiBzdWJncm91cHMgc2hvdWxkIGJlCiAgICAgICogICAgICAgIHJlY3Vyc2l2ZWx5IGNvcGllZCBhcyB3ZWxsIG9yIG5vdAotICAgICAqIEByZXR1cm4gSG93IG1hbnkgVGhyZWFkR3JvdXBzIHdlcmUgY29waWVkIG92ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgVGhyZWFkR3JvdXBzIHRoYXQgd2VyZSBjb3BpZWQKICAgICAgKiAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGVudW1lcmF0ZShUaHJlYWRHcm91cFtdIGdyb3VwcywgYm9vbGVhbiByZWN1cnNlKSB7CkBAIC00MzIsNyArNDYyLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGFsbG93ZWQgcHJpb3JpdHkgZm9yIGEgVGhyZWFkIGluIHRoZSByZWNlaXZlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHByaW9yaXR5IChhbiA8Y29kZT5pbnQ8L2NvZGU+KQorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gcHJpb3JpdHkKICAgICAgKiAKICAgICAgKiBAc2VlICNzZXRNYXhQcmlvcml0eQogICAgICAqLwpAQCAtNDQzLDE1ICs0NzMsMTUgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZWNlaXZlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIG5hbWUgKGEgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIG5hbWUKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlY2VpdmVyJ3MgcGFyZW50IFRocmVhZEdyb3VwLiBJdCBjYW4gYmUgbnVsbCBpZiB0aGUgcmVjZWl2ZXIKLSAgICAgKiBpcyB0aGUgdGhlIHJvb3QgVGhyZWFkR3JvdXAuCisgICAgICogUmV0dXJucyB0aGUgcmVjZWl2ZXIncyBwYXJlbnQgVGhyZWFkR3JvdXAuIEl0IGNhbiBiZSB7QGNvZGUgbnVsbH0gIGlmIHRoZQorICAgICAqIHJlY2VpdmVyIGlzIHRoZSB0aGUgcm9vdCBUaHJlYWRHcm91cC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgVGhyZWFkR3JvdXAKICAgICAgKiAKQEAgLTQ2Nyw3ICs0OTcsNyBAQAogICAgICAqIEludGVycnVwdHMgZXZlcnkgVGhyZWFkIGluIHRoZSByZWNlaXZlciBhbmQgcmVjdXJzaXZlbHkgaW4gYWxsIGl0cwogICAgICAqIHN1Ymdyb3Vwcy4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPnRoaXMuY2hlY2tBY2Nlc3MoKTwvY29kZT4gZmFpbHMgd2l0aAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYge0Bjb2RlIHRoaXMuY2hlY2tBY2Nlc3MoKX0gZmFpbHMgd2l0aAogICAgICAqICAgICAgICAgYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIAogICAgICAqIEBzZWUgVGhyZWFkI2ludGVycnVwdApAQCAtNDg5LDkgKzUxOSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGRhZW1vbiBUaHJlYWRHcm91cCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZWNlaXZlciBpcyBhIGRhZW1vbiBUaHJlYWRHcm91cC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSByZWNlaXZlciBpcyBhIGRhZW1vbiBUaHJlYWRHcm91cAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAoYW5kIG9ubHkgaWYpIHRoZSByZWNlaXZlciBpcyBhIGRhZW1vbiBUaHJlYWRHcm91cAogICAgICAqIAogICAgICAqIEBzZWUgI3NldERhZW1vbgogICAgICAqIEBzZWUgI2Rlc3Ryb3kKQEAgLTUwMSw5ICs1MzEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGVzdHJveWVkIGFscmVhZHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVjZWl2ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGVzdHJveWVkIGFscmVhZHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgKGFuZCBvbmx5IGlmKSB0aGUgcmVjZWl2ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQKICAgICAgKiAKICAgICAgKiBAc2VlICNkZXN0cm95CiAgICAgICovCkBAIC01MTIsNyArNTQyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPdXRwdXRzIHRvIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiBPdXRwdXRzIHRvIHtAY29kZSBTeXN0ZW0ub3V0fSBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlCiAgICAgICogaGllcmFyY2h5IG9mIFRocmVhZHMgYW5kIFRocmVhZEdyb3VwcyBpbiB0aGUgcmVjZWl2ZXIgKGFuZCByZWN1cnNpdmVseSkuCiAgICAgICogUHJvcGVyIGluZGVudGF0aW9uIGlzIGRvbmUgdG8gc3VnZ2VzdCB0aGUgbmVzdGluZyBvZiBncm91cHMgaW5zaWRlIGdyb3VwcwogICAgICAqIGFuZCB0aHJlYWRzIGluc2lkZSBncm91cHMuCkBAIC01MjQsNyArNTU0LDcgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIE91dHB1dHMgdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT5hIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICogT3V0cHV0cyB0byB7QGNvZGUgU3lzdGVtLm91dH1hIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlCiAgICAgICogaGllcmFyY2h5IG9mIFRocmVhZHMgYW5kIFRocmVhZEdyb3VwcyBpbiB0aGUgcmVjZWl2ZXIgKGFuZCByZWN1cnNpdmVseSkuCiAgICAgICogVGhlIGluZGVudGF0aW9uIHdpbGwgYmUgZm91ciBzcGFjZXMgcGVyIGxldmVsIG9mIG5lc3RpbmcuCiAgICAgICogCkBAIC01NTcsMTIgKzU4NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBkaXJlY3Qgb3IgaW5kaXJlY3QgcGFyZW50IGdyb3VwIG9mCi0gICAgICogVGhyZWFkR3JvdXAgPGNvZGU+ZzwvY29kZT4sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVjZWl2ZXIgaXMgYSBkaXJlY3Qgb3IgaW5kaXJlY3QgcGFyZW50IGdyb3VwIG9mIGEKKyAgICAgKiBnaXZlbiBUaHJlYWRHcm91cC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZyBUaHJlYWRHcm91cCB0byB0ZXN0CisgICAgICogQHBhcmFtIGcgdGhlIHBvdGVudGlhbCBjaGlsZCBUaHJlYWRHcm91cAogICAgICAqIAotICAgICAqIEByZXR1cm4gaWYgdGhlIHJlY2VpdmVyIGlzIHBhcmVudCBvZiB0aGUgVGhyZWFkR3JvdXAgcGFzc2VkIGFzIHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAoYW5kIG9ubHkgaWYpIHRoZSByZWNlaXZlciBpcyBwYXJlbnQgb2Yge0Bjb2RlIGd9CiAgICAgICogCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcGFyZW50T2YoVGhyZWFkR3JvdXAgZykgewpAQCAtNTg4LDcgKzYxOCw5IEBACiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblRocmVhZHNbaV0uZXF1YWxzKHRocmVhZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcy0tOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuVGhyZWFkcywgaSArIDEsIGNoaWxkcmVuVGhyZWFkcywgaSwgbnVtVGhyZWFkcyAtIGkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJyYXljb3B5KGNoaWxkcmVuVGhyZWFkcywgaSArIDEsIGNoaWxkcmVuVGhyZWFkcywgaSwgbnVtVGhyZWFkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBpKTsKICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5UaHJlYWRzW251bVRocmVhZHNdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjAwLDcgKzYzMiw3IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbiBpbW1lZGlhdGUgc3ViZ3JvdXAgZnJvbSB0aGUgcmVjZWl2ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgVGhyZWFkZ3JvdXAgdG8gcmVtb3ZlIGZyb20gdGhlIHJlY2VpdmVyCisgICAgICogQHBhcmFtIGcgVGhyZWFkR3JvdXAgdG8gcmVtb3ZlIGZyb20gdGhlIHJlY2VpdmVyCiAgICAgICogCiAgICAgICogQHNlZSAjYWRkKFRocmVhZCkKICAgICAgKiBAc2VlICNhZGQoVGhyZWFkR3JvdXApCkBAIC02MjMsNyArNjU1LDcgQEAKICAgICAgKiBSZXN1bWVzIGV2ZXJ5IFRocmVhZCBpbiB0aGUgcmVjZWl2ZXIgYW5kIHJlY3Vyc2l2ZWx5IGluIGFsbCBpdHMKICAgICAgKiBzdWJncm91cHMuCiAgICAgICogCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiA8Y29kZT50aGlzLmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGgKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHtAY29kZSB0aGlzLmNoZWNrQWNjZXNzKCl9IGZhaWxzIHdpdGgKICAgICAgKiAgICAgICAgIGEgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKiAKICAgICAgKiBAc2VlIFRocmVhZCNyZXN1bWUKQEAgLTY1Myw5ICs2ODUsMTAgQEAKICAgICAgKiBDb25maWd1cmVzIHRoZSByZWNlaXZlciB0byBiZSBhIGRhZW1vbiBUaHJlYWRHcm91cCBvciBub3QuIERhZW1vbgogICAgICAqIFRocmVhZEdyb3VwcyBhcmUgYXV0b21hdGljYWxseSBkZXN0cm95ZWQgd2hlbiB0aGV5IGJlY29tZSBlbXB0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNEYWVtb24gbmV3IHZhbHVlIGRlZmluaW5nIGlmIHJlY2VpdmVyIHNob3VsZCBiZSBkYWVtb24gb3Igbm90CisgICAgICogQHBhcmFtIGlzRGFlbW9uIHRoZSBuZXcgdmFsdWUgZGVmaW5pbmcgaWYgcmVjZWl2ZXIgc2hvdWxkIGJlIGRhZW1vbiBvcgorICAgICAqICAgICAgICAgICAgICAgICBub3QKICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZvciB0aGUgcGFyZW50CisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB7QGNvZGUgY2hlY2tBY2Nlc3MoKX0gZm9yIHRoZSBwYXJlbnQKICAgICAgKiAgICAgICAgIGdyb3VwIGZhaWxzIHdpdGggYSBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqIAogICAgICAqIEBzZWUgI2lzRGFlbW9uCkBAIC02NzYsNyArNzA5LDcgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3TWF4IHRoZSBuZXcgbWF4aW11bSBwcmlvcml0eSB0byBiZSBzZXQKICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIDxjb2RlPmNoZWNrQWNjZXNzKCk8L2NvZGU+IGZhaWxzIHdpdGggYQorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYge0Bjb2RlIGNoZWNrQWNjZXNzKCl9IGZhaWxzIHdpdGggYQogICAgICAqICAgICAgICAgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbgogICAgICAqICAgICAgICAgVGhyZWFkLk1BWF9QUklPUklUWSBvciBsZXNzIHRoYW4gVGhyZWFkLk1JTl9QUklPUklUWQpAQCAtNzA1LDggKzczOCw4IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwYXJlbnQgVGhyZWFkR3JvdXAgb2YgdGhlIHJlY2VpdmVyLCBhbmQgYWRkcyB0aGUgcmVjZWl2ZXIgdG8gdGhlCi0gICAgICogcGFyZW50J3MgY29sbGVjdGlvbiBvZiBpbW1lZGlhdGUgY2hpbGRyZW4gKGlmIDxjb2RlPnBhcmVudDwvY29kZT4gaXMKLSAgICAgKiBub3QgPGNvZGU+bnVsbDwvY29kZT4pLgorICAgICAqIHBhcmVudCdzIGNvbGxlY3Rpb24gb2YgaW1tZWRpYXRlIGNoaWxkcmVuIChpZiB7QGNvZGUgcGFyZW50fSBpcworICAgICAqIG5vdCB7QGNvZGUgbnVsbH0pLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBUaHJlYWRHcm91cCwgb3IgbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgdG8gYmUKICAgICAgKiAgICAgICAgdGhlIHJvb3QgVGhyZWFkR3JvdXAKQEAgLTcyNCw3ICs3NTcsNyBAQAogICAgIC8qKgogICAgICAqIFN0b3BzIGV2ZXJ5IFRocmVhZCBpbiB0aGUgcmVjZWl2ZXIgYW5kIHJlY3Vyc2l2ZWx5IGluIGFsbCBpdHMgc3ViZ3JvdXBzLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgPGNvZGU+dGhpcy5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB7QGNvZGUgdGhpcy5jaGVja0FjY2VzcygpfSBmYWlscyB3aXRoCiAgICAgICogICAgICAgICBhIFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogCiAgICAgICogQHNlZSBUaHJlYWQjc3RvcCgpCkBAIC03NzQsNyArODA3LDcgQEAKICAgICAgKiBTdXNwZW5kcyBldmVyeSBUaHJlYWQgaW4gdGhlIHJlY2VpdmVyIGFuZCByZWN1cnNpdmVseSBpbiBhbGwgaXRzCiAgICAgICogc3ViZ3JvdXBzLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgPGNvZGU+dGhpcy5jaGVja0FjY2VzcygpPC9jb2RlPiBmYWlscyB3aXRoCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB7QGNvZGUgdGhpcy5jaGVja0FjY2VzcygpfSBmYWlscyB3aXRoCiAgICAgICogICAgICAgICBhIFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogCiAgICAgICogQHNlZSBUaHJlYWQjc3VzcGVuZApAQCAtODIzLDcgKzg1Niw3IEBACiAgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgICogcmVjZWl2ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIFRocmVhZEdyb3VwCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTgzMiwyMCArODY1LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBhbnkgVGhyZWFkIGhhcyB0byBiZSBmb3J3YXJkZWQgKGJ5IHRoZSBWTSkgdG8KLSAgICAgKiB0aGUgVGhyZWFkJ3MgVGhyZWFkR3JvdXAgYnkgc2VuZGluZyB0aGlzIG1lc3NhZ2UgKHVuY2F1Z2h0RXhjZXB0aW9uKS4KLSAgICAgKiBUaGlzIGFsbG93cyB1c2VycyB0byBkZWZpbmUgY3VzdG9tIFRocmVhZEdyb3VwIGNsYXNzZXMgYW5kIGN1c3RvbQotICAgICAqIGJlaGF2aW9yIGZvciB3aGVuIGEgVGhyZWFkIGhhcyBhbiB1bmNhdWdodEV4Y2VwdGlvbiBvciB3aGVuIGl0IGRvZXMKLSAgICAgKiAoVGhyZWFkRGVhdGgpLgorICAgICAqIEhhbmRsZXMgdW5jYXVnaHQgZXhjZXB0aW9ucy4gQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBhbnkgVGhyZWFkCisgICAgICogaXMgZm9yd2FyZGVkIChieSB0aGUgVk0pIHRvIHRoZSBUaHJlYWQncyBUaHJlYWRHcm91cCBieSBzZW5kaW5nIHRoaXMKKyAgICAgKiBtZXNzYWdlICh1bmNhdWdodEV4Y2VwdGlvbikuIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGRlZmluZSBjdXN0b20KKyAgICAgKiBUaHJlYWRHcm91cCBjbGFzc2VzIGFuZCBjdXN0b20gYmVoYXZpb3IgZm9yIHdoZW4gYSBUaHJlYWQgaGFzIGFuCisgICAgICogdW5jYXVnaHRFeGNlcHRpb24gb3Igd2hlbiBpdCBkb2VzIChUaHJlYWREZWF0aCkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHQgVGhyZWFkIHdpdGggYW4gdW5jYXVnaHQgZXhjZXB0aW9uCi0gICAgICogQHBhcmFtIGUgVGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpdHNlbGYKKyAgICAgKiBAcGFyYW0gdCB0aGUgVGhyZWFkIHRoYXQgdGVybWluYXRlZCB3aXRoIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbgorICAgICAqIEBwYXJhbSBlIHRoZSB1bmNhdWdodCBleGNlcHRpb24gaXRzZWxmCiAgICAgICogCiAgICAgICogQHNlZSBUaHJlYWQjc3RvcCgpCiAgICAgICogQHNlZSBUaHJlYWQjc3RvcChUaHJvd2FibGUpCiAgICAgICogQHNlZSBUaHJlYWREZWF0aAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZCB0LCBUaHJvd2FibGUgZSkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBwYXJlbnQudW5jYXVnaHRFeGNlcHRpb24odCwgZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoVGhyZWFkLmdldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSAhPSBudWxsKSB7CkBAIC04NTUsOCArODg5LDEwIEBACiAgICAgICAgICAgICAvLyBObyBwYXJlbnQgZ3JvdXAsIGhhcyB0byBiZSAnc3lzdGVtJyBUaHJlYWQgR3JvdXAKICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9Ci0gICAgCisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgLyoqCiAgICAgICogTm9uLXN0YW5kYXJkIG1ldGhvZCBmb3IgYWRkaW5nIGEgdGhyZWFkIHRvIGEgZ3JvdXAsIHJlcXVpcmVkIGJ5IERhbHZpay4KICAgICAgKiAKQEAgLTg4Niw1ICs5MjIsNSBAQAogICAgIHZvaWQgcmVtb3ZlVGhyZWFkKFRocmVhZCB0aHJlYWQpIHRocm93cyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gewogICAgICAgICByZW1vdmUodGhyZWFkKTsKICAgICB9Ci0KKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogfQpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVGhyb3dhYmxlLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJvd2FibGUuamF2YQppbmRleCA5MWRlMTQ1Li4xMmI0ZTliIDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJvd2FibGUuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJvd2FibGUuamF2YQpAQCAtMjMsMjEgKzIzLDI4IEBACiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBzdXBlcmNsYXNzIG9mIGFsbCBjbGFzc2VzIHdoaWNoIGNhbiBiZSB0aHJvd24gYnkKLSAqIHRoZSB2aXJ0dWFsIG1hY2hpbmUuIFRoZSB0d28gZGlyZWN0IHN1YmNsYXNzZXMgcmVwcmVzZW50Ci0gKiByZWNvdmVyYWJsZSBleGNlcHRpb25zIChFeGNlcHRpb24pIGFuZCB1bnJlY292ZXJhYmxlIGVycm9ycwotICogKEVycm9yKS4gVGhpcyBjbGFzcyBwcm92aWRlcyBjb21tb24gbWV0aG9kcyBmb3IgYWNjZXNzaW5nIGEgc3RyaW5nCi0gKiBtZXNzYWdlIHdoaWNoIHByb3ZpZGVzIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaXJjdW1zdGFuY2VzIGluCi0gKiB3aGljaCB0aGUgVGhyb3dhYmxlIHdhcyBjcmVhdGVkLCBhbmQgZm9yIGZpbGxpbmcgaW4gYSBzdGFjayB0cmFjZQotICogKGkuZS4sIGEgcmVjb3JkIG9mIHRoZSBjYWxsIHN0YWNrIGF0IGEgcGFydGljdWxhciBwb2ludCBpbiB0aW1lKQotICogd2hpY2ggY2FuIGJlIHByaW50ZWQgbGF0ZXIuCisgKiBUaGUgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB3aGljaCBjYW4gYmUgdGhyb3duIGJ5IHRoZSB2aXJ0dWFsIG1hY2hpbmUuIFRoZQorICogdHdvIGRpcmVjdCBzdWJjbGFzc2VzIGFyZSByZWNvdmVyYWJsZSBleGNlcHRpb25zICh7QGNvZGUgRXhjZXB0aW9ufSkgYW5kCisgKiB1bnJlY292ZXJhYmxlIGVycm9ycyAoe0Bjb2RlIEVycm9yfSkuIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29tbW9uIG1ldGhvZHMgZm9yCisgKiBhY2Nlc3NpbmcgYSBzdHJpbmcgbWVzc2FnZSB3aGljaCBwcm92aWRlcyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAqIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggdGhlIHtAY29kZSBUaHJvd2FibGV9IHdhcyBjcmVhdGVkIChiYXNpY2FsbHkgYW4gZXJyb3IKKyAqIG1lc3NhZ2UgaW4gbW9zdCBjYXNlcyksIGFuZCBmb3Igc2F2aW5nIGEgc3RhY2sgdHJhY2UgKHRoYXQgaXMsIGEgcmVjb3JkIG9mCisgKiB0aGUgY2FsbCBzdGFjayBhdCBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSkgd2hpY2ggY2FuIGJlIHByaW50ZWQgbGF0ZXIuCisgKiA8cD4KKyAqIEEge0Bjb2RlIFRocm93YWJsZX0gY2FuIGFsc28gaW5jbHVkZSBhIGNhdXNlLCB3aGljaCBpcyBhIG5lc3RlZCB7QGNvZGUKKyAqIFRocm93YWJsZX0gdGhhdCByZXByZXNlbnRzIHRoZSBvcmlnaW5hbCBwcm9ibGVtIHRoYXQgbGVkIHRvIHRoaXMge0Bjb2RlCisgKiBUaHJvd2FibGV9LiBJdCBpcyBvZnRlbiB1c2VkIGZvciB3cmFwcGluZyB2YXJpb3VzIHR5cGVzIG9mIGVycm9ycyBpbnRvIGEKKyAqIGNvbW1vbiB7QGNvZGUgVGhyb3dhYmxlfSB3aXRob3V0IGxvc2luZyB0aGUgZGV0YWlsZWQgb3JpZ2luYWwgZXJyb3IKKyAqIGluZm9ybWF0aW9uLiBXaGVuIHByaW50aW5nIHRoZSBzdGFjayB0cmFjZSwgdGhlIHRyYWNlIG9mIHRoZSBjYXVzZSBpcworICogaW5jbHVkZWQuCiAgKiAKICAqIEBzZWUgRXJyb3IKICAqIEBzZWUgRXhjZXB0aW9uCiAgKiBAc2VlIFJ1bnRpbWVFeGNlcHRpb24KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBUaHJvd2FibGUgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzA0MjY4NjA1NTY1ODA0NzI4NUw7CiAKICAgICAvKioKQEAgLTQ5LDEyICs1NiwxNCBAQAogICAgICAqIFRoZSBjYXVzZSBvZiB0aGlzIFRocm93YWJsZS4gTnVsbCB3aGVuIHRoZXJlIGlzIG5vIGNhdXNlLgogICAgICAqLwogICAgIHByaXZhdGUgVGhyb3dhYmxlIGNhdXNlID0gdGhpczsKLSAgICAKKworICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAvKioKICAgICAgKiBBbiBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YWNrIHRyYWNlLiAgVGhpcyBmaWVsZCBtYXkKICAgICAgKiBiZSBhY2Nlc3NlZCBieSB0aGUgVk07IGRvIG5vdCByZW5hbWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBPYmplY3Qgc3RhY2tTdGF0ZTsKKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAgICAgLyoqCiAgICAgICogQSBmdWxseS1leHBhbmRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhY2sgdHJhY2UuCkBAIC02Miw3ICs3MSw5IEBACiAgICAgcHJpdmF0ZSBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2U7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgc3RhY2sgdHJhY2UgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRocm93YWJsZX0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyb3dhYmxlKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtNzAsMTAgKzgxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHN0YWNrIHRyYWNlIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRocm93YWJsZX0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyB7QGNvZGUgVGhyb3dhYmxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyb3dhYmxlKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHRoaXMoKTsKQEAgLTgxLDExICs5NCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyBzdGFjayB0cmFjZSwKLSAgICAgKiBtZXNzYWdlLCBhbmQgY2F1c2UgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRocm93YWJsZX0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZSwgdGhlCisgICAgICogc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlIGFuZCB0aGUgc3BlY2lmaWVkIGNhdXNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgY2F1c2Ugb2YgdGhpcyBUaHJvd2FibGUKKyAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIHtAY29kZSBUaHJvd2FibGV9LgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIHtAY29kZSBUaHJvd2FibGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaHJvd2FibGUoU3RyaW5nIGRldGFpbE1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKICAgICAgICAgdGhpcygpOwpAQCAtOTQsMTAgKzExMCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyBzdGFjayB0cmFjZSBhbmQgY2F1c2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVGhyb3dhYmxlfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY2F1c2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgY2F1c2Ugb2YgdGhpcyBUaHJvd2FibGUKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2Ugb2YgdGhpcyB7QGNvZGUgVGhyb3dhYmxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyb3dhYmxlKFRocm93YWJsZSB0aHJvd2FibGUpIHsKICAgICAgICAgdGhpcygpOwpAQCAtMTA1LDE0ICsxMjMsMTUgQEAKICAgICAgICAgY2F1c2UgPSB0aHJvd2FibGU7CiAgICAgfQogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgLyoqCi0gICAgICogUmVjb3JkcyBpbiB0aGUgcmVjZWl2ZXIgYSBzdGFjayB0cmFjZSBmcm9tIHRoZSBwb2ludCB3aGVyZSB0aGlzCi0gICAgICogbWVzc2FnZSB3YXMgc2VudC4gVGhlIG1ldGhvZCBpcyBwdWJsaWMgc28gdGhhdCBjb2RlIHdoaWNoCi0gICAgICogY2F0Y2hlcyBhIHRocm93YWJsZSBhbmQgdGhlbiA8ZW0+cmUtdGhyb3dzPC9lbT4gaXQgY2FuIGFkanVzdAotICAgICAqIHRoZSBzdGFjayB0cmFjZSB0byByZXByZXNlbnQgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBleGNlcHRpb24KLSAgICAgKiB3YXMgcmUtdGhyb3duLgorICAgICAqIFJlY29yZHMgdGhlIHN0YWNrIHRyYWNlIGZyb20gdGhlIHBvaW50IHdoZXJlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZAorICAgICAqIHRvIHRoaXMge0Bjb2RlIFRocm93YWJsZX0uIFRoZSBtZXRob2QgaXMgcHVibGljIHNvIHRoYXQgY29kZSB3aGljaAorICAgICAqIGNhdGNoZXMgYSB7QGNvZGUgVGhyb3dhYmxlfSBhbmQgdGhlbiByZS10aHJvd3MgaXQgY2FuIGFkanVzdCB0aGUgc3RhY2sKKyAgICAgKiB0cmFjZSB0byByZXByZXNlbnQgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBleGNlcHRpb24gd2FzIHJlLXRocm93bi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcgorICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgVGhyb3dhYmxlfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyb3dhYmxlIGZpbGxJblN0YWNrVHJhY2UoKSB7CiAgICAgICAgIC8vIEZpbGwgaW4gdGhlIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbgpAQCAtMTIxLDQ2ICsxNDAsNjUgQEAKICAgICAgICAgc3RhY2tUcmFjZSA9IG51bGw7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBtZXNzYWdlIHdoaWNoIHdhcyBwcm92aWRlZCB3aGVuCi0gICAgICogdGhlIHRocm93YWJsZSB3YXMgY3JlYXRlZC4gSWYgbm8gbWVzc2FnZSB3YXMgcHJvdmlkZWQgYXQKLSAgICAgKiBjcmVhdGlvbiB0aW1lLCB0aGVuIHJldHVybiBudWxsLgorICAgICAqIFJldHVybnMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIG1lc3NhZ2Ugd2hpY2ggd2FzIHByb3ZpZGVkIHdoZW4gdGhpcworICAgICAqIHtAY29kZSBUaHJvd2FibGV9IHdhcyBjcmVhdGVkLiBSZXR1cm5zIHtAY29kZSBudWxsfSBpZiBubyBtZXNzYWdlIHdhcworICAgICAqIHByb3ZpZGVkIGF0IGNyZWF0aW9uIHRpbWUuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgVGhlIHJlY2VpdmVyJ3MgbWVzc2FnZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIFRocm93YWJsZX0ncyBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiBkZXRhaWxNZXNzYWdlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIG1lc3NhZ2Ugd2hpY2ggd2FzIHByb3ZpZGVkIHdoZW4KLSAgICAgKiB0aGUgdGhyb3dhYmxlIHdhcyBjcmVhdGVkLiBJZiBubyBtZXNzYWdlIHdhcyBwcm92aWRlZCBhdAotICAgICAqIGNyZWF0aW9uIHRpbWUsIHRoZW4gcmV0dXJuIG51bGwuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMKLSAgICAgKiBtZXRob2QgdG8gcmV0dXJuIGxvY2FsaXplZCB0ZXh0IGZvciB0aGUgbWVzc2FnZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBtZXNzYWdlIHdoaWNoIHdhcyBwcm92aWRlZCB3aGVuIHRoaXMKKyAgICAgKiB7QGNvZGUgVGhyb3dhYmxlfSB3YXMgY3JlYXRlZC4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgbm8gbWVzc2FnZSB3YXMKKyAgICAgKiBwcm92aWRlZCBhdCBjcmVhdGlvbiB0aW1lLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4KKyAgICAgKiBsb2NhbGl6ZWQgdGV4dCBmb3IgdGhlIG1lc3NhZ2UuIFRoZSBBbmRyb2lkIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJldHVybnMgdGhlIHVubG9jYWxpemVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSByZWNlaXZlcidzIG1lc3NhZ2UuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBUaHJvd2FibGV9J3MgbG9jYWxpemVkIGRldGFpbCBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFN0YWNrVHJhY2VFbGVtZW50LiBFYWNoIFN0YWNrVHJhY2VFbGVtZW50Ci0gICAgICogcmVwcmVzZW50cyBhIGVudHJ5IG9uIHRoZSBzdGFjay4KKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBzdGFjayB0cmFjZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBUaHJvd2FibGV9LiBFYWNoCisgICAgICoge0Bjb2RlIFN0YWNrVHJhY2VFbGVtZW50fSByZXByZXNlbnRzIGFuIGVudHJ5IGluIHRoZSBjYWxsIHN0YWNrLiBUaGUKKyAgICAgKiBlbGVtZW50IGF0IHBvc2l0aW9uIDAgaXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIHRoYXQgaXMsIHRoZSBzdGFjayBmcmFtZQorICAgICAqIHdoZXJlIHRoaXMge0Bjb2RlIFRocm93YWJsZX0gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RhY2tUcmFjZUVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdGFjaworICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBhcnJheSBvZiB7QGNvZGUgU3RhY2tUcmFjZUVsZW1lbnR9cyByZXByZXNlbnRpbmcKKyAgICAgKiAgICAgICAgIHRoZSBjYWxsIHN0YWNrLiBDaGFuZ2VzIGluIHRoZSBhcnJheSBvYnRhaW5lZCBmcm9tIHRoaXMgY2FsbCB3aWxsCisgICAgICogICAgICAgICBub3QgY2hhbmdlIHRoZSBjYWxsIHN0YWNrIHN0b3JlZCBpbiB0aGlzIHtAY29kZSBUaHJvd2FibGV9LgorICAgICAqIEBzZWUgI3ByaW50U3RhY2tUcmFjZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0YWNrVHJhY2VFbGVtZW50W10gZ2V0U3RhY2tUcmFjZSgpIHsKICAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhY2tUcmFjZSgpLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJyYXkgb2YgU3RhY2tUcmFjZUVsZW1lbnRzLiBFYWNoIFN0YWNrVHJhY2VFbGVtZW50Ci0gICAgICogcmVwcmVzZW50cyBhIGVudHJ5IG9uIHRoZSBzdGFjay4gQSBjb3B5IG9mIHRoaXMgYXJyYXkgd2lsbCBiZQotICAgICAqIHJldHVybmVkIGJ5IGdldFN0YWNrVHJhY2UoKSBhbmQgcHJpbnRlZCBieSBwcmludFN0YWNrVHJhY2UoKS4KKyAgICAgKiBTZXRzIHRoZSBhcnJheSBvZiBzdGFjayB0cmFjZSBlbGVtZW50cy4gRWFjaCB7QGNvZGUgU3RhY2tUcmFjZUVsZW1lbnR9CisgICAgICogcmVwcmVzZW50cyBhbiBlbnRyeSBpbiB0aGUgY2FsbCBzdGFjay4gQSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMKKyAgICAgKiBzdG9yZWQgaW4gdGhpcyB7QGNvZGUgVGhyb3dhYmxlfS4gd2lsbCBiZSByZXR1cm5lZCBieSB7QGNvZGUKKyAgICAgKiBnZXRTdGFja1RyYWNlKCl9IGFuZCBwcmludGVkIGJ5IHtAY29kZSBwcmludFN0YWNrVHJhY2UoKX0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHRyYWNlIFRoZSBhcnJheSBvZiBTdGFja1RyYWNlRWxlbWVudAorICAgICAqIEBwYXJhbSB0cmFjZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhcnJheSBvZiB7QGNvZGUgU3RhY2tUcmFjZUVsZW1lbnR9cy4gQSBjb3B5IG9mIHRoZQorICAgICAqICAgICAgICAgICAgYXJyYXkgaXMgc3RvcmVkIGluIHRoaXMge0Bjb2RlIFRocm93YWJsZX0sIHNvIHN1YnNlcXVlbnQKKyAgICAgKiAgICAgICAgICAgIGNoYW5nZXMgdG8ge0Bjb2RlIHRyYWNlfSB3aWxsIG5vdCBjaGFuZ2UgdGhlIGNhbGwgc3RhY2sgc3RvcmVkCisgICAgICogICAgICAgICAgICBpbiB0aGlzIHtAY29kZSBUaHJvd2FibGV9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgZWxlbWVudCBpbiB7QGNvZGUgdHJhY2V9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2VlICNwcmludFN0YWNrVHJhY2UoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN0YWNrVHJhY2UoU3RhY2tUcmFjZUVsZW1lbnRbXSB0cmFjZSkgewogICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIG5ld1RyYWNlID0gdHJhY2UuY2xvbmUoKTsKQEAgLTE3Myw4ICsyMTEsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPdXRwdXRzIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcidzIHN0YWNrCi0gICAgICogdHJhY2Ugb24gdGhlIFN5c3RlbS5lcnIgc3RyZWFtLgorICAgICAqIFdyaXRlcyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBUaHJvd2FibGV9J3Mgc3RhY2sgdHJhY2UKKyAgICAgKiB0byB0aGUge0Bjb2RlIFN5c3RlbS5lcnJ9IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7CiAgICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKQEAgLTIxMiwxNyArMjUyLDIzIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBTdGFja1RyYWNlRWxlbWVudFtdIGdldEludGVybmFsU3RhY2tUcmFjZSgpIHsKICAgICAgICAgaWYgKHN0YWNrVHJhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBzdGFja1RyYWNlID0gbmF0aXZlR2V0U3RhY2tUcmFjZShzdGFja1N0YXRlKTsKICAgICAgICAgICAgIHN0YWNrU3RhdGUgPSBudWxsOyAvLyBDbGVhbiB1cCBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhY2tUcmFjZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPdXRwdXRzIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcidzIHN0YWNrCi0gICAgICogdHJhY2Ugb24gdGhlIFByaW50U3RyZWFtIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQuCisgICAgICogV3JpdGVzIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFRocm93YWJsZX0ncyBzdGFjayB0cmFjZQorICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgcHJpbnQgc3RyZWFtLiBJZiB0aGUge0Bjb2RlIFRocm93YWJsZX0gY29udGFpbnMgYQorICAgICAqIHtAbGluayAjZ2V0Q2F1c2UoKSBjYXVzZX0sIHRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IGZvcgorICAgICAqIHRoZSBuZXN0ZWQge0Bjb2RlIFRocm93YWJsZX0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGVyciBQcmludFN0cmVhbSBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBzdGFjayB0cmFjZSBvbi4KKyAgICAgKiBAcGFyYW0gZXJyCisgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBzdGFjayB0cmFjZSBvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gZXJyKSB7CiAgICAgICAgIGVyci5wcmludGxuKHRvU3RyaW5nKCkpOwpAQCAtMjM4LDggKzI4NCw3IEBACiAgICAgICAgIHdoaWxlICh0aHJvd2FibGUgIT0gbnVsbCkgewogICAgICAgICAgICAgZXJyLnByaW50KCJDYXVzZWQgYnk6ICIpOwogICAgICAgICAgICAgZXJyLnByaW50bG4odGhyb3dhYmxlKTsKLSAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gY3VycmVudFN0YWNrID0KLSAgICAgICAgICAgICAgICB0aHJvd2FibGUuZ2V0SW50ZXJuYWxTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIGN1cnJlbnRTdGFjayA9IHRocm93YWJsZS5nZXRJbnRlcm5hbFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgIGludCBkdXBsaWNhdGVzID0gY291bnREdXBsaWNhdGVzKGN1cnJlbnRTdGFjaywgcGFyZW50U3RhY2spOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50U3RhY2subGVuZ3RoIC0gZHVwbGljYXRlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZXJyLnByaW50bG4oIlx0YXQgIiArIGN1cnJlbnRTdGFja1tpXSk7CkBAIC0yNTMsMTAgKzI5OCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE91dHB1dHMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyJ3Mgc3RhY2sKLSAgICAgKiB0cmFjZSBvbiB0aGUgUHJpbnRXcml0ZXIgc3BlY2lmaWVkIGJ5IHRoZSBhcmd1bWVudC4KKyAgICAgKiBXcml0ZXMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgVGhyb3dhYmxlfSdzIHN0YWNrIHRyYWNlCisgICAgICogdG8gdGhlIHNwZWNpZmllZCBwcmludCB3cml0ZXIuIElmIHRoZSB7QGNvZGUgVGhyb3dhYmxlfSBjb250YWlucyBhCisgICAgICoge0BsaW5rICNnZXRDYXVzZSgpIGNhdXNlfSwgdGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgcmVjdXJzaXZlbHkgZm9yIHRoZQorICAgICAqIG5lc3RlZCB7QGNvZGUgVGhyb3dhYmxlfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXJyIFByaW50V3JpdGVyIFRoZSB3cml0ZXIgdG8gd3JpdGUgdGhlIHN0YWNrIHRyYWNlIG9uLgorICAgICAqIEBwYXJhbSBlcnIKKyAgICAgKiAgICAgICAgICAgIHRoZSB3cml0ZXIgdG8gd3JpdGUgdGhlIHN0YWNrIHRyYWNlIG9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBlcnIpIHsKICAgICAgICAgZXJyLnByaW50bG4odG9TdHJpbmcoKSk7CkBAIC0yNzIsOCArMzIxLDcgQEAKICAgICAgICAgd2hpbGUgKHRocm93YWJsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBlcnIucHJpbnQoIkNhdXNlZCBieTogIik7CiAgICAgICAgICAgICBlcnIucHJpbnRsbih0aHJvd2FibGUpOwotICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBjdXJyZW50U3RhY2sgPQotICAgICAgICAgICAgICAgIHRocm93YWJsZS5nZXRJbnRlcm5hbFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gY3VycmVudFN0YWNrID0gdGhyb3dhYmxlLmdldEludGVybmFsU3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgaW50IGR1cGxpY2F0ZXMgPSBjb3VudER1cGxpY2F0ZXMoY3VycmVudFN0YWNrLCBwYXJlbnRTdGFjayk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRTdGFjay5sZW5ndGggLSBkdXBsaWNhdGVzOyBpKyspIHsKICAgICAgICAgICAgICAgICBlcnIucHJpbnRsbigiXHRhdCAiICsgY3VycmVudFN0YWNrW2ldKTsKQEAgLTI4NiwxMiArMzM0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIG1zZyA9IGdldExvY2FsaXplZE1lc3NhZ2UoKTsKQEAgLTI5OSwyMiArMzQxLDI3IEBACiAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSArIDIgKyBtc2cubGVuZ3RoKCkpLgotICAgICAgICAgICAgYXBwZW5kKG5hbWUpLmFwcGVuZCgiOiAiKS5hcHBlbmQobXNnKS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLmxlbmd0aCgpICsgMiArIG1zZy5sZW5ndGgoKSkuYXBwZW5kKG5hbWUpLmFwcGVuZCgiOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobXNnKS50b1N0cmluZygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIGNhdXNlIG9mIHRoZSByZWNlaXZlci4gVGhlIGNhdXNlIGNhbm5vdCBiZSByZWFzc2lnbmVkLgorICAgICAqIEluaXRpYWxpemVzIHRoZSBjYXVzZSBvZiB0aGlzIHtAY29kZSBUaHJvd2FibGV9LiBUaGUgY2F1c2UgY2FuIG9ubHkgYmUKKyAgICAgKiBpbml0aWFsaXplZCBvbmNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIGNhdXNlIG9mIHRoaXMgVGhyb3dhYmxlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiB0aGUgY2F1c2UgaXMgdGhlIHJlY2VpdmVyCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiB0aGUgY2F1c2UgaGFzIGFscmVhZHkgYmVlbgotICAgICAqICAgICAgICAgICAgaW5pdGlhbGl6ZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2Ugb2YgdGhpcyB7QGNvZGUgVGhyb3dhYmxlfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIFRocm93YWJsZX0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgVGhyb3dhYmxlfSBpcyB0aGlzIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYXVzZSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaHJvd2FibGUgaW5pdENhdXNlKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIHJlbW92ZWQgc3luY2hyb25pemVkIG1vZGlmaWVyCisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgaWYgKGNhdXNlID09IHRoaXMpIHsKICAgICAgICAgICAgIGlmICh0aHJvd2FibGUgIT0gdGhpcykgewogICAgICAgICAgICAgICAgIGNhdXNlID0gdGhyb3dhYmxlOwpAQCAtMzI2LDkgKzM3MywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgVGhyb3dhYmxlLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGNhdXNlLgorICAgICAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMge0Bjb2RlIFRocm93YWJsZX0sIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcworICAgICAqIG5vIGNhdXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhyb3dhYmxlIFRoZSByZWNlaXZlcidzIGNhdXNlLgorICAgICAqIEByZXR1cm4gVGhyb3dhYmxlIHRoaXMge0Bjb2RlIFRocm93YWJsZX0ncyBjYXVzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewogICAgICAgICBpZiAoY2F1c2UgPT0gdGhpcykgewpAQCAtMzQzLDYgKzM5Miw3IEBACiAgICAgICAgIHMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CiAgICAgfQogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIC8qCiAgICAgICogQ3JlYXRlcyBhIGNvbXBhY3QsIFZNLXNwZWNpZmljIGNvbGxlY3Rpb24gb2YgZ29vZGllcywgc3VpdGFibGUgZm9yCiAgICAgICogc3RvcmluZyBpbiB0aGUgInN0YWNrU3RhdGUiIGZpZWxkLCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQncwpAQCAtMzU1LDUgKzQwNSw2IEBACiAgICAgICogaW4gInN0YWNrU3RhdGUiLgogICAgICAqLwogICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyBTdGFja1RyYWNlRWxlbWVudFtdIG5hdGl2ZUdldFN0YWNrVHJhY2UoT2JqZWN0IHN0YWNrU3RhdGUpOworICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiB9CiAKZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9QaGFudG9tUmVmZXJlbmNlLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvUGhhbnRvbVJlZmVyZW5jZS5qYXZhCmluZGV4IDdhNzkzMGYuLmMzM2FiNmUgMTAwNjQ0Ci0tLSBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9QaGFudG9tUmVmZXJlbmNlLmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1BoYW50b21SZWZlcmVuY2UuamF2YQpAQCAtMTQsNiArMTQsMjEgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBqYXZhLmxhbmcucmVmOwogCkBAIC00Nyw3ICs2Miw2IEBACiAgICAgICovCiAgICAgcHVibGljIFBoYW50b21SZWZlcmVuY2UoVCByLCBSZWZlcmVuY2VRdWV1ZTw/IHN1cGVyIFQ+IHEpIHsKICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgCiAgICAgICAgIHJlZmVyZW50ID0gcjsKICAgICAgICAgcXVldWUgPSBxOwogICAgIH0KQEAgLTY0LDUgKzc4LDQgQEAKICAgICBwdWJsaWMgVCBnZXQoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZS5qYXZhIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZS5qYXZhCmluZGV4IDc4NDBjYWEuLmNhNzI5MGIgMTAwNjQ0Ci0tLSBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2UuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlLmphdmEKQEAgLTE0LDYgKzE0LDIxIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZjsKIApkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2UuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9Tb2Z0UmVmZXJlbmNlLmphdmEKaW5kZXggNzIzNmYyMC4uMTkyNTNmMSAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2UuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvU29mdFJlZmVyZW5jZS5qYXZhCkBAIC0xNCw2ICsxNCwyMSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiBwYWNrYWdlIGphdmEubGFuZy5yZWY7CiAKQEAgLTgzLDcgKzk4LDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU29mdFJlZmVyZW5jZShUIHIpIHsKICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgCiAgICAgICAgIHJlZmVyZW50ID0gcjsKICAgICB9CiAgICAgCkBAIC0xMDAsNyArMTE0LDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU29mdFJlZmVyZW5jZShUIHIsIFJlZmVyZW5jZVF1ZXVlPD8gc3VwZXIgVD4gcSkgewogICAgICAgICBzdXBlcigpOwotICAgICAgICAKICAgICAgICAgcmVmZXJlbnQgPSByOwogICAgICAgICBxdWV1ZSA9IHE7CiAgICAgfQpAQCAtMTE5LDUgKzEzMiw0IEBACiAvLyAgICAgICAgcmV0dXJuIHN1cGVyLmdldCgpOwogLy8gICAgfQogLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotICAgIAogfQpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2UuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlLmphdmEKaW5kZXggNWE4YTE5Yi4uODEzY2M4OSAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2UuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZS5qYXZhCkBAIC0xNCw2ICsxNCwyMSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiBwYWNrYWdlIGphdmEubGFuZy5yZWY7CiAKQEAgLTgyLDcgKzk3LDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgV2Vha1JlZmVyZW5jZShUIHIpIHsKICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgCiAgICAgICAgIHJlZmVyZW50ID0gcjsKICAgICB9CiAKQEAgLTk5LDkgKzExMyw3IEBACiAgICAgICovCiAgICAgcHVibGljIFdlYWtSZWZlcmVuY2UoVCByLCBSZWZlcmVuY2VRdWV1ZTw/IHN1cGVyIFQ+IHEpIHsKICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgCiAgICAgICAgIHJlZmVyZW50ID0gcjsKICAgICAgICAgcXVldWUgPSBxOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9BY2Nlc3NpYmxlT2JqZWN0LmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QuamF2YQppbmRleCAzNDlkMzEzLi40MzgxODc3IDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QuamF2YQpAQCAtMTQsNDEgKzE0LDU1IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uUmVmbGVjdGlvbkFjY2VzczsKLS8vIEVORCBhbmRyb2lkLWFkZGVkCi0KIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uUmVmbGVjdGlvbkFjY2VzczsKKwogLyoqCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIFZNIHZlbmRvci4gVGhpcyBjbGFzcyBpcyB0aGUgc3VwZXJjbGFzcwotICogb2YgYWxsIG1lbWJlciByZWZsZWN0IGNsYXNzZXMgKEZpZWxkLCBDb25zdHJ1Y3RvciwgTWV0aG9kKS4gQWNjZXNzaWJsZU9iamVjdAotICogcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdG9nZ2xlIGFjY2VzcyBjaGVja3MgZm9yIHRoZXNlIG9iamVjdHMuIEJ5IGRlZmF1bHQKLSAqIGFjY2Vzc2luZyBhIG1lbWJlciAoZm9yIGV4YW1wbGUsIHNldHRpbmcgYSBmaWVsZCBvciBpbnZva2luZyBhIG1ldGhvZCkgY2hlY2tzCi0gKiB0aGUgdmFsaWRpdHkgb2YgdGhlIGFjY2VzcyAoZm9yIGV4YW1wbGUsIGludm9raW5nIGEgcHJpdmF0ZSBtZXRob2QgZnJvbQotICogb3V0c2lkZSB0aGUgZGVmaW5pbmcgY2xhc3MgaXMgcHJvaGliaXRlZCkgYW5kIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gKiBpZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQuIElmIHRoZSBhY2Nlc3NpYmxlIGZsYWcgaXMgc2V0IHRvIHRydWUsCi0gKiB0aGVzZSBjaGVja3MgYXJlIG9taXR0ZWQuIFRoaXMgYWxsb3dzIHByaXZpbGVnZWQgYXBwbGljYXRpb25zIHN1Y2ggYXMgSmF2YQotICogT2JqZWN0IFNlcmlhbGl6YXRpb24sIGluc3BlY3RvcnMsIGFuZCBkZWJ1Z2dlcnMgdG8gaGF2ZSBjb21wbGV0ZSBhY2Nlc3MgdG8KKyAqIHtAY29kZSBBY2Nlc3NpYmxlT2JqZWN0fSBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgbWVtYmVyIHJlZmxlY3Rpb24gY2xhc3NlcworICogKEZpZWxkLCBDb25zdHJ1Y3RvciwgTWV0aG9kKS4gQWNjZXNzaWJsZU9iamVjdCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byB0b2dnbGUKKyAqIGEgZmxhZyBjb250cm9sbGluZyBhY2Nlc3MgY2hlY2tzIGZvciB0aGVzZSBvYmplY3RzLiBCeSBkZWZhdWx0LCBhY2Nlc3NpbmcgYQorICogbWVtYmVyIChmb3IgZXhhbXBsZSwgc2V0dGluZyBhIGZpZWxkIG9yIGludm9raW5nIGEgbWV0aG9kKSBjaGVja3MgdGhlCisgKiB2YWxpZGl0eSBvZiB0aGUgYWNjZXNzIChmb3IgZXhhbXBsZSwgaW52b2tpbmcgYSBwcml2YXRlIG1ldGhvZCBmcm9tIG91dHNpZGUKKyAqIHRoZSBkZWZpbmluZyBjbGFzcyBpcyBwcm9oaWJpdGVkKSBhbmQgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWYgdGhlCisgKiBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZC4gSWYgdGhlIGFjY2Vzc2libGUgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgdGhlc2UKKyAqIGNoZWNrcyBhcmUgb21pdHRlZC4gVGhpcyBhbGxvd3MgcHJpdmlsZWdlZCBjb2RlLCBzdWNoIGFzIEphdmEgb2JqZWN0CisgKiBzZXJpYWxpemF0aW9uLCBvYmplY3QgaW5zcGVjdG9ycywgYW5kIGRlYnVnZ2VycyB0byBoYXZlIGNvbXBsZXRlIGFjY2VzcyB0bwogICogb2JqZWN0cy4KICAqIAogICogQHNlZSBGaWVsZAogICogQHNlZSBDb25zdHJ1Y3RvcgogICogQHNlZSBNZXRob2QKICAqIEBzZWUgUmVmbGVjdFBlcm1pc3Npb24KKyAqIAogICogQHNpbmNlIDEuMgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmxlT2JqZWN0IGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudCB7CiAKICAgICAvLyBJZiB0cnVlLCBvYmplY3QgaXMgYWNjZXNzaWJsZSwgYnlwYXNzaW5nIG5vcm1hbCBzZWN1cml0eSBjaGVja3MKICAgICBib29sZWFuIGZsYWcgPSBmYWxzZTsKIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAvKioKICAgICAgKiBvbmUgZGltZW5zaW9uYWwgYXJyYXkKICAgICAgKi8KQEAgLTYzLDcgKzc3LDYgQEAKICAgICAgKiB0aHJlZSBkaW1lbnNpb25hbCBhcnJheQogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESU1FTlNJT05fMyA9ICJbXVtdW10iOwotICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgCiAgICAgLy8gSG9sZHMgYSBtYXBwaW5nIGZyb20gSmF2YSB0eXBlIG5hbWVzIHRvIG5hdGl2ZSB0eXBlIGNvZGVzLgogICAgIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHRyYW5zOwpAQCAtODAsMTkgKzkzLDI2IEBACiAgICAgICAgIHRyYW5zLnB1dCgidm9pZCIsICJWIik7CiAgICAgICAgIHRyYW5zLnB1dCgiYm9vbGVhbiIsICJaIik7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQXR0ZW1wdHMgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgYWNjZXNzaWJsZSBmbGFnIGZvciBhbGwgdGhlIG9iamVjdHMgaW4KICAgICAgKiB0aGUgYXJyYXkgcHJvdmlkZWQuIE9ubHkgb25lIHNlY3VyaXR5IGNoZWNrIGlzIHBlcmZvcm1lZC4gU2V0dGluZyB0aGlzCi0gICAgICogZmxhZyB0byBmYWxzZSB3aWxsIGVuYWJsZSBhY2Nlc3MgY2hlY2tzLCBzZXR0aW5nIHRvIHRydWUgd2lsbCBkaXNhYmxlCi0gICAgICogdGhlbS4gSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyLCBjaGVja1Blcm1pc3Npb24gaXMgY2FsbGVkIHdpdGggYQotICAgICAqIFJlZmxlY3RQZXJtaXNzaW9uKCJzdXBwcmVzc0FjY2Vzc0NoZWNrcyIpLgorICAgICAqIGZsYWcgdG8ge0Bjb2RlIGZhbHNlfSB3aWxsIGVuYWJsZSBhY2Nlc3MgY2hlY2tzLCBzZXR0aW5nIHRvIHtAY29kZSB0cnVlfQorICAgICAqIHdpbGwgZGlzYWJsZSB0aGVtLiBJZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIsIGNoZWNrUGVybWlzc2lvbiBpcworICAgICAqIGNhbGxlZCB3aXRoIGEge0Bjb2RlIFJlZmxlY3RQZXJtaXNzaW9uKCJzdXBwcmVzc0FjY2Vzc0NoZWNrcyIpfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0cyB0aGUgYWNjZXNzaWJsZSBvYmplY3RzCi0gICAgICogQHBhcmFtIGZsYWcgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGFjY2Vzc2libGUgZmxhZworICAgICAqIEBwYXJhbSBvYmplY3RzCisgICAgICogICAgICAgICAgICB0aGUgYWNjZXNzaWJsZSBvYmplY3RzCisgICAgICogQHBhcmFtIGZsYWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBhY2Nlc3NpYmxlIGZsYWcKKyAgICAgKiAgICAgICAgICAgIAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdCBpcyBkZW5pZWQKKyAgICAgKiAgICAgICAgICAgICAKICAgICAgKiBAc2VlICNzZXRBY2Nlc3NpYmxlKGJvb2xlYW4pCiAgICAgICogQHNlZSBSZWZsZWN0UGVybWlzc2lvbgotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIHJlcXVlc3QgaXMgZGVuaWVkCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFjY2Vzc2libGUoQWNjZXNzaWJsZU9iamVjdFtdIG9iamVjdHMsIGJvb2xlYW4gZmxhZykKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CkBAIC0xMDksMTggKzEyOSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFjY2Vzc2libGVPYmplY3QgY29uc3RydWN0b3IuIEFjY2Vzc2libGVPYmplY3RzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkKLSAgICAgKiB0aGUgVmlydHVhbCBNYWNoaW5lLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjY2Vzc2libGVPYmplY3R9IGluc3RhbmNlLiB7QGNvZGUKKyAgICAgKiBBY2Nlc3NpYmxlT2JqZWN0fSBpbnN0YW5jZXMgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgYnkgdGhlIHZpcnR1YWwKKyAgICAgKiBtYWNoaW5lLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBBY2Nlc3NpYmxlT2JqZWN0KCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhY2Nlc3NpYmxlIGZsYWcuIFRoaXMgaXMgZmFsc2UgaWYgYWNjZXNzIGNoZWNrcwotICAgICAqIGFyZSBwZXJmb3JtZWQsIHRydWUgaWYgdGhleSBhcmUgc2tpcHBlZC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9iamVjdCBpcyBhY2Nlc3NpYmxlIHdpdGhvdXQgc2VjdXJpdHkgY2hlY2tzIGJlaW5nCisgICAgICogcGVyZm9ybWVkLiBSZXR1cm5zIHRoZSBhY2Nlc3NpYmxlIGZsYWcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGFjY2Vzc2libGUgZmxhZworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgb2JqZWN0IGlzIGFjY2Vzc2libGUgd2l0aG91dCBzZWN1cml0eQorICAgICAqICAgICAgICAgY2hlY2tzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlKCkgewogICAgICAgICByZXR1cm4gZmxhZzsKQEAgLTEyOCwxMyArMTU0LDE5IEBACiAKICAgICAvKioKICAgICAgKiBBdHRlbXB0cyB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBhY2Nlc3NpYmxlIGZsYWcuIFNldHRpbmcgdGhpcyBmbGFnIHRvCi0gICAgICogZmFsc2Ugd2lsbCBlbmFibGUgYWNjZXNzIGNoZWNrcywgc2V0dGluZyB0byB0cnVlIHdpbGwgZGlzYWJsZSB0aGVtLiBJZgotICAgICAqIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciwgY2hlY2tQZXJtaXNzaW9uIGlzIGNhbGxlZCB3aXRoIGEKLSAgICAgKiBSZWZsZWN0UGVybWlzc2lvbigic3VwcHJlc3NBY2Nlc3NDaGVja3MiKS4KKyAgICAgKiB7QGNvZGUgZmFsc2V9IHdpbGwgZW5hYmxlIGFjY2VzcyBjaGVja3MsIHNldHRpbmcgdG8ge0Bjb2RlIHRydWV9IHdpbGwKKyAgICAgKiBkaXNhYmxlIHRoZW0uIElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciwgY2hlY2tQZXJtaXNzaW9uIGlzIGNhbGxlZAorICAgICAqIHdpdGggYSB7QGNvZGUgUmVmbGVjdFBlcm1pc3Npb24oInN1cHByZXNzQWNjZXNzQ2hlY2tzIil9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmbGFnIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBhY2Nlc3NpYmxlIGZsYWcKKyAgICAgKiBAcGFyYW0gZmxhZworICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGFjY2Vzc2libGUgZmxhZworICAgICAqICAgICAgICAgICAgCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0IGlzIGRlbmllZAorICAgICAqICAgICAgICAgICAgIAogICAgICAqIEBzZWUgUmVmbGVjdFBlcm1pc3Npb24KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSByZXF1ZXN0IGlzIGRlbmllZAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc2libGUoYm9vbGVhbiBmbGFnKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc21nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTE0NSwyNCArMTc3LDE2IEBACiAgICAgICAgIHRoaXMuZmxhZyA9IGZsYWc7CiAgICAgfQogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGFjY2Vzc2libGUgZmxhZyBvbiB0aGlzIGluc3RhbmNlIHdpdGhvdXQgZG9pbmcgYW55IGNoZWNrcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmxhZyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgYWNjZXNzaWJsZSBmbGFnCisgICAgICogQHBhcmFtIGZsYWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBhY2Nlc3NpYmxlIGZsYWcKICAgICAgKi8KICAgICAvKnBhY2thZ2UqLyB2b2lkIHNldEFjY2Vzc2libGVOb0NoZWNrKGJvb2xlYW4gZmxhZykgewogICAgICAgICB0aGlzLmZsYWcgPSBmbGFnOwogICAgIH0KLSAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgIAotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgd2hldGhlciBhIGdpdmVuIEFubm90YXRpb24gaXMgcHJlc2VudCBvbiB0aGUgQWNjZXNzaWJsZU9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUgVGhlIHR5cGUgb2YgQW5ub3RhdGlvbiB0byBsb29rIGZvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGdpdmVuIEFubm90YXRpb24gaXMgcHJlc2VudC4KLSAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSkgewogICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZSkgIT0gbnVsbDsKICAgICB9CkBAIC0xNzgsMTMgKzIwMiwxNSBAQAogCiAgICAgLyogc2xvdywgYnV0IHdvcmtzIGZvciBhbGwgc3ViLWNsYXNzZXMgKi8KICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBUIGdldEFubm90YXRpb24oQ2xhc3M8VD4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25UeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CiAgICAgICAgIEFubm90YXRpb25bXSBhbm5vcyA9IGdldEFubm90YXRpb25zKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSBhbm5vcy5sZW5ndGgtMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgIGlmIChhbm5vc1tpXS5hbm5vdGF0aW9uVHlwZSgpID09IGFubm90YXRpb25UeXBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBhbm5vc1tpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtMTkyLDEwICsyMTgsMTEgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBzaWduYXR1cmUgZm9yIGEgY2xhc3MuIFRoaXMgaXMgdGhlIGtpbmQgb2Ygc2lnbmF0dXJlIHVzZWQKICAgICAgKiBpbnRlcm5hbGx5IGJ5IHRoZSBKVk0sIHdpdGggb25lLWNoYXJhY3RlciBjb2RlcyByZXByZXNlbnRpbmcgdGhlIGJhc2ljCiAgICAgICogdHlwZXMuIEl0IGlzIG5vdCBzdWl0YWJsZSBmb3IgcHJpbnRpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenoKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBmb3Igd2hpY2ggYSBzaWduYXR1cmUgaXMgcmVxdWlyZWQKICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIGZvciB3aGljaCBhIHNpZ25hdHVyZSBpcyByZXF1aXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzaWduYXR1cmUgYXMgYSBzdHJpbmcuCisgICAgICogQHJldHVybiBUaGUgc2lnbmF0dXJlIGFzIGEgc3RyaW5nCiAgICAgICovCiAgICAgU3RyaW5nIGdldFNpZ25hdHVyZShDbGFzczw/PiBjbGF6eikgewogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7CkBAIC0yMTYsMTIgKzI0MywxMyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBwcmludGFibGUgU3RyaW5nIGNvbnNpc3Rpbmcgb2YgdGhlIGNhbm9uaWNhbCBuYW1lcyBvZiB0aGUKICAgICAgKiBjbGFzc2VzIGNvbnRhaW5lZCBpbiBhbiBhcnJheS4gVGhlIGZvcm0gaXMgdGhhdCB1c2VkIGluIHBhcmFtZXRlciBhbmQKLSAgICAgKiBleGNlcHRpb24gbGlzdHMsIHRoYXQgaXMsIHRoZSBjbGFzcyBvciB0eXBlIG5hbWVzICBhcmUgc2VwYXJhdGVkIGJ5Ci0gICAgICogY29tbWFzLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHR5cGVzIFRoZSBhcnJheSBvZiBjbGFzc2VzLgorICAgICAqIGV4Y2VwdGlvbiBsaXN0cywgdGhhdCBpcywgdGhlIGNsYXNzIG9yIHR5cGUgbmFtZXMgYXJlIHNlcGFyYXRlZCBieQorICAgICAqIGNvbW1hcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNsYXNzZXMKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgb2YgbmFtZXMuCisgICAgICogQHJldHVybiBUaGUgU3RyaW5nIG9mIG5hbWVzCiAgICAgICovCiAgICAgU3RyaW5nIHRvU3RyaW5nKENsYXNzPD8+W10gdHlwZXMpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMjM3LDExICsyNjUsOSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgfQogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCi0gICAgCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgU2lnbmF0dXJlIGF0dHJpYnV0ZSBmb3IgdGhpcyBpbnN0YW5jZS4gUmV0dXJucwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KKyAgICAgKiBHZXRzIHRoZSBTaWduYXR1cmUgYXR0cmlidXRlIGZvciB0aGlzIGluc3RhbmNlLiBSZXR1cm5zIHtAY29kZSBudWxsfQorICAgICAqIGlmIG5vdCBmb3VuZC4KICAgICAgKi8KICAgICAvKnBhY2thZ2UqLyBTdHJpbmcgZ2V0U2lnbmF0dXJlQXR0cmlidXRlKCkgewogICAgICAgICAvKgpAQCAtMjczLDEyICsyOTksOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBPYmplY3RbXSBnZXRDbGFzc1NpZ25hdHVyZUFubm90YXRpb24oQ2xhc3MgY2xhenopOwogCi0gICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAotCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpbnN0YW5jZSBvZiB7QGxpbmsgUmVmbGVjdGlvbkFjY2Vzc0ltcGx9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBub24tbnVsbDsgdGhlIHVuaXF1ZSBpbnN0YW5jZQogICAgICAqLwogICAgIHN0YXRpYyAvKnBhY2thZ2UqLyBSZWZsZWN0aW9uQWNjZXNzIGdldFJlZmxlY3Rpb25BY2Nlc3MoKSB7CkBAIC0yODksOSArMzEyLDEwIEBACiAgICAgLyoqCiAgICAgICogQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUgdG8gdGhlIGJ1ZmZlci4gVGhlIGNsYXNzIG1heSByZXByZXNlbnQKICAgICAgKiBhIHNpbXBsZSB0eXBlLCBhIHJlZmVyZW5jZSB0eXBlIG9yIGFuIGFycmF5IHR5cGUuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gc2IgYnVmZmVyCiAgICAgICogQHBhcmFtIG9iaiB0aGUgY2xhc3Mgd2hpY2ggbmFtZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIGJ1ZmZlcgorICAgICAqIAogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgbnVsbCAKICAgICAgKi8KICAgICB2b2lkIGFwcGVuZEFycmF5VHlwZShTdHJpbmdCdWlsZGVyIHNiLCBDbGFzczw/PiBvYmopIHsKQEAgLTMyOCw5ICszNTIsMTAgQEAKICAgICAgKiBBcHBlbmRzIG5hbWVzIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgY2xhc3NlcyB0byB0aGUgYnVmZmVyLiBUaGUgYXJyYXkKICAgICAgKiBlbGVtZW50cyBtYXkgcmVwcmVzZW50IGEgc2ltcGxlIHR5cGUsIGEgcmVmZXJlbmNlIHR5cGUgb3IgYW4gYXJyYXkgdHlwZS4KICAgICAgKiBPdXRwdXQgZm9ybWF0OiBqYXZhLmxhbmcuT2JqZWN0W10sIGphdmEuaW8uRmlsZSwgdm9pZAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHNiIGJ1ZmZlcgogICAgICAqIEBwYXJhbSBvYmpzIGFycmF5IG9mIGNsYXNzZXMgdG8gcHJpbnQgdGhlIG5hbWVzCisgICAgICogCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBudWxsIAogICAgICAqLwogICAgIHZvaWQgYXBwZW5kQXJyYXlUeXBlKFN0cmluZ0J1aWxkZXIgc2IsIENsYXNzW10gb2JqcykgewpAQCAtMzQ3LDkgKzM3MiwxMCBAQAogICAgICAqIEFwcGVuZHMgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCBhcnJheSBjbGFzc2VzIHRvIHRoZSBidWZmZXIuIFRoZSBhcnJheQogICAgICAqIGVsZW1lbnRzIG1heSByZXByZXNlbnQgYSBzaW1wbGUgdHlwZSwgYSByZWZlcmVuY2UgdHlwZSBvciBhbiBhcnJheSB0eXBlLgogICAgICAqIE91dHB1dCBmb3JtYXQ6IGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5pby5GaWxlLCB2b2lkCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gc2IgYnVmZmVyCiAgICAgICogQHBhcmFtIG9ianMgYXJyYXkgb2YgY2xhc3NlcyB0byBwcmludCB0aGUgbmFtZXMKKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIG51bGwgCiAgICAgICovCiAgICAgdm9pZCBhcHBlbmRBcnJheUdlbmVyaWNUeXBlKFN0cmluZ0J1aWxkZXIgc2IsIFR5cGVbXSBvYmpzKSB7CkBAIC0zNjQsOSArMzkwLDEwIEBACiAKICAgICAvKioKICAgICAgKiBBcHBlbmRzIHRoZSBnZW5lcmljIHR5cGUgcmVwcmVzZW50YXRpb24gdG8gdGhlIGJ1ZmZlci4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBzYiBidWZmZXIKICAgICAgKiBAcGFyYW0gb2JqIHRoZSBnZW5lcmljIHR5cGUgd2hpY2ggcmVwcmVzZW50YXRpb24gc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBidWZmZXIKKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIG51bGwgCiAgICAgICovCiAgICAgdm9pZCBhcHBlbmRHZW5lcmljVHlwZShTdHJpbmdCdWlsZGVyIHNiLCBUeXBlIG9iaikgewpAQCAtNDIxLDkgKzQ0OCwxMCBAQAogICAgICAqIEluIGNhc2UgaWYgdGhlIHNwZWNpZmllZCBhcnJheSBlbGVtZW50IHJlcHJlc2VudHMgYW4gYXJyYXkgdHlwZSBpdHMKICAgICAgKiBpbnRlcm5hbCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBidWZmZXIuICAgCiAgICAgICogT3V0cHV0IGZvcm1hdDogW0xqYXZhLmxhbmcuT2JqZWN0OywgamF2YS5pby5GaWxlLCB2b2lkCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gc2IgYnVmZmVyCiAgICAgICogQHBhcmFtIG9ianMgYXJyYXkgb2YgY2xhc3NlcyB0byBwcmludCB0aGUgbmFtZXMKKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIG51bGwgCiAgICAgICovCiAgICAgdm9pZCBhcHBlbmRTaW1wbGVUeXBlKFN0cmluZ0J1aWxkZXIgc2IsIENsYXNzPD8+W10gb2JqcykgewpAQCAtNDM1LDUgKzQ2Myw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIH0KZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvQXJyYXkuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvQXJyYXkuamF2YQppbmRleCBjYTM3ZDkwLi5kNjMzZTY5IDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0FycmF5LmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9BcnJheS5qYXZhCkBAIC0xNCwzOCArMTQsNTggQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgdG8gZHluYW1pY2FsbHkgY3JlYXRlIGFuZCBhY2Nlc3MgYXJyYXlzLgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyB0byBjcmVhdGUgYW5kIGFjY2VzcyBhcnJheXMgZHluYW1pY2FsbHkuCisgKgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBBcnJheSB7CiAgICAgCiAgICAgLyoqCi0gICAgICogUHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkCisgICAgICogUHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLgogICAgICAqLwogICAgIHByaXZhdGUgQXJyYXkoKXsKICAgICAgICAgLy9kbyBub3RoaW5nCiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gVGhpcyByZXByb2R1Y2VzCi0gICAgICogdGhlIGVmZmVjdCBvZiA8Y29kZT5hcnJheVtpbmRleF08L2NvZGU+IElmIHRoZSBhcnJheSBjb21wb25lbnQgaXMgYQotICAgICAqIGJhc2UgdHlwZSwgdGhlIHJlc3VsdCBpcyBhdXRvbWF0aWNhbGx5IHdyYXBwZWQuCi0gICAgICogCisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gVGhpcyByZXByb2R1Y2VzCisgICAgICogdGhlIGVmZmVjdCBvZiB7QGNvZGUgYXJyYXlbaW5kZXhdfS4gSWYgdGhlIGFycmF5IGNvbXBvbmVudCBpcyBhIHByaW1pdGl2ZQorICAgICAqIHR5cGUsIHRoZSByZXN1bHQgaXMgYXV0b21hdGljYWxseSB3cmFwcGVkLgorICAgICAqCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAorICAgICAqICAgICAgICAgICAgCiAgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGVsZW1lbnQsIHBvc3NpYmx5IHdyYXBwZWQKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG5vdCBhbiBhcnJheQotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzIC0tIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBhcnJheSBsZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhcnJheX0gaXMgbm90IGFuIGFycmF5CisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgIGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJheS5sZW5ndGh9CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE9iamVjdCBhcnJheSwgaW50IGluZGV4KQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTgzLDIzICsxMDMsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGNvbnZlcnRlZCB0byBhCi0gICAgICogYm9vbGVhbiBpZiBwb3NzaWJsZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YKLSAgICAgKiA8Y29kZT5hcnJheVtpbmRleF08L2NvZGU+CisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgY29udmVydGVkIHRvIGEKKyAgICAgKiB7QGNvZGUgYm9vbGVhbn0sIGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUKKyAgICAgKiBhcnJheVtpbmRleF19CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSByZXF1ZXN0ZWQgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgYXQgdGhlCisgICAgICogICAgICAgICAgICAgaW5kZXggcG9zaXRpb24gY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHJldHVybiB0eXBlCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihPYmplY3QgYXJyYXksIGludCBpbmRleCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7CkBAIC0xMTUsMjIgKzEzOCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgY29udmVydGVkIHRvIGEKLSAgICAgKiBieXRlIGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5hcnJheVtpbmRleF08L2NvZGU+CisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgY29udmVydGVkIHRvIGEKKyAgICAgKiB7QGNvZGUgYnl0ZX0sIGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUKKyAgICAgKiBhcnJheVtpbmRleF19CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSByZXF1ZXN0ZWQgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgYXQgdGhlCisgICAgICogICAgICAgICAgICAgaW5kZXggcG9zaXRpb24gY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHJldHVybiB0eXBlCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0Qnl0ZShPYmplY3QgYXJyYXksIGludCBpbmRleCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7CkBAIC0xNDIsMjIgKzE2OSwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgY29udmVydGVkIHRvIGEKLSAgICAgKiBjaGFyIGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5hcnJheVtpbmRleF08L2NvZGU+CisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgY29udmVydGVkIHRvIGEKKyAgICAgKiB7QGNvZGUgY2hhcn0sIGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUKKyAgICAgKiBhcnJheVtpbmRleF19CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSByZXF1ZXN0ZWQgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgYXQgdGhlCisgICAgICogICAgICAgICAgICAgaW5kZXggcG9zaXRpb24gY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHJldHVybiB0eXBlCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNoYXIgZ2V0Q2hhcihPYmplY3QgYXJyYXksIGludCBpbmRleCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7CkBAIC0xNzMsMjMgKzIwNCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgY29udmVydGVkIHRvIGEKLSAgICAgKiBkb3VibGUgaWYgcG9zc2libGUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mCi0gICAgICogPGNvZGU+YXJyYXlbaW5kZXhdPC9jb2RlPgorICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGNvbnZlcnRlZCB0byBhCisgICAgICoge0Bjb2RlIGRvdWJsZX0sIGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUKKyAgICAgKiBhcnJheVtpbmRleF19CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSByZXF1ZXN0ZWQgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgYXQgdGhlCisgICAgICogICAgICAgICAgICAgaW5kZXggcG9zaXRpb24gY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHJldHVybiB0eXBlCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewpAQCAtMjAxLDIzICsyMzUsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGNvbnZlcnRlZCB0byBhCi0gICAgICogZmxvYXQgaWYgcG9zc2libGUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mCi0gICAgICogPGNvZGU+YXJyYXlbaW5kZXhdPC9jb2RlPgorICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGNvbnZlcnRlZCB0byBhCisgICAgICoge0Bjb2RlIGZsb2F0fSwgaWYgcG9zc2libGUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZQorICAgICAqIGFycmF5W2luZGV4XX0KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKICAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheQogICAgICAqIEBwYXJhbSBpbmRleAogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4CisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgZWxlbWVudCBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gdGhlIHJlcXVlc3RlZCB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzIC0tIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBhcnJheSBsZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYXJyYXl9IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgZWxlbWVudCBhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICBpbmRleCBwb3NpdGlvbiBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byB0aGUgcmV0dXJuIHR5cGUKKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RofQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0RmxvYXQoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewpAQCAtMjI5LDIyICsyNjYsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGNvbnZlcnRlZCB0byBhbgotICAgICAqIGludCBpZiBwb3NzaWJsZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+YXJyYXlbaW5kZXhdPC9jb2RlPgorICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGNvbnZlcnRlZCB0byBhbgorICAgICAqIHtAY29kZSBpbnR9LCBpZiBwb3NzaWJsZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlCisgICAgICogYXJyYXlbaW5kZXhdfQogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQogICAgICAqICAgICAgICAgICAgdGhlIGFycmF5CiAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXgKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgZWxlbWVudAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5IG9yIHRoZSBlbGVtZW50IGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgcmVxdWVzdGVkIHR5cGUgYnkgYSB3aWRlbmluZyBjb252ZXJzaW9uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMgLS0gbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGFycmF5IGxlbmd0aAorICAgICAqIAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGFycmF5fSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhcnJheX0gaXMgbm90IGFuIGFycmF5IG9yIHRoZSBlbGVtZW50IGF0IHRoZQorICAgICAqICAgICAgICAgICAgIGluZGV4IHBvc2l0aW9uIGNhbiBub3QgYmUgY29udmVydGVkIHRvIHRoZSByZXR1cm4gdHlwZQorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJheS5sZW5ndGh9CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KE9iamVjdCBhcnJheSwgaW50IGluZGV4KQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTI1NiwxNiArMjk3LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZgotICAgICAqIDxjb2RlPmFycmF5Lmxlbmd0aDwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUKKyAgICAgKiBhcnJheS5sZW5ndGh9CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGgKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG5vdCBhbiBhcnJheQorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYXJyYXl9IGlzIG5vdCBhbiBhcnJheQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldExlbmd0aChPYmplY3QgYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgT2JqZWN0W10pCkBAIC0zMDAsMjQgKzM0NSwyOCBAQAogICAgICAgICAKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IGFuIGFycmF5Iik7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBjb252ZXJ0ZWQgdG8gYQotICAgICAqIGxvbmcgaWYgcG9zc2libGUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPmFycmF5W2luZGV4XTwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBjb252ZXJ0ZWQgdG8gYQorICAgICAqIHtAY29kZSBsb25nfSwgaWYgcG9zc2libGUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZQorICAgICAqIGFycmF5W2luZGV4XX0KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKICAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheQogICAgICAqIEBwYXJhbSBpbmRleAogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4CisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgZWxlbWVudCBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gdGhlIHJlcXVlc3RlZCB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzIC0tIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBhcnJheSBsZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYXJyYXl9IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgZWxlbWVudCBhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICBpbmRleCBwb3NpdGlvbiBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byB0aGUgcmV0dXJuIHR5cGUKKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RofQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nKE9iamVjdCBhcnJheSwgaW50IGluZGV4KQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTMyOSwyMyArMzc4LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBjb252ZXJ0ZWQgdG8gYQotICAgICAqIHNob3J0IGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZgotICAgICAqIDxjb2RlPmFycmF5W2luZGV4XTwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBjb252ZXJ0ZWQgdG8gYQorICAgICAqIHtAY29kZSBzaG9ydH0sIGlmIHBvc3NpYmxlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUKKyAgICAgKiBhcnJheVtpbmRleF19CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSByZXF1ZXN0ZWQgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIGVsZW1lbnQgYXQgdGhlCisgICAgICogICAgICAgICAgICAgaW5kZXggcG9zaXRpb24gY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHJldHVybiB0eXBlCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHNob3J0IGdldFNob3J0KE9iamVjdCBhcnJheSwgaW50IGluZGV4KQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTM1NiwyNCArNDA4LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgbmV3IG11bHRpZGltZW5zaW9uYWwgYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgdHlwZSBhbmQKLSAgICAgKiBkaW1lbnNpb25zLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZgotICAgICAqIDxjb2RlPm5ldyBjb21wb25lbnRUeXBlW2QwXVtkMV0uLi5bZG5dPC9jb2RlPiBmb3IgYSBkaW1lbnNpb25zIGFycmF5IG9mIHsKLSAgICAgKiBkMCwgZDEsIC4uLiAsIGRuIH0KKyAgICAgKiBSZXR1cm5zIGEgbmV3IG11bHRpZGltZW5zaW9uYWwgYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgdHlwZSBhbmQKKyAgICAgKiBkaW1lbnNpb25zLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgbmV3CisgICAgICogY29tcG9uZW50VHlwZVtkMF1bZDFdLi4uW2RuXX0gZm9yIGEgZGltZW5zaW9ucyBhcnJheSBvZiB7IGQwLCBkMSwgLi4uICwKKyAgICAgKiBkbiB9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlCiAgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIG5ldyBhcnJheQogICAgICAqIEBwYXJhbSBkaW1lbnNpb25zCiAgICAgICogICAgICAgICAgICB0aGUgZGltZW5zaW9ucyBvZiB0aGUgbmV3IGFycmF5CisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbmV3IGFycmF5Ci0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBkaW1lbnNpb25zIGFyZSBuZWdhdGl2ZQotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBvZiBkaW1lbnNpb25zIGlzIG9mIHNpemUgemVybywgb3IgZXhjZWVkcyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBsaW1pdCBvZiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbiBmb3IgYW4gYXJyYXkgKGN1cnJlbnRseQotICAgICAqICAgICAgICAgICAgICAgIDI1NSkKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbXBvbmVudCB0eXBlIGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGRpbWVuc2lvbnMgYXJlIG5lZ2F0aXZlCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgb2YgZGltZW5zaW9ucyBpcyBvZiBzaXplIHplcm8sIG9yIGV4Y2VlZHMgdGhlCisgICAgICogICAgICAgICAgICAgbGltaXQgb2YgdGhlIG51bWJlciBvZiBkaW1lbnNpb24gZm9yIGFuIGFycmF5IChjdXJyZW50bHkgMjU1KQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzPD8+IGNvbXBvbmVudFR5cGUsIGludFtdIGRpbWVuc2lvbnMpCiAgICAgICAgICAgICB0aHJvd3MgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CkBAIC0zOTQsMjAgKzQ0OSwyNCBAQAogICAgICAqLwogICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlTXVsdGlBcnJheShDbGFzczw/PiBjb21wb25lbnRUeXBlLAogICAgICAgICBpbnRbXSBkaW1lbnNpb25zKSB0aHJvd3MgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb247Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgdHlwZSBhbmQgbGVuZ3RoLiBUaGlzCi0gICAgICogcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPm5ldyBjb21wb25lbnRUeXBlW3NpemVdPC9jb2RlPgotICAgICAqIAorICAgICAqIFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgdHlwZSBhbmQgbGVuZ3RoLiBUaGlzCisgICAgICogcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZSBuZXcgY29tcG9uZW50VHlwZVtzaXplXX0uCisgICAgICoKICAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZQogICAgICAqICAgICAgICAgICAgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBuZXcgYXJyYXkKICAgICAgKiBAcGFyYW0gc2l6ZQogICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IGFycmF5CisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbmV3IGFycmF5Ci0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHNpemUgaWYgbmVnYXRpdmUKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbXBvbmVudCB0eXBlIGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNpemUgPCAwfQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzPD8+IGNvbXBvbmVudFR5cGUsIGludCBzaXplKQogICAgICAgICAgICAgdGhyb3dzIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIHsKQEAgLTQ1MSw5ICs1MTAsOSBAQAogICAgICAgICBpbnQgbGVuZ3RoKSB0aHJvd3MgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb247CiAgICAgCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSB2YWx1ZS4gVGhpcwotICAgICAqIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5hcnJheVtpbmRleF0gPSB2YWx1ZTwvY29kZT4gSWYgdGhlIGFycmF5Ci0gICAgICogY29tcG9uZW50IGlzIGEgYmFzZSB0eXBlLCB0aGUgdmFsdWUgaXMgYXV0b21hdGljYWxseSB1bndyYXBwZWQKKyAgICAgKiBTZXRzIHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSB2YWx1ZS4gVGhpcworICAgICAqIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgYXJyYXlbaW5kZXhdID0gdmFsdWV9LiBJZiB0aGUgYXJyYXkKKyAgICAgKiBjb21wb25lbnQgaXMgYSBwcmltaXRpdmUgdHlwZSwgdGhlIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgdW53cmFwcGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQogICAgICAqICAgICAgICAgICAgdGhlIGFycmF5CkBAIC00NjEsMTQgKzUyMCwxNiBAQAogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4CiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgYXJyYXkgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgYXJyYXkgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSAgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCBhcnJheSwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewpAQCAtNTA3LDEwICs1NjgsMTEgQEAKICAgICAgICAgICAgICAgICBzZXREb3VibGUoYXJyYXksIGluZGV4LCAoKERvdWJsZSkgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSBib29sZWFuIHZhbHVlLgotICAgICAqIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPmFycmF5W2luZGV4XSA9IHZhbHVlPC9jb2RlPgorICAgICAqIFNldHMgdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIHtAY29kZQorICAgICAqIGJvb2xlYW59IHZhbHVlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgYXJyYXlbaW5kZXhdID0KKyAgICAgKiB2YWx1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKQEAgLTUxOCwxNCArNTgwLDE2IEBACiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXgKICAgICAgKiBAcGFyYW0gdmFsdWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgdmFsdWUgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSBhcnJheSB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzIC0tIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBhcnJheSBsZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgYXJyYXkgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSAgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Qm9vbGVhbihPYmplY3QgYXJyYXksIGludCBpbmRleCwgYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBib29sZWFuW10pIHsKQEAgLTUzNiw4ICs2MDAsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgYnl0ZSB2YWx1ZS4KLSAgICAgKiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5hcnJheVtpbmRleF0gPSB2YWx1ZTwvY29kZT4KKyAgICAgKiBTZXRzIHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSB7QGNvZGUgYnl0ZX0KKyAgICAgKiB2YWx1ZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIGFycmF5W2luZGV4XSA9IHZhbHVlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKICAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheQpAQCAtNTQ1LDE0ICs2MDksMTYgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAogICAgICAqIEBwYXJhbSB2YWx1ZQogICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5IG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gdGhlIGFycmF5IHR5cGUgYnkgYSB3aWRlbmluZyBjb252ZXJzaW9uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMgLS0gbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGFycmF5IGxlbmd0aAorICAgICAqIAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGFycmF5fSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgdmFsdWUgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSBhcnJheSB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlICBpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RofQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCeXRlKE9iamVjdCBhcnJheSwgaW50IGluZGV4LCBieXRlIHZhbHVlKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTU2NCw4ICs2MzAsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgY2hhciB2YWx1ZS4KLSAgICAgKiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5hcnJheVtpbmRleF0gPSB2YWx1ZTwvY29kZT4KKyAgICAgKiBTZXQgdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIHtAY29kZSBjaGFyfQorICAgICAqIHZhbHVlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgYXJyYXlbaW5kZXhdID0gdmFsdWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQogICAgICAqICAgICAgICAgICAgdGhlIGFycmF5CkBAIC01NzMsMTQgKzYzOSwxNiBAQAogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4CiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgYXJyYXkgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMgbm90IGFuIGFycmF5IG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUKKyAgICAgKiAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gdGhlIGFycmF5IHR5cGUgYnkgYSB3aWRlbmluZyBjb252ZXJzaW9uCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgIGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJheS5sZW5ndGh9CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXIoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgsIGNoYXIgdmFsdWUpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewpAQCAtNTk2LDggKzY2NCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSBkb3VibGUgdmFsdWUuCi0gICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+YXJyYXlbaW5kZXhdID0gdmFsdWU8L2NvZGU+CisgICAgICogU2V0IHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSB7QGNvZGUgZG91YmxlfQorICAgICAqIHZhbHVlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgYXJyYXlbaW5kZXhdID0gdmFsdWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQogICAgICAqICAgICAgICAgICAgdGhlIGFycmF5CkBAIC02MDUsMTQgKzY3MywxNiBAQAogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4CiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgYXJyYXkgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyAtLSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgYXJyYXkgbGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMgbm90IGFuIGFycmF5IG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUKKyAgICAgKiAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gdGhlIGFycmF5IHR5cGUgYnkgYSB3aWRlbmluZyBjb252ZXJzaW9uCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgIGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJheS5sZW5ndGh9CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERvdWJsZShPYmplY3QgYXJyYXksIGludCBpbmRleCwgZG91YmxlIHZhbHVlKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTYyOCw4ICs2OTgsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgZmxvYXQgdmFsdWUuCi0gICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+YXJyYXlbaW5kZXhdID0gdmFsdWU8L2NvZGU+CisgICAgICogU2V0IHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSB7QGNvZGUgZmxvYXR9CisgICAgICogdmFsdWUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZSBhcnJheVtpbmRleF0gPSB2YWx1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKQEAgLTYzNywxNCArNzA3LDE2IEBACiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXgKICAgICAgKiBAcGFyYW0gdmFsdWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgdmFsdWUgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSBhcnJheSB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzIC0tIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBhcnJheSBsZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgYXJyYXkgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSAgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmxvYXQoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgsIGZsb2F0IHZhbHVlKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTY1Niw4ICs3MjgsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgaW50IHZhbHVlLgotICAgICAqIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPmFycmF5W2luZGV4XSA9IHZhbHVlPC9jb2RlPgorICAgICAqIFNldCB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUge0Bjb2RlIGludH0KKyAgICAgKiB2YWx1ZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIGFycmF5W2luZGV4XSA9IHZhbHVlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKICAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheQpAQCAtNjY1LDE0ICs3MzcsMTYgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAogICAgICAqIEBwYXJhbSB2YWx1ZQogICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5IG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gdGhlIGFycmF5IHR5cGUgYnkgYSB3aWRlbmluZyBjb252ZXJzaW9uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMgLS0gbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGFycmF5IGxlbmd0aAorICAgICAqIAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGFycmF5fSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgdmFsdWUgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSBhcnJheSB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlICBpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RofQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnQoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgsIGludCB2YWx1ZSkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7CkBAIC02ODQsOCArNzU4LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIGxvbmcgdmFsdWUuCi0gICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+YXJyYXlbaW5kZXhdID0gdmFsdWU8L2NvZGU+CisgICAgICogU2V0IHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSB7QGNvZGUgbG9uZ30KKyAgICAgKiB2YWx1ZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIGFycmF5W2luZGV4XSA9IHZhbHVlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKICAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheQpAQCAtNjkzLDE0ICs3NjcsMTYgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleAogICAgICAqIEBwYXJhbSB2YWx1ZQogICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5IG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gdGhlIGFycmF5IHR5cGUgYnkgYSB3aWRlbmluZyBjb252ZXJzaW9uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMgLS0gbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGFycmF5IGxlbmd0aAorICAgICAqIAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGFycmF5fSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgYXJyYXl9IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgdmFsdWUgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSBhcnJheSB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlICBpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RofQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb25nKE9iamVjdCBhcnJheSwgaW50IGluZGV4LCBsb25nIHZhbHVlKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKQEAgLTcxMiw4ICs3ODgsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgc2hvcnQgdmFsdWUuCi0gICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+YXJyYXlbaW5kZXhdID0gdmFsdWU8L2NvZGU+CisgICAgICogU2V0IHRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSB7QGNvZGUgc2hvcnR9CisgICAgICogdmFsdWUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZSBhcnJheVtpbmRleF0gPSB2YWx1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICB0aGUgYXJyYXkKQEAgLTcyMSwxNCArNzk3LDE2IEBACiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXgKICAgICAgKiBAcGFyYW0gdmFsdWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG5vdCBhbiBhcnJheSBvciB0aGUgdmFsdWUgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIHRoZSBhcnJheSB0eXBlIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzIC0tIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBhcnJheSBsZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBhcnJheX0gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGFycmF5fSBpcyBub3QgYW4gYXJyYXkgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgIGNvbnZlcnRlZCB0byB0aGUgYXJyYXkgdHlwZSBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSAgaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvcnQoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgsIHNob3J0IHZhbHVlKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IuamF2YQppbmRleCBjZjhiZTZhLi5iMDJkY2FlIDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yLmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3Rvci5qYXZhCkBAIC0xNCwyMiArMTQsMzggQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5HZW5lcmljU2lnbmF0dXJlUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlczsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuVHlwZXM7Ci0vL0VORCBhbmRyb2lkLWFkZGVkCi0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgbW9kZWxzIGEgY29uc3RydWN0b3IuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25zdHJ1Y3RvciBjYW4gYmUKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvbnN0cnVjdG9yLiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uc3RydWN0b3IgY2FuIGJlCiAgKiBhY2Nlc3NlZCwgYW5kIHRoZSBjb25zdHJ1Y3RvciBjYW4gYmUgaW52b2tlZCBkeW5hbWljYWxseS4KICAqIAorICogQHBhcmFtIDxUPiB0aGUgY2xhc3MgdGhhdCBkZWNsYXJlcyB0aGlzIGNvbnN0cnVjdG9yCisgKgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdHJ1Y3RvcjxUPiBleHRlbmRzIEFjY2Vzc2libGVPYmplY3QgaW1wbGVtZW50cyBHZW5lcmljRGVjbGFyYXRpb24sCiAgICAgICAgIE1lbWJlciB7CkBAIC00MCw3ICs1Niw2IEBACiAgICAgCiAgICAgQ2xhc3M8Pz5bXSBleGNlcHRpb25UeXBlczsKICAgICAKLSAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgTGlzdE9mVHlwZXMgZ2VuZXJpY0V4Y2VwdGlvblR5cGVzOwogICAgIExpc3RPZlR5cGVzIGdlbmVyaWNQYXJhbWV0ZXJUeXBlczsKICAgICBUeXBlVmFyaWFibGU8Q29uc3RydWN0b3I8VD4+W10gZm9ybWFsVHlwZVBhcmFtZXRlcnM7CkBAIC01NywxMiArNzIsMTEgQEAKICAgICAgICAgICAgIGdlbmVyaWNUeXBlc0FyZUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAgICAgaW50IHNsb3Q7CiAKICAgICAvKioKLSAgICAgKiBQcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQKKyAgICAgKiBQcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBDb25zdHJ1Y3RvcigpewogICAgICAgICAvL2RvIG5vdGhpbmcKQEAgLTcxLDIzICs4NSwyMyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLiBPbmx5IGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlLCB0aHVzCiAgICAgICogcHJpdmF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MgVGhlIGNsYXNzIHRoaXMgY29uc3RydWN0b3Igb2JqZWN0IGJlbG9uZ3MgdG8uCi0gICAgICogQHBhcmFtIHB0eXBlcyBUaGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gZXh0eXBlcyBUaGUgZXhjZXB0aW9uIHR5cGVzIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gc2xvdCBUaGUgc2xvdCBvZiB0aGUgY29uc3RydWN0b3IgaW5zaWRlIHRoZSBWTSBjbGFzcyBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB0aGlzIGNvbnN0cnVjdG9yIG9iamVjdCBiZWxvbmdzIHRvCisgICAgICogQHBhcmFtIHB0eXBlcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiB0aGUgY29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gZXh0eXBlcworICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB0eXBlcyBvZiB0aGUgY29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gc2xvdAorICAgICAqICAgICAgICAgICAgdGhlIHNsb3Qgb2YgdGhlIGNvbnN0cnVjdG9yIGluc2lkZSB0aGUgVk0gY2xhc3Mgc3RydWN0dXJlCiAgICAgICovCi0gICAgcHJpdmF0ZSBDb25zdHJ1Y3RvciAoQ2xhc3M8VD4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+W10gcHR5cGVzLCBDbGFzczw/PltdIGV4dHlwZXMsIGludCBzbG90KQotICAgIHsKKyAgICBwcml2YXRlIENvbnN0cnVjdG9yIChDbGFzczxUPiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz5bXSBwdHlwZXMsIENsYXNzPD8+W10gZXh0eXBlcywgaW50IHNsb3QpewogICAgICAgICB0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7CiAgICAgICAgIHRoaXMucGFyYW1ldGVyVHlwZXMgPSBwdHlwZXM7CiAgICAgICAgIHRoaXMuZXhjZXB0aW9uVHlwZXMgPSBleHR5cGVzOyAgICAgICAgICAvLyBtYXkgYmUgbnVsbAogICAgICAgICB0aGlzLnNsb3QgPSBzbG90OwogICAgIH0KIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBAT3ZlcnJpZGUgLypwYWNrYWdlKi8gU3RyaW5nIGdldFNpZ25hdHVyZUF0dHJpYnV0ZSgpIHsKICAgICAgICAgT2JqZWN0W10gYW5ub3RhdGlvbiA9IGdldFNpZ25hdHVyZUFubm90YXRpb24oZGVjbGFyaW5nQ2xhc3MsIHNsb3QpOwogCkBAIC0xMDUsMzEgKzExOSwyMSBAQAogICAgIG5hdGl2ZSBwcml2YXRlIE9iamVjdFtdIGdldFNpZ25hdHVyZUFubm90YXRpb24oQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsCiAgICAgICAgICAgICBpbnQgc2xvdCk7CiAKLSAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGFycmF5IG9mIHR5cGUgcGFyYW1ldGVycy4KLSAgICAgKi8KICAgICBwdWJsaWMgVHlwZVZhcmlhYmxlPENvbnN0cnVjdG9yPFQ+PltdIGdldFR5cGVQYXJhbWV0ZXJzKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaW5pdEdlbmVyaWNUeXBlcygpOwogICAgICAgICByZXR1cm4gZm9ybWFsVHlwZVBhcmFtZXRlcnMuY2xvbmUoKTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RydWN0b3IncyBkZWNsYXJhdGlvbiwKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnN0cnVjdG9yJ3MgZGVjbGFyYXRpb24sCiAgICAgICogaW5jbHVkaW5nIHRoZSB0eXBlIHBhcmFtZXRlcnMuCi0gICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvcidzIGRlY2xhcmF0aW9uCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBTdHJpbmcuCiAgICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9HZW5lcmljU3RyaW5nKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDgwKTsKICAgICAgICAgaW5pdEdlbmVyaWNUeXBlcygpOwogICAgICAgICAvLyBhcHBlbmQgbW9kaWZpZXJzIGlmIGFueQpAQCAtMTYzLDUyICsxNjcsNTEgQEAKICAgICAgICAgICAgIGFwcGVuZEFycmF5R2VuZXJpY1R5cGUoc2IsIGdlbmVyaWNFY2VwdGlvblR5cGVBcnJheSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZXRzIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXMgYW4gYXJyYXkgb2Yge0BsaW5rIFR5cGV9IGluc3RhbmNlcywgaW4KLSAgICAgKiBkZWNsYXJhdGlvbiBvcmRlci4gSWYgdGhlIGNvbnN0cnVjdG9yIGhhcyBubyBwYXJhbWV0ZXJzLCB0aGVuIGFuIGVtcHR5Ci0gICAgICogYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgdGhlIGdlbmVyaWMgcGFyYW1ldGVyIHR5cGVzIGFzIGFuIGFycmF5IG9mIHtAY29kZSBUeXBlfQorICAgICAqIGluc3RhbmNlcywgaW4gZGVjbGFyYXRpb24gb3JkZXIuIElmIHRoaXMgY29uc3RydWN0b3IgaGFzIG5vIGdlbmVyaWMKKyAgICAgKiBwYXJhbWV0ZXJzLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBUeXBlfSBpbnN0YW5jZXMuCi0gICAgICogQHRocm93cyBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IgaWYgdGhlIGdlbmVyaWMgbWV0aG9kIHNpZ25hdHVyZSBpcwotICAgICAqICAgICAgICAgaW52YWxpZC4KLSAgICAgKiBAdGhyb3dzIFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uIGlmIHRoZSBjb21wb25lbnQgdHlwZSBwb2ludHMgdG8gYSBtaXNzaW5nCi0gICAgICogICAgICAgICB0eXBlLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cwotICAgICAqICAgICAgICAgdG8gYSB0eXBlIHRoYXQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdHlwZXMKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnZW5lcmljIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBwYXJhbWV0ZXIgdHlwZSBwb2ludHMgdG8gYSBtaXNzaW5nIHR5cGUKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFBhcmFtZXRlcml6ZWRUeXBlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW55IHBhcmFtZXRlciB0eXBlIHBvaW50cyB0byBhIHR5cGUgdGhhdCBjYW5ub3QgYmUKKyAgICAgKiAgICAgICAgICAgICBpbnN0YW50aWF0ZWQgZm9yIHNvbWUgcmVhc29uCisgICAgICogCiAgICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUeXBlW10gZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaW5pdEdlbmVyaWNUeXBlcygpOwogICAgICAgICByZXR1cm4gVHlwZXMuZ2V0Q2xvbmVkVHlwZUFycmF5KGdlbmVyaWNQYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZXRzIHRoZSBleGNlcHRpb24gdHlwZXMgYXMgYW4gYXJyYXkgb2Yge0BsaW5rIFR5cGV9IGluc3RhbmNlcy4gSWYgdGhlCi0gICAgICogY29uc3RydWN0b3IgaGFzIG5vIGRlY2xhcmVkIGV4Y2VwdGlvbnMsIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB0eXBlcyBhcyBhbiBhcnJheSBvZiB7QGNvZGUgVHlwZX0gaW5zdGFuY2VzLiBJZgorICAgICAqIHRoaXMgY29uc3RydWN0b3IgaGFzIG5vIGRlY2xhcmVkIGV4Y2VwdGlvbnMsIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBUeXBlfSBpbnN0YW5jZXMuCi0gICAgICogQHRocm93cyBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IgaWYgdGhlIGdlbmVyaWMgbWV0aG9kIHNpZ25hdHVyZSBpcwotICAgICAqICAgICAgICAgaW52YWxpZC4KLSAgICAgKiBAdGhyb3dzIFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uIGlmIHRoZSBjb21wb25lbnQgdHlwZSBwb2ludHMgdG8gYSBtaXNzaW5nCi0gICAgICogICAgICAgICB0eXBlLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cwotICAgICAqICAgICAgICAgdG8gYSB0eXBlIHRoYXQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGdlbmVyaWMgZXhjZXB0aW9uIHR5cGVzCisgICAgICogCisgICAgICogQHRocm93cyBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2VuZXJpYyBjb25zdHJ1Y3RvciBzaWduYXR1cmUgaXMgaW52YWxpZAorICAgICAqIEB0aHJvd3MgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgZXhjZXB0aW9uIHR5cGUgcG9pbnRzIHRvIGEgbWlzc2luZyB0eXBlCisgICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBleGNlcHRpb24gdHlwZSBwb2ludHMgdG8gYSB0eXBlIHRoYXQgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbgogICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVHlwZVtdIGdldEdlbmVyaWNFeGNlcHRpb25UeXBlcygpIHsKLSAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGluaXRHZW5lcmljVHlwZXMoKTsKICAgICAgICAgcmV0dXJuIFR5cGVzLmdldENsb25lZFR5cGVBcnJheShnZW5lcmljRXhjZXB0aW9uVHlwZXMpOwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMTksMzggKzIyMiwzNiBAQAogICAgICAgICBpbnQgc2xvdCk7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFycmF5cyB0aGF0IHJlcHJlc2VudCB0aGUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm1hbAorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYXJyYXlzIHRoYXQgcmVwcmVzZW50IHRoZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybWFsCiAgICAgICogcGFyYW1ldGVycyBvZiB0aGlzIGNvbnN0cnVjdG9yLiBJZiB0aGVyZSBhcmUgbm8gcGFyYW1ldGVycyBvbiB0aGlzCiAgICAgICogY29uc3RydWN0b3IsIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuIElmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucwotICAgICAqIHNldCwgdGhlbiBhbmQgYXJyYXkgb2YgZW1wdHkgYXJyYXlzIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBzZXQsIHRoZW4gYW4gYXJyYXkgb2YgZW1wdHkgYXJyYXlzIGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgYXJyYXlzIG9mIHtAbGluayBBbm5vdGF0aW9ufSBpbnN0YW5jZXMuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBhcnJheXMgb2Yge0Bjb2RlIEFubm90YXRpb259IGluc3RhbmNlcworICAgICAqIAogICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQW5ub3RhdGlvbltdW10gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKSB7Ci0vLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgQW5ub3RhdGlvbltdW10gcGFyYW1ldGVyQW5ub3RhdGlvbnMKICAgICAgICAgICAgICAgICA9IGdldFBhcmFtZXRlckFubm90YXRpb25zKGRlY2xhcmluZ0NsYXNzLCBzbG90KTsKICAgICAgICAgaWYgKHBhcmFtZXRlckFubm90YXRpb25zLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gTWV0aG9kLm5vQW5ub3RhdGlvbnMocGFyYW1ldGVyVHlwZXMubGVuZ3RoKTsKICAgICAgICAgfQotLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gcGFyYW1ldGVyQW5ub3RhdGlvbnM7CiAgICAgfQogICAgIG5hdGl2ZSBwcml2YXRlIEFubm90YXRpb25bXVtdIGdldFBhcmFtZXRlckFubm90YXRpb25zKENsYXNzIGRlY2xhcmluZ0NsYXNzLAogICAgICAgICBpbnQgc2xvdCk7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBhIHZhcmlhYmxlIG51bWJlcgotICAgICAqIGFyZ3VtZW50LgotICAgICAqIDwvcD4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZgorICAgICAqIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgdmFyYXJnIGlzIGRlY2xhcmUsIG90aGVyd2lzZQorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfQogICAgICAqIAotICAgICAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHZhcmFyZyBpcyBkZWNsYXJlLCBvdGhlcndpc2UKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KICAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNWYXJBcmdzKCkgewogICAgICAgICBpbnQgbW9kcyA9IGdldENvbnN0cnVjdG9yTW9kaWZpZXJzKGRlY2xhcmluZ0NsYXNzLCBzbG90KTsKQEAgLTI1OCwxNCArMjU5LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29uc3RydWN0b3IgaXMgc3ludGhldGljLgotICAgICAqIDwvcD4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBjb25zdHJ1Y3RvciBpcyBzeW50aGV0aWMgKGFydGlmaWNpYWxseQorICAgICAqIGludHJvZHVjZWQgYnkgdGhlIGNvbXBpbGVyKS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgc3ludGhldGljLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiAgICAgICAgIAotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0cnVjdG9yIGlzIHN5bnRoZXRpYywge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CiAgICAgICAgIGludCBtb2RzID0gZ2V0Q29uc3RydWN0b3JNb2RpZmllcnMoZGVjbGFyaW5nQ2xhc3MsIHNsb3QpOwpAQCAtMjczLDE0ICsyNzMsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIENvbnN0cnVjdG9yIGFuZCBhbnN3ZXIgaWYgdGhleSBhcmUKLSAgICAgKiBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIENvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUKLSAgICAgKiBkZWZpbmluZyBjbGFzcyBhbmQgcGFyYW1ldGVyIHR5cGVzLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHtAY29kZSBvYmplY3R9IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3Rvci4gVG8gYmUgZXF1YWwsIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2UKKyAgICAgKiBvZiB7QGNvZGUgQ29uc3RydWN0b3J9IHdpdGggdGhlIHNhbWUgZGVjbGFyaW5nIGNsYXNzIGFuZCBwYXJhbWV0ZXIgdHlwZXMKKyAgICAgKiBhcyB0aGlzIGNvbnN0cnVjdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgQ29uc3RydWN0b3IsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICBjb25zdHJ1Y3Rvciwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiAKICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC0yODgsMjIgKzI5NCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUge0BsaW5rIENsYXNzfSBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzIHRoYXQgZGVmaW5lZCB0aGlzCi0gICAgICogY29uc3RydWN0b3IuCi0gICAgICogCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgdGhhdCBkZWNsYXJlcyB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGVjbGFyaW5nIGNsYXNzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzPFQ+IGdldERlY2xhcmluZ0NsYXNzKCkgewogICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ2xhc3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSB7QGxpbmsgQ2xhc3N9IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIGV4Y2VwdGlvbnMgZGVjbGFyZWQgdG8gYmUgdGhyb3duIGJ5IHRoaXMgY29uc3RydWN0b3IuIElmIHRoZSBjb25zdHJ1Y3RvcgotICAgICAqIHdhcyBub3QgZGVjbGFyZWQgdG8gdGhyb3cgYW55IGV4Y2VwdGlvbnMsIHRoZSBhcnJheSByZXR1cm5lZCB3aWxsIGJlCi0gICAgICogZW1wdHkuCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHR5cGVzIGFzIGFuIGFycmF5IG9mIHtAY29kZSBDbGFzc30gaW5zdGFuY2VzLiBJZgorICAgICAqIHRoaXMgY29uc3RydWN0b3IgaGFzIG5vIGRlY2xhcmVkIGV4Y2VwdGlvbnMsIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNsYXJlZCBleGNlcHRpb24gY2xhc3NlcworICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzczw/PltdIGdldEV4Y2VwdGlvblR5cGVzKCkgewogICAgICAgICBpZiAoZXhjZXB0aW9uVHlwZXMgPT0gbnVsbCkKQEAgLTMxMiwxMSArMzIwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBtb2RpZmllcnMgZm9yIHRoZSBtb2RlbGVkIGNvbnN0cnVjdG9yLiBUaGUgTW9kaWZpZXIgY2xhc3MKKyAgICAgKiBSZXR1cm5zIHRoZSBtb2RpZmllcnMgZm9yIHRoaXMgY29uc3RydWN0b3IuIFRoZSB7QGxpbmsgTW9kaWZpZXJ9IGNsYXNzCiAgICAgICogc2hvdWxkIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSByZXN1bHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZXJzCi0gICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcgorICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIAorICAgICAqIEBzZWUgTW9kaWZpZXIKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKICAgICAgICAgcmV0dXJuIGdldENvbnN0cnVjdG9yTW9kaWZpZXJzKGRlY2xhcmluZ0NsYXNzLCBzbG90KTsKQEAgLTMyNSwyMSArMzM2LDI0IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IGdldENvbnN0cnVjdG9yTW9kaWZpZXJzKENsYXNzPFQ+IGRlY2xhcmluZ0NsYXNzLCBpbnQgc2xvdCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtb2RlbGVkIGNvbnN0cnVjdG9yLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotICAgICAqIGRlY2xhcmluZyBjbGFzcy4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY29uc3RydWN0b3IKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ2xhc3MuZ2V0TmFtZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUge0BsaW5rIENsYXNzfSBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSB7QGNvZGUgQ2xhc3N9IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoZQogICAgICAqIHBhcmFtZXRlciB0eXBlcyBvZiB0aGlzIGNvbnN0cnVjdG9yLiBJZiB0aGUgY29uc3RydWN0b3Igd2FzIGRlY2xhcmVkIHdpdGgKLSAgICAgKiBubyBwYXJhbWV0ZXJzLCB0aGUgYXJyYXkgcmV0dXJuZWQgd2lsbCBiZSBlbXB0eS4KLSAgICAgKiAKKyAgICAgKiBubyBwYXJhbWV0ZXJzLCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLgorICAgICAqCiAgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIHR5cGVzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzPD8+W10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlczsKQEAgLTM0OSw4ICszNjMsOCBAQAogICAgICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdG9yJ3Mgc2lnbmF0dXJlIGluIG5vbi1wcmludGFibGUgZm9ybS4gVGhpcyBpcyBjYWxsZWQKICAgICAgKiAob25seSkgZnJvbSBJTyBuYXRpdmUgY29kZSBhbmQgbmVlZGVkIGZvciBkZXJpdmluZyB0aGUgc2VyaWFsVmVyc2lvblVJRAogICAgICAqIG9mIHRoZSBjbGFzcwotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNvbnN0cnVjdG9yJ3Mgc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0b3IncyBzaWduYXR1cmUKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwcml2YXRlIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7CkBAIC0zNjYsMTIgKzM4MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLiBUaGUgaGFzaCBjb2RlIGZvciBhIENvbnN0cnVjdG9yIGlzCi0gICAgICogdGhlIGhhc2ggY29kZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzJyBuYW1lLgorICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoaXMgY29uc3RydWN0b3IuIENvbnN0cnVjdG9ycyB3aGljaCBhcmUKKyAgICAgKiBlcXVhbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLiBUaGUgaGFzaCBjb2RlIGZvciBhCisgICAgICogQ29uc3RydWN0b3IgaXMgdGhlIGhhc2ggY29kZSBvZiB0aGUgbmFtZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTM3OSw0NSArMzk2LDUyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3MsIGluaXRpYWxpemVkIGJ5IGR5bmFtaWNhbGx5Ci0gICAgICogaW52b2tpbmcgdGhlIG1vZGVsZWQgY29uc3RydWN0b3IuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mCi0gICAgICogPGNvZGU+bmV3IGRlY2xhcmluZ0NsYXNzKGFyZzEsIGFyZzIsIC4uLiAsIGFyZ04pPC9jb2RlPiBUaGlzIG1ldGhvZAotICAgICAqIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmc6CisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzLCBpbml0aWFsaXplZCBieSBkeW5hbWljYWxseQorICAgICAqIGludm9raW5nIHRoZSBjb25zdHJ1Y3RvciByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDb25zdHJ1Y3Rvcn0gb2JqZWN0LgorICAgICAqIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZSBuZXcgZGVjbGFyaW5nQ2xhc3MoYXJnMSwgYXJnMiwgLi4uICwKKyAgICAgKiBhcmdOKX0gVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIGZvbGxvd2luZzoKICAgICAgKiA8dWw+CiAgICAgICogPGxpPkEgbmV3IGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3MgaXMgY3JlYXRlZC4gSWYgdGhlIGRlY2xhcmluZwogICAgICAqIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKGkuZS4gYWJzdHJhY3QgY2xhc3MsIGFuIGludGVyZmFjZSwgYW4gYXJyYXkKLSAgICAgKiB0eXBlLCBvciBhIGJhc2UgdHlwZSkgdGhlbiBhbiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgorICAgICAqIHR5cGUsIG9yIGEgcHJpbWl0aXZlIHR5cGUpIHRoZW4gYW4gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpcyB0aHJvd24uPC9saT4KICAgICAgKiA8bGk+SWYgdGhpcyBDb25zdHJ1Y3RvciBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUKLSAgICAgKiBBY2Nlc3NpYmxlT2JqZWN0KSBhbmQgdGhlIG1vZGVsZWQgY29uc3RydWN0b3IgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUKKyAgICAgKiB7QGxpbmsgQWNjZXNzaWJsZU9iamVjdH0pIGFuZCB0aGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlCiAgICAgICogY3VycmVudCBjb250ZXh0LCBhbiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgotICAgICAqIDxsaT5JZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgYW5kIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBkbwotICAgICAqIG5vdCBtYXRjaCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgYW5kIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBkbyBub3QKKyAgICAgKiBtYXRjaCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgogICAgICAqIDxsaT5Gb3IgZWFjaCBhcmd1bWVudCBwYXNzZWQ6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5JZiB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdHlwZSBpcyBhIGJhc2UgdHlwZSwgdGhlIGFyZ3VtZW50IGlzCi0gICAgICogdW53cmFwcGVkLiBJZiB0aGUgdW53cmFwcGluZyBmYWlscywgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzCisgICAgICogPGxpPklmIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0eXBlIGlzIGEgcHJpbWl0aXZlIHR5cGUsIHRoZSBhcmd1bWVudAorICAgICAqIGlzIHVud3JhcHBlZC4gSWYgdGhlIHVud3JhcHBpbmcgZmFpbHMsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcwogICAgICAqIHRocm93bi48L2xpPgogICAgICAqIDxsaT5JZiB0aGUgcmVzdWx0aW5nIGFyZ3VtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlCiAgICAgICogdmlhIGEgd2lkZW5pbmcgY29udmVyc2lvbiwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogPGxpPlRoZSBtb2RlbGVkIGNvbnN0cnVjdG9yIGlzIHRoZW4gaW52b2tlZC4gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bgotICAgICAqIGR1cmluZyB0aGUgaW52b2NhdGlvbiwgaXQgaXMgY2F1Z2h0IGFuZCB3cmFwcGVkIGluIGFuCi0gICAgICogSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbi4gVGhpcyBleGNlcHRpb24gaXMgdGhlbiB0aHJvd24uIElmIHRoZQotICAgICAqIGludm9jYXRpb24gY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgb2JqZWN0IGlzIHJldHVybmVkLgorICAgICAqIDxsaT5UaGUgY29uc3RydWN0b3IgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ29uc3RydWN0b3J9IG9iamVjdCBpcworICAgICAqIHRoZW4gaW52b2tlZC4gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgdGhlIGludm9jYXRpb24sIGl0IGlzCisgICAgICogY2F1Z2h0IGFuZCB3cmFwcGVkIGluIGFuIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24uIFRoaXMgZXhjZXB0aW9uIGlzCisgICAgICogdGhlbiB0aHJvd24uIElmIHRoZSBpbnZvY2F0aW9uIGNvbXBsZXRlcyBub3JtYWxseSwgdGhlIG5ld2x5IGluaXRpYWxpemVkCisgICAgICogb2JqZWN0IGlzIHJldHVybmVkLgogICAgICAqIDwvdWw+CiAgICAgICogCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqICAgICAgICAgICAgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcsIGluaXRpYWxpemVkLCBvYmplY3QKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgIGluc3RhbnRpYXRlZAotICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWYgdGhlIG1vZGVsZWQgY29uc3RydWN0b3IKLSAgICAgKiAgICAgICAgICAgIGlzIG5vdCBhY2Nlc3NpYmxlCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGluY29ycmVjdCBudW1iZXIgb2YKLSAgICAgKiAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgcGFzc2VkLCBvciBhbiBhcmd1bWVudCBjb3VsZCBub3QgYmUgY29udmVydGVkIGJ5Ci0gICAgICogICAgICAgICAgICBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICB3YXMgdGhyb3duIGJ5IHRoZSBpbnZva2VkIGNvbnN0cnVjdG9yCi0gICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0CisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBhY2Nlc3NpYmxlCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcmUgcGFzc2VkLCBvciBhbgorICAgICAqICAgICAgICAgICAgICAgIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgYnkgYSB3aWRlbmluZyBjb252ZXJzaW9uCisgICAgICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgdGhlIGludm9rZWQgY29uc3RydWN0b3IKKyAgICAgKiAKKyAgICAgKiBAc2VlIEFjY2Vzc2libGVPYmplY3QKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVCBuZXdJbnN0YW5jZShPYmplY3QuLi4gYXJncykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCiAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewpAQCAtNDI4LDIxICs0NTIsMzIgQEAKICAgICAgICAgICAgIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIGludCBzbG90LAogICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKICAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4gVGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIG1vZGlmaWVycyAoaWYgYW55KSBkZWNsYXJpbmcgY2xhc3MKLSAgICAgKiBuYW1lICcoJyBwYXJhbWV0ZXIgdHlwZXMsIHNlcGFyYXRlZCBieSAnLCcgJyknIElmIHRoZSBjb25zdHJ1Y3RvciB0aHJvd3MKLSAgICAgKiBleGNlcHRpb25zLCAnIHRocm93cyAnIGV4Y2VwdGlvbiB0eXBlcywgc2VwYXJhdGVkIGJ5ICcsJyBGb3IgZXhhbXBsZToKLSAgICAgKiA8Y29kZT5wdWJsaWMgU3RyaW5nKGJ5dGVbXSxTdHJpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uPC9jb2RlPgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3Rvci4gVGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzOgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlcgorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5tb2RpZmllcnMgKGlmIGFueSkKKyAgICAgKiAgIDxsaT5kZWNsYXJpbmcgY2xhc3MgbmFtZQorICAgICAqICAgPGxpPicoJworICAgICAqICAgPGxpPnBhcmFtZXRlciB0eXBlcywgc2VwYXJhdGVkIGJ5ICcsJyAoaWYgYW55KQorICAgICAqICAgPGxpPicpJworICAgICAqICAgPGxpPid0aHJvd3MnIHBsdXMgZXhjZXB0aW9uIHR5cGVzLCBzZXBhcmF0ZWQgYnkgJywnIChpZiBhbnkpCisgICAgICogPC9vbD4KKyAgICAgKiAKKyAgICAgKiBGb3IgZXhhbXBsZToKKyAgICAgKiB7QGNvZGUgcHVibGljIFN0cmluZyhieXRlW10sU3RyaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbn0KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgY29uc3RydWN0b3IKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKE1vZGlmaWVyLnRvU3RyaW5nKGdldE1vZGlmaWVycygpKSk7CiAKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSAhPSAwKSAgICAgICAvLyBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSAhPSAwKQogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGRlY2xhcmluZ0NsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIigiKTsKZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvRmllbGQuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvRmllbGQuamF2YQppbmRleCA5OGZiMmRlLi4yN2NmMzRhIDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkLmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9GaWVsZC5qYXZhCkBAIC0xNCw1MyArMTQsNzggQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuR2VuZXJpY1NpZ25hdHVyZVBhcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuVHlwZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5TdHJpbmdVdGlsczsKLS8vIEVORCBhbmRyb2lkLWFkZGVkCi0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCiAKIC8qKgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBWTSB2ZW5kb3IuIFRoaXMgY2xhc3MgbW9kZWxzIGEgZmllbGQuCi0gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkLCBhbmQgdGhlIGZpZWxkJ3MgdmFsdWUgY2FuIGJlCi0gKiBhY2Nlc3NlZCBkeW5hbWljYWxseS4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGZpZWxkLiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkLAorICogYW5kIHRoZSBmaWVsZCdzIHZhbHVlIGNhbiBiZSBhY2Nlc3NlZCBkeW5hbWljYWxseS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBGaWVsZCBleHRlbmRzIEFjY2Vzc2libGVPYmplY3QgaW1wbGVtZW50cyBNZW1iZXIgewotICAgIAorCiAgICAgcHJpdmF0ZSBDbGFzczw/PiBkZWNsYXJpbmdDbGFzczsKLSAgICAKKwogICAgIHByaXZhdGUgQ2xhc3M8Pz4gdHlwZTsKLSAgICAKLSAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisKICAgICBwcml2YXRlIFR5cGUgZ2VuZXJpY1R5cGU7CisKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZ2VuZXJpY1R5cGVzQXJlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAotICAgIAorCiAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAKKwogICAgIHByaXZhdGUgaW50IHNsb3Q7Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CT09MRUFOID0gMTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0JZVEUgPSAyOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ0hBUiA9IDM7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TSE9SVCA9IDQ7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlRFR0VSID0gNTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZMT0FUID0gNjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0xPTkcgPSA3OworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfRE9VQkxFID0gODsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZAorICAgICAqIENvbnN0cnVjdCBhIGNsb25lIG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcmlnIG5vbi1udWxsOyB0aGUgb3JpZ2luYWwgaW5zdGFuY2UgdG8gY2xvbmUKICAgICAgKi8KLSAgICBwcml2YXRlIEZpZWxkKCl7Ci0gICAgICAgIC8vZG8gbm90aGluZworICAgIC8qcGFja2FnZSovIEZpZWxkKEZpZWxkIG9yaWcpIHsKKyAgICAgICAgdGhpcyhvcmlnLmRlY2xhcmluZ0NsYXNzLCBvcmlnLnR5cGUsIG9yaWcubmFtZSwgb3JpZy5zbG90KTsKKyAgICAKKyAgICAgICAgLy8gQ29weSB0aGUgYWNjZXNzaWJsZSBmbGFnLgorICAgICAgICBpZiAob3JpZy5mbGFnKSB7CisgICAgICAgICAgICB0aGlzLmZsYWcgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBGaWVsZChDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwgU3RyaW5nIG5hbWUsIGludCBzbG90KSB7CkBAIC03MCw3ICs5NSw2IEBACiAgICAgICAgIHRoaXMuc2xvdCA9IHNsb3Q7CiAgICAgfQogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdEdlbmVyaWNUeXBlKCkgewogICAgICAgICBpZiAoIWdlbmVyaWNUeXBlc0FyZUluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlQXR0cmlidXRlID0gZ2V0U2lnbmF0dXJlQXR0cmlidXRlKCk7CkBAIC04MywxMiArMTA3LDEwIEBACiAgICAgICAgICAgICBnZW5lcmljVHlwZXNBcmVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKLSAgICAKLSAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgQE92ZXJyaWRlIC8qcGFja2FnZSovIFN0cmluZyBnZXRTaWduYXR1cmVBdHRyaWJ1dGUoKSB7CisgICAgQE92ZXJyaWRlCisgICAgLyogcGFja2FnZSAqL1N0cmluZyBnZXRTaWduYXR1cmVBdHRyaWJ1dGUoKSB7CiAgICAgICAgIE9iamVjdFtdIGFubm90YXRpb24gPSBnZXRTaWduYXR1cmVBbm5vdGF0aW9uKGRlY2xhcmluZ0NsYXNzLCBzbG90KTsKIAogICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7CkBAIC05NywyMyArMTE5LDE4IEBACiAKICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmNvbWJpbmVTdHJpbmdzKGFubm90YXRpb24pOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIEdldCB0aGUgU2lnbmF0dXJlIGFubm90YXRpb24gZm9yIHRoaXMgZmllbGQuICBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLgorICAgICAqIEdldCB0aGUgU2lnbmF0dXJlIGFubm90YXRpb24gZm9yIHRoaXMgZmllbGQuIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQuCiAgICAgICovCi0gICAgbmF0aXZlIHByaXZhdGUgT2JqZWN0W10gZ2V0U2lnbmF0dXJlQW5ub3RhdGlvbihDbGFzcyBkZWNsYXJpbmdDbGFzcywKLSAgICAgICAgICAgIGludCBzbG90KTsKLQotICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKKyAgICBuYXRpdmUgcHJpdmF0ZSBPYmplY3RbXSBnZXRTaWduYXR1cmVBbm5vdGF0aW9uKENsYXNzIGRlY2xhcmluZ0NsYXNzLCBpbnQgc2xvdCk7CiAKICAgICAvKioKLSAgICAgKiA8cD4KICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBpcyBzeW50aGV0aWMuCi0gICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZpZWxkIGlzIHN5bnRoZXRpYywKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBmaWVsZCBpcyBzeW50aGV0aWMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkgewogICAgICAgICBpbnQgZmxhZ3MgPSBnZXRGaWVsZE1vZGlmaWVycyhkZWNsYXJpbmdDbGFzcywgc2xvdCk7CkBAIC0xMjEsMTYgKzEzOCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmllbGQncyBkZWNsYXJhdGlvbiwgaW5jbHVkaW5nCi0gICAgICogdGhlIHR5cGUgcGFyYW1ldGVycy4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmllbGQsIGluY2x1ZGluZyB0aGUgZmllbGQncworICAgICAqIGdlbmVyaWMgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFN0cmluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmaWVsZAogICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvR2VuZXJpY1N0cmluZygpIHsKLSAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcig4MCk7CiAgICAgICAgIC8vIGFwcGVuZCBtb2RpZmllcnMgaWYgYW55CiAgICAgICAgIGludCBtb2RpZmllciA9IGdldE1vZGlmaWVycygpOwpAQCAtMTQzLDE3ICsxNTgsMTUgQEAKICAgICAgICAgLy8gYXBwZW5kIGZ1bGwgZmllbGQgbmFtZQogICAgICAgICBzYi5hcHBlbmQoZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpLmFwcGVuZCgnLicpLmFwcGVuZChnZXROYW1lKCkpOwogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIGlzIGFuIGVudW1lcmF0aW9uIGNvbnN0YW50LgotICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmaWVsZCBpcyBhbiBlbnVtZXJhdGlvbgotICAgICAqICAgICAgICAgY29uc3RhbnQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBmaWVsZCBpcyBhbiBlbnVtZXJhdGlvbiBjb25zdGFudCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRW51bUNvbnN0YW50KCkgewogICAgICAgICBpbnQgZmxhZ3MgPSBnZXRGaWVsZE1vZGlmaWVycyhkZWNsYXJpbmdDbGFzcywgc2xvdCk7CkBAIC0xNjEsNDIgKzE3NCw0MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdldHMgdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhpcyBmaWVsZC4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGUgZ2VuZXJpYyB0eXBlIG9mIHRoaXMgZmllbGQuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgVHlwZX0uCi0gICAgICogQHRocm93cyBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IgaWYgdGhlIGdlbmVyaWMgbWV0aG9kIHNpZ25hdHVyZSBpcwotICAgICAqICAgICAgICAgaW52YWxpZC4KLSAgICAgKiBAdGhyb3dzIFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uIGlmIHRoZSBjb21wb25lbnQgdHlwZSBwb2ludHMgdG8gYSBtaXNzaW5nCi0gICAgICogICAgICAgICB0eXBlLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cwotICAgICAqICAgICAgICAgdG8gYSB0eXBlIHRoYXQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmljIHR5cGUKKyAgICAgKiBAdGhyb3dzIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnZW5lcmljIGZpZWxkIHNpZ25hdHVyZSBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnZW5lcmljIHR5cGUgcG9pbnRzIHRvIGEgbWlzc2luZyB0eXBlCisgICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnZW5lcmljIHR5cGUgcG9pbnRzIHRvIGEgdHlwZSB0aGF0IGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgIGluc3RhbnRpYXRlZCBmb3Igc29tZSByZWFzb24KICAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFR5cGUgZ2V0R2VuZXJpY1R5cGUoKSB7Ci0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpbml0R2VuZXJpY1R5cGUoKTsKICAgICAgICAgcmV0dXJuIFR5cGVzLmdldFR5cGUoZ2VuZXJpY1R5cGUpOwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKCkgewogICAgICAgICByZXR1cm4gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucyhkZWNsYXJpbmdDbGFzcywgc2xvdCk7CiAgICAgfQotICAgIG5hdGl2ZSBwcml2YXRlIEFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKENsYXNzIGRlY2xhcmluZ0NsYXNzLAotICAgICAgICBpbnQgc2xvdCk7CisKKyAgICBuYXRpdmUgcHJpdmF0ZSBBbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucyhDbGFzcyBkZWNsYXJpbmdDbGFzcywgaW50IHNsb3QpOwogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBGaWVsZCBhbmQgYW5zd2VyIGlmIHRoZXkgYXJlIGVxdWFsLgotICAgICAqIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBGaWVsZCB3aXRoIHRoZSBzYW1lIGRlZmluaW5nIGNsYXNzIGFuZAotICAgICAqIG5hbWUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQge0Bjb2RlIG9iamVjdH0gaXMgZXF1YWwgdG8gdGhpcworICAgICAqIGZpZWxkLiBUbyBiZSBlcXVhbCwgdGhlIHNwZWNpZmllZCBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZgorICAgICAqIHtAY29kZSBGaWVsZH0gd2l0aCB0aGUgc2FtZSBkZWNsYXJpbmcgY2xhc3MsIHR5cGUgYW5kIG5hbWUgYXMgdGhpcyBmaWVsZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIEZpZWxkLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBtZXRob2QsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTIwNCwyNDggKzIxNywyNTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhpcyByZXByb2R1Y2VzCi0gICAgICogdGhlIGVmZmVjdCBvZiA8Y29kZT5vYmplY3QuZmllbGROYW1lPC9jb2RlPgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhpcyByZXByb2R1Y2VzCisgICAgICogdGhlIGVmZmVjdCBvZiB7QGNvZGUgb2JqZWN0LmZpZWxkTmFtZX0KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbW9kZWxlZCBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KKyAgICAgKiBJZiB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkIGlzIGEgcHJpbWl0aXZlIHR5cGUsIHRoZSBmaWVsZCB2YWx1ZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgd3JhcHBlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgogICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4gSWYKICAgICAgKiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBtZXRob2QsIGFuCiAgICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGlzIEZpZWxkIG9iamVjdCBpcyBlbmZvcmNpbmcgYWNjZXNzIGNvbnRyb2wgKHNlZSBBY2Nlc3NpYmxlT2JqZWN0KQotICAgICAqIGFuZCB0aGUgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCisgICAgICogYW5kIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgogICAgICAqIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaXMgcmV0dXJuZWQuIElmIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQgaXMgYSBiYXNlCi0gICAgICogdHlwZSwgdGhlIGZpZWxkIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgd3JhcHBlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFjY2VzcwogICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHZhbHVlLCBwb3NzaWJseSB3cmFwcGVkCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRGaWVsZChvYmplY3QsIGRlY2xhcmluZ0NsYXNzLCB0eXBlLCBzbG90LCBmbGFnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIGJvb2xlYW4uIFRoaXMKLSAgICAgKiByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+b2JqZWN0LmZpZWxkTmFtZTwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgYXMgYSB7QGNvZGUKKyAgICAgKiBib29sZWFufS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWV9CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1vZGVsZWQgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIG51bGwsIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLiBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIG1ldGhvZCwgYW4KLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcworICAgICAqIHRocm93bi4gSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBGaWVsZCBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUgQWNjZXNzaWJsZU9iamVjdCkKLSAgICAgKiBhbmQgdGhlIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgorICAgICAqIGFuZCB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KICAgICAgKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFjY2VzcwogICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCBvYmplY3QpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCBvYmplY3QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldFpGaWVsZChvYmplY3QsIGRlY2xhcmluZ0NsYXNzLCB0eXBlLCBzbG90LCBmbGFnLCBUWVBFX0JPT0xFQU4pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEgYnl0ZS4gVGhpcwotICAgICAqIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5vYmplY3QuZmllbGROYW1lPC9jb2RlPgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIHtAY29kZSBieXRlfS4KKyAgICAgKiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgb2JqZWN0LmZpZWxkTmFtZX0KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbW9kZWxlZCBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KLSAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCi0gICAgICogdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgbWV0aG9kLCBhbgotICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KKyAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMge0Bjb2RlIG51bGx9LCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZQorICAgICAqIG1ldGhvZCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGlzIEZpZWxkIG9iamVjdCBpcyBlbmZvcmNpbmcgYWNjZXNzIGNvbnRyb2wgKHNlZSBBY2Nlc3NpYmxlT2JqZWN0KQotICAgICAqIGFuZCB0aGUgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCisgICAgICogYW5kIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgogICAgICAqIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWNjZXNzCiAgICAgICogQHJldHVybiB0aGUgZmllbGQgdmFsdWUKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgZmllbGQgaXMgbm9uLXN0YXRpYworICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUgZmllbGQgaXMgbm9uLXN0YXRpYwogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJpbmcgY2xhc3MKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRCRmllbGQob2JqZWN0LCBkZWNsYXJpbmdDbGFzcywgdHlwZSwgc2xvdCwgZmxhZywgVFlQRV9CWVRFKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIGNoYXIuIFRoaXMKLSAgICAgKiByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+b2JqZWN0LmZpZWxkTmFtZTwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgYXMgYSB7QGNvZGUgY2hhcn0uCisgICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWV9CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1vZGVsZWQgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIG51bGwsIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLiBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIG1ldGhvZCwgYW4KLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcworICAgICAqIHRocm93bi4gSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBGaWVsZCBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUgQWNjZXNzaWJsZU9iamVjdCkKLSAgICAgKiBhbmQgdGhlIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgorICAgICAqIGFuZCB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KICAgICAgKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFjY2VzcwogICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgY2hhciBnZXRDaGFyKE9iamVjdCBvYmplY3QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgY2hhciBnZXRDaGFyKE9iamVjdCBvYmplY3QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0Q0ZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIFRZUEVfQ0hBUik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB7QGxpbmsgQ2xhc3N9IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xhc3MgdGhhdCBkZWZpbmVkIHRoaXMKLSAgICAgKiBmaWVsZC4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoaXMgZmllbGQuCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNsYXJpbmcgY2xhc3MKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CiAgICAgICAgIHJldHVybiBkZWNsYXJpbmdDbGFzczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIGRvdWJsZS4gVGhpcwotICAgICAqIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5vYmplY3QuZmllbGROYW1lPC9jb2RlPgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIHtAY29kZQorICAgICAqIGRvdWJsZX0uIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZSBvYmplY3QuZmllbGROYW1lfQogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtb2RlbGVkIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgotICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4gSWYKLSAgICAgKiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBtZXRob2QsIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgorICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0sIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uIElmIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlCisgICAgICogbWV0aG9kLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgRmllbGQgb2JqZWN0IGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbCAoc2VlIEFjY2Vzc2libGVPYmplY3QpCi0gICAgICogYW5kIHRoZSBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KKyAgICAgKiBhbmQgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCiAgICAgICogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAogICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhY2Nlc3MKICAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZCB2YWx1ZQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIG51bGwgYW5kIHRoZSBmaWVsZCBpcyBub24tc3RhdGljCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoZSBmaWVsZCBpcyBub24tc3RhdGljCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGRlY2xhcmluZyBjbGFzcwogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IG9iamVjdCkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKE9iamVjdCBvYmplY3QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0REZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIFRZUEVfRE9VQkxFKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIGZsb2F0LiBUaGlzCi0gICAgICogcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPm9iamVjdC5maWVsZE5hbWU8L2NvZGU+CisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEge0Bjb2RlIGZsb2F0fQorICAgICAqIC4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWV9CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1vZGVsZWQgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIG51bGwsIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLiBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIG1ldGhvZCwgYW4KLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcworICAgICAqIHRocm93bi4gSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBGaWVsZCBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUgQWNjZXNzaWJsZU9iamVjdCkKLSAgICAgKiBhbmQgdGhlIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgorICAgICAqIGFuZCB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KICAgICAgKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFjY2VzcwogICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldEZGaWVsZChvYmplY3QsIGRlY2xhcmluZ0NsYXNzLCB0eXBlLCBzbG90LCBmbGFnLCBUWVBFX0ZMT0FUKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhbiBpbnQuIFRoaXMKLSAgICAgKiByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+b2JqZWN0LmZpZWxkTmFtZTwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgYXMgYW4ge0Bjb2RlIGludH0uCisgICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWV9CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1vZGVsZWQgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIG51bGwsIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLiBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIG1ldGhvZCwgYW4KLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcworICAgICAqIHRocm93bi4gSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBGaWVsZCBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUgQWNjZXNzaWJsZU9iamVjdCkKLSAgICAgKiBhbmQgdGhlIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgorICAgICAqIGFuZCB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KICAgICAgKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFjY2VzcwogICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludChPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgcHVibGljIGludCBnZXRJbnQoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRJRmllbGQob2JqZWN0LCBkZWNsYXJpbmdDbGFzcywgdHlwZSwgc2xvdCwgZmxhZywgVFlQRV9JTlRFR0VSKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIGxvbmcuIFRoaXMKLSAgICAgKiByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+b2JqZWN0LmZpZWxkTmFtZTwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgYXMgYSB7QGNvZGUgbG9uZ30uCisgICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWV9CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1vZGVsZWQgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIG51bGwsIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLiBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIG1ldGhvZCwgYW4KLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcworICAgICAqIHRocm93bi4gSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBGaWVsZCBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUgQWNjZXNzaWJsZU9iamVjdCkKLSAgICAgKiBhbmQgdGhlIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgorICAgICAqIGFuZCB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KICAgICAgKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFjY2VzcwogICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKE9iamVjdCBvYmplY3QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKE9iamVjdCBvYmplY3QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0SkZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIFRZUEVfTE9ORyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBtb2RpZmllcnMgZm9yIHRoZSBtb2RlbGVkIGZpZWxkLiBUaGUgTW9kaWZpZXIgY2xhc3Mgc2hvdWxkIGJlCi0gICAgICogdXNlZCB0byBkZWNvZGUgdGhlIHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtb2RpZmllcnMKLSAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyCisgICAgICogUmV0dXJucyB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGZpZWxkLiBUaGUge0BsaW5rIE1vZGlmaWVyfSBjbGFzcyBzaG91bGQKKyAgICAgKiBiZSB1c2VkIHRvIGRlY29kZSB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGZpZWxkCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewogICAgICAgICByZXR1cm4gZ2V0RmllbGRNb2RpZmllcnMoZGVjbGFyaW5nQ2xhc3MsIHNsb3QpOwpAQCAtNDU0LDQwICs0NzAsNDAgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0RmllbGRNb2RpZmllcnMoQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIGludCBzbG90KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbW9kZWxlZCBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIHNob3J0LiBUaGlzCi0gICAgICogcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPm9iamVjdC5maWVsZE5hbWU8L2NvZGU+CisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEge0Bjb2RlIHNob3J0fQorICAgICAqIC4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWV9CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1vZGVsZWQgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIG51bGwsIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLiBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIG1ldGhvZCwgYW4KLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcworICAgICAqIHRocm93bi4gSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBGaWVsZCBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUgQWNjZXNzaWJsZU9iamVjdCkKLSAgICAgKiBhbmQgdGhlIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgorICAgICAqIGFuZCB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KICAgICAgKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiA8cD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFjY2VzcwogICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldFNGaWVsZChvYmplY3QsIGRlY2xhcmluZ0NsYXNzLCB0eXBlLCBzbG90LCBmbGFnLCBUWVBFX1NIT1JUKTsKICAgICB9CiAKQEAgLTQ5Niw3ICs1MTIsOCBAQAogICAgICAqIChvbmx5KSBmcm9tIElPIG5hdGl2ZSBjb2RlIGFuZCBuZWVkZWQgZm9yIGRlcml2aW5nIHRoZSBzZXJpYWxWZXJzaW9uVUlECiAgICAgICogb2YgdGhlIGNsYXNzCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgY29uc3RydWN0b3IncyBzaWduYXR1cmUuCisgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0b3IncyBzaWduYXR1cmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewpAQCAtNTA2LDcxICs1MjMsNzkgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBDbGFzc30gYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzczw/PiBnZXRUeXBlKCkgewogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGlzIGZpZWxkLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAorICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGhhc2ggY29kZSBmb3IgYSBGaWVsZCBpcyB0aGUgaGFzaCBjb2RlIG9mIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogVGhlIGhhc2ggY29kZSBmb3IgYSBGaWVsZCBpcyB0aGUgZXhjbHVzaXZlLW9yIGNvbWJpbmF0aW9uIG9mIHRoZSBoYXNoCisgICAgICogY29kZSBvZiB0aGUgZmllbGQncyBuYW1lIGFuZCB0aGUgaGFzaCBjb2RlIG9mIHRoZSBuYW1lIG9mIGl0cyBkZWNsYXJpbmcKKyAgICAgKiBjbGFzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgZmllbGQKICAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKSBeIGdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5vYmplY3QuZmllbGROYW1lID0gdmFsdWU8L2NvZGU+CisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSB2YWx1ZS4gVGhpcworICAgICAqIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgb2JqZWN0LmZpZWxkTmFtZSA9IHZhbHVlfQogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtb2RlbGVkIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgotICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4gSWYKLSAgICAgKiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBtZXRob2QsIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgorICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0sIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uIElmIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlCisgICAgICogbWV0aG9kLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgRmllbGQgb2JqZWN0IGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbCAoc2VlIEFjY2Vzc2libGVPYmplY3QpCi0gICAgICogYW5kIHRoZSBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KKyAgICAgKiBhbmQgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCiAgICAgICogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIGZpZWxkIHR5cGUgaXMgYSBiYXNlIHR5cGUsIHRoZSB2YWx1ZSBpcyBhdXRvbWF0aWNhbGx5IHVud3JhcHBlZC4KLSAgICAgKiBJZiB0aGUgdW53cmFwIGZhaWxzLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLiBJZiB0aGUgdmFsdWUKLSAgICAgKiBjYW5ub3QgYmUgY29udmVydGVkIHRvIHRoZSBmaWVsZCB0eXBlIHZpYSBhIHdpZGVuaW5nIGNvbnZlcnNpb24sIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBJZiB0aGUgZmllbGQgdHlwZSBpcyBhIHByaW1pdGl2ZSB0eXBlLCB0aGUgdmFsdWUgaXMgYXV0b21hdGljYWxseQorICAgICAqIHVud3JhcHBlZC4gSWYgdGhlIHVud3JhcCBmYWlscywgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4gSWYKKyAgICAgKiB0aGUgdmFsdWUgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUgZmllbGQgdHlwZSB2aWEgYSB3aWRlbmluZworICAgICAqIGNvbnZlcnNpb24sIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAogICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhY2Nlc3MKICAgICAgKiBAcGFyYW0gdmFsdWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgZmllbGQgaXMgbm9uLXN0YXRpYworICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUgZmllbGQgaXMgbm9uLXN0YXRpYwogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJpbmcgY2xhc3MKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIHNldEZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIHZhbHVlKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiA8Y29kZT5vYmplY3QuZmllbGROYW1lID0gdmFsdWU8L2NvZGU+CisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSB7QGNvZGUKKyAgICAgKiBib29sZWFufSB2YWx1ZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWUgPQorICAgICAqIHZhbHVlfQogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtb2RlbGVkIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgotICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4gSWYKLSAgICAgKiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBtZXRob2QsIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgorICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0sIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uIElmIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlCisgICAgICogbWV0aG9kLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgRmllbGQgb2JqZWN0IGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbCAoc2VlIEFjY2Vzc2libGVPYmplY3QpCi0gICAgICogYW5kIHRoZSBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KKyAgICAgKiBhbmQgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCiAgICAgICogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZpZWxkIHR5cGUgdmlhIGEgd2lkZW5pbmcKQEAgLTU4MSwyOCArNjA2LDI5IEBACiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKE9iamVjdCBvYmplY3QsIGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKE9iamVjdCBvYmplY3QsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgc2V0WkZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIFRZUEVfQk9PTEVBTiwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBieXRlIHZhbHVlLgotICAgICAqIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPm9iamVjdC5maWVsZE5hbWUgPSB2YWx1ZTwvY29kZT4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHtAY29kZSBieXRlfQorICAgICAqIHZhbHVlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgb2JqZWN0LmZpZWxkTmFtZSA9IHZhbHVlfQogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtb2RlbGVkIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgotICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4gSWYKLSAgICAgKiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBtZXRob2QsIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgorICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0sIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uIElmIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlCisgICAgICogbWV0aG9kLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgRmllbGQgb2JqZWN0IGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbCAoc2VlIEFjY2Vzc2libGVPYmplY3QpCi0gICAgICogYW5kIHRoZSBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KKyAgICAgKiBhbmQgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCiAgICAgICogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZpZWxkIHR5cGUgdmlhIGEgd2lkZW5pbmcKQEAgLTYxMywyOCArNjM5LDI5IEBACiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlKE9iamVjdCBvYmplY3QsIGJ5dGUgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRCeXRlKE9iamVjdCBvYmplY3QsIGJ5dGUgdmFsdWUpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgc2V0QkZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIFRZUEVfQllURSwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBjaGFyIHZhbHVlLgotICAgICAqIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPm9iamVjdC5maWVsZE5hbWUgPSB2YWx1ZTwvY29kZT4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHtAY29kZSBjaGFyfQorICAgICAqIHZhbHVlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgb2JqZWN0LmZpZWxkTmFtZSA9IHZhbHVlfQogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtb2RlbGVkIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgotICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4gSWYKLSAgICAgKiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBtZXRob2QsIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgorICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0sIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uIElmIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlCisgICAgICogbWV0aG9kLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgRmllbGQgb2JqZWN0IGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbCAoc2VlIEFjY2Vzc2libGVPYmplY3QpCi0gICAgICogYW5kIHRoZSBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KKyAgICAgKiBhbmQgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCiAgICAgICogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZpZWxkIHR5cGUgdmlhIGEgd2lkZW5pbmcKQEAgLTY0NSwyOCArNjcyLDI5IEBACiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFyKE9iamVjdCBvYmplY3QsIGNoYXIgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyKE9iamVjdCBvYmplY3QsIGNoYXIgdmFsdWUpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgc2V0Q0ZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIFRZUEVfQ0hBUiwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBkb3VibGUgdmFsdWUuCi0gICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+b2JqZWN0LmZpZWxkTmFtZSA9IHZhbHVlPC9jb2RlPgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUge0Bjb2RlIGRvdWJsZX0KKyAgICAgKiB2YWx1ZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWUgPSB2YWx1ZX0KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbW9kZWxlZCBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KLSAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCi0gICAgICogdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgbWV0aG9kLCBhbgotICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KKyAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMge0Bjb2RlIG51bGx9LCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZQorICAgICAqIG1ldGhvZCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGlzIEZpZWxkIG9iamVjdCBpcyBlbmZvcmNpbmcgYWNjZXNzIGNvbnRyb2wgKHNlZSBBY2Nlc3NpYmxlT2JqZWN0KQotICAgICAqIGFuZCB0aGUgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCisgICAgICogYW5kIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgogICAgICAqIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHRoZSBmaWVsZCB0eXBlIHZpYSBhIHdpZGVuaW5nCkBAIC02NzcsMjggKzcwNSwyOSBAQAogICAgICAqIEBwYXJhbSB2YWx1ZQogICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIG51bGwgYW5kIHRoZSBmaWVsZCBpcyBub24tc3RhdGljCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoZSBmaWVsZCBpcyBub24tc3RhdGljCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGRlY2xhcmluZyBjbGFzcwogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlKE9iamVjdCBvYmplY3QsIGRvdWJsZSB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShPYmplY3Qgb2JqZWN0LCBkb3VibGUgdmFsdWUpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgc2V0REZpZWxkKG9iamVjdCwgZGVjbGFyaW5nQ2xhc3MsIHR5cGUsIHNsb3QsIGZsYWcsIFRZUEVfRE9VQkxFLCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIGZsb2F0IHZhbHVlLgotICAgICAqIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPm9iamVjdC5maWVsZE5hbWUgPSB2YWx1ZTwvY29kZT4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHtAY29kZSBmbG9hdH0KKyAgICAgKiB2YWx1ZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWUgPSB2YWx1ZX0KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbW9kZWxlZCBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KLSAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCi0gICAgICogdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgbWV0aG9kLCBhbgotICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KKyAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMge0Bjb2RlIG51bGx9LCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZQorICAgICAqIG1ldGhvZCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGlzIEZpZWxkIG9iamVjdCBpcyBlbmZvcmNpbmcgYWNjZXNzIGNvbnRyb2wgKHNlZSBBY2Nlc3NpYmxlT2JqZWN0KQotICAgICAqIGFuZCB0aGUgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCisgICAgICogYW5kIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgogICAgICAqIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHRoZSBmaWVsZCB0eXBlIHZpYSBhIHdpZGVuaW5nCkBAIC03MDksMjggKzczOCwyOSBAQAogICAgICAqIEBwYXJhbSB2YWx1ZQogICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIG51bGwgYW5kIHRoZSBmaWVsZCBpcyBub24tc3RhdGljCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoZSBmaWVsZCBpcyBub24tc3RhdGljCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGRlY2xhcmluZyBjbGFzcwogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmxvYXQoT2JqZWN0IG9iamVjdCwgZmxvYXQgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdChPYmplY3Qgb2JqZWN0LCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBzZXRGRmllbGQob2JqZWN0LCBkZWNsYXJpbmdDbGFzcywgdHlwZSwgc2xvdCwgZmxhZywgVFlQRV9GTE9BVCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBpbnQgdmFsdWUuIFRoaXMKLSAgICAgKiByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+b2JqZWN0LmZpZWxkTmFtZSA9IHZhbHVlPC9jb2RlPgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSB7QGNvZGUgaW50fQorICAgICAqIHZhbHVlLiBUaGlzIHJlcHJvZHVjZXMgdGhlIGVmZmVjdCBvZiB7QGNvZGUgb2JqZWN0LmZpZWxkTmFtZSA9IHZhbHVlfQogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtb2RlbGVkIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgotICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4gSWYKLSAgICAgKiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBtZXRob2QsIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHN0YXRpYywgdGhlIG9iamVjdCBhcmd1bWVudCBpcyBpZ25vcmVkLgorICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0sIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uIElmIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlCisgICAgICogbWV0aG9kLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgRmllbGQgb2JqZWN0IGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbCAoc2VlIEFjY2Vzc2libGVPYmplY3QpCi0gICAgICogYW5kIHRoZSBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KKyAgICAgKiBhbmQgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCiAgICAgICogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZpZWxkIHR5cGUgdmlhIGEgd2lkZW5pbmcKQEAgLTc0MSwyOCArNzcxLDI5IEBACiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnQoT2JqZWN0IG9iamVjdCwgaW50IHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgc2V0SW50KE9iamVjdCBvYmplY3QsIGludCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBzZXRJRmllbGQob2JqZWN0LCBkZWNsYXJpbmdDbGFzcywgdHlwZSwgc2xvdCwgZmxhZywgVFlQRV9JTlRFR0VSLCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIGxvbmcgdmFsdWUuCi0gICAgICogVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2YgPGNvZGU+b2JqZWN0LmZpZWxkTmFtZSA9IHZhbHVlPC9jb2RlPgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUge0Bjb2RlIGxvbmd9CisgICAgICogdmFsdWUuIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIHtAY29kZSBvYmplY3QuZmllbGROYW1lID0gdmFsdWV9CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1vZGVsZWQgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIG51bGwsIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLiBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIG1ldGhvZCwgYW4KLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgc3RhdGljLCB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcworICAgICAqIHRocm93bi4gSWYgdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBGaWVsZCBvYmplY3QgaXMgZW5mb3JjaW5nIGFjY2VzcyBjb250cm9sIChzZWUgQWNjZXNzaWJsZU9iamVjdCkKLSAgICAgKiBhbmQgdGhlIG1vZGVsZWQgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgorICAgICAqIGFuZCB0aGlzIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgYW4KICAgICAgKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUgZmllbGQgdHlwZSB2aWEgYSB3aWRlbmluZwpAQCAtNzczLDI4ICs4MDQsMjkgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgZmllbGQgaXMgbm9uLXN0YXRpYworICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUgZmllbGQgaXMgbm9uLXN0YXRpYwogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJpbmcgY2xhc3MKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBtb2RlbGVkIGZpZWxkIGlzIG5vdCBhY2Nlc3NpYmxlCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvbmcoT2JqZWN0IG9iamVjdCwgbG9uZyB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldExvbmcoT2JqZWN0IG9iamVjdCwgbG9uZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBzZXRKRmllbGQob2JqZWN0LCBkZWNsYXJpbmdDbGFzcywgdHlwZSwgc2xvdCwgZmxhZywgVFlQRV9MT05HLCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHNob3J0IHZhbHVlLgotICAgICAqIFRoaXMgcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mIDxjb2RlPm9iamVjdC5maWVsZE5hbWUgPSB2YWx1ZTwvY29kZT4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHtAY29kZSBzaG9ydH0KKyAgICAgKiB2YWx1ZS4gVGhpcyByZXByb2R1Y2VzIHRoZSBlZmZlY3Qgb2Yge0Bjb2RlIG9iamVjdC5maWVsZE5hbWUgPSB2YWx1ZX0KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbW9kZWxlZCBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KLSAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCi0gICAgICogdGhlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgbWV0aG9kLCBhbgotICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBzdGF0aWMsIHRoZSBvYmplY3QgYXJndW1lbnQgaXMgaWdub3JlZC4KKyAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSBvYmplY3QgaXMge0Bjb2RlIG51bGx9LCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZQorICAgICAqIG1ldGhvZCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGlzIEZpZWxkIG9iamVjdCBpcyBlbmZvcmNpbmcgYWNjZXNzIGNvbnRyb2wgKHNlZSBBY2Nlc3NpYmxlT2JqZWN0KQotICAgICAqIGFuZCB0aGUgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuCisgICAgICogYW5kIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBhbgogICAgICAqIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIDxwPgogICAgICAqIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHRoZSBmaWVsZCB0eXBlIHZpYSBhIHdpZGVuaW5nCkBAIC04MDUsMTE5ICs4MzcsMTA0IEBACiAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGZpZWxkIGlzIG5vbi1zdGF0aWMKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbW9kZWxlZCBmaWVsZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmllbGQgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChPYmplY3Qgb2JqZWN0LCBzaG9ydCB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0KE9iamVjdCBvYmplY3QsIHNob3J0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIHNldFNGaWVsZChvYmplY3QsIGRlY2xhcmluZ0NsYXNzLCB0eXBlLCBzbG90LCBmbGFnLCBUWVBFX1NIT1JULCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIGZpZWxkLgogICAgICAqIDxwPgogICAgICAqIFRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZyBpczoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPm1vZGlmaWVycyAoaWYgYW55KQotICAgICAqIDxsaT5yZXR1cm4gdHlwZQotICAgICAqIDxsaT5kZWNsYXJpbmcgY2xhc3MgbmFtZQotICAgICAqIDxsaT4nLicKLSAgICAgKiA8bGk+ZmllbGQgbmFtZQotICAgICAqIDwvdWw+CisgICAgICogPG9sPgorICAgICAqICAgPGxpPm1vZGlmaWVycyAoaWYgYW55KQorICAgICAqICAgPGxpPnR5cGUKKyAgICAgKiAgIDxsaT5kZWNsYXJpbmcgY2xhc3MgbmFtZQorICAgICAqICAgPGxpPicuJworICAgICAqICAgPGxpPmZpZWxkIG5hbWUKKyAgICAgKiA8L29sPgogICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlOgotICAgICAqIDxjb2RlPnB1YmxpYyBzdGF0aWMgamF2YS5pby5JbnB1dFN0cmVhbSBqYXZhLmxhbmcuU3lzdGVtLmluPC9jb2RlPgorICAgICAqIEZvciBleGFtcGxlOiB7QGNvZGUgcHVibGljIHN0YXRpYyBqYXZhLmlvLklucHV0U3RyZWFtCisgICAgICogamF2YS5sYW5nLlN5c3RlbS5pbn0KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIKKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGZpZWxkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoTW9kaWZpZXIudG9TdHJpbmcoZ2V0TW9kaWZpZXJzKCkpKTsKIAotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpICE9IDApICAgICAgIC8vIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpICE9IDApCiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQodHlwZS5nZXROYW1lKCkpOwogICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGVjbGFyaW5nQ2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZCgnLicpOwogICAgICAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgICAgICAKKwogICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgfQotICAgIAotICAgIHByaXZhdGUgbmF0aXZlIE9iamVjdCBnZXRGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsCi0gICAgICAgICAgICBpbnQgc2xvdCwgYm9vbGVhbiBub0FjY2Vzc0NoZWNrKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIAotICAgIHByaXZhdGUgbmF0aXZlIGRvdWJsZSBnZXRERmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLAotICAgICAgICAgICAgaW50IHNsb3QsIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8pCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSBPYmplY3QgZ2V0RmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLCBpbnQgc2xvdCwKKyAgICAgICAgICAgIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0SUZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwKLSAgICAgICAgICAgIGludCBzbG90LCBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgZG91YmxlIGdldERGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBsb25nIGdldEpGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsCi0gICAgICAgICAgICBpbnQgc2xvdCwgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIGludCBnZXRJRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLCBpbnQgc2xvdCwKKyAgICAgICAgICAgIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8pIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBnZXRaRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLAotICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwgaW50IHNsb3QsIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8pCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSBsb25nIGdldEpGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBmbG9hdCBnZXRGRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLAotICAgICAgICAgICAgaW50IHNsb3QsIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8pCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGdldFpGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBjaGFyIGdldENGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsCi0gICAgICAgICAgICBpbnQgc2xvdCwgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIGZsb2F0IGdldEZGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBzaG9ydCBnZXRTRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLAotICAgICAgICAgICAgaW50IHNsb3QsIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8pCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSBjaGFyIGdldENGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBieXRlIGdldEJGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsCi0gICAgICAgICAgICBpbnQgc2xvdCwgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIHNob3J0IGdldFNGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNldEZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwKLSAgICAgICAgICAgIGludCBzbG90LCBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIE9iamVjdCB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIGJ5dGUgZ2V0QkZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwgaW50IHNsb3QsCisgICAgICAgICAgICBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2V0REZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwKLSAgICAgICAgICAgIGludCBzbG90LCBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vLCBkb3VibGUgdikKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2V0RmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLCBpbnQgc2xvdCwKKyAgICAgICAgICAgIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2V0SUZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwKLSAgICAgICAgICAgIGludCBzbG90LCBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vLCBpbnQgaSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2V0REZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwgaW50IHNsb3QsCisgICAgICAgICAgICBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vLCBkb3VibGUgdikgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNldEpGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsCi0gICAgICAgICAgICBpbnQgc2xvdCwgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubywgbG9uZyBqKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRJRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLCBpbnQgc2xvdCwKKyAgICAgICAgICAgIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8sIGludCBpKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2V0WkZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwKLSAgICAgICAgICAgIGludCBzbG90LCBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vLCBib29sZWFuIHopCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNldEpGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubywgbG9uZyBqKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2V0RkZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwKLSAgICAgICAgICAgIGludCBzbG90LCBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vLCBmbG9hdCBmKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRaRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLCBpbnQgc2xvdCwKKyAgICAgICAgICAgIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8sIGJvb2xlYW4geikgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNldENGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsCi0gICAgICAgICAgICBpbnQgc2xvdCwgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubywgY2hhciBjKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRGRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLCBpbnQgc2xvdCwKKyAgICAgICAgICAgIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8sIGZsb2F0IGYpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRTRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzLCBDbGFzczw/PiB0eXBlLAotICAgICAgICAgICAgaW50IHNsb3QsIGJvb2xlYW4gbm9BY2Nlc3NDaGVjaywgaW50IHR5cGVfbm8sIHNob3J0IHMpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNldENGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubywgY2hhciBjKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2V0QkZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgQ2xhc3M8Pz4gdHlwZSwKLSAgICAgICAgICAgIGludCBzbG90LCBib29sZWFuIG5vQWNjZXNzQ2hlY2ssIGludCB0eXBlX25vLCBieXRlIGIpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKLSAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNldFNGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubywgc2hvcnQgcykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNldEJGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsIENsYXNzPD8+IHR5cGUsIGludCBzbG90LAorICAgICAgICAgICAgYm9vbGVhbiBub0FjY2Vzc0NoZWNrLCBpbnQgdHlwZV9ubywgYnl0ZSBiKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKwogfQpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kLmphdmEKaW5kZXggM2ZhY2NhNS4uN2ZjMDMyMiAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QuamF2YQorKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L01ldGhvZC5qYXZhCkBAIC0xNCwyMiArMTQsMzYgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5HZW5lcmljU2lnbmF0dXJlUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlczsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuVHlwZXM7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQogCiAvKioKLSAqIFRoaXMgY2xhc3MgbW9kZWxzIGEgbWV0aG9kLiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWV0aG9kIGNhbiBiZSBhY2Nlc3NlZCwgYW5kCi0gKiB0aGUgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGR5bmFtaWNhbGx5LgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbWV0aG9kLiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWV0aG9kIGNhbiBiZSBhY2Nlc3NlZCwKKyAqIGFuZCB0aGUgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGR5bmFtaWNhbGx5LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZCBleHRlbmRzIEFjY2Vzc2libGVPYmplY3QgaW1wbGVtZW50cyBHZW5lcmljRGVjbGFyYXRpb24sIE1lbWJlciB7CiAgICAgCkBAIC00NSw3ICs1OSw2IEBACiAgICAgCiAgICAgcHJpdmF0ZSBDbGFzczw/PiByZXR1cm5UeXBlOwogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIHByaXZhdGUgTGlzdE9mVHlwZXMgZ2VuZXJpY0V4Y2VwdGlvblR5cGVzOwogICAgIHByaXZhdGUgTGlzdE9mVHlwZXMgZ2VuZXJpY1BhcmFtZXRlclR5cGVzOwogICAgIHByaXZhdGUgVHlwZSBnZW5lcmljUmV0dXJuVHlwZTsKQEAgLTY0LDIxICs3NywxMCBAQAogICAgICAgICAgICAgZ2VuZXJpY1R5cGVzQXJlSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCi0gICAgCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0gICAgLyoqCi0gICAgICogUHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkCi0gICAgICovCi0gICAgLy9wcml2YXRlIE1ldGhvZCgpewotICAgICAgICAvL2RvIG5vdGhpbmcKLSAgICAvL30KLSAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAKLSAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgY2xvbmUgb2YgdGhlIGdpdmVuIGluc3RhbmNlLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIG9yaWcgbm9uLW51bGw7IHRoZSBvcmlnaW5hbCBpbnN0YW5jZSB0byBjbG9uZQogICAgICAqLwogICAgIC8qcGFja2FnZSovIE1ldGhvZChNZXRob2Qgb3JpZykgewpAQCAtOTAsNyArOTIsNiBAQAogICAgICAgICAgICAgdGhpcy5mbGFnID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAgICAgcHJpdmF0ZSBNZXRob2QoQ2xhc3M8Pz4gZGVjbGFyaW5nLCBDbGFzczw/PltdIHBhcmFtVHlwZXMsIENsYXNzPD8+W10gZXhjZXB0VHlwZXMsIENsYXNzPD8+IHJldHVyblR5cGUsIFN0cmluZyBuYW1lLCBpbnQgc2xvdCkKICAgICB7CkBAIC0xMDMsMTQgKzEwNCwxMCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBUeXBlVmFyaWFibGU8TWV0aG9kPltdIGdldFR5cGVQYXJhbWV0ZXJzKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaW5pdEdlbmVyaWNUeXBlcygpOwogICAgICAgICByZXR1cm4gZm9ybWFsVHlwZVBhcmFtZXRlcnMuY2xvbmUoKTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAotCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBAT3ZlcnJpZGUgLypwYWNrYWdlKi8gU3RyaW5nIGdldFNpZ25hdHVyZUF0dHJpYnV0ZSgpIHsKICAgICAgICAgT2JqZWN0W10gYW5ub3RhdGlvbiA9IGdldFNpZ25hdHVyZUFubm90YXRpb24oZGVjbGFyaW5nQ2xhc3MsIHNsb3QpOwpAQCAtMTIzLDI1ICsxMjAsMjEgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgU2lnbmF0dXJlIGFubm90YXRpb24gZm9yIHRoaXMgbWV0aG9kLiBSZXR1cm5zIG51bGwgaWYKKyAgICAgKiBSZXR1cm5zIHRoZSBTaWduYXR1cmUgYW5ub3RhdGlvbiBmb3IgdGhpcyBtZXRob2QuIFJldHVybnMge0Bjb2RlIG51bGx9IGlmCiAgICAgICogbm90IGZvdW5kLgogICAgICAqLwogICAgIG5hdGl2ZSBwcml2YXRlIE9iamVjdFtdIGdldFNpZ25hdHVyZUFubm90YXRpb24oQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsCiAgICAgICAgICAgICBpbnQgc2xvdCk7CiAKLSAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0KICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCdzIGRlY2xhcmF0aW9uLCBpbmNsdWRpbmcKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCdzIGRlY2xhcmF0aW9uLCBpbmNsdWRpbmcKICAgICAgKiB0aGUgdHlwZSBwYXJhbWV0ZXJzLgotICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgU3RyaW5nLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvR2VuZXJpY1N0cmluZygpIHsKLSAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcig4MCk7CiAgICAgICAgIAogICAgICAgICBpbml0R2VuZXJpY1R5cGVzKCk7CkBAIC0xNzQsNyArMTY3LDcgQEAKICAgICAgICAgYXBwZW5kQXJyYXlHZW5lcmljVHlwZShzYiwgCiAgICAgICAgICAgICAgICAgVHlwZXMuZ2V0Q2xvbmVkVHlwZUFycmF5KGdlbmVyaWNQYXJhbWV0ZXJUeXBlcykpOwogICAgICAgICBzYi5hcHBlbmQoJyknKTsKLSAgICAgICAgLy8gYXBwZW5kIGV4ZXB0aW9ucyBpZiBhbnkKKyAgICAgICAgLy8gYXBwZW5kIGV4Y2VwdGlvbnMgaWYgYW55CiAgICAgICAgIFR5cGVbXSBnZW5lcmljRXhjZXB0aW9uVHlwZUFycmF5ID0gVHlwZXMuZ2V0Q2xvbmVkVHlwZUFycmF5KAogICAgICAgICAgICAgICAgIGdlbmVyaWNFeGNlcHRpb25UeXBlcyk7CiAgICAgICAgIGlmIChnZW5lcmljRXhjZXB0aW9uVHlwZUFycmF5Lmxlbmd0aCA+IDApIHsKQEAgLTE4Miw3MyArMTc1LDY5IEBACiAgICAgICAgICAgICBhcHBlbmRBcnJheUdlbmVyaWNUeXBlKHNiLCBnZW5lcmljRXhjZXB0aW9uVHlwZUFycmF5KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdldHMgdGhlIHBhcmFtZXRlciB0eXBlcyBhcyBhbiBhcnJheSBvZiB7QGxpbmsgVHlwZX0gaW5zdGFuY2VzLCBpbgotICAgICAqIGRlY2xhcmF0aW9uIG9yZGVyLiBJZiB0aGUgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzLCB0aGVuIGFuIGVtcHR5IGFycmF5Ci0gICAgICogaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlciB0eXBlcyBhcyBhbiBhcnJheSBvZiB7QGNvZGUgVHlwZX0gaW5zdGFuY2VzLCBpbgorICAgICAqIGRlY2xhcmF0aW9uIG9yZGVyLiBJZiB0aGlzIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycywgYW4gZW1wdHkgYXJyYXkgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciB0eXBlcwogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Yge0BsaW5rIFR5cGV9IGluc3RhbmNlcy4KLSAgICAgKiBAdGhyb3dzIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvciBpZiB0aGUgZ2VuZXJpYyBtZXRob2Qgc2lnbmF0dXJlIGlzCi0gICAgICogICAgICAgICBpbnZhbGlkLgotICAgICAqIEB0aHJvd3MgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cyB0byBhIG1pc3NpbmcKLSAgICAgKiAgICAgICAgIHR5cGUuCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbiBpZiB0aGUgY29tcG9uZW50IHR5cGUgcG9pbnRzCi0gICAgICogICAgICAgICB0byBhIHR5cGUgdGhhdCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQgZm9yIHNvbWUgcmVhc29uLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAdGhyb3dzIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnZW5lcmljIG1ldGhvZCBzaWduYXR1cmUgaXMgaW52YWxpZAorICAgICAqIEB0aHJvd3MgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgcGFyYW1ldGVyIHR5cGUgcG9pbnRzIHRvIGEgbWlzc2luZyB0eXBlCisgICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBwYXJhbWV0ZXIgdHlwZSBwb2ludHMgdG8gYSB0eXBlIHRoYXQgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUeXBlW10gZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaW5pdEdlbmVyaWNUeXBlcygpOwogICAgICAgICByZXR1cm4gVHlwZXMuZ2V0Q2xvbmVkVHlwZUFycmF5KGdlbmVyaWNQYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZXRzIHRoZSBleGNlcHRpb24gdHlwZXMgYXMgYW4gYXJyYXkgb2Yge0BsaW5rIFR5cGV9IGluc3RhbmNlcy4gSWYgdGhlCi0gICAgICogbWV0aG9kIGhhcyBubyBkZWNsYXJlZCBleGNlcHRpb25zLCB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gdHlwZXMgYXMgYW4gYXJyYXkgb2Yge0Bjb2RlIFR5cGV9IGluc3RhbmNlcy4gSWYKKyAgICAgKiB0aGlzIG1ldGhvZCBoYXMgbm8gZGVjbGFyZWQgZXhjZXB0aW9ucywgYW4gZW1wdHkgYXJyYXkgd2lsbCBiZSByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBUeXBlfSBpbnN0YW5jZXMuCi0gICAgICogQHRocm93cyBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IgaWYgdGhlIGdlbmVyaWMgbWV0aG9kIHNpZ25hdHVyZSBpcwotICAgICAqICAgICAgICAgaW52YWxpZC4KLSAgICAgKiBAdGhyb3dzIFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uIGlmIHRoZSBjb21wb25lbnQgdHlwZSBwb2ludHMgdG8gYSBtaXNzaW5nCi0gICAgICogICAgICAgICB0eXBlLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cwotICAgICAqICAgICAgICAgdG8gYSB0eXBlIHRoYXQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBnZW5lcmljIGV4Y2VwdGlvbiB0eXBlcworICAgICAqIAorICAgICAqIEB0aHJvd3MgR2VuZXJpY1NpZ25hdHVyZUZvcm1hdEVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdlbmVyaWMgbWV0aG9kIHNpZ25hdHVyZSBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBleGNlcHRpb24gdHlwZSBwb2ludHMgdG8gYSBtaXNzaW5nIHR5cGUKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFBhcmFtZXRlcml6ZWRUeXBlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW55IGV4Y2VwdGlvbiB0eXBlIHBvaW50cyB0byBhIHR5cGUgdGhhdCBjYW5ub3QgYmUKKyAgICAgKiAgICAgICAgICAgICBpbnN0YW50aWF0ZWQgZm9yIHNvbWUgcmVhc29uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFR5cGVbXSBnZXRHZW5lcmljRXhjZXB0aW9uVHlwZXMoKSB7Ci0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpbml0R2VuZXJpY1R5cGVzKCk7CiAgICAgICAgIHJldHVybiBUeXBlcy5nZXRDbG9uZWRUeXBlQXJyYXkoZ2VuZXJpY0V4Y2VwdGlvblR5cGVzKTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdldHMgdGhlIHJldHVybiB0eXBlIGFzIGEge0BsaW5rIFR5cGV9IGluc3RhbmNlLgotICAgICAqIDwvcD4KKyAgICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBhcyBhIHtAY29kZSBUeXBlfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHtAbGluayBUeXBlfSBpbnN0YW5jZS4KLSAgICAgKiBAdGhyb3dzIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvciBpZiB0aGUgZ2VuZXJpYyBtZXRob2Qgc2lnbmF0dXJlIGlzCi0gICAgICogICAgICAgICBpbnZhbGlkLgotICAgICAqIEB0aHJvd3MgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cyB0byBhIG1pc3NpbmcKLSAgICAgKiAgICAgICAgIHR5cGUuCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbiBpZiB0aGUgY29tcG9uZW50IHR5cGUgcG9pbnRzCi0gICAgICogICAgICAgICB0byBhIHR5cGUgdGhhdCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQgZm9yIHNvbWUgcmVhc29uLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAdGhyb3dzIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnZW5lcmljIG1ldGhvZCBzaWduYXR1cmUgaXMgaW52YWxpZAorICAgICAqIEB0aHJvd3MgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmV0dXJuIHR5cGUgcG9pbnRzIHRvIGEgbWlzc2luZyB0eXBlCisgICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXR1cm4gdHlwZSBwb2ludHMgdG8gYSB0eXBlIHRoYXQgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUeXBlIGdldEdlbmVyaWNSZXR1cm5UeXBlKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaW5pdEdlbmVyaWNUeXBlcygpOwogICAgICAgICByZXR1cm4gVHlwZXMuZ2V0VHlwZShnZW5lcmljUmV0dXJuVHlwZSk7Ci0gICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1OCw3ICsyNDcsNiBAQAogICAgIG5hdGl2ZSBwcml2YXRlIEFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKENsYXNzIGRlY2xhcmluZ0NsYXNzLAogICAgICAgICBpbnQgc2xvdCk7CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uW10gTk9fQU5OT1RBVElPTlMgPSBuZXcgQW5ub3RhdGlvblswXTsKIAogICAgIC8qKgpAQCAtMjcxLDI3ICsyNTksMjMgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CiAgICAgfQotLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRoYXQgcmVwcmVzZW50IHRoZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybWFsCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhcnJheXMgdGhhdCByZXByZXNlbnQgdGhlIGFubm90YXRpb25zIG9mIHRoZSBmb3JtYWwKICAgICAgKiBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGVyZSBhcmUgbm8gcGFyYW1ldGVycyBvbiB0aGlzIG1ldGhvZCwKICAgICAgKiB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLiBJZiB0aGVyZSBhcmUgbm8gYW5ub3RhdGlvbnMgc2V0LCB0aGVuCiAgICAgICogYW5kIGFycmF5IG9mIGVtcHR5IGFycmF5cyBpcyByZXR1cm5lZC4KLSAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFycmF5cyBvZiB7QGNvZGUgQW5ub3RhdGlvbn0gaW5zdGFuY2VzCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBhcnJheXMgb2Yge0BsaW5rIEFubm90YXRpb259IGluc3RhbmNlcy4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFubm90YXRpb25bXVtdIGdldFBhcmFtZXRlckFubm90YXRpb25zKCkgewotLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIEFubm90YXRpb25bXVtdIHBhcmFtZXRlckFubm90YXRpb25zCiAgICAgICAgICAgICAgICAgPSBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhkZWNsYXJpbmdDbGFzcywgc2xvdCk7CiAgICAgICAgIGlmIChwYXJhbWV0ZXJBbm5vdGF0aW9ucy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIG5vQW5ub3RhdGlvbnMocGFyYW1ldGVyVHlwZXMubGVuZ3RoKTsKICAgICAgICAgfQotLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gcGFyYW1ldGVyQW5ub3RhdGlvbnM7CiAgICAgfQogCkBAIC0yOTksMTMgKzI4MywxMSBAQAogICAgICAgICBpbnQgc2xvdCk7CiAKICAgICAvKioKLSAgICAgKiA8cD4KICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBtZXRob2QgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgYXJndW1lbnQuCi0gICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSB2YXJhcmcgaXMgZGVjbGFyZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgdmFyYXJnIGlzIGRlY2xhcmUsIG90aGVyd2lzZQotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhckFyZ3MoKSB7CiAgICAgICAgIGludCBtb2RpZmllcnMgPSBnZXRNZXRob2RNb2RpZmllcnMoZGVjbGFyaW5nQ2xhc3MsIHNsb3QpOwpAQCAtMzEzLDEzICsyOTUsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBtZXRob2QgaXMgYSBicmlkZ2UuCi0gICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtZXRob2QgaXMgYSBicmlkZ2UsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWV0aG9kJ3MgYSBicmlkZ2UsCi0gICAgICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0JyaWRnZSgpIHsKICAgICAgICAgaW50IG1vZGlmaWVycyA9IGdldE1ldGhvZE1vZGlmaWVycyhkZWNsYXJpbmdDbGFzcywgc2xvdCk7CkBAIC0zMjcsMjYgKzMwNywyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIG1ldGhvZCBpcyBzeW50aGV0aWMuCi0gICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtZXRob2QgaXMgc3ludGhldGljLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqIAotICAgICAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1ldGhvZCBpcyBzeW50aGV0aWMsCi0gICAgICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHsKICAgICAgICAgaW50IG1vZGlmaWVycyA9IGdldE1ldGhvZE1vZGlmaWVycyhkZWNsYXJpbmdDbGFzcywgc2xvdCk7CiAgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgTW9kaWZpZXIuU1lOVEhFVElDKSAhPSAwOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIDxwPkdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhbm5vdGF0aW9uIG1lbWJlciByZXByZXNlbnRlZCBieQotICAgICAqIHRoaXMgbWV0aG9kLjwvcD4KLSAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICogQHRocm93cyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbiBpZiB0aGUgYW5ub3RhdGlvbiBpcyBvZiB0eXBlIHtAbGluayBDbGFzc30KLSAgICAgKiBhbmQgbm8gZGVmaW5pdGlvbiBjYW4gYmUgZm91bmQuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhbm5vdGF0aW9uIG1lbWJlciByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICogbWV0aG9kLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUsIG9yIHtAY29kZSBudWxsfSBpZiBub25lCisgICAgICogCisgICAgICogQHRocm93cyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgYW5ub3RhdGlvbiBtZW1iZXIgaXMgb2YgdHlwZSB7QGNvZGUgQ2xhc3N9IGFuZCBubworICAgICAqICAgICAgICAgICAgIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiBnZXREZWZhdWx0VmFsdWUoZGVjbGFyaW5nQ2xhc3MsIHNsb3QpOwpAQCAtMzU0LDE1ICszMzYsMjAgQEAKICAgICBuYXRpdmUgcHJpdmF0ZSBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKENsYXNzIGRlY2xhcmluZ0NsYXNzLCBpbnQgc2xvdCk7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIE1ldGhvZCBhbmQgZGV0ZXJtaW5lcyBpZiB0aGV5IGFyZQotICAgICAqIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTWV0aG9kIHdpdGggdGhlIHNhbWUgZGVmaW5pbmcKLSAgICAgKiBjbGFzcyBhbmQgcGFyYW1ldGVyIHR5cGVzLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHtAY29kZSBvYmplY3R9IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiBtZXRob2QuIFRvIGJlIGVxdWFsLCB0aGUgc3BlY2lmaWVkIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlCisgICAgICogb2Yge0Bjb2RlIE1ldGhvZH0gd2l0aCB0aGUgc2FtZSBkZWNsYXJpbmcgY2xhc3MgYW5kIHBhcmFtZXRlciB0eXBlcworICAgICAqIGFzIHRoaXMgbWV0aG9kLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIE1ldGhvZCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAgbWV0aG9kLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqICAgICAgICAgCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtMzcwLDIxICszNTcsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBDbGFzc30gYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzcyB0aGF0IGRlZmluZWQgdGhpcwotICAgICAqIG1ldGhvZC4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoaXMgbWV0aG9kLgorICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGVjbGFyaW5nIGNsYXNzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzPD8+IGdldERlY2xhcmluZ0NsYXNzKCkgewogICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ2xhc3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSB7QGxpbmsgQ2xhc3N9IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIGV4Y2VwdGlvbnMgZGVjbGFyZWQgdG8gYmUgdGhyb3duIGJ5IHRoaXMgbWV0aG9kLiBJZiB0aGUgbWV0aG9kIHdhcyBub3QKLSAgICAgKiBkZWNsYXJlZCB0byB0aHJvdyBhbnkgZXhjZXB0aW9ucywgdGhlIGFycmF5IHJldHVybmVkIHdpbGwgYmUgZW1wdHkuCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHR5cGVzIGFzIGFuIGFycmF5IG9mIHtAY29kZSBDbGFzc30gaW5zdGFuY2VzLiBJZgorICAgICAqIHRoaXMgbWV0aG9kIGhhcyBubyBkZWNsYXJlZCBleGNlcHRpb25zLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNsYXJlZCBleGNlcHRpb24gY2xhc3NlcworICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzczw/PltdIGdldEV4Y2VwdGlvblR5cGVzKCkgewogICAgICAgICBpZiAoZXhjZXB0aW9uVHlwZXMgPT0gbnVsbCkgewpAQCAtMzk1LDU1ICszODQsNjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBmb3IgdGhlIG1vZGVsZWQgbWV0aG9kLiBUaGUgTW9kaWZpZXIgY2xhc3MKLSAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBkZWNvZGUgdGhlIHJlc3VsdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBtb2RpZmllcnMgZm9yIHRoaXMgbWV0aG9kLiBUaGUge0BsaW5rIE1vZGlmaWVyfSBjbGFzcyBzaG91bGQKKyAgICAgKiBiZSB1c2VkIHRvIGRlY29kZSB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIG1ldGhvZAogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVycwotICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIKKyAgICAgKiBAc2VlIE1vZGlmaWVyCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CiAgICAgICAgIHJldHVybiBnZXRNZXRob2RNb2RpZmllcnMoZGVjbGFyaW5nQ2xhc3MsIHNsb3QpOwogICAgIH0KIAogICAgIHByaXZhdGUgbmF0aXZlIGludCBnZXRNZXRob2RNb2RpZmllcnMoQ2xhc3M8Pz4gZGVjbF9jbGFzcywgaW50IHNsb3QpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtb2RlbGVkIG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgTWV0aG9kfQorICAgICAqIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHtAbGluayBDbGFzc30gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICogcGFyYW1ldGVyIHR5cGVzIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGUgbWV0aG9kIHdhcyBkZWNsYXJlZCB3aXRoIG5vCi0gICAgICogcGFyYW1ldGVycywgdGhlIGFycmF5IHJldHVybmVkIHdpbGwgYmUgZW1wdHkuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB7QGNvZGUgQ2xhc3N9IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiB0eXBlcyBvZiB0aGlzIG1ldGhvZC4gSWYgdGhlIG1ldGhvZCB3YXMgZGVjbGFyZWQgd2l0aCBubyBwYXJhbWV0ZXJzLCBhbgorICAgICAqIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIHR5cGVzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzPD8+W10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBDbGFzc30gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIENsYXNzfSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybiB0eXBlIG9mIHRoaXMKICAgICAgKiBtZXRob2QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcmV0dXJuIHR5cGUKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0UmV0dXJuVHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuIFRoZSBoYXNoIGNvZGUgZm9yIGEgTWV0aG9kIGlzIHRoZQotICAgICAqIGhhc2ggY29kZSBvZiB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGlzIG1ldGhvZC4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIE1ldGhvZCBpcworICAgICAqIHRoZSBoYXNoIGNvZGUgb2YgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCisgICAgICogQHJldHVybiBoYXNoIGNvZGUgZm9yIHRoaXMgbWV0aG9kCisgICAgICogCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTQ1MSw1OSArNDUzLDYwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByZXN1bHQgb2YgZHluYW1pY2FsbHkgaW52b2tpbmcgdGhlIG1vZGVsZWQgbWV0aG9kLiBUaGlzCi0gICAgICogcmVwcm9kdWNlcyB0aGUgZWZmZWN0IG9mCi0gICAgICogPGNvZGU+cmVjZWl2ZXIubWV0aG9kTmFtZShhcmcxLCBhcmcyLCAuLi4gLCBhcmdOKTwvY29kZT4gVGhpcyBtZXRob2QKLSAgICAgKiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nOgorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkeW5hbWljYWxseSBpbnZva2luZyB0aGlzIG1ldGhvZC4gVGhpcyByZXByb2R1Y2VzCisgICAgICogdGhlIGVmZmVjdCBvZiB7QGNvZGUgcmVjZWl2ZXIubWV0aG9kTmFtZShhcmcxLCBhcmcyLCAuLi4gLCBhcmdOKX0gVGhpcworICAgICAqIG1ldGhvZCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nOgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+SWYgdGhlIG1vZGVsZWQgbWV0aG9kIGlzIHN0YXRpYywgdGhlIHJlY2VpdmVyIGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgICAgICogPGxpPklmIHRoaXMgbWV0aG9kIGlzIHN0YXRpYywgdGhlIHJlY2VpdmVyIGFyZ3VtZW50IGlzIGlnbm9yZWQuPC9saT4KKyAgICAgKiA8bGk+T3RoZXJ3aXNlLCBpZiB0aGUgcmVjZWl2ZXIgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogPC9saT4KLSAgICAgKiA8bGk+T3RoZXJ3aXNlLCBpZiB0aGUgcmVjZWl2ZXIgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcwotICAgICAqIHRocm93bi48L2xpPgotICAgICAqIElmIHRoZSByZWNlaXZlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgbWV0aG9kLAotICAgICAqIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogPGxpPklmIHRoZSByZWNlaXZlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUKKyAgICAgKiBtZXRob2QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uPC9saT4KICAgICAgKiA8bGk+SWYgdGhpcyBNZXRob2Qgb2JqZWN0IGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbCAoc2VlCi0gICAgICogQWNjZXNzaWJsZU9iamVjdCkgYW5kIHRoZSBtb2RlbGVkIG1ldGhvZCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZQotICAgICAqIGN1cnJlbnQgY29udGV4dCwgYW4gSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uPC9saT4KLSAgICAgKiA8bGk+SWYgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkIGFuZCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZG8KLSAgICAgKiBub3QgbWF0Y2gsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uPC9saT4KKyAgICAgKiBBY2Nlc3NpYmxlT2JqZWN0KSBhbmQgdGhpcyBtZXRob2QgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudAorICAgICAqIGNvbnRleHQsIGFuIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaXMgdGhyb3duLjwvbGk+CisgICAgICogPGxpPklmIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCBhbmQgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGRvIG5vdAorICAgICAqIG1hdGNoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLjwvbGk+CiAgICAgICogPGxpPkZvciBlYWNoIGFyZ3VtZW50IHBhc3NlZDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPklmIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0eXBlIGlzIGEgYmFzZSB0eXBlLCB0aGUgYXJndW1lbnQgaXMKLSAgICAgKiB1bndyYXBwZWQuIElmIHRoZSB1bndyYXBwaW5nIGZhaWxzLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMKKyAgICAgKiA8bGk+SWYgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHR5cGUgaXMgYSBwcmltaXRpdmUgdHlwZSwgdGhlIGFyZ3VtZW50CisgICAgICogaXMgdW53cmFwcGVkLiBJZiB0aGUgdW53cmFwcGluZyBmYWlscywgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzCiAgICAgICogdGhyb3duLjwvbGk+CiAgICAgICogPGxpPklmIHRoZSByZXN1bHRpbmcgYXJndW1lbnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUKICAgICAgKiB2aWEgYSB3aWRlbmluZyBjb252ZXJzaW9uLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiA8bGk+SWYgdGhlIG1vZGVsZWQgbWV0aG9kIGlzIHN0YXRpYywgaXQgaXMgaW52b2tlZCBkaXJlY3RseS4gSWYgaXQgaXMKLSAgICAgKiBub24tc3RhdGljLCB0aGUgbW9kZWxlZCBtZXRob2QgYW5kIHRoZSByZWNlaXZlciBhcmUgdGhlbiB1c2VkIHRvIHBlcmZvcm0KLSAgICAgKiBhIHN0YW5kYXJkIGR5bmFtaWMgbWV0aG9kIGxvb2t1cC4gVGhlIHJlc3VsdGluZyBtZXRob2QgaXMgdGhlbiBpbnZva2VkLgotICAgICAqIDwvbGk+CisgICAgICogPGxpPklmIHRoaXMgbWV0aG9kIGlzIHN0YXRpYywgaXQgaXMgaW52b2tlZCBkaXJlY3RseS4gSWYgaXQgaXMKKyAgICAgKiBub24tc3RhdGljLCB0aGlzIG1ldGhvZCBhbmQgdGhlIHJlY2VpdmVyIGFyZSB0aGVuIHVzZWQgdG8gcGVyZm9ybSBhCisgICAgICogc3RhbmRhcmQgZHluYW1pYyBtZXRob2QgbG9va3VwLiBUaGUgcmVzdWx0aW5nIG1ldGhvZCBpcyB0aGVuIGludm9rZWQuPC9saT4KICAgICAgKiA8bGk+SWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgdGhlIGludm9jYXRpb24gaXQgaXMgY2F1Z2h0IGFuZAotICAgICAqIHdyYXBwZWQgaW4gYW4gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbi4gVGhpcyBleGNlcHRpb24gaXMgdGhlbiB0aHJvd24uCi0gICAgICogPC9saT4KLSAgICAgKiA8bGk+SWYgdGhlIGludm9jYXRpb24gY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIGl0c2VsZgotICAgICAqIHJldHVybmVkLiBJZiB0aGUgbWV0aG9kIGlzIGRlY2xhcmVkIHRvIHJldHVybiBhIGJhc2UgdHlwZSwgdGhlIHJldHVybgotICAgICAqIHZhbHVlIGlzIGZpcnN0IHdyYXBwZWQuIElmIHRoZSByZXR1cm4gdHlwZSBpcyB2b2lkLCBudWxsIGlzIHJldHVybmVkLgotICAgICAqIDwvbGk+CisgICAgICogd3JhcHBlZCBpbiBhbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLiBUaGlzIGV4Y2VwdGlvbiBpcyB0aGVuIHRocm93bi48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgaW52b2NhdGlvbiBjb21wbGV0ZXMgbm9ybWFsbHksIHRoZSByZXR1cm4gdmFsdWUgaXRzZWxmIGlzCisgICAgICogcmV0dXJuZWQuIElmIHRoZSBtZXRob2QgaXMgZGVjbGFyZWQgdG8gcmV0dXJuIGEgcHJpbWl0aXZlIHR5cGUsIHRoZQorICAgICAqIHJldHVybiB2YWx1ZSBpcyBmaXJzdCB3cmFwcGVkLiBJZiB0aGUgcmV0dXJuIHR5cGUgaXMgdm9pZCwgbnVsbCBpcworICAgICAqIHJldHVybmVkLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVjZWl2ZXIKLSAgICAgKiAgICAgICAgICAgIFRoZSBvYmplY3Qgb24gd2hpY2ggdG8gY2FsbCB0aGUgbW9kZWxlZCBtZXRob2QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgb24gd2hpY2ggdG8gY2FsbCB0aGlzIG1ldGhvZAogICAgICAqIEBwYXJhbSBhcmdzCiAgICAgICogICAgICAgICAgICB0aGUgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcsIGluaXRpYWxpemVkLCBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSByZWNlaXZlciBpcyBudWxsIGZvciBhIG5vbi1zdGF0aWMgbWV0aG9kCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBtb2RlbGVkIG1ldGhvZCBpcyBub3QgYWNjZXNzaWJsZQotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBwYXNzZWQsIHRoZQotICAgICAqICAgICAgICAgICAgICAgIHJlY2VpdmVyIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJpbmcgY2xhc3MsIG9yIGFuCi0gICAgICogICAgICAgICAgICAgICAgYXJndW1lbnQgY291bGQgbm90IGJlIGNvbnZlcnRlZCBieSBhIHdpZGVuaW5nIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93biBieSB0aGUgaW52b2tlZCBtZXRob2QKLSAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlY2VpdmVyIGlzIG51bGwgZm9yIGEgbm9uLXN0YXRpYyBtZXRob2QKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgYWNjZXNzaWJsZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZCwgdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGRlY2xhcmluZyBjbGFzcywgb3IgYW4gYXJndW1lbnQKKyAgICAgKiAgICAgICAgICAgICBjb3VsZCBub3QgYmUgY29udmVydGVkIGJ5IGEgd2lkZW5pbmcgY29udmVyc2lvbgorICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IHRoZSBpbnZva2VkIG1ldGhvZAorICAgICAqIAorICAgICAqIEBzZWUgQWNjZXNzaWJsZU9iamVjdAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCByZWNlaXZlciwgT2JqZWN0Li4uIGFyZ3MpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLApAQCAtNTE5LDIyICs1MjIsMzUgQEAKICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCiAgICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgbW9kaWZpZXJzIChpZiBhbnkpIHJldHVybiB0eXBlCi0gICAgICogZGVjbGFyaW5nIGNsYXNzIG5hbWUgJy4nIG1ldGhvZCBuYW1lICcoJyBwYXJhbWV0ZXIgdHlwZXMsIHNlcGFyYXRlZCBieQotICAgICAqICcsJyAnKScgSWYgdGhlIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9ucywgJyB0aHJvd3MgJyBleGNlcHRpb24gdHlwZXMsCi0gICAgICogc2VwYXJhdGVkIGJ5ICcsJyBGb3IgZXhhbXBsZToKLSAgICAgKiA8Y29kZT5wdWJsaWMgbmF0aXZlIE9iamVjdCBqYXZhLmxhbmcuTWV0aG9kLmludm9rZShPYmplY3QsT2JqZWN0KSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbixJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICogbWV0aG9kLiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXM6CiAgICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyCisgICAgICogPG9sPgorICAgICAqICAgPGxpPm1vZGlmaWVycyAoaWYgYW55KQorICAgICAqICAgPGxpPnJldHVybiB0eXBlIG9yICd2b2lkJworICAgICAqICAgPGxpPmRlY2xhcmluZyBjbGFzcyBuYW1lCisgICAgICogICA8bGk+JygnCisgICAgICogICA8bGk+cGFyYW1ldGVyIHR5cGVzLCBzZXBhcmF0ZWQgYnkgJywnIChpZiBhbnkpCisgICAgICogICA8bGk+JyknCisgICAgICogICA8bGk+J3Rocm93cycgcGx1cyBleGNlcHRpb24gdHlwZXMsIHNlcGFyYXRlZCBieSAnLCcgKGlmIGFueSkKKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGU6IHtAY29kZSBwdWJsaWMgbmF0aXZlIE9iamVjdAorICAgICAqIGphdmEubGFuZy5NZXRob2QuaW52b2tlKE9iamVjdCxPYmplY3QpIHRocm93cworICAgICAqIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogLEludm9jYXRpb25UYXJnZXRFeGNlcHRpb259CisgICAgICogCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBtZXRob2QKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKE1vZGlmaWVyLnRvU3RyaW5nKGdldE1vZGlmaWVycygpKSk7CiAKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSAhPSAwKSAgICAgICAvLyBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSAhPSAwKQogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHJldHVyblR5cGUuZ2V0TmFtZSgpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpOwpAQCAtNTU2LDcgKzU3Miw3IEBACiAgICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0b3IncyBzaWduYXR1cmUgaW4gbm9uLXByaW50YWJsZSBmb3JtLiBUaGlzIGlzIGNhbGxlZAogICAgICAqIChvbmx5KSBmcm9tIElPIG5hdGl2ZSBjb2RlIGFuZCBuZWVkZWQgZm9yIGRlcml2aW5nIHRoZSBzZXJpYWxWZXJzaW9uVUlECiAgICAgICogb2YgdGhlIGNsYXNzCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBjb25zdHJ1Y3RvcidzIHNpZ25hdHVyZS4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvUmVmbGVjdGlvbkFjY2Vzc0ltcGwuamF2YSBiL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvUmVmbGVjdGlvbkFjY2Vzc0ltcGwuamF2YQppbmRleCA2ZTViYzA1Li4xNWNkNzk4IDEwMDY0NAotLS0gYS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1JlZmxlY3Rpb25BY2Nlc3NJbXBsLmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9SZWZsZWN0aW9uQWNjZXNzSW1wbC5qYXZhCkBAIC0xOSwzNCArMTksMzUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlJlZmxlY3Rpb25BY2Nlc3M7CiAKIC8qKgotICogSW1wbGVtZW50YXRpb24gb2YgYnJpZGdlIGZyb20gPGNvZGU+amF2YS5sYW5nPC9jb2RlPiB0bwotICogPGNvZGU+amF2YS5sYW5nLnJlZmxlY3Q8L2NvZGU+LgorICogSW1wbGVtZW50YXRpb24gb2YgYnJpZGdlIGZyb20ge0Bjb2RlIGphdmEubGFuZ30gdG8KKyAqIHtAY29kZSBqYXZhLmxhbmcucmVmbGVjdH0uCiAgKi8KIC8qcGFja2FnZSovIGZpbmFsIGNsYXNzIFJlZmxlY3Rpb25BY2Nlc3NJbXBsIGltcGxlbWVudHMgUmVmbGVjdGlvbkFjY2VzcyB7CiAgICAgLyoqIG5vbi1udWxsOyB1bmlxdWUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyAqLwogICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBSZWZsZWN0aW9uQWNjZXNzSW1wbCBUSEVfT05FID0KICAgICAgICAgbmV3IFJlZmxlY3Rpb25BY2Nlc3NJbXBsKCk7CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyBub3QgcHVibGljbHkgaW5zdGFudGlhYmxlLiBVc2Uge0BsaW5rICNUSEVfT05FfS4KICAgICAgKi8KICAgICBwcml2YXRlIFJlZmxlY3Rpb25BY2Nlc3NJbXBsKCkgewogICAgICAgICAvLyBUaGlzIHNwYWNlIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KICAgICB9CiAKLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyBNZXRob2QgY2xvbmUoTWV0aG9kIG1ldGhvZCkgewogICAgICAgICByZXR1cm4gbmV3IE1ldGhvZChtZXRob2QpOwogICAgIH0KIAotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIEZpZWxkIGNsb25lKEZpZWxkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGQpOworICAgIH0KKwogICAgIHB1YmxpYyBNZXRob2QgYWNjZXNzaWJsZUNsb25lKE1ldGhvZCBtZXRob2QpIHsKICAgICAgICAgTWV0aG9kIHJlc3VsdCA9IG5ldyBNZXRob2QobWV0aG9kKTsKICAgICAgICAgcmVzdWx0LnNldEFjY2Vzc2libGVOb0NoZWNrKHRydWUpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzaWJsZU5vQ2hlY2soQWNjZXNzaWJsZU9iamVjdCBhbywgYm9vbGVhbiBhY2Nlc3NpYmxlKSB7CiAgICAgICAgIGFvLnNldEFjY2Vzc2libGVOb0NoZWNrKGFjY2Vzc2libGUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2tlcm5lbC92bS9SZWZsZWN0aW9uQWNjZXNzLmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9rZXJuZWwvdm0vUmVmbGVjdGlvbkFjY2Vzcy5qYXZhCmluZGV4IGIxNmRmM2UuLjE0ODdiYTEgMTAwNjQ0Ci0tLSBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2tlcm5lbC92bS9SZWZsZWN0aW9uQWNjZXNzLmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkva2VybmVsL3ZtL1JlZmxlY3Rpb25BY2Nlc3MuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiAKIC8qKgpAQCAtMzUsNiArMzYsMTQgQEAKICAgICBwdWJsaWMgTWV0aG9kIGNsb25lKE1ldGhvZCBtZXRob2QpOwogCiAgICAgLyoqCisgICAgICogR2V0cyBhIGNsb25lIG9mIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmllbGQgbm9uLW51bGw7IHRoZSBmaWVsZCB0byBjbG9uZQorICAgICAqIEByZXR1cm4gbm9uLW51bGw7IHRoZSBjbG9uZQorICAgICAqLworICAgIHB1YmxpYyBGaWVsZCBjbG9uZShGaWVsZCBmaWVsZCk7CisKKyAgICAvKioKICAgICAgKiBHZXRzIGEgY2xvbmUgb2YgdGhlIGdpdmVuIG1ldGhvZCwgd2hlcmUgdGhlIGNsb25lIGhhcwogICAgICAqIGl0cyAiYWNjZXNzaWJsZSIgZmxhZyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4KICAgICAgKiAKZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmFjdG9yeS5qYXZhIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25GYWN0b3J5LmphdmEKaW5kZXggMDZiMTcyNy4uYTg5OGY1NCAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25GYWN0b3J5LmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25GYWN0b3J5LmphdmEKQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde2Fubm90YXRpb25UeXBlfSwgYW50bik7CiAgICAgfQogCi0JcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4ga2xheno7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4ga2xheno7CiAgICAgcHJpdmF0ZSBBbm5vdGF0aW9uTWVtYmVyW10gZWxlbWVudHM7CiAKICAgICAvKioKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgICAqIEBwYXJhbSB2YWx1ZXMgYWN0dWFsIGVsZW1lbnQgdmFsdWVzIAogICAgICAqLwogICAgIHByaXZhdGUgQW5ub3RhdGlvbkZhY3RvcnkoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGtsenosIEFubm90YXRpb25NZW1iZXJbXSB2YWx1ZXMpIHsKLQkJa2xhenogPSBrbHp6OworICAgICAgICBrbGF6eiA9IGtseno7CiAgICAgICAgIEFubm90YXRpb25NZW1iZXJbXSBkZWZzID0gZ2V0RWxlbWVudHNEZXNjcmlwdGlvbihrbGF6eik7CiAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgZWxlbWVudHMgPSBkZWZzOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgICAgICAgICAgZWxlbWVudHNbaV0gPSBkZWZzW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0JfQorICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgb2JqZWN0LCBvYnRhaW5zIGFjdHVhbCBtZW1iZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBhbm5vdGF0aW9uIHR5cGUsIApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgICAgIH0gIAogICAgICAgICBlbGVtZW50cyA9IG1lcmdlZC50b0FycmF5KG5ldyBBbm5vdGF0aW9uTWVtYmVyW21lcmdlZC5zaXplKCldKTsKICAgICB9Ci0JCisgICAgCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHJlcHJlc2VudHMgdGhlIHNhbWUgYW5ub3RhdGlvbiBpbnN0YW5jZS4KICAgICAgKiBUaGF0IGlzLCBpZiBpdCBpbXBsZW1lbnRzIHRoZSBzYW1lIGFubm90YXRpb24gdHlwZSBhbmQgCkBAIC0xODIsMTkgKzE4MiwxOSBAQAogICAgICAqIGZhbHNlIG90aGVyd2lzZS4gCiAgICAgICogQHNlZSBhbmRyb2lkLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyI2VxdWFscyhPYmplY3QpCiAgICAgICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSB0aGlzKSB7Ci0JCSAgICByZXR1cm4gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmICgha2xhenouaXNJbnN0YW5jZShvYmopKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgT2JqZWN0IGhhbmRsZXIgPSBudWxsOwotCQlpZiAoUHJveHkuaXNQcm94eUNsYXNzKG9iai5nZXRDbGFzcygpKSAKKyAgICAgICAgaWYgKFByb3h5LmlzUHJveHlDbGFzcyhvYmouZ2V0Q2xhc3MoKSkgCiAgICAgICAgICAgICAgICAgJiYgKGhhbmRsZXIgPSBQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihvYmopKSBpbnN0YW5jZW9mIEFubm90YXRpb25GYWN0b3J5ICkgewogICAgICAgICAgICAgQW5ub3RhdGlvbkZhY3Rvcnkgb3RoZXIgPSAoQW5ub3RhdGlvbkZhY3RvcnkpIGhhbmRsZXI7Ci0gICAgICAgIAlpZiAoZWxlbWVudHMubGVuZ3RoICE9IG90aGVyLmVsZW1lbnRzLmxlbmd0aCkgewotICAgICAgICAJICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggIT0gb3RoZXIuZWxlbWVudHMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV4dDogZm9yIChBbm5vdGF0aW9uTWVtYmVyIGVsMSA6IGVsZW1lbnRzKXsKICAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25NZW1iZXIgZWwyIDogb3RoZXIuZWxlbWVudHMpIHsKQEAgLTI0NSwzNiArMjQ1LDM2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotCX0KKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGNvbXBvc2VkIGFzIGEgc3VtIG9mIGhhc2ggY29kZXMgb2YgbWVtYmVyIGVsZW1lbnRzLCAKICAgICAgKiBpbmNsdWRpbmcgZWxlbWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4gCiAgICAgICogQHNlZSBhbmRyb2lkLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyI2hhc2hDb2RlKCkKICAgICAgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaCA9IDA7CisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAwOwogICAgICAgICBmb3IgKEFubm90YXRpb25NZW1iZXIgZWxlbWVudCA6IGVsZW1lbnRzKSB7CiAgICAgICAgICAgICBoYXNoICs9IGVsZW1lbnQuaGFzaENvZGUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gaGFzaDsKLQl9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUHJvdmlkZXMgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyBhbm5vdGF0aW9uIGluc3RhbmNlLAogICAgICAqIGluY2x1ZGluZyBhbGwgbWVtYmVyIG5hbWUtdmFsdWVzIHBhaXJzLgogICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYW5ub3RhdGlvbgogICAgICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXMgPSAiQCIgKyBrbGF6ei5nZXROYW1lKCkgKyAiKCI7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyByZXMgPSAiQCIgKyBrbGF6ei5nZXROYW1lKCkgKyAiKCI7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgaWYgKCBpICE9IDAgKSB7CiAgICAgICAgICAgICAgICAgcmVzICs9ICIsICI7ICAgIAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzICs9IGVsZW1lbnRzW2ldLnRvU3RyaW5nKCk7OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXMgKyAiKSI7Ci0JfQorICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBQcm9jZXNzZXMgYSBtZXRob2QgaW52b2NhdGlvbiByZXF1ZXN0IHRvIHRoaXMgYW5ub3RhdGlvbiBpbnN0YW5jZS4KQEAgLTMxNCw4ICszMTQsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgICB9Ci0JCX0gZWxzZSBpZiAocGFyYW1zLmxlbmd0aCA9PSAxICYmIHBhcmFtc1swXSA9PSBPYmplY3QuY2xhc3MgJiYgImVxdWFscyIuZXF1YWxzKG5hbWUpKXsKLQkJICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZXF1YWxzKGFyZ3NbMF0pKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMubGVuZ3RoID09IDEgJiYgcGFyYW1zWzBdID09IE9iamVjdC5jbGFzcyAmJiAiZXF1YWxzIi5lcXVhbHMobmFtZSkpeworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihlcXVhbHMoYXJnc1swXSkpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIkludmFsaWQgbWV0aG9kIGZvciBhbm5vdGF0aW9uIHR5cGU6ICIgKyBtZXRob2QpOwpkaWZmIC0tZ2l0IGEvbHVuaS1rZXJuZWwvc3JjL21haW4vbmF0aXZlL2phdmFfbGFuZ19TeXN0ZW0uYyBiL2x1bmkta2VybmVsL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfU3lzdGVtLmMKaW5kZXggNTNkMTg5OC4uMWMwNmE0MCAxMDA2NDQKLS0tIGEvbHVuaS1rZXJuZWwvc3JjL21haW4vbmF0aXZlL2phdmFfbGFuZ19TeXN0ZW0uYworKysgYi9sdW5pLWtlcm5lbC9zcmMvbWFpbi9uYXRpdmUvamF2YV9sYW5nX1N5c3RlbS5jCkBAIC0xLDExICsxLDIwIEBACi0vLwotLy8gIGphdmFfbGFuZ19TeXN0ZW0uYwotLy8gIEFuZHJvaWQKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiAjaW5jbHVkZSAiSk5JSGVscC5oIgotLy8jaW5jbHVkZSAidXRpbHMvTG9nLmgiCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTUzLDEwICs2Miw3IEBACiB7CiAgICAganN0cmluZyB2YWx1ZVN0ciA9IE5VTEw7CiAKLSAgICAvKiBUT0RPOiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgaXQgbWFrZXMgdGhlIE1hYyBzaW11bGF0b3IgdW5oYXBweS4KLSAgICAgKiAgICAgY2hhciogZW50cnkgPSBlbnZpcm9uW2luZGV4XTsKLSAgICAgKi8KLSAgICBjaGFyKiBlbnRyeSA9IE5VTEw7CisgICAgY2hhciogZW50cnkgPSBlbnZpcm9uW2luZGV4XTsKICAgICBpZiAoZW50cnkgIT0gTlVMTCkgewogICAgICAgICB2YWx1ZVN0ciA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgZW50cnkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkta2VybmVsL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL29yZy9hcGFjaGUvaGFybW9ueS9rZXJuZWwvZGFsdmlrL1RocmVhZHNUZXN0LmphdmEgYi9sdW5pLWtlcm5lbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9vcmcvYXBhY2hlL2hhcm1vbnkva2VybmVsL2RhbHZpay9UaHJlYWRzVGVzdC5qYXZhCmluZGV4IDQ2NzgyZTAuLmEzZTJiZDMgMTAwNjQ0Ci0tLSBhL2x1bmkta2VybmVsL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL29yZy9hcGFjaGUvaGFybW9ueS9rZXJuZWwvZGFsdmlrL1RocmVhZHNUZXN0LmphdmEKKysrIGIvbHVuaS1rZXJuZWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvb3JnL2FwYWNoZS9oYXJtb255L2tlcm5lbC9kYWx2aWsvVGhyZWFkc1Rlc3QuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5vcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLmRhbHZpazsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCkBAIC0yNiw2ICsyOCw3IEBACiAvKioKICAqIFRlc3RzIGZvciB0aGUgPGNvZGU+cGFyaygpPC9jb2RlPiBmdW5jdGlvbmFsaXR5IG9mIHtAbGluayBVbnNhZmV9LgogICovCitAVGVzdFRhcmdldENsYXNzKFVuc2FmZS5jbGFzcykKIHB1YmxpYyBjbGFzcyBUaHJlYWRzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBVbnNhZmUgVU5TQUZFID0gbnVsbDsKICAgICAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW0uamF2YQppbmRleCAwMmMzMjlkLi4xNzIwMzY2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZElucHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnVmZmVyZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0yNCwxMyArMjQsMjIgQEAKIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKIC8qKgotICogPGNvZGU+QnVmZmVyZWRJbnB1dFN0cmVhbTwvY29kZT4gaXMgYSBjbGFzcyB3aGljaCB0YWtlcyBhbiBpbnB1dCBzdHJlYW0gYW5kCi0gKiA8ZW0+YnVmZmVyczwvZW0+IHRoZSBpbnB1dC4gSW4gdGhpcyB3YXksIGNvc3RseSBpbnRlcmFjdGlvbiB3aXRoIHRoZQotICogb3JpZ2luYWwgaW5wdXQgc3RyZWFtIGNhbiBiZSBtaW5pbWl6ZWQgYnkgcmVhZGluZyBidWZmZXJlZCBhbW91bnRzIG9mIGRhdGEKLSAqIGluZnJlcXVlbnRseS4gVGhlIGRyYXdiYWNrIGlzIHRoYXQgZXh0cmEgc3BhY2UgaXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgYnVmZmVyCi0gKiBhbmQgdGhhdCBjb3B5aW5nIHRha2VzIHBsYWNlIHdoZW4gcmVhZGluZyB0aGF0IGJ1ZmZlci4KKyAqIFdyYXBzIGFuIGV4aXN0aW5nIHtAbGluayBJbnB1dFN0cmVhbX0gYW5kIDxlbT5idWZmZXJzPC9lbT4gdGhlIGlucHV0LgorICogRXhwZW5zaXZlIGludGVyYWN0aW9uIHdpdGggdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIGlzIG1pbmltaXplZCwgc2luY2UKKyAqIG1vc3QgKHNtYWxsZXIpIHJlcXVlc3RzIGNhbiBiZSBzYXRpc2ZpZWQgYnkgYWNjZXNzaW5nIHRoZSBidWZmZXIgYWxvbmUuIFRoZQorICogZHJhd2JhY2sgaXMgdGhhdCBzb21lIGV4dHJhIHNwYWNlIGlzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGJ1ZmZlciBhbmQgdGhhdAorICogY29weWluZyB0YWtlcyBwbGFjZSB3aGVuIGZpbGxpbmcgdGhhdCBidWZmZXIsIGJ1dCB0aGlzIGlzIHVzdWFsbHkgb3V0d2VpZ2hlZAorICogYnkgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXRzLgorICogCisgKiA8cC8+QSB0eXBpY2FsIGFwcGxpY2F0aW9uIHBhdHRlcm4gZm9yIHRoZSBjbGFzcyBsb29rcyBsaWtlIHRoaXM6PHAvPgorICogCisgKiA8cHJlPgorICogQnVmZmVyZWRJbnB1dFN0cmVhbSBidWYgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKCZxdW90O2ZpbGUuamF2YSZxdW90OykpOworICogPC9wcmU+CiAgKiAKICAqIEBzZWUgQnVmZmVyZWRPdXRwdXRTdHJlYW0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewogICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMzgsNDAgKzQ3LDUxIEBACiAgICAgLy8gVGhpcyB3YXMgY2hhbmdlZCB0byBiZSBtb3JlIGNsb3NlIHRvIHRoZSBSSS4KICAgICAvKioKICAgICAgKiBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgYnl0ZXMgcmVhZCBmcm9tIHRoZSB0YXJnZXQgSW5wdXRTdHJlYW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvbGF0aWxlIGJ5dGVbXSBidWY7CiAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCi0gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBpbnNpZGUgdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmPC9jb2RlPi4KKyAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluc2lkZSB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYnVmfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGNvdW50OwogCiAgICAgLyoqCiAgICAgICogVGhlIGN1cnJlbnQgbGltaXQsIHdoaWNoIHdoZW4gcGFzc2VkLCBpbnZhbGlkYXRlcyB0aGUgY3VycmVudCBtYXJrLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbWFya2xpbWl0OwogCiAgICAgLyoqCiAgICAgICogVGhlIGN1cnJlbnRseSBtYXJrZWQgcG9zaXRpb24uIC0xIGluZGljYXRlcyBubyBtYXJrIGhhcyBiZWVuIHNldCBvciB0aGUKICAgICAgKiBtYXJrIGhhcyBiZWVuIGludmFsaWRhdGVkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbWFya3BvcyA9IC0xOwogCiAgICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBieXRlIGFycmF5IDxjb2RlPmJ1ZjwvY29kZT4uCisgICAgICogVGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgcG9zOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5CdWZmZXJlZElucHV0U3RyZWFtPC9jb2RlPiBvbiB0aGUgSW5wdXRTdHJlYW0KLSAgICAgKiA8Y29kZT5pbjwvY29kZT4uIFRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplICg4S2IpIGlzIGFsbG9jYXRlZCBhbmQgYWxsCi0gICAgICogcmVhZHMgY2FuIG5vdyBiZSBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ1ZmZlcmVkSW5wdXRTdHJlYW19IG9uIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19CisgICAgICoge0Bjb2RlIGlufS4gVGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgKDggS0IpIGlzIGFsbG9jYXRlZCBhbmQgYWxsIHJlYWRzCisgICAgICogY2FuIG5vdyBiZSBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIHRvIGJ1ZmZlciByZWFkcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB0aGUgYnVmZmVyIHJlYWRzIGZyb20uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKICAgICAgICAgc3VwZXIoaW4pOwpAQCAtNzksMTIgKzk5LDExIEBACiAKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICAvKgotICAgICAgICAgKiBGb3IgQW5kcm9pZCwgd2Ugd2FudCB0byBkaXNjb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcwotICAgICAgICAgKiBjb25zdHJ1Y3RvciAod2l0aCBpdHMgYXJndWFibHkgdG9vLWxhcmdlIGRlZmF1bHQpLCBzbyB3ZQotICAgICAgICAgKiBub3RlIGl0cyB1c2UgaW4gdGhlIGxvZy4gV2UgZG9uJ3QgZGlzYWJsZSBpdCwgbm9yIGRvIHdlCi0gICAgICAgICAqIGFsdGVyIHRoZSBkZWZhdWx0LCBob3dldmVyLCBiZWNhdXNlIHdlIHN0aWxsIGFpbSB0byBiZWhhdmUKLSAgICAgICAgICogY29tcGF0aWJseSwgYW5kIHRoZSBkZWZhdWx0IHZhbHVlLCB0aG91Z2ggbm90IGRvY3VtZW50ZWQsCi0gICAgICAgICAqIGlzIGVzdGFibGlzaGVkIGJ5IGNvbnZlbnRpb24uCisgICAgICAgICAqIEZvciBBbmRyb2lkLCB3ZSB3YW50IHRvIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIGNvbnN0cnVjdG9yICh3aXRoCisgICAgICAgICAqIGl0cyBhcmd1YWJseSB0b28tbGFyZ2UgZGVmYXVsdCksIHNvIHdlIG5vdGUgaXRzIHVzZSBpbiB0aGUgbG9nLiBXZQorICAgICAgICAgKiBkb24ndCBkaXNhYmxlIGl0LCBub3IgZG8gd2UgYWx0ZXIgdGhlIGRlZmF1bHQsIGhvd2V2ZXIsIGJlY2F1c2Ugd2UKKyAgICAgICAgICogc3RpbGwgYWltIHRvIGJlaGF2ZSBjb21wYXRpYmx5LCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUsIHRob3VnaCBub3QKKyAgICAgICAgICogZG9jdW1lbnRlZCwgaXMgZXN0YWJsaXNoZWQgYnkgY29udmVudGlvbi4KICAgICAgICAgICovCiAgICAgICAgIExvZ2dlci5nbG9iYWwuaW5mbygKICAgICAgICAgICAgICAgICAiRGVmYXVsdCBidWZmZXIgc2l6ZSB1c2VkIGluIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gIiArCkBAIC05NCwxNCArMTEzLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtIG9uIHRoZSBJbnB1dFN0cmVhbSA8Y29kZT5pbjwvY29kZT4uCi0gICAgICogVGhlIGJ1ZmZlciBzaXplIGlzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyIDxjb2RlPnNpemU8L2NvZGU+IGFuZCBhbGwKLSAgICAgKiByZWFkcyBjYW4gbm93IGJlIGZpbHRlcmVkIHRocm91Z2ggdGhpcyBCdWZmZXJlZElucHV0U3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ1ZmZlcmVkSW5wdXRTdHJlYW19IG9uIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19CisgICAgICoge0Bjb2RlIGlufS4gVGhlIGJ1ZmZlciBzaXplIGlzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyIHtAY29kZSBzaXplfQorICAgICAqIGFuZCBhbGwgcmVhZHMgYXJlIG5vdyBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIHRvIGJ1ZmZlciByZWFkcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0gdGhlIGJ1ZmZlciByZWFkcyBmcm9tLgogICAgICAqIEBwYXJhbSBzaXplCiAgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiBidWZmZXIgdG8gYWxsb2NhdGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc2l6ZSA8IDB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihpbik7CkBAIC0xMTMsMTQgKzEzNSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50IHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUKLSAgICAgKiB0aGlzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gd2lsbCBibG9jay4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICAgICogYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIgcGx1cyB0aG9zZSBhdmFpbGFibGUgaW4gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgdGhpcyBzdHJlYW0gd2lsbAorICAgICAqIGJsb2NrLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIKKyAgICAgKiBwbHVzIHRob3NlIGF2YWlsYWJsZSBpbiB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGJlZm9yZSBibG9ja2luZy4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTMyLDExICsxNTQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gY2xvc2VzIHRoZSB0YXJnZXQKLSAgICAgKiBzdHJlYW0gYW5kIHJlbGVhc2VzIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4gVGhlIHNvdXJjZSBzdHJlYW0gaXMgY2xvc2VkIGFuZCBhbnkgcmVzb3VyY2VzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSByZWxlYXNlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhpcyBzdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE4MCwxNiArMjAzLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IGEgTWFyayBwb3NpdGlvbiBpbiB0aGlzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5yZWFkTGltaXQ8L2NvZGU+IGluZGljYXRlcyBob3cgbWFueSBieXRlcyBjYW4gYmUgcmVhZCBiZWZvcmUgYQotICAgICAqIG1hcmsgaXMgaW52YWxpZGF0ZWQuIFNlbmRpbmcgcmVzZXQoKSB3aWxsIHJlcG9zaXRpb24gdGhlIFN0cmVhbSBiYWNrIHRvCi0gICAgICogdGhlIG1hcmtlZCBwb3NpdGlvbiBwcm92aWRlZCA8Y29kZT5yZWFkTGltaXQ8L2NvZGU+IGhhcyBub3QgYmVlbgotICAgICAqIHN1cnBhc3NlZC4gVGhlIHVuZGVybHlpbmcgYnVmZmVyIG1heSBiZSBpbmNyZWFzZWQgaW4gc2l6ZSB0byBhbGxvdwotICAgICAqIDxjb2RlPnJlYWRsaW1pdDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHN1cHBvcnRlZC4KKyAgICAgKiBTZXRzIGEgbWFyayBwb3NpdGlvbiBpbiB0aGlzIHN0cmVhbS4gVGhlIHBhcmFtZXRlciB7QGNvZGUgcmVhZGxpbWl0fQorICAgICAqIGluZGljYXRlcyBob3cgbWFueSBieXRlcyBjYW4gYmUgcmVhZCBiZWZvcmUgYSBtYXJrIGlzIGludmFsaWRhdGVkLgorICAgICAqIENhbGxpbmcge0Bjb2RlIHJlc2V0KCl9IHdpbGwgcmVwb3NpdGlvbiB0aGUgc3RyZWFtIGJhY2sgdG8gdGhlIG1hcmtlZAorICAgICAqIHBvc2l0aW9uIGlmIHtAY29kZSByZWFkbGltaXR9IGhhcyBub3QgYmVlbiBzdXJwYXNzZWQuIFRoZSB1bmRlcmx5aW5nCisgICAgICogYnVmZmVyIG1heSBiZSBpbmNyZWFzZWQgaW4gc2l6ZSB0byBhbGxvdyB7QGNvZGUgcmVhZGxpbWl0fSBudW1iZXIgb2YKKyAgICAgKiBieXRlcyB0byBiZSBzdXBwb3J0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRsaW1pdAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBhYmxlIHRvIHJlYWQgYmVmb3JlIGludmFsaWRhdGluZyB0aGUKLSAgICAgKiAgICAgICAgICAgIG1hcmsuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgYmVmb3JlIHRoZSBtYXJrIGlzCisgICAgICogICAgICAgICAgICBpbnZhbGlkYXRlZC4KKyAgICAgKiBAc2VlICNyZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewpAQCAtMTk4LDExICsyMjMsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgQnVmZmVyZWRJbnB1dFN0cmVhbQotICAgICAqIHN1cHBvcnRzIG1hcmsoKSBhbmQgcmVzZXQoKS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIge0Bjb2RlIEJ1ZmZlcmVkSW5wdXRTdHJlYW19IHN1cHBvcnRzIHRoZSB7QGNvZGUgbWFyaygpfQorICAgICAqIGFuZCB7QGNvZGUgcmVzZXQoKX0gbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciBCdWZmZXJlZElucHV0U3RyZWFtcy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBmb3IgQnVmZmVyZWRJbnB1dFN0cmVhbXMuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CkBAIC0yMTAsMTYgKzIzNywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYW5kIHJldHVybnMgdGhlIHJlc3VsdAotICAgICAqIGFzIGFuIGludC4gVGhlIGxvdy1vcmRlciBieXRlIGlzIHJldHVybmVkIG9yIC0xIG9mIHRoZSBlbmQgb2Ygc3RyZWFtIHdhcwotICAgICAqIGVuY291bnRlcmVkLiBJZiB0aGUgdW5kZXJseWluZyBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhbnkgYXZhaWxhYmxlCi0gICAgICogYnl0ZXMgdGhlbiBpdCBpcyBmaWxsZWQgYW5kIHRoZSBmaXJzdCBieXRlIGlzIHJldHVybmVkLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyIGluIHRoZQorICAgICAqIHJhbmdlIGZyb20gMCB0byAyNTUuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZyBoYXMgYmVlbgorICAgICAqIHJlYWNoZWQuIElmIHRoZSBpbnRlcm5hbCBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhbnkgYXZhaWxhYmxlIGJ5dGVzIHRoZW4KKyAgICAgKiBpdCBpcyBmaWxsZWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbSBhbmQgdGhlIGZpcnN0IGJ5dGUgaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJlYW0gaGFzIGJlZW4KKyAgICAgKiAgICAgICAgIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yNDEsMjYgKzI2OCwzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+bGVuZ3RoPC9jb2RlPiBieXRlcyBmcm9tIHRoaXMgQnVmZmVyZWRJbnB1dFN0cmVhbQotICAgICAqIGFuZCBzdG9yZXMgdGhlbSBpbiBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgb2Zmc2V0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuIElmIGFsbCB0aGUgYnVmZmVyZWQKLSAgICAgKiBieXRlcyBoYXZlIGJlZW4gdXNlZCwgYSBtYXJrIGhhcyBub3QgYmVlbiBzZXQsIGFuZCB0aGUgcmVxdWVzdGVkIG51bWJlcgotICAgICAqIG9mIGJ5dGVzIGlzIGxhcmdlciB0aGFuIHRoZSByZWNlaXZlcidzIGJ1ZmZlciBzaXplLCB0aGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogYnlwYXNzZXMgdGhlIGJ1ZmZlciBhbmQgc2ltcGx5IHBsYWNlcyB0aGUgcmVzdWx0cyBkaXJlY3RseSBpbnRvCi0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPi4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBsZW5ndGh9IGJ5dGVzIGZyb20gdGhpcyBzdHJlYW0gYW5kIHN0b3JlcyB0aGVtIGluCisgICAgICogYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdCBvZmZzZXQge0Bjb2RlIG9mZnNldH0uIFJldHVybnMgdGhlCisgICAgICogbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgbm8gYnl0ZXMgd2VyZSByZWFkIGFuZCB0aGUgZW5kIG9mCisgICAgICogdGhlIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuIElmIGFsbCB0aGUgYnVmZmVyZWQgYnl0ZXMgaGF2ZSBiZWVuIHVzZWQsIGEKKyAgICAgKiBtYXJrIGhhcyBub3QgYmVlbiBzZXQgYW5kIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzIGlzIGxhcmdlciB0aGFuCisgICAgICogdGhlIHJlY2VpdmVyJ3MgYnVmZmVyIHNpemUsIHRoaXMgaW1wbGVtZW50YXRpb24gYnlwYXNzZXMgdGhlIGJ1ZmZlciBhbmQKKyAgICAgKiBzaW1wbHkgcGxhY2VzIHRoZSByZXN1bHRzIGRpcmVjdGx5IGludG8ge0Bjb2RlIGJ1ZmZlcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmZmVyfSB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZAorICAgICAqICAgICAgICAgICAgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuZ3RoIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1ZmZlcn0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCkBAIC0yNzAsOSArMzAxLDE4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNTkiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3cKLSAgICAgICAgaWYgKG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggLSBsZW5ndGggfHwgb2Zmc2V0IDwgMCB8fCBsZW5ndGggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LCB1c2VkIChvZmZzZXQgfCBsZW5ndGgpIDwgMAorICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAobGVuZ3RoIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgaWYgKChvZmZzZXQgfCBsZW5ndGgpIDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIC0gbGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtMzI2LDE2ICszNjYsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCB0aGlzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gdG8gdGhlIGxhc3QgbWFya2VkIGxvY2F0aW9uLiBJZiB0aGUKLSAgICAgKiA8Y29kZT5yZWFkbGltaXQ8L2NvZGU+IGhhcyBiZWVuIHBhc3NlZCBvciBubyA8Y29kZT5tYXJrPC9jb2RlPiBoYXMKLSAgICAgKiBiZWVuIHNldCwgdGhyb3cgSU9FeGNlcHRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gcmVzZXRzIHRoZSB0YXJnZXQKLSAgICAgKiBzdHJlYW0uCisgICAgICogUmVzZXRzIHRoaXMgc3RyZWFtIHRvIHRoZSBsYXN0IG1hcmtlZCBsb2NhdGlvbi4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCwgbm8gbWFyayBoYXMgYmVlbiBzZXQgb3IgdGhlIG1hcmsgaXMKKyAgICAgKiAgICAgICAgICAgICBubyBsb25nZXIgdmFsaWQgYmVjYXVzZSBtb3JlIHRoYW4ge0Bjb2RlIHJlYWRsaW1pdH0gYnl0ZXMKKyAgICAgKiAgICAgICAgICAgICBoYXZlIGJlZW4gcmVhZCBzaW5jZSBzZXR0aW5nIHRoZSBtYXJrLgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0zNTUsMTcgKzM5NCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmFtb3VudDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgQnVmZmVyZWRJbnB1dFN0cmVhbS4KLSAgICAgKiBTdWJzZXF1ZW50IDxjb2RlPnJlYWQoKTwvY29kZT4ncyB3aWxsIG5vdCByZXR1cm4gdGhlc2UgYnl0ZXMgdW5sZXNzCi0gICAgICogPGNvZGU+cmVzZXQoKTwvY29kZT4gaXMgdXNlZC4KKyAgICAgKiBTa2lwcyB7QGNvZGUgYW1vdW50fSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBzdHJlYW0uIFN1YnNlcXVlbnQKKyAgICAgKiB7QGNvZGUgcmVhZCgpfSdzIHdpbGwgbm90IHJldHVybiB0aGVzZSBieXRlcyB1bmxlc3Mge0Bjb2RlIHJlc2V0KCl9IGlzCisgICAgICogdXNlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYW1vdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuIHtAY29kZSBza2lwfSBkb2VzIG5vdGhpbmcgYW5kCisgICAgICogICAgICAgICAgICByZXR1cm5zIDAgaWYge0Bjb2RlIGFtb3VudH0gaXMgbGVzcyB0aGFuIHplcm8uCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNraXBwZWQuCi0gICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIHNraXAobG9uZyBhbW91bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQppbmRleCBkZDVjYmZmLi5lMmY0MmUyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTI0LDMyICsyNCw0NiBAQAogLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogLyoqCi0gKiBCdWZmZXJlZE91dHB1dFN0cmVhbSBpcyBhIGNsYXNzIHdoaWNoIHRha2VzIGFuIG91dHB1dCBzdHJlYW0gYW5kCi0gKiA8ZW0+YnVmZmVyczwvZW0+IHRoZSB3cml0ZXMgdG8gdGhhdCBzdHJlYW0uIEluIHRoaXMgd2F5LCBjb3N0bHkgaW50ZXJhY3Rpb24KLSAqIHdpdGggdGhlIG9yaWdpbmFsIG91dHB1dCBzdHJlYW0gY2FuIGJlIG1pbmltaXplZCBieSB3cml0aW5nIGJ1ZmZlcmVkIGFtb3VudHMKLSAqIG9mIGRhdGEgaW5mcmVxdWVudGx5LiBUaGUgZHJhd2JhY2sgaXMgdGhhdCBleHRyYSBzcGFjZSBpcyByZXF1aXJlZCB0byBob2xkCi0gKiB0aGUgYnVmZmVyIGFuZCBjb3B5aW5nIHRha2VzIHBsYWNlIHdoZW4gd3JpdGluZyB0aGF0IGJ1ZmZlci4KKyAqIFdyYXBzIGFuIGV4aXN0aW5nIHtAbGluayBPdXRwdXRTdHJlYW19IGFuZCA8ZW0+YnVmZmVyczwvZW0+IHRoZSBvdXRwdXQuCisgKiBFeHBlbnNpdmUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gaXMgbWluaW1pemVkLCBzaW5jZQorICogbW9zdCAoc21hbGxlcikgcmVxdWVzdHMgY2FuIGJlIHNhdGlzZmllZCBieSBhY2Nlc3NpbmcgdGhlIGJ1ZmZlciBhbG9uZS4gVGhlCisgKiBkcmF3YmFjayBpcyB0aGF0IHNvbWUgZXh0cmEgc3BhY2UgaXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgYnVmZmVyIGFuZCB0aGF0CisgKiBjb3B5aW5nIHRha2VzIHBsYWNlIHdoZW4gZmx1c2hpbmcgdGhhdCBidWZmZXIsIGJ1dCB0aGlzIGlzIHVzdWFsbHkgb3V0d2VpZ2hlZAorICogYnkgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXRzLgorICogCisgKiA8cC8+QSB0eXBpY2FsIGFwcGxpY2F0aW9uIHBhdHRlcm4gZm9yIHRoZSBjbGFzcyBsb29rcyBsaWtlIHRoaXM6PHAvPgorICogCisgKiA8cHJlPgorICogQnVmZmVyZWRPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCZxdW90O2ZpbGUuamF2YSZxdW90OykpOworICogPC9wcmU+CiAgKiAKICAqIEBzZWUgQnVmZmVyZWRJbnB1dFN0cmVhbQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKICAgICAvKioKLSAgICAgKiBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uCisgICAgICogVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBieXRlW10gYnVmOwogCiAgICAgLyoqCi0gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBpbnNpZGUgdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmPC9jb2RlPi4KKyAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluc2lkZSB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYnVmfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGNvdW50OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSBvbiB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogPGNvZGU+b3V0PC9jb2RlPi4gVGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgKDhLYikgaXMgYWxsb2NhdGVkIGFuZCBhbGwKLSAgICAgKiB3cml0ZXMgYXJlIG5vdyBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtfSBvbiB0aGUge0BsaW5rIE91dHB1dFN0cmVhbX0KKyAgICAgKiB7QGNvZGUgb3V0fS4gVGhlIGJ1ZmZlciBzaXplIGlzIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvZiA4IEtCLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBPdXRwdXRTdHJlYW0gdG8gYnVmZmVyIHdyaXRlcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfSBmb3Igd2hpY2ggd3JpdGUgb3BlcmF0aW9ucyBhcmUKKyAgICAgKiAgICAgICAgICAgIGJ1ZmZlcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CiAgICAgICAgIHN1cGVyKG91dCk7CkBAIC01NywxMiArNzEsMTEgQEAKIAogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIC8qCi0gICAgICAgICAqIEZvciBBbmRyb2lkLCB3ZSB3YW50IHRvIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzCi0gICAgICAgICAqIGNvbnN0cnVjdG9yICh3aXRoIGl0cyBhcmd1YWJseSB0b28tbGFyZ2UgZGVmYXVsdCksIHNvIHdlCi0gICAgICAgICAqIG5vdGUgaXRzIHVzZSBpbiB0aGUgbG9nLiBXZSBkb24ndCBkaXNhYmxlIGl0LCBub3IgZG8gd2UKLSAgICAgICAgICogYWx0ZXIgdGhlIGRlZmF1bHQsIGhvd2V2ZXIsIGJlY2F1c2Ugd2Ugc3RpbGwgYWltIHRvIGJlaGF2ZQotICAgICAgICAgKiBjb21wYXRpYmx5LCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUsIHRob3VnaCBub3QgZG9jdW1lbnRlZCwKLSAgICAgICAgICogaXMgZXN0YWJsaXNoZWQgYnkgY29udmVudGlvbi4KKyAgICAgICAgICogRm9yIEFuZHJvaWQsIHdlIHdhbnQgdG8gZGlzY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgY29uc3RydWN0b3IgKHdpdGgKKyAgICAgICAgICogaXRzIGFyZ3VhYmx5IHRvby1sYXJnZSBkZWZhdWx0KSwgc28gd2Ugbm90ZSBpdHMgdXNlIGluIHRoZSBsb2cuIFdlCisgICAgICAgICAqIGRvbid0IGRpc2FibGUgaXQsIG5vciBkbyB3ZSBhbHRlciB0aGUgZGVmYXVsdCwgaG93ZXZlciwgYmVjYXVzZSB3ZQorICAgICAgICAgKiBzdGlsbCBhaW0gdG8gYmVoYXZlIGNvbXBhdGlibHksIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhvdWdoIG5vdAorICAgICAgICAgKiBkb2N1bWVudGVkLCBpcyBlc3RhYmxpc2hlZCBieSBjb252ZW50aW9uLgogICAgICAgICAgKi8KICAgICAgICAgTG9nZ2VyLmdsb2JhbC5pbmZvKAogICAgICAgICAgICAgICAgICJEZWZhdWx0IGJ1ZmZlciBzaXplIHVzZWQgaW4gQnVmZmVyZWRPdXRwdXRTdHJlYW0gIiArCkBAIC03MiwxNiArODUsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG9uIHRoZSBPdXRwdXRTdHJlYW0KLSAgICAgKiA8Y29kZT5vdXQ8L2NvZGU+LiBUaGUgYnVmZmVyIHNpemUgaXMgc2V0IHRvIDxjb2RlPnNpemU8L2NvZGU+IGFuZAotICAgICAqIGFsbCB3cml0ZXMgYXJlIG5vdyBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtfSBvbiB0aGUge0BsaW5rIE91dHB1dFN0cmVhbX0KKyAgICAgKiB7QGNvZGUgb3V0fS4gVGhlIGJ1ZmZlciBzaXplIGlzIHNldCB0byB7QGNvZGUgc2l6ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIE91dHB1dFN0cmVhbSB0byBidWZmZXIgd3JpdGVzIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0gZm9yIHdoaWNoIHdyaXRlIG9wZXJhdGlvbnMgYXJlIGJ1ZmZlcmVkLgogICAgICAqIEBwYXJhbSBzaXplCiAgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgdGhlIHNpemUgaXMgPD0gMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzaXplIDw9IDB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihvdXQpOwpAQCAtOTMsMTMgKzEwNiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgQnVmZmVyZWRPdXRwdXRTdHJlYW0gdG8gZW5zdXJlIGFsbCBwZW5kaW5nIGRhdGEgaXMgd3JpdHRlbiBvdXQKLSAgICAgKiB0byB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbS4gSW4gYWRkaXRpb24sIHRoZSB0YXJnZXQgc3RyZWFtIGlzIGFsc28KLSAgICAgKiBmbHVzaGVkLgorICAgICAqIEZsdXNoZXMgdGhpcyBzdHJlYW0gdG8gZW5zdXJlIGFsbCBwZW5kaW5nIGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gdGhlCisgICAgICogdGFyZ2V0IHN0cmVhbS4gSW4gYWRkaXRpb24sIHRoZSB0YXJnZXQgc3RyZWFtIGlzIGZsdXNoZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTExLDI3ICsxMjMsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IDxjb2RlPmJ5dGVzPC9jb2RlPiBmcm9tIHRoZSBieXRlIGFycmF5Ci0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHRvIHRoaXMKLSAgICAgKiBCdWZmZXJlZE91dHB1dFN0cmVhbS4gSWYgdGhlcmUgaXMgcm9vbSBpbiB0aGUgYnVmZmVyIHRvIGhvbGQgdGhlIGJ5dGVzLAotICAgICAqIHRoZXkgYXJlIGNvcGllZCBpbi4gSWYgbm90LCB0aGUgYnVmZmVyZWQgYnl0ZXMgcGx1cyB0aGUgYnl0ZXMgaW4KLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+IGFyZSB3cml0dGVuIHRvIHRoZSB0YXJnZXQgc3RyZWFtLCB0aGUgdGFyZ2V0IGlzCi0gICAgICogZmx1c2hlZCwgYW5kIHRoZSBidWZmZXIgaXMgY2xlYXJlZC4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBieXRlcyBmcm9tIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0CisgICAgICoge0Bjb2RlIG9mZnNldH0gdG8gdGhpcyBzdHJlYW0uIElmIHRoZXJlIGlzIHJvb20gaW4gdGhlIGJ1ZmZlciB0byBob2xkIHRoZQorICAgICAqIGJ5dGVzLCB0aGV5IGFyZSBjb3BpZWQgaW4uIElmIG5vdCwgdGhlIGJ1ZmZlcmVkIGJ5dGVzIHBsdXMgdGhlIGJ5dGVzIGluCisgICAgICoge0Bjb2RlIGJ1ZmZlcn0gYXJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCBzdHJlYW0sIHRoZSB0YXJnZXQgaXMgZmx1c2hlZCwKKyAgICAgKiBhbmQgdGhlIGJ1ZmZlciBpcyBjbGVhcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBidWZmZXIgdG8gZ2V0IGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gZnJvbSB3aGVyZSB0byBnZXQgYnl0ZXMuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0uCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGJ1ZmZlciBpcyBudWxsLgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIG9mZnNldCBvciBjb3VudCBpcyBvdXRzaWRlIG9mIGJvdW5kcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGxlbmd0aCA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBsZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGJ1ZmZlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQpAQCAtMTQwLDEwICsxNTMsMTYgQEAKICAgICAgICAgICAgIC8vIEswMDQ3PWJ1ZmZlciBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIC0gbGVuZ3RoIHx8IGxlbmd0aCA8IDApIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHVzZWQgKG9mZnNldCB8IGxlbmd0aCkgPCAwIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChsZW5ndGggPCAwKQorICAgICAgICAvLyB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKChvZmZzZXQgfCBsZW5ndGgpIDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIC0gbGVuZ3RoKSB7CiAgICAgICAgICAgICAvLyBLMDAyZj1Bcmd1bWVudHMgb3V0IG9mIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGNvdW50ID09IDAgJiYgbGVuZ3RoID49IGJ1Zi5sZW5ndGgpIHsKICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE3MywxOSArMTkyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgYnl0ZSA8Y29kZT5vbmVCeXRlPC9jb2RlPiB0byB0aGlzCi0gICAgICogQnVmZmVyZWRPdXRwdXRTdHJlYW0uIE9ubHkgdGhlIGxvdyBvcmRlciBieXRlIG9mIDxjb2RlPm9uZUJ5dGU8L2NvZGU+Ci0gICAgICogaXMgd3JpdHRlbi4gSWYgdGhlcmUgaXMgcm9vbSBpbiB0aGUgYnVmZmVyLCB0aGUgYnl0ZSBpcyBjb3BpZWQgaW4gYW5kIHRoZQotICAgICAqIGNvdW50IGluY3JlbWVudGVkLiBPdGhlcndpc2UsIHRoZSBidWZmZXIgcGx1cyA8Y29kZT5vbmVCeXRlPC9jb2RlPiBhcmUKLSAgICAgKiB3cml0dGVuIHRvIHRoZSB0YXJnZXQgc3RyZWFtLCB0aGUgdGFyZ2V0IGlzIGZsdXNoZWQsIGFuZCB0aGUgYnVmZmVyIGlzCi0gICAgICogcmVzZXQuCisgICAgICogV3JpdGVzIG9uZSBieXRlIHRvIHRoaXMgc3RyZWFtLiBPbmx5IHRoZSBsb3cgb3JkZXIgYnl0ZSBvZiB0aGUgaW50ZWdlcgorICAgICAqIHtAY29kZSBvbmVCeXRlfSBpcyB3cml0dGVuLiBJZiB0aGVyZSBpcyByb29tIGluIHRoZSBidWZmZXIsIHRoZSBieXRlIGlzCisgICAgICogY29waWVkIGludG8gdGhlIGJ1ZmZlciBhbmQgdGhlIGNvdW50IGluY3JlbWVudGVkLiBPdGhlcndpc2UsIHRoZSBidWZmZXIKKyAgICAgKiBwbHVzIHtAY29kZSBvbmVCeXRlfSBhcmUgd3JpdHRlbiB0byB0aGUgdGFyZ2V0IHN0cmVhbSwgdGhlIHRhcmdldCBpcworICAgICAqIGZsdXNoZWQsIGFuZCB0aGUgYnVmZmVyIGlzIHJlc2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvbmVCeXRlCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBiZSB3cml0dGVuLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGludCBvbmVCeXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnVmZmVyZWRSZWFkZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkUmVhZGVyLmphdmEKaW5kZXggNjYxMmQ5YS4uYzQ5MGI4OSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnVmZmVyZWRSZWFkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZFJlYWRlci5qYXZhCkBAIC0yNCwyMiArMjQsMjIgQEAKIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKIC8qKgotICogQnVmZmVyZWRSZWFkZXIgaXMgYSBidWZmZXJlZCBjaGFyYWN0ZXIgaW5wdXQgcmVhZGVyLiBCdWZmZXJpbmcgYWxsb3dzIHJlYWRpbmcKLSAqIGZyb20gY2hhcmFjdGVyIHN0cmVhbXMgbW9yZSBlZmZpY2llbnRseS4gSWYgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzCi0gKiBub3QgcHJhY3RpY2FsLCBhbm90aGVyIHNpemUgbWF5IGJlIHNwZWNpZmllZC4gUmVhZGluZyBhIGNoYXJhY3RlciBmcm9tIGEKLSAqIFJlYWRlciBjbGFzcyB1c3VhbGx5IGludm9sdmVzIHJlYWRpbmcgYSBjaGFyYWN0ZXIgZnJvbSBpdHMgU3RyZWFtIG9yCi0gKiBzdWJzZXF1ZW50IFJlYWRlci4gSXQgaXMgYWR2aXNhYmxlIHRvIHdyYXAgYSBCdWZmZXJlZFJlYWRlciBhcm91bmQgdGhvc2UKLSAqIFJlYWRlcnMgd2hvc2UgcmVhZCBvcGVyYXRpb25zIG1heSBoYXZlIGhpZ2ggbGF0ZW5jeS4gRm9yIGV4YW1wbGUsIHRoZQotICogZm9sbG93aW5nIGNvZGUKKyAqIFdyYXBzIGFuIGV4aXN0aW5nIHtAbGluayBSZWFkZXJ9IGFuZCA8ZW0+YnVmZmVyczwvZW0+IHRoZSBpbnB1dC4gRXhwZW5zaXZlCisgKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1bmRlcmx5aW5nIHJlYWRlciBpcyBtaW5pbWl6ZWQsIHNpbmNlIG1vc3QgKHNtYWxsZXIpCisgKiByZXF1ZXN0cyBjYW4gYmUgc2F0aXNmaWVkIGJ5IGFjY2Vzc2luZyB0aGUgYnVmZmVyIGFsb25lLiBUaGUgZHJhd2JhY2sgaXMgdGhhdAorICogc29tZSBleHRyYSBzcGFjZSBpcyByZXF1aXJlZCB0byBob2xkIHRoZSBidWZmZXIgYW5kIHRoYXQgY29weWluZyB0YWtlcyBwbGFjZQorICogd2hlbiBmaWxsaW5nIHRoYXQgYnVmZmVyLCBidXQgdGhpcyBpcyB1c3VhbGx5IG91dHdlaWdoZWQgYnkgdGhlIHBlcmZvcm1hbmNlCisgKiBiZW5lZml0cy4KKyAqIAorICogPHAvPkEgdHlwaWNhbCBhcHBsaWNhdGlvbiBwYXR0ZXJuIGZvciB0aGUgY2xhc3MgbG9va3MgbGlrZSB0aGlzOjxwLz4KICAqIAogICogPHByZT4KLSAqIEJ1ZmZlcmVkUmVhZGVyIGluUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKCZxdW90O2ZpbGUuamF2YSZxdW90OykpOworICogQnVmZmVyZWRSZWFkZXIgYnVmID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKCZxdW90O2ZpbGUuamF2YSZxdW90OykpOwogICogPC9wcmU+CiAgKiAKLSAqIHdpbGwgYnVmZmVyIGlucHV0IGZvciB0aGUgZmlsZSA8Y29kZT5maWxlLmphdmE8L2NvZGU+LgotICogCiAgKiBAc2VlIEJ1ZmZlcmVkV3JpdGVyCi0gKiBAc2luY2UgMS4xCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQnVmZmVyZWRSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewogCkBAIC01NiwxMiArNTYsMTIgQEAKICAgICBwcml2YXRlIGludCBwb3M7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ1ZmZlcmVkUmVhZGVyIG9uIHRoZSBSZWFkZXIgPGNvZGU+aW48L2NvZGU+LiBUaGUKLSAgICAgKiBkZWZhdWx0IGJ1ZmZlciBzaXplICg4SykgaXMgYWxsb2NhdGVkIGFuZCBhbGwgcmVhZHMgY2FuIG5vdyBiZSBmaWx0ZXJlZAotICAgICAqIHRocm91Z2ggdGhpcyBCdWZmZXJlZFJlYWRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ1ZmZlcmVkUmVhZGVyIG9uIHRoZSBSZWFkZXIge0Bjb2RlIGlufS4gVGhlCisgICAgICogYnVmZmVyIGdldHMgdGhlIGRlZmF1bHQgc2l6ZSAoOCBLQikuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluCi0gICAgICogICAgICAgICAgICB0aGUgUmVhZGVyIHRvIGJ1ZmZlciByZWFkcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBSZWFkZXIgdGhhdCBpcyBidWZmZXJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIoUmVhZGVyIGluKSB7CiAgICAgICAgIHN1cGVyKGluKTsKQEAgLTg1LDE2ICs4NSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQnVmZmVyZWRSZWFkZXIgb24gdGhlIFJlYWRlciA8Y29kZT5pbjwvY29kZT4uIFRoZQotICAgICAqIGJ1ZmZlciBzaXplIGlzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyIDxjb2RlPnNpemU8L2NvZGU+IGFuZCBhbGwKLSAgICAgKiByZWFkcyBjYW4gbm93IGJlIGZpbHRlcmVkIHRocm91Z2ggdGhpcyBCdWZmZXJlZFJlYWRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ1ZmZlcmVkUmVhZGVyIG9uIHRoZSBSZWFkZXIge0Bjb2RlIGlufS4gVGhlIGJ1ZmZlcgorICAgICAqIHNpemUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIge0Bjb2RlIHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIFJlYWRlciB0byBidWZmZXIgcmVhZHMgb24uCisgICAgICogICAgICAgICAgICB0aGUgUmVhZGVyIHRoYXQgaXMgYnVmZmVyZWQuCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIGJ1ZmZlciB0byBhbGxvY2F0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gYWxsb2NhdGUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBpcyA8PSAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNpemUgPD0gMH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyKFJlYWRlciBpbiwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoaW4pOwpAQCAtMTA2LDEyICsxMDYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgUmVhZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgUmVhZGVyIGJlaW5nIGZpbHRlcmVkCi0gICAgICogYW5kIHJlbGVhc2VzIHRoZSBidWZmZXIgdXNlZCBieSB0aGlzIHJlYWRlci4gSWYgdGhpcyBCdWZmZXJlZFJlYWRlciBoYXMKLSAgICAgKiBhbHJlYWR5IGJlZW4gY2xvc2VkLCBub3RoaW5nIGlzIGRvbmUuCisgICAgICogQ2xvc2VzIHRoaXMgcmVhZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgYnVmZmVyZWQgc291cmNlIHJlYWRlcgorICAgICAqIGFuZCByZWxlYXNlcyB0aGUgYnVmZmVyLiBOb3RoaW5nIGlzIGRvbmUgaWYgdGhpcyByZWFkZXIgaGFzIGFscmVhZHkgYmVlbgorICAgICAqIGNsb3NlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhpcyBCdWZmZXJlZFJlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHJlYWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xNTYsMzAgKzE1NywzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGlzIEJ1ZmZlcmVkUmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKICAgICAgICAgcmV0dXJuIGJ1ZiA9PSBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCBhIE1hcmsgcG9zaXRpb24gaW4gdGhpcyBCdWZmZXJlZFJlYWRlci4gVGhlIHBhcmFtZXRlcgotICAgICAqIDxjb2RlPnJlYWRMaW1pdDwvY29kZT4gaW5kaWNhdGVzIGhvdyBtYW55IGNoYXJhY3RlcnMgY2FuIGJlIHJlYWQgYmVmb3JlCi0gICAgICogYSBtYXJrIGlzIGludmFsaWRhdGVkLiBTZW5kaW5nIHJlc2V0KCkgd2lsbCByZXBvc2l0aW9uIHRoZSByZWFkZXIgYmFjayB0bwotICAgICAqIHRoZSBtYXJrZWQgcG9zaXRpb24gcHJvdmlkZWQgPGNvZGU+cmVhZExpbWl0PC9jb2RlPiBoYXMgbm90IGJlZW4KLSAgICAgKiBzdXJwYXNzZWQuCisgICAgICogU2V0cyBhIG1hcmsgcG9zaXRpb24gaW4gdGhpcyByZWFkZXIuIFRoZSBwYXJhbWV0ZXIge0Bjb2RlIHJlYWRsaW1pdH0KKyAgICAgKiBpbmRpY2F0ZXMgaG93IG1hbnkgY2hhcmFjdGVycyBjYW4gYmUgcmVhZCBiZWZvcmUgdGhlIG1hcmsgaXMgaW52YWxpZGF0ZWQuCisgICAgICogQ2FsbGluZyB7QGNvZGUgcmVzZXQoKX0gd2lsbCByZXBvc2l0aW9uIHRoZSByZWFkZXIgYmFjayB0byB0aGUgbWFya2VkCisgICAgICogcG9zaXRpb24gaWYge0Bjb2RlIHJlYWRsaW1pdH0gaGFzIG5vdCBiZWVuIHN1cnBhc3NlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0Ci0gICAgICogICAgICAgICAgICBhbiBpbnQgcmVwcmVzZW50aW5nIGhvdyBtYW55IGNoYXJhY3RlcnMgbXVzdCBiZSByZWFkIGJlZm9yZQotICAgICAqICAgICAgICAgICAgaW52YWxpZGF0aW5nIHRoZSBtYXJrLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyBtYXJrIHRoaXMgQnVmZmVyZWRSZWFkZXIuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgcmVhZCBiZWZvcmUgdGhlIG1hcmsgaXMKKyAgICAgKiAgICAgICAgICAgIGludmFsaWRhdGVkLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgcmVhZGxpbWl0IGlzIDwgMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSByZWFkbGltaXQgPCAwfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgYSBtYXJrIGluIHRoaXMgcmVhZGVyLgorICAgICAqIEBzZWUgI21hcmtTdXBwb3J0ZWQoKQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xOTYsMTEgKzE5OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBSZWFkZXIgc3VwcG9ydHMgbWFyaygpCi0gICAgICogYW5kIHJlc2V0KCkuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHJlYWRlciBzdXBwb3J0cyB0aGUge0Bjb2RlIG1hcmsoKX0gYW5kCisgICAgICoge0Bjb2RlIHJlc2V0KCl9IG1ldGhvZHMuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBtYXJrKCkgYW5kIHJlc2V0KCkgYXJlIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBmb3Ige0Bjb2RlIEJ1ZmZlcmVkUmVhZGVyfS4KKyAgICAgKiBAc2VlICNtYXJrKGludCkKKyAgICAgKiBAc2VlICNyZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKQEAgLTIwOCwxNyArMjEyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhpcyByZWFkZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbgotICAgICAqIGludC4gVGhlIDIgaGlnaGVyLW9yZGVyIGNoYXJhY3RlcnMgYXJlIHNldCB0byAwLiBJZiB0aGUgZW5kIG9mIHJlYWRlciB3YXMKLSAgICAgKiBlbmNvdW50ZXJlZCB0aGVuIHJldHVybiAtMS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBlaXRoZXIgcmV0dXJucyBhCi0gICAgICogY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlciBvciBpZiB0aGVyZSBhcmUgbm8gY2hhcmFjdGVycyBhdmFpbGFibGUsIGZpbGwKLSAgICAgKiB0aGUgYnVmZmVyIHRoZW4gcmV0dXJuIGEgY2hhcmFjdGVyIG9yIC0xLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoaXMgcmVhZGVyIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIHR3bworICAgICAqIGhpZ2hlci1vcmRlciBieXRlcyBzZXQgdG8gMC4gSWYgcG9zc2libGUsIEJ1ZmZlcmVkUmVhZGVyIHJldHVybnMgYQorICAgICAqIGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXIuIElmIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAgKiBidWZmZXIsIGl0IGZpbGxzIHRoZSBidWZmZXIgYW5kIHRoZW4gcmV0dXJucyBhIGNoYXJhY3Rlci4gSXQgcmV0dXJucyAtMQorICAgICAqIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSByZWFkZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHJlYWQgb3IgLTEgaWYgZW5kIG9mIHJlYWRlci4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgcmVhZGVyIGhhcyBiZWVuCisgICAgICogICAgICAgICByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgQnVmZmVyZWRSZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQgb3Igc29tZSBvdGhlciBJTwotICAgICAqICAgICAgICAgICAgIGVycm9yIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yMzUsMjYgKzIzOSwzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+bGVuZ3RoPC9jb2RlPiBjaGFyYWN0ZXJzIGZyb20gdGhpcyBCdWZmZXJlZFJlYWRlcgotICAgICAqIGFuZCBzdG9yZXMgdGhlbSBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSByZWFkIG9yCi0gICAgICogLTEgaWYgdGhlIGVuZCBvZiByZWFkZXIgd2FzIGVuY291bnRlcmVkLiBJZiBhbGwgdGhlIGJ1ZmZlcmVkIGNoYXJhY3RlcnMKLSAgICAgKiBoYXZlIGJlZW4gdXNlZCwgYSBtYXJrIGhhcyBub3QgYmVlbiBzZXQsIGFuZCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgotICAgICAqIGNoYXJhY3RlcnMgaXMgbGFyZ2VyIHRoYW4gdGhpcyBSZWFkZXJzIGJ1ZmZlciBzaXplLCB0aGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogYnlwYXNzZXMgdGhlIGJ1ZmZlciBhbmQgc2ltcGx5IHBsYWNlcyB0aGUgcmVzdWx0cyBkaXJlY3RseSBpbnRvCi0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPi4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBsZW5ndGh9IGNoYXJhY3RlcnMgZnJvbSB0aGlzIHJlYWRlciBhbmQgc3RvcmVzIHRoZW0KKyAgICAgKiBhdCB7QGNvZGUgb2Zmc2V0fSBpbiB0aGUgY2hhcmFjdGVyIGFycmF5IHtAY29kZSBidWZmZXJ9LiBSZXR1cm5zIHRoZQorICAgICAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIHJlYWRlcgorICAgICAqIGhhcyBiZWVuIHJlYWNoZWQuIElmIGFsbCB0aGUgYnVmZmVyZWQgY2hhcmFjdGVycyBoYXZlIGJlZW4gdXNlZCwgYSBtYXJrCisgICAgICogaGFzIG5vdCBiZWVuIHNldCBhbmQgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgY2hhcmFjdGVycyBpcyBsYXJnZXIgdGhhbgorICAgICAqIHRoaXMgcmVhZGVycyBidWZmZXIgc2l6ZSwgQnVmZmVyZWRSZWFkZXIgYnlwYXNzZXMgdGhlIGJ1ZmZlciBhbmQgc2ltcGx5CisgICAgICogcGxhY2VzIHRoZSByZXN1bHRzIGRpcmVjdGx5IGludG8ge0Bjb2RlIGJ1ZmZlcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyIGFycmF5IHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gc3RvcmUgdGhlIGNoYXJhY3RlcnMgcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmIHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBieXRlcyByZWFkCisgICAgICogICAgICAgICAgICBmcm9tIHRoaXMgcmVhZGVyLgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZAotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciAtMSBpZiBlbmQgb2YgcmVhZGVyLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCwgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgbm9uLW5lZ2F0aXZlLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgcmVhZGVyCisgICAgICogICAgICAgICBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuZ3RoIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1ZmZlcn0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBCdWZmZXJlZFJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPCi0gICAgICogICAgICAgICAgICAgZXJyb3Igb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yNjIsOSArMjcxLDE4IEBACiAgICAgICAgICAgICBpZiAoaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA1YiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCAtIGxlbmd0aCB8fCBsZW5ndGggPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgICAgICAvLyBtYWRlIGltcGxpY2l0IG51bGwgY2hlY2sgZXhwbGljaXQsIHVzZWQgKG9mZnNldCB8IGxlbmd0aCkgPCAwCisgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAobGVuZ3RoIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuZ3RoKSA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCAtIGxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KQEAgLTMxNSwxOCArMzMzLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBuZXh0IGxpbmUgb2YgdGV4dAotICAgICAqIGF2YWlsYWJsZSBpbiB0aGlzIEJ1ZmZlcmVkUmVhZGVyLiBBIGxpbmUgaXMgcmVwcmVzZW50ZWQgYnkgMCBvciBtb3JlCi0gICAgICogY2hhcmFjdGVycyBmb2xsb3dlZCBieSA8Y29kZT4nXG4nPC9jb2RlPiwgPGNvZGU+J1xyJzwvY29kZT4sCi0gICAgICogPGNvZGU+J1xyXG4nPC9jb2RlPiBvciBlbmQgb2Ygc3RyZWFtLiBUaGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBkb2VzCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBsaW5lIG9mIHRleHQgYXZhaWxhYmxlIGZyb20gdGhpcyByZWFkZXIuIEEgbGluZSBpcworICAgICAqIHJlcHJlc2VudGVkIGJ5IHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IHtAY29kZSAnXG4nfSwKKyAgICAgKiB7QGNvZGUgJ1xyJ30sIHtAY29kZSAiXHJcbiJ9IG9yIHRoZSBlbmQgb2YgdGhlIHJlYWRlci4gVGhlIHN0cmluZyBkb2VzCiAgICAgICogbm90IGluY2x1ZGUgdGhlIG5ld2xpbmUgc2VxdWVuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgb3IgbnVsbCBpZiBubyBjaGFyYWN0ZXJzIHdlcmUgcmVhZAotICAgICAqICAgICAgICAgYmVmb3JlIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGNoYXJhY3RlcnMgd2VyZQorICAgICAqICAgICAgICAgcmVhZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgcmVhZGVyIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBCdWZmZXJlZFJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPCi0gICAgICogICAgICAgICAgICAgZXJyb3Igb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtNDA3LDE5ICs0MjMsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGlzIFJlYWRlciBpcwotICAgICAqIHJlYWR5IHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4gSWYgdGhlIHJlc3VsdCBpcyA8Y29kZT50cnVlPC9jb2RlPiwKLSAgICAgKiB0aGUgbmV4dCA8Y29kZT5yZWFkKCk8L2NvZGU+IHdpbGwgbm90IGJsb2NrLiBJZiB0aGUgcmVzdWx0IGlzCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRoaXMgUmVhZGVyIG1heSBvciBtYXkgbm90IGJsb2NrIHdoZW4KLSAgICAgKiA8Y29kZT5yZWFkKCk8L2NvZGU+IGlzIHNlbnQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyByZWFkZXIgaXMgcmVhZHkgdG8gYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlY2VpdmVyIHdpbGwgbm90IGJsb2NrIHdoZW4KLSAgICAgKiAgICAgICAgIDxjb2RlPnJlYWQoKTwvY29kZT4gaXMgY2FsbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdW5rbm93bgotICAgICAqICAgICAgICAgb3IgYmxvY2tpbmcgd2lsbCBvY2N1ci4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHJlYWRlciB3aWxsIG5vdCBibG9jayB3aGVuIHtAY29kZSByZWFkfSBpcworICAgICAqICAgICAgICAgY2FsbGVkLCB7QGNvZGUgZmFsc2V9IGlmIHVua25vd24gb3IgYmxvY2tpbmcgd2lsbCBvY2N1ci4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIEJ1ZmZlcmVkUmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSU8KLSAgICAgKiAgICAgICAgICAgICBlcnJvciBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICNyZWFkKCkKKyAgICAgKiBAc2VlICNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICogQHNlZSAjcmVhZExpbmUoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTQzMiwxMyArNDQ1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzZXQgdGhpcyBCdWZmZXJlZFJlYWRlcidzIHBvc2l0aW9uIHRvIHRoZSBsYXN0IDxjb2RlPm1hcmsoKTwvY29kZT4KLSAgICAgKiBsb2NhdGlvbi4gSW52b2NhdGlvbnMgb2YgPGNvZGU+cmVhZCgpL3NraXAoKTwvY29kZT4gd2lsbCBvY2N1ciBmcm9tCi0gICAgICogdGhpcyBuZXcgbG9jYXRpb24uIElmIHRoaXMgUmVhZGVyIHdhcyBub3QgbWFya2VkLCB0aHJvdyBJT0V4Y2VwdGlvbi4KKyAgICAgKiBSZXNldHMgdGhpcyByZWFkZXIncyBwb3NpdGlvbiB0byB0aGUgbGFzdCB7QGNvZGUgbWFyaygpfSBsb2NhdGlvbi4KKyAgICAgKiBJbnZvY2F0aW9ucyBvZiB7QGNvZGUgcmVhZCgpfSBhbmQge0Bjb2RlIHNraXAoKX0gd2lsbCBvY2N1ciBmcm9tIHRoaXMgbmV3CisgICAgICogbG9jYXRpb24uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnJlZCwgdGhlIHJlY2VpdmVyIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5tYXJrKCkvcmVzZXQoKTwvY29kZT4sIG9yIG5vIG1hcmsgaGFzIGJlZW4gc2V0LgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciBubyBtYXJrIGhhcyBiZWVuIHNldC4KKyAgICAgKiBAc2VlICNtYXJrKGludCkKKyAgICAgKiBAc2VlICNtYXJrU3VwcG9ydGVkKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC00NTQsMjAgKzQ2OSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmFtb3VudDwvY29kZT4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBSZWFkZXIuCi0gICAgICogU3Vic2VxdWVudCA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGNoYXJhY3RlcnMKLSAgICAgKiB1bmxlc3MgPGNvZGU+cmVzZXQoKTwvY29kZT4gaXMgdXNlZC4gU2tpcHBpbmcgY2hhcmFjdGVycyBtYXkgaW52YWxpZGF0ZQotICAgICAqIGEgbWFyayBpZiBtYXJrbGltaXQgaXMgc3VycGFzc2VkLgorICAgICAqIFNraXBzIHtAY29kZSBhbW91bnR9IGNoYXJhY3RlcnMgaW4gdGhpcyByZWFkZXIuIFN1YnNlcXVlbnQKKyAgICAgKiB7QGNvZGUgcmVhZCgpfXMgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGNoYXJhY3RlcnMgdW5sZXNzIHtAY29kZSByZXNldCgpfQorICAgICAqIGlzIHVzZWQuIFNraXBwaW5nIGNoYXJhY3RlcnMgbWF5IGludmFsaWRhdGUgYSBtYXJrIGlmIHtAY29kZSByZWFkbGltaXR9CisgICAgICogaXMgc3VycGFzc2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhbW91bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIEJ1ZmZlcmVkUmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSU8KLSAgICAgKiAgICAgICAgICAgICBlcnJvciBvY2N1cnMuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbW91bnQgaXMgbmVnYXRpdmUKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYW1vdW50IDwgMH0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBhbW91bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZFdyaXRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnVmZmVyZWRXcml0ZXIuamF2YQppbmRleCA3YjMwNWE5Li5iZDBkNWZlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZFdyaXRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkV3JpdGVyLmphdmEKQEAgLTI3LDExICsyNywyMiBAQAogLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogLyoqCi0gKiBCdWZmZXJlZFdyaXRlciBpcyBmb3Igd3JpdGluZyBidWZmZXJlZCBjaGFyYWN0ZXIgb3V0cHV0LiBDaGFyYWN0ZXJzIHdyaXR0ZW4KLSAqIHRvIHRoaXMgV3JpdGVyIGFyZSBidWZmZXJlZCBpbnRlcm5hbGx5IGJlZm9yZSBiZWluZyBjb21taXR0ZWQgdG8gdGhlIHRhcmdldAotICogV3JpdGVyLgorICogV3JhcHMgYW4gZXhpc3Rpbmcge0BsaW5rIFdyaXRlcn0gYW5kIDxlbT5idWZmZXJzPC9lbT4gdGhlIG91dHB1dC4gRXhwZW5zaXZlCisgKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1bmRlcmx5aW5nIHJlYWRlciBpcyBtaW5pbWl6ZWQsIHNpbmNlIG1vc3QgKHNtYWxsZXIpCisgKiByZXF1ZXN0cyBjYW4gYmUgc2F0aXNmaWVkIGJ5IGFjY2Vzc2luZyB0aGUgYnVmZmVyIGFsb25lLiBUaGUgZHJhd2JhY2sgaXMgdGhhdAorICogc29tZSBleHRyYSBzcGFjZSBpcyByZXF1aXJlZCB0byBob2xkIHRoZSBidWZmZXIgYW5kIHRoYXQgY29weWluZyB0YWtlcyBwbGFjZQorICogd2hlbiBmaWxsaW5nIHRoYXQgYnVmZmVyLCBidXQgdGhpcyBpcyB1c3VhbGx5IG91dHdlaWdoZWQgYnkgdGhlIHBlcmZvcm1hbmNlCisgKiBiZW5lZml0cy4KKyAqIAorICogPHAvPkEgdHlwaWNhbCBhcHBsaWNhdGlvbiBwYXR0ZXJuIGZvciB0aGUgY2xhc3MgbG9va3MgbGlrZSB0aGlzOjxwLz4KKyAqIAorICogPHByZT4KKyAqIEJ1ZmZlcmVkV3JpdGVyIGJ1ZiA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcigmcXVvdDtmaWxlLmphdmEmcXVvdDspKTsKKyAqIDwvcHJlPgogICogCiAgKiBAc2VlIEJ1ZmZlcmVkUmVhZGVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQnVmZmVyZWRXcml0ZXIgZXh0ZW5kcyBXcml0ZXIgewogCkBAIC00NSwxMiArNTYsMTMgQEAKICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpQWN0aW9uPFN0cmluZz4oImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ1ZmZlcmVkUmVhZGVyIHdpdGggPGNvZGU+b3V0PC9jb2RlPiBhcyB0aGUgV3JpdGVyIG9uCi0gICAgICogd2hpY2ggdG8gYnVmZmVyIHdyaXRlIG9wZXJhdGlvbnMuIFRoZSBidWZmZXIgc2l6ZSBpcyBzZXQgdG8gdGhlIGRlZmF1bHQsCi0gICAgICogd2hpY2ggaXMgOEsuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQnVmZmVyZWRXcml0ZXJ9IHdpdGgge0Bjb2RlIG91dH0gYXMgdGhlIHdyaXRlcgorICAgICAqIGZvciB3aGljaCB0byBidWZmZXIgd3JpdGUgb3BlcmF0aW9ucy4gVGhlIGJ1ZmZlciBzaXplIGlzIHNldCB0byB0aGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIG9mIDggS0IuCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgVGhlIFdyaXRlciB0byBidWZmZXIgY2hhcmFjdGVyIHdyaXRpbmcgb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB3cml0ZXIgZm9yIHdoaWNoIGNoYXJhY3RlciB3cml0aW5nIGlzIGJ1ZmZlcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZFdyaXRlcihXcml0ZXIgb3V0KSB7CiAgICAgICAgIHN1cGVyKG91dCk7CkBAIC01OSwxMiArNzEsMTEgQEAKIAogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIC8qCi0gICAgICAgICAqIEZvciBBbmRyb2lkLCB3ZSB3YW50IHRvIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzCi0gICAgICAgICAqIGNvbnN0cnVjdG9yICh3aXRoIGl0cyBhcmd1YWJseSB0b28tbGFyZ2UgZGVmYXVsdCksIHNvIHdlCi0gICAgICAgICAqIG5vdGUgaXRzIHVzZSBpbiB0aGUgbG9nLiBXZSBkb24ndCBkaXNhYmxlIGl0LCBub3IgZG8gd2UKLSAgICAgICAgICogYWx0ZXIgdGhlIGRlZmF1bHQsIGhvd2V2ZXIsIGJlY2F1c2Ugd2Ugc3RpbGwgYWltIHRvIGJlaGF2ZQotICAgICAgICAgKiBjb21wYXRpYmx5LCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUsIHRob3VnaCBub3QgZG9jdW1lbnRlZCwKLSAgICAgICAgICogaXMgZXN0YWJsaXNoZWQgYnkgY29udmVudGlvbi4KKyAgICAgICAgICogRm9yIEFuZHJvaWQsIHdlIHdhbnQgdG8gZGlzY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgY29uc3RydWN0b3IgKHdpdGgKKyAgICAgICAgICogaXRzIGFyZ3VhYmx5IHRvby1sYXJnZSBkZWZhdWx0KSwgc28gd2Ugbm90ZSBpdHMgdXNlIGluIHRoZSBsb2cuIFdlCisgICAgICAgICAqIGRvbid0IGRpc2FibGUgaXQsIG5vciBkbyB3ZSBhbHRlciB0aGUgZGVmYXVsdCwgaG93ZXZlciwgYmVjYXVzZSB3ZQorICAgICAgICAgKiBzdGlsbCBhaW0gdG8gYmVoYXZlIGNvbXBhdGlibHksIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhvdWdoIG5vdAorICAgICAgICAgKiBkb2N1bWVudGVkLCBpcyBlc3RhYmxpc2hlZCBieSBjb252ZW50aW9uLgogICAgICAgICAgKi8KICAgICAgICAgTG9nZ2VyLmdsb2JhbC5pbmZvKAogICAgICAgICAgICAgICAgICJEZWZhdWx0IGJ1ZmZlciBzaXplIHVzZWQgaW4gQnVmZmVyZWRXcml0ZXIgIiArCkBAIC03NCwxNCArODUsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ1ZmZlcmVkUmVhZGVyIHdpdGggPGNvZGU+b3V0PC9jb2RlPiBhcyB0aGUgV3JpdGVyIG9uCi0gICAgICogd2hpY2ggYnVmZmVyIHdyaXRlIG9wZXJhdGlvbnMuIFRoZSBidWZmZXIgc2l6ZSBpcyBzZXQgdG8KLSAgICAgKiA8Y29kZT5zaXplPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBCdWZmZXJlZFdyaXRlcn0gd2l0aCB7QGNvZGUgb3V0fSBhcyB0aGUgd3JpdGVyCisgICAgICogZm9yIHdoaWNoIHRvIGJ1ZmZlciB3cml0ZSBvcGVyYXRpb25zLiBUaGUgYnVmZmVyIHNpemUgaXMgc2V0IHRvIHtAY29kZQorICAgICAqIHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIFRoZSBXcml0ZXIgdG8gYnVmZmVyIGNoYXJhY3RlciB3cml0aW5nIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIHdyaXRlciBmb3Igd2hpY2ggY2hhcmFjdGVyIHdyaXRpbmcgaXMgYnVmZmVyZWQuCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gdXNlLgorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzaXplIDw9IDB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZFdyaXRlcihXcml0ZXIgb3V0LCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihvdXQpOwpAQCAtOTMsMTIgKzEwNywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgQnVmZmVyZWRXcml0ZXIuIFRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFyZSBmbHVzaGVkLCB0aGUKLSAgICAgKiB0YXJnZXQgd3JpdGVyIGlzIGNsb3NlZCwgYW5kIHRoZSBidWZmZXIgaXMgcmVsZWFzZWQuIE9ubHkgdGhlIGZpcnN0Ci0gICAgICogaW52b2NhdGlvbiBvZiBjbG9zZSBoYXMgYW55IGVmZmVjdC4KKyAgICAgKiBDbG9zZXMgdGhpcyB3cml0ZXIuIFRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFyZSBmbHVzaGVkLCB0aGUgdGFyZ2V0CisgICAgICogd3JpdGVyIGlzIGNsb3NlZCwgYW5kIHRoZSBidWZmZXIgaXMgcmVsZWFzZWQuIE9ubHkgdGhlIGZpcnN0IGludm9jYXRpb24KKyAgICAgKiBvZiBjbG9zZSBoYXMgYW55IGVmZmVjdC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhpcyBXcml0ZXIuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhpcyB3cml0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTEzLDExICsxMjgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGbHVzaCB0aGlzIEJ1ZmZlcmVkV3JpdGVyLiBUaGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhcmUgY29tbWl0dGVkIHRvCi0gICAgICogdGhlIHRhcmdldCB3cml0ZXIgYW5kIGl0IGlzIHRoZW4gZmx1c2hlZC4KKyAgICAgKiBGbHVzaGVzIHRoaXMgd3JpdGVyLiBUaGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhcmUgY29tbWl0dGVkIHRvIHRoZQorICAgICAqIHRhcmdldCB3cml0ZXIgYW5kIGl0IGlzIHRoZW4gZmx1c2hlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhpcyBXcml0ZXIuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGZsdXNoaW5nIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEzNCw0NSArMTUwLDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgQnVmZmVyZWRXcml0ZXIgaXMgY2xvc2VkLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgd3JpdGVyIGlzIGNsb3NlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHdyaXRlciBpcyBjbG9zZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKICAgICAgICAgcmV0dXJuIG91dCA9PSBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgbmV3bGluZSB0byB0aGllIFdyaXRlci4gQSBuZXdsaW5lIGlzIGRldGVybWluZWQgYnkgdGhlIFN5c3RlbQorICAgICAqIFdyaXRlcyBhIG5ld2xpbmUgdG8gdGhpcyB3cml0ZXIuIEEgbmV3bGluZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBTeXN0ZW0KICAgICAgKiBwcm9wZXJ0eSAibGluZS5zZXBhcmF0b3IiLiBUaGUgdGFyZ2V0IHdyaXRlciBtYXkgb3IgbWF5IG5vdCBiZSBmbHVzaGVkCiAgICAgICogd2hlbiBhIG5ld2xpbmUgaXMgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBXcml0ZXIuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyB3cml0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbmV3TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlKGxpbmVTZXBhcmF0b3IsIDAsIGxpbmVTZXBhcmF0b3IubGVuZ3RoKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBvdXQgPGNvZGU+Y291bnQ8L2NvZGU+IGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGluIDxjb2RlPmJ1ZjwvY29kZT4gdG8gdGhpcyBCdWZmZXJlZFdyaXRlci4gSWYKLSAgICAgKiA8Y29kZT5jb3VudDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIHRoaXMgV3JpdGVycyBidWZmZXIgdGhlbiBmbHVzaCB0aGUKLSAgICAgKiBjb250ZW50cyBhbmQgYWxzbyB3cml0ZSB0aGUgY2hhcmFjdGVycyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IFdyaXRlci4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9IGluCisgICAgICoge0Bjb2RlIGNidWZ9IHRvIHRoaXMgd3JpdGVyLiBJZiB7QGNvZGUgY291bnR9IGlzIGdyZWF0ZXIgdGhhbiB0aGlzCisgICAgICogd3JpdGVyJ3MgYnVmZmVyLCB0aGVuIHRoZSBidWZmZXIgaXMgZmx1c2hlZCBhbmQgdGhlIGNoYXJhY3RlcnMgYXJlCisgICAgICogd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IHdyaXRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2J1ZgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIGFycmF5IGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byB3cml0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZiB0byByZXRyaWV2ZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gaW4ge0Bjb2RlIGNidWZ9IGZvciByZXRyaWV2aW5nIGNoYXJhY3RlcnMuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgV3JpdGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIG9yIHNvbWUgb3RoZXIKLSAgICAgKiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBvZmZzZXQgb3IgY291bnQgYXJlIG91dHNpZGUgb2YgYm91bmRzLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgY291bnQgPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgY291bnR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBjYnVmfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB3cml0ZXIgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gY2J1ZiwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTgwLDkgKzE5NywxOCBAQAogICAgICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNWQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGNidWYubGVuZ3RoIC0gY291bnQgfHwgY291bnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgICAgICAvLyBtYWRlIGltcGxpY2l0IG51bGwgY2hlY2sgZXhwbGljaXQsIHVzZWQgKG9mZnNldCB8IGNvdW50KSA8IDAKKyAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChjb3VudCA8IDApIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICAgICAgaWYgKGNidWYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChvZmZzZXQgfCBjb3VudCkgPCAwIHx8IG9mZnNldCA+IGNidWYubGVuZ3RoIC0gY291bnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgaWYgKHBvcyA9PSAwICYmIGNvdW50ID49IHRoaXMuYnVmLmxlbmd0aCkgewogICAgICAgICAgICAgICAgIG91dC53cml0ZShjYnVmLCBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0yMTQsMTYgKzI0MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgY2hhcmFjdGVyIDxjb2RlPm9uZUNoYXI8L2NvZGU+IEJ1ZmZlcmVkV3JpdGVyLiBJZiB0aGUgYnVmZmVyCi0gICAgICogaXMgZmlsbGVkIGJ5IHdyaXRpbmcgdGhpcyBjaGFyYWN0ZXIsIGZsdXNoIHRoaXMgV3JpdGVyLiBPbmx5IHRoZSBsb3dlciAyCi0gICAgICogYnl0ZXMgYXJlIHdyaXR0ZW4uCisgICAgICogV3JpdGVzIHRoZSBjaGFyYWN0ZXIge0Bjb2RlIG9uZUNoYXJ9IHRvIHRoaXMgd3JpdGVyLiBJZiB0aGUgYnVmZmVyCisgICAgICogZ2V0cyBmdWxsIGJ5IHdyaXRpbmcgdGhpcyBjaGFyYWN0ZXIsIHRoaXMgd3JpdGVyIGlzIGZsdXNoZWQuIE9ubHkgdGhlCisgICAgICogbG93ZXIgdHdvIGJ5dGVzIG9mIHRoZSBpbnRlZ2VyIHtAY29kZSBvbmVDaGFyfSBhcmUgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQ2hhcgotICAgICAqICAgICAgICAgICAgVGhlIENoYXJhY3RlciB0byB3cml0ZSBvdXQuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIFdyaXRlciBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBvciBzb21lIG90aGVyCi0gICAgICogICAgICAgICAgICAgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgd3JpdGVyIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IG9uZUNoYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yNDAsMjMgKzI2NSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBvdXQgPGNvZGU+Y291bnQ8L2NvZGU+IGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGluIDxjb2RlPnN0cjwvY29kZT4gdG8gdGhpcyBCdWZmZXJlZFdyaXRlci4gSWYKLSAgICAgKiA8Y29kZT5jb3VudDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIHRoaXMgV3JpdGVycyBidWZmZXIgdGhlbiBmbHVzaCB0aGUKLSAgICAgKiBjb250ZW50cyBhbmQgYWxzbyB3cml0ZSB0aGUgY2hhcmFjdGVycyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IFdyaXRlci4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9IGluIHtAY29kZSBzdHJ9CisgICAgICogdG8gdGhpcyB3cml0ZXIuIElmIHtAY29kZSBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoaXMgd3JpdGVyJ3MgYnVmZmVyLAorICAgICAqIHRoZW4gdGhpcyB3cml0ZXIgaXMgZmx1c2hlZCBhbmQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuCisgICAgICogZGlyZWN0bHkgdG8gdGhlIHRhcmdldCB3cml0ZXIuIElmIGNvdW50IGlzIG5lZ2F0aXZlIG5vIGNoYXJhY3RlcnMgYXJlCisgICAgICogd3JpdHRlbiB0byB0aGUgYnVmZmVyLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYmVoYXZpb3Igb2YgdGhlIHN1cGVyY2xhc3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBzdHIgdG8gcmV0cmlldmUgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIHtAY29kZSBzdHJ9IGZvciByZXRyaWV2aW5nIGNoYXJhY3RlcnMuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIFdyaXRlciBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBvciBzb21lIG90aGVyCi0gICAgICogICAgICAgICAgICAgSU9FeGNlcHRpb24gb2NjdXJzLgotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgb2Zmc2V0IG9yIGNvdW50IGFyZSBvdXRzaWRlIG9mIGJvdW5kcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHdyaXRlciBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvcgorICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIG9mZnNldCArIGNvdW50fSBpcyBncmVhdGVyCisgICAgICogICAgICAgICAgICAgdGhhbiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzdHJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzdHIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDBjMGQ2MWUuLjE1NjRjYTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YQpAQCAtMTcsMzkgKzE3LDU0IEBACiAKIHBhY2thZ2UgamF2YS5pbzsKIAorLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAoraW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOworLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorCiAvKioKLSAqIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzIHVzZWQgZm9yIHN0cmVhbWluZyBvdmVyIGEgYnl0ZSBhcnJheS4KKyAqIEEgc3BlY2lhbGl6ZWQge0BsaW5rIElucHV0U3RyZWFtIH0gZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgYnl0ZSBhcnJheS4KICAqIAogICogQHNlZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCeXRlQXJyYXlJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKICAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Ynl0ZTwvY29kZT4gYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZXMgdG8gc3RyZWFtIG92ZXIuCisgICAgICogVGhlIHtAY29kZSBieXRlfSBhcnJheSBjb250YWluaW5nIHRoZSBieXRlcyB0byBzdHJlYW0gb3Zlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZjsKIAogICAgIC8qKgogICAgICAqIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHBvczsKIAogICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG1hcmsgcG9zaXRpb24uIEluaXRpYWxseSBzZXQgdG8gMCBvciB0aGUgPGNvZGU+b2Zmc2V0PC9jb2RlPgotICAgICAqIHBhcmFtZXRlciB3aXRoaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqIFRoZSBjdXJyZW50IG1hcmsgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBtYXJrOwogCiAgICAgLyoqCiAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBpbml0aWFsbHkgYXZhaWxhYmxlIGluIHRoZSBieXRlIGFycmF5Ci0gICAgICogPGNvZGU+YnVmPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgYnVmfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGNvdW50OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSBvbiB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWY8L2NvZGU+LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ5dGVBcnJheUlucHV0U3RyZWFtfSBvbiB0aGUgYnl0ZSBhcnJheQorICAgICAqIHtAY29kZSBidWZ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIHN0cmVhbSBvdmVyCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBzdHJlYW0gb3Zlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZSBidWZbXSkgewogICAgICAgICB0aGlzLm1hcmsgPSAwOwpAQCAtNTgsMTggKzczLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSBvbiB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWY8L2NvZGU+Ci0gICAgICogd2l0aCB0aGUgcG9zaXRpb24gc2V0IHRvIDxjb2RlPm9mZnNldDwvY29kZT4gYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgKiBhdmFpbGFibGUgc2V0IHRvIDxjb2RlPm9mZnNldDwvY29kZT4gKyA8Y29kZT5sZW5ndGg8L2NvZGU+LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ5dGVBcnJheUlucHV0U3RyZWFtfSBvbiB0aGUgYnl0ZSBhcnJheQorICAgICAqIHtAY29kZSBidWZ9IHdpdGggdGhlIGluaXRpYWwgcG9zaXRpb24gc2V0IHRvIHtAY29kZSBvZmZzZXR9IGFuZCB0aGUKKyAgICAgKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHNldCB0byB7QGNvZGUgb2Zmc2V0fSArIHtAY29kZSBsZW5ndGh9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIHN0cmVhbSBvdmVyCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBzdHJlYW0gb3Zlci4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIDxjb2RlPmJ1ZjwvY29kZT4gdG8gc3RhcnQgc3RyZWFtaW5nIGF0CisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmfSB0byBzdGFydCBzdHJlYW1pbmcgZnJvbS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byBzdHJlYW0gb3Zlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciBzdHJlYW1pbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGUgYnVmW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gY2hhbmdlZCBhcnJheSBub3RhdGlvbiB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgaGFybW9ueQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIHRoaXMuYnVmID0gYnVmOwogICAgICAgICBwb3MgPSBvZmZzZXQ7CiAgICAgICAgIG1hcmsgPSBvZmZzZXQ7CkBAIC03NywxMSArOTYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IHJlcHJlc2VudGluZyB0aGVuIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBhdmFpbGFibGUgYmVmb3JlCi0gICAgICogdGhpcyBCeXRlQXJyYXlJbnB1dFN0cmVhbSB3aWxsIGJsb2NrLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgICAgKiBieXRlcyB5ZXQgdG8gYmUgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJ5dGUgYXJyYXkuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgdGhpcyBzdHJlYW0gd2lsbAorICAgICAqIGJsb2NrLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgeWV0IHRvIGJlIHJlYWQgZnJvbSB0aGUKKyAgICAgKiBzb3VyY2UgYnl0ZSBhcnJheS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGJlZm9yZSBibG9ja2luZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhdmFpbGFibGUoKSB7CkBAIC04OSwxMSArMTA5LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIEJ5dGVBcnJheUlucHV0U3RyZWFtLiBUaGlzIGltcGxlbWVudGF0aW9uIGZyZWVzIHVwIHJlc291cmNlcwotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4KKyAgICAgKiBDbG9zZXMgdGhpcyBzdHJlYW0gYW5kIGZyZWVzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgSW5wdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEwMSwxMiArMTIxLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IGEgTWFyayBwb3NpdGlvbiBpbiB0aGlzIEJ5dGVBcnJheUlucHV0U3RyZWFtLiBUaGUgcGFyYW1ldGVyCi0gICAgICogPGNvZGU+cmVhZExpbWl0PC9jb2RlPiBpcyBpZ25vcmVkLiBTZW5kaW5nIHJlc2V0KCkgd2lsbCByZXBvc2l0aW9uIHRoZQorICAgICAqIFNldHMgYSBtYXJrIHBvc2l0aW9uIGluIHRoaXMgQnl0ZUFycmF5SW5wdXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIKKyAgICAgKiB7QGNvZGUgcmVhZGxpbWl0fSBpcyBpZ25vcmVkLiBTZW5kaW5nIHtAY29kZSByZXNldCgpfSB3aWxsIHJlcG9zaXRpb24gdGhlCiAgICAgICogc3RyZWFtIGJhY2sgdG8gdGhlIG1hcmtlZCBwb3NpdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0CiAgICAgICogICAgICAgICAgICBpZ25vcmVkLgorICAgICAqIEBzZWUgI21hcmtTdXBwb3J0ZWQoKQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7CkBAIC0xMTQsMTIgKzEzNywxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBCeXRlQXJyYXlJbnB1dFN0cmVhbQotICAgICAqIHN1cHBvcnRzIG1hcmsoKSBhbmQgcmVzZXQoKS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBzdHJlYW0gc3VwcG9ydHMgdGhlIHtAY29kZSBtYXJrKCl9IGFuZAorICAgICAqIHtAY29kZSByZXNldCgpfSBtZXRob2RzLiBSZXR1cm5zIHtAY29kZSB0cnVlfSBzaW5jZSB0aGlzIGNsYXNzIHN1cHBvcnRzCisgICAgICogdGhlc2UgbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRlcyB0aGlzIHN0cmVhbSBzdXBwb3J0cyBtYXJrL3Jlc2V0LAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB7QGNvZGUgdHJ1ZX0uCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CkBAIC0xMjcsMTIgKzE1MiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIEJ5dGVBcnJheUlucHV0U3RyZWFtIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKLSAgICAgKiBhcyBhbiBpbnQuIFRoZSBsb3ctb3JkZXIgYnl0ZSBpcyByZXR1cm5lZCBvciAtMSBvZiB0aGUgZW5kIG9mIHN0cmVhbSB3YXMKLSAgICAgKiBlbmNvdW50ZXJlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlIGZyb20gdGhlCi0gICAgICogdGFyZ2V0IGJ5dGUgYXJyYXkuCisgICAgICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBzb3VyY2UgYnl0ZSBhcnJheSBhbmQgcmV0dXJucyBpdCBhcyBhbgorICAgICAqIGludGVnZXIgaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyNTUuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlCisgICAgICogYXJyYXkgaGFzIGJlZW4gcmVhY2hlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB7CkBAIC0xNDAsMzAgKzE2NSw0NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+bGVuPC9jb2RlPiBieXRlcyBmcm9tIHRoaXMgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYW5kCi0gICAgICogc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheSA8Y29kZT5iPC9jb2RlPiBzdGFydGluZyBhdCBvZmZzZXQKLSAgICAgKiA8Y29kZT5vZmY8L2NvZGU+LiBBbnN3ZXIgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIG5vCi0gICAgICogYnl0ZXMgd2VyZSByZWFkIGFuZCBlbmQgb2Ygc3RyZWFtIHdhcyBlbmNvdW50ZXJlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgotICAgICAqIHJlYWRzIGJ5dGVzIGZyb20gdGhlIHRhcmdldCBieXRlIGFycmF5LgorICAgICAqIFJlYWRzIGF0IG1vc3Qge0Bjb2RlIGxlbn0gYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzCisgICAgICogdGhlbSBpbiBieXRlIGFycmF5IHtAY29kZSBifSBzdGFydGluZyBhdCB7QGNvZGUgb2Zmc2V0fS4gVGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIHJlYWRzIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBieXRlIGFycmF5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBiCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YjwvY29kZT4gdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYn0gdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQgZnJvbQorICAgICAqICAgICAgICAgICAgdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIDxjb2RlPmI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ9LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQKKyAgICAgKiAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYn0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBifSBpcyBudWxsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGlmIChiID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGIubGVuZ3RoIHx8IGxlbmd0aCA8IDAKLSAgICAgICAgICAgICAgICB8fCBsZW5ndGggPiBiLmxlbmd0aCAtIG9mZnNldCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gcmVtb3ZlZCByZWR1bmRhbnQgY2hlY2ssIHVzZWQgKG9mZnNldCB8IGxlbmd0aCkgPCAwIGluc3RlYWQgb2YKKyAgICAgICAgLy8gKG9mZnNldCA8IDApIHx8IChsZW5ndGggPCAwKSB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKChvZmZzZXQgfCBsZW5ndGgpIDwgMCB8fCBsZW5ndGggPiBiLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwMmYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIC8vIEFyZSB0aGVyZSBhbnkgYnl0ZXMgYXZhaWxhYmxlPwogICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5jb3VudCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTc5LDEwICsyMTksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCB0aGlzIEJ5dGVBcnJheUlucHV0U3RyZWFtIHRvIHRoZSBsYXN0IG1hcmtlZCBsb2NhdGlvbi4gVGhpcwotICAgICAqIGltcGxlbWVudGF0aW9uIHJlc2V0cyB0aGUgcG9zaXRpb24gdG8gZWl0aGVyIHRoZSBtYXJrZWQgcG9zaXRpb24sIHRoZQotICAgICAqIHN0YXJ0IHBvc2l0aW9uIHN1cHBsaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvciA8Y29kZT4wPC9jb2RlPiBpZiBuZWl0aGVyCi0gICAgICogaXMgcHJvdmlkZWQuCisgICAgICogUmVzZXRzIHRoaXMgc3RyZWFtIHRvIHRoZSBsYXN0IG1hcmtlZCBsb2NhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJlc2V0cyB0aGUgcG9zaXRpb24gdG8gZWl0aGVyIHRoZSBtYXJrZWQgcG9zaXRpb24sIHRoZSBzdGFydCBwb3NpdGlvbgorICAgICAqIHN1cHBsaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvciAwIGlmIG5laXRoZXIgaGFzIGJlZW4gcHJvdmlkZWQuCisgICAgICogCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewpAQCAtMTkwLDE0ICsyMzIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTa2lwcyA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgSW5wdXRTdHJlYW0uCi0gICAgICogU3Vic2VxdWVudCA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzIHVubGVzcwotICAgICAqIDxjb2RlPnJlc2V0KCk8L2NvZGU+IGlzIHVzZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gc2tpcHMKLSAgICAgKiA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIFNraXBzIHtAY29kZSBjb3VudH0gbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgSW5wdXRTdHJlYW0uIFN1YnNlcXVlbnQKKyAgICAgKiB7QGNvZGUgcmVhZCgpfXMgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzIHVubGVzcyB7QGNvZGUgcmVzZXQoKX0gaXMKKyAgICAgKiB1c2VkLiBUaGlzIGltcGxlbWVudGF0aW9uIHNraXBzIHtAY29kZSBjb3VudH0gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgICAqIHRhcmdldCBzdHJlYW0uIEl0IGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyAwIGlmIHtAY29kZSBufSBpcyBuZWdhdGl2ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbgogICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBza2lwcGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBza2lwKGxvbmcgbikgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlOGNlZTk2Li44YzZmYTA1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjAsMjggKzIwLDM2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGlzIGEgY2xhc3Mgd2hvc2UgdW5kZXJseWluZyBzdHJlYW0gaXMgcmVwcmVzZW50ZWQgYnkgYQotICogYnl0ZSBhcnJheS4gQXMgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhpcyBzdHJlYW0sIHRoZSBsb2NhbCBieXRlIGFycmF5IG1heSBiZQotICogZXhwYW5kZWQgdG8gaG9sZCBtb3JlIGJ5dGVzLgorICogQSBzcGVjaWFsaXplZCB7QGxpbmsgT3V0cHV0U3RyZWFtfSBmb3IgY2xhc3MgZm9yIHdyaXRpbmcgY29udGVudCB0byBhbgorICogKGludGVybmFsKSBieXRlIGFycmF5LiBBcyBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGlzIHN0cmVhbSwgdGhlIGJ5dGUgYXJyYXkKKyAqIG1heSBiZSBleHBhbmRlZCB0byBob2xkIG1vcmUgYnl0ZXMuIFdoZW4gdGhlIHdyaXRpbmcgaXMgY29uc2lkZXJlZCB0byBiZQorICogZmluaXNoZWQsIGEgY29weSBvZiB0aGUgYnl0ZSBhcnJheSBjYW4gYmUgcmVxdWVzdGVkIGZyb20gdGhlIGNsYXNzLgogICogCiAgKiBAc2VlIEJ5dGVBcnJheUlucHV0U3RyZWFtCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKICAgICAvKioKICAgICAgKiBUaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBieXRlcyB3cml0dGVuLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBieXRlW10gYnVmOwogCiAgICAgLyoqCiAgICAgICogVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgY291bnQ7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSB3aXRoIGEgZGVmYXVsdCBzaXplIG9mIDMyIGJ5dGVzLgogICAgICAqIElmIG1vcmUgdGhhbiAzMiBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGlzIGluc3RhbmNlLCB0aGUgdW5kZXJseWluZyBieXRlCi0gICAgICogYXJyYXkgd2lsbCBleHBhbmQgdG8gYWNjb21tb2RhdGUuCisgICAgICogYXJyYXkgd2lsbCBleHBhbmQuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTQ5LDE0ICs1NywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHdpdGggYSBkZWZhdWx0IHNpemUgb2YKLSAgICAgKiA8Y29kZT5zaXplPC9jb2RlPiBieXRlcy4gSWYgbW9yZSB0aGFuIDxjb2RlPnNpemU8L2NvZGU+IGJ5dGVzIGFyZQotICAgICAqIHdyaXR0ZW4gdG8gdGhpcyBpbnN0YW5jZSwgdGhlIHVuZGVybHlpbmcgYnl0ZSBhcnJheSB3aWxsIGV4cGFuZCB0bwotICAgICAqIGFjY29tbW9kYXRlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ5dGVBcnJheU91dHB1dFN0cmVhbX0gd2l0aCBhIGRlZmF1bHQgc2l6ZSBvZgorICAgICAqIHtAY29kZSBzaXplfSBieXRlcy4gSWYgbW9yZSB0aGFuIHtAY29kZSBzaXplfSBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGlzCisgICAgICogaW5zdGFuY2UsIHRoZSB1bmRlcmx5aW5nIGJ5dGUgYXJyYXkgd2lsbCBleHBhbmQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIGFuIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgaW5pdGlhbCBzaXplIGZvciB0aGUKLSAgICAgKiAgICAgICAgICAgIHVuZGVybHlpbmcgYnl0ZSBhcnJheS4KKyAgICAgKiAgICAgICAgICAgIGluaXRpYWwgc2l6ZSBmb3IgdGhlIHVuZGVybHlpbmcgYnl0ZSBhcnJheSwgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgbm9uLW5lZ2F0aXZlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNpemV9IDwgMC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC02OCwxMSArNzgsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIEJ5dGVBcnJheU91dHB1dFN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZWxlYXNlcyBTeXN0ZW0KLSAgICAgKiByZXNvdXJjZXMgdXNlZCBmb3IgdGhpcyBzdHJlYW0uCisgICAgICogQ2xvc2VzIHRoaXMgc3RyZWFtLiBUaGlzIHJlbGVhc2VzIHN5c3RlbSByZXNvdXJjZXMgdXNlZCBmb3IgdGhpcyBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgT3V0cHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTk2LDMwICsxMDYsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCB0aGlzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmRlcmx5aW5nIGJ5dGUKLSAgICAgKiBhcnJheS4gQWxsIHN1YnNlcXVlbnQgd3JpdGVzIHdpbGwgb3ZlcndyaXRlIGFueSBieXRlcyBwcmV2aW91c2x5IHN0b3JlZAotICAgICAqIGluIHRoaXMgc3RyZWFtLgorICAgICAqIFJlc2V0cyB0aGlzIHN0cmVhbSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmRlcmx5aW5nIGJ5dGUgYXJyYXkuIEFsbAorICAgICAqIHN1YnNlcXVlbnQgd3JpdGVzIHdpbGwgb3ZlcndyaXRlIGFueSBieXRlcyBwcmV2aW91c2x5IHN0b3JlZCBpbiB0aGlzCisgICAgICogc3RyZWFtLgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHsKICAgICAgICAgY291bnQgPSAwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoaXMgc3RyZWFtIHRodXMgZmFyLgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoaXMgc3RyZWFtIHNvIGZhci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGlzIFN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGNvbnRlbnRzIG9mIHRoaXMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFzIGEgYnl0ZSBhcnJheS4gQW55CisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXMgYSBieXRlIGFycmF5LiBBbnkKICAgICAgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHJlY2VpdmVyIGFmdGVyIHJldHVybmluZyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlCiAgICAgICogYnl0ZSBhcnJheSByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW1zIGN1cnJlbnQgY29udGVudHMgYXMgYSBieXRlIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0ncyBjdXJyZW50IGNvbnRlbnRzIGFzIGEgYnl0ZSBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKICAgICAgICAgYnl0ZVtdIG5ld0FycmF5ID0gbmV3IGJ5dGVbY291bnRdOwpAQCAtMTI4LDExICsxNDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGNvbnRlbnRzIG9mIHRoaXMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFzIGEgU3RyaW5nLiBBbnkKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcyBhIHN0cmluZy4gQW55CiAgICAgICogY2hhbmdlcyBtYWRlIHRvIHRoZSByZWNlaXZlciBhZnRlciByZXR1cm5pbmcgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZQotICAgICAqIFN0cmluZyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICAgICAqIHN0cmluZyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW1zIGN1cnJlbnQgY29udGVudHMgYXMgYSBTdHJpbmcuCisgICAgICogQHJldHVybiB0aGlzIHN0cmVhbSdzIGN1cnJlbnQgY29udGVudHMgYXMgYSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAKICAgICBAT3ZlcnJpZGUKQEAgLTE0MSwxOSArMTU1LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBjb250ZW50cyBvZiB0aGlzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcyBhIFN0cmluZy4gRWFjaCBieXRlCi0gICAgICogPGNvZGU+YjwvY29kZT4gaW4gdGhpcyBzdHJlYW0gaXMgY29udmVydGVkIHRvIGEgY2hhcmFjdGVyCi0gICAgICogPGNvZGU+YzwvY29kZT4gdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKLSAgICAgKiA8Y29kZT5jID09IChjaGFyKSgoKGhpYnl0ZSAmIDB4ZmYpIDw8IDgpIHwgKGIgJiAweGZmKSk8L2NvZGU+LiBUaGlzCi0gICAgICogbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIGVpdGhlciB7QGxpbmsgI3RvU3RyaW5nKCl9LCBvciB7QGxpbmsgI3RvU3RyaW5nKFN0cmluZyl9CisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXMgYSBzdHJpbmcuIEVhY2ggYnl0ZQorICAgICAqIHtAY29kZSBifSBpbiB0aGlzIHN0cmVhbSBpcyBjb252ZXJ0ZWQgdG8gYSBjaGFyYWN0ZXIge0Bjb2RlIGN9IHVzaW5nIHRoZQorICAgICAqIGZvbGxvd2luZyBmdW5jdGlvbjoKKyAgICAgKiB7QGNvZGUgYyA9PSAoY2hhcikoKChoaWJ5dGUgJiAweGZmKSA8PCA4KSB8IChiICYgMHhmZikpfS4gVGhpcyBtZXRob2QgaXMKKyAgICAgKiBkZXByZWNhdGVkIGFuZCBlaXRoZXIge0BsaW5rICN0b1N0cmluZygpfSBvciB7QGxpbmsgI3RvU3RyaW5nKFN0cmluZyl9CiAgICAgICogc2hvdWxkIGJlIHVzZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGhpYnl0ZQotICAgICAqICAgICAgICAgICAgdGhlIGhpZ2ggYnl0ZSBvZiBlYWNoIHJlc3VsdGluZyBVbmljb2RlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW1zIGN1cnJlbnQgY29udGVudHMgYXMgYSBTdHJpbmcgd2l0aCB0aGUgaGlnaCBieXRlIHNldAotICAgICAqICAgICAgICAgdG8gPGNvZGU+aGlieXRlPC9jb2RlPgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3RvU3RyaW5nKCl9CisgICAgICogICAgICAgICAgICB0aGUgaGlnaCBieXRlIG9mIGVhY2ggcmVzdWx0aW5nIFVuaWNvZGUgY2hhcmFjdGVyLgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0ncyBjdXJyZW50IGNvbnRlbnRzIGFzIGEgc3RyaW5nIHdpdGggdGhlIGhpZ2ggYnl0ZSBzZXQKKyAgICAgKiAgICAgICAgIHRvIHtAY29kZSBoaWJ5dGV9LgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3RvU3RyaW5nKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgaGlieXRlKSB7CkBAIC0xNjUsNDUgKzE3OSw1MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgY29udGVudHMgb2YgdGhpcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXMgYSBTdHJpbmcgY29udmVydGVkCi0gICAgICogdXNpbmcgdGhlIGVuY29kaW5nIGRlY2xhcmVkIGluIDxjb2RlPmVuYzwvY29kZT4uCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXMgYSBzdHJpbmcgY29udmVydGVkCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBkZWNsYXJlZCBpbiB7QGNvZGUgZW5jfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZW5jCi0gICAgICogICAgICAgICAgICBBIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVuY29kaW5nIHRvIHVzZSB3aGVuIHRyYW5zbGF0aW5nCi0gICAgICogICAgICAgICAgICB0aGlzIHN0cmVhbSB0byBhIFN0cmluZy4KLSAgICAgKiBAcmV0dXJuIHRoaXMgc3RyZWFtcyBjdXJyZW50IGNvbnRlbnRzIGFzIGEgU3RyaW5nLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB0cmFuc2xhdGluZworICAgICAqICAgICAgICAgICAgdGhpcyBzdHJlYW0gdG8gYSBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGlzIHN0cmVhbSdzIGN1cnJlbnQgY29udGVudHMgYXMgYW4gZW5jb2RlZCBzdHJpbmcuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgZGVjbGFyZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIGNvdW50LCBlbmMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gPGNvZGU+Ynl0ZXM8L2NvZGU+IGZyb20gdGhlIGJ5dGUgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT5pbmRleDwvY29kZT4gdG8gdGhlCi0gICAgICogQnl0ZUFycmF5T3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQKKyAgICAgKiBvZmZzZXQge0Bjb2RlIGluZGV4fSB0byB0aGlzIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbi4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmZmVyIHRvIGdldCBieXRlcworICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gcmV0cmlldmUgYnl0ZXMuCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBidWZmZXIgaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2Yge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgb2Zmc2V0IG9yIGNvdW50IGFyZSBvdXRzaWRlIG9mIGJvdW5kcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGxlbiA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBsZW59IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW4pIHsKICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggfHwgbGVuIDwgMAotICAgICAgICAgICAgICAgIHx8IGxlbiA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHJlbW92ZWQgcmVkdW5kYW50IGNoZWNrLCBtYWRlIGltcGxpY2l0IG51bGwgY2hlY2sgZXhwbGljaXQsCisgICAgICAgIC8vIHVzZWQgKG9mZnNldCB8IGxlbikgPCAwIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChsZW4gPCAwKQorICAgICAgICAvLyB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICBpZiAoKG9mZnNldCB8IGxlbikgPCAwIHx8IGxlbiA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAobGVuID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMjE1LDI5ICsyMzcsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBieXRlIDxjb2RlPm9uZUJ5dGU8L2NvZGU+IHRvIHRoZSBPdXRwdXRTdHJlYW0uCi0gICAgICogT25seSB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgPGNvZGU+b25lQnl0ZTwvY29kZT4gaXMgd3JpdHRlbi4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBieXRlIHtAY29kZSBvbmVCeXRlfSB0byB0aGUgT3V0cHV0U3RyZWFtLiBPbmx5IHRoZQorICAgICAqIGxvdyBvcmRlciBieXRlIG9mIHtAY29kZSBvbmVCeXRlfSBpcyB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvbmVCeXRlCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBiZSB3cml0dGVuLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShpbnQgb25lQnl0ZSkgewogICAgICAgICBpZiAoY291bnQgPT0gYnVmLmxlbmd0aCkgewogICAgICAgICAgICAgZXhwYW5kKDEpOwogICAgICAgICB9Ci0gICAgICAgIGJ1Zltjb3VudCsrXSA9IChieXRlKSBvbmVCeXRlOworICAgICAgICBidWZbY291bnQrK10gPSAoYnl0ZSlvbmVCeXRlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRha2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyZWFtIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIDxjb2RlPm91dDwvY29kZT4uCisgICAgICogVGFrZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyZWFtIGFuZCB3cml0ZXMgaXQgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKiB7QGNvZGUgb3V0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICBBbiBPdXRwdXRTdHJlYW0gb24gd2hpY2ggdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgYW4gT3V0cHV0U3RyZWFtIG9uIHdoaWNoIHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gd3JpdGluZyB0byBvdXRwdXQgc3RyZWFtCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8ge0Bjb2RlIG91dH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgY291bnQpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQ2hhckFycmF5UmVhZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIuamF2YQppbmRleCBiNjAwNmY2Li5hNTZjODY4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIuamF2YQpAQCAtMjAsMzggKzIwLDQ5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogQ2hhckFycmF5UmVhZGVyIGlzIHVzZWQgYXMgYSBidWZmZXJlZCBjaGFyYWN0ZXIgaW5wdXQgc3RyZWFtIG9uIGEgY2hhcmFjdGVyCi0gKiBhcnJheS4KKyAqIEEgc3BlY2lhbGl6ZWQge0BsaW5rIFJlYWRlcn0gZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgY2hhciBhcnJheS4KKyAqIAorICogQHNlZSBDaGFyQXJyYXlXcml0ZXIKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDaGFyQXJyYXlSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewogICAgIC8qKgotICAgICAqIEJ1ZmZlciBmb3IgY2hhcmFjdGVycworICAgICAqIFRoZSBidWZmZXIgZm9yIGNoYXJhY3RlcnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wIAogICAgICAqLwogICAgIHByb3RlY3RlZCBjaGFyIGJ1ZltdOwogCiAgICAgLyoqCi0gICAgICogQ3VycmVudCBidWZmZXIgcG9zaXRpb24uCisgICAgICogVGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMCAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHBvczsKIAogICAgIC8qKgotICAgICAqIEN1cnJlbnQgbWFyayBwb3NpdGlvbi4KKyAgICAgKiBUaGUgY3VycmVudCBtYXJrIHBvc2l0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbWFya2VkUG9zID0gLTE7CiAKICAgICAvKioKICAgICAgKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBjb3VudDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIENoYXJBcnJheVJlYWRlciBvbiB0aGUgY2hhciBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+LiBUaGUKLSAgICAgKiBzaXplIG9mIHRoZSByZWFkZXIgaXMgc2V0IHRvIHRoZSA8Y29kZT5sZW5ndGgoKTwvY29kZT4gb2YgdGhlIGJ1ZmZlcgotICAgICAqIGFuZCB0aGUgT2JqZWN0IHRvIHN5bmNocm9uaXplIGFjY2VzcyB0aHJvdWdoIGlzIHNldCB0bwotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIENoYXJBcnJheVJlYWRlciBvbiB0aGUgY2hhciBhcnJheSB7QGNvZGUgYnVmfS4gVGhlIHNpemUgb2YKKyAgICAgKiB0aGUgcmVhZGVyIGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgYW5kIHRoZSBvYmplY3QgdG8gdG8gcmVhZAorICAgICAqIGZyb20gaXMgc2V0IHRvIHtAY29kZSBidWZ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHRvIGZpbHRlciByZWFkcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IGZyb20gd2hpY2ggdG8gcmVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2hhckFycmF5UmVhZGVyKGNoYXJbXSBidWYpIHsKICAgICAgICAgc3VwZXIoYnVmKTsKQEAgLTYwLDIzICs3MSwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIENoYXJBcnJheVJlYWRlciBvbiB0aGUgY2hhciBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+LiBUaGUKLSAgICAgKiBzaXplIG9mIHRoZSByZWFkZXIgaXMgc2V0IHRvIHRoZSBwYXJhbWV0ZXIgPGNvZGU+bGVuZ3RoKCk8L2NvZGU+IGFuZAotICAgICAqIHRoZSBvcmlnaW5hbCBvZmZzZXQgaXMgc2V0IHRvIDxjb2RlPm9mZnNldDwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIENoYXJBcnJheVJlYWRlciBvbiB0aGUgY2hhciBhcnJheSB7QGNvZGUgYnVmfS4gVGhlIHNpemUgb2YKKyAgICAgKiB0aGUgcmVhZGVyIGlzIHNldCB0byB7QGNvZGUgbGVuZ3RofSBhbmQgdGhlIHN0YXJ0IHBvc2l0aW9uIGZyb20gd2hpY2ggdG8KKyAgICAgKiByZWFkIHRoZSBidWZmZXIgaXMgc2V0IHRvIHtAY29kZSBvZmZzZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHRvIGZpbHRlciByZWFkcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IGZyb20gd2hpY2ggdG8gcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIDxjb2RlPmJ1ZjwvY29kZT4gdG8gc3RhcnQgc3RyZWFtaW5nIGF0LgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4ge0Bjb2RlIGJ1Zn0gdG8gcmVhZC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIHN0cmVhbSBvdmVyLgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB7QGNvZGUgYnVmfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuZ3RoIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHtAY29kZSBidWZ9IC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLQogICAgIHB1YmxpYyBDaGFyQXJyYXlSZWFkZXIoY2hhcltdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgICAgICBzdXBlcihidWYpOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWYubGVuZ3RoIHx8IGxlbmd0aCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIG1hZGUgaW1wbGljaXQgbnVsbCBjaGVjayBleHBsaWNpdCwKKyAgICAgICAgLy8gcmVtb3ZlZCByZWR1bmRhbnQgY2hlY2ssIHVzZWQgKG9mZnNldCB8IGxlbmd0aCkgPCAwIGluc3RlYWQgb2YgCisgICAgICAgIC8vIChvZmZzZXQgPCAwKSB8fCAobGVuZ3RoIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmIChidWYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgaWYgKChvZmZzZXQgfCBsZW5ndGgpIDwgMCB8fCBvZmZzZXQgPiBidWYubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjsKICAgICAgICAgdGhpcy5wb3MgPSBvZmZzZXQ7CiAKQEAgLTg4LDYgKzExMiw4IEBACiAgICAgICogVGhpcyBtZXRob2QgY2xvc2VzIHRoaXMgQ2hhckFycmF5UmVhZGVyLiBPbmNlIGl0IGlzIGNsb3NlZCwgeW91IGNhbiBubwogICAgICAqIGxvbmdlciByZWFkIGZyb20gaXQuIE9ubHkgdGhlIGZpcnN0IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QgaGFzIGFueQogICAgICAqIGVmZmVjdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKQEAgLTk5LDM3ICsxMjUsMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBDaGFyQXJyYXlSZWFkZXIgaXMgb3Blbi4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHJlYWRlciBpcyBvcGVuLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlYWRlciBpcyBvcGVuLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVhZGVyIGlzIG9wZW4sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc09wZW4oKSB7CiAgICAgICAgIHJldHVybiBidWYgIT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBDaGFyQXJyYXlSZWFkZXIgaXMKLSAgICAgKiBjbG9zZWQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlYWRlciBpcyBjbG9zZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSByZWFkZXIgaXMgY2xvc2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQoKSB7CiAgICAgICAgIHJldHVybiBidWYgPT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBNYXJrIHBvc2l0aW9uIGluIHRoaXMgUmVhZGVyLiBUaGUgcGFyYW1ldGVyIDxjb2RlPnJlYWRMaW1pdDwvY29kZT4KLSAgICAgKiBpcyBpZ25vcmVkIGZvciBDaGFyQXJyYXlSZWFkZXJzLiBTZW5kaW5nIHJlc2V0KCkgd2lsbCByZXBvc2l0aW9uIHRoZQorICAgICAqIFNldHMgYSBtYXJrIHBvc2l0aW9uIGluIHRoaXMgcmVhZGVyLiBUaGUgcGFyYW1ldGVyIHtAY29kZSByZWFkTGltaXR9IGlzCisgICAgICogaWdub3JlZCBmb3IgQ2hhckFycmF5UmVhZGVycy4gQ2FsbGluZyB7QGNvZGUgcmVzZXQoKX0gd2lsbCByZXBvc2l0aW9uIHRoZQogICAgICAqIHJlYWRlciBiYWNrIHRvIHRoZSBtYXJrZWQgcG9zaXRpb24gcHJvdmlkZWQgdGhlIG1hcmsgaGFzIG5vdCBiZWVuCiAgICAgICogaW52YWxpZGF0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRMaW1pdAogICAgICAqICAgICAgICAgICAgaWdub3JlZCBmb3IgQ2hhckFycmF5UmVhZGVycy4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gbWFyayB0aGlzIENoYXJBcnJheVJlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTQyLDEwICsxNjUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgQ2hhckFycmF5UmVhZGVyIHN1cHBvcnRzCi0gICAgICogbWFyaygpIGFuZCByZXNldCgpLiBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIHN1cHBvcnRzIHRoZSB7QGNvZGUgbWFyaygpfSBhbmQKKyAgICAgKiB7QGNvZGUgcmVzZXQoKX0gbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBtYXJrKCkgYW5kIHJlc2V0KCkgYXJlIHN1cHBvcnRlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBmb3IgQ2hhckFycmF5UmVhZGVyLgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewpAQCAtMTUzLDE0ICsxNzksMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGlzIENoYXJBcnJheVJlYWRlciBhbmQgcmV0dXJucyB0aGUgcmVzdWx0Ci0gICAgICogYXMgYW4gaW50LiBUaGUgMiBoaWdoZXItb3JkZXIgYnl0ZXMgYXJlIHNldCB0byAwLiBJZiB0aGUgZW5kIG9mIHJlYWRlcgotICAgICAqIHdhcyBlbmNvdW50ZXJlZCB0aGVuIHJldHVybiAtMS4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGlzIHJlYWRlciBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyCisgICAgICogd2l0aCB0aGUgdHdvIGhpZ2hlci1vcmRlciBieXRlcyBzZXQgdG8gMC4gUmV0dXJucyAtMSBpZiBubyBtb3JlCisgICAgICogY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlIGZyb20gdGhpcyByZWFkZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIGNoYXJhY3RlciByZWFkIG9yIC0xIGlmIGVuZCBvZiByZWFkZXIuCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHJlYWQgYXMgYW4gaW50IG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHJlYWRlciBoYXMKKyAgICAgKiAgICAgICAgIGJlZW4gcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIENoYXJBcnJheVJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE3NiwzMCArMjAzLDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gY2hhcmFjdGVycyBmcm9tIHRoaXMgQ2hhckFycmF5UmVhZGVyCi0gICAgICogYW5kIHN0b3JlcyB0aGVtIGF0IDxjb2RlPm9mZnNldDwvY29kZT4gaW4gdGhlIGNoYXJhY3RlciBhcnJheQotICAgICAqIDxjb2RlPmJ1ZjwvY29kZT4uIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEKLSAgICAgKiBpZiB0aGUgZW5kIG9mIHJlYWRlciB3YXMgZW5jb3VudGVyZWQuCi0gICAgICogCisgICAgICogUmVhZHMgYXQgbW9zdCB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgZnJvbSB0aGlzIENoYXJBcnJheVJlYWRlciBhbmQKKyAgICAgKiBzdG9yZXMgdGhlbSBhdCB7QGNvZGUgb2Zmc2V0fSBpbiB0aGUgY2hhcmFjdGVyIGFycmF5IHtAY29kZSBidWZ9LgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiByZWFkZXIKKyAgICAgKiB3YXMgZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyIGFycmF5IHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gc3RvcmUgdGhlIGNoYXJhY3RlcnMgcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmIHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICByZWFkIGZyb20gdGhpcyByZWFkZXIuCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIG9yIC0xIGlmIGVuZCBvZiByZWFkZXIuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSByZWFkZXIgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgIHJlYWNoZWQuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGxlbiA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBsZW59IGlzIGJpZ2dlciB0aGFuIHRoZSBzaXplIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1ZmZlcn0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBDaGFyQXJyYXlSZWFkZXIgaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoY2hhciBidWZmZXJbXSwgaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgaW50IHJlYWQoY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3cKLSAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCB8fCBsZW4gPCAwCi0gICAgICAgICAgICAgICAgfHwgbGVuID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LAorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgdXNlZCAob2Zmc2V0IHwgbGVuKSA8IDAgaW5zdGVhZCBvZgorICAgICAgICAvLyAob2Zmc2V0IDwgMCkgfHwgKGxlbiA8IDApIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuKSA8IDAgfHwgbGVuID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CiAgICAgICAgICAgICBpZiAoaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA2MCIpKTsgLy8kTk9OLU5MUy0xJApAQCAtMjE1LDE5ICsyNTksMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGlzCi0gICAgICogQ2hhckFycmF5UmVhZGVyIGlzIHJlYWR5IHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4gSWYgdGhlIHJlc3VsdCBpcwotICAgICAqIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgbmV4dCA8Y29kZT5yZWFkKCk8L2NvZGU+IHdpbGwgbm90IGJsb2NrLiBJZgotICAgICAqIHRoZSByZXN1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoaXMgUmVhZGVyIG1heSBvciBtYXkgbm90IGJsb2NrIHdoZW4KLSAgICAgKiA8Y29kZT5yZWFkKCk8L2NvZGU+IGlzIHNlbnQuIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiBDaGFyQXJyYXlSZWFkZXIKLSAgICAgKiBhbHdheXMgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBldmVuIHdoZW4gaXQgaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIGlzIHJlYWR5IHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV4dCB7QGNvZGUgcmVhZH0gd2lsbCBub3QgYmxvY2suIFJldHVybnMKKyAgICAgKiB7QGNvZGUgZmFsc2V9IGlmIHRoaXMgcmVhZGVyIG1heSBvciBtYXkgbm90IGJsb2NrIHdoZW4ge0Bjb2RlIHJlYWR9IGlzCisgICAgICogY2FsbGVkLiBUaGUgaW1wbGVtZW50YXRpb24gaW4gQ2hhckFycmF5UmVhZGVyIGFsd2F5cyByZXR1cm5zIHtAY29kZSB0cnVlfQorICAgICAqIGV2ZW4gd2hlbiBpdCBoYXMgYmVlbiBjbG9zZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIgd2lsbCBub3QgYmxvY2sgd2hlbgotICAgICAqICAgICAgICAgPGNvZGU+cmVhZCgpPC9jb2RlPiBpcyBjYWxsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB1bmtub3duCi0gICAgICogICAgICAgICBvciBibG9ja2luZyB3aWxsIG9jY3VyLgotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcmVhZGVyIHdpbGwgbm90IGJsb2NrIHdoZW4ge0Bjb2RlIHJlYWR9IGlzCisgICAgICogICAgICAgICBjYWxsZWQsIHtAY29kZSBmYWxzZX0gaWYgdW5rbm93biBvciBibG9ja2luZyB3aWxsIG9jY3VyLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgQ2hhckFycmF5UmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjQwLDEzICsyODIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCB0aGlzIENoYXJBcnJheVJlYWRlcidzIHBvc2l0aW9uIHRvIHRoZSBsYXN0IDxjb2RlPm1hcmsoKTwvY29kZT4KLSAgICAgKiBsb2NhdGlvbi4gSW52b2NhdGlvbnMgb2YgPGNvZGU+cmVhZCgpL3NraXAoKTwvY29kZT4gd2lsbCBvY2N1ciBmcm9tCi0gICAgICogdGhpcyBuZXcgbG9jYXRpb24uIElmIHRoaXMgUmVhZGVyIHdhcyBub3QgbWFya2VkLCB0aGUgQ2hhckFycmF5UmVhZGVyIGlzCi0gICAgICogcmVzZXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgU3RyaW5nLgorICAgICAqIFJlc2V0cyB0aGlzIHJlYWRlcidzIHBvc2l0aW9uIHRvIHRoZSBsYXN0IHtAY29kZSBtYXJrKCl9IGxvY2F0aW9uLgorICAgICAqIEludm9jYXRpb25zIG9mIHtAY29kZSByZWFkKCl9IGFuZCB7QGNvZGUgc2tpcCgpfSB3aWxsIG9jY3VyIGZyb20gdGhpcyBuZXcKKyAgICAgKiBsb2NhdGlvbi4gSWYgdGhpcyByZWFkZXIgaGFzIG5vdCBiZWVuIG1hcmtlZCwgaXQgaXMgcmVzZXQgdG8gdGhlCisgICAgICogYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgQ2hhckFycmF5UmVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yNTksMTYgKzMwMiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGlzIENoYXJBcnJheVJlYWRlci4KLSAgICAgKiBTdWJzZXF1ZW50IDxjb2RlPnJlYWQoKTwvY29kZT4ncyB3aWxsIG5vdCByZXR1cm4gdGhlc2UgY2hhcmFjdGVycwotICAgICAqIHVubGVzcyA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLgorICAgICAqIFNraXBzIHtAY29kZSBjb3VudH0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyByZWFkZXIuIFN1YnNlcXVlbnQKKyAgICAgKiB7QGNvZGUgcmVhZCgpfXMgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGNoYXJhY3RlcnMgdW5sZXNzIHtAY29kZSByZXNldCgpfQorICAgICAqIGlzIHVzZWQuIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyAwIGlmIHtAY29kZSBufSBpcyBuZWdhdGl2ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbgotICAgICAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAuCi0gICAgICogQHJldHVybiBsb25nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBza2lwcGVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBDaGFyQXJyYXlSZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQ2hhckFycmF5V3JpdGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9DaGFyQXJyYXlXcml0ZXIuamF2YQppbmRleCAxZmFkYjlkLi43ZTU4YjJiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9DaGFyQXJyYXlXcml0ZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9DaGFyQXJyYXlXcml0ZXIuamF2YQpAQCAtMjAsMjYgKzIwLDM3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogQ2hhckFycmF5V3JpdGVyIGlzIHVzZWQgYXMgYSBjaGFyYWN0ZXIgb3V0cHV0IHN0cmVhbSBvbiBhIGNoYXJhY3RlciBhcnJheS4KLSAqIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgd3JpdHRlbiBjaGFyYWN0ZXJzIHdpbGwgZ3JvdyBhcyBuZWVkZWQgdG8KLSAqIGFjY29tbW9kYXRlIG1vcmUgY2hhcmFjdGVycyBhcyB0aGV5IGFyZSB3cml0dGVuLgorICogQSBzcGVjaWFsaXplZCB7QGxpbmsgV3JpdGVyfSBmb3IgY2xhc3MgZm9yIHdyaXRpbmcgY29udGVudCB0byBhbiAoaW50ZXJuYWwpCisgKiBjaGFyIGFycmF5LiBBcyBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGlzIHdyaXRlciwgdGhlIGNoYXIgYXJyYXkgbWF5IGJlCisgKiBleHBhbmRlZCB0byBob2xkIG1vcmUgY2hhcmFjdGVycy4gV2hlbiB0aGUgd3JpdGluZyBpcyBjb25zaWRlcmVkIHRvIGJlCisgKiBmaW5pc2hlZCwgYSBjb3B5IG9mIHRoZSBjaGFyIGFycmF5IGNhbiBiZSByZXF1ZXN0ZWQgZnJvbSB0aGUgY2xhc3MuCisgKiAKKyAqIEBzZWUgQ2hhckFycmF5UmVhZGVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2hhckFycmF5V3JpdGVyIGV4dGVuZHMgV3JpdGVyIHsKIAogICAgIC8qKgotICAgICAqIEJ1ZmZlciBmb3IgY2hhcmFjdGVycworICAgICAqIFRoZSBidWZmZXIgZm9yIGNoYXJhY3RlcnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGNoYXJbXSBidWY7CiAKICAgICAvKioKICAgICAgKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSBidWZmZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBjb3VudDsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQ2hhckFycmF5V3JpdGVyIHdoaWNoIGhhcyBhIGJ1ZmZlciBhbGxvY2F0ZWQgd2l0aCB0aGUKLSAgICAgKiBkZWZhdWx0IHNpemUgb2YgMzIgY2hhcmFjdGVycy4gVGhlIGJ1ZmZlciBpcyBhbHNvIHRoZSA8Y29kZT5sb2NrPC9jb2RlPgotICAgICAqIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoaXMgV3JpdGVyLgorICAgICAqIGRlZmF1bHQgc2l6ZSBvZiAzMiBjaGFyYWN0ZXJzLiBUaGlzIGJ1ZmZlciBpcyBhbHNvIHVzZWQgYXMgdGhlCisgICAgICoge0Bjb2RlIGxvY2t9IHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGlzIHdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2hhckFycmF5V3JpdGVyKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtNDksMTEgKzYwLDE0IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IENoYXJBcnJheVdyaXRlciB3aGljaCBoYXMgYSBidWZmZXIgYWxsb2NhdGVkIHdpdGggdGhlCi0gICAgICogc2l6ZSBvZiA8Y29kZT5pbml0aWFsU2l6ZTwvY29kZT4gY2hhcmFjdGVycy4gVGhlIGJ1ZmZlciBpcyBhbHNvIHRoZQotICAgICAqIDxjb2RlPmxvY2s8L2NvZGU+IHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoaXMgV3JpdGVyLgorICAgICAqIHNpemUgb2Yge0Bjb2RlIGluaXRpYWxTaXplfSBjaGFyYWN0ZXJzLiBUaGUgYnVmZmVyIGlzIGFsc28gdXNlZCBhcyB0aGUKKyAgICAgKiB7QGNvZGUgbG9ja30gdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoaXMgd3JpdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbml0aWFsU2l6ZQogICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGlzIENoYXJBcnJheVdyaXRlcnMgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluaXRpYWxTaXplIDwgMH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoYXJBcnJheVdyaXRlcihpbnQgaW5pdGlhbFNpemUpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTY1LDggKzc5LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIFdyaXRlci4gVGhpcyBpcyB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZWQuIFRoaXMKLSAgICAgKiBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgICAgKiBDbG9zZXMgdGhpcyB3cml0ZXIuIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiBDaGFyQXJyYXlXcml0ZXIgZG9lcyBub3RoaW5nLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewpAQCAtODUsOCArMTAwLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGbHVzaCB0aGlzIFdyaXRlci4gVGhpcyBpcyB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZWQuIFRoaXMKLSAgICAgKiBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgICAgKiBGbHVzaGVzIHRoaXMgd3JpdGVyLiBUaGUgaW1wbGVtZW50YXRpb24gaW4gQ2hhckFycmF5V3JpdGVyIGRvZXMgbm90aGluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKQEAgLTk0LDkgKzExMCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgV3JpdGVyLiBUaGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiBpcyByZXNldCB0byB0aGUgYmVnaW5uaW5nCisgICAgICogUmVzZXRzIHRoaXMgd3JpdGVyLiBUaGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiBpcyByZXNldCB0byB0aGUgYmVnaW5uaW5nCiAgICAgICogb2YgdGhlIGJ1ZmZlci4gQWxsIHdyaXR0ZW4gY2hhcmFjdGVycyBhcmUgbG9zdCBhbmQgdGhlIHNpemUgb2YgdGhpcwotICAgICAqIHdyaXRlciBpcyBub3cgMC4KKyAgICAgKiB3cml0ZXIgaXMgc2V0IHRvIDAuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtMTA1LDEwICsxMjMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHNpemUgb2YgdGhpcyBXcml0ZXIgaW4gY2hhcmFjdGVycy4gVGhpcyBudW1iZXIgY2hhbmdlcyBpZiB0aGlzCi0gICAgICogV3JpdGVyIGlzIHJlc2V0IG9yIGFzIG1vcmUgY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0byBpdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgd3JpdGVyLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpdAorICAgICAqIHN0b3Jlcy4gVGhpcyBudW1iZXIgY2hhbmdlcyBpZiB0aGlzIHdyaXRlciBpcyByZXNldCBvciB3aGVuIG1vcmUKKyAgICAgKiBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRvIGl0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoaXMgQ2hhckFycmF5V3JpdGVycyBjdXJyZW50IHNpemUgaW4gY2hhcmFjdGVycy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgQ2hhckFycmF5V3JpdGVyJ3MgY3VycmVudCBzaXplIGluIGNoYXJhY3RlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKQEAgLTExNywxMSArMTM3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBjb250ZW50cyBvZiB0aGUgcmVjZWl2ZXIgYXMgYSBjaGFyIGFycmF5LiBUaGUgYXJyYXkgcmV0dXJuZWQKLSAgICAgKiBpcyBhIGNvcHkgYW5kIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhpcyBXcml0ZXIgYWZ0ZXIgYXJlIG5vdAotICAgICAqIHJlZmxlY3RlZCBpbiB0aGUgcmVzdWx0LgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlciBhcyBhIGNoYXIgYXJyYXkuIFRoZSBhcnJheSByZXR1cm5lZAorICAgICAqIGlzIGEgY29weSBhbmQgYW55IG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGlzIHdyaXRlciBhZnRlciBjYWxsaW5nIHRoaXMKKyAgICAgKiBtZXRob2QgYXJlIG5vdCByZWZsZWN0ZWQgaW4gdGhlIHJlc3VsdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNoYXJbXSB0aGlzIENoYXJBcnJheVdyaXRlcnMgY29udGVudHMgYXMgYSBuZXcgY2hhciBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgQ2hhckFycmF5V3JpdGVyJ3MgY29udGVudHMgYXMgYSBuZXcgY2hhciBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgY2hhcltdIHRvQ2hhckFycmF5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKQEAgLTEzMiwxMSArMTUzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBjb250ZW50cyBvZiB0aGlzIENoYXJBcnJheVdyaXRlciBhcyBhIFN0cmluZy4gVGhlIFN0cmluZwotICAgICAqIHJldHVybmVkIGlzIGEgY29weSBhbmQgYW55IG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGlzIFdyaXRlciBhZnRlciBhcmUKLSAgICAgKiBub3QgcmVmbGVjdGVkIGluIHRoZSByZXN1bHQuCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBDaGFyQXJyYXlXcml0ZXIgYXMgYSBzdHJpbmcuIFRoZSBzdHJpbmcKKyAgICAgKiByZXR1cm5lZCBpcyBhIGNvcHkgYW5kIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhpcyB3cml0ZXIgYWZ0ZXIKKyAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kIGFyZSBub3QgcmVmbGVjdGVkIGluIHRoZSByZXN1bHQuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhpcyBDaGFyQXJyYXlXcml0ZXJzIGNvbnRlbnRzIGFzIGEgbmV3IFN0cmluZy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgQ2hhckFycmF5V3JpdGVycyBjb250ZW50cyBhcyBhIG5ldyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTE0NiwyMyArMTY4LDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmNvdW50PC9jb2RlPiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IDxjb2RlPm9mZnNldDwvY29kZT4KLSAgICAgKiBpbiA8Y29kZT5idWY8L2NvZGU+IHRvIHRoaXMgQ2hhckFycmF5V3JpdGVyLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQge0Bjb2RlIG9mZnNldH0gaW4ge0Bjb2RlIGN9CisgICAgICogdG8gdGhpcyB3cml0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKICAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBhcnJheSBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZiB0byByZXRyaWV2ZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB7QGNvZGUgYnVmfSB0byB3cml0ZS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCisgICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbn0gaXMgYmlnZ2VyIHRoYW4gdGhlIHNpemUgb2Yge0Bjb2RlIGN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBjLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CiAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBjLmxlbmd0aCB8fCBsZW4gPCAwCi0gICAgICAgICAgICAgICAgfHwgbGVuID4gYy5sZW5ndGggLSBvZmZzZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyBtYWRlIGltcGxpY2l0IG51bGwgY2hlY2sgZXhwbGljaXQsCisgICAgICAgIC8vIHJlbW92ZWQgcmVkdW5kYW50IGNoZWNrLAorICAgICAgICAvLyBhZGRlZCBudWxsIGNoZWNrLCB1c2VkIChvZmZzZXQgfCBsZW4pIDwgMCBpbnN0ZWFkIG9mCisgICAgICAgIC8vIChvZmZzZXQgPCAwKSB8fCAobGVuIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuKSA8IDAgfHwgbGVuID4gYy5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKICAgICAgICAgICAgIGV4cGFuZChsZW4pOwogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjLCBvZmZzZXQsIHRoaXMuYnVmLCB0aGlzLmNvdW50LCBsZW4pOwpAQCAtMTcxLDEyICsyMDcsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgPGNvZGU+b25lQ2hhcjwvY29kZT4gdG8gdGhpcwotICAgICAqIENoYXJBcnJheVdyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIGxvdyBvcmRlciB0d28gYnl0ZXMgdG8KLSAgICAgKiB0aGUgU3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB7QGNvZGUgb25lQ2hhcn0gdG8gdGhpcyB3cml0ZXIuCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIHR3byBsb3cgb3JkZXIgYnl0ZXMgb2YgdGhlIGludGVnZXIKKyAgICAgKiB7QGNvZGUgb25lQ2hhcn0gdG8gdGhlIGJ1ZmZlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQ2hhcgotICAgICAqICAgICAgICAgICAgVGhlIGNoYXJhY3RlciB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byB3cml0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgb25lQ2hhcikgewpAQCAtMTg3LDE2ICsyMjQsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPiBmcm9tIHRoZSBTdHJpbmcgPGNvZGU+c3RyPC9jb2RlPiB0byB0aGlzCi0gICAgICogQ2hhckFycmF5V3JpdGVyLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9IGZyb20KKyAgICAgKiB0aGUgc3RyaW5nIHtAY29kZSBzdHJ9IHRvIHRoaXMgQ2hhckFycmF5V3JpdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBTdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyB0byB3cml0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBzdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyB0byB3cml0ZS4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9pbnQgdG8gcmV0cmlldmUgY2hhcmFjdGVycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHtAY29kZSBzdHJ9IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBsZW4KICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZXRyaWV2ZSBhbmQgd3JpdGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHJ9IGlzIG51bGwuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW4gPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVufSBpcyBiaWdnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHN0cn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHN0ciwgaW50IG9mZnNldCwgaW50IGxlbikgewpAQCAtMjA0LDEwICsyNDcsMTUgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzdHIubGVuZ3RoKCkgfHwgbGVuIDwgMAotICAgICAgICAgICAgICAgIHx8IGxlbiA+IHN0ci5sZW5ndGgoKSAtIG9mZnNldCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHJlbW92ZWQgcmVkdW5kYW50IGNoZWNrLCB1c2VkIChvZmZzZXQgfCBsZW4pIDwgMAorICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAobGVuIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuKSA8IDAgfHwgbGVuID4gc3RyLmxlbmd0aCgpIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CiAgICAgICAgICAgICBleHBhbmQobGVuKTsKICAgICAgICAgICAgIHN0ci5nZXRDaGFycyhvZmZzZXQsIG9mZnNldCArIGxlbiwgYnVmLCB0aGlzLmNvdW50KTsKQEAgLTIxOCwxMyArMjY2LDE1IEBACiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIENoYXJBcnJheVdyaXRlciB0byBhbm90aGVyIFdyaXRlci4gVGhlIG91dHB1dAogICAgICAqIGlzIGFsbCB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSByZWNlaXZlciBzaW5jZSB0aGUKLSAgICAgKiBsYXN0IHJlc2V0IG9yIHNpbmNlIHRoZSBjcmVhdGlvbi4KKyAgICAgKiBsYXN0IHJlc2V0IG9yIHNpbmNlIGl0IHdhcyBjcmVhdGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXQKICAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBXcml0ZXIgb24gd2hpY2ggdG8gd3JpdGUgdGhlIGNvbnRlbnRzLgotICAgICAqIAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb3V0fSBpcyBudWxsLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgY29udGVudHMgb3V0LgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIG91dCB0aGUgY29udGVudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKQEAgLTIzMywxMyArMjgzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kIGEgY2hhciA8Y29kZT5jPC9jb2RlPnRvIHRoZSBDaGFyQXJyYXlXcml0ZXIuIFRoZQotICAgICAqIENoYXJBcnJheVdyaXRlci5hcHBlbmQoPGNvZGU+YzwvY29kZT4pIHdvcmtzIHRoZSBzYW1lIHdheSBhcwotICAgICAqIENoYXJBcnJheVdyaXRlci53cml0ZSg8Y29kZT5jPC9jb2RlPikuCisgICAgICogQXBwZW5kcyBhIGNoYXIge0Bjb2RlIGN9IHRvIHRoZSBDaGFyQXJyYXlXcml0ZXIuIFRoZSBtZXRob2Qgd29ya3MgdGhlCisgICAgICogc2FtZSB3YXkgYXMge0Bjb2RlIHdyaXRlKGMpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBhcHBlbmRlZCB0byB0aGUgQ2hhckFycmF5V3JpdGVyLgotICAgICAqIEByZXR1cm4gVGhlIENoYXJBcnJheVdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXBwZW5kZWQgdG8gdGhlIENoYXJBcnJheVdyaXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgQ2hhckFycmF5V3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDaGFyQXJyYXlXcml0ZXIgYXBwZW5kKGNoYXIgYykgewpAQCAtMjQ4LDE1ICsyOTgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBDaGFyU2VxdWVuY2UgPGNvZGU+Y3NxPC9jb2RlPiB0byB0aGUgQ2hhckFycmF5V3JpdGVyLiBUaGUKLSAgICAgKiBDaGFyQXJyYXlXcml0ZXIuYXBwZW5kKDxjb2RlPmNzcTwvY29kZT4pIHdvcmtzIHRoZSBzYW1lIHdheSBhcwotICAgICAqIENoYXJBcnJheVdyaXRlci53cml0ZSg8Y29kZT5jc3E8L2NvZGU+LnRvU3RyaW5nKCkpLiBJZgotICAgICAqIDxjb2RlPmNzcTwvY29kZT4gaXMgbnVsbCwgdGhlbiB0aGVuICJudWxsIiB3aWxsIGJlIHN1YnN0aXR1dGVkIGZvcgotICAgICAqIDxjb2RlPmNzcTwvY29kZT4uCisgICAgICogQXBwZW5kcyBhIENoYXJTZXF1ZW5jZSB7QGNvZGUgY3NxfSB0byB0aGUgQ2hhckFycmF5V3JpdGVyLiBUaGUgbWV0aG9kCisgICAgICogd29ya3MgdGhlIHNhbWUgd2F5IGFzIHtAY29kZSB3cml0ZShjc3EudG9TdHJpbmcoKSl9LiBJZiB7QGNvZGUgY3NxfSBpcworICAgICAqIG51bGwsIHRoZW4gaXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBzdHJpbmcgIm51bGwiLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjc3EKLSAgICAgKiAgICAgICAgICAgIFRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIENoYXJBcnJheVdyaXRlci4KLSAgICAgKiBAcmV0dXJuIFRoZSBDaGFyQXJyYXlXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIENoYXJBcnJheVdyaXRlciwgbWF5IGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGlzIENoYXJBcnJheVdyaXRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ2hhckFycmF5V3JpdGVyIGFwcGVuZChDaGFyU2VxdWVuY2UgY3NxKSB7CkBAIC0yNjksMjYgKzMxOCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGVuZCBhIHN1YnNlcXVlbmNlIG9mIGEgQ2hhclNlcXVlbmNlIDxjb2RlPmNzcTwvY29kZT4gdG8gdGhlCi0gICAgICogQ2hhckFycmF5V3JpdGVyLiBUaGUgZmlyc3QgY2hhciBhbmQgdGhlIGxhc3QgY2hhciBvZiB0aGUgc3Vic2VxdW5jZSBpcwotICAgICAqIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPi4KLSAgICAgKiBUaGUgQ2hhckFycmF5V3JpdGVyLmFwcGVuZCg8Y29kZT5jc3E8L2NvZGU+KSB3b3JrcyB0aGUgc2FtZSB3YXkgYXMKLSAgICAgKiBDaGFyQXJyYXlXcml0ZXIud3JpdGUoPGNvZGU+Y3NxPC9jb2RlPi5zdWJTZXF1ZW5jZSg8Y29kZT5zdGFydDwvY29kZT4sPGNvZGU+ZW5kPC9jb2RlPikudG9TdHJpbmcpLgotICAgICAqIElmIDxjb2RlPmNzcTwvY29kZT4gaXMgbnVsbCwgdGhlbiAibnVsbCIgd2lsbCBiZSBzdWJzdGl0dXRlZCBmb3IKLSAgICAgKiA8Y29kZT5jc3E8L2NvZGU+LgorICAgICAqIEFwcGVuZCBhIHN1YnNlcXVlbmNlIG9mIGEgQ2hhclNlcXVlbmNlIHtAY29kZSBjc3F9IHRvIHRoZQorICAgICAqIENoYXJBcnJheVdyaXRlci4gVGhlIGZpcnN0IGFuZCBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHN1YnNlcXVlbmNlIGFyZQorICAgICAqIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVycyB7QGNvZGUgc3RhcnR9IGFuZCB7QGNvZGUgZW5kfS4gVGhlCisgICAgICogQ2hhckFycmF5V3JpdGVyLmFwcGVuZCh7QGNvZGUgY3NxfSkgd29ya3MgdGhlIHNhbWUgd2F5IGFzCisgICAgICoge0Bjb2RlIENoYXJBcnJheVdyaXRlci53cml0ZShjc3Euc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcpfS4gSWYKKyAgICAgKiB7QGNvZGUgY3NxfSBpcyBudWxsLCB0aGVuIGl0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgc3RyaW5nICJudWxsIi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY3NxCi0gICAgICogICAgICAgICAgICBUaGUgQ2hhclNlcXVlbmNlIGFwcGVuZGVkIHRvIHRoZSBDaGFyQXJyYXlXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgQ2hhclNlcXVlbmNlIGFwcGVuZGVkIHRvIHRoZSBDaGFyQXJyYXlXcml0ZXIsIG1heSBiZSBudWxsLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyIGluIHRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyQXJyYXlXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgQ2hhclNlcXVlbmNlIGFwcGVuZGVkCisgICAgICogICAgICAgICAgICB0byB0aGUgQ2hhckFycmF5V3JpdGVyLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhciBhZnRlciB0aGUgbGFzdCBvbmUgaW4gdGhlIENoYXJTZXF1ZW5jZQotICAgICAqICAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIENoYXJBcnJheVdyaXRlci4KLSAgICAgKiBAcmV0dXJuIFRoZSBDaGFyQXJyYXlXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdCBvbmUgaW4gdGhlCisgICAgICogICAgICAgICAgICBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIENoYXJBcnJheVdyaXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgQ2hhckFycmF5V3JpdGVyLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHN0YXJ0IGlzIGxlc3MgdGhhbiBlbmQsIGVuZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgotICAgICAqICAgICAgICAgICAgIHRoZSBDaGFyU2VxdWVuY2UsIG9yIHN0YXJ0IG9yIGVuZCBpcyBuZWdhdGl2ZS4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSwge0Bjb2RlIGVuZCA8IDB9LCB7QGNvZGUgc3RhcnQgPiBlbmR9LAorICAgICAqICAgICAgICAgICAgIG9yIGlmIHtAY29kZSBlbmR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBjc3F9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDaGFyQXJyYXlXcml0ZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBjc3EsIGludCBzdGFydCwgaW50IGVuZCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQ2hhckNvbnZlcnNpb25FeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0NoYXJDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKaW5kZXggOWRkMGE4Ny4uMjI0NzUyNyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQ2hhckNvbnZlcnNpb25FeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyNiArMTgsMzEgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgY2xhc3MgZm9yIGNoYXJhY3RlciBjb252ZXJzaW9uIGV4Y2VwdGlvbnMuCisgKiBUaGUgdG9wIGxldmVsIGNsYXNzIGZvciBjaGFyYWN0ZXIgY29udmVyc2lvbiBleGNlcHRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENoYXJDb252ZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg2ODAwMTYzNTIwMTg0MjcwMzFMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDaGFyQ29udmVyc2lvbkV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UKKyAgICAgKiBmaWxsZWQgaW4uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoYXJDb252ZXJzaW9uRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDaGFyQ29udmVyc2lvbkV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UgYW5kCisgICAgICogZGV0YWlsIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGFyQ29udmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0Nsb3NlYWJsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQ2xvc2VhYmxlLmphdmEKaW5kZXggMDIzMmMyOC4uMDE1YjM5YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQ2xvc2VhYmxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQ2xvc2VhYmxlLmphdmEKQEAgLTE3LDE3ICsxNywyMiBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIENsb3NlYWJsZSByZXByZXNlbnRzIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb2Ygc29tZSBkYXRhIHdoaWNoIGNhbiBiZQotICogY2FsbGVkIGl0cyBjbG9zZSBtZXRob2QgdG8gcmVsZWFzZSByZXNvdXJjZXMgaXQgaG9sZHMuCisgKiBEZWZpbmVzIGFuIGludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IGNhbiAob3IgbmVlZCB0bykgYmUgY2xvc2VkIG9uY2UgdGhleQorICogYXJlIG5vdCB1c2VkIGFueSBsb25nZXIuIFRoaXMgdXN1YWxseSBpbmNsdWRlcyBhbGwgc29ydHMgb2YKKyAqIHtAbGluayBJbnB1dFN0cmVhbX1zIGFuZCB7QGxpbmsgT3V0cHV0U3RyZWFtfXMuIENhbGxpbmcgdGhlIHtAY29kZSBjbG9zZX0KKyAqIG1ldGhvZCByZWxlYXNlcyByZXNvdXJjZXMgdGhhdCB0aGUgb2JqZWN0IGhvbGRzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDbG9zZWFibGUgewogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIG9iamVjdCBhbmQgcmVsZWFzZSBhbnkgc3lzdGVtIHJlc291cmNlcyBpdCBob2xkcy4gSWYgdGhlIG9iamVjdAotICAgICAqIGhhcyBiZWVuIGNsb3NlLCB0aGVuIGludm9rZSB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgorICAgICAqIENsb3NlcyB0aGUgb2JqZWN0IGFuZCByZWxlYXNlIGFueSBzeXN0ZW0gcmVzb3VyY2VzIGl0IGhvbGRzLiBJZiB0aGUKKyAgICAgKiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQsIHRoZW4gaW52b2tpbmcgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW55IGVycm9yIHJhaXNlcyB3aGVuIGNsb3NpbmcgdGhlIG9iamVjdC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgZXJyb3Igb2NjdXJzIHdoZW4gY2xvc2luZyB0aGUgb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0RhdGFJbnB1dC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRGF0YUlucHV0LmphdmEKaW5kZXggZGJiNTNjMi4uYTE5OWQyZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRGF0YUlucHV0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRGF0YUlucHV0LmphdmEKQEAgLTE4LDIxNCArMTgsMjQ3IEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogRGF0YUlucHV0IGlzIGFuIGludGVyZmFjZSB3aGljaCBkZWNsYXJlcyBtZXRob2RzIGZvciByZWFkaW5nIGluIHR5cGVkIGRhdGEKLSAqIGZyb20gYSBTdHJlYW0uIFR5cGljYWxseSwgdGhpcyBzdHJlYW0gaGFzIGJlZW4gd3JpdHRlbiBieSBhIGNsYXNzIHdoaWNoCi0gKiBpbXBsZW1lbnRzIERhdGFPdXRwdXQuIFR5cGVzIHRoYXQgY2FuIGJlIHJlYWQgaW5jbHVkZSBieXRlLCAxNi1iaXQgc2hvcnQsCi0gKiAzMi1iaXQgaW50LCAzMi1iaXQgZmxvYXQsIDY0LWJpdCBsb25nLCA2NC1iaXQgZG91YmxlLCBieXRlIHN0cmluZ3MsIGFuZCBVVEYKLSAqIFN0cmluZ3MuCisgKiBEZWZpbmVzIGFuIGludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IGFyZSBhYmxlIHRvIHJlYWQgdHlwZWQgZGF0YSBmcm9tIHNvbWUKKyAqIHNvdXJjZS4gVHlwaWNhbGx5LCB0aGlzIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBieSBhIGNsYXNzIHdoaWNoIGltcGxlbWVudHMKKyAqIHtAbGluayBEYXRhT3V0cHV0fS4gVHlwZXMgdGhhdCBjYW4gYmUgcmVhZCBpbmNsdWRlIGJ5dGUsIDE2LWJpdCBzaG9ydCwgMzItYml0CisgKiBpbnQsIDMyLWJpdCBmbG9hdCwgNjQtYml0IGxvbmcsIDY0LWJpdCBkb3VibGUsIGJ5dGUgc3RyaW5ncywgYW5kIE1VVEYtOAorICogc3RyaW5ncy4KKyAqICAKKyAqIDxoMz5NVVRGLTggKE1vZGlmaWVkIFVURi04KSBFbmNvZGluZzwvaDM+CisgKiA8cD4KKyAqIFdoZW4gZW5jb2Rpbmcgc3RyaW5ncyBhcyBVVEYsIGltcGxlbWVudGF0aW9ucyBvZiB7QGNvZGUgRGF0YUlucHV0fSBhbmQKKyAqIHtAY29kZSBEYXRhT3V0cHV0fSB1c2UgYSBzbGlnaHRseSBtb2RpZmllZCBmb3JtIG9mIFVURi04LCBoZXJlYWZ0ZXIgcmVmZXJyZWQKKyAqIHRvIGFzIE1VVEYtOC4gVGhpcyBmb3JtIGlzIGlkZW50aWNhbCB0byBzdGFuZGFyZCBVVEYtOCwgZXhjZXB0OgorICogPC9wPgorICogPHVsPgorICogPGxpPk9ubHkgdGhlIG9uZS0sIHR3by0sIGFuZCB0aHJlZS1ieXRlIGVuY29kaW5ncyBhcmUgdXNlZC48L2xpPgorICogPGxpPkNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSA8Y29kZT5VKzEwMDAwPC9jb2RlPiAmaGVsbGlwOworICogPGNvZGU+VSsxMGZmZmY8L2NvZGU+IGFyZSBlbmNvZGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIsIGVhY2ggb2Ygd2hpY2ggaXMKKyAqIHJlcHJlc2VudGVkIGFzIGEgdGhyZWUtYnl0ZSBlbmNvZGVkIHZhbHVlLjwvbGk+CisgKiA8bGk+VGhlIGNvZGUgcG9pbnQgPGNvZGU+VSswMDAwPC9jb2RlPiBpcyBlbmNvZGVkIGluIHR3by1ieXRlIGZvcm0uPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFBsZWFzZSByZWZlciB0byA8YSBocmVmPSJodHRwOi8vdW5pY29kZS5vcmciPlRoZSBVbmljb2RlIFN0YW5kYXJkPC9hPiBmb3IKKyAqIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgY2hhcmFjdGVyIGVuY29kaW5nLiBNVVRGLTggaXMgYWN0dWFsbHkgY2xvc2VyIHRvCisgKiB0aGUgKHJlbGF0aXZlbHkgbGVzcyB3ZWxsLWtub3duKSBlbmNvZGluZyA8YQorICogaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMjYvIj5DRVNVLTg8L2E+IHRoYW4gdG8gVVRGLTggcGVyIHNlLgorICogPC9wPgogICogCiAgKiBAc2VlIERhdGFJbnB1dFN0cmVhbQogICogQHNlZSBSYW5kb21BY2Nlc3NGaWxlCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERhdGFJbnB1dCB7CiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBib29sZWFuIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogUmVhZHMgYSBib29sZWFuLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcuCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlQm9vbGVhbihib29sZWFuKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYW4gOC1iaXQgYnl0ZSB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIFJlYWRzIGFuIDgtYml0IGJ5dGUgdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBieXRlIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBieXRlIHZhbHVlLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZy4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVCeXRlKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgMTYtYml0IGNoYXJhY3RlciB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIFJlYWRzIGEgMTYtYml0IGNoYXJhY3RlciB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBjaGFyIHZhbHVlLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZy4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVDaGFyKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgNjQtYml0IDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIDY0LWJpdCBkb3VibGUgdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBkb3VibGUgdmFsdWUuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZURvdWJsZShkb3VibGUpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSAzMi1iaXQgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogUmVhZHMgYSAzMi1iaXQgZmxvYXQgdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGZsb2F0IHZhbHVlLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZy4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVGbG9hdChmbG9hdCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBpbnRvIHRoZSBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCA8Y29kZT5idWZmZXIubGVuZ3RoPC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMKLSAgICAgKiBoYXZlIGJlZW4gcmVhZC4KKyAgICAgKiBSZWFkcyBieXRlcyBpbnRvIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9LiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrCisgICAgICogdW50aWwge0Bjb2RlIGJ1ZmZlci5sZW5ndGh9IG51bWJlciBvZiBieXRlcyBoYXZlIGJlZW4gcmVhZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHJlYWQgYnl0ZXMgaW50bwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byByZWFkIGJ5dGVzIGludG8uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZShieXRlW10pCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWQgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheQotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgb2Zmc2V0IDxjb2RlPm9mZnNldDwvY29kZT4uIFRoaXMKLSAgICAgKiBtZXRob2QgYmxvY2tzIHVudGlsIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuCisgICAgICogUmVhZHMgYnl0ZXMgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0CisgICAgICogb2Zmc2V0IHtAY29kZSBvZmZzZXR9LiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwge0Bjb2RlIGNvdW50fSBudW1iZXIgb2YKKyAgICAgKiBieXRlcyBoYXZlIGJlZW4gcmVhZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBieXRlcworICAgICAqICAgICAgICAgICAgcmVhZC4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZy4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGUoYnl0ZVtdKQogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZShieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWRGdWxseShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogUmVhZHMgYSAzMi1iaXQgaW50ZWdlciB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IDxjb2RlPmludDwvY29kZT4gdmFsdWUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGludCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcuCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlSW50KGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIG5leHQgbGluZSBvZiB0ZXh0Ci0gICAgICogYXZhaWxhYmxlIGluIHRoaXMgQnVmZmVyZWRSZWFkZXIuIEEgbGluZSBpcyByZXByZXNlbnRlZCBieSAwIG9yIG1vcmUKLSAgICAgKiBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IDxjb2RlPidcbic8L2NvZGU+LCA8Y29kZT4nXHInPC9jb2RlPiwKLSAgICAgKiA8Y29kZT4iXG5cciI8L2NvZGU+IG9yIGVuZCBvZiBzdHJlYW0uIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGRvZXMKLSAgICAgKiBub3QgaW5jbHVkZSB0aGUgbmV3bGluZSBzZXF1ZW5jZS4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5leHQgbGluZSBvZiB0ZXh0IGF2YWlsYWJsZSBmcm9tIHRoaXMKKyAgICAgKiBzdHJlYW0uIEEgbGluZSBpcyBtYWRlIG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IHtAY29kZQorICAgICAqICdcbid9LCB7QGNvZGUgJ1xyJ30sIHtAY29kZSAiXHJcbiJ9IG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhlIHN0cmluZworICAgICAqIGRvZXMgbm90IGluY2x1ZGUgdGhlIG5ld2xpbmUgc2VxdWVuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgb3IgbnVsbCBpZiBubyBjaGFyYWN0ZXJzIHdlcmUgcmVhZAotICAgICAqICAgICAgICAgYmVmb3JlIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgb3IgbnVsbCBpZiBubyBjaGFyYWN0ZXJzIGhhdmUgYmVlbiByZWFkCisgICAgICogICAgICAgICBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSA2NC1iaXQgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIDY0LWJpdCBsb25nIHZhbHVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGxvbmcgdmFsdWUuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZUxvbmcobG9uZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyByZWFkTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgMTYtYml0IDxjb2RlPnNob3J0PC9jb2RlPiB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIFJlYWRzIGEgMTYtYml0IHNob3J0IHZhbHVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgPGNvZGU+c2hvcnQ8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBzaG9ydCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcuCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlU2hvcnQoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbiB1bnNpZ25lZCA4LWJpdCA8Y29kZT5ieXRlPC9jb2RlPiB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtIGFuZAotICAgICAqIHJldHVybnMgaXQgYXMgYW4gaW50LgorICAgICAqIFJlYWRzIGFuIHVuc2lnbmVkIDgtYml0IGJ5dGUgdmFsdWUgYW5kIHJldHVybnMgaXQgYXMgYW4gaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgdW5zaWduZWQgYnl0ZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdW5zaWduZWQgYnl0ZSB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcuCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlQnl0ZShpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCByZWFkVW5zaWduZWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSAxNi1iaXQgdW5zaWduZWQgPGNvZGU+c2hvcnQ8L2NvZGU+IHZhbHVlIGZyb20gdGhpcyBzdHJlYW0gYW5kCi0gICAgICogcmV0dXJucyBpdCBhcyBhbiBpbnQuCisgICAgICogUmVhZHMgYSAxNi1iaXQgdW5zaWduZWQgc2hvcnQgdmFsdWUgYW5kIHJldHVybnMgaXQgYXMgYW4gaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgdW5zaWduZWQgPGNvZGU+c2hvcnQ8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZQotICAgICAqICAgICAgICAgc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdW5zaWduZWQgc2hvcnQgdmFsdWUuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZVNob3J0KGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBVVEYgZm9ybWF0IFN0cmluZyBmcm9tIHRoaXMgU3RyZWFtLgorICAgICAqIFJlYWRzIGEgc3RyaW5nIGVuY29kZWQgd2l0aCB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IFVURiBTdHJpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHN0cmluZyBlbmNvZGVkIHdpdGgge0BsaW5rIERhdGFJbnB1dCBtb2RpZmllZCBVVEYtOH0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZVVURihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBzdHJlYW0uIFN1YnNlcXVlbnQKLSAgICAgKiA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzIHVubGVzcwotICAgICAqIDxjb2RlPnJlc2V0KCk8L2NvZGU+IGlzIHVzZWQuCisgICAgICogU2tpcHMge0Bjb2RlIGNvdW50fSBudW1iZXIgb2YgYnl0ZXMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHRocm93IGFuCisgICAgICoge0BsaW5rIEVPRkV4Y2VwdGlvbn0gaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUKKyAgICAgKiB7QGNvZGUgY291bnR9IGJ5dGVzIHdoZXJlIHNraXBwZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvdW50CiAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNraXBwZWQuCi0gICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHNraXBwaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2tpcEJ5dGVzKGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRGF0YUlucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9EYXRhSW5wdXRTdHJlYW0uamF2YQppbmRleCBmNDc1ZTRkLi44OGIxMGE1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9EYXRhSW5wdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9EYXRhSW5wdXRTdHJlYW0uamF2YQpAQCAtMjEsNDQgKzIxLDQ3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5VdGlsOwogCiAvKioKLSAqIERhdGFJbnB1dFN0cmVhbSBpcyBhIGZpbHRlciBjbGFzcyB3aGljaCBjYW4gcmVhZCB0eXBlZCBkYXRhIGZyb20gYSBTdHJlYW0uCisgKiBXcmFwcyBhbiBleGlzdGluZyB7QGxpbmsgSW5wdXRTdHJlYW19IGFuZCByZWFkcyB0eXBlZCBkYXRhIGZyb20gaXQuIAogICogVHlwaWNhbGx5LCB0aGlzIHN0cmVhbSBoYXMgYmVlbiB3cml0dGVuIGJ5IGEgRGF0YU91dHB1dFN0cmVhbS4gVHlwZXMgdGhhdCBjYW4KICAqIGJlIHJlYWQgaW5jbHVkZSBieXRlLCAxNi1iaXQgc2hvcnQsIDMyLWJpdCBpbnQsIDMyLWJpdCBmbG9hdCwgNjQtYml0IGxvbmcsCi0gKiA2NC1iaXQgZG91YmxlLCBieXRlIHN0cmluZ3MsIGFuZCBVVEYgU3RyaW5ncy4KKyAqIDY0LWJpdCBkb3VibGUsIGJ5dGUgc3RyaW5ncywgYW5kIHN0cmluZ3MgZW5jb2RlZCBpbgorICoge0BsaW5rIERhdGFJbnB1dCBtb2RpZmllZCBVVEYtOH0uCiAgKiAKICAqIEBzZWUgRGF0YU91dHB1dFN0cmVhbQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIERhdGFJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIGltcGxlbWVudHMgRGF0YUlucHV0IHsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRGF0YUlucHV0U3RyZWFtIG9uIHRoZSBJbnB1dFN0cmVhbSA8Y29kZT5pbjwvY29kZT4uCi0gICAgICogQWxsIHJlYWRzIGNhbiBub3cgYmUgZmlsdGVyZWQgdGhyb3VnaCB0aGlzIHN0cmVhbS4gTm90ZSB0aGF0IGRhdGEgcmVhZCBieQotICAgICAqIHRoaXMgU3RyZWFtIGlzIG5vdCBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCBhbmQgd2FzIG1vc3QgbGlrZWx5IGNyZWF0ZWQKLSAgICAgKiBieSBhIERhdGFPdXRwdXRTdHJlYW0uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBEYXRhSW5wdXRTdHJlYW0gb24gdGhlIElucHV0U3RyZWFtIHtAY29kZSBpbn0uIEFsbAorICAgICAqIHJlYWRzIGFyZSB0aGVuIGZpbHRlcmVkIHRocm91Z2ggdGhpcyBzdHJlYW0uIE5vdGUgdGhhdCBkYXRhIHJlYWQgYnkgdGhpcworICAgICAqIHN0cmVhbSBpcyBub3QgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtYXQgYW5kIHdhcyBtb3N0IGxpa2VseSBjcmVhdGVkIGJ5IGEKKyAgICAgKiBEYXRhT3V0cHV0U3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBJbnB1dFN0cmVhbSB0byBmaWx0ZXIgcmVhZHMgb24uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIElucHV0U3RyZWFtIHRoZSBmaWx0ZXIgcmVhZHMgZnJvbS4KICAgICAgKiBAc2VlIERhdGFPdXRwdXRTdHJlYW0KICAgICAgKiBAc2VlIFJhbmRvbUFjY2Vzc0ZpbGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CiAgICAgICAgIHN1cGVyKGluKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtIGludG8gdGhlIGJ5dGUgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+LiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgaXMgcmV0dXJuZWQuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBpbnRvIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9LiBSZXR1cm5zCisgICAgICogdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gcmVhZCBieXRlcyBpbnRvCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gcmVhZCBieXRlcyBpbnRvLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlCisgICAgICogICAgICAgICBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlKGJ5dGVbXSkKICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTY2LDI0ICs2OSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWQgYXQgbW9zdCA8Y29kZT5sZW5ndGg8L2NvZGU+IGJ5dGVzIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0gYW5kCi0gICAgICogc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuCisgICAgICogUmVhZHMgYXQgbW9zdCB7QGNvZGUgbGVuZ3RofSBieXRlcyBmcm9tIHRoaXMgc3RyZWFtIGFuZCBzdG9yZXMgdGhlbSBpbgorICAgICAqIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9LiBSZXR1cm5zIHRoZQorICAgICAqIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZWFkIG9yIC0xIGlmIG5vIGJ5dGVzIGhhdmUgYmVlbiByZWFkIGFuZAorICAgICAqIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gc3RvcmUgdGhlIGJ5dGVzCisgICAgICogICAgICAgICAgICByZWFkIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiB7QGNvZGUgYnVmZmVyfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZShieXRlW10pCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCkBAIC05NSwxMSArOTksMTMgQEAKICAgICAgKiBSZWFkcyBhIGJvb2xlYW4gZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIGZpbHRlcmVkIHN0cmVhbSBpcyByZWFjaGVkIGJlZm9yZSBvbmUgYnl0ZQorICAgICAqICAgICAgICAgICAgIGhhcyBiZWVuIHJlYWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZUJvb2xlYW4oYm9vbGVhbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZWFkQm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCB0ZW1wID0gaW4ucmVhZCgpOwpAQCAtMTEzLDExICsxMTksMTMgQEAKICAgICAgKiBSZWFkcyBhbiA4LWJpdCBieXRlIHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbmV4dCBieXRlIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBmaWx0ZXJlZCBzdHJlYW0gaXMgcmVhY2hlZCBiZWZvcmUgb25lIGJ5dGUKKyAgICAgKiAgICAgICAgICAgICBoYXMgYmVlbiByZWFkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVCeXRlKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCB0ZW1wID0gaW4ucmVhZCgpOwpAQCAtMTMwLDEyICsxMzgsMTQgQEAKICAgICAvKioKICAgICAgKiBSZWFkcyBhIDE2LWJpdCBjaGFyYWN0ZXIgdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBjaGFyIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBmaWx0ZXJlZCBzdHJlYW0gaXMgcmVhY2hlZCBiZWZvcmUgdHdvIGJ5dGVzCisgICAgICogICAgICAgICAgICAgaGF2ZSBiZWVuIHJlYWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZUNoYXIoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGIxID0gaW4ucmVhZCgpOwpAQCAtMTQ3LDc1ICsxNTcsOTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIDY0LWJpdCA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogUmVhZHMgYSA2NC1iaXQgZG91YmxlIHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBkb3VibGUgdmFsdWUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIGZpbHRlcmVkIHN0cmVhbSBpcyByZWFjaGVkIGJlZm9yZSBlaWdodAorICAgICAqICAgICAgICAgICAgIGJ5dGVzIGhhdmUgYmVlbiByZWFkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVEb3VibGUoZG91YmxlKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShyZWFkTG9uZygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIDMyLWJpdCA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIDMyLWJpdCBmbG9hdCB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBmbG9hdCB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGUgZmlsdGVyZWQgc3RyZWFtIGlzIHJlYWNoZWQgYmVmb3JlIGZvdXIKKyAgICAgKiAgICAgICAgICAgICBieXRlcyBoYXZlIGJlZW4gcmVhZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlRmxvYXQoZmxvYXQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IHJlYWRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBGbG9hdC5pbnRCaXRzVG9GbG9hdChyZWFkSW50KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhpcyBzdHJlYW0gaW50byB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgPGNvZGU+YnVmZmVyLmxlbmd0aDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzCi0gICAgICogaGF2ZSBiZWVuIHJlYWQuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBpbnRvIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9LiBUaGlzCisgICAgICogbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwge0Bjb2RlIGJ1ZmZlci5sZW5ndGh9IG51bWJlciBvZiBieXRlcyBoYXZlIGJlZW4KKyAgICAgKiByZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRvIHJlYWQgYnl0ZXMgaW50bwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdG8gcmVhZCBieXRlcyBpbnRvLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmVhbSBpcyByZWFjaGVkIGJlZm9yZSBlbm91Z2gKKyAgICAgKiAgICAgICAgICAgICBieXRlcyBoYXZlIGJlZW4gcmVhZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlKGJ5dGVbXSkKICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmVhZEZ1bGx5KGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGJ5dGUgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IHRoZSBwb3NpdGlvbiA8Y29kZT5vZmZzZXQ8L2NvZGU+LgotICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCA8Y29kZT5jb3VudDwvY29kZT4gYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlCisgICAgICogYnVmZmVyfSBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24ge0Bjb2RlIG9mZnNldH0uIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbAorICAgICAqIHtAY29kZSBsZW5ndGh9IGJ5dGVzIGhhdmUgYmVlbiByZWFkLiBJZiB7QGNvZGUgbGVuZ3RofSBpcyB6ZXJvLCB0aGVuIHRoaXMKKyAgICAgKiBtZXRob2QgcmV0dXJucyB3aXRob3V0IHJlYWRpbmcgYW55IGJ5dGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGludG8gd2hpY2ggdGhlIGRhdGEgaXMgcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW50byB3aGljaCB0aGUgZGF0YSBpcyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdGhlIG9wZXJhdGlvbiBzdGFydCBhdAotICAgICAqIEBwYXJhbSBsZW5ndGggCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB7QGNvZGUgYnVmZmVyfSBmcm9tIHdoZXJlIHRvIHN0b3JlIHRoZSBieXRlcworICAgICAqICAgICAgICAgICAgcmVhZC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KICAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGJlZm9yZSBlbm91Z2ggYnl0ZXMgaGF2ZQotICAgICAqICAgICAgICAgICAgIGJlZW4gcmVhZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJlYW0gaXMgcmVhY2hlZCBiZWZvcmUgZW5vdWdoCisgICAgICogICAgICAgICAgICAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2Yge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYnVmZmVyfSBvciB0aGUgc291cmNlIHN0cmVhbSBhcmUgbnVsbC4KICAgICAgKiBAc2VlIGphdmEuaW8uRGF0YUlucHV0I3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGdWxseShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGlmIChsZW5ndGggPCAwKSB7CisgICAgICAgIC8vICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAvLyB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTIyNSw5ICsyNTAsMTUgQEAKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIC0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gdXNlZCAob2Zmc2V0IHwgbGVuZ3RoKSA8IDAgaW5zdGVhZCBvZiBzZXBhcmF0ZSAob2Zmc2V0IDwgMCkgYW5kCisgICAgICAgIC8vIChsZW5ndGggPCAwKSBjaGVjayB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKChvZmZzZXQgfCBsZW5ndGgpIDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIC0gbGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKICAgICAgICAgICAgIGludCByZXN1bHQgPSBpbi5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKQEAgLTI0MSwxNCArMjcyLDE3IEBACiAgICAgLyoqCiAgICAgICogUmVhZHMgYSAzMi1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgaW50IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBmaWx0ZXJlZCBzdHJlYW0gaXMgcmVhY2hlZCBiZWZvcmUgZm91cgorICAgICAqICAgICAgICAgICAgIGJ5dGVzIGhhdmUgYmVlbiByZWFkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVJbnQoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNF07CiAgICAgICAgIGludCBucmVhZCA9IDA7CiAgICAgICAgIHdoaWxlIChucmVhZCA8IDQpIHsKQEAgLTI2MywyMyArMjk3LDIxIEBACiAgICAgICAgIGludCBiMyA9IGJ1ZlsyXSAmIDB4ZmY7CiAgICAgICAgIGludCBiNCA9IGJ1ZlszXSAmIDB4ZmY7CiAgICAgICAgIHJldHVybiAoKGIxIDw8IDI0KSArIChiMiA8PCAxNikgKyAoYjMgPDwgOCkgKyBiNCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIG5leHQgbGluZSBvZiB0ZXh0Ci0gICAgICogYXZhaWxhYmxlIGluIHRoaXMgQnVmZmVyZWRSZWFkZXIuIEEgbGluZSBpcyByZXByZXNlbnRlZCBieSAwIG9yIG1vcmUKLSAgICAgKiBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IDxjb2RlPidcbic8L2NvZGU+LCA8Y29kZT4nXHInPC9jb2RlPiwKLSAgICAgKiA8Y29kZT4iXG5cciI8L2NvZGU+IG9yIGVuZCBvZiBzdHJlYW0uIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGRvZXMKLSAgICAgKiBub3QgaW5jbHVkZSB0aGUgbmV3bGluZSBzZXF1ZW5jZS4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIG5leHQgbGluZSBvZiB0ZXh0IGF2YWlsYWJsZSBmcm9tIHRoZQorICAgICAqIHNvdXJjZSBzdHJlYW0uIEEgbGluZSBpcyByZXByZXNlbnRlZCBieSB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycyBmb2xsb3dlZAorICAgICAqIGJ5IHtAY29kZSAnXG4nfSwge0Bjb2RlICdccid9LCB7QGNvZGUgIlxyXG4ifSBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgICAgICogVGhlIHN0cmluZyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZXdsaW5lIHNlcXVlbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIG9yIG51bGwgaWYgbm8gY2hhcmFjdGVycyB3ZXJlIHJlYWQKLSAgICAgKiAgICAgICAgIGJlZm9yZSBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIG9yIHtAY29kZSBudWxsfSBpZiBubyBjaGFyYWN0ZXJzIHdlcmUKKyAgICAgKiAgICAgICAgIHJlYWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIERhdGFJbnB1dFN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPCi0gICAgICogICAgICAgICAgICAgZXJyb3Igb2NjdXJzLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQnVmZmVyZWRSZWFkZXJ9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTMxNywxNCArMzQ5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSA2NC1iaXQgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIDY0LWJpdCBsb25nIHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgbG9uZyB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGUgZmlsdGVyZWQgc3RyZWFtIGlzIHJlYWNoZWQgYmVmb3JlIGVpZ2h0CisgICAgICogICAgICAgICAgICAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZUxvbmcobG9uZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgbG9uZyByZWFkTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBpMSA9IHJlYWRJbnQoKTsKQEAgLTM0MCwxNiArMzc0LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSAxNi1iaXQgPGNvZGU+c2hvcnQ8L2NvZGU+IHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogUmVhZHMgYSAxNi1iaXQgc2hvcnQgdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IDxjb2RlPnNob3J0PC9jb2RlPiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgc2hvcnQgdmFsdWUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIGZpbHRlcmVkIHN0cmVhbSBpcyByZWFjaGVkIGJlZm9yZSB0d28gYnl0ZXMKKyAgICAgKiAgICAgICAgICAgICBoYXZlIGJlZW4gcmVhZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlU2hvcnQoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzJdOwogICAgICAgICBpbnQgbnJlYWQgPSAwOwogICAgICAgICB3aGlsZSAobnJlYWQgPCAyKSB7CkBAIC0zNjIsMTggKzM5OSwyMSBAQAogICAgICAgICBpbnQgYjEgPSBidWZbMF0gJiAweGZmOwogICAgICAgICBpbnQgYjIgPSBidWZbMV0gJiAweGZmOwogICAgICAgICByZXR1cm4gKHNob3J0KSAoKGIxIDw8IDgpICsgYjIpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYW4gdW5zaWduZWQgOC1iaXQgPGNvZGU+Ynl0ZTwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbSBhbmQKLSAgICAgKiByZXR1cm5zIGl0IGFzIGFuIGludC4KKyAgICAgKiBSZWFkcyBhbiB1bnNpZ25lZCA4LWJpdCBieXRlIHZhbHVlIGZyb20gdGhpcyBzdHJlYW0gYW5kIHJldHVybnMgaXQgYXMgYW4KKyAgICAgKiBpbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbmV4dCB1bnNpZ25lZCBieXRlIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBmaWx0ZXJlZCBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZCBiZWZvcmUgb25lCisgICAgICogICAgICAgICAgICAgYnl0ZSBoYXMgYmVlbiByZWFkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVCeXRlKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgdGVtcCA9IGluLnJlYWQoKTsKQEAgLTM4NCwxNiArNDI0LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSAxNi1iaXQgdW5zaWduZWQgPGNvZGU+c2hvcnQ8L2NvZGU+IHZhbHVlIGZyb20gdGhpcyBzdHJlYW0gYW5kCi0gICAgICogcmV0dXJucyBpdCBhcyBhbiBpbnQuCisgICAgICogUmVhZHMgYSAxNi1iaXQgdW5zaWduZWQgc2hvcnQgdmFsdWUgZnJvbSB0aGlzIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhbgorICAgICAqIGludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHVuc2lnbmVkIDxjb2RlPnNob3J0PC9jb2RlPiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UKLSAgICAgKiAgICAgICAgIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHVuc2lnbmVkIHNob3J0IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBmaWx0ZXJlZCBzdHJlYW0gaXMgcmVhY2hlZCBiZWZvcmUgdHdvIGJ5dGVzCisgICAgICogICAgICAgICAgICAgaGF2ZSBiZWVuIHJlYWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZVNob3J0KGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGIxID0gaW4ucmVhZCgpOwpAQCAtNDA1LDEyMSArNDQ2LDEyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgVVRGIGZvcm1hdCBTdHJpbmcgZnJvbSB0aGlzIFN0cmVhbS4KKyAgICAgKiBSZWFkcyBhbiBzdHJpbmcgZW5jb2RlZCBpbiB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fSBmcm9tIHRoaXMKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBVVEYgU3RyaW5nIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCB7QGxpbmsgRGF0YUlucHV0IE1VVEYtOH0gZW5jb2RlZCBzdHJpbmcgcmVhZCBmcm9tIHRoZQorICAgICAqICAgICAgICAgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVVVEYoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlYWRVVEYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgdXRmU2l6ZSA9IHJlYWRVbnNpZ25lZFNob3J0KCk7CiAgICAgICAgIHJldHVybiBkZWNvZGVVVEYodXRmU2l6ZSk7CiAgICAgfQogCi0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZfU0laRSA9IDgxOTI7Ci0vLwotLy8gIHByaXZhdGUgc3RhdGljIGNsYXNzIENhY2hlTG9jayB7Ci0vLyAgfQotLy8KLS8vICBzdGF0aWMgZmluYWwgT2JqZWN0IGNhY2hlTG9jayA9IG5ldyBDYWNoZUxvY2soKTsKLS8vCi0vLyAgc3RhdGljIGJvb2xlYW4gdXNlU2hhcmVkID0gdHJ1ZTsKLS8vCi0vLyAgc3RhdGljIGJ5dGVbXSBieXRlQnVmID0gbmV3IGJ5dGVbMF07Ci0vLwotLy8gIHN0YXRpYyBjaGFyW10gY2hhckJ1ZiA9IG5ldyBjaGFyWzBdOwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgIC8vIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gODE5MjsKKyAgICAvLworICAgIC8vIHByaXZhdGUgc3RhdGljIGNsYXNzIENhY2hlTG9jayB7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gc3RhdGljIGZpbmFsIE9iamVjdCBjYWNoZUxvY2sgPSBuZXcgQ2FjaGVMb2NrKCk7CisgICAgLy8KKyAgICAvLyBzdGF0aWMgYm9vbGVhbiB1c2VTaGFyZWQgPSB0cnVlOworICAgIC8vCisgICAgLy8gc3RhdGljIGJ5dGVbXSBieXRlQnVmID0gbmV3IGJ5dGVbMF07CisgICAgLy8KKyAgICAvLyBzdGF0aWMgY2hhcltdIGNoYXJCdWYgPSBuZXcgY2hhclswXTsKKyAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAKICAgICBTdHJpbmcgZGVjb2RlVVRGKGludCB1dGZTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICAgICAgYnl0ZVtdIGJ1ZjsKLS8vICAgICAgICBjaGFyW10gb3V0ID0gbnVsbDsKLS8vICAgICAgICBib29sZWFuIG1ha2VCdWYgPSB0cnVlOwotLy8KLS8vICAgICAgICAvKgotLy8gICAgICAgICAqIFRyeSB0byBhdm9pZCB0aGUgc3luY2hyb25pemF0aW9uIC0tIGlmIHdlIGdldCBhIHN0YWxlIHZhbHVlIGZvcgotLy8gICAgICAgICAqIHVzZVNoYXJlZCB0aGVuIHRoZXJlIGlzIG5vIGZvdWwgYmVsb3csIGJ1dCB0aG9zZSB0aGF0IHN5bmMgb24gdGhlCi0vLyAgICAgICAgICogbG9jayBtdXN0IHNlZSB0aGUgcmlnaHQgdmFsdWUuCi0vLyAgICAgICAgICovCi0vLyAgICAgICAgaWYgKHV0ZlNpemUgPD0gTUFYX0JVRl9TSVpFICYmIHVzZVNoYXJlZCkgewotLy8gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlTG9jaykgewotLy8gICAgICAgICAgICAgICAgaWYgKHVzZVNoYXJlZCkgewotLy8gICAgICAgICAgICAgICAgICAgIHVzZVNoYXJlZCA9IGZhbHNlOwotLy8gICAgICAgICAgICAgICAgICAgIG1ha2VCdWYgPSBmYWxzZTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAobWFrZUJ1ZikgewotLy8gICAgICAgICAgICBidWYgPSBuZXcgYnl0ZVt1dGZTaXplXTsKLS8vICAgICAgICAgICAgb3V0ID0gbmV3IGNoYXJbdXRmU2l6ZV07Ci0vLyAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgLyoKLS8vICAgICAgICAgICAgICogTmVlZCB0byAnc2FtcGxlJyBieXRlQnVmIGFuZCBjaGFyQnVmIGJlZm9yZSB1c2luZyB0aGVtIGJlY2F1c2UKLS8vICAgICAgICAgICAgICogdGhleSBhcmUgbm90IHByb3RlY3RlZCBieSB0aGUgY2FjaGVMb2NrLiBUaGV5IG1heSBnZXQgb3V0IG9mIHN5bmMKLS8vICAgICAgICAgICAgICogd2l0aCB0aGUgc3RhdGljIGFuZCBvbmUgYW5vdGhlciwgYnV0IHRoYXQgaXMgb2sgYmVjYXVzZSB3ZQotLy8gICAgICAgICAgICAgKiBleHBsaWNpdGx5IGNoZWNrIGFuZCBmaXggdGhlaXIgbGVuZ3RoIGFmdGVyIHNhbXBsaW5nLgotLy8gICAgICAgICAgICAgKi8KLS8vICAgICAgICAgICAgYnVmID0gYnl0ZUJ1ZjsKLS8vICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGggPCB1dGZTaXplKSB7Ci0vLyAgICAgICAgICAgICAgICBidWYgPSBieXRlQnVmID0gbmV3IGJ5dGVbdXRmU2l6ZV07Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgb3V0ID0gY2hhckJ1ZjsKLS8vICAgICAgICAgICAgaWYgKG91dC5sZW5ndGggPCB1dGZTaXplKSB7Ci0vLyAgICAgICAgICAgICAgICBvdXQgPSBjaGFyQnVmID0gbmV3IGNoYXJbdXRmU2l6ZV07Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1yZW1vdmVkCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBieXRlW10gYnVmOworICAgICAgICAvLyBjaGFyW10gb3V0ID0gbnVsbDsKKyAgICAgICAgLy8gYm9vbGVhbiBtYWtlQnVmID0gdHJ1ZTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLyoKKyAgICAgICAgLy8gICogVHJ5IHRvIGF2b2lkIHRoZSBzeW5jaHJvbml6YXRpb24gLS0gaWYgd2UgZ2V0IGEgc3RhbGUgdmFsdWUgZm9yCisgICAgICAgIC8vICAqIHVzZVNoYXJlZCB0aGVuIHRoZXJlIGlzIG5vIGZvdWwgYmVsb3csIGJ1dCB0aG9zZSB0aGF0IHN5bmMgb24gdGhlCisgICAgICAgIC8vICAqIGxvY2sgbXVzdCBzZWUgdGhlIHJpZ2h0IHZhbHVlLgorICAgICAgICAvLyAgKi8KKyAgICAgICAgLy8gaWYgKHV0ZlNpemUgPD0gTUFYX0JVRl9TSVpFICYmIHVzZVNoYXJlZCkgeworICAgICAgICAvLyAgICAgc3luY2hyb25pemVkIChjYWNoZUxvY2spIHsKKyAgICAgICAgLy8gICAgICAgICBpZiAodXNlU2hhcmVkKSB7CisgICAgICAgIC8vICAgICAgICAgICAgIHVzZVNoYXJlZCA9IGZhbHNlOworICAgICAgICAvLyAgICAgICAgICAgICBtYWtlQnVmID0gZmFsc2U7CisgICAgICAgIC8vICAgICAgICAgfQorICAgICAgICAvLyAgICAgfQorICAgICAgICAvLyB9CisgICAgICAgIC8vIGlmIChtYWtlQnVmKSB7CisgICAgICAgIC8vICAgICBidWYgPSBuZXcgYnl0ZVt1dGZTaXplXTsKKyAgICAgICAgLy8gICAgIG91dCA9IG5ldyBjaGFyW3V0ZlNpemVdOworICAgICAgICAvLyB9IGVsc2UgeworICAgICAgICAvLyAgICAgLyoKKyAgICAgICAgLy8gICAgICAqIE5lZWQgdG8gJ3NhbXBsZScgYnl0ZUJ1ZiBhbmQgY2hhckJ1ZiBiZWZvcmUgdXNpbmcgdGhlbSBiZWNhdXNlCisgICAgICAgIC8vICAgICAgKiB0aGV5IGFyZSBub3QgcHJvdGVjdGVkIGJ5IHRoZSBjYWNoZUxvY2suIFRoZXkgbWF5IGdldCBvdXQgb2Ygc3luYworICAgICAgICAvLyAgICAgICogd2l0aCB0aGUgc3RhdGljIGFuZCBvbmUgYW5vdGhlciwgYnV0IHRoYXQgaXMgb2sgYmVjYXVzZSB3ZQorICAgICAgICAvLyAgICAgICogZXhwbGljaXRseSBjaGVjayBhbmQgZml4IHRoZWlyIGxlbmd0aCBhZnRlciBzYW1wbGluZy4KKyAgICAgICAgLy8gICAgICAqLworICAgICAgICAvLyAgICAgYnVmID0gYnl0ZUJ1ZjsKKyAgICAgICAgLy8gICAgIGlmIChidWYubGVuZ3RoIDwgdXRmU2l6ZSkgeworICAgICAgICAvLyAgICAgICAgIGJ1ZiA9IGJ5dGVCdWYgPSBuZXcgYnl0ZVt1dGZTaXplXTsKKyAgICAgICAgLy8gICAgIH0KKyAgICAgICAgLy8gICAgIG91dCA9IGNoYXJCdWY7CisgICAgICAgIC8vICAgICBpZiAob3V0Lmxlbmd0aCA8IHV0ZlNpemUpIHsKKyAgICAgICAgLy8gICAgICAgICBvdXQgPSBjaGFyQnVmID0gbmV3IGNoYXJbdXRmU2l6ZV07CisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVt1dGZTaXplXTsKICAgICAgICAgY2hhcltdIG91dCA9IG5ldyBjaGFyW3V0ZlNpemVdOwotLy8gRU5EIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgcmVhZEZ1bGx5KGJ1ZiwgMCwgdXRmU2l6ZSk7CiAgICAgICAgIFN0cmluZyByZXN1bHQ7CiAgICAgICAgIHJlc3VsdCA9IFV0aWwuY29udmVydFVURjhXaXRoQnVmKGJ1Ziwgb3V0LCAwLCB1dGZTaXplKTsKLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgICAgICAgIGlmICghbWFrZUJ1ZikgewotLy8gICAgICAgICAgIC8qCi0vLyAgICAgICAgICAgICogRG8gbm90IHN5bmNocm9uaXplIHVzZVNoYXJlZCBvbiBjYWNoZUxvY2ssIGl0IHdpbGwgbWFrZSBpdCBiYWNrCi0vLyAgICAgICAgICAgICogdG8gbWFpbiBzdG9yYWdlIGF0IHNvbWUgcG9pbnQsIGFuZCBubyBoYXJtIHVudGlsIGl0IGRvZXMuCi0vLyAgICAgICAgICAgICovCi0vLyAgICAgICAgICAgdXNlU2hhcmVkID0gdHJ1ZTsKLS8vICB9Ci0vL0VORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGlmICghbWFrZUJ1ZikgeworICAgICAgICAvLyAgICAgLyoKKyAgICAgICAgLy8gICAgICAqIERvIG5vdCBzeW5jaHJvbml6ZSB1c2VTaGFyZWQgb24gY2FjaGVMb2NrLCBpdCB3aWxsIG1ha2UgaXQgYmFjaworICAgICAgICAvLyAgICAgICogdG8gbWFpbiBzdG9yYWdlIGF0IHNvbWUgcG9pbnQsIGFuZCBubyBoYXJtIHVudGlsIGl0IGRvZXMuCisgICAgICAgIC8vICAgICAgKi8KKyAgICAgICAgLy8gICAgIHVzZVNoYXJlZCA9IHRydWU7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy9FTkQgYW5kcm9pZC1yZW1vdmVkCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBVVEYgZm9ybWF0IFN0cmluZyBmcm9tIHRoZSBEYXRhSW5wdXQgU3RyZWFtIDxjb2RlPmluPC9jb2RlPi4KKyAgICAgKiBSZWFkcyBhIHN0cmluZyBlbmNvZGVkIGluIHtAbGluayBEYXRhSW5wdXQgbW9kaWZpZWQgVVRGLTh9IGZyb20gdGhlCisgICAgICoge0Bjb2RlIERhdGFJbnB1dH0gc3RyZWFtIHtAY29kZSBpbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGluCi0gICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQotICAgICAqIEByZXR1cm4gdGhlIG5leHQgVVRGIFN0cmluZyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHJldHVybiB0aGUgbmV4dCB7QGxpbmsgRGF0YUlucHV0IE1VVEYtOH0gZW5jb2RlZCBzdHJpbmcgZnJvbSB0aGUgc291cmNlCisgICAgICogICAgICAgICBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZVVURihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YU91dHB1dFN0cmVhbSN3cml0ZVVURihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlYWRVVEYoRGF0YUlucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gaW4ucmVhZFVURigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBzdHJlYW0uIFN1YnNlcXVlbnQKLSAgICAgKiA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzIHVubGVzcwotICAgICAqIDxjb2RlPnJlc2V0KCk8L2NvZGU+IGlzIHVzZWQuCisgICAgICogU2tpcHMge0Bjb2RlIGNvdW50fSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBzdHJlYW0uIFN1YnNlcXVlbnQge0Bjb2RlCisgICAgICogcmVhZCgpfXMgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzIHVubGVzcyB7QGNvZGUgcmVzZXQoKX0gaXMgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB0aHJvdyBhbiB7QGxpbmsgRU9GRXhjZXB0aW9ufSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHtAY29kZSBjb3VudH0gYnl0ZXMgd2hlcmUgc2tpcHBlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY291bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHNraXBwaW5nLgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IHNraXBCeXRlcyhpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBza2lwcGVkID0gMDsKQEAgLTUyNyw5ICs1NzUsMTEgQEAKICAgICAgICAgd2hpbGUgKHNraXBwZWQgPCBjb3VudCAmJiAoc2tpcCA9IGluLnNraXAoY291bnQgLSBza2lwcGVkKSkgIT0gMCkgewogICAgICAgICAgICAgc2tpcHBlZCArPSBza2lwOwogICAgICAgICB9Ci0gICAgICAgIGlmIChza2lwcGVkIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOwotICAgICAgICB9CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBpZiAoc2tpcHBlZCA8IDApIHsKKyAgICAgICAgLy8gICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAgICAgICAgIHJldHVybiBza2lwcGVkOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0RhdGFPdXRwdXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0RhdGFPdXRwdXQuamF2YQppbmRleCA5ZmJjM2RiLi5kMDI4YTE4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9EYXRhT3V0cHV0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRGF0YU91dHB1dC5qYXZhCkBAIC0xOCwyMTggKzE4LDIxMSBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIERhdGFPdXRwdXQgaXMgYW4gaW50ZXJmYWNlIHdoaWNoIGRlY2xhcmVzIG1ldGhvZHMgZm9yIHdyaXRpbmcgdHlwZWQgZGF0YSB0byBhCi0gKiBTdHJlYW0uIFR5cGljYWxseSwgdGhpcyBzdHJlYW0gY2FuIGJlIHJlYWQgaW4gYnkgYSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzCisgKiBEZWZpbmVzIGFuIGludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IGFyZSBhYmxlIHRvIHdyaXRlIHR5cGVkIGRhdGEgdG8gc29tZQorICogdGFyZ2V0LiBUeXBpY2FsbHksIHRoaXMgZGF0YSBjYW4gYmUgcmVhZCBpbiBieSBhIGNsYXNzIHdoaWNoIGltcGxlbWVudHMKICAqIERhdGFJbnB1dC4gVHlwZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbmNsdWRlIGJ5dGUsIDE2LWJpdCBzaG9ydCwgMzItYml0IGludCwKLSAqIDMyLWJpdCBmbG9hdCwgNjQtYml0IGxvbmcsIDY0LWJpdCBkb3VibGUsIGJ5dGUgc3RyaW5ncywgYW5kIFVURiBTdHJpbmdzLgorICogMzItYml0IGZsb2F0LCA2NC1iaXQgbG9uZywgNjQtYml0IGRvdWJsZSwgYnl0ZSBzdHJpbmdzLCBhbmQge0BsaW5rIERhdGFJbnB1dAorICogTVVURi04fSBlbmNvZGVkIHN0cmluZ3MuCiAgKiAKICAqIEBzZWUgRGF0YU91dHB1dFN0cmVhbQogICogQHNlZSBSYW5kb21BY2Nlc3NGaWxlCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERhdGFPdXRwdXQgewogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiB0byB0aGUKLSAgICAgKiBPdXRwdXRTdHJlYW0uCisgICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gdG8gdGhpcworICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZy4KICAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkRnVsbHkoYnl0ZVtdKQogICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKGJ5dGUgYnVmZmVyW10pIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gY2hhbmdlZCBhcnJheSBub3RhdGlvbiB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgaGFybW9ueQorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gPGNvZGU+Ynl0ZXM8L2NvZGU+IGZyb20gdGhlIGJ5dGUgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT5pbmRleDwvY29kZT4gdG8gdGhlCi0gICAgICogT3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQKKyAgICAgKiBvZmZzZXQge0Bjb2RlIGluZGV4fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZmZlciB0byBnZXQgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZS4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZy4KICAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkRnVsbHkoYnl0ZVtdKQogICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKGJ5dGUgYnVmZmVyW10sIGludCBvZmZzZXQsIGludCBjb3VudCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+Ynl0ZTwvY29kZT4gdG8gdGhlIE91dHB1dFN0cmVhbS4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCA4LWJpdCBieXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvbmVCeXRlCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nLgogICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRCeXRlKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShpbnQgb25lQnl0ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgYm9vbGVhbiB0byB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nLgogICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRCb29sZWFuKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJvb2xlYW4oYm9vbGVhbiB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIDgtYml0IGJ5dGUgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIDgtYml0IGJ5dGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIE91dHB1dFN0cmVhbQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdmFsdWUgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZy4KICAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkQnl0ZSgpCiAgICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZFVuc2lnbmVkQnl0ZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVCeXRlKGludCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbG93IG9yZGVyIDgtYml0IGJ5dGVzIGZyb20gYSBTdHJpbmcgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgbG93IG9yZGVyIDgtYml0IGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyBjb250YWluaW5nIHRoZSBieXRlcyB0byB3cml0ZSB0byB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcuCiAgICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEZ1bGx5KGJ5dGVbXSkKICAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkRnVsbHkoYnl0ZVtdLGludCxpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVCeXRlcyhTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAxNi1iaXQgY2hhcmFjdGVyIHRvIHRoZSBPdXRwdXRTdHJlYW0uIE9ubHkgdGhlIGxvd2VyCi0gICAgICogMiBieXRlcyBhcmUgd3JpdHRlbiB3aXRoIHRoZSBoaWdoZXIgb2YgdGhlIDIgYnl0ZXMgd3JpdHRlbiBmaXJzdC4gVGhpcwotICAgICAqIHJlcHJlc2VudHMgdGhlIFVuaWNvZGUgdmFsdWUgb2YgdmFsLgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIDE2LWJpdCBjaGFyYWN0ZXIuIE9ubHkgdGhlIHR3byBsZWFzdCBzaWduaWZpY2FudAorICAgICAqIGJ5dGVzIG9mIHRoZSBpbnRlZ2VyIHtAY29kZSBvbmVCeXRlfSBhcmUgd3JpdHRlbiwgd2l0aCB0aGUgaGlnaGVyIG9uZQorICAgICAqIHdyaXR0ZW4gZmlyc3QuIFRoaXMgcmVwcmVzZW50cyB0aGUgVW5pY29kZSB2YWx1ZSBvZiB0aGUgY2hhci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb25lQnl0ZQotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogQHBhcmFtIHZhbAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nLgogICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRDaGFyKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUNoYXIoaW50IG9uZUJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUNoYXIoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIHJlbmFtZWQgcGFyYW1ldGVyIGJlY2F1c2UgaXQgd2FzIG1pc2xlYWRpbmcKKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAxNi1iaXQgY2hhcmFjdGVycyBjb250YWluZWQgaW4gc3RyIHRvIHRoZQotICAgICAqIE91dHB1dFN0cmVhbS4gT25seSB0aGUgbG93ZXIgMiBieXRlcyBvZiBlYWNoIGNoYXJhY3RlciBhcmUgd3JpdHRlbiB3aXRoCi0gICAgICogdGhlIGhpZ2hlciBvZiB0aGUgMiBieXRlcyB3cml0dGVuIGZpcnN0LiBUaGlzIHJlcHJlc2VudHMgdGhlIFVuaWNvZGUKLSAgICAgKiB2YWx1ZSBvZiBlYWNoIGNoYXJhY3RlciBpbiBzdHIuCisgICAgICogV3JpdGVzIHRoZSAxNi1iaXQgY2hhcmFjdGVycyBjb250YWluZWQgaW4ge0Bjb2RlIHN0cn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB3aG9zZSBjaGFyYWN0ZXJzIGFyZSB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcuCiAgICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZENoYXIoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQ2hhcnMoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgNjQtYml0IGRvdWJsZSB0byB0aGlzIG91dHB1dCBzdHJlYW0uIFRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHRoZQotICAgICAqIDggYnl0ZXMgcmVzdWx0aW5nIGZyb20gY2FsbGluZyBEb3VibGUuZG91YmxlVG9Mb25nQml0cygpLgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIDY0LWJpdCBkb3VibGUuIFRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHRoZSBlaWdodAorICAgICAqIGJ5dGVzIHJldHVybmVkIGJ5IHtAbGluayBEb3VibGUjZG91YmxlVG9Mb25nQml0cyhkb3VibGUpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcuCiAgICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZERvdWJsZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgMzItYml0IGZsb2F0IHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4gVGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgdGhlCi0gICAgICogNCBieXRlcyByZXN1bHRpbmcgZnJvbSBjYWxsaW5nIEZsb2F0LmZsb2F0VG9JbnRCaXRzKCkuCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgMzItYml0IGZsb2F0LiBUaGUgcmVzdWx0aW5nIG91dHB1dCBpcyB0aGUgZm91ciBieXRlcworICAgICAqIHJldHVybmVkIGJ5IHtAbGluayBGbG9hdCNmbG9hdFRvSW50Qml0cyhmbG9hdCl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcuCiAgICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEZsb2F0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUZsb2F0KGZsb2F0IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgMzItYml0IGludCB0byB0aGlzIG91dHB1dCBzdHJlYW0uIFRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHRoZSA0Ci0gICAgICogYnl0ZXMsIGhpZ2hlc3Qgb3JkZXIgZmlyc3QsIG9mIHZhbC4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAzMi1iaXQgaW50LiBUaGUgcmVzdWx0aW5nIG91dHB1dCBpcyB0aGUgZm91ciBieXRlcywKKyAgICAgKiBoaWdoZXN0IG9yZGVyIGZpcnN0LCBvZiB7QGNvZGUgdmFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgaW50IHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcuCiAgICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEludCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVJbnQoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgNjQtYml0IGxvbmcgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLiBUaGUgcmVzdWx0aW5nIG91dHB1dCBpcyB0aGUgOAotICAgICAqIGJ5dGVzLCBoaWdoZXN0IG9yZGVyIGZpcnN0LCBvZiB2YWwuCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgNjQtYml0IGxvbmcuIFRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHRoZSBlaWdodAorICAgICAqIGJ5dGVzLCBoaWdoZXN0IG9yZGVyIGZpcnN0LCBvZiB7QGNvZGUgdmFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZy4KICAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkTG9uZygpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMb25nKGxvbmcgdmFsKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAxNi1iaXQgc2hvcnQgdG8gdGhlIE91dHB1dFN0cmVhbS4gT25seSB0aGUgbG93ZXIgMgotICAgICAqIGJ5dGVzIGFyZSB3cml0dGVuIHdpdGggdGhlIGhpZ2hlciBvZiB0aGUgMiBieXRlcyB3cml0dGVuIGZpcnN0LgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIDE2LWJpdCBzaG9ydC4gT25seSB0aGUgbG93ZXIgdHdvIGJ5dGVzIG9mIHtAY29kZQorICAgICAqIHZhbH0gYXJlIHdyaXR0ZW4gd2l0aCB0aGUgaGlnaGVyIG9uZSB3cml0dGVuIGZpcnN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZy4KICAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkU2hvcnQoKQogICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRVbnNpZ25lZFNob3J0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVNob3J0KGludCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIFN0cmluZyBvdXQgaW4gVVRGIGZvcm1hdC4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgZW5jb2RlZCBpbiB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIGJlIHdyaXR0ZW4gaW4gVVRGIGZvcm1hdC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gd3JpdGUgZW5jb2RlZCBpbiB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nLgogICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRVVEYoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlVVRGKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0RhdGFPdXRwdXRTdHJlYW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0RhdGFPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlNzg0ODY4Li43ZjQ1YzU4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9EYXRhT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRGF0YU91dHB1dFN0cmVhbS5qYXZhCkBAIC0yMCwzNyArMjAsNDUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBEYXRhT3V0cHV0U3RyZWFtIGlzIGEgZmlsdGVyIGNsYXNzIHdoaWNoIGNhbiB3cml0ZSB0eXBlZCBkYXRhIHRvIGEgU3RyZWFtLgotICogVHlwaWNhbGx5LCB0aGlzIHN0cmVhbSBjYW4gYmUgcmVhZCBpbiBieSBhIERhdGFJbnB1dFN0cmVhbS4gVHlwZXMgdGhhdCBjYW4gYmUKKyAqIFdyYXBzIGFuIGV4aXN0aW5nIHtAbGluayBPdXRwdXRTdHJlYW19IGFuZCB3cml0ZXMgdHlwZWQgZGF0YSB0byBpdC4KKyAqIFR5cGljYWxseSwgdGhpcyBzdHJlYW0gY2FuIGJlIHJlYWQgaW4gYnkgRGF0YUlucHV0U3RyZWFtLiBUeXBlcyB0aGF0IGNhbiBiZQogICogd3JpdHRlbiBpbmNsdWRlIGJ5dGUsIDE2LWJpdCBzaG9ydCwgMzItYml0IGludCwgMzItYml0IGZsb2F0LCA2NC1iaXQgbG9uZywKLSAqIDY0LWJpdCBkb3VibGUsIGJ5dGUgc3RyaW5ncywgYW5kIFVURiBTdHJpbmdzLgorICogNjQtYml0IGRvdWJsZSwgYnl0ZSBzdHJpbmdzLCBhbmQge0BsaW5rIERhdGFJbnB1dCBNVVRGLTh9IGVuY29kZWQgc3RyaW5ncy4KICAqIAogICogQHNlZSBEYXRhSW5wdXRTdHJlYW0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEYXRhT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgRGF0YU91dHB1dCB7CiAKLSAgICAvKiogVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG91dCBzbyBmYXIgKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3V0IHNvIGZhci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHdyaXR0ZW47CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERhdGFPdXRwdXRTdHJlYW0gb24gdGhlIE91dHB1dFN0cmVhbSA8Y29kZT5vdXQ8L2NvZGU+LgotICAgICAqIEFsbCB3cml0ZXMgY2FuIG5vdyBiZSBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLiBOb3RlIHRoYXQgZGF0YQotICAgICAqIHdyaXR0ZW4gYnkgdGhpcyBTdHJlYW0gaXMgbm90IGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybWF0IGJ1dCBjYW4gYmUKLSAgICAgKiByZWNvbnN0cnVjdGVkIGJ5IHVzaW5nIGEgRGF0YUlucHV0U3RyZWFtIG9uIHRoZSByZXN1bHRpbmcgb3V0cHV0LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERhdGFPdXRwdXRTdHJlYW19IG9uIHRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfQorICAgICAqIHtAY29kZSBvdXR9LiBOb3RlIHRoYXQgZGF0YSB3cml0dGVuIGJ5IHRoaXMgc3RyZWFtIGlzIG5vdCBpbiBhIGh1bWFuCisgICAgICogcmVhZGFibGUgZm9ybSBidXQgY2FuIGJlIHJlY29uc3RydWN0ZWQgYnkgdXNpbmcgYSB7QGxpbmsgRGF0YUlucHV0U3RyZWFtfQorICAgICAqIG9uIHRoZSByZXN1bHRpbmcgb3V0cHV0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIHRvIGZpbHRlciB3cml0ZXMgb24uCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHN0cmVhbSBmb3Igd3JpdGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CiAgICAgICAgIHN1cGVyKG91dCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmx1c2ggdGhpcyBEYXRhT3V0cHV0U3RyZWFtIHRvIGVuc3VyZSBhbGwgcGVuZGluZyBkYXRhIGlzIHNlbnQgb3V0IHRvIHRoZQotICAgICAqIHRhcmdldCBPdXRwdXRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gZmx1c2hlcyB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbS4KKyAgICAgKiBGbHVzaGVzIHRoaXMgc3RyZWFtIHRvIGVuc3VyZSBhbGwgcGVuZGluZyBkYXRhIGlzIHNlbnQgb3V0IHRvIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gdGhlbiBhbHNvIGZsdXNoZXMgdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoaXMgRGF0YU91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01OCw5ICs2NiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoaXMgc3RyZWFtIHRodXMgZmFyLgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSB0YXJnZXQgc3RyZWFtIHNvIGZhci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGlzIERhdGFPdXRwdXRTdHJlYW0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBzaXplKCkgewogICAgICAgICBpZiAod3JpdHRlbiA8IDApIHsKQEAgLTcwLDI2ICs3OSwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gPGNvZGU+Ynl0ZXM8L2NvZGU+IGZyb20gdGhlIGJ5dGUgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT5pbmRleDwvY29kZT4gdG8gdGhlCi0gICAgICogT3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQKKyAgICAgKiB7QGNvZGUgb2Zmc2V0fSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZmZlciB0byBnZXQgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZS4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRGdWxseShieXRlW10pCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEZ1bGx5KGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZmZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2VlIERhdGFJbnB1dFN0cmVhbSNyZWFkRnVsbHkoYnl0ZVtdKQorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYnVmZmVyW10sIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtOTgsMTYgKzEwOSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPmJ5dGU8L2NvZGU+IHRvIHRoZSBPdXRwdXRTdHJlYW0uCisgICAgICogV3JpdGVzIGEgYnl0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gT25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZgorICAgICAqIHRoZSBpbnRlZ2VyIHtAY29kZSBvbmVCeXRlfSBpcyB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvbmVCeXRlCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEJ5dGUoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRCeXRlKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgb25lQnl0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTExNiwxNiArMTI2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgYm9vbGVhbiB0byB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgYm9vbGVhbiB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEJvb2xlYW4oKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRCb29sZWFuKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJvb2xlYW4oYm9vbGVhbiB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG91dC53cml0ZSh2YWwgPyAxIDogMCk7CkBAIC0xMzMsMTcgKzE0MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIDgtYml0IGJ5dGUgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlcyBhbiA4LWJpdCBieXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBPbmx5IHRoZSBsZWFzdCBzaWduaWZpY2FudAorICAgICAqIGJ5dGUgb2YgdGhlIGludGVnZXIge0Bjb2RlIHZhbH0gaXMgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEJ5dGUoKQotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRVbnNpZ25lZEJ5dGUoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRCeXRlKCkKKyAgICAgKiBAc2VlIERhdGFJbnB1dFN0cmVhbSNyZWFkVW5zaWduZWRCeXRlKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGUoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgb3V0LndyaXRlKHZhbCk7CkBAIC0xNTEsMTcgKzE1OCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbG93IG9yZGVyIDgtYml0IGJ5dGVzIGZyb20gYSBTdHJpbmcgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgbG93IG9yZGVyIGJ5dGVzIGZyb20gYSBzdHJpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyBjb250YWluaW5nIHRoZSBieXRlcyB0byB3cml0ZSB0byB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkRnVsbHkoYnl0ZVtdKQotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRGdWxseShieXRlW10saW50LGludCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlIERhdGFJbnB1dFN0cmVhbSNyZWFkRnVsbHkoYnl0ZVtdKQorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10saW50LGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGVzKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdHIubGVuZ3RoKCkgPT0gMCkgewpAQCAtMTc2LDE4ICsxODEsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAxNi1iaXQgY2hhcmFjdGVyIHRvIHRoZSBPdXRwdXRTdHJlYW0uIE9ubHkgdGhlIGxvd2VyCi0gICAgICogMiBieXRlcyBhcmUgd3JpdHRlbiB3aXRoIHRoZSBoaWdoZXIgb2YgdGhlIDIgYnl0ZXMgd3JpdHRlbiBmaXJzdC4gVGhpcwotICAgICAqIHJlcHJlc2VudHMgdGhlIFVuaWNvZGUgdmFsdWUgb2YgdmFsLgorICAgICAqIFdyaXRlcyBhIDE2LWJpdCBjaGFyYWN0ZXIgdG8gdGhlIHRhcmdldCBzdHJlYW0uIE9ubHkgdGhlIHR3byBsb3dlciBieXRlcworICAgICAqIG9mIHRoZSBpbnRlZ2VyIHtAY29kZSB2YWx9IGFyZSB3cml0dGVuLCB3aXRoIHRoZSBoaWdoZXIgb25lIHdyaXR0ZW4KKyAgICAgKiBmaXJzdC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVW5pY29kZSB2YWx1ZSBvZiB7QGNvZGUgdmFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZENoYXIoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRDaGFyKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUNoYXIoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgb3V0LndyaXRlKHZhbCA+PiA4KTsKQEAgLTE5NiwxOSArMTk5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgMTYtYml0IGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHN0ciB0byB0aGUKLSAgICAgKiBPdXRwdXRTdHJlYW0uIE9ubHkgdGhlIGxvd2VyIDIgYnl0ZXMgb2YgZWFjaCBjaGFyYWN0ZXIgYXJlIHdyaXR0ZW4gd2l0aAotICAgICAqIHRoZSBoaWdoZXIgb2YgdGhlIDIgYnl0ZXMgd3JpdHRlbiBmaXJzdC4gVGhpcyByZXByZXNlbnRzIHRoZSBVbmljb2RlCi0gICAgICogdmFsdWUgb2YgZWFjaCBjaGFyYWN0ZXIgaW4gc3RyLgorICAgICAqIFdyaXRlcyB0aGUgMTYtYml0IGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHtAY29kZSBzdHJ9IHRvIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB3aG9zZSBjaGFyYWN0ZXJzIGFyZSB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZENoYXIoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRDaGFyKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUNoYXJzKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGUgbmV3Qnl0ZXNbXSA9IG5ldyBieXRlW3N0ci5sZW5ndGgoKSAqIDJdOwpAQCAtMjIyLDUxICsyMjIsNDUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSA2NC1iaXQgZG91YmxlIHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4gVGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgdGhlCi0gICAgICogOCBieXRlcyByZXN1bHRpbmcgZnJvbSBjYWxsaW5nIERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCkuCisgICAgICogV3JpdGVzIGEgNjQtYml0IGRvdWJsZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gVGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgdGhlCisgICAgICogZWlnaHQgYnl0ZXMgcmVzdWx0aW5nIGZyb20gY2FsbGluZyBEb3VibGUuZG91YmxlVG9Mb25nQml0cygpLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWREb3VibGUoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWREb3VibGUoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlTG9uZyhEb3VibGUuZG91YmxlVG9Mb25nQml0cyh2YWwpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSAzMi1iaXQgZmxvYXQgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLiBUaGUgcmVzdWx0aW5nIG91dHB1dCBpcyB0aGUKLSAgICAgKiA0IGJ5dGVzIHJlc3VsdGluZyBmcm9tIGNhbGxpbmcgRmxvYXQuZmxvYXRUb0ludEJpdHMoKS4KKyAgICAgKiBXcml0ZXMgYSAzMi1iaXQgZmxvYXQgdG8gdGhlIHRhcmdldCBzdHJlYW0uIFRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHRoZQorICAgICAqIGZvdXIgYnl0ZXMgcmVzdWx0aW5nIGZyb20gY2FsbGluZyBGbG9hdC5mbG9hdFRvSW50Qml0cygpLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkRmxvYXQoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRGbG9hdCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVGbG9hdChmbG9hdCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlSW50KEZsb2F0LmZsb2F0VG9JbnRCaXRzKHZhbCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIDMyLWJpdCBpbnQgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLiBUaGUgcmVzdWx0aW5nIG91dHB1dCBpcyB0aGUgNAotICAgICAqIGJ5dGVzLCBoaWdoZXN0IG9yZGVyIGZpcnN0LCBvZiB2YWwuCisgICAgICogV3JpdGVzIGEgMzItYml0IGludCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gVGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgdGhlCisgICAgICogZm91ciBieXRlcywgaGlnaGVzdCBvcmRlciBmaXJzdCwgb2Yge0Bjb2RlIHZhbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdGhlIGludCB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGludCB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZEludCgpCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSBEYXRhSW5wdXRTdHJlYW0jcmVhZEludCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVJbnQoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgb3V0LndyaXRlKHZhbCA+PiAyNCk7CkBAIC0yNzcsMTcgKzI3MSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIDY0LWJpdCBsb25nIHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4gVGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgdGhlIDgKLSAgICAgKiBieXRlcywgaGlnaGVzdCBvcmRlciBmaXJzdCwgb2YgdmFsLgorICAgICAqIFdyaXRlcyBhIDY0LWJpdCBsb25nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBUaGUgcmVzdWx0aW5nIG91dHB1dCBpcyB0aGUKKyAgICAgKiBlaWdodCBieXRlcywgaGlnaGVzdCBvcmRlciBmaXJzdCwgb2Yge0Bjb2RlIHZhbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkTG9uZygpCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSBEYXRhSW5wdXRTdHJlYW0jcmVhZExvbmcoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG9uZyhsb25nIHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVJbnQoKGludCkgKHZhbCA+PiAzMikpOwpAQCAtMjk1LDY1ICsyODcsNjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAxNi1iaXQgc2hvcnQgdG8gdGhlIE91dHB1dFN0cmVhbS4gT25seSB0aGUgbG93ZXIgMgotICAgICAqIGJ5dGVzIGFyZSB3cml0dGVuIHdpdGggdGhlIGhpZ2hlciBvZiB0aGUgMiBieXRlcyB3cml0dGVuIGZpcnN0LgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIDE2LWJpdCBzaG9ydCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gT25seSB0aGUgbG93ZXIKKyAgICAgKiB0d28gYnl0ZXMgb2YgdGhlIGludGVnZXIge0Bjb2RlIHZhbH0gYXJlIHdyaXR0ZW4sIHdpdGggdGhlIGhpZ2hlciBvbmUKKyAgICAgKiB3cml0dGVuIGZpcnN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRTaG9ydCgpCi0gICAgICogQHNlZSBEYXRhSW5wdXQjcmVhZFVuc2lnbmVkU2hvcnQoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgRGF0YUlucHV0U3RyZWFtI3JlYWRTaG9ydCgpCisgICAgICogQHNlZSBEYXRhSW5wdXRTdHJlYW0jcmVhZFVuc2lnbmVkU2hvcnQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU2hvcnQoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVDaGFyKHZhbCk7CiAgICAgfQogICAgIAotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZfU0laRSA9IDgxOTI7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgU3RyaW5nIG91dCBpbiBVVEYgZm9ybWF0LgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGVuY29kZWQgaW4ge0BsaW5rIERhdGFJbnB1dCBtb2RpZmllZCBVVEYtOH0gdG8gdGhpcworICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIGJlIHdyaXR0ZW4gaW4gVVRGIGZvcm1hdC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0gZW5jb2RlZCBpbgorICAgICAqICAgICAgICAgICAge0BsaW5rIERhdGFJbnB1dCBtb2RpZmllZCBVVEYtOH0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRVVEYoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBpcyBsb25nZXIgdGhhbiA2NTUzNSBieXRlcy4KKyAgICAgKiBAc2VlIERhdGFJbnB1dFN0cmVhbSNyZWFkVVRGKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVURihTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAobGVuZ3RoIDw9IE1BWF9CVUZfU0laRSAvIDMpIHsKLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIGludCBzaXplID0gbGVuZ3RoICogMzsKLSAgICAgICAgICAgIGJ5dGVbXSB1dGZCeXRlczsKLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgICAgICAgICBib29sZWFuIG1ha2VCdWYgPSB0cnVlOwotLy8gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERhdGFJbnB1dFN0cmVhbS5ieXRlQnVmKSB7Ci0vLyAgICAgICAgICAgICAgICBpZiAoRGF0YUlucHV0U3RyZWFtLnVzZVNoYXJlZCkgewotLy8gICAgICAgICAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbS51c2VTaGFyZWQgPSBmYWxzZTsKLS8vICAgICAgICAgICAgICAgICAgICBtYWtlQnVmID0gZmFsc2U7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgaWYgKG1ha2VCdWYpIHsKLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKLSAgICAgICAgICAgICAgIHV0ZkJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgIGlmIChEYXRhSW5wdXRTdHJlYW0uYnl0ZUJ1Zi5sZW5ndGggPCBzaXplKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtLmJ5dGVCdWYgPSBuZXcgYnl0ZVtzaXplXTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIHV0ZkJ5dGVzID0gRGF0YUlucHV0U3RyZWFtLmJ5dGVCdWY7Ci0vLyAgICAgICAgICAgIH0KLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgICAgIGJ5dGVbXSB1dGZCeXRlcyA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgLy8gYm9vbGVhbiBtYWtlQnVmID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplZCAoRGF0YUlucHV0U3RyZWFtLmJ5dGVCdWYpIHsKKyAgICAgICAgICAgIC8vICAgICBpZiAoRGF0YUlucHV0U3RyZWFtLnVzZVNoYXJlZCkgeworICAgICAgICAgICAgLy8gICAgICAgICBEYXRhSW5wdXRTdHJlYW0udXNlU2hhcmVkID0gZmFsc2U7CisgICAgICAgICAgICAvLyAgICAgICAgIG1ha2VCdWYgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vICAgICB9CisgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICAvLyBpZiAobWFrZUJ1ZikgeworICAgICAgICAgICAgLy8gICAgIHV0ZkJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICAvLyB9IGVsc2UgeworICAgICAgICAgICAgLy8gICAgIGlmIChEYXRhSW5wdXRTdHJlYW0uYnl0ZUJ1Zi5sZW5ndGggPCBzaXplKSB7CisgICAgICAgICAgICAvLyAgICAgICAgIERhdGFJbnB1dFN0cmVhbS5ieXRlQnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICAvLyAgICAgfQorICAgICAgICAgICAgLy8gICAgIHV0ZkJ5dGVzID0gRGF0YUlucHV0U3RyZWFtLmJ5dGVCdWY7CisgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICBpbnQgdXRmSW5kZXggPSAwOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIGludCBjaGFyVmFsdWUgPSBzdHIuY2hhckF0KGkpOwpAQCAtMzcwLDExICszNTgsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgd3JpdGVTaG9ydCh1dGZJbmRleCk7CiAgICAgICAgICAgICB3cml0ZSh1dGZCeXRlcywgMCwgdXRmSW5kZXgpOwotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICAgICAgICAgIGlmICghbWFrZUJ1ZikgewotLy8gICAgICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtLnVzZVNoYXJlZCA9IHRydWU7Ci0vLyAgICAgICAgICAgIH0KLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgICAgIC8vIGlmICghbWFrZUJ1ZikgeworICAgICAgICAgICAgLy8gICAgIERhdGFJbnB1dFN0cmVhbS51c2VTaGFyZWQgPSB0cnVlOworICAgICAgICAgICAgLy8gfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9uZyB1dGZDb3VudDsKICAgICAgICAgICAgIGlmIChsZW5ndGggPD0gNjU1MzUgJiYgKHV0ZkNvdW50ID0gY291bnRVVEZCeXRlcyhzdHIpKSA8PSA2NTUzNSkgewpAQCAtMzg0LDYgKzM3MCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNjgiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgbG9uZyBjb3VudFVURkJ5dGVzKFN0cmluZyBzdHIpIHsKQEAgLTQwNCwzNiArMzkxLDMzIEBACiAgICAgdm9pZCB3cml0ZVVURkJ5dGVzKFN0cmluZyBzdHIsIGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJvb2xlYW4gc2luZ2xlID0gdHJ1ZTsKICAgICAgICAgaW50IHNpemUgPSAoaW50KSBjb3VudDsKLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGNvdW50ID4gTUFYX0JVRl9TSVpFKSB7Ci0vLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBzaW5nbGUgPSBmYWxzZTsKLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgc2l6ZSA9IE1BWF9CVUZfU0laRTsKLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQotICAgICAgICBieXRlW10gdXRmQnl0ZXM7Ci0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgICAgICAgICAgIGJvb2xlYW4gbWFrZUJ1ZiA9IHRydWU7Ci0vLyAgICAgICAgICAgICBpZiAoRGF0YUlucHV0U3RyZWFtLnVzZVNoYXJlZCkgewotLy8gICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoRGF0YUlucHV0U3RyZWFtLmNhY2hlTG9jaykgewotLy8gICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YUlucHV0U3RyZWFtLnVzZVNoYXJlZCkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtLnVzZVNoYXJlZCA9IGZhbHNlOwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUJ1ZiA9IGZhbHNlOwotLy8gICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgaWYgKG1ha2VCdWYpIHsKLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKLSAgICAgICAgICAgICAgICAgdXRmQnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgICAvLyBieXRlQnVmIGlzIG5vdCBwcm90ZWN0ZWQgYnkgdGhlIGNhY2hlTG9jaywgc28gc2FtcGxlIGl0IGZpcnN0Ci0vLyAgICAgICAgICAgICAgICAgdXRmQnl0ZXMgPSBEYXRhSW5wdXRTdHJlYW0uYnl0ZUJ1ZjsKLS8vICAgICAgICAgICAgICAgICBpZiAodXRmQnl0ZXMubGVuZ3RoIDwgc2l6ZSkgewotLy8gICAgICAgICAgICAgICAgICAgICB1dGZCeXRlcyA9IERhdGFJbnB1dFN0cmVhbS5ieXRlQnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0vLyAgICAgICAgICAgICAgICAgfQotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICBieXRlW10gdXRmQnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgLy8gYm9vbGVhbiBtYWtlQnVmID0gdHJ1ZTsKKyAgICAgICAgLy8gaWYgKERhdGFJbnB1dFN0cmVhbS51c2VTaGFyZWQpIHsKKyAgICAgICAgLy8gICAgIHN5bmNocm9uaXplZCAoRGF0YUlucHV0U3RyZWFtLmNhY2hlTG9jaykgeworICAgICAgICAvLyAgICAgICAgIGlmIChEYXRhSW5wdXRTdHJlYW0udXNlU2hhcmVkKSB7CisgICAgICAgIC8vICAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbS51c2VTaGFyZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gICAgICAgICAgICAgbWFrZUJ1ZiA9IGZhbHNlOworICAgICAgICAvLyAgICAgICAgIH0KKyAgICAgICAgLy8gICAgIH0KKyAgICAgICAgLy8gfQorICAgICAgICAvLyBpZiAobWFrZUJ1ZikgeworICAgICAgICAvLyAgICAgdXRmQnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgLy8gfSBlbHNlIHsKKyAgICAgICAgLy8gICAgIC8vIGJ5dGVCdWYgaXMgbm90IHByb3RlY3RlZCBieSB0aGUgY2FjaGVMb2NrLCBzbyBzYW1wbGUgaXQgZmlyc3QKKyAgICAgICAgLy8gICAgIHV0ZkJ5dGVzID0gRGF0YUlucHV0U3RyZWFtLmJ5dGVCdWY7CisgICAgICAgIC8vICAgICBpZiAodXRmQnl0ZXMubGVuZ3RoIDwgc2l6ZSkgeworICAgICAgICAvLyAgICAgICAgIHV0ZkJ5dGVzID0gRGF0YUlucHV0U3RyZWFtLmJ5dGVCdWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgLy8gICAgIH0KKyAgICAgICAgLy8gfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAKICAgICAgICAgaW50IHV0ZkluZGV4ID0gMCwgaSA9IDAsIGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKICAgICAgICAgaW50IGVuZCA9IGxlbmd0aDsKQEAgLTQ2OSwxMiArNDUzLDEyIEBACiAgICAgICAgIGlmICh1dGZJbmRleCA+IDApIHsKICAgICAgICAgICAgIHdyaXRlKHV0ZkJ5dGVzLCAwLCB1dGZJbmRleCk7CiAgICAgICAgIH0KLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgICAgIGlmICghbWFrZUJ1ZikgewotLy8gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHVzZVNoYXJlZCBmbGFnIG9wdGltaXN0aWNhbGx5IChzZWUgRGF0YUlucHV0U3RyZWFtCi0vLyAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQpCi0vLyAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbS51c2VTaGFyZWQgPSB0cnVlOwotLy8gICAgICAgIH0KLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGlmICghbWFrZUJ1ZikgeworICAgICAgICAvLyAgICAgLy8gVXBkYXRlIHRoZSB1c2VTaGFyZWQgZmxhZyBvcHRpbWlzdGljYWxseSAoc2VlIERhdGFJbnB1dFN0cmVhbQorICAgICAgICAvLyAgICAgLy8gZXF1aXZhbGVudCkKKyAgICAgICAgLy8gICAgIERhdGFJbnB1dFN0cmVhbS51c2VTaGFyZWQgPSB0cnVlOworICAgICAgICAvLyB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9FT0ZFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0VPRkV4Y2VwdGlvbi5qYXZhCmluZGV4IDY3NzRiMzQuLjQwYmVhZGQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0VPRkV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0VPRkV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyNyArMTgsMzEgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBUaGlzIEVuZCBPZiBGaWxlIChFT0YpIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIHByb2dyYW0gZW5jb3VudGVycyB0aGUgZW5kCi0gKiBvZiBhIGZpbGUgb3Igc3RyZWFtIGR1cmluZyBhbiBvcGVyYXRpb24uCisgKiBUaHJvd24gd2hlbiBhIHByb2dyYW0gZW5jb3VudGVycyB0aGUgZW5kIG9mIGEgZmlsZSBvciBzdHJlYW0gZHVyaW5nIGFuIGlucHV0CisgKiBvcGVyYXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRU9GRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjQzMzg1ODIyMzc3NDg4Njk3N0w7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEVPRkV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UgZmlsbGVkIGluLgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFT0ZFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEVPRkV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UgYW5kIGRldGFpbAorICAgICAqIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFT0ZFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9FeHRlcm5hbGl6YWJsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRXh0ZXJuYWxpemFibGUuamF2YQppbmRleCAzNTBhZTViLi4wMzA0OWViIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9FeHRlcm5hbGl6YWJsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0V4dGVybmFsaXphYmxlLmphdmEKQEAgLTE4LDIxICsxOCwyMiBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIE9iamVjdHMgdGhhdCB3YW50IHRvIGJlIHNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkIHVzaW5nCi0gKiBPYmplY3RPdXRwdXRTdHJlYW0vT2JqZWN0SW5wdXRTdHJlYW0gYnV0IGRlZmluaW5nIHRoZWlyIG93biBieXRlCi0gKiByZXByZXNlbnRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgorICogRGVmaW5lcyBhbiBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCB3YW50IHRvIGJlIHNlcmlhbGl6YWJsZSwgYnV0IGhhdmUgdGhlaXIKKyAqIG93biBiaW5hcnkgcmVwcmVzZW50YXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEV4dGVybmFsaXphYmxlIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgT2JqZWN0SW5wdXQgPGNvZGU+aW5wdXQ8L2NvZGU+CisgICAgICogUmVhZHMgdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIE9iamVjdElucHV0IDxjb2RlPmlucHV0PC9jb2RlPi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3RJbnB1dCBmcm9tIHdoaWNoIHRoZSBuZXh0IG9iamVjdCBpcyByZWFkCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0SW5wdXQgZnJvbSB3aGljaCB0aGUgbmV4dCBvYmplY3QgaXMgcmVhZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoaXMgT2JqZWN0SW5wdXQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHtAY29kZSBpbnB1dH0uCiAgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBiZWluZyBsb2FkZWQgY2Fubm90IGJlIGZvdW5kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBiZWluZyBsb2FkZWQgY2Fubm90IGJlIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTQxLDEwICs0MiwxMCBAQAogICAgICAqIFdyaXRlcyB0aGUgcmVjZWl2ZXIgdG8gdGhlIE9iamVjdE91dHB1dCA8Y29kZT5vdXRwdXQ8L2NvZGU+LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXRwdXQKLSAgICAgKiAgICAgICAgICAgIGFuIE9iamVjdE91dHB1dCB3aGVyZSB0byB3cml0ZSB0aGUgb2JqZWN0Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0T3V0cHV0IHRvIHdyaXRlIHRoZSBvYmplY3QgdG8uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoZSBPYmplY3RPdXRwdXQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8ge0Bjb2RlIG91dHB1dH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlLmphdmEKaW5kZXggZTMyZGFjMi4uMmNhMTVlMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGUuamF2YQpAQCAtMjIsMjYgKzIyLDM0IEBACiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKKy8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorLy8gaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuRGVsZXRlT25FeGl0OworLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuUHJpdmlBY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5VdGlsOwogCiAvKioKLSAqIEZpbGUgaXMgYSBjbGFzcyB3aGljaCByZXByZXNlbnRzIGEgZmlsZSBuYW1lIG9yIGRpcmVjdG9yeS4gVGhlIGZpbGUgbWF5IGJlCi0gKiBhYnNvbHV0ZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUgc3lzdGVtIG9yIHJlbGF0aXZlIHRvIHRoZQotICogY3VycmVudCBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHByb2dyYW0gaXMgcnVubmluZy4KKyAqIEFuICJhYnN0cmFjdCIgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlIHN5c3RlbSBlbnRpdHkgaWRlbnRpZmllZCBieSBhCisgKiBwYXRobmFtZS4gVGhlIHBhdGhuYW1lIG1heSBiZSBhYnNvbHV0ZSAocmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5CisgKiBvZiB0aGUgZmlsZSBzeXN0ZW0pIG9yIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgcHJvZ3JhbQorICogaXMgcnVubmluZy4KICAqIDxwPgogICogVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBxdWVyeWluZy9jaGFuZ2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZQotICogYW5kIGFsc28gZGlyZWN0b3J5IGxpc3RpbmcgY2FwYWJpbGl0aWVzIGlmIHRoZSBGaWxlIHJlcHJlc2VudHMgYSBkaXJlY3RvcnkuCisgKiBhcyB3ZWxsIGFzIGRpcmVjdG9yeSBsaXN0aW5nIGNhcGFiaWxpdGllcyBpZiB0aGUgZmlsZSByZXByZXNlbnRzIGEgZGlyZWN0b3J5LgogICogPHA+CiAgKiBXaGVuIG1hbmlwdWxhdGluZyBmaWxlIHBhdGhzLCB0aGUgc3RhdGljIGZpZWxkcyBvZiB0aGlzIGNsYXNzIG1heSBiZSB1c2VkIHRvCiAgKiBkZXRlcm1pbmUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHNlcGFyYXRvcnMuCiAgKiAKICAqIEBzZWUgamF2YS5pby5TZXJpYWxpemFibGUKICAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDb21wYXJhYmxlPEZpbGU+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMDEwNzczNjY1OTkxODE1NjdMOwpAQCAtNTEsMjQgKzU5LDM2IEBACiAgICAgdHJhbnNpZW50IGJ5dGVbXSBwcm9wZXJQYXRoOwogCiAgICAgLyoqCi0gICAgICogU3lzdGVtIGRlcGVuZGVudCBmaWxlIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICogVGhlIHN5c3RlbSBkZXBlbmRlbnQgZmlsZSBzZXBhcmF0b3IgY2hhcmFjdGVyLiBTaW5jZSBBbmRyb2lkIGlzIGEgVW5peC0KKyAgICAgKiBiYXNlZCBzeXN0ZW0sIHRoaXMgZGVmYXVsdHMgdG8gJy8nLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBzZXBhcmF0b3JDaGFyOwogCiAgICAgLyoqCi0gICAgICogU3lzdGVtIGRlcGVuZGVudCBmaWxlIHNlcGFyYXRvciBTdHJpbmcuIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoaXMgZmllbGQKLSAgICAgKiBpcyB0aGUgU3lzdGVtIHByb3BlcnR5ICJmaWxlLnNlcGFyYXRvciIuCisgICAgICogVGhlIHN5c3RlbSBkZXBlbmRlbnQgZmlsZSBzZXBhcmF0b3Igc3RyaW5nLiBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGlzCisgICAgICogZmllbGQgaXMgdGhlIHN5c3RlbSBwcm9wZXJ0eSAiZmlsZS5zZXBhcmF0b3IiLiBTaW5jZSBBbmRyb2lkIGlzIGEgVW5peC0KKyAgICAgKiBiYXNlZCBzeXN0ZW0sIHRoaXMgZGVmYXVsdHMgdG8gIi8iLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcGFyYXRvcjsKIAogICAgIC8qKgotICAgICAqIFN5c3RlbSBkZXBlbmRlbnQgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIFRoZSBzeXN0ZW0gZGVwZW5kZW50IHBhdGggc2VwYXJhdG9yIGNoYXJhY3Rlci4gU2luY2UgQW5kcm9pZCBpcyBhIFVuaXgtCisgICAgICogYmFzZWQgc3lzdGVtLCB0aGlzIGRlZmF1bHRzIHRvICc6Jy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgcGF0aFNlcGFyYXRvckNoYXI7CiAKICAgICAvKioKLSAgICAgKiBTeXN0ZW0gZGVwZW5kZW50IHBhdGggc2VwYXJhdG9yIFN0cmluZy4gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhpcyBmaWVsZAotICAgICAqIGlzIHRoZSBTeXN0ZW0gcHJvcGVydHkgInBhdGguc2VwYXJhdG9yIi4KKyAgICAgKiBUaGUgc3lzdGVtIGRlcGVuZGVudCBwYXRoIHNlcGFyYXRvciBzdHJpbmcuIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoaXMKKyAgICAgKiBmaWVsZCBpcyB0aGUgc3lzdGVtIHByb3BlcnR5ICJwYXRoLnNlcGFyYXRvciIuIFNpbmNlIEFuZHJvaWQgaXMgYSBVbml4LQorICAgICAqIGJhc2VkIHN5c3RlbSwgdGhpcyBkZWZhdWx0cyB0byAnOicuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGF0aFNlcGFyYXRvcjsKIApAQCAtODMsMjMgKzEwMywyNiBAQAogICAgICAgICBvbmVUaW1lSW5pdGlhbGl6YXRpb24oKTsKIAogICAgICAgICAvLyBUaGUgZGVmYXVsdCBwcm90ZWN0aW9uIGRvbWFpbiBncmFudHMgYWNjZXNzIHRvIHRoZXNlIHByb3BlcnRpZXMKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIFdlJ3JlIG9uIGxpbnV4IHNvIHRoZSBmaWxlc3lzdGVtIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCB0aGUgc2VwYXJhdG9yIGlzIC8uCiAgICAgICAgIHNlcGFyYXRvckNoYXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIiwgIi8iKS5jaGFyQXQoMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICBwYXRoU2VwYXJhdG9yQ2hhciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiLCAiOyIpLmNoYXJBdCgwKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKICAgICAgICAgc2VwYXJhdG9yID0gbmV3IFN0cmluZyhuZXcgY2hhcltdIHsgc2VwYXJhdG9yQ2hhciB9LCAwLCAxKTsKICAgICAgICAgcGF0aFNlcGFyYXRvciA9IG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7IHBhdGhTZXBhcmF0b3JDaGFyIH0sIDAsIDEpOwotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKLSAgICAgICAgLy8gV2UncmUgb24gbGludXggc28gdGhlIGZpbGVzeXN0ZW0gaXMgY2FzZSBzZW5zaXRpdmUuCiAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSB0cnVlOwogICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWxlIHVzaW5nIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBuYW1lLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZmlsZSB1c2luZyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGlyCi0gICAgICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGZvciB0aGUgZmlsZSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlIGlzIHN0b3JlZC4KICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZSB0byBiZSBjb250YWluZWQgaW4gdGhlIGRpcgorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUncyBuYW1lLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gaXMgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZShGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewpAQCAtMTEzLDEwICsxMzYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGUgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXRoLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZmlsZSB1c2luZyB0aGUgc3BlY2lmaWVkIHBhdGguCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIGJlIHVzZWQgZm9yIHRoZSBmaWxlCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byBiZSB1c2VkIGZvciB0aGUgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZShTdHJpbmcgcGF0aCkgewogICAgICAgICAvLyBwYXRoID09IG51bGwgY2hlY2sgJiBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gYnkgZml4U2xhc2hlcwpAQCAtMTI0LDEzICsxNDgsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGUgdXNpbmcgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIG5hbWUgcGxhY2luZyBhCi0gICAgICogcGF0aCBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgdHdvLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZSB1c2luZyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBwYXRoIGFuZCBmaWxlIG5hbWUsCisgICAgICogcGxhY2luZyBhIHBhdGggc2VwYXJhdG9yIGJldHdlZW4gdGhlIHR3by4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGlyUGF0aAotICAgICAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGZpbGUgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZmlsZSBpcyBzdG9yZWQuCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIG5hbWUgdG8gYmUgY29udGFpbmVkIGluIHRoZSBkaXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlJ3MgbmFtZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5hbWV9IGlzIG51bGwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGUoU3RyaW5nIGRpclBhdGgsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKQEAgLTE0NCwyMSArMTcxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWxlIHVzaW5nIHRoZSBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgVVJJCi0gICAgICogCi0gICAgICogPGNvZGU+dXJpPC9jb2RlPiBuZWVkcyB0byBiZSBhbiBhYnNvbHV0ZSBhbmQgaGllcmFyY2hpY2FsCi0gICAgICogPGNvZGU+VVJJIDwvY29kZT4gd2l0aCBmaWxlIHNjaGVtZSwgYW5kIG5vbi1lbXB0eSBwYXRoIGNvbXBvbmVudCwgYnV0Ci0gICAgICogd2l0aCB1bmRlZmluZWQgYXV0aG9yaXR5LCBxdWVyeSBvciBmcmFnbWVudCBjb21wb25lbnRzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZSB1c2luZyB0aGUgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIFVSSS4ge0Bjb2RlIHVyaX0KKyAgICAgKiBuZWVkcyB0byBiZSBhbiBhYnNvbHV0ZSBhbmQgaGllcmFyY2hpY2FsIFVuaWZpZWQgUmVzb3VyY2UgSWRlbnRpZmllciB3aXRoCisgICAgICogZmlsZSBzY2hlbWUgYW5kIG5vbi1lbXB0eSBwYXRoIGNvbXBvbmVudCwgYnV0IHdpdGggdW5kZWZpbmVkIGF1dGhvcml0eSwKKyAgICAgKiBxdWVyeSBvciBmcmFnbWVudCBjb21wb25lbnRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIHRoZSBVUkkgaW5zdGFuY2Ugd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGlzIGZpbGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBVbmlmaWVkIFJlc291cmNlIElkZW50aWZpZXIgdGhhdCBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGlzCisgICAgICogICAgICAgICAgICBmaWxlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+dXJpPC9jb2RlPiBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgY29uZGl0aW9ucwotICAgICAqICAgICAgICAgICAgIGFib3ZlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB1cml9IGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBjb25kaXRpb25zIGFib3ZlLgogICAgICAqIEBzZWUgI3RvVVJJCiAgICAgICogQHNlZSBqYXZhLm5ldC5VUkkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZShVUkkgdXJpKSB7CiAgICAgICAgIC8vIGNoZWNrIHByZS1jb25kaXRpb25zCkBAIC0yMzAsMTMgKzI1NSwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUltcGwoKTsKIAogICAgIC8qKgotICAgICAqIExpc3RzIHRoZSBmaWxlc3lzdGVtIHJvb3RzLgorICAgICAqIExpc3RzIHRoZSBmaWxlIHN5c3RlbSByb290cy4gVGhlIEphdmEgcGxhdGZvcm0gbWF5IHN1cHBvcnQgemVybyBvciBtb3JlCisgICAgICogZmlsZSBzeXN0ZW1zLCBlYWNoIHdpdGggaXRzIG93biBwbGF0Zm9ybS1kZXBlbmRlbnQgcm9vdC4gRnVydGhlciwgdGhlCisgICAgICogY2Fub25pY2FsIHBhdGhuYW1lIG9mIGFueSBmaWxlIG9uIHRoZSBzeXN0ZW0gd2lsbCBhbHdheXMgYmVnaW4gd2l0aCBvbmUKKyAgICAgKiBvZiB0aGUgcmV0dXJuZWQgZmlsZSBzeXN0ZW0gcm9vdHMuCiAgICAgICogCi0gICAgICogVGhlIEphdmEgcGxhdGZvcm0gbWF5IHN1cHBvcnQgemVybyBvciBtb3JlIGZpbGVzeXN0ZW1zLCBlYWNoIHdpdGggaXRzIG93bgotICAgICAqIHBsYXRmb3JtLWRlcGVuZGVudCByb290LiBGdXJ0aGVyLCB0aGUgY2Fub25pY2FsIHBhdGhuYW1lIG9mIGFueSBmaWxlIG9uCi0gICAgICogdGhlIHN5c3RlbSB3aWxsIGFsd2F5cyBiZWdpbiB3aXRoIG9uZSBvZiB0aGUgcmV0dXJuZWQgZmlsZXN5c3RlbSByb290cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBmaWxlc3lzdGVtIHJvb3RzCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZmlsZSBzeXN0ZW0gcm9vdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGaWxlW10gbGlzdFJvb3RzKCkgewogICAgICAgICBieXRlW11bXSByb290c0xpc3QgPSByb290c0ltcGwoKTsKQEAgLTMwMywzMCArMzI4LDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBjb250ZXh0IGlzCi0gICAgICogYWxsb3dlZCB0byByZWFkIHRoaXMgRmlsZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBjb250ZXh0IGlzIGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoaXMgZmlsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgRmlsZSBjYW4gYmUgcmVhZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChGaWxlRGVzY3JpcHRvcikKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGZpbGUgY2FuIGJlIHJlYWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyB0aGUKKyAgICAgKiAgICAgICAgICAgICByZWFkIHJlcXVlc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuUmVhZCgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc2VjdXJpdHkgIT0gbnVsbCkgewogICAgICAgICAgICAgc2VjdXJpdHkuY2hlY2tSZWFkKHBhdGgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleGlzdHMoKSAmJiAhaXNXcml0ZU9ubHlJbXBsKHByb3BlclBhdGgodHJ1ZSkpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgcmV0dXJuIGV4aXN0cygpICYmIGlzUmVhZGFibGVJbXBsKHByb3BlclBhdGgodHJ1ZSkpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBjb250ZXh0IGlzCi0gICAgICogYWxsb3dlZCB0byB3cml0ZSB0byB0aGlzIEZpbGUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgZmlsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgRmlsZSBjYW4gYmUgd3JpdHRlbiwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoRmlsZURlc2NyaXB0b3IpCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBmaWxlIGNhbiBiZSB3cml0dGVuLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHRoZQorICAgICAqICAgICAgICAgICAgIHdyaXRlIHJlcXVlc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuV3JpdGUoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTMzOSwxOCArMzY3LDIxIEBACiAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgZXhpc3RzID0gZXhpc3RzSW1wbChwcm9wZXJQYXRoKHRydWUpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZXhpc3RzICYmICFpc1JlYWRPbmx5SW1wbChwcm9wZXJQYXRoKHRydWUpKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHJldHVybiBleGlzdHMgJiYgaXNXcml0ZWFibGVJbXBsKHByb3BlclBhdGgodHJ1ZSkpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgc29ydCBvcmRlcmluZyBvZiBwYXRocyBmb3IgdGhlIHJlY2VpdmVyIGFuZCBnaXZlbgotICAgICAqIGFyZ3VtZW50LiBUaGUgb3JkZXJpbmcgaXMgcGxhdGZvcm0gZGVwZW5kZW50LgorICAgICAqIFJldHVybnMgdGhlIHJlbGF0aXZlIHNvcnQgb3JkZXJpbmcgb2YgdGhlIHBhdGhzIGZvciB0aGlzIGZpbGUgYW5kIHRoZQorICAgICAqIGZpbGUge0Bjb2RlIGFub3RoZXJ9LiBUaGUgb3JkZXJpbmcgaXMgcGxhdGZvcm0gZGVwZW5kZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhbm90aGVyCi0gICAgICogICAgICAgICAgICBhIEZpbGUgdG8gY29tcGFyZSB0aGUgcmVjZWl2ZXIgdG8KLSAgICAgKiBAcmV0dXJuIGFuIGludCBkZXRlcm1pbmVkIGJ5IGNvbXBhcmluZyB0aGUgdHdvIHBhdGhzLiBUaGUgbWVhbmluZyBpcworICAgICAqICAgICAgICAgICAgYSBmaWxlIHRvIGNvbXBhcmUgdGhpcyBmaWxlIHRvCisgICAgICogQHJldHVybiBhbiBpbnQgZGV0ZXJtaW5lZCBieSBjb21wYXJpbmcgdGhlIHR3byBwYXRocy4gUG9zc2libGUgdmFsdWVzIGFyZQogICAgICAqICAgICAgICAgZGVzY3JpYmVkIGluIHRoZSBDb21wYXJhYmxlIGludGVyZmFjZS4KICAgICAgKiBAc2VlIENvbXBhcmFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhGaWxlIGFub3RoZXIpIHsKICAgICAgICAgaWYgKGNhc2VTZW5zaXRpdmUpIHsKQEAgLTM2MCwxNiArMzkxLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhpcyBGaWxlLiBEaXJlY3RvcmllcyBtdXN0IGJlIGVtcHR5IGJlZm9yZQotICAgICAqIHRoZXkgd2lsbCBiZSBkZWxldGVkLgorICAgICAqIERlbGV0ZXMgdGhpcyBmaWxlLiBEaXJlY3RvcmllcyBtdXN0IGJlIGVtcHR5IGJlZm9yZSB0aGV5IHdpbGwgYmUgZGVsZXRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgRmlsZSB3YXMgZGVsZXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24gaW4gY2FzZSBhIDxjb2RlPlNlY3VyaXR5TWFuYWdlcjwvY29kZT4KLSAgICAgKiAgICAgICAgIGlzIGluc3RhbGxlZCwgYW5kIGl0IGRlbmllcyB0aGUgcmVxdWVzdC4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGZpbGUgd2FzIGRlbGV0ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyB0aGUKKyAgICAgKiAgICAgICAgICAgICByZXF1ZXN0LgogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0RlbGV0ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZSgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMzg4LDMyICs0MTcsMzQgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRlbGV0ZUZpbGVJbXBsKGJ5dGVbXSBmaWxlUGF0aCk7CiAKICAgICAvKioKLSAgICAgKiBXaGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgdGVybWluYXRlcywgYW55IGFic3RyYWN0IGZpbGVzIHdoaWNoIGhhdmUgYmVlbgotICAgICAqIHNlbnQgPGNvZGU+ZGVsZXRlT25FeGl0KCk8L2NvZGU+IHdpbGwgYmUgZGVsZXRlZC4gVGhpcyB3aWxsIG9ubHkgaGFwcGVuCi0gICAgICogd2hlbiB0aGUgdmlydHVhbCBtYWNoaW5lIHRlcm1pbmF0ZXMgbm9ybWFsbHkgYXMgZGVzY3JpYmVkIGJ5IHRoZSBKYXZhCi0gICAgICogTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDEyLjkuCisgICAgICogU2NoZWR1bGVzIHRoaXMgZmlsZSB0byBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgb25jZSB0aGUgdmlydHVhbCBtYWNoaW5lCisgICAgICogdGVybWluYXRlcy4gVGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdoZW4gdGhlIHZpcnR1YWwgbWFjaGluZSB0ZXJtaW5hdGVzIAorICAgICAqIG5vcm1hbGx5IGFzIGRlc2NyaWJlZCBieSB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMTIuOS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbiBpbiBjYXNlIGEgPGNvZGU+U2VjdXJpdHlNYW5hZ2VyPC9jb2RlPgotICAgICAqICAgICAgICAgaXMgaW5zdGFsbGVkLCBhbmQgaXQgZGVuaWVzIHRoZSByZXF1ZXN0LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyB0aGUKKyAgICAgKiAgICAgICAgICAgICByZXF1ZXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9uRXhpdCgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc2VjdXJpdHkgIT0gbnVsbCkgewogICAgICAgICAgICAgc2VjdXJpdHkuY2hlY2tEZWxldGUocGF0aCk7CiAgICAgICAgIH0KLQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgRGVsZXRlT25FeGl0LmdldEluc3RhbmNlKCkuYWRkRmlsZShnZXRBYnNvbHV0ZU5hbWUoKSk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgPGNvZGU+b2JqPC9jb2RlPiB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhleSByZXByZXNlbnQgdGhlIDxlbT5zYW1lPC9lbT4gb2JqZWN0IHVzaW5nIGEKLSAgICAgKiBwYXRoIHNwZWNpZmljIGNvbXBhcmlzb24uCisgICAgICogQ29tcGFyZXMge0Bjb2RlIG9ian0gdG8gdGhpcyBmaWxlIGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGV5CisgICAgICogcmVwcmVzZW50IHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIHBhdGggc3BlY2lmaWMgY29tcGFyaXNvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIE9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBmaWxlIHdpdGguCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIG9ian0gaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtNDI3LDE0ICs0NTgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgRmlsZSBjYW4gYmUgZm91bmQgb24gdGhlCisgICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgZmlsZSBjYW4gYmUgZm91bmQgb24gdGhlCiAgICAgICogdW5kZXJseWluZyBmaWxlIHN5c3RlbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgRmlsZSBleGlzdHMsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgZmlsZSBleGlzdHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyByZWFkCisgICAgICogICAgICAgICAgICAgYWNjZXNzIHRvIHRoaXMgZmlsZS4KICAgICAgKiBAc2VlICNnZXRQYXRoCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChGaWxlRGVzY3JpcHRvcikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CiAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID09IDApIHsKQEAgLTQ1MCwxMSArNDgyLDExIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBleGlzdHNJbXBsKGJ5dGVbXSBmaWxlUGF0aCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggb2YgdGhpcyBGaWxlLgorICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhpcyBmaWxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIGZpbGUgcGF0aAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIGZpbGUgcGF0aC4KICAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQcm9wZXJ0eUFjY2VzcworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgewogICAgICAgICBieXRlW10gYWJzb2x1dGUgPSBwcm9wZXJQYXRoKGZhbHNlKTsKQEAgLTQ2MiwzMiArNDk0LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBGaWxlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggb2YgdGhpcyBGaWxlLgorICAgICAqIFJldHVybnMgYSBuZXcgZmlsZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIGZpbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBGaWxlIGZyb20gdGhpcyBhYnNvbHV0ZSBmaWxlIHBhdGgKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbGUgZnJvbSB0aGlzIGZpbGUncyBhYnNvbHV0ZSBwYXRoLgogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Byb3BlcnR5QWNjZXNzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGUgZ2V0QWJzb2x1dGVGaWxlKCkgewogICAgICAgICByZXR1cm4gbmV3IEZpbGUodGhpcy5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoaXMgRmlsZSB3aXRoIGFsbCByZWZlcmVuY2VzIHJlc29sdmVkLgotICAgICAqIEFuIDxlbT5hYnNvbHV0ZTwvZW0+IGZpbGUgcGF0aCBpcyBvbmUgd2hpY2ggYmVnaW5zIGF0IHRoZSByb290IG9mIHRoZQotICAgICAqIGZpbGUgc3lzdGVtLiBUaGUgY2Fub25pY2FsIHBhdGggaXMgb25lIGluIHdoaWNoIGFsbCByZWZlcmVuY2VzIGhhdmUgYmVlbgotICAgICAqIHJlc29sdmVkLiBGb3IgdGhlIGNhc2VzIG9mICcuLicgYW5kICcuJyB3aGVyZSB0aGUgZmlsZSBzeXN0ZW0gc3VwcG9ydHMKLSAgICAgKiBwYXJlbnQgYW5kIHdvcmtpbmcgZGlyZWN0b3J5IHJlc3BlY3RpdmVseSwgdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQgYW5kCi0gICAgICogcmVwbGFjZWQgd2l0aCBhIGRpcmVjdCBkaXJlY3RvcnkgcmVmZXJlbmNlLiBJZiB0aGUgRmlsZSBkb2VzIG5vdCBleGlzdCwKLSAgICAgKiBnZXRDYW5vbmljYWxQYXRoKCkgbWF5IG5vdCByZXNvbHZlIGFueSByZWZlcmVuY2VzIGFuZCBzaW1wbHkgcmV0dXJuIGFuCi0gICAgICogYWJzb2x1dGUgcGF0aCBuYW1lIG9yIHRocm93IGFuIElPRXhjZXB0aW9uLgorICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhpcyBmaWxlIHdpdGggYWxsIHJlZmVyZW5jZXMgcmVzb2x2ZWQuIEFuCisgICAgICogPGVtPmFic29sdXRlPC9lbT4gcGF0aCBpcyBvbmUgdGhhdCBiZWdpbnMgYXQgdGhlIHJvb3Qgb2YgdGhlIGZpbGUKKyAgICAgKiBzeXN0ZW0uIFRoZSBjYW5vbmljYWwgcGF0aCBpcyBvbmUgaW4gd2hpY2ggYWxsIHJlZmVyZW5jZXMgaGF2ZSBiZWVuCisgICAgICogcmVzb2x2ZWQuIEZvciB0aGUgY2FzZXMgb2YgJy4uJyBhbmQgJy4nLCB3aGVyZSB0aGUgZmlsZSBzeXN0ZW0gc3VwcG9ydHMKKyAgICAgKiBwYXJlbnQgYW5kIHdvcmtpbmcgZGlyZWN0b3J5IHJlc3BlY3RpdmVseSwgdGhlc2UgYXJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkCisgICAgICogd2l0aCBhIGRpcmVjdCBkaXJlY3RvcnkgcmVmZXJlbmNlLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwKKyAgICAgKiBnZXRDYW5vbmljYWxQYXRoKCkgbWF5IG5vdCByZXNvbHZlIGFueSByZWZlcmVuY2VzIGFuZCBzaW1wbHkgcmV0dXJucyBhbgorICAgICAqIGFic29sdXRlIHBhdGggbmFtZSBvciB0aHJvd3MgYW4gSU9FeGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2Fub25pY2FsIGZpbGUgcGF0aAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoaXMgZmlsZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gSU8gZXJyb3Igb2NjdXJzCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQcm9wZXJ0eUFjY2VzcworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsUGF0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBwcm9wZXJQYXRoKGZhbHNlKTsKQEAgLTU4NywxNSArNjE4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBGaWxlIGNyZWF0ZWQgdXNpbmcgdGhlIGNhbm9uaWNhbCBmaWxlIHBhdGggb2YgdGhpcyBGaWxlLgotICAgICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+bmV3IEZpbGUodGhpcy5nZXRDYW5vbmljYWxQYXRoKCkpPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGZpbGUgY3JlYXRlZCB1c2luZyB0aGUgY2Fub25pY2FsIHBhdGggb2YgdGhpcyBmaWxlLgorICAgICAqIEVxdWl2YWxlbnQgdG8ge0Bjb2RlIG5ldyBGaWxlKHRoaXMuZ2V0Q2Fub25pY2FsUGF0aCgpKX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2Fub25pY2FsIGZpbGUgcGF0aAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBmaWxlIGNvbnN0cnVjdGVkIGZyb20gdGhpcyBmaWxlJ3MgY2Fub25pY2FsIHBhdGguCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGVycm9yIG9jY3VycwotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUHJvcGVydHlBY2Nlc3MKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZSBnZXRDYW5vbmljYWxGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldENhbm9uaWNhbFBhdGgoKSk7CkBAIC02MDQsOSArNjM0LDExIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYnl0ZVtdIGdldENhbm9uSW1wbChieXRlW10gZmlsZVBhdGgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZW5hbWUgKG5vdCBkaXJlY3RvcnkpIG9mIHRoaXMgRmlsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSByZXByZXNlbnRlZCBieSB0aGlzIGZpbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUgb3IgZW1wdHkgc3RyaW5nCisgICAgICogQHJldHVybiB0aGlzIGZpbGUncyBuYW1lIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBuYW1lIHBhcnQgaW4KKyAgICAgKiAgICAgICAgIHRoZSBmaWxlJ3MgcGF0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IHBhdGgubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTsKQEAgLTYxNSwxMSArNjQ3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGlzIEZpbGUuIFRoaXMgaXMgdGhlIHBhdGggdXAgdG8KLSAgICAgKiBidXQgbm90IGluY2x1ZGluZyB0aGUgbGFzdCBuYW1lLiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCB3aGVuCi0gICAgICogdGhlcmUgaXMgbm8gcGFyZW50LgorICAgICAqIFJldHVybnMgdGhlIHBhdGhuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyBmaWxlLiBUaGlzIGlzIHRoZSBwYXRoIHVwIHRvCisgICAgICogYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGxhc3QgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vCisgICAgICogcGFyZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHJldHVybiB0aGlzIGZpbGUncyBwYXJlbnQgcGF0aG5hbWUgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50KCkgewogICAgICAgICBpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKSwgZmlyc3RJblBhdGggPSAwOwpAQCAtNjQxLDExICs2NzQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEZpbGUgbWFkZSBmcm9tIHRoZSBwYXRobmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoaXMgRmlsZS4KLSAgICAgKiBUaGlzIGlzIHRoZSBwYXRoIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBsYXN0IG5hbWUuIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaXMgcmV0dXJuZWQgd2hlbiB0aGVyZSBpcyBubyBwYXJlbnQuCisgICAgICogUmV0dXJucyBhIG5ldyBmaWxlIG1hZGUgZnJvbSB0aGUgcGF0aG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGlzIGZpbGUuCisgICAgICogVGhpcyBpcyB0aGUgcGF0aCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgbGFzdCBuYW1lLiB7QGNvZGUgbnVsbH0gaXMKKyAgICAgKiByZXR1cm5lZCB3aGVuIHRoZXJlIGlzIG5vIHBhcmVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IEZpbGUgcmVwcmVzZW50aW5nIHBhcmVudCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIEByZXR1cm4gYSBuZXcgZmlsZSByZXByZXNlbnRpbmcgdGhpcyBmaWxlJ3MgcGFyZW50IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZSBnZXRQYXJlbnRGaWxlKCkgewogICAgICAgICBTdHJpbmcgdGVtcFBhcmVudCA9IGdldFBhcmVudCgpOwpAQCAtNjU2LDIyICs2OTAsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIHBhdGggb2YgdGhpcyBGaWxlLgorICAgICAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhpcyBmaWxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgcGF0aAorICAgICAqIEByZXR1cm4gdGhpcyBmaWxlJ3MgcGF0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CiAgICAgICAgIHJldHVybiBwYXRoOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byBvYmplY3RzIHdoaWNoCi0gICAgICogYW5zd2VyIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIG9iamVjdHMgZm9yIHdoaWNoCisgICAgICoge0Bjb2RlIGVxdWFsc30gcmV0dXJucyB7QGNvZGUgdHJ1ZX0gbXVzdCByZXR1cm4gdGhlIHNhbWUgaGFzaCBjb2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBmaWxlcydzIGhhc2ggdmFsdWUuCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTY4MSwzMyArNzE1LDM5IEBACiAgICAgICAgIHJldHVybiBwYXRoLnRvTG93ZXJDYXNlKCkuaGFzaENvZGUoKSBeIDEyMzQzMjE7CiAgICAgfQogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCi0gICAgLy8gUmVtb3ZpbmcgcGxhdGZvcm0gaW5kZXBlbmRlbnQgY29kZSBiZWNhdXNlIHdlJ3JlIGFsd2F5cyBvbiBsaW51eC4KICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgRmlsZSBpcyBhbiBhYnNvbHV0ZSBwYXRobmFtZS4gV2hldGhlciBhIHBhdGhuYW1lIGlzCi0gICAgICogYWJzb2x1dGUgaXMgcGxhdGZvcm0gc3BlY2lmaWMuIE9uIFVOSVggaXQgaXMgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggdGhlCi0gICAgICogY2hhcmFjdGVyICcvJywgb24gV2luZG93cyBpdCBpcyBhYnNvbHV0ZSBpZiBlaXRoZXIgaXQgc3RhcnRzIHdpdGggJ1wnLAotICAgICAqICcvJywgJ1xcJyAodG8gcmVwcmVzZW50IGEgZmlsZSBzZXJ2ZXIpLCBvciBhIGxldHRlciBmb2xsb3dlZCBieSBhIGNvbG9uLgorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGZpbGUncyBwYXRobmFtZSBpcyBhYnNvbHV0ZS4gV2hldGhlciBhIHBhdGhuYW1lIGlzCisgICAgICogYWJzb2x1dGUgaXMgcGxhdGZvcm0gc3BlY2lmaWMuIE9uIFVOSVgsIGFic29sdXRlIHBhdGhzIG11c3Qgc3RhcnQgd2l0aAorICAgICAqIHRoZSBjaGFyYWN0ZXIgJy8nOyBvbiBXaW5kb3dzIGl0IGlzIGFic29sdXRlIGlmIGVpdGhlciBpdCBzdGFydHMgd2l0aAorICAgICAqICdcJywgJy8nLCAnXFwnICh0byByZXByZXNlbnQgYSBmaWxlIHNlcnZlciksIG9yIGEgbGV0dGVyIGZvbGxvd2VkIGJ5IGEKKyAgICAgKiBjb2xvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgRmlsZSBpcyBhYnNvbHV0ZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBmaWxlJ3MgcGF0aG5hbWUgaXMgYWJzb2x1dGUsIHtAY29kZSBmYWxzZX0KICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KLSAgICAgKiAKICAgICAgKiBAc2VlICNnZXRQYXRoCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZSgpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIFJlbW92aW5nIHBsYXRmb3JtIGluZGVwZW5kZW50IGNvZGUgYmVjYXVzZSB3ZSdyZSBhbHdheXMgb24gbGludXguCiAgICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCgpID4gMCAmJiBwYXRoLmNoYXJBdCgwKSA9PSBzZXBhcmF0b3JDaGFyOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQotICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKKworICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgIC8vIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNBYnNvbHV0ZUltcGwoYnl0ZVtdIGZpbGVQYXRoKTsKKyAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgRmlsZSByZXByZXNlbnRzIGEgPGVtPmRpcmVjdG9yeTwvZW0+IG9uIHRoZSB1bmRlcmx5aW5nCi0gICAgICogZmlsZSBzeXN0ZW0uCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgZmlsZSByZXByZXNlbnRzIGEgPGVtPmRpcmVjdG9yeTwvZW0+IG9uIHRoZQorICAgICAqIHVuZGVybHlpbmcgZmlsZSBzeXN0ZW0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIEZpbGUgaXMgYSBkaXJlY3RvcnksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEBzZWUgI2dldFBhdGgKLSAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKEZpbGVEZXNjcmlwdG9yKQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgZmlsZSBpcyBhIGRpcmVjdG9yeSwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyByZWFkCisgICAgICogICAgICAgICAgICAgYWNjZXNzIHRvIHRoaXMgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewpAQCAtNzIzLDE0ICs3NjMsMTQgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzRGlyZWN0b3J5SW1wbChieXRlW10gZmlsZVBhdGgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIEZpbGUgcmVwcmVzZW50cyBhIDxlbT5maWxlPC9lbT4gb24gdGhlIHVuZGVybHlpbmcgZmlsZQotICAgICAqIHN5c3RlbS4KKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBmaWxlIHJlcHJlc2VudHMgYSA8ZW0+ZmlsZTwvZW0+IG9uIHRoZSB1bmRlcmx5aW5nCisgICAgICogZmlsZSBzeXN0ZW0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIEZpbGUgaXMgYSBmaWxlLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRQYXRoCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChGaWxlRGVzY3JpcHRvcikKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGZpbGUgaXMgYSBmaWxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgcmVhZAorICAgICAqICAgICAgICAgICAgIGFjY2VzcyB0byB0aGlzIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlKCkgewogICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA9PSAwKSB7CkBAIC03NDcsMTAgKzc4NywxNiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGZpbGUgaXMgYSBoaWRkZW4gZmlsZSBhcyBkZWZpbmVkIGJ5IHRoZQotICAgICAqIG9wZXJhdGluZyBzeXN0ZW0uCisgICAgICogb3BlcmF0aW5nIHN5c3RlbS4gVGhlIG5vdGlvbiBvZiAiaGlkZGVuIiBpcyBzeXN0ZW0tZGVwZW5kZW50LiBGb3IKKyAgICAgKiBVbml4IHN5c3RlbXMgKGxpa2UgQW5kcm9pZCkgYSBmaWxlIGlzIGNvbnNpZGVyZWQgaGlkZGVuIGlmIGl0cyBuYW1lCisgICAgICogc3RhcnRzIHdpdGggYSAiLiIuIEZvciBXaW5kb3dzIHN5c3RlbXMgdGhlcmUgaXMgYW4gZXhwbGljaXQgZmxhZyBpbiB0aGUKKyAgICAgKiBmaWxlIHN5c3RlbSBmb3IgdGhpcyBwdXJwb3NlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgaXMgaGlkZGVuLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZmlsZSBpcyBoaWRkZW4sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyByZWFkCisgICAgICogICAgICAgICAgICAgYWNjZXNzIHRvIHRoaXMgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbigpIHsKICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewpAQCAtNzY1LDE5ICs4MTEsMjMgQEAKIAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNIaWRkZW5JbXBsKGJ5dGVbXSBmaWxlUGF0aCk7CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzUmVhZE9ubHlJbXBsKGJ5dGVbXSBmaWxlUGF0aCk7CisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc1JlYWRhYmxlSW1wbChieXRlW10gZmlsZVBhdGgpOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc1dyaXRlT25seUltcGwoYnl0ZVtdIGZpbGVQYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzV3JpdGVhYmxlSW1wbChieXRlW10gZmlsZVBhdGgpOworICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRMaW5rSW1wbChieXRlW10gZmlsZVBhdGgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSB0aGlzIEZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuCisgICAgICogUmV0dXJucyB0aGUgdGltZSB3aGVuIHRoaXMgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCwgbWVhc3VyZWQgaW4KKyAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxc3QsIDE5NzAsIG1pZG5pZ2h0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpbWUgdGhpcyBGaWxlIHdhcyBsYXN0IG1vZGlmaWVkLgotICAgICAqIAotICAgICAqIEBzZWUgI2dldFBhdGgKLSAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKEZpbGVEZXNjcmlwdG9yKQorICAgICAqIEByZXR1cm4gdGhlIHRpbWUgd2hlbiB0aGlzIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHJlYWQKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MgdG8gdGhpcyBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGxhc3RNb2RpZmllZCgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtNzk1LDEzICs4NDUsMTkgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBsb25nIGxhc3RNb2RpZmllZEltcGwoYnl0ZVtdIGZpbGVQYXRoKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpbWUgdGhpcyBGaWxlIHdhcyBsYXN0IG1vZGlmaWVkLgorICAgICAqIFNldHMgdGhlIHRpbWUgdGhpcyBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkLCBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiBKYW51YXJ5IDFzdCwgMTk3MCwgbWlkbmlnaHQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRpbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSB0aW1lIHRvIHNldCB0aGUgZmlsZSBhcyBsYXN0IG1vZGlmaWVkLgotICAgICAqIEByZXR1cm4gdGhlIHRpbWUgdGhpcyBGaWxlIHdhcyBsYXN0IG1vZGlmaWVkLgotICAgICAqIAotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1dyaXRlKEZpbGVEZXNjcmlwdG9yKQorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgZm9yIHRoaXMgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0aW1lIDwgMH0uCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHdyaXRlCisgICAgICogICAgICAgICAgICAgYWNjZXNzIHRvIHRoaXMgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzZXRMYXN0TW9kaWZpZWQobG9uZyB0aW1lKSB7CiAgICAgICAgIGlmICh0aW1lIDwgMCkgewpAQCAtODIwLDggKzg3NiwxMiBAQAogICAgICAqIE1hcmtzIHRoaXMgZmlsZSBvciBkaXJlY3RvcnkgdG8gYmUgcmVhZC1vbmx5IGFzIGRlZmluZWQgYnkgdGhlIG9wZXJhdGluZwogICAgICAqIHN5c3RlbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gd2FzIGEgc3VjY2VzcywKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgd3JpdGUKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MgdG8gdGhpcyBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHNldFJlYWRPbmx5KCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC04MzQsMTIgKzg5NCwxMyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0UmVhZE9ubHlJbXBsKGJ5dGVbXSBwYXRoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIEZpbGUgaW4gYnl0ZXMuCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgZmlsZSBpbiBieXRlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpbGUuCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0UGF0aAotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IpCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgZmlsZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgcmVhZAorICAgICAqICAgICAgICAgICAgIGFjY2VzcyB0byB0aGlzIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgbGVuZ3RoKCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC04NTIsMTggKzkxMywyMCBAQAogICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgbGVuZ3RoSW1wbChieXRlW10gZmlsZVBhdGgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBTdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5Ci0gICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyBGaWxlLiBJZiB0aGlzIEZpbGUgaXMgbm90IGEgZGlyZWN0b3J5IHRoZSByZXN1bHQgaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZmlsZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5CisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyBmaWxlLiBUaGUgcmVzdWx0IGlzIHtAIG51bGx9IGlmIHRoaXMgZmlsZSBpcyBub3QgYQorICAgICAqIGRpcmVjdG9yeS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZW50cmllcyA8Y29kZT4uPC9jb2RlPiBhbmQgPGNvZGU+Li48L2NvZGU+IHJlcHJlc2VudGluZyBjdXJyZW50Ci0gICAgICogZGlyZWN0b3J5IGFuZCBwYXJlbnQgZGlyZWN0b3J5IGFyZSBub3QgcmV0dXJuZWQgYXMgcGFydCBvZiB0aGUgbGlzdC4KKyAgICAgKiBUaGUgZW50cmllcyB7QGNvZGUgLn0gYW5kIHtAY29kZSAuLn0gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGFuZCBwYXJlbnQKKyAgICAgKiBkaXJlY3RvcnkgYXJlIG5vdCByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSBsaXN0LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZ3Mgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0UGF0aAorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIGZpbGUgbmFtZXMgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyByZWFkCisgICAgICogICAgICAgICAgICAgYWNjZXNzIHRvIHRoaXMgZmlsZS4KICAgICAgKiBAc2VlICNpc0RpcmVjdG9yeQotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBsaXN0KCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC04ODUsMTYgKzk0OCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgRmlsZXMgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkKLSAgICAgKiByZXByZXNlbnRlZCBieSB0aGlzIEZpbGUuIElmIHRoaXMgRmlsZSBpcyBub3QgYSBkaXJlY3RvcnkgdGhlIHJlc3VsdCBpcwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgRmlsZXMgcmV0dXJuZWQgd2lsbCBiZSBhYnNvbHV0ZSBpZiB0aGlzIEZpbGUgaXMKLSAgICAgKiBhYnNvbHV0ZSwgcmVsYXRpdmUgb3RoZXJ3aXNlLgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmlsZXMgY29udGFpbmVkIGluIHRoZSBkaXJlY3RvcnkgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgICAqIGZpbGUuIFRoZSByZXN1bHQgaXMge0Bjb2RlIG51bGx9IGlmIHRoaXMgZmlsZSBpcyBub3QgYSBkaXJlY3RvcnkuIFRoZQorICAgICAqIHBhdGhzIG9mIHRoZSBmaWxlcyBpbiB0aGUgYXJyYXkgYXJlIGFic29sdXRlIGlmIHRoZSBwYXRoIG9mIHRoaXMgZmlsZSBpcworICAgICAqIGFic29sdXRlLCB0aGV5IGFyZSByZWxhdGl2ZSBvdGhlcndpc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBGaWxlcyBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRQYXRoCi0gICAgICogQHNlZSAjbGlzdCgpCi0gICAgICogQHNlZSAjaXNEaXJlY3RvcnkKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgcmVhZAorICAgICAqICAgICAgICAgICAgIGFjY2VzcyB0byB0aGlzIGZpbGUuCisgICAgICogQHNlZSAjbGlzdAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlW10gbGlzdEZpbGVzKCkgewogICAgICAgICBTdHJpbmdbXSB0ZW1wTmFtZXMgPSBsaXN0KCk7CkBAIC05MTAsMjIgKzk3NCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgRmlsZXMgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkKLSAgICAgKiByZXByZXNlbnRlZCBieSB0aGlzIEZpbGUgdGhhdCBtYXRjaCBhIHNwZWNpZmljIGZpbHRlci4gSWYgdGhpcyBGaWxlIGlzCi0gICAgICogbm90IGEgZGlyZWN0b3J5IHRoZSByZXN1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoZSBmaWx0ZXIgaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGFsbCBmaWxlbmFtZXMgbWF0Y2guCisgICAgICogR2V0cyBhIGxpc3Qgb2YgdGhlIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgcmVwcmVzZW50ZWQgYnkgdGhpcyBmaWxlLiBUaGlzCisgICAgICogbGlzdCBpcyB0aGVuIGZpbHRlcmVkIHRocm91Z2ggYSBGaWxlbmFtZUZpbHRlciBhbmQgZmlsZXMgd2l0aCBtYXRjaGluZworICAgICAqIG5hbWVzIGFyZSByZXR1cm5lZCBhcyBhbiBhcnJheSBvZiBmaWxlcy4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgdGhpcworICAgICAqIGZpbGUgaXMgbm90IGEgZGlyZWN0b3J5LiBJZiB7QGNvZGUgZmlsdGVyfSBpcyB7QGNvZGUgbnVsbH0gdGhlbiBhbGwKKyAgICAgKiBmaWxlbmFtZXMgbWF0Y2guCiAgICAgICogPHA+Ci0gICAgICogVGhlIGVudHJpZXMgPGNvZGU+LjwvY29kZT4gYW5kIDxjb2RlPi4uPC9jb2RlPiByZXByZXNlbnRpbmcgY3VycmVudAotICAgICAqIGRpcmVjdG9yeSBhbmQgcGFyZW50IGRpcmVjdG9yeSBhcmUgbm90IHJldHVybmVkIGFzIHBhcnQgb2YgdGhlIGxpc3QuCisgICAgICogVGhlIGVudHJpZXMge0Bjb2RlIC59IGFuZCB7QGNvZGUgLi59IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBhbmQgcGFyZW50CisgICAgICogZGlyZWN0b3JpZXMgYXJlIG5vdCByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSBsaXN0LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsdGVyCi0gICAgICogICAgICAgICAgICB0aGUgZmlsdGVyIHRvIG1hdGNoIG5hbWVzIHRvIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgRmlsZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgZmlsdGVyIHRvIG1hdGNoIG5hbWVzIGFnYWluc3QsIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlcyBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHJlYWQKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MgdG8gdGhpcyBmaWxlLgogICAgICAqIEBzZWUgI2xpc3QoRmlsZW5hbWVGaWx0ZXIgZmlsdGVyKQotICAgICAqIEBzZWUgI2dldFBhdGgKLSAgICAgKiBAc2VlICNpc0RpcmVjdG9yeQotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVbXSBsaXN0RmlsZXMoRmlsZW5hbWVGaWx0ZXIgZmlsdGVyKSB7CiAgICAgICAgIFN0cmluZ1tdIHRlbXBOYW1lcyA9IGxpc3QoZmlsdGVyKTsKQEAgLTk0MSwyMSArMTAwNywyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgRmlsZXMgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkKLSAgICAgKiByZXByZXNlbnRlZCBieSB0aGlzIEZpbGUgdGhhdCBtYXRjaCBhIHNwZWNpZmljIGZpbHRlci4gSWYgdGhpcyBGaWxlIGlzCi0gICAgICogbm90IGEgZGlyZWN0b3J5IHRoZSByZXN1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoZSBmaWx0ZXIgaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGFsbCBmaWxlbmFtZXMgbWF0Y2guCisgICAgICogR2V0cyBhIGxpc3Qgb2YgdGhlIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgcmVwcmVzZW50ZWQgYnkgdGhpcyBmaWxlLiBUaGlzCisgICAgICogbGlzdCBpcyB0aGVuIGZpbHRlcmVkIHRocm91Z2ggYSBGaWxlRmlsdGVyIGFuZCBtYXRjaGluZyBmaWxlcyBhcmUKKyAgICAgKiByZXR1cm5lZCBhcyBhbiBhcnJheSBvZiBmaWxlcy4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgdGhpcyBmaWxlIGlzIG5vdCBhCisgICAgICogZGlyZWN0b3J5LiBJZiB7QGNvZGUgZmlsdGVyfSBpcyB7QGNvZGUgbnVsbH0gdGhlbiBhbGwgZmlsZXMgbWF0Y2guCiAgICAgICogPHA+Ci0gICAgICogVGhlIGVudHJpZXMgPGNvZGU+LjwvY29kZT4gYW5kIDxjb2RlPi4uPC9jb2RlPiByZXByZXNlbnRpbmcgY3VycmVudAotICAgICAqIGRpcmVjdG9yeSBhbmQgcGFyZW50IGRpcmVjdG9yeSBhcmUgbm90IHJldHVybmVkIGFzIHBhcnQgb2YgdGhlIGxpc3QuCisgICAgICogVGhlIGVudHJpZXMge0Bjb2RlIC59IGFuZCB7QGNvZGUgLi59IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBhbmQgcGFyZW50CisgICAgICogZGlyZWN0b3JpZXMgYXJlIG5vdCByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSBsaXN0LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsdGVyCi0gICAgICogICAgICAgICAgICB0aGUgZmlsdGVyIHRvIG1hdGNoIG5hbWVzIHRvIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgRmlsZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0UGF0aAotICAgICAqIEBzZWUgI2lzRGlyZWN0b3J5Ci0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChGaWxlRGVzY3JpcHRvcikKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWx0ZXIgdG8gbWF0Y2ggbmFtZXMgYWdhaW5zdCwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgcmVhZAorICAgICAqICAgICAgICAgICAgIGFjY2VzcyB0byB0aGlzIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVbXSBsaXN0RmlsZXMoRmlsZUZpbHRlciBmaWx0ZXIpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtOTgxLDIxICsxMDQ4LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBTdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5Ci0gICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyBGaWxlIHRoYXQgbWF0Y2ggYSBzcGVjaWZpYyBmaWx0ZXIuIElmIHRoaXMgRmlsZSBpcwotICAgICAqIG5vdCBhIGRpcmVjdG9yeSB0aGUgcmVzdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGUgZmlsdGVyIGlzCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhbGwgZmlsZW5hbWVzIG1hdGNoLgorICAgICAqIEdldHMgYSBsaXN0IG9mIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHJlcHJlc2VudGVkIGJ5IHRoaXMgZmlsZS4gVGhpcworICAgICAqIGxpc3QgaXMgdGhlbiBmaWx0ZXJlZCB0aHJvdWdoIGEgRmlsZW5hbWVGaWx0ZXIgYW5kIHRoZSBuYW1lcyBvZiBmaWxlcworICAgICAqIHdpdGggbWF0Y2hpbmcgbmFtZXMgYXJlIHJldHVybmVkIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuIFJldHVybnMKKyAgICAgKiB7QGNvZGUgbnVsbH0gaWYgdGhpcyBmaWxlIGlzIG5vdCBhIGRpcmVjdG9yeS4gSWYge0Bjb2RlIGZpbHRlcn0gaXMKKyAgICAgKiB7QGNvZGUgbnVsbH0gdGhlbiBhbGwgZmlsZW5hbWVzIG1hdGNoLgogICAgICAqIDxwPgotICAgICAqIFRoZSBlbnRyaWVzIDxjb2RlPi48L2NvZGU+IGFuZCA8Y29kZT4uLjwvY29kZT4gcmVwcmVzZW50aW5nIGN1cnJlbnQKLSAgICAgKiBkaXJlY3RvcnkgYW5kIHBhcmVudCBkaXJlY3RvcnkgYXJlIG5vdCByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSBsaXN0LgorICAgICAqIFRoZSBlbnRyaWVzIHtAY29kZSAufSBhbmQge0Bjb2RlIC4ufSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgYW5kIHBhcmVudAorICAgICAqIGRpcmVjdG9yaWVzIGFyZSBub3QgcmV0dXJuZWQgYXMgcGFydCBvZiB0aGUgbGlzdC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqICAgICAgICAgICAgdGhlIGZpbHRlciB0byBtYXRjaCBuYW1lcyB0byBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZ3Mgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0UGF0aAotICAgICAqIEBzZWUgI2lzRGlyZWN0b3J5Ci0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChGaWxlRGVzY3JpcHRvcikKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWx0ZXIgdG8gbWF0Y2ggbmFtZXMgYWdhaW5zdCwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgcmVhZAorICAgICAqICAgICAgICAgICAgIGFjY2VzcyB0byB0aGlzIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBsaXN0KEZpbGVuYW1lRmlsdGVyIGZpbHRlcikgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xMDI0LDE0ICsxMDkzLDE2IEBACiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIG5hdGl2ZSBieXRlW11bXSBsaXN0SW1wbChieXRlW10gcGF0aCk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIHRyYWlsaW5nIGZpbGVuYW1lIG9mIHRoaXMgRmlsZS4gTm90Ci0gICAgICogYWxsIGRpcmVjdG9yaWVzIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGlzIEZpbGUgYXJlIGNyZWF0ZWQuCisgICAgICogQ3JlYXRlcyB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSB0cmFpbGluZyBmaWxlbmFtZSBvZiB0aGlzIGZpbGUuIERvZXMKKyAgICAgKiBub3QgY3JlYXRlIHRoZSBjb21wbGV0ZSBwYXRoIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGlzIGRpcmVjdG9yeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkaXJlY3Rvcnkgd2FzIGNyZWF0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEBzZWUgI2dldFBhdGgKLSAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShGaWxlRGVzY3JpcHRvcikKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGlyZWN0b3J5IGhhcyBiZWVuIGNyZWF0ZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgd3JpdGUKKyAgICAgKiAgICAgICAgICAgICBhY2Nlc3MgZm9yIHRoaXMgZmlsZS4KKyAgICAgKiBAc2VlICNta2RpcnMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBta2RpcigpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtMTA0NCwxMyArMTExNSwxNyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbWtkaXJJbXBsKGJ5dGVbXSBmaWxlUGF0aCk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYWxsIHRoZSBkaXJlY3RvcmllcyBuZWVkZWQgZm9yIHRoaXMgRmlsZS4gSWYgdGhlIHRlcm1pbmFsCi0gICAgICogZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBhbnN3ZXIgZmFsc2UuIElmIHRoZSBkaXJlY3RvcmllcyB3ZXJlIGNyZWF0ZWQKLSAgICAgKiBzdWNjZXNzZnVsbHksIGFuc3dlciA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIHRyYWlsaW5nIGZpbGVuYW1lIG9mIHRoaXMgZmlsZSwKKyAgICAgKiBpbmNsdWRpbmcgdGhlIGNvbXBsZXRlIGRpcmVjdG9yeSBwYXRoIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGlzIGRpcmVjdG9yeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuZWNlc3NhcnkgZGlyZWN0b3JpZXMgd2VyZSBjcmVhdGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGhhdmUgYmVlbiBjcmVhdGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBvciBvbmUgb2YKKyAgICAgKiAgICAgICAgIHRoZSBkaXJlY3RvcmllcyBjYW4gbm90IGJlIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHdyaXRlCisgICAgICogICAgICAgICAgICAgYWNjZXNzIGZvciB0aGlzIGZpbGUuCisgICAgICogQHNlZSAjbWtkaXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBta2RpcnMoKSB7CiAgICAgICAgIC8qIElmIHRoZSB0ZXJtaW5hbCBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGFuc3dlciBmYWxzZSAqLwpAQCAtMTA3NCwxOCArMTE0OSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoaXMgRmlsZS4gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgdGhpcwotICAgICAqIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4gT3RoZXJ3aXNlLCBpZiB0aGUgZmlsZSBpcyBjcmVhdGVkCi0gICAgICogc3VjY2Vzc2Z1bGx5LCB0aGUgcmVzdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LiBBbiBJT0V4Y2VwdGlvbiB3aWxsIGJlCi0gICAgICogdGhyb3duIGlmIHRoZSBkaXJlY3RvcnkgdG8gY29udGFpbiB0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3QuCisgICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW0gYWNjb3JkaW5nIHRvIHRoZSBwYXRoCisgICAgICogaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoaXMgZmlsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgRmlsZSB3YXMgY3JlYXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCwge0Bjb2RlIGZhbHNlfSBpZiBpdAorICAgICAqICAgICAgICAgYWxyZWFkeSBleGlzdHMuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgb3IgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShGaWxlRGVzY3JpcHRvcikKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIG9yIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgd2hlcmUKKyAgICAgKiAgICAgICAgICAgICB0aGUgZmlsZSBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHdyaXRlCisgICAgICogICAgICAgICAgICAgYWNjZXNzIGZvciB0aGlzIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlTmV3RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTExNDAsMTYgKzEyMTUsMTggQEAKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgdGVtcG9yYXJ5IGZpbGUgdXNpbmcgdGhlIGdpdmVuIHByZWZpeCBhbmQgc3VmZml4IGFzIHBhcnQKLSAgICAgKiBvZiB0aGUgZmlsZSBuYW1lLiBJZiBzdWZmaXggaXMgbnVsbCwgPGNvZGU+LnRtcDwvY29kZT4gaXMgdXNlZC4KKyAgICAgKiBvZiB0aGUgZmlsZSBuYW1lLiBJZiBzdWZmaXggaXMgbnVsbCwge0Bjb2RlIC50bXB9IGlzIHVzZWQuIFRoaXMgbWV0aG9kCisgICAgICogaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjYWxscyB7QGxpbmsgI2NyZWF0ZVRlbXBGaWxlKFN0cmluZywgU3RyaW5nLAorICAgICAqIEZpbGUpfSB3aXRoIHRoZSB0aGlyZCBhcmd1bWVudCBiZWluZyB7QGNvZGUgbnVsbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHByZWZpeAotICAgICAqICAgICAgICAgICAgdGhlIHByZWZpeCB0byB0aGUgdGVtcCBmaWxlIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmaXggdG8gdGhlIHRlbXAgZmlsZSBuYW1lLgogICAgICAqIEBwYXJhbSBzdWZmaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdWZmaXggdG8gdGhlIHRlbXAgZmlsZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWZmaXggdG8gdGhlIHRlbXAgZmlsZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIHRlbXBvcmFyeSBmaWxlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hlbiB3cml0aW5nIHRoZSBmaWxlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gd3JpdGluZyB0aGUgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMTYxLDE2ICsxMjM4LDIxIEBACiAgICAgICogcHJlZml4IGFuZCBzdWZmaXggYXMgcGFydCBvZiB0aGUgZmlsZSBuYW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwcmVmaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmaXggdG8gdGhlIHRlbXAgZmlsZSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJlZml4IHRvIHRoZSB0ZW1wIGZpbGUgbmFtZS4KICAgICAgKiBAcGFyYW0gc3VmZml4Ci0gICAgICogICAgICAgICAgICB0aGUgc3VmZml4IHRvIHRoZSB0ZW1wIGZpbGUgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHN1ZmZpeCB0byB0aGUgdGVtcCBmaWxlIG5hbWUuCiAgICAgICogQHBhcmFtIGRpcmVjdG9yeQotICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSB0ZW1wIGZpbGUgaXMgdG8gYmUgd3JpdHRlbiwgb3IgbnVsbAotICAgICAqICAgICAgICAgICAgZm9yIHRoZSBkZWZhdWx0IHRlbXAgbG9jYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSB0ZW1wIGZpbGUgaXMgdG8gYmUgd3JpdHRlbiwgb3IKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfSBmb3IgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRlbXBvcmFyeSBmaWxlcywKKyAgICAgKiAgICAgICAgICAgIHdoaWNoIGlzIHRha2VuIGZyb20gdGhlICJqYXZhLmlvLnRtcGRpciIgc3lzdGVtIHByb3BlcnR5LiBJdAorICAgICAqICAgICAgICAgICAgbWF5IGJlIG5lY2Vzc2FyeSB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0byBhbiBleGlzdGluZywgd3JpdGFibGUKKyAgICAgKiAgICAgICAgICAgIGRpcmVjdG9yeSBmb3IgdGhpcyBtZXRob2QgdG8gd29yayBwcm9wZXJseS4gCisgICAgICogQHJldHVybiB0aGUgdGVtcG9yYXJ5IGZpbGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBwcmVmaXh9IGlzIGxlc3MgdGhhbiAzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hlbiB3cml0aW5nIHRoZSBmaWxlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gd3JpdGluZyB0aGUgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCwKICAgICAgICAgICAgIEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTIwNSwxMiArMTI4NywxMyBAQAogICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIC8vIFJlbW92aW5nIHBsYXRmb3JtIGluZGVwZW5kZW50IGNvZGUgYmVjYXVzZSB3ZSdyZSBhbHdheXMgb24gbGludXguCiAgICAgLyoqCi0gICAgICogQW5zd2VyIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJvcGVyIHBhdGggZm9yIHRoZSByZWNlaXZlci4gSWYgdGhlCi0gICAgICogcmVjZWl2ZXIgaXMgYWJzb2x1dGUgZG8gbm90IHByZXBlbmQgdGhlIHVzZXIuZGlyIHByb3BlcnR5LCBvdGhlcndpc2UgZG8uCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByb3BlciBwYXRoIGZvciB0aGlzIGZpbGUuIElmIHRoaXMgZmlsZQorICAgICAqIHBhdGggaXMgYWJzb2x1dGUsIHRoZSB1c2VyLmRpciBwcm9wZXJ0eSBpcyBub3QgcHJlcGVuZGVkLCBvdGhlcndpc2UgaXQKKyAgICAgKiBpcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW50ZXJuYWwKLSAgICAgKiAgICAgICAgICAgIGlzIHVzZXIuZGlyIGludGVybmFsCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVyIHBhdGgKKyAgICAgKiAgICAgICAgICAgIGlzIHVzZXIuZGlyIGludGVybmFsLgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlciBwYXRoLgogICAgICAqLwogICAgIGJ5dGVbXSBwcm9wZXJQYXRoKGJvb2xlYW4gaW50ZXJuYWwpIHsKICAgICAgICAgaWYgKHByb3BlclBhdGggIT0gbnVsbCkgewpAQCAtMTIzNywxOSArMTMyMCwyMiBAQAogICAgICAgICByZXR1cm4gcHJvcGVyUGF0aCA9IFV0aWwuZ2V0Qnl0ZXModXNlcmRpciArIHNlcGFyYXRvciArIHBhdGgpOwogICAgIH0KICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0gICAgCisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIHByb3BlclBhdGhJbXBsKGJ5dGVbXSBwYXRoKTsKKyAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisKICAgICAvKioKLSAgICAgKiBSZW5hbWVzIHRoaXMgRmlsZSB0byB0aGUgbmFtZSByZXByZXNlbnRlZCBieSB0aGUgRmlsZSA8Y29kZT5kZXN0PC9jb2RlPi4KLSAgICAgKiBUaGlzIHdvcmtzIGZvciBib3RoIG5vcm1hbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisgICAgICogUmVuYW1lcyB0aGlzIGZpbGUgdG8gdGhlIG5hbWUgcmVwcmVzZW50ZWQgYnkgdGhlIHtAY29kZSBkZXN0fSBmaWxlLiBUaGlzCisgICAgICogd29ya3MgZm9yIGJvdGggbm9ybWFsIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGVzdAotICAgICAqICAgICAgICAgICAgdGhlIEZpbGUgY29udGFpbmluZyB0aGUgbmV3IG5hbWUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRmlsZSB3YXMgcmVuYW1lZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0UGF0aAotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoRmlsZURlc2NyaXB0b3IpCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBuZXcgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgRmlsZSB3YXMgcmVuYW1lZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHdyaXRlCisgICAgICogICAgICAgICAgICAgYWNjZXNzIGZvciB0aGlzIGZpbGUgb3IgdGhlIHtAY29kZSBkZXN0fSBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbmFtZVRvKGphdmEuaW8uRmlsZSBkZXN0KSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTEyNjMsMTAgKzEzNDksMTEgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHJlbmFtZVRvSW1wbChieXRlW10gcGF0aEV4aXN0LCBieXRlW10gcGF0aE5ldyk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICogZmlsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTEyNzQsMTEgKzEzNjEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+ZmlsZTwvY29kZT4gVVJJIGZvciB0aGlzIEZpbGUuIFRoZSBVUkkgaXMgU3lzdGVtCi0gICAgICogZGVwZW5kZW50IGFuZCBtYXkgbm90IGJlIHRyYW5zZmVyYWJsZSBiZXR3ZWVuIGRpZmZlcmVudCBvcGVyYXRpbmcvZmlsZQorICAgICAqIFJldHVybnMgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgZm9yIHRoaXMgZmlsZS4gVGhlIFVSSSBpcyBzeXN0ZW0KKyAgICAgKiBkZXBlbmRlbnQgYW5kIG1heSBub3QgYmUgdHJhbnNmZXJhYmxlIGJldHdlZW4gZGlmZmVyZW50IG9wZXJhdGluZyAvIGZpbGUKICAgICAgKiBzeXN0ZW1zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSA8Y29kZT5maWxlPC9jb2RlPiBVUkkgZm9yIHRoaXMgRmlsZS4KKyAgICAgKiBAcmV0dXJuIGFuIFVSSSBmb3IgdGhpcyBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkkgdG9VUkkoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0QWJzb2x1dGVOYW1lKCk7CkBAIC0xMjk5LDE0ICsxMzg3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmZpbGU8L2NvZGU+IFVSTCBmb3IgdGhpcyBGaWxlLiBUaGUgVVJMIGlzIFN5c3RlbQotICAgICAqIGRlcGVuZGVudCBhbmQgbWF5IG5vdCBiZSB0cmFuc2ZlcmFibGUgYmV0d2VlbiBkaWZmZXJlbnQgb3BlcmF0aW5nL2ZpbGUKKyAgICAgKiBSZXR1cm5zIGEgVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9yIGZvciB0aGlzIGZpbGUuIFRoZSBVUkwgaXMgc3lzdGVtCisgICAgICogZGVwZW5kZW50IGFuZCBtYXkgbm90IGJlIHRyYW5zZmVyYWJsZSBiZXR3ZWVuIGRpZmZlcmVudCBvcGVyYXRpbmcgLyBmaWxlCiAgICAgICogc3lzdGVtcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+ZmlsZTwvY29kZT4gVVJMIGZvciB0aGlzIEZpbGUuCi0gICAgICogCisgICAgICogQHJldHVybiBhbiBVUkwgZm9yIHRoaXMgZmlsZS4KICAgICAgKiBAdGhyb3dzIGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXRoIGNhbm5vdCBiZSB0cmFuc2Zvcm1lZCBpbnRvIGFuIFVSTAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXRoIGNhbm5vdCBiZSB0cmFuc2Zvcm1lZCBpbnRvIGFuIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMIHRvVVJMKCkgdGhyb3dzIGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0QWJzb2x1dGVOYW1lKCk7CkBAIC0xMzQ5LDYgKzE0MzcsNyBAQAogICAgIH0KIH0KIAorLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogLyoqCiAgKiBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgRGVsZXRlT25FeGl0IG1lY2hhbmlzbS4gSXMgcmVnaXN0ZXJlZCBhcyBhIHNodXRkb3duCiAgKiBob29rIGluIHRoZSBSdW50aW1lLCBvbmNlIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQuCkBAIC0xNDAzLDMgKzE0OTIsNCBAQAogICAgICAgICB9CiAgICAgfQogfQorLy8gRU5EIGFuZHJvaWQtYWRkZWQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVEZXNjcmlwdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlRGVzY3JpcHRvci5qYXZhCmluZGV4IGRlYjAyNDEuLmUxMzFjODggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVEZXNjcmlwdG9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZURlc2NyaXB0b3IuamF2YQpAQCAtMTgsMzcgKzE4LDU2IEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogRmlsZURlc2NyaXB0b3IgaXMgdGhlIGxvd2VzdCBsZXZlbCByZXByZXNlbnRhdGlvbiBvZiBhIEZpbGUsIERldmljZSwgb3IKLSAqIFNvY2tldC4gWW91IGNhbiBjcmVhdGUgYW55IG9mIHRoZSBJTyBjbGFzc2VzIHdoaWNoIHRha2UgYSBGaWxlRGVzY3JpcHRvciBhcwotICogYW4gYXJndW1lbnQgYnkgcXVlcnlpbmcgYW4gb3BlbiBTb2NrZXQgb3IgRmlsZSBmb3IgdGhlIEZpbGVEZXNjcmlwdG9yLgorICogVGhlIGxvd2VzdC1sZXZlbCByZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUsIGRldmljZSwgb3IKKyAqIHNvY2tldC4gSWYgaXMgb2Z0ZW4gdXNlZCBmb3Igd3JhcHBpbmcgYW4gb3BlcmF0aW5nIHN5c3RlbSAiaGFuZGxlIi4gU29tZQorICogSS9PIGNsYXNzZXMgY2FuIGJlIHF1ZXJpZWQgZm9yIHRoZSBGaWxlRGVzY3JpcHRvciB0aGV5IGFyZSBvcGVyYXRpbmcgb24sIGFuZAorICogdGhpcyBkZXNjcmlwdG9yIGNhbiBzdWJzZXF1ZW50bHkgYmUgdXNlZCBkdXJpbmcgdGhlIGluc3RhbnRpYXRpb24gb2YgYW5vdGhlcgorICogSS9PIGNsYXNzLCBzbyB0aGF0IHRoZSBuZXcgb2JqZWN0IHdpbGwgcmV1c2UgaXQuCiAgKiA8cD4KLSAqIFRoZSBGaWxlRGVzY3JpcHRvciBjbGFzcyBhbHNvIGNvbnRhaW5zIHN0YXRpYyBmaWVsZHMgcmVwcmVzZW50aW5nIFN0YW5kYXJkCi0gKiBJbnB1dCwgT3V0cHV0IGFuZCBFcnJvci4gWW91IGNhbiB1c2UgdGhlc2UgZGlyZWN0bHkgaWYgZGVzaXJlZCBidXQgaXQgaXMKLSAqIHJlY29tbWVuZGVkIHlvdSBnbyB0aHJvdWdoIFN5c3RlbS5pbiwgU3lzdGVtLm91dCwgYW5kIFN5c3RlbS5lcnIgc3RyZWFtcwotICogcmVzcGVjdGl2ZWx5LgorICogVGhlIEZpbGVEZXNjcmlwdG9yIGNsYXNzIGFsc28gY29udGFpbnMgc3RhdGljIGZpZWxkcyByZXByZXNlbnRpbmcgdGhlCisgKiBzeXN0ZW0ncyBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zLiBUaGVzZSBjYW4gYmUgdXNlZCBkaXJlY3RseQorICogaWYgZGVzaXJlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGdvIHRocm91Z2ggU3lzdGVtLmluLCBTeXN0ZW0ub3V0LCBhbmQKKyAqIFN5c3RlbS5lcnIgc3RyZWFtcyByZXNwZWN0aXZlbHkuCiAgKiA8cD4KICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGNyZWF0ZSBuZXcgRmlsZURlc2NyaXB0b3JzLgogICogCiAgKiBAc2VlIEZpbGVJbnB1dFN0cmVhbSNnZXRGRCgpCiAgKiBAc2VlIEZpbGVPdXRwdXRTdHJlYW0jZ2V0RkQoKQogICogQHNlZSBSYW5kb21BY2Nlc3NGaWxlI2dldEZEKCkKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlRGVzY3JpcHRvciB7CiAKLSAgICAvKiogRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIFN0YW5kYXJkIEluICovCisgICAgLyoqCisgICAgICogVGhlIEZpbGVEZXNjcmlwdG9yIHJlcHJlc2VudGluZyBzdGFuZGFyZCBpbnB1dC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGluID0gbmV3IEZpbGVEZXNjcmlwdG9yKCk7CiAKLSAgICAvKiogRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIFN0YW5kYXJkIE91dCAqLworICAgIC8qKgorICAgICAqIEZpbGVEZXNjcmlwdG9yIHJlcHJlc2VudGluZyBzdGFuZGFyZCBvdXQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlRGVzY3JpcHRvciBvdXQgPSBuZXcgRmlsZURlc2NyaXB0b3IoKTsKIAotICAgIC8qKiBGaWxlRGVzY3JpcHRvciByZXByZXNlbnRpbmcgU3RhbmRhcmQgRXJyb3IgKi8KKyAgICAvKioKKyAgICAgKiBGaWxlRGVzY3JpcHRvciByZXByZXNlbnRpbmcgc3RhbmRhcmQgZXJyb3IuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlRGVzY3JpcHRvciBlcnIgPSBuZXcgRmlsZURlc2NyaXB0b3IoKTsKIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIG9ubHkgaW50IG9uIGFuZHJvaWQKICAgICAvKioKICAgICAgKiBSZXByZXNlbnRzIGEgbGluayB0byBhbnkgdW5kZXJseWluZyBPUyByZXNvdXJjZXMgZm9yIHRoaXMgRmlsZURlc2NyaXB0b3IuCiAgICAgICogQSB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMgdGhhdCB0aGlzIEZpbGVEZXNjcmlwdG9yIGlzIGludmFsaWQuCiAgICAgICovCiAgICAgaW50IGRlc2NyaXB0b3IgPSAtMTsKKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgCiAgICAgYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOyAKIApAQCAtNjMsOSArODIsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGVEZXNjcmlwdG9yIGNvbnRhaW5pbmcgYW4gaW52YWxpZCBoYW5kbGUuIFRoaXMKLSAgICAgKiBjb25zdHJ1Y3RvciBkb2VzIG5vdGhpbmcgaW50ZXJlc3RpbmcuIFByb3ZpZGVkIGZvciBzaWduYXR1cmUKLSAgICAgKiBjb21wYXRpYmlsaXR5LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZURlc2NyaXB0b3IgY29udGFpbmluZyBhbiBpbnZhbGlkIGhhbmRsZS4gVGhlCisgICAgICogY29udGFpbmVkIGhhbmRsZSBpcyB1c3VhbGx5IG1vZGlmaWVkIGJ5IG5hdGl2ZSBjb2RlIGF0IGEgbGF0ZXIgcG9pbnQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtNzYsNyArOTYsOCBAQAogICAgICAqIGlzIHdyaXR0ZW4gb3V0IHRvIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgYmVmb3JlIHJldHVybmluZy4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFN5bmNGYWlsZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMKKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3luYygpIHRocm93cyBTeW5jRmFpbGVkRXhjZXB0aW9uIHsKICAgICAgICAgLy8gaWYgdGhlIGRlc2NyaXB0b3IgaXMgYSByZWFkLW9ubHkgb25lLCBkbyBub3RoaW5nCkBAIC04OCwxMCArMTA5LDExIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzeW5jSW1wbCgpIHRocm93cyBTeW5jRmFpbGVkRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGlzIEZpbGVEZXNjcmlwdG9yIGlzIHZhbGlkLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgRmlsZURlc2NyaXB0b3IgaXMgdmFsaWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIEZpbGVEZXNjcmlwdG9yIGlzIHZhbGlkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgRmlsZURlc2NyaXB0b3IgaXMgdmFsaWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gdmFsaWQoKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVGaWx0ZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVGaWx0ZXIuamF2YQppbmRleCBhZTk5ZDRlLi42NzRjZTEzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlRmlsdGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZUZpbHRlci5qYXZhCkBAIC0xNSwyMSArMTUsMzAgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIHRoZSBhYnN0cmFjdCBtb2RpZmllciBvZiB0aGUgaW50ZXJmYWNlIHdhcyByZW1vdmVkLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogRmlsZUZpbHRlciBpcyBhbiBpbnRlcmZhY2UgZm9yIGZpbHRlcmluZyBhYnN0cmFjdCBGaWxlcworICogQW4gaW50ZXJmYWNlIGZvciBmaWx0ZXJpbmcge0BsaW5rIEZpbGV9IG9iamVjdHMgYmFzZWQgb24gdGhlaXIgbmFtZXMKKyAqIG9yIG90aGVyIGluZm9ybWF0aW9uLgorICogCisgKiBAc2VlIEZpbGUjbGlzdEZpbGVzKEZpbGVGaWx0ZXIpCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIEZpbGVGaWx0ZXIgeworcHVibGljIGludGVyZmFjZSBGaWxlRmlsdGVyIHsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYSBzcGVjaWZpYyBGaWxlIHNob3VsZCBiZQotICAgICAqIGluY2x1ZGVkIGluIGEgcGF0aG5hbWUgbGlzdC4KKyAgICAgKiBJbmRpY2F0aW5nIHdoZXRoZXIgYSBzcGVjaWZpYyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhIHBhdGhuYW1lIGxpc3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhdGhuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgYWJzdHJhY3QgRmlsZSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBGaWxlIHNob3VsZCBiZSBpbmNsdWRlcywKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICB0aGUgYWJzdHJhY3QgZmlsZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlSW5wdXRTdHJlYW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGYzMzBlMzAuLjRhMWRjODUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbS5qYXZhCkBAIC0yNSwxNSArMjUsMjEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLkZpbGVDaGFubmVsRmFjdG9yeTsKIAogLyoqCi0gKiBGaWxlSW5wdXRTdHJlYW0gaXMgYSBjbGFzcyBmb3IgcmVhZGluZyBieXRlcyBmcm9tIGEgZmlsZS4gVGhpcyBjbGFzcyBtYXkgYWxzbwotICogYmUgdXNlZCB3aXRoIG90aGVyIElucHV0U3RyZWFtcywgaWU6IEJ1ZmZlcmVkSW5wdXRTdHJlYW0sIHRvIHJlYWQgZGF0YSBmcm9tIGEKLSAqIGZpbGUgd2l0aCBidWZmZXJpbmcuCisgKiBBIHNwZWNpYWxpemVkIHtAbGluayBJbnB1dFN0cmVhbX0gdGhhdCByZWFkcyBmcm9tIGEgZmlsZSBpbiB0aGUgZmlsZSBzeXN0ZW0uCisgKiBBbGwgcmVhZCByZXF1ZXN0cyBtYWRlIGJ5IGNhbGxpbmcgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBkaXJlY3RseQorICogZm9yd2FyZGVkIHRvIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uCisgKiBTaW5jZSB0aGlzIG1heSBpbmR1Y2Ugc29tZSBwZXJmb3JtYW5jZSBwZW5hbHR5LCBpbiBwYXJ0aWN1bGFyIGlmIG1hbnkgc21hbGwKKyAqIHJlYWQgcmVxdWVzdHMgYXJlIG1hZGUsIGEgRmlsZUlucHV0U3RyZWFtIGlzIG9mdGVuIHdyYXBwZWQgYnkgYQorICogQnVmZmVyZWRJbnB1dFN0cmVhbS4KICAqIAorICogQHNlZSBCdWZmZXJlZElucHV0U3RyZWFtCiAgKiBAc2VlIEZpbGVPdXRwdXRTdHJlYW0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CiAgICAgLyoqCi0gICAgICogVGhlIEZpbGVEZXNjcmlwdG9yIHJlcHJlc2VudGluZyB0aGlzIEZpbGVJbnB1dFN0cmVhbS4KKyAgICAgKiBUaGUge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSByZXByZXNlbnRpbmcgdGhpcyB7QGNvZGUgRmlsZUlucHV0U3RyZWFtfS4KICAgICAgKi8KICAgICBGaWxlRGVzY3JpcHRvciBmZDsKIApAQCAtNTEsMTggKzU3LDE2IEBACiAgICAgcHJpdmF0ZSBPYmplY3QgcmVwb3NpdGlvbmluZ0xvY2sgPSBuZXcgUmVwb3NpdGlvbmluZ0xvY2soKTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZUlucHV0U3RyZWFtIG9uIHRoZSBGaWxlIDxjb2RlPmZpbGU8L2NvZGU+LiBJZiB0aGUKLSAgICAgKiBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgPGNvZGU+RmlsZU5vdEZvdW5kRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRmlsZUlucHV0U3RyZWFtfSBiYXNlZCBvbiB7QGNvZGUgZmlsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBGaWxlIG9uIHdoaWNoIHRvIHN0cmVhbSByZWFkcy4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhpcyBzdHJlYW0gcmVhZHMuCiAgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgPGNvZGU+ZmlsZTwvY29kZT4gaXMgbm90IGZvdW5kLgotICAgICAqIAotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChTdHJpbmcpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChTdHJpbmcsIE9iamVjdCkKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZmlsZX0gZG9lcyBub3QgZXhpc3QuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHRoZQorICAgICAqICAgICAgICAgICAgIHJlYWQgcmVxdWVzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC03NiwyMSArODAsMjUgQEAKICAgICAgICAgZmQuZGVzY3JpcHRvciA9IGZpbGVTeXN0ZW0ub3BlbihmaWxlLnByb3BlclBhdGgodHJ1ZSksCiAgICAgICAgICAgICAgICAgSUZpbGVTeXN0ZW0uT19SRE9OTFkpOwogICAgICAgICBpbm5lckZEID0gdHJ1ZTsKLSAgICAgICAgY2hhbm5lbCA9IEZpbGVDaGFubmVsRmFjdG9yeS5nZXRGaWxlQ2hhbm5lbCh0aGlzLCBmZC5kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgIElGaWxlU3lzdGVtLk9fUkRPTkxZKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGNoYW5uZWwgPSBGaWxlQ2hhbm5lbEZhY3RvcnkuZ2V0RmlsZUNoYW5uZWwodGhpcywgZmQuZGVzY3JpcHRvciwKKyAgICAgICAgLy8gICAgICAgICBJRmlsZVN5c3RlbS5PX1JET05MWSk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGVJbnB1dFN0cmVhbSBvbiB0aGUgRmlsZURlc2NyaXB0b3IgPGNvZGU+ZmQ8L2NvZGU+LgotICAgICAqIFRoZSBmaWxlIG11c3QgYWxyZWFkeSBiZSBvcGVuLCB0aGVyZWZvcmUgbm8KLSAgICAgKiA8Y29kZT5GaWxlTm90Rm91bmRFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZpbGVJbnB1dFN0cmVhbX0gb24gdGhlIHtAbGluayBGaWxlRGVzY3JpcHRvcn0KKyAgICAgKiB7QGNvZGUgZmR9LiBUaGUgZmlsZSBtdXN0IGFscmVhZHkgYmUgb3BlbiwgdGhlcmVmb3JlIG5vCisgICAgICoge0Bjb2RlIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZkCi0gICAgICogICAgICAgICAgICB0aGUgRmlsZURlc2NyaXB0b3Igb24gd2hpY2ggdG8gc3RyZWFtIHJlYWRzLgotICAgICAqIAotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChTdHJpbmcpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChTdHJpbmcsIE9iamVjdCkKKyAgICAgKiAgICAgICAgICAgIHRoZSBGaWxlRGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoaXMgc3RyZWFtIHJlYWRzLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZmR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgdGhlCisgICAgICogICAgICAgICAgICAgcmVhZCByZXF1ZXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW0oRmlsZURlc2NyaXB0b3IgZmQpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTEwMywzNSArMTExLDM5IEBACiAgICAgICAgIH0KICAgICAgICAgdGhpcy5mZCA9IGZkOwogICAgICAgICBpbm5lckZEID0gZmFsc2U7Ci0gICAgICAgIGNoYW5uZWwgPSBGaWxlQ2hhbm5lbEZhY3RvcnkuZ2V0RmlsZUNoYW5uZWwodGhpcywgZmQuZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICBJRmlsZVN5c3RlbS5PX1JET05MWSk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBjaGFubmVsID0gRmlsZUNoYW5uZWxGYWN0b3J5LmdldEZpbGVDaGFubmVsKHRoaXMsIGZkLmRlc2NyaXB0b3IsCisgICAgICAgIC8vICAgICAgICAgSUZpbGVTeXN0ZW0uT19SRE9OTFkpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWxlSW5wdXRTdHJlYW0gb24gdGhlIGZpbGUgbmFtZWQgPGNvZGU+ZmlsZU5hbWU8L2NvZGU+LgotICAgICAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgPGNvZGU+RmlsZU5vdEZvdW5kRXhjZXB0aW9uPC9jb2RlPiBpcwotICAgICAqIHRocm93bi4gVGhlIDxjb2RlPmZpbGVOYW1lPC9jb2RlPiBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gdGhlCi0gICAgICogU3lzdGVtIHByb3BlcnR5IDxjb2RlPiJ1c2VyLmRpciI8L2NvZGU+LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZpbGVJbnB1dFN0cmVhbX0gb24gdGhlIGZpbGUgbmFtZWQKKyAgICAgKiB7QGNvZGUgZmlsZU5hbWV9LiBUaGUgcGF0aCBvZiB7QGNvZGUgZmlsZU5hbWV9IG1heSBiZSBhYnNvbHV0ZSBvcgorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBzeXN0ZW0gcHJvcGVydHkge0Bjb2RlICJ1c2VyLmRpciJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgb24gd2hpY2ggdG8gc3RyZWFtIHJlYWRzLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHBhdGggYW5kIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGlzIHN0cmVhbSByZWFkcy4KICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSA8Y29kZT5maWxlTmFtZTwvY29kZT4gaXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIGZpbGUgbmFtZWQge0Bjb2RlIGZpbGVOYW1lfS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgdGhlCisgICAgICogICAgICAgICAgICAgcmVhZCByZXF1ZXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhudWxsID09IGZpbGVOYW1lID8gKEZpbGUpIG51bGwgOiBuZXcgRmlsZShmaWxlTmFtZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBpbnQgcmVwcmVzZW50aW5nIHRoZW4gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUKLSAgICAgKiB0aGlzIElucHV0U3RyZWFtIHdpbGwgYmxvY2suIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZQotICAgICAqIGZpbGUgbWludXMgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgdGhpcyBzdHJlYW0gd2lsbAorICAgICAqIGJsb2NrLiBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBtaW51cyB0aGUgY3VycmVudAorICAgICAqIHBvc2l0aW9uLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYmVmb3JlIGJsb2NraW5nLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhpcyBzdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE2Niw0MCArMTc4LDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIEZpbGVJbnB1dFN0cmVhbS4KKyAgICAgKiBDbG9zZXMgdGhpcyBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgRmlsZUlucHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGlmIGZkIGlzIG51bGwsIHRoZW4gdGhlIHVuZGVybHlpbmcgZmlsZSBpcyBub3Qgb3BlbmVkLCBzbyBub3RoaW5nCi0gICAgICAgICAgICAvLyB0byBjbG9zZQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2hhbm5lbCkgewotICAgICAgICAgICAgICAgIGlmIChjaGFubmVsLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKGZkLmRlc2NyaXB0b3IgPj0gMCAmJiBpbm5lckZEKSB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsICYmIGNoYW5uZWwuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCAmJiBmZC5kZXNjcmlwdG9yID49IDApIHsKICAgICAgICAgICAgICAgICBmaWxlU3lzdGVtLmNsb3NlKGZkLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgIGZkLmRlc2NyaXB0b3IgPSAtMTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IGFsbCByZXNvdXJjZXMgZm9yIHRoaXMgZmlsZSBhcmUgcmVsZWFzZWQgd2hlbiBpdAotICAgICAqIGlzIGFib3V0IHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgorICAgICAqIEVuc3VyZXMgdGhhdCBhbGwgcmVzb3VyY2VzIGZvciB0aGlzIHN0cmVhbSBhcmUgcmVsZWFzZWQgd2hlbiBpdCBpcyBhYm91dAorICAgICAqIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmaW5hbGl6ZSB0aGlzCi0gICAgICogICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGZpbmFsaXplIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTIwNyw0NCArMjE0LDUyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRmlsZUNoYW5uZWwgZXF1aXZhbGVudCB0byB0aGlzIGlucHV0IHN0cmVhbS4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRmlsZUNoYW5uZWx9IGVxdWl2YWxlbnQgdG8gdGhpcyBpbnB1dCBzdHJlYW0uCiAgICAgICogPHA+CiAgICAgICogVGhlIGZpbGUgY2hhbm5lbCBpcyByZWFkLW9ubHkgYW5kIGhhcyBhbiBpbml0aWFsIHBvc2l0aW9uIHdpdGhpbiB0aGUgZmlsZQotICAgICAqIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIEZpbGVJbnB1dFN0cmVhbSB3aXRoaW4KLSAgICAgKiB0aGUgZmlsZS4gQWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3Igc3RhdGUgdmlhCi0gICAgICogdGhlIGNoYW5uZWwgYXJlIHZpc2libGUgYnkgdGhlIGlucHV0IHN0cmVhbSBhbmQgdmljZSB2ZXJzYS4KKyAgICAgKiB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgc3RyZWFtIHdpdGhpbiB0aGUgZmlsZS4KKyAgICAgKiBBbGwgY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvciBzdGF0ZSB2aWEgdGhlIGNoYW5uZWwKKyAgICAgKiBhcmUgdmlzaWJsZSBieSB0aGUgaW5wdXQgc3RyZWFtIGFuZCB2aWNlIHZlcnNhLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGNoYW5uZWwgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgRmlsZUlucHV0U3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY2hhbm5lbCBmb3IgdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVDaGFubmVsIGdldENoYW5uZWwoKSB7Ci0gICAgICAgIHJldHVybiBjaGFubmVsOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gRmlsZUNoYW5uZWxGYWN0b3J5LmdldEZpbGVDaGFubmVsKHRoaXMsIGZkLmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBJRmlsZVN5c3RlbS5PX1JET05MWSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlIGZvcgotICAgICAqIHRoaXMgRmlsZUlucHV0U3RyZWFtLgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRpbmcgc3lzdGVtCisgICAgICogcmVzb3VyY2UgZm9yIHRoaXMgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEZpbGVEZXNjcmlwdG9yIGZvciB0aGlzIEZpbGVJbnB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgRmlsZURlc2NyaXB0b3J9IGZvciB0aGlzIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gZ2V0IHRoZSBGaWxlRGVzY3JpcHRvciBvZgotICAgICAqICAgICAgICAgICAgIHRoaXMgRmlsZUlucHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBnZXR0aW5nIHRoaXMgc3RyZWFtJ3MKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgRmlsZURlc2NyaXB0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBGaWxlRGVzY3JpcHRvciBnZXRGRCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBmZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhpcyBGaWxlSW5wdXRTdHJlYW0gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcwotICAgICAqIGFuIGludC4gVGhlIGxvdy1vcmRlciBieXRlIGlzIHJldHVybmVkIG9yIC0xIG9mIHRoZSBlbmQgb2Ygc3RyZWFtIHdhcwotICAgICAqIGVuY291bnRlcmVkLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyIGluIHRoZQorICAgICAqIHJhbmdlIGZyb20gMCB0byAyNTUuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBoYXMgYmVlbgorICAgICAqIHJlYWNoZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhpcyBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTI1NCwxNyArMjY5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgRmlsZUlucHV0U3RyZWFtIGFuZCBzdG9yZXMgdGhlbSBpbiBieXRlIGFycmF5Ci0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGJ5dGUgYXJyYXkKKyAgICAgKiB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgICogICAgICAgICBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTI3MiwyOCArMjg2LDQxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gYnl0ZXMgZnJvbSB0aGUgRmlsZUlucHV0U3RyZWFtIGFuZAotICAgICAqIHN0b3JlcyB0aGVtIGluIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLgorICAgICAqIFJlYWRzIGF0IG1vc3Qge0Bjb2RlIGNvdW50fSBieXRlcyBmcm9tIHRoaXMgc3RyZWFtIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUKKyAgICAgKiBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQKKyAgICAgKiAgICAgICAgICAgIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgICAqICAgICAgICAgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGNvdW50IDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGNvdW50fSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb3VudCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQgfHwgY291bnQgPCAwIHx8IG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyBtYWRlIGltcGxpY2l0IG51bGwgY2hlY2sgZXhwbGljaXQsCisgICAgICAgIC8vIHVzZWQgKG9mZnNldCB8IGNvdW50KSA8IDAgaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGNvdW50IDwgMCkKKyAgICAgICAgLy8gdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3VudCB8IG9mZnNldCkgPCAwIHx8IGNvdW50ID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwMmYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGlmICgwID09IGNvdW50KSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtMzA4LDE4ICszMzUsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTa2lwcyA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgRmlsZUlucHV0U3RyZWFtLgotICAgICAqIFN1YnNlcXVlbnQgPGNvZGU+cmVhZCgpPC9jb2RlPidzIHdpbGwgbm90IHJldHVybiB0aGVzZSBieXRlcyB1bmxlc3MKLSAgICAgKiA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLiBUaGlzIG1ldGhvZCBtYXkgcGVyZm9ybSBtdWx0aXBsZSByZWFkcyB0bwotICAgICAqIHJlYWQgPGNvZGU+Y291bnQ8L2NvZGU+IGJ5dGVzLgorICAgICAqIFNraXBzIHtAY29kZSBjb3VudH0gbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgc3RyZWFtLiBTdWJzZXF1ZW50CisgICAgICoge0Bjb2RlIHJlYWQoKX0ncyB3aWxsIG5vdCByZXR1cm4gdGhlc2UgYnl0ZXMgdW5sZXNzIHtAY29kZSByZXNldCgpfSBpcworICAgICAqIHVzZWQuIFRoaXMgbWV0aG9kIG1heSBwZXJmb3JtIG11bHRpcGxlIHJlYWRzIHRvIHJlYWQge0Bjb2RlIGNvdW50fSBieXRlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY291bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb3VudCA8IDB9LCB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlcgorICAgICAqICAgICAgICAgICAgIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDNkZWJiNTcuLmEwZjViYzYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyNiArMTgsMzEgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBUaGlzIElPIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIGZpbGUgc3BlY2lmaWVkIGJ5IGEgcHJvZ3JhbSBjYW5ub3QgYmUKLSAqIGZvdW5kLgorICogVGhyb3duIHdoZW4gYSBmaWxlIHNwZWNpZmllZCBieSBhIHByb2dyYW0gY2Fubm90IGJlIGZvdW5kLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTc4NTY5NzM4MjM3MTA0OTJMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBGaWxlTm90Rm91bmRFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlCisgICAgICogZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UgYW5kCisgICAgICogZGV0YWlsIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMjhkMjAxMS4uMTlkN2JmZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjUsMTYgKzI1LDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5GaWxlQ2hhbm5lbEZhY3Rvcnk7CiAKIC8qKgotICogRmlsZU91dHB1dFN0cmVhbSBpcyBhIGNsYXNzIHdob3NlIHVuZGVybHlpbmcgc3RyZWFtIGlzIHJlcHJlc2VudGVkIGJ5IGEgZmlsZQotICogaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoZSBieXRlcyB0aGF0IGFyZSB3cml0dGVuIHRvIHRoaXMgc3RyZWFtIGFyZSBwYXNzZWQKLSAqIGRpcmVjdGx5IHRvIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0gZXF1aXZhbGVudCBmdW5jdGlvbi4gU2luY2UKLSAqIG92ZXJoZWFkIG1heSBiZSBoaWdoIGluIHdyaXRpbmcgdG8gdGhlIE9TLCBGaWxlT3V0cHV0U3RyZWFtcyBhcmUgdXN1YWxseQotICogd3JhcHBlZCB3aXRoIGEgQnVmZmVyZWRPdXRwdXRTdHJlYW0gdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIE9TIGlzCi0gKiBjYWxsZWQuCi0gKiA8cD4KLSAqIDxjb2RlPkJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgiYUZpbGUudHh0IikpOzwvY29kZT4KKyAqIEEgc3BlY2lhbGl6ZWQge0BsaW5rIE91dHB1dFN0cmVhbX0gdGhhdCB3cml0ZXMgdG8gYSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAqIEFsbCB3cml0ZSByZXF1ZXN0cyBtYWRlIGJ5IGNhbGxpbmcgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBkaXJlY3RseQorICogZm9yd2FyZGVkIHRvIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uCisgKiBTaW5jZSB0aGlzIG1heSBpbmR1Y2Ugc29tZSBwZXJmb3JtYW5jZSBwZW5hbHR5LCBpbiBwYXJ0aWN1bGFyIGlmIG1hbnkgc21hbGwKKyAqIHdyaXRlIHJlcXVlc3RzIGFyZSBtYWRlLCBhIEZpbGVPdXRwdXRTdHJlYW0gaXMgb2Z0ZW4gd3JhcHBlZCBieSBhCisgKiBCdWZmZXJlZE91dHB1dFN0cmVhbS4KICAqIAorICogQHNlZSBCdWZmZXJlZE91dHB1dFN0cmVhbQogICogQHNlZSBGaWxlSW5wdXRTdHJlYW0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKIApAQCAtNTIsMzkgKzUzLDM3IEBACiAgICAgcHJpdmF0ZSBJRmlsZVN5c3RlbSBmaWxlU3lzdGVtID0gUGxhdGZvcm0uZ2V0RmlsZVN5c3RlbSgpOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWxlT3V0cHV0U3RyZWFtIG9uIHRoZSBGaWxlIDxjb2RlPmZpbGU8L2NvZGU+LiBJZgotICAgICAqIHRoZSBmaWxlIGV4aXN0cywgaXQgaXMgd3JpdHRlbiBvdmVyLiBTZWUgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIGNhbiBhcHBlbmQKLSAgICAgKiB0byB0aGUgZmlsZSBpZiBzbyBkZXNpcmVkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZU91dHB1dFN0cmVhbSBvbiB0aGUgRmlsZSB7QGNvZGUgZmlsZX0uIElmIHRoZSBmaWxlCisgICAgICogZXhpc3RzLCBpdCBpcyBvdmVyd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgdGhlIEZpbGUgb24gd2hpY2ggdG8gc3RyZWFtIHJlYWRzLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gd2hpY2ggdGhpcyBzdHJlYW0gd3JpdGVzLgogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIDxjb2RlPmZpbGU8L2NvZGU+IGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoRmlsZURlc2NyaXB0b3IpCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGZpbGV9IGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHRoZQorICAgICAqICAgICAgICAgICAgIHdyaXRlIHJlcXVlc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIEZpbGVPdXRwdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhmaWxlLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWxlT3V0cHV0U3RyZWFtIG9uIHRoZSBGaWxlIDxjb2RlPmZpbGU8L2NvZGU+LiBJZgotICAgICAqIHRoZSBmaWxlIGV4aXN0cywgaXQgaXMgd3JpdHRlbiBvdmVyLiBUaGUgcGFyYW1ldGVyIDxjb2RlPmFwcGVuZDwvY29kZT4KLSAgICAgKiBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIGlzIG9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gb3IganVzdAotICAgICAqIG9wZW5lZCBlbXB0eS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGVPdXRwdXRTdHJlYW0gb24gdGhlIEZpbGUge0Bjb2RlIGZpbGV9LiBUaGUKKyAgICAgKiBwYXJhbWV0ZXIge0Bjb2RlIGFwcGVuZH0gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBpcyBvcGVuZWQgYW5kCisgICAgICogYXBwZW5kZWQgdG8gb3IganVzdCBvcGVuZWQgYW5kIG92ZXJ3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgRmlsZSBvbiB3aGljaCB0byBzdHJlYW0gcmVhZHMuCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSB0byB3aGljaCB0aGlzIHN0cmVhbSB3cml0ZXMuCiAgICAgICogQHBhcmFtIGFwcGVuZAotICAgICAqICAgICAgICAgICAgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gYXBwZW5kIHRvIGFuIGV4aXN0aW5nCi0gICAgICogICAgICAgICAgICBmaWxlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGFwcGVuZCB0byBhbiBleGlzdGluZyBmaWxlLgogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIDxjb2RlPmZpbGU8L2NvZGU+IGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoRmlsZURlc2NyaXB0b3IpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoU3RyaW5nKQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgZmlsZX0gY2Fubm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgdGhlCisgICAgICogICAgICAgICAgICAgd3JpdGUgcmVxdWVzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZU91dHB1dFN0cmVhbShGaWxlIGZpbGUsIGJvb2xlYW4gYXBwZW5kKQogICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CkBAIC0xMDIsMTQgKzEwMSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZU91dHB1dFN0cmVhbSBvbiB0aGUgRmlsZURlc2NyaXB0b3IgPGNvZGU+ZmQ8L2NvZGU+LgotICAgICAqIFRoZSBmaWxlIG11c3QgYWxyZWFkeSBiZSBvcGVuLCB0aGVyZWZvcmUgbm8gPGNvZGU+RmlsZUlPRXhjZXB0aW9uPC9jb2RlPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZU91dHB1dFN0cmVhbSBvbiB0aGUgRmlsZURlc2NyaXB0b3Ige0Bjb2RlIGZkfS4gVGhlCisgICAgICogZmlsZSBtdXN0IGFscmVhZHkgYmUgb3BlbiwgdGhlcmVmb3JlIG5vIHtAY29kZSBGaWxlTm90Rm91bmRFeGNlcHRpb259CiAgICAgICogd2lsbCBiZSB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZkCi0gICAgICogICAgICAgICAgICB0aGUgRmlsZURlc2NyaXB0b3Igb24gd2hpY2ggdG8gc3RyZWFtIHdyaXRlcy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShGaWxlRGVzY3JpcHRvcikKKyAgICAgKiAgICAgICAgICAgIHRoZSBGaWxlRGVzY3JpcHRvciB0byB3aGljaCB0aGlzIHN0cmVhbSB3cml0ZXMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBmZH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyB0aGUKKyAgICAgKiAgICAgICAgICAgICB3cml0ZSByZXF1ZXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlT3V0cHV0U3RyZWFtKEZpbGVEZXNjcmlwdG9yIGZkKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC0xMjcsMzYgKzEzMCwzOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsZU91dHB1dFN0cmVhbSBvbiB0aGUgZmlsZSBuYW1lZCA8Y29kZT5maWxlTmFtZTwvY29kZT4uCi0gICAgICogSWYgdGhlIGZpbGUgZXhpc3RzLCBpdCBpcyB3cml0dGVuIG92ZXIuIFNlZSB0aGUgY29uc3RydWN0b3Igd2hpY2ggY2FuCi0gICAgICogYXBwZW5kIHRvIHRoZSBmaWxlIGlmIHNvIGRlc2lyZWQuIFRoZSA8Y29kZT5maWxlTmFtZTwvY29kZT4gbWF5IGJlCi0gICAgICogYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gdGhlIFN5c3RlbSBwcm9wZXJ0eSA8Y29kZT4idXNlci5kaXIiPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGVPdXRwdXRTdHJlYW0gb24gdGhlIGZpbGUgbmFtZWQge0Bjb2RlIGZpbGVuYW1lfS4gSWYKKyAgICAgKiB0aGUgZmlsZSBleGlzdHMsIGl0IGlzIG92ZXJ3cml0dGVuLiBUaGUge0Bjb2RlIGZpbGVuYW1lfSBtYXkgYmUgYWJzb2x1dGUKKyAgICAgKiBvciByZWxhdGl2ZSB0byB0aGUgc3lzdGVtIHByb3BlcnR5IHtAY29kZSAidXNlci5kaXIifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIG9uIHdoaWNoIHRvIHN0cmVhbSB3cml0ZXMuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB3aGljaCB0aGlzIHN0cmVhbSB3cml0ZXMuCiAgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgdGhlCisgICAgICogICAgICAgICAgICAgd3JpdGUgcmVxdWVzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZU91dHB1dFN0cmVhbShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICB0aGlzKGZpbGVuYW1lLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWxlT3V0cHV0U3RyZWFtIG9uIHRoZSBmaWxlIG5hbWVkIDxjb2RlPmZpbGVuYW1lPC9jb2RlPi4KLSAgICAgKiBJZiB0aGUgZmlsZSBleGlzdHMsIGl0IGlzIHdyaXR0ZW4gb3Zlci4gVGhlIHBhcmFtZXRlciA8Y29kZT5hcHBlbmQ8L2NvZGU+Ci0gICAgICogZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBpcyBvcGVuZWQgYW5kIGFwcGVuZGVkIHRvIG9yIGp1c3QKLSAgICAgKiBvcGVuZWQgZW1wdHkuIFRoZSA8Y29kZT5maWxlbmFtZTwvY29kZT4gbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIHRvCi0gICAgICogdGhlIFN5c3RlbSBwcm9wZXJ0eSA8Y29kZT4idXNlci5kaXIiPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGVPdXRwdXRTdHJlYW0gb24gdGhlIGZpbGUgbmFtZWQge0Bjb2RlIGZpbGVuYW1lfS4KKyAgICAgKiBUaGUgcGFyYW1ldGVyIHtAY29kZSBhcHBlbmR9IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGZpbGUgaXMgb3BlbmVkCisgICAgICogYW5kIGFwcGVuZGVkIHRvIG9yIGp1c3Qgb3BlbmVkIGFuZCBvdmVyd3JpdHRlbi4gVGhlIHtAY29kZSBmaWxlbmFtZX0gbWF5CisgICAgICogYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gdGhlIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgInVzZXIuZGlyIn0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSBvbiB3aGljaCB0byBzdHJlYW0gd3JpdGVzLgogICAgICAqIEBwYXJhbSBhcHBlbmQKLSAgICAgKiAgICAgICAgICAgIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGFwcGVuZCB0byBhbiBleGlzdGluZwotICAgICAqICAgICAgICAgICAgZmlsZS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHRoaXMgc3RyZWFtIHdyaXRlcy4KICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSA8Y29kZT5maWxlbmFtZTwvY29kZT4gY2Fubm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyB0aGUKKyAgICAgKiAgICAgICAgICAgICB3cml0ZSByZXF1ZXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlT3V0cHV0U3RyZWFtKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBhcHBlbmQpCiAgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKQEAgLTE2NCwxMSArMTcwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIEZpbGVPdXRwdXRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gY2xvc2VzIHRoZSB1bmRlcmx5aW5nIE9TCi0gICAgICogcmVzb3VyY2VzIGFsbG9jYXRlZCB0byByZXByZXNlbnQgdGhpcyBzdHJlYW0uCisgICAgICogQ2xvc2VzIHRoaXMgc3RyZWFtLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcKKyAgICAgKiBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCB0byByZXByZXNlbnQgdGhpcyBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgRmlsZU91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xOTUsMTMgKzIwMiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZyZWVzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIHJlcHJlc2VudCB0aGlzIEZpbGVPdXRwdXRTdHJlYW0gYmVmb3JlCi0gICAgICogaXQgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBKYXZhIFZpcnR1YWwKLSAgICAgKiBNYWNoaW5lLgorICAgICAqIEZyZWVzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciB0aGlzIHN0cmVhbSBiZWZvcmUgaXQgaXMgZ2FyYmFnZQorICAgICAqIGNvbGxlY3RlZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmaW5hbGl6ZSB0aGlzCi0gICAgICogICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmaW5hbGl6ZSB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yMTIsMTIgKzIxOCwxMyBAQAogICAgICAqIFJldHVybnMgdGhlIEZpbGVDaGFubmVsIGVxdWl2YWxlbnQgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgogICAgICAqIDxwPgogICAgICAqIFRoZSBmaWxlIGNoYW5uZWwgaXMgd3JpdGUtb25seSBhbmQgaGFzIGFuIGluaXRpYWwgcG9zaXRpb24gd2l0aGluIHRoZQotICAgICAqIGZpbGUgdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIEZpbGVPdXRwdXRTdHJlYW0KLSAgICAgKiB3aXRoaW4gdGhlIGZpbGUuIEFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIHN0YXRlCi0gICAgICogdmlhIHRoZSBjaGFubmVsIGFyZSB2aXNpYmxlIGJ5IHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB2aWNlIHZlcnNhLgorICAgICAqIGZpbGUgdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIHN0cmVhbSB3aXRoaW4gdGhlCisgICAgICogZmlsZS4gQWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3Igc3RhdGUgdmlhIHRoZQorICAgICAqIGNoYW5uZWwgYXJlIHZpc2libGUgYnkgdGhlIG91dHB1dCBzdHJlYW0gYW5kIHZpY2UgdmVyc2EuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBGaWxlT3V0cHV0U3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVDaGFubmVsIGdldENoYW5uZWwoKSB7CiAgICAgICAgIHJldHVybiBjaGFubmVsOwpAQCAtMjI1LDI4ICsyMzIsMjggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBGaWxlRGVzY3JpcHRvciB3aGljaCByZXByZXNlbnRzIHRoZSBsb3dlc3QgbGV2ZWwgcmVwcmVzZW50YXRpb24KLSAgICAgKiBvZiBhIE9TIHN0cmVhbSByZXNvdXJjZS4KKyAgICAgKiBvZiBhbiBvcGVyYXRpbmcgc3lzdGVtIHN0cmVhbSByZXNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoaXMgRmlsZU91dHB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoaXMgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgU3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIGFuZCB0aGVyZSBpcyBubwotICAgICAqICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGdldCB0aGUgRmlsZURlc2NyaXB0b3Igb2YKKyAgICAgKiAgICAgICAgICAgICB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgRmlsZURlc2NyaXB0b3IgZ2V0RkQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZmQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiB0bwotICAgICAqIHRoaXMgRmlsZU91dHB1dFN0cmVhbS4KKyAgICAgKiBXcml0ZXMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSB0byB0aGlzCisgICAgICogc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8KKyAgICAgKiAgICAgICAgICAgICB3cml0ZSB0byB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjU0LDM0ICsyNjEsNDEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IDxjb2RlPmJ5dGVzPC9jb2RlPiBmcm9tIHRoZSBieXRlIGFycmF5Ci0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHRvIHRoaXMKLSAgICAgKiBGaWxlT3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQKKyAgICAgKiB7QGNvZGUgb2Zmc2V0fSB0byB0aGlzIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZmZlciB0byBnZXQgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZS4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIgdG8gd3JpdGUKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20ge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgb2Zmc2V0IG9yIGNvdW50IGFyZSBvdXRzaWRlIG9mIGJvdW5kcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY291bnQgPCAwfSBvciB7QGNvZGUgb2Zmc2V0IDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGNvdW50ICsgb2Zmc2V0fSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8KKyAgICAgKiAgICAgICAgICAgICB3cml0ZSB0byB0aGlzIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYnVmZmVyIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZmZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LAorICAgICAgICAvLyB1c2VkIChvZmZzZXQgfCBjb3VudCkgPCAwIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChjb3VudCA8IDApCisgICAgICAgIC8vIHRvIHNhZmUgb25lIG9wZXJhdGlvbgogICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50IDwgMCB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGgKLSAgICAgICAgICAgICAgICB8fCBjb3VudCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIGlmICgoY291bnQgfCBvZmZzZXQpIDwgMCB8fCBjb3VudCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0yOTIsMTYgKzMwNiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGJ5dGUgPGNvZGU+b25lQnl0ZTwvY29kZT4gdG8gdGhpcwotICAgICAqIEZpbGVPdXRwdXRTdHJlYW0uIE9ubHkgdGhlIGxvdyBvcmRlciBieXRlIG9mIDxjb2RlPm9uZUJ5dGU8L2NvZGU+IGlzCi0gICAgICogd3JpdHRlbi4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBieXRlIHtAY29kZSBvbmVCeXRlfSB0byB0aGlzIHN0cmVhbS4gT25seSB0aGUgbG93CisgICAgICogb3JkZXIgYnl0ZSBvZiB0aGUgaW50ZWdlciB7QGNvZGUgb25lQnl0ZX0gaXMgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQnl0ZQotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gYmUgd3JpdHRlbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gYmUgd3JpdHRlbi4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlCisgICAgICogICAgICAgICAgICAgdG8gdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IG9uZUJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlUGVybWlzc2lvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZVBlcm1pc3Npb24uamF2YQppbmRleCA5YzNlY2NjLi4zNzAyYWM3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlUGVybWlzc2lvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVQZXJtaXNzaW9uLmphdmEKQEAgLTI1LDE2ICsyNSwyOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoZSBjbGFzcyBGaWxlUGVybWlzc2lvbiBpcyByZXNwb25zaWJsZSBmb3IgZ3JhbnRpbmcgYWNjZXNzIHRvIGZpbGVzIG9yCi0gKiBkaXJlY3Rvcmllcy4gVGhlIEZpbGVQZXJtaXNzaW9uIGlzIG1hZGUgdXAgb2YgYSBwYXRobmFtZSBhbmQgYSBzZXQgb2YgYWN0aW9ucwotICogd2hpY2ggYXJlIHZhbGlkIGZvciB0aGUgcGF0aG5hbWUuCi0gKiA8UD4KLSAqIFRoZSA8Y29kZT5GaWxlLnNlcGFyYXRvckNoYXI8L2NvZGU+IG11c3QgYmUgdXNlZCBpbiBhbGwgcGF0aG5hbWVzIHdoZW4KKyAqIEEgcGVybWlzc2lvbiBmb3IgYWNjZXNzaW5nIGEgZmlsZSBvciBkaXJlY3RvcnkuIFRoZSBGaWxlUGVybWlzc2lvbiBpcyBtYWRlIHVwCisgKiBvZiBhIHBhdGhuYW1lIGFuZCBhIHNldCBvZiBhY3Rpb25zIHdoaWNoIGFyZSB2YWxpZCBmb3IgdGhlIHBhdGhuYW1lLgorICogPHA+CisgKiBUaGUge0Bjb2RlIEZpbGUuc2VwYXJhdG9yQ2hhcn0gbXVzdCBiZSB1c2VkIGluIGFsbCBwYXRobmFtZXMgd2hlbgogICogY29uc3RydWN0aW5nIGEgRmlsZVBlcm1pc3Npb24uIFRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zIHdpbGwgYXNzdW1lIHRoZQotICogY2hhciBpcyA8L2NvZGU+LzwvY29kZT4uIEEgcGF0aG5hbWUgd2hpY2ggZW5kcyBpbiAiLyoiLCBpbXBsaWVzIGFsbCB0aGUKLSAqIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBjb250YWluZWQgaW4gdGhhdCBkaXJlY3RvcnkuIElmIHRoZSBwYXRobmFtZSBlbmRzIGluCi0gKiAiLy0iLCBpdCBpbmRpY2F0ZXMgYWxsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gdGhhdCBkaXJlY3RvcnkKLSAqIDxiPnJlY3Vyc2l2ZWx5PC9iPi4KKyAqIGNoYXIgaXMge0Bjb2RlIC99LiBBIHBhdGhuYW1lIHRoYXQgZW5kcyBpbiB7QGNvZGUgLyp9IGluY2x1ZGVzIGFsbCB0aGUgZmlsZXMKKyAqIGFuZCBkaXJlY3RvcmllcyBjb250YWluZWQgaW4gdGhhdCBkaXJlY3RvcnkuIElmIHRoZSBwYXRobmFtZQorICogZW5kcyBpbiB7QGNvZGUgLy19LCBpdCBpbmNsdWRlcyBhbGwgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiB0aGF0CisgKiBkaXJlY3RvcnkgPGk+cmVjdXJzaXZlbHk8L2k+LiBUaGUgZm9sbG93aW5nIHBhdGhuYW1lcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nOgorICogPC9wPgorICogPHVsPgorICogICA8bGk+CisgKiAgICAgIioiOiBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5OworICogICA8L2xpPgorICogICA8bGk+CisgKiAgICAgIi0iOiByZWN1cnNpdmVseSBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeTsKKyAqICAgPC9saT4KKyAqICAgPGxpPgorICogICAgICImbHQ7Jmx0O0FMTCBGSUxFUyZndDsmZ3Q7IjogYW55IGZpbGUgYW5kIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uCisgKiAgIDwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEZpbGVQZXJtaXNzaW9uIGV4dGVuZHMgUGVybWlzc2lvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAgICAgCkBAIC02NSwxMCArNzgsMTcgQEAKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbGVQZXJtaXNzaW9uIHdpdGggdGhlIHBhdGggYW5kIGFjdGlvbnMgc3BlY2lmaWVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byBhcHBseSB0aGUgYWN0aW9ucyB0by4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gYXBwbHkgdGhlIGFjdGlvbnMgdG8uCiAgICAgICogQHBhcmFtIGFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBhY3Rpb25zIGZvciB0aGUgPGNvZGU+cGF0aDxjb2RlPi4gTWF5IGJlIGFueQotICAgICAqICAgICAgICAgICAgY29tYmluYXRpb24gb2YgcmVhZCwgd3JpdGUsIGV4ZWN1dGUsIG9yIGRlbGV0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhY3Rpb25zIGZvciB0aGUge0Bjb2RlIHBhdGh9LiBNYXkgYmUgYW55IGNvbWJpbmF0aW9uIG9mCisgICAgICogICAgICAgICAgICAicmVhZCIsICJ3cml0ZSIsICJleGVjdXRlIiBhbmQgImRlbGV0ZSIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWN0aW9uc30gaXMge0Bjb2RlIG51bGx9IG9yIGFuIGVtcHR5IHN0cmluZywgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICBpdCBjb250YWlucyBhIHN0cmluZyBvdGhlciB0aGFuICJyZWFkIiwgIndyaXRlIiwgImV4ZWN1dGUiCisgICAgICogICAgICAgICAgICAgYW5kICJkZWxldGUiLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcGF0aH0gaXMgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZVBlcm1pc3Npb24oU3RyaW5nIHBhdGgsIFN0cmluZyBhY3Rpb25zKSB7CiAgICAgICAgIHN1cGVyKHBhdGgpOwpAQCAtMTA3LDcgKzEyNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgcGVybWlzc2lvbnMgYWN0aW9ucy4gSXQgbXVzdCBiZSBvZgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBwZXJtaXNzaW9uJ3MgYWN0aW9ucy4gSXQgbXVzdCBiZSBvZgogICAgICAqIHRoZSBmb3JtICJyZWFkLHdyaXRlLGV4ZWN1dGUsZGVsZXRlIiwgYWxsIGxvd2VyIGNhc2UgYW5kIGluIHRoZSBjb3JyZWN0CiAgICAgICogb3JkZXIgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBhY3Rpb24uCiAgICAgICogCkBAIC0xNzQsOSArMTk0LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgdGhlIGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZSBwZXJtaXNzaW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgcGVybWlzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbnMoKSB7CkBAIC0xODQsMTQgKzIwNSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIHBlcm1pc3Npb24gaXMgZXF1YWwgdG8gYW5vdGhlci4gVGhlIHR3byBhcmUgZXF1YWwgaWYKLSAgICAgKiA8Y29kZT5vYmo8L2NvZGU+IGlzIGEgRmlsZVBlcm1pc3Npb24sIHRoZXkgaGF2ZSB0aGUgc2FtZSBwYXRoLCBhbmQgdGhleQorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGZpbGUgcGVybWlzc2lvbiBpcyBlcXVhbCB0byBhbm90aGVyLiBUaGUgdHdvIGFyZSBlcXVhbAorICAgICAqIGlmIHtAY29kZSBvYmp9IGlzIGEgRmlsZVBlcm1pc3Npb24sIHRoZXkgaGF2ZSB0aGUgc2FtZSBwYXRoLCBhbmQgdGhleQogICAgICAqIGhhdmUgdGhlIHNhbWUgYWN0aW9ucy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNoZWNrIGVxdWFsaXR5IHdpdGguCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHdvIGFyZSBlcXVhbCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBmaWxlIHBlcm1pc3Npb24gaXMgZXF1YWwgdG8ge0Bjb2RlIG9ian0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtMjEzLDEyICsyMzUsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGVybWlzc2lvbiB7QGNvZGUgcH0gaXMgaW1wbGllZCBieSB0aGlzIGZpbGUKKyAgICAgKiBwZXJtaXNzaW9uLiBUaGlzIGlzIHRoZSBjYXNlIGlmIHtAY29kZSBwfSBpcyBhbiBpbnN0YW5jZSBvZgorICAgICAqIHtAY29kZSBGaWxlUGVybWlzc2lvbn0sIGlmIHtAY29kZSBwfSdzIGFjdGlvbnMgYXJlIGEgc3Vic2V0IG9mIHRoaXMKKyAgICAgKiBmaWxlIHBlcm1pc3Npb24ncyBhY3Rpb25zIGFuZCBpZiB7QGNvZGUgcH0ncyBwYXRoIGlzIGltcGxpZWQgYnkgdGhpcworICAgICAqIGZpbGUgcGVybWlzc2lvbidzIHBhdGguCiAgICAgICogCiAgICAgICogQHBhcmFtIHAKLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgcGVybWlzc2lvbiB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhlCi0gICAgICogICAgICAgICByZWNlaXZlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QuCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIsIGFuZCB7QGNvZGUgZmFsc2V9IGlmIGl0IGlzIG5vdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcCkgewpAQCAtMzMwLDEwICszNTcsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcgUGVybWlzc2lvbkNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gcGxhY2UgRmlsZVBlcm1pc3Npb24KLSAgICAgKiBPYmplY3RzLgorICAgICAqIG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIG5ldyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBzdWl0YWJsZSBmb3Igc3RvcmluZyBGaWxlUGVybWlzc2lvbgotICAgICAqICAgICAgICAgb2JqZWN0cy4KKyAgICAgKiBAcmV0dXJuIEEgbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uIG9iamVjdCBzdWl0YWJsZSBmb3Igc3RvcmluZworICAgICAqICAgICAgICAgRmlsZVBlcm1pc3Npb24gb2JqZWN0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CkBAIC0zNDEsOSArMzY5LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnQgcmVwcmVzZW50aW5nIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgRmlsZVBlcm1pc3Npb24uCisgICAgICogQ2FsY3VsYXRlcyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIGZpbGUgcGVybWlzc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIEZpbGVQZXJtaXNzaW9uLgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBmaWxlIHBlcm1pc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZVBlcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKaW5kZXggZWRjMTUzOC4uOWQ0OWI3OSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZVBlcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZVBlcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKQEAgLTIzLDkgKzIzLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogLyoqCi0gKiBGaWxlUGVybWlzc2lvbkNvbGxlY3Rpb24gaXMgYSBjbGFzcyB3aGljaCBob2xkcyBhIGNvbGxlY3Rpb24gb2YKLSAqIEZpbGVQZXJtaXNzaW9uIG9iamVjdHMgYW5kIGNhbiBhbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYQotICogc3BlY2lmaWMgcGVybWlzc2lvbnMgaXMgaW1wbGllZCBieSBhIEZpbGVQZXJtaXNzaW9uQ29sbGVjdGlvbi4KKyAqIENvbGxlY3RzIHtAbGluayBGaWxlUGVybWlzc2lvbn0gb2JqZWN0cyBhbmQgYWxsb3dzIHRvIHF1ZXJ5IHdoZXRoZXIgYQorICogcGFydGljdWxhciBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgaXQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBmaW5hbCBjbGFzcyBGaWxlUGVybWlzc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBpbXBsZW1lbnRzCiAgICAgICAgIFNlcmlhbGl6YWJsZSB7CkBAIC0zNSwxNSArMzYsMjIgQEAKICAgICBWZWN0b3I8UGVybWlzc2lvbj4gcGVybWlzc2lvbnMgPSBuZXcgVmVjdG9yPFBlcm1pc3Npb24+KCk7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRmlsZVBlcm1pc3Npb25Db2xsZWN0aW9uLgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBGaWxlUGVybWlzc2lvbkNvbGxlY3Rpb24KICAgICAgKi8KICAgICBwdWJsaWMgRmlsZVBlcm1pc3Npb25Db2xsZWN0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZCBhIHBlcm1pc3Npb24gT2JqZWN0IHRvIHRoZSBwZXJtaXNzaW9uIGNvbGxlY3Rpb24uCisgICAgICogQWRkIGEgcGVybWlzc2lvbiBvYmplY3QgdG8gdGhlIHBlcm1pc3Npb24gY29sbGVjdGlvbi4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIEZpbGVQZXJtaXNzaW9uIG9iamVjdCB0byBhZGQgdG8gdGhlIGNvbGxlY3Rpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcGVybWlzc2lvbn0gaXMgbm90IGFuIGluc3RhbmNlIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIEZpbGVQZXJtaXNzaW9ufS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY29sbGVjdGlvbiBpcyByZWFkLW9ubHkuCiAgICAgICogQHNlZSBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uI2FkZChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC02MSw2ICs2OSw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBmb3IgdGhlIGNvbGxlY3Rpb24gb2YgcGVybWlzc2lvbnMuCiAgICAgICogCisgICAgICogQHJldHVybiBhIHBlcm1pc3Npb24gZW51bWVyYXRpb24gZm9yIHRoaXMgcGVybWlzc2lvbiBjb2xsZWN0aW9uLgogICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiNlbGVtZW50cygpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC02OSw5ICs3OCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBwZXJtaXNzaW9ucyBjb2xsZWN0aW9uCi0gICAgICogaW1wbGllcyBhIHNwZWNpZmljIDxjb2RlPnBlcm1pc3Npb248L2NvZGU+LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGVybWlzc2lvbnMgY29sbGVjdGlvbiBpbXBsaWVzIGEgc3BlY2lmaWMKKyAgICAgKiB7QGNvZGUgcGVybWlzc2lvbn0uCiAgICAgICogCisgICAgICogQHBhcmFtIHBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrLgogICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVSZWFkZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVSZWFkZXIuamF2YQppbmRleCA2MTJiM2M3Li45MGNkNDU0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlUmVhZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZVJlYWRlci5qYXZhCkBAIC0xOCw1MiArMTgsNTQgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBGaWxlUmVhZGVyIGlzIGNsYXNzIGZvciB0dXJuaW5nIGEgZmlsZSBpbnRvIGEgY2hhcmFjdGVyIFN0cmVhbS4gRGF0YSByZWFkCi0gKiBmcm9tIHRoZSBzb3VyY2UgaXMgY29udmVydGVkIGludG8gY2hhcmFjdGVycy4gVGhlIGVuY29kaW5nIGlzIGFzc3VtZWQgdG8KLSAqIDg4NTlfMS4gVGhlIEZpbGVSZWFkZXIgY29udGFpbnMgYSBidWZmZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIHRoZSBzb3VyY2UgYW5kCi0gKiBjb252ZXJ0cyB0aGVzZSBpbnRvIGNoYXJhY3RlcnMgYXMgbmVlZGVkLiBUaGUgYnVmZmVyIHNpemUgaXMgOEsuCisgKiBBIHNwZWNpYWxpemVkIHtAbGluayBSZWFkZXJ9IHRoYXQgcmVhZHMgZnJvbSBhIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtLgorICogQWxsIHJlYWQgcmVxdWVzdHMgbWFkZSBieSBjYWxsaW5nIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmUgZGlyZWN0bHkKKyAqIGZvcndhcmRlZCB0byB0aGUgZXF1aXZhbGVudCBmdW5jdGlvbiBvZiB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtLgorICogU2luY2UgdGhpcyBtYXkgaW5kdWNlIHNvbWUgcGVyZm9ybWFuY2UgcGVuYWx0eSwgaW4gcGFydGljdWxhciBpZiBtYW55IHNtYWxsCisgKiByZWFkIHJlcXVlc3RzIGFyZSBtYWRlLCBhIEZpbGVSZWFkZXIgaXMgb2Z0ZW4gd3JhcHBlZCBieSBhCisgKiBCdWZmZXJlZFJlYWRlci4KICAqIAorICogQHNlZSBCdWZmZXJlZFJlYWRlcgogICogQHNlZSBGaWxlV3JpdGVyCisgKgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlUmVhZGVyIGV4dGVuZHMgSW5wdXRTdHJlYW1SZWFkZXIgewogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IEZpbGVSZWFkZXIgb24gdGhlIGdpdmVuIEZpbGUgPGNvZGU+ZmlsZTwvY29kZT4uIElmIHRoZQotICAgICAqIDxjb2RlPmZpbGU8L2NvZGU+IHNwZWNpZmllZCBjYW5ub3QgYmUgZm91bmQsIHRocm93IGEKLSAgICAgKiBGaWxlTm90Rm91bmRFeGNlcHRpb24uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWxlUmVhZGVyIG9uIHRoZSBnaXZlbiB7QGNvZGUgZmlsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbGUKICAgICAgKiAgICAgICAgICAgIGEgRmlsZSB0byBiZSBvcGVuZWQgZm9yIHJlYWRpbmcgY2hhcmFjdGVycyBmcm9tLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZmlsZX0gZG9lcyBub3QgZXhpc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlUmVhZGVyKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBGaWxlUmVhZGVyIG9uIHRoZSBnaXZlbiBGaWxlRGVzY3JpcHRvciA8Y29kZT5mZDwvY29kZT4uCi0gICAgICogU2luY2UgYSBwcmV2aW91c2x5IG9wZW5lZCBGaWxlRGVzY3JpcHRvciBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQsIG5vCi0gICAgICogRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRmlsZVJlYWRlciBvbiB0aGUgZ2l2ZW4gRmlsZURlc2NyaXB0b3Ige0Bjb2RlIGZkfS4gU2luY2UKKyAgICAgKiBhIHByZXZpb3VzbHkgb3BlbmVkIEZpbGVEZXNjcmlwdG9yIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCwgbm8KKyAgICAgKiBGaWxlTm90Rm91bmRFeGNlcHRpb24gY2FuIGJlIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmQKICAgICAgKiAgICAgICAgICAgIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVSZWFkZXIoRmlsZURlc2NyaXB0b3IgZmQpIHsKICAgICAgICAgc3VwZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmZCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBGaWxlUmVhZGVyIG9uIHRoZSBnaXZlbiBmaWxlIG5hbWVkIDxjb2RlPmZpbGVuYW1lPC9jb2RlPi4KLSAgICAgKiBJZiB0aGUgPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IHNwZWNpZmllZCBjYW5ub3QgYmUgZm91bmQsIHRocm93IGEKLSAgICAgKiBGaWxlTm90Rm91bmRFeGNlcHRpb24uCisgICAgICogQ29uc3RydWN0IGEgbmV3IEZpbGVSZWFkZXIgb24gdGhlIGdpdmVuIGZpbGUgbmFtZWQge0Bjb2RlIGZpbGVuYW1lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZW5hbWUKICAgICAgKiAgICAgICAgICAgIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggc3BlY2lmeWluZyB0aGUgZmlsZSB0byBvcGVuLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcuCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gZmlsZSBuYW1lZCB7QGNvZGUgZmlsZW5hbWV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlUmVhZGVyKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVXcml0ZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVXcml0ZXIuamF2YQppbmRleCBjMjg1MmEwLi42M2FlZTg4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlV3JpdGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZVdyaXRlci5qYXZhCkBAIC0xOCw4MSArMTgsODYgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBGaWxlV3JpdGVyIGlzIGEgY2xhc3MgZm9yIHdyaXRpbmcgY2hhcmFjdGVycyBvdXQgdG8gYSBmaWxlLiBUaGUgZGVmYXVsdAotICogY2hhcmFjdGVyIGVuY29kaW5nLCA4ODU5XzEgaXMgY3VycmVudGx5IHVzZWQgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIGJ5dGVzCi0gKiBpbiB0aGUgZmlsZS4KKyAqIEEgc3BlY2lhbGl6ZWQge0BsaW5rIFdyaXRlcn0gdGhhdCB3cml0ZXMgdG8gYSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAqIEFsbCB3cml0ZSByZXF1ZXN0cyBtYWRlIGJ5IGNhbGxpbmcgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBkaXJlY3RseQorICogZm9yd2FyZGVkIHRvIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uCisgKiBTaW5jZSB0aGlzIG1heSBpbmR1Y2Ugc29tZSBwZXJmb3JtYW5jZSBwZW5hbHR5LCBpbiBwYXJ0aWN1bGFyIGlmIG1hbnkgc21hbGwKKyAqIHdyaXRlIHJlcXVlc3RzIGFyZSBtYWRlLCBhIEZpbGVXcml0ZXIgaXMgb2Z0ZW4gd3JhcHBlZCBieSBhCisgKiBCdWZmZXJlZFdyaXRlci4KICAqIAorICogQHNlZSBCdWZmZXJlZFdyaXRlcgogICogQHNlZSBGaWxlUmVhZGVyCisgKgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlV3JpdGVyIGV4dGVuZHMgT3V0cHV0U3RyZWFtV3JpdGVyIHsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGaWxlV3JpdGVyIHVzaW5nIHRoZSBGaWxlIDxjb2RlPmZpbGU8L2NvZGU+LgorICAgICAqIENyZWF0ZXMgYSBGaWxlV3JpdGVyIHVzaW5nIHRoZSBGaWxlIHtAY29kZSBmaWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQogICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIEZpbGUgdG8gd3JpdGUgYnl0ZXMgdG8uCi0gICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBnaXZlbiBmaWxlIGlzIG5vdCBmb3VuZAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBmaWxlfSBjYW5ub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlV3JpdGVyKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGaWxlV3JpdGVyIHVzaW5nIHRoZSBGaWxlIDxjb2RlPmZpbGU8L2NvZGU+LiBUaGUgcGFyYW1ldGVyCi0gICAgICogPGNvZGU+YXBwZW5kPC9jb2RlPiBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIGlzIG9wZW5lZCBhbmQKLSAgICAgKiBhcHBlbmRlZCB0byBvciBqdXN0IG9wZW5lZCBlbXB0eS4KKyAgICAgKiBDcmVhdGVzIGEgRmlsZVdyaXRlciB1c2luZyB0aGUgRmlsZSB7QGNvZGUgZmlsZX0uIFRoZSBwYXJhbWV0ZXIKKyAgICAgKiB7QGNvZGUgYXBwZW5kfSBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIGlzIG9wZW5lZCBhbmQgYXBwZW5kZWQKKyAgICAgKiB0byBvciBqdXN0IG9wZW5lZCBhbmQgb3ZlcndyaXR0ZW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbGUKICAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBGaWxlIHRvIHdyaXRlIGJ5dGVzIHRvLgogICAgICAqIEBwYXJhbSBhcHBlbmQKLSAgICAgKiAgICAgICAgICAgIHNob3VsZCB0aGUgZmlsZSBiZSBhcHBlbmVkIHRvIG9yIG9wZW5lZCBlbXB0eS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgZmlsZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGdpdmVuIGZpbGUgaXMgbm90IGZvdW5kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBmaWxlfSBjYW5ub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlV3JpdGVyKEZpbGUgZmlsZSwgYm9vbGVhbiBhcHBlbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUsIGFwcGVuZCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGaWxlV3JpdGVyIHVzaW5nIHRoZSBleGlzdGluZyBGaWxlRGVzY3JpcHRvciA8Y29kZT5mZDwvY29kZT4uCisgICAgICogQ3JlYXRlcyBhIEZpbGVXcml0ZXIgdXNpbmcgdGhlIGV4aXN0aW5nIEZpbGVEZXNjcmlwdG9yIHtAY29kZSBmZH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZkCiAgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgRmlsZURlc2NyaXB0b3IgdG8gd3JpdGUgYnl0ZXMgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVXcml0ZXIoRmlsZURlc2NyaXB0b3IgZmQpIHsKICAgICAgICAgc3VwZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRmlsZVdyaXRlciB1c2luZyB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IDxjb2RlPmZpbGVuYW1lPC9jb2RlPi4KLSAgICAgKiBTZWUgdGhlIGNsYXNzIGRlc2NyaXB0aW9uIGZvciBob3cgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvIGJ5dGVzLgorICAgICAqIENyZWF0ZXMgYSBGaWxlV3JpdGVyIHVzaW5nIHRoZSBwbGF0Zm9ybSBkZXBlbmRlbnQge0Bjb2RlIGZpbGVuYW1lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZW5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBuYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlIGJ5dGVzIHRvLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZ2l2ZW4gZmlsZSBpcyBub3QgZm91bmQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlV3JpdGVyKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZmlsZW5hbWUpKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEZpbGVXcml0ZXIgdXNpbmcgdGhlIHBsYXRmb3JtIGRlcGVuZGVudCA8Y29kZT5maWxlbmFtZTwvY29kZT4uCi0gICAgICogU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiBmb3IgaG93IGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byBieXRlcy4gVGhlCi0gICAgICogcGFyYW1ldGVyIDxjb2RlPmFwcGVuZDwvY29kZT4gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBpcwotICAgICAqIG9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gb3IganVzdCBvcGVuZWQgZW1wdHkuCisgICAgICogQ3JlYXRlcyBhIEZpbGVXcml0ZXIgdXNpbmcgdGhlIHBsYXRmb3JtIGRlcGVuZGVudCB7QGNvZGUgZmlsZW5hbWV9LiBUaGUKKyAgICAgKiBwYXJhbWV0ZXIge0Bjb2RlIGFwcGVuZH0gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBpcyBvcGVuZWQgYW5kCisgICAgICogYXBwZW5kZWQgdG8gb3IganVzdCBvcGVuZWQgYW5kIG92ZXJ3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlbmFtZQogICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIG5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgYnl0ZXMgdG8uCiAgICAgICogQHBhcmFtIGFwcGVuZAotICAgICAqICAgICAgICAgICAgc2hvdWxkIHRoZSBmaWxlIGJlIGFwcGVuZWQgdG8gb3Igb3BlbmVkIGVtcHR5LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGFwcGVuZCB0byBhbiBleGlzdGluZyBmaWxlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZ2l2ZW4gZmlsZSBpcyBub3QgZm91bmQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGZpbGV9IGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbGVXcml0ZXIoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIGFwcGVuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUsIGFwcGVuZCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZW5hbWVGaWx0ZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbGVuYW1lRmlsdGVyLmphdmEKaW5kZXggMTk1YTEwYi4uNDBhNmNjYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsZW5hbWVGaWx0ZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWxlbmFtZUZpbHRlci5qYXZhCkBAIC0xOCwyNCArMTgsMjYgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBGaWxlbmFtZUZpbHRlciBpcyBhbiBpbnRlcmZhY2Ugd2hpY2ggZGVjbGFyZXMgbWV0aG9kcyBmb3IgZmlsdGVyaW5nIGZpbGUKLSAqIG5hbWVzIGluIHRoZSA8Y29kZT5saXN0PC9jb2RlPiBtZXRob2Qgb2YgRmlsZS4KKyAqIEFuIGludGVyZmFjZSBmb3IgZmlsdGVyaW5nIHtAbGluayBGaWxlfSBvYmplY3RzIGJhc2VkIG9uIHRoZWlyIG5hbWVzCisgKiBvciB0aGUgZGlyZWN0b3J5IHRoZXkgcmVzaWRlIGluLgogICogCi0gKiBAc2VlIEZpbGUKICAqIEBzZWUgRmlsZSNsaXN0KEZpbGVuYW1lRmlsdGVyKQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBGaWxlbmFtZUZpbHRlciB7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpZiBhIHNwZWNpZmljIGZpbGVuYW1lIG1hdGNoZXMgYSBmaWx0ZXIuCisgICAgICogSW5kaWNhdGVzIGlmIGEgc3BlY2lmaWMgZmlsZW5hbWUgbWF0Y2hlcyB0aGlzIGZpbHRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGlyCi0gICAgICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSA8Y29kZT5maWxlbmFtZTwvY29kZT4gd2FzIGZvdW5kLgorICAgICAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUge0Bjb2RlIGZpbGVuYW1lfSB3YXMgZm91bmQuCiAgICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiA8Y29kZT5kaXI8L2Rpcj4gdG8gdGVzdC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGVuYW1lIG1hdGNoZXMgdGhlIGZpbHRlciAKLSAgICAgKiAgICAgICAgICAgIGFuZCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QsIDxjb2RlPmZhbHNlPC9jb2RlPiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHtAY29kZSBkaXJ9IHRvIHRlc3QuCisgICAgICogQHJldHVybiAge0Bjb2RlIHRydWV9IGlmIHRoZSBmaWxlbmFtZSBtYXRjaGVzIHRoZSBmaWx0ZXIgCisgICAgICogICAgICAgICAgICBhbmQgY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0LCB7QGNvZGUgZmFsc2V9IAogICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIGZpbGVuYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbHRlcklucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWx0ZXJJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGQ4NzFmOTMuLjUxMTAwNjAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbHRlcklucHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsdGVySW5wdXRTdHJlYW0uamF2YQpAQCAtMTgsMTIgKzE4LDE2IEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogRmlsdGVyZWRJbnB1dFN0cmVhbSBpcyBhIGNsYXNzIHdoaWNoIHRha2VzIGFuIGlucHV0IHN0cmVhbSBhbmQKLSAqIDxlbT5maWx0ZXJzPC9lbT4gdGhlIGlucHV0IGluIHNvbWUgd2F5LiBUaGUgZmlsdGVyZWQgdmlldyBtYXkgYmUgYSBidWZmZXJlZAotICogdmlldyBvciBvbmUgd2hpY2ggdW5jb21wcmVzc2VzIGRhdGEgYmVmb3JlIHJldHVybmluZyBieXRlcyByZWFkLgotICogRmlsdGVySW5wdXRTdHJlYW1zIGFyZSBtZWFudCBmb3IgYnl0ZSBzdHJlYW1zLgorICogV3JhcHMgYW4gZXhpc3Rpbmcge0BsaW5rIElucHV0U3RyZWFtfSBhbmQgcGVyZm9ybXMgc29tZSB0cmFuc2Zvcm1hdGlvbiBvbgorICogdGhlIGlucHV0IGRhdGEgd2hpbGUgaXQgaXMgYmVpbmcgcmVhZC4gVHJhbnNmb3JtYXRpb25zIGNhbiBiZSBhbnl0aGluZyBmcm9tIGEKKyAqIHNpbXBsZSBieXRlLXdpc2UgZmlsdGVyaW5nIGlucHV0IGRhdGEgdG8gYW4gb24tdGhlLWZseSBjb21wcmVzc2lvbiBvcgorICogZGVjb21wcmVzc2lvbiBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0uIElucHV0IHN0cmVhbXMgdGhhdCB3cmFwIGFub3RoZXIgaW5wdXQKKyAqIHN0cmVhbSBhbmQgcHJvdmlkZSBzb21lIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgaXQgdXN1YWxseSBpbmhlcml0CisgKiBmcm9tIHRoaXMgY2xhc3MuCiAgKiAKICAqIEBzZWUgRmlsdGVyT3V0cHV0U3RyZWFtCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRmlsdGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CiAKQEAgLTMxLDE3ICszNSwyMCBAQAogICAgIC8vIFRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbSBhZGRyZXNzIHNob3VsZCBub3QgYmUgY2FjaGVkIGluIGEgcmVnaXN0ZXIuCiAgICAgLy8gVGhpcyB3YXMgY2hhbmdlZCB0byBiZSBtb3JlIGNsb3NlIHRvIHRoZSBSSS4KICAgICAvKioKLSAgICAgKiBUaGUgdGFyZ2V0IElucHV0U3RyZWFtIHdoaWNoIGlzIGJlaW5nIGZpbHRlcmVkLgorICAgICAqIFRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtIHRoYXQgaXMgZmlsdGVyZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvbGF0aWxlIElucHV0U3RyZWFtIGluOwogICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVySW5wdXRTdHJlYW0gb24gdGhlIElucHV0U3RyZWFtIDxjb2RlPmluPC9jb2RlPi4KLSAgICAgKiBBbGwgcmVhZHMgYXJlIG5vdyBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZpbHRlcklucHV0U3RyZWFtfSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5wdXQKKyAgICAgKiBzdHJlYW0gYXMgc291cmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgVGhlIG5vbi1udWxsIElucHV0U3RyZWFtIHRvIGZpbHRlciByZWFkcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBJbnB1dFN0cmVhbSB0byBmaWx0ZXIgcmVhZHMgb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEZpbHRlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC00OSwxNCArNTYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUKLSAgICAgKiB0aGlzIEZpbHRlcklucHV0U3RyZWFtIHdpbGwgYmxvY2suIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZgotICAgICAqIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgdGFyZ2V0IHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGJlZm9yZSB0aGlzIHN0cmVhbSB3aWxsCisgICAgICogYmxvY2suIAorICAgICAqICAKICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGJlZm9yZSBibG9ja2luZy4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBpbiB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC02NCwxMSArNzAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIEZpbHRlcklucHV0U3RyZWFtLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgdGFyZ2V0Ci0gICAgICogc3RyZWFtLgorICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjbG9zZXMgdGhlIGZpbHRlcmVkIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhpcyBzdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNzYsMTcgKzgyLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IGEgTWFyayBwb3NpdGlvbiBpbiB0aGlzIEZpbHRlcklucHV0U3RyZWFtLiBUaGUgcGFyYW1ldGVyCi0gICAgICogPGNvZGU+cmVhZExpbWl0PC9jb2RlPiBpbmRpY2F0ZXMgaG93IG1hbnkgYnl0ZXMgY2FuIGJlIHJlYWQgYmVmb3JlIGEKLSAgICAgKiBtYXJrIGlzIGludmFsaWRhdGVkLiBTZW5kaW5nIHJlc2V0KCkgd2lsbCByZXBvc2l0aW9uIHRoZSBTdHJlYW0gYmFjayB0bwotICAgICAqIHRoZSBtYXJrZWQgcG9zaXRpb24gcHJvdmlkZWQgPGNvZGU+cmVhZExpbWl0PC9jb2RlPiBoYXMgbm90IGJlZW4KLSAgICAgKiBzdXJwYXNzZWQuCisgICAgICogU2V0cyBhIG1hcmsgcG9zaXRpb24gaW4gdGhpcyBzdHJlYW0uIFRoZSBwYXJhbWV0ZXIge0Bjb2RlIHJlYWRsaW1pdH0KKyAgICAgKiBpbmRpY2F0ZXMgaG93IG1hbnkgYnl0ZXMgY2FuIGJlIHJlYWQgYmVmb3JlIHRoZSBtYXJrIGlzIGludmFsaWRhdGVkLgorICAgICAqIFNlbmRpbmcge0Bjb2RlIHJlc2V0KCl9IHdpbGwgcmVwb3NpdGlvbiB0aGlzIHN0cmVhbSBiYWNrIHRvIHRoZSBtYXJrZWQKKyAgICAgKiBwb3NpdGlvbiwgcHJvdmlkZWQgdGhhdCB7QGNvZGUgcmVhZGxpbWl0fSBoYXMgbm90IGJlZW4gc3VycGFzc2VkLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cyBhIG1hcmsgaW4gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZXRzIGEgbWFyayBpbiB0aGUgZmlsdGVyZWQgc3RyZWFtLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0Ci0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFibGUgdG8gcmVhZCBiZWZvcmUgaW52YWxpZGF0aW5nIHRoZQotICAgICAqICAgICAgICAgICAgbWFyay4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgc3RyZWFtIGJlZm9yZQorICAgICAqICAgICAgICAgICAgdGhlIG1hcmsgaXMgaW52YWxpZGF0ZWQuCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKQEAgLTk0LDEyICsxMDMsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgRmlsdGVySW5wdXRTdHJlYW0KLSAgICAgKiBzdXBwb3J0cyBtYXJrKCkgYW5kIHJlc2V0KCkuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB3aGV0aGVyIG9yIG5vdAotICAgICAqIHRoZSB0YXJnZXQgc3RyZWFtIHN1cHBvcnRzIG1hcmtpbmcuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBzdHJlYW0gc3VwcG9ydHMge0Bjb2RlIG1hcmsoKX0gYW5kIHtAY29kZSByZXNldCgpfS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGZpbHRlcmVkIHN0cmVhbSBzdXBwb3J0cworICAgICAqIG1hcmtpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBtYXJrKCkgYW5kIHJlc2V0KCkgYXJlIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIG1hcmsoKX0gYW5kIHtAY29kZSByZXNldCgpfSBhcmUgc3VwcG9ydGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzZWUgI3NraXAobG9uZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewpAQCAtMTA3LDE1ICsxMjAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhpcyBGaWx0ZXJJbnB1dFN0cmVhbSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzCi0gICAgICogYW4gaW50LiBUaGUgbG93LW9yZGVyIGJ5dGUgaXMgcmV0dXJuZWQgb3IgLTEgb2YgdGhlIGVuZCBvZiBzdHJlYW0gd2FzCi0gICAgICogZW5jb3VudGVyZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIGJ5dGUgZnJvbSB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIGZpbHRlcmVkIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyCisgICAgICogaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyNTUuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBoYXMgYmVlbgorICAgICAqIHJlYWNoZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIGZpbHRlcmVkIHN0cmVhbSBoYXMgYmVlbgorICAgICAqICAgICAgICAgcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMjMsMTggKzEzNiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhpcyBGaWx0ZXJJbnB1dFN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheQotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLiBUaGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogcmVhZHMgYnl0ZXMgZnJvbSB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoaXMgc3RyZWFtIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgYnl0ZSBhcnJheQorICAgICAqIHtAY29kZSBidWZmZXJ9LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBubworICAgICAqIGJ5dGVzIHdlcmUgcmVhZCBhbmQgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuIFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZWFkcyBieXRlcyBmcm9tIHRoZSBmaWx0ZXJlZCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgogICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgZmlsdGVyZWQgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQgd2hpbGUgcmVhZGluZy4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE0MiwyMyArMTU1LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gYnl0ZXMgZnJvbSB0aGlzIEZpbHRlcklucHV0U3RyZWFtIGFuZAotICAgICAqIHN0b3JlcyB0aGVtIGluIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLiBUaGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogcmVhZHMgYnl0ZXMgZnJvbSB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBjb3VudH0gYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlCisgICAgICogYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdCB7QGNvZGUgb2Zmc2V0fS4gUmV0dXJucyB0aGUgbnVtYmVyCisgICAgICogb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBubyBieXRlcyBoYXZlIGJlZW4gcmVhZCBhbmQgdGhlIGVuZCBvZgorICAgICAqIHRoaXMgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gcmVhZHMgYnl0ZXMgZnJvbSB0aGUKKyAgICAgKiBmaWx0ZXJlZCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmZmVyfSB0byBzdG9yZSB0aGUgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHJlYWQgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgIGZpbHRlcmVkIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkIHdoaWxlIHJlYWRpbmcuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xNjYsMTQgKzE4MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgRmlsdGVySW5wdXRTdHJlYW0gdG8gdGhlIGxhc3QgbWFya2VkIGxvY2F0aW9uLiBJZiB0aGUKLSAgICAgKiA8Y29kZT5yZWFkbGltaXQ8L2NvZGU+IGhhcyBiZWVuIHBhc3NlZCBvciBubyA8Y29kZT5tYXJrPC9jb2RlPiBoYXMKLSAgICAgKiBiZWVuIHNldCwgdGhyb3cgSU9FeGNlcHRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gcmVzZXRzIHRoZSB0YXJnZXQKLSAgICAgKiBzdHJlYW0uCisgICAgICogUmVzZXRzIHRoaXMgc3RyZWFtIHRvIHRoZSBsYXN0IG1hcmtlZCBsb2NhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJlc2V0cyB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkLCBubyBtYXJrIGhhcyBiZWVuIHNldCBvciB0aGUKKyAgICAgKiAgICAgICAgICAgICBtYXJrIGlzIG5vIGxvbmdlciB2YWxpZCBiZWNhdXNlIG1vcmUgdGhhbiB7QGNvZGUgcmVhZGxpbWl0fQorICAgICAqICAgICAgICAgICAgIGJ5dGVzIGhhdmUgYmVlbiByZWFkIHNpbmNlIHNldHRpbmcgdGhlIG1hcmsuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE4MSwxOCArMTk3LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2tpcHMgPGNvZGU+Y291bnQ8L2NvZGU+IG51bWJlciBvZiBieXRlcyBpbiB0aGlzIElucHV0U3RyZWFtLgotICAgICAqIFN1YnNlcXVlbnQgPGNvZGU+cmVhZCgpPC9jb2RlPidzIHdpbGwgbm90IHJldHVybiB0aGVzZSBieXRlcyB1bmxlc3MKLSAgICAgKiA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLiBUaGlzIGltcGxlbWVudGF0aW9uIHNraXBzCi0gICAgICogPGNvZGU+Y291bnQ8L2NvZGU+IG51bWJlciBvZiBieXRlcyBpbiB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBTa2lwcyB7QGNvZGUgY291bnR9IG51bWJlciBvZiBieXRlcyBpbiB0aGlzIHN0cmVhbS4gU3Vic2VxdWVudAorICAgICAqIHtAY29kZSByZWFkKCl9J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzIHVubGVzcyB7QGNvZGUgcmVzZXQoKX0gaXMKKyAgICAgKiB1c2VkLiBUaGlzIGltcGxlbWVudGF0aW9uIHNraXBzIHtAY29kZSBjb3VudH0gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgICAqIGZpbHRlcmVkIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY291bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICNtYXJrKGludCkKKyAgICAgKiBAc2VlICNyZXNldCgpICAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsdGVyT3V0cHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0uamF2YQppbmRleCAzNmNiZTI1Li5iMTU3NzU3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjAsMzcgKzIwLDQ0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogRmlsdGVyZWRPdXRwdXRTdHJlYW0gaXMgYSBjbGFzcyB3aGljaCB0YWtlcyBhbiBvdXRwdXQgc3RyZWFtIGFuZAotICogPGVtPmZpbHRlcnM8L2VtPiB0aGUgb3V0cHV0IGluIHNvbWUgd2F5LiBUaGUgZmlsdGVyZWQgdmlldyBtYXkgYmUgYQotICogYnVmZmVyZWQgb3V0cHV0IG9yIG9uZSB3aGljaCBjb21wcmVzc2VzIGRhdGEgYmVmb3JlIGFjdHVhbGx5IHdyaXRpbmcgdGhlCi0gKiBieXRlcy4gRmlsdGVyT3V0cHV0U3RyZWFtcyBhcmUgbWVhbnQgZm9yIGJ5dGUgc3RyZWFtcy4KKyAqIFdyYXBzIGFuIGV4aXN0aW5nIHtAbGluayBPdXRwdXRTdHJlYW19IGFuZCBwZXJmb3JtcyBzb21lIHRyYW5zZm9ybWF0aW9uIG9uCisgKiB0aGUgb3V0cHV0IGRhdGEgd2hpbGUgaXQgaXMgYmVpbmcgd3JpdHRlbi4gVHJhbnNmb3JtYXRpb25zIGNhbiBiZSBhbnl0aGluZworICogZnJvbSBhIHNpbXBsZSBieXRlLXdpc2UgZmlsdGVyaW5nIG91dHB1dCBkYXRhIHRvIGFuIG9uLXRoZS1mbHkgY29tcHJlc3Npb24gb3IKKyAqIGRlY29tcHJlc3Npb24gb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtLiBPdXRwdXQgc3RyZWFtcyB0aGF0IHdyYXAgYW5vdGhlcgorICogb3V0cHV0IHN0cmVhbSBhbmQgcHJvdmlkZSBzb21lIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgaXQgdXN1YWxseQorICogaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MuCiAgKiAKLSAqIEBzZWUgRmlsdGVySW5wdXRTdHJlYW0KKyAqIEBzZWUgRmlsdGVyT3V0cHV0U3RyZWFtCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRmlsdGVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKIAogICAgIC8qKgotICAgICAqIFRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGZvciB0aGlzIGZpbHRlci4KKyAgICAgKiBUaGUgdGFyZ2V0IG91dHB1dCBzdHJlYW0gZm9yIHRoaXMgZmlsdGVyIHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyT3V0cHV0U3RyZWFtIG9uIHRoZSBPdXRwdXRTdHJlYW0gPGNvZGU+b3V0PC9jb2RlPi4KLSAgICAgKiBBbGwgd3JpdGVzIGFyZSBub3cgZmlsdGVyZWQgdGhyb3VnaCB0aGlzIHN0cmVhbS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBGaWx0ZXJPdXRwdXRTdHJlYW19IHdpdGgge0Bjb2RlIG91dH0gYXMgaXRzCisgICAgICogdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbSB0byBmaWx0ZXIgd3JpdGVzIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJlYW0gdGhhdCB0aGlzIHN0cmVhbSB3cml0ZXMgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZpbHRlck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CiAgICAgICAgIHRoaXMub3V0ID0gb3V0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgRmlsdGVyT3V0cHV0U3RyZWFtLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgdGFyZ2V0Ci0gICAgICogc3RyZWFtLgorICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjbG9zZXMgdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTY0LDEzICs3MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgRmlsdGVyT3V0cHV0U3RyZWFtIHRvIGVuc3VyZSBhbGwgcGVuZGluZyBkYXRhIGlzIHNlbnQgb3V0IHRvCi0gICAgICogdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gZmx1c2hlcyB0aGUgdGFyZ2V0Ci0gICAgICogT3V0cHV0U3RyZWFtLgorICAgICAqIEVuc3VyZXMgdGhhdCBhbGwgcGVuZGluZyBkYXRhIGlzIHNlbnQgb3V0IHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBUaGlzCisgICAgICogaW1wbGVtZW50YXRpb24gZmx1c2hlcyB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhpcwotICAgICAqICAgICAgICAgICAgIEZpbHRlck91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC03OCw0OCArODQsNjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHRvCi0gICAgICogdGhpcyBGaWx0ZXJPdXRwdXRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gd3JpdGVzIHRoZQotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gdG8gdGhpcworICAgICAqIHN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIHtAY29kZSBidWZmZXJ9IHRvIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBGaWx0ZXJPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYnVmZmVyW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICB3cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gPGNvZGU+Ynl0ZXM8L2NvZGU+IGZyb20gdGhlIGJ5dGUgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IDxjb2RlPm9mZnNldDwvY29kZT4gdG8gdGhpcwotICAgICAqIEZpbHRlck91dHB1dFN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIDxjb2RlPmJ1ZmZlcjwvY29kZT4KLSAgICAgKiB0byB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbS4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBieXRlcyBmcm9tIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0CisgICAgICoge0Bjb2RlIG9mZnNldH0gdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBidWZmZXIgdG8gZ2V0IGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgaW4gYnVmZmVyIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBjb3VudH0gaXMgYmlnZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJ9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRmlsdGVyT3V0cHV0U3RyZWFtLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIG9mZnNldCBvciBjb3VudCBhcmUgb3V0c2lkZSBvZiBib3VuZHMuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYnVmZmVyW10sIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBmb3JjZSBudWxsIGJ1ZmZlciBjaGVjayBmaXJzdAotICAgICAgICBpZiAob2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCB8fCBvZmZzZXQgPCAwIHx8IGNvdW50IDwgMAotICAgICAgICAgICAgICAgIHx8IGNvdW50ID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gcmVtb3ZlZCByZWR1bmRhbnQgY2hlY2ssIG1hZGUgaW1wbGljaXQgbnVsbCBjaGVjayBleHBsaWNpdCwKKyAgICAgICAgLy8gdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMCBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAoY291bnQgPCAwKQorICAgICAgICAvLyB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICBpZiAoKG9mZnNldCB8IGNvdW50KSA8IDAgfHwgY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgIC8vIENhbGwgd3JpdGUoKSBpbnN0ZWFkIG9mIG91dC53cml0ZSgpIHNpbmNlIHN1YmNsYXNzZXMgY291bGQKICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSB3cml0ZSgpIG1ldGhvZC4KQEAgLTEyOCwxNiArMTQ3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgYnl0ZSA8Y29kZT5vbmVCeXRlPC9jb2RlPiB0byB0aGlzCi0gICAgICogRmlsdGVyT3V0cHV0U3RyZWFtLiBPbmx5IHRoZSBsb3cgb3JkZXIgYnl0ZSBvZiA8Y29kZT5vbmVCeXRlPC9jb2RlPiBpcwotICAgICAqIHdyaXR0ZW4uIFRoaXMgaW1wbGVtZW50YXRpb24gd3JpdGVzIHRoZSBieXRlIHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyBvbmUgYnl0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gT25seSB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgdGhlCisgICAgICogaW50ZWdlciB7QGNvZGUgb25lQnl0ZX0gaXMgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQnl0ZQotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gYmUgd3JpdHRlbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gYmUgd3JpdHRlbi4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIEZpbHRlck91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IG9uZUJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GaWx0ZXJSZWFkZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbHRlclJlYWRlci5qYXZhCmluZGV4IDllZjg3NzYuLjdmYTk2YjUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbHRlclJlYWRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbHRlclJlYWRlci5qYXZhCkBAIC0xOCwyNSArMTgsMzIgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBGaWx0ZXJSZWFkZXIgaXMgYSBjbGFzcyB3aGljaCB0YWtlcyBhIFJlYWRlciBhbmQgPGVtPmZpbHRlcnM8L2VtPiB0aGUgaW5wdXQKLSAqIGluIHNvbWUgd2F5LiBUaGUgZmlsdGVyZWQgdmlldyBtYXkgYmUgYSBidWZmZXJlZCB2aWV3IG9yIG9uZSB3aGljaAotICogdW5jb21wcmVzc2VzIGRhdGEgYmVmb3JlIHJldHVybmluZyBjaGFyYWN0ZXJzIHJlYWQuCisgKiBXcmFwcyBhbiBleGlzdGluZyB7QGxpbmsgUmVhZGVyfSBhbmQgcGVyZm9ybXMgc29tZSB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUKKyAqIGlucHV0IGRhdGEgd2hpbGUgaXQgaXMgYmVpbmcgcmVhZC4gVHJhbnNmb3JtYXRpb25zIGNhbiBiZSBhbnl0aGluZyBmcm9tIGEKKyAqIHNpbXBsZSBieXRlLXdpc2UgZmlsdGVyaW5nIGlucHV0IGRhdGEgdG8gYW4gb24tdGhlLWZseSBjb21wcmVzc2lvbiBvcgorICogZGVjb21wcmVzc2lvbiBvZiB0aGUgdW5kZXJseWluZyByZWFkZXIuIFJlYWRlcnMgdGhhdCB3cmFwIGFub3RoZXIgcmVhZGVyIGFuZAorICogcHJvdmlkZSBzb21lIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgaXQgdXN1YWxseSBpbmhlcml0IGZyb20gdGhpcworICogY2xhc3MuCiAgKiAKICAqIEBzZWUgRmlsdGVyV3JpdGVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKIAogICAgIC8qKgogICAgICAqIFRoZSB0YXJnZXQgUmVhZGVyIHdoaWNoIGlzIGJlaW5nIGZpbHRlcmVkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBSZWFkZXIgaW47CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlclJlYWRlciBvbiB0aGUgUmVhZGVyIDxjb2RlPmluPC9jb2RlPi4gQWxsIHJlYWRzCi0gICAgICogYXJlIG5vdyBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgUmVhZGVyLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyUmVhZGVyIG9uIHRoZSBSZWFkZXIge0Bjb2RlIGlufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KICAgICAgKiAgICAgICAgICAgIFRoZSBub24tbnVsbCBSZWFkZXIgdG8gZmlsdGVyIHJlYWRzIG9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBGaWx0ZXJSZWFkZXIoUmVhZGVyIGluKSB7CiAgICAgICAgIHN1cGVyKGluKTsKQEAgLTQ0LDEwICs1MSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgRmlsdGVyUmVhZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgdGFyZ2V0IFJlYWRlci4KKyAgICAgKiBDbG9zZXMgdGhpcyByZWFkZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gY2xvc2VzIHRoZSBmaWx0ZXJlZCByZWFkZXIuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgUmVhZGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgcmVhZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTU3LDIwICs2NSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCBhIE1hcmsgcG9zaXRpb24gaW4gdGhpcyBGaWx0ZXJSZWFkZXIuIFRoZSBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5yZWFkTGltaXQ8L2NvZGU+IGluZGljYXRlcyBob3cgbWFueSBjaGFyYWN0ZXJzIGNhbiBiZSByZWFkIGJlZm9yZQotICAgICAqIGEgbWFyayBpcyBpbnZhbGlkYXRlZC4gU2VuZGluZyByZXNldCgpIHdpbGwgcmVwb3NpdGlvbiB0aGUgUmVhZGVyIGJhY2sgdG8KLSAgICAgKiB0aGUgbWFya2VkIHBvc2l0aW9uIHByb3ZpZGVkIDxjb2RlPnJlYWRMaW1pdDwvY29kZT4gaGFzIG5vdCBiZWVuCi0gICAgICogc3VycGFzc2VkLgorICAgICAqIFNldHMgYSBtYXJrIHBvc2l0aW9uIGluIHRoaXMgcmVhZGVyLiBUaGUgcGFyYW1ldGVyIHtAY29kZSByZWFkbGltaXR9CisgICAgICogaW5kaWNhdGVzIGhvdyBtYW55IGJ5dGVzIGNhbiBiZSByZWFkIGJlZm9yZSB0aGUgbWFyayBpcyBpbnZhbGlkYXRlZC4KKyAgICAgKiBTZW5kaW5nIHtAY29kZSByZXNldCgpfSB3aWxsIHJlcG9zaXRpb24gdGhpcyByZWFkZXIgYmFjayB0byB0aGUgbWFya2VkCisgICAgICogcG9zaXRpb24sIHByb3ZpZGVkIHRoYXQge0Bjb2RlIHJlYWRsaW1pdH0gaGFzIG5vdCBiZWVuIHN1cnBhc3NlZC4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNldHMgYSBtYXJrIGluIHRoZSB0YXJnZXQgUmVhZGVyLgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cyBhIG1hcmsgaW4gdGhlIGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRsaW1pdAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGFibGUgdG8gcmVhZCBiZWZvcmUKLSAgICAgKiAgICAgICAgICAgIGludmFsaWRhdGluZyB0aGUgbWFyay4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgcmVhZGVyIGJlZm9yZQorICAgICAqICAgICAgICAgICAgdGhlIG1hcmsgaXMgaW52YWxpZGF0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIG1hcmsgdGhpcyBSZWFkZXIuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIG1hcmtpbmcgdGhpcyByZWFkZXIuCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC04MCwxMSArOTAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgRmlsdGVyUmVhZGVyIHN1cHBvcnRzCi0gICAgICogbWFyaygpIGFuZCByZXNldCgpLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHRhcmdldAotICAgICAqIFJlYWRlciBzdXBwb3J0cyBtYXJraW5nLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIHN1cHBvcnRzIHtAY29kZSBtYXJrKCl9IGFuZCB7QGNvZGUgcmVzZXQoKX0uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHdoZXRoZXIgdGhlIGZpbHRlcmVkIHJlYWRlciBzdXBwb3J0cyBtYXJraW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IG1hcmsoKSBhbmQgcmVzZXQoKSBhcmUgc3VwcG9ydGVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBtYXJrKCl9IGFuZCB7QGNvZGUgcmVzZXQoKX0gYXJlIHN1cHBvcnRlZAorICAgICAqICAgICAgICAgYnkgdGhlIGZpbHRlcmVkIHJlYWRlciwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzZWUgI3NraXAobG9uZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewpAQCAtOTQsMTQgKzEwOCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGNoYXIgZnJvbSB0aGlzIEZpbHRlclJlYWRlciBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuCi0gICAgICogaW50LiBUaGUgMiBsb3dlc3Qgb3JkZXIgYnl0ZXMgYXJlIHJldHVybmVkIG9yIC0xIG9mIHRoZSBlbmQgb2YgcmVhZGVyIHdhcwotICAgICAqIGVuY291bnRlcmVkLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBjaGFyIGZyb20gdGhlIHRhcmdldCBSZWFkZXIuCisgICAgICogUmVhZHMgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhlIGZpbHRlcmVkIHJlYWRlciBhbmQgcmV0dXJucyBpdCBhcyBhbgorICAgICAqIGludGVnZXIgd2l0aCB0aGUgdHdvIGhpZ2hlci1vcmRlciBieXRlcyBzZXQgdG8gMC4gUmV0dXJucyAtMSBpZiB0aGUgZW5kCisgICAgICogb2YgdGhlIGZpbHRlcmVkIHJlYWRlciBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJ5dGUgcmVhZCBvciAtMSBpZiBlbmQgb2YgcmVhZGVyLgotICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIGZpbHRlcmVkIHJlYWRlciBoYXMKKyAgICAgKiAgICAgICAgIGJlZW4gcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoaXMgUmVhZGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhpcyByZWFkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTExMSwyMiArMTI2LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gY2hhcnMgZnJvbSB0aGlzIEZpbHRlclJlYWRlciBhbmQKLSAgICAgKiBzdG9yZXMgdGhlbSBpbiBjaGFyIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgb2Zmc2V0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgY2hhcnMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGNoYXJzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHJlYWRlciB3YXMgZW5jb3VudGVyZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiByZWFkcyBjaGFycyBmcm9tIHRoZSB0YXJnZXQgcmVhZGVyLgorICAgICAqIFJlYWRzIGF0IG1vc3Qge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIGZyb20gdGhlIGZpbHRlcmVkIHJlYWRlciBhbmQgc3RvcmVzIHRoZW0KKyAgICAgKiBpbiB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdCB7QGNvZGUgb2Zmc2V0fS4gUmV0dXJucyB0aGUKKyAgICAgKiBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIG5vIGNoYXJhY3RlcnMgd2VyZSByZWFkIGFuZAorICAgICAqIHRoZSBlbmQgb2YgdGhlIGZpbHRlcmVkIHJlYWRlciB3YXMgZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgY2hhcnMuCisgICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgY2hhcmFjdGVycyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBjaGFycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICByZWFkIGZyb20gdGhpcyByZWFkZXIuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcnMgdG8gc3RvcmUgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2YgcmVhZGVyLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgZmlsdGVyZWQgcmVhZGVyIGhhcyBiZWVuIHJlYWNoZWQgd2hpbGUgcmVhZGluZy4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoaXMgUmVhZGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhpcyByZWFkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEzNiwxOSArMTUyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBSZWFkZXIgaXMKLSAgICAgKiByZWFkeSB0byBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuIElmIHRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0gICAgICogdGhlIG5leHQgPGNvZGU+cmVhZCgpPC9jb2RlPiB3aWxsIG5vdCBibG9jay4gSWYgdGhlIHJlc3VsdCBpcwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGlzIFJlYWRlciBtYXkgb3IgbWF5IG5vdCBibG9jayB3aGVuCi0gICAgICogPGNvZGU+cmVhZCgpPC9jb2RlPiBpcyBzZW50LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIGlzIHJlYWR5IHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4gSWYKKyAgICAgKiB0aGUgcmVzdWx0IGlzIHtAY29kZSB0cnVlfSwgdGhlIG5leHQge0Bjb2RlIHJlYWQoKX0gd2lsbCBub3QgYmxvY2suIElmCisgICAgICogdGhlIHJlc3VsdCBpcyB7QGNvZGUgZmFsc2V9LCB0aGlzIHJlYWRlciBtYXkgb3IgbWF5IG5vdCBibG9jayB3aGVuCisgICAgICoge0Bjb2RlIHJlYWQoKX0gaXMgc2VudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciB3aWxsIG5vdCBibG9jayB3aGVuCi0gICAgICogICAgICAgICA8Y29kZT5yZWFkKCk8L2NvZGU+IGlzIGNhbGxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHVua25vd24KLSAgICAgKiAgICAgICAgIG9yIGJsb2NraW5nIHdpbGwgb2NjdXIuCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyByZWFkZXIgd2lsbCBub3QgYmxvY2sgd2hlbiB7QGNvZGUgcmVhZCgpfQorICAgICAqICAgICAgICAgaXMgY2FsbGVkLCB7QGNvZGUgZmFsc2V9IGlmIHVua25vd24gb3IgYmxvY2tpbmcgd2lsbCBvY2N1ci4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIFJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPIGVycm9yCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZWFkZXIgaXMgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xNTgsMTYgKzE3MSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgUmVhZGVycyBwb3NpdGlvbiB0byB0aGUgbGFzdCA8Y29kZT5tYXJrKCk8L2NvZGU+IGxvY2F0aW9uLgotICAgICAqIEludm9jYXRpb25zIG9mIDxjb2RlPnJlYWQoKS9za2lwKCk8L2NvZGU+IHdpbGwgb2NjdXIgZnJvbSB0aGlzIG5ldwotICAgICAqIGxvY2F0aW9uLiBJZiB0aGlzIFJlYWRlciB3YXMgbm90IG1hcmtlZCwgdGhlIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICogPGNvZGU+cmVzZXQoKTwvY29kZT4gaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuIFNlZSB0aGUgY29tbWVudCBmb3IKLSAgICAgKiB0aGUgc3BlY2lmaWMgUmVhZGVyIHN1YmNsYXNzIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBUaGUgZGVmYXVsdAotICAgICAqIGFjdGlvbiBpcyB0byB0aHJvdyA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4uCisgICAgICogUmVzZXRzIHRoaXMgcmVhZGVyJ3MgcG9zaXRpb24gdG8gdGhlIGxhc3QgbWFya2VkIGxvY2F0aW9uLiBJbnZvY2F0aW9ucyBvZgorICAgICAqIHtAY29kZSByZWFkKCl9IGFuZCB7QGNvZGUgc2tpcCgpfSB3aWxsIG9jY3VyIGZyb20gdGhpcyBuZXcgbG9jYXRpb24uIElmCisgICAgICogdGhpcyByZWFkZXIgd2FzIG5vdCBtYXJrZWQsIHRoZSBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIHtAY29kZSByZXNldCgpfSBpbiB0aGUgUmVhZGVyIHN1YmNsYXNzIHRoYXQgaXMgZmlsdGVyZWQgYnkgdGhpcyByZWFkZXIuCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIFJlYWRlciBpcyB0byB0aHJvdyBhbiB7QGNvZGUgSU9FeGNlcHRpb259LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJyZWQgb3IgdGhlIHRhcmdldCBSZWFkZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqICAgICAgICAgICAgIDxjb2RlPm1hcmsoKS9yZXNldCgpPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJyZWQgb3IgdGhlIGZpbHRlcmVkIHJlYWRlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogICAgICAgICAgICAge0Bjb2RlIG1hcmsoKX0gYW5kIHtAY29kZSByZXNldCgpfS4KKyAgICAgKiBAc2VlICNtYXJrKGludCkKKyAgICAgKiBAc2VlICNtYXJrU3VwcG9ydGVkKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xNzcsMTggKzE5MiwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGlzIFJlYWRlci4KLSAgICAgKiBTdWJzZXF1ZW50IDxjb2RlPnJlYWQoKTwvY29kZT4ncyB3aWxsIG5vdCByZXR1cm4gdGhlc2UgY2hhcmFjdGVycwotICAgICAqIHVubGVzcyA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0bwotICAgICAqIHNraXAgY2hhcnMgaW4gdGhlIGZpbHRlcmVkIFJlYWRlci4KKyAgICAgKiBTa2lwcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgaW4gdGhpcyByZWFkZXIuIFN1YnNlcXVlbnQge0Bjb2RlIHJlYWQoKX0ncworICAgICAqIHdpbGwgbm90IHJldHVybiB0aGVzZSBjaGFyYWN0ZXJzIHVubGVzcyB7QGNvZGUgcmVzZXQoKX0gaXMgdXNlZC4gVGhlCisgICAgICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBza2lwIGNoYXJhY3RlcnMgaW4gdGhlIGZpbHRlcmVkIHJlYWRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY291bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIFJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbHRlcmVkIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3IKICAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZpbHRlcldyaXRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsdGVyV3JpdGVyLmphdmEKaW5kZXggODVlYzFhYi4uNGJkMjdjYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsdGVyV3JpdGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vRmlsdGVyV3JpdGVyLmphdmEKQEAgLTE4LDI1ICsxOCwzMiBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIEZpbHRlcldyaXRlciBpcyBhIGNsYXNzIHdoaWNoIHRha2VzIGEgV3JpdGVyIGFuZCA8ZW0+ZmlsdGVyczwvZW0+IHRoZQotICogb3V0cHV0IGluIHNvbWUgd2F5LiBUaGUgZmlsdGVyZWQgdmlldyBtYXkgYmUgYSBidWZmZXJlZCBvdXRwdXQgb3Igb25lIHdoaWNoCi0gKiBjb21wcmVzc2VzIGRhdGEgYmVmb3JlIGFjdHVhbGx5IHdyaXRpbmcgdGhlIGJ5dGVzLgorICogV3JhcHMgYW4gZXhpc3Rpbmcge0BsaW5rIFdyaXRlcn0gYW5kIHBlcmZvcm1zIHNvbWUgdHJhbnNmb3JtYXRpb24gb24gdGhlCisgKiBvdXRwdXQgZGF0YSB3aGlsZSBpdCBpcyBiZWluZyB3cml0dGVuLiBUcmFuc2Zvcm1hdGlvbnMgY2FuIGJlIGFueXRoaW5nIGZyb20gYQorICogc2ltcGxlIGJ5dGUtd2lzZSBmaWx0ZXJpbmcgb3V0cHV0IGRhdGEgdG8gYW4gb24tdGhlLWZseSBjb21wcmVzc2lvbiBvcgorICogZGVjb21wcmVzc2lvbiBvZiB0aGUgdW5kZXJseWluZyB3cml0ZXIuIFdyaXRlcnMgdGhhdCB3cmFwIGFub3RoZXIgd3JpdGVyIGFuZAorICogcHJvdmlkZSBzb21lIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgaXQgdXN1YWxseSBpbmhlcml0IGZyb20gdGhpcworICogY2xhc3MuCiAgKiAKLSAqIEBzZWUgRmlsdGVyV3JpdGVyCisgKiBAc2VlIEZpbHRlclJlYWRlcgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlcldyaXRlciBleHRlbmRzIFdyaXRlciB7CiAKICAgICAvKioKICAgICAgKiBUaGUgV3JpdGVyIGJlaW5nIGZpbHRlcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBXcml0ZXIgb3V0OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJXcml0ZXIgb24gdGhlIFdyaXRlciA8Y29kZT5vdXQ8L2NvZGU+LiBBbGwKLSAgICAgKiB3cml0ZXMgYXJlIG5vdyBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgV3JpdGVyLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyV3JpdGVyIG9uIHRoZSBXcml0ZXIge0Bjb2RlIG91dH0uIEFsbCB3cml0ZXMgYXJlCisgICAgICogbm93IGZpbHRlcmVkIHRocm91Z2ggdGhpcyB3cml0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAogICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBXcml0ZXIgdG8gZmlsdGVyIHdyaXRlcyBvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRmlsdGVyV3JpdGVyKFdyaXRlciBvdXQpIHsKICAgICAgICAgc3VwZXIob3V0KTsKQEAgLTQ0LDEzICs1MSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgRmlsdGVyV3JpdGVyLiBDbG9zZXMgdGhlIFdyaXRlciA8Y29kZT5vdXQ8L2NvZGU+IGJ5IGRlZmF1bHQuCi0gICAgICogVGhpcyB3aWxsIGNsb3NlIGFueSBkb3duc3RyZWFtIFdyaXRlcnMgYXMgd2VsbC4gQW55IGFkZGl0aW9uYWwgcHJvY2Vzc2luZwotICAgICAqIHJlcXVpcmVkIGJ5IGNvbmNyZXRlIHN1YmNsYXNzZXMgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoZWlyIG93bgotICAgICAqIDxjb2RlPmNsb3NlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBDbG9zZXMgdGhpcyB3cml0ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gY2xvc2VzIHRoZSB0YXJnZXQgd3JpdGVyLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgRmlsdGVyV3JpdGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTYwLDExICs2NSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgRmlsdGVyZWRXcml0ZXIgdG8gZW5zdXJlIGFsbCBwZW5kaW5nIGRhdGEgaXMgc2VudCBvdXQgdG8gdGhlCi0gICAgICogdGFyZ2V0IFdyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBmbHVzaGVzIHRoZSB0YXJnZXQgV3JpdGVyLgorICAgICAqIEZsdXNoZXMgdGhpcyB3cml0ZXIgdG8gZW5zdXJlIGFsbCBwZW5kaW5nIGRhdGEgaXMgc2VudCBvdXQgdG8gdGhlIHRhcmdldAorICAgICAqIHdyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBmbHVzaGVzIHRoZSB0YXJnZXQgd3JpdGVyLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoaXMgRmlsdGVyV3JpdGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTc0LDM4ICs4MCwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gPGNvZGU+Y2hhcnM8L2NvZGU+IGZyb20gdGhlIGNoYXIgYXJyYXkKLSAgICAgKiA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT5pbmRleDwvY29kZT4gdG8gdGhpcwotICAgICAqIEZpbHRlcldyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8gdGhlCi0gICAgICogdGFyZ2V0IFdyaXRlci4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIGZyb20gdGhlIGNoYXIgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0KKyAgICAgKiBzdGFydGluZyBhdCBwb3NpdGlvbiB7QGNvZGUgb2Zmc2V0fSB0byB0aGUgdGFyZ2V0IHdyaXRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZmZlciB0byBnZXQgY2hhcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJzIGluIGJ1ZmZlciB0byB3cml0ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgRmlsdGVyV3JpdGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmZmVyW10sIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CiAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGNoYXIgPGNvZGU+b25lQ2hhcjwvY29kZT4gdG8gdGhpcyBGaWx0ZXJXcml0ZXIuCi0gICAgICogT25seSB0aGUgMiBsb3cgb3JkZXIgYnl0ZXMgb2YgPGNvZGU+b25lQ2hhcjwvY29kZT4gaXMgd3JpdHRlbi4gVGhpcwotICAgICAqIGltcGxlbWVudGF0aW9uIHdyaXRlcyB0aGUgY2hhciB0byB0aGUgdGFyZ2V0IFdyaXRlci4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIge0Bjb2RlIG9uZUNoYXJ9IHRvIHRoZSB0YXJnZXQgd3JpdGVyLiBPbmx5IHRoZQorICAgICAqIHR3byBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgaW50ZWdlciB7QGNvZGUgb25lQ2hhcn0gYXJlIHdyaXR0ZW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9uZUNoYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgd3JpdGVyLgogICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgRmlsdGVyV3JpdGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBvbmVDaGFyKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTE1LDIwICsxMjEsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IDxjb2RlPmNoYXJzPC9jb2RlPiBmcm9tIHRoZSBTdHJpbmcKLSAgICAgKiA8Y29kZT5zdHI8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT5pbmRleDwvY29kZT4gdG8gdGhpcwotICAgICAqIEZpbHRlcldyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIDxjb2RlPnN0cjwvY29kZT4gdG8gdGhlCi0gICAgICogdGFyZ2V0IFdyaXRlci4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZyB7QGNvZGUgc3RyfSBzdGFydGluZyBhdAorICAgICAqIHBvc2l0aW9uIHtAY29kZSBpbmRleH0gdG8gdGhpcyB3cml0ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gd3JpdGVzCisgICAgICoge0Bjb2RlIHN0cn0gdG8gdGhlIHRhcmdldCB3cml0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBiZSB3cml0dGVuLgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB3cml0dGVuLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBzdHIgdG8gZ2V0IGNoYXJzLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4ge0Bjb2RlIHN0cn0gdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBudW1iZXIgb2YgY2hhcnMgaW4gc3RyIHRvIHdyaXRlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFycyBpbiB7QGNvZGUgc3RyfSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIEZpbHRlcldyaXRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGlzIHdyaXRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9GbHVzaGFibGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZsdXNoYWJsZS5qYXZhCmluZGV4IGJlMmI0ZGIuLjU1ZmNjOTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZsdXNoYWJsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ZsdXNoYWJsZS5qYXZhCkBAIC0xNywyMSArMTcsMjAgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiA8cD4KLSAqIEluZGljYXRlcyB0aGF0IGFuIG91dHB1dCBvYmplY3QgY2FuIGJlIGZsdXNoZWQuCi0gKiA8L3A+CisgKiBEZWZpbmVzIGFuIGludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IGNhbiAob3IgbmVlZCB0bykgYmUgZmx1c2hlZCwgdHlwaWNhbGx5CisgKiBiZWZvcmUgc29tZSBvdXRwdXQgcHJvY2Vzc2luZyBpcyBjb25zaWRlcmVkIHRvIGJlIGZpbmlzaGVkIGFuZCB0aGUgb2JqZWN0CisgKiBnZXRzIGNsb3NlZC4KICAqIAotICogQHNpbmNlIDEuNQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRmx1c2hhYmxlIHsKICAgICAvKioKLSAgICAgKiA8cD4KICAgICAgKiBGbHVzaGVzIHRoZSBvYmplY3QgYnkgd3JpdGluZyBvdXQgYW55IGJ1ZmZlcmVkIGRhdGEgdG8gdGhlIHVuZGVybHlpbmcKICAgICAgKiBvdXRwdXQuCi0gICAgICogPC9wPgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgYW55IGlzc3VlcyB3cml0aW5nIHRoZSBkYXRhLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JT0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vSU9FeGNlcHRpb24uamF2YQppbmRleCA4ODNlODNiLi44NjlhNmQwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JT0V4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0lPRXhjZXB0aW9uLmphdmEKQEAgLTE4LDI2ICsxOCwzMyBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFRoaXMgSU8gZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvZ3JhbSBlbmNvdW50ZXJzIHNvbWUgc29ydCBJL08gZXJyb3IuCi0gKiBEZXRhaWxzIG1heSBiZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIGJ5IG9uZSBvZiB0aGUgc3ViY2xhc3Nlcy4KKyAqIFNpZ25hbHMgYSBnZW5lcmFsLCBJL08tcmVsYXRlZCBlcnJvci4gRXJyb3IgZGV0YWlscyBtYXkgYmUgc3BlY2lmaWVkIHdoZW4KKyAqIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yLCBhcyB1c3VhbC4gTm90ZSB0aGVyZSBhcmUgYWxzbyBzZXZlcmFsIHN1YmNsYXNzZXMgb2YKKyAqIHRoaXMgY2xhc3MgZm9yIG1vcmUgc3BlY2lmaWMgZXJyb3Igc2l0dWF0aW9ucywgc3VjaCBhcworICoge0BsaW5rIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbn0gb3Ige0BsaW5rIEVPRkV4Y2VwdGlvbn0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSU9FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzgxODM3NTgyODE0NjA5MDE1NUw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIElPRXhjZXB0aW9ufSB3aXRoIGl0cyBzdGFjayB0cmFjZSBmaWxsZWQgaW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElPRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJT0V4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UgYW5kIGRldGFpbAorICAgICAqIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJT0V4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0lucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JbnB1dFN0cmVhbS5qYXZhCmluZGV4IGE5ZmFjMDcuLmFhZTEzYTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0lucHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vSW5wdXRTdHJlYW0uamF2YQpAQCAtMTcsMTM0ICsxNywxNzIgQEAKIAogcGFja2FnZSBqYXZhLmlvOwogCisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CisvLyBFTkQgYW5kcm9pZC1hZGRlZAorCiAvKioKLSAqIElucHV0U3RyZWFtIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgYnl0ZSBpbnB1dCBzdHJlYW1zLiBJdCBwcm92aWRlcwotICogYmFzaWMgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBmb3IgcmVhZGluZyBieXRlcyBmcm9tIGEgc3RyZWFtLgorICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBpbnB1dCBzdHJlYW1zLiBBbiBpbnB1dCBzdHJlYW0gaXMgYSBtZWFucyBvZiByZWFkaW5nCisgKiBkYXRhIGZyb20gYSBzb3VyY2UgaW4gYSBieXRlLXdpc2UgbWFubmVyLgorICogPHA+CisgKiBTb21lIGlucHV0IHN0cmVhbXMgYWxzbyBzdXBwb3J0IG1hcmtpbmcgYSBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtIGFuZAorICogcmV0dXJuaW5nIHRvIHRoaXMgcG9zaXRpb24gbGF0ZXIuIFRoaXMgYWJzdHJhY3QgY2xhc3MgZG9lcyBub3QgcHJvdmlkZSBhCisgKiBmdWxseSB3b3JraW5nIGltcGxlbWVudGF0aW9uLCBzbyBpdCBuZWVkcyB0byBiZSBzdWJjbGFzc2VkLCBhbmQgYXQgbGVhc3QgdGhlCisgKiB7QGxpbmsgI3JlYWQoKX0gbWV0aG9kIG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4uIE92ZXJyaWRpbmcgc29tZSBvZiB0aGUKKyAqIG5vbi1hYnN0cmFjdCBtZXRob2RzIGlzIGFsc28gb2Z0ZW4gYWR2aXNlZCwgc2luY2UgaXQgbWlnaHQgcmVzdWx0IGluIGhpZ2hlcgorICogZWZmaWNpZW5jeS4KKyAqIDxwPgorICogTWFueSBzcGVjaWFsaXplZCBpbnB1dCBzdHJlYW1zIGZvciBwdXJwb3NlcyBsaWtlIHJlYWRpbmcgZnJvbSBhIGZpbGUgYWxyZWFkeQorICogZXhpc3QgaW4gdGhpcyBwYWNrYWdlLgogICogCiAgKiBAc2VlIE91dHB1dFN0cmVhbQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIElucHV0U3RyZWFtIGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBza2lwQnVmOwogCiAgICAgLyoqCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBkb2VzIG5vdGhpbmcgaW50ZXJlc3RpbmcuIFByb3ZpZGVkIGZvciBzaWduYXR1cmUKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGRvZXMgbm90aGluZy4gSXQgaXMgcHJvdmlkZWQgZm9yIHNpZ25hdHVyZQogICAgICAqIGNvbXBhdGliaWxpdHkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElucHV0U3RyZWFtKCkgewogICAgICAgICAvKiBlbXB0eSAqLwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBpbnQgcmVwcmVzZW50aW5nIHRoZW4gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUKLSAgICAgKiB0aGlzIElucHV0U3RyZWFtIHdpbGwgYmxvY2suIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDAuIFN1YmNsYXNzZXMKLSAgICAgKiBzaG91bGQgb3ZlcnJpZGUgYW5kIGluZGljYXRlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgdGhpcyBzdHJlYW0gd2lsbAorICAgICAqIGJsb2NrLiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIDAuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCisgICAgICogYW5kIGluZGljYXRlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgYmxvY2tpbmcuCi0gICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBpbiB0aGlzIElucHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBpbiB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBJbnB1dFN0cmVhbS4gQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGZyZWUKKyAgICAgKiBDbG9zZXMgdGhpcyBzdHJlYW0uIENvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIHNob3VsZCBmcmVlCiAgICAgICogYW55IHJlc291cmNlcyBkdXJpbmcgY2xvc2UuIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIElucHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLyogZW1wdHkgKi8KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBNYXJrIHBvc2l0aW9uIGluIHRoaXMgSW5wdXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5yZWFkTGltaXQ8L2NvZGU+IGluZGljYXRlcyBob3cgbWFueSBieXRlcyBjYW4gYmUgcmVhZCBiZWZvcmUgYQotICAgICAqIG1hcmsgaXMgaW52YWxpZGF0ZWQuIFNlbmRpbmcgcmVzZXQoKSB3aWxsIHJlcG9zaXRpb24gdGhlIFN0cmVhbSBiYWNrIHRvCi0gICAgICogdGhlIG1hcmtlZCBwb3NpdGlvbiBwcm92aWRlZCA8Y29kZT5yZWFkTGltaXQ8L2NvZGU+IGhhcyBub3QgYmVlbgotICAgICAqIHN1cnBhc3NlZC4KKyAgICAgKiBTZXRzIGEgbWFyayBwb3NpdGlvbiBpbiB0aGlzIElucHV0U3RyZWFtLiBUaGUgcGFyYW1ldGVyIHtAY29kZSByZWFkbGltaXR9CisgICAgICogaW5kaWNhdGVzIGhvdyBtYW55IGJ5dGVzIGNhbiBiZSByZWFkIGJlZm9yZSB0aGUgbWFyayBpcyBpbnZhbGlkYXRlZC4KKyAgICAgKiBTZW5kaW5nIHtAY29kZSByZXNldCgpfSB3aWxsIHJlcG9zaXRpb24gdGhlIHN0cmVhbSBiYWNrIHRvIHRoZSBtYXJrZWQKKyAgICAgKiBwb3NpdGlvbiBwcm92aWRlZCB7QGNvZGUgcmVhZExpbWl0fSBoYXMgbm90IGJlZW4gc3VycGFzc2VkLgogICAgICAqIDxwPgogICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIGNvbmNyZXRlIHN1YmNsYXNzZXMgbXVzdAotICAgICAqIHByb3ZpZGUgdGhlaXIgb3duIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBwcm92aWRlIHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRsaW1pdAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBhYmxlIHRvIHJlYWQgYmVmb3JlIGludmFsaWRhdGluZyB0aGUKLSAgICAgKiAgICAgICAgICAgIG1hcmsuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIHN0cmVhbSBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXJrIGlzIGludmFsaWRhdGVkLgorICAgICAqIEBzZWUgI21hcmtTdXBwb3J0ZWQoKQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKICAgICAgICAgLyogZW1wdHkgKi8KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgSW5wdXRTdHJlYW0gc3VwcG9ydHMKLSAgICAgKiBtYXJrKCkgYW5kIHJlc2V0KCkuIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoCi0gICAgICogcmV0dXJucyBmYWxzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHN0cmVhbSBzdXBwb3J0cyB0aGUge0Bjb2RlIG1hcmsoKX0gYW5kCisgICAgICoge0Bjb2RlIHJlc2V0KCl9IG1ldGhvZHMuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMge0Bjb2RlIGZhbHNlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG1hcmsoKSBhbmQgcmVzZXQoKSBhcmUgc3VwcG9ydGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoaXMgSW5wdXRTdHJlYW0gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbgotICAgICAqIGludC4gVGhlIGxvdy1vcmRlciBieXRlIGlzIHJldHVybmVkIG9yIC0xIG9mIHRoZSBlbmQgb2Ygc3RyZWFtIHdhcwotICAgICAqIGVuY291bnRlcmVkLiBUaGlzIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG11c3QgYmUgcHJvdmlkZWQgYnkgY29uY3JldGUKLSAgICAgKiBzdWJjbGFzc2VzLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyIGluIHRoZQorICAgICAqIHJhbmdlIGZyb20gMCB0byAyNTUuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuCisgICAgICogcmVhY2hlZC4gQmxvY2tzIHVudGlsIG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZQorICAgICAqIHN0cmVhbSBpcyBkZXRlY3RlZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgU3RyZWFtIGFuZCBzdG9yZXMgdGhlbSBpbiBieXRlIGFycmF5IDxjb2RlPmI8L2NvZGU+LgotICAgICAqIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgbm8gYnl0ZXMgd2VyZSByZWFkIGFuZAotICAgICAqIGVuZCBvZiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLgorICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhpcyBzdHJlYW0gYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBieXRlIGFycmF5IHtAY29kZSBifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgICAqICAgICAgICAgaGFzIGJlZW4gcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gY2hhbmdlZCBhcnJheSBub3RhdGlvbiB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgaGFybW9ueQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIHJldHVybiByZWFkKGIsIDAsIGIubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhdCBtb3N0IDxjb2RlPmxlbmd0aDwvY29kZT4gYnl0ZXMgZnJvbSB0aGUgU3RyZWFtIGFuZCBzdG9yZXMgdGhlbQotICAgICAqIGluIGJ5dGUgYXJyYXkgPGNvZGU+YjwvY29kZT4gc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyCi0gICAgICogdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mCi0gICAgICogc3RyZWFtIHdhcyBlbmNvdW50ZXJlZC4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBsZW5ndGh9IGJ5dGVzIGZyb20gdGhpcyBzdHJlYW0gYW5kIHN0b3JlcyB0aGVtIGluCisgICAgICogdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ9IHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBiCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YjwvY29kZT4gdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmZmVyfSB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZAorICAgICAqICAgICAgICAgICAgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gPGNvZGU+YjwvY29kZT4uCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiB7QGNvZGUgYn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgICogICAgICAgICBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBifS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93LCBjaGVjayBudWxsIGIKLSAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYi5sZW5ndGggfHwgbGVuZ3RoIDwgMAotICAgICAgICAgICAgICAgIHx8IGxlbmd0aCA+IGIubGVuZ3RoIC0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LAorICAgICAgICAvLyB1c2VkIChvZmZzZXQgfCBsZW5ndGgpIDwgMCBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAobGVuZ3RoIDwgMCkKKyAgICAgICAgLy8gdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmIChiID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuZ3RoKSA8IDAgfHwgbGVuZ3RoID4gYi5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwMmYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGludCBjOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTE1Nyw0MCArMTk1LDQ0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBiW29mZnNldCArIGldID0gKGJ5dGUpIGM7CisgICAgICAgICAgICBiW29mZnNldCArIGldID0gKGJ5dGUpYzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgSW5wdXRTdHJlYW0gdG8gdGhlIGxhc3QgbWFya2VkIGxvY2F0aW9uLiBJZiB0aGUKLSAgICAgKiA8Y29kZT5yZWFkbGltaXQ8L2NvZGU+IGhhcyBiZWVuIHBhc3NlZCBvciBubyA8Y29kZT5tYXJrPC9jb2RlPiBoYXMKLSAgICAgKiBiZWVuIHNldCwgdGhyb3cgSU9FeGNlcHRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gdGhyb3dzIElPRXhjZXB0aW9uIGFuZAotICAgICAqIGNvbmNyZXRlIHN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgcHJvcGVyIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBSZXNldHMgdGhpcyBzdHJlYW0gdG8gdGhlIGxhc3QgbWFya2VkIGxvY2F0aW9uLiBUaHJvd3MgYW4KKyAgICAgKiB7QGNvZGUgSU9FeGNlcHRpb259IGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBzaW5jZSB0aGUgbWFyayBoYXMgYmVlbgorICAgICAqIHNldCBpcyBncmVhdGVyIHRoYW4gdGhlIGxpbWl0IHByb3ZpZGVkIHRvIHtAY29kZSBtYXJrfSwgb3IgaWYgbm8gbWFyaworICAgICAqIGhhcyBiZWVuIHNldC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBhbmQgY29uY3JldGUKKyAgICAgKiBzdWJjbGFzc2VzIHNob3VsZCBwcm92aWRlIHRoZSBwcm9wZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPm48L2NvZGU+IG51bWJlciBvZiBieXRlcyBpbiB0aGlzIElucHV0U3RyZWFtLiBTdWJzZXF1ZW50Ci0gICAgICogPGNvZGU+cmVhZCgpPC9jb2RlPidzIHdpbGwgbm90IHJldHVybiB0aGVzZSBieXRlcyB1bmxlc3MKLSAgICAgKiA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLiBUaGlzIG1ldGhvZCBtYXkgcGVyZm9ybSBtdWx0aXBsZSByZWFkcyB0bwotICAgICAqIHJlYWQgPGNvZGU+bjwvY29kZT4gYnl0ZXMuIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZWFkcwotICAgICAqIDxjb2RlPm48L2NvZGU+IGJ5dGVzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLiBDb25jcmV0ZSBzdWJjbGFzc2VzCi0gICAgICogc2hvdWxkIHByb3ZpZGUgdGhlaXIgb3duIGltcGxlbWVudGF0aW9uLgorICAgICAqIFNraXBzIGF0IG1vc3Qge0Bjb2RlIG59IGJ5dGVzIGluIHRoaXMgc3RyZWFtLiBJdCBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMKKyAgICAgKiAwIGlmIHtAY29kZSBufSBpcyBuZWdhdGl2ZS4gTGVzcyB0aGFuIHtAY29kZSBufSBjaGFyYWN0ZXJzIGFyZSBza2lwcGVkIGlmCisgICAgICogdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBpcyByZWFjaGVkIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmVhZHMge0Bjb2RlIG59IGJ5dGVzIGludG8gYSB0ZW1wb3JhcnkKKyAgICAgKiBidWZmZXIuIENvbmNyZXRlIHN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgdGhlaXIgb3duIGltcGxlbWVudGF0aW9uLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbgogICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBza2lwcGVkLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAobiA8PSAwKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIuamF2YQppbmRleCBkMWM4M2Q5Li5mYzY4NGEzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0lucHV0U3RyZWFtUmVhZGVyLmphdmEKQEAgLTMyLDE0ICszMiwxNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuUHJpdmlBY3Rpb247CiAKIC8qKgotICogSW5wdXRTdHJlYW1SZWFkZXIgaXMgY2xhc3MgZm9yIHR1cm5pbmcgYSBieXRlIFN0cmVhbSBpbnRvIGEgY2hhcmFjdGVyIFN0cmVhbS4KLSAqIERhdGEgcmVhZCBmcm9tIHRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtIGlzIGNvbnZlcnRlZCBpbnRvIGNoYXJhY3RlcnMgYnkgZWl0aGVyCi0gKiBhIGRlZmF1bHQgb3IgcHJvdmlkZWQgY2hhcmFjdGVyIGNvbnZlcnRlci4gQnkgZGVmYXVsdCwgdGhlIGVuY29kaW5nIGlzCi0gKiBhc3N1bWVkIHRvIElTTzg4NTlfMS4gVGhlIElucHV0U3RyZWFtUmVhZGVyIGNvbnRhaW5zIGEgYnVmZmVyIG9mIGJ5dGVzIHJlYWQKLSAqIGZyb20gdGhlIHNvdXJjZSBpbnB1dCBzdHJlYW0gYW5kIGNvbnZlcnRzIHRoZXNlIGludG8gY2hhcmFjdGVycyBhcyBuZWVkZWQuCi0gKiBUaGUgYnVmZmVyIHNpemUgaXMgOEsuCisgKiBBIGNsYXNzIGZvciB0dXJuaW5nIGEgYnl0ZSBzdHJlYW0gaW50byBhIGNoYXJhY3RlciBzdHJlYW0uIERhdGEgcmVhZCBmcm9tIHRoZQorICogc291cmNlIGlucHV0IHN0cmVhbSBpcyBjb252ZXJ0ZWQgaW50byBjaGFyYWN0ZXJzIGJ5IGVpdGhlciBhIGRlZmF1bHQgb3IgYQorICogcHJvdmlkZWQgY2hhcmFjdGVyIGNvbnZlcnRlci4gVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgdGFrZW4gZnJvbSB0aGUKKyAqICJmaWxlLmVuY29kaW5nIiBzeXN0ZW0gcHJvcGVydHkuIHtAY29kZSBJbnB1dFN0cmVhbVJlYWRlcn0gY29udGFpbnMgYSBidWZmZXIKKyAqIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbSBhbmQgY29udmVydHMgdGhlc2UgaW50byBjaGFyYWN0ZXJzIGFzCisgKiBuZWVkZWQuIFRoZSBidWZmZXIgc2l6ZSBpcyA4Sy4KICAqIAogICogQHNlZSBPdXRwdXRTdHJlYW1Xcml0ZXIKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnB1dFN0cmVhbVJlYWRlciBleHRlbmRzIFJlYWRlciB7CiAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbjsKQEAgLTUzLDEzICs1NSwxNCBAQAogICAgIEJ5dGVCdWZmZXIgYnl0ZXMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIgb24gdGhlIElucHV0U3RyZWFtIDxjb2RlPmluPC9jb2RlPi4KLSAgICAgKiBOb3cgY2hhcmFjdGVyIHJlYWRpbmcgY2FuIGJlIGZpbHRlcmVkIHRocm91Z2ggdGhpcyBJbnB1dFN0cmVhbVJlYWRlci4KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGFzc3VtZXMgdGhlIGRlZmF1bHQgY29udmVyc2lvbiBvZiBJU084ODU5XzEKLSAgICAgKiAoSVNPLUxhdGluLTEpLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIElucHV0U3RyZWFtUmVhZGVyfSBvbiB0aGUge0BsaW5rIElucHV0U3RyZWFtfQorICAgICAqIHtAY29kZSBpbn0uIFRoaXMgY29uc3RydWN0b3Igc2V0cyB0aGUgY2hhcmFjdGVyIGNvbnZlcnRlciB0byB0aGUgZW5jb2RpbmcKKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlICJmaWxlLmVuY29kaW5nIiBwcm9wZXJ0eSBhbmQgZmFsbHMgYmFjayB0byBJU08gODg1OV8xCisgICAgICogKElTTy1MYXRpbi0xKSBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB0byBjb252ZXJ0IHRvIGNoYXJhY3RlcnMuCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZCBjaGFyYWN0ZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbVJlYWRlcihJbnB1dFN0cmVhbSBpbikgewogICAgICAgICBzdXBlcihpbik7CkBAIC03MywxOSArNzYsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IElucHV0U3RyZWFtUmVhZGVyIG9uIHRoZSBJbnB1dFN0cmVhbSA8Y29kZT5pbjwvY29kZT4uCi0gICAgICogTm93IGNoYXJhY3RlciByZWFkaW5nIGNhbiBiZSBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgSW5wdXRTdHJlYW1SZWFkZXIuCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBhIFN0cmluZyBwYXJhbWV0ZXIgPGNvZGU+ZW5jPC9jb2RlPiB3aGljaCBpcyB0aGUKLSAgICAgKiBuYW1lIG9mIGFuIGVuY29kaW5nLiBJZiB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kLCBhbgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIgb24gdGhlIElucHV0U3RyZWFtIHtAY29kZSBpbn0uIFRoZQorICAgICAqIGNoYXJhY3RlciBjb252ZXJ0ZXIgdGhhdCBpcyB1c2VkIHRvIGRlY29kZSBieXRlcyBpbnRvIGNoYXJhY3RlcnMgaXMKKyAgICAgKiBpZGVudGlmaWVkIGJ5IG5hbWUgYnkge0Bjb2RlIGVuY30uIElmIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQsIGFuCiAgICAgICogVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlcnJvciBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGluCi0gICAgICogICAgICAgICAgICB0aGUgSW5wdXRTdHJlYW0gdG8gY29udmVydCB0byBjaGFyYWN0ZXJzLgorICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZCBjaGFyYWN0ZXJzLgogICAgICAqIEBwYXJhbSBlbmMKLSAgICAgKiAgICAgICAgICAgIGEgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNoYXJhY3RlciBjb252ZXJ0ZXIgdG8gdXNlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgY2hhcmFjdGVyIGNvbnZlcnRlciB0byB1c2UuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbmN9IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgYnkge0Bjb2RlIGVuY30gY2Fubm90IGJlIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbVJlYWRlcihJbnB1dFN0cmVhbSBpbiwgZmluYWwgU3RyaW5nIGVuYykKICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTEwNCwxNCArMTA4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBJbnB1dFN0cmVhbVJlYWRlciBvbiB0aGUgSW5wdXRTdHJlYW0gPGNvZGU+aW48L2NvZGU+Ci0gICAgICogYW5kIENoYXJzZXREZWNvZGVyIDxjb2RlPmRlYzwvY29kZT4uIE5vdyBjaGFyYWN0ZXIgcmVhZGluZyBjYW4gYmUKLSAgICAgKiBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgSW5wdXRTdHJlYW1SZWFkZXIuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBJbnB1dFN0cmVhbVJlYWRlciBvbiB0aGUgSW5wdXRTdHJlYW0ge0Bjb2RlIGlufSBhbmQKKyAgICAgKiBDaGFyc2V0RGVjb2RlciB7QGNvZGUgZGVjfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB0byBjb252ZXJ0IHRvIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0byByZWFkIGNoYXJhY3RlcnMuCiAgICAgICogQHBhcmFtIGRlYwotICAgICAqICAgICAgICAgICAgYSBDaGFyc2V0RGVjb2RlciB1c2VkIGJ5IHRoZSBjaGFyYWN0ZXIgY29udmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIENoYXJzZXREZWNvZGVyIHVzZWQgYnkgdGhlIGNoYXJhY3RlciBjb252ZXJzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbVJlYWRlcihJbnB1dFN0cmVhbSBpbiwgQ2hhcnNldERlY29kZXIgZGVjKSB7CiAgICAgICAgIHN1cGVyKGluKTsKQEAgLTEyMSwxNCArMTI1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBJbnB1dFN0cmVhbVJlYWRlciBvbiB0aGUgSW5wdXRTdHJlYW0gPGNvZGU+aW48L2NvZGU+Ci0gICAgICogYW5kIENoYXJzZXQgPGNvZGU+Y2hhcnNldDwvY29kZT4uIE5vdyBjaGFyYWN0ZXIgcmVhZGluZyBjYW4gYmUKLSAgICAgKiBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgSW5wdXRTdHJlYW1SZWFkZXIuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBJbnB1dFN0cmVhbVJlYWRlciBvbiB0aGUgSW5wdXRTdHJlYW0ge0Bjb2RlIGlufSBhbmQKKyAgICAgKiBDaGFyc2V0IHtAY29kZSBjaGFyc2V0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB0byBjb252ZXJ0IHRvIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0byByZWFkIGNoYXJhY3RlcnMuCiAgICAgICogQHBhcmFtIGNoYXJzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyc2V0IHRoYXQgc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGNvbnZlcnRlcgorICAgICAqICAgICAgICAgICAgdGhlIENoYXJzZXQgdGhhdCBkZWZpbmVzIHRoZSBjaGFyYWN0ZXIgY29udmVydGVyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElucHV0U3RyZWFtUmVhZGVyKElucHV0U3RyZWFtIGluLCBDaGFyc2V0IGNoYXJzZXQpIHsKICAgICAgICAgc3VwZXIoaW4pOwpAQCAtMTM5LDE5ICsxNDMsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIElucHV0U3RyZWFtUmVhZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgc291cmNlCi0gICAgICogSW5wdXRTdHJlYW0gYW5kIHJlbGVhc2VzIGFsbCBsb2NhbCBzdG9yYWdlLgorICAgICAqIENsb3NlcyB0aGlzIHJlYWRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjbG9zZXMgdGhlIHNvdXJjZSBJbnB1dFN0cmVhbSBhbmQKKyAgICAgKiByZWxlYXNlcyBhbGwgbG9jYWwgc3RvcmFnZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhpcwotICAgICAqICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgcmVhZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICBpZiAoZGVjb2RlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZGVjb2Rlci5yZXNldCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgICAgIGRlY29kZXIgPSBudWxsOwogICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwpAQCAtMTYxLDEyICsxNjcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIFN0cmluZyB3aGljaCBpZGVudGlmaWVzIHRoZSBlbmNvZGluZyB1c2VkIHRvIGNvbnZlcnQgYnl0ZXMgdG8KLSAgICAgKiBjaGFyYWN0ZXJzLiBUaGUgdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgaWYgdGhpcyBSZWFkZXIgaGFzCi0gICAgICogYmVlbiBjbG9zZWQuCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgdXNlZCB0byBjb252ZXJ0IGJ5dGVzIGludG8gY2hhcmFjdGVycy4KKyAgICAgKiBUaGUgdmFsdWUge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkIGlmIHRoaXMgcmVhZGVyIGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgY29udmVydGVyIG9yIG51bGwgaWYgdGhpcyBSZWFkZXIgaXMKLSAgICAgKiAgICAgICAgIGNsb3NlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgY29udmVydGVyIG9yIHtAY29kZSBudWxsfSBpZiB0aGlzCisgICAgICogICAgICAgICByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CiAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKQEAgLTMzMCwxNyArMzM2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhpcyBJbnB1dFN0cmVhbVJlYWRlciBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQgYXMgYW4gaW50LiBUaGUgMiBoaWdoZXItb3JkZXIgY2hhcmFjdGVycyBhcmUgc2V0IHRvIDAuIElmIHRoZSBlbmQKLSAgICAgKiBvZiByZWFkZXIgd2FzIGVuY291bnRlcmVkIHRoZW4gcmV0dXJuIC0xLiBUaGUgYnl0ZSB2YWx1ZSBpcyBlaXRoZXIKLSAgICAgKiBvYnRhaW5lZCBmcm9tIGNvbnZlcnRpbmcgYnl0ZXMgaW4gdGhpcyByZWFkZXJzIGJ1ZmZlciBvciBieSBmaXJzdCBmaWxsaW5nCi0gICAgICogdGhlIGJ1ZmZlciBmcm9tIHRoZSBzb3VyY2UgSW5wdXRTdHJlYW0gYW5kIHRoZW4gcmVhZGluZyBmcm9tIHRoZSBidWZmZXIuCisgICAgICogUmVhZHMgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhpcyByZWFkZXIgYW5kIHJldHVybnMgaXQgYXMgYW4gaW50ZWdlcgorICAgICAqIHdpdGggdGhlIHR3byBoaWdoZXItb3JkZXIgYnl0ZXMgc2V0IHRvIDAuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiByZWFkZXIgaGFzIGJlZW4gcmVhY2hlZC4gVGhlIGJ5dGUgdmFsdWUgaXMgZWl0aGVyIG9idGFpbmVkIGZyb20KKyAgICAgKiBjb252ZXJ0aW5nIGJ5dGVzIGluIHRoaXMgcmVhZGVyJ3MgYnVmZmVyIG9yIGJ5IGZpcnN0IGZpbGxpbmcgdGhlIGJ1ZmZlcgorICAgICAqIGZyb20gdGhlIHNvdXJjZSBJbnB1dFN0cmVhbSBhbmQgdGhlbiByZWFkaW5nIGZyb20gdGhlIGJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgcmVhZCBvciAtMSBpZiBlbmQgb2YgcmVhZGVyLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHJlYWRlciBoYXMgYmVlbgorICAgICAqICAgICAgICAgcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIElucHV0U3RyZWFtUmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSU8KLSAgICAgKiAgICAgICAgICAgICBlcnJvciBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzU2LDI0ICszNjIsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhdCBtb3N0IDxjb2RlPmNvdW50PC9jb2RlPiBjaGFyYWN0ZXJzIGZyb20gdGhpcyBSZWFkZXIgYW5kIHN0b3JlcwotICAgICAqIHRoZW0gYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpbiB0aGUgY2hhcmFjdGVyIGFycmF5IDxjb2RlPmJ1ZjwvY29kZT4uCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHJlYWRlcgotICAgICAqIHdhcyBlbmNvdW50ZXJlZC4gVGhlIGJ5dGVzIGFyZSBlaXRoZXIgb2J0YWluZWQgZnJvbSBjb252ZXJ0aW5nIGJ5dGVzIGluCi0gICAgICogdGhpcyByZWFkZXJzIGJ1ZmZlciBvciBieSBmaXJzdCBmaWxsaW5nIHRoZSBidWZmZXIgZnJvbSB0aGUgc291cmNlCisgICAgICogUmVhZHMgYXQgbW9zdCB7QGNvZGUgbGVuZ3RofSBjaGFyYWN0ZXJzIGZyb20gdGhpcyByZWFkZXIgYW5kIHN0b3JlcyB0aGVtCisgICAgICogYXQgcG9zaXRpb24ge0Bjb2RlIG9mZnNldH0gaW4gdGhlIGNoYXJhY3RlciBhcnJheSB7QGNvZGUgYnVmfS4gUmV0dXJucworICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHJlYWRlciBoYXMKKyAgICAgKiBiZWVuIHJlYWNoZWQuIFRoZSBieXRlcyBhcmUgZWl0aGVyIG9idGFpbmVkIGZyb20gY29udmVydGluZyBieXRlcyBpbiB0aGlzCisgICAgICogcmVhZGVyJ3MgYnVmZmVyIG9yIGJ5IGZpcnN0IGZpbGxpbmcgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzb3VyY2UKICAgICAgKiBJbnB1dFN0cmVhbSBhbmQgdGhlbiByZWFkaW5nIGZyb20gdGhlIGJ1ZmZlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmCi0gICAgICogICAgICAgICAgICBjaGFyYWN0ZXIgYXJyYXkgdG8gc3RvcmUgdGhlIHJlYWQgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXJzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZiB0byBzdG9yZSB0aGUgcmVhZCBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmfSB0byBzdG9yZSB0aGUgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgcmVhZCBmcm9tIHRoaXMgcmVhZGVyLgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgb3IgLTEgaWYgZW5kIG9mIHJlYWRlci4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSByZWFkZXIgaGFzCisgICAgICogICAgICAgICBiZWVuIHJlYWNoZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZ9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgSW5wdXRTdHJlYW1SZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQgb3Igc29tZSBvdGhlciBJTwotICAgICAqICAgICAgICAgICAgIGVycm9yIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzgyLDkgKzM5MywxOCBAQAogICAgICAgICAgICAgICAgIC8vIEswMDcwPUlucHV0U3RyZWFtUmVhZGVyIGlzIGNsb3NlZC4KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1Zi5sZW5ndGggLSBsZW5ndGggfHwgbGVuZ3RoIDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LCB1c2VkIChvZmZzZXQgfCBsZW5ndGgpIDwgMAorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGxlbmd0aCA8IDApIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG9mZnNldCB8IGxlbmd0aCkgPCAwIHx8IG9mZnNldCA+IGJ1Zi5sZW5ndGggLSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CkBAIC00ODQsMjEgKzUwNCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMKLSAgICAgKiBJbnB1dFN0cmVhbVJlYWRlciBpcyByZWFkeSB0byBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuIElmIHRoZSByZXN1bHQgaXMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIG5leHQgPGNvZGU+cmVhZCgpPC9jb2RlPiB3aWxsIG5vdCBibG9jay4gSWYKLSAgICAgKiB0aGUgcmVzdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGlzIFJlYWRlciBtYXkgb3IgbWF5IG5vdCBibG9jayB3aGVuCi0gICAgICogPGNvZGU+cmVhZCgpPC9jb2RlPiBpcyBzZW50LiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIgb3IgdGhlCi0gICAgICogc291cmNlIElucHV0U3RyZWFtIGhhcyBieXRlcyBhdmFpbGFibGUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyByZWFkZXIgaXMgcmVhZHkgdG8gYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLiBJZgorICAgICAqIHRoZSByZXN1bHQgaXMge0Bjb2RlIHRydWV9LCB0aGUgbmV4dCB7QGNvZGUgcmVhZCgpfSB3aWxsIG5vdCBibG9jay4gSWYKKyAgICAgKiB0aGUgcmVzdWx0IGlzIHtAY29kZSBmYWxzZX0gdGhlbiB0aGlzIHJlYWRlciBtYXkgb3IgbWF5IG5vdCBibG9jayB3aGVuCisgICAgICoge0Bjb2RlIHJlYWQoKX0gaXMgY2FsbGVkLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMge0Bjb2RlIHRydWV9IGlmCisgICAgICogdGhlcmUgYXJlIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyIG9yIHRoZSBzb3VyY2Ugc3RyZWFtIGhhcyBieXRlcworICAgICAqIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciB3aWxsIG5vdCBibG9jayB3aGVuCi0gICAgICogICAgICAgICA8Y29kZT5yZWFkKCk8L2NvZGU+IGlzIGNhbGxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHVua25vd24KLSAgICAgKiAgICAgICAgIG9yIGJsb2NraW5nIHdpbGwgb2NjdXIuCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlY2VpdmVyIHdpbGwgbm90IGJsb2NrIHdoZW4ge0Bjb2RlIHJlYWQoKX0KKyAgICAgKiAgICAgICAgIGlzIGNhbGxlZCwge0Bjb2RlIGZhbHNlfSBpZiB1bmtub3duIG9yIGJsb2NraW5nIHdpbGwgb2NjdXIuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBJbnB1dFN0cmVhbVJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPCi0gICAgICogICAgICAgICAgICAgZXJyb3Igb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi5qYXZhCmluZGV4IGJiZGI2YjAuLmRlMTFkMjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ludGVycnVwdGVkSU9FeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JbnRlcnJ1cHRlZElPRXhjZXB0aW9uLmphdmEKQEAgLTE4LDM0ICsxOCw0MCBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFRoaXMgSU8gZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvZ3JhbSByZWFkaW5nIG9yIHdyaXRpbmcgdG8gYSBzdHJlYW0gaXMKLSAqIGludGVycnVwdGVkLiBUaGlzIGlzIGFsc28gdGhyb3duIHdoZW4gYSBzb2NrZXQgdGltZW91dCBvY2N1cnMgYmVmb3JlIHRoZQotICogcmVxdWVzdCBoYXMgY29tcGxldGVkLgorICogU2lnbmFscyB0aGF0IGEgYmxvY2tpbmcgSS9PIG9wZXJhdGlvbiBoYXMgYmVlbiBpbnRlcnJ1cHRlZC4gVGhlIG51bWJlciBvZgorICogYnl0ZXMgdGhhdCB3ZXJlIHRyYW5zZmVycmVkIHN1Y2Nlc3NmdWxseSBiZWZvcmUgdGhlIGludGVycnVwdGlvbiB0b29rIHBsYWNlCisgKiBpcyBzdG9yZWQgaW4gYSBmaWVsZCBvZiB0aGUgZXhjZXB0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEludGVycnVwdGVkSU9FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MDIwNTY4NDYwNzI3NTAwNTY3TDsKIAogICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgYmVmb3JlIHRoZSBJTyBpbnRlcnJ1cHQgb2NjdXJyZWQuIFRoZQotICAgICAqIGRlZmF1bHQgaXMgMCBidXQgdGhlIHZhbHVlIG1heSBiZSBmaWxsZWQgaW4gYnkgdGhlIGNhbGxlciBvZiB0aGUKLSAgICAgKiBjb25zdHJ1Y3Rvci4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGJlZm9yZSB0aGUgSS9PIGludGVycnVwdCBvY2N1cnJlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGJ5dGVzVHJhbnNmZXJyZWQ7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEludGVycnVwdGVkSU9FeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlCisgICAgICogZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnRlcnJ1cHRlZElPRXhjZXB0aW9ufSB3aXRoIGl0cyBzdGFjayB0cmFjZSBhbmQKKyAgICAgKiBkZXRhaWwgbWVzc2FnZSBmaWxsZWQgaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludGVycnVwdGVkSU9FeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JbnZhbGlkQ2xhc3NFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ludmFsaWRDbGFzc0V4Y2VwdGlvbi5qYXZhCmluZGV4IDFmYTVlNGMuLjEwNzY0YjUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ludmFsaWRDbGFzc0V4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ludmFsaWRDbGFzc0V4Y2VwdGlvbi5qYXZhCkBAIC0xOCw0OCArMTgsNTQgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBBIHByb2JsZW0gd2FzIGZvdW5kIHdpdGggdGhlIGNsYXNzIG9mIG9uZSBvZiB0aGUgb2JqZWN0cyBiZWluZyBzZXJpYWxpemVkIG9yCi0gKiBkZXNlcmlhbGl6ZWQuIFRoZXNlIGNhbiBiZQorICogU2lnbmFscyBhIHByb2JsZW0gZHVyaW5nIHRoZSBzZXJpYWxpemF0aW9uIG9yIG9yIGRlc2VyaWFsaXphdGlvbiBvZiBhbgorICogb2JqZWN0LiBQb3NzaWJsZSByZWFzb25zIGluY2x1ZGU6CiAgKiA8dWw+CiAgKiA8bGk+VGhlIFNVSURzIG9mIHRoZSBjbGFzcyBsb2FkZWQgYnkgdGhlIFZNIGFuZCB0aGUgc2VyaWFsaXplZCBjbGFzcyBpbmZvIGRvCi0gKiBub3QgbWF0Y2g8L2xpPgorICogbm90IG1hdGNoLjwvbGk+CiAgKiA8bGk+QSBzZXJpYWxpemFibGUgb3IgZXh0ZXJuYWxpemFibGUgb2JqZWN0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKHdoZW4KLSAqIGRlc2VyaWFsaXppbmcpIGJlY2F1c2UgdGhlIGVtcHR5IGNvbnN0cnVjdG9yIHRoYXQgbmVlZHMgdG8gYmUgcnVuIGlzIG5vdAorICogZGVzZXJpYWxpemluZykgYmVjYXVzZSB0aGUgbm8tYXJnIGNvbnN0cnVjdG9yIHRoYXQgbmVlZHMgdG8gYmUgcnVuIGlzIG5vdAogICogdmlzaWJsZSBvciBmYWlscy48L2xpPgogICogPC91bD4KICAqIAogICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSAjcmVhZE9iamVjdCgpCiAgKiBAc2VlIE9iamVjdElucHV0VmFsaWRhdGlvbiN2YWxpZGF0ZU9iamVjdCgpCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW52YWxpZENsYXNzRXhjZXB0aW9uIGV4dGVuZHMgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MzMzMzE2Mjk2MjUxMDU0NDE2TDsKIAogICAgIC8qKgotICAgICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0KKyAgICAgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NuYW1lOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEludmFsaWRDbGFzc0V4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UgYW5kCisgICAgICogZGV0YWlsZWQgbWVzc2FnZSBmaWxsZWQgaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludmFsaWRDbGFzc0V4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2ssIG1lc3NhZ2UgYW5kCi0gICAgICogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiBmaWxsZWQKLSAgICAgKiBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnZhbGlkQ2xhc3NFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlLAorICAgICAqIGRldGFpbCBtZXNzYWdlIGFuZCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIGNhdXNlZCB0aGUKKyAgICAgKiBleGNlcHRpb24gZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkQ2xhc3NFeGNlcHRpb24oU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CkBAIC02NywxMyArNzMsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBtZXNzYWdlIHdoaWNoIHdhcyBwcm92aWRlZCB3aGVuIHRoZQotICAgICAqIGV4Y2VwdGlvbiB3YXMgY3JlYXRlZC4gSWYgbm8gbWVzc2FnZSB3YXMgcHJvdmlkZWQgYXQgY3JlYXRpb24gdGltZSwgdGhlbgotICAgICAqIGFuc3dlciBudWxsLiBJZiBhIG1lc3NhZ2Ugd2FzIHByb3ZpZGVkIGFuZCBhIGNsYXNzIG5hbWUgd2hpY2ggY2F1c2VkIHRoZQotICAgICAqIGV4Y2VwdGlvbiwgdGhlIHZhbHVlcyBhcmUgY29uY2F0ZW5hdGVkIGFuZCByZXR1cm5lZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBkZXRhaWwgbWVzc2FnZSB3aGljaCB3YXMgcHJvdmlkZWQgd2hlbiB0aGUgZXhjZXB0aW9uIHdhcworICAgICAqIGNyZWF0ZWQuIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZCBpZiBubyBtZXNzYWdlIHdhcyBwcm92aWRlZCBhdCBjcmVhdGlvbgorICAgICAqIHRpbWUuIElmIGEgZGV0YWlsIG1lc3NhZ2UgYXMgd2VsbCBhcyBhIGNsYXNzIG5hbWUgYXJlIHByb3ZpZGVkLCB0aGVuIHRoZQorICAgICAqIHZhbHVlcyBhcmUgY29uY2F0ZW5hdGVkIGFuZCByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZWNlaXZlcidzIG1lc3NhZ2UsIHBvc3NpYmx5IGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBuYW1lIG9mCi0gICAgICogICAgICAgICB0aGUgY2xhc3MgdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0uCisgICAgICogQHJldHVybiB0aGUgZGV0YWlsIG1lc3NhZ2UsIHBvc3NpYmx5IGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZQorICAgICAqICAgICAgICAgY2xhc3MgdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vSW52YWxpZE9iamVjdEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vSW52YWxpZE9iamVjdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDY3MDM2MDAuLmEyYmI1ZGYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0ludmFsaWRPYmplY3RFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9JbnZhbGlkT2JqZWN0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDIzICsxOCwyNCBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFRoZSBvYmplY3QgZ3JhcGggbG9hZGVkIChkZXNlcmlhbGl6ZWQpIGNhbiBiZSB2YWxpZGF0ZWQgYnkgYSBjb2xsZWN0aW9uIG9mCi0gKiB2YWxpZGF0b3Igb2JqZWN0cy4gSWYgdGhlc2UgZGVjaWRlIHRoZSB2YWxpZGF0aW9uIGZhaWxzLCB0aGVuIHdpbGwgdGhyb3cKLSAqIEludmFsaWRPYmplY3RFeGNlcHRpb24uCisgKiBTaWduYWxzIHRoYXQsIGR1cmluZyBkZXNlcmlhbGl6YXRpb24sIHRoZSB2YWxpZGF0aW9uIG9mIGFuIG9iamVjdCBoYXMgZmFpbGVkLgogICogCiAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI3JlZ2lzdGVyVmFsaWRhdGlvbihPYmplY3RJbnB1dFZhbGlkYXRpb24sIGludCkKICAqIEBzZWUgT2JqZWN0SW5wdXRWYWxpZGF0aW9uI3ZhbGlkYXRlT2JqZWN0KCkKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uIGV4dGVuZHMgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyMzMxNzQzMTgyODE4Mzk1ODNMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIEludmFsaWRPYmplY3RFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlIGFuZAorICAgICAqIGRldGFpbCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZE9iamVjdEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0xpbmVOdW1iZXJJbnB1dFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vTGluZU51bWJlcklucHV0U3RyZWFtLmphdmEKaW5kZXggOThlZDYzMi4uZTY3NDdjMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vTGluZU51bWJlcklucHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vTGluZU51bWJlcklucHV0U3RyZWFtLmphdmEKQEAgLTE3LDEzICsxNywyMCBAQAogCiBwYWNrYWdlIGphdmEuaW87CiAKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCisKIC8qKgotICogTGluZU51bWJlcklucHV0U3RyZWFtIGlzIGEgZmlsdGVyIGNsYXNzIHdoaWNoIGNvdW50cyB0aGUgbnVtYmVyIG9mIGxpbmUKLSAqIHRlcm1pbmF0b3JzIGZyb20gdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSB0YXJnZXQgSW5wdXRTdHJlYW0uIEEgbGluZSBkZWxpbWl0ZXIKLSAqIHNlcXVlbmNlIGlzIGRldGVybWluZWQgYnkgJ1xyJywgJ1xuJywgb3IgJ1xyXG4nLiBXaGVuIHVzaW5nIDxjb2RlPnJlYWQ8L2NvZGU+LAotICogdGhlIHNlcXVlbmNlIGlzIGFsd2F5cyB0cmFuc2xhdGVkIGludG8gJ1xuJy4KKyAqIFdyYXBzIGFuIGV4aXN0aW5nIHtAbGluayBJbnB1dFN0cmVhbX0gYW5kIGNvdW50cyB0aGUgbGluZSB0ZXJtaW5hdG9ycworICogZW5jb3VudGVyZWQgd2hpbGUgcmVhZGluZyB0aGUgZGF0YS4gTGluZSBudW1iZXJpbmcgc3RhcnRzIGF0IDAuIFJlY29nbml6ZWQKKyAqIGxpbmUgdGVybWluYXRvciBzZXF1ZW5jZXMgYXJlIHtAY29kZSAnXHInfSwge0Bjb2RlICdcbid9IGFuZCB7QGNvZGUgIlxyXG4ifS4KKyAqIFdoZW4gdXNpbmcge0Bjb2RlIHJlYWR9LCBsaW5lIHRlcm1pbmF0b3Igc2VxdWVuY2VzIGFyZSBhbHdheXMgdHJhbnNsYXRlZCBpbnRvCisgKiB7QGNvZGUgJ1xuJ30uCiAgKiAKICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTGluZU51bWJlclJlYWRlcn0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIEBEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgTGluZU51bWJlcklucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewpAQCAtMzcsMjggKzQ0LDMxIEBACiAgICAgcHJpdmF0ZSBpbnQgbWFya2VkTGFzdENoYXI7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExpbmVOdW1iZXJJbnB1dFN0cmVhbSBvbiB0aGUgSW5wdXRTdHJlYW0gPGNvZGU+aW48L2NvZGU+LgotICAgICAqIEFsbCByZWFkcyBhcmUgbm93IGZpbHRlcmVkIHRocm91Z2ggdGhpcyBzdHJlYW0gYW5kIGxpbmUgbnVtYmVycyB3aWxsIGJlCi0gICAgICogY291bnRlZCBmb3IgYWxsIGRhdGEgcmVhZCBmcm9tIHRoaXMgU3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIExpbmVOdW1iZXJJbnB1dFN0cmVhbX0gb24gdGhlIHtAbGluayBJbnB1dFN0cmVhbX0KKyAgICAgKiB7QGNvZGUgaW59LiBMaW5lIG51bWJlcnMgYXJlIGNvdW50ZWQgZm9yIGFsbCBkYXRhIHJlYWQgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBub24tbnVsbCBJbnB1dFN0cmVhbSB0byBjb3VudCBsaW5lIG51bWJlcnMuCisgICAgICogICAgICAgICAgICBUaGUgbm9uLW51bGwgaW5wdXQgc3RyZWFtIHRvIGNvdW50IGxpbmUgbnVtYmVycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGluZU51bWJlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CiAgICAgICAgIHN1cGVyKGluKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUKLSAgICAgKiB0aGlzIExpbmVOdW1iZXJJbnB1dFN0cmVhbSB3aWxsIGJsb2NrLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgICAgKiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHRhcmdldCBzdHJlYW0uIFNpbmNlIHRoZSB0YXJnZXQgaW5wdXQgc3RyZWFtIG1heQotICAgICAqIGp1c3QgYmUgYSBzZXF1ZW5jZSBvZiA8Y29kZT5cclxuPC9jb2RlPiBjaGFyYWN0ZXJzIGFuZCB0aGlzIGZpbHRlciBvbmx5Ci0gICAgICogcmV0dXJucyA8Y29kZT5cbjxjb2RlPiB0aGVuIDxjb2RlPmF2YWlsYWJsZTwvY29kZT4gY2FuIG9ubHkKLSAgICAgKiBndWFyYW50ZWUgPGNvZGU+dGFyZ2V0LmF2YWlsYWJsZSgpLzI8L2NvZGU+IGNoYXJhY3RlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgYmxvY2tpbmcuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBpbiB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGJlZm9yZSB0aGlzIHN0cmVhbSB3aWxsCisgICAgICogYmxvY2suCisgICAgICogPHA+CisgICAgICogTm90ZTogVGhlIHNvdXJjZSBzdHJlYW0gbWF5IGp1c3QgYmUgYSBzZXF1ZW5jZSBvZiB7QGNvZGUgIlxyXG4ifSBieXRlcworICAgICAqIHdoaWNoIGFyZSBjb252ZXJ0ZWQgaW50byB7QGNvZGUgJ1xuJ30gYnkgdGhpcyBzdHJlYW0uIFRoZXJlZm9yZSwKKyAgICAgKiB7QGNvZGUgYXZhaWxhYmxlfSByZXR1cm5zIG9ubHkge0Bjb2RlIGluLmF2YWlsYWJsZSgpIC8gMn0gYnl0ZXMgYXMKKyAgICAgKiByZXN1bHQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGd1YXJhbnRlZWQgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgYmxvY2tpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBpbiB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC02NiwyOCArNzYsMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBmb3IgdGhpcwotICAgICAqIExpbmVOdW1iZXJJbnB1dFN0cmVhbS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGZvciB0aGlzIHN0cmVhbS4gTnVtYmVyaW5nIHN0YXJ0cyBhdCAwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewogICAgICAgICByZXR1cm4gbGluZU51bWJlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBNYXJrIHBvc2l0aW9uIGluIHRoaXMgTGluZU51bWJlcklucHV0U3RyZWFtLiBUaGUgcGFyYW1ldGVyCi0gICAgICogPGNvZGU+cmVhZExpbWl0PC9jb2RlPiBpbmRpY2F0ZXMgaG93IG1hbnkgYnl0ZXMgY2FuIGJlIHJlYWQgYmVmb3JlIGEKLSAgICAgKiBtYXJrIGlzIGludmFsaWRhdGVkLiBTZW5kaW5nIHJlc2V0KCkgd2lsbCByZXBvc2l0aW9uIHRoZSBTdHJlYW0gYmFjayB0bwotICAgICAqIHRoZSBtYXJrZWQgcG9zaXRpb24gcHJvdmlkZWQgPGNvZGU+cmVhZExpbWl0PC9jb2RlPiBoYXMgbm90IGJlZW4KLSAgICAgKiBzdXJwYXNzZWQuIFRoZSBsaW5lTnVtYmVyIGNvdW50IHdpbGwgYWxzbyBiZSByZXNldCB0byB0aGUgbGFzdCBtYXJrZWQKLSAgICAgKiBsaW5lTnVtYmVyIGNvdW50LgorICAgICAqIFNldHMgYSBtYXJrIHBvc2l0aW9uIGluIHRoaXMgc3RyZWFtLiBUaGUgcGFyYW1ldGVyIHtAY29kZSByZWFkbGltaXR9CisgICAgICogaW5kaWNhdGVzIGhvdyBtYW55IGJ5dGVzIGNhbiBiZSByZWFkIGJlZm9yZSB0aGUgbWFyayBpcyBpbnZhbGlkYXRlZC4KKyAgICAgKiBTZW5kaW5nIHtAY29kZSByZXNldCgpfSB3aWxsIHJlcG9zaXRpb24gdGhpcyBzdHJlYW0gYmFjayB0byB0aGUgbWFya2VkCisgICAgICogcG9zaXRpb24sIHByb3ZpZGVkIHRoYXQge0Bjb2RlIHJlYWRsaW1pdH0gaGFzIG5vdCBiZWVuIHN1cnBhc3NlZC4KKyAgICAgKiBUaGUgbGluZSBudW1iZXIgY291bnQgd2lsbCBhbHNvIGJlIHJlc2V0IHRvIHRoZSBsYXN0IG1hcmtlZAorICAgICAqIGxpbmUgbnVtYmVyIGNvdW50LgogICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cyBhIG1hcmsgaW4gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZXRzIGEgbWFyayBpbiB0aGUgZmlsdGVyZWQgc3RyZWFtLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0Ci0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFibGUgdG8gcmVhZCBiZWZvcmUgaW52YWxpZGF0aW5nIHRoZQotICAgICAqICAgICAgICAgICAgbWFyay4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgc3RyZWFtIGJlZm9yZQorICAgICAqICAgICAgICAgICAgdGhlIG1hcmsgaXMgaW52YWxpZGF0ZWQuCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewpAQCAtOTcsMTggKzExMSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIExpbmVOdW1iZXJJbnB1dFN0cmVhbSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQgYXMgYW4gaW50LiBUaGUgbG93LW9yZGVyIGJ5dGUgaXMgcmV0dXJuZWQgb3IgLTEgb2YgdGhlIGVuZCBvZgotICAgICAqIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIGJ5dGUgZnJvbSB0aGUKLSAgICAgKiB0YXJnZXQgc3RyZWFtLiBUaGUgbGluZSBudW1iZXIgY291bnQgaXMgaW5jcmVtZW50ZWQgaWYgYSBsaW5lIHRlcm1pbmF0b3IKLSAgICAgKiBpcyBlbmNvdW50ZXJlZC4gQSBsaW5lIGRlbGltaXRlciBzZXF1ZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ICdccicsICdcbicsIG9yCi0gICAgICogJ1xyXG4nLiBJbiB0aGlzIG1ldGhvZCwgdGhlIHNlcXVlbmNlIGlzIGFsd2F5cyB0cmFuc2xhdGVkIGludG8gJ1xuJy4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIGZpbHRlcmVkIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyCisgICAgICogaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyNTUuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBoYXMgYmVlbgorICAgICAqIHJlYWNoZWQuCisgICAgICogPHA+CisgICAgICogVGhlIGxpbmUgbnVtYmVyIGNvdW50IGlzIGluY3JlbWVudGVkIGlmIGEgbGluZSB0ZXJtaW5hdG9yIGlzIGVuY291bnRlcmVkLgorICAgICAqIFJlY29nbml6ZWQgbGluZSB0ZXJtaW5hdG9yIHNlcXVlbmNlcyBhcmUge0Bjb2RlICdccid9LCB7QGNvZGUgJ1xuJ30gYW5kCisgICAgICoge0Bjb2RlICJcclxuIn0uIExpbmUgdGVybWluYXRvciBzZXF1ZW5jZXMgYXJlIGFsd2F5cyB0cmFuc2xhdGVkIGludG8KKyAgICAgKiB7QGNvZGUgJ1xuJ30uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IFRoZSBieXRlIHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgZmlsdGVyZWQgc3RyZWFtIGhhcyBiZWVuCisgICAgICogICAgICAgICByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEzMyw0MiArMTUwLDUxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5sZW5ndGg8L2NvZGU+IGJ5dGVzIGZyb20gdGhpcyBMaW5lTnVtYmVySW5wdXRTdHJlYW0KLSAgICAgKiBhbmQgc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiByZWFkcyBieXRlcyBmcm9tIHRoZSB0YXJnZXQgc3RyZWFtLiBUaGUgbGluZSBudW1iZXIgY291bnQgaXMgaW5jcmVtZW50ZWQKLSAgICAgKiBpZiBhIGxpbmUgdGVybWluYXRvciBpcyBlbmNvdW50ZXJlZC4gQSBsaW5lIGRlbGltaXRlciBzZXF1ZW5jZSBpcwotICAgICAqIGRldGVybWluZWQgYnkgJ1xyJywgJ1xuJywgb3IgJ1xyXG4nLiBJbiB0aGlzIG1ldGhvZCwgdGhlIHNlcXVlbmNlIGlzCi0gICAgICogYWx3YXlzIHRyYW5zbGF0ZWQgaW50byAnXG4nLgorICAgICAqIFJlYWRzIGF0IG1vc3Qge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgZnJvbSB0aGUgZmlsdGVyZWQgc3RyZWFtIGFuZCBzdG9yZXMKKyAgICAgKiB0aGVtIGluIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9LgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIG5vIGJ5dGVzIGhhdmUgYmVlbgorICAgICAqIHJlYWQgYW5kIHRoZSBlbmQgb2YgdGhpcyBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGluZSBudW1iZXIgY291bnQgaXMgaW5jcmVtZW50ZWQgaWYgYSBsaW5lIHRlcm1pbmF0b3IgaXMgZW5jb3VudGVyZWQuCisgICAgICogUmVjb2duaXplZCBsaW5lIHRlcm1pbmF0b3Igc2VxdWVuY2VzIGFyZSB7QGNvZGUgJ1xyJ30sIHtAY29kZSAnXG4nfSBhbmQKKyAgICAgKiB7QGNvZGUgIlxyXG4ifS4gTGluZSB0ZXJtaW5hdG9yIHNlcXVlbmNlcyBhcmUgYWx3YXlzIHRyYW5zbGF0ZWQgaW50bworICAgICAqIHtAY29kZSAnXG4nfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQKKyAgICAgKiAgICAgICAgICAgIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiB7QGNvZGUgYnVmZmVyfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgZmlsdGVyZWQgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQgd2hpbGUgcmVhZGluZy4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuZ3RoIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uIG9jY3Vycy4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIDxjb2RlPm9mZnNldDwvY29kZT4gb3IgPGNvZGU+Y291bnQ8L2NvZGU+IGFyZSBvdXQgb2YKLSAgICAgKiAgICAgICAgICAgICBib3VuZHMuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGJ1ZmZlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIHx8IGxlbmd0aCA8IDAKLSAgICAgICAgICAgICAgICB8fCBsZW5ndGggPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHJlbW92ZWQgcmVkdW5kYW50IGNoZWNrLCB1c2VkIChvZmZzZXQgfCBsZW5ndGgpIDwgMAorICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAobGVuZ3RoIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuZ3RoKSA8IDAgfHwgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgY3VycmVudENoYXI7CkBAIC0xODksMTUgKzIxNSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgTGluZU51bWJlcklucHV0U3RyZWFtIHRvIHRoZSBsYXN0IG1hcmtlZCBsb2NhdGlvbi4gSWYgdGhlCi0gICAgICogPGNvZGU+cmVhZGxpbWl0PC9jb2RlPiBoYXMgYmVlbiBwYXNzZWQgb3Igbm8gPGNvZGU+bWFyazwvY29kZT4gaGFzCi0gICAgICogYmVlbiBzZXQsIHRocm93IElPRXhjZXB0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIHJlc2V0cyB0aGUgdGFyZ2V0Ci0gICAgICogc3RyZWFtLiBJdCBhbHNvIHJlc2V0cyB0aGUgbGluZSBjb3VudCB0byB3aGF0IGlzIHdhcyB3aGVuIHRoaXMgU3RyZWFtIHdhcwotICAgICAqIG1hcmtlZC4KKyAgICAgKiBSZXNldHMgdGhpcyBzdHJlYW0gdG8gdGhlIGxhc3QgbWFya2VkIGxvY2F0aW9uLiBJdCBhbHNvIHJlc2V0cyB0aGUgbGluZQorICAgICAqIGNvdW50IHRvIHdoYXQgaXMgd2FzIHdoZW4gdGhpcyBzdHJlYW0gd2FzIG1hcmtlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkLCBubyBtYXJrIGhhcyBiZWVuIHNldCBvciB0aGUKKyAgICAgKiAgICAgICAgICAgICBtYXJrIGlzIG5vIGxvbmdlciB2YWxpZCBiZWNhdXNlIG1vcmUgdGhhbiB7QGNvZGUgcmVhZGxpbWl0fQorICAgICAqICAgICAgICAgICAgIGJ5dGVzIGhhdmUgYmVlbiByZWFkIHNpbmNlIHNldHRpbmcgdGhlIG1hcmsuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjA3LDMxICsyMzQsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsaW5lTnVtYmVyIG9mIHRoaXMgTGluZU51bWJlcklucHV0U3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiA8Y29kZT5saW5lTnVtYmVyPC9jb2RlPi4gTm90ZSB0aGF0IHRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzIG9uIHRoZQorICAgICAqIFNldHMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoaXMgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgbGluZU51bWJlcn0uIE5vdGUgdGhhdCB0aGlzIG1heSBoYXZlIHNpZGUgZWZmZWN0cyBvbiB0aGUKICAgICAgKiBsaW5lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgbWFya2VkIHBvc2l0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsaW5lTnVtYmVyCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IGxpbmVOdW1iZXIgdmFsdWUuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpIHsKICAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTa2lwcyA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgSW5wdXRTdHJlYW0uCi0gICAgICogU3Vic2VxdWVudCA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzIHVubGVzcwotICAgICAqIDxjb2RlPnJlc2V0KCk8L2NvZGU+IGlzIHVzZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gc2tpcHMKLSAgICAgKiA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB0YXJnZXQgc3RyZWFtIGFuZCBpbmNyZW1lbnRzCi0gICAgICogdGhlIGxpbmVOdW1iZXIgY291bnQgYXMgYnl0ZXMgYXJlIHNraXBwZWQuCisgICAgICogU2tpcHMge0Bjb2RlIGNvdW50fSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBzdHJlYW0uIFN1YnNlcXVlbnQKKyAgICAgKiB7QGNvZGUgcmVhZCgpfSdzIHdpbGwgbm90IHJldHVybiB0aGVzZSBieXRlcyB1bmxlc3Mge0Bjb2RlIHJlc2V0KCl9IGlzCisgICAgICogdXNlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBza2lwcyB7QGNvZGUgY291bnR9IG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgICAgKiBmaWx0ZXJlZCBzdHJlYW0gYW5kIGluY3JlbWVudHMgdGhlIGxpbmUgbnVtYmVyIGNvdW50IHdoZW5ldmVyIGxpbmUKKyAgICAgKiB0ZXJtaW5hdG9yIHNlcXVlbmNlcyBhcmUgc2tpcHBlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY291bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICNtYXJrKGludCkKKyAgICAgKiBAc2VlICNyZWFkKCkKKyAgICAgKiBAc2VlICNyZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vTGluZU51bWJlclJlYWRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vTGluZU51bWJlclJlYWRlci5qYXZhCmluZGV4IDNjYjhlODkuLjgxMTA0MjYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0xpbmVOdW1iZXJSZWFkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9MaW5lTnVtYmVyUmVhZGVyLmphdmEKQEAgLTE4LDExICsxOCwxMiBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIExpbmVOdW1iZXJSZWFkZXIgaXMgYSBidWZmZXJlZCBjaGFyYWN0ZXIgaW5wdXQgcmVhZGVyIHdoaWNoIGNvdW50cyBsaW5lCi0gKiBudW1iZXJzIGFzIGRhdGEgaXMgYmVpbmcgcmVhZC4gVGhlIGxpbmUgbnVtYmVyIHN0YXJ0cyBhdCAwIGFuZCBpcyBpbmNyZW1lbnRlZAotICogYW55IHRpbWUgJ1xyJywgJ1xuJywgb3IgJ1xyXG4nIGlzIHJlYWQuCisgKiBXcmFwcyBhbiBleGlzdGluZyB7QGxpbmsgUmVhZGVyfSBhbmQgY291bnRzIHRoZSBsaW5lIHRlcm1pbmF0b3JzIGVuY291bnRlcmVkCisgKiB3aGlsZSByZWFkaW5nIHRoZSBkYXRhLiBUaGUgbGluZSBudW1iZXIgc3RhcnRzIGF0IDAgYW5kIGlzIGluY3JlbWVudGVkIGFueQorICogdGltZSB7QGNvZGUgJ1xyJ30sIHtAY29kZSAnXG4nfSBvciB7QGNvZGUgIlxyXG4ifSBpcyByZWFkLiBUaGUgY2xhc3MgaGFzIGFuCisgKiBpbnRlcm5hbCBidWZmZXIgZm9yIGl0cyBkYXRhLiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGRlZmF1bHRzIHRvIDggS0IuCiAgKiAKLSAqIEBzZWUgQnVmZmVyZWRXcml0ZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTGluZU51bWJlclJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyIHsKIApAQCAtMzUsMzYgKzM2LDM4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1hcmtlZExhc3RXYXNDUjsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyZWQgTGluZU51bWJlclJlYWRlciBvbiB0aGUgUmVhZGVyIDxjb2RlPmluPC9jb2RlPi4KLSAgICAgKiBUaGUgZGVmYXVsdCBidWZmZXIgc2l6ZSAoOEspIGlzIGFsbG9jYXRlZCBhbmQgYWxsIHJlYWRzIGNhbiBub3cgYmUKLSAgICAgKiBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgTGluZU51bWJlclJlYWRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExpbmVOdW1iZXJSZWFkZXIgb24gdGhlIFJlYWRlciB7QGNvZGUgaW59LiBUaGUgaW50ZXJuYWwKKyAgICAgKiBidWZmZXIgZ2V0cyB0aGUgZGVmYXVsdCBzaXplICg4IEtCKS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBSZWFkZXIgdG8gYnVmZmVyIHJlYWRzIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIFJlYWRlciB0aGF0IGlzIGJ1ZmZlcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5lTnVtYmVyUmVhZGVyKFJlYWRlciBpbikgewogICAgICAgICBzdXBlcihpbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXJlZCBMaW5lTnVtYmVyUmVhZGVyIG9uIHRoZSBSZWFkZXIgPGNvZGU+aW48L2NvZGU+LgotICAgICAqIFRoZSBidWZmZXIgc2l6ZSBpcyBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciA8Y29kZT5zaXplPC9jb2RlPiBhbmQgYWxsCi0gICAgICogcmVhZHMgY2FuIG5vdyBiZSBmaWx0ZXJlZCB0aHJvdWdoIHRoaXMgTGluZU51bWJlclJlYWRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExpbmVOdW1iZXJSZWFkZXIgb24gdGhlIFJlYWRlciB7QGNvZGUgaW59LiBUaGUgc2l6ZSBvZgorICAgICAqIHRoZSBpbnRlcm5hbCBidWZmZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIge0Bjb2RlIHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIFJlYWRlciB0byBidWZmZXIgcmVhZHMgb24uCisgICAgICogICAgICAgICAgICB0aGUgUmVhZGVyIHRoYXQgaXMgYnVmZmVyZWQuCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIGJ1ZmZlciB0byBhbGxvY2F0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gYWxsb2NhdGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc2l6ZSA8PSAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGluZU51bWJlclJlYWRlcihSZWFkZXIgaW4sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKGluLCBzaXplKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBmb3IgdGhpcwotICAgICAqIExpbmVOdW1iZXJSZWFkZXIuCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBmb3IgdGhpcyByZWFkZXIuIE51bWJlcmluZyBzdGFydHMgYXQgMC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CkBAIC03MywyMCArNzYsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBNYXJrIHBvc2l0aW9uIGluIHRoaXMgTGluZU51bWJlclJlYWRlci4gVGhlIHBhcmFtZXRlcgotICAgICAqIDxjb2RlPnJlYWRMaW1pdDwvY29kZT4gaW5kaWNhdGVzIGhvdyBtYW55IGNoYXJhY3RlcnMgY2FuIGJlIHJlYWQgYmVmb3JlCi0gICAgICogYSBtYXJrIGlzIGludmFsaWRhdGVkLiBTZW5kaW5nIHJlc2V0KCkgd2lsbCByZXBvc2l0aW9uIHRoZSByZWFkZXIgYmFjayB0bwotICAgICAqIHRoZSBtYXJrZWQgcG9zaXRpb24gcHJvdmlkZWQgPGNvZGU+cmVhZExpbWl0PC9jb2RlPiBoYXMgbm90IGJlZW4KLSAgICAgKiBzdXJwYXNzZWQuIFRoZSBsaW5lTnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcmtlZCBwb3NpdGlvbiB3aWxsIGFsc28KLSAgICAgKiBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgd2hlbiByZXNldCgpIGlzIHNlbnQgcHJvdmlkZWQKLSAgICAgKiA8Y29kZT5yZWFkTGltaXQ8L2NvZGU+IGhhcyBub3QgYmVlbiBzdXJwYXNzZWQuCisgICAgICogU2V0cyBhIG1hcmsgcG9zaXRpb24gaW4gdGhpcyByZWFkZXIuIFRoZSBwYXJhbWV0ZXIge0Bjb2RlIHJlYWRsaW1pdH0KKyAgICAgKiBpbmRpY2F0ZXMgaG93IG1hbnkgY2hhcmFjdGVycyBjYW4gYmUgcmVhZCBiZWZvcmUgdGhlIG1hcmsgaXMgaW52YWxpZGF0ZWQuCisgICAgICogU2VuZGluZyB7QGNvZGUgcmVzZXQoKX0gd2lsbCByZXBvc2l0aW9uIHRoaXMgcmVhZGVyIGJhY2sgdG8gdGhlIG1hcmtlZAorICAgICAqIHBvc2l0aW9uLCBwcm92aWRlZCB0aGF0IHtAY29kZSByZWFkbGltaXR9IGhhcyBub3QgYmVlbiBzdXJwYXNzZWQuIFRoZQorICAgICAqIGxpbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcmtlZCBwb3NpdGlvbiBpcyBhbHNvIHN0b3JlZCBzbyB0aGF0CisgICAgICogaXQgY2FuIGJlIHJlc3RvcmVkIHdoZW4ge0Bjb2RlIHJlc2V0KCl9IGlzIGNhbGxlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0Ci0gICAgICogICAgICAgICAgICBhbiBpbnQgcmVwcmVzZW50aW5nIGhvdyBtYW55IGNoYXJhY3RlcnMgbXVzdCBiZSByZWFkIGJlZm9yZQotICAgICAqICAgICAgICAgICAgaW52YWxpZGF0aW5nIHRoZSBtYXJrLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIHN0cmVhbQorICAgICAqICAgICAgICAgICAgYmVmb3JlIHRoZSBtYXJrIGlzIGludmFsaWRhdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyBtYXJrIHRoaXMgTGluZU51bWJlclJlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgbWFyayBpbiB0aGlzIHJlYWRlci4KKyAgICAgKiBAc2VlICNtYXJrU3VwcG9ydGVkKCkKKyAgICAgKiBAc2VlICNyZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtOTgsMTggKzEwMiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGNoYXIgZnJvbSB0aGlzIExpbmVOdW1iZXJSZWFkZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcwotICAgICAqIGFuIGludC4gVGhlIGxvdy1vcmRlciAyIGJ5dGVzIGFyZSByZXR1cm5lZCBvciAtMSBvZiB0aGUgZW5kIG9mIHJlYWRlciB3YXMKLSAgICAgKiBlbmNvdW50ZXJlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgY2hhciBmcm9tIHRoZSB0YXJnZXQgcmVhZGVyLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBzb3VyY2UgcmVhZGVyIGFuZCByZXR1cm5zIGl0IGFzIGFuCisgICAgICogaW50ZWdlciB3aXRoIHRoZSB0d28gaGlnaGVyLW9yZGVyIGJ5dGVzIHNldCB0byAwLiBSZXR1cm5zIC0xIGlmIHRoZSBlbmQKKyAgICAgKiBvZiB0aGUgc291cmNlIHJlYWRlciBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqIDxwPgogICAgICAqIFRoZSBsaW5lIG51bWJlciBjb3VudCBpcyBpbmNyZW1lbnRlZCBpZiBhIGxpbmUgdGVybWluYXRvciBpcyBlbmNvdW50ZXJlZC4KLSAgICAgKiBBIGxpbmUgZGVsaW1pdGVyIHNlcXVlbmNlIGlzIGRldGVybWluZWQgYnkgJ1xyJywgJ1xuJywgb3IgJ1xyXG4nLiBJbiB0aGlzCi0gICAgICogbWV0aG9kLCB0aGUgc2VxdWVuY2UgaXMgYWx3YXlzIHRyYW5zbGF0ZWQgaW50byAnXG4nLgorICAgICAqIFJlY29nbml6ZWQgbGluZSB0ZXJtaW5hdG9yIHNlcXVlbmNlcyBhcmUge0Bjb2RlICdccid9LCB7QGNvZGUgJ1xuJ30gYW5kCisgICAgICoge0Bjb2RlICJcclxuIn0uIExpbmUgdGVybWluYXRvciBzZXF1ZW5jZXMgYXJlIGFsd2F5cyB0cmFuc2xhdGVkIGludG8KKyAgICAgKiB7QGNvZGUgJ1xuJ30uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IFRoZSBjaGFyIHJlYWQgb3IgLTEgaWYgZW5kIG9mIHJlYWRlci4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgcmVhZGVyIGhhcyBiZWVuCisgICAgICogICAgICAgICByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlYWRlciBpcyBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEzMiwyOCArMTM5LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gY2hhcnMgZnJvbSB0aGlzIExpbmVOdW1iZXJSZWFkZXIgYW5kCi0gICAgICogc3RvcmVzIHRoZW0gaW4gY2hhciBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IG9mZnNldAotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGNoYXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBjaGFycyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiByZWFkZXIgd2FzIGVuY291bnRlcmVkLiBUaGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogcmVhZHMgY2hhcnMgZnJvbSB0aGUgdGFyZ2V0IHN0cmVhbS4gVGhlIGxpbmUgbnVtYmVyIGNvdW50IGlzIGluY3JlbWVudGVkCi0gICAgICogaWYgYSBsaW5lIHRlcm1pbmF0b3IgaXMgZW5jb3VudGVyZWQuIEEgbGluZSBkZWxpbWl0ZXIgc2VxdWVuY2UgaXMKLSAgICAgKiBkZXRlcm1pbmVkIGJ5ICdccicsICdcbicsIG9yICdcclxuJy4gSW4gdGhpcyBtZXRob2QsIHRoZSBzZXF1ZW5jZSBpcwotICAgICAqIGFsd2F5cyB0cmFuc2xhdGVkIGludG8gJ1xuJy4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBjb3VudH0gY2hhcmFjdGVycyBmcm9tIHRoZSBzb3VyY2UgcmVhZGVyIGFuZCBzdG9yZXMKKyAgICAgKiB0aGVtIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQge0Bjb2RlIG9mZnNldH0uCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBubyBjaGFyYWN0ZXJzCisgICAgICogaGF2ZSBiZWVuIHJlYWQgYW5kIHRoZSBlbmQgb2YgdGhpcyByZWFkZXIgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGluZSBudW1iZXIgY291bnQgaXMgaW5jcmVtZW50ZWQgaWYgYSBsaW5lIHRlcm1pbmF0b3IgaXMgZW5jb3VudGVyZWQuCisgICAgICogUmVjb2duaXplZCBsaW5lIHRlcm1pbmF0b3Igc2VxdWVuY2VzIGFyZSB7QGNvZGUgJ1xyJ30sIHtAY29kZSAnXG4nfSBhbmQKKyAgICAgKiB7QGNvZGUgIlxyXG4ifS4gTGluZSB0ZXJtaW5hdG9yIHNlcXVlbmNlcyBhcmUgYWx3YXlzIHRyYW5zbGF0ZWQgaW50bworICAgICAqIHtAY29kZSAnXG4nfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgY2hhcnMuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGNoYXJhY3RlcnMgcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8gc3RvcmUgdGhlIHJlYWQgY2hhcnMuCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmZmVyfSB0byBzdG9yZSB0aGUgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgcmVhZCBmcm9tIHRoaXMgcmVhZGVyLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJzIHRvIHN0b3JlIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHJlYWRlci4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHN0b3JlIGluIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgIHNvdXJjZSByZWFkZXIgaGFzIGJlZW4gcmVhY2hlZCB3aGlsZSByZWFkaW5nLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CkBAIC0xODAsMTggKzE4OSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgbmV4dCBsaW5lIG9mIHRleHQKLSAgICAgKiBhdmFpbGFibGUgaW4gdGhpcyBMaW5lTnVtYmVyUmVhZGVyLiBBIGxpbmUgaXMgcmVwcmVzZW50ZWQgYnkgMCBvciBtb3JlCi0gICAgICogY2hhcmFjdGVycyBmb2xsb3dlZCBieSA8Y29kZT4nXG4nPC9jb2RlPiwgPGNvZGU+J1xyJzwvY29kZT4sCi0gICAgICogPGNvZGU+IlxuXHIiPC9jb2RlPiBvciBlbmQgb2Ygc3RyZWFtLiBUaGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBkb2VzCi0gICAgICogbm90IGluY2x1ZGUgdGhlIG5ld2xpbmUgc2VxdWVuY2UuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBsaW5lIG9mIHRleHQgYXZhaWxhYmxlIGZyb20gdGhpcyByZWFkZXIuIEEgbGluZSBpcworICAgICAqIHJlcHJlc2VudGVkIGJ5IDAgb3IgbW9yZSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IHtAY29kZSAnXHInfSwKKyAgICAgKiB7QGNvZGUgJ1xuJ30sIHtAY29kZSAiXHJcbiJ9IG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhlIHJldHVybmVkCisgICAgICogc3RyaW5nIGRvZXMgbm90IGluY2x1ZGUgdGhlIG5ld2xpbmUgc2VxdWVuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIG9yIG51bGwgaWYgbm8gY2hhcmFjdGVycyB3ZXJlCi0gICAgICogICAgICAgICByZWFkIGJlZm9yZSBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIG9yIHtAY29kZSBudWxsfSBpZiBubyBjaGFyYWN0ZXJzIGhhdmUKKyAgICAgKiAgICAgICAgIGJlZW4gcmVhZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBMaW5lTnVtYmVyUmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSU8KLSAgICAgKiAgICAgICAgICAgICBlcnJvciBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjEyLDE1ICsyMTksMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCB0aGlzIExpbmVOdW1iZXJSZWFkZXIgdG8gdGhlIGxhc3QgbWFya2VkIGxvY2F0aW9uLiBJZiB0aGUKLSAgICAgKiA8Y29kZT5yZWFkbGltaXQ8L2NvZGU+IGhhcyBiZWVuIHBhc3NlZCBvciBubyA8Y29kZT5tYXJrPC9jb2RlPiBoYXMKLSAgICAgKiBiZWVuIHNldCwgdGhyb3cgSU9FeGNlcHRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gcmVzZXRzIHRoZSB0YXJnZXQKLSAgICAgKiByZWFkZXIuIEl0IGFsc28gcmVzZXRzIHRoZSBsaW5lIGNvdW50IHRvIHdoYXQgaXMgd2FzIHdoZW4gdGhpcyByZWFkZXIgd2FzCi0gICAgICogbWFya2VkLgorICAgICAqIFJlc2V0cyB0aGlzIHJlYWRlciB0byB0aGUgbGFzdCBtYXJrZWQgbG9jYXRpb24uIEl0IGFsc28gcmVzZXRzIHRoZSBsaW5lCisgICAgICogY291bnQgdG8gd2hhdCBpcyB3YXMgd2hlbiB0aGlzIHJlYWRlciB3YXMgbWFya2VkLiBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICogcmVzZXRzIHRoZSBzb3VyY2UgcmVhZGVyLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQsIG5vIG1hcmsgaGFzIGJlZW4gc2V0IG9yIHRoZQorICAgICAqICAgICAgICAgICAgIG1hcmsgaXMgbm8gbG9uZ2VyIHZhbGlkIGJlY2F1c2UgbW9yZSB0aGFuIHtAY29kZSByZWFkbGltaXR9CisgICAgICogICAgICAgICAgICAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgc2luY2Ugc2V0dGluZyB0aGUgbWFyay4KKyAgICAgKiBAc2VlICNtYXJrKGludCkKKyAgICAgKiBAc2VlICNtYXJrU3VwcG9ydGVkKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yMzIsMTIgKzI0MSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxpbmVOdW1iZXIgb2YgdGhpcyBMaW5lTnVtYmVyUmVhZGVyIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiA8Y29kZT5saW5lTnVtYmVyPC9jb2RlPi4gTm90ZSB0aGF0IHRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzIG9uIHRoZQotICAgICAqIGxpbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFzdCBtYXJrZWQgcG9zaXRpb24uCisgICAgICogU2V0cyB0aGUgbGluZSBudW1iZXIgb2YgdGhpcyByZWFkZXIgdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgbGluZU51bWJlcn0uCisgICAgICogTm90ZSB0aGF0IHRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzIG9uIHRoZSBsaW5lIG51bWJlciBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgbGFzdCBtYXJrZWQgcG9zaXRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpbmVOdW1iZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbGluZU51bWJlciB2YWx1ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbGluZSBudW1iZXIgdmFsdWUuCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CkBAIC0yNDYsMTkgKzI1OCwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgY2hhcnMgaW4gdGhpcyBMaW5lTnVtYmVyUmVhZGVyLgotICAgICAqIFN1YnNlcXVlbnQgPGNvZGU+cmVhZCgpPC9jb2RlPidzIHdpbGwgbm90IHJldHVybiB0aGVzZSBjaGFycyB1bmxlc3MKLSAgICAgKiA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLiBUaGlzIGltcGxlbWVudGF0aW9uIHNraXBzCi0gICAgICogPGNvZGU+Y291bnQ8L2NvZGU+IG51bWJlciBvZiBjaGFycyBpbiB0aGUgdGFyZ2V0IHN0cmVhbSBhbmQgaW5jcmVtZW50cwotICAgICAqIHRoZSBsaW5lTnVtYmVyIGNvdW50IGFzIGNoYXJzIGFyZSBza2lwcGVkLgorICAgICAqIFNraXBzIHtAY29kZSBjb3VudH0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyByZWFkZXIuIFN1YnNlcXVlbnQKKyAgICAgKiB7QGNvZGUgcmVhZCgpfSdzIHdpbGwgbm90IHJldHVybiB0aGVzZSBjaGFyYWN0ZXJzIHVubGVzcyB7QGNvZGUgcmVzZXQoKX0KKyAgICAgKiBpcyB1c2VkLiBUaGlzIGltcGxlbWVudGF0aW9uIHNraXBzIHtAY29kZSBjb3VudH0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4KKyAgICAgKiB0aGUgc291cmNlIHJlYWRlciBhbmQgaW5jcmVtZW50cyB0aGUgbGluZSBudW1iZXIgY291bnQgd2hlbmV2ZXIgbGluZQorICAgICAqIHRlcm1pbmF0b3Igc2VxdWVuY2VzIGFyZSBza2lwcGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFycyB0byBza2lwLgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFycyBhY3R1YWxseSBza2lwcGVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb3VudCA8IDB9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI3JlYWQoKQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9Ob3RBY3RpdmVFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL05vdEFjdGl2ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGRiZmJlNTMuLjQwMmVhYmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL05vdEFjdGl2ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL05vdEFjdGl2ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwzNyArMTgsNDEgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBTb21lIG1ldGhvZHMgaW4gT2JqZWN0SW5wdXRTdHJlYW0gYW5kIE9iamVjdE91dHB1dFN0cmVhbSBjYW4gb25seSBiZSBjYWxsZWQKLSAqIGZyb20gYSBuZXN0ZWQgY2FsbCB0byByZWFkT2JqZWN0KCkgb3Igd3JpdGVPYmplY3QoKS4gQW55IGF0dGVtcHQgdG8gY2FsbCB0aGVtCi0gKiBmcm9tIGFub3RoZXIgY29udGV4dCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIHRvIGJlIHRocm93bi4gVGhlIGxpc3Qgb2YKLSAqIG1ldGhvZHMgdGhhdCBhcmUgcHJvdGVjdGVkIHRoaXMgd2F5IGlzOgorICogU2lnbmFscyB0aGF0IGEgc2VyaWFsaXphdGlvbi1yZWxhdGVkIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkIGluIHRoZSB3cm9uZworICogcGxhY2UuIFNvbWUgbWV0aG9kcyBpbiB7QGNvZGUgT2JqZWN0SW5wdXRTdHJlYW19IGFuZCB7QGNvZGUKKyAqIE9iamVjdE91dHB1dFN0cmVhbX0gY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gYSBuZXN0ZWQgY2FsbCB0byByZWFkT2JqZWN0KCkgb3IKKyAqIHdyaXRlT2JqZWN0KCkuIEFueSBhdHRlbXB0IHRvIGNhbGwgdGhlbSBmcm9tIGFub3RoZXIgY29udGV4dCB3aWxsIGNhdXNlIGEKKyAqIHtAY29kZSBOb3RBY3RpdmVFeGNlcHRpb259IHRvIGJlIHRocm93bi4gVGhlIGxpc3Qgb2YgbWV0aG9kcyB0aGF0IGFyZQorICogcHJvdGVjdGVkIHRoaXMgd2F5IGlzOgogICogPHVsPgotICogPGxpPk9iamVjdElucHV0U3RyZWFtLmRlZmF1bHRSZWFkT2JqZWN0KCk8L2xpPgotICogPGxpPk9iamVjdElucHV0U3RyZWFtLnJlZ2lzdGVyVmFsaWRhdGlvbigpPC9saT4KLSAqIDxsaT5PYmplY3RPdXRwdXRTdHJlYW0uZGVmYXVsdFdyaXRlT2JqZWN0KCk8L2xpPgorICogPGxpPntAbGluayBPYmplY3RJbnB1dFN0cmVhbSNkZWZhdWx0UmVhZE9iamVjdCgpfTwvbGk+CisgKiA8bGk+e0BsaW5rIE9iamVjdElucHV0U3RyZWFtI3JlZ2lzdGVyVmFsaWRhdGlvbihPYmplY3RJbnB1dFZhbGlkYXRpb24sIGludCl9PC9saT4KKyAqIDxsaT57QGxpbmsgT2JqZWN0T3V0cHV0U3RyZWFtI2RlZmF1bHRXcml0ZU9iamVjdCgpfTwvbGk+CiAgKiA8L3VsPgogICogCi0gKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI2RlZmF1bHRSZWFkT2JqZWN0KCkKLSAqIEBzZWUgT2JqZWN0SW5wdXRTdHJlYW0jcmVnaXN0ZXJWYWxpZGF0aW9uKE9iamVjdElucHV0VmFsaWRhdGlvbiwgaW50KQotICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0jZGVmYXVsdFdyaXRlT2JqZWN0KCkKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTm90QWN0aXZlRXhjZXB0aW9uIGV4dGVuZHMgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zODkzNDY3MjczMDQ5ODA4ODk1TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTm90QWN0aXZlRXhjZXB0aW9ufSB3aXRoIGl0cyBzdGFjayB0cmFjZSBmaWxsZWQKKyAgICAgKiBpbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm90QWN0aXZlRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBOb3RBY3RpdmVFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlIGFuZAorICAgICAqIGRldGFpbCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm90QWN0aXZlRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9Ob3RTZXJpYWxpemFibGVFeGNlcHRpb24uamF2YQppbmRleCBlY2JjMjUyLi5hYzU3YTc2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9Ob3RTZXJpYWxpemFibGVFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9Ob3RTZXJpYWxpemFibGVFeGNlcHRpb24uamF2YQpAQCAtMTgsMzQgKzE4LDM4IEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogV2hlbiBhbiBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3RPdXRwdXQud3JpdGVPYmplY3QoKSBpcyBwYXNzZWQgYW4gb2JqZWN0IHRoYXQKLSAqIGlzIG5vdCBzZXJpYWxpemFibGUsIGl0IHdpbGwgdGhyb3cgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gVGhpcyBjYW4gaGFwcGVuIGlmCi0gKiB0aGUgb2JqZWN0IGRvZXMgbm90IGltcGxlbWVudCBTZXJpYWxpemFibGUgb3IgRXh0ZXJuYWxpemFibGUsIG9yIGlmIGl0IGlzCi0gKiBTZXJpYWxpemFibGUgYnV0IGl0IG92ZXJyaWRlcyB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0pIGFuZCBleHBsaWNpdGVseQotICogZGVjaWRlcyBpdCB3YW50cyB0byBwcmV2ZW50IHNlcmlhbGl6YXRpb24sIGJ5IHRocm93aW5nIHRoaXMgdHlwZSBvZgotICogZXhjZXB0aW9uLgorICogU2lnbmFscyB0aGF0IGFuIG9iamVjdCB0aGF0IGlzIG5vdCBzZXJpYWxpemFibGUgaGFzIGJlZW4gcGFzc2VkIGludG8gdGhlCisgKiB7QGNvZGUgT2JqZWN0T3V0cHV0LndyaXRlT2JqZWN0KCl9IG10aG9kLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIG9iamVjdCBkb2VzCisgKiBub3QgaW1wbGVtZW50IHtAY29kZSBTZXJpYWxpemFibGV9IG9yIHtAY29kZSBFeHRlcm5hbGl6YWJsZX0sIG9yIGlmIGl0IGlzCisgKiBzZXJpYWxpemFibGUgYnV0IGl0IG92ZXJyaWRlcyB7QGNvZGUgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtKX0gYW5kCisgKiBleHBsaWNpdGx5IHByZXZlbnRzIHNlcmlhbGl6YXRpb24gYnkgdGhyb3dpbmcgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4KICAqIAotICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVPYmplY3QoT2JqZWN0KQogICogQHNlZSBPYmplY3RPdXRwdXQjd3JpdGVPYmplY3QoT2JqZWN0KQorICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVPYmplY3QoT2JqZWN0KQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBleHRlbmRzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyOTA2NjQyNTU0NzkzODkxMzgxTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9ufSB3aXRoIGl0cyBzdGFjayB0cmFjZQorICAgICAqIGZpbGxlZCBpbi4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBOb3RTZXJpYWxpemFibGVFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlCisgICAgICogYW5kIGRldGFpbCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0SW5wdXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdElucHV0LmphdmEKaW5kZXggN2Y0N2MzMS4uN2NhM2NiZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0SW5wdXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RJbnB1dC5qYXZhCkBAIC0xOCwxMDQgKzE4LDEwNiBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFN0cmVhbXMgdG8gYmUgdXNlZCB3aXRoIHNlcmlhbGl6YXRpb24gdG8gcmVhZCBvYmplY3RzIG11c3QgaW1wbGVtZW50IHRoaXMKLSAqIGludGVyZmFjZS4gT2JqZWN0SW5wdXRTdHJlYW0gaXMgb25lIGV4YW1wbGUuCisgKiBEZWZpbmVzIGFuIGludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IGFsbG93IHJlYWRpbmcgc2VyaWFsaXplZCBvYmplY3RzLgogICogCiAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtCiAgKiBAc2VlIE9iamVjdE91dHB1dAorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBPYmplY3RJbnB1dCBleHRlbmRzIERhdGFJbnB1dCB7CiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGludCByZXByZXNlbnRpbmcgdGhlbiBudW1iZXIgb2YgYnl0ZXMgb2YgcHJpbWl0aXZlIGRhdGEgdGhhdAotICAgICAqIGFyZSBhdmFpbGFibGUuCisgICAgICogSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcHJpbWl0aXZlIGRhdGEgdGhhdCBjYW4gYmUgcmVhZCB3aXRob3V0CisgICAgICogYmxvY2tpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBwcmltaXRpdmUgYnl0ZXMgYXZhaWxhYmxlLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBpbiB0aGlzIE9iamVjdElucHV0LgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIE9iamVjdElucHV0LiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcyBzaG91bGQKLSAgICAgKiBmcmVlIGFueSByZXNvdXJjZXMgZHVyaW5nIGNsb3NlLgorICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBmcmVlIGFueQorICAgICAqIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgT2JqZWN0SW5wdXQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhpcyBPYmplY3RJbnB1dCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuCi0gICAgICogaW50LiBUaGUgbG93LW9yZGVyIGJ5dGUgaXMgcmV0dXJuZWQgb3IgLTEgb2YgdGhlIGVuZCBvZiBzdHJlYW0gd2FzCi0gICAgICogZW5jb3VudGVyZWQuCisgICAgICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoaXMgc3RyZWFtIGFuZCByZXR1cm5zIGl0IGFzIGFuIGludGVnZXIgaW4gdGhlCisgICAgICogcmFuZ2UgZnJvbSAwIHRvIDI1NS4gUmV0dXJucyAtMSBpZiB0aGUgZW5kIG9mIHRoaXMgc3RyZWFtIGhhcyBiZWVuCisgICAgICogcmVhY2hlZC4gQmxvY2tzIGlmIG5vIGlucHV0IGlzIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCBUaGUgYnl0ZSByZWFkIG9yIC0xIGlmIGVuZCBvZiBPYmplY3RJbnB1dC4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgT2JqZWN0SW5wdXQgaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIDxjb2RlPk9iamVjdElucHV0PC9jb2RlPiBhbmQgc3RvcmVzIHRoZW0gaW4gYnl0ZQotICAgICAqIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4uIEJsb2NrcyB3aGlsZSB3YWl0aW5nIGZvciBpbnB1dC4KKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoaXMgc3RyZWFtIGludG8gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0uIEJsb2NrcworICAgICAqIHdoaWxlIHdhaXRpbmcgZm9yIGlucHV0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KLSAgICAgKiBAcmV0dXJuIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZCBvciA8Y29kZT4tMTwvY29kZT4gaWYgZW5jb3VudGVyZWQgZW5kCi0gICAgICogICAgICAgICBvZiA8Y29kZT5PYmplY3RJbnB1dDwvY29kZT4uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBoYXMgYmVlbgorICAgICAqICAgICAgICAgcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIDxjb2RlPk9iamVjdElucHV0PC9jb2RlPiBpcyBhbHJlYWR5IGNsb3NlZCBvcgotICAgICAqICAgICAgICAgICAgIGFub3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGJ5dGVzIGZyb20gdGhlIE9iamVjdElucHV0IGFuZCBzdG9yZXMKLSAgICAgKiB0aGVtIGluIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCBvZmZzZXQKLSAgICAgKiA8Y29kZT5jb3VudDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiBPYmplY3RJbnB1dCB3YXMgZW5jb3VudGVyZWQuCisgICAgICogUmVhZHMgYXQgbW9zdCB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhpcyBzdHJlYW0gYW5kIHN0b3JlcyB0aGVtIGluCisgICAgICogYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdCBvZmZzZXQge0Bjb2RlIGNvdW50fS4gQmxvY2tzIHdoaWxlCisgICAgICogd2FpdGluZyBmb3IgaW5wdXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQKKyAgICAgKiAgICAgICAgICAgIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2YgT2JqZWN0SW5wdXQuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSBoYXMgYmVlbgorICAgICAqICAgICAgICAgcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIE9iamVjdElucHV0IGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGlzIE9iamVjdElucHV0LgorICAgICAqIFJlYWRzIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgb2JqZWN0IHJlYWQgZnJvbSB0aGlzIE9iamVjdElucHV0CisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJlYWQuCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSB0aGlzIE9iamVjdElucHV0LgogICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBvYmplY3QncyBjbGFzcyBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0J3MgY2xhc3MgY2Fubm90IGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgcmVhZE9iamVjdCgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPnRvU2tpcDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgT2JqZWN0SW5wdXQuCi0gICAgICogU3Vic2VxdWVudCA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGJ5dGVzLgorICAgICAqIFNraXBzIHtAY29kZSB0b1NraXB9IGJ5dGVzIG9uIHRoaXMgc3RyZWFtLiBMZXNzIHRoYW4ge0Bjb2RlIHRvU2tpcH0gYnl0ZSBhcmUKKyAgICAgKiBza2lwcGVkIGlmIHRoZSBlbmQgb2YgdGhpcyBzdHJlYW0gaXMgcmVhY2hlZCBiZWZvcmUgdGhlIG9wZXJhdGlvbgorICAgICAqIGNvbXBsZXRlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdG9Ta2lwCiAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNraXBwZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBPYmplY3RJbnB1dCBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyB0b1NraXApIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdElucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDZjZmI2MDYuLjBjYWY5ZGUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdElucHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW0uamF2YQpAQCAtMzksMTUgKzM5LDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Qcml2aUFjdGlvbjsKIAogLyoqCi0gKiBBbiBPYmplY3RJbnB1dFN0cmVhbSBjYW4gYmUgdXNlZCB0byBsb2FkIEphdmEgb2JqZWN0cyBmcm9tIGEgc3RyZWFtIHdoZXJlIHRoZQotICogb2JqZWN0cyB3ZXJlIHNhdmVkIHVzaW5nIGFuIE9iamVjdE91dHB1dFN0cmVhbS4gUHJpbWl0aXZlIGRhdGEgKGludHMsIGJ5dGVzLAotICogY2hhcnMsIGV0YykgY2FuIGFsc28gYmUgbG9hZGVkIGlmIHRoZSBkYXRhIHdhcyBzYXZlZCBhcyBwcmltaXRpdmUgdHlwZXMgYXMKLSAqIHdlbGwuIEl0IGlzIGludmFsaWQgdG8gYXR0ZW1wdCB0byByZWFkIGFuIG9iamVjdCBhcyBwcmltaXRpdmUgZGF0YS4KKyAqIEEgc3BlY2lhbGl6ZWQge0BsaW5rIElucHV0U3RyZWFtfSB0aGF0IGlzIGFibGUgdG8gcmVhZCAoZGVzZXJpYWxpemUpIEphdmEKKyAqIG9iamVjdHMgYXMgd2VsbCBhcyBwcmltaXRpdmUgZGF0YSB0eXBlcyAoaW50LCBieXRlLCBjaGFyIGV0Yy4pLiBUaGUgZGF0YSBoYXMKKyAqIHR5cGljYWxseSBiZWVuIHNhdmVkIHVzaW5nIGFuIE9iamVjdE91dHB1dFN0cmVhbS4KICAqIAogICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0KICAqIEBzZWUgT2JqZWN0SW5wdXQKICAqIEBzZWUgU2VyaWFsaXphYmxlCiAgKiBAc2VlIEV4dGVybmFsaXphYmxlCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgT2JqZWN0SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIE9iamVjdElucHV0LAogICAgICAgICBPYmplY3RTdHJlYW1Db25zdGFudHMgewpAQCAtMTMyLDEzNSArMTMzLDI0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIElubmVyIGNsYXNzIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHNlcmlhbGl6YWJsZSBmaWVsZHMKKyAgICAgKiBHZXRGaWVsZCBpcyBhbiBpbm5lciBjbGFzcyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgKiByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBHZXRGaWVsZCB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIE9iamVjdFN0cmVhbUNsYXNzCisgICAgICAgICAqIEdldHMgdGhlIE9iamVjdFN0cmVhbUNsYXNzIHRoYXQgZGVzY3JpYmVzIGEgZmllbGQuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGNsYXNzIGZvciBhIHNlcmlhbGl6ZWQgZmllbGQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IE9iamVjdFN0cmVhbUNsYXNzIGdldE9iamVjdFN0cmVhbUNsYXNzKCk7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlZmF1bHQgdmFsdWUgaXMgc2V0LAotICAgICAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfSBpcyBkZWZhdWx0ZWQuIFRoaXMKKyAgICAgICAgICogbWVhbnMgdGhhdCBpdCBoYXMgbm8gdmFsdWUgaW4gdGhpcyBzdHJlYW0uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZmllbGQgaXMgZGVmYXVsdGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gZG9lcyBub3QgaWRlbnRpZnkgYSBzZXJpYWxpemFibGUgZmllbGQuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGlucHV0CisgICAgICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkZWZhdWx0ZWQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLSAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGJvb2xlYW4gZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0gZnJvbQorICAgICAgICAgKiB0aGUgcGVyc2lzdGVudCBmaWVsZC4KICAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGdldC4KKyAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgdXNlZCBpZiB0aGUgZmllbGQgZG9lcyBub3QgaGF2ZQorICAgICAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgd2hlbiByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfS4KICAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2UgaW5wdXQKKyAgICAgICAgICogICAgICAgICAgICAgc3RyZWFtLgogICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdHlwZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0gaXMKKyAgICAgICAgICogICAgICAgICAgICAgbm90IHtAY29kZSBib29sZWFufS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKQogICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAgICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0gZnJvbQorICAgICAgICAgKiB0aGUgcGVyc2lzdGVudCBmaWVsZC4KICAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGdldC4KKyAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgdXNlZCBpZiB0aGUgZmllbGQgZG9lcyBub3QgaGF2ZQorICAgICAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgd2hlbiByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfS4KICAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2UgaW5wdXQKKyAgICAgICAgICogICAgICAgICAgICAgc3RyZWFtLgogICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdHlwZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0gaXMKKyAgICAgICAgICogICAgICAgICAgICAgbm90IHtAY29kZSBjaGFyfS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgY2hhciBnZXQoU3RyaW5nIG5hbWUsIGNoYXIgZGVmYXVsdFZhbHVlKQogICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAgICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBieXRlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGZyb20gdGhlCisgICAgICAgICAqIHBlcnNpc3RlbnQgZmllbGQuCiAgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGlzIHVzZWQgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICogICAgICAgICAgICBhIHZhbHVlIHdoZW4gcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0uCiAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGlucHV0CisgICAgICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KICAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGlzCisgICAgICAgICAqICAgICAgICAgICAgIG5vdCB7QGNvZGUgYnl0ZX0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IGJ5dGUgZ2V0KFN0cmluZyBuYW1lLCBieXRlIGRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2hvcnQgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0gZnJvbSB0aGUKKyAgICAgICAgICogcGVyc2lzdGVudCBmaWVsZC4KICAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGdldC4KKyAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgdXNlZCBpZiB0aGUgZmllbGQgZG9lcyBub3QgaGF2ZQorICAgICAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgd2hlbiByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfS4KICAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2UgaW5wdXQKKyAgICAgICAgICogICAgICAgICAgICAgc3RyZWFtLgogICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdHlwZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0gaXMKKyAgICAgICAgICogICAgICAgICAgICAgbm90IHtAY29kZSBzaG9ydH0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IHNob3J0IGdldChTdHJpbmcgbmFtZSwgc2hvcnQgZGVmYXVsdFZhbHVlKQogICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAgICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbnRlZ2VyIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGZyb20KKyAgICAgICAgICogdGhlIHBlcnNpc3RlbnQgZmllbGQuCiAgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGlzIHVzZWQgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICogICAgICAgICAgICBhIHZhbHVlIHdoZW4gcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0uCiAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGlucHV0CisgICAgICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KICAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGlzCisgICAgICAgICAqICAgICAgICAgICAgIG5vdCB7QGNvZGUgaW50fS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldChTdHJpbmcgbmFtZSwgaW50IGRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbG9uZyBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfSBmcm9tIHRoZQorICAgICAgICAgKiBwZXJzaXN0ZW50IGZpZWxkLgogICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gZ2V0LgorICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgdGhhdCBpcyB1c2VkIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBoYXZlCisgICAgICAgICAqICAgICAgICAgICAgYSB2YWx1ZSB3aGVuIHJlYWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9LgogICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBpbnB1dAorICAgICAgICAgKiAgICAgICAgICAgICBzdHJlYW0uCiAgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfSBpcworICAgICAgICAgKiAgICAgICAgICAgICBub3Qge0Bjb2RlIGxvbmd9LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldChTdHJpbmcgbmFtZSwgbG9uZyBkZWZhdWx0VmFsdWUpCiAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLSAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsb2F0IGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGZyb20gdGhlCisgICAgICAgICAqIHBlcnNpc3RlbnQgZmllbGQuCiAgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGlzIHVzZWQgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICogICAgICAgICAgICBhIHZhbHVlIHdoZW4gcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0uCiAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGlucHV0CisgICAgICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KICAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIGZsb2F0fSBpcworICAgICAgICAgKiAgICAgICAgICAgICBub3Qge0Bjb2RlIGNoYXJ9LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXQoU3RyaW5nIG5hbWUsIGZsb2F0IGRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZG91YmxlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGZyb20KKyAgICAgICAgICogdGhlIHBlcnNpc3RlbnQgZmllbGQuCiAgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGlzIHVzZWQgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICogICAgICAgICAgICBhIHZhbHVlIHdoZW4gcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0uCiAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGlucHV0CisgICAgICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KICAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGlzCisgICAgICAgICAqICAgICAgICAgICAgIG5vdCB7QGNvZGUgZG91YmxlfS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldChTdHJpbmcgbmFtZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0IGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGZyb20KKyAgICAgICAgICogdGhlIHBlcnNpc3RlbnQgZmllbGQuCiAgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGlzIHVzZWQgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICogICAgICAgICAgICBhIHZhbHVlIHdoZW4gcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaWRlbnRpZmllZCBieSB7QGNvZGUgbmFtZX0uCiAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGlucHV0CisgICAgICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KICAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IGlzCisgICAgICAgICAqICAgICAgICAgICAgIG5vdCB7QGNvZGUgT2JqZWN0fS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldChTdHJpbmcgbmFtZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE9iamVjdElucHV0U3RyZWFtLiBUaGUgcmVwcmVzZW50YXRpb24gYW5kIHByb3BlcgotICAgICAqIGluaXRpYWxpemF0aW9uIGlzIG9uIHRoZSBoYW5kcyBvZiBzdWJjbGFzc2VzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0uIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZAorICAgICAqIGJ5IHN1YmNsYXNzZXMgdGhhdCBkbyBub3Qgd2FudCB0byB1c2UgdGhlIHB1YmxpYyBjb25zdHJ1Y3RvciBpZiBpdAorICAgICAqIGFsbG9jYXRlcyB1bm5lZWRlZCBkYXRhLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBub3QgY2FsbGVkIGZyb20gYSBzdWJjbGFzcworICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGNyZWF0aW5nIHRoaXMgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBzdWJjbGFzc2VzIGFyZSBub3QgYWxsb3dlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyBzdWJjbGFzc2luZworICAgICAqICAgICAgICAgICAgIHRoaXMgY2xhc3MuCiAgICAgICogQHNlZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tQZXJtaXNzaW9uKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTI3NCwxNyArMzgwLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBPYmplY3RJbnB1dFN0cmVhbSBvbiB0aGUgSW5wdXRTdHJlYW0gPGNvZGU+aW5wdXQ8L2NvZGU+LgotICAgICAqIEFsbCByZWFkcyBhcmUgbm93IGZpbHRlcmVkIHRocm91Z2ggdGhpcyBzdHJlYW0uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBPYmplY3RJbnB1dFN0cmVhbSB0aGF0IHJlYWRzIGZyb20gdGhlIElucHV0U3RyZWFtCisgICAgICoge0Bjb2RlIGlucHV0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKiAgICAgICAgICAgIFRoZSBub24tbnVsbCBJbnB1dFN0cmVhbSB0byBmaWx0ZXIgcmVhZHMgb24uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgc291cmNlIElucHV0U3RyZWFtIHRvIGZpbHRlciByZWFkcyBvbi4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgc3RyZWFtIGhlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgc3RyZWFtIGhlYWRlci4KICAgICAgKiBAdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkb2VzIG5vdCBjb250YWluIHNlcmlhbGl6ZWQgb2JqZWN0cwotICAgICAqICAgICAgICAgICAgIHRoYXQgY2FuIGJlIHJlYWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvdXJjZSBzdHJlYW0gZG9lcyBub3QgY29udGFpbiBzZXJpYWxpemVkIG9iamVjdHMgdGhhdAorICAgICAqICAgICAgICAgICAgIGNhbiBiZSByZWFkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgc3ViY2xhc3NpbmcKKyAgICAgKiAgICAgICAgICAgICB0aGlzIGNsYXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCkKICAgICAgICAgICAgIHRocm93cyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKQEAgLTM0MCwxNSArNDQ5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHByaW1pdGl2ZSBkYXRhIGF2YWlsYWJsZSBmcm9tIHRoZQotICAgICAqIHJlY2VpdmVyLiBJdCBzaG91bGQgbm90IGJlIHVzZWQgYXQgYW55IGFyYml0cmFyeSBwb3NpdGlvbjsganVzdCB3aGVuCi0gICAgICogcmVhZGluZyBwcmltaXRpdmUgZGF0YSB0eXBlcyAoaW50cywgY2hhcnMsIGV0YykuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHByaW1pdGl2ZSBkYXRhIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzCisgICAgICogc3RyZWFtIHdpdGhvdXQgYmxvY2tpbmcuIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBhdCBhbnkgYXJiaXRyYXJ5CisgICAgICogcG9zaXRpb247IGp1c3Qgd2hlbiByZWFkaW5nIHByaW1pdGl2ZSBkYXRhIHR5cGVzIChpbnQsIGNoYXIgZXRjKS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHByaW1pdGl2ZSBkYXRhIGJ5dGVzCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcmltaXRpdmUgZGF0YSBieXRlcy4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW55IElPIHByb2JsZW0gb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gY29tcHV0ZSB0aGUgYnl0ZXMKLSAgICAgKiAgICAgICAgICAgICBhdmFpbGFibGUuCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBwcm9ibGVtIG9jY3VycyB3aGlsZSBjb21wdXRpbmcgdGhlIGF2YWlsYWJsZQorICAgICAqICAgICAgICAgICAgIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTM1OCw5ICs0NjcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgaXQgaXMgb2sgdG8gcmVhZCBwcmltaXRpdmUgdHlwZXMgYXQgdGhpcyBwb2ludCBmcm9tIHRoZQotICAgICAqIHJlY2VpdmVyLiBPbmUgaXMgbm90IHN1cHBvc2VkIHRvIHJlYWQgcHJpbWl0aXZlIHR5cGVzIHdoZW4gYWJvdXQgdG8gcmVhZAotICAgICAqIGFuIG9iamVjdCwgZm9yIGV4YW1wbGUsIHNvIGFuIGV4Y2VwdGlvbiBoYXMgdG8gYmUgdGhyb3duLgorICAgICAqIENoZWNrcyB0byBpZiBpdCBpcyBvayB0byByZWFkIHByaW1pdGl2ZSB0eXBlcyBmcm9tIHRoaXMgc3RyZWFtIGF0CisgICAgICogdGhpcyBwb2ludC4gT25lIGlzIG5vdCBzdXBwb3NlZCB0byByZWFkIHByaW1pdGl2ZSB0eXBlcyB3aGVuIGFib3V0IHRvCisgICAgICogcmVhZCBhbiBvYmplY3QsIGZvciBleGFtcGxlLCBzbyBhbiBleGNlcHRpb24gaGFzIHRvIGJlIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgSWYgYW55IElPIHByb2JsZW0gb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gcmVhZCBwcmltaXRpdmUgdHlwZQpAQCAtNDA0LDExICs1MTMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIE9iamVjdElucHV0U3RyZWFtLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgdGFyZ2V0Ci0gICAgICogc3RyZWFtLgorICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjbG9zZXMgdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTQxNiwxNyArNTI1LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBtZXRob2QgdG8gcmVhZCBvYmplY3RzIGZyb20gdGhlIHJlY2VpdmVyLiBGaWVsZHMgZGVmaW5lZCBpbiB0aGUKLSAgICAgKiBvYmplY3QncyBjbGFzcyBhbmQgc3VwZXIgY2xhc3NlcyAod2hpY2ggYXJlIFNlcmlhbGl6YWJsZSkgd2lsbCBiZSByZWFkLgorICAgICAqIERlZmF1bHQgbWV0aG9kIHRvIHJlYWQgb2JqZWN0cyBmcm9tIHRoaXMgc3RyZWFtLiBTZXJpYWxpemFibGUgZmllbGRzCisgICAgICogZGVmaW5lZCBpbiB0aGUgb2JqZWN0J3MgY2xhc3MgYW5kIHN1cGVyY2xhc3NlcyBhcmUgcmVhZCBmcm9tIHRoZSBzb3VyY2UKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIG9iamVjdCBkYXRhCiAgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgY2Fubm90IGJlIGZvdW5kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG9iamVjdCdzIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBvYmplY3QgZGF0YS4KICAgICAgKiBAdGhyb3dzIE5vdEFjdGl2ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgZnJvbSByZWFkT2JqZWN0KCkKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGZyb20ge0Bjb2RlIHJlYWRPYmplY3QoKX0uCiAgICAgICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0jZGVmYXVsdFdyaXRlT2JqZWN0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVmYXVsdFJlYWRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCiAgICAgICAgICAgICBOb3RBY3RpdmVFeGNlcHRpb24gewpAQCAtNDM5LDE5ICs1NDksMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbmFibGVzL2Rpc2FibGVzIG9iamVjdCByZXBsYWNlbWVudCBmb3IgdGhlIHJlY2VpdmVyLiBCeSBkZWZhdWx0IHRoaXMgaXMKLSAgICAgKiBub3QgZW5hYmxlZC4gT25seSB0cnVzdGVkIHN1YmNsYXNzZXMgKGxvYWRlZCB3aXRoIHN5c3RlbSBjbGFzcyBsb2FkZXIpCi0gICAgICogY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IuCisgICAgICogRW5hYmxlcyBvYmplY3QgcmVwbGFjZW1lbnQgZm9yIHRoaXMgc3RyZWFtLiBCeSBkZWZhdWx0IHRoaXMgaXMgbm90CisgICAgICogZW5hYmxlZC4gT25seSB0cnVzdGVkIHN1YmNsYXNzZXMgKGxvYWRlZCB3aXRoIHN5c3RlbSBjbGFzcyBsb2FkZXIpIGFyZQorICAgICAqIGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMgc3RhdHVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBlbmFibGUKLSAgICAgKiAgICAgICAgICAgIGlmIHRydWUsIGVuYWJsZXMgcmVwbGFjZW1lbnQuIElmIGZhbHNlLCBkaXNhYmxlcyByZXBsYWNlbWVudC4KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uIChpZiBpdCB3YXMgZW5hYmxlZCBvciBkaXNhYmxlZCkKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBlbmFibGUgb2JqZWN0IHJlcGxhY2VtZW50OyB7QGNvZGUgZmFsc2V9IHRvCisgICAgICogICAgICAgICAgICBkaXNhYmxlIGl0LgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHNldHRpbmcuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjbGFzcyBvZiB0aGUgcmVjZWl2ZXIgaXMgbm90IHRydXN0ZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgZW5hYmxpbmcKKyAgICAgKiAgICAgICAgICAgICBvYmplY3QgcmVwbGFjZW1lbnQgZm9yIHRoaXMgc3RyZWFtLgogICAgICAqIEBzZWUgI3Jlc29sdmVPYmplY3QKICAgICAgKiBAc2VlIE9iamVjdE91dHB1dFN0cmVhbSNlbmFibGVSZXBsYWNlT2JqZWN0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlUmVzb2x2ZU9iamVjdChib29sZWFuIGVuYWJsZSkKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CkBAIC00NjksMjQgKzU4MCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0d28gY2xhc3NlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcGFja2FnZSBhbmQgcmV0dXJucyB0cnVlIGluIHRoZQotICAgICAqIHBvc2l0aXZlIGNhc2UuIFJldHVybiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQ2hlY2tzIGlmIHR3byBjbGFzc2VzIGJlbG9uZyB0byB0aGUgc2FtZSBwYWNrYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjMQotICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBjbGFzc2VzIHRvIHRlc3QKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY2xhc3NlcyB0byB0ZXN0LgogICAgICAqIEBwYXJhbSBjMgotICAgICAqICAgICAgICAgICAgdGhlIG90aGVyIGNsYXNzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gY2xhc3NlcyBiZWxvbmcgdG8gdGhlIHNhbWUKLSAgICAgKiAgICAgICAgIHBhY2thZ2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdGhlciBjbGFzcyB0byB0ZXN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB0d28gY2xhc3NlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcGFja2FnZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpblNhbWVQYWNrYWdlKENsYXNzPD8+IGMxLCBDbGFzczw/PiBjMikgewogICAgICAgICBTdHJpbmcgbmFtZUMxID0gYzEuZ2V0TmFtZSgpOwogICAgICAgICBTdHJpbmcgbmFtZUMyID0gYzIuZ2V0TmFtZSgpOwogICAgICAgICBpbnQgaW5kZXhEb3RDMSA9IG5hbWVDMS5sYXN0SW5kZXhPZignLicpOwogICAgICAgICBpbnQgaW5kZXhEb3RDMiA9IG5hbWVDMi5sYXN0SW5kZXhPZignLicpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CiAgICAgICAgIGlmIChpbmRleERvdEMxICE9IGluZGV4RG90QzIpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2Fubm90IGJlIGluIHRoZSBzYW1lIHBhY2thZ2UgaWYgaW5kaWNlcyBhcmUgbm90CiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAvLyB0aGUgc2FtZQogICAgICAgICBpZiAoaW5kZXhEb3RDMSA8IDApIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBib3RoIG9mIHRoZW0gYXJlIGluIGRlZmF1bHQgcGFja2FnZQpAQCAtNDk2LDI2ICs2MDksMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyA8Y29kZT5pbnN0YW50aWF0aW9uQ2xhc3M8L2NvZGU+CisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3Mge0Bjb2RlIGluc3RhbnRpYXRpb25DbGFzc30KICAgICAgKiBidXQgcnVubmluZyB0aGUgY29uc3RydWN0b3IgZGVmaW5lZCBpbiBjbGFzcwotICAgICAqIDxjb2RlPmNvbnN0cnVjdG9yQ2xhc3M8L2NvZGU+IChzYW1lIGFzIDxjb2RlPmluc3RhbnRpYXRpb25DbGFzczwvY29kZT4KKyAgICAgKiB7QGNvZGUgY29uc3RydWN0b3JDbGFzc30gKHNhbWUgYXMge0Bjb2RlIGluc3RhbnRpYXRpb25DbGFzc30KICAgICAgKiBvciBhIHN1cGVyY2xhc3MpLgogICAgICAqIAogICAgICAqIEhhcyB0byBiZSBuYXRpdmUgdG8gYXZvaWQgdmlzaWJpbGl0eSBydWxlcyBhbmQgdG8gYmUgYWJsZSB0byBoYXZlCi0gICAgICogPGNvZGU+aW5zdGFudGlhdGlvbkNsYXNzPC9jb2RlPiBub3QgdGhlIHNhbWUgYXMKLSAgICAgKiA8Y29kZT5jb25zdHJ1Y3RvckNsYXNzPC9jb2RlPiAobm8gc3VjaCBBUEkgaW4gamF2YS5sYW5nLnJlZmxlY3QpLgorICAgICAqIHtAY29kZSBpbnN0YW50aWF0aW9uQ2xhc3N9IG5vdCB0aGUgc2FtZSBhcworICAgICAqIHtAY29kZSBjb25zdHJ1Y3RvckNsYXNzfSAobm8gc3VjaCBBUEkgaW4gamF2YS5sYW5nLnJlZmxlY3QpLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbnN0YW50aWF0aW9uQ2xhc3MKICAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgb2JqZWN0IHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwogICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvckNsYXNzCiAgICAgICogICAgICAgICAgICBUaGUgZW1wdHkgY29uc3RydWN0b3IgdG8gcnVuIHdpbGwgYmUgaW4gdGhpcyBjbGFzcwotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBjcmVhdGVkIGZyb20gPGNvZGU+aW5zdGFudGlhdGlvbkNsYXNzPC9jb2RlPgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBjcmVhdGVkIGZyb20ge0Bjb2RlIGluc3RhbnRpYXRpb25DbGFzc30KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzPD8+IGluc3RhbnRpYXRpb25DbGFzcywKICAgICAgICAgICAgIENsYXNzPD8+IGNvbnN0cnVjdG9yQ2xhc3MpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuZXh0IDxjb2RlPmludDwvY29kZT4gaGFuZGxlIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGUgY3ljbGljCisgICAgICogUmV0dXJuIHRoZSBuZXh0IHtAY29kZSBpbnR9IGhhbmRsZSB0byBiZSB1c2VkIHRvIGluZGljYXRlIGN5Y2xpYwogICAgICAqIHJlZmVyZW5jZXMgYmVpbmcgbG9hZGVkIGZyb20gdGhlIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGhhbmRsZSB0byByZXByZXNlbnQgdGhlIG5leHQgY3ljbGljIHJlZmVyZW5jZQpAQCAtNTU0LDE0ICs2NjcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIHJlY2VpdmVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gaW50LgotICAgICAqIFRoZSBsb3ctb3JkZXIgYnl0ZSBpcyByZXR1cm5lZCBvciAtMSBvZiB0aGUgZW5kIG9mIHN0cmVhbSB3YXMKLSAgICAgKiBlbmNvdW50ZXJlZC4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0gYW5kIHJldHVybnMgaXQgYXMgYW4gaW50ZWdlcgorICAgICAqIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMjU1LiBSZXR1cm5zIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJlYW0KKyAgICAgKiBoYXMgYmVlbiByZWFjaGVkLiBCbG9ja3MgaWYgbm8gaW5wdXQgaXMgYXZhaWxhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJ5dGUgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc3RyZWFtIGhhcyBiZWVuCisgICAgICogICAgICAgICByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01NzAsMzIgKzY4NCw0NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+bGVuZ3RoPC9jb2RlPiBieXRlcyBmcm9tIHRoZSByZWNlaXZlciBhbmQgc3RvcmVzCi0gICAgICogdGhlbSBpbiBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgb2Zmc2V0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuCisgICAgICogUmVhZHMgYXQgbW9zdCB7QGNvZGUgbGVuZ3RofSBieXRlcyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtIGFuZCBzdG9yZXMgdGhlbQorICAgICAqIGluIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQgb2Zmc2V0IHtAY29kZSBjb3VudH0uIEJsb2NrcworICAgICAqIHVudGlsIHtAY29kZSBjb3VudH0gYnl0ZXMgaGF2ZSBiZWVuIHJlYWQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJlYW0gaXMKKyAgICAgKiBkZXRlY3RlZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBieXRlcworICAgICAqICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIGlucHV0CisgICAgICogICAgICAgICBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuZ3RoIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGJ1ZmZlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIHx8IGxlbmd0aCA8IDAKLSAgICAgICAgICAgICAgICB8fCBsZW5ndGggPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHJlbW92ZWQgcmVkdW5kYW50IGNoZWNrLCB1c2VkIChvZmZzZXQgfCBsZW5ndGgpIDwgMCBpbnN0ZWFkIG9mCisgICAgICAgIC8vIChvZmZzZXQgPCAwKSB8fCAobGVuZ3RoIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuZ3RoKSA8IDAgfHwgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtNjA2LDcgKzczMyw3IEBACiAgICAgLyoqCiAgICAgICogUmVhZHMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgcmF3IGJ5dGVzIHdpdGggcHJpbWl0aXZlIGRhdGEuIFRoZSBhcnJheQogICAgICAqIHdpbGwgaGF2ZSB1cCB0byAyNTUgYnl0ZXMuIFRoZSBwcmltaXRpdmUgZGF0YSB3aWxsIGJlIGluIHRoZSBmb3JtYXQKLSAgICAgKiBkZXNjcmliZWQgYnkgPGNvZGU+RGF0YU91dHB1dFN0cmVhbTwvY29kZT4uCisgICAgICogZGVzY3JpYmVkIGJ5IHtAY29kZSBEYXRhT3V0cHV0U3RyZWFtfS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFRoZSBwcmltaXRpdmUgZGF0YSByZWFkLCBhcyByYXcgYnl0ZXMKICAgICAgKiAKQEAgLTYyMiw3ICs3NDksNyBAQAogICAgIC8qKgogICAgICAqIFJlYWRzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJhdyBieXRlcyB3aXRoIHByaW1pdGl2ZSBkYXRhLiBUaGUgYXJyYXkKICAgICAgKiB3aWxsIGhhdmUgbW9yZSB0aGFuIDI1NSBieXRlcy4gVGhlIHByaW1pdGl2ZSBkYXRhIHdpbGwgYmUgaW4gdGhlIGZvcm1hdAotICAgICAqIGRlc2NyaWJlZCBieSA8Y29kZT5EYXRhT3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAgICAgKiBkZXNjcmliZWQgYnkge0Bjb2RlIERhdGFPdXRwdXRTdHJlYW19LgogICAgICAqIAogICAgICAqIEByZXR1cm4gVGhlIHByaW1pdGl2ZSBkYXRhIHJlYWQsIGFzIHJhdyBieXRlcwogICAgICAqIApAQCAtNjM2LDM5ICs3NjMsNDUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbmQgcmV0dXJucyBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGJvb2xlYW4gcmVhZCBmcm9tIHRoZSByZWNlaXZlcgorICAgICAqIFJlYWRzIGEgYm9vbGVhbiBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHNhdmVkIGFzIHByaW1pdGl2ZSBkYXRhIHVzaW5nCi0gICAgICogICAgICAgICA8Y29kZT5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVCb29sZWFuKCk8L2NvZGU+Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBwcmltaXRpdmVUeXBlcy5yZWFkQm9vbGVhbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGFuZCByZXR1cm5zIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgYnl0ZSByZWFkIGZyb20gdGhlIHJlY2VpdmVyCisgICAgICogUmVhZHMgYSBieXRlICg4IGJpdCkgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgYnl0ZSBzYXZlZCBhcyBwcmltaXRpdmUgZGF0YSB1c2luZwotICAgICAqICAgICAgICAgPGNvZGU+T2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQnl0ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgdmFsdWUgcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIHByaW1pdGl2ZSBkYXRhLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZXMucmVhZEJ5dGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbmQgcmV0dXJucyBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGNoYXIgcmVhZCBmcm9tIHRoZSByZWNlaXZlcgorICAgICAqIFJlYWRzIGEgY2hhcmFjdGVyICgxNiBiaXQpIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiBBIGNoYXIgc2F2ZWQgYXMgcHJpbWl0aXZlIGRhdGEgdXNpbmcKLSAgICAgKiAgICAgICAgIDxjb2RlPk9iamVjdE91dHB1dFN0cmVhbS53cml0ZUNoYXIoKTwvY29kZT4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyIHZhbHVlIHJlYWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVR5cGVzLnJlYWRDaGFyKCk7CkBAIC02OTksNyArODMyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIGNsYXNzIGRlc2NyaXB0b3IgKGFuIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikgZnJvbSB0aGUKKyAgICAgKiBSZWFkcyBhIGNsYXNzIGRlc2NyaXB0b3IgKGFuIHtAY29kZSBPYmplY3RTdHJlYW1DbGFzc30pIGZyb20gdGhlCiAgICAgICogc3RyZWFtLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIGRlc2NyaXB0b3IgcmVhZCBmcm9tIHRoZSBzdHJlYW0KQEAgLTczOCw3ICs4NzEsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyIGJhc2VkIG9uIHRoZSBwcmV2aW91c2x5IHJlYWQgdG9rZW4KLSAgICAgKiA8Y29kZT50YzwvY29kZT4uCisgICAgICoge0Bjb2RlIHRjfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGMKICAgICAgKiAgICAgICAgICAgIFRoZSB0b2tlbiBjb2RlIGZvciB0aGUgbmV4dCBpdGVtIGluIHRoZSBzdHJlYW0KQEAgLTc4OCw3ICs5MjEsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyIGJhc2VkIG9uIHRoZSBwcmV2aW91c2x5IHJlYWQgdG9rZW4KLSAgICAgKiA8Y29kZT50YzwvY29kZT4uIFByaW1pdGl2ZSBkYXRhIGNvbnRlbnQgaXMgY29uc2lkZXJlZCBhbiBlcnJvci4KKyAgICAgKiB7QGNvZGUgdGN9LiBQcmltaXRpdmUgZGF0YSBjb250ZW50IGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVuc2hhcmVkCiAgICAgICogICAgICAgICAgICByZWFkIHRoZSBvYmplY3QgdW5zaGFyZWQKQEAgLTg3MiwxMyArMTAwNSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGFuZCByZXR1cm5zIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgZG91YmxlIHJlYWQgZnJvbSB0aGUgcmVjZWl2ZXIKKyAgICAgKiBSZWFkcyBhIGRvdWJsZSAoNjQgYml0KSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSBkb3VibGUgc2F2ZWQgYXMgcHJpbWl0aXZlIGRhdGEgdXNpbmcKLSAgICAgKiAgICAgICAgIDxjb2RlPk9iamVjdE91dHB1dFN0cmVhbS53cml0ZURvdWJsZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSB2YWx1ZSByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZXMucmVhZERvdWJsZSgpOwpAQCAtOTI4LDEwICsxMDYzLDEwIEBACiAKICAgICAvKioKICAgICAgKiBSZWFkcyBhIGNvbGxlY3Rpb24gb2YgZmllbGQgZGVzY3JpcHRvcnMgKG5hbWUsIHR5cGUgbmFtZSwgZXRjKSBmb3IgdGhlCi0gICAgICogY2xhc3MgZGVzY3JpcHRvciA8Y29kZT5jRGVzYzwvY29kZT4gKGFuIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikKKyAgICAgKiBjbGFzcyBkZXNjcmlwdG9yIHtAY29kZSBjRGVzY30gKGFuIHtAY29kZSBPYmplY3RTdHJlYW1DbGFzc30pCiAgICAgICogCiAgICAgICogQHBhcmFtIGNEZXNjCi0gICAgICogICAgICAgICAgICBUaGUgY2xhc3MgZGVzY3JpcHRvciAoYW4gPGNvZGU+T2JqZWN0U3RyZWFtQ2xhc3M8L2NvZGU+KQorICAgICAqICAgICAgICAgICAgVGhlIGNsYXNzIGRlc2NyaXB0b3IgKGFuIHtAY29kZSBPYmplY3RTdHJlYW1DbGFzc30pCiAgICAgICogICAgICAgICAgICBmb3Igd2hpY2ggdG8gd3JpdGUgZmllbGQgaW5mb3JtYXRpb24KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCkBAIC05ODAsMjAgKzExMTUsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgZmllbGRzIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVhZCBmcm9tIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0KLSAgICAgKiB3aWxsIHVzZSB0aGUgY3VycmVudGx5IGFjdGl2ZSA8Y29kZT5nZXRGaWVsZDwvY29kZT4gb2JqZWN0LCBhbGxvd2luZwotICAgICAqIHVzZXJzIHRvIGxvYWQgZW11bGF0ZWQgZmllbGRzLCBmb3IgY3Jvc3MtbG9hZGluZyBjb21wYXRpYmlsaXR5IHdoZW4gYQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcy4KKyAgICAgKiBSZWFkcyB0aGUgcGVyc2lzdGVudCBmaWVsZHMgb2YgdGhlIG9iamVjdCB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyByZWFkCisgICAgICogZnJvbSB0aGUgc291cmNlIHN0cmVhbS4gVGhlIHZhbHVlcyByZWFkIGFyZSBzdG9yZWQgaW4gYSBHZXRGaWVsZCBvYmplY3QKKyAgICAgKiB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgcGVyc2lzdGVudCBmaWVsZHMuIFRoaXMgR2V0RmllbGQgb2JqZWN0IGlzCisgICAgICogdGhlbiByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZHMgYmVpbmcgcmVhZAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBHZXRGaWVsZCBvYmplY3QgZnJvbSB3aGljaCBwZXJzaXN0ZW50IGZpZWxkcyBjYW4gYmUgYWNjZXNzZWQKKyAgICAgKiAgICAgICAgIGJ5IG5hbWUuCiAgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBjbGFzcyBvZiBhbiBvYmplY3QgYmVpbmcgZGUtc2VyaWFsaXplZCBjYW4gbm90IGJlIGZvdW5kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIGFuIG9iamVjdCBiZWluZyBkZXNlcmlhbGl6ZWQgY2FuIG5vdCBiZQorICAgICAqICAgICAgICAgICAgIGZvdW5kLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgTm90QWN0aXZlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gb2JqZWN0IGN1cnJlbnRseSBiZWluZyBsb2FkZWQgKGludmFsaWQgdG8gY2FsbAotICAgICAqICAgICAgICAgICAgIHRoaXMgbWV0aG9kKQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGN1cnJlbnRseSBub3QgcmVhZGluZyBhbiBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEdldEZpZWxkIHJlYWRGaWVsZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCiAgICAgICAgICAgICBOb3RBY3RpdmVFeGNlcHRpb24gewpAQCAtMTAwOSwxMSArMTE0NSwxMSBAQAogCiAgICAgLyoqCiAgICAgICogUmVhZHMgYSBjb2xsZWN0aW9uIG9mIGZpZWxkIHZhbHVlcyBmb3IgdGhlIGVtdWxhdGVkIGZpZWxkcwotICAgICAqIDxjb2RlPmVtdWxhdGVkRmllbGRzPC9jb2RlPgorICAgICAqIHtAY29kZSBlbXVsYXRlZEZpZWxkc30KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZW11bGF0ZWRGaWVsZHMKLSAgICAgKiAgICAgICAgICAgIGFuIDxjb2RlPkVtdWxhdGVkRmllbGRzRm9yTG9hZGluZzwvY29kZT4sIGNvbmNyZXRlIHN1YmNsYXNzCi0gICAgICogICAgICAgICAgICBvZiA8Y29kZT5HZXRGaWVsZDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIGFuIHtAY29kZSBFbXVsYXRlZEZpZWxkc0ZvckxvYWRpbmd9LCBjb25jcmV0ZSBzdWJjbGFzcworICAgICAqICAgICAgICAgICAgb2Yge0Bjb2RlIEdldEZpZWxkfQogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBmaWVsZCB2YWx1ZXMuCkBAIC0xMDY1LDE2ICsxMjAxLDE2IEBACiAKICAgICAvKioKICAgICAgKiBSZWFkcyBhIGNvbGxlY3Rpb24gb2YgZmllbGQgdmFsdWVzIGZvciB0aGUgY2xhc3MgZGVzY3JpcHRvcgotICAgICAqIDxjb2RlPmNsYXNzRGVzYzwvY29kZT4gKGFuIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikuIFRoZQotICAgICAqIHZhbHVlcyB3aWxsIGJlIHVzZWQgdG8gc2V0IGluc3RhbmNlIGZpZWxkcyBpbiBvYmplY3QgPGNvZGU+b2JqPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgY2xhc3NEZXNjfSAoYW4ge0Bjb2RlIE9iamVjdFN0cmVhbUNsYXNzfSkuIFRoZQorICAgICAqIHZhbHVlcyB3aWxsIGJlIHVzZWQgdG8gc2V0IGluc3RhbmNlIGZpZWxkcyBpbiBvYmplY3Qge0Bjb2RlIG9ian0uCiAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBtZWNoYW5pc20sIHdoZW4gZW11bGF0ZWQgZmllbGRzIChhbgotICAgICAqIDxjb2RlPkdldEZpZWxkPC9jb2RlPikgYXJlIG5vdCB1c2VkLiBBY3R1YWwgdmFsdWVzIHRvIGxvYWQgYXJlIHN0b3JlZAotICAgICAqIGRpcmVjdGx5IGludG8gdGhlIG9iamVjdCA8Y29kZT5vYmo8L2NvZGU+LgorICAgICAqIHtAY29kZSBHZXRGaWVsZH0pIGFyZSBub3QgdXNlZC4gQWN0dWFsIHZhbHVlcyB0byBsb2FkIGFyZSBzdG9yZWQKKyAgICAgKiBkaXJlY3RseSBpbnRvIHRoZSBvYmplY3Qge0Bjb2RlIG9ian0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagogICAgICAqICAgICAgICAgICAgSW5zdGFuY2UgaW4gd2hpY2ggdGhlIGZpZWxkcyB3aWxsIGJlIHNldC4KICAgICAgKiBAcGFyYW0gY2xhc3NEZXNjCi0gICAgICogICAgICAgICAgICBBIGNsYXNzIGRlc2NyaXB0b3IgKGFuIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikKKyAgICAgKiAgICAgICAgICAgIEEgY2xhc3MgZGVzY3JpcHRvciAoYW4ge0Bjb2RlIE9iamVjdFN0cmVhbUNsYXNzfSkKICAgICAgKiAgICAgICAgICAgIGRlZmluaW5nIHdoaWNoIGZpZWxkcyBzaG91bGQgYmUgbG9hZGVkLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTExOTUsNDcgKzEzMzEsNTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbmQgcmV0dXJucyBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGZsb2F0IHJlYWQgZnJvbSB0aGUgcmVjZWl2ZXIKKyAgICAgKiBSZWFkcyBhIGZsb2F0ICgzMiBiaXQpIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiBBIGZsb2F0IHNhdmVkIGFzIHByaW1pdGl2ZSBkYXRhIHVzaW5nCi0gICAgICogICAgICAgICA8Y29kZT5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVGbG9hdCgpPC9jb2RlPgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IHZhbHVlIHJlYWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZXMucmVhZEZsb2F0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgcmVjZWl2ZXIgaW50byB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgPGNvZGU+YnVmZmVyLmxlbmd0aDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzCi0gICAgICogaGF2ZSBiZWVuIHJlYWQuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgc291cmNlIHN0cmVhbSBpbnRvIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9LgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwge0Bjb2RlIGJ1ZmZlci5sZW5ndGh9IGJ5dGVzIGhhdmUgYmVlbiByZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gcmVhZCBieXRlcyBpbnRvCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcHJpbWl0aXZlVHlwZXMucmVhZEZ1bGx5KGJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgcmVjZWl2ZXIgaW50byB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgPGNvZGU+bGVuZ3RoPC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMgaGF2ZQotICAgICAqIGJlZW4gcmVhZC4KKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtIGludG8gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB7QGNvZGUgbGVuZ3RofSBudW1iZXIgb2YgYnl0ZXMgaGF2ZSBiZWVuCisgICAgICogcmVhZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBieXRlcworICAgICAqICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTI0NCwxNyArMTM4OCwxNyBAQAogCiAgICAgLyoqCiAgICAgICogV2Fsa3MgdGhlIGhpZXJhcmNoeSBvZiBjbGFzc2VzIGRlc2NyaWJlZCBieSBjbGFzcyBkZXNjcmlwdG9yCi0gICAgICogPGNvZGU+Y2xhc3NEZXNjPC9jb2RlPiBhbmQgcmVhZHMgdGhlIGZpZWxkIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvCisgICAgICoge0Bjb2RlIGNsYXNzRGVzY30gYW5kIHJlYWRzIHRoZSBmaWVsZCB2YWx1ZXMgY29ycmVzcG9uZGluZyB0bwogICAgICAqIGZpZWxkcyBkZWNsYXJlZCBieSB0aGUgY29ycmVzcG9uZGluZyBjbGFzcyBkZXNjcmlwdG9yLiBUaGUgaW5zdGFuY2UgdG8KLSAgICAgKiBzdG9yZSBmaWVsZCB2YWx1ZXMgaW50byBpcyA8Y29kZT5vYmplY3Q8L2NvZGU+LiBJZiB0aGUgY2xhc3MKLSAgICAgKiAoY29ycmVzcG9uZGluZyB0byBjbGFzcyBkZXNjcmlwdG9yIDxjb2RlPmNsYXNzRGVzYzwvY29kZT4pIGRlZmluZXMKLSAgICAgKiBwcml2YXRlIGluc3RhbmNlIG1ldGhvZCA8Y29kZT5yZWFkT2JqZWN0PC9jb2RlPiBpdCB3aWxsIGJlIHVzZWQgdG8gbG9hZAorICAgICAqIHN0b3JlIGZpZWxkIHZhbHVlcyBpbnRvIGlzIHtAY29kZSBvYmplY3R9LiBJZiB0aGUgY2xhc3MKKyAgICAgKiAoY29ycmVzcG9uZGluZyB0byBjbGFzcyBkZXNjcmlwdG9yIHtAY29kZSBjbGFzc0Rlc2N9KSBkZWZpbmVzCisgICAgICogcHJpdmF0ZSBpbnN0YW5jZSBtZXRob2Qge0Bjb2RlIHJlYWRPYmplY3R9IGl0IHdpbGwgYmUgdXNlZCB0byBsb2FkCiAgICAgICogZmllbGQgdmFsdWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgKiAgICAgICAgICAgIEluc3RhbmNlIGludG8gd2hpY2ggc3RvcmVkIGZpZWxkIHZhbHVlcyBsb2FkZWQuCiAgICAgICogQHBhcmFtIGNsYXNzRGVzYwotICAgICAqICAgICAgICAgICAgQSBjbGFzcyBkZXNjcmlwdG9yIChhbiA8Y29kZT5PYmplY3RTdHJlYW1DbGFzczwvY29kZT4pCisgICAgICogICAgICAgICAgICBBIGNsYXNzIGRlc2NyaXB0b3IgKGFuIHtAY29kZSBPYmplY3RTdHJlYW1DbGFzc30pCiAgICAgICogICAgICAgICAgICBkZWZpbmluZyB3aGljaCBmaWVsZHMgc2hvdWxkIGJlIGxvYWRlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCkBAIC0xMjYzLDcgKzE0MDcsNyBAQAogICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIGEgY2xhc3MgZm9yIG9uZSBvZiB0aGUgZmllbGQgdHlwZXMgY291bGQgbm90IGJlIGZvdW5kCiAgICAgICogQHRocm93cyBOb3RBY3RpdmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiA8Y29kZT5kZWZhdWx0UmVhZE9iamVjdDwvY29kZT4gaXMgY2FsbGVkIGZyb20gdGhlIHdyb25nCisgICAgICogICAgICAgICAgICAgSWYge0Bjb2RlIGRlZmF1bHRSZWFkT2JqZWN0fSBpcyBjYWxsZWQgZnJvbSB0aGUgd3JvbmcKICAgICAgKiAgICAgICAgICAgICBjb250ZXh0LgogICAgICAqIAogICAgICAqIEBzZWUgI2RlZmF1bHRSZWFkT2JqZWN0CkBAIC0xNDE3LDI5ICsxNTYxLDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYW5kIHJldHVybnMgcHJpbWl0aXZlIGRhdGEgb2YgdHlwZSBpbnQgcmVhZCBmcm9tIHRoZSByZWNlaXZlcgorICAgICAqIFJlYWRzIGFuIGludGVnZXIgKDMyIGJpdCkgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGludCBzYXZlZCBhcyBwcmltaXRpdmUgZGF0YSB1c2luZwotICAgICAqICAgICAgICAgPGNvZGU+T2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlSW50KCk8L2NvZGU+Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZXMucmVhZEludCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBuZXh0IGxpbmUgKHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgU3RyaW5nKSByZWFkIGZyb20KLSAgICAgKiB0aGUgcmVjZWl2ZXIKKyAgICAgKiBSZWFkcyB0aGUgbmV4dCBsaW5lIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uIExpbmVzIGFyZSB0ZXJtaW5hdGVkIGJ5IAorICAgICAqIHtAY29kZSAnXHInfSwge0Bjb2RlICdcbid9LCB7QGNvZGUgIlxyXG4ifSBvciBhbiB7QGNvZGUgRU9GfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHNhdmVkIGFzIHByaW1pdGl2ZSBkYXRhIHVzaW5nCi0gICAgICogICAgICAgICA8Y29kZT5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVMaW5lKCk8L2NvZGU+Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlYWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEJ1ZmZlcmVkUmVhZGVyfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKQEAgLTE0NDgsMTMgKzE1OTIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbmQgcmV0dXJucyBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGxvbmcgcmVhZCBmcm9tIHRoZSByZWNlaXZlcgorICAgICAqIFJlYWRzIGEgbG9uZyAoNjQgYml0KSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsb25nIHNhdmVkIGFzIHByaW1pdGl2ZSBkYXRhIHVzaW5nCi0gICAgICogICAgICAgICA8Y29kZT5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVMb25nKCk8L2NvZGU+Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbG9uZyB2YWx1ZSByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgcmVhZAorICAgICAqICAgICAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyByZWFkTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBwcmltaXRpdmVUeXBlcy5yZWFkTG9uZygpOwpAQCAtMTU2MCw3ICsxNzA2LDcgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdW5zaGFyZWQKICAgICAgKiAgICAgICAgICAgIHJlYWQgdGhlIG9iamVjdCB1bnNoYXJlZAotICAgICAqIEByZXR1cm4gVGhlIDxjb2RlPmphdmEubGFuZy5DbGFzczwvY29kZT4gcmVhZCBmcm9tIHRoZSBzdHJlYW0uCisgICAgICogQHJldHVybiBUaGUge0Bjb2RlIGphdmEubGFuZy5DbGFzc30gcmVhZCBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIGNsYXNzLgpAQCAtMTY3NSw3ICsxODIxLDcgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdW5zaGFyZWQKICAgICAgKiAgICAgICAgICAgIHJlYWQgdGhlIG9iamVjdCB1bnNoYXJlZAotICAgICAqIEByZXR1cm4gVGhlIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPiByZWFkIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT2JqZWN0U3RyZWFtQ2xhc3N9IHJlYWQgZnJvbSB0aGUgc3RyZWFtLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBjbGFzcwpAQCAtMTczMiw3ICsxODc4LDcgQEAKICAgICAgKiBwcm94eSBjbGFzcyBkZXNjcmlwdG9yIGhhcyBub3QgYmVlbiByZWFkIHlldCAobm90IGEgY3ljbGljIHJlZmVyZW5jZSkuCiAgICAgICogUmV0dXJuIHRoZSBwcm94eSBjbGFzcyBkZXNjcmlwdG9yIHJlYWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgPGNvZGU+Q2xhc3M8L2NvZGU+IHJlYWQgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqIEByZXR1cm4gVGhlIHtAY29kZSBDbGFzc30gcmVhZCBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIGNsYXNzCkBAIC0xNzU0LDE2ICsxOTAwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBuZXcgY2xhc3MgZGVzY3JpcHRvciBmcm9tIHRoZSByZWNlaXZlci4gUmV0dXJuIHRoZSBjbGFzcwotICAgICAqIGRlc2NyaXB0b3IgcmVhZC4KKyAgICAgKiBSZWFkcyBhIGNsYXNzIGRlc2NyaXB0b3IgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5PYmplY3RTdHJlYW1DbGFzczwvY29kZT4gcmVhZCBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIGNsYXNzCi0gICAgICogICAgICAgICAgICAgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBkZXNjcmlwdG9yIHJlYWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIGNsYXNzIGZvciBvbmUgb2YgdGhlIG9iamVjdHMgY291bGQgbm90IGJlIGZvdW5kCisgICAgICogICAgICAgICAgICAgaWYgYSBjbGFzcyBmb3Igb25lIG9mIHRoZSBvYmplY3RzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0U3RyZWFtQ2xhc3MgcmVhZENsYXNzRGVzY3JpcHRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewpAQCAtMTc5MCwxNiArMTkzNCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgcHJveHkgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJmYWNlIG5hbWVzLgorICAgICAqIENyZWF0ZXMgdGhlIHByb3h5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlcyBzcGVjaWZpZWQgaW4KKyAgICAgKiB7QGNvZGUgaW50ZXJmYWNlTmFtZXN9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lcwotICAgICAqICAgICAgICAgICAgVGhlIGludGVyZmFjZXMgdXNlZCB0byBjcmVhdGUgdGhlIHByb3h5IGNsYXNzCi0gICAgICogQHJldHVybiBBIHByb3h5IGNsYXNzCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBJTyBwcm9ibGVtIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGxvYWQgdGhlIGNsYXNzLgorICAgICAqICAgICAgICAgICAgdGhlIGludGVyZmFjZXMgdXNlZCB0byBjcmVhdGUgdGhlIHByb3h5IGNsYXNzLgorICAgICAqIEByZXR1cm4gdGhlIHByb3h5IGNsYXNzLgogICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBwcm94eSBjbGFzcyBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm94eSBjbGFzcyBvciBhbnkgb2YgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2VzIGNhbm5vdAorICAgICAqICAgICAgICAgICAgIGJlIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0jYW5ub3RhdGVQcm94eUNsYXNzKENsYXNzKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBDbGFzczw/PiByZXNvbHZlUHJveHlDbGFzcyhTdHJpbmdbXSBpbnRlcmZhY2VOYW1lcykKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CkBAIC0xODM2LDExICsxOTgzLDExIEBACiAgICAgICogUmVhZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgc3RyZWFtLiBJdCBpcyBhc3N1bWVkIHRoZSBvYmplY3QgaGFzIG5vdCBiZWVuCiAgICAgICogbG9hZGVkIHlldCAobm90IGEgY3ljbGljIHJlZmVyZW5jZSkuIFJldHVybiB0aGUgb2JqZWN0IHJlYWQuCiAgICAgICogCi0gICAgICogSWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzIDxjb2RlPkV4dGVybmFsaXphYmxlPC9jb2RlPiBpdHMKLSAgICAgKiA8Y29kZT5yZWFkRXh0ZXJuYWw8L2NvZGU+IGlzIGNhbGxlZC4gT3RoZXJ3aXNlLCBhbGwgZmllbGRzIGRlc2NyaWJlZCBieQorICAgICAqIElmIHRoZSBvYmplY3QgaW1wbGVtZW50cyB7QGNvZGUgRXh0ZXJuYWxpemFibGV9IGl0cworICAgICAqIHtAY29kZSByZWFkRXh0ZXJuYWx9IGlzIGNhbGxlZC4gT3RoZXJ3aXNlLCBhbGwgZmllbGRzIGRlc2NyaWJlZCBieQogICAgICAqIHRoZSBjbGFzcyBoaWVyYXJjaHkgYXJlIGxvYWRlZC4gRWFjaCBjbGFzcyBjYW4gZGVmaW5lIGhvdyBpdHMgZGVjbGFyZWQKICAgICAgKiBpbnN0YW5jZSBmaWVsZHMgYXJlIGxvYWRlZCBieSBkZWZpbmluZyBhIHByaXZhdGUgbWV0aG9kCi0gICAgICogPGNvZGU+cmVhZE9iamVjdDwvY29kZT4KKyAgICAgKiB7QGNvZGUgcmVhZE9iamVjdH0KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdW5zaGFyZWQKICAgICAgKiAgICAgICAgICAgIHJlYWQgdGhlIG9iamVjdCB1bnNoYXJlZApAQCAtMjAzNCwxMyArMjE4MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWQgYSBuZXcgU3RyaW5nIGluIFVURiBmb3JtYXQgZnJvbSB0aGUgcmVjZWl2ZXIuIFJldHVybiB0aGUgc3RyaW5nCi0gICAgICogcmVhZC4KKyAgICAgKiBSZWFkIGEgc3RyaW5nIGVuY29kZWQgaW4ge0BsaW5rIERhdGFJbnB1dCBtb2RpZmllZCBVVEYtOH0gZnJvbSB0aGUKKyAgICAgKiByZWNlaXZlci4gUmV0dXJuIHRoZSBzdHJpbmcgcmVhZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdW5zaGFyZWQKICAgICAgKiAgICAgICAgICAgIHJlYWQgdGhlIG9iamVjdCB1bnNoYXJlZAogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBqdXN0IHJlYWQuCi0gICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIFN0cmluZy4KICAgICAgKi8KQEAgLTIwNzksMTkgKzIyMjUsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIFJlYWRzIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBvYmplY3QgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gcmVhZGluZyB0aGUgb2JqZWN0CisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJlYWQgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2xhc3Mgb2Ygb25lIG9mIHRoZSBvYmplY3RzIGluIHRoZSBvYmplY3QgZ3JhcGggY291bGQKLSAgICAgKiAgICAgICAgICAgICBub3QgYmUgZm91bmQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2Ygb25lIG9mIHRoZSBvYmplY3RzIGluIHRoZSBvYmplY3QgZ3JhcGggY2Fubm90CisgICAgICogICAgICAgICAgICAgYmUgZm91bmQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogQHRocm93cyBPcHRpb25hbERhdGFFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBwcmltaXRpdmUgZGF0YSB0eXBlcyB3ZXJlIGZvdW5kIGluc3RlYWQgb2YgYW4gb2JqZWN0LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHByaW1pdGl2ZSBkYXRhIHR5cGVzIHdlcmUgZm91bmQgaW5zdGVhZCBvZiBhbiBvYmplY3QuCiAgICAgICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVPYmplY3QoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgcmVhZE9iamVjdCgpIHRocm93cyBPcHRpb25hbERhdGFFeGNlcHRpb24sCiAgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC0yMDk5LDE3ICsyMjQ0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZCB0aGUgbmV4dCB1bnNoYXJlZCBvYmplY3QgZnJvbSB0aGUgcmVjZWl2ZXIncyB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiBSZWFkcyB0aGUgbmV4dCB1bnNoYXJlZCBvYmplY3QgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgb2JqZWN0IHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIG9iamVjdAogICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjbGFzcyBvZiBvbmUgb2YgdGhlIG9iamVjdHMgaW4gdGhlIG9iamVjdCBncmFwaCBjb3VsZAotICAgICAqICAgICAgICAgICAgIG5vdCBiZSBmb3VuZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBvZiBvbmUgb2YgdGhlIG9iamVjdHMgaW4gdGhlIG9iamVjdCBncmFwaCBjYW5ub3QKKyAgICAgKiAgICAgICAgICAgICBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiBAc2VlIE9iamVjdE91dHB1dFN0cmVhbSN3cml0ZVVuc2hhcmVkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCByZWFkVW5zaGFyZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcmVhZE9iamVjdCh0cnVlKTsKQEAgLTIyMDIsMTkgKzIzNDYsMTggQEAKIAogICAgIC8qKgogICAgICAqIE1ldGhvZCB0byBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byByZWFkIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogc291cmNlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgb2JqZWN0IHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNsYXNzIG9mIG9uZSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgb2JqZWN0IGdyYXBoIGNvdWxkCi0gICAgICogICAgICAgICAgICAgbm90IGJlIGZvdW5kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIG9uZSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgb2JqZWN0IGdyYXBoIGNhbm5vdAorICAgICAqICAgICAgICAgICAgIGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIEB0aHJvd3MgT3B0aW9uYWxEYXRhRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgcHJpbWl0aXZlIGRhdGEgdHlwZXMgd2VyZSBmb3VuZCBpbnN0ZWFkIG9mIGFuIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBwcmltaXRpdmUgZGF0YSB0eXBlcyB3ZXJlIGZvdW5kIGluc3RlYWQgb2YgYW4gb2JqZWN0LgogICAgICAqIEBzZWUgT2JqZWN0T3V0cHV0U3RyZWFtI3dyaXRlT2JqZWN0T3ZlcnJpZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRPYmplY3RPdmVycmlkZSgpIHRocm93cyBPcHRpb25hbERhdGFFeGNlcHRpb24sCiAgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC0yMjI2LDI2ICsyMzY5LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYW5kIHJldHVybnMgcHJpbWl0aXZlIGRhdGEgb2YgdHlwZSBzaG9ydCBmcm9tIHRoZSByZWNlaXZlcgorICAgICAqIFJlYWRzIGEgc2hvcnQgKDE2IGJpdCkgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2hvcnQgc2F2ZWQgYXMgcHJpbWl0aXZlIGRhdGEgdXNpbmcKLSAgICAgKiAgICAgICAgIDxjb2RlPk9iamVjdE91dHB1dFN0cmVhbS53cml0ZVNob3J0KCk8L2NvZGU+Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgc2hvcnQgdmFsdWUgcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZXMucmVhZFNob3J0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYW5kIHZhbGlkYXRlcyB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gaGVhZGVyIGZyb20gdGhlIHJlY2VpdmVyCisgICAgICogUmVhZHMgYW5kIHZhbGlkYXRlcyB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gaGVhZGVyIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIHN0cmVhbSBoZWFkZXIuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkb2VzIG5vdCBjb250YWluIHNlcmlhbGl6ZWQgb2JqZWN0cwotICAgICAqICAgICAgICAgICAgIHRoYXQgY2FuIGJlIHJlYWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvdXJjZSBzdHJlYW0gZG9lcyBub3QgY29udGFpbiByZWFkYWJsZSBzZXJpYWxpemVkCisgICAgICogICAgICAgICAgICAgb2JqZWN0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZWFkU3RyZWFtSGVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIHsKQEAgLTIyNTcsNDkgKzI0MDAsNTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbmQgcmV0dXJucyBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGJ5dGUgKHVuc2lnbmVkKSBmcm9tIHRoZQotICAgICAqIHJlY2VpdmVyCisgICAgICogUmVhZHMgYW4gdW5zaWduZWQgYnl0ZSAoOCBiaXQpIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGJ5dGUgc2F2ZWQgYXMgcHJpbWl0aXZlIGRhdGEgdXNpbmcKLSAgICAgKiAgICAgICAgIDxjb2RlPk9iamVjdE91dHB1dFN0cmVhbS53cml0ZVVuc2lnbmVkQnl0ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHVuc2lnbmVkIGJ5dGUgdmFsdWUgcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtIHBhY2thZ2VkIGluCisgICAgICogICAgICAgICBhbiBpbnRlZ2VyLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIHByaW1pdGl2ZSBkYXRhLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCByZWFkVW5zaWduZWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVR5cGVzLnJlYWRVbnNpZ25lZEJ5dGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbmQgcmV0dXJucyBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIHNob3J0ICh1bnNpZ25lZCkgZnJvbSB0aGUKLSAgICAgKiByZWNlaXZlcgorICAgICAqIFJlYWRzIGFuIHVuc2lnbmVkIHNob3J0ICgxNiBiaXQpIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNob3J0IHNhdmVkIGFzIHByaW1pdGl2ZSBkYXRhIHVzaW5nCi0gICAgICogICAgICAgICA8Y29kZT5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVVbnNpZ25lZFNob3J0KCk8L2NvZGU+Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgdW5zaWduZWQgc2hvcnQgdmFsdWUgcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtIHBhY2thZ2VkIGluCisgICAgICogICAgICAgICBhbiBpbnRlZ2VyLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIHJlYWQKKyAgICAgKiAgICAgICAgICAgICByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIHByaW1pdGl2ZSBkYXRhLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCByZWFkVW5zaWduZWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBwcmltaXRpdmVUeXBlcy5yZWFkVW5zaWduZWRTaG9ydCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGFuZCByZXR1cm5zIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgU3RyaW5nIHJlYWQgaW4gVVRGIGZvcm1hdCBmcm9tCi0gICAgICogdGhlIHJlY2VpdmVyCisgICAgICogUmVhZHMgYSBzdHJpbmcgZW5jb2RlZCBpbiB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fSBmcm9tIHRoZQorICAgICAqIHNvdXJjZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyBzYXZlZCBhcyBwcmltaXRpdmUgZGF0YSB1c2luZwotICAgICAqICAgICAgICAgPGNvZGU+T2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlVVRGKCk8L2NvZGU+Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGVuY29kZWQgaW4ge0BsaW5rIERhdGFJbnB1dCBtb2RpZmllZCBVVEYtOH0gcmVhZCBmcm9tCisgICAgICogICAgICAgICB0aGUgc291cmNlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSByZWFkCisgICAgICogICAgICAgICAgICAgcmVxdWVzdCBjYW4gYmUgc2F0aXNmaWVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBwcmltaXRpdmVUeXBlcy5yZWFkVVRGKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBvYmplY3QgcHJldmlvdXNseSByZWFkIHRhZ2dlZCB3aXRoIGhhbmRsZSA8Y29kZT5oYW5kbGU8L2NvZGU+LgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IHByZXZpb3VzbHkgcmVhZCB0YWdnZWQgd2l0aCBoYW5kbGUge0Bjb2RlIGhhbmRsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGhhbmRsZQogICAgICAqICAgICAgICAgICAgVGhlIGhhbmRsZSB0aGF0IHRoaXMgb2JqZWN0IHdhcyBhc3NpZ25lZCB3aGVuIGl0IHdhcyByZWFkLgpAQCAtMjMyMCw4ICsyNDcwLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBc3N1bWUgb2JqZWN0IDxjb2RlPm9iajwvY29kZT4gaGFzIGJlZW4gcmVhZCwgYW5kIGFzc2lnbiBhIGhhbmRsZSB0bwotICAgICAqIGl0LCA8Y29kZT5oYW5kbGU8L2NvZGU+LgorICAgICAqIEFzc3VtZSBvYmplY3Qge0Bjb2RlIG9ian0gaGFzIGJlZW4gcmVhZCwgYW5kIGFzc2lnbiBhIGhhbmRsZSB0bworICAgICAqIGl0LCB7QGNvZGUgaGFuZGxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICogICAgICAgICAgICBOb24tbnVsbCBvYmplY3QgYmVpbmcgbG9hZGVkLgpAQCAtMjMzNywxOSArMjQ4NywyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIG9iamVjdCB2YWxpZGF0b3IgPGNvZGU+b2JqZWN0PC9jb2RlPiB0byBiZSBleGVjdXRlZCB0byBwZXJmb3JtCi0gICAgICogdmFsaWRhdGlvbiBvZiBvYmplY3RzIGxvYWRlZCBmcm9tIHRoZSByZWNlaXZlci4gVmFsaWRhdGlvbnMgd2lsbCBiZSBydW4KLSAgICAgKiBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIHByaW9yaXR5LCBkZWZpbmVkIGJ5IDxjb2RlPnByaW9yaXR5PC9jb2RlPi4KKyAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmb3IgcG9zdC1kZXNlcmlhbGl6YXRpb24gdmFsaWRhdGlvbiBvZiBvYmplY3RzLiBJdAorICAgICAqIGFsbG93cyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgY29uc2lzdGVuY3kgY2hlY2tzIGJlZm9yZSB0aGUge0Bjb2RlCisgICAgICogcmVhZE9iamVjdCgpfSBtZXRob2Qgb2YgdGhpcyBjbGFzcyByZXR1cm5zIGl0cyByZXN1bHQgdG8gdGhlIGNhbGxlci4gVGhpcworICAgICAqIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIHtAY29kZSByZWFkT2JqZWN0KCl9IG1ldGhvZCBvZgorICAgICAqIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICJzcGVjaWFsIiBkZXNlcmlhbGl6YXRpb24gcnVsZXMuIEl0IGNhbiBiZSBjYWxsZWQKKyAgICAgKiBtdWx0aXBsZSB0aW1lcy4gVmFsaWRhdGlvbiBjYWxsYmFja3MgYXJlIHRoZW4gZG9uZSBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCisgICAgICogcHJpb3JpdHksIGRlZmluZWQgYnkge0Bjb2RlIHByaW9yaXR5fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICBBbiBPYmplY3RJbnB1dFZhbGlkYXRpb24gdG8gdmFsaWRhdGUgb2JqZWN0cyBsb2FkZWQuCisgICAgICogICAgICAgICAgICBhbiBvYmplY3QgdGhhdCBjYW4gdmFsaWRhdGUgaXRzZWxmIGJ5IHJlY2VpdmluZyBhIGNhbGxiYWNrLgogICAgICAqIEBwYXJhbSBwcmlvcml0eQotICAgICAqICAgICAgICAgICAgdmFsaWRhdG9yIHByaW9yaXR5Ci0gICAgICogCi0gICAgICogQHRocm93cyBOb3RBY3RpdmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGZyb20gPGNvZGU+cmVhZE9iamVjdCgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIHZhbGlkYXRvcidzIHByaW9yaXR5LgogICAgICAqIEB0aHJvd3MgSW52YWxpZE9iamVjdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2JqZWN0fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBOb3RBY3RpdmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjdXJyZW50bHkgbm90IHJlYWRpbmcgb2JqZWN0cy4gSW4gdGhhdAorICAgICAqICAgICAgICAgICAgIGNhc2UsIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgbm90IGFsbG93ZWQuCisgICAgICogQHNlZSBPYmplY3RJbnB1dFZhbGlkYXRpb24jdmFsaWRhdGVPYmplY3QoKQogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlclZhbGlkYXRpb24oT2JqZWN0SW5wdXRWYWxpZGF0aW9uIG9iamVjdCwKICAgICAgICAgICAgIGludCBwcmlvcml0eSkgdGhyb3dzIE5vdEFjdGl2ZUV4Y2VwdGlvbiwgSW52YWxpZE9iamVjdEV4Y2VwdGlvbiB7CkBAIC0yNDE1LDE3ICsyNTcwLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9hZHMgdGhlIEphdmEgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgY2xhc3MgZGVzY3JpcHRvcgotICAgICAqIDxjb2RlPm9zQ2xhc3M8L2NvZGU+KE9iamVjdFN0cmVhbUNsYXNzKSBqdXN0IHJlYWQgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICogTG9hZHMgdGhlIEphdmEgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgY2xhc3MgZGVzY3JpcHRvciB7QGNvZGUKKyAgICAgKiBvc0NsYXNzfSB0aGF0IGhhcyBqdXN0IGJlZW4gcmVhZCBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvc0NsYXNzCi0gICAgICogICAgICAgICAgICBBbiBPYmplY3RTdHJlYW1DbGFzcyByZWFkIGZyb20gdGhlIHJlY2VpdmVyLgotICAgICAqIEByZXR1cm4gYSBDbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZXNjcmlwdG9yIGxvYWRlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW55IElPIHByb2JsZW0gb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGUgY2xhc3MuCisgICAgICogICAgICAgICAgICBhbiBPYmplY3RTdHJlYW1DbGFzcyByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAgICogQHJldHVybiBhIENsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlc2NyaXB0b3Ige0Bjb2RlIG9zQ2xhc3N9LgogICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3MgZm9yIGFuIG9iamVjdCBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIGNsYXNzLgorICAgICAqIEBzZWUgT2JqZWN0T3V0cHV0U3RyZWFtI2Fubm90YXRlQ2xhc3MoQ2xhc3MpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENsYXNzPD8+IHJlc29sdmVDbGFzcyhPYmplY3RTdHJlYW1DbGFzcyBvc0NsYXNzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKQEAgLTI0NDIsMjAgKzI1OTgsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJZiA8Y29kZT5lbmFibGVSZXNvbHZlT2JqZWN0KCk8L2NvZGU+IHdhcyBhY3RpdmF0ZWQsIGNvbXB1dGVzIHRoZQotICAgICAqIHJlcGxhY2VtZW50IG9iamVjdCBmb3IgdGhlIG9yaWdpbmFsIG9iamVjdCA8Y29kZT5vYmplY3Q8L2NvZGU+IGFuZAotICAgICAqIHJldHVybnMgdGhlIHJlcGxhY2VtZW50LiBPdGhlcndpc2UgcmV0dXJucyA8Y29kZT5vYmplY3Q8L2NvZGU+LgorICAgICAqIEFsbG93cyB0cnVzdGVkIHN1YmNsYXNzZXMgdG8gc3Vic3RpdHV0ZSB0aGUgc3BlY2lmaWVkIG9yaWdpbmFsIHtAY29kZQorICAgICAqIG9iamVjdH0gd2l0aCBhIG5ldyBvYmplY3QuIE9iamVjdCBzdWJzdGl0dXRpb24gaGFzIHRvIGJlIGFjdGl2YXRlZCBmaXJzdAorICAgICAqIHdpdGggY2FsbGluZyB7QGNvZGUgZW5hYmxlUmVzb2x2ZU9iamVjdCh0cnVlKX0uIFRoaXMgaW1wbGVtZW50YXRpb24ganVzdAorICAgICAqIHJldHVybnMge0Bjb2RlIG9iamVjdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgT3JpZ2luYWwgb2JqZWN0IGZvciB3aGljaCBhIHJlcGxhY2VtZW50IG1heSBiZSBkZWZpbmVkCi0gICAgICogQHJldHVybiBhIHBvc3NpYmx5IG5ldywgcmVwbGFjZW1lbnQgb2JqZWN0IGZvciA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgb2JqZWN0IGZvciB3aGljaCBhIHJlcGxhY2VtZW50IG1heSBiZSBkZWZpbmVkLgorICAgICAqIEByZXR1cm4gdGhlIHJlcGxhY2VtZW50IG9iamVjdCBmb3Ige0Bjb2RlIG9iamVjdH0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBJTyBwcm9ibGVtIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgdGhlIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSS9PIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgcmVwbGFjZW1lbnQKKyAgICAgKiAgICAgICAgICAgICBvYmplY3QuCiAgICAgICogQHNlZSAjZW5hYmxlUmVzb2x2ZU9iamVjdAogICAgICAqIEBzZWUgT2JqZWN0T3V0cHV0U3RyZWFtI2VuYWJsZVJlcGxhY2VPYmplY3QKICAgICAgKiBAc2VlIE9iamVjdE91dHB1dFN0cmVhbSNyZXBsYWNlT2JqZWN0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCByZXNvbHZlT2JqZWN0KE9iamVjdCBvYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEJ5IGRlZmF1bHQgbm8gb2JqZWN0IHJlcGxhY2VtZW50LiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZQpAQCAtMjQ2MywxMiArMjYyMCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCBhIGdpdmVuIGRlY2xhcmVkIGZpZWxkIG5hbWVkIDxjb2RlPmZpZWxkTmFtZTwvY29kZT4gb2YKLSAgICAgKiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gdG8gdGhlIG5ldyA8Y29kZT5ieXRlPC9jb2RlPiB2YWx1ZQotICAgICAqIDxjb2RlPnZhbHVlPC9jb2RlPi4KKyAgICAgKiBTZXQgYSBnaXZlbiBkZWNsYXJlZCBmaWVsZCBuYW1lZCB7QGNvZGUgZmllbGROYW1lfSBvZgorICAgICAqIHtAY29kZSBpbnN0YW5jZX0gdG8gdGhlIG5ldyB7QGNvZGUgYnl0ZX0gdmFsdWUKKyAgICAgKiB7QGNvZGUgdmFsdWV9LgogICAgICAqIAogICAgICAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGltcGxlbWVudGVkIG5vbi1uYXRpdmVseSBvbiB0b3Agb2YgamF2YS5sYW5nLnJlZmxlY3QKLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IHRoZSA8Y29kZT5zZXRBY2Nlc3NpYmxlPC9jb2RlPiBBUEksIGF0IHRoZQorICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIHtAY29kZSBzZXRBY2Nlc3NpYmxlfSBBUEksIGF0IHRoZQogICAgICAqIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uIChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkuIE90aGVyd2lzZQogICAgICAqIFNlcmlhbGl6YXRpb24gY291bGQgbm90IHNldCBwcml2YXRlIGZpZWxkcywgZXhjZXB0IGJ5IHRoZSB1c2Ugb2YgYSBuYXRpdmUKICAgICAgKiBtZXRob2QgbGlrZSB0aGlzIG9uZS4KQEAgLTI0NzYsNyArMjYzMyw3IEBACiAgICAgICogQHBhcmFtIGluc3RhbmNlCiAgICAgICogICAgICAgICAgICBPYmplY3Qgd2hvc2UgZmllbGQgdG8gc2V0CiAgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzCi0gICAgICogICAgICAgICAgICA8Y29kZT5pbnN0YW5jZTwvY29kZT4ncyBkZWNsYXJpbmcgY2xhc3MKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBpbnN0YW5jZX0ncyBkZWNsYXJpbmcgY2xhc3MKICAgICAgKiBAcGFyYW0gZmllbGROYW1lCiAgICAgICogICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWVsZCB0byBzZXQKICAgICAgKiBAcGFyYW0gdmFsdWUKQEAgLTI0OTAsMTIgKzI2NDcsMTIgQEAKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hGaWVsZEVycm9yOwogCiAgICAgLyoqCi0gICAgICogU2V0IGEgZ2l2ZW4gZGVjbGFyZWQgZmllbGQgbmFtZWQgPGNvZGU+ZmllbGROYW1lPC9jb2RlPiBvZgotICAgICAqIDxjb2RlPmluc3RhbmNlPC9jb2RlPiB0byB0aGUgbmV3IDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlCi0gICAgICogPGNvZGU+dmFsdWU8L2NvZGU+LgorICAgICAqIFNldCBhIGdpdmVuIGRlY2xhcmVkIGZpZWxkIG5hbWVkIHtAY29kZSBmaWVsZE5hbWV9IG9mCisgICAgICoge0Bjb2RlIGluc3RhbmNlfSB0byB0aGUgbmV3IHtAY29kZSBjaGFyfSB2YWx1ZQorICAgICAqIHtAY29kZSB2YWx1ZX0uCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdAotICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlCisgICAgICogaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlCiAgICAgICogZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24gKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlCiAgICAgICogU2VyaWFsaXphdGlvbiBjb3VsZCBub3Qgc2V0IHByaXZhdGUgZmllbGRzLCBleGNlcHQgYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZQogICAgICAqIG1ldGhvZCBsaWtlIHRoaXMgb25lLgpAQCAtMjUwMyw3ICsyNjYwLDcgQEAKICAgICAgKiBAcGFyYW0gaW5zdGFuY2UKICAgICAgKiAgICAgICAgICAgIE9iamVjdCB3aG9zZSBmaWVsZCB0byBzZXQKICAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmluc3RhbmNlPC9jb2RlPidzIGRlY2xhcmluZyBjbGFzcworICAgICAqICAgICAgICAgICAge0Bjb2RlIGluc3RhbmNlfSdzIGRlY2xhcmluZyBjbGFzcwogICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKICAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHNldAogICAgICAqIEBwYXJhbSB2YWx1ZQpAQCAtMjUxNywxMiArMjY3NCwxMiBAQAogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEZpZWxkRXJyb3I7CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBnaXZlbiBkZWNsYXJlZCBmaWVsZCBuYW1lZCA8Y29kZT5maWVsZE5hbWU8L2NvZGU+IG9mCi0gICAgICogPGNvZGU+aW5zdGFuY2U8L2NvZGU+IHRvIHRoZSBuZXcgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZQotICAgICAqIDxjb2RlPnZhbHVlPC9jb2RlPi4KKyAgICAgKiBTZXQgYSBnaXZlbiBkZWNsYXJlZCBmaWVsZCBuYW1lZCB7QGNvZGUgZmllbGROYW1lfSBvZgorICAgICAqIHtAY29kZSBpbnN0YW5jZX0gdG8gdGhlIG5ldyB7QGNvZGUgZG91YmxlfSB2YWx1ZQorICAgICAqIHtAY29kZSB2YWx1ZX0uCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdAotICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlCisgICAgICogaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlCiAgICAgICogZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24gKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlCiAgICAgICogU2VyaWFsaXphdGlvbiBjb3VsZCBub3Qgc2V0IHByaXZhdGUgZmllbGRzLCBleGNlcHQgYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZQogICAgICAqIG1ldGhvZCBsaWtlIHRoaXMgb25lLgpAQCAtMjUzMCw3ICsyNjg3LDcgQEAKICAgICAgKiBAcGFyYW0gaW5zdGFuY2UKICAgICAgKiAgICAgICAgICAgIE9iamVjdCB3aG9zZSBmaWVsZCB0byBzZXQKICAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmluc3RhbmNlPC9jb2RlPidzIGRlY2xhcmluZyBjbGFzcworICAgICAqICAgICAgICAgICAge0Bjb2RlIGluc3RhbmNlfSdzIGRlY2xhcmluZyBjbGFzcwogICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKICAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHNldAogICAgICAqIEBwYXJhbSB2YWx1ZQpAQCAtMjU0NCwxMiArMjcwMSwxMiBAQAogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEZpZWxkRXJyb3I7CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBnaXZlbiBkZWNsYXJlZCBmaWVsZCBuYW1lZCA8Y29kZT5maWVsZE5hbWU8L2NvZGU+IG9mCi0gICAgICogPGNvZGU+aW5zdGFuY2U8L2NvZGU+IHRvIHRoZSBuZXcgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlCi0gICAgICogPGNvZGU+dmFsdWU8L2NvZGU+LgorICAgICAqIFNldCBhIGdpdmVuIGRlY2xhcmVkIGZpZWxkIG5hbWVkIHtAY29kZSBmaWVsZE5hbWV9IG9mCisgICAgICoge0Bjb2RlIGluc3RhbmNlfSB0byB0aGUgbmV3IHtAY29kZSBmbG9hdH0gdmFsdWUKKyAgICAgKiB7QGNvZGUgdmFsdWV9LgogICAgICAqIAogICAgICAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGltcGxlbWVudGVkIG5vbi1uYXRpdmVseSBvbiB0b3Agb2YgamF2YS5sYW5nLnJlZmxlY3QKLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IHRoZSA8Y29kZT5zZXRBY2Nlc3NpYmxlPC9jb2RlPiBBUEksIGF0IHRoZQorICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIHtAY29kZSBzZXRBY2Nlc3NpYmxlfSBBUEksIGF0IHRoZQogICAgICAqIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uIChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkuIE90aGVyd2lzZQogICAgICAqIFNlcmlhbGl6YXRpb24gY291bGQgbm90IHNldCBwcml2YXRlIGZpZWxkcywgZXhjZXB0IGJ5IHRoZSB1c2Ugb2YgYSBuYXRpdmUKICAgICAgKiBtZXRob2QgbGlrZSB0aGlzIG9uZS4KQEAgLTI1NTcsNyArMjcxNCw3IEBACiAgICAgICogQHBhcmFtIGluc3RhbmNlCiAgICAgICogICAgICAgICAgICBPYmplY3Qgd2hvc2UgZmllbGQgdG8gc2V0CiAgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzCi0gICAgICogICAgICAgICAgICA8Y29kZT5pbnN0YW5jZTwvY29kZT4ncyBkZWNsYXJpbmcgY2xhc3MKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBpbnN0YW5jZX0ncyBkZWNsYXJpbmcgY2xhc3MKICAgICAgKiBAcGFyYW0gZmllbGROYW1lCiAgICAgICogICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWVsZCB0byBzZXQKICAgICAgKiBAcGFyYW0gdmFsdWUKQEAgLTI1NzEsMTIgKzI3MjgsMTIgQEAKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hGaWVsZEVycm9yOwogCiAgICAgLyoqCi0gICAgICogU2V0IGEgZ2l2ZW4gZGVjbGFyZWQgZmllbGQgbmFtZWQgPGNvZGU+ZmllbGROYW1lPC9jb2RlPiBvZgotICAgICAqIDxjb2RlPmluc3RhbmNlPC9jb2RlPiB0byB0aGUgbmV3IDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICAgKiA8Y29kZT52YWx1ZTwvY29kZT4uCisgICAgICogU2V0IGEgZ2l2ZW4gZGVjbGFyZWQgZmllbGQgbmFtZWQge0Bjb2RlIGZpZWxkTmFtZX0gb2YKKyAgICAgKiB7QGNvZGUgaW5zdGFuY2V9IHRvIHRoZSBuZXcge0Bjb2RlIGludH0gdmFsdWUKKyAgICAgKiB7QGNvZGUgdmFsdWV9LgogICAgICAqIAogICAgICAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGltcGxlbWVudGVkIG5vbi1uYXRpdmVseSBvbiB0b3Agb2YgamF2YS5sYW5nLnJlZmxlY3QKLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IHRoZSA8Y29kZT5zZXRBY2Nlc3NpYmxlPC9jb2RlPiBBUEksIGF0IHRoZQorICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIHtAY29kZSBzZXRBY2Nlc3NpYmxlfSBBUEksIGF0IHRoZQogICAgICAqIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uIChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkuIE90aGVyd2lzZQogICAgICAqIFNlcmlhbGl6YXRpb24gY291bGQgbm90IHNldCBwcml2YXRlIGZpZWxkcywgZXhjZXB0IGJ5IHRoZSB1c2Ugb2YgYSBuYXRpdmUKICAgICAgKiBtZXRob2QgbGlrZSB0aGlzIG9uZS4KQEAgLTI1ODQsNyArMjc0MSw3IEBACiAgICAgICogQHBhcmFtIGluc3RhbmNlCiAgICAgICogICAgICAgICAgICBPYmplY3Qgd2hvc2UgZmllbGQgdG8gc2V0CiAgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzCi0gICAgICogICAgICAgICAgICA8Y29kZT5pbnN0YW5jZTwvY29kZT4ncyBkZWNsYXJpbmcgY2xhc3MKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBpbnN0YW5jZX0ncyBkZWNsYXJpbmcgY2xhc3MKICAgICAgKiBAcGFyYW0gZmllbGROYW1lCiAgICAgICogICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWVsZCB0byBzZXQKICAgICAgKiBAcGFyYW0gdmFsdWUKQEAgLTI1OTgsMTIgKzI3NTUsMTIgQEAKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hGaWVsZEVycm9yOwogCiAgICAgLyoqCi0gICAgICogU2V0IGEgZ2l2ZW4gZGVjbGFyZWQgZmllbGQgbmFtZWQgPGNvZGU+ZmllbGROYW1lPC9jb2RlPiBvZgotICAgICAqIDxjb2RlPmluc3RhbmNlPC9jb2RlPiB0byB0aGUgbmV3IDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlCi0gICAgICogPGNvZGU+dmFsdWU8L2NvZGU+LgorICAgICAqIFNldCBhIGdpdmVuIGRlY2xhcmVkIGZpZWxkIG5hbWVkIHtAY29kZSBmaWVsZE5hbWV9IG9mCisgICAgICoge0Bjb2RlIGluc3RhbmNlfSB0byB0aGUgbmV3IHtAY29kZSBsb25nfSB2YWx1ZQorICAgICAqIHtAY29kZSB2YWx1ZX0uCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdAotICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlCisgICAgICogaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlCiAgICAgICogZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24gKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlCiAgICAgICogU2VyaWFsaXphdGlvbiBjb3VsZCBub3Qgc2V0IHByaXZhdGUgZmllbGRzLCBleGNlcHQgYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZQogICAgICAqIG1ldGhvZCBsaWtlIHRoaXMgb25lLgpAQCAtMjYxMSw3ICsyNzY4LDcgQEAKICAgICAgKiBAcGFyYW0gaW5zdGFuY2UKICAgICAgKiAgICAgICAgICAgIE9iamVjdCB3aG9zZSBmaWVsZCB0byBzZXQKICAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmluc3RhbmNlPC9jb2RlPidzIGRlY2xhcmluZyBjbGFzcworICAgICAqICAgICAgICAgICAge0Bjb2RlIGluc3RhbmNlfSdzIGRlY2xhcmluZyBjbGFzcwogICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKICAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHNldAogICAgICAqIEBwYXJhbSB2YWx1ZQpAQCAtMjYyNSwxMSArMjc4MiwxMSBAQAogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEZpZWxkRXJyb3I7CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBnaXZlbiBkZWNsYXJlZCBmaWVsZCBuYW1lZCA8Y29kZT5maWVsZE5hbWU8L2NvZGU+IG9mCi0gICAgICogPGNvZGU+aW5zdGFuY2U8L2NvZGU+IHRvIHRoZSBuZXcgdmFsdWUgPGNvZGU+dmFsdWU8L2NvZGU+LgorICAgICAqIFNldCBhIGdpdmVuIGRlY2xhcmVkIGZpZWxkIG5hbWVkIHtAY29kZSBmaWVsZE5hbWV9IG9mCisgICAgICoge0Bjb2RlIGluc3RhbmNlfSB0byB0aGUgbmV3IHZhbHVlIHtAY29kZSB2YWx1ZX0uCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdAotICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlCisgICAgICogaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlCiAgICAgICogZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24gKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlCiAgICAgICogU2VyaWFsaXphdGlvbiBjb3VsZCBub3Qgc2V0IHByaXZhdGUgZmllbGRzLCBleGNlcHQgYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZQogICAgICAqIG1ldGhvZCBsaWtlIHRoaXMgb25lLgpAQCAtMjY1MywxMiArMjgxMCwxMiBAQAogICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFcnJvcjsKIAogICAgIC8qKgotICAgICAqIFNldCBhIGdpdmVuIGRlY2xhcmVkIGZpZWxkIG5hbWVkIDxjb2RlPmZpZWxkTmFtZTwvY29kZT4gb2YKLSAgICAgKiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gdG8gdGhlIG5ldyA8Y29kZT5zaG9ydDwvY29kZT4gdmFsdWUKLSAgICAgKiA8Y29kZT52YWx1ZTwvY29kZT4uCisgICAgICogU2V0IGEgZ2l2ZW4gZGVjbGFyZWQgZmllbGQgbmFtZWQge0Bjb2RlIGZpZWxkTmFtZX0gb2YKKyAgICAgKiB7QGNvZGUgaW5zdGFuY2V9IHRvIHRoZSBuZXcge0Bjb2RlIHNob3J0fSB2YWx1ZQorICAgICAqIHtAY29kZSB2YWx1ZX0uCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdAotICAgICAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlCisgICAgICogaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlCiAgICAgICogZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24gKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlCiAgICAgICogU2VyaWFsaXphdGlvbiBjb3VsZCBub3Qgc2V0IHByaXZhdGUgZmllbGRzLCBleGNlcHQgYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZQogICAgICAqIG1ldGhvZCBsaWtlIHRoaXMgb25lLgpAQCAtMjY2Niw3ICsyODIzLDcgQEAKICAgICAgKiBAcGFyYW0gaW5zdGFuY2UKICAgICAgKiAgICAgICAgICAgIE9iamVjdCB3aG9zZSBmaWVsZCB0byBzZXQKICAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmluc3RhbmNlPC9jb2RlPidzIGRlY2xhcmluZyBjbGFzcworICAgICAqICAgICAgICAgICAge0Bjb2RlIGluc3RhbmNlfSdzIGRlY2xhcmluZyBjbGFzcwogICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKICAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHNldAogICAgICAqIEBwYXJhbSB2YWx1ZQpAQCAtMjY4MCwxMiArMjgzNywxMiBAQAogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEZpZWxkRXJyb3I7CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBnaXZlbiBkZWNsYXJlZCBmaWVsZCBuYW1lZCA8Y29kZT5maWVsZE5hbWU8L2NvZGU+IG9mCi0gICAgICogPGNvZGU+aW5zdGFuY2U8L2NvZGU+IHRvIHRoZSBuZXcgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLSAgICAgKiA8Y29kZT52YWx1ZTwvY29kZT4uCisgICAgICogU2V0IGEgZ2l2ZW4gZGVjbGFyZWQgZmllbGQgbmFtZWQge0Bjb2RlIGZpZWxkTmFtZX0gb2YKKyAgICAgKiB7QGNvZGUgaW5zdGFuY2V9IHRvIHRoZSBuZXcge0Bjb2RlIGJvb2xlYW59IHZhbHVlCisgICAgICoge0Bjb2RlIHZhbHVlfS4KICAgICAgKiAKICAgICAgKiBUaGlzIG1ldGhvZCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBub24tbmF0aXZlbHkgb24gdG9wIG9mIGphdmEubGFuZy5yZWZsZWN0Ci0gICAgICogaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydCB0aGUgPGNvZGU+c2V0QWNjZXNzaWJsZTwvY29kZT4gQVBJLCBhdCB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IHRoZSB7QGNvZGUgc2V0QWNjZXNzaWJsZX0gQVBJLCBhdCB0aGUKICAgICAgKiBleHBlbnNlIG9mIGV4dHJhIG9iamVjdCBjcmVhdGlvbiAoamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpLiBPdGhlcndpc2UKICAgICAgKiBTZXJpYWxpemF0aW9uIGNvdWxkIG5vdCBzZXQgcHJpdmF0ZSBmaWVsZHMsIGV4Y2VwdCBieSB0aGUgdXNlIG9mIGEgbmF0aXZlCiAgICAgICogbWV0aG9kIGxpa2UgdGhpcyBvbmUuCkBAIC0yNjkzLDcgKzI4NTAsNyBAQAogICAgICAqIEBwYXJhbSBpbnN0YW5jZQogICAgICAqICAgICAgICAgICAgT2JqZWN0IHdob3NlIGZpZWxkIHRvIHNldAogICAgICAqIEBwYXJhbSBkZWNsYXJpbmdDbGFzcwotICAgICAqICAgICAgICAgICAgPGNvZGU+aW5zdGFuY2U8L2NvZGU+J3MgZGVjbGFyaW5nIGNsYXNzCisgICAgICogICAgICAgICAgICB7QGNvZGUgaW5zdGFuY2V9J3MgZGVjbGFyaW5nIGNsYXNzCiAgICAgICogQHBhcmFtIGZpZWxkTmFtZQogICAgICAqICAgICAgICAgICAgTmFtZSBvZiB0aGUgZmllbGQgdG8gc2V0CiAgICAgICogQHBhcmFtIHZhbHVlCkBAIC0yNzA3LDE3ICsyODY0LDE4IEBACiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoRmllbGRFcnJvcjsKIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmxlbmd0aDwvY29kZT4gYnl0ZXMgb2YgcHJpbWl0aXZlIGRhdGEgZnJvbSB0aGUgcmVjZWl2ZXIuIEl0Ci0gICAgICogc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHNraXAgYnl0ZXMgYXQgYW55IGFyYml0cmFyeSBwb3NpdGlvbjsganVzdCB3aGVuCi0gICAgICogcmVhZGluZyBwcmltaXRpdmUgZGF0YSB0eXBlcyAoaW50cywgY2hhcnMsIGV0YykuCi0gICAgICogCisgICAgICogU2tpcHMge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgb24gdGhlIHNvdXJjZSBzdHJlYW0uIFRoaXMgbWV0aG9kIHNob3VsZCBub3QKKyAgICAgKiBiZSB1c2VkIHRvIHNraXAgYnl0ZXMgYXQgYW55IGFyYml0cmFyeSBwb3NpdGlvbiwganVzdCB3aGVuIHJlYWRpbmcKKyAgICAgKiBwcmltaXRpdmUgZGF0YSB0eXBlcyAoaW50LCBjaGFyIGV0YykuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgSG93IG1hbnkgYnl0ZXMgdG8gc2tpcAotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc2tpcHBlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW55IElPIHByb2JsZW0gb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gc2tpcCB0aGUgYnl0ZXMuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNraXBwaW5nIGJ5dGVzIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc291cmNlIHN0cmVhbSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBza2lwQnl0ZXMoaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVG8gYmUgdXNlZCB3aXRoIGF2YWlsYWJsZS4gT2sgdG8gY2FsbCBpZiByZWFkaW5nIHByaW1pdGl2ZSBidWZmZXIKQEAgLTI3MzgsNyArMjg5Niw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVmVyaWZ5IGlmIHRoZSBTVUlEIGZvciBkZXNjcmlwdG9yIDxjb2RlPmxvYWRlZFN0cmVhbUNsYXNzPC9jb2RlPm1hdGNoZXMKKyAgICAgKiBWZXJpZnkgaWYgdGhlIFNVSUQgZm9yIGRlc2NyaXB0b3Ige0Bjb2RlIGxvYWRlZFN0cmVhbUNsYXNzfW1hdGNoZXMKICAgICAgKiB0aGUgU1VJRCBvZiB0aGUgY29ycmVzcG9uZGluZyBsb2FkZWQgY2xhc3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvYWRlZFN0cmVhbUNsYXNzCkBAIC0yNzY3LDcgKzI5MjUsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFZlcmlmeSBpZiB0aGUgYmFzZSBuYW1lIGZvciBkZXNjcmlwdG9yIDxjb2RlPmxvYWRlZFN0cmVhbUNsYXNzPC9jb2RlPgorICAgICAqIFZlcmlmeSBpZiB0aGUgYmFzZSBuYW1lIGZvciBkZXNjcmlwdG9yIHtAY29kZSBsb2FkZWRTdHJlYW1DbGFzc30KICAgICAgKiBtYXRjaGVzIHRoZSBiYXNlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbG9hZGVkIGNsYXNzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2FkZWRTdHJlYW1DbGFzcwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0SW5wdXRWYWxpZGF0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RJbnB1dFZhbGlkYXRpb24uamF2YQppbmRleCBiM2QyYzFhLi5mMWNhZTc0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RJbnB1dFZhbGlkYXRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RJbnB1dFZhbGlkYXRpb24uamF2YQpAQCAtMTgsMTkgKzE4LDIyIEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogT2JqZWN0cyB0byBwZXJmb3JtIHZhbGlkYXRpb25zIG9uIG90aGVyIG9iamVjdHMgcmVhZCB3aXRoIHNlcmlhbGl6YXRpb24KLSAqIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEFuIG9iamVjdCdzIDxjb2RlPnJlYWRPYmplY3QoKTwvY29kZT4gY2FuCi0gKiBjYWxsIDxjb2RlPk9iamVjdElucHV0U3RyZWFtLnJlZ2lzdGVyVmFsaWRhdGlvbigpPC9jb2RlPiBwYXNzaW5nIGFuIG9iamVjdAotICogdGhhdCBpbXBsZW1lbnRzIE9iamVjdElucHV0VmFsaWRhdGlvbi4KKyAqIEEgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBwb3N0LWRlc2VyaWFsaXphdGlvbiBjaGVja3Mgb24gb2JqZWN0cy4gQWxsb3dzLCBmb3IKKyAqIGV4YW1wbGUsIHRoZSB2YWxpZGF0aW9uIG9mIGEgd2hvbGUgZ3JhcGggb2Ygb2JqZWN0cyBhZnRlciBhbGwgb2YgdGhlbSBoYXZlCisgKiBiZWVuIGxvYWRlZC4KICAqIAogICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbQorICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSNyZWdpc3RlclZhbGlkYXRpb24oT2JqZWN0SW5wdXRWYWxpZGF0aW9uLCBpbnQpCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE9iamVjdElucHV0VmFsaWRhdGlvbiB7CiAgICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGFuIG9iamVjdCByZWFkIHdpdGggc2VyaWFsaXphdGlvbi4KKyAgICAgKiBWYWxpZGF0ZXMgdGhpcyBvYmplY3QuCiAgICAgICogCiAgICAgICogQHRocm93cyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHJlY2VpdmVyIGZhaWxzIHRvIHZhbGlkYXRlIHRoZSBvYmplY3QgcmVhZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgb2JqZWN0IGZhaWxzIHRvIHZhbGlkYXRlIGl0c2VsZi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZU9iamVjdCgpIHRocm93cyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0T3V0cHV0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RPdXRwdXQuamF2YQppbmRleCA3MTMwNGUyLi5jZDY4NDM5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RPdXRwdXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RPdXRwdXQuamF2YQpAQCAtMTgsNzkgKzE4LDg1IEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogU3RyZWFtcyB0byBiZSB1c2VkIHdpdGggc2VyaWFsaXphdGlvbiB0byB3cml0ZSBvYmplY3RzIG11c3QgaW1wbGVtZW50IHRoaXMKLSAqIGludGVyZmFjZS4gT2JqZWN0T3V0cHV0U3RyZWFtIGlzIG9uZSBleGFtcGxlLgorICogRGVmaW5lcyBhbiBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBhbGxvdyByZWFkaW5nIHNlcmlhbGl6ZWQgb2JqZWN0cy4KICAqIAogICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0KICAqIEBzZWUgT2JqZWN0SW5wdXQKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0T3V0cHV0IGV4dGVuZHMgRGF0YU91dHB1dCB7CiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyBPYmplY3RPdXRwdXQuIENvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIHNob3VsZAotICAgICAqIGZyZWUgYW55IHJlc291cmNlcyBkdXJpbmcgY2xvc2UuCisgICAgICogQ2xvc2VzIHRoZSB0YXJnZXQgc3RyZWFtLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGZyZWUgYW55CisgICAgICogcmVzb3VyY2VzIHVzZWQgYnkgdGhlIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhpcyBPYmplY3RPdXRwdXQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBGbHVzaCB0aGlzIE9iamVjdE91dHB1dC4gQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3Mgc2hvdWxkCi0gICAgICogZW5zdXJlIGFueSBwZW5kaW5nIHdyaXRlcyBhcmUgd3JpdHRlbiBvdXQgd2hlbiB0aGlzIG1ldGhvZCBpcyBlbnZva2VkLgorICAgICAqIEZsdXNoZXMgdGhlIHRhcmdldCBzdHJlYW0uIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgZW5zdXJlCisgICAgICogdGhhdCBhbnkgcGVuZGluZyB3cml0ZXMgYXJlIHdyaXR0ZW4gb3V0IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGlzIE9iamVjdE91dHB1dC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZmx1c2hpbmcgdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHRvCi0gICAgICogdGhpcyBPYmplY3RPdXRwdXQuCisgICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gdG8gdGhlIG91dHB1dAorICAgICAqIHN0cmVhbS4gQmxvY2tzIHVudGlsIGFsbCBieXRlcyBhcmUgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzIE9iamVjdE91dHB1dC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gPGNvZGU+Ynl0ZXM8L2NvZGU+IGZyb20gdGhpcyBieXRlIGFycmF5Ci0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCBvZmZzZXQgPGNvZGU+aW5kZXg8L2NvZGU+IHRvIHRoaXMKLSAgICAgKiBPYmplY3RPdXRwdXQuCisgICAgICogV3JpdGVzIHtAY29kZSBjb3VudH0gYnl0ZXMgZnJvbSB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdAorICAgICAqIHBvc2l0aW9uIHtAY29kZSBvZmZzZXR9IHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBCbG9ja3MgdW50aWwgYWxsIGJ5dGVzIGFyZQorICAgICAqIHdyaXR0ZW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBidWZmZXIgdG8gZ2V0IGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgaW4gYnVmZmVyIHRvIHdyaXRlCi0gICAgICogCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBPYmplY3RPdXRwdXQuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20ge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUgdG8gdGhlIHRhcmdldAorICAgICAqICAgICAgICAgICAgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGludCA8Y29kZT52YWx1ZTwvY29kZT4gdG8gdGhpcyBPYmplY3RPdXRwdXQuCisgICAgICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uIE9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50CisgICAgICogYnl0ZSBvZiB0aGUgaW50ZWdlciB7QGNvZGUgdmFsdWV9IGlzIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4gQmxvY2tzIHVudGlsCisgICAgICogdGhlIGJ5dGUgaXMgYWN0dWFsbHkgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgT2JqZWN0T3V0cHV0LgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gd3JpdGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IDxjb2RlPm9iajwvY29kZT4gdG8gdGhpcyBPYmplY3RPdXRwdXQuCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHtAY29kZSBvYmp9IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYmUgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgT2JqZWN0T3V0cHV0LgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0T3V0cHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RPdXRwdXRTdHJlYW0uamF2YQppbmRleCBiM2UwNDgxLi41ZGE0OTUwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RPdXRwdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjYsMTQgKzI2LDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Qcml2aUFjdGlvbjsKIAogLyoqCi0gKiBBbiBPYmplY3RPdXRwdXRTdHJlYW0gY2FuIGJlIHVzZWQgdG8gc2F2ZSBKYXZhIG9iamVjdHMgaW50byBhIHN0cmVhbSB3aGVyZQotICogdGhlIG9iamVjdHMgY2FuIGJlIGxvYWRlZCBsYXRlciB3aXRoIGFuIE9iamVjdElucHV0U3RyZWFtLiBQcmltaXRpdmUgZGF0YQotICogKGludHMsIGJ5dGVzLCBjaGFycywgZXRjKSBjYW4gYWxzbyBiZSBzYXZlZC4KKyAqIEEgc3BlY2lhbGl6ZWQge0BsaW5rIE91dHB1dFN0cmVhbX0gdGhhdCBpcyBhYmxlIHRvIHdyaXRlIChzZXJpYWxpemUpIEphdmEKKyAqIG9iamVjdHMgYXMgd2VsbCBhcyBwcmltaXRpdmUgZGF0YSB0eXBlcyAoaW50LCBieXRlLCBjaGFyIGV0Yy4pLiBUaGUgZGF0YSBjYW4KKyAqIGxhdGVyIGJlIGxvYWRlZCB1c2luZyBhbiBPYmplY3RJbnB1dFN0cmVhbS4KICAqIAogICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbQogICogQHNlZSBPYmplY3RPdXRwdXQKICAqIEBzZWUgU2VyaWFsaXphYmxlCiAgKiBAc2VlIEV4dGVybmFsaXphYmxlCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgT2JqZWN0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgT2JqZWN0T3V0cHV0LAogICAgICAgICBPYmplY3RTdHJlYW1Db25zdGFudHMgewpAQCAtMTExLDQ0ICsxMTMsMTQ3IEBACiAgICAgcHJpdmF0ZSBJZGVudGl0eUhhc2hNYXA8Q2xhc3M8Pz4sIE9iamVjdD4gd3JpdGVSZXBsYWNlQ2FjaGU7CiAKICAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyB0byBwcm92aWRlIGFjY2VzcyB0byBzZXJpYWxpemFibGUgZmllbGRzCisgICAgICogUHV0RmllbGQgaXMgYW4gaW5uZXIgY2xhc3MgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICogdGhhdCBhcmUgd3JpdHRlbiB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFB1dEZpZWxkIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dHMgdGhlIHZhbHVlIG9mIHRoZSBib29sZWFuIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IHRvIHRoZQorICAgICAgICAgKiBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gc2VyaWFsaXplLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdGhhdCBpcyBwdXQgdG8gdGhlIHBlcnNpc3RlbnQgZmllbGQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogUHV0cyB0aGUgdmFsdWUgb2YgdGhlIGNoYXJhY3RlciBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfSB0bworICAgICAgICAgKiB0aGUgcGVyc2lzdGVudCBmaWVsZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHNlcmlhbGl6ZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRoYXQgaXMgcHV0IHRvIHRoZSBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dChTdHJpbmcgbmFtZSwgY2hhciB2YWx1ZSk7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dHMgdGhlIHZhbHVlIG9mIHRoZSBieXRlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IHRvIHRoZQorICAgICAgICAgKiBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gc2VyaWFsaXplLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdGhhdCBpcyBwdXQgdG8gdGhlIHBlcnNpc3RlbnQgZmllbGQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KFN0cmluZyBuYW1lLCBieXRlIHZhbHVlKTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogUHV0cyB0aGUgdmFsdWUgb2YgdGhlIHNob3J0IGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IHRvIHRoZQorICAgICAgICAgKiBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gc2VyaWFsaXplLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdGhhdCBpcyBwdXQgdG8gdGhlIHBlcnNpc3RlbnQgZmllbGQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KFN0cmluZyBuYW1lLCBzaG9ydCB2YWx1ZSk7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dHMgdGhlIHZhbHVlIG9mIHRoZSBpbnRlZ2VyIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IHRvIHRoZQorICAgICAgICAgKiBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gc2VyaWFsaXplLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdGhhdCBpcyBwdXQgdG8gdGhlIHBlcnNpc3RlbnQgZmllbGQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXRzIHRoZSB2YWx1ZSBvZiB0aGUgbG9uZyBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfSB0byB0aGUKKyAgICAgICAgICogcGVyc2lzdGVudCBmaWVsZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHNlcmlhbGl6ZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRoYXQgaXMgcHV0IHRvIHRoZSBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSk7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dHMgdGhlIHZhbHVlIG9mIHRoZSBmbG9hdCBmaWVsZCBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfSB0byB0aGUKKyAgICAgICAgICogcGVyc2lzdGVudCBmaWVsZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHNlcmlhbGl6ZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRoYXQgaXMgcHV0IHRvIHRoZSBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXRzIHRoZSB2YWx1ZSBvZiB0aGUgZG91YmxlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IHRvIHRoZQorICAgICAgICAgKiBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gc2VyaWFsaXplLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdGhhdCBpcyBwdXQgdG8gdGhlIHBlcnNpc3RlbnQgZmllbGQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXRzIHRoZSB2YWx1ZSBvZiB0aGUgT2JqZWN0IGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IHRvIHRoZQorICAgICAgICAgKiBwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gc2VyaWFsaXplLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdGhhdCBpcyBwdXQgdG8gdGhlIHBlcnNpc3RlbnQgZmllbGQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyB1bnNhZmUgYW5kIG1heSBjb3JydXB0IHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgKiBXcml0ZXMgdGhlIGZpZWxkcyB0byB0aGUgdGFyZ2V0IHN0cmVhbSB7QGNvZGUgb3V0fS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBvdXQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHN0cmVhbQorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyB1bnNhZmUgYW5kIG1heSBjb3JydXB0IHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAgICAgKiAgICAgICAgICAgICBVc2UgT2JqZWN0T3V0cHV0U3RyZWFtI3dyaXRlRmllbGRzKCkgaW5zdGVhZC4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBARGVwcmVjYXRlZAogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5PYmplY3RPdXRwdXRTdHJlYW08L2NvZGU+LiBUaGUgcmVwcmVzZW50YXRpb24KLSAgICAgKiBhbmQgcHJvcGVyIGluaXRpYWxpemF0aW9uIGlzIGluIHRoZSBoYW5kcyBvZiBzdWJjbGFzc2VzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE9iamVjdE91dHB1dFN0cmVhbX0uIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBjYW4KKyAgICAgKiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdGhhdCBkbyBub3Qgd2FudCB0byB1c2UgdGhlIHB1YmxpYyBjb25zdHJ1Y3RvciBpZgorICAgICAqIGl0IGFsbG9jYXRlcyB1bm5lZWRlZCBkYXRhLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiBjcmVhdGluZyB0aGlzIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc3ViY2xhc3NpbmcgdGhpcyBpcyBub3QgYWxsb3dlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcyBzdWJjbGFzc2luZworICAgICAqICAgICAgICAgICAgIHRoaXMgY2xhc3MuCiAgICAgICogQHNlZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tQZXJtaXNzaW9uKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC0xNjQsMTUgKzI2OSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtIG9uIHRoZSBPdXRwdXRTdHJlYW0KLSAgICAgKiA8Y29kZT5vdXRwdXQ8L2NvZGU+LiBBbGwgd3JpdGVzIGFyZSBub3cgZmlsdGVyZWQgdGhyb3VnaCB0aGlzIHN0cmVhbS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE9iamVjdE91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgT3V0cHV0U3RyZWFtCisgICAgICoge0Bjb2RlIG91dHB1dH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dHB1dAotICAgICAqICAgICAgICAgICAgVGhlIG5vbi1udWxsIE91dHB1dFN0cmVhbSB0byBmaWx0ZXIgd3JpdGVzIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIE91dHB1dFN0cmVhbSB0byBmaWx0ZXIgd3JpdGVzIG9uLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiB3cml0aW5nIHRoZSBvYmplY3Qgc3RyZWFtCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdGhlIG9iamVjdCBzdHJlYW0KICAgICAgKiAgICAgICAgICAgICBoZWFkZXIKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIHN1YmNsYXNzaW5nCisgICAgICogICAgICAgICAgICAgdGhpcyBjbGFzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIENsYXNzPD8+IGltcGxlbWVudGF0aW9uQ2xhc3MgPSBnZXRDbGFzcygpOwpAQCAtMjIwLDM1ICszMjksMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgb3B0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGNsYXNzIDxjb2RlPmFDbGFzczwvY29kZT4gaW50byB0aGUKLSAgICAgKiBzdHJlYW0gcmVwcmVzZW50ZWQgYnkgdGhlIHJlY2VpdmVyLiBUaGlzIG9wdGlvbmFsIGRhdGEgY2FuIGJlIHJlYWQgd2hlbgotICAgICAqIGRlc2VyaWFsaXppbmcgdGhlIGNsYXNzIGRlc2NyaXB0b3IgKE9iamVjdFN0cmVhbUNsYXNzKSBmb3IgdGhpcyBjbGFzcwotICAgICAqIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gQnkgZGVmYXVsdCBubyBleHRyYSBkYXRhIGlzIHNhdmVkLgorICAgICAqIFdyaXRlcyBvcHRpb25hbCBpbmZvcm1hdGlvbiBmb3IgY2xhc3Mge0Bjb2RlIGFDbGFzc30gdG8gdGhlIG91dHB1dAorICAgICAqIHN0cmVhbS4gVGhpcyBvcHRpb25hbCBkYXRhIGNhbiBiZSByZWFkIHdoZW4gZGVzZXJpYWxpemluZyB0aGUgY2xhc3MKKyAgICAgKiBkZXNjcmlwdG9yIChPYmplY3RTdHJlYW1DbGFzcykgZm9yIHRoaXMgY2xhc3MgZnJvbSBhbiBpbnB1dCBzdHJlYW0uIEJ5CisgICAgICogZGVmYXVsdCwgbm8gZXh0cmEgZGF0YSBpcyBzYXZlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYUNsYXNzCi0gICAgICogICAgICAgICAgICBUaGUgY2xhc3MgdG8gYW5ub3RhdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB0byBhbm5vdGF0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gYW5ub3RhdGluZyB0aGUgY2xhc3MuCi0gICAgICogCi0gICAgICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSNyZXNvbHZlQ2xhc3MKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI3Jlc29sdmVDbGFzcyhPYmplY3RTdHJlYW1DbGFzcykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhbm5vdGF0ZUNsYXNzKENsYXNzPD8+IGFDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQnkgZGVmYXVsdCBubyBleHRyYSBpbmZvIGlzIHNhdmVkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBvcHRpb25hbCBpbmZvcm1hdGlvbiBmb3IgYSBwcm94eSBjbGFzcyBpbnRvIHRoZSBzdHJlYW0gcmVwcmVzZW50ZWQKLSAgICAgKiBieSB0aGUgcmVjZWl2ZXIuIFRoaXMgb3B0aW9uYWwgZGF0YSBjYW4gYmUgcmVhZCB3aGVuIGRlc2VyaWFsaXppbmcgdGhlCi0gICAgICogcHJveHkgY2xhc3MgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiBCeSBkZWZhdWx0IG5vIGV4dHJhIGRhdGEgaXMgc2F2ZWQuCisgICAgICogV3JpdGVzIG9wdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhIHByb3h5IGNsYXNzIHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBUaGlzCisgICAgICogb3B0aW9uYWwgZGF0YSBjYW4gYmUgcmVhZCB3aGVuIGRlc2VyaWFsaXppbmcgdGhlIHByb3h5IGNsYXNzIGZyb20gYW4KKyAgICAgKiBpbnB1dCBzdHJlYW0uIEJ5IGRlZmF1bHQsIG5vIGV4dHJhIGRhdGEgaXMgc2F2ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFDbGFzcwotICAgICAqICAgICAgICAgICAgVGhlIHByb3h5IGNsYXNzIHRvIGFubm90YXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcHJveHkgY2xhc3MgdG8gYW5ub3RhdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIGFubm90YXRpbmcgdGhlIGNsYXNzLgotICAgICAqIAotICAgICAqIEBzZWUgT2JqZWN0SW5wdXRTdHJlYW0jcmVzb2x2ZVByb3h5Q2xhc3MKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI3Jlc29sdmVQcm94eUNsYXNzKFN0cmluZ1tdKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGFubm90YXRlUHJveHlDbGFzcyhDbGFzczw/PiBhQ2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEJ5IGRlZmF1bHQgbm8gZXh0cmEgaW5mbyBpcyBzYXZlZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKQEAgLTI2OCwxMSArMzc1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyBPYmplY3RPdXRwdXRTdHJlYW0uIEFueSBidWZmZXJlZCBkYXRhIGlzIGZsdXNoZWQuIFRoaXMKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBjbG9zZXMgdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQ2xvc2VzIHRoaXMgc3RyZWFtLiBBbnkgYnVmZmVyZWQgZGF0YSBpcyBmbHVzaGVkLiBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICogY2xvc2VzIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yOTQsMTMgKzQwMiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgbWV0aG9kIHRvIHdyaXRlIG9iamVjdHMgaW50byB0aGUgcmVjZWl2ZXIuIEZpZWxkcyBkZWZpbmVkIGluIHRoZQotICAgICAqIG9iamVjdCdzIGNsYXNzIGFuZCBzdXBlcmNsYXNzZXMgKHdoaWNoIGFyZSBTZXJpYWxpemFibGUpIHdpbGwgYmUgc2F2ZWQuCisgICAgICogRGVmYXVsdCBtZXRob2QgdG8gd3JpdGUgb2JqZWN0cyB0byB0aGlzIHN0cmVhbS4gU2VyaWFsaXphYmxlIGZpZWxkcworICAgICAqIGRlZmluZWQgaW4gdGhlIG9iamVjdCdzIGNsYXNzIGFuZCBzdXBlcmNsYXNzZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAorICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIG9iamVjdCBkYXRhCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHRocm93cyBOb3RBY3RpdmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGZyb20ge0Bjb2RlIHdyaXRlT2JqZWN0KCl9LgogICAgICAqIEBzZWUgT2JqZWN0SW5wdXRTdHJlYW0jZGVmYXVsdFJlYWRPYmplY3QKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZWZhdWx0V3JpdGVPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBXZSBjYW4ndCBiZSBjYWxsZWQgZnJvbSBqdXN0IGFueXdoZXJlLiBUaGVyZSBhcmUgcnVsZXMuCkBAIC0zMTEsMTAgKzQyMiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoZXMgYnVmZmVyZWQgcHJpbWl0aXZlIGRhdGEgaW50byB0aGUgcmVjZWl2ZXIuCisgICAgICogV3JpdGVzIGJ1ZmZlcmVkIGRhdGEgdG8gdGhlIHRhcmdldCBzdHJlYW0uIFRoaXMgaXMgc2ltaWxhciB0byB7QGNvZGUKKyAgICAgKiBmbHVzaH0gYnV0IHRoZSBmbHVzaCBpcyBub3QgcHJvcGFnYXRlZCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gZHJhaW4gdGhlIGRhdGEKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBkcmFpbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcmltaXRpdmVUeXBlcyA9PSBudWxsKSB7CkBAIC0zNDcsMTkgKzQ2MCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIER1bXBzIHRoZSBwYXJhbWV0ZXIgPGNvZGU+b2JqPC9jb2RlPiBvbmx5IGlmIGl0IGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogRHVtcHMgdGhlIHBhcmFtZXRlciB7QGNvZGUgb2JqfSBvbmx5IGlmIGl0IGlzIHtAY29kZSBudWxsfQogICAgICAqIG9yIGFuIG9iamVjdCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZHVtcGVkIHByZXZpb3VzbHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagogICAgICAqICAgICAgICAgICAgT2JqZWN0IHRvIGNoZWNrIGlmIGFuIGluc3RhbmNlIHByZXZpb3VzbHkgZHVtcGVkIGJ5IHRoaXMKICAgICAgKiAgICAgICAgICAgIHN0cmVhbS4KICAgICAgKiBAcmV0dXJuIG51bGwgaWYgaXQgaXMgYW4gaW5zdGFuY2Ugd2hpY2ggaGFzIG5vdCBiZWVuIGR1bXBlZCB5ZXQgKGFuZCB0aGlzCi0gICAgICogICAgICAgICBtZXRob2QgZG9lcyBub3RoaW5nKS4gSW50ZWdlciwgaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhbgorICAgICAqICAgICAgICAgbWV0aG9kIGRvZXMgbm90aGluZykuIEludGVnZXIsIGlmIHtAY29kZSBvYmp9IGlzIGFuCiAgICAgICogICAgICAgICBpbnN0YW5jZSB3aGljaCBoYXMgYmVlbiBkdW1wZWQgYWxyZWFkeS4gSW4gdGhpcyBjYXNlIHRoaXMgbWV0aG9kCiAgICAgICogICAgICAgICBzYXZlcyB0aGUgY3ljbGljIHJlZmVyZW5jZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gc2F2ZSA8Y29kZT5udWxsPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHNhdmUge0Bjb2RlIG51bGx9IG9yCiAgICAgICogICAgICAgICAgICAgYSBjeWNsaWMgcmVmZXJlbmNlLgogICAgICAqLwogICAgIHByaXZhdGUgSW50ZWdlciBkdW1wQ3ljbGUoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTM3MywyMCArNDg2LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBvYmplY3QgcmVwbGFjZW1lbnQgZm9yIHRoZSByZWNlaXZlci4gQnkgZGVmYXVsdCB0aGlzIGlzCi0gICAgICogbm90IGVuYWJsZWQuIE9ubHkgdHJ1c3RlZCBzdWJjbGFzc2VzIChsb2FkZWQgd2l0aCBzeXN0ZW0gY2xhc3MgbG9hZGVyKQotICAgICAqIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yLgorICAgICAqIEVuYWJsZXMgb2JqZWN0IHJlcGxhY2VtZW50IGZvciB0aGlzIHN0cmVhbS4gQnkgZGVmYXVsdCB0aGlzIGlzIG5vdAorICAgICAqIGVuYWJsZWQuIE9ubHkgdHJ1c3RlZCBzdWJjbGFzc2VzIChsb2FkZWQgd2l0aCBzeXN0ZW0gY2xhc3MgbG9hZGVyKSBhcmUKKyAgICAgKiBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzIHN0YXR1cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZW5hYmxlCi0gICAgICogICAgICAgICAgICBpZiB0cnVlLCBlbmFibGVzIHJlcGxhY2VtZW50LiBJZiBmYWxzZSwgZGlzYWJsZXMgcmVwbGFjZW1lbnQuCi0gICAgICogQHJldHVybiBib29sZWFuIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uIChpZiBpdCB3YXMgZW5hYmxlZCBvcgotICAgICAqICAgICAgICAgZGlzYWJsZWQpCi0gICAgICogCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlIG9iamVjdCByZXBsYWNlbWVudDsge0Bjb2RlIGZhbHNlfSB0bworICAgICAqICAgICAgICAgICAgZGlzYWJsZSBpdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBzZXR0aW5nLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2xhc3Mgb2YgdGhlIHJlY2VpdmVyIGlzIG5vdCB0cnVzdGVkCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzIGVuYWJsaW5nCisgICAgICogICAgICAgICAgICAgb2JqZWN0IHJlcGxhY2VtZW50IGZvciB0aGlzIHN0cmVhbS4KICAgICAgKiBAc2VlICNyZXBsYWNlT2JqZWN0CiAgICAgICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSNlbmFibGVSZXNvbHZlT2JqZWN0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlUmVwbGFjZU9iamVjdChib29sZWFuIGVuYWJsZSkKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CkBAIC00MDQsMTIgKzUxNywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgT2JqZWN0T3V0cHV0U3RyZWFtLiBBbnkgcGVuZGluZyB3cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcKLSAgICAgKiBzdHJlYW0gYXJlIHdyaXR0ZW4gb3V0IHdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZC4KKyAgICAgKiBXcml0ZXMgYnVmZmVyZWQgZGF0YSB0byB0aGUgdGFyZ2V0IHN0cmVhbSBhbmQgY2FsbHMgdGhlIHtAY29kZSBmbHVzaH0KKyAgICAgKiBtZXRob2Qgb2YgdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gb3IgZmx1c2hpbmcgdGhlIG91dHB1dAorICAgICAqICAgICAgICAgICAgIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC00MTksMTIgKzUzMywxMiBAQAogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBmaWVsZCBuYW1lZAotICAgICAqIDxjb2RlPmZpZWxkTmFtZTxjb2RlPiBvZiBvYmplY3QgPGNvZGU+aW5zdGFuY2U8L2NvZGU+LiBUaGUKLSAgICAgKiBmaWVsZCBpcyBkZWNsYXJlZCBieSBjbGFzcyA8Y29kZT5kZWNsYXJpbmdDbGFzczwvY29kZT4uIFRoZSBmaWVsZCBpcyBzdXBwb3NlZCB0byBiZQorICAgICAqIHtAY29kZSBmaWVsZE5hbWU8Y29kZT4gb2Ygb2JqZWN0IDxjb2RlPmluc3RhbmNlfS4gVGhlCisgICAgICogZmllbGQgaXMgZGVjbGFyZWQgYnkgY2xhc3Mge0Bjb2RlIGRlY2xhcmluZ0NsYXNzfS4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCiAgICAgICogYSBib29sZWFuLgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdCBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uCisgICAgICogdGhhdCBzdXBwb3J0IHRoZSB7QGNvZGUgc2V0QWNjZXNzaWJsZX0gQVBJLCBhdCB0aGUgZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24KICAgICAgKiAoamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpLiBPdGhlcndpc2UgU2VyaWFsaXphdGlvbiBjb3VsZCBub3QgZmV0Y2ggcHJpdmF0ZSBmaWVsZHMsIGV4Y2VwdAogICAgICAqIGJ5IHRoZSB1c2Ugb2YgYSBuYXRpdmUgbWV0aG9kIGxpa2UgdGhpcyBvbmUuCiAgICAgICoKQEAgLTQ0MCwxMiArNTU0LDEyIEBACiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGZpZWxkIG5hbWVkCi0gICAgICogPGNvZGU+ZmllbGROYW1lPGNvZGU+IG9mIG9iamVjdCA8Y29kZT5pbnN0YW5jZTwvY29kZT4uIFRoZQotICAgICAqIGZpZWxkIGlzIGRlY2xhcmVkIGJ5IGNsYXNzIDxjb2RlPmRlY2xhcmluZ0NsYXNzPC9jb2RlPi4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCisgICAgICoge0Bjb2RlIGZpZWxkTmFtZTxjb2RlPiBvZiBvYmplY3QgPGNvZGU+aW5zdGFuY2V9LiBUaGUKKyAgICAgKiBmaWVsZCBpcyBkZWNsYXJlZCBieSBjbGFzcyB7QGNvZGUgZGVjbGFyaW5nQ2xhc3N9LiBUaGUgZmllbGQgaXMgc3VwcG9zZWQgdG8gYmUKICAgICAgKiBhIGJ5dGUKICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGltcGxlbWVudGVkIG5vbi1uYXRpdmVseSBvbiB0b3Agb2YgamF2YS5sYW5nLnJlZmxlY3QgaW1wbGVtZW50YXRpb25zCi0gICAgICogdGhhdCBzdXBwb3J0IHRoZSA8Y29kZT5zZXRBY2Nlc3NpYmxlPC9jb2RlPiBBUEksIGF0IHRoZSBleHBlbnNlIG9mIGV4dHJhIG9iamVjdCBjcmVhdGlvbgorICAgICAqIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uCiAgICAgICogKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlIFNlcmlhbGl6YXRpb24gY291bGQgbm90IGZldGNoIHByaXZhdGUgZmllbGRzLCBleGNlcHQKICAgICAgKiBieSB0aGUgdXNlIG9mIGEgbmF0aXZlIG1ldGhvZCBsaWtlIHRoaXMgb25lLgogICAgICAqCkBAIC00NjEsMTIgKzU3NSwxMiBAQAogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBmaWVsZCBuYW1lZAotICAgICAqIDxjb2RlPmZpZWxkTmFtZTxjb2RlPiBvZiBvYmplY3QgPGNvZGU+aW5zdGFuY2U8L2NvZGU+LiBUaGUKLSAgICAgKiBmaWVsZCBpcyBkZWNsYXJlZCBieSBjbGFzcyA8Y29kZT5kZWNsYXJpbmdDbGFzczwvY29kZT4uIFRoZSBmaWVsZCBpcyBzdXBwb3NlZCB0byBiZQorICAgICAqIHtAY29kZSBmaWVsZE5hbWU8Y29kZT4gb2Ygb2JqZWN0IDxjb2RlPmluc3RhbmNlfS4gVGhlCisgICAgICogZmllbGQgaXMgZGVjbGFyZWQgYnkgY2xhc3Mge0Bjb2RlIGRlY2xhcmluZ0NsYXNzfS4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCiAgICAgICogYSBjaGFyLgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdCBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uCisgICAgICogdGhhdCBzdXBwb3J0IHRoZSB7QGNvZGUgc2V0QWNjZXNzaWJsZX0gQVBJLCBhdCB0aGUgZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24KICAgICAgKiAoamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpLiBPdGhlcndpc2UgU2VyaWFsaXphdGlvbiBjb3VsZCBub3QgZmV0Y2ggcHJpdmF0ZSBmaWVsZHMsIGV4Y2VwdAogICAgICAqIGJ5IHRoZSB1c2Ugb2YgYSBuYXRpdmUgbWV0aG9kIGxpa2UgdGhpcyBvbmUuCiAgICAgICoKQEAgLTQ4MiwxMiArNTk2LDEyIEBACiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGZpZWxkIG5hbWVkCi0gICAgICogPGNvZGU+ZmllbGROYW1lPGNvZGU+IG9mIG9iamVjdCA8Y29kZT5pbnN0YW5jZTwvY29kZT4uIFRoZQotICAgICAqIGZpZWxkIGlzIGRlY2xhcmVkIGJ5IGNsYXNzIDxjb2RlPmRlY2xhcmluZ0NsYXNzPC9jb2RlPi4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCisgICAgICoge0Bjb2RlIGZpZWxkTmFtZTxjb2RlPiBvZiBvYmplY3QgPGNvZGU+aW5zdGFuY2V9LiBUaGUKKyAgICAgKiBmaWVsZCBpcyBkZWNsYXJlZCBieSBjbGFzcyB7QGNvZGUgZGVjbGFyaW5nQ2xhc3N9LiBUaGUgZmllbGQgaXMgc3VwcG9zZWQgdG8gYmUKICAgICAgKiBhIGRvdWJsZS4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGltcGxlbWVudGVkIG5vbi1uYXRpdmVseSBvbiB0b3Agb2YgamF2YS5sYW5nLnJlZmxlY3QgaW1wbGVtZW50YXRpb25zCi0gICAgICogdGhhdCBzdXBwb3J0IHRoZSA8Y29kZT5zZXRBY2Nlc3NpYmxlPC9jb2RlPiBBUEksIGF0IHRoZSBleHBlbnNlIG9mIGV4dHJhIG9iamVjdCBjcmVhdGlvbgorICAgICAqIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uCiAgICAgICogKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlIFNlcmlhbGl6YXRpb24gY291bGQgbm90IGZldGNoIHByaXZhdGUgZmllbGRzLCBleGNlcHQKICAgICAgKiBieSB0aGUgdXNlIG9mIGEgbmF0aXZlIG1ldGhvZCBsaWtlIHRoaXMgb25lLgogICAgICAqCkBAIC01MDMsMTIgKzYxNywxMiBAQAogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBmaWVsZCBuYW1lZAotICAgICAqIDxjb2RlPmZpZWxkTmFtZTxjb2RlPiBvZiBvYmplY3QgPGNvZGU+aW5zdGFuY2U8L2NvZGU+LiBUaGUKLSAgICAgKiBmaWVsZCBpcyBkZWNsYXJlZCBieSBjbGFzcyA8Y29kZT5kZWNsYXJpbmdDbGFzczwvY29kZT4uIFRoZSBmaWVsZCBpcyBzdXBwb3NlZCB0byBiZQorICAgICAqIHtAY29kZSBmaWVsZE5hbWU8Y29kZT4gb2Ygb2JqZWN0IDxjb2RlPmluc3RhbmNlfS4gVGhlCisgICAgICogZmllbGQgaXMgZGVjbGFyZWQgYnkgY2xhc3Mge0Bjb2RlIGRlY2xhcmluZ0NsYXNzfS4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCiAgICAgICogYSBmbG9hdC4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGltcGxlbWVudGVkIG5vbi1uYXRpdmVseSBvbiB0b3Agb2YgamF2YS5sYW5nLnJlZmxlY3QgaW1wbGVtZW50YXRpb25zCi0gICAgICogdGhhdCBzdXBwb3J0IHRoZSA8Y29kZT5zZXRBY2Nlc3NpYmxlPC9jb2RlPiBBUEksIGF0IHRoZSBleHBlbnNlIG9mIGV4dHJhIG9iamVjdCBjcmVhdGlvbgorICAgICAqIHRoYXQgc3VwcG9ydCB0aGUge0Bjb2RlIHNldEFjY2Vzc2libGV9IEFQSSwgYXQgdGhlIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uCiAgICAgICogKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKS4gT3RoZXJ3aXNlIFNlcmlhbGl6YXRpb24gY291bGQgbm90IGZldGNoIHByaXZhdGUgZmllbGRzLCBleGNlcHQKICAgICAgKiBieSB0aGUgdXNlIG9mIGEgbmF0aXZlIG1ldGhvZCBsaWtlIHRoaXMgb25lLgogICAgICAqCkBAIC01MjQsMTIgKzYzOCwxMiBAQAogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBmaWVsZCBuYW1lZAotICAgICAqIDxjb2RlPmZpZWxkTmFtZTxjb2RlPiBvZiBvYmplY3QgPGNvZGU+aW5zdGFuY2U8L2NvZGU+LiBUaGUKLSAgICAgKiBmaWVsZCBpcyBkZWNsYXJlZCBieSBjbGFzcyA8Y29kZT5kZWNsYXJpbmdDbGFzczwvY29kZT4uIFRoZSBmaWVsZCBpcyBzdXBwb3NlZCB0byBiZQorICAgICAqIHtAY29kZSBmaWVsZE5hbWU8Y29kZT4gb2Ygb2JqZWN0IDxjb2RlPmluc3RhbmNlfS4gVGhlCisgICAgICogZmllbGQgaXMgZGVjbGFyZWQgYnkgY2xhc3Mge0Bjb2RlIGRlY2xhcmluZ0NsYXNzfS4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCiAgICAgICogYW4gaW50LgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgY291bGQgYmUgaW1wbGVtZW50ZWQgbm9uLW5hdGl2ZWx5IG9uIHRvcCBvZiBqYXZhLmxhbmcucmVmbGVjdCBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPnNldEFjY2Vzc2libGU8L2NvZGU+IEFQSSwgYXQgdGhlIGV4cGVuc2Ugb2YgZXh0cmEgb2JqZWN0IGNyZWF0aW9uCisgICAgICogdGhhdCBzdXBwb3J0IHRoZSB7QGNvZGUgc2V0QWNjZXNzaWJsZX0gQVBJLCBhdCB0aGUgZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24KICAgICAgKiAoamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpLiBPdGhlcndpc2UgU2VyaWFsaXphdGlvbiBjb3VsZCBub3QgZmV0Y2ggcHJpdmF0ZSBmaWVsZHMsIGV4Y2VwdAogICAgICAqIGJ5IHRoZSB1c2Ugb2YgYSBuYXRpdmUgbWV0aG9kIGxpa2UgdGhpcyBvbmUuCiAgICAgICoKQEAgLTU0NSwxMiArNjU5LDEyIEBACiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGZpZWxkIG5hbWVkCi0gICAgICogPGNvZGU+ZmllbGROYW1lPGNvZGU+IG9mIG9iamVjdCA8Y29kZT5pbnN0YW5jZTwvY29kZT4uIFRoZQotICAgICAqIGZpZWxkIGlzIGRlY2xhcmVkIGJ5IGNsYXNzIDxjb2RlPmRlY2xhcmluZ0NsYXNzPC9jb2RlPi4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCisgICAgICoge0Bjb2RlIGZpZWxkTmFtZTxjb2RlPiBvZiBvYmplY3QgPGNvZGU+aW5zdGFuY2V9LiBUaGUKKyAgICAgKiBmaWVsZCBpcyBkZWNsYXJlZCBieSBjbGFzcyB7QGNvZGUgZGVjbGFyaW5nQ2xhc3N9LiBUaGUgZmllbGQgaXMgc3VwcG9zZWQgdG8gYmUKICAgICAgKiBhIGxvbmcuCiAgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBub24tbmF0aXZlbHkgb24gdG9wIG9mIGphdmEubGFuZy5yZWZsZWN0IGltcGxlbWVudGF0aW9ucwotICAgICAqIHRoYXQgc3VwcG9ydCB0aGUgPGNvZGU+c2V0QWNjZXNzaWJsZTwvY29kZT4gQVBJLCBhdCB0aGUgZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24KKyAgICAgKiB0aGF0IHN1cHBvcnQgdGhlIHtAY29kZSBzZXRBY2Nlc3NpYmxlfSBBUEksIGF0IHRoZSBleHBlbnNlIG9mIGV4dHJhIG9iamVjdCBjcmVhdGlvbgogICAgICAqIChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkuIE90aGVyd2lzZSBTZXJpYWxpemF0aW9uIGNvdWxkIG5vdCBmZXRjaCBwcml2YXRlIGZpZWxkcywgZXhjZXB0CiAgICAgICogYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZSBtZXRob2QgbGlrZSB0aGlzIG9uZS4KICAgICAgKgpAQCAtNTY2LDEyICs2ODAsMTIgQEAKIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgb2YgZmllbGQgbmFtZWQKLSAgICAgKiA8Y29kZT5maWVsZE5hbWU8Y29kZT4gb2Ygb2JqZWN0IDxjb2RlPmluc3RhbmNlPC9jb2RlPi4gVGhlCi0gICAgICogZmllbGQgaXMgZGVjbGFyZWQgYnkgY2xhc3MgPGNvZGU+ZGVjbGFyaW5nQ2xhc3M8L2NvZGU+LiBUaGUgZmllbGQgaXMgc3VwcG9zZWQgdG8gYmUKLSAgICAgKiBhbiBPYmplY3QgdHlwZSB3aG9zZSBuYW1lIGlzIDxjb2RlPmZpZWxkVHlwZU5hbWU8L2NvZGU+LgorICAgICAqIHtAY29kZSBmaWVsZE5hbWU8Y29kZT4gb2Ygb2JqZWN0IDxjb2RlPmluc3RhbmNlfS4gVGhlCisgICAgICogZmllbGQgaXMgZGVjbGFyZWQgYnkgY2xhc3Mge0Bjb2RlIGRlY2xhcmluZ0NsYXNzfS4gVGhlIGZpZWxkIGlzIHN1cHBvc2VkIHRvIGJlCisgICAgICogYW4gT2JqZWN0IHR5cGUgd2hvc2UgbmFtZSBpcyB7QGNvZGUgZmllbGRUeXBlTmFtZX0uCiAgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBub24tbmF0aXZlbHkgb24gdG9wIG9mIGphdmEubGFuZy5yZWZsZWN0IGltcGxlbWVudGF0aW9ucwotICAgICAqIHRoYXQgc3VwcG9ydCB0aGUgPGNvZGU+c2V0QWNjZXNzaWJsZTwvY29kZT4gQVBJLCBhdCB0aGUgZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24KKyAgICAgKiB0aGF0IHN1cHBvcnQgdGhlIHtAY29kZSBzZXRBY2Nlc3NpYmxlfSBBUEksIGF0IHRoZSBleHBlbnNlIG9mIGV4dHJhIG9iamVjdCBjcmVhdGlvbgogICAgICAqIChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkuIE90aGVyd2lzZSBTZXJpYWxpemF0aW9uIGNvdWxkIG5vdCBmZXRjaCBwcml2YXRlIGZpZWxkcywgZXhjZXB0CiAgICAgICogYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZSBtZXRob2QgbGlrZSB0aGlzIG9uZS4KICAgICAgKgpAQCAtNTg4LDEyICs3MDIsMTIgQEAKIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgb2YgZmllbGQgbmFtZWQKLSAgICAgKiA8Y29kZT5maWVsZE5hbWU8Y29kZT4gb2Ygb2JqZWN0IDxjb2RlPmluc3RhbmNlPC9jb2RlPi4gVGhlCi0gICAgICogZmllbGQgaXMgZGVjbGFyZWQgYnkgY2xhc3MgPGNvZGU+ZGVjbGFyaW5nQ2xhc3M8L2NvZGU+LiBUaGUgZmllbGQgaXMgc3VwcG9zZWQgdG8gYmUKKyAgICAgKiB7QGNvZGUgZmllbGROYW1lPGNvZGU+IG9mIG9iamVjdCA8Y29kZT5pbnN0YW5jZX0uIFRoZQorICAgICAqIGZpZWxkIGlzIGRlY2xhcmVkIGJ5IGNsYXNzIHtAY29kZSBkZWNsYXJpbmdDbGFzc30uIFRoZSBmaWVsZCBpcyBzdXBwb3NlZCB0byBiZQogICAgICAqIGEgc2hvcnQuCiAgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBub24tbmF0aXZlbHkgb24gdG9wIG9mIGphdmEubGFuZy5yZWZsZWN0IGltcGxlbWVudGF0aW9ucwotICAgICAqIHRoYXQgc3VwcG9ydCB0aGUgPGNvZGU+c2V0QWNjZXNzaWJsZTwvY29kZT4gQVBJLCBhdCB0aGUgZXhwZW5zZSBvZiBleHRyYSBvYmplY3QgY3JlYXRpb24KKyAgICAgKiB0aGF0IHN1cHBvcnQgdGhlIHtAY29kZSBzZXRBY2Nlc3NpYmxlfSBBUEksIGF0IHRoZSBleHBlbnNlIG9mIGV4dHJhIG9iamVjdCBjcmVhdGlvbgogICAgICAqIChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkuIE90aGVyd2lzZSBTZXJpYWxpemF0aW9uIGNvdWxkIG5vdCBmZXRjaCBwcml2YXRlIGZpZWxkcywgZXhjZXB0CiAgICAgICogYnkgdGhlIHVzZSBvZiBhIG5hdGl2ZSBtZXRob2QgbGlrZSB0aGlzIG9uZS4KICAgICAgKgpAQCAtNjA4LDcgKzcyMiw3IEBACiAgICAgICAgICAgICBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5leHQgPGNvZGU+aW50PC9jb2RlPiBoYW5kbGUgdG8gYmUgdXNlZCB0byBpbmRpY2F0ZSBjeWNsaWMKKyAgICAgKiBSZXR1cm4gdGhlIG5leHQge0Bjb2RlIGludH0gaGFuZGxlIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGUgY3ljbGljCiAgICAgICogcmVmZXJlbmNlcyBiZWluZyBzYXZlZCB0byB0aGUgc3RyZWFtLgogICAgICAqIAogICAgICAqIEByZXR1cm4gaW50LCB0aGUgbmV4dCBoYW5kbGUgdG8gcmVwcmVzZW50IHRoZSBuZXh0IGN5Y2xpYyByZWZlcmVuY2UKQEAgLTYxOCwxOSArNzMyLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSA8Y29kZT5QdXRGaWVsZDwvY29kZT4gb2JqZWN0IGZvciB0aGUgcmVjZWl2ZXIuIFRoaXMgYWxsb3dzCi0gICAgICogdXNlcnMgdG8gdHJhbnNmZXIgdmFsdWVzIGZyb20gYWN0dWFsIG9iamVjdCBmaWVsZHMgaW4gdGhlIG9iamVjdCBiZWluZwotICAgICAqIGR1bXBlZCB0byB0aGUgZW11bGF0ZWQgZmllbGRzIHJlcHJlc2VudGVkIGJ5IHRoZSA8Y29kZT5QdXRGaWVsZDwvY29kZT4KLSAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiBHZXRzIHRoaXMgc3RyZWFtJ3Mge0Bjb2RlIFB1dEZpZWxkfSBvYmplY3QuIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGFjY2VzcworICAgICAqIHRvIHRoZSBwZXJzaXN0ZW50IGZpZWxkcyB0aGF0IGFyZSBldmVudHVhbGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dAorICAgICAqIHN0cmVhbS4gSXQgaXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgdmFsdWVzIGZyb20gdGhlIGZpZWxkcyBvZiB0aGUgb2JqZWN0CisgICAgICogdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiB0byB0aGUgcGVyc2lzdGVudCBmaWVsZHMuIAogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFB1dEZpZWxkT2JqZWN0IGZvciB0aGUgcmVjZWl2ZXIKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBQdXRGaWVsZCBvYmplY3QgZnJvbSB3aGljaCBwZXJzaXN0ZW50IGZpZWxkcyBjYW4gYmUgYWNjZXNzZWQKKyAgICAgKiAgICAgICAgIGJ5IG5hbWUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICogQHRocm93cyBOb3RBY3RpdmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGZyb20gd3JpdGVPYmplY3QoKQotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgZnJvbSB7QGNvZGUgd3JpdGVPYmplY3QoKX0uCiAgICAgICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSNkZWZhdWx0UmVhZE9iamVjdAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQdXRGaWVsZCBwdXRGaWVsZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBXZSBjYW4ndCBiZSBjYWxsZWQgZnJvbSBqdXN0IGFueXdoZXJlLiBUaGVyZSBhcmUgcnVsZXMuCkBAIC02NDQsMTMgKzc1OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgPGNvZGU+SW50ZWdlcjwvY29kZT4gaGFuZGxlIHVzZWQgdG8gdGFnIG9iamVjdAotICAgICAqIDxjb2RlPm9iajwvY29kZT4gYXMgYW4gaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkdW1wZWQgYWxyZWFkeS4gUmV0dXJuCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgb2JqZWN0IDxjb2RlPm9iajwvY29kZT4gaGFzIG5vdCBiZWVuIHNhdmVkIHlldC4KKyAgICAgKiBSZXR1cm4gdGhlIHtAY29kZSBJbnRlZ2VyfSBoYW5kbGUgdXNlZCB0byB0YWcgb2JqZWN0CisgICAgICoge0Bjb2RlIG9ian0gYXMgYW4gaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkdW1wZWQgYWxyZWFkeS4gUmV0dXJuCisgICAgICoge0Bjb2RlIG51bGx9IGlmIG9iamVjdCB7QGNvZGUgb2JqfSBoYXMgbm90IGJlZW4gc2F2ZWQgeWV0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKICAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgb2JqZWN0IDxjb2RlPm9iajwvY29kZT4gaGFzIG5vdCBiZWVuIHNhdmVkIHlldC4gSW50ZWdlcgorICAgICAqIEByZXR1cm4gbnVsbCBpZiBvYmplY3Qge0Bjb2RlIG9ian0gaGFzIG5vdCBiZWVuIHNhdmVkIHlldC4gSW50ZWdlcgogICAgICAqICAgICAgICAgVGhlIGhhbmRsZSB0aGF0IHRoaXMgb2JqZWN0IHdhcyBhc3NpZ25lZCB3aGVuIGl0IHdhcyBzYXZlZC4KICAgICAgKi8KICAgICBwcml2YXRlIEludGVnZXIgcmVnaXN0ZXJlZE9iamVjdEhhbmRsZUZvcihPYmplY3Qgb2JqKSB7CkBAIC02NTgsNyArNzcyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBc3N1bWUgb2JqZWN0IDxjb2RlPm9iajwvY29kZT4gaGFzIG5vdCBiZWVuIGR1bXBlZCB5ZXQsIGFuZCBhc3NpZ24gYQorICAgICAqIEFzc3VtZSBvYmplY3Qge0Bjb2RlIG9ian0gaGFzIG5vdCBiZWVuIGR1bXBlZCB5ZXQsIGFuZCBhc3NpZ24gYQogICAgICAqIGhhbmRsZSB0byBpdAogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKQEAgLTY5MSw4ICs4MDUsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFzc3VtZSBvYmplY3QgPGNvZGU+b2JqPC9jb2RlPiBoYXMgbm90IGJlZW4gZHVtcGVkIHlldCwgYW5kIGFzc2lnbiBhCi0gICAgICogaGFuZGxlIHRvIGl0LCA8Y29kZT5oYW5kbGU8L2NvZGU+LgorICAgICAqIEFzc3VtZSBvYmplY3Qge0Bjb2RlIG9ian0gaGFzIG5vdCBiZWVuIGR1bXBlZCB5ZXQsIGFuZCBhc3NpZ24gYQorICAgICAqIGhhbmRsZSB0byBpdCwge0Bjb2RlIGhhbmRsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagogICAgICAqICAgICAgICAgICAgTm9uLW51bGwgb2JqZWN0IGJlaW5nIGR1bXBlZC4KQEAgLTcwNiwyMCArODIwLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgPGNvZGU+ZW5hYmxlUmVwbGFjZU9iamVjdCgpPC9jb2RlPiB3YXMgYWN0aXZhdGVkLCBjb21wdXRlcyB0aGUKLSAgICAgKiByZXBsYWNlbWVudCBvYmplY3QgZm9yIHRoZSBvcmlnaW5hbCBvYmplY3QgPGNvZGU+b2JqZWN0PC9jb2RlPiBhbmQKLSAgICAgKiByZXR1cm5zIHRoZSByZXBsYWNlbWVudC4gT3RoZXJ3aXNlIHJldHVybnMgPGNvZGU+b2JqZWN0PC9jb2RlPi4KKyAgICAgKiBBbGxvd3MgdHJ1c3RlZCBzdWJjbGFzc2VzIHRvIHN1YnN0aXR1dGUgdGhlIHNwZWNpZmllZCBvcmlnaW5hbCB7QGNvZGUKKyAgICAgKiBvYmplY3R9IHdpdGggYSBuZXcgb2JqZWN0LiBPYmplY3Qgc3Vic3RpdHV0aW9uIGhhcyB0byBiZSBhY3RpdmF0ZWQgZmlyc3QKKyAgICAgKiB3aXRoIGNhbGxpbmcge0Bjb2RlIGVuYWJsZVJlcGxhY2VPYmplY3QodHJ1ZSl9LiBUaGlzIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgICAgKiByZXR1cm5zIHtAY29kZSBvYmplY3R9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIE9yaWdpbmFsIG9iamVjdCBmb3Igd2hpY2ggYSByZXBsYWNlbWVudCBtYXkgYmUgZGVmaW5lZAotICAgICAqIEByZXR1cm4gYSBwb3NzaWJseSBuZXcsIHJlcGxhY2VtZW50IG9iamVjdCBmb3IgPGNvZGU+b2JqZWN0PC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9iamVjdCBmb3Igd2hpY2ggYSByZXBsYWNlbWVudCBtYXkgYmUgZGVmaW5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXBsYWNlbWVudCBvYmplY3QgZm9yIHtAY29kZSBvYmplY3R9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbnkgSU8gcHJvYmxlbSBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byByZXNvbHZlIHRoZSBvYmplY3QuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHJlcGxhY2VtZW50CisgICAgICogICAgICAgICAgICAgb2JqZWN0LgogICAgICAqIEBzZWUgI2VuYWJsZVJlcGxhY2VPYmplY3QKICAgICAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI2VuYWJsZVJlc29sdmVPYmplY3QKICAgICAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI3Jlc29sdmVPYmplY3QKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlcGxhY2VPYmplY3QoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQnkgZGVmYXVsdCBubyBvYmplY3QgcmVwbGFjZW1lbnQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCkBAIC03MjcsMTMgKzg0MiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSByZWNlaXZlci4gQSBtYXJrZXIgaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtLCBzbyB0aGF0Ci0gICAgICogZGVzZXJpYWxpemF0aW9uIHdpbGwgYWxzbyBwZXJmb3JtIGEgcmVzdCBhdCB0aGUgc2FtZSBwb2ludC4gT2JqZWN0cwotICAgICAqIHByZXZpb3VzbHkgd3JpdHRlbiBhcmUgbm8gbG9uZ2VyIHJlbWVtYmVyZWQsIHNvIHRoZXkgd2lsbCBiZSB3cml0dGVuCi0gICAgICogYWdhaW4gKGluc3RlYWQgb2YgYSBjeWNsaWNhbCByZWZlcmVuY2UpIGlmIGZvdW5kIGluIHRoZSBvYmplY3QgZ3JhcGguCisgICAgICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGlzIHN0cmVhbS4gQSBtYXJrZXIgaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtLCBzbworICAgICAqIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgc3RyZWFtIHdpbGwgYWxzbyBwZXJmb3JtIGEgcmVzZXQgYXQgdGhlIHNhbWUKKyAgICAgKiBwb2ludC4gT2JqZWN0cyBwcmV2aW91c2x5IHdyaXR0ZW4gYXJlIG5vIGxvbmdlciByZW1lbWJlcmVkLCBzbyB0aGV5IHdpbGwKKyAgICAgKiBiZSB3cml0dGVuIGFnYWluIChpbnN0ZWFkIG9mIGEgY3ljbGljYWwgcmVmZXJlbmNlKSBpZiBmb3VuZCBpbiB0aGUgb2JqZWN0CisgICAgICogZ3JhcGguCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBJTyBwcm9ibGVtIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIHJlc2V0IHRoZSByZWNlaXZlcgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSByZXNldCgpfSBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJpYWxpemF0aW9uIG9mIGFuCisgICAgICogICAgICAgICAgICAgb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gRmlyc3Qgd2UgZmx1c2ggd2hhdCB3ZSBoYXZlCkBAIC03NzAsMTMgKzg4OCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgcmVjZWl2ZXIgdG8gdXNlIHRoZSBnaXZlbiBwcm90b2NvbCB2ZXJzaW9uLgorICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBwcm90b2NvbCB2ZXJzaW9uIHRvIGJlIHVzZWQgYnkgdGhpcyBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZlcnNpb24KLSAgICAgKiAgICAgICAgICAgIHByb3RvY29sIHZlcnNpb24gdG8gYmUgdXNlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHByb3RvY29sIHZlcnNpb24gdG8gYmUgdXNlZC4gVXNlIGEge0Bjb2RlCisgICAgICogICAgICAgICAgICBQUk9UT0NPTF9WRVJTSU9OX3h9IGNvbnN0YW50IGZyb20ge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLmlvLk9iamVjdFN0cmVhbUNvbnN0YW50c30uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBpbnZhbGlkIHtAY29kZSB2ZXJzaW9ufSBpcyBzcGVjaWZpZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBPYmplY3RTdHJlYW1Db25zdGFudHMjUFJPVE9DT0xfVkVSU0lPTl8xCisgICAgICogQHNlZSBPYmplY3RTdHJlYW1Db25zdGFudHMjUFJPVE9DT0xfVkVSU0lPTl8yCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXNlUHJvdG9jb2xWZXJzaW9uKGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAodmVyc2lvbiAhPSBPYmplY3RTdHJlYW1Db25zdGFudHMuUFJPVE9DT0xfVkVSU0lPTl8xCkBAIC03ODgsMTUgKzkxMiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8KLSAgICAgKiB0aGlzIE9iamVjdE91dHB1dFN0cmVhbS4KKyAgICAgKiBXcml0ZXMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSB0byB0aGUgb3V0cHV0CisgICAgICogc3RyZWFtLiBCbG9ja3MgdW50aWwgYWxsIGJ5dGVzIGFyZSB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtODA1LDE5ICs5MjgsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+bGVuZ3RoPC9jb2RlPiA8Y29kZT5ieXRlczwvY29kZT4gZnJvbSB0aGUgYnl0ZSBhcnJheQotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgb2Zmc2V0IDxjb2RlPm9mZnNldDwvY29kZT4gdG8gdGhlCi0gICAgICogT2JqZWN0T3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQKKyAgICAgKiBvZmZzZXQge0Bjb2RlIGluZGV4fSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gQmxvY2tzIHVudGlsIGFsbCBieXRlcyBhcmUKKyAgICAgKiB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byB3cml0ZS4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmZmVyIHRvIGdldCBieXRlcworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZSB0byB0aGUgb3V0cHV0CisgICAgICogICAgICAgICAgICBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgT3V0cHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC04MjYsMTQgKzk1MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIG9uZSBieXRlICg8Y29kZT52YWx1ZTwvY29kZT4pIGludG8gdGhlIHJlY2VpdmVyJ3MgdW5kZXJseWluZwotICAgICAqIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gT25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKyAgICAgKiBieXRlIG9mIHRoZSBpbnRlZ2VyIHtAY29kZSB2YWx1ZX0gaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtLiBCbG9ja3MgdW50aWwKKyAgICAgKiB0aGUgYnl0ZSBpcyBhY3R1YWxseSB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHByaW1pdGl2ZSBkYXRhIHRvIHdyaXRlLiBPbmx5IHRoZSBsb3dlciBieXRlIGlzIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgYnl0ZS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC04NDIsMTQgKzk2NywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgYm9vbGVhbiAoPGNvZGU+dmFsdWU8L2NvZGU+KWludG8gdGhlCi0gICAgICogcmVjZWl2ZXIncyB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYSBib29sZWFuIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHByaW1pdGl2ZSBkYXRhIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVCb29sZWFuKGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrV3JpdGVQcmltaXRpdmVUeXBlcygpOwpAQCAtODU3LDE0ICs5ODEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGJ5dGUgKDxjb2RlPnZhbHVlPC9jb2RlPilpbnRvIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgYnl0ZSAoOCBiaXQpIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHByaW1pdGl2ZSBkYXRhIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tXcml0ZVByaW1pdGl2ZVR5cGVzKCk7CkBAIC04NzIsMTUgKzk5NSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgU3RyaW5nIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgKG9ubHkgbG93ZXItb3JkZXIgOCBiaXRzIG9mIGVhY2gKLSAgICAgKiBjaGFyIGFyZSB3cml0dGVuKSwgYXMgcHJpbWl0aXZlIGRhdGEgKDxjb2RlPnZhbHVlPC9jb2RlPikgaW50byB0aGUKLSAgICAgKiByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgc3RyaW5nIHtAY29kZSB2YWx1ZX0gYXMgYSBzZXF1ZW5jZSBvZiBieXRlcyB0byB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtLiBPbmx5IHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIGVhY2ggY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcKKyAgICAgKiBpcyB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHByaW1pdGl2ZSBkYXRhIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiB3cml0aW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tXcml0ZVByaW1pdGl2ZVR5cGVzKCk7CkBAIC04ODgsMTQgKzEwMTEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGNoYXIgKDxjb2RlPnZhbHVlPC9jb2RlPilpbnRvIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgY2hhcmFjdGVyICgxNiBiaXQpIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHByaW1pdGl2ZSBkYXRhIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiB3cml0aW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXIoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja1dyaXRlUHJpbWl0aXZlVHlwZXMoKTsKQEAgLTkwMywxNCArMTAyNSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgU3RyaW5nIGFzIGEgc2VxdWVuY2Ugb2YgY2hhciwgYXMgcHJpbWl0aXZlIGRhdGEgKDxjb2RlPnZhbHVlPC9jb2RlPikKLSAgICAgKiBpbnRvIHRoZSByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgc3RyaW5nIHtAY29kZSB2YWx1ZX0gYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgcHJpbWl0aXZlIGRhdGEgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHdyaXRpbmcgdGhlIHByaW1pdGl2ZSBkYXRhLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcnMoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja1dyaXRlUHJpbWl0aXZlVHlwZXMoKTsKQEAgLTkxOCwxMSArMTA0MCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgY2xhc3MgZGVzY3JpcHRvciA8Y29kZT5jbGFzc0Rlc2M8L2NvZGU+IChhbgotICAgICAqIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikgdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBXcml0ZSBhIGNsYXNzIGRlc2NyaXB0b3Ige0Bjb2RlIGNsYXNzRGVzY30gKGFuCisgICAgICoge0Bjb2RlIE9iamVjdFN0cmVhbUNsYXNzfSkgdG8gdGhlIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2xhc3NEZXNjCi0gICAgICogICAgICAgICAgICBUaGUgY2xhc3MgZGVzY3JpcHRvciAoYW4gPGNvZGU+T2JqZWN0U3RyZWFtQ2xhc3M8L2NvZGU+KSB0bworICAgICAqICAgICAgICAgICAgVGhlIGNsYXNzIGRlc2NyaXB0b3IgKGFuIHtAY29kZSBPYmplY3RTdHJlYW1DbGFzc30pIHRvCiAgICAgICogICAgICAgICAgICBiZSBkdW1wZWQKICAgICAgKiBAcGFyYW0gdW5zaGFyZWQKICAgICAgKiAgICAgICAgICAgIFdyaXRlIHRoZSBvYmplY3QgdW5zaGFyZWQKQEAgLTk5MCwxMiArMTExMiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGNsYXNzIGRlc2NyaXB0b3IgKGFuIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikgdGhhdAotICAgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3Mgb2JqQ2xhc3M8L2NvZGU+IHRvIHRoZSBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgY2xhc3MgZGVzY3JpcHRvciAoYW4ge0Bjb2RlIE9iamVjdFN0cmVhbUNsYXNzfSkgdGhhdAorICAgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSB7QGNvZGUgamF2YS5sYW5nLkNsYXNzIG9iakNsYXNzfSB0byB0aGUgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmpDbGFzcwogICAgICAqICAgICAgICAgICAgVGhlIGNsYXNzIGZvciB3aGljaCBhIGNsYXNzIGRlc2NyaXB0b3IgKGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5PYmplY3RTdHJlYW1DbGFzczwvY29kZT4pIHdpbGwgYmUgZHVtcGVkLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIE9iamVjdFN0cmVhbUNsYXNzfSkgd2lsbCBiZSBkdW1wZWQuCiAgICAgICogQHJldHVybiB0aGUgaGFuZGxlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcyBkZXNjcmlwdG9yCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgpAQCAtMTAyNSwxNCArMTE0NywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgZG91YmxlICg8Y29kZT52YWx1ZTwvY29kZT4paW50byB0aGUKLSAgICAgKiByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIFdyaXRlcyBhIGRvdWJsZSAoNjQgYml0KSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBwcmltaXRpdmUgZGF0YSB0byB3cml0ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja1dyaXRlUHJpbWl0aXZlVHlwZXMoKTsKQEAgLTEwNDEsMTEgKzExNjIsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFdyaXRlcyBhIGNvbGxlY3Rpb24gb2YgZmllbGQgZGVzY3JpcHRvcnMgKG5hbWUsIHR5cGUgbmFtZSwgZXRjKSBmb3IgdGhlCi0gICAgICogY2xhc3MgZGVzY3JpcHRvciA8Y29kZT5jbGFzc0Rlc2M8L2NvZGU+IChhbgotICAgICAqIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikKKyAgICAgKiBjbGFzcyBkZXNjcmlwdG9yIHtAY29kZSBjbGFzc0Rlc2N9IChhbgorICAgICAqIHtAY29kZSBPYmplY3RTdHJlYW1DbGFzc30pCiAgICAgICogCiAgICAgICogQHBhcmFtIGNsYXNzRGVzYwotICAgICAqICAgICAgICAgICAgVGhlIGNsYXNzIGRlc2NyaXB0b3IgKGFuIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPikKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyBkZXNjcmlwdG9yIChhbiB7QGNvZGUgT2JqZWN0U3RyZWFtQ2xhc3N9KQogICAgICAqICAgICAgICAgICAgZm9yIHdoaWNoIHRvIHdyaXRlIGZpZWxkIGluZm9ybWF0aW9uCiAgICAgICogQHBhcmFtIGV4dGVybmFsaXphYmxlCiAgICAgICogICAgICAgICAgICB0cnVlIGlmIHRoZSBkZXNjcmlwdG9ycyBhcmUgZXh0ZXJuYWxpemFibGUKQEAgLTEwODMsMTUgKzEyMDQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgZmllbGRzIG9mIHRoZSBvYmplY3QgYmVpbmcgZHVtcGVkLiBUaGUgc3RyZWFtIHdpbGwgdXNlIHRoZQotICAgICAqIGN1cnJlbnRseSBhY3RpdmUgPGNvZGU+UHV0RmllbGQ8L2NvZGU+IG9iamVjdCwgYWxsb3dpbmcgdXNlcnMgdG8gZHVtcAotICAgICAqIGVtdWxhdGVkIGZpZWxkcywgZm9yIGNyb3NzLWxvYWRpbmcgY29tcGF0aWJpbGl0eSB3aGVuIGEgY2xhc3MgZGVmaW5pdGlvbgotICAgICAqIGNoYW5nZXMuCisgICAgICogV3JpdGVzIHRoZSBmaWVsZHMgb2YgdGhlIG9iamVjdCBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiB0byB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtLiBUaGUgZmllbGQgdmFsdWVzIGFyZSBidWZmZXJlZCBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSB7QGNvZGUKKyAgICAgKiBQdXRGaWVsZH0gb2JqZWN0LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgY2FsbGluZyB7QGNvZGUgcHV0RmllbGRzKCl9LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBlcnJvciBvY2N1cnMKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE5vdEFjdGl2ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBmaWVsZHMgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHNlZSAjcHV0RmllbGRzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBIYXMgdG8gaGF2ZSBmaWVsZHMgdG8gd3JpdGUKQEAgLTExMDMsMTEgKzEyMjUsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFdyaXRlcyBhIGNvbGxlY3Rpb24gb2YgZmllbGQgdmFsdWVzIGZvciB0aGUgZW11bGF0ZWQgZmllbGRzCi0gICAgICogPGNvZGU+ZW11bGF0ZWRGaWVsZHM8L2NvZGU+CisgICAgICoge0Bjb2RlIGVtdWxhdGVkRmllbGRzfQogICAgICAqIAogICAgICAqIEBwYXJhbSBlbXVsYXRlZEZpZWxkcwotICAgICAqICAgICAgICAgICAgYW4gPGNvZGU+RW11bGF0ZWRGaWVsZHNGb3JEdW1waW5nPC9jb2RlPiwgY29uY3JldGUgc3ViY2xhc3MKLSAgICAgKiAgICAgICAgICAgIG9mIDxjb2RlPlB1dEZpZWxkPC9jb2RlPgorICAgICAqICAgICAgICAgICAgYW4ge0Bjb2RlIEVtdWxhdGVkRmllbGRzRm9yRHVtcGluZ30sIGNvbmNyZXRlIHN1YmNsYXNzCisgICAgICogICAgICAgICAgICBvZiB7QGNvZGUgUHV0RmllbGR9CiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHdyaXRpbmcgdGhlIGZpZWxkIHZhbHVlcy4KQEAgLTExNTksMTUgKzEyODEsMTUgQEAKIAogICAgIC8qKgogICAgICAqIFdyaXRlcyBhIGNvbGxlY3Rpb24gb2YgZmllbGQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGRlc2NyaWJlZCBieSBjbGFzcwotICAgICAqIGRlc2NyaXB0b3IgPGNvZGU+Y2xhc3NEZXNjPC9jb2RlPiAoYW4gPGNvZGU+T2JqZWN0U3RyZWFtQ2xhc3M8L2NvZGU+KS4KKyAgICAgKiBkZXNjcmlwdG9yIHtAY29kZSBjbGFzc0Rlc2N9IChhbiB7QGNvZGUgT2JqZWN0U3RyZWFtQ2xhc3N9KS4KICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IG1lY2hhbmlzbSwgd2hlbiBlbXVsYXRlZCBmaWVsZHMgKGFuCi0gICAgICogPGNvZGU+UHV0RmllbGQ8L2NvZGU+KSBhcmUgbm90IHVzZWQuIEFjdHVhbCB2YWx1ZXMgdG8gZHVtcCBhcmUgZmV0Y2hlZAotICAgICAqIGRpcmVjdGx5IGZyb20gb2JqZWN0IDxjb2RlPm9iajwvY29kZT4uCisgICAgICoge0Bjb2RlIFB1dEZpZWxkfSkgYXJlIG5vdCB1c2VkLiBBY3R1YWwgdmFsdWVzIHRvIGR1bXAgYXJlIGZldGNoZWQKKyAgICAgKiBkaXJlY3RseSBmcm9tIG9iamVjdCB7QGNvZGUgb2JqfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICogICAgICAgICAgICBJbnN0YW5jZSBmcm9tIHdoaWNoIHRvIGZldGNoIGZpZWxkIHZhbHVlcyB0byBkdW1wLgogICAgICAqIEBwYXJhbSBjbGFzc0Rlc2MKLSAgICAgKiAgICAgICAgICAgIEEgY2xhc3MgZGVzY3JpcHRvciAoYW4gPGNvZGU+T2JqZWN0U3RyZWFtQ2xhc3M8L2NvZGU+KQorICAgICAqICAgICAgICAgICAgQSBjbGFzcyBkZXNjcmlwdG9yIChhbiB7QGNvZGUgT2JqZWN0U3RyZWFtQ2xhc3N9KQogICAgICAqICAgICAgICAgICAgZGVmaW5pbmcgd2hpY2ggZmllbGRzIHNob3VsZCBiZSBkdW1wZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgpAQCAtMTI0MywxNCArMTM2NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgZmxvYXQgKDxjb2RlPnZhbHVlPC9jb2RlPilpbnRvIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgZmxvYXQgKDMyIGJpdCkgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgcHJpbWl0aXZlIGRhdGEgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVGbG9hdChmbG9hdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tXcml0ZVByaW1pdGl2ZVR5cGVzKCk7CkBAIC0xMjU5LDE3ICsxMzgwLDE3IEBACiAKICAgICAvKioKICAgICAgKiBXYWxrcyB0aGUgaGllcmFyY2h5IG9mIGNsYXNzZXMgZGVzY3JpYmVkIGJ5IGNsYXNzIGRlc2NyaXB0b3IKLSAgICAgKiA8Y29kZT5jbGFzc0Rlc2M8L2NvZGU+IGFuZCB3cml0ZXMgdGhlIGZpZWxkIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvCisgICAgICoge0Bjb2RlIGNsYXNzRGVzY30gYW5kIHdyaXRlcyB0aGUgZmllbGQgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgKiBmaWVsZHMgZGVjbGFyZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MgZGVzY3JpcHRvci4gVGhlIGluc3RhbmNlIHRvCi0gICAgICogZmV0Y2ggZmllbGQgdmFsdWVzIGZyb20gaXMgPGNvZGU+b2JqZWN0PC9jb2RlPi4gSWYgdGhlIGNsYXNzCi0gICAgICogKGNvcnJlc3BvbmRpbmcgdG8gY2xhc3MgZGVzY3JpcHRvciA8Y29kZT5jbGFzc0Rlc2M8L2NvZGU+KSBkZWZpbmVzCi0gICAgICogcHJpdmF0ZSBpbnN0YW5jZSBtZXRob2QgPGNvZGU+d3JpdGVPYmplY3Q8L2NvZGU+IGl0IHdpbGwgYmUgdXNlZCB0bworICAgICAqIGZldGNoIGZpZWxkIHZhbHVlcyBmcm9tIGlzIHtAY29kZSBvYmplY3R9LiBJZiB0aGUgY2xhc3MKKyAgICAgKiAoY29ycmVzcG9uZGluZyB0byBjbGFzcyBkZXNjcmlwdG9yIHtAY29kZSBjbGFzc0Rlc2N9KSBkZWZpbmVzCisgICAgICogcHJpdmF0ZSBpbnN0YW5jZSBtZXRob2Qge0Bjb2RlIHdyaXRlT2JqZWN0fSBpdCB3aWxsIGJlIHVzZWQgdG8KICAgICAgKiBkdW1wIGZpZWxkIHZhbHVlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICBJbnN0YW5jZSBmcm9tIHdoaWNoIHRvIGZldGNoIGZpZWxkIHZhbHVlcyB0byBkdW1wLgogICAgICAqIEBwYXJhbSBjbGFzc0Rlc2MKLSAgICAgKiAgICAgICAgICAgIEEgY2xhc3MgZGVzY3JpcHRvciAoYW4gPGNvZGU+T2JqZWN0U3RyZWFtQ2xhc3M8L2NvZGU+KQorICAgICAqICAgICAgICAgICAgQSBjbGFzcyBkZXNjcmlwdG9yIChhbiB7QGNvZGUgT2JqZWN0U3RyZWFtQ2xhc3N9KQogICAgICAqICAgICAgICAgICAgZGVmaW5pbmcgd2hpY2ggZmllbGRzIHNob3VsZCBiZSBkdW1wZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgpAQCAtMTM0NCwxNCArMTQ2NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgaW50ICg8Y29kZT52YWx1ZTwvY29kZT4paW50byB0aGUKLSAgICAgKiByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIFdyaXRlcyBhbiBpbnRlZ2VyICgzMiBiaXQpIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHByaW1pdGl2ZSBkYXRhIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVJbnQoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja1dyaXRlUHJpbWl0aXZlVHlwZXMoKTsKQEAgLTEzNTksMTQgKzE0NzksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBwcmltaXRpdmUgZGF0YSBvZiB0eXBlIGxvbmcgKDxjb2RlPnZhbHVlPC9jb2RlPilpbnRvIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgbG9uZyAoNjQgYml0KSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBwcmltaXRpdmUgZGF0YSB0byB3cml0ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHdyaXRpbmcgdGhlIHByaW1pdGl2ZSBkYXRhLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlTG9uZyhsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja1dyaXRlUHJpbWl0aXZlVHlwZXMoKTsKQEAgLTEzNzQsMTggKzE0OTMsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhcnJheSA8Y29kZT5hcnJheTwvY29kZT4gb2YgY2xhc3MgPGNvZGU+YXJyYXlDbGFzczwvY29kZT4gd2l0aAotICAgICAqIGNvbXBvbmVudCB0eXBlIDxjb2RlPmNvbXBvbmVudFR5cGU8L2NvZGU+IGludG8gdGhlIHJlY2VpdmVyLiBJdCBpcwotICAgICAqIGFzc3VtZWQgdGhlIGFycmF5IGhhcyBub3QgYmVlbiBkdW1wZWQgeWV0LiBSZXR1cm4gYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4KKyAgICAgKiBXcml0ZSBhcnJheSB7QGNvZGUgYXJyYXl9IG9mIGNsYXNzIHtAY29kZSBhcnJheUNsYXNzfSB3aXRoCisgICAgICogY29tcG9uZW50IHR5cGUge0Bjb2RlIGNvbXBvbmVudFR5cGV9IGludG8gdGhlIHJlY2VpdmVyLiBJdCBpcworICAgICAqIGFzc3VtZWQgdGhlIGFycmF5IGhhcyBub3QgYmVlbiBkdW1wZWQgeWV0LiBSZXR1cm4gYW4ge0Bjb2RlIEludGVnZXJ9CiAgICAgICogdGhhdCByZXByZXNlbnRzIHRoZSBoYW5kbGUgZm9yIHRoaXMgb2JqZWN0IChhcnJheSkgd2hpY2ggaXMgZHVtcGVkIGhlcmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICogICAgICAgICAgICBUaGUgYXJyYXkgb2JqZWN0IHRvIGR1bXAKICAgICAgKiBAcGFyYW0gYXJyYXlDbGFzcwotICAgICAqICAgICAgICAgICAgQSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3M8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb2YgdGhlCisgICAgICogICAgICAgICAgICBBIHtAY29kZSBqYXZhLmxhbmcuQ2xhc3N9IHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb2YgdGhlCiAgICAgICogICAgICAgICAgICBhcnJheQogICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlCi0gICAgICogICAgICAgICAgICBBIDxjb2RlPmphdmEubGFuZy5DbGFzczwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBhcnJheQorICAgICAqICAgICAgICAgICAgQSB7QGNvZGUgamF2YS5sYW5nLkNsYXNzfSByZXByZXNlbnRpbmcgdGhlIGFycmF5CiAgICAgICogICAgICAgICAgICBjb21wb25lbnQgdHlwZQogICAgICAqIEByZXR1cm4gdGhlIGhhbmRsZSBhc3NpZ25lZCB0byB0aGUgYXJyYXkKICAgICAgKiAKQEAgLTE0NzMsMTQgKzE1OTIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBjbGFzcyA8Y29kZT5vYmplY3Q8L2NvZGU+IGludG8gdGhlIHJlY2VpdmVyLiBJdCBpcyBhc3N1bWVkIHRoZQorICAgICAqIFdyaXRlIGNsYXNzIHtAY29kZSBvYmplY3R9IGludG8gdGhlIHJlY2VpdmVyLiBJdCBpcyBhc3N1bWVkIHRoZQogICAgICAqIGNsYXNzIGhhcyBub3QgYmVlbiBkdW1wZWQgeWV0LiBDbGFzc2VzIGFyZSBub3QgcmVhbGx5IGR1bXBlZCwgYnV0IGEgY2xhc3MKLSAgICAgKiBkZXNjcmlwdG9yICg8Y29kZT5PYmplY3RTdHJlYW1DbGFzczwvY29kZT4pIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlbS4KLSAgICAgKiBSZXR1cm4gYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4gdGhhdCByZXByZXNlbnRzIHRoZSBoYW5kbGUgZm9yIHRoaXMKKyAgICAgKiBkZXNjcmlwdG9yICh7QGNvZGUgT2JqZWN0U3RyZWFtQ2xhc3N9KSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZW0uCisgICAgICogUmV0dXJuIGFuIHtAY29kZSBJbnRlZ2VyfSB0aGF0IHJlcHJlc2VudHMgdGhlIGhhbmRsZSBmb3IgdGhpcwogICAgICAqIG9iamVjdCAoY2xhc3MpIHdoaWNoIGlzIGR1bXBlZCBoZXJlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3M8L2NvZGU+IG9iamVjdCB0byBkdW1wCisgICAgICogICAgICAgICAgICBUaGUge0Bjb2RlIGphdmEubGFuZy5DbGFzc30gb2JqZWN0IHRvIGR1bXAKICAgICAgKiBAcmV0dXJuIHRoZSBoYW5kbGUgYXNzaWduZWQgdG8gdGhlIGNsYXNzIGJlaW5nIGR1bXBlZAogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTE1MTYsMTQgKzE2MzUsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBjbGFzcyBkZXNjcmlwdG9yIDxjb2RlPmNsYXNzRGVzYzwvY29kZT4gaW50byB0aGUgcmVjZWl2ZXIuIEl0IGlzCisgICAgICogV3JpdGUgY2xhc3MgZGVzY3JpcHRvciB7QGNvZGUgY2xhc3NEZXNjfSBpbnRvIHRoZSByZWNlaXZlci4gSXQgaXMKICAgICAgKiBhc3N1bWVkIHRoZSBjbGFzcyBkZXNjcmlwdG9yIGhhcyBub3QgYmVlbiBkdW1wZWQgeWV0LiBUaGUgY2xhc3MKICAgICAgKiBkZXNjcmlwdG9ycyBmb3IgdGhlIHN1cGVyY2xhc3MgY2hhaW4gd2lsbCBiZSBkdW1wZWQgYXMgd2VsbC4gUmV0dXJuIGFuCi0gICAgICogPGNvZGU+SW50ZWdlcjwvY29kZT4gdGhhdCByZXByZXNlbnRzIHRoZSBoYW5kbGUgZm9yIHRoaXMgb2JqZWN0IChjbGFzcworICAgICAqIHtAY29kZSBJbnRlZ2VyfSB0aGF0IHJlcHJlc2VudHMgdGhlIGhhbmRsZSBmb3IgdGhpcyBvYmplY3QgKGNsYXNzCiAgICAgICogZGVzY3JpcHRvcikgd2hpY2ggaXMgZHVtcGVkIGhlcmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNsYXNzRGVzYwotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPk9iamVjdFN0cmVhbUNsYXNzPC9jb2RlPiBvYmplY3QgdG8gZHVtcAorICAgICAqICAgICAgICAgICAgVGhlIHtAY29kZSBPYmplY3RTdHJlYW1DbGFzc30gb2JqZWN0IHRvIGR1bXAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgY2xhc3MKQEAgLTE1NTYsMTQgKzE2NzUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBjbGFzcyBkZXNjcmlwdG9yIDxjb2RlPmNsYXNzRGVzYzwvY29kZT4gaW50byB0aGUgcmVjZWl2ZXIuCisgICAgICogV3JpdGVzIGEgY2xhc3MgZGVzY3JpcHRvciB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2xhc3NEZXNjCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+T2JqZWN0U3RyZWFtQ2xhc3M8L2NvZGU+IG9iamVjdCB0byBkdW1wCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgZGVzY3JpcHRvciB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgY2xhc3MKLSAgICAgKiAgICAgICAgICAgICBkZXNjcmlwdG9yLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQ2xhc3NEZXNjcmlwdG9yKE9iamVjdFN0cmVhbUNsYXNzIGNsYXNzRGVzYykKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xNTcxLDggKzE2ODksOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGV4Y2VwdGlvbiA8Y29kZT5leDwvY29kZT4gaW50byB0aGUgcmVjZWl2ZXIuIEl0IGlzIGFzc3VtZWQgdGhlCi0gICAgICogZXhjZXB0aW9uIGhhcyBub3QgYmVlbiBkdW1wZWQgeWV0LiBSZXR1cm4gYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4gdGhhdAorICAgICAqIFdyaXRlIGV4Y2VwdGlvbiB7QGNvZGUgZXh9IGludG8gdGhlIHJlY2VpdmVyLiBJdCBpcyBhc3N1bWVkIHRoZQorICAgICAqIGV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gZHVtcGVkIHlldC4gUmV0dXJuIGFuIHtAY29kZSBJbnRlZ2VyfSB0aGF0CiAgICAgICogcmVwcmVzZW50cyB0aGUgaGFuZGxlIGZvciB0aGlzIG9iamVjdCAoZXhjZXB0aW9uKSB3aGljaCBpcyBkdW1wZWQgaGVyZS4KICAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZHVtcCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIHRoYXQgaGFwcGVuZWQgKGlmIGFueSkgd2hlbgogICAgICAqIGR1bXBpbmcgdGhlIG9yaWdpbmFsIG9iamVjdCBncmFwaC4gVGhlIHNldCBvZiBzZWVuIG9iamVjdHMgd2lsbCBiZSByZXNldApAQCAtMTU5NywyMSArMTcxNSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIG9iamVjdCA8Y29kZT5vYmplY3Q8L2NvZGU+IG9mIGNsYXNzIDxjb2RlPnRoZUNsYXNzPC9jb2RlPiBpbnRvCisgICAgICogV3JpdGUgb2JqZWN0IHtAY29kZSBvYmplY3R9IG9mIGNsYXNzIHtAY29kZSB0aGVDbGFzc30gaW50bwogICAgICAqIHRoZSByZWNlaXZlci4gSXQgaXMgYXNzdW1lZCB0aGUgb2JqZWN0IGhhcyBub3QgYmVlbiBkdW1wZWQgeWV0LiBSZXR1cm4gYW4KLSAgICAgKiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiB0aGF0IHJlcHJlc2VudHMgdGhlIGhhbmRsZSBmb3IgdGhpcyBvYmplY3Qgd2hpY2gKKyAgICAgKiB7QGNvZGUgSW50ZWdlcn0gdGhhdCByZXByZXNlbnRzIHRoZSBoYW5kbGUgZm9yIHRoaXMgb2JqZWN0IHdoaWNoCiAgICAgICogaXMgZHVtcGVkIGhlcmUuCiAgICAgICogCi0gICAgICogSWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzIDxjb2RlPkV4dGVybmFsaXphYmxlPC9jb2RlPiBpdHMKLSAgICAgKiA8Y29kZT53cml0ZUV4dGVybmFsPC9jb2RlPiBpcyBjYWxsZWQuIE90aGVyd2lzZSwgYWxsIGZpZWxkcyBkZXNjcmliZWQKKyAgICAgKiBJZiB0aGUgb2JqZWN0IGltcGxlbWVudHMge0Bjb2RlIEV4dGVybmFsaXphYmxlfSBpdHMKKyAgICAgKiB7QGNvZGUgd3JpdGVFeHRlcm5hbH0gaXMgY2FsbGVkLiBPdGhlcndpc2UsIGFsbCBmaWVsZHMgZGVzY3JpYmVkCiAgICAgICogYnkgdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyBkdW1wZWQuIEVhY2ggY2xhc3MgY2FuIGRlZmluZSBob3cgaXRzIGRlY2xhcmVkCiAgICAgICogaW5zdGFuY2UgZmllbGRzIGFyZSBkdW1wZWQgYnkgZGVmaW5pbmcgYSBwcml2YXRlIG1ldGhvZAotICAgICAqIDxjb2RlPndyaXRlT2JqZWN0PC9jb2RlPgorICAgICAqIHtAY29kZSB3cml0ZU9iamVjdH0KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0CiAgICAgICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGR1bXAKICAgICAgKiBAcGFyYW0gdGhlQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIEEgPGNvZGU+amF2YS5sYW5nLkNsYXNzPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG9mIHRoZQorICAgICAqICAgICAgICAgICAgQSB7QGNvZGUgamF2YS5sYW5nLkNsYXNzfSByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG9mIHRoZQogICAgICAqICAgICAgICAgICAgb2JqZWN0CiAgICAgICogQHBhcmFtIHVuc2hhcmVkCiAgICAgICogICAgICAgICAgICBXcml0ZSB0aGUgb2JqZWN0IHVuc2hhcmVkCkBAIC0xNjg2LDEzICsxODA0LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgU3RyaW5nIDxjb2RlPm9iamVjdDwvY29kZT4gaW50byB0aGUgcmVjZWl2ZXIuIEl0IGlzIGFzc3VtZWQgdGhlCi0gICAgICogU3RyaW5nIGhhcyBub3QgYmVlbiBkdW1wZWQgeWV0LiBSZXR1cm4gYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4gdGhhdAorICAgICAqIFdyaXRlIFN0cmluZyB7QGNvZGUgb2JqZWN0fSBpbnRvIHRoZSByZWNlaXZlci4gSXQgaXMgYXNzdW1lZCB0aGUKKyAgICAgKiBTdHJpbmcgaGFzIG5vdCBiZWVuIGR1bXBlZCB5ZXQuIFJldHVybiBhbiB7QGNvZGUgSW50ZWdlcn0gdGhhdAogICAgICAqIHJlcHJlc2VudHMgdGhlIGhhbmRsZSBmb3IgdGhpcyBvYmplY3QgKFN0cmluZykgd2hpY2ggaXMgZHVtcGVkIGhlcmUuCi0gICAgICogU3RyaW5ncyBhcmUgc2F2ZWQgaW4gVVRGIGZvcm1hdC4KKyAgICAgKiBTdHJpbmdzIGFyZSBzYXZlZCBlbmNvZGVkIHdpdGgge0BsaW5rIERhdGFJbnB1dCBtb2RpZmllZCBVVEYtOH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+IG9iamVjdCB0byBkdW1wCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGR1bXAuCiAgICAgICogQHJldHVybiB0aGUgaGFuZGxlIGFzc2lnbmVkIHRvIHRoZSBTdHJpbmcgYmVpbmcgZHVtcGVkCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgpAQCAtMTcyMCw0MyArMTgzOCw0MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgc3BlY2lhbCB0YWcgdGhhdCBpbmRpY2F0ZXMgdGhlIHZhbHVlIDxjb2RlPm51bGw8L2NvZGU+IGludG8gdGhlCisgICAgICogV3JpdGUgYSBzcGVjaWFsIHRhZyB0aGF0IGluZGljYXRlcyB0aGUgdmFsdWUge0Bjb2RlIG51bGx9IGludG8gdGhlCiAgICAgICogcmVjZWl2ZXIuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHdyaXRpbmcgdGhlIHRhZyBmb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbnVsbH0uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG91dHB1dC53cml0ZUJ5dGUoVENfTlVMTCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgb2JqZWN0IDxjb2RlPm9iamVjdDwvY29kZT4gaW50byB0aGUgcmVjZWl2ZXIncyB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYW4gb2JqZWN0IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGV4Y2VwdGlvbiBoYXBwZW5lZCB3aGVuIHdyaXRpbmcgdGhlIG9iamVjdAotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEBzZWUgT2JqZWN0SW5wdXRTdHJlYW0jcmVhZE9iamVjdCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IG9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVPYmplY3Qob2JqZWN0LCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgb2JqZWN0IDxjb2RlPm9iamVjdDwvY29kZT4gaW50byB0aGUgcmVjZWl2ZXIncyB1bmRlcmx5aW5nIHN0cmVhbQotICAgICAqIHVuc2hhcmVkIHdpdGggcHJldmlvdXNseSB3cml0dGVuIGlkZW50aWNhbCBvYmplY3RzLgorICAgICAqIFdyaXRlcyBhbiB1bnNoYXJlZCBvYmplY3QgdG8gdGhlIHRhcmdldCBzdHJlYW0uIFRoaXMgbWV0aG9kIGlzIGlkZW50aWNhbAorICAgICAqIHRvIHtAY29kZSB3cml0ZU9iamVjdH0sIGV4Y2VwdCB0aGF0IGl0IGFsd2F5cyB3cml0ZXMgYSBuZXcgb2JqZWN0IHRvIHRoZQorICAgICAqIHN0cmVhbSB2ZXJzdXMgdGhlIHVzZSBvZiBiYWNrLXJlZmVyZW5jaW5nIGZvciBpZGVudGljYWwgb2JqZWN0cyBieQorICAgICAqIHtAY29kZSB3cml0ZU9iamVjdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byB3cml0ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgb2JqZWN0Ci0gICAgICogCi0gICAgICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSNyZWFkT2JqZWN0KCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI3JlYWRVbnNoYXJlZCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVVbnNoYXJlZChPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZU9iamVjdChvYmplY3QsIHRydWUpOwpAQCAtMTgwMCw3ICsxOTE4LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBvYmplY3QgPGNvZGU+b2JqZWN0PC9jb2RlPiBpbnRvIHRoZSByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIFdyaXRlIG9iamVjdCB7QGNvZGUgb2JqZWN0fSBpbnRvIHRoZSByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gd3JpdGUKQEAgLTIwNDksMzEgKzIxNjcsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIHdyaXRlIDxjb2RlPm9iamVjdDwvY29kZT4gaW50bwotICAgICAqIHRoZSByZWNlaXZlcidzIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIE1ldGhvZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gd3JpdGUge0Bjb2RlIG9iamVjdH0gdG8gdGhlCisgICAgICogdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiB3cml0aW5nIHRoZSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZU9iamVjdE92ZXJyaWRlKE9iamVjdCBvYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciB2ZXJzaW9uIG9mIGhhcm1vbnkKICAgICAgICAgaWYgKCFzdWJjbGFzc092ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbikgewogICAgICAgICAgICAgLy8gU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIHByaW1pdGl2ZSBkYXRhIG9mIHR5cGUgc2hvcnQgKDxjb2RlPnZhbHVlPC9jb2RlPilpbnRvIHRoZQotICAgICAqIHJlY2VpdmVyJ3MgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgc2hvcnQgKDE2IGJpdCkgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgcHJpbWl0aXZlIGRhdGEgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgcHJpbWl0aXZlIGRhdGEuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVTaG9ydChpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrV3JpdGVQcmltaXRpdmVUeXBlcygpOwpAQCAtMjA4MSwxMCArMjIwMSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgT2JqZWN0T3V0cHV0U3RyZWFtIGhlYWRlciBpbnRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgdGhlIHtAbGluayBPYmplY3RPdXRwdXRTdHJlYW19IGhlYWRlciB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXhjZXB0aW9uIGhhcHBlbmVkIHdoZW4gd3JpdGluZyB0aGUgc3RyZWFtIGhlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVN0cmVhbUhlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG91dHB1dC53cml0ZVNob3J0KFNUUkVBTV9NQUdJQyk7CkBAIC0yMDkyLDE0ICsyMjEzLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgcHJpbWl0aXZlIGRhdGEgb2YgdHlwZSBTdHJpbmcgKDxjb2RlPnZhbHVlPC9jb2RlPikgaW4gVVRGCi0gICAgICogZm9ybWF0IGludG8gdGhlIHJlY2VpdmVyJ3MgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgc3RyaW5nIGVuY29kZWQgd2l0aCB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fSB0byB0aGUKKyAgICAgKiB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHByaW1pdGl2ZSBkYXRhIHRvIHdyaXRlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQgd2hlbiB3cml0aW5nIHRoZSBwcmltaXRpdmUgZGF0YS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVVURihTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrV3JpdGVQcmltaXRpdmVUeXBlcygpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtQ2xhc3MuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdFN0cmVhbUNsYXNzLmphdmEKaW5kZXggZmJmZDA3MC4uMzdiMWYxNyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtQ2xhc3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RTdHJlYW1DbGFzcy5qYXZhCkBAIC0zNSwxNyArMzUsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uOwogCiAvKioKLSAqIEluc3RhbmNlcyBvZiBPYmplY3RTdHJlYW1DbGFzcyBhcmUgdXNlZCB0byBkZXNjcmliZSBjbGFzc2VzIG9mIG9iamVjdHMgdXNlZAotICogYnkgc2VyaWFsaXphdGlvbi4gV2hlbiBvYmplY3RzIGFyZSBzYXZlZCwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGl0cwotICogc3VwZXJjbGFzc2VzIGlzIGFsc28gc2F2ZWQgYnkgdGhlIHVzZSBvZiBkZXNjcmlwdG9ycywgaW5zdGFuY2VzIG9mCi0gKiBPYmplY3RTdHJlYW1DbGFzcy4KLSAqIAotICogVGhlc2UgZGVzY3JpcHRvcnMgY2FycnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzIHRoZXkgcmVwcmVzZW50LCBzdWNoIGFzIC0KLSAqIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyAtIFNVSUQgb2YgdGhlIGNsYXNzIC0gRmllbGQgbmFtZXMgYW5kIHR5cGVzCisgKiBSZXByZXNlbnRzIGEgZGVzY3JpcHRvciBmb3IgaWRlbnRpZnlpbmcgYSBjbGFzcyBkdXJpbmcgc2VyaWFsaXphdGlvbiBhbmQKKyAqIGRlc2VyaWFsaXphdGlvbi4gSW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBkZXNjcmlwdG9yIGluY2x1ZGVzIHRoZSBuYW1lCisgKiBhbmQgU1VJRCBvZiB0aGUgY2xhc3MgYXMgd2VsbCBhcyBmaWVsZCBuYW1lcyBhbmQgdHlwZXMuIEluZm9ybWF0aW9uIGluaGVyaXRlZAorICogZnJvbSB0aGUgc3VwZXJjbGFzc2VzIGlzIGFsc28gdGFrZW4gaW50byBhY2NvdW50LgogICogCiAgKiBAc2VlIE9iamVjdE91dHB1dFN0cmVhbQogICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbQogICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBPYmplY3RTdHJlYW1DbGFzcyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTk4LDcgKzk3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSBjbGFzcyBoYXMgbm8gU2VyaWFsaXphYmxlIGZpZWxkcworICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgY2xhc3MgaGFzIG5vIFNlcmlhbGl6YWJsZSBmaWVsZHMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIE5PX0ZJRUxEUyA9IG5ldyBPYmplY3RTdHJlYW1GaWVsZFswXTsKIApAQCAtMTgyLDkgKzE4Myw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkIGFuIGV4dHJhIGVudHJ5IG1hcHBpbmcgYSBnaXZlbiBjbGFzcyA8Y29kZT5jbDwvY29kZT4gdG8gaXRzIGNsYXNzCisgICAgICogQWRkcyBhbiBleHRyYSBlbnRyeSBtYXBwaW5nIGEgZ2l2ZW4gY2xhc3Mge0Bjb2RlIGNsfSB0byBpdHMgY2xhc3MKICAgICAgKiBkZXNjcmlwdG9yLCB3aGljaCB3aWxsIGJlIGNvbXB1dGVkIChhbiBPYmplY3RTdHJlYW1DbGFzcykuIElmCi0gICAgICogPGNvZGU+Y29tcHV0ZVNVSUQ8L2NvZGU+IGlzIHRydWUsIHRoaXMgbWV0aG9kIHdpbGwgY29tcHV0ZSB0aGUgU1VJRCBmb3IKKyAgICAgKiB7QGNvZGUgY29tcHV0ZVNVSUR9IGlzIHRydWUsIHRoaXMgbWV0aG9kIHdpbGwgY29tcHV0ZSB0aGUgU1VJRCBmb3IKICAgICAgKiB0aGlzIGNsYXNzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbApAQCAtMzE2LDcgKzMxNyw3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIENvbXB1dGUgYW5kIHJldHVybiB0aGUgU2VyaWFsIFZlcnNpb24gVUlEIG9mIHRoZSBjbGFzcyA8Y29kZT5jbDwvY29kZT4uCisgICAgICogQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBTZXJpYWwgVmVyc2lvbiBVSUQgb2YgdGhlIGNsYXNzIHtAY29kZSBjbH0uCiAgICAgICogVGhlIHZhbHVlIGlzIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBjbGFzcyBuYW1lLCBzdXBlcmNsYXNzIGNoYWluLCBmaWVsZAogICAgICAqIG5hbWVzLCBtZXRob2QgbmFtZXMsIG1vZGlmaWVycywgZXRjLgogICAgICAqIApAQCAtNTMxLDggKzUzMiw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHdoYXQgdGhlIHNlcmlhbGl6YXRvbiBzcGVjaWZpY2F0aW9uIGNhbGxzICJkZXNjcmlwdG9yIiBnaXZlbiBhCi0gICAgICogZmllbGQgc2lnbmF0dXJlLiBzaWduYXR1cmUuCisgICAgICogUmV0dXJucyB3aGF0IHRoZSBzZXJpYWxpemF0b24gc3BlY2lmaWNhdGlvbiBjYWxscyAiZGVzY3JpcHRvciIgZ2l2ZW4gYQorICAgICAqIGZpZWxkIHNpZ25hdHVyZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2lnbmF0dXJlCiAgICAgICogICAgICAgICAgICBhIGZpZWxkIHNpZ25hdHVyZQpAQCAtNTU1LDEzICs1NTYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIDxjb2RlPnNlcmlhbFBlcnNpc3RlbnRGaWVsZHM8L2NvZGU+Ci0gICAgICogaWYgY2xhc3MgPGNvZGU+Y2w8L2NvZGU+IGltcGxlbWVudHMgaXQuIFJldHVybiBudWxsIG90aGVyd2lzZS4KKyAgICAgKiBSZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHtAY29kZSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzfQorICAgICAqIGlmIGNsYXNzIHtAY29kZSBjbH0gaW1wbGVtZW50cyBpdC4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbAogICAgICAqICAgICAgICAgICAgYSBqYXZhLmxhbmcuQ2xhc3Mgd2hpY2ggdG8gdGVzdAotICAgICAqIEByZXR1cm4gPGNvZGU+amF2YS5sYW5nLnJlZmxlY3QuRmllbGQ8L2NvZGU+IGlmIHRoZSBjbGFzcyBoYXMKLSAgICAgKiAgICAgICAgIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNsYXNzIGRvZXMgbm90CisgICAgICogQHJldHVybiB7QGNvZGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGR9IGlmIHRoZSBjbGFzcyBoYXMKKyAgICAgKiAgICAgICAgIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMge0Bjb2RlIG51bGx9IGlmIHRoZSBjbGFzcyBkb2VzIG5vdAogICAgICAqICAgICAgICAgaGF2ZSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCiAgICAgICovCiAgICAgc3RhdGljIEZpZWxkIGZpZWxkU2VyaWFsUGVyc2lzdGVudEZpZWxkcyhDbGFzczw/PiBjbCkgewpAQCAtNTgxLDExICs1ODIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIChqYXZhLmxhbmcuQ2xhc3MpIHRoYXQgdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyAoamF2YS5sYW5nLkNsYXNzKSBmb3IgdGhpcyBkZXNjcmlwdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBjbGFzcyBmb3IgdGhlCi0gICAgICogICAgICAgICByZWNlaXZlciA8Y29kZT5DbGFzczwvY29kZT4gVGhlIGxvYWRlZCBjbGFzcyBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogICAgICAgICB0aGUgcmVjZWl2ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBpbiB0aGUgbG9jYWwgVk0gdGhhdCB0aGlzIGRlc2NyaXB0b3IgcmVwcmVzZW50czsKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGNsYXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzczw/PiBmb3JDbGFzcygpIHsKICAgICAgICAgaWYgKHJlc29sdmVkQ2xhc3MgIT0gbnVsbCkgewpAQCAtNTk1LDIzICs1OTYsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzaWduYXR1cmUgZm9yIGEgQ29uc3RydWN0b3IKLSAgICAgKiA8Y29kZT5jPC9jb2RlPi4KKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzaWduYXR1cmUgZm9yIGEgQ29uc3RydWN0b3Ige0Bjb2RlIGN9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCiAgICAgICogICAgICAgICAgICBhIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGZvciB3aGljaCB0byBjb21wdXRlIHRoZQogICAgICAqICAgICAgICAgICAgc2lnbmF0dXJlCiAgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0b3IncyBzaWduYXR1cmUKLSAgICAgKiAKICAgICAgKi8KICAgICBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRDb25zdHJ1Y3RvclNpZ25hdHVyZShDb25zdHJ1Y3Rvcjw/PiBjKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBnaXZlbiBmaWVsZCBieSBuYW1lLgorICAgICAqIEdldHMgYSBmaWVsZCBkZXNjcmlwdG9yIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIGNsYXNzCisgICAgICogZGVzY3JpcHRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZGVzaXJlZCBmaWVsZC4KLSAgICAgKiBAcmV0dXJuIGEgZ2l2ZW4gZmllbGQgYnkgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkge0Bjb2RlIG5hbWV9IG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcworICAgICAqICAgICAgICAgbm8gc3VjaCBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0U3RyZWFtRmllbGQgZ2V0RmllbGQoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgT2JqZWN0U3RyZWFtRmllbGRbXSBhbGxGaWVsZHMgPSBnZXRGaWVsZHMoKTsKQEAgLTY0NywxMSArNjQ5LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiBmaWVsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpZWxkcyBvZiB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIGNsYXNzCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgZmllbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBzZXJpYWxpemVkIGZpZWxkcyBvZgorICAgICAqIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIGNsYXNzIGRlc2NyaXB0b3IuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBjb2xsZWN0aW9uIG9mIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIGNsYXNzIGl0Ci0gICAgICogICAgICAgICByZXByZXNlbnRzCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmaWVsZCBkZXNjcmlwdG9ycyBvciBhbiBhcnJheSBvZiBsZW5ndGggemVybyBpZiB0aGVyZQorICAgICAqICAgICAgICAgYXJlIG5vIGZpZWxkcyBpbiB0aGlzIGRlc2NyaXB0b3IncyBjbGFzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0U3RyZWFtRmllbGRbXSBnZXRGaWVsZHMoKSB7CiAgICAgICAgIGNvcHlGaWVsZEF0dHJpYnV0ZXMoKTsKQEAgLTY5Niw3ICs2OTksNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNpZ25hdHVyZSBmb3IgYSBmaWVsZCA8Y29kZT5mPC9jb2RlPi4KKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzaWduYXR1cmUgZm9yIGEgZmllbGQge0Bjb2RlIGZ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmCiAgICAgICogICAgICAgICAgICBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBzaWduYXR1cmUKQEAgLTcxOCw3ICs3MjEsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNpZ25hdHVyZSBmb3IgYSBtZXRob2QgPGNvZGU+bTwvY29kZT4uCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2lnbmF0dXJlIGZvciBhIG1ldGhvZCB7QGNvZGUgbX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG0KICAgICAgKiAgICAgICAgICAgIGEgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBzaWduYXR1cmUKQEAgLTcyNywxOSArNzMwLDIxIEBACiAgICAgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0TWV0aG9kU2lnbmF0dXJlKE1ldGhvZCBtKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoZSByZWNlaXZlcgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgZGVzY3JpcHRvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cworICAgICAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGlzIGRlc2NyaXB0b3IgcmVwcmVzZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBjbGFzc05hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU2VyaWFsIFZlcnNpb24gVXNlciBJRCBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhlCi0gICAgICogcmVjZWl2ZXIKKyAgICAgKiBSZXR1cm5zIHRoZSBTZXJpYWwgVmVyc2lvbiBVc2VyIElEIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICogZGVzY3JpcHRvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFNVSUQgZm9yIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGUgcmVjZWl2ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBTVUlEIGZvciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldFNlcmlhbFZlcnNpb25VSUQoKSB7CiAgICAgICAgIHJldHVybiBzdlVJRDsKQEAgLTc1NywyNyArNzYyLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIDxjb2RlPmNsPC9jb2RlPiBoYXMgdGhlCi0gICAgICogY29tcGlsZXItZ2VuZXJhdGVkIG1ldGhvZCA8Y29kZT5jbGluaXQ8L2NvZGU+LiBFdmVuIHRob3VnaCBpdCBpcworICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzcyB7QGNvZGUgY2x9IGhhcyB0aGUKKyAgICAgKiBjb21waWxlci1nZW5lcmF0ZWQgbWV0aG9kIHtAY29kZSBjbGluaXR9LiBFdmVuIHRob3VnaCBpdCBpcwogICAgICAqIGNvbXBpbGVyLWdlbmVyYXRlZCwgaXQgaXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBjb2RlIHRvIGNvbXB1dGUgU1VJRC4KICAgICAgKiBUaGlzIGlzIHVuZm9ydHVuYXRlLCBzaW5jZSBpdCBtYXkgZGVwZW5kIG9uIGNvbXBpbGVyIG9wdGltaXphdGlvbnMgaW4KICAgICAgKiBzb21lIGNhc2VzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbAogICAgICAqICAgICAgICAgICAgYSBqYXZhLmxhbmcuQ2xhc3Mgd2hpY2ggdG8gdGVzdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsYXNzIGhhcyA8Y2xpbml0PiA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2xhc3MgaGFzIDxjbGluaXQ+IHtAY29kZSBmYWxzZX0KICAgICAgKiAgICAgICAgIGlmIHRoZSBjbGFzcyBkb2VzIG5vdCBoYXZlIDxjbGluaXQ+CiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaGFzQ2xpbml0KENsYXNzPD8+IGNsKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzcyA8Y29kZT5jbDwvY29kZT4gaW1wbGVtZW50cyBwcml2YXRlCi0gICAgICogbWV0aG9kIDxjb2RlPnJlYWRPYmplY3QoKTwvY29kZT4uCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIHtAY29kZSBjbH0gaW1wbGVtZW50cyBwcml2YXRlCisgICAgICogbWV0aG9kIHtAY29kZSByZWFkT2JqZWN0KCl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbAogICAgICAqICAgICAgICAgICAgYSBqYXZhLmxhbmcuQ2xhc3Mgd2hpY2ggdG8gdGVzdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsYXNzIGltcGxlbWVudHMgcmVhZE9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgcmVhZE9iamVjdAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHJlYWRPYmplY3QKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgdGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCByZWFkT2JqZWN0CiAgICAgICovCiAgICAgc3RhdGljIE1ldGhvZCBnZXRQcml2YXRlUmVhZE9iamVjdE1ldGhvZChDbGFzczw/PiBjbCkgewogICAgICAgICB0cnkgewpAQCAtNzk0LDEzICs3OTksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2xhc3MgPGNvZGU+Y2w8L2NvZGU+IGltcGxlbWVudHMgcHJpdmF0ZQotICAgICAqIG1ldGhvZCA8Y29kZT5yZWFkT2JqZWN0KCk8L2NvZGU+LgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzcyB7QGNvZGUgY2x9IGltcGxlbWVudHMgcHJpdmF0ZQorICAgICAqIG1ldGhvZCB7QGNvZGUgcmVhZE9iamVjdCgpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2wKICAgICAgKiAgICAgICAgICAgIGEgamF2YS5sYW5nLkNsYXNzIHdoaWNoIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHJlYWRPYmplY3QKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHJlYWRPYmplY3QKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2xhc3MgaW1wbGVtZW50cyByZWFkT2JqZWN0CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIHRoZSBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgcmVhZE9iamVjdAogICAgICAqLwogICAgIHN0YXRpYyBNZXRob2QgZ2V0UHJpdmF0ZVJlYWRPYmplY3ROb0RhdGFNZXRob2QoQ2xhc3M8Pz4gY2wpIHsKICAgICAgICAgdHJ5IHsKQEAgLTgxNywxMyArODIyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIDxjb2RlPmNsPC9jb2RlPiBpbXBsZW1lbnRzIHByaXZhdGUKLSAgICAgKiBtZXRob2QgPGNvZGU+d3JpdGVPYmplY3QoKTwvY29kZT4uCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIHtAY29kZSBjbH0gaW1wbGVtZW50cyBwcml2YXRlCisgICAgICogbWV0aG9kIHtAY29kZSB3cml0ZU9iamVjdCgpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2wKICAgICAgKiAgICAgICAgICAgIGEgamF2YS5sYW5nLkNsYXNzIHdoaWNoIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHdyaXRlT2JqZWN0Ci0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCB3cml0ZU9iamVjdAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHdyaXRlT2JqZWN0CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIHRoZSBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgd3JpdGVPYmplY3QKICAgICAgKi8KICAgICBzdGF0aWMgTWV0aG9kIGdldFByaXZhdGVXcml0ZU9iamVjdE1ldGhvZChDbGFzczw/PiBjbCkgewogICAgICAgICB0cnkgewpAQCAtODQwLDEzICs4NDUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBpbnN0YW5jZXMgb2YgY2xhc3MgPGNvZGU+Y2w8L2NvZGU+IGFyZSBFeHRlcm5hbGl6YWJsZSwKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBpbnN0YW5jZXMgb2YgY2xhc3Mge0Bjb2RlIGNsfSBhcmUgRXh0ZXJuYWxpemFibGUsCiAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbAogICAgICAqICAgICAgICAgICAgYSBqYXZhLmxhbmcuQ2xhc3Mgd2hpY2ggdG8gdGVzdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBhcmUgRXh0ZXJuYWxpemFibGUKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGFyZSBub3QKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGFyZSBFeHRlcm5hbGl6YWJsZQorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGFyZSBub3QKICAgICAgKiAgICAgICAgIEV4dGVybmFsaXphYmxlCiAgICAgICogCiAgICAgICogQHNlZSBPYmplY3QjaGFzaENvZGUKQEAgLTg2MCw4ICs4NjUsOCBAQAogICAgICAqIDxjb2RlPnR5cGVjb2RlPGNvZGU+IGRlc2NyaWJlcyBhIHByaW1pdGl2ZSB0eXBlCiAgICAgICoKICAgICAgKiBAcGFyYW0gdHlwZWNvZGUgYSBjaGFyIGRlc2NyaWJpbmcgdGhlIHR5cGVjb2RlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHlwZWNvZGUgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSB0eXBlIAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdHlwZWNvZGUgcmVwcmVzZW50cyBhbiBPYmplY3QgdHlwZSAoaW5jbHVkaW5nIGFycmF5cykKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdHlwZWNvZGUgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSB0eXBlIAorICAgICAqIHtAY29kZSBmYWxzZX0gaWYgdGhlIHR5cGVjb2RlIHJlcHJlc2VudHMgYW4gT2JqZWN0IHR5cGUgKGluY2x1ZGluZyBhcnJheXMpCiAgICAgICoKICAgICAgKiBAc2VlIE9iamVjdCNoYXNoQ29kZQogICAgICAqLwpAQCAtODcwLDEzICs4NzUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBpbnN0YW5jZXMgb2YgY2xhc3MgPGNvZGU+Y2w8L2NvZGU+IGFyZSBTZXJpYWxpemFibGUsCisgICAgICogUmV0dXJuIHRydWUgaWYgaW5zdGFuY2VzIG9mIGNsYXNzIHtAY29kZSBjbH0gYXJlIFNlcmlhbGl6YWJsZSwKICAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNsCiAgICAgICogICAgICAgICAgICBhIGphdmEubGFuZy5DbGFzcyB3aGljaCB0byB0ZXN0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGFyZSBTZXJpYWxpemFibGUKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGFyZSBub3QKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGFyZSBTZXJpYWxpemFibGUKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBhcmUgbm90CiAgICAgICogICAgICAgICBTZXJpYWxpemFibGUKICAgICAgKiAKICAgICAgKiBAc2VlIE9iamVjdCNoYXNoQ29kZQpAQCAtOTAzLDE3ICs5MDgsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGRlc2NyaXB0b3IgKE9iamVjdFN0cmVhbUNsYXNzKSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGFzcwotICAgICAqIDxjb2RlPmNsPC9jb2RlPi4gSWYgdGhlIGNsYXNzIGlzIG5vdCBTZXJpYWxpemFibGUgb3IgRXh0ZXJuYWxpemFibGUsCi0gICAgICogbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIHtAY29kZSBjbH0uIElmIHRoZQorICAgICAqIGNsYXNzIGlzIG5vdCBzZXJpYWxpemFibGUgb3IgZXh0ZXJuYWxpemFibGUgdGhlbiB7QGNvZGUgbnVsbH0gaXMKKyAgICAgKiByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2wKICAgICAgKiAgICAgICAgICAgIGEgamF2YS5sYW5nQ2xhc3MgZm9yIHdoaWNoIHRvIG9idGFpbiB0aGUgY29ycmVzcG9uZGluZwogICAgICAqICAgICAgICAgICAgZGVzY3JpcHRvcgotICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5jbDwvY29kZT4KLSAgICAgKiAgICAgICAgIGFyZSBub3QgU2VyaWFsaXphYmxlIG9yIEV4dGVybmFsaXphYmxlCi0gICAgICogICAgICAgICA8Y29kZT5PYmplY3RTdHJlYW1DbGFzczwvY29kZT4gVGhlIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvciBpZgotICAgICAqICAgICAgICAgdGhlIGNsYXNzIDxjb2RlPmNsPC9jb2RlPiBpcyBTZXJpYWxpemFibGUgb3IgRXh0ZXJuYWxpemFibGUKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3IgaWYgdGhlIHtAY29kZSBjbH0gaXMgc2VyaWFsaXphYmxlIG9yCisgICAgICogICAgICAgICBleHRlcm5hbGl6YWJsZTsge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE9iamVjdFN0cmVhbUNsYXNzIGxvb2t1cChDbGFzczw/PiBjbCkgewogICAgICAgICBib29sZWFuIHNlcmlhbGl6YWJsZSA9IGlzU2VyaWFsaXphYmxlKGNsKTsKQEAgLTkyOSw3ICs5MzMsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkZXNjcmlwdG9yIChPYmplY3RTdHJlYW1DbGFzcykgY29ycmVzcG9uZGluZyB0byB0aGUgY2xhc3MKLSAgICAgKiA8Y29kZT5jbDwvY29kZT4uIFJldHVybnMgYW4gT2JqZWN0U3RyZWFtQ2xhc3MgZXZlbiBpZiBpbnN0YW5jZXMgb2YgdGhlCisgICAgICoge0Bjb2RlIGNsfS4gUmV0dXJucyBhbiBPYmplY3RTdHJlYW1DbGFzcyBldmVuIGlmIGluc3RhbmNlcyBvZiB0aGUKICAgICAgKiBjbGFzcyBjYW5ub3QgYmUgc2VyaWFsaXplZAogICAgICAqIAogICAgICAqIEBwYXJhbSBjbApAQCAtOTQzLDExICs5NDcsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRvciAoT2JqZWN0U3RyZWFtQ2xhc3MpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzCi0gICAgICogPGNvZGU+Y2w8L2NvZGU+LiBSZXR1cm5zIGFuIE9iamVjdFN0cmVhbUNsYXNzIGV2ZW4gaWYgaW5zdGFuY2VzIG9mIHRoZQorICAgICAqIHtAY29kZSBjbH0uIFJldHVybnMgYW4gT2JqZWN0U3RyZWFtQ2xhc3MgZXZlbiBpZiBpbnN0YW5jZXMgb2YgdGhlCiAgICAgICogY2xhc3MgY2Fubm90IGJlIHNlcmlhbGl6ZWQKICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2wKLSAgICAgKiAgICAgICAgICAgIGEgPGNvZGU+amF2YS5sYW5nQ2xhc3M8L2NvZGU+IGZvciB3aGljaCB0byBvYnRhaW4gdGhlCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBqYXZhLmxhbmdDbGFzc30gZm9yIHdoaWNoIHRvIG9idGFpbiB0aGUKICAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvcgogICAgICAqIEBwYXJhbSBjb21wdXRlU1VJRAogICAgICAqICAgICAgICAgICAgYSBib29sZWFuIGluZGljYXRpbmcgaWYgU1VJRCBzaG91bGQgYmUgY29tcHV0ZWQgb3Igbm90LgpAQCAtOTY0LDEzICs5NjgsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCA8Y29kZT5yZWFkUmVzb2x2ZTwvY29kZT4gaWYgY2xhc3MKLSAgICAgKiA8Y29kZT5jbDwvY29kZT4gaW1wbGVtZW50cyBpdC4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIFJldHVybiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHtAY29kZSByZWFkUmVzb2x2ZX0gaWYgY2xhc3MKKyAgICAgKiB7QGNvZGUgY2x9IGltcGxlbWVudHMgaXQuIFJldHVybiBudWxsIG90aGVyd2lzZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2wKICAgICAgKiAgICAgICAgICAgIGEgamF2YS5sYW5nLkNsYXNzIHdoaWNoIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDwvY29kZT4gaWYgdGhlIGNsYXNzIGltcGxlbWVudHMKLSAgICAgKiAgICAgICAgIHJlYWRSZXNvbHZlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2R9IGlmIHRoZSBjbGFzcyBpbXBsZW1lbnRzCisgICAgICogICAgICAgICByZWFkUmVzb2x2ZSB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudAogICAgICAqICAgICAgICAgcmVhZFJlc29sdmUKICAgICAgKi8KICAgICBzdGF0aWMgTWV0aG9kIG1ldGhvZFJlYWRSZXNvbHZlKENsYXNzPD8+IGNsKSB7CkBAIC05OTIsMTMgKzk5NiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIDxjb2RlPndyaXRlUmVwbGFjZTwvY29kZT4gaWYgY2xhc3MKLSAgICAgKiA8Y29kZT5jbDwvY29kZT4gaW1wbGVtZW50cyBpdC4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIFJldHVybiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHtAY29kZSB3cml0ZVJlcGxhY2V9IGlmIGNsYXNzCisgICAgICoge0Bjb2RlIGNsfSBpbXBsZW1lbnRzIGl0LiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNsCiAgICAgICogICAgICAgICAgICBhIGphdmEubGFuZy5DbGFzcyB3aGljaCB0byB0ZXN0Ci0gICAgICogQHJldHVybiA8Y29kZT5qYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q8L2NvZGU+IGlmIHRoZSBjbGFzcyBpbXBsZW1lbnRzCi0gICAgICogICAgICAgICB3cml0ZVJlcGxhY2UgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudAorICAgICAqIEByZXR1cm4ge0Bjb2RlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZH0gaWYgdGhlIGNsYXNzIGltcGxlbWVudHMKKyAgICAgKiAgICAgICAgIHdyaXRlUmVwbGFjZSB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudAogICAgICAqICAgICAgICAgd3JpdGVSZXBsYWNlCiAgICAgICovCiAgICAgc3RhdGljIE1ldGhvZCBtZXRob2RXcml0ZVJlcGxhY2UoQ2xhc3M8Pz4gY2wpIHsKQEAgLTExMTgsMTAgKzExMjIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICogZGVzY3JpcHRvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGRlc2NyaXB0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdFN0cmVhbUNvbnN0YW50cy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtQ29uc3RhbnRzLmphdmEKaW5kZXggYWE5YTZhZS4uOGY3YWQ2NiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtQ29uc3RhbnRzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtQ29uc3RhbnRzLmphdmEKQEAgLTE4LDg1ICsxOCwyMjggQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBIZWxwZXIgaW50ZXJmYWNlIHdpdGggY29uc3RhbnRzIHVzZWQgYnkgdGhlIHNlcmlhbGl6YXRpb24gaW1wbGVtZW50YXRpb24uCisgKiBBIGhlbHBlciBpbnRlcmZhY2Ugd2l0aCBjb25zdGFudHMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgT2JqZWN0U3RyZWFtQ29uc3RhbnRzIHsKIAogICAgIC8qKgotICAgICAqIFVzZWQgZm9yIHRoZSBzdHJlYW0gaGVhZGVyCisgICAgICogVGhlIHN0cmVhbSBoZWFkZXIncyBtYWdpYyBudW1iZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTVFJFQU1fTUFHSUMgPSAoc2hvcnQpIDB4YWNlZDsKIAogICAgIC8qKgotICAgICAqIFVzZWQgZm9yIHRoZSBzdHJlYW0gaGVhZGVyCisgICAgICogVGhlIHN0cmVhbSBoZWFkZXIncyB2ZXJzaW9uIG51bWJlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFNUUkVBTV9WRVJTSU9OID0gNTsKIAogICAgIC8vIFRoZXNlIGFyZSB0YWdzIHRvIGluZGljYXRlIHRoZSBzdHJlYW0gY29udGVudHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbWluaW11bSB0YWcgdmFsdWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0JBU0UgPSAweDcwOwogCisgICAgLyoqCisgICAgICogVGFnIHRvIG1hcmsgYSB7QGNvZGUgbnVsbH0gb2JqZWN0IHJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfTlVMTCA9IChieXRlKSAweDcwOwogCisgICAgLyoqCisgICAgICogVGFnIHRvIG1hcmsgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZQorICAgICAqIHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfUkVGRVJFTkNFID0gKGJ5dGUpIDB4NzE7CiAKKyAgICAvKioKKyAgICAgKiBUYWcgdG8gbWFyayBhIG5ldyBjbGFzcyBkZXNjcmlwdG9yLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19DTEFTU0RFU0MgPSAoYnl0ZSkgMHg3MjsKIAorICAgIC8qKgorICAgICAqIFRhZyB0byBtYXJrIGEgbmV3IG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfT0JKRUNUID0gKGJ5dGUpIDB4NzM7CiAKKyAgICAvKioKKyAgICAgKiBUYWcgdG8gbWFyayBhIG5ldyBzdHJpbmcuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX1NUUklORyA9IChieXRlKSAweDc0OwogCisgICAgLyoqCisgICAgICogVGFnIHRvIG1hcmsgYSBuZXcgYXJyYXkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0FSUkFZID0gKGJ5dGUpIDB4NzU7CiAKKyAgICAvKioKKyAgICAgKiBUYWcgdG8gbWFyayBhIHJlZmVyZW5jZSB0byBhIGNsYXNzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19DTEFTUyA9IChieXRlKSAweDc2OwogCisgICAgLyoqCisgICAgICogVGFnIHRvIG1hcmsgYSBibG9jayBvZiBvcHRpb25hbCBkYXRhLiBUaGUgYnl0ZSBmb2xsb3dpbmcgdGhpcyB0YWcKKyAgICAgKiBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIGJsb2NrLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19CTE9DS0RBVEEgPSAoYnl0ZSkgMHg3NzsKIAorICAgIC8qKgorICAgICAqIFRhZyB0byBtYXJrIHRoZSBlbmQgb2YgYmxvY2sgZGF0YSBibG9ja3MgZm9yIGFuIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfRU5EQkxPQ0tEQVRBID0gKGJ5dGUpIDB4Nzg7CiAKKyAgICAvKioKKyAgICAgKiBUYWcgdG8gbWFyayBhIHN0cmVhbSByZXNldC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfUkVTRVQgPSAoYnl0ZSkgMHg3OTsKIAorICAgIC8qKgorICAgICAqIFRhZyB0byBtYXJrIGEgbG9uZyBibG9jayBvZiBkYXRhLiBUaGUgbG9uZyBmb2xsb3dpbmcgdGhpcyB0YWcKKyAgICAgKiBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIGJsb2NrLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19CTE9DS0RBVEFMT05HID0gKGJ5dGUpIDB4N0E7CiAKKyAgICAvKioKKyAgICAgKiBUYWcgdG8gbWFyayBhbiBleGNlcHRpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0VYQ0VQVElPTiA9IChieXRlKSAweDdCOwogCisgICAgLyoqCisgICAgICogVGFnIHRvIG1hcmsgYSBsb25nIHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfTE9OR1NUUklORyA9IChieXRlKSAweDdDOwogCisgICAgLyoqCisgICAgICogVGFnIHRvIG1hcmsgYSBuZXcgcHJveHkgY2xhc3MgZGVzY3JpcHRvci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfUFJPWFlDTEFTU0RFU0MgPSAoYnl0ZSkgMHg3RDsKIAorICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHRhZyB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfTUFYID0gMHg3RTsKIAogICAgIC8qKgotICAgICAqIFRoZSBmaXJzdCBvYmplY3QgZHVtcGVkIGdldHMgYXNzaWduZWQgdGhpcyBoYW5kbGUvSUQKKyAgICAgKiBIYW5kbGUgZm9yIHRoZSBmaXJzdCBvYmplY3QgdGhhdCBnZXRzIHNlcmlhbGl6ZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFzZVdpcmVIYW5kbGUgPSAweDAwN2UwMDAwOwogCisgICAgLyoqCisgICAgICogU3RyZWFtIHByb3RvY29sIHZlcnNpb24gMS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9WRVJTSU9OXzEgPSAxOwogCisgICAgLyoqCisgICAgICogU3RyZWFtIHByb3RvY29sIHZlcnNpb24gMi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9WRVJTSU9OXzIgPSAyOwogCisgICAgLyoqCisgICAgICogUGVybWlzc2lvbiBjb25zdGFudCB0byBlbmFibGUgc3ViY2xhc3Npbmcgb2YgT2JqZWN0SW5wdXRTdHJlYW0gYW5kCisgICAgICogT2JqZWN0T3V0cHV0U3RyZWFtLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VyaWFsaXphYmxlUGVybWlzc2lvbiBTVUJDTEFTU19JTVBMRU1FTlRBVElPTl9QRVJNSVNTSU9OID0gbmV3IFNlcmlhbGl6YWJsZVBlcm1pc3Npb24oCiAgICAgICAgICAgICAiZW5hYmxlU3ViY2xhc3NJbXBsZW1lbnRhdGlvbiIpOyAvLyROT04tTkxTLTEkCiAKKyAgICAvKioKKyAgICAgKiBQZXJtaXNzaW9uIGNvbnN0YW50IHRvIGVuYWJsZSBvYmplY3Qgc3Vic3RpdHV0aW9uIGR1cmluZyBzZXJpYWxpemF0aW9uCisgICAgICogYW5kIGRlc2VyaWFsaXphdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlcmlhbGl6YWJsZVBlcm1pc3Npb24gU1VCU1RJVFVUSU9OX1BFUk1JU1NJT04gPSBuZXcgU2VyaWFsaXphYmxlUGVybWlzc2lvbigKICAgICAgICAgICAgICJlbmFibGVTdWJzdGl0dXRpb24iKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLy8gRmxhZ3MgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgb2JqZWN0IHdhcyBzZXJpYWxpemFibGUsIGV4dGVybmFsaXphYmxlCiAgICAgLy8gYW5kIGhhZCBhIHdyaXRlT2JqZWN0IG1ldGhvZCB3aGVuIGR1bXBlZC4KKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgdGhlIHtAY29kZSBmbGFnfSBmaWVsZCBpbiBPYmplY3RTdHJlYW1DbGFzcy4gSW5kaWNhdGVzCisgICAgICogdGhhdCBhIHNlcmlhbGl6YWJsZSBjbGFzcyBoYXMgaXRzIG93biB7QGNvZGUgd3JpdGVPYmplY3R9IG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0NfV1JJVEVfTUVUSE9EID0gMHgwMTsgLy8gSWYgU0NfU0VSSUFMSVpBQkxFCiAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgdGhlIHtAY29kZSBmbGFnfSBmaWVsZCBpbiBPYmplY3RTdHJlYW1DbGFzcy4gSW5kaWNhdGVzCisgICAgICogdGhhdCBhIGNsYXNzIGlzIHNlcmlhbGl6YWJsZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0NfU0VSSUFMSVpBQkxFID0gMHgwMjsKIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciB0aGUge0Bjb2RlIGZsYWd9IGZpZWxkIGluIE9iamVjdFN0cmVhbUNsYXNzLiBJbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGEgY2xhc3MgaXMgZXh0ZXJuYWxpemFibGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNDX0VYVEVSTkFMSVpBQkxFID0gMHgwNDsKIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciB0aGUge0Bjb2RlIGZsYWd9IGZpZWxkIGluIE9iamVjdFN0cmVhbUNsYXNzLiBJbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGFuIGV4dGVybmFsaXphYmxlIGNsYXNzIGlzIHdyaXR0ZW4gaW4gYmxvY2sgZGF0YSBtb2RlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTQ19CTE9DS19EQVRBID0gMHgwODsgLy8gSWYgU0NfRVhURVJOQUxJWkFCTEUKIAogICAgIC8qKgotICAgICAqIGNvbnN0YW50IGZvciBuZXcgZW51bQorICAgICAqIFRhZyB0byBtYXJrIGEgbmV3IGVudW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0VOVU0gPSAweDdFOwogCiAgICAgLyoqCi0gICAgICogdGhlIGJpdG1hc2sgZGVub3RpbmcgdGhhdCB0aGUgb2JqZWN0IGlzIGEgZW51bQorICAgICAqIEJpdCBtYXNrIGZvciB0aGUge0Bjb2RlIGZsYWd9IGZpZWxkIGluIE9iamVjdFN0cmVhbUNsYXNzLiBJbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGEgY2xhc3MgaXMgYW4gZW51bSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTQ19FTlVNID0gMHgxMDsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdFN0cmVhbUV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtRXhjZXB0aW9uLmphdmEKaW5kZXggNWEwNDFhMy4uYTA2YjEwMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtRXhjZXB0aW9uLmphdmEKQEAgLTE4LDkgKzE4LDkgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBUaGlzIGlzIHRoZSBzdXBlcmNsYXNzIG9mIGFsbCBleGNlcHRpb25zIHRoYXQgY2FuIGhhcHBlbiB3aGVuIHNlcmlhbGl6aW5nIG9yCi0gKiBkZXNlcmlhbGluZyBvYmplY3RzLiBUaGUgc3RhdGUgb2YgdGhlIHN0cmVhbSBpcyB1bmtub3duIHdoZW4gb25lIG9mIHRoZXNlCi0gKiBzZXJpYWxpemF0aW9uLXJlbGF0ZWQgZXhjZXB0aW9ucyBhcmUgdGhyb3duLgorICogU2lnbmFscyBzb21lIHNvcnQgb2YgcHJvYmxlbSBkdXJpbmcgZWl0aGVyIHNlcmlhbGl6YXRpb24gb3IgZGVzZXJpYWxpemF0aW9uCisgKiBvZiBvYmplY3RzLiBUaGlzIGlzIGFjdHVhbGx5IHRoZSBzdXBlcmNsYXNzIG9mIHNldmVyYWwgb3RoZXIsIG1vcmUgc3BlY2lmaWMKKyAqIGV4Y2VwdGlvbiBjbGFzc2VzLgogICogCiAgKiBAc2VlIEludmFsaWRPYmplY3RFeGNlcHRpb24KICAqIEBzZWUgTm90QWN0aXZlRXhjZXB0aW9uCkBAIC0yOCwyNCArMjgsMzAgQEAKICAqIEBzZWUgT3B0aW9uYWxEYXRhRXhjZXB0aW9uCiAgKiBAc2VlIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbgogICogQHNlZSBXcml0ZUFib3J0ZWRFeGNlcHRpb24KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPYmplY3RTdHJlYW1FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjYwODk4MTc0ODMzMzkyNjA3TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgT2JqZWN0U3RyZWFtRXhjZXB0aW9ufSB3aXRoIGl0cyBzdGFjayB0cmFjZQorICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0U3RyZWFtRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBPYmplY3RTdHJlYW1FeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlIGFuZAorICAgICAqIGRldGFpbCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0U3RyZWFtRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtRmllbGQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdFN0cmVhbUZpZWxkLmphdmEKaW5kZXggYjBjZTkwNy4uOTVkZWI3YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtRmllbGQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RTdHJlYW1GaWVsZC5qYXZhCkBAIC0yMiwxMiArMjIsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgb2JqZWN0IGZpZWxkcyB0aGF0IGFyZSBzYXZlZCB0byB0aGUgc3RyZWFtLCBieQotICogc2VyaWFsaXphdGlvbi4gQ2xhc3NlcyBjYW4gZGVmaW5lIHRoZSBjb2xsZWN0aW9uIG9mIGZpZWxkcyB0byBiZSBkdW1wZWQsCi0gKiB3aGljaCBjYW4gZGlmZmVyIGZyb20gdGhlIGFjdHVhbCBvYmplY3QncyBkZWNsYXJlZCBmaWVsZHMuCisgKiBEZXNjcmliZXMgYSBmaWVsZCBmb3IgdGhlIHB1cnBvc2Ugb2Ygc2VyaWFsaXphdGlvbi4gQ2xhc3NlcyBjYW4gZGVmaW5lIHRoZQorICogY29sbGVjdGlvbiBvZiBmaWVsZHMgdGhhdCBhcmUgc2VyaWFsaXplZCwgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBzZXQKKyAqIG9mIGFsbCBkZWNsYXJlZCBmaWVsZHMuCiAgKiAKICAqIEBzZWUgT2JqZWN0T3V0cHV0U3RyZWFtI3dyaXRlRmllbGRzKCkKICAqIEBzZWUgT2JqZWN0SW5wdXRTdHJlYW0jcmVhZEZpZWxkcygpCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgT2JqZWN0U3RyZWFtRmllbGQgaW1wbGVtZW50cyBDb21wYXJhYmxlPE9iamVjdD4gewogCkBAIC00OCwxMiArNTAsMTUgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNEZXNlcmlhbGl6ZWQ7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIE9iamVjdFN0cmVhbUZpZWxkIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHRoZSBnaXZlbiB0eXBlCisgICAgICogQ29uc3RydWN0cyBhbiBPYmplY3RTdHJlYW1GaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcsIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgogICAgICAqIEBwYXJhbSBjbAotICAgICAqICAgICAgICAgICAgQSBDbGFzcyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gb3Ige0Bjb2RlIGNsfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdFN0cmVhbUZpZWxkKFN0cmluZyBuYW1lLCBDbGFzczw/PiBjbCkgewogICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IGNsID09IG51bGwpIHsKQEAgLTY0LDE0ICs2OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gT2JqZWN0U3RyZWFtRmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIE9iamVjdFN0cmVhbUZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB0eXBlIGFuZCB0aGUKKyAgICAgKiBpbmRpY2F0aW9uIGlmIGl0IGlzIHVuc2hhcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBhIFN0cmluZywgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCiAgICAgICogQHBhcmFtIGNsCi0gICAgICogICAgICAgICAgICBBIENsYXNzIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCiAgICAgICogQHBhcmFtIHVuc2hhcmVkCi0gICAgICogICAgICAgICAgICB3cml0ZSBhbmQgcmVhZCB0aGUgZmllbGQgdW5zaGFyZWQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgZmllbGQgaXMgd3JpdHRlbiBhbmQgcmVhZCB1bnNoYXJlZDsKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gb3Ige0Bjb2RlIGNsfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNlZSBPYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVVbnNoYXJlZChPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdFN0cmVhbUZpZWxkKFN0cmluZyBuYW1lLCBDbGFzczw/PiBjbCwgYm9vbGVhbiB1bnNoYXJlZCkgewogICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IGNsID09IG51bGwpIHsKQEAgLTEwMiwxNSArMTEzLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyaW5nIHRoZSByZWNlaXZlciB0byB0aGUgcGFyYW1ldGVyLCBhY2NvcmRpbmcgdG8gdGhlIENvbXBhcmFibGUKLSAgICAgKiBpbnRlcmZhY2UuCisgICAgICogQ29tcGFyZXMgdGhpcyBmaWVsZCBkZXNjcmlwdG9yIHRvIHRoZSBzcGVjaWZpZWQgb25lLiBDaGVja3MgZmlyc3QgaWYgb25lCisgICAgICogb2YgdGhlIGNvbXBhcmVkIGZpZWxkcyBoYXMgYSBwcmltaXRpdmUgdHlwZSBhbmQgdGhlIG90aGVyIG9uZSBub3QuIElmIHNvLAorICAgICAqIHRoZSBmaWVsZCB3aXRoIHRoZSBwcmltaXRpdmUgdHlwZSBpcyBjb25zaWRlcmVkIHRvIGJlICJzbWFsbGVyIi4gSWYgYm90aAorICAgICAqIGZpZWxkcyBhcmUgZXF1YWwsIHRoZWlyIG5hbWVzIGFyZSBjb21wYXJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbwotICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIC0xIGlmIHRoZSByZWNlaXZlciBpcyAic21hbGxlciIgdGhhbiB0aGUgcGFyYW1ldGVyLiAwIGlmIHRoZQotICAgICAqICAgICAgICAgcmVjZWl2ZXIgaXMgImVxdWFsIiB0byB0aGUgcGFyYW1ldGVyLiAxIGlmIHRoZSByZWNlaXZlciBpcwotICAgICAqICAgICAgICAgImdyZWF0ZXIiIHRoYW4gdGhlIHBhcmFtZXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoLgorICAgICAqIEByZXR1cm4gLTEgaWYgdGhpcyBmaWVsZCBpcyAic21hbGxlciIgdGhhbiBmaWVsZCB7QGNvZGUgb30sIDAgaWYgYm90aAorICAgICAqICAgICAgICAgZmllbGRzIGFyZSBlcXVhbDsgMSBpZiB0aGlzIGZpZWxkIGlzICJncmVhdGVyIiB0aGFuIGZpZWxkIHtAY29kZQorICAgICAqICAgICAgICAgb30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKICAgICAgICAgT2JqZWN0U3RyZWFtRmllbGQgZiA9IChPYmplY3RTdHJlYW1GaWVsZCkgbzsKQEAgLTEyNiwzMCArMTM5LDU1IEBACiAgICAgICAgIC8vIEVpdGhlciBib3RoIHByaW1pdGl2ZXMgb3IgYm90aCBub3QgcHJpbWl0aXZlcy4gQ29tcGFyZSBiYXNlZCBvbiBuYW1lLgogICAgICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCkuY29tcGFyZVRvKGYuZ2V0TmFtZSgpKTsKICAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVUbyhhcmcwKSA9PSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKTsKLSAgICB9CisgICAgCisgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgLy8gVGhlcmUgc2hvdWxkbid0IGJlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMuCisgICAgLy8gLyoqCisgICAgLy8gICogSW5kaWNhdGVzIGlmIHRoaXMgZmllbGQgZGVzY3JpcHRvciBpcyBlcXVhbCB0byB7QGNvZGUgYXJnMH0uIEZpZWxkCisgICAgLy8gICogZGVzY3JpcHRvcnMgYXJlIGVxdWFsIGlmIHRoZWlyIG5hbWUgaXMgZXF1YWwuCisgICAgLy8gICogCisgICAgLy8gICogQHBhcmFtIGFyZzAKKyAgICAvLyAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY2hlY2sgZXF1YWxpdHkgd2l0aC4KKyAgICAvLyAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkIGRlc2NyaXB0b3IgaXMgZXF1YWwgdG8gdGhlCisgICAgLy8gICogICAgICAgICBuYW1lIG9mIHtAY29kZSBhcmcwfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgLy8gICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgLy8gICovCisgICAgLy8gQE92ZXJyaWRlCisgICAgLy8gcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhcmcwKSB7CisgICAgLy8gICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIC8vICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciBoYXJtb255IHZlcnNpb24KKyAgICAvLyAgICAgcmV0dXJuIChhcmcwIGluc3RhbmNlb2YgT2JqZWN0U3RyZWFtRmllbGQpICYmIGNvbXBhcmVUbyhhcmcwKSA9PSAwOworICAgIC8vICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgLy8gfQorICAgIC8vIAorICAgIC8vIC8qKgorICAgIC8vICAqIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIHRoaXMgZmllbGQgZGVzY3JpcHRvci4gVGhlIGhhc2ggY29kZSBvZiB0aGlzCisgICAgLy8gICogZmllbGQncyBuYW1lIGlzIHJldHVybmVkLgorICAgIC8vICAqIAorICAgIC8vICAqIEByZXR1cm4gdGhlIGZpZWxkJ3MgaGFzaCBjb2RlLgorICAgIC8vICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgIC8vICAqLworICAgIC8vIEBPdmVycmlkZQorICAgIC8vIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgLy8gICAgIHJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKTsKKyAgICAvLyB9CisgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cworICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nLCB0aGUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkIGluIHRoZSBvYmplY3QKKyAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiB0aGUgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaW50LCB0aGUgb2Zmc2V0CisgICAgICogQHJldHVybiB0aGlzIGZpZWxkJ3Mgb2Zmc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewogICAgICAgICByZXR1cm4gb2Zmc2V0OwpAQCAtMTcyLDkgKzIxMCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZmllbGQgdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIENsYXNzIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCisgICAgICogQHJldHVybiBhIHtAY29kZSBDbGFzc30gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzPD8+IGdldFR5cGUoKSB7CiAgICAgICAgIENsYXNzPD8+IGNsID0gZ2V0VHlwZUludGVybmFsKCk7CkBAIC0xODUsMTAgKzIyNCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdHlwZSBjb2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNsYXNzIHRoZSByZWNlaXZlcgotICAgICAqIHJlcHJlc2VudHMKKyAgICAgKiBHZXRzIGEgY2hhcmFjdGVyIGNvZGUgZm9yIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoZSBmb2xsb3dpbmcgY29kZXMgYXJlCisgICAgICogdXNlZDoKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgY2hhciwgdGhlIHR5cGVjb2RlIG9mIHRoZSBjbGFzcworICAgICAqIDxwcmU+CisgICAgICogQiAgICAgYnl0ZQorICAgICAqIEMgICAgIGNoYXIKKyAgICAgKiBEICAgICBkb3VibGUKKyAgICAgKiBGICAgICBmbG9hdAorICAgICAqIEkgICAgIGludAorICAgICAqIEogICAgIGxvbmcKKyAgICAgKiBMICAgICBjbGFzcyBvciBpbnRlcmZhY2UKKyAgICAgKiBTICAgICBzaG9ydAorICAgICAqIFogICAgIGJvb2xlYW4KKyAgICAgKiBbICAgICBhcnJheQorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkJ3MgdHlwZSBjb2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGdldFR5cGVDb2RlKCkgewogICAgICAgICBDbGFzczw/PiB0ID0gZ2V0VHlwZUludGVybmFsKCk7CkBAIC0yMjMsMTAgKzI3NiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdHlwZSBzaWduYXR1cmUgdXNlZCBieSB0aGUgVk0gdG8gcmVwcmVzZW50IHRoZSB0eXBlIGZvciB0aGlzCisgICAgICogR2V0cyB0aGUgdHlwZSBzaWduYXR1cmUgdXNlZCBieSB0aGUgVk0gdG8gcmVwcmVzZW50IHRoZSB0eXBlIG9mIHRoaXMKICAgICAgKiBmaWVsZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgU3RyaW5nLCB0aGUgc2lnbmF0dXJlIGZvciB0aGUgY2xhc3Mgb2YgdGhpcyBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgb2YgdGhpcyBmaWVsZCdzIGNsYXNzIG9yIHtAY29kZSBudWxsfSBpZiB0aGlzCisgICAgICogICAgICAgICBmaWVsZCdzIHR5cGUgaXMgcHJpbWl0aXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZygpIHsKICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKCkpIHsKQEAgLTI0MiwxMSArMjk3LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNsYXNzIG9mIHRoaXMgZmllbGQgaXMgYQotICAgICAqIHByaW1pdGl2ZSB0eXBlIG9yIG5vdAorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgZmllbGQncyB0eXBlIGlzIGEgcHJpbWl0aXZlIHR5cGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQgaXMgYSBwcmltaXRpdmUgdHlwZSBmYWxzZSBpZiB0aGUKLSAgICAgKiAgICAgICAgIHR5cGUgb2YgdGhpcyBmaWVsZCBpcyBhIHJlZ3VsYXIgY2xhc3MuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBmaWVsZCdzIHR5cGUgaXMgcHJpbWl0aXZlOyB7QGNvZGUgZmFsc2V9IGlmCisgICAgICogICAgICAgICB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkIGlzIGEgcmVndWxhciBjbGFzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKICAgICAgICAgQ2xhc3M8Pz4gdCA9IGdldFR5cGVJbnRlcm5hbCgpOwpAQCAtMjU0LDIwICszMDksMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIG9mZnNldCB0aGlzIGZpZWxkIHJlcHJlc2VudHMgaW4gdGhlIG9iamVjdAorICAgICAqIFNldHMgdGhpcyBmaWVsZCdzIG9mZnNldCBpbiB0aGUgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdWYWx1ZQotICAgICAqICAgICAgICAgICAgYW4gaW50LCB0aGUgb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBuZXcgb2Zmc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldE9mZnNldChpbnQgbmV3VmFsdWUpIHsKICAgICAgICAgdGhpcy5vZmZzZXQgPSBuZXdWYWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICogZmllbGQgZGVzY3JpcHRvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGRlc2NyaXB0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTMzOCw5ICszOTUsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJpYWxpemVkIGZpZWxkIGlzIHVuc2hhcmVkLgorICAgICAqIEluZGljYXRzIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyB1bnNoYXJlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGlzIHVuc2hhcmVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBmaWVsZCBpcyB1bnNoYXJlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNVbnNoYXJlZCgpIHsKICAgICAgICAgcmV0dXJuIHVuc2hhcmVkOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT3B0aW9uYWxEYXRhRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PcHRpb25hbERhdGFFeGNlcHRpb24uamF2YQppbmRleCA1NDMwNzZhLi44OTFiZmRkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PcHRpb25hbERhdGFFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PcHRpb25hbERhdGFFeGNlcHRpb24uamF2YQpAQCAtMTgsNDAgKzE4LDUyIEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogV2hlbiByZWFkT2JqZWN0KCkgZW5jb3VudGVycyBwcmltaXRpdmUgdHlwZXMgKGludCwgY2hhciwgZXRjKSBpbnN0ZWFkIG9mIGFuCi0gKiBvYmplY3QgaW5zdGFuY2UgaW4gdGhlIGlucHV0IHN0cmVhbSwgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAqIFNpZ25hbHMgdGhhdCB0aGUge0BsaW5rIE9iamVjdElucHV0U3RyZWFtfSBjbGFzcyBlbmNvdW50ZXJlZCBhIHByaW1pdGl2ZSB0eXBlCisgKiAoe0Bjb2RlIGludH0sIHtAY29kZSBjaGFyfSBldGMuKSBpbnN0ZWFkIG9mIGFuIG9iamVjdCBpbnN0YW5jZSBpbiB0aGUgaW5wdXQKKyAqIHN0cmVhbS4KICAqIAogICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSNhdmFpbGFibGUoKQogICogQHNlZSBPYmplY3RJbnB1dFN0cmVhbSNyZWFkT2JqZWN0KCkKICAqIEBzZWUgT2JqZWN0SW5wdXRTdHJlYW0jc2tpcEJ5dGVzKGludCkKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBPcHRpb25hbERhdGFFeGNlcHRpb24gZXh0ZW5kcyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwMTExMjE4NjU2ODEyNTc4MjBMOwogCiAgICAgLyoqCi0gICAgICogSWYgdHJ1ZSBpdCBtZWFucyB0aGVyZSBpcyBubyBtb3JlIHByaW1pdGl2ZSBkYXRhIGF2YWlsYWJsZS4KKyAgICAgKiB7QGNvZGUgdHJ1ZX0gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSBwcmltaXRpdmUgZGF0YSBhdmFpbGFibGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZW9mOwogCiAgICAgLyoqCi0gICAgICogTnVtYmVyIG9mIGJ5dGVzIG9mIHByaW1pdGl2ZSBkYXRhIChpbnQsIGNoYXIsIGxvbmcsIGV0YykuCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBvZiBwcmltaXRpdmUgZGF0YSAoaW50LCBjaGFyLCBsb25nIGV0Yy4pIHRoYXQgYXJlCisgICAgICogYXZhaWxhYmxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGVuZ3RoOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBPcHRpb25hbERhdGFFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlCisgICAgICogZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIE9wdGlvbmFsRGF0YUV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgT3B0aW9uYWxEYXRhRXhjZXB0aW9ufSB3aXRoIGl0cyBzdGFjayB0cmFjZSBhbmQKKyAgICAgKiBkZXRhaWwgbWVzc2FnZSBmaWxsZWQgaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIE9wdGlvbmFsRGF0YUV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL091dHB1dFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggYzBiZDJlOS4uNTUzMWFiNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT3V0cHV0U3RyZWFtLmphdmEKQEAgLTIwLDk0ICsyMCwxMjYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBPdXRwdXRTdHJlYW0gaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBieXRlIG91dHB1dCBzdHJlYW1zLiBJdCBwcm92aWRlcwotICogYmFzaWMgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBmb3Igd3JpdGluZyBieXRlcyB0byBhIHN0cmVhbS4KKyAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgb3V0cHV0IHN0cmVhbXMuIEFuIG91dHB1dCBzdHJlYW0gaXMgYSBtZWFucyBvZiB3cml0aW5nCisgKiBkYXRhIHRvIGEgdGFyZ2V0IGluIGEgYnl0ZS13aXNlIG1hbm5lci4gTW9zdCBvdXRwdXQgc3RyZWFtcyBleHBlY3QgdGhlCisgKiB7QGxpbmsgI2ZsdXNoKCl9IG1ldGhvZCB0byBiZSBjYWxsZWQgYmVmb3JlIGNsb3NpbmcgdGhlIHN0cmVhbSwgdG8gZW5zdXJlIGFsbAorICogZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuIHRocm91Z2guCisgKiA8cD4KKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgZG9lcyBub3QgcHJvdmlkZSBhIGZ1bGx5IHdvcmtpbmcgaW1wbGVtZW50YXRpb24sIHNvIGl0CisgKiBuZWVkcyB0byBiZSBzdWJjbGFzc2VkLCBhbmQgYXQgbGVhc3QgdGhlIHtAbGluayAjd3JpdGUoaW50KX0gbWV0aG9kIG5lZWRzIHRvCisgKiBiZSBvdmVycmlkZGVuLiBPdmVycmlkaW5nIHNvbWUgb2YgdGhlIG5vbi1hYnN0cmFjdCBtZXRob2RzIGlzIGFsc28gb2Z0ZW4KKyAqIGFkdmlzZWQsIHNpbmNlIGl0IG1pZ2h0IHJlc3VsdCBpbiBoaWdoZXIgZWZmaWNpZW5jeS4KKyAqIDxwPgorICogTWFueSBzcGVjaWFsaXplZCBvdXRwdXQgc3RyZWFtcyBmb3IgcHVycG9zZXMgbGlrZSB3cml0aW5nIHRvIGEgZmlsZSBhbHJlYWR5CisgKiBleGlzdCBpbiB0aGlzIHBhY2thZ2UuCiAgKiAKICAqIEBzZWUgSW5wdXRTdHJlYW0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBDbG9zZWFibGUsIEZsdXNoYWJsZSB7CiAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyBPdXRwdXRTdHJlYW0uIENvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIHNob3VsZAotICAgICAqIGZyZWUgYW55IHJlc291cmNlcyBkdXJpbmcgY2xvc2UuIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBmcmVlIGFueQorICAgICAqIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBzdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIE91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8qIGVtcHR5ICovCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmx1c2ggdGhpcyBPdXRwdXRTdHJlYW0uIENvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIHNob3VsZAotICAgICAqIGVuc3VyZSBhbnkgcGVuZGluZyB3cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGFyZSB3cml0dGVuIG91dCB3aGVuCi0gICAgICogdGhpcyBtZXRob2QgaXMgZW52b2tlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgICAgICogRmx1c2hlcyB0aGlzIHN0cmVhbS4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBlbnN1cmUgdGhhdAorICAgICAqIGFueSBidWZmZXJlZCBkYXRhIGlzIHdyaXR0ZW4gb3V0LiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhpcyBPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGZsdXNoaW5nIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLyogZW1wdHkgKi8KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHRvCi0gICAgICogdGhpcyBPdXRwdXRTdHJlYW0uCisgICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gdG8gdGhpcworICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbi4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBidWZmZXJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gY2hhbmdlZCBhcnJheSBub3RhdGlvbiB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgaGFybW9ueQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIHdyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmNvdW50PC9jb2RlPiA8Y29kZT5ieXRlczwvY29kZT4gZnJvbSB0aGUgYnl0ZSBhcnJheQotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiB0byB0aGlzCi0gICAgICogT3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQKKyAgICAgKiBwb3NpdGlvbiB7QGNvZGUgb2Zmc2V0fSB0byB0aGlzIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbi4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmZmVyIHRvIGdldCBieXRlcworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IGZyb20gd2hlcmUgdG8gZ2V0IGJ5dGVzLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcyBPdXRwdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBzdHJlYW0uCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgb2Zmc2V0IG9yIGNvdW50IGFyZSBvdXRzaWRlIG9mIGJvdW5kcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGNvdW50IDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGNvdW50fSBpcyBiaWdnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBidWZmZXJbXSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3csIGNoZWNrIG51bGwgYnVmZmVyCi0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggfHwgY291bnQgPCAwCi0gICAgICAgICAgICAgICAgfHwgY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LAorICAgICAgICAvLyB1c2VkIChvZmZzZXQgfCBjb3VudCkgPCAwIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChjb3VudCA8IDApCisgICAgICAgIC8vIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIGlmICgob2Zmc2V0IHwgY291bnQpIDwgMCB8fCBjb3VudCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgb2Zmc2V0ICsgY291bnQ7IGkrKykgewogICAgICAgICAgICAgd3JpdGUoYnVmZmVyW2ldKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGJ5dGUgPGNvZGU+b25lQnl0ZTwvY29kZT4gdG8gdGhpcyBPdXRwdXRTdHJlYW0uCi0gICAgICogT25seSB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgPGNvZGU+b25lQnl0ZTwvY29kZT4gaXMgd3JpdHRlbi4KKyAgICAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGlzIHN0cmVhbS4gT25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZgorICAgICAqIHRoZSBpbnRlZ2VyIHtAY29kZSBvbmVCeXRlfSBpcyB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9uZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIGJlIHdyaXR0ZW4uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMgT3V0cHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKGludCBvbmVCeXRlKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PdXRwdXRTdHJlYW1Xcml0ZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL091dHB1dFN0cmVhbVdyaXRlci5qYXZhCmluZGV4IGYwYzg3NGIuLmUxMTFlY2YgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL091dHB1dFN0cmVhbVdyaXRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL091dHB1dFN0cmVhbVdyaXRlci5qYXZhCkBAIC0yOSwxNSArMjksMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uOwogCiAvKioKLSAqIE91dHB1dFN0cmVhbVdyaXRlciBpcyBhIGNsYXNzIGZvciB0dXJuaW5nIGEgY2hhcmFjdGVyIG91dHB1dCBzdHJlYW0gaW50byBhCi0gKiBieXRlIG91dHB1dCBzdHJlYW0uIFRoZSBjb252ZXJzaW9uIG9mIFVuaWNvZGUgY2hhcmFjdGVycyB0byB0aGVpciBieXRlCi0gKiBlcXVpdmFsZW50cyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb252ZXJ0ZXIgdXNlZC4gQnkgZGVmYXVsdCwgdGhlIGVuY29kaW5nIGlzCi0gKiBJU084ODU5XzEgKElTTy1MYXRpbi0xKSBidXQgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZyB0aGUgY29uc3RydWN0b3Igd2hpY2gKLSAqIHRha2VzIGFuIGVuY29kaW5nLgorICogQSBjbGFzcyBmb3IgdHVybmluZyBhIGNoYXJhY3RlciBzdHJlYW0gaW50byBhIGJ5dGUgc3RyZWFtLiBEYXRhIHdyaXR0ZW4gdG8KKyAqIHRoZSB0YXJnZXQgaW5wdXQgc3RyZWFtIGlzIGNvbnZlcnRlZCBpbnRvIGJ5dGVzIGJ5IGVpdGhlciBhIGRlZmF1bHQgb3IgYQorICogcHJvdmlkZWQgY2hhcmFjdGVyIGNvbnZlcnRlci4gVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgdGFrZW4gZnJvbSB0aGUKKyAqICJmaWxlLmVuY29kaW5nIiBzeXN0ZW0gcHJvcGVydHkuIHtAY29kZSBPdXRwdXRTdHJlYW1Xcml0ZXJ9IGNvbnRhaW5zIGEgYnVmZmVyCisgKiBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRhcmdldCBzdHJlYW0gYW5kIGNvbnZlcnRzIHRoZXNlIGludG8gY2hhcmFjdGVycyBhcworICogbmVlZGVkLiBUaGUgYnVmZmVyIHNpemUgaXMgOEsuCiAgKiAKICAqIEBzZWUgSW5wdXRTdHJlYW1SZWFkZXIKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIE91dHB1dFN0cmVhbVdyaXRlciBleHRlbmRzIFdyaXRlciB7CiAKICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CkBAIC00NywxMiArNDksMTMgQEAKICAgICBwcml2YXRlIEJ5dGVCdWZmZXIgYnl0ZXMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDgxOTIpOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIgdXNpbmcgPGNvZGU+b3V0PC9jb2RlPiBhcyB0aGUKLSAgICAgKiBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgY29udmVydGVkIGNoYXJhY3RlcnMgdG8uIFRoZSBkZWZhdWx0IGNoYXJhY3RlcgotICAgICAqIGVuY29kaW5nIGlzIHVzZWQgKHNlZSBjbGFzcyBkZXNjcmlwdGlvbikuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIgdXNpbmcge0Bjb2RlIG91dH0gYXMgdGhlIHRhcmdldAorICAgICAqIHN0cmVhbSB0byB3cml0ZSBjb252ZXJ0ZWQgY2hhcmFjdGVycyB0by4gVGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICogaXMgdXNlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIGNvbnZlcnRlZCBieXRlcyB0by4KKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCB0YXJnZXQgc3RyZWFtIHRvIHdyaXRlIGNvbnZlcnRlZCBieXRlcyB0by4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKICAgICAgICAgc3VwZXIob3V0KTsKQEAgLTY2LDE4ICs2OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyIHVzaW5nIDxjb2RlPm91dDwvY29kZT4gYXMgdGhlCi0gICAgICogT3V0cHV0U3RyZWFtIHRvIHdyaXRlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzIHRvIGFuZCA8Y29kZT5lbmM8L2NvZGU+IGFzCi0gICAgICogdGhlIGNoYXJhY3RlciBlbmNvZGluZy4gSWYgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZCwgYW4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE91dHB1dFN0cmVhbVdyaXRlciB1c2luZyB7QGNvZGUgb3V0fSBhcyB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtIHRvIHdyaXRlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzIHRvIGFuZCB7QGNvZGUgZW5jfSBhcyB0aGUgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcuIElmIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQsIGFuCiAgICAgICogVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlcnJvciBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIE91dHB1dFN0cmVhbSB0byB3cml0ZSBjb252ZXJ0ZWQgYnl0ZXMgdG8uCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHN0cmVhbSB0byB3cml0ZSBjb252ZXJ0ZWQgYnl0ZXMgdG8uCiAgICAgICogQHBhcmFtIGVuYwotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIFN0cmluZyBkZXNjcmliaW5nIHRoZSBkZXNpcmVkIGNoYXJhY3RlciBlbmNvZGluZy4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZGVzaXJlZCBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbmN9IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgYnkge0Bjb2RlIGVuY30gY2Fubm90IGJlIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwgZmluYWwgU3RyaW5nIGVuYykKICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTk2LDE1ICsxMDEsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE91dHB1dFN0cmVhbVdyaXRlciB1c2luZyA8Y29kZT5vdXQ8L2NvZGU+IGFzIHRoZQotICAgICAqIE91dHB1dFN0cmVhbSB0byB3cml0ZSBjb252ZXJ0ZWQgY2hhcmFjdGVycyB0byBhbmQgPGNvZGU+Y3M8L2NvZGU+IGFzCi0gICAgICogdGhlIGNoYXJhY3RlciBlbmNvZGluZy4KLSAgICAgKiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE91dHB1dFN0cmVhbVdyaXRlciB1c2luZyB7QGNvZGUgb3V0fSBhcyB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtIHRvIHdyaXRlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzIHRvIGFuZCB7QGNvZGUgY3N9IGFzIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBlbmNvZGluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIGNvbnZlcnRlZCBieXRlcyB0by4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgc3RyZWFtIHRvIHdyaXRlIGNvbnZlcnRlZCBieXRlcyB0by4KICAgICAgKiBAcGFyYW0gY3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBDaGFyc2V0IHdoaWNoIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2hhcnNldH0gdGhhdCBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQsIENoYXJzZXQgY3MpIHsKICAgICAgICAgc3VwZXIob3V0KTsKQEAgLTExNSwxNCArMTIwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIgdXNpbmcgPGNvZGU+b3V0PC9jb2RlPiBhcyB0aGUKLSAgICAgKiBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgY29udmVydGVkIGNoYXJhY3RlcnMgdG8gYW5kIDxjb2RlPmVuYzwvY29kZT4gYXMKLSAgICAgKiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyIHVzaW5nIHtAY29kZSBvdXR9IGFzIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0gdG8gd3JpdGUgY29udmVydGVkIGNoYXJhY3RlcnMgdG8gYW5kIHtAY29kZSBlbmN9IGFzIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBlbmNvZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgY29udmVydGVkIGJ5dGVzIHRvLgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJlYW0gdG8gd3JpdGUgY29udmVydGVkIGJ5dGVzIHRvLgogICAgICAqIEBwYXJhbSBlbmMKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBDaGFyc2V0RW5jb2RlciB3aGljaCB1c2VkIHRvIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgZW5jb2RlciB1c2VkIGZvciBjaGFyYWN0ZXIgY29udmVyc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQsIENoYXJzZXRFbmNvZGVyIGVuYykgewogICAgICAgICBzdXBlcihvdXQpOwpAQCAtMTMyLDE2ICsxMzgsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIE91dHB1dFN0cmVhbVdyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBmaXJzdCBmbHVzaGVzIHRoZQotICAgICAqIGJ1ZmZlciBhbmQgdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uIFRoZSBPdXRwdXRTdHJlYW0gaXMgdGhlbiBjbG9zZWQgYW5kCi0gICAgICogdGhlIHJlc291cmNlcyBmb3IgdGhlIGJ1ZmZlciBhbmQgY29udmVydGVyIGFyZSBmcmVlZC4KKyAgICAgKiBDbG9zZXMgdGhpcyB3cml0ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gZmx1c2hlcyB0aGUgYnVmZmVyIGFzIHdlbGwgYXMgdGhlCisgICAgICogdGFyZ2V0IHN0cmVhbS4gVGhlIHRhcmdldCBzdHJlYW0gaXMgdGhlbiBjbG9zZWQgYW5kIHRoZSByZXNvdXJjZXMgZm9yIHRoZQorICAgICAqIGJ1ZmZlciBhbmQgY29udmVydGVyIGFyZSByZWxlYXNlZC4KICAgICAgKiA8cD4KICAgICAgKiBPbmx5IHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIGhhcyBhbnkgZWZmZWN0LiBTdWJzZXF1ZW50IGNhbGxzCi0gICAgICogZG8gbm8gd29yay4KKyAgICAgKiBkbyBub3RoaW5nLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhpcwotICAgICAqICAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHdyaXRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xNTgsMTMgKzE2NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgT3V0cHV0U3RyZWFtV3JpdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGVuc3VyZXMgYWxsIGJ1ZmZlcmVkCi0gICAgICogYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uIEFmdGVyIHdyaXRpbmcgdGhlIGJ5dGVzLAotICAgICAqIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGlzIHRoZW4gZmx1c2hlZC4KKyAgICAgKiBGbHVzaGVzIHRoaXMgd3JpdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGVuc3VyZXMgdGhhdCBhbGwgYnVmZmVyZWQgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gQWZ0ZXIgd3JpdGluZyB0aGUgYnl0ZXMsIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0gaXMgZmx1c2hlZCBhcyB3ZWxsLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGlzCi0gICAgICogICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBmbHVzaGluZyB0aGlzIHdyaXRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xODgsMTQgKzE5NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgU3RyaW5nIHdoaWNoIGlkZW50aWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgdG8gY29udmVydAotICAgICAqIGNoYXJhY3RlcnMgdG8gYnl0ZXMuIFRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBpZiB0aGlzCi0gICAgICogV3JpdGVyIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0aGF0IGlzIHVzZWQgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvCisgICAgICogYnl0ZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnZlcnRlciBvciBudWxsIGlmIHRoaXMgV3JpdGVyIGlzCi0gICAgICogICAgICAgICBjbG9zZWQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnZlcnRlciBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcworICAgICAqICAgICAgICAgd3JpdGVyIGlzIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CiAgICAgICAgIGlmIChlbmNvZGVyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjA1LDMyICsyMTEsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPgotICAgICAqIGluIDxjb2RlPmJ1ZjwvY29kZT4gdG8gdGhpcyBXcml0ZXIuIFRoZSBjaGFyYWN0ZXJzIGFyZSBpbW1lZGlhdGVseQotICAgICAqIGNvbnZlcnRlZCB0byBieXRlcyBieSB0aGUgY2hhcmFjdGVyIGNvbnZlcnRlciBhbmQgc3RvcmVkIGluIGEgbG9jYWwKLSAgICAgKiBidWZmZXIuIElmIHRoZSBidWZmZXIgYmVjb21lcyBmdWxsIGFzIGEgcmVzdWx0IG9mIHRoaXMgd3JpdGUsIHRoaXMgV3JpdGVyCi0gICAgICogaXMgZmx1c2hlZC4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9IGluIHtAY29kZSBidWZ9CisgICAgICogdG8gdGhpcyB3cml0ZXIuIFRoZSBjaGFyYWN0ZXJzIGFyZSBpbW1lZGlhdGVseSBjb252ZXJ0ZWQgdG8gYnl0ZXMgYnkgdGhlCisgICAgICogY2hhcmFjdGVyIGNvbnZlcnRlciBhbmQgc3RvcmVkIGluIGEgbG9jYWwgYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGdldHMgZnVsbAorICAgICAqIGFzIGEgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uLCB0aGlzIHdyaXRlciBpcyBmbHVzaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBhcnJheSBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBidWYgdG8gcmV0cmlldmUgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4ge0Bjb2RlIGJ1Zn0gdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgT3V0cHV0U3RyZWFtV3JpdGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIG9yIHNvbWUKLSAgICAgKiAgICAgICAgICAgICBvdGhlciBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBvZmZzZXQgb3IgY291bnQgaXMgb3V0c2lkZSBvZiBib3VuZHMuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1Zn0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgd3JpdGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yCisgICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CiAgICAgICAgICAgICBjaGVja1N0YXR1cygpOwotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmLmxlbmd0aCAtIGNvdW50IHx8IGNvdW50IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LAorICAgICAgICAgICAgLy8gdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMCBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAoY291bnQgPCAwKQorICAgICAgICAgICAgLy8gdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgICAgICBpZiAoYnVmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgob2Zmc2V0IHwgY291bnQpIDwgMCB8fCBvZmZzZXQgPiBidWYubGVuZ3RoIC0gY291bnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgQ2hhckJ1ZmZlciBjaGFycyA9IENoYXJCdWZmZXIud3JhcChidWYsIG9mZnNldCwgY291bnQpOwogICAgICAgICAgICAgY29udmVydChjaGFycyk7CiAgICAgICAgIH0KQEAgLTI1MiwxNyArMjY5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIG91dCB0aGUgY2hhcmFjdGVyIDxjb2RlPm9uZUNoYXI8L2NvZGU+IHRvIHRoaXMgV3JpdGVyLiBUaGUKLSAgICAgKiBsb3ctb3JkZXIgMiBieXRlcyBhcmUgaW1tZWRpYXRlbHkgY29udmVydGVkIHRvIGJ5dGVzIGJ5IHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBjb252ZXJ0ZXIgYW5kIHN0b3JlZCBpbiBhIGxvY2FsIGJ1ZmZlci4gSWYgdGhlIGJ1ZmZlciBiZWNvbWVzIGZ1bGwgYXMgYQotICAgICAqIHJlc3VsdCBvZiB0aGlzIHdyaXRlLCB0aGlzIFdyaXRlciBpcyBmbHVzaGVkLgorICAgICAqIFdyaXRlcyB0aGUgY2hhcmFjdGVyIHtAY29kZSBvbmVDaGFyfSB0byB0aGlzIHdyaXRlci4gVGhlIGxvd2VzdCB0d28gYnl0ZXMKKyAgICAgKiBvZiB0aGUgaW50ZWdlciB7QGNvZGUgb25lQ2hhcn0gYXJlIGltbWVkaWF0ZWx5IGNvbnZlcnRlZCB0byBieXRlcyBieSB0aGUKKyAgICAgKiBjaGFyYWN0ZXIgY29udmVydGVyIGFuZCBzdG9yZWQgaW4gYSBsb2NhbCBidWZmZXIuIElmIHRoZSBidWZmZXIgZ2V0cyBmdWxsCisgICAgICogYnkgY29udmVydGluZyB0aGlzIGNoYXJhY3RlciwgdGhpcyB3cml0ZXIgaXMgZmx1c2hlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQ2hhcgotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byB3cml0ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBPdXRwdXRTdHJlYW1Xcml0ZXIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQgb3Igc29tZQotICAgICAqICAgICAgICAgICAgIG90aGVyIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHdyaXRlciBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBvbmVDaGFyKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjc0LDM3ICsyOTAsNDIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPgotICAgICAqIGluIDxjb2RlPnN0cjwvY29kZT4gdG8gdGhpcyBXcml0ZXIuIFRoZSBjaGFyYWN0ZXJzIGFyZSBpbW1lZGlhdGVseQotICAgICAqIGNvbnZlcnRlZCB0byBieXRlcyBieSB0aGUgY2hhcmFjdGVyIGNvbnZlcnRlciBhbmQgc3RvcmVkIGluIGEgbG9jYWwKLSAgICAgKiBidWZmZXIuIElmIHRoZSBidWZmZXIgYmVjb21lcyBmdWxsIGFzIGEgcmVzdWx0IG9mIHRoaXMgd3JpdGUsIHRoaXMgV3JpdGVyCi0gICAgICogaXMgZmx1c2hlZC4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9IGluIHtAY29kZSBzdHJ9CisgICAgICogdG8gdGhpcyB3cml0ZXIuIFRoZSBjaGFyYWN0ZXJzIGFyZSBpbW1lZGlhdGVseSBjb252ZXJ0ZWQgdG8gYnl0ZXMgYnkgdGhlCisgICAgICogY2hhcmFjdGVyIGNvbnZlcnRlciBhbmQgc3RvcmVkIGluIGEgbG9jYWwgYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGdldHMgZnVsbAorICAgICAqIGFzIGEgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uLCB0aGlzIHdyaXRlciBpcyBmbHVzaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIHdyaXRlLgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIHN0ciB0byByZXRyaWV2ZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gaW4ge0Bjb2RlIHN0cn0gZm9yIHJldHJpZXZpbmcgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIE91dHB1dFN0cmVhbVdyaXRlciBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBvciBzb21lCi0gICAgICogICAgICAgICAgICAgb3RoZXIgSU9FeGNlcHRpb24gb2NjdXJzLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGNvdW50IGlzIG5lZ2F0aXZlCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB3cml0ZXIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCiAgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgb2Zmc2V0IGlzIG5lZ2F0aXZlIG9yIG9mZnNldCArIGNvdW50IGlzIG91dHNpZGUgb2YgYm91bmRzCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBjb3VudH0gaXMgYmlnZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBzdHJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzdHIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CiAgICAgICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3cKLSAgICAgICAgICAgIGlmIChjb3VudCA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tIFJJLAorICAgICAgICAgICAgLy8gYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgICAgIC8vIG1hZGUgaW1wbGljaXQgbnVsbCBjaGVjayBleHBsaWNpdCwgdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMAorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGNvdW50IDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzdHIubGVuZ3RoKCkgLSBjb3VudCB8fCBvZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICgob2Zmc2V0IHwgY291bnQpIDwgMCB8fCBvZmZzZXQgPiBzdHIubGVuZ3RoKCkgLSBjb3VudCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBjaGVja1N0YXR1cygpOwogICAgICAgICAgICAgQ2hhckJ1ZmZlciBjaGFycyA9IENoYXJCdWZmZXIud3JhcChzdHIsIG9mZnNldCwgY291bnQgKyBvZmZzZXQpOwogICAgICAgICAgICAgY29udmVydChjaGFycyk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZElucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZElucHV0U3RyZWFtLmphdmEKaW5kZXggYjJjNWIzYy4uNTU2MmM1OCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUGlwZWRJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1BpcGVkSW5wdXRTdHJlYW0uamF2YQpAQCAtMjAsMTEgKzIwLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogUGlwZWRJbnB1dFN0cmVhbSBpcyBhIGNsYXNzIHdoaWNoIHJlY2VpdmVzIGluZm9ybWF0aW9uIG9uIGEgY29tbXVuaWNhdGlvbnMKLSAqIHBpcGUuIFdoZW4gdHdvIHRocmVhZHMgd2FudCB0byBwYXNzIGRhdGEgYmFjayBhbmQgZm9ydGgsIG9uZSBjcmVhdGVzIGEgcGlwZWQKLSAqIG91dHB1dCBzdHJlYW0gYW5kIHRoZSBvdGhlciBjcmVhdGVzIGEgcGlwZWQgaW5wdXQgc3RyZWFtLgorICogUmVjZWl2ZXMgaW5mb3JtYXRpb24gZnJvbSBhIGNvbW11bmljYXRpb25zIHBpcGUuIFdoZW4gdHdvIHRocmVhZHMgd2FudCB0bworICogcGFzcyBkYXRhIGJhY2sgYW5kIGZvcnRoLCBvbmUgY3JlYXRlcyBhIHBpcGVkIG91dHB1dCBzdHJlYW0gYW5kIHRoZSBvdGhlciBvbmUKKyAqIGNyZWF0ZXMgYSBwaXBlZCBpbnB1dCBzdHJlYW0uCiAgKiAKICAqIEBzZWUgUGlwZWRPdXRwdXRTdHJlYW0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQaXBlZElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewogCkBAIC0zNCw2MiArMzYsNzIgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBjaXJjdWxhciBidWZmZXIgdGhyb3VnaCB3aGljaCBkYXRhIGlzIHBhc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYnl0ZSBidWZmZXJbXTsKIAogICAgIC8qKgotICAgICAqIFRoZSBpbmRleCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHdoZXJlIHRoZSBuZXh0IGJ5dGUgd2lsbCBiZSB3cml0dGVuLgorICAgICAqIFRoZSBpbmRleCBpbiB7QGNvZGUgYnVmZmVyfSB3aGVyZSB0aGUgbmV4dCBieXRlIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGluID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBUaGUgaW5kZXggaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB3aGVyZSB0aGUgbmV4dCBieXRlIHdpbGwgYmUgcmVhZC4KKyAgICAgKiBUaGUgaW5kZXggaW4ge0Bjb2RlIGJ1ZmZlcn0gd2hlcmUgdGhlIG5leHQgYnl0ZSB3aWxsIGJlIHJlYWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBvdXQgPSAwOwogCiAgICAgLyoqCi0gICAgICogVGhlIHNpemUgb2YgdGhlIGRlZmF1bHQgcGlwZSBpbiBieXRlcworICAgICAqIFRoZSBzaXplIG9mIHRoZSBkZWZhdWx0IHBpcGUgaW4gYnl0ZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUElQRV9TSVpFID0gMTAyNDsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHBpcGUgaXMgY29ubmVjdGVkCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgcGlwZSBpcyBjb25uZWN0ZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0Nvbm5lY3RlZCA9IGZhbHNlOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB1bmNvbm5lY3RlZCBQaXBlZElucHV0U3RyZWFtLiBUaGUgcmVzdWx0aW5nIFN0cmVhbSBtdXN0Ci0gICAgICogYmUgY29ubmVjdGVkIHRvIGEgUGlwZWRPdXRwdXRTdHJlYW0gYmVmb3JlIGRhdGEgbWF5IGJlIHJlYWQgZnJvbSBpdC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHVuY29ubmVjdGVkIHtAY29kZSBQaXBlZElucHV0U3RyZWFtfS4gVGhlIHJlc3VsdGluZworICAgICAqIHN0cmVhbSBtdXN0IGJlIGNvbm5lY3RlZCB0byBhIHtAbGluayBQaXBlZE91dHB1dFN0cmVhbX0gYmVmb3JlIGRhdGEgbWF5CisgICAgICogYmUgcmVhZCBmcm9tIGl0LgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQaXBlZElucHV0U3RyZWFtKCkgewogICAgICAgICAvKiBlbXB0eSAqLwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUGlwZWRJbnB1dFN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIFBpcGVkT3V0cHV0U3RyZWFtCi0gICAgICogPGNvZGU+b3V0PC9jb2RlPi4gQW55IGRhdGEgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBjYW4gYmUgcmVhZAotICAgICAqIGZyb20gdGhlIHRoaXMgaW5wdXQgc3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFBpcGVkSW5wdXRTdHJlYW19IGNvbm5lY3RlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgUGlwZWRPdXRwdXRTdHJlYW19IHtAY29kZSBvdXR9LiBBbnkgZGF0YSB3cml0dGVuIHRvIHRoZSBvdXRwdXQKKyAgICAgKiBzdHJlYW0gY2FuIGJlIHJlYWQgZnJvbSB0aGUgdGhpcyBpbnB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIFBpcGVkT3V0cHV0U3RyZWFtIHRvIGNvbm5lY3QgdG8uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcGlwZWQgb3V0cHV0IHN0cmVhbSB0byBjb25uZWN0IHRvLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG9yIDxjb2RlPm91dDwvY29kZT4gYXJlIGFscmVhZHkgY29ubmVjdGVkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIG9yIHtAY29kZSBvdXR9IGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGlwZWRJbnB1dFN0cmVhbShQaXBlZE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNvbm5lY3Qob3V0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUKLSAgICAgKiB0aGlzIFBpcGVkSW5wdXRTdHJlYW0gd2lsbCBibG9jay4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICogd3JpdHRlbiB0byB0aGUgcGlwZSBidXQgbm90IHJlYWQgeWV0IHVwIHRvIHRoZSBzaXplIG9mIHRoZSBwaXBlLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBhdmFpbGFibGUgYmVmb3JlIHRoaXMgc3RyZWFtIHdpbGwKKyAgICAgKiBibG9jay4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGlzCisgICAgICogcGlwZSB0aGF0IGhhdmUgbm90IGJlZW4gcmVhZCB5ZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYmVmb3JlIGJsb2NraW5nLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYmVmb3JlIGJsb2NraW5nLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhpcyBzdHJlYW0uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMDAsMTEgKzExMiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgUGlwZWRJbnB1dFN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZWxlYXNlcyB0aGUgYnVmZmVyIHVzZWQKLSAgICAgKiBmb3IgdGhlIHBpcGUgYW5kIG5vdGlmaWVzIGFsbCB0aHJlYWRzIHdhaXRpbmcgdG8gcmVhZCBvciB3cml0ZS4KKyAgICAgKiBDbG9zZXMgdGhpcyBzdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gcmVsZWFzZXMgdGhlIGJ1ZmZlciB1c2VkIGZvciB0aGUKKyAgICAgKiBwaXBlIGFuZCBub3RpZmllcyBhbGwgdGhyZWFkcyB3YWl0aW5nIHRvIHJlYWQgb3Igd3JpdGUuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTExOCwzMyArMTMxLDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29ubmVjdHMgdGhpcyBQaXBlZElucHV0U3RyZWFtIHRvIGEgUGlwZWRPdXRwdXRTdHJlYW0uIEFueSBkYXRhIHdyaXR0ZW4KLSAgICAgKiB0byB0aGUgT3V0cHV0U3RyZWFtIGJlY29tZXMgcmVhZGFibGUgaW4gdGhpcyBJbnB1dFN0cmVhbS4KKyAgICAgKiBDb25uZWN0cyB0aGlzIHtAY29kZSBQaXBlZElucHV0U3RyZWFtfSB0byBhIHtAbGluayBQaXBlZE91dHB1dFN0cmVhbX0uCisgICAgICogQW55IGRhdGEgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBiZWNvbWVzIHJlYWRhYmxlIGluIHRoaXMgaW5wdXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBQaXBlZE91dHB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb3V0cHV0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgZWl0aGVyIHN0cmVhbSBpcyBhbHJlYWR5IGNvbm5lY3RlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgc3RyZWFtIGlzIGFscmVhZHkgY29ubmVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoUGlwZWRPdXRwdXRTdHJlYW0gc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzcmMuY29ubmVjdCh0aGlzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhpcyBQaXBlZElucHV0U3RyZWFtIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMKLSAgICAgKiBhbiBpbnQuIFRoZSBsb3ctb3JkZXIgYnl0ZSBpcyByZXR1cm5lZCBvciAtMSBvZiB0aGUgZW5kIG9mIHN0cmVhbSB3YXMKLSAgICAgKiBlbmNvdW50ZXJlZC4gSWYgdGhlcmUgaXMgbm8gZGF0YSBpbiB0aGUgcGlwZSwgdGhpcyBtZXRob2QgYmxvY2tzIHVudGlsCi0gICAgICogdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUuIFNlcGFyYXRlIHRocmVhZHMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSByZWFkZXIKLSAgICAgKiBvZiB0aGUgUGlwZWRJbnB1dFN0cmVhbSBhbmQgdGhlIFBpcGVkT3V0cHV0U3RyZWFtLiBUaGVyZSBtYXkgYmUKLSAgICAgKiB1bmRlc2lyYWJsZSByZXN1bHRzIGlmIG1vcmUgdGhhbiBvbmUgVGhyZWFkIGludGVyYWN0cyBhIGlucHV0IG9yIG91dHB1dAotICAgICAqIHBpcGUuCisgICAgICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoaXMgc3RyZWFtIGFuZCByZXR1cm5zIGl0IGFzIGFuIGludGVnZXIgaW4gdGhlCisgICAgICogcmFuZ2UgZnJvbSAwIHRvIDI1NS4gUmV0dXJucyAtMSBpZiB0aGUgZW5kIG9mIHRoaXMgc3RyZWFtIGhhcyBiZWVuCisgICAgICogcmVhY2hlZC4gSWYgdGhlcmUgaXMgbm8gZGF0YSBpbiB0aGUgcGlwZSwgdGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIGRhdGEKKyAgICAgKiBpcyBhdmFpbGFibGUsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBkZXRlY3RlZCBvciBhbiBleGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24uCisgICAgICogPHA+CisgICAgICogU2VwYXJhdGUgdGhyZWFkcyBzaG91bGQgYmUgdXNlZCB0byByZWFkIGZyb20gYSB7QGNvZGUgUGlwZWRJbnB1dFN0cmVhbX0KKyAgICAgKiBhbmQgdG8gd3JpdGUgdG8gdGhlIGNvbm5lY3RlZCB7QGxpbmsgUGlwZWRPdXRwdXRTdHJlYW19LiBJZiB0aGUgc2FtZQorICAgICAqIHRocmVhZCBpcyB1c2VkLCBhIGRlYWRsb2NrIG1heSBvY2N1ci4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgVGhlIGJ5dGUgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc3RyZWFtIGhhcyBiZWVuCisgICAgICogICAgICAgICByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIG5vdCBjb25uZWN0ZWQgdG8gYW4gb3V0cHV0CisgICAgICogICAgICAgICAgICAgc3RyZWFtLCBvciBpZiB0aGUgdGhyZWFkIHdyaXRpbmcgdG8gdGhlIGNvbm5lY3RlZCBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICBzdHJlYW0gaXMgbm8gbG9uZ2VyIGFsaXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTkyLDM3ICsyMTEsNTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhdCBtb3N0IDxjb2RlPmNvdW50PC9jb2RlPiBieXRlcyBmcm9tIHRoaXMgUGlwZWRJbnB1dFN0cmVhbSBhbmQKLSAgICAgKiBzdG9yZXMgdGhlbSBpbiBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+LiBBbnN3ZXIgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmCi0gICAgICogbm8gYnl0ZXMgd2VyZSByZWFkIGFuZCBlbmQgb2Ygc3RyZWFtIHdhcyBlbmNvdW50ZXJlZC4gU2VwYXJhdGUgdGhyZWFkcwotICAgICAqIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcmVhZGVyIG9mIHRoZSBQaXBlZElucHV0U3RyZWFtIGFuZCB0aGUKLSAgICAgKiBQaXBlZE91dHB1dFN0cmVhbS4gVGhlcmUgbWF5IGJlIHVuZGVzaXJhYmxlIHJlc3VsdHMgaWYgbW9yZSB0aGFuIG9uZQotICAgICAqIFRocmVhZCBpbnRlcmFjdHMgYSBpbnB1dCBvciBvdXRwdXQgcGlwZS4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBjb3VudH0gYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlCisgICAgICogYnl0ZSBhcnJheSB7QGNvZGUgYnl0ZXN9IHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9LiBCbG9ja3MgdW50aWwgYXQKKyAgICAgKiBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZGV0ZWN0ZWQgb3IgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIDxwPgorICAgICAqIFNlcGFyYXRlIHRocmVhZHMgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCBmcm9tIGEge0Bjb2RlIFBpcGVkSW5wdXRTdHJlYW19CisgICAgICogYW5kIHRvIHdyaXRlIHRvIHRoZSBjb25uZWN0ZWQge0BsaW5rIFBpcGVkT3V0cHV0U3RyZWFtfS4gSWYgdGhlIHNhbWUKKyAgICAgKiB0aHJlYWQgaXMgdXNlZCwgYSBkZWFkbG9jayBtYXkgb2NjdXIuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBieXRlcwotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ5dGVzfSB0byBzdG9yZSB0aGUgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHJlYWQgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ5dGVzfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAgKiAgICAgICAgIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXQgKyBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHtAY29kZSBieXRlc30uCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHRocmVhZCByZWFkaW5nIGZyb20gdGhpcyBzdHJlYW0gaXMgaW50ZXJydXB0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3Igbm90IGNvbm5lY3RlZCB0byBhbiBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICBzdHJlYW0sIG9yIGlmIHRoZSB0aHJlYWQgd3JpdGluZyB0byB0aGUgY29ubmVjdGVkIG91dHB1dAorICAgICAqICAgICAgICAgICAgIHN0cmVhbSBpcyBubyBsb25nZXIgYWxpdmUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBieXRlc30gaXMge0Bjb2RlIG51bGx9LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBieXRlcy5sZW5ndGggfHwgY291bnQgPCAwCi0gICAgICAgICAgICAgICAgfHwgY291bnQgPiBieXRlcy5sZW5ndGggLSBvZmZzZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHJlbW92ZWQgcmVkdW5kYW50IGNoZWNrLCB1c2VkIChvZmZzZXQgfCBjb3VudCkgPCAwCisgICAgICAgIC8vIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChjb3VudCA8IDApIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICBpZiAoKG9mZnNldCB8IGNvdW50KSA8IDAgfHwgY291bnQgPiBieXRlcy5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTMwMSwxOSArMzM2LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVjZWl2ZXMgYSBieXRlIGFuZCBzdG9yZXMgaXQgaW50byB0aGUgUGlwZWRJbnB1dFN0cmVhbS4gVGhpcyBjYWxsZWQgYnkKLSAgICAgKiBQaXBlZE91dHB1dFN0cmVhbS53cml0ZSgpIHdoZW4gd3JpdGVzIG9jY3VyLiBUaGUgbG93ZXN0LW9yZGVyIGJ5dGUgaXMKLSAgICAgKiBzdG9yZWQgYXQgaW5kZXggPGNvZGU+aW48L2NvZGU+IGluIHRoZSA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIDxQPgotICAgICAqIElmIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgdGhlIHRocmVhZCBzZW5kaW5nICNyZWNlaXZlIGlzIGludGVycnVwdGVkLCB0aGUKLSAgICAgKiBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqIFJlY2VpdmVzIGEgYnl0ZSBhbmQgc3RvcmVzIGl0IGluIHRoaXMgc3RyZWFtJ3Mge0Bjb2RlIGJ1ZmZlcn0uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGJ5IHtAbGluayBQaXBlZE91dHB1dFN0cmVhbSN3cml0ZShpbnQpfS4gVGhlIGxlYXN0CisgICAgICogc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGUgaW50ZWdlciB7QGNvZGUgb25lQnl0ZX0gaXMgc3RvcmVkIGF0IGluZGV4CisgICAgICoge0Bjb2RlIGlufSBpbiB0aGUge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgYmxvY2tzIGFzIGxvbmcgYXMge0Bjb2RlIGJ1ZmZlcn0gaXMgZnVsbC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIG9uZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIHN0b3JlIGludG8gdGhlIHBpcGUuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBzdG9yZSBpbiB0aGlzIHBpcGUuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBidWZmZXJ9IGlzIGZ1bGwgYW5kIHRoZSB0aHJlYWQgdGhhdCBoYXMgY2FsbGVkCisgICAgICogICAgICAgICAgICAgdGhpcyBtZXRob2QgaXMgaW50ZXJydXB0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgdGhlIHRocmVhZCB0aGF0IGhhcyBsYXN0IHJlYWQKKyAgICAgKiAgICAgICAgICAgICBmcm9tIHRoaXMgc3RyZWFtIGlzIG5vIGxvbmdlciBhbGl2ZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVjZWl2ZShpbnQgb25lQnl0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGlzQ2xvc2VkKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZE91dHB1dFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUGlwZWRPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlYWUyMGU3Li4zMDQxZjcwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1BpcGVkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTIwLDExICsyMCwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFBpcGVkT3V0cHV0U3RyZWFtIGlzIGEgY2xhc3Mgd2hpY2ggcGxhY2VzIGluZm9ybWF0aW9uIG9uIGEgY29tbXVuaWNhdGlvbnMKLSAqIHBpcGUuIFdoZW4gdHdvIHRocmVhZHMgd2FudCB0byBwYXNzIGRhdGEgYmFjayBhbmQgZm9ydGgsIG9uZSBjcmVhdGVzIGEgcGlwZWQKLSAqIG91dHB1dCBzdHJlYW0gYW5kIHRoZSBvdGhlciBjcmVhdGVzIGEgcGlwZWQgaW5wdXQgc3RyZWFtLgorICogUGxhY2VzIGluZm9ybWF0aW9uIG9uIGEgY29tbXVuaWNhdGlvbnMgcGlwZS4gV2hlbiB0d28gdGhyZWFkcyB3YW50IHRvIHBhc3MKKyAqIGRhdGEgYmFjayBhbmQgZm9ydGgsIG9uZSBjcmVhdGVzIGEgcGlwZWQgb3V0cHV0IHN0cmVhbSBhbmQgdGhlIG90aGVyIG9uZQorICogY3JlYXRlcyBhIHBpcGVkIGlucHV0IHN0cmVhbS4KICAqIAogICogQHNlZSBQaXBlZElucHV0U3RyZWFtCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUGlwZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewogCkBAIC0zNCwyMyArMzYsMjYgQEAKICAgICBwcml2YXRlIFBpcGVkSW5wdXRTdHJlYW0gZGVzdDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgdW5jb25uZWN0ZWQgUGlwZWRPdXRwdXRTdHJlYW0uIFRoZSByZXN1bHRpbmcgU3RyZWFtIG11c3QKLSAgICAgKiBiZSBjb25uZWN0ZWQgdG8gYSBQaXBlZElucHV0U3RyZWFtIGJlZm9yZSBkYXRhIG1heSBiZSB3cml0dGVuIHRvIGl0LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgdW5jb25uZWN0ZWQge0Bjb2RlIFBpcGVkT3V0cHV0U3RyZWFtfS4gVGhlIHJlc3VsdGluZworICAgICAqIHN0cmVhbSBtdXN0IGJlIGNvbm5lY3RlZCB0byBhIHtAbGluayBQaXBlZElucHV0U3RyZWFtfSBiZWZvcmUgZGF0YSBjYW4gYmUKKyAgICAgKiB3cml0dGVuIHRvIGl0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQaXBlZE91dHB1dFN0cmVhbSgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBpcGVkT3V0cHV0U3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgUGlwZWRJbnB1dFN0cmVhbQotICAgICAqIDxjb2RlPmRlc3Q8L2NvZGU+LiBBbnkgZGF0YSB3cml0dGVuIHRvIHRoaXMgc3RyZWFtIGNhbiBiZSByZWFkIGZyb20KLSAgICAgKiB0aGUgPGNvZGU+ZGVzdDwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUGlwZWRPdXRwdXRTdHJlYW19IGNvbm5lY3RlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgUGlwZWRJbnB1dFN0cmVhbX0ge0Bjb2RlIGRlc3R9LiBBbnkgZGF0YSB3cml0dGVuIHRvIHRoaXMgc3RyZWFtCisgICAgICogY2FuIGJlIHJlYWQgZnJvbSB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGVzdAotICAgICAqICAgICAgICAgICAgdGhlIFBpcGVkSW5wdXRTdHJlYW0gdG8gY29ubmVjdCB0by4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXBlZCBpbnB1dCBzdHJlYW0gdG8gY29ubmVjdCB0by4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+ZGVzdDwvY29kZT4gaXMgYWxyZWFkeSBjb25uZWN0ZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gb3Ige0Bjb2RlIGRlc3R9IGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGlwZWRPdXRwdXRTdHJlYW0oUGlwZWRJbnB1dFN0cmVhbSBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcigpOwpAQCAtNTgsMTMgKzYzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyBQaXBlZE91dHB1dFN0cmVhbS4gQW55IGRhdGEgYnVmZmVyZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBQaXBlZElucHV0U3RyZWFtIGNhbiBiZSByZWFkLCB0aGVuIC0xIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHJlYWRlci4gSWYKLSAgICAgKiB0aGlzIE91dHB1dFN0cmVhbSBpcyBub3QgY29ubmVjdGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisgICAgICogQ2xvc2VzIHRoaXMgc3RyZWFtLiBJZiB0aGlzIHN0cmVhbSBpcyBjb25uZWN0ZWQgdG8gYW4gaW5wdXQgc3RyZWFtLCB0aGUKKyAgICAgKiBpbnB1dCBzdHJlYW0gaXMgY2xvc2VkIGFuZCB0aGUgcGlwZSBpcyBkaXNjb25uZWN0ZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBQaXBlZE91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC03NiwxNCArODAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25uZWN0cyB0aGlzIFBpcGVkT3V0cHV0U3RyZWFtIHRvIGEgUGlwZWRJbnB1dFN0cmVhbS4gQW55IGRhdGEgd3JpdHRlbgotICAgICAqIHRvIHRoaXMgT3V0cHV0U3RyZWFtIGJlY29tZXMgcmVhZGFibGUgaW4gdGhlIElucHV0U3RyZWFtLgorICAgICAqIENvbm5lY3RzIHRoaXMgc3RyZWFtIHRvIGEge0BsaW5rIFBpcGVkSW5wdXRTdHJlYW19LiBBbnkgZGF0YSB3cml0dGVuIHRvCisgICAgICogdGhpcyBvdXRwdXQgc3RyZWFtIGJlY29tZXMgcmVhZGFibGUgaW4gdGhlIGlucHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gUGlwZWRJbnB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBpbnB1dCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgU3RyZWFtIG9yIHRoZSBkZXN0IGlzIGFscmVhZHkgY29ubmVjdGVkLgorICAgICAqICAgICAgICAgICAgIGlmIGVpdGhlciBzdHJlYW0gaXMgYWxyZWFkeSBjb25uZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29ubmVjdChQaXBlZElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgPT0gc3RyZWFtKSB7CkBAIC0xMDMsMTEgKzEwNywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoZSByZWFkZXJzIG9uIHRoZSBQaXBlZElucHV0U3RyZWFtIHRoYXQgYnl0ZXMgY2FuIGJlIHJlYWQuIFRoaXMKLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nIGlmIHRoaXMgU3RyZWFtIGlzIG5vdCBjb25uZWN0ZWQuCisgICAgICogTm90aWZpZXMgdGhlIHJlYWRlcnMgb2YgdGhpcyB7QGxpbmsgUGlwZWRJbnB1dFN0cmVhbX0gdGhhdCBieXRlcyBjYW4gYmUKKyAgICAgKiByZWFkLiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgaWYgdGhpcyBzdHJlYW0gaXMgbm90IGNvbm5lY3RlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZmx1c2guCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBmbHVzaGluZyB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMTksMzQgKzEyNCw0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gPGNvZGU+Ynl0ZXM8L2NvZGU+IGZyb20gdGhpcyBieXRlIGFycmF5Ci0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCBvZmZzZXQgPGNvZGU+aW5kZXg8L2NvZGU+IHRvIHRoaXMKLSAgICAgKiBQaXBlZE91dHB1dFN0cmVhbS4gVGhlIHdyaXR0ZW4gZGF0YSBjYW4gbm93IGJlIHJlYWQgZnJvbSB0aGUgZGVzdGluYXRpb24KLSAgICAgKiBQaXBlZElucHV0U3RyZWFtLiBTZXBhcmF0ZSB0aHJlYWRzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcmVhZGVyIG9mIHRoZQotICAgICAqIFBpcGVkSW5wdXRTdHJlYW0gYW5kIHRoZSBQaXBlZE91dHB1dFN0cmVhbS4gVGhlcmUgbWF5IGJlIHVuZGVzaXJhYmxlCi0gICAgICogcmVzdWx0cyBpZiBtb3JlIHRoYW4gb25lIFRocmVhZCBpbnRlcmFjdHMgYSBpbnB1dCBvciBvdXRwdXQgcGlwZS4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGNvdW50fSBieXRlcyBmcm9tIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0CisgICAgICoge0Bjb2RlIG9mZnNldH0gdG8gdGhpcyBzdHJlYW0uIFRoZSB3cml0dGVuIGRhdGEgY2FuIHRoZW4gYmUgcmVhZCBmcm9tIHRoZQorICAgICAqIGNvbm5lY3RlZCBpbnB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogU2VwYXJhdGUgdGhyZWFkcyBzaG91bGQgYmUgdXNlZCB0byB3cml0ZSB0byBhIHtAY29kZSBQaXBlZE91dHB1dFN0cmVhbX0KKyAgICAgKiBhbmQgdG8gcmVhZCBmcm9tIHRoZSBjb25uZWN0ZWQge0BsaW5rIFBpcGVkSW5wdXRTdHJlYW19LiBJZiB0aGUgc2FtZQorICAgICAqIHRocmVhZCBpcyB1c2VkLCBhIGRlYWRsb2NrIG1heSBvY2N1ci4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBidWZmZXIgdG8gZ2V0IGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgaW4gYnVmZmVyIHRvIHdyaXRlCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSByZWNlaXZpbmcgdGhyZWFkIHdhcyB0ZXJtaW5hdGVkIHdpdGhvdXQgY2xvc2luZyB0aGUKLSAgICAgKiAgICAgICAgICAgICBwaXBlLiBUaGlzIGNhc2UgaXMgbm90IGN1cnJlbnRseSBoYW5kbGVkIGNvcnJlY3RseS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZSB0byB0aGlzCisgICAgICogICAgICAgICAgICBzdHJlYW0uCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXQgKyBjb3VudH0gaXMgYmlnZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcGlwZSBpcyBmdWxsIGFuZCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGlwZSBpcyBmdWxsIGFuZCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQKICAgICAgKiAgICAgICAgICAgICB3YWl0aW5nIGZvciBzcGFjZSB0byB3cml0ZSBkYXRhLiBUaGlzIGNhc2UgaXMgbm90IGN1cnJlbnRseQogICAgICAqICAgICAgICAgICAgIGhhbmRsZWQgY29ycmVjdGx5LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVjZWl2ZXIgaGFzIG5vdCBiZWVuIGNvbm5lY3RlZCB5ZXQuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBhcmUgb3V0IG9mIGJvdW5kcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgbm90IGNvbm5lY3RlZCwgaWYgdGhlIHRhcmdldCBzdHJlYW0gaXMKKyAgICAgKiAgICAgICAgICAgICBjbG9zZWQgb3IgaWYgdGhlIHRocmVhZCByZWFkaW5nIGZyb20gdGhlIHRhcmdldCBzdHJlYW0gaXMgbm8KKyAgICAgKiAgICAgICAgICAgICBsb25nZXIgYWxpdmUuIFRoaXMgY2FzZSBpcyBjdXJyZW50bHkgbm90IGhhbmRsZWQgY29ycmVjdGx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYnVmZmVyW10sIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgaWYgKGRlc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gSzAwN2I9UGlwZSBOb3QgQ29ubmVjdGVkCiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwN2IiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTE1NSwyNSArMTY2LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgYnl0ZSA8Y29kZT5vbmVCeXRlPC9jb2RlPiB0byB0aGlzCi0gICAgICogUGlwZWRPdXRwdXRTdHJlYW0uIE9ubHkgdGhlIGxvdyBvcmRlciBieXRlIG9mIDxjb2RlPm9uZUJ5dGU8L2NvZGU+IGlzCi0gICAgICogd3JpdHRlbi4gVGhlIGRhdGEgY2FuIG5vdyBiZSByZWFkIGZyb20gdGhlIGRlc3RpbmF0aW9uIFBpcGVkSW5wdXRTdHJlYW0uCi0gICAgICogU2VwYXJhdGUgdGhyZWFkcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJlYWRlciBvZiB0aGUgUGlwZWRJbnB1dFN0cmVhbQotICAgICAqIGFuZCB0aGUgUGlwZWRPdXRwdXRTdHJlYW0uIFRoZXJlIG1heSBiZSB1bmRlc2lyYWJsZSByZXN1bHRzIGlmIG1vcmUgdGhhbgotICAgICAqIG9uZSBUaHJlYWQgaW50ZXJhY3RzIGEgaW5wdXQgb3Igb3V0cHV0IHBpcGUuCisgICAgICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhpcyBzdHJlYW0uIE9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YKKyAgICAgKiB0aGUgaW50ZWdlciB7QGNvZGUgb25lQnl0ZX0gaXMgd3JpdHRlbi4gVGhlIHdyaXR0ZW4gYnl0ZSBjYW4gdGhlbiBiZSByZWFkCisgICAgICogZnJvbSB0aGUgY29ubmVjdGVkIGlucHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiBTZXBhcmF0ZSB0aHJlYWRzIHNob3VsZCBiZSB1c2VkIHRvIHdyaXRlIHRvIGEge0Bjb2RlIFBpcGVkT3V0cHV0U3RyZWFtfQorICAgICAqIGFuZCB0byByZWFkIGZyb20gdGhlIGNvbm5lY3RlZCB7QGxpbmsgUGlwZWRJbnB1dFN0cmVhbX0uIElmIHRoZSBzYW1lCisgICAgICogdGhyZWFkIGlzIHVzZWQsIGEgZGVhZGxvY2sgbWF5IG9jY3VyLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQnl0ZQotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gYmUgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVjZWl2aW5nIHRocmVhZCB3YXMgdGVybWluYXRlZCB3aXRob3V0IGNsb3NpbmcgdGhlCi0gICAgICogICAgICAgICAgICAgcGlwZS4gVGhpcyBjYXNlIGlzIG5vdCBjdXJyZW50bHkgaGFuZGxlZCBjb3JyZWN0bHkuCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcGlwZSBpcyBmdWxsIGFuZCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGlwZSBpcyBmdWxsIGFuZCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQKICAgICAgKiAgICAgICAgICAgICB3YWl0aW5nIGZvciBzcGFjZSB0byB3cml0ZSBkYXRhLiBUaGlzIGNhc2UgaXMgbm90IGN1cnJlbnRseQogICAgICAqICAgICAgICAgICAgIGhhbmRsZWQgY29ycmVjdGx5LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVjZWl2ZXIgaGFzIG5vdCBiZWVuIGNvbm5lY3RlZCB5ZXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIG5vdCBjb25uZWN0ZWQsIGlmIHRoZSB0YXJnZXQgc3RyZWFtIGlzCisgICAgICogICAgICAgICAgICAgY2xvc2VkIG9yIGlmIHRoZSB0aHJlYWQgcmVhZGluZyBmcm9tIHRoZSB0YXJnZXQgc3RyZWFtIGlzIG5vCisgICAgICogICAgICAgICAgICAgbG9uZ2VyIGFsaXZlLiBUaGlzIGNhc2UgaXMgY3VycmVudGx5IG5vdCBoYW5kbGVkIGNvcnJlY3RseS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgb25lQnl0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1BpcGVkUmVhZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZFJlYWRlci5qYXZhCmluZGV4IDgzMjJjZDcuLmEwYWY5YTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1BpcGVkUmVhZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUGlwZWRSZWFkZXIuamF2YQpAQCAtMjAsOSArMjAsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBQaXBlZFJlYWRlciBpcyBhIGNsYXNzIHdoaWNoIHJlY2VpdmVzIGluZm9ybWF0aW9uIG9uIGEgY29tbXVuaWNhdGlvbnMgcGlwZS4KLSAqIFdoZW4gdHdvIHRocmVhZHMgd2FudCB0byBwYXNzIGRhdGEgYmFjayBhbmQgZm9ydGgsIG9uZSBjcmVhdGVzIGEgcGlwZWQgd3JpdGVyCi0gKiBhbmQgdGhlIG90aGVyIGNyZWF0ZXMgYSBwaXBlZCByZWFkZXIuCisgKiBSZWNlaXZlcyBpbmZvcm1hdGlvbiBvbiBhIGNvbW11bmljYXRpb25zIHBpcGUuIFdoZW4gdHdvIHRocmVhZHMgd2FudCB0byBwYXNzCisgKiBkYXRhIGJhY2sgYW5kIGZvcnRoLCBvbmUgY3JlYXRlcyBhIHBpcGVkIHdyaXRlciBhbmQgdGhlIG90aGVyIGNyZWF0ZXMgYSBwaXBlZAorICogcmVhZGVyLgorICogCisgKiBAc2VlIFBpcGVkV3JpdGVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUGlwZWRSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewogCkBAIC0zOCwxMyArNDIsMTMgQEAKICAgICBwcml2YXRlIGNoYXIgZGF0YVtdOwogCiAgICAgLyoqCi0gICAgICogVGhlIGluZGV4IGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2hlcmUgdGhlIG5leHQgY2hhcmFjdGVyIHdpbGwgYmUKKyAgICAgKiBUaGUgaW5kZXggaW4ge0Bjb2RlIGJ1ZmZlcn0gd2hlcmUgdGhlIG5leHQgY2hhcmFjdGVyIHdpbGwgYmUKICAgICAgKiB3cml0dGVuLgogICAgICAqLwogICAgIHByaXZhdGUgaW50IGluID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBUaGUgaW5kZXggaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB3aGVyZSB0aGUgbmV4dCBjaGFyYWN0ZXIgd2lsbCBiZSByZWFkLgorICAgICAqIFRoZSBpbmRleCBpbiB7QGNvZGUgYnVmZmVyfSB3aGVyZSB0aGUgbmV4dCBjaGFyYWN0ZXIgd2lsbCBiZSByZWFkLgogICAgICAqLwogICAgIHByaXZhdGUgaW50IG91dDsKIApAQCAtNTksMjMgKzYzLDI3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29ubmVjdGVkOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB1bmNvbm5lY3RlZCBQaXBlZFJlYWRlci4gVGhlIHJlc3VsdGluZyBSZWFkZXIgbXVzdCBiZQotICAgICAqIGNvbm5lY3RlZCB0byBhIFBpcGVkV3JpdGVyIGJlZm9yZSBkYXRhIG1heSBiZSByZWFkIGZyb20gaXQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB1bmNvbm5lY3RlZCB7QGNvZGUgUGlwZWRSZWFkZXJ9LiBUaGUgcmVzdWx0aW5nIHJlYWRlcgorICAgICAqIG11c3QgYmUgY29ubmVjdGVkIHRvIGEge0Bjb2RlIFBpcGVkV3JpdGVyfSBiZWZvcmUgZGF0YSBtYXkgYmUgcmVhZCBmcm9tCisgICAgICogaXQuCisgICAgICogCisgICAgICogQHNlZSBQaXBlZFdyaXRlcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQaXBlZFJlYWRlcigpIHsKICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW1BJUEVfU0laRV07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQaXBlZFJlYWRlciBjb25uZWN0ZWQgdG8gdGhlIFBpcGVkV3JpdGVyCi0gICAgICogPGNvZGU+b3V0PC9jb2RlPi4gQW55IGRhdGEgd3JpdHRlbiB0byB0aGUgd3JpdGVyIGNhbiBiZSByZWFkIGZyb20gdGhlCi0gICAgICogdGhpcyByZWFkZXIuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUGlwZWRSZWFkZXJ9IGNvbm5lY3RlZCB0byB0aGUge0BsaW5rIFBpcGVkV3JpdGVyfQorICAgICAqIHtAY29kZSBvdXR9LiBBbnkgZGF0YSB3cml0dGVuIHRvIHRoZSB3cml0ZXIgY2FuIGJlIHJlYWQgZnJvbSB0aGUgdGhpcworICAgICAqIHJlYWRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgUGlwZWRXcml0ZXIgdG8gY29ubmVjdCB0by4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUGlwZWRXcml0ZXJ9IHRvIGNvbm5lY3QgdG8uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgb3IgPGNvZGU+b3V0PC9jb2RlPiBhcmUgYWxyZWFkeSBjb25uZWN0ZWQuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG91dH0gaXMgYWxyZWFkeSBjb25uZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBpcGVkUmVhZGVyKFBpcGVkV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcygpOwpAQCAtODMsMTEgKzkxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyBQaXBlZFJlYWRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZWxlYXNlcyB0aGUgYnVmZmVyIHVzZWQgZm9yCisgICAgICogQ2xvc2VzIHRoaXMgcmVhZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIHJlbGVhc2VzIHRoZSBidWZmZXIgdXNlZCBmb3IKICAgICAgKiB0aGUgcGlwZSBhbmQgbm90aWZpZXMgYWxsIHRocmVhZHMgd2FpdGluZyB0byByZWFkIG9yIHdyaXRlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIHJlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHJlYWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMDEsMTQgKzExMCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbm5lY3RzIHRoaXMgUGlwZWRSZWFkZXIgdG8gYSBQaXBlZFdyaXRlci4gQW55IGRhdGEgd3JpdHRlbiB0byB0aGUKLSAgICAgKiBXcml0ZXIgYmVjb21lcyBhdmFpbGFibGUgaW4gdGhpcyBSZWFkZXIuCisgICAgICogQ29ubmVjdHMgdGhpcyB7QGNvZGUgUGlwZWRSZWFkZXJ9IHRvIGEge0BsaW5rIFBpcGVkV3JpdGVyfS4gQW55IGRhdGEKKyAgICAgKiB3cml0dGVuIHRvIHRoZSB3cml0ZXIgYmVjb21lcyByZWFkYWJsZSBpbiB0aGlzIHJlYWRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICB0aGUgc291cmNlIFBpcGVkV3JpdGVyLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHdyaXRlciB0byBjb25uZWN0IHRvLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBlaXRoZXIgV3JpdGVyIG9yIFJlYWRlciBpcyBhbHJlYWR5IGNvbm5lY3RlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3IgYWxyZWFkeSBjb25uZWN0ZWQsIG9yIGlmIHtAY29kZQorICAgICAqICAgICAgICAgICAgIHNyY30gaXMgYWxyZWFkeSBjb25uZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29ubmVjdChQaXBlZFdyaXRlciBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtMTE3LDcgKzEyNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBQaXBlZFdyaXRlci4KKyAgICAgKiBFc3RhYmxpc2hlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgUGlwZWRXcml0ZXIuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIHRoaXMgUmVhZGVyIGlzIGFscmVhZHkgY29ubmVjdGVkLgpAQCAtMTM1LDE3ICsxNDUsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGlzIFJlYWRlci4gQW5zd2VyIHRoZSBjaGFyYWN0ZXIgYWN0dWFsbHkKLSAgICAgKiByZWFkIG9yIC0xIGlmIG5vIGNoYXJhY3RlciB3YXMgcmVhZCBhbmQgZW5kIG9mIHJlYWRlciB3YXMgZW5jb3VudGVyZWQuCi0gICAgICogU2VwYXJhdGUgdGhyZWFkcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJlYWRlciBvZiB0aGUgUGlwZWRSZWFkZXIgYW5kIHRoZQotICAgICAqIFBpcGVkV3JpdGVyLiBUaGVyZSBtYXkgYmUgdW5kZXNpcmFibGUgcmVzdWx0cyBpZiBtb3JlIHRoYW4gb25lIFRocmVhZAotICAgICAqIGludGVyYWN0cyBhIHJlYWRlciBvciB3cml0ZXIgcGlwZS4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGlzIHJlYWRlciBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyCisgICAgICogd2l0aCB0aGUgdHdvIGhpZ2hlci1vcmRlciBieXRlcyBzZXQgdG8gMC4gUmV0dXJucyAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqIHJlYWRlciBoYXMgYmVlbiByZWFjaGVkLiBJZiB0aGVyZSBpcyBubyBkYXRhIGluIHRoZSBwaXBlLCB0aGlzIG1ldGhvZAorICAgICAqIGJsb2NrcyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSwgdGhlIGVuZCBvZiB0aGUgcmVhZGVyIGlzIGRldGVjdGVkIG9yIGFuCisgICAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiA8cD4KKyAgICAgKiBTZXBhcmF0ZSB0aHJlYWRzIHNob3VsZCBiZSB1c2VkIHRvIHJlYWQgZnJvbSBhIHtAY29kZSBQaXBlZFJlYWRlcn0gYW5kIHRvCisgICAgICogd3JpdGUgdG8gdGhlIGNvbm5lY3RlZCB7QGxpbmsgUGlwZWRXcml0ZXJ9LiBJZiB0aGUgc2FtZSB0aHJlYWQgaXMgdXNlZCwKKyAgICAgKiBhIGRlYWRsb2NrIG1heSBvY2N1ci4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIGNoYXJhY3RlciByZWFkIC0xIGlmIGVuZCBvZiByZWFkZXIuCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgcmVhZGVyIGhhcyBiZWVuCisgICAgICogICAgICAgICByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTU1LDI4ICsxNzAsMzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhdCBtb3N0IDxjb2RlPmNvdW50PC9jb2RlPiBjaGFyYWN0ZXIgZnJvbSB0aGlzIFBpcGVkUmVhZGVyIGFuZAotICAgICAqIHN0b3JlcyB0aGVtIGluIGNoYXIgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgcmVhZCBvcgotICAgICAqIC0xIGlmIG5vIGNoYXJhY3RlcnMgd2VyZSByZWFkIGFuZCBlbmQgb2Ygc3RyZWFtIHdhcyBlbmNvdW50ZXJlZC4gU2VwYXJhdGUKLSAgICAgKiB0aHJlYWRzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcmVhZGVyIG9mIHRoZSBQaXBlZFJlYWRlciBhbmQgdGhlCi0gICAgICogUGlwZWRXcml0ZXIuIFRoZXJlIG1heSBiZSB1bmRlc2lyYWJsZSByZXN1bHRzIGlmIG1vcmUgdGhhbiBvbmUgVGhyZWFkCi0gICAgICogaW50ZXJhY3RzIGEgcmVhZGVyIG9yIHdyaXRlciBwaXBlLgorICAgICAqIFJlYWRzIGF0IG1vc3Qge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIGZyb20gdGhpcyByZWFkZXIgYW5kIHN0b3JlcyB0aGVtCisgICAgICogaW4gdGhlIGNoYXJhY3RlciBhcnJheSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdCB7QGNvZGUgb2Zmc2V0fS4gSWYKKyAgICAgKiB0aGVyZSBpcyBubyBkYXRhIGluIHRoZSBwaXBlLCB0aGlzIG1ldGhvZCBibG9ja3MgdW50aWwgYXQgbGVhc3Qgb25lIGJ5dGUKKyAgICAgKiBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSByZWFkZXIgaXMgZGV0ZWN0ZWQgb3IgYW4gZXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLgorICAgICAqIDxwPgorICAgICAqIFNlcGFyYXRlIHRocmVhZHMgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCBmcm9tIGEge0Bjb2RlIFBpcGVkUmVhZGVyfSBhbmQgdG8KKyAgICAgKiB3cml0ZSB0byB0aGUgY29ubmVjdGVkIHtAbGluayBQaXBlZFdyaXRlcn0uIElmIHRoZSBzYW1lIHRocmVhZCBpcyB1c2VkLCBhCisgICAgICogZGVhZGxvY2sgbWF5IG9jY3VyLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMuCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXJzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkCi0gICAgICogICAgICAgICAgICBjaGFyYWN0ZXJzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ5dGVzfSB0byBzdG9yZSB0aGUgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgcmVhZCBmcm9tIHRoaXMgcmVhZGVyLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc3RvcmUgaW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mCi0gICAgICogICAgICAgICByZWFkZXIuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzdG9yZSBpbiB7QGNvZGUgYnVmZmVyfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHJlYWRlciBoYXMKKyAgICAgKiAgICAgICAgIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGNvdW50IDwgMH0sIG9yIGlmIHtAY29kZQorICAgICAqICAgICAgICAgICAgIG9mZnNldCArIGNvdW50fSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2Yge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHRocmVhZCByZWFkaW5nIGZyb20gdGhpcyByZWFkZXIgaXMgaW50ZXJydXB0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSByZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igbm90IGNvbm5lY3RlZCB0byBhIHdyaXRlciwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB0aGUgdGhyZWFkIHdyaXRpbmcgdG8gdGhlIGNvbm5lY3RlZCB3cml0ZXIgaXMgbm8gbG9uZ2VyCisgICAgICogICAgICAgICAgICAgYWxpdmUuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE4OCw5ICsyMTAsMTkgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNzgiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0IHx8IGNvdW50IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LAorICAgICAgICAgICAgLy8gdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMCBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAoY291bnQgPCAwKQorICAgICAgICAgICAgLy8gdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgob2Zmc2V0IHwgY291bnQpIDwgMCB8fCBjb3VudCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KQEAgLTI2MSwxNSArMjkzLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgUmVhZGVyIGlzIHJlYWR5IHRvIGJlCi0gICAgICogcmVhZC4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgY29udGFpbnMgY2hhcmFjdGVycyB0byBiZSByZWFkLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIGlzIHJlYWR5IHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHJlYWRlciB3aWxsIG5vdCBibG9jayB3aGVuIHtAY29kZSByZWFkfSBpcworICAgICAqIGNhbGxlZCwge0Bjb2RlIGZhbHNlfSBpZiB1bmtub3duIG9yIGJsb2NraW5nIHdpbGwgb2NjdXIuIFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgaW50ZXJuYWwgYnVmZmVyIGNvbnRhaW5zCisgICAgICogY2hhcmFjdGVycyB0aGF0IGNhbiBiZSByZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgY2hhcmFjdGVycyByZWFkeSwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogCisgICAgICogQHJldHVybiBhbHdheXMge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciBub3QgY29ubmVjdGVkLCBvciBpZiBzb21lIG90aGVyCisgICAgICogICAgICAgICAgICAgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICNyZWFkKCkKKyAgICAgKiBAc2VlICNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzE1LDcgKzM1MSw5IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHdoaWxlIChkYXRhICE9IG51bGwgJiYgb3V0ID09IGluKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXQoMTAwMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICBsb2NrLndhaXQoMTAwMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RSZWFkZXIgIT0gbnVsbCAmJiAhbGFzdFJlYWRlci5pc0FsaXZlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNzIsNyArNDEwLDkgQEAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGF0YSAhPSBudWxsICYmIG91dCA9PSBpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud2FpdCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UmVhZGVyICE9IG51bGwgJiYgIWxhc3RSZWFkZXIuaXNBbGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZFdyaXRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUGlwZWRXcml0ZXIuamF2YQppbmRleCBhM2RjNGU4Li45OGE3M2M5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZFdyaXRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1BpcGVkV3JpdGVyLmphdmEKQEAgLTIwLDExICsyMCwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFBpcGVkV3JpdGVyIGlzIGEgY2xhc3Mgd2hpY2ggcGxhY2VzIGluZm9ybWF0aW9uIG9uIGEgY29tbXVuaWNhdGlvbnMgcGlwZS4KLSAqIFdoZW4gdHdvIHRocmVhZHMgd2FudCB0byBwYXNzIGRhdGEgYmFjayBhbmQgZm9ydGgsIG9uZSBjcmVhdGVzIGEgcGlwZWQgd3JpdGVyCi0gKiBhbmQgdGhlIG90aGVyIGNyZWF0ZXMgYSBwaXBlZCByZWFkZXIuCisgKiBQbGFjZXMgaW5mb3JtYXRpb24gb24gYSBjb21tdW5pY2F0aW9ucyBwaXBlLiBXaGVuIHR3byB0aHJlYWRzIHdhbnQgdG8gcGFzcworICogZGF0YSBiYWNrIGFuZCBmb3J0aCwgb25lIGNyZWF0ZXMgYSBwaXBlZCB3cml0ZXIgYW5kIHRoZSBvdGhlciBjcmVhdGVzIGEgcGlwZWQKKyAqIHJlYWRlci4KICAqIAogICogQHNlZSBQaXBlZFJlYWRlcgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBpcGVkV3JpdGVyIGV4dGVuZHMgV3JpdGVyIHsKICAgICAvKioKQEAgLTM1LDIzICszNywyNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHVuY29ubmVjdGVkIFBpcGVkV3JpdGVyLiBUaGUgcmVzdWx0aW5nIFN0cmVhbSBtdXN0IGJlCi0gICAgICogY29ubmVjdGVkIHRvIGEgUGlwZWRSZWFkZXIgYmVmb3JlIGRhdGEgbWF5IGJlIHdyaXR0ZW4gdG8gaXQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB1bmNvbm5lY3RlZCB7QGNvZGUgUGlwZWRXcml0ZXJ9LiBUaGUgcmVzdWx0aW5nIHdyaXRlcgorICAgICAqIG11c3QgYmUgY29ubmVjdGVkIHRvIGEge0Bjb2RlIFBpcGVkUmVhZGVyfSBiZWZvcmUgZGF0YSBtYXkgYmUgd3JpdHRlbiB0bworICAgICAqIGl0LgorICAgICAqIAorICAgICAqIEBzZWUgUGlwZWRSZWFkZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGlwZWRXcml0ZXIoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQaXBlZFdyaXRlciBjb25uZWN0ZWQgdG8gdGhlIFBpcGVkUmVhZGVyCi0gICAgICogPGNvZGU+ZGVzdDwvY29kZT4uIEFueSBkYXRhIHdyaXR0ZW4gdG8gdGhpcyBXcml0ZXIgY2FuIGJlIHJlYWQgZnJvbQotICAgICAqIHRoZSA8Y29kZT5kZXN0PC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBQaXBlZFdyaXRlcn0gY29ubmVjdGVkIHRvIHRoZSB7QGxpbmsgUGlwZWRSZWFkZXJ9CisgICAgICoge0Bjb2RlIGRlc3R9LiBBbnkgZGF0YSB3cml0dGVuIHRvIHRoaXMgd3JpdGVyIGNhbiBiZSByZWFkIGZyb20ge0Bjb2RlCisgICAgICogZGVzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRlc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBQaXBlZFJlYWRlciB0byBjb25uZWN0IHRvLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmRlc3Q8L2NvZGU+IGlzIGFscmVhZHkgY29ubmVjdGVkLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQaXBlZFJlYWRlcn0gdG8gY29ubmVjdCB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRlc3R9IGlzIGFscmVhZHkgY29ubmVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQaXBlZFdyaXRlcihQaXBlZFJlYWRlciBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihkZXN0KTsKQEAgLTU5LDEyICs2NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgUGlwZWRXcml0ZXIuIEFueSBkYXRhIGJ1ZmZlcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogUGlwZWRSZWFkZXIgY2FuIGJlIHJlYWQsIHRoZW4gLTEgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgcmVhZGVyLiBJZiB0aGlzCi0gICAgICogV3JpdGVyIGlzIG5vdCBjb25uZWN0ZWQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKiBDbG9zZXMgdGhpcyB3cml0ZXIuIElmIGEge0BsaW5rIFBpcGVkUmVhZGVyfSBpcyBjb25uZWN0ZWQgdG8gdGhpcyB3cml0ZXIsCisgICAgICogaXQgaXMgY2xvc2VkIGFzIHdlbGwgYW5kIHRoZSBwaXBlIGlzIGRpc2Nvbm5lY3RlZC4gQW55IGRhdGEgYnVmZmVyZWQgaW4KKyAgICAgKiB0aGUgcmVhZGVyIGNhbiBzdGlsbCBiZSByZWFkLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgUGlwZWRXcml0ZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTc5LDE0ICs4NiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbm5lY3RzIHRoaXMgUGlwZWRXcml0ZXIgdG8gYSBQaXBlZFJlYWRlci4gQW55IGRhdGEgd3JpdHRlbiB0byB0aGlzCi0gICAgICogV3JpdGVyIGJlY29tZXMgcmVhZGFibGUgaW4gdGhlIFJlYWRlci4KKyAgICAgKiBDb25uZWN0cyB0aGlzIHtAY29kZSBQaXBlZFdyaXRlcn0gdG8gYSB7QGxpbmsgUGlwZWRSZWFkZXJ9LiBBbnkgZGF0YQorICAgICAqIHdyaXR0ZW4gdG8gdGhpcyB3cml0ZXIgYmVjb21lcyByZWFkYWJsZSBpbiB0aGUgcmVhZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBQaXBlZFJlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIFdyaXRlciBvciB0aGUgZGVzdCBpcyBhbHJlYWR5IGNvbm5lY3RlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSByZWFkZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB3cml0ZXIgaXMgY2xvc2VkIG9yIGFscmVhZHkgY29ubmVjdGVkLCBvciBpZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBzdHJlYW19IGlzIGFscmVhZHkgY29ubmVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoUGlwZWRSZWFkZXIgc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKQEAgLTEwMiwxMSArMTEwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhlIHJlYWRlcnMgb24gdGhlIFBpcGVkUmVhZGVyIHRoYXQgY2hhcmFjdGVycyBjYW4gYmUgcmVhZC4gVGhpcworICAgICAqIE5vdGlmaWVzIHRoZSByZWFkZXJzIG9mIHRoaXMge0Bjb2RlIFBpcGVkUmVhZGVyfSB0aGF0IGNoYXJhY3RlcnMgY2FuIGJlIHJlYWQuIFRoaXMKICAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nIGlmIHRoaXMgV3JpdGVyIGlzIG5vdCBjb25uZWN0ZWQuCiAgICAgICogCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZmx1c2guCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgZmx1c2hpbmcgdGhpcyB3cml0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTE2LDM0ICsxMjUsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IDxjb2RlPmNoYXJzPC9jb2RlPiBmcm9tIHRoZSBjaGFyIGFycmF5Ci0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCBvZmZzZXQgPGNvZGU+aW5kZXg8L2NvZGU+IHRvIHRoaXMKLSAgICAgKiBQaXBlZFdyaXRlci4gVGhlIHdyaXR0ZW4gZGF0YSBjYW4gbm93IGJlIHJlYWQgZnJvbSB0aGUgZGVzdGluYXRpb24KLSAgICAgKiBQaXBlZFJlYWRlci4gU2VwYXJhdGUgdGhyZWFkcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJlYWRlciBvZiB0aGUKLSAgICAgKiBQaXBlZFJlYWRlciBhbmQgdGhlIFBpcGVkV3JpdGVyLiBUaGVyZSBtYXkgYmUgdW5kZXNpcmFibGUgcmVzdWx0cyBpZiBtb3JlCi0gICAgICogdGhhbiBvbmUgVGhyZWFkIGludGVyYWN0cyBhIGlucHV0IG9yIG91dHB1dCBwaXBlLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgZnJvbSB0aGUgY2hhcmFjdGVyIGFycmF5IHtAY29kZSBidWZmZXJ9CisgICAgICogc3RhcnRpbmcgYXQgb2Zmc2V0IHtAY29kZSBpbmRleH0gdG8gdGhpcyB3cml0ZXIuIFRoZSB3cml0dGVuIGRhdGEgY2FuCisgICAgICogdGhlbiBiZSByZWFkIGZyb20gdGhlIGNvbm5lY3RlZCB7QGxpbmsgUGlwZWRSZWFkZXJ9IGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFNlcGFyYXRlIHRocmVhZHMgc2hvdWxkIGJlIHVzZWQgdG8gd3JpdGUgdG8gYSB7QGNvZGUgUGlwZWRXcml0ZXJ9IGFuZCB0bworICAgICAqIHJlYWQgZnJvbSB0aGUgY29ubmVjdGVkIHtAY29kZSBQaXBlZFJlYWRlcn0uIElmIHRoZSBzYW1lIHRocmVhZCBpcyB1c2VkLAorICAgICAqIGEgZGVhZGxvY2sgbWF5IG9jY3VyLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZmZlciB0byBnZXQgY2hhcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJzIGluIGJ1ZmZlciB0byB3cml0ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSByZWNlaXZpbmcgdGhyZWFkIHdhcyB0ZXJtaW5hdGVkIHdpdGhvdXQgY2xvc2luZyB0aGUKLSAgICAgKiAgICAgICAgICAgICBwaXBlLiBUaGlzIGNhc2UgaXMgbm90IGN1cnJlbnRseSBoYW5kbGVkIGNvcnJlY3RseS4KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBwaXBlIGlzIGZ1bGwgYW5kIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20ge0Bjb2RlIGJ1ZmZlcn0gdG8gd3JpdGUgdG8gdGhpcworICAgICAqICAgICAgICAgICAgd3JpdGVyLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgY291bnQgPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgY291bnR9IGlzIGJpZ2dlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBpcGUgaXMgZnVsbCBhbmQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkCiAgICAgICogICAgICAgICAgICAgd2FpdGluZyBmb3Igc3BhY2UgdG8gd3JpdGUgZGF0YS4gVGhpcyBjYXNlIGlzIG5vdCBjdXJyZW50bHkKICAgICAgKiAgICAgICAgICAgICBoYW5kbGVkIGNvcnJlY3RseS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSByZWNlaXZlciBoYXMgbm90IGJlZW4gY29ubmVjdGVkIHlldC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBhcmUgb3V0IG9mIGJvdW5kcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB3cml0ZXIgaXMgY2xvc2VkIG9yIG5vdCBjb25uZWN0ZWQsIGlmIHRoZSB0YXJnZXQKKyAgICAgKiAgICAgICAgICAgICByZWFkZXIgaXMgY2xvc2VkIG9yIGlmIHRoZSB0aHJlYWQgcmVhZGluZyBmcm9tIHRoZSB0YXJnZXQKKyAgICAgKiAgICAgICAgICAgICByZWFkZXIgaXMgbm8gbG9uZ2VyIGFsaXZlLiBUaGlzIGNhc2UgaXMgY3VycmVudGx5IG5vdCBoYW5kbGVkCisgICAgICogICAgICAgICAgICAgY29ycmVjdGx5LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYnVmZmVyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBidWZmZXJbXSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKICAgICAgICAgICAgIGlmIChjbG9zZWQpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNzgiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTE1NiwzMyArMTc0LDQwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCB8fCBjb3VudCA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMAorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGNvdW50IDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgICAgICBpZiAoKG9mZnNldCB8IGNvdW50KSA8IDAgfHwgY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwMmYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIGRlc3QucmVjZWl2ZShidWZmZXIsIG9mZnNldCwgY291bnQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBjaGFyYWN0ZXIgPGNvZGU+YzwvY29kZT4gdG8gdGhpcyBQaXBlZFdyaXRlci4gVGhlIHdyaXR0ZW4KLSAgICAgKiBkYXRhIGNhbiBub3cgYmUgcmVhZCBmcm9tIHRoZSBkZXN0aW5hdGlvbiBQaXBlZFJlYWRlci4gU2VwYXJhdGUgdGhyZWFkcwotICAgICAqIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcmVhZGVyIG9mIHRoZSBQaXBlZFJlYWRlciBhbmQgdGhlIFBpcGVkV3JpdGVyLgotICAgICAqIFRoZXJlIG1heSBiZSB1bmRlc2lyYWJsZSByZXN1bHRzIGlmIG1vcmUgdGhhbiBvbmUgVGhyZWFkIGludGVyYWN0cyBhCi0gICAgICogaW5wdXQgb3Igb3V0cHV0IHBpcGUuCisgICAgICogV3JpdGVzIGEgc2luZ2xlIGNoYXJhY3RlciB7QGNvZGUgY30gdG8gdGhpcyB3cml0ZXIuIFRoaXMgY2hhcmFjdGVyIGNhbgorICAgICAqIHRoZW4gYmUgcmVhZCBmcm9tIHRoZSBjb25uZWN0ZWQge0BsaW5rIFBpcGVkUmVhZGVyfSBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBTZXBhcmF0ZSB0aHJlYWRzIHNob3VsZCBiZSB1c2VkIHRvIHdyaXRlIHRvIGEge0Bjb2RlIFBpcGVkV3JpdGVyfSBhbmQgdG8KKyAgICAgKiByZWFkIGZyb20gdGhlIGNvbm5lY3RlZCB7QGNvZGUgUGlwZWRSZWFkZXJ9LiBJZiB0aGUgc2FtZSB0aHJlYWQgaXMgdXNlZCwKKyAgICAgKiBhIGRlYWRsb2NrIG1heSBvY2N1ci4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gYmUgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSByZWNlaXZpbmcgdGhyZWFkIHdhcyB0ZXJtaW5hdGVkIHdpdGhvdXQgY2xvc2luZyB0aGUKLSAgICAgKiAgICAgICAgICAgICBwaXBlLiBUaGlzIGNhc2UgaXMgbm90IGN1cnJlbnRseSBoYW5kbGVkIGNvcnJlY3RseS4KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBwaXBlIGlzIGZ1bGwgYW5kIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGlwZSBpcyBmdWxsIGFuZCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQKICAgICAgKiAgICAgICAgICAgICB3YWl0aW5nIGZvciBzcGFjZSB0byB3cml0ZSBkYXRhLiBUaGlzIGNhc2UgaXMgbm90IGN1cnJlbnRseQogICAgICAqICAgICAgICAgICAgIGhhbmRsZWQgY29ycmVjdGx5LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHJlY2VpdmVyIGhhcyBub3QgYmVlbiBjb25uZWN0ZWQgeWV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHdyaXRlciBpcyBjbG9zZWQgb3Igbm90IGNvbm5lY3RlZCwgaWYgdGhlIHRhcmdldAorICAgICAqICAgICAgICAgICAgIHJlYWRlciBpcyBjbG9zZWQgb3IgaWYgdGhlIHRocmVhZCByZWFkaW5nIGZyb20gdGhlIHRhcmdldAorICAgICAqICAgICAgICAgICAgIHJlYWRlciBpcyBubyBsb25nZXIgYWxpdmUuIFRoaXMgY2FzZSBpcyBjdXJyZW50bHkgbm90IGhhbmRsZWQKKyAgICAgKiAgICAgICAgICAgICBjb3JyZWN0bHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QcmludFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUHJpbnRTdHJlYW0uamF2YQppbmRleCA4NTAxNjlhLi41ZjdlMDQxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QcmludFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1ByaW50U3RyZWFtLmphdmEKQEAgLTI3LDEzICsyNywxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuUHJpdmlBY3Rpb247CiAKIC8qKgotICogUHJpbnRTdHJlYW0gaXMgYSBjbGFzcyB3aGljaCB0YWtlcyBhbiBPdXRwdXRTdHJlYW0gYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlCi0gKiBtZXRob2RzIGZvciBwcmludGluZyBjb21tb24gZGF0YSB0eXBlcyBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCBvbiB0aGUKLSAqIHN0cmVhbS4gVGhpcyBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBEYXRhT3V0cHV0U3RyZWFtIHdoaWNoIGlzIHVzZWQgZm9yCi0gKiBlbmNvZGluZyBjb21tb24gZGF0YSB0eXBlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlYWQgYmFjayBpbi4gTm8gSU9FeGNlcHRpb25zCi0gKiBhcmUgdGhyb3duIGJ5IHRoaXMgY2xhc3MuIEluc3RlYWQsIGNhbGxlcnMgc2hvdWxkIGNhbGwgY2hlY2tFcnJvcigpIHRvIHNlZSBpZgotICogYSBwcm9ibGVtIGhhcyBiZWVuIGVuY291bnRlcmVkIGluIHRoaXMgU3RyZWFtLgorICogV3JhcHMgYW4gZXhpc3Rpbmcge0BsaW5rIE91dHB1dFN0cmVhbX0gYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yCisgKiB3cml0aW5nIGNvbW1vbiBkYXRhIHR5cGVzIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybWF0LiBUaGlzIGlzIG5vdCB0byBiZQorICogY29uZnVzZWQgd2l0aCBEYXRhT3V0cHV0U3RyZWFtIHdoaWNoIGlzIHVzZWQgZm9yIGVuY29kaW5nIGNvbW1vbiBkYXRhIHR5cGVzCisgKiBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlYWQgYmFjayBpbi4gTm8ge0Bjb2RlIElPRXhjZXB0aW9ufSBpcyB0aHJvd24gYnkgdGhpcworICogY2xhc3MuIEluc3RlYWQsIGNhbGxlcnMgc2hvdWxkIHVzZSB7QGxpbmsgI2NoZWNrRXJyb3IoKX0gdG8gc2VlIGlmIGEgcHJvYmxlbQorICogaGFzIG9jY3VycmVkIGluIHRoaXMgc3RyZWFtLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFByaW50U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgQXBwZW5kYWJsZSwKICAgICAgICAgQ2xvc2VhYmxlIHsKQEAgLTU5LDEzICs2MCwxNSBAQAogICAgIC8vIHByaXZhdGUgRm9ybWF0dGVyIGZvcm1hdHRlcjsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUHJpbnRTdHJlYW0gb24gdGhlIE91dHB1dFN0cmVhbSA8Y29kZT5vdXQ8L2NvZGU+LiBBbGwKLSAgICAgKiB3cml0ZXMgdG8gdGhlIHRhcmdldCBjYW4gbm93IHRha2UgcGxhY2UgdGhyb3VnaCB0aGlzIFByaW50U3RyZWFtLiBCeQotICAgICAqIGRlZmF1bHQsIHRoZSBQcmludFN0cmVhbSBpcyBzZXQgdG8gbm90IGF1dG9mbHVzaCB3aGVuIGEgbmV3bGluZSBpcwotICAgICAqIGVuY291bnRlcmVkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFByaW50U3RyZWFtfSB3aXRoIHtAY29kZSBvdXR9IGFzIGl0cyB0YXJnZXQKKyAgICAgKiBzdHJlYW0uIEJ5IGRlZmF1bHQsIHRoZSBuZXcgcHJpbnQgc3RyZWFtIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZmx1c2ggaXRzCisgICAgICogY29udGVudHMgdG8gdGhlIHRhcmdldCBzdHJlYW0gd2hlbiBhIG5ld2xpbmUgaXMgZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIE91dHB1dFN0cmVhbSB0byBwcm92aWRlIGNvbnZlbmllbmNlIG1ldGhvZHMgb24uCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IG91dHB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvdXR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgewogICAgICAgICBzdXBlcihvdXQpOwpAQCAtNzUsMTYgKzc4LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFN0cmVhbSBvbiB0aGUgT3V0cHV0U3RyZWFtIDxjb2RlPm91dDwvY29kZT4uIEFsbAotICAgICAqIHdyaXRlcyB0byB0aGUgdGFyZ2V0IGNhbiBub3cgdGFrZSBwbGFjZSB0aHJvdWdoIHRoaXMgUHJpbnRTdHJlYW0uIFRoZQotICAgICAqIFByaW50U3RyZWFtIGlzIHNldCB0byBub3QgYXV0b2ZsdXNoIGlmIDxjb2RlPmF1dG9mbHVzaDwvY29kZT4gaXMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBQcmludFN0cmVhbX0gd2l0aCB7QGNvZGUgb3V0fSBhcyBpdHMgdGFyZ2V0CisgICAgICogc3RyZWFtLiBUaGUgcGFyYW1ldGVyIHtAY29kZSBhdXRvZmx1c2h9IGRldGVybWluZXMgaWYgdGhlIHByaW50IHN0cmVhbQorICAgICAqIGF1dG9tYXRpY2FsbHkgZmx1c2hlcyBpdHMgY29udGVudHMgdG8gdGhlIHRhcmdldCBzdHJlYW0gd2hlbiBhIG5ld2xpbmUgaXMKKyAgICAgKiBlbmNvdW50ZXJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgT3V0cHV0U3RyZWFtIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgb3V0cHV0IHN0cmVhbS4KICAgICAgKiBAcGFyYW0gYXV0b2ZsdXNoCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gZmx1c2ggY29udGVudHMgdXBvbiBlbmNvdW50ZXJpbmcgYQorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZmx1c2ggY29udGVudHMgdXBvbiBlbmNvdW50ZXJpbmcgYQogICAgICAqICAgICAgICAgICAgbmV3bGluZSBzZXF1ZW5jZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG91dH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGF1dG9mbHVzaCkgewogICAgICAgICBzdXBlcihvdXQpOwpAQCAtOTUsMjEgKzEwMSwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUHJpbnRTdHJlYW0gb24gdGhlIE91dHB1dFN0cmVhbSA8Y29kZT5vdXQ8L2NvZGU+LiBBbGwKLSAgICAgKiB3cml0ZXMgdG8gdGhlIHRhcmdldCBjYW4gbm93IHRha2UgcGxhY2UgdGhyb3VnaCB0aGlzIFByaW50U3RyZWFtLiBUaGUKLSAgICAgKiBQcmludFN0cmVhbSBpcyBzZXQgdG8gbm90IGF1dG9mbHVzaCBpZiA8Y29kZT5hdXRvZmx1c2g8L2NvZGU+IGlzCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJpbnRTdHJlYW19IHdpdGgge0Bjb2RlIG91dH0gYXMgaXRzIHRhcmdldAorICAgICAqIHN0cmVhbSBhbmQgdXNpbmcgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB7QGNvZGUgZW5jfSB3aGlsZSB3cml0aW5nLiBUaGUKKyAgICAgKiBwYXJhbWV0ZXIge0Bjb2RlIGF1dG9mbHVzaH0gZGV0ZXJtaW5lcyBpZiB0aGUgcHJpbnQgc3RyZWFtIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBmbHVzaGVzIGl0cyBjb250ZW50cyB0byB0aGUgdGFyZ2V0IHN0cmVhbSB3aGVuIGEgbmV3bGluZSBpcyBlbmNvdW50ZXJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgT3V0cHV0U3RyZWFtIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgb3V0cHV0IHN0cmVhbS4KICAgICAgKiBAcGFyYW0gYXV0b2ZsdXNoCiAgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gZmx1c2ggY29udGVudHMgdXBvbiBlbmNvdW50ZXJpbmcgYQogICAgICAqICAgICAgICAgICAgbmV3bGluZSBzZXF1ZW5jZS4KICAgICAgKiBAcGFyYW0gZW5jCi0gICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIHN0cmluZyBkZXNjcmliaW5nIHRoZSBkZXNpcmVkIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG91dH0gb3Ige0Bjb2RlIGVuY30gYXJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hvc2VuIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHtAY29kZSBlbmN9IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW50U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gYXV0b2ZsdXNoLCBTdHJpbmcgZW5jKQogICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewpAQCAtMTI1LDQyICsxMzMsNDIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByaW50U3RyZWFtIG9uIHRoZSBmaWxlIDxjb2RlPmZpbGU8L2NvZGU+LiBBbGwgd3JpdGVzCi0gICAgICogdG8gdGhlIHRhcmdldCBjYW4gbm93IHRha2UgcGxhY2UgdGhyb3VnaCB0aGlzIFByaW50U3RyZWFtLiBJdHMgZW5jb2RpbmcKLSAgICAgKiBjaGFyYWN0ZXIgc2V0IGlzIHRoZSBkZWZhdWx0IGNoYXJzZXQgaW4gdGhlIFZNLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFByaW50U3RyZWFtfSB3aXRoIHtAY29kZSBmaWxlfSBhcyBpdHMgdGFyZ2V0LiBUaGUKKyAgICAgKiB2aXJ0dWFsIG1hY2hpbmUncyBkZWZhdWx0IGNoYXJhY3RlciBzZXQgaXMgdXNlZCBmb3IgY2hhcmFjdGVyIGVuY29kaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSB0byBwcm92aWRlIGNvbnZlbmllbmNlIG1ldGhvZHMgb24uCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGZpbGUuIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdHMgY29udGVudHMgYXJlCisgICAgICogICAgICAgICAgICByZW1vdmVkLCBvdGhlcndpc2UgYSBuZXcgZmlsZSBpcyBjcmVhdGVkLgogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIG9wZW5lZCB0byB3cml0ZS4gT3IKLSAgICAgKiAgICAgICAgICAgICB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCBvciBhbnkgcHJvYmxlbSB3aGVuIG9wZW4gdGhlIGZpbGUKLSAgICAgKiAgICAgICAgICAgICB0byB3cml0ZS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgb3BlbmluZyBvciBjcmVhdGluZyB0aGUgdGFyZ2V0IGZpbGUuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgZGVuaWVzIHRoZSB3cml0ZSB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICBmaWxlLgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRlbmllcyB3cml0aW5nIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHRhcmdldCBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFN0cmVhbShGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBzdXBlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFN0cmVhbSBvbiB0aGUgZmlsZSA8Y29kZT5maWxlPC9jb2RlPi4gQWxsIHdyaXRlcwotICAgICAqIHRvIHRoZSB0YXJnZXQgY2FuIG5vdyB0YWtlIHBsYWNlIHRocm91Z2ggdGhpcyBQcmludFN0cmVhbS4gSXRzIGVuY29kaW5nCi0gICAgICogY2hhcmFjdGVyIHNldCBuYW1lIGlzIDxjb2RlPmNzbjwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJpbnRTdHJlYW19IHdpdGgge0Bjb2RlIGZpbGV9IGFzIGl0cyB0YXJnZXQuIFRoZQorICAgICAqIGNoYXJhY3RlciBzZXQgbmFtZWQge0Bjb2RlIGNzbn0gaXMgdXNlZCBmb3IgY2hhcmFjdGVyIGVuY29kaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSB0byBwcm92aWRlIGNvbnZlbmllbmNlIG1ldGhvZHMgb24uCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGZpbGUuIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdHMgY29udGVudHMgYXJlCisgICAgICogICAgICAgICAgICByZW1vdmVkLCBvdGhlcndpc2UgYSBuZXcgZmlsZSBpcyBjcmVhdGVkLgogICAgICAqIEBwYXJhbSBjc24KLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc2V0IG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgZm9yIGNoYXJhY3RlciBlbmNvZGluZy4KICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdCBiZSBvcGVuZWQgdG8gd3JpdGUuIE9yCi0gICAgICogICAgICAgICAgICAgdGhlIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYW55IHByb2JsZW0gd2hlbiBvcGVuIHRoZSBmaWxlCi0gICAgICogICAgICAgICAgICAgdG8gd3JpdGUuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIG9wZW5pbmcgb3IgY3JlYXRpbmcgdGhlIHRhcmdldCBmaWxlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY3NufSBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgZGVuaWVzIHRoZSB3cml0ZSB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICBmaWxlLgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRlbmllcyB3cml0aW5nIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHRhcmdldCBmaWxlLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaG9zZW4gY2hhcmFjdGVyIHNldCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBieSB7QGNvZGUgY3NufSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFN0cmVhbShGaWxlIGZpbGUsIFN0cmluZyBjc24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sCiAgICAgICAgICAgICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTE3NSw0MiArMTgzLDQ0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFN0cmVhbSBvbiB0aGUgZmlsZSB0aGUgbmFtZSBvZiB3aGljaCBpczxjb2RlPmZpbGVOYW1lPC9jb2RlPi4KLSAgICAgKiBBbGwgd3JpdGVzIHRvIHRoZSB0YXJnZXQgY2FuIG5vdyB0YWtlIHBsYWNlIHRocm91Z2ggdGhpcyBQcmludFN0cmVhbS4gSXRzCi0gICAgICogZW5jb2RpbmcgY2hhcmFjdGVyIHNldCBpcyB0aGUgZGVmYXVsdCBjaGFyc2V0IGluIHRoZSBWTS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBQcmludFN0cmVhbX0gd2l0aCB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5CisgICAgICoge0Bjb2RlIGZpbGVOYW1lfSBhcyBpdHMgdGFyZ2V0LiBUaGUgdmlydHVhbCBtYWNoaW5lJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKKyAgICAgKiBzZXQgaXMgdXNlZCBmb3IgY2hhcmFjdGVyIGVuY29kaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlJ3MgbmFtZS4gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0cworICAgICAqICAgICAgICAgICAgY29udGVudHMgYXJlIHJlbW92ZWQsIG90aGVyd2lzZSBhIG5ldyBmaWxlIGlzIGNyZWF0ZWQuCiAgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBjYW5ub3QgYmUgb3BlbmVkIHRvIHdyaXRlLiBPcgotICAgICAqICAgICAgICAgICAgIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkIG9yIGFueSBwcm9ibGVtIHdoZW4gb3BlbiB0aGUgZmlsZQotICAgICAqICAgICAgICAgICAgIHRvIHdyaXRlLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBvcGVuaW5nIG9yIGNyZWF0aW5nIHRoZSB0YXJnZXQgZmlsZS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBkZW5pZXMgdGhlIHdyaXRlIHRvIHRoZQotICAgICAqICAgICAgICAgICAgIGZpbGUuCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGVuaWVzIHdyaXRpbmcgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdGFyZ2V0IGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW50U3RyZWFtKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMobmV3IEZpbGUoZmlsZU5hbWUpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByaW50U3RyZWFtIG9uIHRoZSBmaWxlIHRoZSBuYW1lIG9mIHdoaWNoIGlzPGNvZGU+ZmlsZU5hbWU8L2NvZGU+LgotICAgICAqIEFsbCB3cml0ZXMgdG8gdGhlIHRhcmdldCBjYW4gbm93IHRha2UgcGxhY2UgdGhyb3VnaCB0aGlzIFByaW50U3RyZWFtLiBJdHMKLSAgICAgKiBlbmNvZGluZyBjaGFyYWN0ZXIgc2V0IG5hbWUgaXMgPGNvZGU+Y3NuPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBQcmludFN0cmVhbX0gd2l0aCB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5CisgICAgICoge0Bjb2RlIGZpbGVOYW1lfSBhcyBpdHMgdGFyZ2V0LiBUaGUgY2hhcmFjdGVyIHNldCBuYW1lZCB7QGNvZGUgY3NufSBpcworICAgICAqIHVzZWQgZm9yIGNoYXJhY3RlciBlbmNvZGluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSdzIG5hbWUuIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdHMKKyAgICAgKiAgICAgICAgICAgIGNvbnRlbnRzIGFyZSByZW1vdmVkLCBvdGhlcndpc2UgYSBuZXcgZmlsZSBpcyBjcmVhdGVkLgogICAgICAqIEBwYXJhbSBjc24KLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc2V0IG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgZm9yIGNoYXJhY3RlciBlbmNvZGluZy4KICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdCBiZSBvcGVuZWQgdG8gd3JpdGUuIE9yCi0gICAgICogICAgICAgICAgICAgdGhlIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYW55IHByb2JsZW0gd2hlbiBvcGVuIHRoZSBmaWxlCi0gICAgICogICAgICAgICAgICAgdG8gd3JpdGUuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIG9wZW5pbmcgb3IgY3JlYXRpbmcgdGhlIHRhcmdldCBmaWxlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY3NufSBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgZGVuaWVzIHRoZSB3cml0ZSB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICBmaWxlLgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRlbmllcyB3cml0aW5nIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHRhcmdldCBmaWxlLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaG9zZW4gY2hhcmFjdGVyIHNldCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBieSB7QGNvZGUgY3NufSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFN0cmVhbShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBjc24pCiAgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTIxOCwxMyArMjI4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGlzIFByaW50U3RyZWFtIGhhcwotICAgICAqIGVuY291bnRlcmVkIGFuIGVycm9yLiBJZiBzbywgdGhlIHJlY2VpdmVyIHNob3VsZCBwcm9iYWJseSBiZSBjbG9zZWQgc2luY2UKLSAgICAgKiBmdXJ0aGVyIHdyaXRlcyB3aWxsIG5vdCBhY3R1YWxseSB0YWtlIHBsYWNlLiBBIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcKLSAgICAgKiBjaGVja0Vycm9yIGlzIHRoYXQgdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0gaXMgZmx1c2hlZC4KKyAgICAgKiBGbHVzaGVzIHRoaXMgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZXJyb3IgZmxhZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoaXMgUHJpbnRTdHJlYW0sCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGVpdGhlciBhbiB7QGNvZGUgSU9FeGNlcHRpb259IGhhcyBiZWVuIHRocm93bgorICAgICAqICAgICAgICAgcHJldmlvdXNseSBvciBpZiB7QGNvZGUgc2V0RXJyb3IoKX0gaGFzIGJlZW4gY2FsbGVkOworICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSAjc2V0RXJyb3IoKSAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRXJyb3IoKSB7CiAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewpAQCAtMjM0LDkgKzI0NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgUHJpbnRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gZmx1c2hlcyBhbmQgdGhlbiBjbG9zZXMgdGhlCi0gICAgICogdGFyZ2V0IHN0cmVhbS4gSWYgYW4gZXJyb3Igb2NjdXJzLCBzZXQgYW4gZXJyb3IgaW4gdGhpcyBQcmludFN0cmVhbSB0bwotICAgICAqIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIENsb3NlcyB0aGlzIHByaW50IHN0cmVhbS4gRmx1c2hlcyB0aGlzIHN0cmVhbSBhbmQgdGhlbiBjbG9zZXMgdGhlIHRhcmdldAorICAgICAqIHN0cmVhbS4gSWYgYW4gSS9PIGVycm9yIG9jY3VycywgdGhpcyBzdHJlYW0ncyBlcnJvciBzdGF0ZSBpcyBzZXQgdG8KKyAgICAgKiB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewpAQCAtMjUyLDkgKzI2NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgUHJpbnRTdHJlYW0gdG8gZW5zdXJlIGFsbCBwZW5kaW5nIGRhdGEgaXMgc2VudCBvdXQgdG8gdGhlCi0gICAgICogdGFyZ2V0IE91dHB1dFN0cmVhbS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBmbHVzaGVzIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtLgotICAgICAqIElmIGFuIGVycm9yIG9jY3Vycywgc2V0IGFuIGVycm9yIGluIHRoaXMgUHJpbnRTdHJlYW0gdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogRW5zdXJlcyB0aGF0IGFsbCBwZW5kaW5nIGRhdGEgaXMgc2VudCBvdXQgdG8gdGhlIHRhcmdldCBzdHJlYW0uIEl0IGFsc28KKyAgICAgKiBmbHVzaGVzIHRoZSB0YXJnZXQgc3RyZWFtLiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzLCB0aGlzIHN0cmVhbSdzIGVycm9yCisgICAgICogc3RhdGUgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmx1c2goKSB7CkBAIC0yNzAsNTAgKzI4NCw1MSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0cmluZyBmb3JtYXR0ZWQgYnkgYW4gaW50ZXJtZWRpYXRlIDxjb2RlPkZvcm1hdHRlcjwvY29kZT4gdG8KLSAgICAgKiB0aGlzIHN0cmVhbSB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZyBhbmQgYXJndW1lbnRzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZXRob2QgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGN1cnJlbnQgSlZNIGluc3RhbmNlIGxvY2FsZSwgYXMgaWYgaXQKLSAgICAgKiBpcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPkxvY2FsZS5nZXREZWZhdWx0KCk8L2NvZGU+IGNhbGwuCisgICAgICogV3JpdGVzIGEgc3RyaW5nIGZvcm1hdHRlZCBieSBhbiBpbnRlcm1lZGlhdGUge0Bjb2RlIEZvcm1hdHRlcn0gdG8gdGhlCisgICAgICogdGFyZ2V0IHN0cmVhbSB1c2luZyB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcgYW5kIGFyZ3VtZW50cy4gRm9yIHRoZQorICAgICAqIGxvY2FsZSwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmlydHVhbCBtYWNoaW5lIGluc3RhbmNlIGlzCisgICAgICogdXNlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICBBIGZvcm1hdCBzdHJpbmcuCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciB7QGxpbmsgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXR9LgogICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogICAgICAgICAgICBUaGUgYXJndW1lbnRzIGxpc3QuIElmIHRoZXJlIGFyZSBtb3JlIGFyZ3VtZW50cyB0aGFuIHRob3NlCi0gICAgICogICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcsIHRoZW4gdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gICAgICogICAgICAgICAgICBhcmUgaWdub3JlZC4KLSAgICAgKiBAcmV0dXJuIFRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZm9ybWF0dGVyLiBJZiB0aGVyZSBhcmUKKyAgICAgKiAgICAgICAgICAgIG1vcmUgYXJndW1lbnRzIHRoYW4gcmVxdWlyZWQgYnkgdGhlIHtAY29kZSBmb3JtYXR9IHN0cmluZywKKyAgICAgKiAgICAgICAgICAgIHRoZW4gdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMgb3IgdGhlIGFyZ3VtZW50cyBhcmUgbGVzcyB0aGFuIHRob3NlIHJlcXVpcmVkIGJ5Ci0gICAgICogICAgICAgICAgICAgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYW55IG90aGVyIGlsbGVnYWwgc2l0dWF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGlsbGVnYWwgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgYXJndW1lbnRzLCBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCBhcmd1bWVudHMgb3IgaWYgYW55IG90aGVyCisgICAgICogICAgICAgICAgICAgZXJyb3IgcmVnYXJkaW5nIHRoZSBmb3JtYXQgc3RyaW5nIG9yIGFyZ3VtZW50cyBpcyBkZXRlY3RlZC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGdpdmVuIGZvcm1hdCBpcyBudWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBmb3JtYXR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRTdHJlYW0gZm9ybWF0KFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIHJldHVybiBmb3JtYXQoTG9jYWxlLmdldERlZmF1bHQoKSwgZm9ybWF0LCBhcmdzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzdHJpbmcgZm9ybWF0dGVkIGJ5IGFuIGludGVybWVkaWF0ZSA8Y29kZT5Gb3JtYXR0ZXI8L2NvZGU+IHRvCi0gICAgICogdGhpcyBzdHJlYW0gdXNpbmcgdGhlIGdpdmVuIGZvcm1hdCBzdHJpbmcgYW5kIGFyZ3VtZW50cy4KKyAgICAgKiBXcml0ZXMgYSBzdHJpbmcgZm9ybWF0dGVkIGJ5IGFuIGludGVybWVkaWF0ZSB7QGxpbmsgRm9ybWF0dGVyfSB0byB0aGlzCisgICAgICogc3RyZWFtIHVzaW5nIHRoZSBzcGVjaWZpZWQgbG9jYWxlLCBmb3JtYXQgc3RyaW5nIGFuZCBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgdXNlZCBpbiB0aGUgbWV0aG9kLiBJZiBsb2NhbGUgaXMgbnVsbCwgdGhlbiBubwotICAgICAqICAgICAgICAgICAgbG9jYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUgdXNlZCBpbiB0aGUgbWV0aG9kLiBObyBsb2NhbGl6YXRpb24gd2lsbCBiZSBhcHBsaWVkCisgICAgICogICAgICAgICAgICBpZiB7QGNvZGUgbH0gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiAgICAgICAgICAgIEEgZm9ybWF0IHN0cmluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIHtAbGluayBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdH0uCiAgICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgbGlzdC4gSWYgdGhlcmUgYXJlIG1vcmUgYXJndW1lbnRzIHRoYW4gdGhvc2UKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAgICAgKiAgICAgICAgICAgIGFyZSBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gVGhpcyBzdHJlYW0uCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIuIElmIHRoZXJlIGFyZQorICAgICAqICAgICAgICAgICAgbW9yZSBhcmd1bWVudHMgdGhhbiByZXF1aXJlZCBieSB0aGUge0Bjb2RlIGZvcm1hdH0gc3RyaW5nLAorICAgICAqICAgICAgICAgICAgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGlzIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBpbGxlZ2FsIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgICAqICAgICAgICAgICAgIGFyZ3VtZW50cyBvciB0aGUgYXJndW1lbnRzIGFyZSBsZXNzIHRoYW4gdGhvc2UgcmVxdWlyZWQgYnkKLSAgICAgKiAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyBvciBhbnkgb3RoZXIgaWxsZWdhbCBzaXR1YXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGFyZ3VtZW50cyBvciBpZiBhbnkgb3RoZXIKKyAgICAgKiAgICAgICAgICAgICBlcnJvciByZWdhcmRpbmcgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYXJndW1lbnRzIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZ2l2ZW4gZm9ybWF0IGlzIG51bGwuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGZvcm1hdH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFN0cmVhbSBmb3JtYXQoTG9jYWxlIGwsIFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgewpAQCAtMzI1LDI1ICszNDAsMjQgQEAKIAogICAgIC8qKgogICAgICAqIFByaW50cyBhIGZvcm1hdHRlZCBzdHJpbmcuIFRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0aGUgc2FtZSBhcwotICAgICAqIHRoaXMgc3RyZWFtJ3MgPGNvZGU+Zm9ybWF0KFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKTwvY29kZT4KLSAgICAgKiBtZXRob2QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgY3VycmVudCBKVk0gaW5zdGFuY2UgbG9jYWxlLCBhcyBpZiBpdAotICAgICAqIGlzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+TG9jYWxlLmdldERlZmF1bHQoKTwvY29kZT4gY2FsbC4KKyAgICAgKiB0aGlzIHN0cmVhbSdzIHtAY29kZSAjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKX0gbWV0aG9kLiBGb3IgdGhlIGxvY2FsZSwKKyAgICAgKiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB2aXJ0dWFsIG1hY2hpbmUgaW5zdGFuY2UgaXMgdXNlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICBBIGZvcm1hdCBzdHJpbmcuCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvcgorICAgICAqICAgICAgICAgICAge0BsaW5rIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0fS4KICAgICAgKiBAcGFyYW0gYXJncwotICAgICAqICAgICAgICAgICAgVGhlIGFyZ3VtZW50cyBsaXN0LiBJZiB0aGVyZSBhcmUgbW9yZSBhcmd1bWVudHMgdGhhbiB0aG9zZQotICAgICAqICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nLCB0aGVuIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICAgICAqICAgICAgICAgICAgYXJlIGlnbm9yZWQuCi0gICAgICogQHJldHVybiBUaGlzIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZvcm1hdHRlci4gSWYgdGhlcmUgYXJlCisgICAgICogICAgICAgICAgICBtb3JlIGFyZ3VtZW50cyB0aGFuIHJlcXVpcmVkIGJ5IHRoZSB7QGNvZGUgZm9ybWF0fSBzdHJpbmcsCisgICAgICogICAgICAgICAgICB0aGVuIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgaWdub3JlZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGlsbGVnYWwgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlCi0gICAgICogICAgICAgICAgICAgYXJndW1lbnRzIG9yIHRoZSBhcmd1bWVudHMgYXJlIGxlc3MgdGhhbiB0aG9zZSByZXF1aXJlZCBieQotICAgICAqICAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIG9yIGFueSBvdGhlciBpbGxlZ2FsIHNpdHVhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBpbGxlZ2FsIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAqICAgICAgICAgICAgIGFyZ3VtZW50cywgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggYXJndW1lbnRzIG9yIGlmIGFueSBvdGhlcgorICAgICAqICAgICAgICAgICAgIGVycm9yIHJlZ2FyZGluZyB0aGUgZm9ybWF0IHN0cmluZyBvciBhcmd1bWVudHMgaXMgZGV0ZWN0ZWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBnaXZlbiBmb3JtYXQgaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZm9ybWF0fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW50U3RyZWFtIHByaW50ZihTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgewogICAgICAgICByZXR1cm4gZm9ybWF0KGZvcm1hdCwgYXJncyk7CkBAIC0zNTEsMjUgKzM2NSwyNSBAQAogCiAgICAgLyoqCiAgICAgICogUHJpbnRzIGEgZm9ybWF0dGVkIHN0cmluZy4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIGFzCi0gICAgICogdGhpcyB3cml0ZXIncwotICAgICAqIDxjb2RlPmZvcm1hdChMb2NhbGUgbCwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpPC9jb2RlPiBtZXRob2QuCisgICAgICogdGhpcyBzdHJlYW0ncyB7QGNvZGUgI2Zvcm1hdChMb2NhbGUsIFN0cmluZywgT2JqZWN0Li4uKX0gbWV0aG9kLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsCi0gICAgICogICAgICAgICAgICBUaGUgbG9jYWxlIHVzZWQgaW4gdGhlIG1ldGhvZC4gSWYgbG9jYWxlIGlzIG51bGwsIHRoZW4gbm8KLSAgICAgKiAgICAgICAgICAgIGxvY2FsaXphdGlvbiB3aWxsIGJlIGFwcGxpZWQuCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIHVzZWQgaW4gdGhlIG1ldGhvZC4gTm8gbG9jYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZAorICAgICAqICAgICAgICAgICAgaWYge0Bjb2RlIGx9IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICBBIGZvcm1hdCBzdHJpbmcuCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciB7QGxpbmsgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXR9LgogICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogICAgICAgICAgICBUaGUgYXJndW1lbnRzIGxpc3QuIElmIHRoZXJlIGFyZSBtb3JlIGFyZ3VtZW50cyB0aGFuIHRob3NlCi0gICAgICogICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcsIHRoZW4gdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gICAgICogICAgICAgICAgICBhcmUgaWdub3JlZC4KLSAgICAgKiBAcmV0dXJuIFRoaXMgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZm9ybWF0dGVyLiBJZiB0aGVyZSBhcmUKKyAgICAgKiAgICAgICAgICAgIG1vcmUgYXJndW1lbnRzIHRoYW4gcmVxdWlyZWQgYnkgdGhlIHtAY29kZSBmb3JtYXR9IHN0cmluZywKKyAgICAgKiAgICAgICAgICAgIHRoZW4gdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMgb3IgdGhlIGFyZ3VtZW50cyBhcmUgbGVzcyB0aGFuIHRob3NlIHJlcXVpcmVkIGJ5Ci0gICAgICogICAgICAgICAgICAgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYW55IG90aGVyIGlsbGVnYWwgc2l0dWF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGlsbGVnYWwgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgYXJndW1lbnRzLCBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCBhcmd1bWVudHMgb3IgaWYgYW55IG90aGVyCisgICAgICogICAgICAgICAgICAgZXJyb3IgcmVnYXJkaW5nIHRoZSBmb3JtYXQgc3RyaW5nIG9yIGFyZ3VtZW50cyBpcyBkZXRlY3RlZC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGdpdmVuIGZvcm1hdCBpcyBudWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBmb3JtYXR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRTdHJlYW0gcHJpbnRmKExvY2FsZSBsLCBTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgewogICAgICAgICByZXR1cm4gZm9ybWF0KGwsIGZvcm1hdCwgYXJncyk7CkBAIC0zODMsODggKzM5NywxMDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGFycmF5IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmNoYXJBcnJheTwvY29kZT4gdG8gdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hhckFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIHByaW50IG9uIHRoaXMgUHJpbnRTdHJlYW0uCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIHByaW50IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyW10gY2hhckFycmF5KSB7CiAgICAgICAgIHByaW50KG5ldyBTdHJpbmcoY2hhckFycmF5LCAwLCBjaGFyQXJyYXkubGVuZ3RoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNoYXJhY3RlciBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5jaDwvY29kZT4gdG8gdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgdG8gdGhlIHRhcmdldAorICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2gKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gcHJpbnQgb24gdGhpcyBQcmludFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gcHJpbnQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgY2gpIHsKICAgICAgICAgcHJpbnQoU3RyaW5nLnZhbHVlT2YoY2gpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5kbnVtPC9jb2RlPiB0byB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbS4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGRvdWJsZSB0byB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkbnVtCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB2YWx1ZSB0byBwcmludCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnQoZG91YmxlIGRudW0pIHsKICAgICAgICAgcHJpbnQoU3RyaW5nLnZhbHVlT2YoZG51bSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5mbG9hdDwvY29kZT4gcGFyYW1ldGVyCi0gICAgICogPGNvZGU+Zm51bTwvY29kZT4gdG8gdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmbG9hdCB0byB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmbnVtCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHRvIHByaW50IG9uIHRoaXMgUHJpbnRTdHJlYW0uCi0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdmFsdWUgdG8gcHJpbnQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgIAogICAgIHB1YmxpYyB2b2lkIHByaW50KGZsb2F0IGZudW0pIHsKICAgICAgICAgcHJpbnQoU3RyaW5nLnZhbHVlT2YoZm51bSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9idGFpbnMgdGhlIDxjb2RlPmludDwvY29kZT4gYXJndW1lbnQgYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGFuZAotICAgICAqIHByaW50cyBpdCB0byB0aGUgdGFyZ2V0IHtAbGluayBPdXRwdXRTdHJlYW19LgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0byB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbnVtCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+aW50PC9jb2RlPiB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgotICAgICAqLworICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgdG8gcHJpbnQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgIAogICAgIHB1YmxpYyB2b2lkIHByaW50KGludCBpbnVtKSB7CiAgICAgICAgIHByaW50KFN0cmluZy52YWx1ZU9mKGludW0pKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+bG9uZzwvY29kZT4gcGFyYW1ldGVyCi0gICAgICogPGNvZGU+bG51bTwvY29kZT4gdG8gdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBsb25nIHRvIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxudW0KLSAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5sb25nPC9jb2RlPiB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgotICAgICAqLworICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdmFsdWUgdG8gcHJpbnQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgIAogICAgIHB1YmxpYyB2b2lkIHByaW50KGxvbmcgbG51bSkgewogICAgICAgICBwcmludChTdHJpbmcudmFsdWVPZihsbnVtKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE9iamVjdCBwYXJhbWV0ZXIgPGNvZGU+b2JqPC9jb2RlPgotICAgICAqIHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtLgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgotICAgICAqLworICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBwcmludCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovICAgCiAgICAgcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgewogICAgICAgICBwcmludChTdHJpbmcudmFsdWVPZihvYmopKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHI8L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtLgorICAgICAqIFByaW50cyBhIHN0cmluZyB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gVGhlIHN0cmluZyBpcyBjb252ZXJ0ZWQgdG8gYW4gYXJyYXkKKyAgICAgKiBvZiBieXRlcyB1c2luZyB0aGUgZW5jb2RpbmcgY2hvc2VuIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIHRoaXMKKyAgICAgKiBzdHJlYW0uIFRoZSBieXRlcyBhcmUgdGhlbiB3cml0dGVuIHRvIHRoZSB0YXJnZXQgc3RyZWFtIHdpdGgKKyAgICAgKiB7QGNvZGUgd3JpdGUoaW50KX0uCisgICAgICogPHA+CisgICAgICogSWYgYW4gSS9PIGVycm9yIG9jY3VycywgdGhpcyBzdHJlYW0ncyBlcnJvciBzdGF0ZSBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlICN3cml0ZShpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHByaW50KFN0cmluZyBzdHIpIHsKICAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CkBAIC00ODgsMTE2ICs1MjMsMTMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmJvb2w8L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtLgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBib29sCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdG8gcHJpbnQgb24gdGhpcyBQcmludFN0cmVhbS4KLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHZhbHVlIHRvIHByaW50IHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludChib29sZWFuIGJvb2wpIHsKICAgICAgICAgcHJpbnQoU3RyaW5nLnZhbHVlT2YoYm9vbCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTeXN0ZW0gcHJvcGVydHkKLSAgICAgKiA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPiB0byB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbS4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICoge0Bjb2RlICJsaW5lLnNlcGFyYXRvciJ9IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB7CiAgICAgICAgIG5ld2xpbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGFycmF5IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmNoYXJBcnJheTwvY29kZT4gdG8gdGhlIHRhcmdldCBPdXRwdXRTdHJlYW0gZm9sbG93ZWQgYnkgdGhlCi0gICAgICogU3lzdGVtIHByb3BlcnR5IDxjb2RlPiJsaW5lLnNlcGFyYXRvciI8L2NvZGU+LgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFycmF5CisgICAgICogZm9sbG93ZWQgYnkgdGhlIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgImxpbmUuc2VwYXJhdG9yIn0gdG8gdGhlIHRhcmdldAorICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hhckFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIHByaW50IG9uIHRoaXMgUHJpbnRTdHJlYW0uCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIHByaW50IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXJbXSBjaGFyQXJyYXkpIHsKICAgICAgICAgcHJpbnRsbihuZXcgU3RyaW5nKGNoYXJBcnJheSwgMCwgY2hhckFycmF5Lmxlbmd0aCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgcGFyYW1ldGVyCi0gICAgICogPGNvZGU+Y2g8L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0KLSAgICAgKiBwcm9wZXJ0eSA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmb2xsb3dlZCBieQorICAgICAqIHRoZSBzeXN0ZW0gcHJvcGVydHkge0Bjb2RlICJsaW5lLnNlcGFyYXRvciJ9IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaAotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBwcmludCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIGNoKSB7CiAgICAgICAgIHByaW50bG4oU3RyaW5nLnZhbHVlT2YoY2gpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5kbnVtPC9jb2RlPiB0byB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbSBmb2xsb3dlZCBieSB0aGUgU3lzdGVtCi0gICAgICogcHJvcGVydHkgPGNvZGU+ImxpbmUuc2VwYXJhdG9yIjwvY29kZT4uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBkb3VibGUgZm9sbG93ZWQgYnkgdGhlCisgICAgICogc3lzdGVtIHByb3BlcnR5IHtAY29kZSAibGluZS5zZXBhcmF0b3IifSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZG51bQotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB2YWx1ZSB0byBwcmludCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRsbihkb3VibGUgZG51bSkgewogICAgICAgICBwcmludGxuKFN0cmluZy52YWx1ZU9mKGRudW0pKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmZudW08L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0KLSAgICAgKiBwcm9wZXJ0eSA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZsb2F0IGZvbGxvd2VkIGJ5IHRoZQorICAgICAqIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgImxpbmUuc2VwYXJhdG9yIn0gdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZudW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50bG4oZmxvYXQgZm51bSkgeworICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKKyAgIHB1YmxpYyB2b2lkIHByaW50bG4oZmxvYXQgZm51bSkgewogICAgICAgICBwcmludGxuKFN0cmluZy52YWx1ZU9mKGZudW0pKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBPYnRhaW5zIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IGFyZ3VtZW50IGFzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBhbmQKLSAgICAgKiBwcmludHMgaXQgdG8gdGhlIHRhcmdldCB7QGxpbmsgT3V0cHV0U3RyZWFtfSBmb2xsb3dlZCBieSB0aGUgU3lzdGVtCi0gICAgICogcHJvcGVydHkgPGNvZGU+ImxpbmUuc2VwYXJhdG9yIjwvY29kZT4uCisgICAvKioKKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgZm9sbG93ZWQgYnkgdGhlCisgICAgICogc3lzdGVtIHByb3BlcnR5IHtAY29kZSAibGluZS5zZXBhcmF0b3IifSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW51bQotICAgICAqICAgICAgICAgICAgdGhlIGludCB0byBwcmludCBvbiB0aGlzIFByaW50U3RyZWFtLgotICAgICAqLworICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgdG8gcHJpbnQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgIAogICAgIHB1YmxpYyB2b2lkIHByaW50bG4oaW50IGludW0pIHsKICAgICAgICAgcHJpbnRsbihTdHJpbmcudmFsdWVPZihpbnVtKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmxvbmc8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmxudW08L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0KLSAgICAgKiBwcm9wZXJ0eSA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxvbmcgZm9sbG93ZWQgYnkgdGhlCisgICAgICogc3lzdGVtIHByb3BlcnR5IHtAY29kZSAibGluZS5zZXBhcmF0b3IifSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG51bQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gcHJpbnQgb24gdGhpcyBQcmludFN0cmVhbS4KLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludGxuKGxvbmcgbG51bSkgewogICAgICAgICBwcmludGxuKFN0cmluZy52YWx1ZU9mKGxudW0pKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5vYmo8L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0KLSAgICAgKiBwcm9wZXJ0eSA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBmb2xsb3dlZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gcHJvcGVydHkge0Bjb2RlICJsaW5lLnNlcGFyYXRvciJ9IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIHByaW50IG9uIHRoaXMgUHJpbnRTdHJlYW0uCi0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHByaW50IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludGxuKE9iamVjdCBvYmopIHsKICAgICAgICAgcHJpbnRsbihTdHJpbmcudmFsdWVPZihvYmopKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHI8L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0KLSAgICAgKiBwcm9wZXJ0eSA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgYSBzdHJpbmcgZm9sbG93ZWQgYnkgdGhlIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgImxpbmUuc2VwYXJhdG9yIn0KKyAgICAgKiB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gVGhlIHN0cmluZyBpcyBjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgdXNpbmcKKyAgICAgKiB0aGUgZW5jb2RpbmcgY2hvc2VuIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIHRoaXMgc3RyZWFtLiBUaGUgYnl0ZXMgYXJlCisgICAgICogdGhlbiB3cml0dGVuIHRvIHRoZSB0YXJnZXQgc3RyZWFtIHdpdGgge0Bjb2RlIHdyaXRlKGludCl9LgorICAgICAqIDxwPgorICAgICAqIElmIGFuIEkvTyBlcnJvciBvY2N1cnMsIHRoaXMgc3RyZWFtJ3MgZXJyb3Igc3RhdGUgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gcHJpbnQgb24gdGhpcyBQcmludFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHNlZSAjd3JpdGUoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcmludGxuKFN0cmluZyBzdHIpIHsKICAgICAgICAgcHJpbnQoc3RyKTsKQEAgLTYwNSw0OSArNjU3LDYzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmJvb2w8L2NvZGU+IHRvIHRoZSB0YXJnZXQgT3V0cHV0U3RyZWFtIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0KLSAgICAgKiBwcm9wZXJ0eSA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gZm9sbG93ZWQgYnkgdGhlCisgICAgICogc3lzdGVtIHByb3BlcnR5IHtAY29kZSAibGluZS5zZXBhcmF0b3IifSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYm9vbAotICAgICAqICAgICAgICAgICAgdGhlIGJvb2xlYW4gdG8gcHJpbnQgb24gdGhpcyBQcmludFN0cmVhbS4KLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludGxuKGJvb2xlYW4gYm9vbCkgewogICAgICAgICBwcmludGxuKFN0cmluZy52YWx1ZU9mKGJvb2wpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBlcnJvciBmbGFnIG9mIHRoaXMgcHJpbnQgc3RyZWFtIHRvIHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvcigpIHsKICAgICAgICAgaW9FcnJvciA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmNvdW50PC9jb2RlPiA8Y29kZT5ieXRlczwvY29kZT4gZnJvbSB0aGUgYnl0ZSBhcnJheQotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiB0byB0aGlzCi0gICAgICogUHJpbnRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gd3JpdGVzIHRoZSA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHRoZQotICAgICAqIHRhcmdldCBPdXRwdXRTdHJlYW0gYW5kIGlmIHRoaXMgUHJpbnRTdHJlYW0gaXMgc2V0IHRvIGF1dG9mbHVzaCwgZmx1c2hlcwotICAgICAqIGl0LiBJZiBhbiBlcnJvciBvY2N1cnMsIHNldCBhbiBlcnJvciBpbiB0aGlzIFByaW50U3RyZWFtIHRvCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogV3JpdGVzIHtAY29kZSBjb3VudH0gYnl0ZXMgZnJvbSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdCB7QGNvZGUgb2Zmc2V0fQorICAgICAqIHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBJZiBhdXRvZmx1c2ggaXMgc2V0LCB0aGlzIHN0cmVhbSBnZXRzIGZsdXNoZWQgYWZ0ZXIKKyAgICAgKiB3cml0aW5nIHRoZSBidWZmZXIuCisgICAgICogPHA+CisgICAgICogVGhpcyBzdHJlYW0ncyBlcnJvciBmbGFnIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkCisgICAgICogb3IgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4uCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGJ1ZmZlciB0byBnZXQgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZS4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIgdG8gd3JpdGUKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBvZmZzZXQgb3IgY291bnQgYXJlIG91dHNpZGUgb2YgYm91bmRzLgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBpbiB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgY291bnQgPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgY291bnR9IGlzIGJpZ2dlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHNlZSAjZmx1c2goKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIHx8IGNvdW50IDwgMAotICAgICAgICAgICAgICAgIHx8IGNvdW50ID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMAorICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAoY291bnQgPCAwKSB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKChvZmZzZXQgfCBjb3VudCkgPCAwIHx8IGNvdW50ID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBzZXRFcnJvcigpOwpAQCAtNjY1LDE1ICs3MzEsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBieXRlIDxjb2RlPm9uZUJ5dGU8L2NvZGU+IHRvIHRoaXMgUHJpbnRTdHJlYW0uCi0gICAgICogT25seSB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgPGNvZGU+b25lQnl0ZTwvY29kZT4gaXMgd3JpdHRlbi4gVGhpcwotICAgICAqIGltcGxlbWVudGF0aW9uIHdyaXRlcyA8Y29kZT5vbmVCeXRlPC9jb2RlPiB0byB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbS4KLSAgICAgKiBJZiA8Y29kZT5vbmVCeXRlPC9jb2RlPiBpcyBlcXVhbCB0byB0aGUgY2hhcmFjdGVyIDxjb2RlPidcbic8L2NvZGU+Ci0gICAgICogYW5kIHRoaXMgUHJpbnRTdGVhbSBpcyBzZXQgdG8gYXV0b2ZsdXNoLCB0aGUgdGFyZ2V0IE91dHB1dFN0cmVhbSBpcwotICAgICAqIGZsdXNoZWQuCisgICAgICogV3JpdGVzIG9uZSBieXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBPbmx5IHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mCisgICAgICogdGhlIGludGVnZXIge0Bjb2RlIG9uZUJ5dGV9IGlzIHdyaXR0ZW4uIFRoaXMgc3RyZWFtIGlzIGZsdXNoZWQgaWYKKyAgICAgKiB7QGNvZGUgb25lQnl0ZX0gaXMgZXF1YWwgdG8gdGhlIGNoYXJhY3RlciB7QGNvZGUgJ1xuJ30gYW5kIHRoaXMgc3RyZWFtIGlzCisgICAgICogc2V0IHRvIGF1dG9mbHVzaC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHN0cmVhbSdzIGVycm9yIGZsYWcgaXMgc2V0IHRvIHtAY29kZSB0cnVlfSBpZiBpdCBpcyBjbG9zZWQgb3IgYW4gSS9PCisgICAgICogZXJyb3Igb2NjdXJzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQnl0ZQogICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gYmUgd3JpdHRlbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShpbnQgb25lQnl0ZSkgewpAQCAtNjkyLDEzICs3NjEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBjaGFyIDxjb2RlPmM8L2NvZGU+IHRvIHRoZSBQcmludFN0cmVhbS4gVGhlCi0gICAgICogUHJpbnRTdHJlYW0uYXBwZW5kKDxjb2RlPmM8L2NvZGU+KSB3b3JrcyB0aGUgc2FtZSB3YXkgYXMKLSAgICAgKiBQcmludFN0cmVhbS5wcmludCg8Y29kZT5jPC9jb2RlPikuCisgICAgICogQXBwZW5kcyB0aGUgY2hhcmFjdGVyIHtAY29kZSBjfSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4gVGhpcyBtZXRob2Qgd29ya3MKKyAgICAgKiB0aGUgc2FtZSB3YXkgYXMge0BsaW5rICNwcmludChjaGFyKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgYXBwZW5kZWQgdG8gdGhlIFByaW50U3RyZWFtLgotICAgICAqIEByZXR1cm4gVGhlIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBhcHBlbmQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCisgICAgICogQHJldHVybiB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRTdHJlYW0gYXBwZW5kKGNoYXIgYykgewogICAgICAgICBwcmludChjKTsKQEAgLTcwNiwxNSArNzc1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kIGEgQ2hhclNlcXVlbmNlIDxjb2RlPmNzcTwvY29kZT4gdG8gdGhlIFByaW50U3RyZWFtLiBUaGUKLSAgICAgKiBQcmludFN0cmVhbS5hcHBlbmQoPGNvZGU+Y3NxPC9jb2RlPikgd29ya3MgdGhlIHNhbWUgd2F5IGFzCi0gICAgICogUHJpbnRTdHJlYW0ucHJpbnQoPGNvZGU+Y3NxPC9jb2RlPi50b1N0cmluZygpKS4gSWYgPGNvZGU+Y3NxPC9jb2RlPgotICAgICAqIGlzIG51bGwsIHRoZW4gYSBDaGFyU2VxdWVuY2UganVzdCBjb250YWlucyB0aGVuICJudWxsIiB3aWxsIGJlCi0gICAgICogc3Vic3RpdHV0ZWQgZm9yIDxjb2RlPmNzcTwvY29kZT4uCisgICAgICogQXBwZW5kcyB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHtAY29kZSBjc3F9IHRvIHRoZSB0YXJnZXQgc3RyZWFtLiBUaGlzCisgICAgICogbWV0aG9kIHdvcmtzIHRoZSBzYW1lIHdheSBhcyB7QGNvZGUgUHJpbnRTdHJlYW0ucHJpbnQoY3NxLnRvU3RyaW5nKCkpfS4KKyAgICAgKiBJZiB7QGNvZGUgY3NxfSBpcyB7QGNvZGUgbnVsbH0sIHRoZW4gdGhlIHN0cmluZyAibnVsbCIgaXMgd3JpdHRlbiB0byB0aGUKKyAgICAgKiB0YXJnZXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjc3EKLSAgICAgKiAgICAgICAgICAgIFRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIFByaW50U3RyZWFtLgotICAgICAqIEByZXR1cm4gVGhlIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFN0cmVhbSBhcHBlbmQoQ2hhclNlcXVlbmNlIGNzcSkgewogICAgICAgICBpZiAobnVsbCA9PSBjc3EpIHsKQEAgLTcyNiwyNiArNzk1LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kIGEgc3Vic2VxdWVuY2Ugb2YgYSBDaGFyU2VxdWVuY2UgPGNvZGU+Y3NxPC9jb2RlPiB0byB0aGUKLSAgICAgKiBQcmludFN0cmVhbS4gVGhlIGZpcnN0IGNoYXIgYW5kIHRoZSBsYXN0IGNoYXIgb2YgdGhlIHN1YnNlcXVuY2UgaXMKLSAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4uCi0gICAgICogVGhlIFByaW50U3RyZWFtLmFwcGVuZCg8Y29kZT5jc3E8L2NvZGU+KSB3b3JrcyB0aGUgc2FtZSB3YXkgYXMKLSAgICAgKiBQcmludFN0cmVhbS5wcmludCAoPGNvZGU+Y3NxPC9jb2RlPmNzcS5zdWJTZXF1ZW5jZSg8Y29kZT5zdGFydDwvY29kZT4sCi0gICAgICogPGNvZGU+ZW5kPC9jb2RlPikudG9TdHJpbmcpLiBJZiA8Y29kZT5jc3E8L2NvZGU+IGlzIG51bGwsIHRoZW4KLSAgICAgKiAibnVsbCIgd2lsbCBiZSBzdWJzdGl0dXRlZCBmb3IgPGNvZGU+Y3NxPC9jb2RlPi4KKyAgICAgKiBBcHBlbmRzIGEgc3Vic2VxdWVuY2Ugb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB7QGNvZGUgY3NxfSB0byB0aGUgdGFyZ2V0CisgICAgICogc3RyZWFtLiBUaGlzIG1ldGhvZCB3b3JrcyB0aGUgc2FtZSB3YXkgYXMge0Bjb2RlCisgICAgICogUHJpbnRTdHJlYW0ucHJpbnQoY3NxLnN1YnNlcXVlbmNlKHN0YXJ0LCBlbmQpLnRvU3RyaW5nKCkpfS4gSWYge0Bjb2RlCisgICAgICogY3NxfSBpcyB7QGNvZGUgbnVsbH0sIHRoZW4gdGhlIHNwZWNpZmllZCBzdWJzZXF1ZW5jZSBvZiB0aGUgc3RyaW5nICJudWxsIgorICAgICAqIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY3NxCi0gICAgICogICAgICAgICAgICBUaGUgQ2hhclNlcXVlbmNlIGFwcGVuZGVkIHRvIHRoZSBQcmludFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXIgaW4gdGhlIENoYXJTZXF1ZW5jZSBhcHBlbmRlZCB0bwotICAgICAqICAgICAgICAgICAgdGhlIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyIGluIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYXBwZW5kZWQKKyAgICAgKiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhciBhZnRlciB0aGUgbGFzdCBvbmUgaW4gdGhlIENoYXJTZXF1ZW5jZQotICAgICAqICAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIFByaW50U3RyZWFtLgotICAgICAqIEByZXR1cm4gVGhlIFByaW50U3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHN1YnNlcXVlbmNlIGFwcGVuZGVkIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0uCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgc3RhcnQgaXMgbGVzcyB0aGFuIGVuZCwgZW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCi0gICAgICogICAgICAgICAgICAgdGhlIENoYXJTZXF1ZW5jZSwgb3Igc3RhcnQgb3IgZW5kIGlzIG5lZ2F0aXZlLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0sIHtAY29kZSBzdGFydCA8IDB9LCB7QGNvZGUgZW5kIDwgMH0gb3IKKyAgICAgKiAgICAgICAgICAgICBlaXRoZXIge0Bjb2RlIHN0YXJ0fSBvciB7QGNvZGUgZW5kfSBhcmUgZ3JlYXRlciBvciBlcXVhbCB0aGFuCisgICAgICogICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB7QGNvZGUgY3NxfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRTdHJlYW0gYXBwZW5kKENoYXJTZXF1ZW5jZSBjc3EsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBpZiAobnVsbCA9PSBjc3EpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1ByaW50V3JpdGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QcmludFdyaXRlci5qYXZhCmluZGV4IGFjOWJmNTUuLjExOTJkOGUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1ByaW50V3JpdGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUHJpbnRXcml0ZXIuamF2YQpAQCAtMzAsMjUgKzMwLDI5IEBACiAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKIC8qKgotICogUHJpbnRXcml0ZXIgaXMgYSBjbGFzcyB3aGljaCB0YWtlcyBlaXRoZXIgYW4gT3V0cHV0U3RyZWFtIG9yIFdyaXRlciBhbmQKLSAqIHByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHByaW50aW5nIGNvbW1vbiBkYXRhIHR5cGVzIGluIGEgaHVtYW4KLSAqIHJlYWRhYmxlIGZvcm1hdCBvbiB0aGUgc3RyZWFtLiBObyBJT0V4Y2VwdGlvbnMgYXJlIHRocm93biBieSB0aGlzIGNsYXNzLgotICogSW5zdGVhZCwgY2FsbGVycyBzaG91bGQgY2FsbCBjaGVja0Vycm9yKCkgdG8gc2VlIGlmIGEgcHJvYmxlbSBoYXMgYmVlbgotICogZW5jb3VudGVyZWQgaW4gdGhpcyBXcml0ZXIuCisgKiBXcmFwcyBlaXRoZXIgYW4gZXhpc3Rpbmcge0BsaW5rIE91dHB1dFN0cmVhbX0gb3IgYW4gZXhpc3Rpbmcge0BsaW5rIFdyaXRlcn0KKyAqIGFuZCBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBwcmludGluZyBjb21tb24gZGF0YSB0eXBlcyBpbiBhIGh1bWFuCisgKiByZWFkYWJsZSBmb3JtYXQuIE5vIHtAY29kZSBJT0V4Y2VwdGlvbn0gaXMgdGhyb3duIGJ5IHRoaXMgY2xhc3MuIEluc3RlYWQsCisgKiBjYWxsZXJzIHNob3VsZCB1c2Uge0BsaW5rICNjaGVja0Vycm9yKCl9IHRvIHNlZSBpZiBhIHByb2JsZW0gaGFzIG9jY3VycmVkIGluCisgKiB0aGlzIHdyaXRlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQcmludFdyaXRlciBleHRlbmRzIFdyaXRlciB7CiAgICAgLyoqCi0gICAgICogVGhlIHdyaXRlciB0byBvdXRwdXQgZGF0YSB0by4KKyAgICAgKiBUaGUgd3JpdGVyIHRvIHByaW50IGRhdGEgdG8uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFdyaXRlciBvdXQ7CiAKICAgICAvKioKLSAgICAgKiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBQcmludFdyaXRlciBoYXMgaW5jdXJyZWQgYW4gZXJyb3IuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBQcmludFdyaXRlciBpcyBpbiBhbiBlcnJvciBzdGF0ZS4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaW9FcnJvcjsKIAogICAgIC8qKgotICAgICAqIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIFByaW50V3JpdGVyIHNob3VsZCBmbHVzaCBpdHMgY29udGVudHMgYWZ0ZXIKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBQcmludFdyaXRlciBzaG91bGQgZmx1c2ggaXRzIGNvbnRlbnRzIGFmdGVyCiAgICAgICogcHJpbnRpbmcgYSBuZXcgbGluZS4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gYXV0b2ZsdXNoOwpAQCAtNTcsNTQgKzYxLDY4IEBACiAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aUFjdGlvbjxTdHJpbmc+KCJsaW5lLnNlcGFyYXRvciIpKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFdyaXRlciBvbiB0aGUgT3V0cHV0U3RyZWFtIDxjb2RlPm91dDwvY29kZT4uIEFsbAotICAgICAqIHdyaXRlcyB0byB0aGUgdGFyZ2V0IGNhbiBub3cgdGFrZSBwbGFjZSB0aHJvdWdoIHRoaXMgUHJpbnRXcml0ZXIuIEJ5Ci0gICAgICogZGVmYXVsdCwgdGhlIFByaW50V3JpdGVyIGlzIHNldCB0byBub3QgYXV0b2ZsdXNoIHdoZW4gcHJpbnRsbigpIGlzCi0gICAgICogY2FsbGVkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFByaW50V3JpdGVyfSB3aXRoIHtAY29kZSBvdXR9IGFzIGl0cyB0YXJnZXQKKyAgICAgKiBzdHJlYW0uIEJ5IGRlZmF1bHQsIHRoZSBuZXcgcHJpbnQgd3JpdGVyIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZmx1c2ggaXRzCisgICAgICogY29udGVudHMgdG8gdGhlIHRhcmdldCBzdHJlYW0gd2hlbiBhIG5ld2xpbmUgaXMgZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIHRoZSBPdXRwdXRTdHJlYW0gdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBvdXRwdXQgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb3V0fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW50V3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKICAgICAgICAgdGhpcyhuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCksIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByaW50V3JpdGVyIG9uIHRoZSBPdXRwdXRTdHJlYW0gPGNvZGU+b3V0PC9jb2RlPi4gQWxsCi0gICAgICogd3JpdGVzIHRvIHRoZSB0YXJnZXQgY2FuIG5vdyB0YWtlIHBsYWNlIHRocm91Z2ggdGhpcyBQcmludFdyaXRlci4gQnkKLSAgICAgKiBkZWZhdWx0LCB0aGUgUHJpbnRXcml0ZXIgaXMgc2V0IHRvIG5vdCBhdXRvZmx1c2ggd2hlbiBwcmludGxuKCkgaXMKLSAgICAgKiBjYWxsZWQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJpbnRXcml0ZXJ9IHdpdGgge0Bjb2RlIG91dH0gYXMgaXRzIHRhcmdldAorICAgICAqIHN0cmVhbS4gVGhlIHBhcmFtZXRlciB7QGNvZGUgYXV0b2ZsdXNofSBkZXRlcm1pbmVzIGlmIHRoZSBwcmludCB3cml0ZXIKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGZsdXNoZXMgaXRzIGNvbnRlbnRzIHRvIHRoZSB0YXJnZXQgc3RyZWFtIHdoZW4gYSBuZXdsaW5lIGlzCisgICAgICogZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIHRoZSBPdXRwdXRTdHJlYW0gdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBvdXRwdXQgc3RyZWFtLgogICAgICAqIEBwYXJhbSBhdXRvZmx1c2gKLSAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gZmx1c2ggd2hlbiBwcmludGxuKCkgaXMgY2FsbGVkLgorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgY29udGVudHMgYXJlIGZsdXNoZWQgdXBvbiBlbmNvdW50ZXJpbmcgYQorICAgICAqICAgICAgICAgICAgbmV3bGluZSBzZXF1ZW5jZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG91dH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFdyaXRlcihPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGF1dG9mbHVzaCkgewogICAgICAgICB0aGlzKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0KSwgYXV0b2ZsdXNoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByaW50V3JpdGVyIG9uIHRoZSBXcml0ZXIgPGNvZGU+d3I8L2NvZGU+LiBBbGwgd3JpdGVzCi0gICAgICogdG8gdGhlIHRhcmdldCBjYW4gbm93IHRha2UgcGxhY2UgdGhyb3VnaCB0aGlzIFByaW50V3JpdGVyLiBCeSBkZWZhdWx0LAotICAgICAqIHRoZSBQcmludFdyaXRlciBpcyBzZXQgdG8gbm90IGF1dG9mbHVzaCB3aGVuIHByaW50bG4oKSBpcyBjYWxsZWQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJpbnRXcml0ZXJ9IHdpdGgge0Bjb2RlIHdyfSBhcyBpdHMgdGFyZ2V0CisgICAgICogd3JpdGVyLiBCeSBkZWZhdWx0LCB0aGUgbmV3IHByaW50IHdyaXRlciBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGZsdXNoIGl0cworICAgICAqIGNvbnRlbnRzIHRvIHRoZSB0YXJnZXQgd3JpdGVyIHdoZW4gYSBuZXdsaW5lIGlzIGVuY291bnRlcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB3cgotICAgICAqICAgICAgICAgICAgdGhlIFdyaXRlciB0byBwcm92aWRlIGNvbnZlbmllbmNlIG1ldGhvZHMgb24uCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHdyaXRlci4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHdyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW50V3JpdGVyKFdyaXRlciB3cikgewogICAgICAgICB0aGlzKHdyLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFdyaXRlciBvbiB0aGUgZ2l2ZW4gd3JpdGVyLiBBbGwgd3JpdGVzIHRvIHRoZQotICAgICAqIHRhcmdldCBjYW4gbm93IHRha2UgcGxhY2UgdGhyb3VnaCB0aGlzIFByaW50V3JpdGVyLiBCeSBkZWZhdWx0LCB0aGUKLSAgICAgKiBQcmludFdyaXRlciBpcyBzZXQgdG8gbm90IGF1dG9mbHVzaCB3aGVuIHByaW50bG4oKSBpcyBjYWxsZWQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJpbnRXcml0ZXJ9IHdpdGgge0Bjb2RlIG91dH0gYXMgaXRzIHRhcmdldAorICAgICAqIHdyaXRlci4gVGhlIHBhcmFtZXRlciB7QGNvZGUgYXV0b2ZsdXNofSBkZXRlcm1pbmVzIGlmIHRoZSBwcmludCB3cml0ZXIKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGZsdXNoZXMgaXRzIGNvbnRlbnRzIHRvIHRoZSB0YXJnZXQgd3JpdGVyIHdoZW4gYSBuZXdsaW5lIGlzCisgICAgICogZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHdyCi0gICAgICogICAgICAgICAgICB0aGUgV3JpdGVyIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgd3JpdGVyLgogICAgICAqIEBwYXJhbSBhdXRvZmx1c2gKLSAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gZmx1c2ggd2hlbiBwcmludGxuKCkgaXMgY2FsbGVkLgorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZmx1c2ggY29udGVudHMgdXBvbiBlbmNvdW50ZXJpbmcgYQorICAgICAqICAgICAgICAgICAgbmV3bGluZSBzZXF1ZW5jZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG91dH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFdyaXRlcihXcml0ZXIgd3IsIGJvb2xlYW4gYXV0b2ZsdXNoKSB7CiAgICAgICAgIHN1cGVyKHdyKTsKQEAgLTExMywxNiArMTMxLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFdyaXRlciBvbiB0aGUgRmlsZSA8Y29kZT5maWxlPC9jb2RlPi4gVGhlCi0gICAgICogYXV0b21hdGljIGZsdXNoaW5nIGlzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4uIEFuIGludGVybWVkaWF0ZQotICAgICAqIDxjb2RlPk91dHB1dFN0cmVhbVdyaXRlcjwvY29kZT4gd2lsbCB1c2UgdGhlIGRlZmF1bHQgZm9yIHRoZSBjdXJyZW50Ci0gICAgICogSlZNIGluc3RhbmNlIGNoYXJzZXQgdG8gZW5jb2RlIGNoYXJhY3RlcnMuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJpbnRXcml0ZXJ9IHdpdGgge0Bjb2RlIGZpbGV9IGFzIGl0cyB0YXJnZXQuIFRoZQorICAgICAqIHZpcnR1YWwgbWFjaGluZSdzIGRlZmF1bHQgY2hhcmFjdGVyIHNldCBpcyB1c2VkIGZvciBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICogVGhlIHByaW50IHdyaXRlciBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGZsdXNoIGl0cyBjb250ZW50cyB0byB0aGUgdGFyZ2V0CisgICAgICogZmlsZSB3aGVuIGEgbmV3bGluZSBpcyBlbmNvdW50ZXJlZC4gVGhlIG91dHB1dCB0byB0aGUgZmlsZSBpcyBidWZmZXJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgVGhpcyB3cml0ZXIncyBidWZmZXJlZCBkZXN0aW5hdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZS4gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0cyBjb250ZW50cyBhcmUKKyAgICAgKiAgICAgICAgICAgIHJlbW92ZWQsIG90aGVyd2lzZSBhIG5ldyBmaWxlIGlzIGNyZWF0ZWQuCiAgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBzdWNoIGEgZmlsZSBvciBzb21lIG90aGVyIGVycm9yIG9jY3VycyBkdWUgdG8KLSAgICAgKiAgICAgICAgICAgICB0aGUgZ2l2ZW4gZmlsZSBvcGVuaW5nLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBvcGVuaW5nIG9yIGNyZWF0aW5nIHRoZSB0YXJnZXQgZmlsZS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGVuaWVzIHdyaXRpbmcgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdGFyZ2V0IGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW50V3JpdGVyKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbW9kaWZpZWQKQEAgLTEzNCwyMCArMTU2LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFdyaXRlciBvbiB0aGUgRmlsZSA8Y29kZT5maWxlPC9jb2RlPi4gVGhlCi0gICAgICogYXV0b21hdGljIGZsdXNoaW5nIGlzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4uIEFuIGludGVybWVkaWF0ZQotICAgICAqIDxjb2RlPk91dHB1dFN0cmVhbVdyaXRlcjwvY29kZT4gd2lsbCB1c2UgYSBjaGFyc2V0IHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiA8Y29kZT5jc248L2NvZGU+IHRvIGVuY29kZSBjaGFyYWN0ZXJzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFByaW50V3JpdGVyfSB3aXRoIHtAY29kZSBmaWxlfSBhcyBpdHMgdGFyZ2V0LiBUaGUKKyAgICAgKiBjaGFyYWN0ZXIgc2V0IG5hbWVkIHtAY29kZSBjc259IGlzIHVzZWQgZm9yIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKiBUaGUgcHJpbnQgd3JpdGVyIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZmx1c2ggaXRzIGNvbnRlbnRzIHRvIHRoZSB0YXJnZXQKKyAgICAgKiBmaWxlIHdoZW4gYSBuZXdsaW5lIGlzIGVuY291bnRlcmVkLiBUaGUgb3V0cHV0IHRvIHRoZSBmaWxlIGlzIGJ1ZmZlcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBUaGlzIHdyaXRlcidzIGJ1ZmZlcmVkIGRlc3RpbmF0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlLiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXRzIGNvbnRlbnRzIGFyZQorICAgICAqICAgICAgICAgICAgcmVtb3ZlZCwgb3RoZXJ3aXNlIGEgbmV3IGZpbGUgaXMgY3JlYXRlZC4KICAgICAgKiBAcGFyYW0gY3NuCi0gICAgICogICAgICAgICAgICBBIGNoYXJzZXQgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgZm9yIGNoYXJhY3RlciBlbmNvZGluZy4KICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIHN1Y2ggYSBmaWxlIG9yIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJzIGR1ZSB0bwotICAgICAqICAgICAgICAgICAgIHRoZSBnaXZlbiBmaWxlIG9wZW5pbmcuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIG9wZW5pbmcgb3IgY3JlYXRpbmcgdGhlIHRhcmdldCBmaWxlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY3NufSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRlbmllcyB3cml0aW5nIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHRhcmdldCBmaWxlLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgY2hhcnNldCB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBieSB7QGNvZGUgY3NufSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFdyaXRlcihGaWxlIGZpbGUsIFN0cmluZyBjc24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sCiAgICAgICAgICAgICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTE2MCwxNyArMTg4LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQcmludFdyaXRlciBvbiBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBuYW1lCi0gICAgICogPGNvZGU+ZmlsZU5hbWU8L2NvZGU+LiBUaGUgYXV0b21hdGljIGZsdXNoaW5nIGlzIHNldCB0bwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gQW4gaW50ZXJtZWRpYXRlIDxjb2RlPk91dHB1dFN0cmVhbVdyaXRlcjwvY29kZT4KLSAgICAgKiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmb3IgdGhlIGN1cnJlbnQgSlZNIGluc3RhbmNlIGNoYXJzZXQgdG8gZW5jb2RlCi0gICAgICogY2hhcmFjdGVycy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBQcmludFdyaXRlcn0gd2l0aCB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5IHtAY29kZQorICAgICAqIGZpbGVOYW1lfSBhcyBpdHMgdGFyZ2V0LiBUaGUgdmlydHVhbCBtYWNoaW5lJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGlzCisgICAgICogdXNlZCBmb3IgY2hhcmFjdGVyIGVuY29kaW5nLiBUaGUgcHJpbnQgd3JpdGVyIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkKKyAgICAgKiBmbHVzaCBpdHMgY29udGVudHMgdG8gdGhlIHRhcmdldCBmaWxlIHdoZW4gYSBuZXdsaW5lIGlzIGVuY291bnRlcmVkLiBUaGUKKyAgICAgKiBvdXRwdXQgdG8gdGhlIGZpbGUgaXMgYnVmZmVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiBmaWxlIHdoaWNoIGlzIHRoaXMgd3JpdGVyJ3MgYnVmZmVyZWQgZGVzdGluYXRpb24uCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGZpbGUncyBuYW1lLiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXRzCisgICAgICogICAgICAgICAgICBjb250ZW50cyBhcmUgcmVtb3ZlZCwgb3RoZXJ3aXNlIGEgbmV3IGZpbGUgaXMgY3JlYXRlZC4KICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIHN1Y2ggYSBmaWxlIG9yIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJzIGR1ZSB0bwotICAgICAqICAgICAgICAgICAgIHRoZSBnaXZlbiBmaWxlIG9wZW5pbmcuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIG9wZW5pbmcgb3IgY3JlYXRpbmcgdGhlIHRhcmdldCBmaWxlLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdCBkZW5pZXMgd3JpdGluZyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB0YXJnZXQgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRXcml0ZXIoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1tb2RpZmllZApAQCAtMTgxLDIyICsyMTMsMjggQEAKICAgICAgICAgLy8gRU5EIGFuZHJvaWQtbW9kaWZpZWQKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByaW50V3JpdGVyIG9uIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBmaWxlIG5hbWUKLSAgICAgKiA8Y29kZT5maWxlTmFtZTwvY29kZT4uIFRoZSBhdXRvbWF0aWMgZmx1c2hpbmcgaXMgc2V0IHRvCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBBbiBpbnRlcm1lZGlhdGUgPGNvZGU+T3V0cHV0U3RyZWFtV3JpdGVyPC9jb2RlPgotICAgICAqIHdpbGwgdXNlIGEgY2hhcnNldCB3aXRoIHRoZSBnaXZlbiBuYW1lIDxjb2RlPmNzbjwvY29kZT4gdG8gZW5jb2RlCi0gICAgICogY2hhcmFjdGVycy4KKyAgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJpbnRXcml0ZXJ9IHdpdGggdGhlIGZpbGUgaWRlbnRpZmllZCBieSB7QGNvZGUKKyAgICAgKiBmaWxlTmFtZX0gYXMgaXRzIHRhcmdldC4gVGhlIGNoYXJhY3RlciBzZXQgbmFtZWQge0Bjb2RlIGNzbn0gaXMgdXNlZCBmb3IKKyAgICAgKiBjaGFyYWN0ZXIgZW5jb2RpbmcuIFRoZSBwcmludCB3cml0ZXIgZG9lcyBub3QgYXV0b21hdGljYWxseSBmbHVzaCBpdHMKKyAgICAgKiBjb250ZW50cyB0byB0aGUgdGFyZ2V0IGZpbGUgd2hlbiBhIG5ld2xpbmUgaXMgZW5jb3VudGVyZWQuIFRoZSBvdXRwdXQgdG8KKyAgICAgKiB0aGUgZmlsZSBpcyBidWZmZXJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIGZpbGUgd2hpY2ggaXMgdGhpcyB3cml0ZXIncyBidWZmZXJlZCBkZXN0aW5hdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSdzIG5hbWUuIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdHMKKyAgICAgKiAgICAgICAgICAgIGNvbnRlbnRzIGFyZSByZW1vdmVkLCBvdGhlcndpc2UgYSBuZXcgZmlsZSBpcyBjcmVhdGVkLgogICAgICAqIEBwYXJhbSBjc24KLSAgICAgKiAgICAgICAgICAgIEEgY2hhcnNldCBuYW1lLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBzZXQgdXNlZCBmb3IgY2hhcmFjdGVyIGVuY29kaW5nLgogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gc3VjaCBhIGZpbGUgb3Igc29tZSBvdGhlciBlcnJvciBvY2N1cnMgZHVlIHRvCi0gICAgICogICAgICAgICAgICAgdGhlIGdpdmVuIGZpbGUgb3BlbmluZy4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgb3BlbmluZyBvciBjcmVhdGluZyB0aGUgdGFyZ2V0IGZpbGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjc259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGVuaWVzIHdyaXRpbmcgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdGFyZ2V0IGZpbGUuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBjaGFyc2V0IHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHtAY29kZSBjc259IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW50V3JpdGVyKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGNzbikKICAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewpAQCAtMjA5LDEyICsyNDcsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgUHJpbnRXcml0ZXIgaGFzCi0gICAgICogZW5jb3VudGVyZWQgYW4gZXJyb3IuIElmIHNvLCB0aGUgcmVjZWl2ZXIgc2hvdWxkIHByb2JhYmx5IGJlIGNsb3NlZCBzaW5jZQotICAgICAqIGZ1cnRoZXIgd3JpdGVzIHdpbGwgbm90IGFjdHVhbGx5IHRha2UgcGxhY2UuIEEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZwotICAgICAqIGNoZWNrRXJyb3IgaXMgdGhhdCB0aGUgdGFyZ2V0IFdyaXRlciBpcyBmbHVzaGVkLgorICAgICAqIEZsdXNoZXMgdGhpcyB3cml0ZXIgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlcnJvciBmbGFnLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiBoYXMgYW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhpcyBQcmludFdyaXRlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBlaXRoZXIgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBoYXMgYmVlbiB0aHJvd24KKyAgICAgKiAgICAgICAgIHByZXZpb3VzbHkgb3IgaWYge0Bjb2RlIHNldEVycm9yKCl9IGhhcyBiZWVuIGNhbGxlZDsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI3NldEVycm9yKCkgICAgICAgICAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0Vycm9yKCkgewogICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKQEAgLTIyNCw5ICsyNjMsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIFByaW50V3JpdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGZsdXNoZXMgYW5kIHRoZW4gY2xvc2VzIHRoZQotICAgICAqIHRhcmdldCB3cml0ZXIuIElmIGFuIGVycm9yIG9jY3Vycywgc2V0IGFuIGVycm9yIGluIHRoaXMgUHJpbnRXcml0ZXIgdG8KLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBDbG9zZXMgdGhpcyBwcmludCB3cml0ZXIuIEZsdXNoZXMgdGhpcyB3cml0ZXIgYW5kIHRoZW4gY2xvc2VzIHRoZSB0YXJnZXQuCisgICAgICogSWYgYW4gSS9PIGVycm9yIG9jY3VycywgdGhpcyB3cml0ZXIncyBlcnJvciBmbGFnIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CkBAIC0yNDMsOSArMjgzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmx1c2ggdGhpcyBQcmludFdyaXRlciB0byBlbnN1cmUgYWxsIHBlbmRpbmcgZGF0YSBpcyBzZW50IG91dCB0byB0aGUKLSAgICAgKiB0YXJnZXQgV3JpdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGZsdXNoZXMgdGhlIHRhcmdldCB3cml0ZXIuIElmIGFuIGVycm9yCi0gICAgICogb2NjdXJzLCBzZXQgYW4gZXJyb3IgaW4gdGhpcyBQcmludFdyaXRlciB0byA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBFbnN1cmVzIHRoYXQgYWxsIHBlbmRpbmcgZGF0YSBpcyBzZW50IG91dCB0byB0aGUgdGFyZ2V0LiBJdCBhbHNvCisgICAgICogZmx1c2hlcyB0aGUgdGFyZ2V0LiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzLCB0aGlzIHdyaXRlcidzIGVycm9yCisgICAgICogc3RhdGUgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKQEAgLTI2Myw1MiArMzA1LDUyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgc3RyaW5nIGZvcm1hdHRlZCBieSBhbiBpbnRlcm1lZGlhdGUgPGNvZGU+Rm9ybWF0dGVyPC9jb2RlPiB0bwotICAgICAqIHRoaXMgd3JpdGVyIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQgc3RyaW5nIGFuZCBhcmd1bWVudHMuIEEgY2FsbCB0byB0aGlzCi0gICAgICogbWV0aG9kIGZsdXNoZXMgdGhlIGJ1ZmZlcmVkIG91dHB1dCwgaWYgdGhlIGF1dG9tYXRpYyBmbHVzaGluZyBpcyBlbmFibGVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZXRob2QgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGN1cnJlbnQgSlZNIGluc3RhbmNlIGxvY2FsZSwgYXMgaWYgaXQKLSAgICAgKiBpcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPkxvY2FsZS5nZXREZWZhdWx0KCk8L2NvZGU+IGNhbGwuCisgICAgICogV3JpdGVzIGEgc3RyaW5nIGZvcm1hdHRlZCBieSBhbiBpbnRlcm1lZGlhdGUge0Bjb2RlIEZvcm1hdHRlcn0gdG8gdGhlCisgICAgICogdGFyZ2V0IHVzaW5nIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZyBhbmQgYXJndW1lbnRzLiBGb3IgdGhlIGxvY2FsZSwKKyAgICAgKiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB2aXJ0dWFsIG1hY2hpbmUgaW5zdGFuY2UgaXMgdXNlZC4gSWYKKyAgICAgKiBhdXRvbWF0aWMgZmx1c2hpbmcgaXMgZW5hYmxlZCB0aGVuIHRoZSBidWZmZXIgaXMgZmx1c2hlZCBhcyB3ZWxsLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiAgICAgICAgICAgIEEgZm9ybWF0IHN0cmluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIHtAbGluayBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdH0uCiAgICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgbGlzdC4gSWYgdGhlcmUgYXJlIG1vcmUgYXJndW1lbnRzIHRoYW4gdGhvc2UKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAgICAgKiAgICAgICAgICAgIGFyZSBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gVGhpcyB3cml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIuIElmIHRoZXJlIGFyZQorICAgICAqICAgICAgICAgICAgbW9yZSBhcmd1bWVudHMgdGhhbiByZXF1aXJlZCBieSB0aGUge0Bjb2RlIGZvcm1hdH0gc3RyaW5nLAorICAgICAqICAgICAgICAgICAgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBpbGxlZ2FsIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgICAqICAgICAgICAgICAgIGFyZ3VtZW50cyBvciB0aGUgYXJndW1lbnRzIGFyZSBsZXNzIHRoYW4gdGhvc2UgcmVxdWlyZWQgYnkKLSAgICAgKiAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyBvciBhbnkgb3RoZXIgaWxsZWdhbCBzaXR1YXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGFyZ3VtZW50cyBvciBpZiBhbnkgb3RoZXIKKyAgICAgKiAgICAgICAgICAgICBlcnJvciByZWdhcmRpbmcgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYXJndW1lbnRzIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZ2l2ZW4gZm9ybWF0IGlzIG51bGwuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGZvcm1hdH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFdyaXRlciBmb3JtYXQoU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKICAgICAgICAgcmV0dXJuIGZvcm1hdChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBmb3JtYXQsIGFyZ3MpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0cmluZyBmb3JtYXR0ZWQgYnkgYW4gaW50ZXJtZWRpYXRlIDxjb2RlPkZvcm1hdHRlcjwvY29kZT4gdG8KLSAgICAgKiB0aGlzIHdyaXRlciB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZyBhbmQgYXJndW1lbnRzLiBBIGNhbGwgdG8gdGhpcwotICAgICAqIG1ldGhvZCBmbHVzaGVzIHRoZSBidWZmZXJlZCBvdXRwdXQsIGlmIHRoZSBhdXRvbWF0aWMgZmx1c2hpbmcgaXMgZW5hYmxlZC4KKyAgICAgKiBXcml0ZXMgYSBzdHJpbmcgZm9ybWF0dGVkIGJ5IGFuIGludGVybWVkaWF0ZSB7QGNvZGUgRm9ybWF0dGVyfSB0byB0aGUKKyAgICAgKiB0YXJnZXQgdXNpbmcgdGhlIHNwZWNpZmllZCBsb2NhbGUsIGZvcm1hdCBzdHJpbmcgYW5kIGFyZ3VtZW50cy4gSWYKKyAgICAgKiBhdXRvbWF0aWMgZmx1c2hpbmcgaXMgZW5hYmxlZCB0aGVuIHRoaXMgd3JpdGVyIGlzIGZsdXNoZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgdXNlZCBpbiB0aGUgbWV0aG9kLiBJZiBsb2NhbGUgaXMgbnVsbCwgdGhlbiBubwotICAgICAqICAgICAgICAgICAgbG9jYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUgdXNlZCBpbiB0aGUgbWV0aG9kLiBObyBsb2NhbGl6YXRpb24gd2lsbCBiZSBhcHBsaWVkCisgICAgICogICAgICAgICAgICBpZiB7QGNvZGUgbH0gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiAgICAgICAgICAgIEEgZm9ybWF0IHN0cmluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIHtAbGluayBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdH0uCiAgICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgbGlzdC4gSWYgdGhlcmUgYXJlIG1vcmUgYXJndW1lbnRzIHRoYW4gdGhvc2UKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAgICAgKiAgICAgICAgICAgIGFyZSBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gVGhpcyB3cml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIuIElmIHRoZXJlIGFyZQorICAgICAqICAgICAgICAgICAgbW9yZSBhcmd1bWVudHMgdGhhbiByZXF1aXJlZCBieSB0aGUge0Bjb2RlIGZvcm1hdH0gc3RyaW5nLAorICAgICAqICAgICAgICAgICAgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBpbGxlZ2FsIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgICAqICAgICAgICAgICAgIGFyZ3VtZW50cyBvciB0aGUgYXJndW1lbnRzIGFyZSBsZXNzIHRoYW4gdGhvc2UgcmVxdWlyZWQgYnkKLSAgICAgKiAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyBvciBhbnkgb3RoZXIgaWxsZWdhbCBzaXR1YXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGFyZ3VtZW50cyBvciBpZiBhbnkgb3RoZXIKKyAgICAgKiAgICAgICAgICAgICBlcnJvciByZWdhcmRpbmcgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYXJndW1lbnRzIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZ2l2ZW4gZm9ybWF0IGlzIG51bGwuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGZvcm1hdH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFdyaXRlciBmb3JtYXQoTG9jYWxlIGwsIFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgewpAQCAtMzIzLDI1ICszNjUsMjMgQEAKIAogICAgIC8qKgogICAgICAqIFByaW50cyBhIGZvcm1hdHRlZCBzdHJpbmcuIFRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0aGUgc2FtZSBhcwotICAgICAqIHRoaXMgd3JpdGVyJ3MgPGNvZGU+Zm9ybWF0KFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKTwvY29kZT4KLSAgICAgKiBtZXRob2QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgY3VycmVudCBKVk0gaW5zdGFuY2UgbG9jYWxlLCBhcyBpZiBpdAotICAgICAqIGlzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+TG9jYWxlLmdldERlZmF1bHQoKTwvY29kZT4gY2FsbC4KKyAgICAgKiB0aGlzIHdyaXRlcidzIHtAY29kZSAjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKX0gbWV0aG9kLiBGb3IgdGhlIGxvY2FsZSwKKyAgICAgKiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB2aXJ0dWFsIG1hY2hpbmUgaW5zdGFuY2UgaXMgdXNlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICBBIGZvcm1hdCBzdHJpbmcuCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciB7QGxpbmsgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXR9LgogICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogICAgICAgICAgICBUaGUgYXJndW1lbnRzIGxpc3QuIElmIHRoZXJlIGFyZSBtb3JlIGFyZ3VtZW50cyB0aGFuIHRob3NlCi0gICAgICogICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcsIHRoZW4gdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gICAgICogICAgICAgICAgICBhcmUgaWdub3JlZC4KLSAgICAgKiBAcmV0dXJuIFRoaXMgd3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZm9ybWF0dGVyLiBJZiB0aGVyZSBhcmUKKyAgICAgKiAgICAgICAgICAgIG1vcmUgYXJndW1lbnRzIHRoYW4gcmVxdWlyZWQgYnkgdGhlIHtAY29kZSBmb3JtYXR9IHN0cmluZywKKyAgICAgKiAgICAgICAgICAgIHRoZW4gdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCiAgICAgICogQHRocm93cyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMgb3IgdGhlIGFyZ3VtZW50cyBhcmUgbGVzcyB0aGFuIHRob3NlIHJlcXVpcmVkIGJ5Ci0gICAgICogICAgICAgICAgICAgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYW55IG90aGVyIGlsbGVnYWwgc2l0dWF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGlsbGVnYWwgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgYXJndW1lbnRzLCBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCBhcmd1bWVudHMgb3IgaWYgYW55IG90aGVyCisgICAgICogICAgICAgICAgICAgZXJyb3IgcmVnYXJkaW5nIHRoZSBmb3JtYXQgc3RyaW5nIG9yIGFyZ3VtZW50cyBpcyBkZXRlY3RlZC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGdpdmVuIGZvcm1hdCBpcyBudWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBmb3JtYXR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRXcml0ZXIgcHJpbnRmKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIHJldHVybiBmb3JtYXQoZm9ybWF0LCBhcmdzKTsKQEAgLTM0OSwyNSArMzg5LDI1IEBACiAKICAgICAvKioKICAgICAgKiBQcmludHMgYSBmb3JtYXR0ZWQgc3RyaW5nLiBUaGUgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMKLSAgICAgKiB0aGlzIHdyaXRlcidzCi0gICAgICogPGNvZGU+Zm9ybWF0KExvY2FsZSBsLCBTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncyk8L2NvZGU+IG1ldGhvZC4KKyAgICAgKiB0aGlzIHdyaXRlcidzIHtAY29kZSAjZm9ybWF0KExvY2FsZSwgU3RyaW5nLCBPYmplY3QuLi4pfSBtZXRob2QuCiAgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgdXNlZCBpbiB0aGUgbWV0aG9kLiBJZiBsb2NhbGUgaXMgbnVsbCwgdGhlbiBubwotICAgICAqICAgICAgICAgICAgbG9jYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUgdXNlZCBpbiB0aGUgbWV0aG9kLiBObyBsb2NhbGl6YXRpb24gd2lsbCBiZSBhcHBsaWVkCisgICAgICogICAgICAgICAgICBpZiB7QGNvZGUgbH0gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiAgICAgICAgICAgIEEgZm9ybWF0IHN0cmluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIHtAbGluayBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdH0uCiAgICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgbGlzdC4gSWYgdGhlcmUgYXJlIG1vcmUgYXJndW1lbnRzIHRoYW4gdGhvc2UKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAgICAgKiAgICAgICAgICAgIGFyZSBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gVGhpcyB3cml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIuIElmIHRoZXJlIGFyZQorICAgICAqICAgICAgICAgICAgbW9yZSBhcmd1bWVudHMgdGhhbiByZXF1aXJlZCBieSB0aGUge0Bjb2RlIGZvcm1hdH0gc3RyaW5nLAorICAgICAqICAgICAgICAgICAgdGhlbiB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBpbGxlZ2FsIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgICAqICAgICAgICAgICAgIGFyZ3VtZW50cyBvciB0aGUgYXJndW1lbnRzIGFyZSBsZXNzIHRoYW4gdGhvc2UgcmVxdWlyZWQgYnkKLSAgICAgKiAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyBvciBhbnkgb3RoZXIgaWxsZWdhbCBzaXR1YXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGFyZ3VtZW50cyBvciBpZiBhbnkgb3RoZXIKKyAgICAgKiAgICAgICAgICAgICBlcnJvciByZWdhcmRpbmcgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYXJndW1lbnRzIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZ2l2ZW4gZm9ybWF0IGlzIG51bGwuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGZvcm1hdH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFdyaXRlciBwcmludGYoTG9jYWxlIGwsIFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIHJldHVybiBmb3JtYXQobCwgZm9ybWF0LCBhcmdzKTsKQEAgLTM4NCwxMDcgKzQyNCwxMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGFycmF5IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmNoYXJBcnJheTwvY29kZT4gdG8gdGhlIHRhcmdldCBXcml0ZXIuCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiB0byB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaGFyQXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gcHJpbnQgb24gdGhpcyBXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIHByaW50IHRvIHRoZSB0YXJnZXQuCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXJbXSBjaGFyQXJyYXkpIHsKICAgICAgICAgcHJpbnQobmV3IFN0cmluZyhjaGFyQXJyYXksIDAsIGNoYXJBcnJheS5sZW5ndGgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmNoPC9jb2RlPiB0byB0aGUgdGFyZ2V0IFdyaXRlci4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byB0aGUKKyAgICAgKiB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIHByaW50IG9uIHRoaXMgV3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBwcmludCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIGNoKSB7CiAgICAgICAgIHByaW50KFN0cmluZy52YWx1ZU9mKGNoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gcGFyYW1ldGVyCi0gICAgICogPGNvZGU+ZG51bTwvY29kZT4gdG8gdGhlIHRhcmdldCBXcml0ZXIuCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBkb3VibGUgdG8gdGhlIHRhcmdldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZG51bQotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdG8gcHJpbnQgb24gdGhpcyBXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQuCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KGRvdWJsZSBkbnVtKSB7CiAgICAgICAgIHByaW50KFN0cmluZy52YWx1ZU9mKGRudW0pKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmZudW08L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyLgorICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmbG9hdCB0byB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmbnVtCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHRvIHByaW50IG9uIHRoaXMgV3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQuCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KGZsb2F0IGZudW0pIHsKICAgICAgICAgcHJpbnQoU3RyaW5nLnZhbHVlT2YoZm51bSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmludW08L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyLgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0byB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbnVtCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+aW50PC9jb2RlPiB0byBwcmludCBvbiB0aGlzIFdyaXRlci4KLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQuCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgIAogICAgIHB1YmxpYyB2b2lkIHByaW50KGludCBpbnVtKSB7CiAgICAgICAgIHByaW50KFN0cmluZy52YWx1ZU9mKGludW0pKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+bG9uZzwvY29kZT4gcGFyYW1ldGVyCi0gICAgICogPGNvZGU+bG51bTwvY29kZT4gdG8gdGhlIHRhcmdldCBXcml0ZXIuCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBsb25nIHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxudW0KLSAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5sb25nPC9jb2RlPiB0byBwcmludCBvbiB0aGlzIFdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQuCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KGxvbmcgbG51bSkgewogICAgICAgICBwcmludChTdHJpbmcudmFsdWVPZihsbnVtKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE9iamVjdCBwYXJhbWV0ZXIgPGNvZGU+b2JqPC9jb2RlPgotICAgICAqIHRvIHRoZSB0YXJnZXQgV3JpdGVyLgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBwcmludCBvbiB0aGlzIFdyaXRlci4KLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcHJpbnQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovICAgCiAgICAgcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgewogICAgICAgICBwcmludChTdHJpbmcudmFsdWVPZihvYmopKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHI8L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyLgorICAgICAqIFByaW50cyBhIHN0cmluZyB0byB0aGUgdGFyZ2V0LiBUaGUgc3RyaW5nIGlzIGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZgorICAgICAqIGJ5dGVzIHVzaW5nIHRoZSBlbmNvZGluZyBjaG9zZW4gZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcyB3cml0ZXIuCisgICAgICogVGhlIGJ5dGVzIGFyZSB0aGVuIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCB3aXRoIHtAY29kZSB3cml0ZShpbnQpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzLCB0aGlzIHdyaXRlcidzIGVycm9yIGZsYWcgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gcHJpbnQgb24gdGhpcyBXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSB0YXJnZXQuCisgICAgICogQHNlZSAjd3JpdGUoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzdHIpIHsKICAgICAgICAgd3JpdGUoc3RyICE9IG51bGwgPyBzdHIgOiBTdHJpbmcudmFsdWVPZigoT2JqZWN0KSBudWxsKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmJvb2w8L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyLgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBib29sCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdG8gcHJpbnQgb24gdGhpcyBXcml0ZXIuCi0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byBwcmludCB0aGUgdGFyZ2V0LgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludChib29sZWFuIGJvb2wpIHsKICAgICAgICAgcHJpbnQoU3RyaW5nLnZhbHVlT2YoYm9vbCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTeXN0ZW0gcHJvcGVydHkKLSAgICAgKiA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPiB0byB0aGUgdGFyZ2V0IFdyaXRlci4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3lzdGVtIHByb3BlcnR5IHtAY29kZQorICAgICAqICJsaW5lLnNlcGFyYXRvciJ9IHRvIHRoZSB0YXJnZXQuIEZsdXNoZXMgdGhpcyB3cml0ZXIgaWYgdGhlIGF1dG9mbHVzaAorICAgICAqIGZsYWcgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKQEAgLTQ5Myw5NiArNTUyLDExNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYXJyYXkgcGFyYW1ldGVyCi0gICAgICogPGNvZGU+Y2hhckFycmF5PC9jb2RlPiB0byB0aGUgdGFyZ2V0IFdyaXRlciBmb2xsb3dlZCBieSB0aGUgU3lzdGVtCi0gICAgICogcHJvcGVydHkgPGNvZGU+ImxpbmUuc2VwYXJhdG9yIjwvY29kZT4uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiBmb2xsb3dlZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5IHtAY29kZSAibGluZS5zZXBhcmF0b3IifSB0byB0aGUgdGFyZ2V0LgorICAgICAqIEZsdXNoZXMgdGhpcyB3cml0ZXIgaWYgdGhlIGF1dG9mbHVzaCBmbGFnIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYXJBcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBhcnJheSB0byBwcmludCBvbiB0aGlzIFdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gcHJpbnQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyW10gY2hhckFycmF5KSB7CiAgICAgICAgIHByaW50bG4obmV3IFN0cmluZyhjaGFyQXJyYXksIDAsIGNoYXJBcnJheS5sZW5ndGgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmNoPC9jb2RlPiB0byB0aGUgdGFyZ2V0IFdyaXRlciBmb2xsb3dlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5Ci0gICAgICogPGNvZGU+ImxpbmUuc2VwYXJhdG9yIjwvY29kZT4uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkKKyAgICAgKiB0aGUgc3lzdGVtIHByb3BlcnR5IHtAY29kZSAibGluZS5zZXBhcmF0b3IifSB0byB0aGUgdGFyZ2V0LiBGbHVzaGVzIHRoaXMKKyAgICAgKiB3cml0ZXIgaWYgdGhlIGF1dG9mbHVzaCBmbGFnIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIHByaW50IG9uIHRoaXMgV3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBwcmludCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgY2gpIHsKICAgICAgICAgcHJpbnRsbihTdHJpbmcudmFsdWVPZihjaCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5kb3VibGU8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmRudW08L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkKLSAgICAgKiA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGRvdWJsZSBmb2xsb3dlZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gcHJvcGVydHkge0Bjb2RlICJsaW5lLnNlcGFyYXRvciJ9IHRvIHRoZSB0YXJnZXQuIEZsdXNoZXMgdGhpcworICAgICAqIHdyaXRlciBpZiB0aGUgYXV0b2ZsdXNoIGZsYWcgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZG51bQotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBwcmludCBvbiB0aGlzIFdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdmFsdWUgdG8gcHJpbnQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRsbihkb3VibGUgZG51bSkgewogICAgICAgICBwcmludGxuKFN0cmluZy52YWx1ZU9mKGRudW0pKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmZudW08L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkKLSAgICAgKiA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZsb2F0IGZvbGxvd2VkIGJ5IHRoZQorICAgICAqIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgImxpbmUuc2VwYXJhdG9yIn0gdG8gdGhlIHRhcmdldC4gRmx1c2hlcyB0aGlzCisgICAgICogd3JpdGVyIGlmIHRoZSBhdXRvZmx1c2ggZmxhZyBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmbnVtCi0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdG8gcHJpbnQgb24gdGhpcyBXcml0ZXIuCi0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdmFsdWUgdG8gcHJpbnQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAc2VlICNwcmludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovICAgCiAgICAgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCBmbnVtKSB7CiAgICAgICAgIHByaW50bG4oU3RyaW5nLnZhbHVlT2YoZm51bSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmludW08L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkKLSAgICAgKiA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgZm9sbG93ZWQgYnkgdGhlCisgICAgICogc3lzdGVtIHByb3BlcnR5IHtAY29kZSAibGluZS5zZXBhcmF0b3IifSB0byB0aGUgdGFyZ2V0LiBGbHVzaGVzIHRoaXMKKyAgICAgKiB3cml0ZXIgaWYgdGhlIGF1dG9mbHVzaCBmbGFnIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGludW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gcHJpbnQgb24gdGhpcyBXcml0ZXIuCi0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZSB0byBwcmludCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludGxuKGludCBpbnVtKSB7CiAgICAgICAgIHByaW50bG4oU3RyaW5nLnZhbHVlT2YoaW51bSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5sb25nPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5sbnVtPC9jb2RlPiB0byB0aGUgdGFyZ2V0IFdyaXRlciBmb2xsb3dlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5Ci0gICAgICogPGNvZGU+ImxpbmUuc2VwYXJhdG9yIjwvY29kZT4uCisgICAgICogUHJpbnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBsb25nIGZvbGxvd2VkIGJ5IHRoZQorICAgICAqIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgImxpbmUuc2VwYXJhdG9yIn0gdG8gdGhlIHRhcmdldC4gRmx1c2hlcyB0aGlzCisgICAgICogd3JpdGVyIGlmIHRoZSBhdXRvZmx1c2ggZmxhZyBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsbnVtCi0gICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBwcmludCBvbiB0aGlzIFdyaXRlci4KLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIHRvIHByaW50IHRvIHRoZSB0YXJnZXQuCisgICAgICogQHNlZSAjcHJpbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgIAogICAgIHB1YmxpYyB2b2lkIHByaW50bG4obG9uZyBsbnVtKSB7CiAgICAgICAgIHByaW50bG4oU3RyaW5nLnZhbHVlT2YobG51bSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIDxjb2RlPm9iajwvY29kZT4gdG8gdGhlIHRhcmdldCBXcml0ZXIgZm9sbG93ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eQotICAgICAqIDxjb2RlPiJsaW5lLnNlcGFyYXRvciI8L2NvZGU+LgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZvbGxvd2VkIGJ5IHRoZQorICAgICAqIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgImxpbmUuc2VwYXJhdG9yIn0gdG8gdGhlIHRhcmdldC4gRmx1c2hlcyB0aGlzCisgICAgICogd3JpdGVyIGlmIHRoZSBhdXRvZmx1c2ggZmxhZyBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIHByaW50IG9uIHRoaXMgV3JpdGVyLgotICAgICAqLworICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBwcmludCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludGxuKE9iamVjdCBvYmopIHsKICAgICAgICAgcHJpbnRsbihTdHJpbmcudmFsdWVPZihvYmopKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHI8L2NvZGU+IHRvIHRoZSB0YXJnZXQgV3JpdGVyIGZvbGxvd2VkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkKLSAgICAgKiA8Y29kZT4ibGluZS5zZXBhcmF0b3IiPC9jb2RlPi4KKyAgICAgKiBQcmludHMgYSBzdHJpbmcgZm9sbG93ZWQgYnkgdGhlIHN5c3RlbSBwcm9wZXJ0eSB7QGNvZGUgImxpbmUuc2VwYXJhdG9yIn0KKyAgICAgKiB0byB0aGUgdGFyZ2V0LiBUaGUgc3RyaW5nIGlzIGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiBieXRlcyB1c2luZyB0aGUKKyAgICAgKiBlbmNvZGluZyBjaG9zZW4gZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcyB3cml0ZXIuIFRoZSBieXRlcyBhcmUKKyAgICAgKiB0aGVuIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCB3aXRoIHtAY29kZSB3cml0ZShpbnQpfS4gRmluYWxseSwgdGhpcyB3cml0ZXIKKyAgICAgKiBpcyBmbHVzaGVkIGlmIHRoZSBhdXRvZmx1c2ggZmxhZyBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqIDxwPgorICAgICAqIElmIGFuIEkvTyBlcnJvciBvY2N1cnMsIHRoaXMgd3JpdGVyJ3MgZXJyb3IgZmxhZyBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBwcmludCBvbiB0aGlzIFdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAc2VlICN3cml0ZShpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRsbihTdHJpbmcgc3RyKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtNTkyLDIwICs2NzIsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gcGFyYW1ldGVyCi0gICAgICogPGNvZGU+Ym9vbDwvY29kZT4gdG8gdGhlIHRhcmdldCBXcml0ZXIgZm9sbG93ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eQotICAgICAqIDxjb2RlPiJsaW5lLnNlcGFyYXRvciI8L2NvZGU+LgorICAgICAqIFByaW50cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiBmb2xsb3dlZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gcHJvcGVydHkge0Bjb2RlICJsaW5lLnNlcGFyYXRvciJ9IHRvIHRoZSB0YXJnZXQuIEZsdXNoZXMgdGhpcworICAgICAqIHdyaXRlciBpZiB0aGUgYXV0b2ZsdXNoIGZsYWcgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYm9vbAotICAgICAqICAgICAgICAgICAgdGhlIGJvb2xlYW4gdG8gcHJpbnQgb24gdGhpcyBXcml0ZXIuCi0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byBwcmludCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEBzZWUgI3ByaW50KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAKICAgICBwdWJsaWMgdm9pZCBwcmludGxuKGJvb2xlYW4gYm9vbCkgewogICAgICAgICBwcmludGxuKFN0cmluZy52YWx1ZU9mKGJvb2wpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoaXMgUHJpbnRXcml0ZXIgaGFzIGVuY291bnRlcmVkIGFuIElPCi0gICAgICogZXJyb3IuCisgICAgICogU2V0cyB0aGUgZXJyb3IgZmxhZyBvZiB0aGlzIHdyaXRlciB0byB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3IoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtNjE0LDQ1ICs2OTcsNjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGVudGlyZSBjaGFyYWN0ZXIgYnVmZmVyIGJ1ZiB0byB0aGlzIFdyaXRlci4KKyAgICAgKiBXcml0ZXMgdGhlIGNoYXJhY3RlciBidWZmZXIge0Bjb2RlIGJ1Zn0gdG8gdGhlIHRhcmdldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmCiAgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgYXJyYXkgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIHdyaXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10pIHsKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gYnVmKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPgotICAgICAqIGluIDxjb2RlPmJ1Zjxjb2RlPgotICAgICAqIHRvIHRoaXMgV3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZiB0aGUgbm9uLW51bGwgYXJyYXkgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIHdyaXRlLgotICAgICAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IGluIGJ1ZiB0byByZXRyaWV2ZSBjaGFyYWN0ZXJzCi0gICAgICogQHBhcmFtIGNvdW50IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICAgICBJZiBvZmZzZXQgb3IgY291bnQgYXJlIG91dHNpZGUgb2YgYm91bmRzLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgZnJvbSB7QGNvZGUgYnVmZmVyfSBzdGFydGluZyBhdCB7QGNvZGUKKyAgICAgKiBvZmZzZXR9IHRvIHRoZSB0YXJnZXQuCisgICAgICogPHA+CisgICAgICogVGhpcyB3cml0ZXIncyBlcnJvciBmbGFnIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB3cml0ZXIgaXMgY2xvc2VkCisgICAgICogb3IgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byB3cml0ZSB0byB0aGUgdGFyZ2V0LgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgorICAgICAqIEBwYXJhbSBjb3VudAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXQgKyBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIGJ1Zn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBidWZbXSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB7CisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGNvdW50KSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgZG9Xcml0ZShidWYsIG9mZnNldCwgY291bnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byB0aGlzIFdyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMKLSAgICAgKiB0aGUgbG93IG9yZGVyIHR3byBieXRlcyB0byB0aGUgdGFyZ2V0IHdyaXRlci4KKyAgICAgKiBXcml0ZXMgb25lIGNoYXJhY3RlciB0byB0aGUgdGFyZ2V0LiBPbmx5IHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMKKyAgICAgKiBvZiB0aGUgaW50ZWdlciB7QGNvZGUgb25lQ2hhcn0gYXJlIHdyaXR0ZW4uCisgICAgICogPHA+CisgICAgICogVGhpcyB3cml0ZXIncyBlcnJvciBmbGFnIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB3cml0ZXIgaXMgY2xvc2VkCisgICAgICogb3IgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIG9uZUNoYXIKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gd3JpdGUgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgb25lQ2hhcikgewogICAgICAgICBkb1dyaXRlKG5ldyBjaGFyW10geyAoY2hhcikgb25lQ2hhciB9LCAwLCAxKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgZG9Xcml0ZShjaGFyIGJ1ZltdLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHsKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgZG9Xcml0ZShjaGFyW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC02NjcsMTAgKzc3MywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBTdHJpbmcgPGNvZGU+c3RyPC9jb2RlPiB0byB0aGlzIFdyaXRlci4KKyAgICAgKiBXcml0ZXMgdGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBTdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyB0byB3cml0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBzdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyB0byB3cml0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyKSB7CkBAIC02NzgsMTggKzc4NSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gY2hhcmFjdGVycyBmcm9tIHRoZSBTdHJpbmcgPGNvZGU+c3RyPC9jb2RlPgotICAgICAqIHN0YXJ0aW5nIGF0IDxjb2RlPm9mZnNldDwvY29kZT4gdG8gdGhpcyBXcml0ZXIuCisgICAgICogV3JpdGVzIHtAY29kZSBjb3VudH0gY2hhcmFjdGVycyBmcm9tIHtAY29kZSBzdHJ9IHN0YXJ0aW5nIGF0IHtAY29kZQorICAgICAqIG9mZnNldH0gdG8gdGhlIHRhcmdldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgd2hlcmUgaW4gPGNvZGU+c3RyPC9jb2RlPiB0byBnZXQgY2hhcnMgZnJvbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHtAY29kZSBzdHJ9IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgaG93IG1hbnkgY2hhcmFjdGVycyB0byB3cml0ZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIG9mZnNldCBvciBjb3VudCBhcmUgb3V0c2lkZSBvZiBib3VuZHMuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB7QGNvZGUgc3RyfSB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGNvdW50IDwgMH0sIG9yIGlmIHtAY29kZQorICAgICAqICAgICAgICAgICAgIG9mZnNldCArIGNvdW50fSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB7QGNvZGUgc3RyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHsKQEAgLTY5NywxMyArODA1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kIGEgY2hhciA8Y29kZT5jPC9jb2RlPnRvIHRoZSBQcmludFdyaXRlci4gVGhlCi0gICAgICogUHJpbnRXcml0ZXIuYXBwZW5kKDxjb2RlPmM8L2NvZGU+KSB3b3JrcyB0aGUgc2FtZSB3YXkgYXMKLSAgICAgKiBQcmludFdyaXRlci53cml0ZSg8Y29kZT5jPC9jb2RlPikuCisgICAgICogQXBwZW5kcyB0aGUgY2hhcmFjdGVyIHtAY29kZSBjfSB0byB0aGUgdGFyZ2V0LiAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBhcHBlbmRlZCB0byB0aGUgUHJpbnRXcml0ZXIuCi0gICAgICogQHJldHVybiBUaGUgUHJpbnRXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGFwcGVuZCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFByaW50V3JpdGVyIGFwcGVuZChjaGFyIGMpIHsKQEAgLTcxMiwxNCArODE5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kIGEgQ2hhclNlcXVlbmNlIDxjb2RlPmNzcTwvY29kZT4gdG8gdGhlIFByaW50V3JpdGVyLiBUaGUKLSAgICAgKiBQcmludFdyaXRlci5hcHBlbmQoPGNvZGU+Y3NxPC9jb2RlPikgd29ya3MgdGhlIHNhbWUgd2F5IGFzCi0gICAgICogUHJpbnRXcml0ZXIud3JpdGUoPGNvZGU+Y3NxPC9jb2RlPi50b1N0cmluZygpKS4gSWYgPGNvZGU+Y3NxPC9jb2RlPgotICAgICAqIGlzIG51bGwsIHRoZW4gIm51bGwiIHdpbGwgYmUgc3Vic3RpdHV0ZWQgZm9yIDxjb2RlPmNzcTwvY29kZT4KKyAgICAgKiBBcHBlbmRzIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Uge0Bjb2RlIGNzcX0gdG8gdGhlIHRhcmdldC4gVGhpcworICAgICAqIG1ldGhvZCB3b3JrcyB0aGUgc2FtZSB3YXkgYXMge0Bjb2RlIFByaW50V3JpdGVyLnByaW50KGNzcS50b1N0cmluZygpKX0uCisgICAgICogSWYge0Bjb2RlIGNzcX0gaXMge0Bjb2RlIG51bGx9LCB0aGVuIHRoZSBzdHJpbmcgIm51bGwiIGlzIHdyaXR0ZW4KKyAgICAgKiB0byB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjc3EKLSAgICAgKiAgICAgICAgICAgIFRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIFByaW50V3JpdGVyLgotICAgICAqIEByZXR1cm4gVGhlIFByaW50V3JpdGVyCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGFwcGVuZGVkIHRvIHRoZSB0YXJnZXQuCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUHJpbnRXcml0ZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBjc3EpIHsKQEAgLTczMiwyNiArODQwLDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kIGEgc3Vic2VxdWVuY2Ugb2YgYSBDaGFyU2VxdWVuY2UgPGNvZGU+Y3NxPC9jb2RlPiB0byB0aGUKLSAgICAgKiBQcmludFdyaXRlci4gVGhlIGZpcnN0IGNoYXIgYW5kIHRoZSBsYXN0IGNoYXIgb2YgdGhlIHN1YnNlcXVlbmNlIGlzCi0gICAgICogc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IGFuZCA8Y29kZT5lbmQ8L2NvZGU+LgotICAgICAqIFRoZSBQcmludFdyaXRlci5hcHBlbmQoPGNvZGU+Y3NxPC9jb2RlPikgd29ya3MgdGhlIHNhbWUgd2F5IGFzCi0gICAgICogUHJpbnRXcml0ZXIud3JpdGUoPGNvZGU+Y3NxPC9jb2RlPi5zdWJTZXF1ZW5jZSg8Y29kZT5zdGFydDwvY29kZT4sPGNvZGU+ZW5kPC9jb2RlPikudG9TdHJpbmcpLklmCi0gICAgICogPGNvZGU+Y3NxPC9jb2RlPiBpcyBudWxsLCB0aGVuICJudWxsIiB3aWxsIGJlIHN1YnN0aXR1dGVkIGZvcgotICAgICAqIDxjb2RlPmNzcTwvY29kZT4uCisgICAgICogQXBwZW5kcyBhIHN1YnNlcXVlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Uge0Bjb2RlIGNzcX0gdG8gdGhlCisgICAgICogdGFyZ2V0LiBUaGlzIG1ldGhvZCB3b3JrcyB0aGUgc2FtZSB3YXkgYXMge0Bjb2RlCisgICAgICogUHJpbnRXcml0ZXIucHJpbnQoY3NxLnN1YnNlcXVlbmNlKHN0YXJ0LCBlbmQpLnRvU3RyaW5nKCkpfS4gSWYge0Bjb2RlCisgICAgICogY3NxfSBpcyB7QGNvZGUgbnVsbH0sIHRoZW4gdGhlIHNwZWNpZmllZCBzdWJzZXF1ZW5jZSBvZiB0aGUgc3RyaW5nICJudWxsIgorICAgICAqIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjc3EKLSAgICAgKiAgICAgICAgICAgIFRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIFByaW50V3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgdGFyZ2V0LgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyIGluIHRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHRoZSBQcmludFdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhciBpbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGFwcGVuZGVkCisgICAgICogICAgICAgICAgICB0byB0aGUgdGFyZ2V0LgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhciBhZnRlciB0aGUgbGFzdCBvbmUgaW4gdGhlIENoYXJTZXF1ZW5jZQotICAgICAqICAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIFByaW50V3JpdGVyLgotICAgICAqIEByZXR1cm4gVGhlIFByaW50V3JpdGVyLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHN0YXJ0IGlzIGxlc3MgdGhhbiBlbmQsIGVuZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgotICAgICAqICAgICAgICAgICAgIHRoZSBDaGFyU2VxdWVuY2UsIG9yIHN0YXJ0IG9yIGVuZCBpcyBuZWdhdGl2ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBzdWJzZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0ID4gZW5kfSwge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBlbmQgPCAwfSBvcgorICAgICAqICAgICAgICAgICAgIGVpdGhlciB7QGNvZGUgc3RhcnR9IG9yIHtAY29kZSBlbmR9IGFyZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHtAY29kZSBjc3F9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQcmludFdyaXRlciBhcHBlbmQoQ2hhclNlcXVlbmNlIGNzcSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QdXNoYmFja0lucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QdXNoYmFja0lucHV0U3RyZWFtLmphdmEKaW5kZXggY2MxMTlmMy4uZTk4YzVkYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUHVzaGJhY2tJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1B1c2hiYWNrSW5wdXRTdHJlYW0uamF2YQpAQCAtMjAsMzEgKzIwLDM5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogUHVzaGJhY2tJbnB1dFN0cmVhbSBpcyBhIGZpbHRlciBjbGFzcyB3aGljaCBhbGxvd3MgYnl0ZXMgcmVhZCB0byBiZSBwdXNoZWQKLSAqIGJhY2sgaW50byB0aGUgc3RyZWFtIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVyZWFkLiBQYXJzZXJzIG1heSBmaW5kIHRoaXMKLSAqIHVzZWZ1bC4gVGhlcmUgaXMgYSBwcm9nYW1tYWJsZSBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG1heSBiZQotICogcHVzaGVkIGJhY2suIElmIHRoZSBidWZmZXIgb2YgcHVzaGVkIGJhY2sgYnl0ZXMgaXMgZW1wdHksIGJ5dGVzIGFyZSByZWFkIGZyb20KLSAqIHRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtLgorICogV3JhcHMgYW4gZXhpc3Rpbmcge0BsaW5rIElucHV0U3RyZWFtfSBhbmQgYWRkcyBmdW5jdGlvbmFsaXR5IHRvICJwdXNoIGJhY2siCisgKiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZWFkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlYWQgYWdhaW4uIFBhcnNlcnMgbWF5IGZpbmQKKyAqIHRoaXMgdXNlZnVsLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG1heSBiZSBwdXNoZWQgYmFjayBjYW4gYmUgc3BlY2lmaWVkCisgKiBkdXJpbmcgY29uc3RydWN0aW9uLiBJZiB0aGUgYnVmZmVyIG9mIHB1c2hlZCBiYWNrIGJ5dGVzIGlzIGVtcHR5LCBieXRlcyBhcmUKKyAqIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUHVzaGJhY2tJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKICAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Ynl0ZTwvY29kZT4gYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBUaGUgYnVmZmVyIHRoYXQgY29udGFpbnMgcHVzaGVkLWJhY2sgYnl0ZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWY7CiAKICAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmPC9jb2RlPi4gQSB2YWx1ZQotICAgICAqIGVxdWFsIHRvIGJ1Zi5sZW5ndGggaW5kaWNhdGVzIG5vIGJ5dGVzIGF2YWlsYWJsZS4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcwotICAgICAqIHRoZSBidWZmZXIgaXMgZnVsbC4KKyAgICAgKiBUaGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4ge0Bjb2RlIGJ1Zn0uIEEgdmFsdWUgZXF1YWwgdG8KKyAgICAgKiB7QGNvZGUgYnVmLmxlbmd0aH0gaW5kaWNhdGVzIHRoYXQgbm8gYnl0ZXMgYXJlIGF2YWlsYWJsZS4gQSB2YWx1ZSBvZiAwCisgICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBpcyBmdWxsLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgcG9zOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQdXNoYmFja0lucHV0U3RyZWFtIG9uIHRoZSBJbnB1dFN0cmVhbSA8Y29kZT5pbjwvY29kZT4uCi0gICAgICogVGhlIHNpemUgb2YgdGhlIHB1c2hiYWNrIGJ1ZmZlciBpcyBzZXQgdG8gdGhlIGRlZmF1bHQsIG9yIDEgYnl0ZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBQdXNoYmFja0lucHV0U3RyZWFtfSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5wdXQKKyAgICAgKiBzdHJlYW0gYXMgc291cmNlLiBUaGUgc2l6ZSBvZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGlzIHNldCB0byB0aGUgZGVmYXVsdAorICAgICAqIHZhbHVlIG9mIDEgYnl0ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB0byBhbGxvdyBwdXNoYmFjayBvcGVyYXRpb25zIG9uLgorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFB1c2hiYWNrSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKICAgICAgICAgc3VwZXIoaW4pOwpAQCAtNTMsMTMgKzYxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBQdXNoYmFja0lucHV0U3RyZWFtIG9uIHRoZSBJbnB1dFN0cmVhbSA8Y29kZT5pbjwvY29kZT4uCi0gICAgICogVGhlIHNpemUgb2YgdGhlIHB1c2hiYWNrIGJ1ZmZlciBpcyBzZXQgdG8gPGNvZGU+c2l6ZTwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHVzaGJhY2tJbnB1dFN0cmVhbX0gd2l0aCB7QGNvZGUgaW59IGFzIHNvdXJjZQorICAgICAqIGlucHV0IHN0cmVhbS4gVGhlIHNpemUgb2YgdGhlIHB1c2hiYWNrIGJ1ZmZlciBpcyBzZXQgdG8ge0Bjb2RlIHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIHRvIGFsbG93IHB1c2hiYWNrIG9wZXJhdGlvbnMgb24uCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGlucHV0IHN0cmVhbS4KICAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIHB1c2hiYWNrIGJ1ZmZlciAoPGNvZGU+c2l6ZT49MDwvY29kZT4pLgorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIHB1c2hiYWNrIGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzaXplfSBpcyBuZWdhdGl2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHVzaGJhY2tJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoaW4pOwpAQCAtNzEsMTUgKzgyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGludCByZXByZXNlbnRpbmcgdGhlbiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGJlZm9yZQotICAgICAqIHRoaXMgUHVzaGJhY2tJbnB1dFN0cmVhbSB3aWxsIGJsb2NrLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgICAgKiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHB1c2hiYWNrIGJ1ZmZlciBwbHVzIHRob3NlIGF2YWlsYWJsZSBpbiB0aGUgdGFyZ2V0Ci0gICAgICogc3RyZWFtLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBhdmFpbGFibGUgYmVmb3JlIHRoaXMgc3RyZWFtIHdpbGwKKyAgICAgKiBibG9jay4gVGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHB1c2hiYWNrIGJ1ZmZlciBhbmQKKyAgICAgKiB0aG9zZSBhdmFpbGFibGUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgYmxvY2tpbmcuCi0gICAgICogCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoaXMgc3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYmVmb3JlIGJsb2NraW5nLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW4gSS9PIGVycm9yIG9jY3VycyBpbiB0aGUgc291cmNlCisgICAgICogICAgICAgICAgICAgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTkwLDExICsxMDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIFB1c2hiYWNrSW5wdXRTdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gY2xvc2VzIHRoZSB0YXJnZXQKLSAgICAgKiBzdHJlYW0uCisgICAgICogQ2xvc2VzIHRoaXMgc3RyZWFtLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgc291cmNlIHN0cmVhbQorICAgICAqIGFuZCByZWxlYXNlcyB0aGUgcHVzaGJhY2sgYnVmZmVyLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMDYsMTIgKzExOCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBQdXNoYmFja0lucHV0U3RyZWFtCi0gICAgICogc3VwcG9ydHMgbWFyaygpIGFuZCByZXNldCgpLiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIGZhbHNlCi0gICAgICogc2luY2UgUHVzaGJhY2tJbnB1dFN0cmVhbXMgZG8gbm90IHN1cHBvcnQgbWFyay9yZXNldC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHN0cmVhbSBzdXBwb3J0cyB0aGUge0Bjb2RlIG1hcmsoaW50KX0gYW5kCisgICAgICoge0Bjb2RlIHJlc2V0KCl9IG1ldGhvZHMuIHtAY29kZSBQdXNoYmFja0lucHV0U3RyZWFtfSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogdGhlbSwgc28gaXQgcmV0dXJucyB7QGNvZGUgZmFsc2V9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgbWFyaygpIGFuZCByZXNldCgpIGFyZQotICAgICAqICAgICAgICAgc3VwcG9ydGVkLgorICAgICAqIEByZXR1cm4gYWx3YXlzIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CkBAIC0xMTksMTUgKzEzMywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIFB1c2hiYWNrSW5wdXRTdHJlYW0gYW5kIHJldHVybnMgdGhlIHJlc3VsdAotICAgICAqIGFzIGFuIGludC4gVGhlIGxvdy1vcmRlciBieXRlIGlzIHJldHVybmVkIG9yIC0xIG9mIHRoZSBlbmQgb2Ygc3RyZWFtIHdhcwotICAgICAqIGVuY291bnRlcmVkLiBJZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gYW55IGF2YWlsYWJsZSBieXRlcwotICAgICAqIHRoZW4gYSBieXRlIGZyb20gdGhlIHRhcmdldCBpbnB1dCBzdHJlYW0gaXMgcmV0dXJuZWQuCisgICAgICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoaXMgc3RyZWFtIGFuZCByZXR1cm5zIGl0IGFzIGFuIGludGVnZXIgaW4gdGhlCisgICAgICogcmFuZ2UgZnJvbSAwIHRvIDI1NS4gSWYgdGhlIHB1c2hiYWNrIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGFueQorICAgICAqIGF2YWlsYWJsZSBieXRlcyB0aGVuIGEgYnl0ZSBmcm9tIHRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtIGlzIHJldHVybmVkLgorICAgICAqIEJsb2NrcyB1bnRpbCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc3RyZWFtIGlzCisgICAgICogZGV0ZWN0ZWQgb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCBUaGUgYnl0ZSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJlYW0gaGFzIGJlZW4KKyAgICAgKiAgICAgICAgIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHN0cmVhbSBpcyBjbG9zZWQgb3IgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nCisgICAgICogICAgICAgICAgICAgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTQ0LDM3ICsxNjEsNTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhdCBtb3N0IDxjb2RlPmxlbmd0aDwvY29kZT4gYnl0ZXMgZnJvbSB0aGlzIFB1c2hiYWNrSW5wdXRTdHJlYW0KLSAgICAgKiBhbmQgc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiByZWFkcyBieXRlcyBmcm9tIHRoZSBwdXNoYmFjayBidWZmZXIgZmlyc3QsIHRoZW4gdGhlIHRhcmdldCBzdHJlYW0gaWYKLSAgICAgKiBtb3JlIGJ5dGVzIGFyZSByZXF1aXJlZCB0byBzYXRpc2Z5IDxjb2RlPmNvdW50PC9jb2RlPi4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBsZW5ndGh9IGJ5dGVzIGZyb20gdGhpcyBzdHJlYW0gYW5kIHN0b3JlcyB0aGVtIGluCisgICAgICogdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQge0Bjb2RlIG9mZnNldH0uIEJ5dGVzIGFyZSByZWFkCisgICAgICogZnJvbSB0aGUgcHVzaGJhY2sgYnVmZmVyIGZpcnN0LCB0aGVuIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0gaWYgbW9yZSBieXRlcworICAgICAqIGFyZSByZXF1aXJlZC4gQmxvY2tzIHVudGlsIHtAY29kZSBjb3VudH0gYnl0ZXMgaGF2ZSBiZWVuIHJlYWQsIHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgc291cmNlIHN0cmVhbSBpcyBkZXRlY3RlZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQKKyAgICAgKiAgICAgICAgICAgIGZyb20gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiB7QGNvZGUgYnVmZmVyfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc3RyZWFtCisgICAgICogICAgICAgICBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJ9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBzdHJlYW0gaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3VycyB3aGlsZQorICAgICAqICAgICAgICAgICAgIHJlYWRpbmcgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGJ1ZmZlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoYnVmID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgICAgICB9CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggfHwgbGVuZ3RoIDwgMAotICAgICAgICAgICAgICAgIHx8IGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gcmVtb3ZlZCByZWR1bmRhbnQgY2hlY2ssIHVzZWQgKG9mZnNldCB8IGxlbmd0aCkgPCAwCisgICAgICAgIC8vIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChsZW5ndGggPCAwKSB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKChvZmZzZXQgfCBsZW5ndGgpIDwgMCB8fCBsZW5ndGggPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgICAgIGludCBjb3BpZWRCeXRlcyA9IDAsIGNvcHlMZW5ndGggPSAwLCBuZXdPZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgIC8vIEFyZSB0aGVyZSBwdXNoYmFjayBieXRlcyBhdmFpbGFibGU/CkBAIC0yMDIsMTkgKzIzMiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNraXBzIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBQdXNoYmFja0lucHV0U3RyZWFtLgotICAgICAqIFN1YnNlcXVlbnQgPGNvZGU+cmVhZCgpPC9jb2RlPidzIHdpbGwgbm90IHJldHVybiB0aGVzZSBieXRlcyB1bmxlc3MKLSAgICAgKiA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLiBUaGlzIGltcGxlbWVudGF0aW9uIHNraXBzCi0gICAgICogPGNvZGU+Y291bnQ8L2NvZGU+IG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIGFuZC9vciB0aGUgdGFyZ2V0Ci0gICAgICogc3RyZWFtLgorICAgICAqIFNraXBzIHtAY29kZSBjb3VudH0gYnl0ZXMgaW4gdGhpcyBzdHJlYW0uIFRoaXMgaW1wbGVtZW50YXRpb24gc2tpcHMgYnl0ZXMKKyAgICAgKiBpbiB0aGUgcHVzaGJhY2sgYnVmZmVyIGZpcnN0IGFuZCB0aGVuIGluIHRoZSBzb3VyY2Ugc3RyZWFtIGlmIG5lY2Vzc2FyeS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY291bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCBvciBhbm90aGVyIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjM2LDM5ICsyNjIsNTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQdXNoIGJhY2sgYWxsIHRoZSBieXRlcyBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LiBUaGUgYnl0ZXMgYXJlIHB1c2hlZAotICAgICAqIHNvIHRoYXQgdGhleSB3b3VsZCBiZSByZWFkIGJhY2sgYnVmZmVyWzBdLCBidWZmZXJbMV0sIGV0Yy4gSWYgdGhlIHB1c2gKLSAgICAgKiBiYWNrIGJ1ZmZlciBjYW5ub3QgaGFuZGxlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiwKLSAgICAgKiBhbiBJT0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gU29tZSBvZiB0aGUgYnVmZmVyIG1heSBhbHJlYWR5IGJlIGluIHRoZQotICAgICAqIGJ1ZmZlciBhZnRlciB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBQdXNoZXMgYWxsIHRoZSBieXRlcyBpbiB7QGNvZGUgYnVmZmVyfSBiYWNrIHRvIHRoaXMgc3RyZWFtLiBUaGUgYnl0ZXMgYXJlCisgICAgICogcHVzaGVkIGJhY2sgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoaXMgc3RyZWFtIGlzCisgICAgICogYnVmZmVyWzBdLCB0aGVuIGJ1ZmZlclsxXSBhbmQgc28gb24uCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBzdHJlYW0ncyBpbnRlcm5hbCBwdXNoYmFjayBidWZmZXIgY2Fubm90IHN0b3JlIHRoZSBlbnRpcmUKKyAgICAgKiBjb250ZW50cyBvZiB7QGNvZGUgYnVmZmVyfSwgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBpcyB0aHJvd24uIFBhcnRzIG9mCisgICAgICoge0Bjb2RlIGJ1ZmZlcn0gbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGNvcGllZCB0byB0aGUgcHVzaGJhY2sgYnVmZmVyIHdoZW4KKyAgICAgKiB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBieXRlcyB0byBwdXNoIGJhY2sgaW50byB0aGUgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBieXRlcyB0byBwdXNoIGJhY2sgdG8gdGhpcyBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBwdXNoYmFjayBidWZmZXIgYmVjb21lcywgb3IgaXMsIGZ1bGwuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZyZWUgc3BhY2UgaW4gdGhlIGludGVybmFsIHB1c2hiYWNrIGJ1ZmZlciBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICBzdWZmaWNpZW50IHRvIHN0b3JlIHRoZSBjb250ZW50cyBvZiB7QGNvZGUgYnVmZmVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlYWQoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHVzaCBiYWNrIDxjb2RlPmxlbmd0aDwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4KLSAgICAgKiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+LiBUaGUgYnl0ZXMgYXJlIHB1c2hlZCBzbyB0aGF0IHRoZXkKLSAgICAgKiB3b3VsZCBiZSByZWFkIGJhY2sgYnVmZmVyW29mZnNldF0sIGJ1ZmZlcltvZmZzZXQrMV0sIGV0Yy4gSWYgdGhlIHB1c2gKLSAgICAgKiBiYWNrIGJ1ZmZlciBjYW5ub3QgaGFuZGxlIHRoZSBieXRlcyBjb3BpZWQgZnJvbSA8Y29kZT5idWZmZXI8L2NvZGU+LAotICAgICAqIGFuIElPRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBTb21lIG9mIHRoZSBieXRlcyBtYXkgYWxyZWFkeSBiZSBpbiB0aGUKLSAgICAgKiBidWZmZXIgYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogUHVzaGVzIGEgc3Vic2V0IG9mIHRoZSBieXRlcyBpbiB7QGNvZGUgYnVmZmVyfSBiYWNrIHRvIHRoaXMgc3RyZWFtLiBUaGUKKyAgICAgKiBzdWJzZXQgaXMgZGVmaW5lZCBieSB0aGUgc3RhcnQgcG9zaXRpb24ge0Bjb2RlIG9mZnNldH0gd2l0aGluCisgICAgICoge0Bjb2RlIGJ1ZmZlcn0gYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3BlY2lmaWVkIGJ5IHtAY29kZSBsZW5ndGh9LiBUaGUKKyAgICAgKiBieXRlcyBhcmUgcHVzaGVkIGJhY2sgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoaXMKKyAgICAgKiBzdHJlYW0gaXMge0Bjb2RlIGJ1ZmZlcltvZmZzZXRdfSwgdGhlbiB7QGNvZGUgYnVmZmVyWzFdfSBhbmQgc28gb24uCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBzdHJlYW0ncyBpbnRlcm5hbCBwdXNoYmFjayBidWZmZXIgY2Fubm90IHN0b3JlIHRoZSBzZWxlY3RlZAorICAgICAqIHN1YnNldCBvZiB7QGNvZGUgYnVmZmVyfSwgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBpcyB0aHJvd24uIFBhcnRzIG9mCisgICAgICoge0Bjb2RlIGJ1ZmZlcn0gbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGNvcGllZCB0byB0aGUgcHVzaGJhY2sgYnVmZmVyIHdoZW4KKyAgICAgKiB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBieXRlcyB0byBwdXNoIGJhY2sgaW50byB0aGUgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBieXRlcyB0byBwdXNoIGJhY2sgdG8gdGhpcyBzdHJlYW0uCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHRvIHN0YXJ0IHRha2luZyBieXRlcyB0byBwdXNoIGJhY2suCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gcHVzaCBiYWNrLgogICAgICAqIEBwYXJhbSBsZW5ndGgKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHVzaCBiYWNrLgotICAgICAqIAorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJ9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGJlY29tZXMsIG9yIGlzLCBmdWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmcmVlIHNwYWNlIGluIHRoZSBpbnRlcm5hbCBwdXNoYmFjayBidWZmZXIgaXMgbm90CisgICAgICogICAgICAgICAgICAgc3VmZmljaWVudCB0byBzdG9yZSB0aGUgc2VsZWN0ZWQgY29udGVudHMgb2Yge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjc3LDEwICszMTgsMTkgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA3ZSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIHx8IGxlbmd0aCA8IDAKLSAgICAgICAgICAgICAgICB8fCBsZW5ndGggPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0CisgICAgICAgIC8vIHVzZWQgKG9mZnNldCB8IGxlbmd0aCkgPCAwIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChsZW5ndGggPCAwKQorICAgICAgICAvLyB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQorICAgICAgICBpZiAoKG9mZnNldCB8IGxlbmd0aCkgPCAwIHx8IGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwMmYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldCArIGxlbmd0aCAtIDE7IGkgPj0gb2Zmc2V0OyBpLS0pIHsKICAgICAgICAgICAgIHVucmVhZChidWZmZXJbaV0pOwpAQCAtMjg4LDE1ICszMzgsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQdXNoIGJhY2sgb25lIDxjb2RlPmJ5dGU8L2NvZGU+LiBUYWtlcyB0aGUgYnl0ZSA8Y29kZT5vbmVCeXRlPC9jb2RlPgotICAgICAqIGFuZCBwdXRzIGluIGluIHRoZSBsb2NhbCBidWZmZXIgb2YgYnl0ZXMgdG8gcmVhZCBiYWNrIGJlZm9yZSBhY2Nlc3NpbmcKLSAgICAgKiB0aGUgdGFyZ2V0IGlucHV0IHN0cmVhbS4KKyAgICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBieXRlIHtAY29kZSBvbmVCeXRlfSBiYWNrIHRvIHRoaXMgc3RyZWFtLiBPbmx5IHRoZQorICAgICAqIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdGhlIGludGVnZXIge0Bjb2RlIG9uZUJ5dGV9IGlzIHB1c2hlZCBiYWNrLgorICAgICAqIFRoaXMgaXMgZG9uZSBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhpcyBzdHJlYW0gaXMKKyAgICAgKiB7QGNvZGUgKGJ5dGUpIG9uZUJ5dGV9LgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgc3RyZWFtJ3MgaW50ZXJuYWwgcHVzaGJhY2sgYnVmZmVyIGNhbm5vdCBzdG9yZSB0aGUgYnl0ZSwgYW4KKyAgICAgKiB7QGNvZGUgSU9FeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIG9uZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIHB1c2ggYmFjayBpbnRvIHRoZSBzdHJlYW0uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byBwdXNoIGJhY2sgdG8gdGhpcyBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBwdXNoYmFjayBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc3RyZWFtIGlzIGNsb3NlZCBvciB0aGUgaW50ZXJuYWwgcHVzaGJhY2sgYnVmZmVyIGlzCisgICAgICogICAgICAgICAgICAgZnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlYWQoaW50IG9uZUJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChidWYgPT0gbnVsbCkgewpAQCAtMzA5LDEyICszNjUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNYWtlIGEgbWFyayBvZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtIGJ1dCB0aGUgbWFyayBtZXRob2QKLSAgICAgKiBkb2VzIG5vdGhpbmcuCisgICAgICogTWFya3MgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBzdHJlYW0uIFNldHRpbmcgYSBtYXJrIGlzIG5vdAorICAgICAqIHN1cHBvcnRlZCBpbiB0aGlzIGNsYXNzOyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgYWJsZSB0byBiZSByZWFkIGJlZm9yZQotICAgICAqICAgICAgICAgICAgdGhlIG1hcmsgYmVjb21lcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIHN0cmVhbSBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXJrIGlzIGludmFsaWRhdGVkOyB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewpAQCAtMzIyLDExICszNzksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBtYXJrIG1hZGUgcHJldmlvdXNseSBpbnQgdGhlIHN0cmVhbSwgYnV0Ci0gICAgICogdGhlIHJlc2V0IG1ldGhvZCB3aWxsIHRocm93IElPRXhjZXB0aW9uIGFuZCBkbyBub3RoaW5nIGVsc2UgaWYgY2FsbGVkLgorICAgICAqIFJlc2V0cyB0aGlzIHN0cmVhbSB0byB0aGUgbGFzdCBtYXJrZWQgcG9zaXRpb24uIFJlc2V0dGluZyB0aGUgc3RyZWFtIGlzCisgICAgICogbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNsYXNzOyB0aGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgYW4KKyAgICAgKiB7QGNvZGUgSU9FeGNlcHRpb259LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QdXNoYmFja1JlYWRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUHVzaGJhY2tSZWFkZXIuamF2YQppbmRleCAxMTAzNmIxLi4yNmIwMDJjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QdXNoYmFja1JlYWRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1B1c2hiYWNrUmVhZGVyLmphdmEKQEAgLTIwLDMzICsyMCwzNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFB1c2hiYWNrUmVhZGVyIGlzIGEgZmlsdGVyIGNsYXNzIHdoaWNoIGFsbG93cyBjaGFycyByZWFkIHRvIGJlIHB1c2hlZCBiYWNrCi0gKiBpbnRvIHRoZSBzdHJlYW0gc28gdGhhdCB0aGV5IGNhbiBiZSByZXJlYWQuIFBhcnNlcnMgbWF5IGZpbmQgdGhpcyB1c2VmdWwuCi0gKiBUaGVyZSBpcyBhIHByb2dhbW1hYmxlIGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgY2hhcnMgd2hpY2ggbWF5IGJlIHB1c2hlZCBiYWNrLgotICogSWYgdGhlIGJ1ZmZlciBvZiBwdXNoZWQgYmFjayBjaGFycyBpcyBlbXB0eSwgY2hhcnMgYXJlIHJlYWQgZnJvbSB0aGUgc291cmNlCi0gKiByZWFkZXIuCisgKiBXcmFwcyBhbiBleGlzdGluZyB7QGxpbmsgUmVhZGVyfSBhbmQgYWRkcyBmdW5jdGlvbmFsaXR5IHRvICJwdXNoIGJhY2siCisgKiBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBiZWVuIHJlYWQsIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVhZCBhZ2Fpbi4gUGFyc2VycyBtYXkKKyAqIGZpbmQgdGhpcyB1c2VmdWwuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aGljaCBtYXkgYmUgcHVzaGVkIGJhY2sgY2FuIGJlCisgKiBzcGVjaWZpZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4gSWYgdGhlIGJ1ZmZlciBvZiBwdXNoZWQgYmFjayBieXRlcyBpcyBlbXB0eSwKKyAqIGNoYXJhY3RlcnMgYXJlIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyByZWFkZXIuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUHVzaGJhY2tSZWFkZXIgZXh0ZW5kcyBGaWx0ZXJSZWFkZXIgewogICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiBhcnJheSBjb250YWluaW5nIHRoZSBjaGFycyB0byByZWFkLgorICAgICAqIFRoZSB7QGNvZGUgY2hhcn0gYXJyYXkgY29udGFpbmluZyB0aGUgY2hhcnMgdG8gcmVhZC4KICAgICAgKi8KICAgICBjaGFyW10gYnVmOwogCiAgICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBjaGFyIGFycmF5IDxjb2RlPmJ1ZjwvY29kZT4uIEEgdmFsdWUKKyAgICAgKiBUaGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGNoYXIgYXJyYXkge0Bjb2RlIGJ1Zn0uIEEgdmFsdWUKICAgICAgKiBlcXVhbCB0byBidWYubGVuZ3RoIGluZGljYXRlcyBubyBjaGFycyBhdmFpbGFibGUuIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMKICAgICAgKiB0aGUgYnVmZmVyIGlzIGZ1bGwuCiAgICAgICovCiAgICAgaW50IHBvczsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUHVzaGJhY2tSZWFkZXIgb24gdGhlIFJlYWRlciA8Y29kZT5pbjwvY29kZT4uIFRoZQotICAgICAqIHNpemUgb2YgdGhlIHB1c2hiYWNrIGJ1ZmZlciBpcyBzZXQgdG8gdGhlIGRlZmF1bHQsIG9yIDEgY2hhcmFjdGVyLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFB1c2hiYWNrUmVhZGVyfSB3aXRoIHRoZSBzcGVjaWZpZWQgcmVhZGVyIGFzCisgICAgICogc291cmNlLiBUaGUgc2l6ZSBvZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGlzIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxCisgICAgICogY2hhcmFjdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIFJlYWRlciB0byBhbGxvdyBwdXNoYmFjayBvcGVyYXRpb25zIG9uLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSByZWFkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFB1c2hiYWNrUmVhZGVyKFJlYWRlciBpbikgewogICAgICAgICBzdXBlcihpbik7CkBAIC01NSwxNiArNTcsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFB1c2hiYWNrUmVhZGVyIG9uIHRoZSBSZWFkZXIgPGNvZGU+aW48L2NvZGU+LiBUaGUKLSAgICAgKiBzaXplIG9mIHRoZSBwdXNoYmFjayBidWZmZXIgaXMgc2V0IHRvIDxjb2RlPnNpemU8L2NvZGU+IGNoYXJhY3RlcnMuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHVzaGJhY2tSZWFkZXJ9IHdpdGgge0Bjb2RlIGlufSBhcyBzb3VyY2UgcmVhZGVyLgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBwdXNoYmFjayBidWZmZXIgaXMgc2V0IHRvIHtAY29kZSBzaXplfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBSZWFkZXIgdG8gYWxsb3cgcHVzaGJhY2sgb3BlcmF0aW9ucyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcmVhZGVyLgogICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgcHVzaGJhY2sgYnVmZmVyICg8Y29kZT5zaXplPj0wPC9jb2RlPikgaW4KLSAgICAgKiAgICAgICAgICAgIGNoYXJhY3RlcnMuCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgcHVzaGJhY2sgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc2l6ZSA8PSAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNpemV9IGlzIG5lZ2F0aXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQdXNoYmFja1JlYWRlcihSZWFkZXIgaW4sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKGluKTsKQEAgLTc2LDEyICs3OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgUHVzaGJhY2tSZWFkZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gY2xvc2VzIHRoaXMgcmVhZGVyLAotICAgICAqIHJlbGVhc2VzIHRoZSBidWZmZXIgdXNlZCB0byBwdXNoYmFjayBjaGFyYWN0ZXJzLCBhbmQgY2xvc2VzIHRoZSB0YXJnZXQKLSAgICAgKiByZWFkZXIuCisgICAgICogQ2xvc2VzIHRoaXMgcmVhZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyB0aGUgc291cmNlIHJlYWRlcgorICAgICAqIGFuZCByZWxlYXNlcyB0aGUgcHVzaGJhY2sgYnVmZmVyLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIFJlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHJlYWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC05MiwxNCArOTQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNYXJrIHRoaXMgUHVzaGJhY2tSZWFkZXIuIFNpbmNlIG1hcmsgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2Qgd2lsbAotICAgICAqIGFsd2F5cyB0aHJvdyBJT0V4Y2VwdGlvbi4KKyAgICAgKiBNYXJrcyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGlzIHN0cmVhbS4gU2V0dGluZyBhIG1hcmsgaXMgbm90CisgICAgICogc3VwcG9ydGVkIGluIHRoaXMgY2xhc3M7IHRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRocm93cyBhbgorICAgICAqIHtAY29kZSBJT0V4Y2VwdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRBaGVhZExpbWl0Ci0gICAgICogICAgICAgICAgICBpZ25vcmVkLCB0aGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIElPRXhjZXB0aW9uLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgcmVhZGVyCisgICAgICogICAgICAgICAgICBiZWZvcmUgdGhlIG1hcmsgaXMgaW52YWxpZGF0ZWQ7IHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFNpbmNlIG1hcmsgaXMgbm90IHN1cHBvcnRlZCBieXQgUHVzaGJhY2tSZWFkZXIuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTA3LDEyICsxMTEsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgUHVzaGJhY2tSZWFkZXIgc3VwcG9ydHMKLSAgICAgKiBtYXJrKCkgYW5kIHJlc2V0KCkuIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgZmFsc2Ugc2luY2UKLSAgICAgKiBQdXNoYmFja1JlYWRlcnMgZG8gbm90IHN1cHBvcnQgbWFyay9yZXNldC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHJlYWRlciBzdXBwb3J0cyB0aGUge0Bjb2RlIG1hcmsoaW50KX0gYW5kCisgICAgICoge0Bjb2RlIHJlc2V0KCl9IG1ldGhvZHMuIHtAY29kZSBQdXNoYmFja1JlYWRlcn0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtLCBzbworICAgICAqIGl0IHJldHVybnMge0Bjb2RlIGZhbHNlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IG1hcmsoKSBhbmQgcmVzZXQoKSBhcmUKLSAgICAgKiAgICAgICAgIHN1cHBvcnRlZC4KKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewpAQCAtMTIwLDE1ICsxMjYsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGlzIFB1c2hiYWNrUmVhZGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKLSAgICAgKiBhcyBhbiBpbnQuIFRoZSAyIGxvd2VzdC1vcmRlciBieXRlcyBhcmUgcmV0dXJuZWQgb3IgLTEgb2YgdGhlIGVuZCBvZgotICAgICAqIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuIElmIHRoZSBwdXNoYmFjayBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhbnkKLSAgICAgKiBhdmFpbGFibGUgY2hhcnMgdGhlbiBhIGNoYXIgZnJvbSB0aGUgdGFyZ2V0IGlucHV0IHJlYWRlciBpcyByZXR1cm5lZC4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGlzIHJlYWRlciBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyCisgICAgICogd2l0aCB0aGUgdHdvIGhpZ2hlci1vcmRlciBieXRlcyBzZXQgdG8gMC4gUmV0dXJucyAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqIHJlYWRlciBoYXMgYmVlbiByZWFjaGVkLiBJZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gYW55CisgICAgICogYXZhaWxhYmxlIGNoYXJhY3RlcnMgdGhlbiBhIGNoYXJhY3RlciBmcm9tIHRoZSBzb3VyY2UgcmVhZGVyIGlzIHJldHVybmVkLgorICAgICAqIEJsb2NrcyB1bnRpbCBvbmUgY2hhcmFjdGVyIGhhcyBiZWVuIHJlYWQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSByZWFkZXIgaXMKKyAgICAgKiBkZXRlY3RlZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IFRoZSBjaGFyIHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgcmVhZGVyIGhhcyBiZWVuCisgICAgICogICAgICAgICByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZworICAgICAqICAgICAgICAgICAgIGZyb20gdGhpcyByZWFkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE0OSwyMyArMTU5LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gY2hhcnMgZnJvbSB0aGlzIFB1c2hiYWNrUmVhZGVyIGFuZAotICAgICAqIHN0b3JlcyB0aGVtIGluIGNoYXIgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGNoYXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBjaGFycyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLiBUaGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogcmVhZHMgY2hhcnMgZnJvbSB0aGUgcHVzaGJhY2sgYnVmZmVyIGZpcnN0LCB0aGVuIHRoZSB0YXJnZXQgc3RyZWFtIGlmCi0gICAgICogbW9yZSBjaGFycyBhcmUgcmVxdWlyZWQgdG8gc2F0aXNmeSA8Y29kZT5jb3VudDwvY29kZT4uCisgICAgICogUmVhZHMgYXQgbW9zdCB7QGNvZGUgbGVuZ3RofSBieXRlcyBmcm9tIHRoaXMgcmVhZGVyIGFuZCBzdG9yZXMgdGhlbSBpbgorICAgICAqIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQge0Bjb2RlIG9mZnNldH0uIENoYXJhY3RlcnMgYXJlCisgICAgICogcmVhZCBmcm9tIHRoZSBwdXNoYmFjayBidWZmZXIgZmlyc3QsIHRoZW4gZnJvbSB0aGUgc291cmNlIHJlYWRlciBpZiBtb3JlCisgICAgICogYnl0ZXMgYXJlIHJlcXVpcmVkLiBCbG9ja3MgdW50aWwge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIGhhdmUgYmVlbiByZWFkLAorICAgICAqIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSByZWFkZXIgaXMgZGV0ZWN0ZWQgb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBjaGFycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgY2hhcmFjdGVycyByZWFkIGZyb20gdGhpcworICAgICAqICAgICAgICAgICAgcmVhZGVyLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBjaGFycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICByZWFkIGZyb20gdGhpcyByZWFkZXIuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcnMgdG8gc3RvcmUgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSByZWFkZXIKKyAgICAgKiAgICAgICAgIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUKKyAgICAgKiAgICAgICAgICAgICByZWFkaW5nIGZyb20gdGhpcyByZWFkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE3NCw5ICsxOTEsMTggQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNTkiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggLSBjb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LCB1c2VkIChvZmZzZXQgfCBjb3VudCkgPCAwCisgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAoY291bnQgPCAwKSB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChvZmZzZXQgfCBjb3VudCkgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggLSBjb3VudCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAgICAgICAgIGludCBjb3BpZWRDaGFycyA9IDA7CiAgICAgICAgICAgICBpbnQgY29weUxlbmd0aCA9IDA7CkBAIC0yMDcsMTkgKzIzMywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMKLSAgICAgKiBQdXNoYmFja1JlYWRlciBpcyByZWFkeSB0byBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuIElmIHRoZSByZXN1bHQgaXMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIG5leHQgPGNvZGU+cmVhZCgpPC9jb2RlPiB3aWxsIG5vdCBibG9jay4gSWYKLSAgICAgKiB0aGUgcmVzdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGlzIFJlYWRlciBtYXkgb3IgbWF5IG5vdCBibG9jayB3aGVuCi0gICAgICogPGNvZGU+cmVhZCgpPC9jb2RlPiBpcyBzZW50LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIGlzIHJlYWR5IHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHJlYWRlciB3aWxsIG5vdCBibG9jayB3aGVuIHtAY29kZSByZWFkfSBpcworICAgICAqIGNhbGxlZCwge0Bjb2RlIGZhbHNlfSBpZiB1bmtub3duIG9yIGJsb2NraW5nIHdpbGwgb2NjdXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWNlaXZlciB3aWxsIG5vdCBibG9jayB3aGVuCi0gICAgICogICAgICAgICA8Y29kZT5yZWFkKCk8L2NvZGU+IGlzIGNhbGxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHVua25vd24KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVjZWl2ZXIgd2lsbCBub3QgYmxvY2sgd2hlbgorICAgICAqICAgICAgICAge0Bjb2RlIHJlYWQoKX0gaXMgY2FsbGVkLCB7QGNvZGUgZmFsc2V9IGlmIHVua25vd24KICAgICAgKiAgICAgICAgIG9yIGJsb2NraW5nIHdpbGwgb2NjdXIuCi0gICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBSZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQgb3Igc29tZSBvdGhlciBJTyBlcnJvcgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgI3JlYWQoKQorICAgICAqIEBzZWUgI3JlYWQoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yMzIsMTEgKzI1NywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGlzIFB1c2hiYWNrUmVhZGVyLiBTaW5jZSBtYXJrIGlzIG5vdCBzdXBwb3J0ZWQsIGFsd2F5cyB0aHJvdwotICAgICAqIElPRXhjZXB0aW9uLgorICAgICAqIFJlc2V0cyB0aGlzIHJlYWRlciB0byB0aGUgbGFzdCBtYXJrZWQgcG9zaXRpb24uIFJlc2V0dGluZyB0aGUgcmVhZGVyIGlzCisgICAgICogbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNsYXNzOyB0aGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgYW4KKyAgICAgKiB7QGNvZGUgSU9FeGNlcHRpb259LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTaW5jZSBtYXJrIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTI0NCwzOSArMjcxLDYwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHVzaCBiYWNrIGFsbCB0aGUgY2hhcnMgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4gVGhlIGNoYXJzIGFyZSBwdXNoZWQKLSAgICAgKiBzbyB0aGF0IHRoZXkgd291bGQgYmUgcmVhZCBiYWNrIGJ1ZmZlclswXSwgYnVmZmVyWzFdLCBldGMuIElmIHRoZSBwdXNoCi0gICAgICogYmFjayBidWZmZXIgY2Fubm90IGhhbmRsZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4sCi0gICAgICogYW4gSU9FeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIFNvbWUgb2YgdGhlIGJ1ZmZlciBtYXkgYWxyZWFkeSBiZSBpbiB0aGUKLSAgICAgKiBidWZmZXIgYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogUHVzaGVzIGFsbCB0aGUgY2hhcmFjdGVycyBpbiB7QGNvZGUgYnVmZmVyfSBiYWNrIHRvIHRoaXMgcmVhZGVyLiBUaGUKKyAgICAgKiBjaGFyYWN0ZXJzIGFyZSBwdXNoZWQgYmFjayBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIG5leHQgY2hhcmFjdGVyIHJlYWQKKyAgICAgKiBmcm9tIHRoaXMgcmVhZGVyIGlzIGJ1ZmZlclswXSwgdGhlbiBidWZmZXJbMV0gYW5kIHNvIG9uLgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgcmVhZGVyJ3MgaW50ZXJuYWwgcHVzaGJhY2sgYnVmZmVyIGNhbm5vdCBzdG9yZSB0aGUgZW50aXJlCisgICAgICogY29udGVudHMgb2Yge0Bjb2RlIGJ1ZmZlcn0sIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gaXMgdGhyb3duLiBQYXJ0cyBvZgorICAgICAqIHtAY29kZSBidWZmZXJ9IG1heSBoYXZlIGFscmVhZHkgYmVlbiBjb3BpZWQgdG8gdGhlIHB1c2hiYWNrIGJ1ZmZlciB3aGVuCisgICAgICogdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IGNvbnRhaW5pbmcgY2hhcnMgdG8gcHVzaCBiYWNrIGludG8gdGhlIHJlYWRlci4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyB0byBwdXNoIGJhY2sgdG8gdGhpcworICAgICAqICAgICAgICAgICAgcmVhZGVyLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGJlY29tZXMsIG9yIGlzLCBmdWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgICBwdXNoYmFjayBidWZmZXIgaXMgbm90IHN1ZmZpY2llbnQgdG8gc3RvcmUgdGhlIGNvbnRlbnRzIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWFkKGNoYXJbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFB1c2ggYmFjayA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGNoYXJzIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4KLSAgICAgKiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+LiBUaGUgY2hhcnMgYXJlIHB1c2hlZCBzbyB0aGF0IHRoZXkKLSAgICAgKiB3b3VsZCBiZSByZWFkIGJhY2sgYnVmZmVyW29mZnNldF0sIGJ1ZmZlcltvZmZzZXQrMV0sIGV0Yy4gSWYgdGhlIHB1c2gKLSAgICAgKiBiYWNrIGJ1ZmZlciBjYW5ub3QgaGFuZGxlIHRoZSBjaGFycyBjb3BpZWQgZnJvbSA8Y29kZT5idWZmZXI8L2NvZGU+LAotICAgICAqIGFuIElPRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBTb21lIG9mIHRoZSBjaGFycyBtYXkgYWxyZWFkeSBiZSBpbiB0aGUKLSAgICAgKiBidWZmZXIgYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogUHVzaGVzIGEgc3Vic2V0IG9mIHRoZSBjaGFyYWN0ZXJzIGluIHtAY29kZSBidWZmZXJ9IGJhY2sgdG8gdGhpcyByZWFkZXIuCisgICAgICogVGhlIHN1YnNldCBpcyBkZWZpbmVkIGJ5IHRoZSBzdGFydCBwb3NpdGlvbiB7QGNvZGUgb2Zmc2V0fSB3aXRoaW4KKyAgICAgKiB7QGNvZGUgYnVmZmVyfSBhbmQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHNwZWNpZmllZCBieSB7QGNvZGUgbGVuZ3RofS4KKyAgICAgKiBUaGUgYnl0ZXMgYXJlIHB1c2hlZCBiYWNrIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgbmV4dCBieXRlIHJlYWQgZnJvbSB0aGlzCisgICAgICogc3RyZWFtIGlzIHtAY29kZSBidWZmZXJbb2Zmc2V0XX0sIHRoZW4ge0Bjb2RlIGJ1ZmZlclsxXX0gYW5kIHNvIG9uLgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgc3RyZWFtJ3MgaW50ZXJuYWwgcHVzaGJhY2sgYnVmZmVyIGNhbm5vdCBzdG9yZSB0aGUgc2VsZWN0ZWQKKyAgICAgKiBzdWJzZXQgb2Yge0Bjb2RlIGJ1ZmZlcn0sIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gaXMgdGhyb3duLiBQYXJ0cyBvZgorICAgICAqIHtAY29kZSBidWZmZXJ9IG1heSBoYXZlIGFscmVhZHkgYmVlbiBjb3BpZWQgdG8gdGhlIHB1c2hiYWNrIGJ1ZmZlciB3aGVuCisgICAgICogdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IGNvbnRhaW5pbmcgY2hhcnMgdG8gcHVzaCBiYWNrIGludG8gdGhlIHJlYWRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyB0byBwdXNoIGJhY2sgdG8gdGhpcworICAgICAqICAgICAgICAgICAgcmVhZGVyLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB0byBzdGFydCB0YWtpbmcgY2hhcnMgdG8gcHVzaCBiYWNrLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHtAY29kZSBidWZmZXJ9IHRvIHB1c2ggYmFjay4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcnMgdG8gcHVzaCBiYWNrLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBwdXNoIGJhY2suCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGNvdW50IDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGNvdW50fSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJ9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGJlY29tZXMsIG9yIGlzLCBmdWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgICBwdXNoYmFjayBidWZmZXIgaXMgbm90IHN1ZmZpY2llbnQgdG8gc3RvcmUgdGhlIHNlbGVjdGVkCisgICAgICogICAgICAgICAgICAgY29udGVudHMgb2Yge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZmZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlYWQoY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKQEAgLTI4NywxMyArMzM1LDE5IEBACiAgICAgICAgICAgICAgICAgLy8gUHVzaGJhY2sgYnVmZmVyIGZ1bGwKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwN2UiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3cKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIC0gY291bnQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgICAgIC8vIHVzZWQgKG9mZnNldCB8IGNvdW50KSA8IDAgaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGNvdW50IDwgMCkKKyAgICAgICAgICAgIC8vIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICAgICAgaWYgKChvZmZzZXQgfCBjb3VudCkgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggLSBjb3VudCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwMmYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQgKyBjb3VudCAtIDE7IGkgPj0gb2Zmc2V0OyBpLS0pIHsKICAgICAgICAgICAgICAgICB1bnJlYWQoYnVmZmVyW2ldKTsKICAgICAgICAgICAgIH0KQEAgLTMwMSwxNSArMzU1LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHVzaCBiYWNrIG9uZSA8Y29kZT5jaGFyPC9jb2RlPi4gVGFrZXMgdGhlIGNoYXIgPGNvZGU+b25lQ2hhcjwvY29kZT4KLSAgICAgKiBhbmQgcHV0cyBpbiBpbiB0aGUgbG9jYWwgYnVmZmVyIG9mIGNoYXJzIHRvIHJlYWQgYmFjayBiZWZvcmUgYWNjZXNzaW5nCi0gICAgICogdGhlIHRhcmdldCBpbnB1dCBzdHJlYW0uCisgICAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHtAY29kZSBvbmVDaGFyfSBiYWNrIHRvIHRoaXMgcmVhZGVyLiBUaGlzCisgICAgICogaXMgZG9uZSBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIG5leHQgY2hhcmFjdGVyIHJlYWQgZnJvbSB0aGlzIHJlYWRlciBpcworICAgICAqIHtAY29kZSAoY2hhcikgb25lQ2hhcn0uCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyByZWFkZXIncyBpbnRlcm5hbCBwdXNoYmFjayBidWZmZXIgY2Fubm90IHN0b3JlIHRoZSBjaGFyYWN0ZXIsIGFuCisgICAgICoge0Bjb2RlIElPRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBvbmVDaGFyCi0gICAgICogICAgICAgICAgICB0aGUgY2hhciB0byBwdXNoIGJhY2sgaW50byB0aGUgc3RyZWFtLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBwdXNoIGJhY2sgdG8gdGhpcyBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBwdXNoYmFjayBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgcmVhZGVyIGlzIGNsb3NlZCBvciB0aGUgaW50ZXJuYWwgcHVzaGJhY2sgYnVmZmVyIGlzCisgICAgICogICAgICAgICAgICAgZnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlYWQoaW50IG9uZUNoYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtMzI0LDE5ICszODMsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTa2lwcyA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBSZWFkZXIuCi0gICAgICogU3Vic2VxdWVudCA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGNoYXJhY3RlcnMKLSAgICAgKiB1bmxlc3MgPGNvZGU+cmVzZXQoKTwvY29kZT4gaXMgdXNlZC4KKyAgICAgKiBTa2lwcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgaW4gdGhpcyByZWFkZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gc2tpcHMKKyAgICAgKiBjaGFyYWN0ZXJzIGluIHRoZSBwdXNoYmFjayBidWZmZXIgZmlyc3QgYW5kIHRoZW4gaW4gdGhlIHNvdXJjZSByZWFkZXIgaWYKKyAgICAgKiBuZWNlc3NhcnkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwLgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZC4KLSAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgY291bnQgPCAwfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIFJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPIGVycm9yCi0gICAgICogICAgICAgICAgICAgb2NjdXJzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgY291bnQgaXMgbmVnYXRpdmUuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlLmphdmEKaW5kZXggMWYyOTUwMy4uZmNjNmEzNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUmFuZG9tQWNjZXNzRmlsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGUuamF2YQpAQCAtMjcsMTAgKzI3LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5GaWxlQ2hhbm5lbEZhY3Rvcnk7CiAKIC8qKgotICogUmFuZG9tQWNjZXNzRmlsZSBpcyBhIGNsYXNzIHdoaWNoIGFsbG93cyBwb3NpdGlvbmluZyBvZiB0aGUgbmV4dCByZWFkCi0gKiBhbnl3aGVyZSBpbiB0aGUgZmlsZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHJlYWRpbmcgc3BlY2lmaWMgbG9jYXRpb25zIG9mIGZpbGVzCi0gKiBvciBmb2xsb3dpbmcgbGlua3Mgd2l0aGluIGEgZmlsZS4gTW9zdCBpbnB1dCBjbGFzc2VzIG9ubHkgc3VwcG9ydCBmb3J3YXJkCi0gKiBza2lwcGluZy4KKyAqIEFsbG93cyByZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gYSBmaWxlIGluIGEgcmFuZG9tLWFjY2VzcyBtYW5uZXIuIFRoaXMgaXMKKyAqIGRpZmZlcmVudCBmcm9tIHRoZSB1bmktZGlyZWN0aW9uYWwgc2VxdWVudGlhbCBhY2Nlc3MgdGhhdCBhCisgKiB7QGxpbmsgRmlsZUlucHV0U3RyZWFtfSBvciB7QGxpbmsgRmlsZU91dHB1dFN0cmVhbX0gcHJvdmlkZXMuIElmIHRoZSBmaWxlIGlzCisgKiBvcGVuZWQgaW4gcmVhZC93cml0ZSBtb2RlLCB3cml0ZSBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUgYXMgd2VsbC4gVGhlCisgKiBwb3NpdGlvbiBvZiB0aGUgbmV4dCByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiBjYW4gYmUgbW92ZWQgZm9yd2FyZHMgYW5kCisgKiBiYWNrd2FyZHMgYWZ0ZXIgZXZlcnkgb3BlcmF0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJhbmRvbUFjY2Vzc0ZpbGUgaW1wbGVtZW50cyBEYXRhSW5wdXQsIERhdGFPdXRwdXQsIENsb3NlYWJsZSB7CiAgICAgLyoqCkBAIC00NywzNSArNTEsNjkgQEAKICAgICBwcml2YXRlIElGaWxlU3lzdGVtIGZpbGVTeXN0ZW0gPSBQbGF0Zm9ybS5nZXRGaWxlU3lzdGVtKCk7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWFkT25seTsKKyAgICAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uczsKKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwb3NpdGlvbkxvY2sgewogICAgIH0KIAogICAgIHByaXZhdGUgT2JqZWN0IHJlcG9zaXRpb25Mb2NrID0gbmV3IFJlcG9zaXRpb25Mb2NrKCk7CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJhbmRvbUFjY2Vzc0ZpbGUgb24gdGhlIEZpbGUgPGNvZGU+ZmlsZTwvY29kZT4gYW5kCi0gICAgICogb3BlbnMgaXQgYWNjb3JkaW5nIHRvIHRoZSBhY2Nlc3MgU3RyaW5nIGluIDxjb2RlPm1vZGU8L2NvZGU+LiBUaGUKLSAgICAgKiBhY2Nlc3MgbW9kZSBtYXkgYmUgb25lIG9mIDxjb2RlPiJyIjwvY29kZT4gZm9yIHJlYWQgYWNjZXNzIG9ubHksIG9yCi0gICAgICogPGNvZGU+InJ3IjwvY29kZT4gZm9yIHJlYWQvd3JpdGUgYWNjZXNzLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFJhbmRvbUFjY2Vzc0ZpbGV9IGJhc2VkIG9uIHtAY29kZSBmaWxlfSBhbmQgb3BlbnMKKyAgICAgKiBpdCBhY2NvcmRpbmcgdG8gdGhlIGFjY2VzcyBzdHJpbmcgaW4ge0Bjb2RlIG1vZGV9LiAKKyAgICAgKiA8cD48YSBpZD0iYWNjZXNzbW9kZSIvPgorICAgICAqIHtAY29kZSBtb2RlfSBtYXkgaGF2ZSBvbmUgb2YgZm9sbG93aW5nIHZhbHVlczogCisgICAgICogPHRhYmxlIGJvcmRlcj0iMCI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD57QGNvZGUgInIifTwvdGQ+CisgICAgICogPHRkPlRoZSBmaWxlIGlzIG9wZW5lZCBpbiByZWFkLW9ubHkgbW9kZS4gQW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBpcworICAgICAqIHRocm93biBpZiBhbnkgb2YgdGhlIHtAY29kZSB3cml0ZX0gbWV0aG9kcyBpcyBjYWxsZWQuPC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+e0Bjb2RlICJydyJ9PC90ZD4KKyAgICAgKiA8dGQ+VGhlIGZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiBJZiB0aGUgZmlsZSBkb2VzIG5vdAorICAgICAqIGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuPC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+e0Bjb2RlICJyd3MifTwvdGQ+CisgICAgICogPHRkPlRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gRXZlcnkgY2hhbmdlIG9mIHRoZQorICAgICAqIGZpbGUncyBjb250ZW50IG9yIG1ldGFkYXRhIG11c3QgYmUgd3JpdHRlbiBzeW5jaHJvbm91c2x5IHRvIHRoZSB0YXJnZXQKKyAgICAgKiBkZXZpY2UuPC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+e0Bjb2RlICJyd2QifTwvdGQ+CisgICAgICogPHRkPlRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gRXZlcnkgY2hhbmdlIG9mIHRoZQorICAgICAqIGZpbGUncyBjb250ZW50IG11c3QgYmUgd3JpdHRlbiBzeW5jaHJvbm91c2x5IHRvIHRoZSB0YXJnZXQgZGV2aWNlLjwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8L3RhYmxlPgorICAgICAqIDwvcD4KICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgdGhlIEZpbGUgdG8gb3Blbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIG9wZW4uCiAgICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiAgICAgICAgICAgICJyIiBmb3IgcmVhZCBvbmx5LCBvciAicnciIGZvciByZWFkL3dyaXRlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgYWNjZXNzIDxhIGhyZWY9IiNhY2Nlc3Ntb2RlIj5tb2RlPC9hPiwgZWl0aGVyIHtAY29kZQorICAgICAqICAgICAgICAgICAgInIifSwge0Bjb2RlICJydyJ9LCB7QGNvZGUgInJ3cyJ9IG9yIHtAY29kZSAicndkIn0uCiAgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgPGNvZGU+bW9kZTwvY29kZT4gaXMgaW5jb3JyZWN0IG9yIHRoZSBGaWxlIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgIG9wZW5lZCBpbiB0aGUgcmVxdWVzdGVkIDxjb2RlPm1vZGU8L2NvZGU+LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgb3IgY3JlYXRlZCBhY2NvcmRpbmcgdG8ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgbW9kZX0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbW9kZX0gaXMgbm90IHtAY29kZSAiciJ9LCB7QGNvZGUgInJ3In0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgICJyd3MifSBvciB7QGNvZGUgInJ3ZCJ9LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcworICAgICAqICAgICAgICAgICAgIGFjY2VzcyByZXF1ZXN0IGFjY29yZGluZyB0byB7QGNvZGUgbW9kZX0uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChGaWxlRGVzY3JpcHRvcikKICAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShGaWxlRGVzY3JpcHRvcikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmFuZG9tQWNjZXNzRmlsZShGaWxlIGZpbGUsIFN0cmluZyBtb2RlKQogICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7CiAKLSAgICAgICAgaW50IG9wdGlvbnMgPSAwOworICAgICAgICBvcHRpb25zID0gMDsKICAgICAgICAgCiAgICAgICAgIGZkID0gbmV3IEZpbGVEZXNjcmlwdG9yKCk7CiAgICAgICAgCkBAIC0xMDcsOCArMTQ1LDYgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgZmQuZGVzY3JpcHRvciA9IGZpbGVTeXN0ZW0ub3BlbihmaWxlLnByb3BlclBhdGgodHJ1ZSksIG9wdGlvbnMpOwotICAgICAgICBjaGFubmVsID0gRmlsZUNoYW5uZWxGYWN0b3J5LmdldEZpbGVDaGFubmVsKHRoaXMsIGZkLmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgb3B0aW9ucyk7CiAKICAgICAgICAgLy8gaWYgd2UgYXJlIGluICJyd3MiIG1vZGUsIGF0dGVtcHQgdG8gc3luYyBmaWxlK21ldGFkYXRhCiAgICAgICAgIGlmIChzeW5jTWV0YWRhdGEpIHsKQEAgLTExOSwyNiArMTU1LDMxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBSYW5kb21BY2Nlc3NGaWxlIG9uIHRoZSBmaWxlIG5hbWVkIDxjb2RlPmZpbGVOYW1lPC9jb2RlPgotICAgICAqIGFuZCBvcGVucyBpdCBhY2NvcmRpbmcgdG8gdGhlIGFjY2VzcyBTdHJpbmcgaW4gPGNvZGU+bW9kZTwvY29kZT4uIFRoZQotICAgICAqIGZpbGUgbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIHRvIHRoZSBTeXN0ZW0gcHJvcGVydHkKLSAgICAgKiA8Y29kZT4idXNlci5kaXIiPC9jb2RlPi4gVGhlIGFjY2VzcyBtb2RlIG1heSBiZSBvbmUgb2YKLSAgICAgKiA8Y29kZT4iciI8L2NvZGU+IGZvciByZWFkIGFjY2VzcyBvbmx5LCBvciA8Y29kZT4icnciPC9jb2RlPiBmb3IKLSAgICAgKiByZWFkL3dyaXRlIGFjY2Vzcy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBSYW5kb21BY2Nlc3NGaWxlfSBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lZCB7QGNvZGUKKyAgICAgKiBmaWxlTmFtZX0gYW5kIG9wZW5zIGl0IGFjY29yZGluZyB0byB0aGUgYWNjZXNzIHN0cmluZyBpbiB7QGNvZGUgbW9kZX0uCisgICAgICogVGhlIGZpbGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFic29sdXRlbHkgb3IgcmVsYXRpdmUgdG8gdGhlIHN5c3RlbQorICAgICAqIHByb3BlcnR5IHtAY29kZSAidXNlci5kaXIifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0byBvcGVuLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gb3Blbi4KICAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgICAgICAgICAgInIiIGZvciByZWFkIG9ubHksIG9yICJydyIgZm9yIHJlYWQvd3JpdGUuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBhY2Nlc3MgPGEgaHJlZj0iI2FjY2Vzc21vZGUiPm1vZGU8L2E+LCBlaXRoZXIge0Bjb2RlCisgICAgICogICAgICAgICAgICAiciJ9LCB7QGNvZGUgInJ3In0sIHtAY29kZSAicndzIn0gb3Ige0Bjb2RlICJyd2QifS4KICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSA8Y29kZT5tb2RlPC9jb2RlPiBpcyBpbmNvcnJlY3Qgb3IgdGhlIGZpbGUgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgb3BlbmVkIGluIHRoZSByZXF1ZXN0ZWQgPGNvZGU+bW9kZTwvY29kZT4uCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBvciBjcmVhdGVkIGFjY29yZGluZyB0byB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBtb2RlfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBtb2RlfSBpcyBub3Qge0Bjb2RlICJyIn0sIHtAY29kZSAicncifSwge0Bjb2RlCisgICAgICogICAgICAgICAgICAgInJ3cyJ9IG9yIHtAY29kZSAicndkIn0uCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzCisgICAgICogICAgICAgICAgICAgYWNjZXNzIHJlcXVlc3QgYWNjb3JkaW5nIHRvIHtAY29kZSBtb2RlfS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKEZpbGVEZXNjcmlwdG9yKQogICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1dyaXRlKEZpbGVEZXNjcmlwdG9yKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSYW5kb21BY2Nlc3NGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIG1vZGUpCiAgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKQEAgLTE0Niw2MyArMTg3LDc1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyBSYW5kb21BY2Nlc3NGaWxlLgorICAgICAqIENsb3NlcyB0aGlzIGZpbGUuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgUmFuZG9tQWNjZXNzRmlsZS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIGZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzeW5jaHJvbml6ZWQgKGNoYW5uZWwpIHsKLSAgICAgICAgICAgIGlmIChjaGFubmVsLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwgJiYgY2hhbm5lbC5pc09wZW4oKSkgeworICAgICAgICAgICAgICAgIGNoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmZCAhPSBudWxsICYmIGZkLmRlc2NyaXB0b3IgPj0gMCkgewogICAgICAgICAgICAgICAgIGZpbGVTeXN0ZW0uY2xvc2UoZmQuZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgZmQuZGVzY3JpcHRvciA9IC0xOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBGaWxlQ2hhbm5lbCBlcXVpdmFsZW50IHRvIHRoaXMgc3RyZWFtLgorICAgICAqIEdldHMgdGhpcyBmaWxlJ3Mge0BsaW5rIEZpbGVDaGFubmVsfSBvYmplY3QuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGZpbGUgY2hhbm5lbCBpcyB3cml0ZS1vbmx5IGFuZCBoYXMgYW4gaW5pdGlhbCBwb3NpdGlvbiB3aXRoaW4gdGhlCi0gICAgICogZmlsZSB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgRmlsZU91dHB1dFN0cmVhbQotICAgICAqIHdpdGhpbiB0aGUgZmlsZS4gQWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3Igc3RhdGUKLSAgICAgKiB2aWEgdGhlIGNoYW5uZWwgYXJlIHZpc2libGUgYnkgdGhlIG91dHB1dCBzdHJlYW0gYW5kIHZpY2UgdmVyc2EuCisgICAgICogVGhlIGZpbGUgY2hhbm5lbCdzIHtAbGluayBGaWxlQ2hhbm5lbC4jcG9zaXRpb24oKSBwb3NpdGlvbn0gaXMgdGhlIHNhbWUKKyAgICAgKiBhcyB0aGlzIGZpbGUncyBmaWxlIHBvaW50ZXIgb2Zmc2V0IChzZWUge0BsaW5rICNnZXRGaWxlUG9pbnRlcigpfSkuIEFueQorICAgICAqIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUncyBmaWxlIHBvaW50ZXIgb2Zmc2V0IGFyZSBhbHNvIHZpc2libGUgaW4gdGhlCisgICAgICogZmlsZSBjaGFubmVsJ3MgcG9zaXRpb24gYW5kIHZpY2UgdmVyc2EuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBGaWxlT3V0cHV0U3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhpcyBmaWxlJ3MgZmlsZSBjaGFubmVsIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgRmlsZUNoYW5uZWwgZ2V0Q2hhbm5lbCgpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgcHVibGljIGZpbmFsIEZpbGVDaGFubmVsIGdldENoYW5uZWwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZihjaGFubmVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gRmlsZUNoYW5uZWxGYWN0b3J5LmdldEZpbGVDaGFubmVsKHRoaXMsIGZkLmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFubmVsOworICAgICAgICB9CiAgICAgfQorICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEZpbGVEZXNjcmlwdG9yIHJlcHJlc2VudGluZyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZSBmb3IKLSAgICAgKiB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUuCisgICAgICogR2V0cyB0aGlzIGZpbGUncyB7QGxpbmsgRmlsZURlc2NyaXB0b3J9LiBUaGlzIHJlcHJlc2VudHMgdGhlIG9wZXJhdGluZworICAgICAqIHN5c3RlbSByZXNvdXJjZSBmb3IgdGhpcyByYW5kb20gYWNjZXNzIGZpbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgRmlsZURlc2NyaXB0b3IgZm9yIHRoaXMgUmFuZG9tQWNjZXNzRmlsZS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgZmlsZSdzIGZpbGUgZGVzY3JpcHRvciBvYmplY3QuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGdldCB0aGUgRmlsZURlc2NyaXB0b3Igb2YKLSAgICAgKiAgICAgICAgICAgICB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdldHRpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgRmlsZURlc2NyaXB0b3IgZ2V0RkQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZmQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhpcyBSYW5kb21BY2Nlc3NGaWxlLiBBbGwgcmVhZHMgYW5kCisgICAgICogR2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhpcyBmaWxlLiBBbGwgcmVhZHMgYW5kCiAgICAgICogd3JpdGVzIHRha2UgcGxhY2UgYXQgdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyIHBvc2l0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gZ2V0IHRoZSBmaWxlIHBvaW50ZXIKLSAgICAgKiAgICAgICAgICAgICBwb3NpdGlvbiBvZiB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdldHRpbmcgdGhlIGZpbGUgcG9pbnRlciBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG9wZW5DaGVjaygpOwpAQCAtMjIzLDEzICsyNzYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUgaW4gYnl0ZXMuCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgZmlsZSBpbiBieXRlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgbGVuZ3RoIGluIGJ5dGVzLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZpbGUncyBsZW5ndGggaW4gYnl0ZXMuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGdldCB0aGUgZmlsZSBsZW5ndGggb2YgdGhpcwotICAgICAqICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgbGVuZ3RoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgb3BlbkNoZWNrKCk7CkBAIC0yNDUsMTkgKzI5NywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcwotICAgICAqIGFuIGludC4gVGhlIGxvdy1vcmRlciBieXRlIGlzIHJldHVybmVkIG9yIC0xIG9mIHRoZSBlbmQgb2YgZmlsZSB3YXMKLSAgICAgKiBlbmNvdW50ZXJlZC4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBmaWxlIGFuZCByZXR1cm5zIGl0CisgICAgICogYXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDI1NS4gUmV0dXJucyAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqIGZpbGUgaGFzIGJlZW4gcmVhY2hlZC4gQmxvY2tzIHVudGlsIG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgZmlsZSBpcyBkZXRlY3RlZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcmVhZCBvciAtMSBpZiBlbmQgb2YgZmlsZS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhpcwotICAgICAqICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUuCi0gICAgICogCi0gICAgICogQHNlZSAjd3JpdGUoYnl0ZVtdKQotICAgICAqIEBzZWUgI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICogQHNlZSAjd3JpdGUoaW50KQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmlsZSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG9wZW5DaGVjaygpOwpAQCAtMjY5LDUyICszMTcsNTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoaXMgUmFuZG9tQWNjZXNzRmlsZSBpbnRvIHRoZSBieXRlIGFycmF5Ci0gICAgICogPGNvZGU+YnVmZmVyPC9jb2RlPi4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIGlzIHJldHVybmVkLgorICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBmaWxlIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUKKyAgICAgKiBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBjb3JyZXNwb25kcworICAgICAqIHRvIHRoZSBzaXplIG9mIHtAY29kZSBidWZmZXJ9LiBCbG9ja3MgdW50aWwgYXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4KKyAgICAgKiByZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gcmVhZCBieXRlcyBpbnRvCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIGZpbGUuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlCisgICAgICogICAgICAgICBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhpcwotICAgICAqICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUuCi0gICAgICogCi0gICAgICogQHNlZSAjd3JpdGUoYnl0ZVtdKQotICAgICAqIEBzZWUgI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICogQHNlZSAjd3JpdGUoaW50KQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmlsZSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGJ5dGVzIGZyb20gdGhpcyBSYW5kb21BY2Nlc3NGaWxlIGFuZAotICAgICAqIHN0b3JlcyB0aGVtIGluIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiBmaWxlIHdhcyBlbmNvdW50ZXJlZC4KKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBjb3VudH0gYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGlzIGZpbGUKKyAgICAgKiBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQge0Bjb2RlCisgICAgICogb2Zmc2V0fS4gQmxvY2tzIHVudGlsIHtAY29kZSBjb3VudH0gYnl0ZXMgaGF2ZSBiZWVuIHJlYWQsIHRoZSBlbmQgb2YgdGhlCisgICAgICogZmlsZSBpcyByZWFjaGVkIG9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQgZnJvbSB0aGlzIGZpbGUuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQKKyAgICAgKiAgICAgICAgICAgIGZyb20gdGhpcyBmaWxlLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIGZpbGUuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgICogICAgICAgICBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgY291bnQgPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgY291bnR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlLgotICAgICAqIAotICAgICAqIEBzZWUgI3dyaXRlKGJ5dGVbXSkKLSAgICAgKiBAc2VlICN3cml0ZShieXRlW10sIGludCwgaW50KQotICAgICAqIEBzZWUgI3dyaXRlKGludCkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBoYXZlIHRvIGhhdmUgZm91ciBjb21wYXJpc2lvbnMgdG8gbm90IG1pc3MgaW50ZWdlciBvdmVyZmxvdyBjYXNlcwotICAgICAgICBpZiAoY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0IHx8IGNvdW50IDwgMCB8fCBvZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LCB1c2VkIChvZmZzZXQgfCBjb3VudCkgPCAwCisgICAgICAgIC8vIGluc3RlYWQgb2YgKG9mZnNldCA8IDApIHx8IChjb3VudCA8IDApIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIGlmICgob2Zmc2V0IHwgY291bnQpIDwgMCB8fCBjb3VudCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAoMCA9PSBjb3VudCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTMyNSwxNCArMzgwLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBib29sZWFuIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogUmVhZHMgYSBib29sZWFuIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBmaWxlLiBCbG9ja3MgdW50aWwgb25lCisgICAgICogYnl0ZSBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgb3IgYW4gZXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0aGUgbmV4dCBib29sZWFuIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBib29sZWFuIHZhbHVlIGZyb20gdGhpcyBmaWxlLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGlzIGZpbGUgaXMgZGV0ZWN0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZUJvb2xlYW4oYm9vbGVhbikKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3cml0ZUJvb2xlYW4oYm9vbGVhbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZWFkQm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCB0ZW1wID0gdGhpcy5yZWFkKCk7CkBAIC0zNDMsMTQgKzQwMSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGFuIDgtYml0IGJ5dGUgdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhbiA4LWJpdCBieXRlIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBmaWxlLiBCbG9ja3MgdW50aWwKKyAgICAgKiBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgb3IgYW4gZXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYnl0ZSB0aGUgbmV4dCBieXRlIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBzaWduZWQgOC1iaXQgYnl0ZSB2YWx1ZSBmcm9tIHRoaXMgZmlsZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVCeXRlKGludCkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3cml0ZUJvb2xlYW4oYm9vbGVhbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCB0ZW1wID0gdGhpcy5yZWFkKCk7CkBAIC0zNjEsMTUgKzQyMiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgMTYtYml0IGNoYXJhY3RlciB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIFJlYWRzIGEgMTYtYml0IGNoYXJhY3RlciBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoaXMgZmlsZS4gQmxvY2tzIHVudGlsCisgICAgICogdHdvIGJ5dGVzIGhhdmUgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgb3IgYW4gZXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gY2hhciB0aGUgbmV4dCA8Y29kZT5jaGFyPC9jb2RlPiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY2hhciB2YWx1ZSBmcm9tIHRoaXMgZmlsZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVDaGFyKGludCkKLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3cml0ZUNoYXIoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgICAKICAgICBwdWJsaWMgZmluYWwgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsyXTsKICAgICAgICAgaWYgKHJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSAhPSBidWZmZXIubGVuZ3RoKSB7CkBAIC0zNzksNjkgKzQ0Myw4MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgNjQtYml0IDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIDY0LWJpdCBkb3VibGUgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGlzIGZpbGUuIEJsb2NrcworICAgICAqIHVudGlsIGVpZ2h0IGJ5dGVzIGhhdmUgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgb3IgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gZG91YmxlIHRoZSBuZXh0IDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgZnJvbSB0aGUgc291cmNlCi0gICAgICogICAgICAgICBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBkb3VibGUgdmFsdWUgZnJvbSB0aGlzIGZpbGUuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoaXMgZmlsZSBpcyBkZXRlY3RlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlRG91YmxlKGRvdWJsZSkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3cml0ZURvdWJsZShkb3VibGUpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRMb25nKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgMzItYml0IDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIFJlYWRzIGEgMzItYml0IGZsb2F0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBmaWxlLiBCbG9ja3MKKyAgICAgKiB1bnRpbCBmb3VyIGJ5dGVzIGhhdmUgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgb3IgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gZmxvYXQgdGhlIG5leHQgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBmbG9hdCB2YWx1ZSBmcm9tIHRoaXMgZmlsZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVGbG9hdChmbG9hdCkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3cml0ZUZsb2F0KGZsb2F0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gRmxvYXQuaW50Qml0c1RvRmxvYXQocmVhZEludCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoaXMgc3RyZWFtIGludG8gdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPi4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIDxjb2RlPmJ1ZmZlci5sZW5ndGg8L2NvZGU+IG51bWJlciBvZiBieXRlcwotICAgICAqIGhhdmUgYmVlbiByZWFkLgorICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhpcyBmaWxlIGludG8ge0Bjb2RlIGJ1ZmZlcn0uIEJsb2NrcyB1bnRpbCB7QGNvZGUKKyAgICAgKiBidWZmZXIubGVuZ3RofSBudW1iZXIgb2YgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQsIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMKKyAgICAgKiByZWFjaGVkIG9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byByZWFkIGJ5dGVzIGludG8KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gcmVhZCBieXRlcyBpbnRvLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGlzIGZpbGUgaXMgZGV0ZWN0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZShieXRlW10pCi0gICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZmZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJlYWRGdWxseShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWQgYnl0ZXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheQotICAgICAqIDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgb2Zmc2V0IDxjb2RlPm9mZnNldDwvY29kZT4uIFRoaXMKLSAgICAgKiBtZXRob2QgYmxvY2tzIHVudGlsIDxjb2RlPmNvdW50PC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuCisgICAgICogUmVhZCBieXRlcyBmcm9tIHRoaXMgZmlsZSBpbnRvIHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0IG9mZnNldCB7QGNvZGUKKyAgICAgKiBvZmZzZXR9LiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwge0Bjb2RlIGNvdW50fSBudW1iZXIgb2YgYnl0ZXMgaGF2ZSBiZWVuCisgICAgICogcmVhZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gcmVhZCBieXRlcyBpbnRvLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBieXRlcyByZWFkCisgICAgICogICAgICAgICAgICBmcm9tIHRoaXMgZmlsZS4KICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIHtAY29kZSBidWZmZXJ9LgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBvZiB0aGlzIGZpbGUgaXMgZGV0ZWN0ZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXQgKyBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIGJ1ZmZlcn0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgcHJvYmxlbSBvY2N1cnMgcmVhZGluZyBmcm9tIHRoaXMgRGF0YUlucHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YU91dHB1dCN3cml0ZShieXRlW10pCi0gICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZmZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTQ0OSwxMCArNTI0LDE1IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3cKLSAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCB8fCBjb3VudCA8IDAKLSAgICAgICAgICAgICAgICB8fCBjb3VudCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMAorICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAoY291bnQgPCAwKSB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKChvZmZzZXQgfCBjb3VudCkgPCAwIHx8IGNvdW50ID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwMmYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKICAgICAgICAgICAgIGludCByZXN1bHQgPSByZWFkKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgewpAQCAtNDY0LDE0ICs1NDQsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gdGhpcyBzdHJlYW0uCisgICAgICogUmVhZHMgYSAzMi1iaXQgaW50ZWdlciBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoaXMgZmlsZS4gQmxvY2tzCisgICAgICogdW50aWwgZm91ciBieXRlcyBoYXZlIGJlZW4gcmVhZCwgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkIG9yIGFuCisgICAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgbmV4dCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBpbnQgdmFsdWUgZnJvbSB0aGlzIGZpbGUuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoaXMgZmlsZSBpcyBkZXRlY3RlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlSW50KGludCkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3cml0ZUludChpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCByZWFkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzRdOwpAQCAtNDgzLDE4ICs1NjYsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIG5leHQgbGluZSBvZiB0ZXh0Ci0gICAgICogYXZhaWxhYmxlIGluIHRoaXMgQnVmZmVyZWRSZWFkZXIuIEEgbGluZSBpcyByZXByZXNlbnRlZCBieSAwIG9yIG1vcmUKLSAgICAgKiBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IDxjb2RlPidcbic8L2NvZGU+LCA8Y29kZT4nXHInPC9jb2RlPiwKLSAgICAgKiA8Y29kZT4iXG5cciI8L2NvZGU+IG9yIGVuZCBvZiBzdHJlYW0uIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGRvZXMKLSAgICAgKiBub3QgaW5jbHVkZSB0aGUgbmV3bGluZSBzZXF1ZW5jZS4KKyAgICAgKiBSZWFkcyBhIGxpbmUgb2YgdGV4dCBmb3JtIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoaXMgZmlsZS4gQSBsaW5lIGlzCisgICAgICogcmVwcmVzZW50ZWQgYnkgemVybyBvciBtb3JlIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkge0Bjb2RlICdcbid9LCB7QGNvZGUKKyAgICAgKiAnXHInfSwge0Bjb2RlICJcclxuIn0gb3IgdGhlIGVuZCBvZiBmaWxlIG1hcmtlci4gVGhlIHN0cmluZyBkb2VzIG5vdAorICAgICAqIGluY2x1ZGUgdGhlIGxpbmUgdGVybWluYXRpbmcgc2VxdWVuY2UuCisgICAgICogPHA+CisgICAgICogQmxvY2tzIHVudGlsIGEgbGluZSB0ZXJtaW5hdGluZyBzZXF1ZW5jZSBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZQorICAgICAqIGZpbGUgaXMgcmVhY2hlZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgb3IgbnVsbCBpZiBubyBjaGFyYWN0ZXJzIHdlcmUKLSAgICAgKiAgICAgICAgIHJlYWQgYmVmb3JlIGVuZCBvZiBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGNoYXJhY3RlcnMgaGF2ZQorICAgICAqICAgICAgICAgYmVlbiByZWFkIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBCdWZmZXJlZFJlYWRlciBpcyBhbHJlYWR5IGNsb3NlZCBvciBzb21lIG90aGVyIElPCi0gICAgICogICAgICAgICAgICAgZXJyb3Igb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmlsZSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmdCdWlsZGVyIGxpbmUgPSBuZXcgU3RyaW5nQnVpbGRlcig4MCk7IC8vIFR5cGljYWwgbGluZSBsZW5ndGgKQEAgLTUyNywxNCArNjEyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSA2NC1iaXQgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIDY0LWJpdCBsb25nIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBmaWxlLiBCbG9ja3MgdW50aWwKKyAgICAgKiBlaWdodCBieXRlcyBoYXZlIGJlZW4gcmVhZCwgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkIG9yIGFuCisgICAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxvbmcgdGhlIG5leHQgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGxvbmcgdmFsdWUgZnJvbSB0aGlzIGZpbGUuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoaXMgZmlsZSBpcyBkZXRlY3RlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlTG9uZyhsb25nKQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmlsZSBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgI3dyaXRlTG9uZyhsb25nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzhdOwpAQCAtNTUwLDE0ICs2MzgsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIDE2LWJpdCA8Y29kZT5zaG9ydDwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbS4KKyAgICAgKiBSZWFkcyBhIDE2LWJpdCBzaG9ydCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoaXMgZmlsZS4gQmxvY2tzIHVudGlsCisgICAgICogdHdvIGJ5dGVzIGhhdmUgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgb3IgYW4gZXhjZXB0aW9uCisgICAgICogaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gc2hvcnQgdGhlIG5leHQgPGNvZGU+c2hvcnQ8L2NvZGU+IHZhbHVlIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBzaG9ydCB2YWx1ZSBmcm9tIHRoaXMgZmlsZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVTaG9ydChpbnQpCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSAjd3JpdGVTaG9ydChpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHNob3J0IHJlYWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsyXTsKQEAgLTU2OCwxNSArNjU5LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYW4gdW5zaWduZWQgOC1iaXQgPGNvZGU+Ynl0ZTwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbSBhbmQKLSAgICAgKiByZXR1cm5zIGl0IGFzIGFuIGludC4KKyAgICAgKiBSZWFkcyBhbiB1bnNpZ25lZCA4LWJpdCBieXRlIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyBmaWxlIGFuZAorICAgICAqIHJldHVybnMgaXQgYXMgYW4gaW50ZWdlci4gQmxvY2tzIHVudGlsIG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgZmlsZSBpcyByZWFjaGVkIG9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIG5leHQgdW5zaWduZWQgYnl0ZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdW5zaWduZWQgYnl0ZSB2YWx1ZSBmcm9tIHRoaXMgZmlsZSBhcyBhbiBpbnQuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5kIG9mIHRoaXMgZmlsZSBpcyBkZXRlY3RlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VycyByZWFkaW5nIGZyb20gdGhpcyBEYXRhSW5wdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHNlZSBEYXRhT3V0cHV0I3dyaXRlQnl0ZShpbnQpCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSAjd3JpdGVCeXRlKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgdGVtcCA9IHRoaXMucmVhZCgpOwpAQCAtNTg3LDE2ICs2ODAsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIDE2LWJpdCB1bnNpZ25lZCA8Y29kZT5zaG9ydDwvY29kZT4gdmFsdWUgZnJvbSB0aGlzIHN0cmVhbSBhbmQKLSAgICAgKiByZXR1cm5zIGl0IGFzIGFuIGludC4KKyAgICAgKiBSZWFkcyBhbiB1bnNpZ25lZCAxNi1iaXQgc2hvcnQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGlzIGZpbGUgYW5kCisgICAgICogcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyLiBCbG9ja3MgdW50aWwgdHdvIGJ5dGVzIGhhdmUgYmVlbiByZWFkLCB0aGUgZW5kIG9mCisgICAgICogdGhlIGZpbGUgaXMgcmVhY2hlZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSBuZXh0IHVuc2lnbmVkIDxjb2RlPnNob3J0PC9jb2RlPiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UKLSAgICAgKiAgICAgICAgIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHVuc2lnbmVkIHNob3J0IHZhbHVlIGZyb20gdGhpcyBmaWxlIGFzIGFuIGludC4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVTaG9ydChpbnQpCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSAjd3JpdGVTaG9ydChpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCByZWFkVW5zaWduZWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsyXTsKQEAgLTYwNywxNCArNzAxLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBVVEYgZm9ybWF0IFN0cmluZyBmcm9tIHRoaXMgU3RyZWFtLgorICAgICAqIFJlYWRzIGEgc3RyaW5nIHRoYXQgaXMgZW5jb2RlZCBpbiB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fSBmcm9tCisgICAgICogdGhpcyBmaWxlLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSByZWFkIGZvciB0aGUgY29tcGxldGUgc3RyaW5nCisgICAgICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgdHdvIGJ5dGVzIHJlYWQgZnJvbSB0aGUgZmlsZS4gQmxvY2tzIHVudGlsIGFsbAorICAgICAqIHJlcXVpcmVkIGJ5dGVzIGhhdmUgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgb3IgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuZXh0IFVURiBTdHJpbmcgZnJvbSB0aGUgc291cmNlIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHN0cmluZyBlbmNvZGVkIGluIHtAbGluayBEYXRhSW5wdXQgbW9kaWZpZWQgVVRGLTh9IGZyb20KKyAgICAgKiAgICAgICAgIHRoaXMgZmlsZS4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGlzIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHByb2JsZW0gb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGlzIERhdGFJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFPdXRwdXQjd3JpdGVVVEYoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFVURkRhdGFGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYnl0ZXMgcmVhZCBjYW5ub3QgYmUgZGVjb2RlZCBpbnRvIGEgY2hhcmFjdGVyIHN0cmluZy4KKyAgICAgKiBAc2VlICN3cml0ZVVURihTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyByZWFkVVRGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IHV0ZlNpemUgPSByZWFkVW5zaWduZWRTaG9ydCgpOwpAQCAtNjI5LDE1ICs3MzEsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWVrcyB0byB0aGUgcG9zaXRpb24gPGNvZGU+cG9zPC9jb2RlPiBpbiB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUuIEFsbAotICAgICAqIHJlYWQvd3JpdGUvc2tpcCBtZXRob2RzIHNlbnQgd2lsbCBiZSByZWxhdGl2ZSB0byA8Y29kZT5wb3M8L2NvZGU+LgorICAgICAqIE1vdmVzIHRoaXMgZmlsZSdzIGZpbGUgcG9pbnRlciB0byBhIG5ldyBwb3NpdGlvbiwgZnJvbSB3aGVyZSBmb2xsb3dpbmcKKyAgICAgKiB7QGNvZGUgcmVhZH0sIHtAY29kZSB3cml0ZX0gb3Ige0Bjb2RlIHNraXB9IG9wZXJhdGlvbnMgYXJlIGRvbmUuIFRoZQorICAgICAqIHBvc2l0aW9uIG1heSBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBmaWxlLCBidXQgdGhlCisgICAgICogZmlsZSdzIGxlbmd0aCB3aWxsIG9ubHkgY2hhbmdlIGlmIHRoZSBtb3Zpbmcgb2YgdGhlIHBvaW50ZXIgaXMgZm9sbG93ZWQKKyAgICAgKiBieSBhIHtAY29kZSB3cml0ZX0gb3BlcmF0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIGZpbGUgcG9pbnRlciBwb3NpdGlvbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZmlsZSBpcyBjbG9zZWQsIHtAY29kZSBwb3MgPCAwfSBvciBhbm90aGVyIEkvTyBlcnJvcgogICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAocG9zIDwgMCkgewpAQCAtNjUxLDE3ICs3NTYsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxlbmd0aCBvZiB0aGlzIGZpbGUgdG8gYmUgPGNvZGU+bmV3TGVuZ3RoPC9jb2RlPi4gSWYgdGhlCi0gICAgICogY3VycmVudCBmaWxlIGlzIHNtYWxsZXIsIGl0IHdpbGwgYmUgZXhwYW5kZWQgYW5kIHRoZSBmaWxlUG9zaXRpb24gd2lsbCBiZQotICAgICAqIHNldCB0byB0aGUgbmV3IGZpbGUgbGVuZ3RoLiBJZiB0aGUgPGNvZGU+bmV3TGVuZ3RoPC9jb2RlPiBpcyBzbWFsbGVyCi0gICAgICogdGhlbiB0aGUgZmlsZSB3aWxsIGJlIHRydW5jYXRlZC4KKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhpcyBmaWxlIHRvIHtAY29kZSBuZXdMZW5ndGh9LiBJZiB0aGUgY3VycmVudCBmaWxlIGlzCisgICAgICogc21hbGxlciwgaXQgaXMgZXhwYW5kZWQgYnV0IHRoZSBjb250ZW50cyBmcm9tIHRoZSBwcmV2aW91cyBlbmQgb2YgdGhlCisgICAgICogZmlsZSB0byB0aGUgbmV3IGVuZCBhcmUgdW5kZWZpbmVkLiBUaGUgZmlsZSBpcyB0cnVuY2F0ZWQgaWYgaXRzIGN1cnJlbnQKKyAgICAgKiBzaXplIGlzIGJpZ2dlciB0aGFuIHtAY29kZSBuZXdMZW5ndGh9LiBJZiB0aGUgY3VycmVudCBmaWxlIHBvaW50ZXIKKyAgICAgKiBwb3NpdGlvbiBpcyBpbiB0aGUgdHJ1bmNhdGVkIHBhcnQsIGl0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdMZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIGZpbGUgbGVuZ3RoCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGZpbGUgbGVuZ3RoIGluIGJ5dGVzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5ld0xlbmd0aCA8IDB9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIG9yIGFub3RoZXIgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGVuZ3RoKGxvbmcgbmV3TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBvcGVuQ2hlY2soKTsKQEAgLTY4MiwxNyArNzg5LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2tpcHMgPGNvZGU+Y291bnQ8L2NvZGU+IG51bWJlciBvZiBieXRlcyBpbiB0aGlzIHN0cmVhbS4gU3Vic2VxdWVudAotICAgICAqIDxjb2RlPnJlYWQoKTwvY29kZT4ncyB3aWxsIG5vdCByZXR1cm4gdGhlc2UgYnl0ZXMgdW5sZXNzCi0gICAgICogPGNvZGU+cmVzZXQoKTwvY29kZT4gaXMgdXNlZC4KKyAgICAgKiBTa2lwcyBvdmVyIHtAY29kZSBjb3VudH0gYnl0ZXMgaW4gdGhpcyBmaWxlLiBMZXNzIHRoYW4ge0Bjb2RlIGNvdW50fQorICAgICAqIGJ5dGVzIGFyZSBza2lwcGVkIGlmIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgcmVhY2hlZCBvciBhbiBleGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24gZHVyaW5nIHRoZSBvcGVyYXRpb24uIE5vdGhpbmcgaXMgZG9uZSBpZiB7QGNvZGUgY291bnR9IGlzCisgICAgICogbmVnYXRpdmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvdW50CiAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNraXBwZWQuCi0gICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQgb3IgYW5vdGhlciBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHNraXBCeXRlcyhpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjb3VudCA+IDApIHsKQEAgLTcwNiw1MiArODEzLDYzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiB0bwotICAgICAqIHRoaXMgUmFuZG9tQWNjZXNzRmlsZSBzdGFydGluZyBhdCB0aGUgY3VycmVudCBmaWxlIHBvaW50ZXIuCisgICAgICogV3JpdGVzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gdG8gdGhpcyBmaWxlLAorICAgICAqIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgdHJ5aW5nIHRvIHdyaXRlIHRvIHRoaXMgUmFuZG9tQWNjZXNzRmlsZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNyZWFkKCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBmaWxlLgogICAgICAqIEBzZWUgI3JlYWQoYnl0ZVtdKQotICAgICAqIEBzZWUgI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKiBAc2VlICNyZWFkKGJ5dGVbXSxpbnQsaW50KQorICAgICAqIEBzZWUgI3JlYWRGdWxseShieXRlW10pCisgICAgICogQHNlZSAjcmVhZEZ1bGx5KGJ5dGVbXSxpbnQsaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmNvdW50PC9jb2RlPiBieXRlcyBmcm9tIHRoZSBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4KLSAgICAgKiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHRvIHRoaXMgUmFuZG9tQWNjZXNzRmlsZSBzdGFydGluZyBhdAotICAgICAqIHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlci4uCisgICAgICogV3JpdGVzIHtAY29kZSBjb3VudH0gYnl0ZXMgZnJvbSB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYnVmZmVyfSB0byB0aGlzCisgICAgICogZmlsZSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyIGFuZCB1c2luZyB7QGNvZGUgb2Zmc2V0fSBhcworICAgICAqIHRoZSBmaXJzdCBwb3NpdGlvbiB3aXRoaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gZ2V0IGJ5dGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlcyB0byBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIHRoaXMgZmlsZS4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmZmVyIHRvIGdldCBieXRlcworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB7QGNvZGUgYnVmZmVyfSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBvZmZzZXQgb3IgY291bnQgYXJlIG91dHNpZGUgb2YgYm91bmRzLgotICAgICAqIAotICAgICAqIEBzZWUgI3JlYWQoKQotICAgICAqIEBzZWUgI3JlYWQoYnl0ZVtdKQorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb3VudCA8IDB9LCB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGNvdW50ICsKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB7QGNvZGUgYnVmZmVyfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgZmlsZS4KICAgICAgKiBAc2VlICNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogQHNlZSAjcmVhZEZ1bGx5KGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0IHx8IGNvdW50IDwgMCB8fCBvZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gbWFkZSBpbXBsaWNpdCBudWxsIGNoZWNrIGV4cGxpY2l0LAorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgdXNlZCAob2Zmc2V0IHwgY291bnQpIDwgMAorICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAoY291bnQgPCAwKSB0byBzYWZlIG9uZSBvcGVyYXRpb24KKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQorICAgICAgICBpZiAoKG9mZnNldCB8IGNvdW50KSA8IDAgfHwgY291bnQgPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgIG9wZW5DaGVjaygpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcG9zaXRpb25Mb2NrKSB7CiAgICAgICAgICAgICBmaWxlU3lzdGVtLndyaXRlKGZkLmRlc2NyaXB0b3IsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CiAgICAgICAgIH0KQEAgLTc2MywyMCArODgxLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgYnl0ZSA8Y29kZT5vbmVCeXRlPC9jb2RlPiB0byB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUKLSAgICAgKiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBmaWxlIHBvaW50ZXIuIE9ubHkgdGhlIGxvdyBvcmRlciBieXRlIG9mCi0gICAgICogPGNvZGU+b25lQnl0ZTwvY29kZT4gaXMgd3JpdHRlbi4KKyAgICAgKiBXcml0ZXMgYSBieXRlIHRvIHRoaXMgZmlsZSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyLiBPbmx5CisgICAgICogdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdGhlIGludGVnZXIge0Bjb2RlIG9uZUJ5dGV9IGlzIHdyaXR0ZW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9uZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIHdyaXRlIHRvIHRoaXMgZmlsZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICogQHNlZSAjcmVhZCgpCi0gICAgICogQHNlZSAjcmVhZChieXRlW10pCi0gICAgICogQHNlZSAjcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBvbmVCeXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBvcGVuQ2hlY2soKTsKQEAgLTc5Myw1MiArOTA2LDQ4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgYm9vbGVhbiB0byB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgYm9vbGVhbiB0byB0aGlzIGZpbGUsIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB0byB3cml0ZSB0byB0aGlzIGZpbGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRCb29sZWFuKCkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGZpbGUgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlICNyZWFkQm9vbGVhbigpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVCb29sZWFuKGJvb2xlYW4gdmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZSh2YWwgPyAxIDogMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgOC1iaXQgYnl0ZSB0byB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGVzIGFuIDgtYml0IGJ5dGUgdG8gdGhpcyBmaWxlLCBzdGFydGluZyBhdCB0aGUgY3VycmVudCBmaWxlIHBvaW50ZXIuCisgICAgICogT25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGUgaW50ZWdlciB7QGNvZGUgdmFsfSBpcyB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBPdXRwdXRTdHJlYW0KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIHdyaXRlIHRvIHRoaXMgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBmaWxlIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICogQHNlZSAjcmVhZEJ5dGUoKQogICAgICAqIEBzZWUgI3JlYWRVbnNpZ25lZEJ5dGUoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZShpbnQgdmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZSh2YWwgJiAweEZGKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGxvdyBvcmRlciA4LWJpdCBieXRlcyBmcm9tIGEgU3RyaW5nIHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgdGhlIGxvdyBvcmRlciA4LWJpdCBieXRlcyBmcm9tIGEgc3RyaW5nIHRvIHRoaXMgZmlsZSwgc3RhcnRpbmcgYXQKKyAgICAgKiB0aGUgY3VycmVudCBmaWxlIHBvaW50ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyBjb250YWluaW5nIHRoZSBieXRlcyB0byB3cml0ZSB0byB0aGUgT3V0cHV0U3RyZWFtCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgZmlsZQogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBmaWxlLgogICAgICAqIEBzZWUgI3JlYWQoYnl0ZVtdKQogICAgICAqIEBzZWUgI3JlYWQoYnl0ZVtdLGludCxpbnQpCiAgICAgICogQHNlZSAjcmVhZEZ1bGx5KGJ5dGVbXSkKICAgICAgKiBAc2VlICNyZWFkRnVsbHkoYnl0ZVtdLGludCxpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVCeXRlcyhTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVtzdHIubGVuZ3RoKCldOwpAQCAtODQ4LDE5ICs5NTcsMTggQEAKICAgICAgICAgd3JpdGUoYnl0ZXMpOwogICAgIH0KIAorCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgMTYtYml0IGNoYXJhY3RlciB0byB0aGUgT3V0cHV0U3RyZWFtLiBPbmx5IHRoZSBsb3dlcgotICAgICAqIDIgYnl0ZXMgYXJlIHdyaXR0ZW4gd2l0aCB0aGUgaGlnaGVyIG9mIHRoZSAyIGJ5dGVzIHdyaXR0ZW4gZmlyc3QuIFRoaXMKLSAgICAgKiByZXByZXNlbnRzIHRoZSBVbmljb2RlIHZhbHVlIG9mIHZhbC4KKyAgICAgKiBXcml0ZXMgYSAxNi1iaXQgY2hhcmFjdGVyIHRvIHRoaXMgZmlsZSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgZmlsZQorICAgICAqIHBvaW50ZXIuIE9ubHkgdGhlIHR3byBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgaW50ZWdlciB7QGNvZGUgdmFsfQorICAgICAqIGFyZSB3cml0dGVuLCB3aXRoIHRoZSBoaWdoIGJ5dGUgZmlyc3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgY2hhciB0byB3cml0ZSB0byB0aGlzIGZpbGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRDaGFyKCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBmaWxlLgorICAgICAqIEBzZWUgI3JlYWRDaGFyKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUNoYXIoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzJdOwpAQCAtODcwLDE5ICs5NzgsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAxNi1iaXQgY2hhcmFjdGVycyBjb250YWluZWQgaW4gc3RyIHRvIHRoZQotICAgICAqIE91dHB1dFN0cmVhbS4gT25seSB0aGUgbG93ZXIgMiBieXRlcyBvZiBlYWNoIGNoYXJhY3RlciBhcmUgd3JpdHRlbiB3aXRoCi0gICAgICogdGhlIGhpZ2hlciBvZiB0aGUgMiBieXRlcyB3cml0dGVuIGZpcnN0LiBUaGlzIHJlcHJlc2VudHMgdGhlIFVuaWNvZGUKLSAgICAgKiB2YWx1ZSBvZiBlYWNoIGNoYXJhY3RlciBpbiBzdHIuCisgICAgICogV3JpdGVzIHRoZSAxNi1iaXQgY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nIHRvIHRoaXMgZmlsZSwgc3RhcnRpbmcgYXQgdGhlCisgICAgICogY3VycmVudCBmaWxlIHBvaW50ZXIuIEVhY2ggY2hhcmFjdGVyIGlzIHdyaXR0ZW4gaW4gdGhlIHNhbWUgd2F5IGFzIHdpdGgKKyAgICAgKiB7QGxpbmsgI3dyaXRlQ2hhcihpbnQpfSwgd2l0aCBpdHMgaGlnaCBieXRlIGZpcnN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgd2hvc2UgY2hhcmFjdGVycyBhcmUgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gd3JpdGUgdG8gdGhpcyBmaWxlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkQ2hhcigpCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgZmlsZS4KKyAgICAgKiBAc2VlICNyZWFkQ2hhcigpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVDaGFycyhTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBieXRlIG5ld0J5dGVzW10gPSBuZXcgYnl0ZVtzdHIubGVuZ3RoKCkgKiAyXTsKQEAgLTg5NSw1MSArMTAwMCw0OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIDY0LWJpdCBkb3VibGUgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLiBUaGUgcmVzdWx0aW5nIG91dHB1dCBpcyB0aGUKLSAgICAgKiA4IGJ5dGVzIHJlc3VsdGluZyBmcm9tIGNhbGxpbmcgRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoKS4KKyAgICAgKiBXcml0ZXMgYSA2NC1iaXQgZG91YmxlIHRvIHRoaXMgZmlsZSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgZmlsZQorICAgICAqIHBvaW50ZXIuIFRoZSBlaWdodCBieXRlcyByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBEb3VibGUjZG91YmxlVG9Mb25nQml0cyhkb3VibGUpfSBhcmUgd3JpdHRlbiB0byB0aGlzIGZpbGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byB3cml0ZSB0byB0aGlzIGZpbGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWREb3VibGUoKQorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB0aGlzIGZpbGUuCisgICAgICogQHNlZSAjcmVhZERvdWJsZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVMb25nKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHZhbCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIDMyLWJpdCBmbG9hdCB0byB0aGlzIG91dHB1dCBzdHJlYW0uIFRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHRoZQotICAgICAqIDQgYnl0ZXMgcmVzdWx0aW5nIGZyb20gY2FsbGluZyBGbG9hdC5mbG9hdFRvSW50Qml0cygpLgorICAgICAqIFdyaXRlcyBhIDMyLWJpdCBmbG9hdCB0byB0aGlzIGZpbGUsIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlci4KKyAgICAgKiBUaGUgZm91ciBieXRlcyByZXR1cm5lZCBieSB7QGxpbmsgRmxvYXQjZmxvYXRUb0ludEJpdHMoZmxvYXQpfSBhcmUKKyAgICAgKiB3cml0dGVuIHRvIHRoaXMgZmlsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byB3cml0ZSB0byB0aGlzIGZpbGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRGbG9hdCgpCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgZmlsZS4KKyAgICAgKiBAc2VlICNyZWFkRmxvYXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRmxvYXQoZmxvYXQgdmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZUludChGbG9hdC5mbG9hdFRvSW50Qml0cyh2YWwpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSAzMi1iaXQgaW50IHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4gVGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgdGhlIDQKLSAgICAgKiBieXRlcywgaGlnaGVzdCBvcmRlciBmaXJzdCwgb2YgdmFsLgorICAgICAqIFdyaXRlcyBhIDMyLWJpdCBpbnRlZ2VyIHRvIHRoaXMgZmlsZSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgZmlsZQorICAgICAqIHBvaW50ZXIuIFRoZSBmb3VyIGJ5dGVzIG9mIHRoZSBpbnRlZ2VyIGFyZSB3cml0dGVuIHdpdGggdGhlIGhpZ2hlc3QgYnl0ZQorICAgICAqIGZpcnN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gd3JpdGUgdG8gdGhpcyBmaWxlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkSW50KCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBmaWxlLgorICAgICAqIEBzZWUgI3JlYWRJbnQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlSW50KGludCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0XTsKQEAgLTk1MSwxNyArMTA1MywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIDY0LWJpdCBsb25nIHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4gVGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgdGhlIDgKLSAgICAgKiBieXRlcywgaGlnaGVzdCBvcmRlciBmaXJzdCwgb2YgdmFsLgorICAgICAqIFdyaXRlcyBhIDY0LWJpdCBsb25nIHRvIHRoaXMgZmlsZSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgZmlsZQorICAgICAqIHBvaW50ZXIuIFRoZSBlaWdodCBieXRlcyBvZiB0aGUgbG9uZyBhcmUgd3JpdHRlbiB3aXRoIHRoZSBoaWdoZXN0IGJ5dGUKKyAgICAgKiBmaXJzdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gd3JpdGUgdG8gdGhpcyBmaWxlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkTG9uZygpCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoaXMgZmlsZS4KKyAgICAgKiBAc2VlICNyZWFkTG9uZygpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb25nKGxvbmcgdmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbOF07CkBAIC05NzgsMzQgKzEwNzksMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCAxNi1iaXQgc2hvcnQgdG8gdGhlIE91dHB1dFN0cmVhbS4gT25seSB0aGUgbG93ZXIgMgotICAgICAqIGJ5dGVzIGFyZSB3cml0dGVuIHdpdGggdGhlIGhpZ2hlciBvZiB0aGUgMiBieXRlcyB3cml0dGVuIGZpcnN0LgorICAgICAqIFdyaXRlcyBhIDE2LWJpdCBzaG9ydCB0byB0aGlzIGZpbGUsIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGZpbGUKKyAgICAgKiBwb2ludGVyLiBPbmx5IHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIGludGVnZXIge0Bjb2RlIHZhbH0KKyAgICAgKiBhcmUgd3JpdHRlbiwgd2l0aCB0aGUgaGlnaCBieXRlIGZpcnN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB0byBiZSB3cml0dGVuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdG8gd3JpdGUgdG8gdGhpcyBmaWxlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkU2hvcnQoKQotICAgICAqIEBzZWUgRGF0YUlucHV0I3JlYWRVbnNpZ25lZFNob3J0KCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBmaWxlLgorICAgICAqIEBzZWUgI3JlYWRTaG9ydCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVTaG9ydChpbnQgdmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZUNoYXIodmFsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBTdHJpbmcgb3V0IGluIFVURiBmb3JtYXQuCisgICAgICogV3JpdGVzIGEgc3RyaW5nIGVuY29kZWQgd2l0aCB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fSB0byB0aGlzCisgICAgICogZmlsZSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gYmUgd3JpdHRlbiBpbiBVVEYgZm9ybWF0LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB3cml0ZSBpbiB7QGxpbmsgRGF0YUlucHV0IG1vZGlmaWVkIFVURi04fQorICAgICAqICAgICAgICAgICAgZm9ybWF0LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERhdGFJbnB1dCNyZWFkVVRGKCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhpcyBmaWxlLgorICAgICAqIEB0aHJvd3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBpcyBsb25nZXIgdGhhbiA2NTUzNSBieXRlcy4KKyAgICAgKiBAc2VlICNyZWFkVVRGKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVURihTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgdXRmQ291bnQgPSAwLCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9SZWFkZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1JlYWRlci5qYXZhCmluZGV4IGU1YTdiNzUuLjQyZmI5ZWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1JlYWRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1JlYWRlci5qYXZhCkBAIC0yMSwyMSArMjEsMzYgQEAKIGltcG9ydCBqYXZhLm5pby5SZWFkT25seUJ1ZmZlckV4Y2VwdGlvbjsKIAogLyoqCi0gKiBSZWFkZXIgaXMgYW4gQWJzdHJhY3QgY2xhc3MgZm9yIHJlYWRpbmcgQ2hhcmFjdGVyIFN0cmVhbXMuIFN1YmNsYXNzZXMgb2YKLSAqIFJlYWRlciBtdXN0IGltcGxlbWVudCB0aGUgbWV0aG9kcyA8Y29kZT5yZWFkKGNoYXJbXSwgaW50LCBpbnQpPC9jb2RlPiBhbmQKLSAqIDxjb2RlPmNsb3NlKCk8L2NvZGU+LgorICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCByZWFkZXJzLiBBIHJlYWRlciBpcyBhIG1lYW5zIG9mIHJlYWRpbmcgZGF0YSBmcm9tIGEKKyAqIHNvdXJjZSBpbiBhIGNoYXJhY3Rlci13aXNlIG1hbm5lci4gU29tZSByZWFkZXJzIGFsc28gc3VwcG9ydCBtYXJraW5nIGEKKyAqIHBvc2l0aW9uIGluIHRoZSBpbnB1dCBhbmQgcmV0dXJuaW5nIHRvIHRoaXMgcG9zaXRpb24gbGF0ZXIuCisgKiA8cD4KKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgZG9lcyBub3QgcHJvdmlkZSBhIGZ1bGx5IHdvcmtpbmcgaW1wbGVtZW50YXRpb24sIHNvIGl0CisgKiBuZWVkcyB0byBiZSBzdWJjbGFzc2VkLCBhbmQgYXQgbGVhc3QgdGhlIHtAbGluayAjcmVhZChjaGFyW10sIGludCwgaW50KX0gYW5kCisgKiB7QGxpbmsgI2Nsb3NlKCl9IG1ldGhvZHMgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbi4gT3ZlcnJpZGluZyBzb21lIG9mIHRoZQorICogbm9uLWFic3RyYWN0IG1ldGhvZHMgaXMgYWxzbyBvZnRlbiBhZHZpc2VkLCBzaW5jZSBpdCBtaWdodCByZXN1bHQgaW4gaGlnaGVyCisgKiBlZmZpY2llbmN5LgorICogPHA+CisgKiBNYW55IHNwZWNpYWxpemVkIHJlYWRlcnMgZm9yIHB1cnBvc2VzIGxpa2UgcmVhZGluZyBmcm9tIGEgZmlsZSBhbHJlYWR5IGV4aXN0CisgKiBpbiB0aGlzIHBhY2thZ2UuCiAgKiAKICAqIEBzZWUgV3JpdGVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVhZGVyIGltcGxlbWVudHMgUmVhZGFibGUsIENsb3NlYWJsZSB7CiAgICAgLyoqCiAgICAgICogVGhlIG9iamVjdCB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgcmVhZGVyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBPYmplY3QgbG9jazsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY2hhcmFjdGVyIHN0cmVhbSBSZWFkZXIgdXNpbmcgPGNvZGU+dGhpczwvY29kZT4gYXMgdGhlCi0gICAgICogT2JqZWN0IHRvIHN5bmNocm9uaXplIGNyaXRpY2FsIHJlZ2lvbnMgYXJvdW5kLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFJlYWRlcn0gd2l0aCB7QGNvZGUgdGhpc30gYXMgdGhlIG9iamVjdCB1c2VkIHRvCisgICAgICogc3luY2hyb25pemUgY3JpdGljYWwgc2VjdGlvbnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFJlYWRlcigpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTQzLDEyICs1OCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY2hhcmFjdGVyIHN0cmVhbSBSZWFkZXIgdXNpbmcgPGNvZGU+bG9jazwvY29kZT4gYXMgdGhlCi0gICAgICogT2JqZWN0IHRvIHN5bmNocm9uaXplIGNyaXRpY2FsIHJlZ2lvbnMgYXJvdW5kLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFJlYWRlcn0gd2l0aCB7QGNvZGUgbG9ja30gdXNlZCB0byBzeW5jaHJvbml6ZQorICAgICAqIGNyaXRpY2FsIHNlY3Rpb25zLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NrCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBzeW5jaHJvbml6ZSBjcml0aWNhbCByZWdpb25zCi0gICAgICogICAgICAgICAgICBhcm91bmQuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gdXNlZCB0byBzeW5jaHJvbml6ZSBjcml0aWNhbCBzZWN0aW9ucy4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxvY2t9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmVhZGVyKE9iamVjdCBsb2NrKSB7CiAgICAgICAgIGlmIChsb2NrID09IG51bGwpIHsKQEAgLTU4LDU2ICs3NSw2MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgUmVhZGVyLiBUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYW55IGNvbmNyZXRlIHN1YmNsYXNzZXMuCi0gICAgICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBmcmVlIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZWFkZXIuCisgICAgICogQ2xvc2VzIHRoaXMgcmVhZGVyLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGZyZWUgYW55CisgICAgICogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVhZGVyLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIFJlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHJlYWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldCBhIE1hcmsgcG9zaXRpb24gaW4gdGhpcyBSZWFkZXIuIFRoZSBwYXJhbWV0ZXIgPGNvZGU+cmVhZExpbWl0PC9jb2RlPgotICAgICAqIGluZGljYXRlcyBob3cgbWFueSBjaGFyYWN0ZXJzIGNhbiBiZSByZWFkIGJlZm9yZSBhIG1hcmsgaXMgaW52YWxpZGF0ZWQuCi0gICAgICogU2VuZGluZyByZXNldCgpIHdpbGwgcmVwb3NpdGlvbiB0aGUgcmVhZGVyIGJhY2sgdG8gdGhlIG1hcmtlZCBwb3NpdGlvbgotICAgICAqIHByb3ZpZGVkIDxjb2RlPnJlYWRMaW1pdDwvY29kZT4gaGFzIG5vdCBiZWVuIHN1cnBhc3NlZC4KKyAgICAgKiBTZXRzIGEgbWFyayBwb3NpdGlvbiBpbiB0aGlzIHJlYWRlci4gVGhlIHBhcmFtZXRlciB7QGNvZGUgcmVhZExpbWl0fQorICAgICAqIGluZGljYXRlcyBob3cgbWFueSBjaGFyYWN0ZXJzIGNhbiBiZSByZWFkIGJlZm9yZSB0aGUgbWFyayBpcyBpbnZhbGlkYXRlZC4KKyAgICAgKiBDYWxsaW5nIHtAY29kZSByZXNldCgpfSB3aWxsIHJlcG9zaXRpb24gdGhlIHJlYWRlciBiYWNrIHRvIHRoZSBtYXJrZWQKKyAgICAgKiBwb3NpdGlvbiBpZiB7QGNvZGUgcmVhZExpbWl0fSBoYXMgbm90IGJlZW4gc3VycGFzc2VkLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgdGhyb3dzIElPRXhjZXB0aW9uIGFuZCBjb25jcmV0ZQotICAgICAqIHN1YmNsYXNzZXMgbXVzdCBwcm92aWRlIHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSB0aHJvd3MgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufTsKKyAgICAgKiBzdWJjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGVpciBvd24gaW1wbGVtZW50YXRpb24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSByZWFkTGltaXQKLSAgICAgKiAgICAgICAgICAgIGFuIGludCByZXByZXNlbnRpbmcgaG93IG1hbnkgY2hhcmFjdGVycyBtdXN0IGJlIHJlYWQgYmVmb3JlCi0gICAgICogICAgICAgICAgICBpbnZhbGlkYXRpbmcgdGhlIG1hcmsuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgcmVhZCBiZWZvcmUgdGhlIG1hcmsgaXMKKyAgICAgKiAgICAgICAgICAgIGludmFsaWRhdGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJlYWRMaW1pdCA8IDB9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyBtYXJrIHRoaXMgUmVhZGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIGEgbWFyayBpbiB0aGlzIHJlYWRlci4KKyAgICAgKiBAc2VlICNtYXJrU3VwcG9ydGVkKCkKKyAgICAgKiBAc2VlICNyZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgUmVhZGVyIHN1cHBvcnRzIG1hcmsoKQotICAgICAqIGFuZCByZXNldCgpLiBUaGlzIGNsYXNzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCByZXR1cm5zIGZhbHNlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIHN1cHBvcnRzIHRoZSB7QGNvZGUgbWFyaygpfSBhbmQKKyAgICAgKiB7QGNvZGUgcmVzZXQoKX0gbWV0aG9kcy4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMKKyAgICAgKiB7QGNvZGUgZmFsc2V9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbWFyaygpIGFuZCByZXNldCgpIGFyZSBzdXBwb3J0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGlzIHJlYWRlciBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuCi0gICAgICogaW50LiBUaGUgMiBoaWdoZXItb3JkZXIgY2hhcmFjdGVycyBhcmUgc2V0IHRvIDAuIElmIHRoZSBlbmQgb2YgcmVhZGVyIHdhcwotICAgICAqIGVuY291bnRlcmVkIHRoZW4gcmV0dXJuIC0xLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoaXMgcmVhZGVyIGFuZCByZXR1cm5zIGl0IGFzIGFuIGludGVnZXIKKyAgICAgKiB3aXRoIHRoZSB0d28gaGlnaGVyLW9yZGVyIGJ5dGVzIHNldCB0byAwLiBSZXR1cm5zIC0xIGlmIHRoZSBlbmQgb2YgdGhlCisgICAgICogcmVhZGVyIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHJlYWQgb3IgLTEgaWYgZW5kIG9mIHJlYWRlci4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSByZWFkZXIgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBSZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQgb3Igc29tZSBvdGhlciBJTyBlcnJvcgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtMTIwLDkzICsxNDMsMTAyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgY2hhcmFjdGVycyBmcm9tIHRoaXMgUmVhZGVyIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgY2hhcmFjdGVyIGFycmF5Ci0gICAgICogPGNvZGU+YnVmPC9jb2RlPiBzdGFydGluZyBhdCBvZmZzZXQgMC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLSAgICAgKiBhY3R1YWxseSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgcmVhZGVyIHdhcyBlbmNvdW50ZXJlZC4KKyAgICAgKiBSZWFkcyBjaGFyYWN0ZXJzIGZyb20gdGhpcyByZWFkZXIgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiB7QGNvZGUgYnVmfSBzdGFydGluZyBhdCBvZmZzZXQgMC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBhY3R1YWxseSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHJlYWRlciBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIGNoYXJhY3RlciBhcnJheSB0byBzdG9yZSB0aGUgcmVhZCBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiBob3cgbWFueSBjaGFyYWN0ZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlYWQgaW4gb3IgZWxzZSAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIGVuZCBvZiB0aGUgcmVhZGVyIHdhcyBkZXRlY3RlZC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIGNoYXJhY3RlciBhcnJheSB0byBzdG9yZSB0aGUgY2hhcmFjdGVycyByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgcmVhZGVyIGhhcworICAgICAqICAgICAgICAgYmVlbiByZWFjaGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgUmVhZGVyIGlzIGFscmVhZHkgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSU8gZXJyb3IKLSAgICAgKiAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkIG9yIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IHJlYWQoY2hhciBidWZbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgaW50IHJlYWQoY2hhcltdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICByZXR1cm4gcmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGNoYXJhY3RlcnMgZnJvbSB0aGlzIFJlYWRlciBhbmQgc3RvcmVzCi0gICAgICogdGhlbSBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkgPGNvZGU+YnVmPC9jb2RlPi4KLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgcmVhZGVyCi0gICAgICogd2FzIGVuY291bnRlcmVkLgorICAgICAqIFJlYWRzIGF0IG1vc3Qge0Bjb2RlIGNvdW50fSBjaGFyYWN0ZXJzIGZyb20gdGhpcyByZWFkZXIgYW5kIHN0b3JlcyB0aGVtCisgICAgICogYXQge0Bjb2RlIG9mZnNldH0gaW4gdGhlIGNoYXJhY3RlciBhcnJheSB7QGNvZGUgYnVmfS4gUmV0dXJucyB0aGUgbnVtYmVyCisgICAgICogb2YgY2hhcmFjdGVycyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHJlYWRlciBoYXMgYmVlbgorICAgICAqIHJlYWNoZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZgotICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyIGFycmF5IHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gc3RvcmUgdGhlIGNoYXJhY3RlcnMgcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gYnVmIHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICByZWFkIGZyb20gdGhpcyByZWFkZXIuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBob3cgbWFueSBjaGFyYWN0ZXJzIHNob3VsZCBiZSByZWFkIGluCi0gICAgICogQHJldHVybiBob3cgbWFueSBjaGFyYWN0ZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlYWQgaW4gb3IgZWxzZSAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIGVuZCBvZiB0aGUgcmVhZGVyIHdhcyBkZXRlY3RlZC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSByZWFkZXIgaGFzCisgICAgICogICAgICAgICBiZWVuIHJlYWNoZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBSZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQgb3Igc29tZSBvdGhlciBJTyBlcnJvcgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZChjaGFyIGJ1ZltdLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgcHVibGljIGFic3RyYWN0IGludCByZWFkKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBjb3VudCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBSZWFkZXIgaXMKLSAgICAgKiByZWFkeSB0byBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuIElmIHRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0gICAgICogdGhlIG5leHQgPGNvZGU+cmVhZCgpPC9jb2RlPiB3aWxsIG5vdCBibG9jay4gSWYgdGhlIHJlc3VsdCBpcwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGlzIFJlYWRlciBtYXkgb3IgbWF5IG5vdCBibG9jayB3aGVuCi0gICAgICogPGNvZGU+cmVhZCgpPC9jb2RlPiBpcyBzZW50LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIGlzIHJlYWR5IHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHJlYWRlciB3aWxsIG5vdCBibG9jayB3aGVuIHtAY29kZSByZWFkfSBpcworICAgICAqIGNhbGxlZCwge0Bjb2RlIGZhbHNlfSBpZiB1bmtub3duIG9yIGJsb2NraW5nIHdpbGwgb2NjdXIuIFRoaXMgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIHtAY29kZSBmYWxzZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIgd2lsbCBub3QgYmxvY2sgd2hlbgotICAgICAqICAgICAgICAgPGNvZGU+cmVhZCgpPC9jb2RlPiBpcyBjYWxsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB1bmtub3duCi0gICAgICogICAgICAgICBvciBibG9ja2luZyB3aWxsIG9jY3VyLgotICAgICAqIAorICAgICAqIEByZXR1cm4gYWx3YXlzIHtAY29kZSBmYWxzZX0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBSZWFkZXIgaXMgYWxyZWFkeSBjbG9zZWQgb3Igc29tZSBvdGhlciBJTyBlcnJvcgotICAgICAqICAgICAgICAgICAgIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgI3JlYWQoKQorICAgICAqIEBzZWUgI3JlYWQoY2hhcltdKQorICAgICAqIEBzZWUgI3JlYWQoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCB0aGlzIFJlYWRlcnMgcG9zaXRpb24gdG8gdGhlIGxhc3QgPGNvZGU+bWFyaygpPC9jb2RlPiBsb2NhdGlvbi4KLSAgICAgKiBJbnZvY2F0aW9ucyBvZiA8Y29kZT5yZWFkKCkvc2tpcCgpPC9jb2RlPiB3aWxsIG9jY3VyIGZyb20gdGhpcyBuZXcKLSAgICAgKiBsb2NhdGlvbi4gSWYgdGhpcyBSZWFkZXIgd2FzIG5vdCBtYXJrZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIDxjb2RlPnJlc2V0KCk8L2NvZGU+IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLiBTZWUgdGhlIGNvbW1lbnQgZm9yCi0gICAgICogdGhlIHNwZWNpZmljIFJlYWRlciBzdWJjbGFzcyBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gVGhlIGRlZmF1bHQKLSAgICAgKiBhY3Rpb24gaXMgdG8gdGhyb3cgPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+LgorICAgICAqIFJlc2V0cyB0aGlzIHJlYWRlcidzIHBvc2l0aW9uIHRvIHRoZSBsYXN0IHtAY29kZSBtYXJrKCl9IGxvY2F0aW9uLgorICAgICAqIEludm9jYXRpb25zIG9mIHtAY29kZSByZWFkKCl9IGFuZCB7QGNvZGUgc2tpcCgpfSB3aWxsIG9jY3VyIGZyb20gdGhpcyBuZXcKKyAgICAgKiBsb2NhdGlvbi4gSWYgdGhpcyByZWFkZXIgaGFzIG5vdCBiZWVuIG1hcmtlZCwgdGhlIGJlaGF2aW9yIG9mCisgICAgICoge0Bjb2RlIHJlc2V0KCl9IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLiBUaGlzIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBwcm9ibGVtIG9jY3VyZWQgb3IgdGhlIHJlY2VpdmVyIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5tYXJrKCkvcmVzZXQoKTwvY29kZT4uCisgICAgICogICAgICAgICAgICAgYWx3YXlzIHRocm93biBpbiB0aGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgICAgICogQHNlZSAjbWFyayhpbnQpCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTa2lwcyA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBSZWFkZXIuCi0gICAgICogU3Vic2VxdWVudCA8Y29kZT5yZWFkKCk8L2NvZGU+J3Mgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGNoYXJhY3RlcnMKLSAgICAgKiB1bmxlc3MgPGNvZGU+cmVzZXQoKTwvY29kZT4gaXMgdXNlZC4gVGhpcyBtZXRob2QgbWF5IHBlcmZvcm0gbXVsdGlwbGUKLSAgICAgKiByZWFkcyB0byByZWFkIDxjb2RlPmNvdW50PC9jb2RlPiBjaGFyYWN0ZXJzLgorICAgICAqIFNraXBzIHtAY29kZSBhbW91bnR9IGNoYXJhY3RlcnMgaW4gdGhpcyByZWFkZXIuIFN1YnNlcXVlbnQgY2FsbHMgb2YKKyAgICAgKiB7QGNvZGUgcmVhZH0gbWV0aG9kcyB3aWxsIG5vdCByZXR1cm4gdGhlc2UgY2hhcmFjdGVycyB1bmxlc3Mge0Bjb2RlCisgICAgICogcmVzZXQoKX0gaXMgdXNlZC4gVGhpcyBtZXRob2QgbWF5IHBlcmZvcm0gbXVsdGlwbGUgcmVhZHMgdG8gcmVhZCB7QGNvZGUKKyAgICAgKiBjb3VudH0gY2hhcmFjdGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY291bnQKLSAgICAgKiAgICAgICAgICAgIGhvdyBtYW55IGNoYXJhY3RlcnMgc2hvdWxkIGJlIHBhc3NlZCBvdmVyCi0gICAgICogQHJldHVybiBob3cgbWFueSBjaGFyYWN0ZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHBhc3NlZCBvdmVyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHNraXBwZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYW1vdW50IDwgMH0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBSZWFkZXIgaXMgY2xvc2VkIHdoZW4gdGhlIGNhbGwgaXMgbWFkZSBvciBpZiBhbiBJTwotICAgICAqICAgICAgICAgICAgIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI21hcmtTdXBwb3J0ZWQoKQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjb3VudCA8IDApIHsKQEAgLTIzNCwxOSArMjY2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZCBjaGFycyBmcm9tIHRoZSBSZWFkZXIgYW5kIHRoZW4gcHV0IHRoZW0gdG8gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4KLSAgICAgKiBDaGFyQnVmZmVyLiBPbmx5IHB1dCBtZXRob2QgaXMgY2FsbGVkIG9uIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorICAgICAqIFJlYWRzIGNoYXJhY3RlcnMgYW5kIHB1dHMgdGhlbSBpbnRvIHRoZSB7QGNvZGUgdGFyZ2V0fSBjaGFyYWN0ZXIgYnVmZmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBDaGFyQnVmZmVyCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiBjaGFycyBwdXQgdG8gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uIC0xCi0gICAgICogICAgICAgICB3aGVuIHRoZSBSZWFkZXIgaGFzIHJlYWNoZWQgdGhlIGVuZCBiZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gY2hhcmFjdGVyIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwdXQgaW50byB7QGNvZGUgdGFyZ2V0fSBvciAtMSBpZiB0aGUgZW5kCisgICAgICogICAgICAgICBvZiB0aGlzIHJlYWRlciBoYXMgYmVlbiByZWFjaGVkIGJlZm9yZSBhIGNoYXJhY3RlciBoYXMgYmVlbiByZWFkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSS9PIGVycm9yIHJhaXNlcyBpbiB0aGUgcHJvY2VkdXJlCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgcmVhZGVyLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGFyZ2V0IENoYXJCdWZmZXIgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0YXJnZXR9IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHRhcmdldCBDaGFyQnVmZmVyIGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHRhcmdldH0gaXMgcmVhZC1vbmx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZChDaGFyQnVmZmVyIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgPT0gdGFyZ2V0KSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TZXF1ZW5jZUlucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TZXF1ZW5jZUlucHV0U3RyZWFtLmphdmEKaW5kZXggYzFkMGZkOS4uMWI5NDZiNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU2VxdWVuY2VJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1NlcXVlbmNlSW5wdXRTdHJlYW0uamF2YQpAQCAtMjAsMTEgKzIwLDE2IEBACiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCisKIC8qKgotICogU2VxdWVuY2VJbnB1dFN0cmVhbSBpcyB1c2VkIGZvciBzdHJlYW1pbmcgb3ZlciBhIHNlcXVlbmNlIG9mIHN0cmVhbXMKLSAqIGNvbmNhdGVuYXRlZCB0b2dldGhlci4gUmVhZHMgYXJlIHRha2VuIGZyb20gdGhlIGZpcnN0IHN0cmVhbSB1bnRpbCBpdCBlbmRzLAotICogdGhlbiB0aGUgbmV4dCBzdHJlYW0gaXMgdXNlZCB1bnRpbCB0aGUgbGFzdCBzdHJlYW0gcmV0dXJucyBlbmQgb2YgZmlsZS4KKyAqIENvbmNhdGVuYXRlcyB0d28gb3IgbW9yZSBleGlzdGluZyB7QGxpbmsgSW5wdXRTdHJlYW19cy4gUmVhZHMgYXJlIHRha2VuIGZyb20KKyAqIHRoZSBmaXJzdCBzdHJlYW0gdW50aWwgaXQgZW5kcywgdGhlbiB0aGUgbmV4dCBzdHJlYW0gaXMgdXNlZCwgdW50aWwgdGhlIGxhc3QKKyAqIHN0cmVhbSByZXR1cm5zIGVuZCBvZiBmaWxlLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNlcXVlbmNlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CiAgICAgLyoqCkBAIC0zOCwxNCArNDMsMTYgQEAKICAgICBwcml2YXRlIElucHV0U3RyZWFtIGluOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtIHVzaW5nIHRoZSB0d28gc3RyZWFtcwotICAgICAqIDxjb2RlPnMxPC9jb2RlPiBhbmQgPGNvZGU+czI8L2NvZGU+IGFzIHRoZSBzZXF1ZW5jZSBvZiBzdHJlYW1zIHRvCi0gICAgICogcmVhZCBmcm9tLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNlcXVlbmNlSW5wdXRTdHJlYW19IHVzaW5nIHRoZSB0d28gc3RyZWFtcworICAgICAqIHtAY29kZSBzMX0gYW5kIHtAY29kZSBzMn0gYXMgdGhlIHNlcXVlbmNlIG9mIHN0cmVhbXMgdG8gcmVhZCBmcm9tLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzMQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHN0cmVhbSB0byBnZXQgYnl0ZXMgZnJvbQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHN0cmVhbSB0byBnZXQgYnl0ZXMgZnJvbS4KICAgICAgKiBAcGFyYW0gczIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc3RyZWFtIHRvIGdldCBieXRlcyBmcm9tCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHN0cmVhbSB0byBnZXQgYnl0ZXMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHMxfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlcXVlbmNlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gczEsIElucHV0U3RyZWFtIHMyKSB7CiAgICAgICAgIGlmIChzMSA9PSBudWxsKSB7CkBAIC01OSwxMSArNjYsMTQgQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbSB1c2luZyB0aGUgZWxlbWVudHMgcmV0dXJuZWQgZnJvbQotICAgICAqIEVudW1lcmF0aW9uIDxjb2RlPmU8L2NvZGU+IGFzIHRoZSBzdHJlYW0gc2VxdWVuY2UuIFRoZSB0eXBlcyByZXR1cm5lZAotICAgICAqIGZyb20gbmV4dEVsZW1lbnQoKSBtdXN0IGJlIG9mIElucHV0U3RyZWFtLgorICAgICAqIEVudW1lcmF0aW9uIHtAY29kZSBlfSBhcyB0aGUgc3RyZWFtIHNlcXVlbmNlLiBUaGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5CisgICAgICoge0Bjb2RlIGUubmV4dEVsZW1lbnQoKX0gbXVzdCBiZSBvZiB0eXBlIHtAbGluayBJbnB1dFN0cmVhbX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBFbnVtZXJhdGlvbiBvZiBJbnB1dFN0cmVhbXMgdG8gZ2V0IGJ5dGVzIGZyb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBlbnVtZXJhdGlvbiBvZiB7QGNvZGUgSW5wdXRTdHJlYW1zfSB0byBnZXQgYnl0ZXMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpbiB7QGNvZGUgZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXF1ZW5jZUlucHV0U3RyZWFtKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBJbnB1dFN0cmVhbT4gZSkgewogICAgICAgICB0aGlzLmUgPSBlOwpAQCAtNzYsMTMgKzg2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGludCByZXByZXNlbnRpbmcgdGhlbiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGJlZm9yZQotICAgICAqIHRoaXMgSW5wdXRTdHJlYW0gd2lsbCBibG9jay4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGJlZm9yZSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0gd2lsbAorICAgICAqIGJsb2NrLiAKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGJlZm9yZSBibG9ja2luZy4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSBiZWZvcmUgYmxvY2tpbmcuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBpbiB0aGlzIElucHV0U3RyZWFtLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgaW4gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTkzLDEyICsxMDMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgU2VxdWVuY2VJbnB1dFN0cmVhbS4gQWxsIHN0cmVhbXMgaW4gdGhpcyBzZXF1ZW5jZSBhcmUgY2xvc2VkCi0gICAgICogYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kLiBUaGlzIHN0cmVhbSBjYW5ub3QgYmUgdXNlZCBmb3IgaW5wdXQKLSAgICAgKiBvbmNlIGl0IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBDbG9zZXMgYWxsIHN0cmVhbXMgaW4gdGhpcyBzZXF1ZW5jZSBvZiBpbnB1dCBzdHJlYW0uIAogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGlzIEZpbGVJbnB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyBhbnkgb2YgdGhlIGlucHV0IHN0cmVhbXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTI4LDE1ICsxMzcsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhpcyBTZXF1ZW5jZUlucHV0U3RyZWFtIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKLSAgICAgKiBhcyBhbiBpbnQuIFRoZSBsb3ctb3JkZXIgYnl0ZSBpcyByZXR1cm5lZCBvciAtMSBvZiB0aGUgZW5kIG9mIHN0cmVhbSB3YXMKLSAgICAgKiBlbmNvdW50ZXJlZC4gVGhlIGN1cnJlbnQgc3RyZWFtIGlzIHJlYWQgZnJvbS4gSWYgaXQgcmVhY2hlcyB0aGUgZW5kIG9mCi0gICAgICogZmlsZSwgdGhlIG5leHQgc3RyZWFtIGlzIHJlYWQgZnJvbS4KKyAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhpcyBzZXF1ZW5jZSBvZiBpbnB1dCBzdHJlYW1zIGFuZCByZXR1cm5zIGl0IGFzCisgICAgICogYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDI1NS4gSXQgdHJpZXMgdG8gcmVhZCBmcm9tIHRoZSBjdXJyZW50CisgICAgICogc3RyZWFtIGZpcnN0OyBpZiB0aGUgZW5kIG9mIHRoaXMgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQsIGl0IHJlYWRzIGZyb20KKyAgICAgKiB0aGUgbmV4dCBvbmUuIEJsb2NrcyB1bnRpbCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBsYXN0CisgICAgICogaW5wdXQgc3RyZWFtIGluIHRoZSBzZXF1ZW5jZSBoYXMgYmVlbiByZWFjaGVkLCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcmVhZCBvciAtMSBpZiBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgbGFzdCBzdHJlYW0gaW4gdGhlCisgICAgICogICAgICAgICBzZXF1ZW5jZSBoYXMgYmVlbiByZWFjaGVkIG9yIHRoaXMgaW5wdXQgc3RyZWFtIHNlcXVlbmNlIGlzCisgICAgICogICAgICAgICBjbG9zZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgY3VycmVudCBzb3VyY2UgaW5wdXQKKyAgICAgKiAgICAgICAgICAgICBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE1MSwzNCArMTY0LDU5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gYnl0ZXMgZnJvbSB0aGlzIFNlcXVlbmNlSW5wdXRTdHJlYW0KLSAgICAgKiBhbmQgc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPi4gQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZgotICAgICAqIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuCisgICAgICogUmVhZHMgYXQgbW9zdCB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhpcyBzZXF1ZW5jZSBvZiBpbnB1dCBzdHJlYW1zIGFuZAorICAgICAqIHN0b3JlcyB0aGVtIGluIHRoZSBieXRlIGFycmF5IHtAY29kZSBidWZmZXJ9IHN0YXJ0aW5nIGF0IHtAY29kZSBvZmZzZXR9LgorICAgICAqIEJsb2NrcyBvbmx5IHVudGlsIGF0IGxlYXN0IDEgYnl0ZSBoYXMgYmVlbiByZWFkLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAgKiBoYXMgYmVlbiByZWFjaGVkLCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgU2VxdWVuY2VJbnB1dFN0cmVhbSBzaG93cyB0aGUgc2FtZSBiZWhhdmlvciBhcyBvdGhlciBJbnB1dFN0cmVhbXMuCisgICAgICogVG8gZG8gdGhpcyBpdCB3aWxsIHJlYWQgb25seSBhcyBtYW55IGJ5dGVzIGFzIGEgY2FsbCB0byByZWFkIG9uIHRoZQorICAgICAqIGN1cnJlbnQgc3Vic3RyZWFtIHJldHVybnMuIElmIHRoYXQgY2FsbCBkb2VzIG5vdCByZXR1cm4gYXMgbWFueSBieXRlcyBhcworICAgICAqIHJlcXVlc3RlZCBieSB7QGNvZGUgY291bnR9LCBpdCB3aWxsIG5vdCByZXRyeSB0byByZWFkIG1vcmUgb24gaXRzIG93bgorICAgICAqIGJlY2F1c2Ugc3Vic2VxdWVudCByZWFkcyBtaWdodCBibG9jay4gVGhpcyB3b3VsZCB2aW9sYXRlIHRoZSBydWxlIHRoYXQKKyAgICAgKiBpdCB3aWxsIG9ubHkgYmxvY2sgdW50aWwgYXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHN1YnN0cmVhbSBoYXMgYWxyZWFkeSByZWFjaGVkIHRoZSBlbmQgd2hlbiB0aGlzIGNhbGwgaXMgbWFkZSwgaXQKKyAgICAgKiB3aWxsIGNsb3NlIHRoYXQgc3Vic3RyZWFtIGFuZCBzdGFydCB3aXRoIHRoZSBuZXh0IG9uZS4gSWYgdGhlcmUgYXJlIG5vCisgICAgICogbW9yZSBzdWJzdHJlYW1zIGl0IHdpbGwgcmV0dXJuIC0xLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBieXRlcyByZWFkCisgICAgICogICAgICAgICAgICBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiB7QGNvZGUgYnVmZmVyfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZDsgLTEgaWYgdGhpcyBzZXF1ZW5jZSBvZiBzdHJlYW1zCisgICAgICogICAgICAgICBpcyBjbG9zZWQgb3IgaWYgdGhlIGVuZCBvZiB0aGUgbGFzdCBzdHJlYW0gaW4gdGhlIHNlcXVlbmNlIGhhcworICAgICAqICAgICAgICAgYmVlbiByZWFjaGVkLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgY291bnQgPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgY291bnR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB7QGNvZGUgYnVmZmVyfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgdGhlIHN0cmVhbQorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZmZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggLSBjb3VudCB8fCBjb3VudCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHVzZWQgKG9mZnNldCB8IGNvdW50KSA8IDAgaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGNvdW50IDwgMCkKKyAgICAgICAgLy8gdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmICgob2Zmc2V0IHwgY291bnQpIDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIC0gY291bnQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB3aGlsZSAoaW4gIT0gbnVsbCkgewogICAgICAgICAgICAgaW50IHJlc3VsdCA9IGluLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU2VyaWFsaXphYmxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TZXJpYWxpemFibGUuamF2YQppbmRleCAwZTViODNlLi4xNzY5MGUzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TZXJpYWxpemFibGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TZXJpYWxpemFibGUuamF2YQpAQCAtMTgsOCArMTgsMjMgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBPYmplY3RzIHRoYXQgd2FudCB0byBiZSBzZXJpYWxpemVkL2Rlc2VyaWFsaXplZCB1c2luZwotICogT2JqZWN0T3V0cHV0U3RyZWFtL09iamVjdElucHV0U3RyZWFtIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCisgKiBBbiBlbXB0eSBtYXJrZXIgaW50ZXJmYWNlIGZvciBjbGFzc2VzIHRoYXQgd2FudCB0byBzdXBwb3J0IHNlcmlhbGl6YXRpb24gYW5kCisgKiBkZXNlcmlhbGl6YXRpb24gYmFzZWQgb24gdGhlIHtAY29kZSBPYmplY3RPdXRwdXRTdHJlYW19IGFuZCB7QGNvZGUKKyAqIE9iamVjdElucHV0U3RyZWFtfSBjbGFzc2VzLiBJbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgaXMgZW5vdWdoIHRvIG1ha2UKKyAqIG1vc3QgY2xhc3NlcyBzZXJpYWxpemFibGUuIElmIGEgY2xhc3MgbmVlZHMgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyCisgKiB0aGUgc2VyaWFsaXphdGlvbiBwcm9jZXNzIChmb3IgZXhhbXBsZSB0byBpbXBsZW1lbnQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCisgKiB2ZXJzaW9ucyBvZiB0aGUgY2xhc3MpLCBpdCBjYW4gYWNoaWV2ZSB0aGlzIGJ5IHByb3ZpZGluZyB0aGUgZm9sbG93aW5nIHR3bworICogbWV0aG9kcyAoc2lnbmF0dXJlcyBtdXN0IG1hdGNoIGV4YWN0bHkpOgorICogPHA+CisgKiB7QGNvZGUgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzCisgKiBJT0V4Y2VwdGlvbn0KKyAqIDwvcD4KKyAqIDxwPgorICoge0Bjb2RlIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cworICogSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb259CisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZSB7CiAgICAgLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1NlcmlhbGl6YWJsZVBlcm1pc3Npb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1NlcmlhbGl6YWJsZVBlcm1pc3Npb24uamF2YQppbmRleCAyMTUzNzRhLi43ZmY2NTI0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TZXJpYWxpemFibGVQZXJtaXNzaW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU2VyaWFsaXphYmxlUGVybWlzc2lvbi5qYXZhCkBAIC0yMCwxNiArMjAsMjMgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKIAogLyoqCi0gKiBTZXJpYWxpemFibGVQZXJtaXNzaW9uIG9iamVjdHMgcmVwcmVzZW50IHBlcm1pc3Npb24gdG8gYWNjZXNzIHVuc2FmZQotICogc2VyaWFsaXphdGlvbiBvcGVyYXRpb25zLiBUaGUgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiBzaG91bGQgYmUgb25lIG9mOgotICogPGRsPgotICogPGR0PmVuYWJsZVN1YmNsYXNzSW1wbGVtZW50YXRpb248L2R0PgotICogPGRkPlN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHNlcmlhbGl6YXRpb24gYmVoYXZpb3I8L2RkPgotICogPGR0PmVuYWJsZVN1YnN0aXR1dGlvbjwvZHQ+Ci0gKiA8ZGQ+T2JqZWN0IHN1YnN0aXR1dGlvbiBjYW4gYmUgZW5hYmxlZDwvZGQ+Ci0gKiA8L2RsPgorICogSXMgdXNlZCB0byBlbmFibGUgYWNjZXNzIHRvIHBvdGVudGlhbGx5IHVuc2FmZSBzZXJpYWxpemF0aW9uIG9wZXJhdGlvbnMuIEl0CisgKiBkb2VzIGhhdmUgYSBuYW1lIGJ1dCBubyBhY3Rpb24gbGlzdC4gVGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB2YWxpZAorICogcGVybWlzc2lvbiBuYW1lczoKKyAqIDx0YWJsZT4KKyAqIDx0cj4KKyAqIDx0ZD5lbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uPC90ZD4KKyAqIDx0ZD5TdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBzZXJpYWxpemF0aW9uIGJlaGF2aW9yLjwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPmVuYWJsZVN1YnN0aXR1dGlvbjwvdGQ+CisgKiA8dGQ+T2JqZWN0IHN1YnN0aXR1dGlvbiBpcyBhbGxvd2VkLjwvdGQ+CisgKiA8L3RyPgorICogPC90YWJsZT4KICAqIAogICogQHNlZSBPYmplY3RTdHJlYW1Db25zdGFudHMKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTZXJpYWxpemFibGVQZXJtaXNzaW9uIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NTM3MjEyMTQxMTYwMjk2NDEwTDsKQEAgLTM5LDIzICs0NiwyNSBAQAogICAgIHByaXZhdGUgU3RyaW5nIGFjdGlvbnM7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTZXJpYWxpemFibGVQZXJtaXNzaW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGVybWlzc2lvbk5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBuZXcgcGVybWlzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2VyaWFsaXphYmxlUGVybWlzc2lvbihTdHJpbmcgcGVybWlzc2lvbk5hbWUpIHsKICAgICAgICAgc3VwZXIocGVybWlzc2lvbk5hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhY3Rpb24gbGlzdC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTZXJpYWxpemFibGVQZXJtaXNzaW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KICAgICAgKiBUaGUgYWN0aW9uIGxpc3QgaXMgaWdub3JlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uLgogICAgICAqIEBwYXJhbSBhY3Rpb25zCiAgICAgICogICAgICAgICAgICBpZ25vcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXJpYWxpemFibGVQZXJtaXNzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgYWN0aW9ucykgewogICAgICAgICBzdXBlcihuYW1lLCBhY3Rpb25zKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1N0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uLmphdmEKaW5kZXggODE1MmU0NC4uMTE4MTUwNyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uLmphdmEKQEAgLTE4LDMxICsxOCwzNyBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFdoZW4gcmVhZE9iamVjdCgpIGNhbm5vdCByZWFkIGFuIG9iamVjdCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gZHVlIHRvIG1pc3NpbmcKLSAqIGluZm9ybWF0aW9uIChjeWNsaWMgcmVmZXJlbmNlIHRoYXQgZG9lc24ndCBtYXRjaCBwcmV2aW91cyBpbnN0YW5jZSBvciBtaXNzaW5nCi0gKiBjbGFzcyBkZXNjcmlwdG9yIGZvciBpbnN0YW5jZSB0byBiZSBsb2FkZWQpIHRoaXMgdHlwZSBvZiBleGNlcHRpb24gaXMgdGhyb3duLgorICogU2lnbmFscyB0aGF0IHRoZSB7QGxpbmsgT2JqZWN0SW5wdXRTdHJlYW0jcmVhZE9iamVjdCgpfSBtZXRob2QgY291bGQgbm90CisgKiByZWFkIGFuIG9iamVjdCBkdWUgdG8gbWlzc2luZyBpbmZvcm1hdGlvbiAoZm9yIGV4YW1wbGUsIGEgY3ljbGljIHJlZmVyZW5jZQorICogdGhhdCBkb2Vzbid0IG1hdGNoIGEgcHJldmlvdXMgaW5zdGFuY2UsIG9yIGEgbWlzc2luZyBjbGFzcyBkZXNjcmlwdG9yIGZvciB0aGUKKyAqIG9iamVjdCB0byBiZSBsb2FkZWQpLgogICogCiAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtCiAgKiBAc2VlIE9wdGlvbmFsRGF0YUV4Y2VwdGlvbgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiBleHRlbmRzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4OTgzNTU4MjAyMjE3NTkxNzQ2TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9ufSB3aXRoIGl0cyBzdGFjayB0cmFjZQorICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlCisgICAgICogYW5kIGRldGFpbCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyZWFtVG9rZW5pemVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJlYW1Ub2tlbml6ZXIuamF2YQppbmRleCAyN2MyMGQ3Li4zOTFmY2E4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJlYW1Ub2tlbml6ZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJlYW1Ub2tlbml6ZXIuamF2YQpAQCAtMTgsNTQgKzE4LDU2IEBACiBwYWNrYWdlIGphdmEuaW87CiAKIC8qKgotICogU3RyZWFtVG9rZW5pemVyIHRha2VzIGEgc3RyZWFtIGFuZCBhIHNldCBvZiB0b2tlbnMgYW5kIHBhcnNlcyB0aGVtIG9uZSBhdCBhCi0gKiB0aW1lLiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIHRva2VucyB0aGF0IGNhbiBiZSBmb3VuZCBhcmUgbnVtYmVycywKLSAqIGlkZW50aWZpZXJzLCBxdW90ZWQgc3RyaW5ncywgYW5kIGRpZmZlcmVudCBjb21tZW50IHN0eWxlcy4KKyAqIFBhcnNlcyBhIHN0cmVhbSBpbnRvIGEgc2V0IG9mIGRlZmluZWQgdG9rZW5zLCBvbmUgYXQgYSB0aW1lLiBUaGUgZGlmZmVyZW50CisgKiB0eXBlcyBvZiB0b2tlbnMgdGhhdCBjYW4gYmUgZm91bmQgYXJlIG51bWJlcnMsIGlkZW50aWZpZXJzLCBxdW90ZWQgc3RyaW5ncywKKyAqIGFuZCBkaWZmZXJlbnQgY29tbWVudCBzdHlsZXMuIFRoZSBjbGFzcyBjYW4gYmUgdXNlZCBmb3IgbGltaXRlZCBwcm9jZXNzaW5nCisgKiBvZiBzb3VyY2UgY29kZSBvZiBwcm9ncmFtbWluZyBsYW5ndWFnZXMgbGlrZSBKYXZhLCBhbHRob3VnaCBpdCBpcyBub3doZXJlCisgKiBuZWFyIGEgZnVsbCBwYXJzZXIuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU3RyZWFtVG9rZW5pemVyIHsKICAgICAvKioKLSAgICAgKiBDb250YWlucyBhIG51bWJlciBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIG51bWJlciAoPGNvZGU+dHR5cGU8L2NvZGU+Ci0gICAgICogaXMgPGNvZGU+VFRfTlVNQkVSPC9jb2RlPikKKyAgICAgKiBDb250YWlucyBhIG51bWJlciBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIG51bWJlciAoe0Bjb2RlIHR0eXBlfSA9PQorICAgICAqIHtAY29kZSBUVF9OVU1CRVJ9KS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIG52YWw7CiAKICAgICAvKioKLSAgICAgKiBDb250YWlucyBhIHN0cmluZyBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHdvcmQgKDxjb2RlPnR0eXBlPC9jb2RlPgotICAgICAqIGlzIDxjb2RlPlRUX1dPUkQ8L2NvZGU+KQorICAgICAqIENvbnRhaW5zIGEgc3RyaW5nIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgd29yZCAoe0Bjb2RlIHR0eXBlfSA9PQorICAgICAqIHtAY29kZSBUVF9XT1JEfSkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBzdmFsOwogCiAgICAgLyoqCi0gICAgICogQWZ0ZXIgY2FsbGluZyA8Y29kZT5uZXh0VG9rZW48L2NvZGU+LCB0aGUgZmllbGQgPGNvZGU+dHR5cGU8L2NvZGU+Ci0gICAgICogY29udGFpbnMgdGhlIHR5cGUgb2YgdG9rZW4gdGhhdCBoYXMgYmVlbiByZWFkLiBXaGVuIGEgc2luZ2xlIGNoYXJhY3RlciBpcwotICAgICAqIHJlYWQsIGl0J3MgaW50ZWdlciB2YWx1ZSBpcyB1c2VkLiBGb3IgYSBxdW90ZWQgc3RyaW5nLCB0aGUgdmFsdWUgaXMgdGhlCi0gICAgICogcXVvdGVkIGNoYXJhY3Rlci4gSWYgbm90IG9uZSBvZiB0aG9zZSwgdGhlbiBpdCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgKiA8VUw+Ci0gICAgICogPExJPiA8Y29kZT5UVF9XT1JEPC9jb2RlPiAtIHRoZSB0b2tlbiBpcyBhIHdvcmQuPC9MST4KLSAgICAgKiA8TEk+IDxjb2RlPlRUX05VTUJFUjwvY29kZT4gLSB0aGUgdG9rZW4gaXMgYSBudW1iZXIuPC9MST4KLSAgICAgKiA8TEk+IDxjb2RlPlRUX0VPTDwvY29kZT4gLSB0aGUgZW5kIG9mIGxpbmUgaGFzIGJlZW4gcmVhY2hlZC4gRGVwZW5kcyBvbgotICAgICAqIHdoZXRoZXIgPGNvZGU+ZW9sSXNTaWduaWZpY2FudDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uPC9MST4KLSAgICAgKiA8TEk+IDxjb2RlPlRUX0VPRjwvY29kZT4gLSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC48L0xJPgotICAgICAqIDwvVUw+Ci0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RhbnQgcmVwcmVzZW50aW5nIGVuZCBvZiBzdHJlYW0uCisgICAgICogVGhlIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFRfRU9GID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBUaGUgY29uc3RhbnQgcmVwcmVzZW50aW5nIGVuZCBvZiBsaW5lLgorICAgICAqIFRoZSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIGVuZCBvZiB0aGUgbGluZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVF9FT0wgPSAnXG4nOwogCiAgICAgLyoqCiAgICAgICogVGhlIGNvbnN0YW50IHJlcHJlc2VudGluZyBhIG51bWJlciB0b2tlbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVF9OVU1CRVIgPSAtMjsKIAogICAgIC8qKgogICAgICAqIFRoZSBjb25zdGFudCByZXByZXNlbnRpbmcgYSB3b3JkIHRva2VuLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRUX1dPUkQgPSAtMzsKIApAQCAtNzUsNyArNzcsMjAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFRfVU5LTk9XTiA9IC00OwogCiAgICAgLyoqCi0gICAgICogVGhlIHRva2VuIHR5cGUKKyAgICAgKiBBZnRlciBjYWxsaW5nIHtAY29kZSBuZXh0VG9rZW4oKX0sIHtAY29kZSB0dHlwZX0gY29udGFpbnMgdGhlIHR5cGUgb2YKKyAgICAgKiB0b2tlbiB0aGF0IGhhcyBiZWVuIHJlYWQuIFdoZW4gYSBzaW5nbGUgY2hhcmFjdGVyIGlzIHJlYWQsIGl0cyB2YWx1ZQorICAgICAqIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIGlzIHN0b3JlZCBpbiB7QGNvZGUgdHR5cGV9LiBGb3IgYSBxdW90ZWQgc3RyaW5nLAorICAgICAqIHRoZSB2YWx1ZSBpcyB0aGUgcXVvdGVkIGNoYXJhY3Rlci4gT3RoZXJ3aXNlLCBpdHMgdmFsdWUgaXMgb25lIG9mIHRoZQorICAgICAqIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiB7QGNvZGUgVFRfV09SRH0gLSB0aGUgdG9rZW4gaXMgYSB3b3JkLjwvbGk+CisgICAgICogPGxpPiB7QGNvZGUgVFRfTlVNQkVSfSAtIHRoZSB0b2tlbiBpcyBhIG51bWJlci48L2xpPgorICAgICAqIDxsaT4ge0Bjb2RlIFRUX0VPTH0gLSB0aGUgZW5kIG9mIGxpbmUgaGFzIGJlZW4gcmVhY2hlZC4gRGVwZW5kcyBvbgorICAgICAqIHdoZXRoZXIge0Bjb2RlIGVvbElzU2lnbmlmaWNhbnR9IGlzIHtAY29kZSB0cnVlfS48L2xpPgorICAgICAqIDxsaT4ge0Bjb2RlIFRUX0VPRn0gLSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCB0dHlwZSA9IFRUX1VOS05PV047CiAKQEAgLTEyMCw3ICsxMzUsNyBAQAogICAgICAqIHNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJlYW1Ub2tlbml6ZXIoKSB7Ci0gICAgICAgIC8qCisgICAgICAgIC8qKgogICAgICAgICAgKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHN0YXRlIHBlciBzcGVjaWZpY2F0aW9uLiBBbGwgYnl0ZSB2YWx1ZXMgJ0EnCiAgICAgICAgICAqIHRocm91Z2ggJ1onLCAnYScgdGhyb3VnaCAneicsIGFuZCAnXHUwMEEwJyB0aHJvdWdoICdcdTAwRkYnIGFyZQogICAgICAgICAgKiBjb25zaWRlcmVkIHRvIGJlIGFscGhhYmV0aWMuCkBAIC0xNTIsMTMgKzE2NywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBTdHJlYW1Ub2tlbml6ZXIgb24gdGhlIElucHV0U3RyZWFtIGlzLiBUaGlzIHVzYWdlIG9mIHRoaXMKLSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIGEgUmVhZGVyLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFN0cmVhbVRva2VuaXplcn0gd2l0aCB7QGNvZGUgaXN9IGFzIHNvdXJjZSBpbnB1dAorICAgICAqIHN0cmVhbS4gVGhpcyBjb25zdHJ1Y3RvciBpcyBkZXByZWNhdGVkOyBpbnN0ZWFkLCB0aGUgY29uc3RydWN0b3IgdGhhdAorICAgICAqIHRha2VzIGEge0Bjb2RlIFJlYWRlcn0gYXMgYW4gYXJ1Z21lbnQgc2hvdWxkIGJlIHVzZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGlzCi0gICAgICogICAgICAgICAgICBUaGUgSW5wdXRTdHJlYW0gdG8gcGFyc2UgdG9rZW5zIG9uLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBzdHJlYW0gZnJvbSB3aGljaCB0byBwYXJzZSB0b2tlbnMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpc30gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI1N0cmVhbVRva2VuaXplcihSZWFkZXIpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFN0cmVhbVRva2VuaXplcihJbnB1dFN0cmVhbSBpcykgewpAQCAtMTY5LDI4ICsxODcsMjYgQEAKICAgICAgICAgaW5TdHJlYW0gPSBpczsKICAgICB9CiAKLSAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKLSAgICAvLyBjb3BpZWQgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBTdHJlYW1Ub2tlbml6ZXIgb24gdGhlIFJlYWRlciA8Y29kZT5yPC9jb2RlPi4KLSAgICAgKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHN0YXRlIHBlciBzcGVjaWZpY2F0aW9uLgotICAgICAqIDxVTD4KLSAgICAgKiA8TEk+QWxsIGJ5dGUgdmFsdWVzICdBJyB0aHJvdWdoICdaJywgJ2EnIHRocm91Z2ggJ3onLCBhbmQgJyYjOTI7dTAwQTAnCi0gICAgICogdGhyb3VnaCAnJiM5Mjt1MDBGRicgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYWxwaGFiZXRpYy48L0xJPgotICAgICAqIDxMST5BbGwgYnl0ZSB2YWx1ZXMgJyYjOTI7dTAwMDAnIHRocm91Z2ggJyYjOTI7dTAwMjAnIGFyZSBjb25zaWRlcmVkIHRvCi0gICAgICogYmUgd2hpdGUgc3BhY2UuICcvJyBpcyBhIGNvbW1lbnQgY2hhcmFjdGVyLjwvTEk+Ci0gICAgICogPExJPlNpbmdsZSBxdW90ZSAnXCcnIGFuZCBkb3VibGUgcXVvdGUgJyInIGFyZSBzdHJpbmcgcXVvdGUgY2hhcmFjdGVycy48L0xJPgotICAgICAqIDxMST5OdW1iZXJzIGFyZSBwYXJzZWQuPC9MST4KLSAgICAgKiA8TEk+RW5kcyBvZiBsaW5lcyBhcmUgY29uc2lkZXJlZCB0byBiZSB3aGl0ZSBzcGFjZSByYXRoZXIgdGhhbiBzZXBhcmF0ZQotICAgICAqIHRva2Vucy48L0xJPgotICAgICAqIDxMST5DLXN0eWxlIGFuZCBDKystc3R5bGUgY29tbWVudHMgYXJlIG5vdCByZWNvZ25pemVkLjwvTEk+Ci0gICAgICogPC9VTD4KLSAgICAgKiBUaGVzZSBhcmUgdGhlIGRlZmF1bHRzIGFuZCBhcmUgbm90IG5lZWRlZCBpbiBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJlYW1Ub2tlbml6ZXJ9IHdpdGgge0Bjb2RlIHJ9IGFzIHNvdXJjZSByZWFkZXIuCisgICAgICogVGhlIHRva2VuaXplcidzIGluaXRpYWwgc3RhdGUgaXMgYXMgZm9sbG93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkFsbCBieXRlIHZhbHVlcyAnQScgdGhyb3VnaCAnWicsICdhJyB0aHJvdWdoICd6JywgYW5kICcmIzkyO3UwMEEwJworICAgICAqIHRocm91Z2ggJyYjOTI7dTAwRkYnIGFyZSBjb25zaWRlcmVkIHRvIGJlIGFscGhhYmV0aWMuPC9saT4KKyAgICAgKiA8bGk+QWxsIGJ5dGUgdmFsdWVzICcmIzkyO3UwMDAwJyB0aHJvdWdoICcmIzkyO3UwMDIwJyBhcmUgY29uc2lkZXJlZCB0bworICAgICAqIGJlIHdoaXRlIHNwYWNlLiAnLycgaXMgYSBjb21tZW50IGNoYXJhY3Rlci48L2xpPgorICAgICAqIDxsaT5TaW5nbGUgcXVvdGUgJ1wnJyBhbmQgZG91YmxlIHF1b3RlICciJyBhcmUgc3RyaW5nIHF1b3RlIGNoYXJhY3RlcnMuCisgICAgICogPC9saT4KKyAgICAgKiA8bGk+TnVtYmVycyBhcmUgcGFyc2VkLjwvbGk+CisgICAgICogPGxpPkVuZCBvZiBsaW5lcyBhcmUgY29uc2lkZXJlZCB0byBiZSB3aGl0ZSBzcGFjZSByYXRoZXIgdGhhbiBzZXBhcmF0ZQorICAgICAqIHRva2Vucy48L2xpPgorICAgICAqIDxsaT5DLXN0eWxlIGFuZCBDKystc3R5bGUgY29tbWVudHMgYXJlIG5vdCByZWNvZ25pemVkLjwvTEk+CisgICAgICogPC91bD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcgotICAgICAqICAgICAgICAgICAgVGhlIElucHV0U3RyZWFtIHRvIHBhcnNlIHRva2VucyBvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcmVhZGVyIGZyb20gd2hpY2ggdG8gcGFyc2UgdG9rZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICBwdWJsaWMgU3RyZWFtVG9rZW5pemVyKFJlYWRlciByKSB7CiAgICAgICAgIHRoaXMoKTsKICAgICAgICAgaWYgKHIgPT0gbnVsbCkgewpAQCAtMjAwLDExICsyMTYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNoYXJhY3RlciA8Y29kZT5jaDwvY29kZT4gdG8gYmUgcmVnYXJkZWQgYXMgYSBjb21tZW50CisgICAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGNoYXJhY3RlciB7QGNvZGUgY2h9IHNoYWxsIGJlIHRyZWF0ZWQgYXMgYSBjb21tZW50CiAgICAgICogY2hhcmFjdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaAotICAgICAqICAgICAgICAgICAgVGhlIGNoYXJhY3RlciB0byBiZSBjb25zaWRlcmVkIGEgY29tbWVudCBjaGFyYWN0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGJlIGNvbnNpZGVyZWQgYSBjb21tZW50IGNoYXJhY3Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb21tZW50Q2hhcihpbnQgY2gpIHsKICAgICAgICAgaWYgKDAgPD0gY2ggJiYgY2ggPCB0b2tlblR5cGVzLmxlbmd0aCkgewpAQCAtMjEzLDQ1ICsyMzAsNDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgZW5kIG9mIGxpbmUgaXMgc2lnbmlmaWNhbnQgYW5kCi0gICAgICogc2hvdWxkIGJlIHJldHVybmVkIGFzIDxjb2RlPlRUX0VPRjwvY29kZT4gaW4gPGNvZGU+dHR5cGU8L2NvZGU+LgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgYSBsaW5lIGlzIHNpZ25pZmljYW50IGFuZCBzaG91bGQgYmUgcmV0dXJuZWQKKyAgICAgKiBhcyB7QGNvZGUgVFRfRU9GfSBpbiB7QGNvZGUgdHR5cGV9IGJ5IHRoaXMgdG9rZW5pemVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmbGFnCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBFT0wgaXMgc2lnbmlmaWNhbnQsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIEVPTCBpcyBzaWduaWZpY2FudCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW9sSXNTaWduaWZpY2FudChib29sZWFuIGZsYWcpIHsKICAgICAgICAgaXNFT0xTaWduaWZpY2FudCA9IGZsYWc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgdG9rZW5pemVyJ3MgY3VycmVudCBsaW5lIG51bWJlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGxpbmVubygpIHsKICAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRva2VucyBzaG91bGQgYmUgdXBwZXJjYXNlZCB3aGVuCi0gICAgICogcHJlc2VudCBpbiA8Y29kZT5zdmFsPC9jb2RlPi4KKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB3b3JkIHRva2VucyBzaG91bGQgYmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2Ugd2hlbiB0aGV5CisgICAgICogYXJlIHN0b3JlZCBpbiB7QGNvZGUgc3ZhbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZsYWcKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnN2YWw8L2NvZGU+IHNob3VsZCBiZSBmb3JjZWQKLSAgICAgKiAgICAgICAgICAgIHVwcGVyY2FzZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgc3ZhbH0gc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBsb3dlcgorICAgICAqICAgICAgICAgICAgY2FzZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG93ZXJDYXNlTW9kZShib29sZWFuIGZsYWcpIHsKICAgICAgICAgZm9yY2VMb3dlcmNhc2UgPSBmbGFnOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgbmV4dCB0b2tlbiB0eXBlLgorICAgICAqIFBhcnNlcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoaXMgdG9rZW5pemVyJ3Mgc291cmNlIHN0cmVhbSBvciByZWFkZXIuIFRoZQorICAgICAqIHR5cGUgb2YgdGhlIHRva2VuIGlzIHN0b3JlZCBpbiB0aGUge0Bjb2RlIHR0eXBlfSBmaWVsZCwgYWRkaXRpb25hbAorICAgICAqIGluZm9ybWF0aW9uIG1heSBiZSBzdG9yZWQgaW4gdGhlIHtAY29kZSBudmFsfSBvciB7QGNvZGUgc3ZhbH0gZmllbGRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5leHQgdG9rZW4gdG8gYmUgcGFyc2VkLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHtAY29kZSB0dHlwZX0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGVycm9yIG9jY3VycyB3aGlsZSBnZXR0aW5nIHRoZSB0b2tlbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcGFyc2luZyB0aGUgbmV4dCB0b2tlbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgICAgICAgCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAocHVzaEJhY2tUb2tlbikgewpAQCAtNDc5LDExICs1MDAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNoYXJhY3RlciA8Y29kZT5jaDwvY29kZT4gdG8gYmUgcmVnYXJkZWQgYXMgYW4gb3JkaW5hcnkKLSAgICAgKiBjaGFyYWN0ZXIuCisgICAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGNoYXJhY3RlciB7QGNvZGUgY2h9IHNoYWxsIGJlIHRyZWF0ZWQgYXMgYW4gb3JkaW5hcnkKKyAgICAgKiBjaGFyYWN0ZXIgYnkgdGhpcyB0b2tlbml6ZXIuIFRoYXQgaXMsIGl0IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYXMgYQorICAgICAqIGNvbW1lbnQgY2hhcmFjdGVyLCB3b3JkIGNvbXBvbmVudCwgd2hpdGUgc3BhY2UsIHN0cmluZyBkZWxpbWl0ZXIgb3IKKyAgICAgKiBudW1iZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoCi0gICAgICogICAgICAgICAgICBUaGUgY2hhcmFjdGVyIHRvIGJlIGNvbnNpZGVyZWQgYW4gb3JkaW5hcnkgY29tbWVudCBjaGFyYWN0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGJlIGNvbnNpZGVyZWQgYW4gb3JkaW5hcnkgY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9yZGluYXJ5Q2hhcihpbnQgY2gpIHsKICAgICAgICAgaWYgKDAgPD0gY2ggJiYgY2ggPCB0b2tlblR5cGVzLmxlbmd0aCkgewpAQCAtNDkyLDEzICs1MTYsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNoYXJhY3RlcnMgcmFuZ2luZyBmcm9tIDxjb2RlPmxvdzwvY29kZT4gdG8gPGNvZGU+aGk8L2NvZGU+Ci0gICAgICogdG8gYmUgcmVnYXJkZWQgYXMgb3JkaW5hcnkgY2hhcmFjdGVycy4KKyAgICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgZnJvbSB7QGNvZGUgbG93fSB0byB7QGNvZGUgaGl9CisgICAgICogc2hhbGwgYmUgdHJlYXRlZCBhcyBhbiBvcmRpbmFyeSBjaGFyYWN0ZXIgYnkgdGhpcyB0b2tlbml6ZXIuIFRoYXQgaXMsCisgICAgICogdGhleSBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZyBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyLCB3b3JkIGNvbXBvbmVudCwKKyAgICAgKiB3aGl0ZSBzcGFjZSwgc3RyaW5nIGRlbGltaXRlciBvciBudW1iZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvdwotICAgICAqICAgICAgICAgICAgVGhlIHN0YXJ0aW5nIHJhbmdlIGZvciBvcmRpbmFyeSBjaGFyYWN0ZXJzLgorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcmFuZ2Ugb2Ygb3JkaW5hcnkgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gaGkKLSAgICAgKiAgICAgICAgICAgIFRoZSBlbmRpbmcgcmFuZ2UgZm9yIG9yZGluYXJ5IGNoYXJhY3RlcnMuCisgICAgICogICAgICAgICAgICB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIG9mIG9yZGluYXJ5IGNoYXJhY3RlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb3JkaW5hcnlDaGFycyhpbnQgbG93LCBpbnQgaGkpIHsKICAgICAgICAgaWYgKGxvdyA8IDApIHsKQEAgLTUxMyw3ICs1NDAsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgbnVtYmVycyBzaG91bGQgYmUgcGFyc2VkLgorICAgICAqIFNwZWNpZmllcyB0aGF0IHRoaXMgdG9rZW5pemVyIHNoYWxsIHBhcnNlIG51bWJlcnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcGFyc2VOdW1iZXJzKCkgewogICAgICAgICBmb3IgKGludCBpID0gJzAnOyBpIDw9ICc5JzsgaSsrKSB7CkBAIC01MjQsMTggKzU1MywyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdG9rZW4gc2hvdWxkIGJlIHB1c2hlZCBiYWNrIGFuZCByZXR1cm5lZCB0aGUKLSAgICAgKiBuZXh0IHRpbWUgPGNvZGU+bmV4dFRva2VuKCk8L2NvZGU+IGlzIGNhbGxlZC4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCB0b2tlbiBzaG91bGQgYmUgcHVzaGVkIGJhY2sgYW5kIHJldHVybmVkIGFnYWluCisgICAgICogdGhlIG5leHQgdGltZSB7QGNvZGUgbmV4dFRva2VuKCl9IGlzIGNhbGxlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwdXNoQmFjaygpIHsKICAgICAgICAgcHVzaEJhY2tUb2tlbiA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBjaGFyYWN0ZXIgPGNvZGU+Y2g8L2NvZGU+IHRvIGJlIHJlZ2FyZGVkIGFzIGEgcXVvdGUgY2hhcmFjdGVyLgorICAgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBjaGFyYWN0ZXIge0Bjb2RlIGNofSBzaGFsbCBiZSB0cmVhdGVkIGFzIGEgcXVvdGUKKyAgICAgKiBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoCi0gICAgICogICAgICAgICAgICBUaGUgY2hhcmFjdGVyIHRvIGJlIGNvbnNpZGVyZWQgYSBxdW90ZSBjb21tZW50IGNoYXJhY3Rlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gYmUgY29uc2lkZXJlZCBhIHF1b3RlIGNoYXJhY3Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBxdW90ZUNoYXIoaW50IGNoKSB7CiAgICAgICAgIGlmICgwIDw9IGNoICYmIGNoIDwgdG9rZW5UeXBlcy5sZW5ndGgpIHsKQEAgLTU1Miw3ICs1ODUsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IGFsbCBjaGFyYWN0ZXJzIHNvIHRoYXQgdGhleSBhcmUgb3JkaW5hcnkuCisgICAgICogU3BlY2lmaWVzIHRoYXQgYWxsIGNoYXJhY3RlcnMgc2hhbGwgYmUgdHJlYXRlZCBhcyBvcmRpbmFyeSBjaGFyYWN0ZXJzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlc2V0U3ludGF4KCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CkBAIC01NjEsMzQgKzU5NiwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBzbGFzaCBzbGFzaCBjb21tZW50cyBzaG91bGQgYmUKLSAgICAgKiByZWNvZ25pemVkLiBUaGUgY29tbWVudCBlbmRzIGF0IGEgbmV3IGxpbmUuCisgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgInNsYXNoLXNsYXNoIiAoQysrLXN0eWxlKSBjb21tZW50cyBzaGFsbCBiZSByZWNvZ25pemVkLgorICAgICAqIFRoaXMga2luZCBvZiBjb21tZW50IGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmxhZwotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+Ly88L2NvZGU+IHNob3VsZCBiZSByZWNvZ25pemVkCi0gICAgICogICAgICAgICAgICBhcyB0aGUgc3RhcnQgb2YgYSBjb21tZW50LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHtAY29kZSAvL30gc2hvdWxkIGJlIHJlY29nbml6ZWQgYXMgdGhlIHN0YXJ0CisgICAgICogICAgICAgICAgICBvZiBhIGNvbW1lbnQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNsYXNoU2xhc2hDb21tZW50cyhib29sZWFuIGZsYWcpIHsKICAgICAgICAgc2xhc2hTbGFzaENvbW1lbnRzID0gZmxhZzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3Qgc2xhc2ggc3RhciBjb21tZW50cyBzaG91bGQgYmUKLSAgICAgKiByZWNvZ25pemVkLiBTbGFzaC1zdGFyIGNvbW1lbnRzIGNhbm5vdCBiZSBuZXN0ZWQgYW5kIGVuZCB3aGVuIGEKLSAgICAgKiBzdGFyLXNsYXNoIGNvbWJpbmF0aW9uIGlzIGZvdW5kLgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyICJzbGFzaC1zdGFyIiAoQy1zdHlsZSkgY29tbWVudHMgc2hhbGwgYmUgcmVjb2duaXplZC4KKyAgICAgKiBTbGFzaC1zdGFyIGNvbW1lbnRzIGNhbm5vdCBiZSBuZXN0ZWQgYW5kIGVuZCB3aGVuIGEgc3Rhci1zbGFzaAorICAgICAqIGNvbWJpbmF0aW9uIGlzIGZvdW5kLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmbGFnCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT4vKjwvY29kZT4gc2hvdWxkIGJlIHJlY29nbml6ZWQKLSAgICAgKiAgICAgICAgICAgIGFzIHRoZSBzdGFydCBvZiBhIGNvbW1lbnQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIC8qfSBzaG91bGQgYmUgcmVjb2duaXplZCBhcyB0aGUgc3RhcnQKKyAgICAgKiAgICAgICAgICAgIG9mIGEgY29tbWVudCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2xhc2hTdGFyQ29tbWVudHMoYm9vbGVhbiBmbGFnKSB7CiAgICAgICAgIHNsYXNoU3RhckNvbW1lbnRzID0gZmxhZzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHN0YXRlIG9mIHRoaXMgdG9rZW5pemVyIGluIGEgcmVhZGFibGUgZm9ybWF0LgorICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoaXMgdG9rZW5pemVyIGluIGEgcmVhZGFibGUgZm9ybWF0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyB0b2tlbml6ZXIuCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHRva2VuaXplci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtNjI3LDEzICs2NjUsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNoYXJhY3RlcnMgcmFuZ2luZyBmcm9tIDxjb2RlPmxvdzwvY29kZT4gdG8gPGNvZGU+aGk8L2NvZGU+Ci0gICAgICogdG8gYmUgcmVnYXJkZWQgYXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgorICAgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBmcm9tIHtAY29kZSBsb3d9IHRvIHtAY29kZSBoaX0KKyAgICAgKiBzaGFsbCBiZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBieSB0aGlzIHRva2VuaXplci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG93Ci0gICAgICogICAgICAgICAgICBUaGUgc3RhcnRpbmcgcmFuZ2UgZm9yIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gaGkKLSAgICAgKiAgICAgICAgICAgIFRoZSBlbmRpbmcgcmFuZ2UgZm9yIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgcmFuZ2Ugb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdoaXRlc3BhY2VDaGFycyhpbnQgbG93LCBpbnQgaGkpIHsKICAgICAgICAgaWYgKGxvdyA8IDApIHsKQEAgLTY0OCwxMyArNjg3LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBjaGFyYWN0ZXJzIHJhbmdpbmcgZnJvbSA8Y29kZT5sb3c8L2NvZGU+IHRvIDxjb2RlPmhpPC9jb2RlPgotICAgICAqIHRvIGJlIHJlZ2FyZGVkIGFzIHdvcmQgY2hhcmFjdGVycy4KKyAgICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgZnJvbSB7QGNvZGUgbG93fSB0byB7QGNvZGUgaGl9CisgICAgICogc2hhbGwgYmUgdHJlYXRlZCBhcyB3b3JkIGNoYXJhY3RlcnMgYnkgdGhpcyB0b2tlbml6ZXIuIEEgd29yZCBjb25zaXN0cyBvZgorICAgICAqIGEgd29yZCBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHdvcmQgb3IgbnVtYmVyIGNoYXJhY3RlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvdwotICAgICAqICAgICAgICAgICAgVGhlIHN0YXJ0aW5nIHJhbmdlIGZvciB3b3JkIGNoYXJhY3RlcnMuCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSByYW5nZSBvZiB3b3JkIGNoYXJhY3RlcnMuCiAgICAgICogQHBhcmFtIGhpCi0gICAgICogICAgICAgICAgICBUaGUgZW5kaW5nIHJhbmdlIGZvciB3b3JkIGNoYXJhY3RlcnMuCisgICAgICogICAgICAgICAgICB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIG9mIHdvcmQgY2hhcmFjdGVycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3b3JkQ2hhcnMoaW50IGxvdywgaW50IGhpKSB7CiAgICAgICAgIGlmIChsb3cgPCAwKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0uamF2YQppbmRleCBmNTc1OWY1Li44YWIxZjNlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1N0cmluZ0J1ZmZlcklucHV0U3RyZWFtLmphdmEKQEAgLTIwLDMzICsyMCw0NiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtIGlzIGEgY2xhc3MgZm9yIHRvIGFsbG93IGEgU3RyaW5nIHRvIGJlIHVzZWQgYXMgYW4KLSAqIElucHV0U3RyZWFtLgorICogQSBzcGVjaWFsaXplZCB7QGxpbmsgSW5wdXRTdHJlYW19IHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBhIHtAY29kZSBTdHJpbmd9IGluCisgKiBhIHNlcXVlbnRpYWwgbWFubmVyLgogICogCiAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFN0cmluZ1JlYWRlcn0KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIEBEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CiAgICAgLyoqCi0gICAgICogVGhlIFN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhIHRvIHJlYWQuCisgICAgICogVGhlIHNvdXJjZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGF0YSB0byByZWFkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgYnVmZmVyOwogCiAgICAgLyoqCi0gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluc2lkZSB0aGUgYnVmZmVyLgorICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc291cmNlIHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGNvdW50OwogCiAgICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBTdHJpbmcgYnVmZmVyLgorICAgICAqIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc291cmNlIHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHBvczsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0gb24gdGhlIFN0cmluZyA8Y29kZT5zdHI8L2NvZGU+LgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB7QGNvZGUgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW19IHdpdGgge0Bjb2RlIHN0cn0gYXMKKyAgICAgKiBzb3VyY2UuIFRoZSBzaXplIG9mIHRoZSBzdHJlYW0gaXMgc2V0IHRvIHRoZSB7QGNvZGUgbGVuZ3RoKCl9IG9mIHRoZQorICAgICAqIHN0cmluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHJlYWQgY2hhcmFjdGVycyBmcm9tLgorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBzdHJpbmcgZm9yIHRoaXMgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKFN0cmluZyBzdHIpIHsKICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7CkBAIC01NywxMSArNzAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludCByZXByZXNlbnRpbmcgdGhlbiBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdmFpbGFibGUKLSAgICAgKiB0byByZWFkLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBhdmFpbGFibGUgYmVmb3JlIHRoaXMgc3RyZWFtIHdpbGwKKyAgICAgKiBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUuCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgYmxvY2tpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYXZhaWxhYmxlKCkgewpAQCAtNjksMTEgKzgyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoaXMgSW5wdXRTdHJlYW0gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbgotICAgICAqIGludC4gVGhlIGxvdy1vcmRlciBieXRlIGlzIHJldHVybmVkIG9yIC0xIG9mIHRoZSBlbmQgb2Ygc3RyZWFtIHdhcwotICAgICAqIGVuY291bnRlcmVkLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc291cmNlIHN0cmluZyBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyCisgICAgICogaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyNTUuIFJldHVybnMgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZworICAgICAqIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCisgICAgICogQHJldHVybiB0aGUgYnl0ZSByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJpbmcgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgIHJlYWNoZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHsKQEAgLTgxLDIxICs5NiwzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+bGVuZ3RoPC9jb2RlPiBieXRlcyBmcm9tIHRoaXMgSW5wdXRTdHJlYW0gYW5kCi0gICAgICogc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheSA8Y29kZT5iPC9jb2RlPiBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4uIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYKLSAgICAgKiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIGVuZCBvZiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLgorICAgICAqIFJlYWRzIGF0IG1vc3Qge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgZnJvbSB0aGUgc291cmNlIHN0cmluZyBhbmQgc3RvcmVzIHRoZW0KKyAgICAgKiBpbiB0aGUgYnl0ZSBhcnJheSB7QGNvZGUgYn0gc3RhcnRpbmcgYXQge0Bjb2RlIG9mZnNldH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGIKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiA8Y29kZT5iPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBifSB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZCBmcm9tCisgICAgICogICAgICAgICAgICB0aGlzIHN0cmVhbS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gPGNvZGU+YjwvY29kZT4uCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiB7QGNvZGUgYn0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlCisgICAgICogICAgICAgICBzdHJpbmcgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuZ3RoIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYn0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBifSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICAvLyBBY2NvcmRpbmcgdG8gMjIuNy42IHNob3VsZCByZXR1cm4gLTEgYmVmb3JlIGNoZWNraW5nIG90aGVyCiAgICAgICAgIC8vIHBhcmFtZXRlcnMuCiAgICAgICAgIGlmIChwb3MgPj0gY291bnQpIHsKQEAgLTEwNSwxMCArMTMwLDE1IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTXNnLmdldFN0cmluZygiSzAwNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICAvLyBhdm9pZCBpbnQgb3ZlcmZsb3cKLSAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYi5sZW5ndGggfHwgbGVuZ3RoIDwgMAotICAgICAgICAgICAgICAgIHx8IGxlbmd0aCA+IGIubGVuZ3RoIC0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFeGNlcHRpb24gcHJpb3JpdGllcyAoaW4gY2FzZSBvZiBtdWx0aXBsZSBlcnJvcnMpIGRpZmZlciBmcm9tCisgICAgICAgIC8vIFJJLCBidXQgYXJlIHNwZWMtY29tcGxpYW50LgorICAgICAgICAvLyByZW1vdmVkIHJlZHVuZGFudCBjaGVjaywgdXNlZCAob2Zmc2V0IHwgbGVuZ3RoKSA8IDAKKyAgICAgICAgLy8gaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGxlbmd0aCA8IDApIHRvIHNhZmUgb25lIG9wZXJhdGlvbgorICAgICAgICBpZiAoKG9mZnNldCB8IGxlbmd0aCkgPCAwIHx8IGxlbmd0aCA+IGIubGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC0xMjIsOSArMTUyLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldCB0aGlzIElucHV0U3RyZWFtIHRvIHBvc2l0aW9uIDAuIFJlYWRzL1NraXBzIHdpbGwgbm93IHRha2UgcGxhY2UKLSAgICAgKiBmcm9tIHRoaXMgcG9zaXRpb24uCisgICAgICogUmVzZXRzIHRoaXMgc3RyZWFtIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewpAQCAtMTMyLDEzICsxNjIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTa2lwcyA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBJbnB1dFN0cmVhbS4KLSAgICAgKiBTdWJzZXF1ZW50IDxjb2RlPnJlYWQoKTwvY29kZT4ncyB3aWxsIG5vdCByZXR1cm4gdGhlc2UgY2hhcmFjdGVycwotICAgICAqIHVubGVzcyA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyB1c2VkLgorICAgICAqIFNraXBzIHtAY29kZSBufSBjaGFyYWN0ZXJzIGluIHRoZSBzb3VyY2Ugc3RyaW5nLiBJdCBkb2VzIG5vdGhpbmcgYW5kCisgICAgICogcmV0dXJucyAwIGlmIHtAY29kZSBufSBpcyBuZWdhdGl2ZS4gTGVzcyB0aGFuIHtAY29kZSBufSBjaGFyYWN0ZXJzIGFyZQorICAgICAqIHNraXBwZWQgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZyBpcyByZWFjaGVkIGJlZm9yZSB0aGUgb3BlcmF0aW9uCisgICAgICogY29tcGxldGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuCiAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBza2lwcGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBza2lwKGxvbmcgbikgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyaW5nUmVhZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdSZWFkZXIuamF2YQppbmRleCAxZTMwMWIwLi41MmYxMDJhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdSZWFkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdSZWFkZXIuamF2YQpAQCAtMjAsOSArMjAsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBTdHJpbmdSZWFkZXIgaXMgdXNlZCBhcyBhIGNoYXJhY3RlciBpbnB1dCBzdHJlYW0gb24gYSBTdHJpbmcuCisgKiBBIHNwZWNpYWxpemVkIHtAbGluayBSZWFkZXJ9IHRoYXQgcmVhZHMgY2hhcmFjdGVycyBmcm9tIGEge0Bjb2RlIFN0cmluZ30gaW4KKyAqIGEgc2VxdWVudGlhbCBtYW5uZXIuCiAgKiAKICAqIEBzZWUgU3RyaW5nV3JpdGVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU3RyaW5nUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKICAgICBwcml2YXRlIFN0cmluZyBzdHI7CkBAIC0zNCwxMiArMzcsMTMgQEAKICAgICBwcml2YXRlIGludCBjb3VudDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIFN0cmluZ1JlYWRlciBvbiB0aGUgU3RyaW5nIDxjb2RlPnN0cjwvY29kZT4uIFRoZSBzaXplIG9mCi0gICAgICogdGhlIHJlYWRlciBpcyBzZXQgdG8gdGhlIDxjb2RlPmxlbmd0aCgpPC9jb2RlPiBvZiB0aGUgU3RyaW5nIGFuZCB0aGUKLSAgICAgKiBPYmplY3QgdG8gc3luY2hyb25pemUgYWNjZXNzIHRocm91Z2ggaXMgc2V0IHRvIDxjb2RlPnN0cjwvY29kZT4uCisgICAgICogQ29uc3RydWN0IGEgbmV3IHtAY29kZSBTdHJpbmdSZWFkZXJ9IHdpdGgge0Bjb2RlIHN0cn0gYXMgc291cmNlLiBUaGUgc2l6ZQorICAgICAqIG9mIHRoZSByZWFkZXIgaXMgc2V0IHRvIHRoZSB7QGNvZGUgbGVuZ3RoKCl9IG9mIHRoZSBzdHJpbmcgYW5kIHRoZSBPYmplY3QKKyAgICAgKiB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdGhyb3VnaCBpcyBzZXQgdG8ge0Bjb2RlIHN0cn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBmaWx0ZXIgcmVhZHMgb24uCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIHN0cmluZyBmb3IgdGhpcyByZWFkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1JlYWRlcihTdHJpbmcgc3RyKSB7CiAgICAgICAgIHN1cGVyKHN0cik7CkBAIC00OCw5ICs1MiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNsb3NlcyB0aGlzIFN0cmluZ1JlYWRlci4gT25jZSBpdCBpcyBjbG9zZWQsIHlvdSBjYW4gbm8KLSAgICAgKiBsb25nZXIgcmVhZCBmcm9tIGl0LiBPbmx5IHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIGhhcyBhbnkKLSAgICAgKiBlZmZlY3QuCisgICAgICogQ2xvc2VzIHRoaXMgcmVhZGVyLiBPbmNlIGl0IGlzIGNsb3NlZCwgcmVhZCBvcGVyYXRpb25zIG9uIHRoaXMgcmVhZGVyCisgICAgICogd2lsbCB0aHJvdyBhbiB7QGNvZGUgSU9FeGNlcHRpb259LiBPbmx5IHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoaXMKKyAgICAgKiBtZXRob2QgaGFzIGFueSBlZmZlY3QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CkBAIC02MywyNCArNjksMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhpcyBTdHJpbmdSZWFkZXIgaXMgY2xvc2VkLgorICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjbG9zZWQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY2xvc2VkLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQoKSB7CiAgICAgICAgIHJldHVybiBzdHIgPT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgYSBNYXJrIHBvc2l0aW9uIGluIHRoaXMgUmVhZGVyLiBUaGUgcGFyYW1ldGVyIDxjb2RlPnJlYWRMaW1pdDwvY29kZT4KLSAgICAgKiBpcyBpZ25vcmVkIGZvciBTdHJpbmdSZWFkZXJzLiBTZW5kaW5nIHJlc2V0KCkgd2lsbCByZXBvc2l0aW9uIHRoZSByZWFkZXIKLSAgICAgKiBiYWNrIHRvIHRoZSBtYXJrZWQgcG9zaXRpb24gcHJvdmlkZWQgdGhlIG1hcmsgaGFzIG5vdCBiZWVuIGludmFsaWRhdGVkLgorICAgICAqIFNldHMgYSBtYXJrIHBvc2l0aW9uIGluIHRoaXMgcmVhZGVyLiBUaGUgcGFyYW1ldGVyIHtAY29kZSByZWFkTGltaXR9IGlzCisgICAgICogaWdub3JlZCBmb3IgdGhpcyBjbGFzcy4gQ2FsbGluZyB7QGNvZGUgcmVzZXQoKX0gd2lsbCByZXBvc2l0aW9uIHRoZQorICAgICAqIHJlYWRlciBiYWNrIHRvIHRoZSBtYXJrZWQgcG9zaXRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRMaW1pdAotICAgICAqICAgICAgICAgICAgaWdub3JlZCBmb3IgU3RyaW5nUmVhZGVycy4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIGlnbm9yZWQgZm9yIHtAY29kZSBTdHJpbmdSZWFkZXJ9IGluc3RhbmNlcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSByZWFkTGltaXQgPCAwfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgbWFyayB0aGlzIFN0cmluZ1JlYWRlci4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICogQHNlZSAjbWFya1N1cHBvcnRlZCgpCisgICAgICogQHNlZSAjcmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRMaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTk3LDEyICsxMDcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgU3RyaW5nUmVhZGVyIHN1cHBvcnRzCi0gICAgICogbWFyaygpIGFuZCByZXNldCgpLiBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcmVhZGVyIHN1cHBvcnRzIHRoZSB7QGNvZGUgbWFyaygpfSBhbmQge0Bjb2RlCisgICAgICogcmVzZXQoKX0gbWV0aG9kcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAY29kZSB0cnVlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG1hcmsoKSBhbmQgcmVzZXQoKSBhcmUgc3VwcG9ydGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMKLSAgICAgKiAgICAgICAgIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogQHJldHVybiBhbHdheXMge0Bjb2RlIHRydWV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CkBAIC0xMTAsMTQgKzExOSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoaXMgU3RyaW5nUmVhZGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMKLSAgICAgKiBhbiBpbnQuIFRoZSAyIGhpZ2hlci1vcmRlciBieXRlcyBhcmUgc2V0IHRvIDAuIElmIHRoZSBlbmQgb2YgcmVhZGVyIHdhcwotICAgICAqIGVuY291bnRlcmVkIHRoZW4gcmV0dXJuIC0xLgorICAgICAqIFJlYWRzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCByZXR1cm5zIGl0IGFzIGFuCisgICAgICogaW50ZWdlciB3aXRoIHRoZSB0d28gaGlnaGVyLW9yZGVyIGJ5dGVzIHNldCB0byAwLiBSZXR1cm5zIC0xIGlmIHRoZSBlbmQKKyAgICAgKiBvZiB0aGUgc291cmNlIHN0cmluZyBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciByZWFkIG9yIC0xIGlmIGVuZCBvZiByZWFkZXIuCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZyBoYXMgYmVlbgorICAgICAqICAgICAgICAgcmVhY2hlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIFN0cmluZ1JlYWRlciBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEzMiwxOCArMTQyLDQ2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhdCBtb3N0IHtAY29kZSBsZW59IGNoYXJhY3RlcnMgZnJvbSB0aGUgc291cmNlIHN0cmluZyBhbmQgc3RvcmVzCisgICAgICogdGhlbSBhdCB7QGNvZGUgb2Zmc2V0fSBpbiB0aGUgY2hhcmFjdGVyIGFycmF5IHtAY29kZSBidWZ9LiBSZXR1cm5zIHRoZQorICAgICAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZworICAgICAqIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBhcnJheSB0byBzdG9yZSB0aGUgY2hhcmFjdGVycyByZWFkLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHtAY29kZSBidWZmZXJ9IHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICByZWFkIGZyb20gdGhpcyByZWFkZXIuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHJlYWRlciBoYXMKKyAgICAgKiAgICAgICAgIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuIDwgMH0sIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG9mZnNldCArIGxlbn0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHtAY29kZSBidWZ9LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKGNoYXIgYnVmW10sIGludCBvZmZzZXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1Zi5sZW5ndGggfHwgbGVuIDwgMAotICAgICAgICAgICAgICAgIHx8IGxlbiA+IGJ1Zi5sZW5ndGggLSBvZmZzZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEV4Y2VwdGlvbiBwcmlvcml0aWVzIChpbiBjYXNlIG9mIG11bHRpcGxlIGVycm9ycykgZGlmZmVyIGZyb20KKyAgICAgICAgLy8gUkksIGJ1dCBhcmUgc3BlYy1jb21wbGlhbnQuCisgICAgICAgIC8vIHJlbW92ZWQgcmVkdW5kYW50IGNoZWNrLCBhZGRlZCBudWxsIGNoZWNrLCB1c2VkIChvZmZzZXQgfCBsZW4pIDwgMAorICAgICAgICAvLyBpbnN0ZWFkIG9mIChvZmZzZXQgPCAwKSB8fCAobGVuIDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmIChidWYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgaWYgKChvZmZzZXQgfCBsZW4pIDwgMCB8fCBsZW4gPiBidWYubGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDJmIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKICAgICAgICAgICAgIGlmIChpc0Nsb3NlZCgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDgzIikpOyAvLyROT04tTkxTLTEkCkBAIC0xNjAsMTkgKzE5OCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMKLSAgICAgKiBTdHJpbmdSZWFkZXIgaXMgcmVhZHkgdG8gYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLiBJZiB0aGUgcmVzdWx0IGlzCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBuZXh0IDxjb2RlPnJlYWQoKTwvY29kZT4gd2lsbCBub3QgYmxvY2suIElmCi0gICAgICogdGhlIHJlc3VsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4gdGhpcyBSZWFkZXIgbWF5IG9yIG1heSBub3QgYmxvY2sgd2hlbgotICAgICAqIDxjb2RlPnJlYWQoKTwvY29kZT4gaXMgc2VudC4gVGhlIGltcGxlbWVudGF0aW9uIGluIFN0cmluZ1JlYWRlciBhbHdheXMKLSAgICAgKiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGV2ZW4gd2hlbiBpdCBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyByZWFkZXIgaXMgcmVhZHkgdG8gYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLiBUaGlzCisgICAgICogaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMge0Bjb2RlIHRydWV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlY2VpdmVyIHdpbGwgbm90IGJsb2NrIHdoZW4KLSAgICAgKiAgICAgICAgIDxjb2RlPnJlYWQoKTwvY29kZT4gaXMgY2FsbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdW5rbm93bgotICAgICAqICAgICAgICAgb3IgYmxvY2tpbmcgd2lsbCBvY2N1ci4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB7QGNvZGUgdHJ1ZX0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElPIGVycm9yIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICogQHNlZSAjcmVhZCgpCisgICAgICogQHNlZSAjcmVhZChjaGFyW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE4NSwxMyArMjE5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzZXQgdGhpcyBTdHJpbmdSZWFkZXIncyBwb3NpdGlvbiB0byB0aGUgbGFzdCA8Y29kZT5tYXJrKCk8L2NvZGU+Ci0gICAgICogbG9jYXRpb24uIEludm9jYXRpb25zIG9mIDxjb2RlPnJlYWQoKS9za2lwKCk8L2NvZGU+IHdpbGwgb2NjdXIgZnJvbQotICAgICAqIHRoaXMgbmV3IGxvY2F0aW9uLiBJZiB0aGlzIFJlYWRlciB3YXMgbm90IG1hcmtlZCwgdGhlIFN0cmluZ1JlYWRlciBpcwotICAgICAqIHJlc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFN0cmluZy4KKyAgICAgKiBSZXNldHMgdGhpcyByZWFkZXIncyBwb3NpdGlvbiB0byB0aGUgbGFzdCB7QGNvZGUgbWFyaygpfSBsb2NhdGlvbi4KKyAgICAgKiBJbnZvY2F0aW9ucyBvZiB7QGNvZGUgcmVhZCgpfSBhbmQge0Bjb2RlIHNraXAoKX0gd2lsbCBvY2N1ciBmcm9tIHRoaXMgbmV3CisgICAgICogbG9jYXRpb24uIElmIHRoaXMgcmVhZGVyIGhhcyBub3QgYmVlbiBtYXJrZWQsIGl0IGlzIHJlc2V0IHRvIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiB0aGUgc291cmNlIHN0cmluZy4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBTdHJpbmdSZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI21hcmtTdXBwb3J0ZWQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTIwMywxMCArMjQwLDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKKyAgICAvKioKKyAgICAgKiBTa2lwcyB7QGNvZGUgYW1vdW50fSBjaGFyYWN0ZXJzIGluIHRoZSBzb3VyY2Ugc3RyaW5nLiBTdWJzZXF1ZW50IGNhbGxzIG9mCisgICAgICoge0Bjb2RlIHJlYWR9IG1ldGhvZHMgd2lsbCBub3QgcmV0dXJuIHRoZXNlIGNoYXJhY3RlcnMgdW5sZXNzIHtAY29kZQorICAgICAqIHJlc2V0KCl9IGlzIHVzZWQuCiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLmlvLlJlYWRlciNza2lwKGxvbmcpCisgICAgICogQHBhcmFtIG5zCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHNraXBwZWQgb3IgMCBpZiB7QGNvZGUgbnMgPCAwfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqIEBzZWUgI21hcmsoaW50KQorICAgICAqIEBzZWUgI21hcmtTdXBwb3J0ZWQoKQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdXcml0ZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1N0cmluZ1dyaXRlci5qYXZhCmluZGV4IDAxN2UzZTIuLmNjMjQ0YWQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1N0cmluZ1dyaXRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1N0cmluZ1dyaXRlci5qYXZhCkBAIC0xNywyMSArMTcsMzEgQEAKIAogcGFja2FnZSBqYXZhLmlvOwogCisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CisvLyBFTmQgYW5kcm9pZC1hZGRlZAorCiAvKioKLSAqIFN0cmluZ1dyaXRlciBpcyBhbiBjbGFzcyBmb3Igd3JpdGluZyBDaGFyYWN0ZXIgU3RyZWFtcyB0byBhIFN0cmluZ0J1ZmZlci4gVGhlCi0gKiBjaGFyYWN0ZXJzIHdyaXR0ZW4gY2FuIHRoZW4gYmUgcmV0dXJuZWQgYXMgYSBTdHJpbmcuIFRoaXMgaXMgdXNlZCBmb3IKLSAqIGNhcHR1cmluZyBvdXRwdXQgc2VudCB0byBhIFdyaXRlciBieSBzdWJzdGl0dXRpbmcgYSBTdHJpbmdXcml0ZXIuCisgKiBBIHNwZWNpYWxpemVkIHtAbGluayBXcml0ZXJ9IHRoYXQgd3JpdGVzIGNoYXJhY3RlcnMgdG8gYSB7QGNvZGUgU3RyaW5nQnVmZmVyfQorICogaW4gYSBzZXF1ZW50aWFsIG1hbm5lciwgYXBwZW5kaW5nIHRoZW0gaW4gdGhlIHByb2Nlc3MuIFRoZSByZXN1bHQgY2FuIGxhdGVyCisgKiBiZSBxdWVyaWVkIHVzaW5nIHRoZSB7QGxpbmsgI1N0cmluZ1dyaXRlcihpbnQpfSBvciB7QGxpbmsgI3RvU3RyaW5nKCl9CisgKiBtZXRob2RzLgogICogCiAgKiBAc2VlIFN0cmluZ1JlYWRlcgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFN0cmluZ1dyaXRlciBleHRlbmRzIFdyaXRlciB7CiAKICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWY7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ1dyaXRlciB3aGljaCBoYXMgYSBTdHJpbmdCdWZmZXIgYWxsb2NhdGVkIHdpdGggdGhlCi0gICAgICogZGVmYXVsdCBzaXplIG9mIDE2IGNoYXJhY3RlcnMuIFRoZSBTdHJpbmdCdWZmZXIgaXMgYWxzbyB0aGUKLSAgICAgKiA8Y29kZT5sb2NrPC9jb2RlPiB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGlzIFdyaXRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdXcml0ZXJ9IHdoaWNoIGhhcyBhIHtAbGluayBTdHJpbmdCdWZmZXJ9CisgICAgICogYWxsb2NhdGVkIHdpdGggdGhlIGRlZmF1bHQgc2l6ZSBvZiAxNiBjaGFyYWN0ZXJzLiBUaGUge0Bjb2RlCisgICAgICogU3RyaW5nQnVmZmVyfSBpcyBhbHNvIHRoZSB7QGNvZGUgbG9ja30gdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhpcworICAgICAqIHdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nV3JpdGVyKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtNDAsMTIgKzUwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTdHJpbmdXcml0ZXIgd2hpY2ggaGFzIGEgU3RyaW5nQnVmZmVyIGFsbG9jYXRlZCB3aXRoIHRoZQotICAgICAqIHNpemUgb2YgPGNvZGU+aW5pdGlhbFNpemU8L2NvZGU+IGNoYXJhY3RlcnMuIFRoZSBTdHJpbmdCdWZmZXIgaXMgYWxzbwotICAgICAqIHRoZSA8Y29kZT5sb2NrPC9jb2RlPiB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGlzIFdyaXRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdXcml0ZXJ9IHdoaWNoIGhhcyBhIHtAbGluayBTdHJpbmdCdWZmZXJ9CisgICAgICogYWxsb2NhdGVkIHdpdGggYSBzaXplIG9mIHtAY29kZSBpbml0aWFsU2l6ZX0gY2hhcmFjdGVycy4gVGhlIHtAY29kZQorICAgICAqIFN0cmluZ0J1ZmZlcn0gaXMgYWxzbyB0aGUge0Bjb2RlIGxvY2t9IHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoaXMKKyAgICAgKiB3cml0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluaXRpYWxTaXplCi0gICAgICogICAgICAgICAgICB0aGUgaW50aWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgaW50aWFsIHNpemUgb2YgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdXcml0ZXIoaW50IGluaXRpYWxTaXplKSB7CiAgICAgICAgIGlmIChpbml0aWFsU2l6ZSA8IDApIHsKQEAgLTU2LDExICs2OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgV3JpdGVyLiBUaGlzIGlzIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZC4gVGhpcwotICAgICAqIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4gSW4gY29udHJhc3QgdG8gbW9zdCB7QGNvZGUgV3JpdGVyfSBzdWJjbGFzc2VzLAorICAgICAqIHRoZSBvdGhlciBtZXRob2RzIGluIHtAY29kZSBTdHJpbmdXcml0ZXJ9IGRvIG5vdCB0aHJvdyBhbiB7QGNvZGUgSU9FeGNlcHRpb259IGlmCisgICAgICoge0Bjb2RlIGNsb3NlKCl9IGhhcyBiZWVuIGNhbGxlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSU8gZXJyb3Igb2NjdXJzIGNsb3NpbmcgdGhpcyBTdHJpbmdXcml0ZXIuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhpcyB3cml0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNjgsOCArODIsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgV3JpdGVyLiBUaGlzIGlzIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZC4gVGhpcwotICAgICAqIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKQEAgLTc3LDExICs5MiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgY29udGVudHMgb2YgdGhpcyBTdHJpbmdXcml0ZXIgYXMgYSBTdHJpbmdCdWZmZXIuIEFueSBjaGFuZ2VzCi0gICAgICogbWFkZSB0byB0aGUgU3RyaW5nQnVmZmVyIGJ5IHRoZSByZWNlaXZlciBvciB0aGUgY2FsbGVyIGFyZSByZWZsZWN0ZWQgaW4KLSAgICAgKiB0aGlzIFN0cmluZ1dyaXRlci4KKyAgICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoaXMgd3JpdGVyJ3MgaW50ZXJuYWwge0BsaW5rIFN0cmluZ0J1ZmZlcn0uIEFueQorICAgICAqIGNoYW5nZXMgbWFkZSB0byB0aGUgcmV0dXJuZWQgYnVmZmVyIGFyZSByZWZsZWN0ZWQgaW4gdGhpcyB3cml0ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGlzIFN0cmluZ1dyaXRlcnMgbG9jYWwgU3RyaW5nQnVmZmVyLgorICAgICAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhpcyB3cml0ZXIncyBpbnRlcm5hbCB7QGNvZGUgU3RyaW5nQnVmZmVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CkBAIC05MCwxMSArMTA1LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBjb250ZW50cyBvZiB0aGlzIFN0cmluZ1dyaXRlciBhcyBhIFN0cmluZy4gQW55IGNoYW5nZXMgbWFkZSB0bwotICAgICAqIHRoZSBTdHJpbmdCdWZmZXIgYnkgdGhlIHJlY2VpdmVyIGFmdGVyIHJldHVybmluZyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4KLSAgICAgKiB0aGUgU3RyaW5nIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgICAgICogR2V0cyBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd3JpdGVyIGFzIGEgc3RyaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdXcml0ZXJzIGN1cnJlbnQgY29udGVudHMgYXMgYSBTdHJpbmcuCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlcidzIGNvbnRlbnRzIGFzIGEgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0xMDQsMzggKzExOCw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gY2hhcmFjdGVycyBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+Ci0gICAgICogaW4gPGNvZGU+Y2J1ZjwvY29kZT4gdG8gdGhpcyBTdHJpbmdXcml0ZXIuCisgICAgICogV3JpdGVzIHtAY29kZSBjb3VudH0gY2hhcmFjdGVycyBzdGFydGluZyBhdCB7QGNvZGUgb2Zmc2V0fSBpbiB7QGNvZGUgYnVmfQorICAgICAqIHRvIHRoaXMgd3JpdGVyJ3Mge0Bjb2RlIFN0cmluZ0J1ZmZlcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBhcnJheSBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgY2hhcmFjdGVyIGFycmF5IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiBidWYgdG8gcmV0cmlldmUgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4ge0Bjb2RlIGNidWZ9IHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgb2Zmc2V0IG9yIGNvdW50IGFyZSBvdXRzaWRlIG9mIGJvdW5kcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgY291bnQgPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgY291bnR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB7QGNvZGUgYnVmfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gY2J1ZiwgaW50IG9mZnNldCwgaW50IGNvdW50KSB7CiAgICAgICAgIC8vIGF2b2lkIGludCBvdmVyZmxvdwotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBjYnVmLmxlbmd0aCB8fCBjb3VudCA8IDAKLSAgICAgICAgICAgICAgICB8fCBjb3VudCA+IGNidWYubGVuZ3RoIC0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gRXhjZXB0aW9uIHByaW9yaXRpZXMgKGluIGNhc2Ugb2YgbXVsdGlwbGUgZXJyb3JzKSBkaWZmZXIgZnJvbQorICAgICAgICAvLyBSSSwgYnV0IGFyZSBzcGVjLWNvbXBsaWFudC4KKyAgICAgICAgLy8gcmVtb3ZlZCByZWR1bmRhbnQgY2hlY2ssIGFkZGVkIG51bGwgY2hlY2ssIHVzZWQgKG9mZnNldCB8IGNvdW50KSA8IDAKKyAgICAgICAgLy8gaW5zdGVhZCBvZiAob2Zmc2V0IDwgMCkgfHwgKGNvdW50IDwgMCkgdG8gc2FmZSBvbmUgb3BlcmF0aW9uCisgICAgICAgIGlmIChjYnVmID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA0NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CisgICAgICAgIGlmICgob2Zmc2V0IHwgY291bnQpIDwgMCB8fCBjb3VudCA+IGNidWYubGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDAyZiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CiAgICAgICAgICAgICB0aGlzLmJ1Zi5hcHBlbmQoY2J1Ziwgb2Zmc2V0LCBjb3VudCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgPGNvZGU+b25lQ2hhcjwvY29kZT4gdG8gdGhpcwotICAgICAqIFN0cmluZ1dyaXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIGxvdyBvcmRlciB0d28gYnl0ZXMgdG8gdGhlCi0gICAgICogU3RyZWFtLgorICAgICAqIFdyaXRlcyBvbmUgY2hhcmFjdGVyIHRvIHRoaXMgd3JpdGVyJ3Mge0Bjb2RlIFN0cmluZ0J1ZmZlcn0uIE9ubHkgdGhlIHR3bworICAgICAqIGxlYXN0IHNpZ25pZmljYW50IGJ5dGVzIG9mIHRoZSBpbnRlZ2VyIHtAY29kZSBvbmVDaGFyfSBhcmUgd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb25lQ2hhcgotICAgICAqICAgICAgICAgICAgVGhlIGNoYXJhY3RlciB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byB3cml0ZSB0byB0aGlzIHdyaXRlcidzIHtAY29kZSBTdHJpbmdCdWZmZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBvbmVDaGFyKSB7CkBAIC0xNDUsMTEgKzE2OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBTdHJpbmcgPGNvZGU+c3RyPC9jb2RlPiB0byB0aGlzCi0gICAgICogU3RyaW5nV3JpdGVyLgorICAgICAqIFdyaXRlcyB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoaXMgd3JpdGVyJ3Mge0Bjb2RlCisgICAgICogU3RyaW5nQnVmZmVyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHN0cikgewpAQCAtMTU5LDE5ICsxODMsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Y291bnQ8L2NvZGU+IG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPiBmcm9tIHRoZSBTdHJpbmcgPGNvZGU+c3RyPC9jb2RlPiB0byB0aGlzCi0gICAgICogU3RyaW5nV3JpdGVyLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgZnJvbSB7QGNvZGUgc3RyfSBzdGFydGluZyBhdCB7QGNvZGUKKyAgICAgKiBvZmZzZXR9IHRvIHRoaXMgd3JpdGVyJ3Mge0Bjb2RlIFN0cmluZ0J1ZmZlcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlLgorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIHN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb2ludCB0byByZXRyaWV2ZSBjaGFyYWN0ZXJzLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4ge0Bjb2RlIHN0cn0gdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0cmlldmUgYW5kIHdyaXRlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgb2Zmc2V0IG9yIGNvdW50IGFyZSBvdXRzaWRlIG9mIGJvdW5kcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHtAY29kZSBzdHJ9IHRvIHdyaXRlLgorICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgY291bnQgPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgY291bnR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzdHJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzdHIsIGludCBvZmZzZXQsIGludCBjb3VudCkgewpAQCAtMTgyLDEzICsyMDYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBjaGFyIDxjb2RlPmM8L2NvZGU+dG8gdGhlIFN0cmluZ1dyaXRlci4gVGhlCi0gICAgICogU3RyaW5nV3JpdGVyLmFwcGVuZCg8Y29kZT5jPC9jb2RlPikgd29ya3MgdGhlIHNhbWUgd2F5IGFzCi0gICAgICogU3RyaW5nV3JpdGVyLndyaXRlKDxjb2RlPmM8L2NvZGU+KS4KKyAgICAgKiBBcHBlbmRzIHRoZSBjaGFyYWN0ZXIge0Bjb2RlIGN9IHRvIHRoaXMgd3JpdGVyJ3Mge0Bjb2RlIFN0cmluZ0J1ZmZlcn0uCisgICAgICogVGhpcyBtZXRob2Qgd29ya3MgdGhlIHNhbWUgd2F5IGFzIHtAbGluayAjd3JpdGUoaW50KX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgYXBwZW5kZWQgdG8gdGhlIFN0cmluZ1dyaXRlci4KLSAgICAgKiBAcmV0dXJuIFRoZSBTdHJpbmdXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGFwcGVuZCB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdXcml0ZXIgYXBwZW5kKGNoYXIgYykgewpAQCAtMTk3LDE0ICsyMjEsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBDaGFyU2VxdWVuY2UgPGNvZGU+Y3NxPC9jb2RlPiB0byB0aGUgU3RyaW5nV3JpdGVyLiBUaGUKLSAgICAgKiBTdHJpbmdXcml0ZXIuYXBwZW5kKDxjb2RlPmNzcTwvY29kZT4pIHdvcmtzIHRoZSBzYW1lIHdheSBhcwotICAgICAqIFN0cmluZ1dyaXRlci53cml0ZSg8Y29kZT5jc3E8L2NvZGU+LnRvU3RyaW5nKCkpLiBJZiA8Y29kZT5jc3E8L2NvZGU+Ci0gICAgICogaXMgbnVsbCwgdGhlbiAibnVsbCIgd2lsbCBiZSBzdWJzdGl0dXRlZCBmb3IgPGNvZGU+Y3NxPC9jb2RlPi4KKyAgICAgKiBBcHBlbmRzIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Uge0Bjb2RlIGNzcX0gdG8gdGhpcyB3cml0ZXIncyB7QGNvZGUKKyAgICAgKiBTdHJpbmdCdWZmZXJ9LiBUaGlzIG1ldGhvZCB3b3JrcyB0aGUgc2FtZSB3YXkgYXMge0Bjb2RlCisgICAgICogU3RyaW5nV3JpdGVyLndyaXRlKGNzcS50b1N0cmluZygpKX0uIElmIHtAY29kZSBjc3F9IGlzIHtAY29kZSBudWxsfSwgdGhlbgorICAgICAqIHRoZSBzdHJpbmcgIm51bGwiIGlzIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNzcQotICAgICAqICAgICAgICAgICAgVGhlIENoYXJTZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgU3RyaW5nV3JpdGVyLgotICAgICAqIEByZXR1cm4gVGhlIFN0cmluZ1dyaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1dyaXRlciBhcHBlbmQoQ2hhclNlcXVlbmNlIGNzcSkgewpAQCAtMjE3LDI2ICsyNDIsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBzdWJzZXF1ZW5jZSBvZiBhIENoYXJTZXF1ZW5jZSA8Y29kZT5jc3E8L2NvZGU+IHRvIHRoZQotICAgICAqIFN0cmluZ1dyaXRlci4gVGhlIGZpcnN0IGNoYXIgYW5kIHRoZSBsYXN0IGNoYXIgb2YgdGhlIHN1YnNlcXVuY2UgaXMKLSAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4uCi0gICAgICogVGhlIFN0cmluZ1dyaXRlci5hcHBlbmQoPGNvZGU+Y3NxPC9jb2RlPikgd29ya3MgdGhlIHNhbWUgd2F5IGFzCi0gICAgICogU3RyaW5nV3JpdGVyLndyaXRlKDxjb2RlPmNzcTwvY29kZT4uc3ViU2VxdWVuY2UoPGNvZGU+c3RhcnQ8L2NvZGU+LDxjb2RlPmVuZDwvY29kZT4pLnRvU3RyaW5nKS5JZgotICAgICAqIDxjb2RlPmNzcTwvY29kZT4gaXMgbnVsbCwgdGhlbiAibnVsbCIgd2lsbCBiZSBzdWJzdGl0dXRlZCBmb3IKLSAgICAgKiA8Y29kZT5jc3E8L2NvZGU+LiBzCisgICAgICogQXBwZW5kcyBhIHN1YnNlcXVlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Uge0Bjb2RlIGNzcX0gdG8gdGhpcworICAgICAqIHdyaXRlcidzIHtAY29kZSBTdHJpbmdCdWZmZXJ9LiBUaGlzIG1ldGhvZCB3b3JrcyB0aGUgc2FtZSB3YXkgYXMge0Bjb2RlCisgICAgICogU3RyaW5nV3JpdGVyLndyaXRlcihjc3Euc3Vic2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKSl9LiBJZiB7QGNvZGUKKyAgICAgKiBjc3F9IGlzIHtAY29kZSBudWxsfSwgdGhlbiB0aGUgc3BlY2lmaWVkIHN1YnNlcXVlbmNlIG9mIHRoZSBzdHJpbmcgIm51bGwiCisgICAgICogd2lsbCBiZSB3cml0dGVuIHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNzcQotICAgICAqICAgICAgICAgICAgVGhlIENoYXJTZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgU3RyaW5nV3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgdGFyZ2V0LgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyIGluIHRoZSBDaGFyU2VxdWVuY2UgYXBwZW5kZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmdXcml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXIgaW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhcHBlbmRlZAorICAgICAqICAgICAgICAgICAgdG8gdGhlIHRhcmdldC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGNoYXIgYWZ0ZXIgdGhlIGxhc3Qgb25lIGluIHRoZSBDaGFyU2VxdWVuY2UKLSAgICAgKiAgICAgICAgICAgIGFwcGVuZGVkIHRvIHRoZSBTdHJpbmdXcml0ZXIuCi0gICAgICogQHJldHVybiBUaGUgU3RyaW5nV3JpdGVyLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHN0YXJ0IGlzIGxlc3MgdGhhbiBlbmQsIGVuZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgotICAgICAqICAgICAgICAgICAgIHRoZSBDaGFyU2VxdWVuY2UsIG9yIHN0YXJ0IG9yIGVuZCBpcyBuZWdhdGl2ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBzdWJzZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgdGFyZ2V0LgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0ID4gZW5kfSwge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBlbmQgPCAwfSBvcgorICAgICAqICAgICAgICAgICAgIGVpdGhlciB7QGNvZGUgc3RhcnR9IG9yIHtAY29kZSBlbmR9IGFyZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHtAY29kZSBjc3F9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdXcml0ZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBjc3EsIGludCBzdGFydCwgaW50IGVuZCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3luY0ZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3luY0ZhaWxlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDJhZmQ3NmMuLjJmOGQ5YzcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1N5bmNGYWlsZWRFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TeW5jRmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTE4LDIxICsxOCwyMiBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFRoaXMgSU8gZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHRoZSBtZXRob2QgPGNvZGU+c3luYygpPC9jb2RlPiBpbgotICogRmlsZURlc2NyaXB0b3IgZmFpbGVkIHRvIGNvbXBsZXRlLgorICogU2lnbmFscyB0aGF0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc3luYygpfSBtZXRob2QgaGFzIGZhaWxlZCB0bworICogY29tcGxldGUuCiAgKiAKLSAqIEBzZWUgRmlsZURlc2NyaXB0b3Ijc3luYygpCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFN5bmNGYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjM1MzM0MjY4NDQxMjQ0MzMzMEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3luY0ZhaWxlZEV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UgYW5kCisgICAgICogZGV0YWlsIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTeW5jRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDc1NGE2MzcuLjIwYTdhYmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1VURkRhdGFGb3JtYXRFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9VVEZEYXRhRm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDI4ICsxOCwzNCBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFRoaXMgSU8gZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byByZWFkIGEgVVRGLTggU3RyaW5nCi0gKiBhbmQgdGhlIGVuY29kaW5nIGlzIGluY29ycmVjdC4KKyAqIFNpZ25hbHMgdGhhdCBhbiBpbmNvcnJlY3RseSBlbmNvZGVkIFVURi04IHN0cmluZyBoYXMgYmVlbiBlbmNvdW50ZXJlZCwgbW9zdAorICogbGlrZWx5IHdoaWxlIHJlYWRpbmcgc29tZSB7QGxpbmsgRGF0YUlucHV0U3RyZWFtfS4KICAqIAogICogQHNlZSBEYXRhSW5wdXRTdHJlYW0jcmVhZFVURigpCi0gKi8KKyAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorKi8KIHB1YmxpYyBjbGFzcyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDIwNzQzNDQ5MjI4MjgwNjEyTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UKKyAgICAgKiBmaWxsZWQgaW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVURkRhdGFGb3JtYXRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVURkRhdGFGb3JtYXRFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrIHRyYWNlIGFuZAorICAgICAqIGRldGFpbCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24uamF2YQppbmRleCA4Y2E2ODYyLi5kZWVhYjI5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyNiArMTgsMzMgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBUaGlzIElPIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIHByb2dyYW0gYXNrcyBmb3IgYSBwYXJ0aWN1bGFyIGNoYXJhY3RlcgotICogY29udmVydGVyIGFuZCBpdCBpcyBub3QgYXZhaWxhYmxlLgorICogU2lnbmFscyB0aGF0IGEgcmVxdWVzdGVkIGNoYXJhY3RlciBlbmNvZGluZyBpcyBub3QgYXZhaWxhYmxlLCBlaXRoZXIgYmVjYXVzZQorICogaXQgaXMgbm90IGluY2x1ZGVkIGEgc3BlY2lmaWMgQW5kcm9pZCBzeXN0ZW0sIG9yIGJlY2F1c2UgdGhlIGVuY29kaW5nIG5hbWUKKyAqIGlzIHNpbXBseSBpbmNvcnJlY3QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00Mjc0Mjc2Mjk4MzI2MTM2NjcwTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sKKyAgICAgKiB0cmFjZSBmaWxsZWQgaW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb259IHdpdGggaXRzIHN0YWNrCisgICAgICogdHJhY2UgYW5kIGRldGFpbCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1dyaXRlQWJvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vV3JpdGVBYm9ydGVkRXhjZXB0aW9uLmphdmEKaW5kZXggYTdhZjcwNy4uMDJjMmY3MCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vV3JpdGVBYm9ydGVkRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vV3JpdGVBYm9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTE4LDM0ICsxOCwzOSBAQAogcGFja2FnZSBqYXZhLmlvOwogCiAvKioKLSAqIFRoaXMgdHlwZSBvZiBleGNlcHRpb24gaXMgdGhyb3duIGJ5IHJlYWRPYmplY3QoKSB3aGVuIGl0IGRldGVjdHMgYW4gZXhjZXB0aW9uCi0gKiBtYXJrZXIgaW4gdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBtYXJrZXIgaW5kaWNhdGVzIHRoYXQgd2hlbiB0aGUgb2JqZWN0IHdhcwotICogYmVpbmcgc2VyaWFsaXplZCwgYW4gZXhjZXB0aW9uIGhhcHBlbmVkIGFuZCB0aGlzIG1hcmtlciB3YXMgaW5zZXJ0ZWQgaW5zdGVhZAorICogU2lnbmFscyB0aGF0IHRoZSB7QGxpbmsgT2JqZWN0SW5wdXRTdHJlYW0jcmVhZE9iamVjdCgpfSBtZXRob2QgaGFzIGRldGVjdGVkCisgKiBhbiBleGNlcHRpb24gbWFya2VyIGluIHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgbWFya2VyIGluZGljYXRlcyB0aGF0IGV4Y2VwdGlvbgorICogb2NjdXJyZWQgd2hlbiB0aGUgb2JqZWN0IHdhcyBzZXJpYWxpemVkLCBhbmQgdGhpcyBtYXJrZXIgd2FzIGluc2VydGVkIGluc3RlYWQKICAqIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuIEl0IGlzIGEgd2F5IHRvICJwcm9wYWdhdGUiIGFuIGV4Y2VwdGlvbiBmcm9tIHRoZSBjb2RlCiAgKiB0aGF0IGF0dGVtcHRlZCB0byB3cml0ZSB0aGUgb2JqZWN0IHRvIHRoZSBjb2RlIHRoYXQgaXMgYXR0ZW1wdGluZyB0byByZWFkIHRoZQogICogb2JqZWN0LgogICogCiAgKiBAc2VlIE9iamVjdElucHV0U3RyZWFtI3JlYWRPYmplY3QoKQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFdyaXRlQWJvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzMyNjQyNjYyNTU5NzI4MjQ0Mkw7CiAKICAgICAvKioKLSAgICAgKiBUaGUgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdXNlZCB3aGVuIHdyaXRlT2JqZWN0KCkgd2FzIGF0dGVtcHRpbmcgdG8KLSAgICAgKiBzZXJpYWxpemUgdGhlIG9iamVjdAorICAgICAqIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cmVkIHdoZW4gd3JpdGVPYmplY3QoKSB3YXMgYXR0ZW1wdGluZyB0byBzZXJpYWxpemUKKyAgICAgKiB0aGUgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFeGNlcHRpb24gZGV0YWlsOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrLCBtZXNzYWdlIGFuZAotICAgICAqIHRoZSBleGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSB1bmRlcmx5aW5nIHByb2JsZW0gd2hlbiBzZXJpYWxpemluZyB0aGUKLSAgICAgKiBvYmplY3QgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFdyaXRlQWJvcnRlZEV4Y2VwdGlvbn0gd2l0aCBpdHMgc3RhY2sgdHJhY2UsCisgICAgICogZGV0YWlsIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSB1bmRlcmx5aW5nIHByb2JsZW0gd2hlbgorICAgICAqIHNlcmlhbGl6aW5nIHRoZSBvYmplY3QgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSByb290Q2F1c2UKLSAgICAgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbSB3aGVuIHNlcmlhbGl6aW5nIHRoZSBvYmplY3QuCisgICAgICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93biB3aGVuIHNlcmlhbGl6aW5nIHRoZSBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFdyaXRlQWJvcnRlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSwgRXhjZXB0aW9uIHJvb3RDYXVzZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKQEAgLTU0LDExICs1OSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIG1lc3NhZ2Ugd2hpY2ggd2FzIHByb3ZpZGVkIHdoZW4gdGhlCi0gICAgICogdGhyb3dhYmxlIHdhcyBjcmVhdGVkLiBJZiBubyBtZXNzYWdlIHdhcyBwcm92aWRlZCBhdCBjcmVhdGlvbiB0aW1lLCB0aGVuCi0gICAgICogYW5zd2VyIG51bGwuCisgICAgICogR2V0cyB0aGUgZXh0cmEgaW5mb3JtYXRpb24gbWVzc2FnZSB3aGljaCB3YXMgcHJvdmlkZWQgd2hlbiB0aGlzIGV4Y2VwdGlvbgorICAgICAqIHdhcyBjcmVhdGVkLiBSZXR1cm5zIHtAY29kZSBudWxsfSBpZiBubyBtZXNzYWdlIHdhcyBwcm92aWRlZCBhdCBjcmVhdGlvbgorICAgICAqIHRpbWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBtZXNzYWdlLgorICAgICAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKQEAgLTcwLDkgKzc2LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F1c2Ugb2YgdGhpcyBUaHJvd2FibGUsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gY2F1c2UuCisgICAgICogR2V0cyB0aGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vIGNhdXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgY2F1c2UuCisgICAgICogQHJldHVybiB0aGUgZXhjZXB0aW9uIGNhdXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9Xcml0ZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1dyaXRlci5qYXZhCmluZGV4IDRlYTU1NWYuLjkxZDI1NzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1dyaXRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1dyaXRlci5qYXZhCkBAIC0xOCwxMSArMTgsMjMgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogLyoqCi0gKiBXcml0ZXIgaXMgYW4gQWJzdHJhY3QgY2xhc3MgZm9yIHdyaXRpbmcgQ2hhcmFjdGVyIFN0cmVhbXMuIFN1YmNsYXNzZXMgb2YKLSAqIHdyaXRlciBtdXN0IGltcGxlbWVudCB0aGUgbWV0aG9kcyA8Y29kZT53cml0ZShjaGFyW10sIGludCwgaW50KTwvY29kZT4sCi0gKiA8Y29kZT5jbG9zZSgpPC9jb2RlPiBhbmQgPGNvZGU+Zmx1c2goKTwvY29kZT4uCisgKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIHdyaXRlcnMuIEEgd3JpdGVyIGlzIGEgbWVhbnMgb2Ygd3JpdGluZyBkYXRhIHRvIGEKKyAqIHRhcmdldCBpbiBhIGNoYXJhY3Rlci13aXNlIG1hbm5lci4gTW9zdCBvdXRwdXQgc3RyZWFtcyBleHBlY3QgdGhlCisgKiB7QGxpbmsgI2ZsdXNoKCl9IG1ldGhvZCB0byBiZSBjYWxsZWQgYmVmb3JlIGNsb3NpbmcgdGhlIHN0cmVhbSwgdG8gZW5zdXJlIGFsbAorICogZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuIG91dC4KKyAqIDxwPgorICogVGhpcyBhYnN0cmFjdCBjbGFzcyBkb2VzIG5vdCBwcm92aWRlIGEgZnVsbHkgd29ya2luZyBpbXBsZW1lbnRhdGlvbiwgc28gaXQKKyAqIG5lZWRzIHRvIGJlIHN1YmNsYXNzZWQsIGFuZCBhdCBsZWFzdCB0aGUge0BsaW5rICN3cml0ZShjaGFyW10sIGludCwgaW50KX0sCisgKiB7QGxpbmsgI2Nsb3NlKCl9IGFuZCB7QGxpbmsgI2ZsdXNoKCl9IG1ldGhvZHMgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbi4KKyAqIE92ZXJyaWRpbmcgc29tZSBvZiB0aGUgbm9uLWFic3RyYWN0IG1ldGhvZHMgaXMgYWxzbyBvZnRlbiBhZHZpc2VkLCBzaW5jZSBpdAorICogbWlnaHQgcmVzdWx0IGluIGhpZ2hlciBlZmZpY2llbmN5LgorICogPHA+CisgKiBNYW55IHNwZWNpYWxpemVkIHJlYWRlcnMgZm9yIHB1cnBvc2VzIGxpa2UgcmVhZGluZyBmcm9tIGEgZmlsZSBhbHJlYWR5IGV4aXN0CisgKiBpbiB0aGlzIHBhY2thZ2UuCiAgKiAKICAqIEBzZWUgUmVhZGVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV3JpdGVyIGltcGxlbWVudHMgQXBwZW5kYWJsZSwgQ2xvc2VhYmxlLCBGbHVzaGFibGUgewogCkBAIC0zMCwxMiArNDIsMTYgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBvYmplY3QgdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IGxvY2s7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNoYXJhY3RlciBzdHJlYW0gV3JpdGVyIHVzaW5nIDxjb2RlPnRoaXM8L2NvZGU+IGFzIHRoZQotICAgICAqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBjcml0aWNhbCByZWdpb25zIGFyb3VuZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBXcml0ZXJ9IHdpdGgge0Bjb2RlIHRoaXN9IGFzIHRoZSBvYmplY3QgdXNlZCB0bworICAgICAqIHN5bmNocm9uaXplIGNyaXRpY2FsIHNlY3Rpb25zLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBXcml0ZXIoKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC00MywxMSArNTksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNoYXJhY3RlciBzdHJlYW0gV3JpdGVyIHVzaW5nIDxjb2RlPmxvY2s8L2NvZGU+IGFzIHRoZQotICAgICAqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBjcml0aWNhbCByZWdpb25zIGFyb3VuZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBXcml0ZXJ9IHdpdGgge0Bjb2RlIGxvY2t9IHVzZWQgdG8gc3luY2hyb25pemUKKyAgICAgKiBjcml0aWNhbCBzZWN0aW9ucy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jawotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBzeW5jaHJvbml6ZSBjcml0aWNhbCByZWdpb25zIGFyb3VuZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSB1c2VkIHRvIHN5bmNocm9uaXplIGNyaXRpY2FsIHNlY3Rpb25zLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbG9ja30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBXcml0ZXIoT2JqZWN0IGxvY2spIHsKICAgICAgICAgaWYgKGxvY2sgPT0gbnVsbCkgewpAQCAtNTcsNjMgKzc2LDczIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhpcyBXcml0ZXIuIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbnkgY29uY3JldGUgc3ViY2xhc3Nlcy4KLSAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGZyZWUgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFdyaXRlci4KKyAgICAgKiBDbG9zZXMgdGhpcyB3cml0ZXIuIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgZnJlZSBhbnkKKyAgICAgKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3cml0ZXIuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoaXMgV3JpdGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRmx1c2ggdGhpcyBXcml0ZXIuIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbnkgY29uY3JldGUgc3ViY2xhc3Nlcy4KLSAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGVuc3VyZSBhbGwgYnVmZmVyZWQgY2hhcmFjdGVycyBhcmUgd3JpdHRlbiBvdXQuCisgICAgICogRmx1c2hlcyB0aGlzIHdyaXRlci4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBlbnN1cmUgdGhhdAorICAgICAqIGFsbCBidWZmZXJlZCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoaXMgV3JpdGVyLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBmbHVzaGluZyB0aGlzIHdyaXRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZW50aXJlIGNoYXJhY3RlciBidWZmZXIgPGNvZGU+YnVmPC9jb2RlPiB0byB0aGlzIFdyaXRlci4KKyAgICAgKiBXcml0ZXMgdGhlIGVudGlyZSBjaGFyYWN0ZXIgYnVmZmVyIHtAY29kZSBidWZ9IHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZgogICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIGFycmF5IGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byB3cml0ZS4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBXcml0ZXIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQgb3Igc29tZSBvdGhlcgotICAgICAqICAgICAgICAgICAgIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHdyaXRlciBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIGNoYW5nZWQgYXJyYXkgbm90YXRpb24gdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIGhhcm1vbnkKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICB3cml0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gY2hhcmFjdGVycyBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8Y29kZT4gaW4KLSAgICAgKiA8Y29kZT5idWY8L2NvZGU+IHRvIHRoaXMgV3JpdGVyLiAgVGhpcyBhYnN0cmFjdCBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZAotICAgICAqIGJ5IGNvbmNyZXRlIHN1YmNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmIHRoZSBub24tbnVsbCBhcnJheSBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gd3JpdGUuCi0gICAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW4gYnVmIHRvIHJldHJpZXZlIGNoYXJhY3RlcnMKLSAgICAgKiBAcGFyYW0gY291bnQgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZQotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGlzIFdyaXRlciBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBvciBzb21lIG90aGVyIElPRXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBJZiBvZmZzZXQgb3IgY291bnQgYXJlIG91dHNpZGUgb2YgYm91bmRzLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQge0Bjb2RlIG9mZnNldH0gaW4ge0Bjb2RlIGJ1Zn0KKyAgICAgKiB0byB0aGUgdGFyZ2V0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBjaGFyYWN0ZXIgYXJyYXkgdG8gd3JpdGUuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4ge0Bjb2RlIGJ1Zn0gdG8gd3JpdGUuCisgICAgICogQHBhcmFtIGNvdW50CisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGNvdW50IDwgMH0sIG9yIGlmIHtAY29kZQorICAgICAqICAgICAgICAgICAgIG9mZnNldCArIGNvdW50fSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2Yge0Bjb2RlIGJ1Zn0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgd3JpdGVyIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoY2hhciBidWZbXSwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBjb3VudCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBjaGFuZ2VkIGFycmF5IG5vdGF0aW9uIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBoYXJtb255CisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIDxjb2RlPm9uZUNoYXI8L2NvZGU+IHRvIHRoaXMgV3JpdGVyLgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gd3JpdGVzIHRoZSBsb3cgb3JkZXIgdHdvIGJ5dGVzIG9mCi0gICAgICogPGNvZGU+b25lQ2hhcjwvY29kZT4gdG8gdGhlIFN0cmVhbS4KKyAgICAgKiBXcml0ZXMgb25lIGNoYXJhY3RlciB0byB0aGUgdGFyZ2V0LiBPbmx5IHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMKKyAgICAgKiBvZiB0aGUgaW50ZWdlciB7QGNvZGUgb25lQ2hhcn0gYXJlIHdyaXR0ZW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9uZUNoYXIKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgdG8gd3JpdGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gd3JpdGUgdG8gdGhlIHRhcmdldC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBXcml0ZXIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQgb3Igc29tZSBvdGhlcgotICAgICAqICAgICAgICAgICAgIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHdyaXRlciBpcyBjbG9zZWQgb3IgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBvbmVDaGFyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKQEAgLTEyNCwxNCArMTUzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBjaGFyYWN0ZXJzIGZyb20gdGhlIFN0cmluZyA8Y29kZT5zdHI8L2NvZGU+IHRvIHRoaXMgV3JpdGVyLgorICAgICAqIFdyaXRlcyB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIHN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIFdyaXRlciBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBvciBzb21lIG90aGVyCi0gICAgICogICAgICAgICAgICAgSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgd3JpdGVyIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hhciBidWZbXSA9IG5ldyBjaGFyW3N0ci5sZW5ndGgoKV07CkBAIC0xNDIsMjEgKzE3MCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jb3VudDwvY29kZT4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGZyb20gdGhlIFN0cmluZyA8Y29kZT5zdHI8L2NvZGU+IHRvIHRoaXMgV3JpdGVyLgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGNoYXJhY3RlcnMgZnJvbSB7QGNvZGUgc3RyfSBzdGFydGluZyBhdCB7QGNvZGUKKyAgICAgKiBvZmZzZXR9IHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlLgorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIHN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb2ludCB0byByZXRyaWV2ZSBjaGFyYWN0ZXJzLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4ge0Bjb2RlIHN0cn0gdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0cmlldmUgYW5kIHdyaXRlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20ge0Bjb2RlIHN0cn0gdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgV3JpdGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIG9yIHNvbWUgb3RoZXIKLSAgICAgKiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBvY2N1cnMuCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBvZmZzZXQgb3IgY291bnQgYXJlIG91dHNpZGUgb2YgYm91bmRzLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgd3JpdGVyIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBjb3VudCA8IDB9LCBvciBpZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXQgKyBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIHN0cn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHN0ciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoY291bnQgPCAwKSB7IC8vIG90aGVyIGNhc2VzIHRlc3RlZCBieSBnZXRDaGFycygpCkBAIC0xNzEsMTQgKzE5OSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGVuZCBhIGNoYXIgPGNvZGU+YzwvY29kZT50byB0aGUgV3JpdGVyLiBUaGUgV3JpdGVyLmFwcGVuZCg8Y29kZT5jPC9jb2RlPikKLSAgICAgKiB3b3JrcyB0aGUgc2FtZSBhcyBXcml0ZXIud3JpdGUoPGNvZGU+YzwvY29kZT4pLgorICAgICAqIEFwcGVuZHMgdGhlIGNoYXJhY3RlciB7QGNvZGUgY30gdG8gdGhlIHRhcmdldC4gVGhpcyBtZXRob2Qgd29ya3MgdGhlIHNhbWUKKyAgICAgKiB3YXkgYXMge0BsaW5rICN3cml0ZShpbnQpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBhcHBlbmRlZCB0byB0aGUgV3JpdGVyLgotICAgICAqIEByZXR1cm4gVGhlIFdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gYXBwZW5kIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBJT0V4Y2VwdGlvbiByYWlzZXMgZHVyaW5nIHRoZSBwcm9jZWR1cmUuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB3cml0ZXIgaXMgY2xvc2VkIG9yIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGVyIGFwcGVuZChjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlKGMpOwpAQCAtMTg2LDE2ICsyMTUsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBDaGFyU2VxdWVuY2UgPGNvZGU+Y3NxPC9jb2RlPiB0byB0aGUgV3JpdGVyLiBUaGUKLSAgICAgKiBXcml0ZXIuYXBwZW5kKDxjb2RlPmNzcTwvY29kZT4pIHdvcmtzIHRoZSBzYW1lIHdheSBhcyBXcml0ZXIud3JpdGUoPGNvZGU+Y3NxPC9jb2RlPi50b1N0cmluZygpKS4KLSAgICAgKiBJZiA8Y29kZT5jc3E8L2NvZGU+IGlzIG51bGwsIHRoZW4gIm51bGwiIHdpbGwgYmUgc3Vic3RpdHV0ZWQgZm9yCi0gICAgICogPGNvZGU+Y3NxPC9jb2RlPi4KKyAgICAgKiBBcHBlbmRzIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Uge0Bjb2RlIGNzcX0gdG8gdGhlIHRhcmdldC4gVGhpcyBtZXRob2QKKyAgICAgKiB3b3JrcyB0aGUgc2FtZSB3YXkgYXMge0Bjb2RlIFdyaXRlci53cml0ZShjc3EudG9TdHJpbmcoKSl9LiBJZiB7QGNvZGUKKyAgICAgKiBjc3F9IGlzIHtAY29kZSBudWxsfSwgdGhlbiB0aGUgc3RyaW5nICJudWxsIiBpcyB3cml0dGVuIHRvIHRoZSB0YXJnZXQKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNzcQotICAgICAqICAgICAgICAgICAgVGhlIENoYXJTZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgV3JpdGVyLgotICAgICAqIEByZXR1cm4gVGhlIFdyaXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbnkgSU9FeGNlcHRpb24gcmFpc2VzIGR1cmluZyB0aGUgcHJvY2VkdXJlLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgd3JpdGVyIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFdyaXRlciBhcHBlbmQoQ2hhclNlcXVlbmNlIGNzcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgPT0gY3NxKSB7CkBAIC0yMDcsMjcgKzIzNywyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGVuZCBhIHN1YnNlcXVlbmNlIG9mIGEgQ2hhclNlcXVlbmNlIDxjb2RlPmNzcTwvY29kZT4gdG8gdGhlIFdyaXRlci4KLSAgICAgKiBUaGUgZmlyc3QgY2hhciBhbmQgdGhlIGxhc3QgY2hhciBvZiB0aGUgc3Vic2VxdW5jZSBpcyBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICogcGFyYW1ldGVyIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPi4gVGhlCi0gICAgICogV3JpdGVyLmFwcGVuZCg8Y29kZT5jc3E8L2NvZGU+KSB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgV3JpdGVyLndyaXRlICg8Y29kZT5jc3E8L2NvZGU+Y3NxLnN1YlNlcXVlbmNlKDxjb2RlPnN0YXJ0PC9jb2RlPiw8Y29kZT5lbmQ8L2NvZGU+KS50b1N0cmluZykuCi0gICAgICogSWYgPGNvZGU+Y3NxPC9jb2RlPiBpcyBudWxsLCB0aGVuICJudWxsIiB3aWxsIGJlIHN1YnN0aXR1dGVkIGZvcgotICAgICAqIDxjb2RlPmNzcTwvY29kZT4uCisgICAgICogQXBwZW5kcyBhIHN1YnNlcXVlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Uge0Bjb2RlIGNzcX0gdG8gdGhlCisgICAgICogdGFyZ2V0LiBUaGlzIG1ldGhvZCB3b3JrcyB0aGUgc2FtZSB3YXkgYXMge0Bjb2RlCisgICAgICogV3JpdGVyLndyaXRlcihjc3Euc3Vic2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKSl9LiBJZiB7QGNvZGUKKyAgICAgKiBjc3F9IGlzIHtAY29kZSBudWxsfSwgdGhlbiB0aGUgc3BlY2lmaWVkIHN1YnNlcXVlbmNlIG9mIHRoZSBzdHJpbmcgIm51bGwiCisgICAgICogd2lsbCBiZSB3cml0dGVuIHRvIHRoZSB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNzcQotICAgICAqICAgICAgICAgICAgVGhlIENoYXJTZXF1ZW5jZSBhcHBlbmRlZCB0byB0aGUgV3JpdGFlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIHRhcmdldC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhciBpbiB0aGUgQ2hhclNlcXVlbmNlIGFwcGVuZGVkIHRvCi0gICAgICogICAgICAgICAgICB0aGUgV3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyIGluIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYXBwZW5kZWQKKyAgICAgKiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGFyIGFmdGVyIHRoZSBsYXN0IG9uZSBpbiB0aGUgQ2hhclNlcXVlbmNlCi0gICAgICogICAgICAgICAgICBhcHBlbmRlZCB0byB0aGUgV3JpdGVyLgotICAgICAqIEByZXR1cm4gVGhlIFdyaXRlci4KLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBzdGFydCBpcyBsZXNzIHRoYW4gZW5kLCBlbmQgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKLSAgICAgKiAgICAgICAgICAgICB0aGUgQ2hhclNlcXVlbmNlLCBvciBzdGFydCBvciBlbmQgaXMgbmVnYXRpdmUuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgc3Vic2VxdWVuY2UgYXBwZW5kZWQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbnkgSU9FeGNlcHRpb24gcmFpc2VzIGR1cmluZyB0aGUgcHJvY2VkdXJlLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgd3JpdGVyIGlzIGNsb3NlZCBvciBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0ID4gZW5kfSwge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBlbmQgPCAwfSBvcgorICAgICAqICAgICAgICAgICAgIGVpdGhlciB7QGNvZGUgc3RhcnR9IG9yIHtAY29kZSBlbmR9IGFyZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHtAY29kZSBjc3F9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBXcml0ZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBjc3EsIGludCBzdGFydCwgaW50IGVuZCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9wYWNrYWdlLmh0bWwKaW5kZXggMDgzZTViMy4uYzNkYWVkNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vcGFja2FnZS5odG1sCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL3BhY2thZ2UuaHRtbApAQCAtMiwxMyArMiwxNSBAQAogICA8Ym9keT4KICAgICA8cD4KICAgICAgIFByb3ZpZGVzIGlucHV0IGFuZCBvdXRwdXQgZmFjaWxpdGllcyBieSBtZWFucyBvZiBzdHJlYW1pbmcsCi0gICAgICBmaWxlc3lzdGVtIGFjY2VzcyBhbmQgc2VyaWFsaXphdGlvbi4KKyAgICAgIGZpbGUgc3lzdGVtIGFjY2VzcyBhbmQgc2VyaWFsaXphdGlvbi4KICAgICA8L3A+CiAgICAgPHA+Ci0gICAgICBUaGVzZSBjbGFzc2VzIGFsbG93IHlvdSB0byBnZXQgZGlyZWN0IGFjY2VzcyB0byB0aGUgZmlsZXN5c3RlbS4KKyAgICAgIFRoZXNlIGNsYXNzZXMgYWxsb3cgeW91IHRvIGdldCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBmaWxlIHN5c3RlbS4KICAgICAgIEl0IGFsc28gZ2l2ZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGhhbmRsZSBkYXRhIHN0cmVhbXMgYnVmZmVyZWQgb3IKICAgICAgIHVuYnVmZmVyZWQuIEFuZCBvbiB0b3Agb2YgdGhhdCB0aGVyZSBhcmUgY2xhc3NlcyB0aGF0IGhlbHAgdG8gYWJzdHJhY3QKICAgICAgIGRhdGEgc3RyZWFtcyBhcyBzdHJlYW1zIG9mIGNoYXJzLCBzdHJpbmdzIG9yIGV2ZW4gb2JqZWN0cy4KICAgICA8L3A+CisgICAgCisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQWJzdHJhY3RNZXRob2RFcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9BYnN0cmFjdE1ldGhvZEVycm9yLmphdmEKaW5kZXggMjVhY2I1ZC4uY2RmYTBlYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9BYnN0cmFjdE1ldGhvZEVycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9BYnN0cmFjdE1ldGhvZEVycm9yLmphdmEKQEAgLTE3LDMxICsxNywzNSBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIFZNIG5vdGljZXMgdGhhdCBhIGFuIGF0dGVtcHQgaXMgYmVpbmcgbWFkZSB0bwotICogaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZC4KKyAqIFRocm93biBieSB0aGUgdmlydHVhbCBtYWNoaW5lIHdoZW4gYW4gYWJzdHJhY3QgbWV0aG9kIGlzIGNhbGxlZC4KICAqIDxwPgotICogTm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgb2NjdXIgd2hlbiBpbmNvbnNpc3RhbnQgY2xhc3MgZmlsZXMgYXJlIGJlaW5nIGxvYWRlZCwKKyAqIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4gaW5jb25zaXN0ZW50IGNsYXNzIGZpbGVzIGhhdmUgYmVlbiBsb2FkZWQsCiAgKiBzaW5jZSBpbnZva2luZyBhbiBhYnN0cmFjdCBtZXRob2QgaXMgYSBjb21waWxlIHRpbWUgZXJyb3IuCisgKiA8L3A+CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFic3RyYWN0TWV0aG9kRXJyb3IgZXh0ZW5kcyBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNjU0MzkxMDgyOTg5MDE4NDYyTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQWJzdHJhY3RNZXRob2RFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBYnN0cmFjdE1ldGhvZEVycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBYnN0cmFjdE1ldGhvZEVycm9yfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFic3RyYWN0TWV0aG9kRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Fic3RyYWN0U3RyaW5nQnVpbGRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9BYnN0cmFjdFN0cmluZ0J1aWxkZXIuamF2YQppbmRleCA2NzdlMjFhLi4zOTQ1OWEwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Fic3RyYWN0U3RyaW5nQnVpbGRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQWJzdHJhY3RTdHJpbmdCdWlsZGVyLmphdmEKQEAgLTI2LDEzICsyNiwxMiBAQAogICogPHA+CiAgKiBBIG1vZGlmaWFibGUge0BsaW5rIENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzfSBmb3IgdXNlIGluIGNyZWF0aW5nCiAgKiBhbmQgbW9kaWZ5aW5nIFN0cmluZ3MuIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgYXMgYSBiYXNlIGNsYXNzIGZvcgotICoge0BsaW5rIGphdmEubGFuZy5TdHJpbmdCdWZmZXJ9IGFuZCB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXJ9LgorICoge0BsaW5rIFN0cmluZ0J1ZmZlcn0gYW5kIHtAbGluayBTdHJpbmdCdWlsZGVyfS4KICAqIDwvcD4KICAqCi0gKiBAc2VlIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKLSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLSAqCi0gKiBAc2luY2UgMS41CisgKiBAc2VlIFN0cmluZ0J1ZmZlcgorICogQHNlZSBTdHJpbmdCdWlsZGVyCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHJpbmdCdWlsZGVyIHsKIApAQCAtMTg3LDYgKzE4Niw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGludCBhZGRpbmcgPSBlbmQgLSBzdGFydDsKICAgICAgICAgaW50IG5ld1NpemUgPSBjb3VudCArIGFkZGluZzsKICAgICAgICAgaWYgKG5ld1NpemUgPiB2YWx1ZS5sZW5ndGgpIHsKQEAgLTIwOCwxNCArMjA4LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLmNvdW50ID0gbmV3U2l6ZTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoaXMgU3RyaW5nQnVmZmVyIGNhbiBob2xkIHdpdGhvdXQKLSAgICAgKiBncm93aW5nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2FwYWNpdHkgb2YgdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGhlbGQgd2l0aG91dCBncm93aW5nLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNhcGFjaXR5CiAgICAgICogQHNlZSAjZW5zdXJlQ2FwYWNpdHkKICAgICAgKiBAc2VlICNsZW5ndGgKICAgICAgKi8KQEAgLTIyNCwxNiArMjIzLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0cmlldmVzIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciBhdCB0aGUge0Bjb2RlIGluZGV4fS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIGNoYXJhY3RlciBpbiB0aGlzIG9iamVjdCB0byByZXRyaWV2ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBjaGFyIHZhbHVlLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybiB0aGUgY2hhciB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCi0gICAgICogICAgICAgICAgICAgdG8gdGhlIGN1cnJlbnQge0BsaW5rICNsZW5ndGgoKX0uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICAgICogICAgICAgICAgICAgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7CiAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY291bnQpIHsKQEAgLTI5MiwxOCArMjg5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogRW5zdXJlcyB0aGF0IHRoaXMgb2JqZWN0IGhhcyBhIG1pbmltdW0gY2FwYWNpdHkgYXZhaWxhYmxlIGJlZm9yZQogICAgICAqIHJlcXVpcmluZyB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGJlIGVubGFyZ2VkLiBUaGUgZ2VuZXJhbCBwb2xpY3kgb2YgdGhpcwotICAgICAqIG1ldGhvZCBpcyB0aGF0IGlmIHRoZSA8Y29kZT5taW5pbXVtQ2FwYWNpdHk8L2NvZGU+IGlzIGxhcmdlciB0aGFuIHRoZQotICAgICAqIGN1cnJlbnQge0BsaW5rICNjYXBhY2l0eSgpfSwgdGhlbiB0aGUgY2FwYWNpdHkgd2lsbCBiZSBpbmNyZWFzZWQgdG8gdGhlCi0gICAgICogbGFyZ2VzdCB2YWx1ZSBvZiBlaXRoZXIgdGhlIDxjb2RlPm1pbmltdW1DYXBhY2l0eTwvY29kZT4gb3IgdGhlIGN1cnJlbnQKLSAgICAgKiBjYXBhY2l0eSBtdWx0aXBsaWVkIGJ5IHR3byBwbHVzIHR3by4gQWx0aG91Z2ggdGhpcyBpcyB0aGUgZ2VuZXJhbCBwb2xpY3ksCi0gICAgICogdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGNhcGFjaXR5IHdpbGwgY2hhbmdlLgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIG1ldGhvZCBpcyB0aGF0IGlmIHRoZSB7QGNvZGUgbWluaW11bUNhcGFjaXR5fSBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjY2FwYWNpdHkoKX0sIHRoZW4gdGhlIGNhcGFjaXR5IHdpbGwgYmUgaW5jcmVhc2VkIHRvIHRoZSBsYXJnZXN0CisgICAgICogdmFsdWUgb2YgZWl0aGVyIHRoZSB7QGNvZGUgbWluaW11bUNhcGFjaXR5fSBvciB0aGUgY3VycmVudCBjYXBhY2l0eQorICAgICAqIG11bHRpcGxpZWQgYnkgdHdvIHBsdXMgdHdvLiBBbHRob3VnaCB0aGlzIGlzIHRoZSBnZW5lcmFsIHBvbGljeSwgdGhlcmUgaXMKKyAgICAgKiBubyBndWFyYW50ZWUgdGhhdCB0aGUgY2FwYWNpdHkgd2lsbCBjaGFuZ2UuCisgICAgICogCiAgICAgICogQHBhcmFtIG1pbgotICAgICAqICAgICAgICAgICAgVGhlIG5ldyBtaW5pbXVtIGNhcGFjaXR5IHRvIHNldC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbWluaW11bSBjYXBhY2l0eSB0byBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG1pbikgewogICAgICAgICBpZiAobWluID4gdmFsdWUubGVuZ3RoKSB7CkBAIC0zMTIsMjkgKzMwNywyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvcGllcyB0aGUgcmVxdWVzdGVkIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdG8gYmUgY29waWVkIHRvIHRoZQotICAgICAqIDxjb2RlPmNoYXJbXTwvY29kZT4gcGFzc2VkLgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIENvcGllcyB0aGUgcmVxdWVzdGVkIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdG8gdGhlIHtAY29kZSBjaGFyW119IHBhc3NlZAorICAgICAqIHN0YXJ0aW5nIGF0IHtAY29kZSBkZXN0U3RhcnR9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleCBvZiB0aGUgY2hhcmFjdGVycyB0byBjb3B5IGZyb20gdGhpcwotICAgICAqICAgICAgICAgICAgb2JqZWN0LgorICAgICAqICAgICAgICAgICAgdGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleCBvZiB0aGUgY2hhcmFjdGVycyB0byBjb3B5LgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBleGNsdXNpdmUgZW5kIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXJzIHRvIGNvcHkgZnJvbSB0aGlzCi0gICAgICogICAgICAgICAgICBvYmplY3QuCisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGVuZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVycyB0byBjb3B5LgogICAgICAqIEBwYXJhbSBkZXN0Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB0byBjb3B5IHRoZSBjaGFyYWN0ZXJzIHRvLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBjaGFyW119IHRvIGNvcHkgdGhlIGNoYXJhY3RlcnMgdG8uCiAgICAgICogQHBhcmFtIGRlc3RTdGFydAotICAgICAqICAgICAgICAgICAgVGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleCBvZiB0aGUgPGNvZGU+ZGVzdDwvY29kZT4gcGFyYW1ldGVyCi0gICAgICogICAgICAgICAgICB0byBiZWdpbiBjb3B5aW5nIHRvLgorICAgICAqICAgICAgICAgICAgdGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleCBvZiB7QGNvZGUgZGVzdH0gdG8gYmVnaW4gY29weWluZyB0by4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIG5lZ2F0aXZlLCB0aGUKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5kZXN0U3RhcnQ8L2NvZGU+IGlzIG5lZ2F0aXZlLCB0aGUgPGNvZGU+c3RhcnQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIDxjb2RlPmVuZDwvY29kZT4sIHRoZSA8Y29kZT5lbmQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+ZGVzdFN0YXJ0ICsgZW5kIC0gYmVnaW48L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmRlc3QubGVuZ3RoPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIHN0YXJ0fSBpcyBuZWdhdGl2ZSwgdGhlIHtAY29kZSBkZXN0U3RhcnR9IGlzCisgICAgICogICAgICAgICAgICAgbmVnYXRpdmUsIHRoZSB7QGNvZGUgc3RhcnR9IGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZW5kfSwgdGhlCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGVuZH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9IG9yCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGRlc3RTdGFydCArIGVuZCAtIGJlZ2lufSBpcyBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgZGVzdC5sZW5ndGh9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldENoYXJzKGludCBzdGFydCwgaW50IGVuZCwgY2hhcltdIGRlc3QsIGludCBkZXN0U3RhcnQpIHsKICAgICAgICAgaWYgKHN0YXJ0ID4gY291bnQgfHwgZW5kID4gY291bnQgfHwgc3RhcnQgPiBlbmQpIHsKQEAgLTQxMSwxMSArNDAwLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY3VycmVudCBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBTdHJpbmdCdWZmZXIKKyAgICAgKiBUaGUgY3VycmVudCBsZW5ndGguCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CiAgICAgICAgIHJldHVybiBjb3VudDsKQEAgLTUxMCwxNyArNDk3LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaW4gdGhpcyBvYmplY3QuCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIGF0IHRoZSB7QGNvZGUgaW5kZXh9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byByZXBsYWNlLgogICAgICAqIEBwYXJhbSBjaAogICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBzZXQuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAotICAgICAqICAgICAgICAgICAgIHRvIHRoZSBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleH0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIGN1cnJlbnQge0BsaW5rICNsZW5ndGgoKX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2hhckF0KGludCBpbmRleCwgY2hhciBjaCkgewogICAgICAgICBpZiAoMCA+IGluZGV4IHx8IGluZGV4ID49IGNvdW50KSB7CkBAIC01MzQsMTggKzUxOSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIFNldHMgdGhlIGN1cnJlbnQgbGVuZ3RoIHRvIGEgbmV3IHZhbHVlLiBJZiB0aGUgbmV3IGxlbmd0aCBpcyBsYXJnZXIgdGhhbgogICAgICAqIHRoZSBjdXJyZW50IGxlbmd0aCwgdGhlbiB0aGUgbmV3IGNoYXJhY3RlcnMgYXQgdGhlIGVuZCBvZiB0aGlzIG9iamVjdAotICAgICAqIHdpbGwgY29udGFpbiB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdmFsdWUgb2YgPGNvZGU+XHUwMDAwPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiB3aWxsIGNvbnRhaW4gdGhlIHtAY29kZSBjaGFyfSB2YWx1ZSBvZiB7QGNvZGUgXHUwMDAwfS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IGxlbmd0aCBvZiB0aGlzIFN0cmluZ0J1ZmZlcgotICAgICAqCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGxlbmd0aCBvZiB0aGlzIFN0cmluZ0J1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxlbmd0aCA8IDA8L2NvZGU+Ci0gICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgbGVuZ3RoIDwgMH0uCiAgICAgICogQHNlZSAjbGVuZ3RoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKQEAgLTU3MCwxNyArNTUxLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBzdWJzZXF1ZW5jZSBvZiB0aGlzIG9iamVjdCBmcm9tIHRoZQotICAgICAqIDxjb2RlPnN0YXJ0PC9jb2RlPiBpbmRleCB0byB0aGUgY3VycmVudCBlbmQuCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBzdWJzZXF1ZW5jZSBmcm9tIHRoZSB7QGNvZGUgc3RhcnR9IGluZGV4CisgICAgICogdG8gdGhlIGN1cnJlbnQgZW5kLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleCB0byBiZWdpbiB0aGUgc3Vic2VxdWVuY2UuCi0gICAgICogQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSBzdWJzZXF1ZW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmNsdXNpdmUgc3RhcnQgaW5kZXggdG8gYmVnaW4gdGhlIHN1YnNlcXVlbmNlLgorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgc3Vic2VxdWVuY2UuCiAgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUKLSAgICAgKiAgICAgICAgICAgICBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydH0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAge0BsaW5rICNsZW5ndGgoKX0uCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBzdWJzdHJpbmcoaW50IHN0YXJ0KSB7CiAgICAgICAgIGlmICgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGNvdW50KSB7CkBAIC01OTUsMTkgKzU3NCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgc3Vic2VxdWVuY2Ugb2YgdGhpcyBvYmplY3QgZnJvbSB0aGUKLSAgICAgKiA8Y29kZT5zdGFydDwvY29kZT4gaW5kZXggdG8gdGhlIDxjb2RlPnN0YXJ0PC9jb2RlPiBpbmRleC4KLSAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIHN1YnNlcXVlbmNlIGZyb20gdGhlIHtAY29kZSBzdGFydH0gaW5kZXgKKyAgICAgKiB0byB0aGUge0Bjb2RlIGVuZH0gaW5kZXguCisgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgaW5jbHVzaXZlIHN0YXJ0IGluZGV4IHRvIGJlZ2luIHRoZSBzdWJzZXF1ZW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmNsdXNpdmUgc3RhcnQgaW5kZXggdG8gYmVnaW4gdGhlIHN1YnNlcXVlbmNlLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBleGNsdXNpdmUgZW5kIGluZGV4IHRvIGVuZCB0aGUgc3Vic2VxdWVuY2UuCi0gICAgICogQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSBzdWJzZXF1ZW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNsdXNpdmUgZW5kIGluZGV4IHRvIGVuZCB0aGUgc3Vic2VxdWVuY2UuCisgICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBzdWJzZXF1ZW5jZS4KICAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5zdGFydDwvY29kZT4gaXMgbmVnYXRpdmUsIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudAotICAgICAqICAgICAgICAgICAgIHtAbGluayAjbGVuZ3RoKCl9IG9yIGdyZWF0ZXIgdGhhbiA8Y29kZT5lbmQ8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydH0gaXMgbmVnYXRpdmUsIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZW5kfSBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBlbmR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHN1YnN0cmluZyhpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKDAgPD0gc3RhcnQgJiYgc3RhcnQgPD0gZW5kICYmIGVuZCA8PSBjb3VudCkgewpAQCAtNjIyLDExICs1OTksOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZ0J1aWxkZXIuCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBTdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgaW5zdGFuY2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTY0Miw2MCArNjE3LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBhIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gb2YgdGhlIHN1YnNlcXVlbmNlIG9mIHRoaXMgb2JqZWN0Ci0gICAgICogZnJvbSB0aGUgPGNvZGU+c3RhcnQ8L2NvZGU+IGluZGV4IHRvIHRoZSA8Y29kZT5zdGFydDwvY29kZT4gaW5kZXguCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogUmV0dXJucyBhIHtAY29kZSBDaGFyU2VxdWVuY2V9IG9mIHRoZSBzdWJzZXF1ZW5jZSBmcm9tIHRoZSB7QGNvZGUgc3RhcnR9CisgICAgICogaW5kZXggdG8gdGhlIHtAY29kZSBlbmR9IGluZGV4LgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleCB0byBiZWdpbiB0aGUgc3Vic2VxdWVuY2UuCisgICAgICogICAgICAgICAgICB0aGUgaW5jbHVzaXZlIHN0YXJ0IGluZGV4IHRvIGJlZ2luIHRoZSBzdWJzZXF1ZW5jZS4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICBUaGUgZXhjbHVzaXZlIGVuZCBpbmRleCB0byBlbmQgdGhlIHN1YnNlcXVlbmNlLgotICAgICAqIEByZXR1cm4gQSBDaGFyU2VxdWVuY2UgY29udGFpbmluZyB0aGUgc3Vic2VxdWVuY2UuCisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGVuZCBpbmRleCB0byBlbmQgdGhlIHN1YnNlcXVlbmNlLgorICAgICAqIEByZXR1cm4gYSBDaGFyU2VxdWVuY2UgY29udGFpbmluZyB0aGUgc3Vic2VxdWVuY2UuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIG5lZ2F0aXZlLCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKLSAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2xlbmd0aCgpfSBvciBncmVhdGVyIHRoYW4gPGNvZGU+ZW5kPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnR9IGlzIG5lZ2F0aXZlLCBncmVhdGVyIHRoYW4ge0Bjb2RlIGVuZH0gb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgZW5kfSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQge0BsaW5rICNsZW5ndGgoKX0uCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgcmV0dXJuIHN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZ0J1ZmZlciBmb3IgdGhlIGZpcnN0IGluZGV4IG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjaGFyYWN0ZXIuIFRoZSBzZWFyY2ggZm9yIHRoZSBjaGFyYWN0ZXIgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIG1vdmVzCi0gICAgICogdG93YXJkcyB0aGUgZW5kLgotICAgICAqCi0gICAgICoKKyAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIGZpcnN0IGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLiBUaGUgc2VhcmNoIGZvcgorICAgICAqIHRoZSBjaGFyYWN0ZXIgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIG1vdmVzIHRvd2FyZHMgdGhlIGVuZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIFN0cmluZ0J1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYKLSAgICAgKiAgICAgICAgIHRoZSBjaGFyYWN0ZXIgaXNuJ3QgZm91bmQKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBmaW5kLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCAtMSBpZiB0aGUgY2hhcmFjdGVyIGlzbid0CisgICAgICogICAgICAgICBmb3VuZC4KICAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcpCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS40CiAgICAgICovCiAgICAgcHVibGljIGludCBpbmRleE9mKFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgcmV0dXJuIGluZGV4T2Yoc3RyaW5nLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZ0J1ZmZlciBmb3IgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLgotICAgICAqIFRoZSBzZWFyY2ggZm9yIHRoZSBjaGFyYWN0ZXIgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGFuZCBtb3ZlcwotICAgICAqIHRvd2FyZHMgdGhlIGVuZC4KLSAgICAgKgorICAgICAqIFNlYXJjaGVzIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuIFRoZSBzZWFyY2ggZm9yIHRoZQorICAgICAqIGNoYXJhY3RlciBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIG1vdmVzIHRvd2FyZHMgdGhlIGVuZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3ViU3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGZpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIFN0cmluZ0J1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYKLSAgICAgKiAgICAgICAgIHRoZSBjaGFyYWN0ZXIgaXNuJ3QgZm91bmQKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYgdGhlIGNoYXJhY3RlciBpc24ndAorICAgICAqICAgICAgICAgZm91bmQKICAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcsaW50KQotICAgICAqCi0gICAgICogQHNpbmNlIDEuNAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaW5kZXhPZihTdHJpbmcgc3ViU3RyaW5nLCBpbnQgc3RhcnQpIHsKICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewpAQCAtNzM0LDQxICs2OTYsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZ0J1ZmZlciBmb3IgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZAotICAgICAqIGNoYXJhY3Rlci4gVGhlIHNlYXJjaCBmb3IgdGhlIGNoYXJhY3RlciBzdGFydHMgYXQgdGhlIGVuZCBhbmQgbW92ZXMKLSAgICAgKiB0b3dhcmRzIHRoZSBiZWdpbm5pbmcuCi0gICAgICoKKyAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuIFRoZSBzZWFyY2ggZm9yCisgICAgICogdGhlIGNoYXJhY3RlciBzdGFydHMgYXQgdGhlIGVuZCBhbmQgbW92ZXMgdG93YXJkcyB0aGUgYmVnaW5uaW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgU3RyaW5nQnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCAtMSBpZgotICAgICAqICAgICAgICAgdGhlIGNoYXJhY3RlciBpc24ndCBmb3VuZAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgPGNvZGU+c3RyaW5nPC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAc2VlIFN0cmluZyNsYXN0SW5kZXhPZihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBmaW5kLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCAtMSBpZiB0aGUgY2hhcmFjdGVyIGlzbid0CisgICAgICogICAgICAgICBmb3VuZC4KKyAgICAgKiBAc2VlIFN0cmluZyNsYXN0SW5kZXhPZihTdHJpbmcpCiAgICAgICovCiAgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgIHJldHVybiBsYXN0SW5kZXhPZihzdHJpbmcsIGNvdW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZ0J1ZmZlciBmb3IgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLgotICAgICAqIFRoZSBzZWFyY2ggZm9yIHRoZSBjaGFyYWN0ZXIgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGFuZCBtb3ZlcwotICAgICAqIHRvd2FyZHMgdGhlIGJlZ2lubmluZy4KLSAgICAgKgorICAgICAqIFNlYXJjaGVzIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuIFRoZSBzZWFyY2ggZm9yIHRoZQorICAgICAqIGNoYXJhY3RlciBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIG1vdmVzIHRvd2FyZHMgdGhlIGJlZ2lubmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3ViU3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGZpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIFN0cmluZ0J1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYKLSAgICAgKiAgICAgICAgIHRoZSBjaGFyYWN0ZXIgaXNuJ3QgZm91bmQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIDxjb2RlPnN1YlN0cmluZzwvY29kZT4gcGFyYW1ldGVyIGlzCi0gICAgICogICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNlZSBTdHJpbmcjbGFzdEluZGV4T2YoamF2YS5sYW5nLlN0cmluZyxpbnQpCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYgdGhlIGNoYXJhY3RlciBpc24ndAorICAgICAqICAgICAgICAgZm91bmQuCisgICAgICogQHNlZSBTdHJpbmcjbGFzdEluZGV4T2YoU3RyaW5nLGludCkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKFN0cmluZyBzdWJTdHJpbmcsIGludCBzdGFydCkgewogICAgICAgICBpbnQgc3ViQ291bnQgPSBzdWJTdHJpbmcubGVuZ3RoKCk7CkBAIC04MDksMTIgKzc2MCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogVHJpbXMgb2ZmIGFueSBleHRyYSBjYXBhY2l0eSBiZXlvbmQgdGhlIGN1cnJlbnQgbGVuZ3RoLiBOb3RlLCB0aGlzIG1ldGhvZAogICAgICAqIGlzIE5PVCBndWFyYW50ZWVkIHRvIGNoYW5nZSB0aGUgY2FwYWNpdHkgb2YgdGhpcyBvYmplY3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNpbmNlIDEuNQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyaW1Ub1NpemUoKSB7CiAgICAgICAgIGlmIChjb3VudCA8IHZhbHVlLmxlbmd0aCkgewpAQCAtODI2LDIwICs3NzMsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIFJldHJpZXZlcyB0aGUgVW5pY29kZSBjb2RlIHBvaW50IHZhbHVlIGF0IHRoZSB7QGNvZGUgaW5kZXh9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IHRvIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiBjb2RlIHVuaXQgd2l0aGluIHRoaXMKLSAgICAgKiAgICAgICAgICAgIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdmFsdWUuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gdGhlIHtAY29kZSBjaGFyfSBjb2RlIHVuaXQuCisgICAgICogQHJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IHZhbHVlLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwKLSAgICAgKiAgICAgICAgICAgICB0byB7QGxpbmsgI2xlbmd0aCgpfS4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICAqICAgICAgICAgICAgIHtAbGluayAjbGVuZ3RoKCl9LgogICAgICAqIEBzZWUgQ2hhcmFjdGVyCiAgICAgICogQHNlZSBDaGFyYWN0ZXIjY29kZVBvaW50QXQoY2hhcltdLCBpbnQsIGludCkKLSAgICAgKiBAc2luY2UgMS41CiAgICAgICovCiAgICAgcHVibGljIGludCBjb2RlUG9pbnRBdChpbnQgaW5kZXgpIHsKICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjb3VudCkgewpAQCAtODQ5LDIxICs3OTIsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZSB0aGF0IHByZWNlZGVzIHRoZQotICAgICAqIDxjb2RlPmluZGV4PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZSB0aGF0IHByZWNlZGVzIHRoZSB7QGNvZGUgaW5kZXh9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IHRvIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiBjb2RlIHVuaXQgd2l0aGluIHRoaXMKLSAgICAgKiAgICAgICAgICAgIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdmFsdWUuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gdGhlIHtAY29kZSBjaGFyfSBjb2RlIHVuaXQgd2l0aGluIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBsZXNzIHRoYW4gMSBvciBncmVhdGVyIHRoYW4KICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2xlbmd0aCgpfS4KICAgICAgKiBAc2VlIENoYXJhY3RlcgotICAgICAqIEBzZWUgQ2hhcmFjdGVyI2NvZGVQb2ludEJlZm9yZShjaGFyW10sIGludCwgaW50KQotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2VlIENoYXJhY3RlciNjb2RlUG9pbnRCZWZvcmUoY2hhcltdLCBpbnQpCiAgICAgICovCiAgICAgcHVibGljIGludCBjb2RlUG9pbnRCZWZvcmUoaW50IGluZGV4KSB7CiAgICAgICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiBjb3VudCkgewpAQCAtODc0LDIwICs4MTIsMjEgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNvZGUgcG9pbnRzIGJldHdlZW4KLSAgICAgKiA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZW5kSW5kZXg8L2NvZGU+LgorICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNvZGUgcG9pbnRzIGJldHdlZW4ge0Bjb2RlIGJlZ2luSW5kZXh9CisgICAgICogYW5kIHtAY29kZSBlbmRJbmRleH0uCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGJlZ2luSW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmNsdXNpdmUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmNsdXNpdmUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZS4KICAgICAgKiBAcGFyYW0gZW5kSW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBleGNsdXNpdmUgZW5kIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgVW5pY29kZSBjb2RlIHBvaW50cyBpbiB0aGUgc3Vic2VxdWVuY2UuCisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGVuZCBpbmRleCBvZiB0aGUgc3Vic2VxdWVuY2UuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY29kZSBwb2ludHMgaW4gdGhlIHN1YnNlcXVlbmNlLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmVuZEluZGV4PC9jb2RlPiBvciA8Y29kZT5lbmRJbmRleDwvY29kZT4gaXMgZ3JlYXRlcgotICAgICAqICAgICAgICAgICAgIHRoYW4ge0BsaW5rICNsZW5ndGgoKX0uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBiZWdpbkluZGV4fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgZW5kSW5kZXh9IG9yIHtAY29kZSBlbmRJbmRleH0gaXMgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICAge0BsaW5rICNsZW5ndGgoKX0uCisgICAgICogQHNlZSBDaGFyYWN0ZXIKKyAgICAgKiBAc2VlIENoYXJhY3RlciNjb2RlUG9pbnRDb3VudChjaGFyW10sIGludCwgaW50KQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29kZVBvaW50Q291bnQoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkgewogICAgICAgICBpZiAoYmVnaW5JbmRleCA8IDAgfHwgZW5kSW5kZXggPiBjb3VudCB8fCBiZWdpbkluZGV4ID4gZW5kSW5kZXgpIHsKQEAgLTg5OSwyMSArODM4LDIzIEBACiAKICAgICAvKioKICAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBpcyBvZmZzZXQgZnJvbQotICAgICAqIDxjb2RlPmluZGV4PC9jb2RlPiBieSA8Y29kZT5jb2RlUG9pbnRPZmZzZXQ8L2NvZGU+IGNvZGUgcG9pbnRzLgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IHRoYXQgaXMgb2Zmc2V0IHtAY29kZSBjb2RlUG9pbnRPZmZzZXR9IGNvZGUgcG9pbnRzIGZyb20KKyAgICAgKiB7QGNvZGUgaW5kZXh9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGlzIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb20uCiAgICAgICogQHBhcmFtIGNvZGVQb2ludE9mZnNldAotICAgICAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0byBjb3VudC4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBpcyB0aGUgb2Zmc2V0LgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0byBjb3VudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCB0aGF0IGlzIHtAY29kZSBjb2RlUG9pbnRPZmZzZXR9IGNvZGUgcG9pbnRzIGF3YXkgZnJvbQorICAgICAqICAgICAgICAgaW5kZXguCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleH0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuCiAgICAgICogICAgICAgICAgICAge0BsaW5rICNsZW5ndGgoKX0gb3IgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBjb2RlIHBvaW50cwotICAgICAqICAgICAgICAgICAgIGJlZm9yZSBvciBhZnRlciA8Y29kZT5pbmRleDwvY29kZT4gdG8gbWF0Y2gKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5jb2RlUG9pbnRPZmZzZXQ8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgICBiZWZvcmUgb3IgYWZ0ZXIge0Bjb2RlIGluZGV4fSB0byBtYXRjaAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBjb2RlUG9pbnRPZmZzZXR9LgorICAgICAqIEBzZWUgQ2hhcmFjdGVyCisgICAgICogQHNlZSBDaGFyYWN0ZXIjb2Zmc2V0QnlDb2RlUG9pbnRzKGNoYXJbXSwgaW50LCBpbnQsIGludCwgaW50KQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgb2Zmc2V0QnlDb2RlUG9pbnRzKGludCBpbmRleCwgaW50IGNvZGVQb2ludE9mZnNldCkgewogICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLm9mZnNldEJ5Q29kZVBvaW50cyh2YWx1ZSwgMCwgY291bnQsIGluZGV4LApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9BcHBlbmRhYmxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0FwcGVuZGFibGUuamF2YQppbmRleCA3NWQxZjEwLi4xYjRlNzAyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0FwcGVuZGFibGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0FwcGVuZGFibGUuamF2YQpAQCAtMSwxOCArMSwxNyBAQAotLyogCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqIAogICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAogcGFja2FnZSBqYXZhLmxhbmc7CkBAIC0yMCw2OSArMTksNzcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIEFwcGVuZGFibGUgaXMgYW4gb2JqZWN0IHVzZWQgdG8gYXBwZW5kIGNoYXJhY3RlciBvciBjaGFyYWN0ZXIgc2VxdWVuY2UuIEFueQotICogY2xhc3MgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBjYW4gcmVjZWl2ZSBkYXRhIGZvcm1hdHRlZCBieQotICogPGNvZGU+Rm9ybWF0dGVyPC9jb2RlPi4gVGhlIGFwcGVuZGVkIGNoYXJhY3RlciBvciBjaGFyYWN0ZXIgc2VxdWVuY2UKLSAqIHNob3VsZCBiZSB2YWxpZCBhY2Nyb2RpbmcgdG8gdGhlIHJ1bGVzIGRlc2NyaWJlZAotICogPGNvZGU+VW5pY29kZSBDaGFyYWN0ZXIgUmVwcmVzZW50YXRpb248L2NvZGU+LgorICogRGVjbGFyZXMgbWV0aG9kcyB0byBhcHBlbmQgY2hhcmFjdGVycyBvciBjaGFyYWN0ZXIgc2VxdWVuY2VzLiBBbnkgY2xhc3MgdGhhdAorICogaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBjYW4gcmVjZWl2ZSBkYXRhIGZvcm1hdHRlZCBieSBhCisgKiB7QGxpbmsgamF2YS51dGlsLkZvcm1hdHRlcn0uIFRoZSBhcHBlbmRlZCBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVyIHNlcXVlbmNlCisgKiBzaG91bGQgYmUgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZXNjcmliZWQgaW4KKyAqIHtAbGluayBDaGFyYWN0ZXIgVW5pY29kZSBDaGFyYWN0ZXIgUmVwcmVzZW50YXRpb259LgogICogPHA+Ci0gKiBBcHBlbmRhYmxlIGl0c2VsZiBkb2VzIG5vdCBndXJhbnRlZSB0aHJlYWQgc2FmZXR5LiBUaGlzIHJlc3BvbnNpYmlsaXR5IGlzIHVwCi0gKiB0byB0aGUgaW1wbGVtZW50aW5nIGNsYXNzLjwvcD4KKyAqIHtAY29kZSBBcHBlbmRhYmxlfSBpdHNlbGYgZG9lcyBub3QgZ3VhcmFudGVlIHRocmVhZCBzYWZldHkuIFRoaXMKKyAqIHJlc3BvbnNpYmlsaXR5IGlzIHVwIHRvIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MuCisgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgY2FuIGNob29zZSBkaWZmZXJlbnQgZXhjZXB0aW9uIGhhbmRsaW5nIG1lY2hhbmlzbS4gSXQKLSAqIGNhbiBjaG9vc2UgdG8gdGhyb3cgZXhjZXB0aW9ucyBvdGhlciB0aGFuIElPRXhjZXB0aW9uIGJ1dCB3aGljaCBtdXN0IGJlCi0gKiBjb21wYXRpYmxlIHdpdGggSU9FeGNlcHRpb24sIG9yIGRvZXMgbm90IHRocm93IGFueSBleGNlcHRpb25zIGF0IGFsbCBhbmQgdXNlCi0gKiBlcnJvciBjb2RlIGluc3RlYWQuIEFsbCBpbiBhbGwsIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgZG9lcyBub3QgZ3VyYW50ZWUgdG8KLSAqIHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9uIGRlY2xhcmVkIGJ5IHRoaXMgaW50ZXJmYWNlLjwvcD4KLSAqIAorICogSW1wbGVtZW50aW5nIGNsYXNzZXMgY2FuIGNob29zZSBkaWZmZXJlbnQgZXhjZXB0aW9uIGhhbmRsaW5nIG1lY2hhbmlzbS4gVGhleQorICogY2FuIGNob29zZSB0byB0aHJvdyBleGNlcHRpb25zIG90aGVyIHRoYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvciB0aGV5IGRvIG5vdAorICogdGhyb3cgYW55IGV4Y2VwdGlvbnMgYXQgYWxsIGFuZCB1c2UgZXJyb3IgY29kZXMgaW5zdGVhZC4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEFwcGVuZGFibGUgewogICAgIAogICAgIC8qKgotICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gY2hhcmFjdGVyLgorICAgICAqIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNoYXJhY3RlciB0byBhcHBlbmQKLSAgICAgKiBAcmV0dXJuIHRoaXMgPGNvZGU+QXBwZW5kYWJsZTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiBzb21lIEkvTyBvcGVyYXRpb24gZmFpbHMKKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBhcHBlbmQuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBBcHBlbmRhYmxlfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBBcHBlbmRhYmxlIGFwcGVuZChjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPi4KKyAgICAgKiBBcHBlbmRzIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Uge0Bjb2RlIGNzcX0uIEltcGxlbWVudGF0aW9uIGNsYXNzZXMgbWF5CisgICAgICogbm90IGFwcGVuZCB0aGUgd2hvbGUgc2VxdWVuY2UsIGZvciBleGFtcGxlIGlmIHRoZSB0YXJnZXQgaXMgYSBidWZmZXIgd2l0aAorICAgICAqIGxpbWl0ZWQgc2l6ZS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgYmVoYXZpb3VyIG9mIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIG9mIAotICAgICAqIDxjb2RlPkFwcGVuZGFibGU8L2NvZGU+LjwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZ2l2ZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IGlzIG51bGwsIHRoZSBzZXF1ZW5jZSBpcyB0cmVhdGVkIGFzIAotICAgICAqIFN0cmluZyAibnVsbCIuPC9wPgorICAgICAqIElmIHtAY29kZSBjc3F9IGlzIHtAY29kZSBudWxsfSwgdGhlIGNoYXJhY3RlcnMgIm51bGwiIGFyZSBhcHBlbmRlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIGNzcSAgIHRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHRvIGJlIGFwcGVuZAotICAgICAqIEByZXR1cm4gdGhpcyA8Y29kZT5BcHBlbmRhYmxlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGlmIHNvbWUgSS9PIG9wZXJhdGlvbiBmYWlscworICAgICAqIEBwYXJhbSBjc3EKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgQXBwZW5kYWJsZX0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQXBwZW5kYWJsZSBhcHBlbmQoQ2hhclNlcXVlbmNlIGNzcSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQXBwZW5kIHBhcnQgb2YgdGhlIGdpdmVuIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4uCisgICAgICogQXBwZW5kcyBhIHN1YnNlcXVlbmNlIG9mIHtAY29kZSBjc3F9LgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBnaXZlbiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IGlzIG5vdCBudWxsLCB0aGlzIG1ldGhvZCBiZWhhdmVzIAotICAgICAqIHNhbWUgYXMgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQ6PC9wPgotICAgICAqIDxwcmU+ICAgIG91dC5hcHBlbmQoY3NxLnN1YlNlcXVlbmNlKHN0YXJ0LCBlbmQpKSA8L3ByZT4KKyAgICAgKiBJZiB7QGNvZGUgY3NxfSBpcyBub3Qge0Bjb2RlIG51bGx9IHRoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50CisgICAgICogdG8gY2FsbGluZyB7QGNvZGUgYXBwZW5kKGNzcS5zdWJTZXF1ZW5jZShzdGFydCwgZW5kKSl9LgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBnaXZlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gaXMgbnVsbCwgdGhlIHNlcXVlbmNlIGlzIHRyZWF0ZWQgYXMgCi0gICAgICogU3RyaW5nICJudWxsIi48L3A+CisgICAgICogSWYge0Bjb2RlIGNzcX0gaXMge0Bjb2RlIG51bGx9LCB0aGUgY2hhcmFjdGVycyAibnVsbCIgYXJlIGFwcGVuZGVkLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3NxICAgICAgIHRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHRvIGJlIGFwcGVuZCAKLSAgICAgKiBAcGFyYW0gc3RhcnQgICAgIHRoZSBpbmRleCB0byBzcGljaWZ5IHRoZSBzdGFydCBwb3NpdGlvbiBvZiAKLSAgICAgKiAgICAgICAgICAgICAgICAgIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gdG8gYmUgYXBwZW5kLCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgIGFuZCBub3QgbGFyZ2VyIHRoYW4gdGhlIGVuZAotICAgICAqIEBwYXJhbSBlbmQgICAgICAgdGhlIGluZGV4IHRvIHNwZWljaWZ5IHRoZSBlbmQgcG9zaXRpb24gb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gdG8gYmUgYXBwZW5kLCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgIGFuZCBub3QgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgY3NxIAotICAgICAqIEByZXR1cm4gdGhpcyA8Y29kZT5BcHBlbmRhYmxlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGlmIHNvbWUgSS9PIG9wZXJhdGlvbiBmYWlscworICAgICAqIEBwYXJhbSBjc3EKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gYXBwZW5kLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZSBvZiB7QGNvZGUgY3NxfSB0aGF0IGlzCisgICAgICogICAgICAgICAgICBhcHBlbmRlZC4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3Vic2VxdWVuY2Ugb2Yge0Bjb2RlIGNzcX0gdGhhdCBpcworICAgICAqICAgICAgICAgICAgYXBwZW5kZWQuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBBcHBlbmRhYmxlfS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgIGlmIHRoZSBzdGFydCBvciBlbmQgaXMgaWxsZWdhbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9LCB7QGNvZGUgZW5kIDwgMH0sIHtAY29kZSBzdGFydCA+IGVuZH0KKyAgICAgKiAgICAgICAgICAgICBvciB7QGNvZGUgZW5kfSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB7QGNvZGUgY3NxfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBBcHBlbmRhYmxlIGFwcGVuZChDaGFyU2VxdWVuY2UgY3NxLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQXJpdGhtZXRpY0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Bcml0aG1ldGljRXhjZXB0aW9uLmphdmEKaW5kZXggNzkxOWJjNi4uNzQ2NzFmYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Bcml0aG1ldGljRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Bcml0aG1ldGljRXhjZXB0aW9uLmphdmEKQEAgLTE3LDI4ICsxNywzMiBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gdGhlIGFuIGludmFsaWQgYXJpdGhtZXRpYyBvcGVyYXRpb24gaXMKLSAqIGF0dGVtcHRlZC4KKyAqIFRocm93biB3aGVuIHRoZSBhbiBpbnZhbGlkIGFyaXRobWV0aWMgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBcml0aG1ldGljRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjU2NDc3NTU4MzE0NDk2MDA3TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQXJpdGhtZXRpY0V4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBcml0aG1ldGljRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBcml0aG1ldGljRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBcml0aG1ldGljRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLmphdmEKaW5kZXggOGExYjgxMC4uMGYyMzFkMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5qYXZhCkBAIC0yMCwzOCArMjAsNDUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHRoZSBhbiBhcnJheSBpcyBpbmRleGVkIHdpdGggYSB2YWx1ZQotICogbGVzcyB0aGFuIHplcm8sIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuCisgKiBUaHJvd24gd2hlbiB0aGUgYW4gYXJyYXkgaXMgaW5kZXhlZCB3aXRoIGEgdmFsdWUgbGVzcyB0aGFuIHplcm8sIG9yIGdyZWF0ZXIKKyAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGFycmF5LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHRlbmRzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUxMTYxMDExMjgxMTg5NTA4NDRMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICogY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqICh3aGljaCBpcyBiYXNlZCBvbiB0aGUgYXJndW1lbnQgd2hpY2ggaXMgdGhlIGluZGV4IHdoaWNoIGZhaWxlZCkgZmlsbGVkCi0gICAgICogaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIGEgZGV0YWlsIG1lc3NhZ2UgdGhhdCBpcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGludmFsaWQKKyAgICAgKiB7QGNvZGUgaW5kZXh9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgaW50IHRoZSBvZmZlbmRpbmcgaW5kZXguCisgICAgICogICAgICAgICAgICB0aGUgaW52YWxpZCBpbmRleC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGludCBpbmRleCkgewogICAgICAgICBzdXBlcihNc2cuZ2V0U3RyaW5nKCJLMDA1MiIsIGluZGV4KSk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0FycmF5U3RvcmVFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQXJyYXlTdG9yZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDJiNmRmYjguLmI2OTY5N2EgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQXJyYXlTdG9yZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQXJyYXlTdG9yZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOCArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byBzdG9yZSBpbnRvIGFuCi0gKiBhcnJheSBhbiBlbGVtZW50IG9mIGEgYSB0eXBlIHdoaWNoIHRoZSBhcnJheSBjYW4gbm90IGhvbGQuLgorICogVGhyb3duIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIHN0b3JlIGFuIGVsZW1lbnQgb2YgYW4gaW5jb21wYXRpYmxlIHR5cGUgaW4KKyAqIGFuIGFycmF5LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFycmF5U3RvcmVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NTIyMTkzODkwNDk5ODM4MjQxTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQXJyYXlTdG9yZUV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBcnJheVN0b3JlRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBcnJheVN0b3JlRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBcnJheVN0b3JlRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Bc3NlcnRpb25FcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Bc3NlcnRpb25FcnJvci5qYXZhCmluZGV4IGRkYmZiMjkuLjhkMzM2OGIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQXNzZXJ0aW9uRXJyb3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Fzc2VydGlvbkVycm9yLmphdmEKQEAgLTE4LDM1ICsxOCwzMyBAQAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogPHA+Ci0gKiBJbmRpY2F0ZXMgdGhhdCBhbiBhc3NlcnRpb24gaGFzIGZhaWxlZC4KLSAqIDwvcD4KKyAqIFRocm93biB3aGVuIGFuIGFzc2VydGlvbiBoYXMgZmFpbGVkLgogICogCi0gKiBAc2luY2UgMS40CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFzc2VydGlvbkVycm9yIGV4dGVuZHMgRXJyb3IgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwMTMyOTk0OTM5NzAyOTczNzBMOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRob3V0IGEgbWVzc2FnZS4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQXNzZXJ0aW9uRXJyb3J9IHdpdGggbm8gbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXNzZXJ0aW9uRXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRoIGEgbWVzc2FnZSB0aGF0IGlzIHRoZQotICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihPYmplY3QpfSBvZiB0aGUgb2JqZWN0IHBhc3NlZC4gSWYgdGhlIG9iamVjdCBwYXNzZWQKLSAgICAgKiBpcyBhbiBpbnN0YW5jZW9mIHtAbGluayBUaHJvd2FibGV9LCB0aGVuIGl0IGFsc28gYmVjb21lcyB0aGUgY2F1c2Ugb2YKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBc3NlcnRpb25FcnJvcn0gd2l0aCBhIG1lc3NhZ2UgYmFzZWQgb24gY2FsbGluZworICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihPYmplY3QpfSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiBJZiB0aGUgb2JqZWN0CisgICAgICogaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFRocm93YWJsZX0sIHRoZW4gaXQgYWxzbyBiZWNvbWVzIHRoZSBjYXVzZSBvZgogICAgICAqIHRoaXMgZXJyb3IuCi0gICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlIFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgaW50byB0aGUgbWVzc2FnZSBhbmQKLSAgICAgKiAgICAgICAgb3B0aW9uYWxseSB0aGUgY2F1c2UuCisgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIGludG8gdGhlIGRldGFpbCBtZXNzYWdlIGFuZAorICAgICAqICAgICAgICAgICAgb3B0aW9uYWxseSB0aGUgY2F1c2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFzc2VydGlvbkVycm9yKE9iamVjdCBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKFN0cmluZy52YWx1ZU9mKGRldGFpbE1lc3NhZ2UpLApAQCAtNTUsNzIgKzUzLDcyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRoIGEgbWVzc2FnZSB0aGF0IGlzIHRoZQotICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihib29sZWFuKX0gb2YgdGhlIGJvb2xlYW4gcGFzc2VkLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBc3NlcnRpb25FcnJvcn0gd2l0aCBhIG1lc3NhZ2UgYmFzZWQgb24gY2FsbGluZworICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihib29sZWFuKX0gd2l0aCB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkIGludG8gdGhlIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFzc2VydGlvbkVycm9yKGJvb2xlYW4gZGV0YWlsTWVzc2FnZSkgewogICAgICAgICB0aGlzKFN0cmluZy52YWx1ZU9mKGRldGFpbE1lc3NhZ2UpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHdpdGggYSBtZXNzYWdlIHRoYXQgaXMgdGhlCi0gICAgICoge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGNoYXIpfSBvZiB0aGUgY2hhciBwYXNzZWQuCi0gICAgICogPC9wPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFzc2VydGlvbkVycm9yfSB3aXRoIGEgbWVzc2FnZSBiYXNlZCBvbiBjYWxsaW5nCisgICAgICoge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGNoYXIpfSB3aXRoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlIFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBc3NlcnRpb25FcnJvcihjaGFyIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgdGhpcyhTdHJpbmcudmFsdWVPZihkZXRhaWxNZXNzYWdlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRoIGEgbWVzc2FnZSB0aGF0IGlzIHRoZQotICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihpbnQpfSBvZiB0aGUgaW50IHBhc3NlZC4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQXNzZXJ0aW9uRXJyb3J9IHdpdGggYSBtZXNzYWdlIGJhc2VkIG9uIGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoaW50KX0gd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkIGludG8gdGhlIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFzc2VydGlvbkVycm9yKGludCBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHRoaXMoSW50ZWdlci50b1N0cmluZyhkZXRhaWxNZXNzYWdlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRoIGEgbWVzc2FnZSB0aGF0IGlzIHRoZQotICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihsb25nKX0gb2YgdGhlIGxvbmcgcGFzc2VkLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBc3NlcnRpb25FcnJvcn0gd2l0aCBhIG1lc3NhZ2UgYmFzZWQgb24gY2FsbGluZworICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihsb25nKX0gd2l0aCB0aGUgc3BlY2lmaWVkIGxvbmcgdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkIGludG8gdGhlIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFzc2VydGlvbkVycm9yKGxvbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICB0aGlzKExvbmcudG9TdHJpbmcoZGV0YWlsTWVzc2FnZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugd2l0aCBhIG1lc3NhZ2UgdGhhdCBpcyB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoZmxvYXQpfSBvZiB0aGUgZmxvYXQgcGFzc2VkLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBc3NlcnRpb25FcnJvcn0gd2l0aCBhIG1lc3NhZ2UgYmFzZWQgb24gY2FsbGluZworICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihmbG9hdCl9IHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdCB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZSBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkIGludG8gdGhlIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXNzZXJ0aW9uRXJyb3IoZmxvYXQgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICB0aGlzKEZsb2F0LnRvU3RyaW5nKGRldGFpbE1lc3NhZ2UpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHdpdGggYSBtZXNzYWdlIHRoYXQgaXMgdGhlCi0gICAgICoge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGRvdWJsZSl9IG9mIHRoZSBkb3VibGUgcGFzc2VkLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBc3NlcnRpb25FcnJvcn0gd2l0aCBhIG1lc3NhZ2UgYmFzZWQgb24gY2FsbGluZworICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihkb3VibGUpfSB3aXRoIHRoZSBzcGVjaWZpZWQgZG91YmxlIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlIFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBc3NlcnRpb25FcnJvcihkb3VibGUgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICB0aGlzKERvdWJsZS50b1N0cmluZyhkZXRhaWxNZXNzYWdlKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Jvb2xlYW4uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQm9vbGVhbi5qYXZhCmluZGV4IDM2YzJlM2MuLmM0OWMzODQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQm9vbGVhbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQm9vbGVhbi5qYXZhCkBAIC0yMCwxMSArMjAsOSBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIDxwPgotICogQm9vbGVhbiBpcyB0aGUgd3JhcHBlciBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotICogPC9wPgorICogVGhlIHdyYXBwZXIgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSB7QGNvZGUgYm9vbGVhbn0uCiAgKiAKLSAqIEBzaW5jZSAxLjAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ29tcGFyYWJsZTxCb29sZWFuPiB7CiAKQEAgLTM2LDcgKzM0LDEwIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHZhbHVlOwogCiAgICAgLyoqCi0gICAgICogVGhlIGphdmEubGFuZy5DbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhpcyBjbGFzcy4KKyAgICAgKiBUaGUge0BsaW5rIENsYXNzfSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwcmltaXRpdmUgdHlwZSB7QGNvZGUKKyAgICAgKiBib29sZWFufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPEJvb2xlYW4+IFRZUEUgPSAoQ2xhc3M8Qm9vbGVhbj4pIG5ldyBib29sZWFuWzBdCkBAIC00Niw2MiArNDcsNjkgQEAKICAgICAvLyBkZWZpbmVkIHRvIGJlICJqYXZhLmxhbmcuQm9vbGVhbi5UWVBFIjsKIAogICAgIC8qKgotICAgICAqIFRoZSBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2hpY2ggcmVwcmVzZW50cyB0cnV0aC4KKyAgICAgKiBUaGUge0Bjb2RlIEJvb2xlYW59IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHByaW1pdGl2ZSB2YWx1ZQorICAgICAqIHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVFJVRSA9IG5ldyBCb29sZWFuKHRydWUpOwogCiAgICAgLyoqCi0gICAgICogVGhlIGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aGljaCByZXByZXNlbnRzIGZhbHNlaG9vZC4KKyAgICAgKiBUaGUge0Bjb2RlIEJvb2xlYW59IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHByaW1pdGl2ZSB2YWx1ZQorICAgICAqIHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEZBTFNFID0gbmV3IEJvb2xlYW4oZmFsc2UpOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGdpdmVuIGEgc3RyaW5nLiBJZiB0aGUgc3RyaW5nIGlzCi0gICAgICogZXF1YWwgdG8gInRydWUiIHVzaW5nIGEgbm9uLWNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24sIHRoZSByZXN1bHQgd2lsbCBiZQotICAgICAqIGEgQm9vbGVhbiByZXByZXNlbnRpbmcgdHJ1ZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYSBCb29sZWFuIHJlcHJlc2VudGluZwotICAgICAqIGZhbHNlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJvb2xlYW59IHdpdGggaXRzIGJvb2xlYW4gdmFsdWUgc3BlY2lmaWVkIGJ5CisgICAgICoge0Bjb2RlIHN0cmluZ30uIElmIHtAY29kZSBzdHJpbmd9IGlzIG5vdCB7QGNvZGUgbnVsbH0gYW5kIGlzIGVxdWFsIHRvCisgICAgICogInRydWUiIHVzaW5nIGEgbm9uLWNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24sIHRoZSByZXN1bHQgd2lsbCBiZSBhCisgICAgICogQm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHByaW1pdGl2ZSB2YWx1ZSB7QGNvZGUgdHJ1ZX0sIG90aGVyd2lzZSBpdCB3aWxsCisgICAgICogYmUgYSBCb29sZWFuIHJlcHJlc2VudGluZyB0aGUgcHJpbWl0aXZlIHZhbHVlIHtAY29kZSBmYWxzZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgYm9vbGVhbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQm9vbGVhbihTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgIHRoaXMocGFyc2VCb29sZWFuKHN0cmluZykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiB0cnVlIG9yIGZhbHNlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJvb2xlYW59IHdpdGggdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgYm9vbGVhbgorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdHJ1ZSBvciBmYWxzZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltaXRpdmUgYm9vbGVhbiB2YWx1ZSwge0Bjb2RlIHRydWV9IG9yIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJvb2xlYW4oYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIHRydWUgYW5kIGZhbHNlIGlmIHRoZSByZWNlaXZlcgotICAgICAqIHJlcHJlc2VudHMgZmFsc2UuCisgICAgICogR2V0cyB0aGUgcHJpbWl0aXZlIHZhbHVlIG9mIHRoaXMgYm9vbGVhbiwgZWl0aGVyIHtAY29kZSB0cnVlfSBvcgorICAgICAqIHtAY29kZSBmYWxzZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIG9yIGZhbHNlLgorICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QncyBwcmltaXRpdmUgdmFsdWUsIHtAY29kZSB0cnVlfSBvciB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIGFyZ3VtZW50IG11c3QgYWxzbyBiZSBhIEJvb2xlYW4sIGFuZCB0aGUgcmVjZWl2ZXIgYW5kCi0gICAgICogYXJndW1lbnQgbXVzdCByZXByZXNlbnQgdGhlIHNhbWUgYm9vbGVhbiB2YWx1ZSAoaS5lLiBib3RoIHRydWUgb3IgYm90aAotICAgICAqIGZhbHNlKS4KKyAgICAgKiBDb21wYXJlcyB0aGlzIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGluZGljYXRlcyBpZiB0aGV5CisgICAgICogYXJlIGVxdWFsLiBJbiBvcmRlciB0byBiZSBlcXVhbCwge0Bjb2RlIG99IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiB7QGNvZGUgQm9vbGVhbn0gYW5kIGhhdmUgdGhlIHNhbWUgYm9vbGVhbiB2YWx1ZSBhcyB0aGlzIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbwotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzIG9iamVjdAotICAgICAqIAotICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBib29sZWFuIHdpdGguCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIEJvb2xlYW59OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKQEAgLTExMCwyMSArMTE4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29tcGFyZXMgdGhpcyA8Y29kZT5Cb29sZWFuPC9jb2RlPiB0byBhbm90aGVyIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotICAgICAqIElmIHRoaXMgaW5zdGFuY2UgaGFzIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBpbnN0YW5jZSBwYXNzZWQsIHRoZW4KLSAgICAgKiA8Y29kZT4wPC9jb2RlPiBpcyByZXR1cm5lZC4gSWYgdGhpcyBpbnN0YW5jZSBpcyA8Y29kZT50cnVlPC9jb2RlPiBhbmQKLSAgICAgKiB0aGUgaW5zdGFuY2UgcGFzc2VkIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlbiBhIHBvc2l0aXZlIHZhbHVlIGlzCi0gICAgICogcmV0dXJuZWQuIElmIHRoaXMgaW5zdGFuY2UgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCB0aGUgaW5zdGFuY2UKLSAgICAgKiBwYXNzZWQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZC4KLSAgICAgKiA8L3A+CisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBib29sZWFuIG9iamVjdCB0byBkZXRlcm1pbmUgdGhlaXIKKyAgICAgKiByZWxhdGl2ZSBvcmRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhhdAotICAgICAqICAgICAgICAgICAgVGhlIGluc3RhbmNlIHRvIGNvbXBhcmUgdG8uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT50aGF0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiBvYmplY3QgdG8gY29tcGFyZSB0aGlzIG9iamVjdCB0by4KKyAgICAgKiBAcmV0dXJuIDAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgYm9vbGVhbiBhbmQgdGhlIHZhbHVlIG9mIHtAY29kZSB0aGF0fSBhcmUKKyAgICAgKiAgICAgICAgIGVxdWFsOyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGJvb2xlYW4gaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSB0cnVlfSBhbmQgdGhlIHZhbHVlIG9mIHtAY29kZSB0aGF0fSBpcyB7QGNvZGUgZmFsc2V9OyBhCisgICAgICogICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgdmFsdWUgaWYgdGhpcyBib29sZWFuIGlzIHtAY29kZSBmYWxzZX0gYW5kCisgICAgICogICAgICAgICB0aGUgdmFsdWUgb2Yge0Bjb2RlIHRoYXR9IGlzIHtAY29kZSB0cnVlfS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oQm9vbGVhbiB0aGF0KSB7CiAgICAgICAgIGlmICh0aGF0ID09IG51bGwpIHsKQEAgLTEzOSwxMyArMTQ0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIG9iamVjdHMgd2hpY2gKLSAgICAgKiBhbnN3ZXIgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gPGNvZGU+ZXF1YWxzPC9jb2RlPiBtdXN0Ci0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGlzIGJvb2xlYW4uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHJldHVybiB0aGlzIGJvb2xlYW4ncyBoYXNoIGNvZGUsIHdoaWNoIGlzIHtAY29kZSAxMjMxfSBmb3Ige0Bjb2RlIHRydWV9CisgICAgICogICAgICAgICB2YWx1ZXMgYW5kIHtAY29kZSAxMjM3fSBmb3Ige0Bjb2RlIGZhbHNlfSB2YWx1ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTE1MywxMCArMTU2LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIGJvb2xlYW4uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gInRydWUiIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGJvb2xlYW4gaXMge0Bjb2RlIHRydWV9LCAiZmFsc2UiCisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTE2NCwxMiArMTY5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzeXN0ZW0gcHJvcGVydHkgZGVzY3JpYmVkIGJ5IHRoZSBhcmd1bWVudCBlcXVhbCB0bwotICAgICAqICJ0cnVlIiB1c2luZyBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIGJvb2xlYW59IHZhbHVlIG9mIHRoZSBzeXN0ZW0gcHJvcGVydHkgaWRlbnRpZmllZCBieQorICAgICAqIHtAY29kZSBzdHJpbmd9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGJvb2xlYW4uCi0gICAgICogQHJldHVybiBUaGUgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc3lzdGVtIHByb3BlcnR5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzeXN0ZW0gcHJvcGVydHkgbmFtZWQgYnkge0Bjb2RlIHN0cmluZ30KKyAgICAgKiAgICAgICAgIGV4aXN0cyBhbmQgaXQgaXMgZXF1YWwgdG8gInRydWUiIHVzaW5nIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgKiAgICAgICAgIGNvbXBhcmlzb24sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgU3lzdGVtI2dldFByb3BlcnR5KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewpAQCAtMTc5LDU0ICsxODgsNTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBQYXJzZXMgdGhlIHN0cmluZyBhcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+LiBJZiB0aGUgc3RyaW5nIGlzIG5vdAotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBpcyBlcXVhbCB0byA8Y29kZT4idHJ1ZSI8L2NvZGU+LCByZWdhcmRsZXNzCi0gICAgICogY2FzZSwgdGhlbiA8Y29kZT50cnVlPC9jb2RlPiBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiA8L3A+CisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEge0Bjb2RlIGJvb2xlYW59LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBUaGUgc3RyaW5nIHRvIHBhcnNlLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBib29sZWFuIHZhbHVlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBzfSBpcyBub3Qge0Bjb2RlIG51bGx9IGFuZCBpcyBlcXVhbCB0bworICAgICAqICAgICAgICAge0Bjb2RlICJ0cnVlIn0gdXNpbmcgY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHBhcnNlQm9vbGVhbihTdHJpbmcgcykgewogICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uocyk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4gV2hlbiB0aGUKLSAgICAgKiBib29sZWFuIGlzIHRydWUgYW5zd2VyIDxjb2RlPiJ0cnVlIjwvY29kZT4sIG90aGVyd2lzZSBhbnN3ZXIKLSAgICAgKiA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4gCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbgotICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gY29udmVydGVkIHRvIGEgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gInRydWUiIGlmIHtAY29kZSB2YWx1ZX0gaXMge0Bjb2RlIHRydWV9LCAiZmFsc2UiIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIEJvb2xlYW4gcmVwcmVzZW50aW5nIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGVxdWFsIHRvICJ0cnVlIgotICAgICAqIHVzaW5nIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiwgYW5kIGEgQm9vbGVhbiByZXByZXNlbnRpbmcgZmFsc2UKLSAgICAgKiBvdGhlcndpc2UuCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEgYm9vbGVhbiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBib29sZWFuLgotICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSBCb29sZWFuLlRSVUV9IGlmIHtAY29kZSBzdHJpbmd9IGlzIGVxdWFsIHRvICJ0cnVlIiB1c2luZworICAgICAqICAgICAgICAgY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCB7QGNvZGUgQm9vbGVhbi5GQUxTRX0gb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI3BhcnNlQm9vbGVhbihTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCb29sZWFuIHZhbHVlT2YoU3RyaW5nIHN0cmluZykgewogICAgICAgICByZXR1cm4gcGFyc2VCb29sZWFuKHN0cmluZykgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgQm9vbGVhbi5UUlVFIGlmIHRoZSBhcmd1bWVudCBpcyBlcXVhbCB0byAidHJ1ZSIgdXNpbmcgY2FzZQotICAgICAqIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24sIGFuZCBCb29sZWFuLkZBTFNFIHJlcHJlc2VudGluZyBmYWxzZSBvdGhlcndpc2UuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBCb29sZWFufSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBib29sZWFuIHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIElmIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZ2V0IGEgbmV3IHtAY29kZSBCb29sZWFufSBpbnN0YW5jZSwgaXQgaXMKKyAgICAgKiByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY29uc3RydWN0b3IsIHNpbmNlIGl0CisgICAgICogcmV0dXJucyBpdHMgc3RhdGljIGluc3RhbmNlcywgd2hpY2ggcmVzdWx0cyBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBiCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIEJvb2xlYW4uVFJVRSBvciBCb29sZWFuLkZBTFNFIEdsb2JhbCB0cnVlL2ZhbHNlIG9iamVjdHMuCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB0byBjb252ZXJ0IHRvIGEge0Bjb2RlIEJvb2xlYW59LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIEJvb2xlYW4uVFJVRX0gaWYge0Bjb2RlIGJ9IGlzIGVxdWFsIHRvIHtAY29kZSB0cnVlfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBCb29sZWFuLkZBTFNFfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCb29sZWFuIHZhbHVlT2YoYm9vbGVhbiBiKSB7CiAgICAgICAgIHJldHVybiBiID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQnl0ZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9CeXRlLmphdmEKaW5kZXggMzZjMzVkYi4uYTc0YjUzOSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9CeXRlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9CeXRlLmphdmEKQEAgLTE4LDggKzE4LDkgQEAKIHBhY2thZ2UgamF2YS5sYW5nOwogCiAvKioKLSAqIDxwPkJ5dGUgaXMgdGhlIHdyYXBwZXIgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSA8Y29kZT5ieXRlPC9jb2RlPi48L3A+Ci0gKiBAc2luY2UgMS4xCisgKiBUaGUgd3JhcHBlciBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlIHtAY29kZSBieXRlfS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBCeXRlIGV4dGVuZHMgTnVtYmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxCeXRlPiB7ICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MTgzNjk4MjMxNTU5MTI5ODI4TDsKQEAgLTMwLDMxICszMSwzMSBAQAogICAgIHByaXZhdGUgZmluYWwgYnl0ZSB2YWx1ZTsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0YW50IGZvciB0aGUgbWF4aW11bSA8Y29kZT5ieXRlPC9jb2RlPiB2YWx1ZSwgMjxzdXA+Nzwvc3VwPi0xLgotICAgICAqIDwvcD4KKyAgICAgKiBUaGUgbWF4aW11bSB7QGNvZGUgQnl0ZX0gdmFsdWUsIDI8c3VwPjc8L3N1cD4tMS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTUFYX1ZBTFVFID0gKGJ5dGUpIDB4N0Y7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1pbmltdW0gPGNvZGU+Ynl0ZTwvY29kZT4gdmFsdWUsIC0yPHN1cD43PC9zdXA+LgotICAgICAqIDwvcD4KKyAgICAgKiBUaGUgbWluaW11bSB7QGNvZGUgQnl0ZX0gdmFsdWUsIC0yPHN1cD43PC9zdXA+LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNSU5fVkFMVUUgPSAoYnl0ZSkgMHg4MDsKICAgICAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJlcHJlc2VudCBhIDxjb2RlPmJ5dGU8L2NvZGU+IGluCi0gICAgICogdHdvJ3MgY29tcGxpbWVudCBmb3JtLgotICAgICAqIDwvcD4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCBhIHtAY29kZSBCeXRlfSB2YWx1ZSBpbiB0d28ncworICAgICAqIGNvbXBsZW1lbnQgZm9ybS4KICAgICAgKiAKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IDg7CiAKICAgICAvKioKLSAgICAgKiBUaGUgamF2YS5sYW5nLkNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNsYXNzLgorICAgICAqIFRoZSB7QGxpbmsgQ2xhc3N9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHByaW1pdGl2ZSB0eXBlIHtAY29kZSBieXRlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPEJ5dGU+IFRZUEUgPSAoQ2xhc3M8Qnl0ZT4pIG5ldyBieXRlWzBdLmdldENsYXNzKCkKQEAgLTY0LDM5ICs2NSw0MCBAQAogICAgIC8vIGRlZmluZWQgdG8gYmUgImphdmEubGFuZy5CeXRlLlRZUEUiOwogICAgIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIEEgY2FjaGUgb2YgaW5zdGFuY2VzIHVzZWQgYnkge0BsaW5rICN2YWx1ZU9mKGJ5dGUpfSBhbmQgYXV0by1ib3hpbmcuCi0gICAgICogPC9wPgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVbXSBDQUNIRSA9IG5ldyBCeXRlWzI1Nl07CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aGljaCByZXByZXNlbnRzIHRoZSBieXRlCi0gICAgICogdmFsdWVkIGFyZ3VtZW50LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJ5dGV9IHdpdGggdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgYnl0ZSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIHN0b3JlIGluIHRoZSBuZXcgaW5zdGFuY2UuCisgICAgICogICAgICAgICAgICB0aGUgcHJpbWl0aXZlIGJ5dGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIG5ldyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQnl0ZShieXRlIHZhbHVlKSB7CiAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gYSBzdHJpbmcuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQnl0ZX0gZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHZhbHVlLgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYSBieXRlIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHJpbmd9IGNhbiBub3QgYmUgZGVjb2RlZCBpbnRvIGEgYnl0ZSB2YWx1ZS4KKyAgICAgKiBAc2VlICNwYXJzZUJ5dGUoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCeXRlKFN0cmluZyBzdHJpbmcpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewogICAgICAgICB0aGlzKHBhcnNlQnl0ZShzdHJpbmcpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCisgICAgICogR2V0cyB0aGUgcHJpbWl0aXZlIHZhbHVlIG9mIHRoaXMgYnl0ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJ5dGUgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0J3MgcHJpbWl0aXZlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKQEAgLTEwNCwzNSArMTA2LDM0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29tcGFyZXMgdGhpcyA8Y29kZT5CeXRlPC9jb2RlPiB0byB0aGUgPGNvZGU+Qnl0ZTwvY29kZT4gcGFzc2VkLiBJZgotICAgICAqIHRoaXMgaW5zdGFuY2UncyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlIHBhc3NlZCwgdGhlbgotICAgICAqIDAgaXMgcmV0dXJuZWQuIElmIHRoaXMgaW5zdGFuY2UncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIHRoZQotICAgICAqIGluc3RhbmNlIHBhc3NlZCwgdGhlbiBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkLiBJZiB0aGlzIGluc3RhbmNlJ3MKLSAgICAgKiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBwYXNzZWQsIHRoZW4gYSBwb3NpdGl2ZQotICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGJ5dGUgb2JqZWN0IHRvIGRldGVybWluZSB0aGVpcgorICAgICAqIHJlbGF0aXZlIG9yZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIGluc3RhbmNlIHRvIGNvbXBhcmUgdG8uCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS4yCisgICAgICogQHBhcmFtIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBvYmplY3QgdG8uCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGJ5dGUgaXMgbGVzcyB0aGFuIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgb2Yge0Bjb2RlIG9iamVjdH07IDAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgYnl0ZSBhbmQgdGhlIHZhbHVlIG9mCisgICAgICogICAgICAgICB7QGNvZGUgb2JqZWN0fSBhcmUgZXF1YWw7IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgIGJ5dGUgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiB7QGNvZGUgb2JqZWN0fS4KKyAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oQnl0ZSBvYmplY3QpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlID4gb2JqZWN0LnZhbHVlID8gMSA6ICh2YWx1ZSA8IG9iamVjdC52YWx1ZSA/IC0xIDogMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgYXMgaWYgaXQgd2FzIGEgYnl0ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQuIEl0IGlzIGFuIGVycm9yIGlmIHRoZSByZWNlaXZlZCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhCi0gICAgICogcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYnl0ZSBxdWFudGl0eS4gVGhlIHN0cmluZyBtYXkgYmUgYSBoZXhhZGVjaW1hbAotICAgICAqICgiMHguLi4iKSwgb2N0YWwgKCIwLi4uIiksIG9yIGRlY2ltYWwgKCIuLi4iKSByZXByZXNlbnRhdGlvbiBvZiBhIGJ5dGUuCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm5zIGEge0Bjb2RlIEJ5dGV9IGluc3RhbmNlIGlmIHRoZQorICAgICAqIHN0cmluZyBjYW4gYmUgZGVjb2RlZCBpbnRvIGEgc2luZ2xlIGJ5dGUgdmFsdWUuIFRoZSBzdHJpbmcgbWF5IGJlIGFuCisgICAgICogb3B0aW9uYWwgbWludXMgc2lnbiAiLSIgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCAoIjB4Li4uIiBvciAiIy4uLiIpLAorICAgICAqIG9jdGFsICgiMC4uLiIpLCBvciBkZWNpbWFsICgiLi4uIikgcmVwcmVzZW50YXRpb24gb2YgYSBieXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGJ5dGUgcXVhbnRpdHkuCi0gICAgICogQHJldHVybiBCeXRlIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKKyAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGJ5dGUgdmFsdWUuCisgICAgICogQHJldHVybiBhIHtAY29kZSBCeXRlfSBjb250YWluaW5nIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB7QGNvZGUgc3RyaW5nfS4KICAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgYnl0ZSBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGJ5dGUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCeXRlIGRlY29kZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgaW50IGludFZhbHVlID0gSW50ZWdlci5kZWNvZGUoc3RyaW5nKS5pbnRWYWx1ZSgpOwpAQCAtMTQzLDI4ICsxNDQsMjEgQEAKICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gZG91YmxlIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIGFyZ3VtZW50IG11c3QgYWxzbyBiZSBhIEJ5dGUsIGFuZCB0aGUgcmVjZWl2ZXIgYW5kCi0gICAgICogYXJndW1lbnQgbXVzdCByZXByZXNlbnQgdGhlIHNhbWUgYnl0ZSB2YWx1ZS4KKyAgICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBpbmRpY2F0ZXMgaWYgdGhleSBhcmUKKyAgICAgKiBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvYmplY3R9IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiB7QGNvZGUgQnl0ZX0gYW5kIGhhdmUgdGhlIHNhbWUgYnl0ZSB2YWx1ZSBhcyB0aGlzIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0Ci0gICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIGJ5dGUgd2l0aC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgQnl0ZX07IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC0xNzIsNjAgKzE2NiwzNyBAQAogICAgICAgICAgICAgICAgICYmICh2YWx1ZSA9PSAoKEJ5dGUpIG9iamVjdCkudmFsdWUpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZsb2F0IHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBmbG9hdCB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIG9iamVjdHMgd2hpY2gKLSAgICAgKiBhbnN3ZXIgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gPGNvZGU+ZXF1YWxzPC9jb2RlPiBtdXN0Ci0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50IHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9uZyB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gbG9uZyB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhIGJ5dGUgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEKLSAgICAgKiBzaW5nbGUgYnl0ZSBxdWFudGl0eS4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBzaWduZWQgZGVjaW1hbCBieXRlIHZhbHVlLiBUaGUgQVNDSUkKKyAgICAgKiBjaGFyYWN0ZXIgXHUwMDJkICgnLScpIGlzIHJlY29nbml6ZWQgYXMgdGhlIG1pbnVzIHNpZ24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYnl0ZSBxdWFudGl0eS4KLSAgICAgKiBAcmV0dXJuIGJ5dGUgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBhcmd1bWVudAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSBieXRlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHtAY29kZSBzdHJpbmd9LgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYSBieXRlIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHJpbmd9IGlzIHtAY29kZSBudWxsfSwgaGFzIGEgbGVuZ3RoIG9mIHplcm8gb3IKKyAgICAgKiAgICAgICAgICAgICBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGJ5dGUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlIHBhcnNlQnl0ZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgaW50IGludFZhbHVlID0gSW50ZWdlci5wYXJzZUludChzdHJpbmcpOwpAQCAtMjM3LDE4ICsyMDgsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHN0cmluZyBhcmd1bWVudCBhcyBpZiBpdCB3YXMgYSBieXRlIHZhbHVlIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlc3VsdC4gVGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhCi0gICAgICogc2luZ2xlIGJ5dGUgcXVhbnRpdHkuIFRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSByYWRpeCB0byB1c2Ugd2hlbgotICAgICAqIHBhcnNpbmcgdGhlIHZhbHVlLgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIHNpZ25lZCBieXRlIHZhbHVlIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByYWRpeC4gVGhlIEFTQ0lJIGNoYXJhY3RlciBcdTAwMmQgKCctJykgaXMgcmVjb2duaXplZCBhcyB0aGUgbWludXMgc2lnbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHZhbHVlLgogICAgICAqIEBwYXJhbSByYWRpeAogICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHRvIHVzZSB3aGVuIHBhcnNpbmcuCi0gICAgICogQHJldHVybiBieXRlIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgYnl0ZSB2YWx1ZSByZXByZXNlbnRlZCBieSB7QGNvZGUgc3RyaW5nfSB1c2luZworICAgICAqICAgICAgICAge0Bjb2RlIHJhZGl4fS4KICAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgYnl0ZSBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0gb3IgaGFzIGEgbGVuZ3RoIG9mIHplcm8sCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHJhZGl4IDwgQ2hhcmFjdGVyLk1JTl9SQURJWH0sCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHJhZGl4ID4gQ2hhcmFjdGVyLk1BWF9SQURJWH0sIG9yIGlmIHtAY29kZSBzdHJpbmd9CisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBieXRlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBwYXJzZUJ5dGUoU3RyaW5nIHN0cmluZywgaW50IHJhZGl4KQogICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CkBAIC0yNjAsMjIgKzIzNCwxMSBAQAogICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hvcnQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHNob3J0IHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodmFsdWUpOwpAQCAtMjgzLDQ0ICsyNDYsNTEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIGFyZ3VtZW50LgorICAgICAqIHNwZWNpZmllZCBieXRlIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgYnl0ZSB0aGUgYnl0ZSB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gU3RyaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgYnl0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdmFsdWV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGJ5dGUgdmFsdWUpIHsKICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhIGJ5dGUgdmFsdWUgYW5kIHJldHVybnMgYSBCeXRlCi0gICAgICogcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuIFRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIHN0cmluZwotICAgICAqIGNhbm5vdCBiZSBwYXJzZWQgYXMgYSBieXRlIHF1YW50aXR5LgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIHNpZ25lZCBkZWNpbWFsIGJ5dGUgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYnl0ZSBxdWFudGl0eS4KLSAgICAgKiBAcmV0dXJuIEJ5dGUgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBhcmd1bWVudAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQnl0ZX0gaW5zdGFuY2UgY29udGFpbmluZyB0aGUgYnl0ZSB2YWx1ZSByZXByZXNlbnRlZCBieQorICAgICAqICAgICAgICAge0Bjb2RlIHN0cmluZ30uCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhIGJ5dGUgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gaXMge0Bjb2RlIG51bGx9LCBoYXMgYSBsZW5ndGggb2YgemVybyBvcgorICAgICAqICAgICAgICAgICAgIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgYnl0ZSB2YWx1ZS4KKyAgICAgKiBAc2VlICNwYXJzZUJ5dGUoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnl0ZSB2YWx1ZU9mKFN0cmluZyBzdHJpbmcpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gdmFsdWVPZihwYXJzZUJ5dGUoc3RyaW5nKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgYXMgaWYgaXQgd2FzIGEgYnl0ZSB2YWx1ZSBhbmQgcmV0dXJucyBhIEJ5dGUKLSAgICAgKiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC4gVGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nCi0gICAgICogY2Fubm90IGJlIHBhcnNlZCBhcyBhIGJ5dGUgcXVhbnRpdHkuIFRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZQotICAgICAqIHJhZGl4IHRvIHVzZSB3aGVuIHBhcnNpbmcgdGhlIHZhbHVlLgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIHNpZ25lZCBieXRlIHZhbHVlIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBieXRlIHZhbHVlLgogICAgICAqIEBwYXJhbSByYWRpeAogICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHRvIHVzZSB3aGVuIHBhcnNpbmcuCi0gICAgICogQHJldHVybiBCeXRlIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIEJ5dGV9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGJ5dGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiAgICAgICAgIHtAY29kZSBzdHJpbmd9IHVzaW5nIHtAY29kZSByYWRpeH0uCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhIGJ5dGUgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gaXMge0Bjb2RlIG51bGx9IG9yIGhhcyBhIGxlbmd0aCBvZiB6ZXJvLAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVh9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVh9LCBvciBpZiB7QGNvZGUgc3RyaW5nfQorICAgICAqICAgICAgICAgICAgIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgYnl0ZSB2YWx1ZS4KKyAgICAgKiBAc2VlICNwYXJzZUJ5dGUoU3RyaW5nLCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCeXRlIHZhbHVlT2YoU3RyaW5nIHN0cmluZywgaW50IHJhZGl4KQogICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CkBAIC0zMjgsMTIgKzI5OCwxNyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIGEgPGNvZGU+Qnl0ZTwvY29kZT4gaW5zdGFuY2UgZm9yIHRoZSA8Y29kZT5ieXRlPC9jb2RlPiB2YWx1ZSBwYXNzZWQuCi0gICAgICogVGhpcyBtZXRob2QgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGNvbnN0cnVjdG9yLCBhcyB0aGlzIG1ldGhvZCBtYXkgbWFpbnRhaW4gYSBjYWNoZQotICAgICAqIG9mIGluc3RhbmNlcy48L3A+Ci0gICAgICogQHBhcmFtIGIgVGhlIGJ5dGUgdmFsdWUuCi0gICAgICogQHJldHVybiBBIDxjb2RlPkJ5dGU8L2NvZGU+IGluc3RhbmNlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIEJ5dGV9IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGJ5dGUgdmFsdWUuCisgICAgICogPHA+CisgICAgICogSWYgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBnZXQgYSBuZXcge0Bjb2RlIEJ5dGV9IGluc3RhbmNlLCBpdCBpcworICAgICAqIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjb25zdHJ1Y3Rvciwgc2luY2UgaXQKKyAgICAgKiBtYWludGFpbnMgYSBjYWNoZSBvZiBpbnN0YW5jZXMgd2hpY2ggbWF5IHJlc3VsdCBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBCeXRlfSBpbnN0YW5jZSBjb250YWluaW5nIHtAY29kZSBifS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJ5dGUgdmFsdWVPZihieXRlIGIpIHsKICAgICAgICAgc3luY2hyb25pemVkIChDQUNIRSkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DaGFyU2VxdWVuY2UuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2hhclNlcXVlbmNlLmphdmEKaW5kZXggYjkxYjcyOC4uMTkwMTE5MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DaGFyU2VxdWVuY2UuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NoYXJTZXF1ZW5jZS5qYXZhCkBAIC0xOSwxNSArMTksMTggQEAKIAogCiAvKioKLSAqIFRoZSBDaGFyU2VxdWVuY2UgaW50ZXJmYWNlIHJlcHJlc2VudHMgYW4gb3JkZXJlZCBzZXQgb2YgY2hhcmFjdGVycyBhbmQgdGhlCi0gKiBmdW5jdGlvbnMgdG8gcHJvYmUgdGhlbS4KKyAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYW4gb3JkZXJlZCBzZXQgb2YgY2hhcmFjdGVycyBhbmQgZGVmaW5lcyB0aGUKKyAqIG1ldGhvZHMgdG8gcHJvYmUgdGhlbS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ2hhclNlcXVlbmNlIHsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGlzIHNlcXVlbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzZXF1ZW5jZQorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCk7CiAKQEAgLTM1LDM1ICszOCw0MyBAQAogICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAgICAgKiBoYXZpbmcgaW5kZXggemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gcmV0dXJuCi0gICAgICogQHJldHVybiBUaGUgcmVxdWVzdGVkIGNoYXJhY3RlcgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBjaGFyYWN0ZXIuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5pbmRleCAmbHQ7IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+aW5kZXg8L2NvZGU+ICZndDs9IHRoZSBsZW5ndGggb2YgdGhlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwfSBvciB7QGNvZGUgaW5kZXh9IGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICBsZW5ndGggb2YgdGhpcyBzZXF1ZW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDaGFyU2VxdWVuY2UgZnJvbSB0aGUgPGNvZGU+c3RhcnQ8L2NvZGU+IGluZGV4IChpbmNsdXNpdmUpIHRvCi0gICAgICogdGhlIDxjb2RlPmVuZDwvY29kZT4gaW5kZXggKGV4Y2x1c2l2ZSkgb2YgdGhpcyBzZXF1ZW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgICAgICBzdGFydCBUaGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBzdWItc2VxdWVuY2UsIHRoYXQgaXMsIHRoZQotICAgICAqICAgICAgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgZ29lcyBpbnRvIHRoZSBzdWItc2VxdWVuY2UKLSAgICAgKiBAcGFyYW0gICAgICAgZW5kIFRoZSBlbmRpbmcgb2Zmc2V0IG9mIHRoZSBzdWItc2VxdWVuY2UsIHRoYXQgaXMsIHRoZQotICAgICAqICAgICAgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRob3NlIHRoYXQgZ28gaW50byB0aGUKLSAgICAgKiAgICAgICAgICAgICAgc3ViLXNlcXVlbmNlCi0gICAgICogQHJldHVybiAgICAgIFRoZSByZXF1ZXN0ZWQgc3ViLXNlcXVlbmNlCi0gICAgICogQHRocm93cyAgICAgIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiAxLiBlaXRoZXIgaW5kZXggaXMgYmVsb3cgMAotICAgICAqICAgICAgICAgICAgICAyLiBlaXRoZXIgaW5kZXggJmd0Oz0gPGNvZGU+dGhpcy5sZW5ndGgoKTwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICAgMy4gPGNvZGU+c3RhcnQgJmd0OyBlbmQgPC9jb2RlPgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgQ2hhclNlcXVlbmNlfSBmcm9tIHRoZSB7QGNvZGUgc3RhcnR9IGluZGV4IChpbmNsdXNpdmUpCisgICAgICogdG8gdGhlIHtAY29kZSBlbmR9IGluZGV4IChleGNsdXNpdmUpIG9mIHRoaXMgc2VxdWVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBzdWItc2VxdWVuY2UuIEl0IGlzIGluY2x1c2l2ZSwgdGhhdAorICAgICAqICAgICAgICAgICAgaXMsIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlCisgICAgICogICAgICAgICAgICBzdWItc2VxdWVuY2UuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHN1Yi1zZXF1ZW5jZS4gSXQgaXMgZXhjbHVzaXZlLCB0aGF0IGlzLAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhvc2UgdGhhdCBhcmUgaW5jbHVkZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBzdWItc2VxdWVuY2UKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgc3ViLXNlcXVlbmNlLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9LCB7QGNvZGUgZW5kIDwgMH0sIHtAY29kZSBzdGFydCA+IGVuZH0sCisgICAgICogICAgICAgICAgICAgb3IgaWYge0Bjb2RlIHN0YXJ0fSBvciB7QGNvZGUgZW5kfSBhcmUgZ3JlYXRlciB0aGFuIHRoZQorICAgICAqICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGlzIHNlcXVlbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTdHJpbmcgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJzIGFuZCBvcmRlcmluZyBvZiB0aGlzCi0gICAgICogQ2hhclNlcXVlbmNlCisgICAgICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBzYW1lIGNoYXJhY3RlcnMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhpcworICAgICAqIHNlcXVlbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgYmFzZWQgb24gdGhlIENoYXJTZXF1ZW5jZQorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgYmFzZWQgb24gdGhpcyBzZXF1ZW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NoYXJhY3Rlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DaGFyYWN0ZXIuamF2YQppbmRleCA1ODdhOTYxLi41NjRlMzdhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NoYXJhY3Rlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2hhcmFjdGVyLmphdmEKQEAgLTIxLDQyICsyMSw0MCBAQAogLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCiAvLyBpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKIC8vIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKy8vIAogLy8gaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuQmluYXJ5U2VhcmNoOwogLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorCisvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKIGltcG9ydCBjb20uaWJtLmljdTRqbmkubGFuZy5VQ2hhcmFjdGVyOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKLSAqIDxwPgotICogQ2hhcmFjdGVyIGlzIHRoZSB3cmFwcGVyIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUgPGNvZGU+Y2hhcjwvY29kZT4uIFRoaXMKLSAqIGNsYXNzIGFsc28gcHJvdmlkZXMgYSBudW1iZXIgb2YgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGgKLSAqIDxjb2RlPmNoYXI8L2NvZGU+cy4KLSAqIDwvcD4KLSAqIAorICogVGhlIHdyYXBwZXIgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSB7QGNvZGUgY2hhcn0uIFRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBhCisgKiBudW1iZXIgb2YgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggY2hhcmFjdGVycy4KICAqIDxwPgogICogQ2hhcmFjdGVyIGRhdGEgaXMgYmFzZWQgdXBvbiB0aGUgVW5pY29kZSBTdGFuZGFyZCwgNC4wLiBUaGUgVW5pY29kZQogICogc3BlY2lmaWNhdGlvbiwgY2hhcmFjdGVyIHRhYmxlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCA8YQogICogaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy8iPmh0dHA6Ly93d3cudW5pY29kZS5vcmcvPC9hPi4KICAqIDwvcD4KLSAqIAogICogPHA+CiAgKiBVbmljb2RlIGNoYXJhY3RlcnMgYXJlIHJlZmVycmVkIHRvIGFzIDxpPmNvZGUgcG9pbnRzPC9pPi4gVGhlIHJhbmdlIG9mIHZhbGlkCiAgKiBjb2RlIHBvaW50cyBpcyBVKzAwMDAgdG8gVSsxMEZGRkYuIFRoZSA8aT5CYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCk8L2k+CiAgKiBpcyB0aGUgY29kZSBwb2ludCByYW5nZSBVKzAwMDAgdG8gVStGRkZGLiBDaGFyYWN0ZXJzIGFib3ZlIHRoZSBCTVAgYXJlCiAgKiByZWZlcnJlZCB0byBhcyA8aT5TdXBwbGVtZW50YXJ5IENoYXJhY3RlcnM8L2k+LiBPbiB0aGUgSmF2YSBwbGF0Zm9ybSwgVVRGLTE2Ci0gKiBlbmNvZGluZyBhbmQgPGNvZGU+Y2hhcjwvY29kZT4gcGFpcnMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGNvZGUgcG9pbnRzIGluCi0gKiB0aGUgc3VwcGxlbWVudGFyeSByYW5nZS4gQSBwYWlyIG9mIDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlcyB0aGF0IHJlcHJlc2VudAotICogYSBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlciBhcmUgbWFkZSB1cCBvZiBhIDxpPmhpZ2ggc3Vycm9nYXRlPC9pPiB3aXRoIGEKLSAqIHZhbHVlIHJhbmdlIG9mIDB4RDgwMCB0byAweERCRkYgYW5kIGEgPGk+bG93IHN1cnJvZ2F0ZTwvaT4gd2l0aCBhIHZhbHVlCi0gKiByYW5nZSBvZiAweERDMDAgdG8gMHhERkZGLgorICogZW5jb2RpbmcgYW5kIHtAY29kZSBjaGFyfSBwYWlycyBhcmUgdXNlZCB0byByZXByZXNlbnQgY29kZSBwb2ludHMgaW4gdGhlCisgKiBzdXBwbGVtZW50YXJ5IHJhbmdlLiBBIHBhaXIgb2Yge0Bjb2RlIGNoYXJ9IHZhbHVlcyB0aGF0IHJlcHJlc2VudCBhCisgKiBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlciBhcmUgbWFkZSB1cCBvZiBhIDxpPmhpZ2ggc3Vycm9nYXRlPC9pPiB3aXRoIGEgdmFsdWUKKyAqIHJhbmdlIG9mIDB4RDgwMCB0byAweERCRkYgYW5kIGEgPGk+bG93IHN1cnJvZ2F0ZTwvaT4gd2l0aCBhIHZhbHVlIHJhbmdlIG9mCisgKiAweERDMDAgdG8gMHhERkZGLgogICogPC9wPgotICogCiAgKiA8cD4KLSAqIE9uIHRoZSBKYXZhIHBsYXRmb3JtIGEgPGNvZGU+Y2hhcjwvY29kZT4gdmFsdWUgcmVwcmVzZW50cyBlaXRoZXIgYSBzaW5nbGUKLSAqIEJNUCBjb2RlIHBvaW50IG9yIGEgVVRGLTE2IHVuaXQgdGhhdCdzIHBhcnQgb2YgYSBzdXJyb2dhdGUgcGFpci4gVGhlCi0gKiA8Y29kZT5pbnQ8L2NvZGU+IHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgYWxsIFVuaWNvZGUgY29kZSBwb2ludHMuCisgKiBPbiB0aGUgSmF2YSBwbGF0Zm9ybSBhIHtAY29kZSBjaGFyfSB2YWx1ZSByZXByZXNlbnRzIGVpdGhlciBhIHNpbmdsZSBCTVAgY29kZQorICogcG9pbnQgb3IgYSBVVEYtMTYgdW5pdCB0aGF0J3MgcGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyLiBUaGUge0Bjb2RlIGludH0gdHlwZQorICogaXMgdXNlZCB0byByZXByZXNlbnQgYWxsIFVuaWNvZGUgY29kZSBwb2ludHMuCiAgKiA8L3A+CiAgKiAKLSAqIEBzaW5jZSAxLjAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ2hhcmFjdGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDb21wYXJhYmxlPENoYXJhY3Rlcj4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3ODYxOTg5MTA4NjUzODUwODBMOwpAQCAtNjQsMjkgKzYyLDM3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBjaGFyIHZhbHVlOwogCiAgICAgLyoqCi0gICAgICogVGhlIG1pbmltdW0gcG9zc2libGUgQ2hhcmFjdGVyIHZhbHVlLgorICAgICAqIFRoZSBtaW5pbXVtIHtAY29kZSBDaGFyYWN0ZXJ9IHZhbHVlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNSU5fVkFMVUUgPSAnXHUwMDAwJzsKIAogICAgIC8qKgotICAgICAqIFRoZSBtYXhpbXVtIHBvc3NpYmxlIENoYXJhY3RlciB2YWx1ZS4KKyAgICAgKiBUaGUgbWF4aW11bSB7QGNvZGUgQ2hhcmFjdGVyfSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTUFYX1ZBTFVFID0gJ1x1ZmZmZic7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbWluaW11bSBwb3NzaWJsZSByYWRpeCB1c2VkIGZvciBjb252ZXJzaW9ucyBiZXR3ZWVuIENoYXJhY3RlcnMgYW5kCi0gICAgICogaW50ZWdlcnMuCisgICAgICogVGhlIG1pbmltdW0gcmFkaXggdXNlZCBmb3IgY29udmVyc2lvbnMgYmV0d2VlbiBjaGFyYWN0ZXJzIGFuZCBpbnRlZ2Vycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fUkFESVggPSAyOwogCiAgICAgLyoqCi0gICAgICogVGhlIG1heGltdW0gcG9zc2libGUgcmFkaXggdXNlZCBmb3IgY29udmVyc2lvbnMgYmV0d2VlbiBDaGFyYWN0ZXJzIGFuZAotICAgICAqIGludGVnZXJzLgorICAgICAqIFRoZSBtYXhpbXVtIHJhZGl4IHVzZWQgZm9yIGNvbnZlcnNpb25zIGJldHdlZW4gY2hhcmFjdGVycyBhbmQgaW50ZWdlcnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JBRElYID0gMzY7CiAKICAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+Y2hhcjwvY29kZT4ge0BsaW5rIENsYXNzfSBvYmplY3QuCisgICAgICogVGhlIHtAbGluayBDbGFzc30gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcHJpbWl0aXZlIHR5cGUge0Bjb2RlIGNoYXJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Q2hhcmFjdGVyPiBUWVBFID0gKENsYXNzPENoYXJhY3Rlcj4pIG5ldyBjaGFyWzBdCkBAIC05NywzNjcgKzEwMyw0MjYgQEAKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgQ24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFVOQVNTSUdORUQgPSAwOwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBMdS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVVBQRVJDQVNFX0xFVFRFUiA9IDE7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IExsLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMT1dFUkNBU0VfTEVUVEVSID0gMjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgTHQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRJVExFQ0FTRV9MRVRURVIgPSAzOwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBMbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ESUZJRVJfTEVUVEVSID0gNDsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgTG8uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9USEVSX0xFVFRFUiA9IDU7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IE1uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBOT05fU1BBQ0lOR19NQVJLID0gNjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgTWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVOQ0xPU0lOR19NQVJLID0gNzsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgTWMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTUJJTklOR19TUEFDSU5HX01BUksgPSA4OwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBOZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgREVDSU1BTF9ESUdJVF9OVU1CRVIgPSA5OwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBObC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEVUVEVSX05VTUJFUiA9IDEwOwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBOby4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1RIRVJfTlVNQkVSID0gMTE7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IFpzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTUEFDRV9TRVBBUkFUT1IgPSAxMjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgWmwuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExJTkVfU0VQQVJBVE9SID0gMTM7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IFpwLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQQVJBR1JBUEhfU0VQQVJBVE9SID0gMTQ7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IENjLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05UUk9MID0gMTU7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IENmLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGT1JNQVQgPSAxNjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgQ28uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBSSVZBVEVfVVNFID0gMTg7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IENzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVVJST0dBVEUgPSAxOTsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgUGQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERBU0hfUFVOQ1RVQVRJT04gPSAyMDsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgUHMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUQVJUX1BVTkNUVUFUSU9OID0gMjE7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IFBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFTkRfUFVOQ1RVQVRJT04gPSAyMjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgUGMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTk5FQ1RPUl9QVU5DVFVBVElPTiA9IDIzOwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBQby4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1RIRVJfUFVOQ1RVQVRJT04gPSAyNDsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgU20uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1BVEhfU1lNQk9MID0gMjU7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IFNjLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDVVJSRU5DWV9TWU1CT0wgPSAyNjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgY2F0ZWdvcnkgY29uc3RhbnQgU2suCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PRElGSUVSX1NZTUJPTCA9IDI3OwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBTby4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1RIRVJfU1lNQk9MID0gMjg7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGNhdGVnb3J5IGNvbnN0YW50IFBpLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgSU5JVElBTF9RVU9URV9QVU5DVFVBVElPTiA9IDI5OwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBjYXRlZ29yeSBjb25zdGFudCBQZi4KLSAgICAgKiBAc2luY2UgMS40CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkFMX1FVT1RFX1BVTkNUVUFUSU9OID0gMzA7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQuCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9VTkRFRklORUQgPSAtMTsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBjb25zdGFudCBMLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCA9IDA7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQgUi4KLSAgICAgKiBAc2luY2UgMS40CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQgPSAxOwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBiaWRpcmVjdGlvbmFsIGNvbnN0YW50IEFMLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMgPSAyOwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBiaWRpcmVjdGlvbmFsIGNvbnN0YW50IEVOLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSID0gMzsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBjb25zdGFudCBFUy4KLSAgICAgKiBAc2luY2UgMS40CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IgPSA0OwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBiaWRpcmVjdGlvbmFsIGNvbnN0YW50IEVULgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1RFUk1JTkFUT1IgPSA1OwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBiaWRpcmVjdGlvbmFsIGNvbnN0YW50IEFOLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUiA9IDY7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQgQ1MuCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiA9IDc7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQgTlNNLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9OT05TUEFDSU5HX01BUksgPSA4OwogCiAgICAgLyoqCiAgICAgICogVW5pY29kZSBiaWRpcmVjdGlvbmFsIGNvbnN0YW50IEJOLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfQk9VTkRBUllfTkVVVFJBTCA9IDk7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQgQi4KLSAgICAgKiBAc2luY2UgMS40CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1BBUkFHUkFQSF9TRVBBUkFUT1IgPSAxMDsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBjb25zdGFudCBTLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfU0VHTUVOVF9TRVBBUkFUT1IgPSAxMTsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBjb25zdGFudCBXUy4KLSAgICAgKiBAc2luY2UgMS40CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1dISVRFU1BBQ0UgPSAxMjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBjb25zdGFudCBPTi4KLSAgICAgKiBAc2luY2UgMS40CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX09USEVSX05FVVRSQUxTID0gMTM7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQgTFJFLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVF9FTUJFRERJTkcgPSAxNDsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBjb25zdGFudCBMUk8uCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUX09WRVJSSURFID0gMTU7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQgUkxFLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9FTUJFRERJTkcgPSAxNjsKIAogICAgIC8qKgogICAgICAqIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBjb25zdGFudCBSTE8uCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX09WRVJSSURFID0gMTc7CiAKICAgICAvKioKICAgICAgKiBVbmljb2RlIGJpZGlyZWN0aW9uYWwgY29uc3RhbnQgUERGLgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfUE9QX0RJUkVDVElPTkFMX0ZPUk1BVCA9IDE4OwogICAgIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1pbmltdW0gdmFsdWUgb2YgYSBoaWdoIHN1cnJvZ2F0ZSBvciBsZWFkaW5nIHN1cnJvZ2F0ZSB1bml0IGluIFVURi0xNgotICAgICAqIGVuY29kaW5nIC0gPGNvZGU+J1x1RDgwMCc8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBUaGUgbWluaW11bSB2YWx1ZSBvZiBhIGhpZ2ggc3Vycm9nYXRlIG9yIGxlYWRpbmcgc3Vycm9nYXRlIHVuaXQgaW4gVVRGLTE2CisgICAgICogZW5jb2RpbmcsIHtAY29kZSAnXHVEODAwJ30uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNSU5fSElHSF9TVVJST0dBVEUgPSAnXHVEODAwJzsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1heGltdW0gdmFsdWUgb2YgYSBoaWdoIHN1cnJvZ2F0ZSBvciBsZWFkaW5nIHN1cnJvZ2F0ZSB1bml0IGluIFVURi0xNgotICAgICAqIGVuY29kaW5nIC0gPGNvZGU+J1x1REJGRic8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBvZiBhIGhpZ2ggc3Vycm9nYXRlIG9yIGxlYWRpbmcgc3Vycm9nYXRlIHVuaXQgaW4gVVRGLTE2CisgICAgICogZW5jb2RpbmcsIHtAY29kZSAnXHVEQkZGJ30uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNQVhfSElHSF9TVVJST0dBVEUgPSAnXHVEQkZGJzsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1pbmltdW0gdmFsdWUgb2YgYSBsb3cgc3Vycm9nYXRlIG9yIHRyYWlsaW5nIHN1cnJvZ2F0ZSB1bml0IGluIFVURi0xNgotICAgICAqIGVuY29kaW5nIC0gPGNvZGU+J1x1REMwMCc8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBUaGUgbWluaW11bSB2YWx1ZSBvZiBhIGxvdyBzdXJyb2dhdGUgb3IgdHJhaWxpbmcgc3Vycm9nYXRlIHVuaXQgaW4gVVRGLTE2CisgICAgICogZW5jb2RpbmcsIHtAY29kZSAnXHVEQzAwJ30uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNSU5fTE9XX1NVUlJPR0FURSA9ICdcdURDMDAnOwogCiAgICAgLyoqCi0gICAgICogTWF4aW11bSB2YWx1ZSBvZiBhIGxvdyBzdXJyb2dhdGUgb3IgdHJhaWxpbmcgc3Vycm9nYXRlIHVuaXQgaW4gVVRGLTE2Ci0gICAgICogZW5jb2RpbmcgLSA8Y29kZT4nXHVERkZGJzwvY29kZT4uCi0gICAgICogPC9wPgorICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgbG93IHN1cnJvZ2F0ZSBvciB0cmFpbGluZyBzdXJyb2dhdGUgdW5pdCBpbiBVVEYtMTYKKyAgICAgKiBlbmNvZGluZywge0Bjb2RlICdcdURGRkYnfS4KICAgICAgKiAKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE1BWF9MT1dfU1VSUk9HQVRFID0gJ1x1REZGRic7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNaW5pbXVtIHZhbHVlIG9mIGEgc3Vycm9nYXRlIHVuaXQgaW4gVVRGLTE2IGVuY29kaW5nIC0gPGNvZGU+J1x1RDgwMCc8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBUaGUgbWluaW11bSB2YWx1ZSBvZiBhIHN1cnJvZ2F0ZSB1bml0IGluIFVURi0xNiBlbmNvZGluZywge0Bjb2RlICdcdUQ4MDAnfS4KICAgICAgKiAKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE1JTl9TVVJST0dBVEUgPSAnXHVEODAwJzsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1heGltdW0gdmFsdWUgb2YgYSBzdXJyb2dhdGUgdW5pdCBpbiBVVEYtMTYgZW5jb2RpbmcgLSA8Y29kZT4nXHVERkZGJzwvY29kZT4uCi0gICAgICogPC9wPgorICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgc3Vycm9nYXRlIHVuaXQgaW4gVVRGLTE2IGVuY29kaW5nLCB7QGNvZGUgJ1x1REZGRid9LgogICAgICAqIAotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTUFYX1NVUlJPR0FURSA9ICdcdURGRkYnOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWluaW11bSB2YWx1ZSBvZiBhIHN1cHBsZW1lbnRhcnkgY29kZSBwb2ludCAtIDxjb2RlPlUrMDEwMDAwPC9jb2RlPi4KLSAgICAgKiA8L3A+CisgICAgICogVGhlIG1pbmltdW0gdmFsdWUgb2YgYSBzdXBwbGVtZW50YXJ5IGNvZGUgcG9pbnQsIHtAY29kZSBVKzAxMDAwMH0uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9TVVBQTEVNRU5UQVJZX0NPREVfUE9JTlQgPSAweDEwMDAwOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWluaW11bSBjb2RlIHBvaW50IHZhbHVlIC0gPGNvZGU+VSswMDAwPC9jb2RlPi4KLSAgICAgKiA8L3A+CisgICAgICogVGhlIG1pbmltdW0gY29kZSBwb2ludCB2YWx1ZSwge0Bjb2RlIFUrMDAwMH0uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9DT0RFX1BPSU5UID0gMHgwMDAwMDA7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNYXhpbXVtIGNvZGUgcG9pbnQgdmFsdWUgLSA8Y29kZT5VKzEwRkZGRjwvY29kZT4uCi0gICAgICogPC9wPgorICAgICAqIFRoZSBtYXhpbXVtIGNvZGUgcG9pbnQgdmFsdWUsIHtAY29kZSBVKzEwRkZGRn0uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DT0RFX1BPSU5UID0gMHgxMEZGRkY7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJlcHJlc2VudCBhIDxjb2RlPmNoYXI8L2NvZGU+IGluCisgICAgICogVGhlIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCBhIHtAY29kZSBDaGFyYWN0ZXJ9IHZhbHVlIGluCiAgICAgICogdHdvJ3MgY29tcGxpbWVudCBmb3JtLgotICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IDE2OwogCkBAIC00OTYsMTIgKzU2MSwyMSBAQAogICAgIC8vIGljdSBkYXRhLgogICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICAKLSAgICAvKgotICAgICAqIFN1YnNldCByZXByZXNlbnRzIGEgc3Vic2V0IG9mIGNoYXJhY3RlcnMuCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHN1YnNldCBvZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgc2V0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3Vic2V0IHsKICAgICAgICAgU3RyaW5nIG5hbWU7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFN1YnNldH0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICAgICAqICAgICAgICAgICAgdGhpcyBzdWJzZXQncyBuYW1lLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBTdWJzZXQoU3RyaW5nIHN0cmluZykgewogICAgICAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CkBAIC01MTAsMTUgKzU4NCwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMgU3Vic2V0IGFuZCByZXR1cm5zIHRydWUgaWYgdGhleQotICAgICAgICAgKiBhcmUgZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSB0aGUgc2FtZSBpbnN0YW5jZSBvZiBTdWJzZXQuCisgICAgICAgICAqIENvbXBhcmVzIHRoaXMgY2hhcmFjdGVyIHN1YnNldCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiBVc2VzCisgICAgICAgICAqIHtAbGluayBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpfSB0byBkbyB0aGUgY29tcGFyaXNvbi4KICAgICAgICAgICogCiAgICAgICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgU3Vic2V0LCBmYWxzZQotICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBjaGFyYWN0ZXIgc3Vic2V0IHdpdGguCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBvYmplY3R9IGlzIHRoaXMgc3Vic2V0LCB0aGF0IGlzLCBpZgorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBvYmplY3QgPT0gdGhpc307IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtNTI2LDEyICs1OTksMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlCi0gICAgICAgICAqIGVxdWFsIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICAgICAqIFJldHVybnMgdGhlIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGlzIGNoYXJhY3RlciBzdWJzZXQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgI2VxdWFscworICAgICAgICAgKiBAcmV0dXJuIHRoaXMgc3Vic2V0J3MgaGFzaCBjb2RlLCB3aGljaCBpcyB0aGUgaGFzaCBjb2RlIGNvbXB1dGVkIGJ5CisgICAgICAgICAqICAgICAgICAge0BsaW5rIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKX0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7CkBAIC01MzksOSArNjExLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU3Vic2V0LgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzdWJzZXQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTdWJzZXQKKyAgICAgICAgICogQHJldHVybiB0aGlzIHN1YnNldCdzIG5hbWUuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC01NTIsNjM5ICs2MjUsNzc5IEBACiAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgCiAgICAgLyoqCi0gICAgICogQmxvY2tzIG9mIGNoYXJhY3RlcnMsIGFzIGRlZmluZWQgYnkgdGhlIFVuaWNvZGUgNC4wLjEgc3BlY2lmaWNhdGlvbi4gCi0gICAgICogQHNpbmNlIDEuMgorICAgICAqIFJlcHJlc2VudHMgYSBibG9jayBvZiBVbmljb2RlIGNoYXJhY3RlcnMsIGFzIGRlZmluZWQgYnkgdGhlIFVuaWNvZGUgNC4wLjEKKyAgICAgKiBzcGVjaWZpY2F0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVW5pY29kZUJsb2NrIGV4dGVuZHMgU3Vic2V0IHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSAmcXVvdDtTdXJyb2dhdGVzIEFyZWEmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgNSwgdGhpcyBibG9jayBoYXMgYmVlbiByZXBsYWNlZCBieSB7QGxpbmsgI0hJR0hfU1VSUk9HQVRFU30sIHtAbGluayAjSElHSF9QUklWQVRFX1VTRV9TVVJST0dBVEVTfSBhbmQge0BsaW5rICNMT1dfU1VSUk9HQVRFU30uCisgICAgICAgICAqIFRoZSAmcXVvdDtTdXJyb2dhdGVzIEFyZWEmcXVvdDsgVW5pY29kZSBCbG9jay4KKyAgICAgICAgICogCisgICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgNSwgdGhpcyBibG9jayBoYXMgYmVlbiByZXBsYWNlZCBieQorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI0hJR0hfU1VSUk9HQVRFU30sCisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayAjSElHSF9QUklWQVRFX1VTRV9TVVJST0dBVEVTfSBhbmQKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rICNMT1dfU1VSUk9HQVRFU30uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgQERlcHJlY2F0ZWQKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1VSUk9HQVRFU19BUkVBID0gbmV3IFVuaWNvZGVCbG9jaygiU1VSUk9HQVRFU19BUkVBIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7QmFzaWMgTGF0aW4mcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBCQVNJQ19MQVRJTiA9IG5ldyBVbmljb2RlQmxvY2soIkJBU0lDX0xBVElOIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TGF0aW4tMSBTdXBwbGVtZW50JnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgTEFUSU5fMV9TVVBQTEVNRU5UID0gbmV3IFVuaWNvZGVCbG9jaygiTEFUSU5fMV9TVVBQTEVNRU5UIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TGF0aW4gRXh0ZW5kZWQtQSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIExBVElOX0VYVEVOREVEX0EgPSBuZXcgVW5pY29kZUJsb2NrKCJMQVRJTl9FWFRFTkRFRF9BIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TGF0aW4gRXh0ZW5kZWQtQiZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIExBVElOX0VYVEVOREVEX0IgPSBuZXcgVW5pY29kZUJsb2NrKCJMQVRJTl9FWFRFTkRFRF9CIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7SVBBIEV4dGVuc2lvbnMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBJUEFfRVhURU5TSU9OUyA9IG5ldyBVbmljb2RlQmxvY2soIklQQV9FWFRFTlNJT05TIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7U3BhY2luZyBNb2RpZmllciBMZXR0ZXJzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1BBQ0lOR19NT0RJRklFUl9MRVRURVJTID0gbmV3IFVuaWNvZGVCbG9jaygiU1BBQ0lOR19NT0RJRklFUl9MRVRURVJTIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7Q29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTID0gbmV3IFVuaWNvZGVCbG9jaygiQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTIik7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgJnF1b3Q7R3JlZWsgYW5kIENvcHRpYyZxdW90OyBVbmljb2RlIEJsb2NrLiBQcmV2aW91c2x5IHJlZmVycmVkIHRvIGFzICZxdW90O0dyZWVrJnF1b3Q7LgotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqIFRoZSAmcXVvdDtHcmVlayBhbmQgQ29wdGljJnF1b3Q7IFVuaWNvZGUgQmxvY2suIFByZXZpb3VzbHkgcmVmZXJyZWQKKyAgICAgICAgICogdG8gYXMgJnF1b3Q7R3JlZWsmcXVvdDsuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEdSRUVLID0gbmV3IFVuaWNvZGVCbG9jaygiR1JFRUsiKTsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSAmcXVvdDtDeXJpbGxpYyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIENZUklMTElDID0gbmV3IFVuaWNvZGVCbG9jaygiQ1lSSUxMSUMiKTsKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSAmcXVvdDtDeXJpbGxpYyBTdXBwbGVtZW50JnF1b3Q7IFVuaWNvZGUgQmxvY2suIFByZXZpb3VzbHkgcmVmZXJyZWQgdG8gYXMgJnF1b3Q7Q3lyaWxsaWMgU3VwcGxlbWVudGFyeSZxdW90Oy4KLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKiBUaGUgJnF1b3Q7Q3lyaWxsaWMgU3VwcGxlbWVudCZxdW90OyBVbmljb2RlIEJsb2NrLiBQcmV2aW91c2x5CisgICAgICAgICAqIHJlZmVycmVkIHRvIGFzICZxdW90O0N5cmlsbGljIFN1cHBsZW1lbnRhcnkmcXVvdDsuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIENZUklMTElDX1NVUFBMRU1FTlRBUlkgPSBuZXcgVW5pY29kZUJsb2NrKCJDWVJJTExJQ19TVVBQTEVNRU5UQVJZIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7QXJtZW5pYW4mcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBBUk1FTklBTiA9IG5ldyBVbmljb2RlQmxvY2soIkFSTUVOSUFOIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7SGVicmV3JnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgSEVCUkVXID0gbmV3IFVuaWNvZGVCbG9jaygiSEVCUkVXIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7QXJhYmljJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQVJBQklDID0gbmV3IFVuaWNvZGVCbG9jaygiQVJBQklDIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7U3lyaWFjJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS40CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1lSSUFDID0gbmV3IFVuaWNvZGVCbG9jaygiU1lSSUFDIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGhhYW5hJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS40CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgVEhBQU5BID0gbmV3IFVuaWNvZGVCbG9jaygiVEhBQU5BIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7RGV2YW5hZ2FyaSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIERFVkFOQUdBUkkgPSBuZXcgVW5pY29kZUJsb2NrKCJERVZBTkFHQVJJIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7QmVuZ2FsaSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEJFTkdBTEkgPSBuZXcgVW5pY29kZUJsb2NrKCJCRU5HQUxJIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7R3VybXVraGkmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBHVVJNVUtISSA9IG5ldyBVbmljb2RlQmxvY2soIkdVUk1VS0hJIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7R3VqYXJhdGkmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBHVUpBUkFUSSA9IG5ldyBVbmljb2RlQmxvY2soIkdVSkFSQVRJIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7T3JpeWEmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBPUklZQSA9IG5ldyBVbmljb2RlQmxvY2soIk9SSVlBIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGFtaWwmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBUQU1JTCA9IG5ldyBVbmljb2RlQmxvY2soIlRBTUlMIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGVsdWd1JnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgVEVMVUdVID0gbmV3IFVuaWNvZGVCbG9jaygiVEVMVUdVIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7S2FubmFkYSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEtBTk5BREEgPSBuZXcgVW5pY29kZUJsb2NrKCJLQU5OQURBIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TWFsYXlhbGFtJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgTUFMQVlBTEFNID0gbmV3IFVuaWNvZGVCbG9jaygiTUFMQVlBTEFNIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7U2luaGFsYSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNAorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFNJTkhBTEEgPSBuZXcgVW5pY29kZUJsb2NrKCJTSU5IQUxBIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGhhaSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFRIQUkgPSBuZXcgVW5pY29kZUJsb2NrKCJUSEFJIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TGFvJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgTEFPID0gbmV3IFVuaWNvZGVCbG9jaygiTEFPIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGliZXRhbiZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFRJQkVUQU4gPSBuZXcgVW5pY29kZUJsb2NrKCJUSUJFVEFOIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TXlhbm1hciZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNAorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIE1ZQU5NQVIgPSBuZXcgVW5pY29kZUJsb2NrKCJNWUFOTUFSIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7R2VvcmdpYW4mcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBHRU9SR0lBTiA9IG5ldyBVbmljb2RlQmxvY2soIkdFT1JHSUFOIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7SGFuZ3VsIEphbW8mcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBIQU5HVUxfSkFNTyA9IG5ldyBVbmljb2RlQmxvY2soIkhBTkdVTF9KQU1PIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7RXRoaW9waWMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBFVEhJT1BJQyA9IG5ldyBVbmljb2RlQmxvY2soIkVUSElPUElDIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7Q2hlcm9rZWUmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBDSEVST0tFRSA9IG5ldyBVbmljb2RlQmxvY2soIkNIRVJPS0VFIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNAorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFVOSUZJRURfQ0FOQURJQU5fQUJPUklHSU5BTF9TWUxMQUJJQ1MgPSBuZXcgVW5pY29kZUJsb2NrKCJVTklGSUVEX0NBTkFESUFOX0FCT1JJR0lOQUxfU1lMTEFCSUNTIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7T2doYW0mcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBPR0hBTSA9IG5ldyBVbmljb2RlQmxvY2soIk9HSEFNIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7UnVuaWMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBSVU5JQyA9IG5ldyBVbmljb2RlQmxvY2soIlJVTklDIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGFnYWxvZyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFRBR0FMT0cgPSBuZXcgVW5pY29kZUJsb2NrKCJUQUdBTE9HIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7SGFudW5vbyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEhBTlVOT08gPSBuZXcgVW5pY29kZUJsb2NrKCJIQU5VTk9PIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7QnVoaWQmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBCVUhJRCA9IG5ldyBVbmljb2RlQmxvY2soIkJVSElEIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGFnYmFud2EmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBUQUdCQU5XQSA9IG5ldyBVbmljb2RlQmxvY2soIlRBR0JBTldBIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7S2htZXImcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBLSE1FUiA9IG5ldyBVbmljb2RlQmxvY2soIktITUVSIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TW9uZ29saWFuJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS40CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgTU9OR09MSUFOID0gbmV3IFVuaWNvZGVCbG9jaygiTU9OR09MSUFOIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TGltYnUmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBMSU1CVSA9IG5ldyBVbmljb2RlQmxvY2soIkxJTUJVIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7VGFpIExlJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgVEFJX0xFID0gbmV3IFVuaWNvZGVCbG9jaygiVEFJX0xFIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7S2htZXIgU3ltYm9scyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEtITUVSX1NZTUJPTFMgPSBuZXcgVW5pY29kZUJsb2NrKCJLSE1FUl9TWU1CT0xTIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7UGhvbmV0aWMgRXh0ZW5zaW9ucyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFBIT05FVElDX0VYVEVOU0lPTlMgPSBuZXcgVW5pY29kZUJsb2NrKCJQSE9ORVRJQ19FWFRFTlNJT05TIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7TGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIExBVElOX0VYVEVOREVEX0FERElUSU9OQUwgPSBuZXcgVW5pY29kZUJsb2NrKCJMQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7R3JlZWsgRXh0ZW5kZWQmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBHUkVFS19FWFRFTkRFRCA9IG5ldyBVbmljb2RlQmxvY2soIkdSRUVLX0VYVEVOREVEIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7R2VuZXJhbCBQdW5jdHVhdGlvbiZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEdFTkVSQUxfUFVOQ1RVQVRJT04gPSBuZXcgVW5pY29kZUJsb2NrKCJHRU5FUkFMX1BVTkNUVUFUSU9OIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7U3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1VQRVJTQ1JJUFRTX0FORF9TVUJTQ1JJUFRTID0gbmV3IFVuaWNvZGVCbG9jaygiU1VQRVJTQ1JJUFRTX0FORF9TVUJTQ1JJUFRTIik7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgJnF1b3Q7Q3VycmVuY3kgU3ltYm9scyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIENVUlJFTkNZX1NZTUJPTFMgPSBuZXcgVW5pY29kZUJsb2NrKCJDVVJSRU5DWV9TWU1CT0xTIik7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgJnF1b3Q7Q29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIGZvciBTeW1ib2xzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIFByZXZpb3VzbHkgcmVmZXJyZWQgdG8gYXMgJnF1b3Q7Q29tYmluaW5nIE1hcmtzIGZvciBTeW1ib2xzJnF1b3Q7LgotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqIFRoZSAmcXVvdDtDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgZm9yIFN5bWJvbHMmcXVvdDsgVW5pY29kZQorICAgICAgICAgKiBCbG9jay4gUHJldmlvdXNseSByZWZlcnJlZCB0byBhcyAmcXVvdDtDb21iaW5pbmcgTWFya3MgZm9yCisgICAgICAgICAqIFN5bWJvbHMmcXVvdDsuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIENPTUJJTklOR19NQVJLU19GT1JfU1lNQk9MUyA9IG5ldyBVbmljb2RlQmxvY2soIkNPTUJJTklOR19NQVJLU19GT1JfU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0xldHRlcmxpa2UgU3ltYm9scyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIExFVFRFUkxJS0VfU1lNQk9MUyA9IG5ldyBVbmljb2RlQmxvY2soIkxFVFRFUkxJS0VfU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O051bWJlciBGb3JtcyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIE5VTUJFUl9GT1JNUyA9IG5ldyBVbmljb2RlQmxvY2soIk5VTUJFUl9GT1JNUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0Fycm93cyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEFSUk9XUyA9IG5ldyBVbmljb2RlQmxvY2soIkFSUk9XUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O01hdGhlbWF0aWNhbCBPcGVyYXRvcnMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBNQVRIRU1BVElDQUxfT1BFUkFUT1JTID0gbmV3IFVuaWNvZGVCbG9jaygiTUFUSEVNQVRJQ0FMX09QRVJBVE9SUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgTUlTQ0VMTEFORU9VU19URUNITklDQUwgPSBuZXcgVW5pY29kZUJsb2NrKCJNSVNDRUxMQU5FT1VTX1RFQ0hOSUNBTCIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NvbnRyb2wgUGljdHVyZXMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBDT05UUk9MX1BJQ1RVUkVTID0gbmV3IFVuaWNvZGVCbG9jaygiQ09OVFJPTF9QSUNUVVJFUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O09wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgT1BUSUNBTF9DSEFSQUNURVJfUkVDT0dOSVRJT04gPSBuZXcgVW5pY29kZUJsb2NrKCJPUFRJQ0FMX0NIQVJBQ1RFUl9SRUNPR05JVElPTiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0VuY2xvc2VkIEFscGhhbnVtZXJpY3MmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBFTkNMT1NFRF9BTFBIQU5VTUVSSUNTID0gbmV3IFVuaWNvZGVCbG9jaygiRU5DTE9TRURfQUxQSEFOVU1FUklDUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0JveCBEcmF3aW5nJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQk9YX0RSQVdJTkcgPSBuZXcgVW5pY29kZUJsb2NrKCJCT1hfRFJBV0lORyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0Jsb2NrIEVsZW1lbnRzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQkxPQ0tfRUxFTUVOVFMgPSBuZXcgVW5pY29kZUJsb2NrKCJCTE9DS19FTEVNRU5UUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0dlb21ldHJpYyBTaGFwZXMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBHRU9NRVRSSUNfU0hBUEVTID0gbmV3IFVuaWNvZGVCbG9jaygiR0VPTUVUUklDX1NIQVBFUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O01pc2NlbGxhbmVvdXMgU3ltYm9scyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIE1JU0NFTExBTkVPVVNfU1lNQk9MUyA9IG5ldyBVbmljb2RlQmxvY2soIk1JU0NFTExBTkVPVVNfU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0RpbmdiYXRzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgRElOR0JBVFMgPSBuZXcgVW5pY29kZUJsb2NrKCJESU5HQkFUUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O01pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIE1JU0NFTExBTkVPVVNfTUFUSEVNQVRJQ0FMX1NZTUJPTFNfQSA9IG5ldyBVbmljb2RlQmxvY2soIk1JU0NFTExBTkVPVVNfTUFUSEVNQVRJQ0FMX1NZTUJPTFNfQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1N1cHBsZW1lbnRhbCBBcnJvd3MtQSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFNVUFBMRU1FTlRBTF9BUlJPV1NfQSA9IG5ldyBVbmljb2RlQmxvY2soIlNVUFBMRU1FTlRBTF9BUlJPV1NfQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0JyYWlsbGUgUGF0dGVybnMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBCUkFJTExFX1BBVFRFUk5TID0gbmV3IFVuaWNvZGVCbG9jaygiQlJBSUxMRV9QQVRURVJOUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1N1cHBsZW1lbnRhbCBBcnJvd3MtQiZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFNVUFBMRU1FTlRBTF9BUlJPV1NfQiA9IG5ldyBVbmljb2RlQmxvY2soIlNVUFBMRU1FTlRBTF9BUlJPV1NfQiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O01pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQiZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIE1JU0NFTExBTkVPVVNfTUFUSEVNQVRJQ0FMX1NZTUJPTFNfQiA9IG5ldyBVbmljb2RlQmxvY2soIk1JU0NFTExBTkVPVVNfTUFUSEVNQVRJQ0FMX1NZTUJPTFNfQiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1N1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1VQUExFTUVOVEFMX01BVEhFTUFUSUNBTF9PUEVSQVRPUlMgPSBuZXcgVW5pY29kZUJsb2NrKCJTVVBQTEVNRU5UQUxfTUFUSEVNQVRJQ0FMX09QRVJBVE9SUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O01pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgTUlTQ0VMTEFORU9VU19TWU1CT0xTX0FORF9BUlJPV1MgPSBuZXcgVW5pY29kZUJsb2NrKCJNSVNDRUxMQU5FT1VTX1NZTUJPTFNfQU5EX0FSUk9XUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBSYWRpY2FscyBTdXBwbGVtZW50JnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS40CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQ0pLX1JBRElDQUxTX1NVUFBMRU1FTlQgPSBuZXcgVW5pY29kZUJsb2NrKCJDSktfUkFESUNBTFNfU1VQUExFTUVOVCIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0thbmd4aSBSYWRpY2FscyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNAorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEtBTkdYSV9SQURJQ0FMUyA9IG5ldyBVbmljb2RlQmxvY2soIktBTkdYSV9SQURJQ0FMUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0lkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBJREVPR1JBUEhJQ19ERVNDUklQVElPTl9DSEFSQUNURVJTID0gbmV3IFVuaWNvZGVCbG9jaygiSURFT0dSQVBISUNfREVTQ1JJUFRJT05fQ0hBUkFDVEVSUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIENKS19TWU1CT0xTX0FORF9QVU5DVFVBVElPTiA9IG5ldyBVbmljb2RlQmxvY2soIkNKS19TWU1CT0xTX0FORF9QVU5DVFVBVElPTiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0hpcmFnYW5hJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgSElSQUdBTkEgPSBuZXcgVW5pY29kZUJsb2NrKCJISVJBR0FOQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0thdGFrYW5hJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgS0FUQUtBTkEgPSBuZXcgVW5pY29kZUJsb2NrKCJLQVRBS0FOQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0JvcG9tb2ZvJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQk9QT01PRk8gPSBuZXcgVW5pY29kZUJsb2NrKCJCT1BPTU9GTyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0hhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8mcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBIQU5HVUxfQ09NUEFUSUJJTElUWV9KQU1PID0gbmV3IFVuaWNvZGVCbG9jaygiSEFOR1VMX0NPTVBBVElCSUxJVFlfSkFNTyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0thbmJ1biZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEtBTkJVTiA9IG5ldyBVbmljb2RlQmxvY2soIktBTkJVTiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0JvcG9tb2ZvIEV4dGVuZGVkJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS40CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQk9QT01PRk9fRVhURU5ERUQgPSBuZXcgVW5pY29kZUJsb2NrKCJCT1BPTU9GT19FWFRFTkRFRCIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0thdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBLQVRBS0FOQV9QSE9ORVRJQ19FWFRFTlNJT05TID0gbmV3IFVuaWNvZGVCbG9jaygiS0FUQUtBTkFfUEhPTkVUSUNfRVhURU5TSU9OUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBFTkNMT1NFRF9DSktfTEVUVEVSU19BTkRfTU9OVEhTID0gbmV3IFVuaWNvZGVCbG9jaygiRU5DTE9TRURfQ0pLX0xFVFRFUlNfQU5EX01PTlRIUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBDb21wYXRpYmlsaXR5JnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQ0pLX0NPTVBBVElCSUxJVFkgPSBuZXcgVW5pY29kZUJsb2NrKCJDSktfQ09NUEFUSUJJTElUWSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBDSktfVU5JRklFRF9JREVPR1JBUEhTX0VYVEVOU0lPTl9BID0gbmV3IFVuaWNvZGVCbG9jaygiQ0pLX1VOSUZJRURfSURFT0dSQVBIU19FWFRFTlNJT05fQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgWUlKSU5HX0hFWEFHUkFNX1NZTUJPTFMgPSBuZXcgVW5pY29kZUJsb2NrKCJZSUpJTkdfSEVYQUdSQU1fU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBVbmlmaWVkIElkZW9ncmFwaHMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBDSktfVU5JRklFRF9JREVPR1JBUEhTID0gbmV3IFVuaWNvZGVCbG9jaygiQ0pLX1VOSUZJRURfSURFT0dSQVBIUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1lpIFN5bGxhYmxlcyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNAorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFlJX1NZTExBQkxFUyA9IG5ldyBVbmljb2RlQmxvY2soIllJX1NZTExBQkxFUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1lpIFJhZGljYWxzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS40CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgWUlfUkFESUNBTFMgPSBuZXcgVW5pY29kZUJsb2NrKCJZSV9SQURJQ0FMUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0hhbmd1bCBTeWxsYWJsZXMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBIQU5HVUxfU1lMTEFCTEVTID0gbmV3IFVuaWNvZGVCbG9jaygiSEFOR1VMX1NZTExBQkxFUyIpOwogICAgICAgICAvKioKLSAgICAgICAgICogVGhlICZxdW90O0hpZ2ggU3Vycm9nYXRlcyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogVGhpcyBibG9jayByZXByZXNlbnRzIGNvZGUgcG9pbnQgdmFsdWVzIGluIHRoZSBoaWdoIHN1cnJvZ2F0ZSByYW5nZSAweEQ4MDAgdG8gMHhEQjdGIEBzaW5jZSAxLjUKKyAgICAgICAgICogVGhlICZxdW90O0hpZ2ggU3Vycm9nYXRlcyZxdW90OyBVbmljb2RlIEJsb2NrLiBUaGlzIGJsb2NrIHJlcHJlc2VudHMKKyAgICAgICAgICogY29kZSBwb2ludCB2YWx1ZXMgaW4gdGhlIGhpZ2ggc3Vycm9nYXRlIHJhbmdlIDB4RDgwMCB0byAweERCN0YKKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgSElHSF9TVVJST0dBVEVTID0gbmV3IFVuaWNvZGVCbG9jaygiSElHSF9TVVJST0dBVEVTIik7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgJnF1b3Q7SGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBUaGlzIGJsb2NrIHJlcHJlc2VudHMgY29kZSBwb2ludCB2YWx1ZXMgaW4gdGhlIGhpZ2ggc3Vycm9nYXRlIHJhbmdlIDB4REI4MCB0byAweERCRkYgQHNpbmNlIDEuNQorICAgICAgICAgKiBUaGUgJnF1b3Q7SGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIFRoaXMgYmxvY2sKKyAgICAgICAgICogcmVwcmVzZW50cyBjb2RlIHBvaW50IHZhbHVlcyBpbiB0aGUgaGlnaCBzdXJyb2dhdGUgcmFuZ2UgMHhEQjgwIHRvCisgICAgICAgICAqIDB4REJGRgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBISUdIX1BSSVZBVEVfVVNFX1NVUlJPR0FURVMgPSBuZXcgVW5pY29kZUJsb2NrKCJISUdIX1BSSVZBVEVfVVNFX1NVUlJPR0FURVMiKTsKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSAmcXVvdDtMb3cgU3Vycm9nYXRlcyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogVGhpcyBibG9jayByZXByZXNlbnRzIGNvZGUgcG9pbnQgdmFsdWVzIGluIHRoZSBsb3cgc3Vycm9nYXRlIHJhbmdlIDB4REMwMCB0byAweERGRkYgQHNpbmNlIDEuNQorICAgICAgICAgKiBUaGUgJnF1b3Q7TG93IFN1cnJvZ2F0ZXMmcXVvdDsgVW5pY29kZSBCbG9jay4gVGhpcyBibG9jayByZXByZXNlbnRzCisgICAgICAgICAqIGNvZGUgcG9pbnQgdmFsdWVzIGluIHRoZSBsb3cgc3Vycm9nYXRlIHJhbmdlIDB4REMwMCB0byAweERGRkYKKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgTE9XX1NVUlJPR0FURVMgPSBuZXcgVW5pY29kZUJsb2NrKCJMT1dfU1VSUk9HQVRFUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1ByaXZhdGUgVXNlIEFyZWEmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBQUklWQVRFX1VTRV9BUkVBID0gbmV3IFVuaWNvZGVCbG9jaygiUFJJVkFURV9VU0VfQVJFQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBDSktfQ09NUEFUSUJJTElUWV9JREVPR1JBUEhTID0gbmV3IFVuaWNvZGVCbG9jaygiQ0pLX0NPTVBBVElCSUxJVFlfSURFT0dSQVBIUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0FscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQUxQSEFCRVRJQ19QUkVTRU5UQVRJT05fRk9STVMgPSBuZXcgVW5pY29kZUJsb2NrKCJBTFBIQUJFVElDX1BSRVNFTlRBVElPTl9GT1JNUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEFSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQSA9IG5ldyBVbmljb2RlQmxvY2soIkFSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1ZhcmlhdGlvbiBTZWxlY3RvcnMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBWQVJJQVRJT05fU0VMRUNUT1JTID0gbmV3IFVuaWNvZGVCbG9jaygiVkFSSUFUSU9OX1NFTEVDVE9SUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NvbWJpbmluZyBIYWxmIE1hcmtzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQ09NQklOSU5HX0hBTEZfTUFSS1MgPSBuZXcgVW5pY29kZUJsb2NrKCJDT01CSU5JTkdfSEFMRl9NQVJLUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQ0pLX0NPTVBBVElCSUxJVFlfRk9STVMgPSBuZXcgVW5pY29kZUJsb2NrKCJDSktfQ09NUEFUSUJJTElUWV9GT1JNUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1NtYWxsIEZvcm0gVmFyaWFudHMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjIKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBTTUFMTF9GT1JNX1ZBUklBTlRTID0gbmV3IFVuaWNvZGVCbG9jaygiU01BTExfRk9STV9WQVJJQU5UUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEFSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQiA9IG5ldyBVbmljb2RlQmxvY2soIkFSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgSEFMRldJRFRIX0FORF9GVUxMV0lEVEhfRk9STVMgPSBuZXcgVW5pY29kZUJsb2NrKCJIQUxGV0lEVEhfQU5EX0ZVTExXSURUSF9GT1JNUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1NwZWNpYWxzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS4yCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1BFQ0lBTFMgPSBuZXcgVW5pY29kZUJsb2NrKCJTUEVDSUFMUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0xpbmVhciBCIFN5bGxhYmFyeSZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuMgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIExJTkVBUl9CX1NZTExBQkFSWSA9IG5ldyBVbmljb2RlQmxvY2soIkxJTkVBUl9CX1NZTExBQkFSWSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0xpbmVhciBCIElkZW9ncmFtcyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIExJTkVBUl9CX0lERU9HUkFNUyA9IG5ldyBVbmljb2RlQmxvY2soIkxJTkVBUl9CX0lERU9HUkFNUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0FlZ2VhbiBOdW1iZXJzJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQUVHRUFOX05VTUJFUlMgPSBuZXcgVW5pY29kZUJsb2NrKCJBRUdFQU5fTlVNQkVSUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O09sZCBJdGFsaWMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBPTERfSVRBTElDID0gbmV3IFVuaWNvZGVCbG9jaygiT0xEX0lUQUxJQyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0dvdGhpYyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIEdPVEhJQyA9IG5ldyBVbmljb2RlQmxvY2soIkdPVEhJQyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1VnYXJpdGljJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgVUdBUklUSUMgPSBuZXcgVW5pY29kZUJsb2NrKCJVR0FSSVRJQyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0Rlc2VyZXQmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBERVNFUkVUID0gbmV3IFVuaWNvZGVCbG9jaygiREVTRVJFVCIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1NoYXZpYW4mcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBTSEFWSUFOID0gbmV3IFVuaWNvZGVCbG9jaygiU0hBVklBTiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O09zbWFueWEmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBPU01BTllBID0gbmV3IFVuaWNvZGVCbG9jaygiT1NNQU5ZQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0N5cHJpb3QgU3lsbGFiYXJ5JnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgQ1lQUklPVF9TWUxMQUJBUlkgPSBuZXcgVW5pY29kZUJsb2NrKCJDWVBSSU9UX1NZTExBQkFSWSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0J5emFudGluZSBNdXNpY2FsIFN5bWJvbHMmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBCWVpBTlRJTkVfTVVTSUNBTF9TWU1CT0xTID0gbmV3IFVuaWNvZGVCbG9jaygiQllaQU5USU5FX01VU0lDQUxfU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O011c2ljYWwgU3ltYm9scyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIE1VU0lDQUxfU1lNQk9MUyA9IG5ldyBVbmljb2RlQmxvY2soIk1VU0lDQUxfU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1RhaSBYdWFuIEppbmcgU3ltYm9scyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFRBSV9YVUFOX0pJTkdfU1lNQk9MUyA9IG5ldyBVbmljb2RlQmxvY2soIlRBSV9YVUFOX0pJTkdfU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O01hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scyZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIE1BVEhFTUFUSUNBTF9BTFBIQU5VTUVSSUNfU1lNQk9MUyA9IG5ldyBVbmljb2RlQmxvY2soIk1BVEhFTUFUSUNBTF9BTFBIQU5VTUVSSUNfU1lNQk9MUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEImcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBDSktfVU5JRklFRF9JREVPR1JBUEhTX0VYVEVOU0lPTl9CID0gbmV3IFVuaWNvZGVCbG9jaygiQ0pLX1VOSUZJRURfSURFT0dSQVBIU19FWFRFTlNJT05fQiIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIENKS19DT01QQVRJQklMSVRZX0lERU9HUkFQSFNfU1VQUExFTUVOVCA9IG5ldyBVbmljb2RlQmxvY2soIkNKS19DT01QQVRJQklMSVRZX0lERU9HUkFQSFNfU1VQUExFTUVOVCIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1RhZ3MmcXVvdDsgVW5pY29kZSBCbG9jay4gCi0gICAgICAgICAqIEBzaW5jZSAxLjUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBUQUdTID0gbmV3IFVuaWNvZGVCbG9jaygiVEFHUyIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1ZhcmlhdGlvbiBTZWxlY3RvcnMgU3VwcGxlbWVudCZxdW90OyBVbmljb2RlIEJsb2NrLiAKLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5pY29kZUJsb2NrIFZBUklBVElPTl9TRUxFQ1RPUlNfU1VQUExFTUVOVCA9IG5ldyBVbmljb2RlQmxvY2soIlZBUklBVElPTl9TRUxFQ1RPUlNfU1VQUExFTUVOVCIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1N1cHBsZW1lbnRhcnkgUHJpdmF0ZSBVc2UgQXJlYS1BJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1VQUExFTUVOVEFSWV9QUklWQVRFX1VTRV9BUkVBX0EgPSBuZXcgVW5pY29kZUJsb2NrKCJTVVBQTEVNRU5UQVJZX1BSSVZBVEVfVVNFX0FSRUFfQSIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlICZxdW90O1N1cHBsZW1lbnRhcnkgUHJpdmF0ZSBVc2UgQXJlYS1CJnF1b3Q7IFVuaWNvZGUgQmxvY2suIAotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmljb2RlQmxvY2sgU1VQUExFTUVOVEFSWV9QUklWQVRFX1VTRV9BUkVBX0IgPSBuZXcgVW5pY29kZUJsb2NrKCJTVVBQTEVNRU5UQVJZX1BSSVZBVEVfVVNFX0FSRUFfQiIpOwogCkBAIC0xMTk2LDExICsxNDA5LDkgQEAKICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAKICAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnN0YW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJsb2NrIG5hbWUgZ2l2ZW4uIFRoZQotICAgICAgICAgKiBibG9jayBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgVW5pY29kZSA0LjAuMSBzcGVjaWZpY2F0aW9uIGluIHRoZQotICAgICAgICAgKiA8Y29kZT5CbG9ja3MtNC4wLjEudHh0PC9jb2RlPiBmaWxlLgotICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIFJldHJpZXZlcyB0aGUgY29uc3RhbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3BlY2lmaWVkIGJsb2NrIG5hbWUuCisgICAgICAgICAqIFRoZSBibG9jayBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgVW5pY29kZSA0LjAuMSBzcGVjaWZpY2F0aW9uIGluIHRoZQorICAgICAgICAgKiB7QGNvZGUgQmxvY2tzLTQuMC4xLnR4dH0gZmlsZS4KICAgICAgICAgICogPHA+CiAgICAgICAgICAqIEJsb2NrIG5hbWVzIG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKICAgICAgICAgICogPC9wPgpAQCAtMTIwOSwyMCArMTQyMCwyMiBAQAogICAgICAgICAgKiBjYXNlLWluc2Vuc2l0aXZlLjwvbGk+CiAgICAgICAgICAqIDxsaT5DYW5vbmljYWwgYmxvY2sgbmFtZSB3aXRob3V0IGFueSBzcGFjZXMsIGFzIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAqIFVuaWNvZGUgc3BlY2lmaWNhdGlvbjsgY2FzZS1pbnNlbnNpdGl2ZS48L2xpPgotICAgICAgICAgKiA8bGk+PGNvZGU+VW5pY29kZUJsb2NrPC9jb2RlPiBjb25zdGFudCBpZGVudGlmaWVyLiBUaGlzIGlzCi0gICAgICAgICAqIGRldGVybWluZWQgYnkgdXBwZXJjYXNpbmcgdGhlIGNhbm9uaWNhbCBuYW1lIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlcwotICAgICAgICAgKiBhbmQgaHlwaGVucyB3aXRoIHVuZGVyc2NvcmVzLjwvbGk+CisgICAgICAgICAqIDxsaT57QGNvZGUgVW5pY29kZUJsb2NrfSBjb25zdGFudCBpZGVudGlmaWVyLiBUaGlzIGlzIGRldGVybWluZWQgYnkKKyAgICAgICAgICogdXBwZXJjYXNpbmcgdGhlIGNhbm9uaWNhbCBuYW1lIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlcyBhbmQgaHlwaGVucworICAgICAgICAgKiB3aXRoIHVuZGVyc2NvcmVzLjwvbGk+CiAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gYmxvY2tOYW1lIFRoZSBuYW1lIG9mIHRoZSBibG9jayB0byByZXRyaWV2ZS4KLSAgICAgICAgICogQHJldHVybiBBIFVuaWNvZGVCbG9jayBjb25zdGFudC4KLSAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5ibG9ja05hbWU8L2NvZGU+IGlzCi0gICAgICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmJsb2NrTmFtZTwvY29kZT4gaXMgbm90IGEKLSAgICAgICAgICogICAgICAgICB2YWxpZCBibG9jayBuYW1lLgotICAgICAgICAgKiBAc2luY2UgMS41CisgICAgICAgICAqIEBwYXJhbSBibG9ja05hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYmxvY2sgdG8gcmV0cmlldmUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGVCbG9jayBjb25zdGFudCBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBibG9ja05hbWV9LgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYmxvY2tOYW1lfSBpcyBub3QgYSB2YWxpZCBibG9jayBuYW1lLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVW5pY29kZUJsb2NrIGZvck5hbWUoU3RyaW5nIGJsb2NrTmFtZSkgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaWNvZGVCbG9jayBmb3JOYW1lKFN0cmluZyBibG9ja05hbWUpIHsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIGdldCBjbG9zZXIgdG8gdGhlIFJJIHdoaWNoIGRlZmluZXMgdGhpcyBhcyBmaW5hbC4KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgICAgIGlmIChibG9ja05hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQpAQCAtMTI0OCwzMCArMTQ2MSwzNCBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvKioKLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFJldHJpZXZlcyB0aGUgY29uc3RhbnQgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gPGNvZGU+Y2hhcjwvY29kZT4gb3IKLSAgICAgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLSAgICAgICAgICogPC9wPgorICAgICAgICAgKiBHZXRzIHRoZSBjb25zdGFudCBmb3IgdGhlIFVuaWNvZGUgYmxvY2sgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqIGNoYXJhY3Rlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gcmV0cmlldmUgYSBVbmljb2RlQmxvY2sgZm9yLgotICAgICAgICAgKiBAcmV0dXJuIEEgVW5pY29kZUJsb2NrIGNvbnN0YW50IG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gYworICAgICAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIHRvIGdldCB0aGUge0Bjb2RlIFVuaWNvZGVCbG9ja30KKyAgICAgICAgICogICAgICAgICAgICBjb25zdGFudC4KKyAgICAgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFVuaWNvZGVCbG9ja30gY29uc3RhbnQgZm9yIHRoZSBibG9jayB0aGF0IGNvbnRhaW5zCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGN9LCBvciB7QGNvZGUgbnVsbH0gaWYge0Bjb2RlIGN9IGRvZXMgbm90IGJlbG9uZyB0bworICAgICAgICAgKiAgICAgICAgIGFueSBkZWZpbmVkIGJsb2NrLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5pY29kZUJsb2NrIG9mKGNoYXIgYykgewogICAgICAgICAgICAgcmV0dXJuIG9mKChpbnQpIGMpOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvKioKLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFJldHJpZXZlcyB0aGUgY29uc3RhbnQgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlIHBvaW50IG9yCi0gICAgICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCi0gICAgICAgICAqIDwvcD4KKyAgICAgICAgICogR2V0cyB0aGUgY29uc3RhbnQgZm9yIHRoZSBVbmljb2RlIGJsb2NrIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBVbmljb2RlIGNvZGUgcG9pbnQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gY29kZVBvaW50IFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gcmV0cmlldmUgYSBVbmljb2RlQmxvY2sKLSAgICAgICAgICogICAgICAgIGZvci4KLSAgICAgICAgICogQHJldHVybiBBIFVuaWNvZGVCbG9jayBjb25zdGFudCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+Y29kZVBvaW50PC9jb2RlPiBpcyBub3QgYQotICAgICAgICAgKiAgICAgICAgIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludC4KLSAgICAgICAgICogQHNpbmNlIDEuNQorICAgICAgICAgKiBAcGFyYW0gY29kZVBvaW50CisgICAgICAgICAqICAgICAgICAgICAgdGhlIFVuaWNvZGUgY29kZSBwb2ludCBmb3Igd2hpY2ggdG8gZ2V0IHRoZQorICAgICAgICAgKiAgICAgICAgICAgIHtAY29kZSBVbmljb2RlQmxvY2t9IGNvbnN0YW50LgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgVW5pY29kZUJsb2NrfSBjb25zdGFudCBmb3IgdGhlIGJsb2NrIHRoYXQgY29udGFpbnMKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgY29kZVBvaW50fSwgb3Ige0Bjb2RlIG51bGx9IGlmIHtAY29kZSBjb2RlUG9pbnR9IGRvZXMKKyAgICAgICAgICogICAgICAgICBub3QgYmVsb25nIHRvIGFueSBkZWZpbmVkIGJsb2NrLgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBVbmljb2RlQmxvY2sgb2YoaW50IGNvZGVQb2ludCkgewogICAgICAgICAgICAgaWYgKCFpc1ZhbGlkQ29kZVBvaW50KGNvZGVQb2ludCkpIHsKQEAgLTEyOTcsNTIgKzE1MTQsNTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aGljaCByZXByZXNlbnRzIHRoZSBjaGFyCi0gICAgICogdmFsdWVkIGFyZ3VtZW50LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIENoYXJhY3Rlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBjaGFyCisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgY2hhciB0byBzdG9yZSBpbiB0aGUgbmV3IGluc3RhbmNlLgorICAgICAqICAgICAgICAgICAgdGhlIHByaW1pdGl2ZSBjaGFyIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBuZXcgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoYXJhY3RlcihjaGFyIHZhbHVlKSB7CiAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzLgorICAgICAqIEdldHMgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiB0aGlzIGNoYXJhY3Rlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNoYXIgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlcgorICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QncyBwcmltaXRpdmUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHJlY2VpdmVyIHRvIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVyIHRvIGRldGVybWluZSB0aGUKLSAgICAgKiByZWxhdGl2ZSBvcmRlcmluZy4KKyAgICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBvYmplY3QgdG8gZGV0ZXJtaW5lIHRoZWlyCisgICAgICogcmVsYXRpdmUgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIGFuIGludCA8IDAgaWYgdGhpcyBDaGFyYWN0ZXIgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgIENoYXJhY3RlciwgMCBpZiB0aGV5IGFyZSBlcXVhbCwgYW5kID4gMCBpZiB0aGlzIENoYXJhY3RlciBpcwotICAgICAqICAgICAgICAgZ3JlYXRlcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5jPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS4yCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIG9iamVjdCB0byBjb21wYXJlIHRoaXMgb2JqZWN0IHRvLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIDB9IGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGNoYXJhY3RlciBhbmQgdGhlIHZhbHVlIG9mCisgICAgICogICAgICAgICB7QGNvZGUgY30gYXJlIGVxdWFsOyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzCisgICAgICogICAgICAgICBjaGFyYWN0ZXIgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiB7QGNvZGUgY307IGEgbmVnYXRpdmUKKyAgICAgKiAgICAgICAgIHZhbHVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGNoYXJhY3RlciBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mCisgICAgICogICAgICAgICB7QGNvZGUgY30uCisgICAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENoYXJhY3RlciBjKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZSAtIGMudmFsdWU7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgYSA8Y29kZT5DaGFyYWN0ZXI8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgPGNvZGU+Y2hhcjwvY29kZT4KLSAgICAgKiB2YWx1ZSBwYXNzZWQuIFRoaXMgbWV0aG9kIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBjb25zdHJ1Y3RvciwgYXMgdGhpcwotICAgICAqIG1ldGhvZCBtYXkgbWFpbnRhaW4gYSBjYWNoZSBvZiBpbnN0YW5jZXMuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgQ2hhcmFjdGVyfSBpbnN0YW5jZSBmb3IgdGhlIHtAY29kZSBjaGFyfSB2YWx1ZSBwYXNzZWQuCisgICAgICogRm9yIEFTQ0lJL0xhdGluLTEgY2hhcmFjdGVycyAoYW5kIGdlbmVyYWxseSBhbGwgY2hhcmFjdGVycyB3aXRoIGEgVW5pY29kZQorICAgICAqIHZhbHVlIHVwIHRvIDUxMiksIHRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yLAorICAgICAqIGFzIGl0IG1haW50YWlucyBhIGNhY2hlIG9mIGNvcnJlc3BvbmRpbmcge0Bjb2RlIENoYXJhY3Rlcn0gaW5zdGFuY2VzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyIHZhbHVlLgotICAgICAqIEByZXR1cm4gQSA8Y29kZT5DaGFyYWN0ZXI8L2NvZGU+IGluc3RhbmNlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgdmFsdWUgZm9yIHdoaWNoIHRvIGdldCBhIHtAY29kZSBDaGFyYWN0ZXJ9IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDaGFyYWN0ZXJ9IGluc3RhbmNlIGZvciB7QGNvZGUgY30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDaGFyYWN0ZXIgdmFsdWVPZihjaGFyIGMpIHsKICAgICAgICAgaWYgKGMgPj0gQ0FDSEVfTEVOICkgewpAQCAtMTM2OCwxMTYgKzE1ODgsMTEzIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB0ZXN0IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgPGNvZGU+Y29kZVBvaW50PC9jb2RlPiBpcyBhIHZhbGlkIFVuaWNvZGUKLSAgICAgKiBjb2RlIHBvaW50LgotICAgICAqIDwvcD4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB7QGNvZGUgY29kZVBvaW50fSBpcyBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29kZVBvaW50IFRoZSBjb2RlIHBvaW50IHRvIHRlc3QuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHBvaW50IHRvIHRlc3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQ7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENvZGVQb2ludChpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiAoTUlOX0NPREVfUE9JTlQgPD0gY29kZVBvaW50ICYmIE1BWF9DT0RFX1BPSU5UID49IGNvZGVQb2ludCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB0ZXN0IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgPGNvZGU+Y29kZVBvaW50PC9jb2RlPiBpcyB3aXRoaW4gdGhlCi0gICAgICogc3VwcGxlbWVudGFyeSBjb2RlIHBvaW50IHJhbmdlLgotICAgICAqIDwvcD4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB7QGNvZGUgY29kZVBvaW50fSBpcyB3aXRoaW4gdGhlIHN1cHBsZW1lbnRhcnkgY29kZQorICAgICAqIHBvaW50IHJhbmdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gdGVzdC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIGNvZGVQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyB3aXRoaW4gdGhlIHN1cHBsZW1lbnRhcnkKKyAgICAgKiAgICAgICAgIGNvZGUgcG9pbnQgcmFuZ2U7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBsZW1lbnRhcnlDb2RlUG9pbnQoaW50IGNvZGVQb2ludCkgewogICAgICAgICByZXR1cm4gKE1JTl9TVVBQTEVNRU5UQVJZX0NPREVfUE9JTlQgPD0gY29kZVBvaW50ICYmIE1BWF9DT0RFX1BPSU5UID49IGNvZGVQb2ludCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB0ZXN0IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gaXMgYSBoaWdoCi0gICAgICogc3Vycm9nYXRlL2xlYWRpbmcgc3Vycm9nYXRlIHVuaXQgdGhhdCdzIHVzZWQgZm9yIHJlcHJlc2VudGluZwotICAgICAqIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycyBpbiBVVEYtMTYgZW5jb2RpbmcuCi0gICAgICogPC9wPgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHtAY29kZSBjaH0gaXMgYSBoaWdoLSAob3IgbGVhZGluZy0pIHN1cnJvZ2F0ZSBjb2RlIHVuaXQKKyAgICAgKiB0aGF0IGlzIHVzZWQgZm9yIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMgaW4gVVRGLTE2CisgICAgICogZW5jb2RpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNoIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB1bml0IHRvIHRlc3QuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBjaAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byB0ZXN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjaH0gaXMgYSBoaWdoLXN1cnJvZ2F0ZSBjb2RlIHVuaXQ7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNpc0xvd1N1cnJvZ2F0ZShjaGFyKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hpZ2hTdXJyb2dhdGUoY2hhciBjaCkgewogICAgICAgICByZXR1cm4gKE1JTl9ISUdIX1NVUlJPR0FURSA8PSBjaCAmJiBNQVhfSElHSF9TVVJST0dBVEUgPj0gY2gpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEEgdGVzdCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IGlzIGEgaGlnaAotICAgICAqIHN1cnJvZ2F0ZS9sZWFkaW5nIHN1cnJvZ2F0ZSB1bml0IHRoYXQncyB1c2VkIGZvciByZXByZXNlbnRpbmcKLSAgICAgKiBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMgaW4gVVRGLTE2IGVuY29kaW5nLgotICAgICAqIDwvcD4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB7QGNvZGUgY2h9IGlzIGEgbG93LSAob3IgdHJhaWxpbmctKSBzdXJyb2dhdGUgY29kZSB1bml0CisgICAgICogdGhhdCBpcyB1c2VkIGZvciByZXByZXNlbnRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzIGluIFVURi0xNgorICAgICAqIGVuY29kaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaCBUaGUgPGNvZGU+Y2hhcjwvY29kZT4gdW5pdCB0byB0ZXN0LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY2h9IGlzIGEgbG93LXN1cnJvZ2F0ZSBjb2RlIHVuaXQ7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNpc0hpZ2hTdXJyb2dhdGUoY2hhcikKLSAgICAgKi8KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGNoYXIgY2gpIHsKICAgICAgICAgcmV0dXJuIChNSU5fTE9XX1NVUlJPR0FURSA8PSBjaCAmJiBNQVhfTE9XX1NVUlJPR0FURSA+PSBjaCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB0ZXN0IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gcGFpciBpcyBhIHZhbGlkCi0gICAgICogc3Vycm9nYXRlIHBhaXIuCi0gICAgICogPC9wPgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHBhaXIgaXMgYSB2YWxpZCBzdXJyb2dhdGUgcGFpci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGlnaCBUaGUgaGlnaCBzdXJyb2dhdGUgdW5pdCB0byB0ZXN0LgotICAgICAqIEBwYXJhbSBsb3cgVGhlIGxvdyBzdXJyb2dhdGUgdW5pdCB0byB0ZXN0LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gaGlnaAorICAgICAqICAgICAgICAgICAgdGhlIGhpZ2ggc3Vycm9nYXRlIHVuaXQgdG8gdGVzdC4KKyAgICAgKiBAcGFyYW0gbG93CisgICAgICogICAgICAgICAgICB0aGUgbG93IHN1cnJvZ2F0ZSB1bml0IHRvIHRlc3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGhpZ2h9IGlzIGEgaGlnaC1zdXJyb2dhdGUgY29kZSB1bml0IGFuZAorICAgICAqICAgICAgICAge0Bjb2RlIGxvd30gaXMgYSBsb3ctc3Vycm9nYXRlIGNvZGUgdW5pdDsge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2lzSGlnaFN1cnJvZ2F0ZShjaGFyKQogICAgICAqIEBzZWUgI2lzTG93U3Vycm9nYXRlKGNoYXIpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3Vycm9nYXRlUGFpcihjaGFyIGhpZ2gsIGNoYXIgbG93KSB7CiAgICAgICAgIHJldHVybiAoaXNIaWdoU3Vycm9nYXRlKGhpZ2gpICYmIGlzTG93U3Vycm9nYXRlKGxvdykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiA8Y29kZT5jaGFyPC9jb2RlPiB2YWx1ZXMgcmVxdWlyZWQgdG8gcmVwcmVzZW50Ci0gICAgICogdGhlIFVuaWNvZGUgY29kZSBwb2ludC4gVGhpcyBtZXRob2Qgb25seSB0ZXN0cyBpZiB0aGUKLSAgICAgKiA8Y29kZT5jb2RlUG9pbnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4weDEwMDAwPC9jb2RlPiwKLSAgICAgKiBpbiB3aGljaCBjYXNlIDxjb2RlPjI8L2NvZGU+IGlzIHJldHVybmVkLCBvdGhlcndpc2UgPGNvZGU+MTwvY29kZT4uCi0gICAgICogVG8gdGVzdCBpZiB0aGUgY29kZSBwb2ludCBpcyB2YWxpZCwgdXNlIHRoZQotICAgICAqIHtAbGluayAjaXNWYWxpZENvZGVQb2ludChpbnQpfSBtZXRob2QuCi0gICAgICogPC9wPgorICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiB7QGNvZGUgY2hhcn0gdmFsdWVzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgVW5pY29kZSBjb2RlIHBvaW50LiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHtAY29kZSBjb2RlUG9pbnR9CisgICAgICogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHtAY29kZSAweDEwMDAwfSwgaW4gd2hpY2ggY2FzZSB7QGNvZGUgMn0gaXMKKyAgICAgKiByZXR1cm5lZCwgb3RoZXJ3aXNlIHtAY29kZSAxfS4gVG8gdGVzdCBpZiB0aGUgY29kZSBwb2ludCBpcyB2YWxpZCwgdXNlCisgICAgICogdGhlIHtAbGluayAjaXNWYWxpZENvZGVQb2ludChpbnQpfSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvZGVQb2ludCBUaGUgY29kZSBwb2ludCB0byB0ZXN0LgotICAgICAqIEByZXR1cm4gQW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBvZiAyIG9yIDEuCi0gICAgICogQHNpbmNlIDEuNQotICAgICAqIEBzZWUgI2lzVmFsaWRDb2RlUG9pbnQoaW50KQotICAgICAqIEBzZWUgI2lzU3VwcGxlbWVudGFyeUNvZGVQb2ludChpbnQpCisgICAgICogQHBhcmFtIGNvZGVQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICBjaGFycy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSAyfSBpZiB7QGNvZGUgY29kZVBvaW50ID49IDB4MTAwMDB9OyB7QGNvZGUgMX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGNoYXJDb3VudChpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiAoY29kZVBvaW50ID49IDB4MTAwMDAgPyAyIDogMSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29udmVydHMgYSBzdXJyb2dhdGUgcGFpciBpbnRvIGEgVW5pY29kZSBjb2RlIHBvaW50LiBUaGlzIG1ldGhvZCBhc3N1bWUKLSAgICAgKiB0aGF0IHRoZSBwYWlyIGFyZSB2YWxpZCBzdXJyb2dhdGVzLiBJZiB0aGUgcGFpciBhcmUgTk9UIHZhbGlkIHN1cnJvZ2F0ZXMsCi0gICAgICogdGhlbiB0aGUgcmVzdWx0IGlzIGluZGV0ZXJtaW5hdGUuIFRoZQorICAgICAqIENvbnZlcnRzIGEgc3Vycm9nYXRlIHBhaXIgaW50byBhIFVuaWNvZGUgY29kZSBwb2ludC4gVGhpcyBtZXRob2QgYXNzdW1lcworICAgICAqIHRoYXQgdGhlIHBhaXIgYXJlIHZhbGlkIHN1cnJvZ2F0ZXMuIElmIHRoZSBwYWlyIGFyZSA8aT5ub3Q8L2k+IHZhbGlkCisgICAgICogc3Vycm9nYXRlcywgdGhlbiB0aGUgcmVzdWx0IGlzIGluZGV0ZXJtaW5hdGUuIFRoZQogICAgICAqIHtAbGluayAjaXNTdXJyb2dhdGVQYWlyKGNoYXIsIGNoYXIpfSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgcHJpb3IgdG8gdGhpcwogICAgICAqIG1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgcGFpci4KLSAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIGhpZ2ggVGhlIGhpZ2ggc3Vycm9nYXRlIHVuaXQuCi0gICAgICogQHBhcmFtIGxvdyBUaGUgbG93IHN1cnJvZ2F0ZSB1bml0LgotICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgY29kZSBwb2ludC4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIGhpZ2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBoaWdoIHN1cnJvZ2F0ZSB1bml0LgorICAgICAqIEBwYXJhbSBsb3cKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb3cgc3Vycm9nYXRlIHVuaXQuCisgICAgICogQHJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cnJvZ2F0ZSB1bml0IHBhaXIuCiAgICAgICogQHNlZSAjaXNTdXJyb2dhdGVQYWlyKGNoYXIsIGNoYXIpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgdG9Db2RlUG9pbnQoY2hhciBoaWdoLCBjaGFyIGxvdykgewogICAgICAgICAvLyBTZWUgUkZDIDI3ODEsIFNlY3Rpb24gMi4yCkBAIC0xNDg4LDIzICsxNzA1LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgY29kZSBwb2ludCBhdCB0aGUgaW5kZXggaW4gdGhlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4uCi0gICAgICogSWYgPGNvZGU+Y2hhcjwvY29kZT4gdW5pdCBhdCB0aGUgaW5kZXggaXMgYSBoaWdoLXN1cnJvZ2F0ZSB1bml0LCB0aGUKLSAgICAgKiBuZXh0IGluZGV4IGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBhbmQgdGhlCi0gICAgICogPGNvZGU+Y2hhcjwvY29kZT4gdW5pdCBhdCB0aGUgbmV4dCBpbmRleCBpcyBhIGxvdyBzdXJyb2dhdGUgdW5pdCwgdGhlbgotICAgICAqIHRoZSBjb2RlIHBvaW50IHJlcHJlc2VudGVkIGJ5IHRoZSBwYWlyIGlzIHJldHVybmVkOyBvdGhlcndpc2UgdGhlCi0gICAgICogPGNvZGU+Y2hhcjwvY29kZT4gdW5pdCBhdCB0aGUgaW5kZXggaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgdGhlIGNvZGUgcG9pbnQgYXQge0Bjb2RlIGluZGV4fSBpbiB0aGUgc3BlY2lmaWVkIHNlcXVlbmNlIG9mCisgICAgICogY2hhcmFjdGVyIHVuaXRzLiBJZiB0aGUgdW5pdCBhdCB7QGNvZGUgaW5kZXh9IGlzIGEgaGlnaC1zdXJyb2dhdGUgdW5pdCwKKyAgICAgKiB7QGNvZGUgaW5kZXggKyAxfSBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgYW5kIHRoZSB1bml0IGF0CisgICAgICoge0Bjb2RlIGluZGV4ICsgMX0gaXMgYSBsb3ctc3Vycm9nYXRlIHVuaXQsIHRoZW4gdGhlIHN1cHBsZW1lbnRhcnkgY29kZQorICAgICAqIHBvaW50IHJlcHJlc2VudGVkIGJ5IHRoZSBwYWlyIGlzIHJldHVybmVkOyBvdGhlcndpc2UgdGhlIHtAY29kZSBjaGFyfQorICAgICAqIHZhbHVlIGF0IHtAY29kZSBpbmRleH0gaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNlcSBUaGUgc2VxdWVuY2Ugb2YgPGNvZGU+Y2hhcjwvY29kZT4gdW5pdHMuCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBpbnRvIHRoZSA8Y29kZT5zZXE8L2NvZGU+IHRvIHJldHJpZXZlIGFuZAotICAgICAqICAgICAgICBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIFVuaWNvZGUgY29kZSBwb2ludC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnNlcTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaXMgbmVnYXRpdmUKLSAgICAgKiAgICAgICAgIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5zZXEubGVuZ3RoKCk8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gc2VxCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIHNlcXVlbmNlIG9mIHtAY29kZSBjaGFyfSB1bml0cy4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBpbiB7QGNvZGUgc2VxfSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBjb2RlCisgICAgICogICAgICAgICAgICBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgb3Ige0Bjb2RlIGNoYXJ9IHZhbHVlIGF0IHtAY29kZSBpbmRleH0gaW4KKyAgICAgKiAgICAgICAgIHtAY29kZSBzZXF9LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgaW5kZXh9IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICAqICAgICAgICAgICAgIHRoZSBsZW5ndGggb2Yge0Bjb2RlIHNlcX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgY29kZVBvaW50QXQoQ2hhclNlcXVlbmNlIHNlcSwgaW50IGluZGV4KSB7CiAgICAgICAgIGlmIChzZXEgPT0gbnVsbCkgewpAQCAtMTUyNywyMyArMTc0NSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIGNvZGUgcG9pbnQgYXQgdGhlIGluZGV4IGluIHRoZSA8Y29kZT5jaGFyW108L2NvZGU+LiBJZgotICAgICAqIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQgYXQgdGhlIGluZGV4IGlzIGEgaGlnaC1zdXJyb2dhdGUgdW5pdCwgdGhlIG5leHQKLSAgICAgKiBpbmRleCBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgYW5kIHRoZSA8Y29kZT5jaGFyPC9jb2RlPgotICAgICAqIHVuaXQgYXQgdGhlIG5leHQgaW5kZXggaXMgYSBsb3cgc3Vycm9nYXRlIHVuaXQsIHRoZW4gdGhlIGNvZGUgcG9pbnQKLSAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcGFpciBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlIHRoZSA8Y29kZT5jaGFyPC9jb2RlPgotICAgICAqIHVuaXQgYXQgdGhlIGluZGV4IGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb2RlIHBvaW50IGF0IHtAY29kZSBpbmRleH0gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBvZgorICAgICAqIGNoYXJhY3RlciB1bml0cy4gSWYgdGhlIHVuaXQgYXQge0Bjb2RlIGluZGV4fSBpcyBhIGhpZ2gtc3Vycm9nYXRlIHVuaXQsCisgICAgICoge0Bjb2RlIGluZGV4ICsgMX0gaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGFuZCB0aGUgdW5pdCBhdAorICAgICAqIHtAY29kZSBpbmRleCArIDF9IGlzIGEgbG93LXN1cnJvZ2F0ZSB1bml0LCB0aGVuIHRoZSBzdXBwbGVtZW50YXJ5IGNvZGUKKyAgICAgKiBwb2ludCByZXByZXNlbnRlZCBieSB0aGUgcGFpciBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlIHRoZSB7QGNvZGUgY2hhcn0KKyAgICAgKiB2YWx1ZSBhdCB7QGNvZGUgaW5kZXh9IGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzZXEgVGhlIHNlcXVlbmNlIG9mIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXRzLgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggaW50byB0aGUgPGNvZGU+c2VxPC9jb2RlPiB0byByZXRyaWV2ZSBhbmQKLSAgICAgKiAgICAgICAgY29udmVydC4KLSAgICAgKiBAcmV0dXJuIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5zZXE8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlCi0gICAgICogICAgICAgICBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+c2VxLmxlbmd0aCgpPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIHNlcQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBhcnJheSBvZiB7QGNvZGUgY2hhcn0gdW5pdHMuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gaW4ge0Bjb2RlIHNlcX0gZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgY29kZQorICAgICAqICAgICAgICAgICAgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IG9yIHtAY29kZSBjaGFyfSB2YWx1ZSBhdCB7QGNvZGUgaW5kZXh9IGluCisgICAgICogICAgICAgICB7QGNvZGUgc2VxfS4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGluZGV4fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzZXF9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvZGVQb2ludEF0KGNoYXJbXSBzZXEsIGludCBpbmRleCkgewogICAgICAgICBpZiAoc2VxID09IG51bGwpIHsKQEAgLTE1NjYsMjcgKzE3ODUsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRoZSBjb2RlIHBvaW50IGF0IHRoZSBpbmRleCBpbiB0aGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB0aGF0J3MKLSAgICAgKiB3aXRoaW4gdGhlIGxpbWl0LiBJZiA8Y29kZT5jaGFyPC9jb2RlPiB1bml0IGF0IHRoZSBpbmRleCBpcyBhCi0gICAgICogaGlnaC1zdXJyb2dhdGUgdW5pdCwgdGhlIG5leHQgaW5kZXggaXMgbGVzcyB0aGFuIHRoZSA8Y29kZT5saW1pdDwvY29kZT4KLSAgICAgKiBhbmQgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQgYXQgdGhlIG5leHQgaW5kZXggaXMgYSBsb3cgc3Vycm9nYXRlCi0gICAgICogdW5pdCwgdGhlbiB0aGUgY29kZSBwb2ludCByZXByZXNlbnRlZCBieSB0aGUgcGFpciBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlCi0gICAgICogdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQgYXQgdGhlIGluZGV4IGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb2RlIHBvaW50IGF0IHtAY29kZSBpbmRleH0gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBvZgorICAgICAqIGNoYXJhY3RlciB1bml0cywgd2hlcmUge0Bjb2RlIGluZGV4fSBoYXMgdG8gYmUgbGVzcyB0aGFuIHtAY29kZSBsaW1pdH0uCisgICAgICogSWYgdGhlIHVuaXQgYXQge0Bjb2RlIGluZGV4fSBpcyBhIGhpZ2gtc3Vycm9nYXRlIHVuaXQsIHtAY29kZSBpbmRleCArIDF9CisgICAgICogaXMgbGVzcyB0aGFuIHtAY29kZSBsaW1pdH0gYW5kIHRoZSB1bml0IGF0IHtAY29kZSBpbmRleCArIDF9IGlzIGEKKyAgICAgKiBsb3ctc3Vycm9nYXRlIHVuaXQsIHRoZW4gdGhlIHN1cHBsZW1lbnRhcnkgY29kZSBwb2ludCByZXByZXNlbnRlZCBieSB0aGUKKyAgICAgKiBwYWlyIGlzIHJldHVybmVkOyBvdGhlcndpc2UgdGhlIHtAY29kZSBjaGFyfSB2YWx1ZSBhdCB7QGNvZGUgaW5kZXh9IGlzCisgICAgICogcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNlcSBUaGUgc2VxdWVuY2Ugb2YgPGNvZGU+Y2hhcjwvY29kZT4gdW5pdHMuCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBpbnRvIHRoZSA8Y29kZT5zZXE8L2NvZGU+IHRvIHJldHJpZXZlIGFuZAotICAgICAqICAgICAgICBjb252ZXJ0LgotICAgICAqIEBwYXJhbSBsaW1pdCBUaGUgZXhjbHVzaXZlIGluZGV4IGludG8gdGhlIDxjb2RlPnNlcTwvY29kZT4gdGhhdCBtYXJrcwotICAgICAqICAgICAgICB0aGUgZW5kIG9mIHRoZSB1bml0cyB0aGF0IGNhbiBiZSB1c2VkLgotICAgICAqIEByZXR1cm4gVGhlIFVuaWNvZGUgY29kZSBwb2ludC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnNlcTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+bGltaXQ8L2NvZGU+LAotICAgICAqICAgICAgICAgPGNvZGU+bGltaXQ8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIDxjb2RlPmxpbWl0PC9jb2RlPiBpcwotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgPGNvZGU+c2VxPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIHNlcQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBhcnJheSBvZiB7QGNvZGUgY2hhcn0gdW5pdHMuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gaW4ge0Bjb2RlIHNlcX0gZnJvbSB3aGljaCB0byBnZXQgdGhlIGNvZGUgcG9pbnQuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYWZ0ZXIgdGhlIGxhc3QgdW5pdCBpbiB7QGNvZGUgc2VxfSB0aGF0IGNhbiBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBvciB7QGNvZGUgY2hhcn0gdmFsdWUgYXQge0Bjb2RlIGluZGV4fSBpbgorICAgICAqICAgICAgICAge0Bjb2RlIHNlcX0uCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4IDwgMH0sIHtAY29kZSBpbmRleCA+PSBsaW1pdH0sCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxpbWl0IDwgMH0gb3IgaWYge0Bjb2RlIGxpbWl0fSBpcyBncmVhdGVyIHRoYW4gdGhlCisgICAgICogICAgICAgICAgICAgbGVuZ3RoIG9mIHtAY29kZSBzZXF9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvZGVQb2ludEF0KGNoYXJbXSBzZXEsIGludCBpbmRleCwgaW50IGxpbWl0KSB7CiAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGltaXQgfHwgbGltaXQgPCAwIHx8IGxpbWl0ID4gc2VxLmxlbmd0aCkgewpAQCAtMTYwNSwyNCArMTgyNCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB0aGF0IHByb2NlZWRzIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaW4KLSAgICAgKiB0aGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPi4gSWYgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQgYXQKLSAgICAgKiA8Y29kZT5pbmRleCAtIDE8L2NvZGU+IGlzIHdpdGhpbiB0aGUgbG93IHN1cnJvZ2F0ZSByYW5nZSwgdGhlIHZhbHVlCi0gICAgICogPGNvZGU+aW5kZXggLSAyPC9jb2RlPiBpc24ndCBuZWdhdGl2ZSBhbmQgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQKLSAgICAgKiBhdCA8Y29kZT5pbmRleCAtIDI8L2NvZGU+IGlzIHdpdGhpbiB0aGUgaGlnaCBzdXJyb2dhdGUgcmFuZ2UsIHRoZW4gdGhlCi0gICAgICogc3VwcGxlbWVudGFyeSBjb2RlIHBvaW50IG1hZGUgdXAgb2YgdGhlIHN1cnJvZ2F0ZSBwYWlyIGlzIHJldHVybmVkOwotICAgICAqIG90aGVyd2lzZSwgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlIGF0IDxjb2RlPmluZGV4IC0gMTwvY29kZT4gaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGUgY29kZSBwb2ludCB0aGF0IHByZWNlZHMge0Bjb2RlIGluZGV4fSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogc2VxdWVuY2Ugb2YgY2hhcmFjdGVyIHVuaXRzLiBJZiB0aGUgdW5pdCBhdCB7QGNvZGUgaW5kZXggLSAxfSBpcyBhCisgICAgICogbG93LXN1cnJvZ2F0ZSB1bml0LCB7QGNvZGUgaW5kZXggLSAyfSBpcyBub3QgbmVnYXRpdmUgYW5kIHRoZSB1bml0IGF0CisgICAgICoge0Bjb2RlIGluZGV4IC0gMn0gaXMgYSBoaWdoLXN1cnJvZ2F0ZSB1bml0LCB0aGVuIHRoZSBzdXBwbGVtZW50YXJ5IGNvZGUKKyAgICAgKiBwb2ludCByZXByZXNlbnRlZCBieSB0aGUgcGFpciBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlIHRoZSB7QGNvZGUgY2hhcn0KKyAgICAgKiB2YWx1ZSBhdCB7QGNvZGUgaW5kZXggLSAxfSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VxIFRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHRvIHNlYXJjaC4KLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGludG8gdGhlIDxjb2RlPnNlcTwvY29kZT4uCi0gICAgICogQHJldHVybiBBIFVuaWNvZGUgY29kZSBwb2ludC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnNlcTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBsZXNzIHRoYW4gMQotICAgICAqICAgICAgICAgb3IgZ3JlYXRlciB0aGFuIDxjb2RlPnNlcS5sZW5ndGgoKTwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBzZXEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugc2VxdWVuY2Ugb2Yge0Bjb2RlIGNoYXJ9IHVuaXRzLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGluIHtAY29kZSBzZXF9IGZvbGxvd2luZyB0aGUgY29kZQorICAgICAqICAgICAgICAgICAgcG9pbnQgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IG9yIHtAY29kZSBjaGFyfSB2YWx1ZSBiZWZvcmUge0Bjb2RlIGluZGV4fQorICAgICAqICAgICAgICAgaW4ge0Bjb2RlIHNlcX0uCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBpbmRleH0gaXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuIHRoZQorICAgICAqICAgICAgICAgICAgIGxlbmd0aCBvZiB7QGNvZGUgc2VxfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBjb2RlUG9pbnRCZWZvcmUoQ2hhclNlcXVlbmNlIHNlcSwgaW50IGluZGV4KSB7CiAgICAgICAgIGlmIChzZXEgPT0gbnVsbCkgewpAQCAtMTY0NSwyNCArMTg2NCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB0aGF0IHByb2NlZWRzIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaW4KLSAgICAgKiB0aGUgPGNvZGU+Y2hhcltdPC9jb2RlPi4gSWYgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQgYXQKLSAgICAgKiA8Y29kZT5pbmRleCAtIDE8L2NvZGU+IGlzIHdpdGhpbiB0aGUgbG93IHN1cnJvZ2F0ZSByYW5nZSwgdGhlIHZhbHVlCi0gICAgICogPGNvZGU+aW5kZXggLSAyPC9jb2RlPiBpc24ndCBuZWdhdGl2ZSBhbmQgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQKLSAgICAgKiBhdCA8Y29kZT5pbmRleCAtIDI8L2NvZGU+IGlzIHdpdGhpbiB0aGUgaGlnaCBzdXJyb2dhdGUgcmFuZ2UsIHRoZW4gdGhlCi0gICAgICogc3VwcGxlbWVudGFyeSBjb2RlIHBvaW50IG1hZGUgdXAgb2YgdGhlIHN1cnJvZ2F0ZSBwYWlyIGlzIHJldHVybmVkOwotICAgICAqIG90aGVyd2lzZSwgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlIGF0IDxjb2RlPmluZGV4IC0gMTwvY29kZT4gaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGUgY29kZSBwb2ludCB0aGF0IHByZWNlZHMge0Bjb2RlIGluZGV4fSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogYXJyYXkgb2YgY2hhcmFjdGVyIHVuaXRzLiBJZiB0aGUgdW5pdCBhdCB7QGNvZGUgaW5kZXggLSAxfSBpcyBhCisgICAgICogbG93LXN1cnJvZ2F0ZSB1bml0LCB7QGNvZGUgaW5kZXggLSAyfSBpcyBub3QgbmVnYXRpdmUgYW5kIHRoZSB1bml0IGF0CisgICAgICoge0Bjb2RlIGluZGV4IC0gMn0gaXMgYSBoaWdoLXN1cnJvZ2F0ZSB1bml0LCB0aGVuIHRoZSBzdXBwbGVtZW50YXJ5IGNvZGUKKyAgICAgKiBwb2ludCByZXByZXNlbnRlZCBieSB0aGUgcGFpciBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlIHRoZSB7QGNvZGUgY2hhcn0KKyAgICAgKiB2YWx1ZSBhdCB7QGNvZGUgaW5kZXggLSAxfSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VxIFRoZSA8Y29kZT5jaGFyW108L2NvZGU+IHRvIHNlYXJjaC4KLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGludG8gdGhlIDxjb2RlPnNlcTwvY29kZT4uCi0gICAgICogQHJldHVybiBBIFVuaWNvZGUgY29kZSBwb2ludC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnNlcTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBsZXNzIHRoYW4gMQotICAgICAqICAgICAgICAgb3IgZ3JlYXRlciB0aGFuIDxjb2RlPnNlcS5sZW5ndGg8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gc2VxCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGFycmF5IG9mIHtAY29kZSBjaGFyfSB1bml0cy4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBpbiB7QGNvZGUgc2VxfSBmb2xsb3dpbmcgdGhlIGNvZGUKKyAgICAgKiAgICAgICAgICAgIHBvaW50IHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBvciB7QGNvZGUgY2hhcn0gdmFsdWUgYmVmb3JlIHtAY29kZSBpbmRleH0KKyAgICAgKiAgICAgICAgIGluIHtAY29kZSBzZXF9LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgaW5kZXh9IGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICBsZW5ndGggb2Yge0Bjb2RlIHNlcX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgY29kZVBvaW50QmVmb3JlKGNoYXJbXSBzZXEsIGludCBpbmRleCkgewogICAgICAgICBpZiAoc2VxID09IG51bGwpIHsKQEAgLTE2ODUsMjggKzE5MDQsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdGhhdCBwcm9jZWVkcyB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IGluCi0gICAgICogdGhlIDxjb2RlPmNoYXJbXTwvY29kZT4gYW5kIGlzbid0IGxlc3MgdGhhbiA8Y29kZT5zdGFydDwvY29kZT4uIElmCi0gICAgICogdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHVuaXQgYXQgPGNvZGU+aW5kZXggLSAxPC9jb2RlPiBpcyB3aXRoaW4gdGhlCi0gICAgICogbG93IHN1cnJvZ2F0ZSByYW5nZSwgdGhlIHZhbHVlIDxjb2RlPmluZGV4IC0gMjwvY29kZT4gaXNuJ3QgbGVzcyB0aGFuCi0gICAgICogPGNvZGU+c3RhcnQ8L2NvZGU+IGFuZCB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdW5pdCBhdAotICAgICAqIDxjb2RlPmluZGV4IC0gMjwvY29kZT4gaXMgd2l0aGluIHRoZSBoaWdoIHN1cnJvZ2F0ZSByYW5nZSwgdGhlbiB0aGUKLSAgICAgKiBzdXBwbGVtZW50YXJ5IGNvZGUgcG9pbnQgbWFkZSB1cCBvZiB0aGUgc3Vycm9nYXRlIHBhaXIgaXMgcmV0dXJuZWQ7Ci0gICAgICogb3RoZXJ3aXNlLCB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdmFsdWUgYXQgPGNvZGU+aW5kZXggLSAxPC9jb2RlPiBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb2RlIHBvaW50IHRoYXQgcHJlY2VkcyB0aGUge0Bjb2RlIGluZGV4fSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogYXJyYXkgb2YgY2hhcmFjdGVyIHVuaXRzIGFuZCBpcyBub3QgbGVzcyB0aGFuIHtAY29kZSBzdGFydH0uIElmIHRoZSB1bml0CisgICAgICogYXQge0Bjb2RlIGluZGV4IC0gMX0gaXMgYSBsb3ctc3Vycm9nYXRlIHVuaXQsIHtAY29kZSBpbmRleCAtIDJ9IGlzIG5vdAorICAgICAqIGxlc3MgdGhhbiB7QGNvZGUgc3RhcnR9IGFuZCB0aGUgdW5pdCBhdCB7QGNvZGUgaW5kZXggLSAyfSBpcyBhCisgICAgICogaGlnaC1zdXJyb2dhdGUgdW5pdCwgdGhlbiB0aGUgc3VwcGxlbWVudGFyeSBjb2RlIHBvaW50IHJlcHJlc2VudGVkIGJ5IHRoZQorICAgICAqIHBhaXIgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSB0aGUge0Bjb2RlIGNoYXJ9IHZhbHVlIGF0IHtAY29kZSBpbmRleCAtIDF9CisgICAgICogaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNlcSBUaGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB0byBzZWFyY2guCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBpbnRvIHRoZSA8Y29kZT5zZXE8L2NvZGU+LgotICAgICAqIEByZXR1cm4gQSBVbmljb2RlIGNvZGUgcG9pbnQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5zZXE8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgbGVzcyB0aGFuIG9yCi0gICAgICogICAgICAgICBlcXVhbCB0byA8Y29kZT5zdGFydDwvY29kZT4sIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBncmVhdGVyCi0gICAgICogICAgICAgICB0aGFuIDxjb2RlPnNlcS5sZW5ndGg8L2NvZGU+LCA8Y29kZT5zdGFydDwvY29kZT4gaXMgbm90Ci0gICAgICogICAgICAgICBuZWdhdGl2ZSBhbmQgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgPGNvZGU+c2VxLmxlbmd0aDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBzZXEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgYXJyYXkgb2Yge0Bjb2RlIGNoYXJ9IHVuaXRzLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGluIHtAY29kZSBzZXF9IGZvbGxvd2luZyB0aGUgY29kZSBwb2ludCB0aGF0CisgICAgICogICAgICAgICAgICBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4ge0Bjb2RlIHNlcX0uCisgICAgICogQHJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IG9yIHtAY29kZSBjaGFyfSB2YWx1ZSBiZWZvcmUge0Bjb2RlIGluZGV4fQorICAgICAqICAgICAgICAgaW4ge0Bjb2RlIHNlcX0uCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBpbmRleCA8PSBzdGFydH0sIHtAY29kZSBzdGFydCA8IDB9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBpbmRleH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIHNlcX0sIG9yCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0fSBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBzZXF9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvZGVQb2ludEJlZm9yZShjaGFyW10gc2VxLCBpbnQgaW5kZXgsIGludCBzdGFydCkgewogICAgICAgICBpZiAoc2VxID09IG51bGwpIHsKQEAgLTE3MjksMjYgKzE5NDksMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb252ZXJ0cyB0aGUgVW5pY29kZSBjb2RlIHBvaW50LCA8Y29kZT5jb2RlUG9pbnQ8L2NvZGU+LCBpbnRvIGEgVVRGLTE2Ci0gICAgICogZW5jb2RlZCBzZXF1ZW5jZSBhbmQgY29waWVzIHRoZSB2YWx1ZShzKSBpbnRvIHRoZQotICAgICAqIDxjb2RlPmNoYXJbXTwvY29kZT4gPGNvZGU+ZHN0PC9jb2RlPiwgc3RhcnRpbmcgYXQgdGhlIGluZGV4Ci0gICAgICogPGNvZGU+ZHN0SW5kZXg8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIFVuaWNvZGUgY29kZSBwb2ludCBpbnRvIGEgVVRGLTE2IGVuY29kZWQgc2VxdWVuY2UKKyAgICAgKiBhbmQgY29waWVzIHRoZSB2YWx1ZShzKSBpbnRvIHRoZSBjaGFyIGFycmF5IHtAY29kZSBkc3R9LCBzdGFydGluZyBhdAorICAgICAqIGluZGV4IHtAY29kZSBkc3RJbmRleH0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvZGVQb2ludCBUaGUgVW5pY29kZSBjb2RlIHBvaW50IHRvIGVuY29kZS4KLSAgICAgKiBAcGFyYW0gZHN0IFRoZSA8Y29kZT5jaGFyW108L2NvZGU+IHRvIGNvcHkgdGhlIGVuY29kZWQgdmFsdWUgaW50by4KLSAgICAgKiBAcGFyYW0gZHN0SW5kZXggVGhlIGluZGV4IHRvIHN0YXJ0IGNvcHlpbmcgaW50byA8Y29kZT5kc3Q8L2NvZGU+LgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiA8Y29kZT5jaGFyPC9jb2RlPiB2YWx1ZSB1bml0cyBjb3BpZWQgaW50bwotICAgICAqICAgICAgICAgPGNvZGU+ZHN0PC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5jb2RlUG9pbnQ8L2NvZGU+IGlzIG5vdCBhCi0gICAgICogICAgICAgICB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5kc3Q8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiA8Y29kZT5kc3RJbmRleDwvY29kZT4gaXMgbmVnYXRpdmUsCi0gICAgICogICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+ZHN0Lmxlbmd0aDwvY29kZT4gb3IgZXF1YWxzCi0gICAgICogICAgICAgICA8Y29kZT5kc3QubGVuZ3RoIC0gMTwvY29kZT4gd2hlbiA8Y29kZT5jb2RlUG9pbnQ8L2NvZGU+IGlzIGEKLSAgICAgKiAgICAgICAgIHtAbGluayAjaXNTdXBwbGVtZW50YXJ5Q29kZVBvaW50KGludCkgc3VwcGxlbWVudGFyeSBjb2RlIHBvaW50fS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIGNvZGVQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB0byBlbmNvZGUuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHRvIGNvcHkgdGhlIGVuY29kZWQgdmFsdWUgaW50by4KKyAgICAgKiBAcGFyYW0gZHN0SW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiB7QGNvZGUgZHN0fSBmcm9tIHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHtAY29kZSBjaGFyfSB2YWx1ZSB1bml0cyBjb3BpZWQgaW50byB7QGNvZGUgZHN0fS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb2RlUG9pbnR9IGlzIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZHN0SW5kZXh9IGlzIG5lZ2F0aXZlLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgZHN0Lmxlbmd0aH0gb3IgZXF1YWxzIHtAY29kZSBkc3QubGVuZ3RoIC0gMX0gd2hlbgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBjb2RlUG9pbnR9IGlzIGEKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2lzU3VwcGxlbWVudGFyeUNvZGVQb2ludChpbnQpIHN1cHBsZW1lbnRhcnkgY29kZSBwb2ludH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgdG9DaGFycyhpbnQgY29kZVBvaW50LCBjaGFyW10gZHN0LCBpbnQgZHN0SW5kZXgpIHsKICAgICAgICAgaWYgKCFpc1ZhbGlkQ29kZVBvaW50KGNvZGVQb2ludCkpIHsKQEAgLTE3ODAsMTkgKzE5OTksMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb252ZXJ0cyB0aGUgVW5pY29kZSBjb2RlIHBvaW50LCA8Y29kZT5jb2RlUG9pbnQ8L2NvZGU+LCBpbnRvIGEgVVRGLTE2Ci0gICAgICogZW5jb2RlZCBzZXF1ZW5jZSB0aGF0IGlzIHJldHVybmVkIGFzIGEgPGNvZGU+Y2hhcltdPC9jb2RlPi4KLSAgICAgKiA8L3A+CisgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBVbmljb2RlIGNvZGUgcG9pbnQgaW50byBhIFVURi0xNiBlbmNvZGVkIHNlcXVlbmNlCisgICAgICogYW5kIHJldHVybnMgaXQgYXMgYSBjaGFyIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIFVuaWNvZGUgY29kZSBwb2ludCB0byBlbmNvZGUuCi0gICAgICogQHJldHVybiBUaGUgVVRGLTE2IGVuY29kZWQgPGNvZGU+Y2hhcjwvY29kZT4gc2VxdWVuY2U7IGlmIGNvZGUgcG9pbnQgaXMKLSAgICAgKiAgICAgICAgIGEge0BsaW5rICNpc1N1cHBsZW1lbnRhcnlDb2RlUG9pbnQoaW50KSBzdXBwbGVtZW50YXJ5IGNvZGUgcG9pbnR9LAotICAgICAqICAgICAgICAgdGhlbiBhIDIgPGNvZGU+Y2hhcjwvY29kZT4gYXJyYXkgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBhIDEKLSAgICAgKiAgICAgICAgIDxjb2RlPmNoYXI8L2NvZGU+IGFycmF5IGlzIHJldHVybmVkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmNvZGVQb2ludDwvY29kZT4gaXMgbm90IGEKLSAgICAgKiAgICAgICAgIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludC4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIGNvZGVQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB0byBlbmNvZGUuCisgICAgICogQHJldHVybiB0aGUgVVRGLTE2IGVuY29kZWQgY2hhciBzZXF1ZW5jZS4gSWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgYQorICAgICAqICAgICAgICAge0BsaW5rICNpc1N1cHBsZW1lbnRhcnlDb2RlUG9pbnQoaW50KSBzdXBwbGVtZW50YXJ5IGNvZGUgcG9pbnR9LAorICAgICAqICAgICAgICAgdGhlbiB0aGUgcmV0dXJuZWQgYXJyYXkgY29udGFpbnMgdHdvIGNoYXJhY3RlcnMsIG90aGVyd2lzZSBpdAorICAgICAqICAgICAgICAgY29udGFpbnMganVzdCBvbmUgY2hhcmFjdGVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIHRvQ2hhcnMoaW50IGNvZGVQb2ludCkgewogICAgICAgICBpZiAoIWlzVmFsaWRDb2RlUG9pbnQoY29kZVBvaW50KSkgewpAQCAtMTgwOSwyMiArMjAyNywyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY29kZSBwb2ludHMgaW4gdGhlIHN1YnNlcXVlbmNlIG9mIHRoZQotICAgICAqIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4sIGFzIGRlbGluZWF0ZWQgYnkgdGhlCi0gICAgICogPGNvZGU+YmVnaW5JbmRleDwvY29kZT4gYW5kIDxjb2RlPmVuZEluZGV4PC9jb2RlPi4gQW55IHN1cnJvZ2F0ZQotICAgICAqIHZhbHVlcyB3aXRoIG1pc3NpbmcgcGFpciB2YWx1ZXMgd2lsbCBiZSBjb3VudGVkIGFzIDEgY29kZSBwb2ludC4KLSAgICAgKiA8L3A+CisgICAgICogc3BlY2lmaWVkIGNoYXJhY3RlciBzZXF1ZW5jZSwgYXMgZGVsaW5lYXRlZCBieSB7QGNvZGUgYmVnaW5JbmRleH0gYW5kCisgICAgICoge0Bjb2RlIGVuZEluZGV4fS4gQW55IHN1cnJvZ2F0ZSB2YWx1ZXMgd2l0aCBtaXNzaW5nIHBhaXIgdmFsdWVzIHdpbGwgYmUKKyAgICAgKiBjb3VudGVkIGFzIG9uZSBjb2RlIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzZXEgVGhlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gdG8gbG9vayB0aHJvdWdoLgotICAgICAqIEBwYXJhbSBiZWdpbkluZGV4IFRoZSBpbmNsdXNpdmUgaW5kZXggdG8gYmVnaW4gY291bnRpbmcgYXQuCi0gICAgICogQHBhcmFtIGVuZEluZGV4IFRoZSBleGNsdXNpdmUgaW5kZXggdG8gc3RvcCBjb3VudGluZyBhdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnNlcTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGlzCi0gICAgICogICAgICAgICBuZWdhdGl2ZSwgZ3JlYXRlciB0aGFuIDxjb2RlPnNlcS5sZW5ndGgoKTwvY29kZT4gb3IgZ3JlYXRlcgotICAgICAqICAgICAgICAgdGhhbiA8Y29kZT5lbmRJbmRleDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBzZXEKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2hhclNlcXVlbmNlfSB0byBsb29rIHRocm91Z2guCisgICAgICogQHBhcmFtIGJlZ2luSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmNsdXNpdmUgaW5kZXggdG8gYmVnaW4gY291bnRpbmcgYXQuCisgICAgICogQHBhcmFtIGVuZEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGluZGV4IHRvIHN0b3AgY291bnRpbmcgYXQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY29kZSBwb2ludHMuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGJlZ2luSW5kZXggPCAwfSwge0Bjb2RlIGJlZ2luSW5kZXggPiBlbmRJbmRleH0gb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZW5kSW5kZXh9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzZXF9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvZGVQb2ludENvdW50KENoYXJTZXF1ZW5jZSBzZXEsIGludCBiZWdpbkluZGV4LAogICAgICAgICAgICAgaW50IGVuZEluZGV4KSB7CkBAIC0xODUzLDIzICsyMDcxLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgVW5pY29kZSBjb2RlIHBvaW50cyBpbiB0aGUgc3Vic2VxdWVuY2Ugb2YgdGhlCi0gICAgICogPGNvZGU+Y2hhcltdPC9jb2RlPiwgYXMgZGVsaW5lYXRlZCBieSB0aGUgPGNvZGU+b2Zmc2V0PC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5jb3VudDwvY29kZT4uIEFueSBzdXJyb2dhdGUgdmFsdWVzIHdpdGggbWlzc2luZyBwYWlyIHZhbHVlcyB3aWxsCi0gICAgICogYmUgY291bnRlZCBhcyAxIGNvZGUgcG9pbnQuCi0gICAgICogPC9wPgorICAgICAqIHNwZWNpZmllZCBjaGFyIGFycmF5LCBhcyBkZWxpbmVhdGVkIGJ5IHtAY29kZSBvZmZzZXR9IGFuZCB7QGNvZGUgY291bnR9LgorICAgICAqIEFueSBzdXJyb2dhdGUgdmFsdWVzIHdpdGggbWlzc2luZyBwYWlyIHZhbHVlcyB3aWxsIGJlIGNvdW50ZWQgYXMgb25lIGNvZGUKKyAgICAgKiBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VxIFRoZSA8Y29kZT5jaGFyW108L2NvZGU+IHRvIGxvb2sgdGhyb3VnaC4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmNsdXNpdmUgaW5kZXggdG8gYmVnaW4gY291bnRpbmcgYXQuCi0gICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgPGNvZGU+Y2hhcjwvY29kZT4gdmFsdWVzIHRvIGxvb2sgdGhyb3VnaCBpbgotICAgICAqICAgICAgICA8Y29kZT5zZXE8L2NvZGU+LgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+c2VxPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBvcgotICAgICAqICAgICAgICAgPGNvZGU+Y291bnQ8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGlmIDxjb2RlPmVuZEluZGV4PC9jb2RlPiBpcwotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIDxjb2RlPnNlcS5sZW5ndGg8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gc2VxCisgICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0byBsb29rIHRocm91Z2gKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5jbHVzaXZlIGluZGV4IHRvIGJlZ2luIGNvdW50aW5nIGF0LgorICAgICAqIEBwYXJhbSBjb3VudAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiB7QGNvZGUgY2hhcn0gdmFsdWVzIHRvIGxvb2sgdGhyb3VnaCBpbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHNlcX0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY29kZSBwb2ludHMuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9LCB7QGNvZGUgY291bnQgPCAwfSBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBjb3VudH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgc2VxfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBjb2RlUG9pbnRDb3VudChjaGFyW10gc2VxLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHsKICAgICAgICAgaWYgKHNlcSA9PSBudWxsKSB7CkBAIC0xODk4LDI2ICsyMTE3LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGV0ZXJtaW5lcyB0aGUgaW5kZXggaW50byB0aGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB0aGF0IGlzIG9mZnNldAotICAgICAqIChtZWFzdXJlZCBpbiBjb2RlIHBvaW50cyBhbmQgc3BlY2lmaWVkIGJ5IDxjb2RlPmNvZGVQb2ludE9mZnNldDwvY29kZT4pLAotICAgICAqIGZyb20gdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBhcmd1bWVudC4KLSAgICAgKiA8L3A+CisgICAgICogRGV0ZXJtaW5lcyB0aGUgaW5kZXggaW4gdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2VxdWVuY2UgdGhhdCBpcyBvZmZzZXQKKyAgICAgKiB7QGNvZGUgY29kZVBvaW50T2Zmc2V0fSBjb2RlIHBvaW50cyBmcm9tIHtAY29kZSBpbmRleH0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNlcSBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB0byBmaW5kIHRoZSBpbmRleCB3aXRoaW4uCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBiZWdpbiBmcm9tLCB3aXRoaW4gdGhlCi0gICAgICogICAgICAgIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4uCi0gICAgICogQHBhcmFtIGNvZGVQb2ludE9mZnNldCBUaGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRvIGxvb2sgYmFjayBvcgotICAgICAqICAgICAgICBmb3J3YXJkczsgbWF5IGJlIGEgbmVnYXRpdmUgb3IgcG9zaXRpdmUgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCBpbmRleCB0aGF0IGlzIDxjb2RlPmNvZGVQb2ludE9mZnNldDwvY29kZT4gY29kZQotICAgICAqICAgICAgICAgcG9pbnRzIGZyb20gPGNvZGU+aW5kZXg8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+c2VxPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlLAotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIDxjb2RlPnNlcS5sZW5ndGgoKTwvY29kZT4sIHRoZXJlIGFyZW4ndCBlbm91Z2gKLSAgICAgKiAgICAgICAgIHZhbHVlcyBpbiA8Y29kZT5zZXE8L2NvZGU+IGFmdGVyIDxjb2RlPmluZGV4PC9jb2RlPiBvciBiZWZvcmUKLSAgICAgKiAgICAgICAgIDxjb2RlPmluZGV4PC9jb2RlPiBpZiA8Y29kZT5jb2RlUG9pbnRPZmZzZXQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICBuZWdhdGl2ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIHNlcQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBmaW5kIHRoZSBpbmRleCBpbi4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBpbiB7QGNvZGUgc2VxfS4KKyAgICAgKiBAcGFyYW0gY29kZVBvaW50T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRvIGxvb2sgYmFja3dhcmRzIG9yIGZvcndhcmRzOyBtYXkKKyAgICAgKiAgICAgICAgICAgIGJlIGEgbmVnYXRpdmUgb3IgcG9zaXRpdmUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggaW4ge0Bjb2RlIHNlcX0gdGhhdCBpcyB7QGNvZGUgY29kZVBvaW50T2Zmc2V0fSBjb2RlCisgICAgICogICAgICAgICBwb2ludHMgYXdheSBmcm9tIHtAY29kZSBpbmRleH0uCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4IDwgMH0sIHtAY29kZSBpbmRleH0gaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgICAqICAgICAgICAgICAgIGxlbmd0aCBvZiB7QGNvZGUgc2VxfSwgb3IgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggdmFsdWVzIGluCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHNlcX0gdG8gc2tpcCB7QGNvZGUgY29kZVBvaW50T2Zmc2V0fSBjb2RlIHBvaW50cworICAgICAqICAgICAgICAgICAgIGZvcndhcmRzIG9yIGJhY2t3YXJkcyAoaWYge0Bjb2RlIGNvZGVQb2ludE9mZnNldH0gaXMKKyAgICAgKiAgICAgICAgICAgICBuZWdhdGl2ZSkgZnJvbSB7QGNvZGUgaW5kZXh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IG9mZnNldEJ5Q29kZVBvaW50cyhDaGFyU2VxdWVuY2Ugc2VxLCBpbnQgaW5kZXgsCiAgICAgICAgICAgICBpbnQgY29kZVBvaW50T2Zmc2V0KSB7CkBAIC0xOTcyLDM0ICsyMTkwLDM0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGV0ZXJtaW5lcyB0aGUgaW5kZXggaW50byB0aGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB0aGF0IGlzIG9mZnNldAotICAgICAqIChtZWFzdXJlZCBpbiBjb2RlIHBvaW50cyBhbmQgc3BlY2lmaWVkIGJ5IDxjb2RlPmNvZGVQb2ludE9mZnNldDwvY29kZT4pLAotICAgICAqIGZyb20gdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBhcmd1bWVudCBhbmQgaXMgd2l0aGluIHRoZSBzdWJzZXF1ZW5jZSBhcwotICAgICAqIGRlbGluZWF0ZWQgYnkgPGNvZGU+c3RhcnQ8L2NvZGU+IGFuZCA8Y29kZT5jb3VudDwvY29kZT4uCi0gICAgICogPC9wPgorICAgICAqIERldGVybWluZXMgdGhlIGluZGV4IGluIGEgc3Vic2VxdWVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiB0aGF0IGlzIG9mZnNldCB7QGNvZGUgY29kZVBvaW50T2Zmc2V0fSBjb2RlIHBvaW50cyBmcm9tIHtAY29kZSBpbmRleH0uCisgICAgICogVGhlIHN1YnNlcXVlbmNlIGlzIGRlbGluZWF0ZWQgYnkge0Bjb2RlIHN0YXJ0fSBhbmQge0Bjb2RlIGNvdW50fS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VxIFRoZSA8Y29kZT5jaGFyW108L2NvZGU+IHRvIGZpbmQgdGhlIGluZGV4IHdpdGhpbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGJlZ2luIGZyb20sIHdpdGhpbiB0aGUgPGNvZGU+Y2hhcltdPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gY29kZVBvaW50T2Zmc2V0IFRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdG8gbG9vayBiYWNrIG9yCi0gICAgICogICAgICAgIGZvcndhcmRzOyBtYXkgYmUgYSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluY2x1c2l2ZSBpbmRleCB0aGF0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICogICAgICAgIHN1YnNlcXVlbmNlLgotICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlcyB0byBpbmNsdWRlIHdpdGhpbgotICAgICAqICAgICAgICB0aGUgc3Vic2VxdWVuY2UuCi0gICAgICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCBpbmRleCB0aGF0IGlzIDxjb2RlPmNvZGVQb2ludE9mZnNldDwvY29kZT4gY29kZQotICAgICAqICAgICAgICAgcG9pbnRzIGZyb20gPGNvZGU+aW5kZXg8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+c2VxPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yCi0gICAgICogICAgICAgICA8Y29kZT5jb3VudDwvY29kZT4gaXMgbmVnYXRpdmUsIDxjb2RlPnN0YXJ0ICsgY291bnQ8L2NvZGU+Ci0gICAgICogICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+c2VxLmxlbmd0aDwvY29kZT4sIDxjb2RlPmluZGV4PC9jb2RlPiBpcwotICAgICAqICAgICAgICAgbGVzcyB0aGFuIDxjb2RlPnN0YXJ0PC9jb2RlPiwgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGdyZWF0ZXIKLSAgICAgKiAgICAgICAgIHRoYW4gPGNvZGU+c3RhcnQgKyBjb3VudDwvY29kZT4gb3IgdGhlcmUgYXJlbid0IGVub3VnaCB2YWx1ZXMKLSAgICAgKiAgICAgICAgIGluIDxjb2RlPnNlcTwvY29kZT4gYWZ0ZXIgPGNvZGU+aW5kZXg8L2NvZGU+IG9yIGJlZm9yZQotICAgICAqICAgICAgICAgPGNvZGU+aW5kZXg8L2NvZGU+IGlmIDxjb2RlPmNvZGVQb2ludE9mZnNldDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcGFyYW0gc2VxCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIGZpbmQgdGhlIGluZGV4IGluLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIGluY2x1c2l2ZSBpbmRleCB0aGF0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICogICAgICAgICAgICBzdWJzZXF1ZW5jZS4KKyAgICAgKiBAcGFyYW0gY291bnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Yge0Bjb2RlIGNoYXJ9IHZhbHVlcyB0byBpbmNsdWRlIHdpdGhpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHN1YnNlcXVlbmNlLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IGluIHRoZSBzdWJzZXF1ZW5jZSBvZiB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gY29kZVBvaW50T2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRvIGxvb2sgYmFja3dhcmRzIG9yIGZvcndhcmRzOyBtYXkKKyAgICAgKiAgICAgICAgICAgIGJlIGEgbmVnYXRpdmUgb3IgcG9zaXRpdmUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggaW4ge0Bjb2RlIHNlcX0gdGhhdCBpcyB7QGNvZGUgY29kZVBvaW50T2Zmc2V0fSBjb2RlCisgICAgICogICAgICAgICBwb2ludHMgYXdheSBmcm9tIHtAY29kZSBpbmRleH0uCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBjb3VudCA8IDB9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBpbmRleCA8IHN0YXJ0fSwge0Bjb2RlIGluZGV4ID4gc3RhcnQgKyBjb3VudH0sCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHN0YXJ0ICsgY291bnR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHNlcX0sIG9yIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHZhbHVlcyBpbgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBzZXF9IHRvIHNraXAge0Bjb2RlIGNvZGVQb2ludE9mZnNldH0gY29kZSBwb2ludHMKKyAgICAgKiAgICAgICAgICAgICBmb3J3YXJkIG9yIGJhY2t3YXJkIChpZiB7QGNvZGUgY29kZVBvaW50T2Zmc2V0fSBpcworICAgICAqICAgICAgICAgICAgIG5lZ2F0aXZlKSBmcm9tIHtAY29kZSBpbmRleH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgb2Zmc2V0QnlDb2RlUG9pbnRzKGNoYXJbXSBzZXEsIGludCBzdGFydCwgaW50IGNvdW50LAogICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29kZVBvaW50T2Zmc2V0KSB7CkBAIC0yMDU1LDE3ICsyMjczLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udmVuaWVudCBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiBjaGFyYWN0ZXIgPGNvZGU+YzwvY29kZT4gaW4KLSAgICAgKiB0aGUgc3VwcGxpZWQgcmFkaXguIFRoZSB2YWx1ZSBvZiA8Y29kZT5yYWRpeDwvY29kZT4gbXVzdCBiZSBiZXR3ZWVuCi0gICAgICogTUlOX1JBRElYIGFuZCBNQVhfUkFESVguCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKKyAgICAgKiB7QGNvZGUgY30gaW4gdGhlIHN1cHBsaWVkIHJhZGl4LiBUaGUgdmFsdWUgb2Yge0Bjb2RlIHJhZGl4fSBtdXN0IGJlCisgICAgICogYmV0d2VlbiBNSU5fUkFESVggYW5kIE1BWF9SQURJWC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mLgogICAgICAqIEBwYXJhbSByYWRpeAotICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4Ci0gICAgICogQHJldHVybiBpZiA8Y29kZT5yYWRpeDwvY29kZT4gbGllcyBiZXR3ZWVuIHtAbGluayAjTUlOX1JBRElYfSBhbmQKLSAgICAgKiAgICAgICAgIHtAbGluayAjTUFYX1JBRElYfSB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSByYWRpeCwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSAtMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB7QGNvZGUgY30gaW4ge0Bjb2RlIHJhZGl4fSBpZiB7QGNvZGUgcmFkaXh9IGxpZXMKKyAgICAgKiAgICAgICAgIGJldHdlZW4ge0BsaW5rICNNSU5fUkFESVh9IGFuZCB7QGxpbmsgI01BWF9SQURJWH07IC0xIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBkaWdpdChjaGFyIGMsIGludCByYWRpeCkgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTIwOTcsMzUgKzIzMTUsMzMgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogQ29udmVuaWVudCBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiBjaGFyYWN0ZXIKLSAgICAgKiA8Y29kZT5jb2RlUG9pbnQ8L2NvZGU+IGluIHRoZSBzdXBwbGllZCByYWRpeC4gVGhlIHZhbHVlIG9mCi0gICAgICogPGNvZGU+cmFkaXg8L2NvZGU+IG11c3QgYmUgYmV0d2VlbiBNSU5fUkFESVggYW5kIE1BWF9SQURJWC4KKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICoge0Bjb2RlIGNvZGVQb2ludH0gaW4gdGhlIHN1cHBsaWVkIHJhZGl4LiBUaGUgdmFsdWUgb2Yge0Bjb2RlIHJhZGl4fSBtdXN0CisgICAgICogYmUgYmV0d2VlbiBNSU5fUkFESVggYW5kIE1BWF9SQURJWC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzLgogICAgICAqIEBwYXJhbSByYWRpeAotICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4Ci0gICAgICogQHJldHVybiBpZiA8Y29kZT5yYWRpeDwvY29kZT4gbGllcyBiZXR3ZWVuIHtAbGluayAjTUlOX1JBRElYfSBhbmQKLSAgICAgKiAgICAgICAgIHtAbGluayAjTUFYX1JBRElYfSB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSByYWRpeCwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSAtMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeC4KKyAgICAgKiBAcmV0dXJuIGlmIHtAY29kZSByYWRpeH0gbGllcyBiZXR3ZWVuIHtAbGluayAjTUlOX1JBRElYfSBhbmQKKyAgICAgKiAgICAgICAgIHtAbGluayAjTUFYX1JBRElYfSB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSByYWRpeDsKKyAgICAgKiAgICAgICAgIC0xIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBkaWdpdChpbnQgY29kZVBvaW50LCBpbnQgcmFkaXgpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuZGlnaXQoY29kZVBvaW50LCByYWRpeCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudAotICAgICAqIHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyBjYXNlLCB0aGUgYXJndW1lbnQgbXVzdCBhbHNvIGJlIGEgQ2hhcmFjdGVyLCBhbmQgdGhlIHJlY2VpdmVyIGFuZAotICAgICAqIGFyZ3VtZW50IG11c3QgcmVwcmVzZW50IHRoZSBzYW1lIGNoYXIgdmFsdWUuCisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgaW5kaWNhdGVzIGlmIHRoZXkgYXJlCisgICAgICogZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb2JqZWN0fSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCisgICAgICoge0Bjb2RlIENoYXJhY3Rlcn0gYW5kIGhhdmUgdGhlIHNhbWUgY2hhciB2YWx1ZSBhcyB0aGlzIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0Ci0gICAgICogCi0gICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIGRvdWJsZSB3aXRoLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBDaGFyYWN0ZXJ9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtMjEzNCwxNCArMjM1MCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciB3aGljaCByZXByZXNlbnRzIHRoZSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIHJhZGl4LgotICAgICAqIFRoZSByYWRpeCBtdXN0IGJlIGJldHdlZW4gTUlOX1JBRElYIGFuZCBNQVhfUkFESVggaW5jbHVzaXZlLgorICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciB3aGljaCByZXByZXNlbnRzIHRoZSBzcGVjaWZpZWQgZGlnaXQgaW4gdGhlCisgICAgICogc3BlY2lmaWVkIHJhZGl4LiBUaGUge0Bjb2RlIHJhZGl4fSBtdXN0IGJlIGJldHdlZW4ge0Bjb2RlIE1JTl9SQURJWH0gYW5kCisgICAgICoge0Bjb2RlIE1BWF9SQURJWH0gaW5jbHVzaXZlOyB7QGNvZGUgZGlnaXR9IG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZAorICAgICAqIHNtYWxsZXIgdGhhbiB7QGNvZGUgcmFkaXh9LiBJZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBkb2VzIG5vdCBob2xkLCAwCisgICAgICogaXMgcmV0dXJuZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpZ2l0Ci0gICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUuCiAgICAgICogQHBhcmFtIHJhZGl4Ci0gICAgICogICAgICAgICAgICB0aGUgcmFkaXgKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmFsdWUgaW4gdGhlIHJhZGl4CisgICAgICogICAgICAgICAgICB0aGUgcmFkaXguCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHdoaWNoIHJlcHJlc2VudHMgdGhlIHtAY29kZSBkaWdpdH0gaW4gdGhlCisgICAgICogICAgICAgICB7QGNvZGUgcmFkaXh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2hhciBmb3JEaWdpdChpbnQgZGlnaXQsIGludCByYWRpeCkgewogICAgICAgICBpZiAoTUlOX1JBRElYIDw9IHJhZGl4ICYmIHJhZGl4IDw9IE1BWF9SQURJWCkgewpAQCAtMjE1MywxMiArMjM3NCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIFVuaWNvZGUgY2hhcmFjdGVyLgorICAgICAqIEdldHMgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBVbmljb2RlIGNoYXJhY3Rlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gYSBudW1lcmljIGludCB2YWx1ZSA+PSAwLCAtMSBpZiB0aGVyZSBpcyBubyBudW1lcmljIHZhbHVlLCAtMiBpZgotICAgICAqICAgICAgICAgdGhlIG51bWVyaWMgdmFsdWUgaXMgbm90IGFuIGludCA+PSAwCisgICAgICogICAgICAgICAgICB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdG8gZ2V0IHRoZSBudW1lcmljIHZhbHVlIG9mLgorICAgICAqIEByZXR1cm4gYSBub24tbmVnYXRpdmUgbnVtZXJpYyBpbnRlZ2VyIHZhbHVlIGlmIGEgbnVtZXJpYyB2YWx1ZSBmb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBjfSBleGlzdHMsIC0xIGlmIHRoZXJlIGlzIG5vIG51bWVyaWMgdmFsdWUgZm9yIHtAY29kZSBjfSwKKyAgICAgKiAgICAgICAgIC0yIGlmIHRoZSBudW1lcmljIHZhbHVlIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgd2l0aCBhbiBpbnRlZ2VyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE51bWVyaWNWYWx1ZShjaGFyIGMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0yMTkzLDEyICsyNDE2LDE3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIFVuaWNvZGUgY2hhcmFjdGVyLgorICAgICAqIEdldHMgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBVbmljb2RlIGNvZGUgcG9pbnQuIEZvciBleGFtcGxlLAorICAgICAqIHRoZSBjb2RlIHBvaW50ICdcdTIxNkInIHN0YW5kcyBmb3IgdGhlIFJvbWFuIG51bWJlciBYSUksIHdoaWNoIGhhcyB0aGUKKyAgICAgKiBudW1lcmljIHZhbHVlIDEyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIGEgbnVtZXJpYyBpbnQgdmFsdWUgd2hpY2ggaXMgbm90IG5lZ2F0aXZlLCAtMSBpZiB0aGVyZSBpcyBubyBudW1lcmljIHZhbHVlLCAtMiBpZgotICAgICAqICAgICAgICAgdGhlIG51bWVyaWMgdmFsdWUgaXMgbmVnYXRpdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gZ2V0IHRoZSBudW1lcmljIHZhbHVlIG9mLgorICAgICAqIEByZXR1cm4gYSBub24tbmVnYXRpdmUgbnVtZXJpYyBpbnRlZ2VyIHZhbHVlIGlmIGEgbnVtZXJpYyB2YWx1ZSBmb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBjb2RlUG9pbnR9IGV4aXN0cywgLTEgaWYgdGhlcmUgaXMgbm8gbnVtZXJpYyB2YWx1ZSBmb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBjb2RlUG9pbnR9LCAtMiBpZiB0aGUgbnVtZXJpYyB2YWx1ZSBjYW4gbm90IGJlCisgICAgICogICAgICAgICByZXByZXNlbnRlZCB3aXRoIGFuIGludGVnZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtZXJpY1ZhbHVlKGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKGNvZGVQb2ludCk7CkBAIC0yMjA4LDggKzI0MzYsOSBAQAogICAgICAqIEdldHMgdGhlIGdlbmVyYWwgVW5pY29kZSBjYXRlZ29yeSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gZ2V0IHRoZSBjYXRlZ29yeSBvZi4KKyAgICAgKiBAcmV0dXJuIHRoZSBVbmljb2RlIGNhdGVnb3J5IG9mIHtAY29kZSBjfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlKGNoYXIgYykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTIyMjgsMTcgKzI0NTcsMTggQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ2VuZXJhbCBVbmljb2RlIGNhdGVnb3J5IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLgorICAgICAqIEdldHMgdGhlIGdlbmVyYWwgVW5pY29kZSBjYXRlZ29yeSBvZiB0aGUgc3BlY2lmaWVkIGNvZGUgcG9pbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvZGVQb2ludAotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciwgaW5jbHVkaW5nIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gZ2V0IHRoZSBjYXRlZ29yeSBvZi4KKyAgICAgKiBAcmV0dXJuIHRoZSBVbmljb2RlIGNhdGVnb3J5IG9mIHtAY29kZSBjb2RlUG9pbnR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGUoaW50IGNvZGVQb2ludCkgewogICAgICAgICBpbnQgdHlwZSA9IFVDaGFyYWN0ZXIuZ2V0VHlwZShjb2RlUG9pbnQpOwogCiAgICAgICAgIC8vIHRoZSB0eXBlIHZhbHVlcyByZXR1cm5lZCBieSBVQ2hhcmFjdGVyIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHdoYXQKLSAgICAgICAgLy8gdGhlIHNwZWMgc2F5cy4gUkkncyBDaGFyYWN0ZXIgdHlwZSB2YWx1ZXMgc2tpcCB0aGUgdmFsdWUgMTcuCisgICAgICAgIC8vIHRoZSBzcGVjIHNheXMuUkkncyBDaGFyYWN0ZXIgdHlwZSB2YWx1ZXMgc2tpcCB0aGUgdmFsdWUgMTcuCiAgICAgICAgIGlmICh0eXBlIDw9IENoYXJhY3Rlci5GT1JNQVQpIHsKICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICB9CkBAIC0yMjQ5LDggKzI0NzksOSBAQAogICAgICAqIEdldHMgdGhlIFVuaWNvZGUgZGlyZWN0aW9uYWxpdHkgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBVbmljb2RlIGRpcmVjdGlvbmFsaXR5CisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGdldCB0aGUgZGlyZWN0aW9uYWxpdHkgb2YuCisgICAgICogQHJldHVybiB0aGUgVW5pY29kZSBkaXJlY3Rpb25hbGl0eSBvZiB7QGNvZGUgY30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlIGdldERpcmVjdGlvbmFsaXR5KGNoYXIgYykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTIyNzIsOCArMjUwMyw5IEBACiAgICAgICogR2V0cyB0aGUgVW5pY29kZSBkaXJlY3Rpb25hbGl0eSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0aGUgVW5pY29kZSBkaXJlY3Rpb25hbGl0eQorICAgICAqICAgICAgICAgICAgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB0byBnZXQgdGhlIGRpcmVjdGlvbmFsaXR5IG9mLgorICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgZGlyZWN0aW9uYWxpdHkgb2Yge0Bjb2RlIGNvZGVQb2ludH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlIGdldERpcmVjdGlvbmFsaXR5KGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgaWYgKGdldFR5cGUoY29kZVBvaW50KSA9PSBDaGFyYWN0ZXIuVU5BU1NJR05FRCkgewpAQCAtMjI4OCwxMSArMjUyMCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBtaXJyb3JlZAorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG1pcnJvcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbWlycm9yZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY30gaXMgbWlycm9yZWQ7IHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZChjaGFyIGMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0yMzA3LDM4ICsyNTQxLDMyIEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBtaXJyb3JlZAorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyBtaXJyb3JlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbWlycm9yZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgbWlycm9yZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZChpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiBVQ2hhcmFjdGVyLmlzTWlycm9yZWQoY29kZVBvaW50KTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gb2JqZWN0cyB3aGljaAotICAgICAqIGFuc3dlciA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZQorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUKICAgICAgKiBzcGVjaWZpY2F0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnZW5lcmFsIFVuaWNvZGUgY2F0ZWdvcnkgb2YgdGhlIGNoYXJhY3RlciBpcyBub3QKLSAgICAgKiAgICAgICAgIFVOQVNTSUdORUQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2VuZXJhbCBVbmljb2RlIGNhdGVnb3J5IG9mIHRoZSBjaGFyYWN0ZXIgaXMKKyAgICAgKiAgICAgICAgIG5vdCB7QGNvZGUgVU5BU1NJR05FRH07IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlZmluZWQoY2hhciBjKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMjM0OCwyNCArMjU3NiwyNyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZQorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyBkZWZpbmVkIGluIHRoZSBVbmljb2RlCiAgICAgICogc3BlY2lmaWNhdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnZW5lcmFsIFVuaWNvZGUgY2F0ZWdvcnkgb2YgdGhlIGNoYXJhY3RlciBpcyBub3QKLSAgICAgKiAgICAgICAgIFVOQVNTSUdORUQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdlbmVyYWwgVW5pY29kZSBjYXRlZ29yeSBvZiB0aGUgY29kZSBwb2ludCBpcworICAgICAqICAgICAgICAgbm90IHtAY29kZSBVTkFTU0lHTkVEfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVmaW5lZChpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiBVQ2hhcmFjdGVyLmlzRGVmaW5lZChjb2RlUG9pbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgZGlnaXQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBkaWdpdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgYSBkaWdpdCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjfSBpcyBhIGRpZ2l0OyB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoY2hhciBjKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMjM4MiwyMyArMjYxMywyNiBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIGRpZ2l0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyBhIGRpZ2l0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGEgZGlnaXQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgYSBkaWdpdDsge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RpZ2l0KGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuaXNEaWdpdChjb2RlUG9pbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBpZ25vcmFibGUgaW4gYSBKYXZhIG9yIFVuaWNvZGUKLSAgICAgKiBpZGVudGlmaWVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGlnbm9yYWJsZSBpbiBhIEphdmEgb3IKKyAgICAgKiBVbmljb2RlIGlkZW50aWZpZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGlnbm9yYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjfSBpcyBpZ25vcmFibGU7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lkZW50aWZpZXJJZ25vcmFibGUoY2hhciBjKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMjQwOSw0OSArMjY0Myw1NCBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgaWdub3JhYmxlIGluIGEgSmF2YSBvciBVbmljb2RlCi0gICAgICogaWRlbnRpZmllci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvZGUgcG9pbnQgaXMgaWdub3JhYmxlIGluIGEgSmF2YSBvcgorICAgICAqIFVuaWNvZGUgaWRlbnRpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGNoYXJhY3RlciBpcyBpZ25vcmFibGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgaWdub3JhYmxlOyB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSWRlbnRpZmllcklnbm9yYWJsZShpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiBVQ2hhcmFjdGVyLmlzSWRlbnRpZmllcklnbm9yYWJsZShjb2RlUG9pbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGFuIElTTyBjb250cm9sIGNoYXJhY3Rlci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhbiBJU08gY29udHJvbCBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmM8L2NvZGU+IGlzIGFuIElTTyBjb250cm9sCi0gICAgICogICAgICAgICBjaGFyYWN0ZXIsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIGFuIElTTyBjb250cm9sIGNoYXJhY3RlcjsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lTT0NvbnRyb2woY2hhciBjKSB7CiAgICAgICAgIHJldHVybiBpc0lTT0NvbnRyb2woKGludCljKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhbiBJU08gY29udHJvbCBjaGFyYWN0ZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2RlIHBvaW50IGlzIGFuIElTTyBjb250cm9sIGNoYXJhY3Rlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciwgaW5jbHVkaW5nIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+YzwvY29kZT4gaXMgYW4gSVNPIGNvbnRyb2wKLSAgICAgKiAgICAgICAgIGNoYXJhY3Rlciwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIGFuIElTTyBjb250cm9sIGNoYXJhY3RlcjsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lTT0NvbnRyb2woaW50IGMpIHsKICAgICAgICAgcmV0dXJuIChjID49IDAgJiYgYyA8PSAweDFmKSB8fCAoYyA+PSAweDdmICYmIGMgPD0gMHg5Zik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBwYXJ0IG9mIGEgVW5pY29kZSBpZGVudGlmaWVyIGFzCi0gICAgICogb3RoZXIgdGhhbiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgcGFydCBvZiBhIEphdmEKKyAgICAgKiBpZGVudGlmaWVyIG90aGVyIHRoYW4gdGhlIGZpcnN0IGNoYXJhY3Rlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgcGFydCBvZiBhIEphdmEgaWRlbnRpZmllciwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY30gaXMgdmFsaWQgYXMgcGFydCBvZiBhIEphdmEgaWRlbnRpZmllcjsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZGVudGlmaWVyUGFydChjaGFyIGMpIHsKICAgICAgICAgLy8gT3B0aW1pemVkIGNhc2UgZm9yIEFTQ0lJCkBAIC0yNDY4LDEzICsyNzA3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBwYXJ0IG9mIGEgVW5pY29kZSBpZGVudGlmaWVyIGFzCi0gICAgICogb3RoZXIgdGhhbiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyBhIHZhbGlkIHBhcnQgb2YgYSBKYXZhCisgICAgICogaWRlbnRpZmllciBvdGhlciB0aGFuIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvZGVQb2ludAotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciwgaW5jbHVkaW5nIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgcGFydCBvZiBhIEphdmEgaWRlbnRpZmllciwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIHZhbGlkIGFzIHBhcnQgb2YgYSBKYXZhIGlkZW50aWZpZXI7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclBhcnQoaW50IGNvZGVQb2ludCkgewogICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUoY29kZVBvaW50KTsKQEAgLTI0ODYsMTIgKzI3MjYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIHZhbGlkIHN0YXJ0IG9mIGEgVW5pY29kZSBpZGVudGlmaWVyCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBmaXJzdCBjaGFyYWN0ZXIgZm9yCisgICAgICogYSBKYXZhIGlkZW50aWZpZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGEgdmFsaWQgc3RhcnQgb2YgYSBKYXZhIGlkZW50aWZpZXIsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIGEgdmFsaWQgZmlyc3QgY2hhcmFjdGVyIG9mIGEgSmF2YQorICAgICAqICAgICAgICAgaWRlbnRpZmllcjsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyIGMpIHsKICAgICAgICAgLy8gT3B0aW1pemVkIGNhc2UgZm9yIEFTQ0lJCkBAIC0yNTA2LDEyICsyNzQ4LDE0IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgdmFsaWQgc3RhcnQgb2YgYSBVbmljb2RlIGlkZW50aWZpZXIKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvZGUgcG9pbnQgaXMgYSB2YWxpZCBzdGFydCBmb3IgYSBKYXZhCisgICAgICogaWRlbnRpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGNoYXJhY3RlciBpcyBhIHZhbGlkIHN0YXJ0IG9mIGEgSmF2YSBpZGVudGlmaWVyLAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29kZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyBhIHZhbGlkIHN0YXJ0IG9mIGEgSmF2YQorICAgICAqICAgICAgICAgaWRlbnRpZmllcjsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJTdGFydChpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIGludCB0eXBlID0gZ2V0VHlwZShjb2RlUG9pbnQpOwpAQCAtMjUyMCw5ICsyNzY0LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYSBKYXZhIGxldHRlci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIEphdmEgbGV0dGVyLgogICAgICAqIAorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjfSBpcyBhIEphdmEgbGV0dGVyOyB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUxldHRlcihjaGFyIGMpIHsKQEAgLTI1MzAsOSArMjc3OSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgSmF2YSBsZXR0ZXIgb3IgZGlnaXQgY2hhcmFjdGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgSmF2YSBsZXR0ZXIgb3IgZGlnaXQKKyAgICAgKiBjaGFyYWN0ZXIuCiAgICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIGEgSmF2YSBsZXR0ZXIgb3IgZGlnaXQ7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNpc0phdmFJZGVudGlmaWVyUGFydChjaGFyKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFMZXR0ZXJPckRpZ2l0KGNoYXIgYykgewpAQCAtMjU0MCwxMSArMjc5NSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgbGV0dGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgbGV0dGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGNoYXJhY3RlciBpcyBhIGxldHRlciwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjfSBpcyBhIGxldHRlcjsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyKGNoYXIgYykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTI1NjEsMjIgKzI4MTcsMjYgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYSBsZXR0ZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2RlIHBvaW50IGlzIGEgbGV0dGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGEgbGV0dGVyLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHBvaW50IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjb2RlUG9pbnR9IGlzIGEgbGV0dGVyOyB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyKGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuaXNMZXR0ZXIoY29kZVBvaW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIGxldHRlciBvciBhIGRpZ2l0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgbGV0dGVyIG9yIGEgZGlnaXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGEgbGV0dGVyIG9yIGEgZGlnaXQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY30gaXMgYSBsZXR0ZXIgb3IgYSBkaWdpdDsge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xldHRlck9yRGlnaXQoY2hhciBjKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMjU4OCwyMiArMjg0OCwyNiBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIGxldHRlciBvciBhIGRpZ2l0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyBhIGxldHRlciBvciBhIGRpZ2l0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGEgbGV0dGVyIG9yIGEgZGlnaXQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgYSBsZXR0ZXIgb3IgYSBkaWdpdDsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xldHRlck9yRGlnaXQoaW50IGNvZGVQb2ludCkgewogICAgICAgICByZXR1cm4gVUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY29kZVBvaW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIGxvd2VyIGNhc2UgbGV0dGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgbG93ZXIgY2FzZSBsZXR0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY30gaXMgYSBsb3dlciBjYXNlIGxldHRlcjsge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvd2VyQ2FzZShjaGFyIGMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0yNjIxLDIwICsyODg1LDI3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgbG93ZXIgY2FzZSBsZXR0ZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2RlIHBvaW50IGlzIGEgbG93ZXIgY2FzZSBsZXR0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvZGVQb2ludAotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciwgaW5jbHVkaW5nIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgYSBsb3dlciBjYXNlIGxldHRlciwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29kZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyBhIGxvd2VyIGNhc2UgbGV0dGVyOworICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93ZXJDYXNlKGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY29kZVBvaW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIEphdmEgc3BhY2UuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBKYXZhIHNwYWNlLgogICAgICAqIAorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjfSBpcyBhIEphdmEgc3BhY2U7IHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNpc1doaXRlc3BhY2UoY2hhcil9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGMpIHsKQEAgLTI2NDIsMTQgKzI5MTMsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIFVuaWNvZGUgc3BhY2UgY2hhcmFjdGVyLiBBIG1lbWJlciBvZgotICAgICAqIG9uZSBvZiB0aGUgVW5pY29kZSBjYXRlZ29yaWVzIFNwYWNlIFNlcGFyYXRvciwgTGluZSBTZXBhcmF0b3IsIG9yCi0gICAgICogUGFyYWdyYXBoIFNlcGFyYXRvci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIFVuaWNvZGUgc3BhY2UgY2hhcmFjdGVyLgorICAgICAqIFRoYXQgaXMsIGlmIGl0IGlzIGEgbWVtYmVyIG9mIG9uZSBvZiB0aGUgVW5pY29kZSBjYXRlZ29yaWVzIFNwYWNlCisgICAgICogU2VwYXJhdG9yLCBMaW5lIFNlcGFyYXRvciwgb3IgUGFyYWdyYXBoIFNlcGFyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgYSBVbmljb2RlIHNwYWNlIGNoYXJhY3RlciwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY30gaXMgYSBVbmljb2RlIHNwYWNlIGNoYXJhY3RlciwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlQ2hhcihjaGFyIGMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0yNjY2LDI2ICsyOTM4LDI4IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgVW5pY29kZSBzcGFjZSBjaGFyYWN0ZXIuIEEgbWVtYmVyIG9mCi0gICAgICogb25lIG9mIHRoZSBVbmljb2RlIGNhdGVnb3JpZXMgU3BhY2UgU2VwYXJhdG9yLCBMaW5lIFNlcGFyYXRvciwgb3IKLSAgICAgKiBQYXJhZ3JhcGggU2VwYXJhdG9yLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyBhIFVuaWNvZGUgc3BhY2UgY2hhcmFjdGVyLgorICAgICAqIFRoYXQgaXMsIGlmIGl0IGlzIGEgbWVtYmVyIG9mIG9uZSBvZiB0aGUgVW5pY29kZSBjYXRlZ29yaWVzIFNwYWNlCisgICAgICogU2VwYXJhdG9yLCBMaW5lIFNlcGFyYXRvciwgb3IgUGFyYWdyYXBoIFNlcGFyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGNoYXJhY3RlciBpcyBhIFVuaWNvZGUgc3BhY2UgY2hhcmFjdGVyLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29kZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyBhIFVuaWNvZGUgc3BhY2UgY2hhcmFjdGVyLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3BhY2VDaGFyKGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoY29kZVBvaW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIHRpdGxlY2FzZSBjaGFyYWN0ZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB0aXRsZWNhc2UgY2hhcmFjdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGNoYXJhY3RlciBpcyBhIHRpdGxlY2FzZSBjaGFyYWN0ZXIsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIGEgdGl0bGVjYXNlIGNoYXJhY3Rlciwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RpdGxlQ2FzZShjaGFyIGMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0yNzA2LDI1ICsyOTgwLDI3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgdGl0bGVjYXNlIGNoYXJhY3Rlci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvZGUgcG9pbnQgaXMgYSB0aXRsZWNhc2UgY2hhcmFjdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGEgdGl0bGVjYXNlIGNoYXJhY3RlciwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgYSB0aXRsZWNhc2UgY2hhcmFjdGVyLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGl0bGVDYXNlKGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuaXNUaXRsZUNhc2UoY29kZVBvaW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyB2YWxpZCBhcyBwYXJ0IG9mIGEgVW5pY29kZSBpZGVudGlmaWVyIGFzCi0gICAgICogb3RoZXIgdGhhbiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIHZhbGlkIGFzIHBhcnQgb2YgYSBVbmljb2RlCisgICAgICogaWRlbnRpZmllciBvdGhlciB0aGFuIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIHZhbGlkIGFzIHBhcnQgb2YgYSBVbmljb2RlIGlkZW50aWZpZXIsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIHZhbGlkIGFzIHBhcnQgb2YgYSBVbmljb2RlCisgICAgICogICAgICAgICBpZGVudGlmaWVyOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmljb2RlSWRlbnRpZmllclBhcnQoY2hhciBjKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMjczOSwyNiArMzAxNSwyOCBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyB2YWxpZCBhcyBwYXJ0IG9mIGEgVW5pY29kZSBpZGVudGlmaWVyIGFzCi0gICAgICogb3RoZXIgdGhhbiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyB2YWxpZCBhcyBwYXJ0IG9mIGEgVW5pY29kZQorICAgICAqIGlkZW50aWZpZXIgb3RoZXIgdGhhbiB0aGUgZmlyc3QgY2hhcmFjdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIHZhbGlkIGFzIHBhcnQgb2YgYSBVbmljb2RlIGlkZW50aWZpZXIsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHBvaW50IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjb2RlUG9pbnR9IGlzIHZhbGlkIGFzIHBhcnQgb2YgYSBVbmljb2RlCisgICAgICogICAgICAgICBpZGVudGlmaWVyOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmljb2RlSWRlbnRpZmllclBhcnQoaW50IGNvZGVQb2ludCkgewogICAgICAgICByZXR1cm4gVUNoYXJhY3Rlci5pc1VuaWNvZGVJZGVudGlmaWVyUGFydChjb2RlUG9pbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgdmFsaWQgaW5pdGlhbCBjaGFyYWN0ZXIgZm9yIGEgVW5pY29kZQotICAgICAqIGlkZW50aWZpZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBpbml0aWFsIGNoYXJhY3RlcgorICAgICAqIGZvciBhIFVuaWNvZGUgaWRlbnRpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBzdGFydCBvZiBhIFVuaWNvZGUgaWRlbnRpZmllciwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY30gaXMgYSB2YWxpZCBmaXJzdCBjaGFyYWN0ZXIgZm9yIGEKKyAgICAgKiAgICAgICAgIFVuaWNvZGUgaWRlbnRpZmllcjsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pY29kZUlkZW50aWZpZXJTdGFydChjaGFyIGMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0yNzcwLDI0ICszMDQ4LDI3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgdmFsaWQgaW5pdGlhbCBjaGFyYWN0ZXIgZm9yIGEgVW5pY29kZQotICAgICAqIGlkZW50aWZpZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2RlIHBvaW50IGlzIGEgdmFsaWQgaW5pdGlhbCBjaGFyYWN0ZXIKKyAgICAgKiBmb3IgYSBVbmljb2RlIGlkZW50aWZpZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvZGVQb2ludAotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciwgaW5jbHVkaW5nIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBzdGFydCBvZiBhIFVuaWNvZGUgaWRlbnRpZmllciwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGNvZGVQb2ludH0gaXMgYSB2YWxpZCBmaXJzdCBjaGFyYWN0ZXIgZm9yCisgICAgICogICAgICAgICBhIFVuaWNvZGUgaWRlbnRpZmllcjsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pY29kZUlkZW50aWZpZXJTdGFydChpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiBVQ2hhcmFjdGVyLmlzVW5pY29kZUlkZW50aWZpZXJTdGFydChjb2RlUG9pbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGFuIHVwcGVyIGNhc2UgbGV0dGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGFuIHVwcGVyIGNhc2UgbGV0dGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGNoYXJhY3RlciBpcyBhIHVwcGVyIGNhc2UgbGV0dGVyLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGN9IGlzIGEgdXBwZXIgY2FzZSBsZXR0ZXI7IHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcHBlckNhc2UoY2hhciBjKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMjgwNSwyMyArMzA4NiwyNyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhbiB1cHBlciBjYXNlIGxldHRlci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvZGUgcG9pbnQgaXMgYW4gdXBwZXIgY2FzZSBsZXR0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvZGVQb2ludAotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciwgaW5jbHVkaW5nIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgYSB1cHBlciBjYXNlIGxldHRlciwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29kZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyBhIHVwcGVyIGNhc2UgbGV0dGVyOworICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBwZXJDYXNlKGludCBjb2RlUG9pbnQpIHsKICAgICAgICAgcmV0dXJuIFVDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY29kZVBvaW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIEphdmEuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpbgorICAgICAqIEphdmEuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN1cHBsaWVkIDxjb2RlPmM8L2NvZGU+IGlzIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIKLSAgICAgKiAgICAgICAgIGluIEphdmEsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN1cHBsaWVkIHtAY29kZSBjfSBpcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyCisgICAgICogICAgICAgICBpbiBKYXZhOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTI4NDEsMTIgKzMxMjYsMTQgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBKYXZhLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGluCisgICAgICogSmF2YS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXBwbGllZCA8Y29kZT5jPC9jb2RlPiBpcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyCi0gICAgICogICAgICAgICBpbiBKYXZhLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICogICAgICAgICAgICB0aGUgY29kZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpZWQge0Bjb2RlIGN9IGlzIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgIGluIEphdmE7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoaW50IGNvZGVQb2ludCkgewogICAgICAgICAvL0ZJWE1FIGRlcGVuZHMgb24gSUNVIHdoZW4gdGhlIGNvZGVQb2ludCBpcyAnXHUyMDA3JwpAQCAtMjg1NCwyMyArMzE0MSwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGJ5dGVzIGluIGNoYXJhY3RlcgorICAgICAqIFJldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBieXRlIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjaGFyYWN0ZXIuCisgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuICAgIHRoZSBjaGFyYWN0ZXIgd2l0aCByZW9yZGVyZWQgYnl0ZXMuCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIHJldmVyc2UuCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHdpdGggcmVvcmRlcmVkIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2hhciByZXZlcnNlQnl0ZXMoY2hhciBjKSB7CiAgICAgICAgIHJldHVybiAoY2hhcikoKGM8PDgpIHwgKGM+PjgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb3dlciBjYXNlIGVxdWl2YWxlbnQgZm9yIHRoZSBjaGFyYWN0ZXIgd2hlbiB0aGUgY2hhcmFjdGVyIGlzCi0gICAgICogYW4gdXBwZXIgY2FzZSBsZXR0ZXIsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBjaGFyYWN0ZXIuCisgICAgICogUmV0dXJucyB0aGUgbG93ZXIgY2FzZSBlcXVpdmFsZW50IGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpZiB0aGUKKyAgICAgKiBjaGFyYWN0ZXIgaXMgYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE90aGVyd2lzZSwgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMKKyAgICAgKiByZXR1cm5lZCB1bmNoYW5nZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKICAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIGlmIGMgaXMgbm90IGEgbG93ZXIgY2FzZSBjaGFyYWN0ZXIgdGhlbiBpdHMgbG93ZXIgY2FzZQotICAgICAqICAgICAgICAgY291bnRlcnBhcnQsIG90aGVyd2lzZSBqdXN0IGMKKyAgICAgKiBAcmV0dXJuIGlmIHtAY29kZSBjfSBpcyBhbiB1cHBlciBjYXNlIGNoYXJhY3RlciB0aGVuIGl0cyBsb3dlciBjYXNlCisgICAgICogICAgICAgICBjb3VudGVycGFydCwgb3RoZXJ3aXNlIGp1c3Qge0Bjb2RlIGN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2hhciB0b0xvd2VyQ2FzZShjaGFyIGMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0yOTA1LDI0ICszMTk3LDIwIEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvd2VyIGNhc2UgZXF1aXZhbGVudCBmb3IgdGhlIGNoYXJhY3RlciB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMKLSAgICAgKiBhbiB1cHBlciBjYXNlIGxldHRlciwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGNoYXJhY3Rlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBsb3dlciBjYXNlIGVxdWl2YWxlbnQgZm9yIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpZiBpdCBpcworICAgICAqIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiBPdGhlcndpc2UsIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcyByZXR1cm5lZAorICAgICAqIHVuY2hhbmdlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiBpZiBjb2RlUG9pbnQgaXMgbm90IGEgbG93ZXIgY2FzZSBjaGFyYWN0ZXIgdGhlbiBpdHMgbG93ZXIgY2FzZQotICAgICAqICAgICAgICAgY291bnRlcnBhcnQsIG90aGVyd2lzZSBqdXN0IGNvZGVQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyBhbiB1cHBlciBjYXNlIGNoYXJhY3RlciB0aGVuIGl0cyBsb3dlcgorICAgICAqICAgICAgICAgY2FzZSBjb3VudGVycGFydCwgb3RoZXJ3aXNlIGp1c3Qge0Bjb2RlIGNvZGVQb2ludH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgdG9Mb3dlckNhc2UoaW50IGNvZGVQb2ludCkgewogICAgICAgICByZXR1cm4gVUNoYXJhY3Rlci50b0xvd2VyQ2FzZShjb2RlUG9pbnQpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOwpAQCAtMjkzMiwyMCArMzIyMCwyMyBAQAogICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGNvbnZlcnRlZCB0byBhIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoY2hhciB2YWx1ZSkgewogICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpdGxlIGNhc2UgZXF1aXZhbGVudCBmb3IgdGhlIGNoYXJhY3Rlciwgb3RoZXJ3aXNlIHJldHVybnMgdGhlCi0gICAgICogY2hhcmFjdGVyLgorICAgICAqIFJldHVybnMgdGhlIHRpdGxlIGNhc2UgZXF1aXZhbGVudCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaWYgaXQKKyAgICAgKiBleGlzdHMuIE90aGVyd2lzZSwgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0aGUgdGl0bGUgY2FzZSBlcXVpdmFsZW50IG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aXRsZSBjYXNlIGVxdWl2YWxlbnQgb2Yge0Bjb2RlIGN9IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlCisgICAgICogICAgICAgICB7QGNvZGUgY30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjaGFyIHRvVGl0bGVDYXNlKGNoYXIgYykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTI5NjIsMjUgKzMyNTMsMjkgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGl0bGUgY2FzZSBlcXVpdmFsZW50IGZvciB0aGUgY2hhcmFjdGVyLCBvdGhlcndpc2UgcmV0dXJucyB0aGUKLSAgICAgKiBjaGFyYWN0ZXIuCisgICAgICogUmV0dXJucyB0aGUgdGl0bGUgY2FzZSBlcXVpdmFsZW50IGZvciB0aGUgc3BlY2lmaWVkIGNvZGUgcG9pbnQgaWYgaXQKKyAgICAgKiBleGlzdHMuIE90aGVyd2lzZSwgdGhlIHNwZWNpZmllZCBjb2RlIHBvaW50IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0aGUgdGl0bGUgY2FzZSBlcXVpdmFsZW50IG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHBvaW50IHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUgdGl0bGUgY2FzZSBlcXVpdmFsZW50IG9mIHtAY29kZSBjb2RlUG9pbnR9IGlmIGl0IGV4aXN0cywKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSB7QGNvZGUgY29kZVBvaW50fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCB0b1RpdGxlQ2FzZShpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiBVQ2hhcmFjdGVyLnRvVGl0bGVDYXNlKGNvZGVQb2ludCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXBwZXIgY2FzZSBlcXVpdmFsZW50IGZvciB0aGUgY2hhcmFjdGVyIHdoZW4gdGhlIGNoYXJhY3RlciBpcwotICAgICAqIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBjaGFyYWN0ZXIuCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgY2FzZSBlcXVpdmFsZW50IGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpZiB0aGUKKyAgICAgKiBjaGFyYWN0ZXIgaXMgYSBsb3dlciBjYXNlIGxldHRlci4gT3RoZXJ3aXNlLCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcworICAgICAqIHJldHVybmVkIHVuY2hhbmdlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gaWYgYyBpcyBub3QgYW4gdXBwZXIgY2FzZSBjaGFyYWN0ZXIgdGhlbiBpdHMgdXBwZXIgY2FzZQotICAgICAqICAgICAgICAgY291bnRlcnBhcnQsIG90aGVyd2lzZSBqdXN0IGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIGlmIHtAY29kZSBjfSBpcyBhIGxvd2VyIGNhc2UgY2hhcmFjdGVyIHRoZW4gaXRzIHVwcGVyIGNhc2UKKyAgICAgKiAgICAgICAgIGNvdW50ZXJwYXJ0LCBvdGhlcndpc2UganVzdCB7QGNvZGUgY30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjaGFyIHRvVXBwZXJDYXNlKGNoYXIgYykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTMwMTUsMTMgKzMzMTAsMTUgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXBwZXIgY2FzZSBlcXVpdmFsZW50IGZvciB0aGUgY2hhcmFjdGVyIHdoZW4gdGhlIGNoYXJhY3RlciBpcwotICAgICAqIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBjaGFyYWN0ZXIuCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgY2FzZSBlcXVpdmFsZW50IGZvciB0aGUgc3BlY2lmaWVkIGNvZGUgcG9pbnQgaWYgdGhlCisgICAgICogY29kZSBwb2ludCBpcyBhIGxvd2VyIGNhc2UgbGV0dGVyLiBPdGhlcndpc2UsIHRoZSBzcGVjaWZpZWQgY29kZSBwb2ludCBpcworICAgICAqIHJldHVybmVkIHVuY2hhbmdlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiBpZiBjb2RlUG9pbnQgaXMgbm90IGFuIHVwcGVyIGNhc2UgY2hhcmFjdGVyIHRoZW4gaXRzIHVwcGVyIGNhc2UKLSAgICAgKiAgICAgICAgIGNvdW50ZXJwYXJ0LCBvdGhlcndpc2UganVzdCBjb2RlUG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHBvaW50IHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiBpZiB7QGNvZGUgY29kZVBvaW50fSBpcyBhIGxvd2VyIGNhc2UgY2hhcmFjdGVyIHRoZW4gaXRzIHVwcGVyCisgICAgICogICAgICAgICBjYXNlIGNvdW50ZXJwYXJ0LCBvdGhlcndpc2UganVzdCB7QGNvZGUgY29kZVBvaW50fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCB0b1VwcGVyQ2FzZShpbnQgY29kZVBvaW50KSB7CiAgICAgICAgIHJldHVybiBVQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNvZGVQb2ludCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzQ2FzdEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzc0Nhc3RFeGNlcHRpb24uamF2YQppbmRleCA2MDBjZTNmLi4xNDgyYjIxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzQ2FzdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NDYXN0RXhjZXB0aW9uLmphdmEKQEAgLTIwLDQxICsyMCw0NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoaXMgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIGNhc3QgYSBhbiBvYmplY3QKLSAqIHRvIGEgdHlwZSB3aGljaCBpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoLgorICogVGhyb3duIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIGNhc3QgYSBhbiBvYmplY3QgdG8gYSB0eXBlIHdpdGggd2hpY2ggaXQgaXMKKyAqIG5vdCBjb21wYXRpYmxlLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENsYXNzQ2FzdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MjIzMzY1NjUxMDcwNDU4NTMyTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzQ2FzdEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzc0Nhc3RFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZQorICAgICAqIGFuZCBhIGRldGFpbCBtZXNzYWdlIGJhc2VkIG9uIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5zdGFuY2VDbGFzcwotICAgICAqICAgICAgICAgICAgQ2xhc3MgVGhlIGNsYXNzIGJlaW5nIGNhc3QgZnJvbS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBiZWluZyBjYXN0IGZyb20uCiAgICAgICogQHBhcmFtIGNhc3RDbGFzcwotICAgICAqICAgICAgICAgICAgQ2xhc3MgVGhlIGNsYXNzIGJlaW5nIGNhc3QgdG8uCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgYmVpbmcgY2FzdCB0by4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBDbGFzc0Nhc3RFeGNlcHRpb24oQ2xhc3M8Pz4gaW5zdGFuY2VDbGFzcywgQ2xhc3M8Pz4gY2FzdENsYXNzKSB7CiAgICAgICAgIHN1cGVyKE1zZy5nZXRTdHJpbmcoIkswMzQwIiwgaW5zdGFuY2VDbGFzcy5nZXROYW1lKCksIGNhc3RDbGFzcyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzQ2lyY3VsYXJpdHlFcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzc0NpcmN1bGFyaXR5RXJyb3IuamF2YQppbmRleCBhMjMwN2Q5Li42ZGQxYzhlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzQ2lyY3VsYXJpdHlFcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NDaXJjdWxhcml0eUVycm9yLmphdmEKQEAgLTE4LDMxICsxOCwzNyBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIFZNIG5vdGljZXMgdGhhdCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gbG9hZCBhCisgKiBUaHJvd24gd2hlbiB0aGUgdmlydHVhbCBtYWNoaW5lIG5vdGljZXMgdGhhdCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gbG9hZCBhCiAgKiBjbGFzcyB3aGljaCB3b3VsZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluaGVyaXQgZnJvbSBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuCiAgKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4gaW5jb25zaXN0YW50IGNsYXNzIGZpbGVzIGFyZSBiZWluZyBsb2FkZWQsCi0gKiBzaW5jZSB0aGlzIGVycm9yIHdvdWxkIGJlIGRldGVjdGVkIGF0IGNvbXBpbGUgdGltZS4KKyAqIE5vdGUgdGhhdCB0aGlzIGVycm9yIGNhbiBvbmx5IG9jY3VyIHdoZW4gaW5jb25zaXN0ZW50IGNsYXNzIGZpbGVzIGFyZSBsb2FkZWQsCisgKiBzaW5jZSBpdCB3b3VsZCBub3JtYWxseSBiZSBkZXRlY3RlZCBhdCBjb21waWxlIHRpbWUuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2xhc3NDaXJjdWxhcml0eUVycm9yIGV4dGVuZHMgTGlua2FnZUVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEwNTQzNjI1NDI5MTQ1Mzk2ODlMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDbGFzc0NpcmN1bGFyaXR5RXJyb3J9IHRoYXQgaW5jbHVkZSB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzc0NpcmN1bGFyaXR5RXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIENsYXNzQ2lyY3VsYXJpdHlFcnJvcn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzc0NpcmN1bGFyaXR5RXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzRm9ybWF0RXJyb3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NGb3JtYXRFcnJvci5qYXZhCmluZGV4IDZiNmJiOTAuLjI4MmVkNzAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NGb3JtYXRFcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NGb3JtYXRFcnJvci5qYXZhCkBAIC0xNywyOCArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIGVycm9yIGlzIHRocm93biBieSB0aGUgY2xhc3MgbG9hZGVyIHdoZW4gaXQgZGlzY292ZXJzIHRoYXQgYSBjbGFzcyB0aGF0Ci0gKiBpdCBpcyBsb2FkaW5nIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3Qgc2hhcGUuCisgKiBUaHJvd24gYnkgYSBjbGFzcyBsb2FkZXIgd2hlbiBhIGNsYXNzIGZpbGUgaGFzIGFuIGlsbGVnYWwgZm9ybWF0IG9yIGlmIHRoZQorICogZGF0YSB0aGF0IGl0IGNvbnRhaW5zIGNhbiBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBjbGFzcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDbGFzc0Zvcm1hdEVycm9yIGV4dGVuZHMgTGlua2FnZUVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NDIwMTE0ODc5MDExOTQ5MTk1TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2xhc3NGb3JtYXRFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzc0Zvcm1hdEVycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDbGFzc0Zvcm1hdEVycm9yfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzRm9ybWF0RXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDc2N2ZhMDEuLjI2YmRiZjcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCw3ICsxOCw5IEBACiBwYWNrYWdlIGphdmEubGFuZzsKIAogLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIGNsYXNzbG9hZGVyIGlzIHVuYWJsZSB0byBmaW5kIGEgY2xhc3MuCisgKiBUaHJvd24gd2hlbiBhIGNsYXNzIGxvYWRlciBpcyB1bmFibGUgdG8gZmluZCBhIGNsYXNzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCkBAIC0yNywzMiArMjksMzcgQEAKICAgICBwcml2YXRlIFRocm93YWJsZSBleDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigoVGhyb3dhYmxlKSBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2ssIG1lc3NhZ2UgYW5kCi0gICAgICogZXhjZXB0aW9uIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UsIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCB3aGVuCisgICAgICogbG9hZGluZyB0aGUgY2xhc3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSBleGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgIFRocm93YWJsZSBUaGUgZXhjZXB0aW9uIHdoaWNoIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlCi0gICAgICogICAgICAgICAgICBjbGFzcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgY2xhc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsYXNzTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CkBAIC02MiwxNiArNjksMTcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgd2hlbiBsb2FkaW5nIHRoZSBjbGFzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZSBUaGUgZXhjZXB0aW9uIHdoaWNoIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNsYXNzLgorICAgICAqIEByZXR1cm4gVGhyb3dhYmxlIHRoZSBleGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKSB7CiAgICAgICAgIHJldHVybiBleDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGlzIFRocm93YWJsZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBjYXVzZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGlzIFRocm93YWJsZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vCisgICAgICogY2F1c2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaHJvd2FibGUgVGhlIHJlY2VpdmVyJ3MgY2F1c2UuCisgICAgICogQHJldHVybiBUaHJvd2FibGUgdGhlIHJlY2VpdmVyJ3MgY2F1c2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQppbmRleCAwYWE5ZmJiLi5iNDg0ZTA4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCkBAIC0xNywzMCArMTcsMzQgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG8gY2xvbmUgYW4gb2JqZWN0IHdoaWNoCi0gKiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDbG9uZWFibGUgaW50ZXJmYWNlLgorICogVGhyb3duIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIGNsb25lIGFuIG9iamVjdCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IHRoZQorICoge0BsaW5rIENsb25lYWJsZX0gaW50ZXJmYWNlLgogICogCiAgKiBAc2VlIENsb25lYWJsZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MTk1NTExMjUwMDc5NjU2NDQzTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICogY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xvbmVhYmxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Nsb25lYWJsZS5qYXZhCmluZGV4IDU3YjQzNGEuLmViNzAyZjAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xvbmVhYmxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbG9uZWFibGUuamF2YQpAQCAtMTksMTMgKzE5LDE0IEBACiAKIAogLyoqCi0gKiBUaGlzIChlbXB0eSkgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgY2xhc3NlcyB3aGljaCB3aXNoIHRvCi0gKiBzdXBwb3J0IGNsb25pbmcuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjbG9uZSBpbiBjbGFzcyBPYmplY3QgY2hlY2tzIHRvIGVuc3VyZQotICogdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGNsb25lZCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLCBhbmQgdGhyb3dzCi0gKiBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBub3QuCisgKiBUaGlzIChlbXB0eSkgaW50ZXJmYWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIGNsYXNzZXMgdGhhdCB3aXNoIHRvCisgKiBzdXBwb3J0IGNsb25pbmcuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgY2xvbmUoKX0gaW4ge0Bjb2RlIE9iamVjdH0KKyAqIGNoZWNrcyBpZiB0aGUgb2JqZWN0IGJlaW5nIGNsb25lZCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGFuZCB0aHJvd3MKKyAqIHtAY29kZSBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbn0gaWYgaXQgZG9lcyBub3QuCiAgKiAKICAqIEBzZWUgT2JqZWN0I2Nsb25lCiAgKiBAc2VlIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDbG9uZWFibGUgewogICAgIC8vIE1hcmtlciBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ29tcGFyYWJsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Db21wYXJhYmxlLmphdmEKaW5kZXggN2NhMDFiOS4uYzUwZjExMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Db21wYXJhYmxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Db21wYXJhYmxlLmphdmEKQEAgLTE3LDM1ICsxNyw0MiBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgY2xhc3NlcyB3aGljaCB3aXNoIHRvIGRlZmluZSBhCi0gKiA8ZW0+bmF0dXJhbCBvcmRlcmluZzwvZW0+IG9mIHRoZWlyIGluc3RhbmNlcy4gVGhlIG9yZGVyaW5nIHJ1bGUgbXVzdCBiZQotICogdHJhbnNpdGl2ZSBhbmQgaW52ZXJ0YWJsZSAoaS5lLiB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0IG9mIHguY29tcGFyZVRvKHkpIG11c3QKLSAqIGVxdWFsIHRoZSBuZWdhdGlvbiBvZiB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0IG9mIHkuY29tcGFyZVRvKHgpIGZvciBhbGwgeCBhbmQKLSAqIHkpLgorICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBjbGFzc2VzIHRoYXQgd2lzaCB0byBkZWZpbmUgYQorICogPGVtPm5hdHVyYWwgb3JkZXI8L2VtPiBvZiB0aGVpciBpbnN0YW5jZXMuCisgKiB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NvcnR9IGFuZCB7QGNvZGUgamF2YS51dGlsLkFycmF5cyNzb3J0fSBjYW4gdGhlbgorICogYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IHNvcnQgbGlzdHMgb2YgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KICAqIDxwPgotICogSW4gYWRkaXRpb24sIGl0IGlzIGRlc2lyZWFibGUgKGJ1dCBub3QgcmVxdWlyZWQpIHRoYXQgd2hlbiB0aGUgcmVzdWx0IG9mCi0gKiB4LmNvbXBhcmVUbyh5KSBpcyB6ZXJvIChhbmQgb25seSB0aGVuKSB0aGUgcmVzdWx0IG9mIHguZXF1YWxzKHkpIHNob3VsZCBiZQotICogdHJ1ZS4KKyAqIFRoZSBvcmRlciBydWxlIG11c3QgYmUgYm90aCB0cmFuc2l0aXZlIChpZiB7QGNvZGUgeC5jb21wYXJlVG8oeSkgPCAwfSBhbmQKKyAqIHtAY29kZSB5LmNvbXBhcmVUbyh6KSA8IDB9LCB0aGVuIHtAY29kZSB4LmNvbXBhcmVUbyh6KSA8IDB9IG11c3QgaG9sZCkgYW5kCisgKiBpbnZlcnRpYmxlICh0aGUgc2lnbiBvZiB0aGUgcmVzdWx0IG9mIHguY29tcGFyZVRvKHkpIG11c3QgYmUgZXF1YWwgdG8gdGhlCisgKiBuZWdhdGlvbiBvZiB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0IG9mIHkuY29tcGFyZVRvKHgpIGZvciBhbGwgY29tYmluYXRpb25zIG9mCisgKiB4IGFuZCB5KS4KKyAqIDwvcD4KKyAqIDxwPgorICogSW4gYWRkaXRpb24sIGl0IGlzIHJlY29tbWVuZGVkIChidXQgbm90IHJlcXVpcmVkKSB0aGF0IGlmIGFuZCBvbmx5IGlmIHRoZQorICogcmVzdWx0IG9mIHguY29tcGFyZVRvKHkpIGlzIHplcm8sIHRoZW4gdGhlIHJlc3VsdCBvZiB4LmVxdWFscyh5KSBzaG91bGQgYmUKKyAqIHtAY29kZSB0cnVlfS4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tcGFyYWJsZTxUPiB7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIHBvc2l0aW9ucyBvZiB0aGUgcmVjZWl2ZXIgYW5kCi0gICAgICogdGhlIGFyZ3VtZW50IGluIHRoZSBuYXR1cmFsIG9yZGVyIG9mIGVsZW1lbnRzIG9mIHRoZSByZWNlaXZlcidzIGNsYXNzLgorICAgICAqIENvbXBhcmVzIHRoaXMgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGRldGVybWluZSB0aGVpciByZWxhdGl2ZQorICAgICAqIG9yZGVyLgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHdoaWNoIHNob3VsZCBiZSA8MCBpZiB0aGUgcmVjZWl2ZXIgc2hvdWxkIHNvcnQgYmVmb3JlIHRoZQotICAgICAqICAgICAgICAgYXJndW1lbnQsIDAgaWYgdGhlIHJlY2VpdmVyIHNob3VsZCBzb3J0IGluIHRoZSBzYW1lIHBvc2l0aW9uIGFzCi0gICAgICogICAgICAgICB0aGUgYXJndW1lbnQsIGFuZCA+MCBpZiB0aGUgcmVjZWl2ZXIgc2hvdWxkIHNvcnQgYWZ0ZXIgdGhlCi0gICAgICogICAgICAgICBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gYW5vdGhlcgotICAgICAqICAgICAgICAgICAgT2JqZWN0IGFuIG9iamVjdCB0byBjb21wYXJlIHRoZSByZWNlaXZlciB0bworICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgdGhpcyBpbnN0YW5jZSBpcyBsZXNzIHRoYW4ge0Bjb2RlIGFub3RoZXJ9OworICAgICAqICAgICAgICAgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgaW5zdGFuY2UgaXMgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICB7QGNvZGUgYW5vdGhlcn07IDAgaWYgdGhpcyBpbnN0YW5jZSBoYXMgdGhlIHNhbWUgb3JkZXIgYXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBhbm90aGVyfS4KICAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjYW4gbm90IGJlIGNvbnZlcnRlZCBpbnRvIHNvbWV0aGluZwotICAgICAqICAgICAgICAgICAgIGNvbXBhcmFibGUgd2l0aCB0aGUgcmVjZWl2ZXIuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFub3RoZXJ9IGNhbm5vdCBiZSBjb252ZXJ0ZWQgaW50byBzb21ldGhpbmcKKyAgICAgKiAgICAgICAgICAgICBjb21wYXJhYmxlIHRvIHtAY29kZSB0aGlzfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBpbnQgY29tcGFyZVRvKFQgYW5vdGhlcik7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0RlcHJlY2F0ZWQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRGVwcmVjYXRlZC5qYXZhCmluZGV4IGNkNjc0ZmEuLmViMzU2YzIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRGVwcmVjYXRlZC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRGVwcmVjYXRlZC5qYXZhCkBAIC0xOSw2ICsxOSwxMyBAQAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwogCisvKioKKyAqIEFubm90YXRpb24gdHlwZSB1c2VkIHRvIG1hcmsgcHJvZ3JhbSBlbGVtZW50cyB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgdXNlZAorICogYnkgcHJvZ3JhbW1lcnMuIENvbXBpbGVycyBwcm9kdWNlIGEgd2FybmluZyBpZiBhIGRlcHJlY2F0ZWQgcHJvZ3JhbSBlbGVtZW50CisgKiBpcyB1c2VkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogQERvY3VtZW50ZWQKIEBSZXRlbnRpb24odmFsdWU9amF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCiBwdWJsaWMgQGludGVyZmFjZSBEZXByZWNhdGVkCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0RvdWJsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Eb3VibGUuamF2YQppbmRleCA2Mzk3MmZiLi5jNTBiMjdkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0RvdWJsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRG91YmxlLmphdmEKQEAgLTE4LDEyICsxOCwxMCBAQAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogPHA+Ci0gKiBEb3VibGUgaXMgdGhlIHdyYXBwZXIgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+LgotICogPC9wPgorICogVGhlIHdyYXBwZXIgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSB7QGNvZGUgZG91YmxlfS4KICAqIAogICogQHNlZSBqYXZhLmxhbmcuTnVtYmVyCi0gKiBAc2luY2UgMS4wCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERvdWJsZSBleHRlbmRzIE51bWJlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8RG91YmxlPiB7CiAKQEAgLTM1LDUwICszMyw0OCBAQAogICAgIHByaXZhdGUgZmluYWwgZG91YmxlIHZhbHVlOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBtYXhpbXVtIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUsICgyIC0gMjxzdXA+LTUyL3N1cD4pICoKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1heGltdW0ge0Bjb2RlIGRvdWJsZX0gdmFsdWUsICgyIC0gMjxzdXA+LTUyPC9zdXA+KSAqCiAgICAgICogMjxzdXA+MTAyMzwvc3VwPi4KLSAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgTUFYX1ZBTFVFID0gMS43OTc2OTMxMzQ4NjIzMTU3MGUrMzA4OwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBtaW5pbXVtIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUsIDI8c3VwPi0xMDc0PC9zdXA+LgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1pbmltdW0ge0Bjb2RlIGRvdWJsZX0gdmFsdWUsIDI8c3VwPi0xMDc0PC9zdXA+LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIE1JTl9WQUxVRSA9IDVlLTMyNDsKIAogICAgIC8qIDQuOTQwNjU2NDU4NDEyNDY1NDRlLTMyNCBnZXRzIHJvdW5kZWQgdG8gOS44ODEzMWUtMzI0ICovCiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIE5vdC1hLU51bWJlciAoTmFOKSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPgotICAgICAqIHR5cGUuCi0gICAgICogPC9wPgorICAgICAqIENvbnN0YW50IGZvciB0aGUgTm90LWEtTnVtYmVyIChOYU4pIHZhbHVlIG9mIHRoZSB7QGNvZGUgZG91YmxlfSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIE5hTiA9IDAuMCAvIDAuMDsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0YW50IGZvciB0aGUgUG9zaXRpdmUgSW5maW5pdHkgdmFsdWUgb2YgdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4KLSAgICAgKiB0eXBlLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIFBvc2l0aXZlIEluZmluaXR5IHZhbHVlIG9mIHRoZSB7QGNvZGUgZG91YmxlfSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIFBPU0lUSVZFX0lORklOSVRZID0gMS4wIC8gMC4wOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBOZWdhdGl2ZSBJbmZpbml0eSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPgotICAgICAqIHR5cGUuCi0gICAgICogPC9wPgorICAgICAqIENvbnN0YW50IGZvciB0aGUgTmVnYXRpdmUgSW5maW5pdHkgdmFsdWUgb2YgdGhlIHtAY29kZSBkb3VibGV9IHR5cGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgTkVHQVRJVkVfSU5GSU5JVFkgPSAtMS4wIC8gMC4wOwogCiAgICAgLyoqCi0gICAgICogVGhlIGphdmEubGFuZy5DbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhpcyBjbGFzcy4KKyAgICAgKiBUaGUge0BsaW5rIENsYXNzfSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwcmltaXRpdmUgdHlwZSB7QGNvZGUKKyAgICAgKiBkb3VibGV9LgogICAgICAqIAotICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPERvdWJsZT4gVFlQRSA9IChDbGFzczxEb3VibGU+KSBuZXcgZG91YmxlWzBdCkBAIC04OCw1MyArODQsNTYgQEAKICAgICAvLyBkZWZpbmVkIHRvIGJlICJqYXZhLmxhbmcuRG91YmxlLlRZUEUiOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBudW1iZXIgb2YgYml0cyB0byByZXByZXNlbnQgYSA8Y29kZT5kb3VibGU8L2NvZGU+IGluCi0gICAgICogdHdvJ3MgY29tcGxpbWVudCBmb3JtLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgYSB7QGNvZGUgZG91YmxlfSBpbgorICAgICAqIHR3bydzIGNvbXBsZW1lbnQgZm9ybS4KICAgICAgKiAKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IDY0OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgZG91YmxlCi0gICAgICogdmFsdWVkIGFyZ3VtZW50LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERvdWJsZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBkb3VibGUKKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gc3RvcmUgaW4gdGhlIG5ldyBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltaXRpdmUgZG91YmxlIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBuZXcgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERvdWJsZShkb3VibGUgdmFsdWUpIHsKICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBhIHN0cmluZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEb3VibGV9IGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkb3VibGUgcXVhbnRpdHkuCi0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhIGRvdWJsZSBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkb3VibGUgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBjYW4gbm90IGJlIGRlY29kZWQgaW50byBhIGRvdWJsZSB2YWx1ZS4KKyAgICAgKiBAc2VlICNwYXJzZURvdWJsZShTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERvdWJsZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhwYXJzZURvdWJsZShzdHJpbmcpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgRG91YmxlIHBhcmFtZXRlci4gTmFOIGlzIGVxdWFsIHRvIE5hTiwgYW5kCi0gICAgICogaXMgZ3JlYXRlciB0aGFuIG90aGVyIGRvdWJsZSB2YWx1ZXMuIDBkIGlzIGdyZWF0ZXIgdGhhbiAtMGQuCisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBkb3VibGUgb2JqZWN0IHRvIGRldGVybWluZSB0aGVpcgorICAgICAqIHJlbGF0aXZlIG9yZGVyLiBUaGVyZSBhcmUgdHdvIHNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgRG91YmxlLk5hTn0gaXMgZXF1YWwgdG8ge0Bjb2RlIERvdWJsZS5OYU59IGFuZCBpdCBpcyBncmVhdGVyCisgICAgICogdGhhbiBhbnkgb3RoZXIgZG91YmxlIHZhbHVlLCBpbmNsdWRpbmcge0Bjb2RlIERvdWJsZS5QT1NJVElWRV9JTkZJTklUWX07PC9saT4KKyAgICAgKiA8bGk+KzAuMGQgaXMgZ3JlYXRlciB0aGFuIC0wLjBkPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBEb3VibGUgdG8gY29tcGFyZSB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgZ3JlYXRlciB0aGFuIHplcm8gd2hlbiB0aGlzLmRvdWJsZVZhbHVlKCkgaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICBvYmplY3QuZG91YmxlVmFsdWUoKSwgemVybyB3aGVuIHRoaXMuZG91YmxlVmFsdWUoKSBlcXVhbHMKLSAgICAgKiAgICAgICAgIG9iamVjdC5kb3VibGVWYWx1ZSgpLCBhbmQgbGVzcyB0aGFuIHplcm8gd2hlbiB0aGlzLmRvdWJsZVZhbHVlKCkKLSAgICAgKiAgICAgICAgIGlzIGxlc3MgdGhhbiBvYmplY3QuZG91YmxlVmFsdWUoKQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBvYmplY3QgdG8uCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGRvdWJsZSBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogICAgICAgICB2YWx1ZSBvZiB7QGNvZGUgb2JqZWN0fTsgMCBpZiB0aGUgdmFsdWUgb2YgdGhpcyBkb3VibGUgYW5kIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgb2Yge0Bjb2RlIG9iamVjdH0gYXJlIGVxdWFsOyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgb2YgdGhpcyBkb3VibGUgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiB7QGNvZGUgb2JqZWN0fS4KKyAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oRG91YmxlIG9iamVjdCkgewogICAgICAgICBsb25nIGQxLCBkMjsKQEAgLTE1OCwzOCArMTU3LDQ3IEBACiAgICAgICAgIHJldHVybiB2YWx1ZSA+IG9iamVjdC52YWx1ZSA/IDEgOiAtMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBieXRlIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewogICAgICAgICByZXR1cm4gKGJ5dGUpIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQsIGFzIGEgbG9uZy4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGRvdWJsZSB2YWx1ZSB0byBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBjb25mb3JtaW5nCisgICAgICogdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IGRvdWJsZSBwcmVjaXNpb24gYml0IGxheW91dC4gQWxsCisgICAgICogPGVtPk5vdC1hLU51bWJlciAoTmFOKTwvZW0+IHZhbHVlcyBhcmUgY29udmVydGVkIHRvIGEgc2luZ2xlIE5hTgorICAgICAqIHJlcHJlc2VudGF0aW9uICh7QGNvZGUgMHg3ZmY4MDAwMDAwMDAwMDAwTH0pLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIGRvdWJsZSB2YWx1ZSB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiB0aGUgYml0cyBvZiB0aGUgZG91YmxlLgorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB2YWx1ZSB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IGRvdWJsZSBwcmVjaXNpb24gcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiAgICAgICAgIHtAY29kZSB2YWx1ZX0uCisgICAgICogQHNlZSAjZG91YmxlVG9SYXdMb25nQml0cyhkb3VibGUpCisgICAgICogQHNlZSAjbG9uZ0JpdHNUb0RvdWJsZShsb25nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZG91YmxlVG9Mb25nQml0cyhkb3VibGUgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudCwgYXMgYSBsb25nLgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgZG91YmxlIHZhbHVlIHRvIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGNvbmZvcm1pbmcKKyAgICAgKiB0byB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgZG91YmxlIHByZWNpc2lvbiBiaXQgbGF5b3V0LgorICAgICAqIDxlbT5Ob3QtYS1OdW1iZXIgKE5hTik8L2VtPiB2YWx1ZXMgYXJlIHByZXNlcnZlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBkb3VibGUgdmFsdWUgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gdGhlIGJpdHMgb2YgdGhlIGRvdWJsZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdmFsdWUgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIHRoZSBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCBkb3VibGUgcHJlY2lzaW9uIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICogICAgICAgICB7QGNvZGUgdmFsdWV9LgorICAgICAqIEBzZWUgI2RvdWJsZVRvTG9uZ0JpdHMoZG91YmxlKQorICAgICAqIEBzZWUgI2xvbmdCaXRzVG9Eb3VibGUobG9uZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGRvdWJsZVRvUmF3TG9uZ0JpdHMoZG91YmxlIHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlY2VpdmVyJ3MgdmFsdWUgYXMgYSBkb3VibGUuCisgICAgICogR2V0cyB0aGUgcHJpbWl0aXZlIHZhbHVlIG9mIHRoaXMgZG91YmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0J3MgcHJpbWl0aXZlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CkBAIC0xOTcsMTYgKzIwNSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLiBGb3IKLSAgICAgKiBEb3VibGVzLCB0aGUgY2hlY2sgdmVyaWZpZXMgdGhhdCB0aGUgcmVjZWl2ZXIncyB2YWx1ZSdzIGJpdCBwYXR0ZXJuCi0gICAgICogbWF0Y2hlcyB0aGUgYml0IHBhdHRlcm4gb2YgdGhlIGFyZ3VtZW50LCB3aGljaCBtdXN0IGFsc28gYmUgYSBEb3VibGUuCisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgaW5kaWNhdGVzIGlmIHRoZXkgYXJlCisgICAgICogZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb2JqZWN0fSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCisgICAgICoge0Bjb2RlIERvdWJsZX0gYW5kIHRoZSBiaXQgcGF0dGVybiBvZiBpdHMgZG91YmxlIHZhbHVlIGlzIHRoZSBzYW1lIGFzCisgICAgICogdGhpcyBvYmplY3Qncy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0Ci0gICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIGRvdWJsZSB3aXRoLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBEb3VibGV9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtMjE1LDExNyArMjIzLDEwMCBAQAogICAgICAgICAgICAgICAgICYmIChkb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpID09IGRvdWJsZVRvTG9uZ0JpdHMoKChEb3VibGUpIG9iamVjdCkudmFsdWUpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gZmxvYXQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIChmbG9hdCkgdmFsdWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIG9iamVjdHMgd2hpY2gKLSAgICAgKiBhbnN3ZXIgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gPGNvZGU+ZXF1YWxzPC9jb2RlPiBtdXN0Ci0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBsb25nIHYgPSBkb3VibGVUb0xvbmdCaXRzKHZhbHVlKTsKICAgICAgICAgcmV0dXJuIChpbnQpICh2IF4gKHYgPj4+IDMyKSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVjZWl2ZXIncyB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdmFsdWUgYXMgYW4gaW50ZWdlcgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMgYW4gaW5maW5pdGUgcXVhbnRpdHksIGFuZCBmYWxzZQotICAgICAqIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9iamVjdCByZXByZXNlbnRzIGFuIGluZmluaXRlIHZhbHVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCi0gICAgICogICAgICAgICBpbmZpbml0eSA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbm90IGFuIGluZmluaXRlIHZhbHVlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHZhbHVlIG9mIHRoaXMgZG91YmxlIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCisgICAgICogICAgICAgICBpbmZpbml0eTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJbmZpbml0ZSgpIHsKICAgICAgICAgcmV0dXJuIGlzSW5maW5pdGUodmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgcmVwcmVzZW50cyBhbiBpbmZpbml0ZSBxdWFudGl0eSwgYW5kIGZhbHNlCi0gICAgICogb3RoZXJ3aXNlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZG91YmxlIHJlcHJlc2VudHMgYW4gaW5maW5pdGUgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGNoZWNrIGZvciBpbmZpbml0bmVzcy4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZQotICAgICAqICAgICAgICAgaW5maW5pdHkgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vdCBhbiBpbmZpbml0ZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdmFsdWUgb2Yge0Bjb2RlIGR9IGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCisgICAgICogICAgICAgICBpbmZpbml0eTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5maW5pdGUoZG91YmxlIGQpIHsKICAgICAgICAgcmV0dXJuIChkID09IFBPU0lUSVZFX0lORklOSVRZKSB8fCAoZCA9PSBORUdBVElWRV9JTkZJTklUWSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZWNlaXZlciBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBmbG9hdCBxdWFudGl0eS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9iamVjdCBpcyBhIDxlbT5Ob3QtYS1OdW1iZXIgKE5hTik8L2VtPiB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBpcyBOb3QgQSBOdW1iZXIKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBhIChwb3RlbnRpYWxseSBpbmZpbml0ZSkgZmxvYXQKLSAgICAgKiAgICAgICAgIG51bWJlcgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgZG91YmxlIGlzIDxlbT5Ob3QtYS1OdW1iZXI8L2VtPjsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMgYSAocG90ZW50aWFsbHkgaW5maW5pdGUpIGRvdWJsZSBudW1iZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNOYU4oKSB7CiAgICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBkb3VibGUgcXVhbnRpdHkuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkb3VibGUgaXMgYSA8ZW0+Tm90LWEtTnVtYmVyIChOYU4pPC9lbT4KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gY2hlY2sgZm9yIG51bWJlcm5lc3MuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgaXMgTm90IEEgTnVtYmVyCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgYSAocG90ZW50aWFsbHkgaW5maW5pdGUpIGRvdWJsZQotICAgICAqICAgICAgICAgbnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBkfSBpcyA8ZW0+Tm90LWEtTnVtYmVyPC9lbT47CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIGl0IGlzIGEgKHBvdGVudGlhbGx5IGluZmluaXRlKSBkb3VibGUgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hTihkb3VibGUgZCkgewogICAgICAgICByZXR1cm4gZCAhPSBkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkb3VibGUgYnVpbHQgZnJvbSB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGdpdmVuIGluIHRoZQotICAgICAqIGFyZ3VtZW50LgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgZG91YmxlIHByZWNpc2lvbiBiaXQKKyAgICAgKiBwYXR0ZXJuIHRvIGEgSmF2YSBkb3VibGUgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJpdHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBiaXRzIG9mIHRoZSBkb3VibGUKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgd2hpY2ggbWF0Y2hlcyB0aGUgYml0cworICAgICAqICAgICAgICAgICAgdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IGRvdWJsZSBwcmVjaXNpb24gcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgIGEgZG91YmxlIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSB2YWx1ZSBjb252ZXJ0ZWQgZnJvbSB7QGNvZGUgYml0c30uCisgICAgICogQHNlZSAjZG91YmxlVG9Mb25nQml0cyhkb3VibGUpCisgICAgICogQHNlZSAjZG91YmxlVG9SYXdMb25nQml0cyhkb3VibGUpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGxvbmdCaXRzVG9Eb3VibGUobG9uZyBiaXRzKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvbmcgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxvbmcgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CiAgICAgICAgIHJldHVybiAobG9uZykgdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG91YmxlIHdoaWNoIG1hdGNoZXMgdGhlIHBhc3NlZCBpbiBzdHJpbmcuCi0gICAgICogTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkCi0gICAgICogZG91YmxlLgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGRvdWJsZSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gYSBkb3VibGUgd2hpY2ggd291bGQgcHJpbnQgYXMgdGhlIGFyZ3VtZW50CisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZG91YmxlIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSBkb3VibGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBkb3VibGUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgcGFyc2VEb3VibGUoU3RyaW5nIHN0cmluZykKICAgICAgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewpAQCAtMzMzLDYzICszMjQsNjIgQEAKICAgICAgICAgICAgICAgICAucGFyc2VEb3VibGUoc3RyaW5nKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaG9ydCB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gc2hvcnQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIChzaG9ydCkgdmFsdWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBEb3VibGUudG9TdHJpbmcodmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQuCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGRvdWJsZSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBwcmludAotICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqICAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gY29udmVydCB0byBhIHN0cmluZy4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBkfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhkb3VibGUgZCkgewogICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5OdW1iZXJDb252ZXJ0ZXIuY29udmVydChkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgd2hpY2ggbWF0Y2hlcyB0aGUgcGFzc2VkIGluIHN0cmluZy4KLSAgICAgKiBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQKLSAgICAgKiBkb3VibGUuCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEgZG91YmxlIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiBhIGRvdWJsZSB3aGljaCB3b3VsZCBwcmludCBhcyB0aGUgYXJndW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkb3VibGUgdmFsdWUuCisgICAgICogQHJldHVybiBhIHtAY29kZSBEb3VibGV9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGRvdWJsZSB2YWx1ZSByZXByZXNlbnRlZAorICAgICAqICAgICAgICAgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBkb3VibGUgdmFsdWUuCisgICAgICogQHNlZSAjcGFyc2VEb3VibGUoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRG91YmxlIHZhbHVlT2YoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKHBhcnNlRG91YmxlKHN0cmluZykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSB0d28gZG91Ymxlcy4gTmFOIGlzIGVxdWFsIHRvIE5hTiwgYW5kIGlzIGdyZWF0ZXIgdGhhbiBvdGhlcgotICAgICAqIGRvdWJsZSB2YWx1ZXMuIDBkIGlzIGdyZWF0ZXIgdGhhbiAtMGQuCisgICAgICogQ29tcGFyZXMgdGhlIHR3byBzcGVjaWZpZWQgZG91YmxlIHZhbHVlcy4gVGhlcmUgYXJlIHR3byBzcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIERvdWJsZS5OYU59IGlzIGVxdWFsIHRvIHtAY29kZSBEb3VibGUuTmFOfSBhbmQgaXQgaXMgZ3JlYXRlcgorICAgICAqIHRoYW4gYW55IG90aGVyIGRvdWJsZSB2YWx1ZSwgaW5jbHVkaW5nIHtAY29kZSBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFl9OzwvbGk+CisgICAgICogPGxpPiswLjBkIGlzIGdyZWF0ZXIgdGhhbiAtMC4wZDwvbGk+CisgICAgICogPC91bD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZG91YmxlMQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLgogICAgICAqIEBwYXJhbSBkb3VibGUyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgZ3JlYXRlciB0aGFuIHplcm8gd2hlbiBkb3VibGUxIGlzIGdyZWF0ZXIgdGhhbiBkb3VibGUyLAotICAgICAqICAgICAgICAgemVybyB3aGVuIGRvdWJsZTEgZXF1YWxzIGRvdWJsZTIsIGFuZCBsZXNzIHRoYW4gemVybyB3aGVuIGRvdWJsZTEKLSAgICAgKiAgICAgICAgIGlzIGxlc3MgdGhhbiBkb3VibGUyCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHtAY29kZSBkb3VibGUxfSBpcyBsZXNzIHRoYW4ge0Bjb2RlIGRvdWJsZTJ9OworICAgICAqICAgICAgICAgMCBpZiB7QGNvZGUgZG91YmxlMX0gYW5kIHtAY29kZSBkb3VibGUyfSBhcmUgZXF1YWw7IGEgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgIHZhbHVlIGlmIHtAY29kZSBkb3VibGUxfSBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIGRvdWJsZTJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMCAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoZG91YmxlIGRvdWJsZTEsIGRvdWJsZSBkb3VibGUyKSB7CiAgICAgICAgIGxvbmcgZDEsIGQyOwpAQCAtNDE0LDMxICs0MDQsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+RG91YmxlPC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4KLSAgICAgKiB2YWx1ZSBwYXNzZWQuIFRoaXMgbWV0aG9kIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBjb25zdHJ1Y3RvciwgYXMgdGhpcwotICAgICAqIG1ldGhvZCBtYXkgbWFpbnRhaW4gYSBjYWNoZSBvZiBpbnN0YW5jZXMuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgRG91YmxlfSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBkb3VibGUgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIFRoZSBkb3VibGUgdmFsdWUuCi0gICAgICogQHJldHVybiBBIDxjb2RlPkRvdWJsZTwvY29kZT4gaW5zdGFuY2UuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBEb3VibGV9IGluc3RhbmNlIGNvbnRhaW5pbmcge0Bjb2RlIGR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRG91YmxlIHZhbHVlT2YoZG91YmxlIGQpIHsKICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoZCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29udmVydHMgYSA8Y29kZT5kb3VibGU8L2NvZGU+IGludG8gYSBoZXhhZGVjaW1hbCBzdHJpbmcKLSAgICAgKiByZXByZXNlbnRhdGlvbi4KLSAgICAgKiA8L3A+CisgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBkb3VibGUgaW50byBpdHMgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiA8Y29kZT5mPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBkfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hleFN0cmluZyhkb3VibGUgZCkgewogICAgICAgICAvKgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9FbnVtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0VudW0uamF2YQppbmRleCBmNTE1ZjVhLi4wYWExNWRkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0VudW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0VudW0uamF2YQpAQCAtMSwxOCArMSwxNyBAQAotLyogCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqIAogICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAogcGFja2FnZSBqYXZhLmxhbmc7CkBAIC0yNSw3ICsyNCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoZSBzdXBlcmNsYXNzIG9mIGFsbCBlbnVtZXJhdGVkIHR5cGVzLgorICogVGhlIHN1cGVyY2xhc3Mgb2YgYWxsIGVudW1lcmF0ZWQgdHlwZXMuIEFjdHVhbCBlbnVtZXJhdGlvbiB0eXBlcyBpbmhlcml0IGZyb20KKyAqIHRoaXMgY2xhc3MsIGJ1dCBleHRlbmRpbmcgdGhpcyBjbGFzcyBkb2VzIG5vdCBtYWtlIGEgY2xhc3MgYW4gZW51bXJhdGlvbgorICogdHlwZSwgc2luY2UgdGhlIGNvbXBpbGVyIG5lZWRzIHRvIGdlbmVyYXRlIHNwZWNpYWwgaW5mb3JtYXRpb24gZm9yIGl0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEVudW08RSBleHRlbmRzIEVudW08RT4+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLAogICAgICAgICBDb21wYXJhYmxlPEU+IHsKQEAgLTM3LDEyICs0MCwxNCBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IG9yZGluYWw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZW51bSBzdWJ0eXBlcy4KKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgY29uc3RhbnRzIG9mIGVudW0gc3VidHlwZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbnVtIGNvbnN0YW50IGRlY2xhcmVkIG5hbWUuCisgICAgICogICAgICAgICAgICB0aGUgZW51bSBjb25zdGFudCdzIGRlY2xhcmVkIG5hbWUuCiAgICAgICogQHBhcmFtIG9yZGluYWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbnVtIGNvbnN0YW50IHBvc2l0aW9uIG9yZGluYWwuCisgICAgICogICAgICAgICAgICB0aGUgZW51bSBjb25zdGFudCdzIG9yZGluYWwsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGl0cyBwb3NpdGlvbgorICAgICAqICAgICAgICAgICAgaW4gdGhlIGVudW0gZGVjbGFyYXRpb24sIHN0YXJ0aW5nIGF0IHplcm8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEVudW0oU3RyaW5nIG5hbWUsIGludCBvcmRpbmFsKSB7CiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CkBAIC01MCwxMSArNTUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50LiBUaGUgbmFtZSBpcyB0aGUgZmllbGQgYXMgaXQKLSAgICAgKiBhcHBlYXJzIGluIHRoZSA8Y29kZT5FbnVtPC9jb2RlPiBkZWNsYXJhdGlvbi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZW51bSBjb25zdGFudC4gVGhlIG5hbWUgaXMgdGhlIGZpZWxkIGFzIGl0CisgICAgICogYXBwZWFycyBpbiB0aGUge0Bjb2RlIGVudW19IGRlY2xhcmF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWNpc2UgZW51bSBjb25zdGFudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBlbnVtIGNvbnN0YW50LgogICAgICAqIEBzZWUgI3RvU3RyaW5nKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWUoKSB7CiAgICAgICAgIHJldHVybiBuYW1lOwpAQCAtNjIsMTkgKzY4LDIxIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW51bSBjb25zdGFudCBpbiB0aGUgZGVjbGFyYXRpb24uIFRoZSBmaXJzdAotICAgICAqIGNvbnN0YW50IGhhcyBhbmQgb3JkaW5hbCB2YWx1ZSBvZiB6ZXJvLgorICAgICAqIGNvbnN0YW50IGhhcyBhbiBvcmRpbmFsIHZhbHVlIG9mIHplcm8uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29uc3RhbnQncyBvcmRpbmFsIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG9yZGluYWwgdmFsdWUgb2YgdGhpcyBlbnVtIGNvbnN0YW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgb3JkaW5hbCgpIHsKICAgICAgICAgcmV0dXJuIG9yZGluYWw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlciBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byBhCi0gICAgICogcHJvZ3JhbW1lci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICogb2JqZWN0LiBJbiB0aGlzIGNhc2UsIHRoZSBlbnVtIGNvbnN0YW50J3MgbmFtZSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXNwbGF5YWJsZSBzdHJpbmcgbmFtZS4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC04MiwzMiArOTAsMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgcmVjZWl2ZXIgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LiBTaW5jZSBlbnVtcwotICAgICAqIGFyZSB1bmlxdWUgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGFuIGlkZW50aXR5IHRlc3QuCisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgaW5kaWNhdGVzIGlmIHRoZXkgYXJlCisgICAgICogZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb2JqZWN0fSBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGlzCisgICAgICogZW51bSBjb25zdGFudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGFuZCBhcmd1bWVudCBhcmUgZXF1YWwsIG90aGVyd2lzZSByZXR1cm4KLSAgICAgKiAgICAgICAgIGZhbHNlLgorICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgZW51bSBjb25zdGFudCB3aXRoLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBFbnVtfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewogICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlcjsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIG9yZGluYWwgKyAobmFtZSA9PSBudWxsID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW51bXMgYXJlIHNpbmdsZXRvbnMsIHRoZXkgbWF5IG5vdCBiZSBjbG9uZWQuIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYQotICAgICAqIHtAbGluayBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbn0uCisgICAgICoge0Bjb2RlIEVudW19IG9iamVjdHMgYXJlIHNpbmdsZXRvbnMsIHRoZXkgbWF5IG5vdCBiZSBjbG9uZWQuIFRoaXMgbWV0aG9kCisgICAgICogYWx3YXlzIHRocm93cyBhIHtAY29kZSBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbn0uCiAgICAgICogCiAgICAgICogQHJldHVybiBkb2VzIG5vdCByZXR1cm4uCisgICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlzIGFsd2F5cyB0aHJvd24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CkBAIC0xMTYsMTYgKzEyNiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbXBhcmF0aXZlIG9yZGVyaW5nIG9mIHRoZSByZWNlaXZlciBhbmQgdGhlIGdpdmVuIGFyZ3VtZW50LgotICAgICAqIElmIHRoZSByZWNlaXZlciBpcyBuYXR1cmFsbHkgb3JkZXJlZCBiZWZvcmUgdGhlIGFjdHVhbCBhcmd1bWVudCB0aGVuIHRoZQotICAgICAqIHJlc3VsdCBpcyBuZWdhdGl2ZSwgaWYgdGhlIHJlY2VpdmVyIGlzIG5hdHVyYWxseSBvcmRlcmVkIGluIGVxdWFsCi0gICAgICogcG9zaXRpb24gdG8gdGhlIGFjdHVhbCBhcmd1bWVudCB0aGVuIHRoZSByZXN1bHQgaXMgemVybywgYW5kIGlmIHRoZQotICAgICAqIHJlY2VpdmVyIGlzIG5hdHVyYWxseSBvcmRlcmVkIGFmdGVyIHRoZSBhY3R1YWwgYXJndW1lbnQgdGhlbiB0aGUgcmVzdWx0Ci0gICAgICogaXMgcG9zaXRpdmUuCisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBlbnVtIG9iamVjdCB0byBkZXRlcm1pbmUgdGhlaXIKKyAgICAgKiByZWxhdGl2ZSBvcmRlci4gVGhpcyBtZXRob2QgY29tcGFyZXMgdGhlIG9iamVjdCdzIG9yZGluYWwgdmFsdWVzLCB0aGF0CisgICAgICogaXMsIHRoZWlyIHBvc2l0aW9uIGluIHRoZSBlbnVtIGRlY2xhcmF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gbmVnYXRpdmUsIHplcm8sIG9yIHBvc2l0aXZlIHZhbHVlIGRlcGVuZGluZyB1cG9uIGJlZm9yZSwgZXF1YWwsCi0gICAgICogICAgICAgICBvciBhZnRlciBuYXR1cmFsIG9yZGVyIHJlc3BlY3RpdmVseS4KLSAgICAgKiBAc2VlIENvbXBhcmFibGUjY29tcGFyZVRvCisgICAgICogQHBhcmFtIG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBlbnVtIG9iamVjdCB0byBjb21wYXJlIHRoaXMgb2JqZWN0IHRvLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgb3JkaW5hbCB2YWx1ZSBvZiB0aGlzIGVudW0gY29uc3RhbnQgaXMKKyAgICAgKiAgICAgICAgIGxlc3MgdGhhbiB0aGUgb3JkaW5hbCB2YWx1ZSBvZiB7QGNvZGUgb307IDAgaWYgdGhlIG9yZGluYWwKKyAgICAgKiAgICAgICAgIHZhbHVlcyBvZiB0aGlzIGVudW0gY29uc3RhbnQgYW5kIHtAY29kZSBvfSBhcmUgZXF1YWw7IGEgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgIHZhbHVlIGlmIHRoZSBvcmRpbmFsIHZhbHVlIG9mIHRoaXMgZW51bSBjb25zdGFudCBpcyBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgIHRoZSBvcmRpbmFsIHZhbHVlIG9mIHtAY29kZSBvfS4KKyAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oRSBvKSB7CiAgICAgICAgIHJldHVybiBvcmRpbmFsIC0gby5vcmRpbmFsOwpAQCAtMTM1LDYgKzE0OCw3IEBACiAgICAgICogUmV0dXJucyB0aGUgZW51bSBjb25zdGFudCdzIGRlY2xhcmluZyBjbGFzcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb25zdGFudCdzIGVudW0gdHlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgZmluYWwgQ2xhc3M8RT4gZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CkBAIC0xNDcsMjAgKzE2MSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVkIGNvbnN0YW50IG9mIHRoZSBnaXZlbiBlbnVtIHR5cGUuCisgICAgICogUmV0dXJucyB0aGUgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBlbnVtIHR5cGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVudW1UeXBlCiAgICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgb2YgdGhlIGVudW1lcmF0ZWQgdHlwZSB0byBzZWFyY2ggZm9yIHRoZSBjb25zdGFudAogICAgICAqICAgICAgICAgICAgdmFsdWUuCiAgICAgICogQHBhcmFtIG5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCB2YWx1ZSB0byBmaW5kLgotICAgICAqIEByZXR1cm4gdGhlIGVudW0gY29uc3RhbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBlbnVtIGNvbnN0YW50LgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgdGhlIDxjb2RlPmVudW1UeXBlPC9jb2RlPiBvciA8Y29kZT5uYW1lPC9jb2RlPgotICAgICAqICAgICAgICAgICAgIGFyZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIGVudW1UeXBlfSBvciB7QGNvZGUgbmFtZX0gYXJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmVudW1UeXBlPC9jb2RlPiBpcyBub3QgYW4gZW51bWVyYXRlZCB0eXBlIG9yIGRvZXMKLSAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBhIGNvbnN0YW50IHZhbHVlIGNhbGxlZCA8Y29kZT5uYW1lPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZW51bVR5cGV9IGlzIG5vdCBhbiBlbnVtZXJhdGVkIHR5cGUgb3IgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBoYXZlIGEgY29uc3RhbnQgdmFsdWUgY2FsbGVkIHtAY29kZSBuYW1lfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRW51bTxUPj4gVCB2YWx1ZU9mKENsYXNzPFQ+IGVudW1UeXBlLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAoKGVudW1UeXBlID09IG51bGwpIHx8IChuYW1lID09IG51bGwpKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0VudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbi5qYXZhCmluZGV4IGY0MmJlNzIuLjA0MTY3MDMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE4ICsxLDE3IEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCisvKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCiAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAogcGFja2FnZSBqYXZhLmxhbmc7CkBAIC0yMCwxMyArMTksOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIDxwPgotICogSW5kaWNhdGVzIHRoYXQgYW4gPGNvZGU+ZW51bTwvY29kZT4gY29uc3RhbnQgZG9lcyBub3QgZXhpc3QgZm9yIGEKLSAqIHBhcnRpY3VsYXIgbmFtZS4KLSAqIDwvcD4KKyAqIFRocm93biBpZiBhbiB7QGNvZGUgZW51bX0gY29uc3RhbnQgZG9lcyBub3QgZXhpc3QgZm9yIGEgcGFydGljdWxhciBuYW1lLgogICogCi0gKiBAc2luY2UgMS41Ci0gKiBAYXV0aG9yIE5hdGhhbiBCZXllciAoSGFybW9ueSkKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogCkBAIC0zOCwxMiArMzMsMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb25zdGFudE5hbWU7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZvciB0aGUgcGFzc2VkIGVudW0gYW5kIGNvbnN0YW50IG5hbWUuCi0gICAgICogPC9wPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZSBhbmQgYSBkZXRhaWwgbWVzc2FnZSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGVudW0gdHlwZSBhbmQKKyAgICAgKiBtaXNzaW5nIGNvbnN0YW50IG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVudW1UeXBlIFRoZSBlbnVtIHR5cGUuCi0gICAgICogQHBhcmFtIGNvbnN0YW50TmFtZSBUaGUgbWlzc2luZyBjb25zdGFudCBuYW1lLgorICAgICAqIEBwYXJhbSBlbnVtVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGVudW0gdHlwZS4KKyAgICAgKiBAcGFyYW0gY29uc3RhbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbWlzc2luZyBjb25zdGFudCBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9uKENsYXNzPD8gZXh0ZW5kcyBFbnVtPiBlbnVtVHlwZSwKQEAgLTU1LDExICs1MywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBlbnVtIHR5cGUgZnJvbSB3aGljaCB0aGUgY29uc3RhbnQgbmFtZSBpcyBtaXNzaW5nLgotICAgICAqIDwvcD4KKyAgICAgKiBHZXRzIHRoZSBlbnVtIHR5cGUgZm9yIHdoaWNoIHRoZSBjb25zdGFudCBuYW1lIGlzIG1pc3NpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIDxjb2RlPkNsYXNzPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbnVtIHR5cGUgZm9yIHdoaWNoIGEgY29uc3RhbnQgbmFtZSBoYXMgbm90IGJlZW4gZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBFbnVtPiBlbnVtVHlwZSgpIHsKQEAgLTY3LDExICs2NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCBtaXNzaW5nLgotICAgICAqIDwvcD4KKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBtaXNzaW5nIGNvbnN0YW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSA8Y29kZT5TdHJpbmc8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50IHRoYXQgaGFzIG5vdCBiZWVuIGZvdW5kIGluIHRoZSBlbnVtCisgICAgICogICAgICAgICB0eXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgY29uc3RhbnROYW1lKCkgewogICAgICAgICByZXR1cm4gY29uc3RhbnROYW1lOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9FcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9FcnJvci5qYXZhCmluZGV4IDc5YTYzNTIuLjNiY2U3MmMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRXJyb3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Vycm9yLmphdmEKQEAgLTE5LDU1ICsxOSw2MSBAQAogCiAKIC8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgdW5yZWNvdmVyYWJsZQotICogZXJyb3JzLiBXaGVuIEVycm9ycyBhcmUgdGhyb3duLCB0aGV5IHNob3VsZCBub3QgYmUgY2F1Z2h0IGJ5IGFwcGxpY2F0aW9uCisgKiB7QGNvZGUgRXJyb3J9IGlzIHRoZSBzdXBlcmNsYXNzIG9mIGFsbCBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IHVucmVjb3ZlcmFibGUKKyAqIGVycm9ycy4gV2hlbiBlcnJvcnMgYXJlIHRocm93biwgdGhleSBzaG91bGQgbm90IGJlIGNhdWdodCBieSBhcHBsaWNhdGlvbgogICogY29kZS4KICAqIAogICogQHNlZSBUaHJvd2FibGUKICAqIEBzZWUgRXhjZXB0aW9uCiAgKiBAc2VlIFJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRXJyb3IgZXh0ZW5kcyBUaHJvd2FibGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDk4MDE5NjUwODI3NzI4MDM0Mkw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEVycm9yfSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFcnJvcigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRXJyb3J9IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrLCBtZXNzYWdlIGFuZAotICAgICAqIGNhdXNlIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBFcnJvcn0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZSwgdGhlCisgICAgICogc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlIGFuZCB0aGUgc3BlY2lmaWVkIGNhdXNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGVycm9yLgogICAgICAqIEBwYXJhbSB0aHJvd2FibGUKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXVzZSBvZiB0aGlzIFRocm93YWJsZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlIG9mIHRoaXMgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVycm9yKFN0cmluZyBkZXRhaWxNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UsIHRocm93YWJsZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBjYXVzZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBFcnJvcn0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIGNhdXNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aHJvd2FibGUKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXVzZSBvZiB0aGlzIFRocm93YWJsZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlIG9mIHRoaXMgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVycm9yKFRocm93YWJsZSB0aHJvd2FibGUpIHsKICAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0V4Y2VwdGlvbi5qYXZhCmluZGV4IGVhZTI5ZWQuLjAxMGNlYTQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9FeGNlcHRpb24uamF2YQpAQCAtMTksNTQgKzE5LDYwIEBACiAKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBzdXBlcmNsYXNzIG9mIGFsbCBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCByZWNvdmVyYWJsZQotICogZXhjZXB0aW9ucy4gV2hlbiBFeGNlcHRpb25zIGFyZSB0aHJvd24sIHRoZXkgbWF5IGJlIGNhdWdodCBieSBhcHBsaWNhdGlvbgorICoge0Bjb2RlIEV4Y2VwdGlvbn0gaXMgdGhlIHN1cGVyY2xhc3Mgb2YgYWxsIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgcmVjb3ZlcmFibGUKKyAqIGV4Y2VwdGlvbnMuIFdoZW4gZXhjZXB0aW9ucyBhcmUgdGhyb3duLCB0aGV5IG1heSBiZSBjYXVnaHQgYnkgYXBwbGljYXRpb24KICAqIGNvZGUuCiAgKiAKICAqIEBzZWUgVGhyb3dhYmxlCiAgKiBAc2VlIEVycm9yCiAgKiBAc2VlIFJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRXhjZXB0aW9uIGV4dGVuZHMgVGhyb3dhYmxlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM4NzUxNjk5MzEyNDIyOTk0OEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2ssIG1lc3NhZ2UgYW5kCi0gICAgICogY2F1c2UgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZSwgdGhlCisgICAgICogc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlIGFuZCB0aGUgc3BlY2lmaWVkIGNhdXNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KICAgICAgKiBAcGFyYW0gdGhyb3dhYmxlCi0gICAgICogICAgICAgICAgICBUaGUgY2F1c2Ugb2YgdGhpcyBUaHJvd2FibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UsIHRocm93YWJsZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBjYXVzZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCBjYXVzZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhyb3dhYmxlCi0gICAgICogICAgICAgICAgICBUaGUgY2F1c2Ugb2YgdGhpcyBUaHJvd2FibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKICAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvci5qYXZhCmluZGV4IDRiOTU3ZDUuLjYwOTZmMDggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9FeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IuamF2YQpAQCAtMTgsNyArMTgsOSBAQAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyBjbGFzcyBpbml0aWFsaXphdGlvbi4KKyAqIFRocm93biB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIGNsYXNzIGluaXRpYWxpemF0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBleHRlbmRzIExpbmthZ2VFcnJvciB7CiAKQEAgLTI3LDcgKzI5LDEwIEBACiAgICAgcHJpdmF0ZSBUaHJvd2FibGUgZXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3J9IHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICogY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtMzUsMTEgKzQwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcn0gd2l0aCB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CkBAIC00NywxMiArNTMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIGV4Y2VwdGlvbgotICAgICAqIGZpbGxlZCBpbi4gVGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhlIG9uZSB3aGljaCBvcmlnaW5hbGx5IG9jY3VycmVkIGluCi0gICAgICogdGhlIGNsYXNzIGluaXRpYWxpemF0aW9uIGNvZGUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yfSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgY2F1c2UuIFRoZSBleGNlcHRpb24gc2hvdWxkIGJlIHRoZSBvbmUKKyAgICAgKiB3aGljaCBvcmlnaW5hbGx5IG9jY3VycmVkIGluIHRoZSBjbGFzcyBpbml0aWFsaXphdGlvbiBjb2RlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBleGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgIFRocm93YWJsZSBUaGUgZXhjZXB0aW9uIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBlcnJvci4KICAgICAgKi8KICAgICBwdWJsaWMgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTYxLDE2ICs2NywyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB3aGljaCB3YXMgcGFzc2VkIGluIHdoZW4gdGhlIGluc3RhbmNlIHdhcyBjcmVhdGVkLgorICAgICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRoZSBjYXVzZSBvZiB0aGlzIGVycm9yLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgVGhyb3dhYmxlLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGNhdXNlLgorICAgICAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgZXJyb3IsIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBubyBjYXVzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZSBUaGUgcmVjZWl2ZXIncyBjYXVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9GbG9hdC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9GbG9hdC5qYXZhCmluZGV4IDQ2ZGNhMzEuLjY5ZjkxYzUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvRmxvYXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0Zsb2F0LmphdmEKQEAgLTE4LDEyICsxOCwxMCBAQAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogPHA+Ci0gKiBGbG9hdCBpcyB0aGUgd3JhcHBlciBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlIDxjb2RlPmZsb2F0PC9jb2RlPi4KLSAqIDwvcD4KKyAqIFRoZSB3cmFwcGVyIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUge0Bjb2RlIGZsb2F0fS4KICAqIAogICogQHNlZSBqYXZhLmxhbmcuTnVtYmVyCi0gKiBAc2luY2UgMS4wCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEZsb2F0IGV4dGVuZHMgTnVtYmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxGbG9hdD4gewogCkBAIC0zNSw0OCArMzMsNDUgQEAKICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IHZhbHVlOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBtYXhpbXVtIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSwgKDIgLSAyPHN1cD4tMjM8L3N1cD4pICoKLSAgICAgKiAyPHN1cD4xMjc8L3N1cD4uCi0gICAgICogPC9wPgorICAgICAqIENvbnN0YW50IGZvciB0aGUgbWF4aW11bSB7QGNvZGUgZmxvYXR9IHZhbHVlLCAoMiAtIDI8c3VwPi0yMzwvc3VwPikgKiAyPHN1cD4xMjc8L3N1cD4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfVkFMVUUgPSAzLjQwMjgyMzQ2NjM4NTI4ODYwZSszOGY7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1pbmltdW0gPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlLCAyPHN1cD4tMTQ5PC9zdXA+LgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1pbmltdW0ge0Bjb2RlIGZsb2F0fSB2YWx1ZSwgMjxzdXA+LTE0OTwvc3VwPi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9WQUxVRSA9IDEuNDAxMjk4NDY0MzI0ODE3MDdlLTQ1ZjsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0YW50IGZvciB0aGUgTm90LWEtTnVtYmVyIChOYU4pIHZhbHVlIG9mIHRoZSA8Y29kZT5mbG9hdDwvY29kZT4KLSAgICAgKiB0eXBlLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIE5vdC1hLU51bWJlciAoTmFOKSB2YWx1ZSBvZiB0aGUge0Bjb2RlIGZsb2F0fSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTmFOID0gMC4wZiAvIDAuMGY7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIFBvc2l0aXZlIEluZmluaXR5IHZhbHVlIG9mIHRoZSA8Y29kZT5mbG9hdDwvY29kZT4KLSAgICAgKiB0eXBlLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIFBvc2l0aXZlIEluZmluaXR5IHZhbHVlIG9mIHRoZSB7QGNvZGUgZmxvYXR9IHR5cGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBQT1NJVElWRV9JTkZJTklUWSA9IDEuMGYgLyAwLjBmOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBOZWdhdGl2ZSBJbmZpbml0eSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+Ci0gICAgICogdHlwZS4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RhbnQgZm9yIHRoZSBOZWdhdGl2ZSBJbmZpbml0eSB2YWx1ZSBvZiB0aGUge0Bjb2RlIGZsb2F0fSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTkVHQVRJVkVfSU5GSU5JVFkgPSAtMS4wZiAvIDAuMGY7CiAKICAgICAvKioKLSAgICAgKiBUaGUgamF2YS5sYW5nLkNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNsYXNzLgorICAgICAqIFRoZSB7QGxpbmsgQ2xhc3N9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHByaW1pdGl2ZSB0eXBlIHtAY29kZSAKKyAgICAgKiBmbG9hdH0uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuMQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8RmxvYXQ+IFRZUEUgPSAoQ2xhc3M8RmxvYXQ+KSBuZXcgZmxvYXRbMF0KQEAgLTg2LDYzICs4MSw2NiBAQAogICAgIC8vIGRlZmluZWQgdG8gYmUgImphdmEubGFuZy5GbG9hdC5UWVBFIjsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0YW50IGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gcmVwcmVzZW50IGEgPGNvZGU+ZmxvYXQ8L2NvZGU+IGluCi0gICAgICogdHdvJ3MgY29tcGxpbWVudCBmb3JtLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgYSB7QGNvZGUgZmxvYXR9IGluCisgICAgICogdHdvJ3MgY29tcGxlbWVudCBmb3JtLgogICAgICAqIAotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFID0gMzI7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aGljaCByZXByZXNlbnRzIHRoZSBmbG9hdAotICAgICAqIHZhbHVlZCBhcmd1bWVudC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBGbG9hdH0gd2l0aCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBmbG9hdCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byBzdG9yZSBpbiB0aGUgbmV3IGluc3RhbmNlLgorICAgICAqICAgICAgICAgICAgdGhlIHByaW1pdGl2ZSBmbG9hdCB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgbmV3IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGbG9hdChmbG9hdCB2YWx1ZSkgewogICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgZG91YmxlCi0gICAgICogdmFsdWVkIGFyZ3VtZW50LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZsb2F0fSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGRvdWJsZSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gc3RvcmUgaW4gdGhlIG5ldyBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltaXRpdmUgZG91YmxlIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBuZXcgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZsb2F0KGRvdWJsZSB2YWx1ZSkgewogICAgICAgICB0aGlzLnZhbHVlID0gKGZsb2F0KSB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gYSBzdHJpbmcuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRmxvYXR9IGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdCBxdWFudGl0eS4KLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgZmxvYXQgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZmxvYXQgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBjYW4gbm90IGJlIGRlY29kZWQgaW50byBhIGZsb2F0IHZhbHVlLgorICAgICAqIEBzZWUgI3BhcnNlRmxvYXQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGbG9hdChTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhwYXJzZUZsb2F0KHN0cmluZykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSByZWNlaXZlciB3aXRoIHRoZSBGbG9hdCBwYXJhbWV0ZXIuIE5hTiBpcyBlcXVhbCB0byBOYU4sIGFuZAotICAgICAqIGlzIGdyZWF0ZXIgdGhhbiBvdGhlciBmbG9hdCB2YWx1ZXMuIDBmIGlzIGdyZWF0ZXIgdGhhbiAtMGYuCisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBmbG9hdCBvYmplY3QgdG8gZGV0ZXJtaW5lIHRoZWlyCisgICAgICogcmVsYXRpdmUgb3JkZXIuIFRoZXJlIGFyZSB0d28gc3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBGbG9hdC5OYU59IGlzIGVxdWFsIHRvIHtAY29kZSBGbG9hdC5OYU59IGFuZCBpdCBpcyBncmVhdGVyCisgICAgICogdGhhbiBhbnkgb3RoZXIgZmxvYXQgdmFsdWUsIGluY2x1ZGluZyB7QGNvZGUgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFl9OzwvbGk+CisgICAgICogPGxpPiswLjBmIGlzIGdyZWF0ZXIgdGhhbiAtMC4wZjwvbGk+CisgICAgICogPC91bD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgRmxvYXQgdG8gY29tcGFyZSB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgZ3JlYXRlciB0aGFuIHplcm8gd2hlbiB0aGlzLmZsb2F0VmFsdWUoKSBpcyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgIG9iamVjdC5mbG9hdFZhbHVlKCksIHplcm8gd2hlbiB0aGlzLmZsb2F0VmFsdWUoKSBlcXVhbHMKLSAgICAgKiAgICAgICAgIG9iamVjdC5mbG9hdFZhbHVlKCksIGFuZCBsZXNzIHRoYW4gemVybyB3aGVuIHRoaXMuZmxvYXRWYWx1ZSgpIGlzCi0gICAgICogICAgICAgICBsZXNzIHRoYW4gb2JqZWN0LmZsb2F0VmFsdWUoKQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBvYmplY3QgdG8gY29tcGFyZSB0aGlzIG9iamVjdCB0by4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxvYXQgaXMgbGVzcyB0aGFuIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgb2Yge0Bjb2RlIG9iamVjdH07IDAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxvYXQgYW5kIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgb2Yge0Bjb2RlIG9iamVjdH0gYXJlIGVxdWFsOyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgb2YgdGhpcyBmbG9hdCBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHtAY29kZSBvYmplY3R9LgorICAgICAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhGbG9hdCBvYmplY3QpIHsKICAgICAgICAgaW50IGYxLCBmMjsKQEAgLTE2NiwzNyArMTY0LDI2IEBACiAgICAgICAgIHJldHVybiB2YWx1ZSA+IG9iamVjdC52YWx1ZSA/IDEgOiAtMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBieXRlIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewogICAgICAgICByZXR1cm4gKGJ5dGUpIHZhbHVlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gZG91YmxlIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLiBGb3IgRmxvYXRzLAotICAgICAqIHRoZSBjaGVjayB2ZXJpZmllcyB0aGF0IHRoZSByZWNlaXZlcidzIHZhbHVlJ3MgYml0IHBhdHRlcm4gbWF0Y2hlcyB0aGUKLSAgICAgKiBiaXQgcGF0dGVybiBvZiB0aGUgYXJndW1lbnQsIHdoaWNoIG11c3QgYWxzbyBiZSBhIEZsb2F0LgorICAgICAqIENvbXBhcmVzIHRoaXMgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgaW5kaWNhdGVzIGlmIHRoZXkKKyAgICAgKiBhcmUgZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb2JqZWN0fSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCisgICAgICoge0Bjb2RlIEZsb2F0fSBhbmQgaGF2ZSB0aGUgc2FtZSBmbG9hdCB2YWx1ZSBhcyB0aGlzIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0Ci0gICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIGZsb2F0IHdpdGguCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIEZsb2F0fTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTIwNiwyMDAgKzE5MywxOTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LCBhcyBhbiBpbnQuCisgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBmbG9hdCB2YWx1ZSB0byBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBjb25mb3JtaW5nCisgICAgICogdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHNpbmdsZSBwcmVjaXNpb24gYml0IGxheW91dC4gQWxsCisgICAgICogPGVtPk5vdC1hLU51bWJlciAoTmFOKTwvZW0+IHZhbHVlcyBhcmUgY29udmVydGVkIHRvIGEgc2luZ2xlIE5hTgorICAgICAqIHJlcHJlc2VudGF0aW9uICh7QGNvZGUgMHg3ZmY4MDAwMDAwMDAwMDAwTH0pLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIGZsb2F0IHZhbHVlIHRvIGNvbnZlcnQKLSAgICAgKiBAcmV0dXJuIHRoZSBiaXRzIG9mIHRoZSBmbG9hdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB2YWx1ZSB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHNpbmdsZSBwcmVjaXNpb24gcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiAgICAgICAgIHtAY29kZSB2YWx1ZX0uCisgICAgICogQHNlZSAjZmxvYXRUb1Jhd0ludEJpdHMoZmxvYXQpCisgICAgICogQHNlZSAjaW50Qml0c1RvRmxvYXQoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBmbG9hdFRvSW50Qml0cyhmbG9hdCB2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LCBhcyBhbiBpbnQuCisgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBmbG9hdCB2YWx1ZSB0byBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBjb25mb3JtaW5nCisgICAgICogdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHNpbmdsZSBwcmVjaXNpb24gYml0IGxheW91dC4KKyAgICAgKiA8ZW0+Tm90LWEtTnVtYmVyIChOYU4pPC9lbT4gdmFsdWVzIGFyZSBwcmVzZXJ2ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgZmxvYXQgdmFsdWUgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gdGhlIGJpdHMgb2YgdGhlIGZsb2F0LgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHZhbHVlIHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgc2luZ2xlIHByZWNpc2lvbiByZXByZXNlbnRhdGlvbiBvZgorICAgICAqICAgICAgICAge0Bjb2RlIHZhbHVlfS4KKyAgICAgKiBAc2VlICNmbG9hdFRvSW50Qml0cyhmbG9hdCkKKyAgICAgKiBAc2VlICNpbnRCaXRzVG9GbG9hdChpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGZsb2F0VG9SYXdJbnRCaXRzKGZsb2F0IHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlY2VpdmVyJ3MgdmFsdWUgYXMgYSBmbG9hdC4KKyAgICAgKiBHZXRzIHRoZSBwcmltaXRpdmUgdmFsdWUgb2YgdGhpcyBmbG9hdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHZhbHVlCisgICAgICogQHJldHVybiB0aGlzIG9iamVjdCdzIHByaW1pdGl2ZSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byBvYmplY3RzIHdoaWNoCi0gICAgICogYW5zd2VyIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIGZsb2F0VG9JbnRCaXRzKHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYnVpbHQgZnJvbSB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGdpdmVuIGluIHRoZQotICAgICAqIGFyZ3VtZW50LgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgc2luZ2xlIHByZWNpc2lvbiBiaXQKKyAgICAgKiBwYXR0ZXJuIHRvIGEgSmF2YSBmbG9hdCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYml0cwotICAgICAqICAgICAgICAgICAgdGhlIGJpdHMgb2YgdGhlIGZsb2F0Ci0gICAgICogQHJldHVybiB0aGUgZmxvYXQgd2hpY2ggbWF0Y2hlcyB0aGUgYml0cworICAgICAqICAgICAgICAgICAgdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHNpbmdsZSBwcmVjaXNpb24gcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgIGEgZmxvYXQgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgdmFsdWUgY29udmVydGVkIGZyb20ge0Bjb2RlIGJpdHN9LgorICAgICAqIEBzZWUgI2Zsb2F0VG9JbnRCaXRzKGZsb2F0KQorICAgICAqIEBzZWUgI2Zsb2F0VG9SYXdJbnRCaXRzKGZsb2F0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGZsb2F0IGludEJpdHNUb0Zsb2F0KGludCBiaXRzKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludCB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBpbnRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cyBhbiBpbmZpbml0ZSBxdWFudGl0eSwgYW5kIGZhbHNlCi0gICAgICogb3RoZXJ3aXNlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5maW5pdGUgdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUKLSAgICAgKiAgICAgICAgIGluZmluaXR5IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QgYW4gaW5maW5pdGUgdmFsdWUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBmbG9hdCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorICAgICAqICAgICAgICAgaW5maW5pdHk7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW5maW5pdGUoKSB7CiAgICAgICAgIHJldHVybiBpc0luZmluaXRlKHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IHJlcHJlc2VudHMgYW4gaW5maW5pdGUgcXVhbnRpdHksIGFuZCBmYWxzZQotICAgICAqIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGZsb2F0IHJlcHJlc2VudHMgYW4gaW5maW5pdGUgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGNoZWNrIGZvciBpbmZpbml0bmVzcy4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZQotICAgICAqICAgICAgICAgaW5maW5pdHkgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vdCBhbiBpbmZpbml0ZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB2YWx1ZSBvZiB7QGNvZGUgZn0gaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUKKyAgICAgKiAgICAgICAgIGluZmluaXR5OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmZpbml0ZShmbG9hdCBmKSB7CiAgICAgICAgIHJldHVybiAoZiA9PSBQT1NJVElWRV9JTkZJTklUWSkgfHwgKGYgPT0gTkVHQVRJVkVfSU5GSU5JVFkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgZmxvYXQgcXVhbnRpdHkuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBvYmplY3QgaXMgYSA8ZW0+Tm90LWEtTnVtYmVyIChOYU4pPC9lbT4gdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgaXMgTm90IEEgTnVtYmVyCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgYSAocG90ZW50aWFsbHkgaW5maW5pdGUpIGZsb2F0Ci0gICAgICogICAgICAgICBudW1iZXIKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGZsb2F0IGlzIDxlbT5Ob3QtYS1OdW1iZXI8L2VtPjsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMgYSAocG90ZW50aWFsbHkgaW5maW5pdGUpIGZsb2F0IG51bWJlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc05hTigpIHsKICAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGZsb2F0IHF1YW50aXR5LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmxvYXQgaXMgYSA8ZW0+Tm90LWEtTnVtYmVyIChOYU4pPC9lbT4KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZgotICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gY2hlY2sgZm9yIG51bWJlcm5lc3MuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgaXMgTm90IEEgTnVtYmVyCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgYSAocG90ZW50aWFsbHkgaW5maW5pdGUpIGZsb2F0Ci0gICAgICogICAgICAgICBudW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgZn0gaXMgPGVtPk5vdC1hLU51bWJlcjwvZW0+OworICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBpdCBpcyBhIChwb3RlbnRpYWxseSBpbmZpbml0ZSkgZmxvYXQgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hTihmbG9hdCBmKSB7CiAgICAgICAgIHJldHVybiBmICE9IGY7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9uZyB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gbG9uZyB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIChsb25nKSB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCB3aGljaCBtYXRjaGVzIHRoZSBwYXNzZWQgaW4gc3RyaW5nLgotICAgICAqIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZAotICAgICAqIGZsb2F0LgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGZsb2F0IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiBhIGZsb2F0IHdoaWNoIHdvdWxkIHByaW50IGFzIHRoZSBhcmd1bWVudAotICAgICAqIEBzZWUgI3ZhbHVlT2YoU3RyaW5nKQotICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgZmxvYXQgdmFsdWUgcmVwcmVzZW50ZWQgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBmbG9hdCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHBhcnNlRmxvYXQoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLkZsb2F0aW5nUG9pbnRQYXJzZXIKICAgICAgICAgICAgICAgICAucGFyc2VGbG9hdChzdHJpbmcpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNob3J0IHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBzaG9ydCB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIChzaG9ydCkgdmFsdWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBGbG9hdC50b1N0cmluZyh2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgZmxvYXQgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byBwcmludAotICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqICAgICAgICAgICAgIHRoZSBmbG9hdCB0byBjb252ZXJ0IHRvIGEgc3RyaW5nLgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIGZ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGZsb2F0IGYpIHsKICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTnVtYmVyQ29udmVydGVyLmNvbnZlcnQoZik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmxvYXQgd2hpY2ggbWF0Y2hlcyB0aGUgcGFzc2VkIGluIHN0cmluZy4KLSAgICAgKiBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQKLSAgICAgKiBmbG9hdC4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBmbG9hdCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gYSBmbG9hdCB3aGljaCB3b3VsZCBwcmludCBhcyB0aGUgYXJndW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIEZsb2F0fSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBmbG9hdCB2YWx1ZSByZXByZXNlbnRlZAorICAgICAqICAgICAgICAgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBmbG9hdCB2YWx1ZS4KKyAgICAgKiBAc2VlICNwYXJzZUZsb2F0KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZsb2F0IHZhbHVlT2YoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiB2YWx1ZU9mKHBhcnNlRmxvYXQoc3RyaW5nKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBmbG9hdHMuIE5hTiBpcyBlcXVhbCB0byBOYU4sIGFuZCBpcyBncmVhdGVyIHRoYW4gb3RoZXIKLSAgICAgKiBmbG9hdCB2YWx1ZXMuIDBmIGlzIGdyZWF0ZXIgdGhhbiAtMGYuCisgICAgICogQ29tcGFyZXMgdGhlIHR3byBzcGVjaWZpZWQgZmxvYXQgdmFsdWVzLiBUaGVyZSBhcmUgdHdvIHNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgRmxvYXQuTmFOfSBpcyBlcXVhbCB0byB7QGNvZGUgRmxvYXQuTmFOfSBhbmQgaXQgaXMgZ3JlYXRlcgorICAgICAqIHRoYW4gYW55IG90aGVyIGZsb2F0IHZhbHVlLCBpbmNsdWRpbmcge0Bjb2RlIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZfTs8L2xpPgorICAgICAqIDxsaT4rMC4wZiBpcyBncmVhdGVyIHRoYW4gLTAuMGY8L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogCiAgICAgICogQHBhcmFtIGZsb2F0MQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLgogICAgICAqIEBwYXJhbSBmbG9hdDIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZQotICAgICAqIAotICAgICAqIEByZXR1cm4gUmV0dXJucyBncmVhdGVyIHRoYW4gemVybyB3aGVuIGZsb2F0MSBpcyBncmVhdGVyIHRoYW4gZmxvYXQyLAotICAgICAqICAgICAgICAgemVybyB3aGVuIGZsb2F0MSBlcXVhbHMgZmxvYXQyLCBhbmQgbGVzcyB0aGFuIHplcm8gd2hlbiBmbG9hdDEgaXMKLSAgICAgKiAgICAgICAgIGxlc3MgdGhhbiBmbG9hdDIKLSAgICAgKiBAc2luY2UgMS40CisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHtAY29kZSBmbG9hdDF9IGlzIGxlc3MgdGhhbiB7QGNvZGUgZmxvYXQyfTsKKyAgICAgKiAgICAgICAgIDAgaWYge0Bjb2RlIGZsb2F0MX0gYW5kIHtAY29kZSBmbG9hdDJ9IGFyZSBlcXVhbDsgYSBwb3NpdGl2ZQorICAgICAqICAgICAgICAgdmFsdWUgaWYge0Bjb2RlIGZsb2F0MX0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBmbG9hdDJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoZmxvYXQgZmxvYXQxLCBmbG9hdCBmbG9hdDIpIHsKICAgICAgICAgaW50IGYxLCBmMjsKQEAgLTQyNCwzMCArNDA4LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBhIDxjb2RlPkZsb2F0PC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhlIDxjb2RlPmZsb2F0PC9jb2RlPgotICAgICAqIHZhbHVlIHBhc3NlZC4gVGhpcyBtZXRob2QgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGNvbnN0cnVjdG9yLCBhcyB0aGlzCi0gICAgICogbWV0aG9kIG1heSBtYWludGFpbiBhIGNhY2hlIG9mIGluc3RhbmNlcy4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyBhIHtAY29kZSBGbG9hdH0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgZmxvYXQgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIFRoZSBmbG9hdCB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIEEgPGNvZGU+RmxvYXQ8L2NvZGU+IGluc3RhbmNlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBGbG9hdH0gaW5zdGFuY2UgY29udGFpbmluZyB7QGNvZGUgZn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGbG9hdCB2YWx1ZU9mKGZsb2F0IGYpIHsKICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChmKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb252ZXJ0cyBhIDxjb2RlPmZsb2F0PC9jb2RlPiBpbnRvIGEgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAgICAqIDwvcD4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGZsb2F0IGludG8gaXRzIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZgotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPmZsb2F0PC9jb2RlPiB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiA8Y29kZT5mPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIHRoZSBoZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIGZ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSGV4U3RyaW5nKGZsb2F0IGYpIHsKICAgICAgICAgLyoKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0Vycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFcnJvci5qYXZhCmluZGV4IDZlNGM3ZGIuLjdmODdhZmQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0Vycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXJyb3IuamF2YQpAQCAtMTcsMzAgKzE3LDM2IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiB0aGUgVk0gbm90aWNlcyB0aGF0IGEgYW4gYXR0ZW1wdCBpcyBiZWluZyBtYWRlIHRvCi0gKiBhY2Nlc3MgYSBmaWVsZCB3aGljaCBpcyBub3QgYWNjZXNzYWJsZSBmcm9tIHdoZXJlIGl0IGlzIHJlZmVyZW5jZWQuCisgKiBUaHJvd24gd2hlbiB0aGUgdmlydHVhbCBtYWNoaW5lIG5vdGljZXMgdGhhdCBhIHByb2dyYW0gdHJpZXMgYWNjZXNzIGEgZmllbGQKKyAqIHdoaWNoIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gd2hlcmUgaXQgaXMgcmVmZXJlbmNlZC4KICAqIDxwPgotICogTm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgb2NjdXIgd2hlbiBpbmNvbnNpc3RhbnQgY2xhc3MgZmlsZXMgYXJlIGJlaW5nIGxvYWRlZC4KKyAqIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4gaW5jb25zaXN0ZW50IGNsYXNzIGZpbGVzIGhhdmUgYmVlbiBsb2FkZWQuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEFjY2Vzc0Vycm9yIGV4dGVuZHMgSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODk4ODkwNDA3NDk5MjQxNzg5MUw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIElsbGVnYWxBY2Nlc3NFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsQWNjZXNzRXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIElsbGVnYWxBY2Nlc3NFcnJvcn0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZQorICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsQWNjZXNzRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbi5qYXZhCmluZGV4IGY2YzZhNjguLmI5ZDJkNjkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOSArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG8gYWNjZXNzIGEgZmllbGQgb3IgbWV0aG9kCi0gKiB3aGljaCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIG1hZGUuCisgKiBUaHJvd24gd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG8gYWNjZXNzIGEgZmllbGQgb3IgbWV0aG9kIHdoaWNoIGlzIG5vdAorICogYWNjZXNzaWJsZSBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIG1hZGUuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NjE2OTU4MjIyNDkwNzYyMDM0TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmphdmEKaW5kZXggNTAxMDg5MC4uNmY4ZGNmNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5qYXZhCkBAIC0xNyw0OCArMTcsNjAgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgbWV0aG9kIGlzIGludm9rZWQgd2l0aCBhbiBhcmd1bWVudAotICogd2hpY2ggaXQgY2FuIG5vdCByZWFzb25hYmx5IGRlYWwgd2l0aC4KKyAqIFRocm93biB3aGVuIGEgbWV0aG9kIGlzIGludm9rZWQgd2l0aCBhbiBhcmd1bWVudCB3aGljaCBpdCBjYW4gbm90IHJlYXNvbmFibHkKKyAqIGRlYWwgd2l0aC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzY1NjMwMTI4ODU2MDY4MTY0TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzIHRoZQorICAgICAqIGN1cnJlbnQgc3RhY2sgdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIDxwPkNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBhIG1lc3NhZ2UgYW5kIGNhdXNlLjwvcD4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhc3NpZ24gdG8gdGhpcyBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBvcHRpb25hbCBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbjsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSwgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiA8cD5Db25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHdpdGggYSBjYXVzZS48L3A+Ci0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBvcHRpb25hbCBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbjsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKLSAgICAgKi8KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIoKGNhdXNlID09IG51bGwgPyBudWxsIDogY2F1c2UudG9TdHJpbmcoKSksIGNhdXNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGFmODhlMzguLmU1NzBiZmQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOSArMTcsMzQgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgbW9uaXRvciBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkIHdoZW4KLSAqIHRoZSBtb25pdG9yIGlzIG5vdCBpbiB0aGUgY29ycmVjdCBzdGF0ZSwgZm9yIGV4YW1wbGUgd2hlbiBhIHRocmVhZCBhdHRlbXB0cwotICogdG8gZXhpdCBhIG1vbml0b3Igd2hpY2ggaXQgZGlkIG5vdCBvd24uCisgKiBUaHJvd24gd2hlbiBhIG1vbml0b3Igb3BlcmF0aW9uIGlzIGF0dGVtcHRlZCB3aGVuIHRoZSBtb25pdG9yIGlzIG5vdCBpbiB0aGUKKyAqIGNvcnJlY3Qgc3RhdGUsIGZvciBleGFtcGxlIHdoZW4gYSB0aHJlYWQgYXR0ZW1wdHMgdG8gZXhpdCBhIG1vbml0b3Igd2hpY2ggaXQKKyAqIGRvZXMgbm90IG93bi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNzEzMzA2MzY5NDk4ODY5MDY5TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUKKyAgICAgKiBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24uamF2YQppbmRleCBlODNmMjAzLi40MjdhYWY0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmphdmEKQEAgLTE3LDQ3ICsxNyw1OSBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYW4gYWN0aW9uIGlzIGF0dGVtcHRlZCBhdCBhIHRpbWUgd2hlbgotICogdGhlIHZpcnR1YWwgbWFjaGluZSBpcyBub3QgaW4gdGhlIGNvcnJlY3Qgc3RhdGUuCisgKiBUaHJvd24gd2hlbiBhbiBhY3Rpb24gaXMgYXR0ZW1wdGVkIGF0IGEgdGltZSB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgbm90CisgKiBpbiB0aGUgY29ycmVjdCBzdGF0ZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xODQ4OTE0NjczMDkzMTE5NDE2TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIDxwPkNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBhIG1lc3NhZ2UgYW5kIGNhdXNlLjwvcD4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhc3NpZ24gdG8gdGhpcyBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBvcHRpb25hbCBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbjsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSwgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiA8cD5Db25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHdpdGggYSBjYXVzZS48L3A+Ci0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBvcHRpb25hbCBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbjsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcigoY2F1c2UgPT0gbnVsbCA/IG51bGwgOiBjYXVzZS50b1N0cmluZygpKSwgY2F1c2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uLmphdmEKaW5kZXggNzFiMTZiNi4uODJlY2NiYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOCArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQgd2hpY2ggaXMgbm90Ci0gKiBwb3NzaWJsZSBnaXZlbiB0aGUgc3RhdGUgdGhhdCB0aGUgZXhlY3V0aW5nIHRocmVhZCBpcyBpbi4KKyAqIFRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQgd2hpY2ggaXMgbm90IHBvc3NpYmxlIGdpdmVuIHRoZSBzdGF0ZQorICogdGhhdCB0aGUgZXhlY3V0aW5nIHRocmVhZCBpcyBpbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2MjYyNDYzNjIzOTc0NjAxNzRMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICogY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yLmphdmEKaW5kZXggMmZmNGEwZC4uODM5NTBmZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yLmphdmEKQEAgLTE5LDI4ICsxOSwzNCBAQAogCiAKIC8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgZXJyb3JzIHdoaWNoCi0gKiBvY2N1ciB3aGVuIGluY29uc2lzdGFudCBjbGFzcyBmaWxlcyBhcmUgbG9hZGVkIGludG8gdGhlIHNhbWUgcnVubmluZyBpbWFnZS4KKyAqIHtAY29kZSBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfSBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB3aGljaAorICogcmVwcmVzZW50IGVycm9ycyB0aGF0IG9jY3VyIHdoZW4gaW5jb25zaXN0ZW50IGNsYXNzIGZpbGVzIGFyZSBsb2FkZWQgaW50bworICogdGhlIHNhbWUgcnVubmluZyBpbWFnZS4KICAqIAogICogQHNlZSBFcnJvcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGV4dGVuZHMgTGlua2FnZUVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00OTE0OTc1NTAzNjQyODAyMTE5TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUKKyAgICAgKiBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5qYXZhCmluZGV4IDkzZDEzNGIuLmE0ZGMyODIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOSArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byBhY2Nlc3MgYSB2YWx1ZSBpbgotICogYW4gaW5kZXhhYmxlIGNvbGxlY3Rpb24gdXNpbmcgYSB2YWx1ZSB3aGljaCBpcyBvdXRzaWRlIHRoZSBwb3NzaWJsZSByYW5nZSBvZgotICogaW5kaWNlcy4KKyAqIFRocm93biB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byBhY2Nlc3MgYSB2YWx1ZSBpbiBhbiBpbmRleGFibGUgY29sbGVjdGlvbgorICogdXNpbmcgYSB2YWx1ZSB3aGljaCBpcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB2YWxpZCBpbmRpY2VzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIzNDEyMjk5NjAwNjI2NzY4N0w7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICogY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW5oZXJpdGFibGVUaHJlYWRMb2NhbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Jbmhlcml0YWJsZVRocmVhZExvY2FsLmphdmEKaW5kZXggNzExZGNjZS4uNDFlMGQ4MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Jbmhlcml0YWJsZVRocmVhZExvY2FsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Jbmhlcml0YWJsZVRocmVhZExvY2FsLmphdmEKQEAgLTE4LDI0ICsxOCwzNyBAQAogCiAKIC8qKgotICogQSB2YXJpYWJsZSBmb3Igd2hpY2ggZWFjaCB0aHJlYWQgaGFzIGl0cyBvd24gdmFsdWU7IGNoaWxkIHRocmVhZHMgd2lsbAotICogaW5oZXJpdCB0aGUgdmFsdWUgYXQgdGhyZWFkIGNyZWF0aW9uIHRpbWUuCisgKiBBIHRocmVhZC1sb2NhbCB2YXJpYWJsZSB3aG9zZSB2YWx1ZSBpcyBwYXNzZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQgdGhyZWFkLiBCeQorICogZGVmYXVsdCwgdGhlIHZhbHVlIG9mIGFuIGluaGVyaXRhYmxlIHRocmVhZC1sb2NhbCB2YXJpYWJsZSBvZiBhIGNoaWxkIHRocmVhZAorICogaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHBhcmVudCB0aHJlYWQncyB2YXJpYWJsZSBhdCB0aHJlYWQKKyAqIGNyZWF0aW9uIHRpbWUuIEhvd2V2ZXIsIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHtjb2RlICNjaGlsZFZhbHVlKE9iamVjdCl9CisgKiB0byBwcm92aWRlIGFuIGFyYml0cmFyeSBmdW5jdGlvbiBmb3IgcGFzc2luZyB0aGUgdmFsdWUgb2YgYSBwYXJlbnQncworICogdGhyZWFkLWxvY2FsIHZhcmlhYmxlIHRvIHRoZSBjaGlsZCdzIHRocmVhZC1sb2NhbCB2YXJpYWJsZS4KICAqIAogICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkCiAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWRMb2NhbAotICogQGF1dGhvciBCb2IgTGVlCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW5oZXJpdGFibGVUaHJlYWRMb2NhbDxUPiBleHRlbmRzIFRocmVhZExvY2FsPFQ+IHsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5oZXJpdGFibGUgdGhyZWFkIGxvY2FsIHZhcmlhYmxlLgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5oZXJpdGFibGUgdGhyZWFkLWxvY2FsIHZhcmlhYmxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbmhlcml0YWJsZVRocmVhZExvY2FsKCkge30KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB2YWx1ZSBmb3IgdGhlIGNoaWxkIHRocmVhZCBnaXZlbiB0aGUgcGFyZW50IHRocmVhZCdzIHZhbHVlLgotICAgICAqIENhbGxlZCBmcm9tIHRoZSBwYXJlbnQgdGhyZWFkIHdoZW4gY3JlYXRpbmcgYSBjaGlsZCB0aHJlYWQuIFRoZSBkZWZhdWx0Ci0gICAgICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgcGFyZW50IHRocmVhZCdzIHZhbHVlLgorICAgICAqIENvbXB1dGVzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoaXMgdGhyZWFkLWxvY2FsIHZhcmlhYmxlIGZvciB0aGUgY2hpbGQKKyAgICAgKiB0aHJlYWQgZ2l2ZW4gdGhlIHBhcmVudCB0aHJlYWQncyB2YWx1ZS4gQ2FsbGVkIGZyb20gdGhlIHBhcmVudCB0aHJlYWQKKyAgICAgKiB3aGVuIGNyZWF0aW5nIGEgY2hpbGQgdGhyZWFkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZQorICAgICAqIHBhcmVudCB0aHJlYWQncyB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyZW50VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIHBhcmVudCB0aHJlYWQuCisgICAgICogQHJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgZm9yIHRoZSBjaGlsZCB0aHJlYWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFQgY2hpbGRWYWx1ZShUIHBhcmVudFZhbHVlKSB7CiAgICAgICAgIHJldHVybiBwYXJlbnRWYWx1ZTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW5zdGFudGlhdGlvbkVycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0luc3RhbnRpYXRpb25FcnJvci5qYXZhCmluZGV4IGE5YTBhOGUuLjBkMzg3YzYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW5zdGFudGlhdGlvbkVycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbnN0YW50aWF0aW9uRXJyb3IuamF2YQpAQCAtMTcsNDMgKzE3LDQ4IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiB0aGUgVk0gbm90aWNlcyB0aGF0IGEgYW4gYXR0ZW1wdCBpcyBiZWluZyBtYWRlIHRvCi0gKiBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aGljaCBoYXMgbm8gdmlzaWJsZSBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUKLSAqIGxvY2F0aW9uIHdoZXJlIG5ldyBpcyBpbnZva2VkLgorICogVGhyb3duIHdoZW4gdGhlIHZpcnR1YWwgbWFjaGluZSBub3RpY2VzIHRoYXQgYSBwcm9ncmFtIHRyaWVzIHRvIGNyZWF0ZSBhIG5ldworICogaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aGljaCBoYXMgbm8gdmlzaWJsZSBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUKKyAqIHtAY29kZSBuZXd9IGlzIGludm9rZWQuCiAgKiA8cD4KICAqIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4gaW5jb25zaXN0ZW50IGNsYXNzIGZpbGVzIGFyZSBiZWluZyBsb2FkZWQuCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvbkVycm9yIGV4dGVuZHMgSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4ODU4MTA2NTczNDk0MjEyMDRMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnN0YW50aWF0aW9uRXJyb3J9IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbkVycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnN0YW50aWF0aW9uRXJyb3J9IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UKKyAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbkVycm9yKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnN0YW50aWF0aW9uRXJyb3J9IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UKKyAgICAgKiBhbmQgdGhlIGNsYXNzIHRoYXQgY2F1c2VkIHRoaXMgZXJyb3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogICAgICAgICAgICBDbGFzcyBUaGUgY2xhc3Mgd2hpY2ggY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGNhbiBub3QgYmUgaW5zdGFudGlhdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEluc3RhbnRpYXRpb25FcnJvcihDbGFzczw/PiBjbGF6eikgewogICAgICAgICBzdXBlcihjbGF6ei5nZXROYW1lKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb24uamF2YQppbmRleCA0MGVjMDg0Li5jYzhiNTU2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMTcsNDAgKzE3LDQ0IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIGFjY2VzcyBhIGNvbnN0cnVjdG9yCi0gKiB3aGljaCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIG1hZGUuCisgKiBUaHJvd24gd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG8gYWNjZXNzIGEgY29uc3RydWN0b3Igd2hpY2ggaXMgbm90CisgKiBhY2Nlc3NpYmxlIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZWZlcmVuY2UgaXMgbWFkZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODQ0MTkyOTE2Mjk3NTUwOTExMEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEluc3RhbnRpYXRpb25FeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgY2xhc3MgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogICAgICAgICAgICBDbGFzcyBUaGUgY2xhc3Mgd2hpY2ggY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGNhbiBub3QgYmUgaW5zdGFudGlhdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24oQ2xhc3M8Pz4gY2xhenopIHsKICAgICAgICAgc3VwZXIoY2xhenouZ2V0TmFtZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW50ZWdlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbnRlZ2VyLmphdmEKaW5kZXggOTdlNmM1Ni4uM2E5ODg3MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbnRlZ2VyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbnRlZ2VyLmphdmEKQEAgLTE4LDE5ICsxOCwxNiBAQAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgorICogVGhlIHdyYXBwZXIgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSB7QGNvZGUgaW50fS4KICAqIDxwPgotICogSW50ZWdlciBpcyB0aGUgd3JhcHBlciBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlIDxjb2RlPmludDwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogQXMgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZWQgb24gY29kZSBsYWlkIG91dCBpbiA8YQorICogQXMgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gY29kZSBsYWlkIG91dCBpbiA8YQogICogaHJlZj0iaHR0cDovL3d3dy5oYWNrZXJzZGVsaWdodC5vcmcvIj5IZW5yeSBTLiBXYXJyZW4sIEpyLidzIEhhY2tlcidzCiAgKiBEZWxpZ2h0LCAoQWRkaXNvbiBXZXNsZXksIDIwMDIpPC9hPiBhcyB3ZWxsIGFzIDxhCiAgKiBocmVmPSJodHRwOi8vYWdncmVnYXRlLm9yZy9NQUdJQy8iPlRoZSBBZ2dyZWdhdGUncyBNYWdpYyBBbGdvcml0aG1zPC9hPi4KICAqIDwvcD4KICAqIAogICogQHNlZSBqYXZhLmxhbmcuTnVtYmVyCi0gKiBAc2luY2UgMS4xCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEludGVnZXIgZXh0ZW5kcyBOdW1iZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPEludGVnZXI+IHsKIApAQCAtNDIsMzEgKzM5LDMxIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1heGltdW0gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSwgMjxzdXA+MzE8L3N1cD4tMS4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RhbnQgZm9yIHRoZSBtYXhpbXVtIHtAY29kZSBpbnR9IHZhbHVlLCAyPHN1cD4zMTwvc3VwPi0xLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9WQUxVRSA9IDB4N0ZGRkZGRkY7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1pbmltdW0gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSwgLTI8c3VwPjMxPC9zdXA+LgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1pbmltdW0ge0Bjb2RlIGludH0gdmFsdWUsIC0yPHN1cD4zMTwvc3VwPi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fVkFMVUUgPSAweDgwMDAwMDAwOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBudW1iZXIgb2YgYml0cyB0byByZXByZXNlbnQgYW4gPGNvZGU+aW50PC9jb2RlPiBpbgotICAgICAqIHR3bydzIGNvbXBsaW1lbnQgZm9ybS4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RhbnQgZm9yIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IGFuIHtAY29kZSBpbnR9IGluCisgICAgICogdHdvJ3MgY29tcGxlbWVudCBmb3JtLgogICAgICAqIAotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFID0gMzI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgamF2YS5sYW5nLkNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNsYXNzLgorICAgICAqIFRoZSB7QGxpbmsgQ2xhc3N9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHByaW1pdGl2ZSB0eXBlIHtAY29kZSBpbnR9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8SW50ZWdlcj4gVFlQRSA9IChDbGFzczxJbnRlZ2VyPikgbmV3IGludFswXQpAQCAtNzYsODAgKzczLDgxIEBACiAgICAgLy8gZGVmaW5lZCB0byBiZSAiamF2YS5sYW5nLkludGVnZXIuVFlQRSI7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aGljaCByZXByZXNlbnRzIHRoZSBpbnQgdmFsdWVkCi0gICAgICogYXJndW1lbnQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW50ZWdlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBpbnRlZ2VyCisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaW50IHRvIHN0b3JlIGluIHRoZSBuZXcgaW5zdGFuY2UuCisgICAgICogICAgICAgICAgICB0aGUgcHJpbWl0aXZlIGludGVnZXIgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIG5ldyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW50ZWdlcihpbnQgdmFsdWUpIHsKICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBhIHN0cmluZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnRlZ2VyfSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludCBxdWFudGl0eS4KLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGFuIGludCBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHJpbmd9IGNhbiBub3QgYmUgZGVjb2RlZCBpbnRvIGFuIGludGVnZXIgdmFsdWUuCisgICAgICogQHNlZSAjcGFyc2VJbnQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnRlZ2VyKFN0cmluZyBzdHJpbmcpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewogICAgICAgICB0aGlzKHBhcnNlSW50KHN0cmluZykpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ5dGUgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJ5dGUgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CiAgICAgICAgIHJldHVybiAoYnl0ZSkgdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29tcGFyZXMgdGhpcyA8Y29kZT5JbnRlZ2VyPC9jb2RlPiB0byB0aGUgPGNvZGU+SW50ZWdlcjwvY29kZT4KLSAgICAgKiBwYXNzZWQuIElmIHRoaXMgaW5zdGFuY2UncyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlCi0gICAgICogcGFzc2VkLCB0aGVuIDAgaXMgcmV0dXJuZWQuIElmIHRoaXMgaW5zdGFuY2UncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlCi0gICAgICogdmFsdWUgb2YgdGhlIGluc3RhbmNlIHBhc3NlZCwgdGhlbiBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkLiBJZiB0aGlzCi0gICAgICogaW5zdGFuY2UncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBwYXNzZWQsIHRoZW4gYQotICAgICAqIHBvc2l0aXZlIHZhbHVlIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGludGVnZXIgb2JqZWN0IHRvIGRldGVybWluZSB0aGVpcgorICAgICAqIHJlbGF0aXZlIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbnN0YW5jZSB0byBjb21wYXJlIHRvLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIG9iamVjdCB0byBjb21wYXJlIHRoaXMgb2JqZWN0IHRvLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBpbnRlZ2VyIGlzIGxlc3MgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgIHZhbHVlIG9mIHtAY29kZSBvYmplY3R9OyAwIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGludGVnZXIgYW5kIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgb2Yge0Bjb2RlIG9iamVjdH0gYXJlIGVxdWFsOyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgb2YgdGhpcyBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2Yge0Bjb2RlIG9iamVjdH0uCisgICAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEludGVnZXIgb2JqZWN0KSB7CiAgICAgICAgIHJldHVybiB2YWx1ZSA+IG9iamVjdC52YWx1ZSA/IDEgOiAodmFsdWUgPCBvYmplY3QudmFsdWUgPyAtMSA6IDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhbiBpbnQgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGFuCi0gICAgICogaW50IHF1YW50aXR5LiBUaGUgc3RyaW5nIG1heSBiZSBhIGhleGFkZWNpbWFsICgiMHguLi4iKSwgb2N0YWwgKCIwLi4uIiksCi0gICAgICogb3IgZGVjaW1hbCAoIi4uLiIpIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIKKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybnMgYSB7QGNvZGUgSW50ZWdlcn0gaW5zdGFuY2UgaWYgdGhlCisgICAgICogc3RyaW5nIGNhbiBiZSBkZWNvZGVkIGludG8gYW4gaW50ZWdlciB2YWx1ZS4gVGhlIHN0cmluZyBtYXkgYmUgYW4KKyAgICAgKiBvcHRpb25hbCBtaW51cyBzaWduICItIiBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsICgiMHguLi4iIG9yICIjLi4uIiksCisgICAgICogb2N0YWwgKCIwLi4uIiksIG9yIGRlY2ltYWwgKCIuLi4iKSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludCBxdWFudGl0eS4KLSAgICAgKiBAcmV0dXJuIEludGVnZXIgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBhcmd1bWVudAotICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYW4gaW50IHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBJbnRlZ2VyfSBjb250YWluaW5nIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieQorICAgICAqICAgICAgICAge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBjYW4gbm90IGJlIHBhcnNlZCBhcyBhbiBpbnRlZ2VyIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBkZWNvZGUoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCksIGkgPSAwOwogICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigidW5hYmxlIHRvIHBhcnNlICciK3N0cmluZysiJyBhcyBpbnRlZ2VyIik7CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KICAgICAgICAgY2hhciBmaXJzdERpZ2l0ID0gc3RyaW5nLmNoYXJBdChpKTsKICAgICAgICAgYm9vbGVhbiBuZWdhdGl2ZSA9IGZpcnN0RGlnaXQgPT0gJy0nOwogICAgICAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oInVuYWJsZSB0byBwYXJzZSAnIitzdHJpbmcrIicgYXMgaW50ZWdlciIpOworICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpcnN0RGlnaXQgPSBzdHJpbmcuY2hhckF0KCsraSk7CiAgICAgICAgIH0KQEAgLTE2MSw3ICsxNTksOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChmaXJzdERpZ2l0ID0gc3RyaW5nLmNoYXJBdChpKSkgPT0gJ3gnIHx8IGZpcnN0RGlnaXQgPT0gJ1gnKSB7CiAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJ1bmFibGUgdG8gcGFyc2UgJyIrc3RyaW5nKyInIGFzIGludGVnZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgYmFzZSA9IDE2OwpAQCAtMTcwLDcgKzE3MCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3REaWdpdCA9PSAnIycpIHsKICAgICAgICAgICAgIGlmIChpID09IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oInVuYWJsZSB0byBwYXJzZSAnIitzdHJpbmcrIicgYXMgaW50ZWdlciIpOworICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIGJhc2UgPSAxNjsKQEAgLTE4MCwyOCArMTgyLDIxIEBACiAgICAgICAgIHJldHVybiB2YWx1ZU9mKHJlc3VsdCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG91YmxlIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBkb3VibGUgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudAotICAgICAqIHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyBjYXNlLCB0aGUgYXJndW1lbnQgbXVzdCBhbHNvIGJlIGFuIEludGVnZXIsIGFuZCB0aGUgcmVjZWl2ZXIgYW5kCi0gICAgICogYXJndW1lbnQgbXVzdCByZXByZXNlbnQgdGhlIHNhbWUgaW50IHZhbHVlLgorICAgICAqIENvbXBhcmVzIHRoaXMgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgaW5kaWNhdGVzIGlmIHRoZXkKKyAgICAgKiBhcmUgZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb30gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZgorICAgICAqIHtAY29kZSBJbnRlZ2VyfSBhbmQgaGF2ZSB0aGUgc2FtZSBpbnRlZ2VyIHZhbHVlIGFzIHRoaXMgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0Ci0gICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIGludGVnZXIgd2l0aC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgSW50ZWdlcn07IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtMjA5LDI0ICsyMDQsMjIgQEAKICAgICAgICAgICAgICAgICAmJiAodmFsdWUgPT0gKChJbnRlZ2VyKSBvKS52YWx1ZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmxvYXQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZsb2F0IHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBuYW1lZAotICAgICAqIGJ5IHRoZSBhcmd1bWVudC4gSWYgdGhlIHByb3BlcnR5IGNvdWxkIG5vdCBiZSBmb3VuZCwgb3IgaXRzIHZhbHVlIGNvdWxkCi0gICAgICogbm90IGJlIHBhcnNlZCBhcyBhbiBpbnRlZ2VyLCBhbnN3ZXIgbnVsbC4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgSW50ZWdlcn0gdmFsdWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSBpZGVudGlmaWVkIGJ5CisgICAgICoge0Bjb2RlIHN0cmluZ30uIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHtAY29kZSBzdHJpbmd9IGlzIHtAY29kZSBudWxsfQorICAgICAqIG9yIGVtcHR5LCBpZiB0aGUgcHJvcGVydHkgY2FuIG5vdCBiZSBmb3VuZCBvciBpZiBpdHMgdmFsdWUgY2FuIG5vdCBiZQorICAgICAqIHBhcnNlZCBhcyBhbiBpbnRlZ2VyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGludGVnZXIgcHJvcGVydHkuCi0gICAgICogQHJldHVybiBJbnRlZ2VyIEFuIEludGVnZXIgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgcHJvcGVydHkncyB2YWx1ZSBhcyBhbiB7QGNvZGUgSW50ZWdlcn0gb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CkBAIC0yNDQsMTQgKzIzNywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG5hbWVkCi0gICAgICogYnkgdGhlIGFyZ3VtZW50LiBJZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIGZvdW5kLCBvciBpdHMgdmFsdWUgY291bGQKLSAgICAgKiBub3QgYmUgcGFyc2VkIGFzIGFuIGludGVnZXIsIGFuc3dlciBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgc2Vjb25kCi0gICAgICogYXJndW1lbnQuCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIEludGVnZXJ9IHZhbHVlIG9mIHRoZSBzeXN0ZW0gcHJvcGVydHkgaWRlbnRpZmllZCBieQorICAgICAqIHtAY29kZSBzdHJpbmd9LiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBpZiB7QGNvZGUgc3RyaW5nfSBpcworICAgICAqIHtAY29kZSBudWxsfSBvciBlbXB0eSwgaWYgdGhlIHByb3BlcnR5IGNhbiBub3QgYmUgZm91bmQgb3IgaWYgaXRzIHZhbHVlCisgICAgICogY2FuIG5vdCBiZSBwYXJzZWQgYXMgYW4gaW50ZWdlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBpbnRlZ2VyIHByb3BlcnR5LgotICAgICAqIEByZXR1cm4gSW50ZWdlciBBbiBJbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBzeXN0ZW0gcHJvcGVydHkuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBpbnRlZ2VyCisgICAgICogICAgICAgICAgICBzeXN0ZW0gcHJvcGVydHkgd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHByb3BlcnR5J3MgdmFsdWUgYXMgYW4ge0Bjb2RlIEludGVnZXJ9IG9yIHRoZQorICAgICAqICAgICAgICAgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAgICAgICAgIAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBzdHJpbmcsIGludCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CkBAIC0yNjksMTMgKzI2NywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG5hbWVkCi0gICAgICogYnkgdGhlIGFyZ3VtZW50LiBJZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIGZvdW5kLCBvciBpdHMgdmFsdWUgY291bGQKLSAgICAgKiBub3QgYmUgcGFyc2VkIGFzIGFuIGludGVnZXIsIGFuc3dlciB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBJbnRlZ2VyfSB2YWx1ZSBvZiB0aGUgc3lzdGVtIHByb3BlcnR5IGlkZW50aWZpZWQgYnkKKyAgICAgKiB7QGNvZGUgc3RyaW5nfS4gUmV0dXJucyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgaWYge0Bjb2RlIHN0cmluZ30gaXMKKyAgICAgKiB7QGNvZGUgbnVsbH0gb3IgZW1wdHksIGlmIHRoZSBwcm9wZXJ0eSBjYW4gbm90IGJlIGZvdW5kIG9yIGlmIGl0cyB2YWx1ZQorICAgICAqIGNhbiBub3QgYmUgcGFyc2VkIGFzIGFuIGludGVnZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgaW50ZWdlciBwcm9wZXJ0eS4KLSAgICAgKiBAcmV0dXJuIEludGVnZXIgQW4gSW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc3lzdGVtIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gaW50ZWdlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtIHByb3BlcnR5IHdpdGggdGhlIHJlcXVlc3RlZCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSdzIHZhbHVlIGFzIGFuIHtAY29kZSBJbnRlZ2VyfSBvciB0aGUKKyAgICAgKiAgICAgICAgIGRlZmF1bHQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wICAgICAgICAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcgc3RyaW5nLCBJbnRlZ2VyIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICBpZiAoc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmxlbmd0aCgpID09IDApIHsKQEAgLTI5Miw4MiArMjk2LDc5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gb2JqZWN0cyB3aGljaAotICAgICAqIGFuc3dlciA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbnQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKKyAgICAgKiBHZXRzIHRoZSBwcmltaXRpdmUgdmFsdWUgb2YgdGhpcyBpbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0J3MgcHJpbWl0aXZlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb25nIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBsb25nIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgYXMgaWYgaXQgd2FzIGFuIGludCB2YWx1ZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQuIFRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYW4KLSAgICAgKiBpbnQgcXVhbnRpdHkuCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlciB2YWx1ZS4gVGhlIEFTQ0lJCisgICAgICogY2hhcmFjdGVyIFx1MDAyZCAoJy0nKSBpcyByZWNvZ25pemVkIGFzIHRoZSBtaW51cyBzaWduLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludCBxdWFudGl0eS4KLSAgICAgKiBAcmV0dXJuIGludCB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhbiBpbnQgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgcHJpbWl0aXZlIGludGVnZXIgdmFsdWUgcmVwcmVzZW50ZWQgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBwYXJzZUludChTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHN0cmluZywgMTApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhbiBpbnQgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGFuCi0gICAgICogaW50IHF1YW50aXR5LiBUaGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggdG8gdXNlIHdoZW4gcGFyc2luZwotICAgICAqIHRoZSB2YWx1ZS4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBzaWduZWQgaW50ZWdlciB2YWx1ZSB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogcmFkaXguIFRoZSBBU0NJSSBjaGFyYWN0ZXIgXHUwMDJkICgnLScpIGlzIHJlY29nbml6ZWQgYXMgdGhlIG1pbnVzIHNpZ24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50IHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIHZhbHVlLgogICAgICAqIEBwYXJhbSByYWRpeAotICAgICAqICAgICAgICAgICAgdGhlIGJhc2UgdG8gdXNlIGZvciBjb252ZXJzaW9uLgotICAgICAqIEByZXR1cm4gaW50IHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGFuIGludCBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB0byB1c2Ugd2hlbiBwYXJzaW5nLgorICAgICAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHtAY29kZSBzdHJpbmd9IHVzaW5nCisgICAgICogICAgICAgICB7QGNvZGUgcmFkaXh9LgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gaXMge0Bjb2RlIG51bGx9IG9yIGhhcyBhIGxlbmd0aCBvZiB6ZXJvLAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVh9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVh9LCBvciBpZiB7QGNvZGUgc3RyaW5nfQorICAgICAqICAgICAgICAgICAgIGNhbiBub3QgYmUgcGFyc2VkIGFzIGFuIGludGVnZXIgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgcGFyc2VJbnQoU3RyaW5nIHN0cmluZywgaW50IHJhZGl4KQogICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCB8fCByYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVgKICAgICAgICAgICAgICAgICB8fCByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVgpIHsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigidW5hYmxlIHRvIHBhcnNlICciK3N0cmluZysiJyBhcyBpbnRlZ2VyIik7CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KICAgICAgICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKSwgaSA9IDA7CiAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJ1bmFibGUgdG8gcGFyc2UgJyIrc3RyaW5nKyInIGFzIGludGVnZXIiKTsKKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQogICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0gc3RyaW5nLmNoYXJBdChpKSA9PSAnLSc7CiAgICAgICAgIGlmIChuZWdhdGl2ZSAmJiArK2kgPT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oInVuYWJsZSB0byBwYXJzZSAnIitzdHJpbmcrIicgYXMgaW50ZWdlciIpOworICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHBhcnNlKHN0cmluZywgaSwgcmFkaXgsIG5lZ2F0aXZlKTsKQEAgLTM4MCw0MyArMzgxLDQ3IEBACiAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKICAgICAgICAgICAgIGludCBkaWdpdCA9IENoYXJhY3Rlci5kaWdpdChzdHJpbmcuY2hhckF0KG9mZnNldCsrKSwgcmFkaXgpOwogICAgICAgICAgICAgaWYgKGRpZ2l0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigidW5hYmxlIHRvIHBhcnNlICciK3N0cmluZysiJyBhcyBpbnRlZ2VyIik7CisgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1heCA+IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oInVuYWJsZSB0byBwYXJzZSAnIitzdHJpbmcrIicgYXMgaW50ZWdlciIpOworICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBuZXh0ID0gcmVzdWx0ICogcmFkaXggLSBkaWdpdDsKICAgICAgICAgICAgIGlmIChuZXh0ID4gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigidW5hYmxlIHRvIHBhcnNlICciK3N0cmluZysiJyBhcyBpbnRlZ2VyIik7CisgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gbmV4dDsKICAgICAgICAgfQogICAgICAgICBpZiAoIW5lZ2F0aXZlKSB7CiAgICAgICAgICAgICByZXN1bHQgPSAtcmVzdWx0OwogICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJ1bmFibGUgdG8gcGFyc2UgJyIrc3RyaW5nKyInIGFzIGludGVnZXIiKTsKKyAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaG9ydCB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gc2hvcnQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIChzaG9ydCkgdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nICcwJyBhbmQgJzEnIGNoYXJhY3RlcnMgd2hpY2ggZGVzY3JpYmUgdGhlCi0gICAgICogYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGludGVnZXIgaW50byBpdHMgYmluYXJ5IHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhlCisgICAgICogcmV0dXJuZWQgc3RyaW5nIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiAnMCcgYW5kICcxJyBjaGFyYWN0ZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBhbiBpbnQgdG8gZ2V0IHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudAorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIHRoZSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0JpbmFyeVN0cmluZyhpbnQgaSkgewogICAgICAgICBpbnQgY291bnQgPSAxLCBqID0gaTsKQEAgLTQzOCwxMyArNDQzLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDAuLjksIGEuLmYgd2hpY2gKLSAgICAgKiBkZXNjcmliZSB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBpbnRvIGl0cyBoZXhhZGVjaW1hbCBzdHJpbmcKKyAgICAgKiByZXByZXNlbnRhdGlvbi4gVGhlIHJldHVybmVkIHN0cmluZyBpcyBhIGNvbmNhdGVuYXRpb24gb2YgY2hhcmFjdGVycyBmcm9tCisgICAgICogJzAnIHRvICc5JyBhbmQgJ2EnIHRvICdmJy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaQotICAgICAqICAgICAgICAgICAgYW4gaW50IHRvIGdldCB0aGUgaGV4IHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQKLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9IZXhTdHJpbmcoaW50IGkpIHsKICAgICAgICAgaW50IGNvdW50ID0gMSwgaiA9IGk7CiAKQEAgLTQ3MSwxMyArNDc4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDAuLjcgd2hpY2ggZGVzY3JpYmUKLSAgICAgKiB0aGUgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBpbnRvIGl0cyBvY3RhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFRoZQorICAgICAqIHJldHVybmVkIHN0cmluZyBpcyBhIGNvbmNhdGVuYXRpb24gb2YgY2hhcmFjdGVycyBmcm9tICcwJyB0byAnNycuCiAgICAgICogCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIGFuIGludCB0byBnZXQgdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQKLSAgICAgKi8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUgb2N0YWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9PY3RhbFN0cmluZyhpbnQgaSkgewogICAgICAgICBpbnQgY291bnQgPSAxLCBqID0gaTsKIApAQCAtNDk3LDQwICs1MDUsNDAgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoMCwgYnVmZmVyLmxlbmd0aCwgYnVmZmVyKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAwLi45IHdoaWNoIGRlc2NyaWJlCi0gICAgICogdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBpbnRvIGl0cyBkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiBhIG1pbnVzIHNpZ24gaWYgdGhlIG51bWJlciBpcworICAgICAqIG5lZ2F0aXZlIGFuZCBjaGFyYWN0ZXJzIGZyb20gJzAnIHRvICc5Jy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaQotICAgICAqICAgICAgICAgICAgYW4gaW50IHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50Ci0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIGRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoaW50IGkpIHsKICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKGksIDEwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgMC4uOSwgYS4ueiAoZGVwZW5kaW5nCi0gICAgICogb24gdGhlIHJhZGl4KSB3aGljaCBkZXNjcmliZSB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50IGluIHRoYXQKLSAgICAgKiByYWRpeC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGludGVnZXIgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBiYXNlZCBvbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmFkaXguIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgYSBjb25jYXRlbmF0aW9uIG9mIGEgbWludXMgc2lnbgorICAgICAqIGlmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUgYW5kIGNoYXJhY3RlcnMgZnJvbSAnMCcgdG8gJzknIGFuZCAnYScgdG8gJ3onLAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgcmFkaXguIElmIHtAY29kZSByYWRpeH0gaXMgbm90IGluIHRoZSBpbnRlcnZhbCBkZWZpbmVkCisgICAgICogYnkge0Bjb2RlIENoYXJhY3Rlci5NSU5fUkFESVh9IGFuZCB7QGNvZGUgQ2hhcmFjdGVyLk1BWF9SQURJWH0gdGhlbiAxMCBpcworICAgICAqIHVzZWQgYXMgdGhlIGJhc2UgZm9yIHRoZSBjb252ZXJzaW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBhbiBpbnQgdG8gZ2V0IHRoZSByZXByZXNlbnRhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdG8gY29udmVydC4KICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBiYXNlIHRvIHVzZSBmb3IgY29udmVyc2lvbi4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50Ci0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgYmFzZSB0byB1c2UgZm9yIHRoZSBjb252ZXJzaW9uLgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgaX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovICAgIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGludCBpLCBpbnQgcmFkaXgpIHsKICAgICAgICAgaWYgKHJhZGl4IDwgQ2hhcmFjdGVyLk1JTl9SQURJWCB8fCByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVgpIHsKICAgICAgICAgICAgIHJhZGl4ID0gMTA7CkBAIC01NjYsMzMgKzU3NCwzOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhbiBpbnQgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGFuCi0gICAgICogaW50IHF1YW50aXR5LgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50IHF1YW50aXR5LgotICAgICAqIEByZXR1cm4gSW50ZWdlciB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhbiBpbnQgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgdmFsdWUuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgSW50ZWdlcn0gaW5zdGFuY2UgY29udGFpbmluZyB0aGUgaW50ZWdlciB2YWx1ZQorICAgICAqICAgICAgICAgcmVwcmVzZW50ZWQgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAc2VlICNwYXJzZUludChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIHZhbHVlT2YoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiB2YWx1ZU9mKHBhcnNlSW50KHN0cmluZykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhbiBpbnQgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGFuCi0gICAgICogaW50IHF1YW50aXR5LiBUaGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggdG8gdXNlIHdoZW4gcGFyc2luZwotICAgICAqIHRoZSB2YWx1ZS4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBzaWduZWQgaW50ZWdlciB2YWx1ZSB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogcmFkaXguCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50IHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIHZhbHVlLgogICAgICAqIEBwYXJhbSByYWRpeAotICAgICAqICAgICAgICAgICAgdGhlIGJhc2UgdG8gdXNlIGZvciBjb252ZXJzaW9uLgotICAgICAqIEByZXR1cm4gSW50ZWdlciB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhbiBpbnQgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdG8gdXNlIHdoZW4gcGFyc2luZy4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBJbnRlZ2VyfSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBpbnRlZ2VyIHZhbHVlCisgICAgICogICAgICAgICByZXByZXNlbnRlZCBieSB7QGNvZGUgc3RyaW5nfSB1c2luZyB7QGNvZGUgcmFkaXh9LgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gaXMge0Bjb2RlIG51bGx9IG9yIGhhcyBhIGxlbmd0aCBvZiB6ZXJvLAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVh9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVh9LCBvciBpZiB7QGNvZGUgc3RyaW5nfQorICAgICAqICAgICAgICAgICAgIGNhbiBub3QgYmUgcGFyc2VkIGFzIGFuIGludGVnZXIgdmFsdWUuCisgICAgICogQHNlZSAjcGFyc2VJbnQoU3RyaW5nLCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIHZhbHVlT2YoU3RyaW5nIHN0cmluZywgaW50IHJhZGl4KQogICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CkBAIC02MDAsMTYgKzYxNCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIERldGVybWluZXMgdGhlIGhpZ2hlc3QgKGxlZnRtb3N0KSBiaXQgdGhhdCBpcyAxIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQotICAgICAqIHRoYXQgaXMgdGhlIGJpdCBtYXNrIGZvciB0aGF0IGJpdC4gVGhpcyBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgdGhlCi0gICAgICogTW9zdCBTaWduaWZpY2FudCAxIEJpdC4KLSAgICAgKiA8L3A+CisgICAgICogRGV0ZXJtaW5lcyB0aGUgaGlnaGVzdCAobGVmdG1vc3QpIGJpdCBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdGhhdCBpcyAxCisgICAgICogYW5kIHJldHVybnMgdGhlIGJpdCBtYXNrIHZhbHVlIGZvciB0aGF0IGJpdC4gVGhpcyBpcyBhbHNvIHJlZmVycmVkIHRvIGFzCisgICAgICogdGhlIE1vc3QgU2lnbmlmaWNhbnQgMSBCaXQuIFJldHVybnMgemVybyBpZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgaXMKKyAgICAgKiB6ZXJvLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+aW50PC9jb2RlPiB0byBpbnRlcnJvZ2F0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoZSBoaWdoZXN0IDEgYml0LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHRvIGV4YW1pbmUuCisgICAgICogQHJldHVybiB0aGUgYml0IG1hc2sgaW5kaWNhdGluZyB0aGUgaGlnaGVzdCAxIGJpdCBpbiB7QGNvZGUgaX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgaGlnaGVzdE9uZUJpdChpbnQgaSkgewogICAgICAgICBpIHw9IChpID4+IDEpOwpAQCAtNjIxLDMxICs2MzQsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBEZXRlcm1pbmVzIHRoZSBsb3dlc3QgKHJpZ2h0bW9zdCkgYml0IHRoYXQgaXMgMSBhbmQgcmV0dXJucyB0aGUgdmFsdWUKLSAgICAgKiB0aGF0IGlzIHRoZSBiaXQgbWFzayBmb3IgdGhhdCBiaXQuIFRoaXMgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHRoZQotICAgICAqIExlYXN0IFNpZ25pZmljYW50IDEgQml0LgotICAgICAqIDwvcD4KKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBsb3dlc3QgKHJpZ2h0bW9zdCkgYml0IG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0aGF0IGlzIDEKKyAgICAgKiBhbmQgcmV0dXJucyB0aGUgYml0IG1hc2sgdmFsdWUgZm9yIHRoYXQgYml0LiBUaGlzIGlzIGFsc28gcmVmZXJyZWQKKyAgICAgKiB0byBhcyB0aGUgTGVhc3QgU2lnbmlmaWNhbnQgMSBCaXQuIFJldHVybnMgemVybyBpZiB0aGUgc3BlY2lmaWVkIGludGVnZXIKKyAgICAgKiBpcyB6ZXJvLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+aW50PC9jb2RlPiB0byBpbnRlcnJvZ2F0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoZSBsb3dlc3QgMSBiaXQuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdG8gZXhhbWluZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoZSBsb3dlc3QgMSBiaXQgaW4ge0Bjb2RlIGl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGxvd2VzdE9uZUJpdChpbnQgaSkgewogICAgICAgICByZXR1cm4gKGkgJiAoLWkpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB0aGUgPGNvZGU+aW50PC9jb2RlPiBwYXNzZWQKLSAgICAgKiBwcmlvciB0byB0aGUge0BsaW5rICNoaWdoZXN0T25lQml0KGludCkgaGlnaGVzdCBvbmUgYml0fS4KLSAgICAgKiA8L3A+CisgICAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MgaW4gdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHByaW9yIHRvCisgICAgICogdGhlIHtAbGluayAjaGlnaGVzdE9uZUJpdChpbnQpIGhpZ2hlc3Qgb25lIGJpdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHRvIHByb2Nlc3MuCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdG8gZXhhbWluZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB7QGNvZGUgaX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgbnVtYmVyT2ZMZWFkaW5nWmVyb3MoaW50IGkpIHsKICAgICAgICAgaSB8PSBpID4+IDE7CkBAIC02NTcsMzAgKzY2NywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcyBpbiB0aGUgPGNvZGU+aW50PC9jb2RlPiBwYXNzZWQKLSAgICAgKiBhZnRlciB0aGUge0BsaW5rICNsb3dlc3RPbmVCaXQoaW50KSBsb3dlc3Qgb25lIGJpdH0uCi0gICAgICogPC9wPgorICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcyBpbiB0aGUgc3BlY2lmaWVkIGludGVnZXIgYWZ0ZXIKKyAgICAgKiB0aGUge0BsaW5rICNsb3dlc3RPbmVCaXQoaW50KSBsb3dlc3Qgb25lIGJpdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHRvIHByb2Nlc3MuCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHRvIGV4YW1pbmUuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zIGluIHtAY29kZSBpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBudW1iZXJPZlRyYWlsaW5nWmVyb3MoaW50IGkpIHsKICAgICAgICAgcmV0dXJuIGJpdENvdW50KChpICYgLWkpIC0gMSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgMSBiaXRzIGluIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHBhc3NlZDsgdGhpcwotICAgICAqIGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBhIHBvcHVsYXRpb24gY291bnQuCi0gICAgICogPC9wPgorICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIDEgYml0cyBpbiB0aGUgc3BlY2lmaWVkIGludGVnZXI7IHRoaXMgaXMgYWxzbworICAgICAqIHJlZmVycmVkIHRvIGFzIHBvcHVsYXRpb24gY291bnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHRvIHByb2Nlc3MuCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIDEgYml0cy4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB0byBleGFtaW5lLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiAxIGJpdHMgaW4ge0Bjb2RlIGl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpdENvdW50KGludCBpKSB7CiAgICAgICAgIGkgLT0gKChpID4+IDEpICYgMHg1NTU1NTU1NSk7CkBAIC02OTIsMTcgKzY5OCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJvdGF0ZXMgdGhlIGJpdHMgb2YgPGNvZGU+aTwvY29kZT4gdG8gdGhlIGxlZnQgYnkgdGhlCi0gICAgICogPGNvZGU+ZGlzdGFuY2U8L2NvZGU+IGJpdHMuCi0gICAgICogPC9wPgorICAgICAqIFJvdGF0ZXMgdGhlIGJpdHMgb2YgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHRvIHRoZSBsZWZ0IGJ5IHRoZSBzcGVjaWZpZWQKKyAgICAgKiBudW1iZXIgb2YgYml0cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaQotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgdG8gcm90YXRlIGxlZnQuCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZSB0byByb3RhdGUgbGVmdC4KICAgICAgKiBAcGFyYW0gZGlzdGFuY2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYml0cyB0byByb3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgcm90YXRlZCB2YWx1ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gcm90YXRlLgorICAgICAqIEByZXR1cm4gdGhlIHJvdGF0ZWQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgcm90YXRlTGVmdChpbnQgaSwgaW50IGRpc3RhbmNlKSB7CiAgICAgICAgIGlmIChkaXN0YW5jZSA9PSAwKSB7CkBAIC03MTcsMTcgKzcyMSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJvdGF0ZXMgdGhlIGJpdHMgb2YgPGNvZGU+aTwvY29kZT4gdG8gdGhlIHJpZ2h0IGJ5IHRoZQotICAgICAqIDxjb2RlPmRpc3RhbmNlPC9jb2RlPiBiaXRzLgotICAgICAqIDwvcD4KKyAgICAgKiBSb3RhdGVzIHRoZSBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0byB0aGUgcmlnaHQgYnkgdGhlIHNwZWNpZmllZAorICAgICAqIG51bWJlciBvZiBiaXRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSB0byByb3RhdGUgcmlnaHQuCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZSB0byByb3RhdGUgcmlnaHQuCiAgICAgICogQHBhcmFtIGRpc3RhbmNlCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gcm90YXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJvdGF0ZWQgdmFsdWUuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJvdGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByb3RhdGVkIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHJvdGF0ZVJpZ2h0KGludCBpLCBpbnQgZGlzdGFuY2UpIHsKICAgICAgICAgaWYgKGRpc3RhbmNlID09IDApIHsKQEAgLTc0MiwxNCArNzQ0LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV2ZXJzZXMgdGhlIGJ5dGVzIG9mIGEgPGNvZGU+aW50PC9jb2RlPi4KLSAgICAgKiA8L3A+CisgICAgICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBieXRlcyBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHRvIHJldmVyc2UuCi0gICAgICogQHJldHVybiBUaGUgcmV2ZXJzZWQgdmFsdWUuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgZm9yIHdoaWNoIHRvIHJldmVyc2UgdGhlIGJ5dGUgb3JkZXIuCisgICAgICogQHJldHVybiB0aGUgcmV2ZXJzZWQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgcmV2ZXJzZUJ5dGVzKGludCBpKSB7CiAgICAgICAgIGludCBiMyA9IGkgPj4+IDI0OwpAQCAtNzYwLDE0ICs3NjAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXZlcnNlcyB0aGUgYnl0ZXMgb2YgYSA8Y29kZT5pbnQ8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBSZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGJpdHMgb2YgdGhlIHNwZWNpZmllZCBpbnRlZ2VyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+aW50PC9jb2RlPiB0byByZXZlcnNlLgotICAgICAqIEByZXR1cm4gVGhlIHJldmVyc2VkIHZhbHVlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHZhbHVlIGZvciB3aGljaCB0byByZXZlcnNlIHRoZSBiaXQgb3JkZXIuCisgICAgICogQHJldHVybiB0aGUgcmV2ZXJzZWQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgcmV2ZXJzZShpbnQgaSkgewogICAgICAgICAvLyBGcm9tIEhhY2tlcidzIERlbGlnaHQsIDctMSwgRmlndXJlIDctMQpAQCAtNzc4LDMyICs3NzYsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+c2lnbnVtPC9jb2RlPiBmdW5jdGlvbiBmb3IgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZXMuIFRoaXMKLSAgICAgKiBtZXRob2QgcmV0dXJucyAtMSBmb3IgbmVnYXRpdmUgdmFsdWVzLCAxIGZvciBwb3NpdGl2ZSB2YWx1ZXMgYW5kIDAgZm9yCi0gICAgICogdGhlIHZhbHVlIDAuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUgc2lnbnVtfSBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGludGVnZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgotICAgICAqIEByZXR1cm4gLTEgaWYgbmVnYXRpdmUsIDEgaWYgcG9zaXRpdmUgb3RoZXJ3aXNlIDAuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybiAtMSBpZiB7QGNvZGUgaX0gaXMgbmVnYXRpdmUsIDEgaWYge0Bjb2RlIGl9IGlzIHBvc2l0aXZlLCAwIGlmCisgICAgICogICAgICAgICB7QGNvZGUgaX0gaXMgemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBzaWdudW0oaW50IGkpIHsKICAgICAgICAgcmV0dXJuIChpID09IDAgPyAwIDogKGkgPCAwID8gLTEgOiAxKSk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAY29kZSBJbnRlZ2VyfSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgogICAgICAqIDxwPgotICAgICAqIFJldHVybnMgYSA8Y29kZT5JbnRlZ2VyPC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhlIDxjb2RlPmludDwvY29kZT4KLSAgICAgKiB2YWx1ZSBwYXNzZWQuIFRoaXMgbWV0aG9kIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBjb25zdHJ1Y3RvciwgYXMgdGhpcwotICAgICAqIG1ldGhvZCBtYXkgbWFpbnRhaW4gYSBjYWNoZSBvZiBpbnN0YW5jZXMuCisgICAgICogSWYgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBnZXQgYSBuZXcge0Bjb2RlIEludGVnZXJ9IGluc3RhbmNlLCBpdCBpcworICAgICAqIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjb25zdHJ1Y3Rvciwgc2luY2UgaXQKKyAgICAgKiBtYWludGFpbnMgYSBjYWNoZSBvZiBpbnN0YW5jZXMgd2hpY2ggbWF5IHJlc3VsdCBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBUaGUgaW50IHZhbHVlLgotICAgICAqIEByZXR1cm4gQSA8Y29kZT5JbnRlZ2VyPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBJbnRlZ2VyfSBpbnN0YW5jZSBjb250YWluaW5nIHtAY29kZSBpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgdmFsdWVPZihpbnQgaSkgewogICAgICAgICBpZiAoaSA8IC0xMjggfHwgaSA+IDEyNykgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbnRlcm5hbEVycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0ludGVybmFsRXJyb3IuamF2YQppbmRleCBlNjBkNGZlLi45MDgyY2Q4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0ludGVybmFsRXJyb3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0ludGVybmFsRXJyb3IuamF2YQpAQCAtMTcsMjggKzE3LDMzIEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiB0aGUgVk0gbm90aWNlcyB0aGF0IGl0IGhhcyBnb3R0ZW4gaW50byBhIHN0YXRlCi0gKiB3aGljaCBpdCBkb2VzIG5vdCB1bmRlcnN0YW5kLgorICogVGhyb3duIHdoZW4gdGhlIHZpcnR1YWwgbWFjaGluZSBub3RpY2VzIHRoYXQgaXQgaGFzIGdvdHRlbiBpbnRvIGFuIHVuZGVmaW5lZAorICogc3RhdGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW50ZXJuYWxFcnJvciBleHRlbmRzIFZpcnR1YWxNYWNoaW5lRXJyb3IgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkwNjI1OTM0MTYxMjU1NjIzNjVMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnRlcm5hbEVycm9yfSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludGVybmFsRXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEludGVybmFsRXJyb3J9IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW50ZXJuYWxFcnJvcihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb24uamF2YQppbmRleCA0YzUyOWQ1Li5iMDE0NTU5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOCArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIHdhaXRpbmcgdGhyZWFkIGlzIGFjdGl2YXRlZCBiZWZvcmUgdGhlCi0gKiBjb25kaXRpb24gaXQgd2FzIHdhaXRpbmcgb24gaGFzIGJlZW4gc2F0aXNmaWVkLgorICogVGhyb3duIHdoZW4gYSB3YWl0aW5nIHRocmVhZCBpcyBhY3RpdmF0ZWQgYmVmb3JlIHRoZSBjb25kaXRpb24gaXQgd2FzIHdhaXRpbmcKKyAqIGZvciBoYXMgYmVlbiBzYXRpc2ZpZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjcwMDY5NzM3NjEwMDYyODQ3M0w7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEludGVycnVwdGVkRXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludGVycnVwdGVkRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW50ZXJydXB0ZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0l0ZXJhYmxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0l0ZXJhYmxlLmphdmEKaW5kZXggY2JlYWM1My4uZDEyZjBhNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9JdGVyYWJsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvSXRlcmFibGUuamF2YQpAQCAtMSwxOCArMSwxNyBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgorLyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAogICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKIHBhY2thZ2UgamF2YS5sYW5nOwpAQCAtMjAsMTYgKzE5LDE4IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiAvKioKLSAqIDxwPkltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCB3aXRoaW4gYSA8Y29kZT5mb3JlYWNoPC9jb2RlPgotICogc3RhdGVtZW50LjwvcD4KLSAqIEBzaW5jZSAxLjUKKyAqIE9iamVjdHMgb2YgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCB3aXRoaW4gYQorICoge0Bjb2RlIGZvcmVhY2h9IHN0YXRlbWVudC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSXRlcmFibGU8VD4gewogCiAgICAgLyoqCi0gICAgICogPHA+UmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9IGZvciB0aGUgZWxlbWVudHMgaW4gdGhpcyBvYmplY3QuPC9wPgorICAgICAqIFJldHVybnMgYW4ge0BsaW5rIEl0ZXJhdG9yfSBmb3IgdGhlIGVsZW1lbnRzIGluIHRoaXMgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gQW4ge0Bjb2RlIEl0ZXJhdG9yfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBJdGVyYXRvcjxUPiBpdGVyYXRvcigpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9MaW5rYWdlRXJyb3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTGlua2FnZUVycm9yLmphdmEKaW5kZXggODE2NDRkZC4uOWJiYTU0YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9MaW5rYWdlRXJyb3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0xpbmthZ2VFcnJvci5qYXZhCkBAIC0xOSwyOCArMTksMzMgQEAKIAogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIHN1cGVyY2xhc3Mgb2YgYWxsIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGVycm9ycyB0aGF0IG9jY3VyCi0gKiB3aGVuIGxvYWRpbmcgYW5kIGxpbmtpbmcgY2xhc3MgZmlsZXMuCisgKiB7QGNvZGUgTGlua2FnZUVycm9yfSBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgZXJyb3IgY2xhc3NlcyB0aGF0IG9jY3VyIHdoZW4KKyAqIGxvYWRpbmcgYW5kIGxpbmtpbmcgY2xhc3MgZmlsZXMuCiAgKiAKICAqIEBzZWUgRXJyb3IKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTGlua2FnZUVycm9yIGV4dGVuZHMgRXJyb3IgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzU3OTYwMDEwODE1NzE2MDEyMkw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIExpbmthZ2VFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rYWdlRXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIExpbmthZ2VFcnJvcn0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rYWdlRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0xvbmcuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTG9uZy5qYXZhCmluZGV4IGJhODZhMmIuLjAwYjU2YWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTG9uZy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTG9uZy5qYXZhCkBAIC0xOCwxOSArMTgsMTYgQEAKIHBhY2thZ2UgamF2YS5sYW5nOwogCiAvKioKKyAqIFRoZSB3cmFwcGVyIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUge0Bjb2RlIGxvbmd9LgogICogPHA+Ci0gKiBMb25nIGlzIHRoZSB3cmFwcGVyIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUgPGNvZGU+bG9uZzwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogQXMgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZWQgb24gY29kZSBsYWlkIG91dCBpbiA8YQorICogQXMgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gY29kZSBsYWlkIG91dCBpbiA8YQogICogaHJlZj0iaHR0cDovL3d3dy5oYWNrZXJzZGVsaWdodC5vcmcvIj5IZW5yeSBTLiBXYXJyZW4sIEpyLidzIEhhY2tlcidzCiAgKiBEZWxpZ2h0LCAoQWRkaXNvbiBXZXNsZXksIDIwMDIpPC9hPiBhcyB3ZWxsIGFzIDxhCiAgKiBocmVmPSJodHRwOi8vYWdncmVnYXRlLm9yZy9NQUdJQy8iPlRoZSBBZ2dyZWdhdGUncyBNYWdpYyBBbGdvcml0aG1zPC9hPi4KICAqIDwvcD4KICAqIAogICogQHNlZSBqYXZhLmxhbmcuTnVtYmVyCi0gKiBAc2luY2UgMS4wCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIExvbmcgZXh0ZW5kcyBOdW1iZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPExvbmc+IHsKIApAQCAtNDIsMjEgKzM5LDIzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHZhbHVlOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBtYXhpbXVtIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlLCAyPHN1cD42Mzwvc3VwPi0xLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG1heGltdW0ge0Bjb2RlIGxvbmd9IHZhbHVlLCAyPHN1cD42Mzwvc3VwPi0xLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNQVhfVkFMVUUgPSAweDdGRkZGRkZGRkZGRkZGRkZMOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBtaW5pbXVtIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlLCAtMjxzdXA+MzE8L3N1cD4uCi0gICAgICogPC9wPgorICAgICAqIENvbnN0YW50IGZvciB0aGUgbWluaW11bSB7QGNvZGUgbG9uZ30gdmFsdWUsIC0yPHN1cD42Mzwvc3VwPi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTUlOX1ZBTFVFID0gMHg4MDAwMDAwMDAwMDAwMDAwTDsKIAogICAgIC8qKgotICAgICAqIFRoZSBqYXZhLmxhbmcuQ2xhc3MgdGhhdCByZXByZXNlbnRzIHRoaXMgY2xhc3MuCisgICAgICogVGhlIHtAbGluayBDbGFzc30gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcHJpbWl0aXZlIHR5cGUge0Bjb2RlIGxvbmd9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8TG9uZz4gVFlQRSA9IChDbGFzczxMb25nPikgbmV3IGxvbmdbMF0uZ2V0Q2xhc3MoKQpAQCAtNjYsODAgKzY1LDczIEBACiAgICAgLy8gZGVmaW5lZCB0byBiZSAiamF2YS5sYW5nLkxvbmcuVFlQRSI7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJlcHJlc2VudCBhIDxjb2RlPmxvbmc8L2NvZGU+IGluCi0gICAgICogdHdvJ3MgY29tcGxpbWVudCBmb3JtLgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgYSB7QGNvZGUgbG9uZ30gaW4KKyAgICAgKiB0d28ncyBjb21wbGVtZW50IGZvcm0uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSA2NDsKIAogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9uZwotICAgICAqIHZhbHVlZCBhcmd1bWVudC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBMb25nfSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGxvbmcgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBzdG9yZSBpbiB0aGUgbmV3IGluc3RhbmNlLgorICAgICAqICAgICAgICAgICAgdGhlIHByaW1pdGl2ZSBsb25nIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBuZXcgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExvbmcobG9uZyB2YWx1ZSkgewogICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGdpdmVuIGEgc3RyaW5nLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIExvbmd9IGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gbG9uZyBxdWFudGl0eS4KLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgbG9uZyBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gY2FuIG5vdCBiZSBkZWNvZGVkIGludG8gYSBsb25nIHZhbHVlLgorICAgICAqIEBzZWUgI3BhcnNlTG9uZyhTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExvbmcoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMocGFyc2VMb25nKHN0cmluZykpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ5dGUgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJ5dGUgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CiAgICAgICAgIHJldHVybiAoYnl0ZSkgdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29tcGFyZXMgdGhpcyA8Y29kZT5Mb25nPC9jb2RlPiB0byB0aGUgPGNvZGU+TG9uZzwvY29kZT4gcGFzc2VkLiBJZgotICAgICAqIHRoaXMgaW5zdGFuY2UncyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlIHBhc3NlZCwgdGhlbgotICAgICAqIDAgaXMgcmV0dXJuZWQuIElmIHRoaXMgaW5zdGFuY2UncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIHRoZQotICAgICAqIGluc3RhbmNlIHBhc3NlZCwgdGhlbiBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkLiBJZiB0aGlzIGluc3RhbmNlJ3MKLSAgICAgKiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBwYXNzZWQsIHRoZW4gYSBwb3NpdGl2ZQotICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGxvbmcgb2JqZWN0IHRvIGRldGVybWluZSB0aGVpcgorICAgICAqIHJlbGF0aXZlIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbnN0YW5jZSB0byBjb21wYXJlIHRvLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIG9iamVjdCB0byBjb21wYXJlIHRoaXMgb2JqZWN0IHRvLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBsb25nIGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUKKyAgICAgKiAgICAgICAgIG9mIHtAY29kZSBvYmplY3R9OyAwIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGxvbmcgYW5kIHRoZSB2YWx1ZSBvZgorICAgICAqICAgICAgICAge0Bjb2RlIG9iamVjdH0gYXJlIGVxdWFsOyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzCisgICAgICogICAgICAgICBsb25nIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2Yge0Bjb2RlIG9iamVjdH0uCisgICAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExvbmcgb2JqZWN0KSB7CiAgICAgICAgIHJldHVybiB2YWx1ZSA+IG9iamVjdC52YWx1ZSA/IDEgOiAodmFsdWUgPCBvYmplY3QudmFsdWUgPyAtMSA6IDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhIGxvbmcgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEKLSAgICAgKiBsb25nIHF1YW50aXR5LiBUaGUgc3RyaW5nIG1heSBiZSBhIGhleGFkZWNpbWFsICgiMHguLi4iKSwgb2N0YWwgKCIwLi4uIiksCi0gICAgICogb3IgZGVjaW1hbCAoIi4uLiIpIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9uZy4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybnMgYSB7QGNvZGUgTG9uZ30gaW5zdGFuY2UgaWYgdGhlCisgICAgICogc3RyaW5nIGNhbiBiZSBkZWNvZGVkIGludG8gYSBsb25nIHZhbHVlLiBUaGUgc3RyaW5nIG1heSBiZSBhbiBvcHRpb25hbAorICAgICAqIG1pbnVzIHNpZ24gIi0iIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgKCIweC4uLiIgb3IgIiMuLi4iKSwgb2N0YWwKKyAgICAgKiAoIjAuLi4iKSwgb3IgZGVjaW1hbCAoIi4uLiIpIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9uZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBsb25nIHF1YW50aXR5LgotICAgICAqIEByZXR1cm4gTG9uZyB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhbiBsb25nIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTG9uZ30gY29udGFpbmluZyB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGxvbmcgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb25nIGRlY29kZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKSwgaSA9IDA7CkBAIC0xODEsMjggKzE3MywyMSBAQAogICAgICAgICByZXR1cm4gdmFsdWVPZihyZXN1bHQpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gZG91YmxlIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIGFyZ3VtZW50IG11c3QgYWxzbyBiZSBhbiBMb25nLCBhbmQgdGhlIHJlY2VpdmVyIGFuZAotICAgICAqIGFyZ3VtZW50IG11c3QgcmVwcmVzZW50IHRoZSBzYW1lIGxvbmcgdmFsdWUuCisgICAgICogQ29tcGFyZXMgdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBpbmRpY2F0ZXMgaWYgdGhleQorICAgICAqIGFyZSBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvfSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCisgICAgICoge0Bjb2RlIExvbmd9IGFuZCBoYXZlIHRoZSBzYW1lIGxvbmcgdmFsdWUgYXMgdGhpcyBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIG8KLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0Ci0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBvYmplY3QKLSAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgbG9uZyB3aXRoLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBMb25nfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CkBAIC0yMTAsMjQgKzE5NSwyMSBAQAogICAgICAgICAgICAgICAgICYmICh2YWx1ZSA9PSAoKExvbmcpIG8pLnZhbHVlKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gZmxvYXQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgbG9uZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbmFtZWQgYnkgdGhlCi0gICAgICogYXJndW1lbnQuIElmIHRoZSBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgZm91bmQsIG9yIGl0cyB2YWx1ZSBjb3VsZCBub3QgYmUKLSAgICAgKiBwYXJzZWQgYXMgYSBsb25nLCBhbnN3ZXIgbnVsbC4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgTG9uZ30gdmFsdWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSBpZGVudGlmaWVkIGJ5CisgICAgICoge0Bjb2RlIHN0cmluZ30uIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHtAY29kZSBzdHJpbmd9IGlzIHtAY29kZSBudWxsfQorICAgICAqIG9yIGVtcHR5LCBpZiB0aGUgcHJvcGVydHkgY2FuIG5vdCBiZSBmb3VuZCBvciBpZiBpdHMgdmFsdWUgY2FuIG5vdCBiZQorICAgICAqIHBhcnNlZCBhcyBhIGxvbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgaW50ZWdlciBwcm9wZXJ0eS4KLSAgICAgKiBAcmV0dXJuIExvbmcgQSBMb25nIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBzeXN0ZW0gcHJvcGVydHkuCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHByb3BlcnR5J3MgdmFsdWUgYXMgYSB7QGNvZGUgTG9uZ30gb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTG9uZyBnZXRMb25nKFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CkBAIC0yNDUsMTMgKzIyNywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgbG9uZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbmFtZWQgYnkgdGhlCi0gICAgICogYXJndW1lbnQuIElmIHRoZSBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgZm91bmQsIG9yIGl0cyB2YWx1ZSBjb3VsZCBub3QgYmUKLSAgICAgKiBwYXJzZWQgYXMgYSBsb25nLCBhbnN3ZXIgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBMb25nfSB2YWx1ZSBvZiB0aGUgc3lzdGVtIHByb3BlcnR5IGlkZW50aWZpZWQgYnkKKyAgICAgKiB7QGNvZGUgc3RyaW5nfS4gUmV0dXJucyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgaWYge0Bjb2RlIHN0cmluZ30gaXMKKyAgICAgKiB7QGNvZGUgbnVsbH0gb3IgZW1wdHksIGlmIHRoZSBwcm9wZXJ0eSBjYW4gbm90IGJlIGZvdW5kIG9yIGlmIGl0cyB2YWx1ZQorICAgICAqIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgbG9uZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBsb25nIHByb3BlcnR5LgotICAgICAqIEByZXR1cm4gTG9uZyBBbiBMb25nIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBzeXN0ZW0gcHJvcGVydHkuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBsb25nIHN5c3RlbQorICAgICAqICAgICAgICAgICAgcHJvcGVydHkgd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHByb3BlcnR5J3MgdmFsdWUgYXMgYSB7QGNvZGUgTG9uZ30gb3IgdGhlIGRlZmF1bHQKKyAgICAgKiAgICAgICAgIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTG9uZyBnZXRMb25nKFN0cmluZyBzdHJpbmcsIGxvbmcgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewpAQCAtMjY5LDEzICsyNTcsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIExvbmcgcmVwcmVzZW50aW5nIHRoZSBsb25nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBuYW1lZCBieSB0aGUKLSAgICAgKiBhcmd1bWVudC4gSWYgdGhlIHByb3BlcnR5IGNvdWxkIG5vdCBiZSBmb3VuZCwgb3IgaXRzIHZhbHVlIGNvdWxkIG5vdCBiZQotICAgICAqIHBhcnNlZCBhcyBhbiBsb25nLCBhbnN3ZXIgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgTG9uZ30gdmFsdWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSBpZGVudGlmaWVkIGJ5CisgICAgICoge0Bjb2RlIHN0cmluZ30uIFJldHVybnMgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGlmIHtAY29kZSBzdHJpbmd9IGlzCisgICAgICoge0Bjb2RlIG51bGx9IG9yIGVtcHR5LCBpZiB0aGUgcHJvcGVydHkgY2FuIG5vdCBiZSBmb3VuZCBvciBpZiBpdHMgdmFsdWUKKyAgICAgKiBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGxvbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgbG9uZyBwcm9wZXJ0eS4KLSAgICAgKiBAcmV0dXJuIExvbmcgQW4gTG9uZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc3lzdGVtIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gbG9uZyBzeXN0ZW0KKyAgICAgKiAgICAgICAgICAgIHByb3BlcnR5IHdpdGggdGhlIHJlcXVlc3RlZCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSdzIHZhbHVlIGFzIGEge0Bjb2RlIExvbmd9IG9yIHRoZSBkZWZhdWx0CisgICAgICogICAgICAgICB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExvbmcgZ2V0TG9uZyhTdHJpbmcgc3RyaW5nLCBMb25nIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICBpZiAoc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmxlbmd0aCgpID09IDApIHsKQEAgLTI5MiwzNCArMjg2LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gb2JqZWN0cyB3aGljaAotICAgICAqIGFuc3dlciA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiAoaW50KSAodmFsdWUgXiAodmFsdWUgPj4+IDMyKSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50IHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgewogICAgICAgICByZXR1cm4gKGludCkgdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9uZyB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cworICAgICAqIEdldHMgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiB0aGlzIGxvbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBsb25nIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiB0aGlzIG9iamVjdCdzIHByaW1pdGl2ZSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CkBAIC0zMjcsMzMgKzMwOCwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhIGxvbmcgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEKLSAgICAgKiBsb25nIHF1YW50aXR5LgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIHNpZ25lZCBkZWNpbWFsIGxvbmcgdmFsdWUuIFRoZSBBU0NJSQorICAgICAqIGNoYXJhY3RlciBcdTAwMmQgKCctJykgaXMgcmVjb2duaXplZCBhcyB0aGUgbWludXMgc2lnbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgcXVhbnRpdHkuCi0gICAgICogQHJldHVybiBsb25nIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgbG9uZyBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSBsb25nIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHtAY29kZSBzdHJpbmd9LgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gaXMge0Bjb2RlIG51bGx9LCBoYXMgYSBsZW5ndGggb2YgemVybyBvcgorICAgICAqICAgICAgICAgICAgIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgbG9uZyB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgcGFyc2VMb25nKFN0cmluZyBzdHJpbmcpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gcGFyc2VMb25nKHN0cmluZywgMTApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhbiBsb25nIHZhbHVlIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlc3VsdC4gVGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhbgotICAgICAqIGxvbmcgcXVhbnRpdHkuIFRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSByYWRpeCB0byB1c2Ugd2hlbgotICAgICAqIHBhcnNpbmcgdGhlIHZhbHVlLgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIHNpZ25lZCBsb25nIHZhbHVlIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByYWRpeC4gVGhlIEFTQ0lJIGNoYXJhY3RlciBcdTAwMmQgKCctJykgaXMgcmVjb2duaXplZCBhcyB0aGUgbWludXMgc2lnbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBsb25nIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgdmFsdWUuCiAgICAgICogQHBhcmFtIHJhZGl4Ci0gICAgICogICAgICAgICAgICB0aGUgYmFzZSB0byB1c2UgZm9yIGNvbnZlcnNpb24uCi0gICAgICogQHJldHVybiBsb25nIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGFuIGxvbmcgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdG8gdXNlIHdoZW4gcGFyc2luZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgbG9uZyB2YWx1ZSByZXByZXNlbnRlZCBieSB7QGNvZGUgc3RyaW5nfSB1c2luZworICAgICAqICAgICAgICAge0Bjb2RlIHJhZGl4fS4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHJpbmd9IGlzIHtAY29kZSBudWxsfSBvciBoYXMgYSBsZW5ndGggb2YgemVybywKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgcmFkaXggPCBDaGFyYWN0ZXIuTUlOX1JBRElYfSwKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgcmFkaXggPiBDaGFyYWN0ZXIuTUFYX1JBRElYfSwgb3IgaWYge0Bjb2RlIHN0cmluZ30KKyAgICAgKiAgICAgICAgICAgICBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGxvbmcgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIHBhcnNlTG9uZyhTdHJpbmcgc3RyaW5nLCBpbnQgcmFkaXgpCiAgICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKQEAgLTQwMCwyMyArMzg1LDE5IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hvcnQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHNob3J0IHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiAoc2hvcnQpIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyAnMCcgYW5kICcxJyBjaGFyYWN0ZXJzIHdoaWNoIGRlc2NyaWJlIHRoZQotICAgICAqIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBsb25nIHZhbHVlIGludG8gaXRzIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBhIGNvbmNhdGVuYXRpb24gb2YgJzAnIGFuZCAnMScgY2hhcmFjdGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgYSBsb25nIHRvIGdldCB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUgYmluYXJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9CaW5hcnlTdHJpbmcobG9uZyBsKSB7CiAgICAgICAgIGludCBjb3VudCA9IDE7CkBAIC00MzksMTIgKzQyMCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAwLi43LCBhLi5mIHdoaWNoCi0gICAgICogZGVzY3JpYmUgdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGxvbmcgdmFsdWUgaW50byBpdHMgaGV4YWRlY2ltYWwgc3RyaW5nCisgICAgICogcmVwcmVzZW50YXRpb24uIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgYSBjb25jYXRlbmF0aW9uIG9mIGNoYXJhY3RlcnMgZnJvbQorICAgICAqICcwJyB0byAnOScgYW5kICdhJyB0byAnZicuCiAgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIGEgbG9uZyB0byBnZXQgdGhlIGhleCByZXByZXNlbnRhdGlvbiBvZgotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZSB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9IZXhTdHJpbmcobG9uZyBsKSB7CiAgICAgICAgIGludCBjb3VudCA9IDE7CkBAIC00NzMsMTIgKzQ1NiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAwLi43IHdoaWNoIGRlc2NyaWJlCi0gICAgICogdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGxvbmcgdmFsdWUgaW50byBpdHMgb2N0YWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgYSBjb25jYXRlbmF0aW9uIG9mIGNoYXJhY3RlcnMgZnJvbSAnMCcgdG8gJzcnLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsCi0gICAgICogICAgICAgICAgICBhIGxvbmcgdG8gZ2V0IHRoZSBvY3RhbCByZXByZXNlbnRhdGlvbiBvZgotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBvY3RhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUgb2N0YWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b09jdGFsU3RyaW5nKGxvbmcgbCkgewogICAgICAgICBpbnQgY291bnQgPSAxOwpAQCAtNTAwLDM5ICs0ODQsMzkgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoMCwgYnVmZmVyLmxlbmd0aCwgYnVmZmVyKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAwLi45IHdoaWNoIGRlc2NyaWJlCi0gICAgICogdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZSBpbnRvIGl0cyBkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiBhIG1pbnVzIHNpZ24gaWYgdGhlIG51bWJlciBpcworICAgICAqIG5lZ2F0aXZlIGFuZCBjaGFyYWN0ZXJzIGZyb20gJzAnIHRvICc5Jy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgYSBsb25nIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50Ci0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIGRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcobG9uZyBsKSB7CiAgICAgICAgIHJldHVybiB0b1N0cmluZyhsLCAxMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDAuLjksIGEuLnogKGRlcGVuZGluZwotICAgICAqIG9uIHRoZSByYWRpeCkgd2hpY2ggZGVzY3JpYmUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudCBpbiB0aGF0Ci0gICAgICogcmFkaXguCisgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBsb25nIHZhbHVlIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYmFzZWQgb24KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiBhIG1pbnVzCisgICAgICogc2lnbiBpZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlIGFuZCBjaGFyYWN0ZXJzIGZyb20gJzAnIHRvICc5JyBhbmQgJ2EnIHRvCisgICAgICogJ3onLCBkZXBlbmRpbmcgb24gdGhlIHJhZGl4LiBJZiB7QGNvZGUgcmFkaXh9IGlzIG5vdCBpbiB0aGUgaW50ZXJ2YWwKKyAgICAgKiBkZWZpbmVkIGJ5IHtAY29kZSBDaGFyYWN0ZXIuTUlOX1JBRElYfSBhbmQge0Bjb2RlIENoYXJhY3Rlci5NQVhfUkFESVh9CisgICAgICogdGhlbiAxMCBpcyB1c2VkIGFzIHRoZSBiYXNlIGZvciB0aGUgY29udmVyc2lvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgYSBsb25nIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHRvIGNvbnZlcnQuCiAgICAgICogQHBhcmFtIHJhZGl4Ci0gICAgICogICAgICAgICAgICB0aGUgYmFzZSB0byB1c2UgZm9yIGNvbnZlcnNpb24uCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmd1bWVudAorICAgICAqICAgICAgICAgICAgdGhlIGJhc2UgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGxvbmcgbCwgaW50IHJhZGl4KSB7CiAgICAgICAgIGlmIChyYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVggfHwgcmFkaXggPiBDaGFyYWN0ZXIuTUFYX1JBRElYKSB7CkBAIC01NzAsMzMgKzU1NCwzOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhbiBsb25nIHZhbHVlIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlc3VsdC4gVGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhbgotICAgICAqIGxvbmcgcXVhbnRpdHkuCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEgc2lnbmVkIGRlY2ltYWwgbG9uZyB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBsb25nIHF1YW50aXR5LgotICAgICAqIEByZXR1cm4gTG9uZyB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhbiBsb25nIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgdmFsdWUuCisgICAgICogQHJldHVybiBhIHtAY29kZSBMb25nfSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBsb25nIHZhbHVlIHJlcHJlc2VudGVkIGJ5CisgICAgICogICAgICAgICB7QGNvZGUgc3RyaW5nfS4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHJpbmd9IGlzIHtAY29kZSBudWxsfSwgaGFzIGEgbGVuZ3RoIG9mIHplcm8gb3IKKyAgICAgKiAgICAgICAgICAgICBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGxvbmcgdmFsdWUuCisgICAgICogQHNlZSAjcGFyc2VMb25nKFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExvbmcgdmFsdWVPZihTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHZhbHVlT2YocGFyc2VMb25nKHN0cmluZykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhbiBsb25nIHZhbHVlIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlc3VsdC4gVGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhbgotICAgICAqIGxvbmcgcXVhbnRpdHkuIFRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSByYWRpeCB0byB1c2Ugd2hlbgotICAgICAqIHBhcnNpbmcgdGhlIHZhbHVlLgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcyBhIHNpZ25lZCBsb25nIHZhbHVlIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBsb25nIHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgdmFsdWUuCiAgICAgICogQHBhcmFtIHJhZGl4Ci0gICAgICogICAgICAgICAgICB0aGUgYmFzZSB0byB1c2UgZm9yIGNvbnZlcnNpb24uCi0gICAgICogQHJldHVybiBMb25nIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGFuIGxvbmcgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdG8gdXNlIHdoZW4gcGFyc2luZy4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIExvbmd9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGxvbmcgdmFsdWUgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiAgICAgICAgIHtAY29kZSBzdHJpbmd9IHVzaW5nIHtAY29kZSByYWRpeH0uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0gb3IgaGFzIGEgbGVuZ3RoIG9mIHplcm8sCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHJhZGl4IDwgQ2hhcmFjdGVyLk1JTl9SQURJWH0sCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHJhZGl4ID4gQ2hhcmFjdGVyLk1BWF9SQURJWH0sIG9yIGlmIHtAY29kZSBzdHJpbmd9CisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBsb25nIHZhbHVlLgorICAgICAqIEBzZWUgI3BhcnNlTG9uZyhTdHJpbmcsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExvbmcgdmFsdWVPZihTdHJpbmcgc3RyaW5nLCBpbnQgcmFkaXgpCiAgICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKQEAgLTYwNCwxNiArNTk0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGV0ZXJtaW5lcyB0aGUgaGlnaGVzdCAobGVmdG1vc3QpIGJpdCB0aGF0IGlzIDEgYW5kIHJldHVybnMgdGhlIHZhbHVlCi0gICAgICogdGhhdCBpcyB0aGUgYml0IG1hc2sgZm9yIHRoYXQgYml0LiBUaGlzIGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUKLSAgICAgKiBNb3N0IFNpZ25pZmljYW50IDEgQml0LgotICAgICAqIDwvcD4KKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBoaWdoZXN0IChsZWZ0bW9zdCkgYml0IG9mIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZSB0aGF0IGlzCisgICAgICogMSBhbmQgcmV0dXJucyB0aGUgYml0IG1hc2sgdmFsdWUgZm9yIHRoYXQgYml0LiBUaGlzIGlzIGFsc28gcmVmZXJyZWQgdG8KKyAgICAgKiBhcyB0aGUgTW9zdCBTaWduaWZpY2FudCAxIEJpdC4gUmV0dXJucyB6ZXJvIGlmIHRoZSBzcGVjaWZpZWQgbG9uZyBpcworICAgICAqIHplcm8uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxuZwotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPmxvbmc8L2NvZGU+IHRvIGludGVycm9nYXRlLgotICAgICAqIEByZXR1cm4gVGhlIGJpdCBtYXNrIGluZGljYXRpbmcgdGhlIGhpZ2hlc3QgMSBiaXQuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gZXhhbWluZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoZSBoaWdoZXN0IDEgYml0IGluIHtAY29kZSBsbmd9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBoaWdoZXN0T25lQml0KGxvbmcgbG5nKSB7CiAgICAgICAgIGxuZyB8PSAobG5nID4+IDEpOwpAQCAtNjI2LDMxICs2MTUsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBEZXRlcm1pbmVzIHRoZSBsb3dlc3QgKHJpZ2h0bW9zdCkgYml0IHRoYXQgaXMgMSBhbmQgcmV0dXJucyB0aGUgdmFsdWUKLSAgICAgKiB0aGF0IGlzIHRoZSBiaXQgbWFzayBmb3IgdGhhdCBiaXQuIFRoaXMgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHRoZQotICAgICAqIExlYXN0IFNpZ25pZmljYW50IDEgQml0LgotICAgICAqIDwvcD4KKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBsb3dlc3QgKHJpZ2h0bW9zdCkgYml0IG9mIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZSB0aGF0IGlzCisgICAgICogMSBhbmQgcmV0dXJucyB0aGUgYml0IG1hc2sgdmFsdWUgZm9yIHRoYXQgYml0LiBUaGlzIGlzIGFsc28gcmVmZXJyZWQgdG8KKyAgICAgKiBhcyB0aGUgTGVhc3QgU2lnbmlmaWNhbnQgMSBCaXQuIFJldHVybnMgemVybyBpZiB0aGUgc3BlY2lmaWVkIGxvbmcgaXMKKyAgICAgKiB6ZXJvLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsbmcKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5sb25nPC9jb2RlPiB0byBpbnRlcnJvZ2F0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoZSBsb3dlc3QgMSBiaXQuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gZXhhbWluZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoZSBsb3dlc3QgMSBiaXQgaW4ge0Bjb2RlIGxuZ30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGxvd2VzdE9uZUJpdChsb25nIGxuZykgewogICAgICAgICByZXR1cm4gKGxuZyAmICgtbG5nKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MgaW4gdGhlIDxjb2RlPmxvbmc8L2NvZGU+IHBhc3NlZAotICAgICAqIHByaW9yIHRvIHRoZSB7QGxpbmsgI2hpZ2hlc3RPbmVCaXQobG9uZykgaGlnaGVzdCBvbmUgYml0fS4KLSAgICAgKiA8L3A+CisgICAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MgaW4gdGhlIHNwZWNpZmllZCBsb25nIHZhbHVlIHByaW9yCisgICAgICogdG8gdGhlIHtAbGluayAjaGlnaGVzdE9uZUJpdChsb25nKSBoaWdoZXN0IG9uZSBiaXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsbmcKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5sb25nPC9jb2RlPiB0byBwcm9jZXNzLgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHRvIGV4YW1pbmUuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MgaW4ge0Bjb2RlIGxuZ30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgbnVtYmVyT2ZMZWFkaW5nWmVyb3MobG9uZyBsbmcpIHsKICAgICAgICAgbG5nIHw9IGxuZyA+PiAxOwpAQCAtNjYzLDMwICs2NDksMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVyb3MgaW4gdGhlIDxjb2RlPmxvbmc8L2NvZGU+IHBhc3NlZAotICAgICAqIGFmdGVyIHRoZSB7QGxpbmsgI2xvd2VzdE9uZUJpdChsb25nKSBsb3dlc3Qgb25lIGJpdH0uCi0gICAgICogPC9wPgorICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcyBpbiB0aGUgc3BlY2lmaWVkIGxvbmcgdmFsdWUgYWZ0ZXIKKyAgICAgKiB0aGUge0BsaW5rICNsb3dlc3RPbmVCaXQobG9uZykgbG93ZXN0IG9uZSBiaXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsbmcKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5sb25nPC9jb2RlPiB0byBwcm9jZXNzLgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcy4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBleGFtaW5lLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcyBpbiB7QGNvZGUgbG5nfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBudW1iZXJPZlRyYWlsaW5nWmVyb3MobG9uZyBsbmcpIHsKICAgICAgICAgcmV0dXJuIGJpdENvdW50KChsbmcgJiAtbG5nKSAtIDEpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIDEgYml0cyBpbiB0aGUgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgcGFzc2VkOyB0aGlzCi0gICAgICogaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGEgcG9wdWxhdGlvbiBjb3VudC4KLSAgICAgKiA8L3A+CisgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgMSBiaXRzIGluIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZTsgdGhpcyBpcyBhbHNvCisgICAgICogcmVmZXJyZWQgdG8gYXMgcG9wdWxhdGlvbiBjb3VudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG5nCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgdG8gcHJvY2Vzcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgMSBiaXRzLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHRvIGV4YW1pbmUuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIDEgYml0cyBpbiB7QGNvZGUgbG5nfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBiaXRDb3VudChsb25nIGxuZykgewogICAgICAgICBsbmcgPSAobG5nICYgMHg1NTU1NTU1NTU1NTU1NTU1TCkgKyAoKGxuZyA+PiAxKSAmIDB4NTU1NTU1NTU1NTU1NTU1NUwpOwpAQCAtNzAwLDE3ICs2ODIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSb3RhdGVzIHRoZSBiaXRzIG9mIDxjb2RlPmxuZzwvY29kZT4gdG8gdGhlIGxlZnQgYnkgdGhlCi0gICAgICogPGNvZGU+ZGlzdGFuY2U8L2NvZGU+IGJpdHMuCi0gICAgICogPC9wPgorICAgICAqIFJvdGF0ZXMgdGhlIGJpdHMgb2YgdGhlIHNwZWNpZmllZCBsb25nIHZhbHVlIHRvIHRoZSBsZWZ0IGJ5IHRoZSBzcGVjaWZpZWQKKyAgICAgKiBudW1iZXIgb2YgYml0cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG5nCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgdG8gcm90YXRlIGxlZnQuCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZSB0byByb3RhdGUgbGVmdC4KICAgICAgKiBAcGFyYW0gZGlzdGFuY2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYml0cyB0byByb3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgcm90YXRlZCB2YWx1ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gcm90YXRlLgorICAgICAqIEByZXR1cm4gdGhlIHJvdGF0ZWQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIHJvdGF0ZUxlZnQobG9uZyBsbmcsIGludCBkaXN0YW5jZSkgewogICAgICAgICBpZiAoZGlzdGFuY2UgPT0gMCkgewpAQCAtNzI1LDE3ICs3MDUsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSb3RhdGVzIHRoZSBiaXRzIG9mIDxjb2RlPmxuZzwvY29kZT4gdG8gdGhlIHJpZ2h0IGJ5IHRoZQotICAgICAqIDxjb2RlPmRpc3RhbmNlPC9jb2RlPiBiaXRzLgotICAgICAqIDwvcD4KKyAgICAgKiBSb3RhdGVzIHRoZSBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZSB0byB0aGUgcmlnaHQgYnkgdGhlCisgICAgICogc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsbmcKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSB0byByb3RhdGUgcmlnaHQuCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZSB0byByb3RhdGUgcmlnaHQuCiAgICAgICogQHBhcmFtIGRpc3RhbmNlCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gcm90YXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJvdGF0ZWQgdmFsdWUuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJvdGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByb3RhdGVkIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByb3RhdGVSaWdodChsb25nIGxuZywgaW50IGRpc3RhbmNlKSB7CiAgICAgICAgIGlmIChkaXN0YW5jZSA9PSAwKSB7CkBAIC03NTAsMTQgKzcyOCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldmVyc2VzIHRoZSBieXRlcyBvZiBhIDxjb2RlPmxvbmc8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBSZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGJ5dGVzIG9mIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG5nCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdG8gcmV2ZXJzZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXZlcnNlZCB2YWx1ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZSBmb3Igd2hpY2ggdG8gcmV2ZXJzZSB0aGUgYnl0ZSBvcmRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXZlcnNlZCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgcmV2ZXJzZUJ5dGVzKGxvbmcgbG5nKSB7CiAgICAgICAgIGxvbmcgYjcgPSBsbmcgPj4+IDU2OwpAQCAtNzcyLDE0ICs3NDgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXZlcnNlcyB0aGUgYnl0ZXMgb2YgYSA8Y29kZT5sb25nPC9jb2RlPi4KLSAgICAgKiA8L3A+CisgICAgICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG5nCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdG8gcmV2ZXJzZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXZlcnNlZCB2YWx1ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZSBmb3Igd2hpY2ggdG8gcmV2ZXJzZSB0aGUgYml0IG9yZGVyLgorICAgICAqIEByZXR1cm4gdGhlIHJldmVyc2VkIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZXZlcnNlKGxvbmcgbG5nKSB7CiAgICAgICAgIC8vIEZyb20gSGFja2VyJ3MgRGVsaWdodCwgNy0xLCBGaWd1cmUgNy0xCkBAIC03OTMsMzIgKzc2NywzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5zaWdudW08L2NvZGU+IGZ1bmN0aW9uIGZvciA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZXMuIFRoaXMKLSAgICAgKiBtZXRob2QgcmV0dXJucyAtMSBmb3IgbmVnYXRpdmUgdmFsdWVzLCAxIGZvciBwb3NpdGl2ZSB2YWx1ZXMgYW5kIDAgZm9yCi0gICAgICogdGhlIHZhbHVlIDAuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUgc2lnbnVtfSBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBsb25nCisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxuZwotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlLgotICAgICAqIEByZXR1cm4gLTEgaWYgbmVnYXRpdmUsIDEgaWYgcG9zaXRpdmUgb3RoZXJ3aXNlIDAuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybiAtMSBpZiB7QGNvZGUgbG5nfSBpcyBuZWdhdGl2ZSwgMSBpZiB7QGNvZGUgbG5nfSBpcyBwb3NpdGl2ZSwgMCBpZgorICAgICAqICAgICAgICAge0Bjb2RlIGxuZ30gaXMgemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBzaWdudW0obG9uZyBsbmcpIHsKICAgICAgICAgcmV0dXJuIChsbmcgPT0gMCA/IDAgOiAobG5nIDwgMCA/IC0xIDogMSkpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgTG9uZ30gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZS4KICAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+TG9uZzwvY29kZT4gaW5zdGFuY2UgZm9yIHRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZQotICAgICAqIHBhc3NlZC4gVGhpcyBtZXRob2QgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGNvbnN0cnVjdG9yLCBhcyB0aGlzIG1ldGhvZCBtYXkKLSAgICAgKiBtYWludGFpbiBhIGNhY2hlIG9mIGluc3RhbmNlcy4KKyAgICAgKiBJZiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGdldCBhIG5ldyB7QGNvZGUgTG9uZ30gaW5zdGFuY2UsIGl0IGlzCisgICAgICogcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yLCBzaW5jZSBpdAorICAgICAqIG1haW50YWlucyBhIGNhY2hlIG9mIGluc3RhbmNlcyB3aGljaCBtYXkgcmVzdWx0IGluIGJldHRlciBwZXJmb3JtYW5jZS4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGxuZwotICAgICAqICAgICAgICAgICAgVGhlIGxvbmcgdmFsdWUuCi0gICAgICogQHJldHVybiBBIDxjb2RlPkxvbmc8L2NvZGU+IGluc3RhbmNlLgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIExvbmd9IGluc3RhbmNlIGNvbnRhaW5pbmcge0Bjb2RlIGxuZ30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb25nIHZhbHVlT2YobG9uZyBsbmcpIHsKICAgICAgICAgaWYgKGxuZyA8IC0xMjggfHwgbG5nID4gMTI3KSB7CkBAIC04NDEsNSArODE0LDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9NYXRoLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL01hdGguamF2YQppbmRleCBkYjRlOTEyLi5mMThmNDBmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL01hdGguamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL01hdGguamF2YQpAQCAtMTcsMjAgKzE3LDI2IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogQ2xhc3MgbWF0aCBwcm92aWRlcyB2YXJpb3VzIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgcm91dGluZXMgYW5kIHNvbWUgc3RhbmRhcmQKLSAqIGNvbnN0YW50cy4KKyAqIENsYXNzIE1hdGggcHJvdmlkZXMgYmFzaWMgbWF0aCBjb25zdGFudHMgYW5kIG9wZXJhdGlvbnMgc3VjaCBhcyB0cmlnb25vbWV0cmljCisgKiBmdW5jdGlvbnMsIGh5cGVyYm9saWMgZnVuY3Rpb25zLCBleHBvbmVudGlhbCwgbG9nYXJpdGhtcywgZXRjLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1hdGggewogCiAgICAgLyoqCiAgICAgICogVGhlIGRvdWJsZSB2YWx1ZSBjbG9zZXN0IHRvIGUsIHRoZSBiYXNlIG9mIHRoZSBuYXR1cmFsIGxvZ2FyaXRobS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBFID0gMi43MTgyODE4Mjg0NTkwNDU7CiAKICAgICAvKioKLSAgICAgKiBUaGUgZG91YmxlIHZhbHVlIGNsb3Nlc3QgdG8gcGksIHRoZSByYXRpbyBvZiBhIGNpcmNsZSdzIGNpcmN1bWZlcmVuY2UgdG8gaXRzIGRpYW1ldGVyLgorICAgICAqIFRoZSBkb3VibGUgdmFsdWUgY2xvc2VzdCB0byBwaSwgdGhlIHJhdGlvIG9mIGEgY2lyY2xlJ3MgY2lyY3VtZmVyZW5jZSB0bworICAgICAqIGl0cyBkaWFtZXRlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzOwogCkBAIC00NCwxMSArNTAsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygtMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhYnMoLWluZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYWJzKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IGlmIGl0IGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgdGhlIG5lZ2F0aW9uIG9mIHRoZQotICAgICAqICAgICAgICAgYXJndW1lbnQuCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgYWJzb2x1dGUgdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkLgorICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBhYnMoZG91YmxlIGQpIHsKICAgICAgICAgbG9uZyBiaXRzID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZCk7CkBAIC01OCwxMSArNzMsMjEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygtMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhYnMoLWluZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYWJzKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZgotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGFic29sdXRlIHZhbHVlIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhcmd1bWVudCBpZiBpdCBpcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIHRoZSBuZWdhdGlvbiBvZiB0aGUKICAgICAgKiAgICAgICAgIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgYWJzKGZsb2F0IGYpIHsKICAgICAgICAgaW50IGJpdHMgPSBGbG9hdC5mbG9hdFRvSW50Qml0cyhmKTsKQEAgLTcyLDIzICs5NywzMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBhcmd1bWVudCBpcyB7QGNvZGUgSW50ZWdlci5NSU5fVkFMVUV9LCB7QGNvZGUgSW50ZWdlci5NSU5fVkFMVUV9CisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgYWJzb2x1dGUgdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkLgogICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IGlmIGl0IGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgdGhlIG5lZ2F0aW9uIG9mIHRoZQogICAgICAqICAgICAgICAgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgYWJzKGludCBpKSB7CiAgICAgICAgIHJldHVybiBpID49IDAgPyBpIDogLWk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4gSWYgdGhlIGFyZ3VtZW50IGlzIHtAY29kZQorICAgICAqIExvbmcuTUlOX1ZBTFVFfSwge0Bjb2RlIExvbmcuTUlOX1ZBTFVFfSBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGFic29sdXRlIHZhbHVlIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhcmd1bWVudCBpZiBpdCBpcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIHRoZSBuZWdhdGlvbiBvZiB0aGUKICAgICAgKiAgICAgICAgIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBhYnMobG9uZyBsKSB7CiAgICAgICAgIHJldHVybiBsID49IDAgPyBsIDogLWw7CkBAIC05NiwxODggKzEyOCw0MTQgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGFyYyBjb3NpbmUgb2YgdGhlCi0gICAgICogYXJndW1lbnQKKyAgICAgKiBhcmd1bWVudCB3aXRoaW4gdGhlIHJhbmdlIHtAY29kZSBbMC4ucGldfS4gVGhlIHJldHVybmVkIHJlc3VsdCBpcyB3aXRoaW4KKyAgICAgKiAxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkgb2YgdGhlIHJlYWwgcmVzdWx0LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgYWNvcygoYW55dGhpbmcgPiAxKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYWNvcygoYW55dGhpbmcgPCAtMSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGFjb3MoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSBhY29zIG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSBhcmMgY29zaW5lIG9mLgogICAgICAqIEByZXR1cm4gdGhlIGFyYyBjb3NpbmUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBhY29zKGRvdWJsZSBkKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGFyYyBzaW5lIG9mIHRoZSBhcmd1bWVudAorICAgICAqIHdpdGhpbiB0aGUgcmFuZ2Uge0Bjb2RlIFstcGkvMi4ucGkvMl19LiBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIHdpdGhpbiAxCisgICAgICogdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKSBvZiB0aGUgcmVhbCByZXN1bHQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBhc2luKChhbnl0aGluZyA+IDEpKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXNpbigoYW55dGhpbmcgPCAtMSkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhc2luKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgYXNpbiBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGFyYyBzaW5lIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhcmMgc2luZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGFzaW4oZG91YmxlIGQpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYXJjIHRhbmdlbnQgb2YgdGhlCi0gICAgICogYXJndW1lbnQKKyAgICAgKiBhcmd1bWVudCB3aXRoaW4gdGhlIHJhbmdlIHtAY29kZSBbLXBpLzIuLnBpLzJdfS4gVGhlIHJldHVybmVkIHJlc3VsdCBpcworICAgICAqIHdpdGhpbiAxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkgb2YgdGhlIHJlYWwgcmVzdWx0LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgYXRhbigrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4oLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuKCtpbmZpbml0eSkgPSArcGkvMn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbigtaW5maW5pdHkpID0gLXBpLzJ9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4oTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSBhdGFuIG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgYXJjIHRhbmdlbnQgaGFzIHRvIGJlIGNvbXB1dGVkLgogICAgICAqIEByZXR1cm4gdGhlIGFyYyB0YW5nZW50IG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgYXRhbihkb3VibGUgZCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBhcmMgdGFuZ2VudCBvZiB0aGUgcmVzdWx0Ci0gICAgICogb2YgZGl2aWRpbmcgdGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYXJjIHRhbmdlbnQgb2YKKyAgICAgKiB7QGNvZGUgeS94fSB3aXRoaW4gdGhlIHJhbmdlIHtAY29kZSBbLXBpLi5waV19LiBUaGlzIGlzIHRoZSBhbmdsZSBvZiB0aGUKKyAgICAgKiBwb2xhciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjdGFuZ3VsYXIgY29vcmRpbmF0ZXMgKHgseSkuIFRoZSByZXR1cm5lZAorICAgICAqIHJlc3VsdCBpcyB3aXRoaW4gMiB1bHBzICh1bml0cyBpbiB0aGUgbGFzdCBwbGFjZSkgb2YgdGhlIHJlYWwgcmVzdWx0LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoKGFueXRoaW5nKSwgTmFOICkgPSBOYU47fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMihOYU4gLCAoYW55dGhpbmcpICkgPSBOYU47fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigrMC4wLCArKGFueXRoaW5nIGJ1dCBOYU4pKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0wLjAsICsoYW55dGhpbmcgYnV0IE5hTikpID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoKzAuMCwgLShhbnl0aGluZyBidXQgTmFOKSkgPSArcGl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0wLjAsIC0oYW55dGhpbmcgYnV0IE5hTikpID0gLXBpfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigrKGFueXRoaW5nIGJ1dCAwIGFuZCBOYU4pLCAwKSA9ICtwaS8yfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigtKGFueXRoaW5nIGJ1dCAwIGFuZCBOYU4pLCAwKSA9IC1waS8yfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigrKGFueXRoaW5nIGJ1dCBpbmZpbml0eSBhbmQgTmFOKSwgK2luZmluaXR5KX0ge0Bjb2RlID19CisgICAgICoge0Bjb2RlICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0oYW55dGhpbmcgYnV0IGluZmluaXR5IGFuZCBOYU4pLCAraW5maW5pdHkpfSB7QGNvZGUgPX0KKyAgICAgKiB7QGNvZGUgLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoKyhhbnl0aGluZyBidXQgaW5maW5pdHkgYW5kIE5hTiksIC1pbmZpbml0eSkgPSArcGl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0oYW55dGhpbmcgYnV0IGluZmluaXR5IGFuZCBOYU4pLCAtaW5maW5pdHkpID0gLXBpfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigraW5maW5pdHksICtpbmZpbml0eSApID0gK3BpLzR9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC1pbmZpbml0eSwgK2luZmluaXR5ICkgPSAtcGkvNH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoK2luZmluaXR5LCAtaW5maW5pdHkgKSA9ICszcGkvNH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoLWluZmluaXR5LCAtaW5maW5pdHkgKSA9IC0zcGkvNH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoK2luZmluaXR5LCAoYW55dGhpbmcgYnV0LDAsIE5hTiwgYW5kIGluZmluaXR5KSl9CisgICAgICoge0Bjb2RlID19IHtAY29kZSArcGkvMn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoLWluZmluaXR5LCAoYW55dGhpbmcgYnV0LDAsIE5hTiwgYW5kIGluZmluaXR5KSl9CisgICAgICoge0Bjb2RlID19IHtAY29kZSAtcGkvMn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBkMQotICAgICAqICAgICAgICAgICAgdGhlIG51bWVyYXRvciBvZiB0aGUgdmFsdWUgdG8gY29tcHV0ZSBhdGFuIG9mCi0gICAgICogQHBhcmFtIGQyCi0gICAgICogICAgICAgICAgICB0aGUgZGVub21pbmF0b3Igb2YgdGhlIHZhbHVlIHRvIGNvbXB1dGUgYXRhbiBvZgotICAgICAqIEByZXR1cm4gdGhlIGFyYyB0YW5nZW50IG9mIGQxL2QyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgbnVtZXJhdG9yIG9mIHRoZSB2YWx1ZSB3aG9zZSBhdGFuIGhhcyB0byBiZSBjb21wdXRlZC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIGRlbm9taW5hdG9yIG9mIHRoZSB2YWx1ZSB3aG9zZSBhdGFuIGhhcyB0byBiZSBjb21wdXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcmMgdGFuZ2VudCBvZiB7QGNvZGUgeS94fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgYXRhbjIoZG91YmxlIGQxLCBkb3VibGUgZDIpOwotICAgIAorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBhdGFuMihkb3VibGUgeSwgZG91YmxlIHgpOworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIHBhcmFtZXRlciBuYW1lcyBjaGFuZ2VkIGZyb20gZDEgLyBkMiB0byB4IC8geQorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGN1YmUgcm9vdCBvZiB0aGUKLSAgICAgKiBhcmd1bWVudC4gVGhlIGZpbmFsIHJlc3VsdCBzaG91bGQgYmUgd2l0aGluIDF1bHAgb2YgdGhlIHJlYWwgcmVzdWx0LgorICAgICAqIGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgY2JydCgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNicnQoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBjYnJ0KCtpbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNicnQoLWluZmluaXR5KSA9IC1pbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgY2JydChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIGN1YmUgcm9vdCBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGN1YmUgcm9vdCBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY3ViZSByb290IG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgY2JydChkb3VibGUgZCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgY29udmVyc2lvbiBvZiB0aGUgbW9zdCBuZWdhdGl2ZSAoaS5lLiBjbG9zZXN0IHRvCisgICAgICogUmV0dXJucyB0aGUgZG91YmxlIGNvbnZlcnNpb24gb2YgdGhlIG1vc3QgbmVnYXRpdmUgKGNsb3Nlc3QgdG8KICAgICAgKiBuZWdhdGl2ZSBpbmZpbml0eSkgaW50ZWdlciB2YWx1ZSB3aGljaCBpcyBncmVhdGVyIHRoYW4gdGhlIGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgY2VpbCgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNlaWwoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBjZWlsKChhbnl0aGluZyBpbiByYW5nZSAoLTEsMCkpID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgY2VpbCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBjZWlsKC1pbmZpbml0eSkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNlaWwoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBkIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBAcGFyYW0gZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGNsb3Nlc3QgaW50ZWdlciB2YWx1ZSBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY2VpbGluZyBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGNlaWwoZG91YmxlIGQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgY29zaW5lIG9mIHRoZSBhcmd1bWVudAorICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGNvc2luZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogVGhlIHJldHVybmVkIHJlc3VsdCBpcyB3aXRoaW4gMSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpIG9mIHRoZSByZWFsCisgICAgICogcmVzdWx0LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgY29zKCtpbmZpbml0eSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNvcygtaW5maW5pdHkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBjb3MoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgYW5nbGUgdG8gY29tcHV0ZSB0aGUgY29zaW5lIG9mLCBpbiByYWRpYW5zCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgd2hvc2UgY29zaW5lIGhhcyB0byBiZSBjb21wdXRlZCwgaW4gcmFkaWFucy4KICAgICAgKiBAcmV0dXJuIHRoZSBjb3NpbmUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBjb3MoZG91YmxlIGQpOwogICAgIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mIHRoZQotICAgICAqIGFyZ3VtZW50LiBUaGUgZmluYWwgcmVzdWx0IHNob3VsZCBiZSB3aXRoaW4gMi41dWxwcyBvZiB0aGUgcmVhbCByZXN1bHQuCisgICAgICogYXJndW1lbnQuIFRoZSByZXR1cm5lZCByZXN1bHQgaXMgd2l0aGluIDIuNSB1bHBzICh1bml0cyBpbiB0aGUgbGFzdAorICAgICAqIHBsYWNlKSBvZiB0aGUgcmVhbCByZXN1bHQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBjb3NoKCtpbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNvc2goLWluZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgY29zaChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIGh5cGVyYm9saWMgY29zaW5lIG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgaHlwZXJib2xpYyBjb3NpbmUgaGFzIHRvIGJlIGNvbXB1dGVkLgogICAgICAqIEByZXR1cm4gdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgY29zaChkb3VibGUgZCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSByYWlzaW5nICJlIiB0byB0aGUgcG93ZXIKLSAgICAgKiBvZiB0aGUgYXJndW1lbnQKKyAgICAgKiBvZiB0aGUgYXJndW1lbnQuIFRoZSByZXR1cm5lZCByZXN1bHQgaXMgd2l0aGluIDEgdWxwICh1bml0IGluIHRoZSBsYXN0CisgICAgICogcGxhY2UpIG9mIHRoZSByZWFsIHJlc3VsdC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGV4cCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBleHAoLWluZmluaXR5KSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGV4cChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHRoZSBleHBvbmVudGlhbCBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGV4cG9uZW50aWFsIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBleHBvbmVudGlhbCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGV4cChkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiA8aT5lPC9pPjxzdXA+ZDwvc3VwPiAtIDEuCi0gICAgICogSWYgdGhlIGFyZ3VtZW50IGlzIHZlcnkgY2xvc2UgdG8gMCwgaXQgaXMgbXVjaCBtb3JlIGFjY3VyYXRlIHRvIHVzZQotICAgICAqIGV4cG0xKGQpKzEgdGhhbiBleHAoZCkuCi0gICAgICogCi0gICAgICogVGhlIGZpbmFsIHJlc3VsdCBzaG91bGQgYmUgd2l0aGluIDEgdWxwIG9mIHRoZSByZWFsIHJlc3VsdC4gRm9yIGFueQotICAgICAqIGZpbml0ZSBpbnB1dCwgdGhlIHJlc3VsdCBzaG91bGQgYmUgbm8gbGVzcyB0aGFuIC0xLjAuIElmIHRoZSByZWFsIHJlc3VsdAotICAgICAqIGlzIHdpdGhpbiAwLjUgdWxwIG9mIC0xLCAtMS4wIHNob3VsZCBiZSBhbnN3ZXJlZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIDxpPntAY29kZSBlfTwvaT48c3VwPgorICAgICAqIHtAY29kZSBkfTwvc3VwPntAY29kZSAtIDF9LiBJZiB0aGUgYXJndW1lbnQgaXMgdmVyeSBjbG9zZSB0byAwLCBpdCBpcworICAgICAqIG11Y2ggbW9yZSBhY2N1cmF0ZSB0byB1c2Uge0Bjb2RlIGV4cG0xKGQpKzF9IHRoYW4ge0Bjb2RlIGV4cChkKX0gKGR1ZSB0bworICAgICAqIGNhbmNlbGxhdGlvbiBvZiBzaWduaWZpY2FudCBkaWdpdHMpLiBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIHdpdGhpbiAxIHVscAorICAgICAqICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKSBvZiB0aGUgcmVhbCByZXN1bHQuCisgICAgICogPHA+CisgICAgICogRm9yIGFueSBmaW5pdGUgaW5wdXQsIHRoZSByZXN1bHQgaXMgbm90IGxlc3MgdGhhbiAtMS4wLiBJZiB0aGUgcmVhbAorICAgICAqIHJlc3VsdCBpcyB3aXRoaW4gMC41IHVscCBvZiAtMSwgLTEuMCBpcyByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGV4cG0xKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZXhwbTEoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBleHBtMSgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBleHBtMSgtaW5maW5pdHkpID0gLTEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZXhwbTEoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgPGk+ZTwvaT48c3VwPmQ8L3N1cD4gLSAxIG9mCi0gICAgICogQHJldHVybiB0aGUgPGk+ZTwvaT48c3VwPmQ8L3N1cD4gLSAxIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHRoZSA8aT57QGNvZGUgZX08L2k+PHN1cD57QGNvZGUgZH0KKyAgICAgKiAgICAgICAgICAgIDwvc3VwPntAY29kZSAtIDF9IG9mLgorICAgICAqIEByZXR1cm4gdGhlIDxpPntAY29kZSBlfTwvaT48c3VwPntAY29kZSBkfTwvc3VwPntAY29kZSAtIDF9IHZhbHVlCisgICAgICogICAgICAgICBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGV4cG0xKGRvdWJsZSBkKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSBtb3N0IHBvc2l0aXZlIChpLmUuIGNsb3Nlc3QgdG8KLSAgICAgKiBwb3NpdGl2ZSBpbmZpbml0eSkgaW50ZWdlciB2YWx1ZSB3aGljaCBpcyBsZXNzIHRoYW4gdGhlIGFyZ3VtZW50LgorICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSBtb3N0IHBvc2l0aXZlIChjbG9zZXN0IHRvIHBvc2l0aXZlCisgICAgICogaW5maW5pdHkpIGludGVnZXIgdmFsdWUgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGZsb29yKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZmxvb3IoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBmbG9vcigraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBmbG9vcigtaW5maW5pdHkpID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBmbG9vcihOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIGQgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgY2xvc2VzdCBpbnRlZ2VyIHZhbHVlIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGZsb29yKGRvdWJsZSBkKTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHNxcnQoPGk+eDwvaT48c3VwPjI8L3N1cD4rPGk+eTwvaT48c3VwPjI8L3N1cD4pLiBUaGUKLSAgICAgKiBmaW5hbCByZXN1bHQgaXMgd2l0aG91dCBtZWRpdW0gdW5kZXJmbG93IG9yIG92ZXJmbG93LgotICAgICAqIAotICAgICAqIFRoZSBmaW5hbCByZXN1bHQgc2hvdWxkIGJlIHdpdGhpbiAxIHVscCBvZiB0aGUgcmVhbCByZXN1bHQuIElmIG9uZQotICAgICAqIHBhcmFtZXRlciByZW1haW5zIGNvbnN0YW50LCB0aGUgcmVzdWx0IHNob3VsZCBiZSBzZW1pLW1vbm90b25pYy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSBzcXJ0KH08aT57QGNvZGUgeH08L2k+PHN1cD57QGNvZGUgMn08L3N1cD57QGNvZGUgK30KKyAgICAgKiA8aT4ge0Bjb2RlIHl9PC9pPjxzdXA+e0Bjb2RlIDJ9PC9zdXA+e0Bjb2RlICl9LiBUaGUgZmluYWwgcmVzdWx0IGlzCisgICAgICogd2l0aG91dCBtZWRpdW0gdW5kZXJmbG93IG9yIG92ZXJmbG93LiBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIHdpdGhpbiAxIHVscAorICAgICAqICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKSBvZiB0aGUgcmVhbCByZXN1bHQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBoeXBvdCgraW5maW5pdHksIChhbnl0aGluZyBpbmNsdWRpbmcgTmFOKSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGh5cG90KC1pbmZpbml0eSwgKGFueXRoaW5nIGluY2x1ZGluZyBOYU4pKSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgaHlwb3QoKGFueXRoaW5nIGluY2x1ZGluZyBOYU4pLCAraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBoeXBvdCgoYW55dGhpbmcgaW5jbHVkaW5nIE5hTiksIC1pbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGh5cG90KE5hTiwgTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICBhIGRvdWJsZSBudW1iZXIKKyAgICAgKiAgICAgICAgICAgIGEgZG91YmxlIG51bWJlci4KICAgICAgKiBAcGFyYW0geQotICAgICAqICAgICAgICAgICAgYSBkb3VibGUgbnVtYmVyCi0gICAgICogQHJldHVybiB0aGUgc3FydCg8aT54PC9pPjxzdXA+Mjwvc3VwPis8aT55PC9pPjxzdXA+Mjwvc3VwPikgdmFsdWUKLSAgICAgKiAgICAgICAgIG9mIHRoZSBhcmd1bWVudHMuCisgICAgICogICAgICAgICAgICBhIGRvdWJsZSBudW1iZXIuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIHNxcnQofTxpPntAY29kZSB4fTwvaT48c3VwPntAY29kZSAyfTwvc3VwPntAY29kZSArfQorICAgICAqICAgICAgICAgPGk+IHtAY29kZSB5fTwvaT48c3VwPntAY29kZSAyfTwvc3VwPntAY29kZSApfSB2YWx1ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGFyZ3VtZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZCB1c2luZwotICAgICAqIHRoZSBJRUVFIDc1NCBydWxlcy4KKyAgICAgKiBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcge0Bjb2RlIHh9IGJ5IHtAY29kZSB5fSB1c2luZyB0aGUgSUVFRQorICAgICAqIDc1NCBydWxlcy4gVGhlIHJlc3VsdCBpcyB7QGNvZGUgeC1yb3VuZCh4L3ApKnB9IHdoZXJlIHtAY29kZSByb3VuZCh4L3ApfQorICAgICAqIGlzIHRoZSBuZWFyZXN0IGludGVnZXIgKHJvdW5kZWQgdG8gZXZlbiksIGJ1dCB3aXRob3V0IG51bWVyaWNhbAorICAgICAqIGNhbmNlbGxhdGlvbiBwcm9ibGVtcy4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIElFRUVyZW1haW5kZXIoKGFueXRoaW5nKSwgMCkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIElFRUVyZW1haW5kZXIoK2luZmluaXR5LCAoYW55dGhpbmcpKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgSUVFRXJlbWFpbmRlcigtaW5maW5pdHksIChhbnl0aGluZykpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBJRUVFcmVtYWluZGVyKE5hTiwgKGFueXRoaW5nKSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIElFRUVyZW1haW5kZXIoKGFueXRoaW5nKSwgTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgSUVFRXJlbWFpbmRlcih4LCAraW5maW5pdHkpID0geCB9IHdoZXJlIHggaXMgYW55dGhpbmcgYnV0CisgICAgICogKy8taW5maW5pdHk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgSUVFRXJlbWFpbmRlcih4LCAtaW5maW5pdHkpID0geCB9IHdoZXJlIHggaXMgYW55dGhpbmcgYnV0CisgICAgICogKy8taW5maW5pdHk8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBkMQotICAgICAqICAgICAgICAgICAgdGhlIG51bWVyYXRvciBvZiB0aGUgb3BlcmF0aW9uCi0gICAgICogQHBhcmFtIGQyCi0gICAgICogICAgICAgICAgICB0aGUgZGVub21pbmF0b3Igb2YgdGhlIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBkMS9kMi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIG51bWVyYXRvciBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgZGVub21pbmF0b3Igb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBJRUVFNzU0IGZsb2F0aW5nIHBvaW50IHJlbWluZGVyIG9mIG9mIHtAY29kZSB4L3l9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBJRUVFcmVtYWluZGVyKGRvdWJsZSBkMSwgZG91YmxlIGQyKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgSUVFRXJlbWFpbmRlcihkb3VibGUgeCwgZG91YmxlIHkpOworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIHBhcmFtZXRlciBuYW1lcyBjaGFuZ2VkIGZyb20gZDEgLyBkMiB0byB4IC8geQorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZQotICAgICAqIGFyZ3VtZW50CisgICAgICogYXJndW1lbnQuIFRoZSByZXR1cm5lZCByZXN1bHQgaXMgd2l0aGluIDEgdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKSBvZgorICAgICAqIHRoZSByZWFsIHJlc3VsdC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZygrMC4wKSA9IC1pbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nKC0wLjApID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2coKGFueXRoaW5nIDwgMCkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZygraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2coLWluZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgdGhlIGxvZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGxvZyBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBsb2coZG91YmxlIGQpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYmFzZSAxMCBsb2dhcml0aG0gb2YgdGhlCi0gICAgICogYXJndW1lbnQKKyAgICAgKiBhcmd1bWVudC4gVGhlIHJldHVybmVkIHJlc3VsdCBpcyB3aXRoaW4gMSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpIG9mCisgICAgICogdGhlIHJlYWwgcmVzdWx0LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgbG9nMTAoKzAuMCkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZzEwKC0wLjApID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxMCgoYW55dGhpbmcgPCAwKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMTAoK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMTAoLWluZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMTAoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgbG9nMTAgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBiYXNlIDEwIGxvZyBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBsb2cxMChkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlCiAgICAgICogc3VtIG9mIHRoZSBhcmd1bWVudCBhbmQgMS4gSWYgdGhlIGFyZ3VtZW50IGlzIHZlcnkgY2xvc2UgdG8gMCwgaXQgaXMgbXVjaAotICAgICAqIG1vcmUgYWNjdXJhdGUgdG8gdXNlIGxvZzFwKGQpIHRoYW4gbG9nKDEuMCtkKS4KLSAgICAgKiAKLSAgICAgKiBUaGUgZmluYWwgcmVzdWx0IHNob3VsZCBiZSB3aXRoaW4gMSB1bHAgb2YgdGhlIHJlYWwgcmVzdWx0IGFuZCBiZQotICAgICAqIHNlbWktbW9ub3RvbmljLgorICAgICAqIG1vcmUgYWNjdXJhdGUgdG8gdXNlIHtAY29kZSBsb2cxcChkKX0gdGhhbiB7QGNvZGUgbG9nKDEuMCtkKX0gKGR1ZSB0bworICAgICAqIG51bWVyaWNhbCBjYW5jZWxsYXRpb24pLiBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIHdpdGhpbiAxIHVscCAodW5pdCBpbiB0aGUKKyAgICAgKiBsYXN0IHBsYWNlKSBvZiB0aGUgcmVhbCByZXN1bHQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBsb2cxcCgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZzFwKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMXAoKGFueXRoaW5nIDwgMSkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxcCgtMS4wKSA9IC1pbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMXAoK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMXAoLWluZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMXAoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgbG4oMStkKSBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgdGhlIHtAY29kZSBsbigxK2QpfSBvZi4KICAgICAgKiBAcmV0dXJuIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiB0aGUgc3VtIG9mIHRoZSBhcmd1bWVudCBhbmQgMS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgbG9nMXAoZG91YmxlIGQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdCBwb3NpdGl2ZSAoaS5lLiBjbG9zZXN0IHRvIHBvc2l0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCisgICAgICogUmV0dXJucyB0aGUgbW9zdCBwb3NpdGl2ZSAoY2xvc2VzdCB0byBwb3NpdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bwogICAgICAqIGFyZ3VtZW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIG1heChOYU4sIChhbnl0aGluZykpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtYXgoKGFueXRoaW5nKSwgTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbWF4KCswLjAsIC0wLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbWF4KC0wLjAsICswLjApID0gKzAuMH08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkMQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQuCiAgICAgICogQHBhcmFtIGQyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICogQHJldHVybiB0aGUgbGFyZ2VyIG9mIGQxIGFuZCBkMi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICogQHJldHVybiB0aGUgbGFyZ2VyIG9mIHtAY29kZSBkMX0gYW5kIHtAY29kZSBkMn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgbWF4KGRvdWJsZSBkMSwgZG91YmxlIGQyKSB7CiAgICAgICAgIGlmIChkMSA+IGQyKQpAQCAtMjk1LDE0ICs1NTMsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IHBvc2l0aXZlIChpLmUuIGNsb3Nlc3QgdG8gcG9zaXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KKyAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IHBvc2l0aXZlIChjbG9zZXN0IHRvIHBvc2l0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCiAgICAgICogYXJndW1lbnRzLgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgbWF4KE5hTiwgKGFueXRoaW5nKSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1heCgoYW55dGhpbmcpLCBOYU4pID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtYXgoKzAuMCwgLTAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtYXgoLTAuMCwgKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGYxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY2hlY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gZjIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2YgZjEgYW5kIGYyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2Yge0Bjb2RlIGYxfSBhbmQge0Bjb2RlIGYyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZsb2F0IG1heChmbG9hdCBmMSwgZmxvYXQgZjIpIHsKICAgICAgICAgaWYgKGYxID4gZjIpCkBAIC0zMjAsNDIgKzU4OCw1NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vc3QgcG9zaXRpdmUgKGkuZS4gY2xvc2VzdCB0byBwb3NpdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bworICAgICAqIFJldHVybnMgdGhlIG1vc3QgcG9zaXRpdmUgKGNsb3Nlc3QgdG8gcG9zaXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KICAgICAgKiBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGkxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY2hlY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gaTIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2YgaTEgYW5kIGkyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2Yge0Bjb2RlIGkxfSBhbmQge0Bjb2RlIGkyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBtYXgoaW50IGkxLCBpbnQgaTIpIHsKICAgICAgICAgcmV0dXJuIGkxID4gaTIgPyBpMSA6IGkyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vc3QgcG9zaXRpdmUgKGkuZS4gY2xvc2VzdCB0byBwb3NpdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bworICAgICAqIFJldHVybnMgdGhlIG1vc3QgcG9zaXRpdmUgKGNsb3Nlc3QgdG8gcG9zaXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KICAgICAgKiBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGwxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY2hlY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gbDIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2YgbDEgYW5kIGwyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2Yge0Bjb2RlIGwxfSBhbmQge0Bjb2RlIGwyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgbWF4KGxvbmcgbDEsIGxvbmcgbDIpIHsKICAgICAgICAgcmV0dXJuIGwxID4gbDIgPyBsMSA6IGwyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vc3QgbmVnYXRpdmUgKGkuZS4gY2xvc2VzdCB0byBuZWdhdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bworICAgICAqIFJldHVybnMgdGhlIG1vc3QgbmVnYXRpdmUgKGNsb3Nlc3QgdG8gbmVnYXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KICAgICAgKiBhcmd1bWVudHMuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBtaW4oTmFOLCAoYW55dGhpbmcpKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbWluKChhbnl0aGluZyksIE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1pbigrMC4wLCAtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1pbigtMC4wLCArMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZDEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBkMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICAqIEByZXR1cm4gdGhlIHNtYWxsZXIgb2YgZDEgYW5kIGQyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVyIG9mIHtAY29kZSBkMX0gYW5kIHtAY29kZSBkMn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgbWluKGRvdWJsZSBkMSwgZG91YmxlIGQyKSB7CiAgICAgICAgIGlmIChkMSA+IGQyKQpAQCAtMzczLDE0ICs2NTMsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IG5lZ2F0aXZlIChpLmUuIGNsb3Nlc3QgdG8gbmVnYXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KKyAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IG5lZ2F0aXZlIChjbG9zZXN0IHRvIG5lZ2F0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCiAgICAgICogYXJndW1lbnRzLgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgbWluKE5hTiwgKGFueXRoaW5nKSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1pbigoYW55dGhpbmcpLCBOYU4pID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtaW4oKzAuMCwgLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtaW4oLTAuMCwgKzAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGYxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY2hlY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gZjIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVyIG9mIGYxIGFuZCBmMi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICogQHJldHVybiB0aGUgc21hbGxlciBvZiB7QGNvZGUgZjF9IGFuZCB7QGNvZGUgZjJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbWluKGZsb2F0IGYxLCBmbG9hdCBmMikgewogICAgICAgICBpZiAoZjEgPiBmMikKQEAgLTM5OCw2MSArNjg4LDEyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vc3QgbmVnYXRpdmUgKGkuZS4gY2xvc2VzdCB0byBuZWdhdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bworICAgICAqIFJldHVybnMgdGhlIG1vc3QgbmVnYXRpdmUgKGNsb3Nlc3QgdG8gbmVnYXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KICAgICAgKiBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGkxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY2hlY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gaTIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVyIG9mIGkxIGFuZCBpMi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICogQHJldHVybiB0aGUgc21hbGxlciBvZiB7QGNvZGUgaTF9IGFuZCB7QGNvZGUgaTJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IG1pbihpbnQgaTEsIGludCBpMikgewogICAgICAgICByZXR1cm4gaTEgPCBpMiA/IGkxIDogaTI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdCBuZWdhdGl2ZSAoaS5lLiBjbG9zZXN0IHRvIG5lZ2F0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCisgICAgICogUmV0dXJucyB0aGUgbW9zdCBuZWdhdGl2ZSAoY2xvc2VzdCB0byBuZWdhdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bwogICAgICAqIGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbDEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBsMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICAqIEByZXR1cm4gdGhlIHNtYWxsZXIgb2YgbDEgYW5kIGwyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVyIG9mIHtAY29kZSBsMX0gYW5kIHtAY29kZSBsMn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIG1pbihsb25nIGwxLCBsb25nIGwyKSB7CiAgICAgICAgIHJldHVybiBsMSA8IGwyID8gbDEgOiBsMjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSByZXN1bHQgb2YgcmFpc2luZyB0aGUKLSAgICAgKiBmaXJzdCBhcmd1bWVudCB0byB0aGUgcG93ZXIgb2YgdGhlIHNlY29uZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSByZXN1bHQgb2YgcmFpc2luZworICAgICAqIHtAY29kZSB4fSB0byB0aGUgcG93ZXIgb2Yge0Bjb2RlIHl9LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgcG93KChhbnl0aGluZyksICswLjApID0gMS4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKGFueXRoaW5nKSwgLTAuMCkgPSAxLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdyh4LCAxLjApID0geH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KChhbnl0aGluZyksIE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdyhOYU4sIChhbnl0aGluZyBleGNlcHQgMCkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKy8tKHx4fCA+IDEpLCAraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKy8tKHx4fCA+IDEpLCAtaW5maW5pdHkpID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCsvLSh8eHwgPCAxKSwgK2luZmluaXR5KSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygrLy0ofHh8IDwgMSksIC1pbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygrLy0xLjAgLCAraW5maW5pdHkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKy8tMS4wICwgLWluZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCswLjAsICgrYW55dGhpbmcgZXhjZXB0IDAsIE5hTikpID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KC0wLjAsICgrYW55dGhpbmcgZXhjZXB0IDAsIE5hTiwgb2RkIGludGVnZXIpKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygrMC4wLCAoLWFueXRoaW5nIGV4Y2VwdCAwLCBOYU4pKSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KC0wLjAsICgtYW55dGhpbmcgZXhjZXB0IDAsIE5BTiwgb2RkIGludGVnZXIpKX0ge0Bjb2RlID19CisgICAgICoge0Bjb2RlICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KC0wLjAsIChvZGQgaW50ZWdlcikpID0gLXBvdyggKzAgLCAob2RkIGludGVnZXIpICl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygraW5maW5pdHksICgrYW55dGhpbmcgZXhjZXB0IDAsIE5hTikpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coK2luZmluaXR5LCAoLWFueXRoaW5nIGV4Y2VwdCAwLCBOYU4pKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygtaW5maW5pdHksIChhbnl0aGluZykpID0gLXBvdygwLCAoLWFueXRoaW5nKSl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygoLWFueXRoaW5nKSwgKGludGVnZXIpKX0ge0Bjb2RlID19CisgICAgICoge0Bjb2RlIHBvdygtMSwoaW50ZWdlcikpKnBvdygrYW55dGhpbmcsaW50ZWdlcikgfTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKC1hbnl0aGluZyBleGNlcHQgMCBhbmQgaW5mKSwgKG5vbi1pbnRlZ2VyKSkgPSBOQU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZDEKKyAgICAgKiBAcGFyYW0geAogICAgICAqICAgICAgICAgICAgdGhlIGJhc2Ugb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gZDIKKyAgICAgKiBAcGFyYW0geQogICAgICAqICAgICAgICAgICAgdGhlIGV4cG9uZW50IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogQHJldHVybiBkMSB0byB0aGUgcG93ZXIgb2YgZDIKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB4fSB0byB0aGUgcG93ZXIgb2Yge0Bjb2RlIHl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBwb3coZG91YmxlIGQxLCBkb3VibGUgZDIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBwb3coZG91YmxlIHgsIGRvdWJsZSB5KTsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBwYXJhbWV0ZXIgbmFtZXMgY2hhbmdlZCBmcm9tIGQxIC8gZDIgdG8geCAvIHkKKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgY29udmVyc2lvbiBvZiB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIHRoZSBhcmd1bWVudCB0bwotICAgICAqIGFuIGludGVnZXIuCisgICAgICogYW4gaW50ZWdlci4gVGllIGJyZWFrcyBhcmUgcm91bmRlZCB0b3dhcmRzIGV2ZW4uCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSByaW50KCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcmludCgtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJpbnQoK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcmludCgtaW5maW5pdHkpID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSByaW50KE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIHJvdW5kZWQuCiAgICAgICogQHJldHVybiB0aGUgY2xvc2VzdCBpbnRlZ2VyIHRvIHRoZSBhcmd1bWVudCAoYXMgYSBkb3VibGUpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSByaW50KGRvdWJsZSBkKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGluZyB0aGUgYXJndW1lbnQgdG8gYW4gaW50ZWdlci4KKyAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRpbmcgdGhlIGFyZ3VtZW50IHRvIGFuIGludGVnZXIuIFRoZSByZXN1bHQgaXMKKyAgICAgKiBlcXVpdmFsZW50IHRvIHtAY29kZSAobG9uZykgTWF0aC5mbG9vcihkKzAuNSl9LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgtMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKChhbnl0aGluZyA+IExvbmcuTUFYX1ZBTFVFKSA9IExvbmcuTUFYX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgoYW55dGhpbmcgPCBMb25nLk1JTl9WQUxVRSkgPSBMb25nLk1JTl9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoK2luZmludGl5KSA9IExvbmcuTUFYX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgtaW5maW50aXkpID0gTG9uZy5NSU5fVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKE5hTikgPSArMC4wfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSByb3VuZGVkLgogICAgICAqIEByZXR1cm4gdGhlIGNsb3Nlc3QgaW50ZWdlciB0byB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIHJvdW5kKGRvdWJsZSBkKSB7CiAgICAgICAgIC8vIGNoZWNrIGZvciBOYU4KQEAgLTQ2MiwxMSArODExLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIHRoZSBhcmd1bWVudCB0byBhbiBpbnRlZ2VyLgorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGluZyB0aGUgYXJndW1lbnQgdG8gYW4gaW50ZWdlci4gVGhlIHJlc3VsdCBpcworICAgICAqIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIChpbnQpIE1hdGguZmxvb3IoZiswLjUpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoLTAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgoYW55dGhpbmcgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgPSBJbnRlZ2VyLk1BWF9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoKGFueXRoaW5nIDwgSW50ZWdlci5NSU5fVkFMVUUpID0gSW50ZWdlci5NSU5fVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKCtpbmZpbnRpeSkgPSBJbnRlZ2VyLk1BWF9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoLWluZmludGl5KSA9IEludGVnZXIuTUlOX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZChOYU4pID0gKzAuMH08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBmCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgcm91bmRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBjbG9zZXN0IGludGVnZXIgdG8gdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHJvdW5kKGZsb2F0IGYpIHsKICAgICAgICAgLy8gY2hlY2sgZm9yIE5hTgpAQCAtNDc0LDE1ICs4MzcsMjcgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICByZXR1cm4gKGludCkgZmxvb3IoZiArIDAuNWYpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNpZ251bSBmdW5jdGlvbiBvZiB0aGUgYXJndW1lbnQuIElmIHRoZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4KLSAgICAgKiB6ZXJvLCBpdCByZXR1cm5zIC0xLjAuIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCAxLjAgaXMgcmV0dXJuZWQuIEl0IHJldHVybnMKLSAgICAgKiB6ZXJvIGlmIHRoZSBhcmd1bWVudCBpcyBhbHNvIHplcm8uCisgICAgICogemVybywgaXQgcmV0dXJucyAtMS4wLiBJZiB0aGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIHplcm8sIDEuMCBpcworICAgICAqIHJldHVybmVkLiBJZiB0aGUgYXJndW1lbnQgaXMgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHplcm8sIHRoZQorICAgICAqIGFyZ3VtZW50IGlzIHJldHVybmVkIGFzIHJlc3VsdC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bSgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bSgtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bSgraW5maW5pdHkpID0gKzEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2lnbnVtKC1pbmZpbml0eSkgPSAtMS4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaWdudW0oTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSBzaWdudW0gZnVuY3Rpb24gb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBzaWdudW0gaGFzIHRvIGJlIGNvbXB1dGVkLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzaWdudW0gZnVuY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgc2lnbnVtKGRvdWJsZSBkKSB7CiAgICAgICAgIHJldHVybiBTdHJpY3RNYXRoLnNpZ251bShkKTsKQEAgLTQ5MCw3MSArODY1LDE0NiBAQAogICAgIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNpZ251bSBmdW5jdGlvbiBvZiB0aGUgYXJndW1lbnQuIElmIHRoZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4KLSAgICAgKiB6ZXJvLCBpdCByZXR1cm5zIC0xLjAuIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCAxLjAgaXMgcmV0dXJuZWQuIEl0IHJldHVybnMKLSAgICAgKiB6ZXJvIGlmIHRoZSBhcmd1bWVudCBpcyBhbHNvIHplcm8uCisgICAgICogemVybywgaXQgcmV0dXJucyAtMS4wLiBJZiB0aGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIHplcm8sIDEuMCBpcworICAgICAqIHJldHVybmVkLiBJZiB0aGUgYXJndW1lbnQgaXMgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHplcm8sIHRoZQorICAgICAqIGFyZ3VtZW50IGlzIHJldHVybmVkIGFzIHJlc3VsdC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bSgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bSgtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bSgraW5maW5pdHkpID0gKzEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2lnbnVtKC1pbmZpbml0eSkgPSAtMS4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaWdudW0oTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBmCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSBzaWdudW0gZnVuY3Rpb24gb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBzaWdudW0gaGFzIHRvIGJlIGNvbXB1dGVkLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzaWdudW0gZnVuY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmbG9hdCBzaWdudW0oZmxvYXQgZikgewogICAgICAgICByZXR1cm4gU3RyaWN0TWF0aC5zaWdudW0oZik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgc2luZSBvZiB0aGUgYXJndW1lbnQKKyAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBzaW5lIG9mIHRoZSBhcmd1bWVudC4gVGhlCisgICAgICogcmV0dXJuZWQgcmVzdWx0IGlzIHdpdGhpbiAxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkgb2YgdGhlIHJlYWwKKyAgICAgKiByZXN1bHQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBzaW4oKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaW4oLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaW4oK2luZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2luKC1pbmZpbml0eSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbihOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBhbmdsZSB0byBjb21wdXRlIHRoZSBzaW5lIG9mLCBpbiByYWRpYW5zCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgd2hvc2Ugc2luIGhhcyB0byBiZSBjb21wdXRlZCwgaW4gcmFkaWFucy4KICAgICAgKiBAcmV0dXJuIHRoZSBzaW5lIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgc2luKGRvdWJsZSBkKTsKICAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YgdGhlCi0gICAgICogYXJndW1lbnQuIFRoZSBmaW5hbCByZXN1bHQgc2hvdWxkIGJlIHdpdGhpbiAyLjV1bHBzIG9mIHRoZSByZWFsIHJlc3VsdC4KKyAgICAgKiBhcmd1bWVudC4gVGhlIHJldHVybmVkIHJlc3VsdCBpcyB3aXRoaW4gMi41IHVscHMgKHVuaXRzIGluIHRoZSBsYXN0CisgICAgICogcGxhY2UpIG9mIHRoZSByZWFsIHJlc3VsdC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbmgoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaW5oKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2luaCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaW5oKC1pbmZpbml0eSkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbmgoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSBoeXBlcmJvbGljIHNpbmUgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBoeXBlcmJvbGljIHNpbmUgaGFzIHRvIGJlIGNvbXB1dGVkLgogICAgICAqIEByZXR1cm4gdGhlIGh5cGVyYm9saWMgc2luZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHNpbmgoZG91YmxlIGQpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlCi0gICAgICogYXJndW1lbnQKKyAgICAgKiBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHNxcnQoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzcXJ0KC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc3FydCggKGFueXRoaW5nIDwgMCkgKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc3FydCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBzcXJ0KE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgc3FydCBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIHNxdWFyZSByb290IGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHNxcnQoZG91YmxlIGQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgdGFuZ2VudCBvZiB0aGUgYXJndW1lbnQKKyAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSB0YW5nZW50IG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIHdpdGhpbiAxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkgb2YgdGhlIHJlYWwKKyAgICAgKiByZXN1bHQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSB0YW4oKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW4oLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW4oK2luZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdGFuKC1pbmZpbml0eSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRhbihOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBhbmdsZSB0byBjb21wdXRlIHRoZSB0YW5nZW50IG9mLCBpbiByYWRpYW5zCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgd2hvc2UgdGFuZ2VucyBoYXMgdG8gYmUgY29tcHV0ZWQsIGluIHJhZGlhbnMuCiAgICAgICogQHJldHVybiB0aGUgdGFuZ2VudCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHRhbihkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHRoZQotICAgICAqIGFyZ3VtZW50LiBUaGUgYWJzb2x1dGUgdmFsdWUgaXMgYWx3YXlzIGxlc3MgdGhhbiAxLiBUaGUgZmluYWwgcmVzdWx0Ci0gICAgICogc2hvdWxkIGJlIHdpdGhpbiAyLjV1bHBzIG9mIHRoZSByZWFsIHJlc3VsdC4gSWYgdGhlIHJlYWwgcmVzdWx0IGlzIAotICAgICAqIHdpdGhpbiAwLjV1bHAgb2YgMSBvciAtMSwgaXQgc2hvdWxkIGFuc3dlciBleGFjdGx5ICsxIG9yIC0xLgorICAgICAqIGFyZ3VtZW50LiBUaGUgYWJzb2x1dGUgdmFsdWUgaXMgYWx3YXlzIGxlc3MgdGhhbiAxLiBUaGUgcmV0dXJuZWQgcmVzdWx0CisgICAgICogaXMgd2l0aGluIDIuNSB1bHBzICh1bml0cyBpbiB0aGUgbGFzdCBwbGFjZSkgb2YgdGhlIHJlYWwgcmVzdWx0LiBJZiB0aGUKKyAgICAgKiByZWFsIHJlc3VsdCBpcyB3aXRoaW4gMC41dWxwIG9mIDEgb3IgLTEsIGl0IHNob3VsZCByZXR1cm4gZXhhY3RseSArMSBvcgorICAgICAqIC0xLgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgdGFuaCgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRhbmgoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW5oKCtpbmZpbml0eSkgPSArMS4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW5oKC1pbmZpbml0eSkgPSAtMS4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW5oKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgaHlwZXJib2xpYyB0YW5nZW50IG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgaHlwZXJib2xpYyB0YW5nZW50IGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSB0YW5oKGRvdWJsZSBkKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwc2V1ZG8tcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wLgorICAgICAqIFJldHVybnMgYSBwc2V1ZG8tcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAuMCAoaW5jbHVzaXZlKSBhbmQgMS4wCisgICAgICogKGV4Y2x1c2l2ZSkuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHBzZXVkby1yYW5kb20gbnVtYmVyCisgICAgICogQHJldHVybiBhIHBzZXVkby1yYW5kb20gbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHJhbmRvbSgpIHsKICAgICAgICAgaWYgKHJhbmRvbSA9PSBudWxsKSB7CkBAIC01NjQsMzUgKzEwMTQsNzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZWFzdXJlIGluIHJhZGlhbnMgb2YgdGhlIHN1cHBsaWVkIGRlZ3JlZSBhbmdsZQorICAgICAqIFJldHVybnMgdGhlIG1lYXN1cmUgaW4gcmFkaWFucyBvZiB0aGUgc3VwcGxpZWQgZGVncmVlIGFuZ2xlLiBUaGUgcmVzdWx0CisgICAgICogaXMge0Bjb2RlIGFuZ2RlZyAvIDE4MCAqIHBpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHRvUmFkaWFucygrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRvUmFkaWFucygtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRvUmFkaWFucygraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSB0b1JhZGlhbnMoLWluZmluaXR5KSA9IC1pbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdG9SYWRpYW5zKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYW5nZGVnCi0gICAgICogICAgICAgICAgICBhbiBhbmdsZSBpbiBkZWdyZWVzCisgICAgICogICAgICAgICAgICBhbiBhbmdsZSBpbiBkZWdyZWVzLgogICAgICAqIEByZXR1cm4gdGhlIHJhZGlhbiBtZWFzdXJlIG9mIHRoZSBhbmdsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSB0b1JhZGlhbnMoZG91YmxlIGFuZ2RlZykgewogICAgICAgICByZXR1cm4gYW5nZGVnIC8gMTgwZCAqIFBJOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lYXN1cmUgaW4gZGVncmVlcyBvZiB0aGUgc3VwcGxpZWQgcmFkaWFuIGFuZ2xlCisgICAgICogUmV0dXJucyB0aGUgbWVhc3VyZSBpbiBkZWdyZWVzIG9mIHRoZSBzdXBwbGllZCByYWRpYW4gYW5nbGUuIFRoZSByZXN1bHQKKyAgICAgKiBpcyB7QGNvZGUgYW5ncmFkICogMTgwIC8gcGl9LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgdG9EZWdyZWVzKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdG9EZWdyZWVzKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdG9EZWdyZWVzKCtpbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRvRGVncmVlcygtaW5maW5pdHkpID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSB0b0RlZ3JlZXMoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBhbmdyYWQKLSAgICAgKiAgICAgICAgICAgIGFuIGFuZ2xlIGluIHJhZGlhbnMKKyAgICAgKiAgICAgICAgICAgIGFuIGFuZ2xlIGluIHJhZGlhbnMuCiAgICAgICogQHJldHVybiB0aGUgZGVncmVlIG1lYXN1cmUgb2YgdGhlIGFuZ2xlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHRvRGVncmVlcyhkb3VibGUgYW5ncmFkKSB7CiAgICAgICAgIHJldHVybiBhbmdyYWQgKiAxODBkIC8gUEk7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFyZ3VtZW50J3MgdWxwLiBUaGUgc2l6ZSBvZiBhIHVscCBvZiBhIGRvdWJsZSB2YWx1ZSBpcyB0aGUKLSAgICAgKiBwb3NpdGl2ZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgdmFsdWUgYW5kIHRoZSBkb3VibGUgdmFsdWUgbmV4dCBsYXJnZXIKLSAgICAgKiBpbiBtYWduaXR1ZGUuIEZvciBub24tTmFOIHgsIHVscCgteCkgPT0gdWxwKHgpLgorICAgICAqIFJldHVybnMgdGhlIGFyZ3VtZW50J3MgdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKS4gVGhlIHNpemUgb2YgYSB1bHAgb2YKKyAgICAgKiBhIGRvdWJsZSB2YWx1ZSBpcyB0aGUgcG9zaXRpdmUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHZhbHVlIGFuZCB0aGUgZG91YmxlCisgICAgICogdmFsdWUgbmV4dCBsYXJnZXIgaW4gbWFnbml0dWRlLiBGb3Igbm9uLU5hTiB7QGNvZGUgeH0sCisgICAgICoge0Bjb2RlIHVscCgteCkgPT0gdWxwKHgpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscCgrMC4wKSA9IERvdWJsZS5NSU5fVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscCgtMC4wKSA9IERvdWJsZS5NSU5fVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscCgraW5maW50aXkpID0gaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscCgtaW5maW50aXkpID0gaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdGluZy1wb2ludCB2YWx1ZSB0byBjb21wdXRlIHVscCBvZgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlIHRvIGNvbXB1dGUgdWxwIG9mLgogICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSB1bHAgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHVscChkb3VibGUgZCkgewogICAgICAgICAvLyBzcGVjaWFsIGNhc2VzCkBAIC02MDYsMTMgKzEwOTIsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCdzIHVscC4gVGhlIHNpemUgb2YgYSB1bHAgb2YgYSBmbG9hdCB2YWx1ZSBpcyB0aGUKLSAgICAgKiBwb3NpdGl2ZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgdmFsdWUgYW5kIHRoZSBmbG9hdCB2YWx1ZSBuZXh0IGxhcmdlcgotICAgICAqIGluIG1hZ25pdHVkZS4gRm9yIG5vbi1OYU4geCwgdWxwKC14KSA9PSB1bHAoeCkuCisgICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQncyB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLiBUaGUgc2l6ZSBvZiBhIHVscCBvZgorICAgICAqIGEgZmxvYXQgdmFsdWUgaXMgdGhlIHBvc2l0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyB2YWx1ZSBhbmQgdGhlIGZsb2F0CisgICAgICogdmFsdWUgbmV4dCBsYXJnZXIgaW4gbWFnbml0dWRlLiBGb3Igbm9uLU5hTiB7QGNvZGUgeH0sCisgICAgICoge0Bjb2RlIHVscCgteCkgPT0gdWxwKHgpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscCgrMC4wKSA9IEZsb2F0Lk1JTl9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdWxwKC0wLjApID0gRmxvYXQuTUlOX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSB1bHAoK2luZmludGl5KSA9IGluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSB1bHAoLWluZmludGl5KSA9IGluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSB1bHAoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBmCi0gICAgICogICAgICAgICAgICB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWUgdG8gY29tcHV0ZSB1bHAgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdGluZy1wb2ludCB2YWx1ZSB0byBjb21wdXRlIHVscCBvZi4KICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIGEgdWxwIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHVscChmbG9hdCBmKSB7CiAgICAgICAgIC8vIHNwZWNpYWwgY2FzZXMKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24uamF2YQppbmRleCA2MmQxOGI5Li4xY2E3ODU1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOCArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBjcmVhdGUgYW4gYXJyYXkKLSAqIHdob3NlIHNpemUgd291bGQgYmUgbGVzcyB0aGFuIHplcm8uCisgKiBUaHJvd24gd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gY3JlYXRlIGFuIGFycmF5IHdpdGggYSBzaXplIG9mIGxlc3MgdGhhbgorICogemVyby4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg5NjAxMTgwNTg1OTY5OTE4NjFMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUKKyAgICAgKiBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvci5qYXZhCmluZGV4IGYzNjkxNjcuLmUyM2VjYzYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9DbGFzc0RlZkZvdW5kRXJyb3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL05vQ2xhc3NEZWZGb3VuZEVycm9yLmphdmEKQEAgLTE3LDI4ICsxNywzMyBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIFZNIGlzIHVuYWJsZSB0byBsb2NhdGUgYSBjbGFzcyB3aGljaCBpdCBoYXMKLSAqIGJlZW4gYXNrZWQgdG8gbG9hZC4KKyAqIFRocm93biB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgdW5hYmxlIHRvIGxvY2F0ZSBhIGNsYXNzIHdoaWNoIGl0IGhhcyBiZWVuCisgKiBhc2tlZCB0byBsb2FkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4dGVuZHMgTGlua2FnZUVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkwOTU4NTk4NjMyODcwMTI0NThMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBOb0NsYXNzRGVmRm91bmRFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb0NsYXNzRGVmRm91bmRFcnJvcigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTm9DbGFzc0RlZkZvdW5kRXJyb3J9IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm9DbGFzc0RlZkZvdW5kRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL05vU3VjaEZpZWxkRXJyb3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvci5qYXZhCmluZGV4IDIxODk3NzUuLjY2N2Q2YTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvci5qYXZhCkBAIC0xNywzMCArMTcsMzYgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSBWTSBub3RpY2VzIHRoYXQgYSBhbiBhdHRlbXB0IGlzIGJlaW5nIG1hZGUgdG8KLSAqIHJlZmVyZW5jZSBhIGZpZWxkIG9mIGEgY2xhc3Mgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gdGhhdCBjbGFzcy4KKyAqIFRocm93biB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgbm90aWNlcyB0aGF0IGEgcHJvZ3JhbSB0cmllcyB0byByZWZlcmVuY2UsCisgKiBvbiBhIGNsYXNzIG9yIG9iamVjdCwgYSBmaWVsZCB0aGF0IGRvZXMgbm90IGV4aXN0LgogICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBvY2N1ciB3aGVuIGluY29uc2lzdGFudCBjbGFzcyBmaWxlcyBhcmUgYmVpbmcgbG9hZGVkLgorICogTm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgb2NjdXIgd2hlbiBpbmNvbnNpc3RlbnQgY2xhc3MgZmlsZXMgYXJlIGJlaW5nIGxvYWRlZC4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOb1N1Y2hGaWVsZEVycm9yIGV4dGVuZHMgSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzQ1NjQzMDE5NTg4NjEyOTAzNUw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE5vU3VjaEZpZWxkRXJyb3J9IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm9TdWNoRmllbGRFcnJvcigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTm9TdWNoRmllbGRFcnJvcn0gd2l0aCB0aGUgY3VycmVudCBzdGFjayB0cmFjZQorICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1N1Y2hGaWVsZEVycm9yKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGM2NDI5ZjMuLjMxYTU2NmQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uLmphdmEKQEAgLTE3LDI4ICsxNywzMyBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byBhY2Nlc3MgYSBmaWVsZCB3aGljaCBkb2VzCi0gKiBub3QgZXhpc3QgaW4gYSBjbGFzcworICogVGhyb3duIHdoZW4gdGhlIHZpcnR1YWwgbWFjaGluZSBub3RpY2VzIHRoYXQgYSBwcm9ncmFtIHRyaWVzIHRvIHJlZmVyZW5jZSwKKyAqIG9uIGEgY2xhc3Mgb3Igb2JqZWN0LCBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTm9TdWNoRmllbGRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTQzNzE0ODA1Mjc5OTM4MjYwTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTm9TdWNoRmllbGRFeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm9TdWNoRmllbGRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE5vU3VjaEZpZWxkRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXJyb3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXJyb3IuamF2YQppbmRleCBhM2Y3MjU1Li5hNzJmNzZiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL05vU3VjaE1ldGhvZEVycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFcnJvci5qYXZhCkBAIC0xNywyOCArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSBWTSBub3RpY2VzIHRoYXQgYSBhbiBhdHRlbXB0IGlzIGJlaW5nIG1hZGUgdG8KLSAqIHJlZmVyZW5jZSBhIG1ldGhvZCBvZiBhIGNsYXNzIHdoaWNoIGRvZXMgbm90IGV4aXN0IGluIHRoYXQgY2xhc3MuCisgKiBUaHJvd24gd2hlbiB0aGUgdmlydHVhbCBtYWNoaW5lIG5vdGljZXMgdGhhdCBhIHByb2dyYW0gdHJpZXMgdG8gcmVmZXJlbmNlLAorICogb24gYSBjbGFzcyBvciBvYmplY3QsIGEgbWV0aG9kIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTm9TdWNoTWV0aG9kRXJyb3IgZXh0ZW5kcyBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNzY1NTIxNDQyMzcyODMxMzM1TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTm9TdWNoTWV0aG9kRXJyb3J9IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm9TdWNoTWV0aG9kRXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE5vU3VjaE1ldGhvZEVycm9yfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1N1Y2hNZXRob2RFcnJvcihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGQ3NDE1ZTUuLmJkM2NmMDEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24uamF2YQpAQCAtMTcsMjggKzE3LDMzIEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIGFjY2VzcyBhIG1ldGhvZCB3aGljaAotICogZG9lcyBub3QgZXhpc3QgaW4gYSBjbGFzcy4KKyAqIFRocm93biB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgbm90aWNlcyB0aGF0IGEgcHJvZ3JhbSB0cmllcyB0byByZWZlcmVuY2UsCisgKiBvbiBhIGNsYXNzIG9yIG9iamVjdCwgYSBtZXRob2QgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwMzQzODg0NDYzNjI2MDA5MjNMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBOb1N1Y2hNZXRob2RFeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCkgeworICAgcHVibGljIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBOb1N1Y2hNZXRob2RFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb24uamF2YQppbmRleCBmMzYzMzRmLi5kMTFiMjgyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbi5qYXZhCkBAIC0xNywyOSArMTcsMzYgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhY2Nlc3MgYSBmaWVsZCBvcgotICogbWV0aG9kIG9mIGFuIGluc3RhbmNlIG9yIGFuIGVsZW1lbnQgb2YgYW4gYXJyYXkgd2hlbiB0aGVyZSBpcyBubyBpbnN0YW5jZSBvcgotICogYXJyYXkgdG8gdXNlIChpLmUuIHRoZSBwb2ludGVyIGlzIG51bGwpLgorICogVGhyb3duIHdoZW4gYSBwcm9ncmFtIHRyaWVzIHRvIGFjY2VzcyBhIGZpZWxkIG9yIG1ldGhvZCBvZiBhbiBvYmplY3Qgb3IgYW4KKyAqIGVsZW1lbnQgb2YgYW4gYXJyYXkgd2hlbiB0aGVyZSBpcyBubyBpbnN0YW5jZSBvciBhcnJheSB0byB1c2UsIHRoYXQgaXMgaWYgdGhlCisgKiBvYmplY3Qgb3IgYXJyYXkgcG9pbnRzIHRvIHtAY29kZSBudWxsfS4gSXQgYWxzbyBvY2N1cnMgaW4gc29tZSBvdGhlciwgbGVzcworICogb2J2aW91cyBjaXJjdW1zdGFuY2VzLCBsaWtlIGEge0Bjb2RlIHRocm93IGV9IHN0YXRlbWVudCB3aGVyZSB0aGUge0BsaW5rCisgKiBUaHJvd2FibGV9IHJlZmVyZW5jZSBpcyB7QGNvZGUgbnVsbH0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUxNjI3MTAxODMzODkwMjg3OTJMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE51bGxQb2ludGVyRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9OdW1iZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTnVtYmVyLmphdmEKaW5kZXggNTdmYmIzMS4uZGM4NjhjYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9OdW1iZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL051bWJlci5qYXZhCkBAIC0xOSw2MCArMTksNzUgQEAKIAogCiAvKioKLSAqIE51bWJlciBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgbnVtZXJpYyBiYXNlCi0gKiB0eXBlcyAoaS5lLiBhbGwgYnV0IENoYXJhY3RlciwgQm9vbGVhbiwgYW5kIFZvaWQpLgorICogVGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgdGhlIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IG51bWVyaWMgYmFzZSB0eXBlcworICogKHRoYXQgaXMge0BsaW5rIEJ5dGV9LCB7QGxpbmsgU2hvcnR9LCB7QGxpbmsgSW50ZWdlcn0sIHtAbGluayBMb25nfSwKKyAqIHtAbGluayBGbG9hdH0sIGFuZCB7QGxpbmsgRG91YmxlfS4gCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVtYmVyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg3NDI0NDg4MjQ2NTIwNzg5NjVMOwogCiAgICAgLyoqCi0gICAgICogTnVtYmVyIGNvbnN0cnVjdG9yLiBJbmNsdWRlZCBmb3Igc3BlYyBjb21wYXRhYmlsaXR5LgorICAgICAqIEVtcHR5IGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE51bWJlcigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCisgICAgICogUmV0dXJucyB0aGlzIG9iamVjdCdzIHZhbHVlIGFzIGEgYnl0ZS4gTWlnaHQgaW52b2x2ZSByb3VuZGluZyBhbmQvb3IKKyAgICAgKiB0cnVuY2F0aW5nIHRoZSB2YWx1ZSwgc28gaXQgZml0cyBpbnRvIGEgYnl0ZS4gIAogICAgICAqIAotICAgICAqIEByZXR1cm4gYnl0ZSB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSBieXRlIHZhbHVlIG9mIHRoaXMgb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIChieXRlKSBpbnRWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cworICAgICAqIFJldHVybnMgdGhpcyBvYmplY3QncyB2YWx1ZSBhcyBhIGRvdWJsZS4gTWlnaHQgaW52b2x2ZSByb3VuZGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGRvdWJsZSB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSBkb3VibGUgdmFsdWUgb2YgdGhpcyBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBkb3VibGVWYWx1ZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmxvYXQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKKyAgICAgKiBSZXR1cm5zIHRoaXMgb2JqZWN0J3MgdmFsdWUgYXMgYSBmbG9hdC4gTWlnaHQgaW52b2x2ZSByb3VuZGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZsb2F0IHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiB0aGUgcHJpbWl0aXZlIGZsb2F0IHZhbHVlIG9mIHRoaXMgb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdCBmbG9hdFZhbHVlKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbnQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKKyAgICAgKiBSZXR1cm5zIHRoaXMgb2JqZWN0J3MgdmFsdWUgYXMgYW4gaW50LiBNaWdodCBpbnZvbHZlIHJvdW5kaW5nIGFuZC9vcgorICAgICAqIHRydW5jYXRpbmcgdGhlIHZhbHVlLCBzbyBpdCBmaXRzIGludG8gYW4gaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiB0aGUgcHJpbWl0aXZlIGludCB2YWx1ZSBvZiB0aGlzIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGludFZhbHVlKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb25nIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCisgICAgICogUmV0dXJucyB0aGlzIG9iamVjdCdzIHZhbHVlIGFzIGEgbG9uZy4gTWlnaHQgaW52b2x2ZSByb3VuZGluZyBhbmQvb3IKKyAgICAgKiB0cnVuY2F0aW5nIHRoZSB2YWx1ZSwgc28gaXQgZml0cyBpbnRvIGEgbG9uZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxvbmcgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgbG9uZyB2YWx1ZSBvZiB0aGlzIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBsb25nVmFsdWUoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNob3J0IHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCisgICAgICogUmV0dXJucyB0aGlzIG9iamVjdCdzIHZhbHVlIGFzIGEgc2hvcnQuIE1pZ2h0IGludm9sdmUgcm91bmRpbmcgYW5kL29yCisgICAgICogdHJ1bmNhdGluZyB0aGUgdmFsdWUsIHNvIGl0IGZpdHMgaW50byBhIHNob3J0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gc2hvcnQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgc2hvcnQgdmFsdWUgb2YgdGhpcyBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiAoc2hvcnQpIGludFZhbHVlKCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb24uamF2YQppbmRleCAyY2IyZjcyLi5lZDU0MzNkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTE3LDI4ICsxNywzMyBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSAic3RyaW5nIHRvIG51bWJlciIgY29udmVyc2lvbiByb3V0aW5lCi0gKiBpcyBwYXNzZWQgYW4gaW52YWxpZCB2YWx1ZS4KKyAqIFRocm93biB3aGVuIGFuIGludmFsaWQgdmFsdWUgaXMgcGFzc2VkIHRvIGEgc3RyaW5nLXRvLW51bWJlciBjb252ZXJzaW9uCisgKiBtZXRob2QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjg0ODkzODgwNjM2ODk5ODg5NEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IuamF2YQppbmRleCBkNjM5NjNiLi4yYzU0YWQxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IuamF2YQpAQCAtMTcsMzAgKzE3LDM0IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHJlcXVlc3QgaXMgbWFkZSBmb3IgbW9yZSBtZW1vcnkgZWl0aGVyIGFzIGEKLSAqIHJlc3VsdCBvZiB0aGUgcnVubmluZyBwcm9ncmFtLCBvciBiZWNhdXNlIG9mIHRoZSBpbnRlcm5hbCBiZWhhdmlvciBvZiB0aGUKLSAqIHZpcnR1YWwgbWFjaGluZSB3aGljaCBjYW4gbm90IGJlIHNhdGlzZmllZCB1c2luZyB0aGUgYXZhaWxhYmxlIHBsYXRmb3JtCi0gKiByZXNvdXJjZXMuCisgKiBUaHJvd24gd2hlbiBhIHJlcXVlc3QgZm9yIG1lbW9yeSBpcyBtYWRlIHRoYXQgY2FuIG5vdCBiZSBzYXRpc2ZpZWQgdXNpbmcgdGhlCisgKiBhdmFpbGFibGUgcGxhdGZvcm0gcmVzb3VyY2VzLiBTdWNoIGEgcmVxdWVzdCBtYXkgYmUgbWFkZSBieSBib3RoIHRoZSBydW5uaW5nCisgKiBhcHBsaWNhdGlvbiBvciBieSBhbiBpbnRlcm5hbCBmdW5jdGlvbiBvZiB0aGUgdmlydHVhbCBtYWNoaW5lLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE91dE9mTWVtb3J5RXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MjI4NTY0MDg2MTg0MDEwNTE3TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgT3V0T2ZNZW1vcnlFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPdXRPZk1lbW9yeUVycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBPdXRPZk1lbW9yeUVycm9yfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE91dE9mTWVtb3J5RXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL092ZXJyaWRlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL092ZXJyaWRlLmphdmEKaW5kZXggZTkwZWUxMS4uODY0MzU3ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9PdmVycmlkZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvT3ZlcnJpZGUuamF2YQpAQCAtMTksNiArMTksMTMgQEAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwogCisvKioKKyAqIEFubm90YXRpb24gdHlwZSB1c2VkIHRvIG1hcmsgbWV0aG9kcyB0aGF0IG92ZXJyaWRlIGEgbWV0aG9kIGRlY2xhcmF0aW9uIGluIGEgc3VwZXJjbGFzcy4KKyAqIENvbXBpbGVycyBwcm9kdWNlIGFuIGVycm9yIGlmIGEgbWV0aG9kIGFubm90YXRlZCB3aXRoIEBPdmVycmlkZSBkb2VzIG5vdCBhY3R1YWxseSBvdmVycmlkZQorICogYSBtZXRob2QgaW4gYSBzdXBlcmNsYXNzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogQFJldGVudGlvbih2YWx1ZT1qYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuU09VUkNFKQogQFRhcmdldCh2YWx1ZT1qYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0QpCiBwdWJsaWMgQGludGVyZmFjZSBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Qcm9jZXNzLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Byb2Nlc3MuamF2YQppbmRleCBmMjgwNTI4Li41ZmU4YmU3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Byb2Nlc3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Byb2Nlc3MuamF2YQpAQCAtMjIsNjUgKzIyLDcyIEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiAKIC8qKgotICogSW5zdGFuY2VzIG9mIGNsYXNzIFByb2Nlc3MgcHJvdmlkZSBjb250cm9sIG9mIGFuZCBhY2Nlc3MgdG8gcGxhdGZvcm0KLSAqIHByb2Nlc3Nlcy4KKyAqIFJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgcHJvY2Vzcy4gRW5hYmxlcyB3cml0aW5nIHRvLCByZWFkaW5nIGZyb20sIGRlc3Ryb3lpbmcsCisgKiBhbmQgd2FpdGluZyBmb3IgdGhlIGV4dGVybmFsIHByb2Nlc3MsIGFzIHdlbGwgYXMgcXVlcnlpbmcgaXRzIGV4aXQgdmFsdWUuCisgKiAKKyAqIEBzZWUgUnVudGltZSNleGVjCisgKiBAc2VlIFByb2Nlc3NCdWlsZGVyI3N0YXJ0KCkKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzIHsKIAogICAgIC8qKgotICAgICAqIFRlcmltYXRlcyB0aGUgcmVjZWl2ZXIgYW5kIGNsb3NlcyBhbnkgYXNzb2NpYXRlZCBzdHJlYW1zLgorICAgICAqIFRlcm1pbmF0ZXMgdGhpcyBwcm9jZXNzIGFuZCBjbG9zZXMgYW55IGFzc29jaWF0ZWQgc3RyZWFtcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBkZXN0cm95KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleGl0IHZhbHVlIG9mIHRoZSByZWNlaXZpbmcgUHJvY2Vzcy4gSXQgaXMgYXZhaWxhYmxlIG9ubHkKLSAgICAgKiB3aGVuIHRoZSBPUyBzdWJwcm9jZXNzIGlzIGZpbmlzaGVkLgorICAgICAqIFJldHVybnMgdGhlIGV4aXQgdmFsdWUgb2YgdGhlIG5hdGl2ZSBwcm9jZXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqIEl0IGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gdGhlIG5hdGl2ZSBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGV4aXQgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgdmFsdWUgb2YgdGhpcyBwcm9jZXNzLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHJlY2VpdmVyIGhhcyBub3QgdGVybWluYXRlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHByb2Nlc3MgaGFzIG5vdCB0ZXJtaW5hdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgZXhpdFZhbHVlKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWNlaXZlcidzIGVycm9yIG91dHB1dCBzdHJlYW0uCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogVGhpcyBpcyBhbiBJbnB1dFN0cmVhbSB3aGljaCBhbGxvd3MgcmVhZGluZyBvZiB0aGUgb3RoZXIgdGhyZWFkcwotICAgICAqICJzdGRlcnIiLgorICAgICAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIHRoYXQgaXMgY29ubmVjdGVkIHRvIHRoZSBlcnJvciBzdHJlYW0KKyAgICAgKiA8ZW0+KHN0ZGVycik8L2VtPiBvZiB0aGUgbmF0aXZlIHByb2Nlc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgZXJyb3Igc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tIHRoZSBlcnJvciBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoCisgICAgICogICAgICAgICB0aGUgbmF0aXZlIHByb2Nlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYWJzdHJhY3QgcHVibGljIElucHV0U3RyZWFtIGdldEVycm9yU3RyZWFtKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWNlaXZlcidzIHN0YW5kYXJkIGlucHV0IHN0cmVhbQotICAgICAqIDxwPgotICAgICAqIE5vdGU6IFRoaXMgaXMgYW4gSW5wdXRTdHJlYW0gd2hpY2ggYWxsb3dzIHJlYWRpbmcgZnJvbSB0aGUgb3RoZXIgcHJvY2VzcycKLSAgICAgKiAic3Rkb3V0Ii4KKyAgICAgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSB0aGF0IGlzIGNvbm5lY3RlZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbQorICAgICAqIDxlbT4oc3Rkb3V0KTwvZW0+IG9mIHRoZSBuYXRpdmUgcHJvY2VzcyByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZWNlaXZlcidzIHByb2Nlc3MnIHN0ZGluLgorICAgICAqIEByZXR1cm4gdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoCisgICAgICogICAgICAgICB0aGUgbmF0aXZlIHByb2Nlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYWJzdHJhY3QgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWNlaXZlcidzIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBUaGlzIGlzIGFuIE91dHB1dFN0cmVhbSB3aGljaCBhbGxvd3Mgd3JpdGluZyB0byB0aGUgb3RoZXIgcHJvY2VzcycKLSAgICAgKiAic3RkaW4iLgorICAgICAqIFJldHVybnMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGlzIGNvbm5lY3RlZCB0byB0aGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtCisgICAgICogPGVtPihzdGRpbik8L2VtPiBvZiB0aGUgbmF0aXZlIHByb2Nlc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgcmVjZWl2ZXIncyBwcm9jZXNzJyBzdGRvdXQuCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0byB0aGUgaW5wdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aAorICAgICAqICAgICAgICAgdGhlIG5hdGl2ZSBwcm9jZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGFic3RyYWN0IHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCk7CiAKICAgICAvKioKLSAgICAgKiBDYXVzZXMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgKiByZWNlaXZlciB0byBmaW5pc2ggZXhlY3V0aW5nLgorICAgICAqIENhdXNlcyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gd2FpdCBmb3IgdGhlIG5hdGl2ZSBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgb2JqZWN0IHRvIGZpbmlzaCBleGVjdXRpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgZXhpdCB2YWx1ZSBvZiB0aGUgUHJvY2VzcyBiZWluZyB3YWl0ZWQgb24KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBleGl0IHZhbHVlIG9mIHRoZSBuYXRpdmUgcHJvY2VzcyBiZWluZyB3YWl0ZWQgb24uCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBpbnRlcnJ1cHRlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBpbnRlcnJ1cHRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBwdWJsaWMgaW50IHdhaXRGb3IoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Byb2Nlc3NCdWlsZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Byb2Nlc3NCdWlsZGVyLmphdmEKaW5kZXggZTgzMzdjMS4uOWQ2YjkwYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Qcm9jZXNzQnVpbGRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXIuamF2YQpAQCAtMjMsMTEgKzIzLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKLSAqIDxwPgotICogQSBidWlsZGVyIGZvciBjcmVhdGluZyBPUy1zcGVjaWZpYyBwcm9jZXNzZXMuCi0gKiA8L3A+CisgKiBDcmVhdGVzIG9wZXJhdGluZyBzeXN0ZW0gcHJvY2Vzc2VzLgogICogCi0gKiBAc2luY2UgMS41CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFByb2Nlc3NCdWlsZGVyIHsKIApAQCAtNDAsMjYgKzM4LDI4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHJlZGlyZWN0RXJyb3JTdHJlYW07CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0gICAgICogPC9wPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFByb2Nlc3NCdWlsZGVyfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvcGVyYXRpbmcgc3lzdGVtIHByb2dyYW0gYW5kIGl0cyBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbW1hbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBwcm9ncmFtIGFuZCBhcmd1bWVudHMuCisgICAgICogICAgICAgICAgICB0aGUgcmVxdWVzdGVkIG9wZXJhdGluZyBzeXN0ZW0gcHJvZ3JhbSBhbmQgaXRzIGFyZ3VtZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJvY2Vzc0J1aWxkZXIoU3RyaW5nLi4uIGNvbW1hbmQpIHsKICAgICAgICAgdGhpcyh0b0xpc3QoY29tbWFuZCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJvY2Vzc0J1aWxkZXJ9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG9wZXJhdGluZyBzeXN0ZW0gcHJvZ3JhbSBhbmQgaXRzIGFyZ3VtZW50cy4gTm90ZSB0aGF0IHRoZSBsaXN0IHBhc3NlZCB0bworICAgICAqIHRoaXMgY29uc3RydWN0b3IgaXMgbm90IGNvcGllZCwgc28gYW55IHN1YnNlcXVlbnQgdXBkYXRlcyB0byBpdCBhcmUKKyAgICAgKiByZWZsZWN0ZWQgaW4gdGhpcyBpbnN0YW5jZSdzIHN0YXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb21tYW5kCi0gICAgICogICAgICAgICAgICBUaGUgcHJvZ3JhbSBhbmQgYXJndW1lbnRzLgorICAgICAqICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCBvcGVyYXRpbmcgc3lzdGVtIHByb2dyYW0gYW5kIGl0cyBhcmd1bWVudHMuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmNvbW1hbmQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb21tYW5kfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3NCdWlsZGVyKExpc3Q8U3RyaW5nPiBjb21tYW5kKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC02Nyw0NyArNjcsNDYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gU3lzdGVtLmdldGVudigpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGJ1aWxkZXIncyBjdXJyZW50IHByb2dyYW0gYW5kIGFyZ3VtZW50cy4gVGhlIHJldHVybmVkIHZhbHVlIGlzCi0gICAgICogY29uc2lkZXJlZCBsaXZlIGFuZCBtb2RpZmljYXRpb25zIHRvIGl0IHdpbGwgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGlzIHByb2Nlc3MgYnVpbGRlcidzIGN1cnJlbnQgcHJvZ3JhbSBhbmQgYXJndW1lbnRzLiBOb3RlIHRoYXQKKyAgICAgKiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBub3QgYSBjb3B5IGFuZCBtb2RpZmljYXRpb25zIHRvIGl0IHdpbGwgY2hhbmdlIHRoZQorICAgICAqIHN0YXRlIG9mIHRoaXMgaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgcHJvZ3JhbSBhbmQgYXJndW1lbnRzIGN1cnJlbnRseSBzZXQuCisgICAgICogQHJldHVybiB0aGlzIHByb2Nlc3MgYnVpbGRlcidzIHByb2dyYW0gYW5kIGFyZ3VtZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGNvbW1hbmQoKSB7CiAgICAgICAgIHJldHVybiBjb21tYW5kOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENoYW5nZXMgdGhlIHByb2dyYW0gYW5kIGFyZ3VtZW50cyB0byB0aGUgY29tbWFuZCBnaXZlbi4KLSAgICAgKiA8L3A+CisgICAgICogQ2hhbmdlcyB0aGUgcHJvZ3JhbSBhbmQgYXJndW1lbnRzIG9mIHRoaXMgcHJvY2VzcyBidWlsZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb21tYW5kCi0gICAgICogICAgICAgICAgICBUaGUgcHJvZ3JhbSBhbmQgYXJndW1lbnRzLgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgb3BlcmF0aW5nIHN5c3RlbSBwcm9ncmFtIGFuZCBpdHMgYXJndW1lbnRzLgorICAgICAqIEByZXR1cm4gdGhpcyBwcm9jZXNzIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3NCdWlsZGVyIGNvbW1hbmQoU3RyaW5nLi4uIGNvbW1hbmQpIHsKICAgICAgICAgcmV0dXJuIGNvbW1hbmQodG9MaXN0KGNvbW1hbmQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDaGFuZ2VzIHRoZSBwcm9ncmFtIGFuZCBhcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQgZ2l2ZW4uIFRoZSBsaXN0IHBhc3NlZAotICAgICAqIGlzIG5vdCBjb3BpZWQsIHNvIGFueSBzdWJzZXF1ZW50IHVwZGF0ZXMgdG8gaXQgYXJlIHJlZmxlY3RlZCBpbiB0aGlzCi0gICAgICogaW5zdGFuY2UncyBzdGF0ZS4KLSAgICAgKiA8L3A+CisgICAgICogQ2hhbmdlcyB0aGUgcHJvZ3JhbSBhbmQgYXJndW1lbnRzIG9mIHRoaXMgcHJvY2VzcyBidWlsZGVyLiBOb3RlIHRoYXQgdGhlCisgICAgICogbGlzdCBwYXNzZWQgdG8gdGhpcyBtZXRob2QgaXMgbm90IGNvcGllZCwgc28gYW55IHN1YnNlcXVlbnQgdXBkYXRlcyB0byBpdAorICAgICAqIGFyZSByZWZsZWN0ZWQgaW4gdGhpcyBpbnN0YW5jZSdzIHN0YXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb21tYW5kCi0gICAgICogICAgICAgICAgICBUaGUgcHJvZ3JhbSBhbmQgYXJndW1lbnRzLgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgb3BlcmF0aW5nIHN5c3RlbSBwcm9ncmFtIGFuZCBpdHMgYXJndW1lbnRzLgorICAgICAqIEByZXR1cm4gdGhpcyBwcm9jZXNzIGJ1aWxkZXIgaW5zdGFuY2UuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmNvbW1hbmQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb21tYW5kfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3NCdWlsZGVyIGNvbW1hbmQoTGlzdDxTdHJpbmc+IGNvbW1hbmQpIHsKICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewpAQCAtMTE4LDI4ICsxMTcsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgdGhhdCdzIGN1cnJlbnRseSBzZXQuIElmIHRoaXMgdmFsdWUgaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIEphdmEgcHJvY2VzcyBpcwotICAgICAqIHVzZWQuCi0gICAgICogPC9wPgorICAgICAqIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoaXMgcHJvY2VzcyBidWlsZGVyLiBJZiB7QGNvZGUgbnVsbH0gaXMKKyAgICAgKiByZXR1cm5lZCwgdGhlbiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIEphdmEgcHJvY2VzcyBpcyB1c2VkIHdoZW4gYQorICAgICAqIHByb2Nlc3MgaXMgc3RhcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCB3aGljaCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZSBkaXJlY3RvcnkoKSB7CiAgICAgICAgIHJldHVybiBkaXJlY3Rvcnk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ2hhbmdlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSBnaXZlbi4gSWYgdGhlIGdpdmVuCi0gICAgICogZGlyZWN0b3J5IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgSmF2YQorICAgICAqIENoYW5nZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoaXMgcHJvY2VzcyBidWlsZGVyLiBJZiB0aGUgc3BlY2lmaWVkCisgICAgICogZGlyZWN0b3J5IGlzIHtAY29kZSBudWxsfSwgdGhlbiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIEphdmEKICAgICAgKiBwcm9jZXNzIGlzIHVzZWQgd2hlbiBhIHByb2Nlc3MgaXMgc3RhcnRlZC4KLSAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGRpcmVjdG9yeQotICAgICAqICAgICAgICAgICAgVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHNldC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGlzIHByb2Nlc3MgYnVpbGRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcHJvY2VzcyBidWlsZGVyIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm9jZXNzQnVpbGRlciBkaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKICAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CkBAIC0xNDcsNDIgKzE0NCw0MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBidWlsZGVyJ3MgY3VycmVudCBlbnZpcm9ubWVudC4gV2hlbiBhbiBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0aGUKLSAgICAgKiBlbnZpcm9ubWVudCBpcyBwb3B1bGF0ZWQgd2l0aCBhIGNvcHkgb2YgdGhlIGVudmlyb25tZW50LCBhcyByZXR1cm5lZCBieQotICAgICAqIHtAbGluayBTeXN0ZW0jZ2V0ZW52KCl9LiBUaGUgTWFwIHJldHVybmVkIGlzIGxpdmUgYW5kIGFueSBjaGFuZ2VzIG1hZGUKLSAgICAgKiB0byBpdCBhcmUgcmVmbGVjdGVkIGluIHRoaXMgaW5zdGFuY2UncyBzdGF0ZS4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGlzIHByb2Nlc3MgYnVpbGRlcidzIGN1cnJlbnQgZW52aXJvbm1lbnQuIFdoZW4gYSBwcm9jZXNzCisgICAgICogYnVpbGRlciBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0aGUgZW52aXJvbm1lbnQgaXMgcG9wdWxhdGVkIHdpdGggYSBjb3B5IG9mCisgICAgICogdGhlIGVudmlyb25tZW50LCBhcyByZXR1cm5lZCBieSB7QGxpbmsgU3lzdGVtI2dldGVudigpfS4gTm90ZSB0aGF0IHRoZQorICAgICAqIG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBub3QgYSBjb3B5IGFuZCBhbnkgY2hhbmdlcyBtYWRlIHRvIGl0IGFyZQorICAgICAqIHJlZmxlY3RlZCBpbiB0aGlzIGluc3RhbmNlJ3Mgc3RhdGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgTWFwIG9mIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXAgY29udGFpbmluZyB0aGlzIHByb2Nlc3MgYnVpbGRlcidzIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCgpIHsKICAgICAgICAgcmV0dXJuIGVudmlyb25tZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RhbmRhcmQgZXJyb3Igc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8KLSAgICAgKiBzdGFuZGFyZCBvdXRwdXQuIElmIHJlZGlyZWN0ZWQsIHRoZSB7QGxpbmsgUHJvY2VzcyNnZXRFcnJvclN0cmVhbSgpfSB3aWxsCi0gICAgICogYWx3YXlzIHJldHVybiBlbmQgb2Ygc3RyZWFtIGFuZCBzdGFuZGFyZCBlcnJvciBpcyB3cml0dGVuIHRvCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0YW5kYXJkIGVycm9yIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIHN0YW5kYXJkCisgICAgICogb3V0cHV0LiBJZiByZWRpcmVjdGVkLCB0aGUge0BsaW5rIFByb2Nlc3MjZ2V0RXJyb3JTdHJlYW0oKX0gd2lsbCBhbHdheXMKKyAgICAgKiByZXR1cm4gZW5kIG9mIHN0cmVhbSBhbmQgc3RhbmRhcmQgZXJyb3IgaXMgd3JpdHRlbiB0bwogICAgICAqIHtAbGluayBQcm9jZXNzI2dldElucHV0U3RyZWFtKCl9LgotICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBzdGFuZGFyZCBlcnJvciBpcyByZWRpcmVjdGVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzdGFuZGFyZCBlcnJvciBpcyByZWRpcmVjdGVkOyB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVkaXJlY3RFcnJvclN0cmVhbSgpIHsKICAgICAgICAgcmV0dXJuIHJlZGlyZWN0RXJyb3JTdHJlYW07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ2hhbmdlcyB0aGUgc3RhdGUgb2Ygd2hldGhlciBvciBub3Qgc3RhbmRhcmQgZXJyb3IgaXMgcmVkaXJlY3RlZC4KLSAgICAgKiA8L3A+CisgICAgICogQ2hhbmdlcyB0aGUgc3RhdGUgb2Ygd2hldGhlciBvciBub3Qgc3RhbmRhcmQgZXJyb3IgaXMgcmVkaXJlY3RlZCB0bworICAgICAqIHN0YW5kYXJkIG91dHB1dC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVkaXJlY3RFcnJvclN0cmVhbQotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcmVkaXJlY3Qgc3RhbmRhcmQgZXJyb3IsCi0gICAgICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byByZWRpcmVjdCBzdGFuZGFyZCBlcnJvciwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdGhpcyBwcm9jZXNzIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3NCdWlsZGVyIHJlZGlyZWN0RXJyb3JTdHJlYW0oYm9vbGVhbiByZWRpcmVjdEVycm9yU3RyZWFtKSB7CiAgICAgICAgIHRoaXMucmVkaXJlY3RFcnJvclN0cmVhbSA9IHJlZGlyZWN0RXJyb3JTdHJlYW07CkBAIC0xOTAsMTQgKzE4NywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFN0YXJ0cyBhIG5ldyBwcm9jZXNzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBidWlsZGVyLgotICAgICAqIDwvcD4KKyAgICAgKiBTdGFydHMgYSBuZXcgcHJvY2VzcyBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHByb2Nlc3MgYnVpbGRlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgcHJvY2VzcyB0aGF0IHdhcyBzdGFydGVkLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgUHJvY2Vzc30gaW5zdGFuY2UuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgb2Yge0BsaW5rICNjb21tYW5kKCl9IGFyZQotICAgICAqICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgb2Yge0BsaW5rICNjb21tYW5kKCl9IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB7QGxpbmsgI2NvbW1hbmQoKX0gaXMgZW1wdHkuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgpAQCAtMjA1LDYgKzE5OSw3IEBACiAgICAgICogICAgICAgICAgICAgcHJvY2VzcyBjcmVhdGlvbi4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3Mgc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoY29tbWFuZC5pc0VtcHR5KCkpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUmVhZGFibGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUmVhZGFibGUuamF2YQppbmRleCAwMjg2MjI3Li4xZWNhNmNjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1JlYWRhYmxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9SZWFkYWJsZS5qYXZhCkBAIC0xLDE4ICsxLDE3IEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCisvKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCiAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAogcGFja2FnZSBqYXZhLmxhbmc7CkBAIC0yMSwyMyArMjAsMjQgQEAKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogCiAvKioKLSAqIFJlYWRhYmxlIG1hcmtzIHRoYXQgdGhlIGltcGxlbWVudGluZyBjbGFzcyBwcm92aWRlcyBjaGFyYWN0ZXIgc2VxdWVuY2UuCi0gKiBSZWFkYWJsZSBnaXZlcyBhIHJlZmVyZW5jZSB0byBjaGFyYWN0ZXIgc2VxdWVuY2UgZnJvbSB3aXRoaW4gaXRzZWxmIHRvIGNhbGxlcgotICogdGhyb3VnaCBhIDxjb2RlPkNoYXJCdWZmZXI8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGUgPGNvZGU+cmVhZDwvY29kZT4KLSAqIG1ldGhvZC4KKyAqIFJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGluY3JlbWVudGFsbHkgcmVhZCAoY29waWVkKQorICogaW50byBhIHtAbGluayBDaGFyQnVmZmVyfS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVhZGFibGUgewogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIGNoYXJhY3RlcnMgaW50byB0aGUgZ2l2ZW4gPGNvZGU+Q2hhckJ1ZmZlcjwvY29kZT4uIFRoZQotICAgICAqIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpcyA8Y29kZT5DaGFyQnVmZmVyLnJlbWFpbmluZygpPC9jb2RlPi4KKyAgICAgKiBSZWFkcyBjaGFyYWN0ZXJzIGludG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgQ2hhckJ1ZmZlcn0uIFRoZSBtYXhpbXVtCisgICAgICogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpcyB7QGNvZGUgQ2hhckJ1ZmZlci5yZW1haW5pbmcoKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNiCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIGZpbGxlZCBpbiBieSB0aGUgY2hhcmFjdGVycyByZWFkCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGNoYXJhY3RlcnMgcmVhZC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSByZWFkLCBvciAtMSBpZiB0aGlzCi0gICAgICogICAgICAgICA8Y29kZT5SZWFkYWJsZTwvY29kZT4gcmVhY2hlcyBpdHMgZW5kCisgICAgICogICAgICAgICB7QGNvZGUgUmVhZGFibGV9IHJlYWNoZXMgaXRzIGVuZAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzb21lIEkvTyBvcGVyYXRpb25zIGZhaWwKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGludCByZWFkKENoYXJCdWZmZXIgY2IpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVubmFibGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVubmFibGUuamF2YQppbmRleCAyNTc0OWRjLi4yY2NhNzE3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1J1bm5hYmxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9SdW5uYWJsZS5qYXZhCkBAIC0xOSwxNCArMTksMTkgQEAKIAogCiAvKioKLSAqIFRoZSBydW5uYWJsZSBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgY2xhc3NlcyB3aGljaCB3YW50IHRvIGJlCi0gKiBydW4gYXMgdGhyZWFkcy4KKyAqIFJlcHJlc2VudHMgYSBjb21tYW5kIHRoYXQgY2FuIGJlIGV4ZWN1dGVkLiBPZnRlbiB1c2VkIHRvIHJ1biBjb2RlIGluIGEKKyAqIGRpZmZlcmVudCB7QGxpbmsgVGhyZWFkfS4KICAqIAotICogQHNlZSBUaHJlYWQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJ1bm5hYmxlIHsKKwogICAgIC8qKgotICAgICAqIEJlZ2luIGRvaW5nIHRoZSBhY3RpdmUgcGFydCBvZiB0aGUgY2xhc3MnIGNvZGUuCisgICAgICogU3RhcnRzIGV4ZWN1dGluZyB0aGUgYWN0aXZlIHBhcnQgb2YgdGhlIGNsYXNzJyBjb2RlLiBUaGlzIG1ldGhvZCBpcworICAgICAqIGNhbGxlZCB3aGVuIGEgdGhyZWFkIGlzIHN0YXJ0ZWQgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYSBjbGFzcyB3aGljaAorICAgICAqIGltcGxlbWVudHMge0Bjb2RlIFJ1bm5hYmxlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBydW4oKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uLmphdmEKaW5kZXggMzMxNzMyMy4uZTUxOWJmMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uLmphdmEKQEAgLTE3LDUyICsxNyw2MiBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIHN1cGVyY2xhc3Mgb2YgYWxsIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGV4Y2VwdGlvbmFsCi0gKiBjb25kaXRpb25zIHdoaWNoIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBydW5uaW5nIG9mIHRoZSB2aXJ0dWFsIG1hY2hpbmUuCisgKiB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gaXMgdGhlIHN1cGVyY2xhc3Mgb2YgYWxsIGNsYXNzZXMgdGhhdCByZXByZXNlbnQKKyAqIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMgd2hpY2ggb2NjdXIgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIGFuIGFwcGxpY2F0aW9uIGluCisgKiB0aGUgdmlydHVhbCBtYWNoaW5lLiBVbmxpa2UgY2hlY2tlZCBleGNlcHRpb25zIChleGNlcHRpb25zIHdoZXJlIHRoZSB0eXBlCisgKiBkb2Vzbid0IGV4dGVuZCB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gb3Ige0BsaW5rIEVycm9yfSksIHRoZSBjb21waWxlciBkb2VzCisgKiBub3QgcmVxdWlyZSBjb2RlIHRvIGhhbmRsZSBydW50aW1lIGV4Y2VwdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcwMzQ4OTcxOTA3NDU3NjY5MzlMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBSdW50aW1lRXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJ1bnRpbWVFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFJ1bnRpbWVFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UKKyAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrLCBtZXNzYWdlIGFuZAotICAgICAqIGNhdXNlIGZpbGxlZCBpbi4KKyAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFJ1bnRpbWVFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UsCisgICAgICogdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCiAgICAgICogQHBhcmFtIHRocm93YWJsZQotICAgICAqICAgICAgICAgICAgVGhlIGNhdXNlIG9mIHRoaXMgVGhyb3dhYmxlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSwgdGhyb3dhYmxlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIGNhdXNlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFJ1bnRpbWVFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UKKyAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhyb3dhYmxlCi0gICAgICogICAgICAgICAgICBUaGUgY2F1c2Ugb2YgdGhpcyBUaHJvd2FibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUnVudGltZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgICAgIHN1cGVyKHRocm93YWJsZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1J1bnRpbWVQZXJtaXNzaW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1J1bnRpbWVQZXJtaXNzaW9uLmphdmEKaW5kZXggNTEwMmJiYy4uMGY4NTZhMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9SdW50aW1lUGVybWlzc2lvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVudGltZVBlcm1pc3Npb24uamF2YQpAQCAtMjAsNyArMjAsMTEgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKIAogLyoqCi0gKiBSdW50aW1lUGVybWlzc2lvbiBvYmplY3RzIHJlcHJlc2VudCBhY2Nlc3MgdG8gcnVudGltZSBzdXBwb3J0LgorICogUmVwcmVzZW50cyB0aGUgcGVybWlzc2lvbiB0byBleGVjdXRlIGEgcnVudGltZS1yZWxhdGVkIGZ1bmN0aW9uLiBUaGVyZSBpcyBubworICogYWN0aW9uIGxpc3QgYXNzb2NpYXRlZCB3aXRoIGEge0Bjb2RlIFJ1bnRpbWVQZXJtaXNzaW9ufTsgdGhlIHVzZXIgZWl0aGVyIGhhcworICogdGhlIHBlcm1pc3Npb24gb3IgaGUgZG9lc24ndC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lUGVybWlzc2lvbiBleHRlbmRzIEJhc2ljUGVybWlzc2lvbiB7CiAKQEAgLTc1LDI1ICs3OSwyNSBAQAogICAgICAgICAgICAgInNldENvbnRleHRDbGFzc0xvYWRlciIpOyAvLyROT04tTkxTLTEkCiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiAKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAY29kZSBSdW50aW1lUGVybWlzc2lvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb25OYW1lCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSdW50aW1lUGVybWlzc2lvbihTdHJpbmcgcGVybWlzc2lvbk5hbWUpIHsKICAgICAgICAgc3VwZXIocGVybWlzc2lvbk5hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhY3Rpb24gbGlzdC4KLSAgICAgKiBUaGUgYWN0aW9uIGxpc3QgaXMgaWdub3JlZC4KLSAgICAgKiAKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAY29kZSBSdW50aW1lUGVybWlzc2lvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKiBhbmQgYWN0aW9uIGxpc3QuIFRoZSBhY3Rpb24gbGlzdCBpcyBpZ25vcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uLgogICAgICAqIEBwYXJhbSBhY3Rpb25zCi0gICAgICogICAgICAgICAgICBTdHJpbmcgaWdub3JlZC4KKyAgICAgKiAgICAgICAgICAgIGlnbm9yZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJ1bnRpbWVQZXJtaXNzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgYWN0aW9ucykgewogICAgICAgICBzdXBlcihuYW1lLCBhY3Rpb25zKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb24uamF2YQppbmRleCBjZjg3YjgxLi43Mzg3MDg4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbi5qYXZhCkBAIC0xNyw0NiArMTcsNTggQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgc2VjdXJpdHkgbWFuYWdlciBjaGVjayBmYWlscy4KKyAqIFRocm93biB3aGVuIGEgc2VjdXJpdHkgbWFuYWdlciBjaGVjayBmYWlscy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWN1cml0eUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NzgzNjQ5ODM2NzQzOTQxNjdMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTZWN1cml0eUV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZWN1cml0eUV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UKKyAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlY3VyaXR5RXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiA8cD5Db25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHdpdGggYSBtZXNzYWdlIGFuZCBjYXVzZS48L3A+Ci0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYXNzaWduIHRvIHRoaXMgZXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgb3B0aW9uYWwgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb247IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UsCisgICAgICogdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcHRpb25hbCBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2VjdXJpdHlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIDxwPkNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBhIGNhdXNlLjwvcD4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIG9wdGlvbmFsIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgb3B0aW9uYWwgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24sIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlY3VyaXR5RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcigoY2F1c2UgPT0gbnVsbCA/IG51bGwgOiBjYXVzZS50b1N0cmluZygpKSwgY2F1c2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TZWN1cml0eU1hbmFnZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU2VjdXJpdHlNYW5hZ2VyLmphdmEKaW5kZXggZjUwMDczYi4uZGM2MjRlMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TZWN1cml0eU1hbmFnZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1NlY3VyaXR5TWFuYWdlci5qYXZhCkBAIC0xNyw2ICsxNywxMCBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAorLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAoraW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1TdGFjazsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOwpAQCAtMzcsOCArNDEsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uOwogCiAvKioKLSAqIFNlY3VyaXR5TWFuYWdlciBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3NlcyB3aGljaCBjYW4gcHJvdmlkZQotICogc2VjdXJpdHkgdmVyaWZpY2F0aW9uIGZvciBhIHJ1bm5pbmcgcHJvZ3JhbS4KKyAqIFByb3ZpZGVzIHNlY3VyaXR5IHZlcmlmaWNhdGlvbiBmYWNpbGl0aWVzIGZvciBhcHBsaWNhdGlvbnMuIHtAY29kZQorICogU2VjdXJpdHlNYW5hZ2VyfSBjb250YWlucyBhIHNldCBvZiB7QGNvZGUgY2hlY2tYWFh9IG1ldGhvZHMgd2hpY2ggZGV0ZXJtaW5lCisgKiBpZiBpdCBpcyBzYWZlIHRvIHBlcmZvcm0gYSBzcGVjaWZpYyBvcGVyYXRpb24gc3VjaCBhcyBlc3RhYmxpc2hpbmcgbmV0d29yaworICogY29ubmVjdGlvbnMsIG1vZGlmeWluZyBmaWxlcywgYW5kIG1hbnkgbW9yZS4gSW4gZ2VuZXJhbCwgdGhlc2UgbWV0aG9kcyBzaW1wbHkKKyAqIHJldHVybiBpZiB0aGV5IGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb247IGlmIGFuCisgKiBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQsIHRoZW4gdGhleSB0aHJvdyBhIHtAbGluayBTZWN1cml0eUV4Y2VwdGlvbn0uIFRoZQorICogb25seSBleGNlcHRpb24gaXMge0BsaW5rICNjaGVja1RvcExldmVsV2luZG93KE9iamVjdCl9LCB3aGljaCByZXR1cm5zIGEKKyAqIGJvb2xlYW4gdG8gaW5kaWNhdGUgcGVybWlzc2lvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWN1cml0eU1hbmFnZXIgewogCkBAIC01MywxMiArNjUsMTkgQEAKICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgYSBzZWN1cml0eSBjaGVjayBpcyBpbiBwcm9ncmVzcy4KICAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbkNoZWNrOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhlIHtAY29kZSBSdW50aW1lUGVybWlzc2lvbigiY3JlYXRlU2VjdXJpdHlNYW5hZ2VyIil9IGlzIGNoZWNrZWQgaWYgYQorICAgICAqIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2VjdXJpdHlNYW5hZ2VyKCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC03MywxMyArOTIsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gYWNjZXB0IHNvY2tldAorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIGFjY2VwdCBzb2NrZXQKICAgICAgKiBjb25uZWN0aW9ucy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaG9zdAotICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3Qgd2hpY2ggaXMgYXR0ZW1wdGluZyB0byBjb25uZWN0CisgICAgICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0aGF0IGF0dGVtcHRzIHRvIGNvbm5lY3QuCiAgICAgICogQHBhcmFtIHBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaG9zdH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXB0IHNvY2tldAorICAgICAqICAgICAgICAgICAgIGNvbm5lY3Rpb25zIGZyb20ge0Bjb2RlIGhvc3R9IHRocm91Z2gge0Bjb2RlIHBvcnR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrQWNjZXB0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewogICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CkBAIC04OSwxMCArMTE0LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgdGhyZWFkLgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgc3BlY2lmaWVkCisgICAgICogdGhyZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aHJlYWQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aHJlYWQgd2UgYXJlIGF0dGVtcHRpbmcgdG8gbW9kaWZ5CisgICAgICogICAgICAgICAgICB0aGUgdGhyZWFkIHRvIGFjY2Vzcy4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB7QGNvZGUgdGhyZWFkfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0FjY2VzcyhUaHJlYWQgdGhyZWFkKSB7CiAgICAgICAgIC8vIE9ubHkgd29ycnkgYWJvdXQgc3lzdGVtIHRocmVhZHMuIERlYWQgdGhyZWFkcyBoYXZlIGEgbnVsbCBncm91cC4KQEAgLTEwMywxMSArMTMyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgdGhyZWFkIGdyb3VwLgotICAgICAqIAorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgc3BlY2lmaWVkCisgICAgICogdGhyZWFkIGdyb3VwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBncm91cAotICAgICAqICAgICAgICAgICAgdGhlIHRocmVhZCBncm91cCB3ZSBhcmUgYXR0ZW1wdGluZyB0byBtb2RpZnkKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHJlYWQgZ3JvdXAgdG8gYWNjZXNzLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZ3JvdXB9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB7QGNvZGUgZ3JvdXB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrQWNjZXNzKFRocmVhZEdyb3VwIGdyb3VwKSB7CiAgICAgICAgIC8vIE9ubHkgd29ycnkgYWJvdXQgc3lzdGVtIHRocmVhZHMuCkBAIC0xMjAsMTQgKzE1NCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byBlc3RhYmxpc2ggc29ja2V0CisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gZXN0YWJsaXNoIHNvY2tldAogICAgICAqIGNvbm5lY3Rpb25zLiBBIC0xIHBvcnQgaW5kaWNhdGVzIHRoZSBjYWxsZXIgaXMgdHJ5aW5nIHRvIHJlc29sdmUgdGhlCiAgICAgICogaG9zdG5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byBjb25uZWN0IHRvLgorICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gY29ubmVjdCB0by4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgaW50IHRoZSBwb3J0IG51bWJlciB0byBjaGVjaywgb3IgLTEgZm9yIHJlc29sdmUuCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBudW1iZXIgdG8gY2hlY2ssIG9yIC0xIGZvciByZXNvbHZlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaG9zdH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gY29ubmVjdCB0byB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBob3N0fSB0aHJvdWdoIHtAY29kZSBwb3J0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7CiAgICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKQEAgLTE0MSwxOCArMTgxLDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHNlY3VyaXR5IGNvbnRleHQgaXMgYWxsb3dlZCB0byBlc3RhYmxpc2ggc29ja2V0Ci0gICAgICogY29ubmVjdGlvbnMuIEEgLTEgcG9ydCBpbmRpY2F0ZXMgdGhlIGNhbGxlciBpcyB0cnlpbmcgdG8gcmVzb2x2ZSB0aGUKLSAgICAgKiBob3N0bmFtZS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIHNlY3VyaXR5IGNvbnRleHQgaXMgYWxsb3dlZCB0byBlc3RhYmxpc2gKKyAgICAgKiBzb2NrZXQgY29ubmVjdGlvbnMuIEEgLTEgcG9ydCBpbmRpY2F0ZXMgdGhlIGNhbGxlciBpcyB0cnlpbmcgdG8gcmVzb2x2ZQorICAgICAqIHRoZSBob3N0bmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaG9zdAotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIGNvbm5lY3QgdG8uCisgICAgICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEBwYXJhbSBwb3J0Ci0gICAgICogICAgICAgICAgICBpbnQgdGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrLCBvciAtMSBmb3IgcmVzb2x2ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBjaGVjaywgb3IgLTEgZm9yIHJlc29sdmUuCiAgICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIE9iamVjdCB0aGUgc2VjdXJpdHkgY29udGV4dCB0byB1c2UgZm9yIHRoZSBjaGVjay4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWN1cml0eSBjb250ZXh0IHRvIHVzZSBmb3IgdGhlIGNoZWNrLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaG9zdH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY29udGV4dH0gaXMgbm90IGFsbG93ZWQgdG8gY29ubmVjdCB0byB7QGNvZGUgaG9zdH0KKyAgICAgKiAgICAgICAgICAgICB0aHJvdWdoIHtAY29kZSBwb3J0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGlmIChwb3J0ID4gMCkgewogICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKG5ldyBTb2NrZXRQZXJtaXNzaW9uKGhvc3QgKyAnOicgKyBwb3J0LCAiY29ubmVjdCIpLCAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwpAQCAtMTYyLDMyICsyMTMsNDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gY3JlYXRlIGEgY2xhc3MgbG9hZGVyLgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIGNyZWF0ZSBhIGNsYXNzIGxvYWRlci4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBhIGNsYXNzCisgICAgICogICAgICAgICAgICAgbG9hZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIoKSB7CiAgICAgICAgIGNoZWNrUGVybWlzc2lvbihSdW50aW1lUGVybWlzc2lvbi5wZXJtaXNzaW9uVG9DcmVhdGVDbGFzc0xvYWRlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIGRlbGV0ZSB0aGUgZmlsZSBuYW1lZCBieQotICAgICAqIHRoZSBhcmd1bWVudCwgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZCBpbiBjYW5vbmljYWwgZm9ybS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBkZWxldGUgdGhlIGZpbGUgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbmFtZSwgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZCBpbiBjYW5vbmljYWwgZm9ybS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY2hlY2sKLSAgICAgKiAgICAgICAgICAgIAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjYWxsZXIgaXMgbm90IGFsbG93ZWQgdG8KLSAgICAgKiAgICAgICAgIGRlbGV0ZSB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIGRlbGV0ZSB7QGNvZGUgZmlsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tEZWxldGUoU3RyaW5nIGZpbGUpIHsKICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbihmaWxlLCAiZGVsZXRlIikpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgdGhlIHNwZWNpZmllZAorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgdGhlIHNwZWNpZmllZAogICAgICAqIHBsYXRmb3JtIHNwZWNpZmljIGNvbW1hbmQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNtZAotICAgICAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgbGluZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gZXhlY3V0ZSB7QGNvZGUgY21kfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0V4ZWMoU3RyaW5nIGNtZCkgewogICAgICAgICBjaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKG5ldyBGaWxlKGNtZCkuaXNBYnNvbHV0ZSgpID8gY21kCkBAIC0xOTUsMjEgKzI1NCwzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byB0ZXJtaW5hdGUgaXRzZWxmLgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIHRlcm1pbmF0ZSB0aGUgdmlydHVhbAorICAgICAqIG1hY2hpbmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXR1cwotICAgICAqICAgICAgICAgICAgdGhlIHN0YXR1cyB0byByZXR1cm4gZnJvbSB0aGUgZXhpdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgdGhhdCB0aGUgdmlydHVhbCBtYWNoaW5lIHJldHVybnMgd2hlbiBpdCBpcworICAgICAqICAgICAgICAgICAgdGVybWluYXRlZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIHRlcm1pbmF0ZSB0aGUgdmlydHVhbAorICAgICAqICAgICAgICAgICAgIG1hY2hpbmUgd2l0aCB7QGNvZGUgc3RhdHVzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0V4aXQoaW50IHN0YXR1cykgewogICAgICAgICBjaGVja1Blcm1pc3Npb24oUnVudGltZVBlcm1pc3Npb24ucGVybWlzc2lvblRvRXhpdFZNKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gbG9hZCB0aGUgc3BlY2lmaWVkCi0gICAgICogbmF0aXZlIGxpYnJhcnkuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIG5hdGl2ZQorICAgICAqIGxpYnJhcnkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpYk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHRvIGxvYWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHRvIGxvYWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byBsb2FkIHtAY29kZSBsaWJOYW1lfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0xpbmsoU3RyaW5nIGxpYk5hbWUpIHsKICAgICAgICAgaWYgKGxpYk5hbWUgPT0gbnVsbCkgewpAQCAtMjE5LDExICsyODcsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gbGlzdGVuIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBsaXN0ZW4gb24gdGhlIHNwZWNpZmllZAogICAgICAqIHBvcnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBvcnQKLSAgICAgKiAgICAgICAgICAgIGludCB0aGUgcG9ydCBudW1iZXIgdG8gY2hlY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBjaGVjay4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIGxpc3RlbiBvbiB7QGNvZGUgcG9ydH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tMaXN0ZW4oaW50IHBvcnQpIHsKICAgICAgICAgaWYgKHBvcnQgPT0gMCkgewpAQCAtMjM0LDE4ICszMDUsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gYWNjZXNzIG1lbWJlcnMuIFRoZQotICAgICAqIGRlZmF1bHQgaXMgdG8gYWxsb3cgYWNjZXNzIHRvIHB1YmxpYyBtZW1iZXJzIChpLmUuCi0gICAgICogamF2YS5sYW5nLnJlZmxlY3QuUFVCTElDKSBhbmQgdG8gY2xhc3NlcyBsb2FkZWQgYnkgdGhlIHNhbWUgbG9hZGVyIGFzIHRoZQotICAgICAqIG9yaWdpbmFsIGNhbGxlciAoaS5lLiB0aGUgbWV0aG9kIHRoYXQgY2FsbGVkIHRoZSByZWZsZWN0IEFQSSkuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gYWNjZXNzIG1lbWJlcnMuIFRoZQorICAgICAqIGRlZmF1bHQgaXMgdG8gYWxsb3cgYWNjZXNzIHRvIHB1YmxpYyBtZW1iZXJzICh0aGF0IGlzLCB7QGNvZGUKKyAgICAgKiBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXIuUFVCTElDfSkgYW5kIHRvIGNsYXNzZXMgbG9hZGVkIGJ5IHRoZSBzYW1lCisgICAgICogbG9hZGVyIGFzIHRoZSBvcmlnaW5hbCBjYWxsZXIgKHRoYXQgaXMsIHRoZSBtZXRob2QgdGhhdCBjYWxsZWQgdGhlCisgICAgICogcmVmbGVjdCBBUEkpLiBEdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgY2hlY2ssIG92ZXJyaWRpbmcgaW1wbGVtZW50YXRpb25zCisgICAgICogY2Fubm90IGNhbGwge0Bjb2RlIHN1cGVyLmNoZWNrTWVtYmVyQWNjZXNzKCl9IHNpbmNlIHRoZSBzdGFjayB3b3VsZCBubworICAgICAqIGxvbmdlciBiZSBvZiB0aGUgZXhwZWN0ZWQgc2hhcGUuCiAgICAgICogCi0gICAgICogRHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlIGNoZWNrLCBvdmVycmlkaW5nIGltcGxlbWVudGF0aW9ucyBjYW5ub3QgY2FsbAotICAgICAqIHN1cGVyLmNoZWNrTWVtYmVyQWNjZXNzKCkgc2luY2UgdGhlIHN0YWNrIHdvdWxkIG5vIGxvbmdlciBiZSBvZiB0aGUKLSAgICAgKiBleHBlY3RlZCBzaGFwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xzID8KKyAgICAgKiBAcGFyYW0gY2xzCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgb2Ygd2hpY2ggbWVtYmVycyBhcmUgYWNjZXNzZWQuCiAgICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIEVpdGhlciBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXIuUFVCTElDIG9yIERFQ0xBUkVECisgICAgICogICAgICAgICAgICB0aGUgYWNjZXNzIHR5cGUsIGVpdGhlciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlci5QVUJMSUN9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyLkRFQ0xBUkVEfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyBtZW1iZXJzIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGNsc30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tNZW1iZXJBY2Nlc3MoQ2xhc3M8Pz4gY2xzLCBpbnQgdHlwZSkgewogICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKQEAgLTI3Myw4ICszNTAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gam9pbiwgbGVhdmUgb3Igc2VuZCB0byBhCi0gICAgICogbXVsdGljYXN0IGFkZHJlc3MuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgSVAKKyAgICAgKiBtdWx0aWNhc3QgZ3JvdXAgYWRkcmVzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWFkZHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5ldCBncm91cCBhZGRyZXNzIHRvIHVzZS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIHVzZSB7QGNvZGUgbWFkZHJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KEluZXRBZGRyZXNzIG1hZGRyKSB7CiAgICAgICAgIGNoZWNrUGVybWlzc2lvbihuZXcgU29ja2V0UGVybWlzc2lvbihtYWRkci5nZXRIb3N0QWRkcmVzcygpLApAQCAtMjgyLDEwICszNjUsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gam9pbiwgbGVhdmUgb3Igc2VuZCB0byBhCi0gICAgICogbXVsdGljYXN0IGFkZHJlc3MuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgSVAKKyAgICAgKiBtdWx0aWNhc3QgZ3JvdXAgYWRkcmVzcy4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWFkZHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5ldCBncm91cCBhZGRyZXNzIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gdHRsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgaW4gdXNlIGZvciBtdWx0aWNhc3Qgc2VuZC4gVGhpcyBwYXJhbWV0ZXIgaXMKKyAgICAgKiAgICAgICAgICAgIGlnbm9yZWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byB1c2Uge0Bjb2RlIG1hZGRyfS4KICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNjaGVja011bHRpY2FzdChqYXZhLm5ldC5JbmV0QWRkcmVzcyl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBjaGVja011bHRpY2FzdChJbmV0QWRkcmVzcyBtYWRkciwgYnl0ZSB0dGwpIHsKQEAgLTI5NCwxMSArMzg1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWVkCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBzcGVjaWZpZWQKICAgICAgKiBwYWNrYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgYWNjZXNzZWQuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBhY2Nlc3MuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3Mge0Bjb2RlCisgICAgICogICAgICAgICAgICAgcGFja2FnZU5hbWV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrUGFja2FnZUFjY2VzcyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHsKQEAgLTMxMSwxMSArNDA2LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIGRlZmluZSBuZXcgY2xhc3NlcyBpbgotICAgICAqIHRoZSBzcGVjaWZpZWQgcGFja2FnZS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBkZWZpbmUgbmV3IGNsYXNzZXMgaW4gdGhlCisgICAgICogc3BlY2lmaWVkIHBhY2thZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lCiAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBhZGQgYSBjbGFzcyB0by4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBjbGFzc2VzIHRvCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHBhY2thZ2VOYW1lfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1BhY2thZ2VEZWZpbml0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSkgewogICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewpAQCAtMzU4LDMwICs0NTcsNDIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBzeXN0ZW0KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIHN5c3RlbQogICAgICAqIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3Mgc3lzdGVtCisgICAgICogICAgICAgICAgICAgcHJvcGVydGllcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1Byb3BlcnRpZXNBY2Nlc3MoKSB7CiAgICAgICAgIGNoZWNrUGVybWlzc2lvbihSRUFEX1dSSVRFX0FMTF9QUk9QRVJUSUVTX1BFUk1JU1NJT04pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byBhY2Nlc3MgYSBwYXJ0aWN1bGFyCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gYWNjZXNzIGEgcGFydGljdWxhcgogICAgICAqIHN5c3RlbSBwcm9wZXJ0eS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgYWNjZXNzZWQuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYWNjZXNzLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBrZXl9IHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1Byb3BlcnR5QWNjZXNzKFN0cmluZyBrZXkpIHsKICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oa2V5LCAicmVhZCIpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhlIGZpbGUgd2hvc2UKLSAgICAgKiBkZXNjcmlwdG9yIGlzIHRoZSBhcmd1bWVudC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhlIGZpbGUgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmZAotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byByZWFkIGZyb20uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byByZWFkIGZyb20ge0Bjb2RlIGZkfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IgZmQpIHsKICAgICAgICAgaWYgKGZkID09IG51bGwpIHsKQEAgLTM5MSwxMSArNTAyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIHJlYWQgZnJvbSB0aGUgZmlsZSBuYW1lZAotICAgICAqIGJ5IHRoZSBhcmd1bWVudCwgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZCBpbiBjYW5vbmljYWwgZm9ybS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhlIGZpbGUgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZSwgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZCBpbiBjYW5vbmljYWwgZm9ybS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBjaGVjay4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byByZWFkIGZyb20uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byByZWFkIGZyb20ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgZmlsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tSZWFkKFN0cmluZyBmaWxlKSB7CiAgICAgICAgIGNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oZmlsZSwgInJlYWQiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTQwNiwzOSArNTIxLDU2IEBACiAgICAgICogZmlsZSBuYW1lZCBieSB0aGUgYXJndW1lbnQsIHdoaWNoIHNob3VsZCBiZSBwYXNzZWQgaW4gY2Fub25pY2FsIGZvcm0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gY2hlY2suCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gY2hlY2suCiAgICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIE9iamVjdCB0aGUgc2VjdXJpdHkgY29udGV4dCB0byB1c2UgZm9yIHRoZSBjaGVjay4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWN1cml0eSBjb250ZXh0IHRvIHVzZSBmb3IgdGhlIGNoZWNrLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY29udGV4dH0gaXMgbm90IGFsbG93ZWQgdG8gcmVhZCBmcm9tIHtAY29kZSBmaWxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1JlYWQoU3RyaW5nIGZpbGUsIE9iamVjdCBjb250ZXh0KSB7CiAgICAgICAgIGNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oZmlsZSwgInJlYWQiKSwgY29udGV4dCk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gcGVyZm9ybSB0aGUgc2VjdXJpdHkKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSBzZWN1cml0eQogICAgICAqIG9wZXJhdGlvbiBuYW1lZCBieSB0aGUgdGFyZ2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byBwZXJmb3JtCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHRhcmdldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tTZWN1cml0eUFjY2VzcyhTdHJpbmcgdGFyZ2V0KSB7CiAgICAgICAgIGNoZWNrUGVybWlzc2lvbihuZXcgU2VjdXJpdHlQZXJtaXNzaW9uKHRhcmdldCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byBzZXQgdGhlIG5ldCBvYmplY3QKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBzZXQgdGhlIG5ldCBvYmplY3QKICAgICAgKiBmYWN0b3JpZXMuCisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBub3QgYWxsb3dlZCB0byBzZXQgdGhlIG5ldCBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICBmYWN0b3JpZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tTZXRGYWN0b3J5KCkgewogICAgICAgICBjaGVja1Blcm1pc3Npb24oUnVudGltZVBlcm1pc3Npb24ucGVybWlzc2lvblRvU2V0RmFjdG9yeSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIGNyZWF0ZSBhIHRvcCBsZXZlbAotICAgICAqIHdpbmRvdy4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdHJ1c3RlZCB0byBzaG93IHRoZSBzcGVjaWZpZWQgdG9wCisgICAgICogbGV2ZWwgd2luZG93LgogICAgICAqIAogICAgICAqIEBwYXJhbSB3aW5kb3cKLSAgICAgKiAgICAgICAgICAgIFRoZSBub24tbnVsbCB3aW5kb3cgZm9yIHdoaWNoIHRvIGNoZWNrIGFjY2VzcworICAgICAqICAgICAgICAgICAgdGhlIHdpbmRvdyB0byBzaG93LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIHNob3cge0Bjb2RlCisgICAgICogICAgICAgICB3aW5kb3d9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHdpbmRvd30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNoZWNrVG9wTGV2ZWxXaW5kb3coT2JqZWN0IHdpbmRvdykgewogICAgICAgICBpZiAod2luZG93ID09IG51bGwpIHsKQEAgLTQ2Myw4ICs1OTUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcnVubmluZyBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBzeXN0ZW0KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIHN5c3RlbQogICAgICAqIGNsaXBib2FyZC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgc3lzdGVtCisgICAgICogICAgICAgICAgICAgY2xpcGJvYXJkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrU3lzdGVtQ2xpcGJvYXJkQWNjZXNzKCkgewogICAgICAgICB0cnkgewpAQCAtNDg0LDggKzYyMSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIEFXVCBFdmVudAotICAgICAqIHF1ZXVlLiBTaW5jZSB3ZSBkb24ndCBzdXBwb3J0IEFXVCwgdGhlIGFuc3dlciBpcyBuby4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIEFXVCBldmVudAorICAgICAqIHF1ZXVlLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBBV1QgZXZlbnQKKyAgICAgKiAgICAgICAgICAgICBxdWV1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0F3dEV2ZW50UXVldWVBY2Nlc3MoKSB7CiAgICAgICAgIHRyeSB7CkBAIC01MDUsMTggKzY0NywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byBzdGFydCBhIG5ldyBwcmludCBqb2IuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGFsbG93ZWQgdG8gc3RhcnQgYSBuZXcgcHJpbnQgam9iLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gc3RhcnQgYSBuZXcgcHJpbnQKKyAgICAgKiAgICAgICAgICAgICBqb2IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tQcmludEpvYkFjY2VzcygpIHsKICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKFJ1bnRpbWVQZXJtaXNzaW9uLnBlcm1pc3Npb25Ub1F1ZXVlUHJpbnRKb2IpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhlIGZpbGUgd2hvc2UKLSAgICAgKiBkZXNjcmlwdG9yIGlzIHRoZSBhcmd1bWVudC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGUgZmlsZSB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZkCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRvLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gd3JpdGUgdG8ge0Bjb2RlIGZkfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1dyaXRlKEZpbGVEZXNjcmlwdG9yIGZkKSB7CiAgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CkBAIC01MjYsMjIgKzY3NiwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGUgZmlsZSBuYW1lZAotICAgICAqIGJ5IHRoZSBhcmd1bWVudCwgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZCBpbiBjYW5vbmljYWwgZm9ybS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGUgZmlsZSB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCBuYW1lLCB3aGljaCBzaG91bGQgYmUgcGFzc2VkIGluIGNhbm9uaWNhbCBmb3JtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIHdyaXRlIHRvLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgbm90IGFsbG93ZWQgdG8gd3JpdGUgdG8gCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGZpbGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrV3JpdGUoU3RyaW5nIGZpbGUpIHsKICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbihmaWxlLCAid3JpdGUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlY3VyaXR5IG1hbmFnZXIgaXMgY3VycmVudGx5IGNoZWNraW5nIHNvbWV0aGluZy4KKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBzZWN1cml0eSBtYW5hZ2VyIGlzIGN1cnJlbnRseSBjaGVja2luZyBzb21ldGhpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgd2UgYXJlIGFyZSBpbiBhIHNlY3VyaXR5IGNoZWNrIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzZWN1cml0eSBtYW5hZ2VyIGlzIGV4ZWN1dGluZyBhIHNlY3VyaXR5CisgICAgICogICAgICAgICBjaGVjayBtZXRob2Q7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2NoZWNrUGVybWlzc2lvbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbkNoZWNrKCkgewpAQCAtNTQ5LDI0ICs3MDQsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgb25lIGVudHJ5IGZvciBlYWNoIG1ldGhvZCBpbiB0aGUgc3RhY2suIEVhY2gKLSAgICAgKiBlbnRyeSBpcyB0aGUgamF2YS5sYW5nLkNsYXNzIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNsYXNzIGluIHdoaWNoIHRoZQotICAgICAqIG1ldGhvZCBpcyBkZWZpbmVkLgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBvbmUgZW50cnkgZm9yIGVhY2ggbWV0aG9kIGluIHRoZSBjdXJyZW50CisgICAgICogZXhlY3V0aW9uIHN0YWNrLiBFYWNoIGVudHJ5IGlzIHRoZSB7QGNvZGUgamF2YS5sYW5nLkNsYXNzfSB3aGljaAorICAgICAqIHJlcHJlc2VudHMgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVmaW5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENsYXNzW10gYWxsIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBzdGFjay4KKyAgICAgKiBAcmV0dXJuIGFsbCBjbGFzc2VzIGluIHRoZSBleGVjdXRpb24gc3RhY2suCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHJvdGVjdGVkIENsYXNzW10gZ2V0Q2xhc3NDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gQ2xhc3MuZ2V0U3RhY2tDbGFzc2VzKC0xLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBWTVN0YWNrLmdldENsYXNzZXMoLTEsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIGZpcnN0IGNsYXNzIGluIHRoZSBzdGFjayB3aG9zZSBjbGFzcwotICAgICAqIGxvYWRlciBpcyBub3QgYSBzeXN0ZW0gY2xhc3MgbG9hZGVyLgorICAgICAqIFJldHVybnMgdGhlIGNsYXNzIGxvYWRlciBvZiB0aGUgZmlyc3QgY2xhc3MgaW4gdGhlIGV4ZWN1dGlvbiBzdGFjayB3aG9zZQorICAgICAqIGNsYXNzIGxvYWRlciBpcyBub3QgYSBzeXN0ZW0gY2xhc3MgbG9hZGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQ2xhc3NMb2FkZXIgdGhlIG1vc3QgcmVjZW50IG5vbi1zeXN0ZW0gY2xhc3MgbG9hZGVyLgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2NoZWNrUGVybWlzc2lvbn0KKyAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBub24tc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGN1cnJlbnRDbGFzc0xvYWRlcigpIHsKQEAgLTU5NywxMyArNzUzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIHN0YWNrIG9mIHRocmVlIGZpcnN0IGNsYXNzIHdob3NlIGNsYXNzIGxvYWRlciBpcwotICAgICAqIG5vdCBhIHN5c3RlbSBjbGFzcyBsb2FkZXIuCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIGNhbGwgc3RhY2sgb2YgdGhlIGZpcnN0IGNsYXNzIHdob3NlIGNsYXNzIGxvYWRlcgorICAgICAqIGlzIG5vdCBhIHN5c3RlbSBjbGFzcyBsb2FkZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIGZyYW1lIGluZGV4IG9mIHRoZSBmaXJzdCBtZXRob2Qgd2hvc2UgY2xhc3Mgd2FzIGxvYWRlZCBieQotICAgICAqICAgICAgICAgYSBub24tc3lzdGVtIGNsYXNzIGxvYWRlci4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259CisgICAgICogQHJldHVybiB0aGUgZnJhbWUgaW5kZXggb2YgdGhlIGZpcnN0IG1ldGhvZCB3aG9zZSBjbGFzcyB3YXMgbG9hZGVkIGJ5IGEKKyAgICAgKiAgICAgICAgIG5vbi1zeXN0ZW0gY2xhc3MgbG9hZGVyLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2NoZWNrUGVybWlzc2lvbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgaW50IGNsYXNzTG9hZGVyRGVwdGgoKSB7CkBAIC02MzMsMTIgKzc4OSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNsYXNzIGluIHRoZSBzdGFjayB3aGljaCB3YXMgbG9hZGVkIGJ5IGEgY2xhc3MgbG9hZGVyCi0gICAgICogd2hpY2ggaXMgbm90IGEgc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBjbGFzcyBpbiB0aGUgY2FsbCBzdGFjayB0aGF0IHdhcyBsb2FkZWQgYnkgYSBjbGFzcworICAgICAqIGxvYWRlciB3aGljaCBpcyBub3QgYSBzeXN0ZW0gY2xhc3MgbG9hZGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQ2xhc3MgdGhlIG1vc3QgcmVjZW50IGNsYXNzIGxvYWRlZCBieSBhIG5vbi1zeXN0ZW0gY2xhc3MgbG9hZGVyLgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2NoZWNrUGVybWlzc2lvbn0KKyAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBjbGFzcyBsb2FkZWQgYnkgYSBub24tc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIENsYXNzPD8+IGN1cnJlbnRMb2FkZWRDbGFzcygpIHsKQEAgLTY2OCwxNSArODI0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIHN0YWNrIG9mIHRoZSBmaXJzdCBtZXRob2Qgd2hpY2ggaXMgY29udGFpbmVkIGluCi0gICAgICogYSBjbGFzcyBjYWxsZWQgPGNvZGU+bmFtZTwvY29kZT4uIElmIG5vIG1ldGhvZHMgZnJvbSB0aGlzIGNsYXNzIGFyZSBpbgotICAgICAqIHRoZSBzdGFjaywgcmV0dXJuIC0xLgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IGluIHRoZSBjYWxsIHN0YWNrIG9mIHRoZSBmaXJzdCBtZXRob2Qgd2hpY2ggaXMKKyAgICAgKiBjb250YWluZWQgaW4gdGhlIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBSZXR1cm5zIC0xIGlmIG5vIG1ldGhvZHMKKyAgICAgKiBmcm9tIHRoaXMgY2xhc3MgYXJlIGluIHRoZSBzdGFjay4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIGludCB0aGUgZGVwdGggaW4gdGhlIHN0YWNrIG9mIGEgdGhlIGZpcnN0IG1ldGhvZCBmb3VuZC4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gbG9vayBmb3IuCisgICAgICogQHJldHVybiB0aGUgZnJhbWUgaW5kZXggb2YgdGhlIGZpcnN0IG1ldGhvZCBmb3VuZCBpcyBjb250YWluZWQgaW4gdGhlCisgICAgICogICAgICAgICBjbGFzcyBpZGVudGlmaWVkIGJ5IHtAY29kZSBuYW1lfS4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGludCBjbGFzc0RlcHRoKFN0cmluZyBuYW1lKSB7CkBAIC02OTAsMTQgKzg0NywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIG1ldGhvZCBvbiB0aGUgc3RhY2sgZnJvbSB0aGUgc3BlY2lmaWVkIGNsYXNzLAotICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgaXMgYSBtZXRob2QgaW4gdGhlIGNhbGwgc3RhY2sgZnJvbSB0aGUgY2xhc3Mgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB3ZSBhcmUgcnVubmluZyBhIG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY2hlY2tQZXJtaXNzaW9ufQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgbWV0aG9kIGZyb20gdGhlIGNsYXNzIGlkZW50aWZpZWQgYnkge0Bjb2RlCisgICAgICogICAgICAgICBuYW1lfSBpcyBleGVjdXRpbmc7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2NoZWNrUGVybWlzc2lvbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbkNsYXNzKFN0cmluZyBuYW1lKSB7CkBAIC03MDUsMTIgKzg2MywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIG1ldGhvZCBvbiB0aGUgc3RhY2sgZnJvbSBhIGNsYXNzIHdoaWNoIHdhcwotICAgICAqIGRlZmluZWQgYnkgYSBub24tc3lzdGVtIGNsYXNzbG9hZGVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGlzIGEgbWV0aG9kIGluIHRoZSBjYWxsIHN0YWNrIGZyb20gYSBjbGFzcyB3aGljaAorICAgICAqIHdhcyBkZWZpbmVkIGJ5IGEgbm9uLXN5c3RlbSBjbGFzcyBsb2FkZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSBtZXRob2QgZnJvbSBhIGNsYXNzIHRoYXQgd2FzIGRlZmluZWQgYnkgYQorICAgICAqICAgICAgICAgbm9uLXN5c3RlbSBjbGFzcyBsb2FkZXIgaXMgZXhlY3V0aW5nOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjaGVja1Blcm1pc3Npb259CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbkNsYXNzTG9hZGVyKCkgewpAQCAtNzIyLDcgKzg4MSw4IEBACiAgICAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgdGhyZWFkIGdyb3VwIG9mIHRoZSB0aHJlYWQgcnVubmluZwogICAgICAqIHRoaXMgbWV0aG9kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhyZWFkR3JvdXAgVGhlIHRocmVhZCBncm91cCB0byBjcmVhdGUgbmV3IHRocmVhZHMgaW4uCisgICAgICogQHJldHVybiBUaHJlYWRHcm91cCB0aGUgdGhyZWFkIGdyb3VwIHRvIGNyZWF0ZSBuZXcgdGhyZWFkcyBpbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyZWFkR3JvdXAgZ2V0VGhyZWFkR3JvdXAoKSB7CiAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFRocmVhZEdyb3VwKCk7CkBAIC03MzAsMTggKzg5MCwyNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggZW5jYXBzdWxhdGVzIHRoZSBzZWN1cml0eSBzdGF0ZSBvZiB0aGUgY3VycmVudAotICAgICAqIHBvaW50IGluIHRoZSBleGVjdXRpb24uIEluIG91ciBjYXNlLCB0aGlzIGlzIGFuIEFjY2Vzc0NvbnRyb2xDb250ZXh0LgorICAgICAqIHBvaW50IGluIHRoZSBleGVjdXRpb24uIEluIHRoZSBBbmRyb2lkIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgdGhpcyBpcworICAgICAqIGFuIHtAbGluayBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VjdXJpdHlDb250ZXh0KCkgewogICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UKLSAgICAgKiBiZWluZyBndWFyZGVkIGJ5IHRoZSBnaXZlbiBQZXJtaXNzaW9uIGFyZ3VtZW50LgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UgYmVpbmcKKyAgICAgKiBndWFyZGVkIGJ5IHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBjaGVjay4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCB7QGNvZGUgcGVybWlzc2lvbn0gaXMgZGVuaWVkIGFjY29yZGluZyB0bworICAgICAqICAgICAgICAgICAgIHRoZSBjdXJyZW50IHNlY3VyaXR5IHBvbGljeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CiAgICAgICAgIHRyeSB7CkBAIC03NTMsMTEgKzkyMiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBydW5uaW5nIHByb2dyYW0gaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIHJlc291cmNlCi0gICAgICogYmVpbmcgZ3VhcmRlZCBieSB0aGUgZ2l2ZW4gUGVybWlzc2lvbiBhcmd1bWVudC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIHNlY3VyaXR5IGNvbnRleHQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlCisgICAgICogcmVzb3VyY2UgYmVpbmcgZ3VhcmRlZCBieSB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uCi0gICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2suCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWN1cml0eSBjb250ZXh0IGZvciB3aGljaCB0byBjaGVjayBwZXJtaXNzaW9uLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY29udGV4dH0gaXMgbm90IGFuIGluc3RhbmNlIG9mIHtAY29kZQorICAgICAqICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0fSBvciBpZiB0aGUgcmVxdWVzdGVkIHtAY29kZSBwZXJtaXNzaW9ufQorICAgICAqICAgICAgICAgICAgIGlzIGRlbmllZCBmb3Ige0Bjb2RlIGNvbnRleHR9IGFjY29yZGluZyB0byB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgIHNlY3VyaXR5IHBvbGljeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uLCBPYmplY3QgY29udGV4dCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TaG9ydC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TaG9ydC5qYXZhCmluZGV4IDk3ZDYwYTAuLmNmOTVkMjIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU2hvcnQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Nob3J0LmphdmEKQEAgLTE4LDEyICsxOCwxMCBAQAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogPHA+Ci0gKiBTaG9ydCBpcyB0aGUgd3JhcHBlciBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlIDxjb2RlPnNob3J0PC9jb2RlPi4KLSAqIDwvcD4KKyAqIFRoZSB3cmFwcGVyIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUge0Bjb2RlIHNob3J0fS4KICAqIAogICogQHNlZSBqYXZhLmxhbmcuTnVtYmVyCi0gKiBAc2luY2UgMS4xCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNob3J0IGV4dGVuZHMgTnVtYmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxTaG9ydD4gewogCkBAIC0zNSwzMSArMzMsMzIgQEAKICAgICBwcml2YXRlIGZpbmFsIHNob3J0IHZhbHVlOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBtYXhpbXVtIDxjb2RlPnNob3J0PC9jb2RlPiB2YWx1ZSwgMjxzdXA+MTU8L3N1cD4tMS4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RhbnQgZm9yIHRoZSBtYXhpbXVtIHtAY29kZSBzaG9ydH0gdmFsdWUsIDI8c3VwPjE1PC9zdXA+LTEuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNQVhfVkFMVUUgPSAoc2hvcnQpIDB4N0ZGRjsKIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0YW50IGZvciB0aGUgbWluaW11bSA8Y29kZT5zaG9ydDwvY29kZT4gdmFsdWUsIC0yPHN1cD4xNTwvc3VwPi4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RhbnQgZm9yIHRoZSBtaW5pbXVtIHtAY29kZSBzaG9ydH0gdmFsdWUsIC0yPHN1cD4xNTwvc3VwPi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE1JTl9WQUxVRSA9IChzaG9ydCkgMHg4MDAwOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBudW1iZXIgb2YgYml0cyB0byByZXByZXNlbnQgYSA8Y29kZT5zaG9ydDwvY29kZT4gaW4KLSAgICAgKiB0d28ncyBjb21wbGltZW50IGZvcm0uCi0gICAgICogPC9wPgorICAgICAqIENvbnN0YW50IGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCBhIHtAY29kZSBzaG9ydH0gaW4KKyAgICAgKiB0d28ncyBjb21wbGVtZW50IGZvcm0uCiAgICAgICogCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSAxNjsKIAogICAgIC8qKgotICAgICAqIFRoZSBqYXZhLmxhbmcuQ2xhc3MgdGhhdCByZXByZXNlbnRzIHRoaXMgY2xhc3MuCisgICAgICogVGhlIHtAbGluayBDbGFzc30gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcHJpbWl0aXZlIHR5cGUge0Bjb2RlIAorICAgICAqIHNob3J0fS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFNob3J0PiBUWVBFID0gKENsYXNzPFNob3J0PikgbmV3IHNob3J0WzBdCkBAIC03MCw2OCArNjksNjUgQEAKIAogICAgIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBhIHN0cmluZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTaG9ydH0gZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNob3J0IHF1YW50aXR5LgotICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYSBzaG9ydCBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzaG9ydCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHJpbmd9IGNhbiBub3QgYmUgZGVjb2RlZCBpbnRvIGEgc2hvcnQgdmFsdWUuCisgICAgICogQHNlZSAjcGFyc2VTaG9ydChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNob3J0KFN0cmluZyBzdHJpbmcpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewogICAgICAgICB0aGlzKHBhcnNlU2hvcnQoc3RyaW5nKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgc2hvcnQKLSAgICAgKiB2YWx1ZWQgYXJndW1lbnQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU2hvcnR9IHdpdGggdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgc2hvcnQgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdG8gc3RvcmUgaW4gdGhlIG5ldyBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltaXRpdmUgc2hvcnQgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIG5ldyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2hvcnQoc2hvcnQgdmFsdWUpIHsKICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ5dGUgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJ5dGUgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CiAgICAgICAgIHJldHVybiAoYnl0ZSkgdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29tcGFyZXMgdGhpcyA8Y29kZT5TaG9ydDwvY29kZT4gdG8gdGhlIDxjb2RlPlNob3J0PC9jb2RlPgotICAgICAqIHBhc3NlZC4gSWYgdGhpcyBpbnN0YW5jZSdzIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGUgaW5zdGFuY2UKLSAgICAgKiBwYXNzZWQsIHRoZW4gMCBpcyByZXR1cm5lZC4gSWYgdGhpcyBpbnN0YW5jZSdzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUKLSAgICAgKiB2YWx1ZSBvZiB0aGUgaW5zdGFuY2UgcGFzc2VkLCB0aGVuIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuIElmIHRoaXMKLSAgICAgKiBpbnN0YW5jZSdzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlIHBhc3NlZCwgdGhlbiBhCi0gICAgICogcG9zaXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgorICAgICAqIENvbXBhcmVzIHRoaXMgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgc2hvcnQgb2JqZWN0IHRvIGRldGVybWluZSB0aGVpcgorICAgICAqIHJlbGF0aXZlIG9yZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIGluc3RhbmNlIHRvIGNvbXBhcmUgdG8uCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS4yCisgICAgICogQHBhcmFtIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IG9iamVjdCB0byBjb21wYXJlIHRoaXMgb2JqZWN0IHRvLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBzaG9ydCBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogICAgICAgICB2YWx1ZSBvZiB7QGNvZGUgb2JqZWN0fTsgMCBpZiB0aGUgdmFsdWUgb2YgdGhpcyBzaG9ydCBhbmQgdGhlCisgICAgICogICAgICAgICB2YWx1ZSBvZiB7QGNvZGUgb2JqZWN0fSBhcmUgZXF1YWw7IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhlIHZhbHVlCisgICAgICogICAgICAgICBvZiB0aGlzIHNob3J0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2Yge0Bjb2RlIG9iamVjdH0uCisgICAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFNob3J0IG9iamVjdCkgewogICAgICAgICByZXR1cm4gdmFsdWUgPiBvYmplY3QudmFsdWUgPyAxIDogKHZhbHVlIDwgb2JqZWN0LnZhbHVlID8gLTEgOiAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHN0cmluZyBhcmd1bWVudCBhcyBpZiBpdCB3YXMgYSBzaG9ydCB2YWx1ZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQuIFRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYW4KLSAgICAgKiBpbnQgcXVhbnRpdHkuIFRoZSBzdHJpbmcgbWF5IGJlIGEgaGV4YWRlY2ltYWwgKCIweC4uLiIpLCBvY3RhbCAoIjAuLi4iKSwKLSAgICAgKiBvciBkZWNpbWFsICgiLi4uIikgcmVwcmVzZW50YXRpb24gb2YgYSBieXRlLgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJucyBhIHtAY29kZSBTaG9ydH0gaW5zdGFuY2UgaWYgdGhlCisgICAgICogc3RyaW5nIGNhbiBiZSBkZWNvZGVkIGludG8gYSBzaG9ydCB2YWx1ZS4gVGhlIHN0cmluZyBtYXkgYmUgYW4gb3B0aW9uYWwKKyAgICAgKiBtaW51cyBzaWduICItIiBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsICgiMHguLi4iIG9yICIjLi4uIiksIG9jdGFsCisgICAgICogKCIwLi4uIiksIG9yIGRlY2ltYWwgKCIuLi4iKSByZXByZXNlbnRhdGlvbiBvZiBhIHNob3J0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2hvcnQgcXVhbnRpdHkuCi0gICAgICogQHJldHVybiBTaG9ydCB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhIHNob3J0IHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzaG9ydCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNob3J0fSBjb250YWluaW5nIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieQorICAgICAqICAgICAgICAge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIHNob3J0IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2hvcnQgZGVjb2RlKFN0cmluZyBzdHJpbmcpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewogICAgICAgICBpbnQgaW50VmFsdWUgPSBJbnRlZ2VyLmRlY29kZShzdHJpbmcpLmludFZhbHVlKCk7CkBAIC0xNDIsMjggKzEzOCwyMSBAQAogICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG91YmxlIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBkb3VibGUgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudAotICAgICAqIHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyBjYXNlLCB0aGUgYXJndW1lbnQgbXVzdCBhbHNvIGJlIGEgU2hvcnQsIGFuZCB0aGUgcmVjZWl2ZXIgYW5kCi0gICAgICogYXJndW1lbnQgbXVzdCByZXByZXNlbnQgdGhlIHNhbWUgc2hvcnQgdmFsdWUuCisgICAgICogQ29tcGFyZXMgdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBpbmRpY2F0ZXMgaWYgdGhleQorICAgICAqIGFyZSBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvYmplY3R9IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiB7QGNvZGUgU2hvcnR9IGFuZCBoYXZlIHRoZSBzYW1lIHNob3J0IHZhbHVlIGFzIHRoaXMgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0Ci0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBvYmplY3QKLSAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgc2hvcnQgd2l0aC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgU2hvcnR9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtMTcxLDc4ICsxNjAsNTggQEAKICAgICAgICAgICAgICAgICAmJiAodmFsdWUgPT0gKChTaG9ydCkgb2JqZWN0KS52YWx1ZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmxvYXQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZsb2F0IHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gb2JqZWN0cyB3aGljaAotICAgICAqIGFuc3dlciA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbnQgdmFsdWUgd2hpY2ggdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb25nIHZhbHVlIHdoaWNoIHRoZSByZWNlaXZlciByZXByZXNlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBsb25nIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgYXMgaWYgaXQgd2FzIGEgc2hvcnQgdmFsdWUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGFuCi0gICAgICogc2hvcnQgcXVhbnRpdHkuCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEgc2lnbmVkIGRlY2ltYWwgc2hvcnQgdmFsdWUuIFRoZSBBU0NJSQorICAgICAqIGNoYXJhY3RlciBcdTAwMmQgKCctJykgaXMgcmVjb2duaXplZCBhcyB0aGUgbWludXMgc2lnbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNob3J0IHF1YW50aXR5LgotICAgICAqIEByZXR1cm4gc2hvcnQgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBhcmd1bWVudAotICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYSBzaG9ydCBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzaG9ydCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgc2hvcnQgdmFsdWUgcmVwcmVzZW50ZWQgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBzaG9ydCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHNob3J0IHBhcnNlU2hvcnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBwYXJzZVNob3J0KHN0cmluZywgMTApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IGFzIGlmIGl0IHdhcyBhIHNob3J0IHZhbHVlIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlc3VsdC4gVGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhCi0gICAgICogc2luZ2xlIHNob3J0IHF1YW50aXR5LiBUaGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggdG8gdXNlCi0gICAgICogd2hlbiBwYXJzaW5nIHRoZSB2YWx1ZS4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBzaWduZWQgc2hvcnQgdmFsdWUgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIHJhZGl4LiBUaGUgQVNDSUkgY2hhcmFjdGVyIFx1MDAyZCAoJy0nKSBpcyByZWNvZ25pemVkIGFzIHRoZSBtaW51cyBzaWduLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2hvcnQgcXVhbnRpdHkuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2hvcnQgdmFsdWUuCiAgICAgICogQHBhcmFtIHJhZGl4CiAgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdG8gdXNlIHdoZW4gcGFyc2luZy4KLSAgICAgKiBAcmV0dXJuIHNob3J0IHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgYXJndW1lbnQKLSAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgc2hvcnQgcXVhbnRpdHkuCisgICAgICogQHJldHVybiB0aGUgcHJpbWl0aXZlIHNob3J0IHZhbHVlIHJlcHJlc2VudGVkIGJ5IHtAY29kZSBzdHJpbmd9IHVzaW5nCisgICAgICogICAgICAgICB7QGNvZGUgcmFkaXh9LgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gaXMge0Bjb2RlIG51bGx9IG9yIGhhcyBhIGxlbmd0aCBvZiB6ZXJvLAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVh9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVh9LCBvciBpZiB7QGNvZGUgc3RyaW5nfQorICAgICAqICAgICAgICAgICAgIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgc2hvcnQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBzaG9ydCBwYXJzZVNob3J0KFN0cmluZyBzdHJpbmcsIGludCByYWRpeCkKICAgICAgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewpAQCAtMjU1LDIxICsyMjQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaG9ydCB2YWx1ZSB3aGljaCB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cworICAgICAqIEdldHMgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiB0aGlzIHNob3J0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gc2hvcnQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0J3MgcHJpbWl0aXZlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKQEAgLTI3Nyw0NCArMjQxLDUxIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiBhcmd1bWVudC4KKyAgICAgKiBzcGVjaWZpZWQgc2hvcnQgdmFsdWUgd2l0aCByYWRpeCAxMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHNob3J0IHRoZSBzaG9ydCB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gU3RyaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgc2hvcnQuCisgICAgICogICAgICAgICAgICAgdGhlIHNob3J0IHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdmFsdWV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKHNob3J0IHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHN0cmluZyBhcmd1bWVudCBhcyBpZiBpdCB3YXMgYSBzaG9ydCB2YWx1ZSBhbmQgcmV0dXJucyBhIFNob3J0Ci0gICAgICogcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuIFRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBkb2VzCi0gICAgICogbm90IHJlcHJlc2VudCBhIHNpbmdsZSBzaG9ydCBxdWFudGl0eS4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBzaWduZWQgZGVjaW1hbCBzaG9ydCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNob3J0IHF1YW50aXR5LgotICAgICAqIEByZXR1cm4gU2hvcnQgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBhcmd1bWVudAotICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYSBzaG9ydCBxdWFudGl0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzaG9ydCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNob3J0fSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBzaG9ydCB2YWx1ZSByZXByZXNlbnRlZAorICAgICAqICAgICAgICAgYnkge0Bjb2RlIHN0cmluZ30uCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RyaW5nfSBpcyB7QGNvZGUgbnVsbH0sIGhhcyBhIGxlbmd0aCBvZiB6ZXJvIG9yCisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYSBzaG9ydCB2YWx1ZS4KKyAgICAgKiBAc2VlICNwYXJzZVNob3J0KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNob3J0IHZhbHVlT2YoU3RyaW5nIHN0cmluZykgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiB2YWx1ZU9mKHBhcnNlU2hvcnQoc3RyaW5nKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgYXMgaWYgaXQgd2FzIGEgc2hvcnQgdmFsdWUgYW5kIHJldHVybnMgYSBTaG9ydAotICAgICAqIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LiBUaHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lcwotICAgICAqIG5vdCByZXByZXNlbnQgYSBzaG9ydCBxdWFudGl0eS4gVGhlIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHJhZGl4Ci0gICAgICogdG8gdXNlIHdoZW4gcGFyc2luZyB0aGUgdmFsdWUuCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEgc2lnbmVkIHNob3J0IHZhbHVlIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNob3J0IHF1YW50aXR5LgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNob3J0IHZhbHVlLgogICAgICAqIEBwYXJhbSByYWRpeAogICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHRvIHVzZSB3aGVuIHBhcnNpbmcuCi0gICAgICogQHJldHVybiBTaG9ydCB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhIHNob3J0IHF1YW50aXR5LgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgU2hvcnR9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIHNob3J0IHZhbHVlIHJlcHJlc2VudGVkCisgICAgICogICAgICAgICBieSB7QGNvZGUgc3RyaW5nfSB1c2luZyB7QGNvZGUgcmFkaXh9LgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0cmluZ30gaXMge0Bjb2RlIG51bGx9IG9yIGhhcyBhIGxlbmd0aCBvZiB6ZXJvLAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVh9LAorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVh9LCBvciBpZiB7QGNvZGUgc3RyaW5nfQorICAgICAqICAgICAgICAgICAgIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgc2hvcnQgdmFsdWUuCisgICAgICogQHNlZSAjcGFyc2VTaG9ydChTdHJpbmcsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNob3J0IHZhbHVlT2YoU3RyaW5nIHN0cmluZywgaW50IHJhZGl4KQogICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CkBAIC0zMjIsMTMgKzI5MywxMiBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXZlcnNlcyB0aGUgYnl0ZXMgb2YgYSA8Y29kZT5zaG9ydDwvY29kZT4uCi0gICAgICogPC9wPgorICAgICAqIFJldmVyc2VzIHRoZSBieXRlcyBvZiB0aGUgc3BlY2lmaWVkIHNob3J0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIFRoZSA8Y29kZT5zaG9ydDwvY29kZT4gdG8gcmV2ZXJzZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXZlcnNlZCB2YWx1ZS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB2YWx1ZSBmb3Igd2hpY2ggdG8gcmV2ZXJzZSBieXRlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXZlcnNlZCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHNob3J0IHJldmVyc2VCeXRlcyhzaG9ydCBzKSB7CiAgICAgICAgIGludCBoaWdoID0gKHMgPj4gOCkgJiAweEZGOwpAQCAtMzM3LDE1ICszMDcsMTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIFNob3J0fSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBzaG9ydCB2YWx1ZS4KICAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U2hvcnQ8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgPGNvZGU+c2hvcnQ8L2NvZGU+Ci0gICAgICogdmFsdWUgcGFzc2VkLiBUaGlzIG1ldGhvZCBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgY29uc3RydWN0b3IsIGFzIHRoaXMKLSAgICAgKiBtZXRob2QgbWF5IG1haW50YWluIGEgY2FjaGUgb2YgaW5zdGFuY2VzLgorICAgICAqIElmIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZ2V0IGEgbmV3IHtAY29kZSBTaG9ydH0gaW5zdGFuY2UsIGl0IGlzCisgICAgICogcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yLCBzaW5jZSBpdAorICAgICAqIG1haW50YWlucyBhIGNhY2hlIG9mIGluc3RhbmNlcyB3aGljaCBtYXkgcmVzdWx0IGluIGJldHRlciBwZXJmb3JtYW5jZS4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIHMgVGhlIHNob3J0IHZhbHVlLgotICAgICAqIEByZXR1cm4gQSA8Y29kZT5TaG9ydDwvY29kZT4gaW5zdGFuY2UuCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgU2hvcnR9IGluc3RhbmNlIGNvbnRhaW5pbmcge0Bjb2RlIHN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2hvcnQgdmFsdWVPZihzaG9ydCBzKSB7CiAgICAgICAgIGlmIChzIDwgLTEyOCB8fCBzID4gMTI3KSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0YWNrT3ZlcmZsb3dFcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdGFja092ZXJmbG93RXJyb3IuamF2YQppbmRleCA5NDBlZGYxLi5kZDYzYjZiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0YWNrT3ZlcmZsb3dFcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RhY2tPdmVyZmxvd0Vycm9yLmphdmEKQEAgLTE3LDMwICsxNywzNSBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIGRlcHRoIG9mIHRoZSBjYWxsc3RhY2sgb2YgdGhlIHJ1bm5pbmcgcHJvZ3JhbQotICogZXhjZWRlcyBzb21lIHBsYXRmb3JtIG9yIHZpcnR1YWwgbWFjaGluZSBzcGVjaWZpYyBsaW1pdC4gVHlwaWNhbGx5LCB0aGlzIHdpbGwKLSAqIG9jY3VyIG9ubHkgd2hlbiBhIHByb2dyYW0gYmVjb21lcyBpbmZpbml0ZWx5IHJlY3Vyc2l2ZSwgYnV0IGNhbiBvY2N1ciBpbgorICogVGhyb3duIHdoZW4gdGhlIGRlcHRoIG9mIHRoZSBjYWxsc3RhY2sgb2YgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBleGNlZGVzIHNvbWUKKyAqIHBsYXRmb3JtIG9yIHZpcnR1YWwgbWFjaGluZSBzcGVjaWZpYyBsaW1pdC4gVHlwaWNhbGx5LCB0aGlzIHdpbGwgb2NjdXIgb25seQorICogd2hlbiBhIHByb2dyYW0gYmVjb21lcyBpbmZpbml0ZWx5IHJlY3Vyc2l2ZSwgYnV0IGl0IGNhbiBhbHNvIG9jY3VyIGluCiAgKiBjb3JyZWN0bHkgd3JpdHRlbiAoYnV0IGRlZXBseSByZWN1cnNpdmUpIHByb2dyYW1zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFN0YWNrT3ZlcmZsb3dFcnJvciBleHRlbmRzIGphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg2MDkxNzUwMzg0NDE3NTk2MDdMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdGFja092ZXJmbG93RXJyb3J9IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RhY2tPdmVyZmxvd0Vycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdGFja092ZXJmbG93RXJyb3J9IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UKKyAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0YWNrT3ZlcmZsb3dFcnJvcihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaWN0TWF0aC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpY3RNYXRoLmphdmEKaW5kZXggMTBlOGY4Ni4uNjZlNDc3MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpY3RNYXRoLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpY3RNYXRoLmphdmEKQEAgLTE3LDIyICsxNyw0MyBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKy8vIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogCiAvKioKLSAqIENsYXNzIFN0cmljdE1hdGggcHJvdmlkZXMgdmFyaW91cyBudW1lcmljIG9wZXJhdGlvbnMgdXNpbmcgdGhlIHN0YW5kYXJkcyBzZXQKLSAqIGJ5IHRoZSBrbm93biAiRnJlZWx5IERpc3RyaWJ1dGFibGUgTWF0aCBMaWJyYXJ5IiAoZmRsaWJtKS4gVGhlIHN0YW5kYXJkIGlzCi0gKiBzZXQgYnkgdGhlIEphbnVhcnkgNHRoLCAxOTk1IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisgKiBDbGFzcyBTdHJpY3RNYXRoIHByb3ZpZGVzIGJhc2ljIG1hdGggY29uc3RhbnRzIGFuZCBvcGVyYXRpb25zIHN1Y2ggYXMKKyAqIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLCBoeXBlcmJvbGljIGZ1bmN0aW9ucywgZXhwb25lbnRpYWwsIGxvZ2FyaXRobXMsIGV0Yy4KKyAqIDxwPgorICogSW4gY29udHJhc3QgdG8gY2xhc3Mge0BsaW5rIE1hdGh9LCB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHJldHVybiBleGFjdGx5CisgKiB0aGUgc2FtZSByZXN1bHRzIG9uIGFsbCBwbGF0Zm9ybXMuIEFsZ29yaXRobXMgYmFzZWQgb24gdGhlc2UgbWV0aG9kcyB0aHVzCisgKiBiZWhhdmUgdGhlIHNhbWUgKGUuZy4gcmVnYXJkaW5nIG51bWVyaWNhbCBjb252ZXJnZW5jZSkgb24gYWxsIHBsYXRmb3JtcywKKyAqIGNvbXBseWluZyB3aXRoIHRoZSBzbG9nYW4gIndyaXRlIG9uY2UsIHJ1biBldmVyeXdoZXJlIi4gT24gdGhlIG90aGVyIHNpZGUsCisgKiB0aGUgaW1wbGVtZW50YXRpb24gb2YgY2xhc3MgU3RyaWN0TWF0aCBtYXkgYmUgbGVzcyBlZmZpY2llbnQgdGhhbiB0aGF0IG9mCisgKiBjbGFzcyBNYXRoLCBhcyBjbGFzcyBTdHJpY3RNYXRoIGNhbm5vdCB1dGlsaXplIHBsYXRmb3JtIHNwZWNpZmljIGZlYXR1cmVzCisgKiBzdWNoIGFzIGFuIGV4dGVuZGVkIHByZWNpc2lvbiBtYXRoIGNvLXByb2Nlc3NvcnMuCisgKiA8cD4KKyAqIFRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgIkZyZWVseSBEaXN0cmlidXRhYmxlIE1hdGgKKyAqIExpYnJhcnkiIChmZGxpYm0pLCB2ZXJzaW9uIDUuMy4KKyAqIDxwPgorICogPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2ZkbGlibS8iPmh0dHA6Ly93d3cubmV0bGliLm9yZy9mZGxpYm0vPC9hPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFN0cmljdE1hdGggewogCiAgICAgLyoqCi0gICAgICogU3RhbmRhcmQgbWF0aCBjb25zdGFudAorICAgICAqIFRoZSBkb3VibGUgdmFsdWUgY2xvc2VzdCB0byBlLCB0aGUgYmFzZSBvZiB0aGUgbmF0dXJhbCBsb2dhcml0aG0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBkb3VibGUgRSA9IE1hdGguRTsKIAogICAgIC8qKgotICAgICAqIFN0YW5kYXJkIG1hdGggY29uc3RhbnQKKyAgICAgKiBUaGUgZG91YmxlIHZhbHVlIGNsb3Nlc3QgdG8gcGksIHRoZSByYXRpbyBvZiBhIGNpcmNsZSdzIGNpcmN1bWZlcmVuY2UgdG8KKyAgICAgKiBpdHMgZGlhbWV0ZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBkb3VibGUgUEkgPSBNYXRoLlBJOwogCkBAIC00NiwxMSArNjcsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygtMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhYnMoLWluZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYWJzKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IGlmIGl0IGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgdGhlIG5lZ2F0aW9uIG9mIHRoZQotICAgICAqICAgICAgICAgYXJndW1lbnQuCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgYWJzb2x1dGUgdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkLgorICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBhYnMoZG91YmxlIGQpIHsKICAgICAgICAgbG9uZyBiaXRzID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZCk7CkBAIC02MCwxMSArOTAsMjEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygtMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGFicygraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhYnMoLWluZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYWJzKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZgotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGFic29sdXRlIHZhbHVlIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhcmd1bWVudCBpZiBpdCBpcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIHRoZSBuZWdhdGlvbiBvZiB0aGUKICAgICAgKiAgICAgICAgIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgYWJzKGZsb2F0IGYpIHsKICAgICAgICAgaW50IGJpdHMgPSBGbG9hdC5mbG9hdFRvSW50Qml0cyhmKTsKQEAgLTc0LDExICsxMTQsMTUgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgYXJndW1lbnQgaXMge0Bjb2RlIEludGVnZXIuTUlOX1ZBTFVFfSwge0Bjb2RlIEludGVnZXIuTUlOX1ZBTFVFfQorICAgICAqIGlzIHJldHVybmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgYWJzb2x1dGUgdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkLgogICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IGlmIGl0IGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgdGhlIG5lZ2F0aW9uIG9mIHRoZQogICAgICAqICAgICAgICAgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgYWJzKGludCBpKSB7CiAgICAgICAgIHJldHVybiBpID49IDAgPyBpIDogLWk7CkBAIC04NiwxMSArMTMwLDE2IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGFyZ3VtZW50IGlzIHtAY29kZSBMb25nLk1JTl9WQUxVRX0sIHtAY29kZSBMb25nLk1JTl9WQUxVRX0gaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBhYnNvbHV0ZSB2YWx1ZSBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgYXJndW1lbnQgaWYgaXQgaXMgcG9zaXRpdmUsIG90aGVyd2lzZSB0aGUgbmVnYXRpb24gb2YgdGhlCiAgICAgICogICAgICAgICBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgYWJzKGxvbmcgbCkgewogICAgICAgICByZXR1cm4gbCA+PSAwID8gbCA6IC1sOwpAQCAtOTgsMTgxICsxNDcsMzk3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBhcmMgY29zaW5lIG9mIHRoZQotICAgICAqIGFyZ3VtZW50CisgICAgICogYXJndW1lbnQgd2l0aGluIHRoZSByYW5nZSB7QGNvZGUgWzAuLnBpXX0uCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBhY29zKChhbnl0aGluZyA+IDEpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhY29zKChhbnl0aGluZyA8IC0xKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYWNvcyhOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIGFjb3Mgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIGFyYyBjb3NpbmUgb2YuCiAgICAgICogQHJldHVybiB0aGUgYXJjIGNvc2luZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGFjb3MoZG91YmxlIGQpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYXJjIHNpbmUgb2YgdGhlIGFyZ3VtZW50CisgICAgICogd2l0aGluIHRoZSByYW5nZSB7QGNvZGUgWy1waS8yLi5waS8yXX0uCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBhc2luKChhbnl0aGluZyA+IDEpKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXNpbigoYW55dGhpbmcgPCAtMSkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhc2luKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgYXNpbiBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGFyYyBzaW5lIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhcmMgc2luZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGFzaW4oZG91YmxlIGQpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYXJjIHRhbmdlbnQgb2YgdGhlCi0gICAgICogYXJndW1lbnQKKyAgICAgKiBhcmd1bWVudCB3aXRoaW4gdGhlIHJhbmdlIHtAY29kZSBbLXBpLzIuLnBpLzJdfS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4oKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbigraW5maW5pdHkpID0gK3BpLzJ9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4oLWluZmluaXR5KSA9IC1waS8yfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgYXRhbiBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGFyYyB0YW5nZW50IGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhcmMgdGFuZ2VudCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGF0YW4oZG91YmxlIGQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYXJjIHRhbmdlbnQgb2YgdGhlIHJlc3VsdAotICAgICAqIG9mIGRpdmlkaW5nIHRoZSBmaXJzdCBhcmd1bWVudCBieSB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGFyYyB0YW5nZW50IG9mCisgICAgICoge0Bjb2RlIHkveH0gd2l0aGluIHRoZSByYW5nZSB7QGNvZGUgWy1waS4ucGldfS4gVGhpcyBpcyB0aGUgYW5nbGUgb2YgdGhlCisgICAgICogcG9sYXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY3Rhbmd1bGFyIGNvb3JkaW5hdGVzICh4LHkpLgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoKGFueXRoaW5nKSwgTmFOICkgPSBOYU47fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMihOYU4gLCAoYW55dGhpbmcpICkgPSBOYU47fTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigrMC4wLCArKGFueXRoaW5nIGJ1dCBOYU4pKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0wLjAsICsoYW55dGhpbmcgYnV0IE5hTikpID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoKzAuMCwgLShhbnl0aGluZyBidXQgTmFOKSkgPSArcGl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0wLjAsIC0oYW55dGhpbmcgYnV0IE5hTikpID0gLXBpfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigrKGFueXRoaW5nIGJ1dCAwIGFuZCBOYU4pLCAwKSA9ICtwaS8yfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigtKGFueXRoaW5nIGJ1dCAwIGFuZCBOYU4pLCAwKSA9IC1waS8yfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigrKGFueXRoaW5nIGJ1dCBpbmZpbml0eSBhbmQgTmFOKSwgK2luZmluaXR5KX0ge0Bjb2RlID19CisgICAgICoge0Bjb2RlICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0oYW55dGhpbmcgYnV0IGluZmluaXR5IGFuZCBOYU4pLCAraW5maW5pdHkpfSB7QGNvZGUgPX0KKyAgICAgKiB7QGNvZGUgLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoKyhhbnl0aGluZyBidXQgaW5maW5pdHkgYW5kIE5hTiksIC1pbmZpbml0eSkgPSArcGl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC0oYW55dGhpbmcgYnV0IGluZmluaXR5IGFuZCBOYU4pLCAtaW5maW5pdHkpID0gLXBpfTwvbGk+CisgICAgICogPGxpPntAY29kZSBhdGFuMigraW5maW5pdHksICtpbmZpbml0eSApID0gK3BpLzR9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGF0YW4yKC1pbmZpbml0eSwgK2luZmluaXR5ICkgPSAtcGkvNH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoK2luZmluaXR5LCAtaW5maW5pdHkgKSA9ICszcGkvNH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoLWluZmluaXR5LCAtaW5maW5pdHkgKSA9IC0zcGkvNH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoK2luZmluaXR5LCAoYW55dGhpbmcgYnV0LDAsIE5hTiwgYW5kIGluZmluaXR5KSl9CisgICAgICoge0Bjb2RlID19IHtAY29kZSArcGkvMn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgYXRhbjIoLWluZmluaXR5LCAoYW55dGhpbmcgYnV0LDAsIE5hTiwgYW5kIGluZmluaXR5KSl9CisgICAgICoge0Bjb2RlID19IHtAY29kZSAtcGkvMn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBkMQotICAgICAqICAgICAgICAgICAgdGhlIG51bWVyYXRvciBvZiB0aGUgdmFsdWUgdG8gY29tcHV0ZSBhdGFuIG9mCi0gICAgICogQHBhcmFtIGQyCi0gICAgICogICAgICAgICAgICB0aGUgZGVub21pbmF0b3Igb2YgdGhlIHZhbHVlIHRvIGNvbXB1dGUgYXRhbiBvZgotICAgICAqIEByZXR1cm4gdGhlIGFyYyB0YW5nZW50IG9mIGQxL2QyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgbnVtZXJhdG9yIG9mIHRoZSB2YWx1ZSB3aG9zZSBhdGFuIGhhcyB0byBiZSBjb21wdXRlZC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIGRlbm9taW5hdG9yIG9mIHRoZSB2YWx1ZSB3aG9zZSBhdGFuIGhhcyB0byBiZSBjb21wdXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcmMgdGFuZ2VudCBvZiB7QGNvZGUgeS94fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgYXRhbjIoZG91YmxlIGQxLCBkb3VibGUgZDIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBhdGFuMihkb3VibGUgeSwgZG91YmxlIHgpOworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIHBhcmFtZXRlciBuYW1lcyBjaGFuZ2VkIGZyb20gZDEgLyBkMiB0byB4IC8geQorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAKLSAgICAgLyoqCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgY3ViZSByb290IG9mIHRoZQotICAgICAqIGFyZ3VtZW50LiAKKyAgICAgKiBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGNicnQoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBjYnJ0KC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgY2JydCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBjYnJ0KC1pbmZpbml0eSkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNicnQoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgY3ViZSByb290IG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgY3ViZSByb290IGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBjdWJlIHJvb3Qgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBjYnJ0KGRvdWJsZSBkKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSBtb3N0IG5lZ2F0aXZlIChpLmUuIGNsb3Nlc3QgdG8KLSAgICAgKiBuZWdhdGl2ZSBpbmZpbml0eSkgaW50ZWdlciB2YWx1ZSB3aGljaCBpcyBncmVhdGVyIHRoYW4gdGhlIGFyZ3VtZW50LgorICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSBtb3N0IG5lZ2F0aXZlIChjbG9zZXN0IHRvIG5lZ2F0aXZlCisgICAgICogaW5maW5pdHkpIGludGVnZXIgdmFsdWUgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGNlaWwoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBjZWlsKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgY2VpbCgoYW55dGhpbmcgaW4gcmFuZ2UgKC0xLDApKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNlaWwoK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgY2VpbCgtaW5maW5pdHkpID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBjZWlsKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGNsb3Nlc3QgaW50ZWdlciB2YWx1ZSBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY2VpbGluZyBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGNlaWwoZG91YmxlIGQpOwogICAgIAotICAgIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mIHRoZQogICAgICAqIGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgY29zaCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBjb3NoKC1pbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNvc2goTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSBoeXBlcmJvbGljIGNvc2luZSBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGh5cGVyYm9saWMgY29zaW5lIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGNvc2goZG91YmxlIGQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgY29zaW5lIG9mIHRoZSBhcmd1bWVudAorICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGNvc2luZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBjb3MoK2luZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgY29zKC1pbmZpbml0eSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGNvcyhOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIGNvcyBvZgorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIHdob3NlIGNvc2luZSBoYXMgdG8gYmUgY29tcHV0ZWQsIGluIHJhZGlhbnMuCiAgICAgICogQHJldHVybiB0aGUgY29zaW5lIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgY29zKGRvdWJsZSBkKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIHJhaXNpbmcgImUiIHRvIHRoZSBwb3dlcgotICAgICAqIG9mIHRoZSBhcmd1bWVudAorICAgICAqIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGV4cCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBleHAoLWluZmluaXR5KSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGV4cChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHRoZSBleHBvbmVudGlhbCBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGV4cG9uZW50aWFsIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBleHBvbmVudGlhbCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGV4cChkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiA8aT5lPC9pPjxzdXA+ZDwvc3VwPiAtIDEuCi0gICAgICogSWYgdGhlIGFyZ3VtZW50IGlzIHZlcnkgY2xvc2UgdG8gMCwgaXQgaXMgbXVjaCBtb3JlIGFjY3VyYXRlIHRvIHVzZQotICAgICAqIGV4cG0xKGQpKzEgdGhhbiBleHAoZCkuCisgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiA8aT57QGNvZGUgZX08L2k+PHN1cD4KKyAgICAgKiB7QGNvZGUgZH08L3N1cD57QGNvZGUgLSAxfS4gSWYgdGhlIGFyZ3VtZW50IGlzIHZlcnkgY2xvc2UgdG8gMCwgaXQgaXMKKyAgICAgKiBtdWNoIG1vcmUgYWNjdXJhdGUgdG8gdXNlIHtAY29kZSBleHBtMShkKSsxfSB0aGFuIHtAY29kZSBleHAoZCl9IChkdWUgdG8KKyAgICAgKiBjYW5jZWxsYXRpb24gb2Ygc2lnbmlmaWNhbnQgZGlnaXRzKS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGV4cG0xKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZXhwbTEoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBleHBtMSgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBleHBtMSgtaW5maW5pdHkpID0gLTEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZXhwbTEoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgPGk+ZTwvaT48c3VwPmQ8L3N1cD4gLSAxIG9mCi0gICAgICogQHJldHVybiB0aGUgPGk+ZTwvaT48c3VwPmQ8L3N1cD4gLSAxIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHRoZSA8aT57QGNvZGUgZX08L2k+PHN1cD57QGNvZGUgZH08L3N1cD4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSAtIDF9IG9mLgorICAgICAqIEByZXR1cm4gdGhlIDxpPntAY29kZSBlfTwvaT48c3VwPntAY29kZSBkfTwvc3VwPntAY29kZSAtIDF9IHZhbHVlCisgICAgICogICAgICAgICBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGV4cG0xKGRvdWJsZSBkKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSBtb3N0IHBvc2l0aXZlIChpLmUuIGNsb3Nlc3QgdG8KKyAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgY29udmVyc2lvbiBvZiB0aGUgbW9zdCBwb3NpdGl2ZSAoY2xvc2VzdCB0bwogICAgICAqIHBvc2l0aXZlIGluZmluaXR5KSBpbnRlZ2VyIHZhbHVlIHdoaWNoIGlzIGxlc3MgdGhhbiB0aGUgYXJndW1lbnQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBmbG9vcigrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGZsb29yKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZmxvb3IoK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZmxvb3IoLWluZmluaXR5KSA9IC1pbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgZmxvb3IoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIAotICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICogQHJldHVybiB0aGUgY2VpbGluZyBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHBhcmFtIGQgdGhlIHZhbHVlIHdob3NlIGNsb3Nlc3QgaW50ZWdlciB2YWx1ZSBoYXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICogQHJldHVybiB0aGUgZmxvb3Igb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBmbG9vcihkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBzcXJ0KDxpPng8L2k+PHN1cD4yPC9zdXA+KzxpPnk8L2k+PHN1cD4yPC9zdXA+KS4gVGhlCi0gICAgICogZmluYWwgcmVzdWx0IGlzIHdpdGhvdXQgbWVkaXVtIHVuZGVyZmxvdyBvciBvdmVyZmxvdy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSBzcXJ0KH08aT57QGNvZGUgeH08L2k+PHN1cD57QGNvZGUgMn08L3N1cD57QGNvZGUgK30KKyAgICAgKiA8aT4ge0Bjb2RlIHl9PC9pPjxzdXA+e0Bjb2RlIDJ9PC9zdXA+e0Bjb2RlICl9LiBUaGUgZmluYWwgcmVzdWx0IGlzCisgICAgICogd2l0aG91dCBtZWRpdW0gdW5kZXJmbG93IG9yIG92ZXJmbG93LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgaHlwb3QoK2luZmluaXR5LCAoYW55dGhpbmcgaW5jbHVkaW5nIE5hTikpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBoeXBvdCgtaW5maW5pdHksIChhbnl0aGluZyBpbmNsdWRpbmcgTmFOKSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGh5cG90KChhbnl0aGluZyBpbmNsdWRpbmcgTmFOKSwgK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgaHlwb3QoKGFueXRoaW5nIGluY2x1ZGluZyBOYU4pLCAtaW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBoeXBvdChOYU4sIE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgYSBkb3VibGUgbnVtYmVyCisgICAgICogICAgICAgICAgICBhIGRvdWJsZSBudW1iZXIuCiAgICAgICogQHBhcmFtIHkKLSAgICAgKiAgICAgICAgICAgIGEgZG91YmxlIG51bWJlcgotICAgICAqIEByZXR1cm4gdGhlIHNxcnQoPGk+eDwvaT48c3VwPjI8L3N1cD4rPGk+eTwvaT48c3VwPjI8L3N1cD4pIHZhbHVlCi0gICAgICogICAgICAgICBvZiB0aGUgYXJndW1lbnRzLgorICAgICAqICAgICAgICAgICAgYSBkb3VibGUgbnVtYmVyLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBzcXJ0KH08aT57QGNvZGUgeH08L2k+PHN1cD57QGNvZGUgMn08L3N1cD57QGNvZGUgK30KKyAgICAgKiAgICAgICAgIDxpPiB7QGNvZGUgeX08L2k+PHN1cD57QGNvZGUgMn08L3N1cD57QGNvZGUgKX0gdmFsdWUgb2YgdGhlCisgICAgICogICAgICAgICBhcmd1bWVudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGh5cG90KGRvdWJsZSB4LCBkb3VibGUgeSk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHRoZSBzZWNvbmQgdXNpbmcKLSAgICAgKiB0aGUgSUVFRSA3NTQgcnVsZXMuCisgICAgICogUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIHtAY29kZSB4fSBieSB7QGNvZGUgeX0gdXNpbmcgdGhlIElFRUUKKyAgICAgKiA3NTQgcnVsZXMuIFRoZSByZXN1bHQgaXMge0Bjb2RlIHgtcm91bmQoeC9wKSpwfSB3aGVyZSB7QGNvZGUgcm91bmQoeC9wKX0KKyAgICAgKiBpcyB0aGUgbmVhcmVzdCBpbnRlZ2VyIChyb3VuZGVkIHRvIGV2ZW4pLCBidXQgd2l0aG91dCBudW1lcmljYWwKKyAgICAgKiBjYW5jZWxsYXRpb24gcHJvYmxlbXMuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBJRUVFcmVtYWluZGVyKChhbnl0aGluZyksIDApID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBJRUVFcmVtYWluZGVyKCtpbmZpbml0eSwgKGFueXRoaW5nKSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIElFRUVyZW1haW5kZXIoLWluZmluaXR5LCAoYW55dGhpbmcpKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgSUVFRXJlbWFpbmRlcihOYU4sIChhbnl0aGluZykpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBJRUVFcmVtYWluZGVyKChhbnl0aGluZyksIE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIElFRUVyZW1haW5kZXIoeCwgK2luZmluaXR5KSA9IHggfSB3aGVyZSB4IGlzIGFueXRoaW5nIGJ1dAorICAgICAqICsvLWluZmluaXR5PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIElFRUVyZW1haW5kZXIoeCwgLWluZmluaXR5KSA9IHggfSB3aGVyZSB4IGlzIGFueXRoaW5nIGJ1dAorICAgICAqICsvLWluZmluaXR5PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZDEKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1lcmF0b3Igb2YgdGhlIG9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBkMgotICAgICAqICAgICAgICAgICAgdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZDEvZDIuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1lcmF0b3Igb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogQHJldHVybiB0aGUgSUVFRTc1NCBmbG9hdGluZyBwb2ludCByZW1pbmRlciBvZiBvZiB7QGNvZGUgeC95fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgSUVFRXJlbWFpbmRlcihkb3VibGUgZDEsIGRvdWJsZSBkMik7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIElFRUVyZW1haW5kZXIoZG91YmxlIHgsIGRvdWJsZSB5KTsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBwYXJhbWV0ZXIgbmFtZXMgY2hhbmdlZCBmcm9tIGQxIC8gZDIgdG8geCAvIHkKKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiB0aGUKLSAgICAgKiBhcmd1bWVudAorICAgICAqIGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgbG9nKCswLjApID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2coLTAuMCkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZygoYW55dGhpbmcgPCAwKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nKCtpbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZygtaW5maW5pdHkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2coTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgbG9nIG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgbG9nIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGxvZyhkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9nYXJpdGhtIG9mIHRoZSBhcmd1bWVudCBhbmQgdGhlIGJhc2UgaXMgMTAuCisgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYmFzZSAxMCBsb2dhcml0aG0gb2YgdGhlCisgICAgICogYXJndW1lbnQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBsb2cxMCgrMC4wKSA9IC1pbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMTAoLTAuMCkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZzEwKChhbnl0aGluZyA8IDApID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxMCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxMCgtaW5maW5pdHkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxMChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHRoZSBiYXNlIDEwIGxvZyBvZgotICAgICAqIEByZXR1cm4gdGhlIGJhc2UgMTAgbG9nYXJpdGhtIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBiYXNlIDEwIGxvZyBoYXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICogQHJldHVybiB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBsb2cxMChkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlCiAgICAgICogc3VtIG9mIHRoZSBhcmd1bWVudCBhbmQgMS4gSWYgdGhlIGFyZ3VtZW50IGlzIHZlcnkgY2xvc2UgdG8gMCwgaXQgaXMgbXVjaAotICAgICAqIG1vcmUgYWNjdXJhdGUgdG8gdXNlIGxvZzFwKGQpIHRoYW4gbG9nKDEuMCtkKS4KKyAgICAgKiBtb3JlIGFjY3VyYXRlIHRvIHVzZSB7QGNvZGUgbG9nMXAoZCl9IHRoYW4ge0Bjb2RlIGxvZygxLjArZCl9IChkdWUgdG8KKyAgICAgKiBudW1lcmljYWwgY2FuY2VsbGF0aW9uKS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZzFwKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbG9nMXAoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxcCgoYW55dGhpbmcgPCAxKSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIGxvZzFwKC0xLjApID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxcCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxcCgtaW5maW5pdHkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBsb2cxcChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHRoZSBsbigxK2QpIG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUge0Bjb2RlIGxuKDErZCl9IG9mLgogICAgICAqIEByZXR1cm4gdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBzdW0gb2YgdGhlIGFyZ3VtZW50IGFuZCAxLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBsb2cxcChkb3VibGUgZCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IHBvc2l0aXZlIChpLmUuIGNsb3Nlc3QgdG8gcG9zaXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KKyAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IHBvc2l0aXZlIChjbG9zZXN0IHRvIHBvc2l0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCiAgICAgICogYXJndW1lbnRzLgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgbWF4KE5hTiwgKGFueXRoaW5nKSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1heCgoYW55dGhpbmcpLCBOYU4pID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtYXgoKzAuMCwgLTAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtYXgoLTAuMCwgKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY2hlY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gZDIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2YgZDEgYW5kIGQyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsYXJnZXIgb2Yge0Bjb2RlIGQxfSBhbmQge0Bjb2RlIGQyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBtYXgoZG91YmxlIGQxLCBkb3VibGUgZDIpIHsKICAgICAgICAgaWYgKGQxID4gZDIpCkBAIC0yOTAsMTQgKzU1NSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vc3QgcG9zaXRpdmUgKGkuZS4gY2xvc2VzdCB0byBwb3NpdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bworICAgICAqIFJldHVybnMgdGhlIG1vc3QgcG9zaXRpdmUgKGNsb3Nlc3QgdG8gcG9zaXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KICAgICAgKiBhcmd1bWVudHMuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBtYXgoTmFOLCAoYW55dGhpbmcpKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbWF4KChhbnl0aGluZyksIE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1heCgrMC4wLCAtMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1heCgtMC4wLCArMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZjEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBmMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICAqIEByZXR1cm4gdGhlIGxhcmdlciBvZiBmMSBhbmQgZjIuCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGxhcmdlciBvZiB7QGNvZGUgZjF9IGFuZCB7QGNvZGUgZjJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbWF4KGZsb2F0IGYxLCBmbG9hdCBmMikgewogICAgICAgICBpZiAoZjEgPiBmMikKQEAgLTMxNSw0MiArNTkwLDU0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdCBwb3NpdGl2ZSAoaS5lLiBjbG9zZXN0IHRvIHBvc2l0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCisgICAgICogUmV0dXJucyB0aGUgbW9zdCBwb3NpdGl2ZSAoY2xvc2VzdCB0byBwb3NpdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bwogICAgICAqIGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBpMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICAqIEByZXR1cm4gdGhlIGxhcmdlciBvZiBpMSBhbmQgaTIuCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGxhcmdlciBvZiB7QGNvZGUgaTF9IGFuZCB7QGNvZGUgaTJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IG1heChpbnQgaTEsIGludCBpMikgewogICAgICAgICByZXR1cm4gaTEgPiBpMiA/IGkxIDogaTI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdCBwb3NpdGl2ZSAoaS5lLiBjbG9zZXN0IHRvIHBvc2l0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCisgICAgICogUmV0dXJucyB0aGUgbW9zdCBwb3NpdGl2ZSAoY2xvc2VzdCB0byBwb3NpdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bwogICAgICAqIGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbDEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBsMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICAqIEByZXR1cm4gdGhlIGxhcmdlciBvZiBsMSBhbmQgbDIuCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGxhcmdlciBvZiB7QGNvZGUgbDF9IGFuZCB7QGNvZGUgbDJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBtYXgobG9uZyBsMSwgbG9uZyBsMikgewogICAgICAgICByZXR1cm4gbDEgPiBsMiA/IGwxIDogbDI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdCBuZWdhdGl2ZSAoaS5lLiBjbG9zZXN0IHRvIG5lZ2F0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCisgICAgICogUmV0dXJucyB0aGUgbW9zdCBuZWdhdGl2ZSAoY2xvc2VzdCB0byBuZWdhdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bwogICAgICAqIGFyZ3VtZW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIG1pbihOYU4sIChhbnl0aGluZykpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBtaW4oKGFueXRoaW5nKSwgTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbWluKCswLjAsIC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbWluKC0wLjAsICswLjApID0gLTAuMH08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkMQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQuCiAgICAgICogQHBhcmFtIGQyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICogQHJldHVybiB0aGUgc21hbGxlciBvZiBkMSBhbmQgZDIuCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIHNtYWxsZXIgb2Yge0Bjb2RlIGQxfSBhbmQge0Bjb2RlIGQyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBtaW4oZG91YmxlIGQxLCBkb3VibGUgZDIpIHsKICAgICAgICAgaWYgKGQxID4gZDIpCkBAIC0zNjgsMTQgKzY1NSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vc3QgbmVnYXRpdmUgKGkuZS4gY2xvc2VzdCB0byBuZWdhdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bworICAgICAqIFJldHVybnMgdGhlIG1vc3QgbmVnYXRpdmUgKGNsb3Nlc3QgdG8gbmVnYXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KICAgICAgKiBhcmd1bWVudHMuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBtaW4oTmFOLCAoYW55dGhpbmcpKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgbWluKChhbnl0aGluZyksIE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1pbigrMC4wLCAtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIG1pbigtMC4wLCArMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZjEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBmMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICAqIEByZXR1cm4gdGhlIHNtYWxsZXIgb2YgZjEgYW5kIGYyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVyIG9mIHtAY29kZSBmMX0gYW5kIHtAY29kZSBmMn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmbG9hdCBtaW4oZmxvYXQgZjEsIGZsb2F0IGYyKSB7CiAgICAgICAgIGlmIChmMSA+IGYyKQpAQCAtMzkzLDcyICs2OTAsMTM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdCBuZWdhdGl2ZSAoaS5lLiBjbG9zZXN0IHRvIG5lZ2F0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCisgICAgICogUmV0dXJucyB0aGUgbW9zdCBuZWdhdGl2ZSAoY2xvc2VzdCB0byBuZWdhdGl2ZSBpbmZpbml0eSkgb2YgdGhlIHR3bwogICAgICAqIGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBpMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudAotICAgICAqIEByZXR1cm4gdGhlIHNtYWxsZXIgb2YgaTEgYW5kIGkyLgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVyIG9mIHtAY29kZSBpMX0gYW5kIHtAY29kZSBpMn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgbWluKGludCBpMSwgaW50IGkyKSB7CiAgICAgICAgIHJldHVybiBpMSA8IGkyID8gaTEgOiBpMjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IG5lZ2F0aXZlIChpLmUuIGNsb3Nlc3QgdG8gbmVnYXRpdmUgaW5maW5pdHkpIG9mIHRoZSB0d28KKyAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IG5lZ2F0aXZlIChjbG9zZXN0IHRvIG5lZ2F0aXZlIGluZmluaXR5KSBvZiB0aGUgdHdvCiAgICAgICogYXJndW1lbnRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsMQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQuCiAgICAgICogQHBhcmFtIGwyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICogQHJldHVybiB0aGUgc21hbGxlciBvZiBsMSBhbmQgbDIuCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIHNtYWxsZXIgb2Yge0Bjb2RlIGwxfSBhbmQge0Bjb2RlIGwyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgbWluKGxvbmcgbDEsIGxvbmcgbDIpIHsKICAgICAgICAgcmV0dXJuIGwxIDwgbDIgPyBsMSA6IGwyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIHJlc3VsdCBvZiByYWlzaW5nIHRoZQotICAgICAqIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwb3dlciBvZiB0aGUgc2Vjb25kLgorICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIHJlc3VsdCBvZiByYWlzaW5nCisgICAgICoge0Bjb2RlIHh9IHRvIHRoZSBwb3dlciBvZiB7QGNvZGUgeX0uCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBwb3coKGFueXRoaW5nKSwgKzAuMCkgPSAxLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygoYW55dGhpbmcpLCAtMC4wKSA9IDEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KHgsIDEuMCkgPSB4fTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKGFueXRoaW5nKSwgTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KE5hTiwgKGFueXRoaW5nIGV4Y2VwdCAwKSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygrLy0ofHh8ID4gMSksICtpbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygrLy0ofHh8ID4gMSksIC1pbmZpbml0eSkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKy8tKHx4fCA8IDEpLCAraW5maW5pdHkpID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCsvLSh8eHwgPCAxKSwgLWluZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCsvLTEuMCAsICtpbmZpbml0eSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygrLy0xLjAgLCAtaW5maW5pdHkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coKzAuMCwgKCthbnl0aGluZyBleGNlcHQgMCwgTmFOKSkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coLTAuMCwgKCthbnl0aGluZyBleGNlcHQgMCwgTmFOLCBvZGQgaW50ZWdlcikpID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCswLjAsICgtYW55dGhpbmcgZXhjZXB0IDAsIE5hTikpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coLTAuMCwgKC1hbnl0aGluZyBleGNlcHQgMCwgTkFOLCBvZGQgaW50ZWdlcikpfSB7QGNvZGUgPX0KKyAgICAgKiB7QGNvZGUgK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSBwb3coLTAuMCwgKG9kZCBpbnRlZ2VyKSkgPSAtcG93KCArMCAsIChvZGQgaW50ZWdlcikgKX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCtpbmZpbml0eSwgKCthbnl0aGluZyBleGNlcHQgMCwgTmFOKSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHBvdygraW5maW5pdHksICgtYW55dGhpbmcgZXhjZXB0IDAsIE5hTikpID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KC1pbmZpbml0eSwgKGFueXRoaW5nKSkgPSAtcG93KDAsICgtYW55dGhpbmcpKX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCgtYW55dGhpbmcpLCAoaW50ZWdlcikpfSB7QGNvZGUgPX0KKyAgICAgKiB7QGNvZGUgcG93KC0xLChpbnRlZ2VyKSkqcG93KCthbnl0aGluZyxpbnRlZ2VyKX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcG93KCgtYW55dGhpbmcgZXhjZXB0IDAgYW5kIGluZmluaXR5KSwgKG5vbi1pbnRlZ2VyKSl9CisgICAgICoge0Bjb2RlID19IHtAY29kZSBOQU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZDEKKyAgICAgKiBAcGFyYW0geAogICAgICAqICAgICAgICAgICAgdGhlIGJhc2Ugb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gZDIKKyAgICAgKiBAcGFyYW0geQogICAgICAqICAgICAgICAgICAgdGhlIGV4cG9uZW50IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogQHJldHVybiBkMSB0byB0aGUgcG93ZXIgb2YgZDIKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB4fSB0byB0aGUgcG93ZXIgb2Yge0Bjb2RlIHl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBwb3coZG91YmxlIGQxLCBkb3VibGUgZDIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBwb3coZG91YmxlIHgsIGRvdWJsZSB5KTsKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBwYXJhbWV0ZXIgbmFtZXMgY2hhbmdlZCBmcm9tIGQxIC8gZDIgdG8geCAvIHkKKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHNldWRvLXJhbmRvbSBudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICAgKiBSZXR1cm5zIGEgcHNldWRvLXJhbmRvbSBudW1iZXIgYmV0d2VlbiAwLjAgKGluY2x1c2l2ZSkgYW5kIDEuMAorICAgICAqIChleGNsdXNpdmUpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBwc2V1ZG8tcmFuZG9tIG51bWJlcgorICAgICAqIEByZXR1cm4gYSBwc2V1ZG8tcmFuZG9tIG51bWJlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSByYW5kb20oKSB7Ci0gICAgICAgIGlmIChyYW5kb20gPT0gbnVsbCkKLSAgICAgICAgICAgIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIGlmIChyYW5kb20gPT0gbnVsbCkgeworICAgICAgICAgICAgcmFuZG9tID0gbmV3IGphdmEudXRpbC5SYW5kb20oKTsKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiByYW5kb20ubmV4dERvdWJsZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSByZXN1bHQgb2Ygcm91bmRpbmcgdGhlIGFyZ3VtZW50IHRvCi0gICAgICogYW4gaW50ZWdlci4KKyAgICAgKiBhbiBpbnRlZ2VyLiBUaWUgYnJlYWtzIGFyZSByb3VuZGVkIHRvd2FyZHMgZXZlbi4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHJpbnQoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSByaW50KC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcmludCgraW5maW5pdHkpID0gK2luZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSByaW50KC1pbmZpbml0eSkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJpbnQoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgcm91bmRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBjbG9zZXN0IGludGVnZXIgdG8gdGhlIGFyZ3VtZW50IChhcyBhIGRvdWJsZSkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHJpbnQoZG91YmxlIGQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIHRoZSBhcmd1bWVudCB0byBhbiBpbnRlZ2VyLgorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGluZyB0aGUgYXJndW1lbnQgdG8gYW4gaW50ZWdlci4gVGhlIHJlc3VsdCBpcworICAgICAqIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIChsb25nKSBNYXRoLmZsb29yKGQrMC41KX0uCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSByb3VuZCgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKC0wLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoKGFueXRoaW5nID4gTG9uZy5NQVhfVkFMVUUpID0gTG9uZy5NQVhfVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKChhbnl0aGluZyA8IExvbmcuTUlOX1ZBTFVFKSA9IExvbmcuTUlOX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgraW5maW5pdHkpID0gTG9uZy5NQVhfVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKC1pbmZpbml0eSkgPSBMb25nLk1JTl9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoTmFOKSA9ICswLjB9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIHJvdW5kZWQuCiAgICAgICogQHJldHVybiB0aGUgY2xvc2VzdCBpbnRlZ2VyIHRvIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgcm91bmQoZG91YmxlIGQpIHsKICAgICAgICAgLy8gY2hlY2sgZm9yIE5hTgpAQCAtNDY4LDExICs4MzAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRpbmcgdGhlIGFyZ3VtZW50IHRvIGFuIGludGVnZXIuCisgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIHRoZSBhcmd1bWVudCB0byBhbiBpbnRlZ2VyLiBUaGUgcmVzdWx0IGlzCisgICAgICogZXF1aXZhbGVudCB0byB7QGNvZGUgKGludCkgTWF0aC5mbG9vcihmKzAuNSl9LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgtMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKChhbnl0aGluZyA+IEludGVnZXIuTUFYX1ZBTFVFKSA9IEludGVnZXIuTUFYX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgoYW55dGhpbmcgPCBJbnRlZ2VyLk1JTl9WQUxVRSkgPSBJbnRlZ2VyLk1JTl9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgcm91bmQoK2luZmluaXR5KSA9IEludGVnZXIuTUFYX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSByb3VuZCgtaW5maW5pdHkpID0gSW50ZWdlci5NSU5fVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHJvdW5kKE5hTikgPSArMC4wfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSByb3VuZGVkLgogICAgICAqIEByZXR1cm4gdGhlIGNsb3Nlc3QgaW50ZWdlciB0byB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgcm91bmQoZmxvYXQgZikgewogICAgICAgICAvLyBjaGVjayBmb3IgTmFOCkBAIC00ODAsMTUgKzg1NiwyNyBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKGYgKyAwLjVmKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzaWdudW0gZnVuY3Rpb24gb2YgdGhlIGFyZ3VtZW50LiBJZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuCi0gICAgICogemVybywgaXQgcmV0dXJucyAtMS4wLiBJZiBncmVhdGVyIHRoYW4gemVybywgMS4wIGlzIHJldHVybmVkLiBJdCByZXR1cm5zCi0gICAgICogemVybyBpZiB0aGUgYXJndW1lbnQgaXMgYWxzbyB6ZXJvLgorICAgICAqIHplcm8sIGl0IHJldHVybnMgLTEuMC4gSWYgdGhlIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCAxLjAgaXMKKyAgICAgKiByZXR1cm5lZC4gSWYgdGhlIGFyZ3VtZW50IGlzIGVpdGhlciBwb3NpdGl2ZSBvciBuZWdhdGl2ZSB6ZXJvLCB0aGUKKyAgICAgKiBhcmd1bWVudCBpcyByZXR1cm5lZCBhcyByZXN1bHQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBzaWdudW0oKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaWdudW0oLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaWdudW0oK2luZmluaXR5KSA9ICsxLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bSgtaW5maW5pdHkpID0gLTEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2lnbnVtKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgc2lnbnVtIGZ1bmN0aW9uIG9mCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2Ugc2lnbnVtIGhhcyB0byBiZSBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc2lnbnVtIGZ1bmN0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHNpZ251bShkb3VibGUgZCl7CiAgICAgICAgIGlmKERvdWJsZS5pc05hTihkKSl7CkBAIC01MDIsMTUgKzg5MCwyNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzaWc7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc2lnbnVtIGZ1bmN0aW9uIG9mIHRoZSBhcmd1bWVudC4gSWYgdGhlIGFyZ3VtZW50IGlzIGxlc3MgdGhhbgotICAgICAqIHplcm8sIGl0IHJldHVybnMgLTEuMC4gSWYgZ3JlYXRlciB0aGFuIHplcm8sIDEuMCBpcyByZXR1cm5lZC4gSXQgcmV0dXJucwotICAgICAqIHplcm8gaWYgdGhlIGFyZ3VtZW50IGlzIGFsc28gemVyby4KKyAgICAgKiB6ZXJvLCBpdCByZXR1cm5zIC0xLjAuIElmIHRoZSBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gemVybywgMS4wIGlzCisgICAgICogcmV0dXJuZWQuIElmIHRoZSBhcmd1bWVudCBpcyBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUgemVybywgdGhlCisgICAgICogYXJndW1lbnQgaXMgcmV0dXJuZWQgYXMgcmVzdWx0LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgc2lnbnVtKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2lnbnVtKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2lnbnVtKCtpbmZpbml0eSkgPSArMS4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaWdudW0oLWluZmluaXR5KSA9IC0xLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpZ251bShOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHNpZ251bSBmdW5jdGlvbiBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIHNpZ251bSBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNpZ251bSBmdW5jdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHNpZ251bShmbG9hdCBmKXsKICAgICAgICAgaWYoRmxvYXQuaXNOYU4oZikpewpAQCAtNTI3LDgyICs5MjcsMTczIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YgdGhlCi0gICAgICogYXJndW1lbnQuIAorICAgICAqIGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgc2luaCgrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbmgoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaW5oKCtpbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbmgoLWluZmluaXR5KSA9IC1pbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2luaChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIGh5cGVyYm9saWMgc2luZSBvZgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdob3NlIGh5cGVyYm9saWMgc2luZSBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgc2luaChkb3VibGUgZCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgc2luZSBvZiB0aGUgYXJndW1lbnQKKyAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvdWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBzaW5lIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbigrMC4wKSA9ICswLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbigtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNpbigraW5maW5pdHkpID0gTmFOfTwvbGk+CisgICAgICogPGxpPntAY29kZSBzaW4oLWluZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc2luKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXB1dGUgc2luIG9mCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgd2hvc2Ugc2luIGhhcyB0byBiZSBjb21wdXRlZCwgaW4gcmFkaWFucy4KICAgICAgKiBAcmV0dXJuIHRoZSBzaW5lIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgc2luKGRvdWJsZSBkKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIHNxdWFyZSByb290IG9mIHRoZQotICAgICAqIGFyZ3VtZW50CisgICAgICogYXJndW1lbnQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBzcXJ0KCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc3FydCgtMC4wKSA9IC0wLjB9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNxcnQoIChhbnl0aGluZyA8IDApICkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHNxcnQoK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgc3FydChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHNxcnQgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBzcXVhcmUgcm9vdCBoYXMgdG8gYmUgY29tcHV0ZWQuCiAgICAgICogQHJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBzcXJ0KGRvdWJsZSBkKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZG91YmxlIGFwcHJveGltYXRpb24gb2YgdGhlIHRhbmdlbnQgb2YgdGhlIGFyZ3VtZW50CisgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgdGFuZ2VudCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSB0YW4oKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW4oLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW4oK2luZmluaXR5KSA9IE5hTn08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdGFuKC1pbmZpbml0eSkgPSBOYU59PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRhbihOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIHRhbiBvZgorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIHdob3NlIHRhbmdlbnMgaGFzIHRvIGJlIGNvbXB1dGVkLCBpbiByYWRpYW5zLgogICAgICAqIEByZXR1cm4gdGhlIHRhbmdlbnQgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSB0YW4oZG91YmxlIGQpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBkb3VibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHRoZQotICAgICAqIGFyZ3VtZW50LiBUaGUgYWJzb2x1dGUgdmFsdWUgaXMgYWx3YXlzIGxlc3MgdGhhbiAxLiAKKyAgICAgKiBhcmd1bWVudC4gVGhlIGFic29sdXRlIHZhbHVlIGlzIGFsd2F5cyBsZXNzIHRoYW4gMS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHRhbmgoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0YW5oKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdGFuaCgraW5maW5pdHkpID0gKzEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdGFuaCgtaW5maW5pdHkpID0gLTEuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdGFuaChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wdXRlIGh5cGVyYm9saWMgdGFuZ2VudCBvZgotICAgICAqIEByZXR1cm4gdGhlIGh5cGVyYm9saWMgdGFuZ2VudCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgd2hvc2UgaHlwZXJib2xpYyB0YW5nZW50IGhhcyB0byBiZSBjb21wdXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgdGhlIGFyZ3VtZW50CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHRhbmgoZG91YmxlIGQpOwogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lYXN1cmUgaW4gZGVncmVlcyBvZiB0aGUgc3VwcGxpZWQgcmFkaWFuIGFuZ2xlCisgICAgICogUmV0dXJucyB0aGUgbWVhc3VyZSBpbiBkZWdyZWVzIG9mIHRoZSBzdXBwbGllZCByYWRpYW4gYW5nbGUuIFRoZSByZXN1bHQKKyAgICAgKiBpcyB7QGNvZGUgYW5ncmFkICogMTgwIC8gcGl9LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgdG9EZWdyZWVzKCswLjApID0gKzAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdG9EZWdyZWVzKC0wLjApID0gLTAuMH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdG9EZWdyZWVzKCtpbmZpbml0eSkgPSAraW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRvRGVncmVlcygtaW5maW5pdHkpID0gLWluZmluaXR5fTwvbGk+CisgICAgICogPGxpPntAY29kZSB0b0RlZ3JlZXMoTmFOKSA9IE5hTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBhbmdyYWQKLSAgICAgKiAgICAgICAgICAgIGFuIGFuZ2xlIGluIHJhZGlhbnMKKyAgICAgKiAgICAgICAgICAgIGFuIGFuZ2xlIGluIHJhZGlhbnMuCiAgICAgICogQHJldHVybiB0aGUgZGVncmVlIG1lYXN1cmUgb2YgdGhlIGFuZ2xlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHRvRGVncmVlcyhkb3VibGUgYW5ncmFkKSB7CiAgICAgICAgIHJldHVybiBhbmdyYWQgKiAxODBkIC8gUEk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVhc3VyZSBpbiByYWRpYW5zIG9mIHRoZSBzdXBwbGllZCBkZWdyZWUgYW5nbGUKKyAgICAgKiBSZXR1cm5zIHRoZSBtZWFzdXJlIGluIHJhZGlhbnMgb2YgdGhlIHN1cHBsaWVkIGRlZ3JlZSBhbmdsZS4gVGhlIHJlc3VsdAorICAgICAqIGlzIHtAY29kZSBhbmdkZWcgLyAxODAgKiBwaX0uCisgICAgICogPHA+CisgICAgICogU3BlY2lhbCBjYXNlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSB0b1JhZGlhbnMoKzAuMCkgPSArMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0b1JhZGlhbnMoLTAuMCkgPSAtMC4wfTwvbGk+CisgICAgICogPGxpPntAY29kZSB0b1JhZGlhbnMoK2luZmluaXR5KSA9ICtpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdG9SYWRpYW5zKC1pbmZpbml0eSkgPSAtaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHRvUmFkaWFucyhOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFuZ2RlZwotICAgICAqICAgICAgICAgICAgYW4gYW5nbGUgaW4gZGVncmVlcworICAgICAqICAgICAgICAgICAgYW4gYW5nbGUgaW4gZGVncmVlcy4KICAgICAgKiBAcmV0dXJuIHRoZSByYWRpYW4gbWVhc3VyZSBvZiB0aGUgYW5nbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgdG9SYWRpYW5zKGRvdWJsZSBhbmdkZWcpIHsKICAgICAgICAgcmV0dXJuIGFuZ2RlZyAvIDE4MGQgKiBQSTsKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQncyB1bHAuIFRoZSBzaXplIG9mIGEgdWxwIG9mIGEgZG91YmxlIHZhbHVlIGlzIHRoZQotICAgICAqIHBvc2l0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyB2YWx1ZSBhbmQgdGhlIGRvdWJsZSB2YWx1ZSBuZXh0IGxhcmdlcgotICAgICAqIGluIG1hZ25pdHVkZS4gRm9yIG5vbi1OYU4geCwgdWxwKC14KSA9PSB1bHAoeCkuCisgICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQncyB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLiBUaGUgc2l6ZSBvZiBhIHVscCBvZgorICAgICAqIGEgZG91YmxlIHZhbHVlIGlzIHRoZSBwb3NpdGl2ZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgdmFsdWUgYW5kIHRoZSBkb3VibGUKKyAgICAgKiB2YWx1ZSBuZXh0IGxhcmdlciBpbiBtYWduaXR1ZGUuIEZvciBub24tTmFOIHtAY29kZSB4fSwKKyAgICAgKiB7QGNvZGUgdWxwKC14KSA9PSB1bHAoeCl9LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgdWxwKCswLjApID0gRG91YmxlLk1JTl9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdWxwKC0wLjApID0gRG91YmxlLk1JTl9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdWxwKCtpbmZpbnRpeSkgPSBpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdWxwKC1pbmZpbnRpeSkgPSBpbmZpbml0eX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgdWxwKE5hTikgPSBOYU59PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlIHRvIGNvbXB1dGUgdWxwIG9mCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWUgdG8gY29tcHV0ZSB1bHAgb2YuCiAgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiBhIHVscCBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgdWxwKGRvdWJsZSBkKSB7CiAgICAgICAgIC8vIHNwZWNpYWwgY2FzZXMKQEAgLTYxNiwxMyArMTEwNywyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFyZ3VtZW50J3MgdWxwLiBUaGUgc2l6ZSBvZiBhIHVscCBvZiBhIGZsb2F0IHZhbHVlIGlzIHRoZQotICAgICAqIHBvc2l0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyB2YWx1ZSBhbmQgdGhlIGZsb2F0IHZhbHVlIG5leHQgbGFyZ2VyCi0gICAgICogaW4gbWFnbml0dWRlLiBGb3Igbm9uLU5hTiB4LCB1bHAoLXgpID09IHVscCh4KS4KKyAgICAgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCdzIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkuIFRoZSBzaXplIG9mIGEgdWxwIG9mCisgICAgICogYSBmbG9hdCB2YWx1ZSBpcyB0aGUgcG9zaXRpdmUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHZhbHVlIGFuZCB0aGUgZmxvYXQKKyAgICAgKiB2YWx1ZSBuZXh0IGxhcmdlciBpbiBtYWduaXR1ZGUuIEZvciBub24tTmFOIHtAY29kZSB4fSwKKyAgICAgKiB7QGNvZGUgdWxwKC14KSA9PSB1bHAoeCl9LgorICAgICAqIDxwPgorICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgdWxwKCswLjApID0gRmxvYXQuTUlOX1ZBTFVFfTwvbGk+CisgICAgICogPGxpPntAY29kZSB1bHAoLTAuMCkgPSBGbG9hdC5NSU5fVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscCgraW5maW50aXkpID0gaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscCgtaW5maW50aXkpID0gaW5maW5pdHl9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIHVscChOYU4pID0gTmFOfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdGluZy1wb2ludCB2YWx1ZSB0byBjb21wdXRlIHVscCBvZgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlIHRvIGNvbXB1dGUgdWxwIG9mLgogICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSB1bHAgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgdWxwKGZsb2F0IGYpIHsKICAgICAgICAgLy8gc3BlY2lhbCBjYXNlcwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpbmcuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaW5nLmphdmEKaW5kZXggN2VhZjBmNS4uYjI1N2EzNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpbmcuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0cmluZy5qYXZhCkBAIC0yMSw2ICsyMSw5IEBACiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCitpbXBvcnQgamF2YS51dGlsLklsbGVnYWxGb3JtYXRFeGNlcHRpb247CisvLyBFTkQgYW5kcm9pZC1hZGRlZAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKQEAgLTMzLDI3ICszNiwzMCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKIAorLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisvLyBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5WTTsKKy8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uOwogCiAvKioKLSAqIDxwPgotICogQW4gaW1tdXRhYmxlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMvY29kZSB1bml0cyAoPGNvZGU+Y2hhcjwvY29kZT5zKS4gQQotICogPGNvZGU+U3RyaW5nPC9jb2RlPiBpcyByZXByZXNlbnRlZCBieSBhcnJheSBvZiBVVEYtMTYgdmFsdWVzLCBzdWNoIHRoYXQKKyAqIEFuIGltbXV0YWJsZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzL2NvZGUgdW5pdHMgKHtAY29kZSBjaGFyfXMpLiBBCisgKiB7QGNvZGUgU3RyaW5nfSBpcyByZXByZXNlbnRlZCBieSBhcnJheSBvZiBVVEYtMTYgdmFsdWVzLCBzdWNoIHRoYXQKICAqIFVuaWNvZGUgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cykgYXJlIHN0b3JlZC9lbmNvZGVkIGFzCi0gKiBzdXJyb2dhdGUgcGFpcnMgdmlhIFVuaWNvZGUgY29kZSB1bml0cyAoPGNvZGU+Y2hhcjwvY29kZT4pCi0gKiA8L3A+CisgKiBzdXJyb2dhdGUgcGFpcnMgdmlhIFVuaWNvZGUgY29kZSB1bml0cyAoe0Bjb2RlIGNoYXJ9KS4KICAqCiAgKiBAc2VlIFN0cmluZ0J1ZmZlcgogICogQHNlZSBTdHJpbmdCdWlsZGVyCiAgKiBAc2VlIENoYXJzZXQKLSAqIEBzaW5jZSAxLjAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDb21wYXJhYmxlPFN0cmluZz4sCiAgICAgICAgIENoYXJTZXF1ZW5jZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjg0OTc5NDQ3MDc1NDY2NzcxMEw7CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBSRVBMQUNFTUVOVF9DSEFSID0gKGNoYXIpIDB4ZmZmZDsKKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAgICAgLyoqCiAgICAgICogQW4gUHJpbnRTdHJlYW0gdXNlZCBmb3IgU3lzdGVtLm91dCB3aGljaCBwZXJmb3JtcyB0aGUgY29ycmVjdCBjaGFyYWN0ZXIKQEAgLTc0LDcgKzgwLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZSBhIENvbnNvbGVQcmludFN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwgdXN1YWxseQogICAgICAgICAgKiBTeXN0ZW0ub3V0LgotICAgICAgICAgKgorICAgICAgICAgKiAKICAgICAgICAgICogQHBhcmFtIG91dAogICAgICAgICAgKiAgICAgICAgICAgIHRoZSBjb25zb2xlIE91dHB1dFN0cmVhbQogICAgICAgICAgKi8KQEAgLTg4LDcgKzk0LDcgQEAKICAgICAgICAgICogY2hhcmFjdGVyIGNvbnZlcnNpb24gdXNpbmcgdGhlIGNvbnNvbGUgY2hhcmFjdGVyIGNvbnZlcnRlci4KICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHN0cgotICAgICAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gY29udmVydAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gY29udmVydAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzdHIpIHsKQEAgLTEyMywxNSArMTI5LDE3IEBACiAgICAgICAgICAqICAgICAgICAgZXF1YWwsIGFuZCA+IDAgaWYgb2JqZWN0MSBpcyBncmVhdGVyCiAgICAgICAgICAqCiAgICAgICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICAgICAqICAgICAgICAgICAgICAgIHdoZW4gb2JqZWN0cyBhcmUgbm90IHRoZSBjb3JyZWN0IHR5cGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgb2JqZWN0cyBhcmUgbm90IHRoZSBjb3JyZWN0IHR5cGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbzEsIFN0cmluZyBvMikgewogICAgICAgICAgICAgcmV0dXJuIG8xLmNvbXBhcmVUb0lnbm9yZUNhc2UobzIpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBBIENvbXBhcmF0b3Igd2hpY2ggY29tcGFyZXMgU3RyaW5ncyBpZ25vcmluZyB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycy4KKyAgICAvKioKKyAgICAgKiBBIGNvbXBhcmF0b3IgaWdub3JpbmcgdGhlIGNhc2Ugb2YgdGhlIGNoYXJhY3RlcnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gQ0FTRV9JTlNFTlNJVElWRV9PUkRFUiA9IG5ldyBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKCk7CiAKQEAgLTE1Nyw3ICsxNjUsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcoKSB7CiAgICAgICAgIHZhbHVlID0gbmV3IGNoYXJbMF07CkBAIC0xNzUsNDggKzE4NSwzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBieXRlIGFycmF5IHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nIGFzCisgICAgICogQ29udmVydHMgdGhlIGJ5dGUgYXJyYXkgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcgYXMKICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGZpbGUuZW5jb2Rpbmcgc3lzdGVtIHByb3BlcnR5LiBJZiB0aGUgc3lzdGVtIHByb3BlcnR5IGlzCiAgICAgICogbm90IGRlZmluZWQsIHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIElTTzg4NTlfMSAoSVNPLUxhdGluLTEpLiBJZiA4ODU5LTEKICAgICAgKiBpcyBub3QgYXZhaWxhYmxlLCBhbiBBU0NJSSBlbmNvZGluZyBpcyB1c2VkLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBTdHJpbmcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGRhdGEgaXMgbnVsbAotICAgICAqCi0gICAgICogQHNlZSAjZ2V0Qnl0ZXMoKQotICAgICAqIEBzZWUgI2dldEJ5dGVzKGludCwgaW50LCBieXRlW10sIGludCkKLSAgICAgKiBAc2VlICNnZXRCeXRlcyhTdHJpbmcpCi0gICAgICogQHNlZSAjdmFsdWVPZihib29sZWFuKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoY2hhcikKLSAgICAgKiBAc2VlICN2YWx1ZU9mKGNoYXJbXSkKLSAgICAgKiBAc2VlICN2YWx1ZU9mKGNoYXJbXSwgaW50LCBpbnQpCi0gICAgICogQHNlZSAjdmFsdWVPZihkb3VibGUpCi0gICAgICogQHNlZSAjdmFsdWVPZihmbG9hdCkKLSAgICAgKiBAc2VlICN2YWx1ZU9mKGludCkKLSAgICAgKiBAc2VlICN2YWx1ZU9mKGxvbmcpCi0gICAgICogQHNlZSAjdmFsdWVPZihPYmplY3QpCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyhieXRlW10gZGF0YSkgewogICAgICAgICB0aGlzKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgYnl0ZSBhcnJheSB0byBhIFN0cmluZywgc2V0dGluZyB0aGUgaGlnaCBieXRlIG9mIGV2ZXJ5CisgICAgICogQ29udmVydHMgdGhlIGJ5dGUgYXJyYXkgdG8gYSBzdHJpbmcsIHNldHRpbmcgdGhlIGhpZ2ggYnl0ZSBvZiBldmVyeQogICAgICAqIGNoYXJhY3RlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuCiAgICAgICogQHBhcmFtIGhpZ2gKLSAgICAgKiAgICAgICAgICAgIHRoZSBoaWdoIGJ5dGUgdG8gdXNlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBkYXRhIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI1N0cmluZyhieXRlW10pfSBvciB7QGxpbmsgI1N0cmluZyhieXRlW10sIFN0cmluZyl9IGluc3RlYWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoaWdoIGJ5dGUgdG8gdXNlLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI1N0cmluZyhieXRlW10pfSBvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayAjU3RyaW5nKGJ5dGVbXSwgU3RyaW5nKX0gaW5zdGVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBTdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBoaWdoKSB7CkBAIC0yMjQsMzYgKzIxNiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBieXRlIGFycmF5IHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nIGFzCisgICAgICogQ29udmVydHMgdGhlIGJ5dGUgYXJyYXkgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcgYXMKICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGZpbGUuZW5jb2Rpbmcgc3lzdGVtIHByb3BlcnR5LiBJZiB0aGUgc3lzdGVtIHByb3BlcnR5IGlzCiAgICAgICogbm90IGRlZmluZWQsIHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIElTTzg4NTlfMSAoSVNPLUxhdGluLTEpLiBJZiA4ODU5LTEKICAgICAgKiBpcyBub3QgYXZhaWxhYmxlLCBhbiBBU0NJSSBlbmNvZGluZyBpcyB1c2VkLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBieXRlIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBieXRlIGFycmF5LgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydAotICAgICAqCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnZlcnQuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5sZW5ndGggPCAwLCBzdGFydCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+c3RhcnQgKyBsZW5ndGggPiBkYXRhLmxlbmd0aDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBkYXRhIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBzZWUgI2dldEJ5dGVzKCkKLSAgICAgKiBAc2VlICNnZXRCeXRlcyhpbnQsIGludCwgYnl0ZVtdLCBpbnQpCi0gICAgICogQHNlZSAjZ2V0Qnl0ZXMoU3RyaW5nKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoYm9vbGVhbikKLSAgICAgKiBAc2VlICN2YWx1ZU9mKGNoYXIpCi0gICAgICogQHNlZSAjdmFsdWVPZihjaGFyW10pCi0gICAgICogQHNlZSAjdmFsdWVPZihjaGFyW10sIGludCwgaW50KQotICAgICAqIEBzZWUgI3ZhbHVlT2YoZG91YmxlKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoZmxvYXQpCi0gICAgICogQHNlZSAjdmFsdWVPZihpbnQpCi0gICAgICogQHNlZSAjdmFsdWVPZihsb25nKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoT2JqZWN0KQorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsZW5ndGggPCAwLCBzdGFydCA8IDB9IG9yIHtAY29kZSBzdGFydCArIGxlbmd0aCA+CisgICAgICogICAgICAgICAgICAgZGF0YS5sZW5ndGh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBzdGFydCArIGxlbmd0aCBjb3VsZCBvdmVyZmxvdywgc3RhcnQvbGVuZ3RoIG1heWJlIE1heEludApAQCAtMjc2LDI1ICsyNTMsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgYnl0ZSBhcnJheSB0byBhIFN0cmluZywgc2V0dGluZyB0aGUgaGlnaCBieXRlIG9mIGV2ZXJ5CisgICAgICogQ29udmVydHMgdGhlIGJ5dGUgYXJyYXkgdG8gYSBzdHJpbmcsIHNldHRpbmcgdGhlIGhpZ2ggYnl0ZSBvZiBldmVyeQogICAgICAqIGNoYXJhY3RlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuCiAgICAgICogQHBhcmFtIGhpZ2gKLSAgICAgKiAgICAgICAgICAgIHRoZSBoaWdoIGJ5dGUgdG8gdXNlCisgICAgICogICAgICAgICAgICB0aGUgaGlnaCBieXRlIHRvIHVzZS4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIGJ5dGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIGJ5dGUgYXJyYXkuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBjb252ZXJ0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnZlcnQuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmxlbmd0aCA8IDAsIHN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5zdGFydCArIGxlbmd0aCA+IGRhdGEubGVuZ3RoPC9jb2RlPgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGRhdGEgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsZW5ndGggPCAwLCBzdGFydCA8IDB9IG9yCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHN0YXJ0ICsgbGVuZ3RoID4gZGF0YS5sZW5ndGh9CiAgICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNTdHJpbmcoYnl0ZVtdLCBpbnQsIGludCl9IGluc3RlYWQKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNTdHJpbmcoYnl0ZVtdLCBpbnQsIGludCl9IGluc3RlYWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgU3RyaW5nKGJ5dGVbXSBkYXRhLCBpbnQgaGlnaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CkBAIC0zMTcsMzggKzI5MywyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBieXRlIGFycmF5IHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCi0gICAgICoKKyAgICAgKiBDb252ZXJ0cyB0aGUgYnl0ZSBhcnJheSB0byBhIHN0cmluZyB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBjb252ZXJ0IHRvIGEgU3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBjb252ZXJ0IHRvIGEgc3RyaW5nLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgYnl0ZSBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgYnl0ZSBhcnJheS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnZlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydC4KICAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGluZwotICAgICAqCisgICAgICogICAgICAgICAgICB0aGUgZW5jb2RpbmcuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5sZW5ndGggPCAwLCBzdGFydCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+c3RhcnQgKyBsZW5ndGggPiBkYXRhLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbGVuZ3RoIDwgMCwgc3RhcnQgPCAwfSBvciB7QGNvZGUgc3RhcnQgKyBsZW5ndGggPgorICAgICAqICAgICAgICAgICAgIGRhdGEubGVuZ3RofS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBkYXRhIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBzZWUgI2dldEJ5dGVzKCkKLSAgICAgKiBAc2VlICNnZXRCeXRlcyhpbnQsIGludCwgYnl0ZVtdLCBpbnQpCi0gICAgICogQHNlZSAjZ2V0Qnl0ZXMoU3RyaW5nKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoYm9vbGVhbikKLSAgICAgKiBAc2VlICN2YWx1ZU9mKGNoYXIpCi0gICAgICogQHNlZSAjdmFsdWVPZihjaGFyW10pCi0gICAgICogQHNlZSAjdmFsdWVPZihjaGFyW10sIGludCwgaW50KQotICAgICAqIEBzZWUgI3ZhbHVlT2YoZG91YmxlKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoZmxvYXQpCi0gICAgICogQHNlZSAjdmFsdWVPZihpbnQpCi0gICAgICogQHNlZSAjdmFsdWVPZihsb25nKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoT2JqZWN0KQotICAgICAqIEBzZWUgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbmNvZGluZ30gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIGZpbmFsIFN0cmluZyBlbmNvZGluZykKICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKQEAgLTM1OCw3ICszMTgsNyBAQAogICAgICAgICAvLyBzdGFydCArIGxlbmd0aCBjb3VsZCBvdmVyZmxvdywgc3RhcnQvbGVuZ3RoIG1heWJlIE1heEludAogICAgICAgICBpZiAoc3RhcnQgPj0gMCAmJiAwIDw9IGxlbmd0aCAmJiBsZW5ndGggPD0gZGF0YS5sZW5ndGggLSBzdGFydCkgewogICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLQorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICAgICAgLy8gU3BlY2lhbC1jYXNlIElTTy04ODU4OS0xIGFuZCBVVEYgOCBkZWNvZGluZwogICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIklTTy04ODU5LTEiKSB8fAogICAgICAgICAgICAgICAgIGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIklTTzg4NTlfMSIpKSB7CkBAIC00NzYsNyArNDM2LDcgQEAKICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHYsIDAsIHZhbHVlLCAwLCBzKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBnZXRDaGFyc2V0KGVuY29kaW5nKTsKIAogICAgICAgICAgICAgaW50IHJlc3VsdDsKQEAgLTQ4NCw3ICs0NDQsNyBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBjYiA9IGNoYXJzZXQuZGVjb2RlKEJ5dGVCdWZmZXIud3JhcChkYXRhLCBzdGFydCwgbGVuZ3RoKSk7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIGFjY29yZGluZyB0byBzcGVjOgorICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIGFjY29yZGluZyB0byBzcGVjOiAKICAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciBpcyB1bnNwZWNpZmllZCBmb3IgaW52YWxpZCBhcnJheQogICAgICAgICAgICAgICAgIGNiID0gQ2hhckJ1ZmZlci53cmFwKCJcdTAwM2YiLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CkBAIC01MDEsNjggKzQ2MSw0OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBieXRlIGFycmF5IHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCi0gICAgICoKKyAgICAgKiBDb252ZXJ0cyB0aGUgYnl0ZSBhcnJheSB0byBhIHN0cmluZyB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBjb252ZXJ0IHRvIGEgU3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBjb252ZXJ0IHRvIGEgc3RyaW5nLgogICAgICAqIEBwYXJhbSBlbmNvZGluZwotICAgICAqICAgICAgICAgICAgdGhlIGVuY29kaW5nCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGluZy4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBkYXRhIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBzZWUgI2dldEJ5dGVzKCkKLSAgICAgKiBAc2VlICNnZXRCeXRlcyhpbnQsIGludCwgYnl0ZVtdLCBpbnQpCi0gICAgICogQHNlZSAjZ2V0Qnl0ZXMoU3RyaW5nKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoYm9vbGVhbikKLSAgICAgKiBAc2VlICN2YWx1ZU9mKGNoYXIpCi0gICAgICogQHNlZSAjdmFsdWVPZihjaGFyW10pCi0gICAgICogQHNlZSAjdmFsdWVPZihjaGFyW10sIGludCwgaW50KQotICAgICAqIEBzZWUgI3ZhbHVlT2YoZG91YmxlKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoZmxvYXQpCi0gICAgICogQHNlZSAjdmFsdWVPZihpbnQpCi0gICAgICogQHNlZSAjdmFsdWVPZihsb25nKQotICAgICAqIEBzZWUgI3ZhbHVlT2YoT2JqZWN0KQotICAgICAqIEBzZWUgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbmNvZGluZ30gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nKGJ5dGVbXSBkYXRhLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhkYXRhLCAwLCBkYXRhLmxlbmd0aCwgZW5jb2RpbmcpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgU3RyaW5nIHRvIGNvbnRhaW4gdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZAotICAgICAqIGNoYXJhY3RlciBhcnJheS4gTW9kaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYWZ0ZXIgY3JlYXRpbmcgdGhlIFN0cmluZwotICAgICAqIGhhcyBubyBlZmZlY3Qgb24gdGhlIFN0cmluZy4KLSAgICAgKgorICAgICAqIEluaXRpYWxpemVzIHRoaXMgc3RyaW5nIHRvIGNvbnRhaW4gdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIGNoYXJhY3RlciBhcnJheS4gTW9kaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN0cmluZworICAgICAqIGhhcyBubyBlZmZlY3Qgb24gdGhlIHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGRhdGEgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyhjaGFyW10gZGF0YSkgewogICAgICAgICB0aGlzKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIFN0cmluZyB0byBjb250YWluIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBpbiB0aGUKLSAgICAgKiBjaGFyYWN0ZXIgYXJyYXkuIE1vZGlmeWluZyB0aGUgY2hhcmFjdGVyIGFycmF5IGFmdGVyIGNyZWF0aW5nIHRoZSBTdHJpbmcKLSAgICAgKiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBTdHJpbmcuCi0gICAgICoKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHN0cmluZyB0byBjb250YWluIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBpbiB0aGUKKyAgICAgKiBjaGFyYWN0ZXIgYXJyYXkuIE1vZGlmeWluZyB0aGUgY2hhcmFjdGVyIGFycmF5IGFmdGVyIGNyZWF0aW5nIHRoZSBzdHJpbmcKKyAgICAgKiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIGNoYXJhY3RlciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgY2hhcmFjdGVyIGFycmF5LgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmxlbmd0aCA8IDAsIHN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5zdGFydCArIGxlbmd0aCA+IGRhdGEubGVuZ3RoPC9jb2RlPgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGRhdGEgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsZW5ndGggPCAwLCBzdGFydCA8IDB9IG9yIHtAY29kZSBzdGFydCArIGxlbmd0aCA+CisgICAgICogICAgICAgICAgICAgZGF0YS5sZW5ndGh9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyhjaGFyW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIHJhbmdlIGNoZWNrIGV2ZXJ5dGhpbmcgc28gYSBuZXcgY2hhcltdIGlzIG5vdCBjcmVhdGVkCkBAIC01ODgsMTAgKzUyOCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBhIGNvcHkgb2YgYW5vdGhlciBzdHJpbmcKLSAgICAgKgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU3RyaW5nfSB0aGF0IGlzIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIGNvcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gY29weS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgdmFsdWUgPSBzdHJpbmcudmFsdWU7CkBAIC02MDAsMTAgKzU0MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgZnJvbSB0aGUgY29udGVudHMgb2YgYSBTdHJpbmdCdWZmZXIuCi0gICAgICoKKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFN0cmluZ30gZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBTdHJpbmdCdWZmZXJ9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmdidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gZ2V0IHRoZSBjb250ZW50cyBmcm9tLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcoU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlcikgewogICAgICAgICBvZmZzZXQgPSAwOwpAQCAtNjE0LDI3ICs1NTcsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBmcm9tIHRoZSBzdWItYXJyYXkgb2YgVW5pY29kZSBjb2RlCi0gICAgICogcG9pbnRzLgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU3RyaW5nfSBmcm9tIHRoZSBzdWItYXJyYXkgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gY29kZVBvaW50cwotICAgICAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMgdG8gY29udmVydC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzIHRvIGNvbnZlcnQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgVGhlIGluY2x1c2l2ZSBpbmRleCBpbnRvIDxjb2RlPmNvZGVQb2ludHM8L2NvZGU+IHRvIGJlZ2luCisgICAgICogICAgICAgICAgICB0aGUgaW5jbHVzaXZlIGluZGV4IGludG8ge0Bjb2RlIGNvZGVQb2ludHN9IHRvIGJlZ2luCiAgICAgICogICAgICAgICAgICBjb252ZXJ0aW5nIGZyb20uCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGVsZW1lbnQgaW4gPGNvZGU+Y29kZVBvaW50czwvY29kZT4gdG8gY29weS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+Y29kZVBvaW50czwvY29kZT4gaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4ge0Bjb2RlIGNvZGVQb2ludHN9IHRvIGNvcHkuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mIDxjb2RlPmNvZGVQb2ludHM8L2NvZGU+IGFyZSBub3QKLSAgICAgKiAgICAgICAgICAgICB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzLgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgb2Yge0Bjb2RlIGNvZGVQb2ludHN9IGFyZSBub3QgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICBVbmljb2RlIGNvZGUgcG9pbnRzLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gb3IgPGNvZGU+Y291bnQ8L2NvZGU+IGFyZSBub3QKLSAgICAgKiAgICAgICAgICAgICB3aXRoaW4gdGhlIGJvdW5kcyBvZiA8Y29kZT5jb2RlUG9pbnRzPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gb3Ige0Bjb2RlIGNvdW50fSBhcmUgbm90IHdpdGhpbiB0aGUgYm91bmRzCisgICAgICogICAgICAgICAgICAgb2Yge0Bjb2RlIGNvZGVQb2ludHN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcoaW50W10gY29kZVBvaW50cywgaW50IG9mZnNldCwgaW50IGNvdW50KSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC02NTYsMTUgKzU5NCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZyb20gYSA8Y29kZT5TdHJpbmdCdWlsZGVyPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFN0cmluZ30gZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBTdHJpbmdCdWlsZGVyfS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc2IKLSAgICAgKiAgICAgICAgICAgIFRoZSBTdHJpbmdCdWlsZGVyIHRvIGNvcHkgZnJvbS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c2I8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU3RyaW5nQnVpbGRlcn0gdG8gY29weSB0aGUgY29udGVudHMgZnJvbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKICAgICAgICAgaWYgKHNiID09IG51bGwpIHsKQEAgLTY3Nyw3ICs2MTIsNyBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogQ3JlYXRlcyBhIHN0cmluZyB0aGF0IGlzIHMxICsgdjEuIE1heSBiZSB1c2VkIGJ5IEpJVCBjb2RlLgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU3RyaW5nfSB0aGF0IGlzIHMxICsgdjEuIE1heSBiZSB1c2VkIGJ5IEpJVCBjb2RlLgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgU3RyaW5nKFN0cmluZyBzMSwgaW50IHYxKSB7CkBAIC02OTQsMTUgKzYyOSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBpbiB0aGlzIFN0cmluZy4KLSAgICAgKgorICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBpbiB0aGlzIHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IGluIHRoaXMgc3RyaW5nCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBpbmRleAotICAgICAqCisgICAgICogICAgICAgICAgICB0aGUgemVyby1iYXNlZCBpbmRleCBpbiB0aGlzIHN0cmluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGluZGV4LgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+aW5kZXggPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmluZGV4ID49IGxlbmd0aCgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleCA8IDB9IG9yIHtAY29kZSBpbmRleCA+PSBsZW5ndGgoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewogICAgICAgICBpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IGNvdW50KSB7CkBAIC03MTIsMjUgKzY0NiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHRvIHRoaXMgU3RyaW5nIHVzaW5nIHRoZSBVbmljb2RlIHZhbHVlcyBvZgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoaXMgc3RyaW5nIHVzaW5nIHRoZSBVbmljb2RlIHZhbHVlcyBvZgogICAgICAqIHRoZSBjaGFyYWN0ZXJzLiBSZXR1cm5zIDAgaWYgdGhlIHN0cmluZ3MgY29udGFpbiB0aGUgc2FtZSBjaGFyYWN0ZXJzIGluCiAgICAgICogdGhlIHNhbWUgb3JkZXIuIFJldHVybnMgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoZSBmaXJzdCBub24tZXF1YWwKLSAgICAgKiBjaGFyYWN0ZXIgaW4gdGhpcyBTdHJpbmcgaGFzIGEgVW5pY29kZSB2YWx1ZSB3aGljaCBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogY2hhcmFjdGVyIGluIHRoaXMgc3RyaW5nIGhhcyBhIFVuaWNvZGUgdmFsdWUgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZQogICAgICAqIFVuaWNvZGUgdmFsdWUgb2YgdGhlIGNoYXJhY3RlciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogc3RyaW5nLCBvciBpZiB0aGlzIFN0cmluZyBpcyBhIHByZWZpeCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gUmV0dXJucyBhCi0gICAgICogcG9zaXRpdmUgaW50ZWdlciBpZiB0aGUgZmlyc3Qgbm9uLWVxdWFsIGNoYXJhY3RlciBpbiB0aGlzIFN0cmluZyBoYXMgYQorICAgICAqIHN0cmluZywgb3IgaWYgdGhpcyBzdHJpbmcgaXMgYSBwcmVmaXggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuIFJldHVybnMgYQorICAgICAqIHBvc2l0aXZlIGludGVnZXIgaWYgdGhlIGZpcnN0IG5vbi1lcXVhbCBjaGFyYWN0ZXIgaW4gdGhpcyBzdHJpbmcgaGFzIGEKICAgICAgKiBVbmljb2RlIHZhbHVlIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgVW5pY29kZSB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyIGF0Ci0gICAgICogdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcsIG9yIGlmIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGlzCi0gICAgICogYSBwcmVmaXggb2YgdGhlIHRoaXMgU3RyaW5nLgotICAgICAqCisgICAgICogdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcsIG9yIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzCisgICAgICogYSBwcmVmaXggb2YgdGhpcyBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBjb21wYXJlCi0gICAgICogQHJldHVybiAwIGlmIHRoZSBzdHJpbmdzIGFyZSBlcXVhbCwgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgU3RyaW5nIGlzCi0gICAgICogICAgICAgICBiZWZvcmUgdGhlIHNwZWNpZmllZCBTdHJpbmcsIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIFN0cmluZwotICAgICAqICAgICAgICAgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBTdHJpbmcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIHN0cmluZyBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiAwIGlmIHRoZSBzdHJpbmdzIGFyZSBlcXVhbCwgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgc3RyaW5nIGlzCisgICAgICogICAgICAgICBiZWZvcmUgdGhlIHNwZWNpZmllZCBzdHJpbmcsIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIHN0cmluZworICAgICAqICAgICAgICAgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oU3RyaW5nIHN0cmluZykgewogICAgICAgICAvLyBDb2RlIGFkYXB0ZWQgZnJvbSBLJlIsIHBnIDEwMQpAQCAtNzQ2LDEzICs2NzgsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSByZWNlaXZlciB0byB0aGUgc3BlY2lmaWVkIFN0cmluZyB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlCi0gICAgICogb3JkZXJpbmcgd2hlbiB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycyBpcyBpZ25vcmVkLgotICAgICAqCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhpcyBzdHJpbmcgdXNpbmcgdGhlIFVuaWNvZGUgdmFsdWVzIG9mCisgICAgICogdGhlIGNoYXJhY3RlcnMsIGlnbm9yaW5nIGNhc2UgZGlmZmVyZW5jZXMuIFJldHVybnMgMCBpZiB0aGUgc3RyaW5ncworICAgICAqIGNvbnRhaW4gdGhlIHNhbWUgY2hhcmFjdGVycyBpbiB0aGUgc2FtZSBvcmRlci4gUmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIKKyAgICAgKiBpZiB0aGUgZmlyc3Qgbm9uLWVxdWFsIGNoYXJhY3RlciBpbiB0aGlzIHN0cmluZyBoYXMgYSBVbmljb2RlIHZhbHVlIHdoaWNoCisgICAgICogaXMgbGVzcyB0aGFuIHRoZSBVbmljb2RlIHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgaWYgdGhpcyBzdHJpbmcgaXMgYSBwcmVmaXggb2YgdGhlIHNwZWNpZmllZAorICAgICAqIHN0cmluZy4gUmV0dXJucyBhIHBvc2l0aXZlIGludGVnZXIgaWYgdGhlIGZpcnN0IG5vbi1lcXVhbCBjaGFyYWN0ZXIgaW4KKyAgICAgKiB0aGlzIHN0cmluZyBoYXMgYSBVbmljb2RlIHZhbHVlIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgVW5pY29kZSB2YWx1ZQorICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcsIG9yIGlmIHRoZQorICAgICAqIHNwZWNpZmllZCBzdHJpbmcgaXMgYSBwcmVmaXggb2YgdGhpcyBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcKLSAgICAgKiBAcmV0dXJuIGFuIGludCA8IDAgaWYgdGhpcyBTdHJpbmcgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgU3RyaW5nLCAwIGlmCi0gICAgICogICAgICAgICB0aGV5IGFyZSBlcXVhbCwgYW5kID4gMCBpZiB0aGlzIFN0cmluZyBpcyBncmVhdGVyCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiAwIGlmIHRoZSBzdHJpbmdzIGFyZSBlcXVhbCwgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgc3RyaW5nIGlzCisgICAgICogICAgICAgICBiZWZvcmUgdGhlIHNwZWNpZmllZCBzdHJpbmcsIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIHN0cmluZworICAgICAqICAgICAgICAgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG9JZ25vcmVDYXNlKFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgaW50IG8xID0gb2Zmc2V0LCBvMiA9IHN0cmluZy5vZmZzZXQsIHJlc3VsdDsKQEAgLTc3MywxNSArNzE1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGVzIHRoaXMgU3RyaW5nIGFuZCB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLSAgICAgKgorICAgICAqIENvbmNhdGVuYXRlcyB0aGlzIHN0cmluZyBhbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwogICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBjb25jYXRlbmF0ZQotICAgICAqIEByZXR1cm4gYSBuZXcgU3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgU3RyaW5nIGFuZCB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCBTdHJpbmcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzdHJpbmcgaXMgbnVsbAorICAgICAqIEByZXR1cm4gYSBuZXcgc3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgc3RyaW5nIGFuZCB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBjb25jYXQoU3RyaW5nIHN0cmluZykgewogICAgICAgICBpZiAoc3RyaW5nLmNvdW50ID4gMCAmJiBjb3VudCA+IDApIHsKQEAgLTc5NSwzOSArNzM1LDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotICAgICAqIGFycmF5LiBNb2RpZnlpbmcgdGhlIGNoYXJhY3RlciBhcnJheSBhZnRlciBjcmVhdGluZyB0aGUgU3RyaW5nIGhhcyBubwotICAgICAqIGVmZmVjdCBvbiB0aGUgU3RyaW5nLgotICAgICAqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgorICAgICAqIGFycmF5LiBNb2RpZnlpbmcgdGhlIGNoYXJhY3RlciBhcnJheSBhZnRlciBjcmVhdGluZyB0aGUgc3RyaW5nIGhhcyBubworICAgICAqIGVmZmVjdCBvbiB0aGUgc3RyaW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gdGhlIG5ldyBTdHJpbmcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkYXRhIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29weVZhbHVlT2YoY2hhcltdIGRhdGEpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBhcnJheS4gTW9kaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYWZ0ZXIgY3JlYXRpbmcgdGhlIFN0cmluZyBoYXMgbm8KLSAgICAgKiBlZmZlY3Qgb24gdGhlIFN0cmluZy4KLSAgICAgKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhcnJheS4gTW9kaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN0cmluZyBoYXMgbm8KKyAgICAgKiBlZmZlY3Qgb24gdGhlIHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgY2hhcmFjdGVyIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZQotICAgICAqIEByZXR1cm4gdGhlIG5ldyBTdHJpbmcKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc3RyaW5nLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmxlbmd0aCA8IDAsIHN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5zdGFydCArIGxlbmd0aCA+IGRhdGEubGVuZ3RoPC9jb2RlPgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkYXRhIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbGVuZ3RoIDwgMCwgc3RhcnQgPCAwfSBvciB7QGNvZGUgc3RhcnQgKyBsZW5ndGggPgorICAgICAqICAgICAgICAgICAgIGRhdGEubGVuZ3RofS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5VmFsdWVPZihjaGFyW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRhdGEsIHN0YXJ0LCBsZW5ndGgpOwpAQCAtODU2LDMyICs3OTIsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGlzIFN0cmluZyB0byBkZXRlcm1pbmUgaWYgdGhlCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhpcyBzdHJpbmcgdG8gZGV0ZXJtaW5lIGlmIHRoZQogICAgICAqIHNwZWNpZmllZCBzdHJpbmcgaXMgYSBzdWZmaXguCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3VmZml4Ci0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGxvb2sgZm9yCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYSBzdWZmaXggb2YgdGhpcyBTdHJpbmcsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzdWZmaXggaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIHN1ZmZpeCB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHN1ZmZpeCBvZiB0aGlzIHN0cmluZywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVuZHNXaXRoKFN0cmluZyBzdWZmaXgpIHsKICAgICAgICAgcmV0dXJuIHJlZ2lvbk1hdGNoZXMoY291bnQgLSBzdWZmaXguY291bnQsIHN1ZmZpeCwgMCwgc3VmZml4LmNvdW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIFN0cmluZyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgYXJlCi0gICAgICogZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBTdHJpbmcgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJzCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBzdHJpbmcgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IGFyZQorICAgICAqIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Ygc3RyaW5nIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVycwogICAgICAqIGluIHRoZSBzYW1lIG9yZGVyLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgU3RyaW5nLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHN0cmluZywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTkxNCwxMyArODQ4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBTdHJpbmcgdG8gdGhpcyBTdHJpbmcgaWdub3JpbmcgdGhlIGNhc2Ugb2YgdGhlCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhpcyBzdHJpbmcgaWdub3JpbmcgdGhlIGNhc2Ugb2YgdGhlCiAgICAgICogY2hhcmFjdGVycyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBjb21wYXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGVxdWFsIHRvIHRoaXMgU3RyaW5nLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZXF1YWwgdG8gdGhpcyBzdHJpbmcsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgaWYgKHN0cmluZyA9PSB0aGlzKSB7CkBAIC05NDYsMTQgKzg4MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgU3RyaW5nIHRvIGEgYnl0ZSBlbmNvZGluZyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZyBhcworICAgICAqIENvbnZlcnRzIHRoaXMgc3RyaW5nIHRvIGEgYnl0ZSBhcnJheSB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZyBhcwogICAgICAqIHNwZWNpZmllZCBieSB0aGUgZmlsZS5lbmNvZGluZyBzeXN0ZW0gcHJvcGVydHkuIElmIHRoZSBzeXN0ZW0gcHJvcGVydHkgaXMKICAgICAgKiBub3QgZGVmaW5lZCwgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgSVNPODg1OV8xIChJU08tTGF0aW4tMSkuIElmIDg4NTktMQogICAgICAqIGlzIG5vdCBhdmFpbGFibGUsIGFuIEFTQ0lJIGVuY29kaW5nIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBieXRlIGFycmF5IGVuY29kaW5nIG9mIHRoaXMgU3RyaW5nCi0gICAgICoKLSAgICAgKiBAc2VlIFN0cmluZworICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgYXJyYXkgZW5jb2Rpbmcgb2YgdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBkZWZhdWx0Q2hhcnNldCgpLmVuY29kZSgKQEAgLTk2NCwyNSArODk4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBTdHJpbmcgdG8gYSBieXRlIGFycmF5LCBpZ25vcmluZyB0aGUgaGlnaCBvcmRlciBiaXRzIG9mCisgICAgICogQ29udmVydHMgdGhpcyBzdHJpbmcgdG8gYSBieXRlIGFycmF5LCBpZ25vcmluZyB0aGUgaGlnaCBvcmRlciBiaXRzIG9mCiAgICAgICogZWFjaCBjaGFyYWN0ZXIuCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgb2YgY2hhcmFjdGVycyB0byBjb3B5CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIGNoYXJhY3RlcnMgdG8gY29weS4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgZW5kaW5nIG9mZnNldCBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmRpbmcgb2Zmc2V0IG9mIGNoYXJhY3RlcnMgdG8gY29weS4KICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBieXRlIGFycmF5LgogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgYnl0ZSBhcnJheQotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gZGF0YSBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBieXRlIGFycmF5LgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4KLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5zdGFydCA8IDAsIGVuZCA+IGxlbmd0aCgpLCBpbmRleCA8IDAsIGVuZCAtIHN0YXJ0ID4gZGF0YS5sZW5ndGggLSBpbmRleDwvY29kZT4KLSAgICAgKgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9LCB7QGNvZGUgZW5kID4gbGVuZ3RoKCl9LCB7QGNvZGUgaW5kZXggPAorICAgICAqICAgICAgICAgICAgIDB9IG9yIHtAY29kZSBlbmQgLSBzdGFydCA+IGRhdGEubGVuZ3RoIC0gaW5kZXh9LgogICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldEJ5dGVzKCl9IG9yIHtAbGluayAjZ2V0Qnl0ZXMoU3RyaW5nKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGdldEJ5dGVzKGludCBzdGFydCwgaW50IGVuZCwgYnl0ZVtdIGRhdGEsIGludCBpbmRleCkgewpAQCAtMTAwMSwxNyArOTMyLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBTdHJpbmcgdG8gYSBieXRlIGVuY29kaW5nIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCi0gICAgICoKKyAgICAgKiBDb252ZXJ0cyB0aGlzIHN0cmluZyB0byBhIGJ5dGUgYXJyYXkgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGluZwotICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgYXJyYXkgZW5jb2Rpbmcgb2YgdGhpcyBTdHJpbmcKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIGVuY29kaW5nIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIGJ5dGUgYXJyYXkgb2YgdGhpcyBzdHJpbmcuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZAotICAgICAqCi0gICAgICogQHNlZSBTdHJpbmcKLSAgICAgKiBAc2VlIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGdldENoYXJzZXQoZW5jb2RpbmcpLmVuY29kZSgKQEAgLTEwNDAsMjMgKzk2OCwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgaW4gdGhpcyBTdHJpbmcgdG8gdGhlIGNoYXJhY3RlciBhcnJheQorICAgICAqIENvcGllcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcgdG8gdGhlIGNoYXJhY3RlciBhcnJheQogICAgICAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgb2YgY2hhcmFjdGVycyB0byBjb3B5CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIGNoYXJhY3RlcnMgdG8gY29weS4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgZW5kaW5nIG9mZnNldCBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmRpbmcgb2Zmc2V0IG9mIGNoYXJhY3RlcnMgdG8gY29weS4KICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gY2hhcmFjdGVyIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gY2hhcmFjdGVyIGFycmF5LgogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgY2hhcmFjdGVyIGFycmF5Ci0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIGNoYXJhY3RlciBhcnJheS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMCwgZW5kID4gbGVuZ3RoKCksCi0gICAgICogICAgICAgICAgICAgIHN0YXJ0ID4gZW5kLCBpbmRleCA8IDAsIGVuZCAtIHN0YXJ0ID4gYnVmZmVyLmxlbmd0aCAtIGluZGV4PC9jb2RlPgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGJ1ZmZlciBpcyBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBlbmQgPiBsZW5ndGgoKX0sIHtAY29kZSBzdGFydCA+CisgICAgICogICAgICAgICAgICAgZW5kfSwge0Bjb2RlIGluZGV4IDwgMH0sIHtAY29kZSBlbmQgLSBzdGFydCA+IGJ1ZmZlci5sZW5ndGggLQorICAgICAqICAgICAgICAgICAgIGluZGV4fQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldENoYXJzKGludCBzdGFydCwgaW50IGVuZCwgY2hhcltdIGJ1ZmZlciwgaW50IGluZGV4KSB7CiAgICAgICAgIC8vIE5PVEUgbGFzdCBjaGFyYWN0ZXIgbm90IGNvcGllZCEKQEAgLTEwODAsMTQgKzEwMDcsNiBAQAogICAgIH0KICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKgotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMTEwOSwxOSArMTAyOCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGluIHRoaXMgU3RyaW5nIGZvciB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCisgICAgICogU2VhcmNoZXMgaW4gdGhpcyBzdHJpbmcgZm9yIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KICAgICAgKiBUaGUgc2VhcmNoIGZvciB0aGUgY2hhcmFjdGVyIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBtb3ZlcyB0b3dhcmRzCi0gICAgICogdGhlIGVuZCBvZiB0aGlzIFN0cmluZy4KLSAgICAgKgorICAgICAqIHRoZSBlbmQgb2YgdGhpcyBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gZmluZAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgU3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIGNoYXJhY3RlciBpc24ndCBmb3VuZAotICAgICAqCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoaW50KQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKGludCwgaW50KQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKFN0cmluZykKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcsIGludCkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gZmluZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIHN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYgdGhlCisgICAgICogICAgICAgICBjaGFyYWN0ZXIgaXNuJ3QgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBpbmRleE9mKGludCBjKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMTE0MSwyMSArMTA1NiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGluIHRoaXMgU3RyaW5nIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuIFRoZQorICAgICAqIFNlYXJjaGVzIGluIHRoaXMgc3RyaW5nIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuIFRoZQogICAgICAqIHNlYXJjaCBmb3IgdGhlIGNoYXJhY3RlciBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIG1vdmVzIHRvd2FyZHMKLSAgICAgKiB0aGUgZW5kIG9mIHRoaXMgU3RyaW5nLgotICAgICAqCisgICAgICogdGhlIGVuZCBvZiB0aGlzIHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBmaW5kCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIGZpbmQuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0Ci0gICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyBTdHJpbmcgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIsIC0xIGlmIHRoZQotICAgICAqICAgICAgICAgY2hhcmFjdGVyIGlzbid0IGZvdW5kCi0gICAgICoKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihpbnQpCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoaW50LCBpbnQpCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoU3RyaW5nKQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKFN0cmluZywgaW50KQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIHN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYgdGhlCisgICAgICogICAgICAgICBjaGFyYWN0ZXIgaXNuJ3QgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBpbmRleE9mKGludCBjLCBpbnQgc3RhcnQpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0xMTc4LDIyICsxMDg5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgaW4gdGhpcyBTdHJpbmcgZm9yIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gVGhlCisgICAgICogU2VhcmNoZXMgaW4gdGhpcyBzdHJpbmcgZm9yIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gVGhlCiAgICAgICogc2VhcmNoIGZvciB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBtb3ZlcyB0b3dhcmRzIHRoZSBlbmQKLSAgICAgKiBvZiB0aGlzIFN0cmluZy4KLSAgICAgKgorICAgICAqIG9mIHRoaXMgc3RyaW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgU3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIHN0cmluZyBpc24ndCBmb3VuZAotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gc3RyaW5nIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKGludCkKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihpbnQsIGludCkKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcpCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoU3RyaW5nLCBpbnQpCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGZpbmQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbiB0aGlzCisgICAgICogICAgICAgICBzdHJpbmcsIC0xIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vdCBhIHN1YnN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGluZGV4T2YoU3RyaW5nIHN0cmluZykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTEyMjksMjQgKzExMzMsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZyBmb3IgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiBUaGUgc2VhcmNoCisgICAgICogU2VhcmNoZXMgaW4gdGhpcyBzdHJpbmcgZm9yIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gVGhlIHNlYXJjaAogICAgICAqIGZvciB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgbW92ZXMgdG93YXJkcyB0aGUgZW5kCi0gICAgICogb2YgdGhpcyBTdHJpbmcuCi0gICAgICoKKyAgICAgKiBvZiB0aGlzIHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3ViU3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGZpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIFN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZywgLTEgaWYgdGhlCi0gICAgICogICAgICAgICBzdHJpbmcgaXNuJ3QgZm91bmQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIHN0cmluZyBpcyBudWxsCi0gICAgICoKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihpbnQpCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoaW50LCBpbnQpCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoU3RyaW5nKQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKFN0cmluZywgaW50KQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIHRoaXMKKyAgICAgKiAgICAgICAgIHN0cmluZywgLTEgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbm90IGEgc3Vic3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaW5kZXhPZihTdHJpbmcgc3ViU3RyaW5nLCBpbnQgc3RhcnQpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0xMjg0LDMwICsxMTgxLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgYW4gaW50ZXJuYWwgdGFibGUgb2Ygc3RyaW5ncyBmb3IgYSBzdHJpbmcgZXF1YWwgdG8gdGhpcyBTdHJpbmcuCisgICAgICogU2VhcmNoZXMgYW4gaW50ZXJuYWwgdGFibGUgb2Ygc3RyaW5ncyBmb3IgYSBzdHJpbmcgZXF1YWwgdG8gdGhpcyBzdHJpbmcuCiAgICAgICogSWYgdGhlIHN0cmluZyBpcyBub3QgaW4gdGhlIHRhYmxlLCBpdCBpcyBhZGRlZC4gUmV0dXJucyB0aGUgc3RyaW5nCi0gICAgICogY29udGFpbmVkIGluIHRoZSB0YWJsZSB3aGljaCBpcyBlcXVhbCB0byB0aGlzIFN0cmluZy4gVGhlIHNhbWUgc3RyaW5nCisgICAgICogY29udGFpbmVkIGluIHRoZSB0YWJsZSB3aGljaCBpcyBlcXVhbCB0byB0aGlzIHN0cmluZy4gVGhlIHNhbWUgc3RyaW5nCiAgICAgICogb2JqZWN0IGlzIGFsd2F5cyByZXR1cm5lZCBmb3Igc3RyaW5ncyB3aGljaCBhcmUgZXF1YWwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcm5lZCBzdHJpbmcgZXF1YWwgdG8gdGhpcyBTdHJpbmcKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcm5lZCBzdHJpbmcgZXF1YWwgdG8gdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgbmF0aXZlIHB1YmxpYyBTdHJpbmcgaW50ZXJuKCk7CiAKIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGluIHRoaXMgU3RyaW5nIGZvciB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KKyAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIHN0cmluZyBmb3IgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogVGhlIHNlYXJjaCBmb3IgdGhlIGNoYXJhY3RlciBzdGFydHMgYXQgdGhlIGVuZCBhbmQgbW92ZXMgdG93YXJkcyB0aGUKLSAgICAgKiBiZWdpbm5pbmcgb2YgdGhpcyBTdHJpbmcuCi0gICAgICoKKyAgICAgKiBiZWdpbm5pbmcgb2YgdGhpcyBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gZmluZAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgU3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIGNoYXJhY3RlciBpc24ndCBmb3VuZAotICAgICAqCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoaW50KQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKGludCwgaW50KQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKFN0cmluZykKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcsIGludCkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gZmluZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIHN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYgdGhlCisgICAgICogICAgICAgICBjaGFyYWN0ZXIgaXNuJ3QgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihpbnQgYykgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTEzMjQsMjEgKzEyMTgsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZyBmb3IgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLiBUaGUKKyAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIHN0cmluZyBmb3IgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLiBUaGUKICAgICAgKiBzZWFyY2ggZm9yIHRoZSBjaGFyYWN0ZXIgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGFuZCBtb3ZlcyB0b3dhcmRzCi0gICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGlzIFN0cmluZy4KLSAgICAgKgorICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gZmluZAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBmaW5kLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgU3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIGNoYXJhY3RlciBpc24ndCBmb3VuZAotICAgICAqCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoaW50KQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKGludCwgaW50KQotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKFN0cmluZykKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcsIGludCkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyBzdHJpbmcgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIsIC0xIGlmIHRoZQorICAgICAqICAgICAgICAgY2hhcmFjdGVyIGlzbid0IGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoaW50IGMsIGludCBzdGFydCkgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKQEAgLTEzNjAsMjIgKzEyNTAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZyBmb3IgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuIFRoZQorICAgICAqIFNlYXJjaGVzIGluIHRoaXMgc3RyaW5nIGZvciB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gVGhlCiAgICAgICogc2VhcmNoIGZvciB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgZW5kIGFuZCBtb3ZlcyB0b3dhcmRzIHRoZSBiZWdpbm5pbmcKLSAgICAgKiBvZiB0aGlzIFN0cmluZy4KLSAgICAgKgorICAgICAqIG9mIHRoaXMgc3RyaW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgU3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIHN0cmluZyBpc24ndCBmb3VuZAotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gc3RyaW5nIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKGludCkKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihpbnQsIGludCkKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcpCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoU3RyaW5nLCBpbnQpCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGZpbmQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbiB0aGlzCisgICAgICogICAgICAgICBzdHJpbmcsIC0xIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vdCBhIHN1YnN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgLy8gVXNlIGNvdW50IGluc3RlYWQgb2YgY291bnQgLSAxIHNvIGxhc3RJbmRleE9mKCIiKSByZXR1cm5zIGNvdW50CkBAIC0xMzgzLDI0ICsxMjY2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgaW4gdGhpcyBTdHJpbmcgZm9yIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gVGhlIHNlYXJjaAorICAgICAqIFNlYXJjaGVzIGluIHRoaXMgc3RyaW5nIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuIFRoZSBzZWFyY2gKICAgICAgKiBmb3IgdGhlIHN0cmluZyBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIG1vdmVzIHRvd2FyZHMgdGhlCi0gICAgICogYmVnaW5uaW5nIG9mIHRoaXMgU3RyaW5nLgotICAgICAqCisgICAgICogYmVnaW5uaW5nIG9mIHRoaXMgc3RyaW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdWJTdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBmaW5kLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgU3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIHN0cmluZyBpc24ndCBmb3VuZAotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gc3RyaW5nIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKGludCkKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihpbnQsIGludCkKLSAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihTdHJpbmcpCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoU3RyaW5nLCBpbnQpCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0LgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW4gdGhpcworICAgICAqICAgICAgICAgc3RyaW5nICwgLTEgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbm90IGEgc3Vic3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoU3RyaW5nIHN1YlN0cmluZywgaW50IHN0YXJ0KSB7CiAgICAgICAgIGludCBzdWJDb3VudCA9IHN1YlN0cmluZy5jb3VudDsKQEAgLTE0MzUsMzAgKzEzMTEsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgU3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBTdHJpbmcKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgc3RyaW5nLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhpcyBTdHJpbmcgYW5kIGNvbXBhcmVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGlzIHN0cmluZyBhbmQgY29tcGFyZXMgdGhlIHNwZWNpZmllZAogICAgICAqIHJhbmdlIG9mIGNoYXJhY3RlcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHRoZSBzYW1lLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHRoaXNTdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGlzIFN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGlzIHN0cmluZy4KICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gY29tcGFyZS4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb21wYXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByYW5nZXMgb2YgY2hhcmFjdGVycyBpcyBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBzdHJpbmcgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJhbmdlcyBvZiBjaGFyYWN0ZXJzIGFyZSBlcXVhbCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgdGhpc1N0YXJ0LCBTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQsCiAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CkBAIC0xNDg4LDI0ICsxMzY0LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhpcyBTdHJpbmcgYW5kIGNvbXBhcmVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGlzIHN0cmluZyBhbmQgY29tcGFyZXMgdGhlIHNwZWNpZmllZAogICAgICAqIHJhbmdlIG9mIGNoYXJhY3RlcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHRoZSBzYW1lLiBXaGVuIGlnbm9yZUNhc2UgaXMKICAgICAgKiB0cnVlLCB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycyBpcyBpZ25vcmVkIGR1cmluZyB0aGUgY29tcGFyaXNvbi4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlCi0gICAgICogICAgICAgICAgICBzcGVjaWZpZXMgaWYgY2FzZSBzaG91bGQgYmUgaWdub3JlZAorICAgICAqICAgICAgICAgICAgc3BlY2lmaWVzIGlmIGNhc2Ugc2hvdWxkIGJlIGlnbm9yZWQuCiAgICAgICogQHBhcmFtIHRoaXNTdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGlzIFN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGlzIHN0cmluZy4KICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gY29tcGFyZS4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb21wYXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByYW5nZXMgb2YgY2hhcmFjdGVycyBpcyBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBzdHJpbmcgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJhbmdlcyBvZiBjaGFyYWN0ZXJzIGFyZSBlcXVhbCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoYm9vbGVhbiBpZ25vcmVDYXNlLCBpbnQgdGhpc1N0YXJ0LAogICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CkBAIC0xNTQyLDE0ICsxNDE3LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29waWVzIHRoaXMgU3RyaW5nIHJlcGxhY2luZyBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB3aXRoCisgICAgICogQ29waWVzIHRoaXMgc3RyaW5nIHJlcGxhY2luZyBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB3aXRoCiAgICAgICogYW5vdGhlciBjaGFyYWN0ZXIuCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gb2xkQ2hhcgotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byByZXBsYWNlCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCiAgICAgICogQHBhcmFtIG5ld0NoYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyB3aXRoIG9jY3VycmVuY2VzIG9mIG9sZENoYXIgcmVwbGFjZWQgYnkgbmV3Q2hhcgorICAgICAqICAgICAgICAgICAgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHN0cmluZyB3aXRoIG9jY3VycmVuY2VzIG9mIG9sZENoYXIgcmVwbGFjZWQgYnkgbmV3Q2hhci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHJlcGxhY2UoY2hhciBvbGRDaGFyLCBjaGFyIG5ld0NoYXIpIHsKICAgICAgICAgLy8gQkVHSU4gZW5kcm9pZC1jaGFuZ2VkCkBAIC0xNTc4LDIwICsxNDU0LDE4IEBACiAgICAgICAgIHJldHVybiBjb3BpZWQgPyBuZXcgU3RyaW5nKDAsIGNvdW50LCBidWZmZXIpIDogdGhpczsKICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KLQorICAgIAogICAgIC8qKgotICAgICAqIENvcGllcyB0aGlzIFN0cmluZyByZXBsYWNpbmcgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHRhcmdldCBzZXF1ZW5jZSB3aXRoIGFub3RoZXIgc2VxdWVuY2UuCi0gICAgICogVGhlIHN0cmluZyBpcyBwcm9jZXNzZWQgZnJvbSB0aGUgYmVnaW5uaW5nIHRvIHRoZSBlbmQuCi0gICAgICoKKyAgICAgKiBDb3BpZXMgdGhpcyBzdHJpbmcgcmVwbGFjaW5nIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHNlcXVlbmNlCisgICAgICogd2l0aCBhbm90aGVyIHNlcXVlbmNlLiBUaGUgc3RyaW5nIGlzIHByb2Nlc3NlZCBmcm9tIHRoZSBiZWdpbm5pbmcgdG8gdGhlCisgICAgICogZW5kLgorICAgICAqIAogICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZXF1ZW5jZSB0byByZXBsYWNlCisgICAgICogICAgICAgICAgICB0aGUgc2VxdWVuY2UgdG8gcmVwbGFjZS4KICAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXBsYWNlbWVudCBzZXF1ZW5jZQotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIG9mIHRoZSBhcmd1bWVudHMKLSAgICAgKiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIHJlcGxhY2VtZW50IHNlcXVlbmNlLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyByZXBsYWNlKENoYXJTZXF1ZW5jZSB0YXJnZXQsIENoYXJTZXF1ZW5jZSByZXBsYWNlbWVudCkgewogICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKQEAgLTE2MTUsNTcgKzE0ODksNTIgQEAKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocnMpOwogICAgICAgICAgICAgdGFpbCA9IGluZGV4ICsgdGw7CiAgICAgICAgIH0gd2hpbGUgKChpbmRleCA9IGluZGV4T2YodHMsIHRhaWwpKSAhPSAtMSk7Ci0gICAgICAgIC8vYXBwZW5kIHRyYWlsaW5nIGNoYXJzCisgICAgICAgIC8vYXBwZW5kIHRyYWlsaW5nIGNoYXJzIAogICAgICAgICBidWZmZXIuYXBwZW5kKHZhbHVlLCBvZmZzZXQgKyB0YWlsLCBjb3VudCAtIHRhaWwpOwogCiAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGlzIFN0cmluZyB0byBkZXRlcm1pbmUgaWYgdGhlCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhpcyBzdHJpbmcgdG8gZGV0ZXJtaW5lIGlmIHRoZQogICAgICAqIHNwZWNpZmllZCBzdHJpbmcgaXMgYSBwcmVmaXguCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGxvb2sgZm9yCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYSBwcmVmaXggb2YgdGhpcyBTdHJpbmcsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIHByZWZpeCBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgcHJlZml4IG9mIHRoaXMgc3RyaW5nLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgocHJlZml4LCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGlzIFN0cmluZywgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZAorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoaXMgc3RyaW5nLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkCiAgICAgICogb2Zmc2V0LCB0byBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYSBwcmVmaXguCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGxvb2sgZm9yCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGxvb2sgZm9yLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9jY3VycyBpbiB0aGlzIFN0cmluZyBhdCB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCBvZmZzZXQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gcHJlZml4IGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgb2NjdXJzIGluIHRoaXMgc3RyaW5nIGF0IHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIG9mZnNldCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChTdHJpbmcgcHJlZml4LCBpbnQgc3RhcnQpIHsKICAgICAgICAgcmV0dXJuIHJlZ2lvbk1hdGNoZXMoc3RhcnQsIHByZWZpeCwgMCwgcHJlZml4LmNvdW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb3BpZXMgYSByYW5nZSBvZiBjaGFyYWN0ZXJzIGludG8gYSBuZXcgU3RyaW5nLgotICAgICAqCisgICAgICogQ29waWVzIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbnRvIGEgbmV3IHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gYSBuZXcgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgZnJvbSBzdGFydCB0byB0aGUgZW5kIG9mCi0gICAgICogICAgICAgICB0aGUgc3RyaW5nCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGZyb20gc3RhcnQgdG8gdGhlIGVuZCBvZgorICAgICAqICAgICAgICAgdGhlIHN0cmluZy4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5zdGFydCA+IGxlbmd0aCgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBzdGFydCA+IGxlbmd0aCgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHN1YnN0cmluZyhpbnQgc3RhcnQpIHsKICAgICAgICAgaWYgKHN0YXJ0ID09IDApIHsKQEAgLTE2NzgsMTcgKzE1NDcsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb3BpZXMgYSByYW5nZSBvZiBjaGFyYWN0ZXJzIGludG8gYSBuZXcgU3RyaW5nLgotICAgICAqCisgICAgICogQ29waWVzIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbnRvIGEgbmV3IHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb25lIHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiBhIG5ldyBTdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyBmcm9tIHN0YXJ0IHRvIGVuZCAtIDEKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIuCisgICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyBmcm9tIHN0YXJ0IHRvIGVuZCAtIDEKICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMCwgc3RhcnQgPiBlbmQ8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+ZW5kID4gbGVuZ3RoKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBzdGFydCA+IGVuZH0gb3Ige0Bjb2RlIGVuZCA+CisgICAgICogICAgICAgICAgICAgbGVuZ3RoKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gY291bnQpIHsKQEAgLTE3MDMsOSArMTU3MiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZyB0byBhIGNoYXJhY3RlciBhcnJheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyBvZiB0aGlzIFN0cmluZworICAgICAqIENvcGllcyB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIHN0cmluZyB0byBhIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgb2YgdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXJbXSB0b0NoYXJBcnJheSgpIHsKICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW2NvdW50XTsKQEAgLTE3MTQsMjQgKzE1ODQsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZyB0byBsb3dlcmNhc2UsIHVzaW5nIHRoZSBkZWZhdWx0CisgICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcgdG8gbG93ZXJjYXNlLCB1c2luZyB0aGUgZGVmYXVsdAogICAgICAqIExvY2FsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGVxdWl2YWxlbnQgdG8KLSAgICAgKiAgICAgICAgIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgU3RyaW5nCisgICAgICogCisgICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgbG93ZXJjYXNlIGNoYXJhY3RlcnMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b0xvd2VyQ2FzZSgpIHsKICAgICAgICAgcmV0dXJuIHRvTG93ZXJDYXNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgU3RyaW5nIHRvIGxvd2VyY2FzZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nIHRvIGxvd2VyY2FzZSwgdXNpbmcgdGhlIHNwZWNpZmllZAogICAgICAqIExvY2FsZS4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyBjb250YWluaW5nIHRoZSBsb3dlcmNhc2UgY2hhcmFjdGVycyBlcXVpdmFsZW50IHRvCi0gICAgICogICAgICAgICB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZSB0byB1c2UuCisgICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgbG93ZXJjYXNlIGNoYXJhY3RlcnMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b0xvd2VyQ2FzZShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGZvciAoaW50IG8gPSBvZmZzZXQsIGVuZCA9IG9mZnNldCArIGNvdW50OyBvIDwgZW5kOyBvKyspIHsKQEAgLTE3NTksMTAgKzE2MzEsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIHRoaXMgc3RyaW5nLgogICAgICAqCi0gICAgICogQHJldHVybiB0aGlzIFN0cmluZworICAgICAqIEByZXR1cm4gdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTE3NzAsMTEgKzE2NDIsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZyB0byB1cHBlcmNhc2UsIHVzaW5nIHRoZSBkZWZhdWx0CisgICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcgdG8gdXBwZXJjYXNlLCB1c2luZyB0aGUgZGVmYXVsdAogICAgICAqIExvY2FsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGVxdWl2YWxlbnQgdG8KLSAgICAgKiAgICAgICAgIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgU3RyaW5nCisgICAgICogCisgICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1VwcGVyQ2FzZSgpIHsKICAgICAgICAgcmV0dXJuIHRvVXBwZXJDYXNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwpAQCAtMTg0MSwxMyArMTcxNCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgU3RyaW5nIHRvIHVwcGVyY2FzZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nIHRvIHVwcGVyY2FzZSwgdXNpbmcgdGhlIHNwZWNpZmllZAogICAgICAqIExvY2FsZS4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyBjb250YWluaW5nIHRoZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBlcXVpdmFsZW50IHRvCi0gICAgICogICAgICAgICB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZSB0byB1c2UuCisgICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1VwcGVyQ2FzZShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGJvb2xlYW4gdHVya2lzaCA9ICJ0ciIuZXF1YWxzKGxvY2FsZS5nZXRMYW5ndWFnZSgpKTsgLy8kTk9OLU5MUy0xJApAQCAtMTkwNiwxMSArMTc4MCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyB0aGlzIFN0cmluZyByZW1vdmluZyB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGJlZ2lubmluZyBhbmQKKyAgICAgKiBDb3BpZXMgdGhpcyBzdHJpbmcgcmVtb3Zpbmcgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kCiAgICAgICogZW5kIG9mIHRoZSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyB3aXRoIGNoYXJhY3RlcnMgPGNvZGU+PD0gXFx1MDAyMDwvY29kZT4gcmVtb3ZlZAotICAgICAqICAgICAgICAgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kCisgICAgICogCisgICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgd2l0aCBjaGFyYWN0ZXJzIDxjb2RlPjw9IFxcdTAwMjA8L2NvZGU+IHJlbW92ZWQgZnJvbQorICAgICAqICAgICAgICAgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRyaW0oKSB7CiAgICAgICAgIGludCBzdGFydCA9IG9mZnNldCwgbGFzdCA9IG9mZnNldCArIGNvdW50IC0gMTsKQEAgLTE5MjgsMzkgKzE4MDMsMzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0gICAgICogYXJyYXkuIE1vZGlmeWluZyB0aGUgY2hhcmFjdGVyIGFycmF5IGFmdGVyIGNyZWF0aW5nIHRoZSBTdHJpbmcgaGFzIG5vCi0gICAgICogZWZmZWN0IG9uIHRoZSBTdHJpbmcuCi0gICAgICoKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCisgICAgICogYXJyYXkuIE1vZGlmeWluZyB0aGUgY2hhcmFjdGVyIGFycmF5IGFmdGVyIGNyZWF0aW5nIHRoZSBzdHJpbmcgaGFzIG5vCisgICAgICogZWZmZWN0IG9uIHRoZSBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzCi0gICAgICogQHJldHVybiB0aGUgbmV3IFN0cmluZwotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gZGF0YSBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbHVlT2YoY2hhcltdIGRhdGEpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBhcnJheS4gTW9kaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYWZ0ZXIgY3JlYXRpbmcgdGhlIFN0cmluZyBoYXMgbm8KLSAgICAgKiBlZmZlY3Qgb24gdGhlIFN0cmluZy4KLSAgICAgKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhcnJheS4gTW9kaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN0cmluZyBoYXMgbm8KKyAgICAgKiBlZmZlY3Qgb24gdGhlIHN0cmluZy4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgY2hhcmFjdGVyIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZQotICAgICAqIEByZXR1cm4gdGhlIG5ldyBTdHJpbmcKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc3RyaW5nLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+bGVuZ3RoIDwgMCwgc3RhcnQgPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPnN0YXJ0ICsgbGVuZ3RoID4gZGF0YS5sZW5ndGg8L2NvZGU+Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gZGF0YSBpcyBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxlbmd0aCA8IDB9LCB7QGNvZGUgc3RhcnQgPCAwfSBvciB7QGNvZGUgc3RhcnQgKworICAgICAqICAgICAgICAgICAgIGxlbmd0aCA+IGRhdGEubGVuZ3RofQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbHVlT2YoY2hhcltdIGRhdGEsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhLCBzdGFydCwgbGVuZ3RoKTsKQEAgLTE5NjgsMTAgKzE4MzksMTEgQEAKIAogICAgIC8qKgogICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgY29udmVydGVkIHRvIGEgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyLgorICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsdWVPZihjaGFyIHZhbHVlKSB7CiAgICAgICAgIFN0cmluZyBzOwpAQCAtMTk4NiwxMCArMTg1OCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBkb3VibGUgdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZQotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUuCisgICAgICogQHJldHVybiB0aGUgZG91YmxlIGNvbnZlcnRlZCB0byBhIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2YWx1ZU9mKGRvdWJsZSB2YWx1ZSkgewogICAgICAgICByZXR1cm4gRG91YmxlLnRvU3RyaW5nKHZhbHVlKTsKQEAgLTE5OTcsMTAgKzE4NzAsMTEgQEAKIAogICAgIC8qKgogICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgZmxvYXQgdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0Ci0gICAgICogQHJldHVybiB0aGUgZmxvYXQgY29udmVydGVkIHRvIGEgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgY29udmVydGVkIHRvIGEgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbHVlT2YoZmxvYXQgdmFsdWUpIHsKICAgICAgICAgcmV0dXJuIEZsb2F0LnRvU3RyaW5nKHZhbHVlKTsKQEAgLTIwMDgsMTAgKzE4ODIsMTEgQEAKIAogICAgIC8qKgogICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0byBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaW50ZWdlcgotICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgY29udmVydGVkIHRvIGEgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIGNvbnZlcnRlZCB0byBhIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2YWx1ZU9mKGludCB2YWx1ZSkgewogICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyh2YWx1ZSk7CkBAIC0yMDE5LDEwICsxODk0LDExIEBACiAKICAgICAvKioKICAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGxvbmcgdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBsb25nIGNvbnZlcnRlZCB0byBhIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIGxvbmcuCisgICAgICogQHJldHVybiB0aGUgbG9uZyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsdWVPZihsb25nIHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHZhbHVlKTsKQEAgLTIwMzAsMTIgKzE5MDYsMTMgQEAKIAogICAgIC8qKgogICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uIElmIHRoZSBvYmplY3QKLSAgICAgKiBpcyBudWxsIHJldHVybiB0aGUgc3RyaW5nIDxjb2RlPiJudWxsIjwvY29kZT4sIG90aGVyd2lzZSB1c2UKLSAgICAgKiA8Y29kZT50b1N0cmluZygpPC9jb2RlPiB0byBnZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKgorICAgICAqIGlzIG51bGwgcmV0dXJuIHRoZSBzdHJpbmcge0Bjb2RlICJudWxsIn0sIG90aGVyd2lzZSB1c2Uge0Bjb2RlCisgICAgICogdG9TdHJpbmcoKX0gdG8gZ2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBhIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgY29udmVydGVkIHRvIGEgc3RyaW5nLCBvciB0aGUgc3RyaW5nIHtAY29kZSAibnVsbCJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJApAQCAtMjA0MywzMCArMTkyMCwyOCBAQAogCiAgICAgLyoqCiAgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBib29sZWFuIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFdoZW4gdGhlCi0gICAgICogYm9vbGVhbiBpcyB0cnVlIHJldHVybiA8Y29kZT4idHJ1ZSI8L2NvZGU+LCBvdGhlcndpc2UgcmV0dXJuCi0gICAgICogPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0gICAgICoKKyAgICAgKiBib29sZWFuIGlzIHtAY29kZSB0cnVlfSByZXR1cm4ge0Bjb2RlICJ0cnVlIn0sIG90aGVyd2lzZSByZXR1cm4ge0Bjb2RlCisgICAgICogImZhbHNlIn0uCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbgotICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gY29udmVydGVkIHRvIGEgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuIGNvbnZlcnRlZCB0byBhIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2YWx1ZU9mKGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBTdHJpbmdCdWZmZXIgc3RyYnVmIGFyZSB0aGUgc2FtZSBhcwotICAgICAqIHRob3NlIGluIHRoaXMgU3RyaW5nLgotICAgICAqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBTdHJpbmdCdWZmZXIge0Bjb2RlIHN0cmJ1Zn0gYXJlIHRoZQorICAgICAqIHNhbWUgYXMgdGhvc2UgaW4gdGhpcyBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIHN0cmJ1ZgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlciB0byBjb21wYXJlIHRoaXMgU3RyaW5nIHRvCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGNoYXJhY3RlcnMgaW4gc3RyYnVmIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgaW4gdGhpcwotICAgICAqICAgICAgICAgU3RyaW5nLiBJZiB0aGV5IGFyZSBub3QsIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBzdHJidWYgaXMgbnVsbAotICAgICAqCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlciB0byBjb21wYXJlIHRoaXMgc3RyaW5nIHRvLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjaGFyYWN0ZXJzIGluIHtAY29kZSBzdHJidWZ9IGFyZSBpZGVudGljYWwgdG8KKyAgICAgKiAgICAgICAgIHRob3NlIGluIHRoaXMgc3RyaW5nLiBJZiB0aGV5IGFyZSBub3QsIHtAY29kZSBmYWxzZX0gd2lsbCBiZQorICAgICAqICAgICAgICAgcmV0dXJuZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGVudEVxdWFscyhTdHJpbmdCdWZmZXIgc3RyYnVmKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc3RyYnVmKSB7CkBAIC0yMDgwLDE1ICsxOTU1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29tcGFyZXMgYSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHRvIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiB0bwotICAgICAqIGRldGVybWluZSBpZiB0aGVpciBjb250ZW50cyBhcmUgZXF1YWwuCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogQ29tcGFyZXMgYSB7QGNvZGUgQ2hhclNlcXVlbmNlfSB0byB0aGlzIHtAY29kZSBTdHJpbmd9IHRvIGRldGVybWluZSBpZgorICAgICAqIHRoZWlyIGNvbnRlbnRzIGFyZSBlcXVhbC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gY3MKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gY29tcGFyZSB0by4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVxdWFsLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBjb21wYXJlIHRvLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGVxdWFsLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRlbnRFcXVhbHMoQ2hhclNlcXVlbmNlIGNzKSB7CiAgICAgICAgIGlmIChjcyA9PSBudWxsKSB7CkBAIC0yMTA5LDkzICsxOTgyLDkxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgdGhpcyBTdHJpbmcgbWF0Y2hlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIHN0cmluZyBtYXRjaGVzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLgorICAgICAqIAogICAgICAqIEBwYXJhbSBleHByCi0gICAgICogICAgICAgICAgICB0aGUgcmVndWxhciBleHByZXNzaW9uIHRvIGJlIG1hdGNoZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gbWF0Y2hlcywgb3RoZXJ3aXNlIGZhbHNlCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgbWF0Y2hlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZXhwcmVzc2lvbiBtYXRjaGVzLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3ludGF4IG9mIHRoZSBzdXBwbGllZCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbm90IHZhbGlkCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGV4cHIgaXMgbnVsbAotICAgICAqCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzeW50YXggb2YgdGhlIHN1cHBsaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICB2YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBleHByKSB7CiAgICAgICAgIHJldHVybiBQYXR0ZXJuLm1hdGNoZXMoZXhwciwgdGhpcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZSBhbnkgc3Vic3RyaW5ncyB3aXRoaW4gdGhpcyBTdHJpbmcgdGhhdCBtYXRjaCB0aGUgc3VwcGxpZWQgcmVndWxhcgotICAgICAqIGV4cHJlc3Npb24gZXhwciwgd2l0aCB0aGUgU3RyaW5nIHN1YnN0aXR1dGUuCi0gICAgICoKKyAgICAgKiBSZXBsYWNlIGFueSBzdWJzdHJpbmdzIHdpdGhpbiB0aGlzIHN0cmluZyB0aGF0IG1hdGNoIHRoZSBzdXBwbGllZCByZWd1bGFyCisgICAgICogZXhwcmVzc2lvbiB7QGNvZGUgZXhwcn0sIHdpdGggdGhlIHN0cmluZyB7QGNvZGUgc3Vic3RpdHV0ZX0uCisgICAgICogCiAgICAgICogQHBhcmFtIGV4cHIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2gKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2guCiAgICAgICogQHBhcmFtIHN1YnN0aXR1dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVwbGFjZSB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nIHdpdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZXhwciBpcyBudWxsCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS40CisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlcGxhY2UgdGhlIG1hdGNoaW5nIHN1YnN0cmluZyB3aXRoLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBzdHJpbmcuCisgICAgICogQHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN5bnRheCBvZiB0aGUgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdAorICAgICAqICAgICAgICAgICAgIHZhbGlkLgorICAgICAqIEBzZWUgUGF0dGVybgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgcmVwbGFjZUFsbChTdHJpbmcgZXhwciwgU3RyaW5nIHN1YnN0aXR1dGUpIHsKICAgICAgICAgcmV0dXJuIFBhdHRlcm4uY29tcGlsZShleHByKS5tYXRjaGVyKHRoaXMpLnJlcGxhY2VBbGwoc3Vic3RpdHV0ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZSB0aGUgZmlyc3Qgc3Vic3RyaW5nIHdpdGhpbiB0aGlzIFN0cmluZyB0aGF0IG1hdGNoZXMgdGhlIHN1cHBsaWVkIHJlZ3VsYXIKLSAgICAgKiBleHByZXNzaW9uIGV4cHIsIHdpdGggdGhlIFN0cmluZyBzdWJzdGl0dXRlLgotICAgICAqCisgICAgICogUmVwbGFjZSB0aGUgZmlyc3Qgc3Vic3RyaW5nIHdpdGhpbiB0aGlzIHN0cmluZyB0aGF0IG1hdGNoZXMgdGhlIHN1cHBsaWVkCisgICAgICogcmVndWxhciBleHByZXNzaW9uIHtAY29kZSBleHByfSwgd2l0aCB0aGUgc3RyaW5nIHtAY29kZSBzdWJzdGl0dXRlfS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZXhwcgotICAgICAqICAgICAgICAgICAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaAorICAgICAqICAgICAgICAgICAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaC4KICAgICAgKiBAcGFyYW0gc3Vic3RpdHV0ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byByZXBsYWNlIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcgd2l0aAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBzdHJpbmcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBleHByIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVwbGFjZSB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nIHdpdGguCisgICAgICogQHJldHVybiB0aGUgbmV3IHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3ludGF4IG9mIHRoZSBzdXBwbGllZCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbm90CisgICAgICogICAgICAgICAgICAgdmFsaWQuCisgICAgICogQHNlZSBQYXR0ZXJuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyByZXBsYWNlRmlyc3QoU3RyaW5nIGV4cHIsIFN0cmluZyBzdWJzdGl0dXRlKSB7CiAgICAgICAgIHJldHVybiBQYXR0ZXJuLmNvbXBpbGUoZXhwcikubWF0Y2hlcih0aGlzKS5yZXBsYWNlRmlyc3Qoc3Vic3RpdHV0ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3BsaXRzIHRoaXMgU3RyaW5nIHVzaW5nIHRoZSBzdXBwbGllZCByZWd1bGFyIGV4cHJlc3Npb24gZXhwci4KLSAgICAgKgorICAgICAqIFNwbGl0cyB0aGlzIHN0cmluZyB1c2luZyB0aGUgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIHtAY29kZSBleHByfS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZXhwcgotICAgICAqICAgICAgICAgICAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGRpdmlkZSB0aGUgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZGl2aWRlIHRoZSBzdHJpbmcuCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmdzIGNyZWF0ZWQgYnkgc2VwYXJhdGluZyB0aGUgc3RyaW5nIGFsb25nCiAgICAgICogICAgICAgICBtYXRjaGVzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZXhwciBpcyBudWxsCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS40CisgICAgICogQHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN5bnRheCBvZiB0aGUgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdAorICAgICAqICAgICAgICAgICAgIHZhbGlkLgorICAgICAqIEBzZWUgUGF0dGVybgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgZXhwcikgewogICAgICAgICByZXR1cm4gUGF0dGVybi5jb21waWxlKGV4cHIpLnNwbGl0KHRoaXMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNwbGl0cyB0aGlzIFN0cmluZyB1c2luZyB0aGUgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIGV4cHIuIG1heAotICAgICAqIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgcGF0dGVybiBpcyBhcHBsaWVkIHRvIHRoZSBzdHJpbmcuCi0gICAgICoKKyAgICAgKiBTcGxpdHMgdGhpcyBzdHJpbmcgdXNpbmcgdGhlIHN1cHBsaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiB7QGNvZGUgZXhwcn0uCisgICAgICogVGhlIHBhcmFtZXRlciB7QGNvZGUgbWF4fSBjb250cm9scyB0aGUgYmVoYXZpb3IgaG93IG1hbnkgdGltZXMgdGhlCisgICAgICogcGF0dGVybiBpcyBhcHBsaWVkIHRvIHRoZSBzdHJpbmcuCisgICAgICogCiAgICAgICogQHBhcmFtIGV4cHIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBkaXZpZGUgdGhlIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGRpdmlkZSB0aGUgc3RyaW5nLgogICAgICAqIEBwYXJhbSBtYXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gYXBwbHkgdGhlIHBhdHRlcm4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcmVzdWx0aW5nIGFycmF5LgogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5ncyBjcmVhdGVkIGJ5IHNlcGFyYXRpbmcgdGhlIHN0cmluZyBhbG9uZwogICAgICAqICAgICAgICAgbWF0Y2hlcyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGV4cHIgaXMgbnVsbAotICAgICAqCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqIEB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzeW50YXggb2YgdGhlIHN1cHBsaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICB2YWxpZC4KKyAgICAgKiBAc2VlIFBhdHRlcm4jc3BsaXQoQ2hhclNlcXVlbmNlLCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBleHByLCBpbnQgbWF4KSB7CiAgICAgICAgIHJldHVybiBQYXR0ZXJuLmNvbXBpbGUoZXhwcikuc3BsaXQodGhpcywgbWF4KTsKQEAgLTIyMDMsNDIgKzIwNzQsMzUgQEAKIAogICAgIC8qKgogICAgICAqIEhhcyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIHN1YnN0cmluZyBmdW5jdGlvbiwgYnV0IGlzIHByZXNlbnQgc28gdGhhdAotICAgICAqIFN0cmluZyBtYXkgaW1wbGVtZW50IHRoZSBDaGFyU2VxdWVuY2UgaW50ZXJmYWNlLgotICAgICAqCisgICAgICogc3RyaW5nIG1heSBpbXBsZW1lbnQgdGhlIENoYXJTZXF1ZW5jZSBpbnRlcmZhY2UuCisgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdGhlIGZpcnN0IGNoYXJhY3Rlci4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIG9uZSBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlciB0byBpbmNsdWRlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJzZXF1ZW5jZSByZXF1ZXN0ZWQKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gaW5jbHVkZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJzZXF1ZW5jZSByZXF1ZXN0ZWQuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBzdGFydCBvciBlbmQgaXMgbGVzcyB0aGFuIHplcm8sIHN0YXJ0IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgIGVuZCwgb3IgZW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBTdHJpbmcuCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSwge0Bjb2RlIGVuZCA8IDB9LCB7QGNvZGUgc3RhcnQgPiBlbmR9IG9yCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGVuZCA+IGxlbmd0aCgpfS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS40CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgcmV0dXJuIHN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIFJldHJpZXZlcyB0aGUgVW5pY29kZSBjb2RlIHBvaW50IChjaGFyYWN0ZXIpIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgaW5kZXh9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IHRvIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiBjb2RlIHVuaXQgd2l0aGluIHRoaXMKLSAgICAgKiAgICAgICAgICAgIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdmFsdWUuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gdGhlIHtAY29kZSBjaGFyfSBjb2RlIHVuaXQgd2l0aGluIHRoaXMgc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCi0gICAgICogICAgICAgICAgICAgdG8ge0BsaW5rICNsZW5ndGgoKX0uCi0gICAgICogQHNlZSBDaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICAqICAgICAgICAgICAgIHtAY29kZSBsZW5ndGgoKX0uCiAgICAgICogQHNlZSBDaGFyYWN0ZXIjY29kZVBvaW50QXQoY2hhcltdLCBpbnQsIGludCkKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb2RlUG9pbnRBdChpbnQgaW5kZXgpIHsKICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjb3VudCkgewpAQCAtMjI0OSwyMSArMjExMywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHJpZXZlcyB0aGUgVW5pY29kZSBjb2RlIHBvaW50IHZhbHVlIHRoYXQgcHJlY2VkZXMgdGhlCi0gICAgICogPGNvZGU+aW5kZXg8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIFJldHJpZXZlcyB0aGUgVW5pY29kZSBjb2RlIHBvaW50IHZhbHVlIHRoYXQgcHJlY2VkZXMgdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBpbmRleH0uCisgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXggdG8gdGhlIDxjb2RlPmNoYXI8L2NvZGU+IGNvZGUgdW5pdCB3aXRoaW4gdGhpcwotICAgICAqICAgICAgICAgICAgb2JqZWN0LgotICAgICAqIEByZXR1cm4gVGhlIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0byB0aGUge0Bjb2RlIGNoYXJ9IGNvZGUgdW5pdCB3aXRoaW4gdGhpcyBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IHZhbHVlLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBsZXNzIHRoYW4gMSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKiBAc2VlIENoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleH0gaXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxlbmd0aCgpfS4KICAgICAgKiBAc2VlIENoYXJhY3RlciNjb2RlUG9pbnRCZWZvcmUoY2hhcltdLCBpbnQsIGludCkKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb2RlUG9pbnRCZWZvcmUoaW50IGluZGV4KSB7CiAgICAgICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiBjb3VudCkgewpAQCAtMjI3NCwyMSArMjEzNCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNvZGUgcG9pbnRzIGJldHdlZW4KLSAgICAgKiA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZW5kSW5kZXg8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNvZGUgcG9pbnRzIGJldHdlZW4ge0Bjb2RlIGJlZ2luSW5kZXh9CisgICAgICogYW5kIHtAY29kZSBlbmRJbmRleH0uCisgICAgICogCiAgICAgICogQHBhcmFtIGJlZ2luSW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmNsdXNpdmUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmNsdXNpdmUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZS4KICAgICAgKiBAcGFyYW0gZW5kSW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBleGNsdXNpdmUgZW5kIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgVW5pY29kZSBjb2RlIHBvaW50cyBpbiB0aGUgc3Vic2VxdWVuY2UuCisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGVuZCBpbmRleCBvZiB0aGUgc3Vic2VxdWVuY2UuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY29kZSBwb2ludHMgaW4gdGhlIHN1YnNlcXVlbmNlLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmVuZEluZGV4PC9jb2RlPiBvciA8Y29kZT5lbmRJbmRleDwvY29kZT4gaXMgZ3JlYXRlcgotICAgICAqICAgICAgICAgICAgIHRoYW4ge0BsaW5rICNsZW5ndGgoKX0uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBiZWdpbkluZGV4fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgZW5kSW5kZXh9IG9yIHtAY29kZSBlbmRJbmRleH0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZQorICAgICAqICAgICAgICAgICAgIGxlbmd0aCgpfS4KKyAgICAgKiBAc2VlIENoYXJhY3RlciNjb2RlUG9pbnRDb3VudChDaGFyU2VxdWVuY2UsIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29kZVBvaW50Q291bnQoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkgewogICAgICAgICBpZiAoYmVnaW5JbmRleCA8IDAgfHwgZW5kSW5kZXggPiBjb3VudCB8fCBiZWdpbkluZGV4ID4gZW5kSW5kZXgpIHsKQEAgLTIyOTksMTYgKzIxNTgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWlucyB0aGUgc2VxdWVuY2Ugb2YKLSAgICAgKiBjaGFyYWN0ZXJzIGluIHRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHBhc3NlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMge0Bjb2RlIFN0cmluZ30gY29udGFpbnMgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KKyAgICAgKiB0aGUge0Bjb2RlIENoYXJTZXF1ZW5jZX0gcGFzc2VkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBjcwotICAgICAqICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBzZWFyY2ggZm9yLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYXJlIGNvbnRhaW5lZAotICAgICAqICAgICAgICAgaW4gdGhpcyBvYmplY3Q7IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYXJlIGNvbnRhaW5lZCBpbiB0aGlzCisgICAgICogICAgICAgICBzdHJpbmcsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENoYXJTZXF1ZW5jZSBjcykgewogICAgICAgICBpZiAoY3MgPT0gbnVsbCkgewpAQCAtMjMxOCwyMiArMjE3NSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIG9iamVjdCB0aGF0IGlzIG9mZnNldCBmcm9tCi0gICAgICogPGNvZGU+aW5kZXg8L2NvZGU+IGJ5IDxjb2RlPmNvZGVQb2ludE9mZnNldDwvY29kZT4gY29kZSBwb2ludHMuCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgaXMgb2Zmc2V0IGZyb20ge0Bjb2RlIGluZGV4fSBieQorICAgICAqIHtAY29kZSBjb2RlUG9pbnRPZmZzZXR9IGNvZGUgcG9pbnRzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGlzIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGlzIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tLgogICAgICAqIEBwYXJhbSBjb2RlUG9pbnRPZmZzZXQKLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdG8gY291bnQuCi0gICAgICogQHJldHVybiBUaGUgaW5kZXggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgaXMgdGhlIG9mZnNldC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdG8gY291bnQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgaXMgdGhlIG9mZnNldC4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAge0BsaW5rICNsZW5ndGgoKX0gb3IgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBjb2RlIHBvaW50cwotICAgICAqICAgICAgICAgICAgIGJlZm9yZSBvciBhZnRlciA8Y29kZT5pbmRleDwvY29kZT4gdG8gbWF0Y2gKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5jb2RlUG9pbnRPZmZzZXQ8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB7QGNvZGUgbGVuZ3RoKCl9CisgICAgICogICAgICAgICAgICAgb3IgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBjb2RlIHBvaW50cyBiZWZvcmUgb3IgYWZ0ZXIge0Bjb2RlCisgICAgICogICAgICAgICAgICAgaW5kZXh9IHRvIG1hdGNoIHtAY29kZSBjb2RlUG9pbnRPZmZzZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgb2Zmc2V0QnlDb2RlUG9pbnRzKGludCBpbmRleCwgaW50IGNvZGVQb2ludE9mZnNldCkgewogICAgICAgICBpbnQgcyA9IGluZGV4ICsgb2Zmc2V0OwpAQCAtMjM0MywyOSArMjE5NywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmludGYtc3R5bGUgZm9ybWF0dGVkIHN0cmluZywgdXNpbmcgdGhlIHN1cHBsaWVkIGZvcm1hdCBhbmQKLSAgICAgKiBhcmd1bWVudHMuIFRoaXMgZnVuY3Rpb24gaXMgYSBzaG9ydGN1dCB0bwotICAgICAqIDxjb2RlPmZvcm1hdChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBmb3JtYXQsIGFyZ3MpPC9jb2RlPi4KLSAgICAgKgorICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nLCB1c2luZyB0aGUgc3VwcGxpZWQgZm9ybWF0IGFuZCBhcmd1bWVudHMsCisgICAgICogdXNpbmcgdGhlIGRlZmF1bHQgbG9jYWxlLgorICAgICAqIAogICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiAgICAgICAgICAgIGEgZm9ybWF0IHN0cmluZworICAgICAqICAgICAgICAgICAgYSBmb3JtYXQgc3RyaW5nLgogICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogICAgICAgICAgICBhcmd1bWVudHMgdG8gcmVwbGFjZSBmb3JtYXQgc3BlY2lmaWVycywgbWF5IGJlIG5vbmUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGZvcm1hdCBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZm9ybWF0IGlzIGludmFsaWQKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgc3RyaW5nCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgYXJndW1lbnRzIHRvIHJlcGxhY2UgZm9ybWF0IHNwZWNpZmllcnMgKG1heSBiZSBub25lKS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmb3JtYXQgaXMgaW52YWxpZC4KICAgICAgKiBAc2VlIGphdmEudXRpbC5Gb3JtYXR0ZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKICAgICAgICAgcmV0dXJuIGZvcm1hdChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBmb3JtYXQsIGFyZ3MpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmludGYtc3R5bGUgZm9ybWF0dGVkIHN0cmluZywgdXNpbmcgdGhlIHN1cHBsaWVkIGZvcm1hdCBhbmQKLSAgICAgKiBhcmd1bWVudHMsIGFjY29yZGluZ2x5IHRvIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgorICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nLCB1c2luZyB0aGUgc3VwcGxpZWQgZm9ybWF0IGFuZCBhcmd1bWVudHMsCisgICAgICogYWNjb3JkaW5nbHkgdG8gdGhlIHNwZWNpZmllZCBsb2NhbGUuCiAgICAgICogPHA+CiAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QuIFVzaW5nIGl0IGludm9sdmVzIGNyZWF0aW5nIGFuCiAgICAgICogaW50ZXJuYWwge0BsaW5rIGphdmEudXRpbC5Gb3JtYXR0ZXJ9IGluc3RhbmNlIG9uLXRoZS1mbHksIHdoaWNoIGlzCkBAIC0yMzczLDIxICsyMjI0LDE4IEBACiAgICAgICogaWYgeW91IHVzZSB0aGUgbWV0aG9kIG9ubHkgcmFyZWx5LCBidXQgaWYgeW91IHJlbHkgb24gaXQgZm9yIGZvcm1hdHRpbmcgYQogICAgICAqIGxhcmdlIG51bWJlciBvZiBzdHJpbmdzLCBjb25zaWRlciBjcmVhdGluZyBhbmQgcmV1c2luZyB5b3VyIG93bgogICAgICAqIHtAbGluayBqYXZhLnV0aWwuRm9ybWF0dGVyfSBpbnN0YW5jZSBpbnN0ZWFkLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGxvYwotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZSB0byBhcHBseTsgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgbWVhbnMgbm8KLSAgICAgKiAgICAgICAgICAgIGxvY2FsaXphdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZSB0byBhcHBseTsge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIG5vIGxvY2FsaXphdGlvbi4KICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICBhIGZvcm1hdCBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgIGEgZm9ybWF0IHN0cmluZy4KICAgICAgKiBAcGFyYW0gYXJncwotICAgICAqICAgICAgICAgICAgYXJndW1lbnRzIHRvIHJlcGxhY2UgZm9ybWF0IHNwZWNpZmllcnMsIG1heSBiZSBub25lCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmb3JtYXQgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGZvcm1hdCBpcyBpbnZhbGlkCi0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIHN0cmluZwotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIGFyZ3VtZW50cyB0byByZXBsYWNlIGZvcm1hdCBzcGVjaWZpZXJzIChtYXkgYmUgbm9uZSkuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZm9ybWF0IGlzIGludmFsaWQuCiAgICAgICogQHNlZSBqYXZhLnV0aWwuRm9ybWF0dGVyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KExvY2FsZSBsb2MsIFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgewpAQCAtMjQ0NCw3ICsyMjkyLDcgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhcnJheSBmb3IgdGhpcyBTdHJpbmcuCisgICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGFycmF5IGZvciB0aGlzIHN0cmluZy4KICAgICAgKi8KICAgICBjaGFyW10gZ2V0VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaW5nQnVmZmVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0cmluZ0J1ZmZlci5qYXZhCmluZGV4IDNjNDMyYjEuLjVjYjVjMjQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaW5nQnVmZmVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpbmdCdWZmZXIuamF2YQpAQCAtMzksNyArMzksNyBAQAogICogCiAgKiBAc2VlIFN0cmluZwogICogQHNlZSBTdHJpbmdCdWlsZGVyCi0gKiBAc2luY2UgMS4wCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ0J1ZmZlciBleHRlbmRzIEFic3RyYWN0U3RyaW5nQnVpbGRlciBpbXBsZW1lbnRzCiAgICAgICAgIEFwcGVuZGFibGUsIFNlcmlhbGl6YWJsZSwgQ2hhclNlcXVlbmNlIHsKQEAgLTUyLDcgKzUyLDkgQEAKICAgICAgICAgICAgIG5ldyBPYmplY3RTdHJlYW1GaWVsZCgidmFsdWUiLCBjaGFyW10uY2xhc3MpLCB9OyAvLyROT04tTkxTLTEkCiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ0J1ZmZlciB1c2luZyB0aGUgZGVmYXVsdCBjYXBhY2l0eS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ0J1ZmZlciB1c2luZyB0aGUgZGVmYXVsdCBjYXBhY2l0eSB3aGljaCBpcyAxNi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtNjIsNyArNjQsOCBAQAogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU3RyaW5nQnVmZmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eQorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlcihpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgc3VwZXIoY2FwYWNpdHkpOwpAQCAtNzAsMzAgKzczLDI1IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ0J1ZmZlciBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzdHJpbmcgYW5kIHRoZSBkZWZhdWx0IGNhcGFjaXR5LgorICAgICAqIHN0cmluZ3kuIFRoZSBjYXBhY2l0eSBvZiB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlCisgICAgICoge0Bjb2RlIFN0cmluZ30gcGx1cyB0aGUgZGVmYXVsdCBjYXBhY2l0eS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGNvbnRlbnQgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBuZXcKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4gaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgb24gc3VwcGx5aW5nIGEgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgb2YKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5zdHJpbmc8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGNvbnRlbnQgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBuZXcgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgIHN1cGVyKHN0cmluZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhIFN0cmluZ0J1ZmZlciBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgY2hhcmFjdGVycyBpbiB0aGUKLSAgICAgKiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+LgotICAgICAqIDwvcD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgU3RyaW5nQnVmZmVyIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIHRoZSBjb250ZW50IGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBDaGFyU2VxdWVuY2V9LiBUaGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIgd2lsbCBiZQorICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIHtAY29kZSBDaGFyU2VxdWVuY2V9IHBsdXMgdGhlIGRlZmF1bHQgY2FwYWNpdHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNzCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB0byBpbml0aWFsaXplIHRoZSBpbnN0YW5jZS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIDxjb2RlPmNzPC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdG8gaW5pdGlhbGl6ZSB0aGUgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlcihDaGFyU2VxdWVuY2UgY3MpIHsKICAgICAgICAgc3VwZXIoY3MudG9TdHJpbmcoKSk7CkBAIC0xMDIsMjEgKzEwMCwyOSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdG8gdGhlIGVuZCBvZgogICAgICAqIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBhcmd1bWVudCBpcyB7QGNvZGUgdHJ1ZX0gdGhlIHN0cmluZyB7QGNvZGUgInRydWUifSBpcyBhcHBlbmRlZCwKKyAgICAgKiBvdGhlcndpc2UgdGhlIHN0cmluZyB7QGNvZGUgImZhbHNlIn0gaXMgYXBwZW5kZWQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBiCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbgotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHRvIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoYm9vbGVhbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGFwcGVuZChib29sZWFuIGIpIHsKICAgICAgICAgcmV0dXJuIGFwcGVuZChiID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgdG8gdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2gKLSAgICAgKiAgICAgICAgICAgIGEgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBhcHBlbmQuCisgICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGNoYXIpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdCdWZmZXIgYXBwZW5kKGNoYXIgY2gpIHsKICAgICAgICAgYXBwZW5kMChjaCk7CkBAIC0xMjgsOCArMTM0LDEwIEBACiAgICAgICogU3RyaW5nQnVmZmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkCi0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlCi0gICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBhcHBlbmQuCisgICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGRvdWJsZSkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGFwcGVuZChkb3VibGUgZCkgewogICAgICAgICByZXR1cm4gYXBwZW5kKERvdWJsZS50b1N0cmluZyhkKSk7CkBAIC0xNDAsOCArMTQ4LDEwIEBACiAgICAgICogU3RyaW5nQnVmZmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmCi0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihmbG9hdCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGFwcGVuZChmbG9hdCBmKSB7CiAgICAgICAgIHJldHVybiBhcHBlbmQoRmxvYXQudG9TdHJpbmcoZikpOwpAQCAtMTUxLDkgKzE2MSwxMSBAQAogICAgICAqIEFkZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdG8gdGhlIGVuZCBvZgogICAgICAqIHRoaXMgU3RyaW5nQnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIAotICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHRvIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgYXBwZW5kKGludCBpKSB7CiAgICAgICAgIHJldHVybiBhcHBlbmQoSW50ZWdlci50b1N0cmluZyhpKSk7CkBAIC0xNjQsOCArMTc2LDEwIEBACiAgICAgICogU3RyaW5nQnVmZmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsCi0gICAgICogICAgICAgICAgICB0aGUgbG9uZwotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHRvIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YobG9uZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGFwcGVuZChsb25nIGwpIHsKICAgICAgICAgcmV0dXJuIGFwcGVuZChMb25nLnRvU3RyaW5nKGwpKTsKQEAgLTE3NCwxMCArMTg4LDE3IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBlbmQgb2YgdGhpcwogICAgICAqIFN0cmluZ0J1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyB7QGNvZGUgbnVsbH0gdGhlIHN0cmluZyB7QGNvZGUgIm51bGwifSBpcworICAgICAqIGFwcGVuZGVkLCBvdGhlcndpc2UgdGhlIG9iamVjdHMge0Bjb2RlIHRvU3RyaW5nfSBpcyB1c2VkIHRvIGdldCBpdHMKKyAgICAgKiBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFwcGVuZCAobWF5IGJlIG51bGwpLgorICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdCdWZmZXIgYXBwZW5kKE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CkBAIC0xODksMTEgKzIxMCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBlbmQgb2YgdGhpcyBidWZmZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMge0Bjb2RlIG51bGx9IHRoZSBzdHJpbmcge0Bjb2RlICJudWxsIn0gaXMKKyAgICAgKiBhcHBlbmRlZCwgb3RoZXJ3aXNlIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhcHBlbmRlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZwotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYXBwZW5kIChtYXkgYmUgbnVsbCkuCisgICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciBhcHBlbmQoU3RyaW5nIHN0cmluZykgewogICAgICAgICBhcHBlbmQwKHN0cmluZyk7CkBAIC0yMDEsMTMgKzIyNywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgdG8gdGhlIGVuZCBvZiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyIHRvIHRoZSBlbmQgb2YgdGhpcyBidWZmZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgaXMge0Bjb2RlIG51bGx9IHRoZSBzdHJpbmcge0Bjb2RlICJudWxsIn0KKyAgICAgKiBpcyBhcHBlbmRlZCwgb3RoZXJ3aXNlIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZ0J1ZmZlciBpcworICAgICAqIGFwcGVuZGVkLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2IKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmdCdWZmZXIKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlciB0byBhcHBlbmQgKG1heSBiZSBudWxsKS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQnVmZmVyIGFwcGVuZChTdHJpbmdCdWZmZXIgc2IpIHsKICAgICAgICAgaWYgKHNiID09IG51bGwpIHsKQEAgLTIyMSwxNCArMjUxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIHRoZSBlbmQgb2YgdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICogQWRkcyB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIHRoZSBlbmQgb2YgdGhpcyBidWZmZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYXJzCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5Ci0gICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlcgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGNoYXJzIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdCdWZmZXIgYXBwZW5kKGNoYXIgY2hhcnNbXSkgewogICAgICAgICBhcHBlbmQwKGNoYXJzKTsKQEAgLTIzNiwyMiArMjY0LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdG8gdGhlIGVuZCBvZiB0aGlzCi0gICAgICogU3RyaW5nQnVmZmVyLgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhpcyBidWZmZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYXJzCi0gICAgICogICAgICAgICAgICBhIGNoYXJhY3RlciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBhcnJheSB0byBhcHBlbmQuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0LgogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyLgogICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5sZW5ndGggPCAwLCBzdGFydCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+c3RhcnQgKyBsZW5ndGggPiBjaGFycy5sZW5ndGg8L2NvZGU+Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gY2hhcnMgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsZW5ndGggPCAwfSAsIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBzdGFydCArCisgICAgICogICAgICAgICAgICAgbGVuZ3RoID4gY2hhcnMubGVuZ3RofS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciBhcHBlbmQoY2hhciBjaGFyc1tdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKICAgICAgICAgYXBwZW5kMChjaGFycywgc3RhcnQsIGxlbmd0aCk7CkBAIC0yNTksMTYgKzI4NCwxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBDaGFyU2VxdWVuY2UgdG8gdGhpcyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogQXBwZW5kcyB0aGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB0byB0aGlzIGJ1ZmZlci4gSWYgdGhlCi0gICAgICogPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgc3RyaW5nCi0gICAgICogPGNvZGU+Im51bGwiPC9jb2RlPiBpcyBhcHBlbmRlZC4KKyAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIENoYXJTZXF1ZW5jZSBpcyB7QGNvZGUgbnVsbH0gdGhlIHN0cmluZyB7QGNvZGUgIm51bGwifQorICAgICAqIGlzIGFwcGVuZGVkLCBvdGhlcndpc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgQ2hhclNlcXVlbmNlIGlzCisgICAgICogYXBwZW5kZWQuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB0byBhcHBlbmQuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUgQ2hhclNlcXVlbmNlIHRvIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQnVmZmVyIGFwcGVuZChDaGFyU2VxdWVuY2UgcykgewogICAgICAgICBpZiAocyA9PSBudWxsKSB7CkBAIC0yODAsMjcgKzMwNiwyNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBzdWJzZXF1ZW5jZSBvZiB0aGUgQ2hhclNlcXVlbmNlIHRvIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIHN1YnNlcXVlbmNlIG9mIHRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHRvIHRoaXMKLSAgICAgKiBidWZmZXIuIElmIHRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuCi0gICAgICogdGhlIHN0cmluZyA8Y29kZT4ibnVsbCI8L2NvZGU+IGlzIHVzZWQgdG8gZXh0cmFjdCBhIHN1YnNlcXVlbmNlLgorICAgICAqIElmIHRoZSBzcGVjaWZpZWQgQ2hhclNlcXVlbmNlIGlzIHtAY29kZSBudWxsfSwgdGhlbiB0aGUgc3RyaW5nIHtAY29kZQorICAgICAqICJudWxsIn0gaXMgdXNlZCB0byBleHRyYWN0IGEgc3Vic2VxdWVuY2UuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB0byBhcHBlbmQuCisgICAgICogICAgICAgICAgICB0aGUgQ2hhclNlcXVlbmNlIHRvIGFwcGVuZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmNsdXNpdmUgc3RhcnQgaW5kZXggb2YgdGhlIHN1YnNlcXVlbmNlIG9mIHRoZQotICAgICAqICAgICAgICAgICAgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmNsdXNpdmUgc3RhcnQgaW5kZXguCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgVGhlIGV4Y2x1c2l2ZSBlbmQgaW5kZXggb2YgdGhlIHN1YnNlcXVlbmNlIG9mIHRoZQotICAgICAqICAgICAgICAgICAgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNsdXNpdmUgZW5kIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmVuZDwvY29kZT4gYXJlIG5lZ2F0aXZlLAotICAgICAqICAgICAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+ZW5kPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmVuZDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5zPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnR9IG9yIHtAY29kZSBlbmR9IGFyZSBuZWdhdGl2ZSwge0Bjb2RlIHN0YXJ0fQorICAgICAqICAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZW5kfSBvciB7QGNvZGUgZW5kfSBpcyBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciBhcHBlbmQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBhcHBlbmQwKHMsIHN0YXJ0LCBlbmQpOwpAQCAtMzA4LDk4ICszMzEsMzggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBVbmljb2RlIGNvZGUgcG9pbnQgdG8KKyAgICAgKiB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIGVuY29kZWQgVW5pY29kZSBjb2RlIHBvaW50IHRvIHRoaXMgb2JqZWN0LiBUaGUgY29kZSBwb2ludCBpcwotICAgICAqIGNvbnZlcnRlZCB0byBhIDxjb2RlPmNoYXJbXTwvY29kZT4gYXMgZGVmaW5lZCBieQorICAgICAqIFRoZSBjb2RlIHBvaW50IGlzIGNvbnZlcnRlZCB0byBhIHtAY29kZSBjaGFyW119IGFzIGRlZmluZWQgYnkKICAgICAgKiB7QGxpbmsgQ2hhcmFjdGVyI3RvQ2hhcnMoaW50KX0uCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2RlUG9pbnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gZW5jb2RlIGFuZCBhcHBlbmQuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gZW5jb2RlIGFuZCBhcHBlbmQuCisgICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlci4KICAgICAgKiBAc2VlIENoYXJhY3RlciN0b0NoYXJzKGludCkKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBhcHBlbmRDb2RlUG9pbnQoaW50IGNvZGVQb2ludCkgewogICAgICAgICByZXR1cm4gYXBwZW5kKENoYXJhY3Rlci50b0NoYXJzKGNvZGVQb2ludCkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBpbiB0aGlzIFN0cmluZ0J1ZmZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IGluIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+aW5kZXggPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmluZGV4ID49IGxlbmd0aCgpPC9jb2RlPgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiBzdXBlci5jaGFyQXQoaW5kZXgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHJpZXZlcyB0aGUgVW5pY29kZSBjb2RlIHBvaW50IHZhbHVlIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IHRvIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiBjb2RlIHVuaXQgd2l0aGluIHRoaXMKLSAgICAgKiAgICAgICAgICAgIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdmFsdWUuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAotICAgICAqICAgICAgICAgICAgIHRvIHtAbGluayAjbGVuZ3RoKCl9LgotICAgICAqIEBzZWUgQ2hhcmFjdGVyCi0gICAgICogQHNlZSBDaGFyYWN0ZXIjY29kZVBvaW50QXQoY2hhcltdLCBpbnQsIGludCkKLSAgICAgKiBAc2luY2UgMS41Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgY29kZVBvaW50QXQoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiBzdXBlci5jb2RlUG9pbnRBdChpbmRleCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0cmlldmVzIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdmFsdWUgdGhhdCBwcmVjZWRlcyB0aGUKLSAgICAgKiA8Y29kZT5pbmRleDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IHRvIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiBjb2RlIHVuaXQgd2l0aGluIHRoaXMKLSAgICAgKiAgICAgICAgICAgIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgdmFsdWUuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgIHtAbGluayAjbGVuZ3RoKCl9LgotICAgICAqIEBzZWUgQ2hhcmFjdGVyCi0gICAgICogQHNlZSBDaGFyYWN0ZXIjY29kZVBvaW50QmVmb3JlKGNoYXJbXSwgaW50LCBpbnQpCi0gICAgICogQHNpbmNlIDEuNQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGNvZGVQb2ludEJlZm9yZShpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmNvZGVQb2ludEJlZm9yZShpbmRleCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY29kZSBwb2ludHMgYmV0d2VlbgotICAgICAqIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5lbmRJbmRleDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBiZWdpbkluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5jbHVzaXZlIGJlZ2lubmluZyBpbmRleCBvZiB0aGUgc3Vic2VxdWVuY2UuCi0gICAgICogQHBhcmFtIGVuZEluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgZXhjbHVzaXZlIGVuZCBpbmRleCBvZiB0aGUgc3Vic2VxdWVuY2UuCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIFVuaWNvZGUgY29kZSBwb2ludHMgaW4gdGhlIHN1YnNlcXVlbmNlLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmVuZEluZGV4PC9jb2RlPiBvciA8Y29kZT5lbmRJbmRleDwvY29kZT4gaXMgZ3JlYXRlcgotICAgICAqICAgICAgICAgICAgIHRoYW4ge0BsaW5rICNsZW5ndGgoKX0uCi0gICAgICogQHNpbmNlIDEuNQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGNvZGVQb2ludENvdW50KGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmNvZGVQb2ludENvdW50KGJlZ2luSW5kZXgsIGVuZEluZGV4KTsKQEAgLTQwOSwxNCArMzcyLDE0IEBACiAgICAgICogRGVsZXRlcyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9uZSBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb25lIHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyLgorICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIuCiAgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA8IDAsIHN0YXJ0ID4gZW5kPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmVuZCA+IGxlbmd0aCgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9LCB7QGNvZGUgc3RhcnQgPiBlbmR9IG9yIHtAY29kZSBlbmQgPgorICAgICAqICAgICAgICAgICAgIGxlbmd0aCgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciBkZWxldGUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgIGRlbGV0ZTAoc3RhcnQsIGVuZCk7CkBAIC00MjQsOTEgKzM4Nyw2MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBzaW5nbGUgY2hhcmFjdGVyCisgICAgICogRGVsZXRlcyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyIHRvIGRlbGV0ZQotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3RlciB0byBkZWxldGUuCisgICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlci4KICAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5sb2NhdGlvbiA+PSBsZW5ndGgoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbG9jYXRpb24gPCAwfSBvciB7QGNvZGUgbG9jYXRpb24gPj0gbGVuZ3RoKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdCdWZmZXIgZGVsZXRlQ2hhckF0KGludCBsb2NhdGlvbikgewogICAgICAgICBkZWxldGVDaGFyQXQwKGxvY2F0aW9uKTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IHRoaXMgU3RyaW5nQnVmZmVyIGNhbiBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCi0gICAgICogY2hhcmFjdGVycyB3aXRob3V0IGdyb3dpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1pbgotICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgdGhpcyBTdHJpbmdCdWZmZXIgd2lsbAotICAgICAqICAgICAgICAgICAgaG9sZCBiZWZvcmUgZ3Jvd2luZwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbWluKSB7CiAgICAgICAgIHN1cGVyLmVuc3VyZUNhcGFjaXR5KG1pbik7CiAgICAgfQotCiAgICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZ0J1ZmZlciB0byB0aGUgY2hhcmFjdGVyCi0gICAgICogYXJyYXkgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgaW4gdGhlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiBDb3BpZXMgdGhlIHJlcXVlc3RlZCBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSB7QGNvZGUgY2hhcltdfSBwYXNzZWQKKyAgICAgKiBzdGFydGluZyBhdCB7QGNvZGUgaWR4fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgb2YgY2hhcmFjdGVycyB0byBjb3B5CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIGNoYXJhY3RlcnMgdG8gY29weS4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgZW5kaW5nIG9mZnNldCBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmRpbmcgb2Zmc2V0IG9mIGNoYXJhY3RlcnMgdG8gY29weS4KICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gY2hhcmFjdGVyIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gY2hhcmFjdGVyIGFycmF5LgogICAgICAqIEBwYXJhbSBpZHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIGNoYXJhY3RlciBhcnJheQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgY2hhcmFjdGVyIGFycmF5LgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwLCBlbmQgPiBsZW5ndGgoKSwKLSAgICAgKiAgICAgICAgICAgICAgc3RhcnQgPiBlbmQsIGluZGV4IDwgMCwgZW5kIC0gc3RhcnQgPiBidWZmZXIubGVuZ3RoIC0gaW5kZXg8L2NvZGU+Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gYnVmZmVyIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSwge0Bjb2RlIGVuZCA+IGxlbmd0aCgpfSwge0Bjb2RlIHN0YXJ0ID4KKyAgICAgKiAgICAgICAgICAgICBlbmR9LCB7QGNvZGUgaW5kZXggPCAwfSwge0Bjb2RlIGVuZCAtIHN0YXJ0ID4gYnVmZmVyLmxlbmd0aCAtCisgICAgICogICAgICAgICAgICAgaW5kZXh9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGdldENoYXJzKGludCBzdGFydCwgaW50IGVuZCwgY2hhcltdIGJ1ZmZlciwgaW50IGlkeCkgewogICAgICAgICBzdXBlci5nZXRDaGFycyhzdGFydCwgZW5kLCBidWZmZXIsIGlkeCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgaW4gdGhpcyBTdHJpbmdCdWZmZXIgZm9yIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KLSAgICAgKiBUaGUgc2VhcmNoIGZvciB0aGUgY2hhcmFjdGVyIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgbW92ZXMKLSAgICAgKiB0b3dhcmRzIHRoZSBlbmQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1YlN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBmaW5kCi0gICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgb2Zmc2V0Ci0gICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyBTdHJpbmdCdWZmZXIgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIsIC0xIGlmCi0gICAgICogICAgICAgICB0aGUgY2hhcmFjdGVyIGlzbid0IGZvdW5kCi0gICAgICogCi0gICAgICogQHNlZSAjbGFzdEluZGV4T2YoU3RyaW5nLGludCkKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS40Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgaW5kZXhPZihTdHJpbmcgc3ViU3RyaW5nLCBpbnQgc3RhcnQpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmluZGV4T2Yoc3ViU3RyaW5nLCBzdGFydCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEluc2VydHMgdGhlIGNoYXJhY3RlciBpbnRvIHRoaXMgYnVmZmVyIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydC4KICAgICAgKiBAcGFyYW0gY2gKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0Ci0gICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+aW5kZXggPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmluZGV4ID4gbGVuZ3RoKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4IDwgMH0gb3Ige0Bjb2RlIGluZGV4ID4gbGVuZ3RoKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQnVmZmVyIGluc2VydChpbnQgaW5kZXgsIGNoYXIgY2gpIHsKICAgICAgICAgaW5zZXJ0MChpbmRleCwgY2gpOwpAQCAtNTE2LDEyNSArNDUxLDEyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gYXQgdGhlCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCBpbiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBib29sZWFuIGludG8gdGhpcworICAgICAqIGJ1ZmZlciBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIGIKLSAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHRvIGluc2VydAotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+aW5kZXggPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmluZGV4ID4gbGVuZ3RoKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4IDwgMH0gb3Ige0Bjb2RlIGluZGV4ID4gbGVuZ3RoKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgaW5zZXJ0KGludCBpbmRleCwgYm9vbGVhbiBiKSB7CiAgICAgICAgIHJldHVybiBpbnNlcnQoaW5kZXgsIGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBhdCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgaW50byB0aGlzCisgICAgICogYnVmZmVyIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydC4KICAgICAgKiBAcGFyYW0gaQotICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdG8gaW5zZXJ0Ci0gICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5pbmRleCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+aW5kZXggPiBsZW5ndGgoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwfSBvciB7QGNvZGUgaW5kZXggPiBsZW5ndGgoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBpbnNlcnQoaW50IGluZGV4LCBpbnQgaSkgewogICAgICAgICByZXR1cm4gaW5zZXJ0KGluZGV4LCBJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBsb25nIGF0IHRoZSBzcGVjaWZpZWQKLSAgICAgKiBvZmZzZXQgaW4gdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICogSW5zZXJ0cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbG9uZyBpbnRvIHRoaXMgYnVmZmVyCisgICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0LgogICAgICAqIEBwYXJhbSBsCi0gICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBpbnNlcnQKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBpbnNlcnQuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmluZGV4IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5pbmRleCA+IGxlbmd0aCgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleCA8IDB9IG9yIHtAY29kZSBpbmRleCA+IGxlbmd0aCgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGluc2VydChpbnQgaW5kZXgsIGxvbmcgbCkgewogICAgICAgICByZXR1cm4gaW5zZXJ0KGluZGV4LCBMb25nLnRvU3RyaW5nKGwpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBkb3VibGUgYXQgdGhlCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCBpbiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBpbnRvIHRoaXMgYnVmZmVyCisgICAgICogZG91YmxlIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydC4KICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBpbnNlcnQKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+aW5kZXggPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmluZGV4ID4gbGVuZ3RoKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4IDwgMH0gb3Ige0Bjb2RlIGluZGV4ID4gbGVuZ3RoKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgaW5zZXJ0KGludCBpbmRleCwgZG91YmxlIGQpIHsKICAgICAgICAgcmV0dXJuIGluc2VydChpbmRleCwgRG91YmxlLnRvU3RyaW5nKGQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmbG9hdCBhdCB0aGUgc3BlY2lmaWVkCi0gICAgICogb2Zmc2V0IGluIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZsb2F0IGludG8gdGhpcyBidWZmZXIKKyAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB0byBpbnNlcnQKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5pbmRleCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+aW5kZXggPiBsZW5ndGgoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwfSBvciB7QGNvZGUgaW5kZXggPiBsZW5ndGgoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBpbnNlcnQoaW50IGluZGV4LCBmbG9hdCBmKSB7CiAgICAgICAgIHJldHVybiBpbnNlcnQoaW5kZXgsIEZsb2F0LnRvU3RyaW5nKGYpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgdGhlCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCBpbiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byB0aGlzCisgICAgICogYnVmZmVyIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIHtAY29kZSBudWxsfSwgdGhlIHN0cmluZyB7QGNvZGUgIm51bGwifSBpcworICAgICAqIGluc2VydGVkLCBvdGhlcndpc2UgdGhlIG9iamVjdHMge0Bjb2RlIHRvU3RyaW5nfSBtZXRob2QgaXMgdXNlZCB0byBnZXQKKyAgICAgKiBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBpbnNlcnQKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGluc2VydCAobWF5IGJlIG51bGwpLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5pbmRleCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+aW5kZXggPiBsZW5ndGgoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXggPCAwfSBvciB7QGNvZGUgaW5kZXggPiBsZW5ndGgoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBpbnNlcnQoaW50IGluZGV4LCBPYmplY3Qgb2JqKSB7CiAgICAgICAgIHJldHVybiBpbnNlcnQoaW5kZXgsIG9iaiA9PSBudWxsID8gIm51bGwiIDogb2JqLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgc3RyaW5nIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyBpbnRvIHRoaXMgYnVmZmVyIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHtAY29kZSBudWxsfSwgdGhlIHN0cmluZyB7QGNvZGUgIm51bGwifSBpcworICAgICAqIGluc2VydGVkLCBvdGhlcndpc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgaXMgaW5zZXJ0ZWQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydC4KICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGluc2VydAotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gaW5zZXJ0IChtYXkgYmUgbnVsbCkuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmluZGV4IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5pbmRleCA+IGxlbmd0aCgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleCA8IDB9IG9yIHtAY29kZSBpbmRleCA+IGxlbmd0aCgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciBpbnNlcnQoaW50IGluZGV4LCBTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgIGluc2VydDAoaW5kZXgsIHN0cmluZyk7CkBAIC02NDIsMTkgKzU3OSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIGNoYXJhY3RlciBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBpbiB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKiBJbnNlcnRzIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaW50byB0aGlzIGJ1ZmZlciBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIGNoYXJzCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIGluc2VydAotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5pbmRleCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+aW5kZXggPiBsZW5ndGgoKTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBjaGFycyBpcyBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4IDwgMH0gb3Ige0Bjb2RlIGluZGV4ID4gbGVuZ3RoKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQnVmZmVyIGluc2VydChpbnQgaW5kZXgsIGNoYXJbXSBjaGFycykgewogICAgICAgICBpbnNlcnQwKGluZGV4LCBjaGFycyk7CkBAIC02NjIsMjUgKzU5NiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluCi0gICAgICogdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHN1YnNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW50byB0aGlzIGJ1ZmZlciBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0LgogICAgICAqIEBwYXJhbSBjaGFycwotICAgICAqICAgICAgICAgICAgYSBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gaW5zZXJ0LgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIG9mZnNldC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLSAgICAgKiBAcmV0dXJuIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmxlbmd0aCA8IDAsIHN0YXJ0IDwgMCw8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgIDxjb2RlPnN0YXJ0ICsgbGVuZ3RoID4gY2hhcnMubGVuZ3RoLCBpbmRleCA8IDA8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgb3IgPGNvZGU+aW5kZXggPiBsZW5ndGgoKTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBjaGFycyBpcyBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxlbmd0aCA8IDB9LCB7QGNvZGUgc3RhcnQgPCAwfSwge0Bjb2RlIHN0YXJ0ICsKKyAgICAgKiAgICAgICAgICAgICBsZW5ndGggPiBjaGFycy5sZW5ndGh9LCB7QGNvZGUgaW5kZXggPCAwfSBvciB7QGNvZGUgaW5kZXggPgorICAgICAqICAgICAgICAgICAgIGxlbmd0aCgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQnVmZmVyIGluc2VydChpbnQgaW5kZXgsIGNoYXIgY2hhcnNbXSwgaW50IHN0YXJ0LAogICAgICAgICAgICAgaW50IGxlbmd0aCkgewpAQCAtNjg5LDIwICs2MjEsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgQ2hhclNlcXVlbmNlIGludG8gdGhpcyBidWZmZXIgYXQgdGhlIHNwZWNpZmllZAorICAgICAqIGluZGV4LgogICAgICAqIDxwPgotICAgICAqIEluc2VydHMgdGhlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gaW50byB0aGlzIGJ1ZmZlciBhdCB0aGUKLSAgICAgKiA8Y29kZT5pbmRleDwvY29kZT4uIElmIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgc3RyaW5nIDxjb2RlPiJudWxsIjwvY29kZT4gaXMgaW5zZXJ0ZWQuCisgICAgICogSWYgdGhlIHNwZWNpZmllZCBDaGFyU2VxdWVuY2UgaXMge0Bjb2RlIG51bGx9LCB0aGUgc3RyaW5nIHtAY29kZSAibnVsbCJ9CisgICAgICogaXMgaW5zZXJ0ZWQsIG90aGVyd2lzZSB0aGUgY29udGVudHMgb2YgdGhlIENoYXJTZXF1ZW5jZS4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXggb2YgdGhpcyBidWZmZXIgdG8gaW5zZXJ0IHRoZSBzZXF1ZW5jZS4KKyAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHRvIGluc2VydC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyIHNlcXVlbmNlIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBpbnZhbGlkLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleCA8IDB9IG9yIHtAY29kZSBpbmRleCA+IGxlbmd0aCgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciBpbnNlcnQoaW50IGluZGV4LCBDaGFyU2VxdWVuY2UgcykgewogICAgICAgICBpbnNlcnQwKGluZGV4LCBzID09IG51bGwgPyAibnVsbCIgOiBzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCkBAIC03MTAsMzAgKzY0MywyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBzdWJzZXF1ZW5jZSBpbnRvIHRoaXMgYnVmZmVyIGF0IHRoZSBzcGVjaWZpZWQKKyAgICAgKiBpbmRleC4KICAgICAgKiA8cD4KLSAgICAgKiBJbnNlcnRzIHRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IGludG8gdGhpcyBidWZmZXIgYXQgdGhlCi0gICAgICogPGNvZGU+aW5kZXg8L2NvZGU+LiBJZiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IGlzCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIHN0cmluZyA8Y29kZT4ibnVsbCI8L2NvZGU+IGlzIGluc2VydGVkLgorICAgICAqIElmIHRoZSBzcGVjaWZpZWQgQ2hhclNlcXVlbmNlIGlzIHtAY29kZSBudWxsfSwgdGhlIHN0cmluZyB7QGNvZGUgIm51bGwifQorICAgICAqIGlzIGluc2VydGVkLCBvdGhlcndpc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBDaGFyU2VxdWVuY2UuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4IG9mIHRoaXMgYnVmZmVyIHRvIGluc2VydCB0aGUgc2VxdWVuY2UuCisgICAgICogICAgICAgICAgICBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0LgogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB0byBpbnNlcnQuCisgICAgICogICAgICAgICAgICBUaGUgY2hhciBzZXF1ZW5jZSB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgaW5jbHVzaXZlIHN0YXJ0IGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4uCisgICAgICogICAgICAgICAgICBUaGUgaW5jbHVzaXZlIHN0YXJ0IGluZGV4IGluIHRoZSBjaGFyIHNlcXVlbmNlLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBleGNsdXNpdmUgZW5kIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4uCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICBUaGUgZXhjbHVzaXZlIGVuZCBpbmRleCBpbiB0aGUgY2hhciBzZXF1ZW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlCi0gICAgICogICAgICAgICAgICAgY3VycmVudCBsZW5ndGgsIDxjb2RlPnN0YXJ0PC9jb2RlPiBvciA8Y29kZT5lbmQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgYXJlIG5lZ2F0aXZlLCA8Y29kZT5zdGFydDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgPGNvZGU+ZW5kPC9jb2RlPiBvciA8Y29kZT5lbmQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGUKLSAgICAgKiAgICAgICAgICAgICBsZW5ndGggb2YgPGNvZGU+czwvY29kZT4uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICBsZW5ndGgsIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGVuZH0gYXJlIG5lZ2F0aXZlLCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBzdGFydH0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBlbmR9IG9yIHtAY29kZSBlbmR9IGlzIGdyZWF0ZXIKKyAgICAgKiAgICAgICAgICAgICB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIHN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQnVmZmVyIGluc2VydChpbnQgaW5kZXgsIENoYXJTZXF1ZW5jZSBzLAogICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CkBAIC03NDEsNjQgKzY3MiwzMiBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIFN0cmluZ0J1ZmZlciBmb3IgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLgotICAgICAqIFRoZSBzZWFyY2ggZm9yIHRoZSBjaGFyYWN0ZXIgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGFuZCBtb3ZlcwotICAgICAqIHRvd2FyZHMgdGhlIGJlZ2lubmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ViU3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGZpbmQKLSAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBvZmZzZXQKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIFN0cmluZ0J1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwgLTEgaWYKLSAgICAgKiAgICAgICAgIHRoZSBjaGFyYWN0ZXIgaXNuJ3QgZm91bmQKLSAgICAgKiAKLSAgICAgKiBAc2VlICNpbmRleE9mKFN0cmluZyxpbnQpCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuNAotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGxhc3RJbmRleE9mKFN0cmluZyBzdWJTdHJpbmcsIGludCBzdGFydCkgewogICAgICAgICByZXR1cm4gc3VwZXIubGFzdEluZGV4T2Yoc3ViU3RyaW5nLCBzdGFydCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgaXMgb2Zmc2V0IGZyb20KLSAgICAgKiA8Y29kZT5pbmRleDwvY29kZT4gYnkgPGNvZGU+Y29kZVBvaW50T2Zmc2V0PC9jb2RlPiBjb2RlIHBvaW50cy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoaXMgb2JqZWN0IHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb20uCi0gICAgICogQHBhcmFtIGNvZGVQb2ludE9mZnNldAotICAgICAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0byBjb3VudC4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBpcyB0aGUgb2Zmc2V0LgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2xlbmd0aCgpfSBvciBpZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGNvZGUgcG9pbnRzCi0gICAgICogICAgICAgICAgICAgYmVmb3JlIG9yIGFmdGVyIDxjb2RlPmluZGV4PC9jb2RlPiB0byBtYXRjaAotICAgICAqICAgICAgICAgICAgIDxjb2RlPmNvZGVQb2ludE9mZnNldDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IG9mZnNldEJ5Q29kZVBvaW50cyhpbnQgaW5kZXgsIGludCBjb2RlUG9pbnRPZmZzZXQpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLm9mZnNldEJ5Q29kZVBvaW50cyhpbmRleCwgY29kZVBvaW50T2Zmc2V0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBTdHJpbmcuCisgICAgICogUmVwbGFjZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgc3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgICB0aGUgaW5jbHVzaXZlIGJlZ2luIGluZGV4LgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb25lIHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGVuZCBpbmRleC4KICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICBhIFN0cmluZwotICAgICAqIEByZXR1cm4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGNvbnRlbnRzIGluIHRoZSByYW5nZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwPC9jb2RlPiBvciA8Y29kZT5zdGFydCA+IGVuZDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnR9IG9yIHtAY29kZSBlbmR9IGFyZSBuZWdhdGl2ZSwge0Bjb2RlIHN0YXJ0fQorICAgICAqICAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZW5kfSBvciB7QGNvZGUgZW5kfSBpcyBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciByZXBsYWNlKGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHN0cmluZykgewogICAgICAgICByZXBsYWNlMChzdGFydCwgZW5kLCBzdHJpbmcpOwpAQCAtODA2LDEyNSArNzA1LDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBidWZmZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGlzIFN0cmluZ0J1ZmZlcgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdCdWZmZXIgcmV2ZXJzZSgpIHsKICAgICAgICAgcmV2ZXJzZTAoKTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoaXMgU3RyaW5nQnVmZmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXggaW4gdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiBAcGFyYW0gY2gKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmluZGV4IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5pbmRleCA+PSBsZW5ndGgoKTwvY29kZT4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2hhckF0KGludCBpbmRleCwgY2hhciBjaCkgewogICAgICAgICBzdXBlci5zZXRDaGFyQXQoaW5kZXgsIGNoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhpcyBTdHJpbmdCdWZmZXIgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguIElmIHRoZXJlCi0gICAgICogYXJlIG1vcmUgdGhhbiBsZW5ndGggY2hhcmFjdGVycyBpbiB0aGlzIFN0cmluZ0J1ZmZlciwgdGhlIGNoYXJhY3RlcnMgYXQKLSAgICAgKiBlbmQgYXJlIGxvc3QuIElmIHRoZXJlIGFyZSBsZXNzIHRoYW4gbGVuZ3RoIGNoYXJhY3RlcnMgaW4gdGhlCi0gICAgICogU3RyaW5nQnVmZmVyLCB0aGUgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFyZSBzZXQgdG8gPGNvZGU+XFx1MDAwMDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBsZW5ndGggb2YgdGhpcyBTdHJpbmdCdWZmZXIKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmxlbmd0aCA8IDA8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHNlZSAjbGVuZ3RoKCkKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKICAgICAgICAgc3VwZXIuc2V0TGVuZ3RoKGxlbmd0aCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbnRvIGEgbmV3IFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb25lIHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiBhIG5ldyBTdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyBmcm9tIHN0YXJ0IHRvIGVuZCAtIDEKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMCwgc3RhcnQgPiBlbmQ8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgPGNvZGU+ZW5kID4gbGVuZ3RoKCk8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHNpbmNlIDEuNAotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICByZXR1cm4gc3VwZXIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIENvcGllcyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW50byBhIG5ldyBTdHJpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGZyb20gc3RhcnQgdG8gdGhlIGVuZCBvZgotICAgICAqICAgICAgICAgdGhlIHN0cmluZwotICAgICAqIAotICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPnN0YXJ0ID4gbGVuZ3RoKCk8L2NvZGU+Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgc3Vic3RyaW5nKGludCBzdGFydCkgewogICAgICAgICByZXR1cm4gc3VwZXIuc3Vic3RyaW5nKHN0YXJ0KTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSByYW5nZSBvZiBjaGFyYWN0ZXJzIGludG8gYSBuZXcgU3RyaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGZyb20gc3RhcnQgdG8gZW5kIC0gMQotICAgICAqIAotICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwLCBzdGFydCA+IGVuZDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5lbmQgPiBsZW5ndGgoKTwvY29kZT4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzdWJzdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgIHJldHVybiBzdXBlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBTdHJpbmdCdWZmZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgU3RyaW5nQnVmZmVyCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRyaW1zIHRoZSBzdG9yYWdlIGNhcGFjaXR5IG9mIHRoaXMgYnVmZmVyIGRvd24gdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQKLSAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UuIEV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZCBtYXkgY2hhbmdlIHRoZSByZXN1bHRzCi0gICAgICogcmV0dXJuZWQgYnkgdGhlIHtAbGluayAjY2FwYWNpdHkoKX0gbWV0aG9kLCBidXQgdGhpcyBpcyBub3QgcmVxdWlyZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjUKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdHJpbVRvU2l6ZSgpIHsKICAgICAgICAgc3VwZXIudHJpbVRvU2l6ZSgpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIuamF2YQppbmRleCBkZDQ3MWM1Li5kNjJmOTAwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIuamF2YQpAQCAtMjMsMjYgKzIzLDIyIEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogPHA+CiAgKiBBIG1vZGlmaWFibGUge0BsaW5rIENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzfSBmb3IgdXNlIGluIGNyZWF0aW5nCiAgKiBhbmQgbW9kaWZ5aW5nIFN0cmluZ3MuIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgYXMgYSBkaXJlY3QgcmVwbGFjZW1lbnQgb2YKLSAqIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyfSBmb3Igbm9uLWNvbmN1cnJlbnQgdXNlOyB1bmxpa2UKLSAqIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4gdGhpcyBjbGFzcyBpcyBub3Qgc3luY2hyb25pemVkIGZvciB0aHJlYWQgc2FmZXR5LgotICogPC9wPgotICoKKyAqIHtAbGluayBTdHJpbmdCdWZmZXJ9IGZvciBub24tY29uY3VycmVudCB1c2U7IHVubGlrZSB7QGNvZGUgU3RyaW5nQnVmZmVyfSB0aGlzCisgKiBjbGFzcyBpcyBub3Qgc3luY2hyb25pemVkIGZvciB0aHJlYWQgc2FmZXR5LgogICogPHA+Ci0gKiBUaGUgbWFqb3JpdHkgb2YgdGhlIG1vZGlmaWNhdGlvbiBtZXRob2RzIG9uIHRoaXMgY2xhc3MgcmV0dXJuCi0gKiA8Y29kZT5TdHJpbmdCdWlsZGVyPC9jb2RlPiwgc28gdGhhdCwgbGlrZSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+cywKLSAqIHRoZXkgY2FuIGJlIHVzZWQgaW4gY2hhaW5pbmcgbWV0aG9kIGNhbGxzIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwKLSAqIDxjb2RlPm5ldyBTdHJpbmdCdWlsZGVyKCJPbmUgc2hvdWxkICIpLmFwcGVuZCgiYWx3YXlzIHN0cml2ZSAiKS5hcHBlbmQoInRvIGFjaGlldmUgSGFybW9ueSIpPC9jb2RlPi4KKyAqIFRoZSBtYWpvcml0eSBvZiB0aGUgbW9kaWZpY2F0aW9uIG1ldGhvZHMgb24gdGhpcyBjbGFzcyByZXR1cm4ge0Bjb2RlCisgKiBTdHJpbmdCdWlsZGVyfSwgc28gdGhhdCwgbGlrZSB7QGNvZGUgU3RyaW5nQnVmZmVyfXMsIHRoZXkgY2FuIGJlIHVzZWQgaW4KKyAqIGNoYWluaW5nIG1ldGhvZCBjYWxscyB0b2dldGhlci4gRm9yIGV4YW1wbGUsIHtAY29kZSBuZXcgU3RyaW5nQnVpbGRlcigiT25lCisgKiBzaG91bGQgIikuYXBwZW5kKCJhbHdheXMgc3RyaXZlICIpLmFwcGVuZCgidG8gYWNoaWV2ZSBIYXJtb255Iil9LgogICogPC9wPgotICoKLSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotICogQHNlZSBqYXZhLmxhbmcuQXBwZW5kYWJsZQotICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0gKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLSAqCi0gKiBAc2luY2UgMS41CisgKiAKKyAqIEBzZWUgQ2hhclNlcXVlbmNlCisgKiBAc2VlIEFwcGVuZGFibGUKKyAqIEBzZWUgU3RyaW5nQnVmZmVyCisgKiBAc2VlIFN0cmluZworICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdCdWlsZGVyIGltcGxlbWVudHMKICAgICAgICAgQXBwZW5kYWJsZSwgQ2hhclNlcXVlbmNlLCBTZXJpYWxpemFibGUgewpAQCAtNTAsNzMgKzQ2LDY1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDM4MzY4NTg3NzE0NzkyMTA5OUw7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHdpdGggYW4gaW5pdGlhbCBjYXBhY2l0eSBvZiA8Y29kZT4xNjwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRoIGFuIGluaXRpYWwgY2FwYWNpdHkgb2Yge0Bjb2RlIDE2fS4KKyAgICAgKiAKICAgICAgKiBAc2VlICNjYXBhY2l0eSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIGNhcGFjaXR5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXBhY2l0eSBUaGUgaW5pdGlhbCBjYXBhY2l0eSB0byB1c2UuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5jYXBhY2l0eTwvY29kZT4KLSAgICAgKiAgICAgICAgIHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXBhY2l0eQorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG8gdXNlLgorICAgICAqIEB0aHJvd3MgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBjYXBhY2l0eX0gaXMgbmVnYXRpdmUuCiAgICAgICogQHNlZSAjY2FwYWNpdHkoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyKGludCBjYXBhY2l0eSkgewogICAgICAgICBzdXBlcihjYXBhY2l0eSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB0aGF0J3MgcG9wdWxhdGVkIGJ5IGEge0BsaW5rIENoYXJTZXF1ZW5jZX0uIFRoZQotICAgICAqIGNhcGFjaXR5IG9mIHRoZSBuZXcgYnVpbGRlciB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlCi0gICAgICogPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiBwbHVzIDE2LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXEgVGhlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gdG8gY29weSBpbnRvIHRoZSBidWlsZGVyLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnNlcTwvY29kZT4gcGFyYW1ldGVyIGlzCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHRoYXQncyBpbml0aWFsaXplZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIENoYXJTZXF1ZW5jZX0uIFRoZSBjYXBhY2l0eSBvZiB0aGUgbmV3IGJ1aWxkZXIgd2lsbCBiZQorICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIHtAY29kZSBDaGFyU2VxdWVuY2V9IHBsdXMgMTYuCisgICAgICogCisgICAgICogQHBhcmFtIHNlcQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDaGFyU2VxdWVuY2V9IHRvIGNvcHkgaW50byB0aGUgYnVpbGRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlcihDaGFyU2VxdWVuY2Ugc2VxKSB7CiAgICAgICAgIHN1cGVyKHNlcS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHRoYXQncyBwb3B1bGF0ZWQgYnkgYSB7QGxpbmsgU3RyaW5nfS4gVGhlCi0gICAgICogY2FwYWNpdHkgb2YgdGhlIG5ldyBidWlsZGVyIHdpbGwgYmUgdGhlIGxlbmd0aCBvZiB0aGUKLSAgICAgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IHBsdXMgMTYuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciBUaGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBjb3B5IGludG8gdGhlIGJ1aWxkZXIuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+c3RyPC9jb2RlPiBwYXJhbWV0ZXIgaXMKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2UgdGhhdCdzIGluaXRpYWxpemVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgU3RyaW5nfS4gVGhlIGNhcGFjaXR5IG9mIHRoZSBuZXcgYnVpbGRlciB3aWxsIGJlIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUge0Bjb2RlIFN0cmluZ30gcGx1cyAxNi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFN0cmluZ30gdG8gY29weSBpbnRvIHRoZSBidWlsZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyKFN0cmluZyBzdHIpIHsKICAgICAgICAgc3VwZXIoc3RyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBcHBlbmRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAgICogcGFzc2VkLiBUaGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgY29udmVydGVkIHRvIGEgU3RyaW5nCi0gICAgICogYWNjb3JkaW5nIHRvIHRoZSBydWxlIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGJvb2xlYW4pfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYiBUaGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gYXBwZW5kIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgYm9vbGVhbn0gdmFsdWUuCisgICAgICogVGhlIHtAY29kZSBib29sZWFufSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlCisgICAgICogZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoYm9vbGVhbil9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJvb2xlYW59IHZhbHVlIHRvIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KICAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGJvb2xlYW4pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgYXBwZW5kKGJvb2xlYW4gYikgewogICAgICAgICBhcHBlbmQwKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0xMjQsMTYgKzExMiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdmFsdWUKLSAgICAgKiBwYXNzZWQuIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgYWNjb3JkaW5nCi0gICAgICogdG8gdGhlIHJ1bGUgZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoY2hhcil9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB2YWx1ZSB0byBhcHBlbmQgdG8gdGhpcyBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KLSAgICAgKgorICAgICAqIEFwcGVuZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBjaGFyfSB2YWx1ZS4KKyAgICAgKiBUaGUge0Bjb2RlIGNoYXJ9IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUKKyAgICAgKiBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgY2hhcn0gdmFsdWUgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgogICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoY2hhcikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBhcHBlbmQoY2hhciBjKSB7CiAgICAgICAgIGFwcGVuZDAoYyk7CkBAIC0xNDEsMTYgKzEyOCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBwYXNzZWQuCi0gICAgICogVGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgY29udmVydGVkIHRvIGEgU3RyaW5nIGFjY29yZGluZyB0byB0aGUKLSAgICAgKiBydWxlIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHRvIGFwcGVuZCB0byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCisgICAgICogQXBwZW5kcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGludH0gdmFsdWUuIFRoZQorICAgICAqIHtAY29kZSBpbnR9IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUgZGVmaW5lZAorICAgICAqIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBpbnR9IHZhbHVlIHRvIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KICAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBhcHBlbmQoaW50IGkpIHsKICAgICAgICAgYXBwZW5kMChJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKQEAgLTE1OCwxNiArMTQ0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQXBwZW5kcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZQotICAgICAqIHBhc3NlZC4gVGhlIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcKLSAgICAgKiB0byB0aGUgcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihsb25nKX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxuZyBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgdG8gYXBwZW5kIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgbG9uZ30gdmFsdWUuCisgICAgICogVGhlIHtAY29kZSBsb25nfSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlCisgICAgICogZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YobG9uZyl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBsbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgbG9uZ30gdmFsdWUuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCiAgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihsb25nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZChsb25nIGxuZykgewogICAgICAgICBhcHBlbmQwKExvbmcudG9TdHJpbmcobG5nKSk7CkBAIC0xNzUsMTYgKzE2MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlCi0gICAgICogcGFzc2VkLiBUaGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcKLSAgICAgKiB0byB0aGUgcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihmbG9hdCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmIFRoZSA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUgdG8gYXBwZW5kIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgZmxvYXR9IHZhbHVlLgorICAgICAqIFRoZSB7QGNvZGUgZmxvYXR9IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUKKyAgICAgKiBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihmbG9hdCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGZsb2F0fSB2YWx1ZSB0byBhcHBlbmQuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCiAgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihmbG9hdCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBhcHBlbmQoZmxvYXQgZikgewogICAgICAgICBhcHBlbmQwKEZsb2F0LnRvU3RyaW5nKGYpKTsKQEAgLTE5MiwxNiArMTc2LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQXBwZW5kcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlCi0gICAgICogcGFzc2VkLiBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcKLSAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUgZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoZG91YmxlKX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGQgVGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgdG8gYXBwZW5kIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgZG91YmxlfSB2YWx1ZS4KKyAgICAgKiBUaGUge0Bjb2RlIGRvdWJsZX0gdmFsdWUgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZQorICAgICAqIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGRvdWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGRvdWJsZX0gdmFsdWUgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgogICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoZG91YmxlKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZChkb3VibGUgZCkgewogICAgICAgICBhcHBlbmQwKERvdWJsZS50b1N0cmluZyhkKSk7CkBAIC0yMDksMTYgKzE5MiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZQotICAgICAqIHBhc3NlZC4gVGhlIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWUgaXMgY29udmVydGVkIHRvIGEgU3RyaW5nCi0gICAgICogYWNjb3JkaW5nIHRvIHRoZSBydWxlIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogVGhlIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWUgdG8gYXBwZW5kIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgT2JqZWN0fS4KKyAgICAgKiBUaGUge0Bjb2RlIE9iamVjdH0gdmFsdWUgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZQorICAgICAqIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSB0byBhcHBlbmQuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCiAgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgYXBwZW5kKE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CkBAIC0yMzAsMTMgKzIxMiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBTdHJpbmcuIElmIHRoZSBTdHJpbmcgcGFzc2VkIGlzCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIFN0cmluZyA8Y29kZT4ibnVsbCI8L2NvZGU+IGlzIGFwcGVuZGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgVGhlIFN0cmluZyB0byBhcHBlbmQgdG8gdGhpcyBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KKyAgICAgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gSWYgdGhlIHN0cmluZyBpcyB7QGNvZGUKKyAgICAgKiBudWxsfSwgdGhlbiB0aGUgc3RyaW5nIHtAY29kZSAibnVsbCJ9IGlzIGFwcGVuZGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZChTdHJpbmcgc3RyKSB7CiAgICAgICAgIGFwcGVuZDAoc3RyKTsKQEAgLTI0NCwxNCArMjI2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQXBwZW5kcyB0aGUgY29udGVudHMgb2YgdGhlIFN0cmluZ0J1ZmZlci4gSWYgdGhlIFN0cmluZ0J1ZmZlciBwYXNzZWQgaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgU3RyaW5nQnVmZmVyIDxjb2RlPiJudWxsIjwvY29kZT4gaXMKKyAgICAgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBTdHJpbmdCdWZmZXJ9LiBJZiB0aGUKKyAgICAgKiBTdHJpbmdCdWZmZXIgaXMge0Bjb2RlIG51bGx9LCB0aGVuIHRoZSBzdHJpbmcge0Bjb2RlICJudWxsIn0gaXMKICAgICAgKiBhcHBlbmRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2IgVGhlIFN0cmluZ0J1ZmZlciB0byBhcHBlbmQgdG8gdGhpcyBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2IKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU3RyaW5nQnVmZmVyfSB0byBhcHBlbmQuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgYXBwZW5kKFN0cmluZ0J1ZmZlciBzYikgewogICAgICAgICBpZiAoc2IgPT0gbnVsbCkgewpAQCAtMjYzLDE2ICsyNDUsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBcHBlbmRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmNoYXJbXTwvY29kZT4gdmFsdWUKLSAgICAgKiBwYXNzZWQuIFRoZSA8Y29kZT5jaGFyW108L2NvZGU+IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZwotICAgICAqIGFjY29yZGluZyB0byB0aGUgcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyW10pfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2ggIFRoZSA8Y29kZT5jaGFyW108L2NvZGU+IHZhbHVlIHRvIGFwcGVuZCB0byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCisgICAgICogQXBwZW5kcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGNoYXJbXX0uCisgICAgICogVGhlIHtAY29kZSBjaGFyW119IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUKKyAgICAgKiBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyW10pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgY2hhcltdfSB0byBhcHBlbmQuLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgogICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoY2hhcltdKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZChjaGFyW10gY2gpIHsKICAgICAgICAgYXBwZW5kMChjaCk7CkBAIC0yODAsMjEgKzI2MSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3Vic2V0IG9mIHRoZQotICAgICAqIDxjb2RlPmNoYXJbXTwvY29kZT4gdmFsdWUgcGFzc2VkLiBUaGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB2YWx1ZSBpcwotICAgICAqIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUgZGVmaW5lZCBieQotICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyW10saW50LGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgVGhlIDxjb2RlPmNoYXJbXTwvY29kZT4gdmFsdWUgdG8gYXBwZW5kIHRvIHRoaXMgb2JqZWN0LgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGluY2x1c2l2ZSBvZmZzZXQgaW5kZXggdG8gYmVnaW4gY29weWluZyBmcm9tIHRoZQotICAgICAqICAgICAgICA8Y29kZT5zdHI8L2NvZGU+IHBhcmFtZXRlci4KLSAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIHRvIGNvcHkgZnJvbSB0aGUgPGNvZGU+c3RyPC9jb2RlPgotICAgICAqICAgICAgICBwYXJhbWV0ZXIuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KLSAgICAgKgorICAgICAqIEFwcGVuZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHN1YnNldCBvZiB0aGUge0Bjb2RlCisgICAgICogY2hhcltdfS4gVGhlIHtAY29kZSBjaGFyW119IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcgdG8KKyAgICAgKiB0aGUgcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyW10saW50LGludCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgY2hhcltdfSB0byBhcHBlbmQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluY2x1c2l2ZSBvZmZzZXQgaW5kZXguCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gYW5kIHtAY29kZSBsZW59IGRvIG5vdCBzcGVjaWZ5IGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICBzdWJzZXF1ZW5jZS4KICAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGNoYXJbXSxpbnQsaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZChjaGFyW10gc3RyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CiAgICAgICAgIGFwcGVuZDAoc3RyLCBvZmZzZXQsIGxlbik7CkBAIC0zMDIsMTUgKzI4NCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPgotICAgICAqIHZhbHVlIHBhc3NlZC4gSWYgdGhlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sCi0gICAgICogdGhlbiB0aGUgU3RyaW5nIDxjb2RlPiJudWxsIjwvY29kZT4gaXMgYXBwZW5kZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNzcSBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB2YWx1ZSB0byBhcHBlbmQgdG8gdGhpcwotICAgICAqICAgICAgICBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgQ2hhclNlcXVlbmNlfS4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIENoYXJTZXF1ZW5jZX0gaXMge0Bjb2RlIG51bGx9LCB0aGVuIHRoZSBzdHJpbmcge0Bjb2RlCisgICAgICogIm51bGwifSBpcyBhcHBlbmRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3NxCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENoYXJTZXF1ZW5jZX0gdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZChDaGFyU2VxdWVuY2UgY3NxKSB7CiAgICAgICAgIGlmIChjc3EgPT0gbnVsbCkgewpAQCAtMzIyLDE4ICszMDMsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBcHBlbmRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1YnNlcXVlbmNlIG9mIHRoZQotICAgICAqIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gdmFsdWUgcGFzc2VkLiBJZiB0aGUKLSAgICAgKiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBTdHJpbmcKLSAgICAgKiA8Y29kZT4ibnVsbCI8L2NvZGU+IGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgc3Vic2VxdWVuY2UgZnJvbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY3NxIFRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHZhbHVlIHRvIGFwcGVuZCB0byB0aGlzCi0gICAgICogICAgICAgIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGJlZ2lubmluZyBpbmRleCBvZiB0aGUgc3Vic2VxdWVuY2UuCi0gICAgICogQHBhcmFtIGVuZCBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSBzdWJzZXF1ZW5jZS4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgorICAgICAqIEFwcGVuZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHN1YnNlcXVlbmNlIG9mIHRoZQorICAgICAqIHtAY29kZSBDaGFyU2VxdWVuY2V9LiBJZiB0aGUge0Bjb2RlIENoYXJTZXF1ZW5jZX0gaXMge0Bjb2RlIG51bGx9LCB0aGVuCisgICAgICogdGhlIHN0cmluZyB7QGNvZGUgIm51bGwifSBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIHN1YnNlcXVlbmNlIGZyb20uCisgICAgICogCisgICAgICogQHBhcmFtIGNzcQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDaGFyU2VxdWVuY2V9IHRvIGFwcGVuZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBiZWdpbm5pbmcgaW5kZXguCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZGluZyBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnR9IG9yIHtAY29kZSBlbmR9IGFyZSBuZWdhdGl2ZSwge0Bjb2RlIHN0YXJ0fQorICAgICAqICAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZW5kfSBvciB7QGNvZGUgZW5kfSBpcyBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHtAY29kZSBjc3F9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZChDaGFyU2VxdWVuY2UgY3NxLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgYXBwZW5kMChjc3EsIHN0YXJ0LCBlbmQpOwpAQCAtMzQxLDE1ICszMjYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBcHBlbmRzIHRoZSBlbmNvZGVkIFVuaWNvZGUgY29kZSBwb2ludCB0byB0aGlzIG9iamVjdC4gVGhlIGNvZGUgcG9pbnQgaXMKLSAgICAgKiBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5jaGFyW108L2NvZGU+IGFzIGRlZmluZWQgYnkKLSAgICAgKiB7QGxpbmsgQ2hhcmFjdGVyI3RvQ2hhcnMoaW50KX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvZGVQb2ludCBUaGUgVW5pY29kZSBjb2RlIHBvaW50IHRvIGVuY29kZSBhbmQgYXBwZW5kLgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCisgICAgICogQXBwZW5kcyB0aGUgZW5jb2RlZCBVbmljb2RlIGNvZGUgcG9pbnQuIFRoZSBjb2RlIHBvaW50IGlzIGNvbnZlcnRlZCB0byBhCisgICAgICoge0Bjb2RlIGNoYXJbXX0gYXMgZGVmaW5lZCBieSB7QGxpbmsgQ2hhcmFjdGVyI3RvQ2hhcnMoaW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvZGVQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIFVuaWNvZGUgY29kZSBwb2ludCB0byBlbmNvZGUgYW5kIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KICAgICAgKiBAc2VlIENoYXJhY3RlciN0b0NoYXJzKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBhcHBlbmRDb2RlUG9pbnQoaW50IGNvZGVQb2ludCkgewogICAgICAgICBhcHBlbmQwKENoYXJhY3Rlci50b0NoYXJzKGNvZGVQb2ludCkpOwpAQCAtMzU3LDE3ICszNDEsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBEZWxldGVzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB3aXRoaW4gdGhpcyBvYmplY3QsIHNoaWZ0cyBhbnkgcmVtYWluaW5nCi0gICAgICogY2hhcmFjdGVycyB0byB0aGUgbGVmdCBhbmQgYWRqdXN0cyB0aGUge0BsaW5rICNsZW5ndGgoKX0gb2YgdGhpcyBvYmplY3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBpbmNsdXNpdmUgc3RhcnQgaW5kZXggdG8gYmVnaW4gZGVsZXRpb24uCi0gICAgICogQHBhcmFtIGVuZCBUaGUgZXhjbHVzaXZlIGVuZCBpbmRleCB0byBzdG9wIGRlbGV0aW9uLgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPnN0YXJ0PC9jb2RlPiBpcyBsZXNzCi0gICAgICogICAgICAgICB0aGFuIHplcm8sIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBsZW5ndGggb3IgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICA8Y29kZT5lbmQ8L2NvZGU+LgorICAgICAqIERlbGV0ZXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHNwZWNpZmllZCBieSB7QGNvZGUgc3RhcnR9IGFuZCB7QGNvZGUKKyAgICAgKiBlbmR9LiBTaGlmdHMgYW55IHJlbWFpbmluZyBjaGFyYWN0ZXJzIHRvIHRoZSBsZWZ0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleC4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGVuZCBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnR9IGlzIGxlc3MgdGhhbiB6ZXJvLCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICBsZW5ndGggb3IgZ3JlYXRlciB0aGFuIHtAY29kZSBlbmR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGRlbGV0ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgZGVsZXRlMChzdGFydCwgZW5kKTsKQEAgLTM3NSwxNSArMzYwLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGVsZXRlcyBhIHNpbmdsZSBjaGFyYWN0ZXIgd2l0aGluIHRoaXMgb2JqZWN0LCBzaGlmdHMgYW55IHJlbWFpbmluZwotICAgICAqIGNoYXJhY3RlcnMgdG8gdGhlIGxlZnQgYW5kIGFkanVzdHMgdGhlIHtAbGluayAjbGVuZ3RoKCl9IG9mIHRoaXMgb2JqZWN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBkZWxldGUuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGxlc3MKLSAgICAgKiAgICAgICAgIHRoYW4gemVybyBvciBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgbGVuZ3RoLgorICAgICAqIERlbGV0ZXMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBzaGlmdHMgYW55IHJlbWFpbmluZworICAgICAqIGNoYXJhY3RlcnMgdG8gdGhlIGxlZnQuCisgICAgICogCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBkZWxldGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBsZXNzIHRoYW4gemVybyBvciBpcyBncmVhdGVyIHRoYW4gb3IKKyAgICAgKiAgICAgICAgICAgICBlcXVhbCB0byB0aGUgY3VycmVudCBsZW5ndGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgZGVsZXRlQ2hhckF0KGludCBpbmRleCkgewogICAgICAgICBkZWxldGVDaGFyQXQwKGluZGV4KTsKQEAgLTM5MSwyMSArMzc3LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotICAgICAqIHBhc3NlZCBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBhc3NlZC4gVGhlCi0gICAgICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgY29udmVydGVkIHRvIGEgU3RyaW5nIGFjY29yZGluZyB0byB0aGUKLSAgICAgKiBydWxlIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGJvb2xlYW4pfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCBvZiB0aGlzIG9iamVjdCB0byBpbnNlcnQgdGhlIHZhbHVlLgotICAgICAqIEBwYXJhbSBiIFRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBib29sZWFufSB2YWx1ZQorICAgICAqIGF0IHRoZSBzcGVjaWZpZWQge0Bjb2RlIG9mZnNldH0uIFRoZSB7QGNvZGUgYm9vbGVhbn0gdmFsdWUgaXMgY29udmVydGVkCisgICAgICogdG8gYSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlIGRlZmluZWQgYnkKKyAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoYm9vbGVhbil9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0byBpbnNlcnQgYXQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYm9vbGVhbn0gdmFsdWUgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXR9IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBsZW5ndGh9LgogICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoYm9vbGVhbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBpbnNlcnQoaW50IG9mZnNldCwgYm9vbGVhbiBiKSB7CiAgICAgICAgIGluc2VydDAob2Zmc2V0LCBiID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtNDEzLDIxICszOTksMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBJbnNlcnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlIHBhc3NlZAotICAgICAqIGludG8gdGhpcyBvYmplY3QgYXQgdGhlIDxjb2RlPm9mZnNldDwvY29kZT4gcGFzc2VkLiBUaGUKLSAgICAgKiA8Y29kZT5jaGFyPC9jb2RlPiB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlCi0gICAgICogZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoY2hhcil9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGluZGV4IG9mIHRoaXMgb2JqZWN0IHRvIGluc2VydCB0aGUgdmFsdWUuCi0gICAgICogQHBhcmFtIGMgVGhlIDxjb2RlPmNoYXI8L2NvZGU+IHZhbHVlIHRvIGluc2VydCBpbnRvIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQge0BsaW5rICNsZW5ndGgoKX0uCi0gICAgICoKKyAgICAgKiBJbnNlcnRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgY2hhcn0gdmFsdWUgYXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHtAY29kZSBvZmZzZXR9LiBUaGUge0Bjb2RlIGNoYXJ9IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhCisgICAgICogc3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyKX0uCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHRvIGluc2VydCBhdC4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBjaGFyfSB2YWx1ZSB0byBpbnNlcnQuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxlbmd0aCgpfS4KICAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGNoYXIpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgaW5zZXJ0KGludCBvZmZzZXQsIGNoYXIgYykgewogICAgICAgICBpbnNlcnQwKG9mZnNldCwgYyk7CkBAIC00MzUsMjEgKzQyMCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEluc2VydHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBwYXNzZWQKLSAgICAgKiBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBhc3NlZC4gVGhlCi0gICAgICogPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlCi0gICAgICogZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoaW50KX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggb2YgdGhpcyBvYmplY3QgdG8gaW5zZXJ0IHRoZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gaSBUaGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBpbnR9IHZhbHVlIGF0CisgICAgICogdGhlIHNwZWNpZmllZCB7QGNvZGUgb2Zmc2V0fS4gVGhlIHtAY29kZSBpbnR9IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhCisgICAgICogU3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gaW5zZXJ0IGF0LgorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGludH0gdmFsdWUgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXR9IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBsZW5ndGgoKX0uCiAgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgaW5zZXJ0KGludCBvZmZzZXQsIGludCBpKSB7CiAgICAgICAgIGluc2VydDAob2Zmc2V0LCBJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKQEAgLTQ1NywyMSArNDQxLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSBwYXNzZWQKLSAgICAgKiBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBhc3NlZC4gVGhlCi0gICAgICogPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgaXMgY29udmVydGVkIHRvIGEgU3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZQotICAgICAqIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGxvbmcpfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCBvZiB0aGlzIG9iamVjdCB0byBpbnNlcnQgdGhlIHZhbHVlLgotICAgICAqIEBwYXJhbSBsIFRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBsb25nfSB2YWx1ZSBhdAorICAgICAqIHRoZSBzcGVjaWZpZWQge0Bjb2RlIG9mZnNldH0uIFRoZSB7QGNvZGUgbG9uZ30gdmFsdWUgaXMgY29udmVydGVkIHRvIGEKKyAgICAgKiBTdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGxvbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gaW5zZXJ0IGF0LgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGxvbmd9IHZhbHVlIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICB7Y29kZSBsZW5ndGgoKX0uCiAgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihsb25nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGluc2VydChpbnQgb2Zmc2V0LCBsb25nIGwpIHsKICAgICAgICAgaW5zZXJ0MChvZmZzZXQsIExvbmcudG9TdHJpbmcobCkpOwpAQCAtNDc5LDIxICs0NjIsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBJbnNlcnRzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZQotICAgICAqIHBhc3NlZCBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBhc3NlZC4gVGhlCi0gICAgICogPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUKLSAgICAgKiBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihmbG9hdCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGluZGV4IG9mIHRoaXMgb2JqZWN0IHRvIGluc2VydCB0aGUgdmFsdWUuCi0gICAgICogQHBhcmFtIGYgVGhlIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBmbG9hdH0gdmFsdWUgYXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHtAY29kZSBvZmZzZXR9LiBUaGUge0Bjb2RlIGZsb2F0fSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYQorICAgICAqIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUgZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoZmxvYXQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gaW5zZXJ0IGF0LgorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGZsb2F0fSB2YWx1ZSB0byBpbnNlcnQuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxlbmd0aCgpfS4KICAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGZsb2F0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGluc2VydChpbnQgb2Zmc2V0LCBmbG9hdCBmKSB7CiAgICAgICAgIGluc2VydDAob2Zmc2V0LCBGbG9hdC50b1N0cmluZyhmKSk7CkBAIC01MDEsMjEgKzQ4MywyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEluc2VydHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZQotICAgICAqIHBhc3NlZCBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBhc3NlZC4gVGhlCi0gICAgICogPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgYWNjb3JkaW5nIHRvIHRoZQotICAgICAqIHJ1bGUgZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoZG91YmxlKX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggb2YgdGhpcyBvYmplY3QgdG8gaW5zZXJ0IHRoZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZCBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBkb3VibGV9IHZhbHVlCisgICAgICogYXQgdGhlIHNwZWNpZmllZCB7QGNvZGUgb2Zmc2V0fS4gVGhlIHtAY29kZSBkb3VibGV9IHZhbHVlIGlzIGNvbnZlcnRlZAorICAgICAqIHRvIGEgU3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZSBkZWZpbmVkIGJ5CisgICAgICoge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGRvdWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0byBpbnNlcnQgYXQuCisgICAgICogQHBhcmFtIGQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgZG91YmxlfSB2YWx1ZSB0byBpbnNlcnQuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxlbmd0aCgpfS4KICAgICAgKiBAc2VlIFN0cmluZyN2YWx1ZU9mKGRvdWJsZSkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBpbnNlcnQoaW50IG9mZnNldCwgZG91YmxlIGQpIHsKICAgICAgICAgaW5zZXJ0MChvZmZzZXQsIERvdWJsZS50b1N0cmluZyhkKSk7CkBAIC01MjMsMjEgKzUwNSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEluc2VydHMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZQotICAgICAqIHBhc3NlZCBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBhc3NlZC4gVGhlCi0gICAgICogPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgYWNjb3JkaW5nIHRvIHRoZQotICAgICAqIHJ1bGUgZGVmaW5lZCBieSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggb2YgdGhpcyBvYmplY3QgdG8gaW5zZXJ0IHRoZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gb2JqIFRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlIHRvIGluc2VydCBpbnRvIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotICAgICAqICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9LgotICAgICAqCisgICAgICogSW5zZXJ0cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIE9iamVjdH0gYXQgdGhlCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBvZmZzZXR9LiBUaGUge0Bjb2RlIE9iamVjdH0gdmFsdWUgaXMgY29udmVydGVkIHRvIGEKKyAgICAgKiBTdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlIGRlZmluZWQgYnkge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0byBpbnNlcnQgYXQuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3R9IHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbGVuZ3RoKCl9LgogICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGluc2VydChpbnQgb2Zmc2V0LCBPYmplY3Qgb2JqKSB7CiAgICAgICAgIGluc2VydDAob2Zmc2V0LCBvYmogPT0gbnVsbCA/ICJudWxsIiA6IG9iai50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJApAQCAtNTQ1LDE4ICs1MjYsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBJbnNlcnRzIHRoZSBTdHJpbmcgdmFsdWUgcGFzc2VkIGludG8gdGhpcyBvYmplY3QgYXQgdGhlCi0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPiBwYXNzZWQuIElmIHRoZSBTdHJpbmcgcGFyYW1ldGVyIGlzIG51bGwsIHRoZW4gdGhlCi0gICAgICogU3RyaW5nIDxjb2RlPiJudWxsIjwvY29kZT4gaXMgaW5zZXJ0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggb2YgdGhpcyBvYmplY3QgdG8gaW5zZXJ0IHRoZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gc3RyIFRoZSBTdHJpbmcgdG8gaW5zZXJ0IGludG8gdGhpcyBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQge0BsaW5rICNsZW5ndGgoKX0uCisgICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhdCB0aGUgc3BlY2lmaWVkIHtAY29kZSBvZmZzZXR9LiBJZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgc3RyaW5nIGlzIG51bGwsIHRoZW4gdGhlIFN0cmluZyB7QGNvZGUgIm51bGwifSBpcyBpbnNlcnRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gaW5zZXJ0IGF0LgorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU3RyaW5nfSB0byBpbnNlcnQuCisgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxlbmd0aCgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBpbnNlcnQoaW50IG9mZnNldCwgU3RyaW5nIHN0cikgewogICAgICAgICBpbnNlcnQwKG9mZnNldCwgc3RyKTsKQEAgLTU2NCwyMSArNTQ1LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5jaGFyW108L2NvZGU+IHZhbHVlCi0gICAgICogcGFzc2VkIGludG8gdGhpcyBvYmplY3QgYXQgdGhlIDxjb2RlPm9mZnNldDwvY29kZT4gcGFzc2VkLiBUaGUKLSAgICAgKiA8Y29kZT5jaGFyW108L2NvZGU+IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICogcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyW10pfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCBvZiB0aGlzIG9iamVjdCB0byBpbnNlcnQgdGhlIHZhbHVlLgotICAgICAqIEBwYXJhbSBjaCBUaGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBjaGFyW119IGF0IHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgb2Zmc2V0fS4gVGhlIHtAY29kZSBjaGFyW119IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhCisgICAgICogU3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZSBkZWZpbmVkIGJ5IHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyW10pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gaW5zZXJ0IGF0LgorICAgICAqIEBwYXJhbSBjaAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBjaGFyW119IHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbGVuZ3RoKCl9LgogICAgICAqIEBzZWUgU3RyaW5nI3ZhbHVlT2YoY2hhcltdKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGluc2VydChpbnQgb2Zmc2V0LCBjaGFyW10gY2gpIHsKICAgICAgICAgaW5zZXJ0MChvZmZzZXQsIGNoKTsKQEAgLTU4NiwyNiArNTY2LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdWJzZXF1ZW5jZSBvZiB0aGUKLSAgICAgKiA8Y29kZT5jaGFyW108L2NvZGU+IHZhbHVlIHBhc3NlZCBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZQotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4gcGFzc2VkLiBUaGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB2YWx1ZSBpcwotICAgICAqIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUgZGVmaW5lZCBieQorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHN1YnNlcXVlbmNlIG9mIHRoZQorICAgICAqIHtAY29kZSBjaGFyW119IGF0IHRoZSBzcGVjaWZpZWQge0Bjb2RlIG9mZnNldH0uIFRoZSB7QGNvZGUgY2hhcltdfSB2YWx1ZQorICAgICAqIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUgZGVmaW5lZCBieQogICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyW10saW50LGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGluZGV4IG9mIHRoaXMgb2JqZWN0IHRvIGluc2VydCB0aGUgdmFsdWUuCi0gICAgICogQHBhcmFtIHN0ciBUaGUgPGNvZGU+Y2hhcltdPC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gc3RyT2Zmc2V0IFRoZSBpbmNsdXNpdmUgaW5kZXggb2YgdGhlIDxjb2RlPnN0cjwvY29kZT4gcGFyYW1ldGVyCi0gICAgICogICAgICAgIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS4KLSAgICAgKiBAcGFyYW0gc3RyTGVuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5IGZyb20gdGhlIDxjb2RlPnN0cjwvY29kZT4KLSAgICAgKiAgICAgICAgcGFyYW1ldGVyLgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotICAgICAqICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9LgotICAgICAqCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHRvIGluc2VydCBhdC4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGNoYXJbXX0gdG8gaW5zZXJ0LgorICAgICAqIEBwYXJhbSBzdHJPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmNsdXNpdmUgaW5kZXguCisgICAgICogQHBhcmFtIHN0ckxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXR9IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBsZW5ndGgoKX0sIG9yIHtAY29kZSBzdHJPZmZzZXR9IGFuZCB7QGNvZGUgc3RyTGVufSBkbworICAgICAqICAgICAgICAgICAgIG5vdCBzcGVjaWZ5IGEgdmFsaWQgc3Vic2VxdWVuY2UuCiAgICAgICogQHNlZSBTdHJpbmcjdmFsdWVPZihjaGFyW10saW50LGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBpbnNlcnQoaW50IG9mZnNldCwgY2hhcltdIHN0ciwgaW50IHN0ck9mZnNldCwKICAgICAgICAgICAgIGludCBzdHJMZW4pIHsKQEAgLTYxNCwyMyArNTk0LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+Ci0gICAgICogdmFsdWUgcGFzc2VkIGludG8gdGhpcyBvYmplY3QgYXQgdGhlIDxjb2RlPm9mZnNldDwvY29kZT4gcGFzc2VkLiBUaGUKLSAgICAgKiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhcyBkZWZpbmVkIGJ5Ci0gICAgICoge0BsaW5rIENoYXJTZXF1ZW5jZSN0b1N0cmluZygpfS4gSWYgdGhlIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgU3RyaW5nIDxjb2RlPiJudWxsIjwvY29kZT4gaXMgaW5zZXJ0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggb2YgdGhpcyBvYmplY3QgdG8gaW5zZXJ0IHRoZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gcyBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGlzCi0gICAgICogICAgICAgIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgbmVnYXRpdmUgb3IKLSAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB7QGxpbmsgI2xlbmd0aCgpfS4KLSAgICAgKgorICAgICAqIEluc2VydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBDaGFyU2VxdWVuY2V9CisgICAgICogYXQgdGhlIHNwZWNpZmllZCB7QGNvZGUgb2Zmc2V0fS4gVGhlIHtAY29kZSBDaGFyU2VxdWVuY2V9IGlzIGNvbnZlcnRlZAorICAgICAqIHRvIGEgU3RyaW5nIGFzIGRlZmluZWQgYnkge0BsaW5rIENoYXJTZXF1ZW5jZSN0b1N0cmluZygpfS4gSWYge0Bjb2RlIHN9CisgICAgICogaXMge0Bjb2RlIG51bGx9LCB0aGVuIHRoZSBTdHJpbmcge0Bjb2RlICJudWxsIn0gaXMgaW5zZXJ0ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHRvIGluc2VydCBhdC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDaGFyU2VxdWVuY2V9IHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbGVuZ3RoKCl9LgogICAgICAqIEBzZWUgQ2hhclNlcXVlbmNlI3RvU3RyaW5nKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBpbnNlcnQoaW50IG9mZnNldCwgQ2hhclNlcXVlbmNlIHMpIHsKICAgICAgICAgaW5zZXJ0MChvZmZzZXQsIHMgPT0gbnVsbCA/ICJudWxsIiA6IHMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTYzOCwyOCArNjE2LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdWJzZXF1ZW5jZSBvZiB0aGUKLSAgICAgKiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHZhbHVlIHBhc3NlZCBpbnRvIHRoaXMgb2JqZWN0IGF0IHRoZQotICAgICAqIDxjb2RlPm9mZnNldDwvY29kZT4gcGFzc2VkLiBUaGUgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiB2YWx1ZSBpcwotICAgICAqIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhcyBkZWZpbmVkIGJ5Ci0gICAgICoge0BsaW5rIENoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCl9LiBJZiB0aGUKLSAgICAgKiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBTdHJpbmcKLSAgICAgKiA8Y29kZT4ibnVsbCI8L2NvZGU+IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdWJzZXF1ZW5jZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCBvZiB0aGlzIG9iamVjdCB0byBpbnNlcnQgdGhlIHZhbHVlLgotICAgICAqIEBwYXJhbSBzIFRoZSA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHZhbHVlIHRvIGluc2VydCBpbnRvIHRoaXMKLSAgICAgKiAgICAgICAgb2JqZWN0LgotICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHN1YnNlcXVlbmNlIG9mIHRoZSA8Y29kZT5zPC9jb2RlPgotICAgICAqICAgICAgICBwYXJhbWV0ZXIuCi0gICAgICogQHBhcmFtIGVuZCBUaGUgZW5kIG9mIHRoZSBzdWJzZXF1ZW5jZSBvZiB0aGUgPGNvZGU+czwvY29kZT4gcGFyYW1ldGVyLgotICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyBuZWdhdGl2ZSBvcgotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9LgotICAgICAqCisgICAgICogSW5zZXJ0cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgc3Vic2VxdWVuY2Ugb2YgdGhlCisgICAgICoge0Bjb2RlIENoYXJTZXF1ZW5jZX0gYXQgdGhlIHNwZWNpZmllZCB7QGNvZGUgb2Zmc2V0fS4gVGhlIHtAY29kZQorICAgICAqIENoYXJTZXF1ZW5jZX0gaXMgY29udmVydGVkIHRvIGEgU3RyaW5nIGFzIGRlZmluZWQgYnkKKyAgICAgKiB7QGxpbmsgQ2hhclNlcXVlbmNlI3N1YlNlcXVlbmNlKGludCwgaW50KX0uIElmIHRoZSB7QGNvZGUgQ2hhclNlcXVlbmNlfQorICAgICAqIGlzIHtAY29kZSBudWxsfSwgdGhlbiB0aGUgc3RyaW5nIHtAY29kZSAibnVsbCJ9IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAqIHN1YnNlcXVlbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0byBpbnNlcnQgYXQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2hhclNlcXVlbmNlfSB0byBpbnNlcnQuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIHN1YnNlcXVlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgc3Vic2VxdWVuY2Ugb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0fSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbGVuZ3RoKCl9LCBvciB7QGNvZGUgc3RhcnR9IGFuZCB7QGNvZGUgZW5kfSBkbyBub3QKKyAgICAgKiAgICAgICAgICAgICBzcGVjaWZ5IGEgdmFsaWQgc3Vic2VxdWVuY2UuCiAgICAgICogQHNlZSBDaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgaW5zZXJ0KGludCBvZmZzZXQsIENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaW5zZXJ0MChvZmZzZXQsIHMsIHN0YXJ0LCBlbmQpOwpAQCAtNjY3LDIzICs2NDUsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXBsYWNlcyB0aGUgaW5kaWNhdGVkIHN1YnNlcXVlbmNlIG9mIHRoaXMgb2JqZWN0IHdpdGggdGhlIFN0cmluZyBwYXNzZWQuCi0gICAgICogSWYgdGhlIFN0cmluZyBwYXNzZWQgaXMgbG9uZ2VyIG9yIHNob3J0ZXIgdGhhbiB0aGUgc3Vic2VxdWVuY2UsIHRoZW4gdGhpcwotICAgICAqIG9iamVjdCB3aWxsIGJlIGFkanVzdGVkIGFwcHJvcHJpYXRlbHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBpbmNsdXNpdmUgc3RhcnQgaW5kZXggb2YgdGhlIHNlcXVlbmNlIHRvIHJlcGxhY2UgaW4gdGhpcwotICAgICAqICAgICAgICBvYmplY3QuCi0gICAgICogQHBhcmFtIGVuZCBUaGUgZXhjbHVzaXZlIGVuZCBpbmRleCBvZiB0aGUgc2VxdWVuY2UgdG8gcmVwbGFjZSBpbiB0aGlzCi0gICAgICogICAgICAgIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gc3RyIFRoZSBTdHJpbmcgdG8gcmVwbGFjZSB0aGUgc3Vic2VxdWVuY2UuCi0gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICBuZWdhdGl2ZSwgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHtAbGluayAjbGVuZ3RoKCl9IG9yIGdyZWF0ZXIKLSAgICAgKiAgICAgICAgIHRoYW4gPGNvZGU+ZW5kPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5zdHI8L2NvZGU+IHBhcmFtZXRlciBpcwotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogUmVwbGFjZXMgdGhlIHNwZWNpZmllZCBzdWJzZXF1ZW5jZSBpbiB0aGlzIGJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogc3RyaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIGluY2x1c2l2ZSBiZWdpbiBpbmRleC4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgZXhjbHVzaXZlIGVuZCBpbmRleC4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAqIEB0aHJvd3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydH0gaXMgbmVnYXRpdmUsIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBsZW5ndGgoKX0gb3IgZ3JlYXRlciB0aGFuIHtAY29kZSBlbmR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIHJlcGxhY2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgc3RyKSB7CiAgICAgICAgIHJlcGxhY2UwKHN0YXJ0LCBlbmQsIHN0cik7CkBAIC02OTEsMTEgKzY2NiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldmVyc2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgorICAgICAqIFJldmVyc2VzIHRoZSBvcmRlciBvZiBjaGFyYWN0ZXJzIGluIHRoaXMgYnVpbGRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIHJldmVyc2UoKSB7CiAgICAgICAgIHJldmVyc2UwKCk7CkBAIC03MDMsOSArNjc3LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBTdHJpbmdCdWlsZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgU3RyaW5nQnVpbGRlcgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVpbGRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgaW4gdGhpcyBidWlsZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC03MTgsMTQgKzY5MywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJlYWRzIHRoZSBzdGF0ZSBvZiBhIDxjb2RlPlN0cmluZ0J1aWxkZXI8L2NvZGU+IGZyb20gdGhlIHBhc3NlZCBzdHJlYW0KLSAgICAgKiBhbmQgcmVzdG9yZXMgaXQgdG8gdGhpcyBpbnN0YW5jZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gVGhlIHN0cmVhbSB0byByZWFkIHRoZSBzdGF0ZSBmcm9tLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSB0aHJvd3MgaXQgZHVyaW5nIHRoZSByZWFkLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIHRocm93cyBpdCBkdXJpbmcgdGhlIHJlYWQuCisgICAgICogUmVhZHMgdGhlIHN0YXRlIG9mIGEge0Bjb2RlIFN0cmluZ0J1aWxkZXJ9IGZyb20gdGhlIHBhc3NlZCBzdHJlYW0gYW5kCisgICAgICogcmVzdG9yZXMgaXQgdG8gdGhpcyBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgc3RhdGUgZnJvbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0cmVhbSB0aHJvd3MgaXQgZHVyaW5nIHRoZSByZWFkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdHJlYW0gdGhyb3dzIGl0IGR1cmluZyB0aGUgcmVhZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CkBAIC03MzYsMTUgKzcxMiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIFdyaXRlcyB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QgdG8gdGhlIHN0cmVhbSBwYXNzZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBzdGF0ZSB0by4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gdGhyb3dzIGl0IGR1cmluZyB0aGUgd3JpdGUuCi0gICAgICogQHNlcmlhbERhdGEgPGNvZGU+aW50PC9jb2RlPiAtIFRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAgICogICAgICAgICAgICAgPGNvZGU+Y2hhcltdPC9jb2RlPiAtIFRoZSBidWZmZXIgZnJvbSB0aGlzIG9iamVjdCwgd2hpY2gKLSAgICAgKiAgICAgICAgICAgICBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBzdGF0ZSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0cmVhbSB0aHJvd3MgaXQgZHVyaW5nIHRoZSB3cml0ZS4KKyAgICAgKiBAc2VyaWFsRGF0YSB7QGNvZGUgaW50fSAtIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuIHtAY29kZSBjaGFyW119IC0gdGhlCisgICAgICogICAgICAgICAgICAgYnVmZmVyIGZyb20gdGhpcyBvYmplY3QsIHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogICAgICAgICAgICAgZmllbGQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLmphdmEKaW5kZXggMzhjZTE3ZS4uYTJmY2E5YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLmphdmEKQEAgLTIxLDM4ICsyMSw0NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoaXMgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gdGhlIGEgU3RyaW5nIGlzIGluZGV4ZWQgd2l0aCBhIHZhbHVlCi0gKiBsZXNzIHRoYW4gemVybywgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBhcnJheS4KKyAqIFRocm93biB3aGVuIHRoZSBhIHN0cmluZyBpcyBpbmRleGVkIHdpdGggYSB2YWx1ZSBsZXNzIHRoYW4gemVybywgb3IgZ3JlYXRlcgorICogdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHRlbmRzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY3NjI5MTA0MjIxNTk2MzcyNThMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzCisgICAgICogdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogKHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBhcmd1bWVudCB3aGljaCBpcyB0aGUgaW5kZXggd2hpY2ggZmFpbGVkKSBmaWxsZWQKLSAgICAgKiBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIGEgZGV0YWlsIG1lc3NhZ2UgdGhhdCBpcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGludmFsaWQKKyAgICAgKiB7QGNvZGUgaW5kZXh9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgaW50IHRoZSBpbmRleCB3aGljaCBpcyBvdXQgb2YgYm91bmRzCi0gICAgICovCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2hpY2ggaXMgb3V0IG9mIGJvdW5kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW50IGluZGV4KSB7CiAgICAgICAgIHN1cGVyKE1zZy5nZXRTdHJpbmcoIkswMDU1IiwgaW5kZXgpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TdXBwcmVzc1dhcm5pbmdzLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N1cHByZXNzV2FybmluZ3MuamF2YQppbmRleCBhY2MyZGI2Li5kM2I0Mjg5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N1cHByZXNzV2FybmluZ3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N1cHByZXNzV2FybmluZ3MuamF2YQpAQCAtMjcsOSArMjcsMjYgQEAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwogCisvKioKKyAqIEFubm90YXRpb24gdHlwZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QgaXNzdWUgdGhlCisgKiBzcGVjaWZpZWQgd2FybmluZ3MgZm9yIHRoZSBtYXJrZWQgcHJvZ3JhbSBlbGVtZW50LiBXYXJuaW5ncyBhcmUgbm90IG9ubHkKKyAqIHN1cHByZXNzZWQgZm9yIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCBidXQgYWxzbyBmb3IgYWxsIHByb2dyYW0gZWxlbWVudHMKKyAqIGNvbnRhaW5lZCBpbiB0aGF0IGVsZW1lbnQuCisgKiA8cD4KKyAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgcHJvZ3JhbW1lcnMgYWx3YXlzIHVzZSB0aGlzIGFubm90YXRpb24gb24gdGhlIG1vc3QKKyAqIGRlZXBseSBuZXN0ZWQgZWxlbWVudCB3aGVyZSBpdCBpcyBhY3R1YWxseSBuZWVkZWQuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBAVGFyZ2V0KHZhbHVlPXtUWVBFLEZJRUxELE1FVEhPRCxQQVJBTUVURVIsQ09OU1RSVUNUT1IsTE9DQUxfVkFSSUFCTEV9KQogQFJldGVudGlvbih2YWx1ZT1TT1VSQ0UpCiBwdWJsaWMgQGludGVyZmFjZSBTdXBwcmVzc1dhcm5pbmdzCiB7CisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2Ygd2FybmluZ3MgYSBjb21waWxlciBzaG91bGQgbm90IGlzc3VlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIFN0cmluZ1tdIHZhbHVlKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1RocmVhZERlYXRoLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1RocmVhZERlYXRoLmphdmEKaW5kZXggMjQ4MmIzNC4uZTRmMmNjMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWREZWF0aC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVGhyZWFkRGVhdGguamF2YQpAQCAtMTcsMTAgKzE3LDExIEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgogICogVGhyZWFkRGVhdGggaXMgdGhyb3duIHdoZW4gYSB0aHJlYWQgc3RvcHMgZXhlY3V0aW5nLiBJdCBpcyB1c2VkIHRvIGFpZCBpbiB0aGUKICAqIG9yZGVybHkgdW5yb2xsaW5nIG9mIHRoZSB0aHJlYWQncyBzdGFjayAoZWcuIGNsZWFudXAgb2YgbW9uaXRvcnMpLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFRocmVhZERlYXRoIGV4dGVuZHMgRXJyb3IgewogCkBAIC0yOCw4ICsyOSwxMCBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YKLSAgICAgKiBUaHJlYWREZWF0aCwgdGhlIHdhbGtiYWNrIG1heSA8ZW0+bm90PC9lbT4gYmUgZmlsbGVkIGluIGEgd2F5IHdoaWNoCisgICAgICogVGhyZWFkRGVhdGgsIHRoZSBzdGFja3RyYWNlIG1heSA8ZW0+bm90PC9lbT4gYmUgZmlsbGVkIGluIGEgd2F5IHdoaWNoCiAgICAgICogYWxsb3dzIGEgc3RhY2sgdHJhY2UgdG8gYmUgcHJpbnRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyZWFkRGVhdGgoKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWRMb2NhbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWRMb2NhbC5qYXZhCmluZGV4IDk3YWU5YjIuLjU4ZTg1YmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVGhyZWFkTG9jYWwuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1RocmVhZExvY2FsLmphdmEKQEAgLTIxLDE4ICsyMSwyMiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiAvKioKLSAqIEEgdmFyaWFibGUgZm9yIHdoaWNoIGVhY2ggdGhyZWFkIGhhcyBpdHMgb3duIHZhbHVlLiBTdXBwb3J0cyB7QGNvZGUgbnVsbH0KLSAqIHZhbHVlcy4KKyAqIEltcGxlbWVudHMgYSB0aHJlYWQtbG9jYWwgc3RvcmFnZSwgdGhhdCBpcywgYSB2YXJpYWJsZSBmb3Igd2hpY2ggZWFjaCB0aHJlYWQKKyAqIGhhcyBpdHMgb3duIHZhbHVlLiBBbGwgdGhyZWFkcyBzaGFyZSB0aGUgc2FtZSB7QGNvZGUgVGhyZWFkTG9jYWx9IG9iamVjdCwKKyAqIGJ1dCBlYWNoIHNlZXMgYSBkaWZmZXJlbnQgdmFsdWUgd2hlbiBhY2Nlc3NpbmcgaXQsIGFuZCBjaGFuZ2VzIG1hZGUgYnkgb25lCisgKiB0aHJlYWQgZG8gbm90IGFmZmVjdCB0aGUgb3RoZXIgdGhyZWFkcy4gVGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCisgKiB7QGNvZGUgbnVsbH0gdmFsdWVzLgogICogCiAgKiBAc2VlIGphdmEubGFuZy5UaHJlYWQKICAqIEBhdXRob3IgQm9iIExlZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbDxUPiB7CiAKICAgICAvKiBUaGFua3MgdG8gSm9zaCBCbG9jaCBhbmQgRG91ZyBMZWEgZm9yIGNvZGUgcmV2aWV3cyBhbmQgaW1wbCBhZHZpY2UuICovCiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHRocmVhZCBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHRocmVhZC1sb2NhbCB2YXJpYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgVGhyZWFkTG9jYWwoKSB7fQogCkBAIC00MSw2ICs0NSw4IEBACiAgICAgICogZG9lc24ndCB5ZXQgZXhpc3QgZm9yIHRoaXMgdmFyaWFibGUgb24gdGhpcyB0aHJlYWQsIHRoaXMgbWV0aG9kIHdpbGwKICAgICAgKiBjcmVhdGUgYW4gZW50cnksIHBvcHVsYXRpbmcgdGhlIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZgogICAgICAqIHtAbGluayAjaW5pdGlhbFZhbHVlKCl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIFQgZ2V0KCkgewpAQCAtNjMsNiArNjksOCBAQAogICAgIC8qKgogICAgICAqIFByb3ZpZGVzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgVCBpbml0aWFsVmFsdWUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtNzAsOCArNzgsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4gSWYgc2V0IHRvCi0gICAgICogbnVsbCwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvIG51bGwgYW5kIHRoZSB1bmRlcmx5aW5nIGVudHJ5IHdpbGwgc3RpbGwKLSAgICAgKiBiZSBwcmVzZW50LgorICAgICAqIHtAY29kZSBudWxsfSwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvIG51bGwgYW5kIHRoZSB1bmRlcmx5aW5nIGVudHJ5IHdpbGwKKyAgICAgKiBzdGlsbCBiZSBwcmVzZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBmb3IgdGhlIGNhbGxlciB0aHJlYWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0KFQgdmFsdWUpIHsKICAgICAgICAgVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwpAQCAtODQsNyArOTQsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZW50cnkgZm9yIHRoaXMgdmFyaWFibGUgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLiBJZiB0aGlzIGNhbGwKLSAgICAgKiBpcyBmb2xsb3dlZCBieSBhIHtAbGluayAjZ2V0KCl9IGJlZm9yZSBhIHtAbGluayAjc2V0KFQpfSwKKyAgICAgKiBpcyBmb2xsb3dlZCBieSBhIHtAbGluayAjZ2V0KCl9IGJlZm9yZSBhIHtAbGluayAjc2V0fSwKICAgICAgKiB7QGNvZGUgI2dldCgpfSB3aWxsIGNhbGwge0BsaW5rICNpbml0aWFsVmFsdWUoKX0gYW5kIGNyZWF0ZSBhIG5ldwogICAgICAqIGVudHJ5IHdpdGggdGhlIHJlc3VsdGluZyB2YWx1ZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVHlwZU5vdFByZXNlbnRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVHlwZU5vdFByZXNlbnRFeGNlcHRpb24uamF2YQppbmRleCAzNDY2ZGRiLi4xMWVmNGMxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1R5cGVOb3RQcmVzZW50RXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UeXBlTm90UHJlc2VudEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDMxICsxLDI4IEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCisvKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCiAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKIC8qKgotICogPHA+Ci0gKiBJbmRpY2F0ZXMgdGhhdCBhIGNsYXNzLCBpbnRlcmZhY2UsIGVudW0gb3IgYW5ub3RhdGlvbiB0eXBlIGNhbm5vdCBiZSBmb3VuZC4KLSAqIFRoaXMgZXhjZXB0aW9uIGlzIGFuIHVuY2hlY2tlZCBhbHRlcm5hdGl2ZSB0bworICogVGhyb3duIHdoZW4gYSBwcm9ncmFtIHRyaWVzIHRvIGFjY2VzcyBhIGNsYXNzLCBpbnRlcmZhY2UsIGVudW0gb3IgYW5ub3RhdGlvbgorICogdHlwZSB0aHJvdWdoIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIHR5cGUncyBuYW1lIGFuZCB0aGUgdHlwZSBjYW5ub3QgYmUKKyAqIGZvdW5kLiBUaGlzIGV4Y2VwdGlvbiBpcyBhbiB1bmNoZWNrZWQgYWx0ZXJuYXRpdmUgdG8KICAqIHtAbGluayBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0uCi0gKiA8L3A+CiAgKiAKLSAqIEBzaW5jZSAxLjUKLSAqIEBhdXRob3IgTmF0aGFuIEJleWVyIChIYXJtb255KQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MTAxMjE0MTk1NzE2NTM0NDk2TDsKQEAgLTMzLDE0ICszMCwxNSBAQAogICAgIHByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aWxsIGEgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBhbmQgYW4gb3B0aW9uYWwKLSAgICAgKiBjYXVzZS4KLSAgICAgKiA8L3A+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVHlwZU5vdFByZXNlbnRFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSwgYSBkZXRhaWwgbWVzc2FnZSB0aGF0IGluY2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoYXQgY291bGQgbm90CisgICAgICogYmUgZm91bmQgYW5kIHRoZSB7QGNvZGUgVGhyb3dhYmxlfSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZU5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uIG9yCi0gICAgICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0eXBlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIHRoYXQgY291bGQgbm90IGJlIGZvdW5kLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIG9wdGlvbmFsIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uLCBtYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbihTdHJpbmcgdHlwZU5hbWUsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcigiVHlwZSAiICsgdHlwZU5hbWUgKyAiIG5vdCBwcmVzZW50IiwgY2F1c2UpOwpAQCAtNDgsMTEgKzQ2LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZS4KLSAgICAgKiA8L3A+CisgICAgICogR2V0cyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgdGhhdCBjb3VsZCBub3QgYmUgZm91bmQuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIFN0cmluZyBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdHlwZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiB0eXBlTmFtZTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVW5rbm93bkVycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Vua25vd25FcnJvci5qYXZhCmluZGV4IGZmOTAyNDAuLmE5OGE1ZDQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVW5rbm93bkVycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Vbmtub3duRXJyb3IuamF2YQpAQCAtMTcsMjggKzE3LDMzIEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiB0aGUgdmlydHVhbCBtYWNoaW5lIG11c3QgdGhyb3cgYW4gZXJyb3Igd2hpY2ggZG9lcwotICogbm90IG1hdGNoIGFueSBrbm93biBleGNlcHRpb25hbCBjb25kaXRpb24uCisgKiBUaHJvd24gd2hlbiB0aGUgdmlydHVhbCBtYWNoaW5lIG11c3QgdGhyb3cgYW4gZXJyb3Igd2hpY2ggZG9lcyBub3QgbWF0Y2ggYW55CisgKiBrbm93biBleGNlcHRpb25hbCBjb25kaXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5rbm93bkVycm9yIGV4dGVuZHMgVmlydHVhbE1hY2hpbmVFcnJvciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNTI0Nzg0ODYwNjc2NzcxODQ5TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5rbm93bkVycm9yfSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVua25vd25FcnJvcigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5rbm93bkVycm9yfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbmtub3duRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Vuc2F0aXNmaWVkTGlua0Vycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Vuc2F0aXNmaWVkTGlua0Vycm9yLmphdmEKaW5kZXggZTQ0OTRkMC4uNDg5NjAxZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9VbnNhdGlzZmllZExpbmtFcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVW5zYXRpc2ZpZWRMaW5rRXJyb3IuamF2YQpAQCAtMTcsMjggKzE3LDMzIEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gaW52b2tlIGEgbmF0aXZlIGZvciB3aGljaCBhbgotICogaW1wbGVtZW50YXRpb24gY291bGQgbm90IGJlIGZvdW5kLgorICogVGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGludm9rZSBhIG5hdGl2ZSBmb3Igd2hpY2ggYW4gaW1wbGVtZW50YXRpb24KKyAqIGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBVbnNhdGlzZmllZExpbmtFcnJvciBleHRlbmRzIExpbmthZ2VFcnJvciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDAxOTM0MzI0MTYxNjg3OTQyOEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVuc2F0aXNmaWVkTGlua0Vycm9yfSB0aGF0IGluY2x1ZGVzIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVuc2F0aXNmaWVkTGlua0Vycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBVbnNhdGlzZmllZExpbmtFcnJvcn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5zYXRpc2ZpZWRMaW5rRXJyb3IoU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Vuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvci5qYXZhCmluZGV4IGQyZTc0MTUuLjNlZThmOGMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvci5qYXZhCkBAIC0xNywyOCArMTcsMzMgQEAKIAogcGFja2FnZSBqYXZhLmxhbmc7CiAKLQogLyoqCi0gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBsb2FkIGEgY2xhc3Mgd2l0aCBhIGZvcm1hdAotICogdmVyc2lvbiB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZNLgorICogVGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGxvYWQgYSBjbGFzcyB3aXRoIGEgZm9ybWF0IHZlcnNpb24gdGhhdCBpcworICogbm90IHN1cHBvcnRlZCBieSB0aGUgdmlydHVhbCBtYWNoaW5lLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IgZXh0ZW5kcyBDbGFzc0Zvcm1hdEVycm9yIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MTIzMjc5MjEyODgzNDk3MzczTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUKKyAgICAgKiBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IGNmNTAzMjguLjhiNzgyMjYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTE3LDQ1ICsxNyw2MCBAQAogCiBwYWNrYWdlIGphdmEubGFuZzsKIAotCiAvKioKLSAqIFRoaXMgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZC4KKyAqIFRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMjQyNTk5OTc5MDU1MDg0NjczTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICogY3VycmVudCBzdGFjayB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiA8cD5Db25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHdpdGggYSBtZXNzYWdlIGFuZCBjYXVzZS48L3A+Ci0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYXNzaWduIHRvIHRoaXMgZXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgb3B0aW9uYWwgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb247IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZSwgdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcHRpb25hbCBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIDxwPkNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBhIGNhdXNlLjwvcD4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIG9wdGlvbmFsIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgb3B0aW9uYWwgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24sIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcigoY2F1c2UgPT0gbnVsbCA/IG51bGwgOiBjYXVzZS50b1N0cmluZygpKSwgY2F1c2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9WTVRocmVhZC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9WTVRocmVhZC5qYXZhCmluZGV4IDc2Mzg0YWIuLjhlNzg5Y2IgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVk1UaHJlYWQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1ZNVGhyZWFkLmphdmEKQEAgLTUxLDE0ICs1MSwxNiBAQAogICAgICAqIFN1c3BlbmRzIHRoZSBUaHJlYWQuCiAgICAgICovCiAgICAgdm9pZCBzdXNwZW5kKCkgewotICAgICAgICAvLyBUT0RPIFRpY2tldCAxNjQ6IE5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBtaXNzaW5nLgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRlcHJlY2F0ZWQgVGhyZWFkIG1ldGhvZHMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVzdW1lcyB0aGUgVGhyZWFkLCBhc3N1bWluZyBpdCBpcyBzdXNwZW5kZWQuCiAgICAgICovCiAgICAgdm9pZCByZXN1bWUoKSB7Ci0gICAgICAgIC8vIFRPRE8gVGlja2V0IDE2NDogTmF0aXZlIGltcGxlbWVudGF0aW9uIG1pc3NpbmcuCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRGVwcmVjYXRlZCBUaHJlYWQgbWV0aG9kcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcxLDcgKzczLDggQEAKICAgICAgKiBTdG9wcyB0aGUgVGhyZWFkLCBwYXNzaW5nIGl0IGEgVGhyb3dhYmxlICh3aGljaCBtaWdodCBiZSBUaHJlYWREZWF0aCkuCiAgICAgICovCiAgICAgdm9pZCBzdG9wKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgLy8gVE9ETyBUaWNrZXQgMTY0OiBOYXRpdmUgaW1wbGVtZW50YXRpb24gbWlzc2luZy4KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJEZXByZWNhdGVkIFRocmVhZCBtZXRob2RzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOwogICAgIH0KIAogICAgIG5hdGl2ZSB2b2lkIHNldFByaW9yaXR5KGludCBuZXdQcmlvcml0eSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1ZlcmlmeUVycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1ZlcmlmeUVycm9yLmphdmEKaW5kZXggZmI4YWI0MS4uZGRmNGRlNyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9WZXJpZnlFcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVmVyaWZ5RXJyb3IuamF2YQpAQCAtMTcsMjggKzE3LDMzIEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCi0KIC8qKgotICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiB0aGUgVk0gbm90aWNlcyB0aGF0IGFuIGF0dGVtcHQgaXMgbWFkZSB0byBsb2FkIGEKKyAqIFRocm93biB3aGVuIHRoZSB2aXJ0dWFsIG1hY2hpbmUgbm90aWNlcyB0aGF0IGFuIGF0dGVtcHQgaXMgbWFkZSB0byBsb2FkIGEKICAqIGNsYXNzIHdoaWNoIGRvZXMgbm90IHBhc3MgdGhlIGNsYXNzIHZlcmlmaWNhdGlvbiBwaGFzZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBWZXJpZnlFcnJvciBleHRlbmRzIExpbmthZ2VFcnJvciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MDAxOTYyMzk2MDk4NDk4Nzg1TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVmVyaWZ5RXJyb3J9IHRoYXQgaW5jbHVkZXMgdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVmVyaWZ5RXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFZlcmlmeUVycm9yfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBWZXJpZnlFcnJvcihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVmlydHVhbE1hY2hpbmVFcnJvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9WaXJ0dWFsTWFjaGluZUVycm9yLmphdmEKaW5kZXggMzNkODRlZC4uMTA3ZjU2MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9WaXJ0dWFsTWFjaGluZUVycm9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9WaXJ0dWFsTWFjaGluZUVycm9yLmphdmEKQEAgLTE5LDI4ICsxOSwzMyBAQAogCiAKIC8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgZXJyb3JzIHRoYXQgb2NjdXIKKyAqIHtAY29kZSBWaXJ0dWFsTWFjaGluZUVycm9yfSBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgZXJyb3IgY2xhc3NlcyB0aGF0IG9jY3VyCiAgKiBkdXJpbmcgdGhlIG9wZXJhdGlvbiBvZiB0aGUgdmlydHVhbCBtYWNoaW5lLgogICogCiAgKiBAc2VlIEVycm9yCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFZpcnR1YWxNYWNoaW5lRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MTYxOTgzOTI2NTcxNTY4NjcwTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVmlydHVhbE1hY2hpbmVFcnJvcn0gdGhhdCBpbmNsdWRlcyB0aGUgY3VycmVudAorICAgICAqIHN0YWNrIHRyYWNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBWaXJ0dWFsTWFjaGluZUVycm9yKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBWaXJ0dWFsTWFjaGluZUVycm9yfSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlCisgICAgICogYW5kIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBWaXJ0dWFsTWFjaGluZUVycm9yKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9Wb2lkLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1ZvaWQuamF2YQppbmRleCBkN2E4OWI1Li44ZDA2YjY0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1ZvaWQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1ZvaWQuamF2YQpAQCAtMjAsMTQgKzIwLDE2IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBwbGFjZWhvbGRlciBjbGFzcyBmb3IgdGhlIEphdmEga2V5d29yZCA8Y29kZT52b2lkPC9jb2RlPgotICogQHNpbmNlIDEuMQorICogUGxhY2Vob2xkZXIgY2xhc3MgZm9yIHRoZSBKYXZhIGtleXdvcmQge0Bjb2RlIHZvaWR9LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFZvaWQgZXh0ZW5kcyBPYmplY3QgewogICAgIAogICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgQ2xhc3N9IGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyBwcmltaXRpdmUgdHlwZQotICAgICAqIDxjb2RlPnZvaWQ8L2NvZGU+LgorICAgICAqIFRoZSB7QGxpbmsgQ2xhc3N9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHByaW1pdGl2ZSB0eXBlIHtAY29kZSB2b2lkfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFZvaWQ+IFRZUEUgPSBsb29rdXBUeXBlKCk7CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcGFja2FnZS5odG1sIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9wYWNrYWdlLmh0bWwKaW5kZXggMWIyY2Q5NS4uZTYxMzQ2ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9wYWNrYWdlLmh0bWwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9wYWNrYWdlLmh0bWwKQEAgLTYsNSArNiw2IEBACiAgICAgICBhcyB3ZWxsIGFzIHNldmVyYWwgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgaW1wb3J0YW50IGRhdGEgdHlwZXMgb3IKICAgICAgIGNlbnRyYWwgYXNwZWN0cyBvZiB0aGUgZW52aXJvbm1lbnQgaG9zdGluZyB0aGUgYXBwbGljYXRpb24uCiAgICAgPC9wPgorICAgIEBzaW5jZSBBbmRyb2lkIDEuMAogICA8L2JvZHk+CiA8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVF1ZXVlLmphdmEKaW5kZXggYTMxZDhkZC4uZWI2MjgwYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZS5qYXZhCkBAIC04LDEzICs4LDE2IEBACiAgKgogICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gd2FzIGNoYW5nZWQgc2lnbmlmaWNhbnRseS4gQ2hhbmdlcyB3aGVyZSBub3QgbWFya2VkLgorLy8gRU5EIGFuZHJvaWQtbm90ZQogcGFja2FnZSBqYXZhLmxhbmcucmVmOwogCiAvKioKQEAgLTE0MSw1ICsxNDQsNCBAQAogICAgICAgICBoZWFkID0gdG9RdWV1ZTsKICAgICAgICAgbm90aWZ5KCk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvQW5ub3RhdGVkRWxlbWVudC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0Fubm90YXRlZEVsZW1lbnQuamF2YQppbmRleCA4ZGY3YzRjLi4yMzA5M2M1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvQW5ub3RhdGVkRWxlbWVudC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9Bbm5vdGF0ZWRFbGVtZW50LmphdmEKQEAgLTIwLDUyICsyMCw2NSBAQAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGFuIGFubm90YXRlZCBlbGVtZW50IHRvIGVuYWJsZSByZWZsZWN0aXZlIGFjY2VzcyB0bwotICogYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4KKyAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHJlZmxlY3RpdmUgYWNjZXNzIHRvIGFubm90YXRpb24gaW5mb3JtYXRpb24uCiAgKiAKICAqIEBzaW5jZSAxLjUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEFubm90YXRlZEVsZW1lbnQgewogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUge0BsaW5rIEFubm90YXRpb259IGZvciB0aGlzIGVsZW1lbnQgZm9yIHRoZSBhbm5vdGF0aW9uIHR5cGUKLSAgICAgKiBwYXNzZWQsIGlmIGl0IGV4aXN0cy4KKyAgICAgKiBSZXR1cm5zLCBmb3IgdGhpcyBlbGVtZW50LCB0aGUgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSwgb3IKKyAgICAgKiB7QGNvZGUgbnVsbH0gaWYgbm8gYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBwcmVzZW50CisgICAgICogKGluY2x1ZGluZyBpbmhlcml0ZWQgYW5ub3RhdGlvbnMpLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uVHlwZQotICAgICAqICAgICAgICAgICAgVGhlIENsYXNzIGluc3RhbmNlIG9mIHRoZSBhbm5vdGF0aW9uIHRvIHNlYXJjaCBmb3IuCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIEFubm90YXRpb259IGZvciB0aGlzIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgYW5ub3RhdGlvbiB0byBzZWFyY2ggZm9yCisgICAgICogICAgICAgICAgICAKKyAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIG9yIHtAY29kZSBudWxsfQorICAgICAqIAogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5hbm5vdGF0aW9uVHlwZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFubm90YXRpb25UeXBlfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICA8VCBleHRlbmRzIEFubm90YXRpb24+IFQgZ2V0QW5ub3RhdGlvbihDbGFzczxUPiBhbm5vdGF0aW9uVHlwZSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFsbCB7QGxpbmsgQW5ub3RhdGlvbn1zIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICogUmV0dXJucywgZm9yIHRoaXMgZWxlbWVudCwgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgKGluY2x1ZGluZworICAgICAqIGluaGVyaXRlZCBhbm5vdGF0aW9ucykuIElmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucyBwcmVzZW50LCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgYSB6ZXJvIGxlbmd0aCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBBbm5vdGF0aW9ufXMsIHdoaWNoIG1heSBiZSBlbXB0eSwgYnV0IG5ldmVyCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFsbCB7QGxpbmsgQW5ub3RhdGlvbn1zIHRoYXQgYXJlIGV4cGxpY2l0bHkgZGVjbGFyZWQgYnkgdGhpcwotICAgICAqIGVsZW1lbnQgKG5vdCBpbmhlcml0ZWQpLgorICAgICAqIFJldHVybnMsIGZvciB0aGlzIGVsZW1lbnQsIGFsbCBhbm5vdGF0aW9ucyB0aGF0IGFyZSBleHBsaWNpdGx5IGRlY2xhcmVkCisgICAgICogKG5vdCBpbmhlcml0ZWQpLiBJZiB0aGVyZSBhcmUgbm8gZGVjbGFyZWQgYW5ub3RhdGlvbnMgcHJlc2VudCwgdGhpcworICAgICAqIG1ldGhvZCByZXR1cm5zIGEgemVybyBsZW5ndGggYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiB7QGxpbmsgQW5ub3RhdGlvbn1zLCB3aGljaCBtYXkgYmUgZW1wdHksIGJ1dCBuZXZlcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBhbm5vdGF0aW9ucyBkZWNsYXJlZCBmb3IgdGhpcyBlbGVtZW50CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQW5ub3RhdGlvbltdIGdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhpcyBlbGVtZW50IGhhcyBhbiBhbm5vdGF0aW9uIGZvciB0aGUgYW5ub3RhdGlvbiB0eXBlCi0gICAgICogcGFzc2VkLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGVsZW1lbnQgaGFzIGFuIGFubm90YXRpb24gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0eXBlIChpbmNsdWRpbmcgaW5oZXJpdGVkIGFubm90YXRpb25zKS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUKLSAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyBpbnN0YW5jZSBvZiB0aGUgYW5ub3RhdGlvbiB0byBzZWFyY2ggZm9yLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gZXhpc3RzLCBvdGhlcndpc2UKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBhbm5vdGF0aW9uIHRvIHNlYXJjaCBmb3IKKyAgICAgKiAgICAgICAgICAgIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhbm5vdGF0aW9uIGV4aXN0cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+YW5ub3RhdGlvblR5cGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbm5vdGF0aW9uVHlwZX0gaXMge0Bjb2RlIG51bGx9CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY0FycmF5VHlwZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNBcnJheVR5cGUuamF2YQppbmRleCAzOTRlOWM5Li5kNDdkN2YyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY0FycmF5VHlwZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljQXJyYXlUeXBlLmphdmEKQEAgLTE4LDIxICsxOCwyNiBAQAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAogLyoqCi0gKiBSZXByZXNlbnRzIGFuIGFycmF5IHR5cGUgd2l0aCBhIGNvbXBvbmVudCB0eXBlIHRoYXQgaXMgcGFyYW1ldGVyaXplZCBvciBhCi0gKiB0eXBlIHZhcmlhYmxlLgorICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhbiBhcnJheSB0eXBlIHdpdGggYSBjb21wb25lbnQgdHlwZSB0aGF0IGlzIGVpdGhlcgorICogYSBwYXJhbWV0ZXJpemVkIHR5cGUgb3IgYSB0eXBlIHZhcmlhYmxlLgogICogCiAgKiBAc2luY2UgMS41CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBHZW5lcmljQXJyYXlUeXBlIGV4dGVuZHMgVHlwZSB7CisKICAgICAvKioKLSAgICAgKiBUaGUge0BsaW5rIFR5cGV9IHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5LgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5CiAgICAgICogCi0gICAgICogQHJldHVybiBBIHtAbGluayBUeXBlfSBpbnN0YW5jZS4KICAgICAgKiBAdGhyb3dzIFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cyB0byBhIG1pc3NpbmcgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29tcG9uZW50IHR5cGUgcG9pbnRzIHRvIGEgbWlzc2luZyB0eXBlCiAgICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb21wb25lbnQgdHlwZSBwb2ludHMgdG8gYSB0eXBlIHRoYXQgY2FuJ3QgYmUKLSAgICAgKiAgICAgICAgICAgICBpbnN0YW50aWF0ZWQgZm9yIHNvbWUgcmVhc29uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb21wb25lbnQgdHlwZSBwb2ludHMgdG8gYSB0eXBlIHRoYXQgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFR5cGUgZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljRGVjbGFyYXRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljRGVjbGFyYXRpb24uamF2YQppbmRleCBiMDVhZDA2Li42ZjJkY2IzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY0RlY2xhcmF0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNEZWNsYXJhdGlvbi5qYXZhCkBAIC0xNywxOSArMTcsMjMgQEAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKIC8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgZW50aXRpZXMgdGhhdCBoYXZlIHR5cGUgdmFyaWFibGVzLgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgbGFuZ3VhZ2UgY29uc3RydWN0cyB0aGF0IGRlY2xhcmUgdHlwZSBwYXJhbWV0ZXJzLgogICogCiAgKiBAc2luY2UgMS41CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBHZW5lcmljRGVjbGFyYXRpb24gewogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2VuZXJpYyBkZWNsYXJlZCB0eXBlcyBpbiBkZWNsYXJhdGlvbiBvcmRlci4gSWYgdGhlcmUgYXJlIG5vCi0gICAgICogZ2VuZXJpYyB0eXBlcyB0aGlzIG1ldGhvZCByZXR1cm5zIGEgemVybyBsZW5ndGggYXJyYXkuCisgICAgICogUmV0dXJucyB0aGUgZGVjbGFyZWQgdHlwZSBwYXJhbWV0ZXJzIGluIGRlY2xhcmF0aW9uIG9yZGVyLiBJZiB0aGVyZSBhcmUKKyAgICAgKiBubyB0eXBlIHBhcmFtZXRlcnMsIHRoaXMgbWV0aG9kIHJldHVybnMgYSB6ZXJvIGxlbmd0aCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGdlbmVyaWMgZGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMuCisgICAgICogQHJldHVybiB0aGUgZGVjbGFyZWQgdHlwZSBwYXJhbWV0ZXJzIGluIGRlY2xhcmF0aW9uIG9yZGVyCisgICAgICogCiAgICAgICogQHRocm93cyBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IKLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2lnbmF0dXJlIGlzIG1hbGZvcm1lZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2lnbmF0dXJlIGlzIG1hbGZvcm1lZAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFR5cGVWYXJpYWJsZTw/PltdIGdldFR5cGVQYXJhbWV0ZXJzKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY1NpZ25hdHVyZUZvcm1hdEVycm9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY1NpZ25hdHVyZUZvcm1hdEVycm9yLmphdmEKaW5kZXggZDM5NDg1MS4uNTY5MTU2NSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IuamF2YQpAQCAtMjAsMTMgKzIwLDE5IEBACiAvKioKICAqIEluZGljYXRlcyB0aGF0IGEgbWFsZm9ybWVkIHNpZ25hdHVyZSBoYXMgYmVlbiBlbmNvdW50ZXJlZCB2aWEgYSByZWZsZWN0aXZlCiAgKiBtZXRob2QuCi0gKiAKKyAqCiAgKiBAc2luY2UgMS41CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvciBleHRlbmRzIENsYXNzRm9ybWF0RXJyb3IgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjcwOTkxOTE0NzEzNzkxMTAzNEw7CiAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3J9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvcigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvbkhhbmRsZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlci5qYXZhCmluZGV4IGJhZGNlMTguLmIyOGQ1MzUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlci5qYXZhCkBAIC0xOCwzMiArMTgsNDggQEAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKIC8qKgotICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIGRlY29kZSBhbmQgZGlzcGF0Y2ggbWV0aG9kcyBzZW50IHRvIHByb3h5Ci0gKiBpbnN0YW5jZXMuCisgKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2UgZGlzcGF0Y2ggbWV0aG9kcyBpbnZva2VkIG9uIHByb3h5IGluc3RhbmNlcy4KICAqIAogICogQHNlZSBQcm94eQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJbnZvY2F0aW9uSGFuZGxlciB7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBkZWNvZGluZyBhbmQgZGlzcGF0Y2hpbmcgdGhlIG1ldGhvZCB3aGljaCB3YXMKLSAgICAgKiBvcmlnaW5hbGx5IHNlbnQgdG8gdGhlIHByb3h5IGluc3RhbmNlLgorICAgICAqIEhhbmRsZXMgdGhlIG1ldGhvZCB3aGljaCB3YXMgb3JpZ2luYWxseSBpbnZva2VkIG9uIHRoZSBwcm94eSBpbnN0YW5jZS4gQQorICAgICAqIHR5cGljYWwgdXNhZ2UgcGF0dGVybiBmb2xsb3dzIGJlbG93OgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgKiAgICAgLy9kbyBzb21lIHByb2Nlc3NpbmcgYmVmb3JlIHRoZSBtZXRob2QgaW52b2NhdGlvbgorICAgICAqIAorICAgICAqICAgICAvL2ludm9rZSB0aGUgbWV0aG9kCisgICAgICogICAgIE9iamVjdCByZXN1bHQgPSBtZXRob2QuaW52b2tlKHByb3h5LCBhcmdzKTsKKyAgICAgKiAKKyAgICAgKiAgICAgLy9kbyBzb21lIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIG1ldGhvZCBpbnZvY2F0aW9uCisgICAgICogICAgIHJldHVybiByZXN1bHQ7CisgICAgICogfTwvcHJlPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwcm94eQotICAgICAqICAgICAgICAgICAgdGhlIHByb3h5IGluc3RhbmNlIHdoaWNoIHdhcyB0aGUgcmVjZWl2ZXIgb2YgdGhlIG1ldGhvZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm94eSBpbnN0YW5jZSBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBpbnZva2VkCiAgICAgICogQHBhcmFtIG1ldGhvZAotICAgICAqICAgICAgICAgICAgdGhlIE1ldGhvZCBpbnZva2VkIG9uIHRoZSBwcm94eSBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QgaW52b2tlZCBvbiB0aGUgcHJveHkgaW5zdGFuY2UKICAgICAgKiBAcGFyYW0gYXJncwogICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIG1ldGhvZCwgb3IgbnVsbCBpZiBubyBhcmd1bWVudHMgYXJlIGV4cGVjdGVkLiBwcmltaXRpdmUgdHlwZXMKLSAgICAgKiAgICAgICAgICAgIGFyZSB3cmFwcGVkIGluIHRoZSBhcHByb3ByaWF0ZSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBtZXRob2QKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIG1ldGhvZCwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGFyZ3VtZW50cyBhcmUgZXhwZWN0ZWQuCisgICAgICogICAgICAgICAgICBQcmltaXRpdmUgdHlwZXMgYXJlIHdyYXBwZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIgdHlwZQorICAgICAqICAgICAgICAgICAgCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgbWV0aG9kLiBQcmltaXRpdmUgdHlwZXMgbmVlZCB0byBiZQorICAgICAqICAgICAgICAgd3JhcHBlZCBpbiB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlciB0eXBlCisgICAgICogICAgICAgICAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQotICAgICAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IHRoZSBpbnZva2VkIG1ldGhvZC4gVGhlCi0gICAgICogICAgICAgICAgICAgZXhjZXB0aW9uIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBkZWNsYXJlZCBleGNlcHRpb24gdHlwZXMgZm9yCi0gICAgICogICAgICAgICAgICAgdGhlIGludm9rZWQgbWV0aG9kIG9yIGFueSB1bmNoZWNrZWQgZXhjZXB0aW9uIHR5cGUuIElmIG5vdAotICAgICAqICAgICAgICAgICAgIHRoZW4gYW4gVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB0byB0aHJvdyBmcm9tIHRoZSBpbnZva2VkIG1ldGhvZCBvbiB0aGUgcHJveHkuCisgICAgICogICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZGVjbGFyZWQgZXhjZXB0aW9uIHR5cGVzCisgICAgICogICAgICAgICAgICAgb2YgdGhlIGludm9rZWQgbWV0aG9kIG9yIGFueSB1bmNoZWNrZWQgZXhjZXB0aW9uIHR5cGUuIElmIG5vdAorICAgICAqICAgICAgICAgICAgIHRoZW4gYW4ge0Bjb2RlIFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb259IGlzIHRocm93bgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKICAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGU7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24uamF2YQppbmRleCA3MDI5YTcxLi4yZDY5MTM1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDExICsxOCwxMyBAQAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBmb3IgYW4gZXhjZXB0aW9uIHRocm93biBieSBhIE1ldGhvZCBvcgotICogQ29uc3RydWN0b3IgaW52b2NhdGlvbi4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGZvciBhbiBleGNlcHRpb24gdGhyb3duIGJ5IGEge0Bjb2RlIE1ldGhvZH0gb3IKKyAqIHtAY29kZSBDb25zdHJ1Y3Rvcn0gaW52b2NhdGlvbi4KICAqIAogICogQHNlZSBNZXRob2QjaW52b2tlCiAgKiBAc2VlIENvbnN0cnVjdG9yI25ld0luc3RhbmNlCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAKQEAgLTMxLDE5ICszMywyNCBAQAogICAgIHByaXZhdGUgVGhyb3dhYmxlIHRhcmdldDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCBhCisgICAgICoge0Bjb2RlIG51bGx9IGNhdXNlIC8gdGFyZ2V0IGV4Y2VwdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKFRocm93YWJsZSkgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCB0YXJnZXQKLSAgICAgKiBleGNlcHRpb24gZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb259IGluc3RhbmNlIHdpdGggaXRzCisgICAgICogY2F1c2UgLyB0YXJnZXQgZXhjZXB0aW9uIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBUaHJvd2FibGUgVGhlIGV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIHRoZQotICAgICAqICAgICAgICAgICAgTWV0aG9kIG9yIENvbnN0cnVjdG9yLgorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIHRoZSBNZXRob2Qgb3IKKyAgICAgKiAgICAgICAgICAgIENvbnN0cnVjdG9yCisgICAgICogICAgICAgICAgICAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CiAgICAgICAgIHN1cGVyKG51bGwsIGV4Y2VwdGlvbik7CkBAIC01MSwxNCArNTgsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2ssIHRhcmdldAotICAgICAqIGV4Y2VwdGlvbiBhbmQgbWVzc2FnZSBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCBpdHMKKyAgICAgKiBjYXVzZSAvIHRhcmdldCBleGNlcHRpb24gYW5kIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uCiAgICAgICogQHBhcmFtIGV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgVGhyb3dhYmxlIFRoZSBleGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUKLSAgICAgKiAgICAgICAgICAgIE1ldGhvZCBvciBDb25zdHJ1Y3Rvci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgTWV0aG9kIG9yCisgICAgICogICAgICAgICAgICBDb25zdHJ1Y3RvcgorICAgICAqICAgICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbiwgU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSwgZXhjZXB0aW9uKTsKQEAgLTY2LDE2ICs3NSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB3aGljaCBjYXVzZWQgdGhlIHJlY2VpdmVyIHRvIGJlIHRocm93bi4KKyAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgZXhjZXB0aW9uLCB3aGljaCBtYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBleGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFRhcmdldEV4Y2VwdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGlzIFRocm93YWJsZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBjYXVzZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiwgd2hpY2ggbWF5IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZSBUaGUgcmVjZWl2ZXIncyBjYXVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDgzNDJmODIuLmQ4ZjgwOTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNyArMTgsMjAgQEAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKIC8qKgotICogSW5kaWNhdGVzIHRoYXQgYSBtYWxmb3JtZWQgcGFyYW1ldGVyaXplZCB0eXBlIGhhcyBiZWVuIGFjY2Vzc2VkIGJ5IGEKLSAqIHJlZmxlY3RlZCBtZXRob2QuCisgKiBJbmRpY2F0ZXMgdGhhdCBhIG1hbGZvcm1lZCBwYXJhbWV0ZXJpemVkIHR5cGUgaGFzIGJlZW4gZW5jb3VudGVyZWQgYnkgYQorICogcmVmbGVjdGl2ZSBtZXRob2QuCiAgKiAKICAqIEBzaW5jZSAxLjUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01Njk2NTU3Nzg4NTg2MjIwOTY0TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb259IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NZW1iZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NZW1iZXIuamF2YQppbmRleCA2MjQxZjhiLi5mYjA3MzlmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvTWVtYmVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L01lbWJlci5qYXZhCkBAIC0xOCw0MCArMTgsNjQgQEAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKIC8qKgotICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIG1vZGVsIGEgY2xhc3MgbWVtYmVyLgorICogQ29tbW9uIGludGVyZmFjZSBwcm92aWRpbmcgYWNjZXNzIHRvIHJlZmxlY3RpdmUgaW5mb3JtYXRpb24gb24gY2xhc3MgbWVtYmVycy4KICAqIAogICogQHNlZSBGaWVsZAogICogQHNlZSBDb25zdHJ1Y3RvcgogICogQHNlZSBNZXRob2QKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTWVtYmVyIHsKIAorICAgIC8qKgorICAgICAqIERlc2lnbmF0ZXMgYWxsIHB1YmxpYyBtZW1iZXJzIG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlIChpbmNsdWRpbmcKKyAgICAgKiBpbmhlcml0ZWQgbWVtYmVycykuCisgICAgICogCisgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTWVtYmVyQWNjZXNzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gMDsKIAorICAgIC8qKgorICAgICAqIERlc2lnbmF0ZXMgYWxsIGRlY2xhcmVkIG1lbWJlcnMgb2YgYSBjbGFzcyBvciBpbnRlcmZhY2UgKHdpdGhvdXQKKyAgICAgKiBpbmhlcml0ZWQgbWVtYmVycykuCisgICAgICogCisgICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTWVtYmVyQWNjZXNzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDTEFSRUQgPSAxOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB7QGxpbmsgQ2xhc3N9IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xhc3MgdGhhdCBkZWZpbmVkIHRoaXMKLSAgICAgKiBtZW1iZXIuCi0gICAgICogCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgdGhhdCBkZWNsYXJlcyB0aGlzIG1lbWJlci4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGRlY2xhcmluZyBjbGFzcworICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIENsYXNzIGdldERlY2xhcmluZ0NsYXNzKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBmb3IgdGhlIG1lbWJlci4gVGhlIE1vZGlmaWVyIGNsYXNzIHNob3VsZCBiZSB1c2VkIHRvCi0gICAgICogZGVjb2RlIHRoZSByZXN1bHQuCisgICAgICogUmV0dXJucyB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIG1lbWJlci4gVGhlIHtAbGluayBNb2RpZmllcn0gY2xhc3Mgc2hvdWxkCisgICAgICogYmUgdXNlZCB0byBkZWNvZGUgdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBtZW1iZXIKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtb2RpZmllcnMKLSAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGludCBnZXRNb2RpZmllcnMoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyLgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBtZW1iZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbWVtYmVyCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFN0cmluZyBnZXROYW1lKCk7CiAKQEAgLTU5LDggKzgzLDkgQEAKICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBtZW1iZXIgaXMgc3ludGhldGljIChhcnRpZmljaWFsbHkKICAgICAgKiBpbnRyb2R1Y2VkIGJ5IHRoZSBjb21waWxlcikuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN5bnRoZXRpYywgb3RoZXJ3aXNlCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtZW1iZXIgaXMgc3ludGhldGljLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGJvb2xlYW4gaXNTeW50aGV0aWMoKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9Nb2RpZmllci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L01vZGlmaWVyLmphdmEKaW5kZXggNTg5OGJlMS4uZWQyMDFhYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L01vZGlmaWVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L01vZGlmaWVyLmphdmEKQEAgLTE4LDM1ICsxOCwxMDUgQEAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKIC8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIGRlY29kZSBjbGFzcyBhbmQgbWVtYmVyIG1vZGlmaWVycy4KLSAqIAorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyB0byBkZWNvZGUgY2xhc3MgYW5kIG1lbWJlciBtb2RpZmllcnMuCisgKgogICogQHNlZSBDbGFzcyNnZXRNb2RpZmllcnMoKQogICogQHNlZSBNZW1iZXIjZ2V0TW9kaWZpZXJzKCkKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBNb2RpZmllciB7CiAKKyAgICAvKioKKyAgICAgKiBUaGUge0Bjb2RlIGludH0gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgcHVibGljfQorICAgICAqIG1vZGlmaWVyLgorICAgICAqCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gMHgxOwogCisgICAgLyoqCisgICAgICogVGhlIHtAY29kZSBpbnR9IHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIHByaXZhdGV9CisgICAgICogbW9kaWZpZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFID0gMHgyOwogCisgICAgLyoqCisgICAgICogVGhlIHtAY29kZSBpbnR9IHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIHByb3RlY3RlZH0KKyAgICAgKiBtb2RpZmllci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RFRCA9IDB4NDsKIAorICAgIC8qKgorICAgICAqIFRoZSB7QGNvZGUgaW50fSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBzdGF0aWN9IG1vZGlmaWVyLgorICAgICAqCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDID0gMHg4OwogCisgICAgLyoqCisgICAgICogVGhlIHtAY29kZSBpbnR9IHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIGZpbmFsfSBtb2RpZmllci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkFMID0gMHgxMDsKIAorICAgIC8qKgorICAgICAqIFRoZSB7QGNvZGUgaW50fSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBzeW5jaHJvbml6ZWR9CisgICAgICogbW9kaWZpZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5DSFJPTklaRUQgPSAweDIwOwogCisgICAgLyoqCisgICAgICogVGhlIHtAY29kZSBpbnR9IHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIHZvbGF0aWxlfQorICAgICAqIG1vZGlmaWVyLgorICAgICAqCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MQVRJTEUgPSAweDQwOwogCisgICAgLyoqCisgICAgICogVGhlIHtAY29kZSBpbnR9IHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIHRyYW5zaWVudH0KKyAgICAgKiBtb2RpZmllci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSUVOVCA9IDB4ODA7CiAKKyAgICAvKioKKyAgICAgKiBUaGUge0Bjb2RlIGludH0gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgbmF0aXZlfSBtb2RpZmllci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVElWRSA9IDB4MTAwOwogCisgICAgLyoqCisgICAgICogVGhlIHtAY29kZSBpbnR9IHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIGludGVyZmFjZX0KKyAgICAgKiBtb2RpZmllci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSRkFDRSA9IDB4MjAwOwogCisgICAgLyoqCisgICAgICogVGhlIHtAY29kZSBpbnR9IHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIGFic3RyYWN0fQorICAgICAqIG1vZGlmaWVyLgorICAgICAqCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1QgPSAweDQwMDsKIAorICAgIC8qKgorICAgICAqIFRoZSB7QGNvZGUgaW50fSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBzdHJpY3R9IG1vZGlmaWVyLgorICAgICAqCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSUNUID0gMHg4MDA7CiAKICAgICAvLyBOb24tcHVibGljIHR5cGVzIHJlcXVpcmVkIGJ5IEphdmEgNSB1cGRhdGUgdG8gY2xhc3MgZmlsZSBmb3JtYXQKQEAgLTYwLDE0OCArMTMwLDIwMSBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBFTlVNID0gMHg0MDAwOwogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTW9kaWZpZXJ9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIE1vZGlmaWVyKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIDxjb2RlPmFic3RyYWN0PC9jb2RlPgotICAgICAqIG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIHtAY29kZQorICAgICAqIGFic3RyYWN0fSBtb2RpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCiAgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtb2RpZmllcnMgY29udGFpbiB0aGUgYWJzdHJhY3QgbW9kaWZpZXIKKyAgICAgKiAgICAgICAgICAgIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgYWJzdHJhY3R9IG1vZGlmaWVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWJzdHJhY3QoaW50IG1vZGlmaWVycykgewogICAgICAgICByZXR1cm4gKChtb2RpZmllcnMgJiBBQlNUUkFDVCkgIT0gMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUgPGNvZGU+ZmluYWw8L2NvZGU+Ci0gICAgICogbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogZmluYWx9IG1vZGlmaWVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtb2RpZmllcnMKICAgICAgKiAgICAgICAgICAgIHRoZSBtb2RpZmllcnMgdG8gdGVzdAotICAgICAqIEByZXR1cm4gaWYgdGhlIG1vZGlmaWVycyBjb250YWluIHRoZSBmaW5hbCBtb2RpZmllcgorICAgICAqICAgICAgICAgICAgCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBmaW5hbH0gbW9kaWZpZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogICAgICAgICAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaW5hbChpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHJldHVybiAoKG1vZGlmaWVycyAmIEZJTkFMKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSA8Y29kZT5pbnRlcmZhY2U8L2NvZGU+Ci0gICAgICogbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogaW50ZXJmYWNlfSBtb2RpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCiAgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtb2RpZmllcnMgY29udGFpbiB0aGUgaW50ZXJmYWNlIG1vZGlmaWVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIGludGVyZmFjZX0gbW9kaWZpZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW50ZXJmYWNlKGludCBtb2RpZmllcnMpIHsKICAgICAgICAgcmV0dXJuICgobW9kaWZpZXJzICYgSU5URVJGQUNFKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSA8Y29kZT5uYXRpdmU8L2NvZGU+Ci0gICAgICogbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogbmF0aXZlfSBtb2RpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCiAgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtb2RpZmllcnMgY29udGFpbiB0aGUgbmF0aXZlIG1vZGlmaWVyCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBuYXRpdmV9IG1vZGlmaWVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hdGl2ZShpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHJldHVybiAoKG1vZGlmaWVycyAmIE5BVElWRSkgIT0gMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUgPGNvZGU+cHJpdmF0ZTwvY29kZT4KLSAgICAgKiBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSB7QGNvZGUKKyAgICAgKiBwcml2YXRlfSBtb2RpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCiAgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtb2RpZmllcnMgY29udGFpbiB0aGUgcHJpdmF0ZSBtb2RpZmllcgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgcHJpdmF0ZX0gbW9kaWZpZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpdmF0ZShpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHJldHVybiAoKG1vZGlmaWVycyAmIFBSSVZBVEUpICE9IDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIDxjb2RlPnByb3RlY3RlZDwvY29kZT4KLSAgICAgKiBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSB7QGNvZGUKKyAgICAgKiBwcm90ZWN0ZWR9IG1vZGlmaWVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtb2RpZmllcnMKICAgICAgKiAgICAgICAgICAgIHRoZSBtb2RpZmllcnMgdG8gdGVzdAotICAgICAqIEByZXR1cm4gaWYgdGhlIG1vZGlmaWVycyBjb250YWluIHRoZSBwcm90ZWN0ZWQgbW9kaWZpZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIHByb3RlY3RlZH0gbW9kaWZpZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvdGVjdGVkKGludCBtb2RpZmllcnMpIHsKICAgICAgICAgcmV0dXJuICgobW9kaWZpZXJzICYgUFJPVEVDVEVEKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSA8Y29kZT5wdWJsaWM8L2NvZGU+Ci0gICAgICogbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogcHVibGljfSBtb2RpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCiAgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtb2RpZmllcnMgY29udGFpbiB0aGUgYWJzdHJhY3QgbW9kaWZpZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIHB1YmxpY30gbW9kaWZpZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHVibGljKGludCBtb2RpZmllcnMpIHsKICAgICAgICAgcmV0dXJuICgobW9kaWZpZXJzICYgUFVCTElDKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSA8Y29kZT5zdGF0aWM8L2NvZGU+Ci0gICAgICogbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogc3RhdGljfSBtb2RpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCiAgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtb2RpZmllcnMgY29udGFpbiB0aGUgc3RhdGljIG1vZGlmaWVyCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBzdGF0aWN9IG1vZGlmaWVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0YXRpYyhpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHJldHVybiAoKG1vZGlmaWVycyAmIFNUQVRJQykgIT0gMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUgPGNvZGU+c3RyaWN0PC9jb2RlPgotICAgICAqIG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIHtAY29kZQorICAgICAqIHN0cmljdH0gbW9kaWZpZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1vZGlmaWVycwogICAgICAqICAgICAgICAgICAgdGhlIG1vZGlmaWVycyB0byB0ZXN0Ci0gICAgICogQHJldHVybiBpZiB0aGUgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIHN0cmljdCBtb2RpZmllcgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgc3RyaWN0fSBtb2RpZmllciwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdHJpY3QoaW50IG1vZGlmaWVycykgewogICAgICAgICByZXR1cm4gKChtb2RpZmllcnMgJiBTVFJJQ1QpICE9IDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlCi0gICAgICogPGNvZGU+c3luY2hyb25pemVkPC9jb2RlPiBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSB7QGNvZGUKKyAgICAgKiBzeW5jaHJvbml6ZWR9IG1vZGlmaWVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtb2RpZmllcnMKICAgICAgKiAgICAgICAgICAgIHRoZSBtb2RpZmllcnMgdG8gdGVzdAotICAgICAqIEByZXR1cm4gaWYgdGhlIG1vZGlmaWVycyBjb250YWluIHRoZSBzeW5jaHJvbml6ZWQgbW9kaWZpZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIHN5bmNocm9uaXplZH0gbW9kaWZpZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY2hyb25pemVkKGludCBtb2RpZmllcnMpIHsKICAgICAgICAgcmV0dXJuICgobW9kaWZpZXJzICYgU1lOQ0hST05JWkVEKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyBjb250YWluIHRoZSA8Y29kZT50cmFuc2llbnQ8L2NvZGU+Ci0gICAgICogbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogdHJhbnNpZW50fSBtb2RpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCiAgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtb2RpZmllcnMgY29udGFpbiB0aGUgdHJhbnNpZW50IG1vZGlmaWVyCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICB0cmFuc2llbnR9IG1vZGlmaWVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYW5zaWVudChpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHJldHVybiAoKG1vZGlmaWVycyAmIFRSQU5TSUVOVCkgIT0gMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUgPGNvZGU+dm9sYXRpbGU8L2NvZGU+Ci0gICAgICogbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgY29udGFpbiB0aGUge0Bjb2RlCisgICAgICogdm9sYXRpbGV9IG1vZGlmaWVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtb2RpZmllcnMKICAgICAgKiAgICAgICAgICAgIHRoZSBtb2RpZmllcnMgdG8gdGVzdAotICAgICAqIEByZXR1cm4gaWYgdGhlIG1vZGlmaWVycyBjb250YWluIHRoZSB2b2xhdGlsZSBtb2RpZmllcgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGNvbnRhaW4gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgdm9sYXRpbGV9IG1vZGlmaWVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZvbGF0aWxlKGludCBtb2RpZmllcnMpIHsKICAgICAgICAgcmV0dXJuICgobW9kaWZpZXJzICYgVk9MQVRJTEUpICE9IDApOwpAQCAtMjA5LDE1ICszMzIsMTcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb2RpZmllcnMKLSAgICAgKiBwcmVzZW50IGluIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzLgotICAgICAqIAotICAgICAqIE1vZGlmaWVycyBhcHBlYXIgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgSmF2YSBMYW5ndWFnZQotICAgICAqIFNwZWNpZmljYXRpb246Ci0gICAgICogPGNvZGU+cHVibGljIHByaXZhdGUgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgdm9sYXRpbGUgbmF0aXZlIHN5bmNocm9uaXplZCBpbnRlcmZhY2Ugc3RyaWN0PC9jb2RlPgotICAgICAqIAorICAgICAqIHByZXNlbnQgaW4gdGhlIHNwZWNpZmllZCBtb2RpZmllcnMuIE1vZGlmaWVycyBhcHBlYXIgaW4gdGhlIG9yZGVyCisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb246CisgICAgICoKKyAgICAgKiB7QGNvZGUgcHVibGljIHByaXZhdGUgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgdm9sYXRpbGUgbmF0aXZlIHN5bmNocm9uaXplZCBpbnRlcmZhY2Ugc3RyaWN0fQorICAgICAqCiAgICAgICogQHBhcmFtIG1vZGlmaWVycwogICAgICAqICAgICAgICAgICAgdGhlIG1vZGlmaWVycyB0byBwcmludAorICAgICAqIAogICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGlmaWVycworICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZyhpbnQgbW9kaWZpZXJzKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvUGFyYW1ldGVyaXplZFR5cGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9QYXJhbWV0ZXJpemVkVHlwZS5qYXZhCmluZGV4IDk3OTc1ZTMuLjM0OTQ2NGEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9QYXJhbWV0ZXJpemVkVHlwZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9QYXJhbWV0ZXJpemVkVHlwZS5qYXZhCkBAIC0xOCw0MSArMTgsNjYgQEAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKIC8qKgotICogUmVwcmVzZW50cyBhIHBhcmFtZXRlcml6ZWQgdHlwZS4KKyAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBwYXJhbWV0ZXJpemVkIHR5cGUgc3VjaCBhcyB7QGNvZGUgCisgKiAnU2V0Jmx0O1N0cmluZyZndDsnfS4KICAqIAogICogQHNpbmNlIDEuNQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVyaXplZFR5cGUgZXh0ZW5kcyBUeXBlIHsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgYXJndW1lbnRzIGZvciB0aGlzIHR5cGUuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnRzIGZvciB0aGlzIHR5cGUuCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyB0eXBlIG1vZGVscyBhIG5vbiBwYXJhbWV0ZXJpemVkIHR5cGUgbmVzdGVkIHdpdGhpbiBhCisgICAgICogcGFyYW1ldGVyaXplZCB0eXBlLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgemVybyBsZW5ndGggYXJyYXkuIFRoZSBnZW5lcmljCisgICAgICogdHlwZSBvZiB0aGUgZm9sbG93aW5nIHtAY29kZSBmaWVsZH0gZGVjbGFyYXRpb24gaXMgYW4gZXhhbXBsZSBmb3IgYQorICAgICAqIHBhcmFtZXRlcml6ZWQgdHlwZSB3aXRob3V0IHR5cGUgYXJndW1lbnRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Yge0BsaW5rIFR5cGV9LCB3aGljaCBtYXkgYmUgZW1wdHkuCisgICAgICogPHByZT4KKyAgICAgKiBBJmx0O1N0cmluZyZndDsuQiBmaWVsZDsKKyAgICAgKiAKKyAgICAgKiBjbGFzcyBBJmx0O1QmZ3Q7IHsKKyAgICAgKiAgICAgY2xhc3MgQiB7CisgICAgICogICAgIH0KKyAgICAgKiB9PC9wcmU+CisgICAgICogCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnRzCisgICAgICogCiAgICAgICogQHRocm93cyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgdHlwZSBhcmd1bWVudHMgY2FuJ3QgYmUgZm91bmQuCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSB0eXBlIGFyZ3VtZW50cyBjYW5ub3QgYmUgZm91bmQKICAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFBhcmFtZXRlcml6ZWRUeXBlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSB0eXBlIGFyZ3VtZW50cyBjYW4ndCBiZSBpbnN0YW50aWF0ZWQgZm9yIHNvbWUKLSAgICAgKiAgICAgICAgICAgICByZWFzb24uCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSB0eXBlIGFyZ3VtZW50cyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGZvciBzb21lCisgICAgICogICAgICAgICAgICAgcmVhc29uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgVHlwZVtdIGdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhcmVudC9vd25lciB0eXBlLCBpZiB0aGlzIHR5cGUgaXMgYW4gaW5uZXIgdHlwZSwgb3RoZXJ3aXNlCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgaWYgdGhpcyBpcyBhIHRvcC1sZXZlbCB0eXBlLgorICAgICAqIFJldHVybnMgdGhlIHBhcmVudCAvIG93bmVyIHR5cGUsIGlmIHRoaXMgdHlwZSBpcyBhbiBpbm5lciB0eXBlLCBvdGhlcndpc2UKKyAgICAgKiB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaWYgdGhpcyBpcyBhIHRvcC1sZXZlbCB0eXBlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFR5cGV9IG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIG93bmVyIHR5cGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgaXMgYSB0b3AtbGV2ZWwgdHlwZQorICAgICAqIAogICAgICAqIEB0aHJvd3MgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIHR5cGUgYXJndW1lbnRzIGNhbid0IGJlIGZvdW5kLgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgdHlwZSBhcmd1bWVudHMgY2Fubm90IGJlIGZvdW5kCiAgICAgICogQHRocm93cyBNYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgdHlwZSBhcmd1bWVudHMgY2FuJ3QgYmUgaW5zdGFudGlhdGVkIGZvciBzb21lCi0gICAgICogICAgICAgICAgICAgcmVhc29uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvd25lciB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZm9yIHNvbWUgcmVhc29uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgVHlwZSBnZXRPd25lclR5cGUoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJhdyB0eXBlIG9mIHRoaXMgdHlwZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBkZWNsYXJpbmcgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcml6ZWQgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmF3IHR5cGUgb2Yge0Bjb2RlIFNldCZsdDtTdHJpbmcmZ3Q7IGZpZWxkO30gaXMge0Bjb2RlIFNldH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgVHlwZX0uCisgICAgICogQHJldHVybiB0aGUgcmF3IHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXJpemVkIHR5cGUKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBUeXBlIGdldFJhd1R5cGUoKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9Qcm94eS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1Byb3h5LmphdmEKaW5kZXggMjMxYTJkZS4uMjlkMTVjNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1Byb3h5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1Byb3h5LmphdmEKQEAgLTIzLDE2ICsyMywyMCBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eUNsYXNzRmlsZTsKKy8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorLy8gaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnJlZmxlY3QuUHJveHlDbGFzc0ZpbGU7CisvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgdG8gY3JlYXRpbmcgZHluYW1pYyBwcm94eSBjbGFzc2VzIGFuZCBpbnN0YW5jZXMuCi0gKiAKKyAqIHtAY29kZSBQcm94eX0gZGVmaW5lcyBtZXRob2RzIGZvciBjcmVhdGluZyBkeW5hbWljIHByb3h5IGNsYXNzZXMgYW5kIGluc3RhbmNlcy4KKyAqIEEgcHJveHkgY2xhc3MgaW1wbGVtZW50cyBhIGRlY2xhcmVkIHNldCBvZiBpbnRlcmZhY2VzIGFuZCBkZWxlZ2F0ZXMgbWV0aG9kCisgKiBpbnZvY2F0aW9ucyB0byBhbiB7QGNvZGUgSW52b2NhdGlvbkhhbmRsZXJ9LgorICoKICAqIEBzZWUgSW52b2NhdGlvbkhhbmRsZXIKICAqIAotICogQHNpbmNlIDEuMworICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTQ2LDQwICs1MCw2MSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IE5leHRDbGFzc05hbWVJbmRleCA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgaW52b2NhdGlvbiBoYW5kbGVyIG9uIHdoaWNoIHRoZSBtZXRob2QgY2FsbHMgYXJlIGRpc3BhdGNoZWQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW52b2NhdGlvbkhhbmRsZXIgaDsKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgUHJveHkoKSB7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJveHl9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbnZvY2F0aW9uCisgICAgICogaGFuZGxlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGludm9jYXRpb24gaGFuZGxlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgcHJveHkKKyAgICAgKiAgICAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBQcm94eShJbnZvY2F0aW9uSGFuZGxlciBoKSB7CiAgICAgICAgIHRoaXMuaCA9IGg7CiAgICAgfQogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCi0gICAgLy8gQ2hhbmdlZCB0byBiZSBjbG9zZXIgdG8gdGhlIFJJCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBkeW5hbWljYWxseSBidWlsZCBjbGFzcyBmb3IgdGhlIGdpdmVuIGludGVyZmFjZXMsIGJ1aWxkIGEgbmV3Ci0gICAgICogb25lIHdoZW4gbmVjZXNzYXJ5LiBUaGUgb3JkZXIgb2YgdGhlIGludGVyZmFjZXMgaXMgaW1wb3J0YW50LgotICAgICAqIAotICAgICAqIFRoZSBpbnRlcmZhY2VzIG11c3QgYmUgdmlzaWJsZSBmcm9tIHRoZSBzdXBwbGllZCBjbGFzcyBsb2FkZXI7IG5vCi0gICAgICogZHVwbGljYXRlcyBhcmUgcGVybWl0dGVkLiBBbGwgbm9uLXB1YmxpYyBpbnRlcmZhY2VzIG11c3QgYmUgZGVmaW5lZCBpbgotICAgICAqIHRoZSBzYW1lIHBhY2thZ2UuCisgICAgICogUmV0dXJucyB0aGUgZHluYW1pY2FsbHkgYnVpbHQge0Bjb2RlIENsYXNzfSBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2VzLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENsYXNzfSB3aGVuIG5lY2Vzc2FyeS4gVGhlIG9yZGVyIG9mIHRoZSBpbnRlcmZhY2VzCisgICAgICogaXMgcmVsZXZhbnQuIEludm9jYXRpb25zIG9mIHRoaXMgbWV0aG9kIHdpdGggdGhlIHNhbWUgaW50ZXJmYWNlcyBidXQKKyAgICAgKiBkaWZmZXJlbnQgb3JkZXIgcmVzdWx0IGluIGRpZmZlcmVudCBnZW5lcmF0ZWQgY2xhc3Nlcy4gVGhlIGludGVyZmFjZXMKKyAgICAgKiBtdXN0IGJlIHZpc2libGUgZnJvbSB0aGUgc3VwcGxpZWQgY2xhc3MgbG9hZGVyOyBubyBkdXBsaWNhdGVzIGFyZQorICAgICAqIHBlcm1pdHRlZC4gQWxsIG5vbi1wdWJsaWMgaW50ZXJmYWNlcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgcGFja2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9hZGVyCi0gICAgICogICAgICAgICAgICB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgd2lsbCBkZWZpbmUgdGhlIHByb3h5IGNsYXNzLgorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGxvYWRlciB0aGF0IHdpbGwgZGVmaW5lIHRoZSBwcm94eSBjbGFzcwogICAgICAqIEBwYXJhbSBpbnRlcmZhY2VzCi0gICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiA8Y29kZT5DbGFzczwvY29kZT4gb2JqZWN0cywgZWFjaCBvbmUgaWRlbnRpZnlpbmcKLSAgICAgKiAgICAgICAgICAgIGFuIGludGVyZmFjZSB0aGF0IHRoZSBuZXcgcHJveHkgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIHtAY29kZSBDbGFzc30gb2JqZWN0cywgZWFjaCBvbmUgaWRlbnRpZnlpbmcgYW4KKyAgICAgKiAgICAgICAgICAgIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHJldHVybmVkIHByb3h5CisgICAgICogICAgICAgICAgICBjbGFzcworICAgICAqIAogICAgICAqIEByZXR1cm4gYSBwcm94eSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYWxsIG9mIHRoZSBpbnRlcmZhY2VzIHJlZmVycmVkIHRvCi0gICAgICogICAgICAgICBpbiB0aGUgY29udGVudHMgb2YgPGNvZGU+aW50ZXJmYWNlczwvY29kZT4uCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIDxjb2RlPmludGVyZmFjZXM8L2NvZGU+IG9yIGFueSBvZiBpdHMgZWxlbWVudHMKLSAgICAgKiAgICAgICAgICAgICAgICBhcmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogICAgICAgICBpbiB0aGUgY29udGVudHMgb2Yge0Bjb2RlIGludGVyZmFjZXN9CisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGludGVyZmFjZSByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGVpdGhlciB7QGNvZGUgaW50ZXJmYWNlc30gb3IgYW55IG9mIGl0cyBlbGVtZW50cyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldFByb3h5Q2xhc3MoQ2xhc3NMb2FkZXIgbG9hZGVyLAogICAgICAgICAgICAgQ2xhc3M8Pz4uLi4gaW50ZXJmYWNlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBDaGFuZ2VkIHBhcmFtZXRlciB0byBiZSBjbG9zZXIgdG8gdGhlIFJJCisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgLy8gY2hlY2sgdGhhdCBpbnRlcmZhY2VzIGFyZSBhIHZhbGlkIGFycmF5IG9mIHZpc2libGUgaW50ZXJmYWNlcwogICAgICAgICBpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKQEAgLTEyMSw3ICsxNDYsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAgICAgLy8gc2VhcmNoIGNhY2hlIGZvciBtYXRjaGluZyBwcm94eSBjbGFzcyB1c2luZyB0aGUgY2xhc3MgbG9hZGVyCiAgICAgICAgIHN5bmNocm9uaXplZCAobG9hZGVyQ2FjaGUpIHsKQEAgLTE4MiwyMyArMjA2LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBkeW5hbWljYWxseSBidWlsZCBjbGFzcyBmb3IgdGhlIGdpdmVuCi0gICAgICogaW50ZXJmYWNlcyB0aGF0IGZvcndhcmRzIG1ldGhvZHMgdG8gdGhlIHNwZWNpZmllZCBpbnZvY2F0aW9uIGhhbmRsZXIuCi0gICAgICogCi0gICAgICogVGhlIGludGVyZmFjZXMgbXVzdCBiZSB2aXNpYmxlIGZyb20gdGhlIHN1cHBsaWVkIGNsYXNzIGxvYWRlcjsgbm8KLSAgICAgKiBkdXBsaWNhdGVzIGFyZSBwZXJtaXR0ZWQuIEFsbCBub24tcHVibGljIGludGVyZmFjZXMgbXVzdCBiZSBkZWZpbmVkIGluCi0gICAgICogdGhlIHNhbWUgcGFja2FnZS4KKyAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBkeW5hbWljYWxseSBidWlsdCBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGludGVyZmFjZXMuIE1ldGhvZCBpbnZvY2F0aW9ucyBvbiB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgYXJlIGZvcndhcmRlZCB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgaW52b2NhdGlvbiBoYW5kbGVyLiBUaGUgaW50ZXJmYWNlcyBtdXN0IGJlIHZpc2libGUgZnJvbSB0aGUKKyAgICAgKiBzdXBwbGllZCBjbGFzcyBsb2FkZXI7IG5vIGR1cGxpY2F0ZXMgYXJlIHBlcm1pdHRlZC4gQWxsIG5vbi1wdWJsaWMKKyAgICAgKiBpbnRlcmZhY2VzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBwYWNrYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2FkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBsb2FkZXIgdGhhdCB3aWxsIGRlZmluZSB0aGUgcHJveHkgY2xhc3MuCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgd2lsbCBkZWZpbmUgdGhlIHByb3h5IGNsYXNzCiAgICAgICogQHBhcmFtIGludGVyZmFjZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgdG8gaW1wbGVtZW50LgorICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgb2Yge0Bjb2RlIENsYXNzfSBvYmplY3RzLCBlYWNoIG9uZSBpZGVudGlmeWluZyBhbgorICAgICAqICAgICAgICAgICAgaW50ZXJmYWNlIHRoYXQgd2lsbCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcmV0dXJuZWQgcHJveHkKKyAgICAgKiAgICAgICAgICAgIG9iamVjdAogICAgICAqIEBwYXJhbSBoCi0gICAgICogICAgICAgICAgICB0aGUgaW52b2NhdGlvbiBoYW5kbGVyIGZvciB0aGUgZm9yd2FyZGVkIG1ldGhvZHMuCi0gICAgICogQHJldHVybiBhIG5ldyBwcm94eSBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIGhhbmRsZXIgPGNvZGU+aDwvY29kZT4KLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW50ZXJmYWNlcyBvciBhbnkgb2YgaXRzIGVsZW1lbnRzIGFyZSBudWxsLgorICAgICAqICAgICAgICAgICAgdGhlIGludm9jYXRpb24gaGFuZGxlciB0aGF0IGhhbmRsZXMgdGhlIGRpc3BhdGNoZWQgbWV0aG9kCisgICAgICogICAgICAgICAgICBpbnZvY2F0aW9ucworICAgICAqIAorICAgICAqIEByZXR1cm4gYSBuZXcgcHJveHkgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBoYW5kbGVyIHtAY29kZSBofQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBpbnRlcmZhY2UgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaW50ZXJmYWNlcyBvciBhbnkgb2YgaXRzIGVsZW1lbnRzIGFyZSBudWxsCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbmV3UHJveHlJbnN0YW5jZShDbGFzc0xvYWRlciBsb2FkZXIsCiAgICAgICAgICAgICBDbGFzczw/PltdIGludGVyZmFjZXMsIEludm9jYXRpb25IYW5kbGVyIGgpCkBAIC0yMjcsMTMgKzI1OCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBzdXBwbGllZCBjbGFzcyBpcyBhIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBwcm94eSBjbGFzcy4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIGR5bmFtaWNhbGx5IGdlbmVyYXRlZAorICAgICAqIHByb3h5IGNsYXNzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbAotICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xhc3MgaXMgYSBwcm94eSBjbGFzcyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgY2xhc3MgaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcworICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjbGFzcyBpcyBhIHByb3h5IGNsYXNzLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNsYXNzIGlzIHtAY29kZSBudWxsfQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3h5Q2xhc3MoQ2xhc3M8Pz4gY2wpIHsKICAgICAgICAgaWYgKGNsID09IG51bGwpIHsKQEAgLTI0NSwxNCArMjgyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwcm94eSBpbnN0YW5jZSdzIGludm9jYXRpb24gaGFuZGxlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbnZvY2F0aW9uIGhhbmRsZXIgb2YgdGhlIHNwZWNpZmllZCBwcm94eSBpbnN0YW5jZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcHJveHkKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm94eSBpbnN0YW5jZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBwcm94eSdzIGludm9jYXRpb24gaGFuZGxlciBvYmplY3QKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBzdXBwbGllZCA8Y29kZT5wcm94eTwvY29kZT4gaXMgbm90IGEgcHJveHkKLSAgICAgKiAgICAgICAgICAgICAgICBvYmplY3QuCisgICAgICogICAgICAgICAgICB0aGUgcHJveHkgaW5zdGFuY2UKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnZvY2F0aW9uIGhhbmRsZXIgb2YgdGhlIHNwZWNpZmllZCBwcm94eSBpbnN0YW5jZQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHN1cHBsaWVkIHtAY29kZSBwcm94eX0gaXMgbm90IGEgcHJveHkgb2JqZWN0CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbnZvY2F0aW9uSGFuZGxlciBnZXRJbnZvY2F0aW9uSGFuZGxlcihPYmplY3QgcHJveHkpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9SZWZsZWN0UGVybWlzc2lvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1JlZmxlY3RQZXJtaXNzaW9uLmphdmEKaW5kZXggMmZhNjhhMC4uYjU2ODY2MyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1JlZmxlY3RQZXJtaXNzaW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1JlZmxlY3RQZXJtaXNzaW9uLmphdmEKQEAgLTIwLDMxICsyMCw0OCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uOwogCiAvKioKLSAqIFJlZmxlY3RQZXJtaXNzaW9uIG9iamVjdHMgcmVwcmVzZW50IHBlcm1pc3Npb24gdG8gYWNjZXNzIGRhbmdlcm91cyBvcGVyYXRpb25zCi0gKiBpbiB0aGUgcmVmbGVjdGlvbiBsYXllci4KKyAqIEEge0Bjb2RlIFJlZmxlY3RQZXJtaXNzaW9ufSBvYmplY3QgcmVwcmVzZW50cyBhIHBlcm1pc3Npb24gdG8gYWNjZXNzCisgKiBvcGVyYXRpb25zIGluIHRoZSByZWZsZWN0aW9uIGxheWVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFJlZmxlY3RQZXJtaXNzaW9uIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc0MTI3MzcxMTAyNDE1MDc0ODVMOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggZ2l2ZW4gbmFtZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBSZWZsZWN0UGVybWlzc2lvbn0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGVybWlzc2lvbk5hbWUKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgbmV3IHBlcm1pc3Npb24uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmV3IHBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5hbWV9IGlzIGVtcHR5CisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuYW1lfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVmbGVjdFBlcm1pc3Npb24oU3RyaW5nIHBlcm1pc3Npb25OYW1lKSB7CiAgICAgICAgIHN1cGVyKHBlcm1pc3Npb25OYW1lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYWN0aW9uIGxpc3QuCi0gICAgICogVGhlIGFjdGlvbiBsaXN0IGlzIGlnbm9yZWQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUmVmbGVjdFBlcm1pc3Npb259IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG5hbWUgYW5kIGFjdGlvbiBsaXN0LiBUaGUgYWN0aW9uIGxpc3Qgd2lsbCBiZSBpZ25vcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uCiAgICAgICogQHBhcmFtIGFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBpZ25vcmVkLgorICAgICAqICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBpZ25vcmVkCisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gaXMgZW1wdHkKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5hbWV9IGlzIHtAY29kZSBudWxsfQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZWZsZWN0UGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKICAgICAgICAgc3VwZXIobmFtZSwgYWN0aW9ucyk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvVHlwZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1R5cGUuamF2YQppbmRleCBiMjViODdiLi5mMGM2MTQyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvVHlwZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9UeXBlLmphdmEKQEAgLTEsNSArMSw0IEBACi0vKiAKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorLyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKICAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KICAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCkBAIC0xOCw5ICsxNywxMCBAQAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAogLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciBhbGwgSmF2YSB0eXBlcy4KKyAqIENvbW1vbiBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIEphdmEgdHlwZXMuCiAgKiAKICAqIEBzaW5jZSAxLjUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFR5cGUgewogICAgIC8vIEVtcHR5CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvVHlwZVZhcmlhYmxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvVHlwZVZhcmlhYmxlLmphdmEKaW5kZXggMDc1ZWZiYy4uYWVmN2FjOSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9UeXBlVmFyaWFibGUuamF2YQpAQCAtMTcsMzUgKzE3LDUxIEBACiBwYWNrYWdlIGphdmEubGFuZy5yZWZsZWN0OwogCiAvKioKLSAqIFJlcHJlc2VudHMgYSB0eXBlIHZhcmlhYmxlLgorICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIHR5cGUgdmFyaWFibGVzIHN1Y2ggYXMge0Bjb2RlICdUJ30gaW4ge0Bjb2RlIAorICogJ3B1YmxpYyBpbnRlcmZhY2UgQ29tcGFyYWJsZSZsdDtUJmd0Oyd9LCB0aGUgYm91bmRlZCB7QGNvZGUgJ1QnfSBpbiB7QGNvZGUgCisgKiAncHVibGljIGludGVyZmFjZSBBJmx0O1QgZXh0ZW5kcyBOdW1iZXImZ3Q7J30gb3IgdGhlIG11bHRpcGxlIGJvdW5kZWQge0Bjb2RlCisgKiAnVCd9IGluIHtAY29kZSAncHVibGljIGludGVyZmFjZSBCJmx0O1QgZXh0ZW5kcyBOdW1iZXIgJiBDbG9uZWFibGUmZ3Q7J30uCisgKiAKKyAqIEBwYXJhbSA8RD4KKyAqICAgICAgICAgICAgdGhlIGdlbmVyaWMgZGVjbGFyYXRpb24gdGhhdCBkZWNsYXJlcyB0aGlzIHR5cGUgdmFyaWFibGUKICAqIAogICogQHNpbmNlIDEuNQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgVHlwZVZhcmlhYmxlPEQgZXh0ZW5kcyBHZW5lcmljRGVjbGFyYXRpb24+IGV4dGVuZHMgVHlwZSB7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1cHBlciBib3VuZHMgb2YgdGhlIHR5cGUgdmFyaWFibGUuCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgYm91bmRzIG9mIHRoaXMgdHlwZSB2YXJpYWJsZS4ge0Bjb2RlIE9iamVjdH0gaXMgdGhlCisgICAgICogaW1wbGljaXQgdXBwZXIgYm91bmQgaWYgbm8gb3RoZXIgYm91bmRzIGFyZSBkZWNsYXJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVwcGVyIGJvdW5kcyBvZiB0aGlzIHR5cGUgdmFyaWFibGUgCiAgICAgICogCi0gICAgICogQHJldHVybiBhcnJheSBvZiB0eXBlIHZhcmlhYmxlJ3MgdXBwZXIgYm91bmRzLgogICAgICAqIEB0aHJvd3MgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29tcG9uZW50IHR5cGUgcG9pbnRzIHRvIGEgbWlzc2luZyB0eXBlLgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgYm91bmRzIHBvaW50cyB0byBhIG1pc3NpbmcgdHlwZQogICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29tcG9uZW50IHR5cGUgcG9pbnRzIHRvIGEgdHlwZSB0aGF0IGNhbid0IGJlCi0gICAgICogICAgICAgICAgICAgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGJvdW5kcyBwb2ludHMgdG8gYSB0eXBlIHRoYXQgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFR5cGVbXSBnZXRCb3VuZHMoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBHZW5lcmljRGVjbGFyYXRpb24gb2JqZWN0IGZvciB0aGlzIHR5cGUgdmFyaWFibGUuCisgICAgICogUmV0dXJucyB0aGUgbGFuZ3VhZ2UgY29uc3RydWN0IHRoYXQgZGVjbGFyZXMgdGhpcyB0eXBlIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZ2VuZXJpYyBkZWNsYXJhdGlvbgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGdlbmVyaWMgZGVjbGFyYXRpb24gc3BlYworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEQgZ2V0R2VuZXJpY0RlY2xhcmF0aW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIHZhcmlhYmxlJ3MgbmFtZSBmcm9tIHNvdXJjZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgdHlwZSB2YXJpYWJsZSBhcyBpdCBpcyBzcGVjaWZpZWQgaW4gc291cmNlCisgICAgICogY29kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlIHZhcmlhYmxlCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFyaWFibGUncyBuYW1lIGZyb20gdGhlIHNvdXJjZSBjb2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFN0cmluZyBnZXROYW1lKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1VuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24uamF2YQppbmRleCA3ZmExNmY3Li4xMDhmOThhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9VbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uLmphdmEKQEAgLTE4LDEwICsxOCwxMiBAQAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBmb3IgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIGJ5IGFuCi0gKiBJbnZvY2F0aW9uSGFuZGxlcgotICogCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBmb3IgYW4gdW5kZWNsYXJlZCwgY2hlY2tlZCBleGNlcHRpb24gdGhyb3duIGJ5CisgKiBhbiBJbnZvY2F0aW9uSGFuZGxlci4KKyAqCiAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyI2ludm9rZQorICoKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogCkBAIC0zMCwxMSArMzIsMTMgQEAKICAgICBwcml2YXRlIFRocm93YWJsZSB1bmRlY2xhcmVkVGhyb3dhYmxlOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCB0YXJnZXQKLSAgICAgKiBleGNlcHRpb24gZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb259IGluc3RhbmNlIHdpdGggdGhlCisgICAgICogdW5kZWNsYXJlZCwgY2hlY2tlZCBleGNlcHRpb24gdGhhdCBvY2N1cnJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHdoaWNoIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNsYXNzLgorICAgICAqICAgICAgICAgICAgdGhlIHVuZGVjbGFyZWQsIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC00MywxNCArNDcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2ssIHRhcmdldAotICAgICAqIGV4Y2VwdGlvbiBhbmQgbWVzc2FnZSBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCB0aGUKKyAgICAgKiB1bmRlY2xhcmVkLCBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIGFuZCBhIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24KICAgICAgKiBAcGFyYW0gZXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBUaHJvd2FibGUgVGhlIGV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZQotICAgICAqICAgICAgICAgICAgY2xhc3MuCisgICAgICogICAgICAgICAgICB0aGUgdW5kZWNsYXJlZCwgY2hlY2tlZCBleGNlcHRpb24gdGhhdCBvY2N1cnJlZAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24sCiAgICAgICAgICAgICBTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewpAQCAtNjAsMTYgKzY1LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHdoaWNoIGNhdXNlZCB0aGUgcmVjZWl2ZXIgdG8gYmUgdGhyb3duLgorICAgICAqIFJldHVybnMgdGhlIHVuZGVjbGFyZWQsIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQsIHdoaWNoIG1heSBiZQorICAgICAqIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVuZGVjbGFyZWQsIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFVuZGVjbGFyZWRUaHJvd2FibGUoKSB7CiAgICAgICAgIHJldHVybiB1bmRlY2xhcmVkVGhyb3dhYmxlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgVGhyb3dhYmxlLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGNhdXNlLgorICAgICAqIFJldHVybnMgdGhlIHVuZGVjbGFyZWQsIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQsIHdoaWNoIG1heSBiZQorICAgICAqIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVuZGVjbGFyZWQsIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZSBUaGUgcmVjZWl2ZXIncyBjYXVzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1dpbGRjYXJkVHlwZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L1dpbGRjYXJkVHlwZS5qYXZhCmluZGV4IDgzYTc3MGYuLjJiOTEzZDAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9XaWxkY2FyZFR5cGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvV2lsZGNhcmRUeXBlLmphdmEKQEAgLTE4LDM2ICsxOCw0NyBAQAogcGFja2FnZSBqYXZhLmxhbmcucmVmbGVjdDsKIAogLyoqCi0gKiBSZXByZXNlbnRzIGEgd2lsZGNhcmQgdHlwZSwgc3VjaCBhcyA8Y29kZT4/PC9jb2RlPiBvcgotICogPGNvZGU+PyBleHRlbmRzIENvbXBhcmFibGU8L2NvZGU+LgorICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIHdpbGRjYXJkIHR5cGUsIHN1Y2ggYXMgdGhlIHNpbXBsZSB3aWxkY2FyZAorICoge0Bjb2RlICc/J30sIHRoZSB1cHBlciBib3VuZGVkIHdpbGRjYXJkIHtAY29kZSAnPyBleHRlbmRzIENsb3NlYWJsZSd9LCB0aGUKKyAqIG11bHRpcGxlIHVwcGVyIGJvdW5kZWQgd2lsZGNhcmQge0Bjb2RlICc/IGV4dGVuZHMgQ2xvc2VhYmxlICYgRmx1c2hhYmxlJ30gb3IKKyAqIHRoZSBsb3dlciBib3VuZGVkIHdpbGRjYXJkIHtAY29kZSAnPyBzdXBlciBPdXRwdXRTdHJlYW0nfS4KICAqIAogICogQHNpbmNlIDEuNQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgV2lsZGNhcmRUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXJyYXkgb2YgdHlwZXMgdGhhdCByZXByZXNlbnQgdGhlIHVwcGVyIGJvdW5kcyBvZiB0aGlzIHR5cGUuIFRoZQotICAgICAqIGRlZmF1bHQgdXBwZXIgYm91bmQgaXMge0BsaW5rIE9iamVjdH0uCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgdHlwZXMgdGhhdCByZXByZXNlbnQgdGhlIHVwcGVyIGJvdW5kcyBvZiB0aGlzIHR5cGUuCisgICAgICogVGhlIGRlZmF1bHQgdXBwZXIgYm91bmQgaXMge0Bjb2RlIE9iamVjdH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHVwcGVyIGJvdW5kcyB0eXBlcwogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Yge0BsaW5rIFR5cGV9IGluc3RhbmNlcy4KICAgICAgKiBAdGhyb3dzIFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cyB0byBhIG1pc3NpbmcgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGJvdW5kcyBwb2ludHMgdG8gYSBtaXNzaW5nIHR5cGUKICAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFBhcmFtZXRlcml6ZWRUeXBlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cyB0byBhIHR5cGUgdGhhdCBjYW4ndCBiZQotICAgICAqICAgICAgICAgICAgIGluc3RhbnRpYXRlZCBmb3Igc29tZSByZWFzb24uCisgICAgICogICAgICAgICAgICAgaWYgYW55IGJvdW5kIHBvaW50cyB0byBhIHR5cGUgdGhhdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGZvcgorICAgICAqICAgICAgICAgICAgIHNvbWUgcmVhc29uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgVHlwZVtdIGdldFVwcGVyQm91bmRzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiB0eXBlcyB0aGF0IHJlcHJlc2VudCB0aGUgbG93ZXIgYm91bmRzIG9mIHRoaXMgdHlwZS4gVGhlCi0gICAgICogZGVmYXVsdCBsb3dlciBib3VuZCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSBhIGVtcHR5IGFycmF5Ci0gICAgICogaXMgcmV0dXJuZWQuCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgdHlwZXMgdGhhdCByZXByZXNlbnQgdGhlIGxvd2VyIGJvdW5kcyBvZiB0aGlzIHR5cGUuCisgICAgICogVGhlIGRlZmF1bHQgbG93ZXIgYm91bmQgaXMge0Bjb2RlIG51bGx9LCBpbiB3aGljaCBjYXNlIGFuIGVtcHR5IGFycmF5IGlzCisgICAgICogcmV0dXJuZWQuIFNpbmNlIG9ubHkgb25lIGxvd2VyIGJvdW5kIGlzIGFsbG93ZWQsIHRoZSByZXR1cm5lZCBhcnJheSdzCisgICAgICogbGVuZ3RoIHdpbGwgbmV2ZXIgZXhjZWVkIG9uZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBUeXBlfSBpbnN0YW5jZXMuCisgICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBsb3dlciBib3VuZHMgdHlwZXMKKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cyB0byBhIG1pc3NpbmcgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGJvdW5kcyBwb2ludHMgdG8gYSBtaXNzaW5nIHR5cGUKICAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFBhcmFtZXRlcml6ZWRUeXBlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbXBvbmVudCB0eXBlIHBvaW50cyB0byBhIHR5cGUgdGhhdCBjYW4ndCBiZQotICAgICAqICAgICAgICAgICAgIGluc3RhbnRpYXRlZCBmb3Igc29tZSByZWFzb24uCisgICAgICogICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBib3VuZHMgcG9pbnRzIHRvIGEgdHlwZSB0aGF0IGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgIGluc3RhbnRpYXRlZCBmb3Igc29tZSByZWFzb24KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBUeXBlW10gZ2V0TG93ZXJCb3VuZHMoKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvcGFja2FnZS5odG1sCmluZGV4IGE1MTg4Y2EuLjVhZDVmOTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9wYWNrYWdlLmh0bWwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L3BhY2thZ2UuaHRtbApAQCAtMTEsNSArMTEsNyBAQAogICAgICAgcmVmbGVjdGlvbi4gVGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIHJlcHJlc2VudCB0aGUgdmFyaW91cyBsYW5ndWFnZQogICAgICAgZWxlbWVudHMuICAKICAgICA8L3A+CisgICAgCisgIEBzaW5jZSBBbmRyb2lkIDEuMAogICA8L2JvZHk+CiA8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0F1dGhlbnRpY2F0b3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9BdXRoZW50aWNhdG9yLmphdmEKaW5kZXggNjc5NmRmMC4uMWVlYThkOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0F1dGhlbnRpY2F0b3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQXV0aGVudGljYXRvci5qYXZhCkBAIC0xOCwxNiArMTgsMTYgQEAKIHBhY2thZ2UgamF2YS5uZXQ7CiAKIC8qKgotICogVGhpcyBjbGFzcyBpcyBhYmxlIHRvIG9idGFpbiBhdXRoZW50aWNhdGlvbiBpbmZvIGZvciBhIGNvbm5lY3Rpb24sIHVzdWFsbHkKLSAqIGZyb20gdXNlci4gRmlyc3QgdGhlIGFwcGxpY2F0aW9uIGhhcyB0byBzZXQgdGhlIGRlZmF1bHQgYXV0aGVudGljYXRvciB3aGljaAotICogZXh0ZW5kcyA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiBieQotICogPGNvZGU+c2V0RGVmYXVsdChBdXRoZW50aWNhdG9yIGEpPC9jb2RlPi4KLSAqIDxwPgotICogSXQgc2hvdWxkIG92ZXJyaWRlIDxjb2RlPmdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKTwvY29kZT4gd2hpY2ggZGljdGF0ZXMKLSAqIGhvdyB0aGUgYXV0aGVudGljYXRpb24gaW5mbyBzaG91bGQgYmUgb2J0YWluZWQuCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIGFibGUgdG8gb2J0YWluIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgYSBjb25uZWN0aW9uIGluIHNldmVyYWwgd2F5cy4gRm9yIHRoaXMgcHVycG9zZSBpdCBoYXMgdG8gc2V0IHRoZSBkZWZhdWx0CisgKiBhdXRoZW50aWNhdG9yIHdoaWNoIGV4dGVuZHMge0Bjb2RlIEF1dGhlbnRpY2F0b3J9IGJ5IHtAY29kZQorICogc2V0RGVmYXVsdChBdXRoZW50aWNhdG9yIGEpfS4gVGhlbiBpdCBzaG91bGQgb3ZlcnJpZGUge0Bjb2RlCisgKiBnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCl9IHdoaWNoIGRpY3RhdGVzIGhvdyB0aGUgYXV0aGVudGljYXRpb24gaW5mbyBpcworICogb2J0YWluZWQuIFVzdWFsbHksIGl0IHByb21wdHMgdGhlIHVzZXIgZm9yIHRoZSByZXF1aXJlZCBpbnB1dC4KICAqIAogICogQHNlZSAjc2V0RGVmYXVsdAogICogQHNlZSAjZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdXRoZW50aWNhdG9yIHsKIApAQCAtNTgsMTQgKzU4LDE1IEBACiAgICAgcHJpdmF0ZSBSZXF1ZXN0b3JUeXBlIHJ0OwogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IKLSAgICAgKiB0aGUgc2VuZGVyLiBUaGUgaW1wbGVtZW50YXRpb24gdmFyaWVzLiBUaGUgc3ViY2xhc3MgaGFzIHRvIG92ZXJ3cml0ZQotICAgICAqIHRoaXMuCisgICAgICogUmV0dXJucyB0aGUgY29sbGVjdGVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgYXV0aG9yaXphdGlvbi4gVGhlCisgICAgICogc3ViY2xhc3MgaGFzIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhIHZhbHVlIGRpZmZlcmVudCB0byB0aGUKKyAgICAgKiBkZWZhdWx0IHdoaWNoIGlzIHtAY29kZSBudWxsfS4KICAgICAgKiA8cD4KLSAgICAgKiBJdCByZXR1cm5zIG51bGwgYnkgZGVmYXVsdC4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSBudWxsfSBieSBkZWZhdWx0LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24gVGhlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIHRoYXQKLSAgICAgKiAgICAgICAgIGl0IG9idGFpbnMKKyAgICAgKiBAcmV0dXJuIGNvbGxlY3RlZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBkYXRhLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtNzQsMjcgKzc1LDMwIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcG9ydCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhvcml6YXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIHBvcnQgb2YgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBAcmV0dXJuIHBvcnQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRSZXF1ZXN0aW5nUG9ydCgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aG9yaXphdGlvbiBvciBudWxsCi0gICAgICogaWYgdW5rbm93bi4KKyAgICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aG9yaXphdGlvbiBvcgorICAgICAqIHtAY29kZSBudWxsfSBpZiB1bmtub3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gSW5ldEFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIEluZXRBZGRyZXNzIGdldFJlcXVlc3RpbmdTaXRlKCkgewogICAgICAgICByZXR1cm4gdGhpcy5hZGRyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlYWxtIChwcm9tcHQgc3RyaW5nKSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVpcmVzCisgICAgICogUmV0dXJucyB0aGUgcmVhbG0gKHByb21wdCBzdHJpbmcpIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMKICAgICAgKiBhdXRob3JpemF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyB0aGUgcHJvbXB0IHN0cmluZyBvZiB0aGUgY29ubmVjdGlvbgorICAgICAqIEByZXR1cm4gcHJvbXB0IHN0cmluZyBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFJlcXVlc3RpbmdQcm9tcHQoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnByb21wdDsKQEAgLTEwMywxNyArMTA3LDE5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcHJvdG9jb2wgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRob3JpemF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyB0aGUgcHJvdG9jb2wgb2YgY29ubmVjdGlvbgorICAgICAqIEByZXR1cm4gcHJvdG9jb2wgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRSZXF1ZXN0aW5nUHJvdG9jb2woKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNjaGVtZSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVpcmVzIGF1dGhvcml6YXRpb24uIEVnLgotICAgICAqIEJhc2ljCisgICAgICogUmV0dXJucyB0aGUgc2NoZW1lIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aG9yaXphdGlvbiwgZm9yCisgICAgICogZXhhbXBsZSBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyB0aGUgc2NoZW1lIG9mIHRoZSBjb25uZWN0aW9uCisgICAgICogQHJldHVybiBzY2hlbWUgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRSZXF1ZXN0aW5nU2NoZW1lKCkgewogICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWU7CkBAIC0xMjQsMjQgKzEzMCwyMiBAQAogICAgICAqIHNlY3VyaXR5IGV4Y2VwdGlvbiwgdGhpcyBtZXRob2QgaW52b2tlcyB0aGUgbWV0aG9kcyBvZiB0aGUgcmVnaXN0ZXJlZAogICAgICAqIGF1dGhlbnRpY2F0b3IgdG8gZ2V0IHRoZSBhdXRoZW50aWNhdGlvbiBpbmZvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB0aGUgYXV0aGVudGljYXRpb24gaW5mbwotICAgICAqIAorICAgICAqIEByZXR1cm4gcGFzc3dvcmQgYXV0aGVudGljYXRpb24gaW5mbyBvciB7QGNvZGUgbnVsbH0gaWYgbm8gYXV0aGVudGljYXRvcgorICAgICAqICAgICAgICAgZXhpc3RzLgogICAgICAqIEBwYXJhbSByQWRkcgotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdAotICAgICAqICAgICAgICAgICAgcmVxdWVzdHMgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbi4KICAgICAgKiBAcGFyYW0gclBvcnQKLSAgICAgKiAgICAgICAgICAgIGludCB0aGUgcG9ydCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICBwb3J0IG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24uCiAgICAgICogQHBhcmFtIHJQcm90b2NvbAotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0aGUgcHJvdG9jb2wgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cwotICAgICAqICAgICAgICAgICAgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIHByb3RvY29sIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24uCiAgICAgICogQHBhcmFtIHJQcm9tcHQKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHJlYWxtIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMKLSAgICAgKiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICByZWFsbSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEBwYXJhbSByU2NoZW1lCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBzY2hlbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cwotICAgICAqICAgICAgICAgICAgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIHNjaGVtZSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiByZXF1ZXN0UGFzc3dvcmRBdXRoZW50aWNhdGlvblBlcm1pc3Npb24gaXMgZGVuaWVkCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRlbmllcyB0aGUgcGFzc3dvcmQgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFBhc3N3b3JkQXV0aGVudGljYXRpb24gcmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb24oCiAgICAgICAgICAgICBJbmV0QWRkcmVzcyByQWRkciwgaW50IHJQb3J0LCBTdHJpbmcgclByb3RvY29sLCBTdHJpbmcgclByb21wdCwKQEAgLTE2OCwxNSArMTcyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgc2V0cyA8Y29kZT5hPC9jb2RlPiB0byBiZSB0aGUgZGVmYXVsdCBhdXRoZW50aWNhdG9yLiBJdAotICAgICAqIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSByZWFsbSB0aGF0IHRoZSBVUkwgaXMgcG9pbnRpbmcgdG8gcmVxdWlyZXMKLSAgICAgKiBhdXRob3JpemF0aW9uLiBJZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIgc2V0IHRoZW4gdGhlIGNhbGxlciBtdXN0Ci0gICAgICogaGF2ZSB0aGUgTmV0UGVybWlzc2lvbiAic2V0RGVmYXVsdEF1dGhlbnRpY2F0b3IiLgorICAgICAqIFNldHMge0Bjb2RlIGF9IGFzIHRoZSBkZWZhdWx0IGF1dGhlbnRpY2F0b3IuIEl0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyCisgICAgICogdGhlIHJlYWxtIHRoYXQgdGhlIFVSTCBpcyBwb2ludGluZyB0byByZXF1aXJlcyBhdXRob3JpemF0aW9uLiBJZiB0aGVyZSBpcworICAgICAqIGEgc2VjdXJpdHkgbWFuYWdlciBzZXQgdGhlbiB0aGUgY2FsbGVyIG11c3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUge0Bjb2RlCisgICAgICogTmV0UGVybWlzc2lvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGEKLSAgICAgKiAgICAgICAgICAgIGphdmEubmV0LkF1dGhlbnRpY2F0b3IgVGhlIGF1dGhlbnRpY2F0b3IgdG8gYmUgc2V0LgorICAgICAqICAgICAgICAgICAgYXV0aGVudGljYXRvciB3aGljaCBoYXMgdG8gYmUgc2V0IGFzIGRlZmF1bHQuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uUGVybWlzc2lvbiBpcyBkZW5pZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGVuaWVzIHRoZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgIHBlcm1pc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoQXV0aGVudGljYXRvciBhKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTE5MSwyNyArMTk3LDI0IEBACiAgICAgICogc2VjdXJpdHkgZXhjZXB0aW9uLCB0aGlzIG1ldGhvZCBpbnZva2VzIHRoZSBtZXRob2RzIG9mIHRoZSByZWdpc3RlcmVkCiAgICAgICogYXV0aGVudGljYXRvciB0byBnZXQgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm8uCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uIHRoZSBhdXRoZW50aWNhdGlvbiBpbmZvCi0gICAgICogCisgICAgICogQHJldHVybiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpbmZvIG9yIHtAY29kZSBudWxsfSBpZiBubyBhdXRoZW50aWNhdG9yCisgICAgICogICAgICAgICBleGlzdHMuCiAgICAgICogQHBhcmFtIHJIb3N0Ci0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBob3N0IG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cwotICAgICAqICAgICAgICAgICAgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIGhvc3QgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEBwYXJhbSByQWRkcgotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdAotICAgICAqICAgICAgICAgICAgcmVxdWVzdHMgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbi4KICAgICAgKiBAcGFyYW0gclBvcnQKLSAgICAgKiAgICAgICAgICAgIGludCB0aGUgcG9ydCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICBwb3J0IG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24uCiAgICAgICogQHBhcmFtIHJQcm90b2NvbAotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0aGUgcHJvdG9jb2wgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cwotICAgICAqICAgICAgICAgICAgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIHByb3RvY29sIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24uCiAgICAgICogQHBhcmFtIHJQcm9tcHQKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHJlYWxtIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMKLSAgICAgKiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICByZWFsbSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEBwYXJhbSByU2NoZW1lCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBzY2hlbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cwotICAgICAqICAgICAgICAgICAgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIHNjaGVtZSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiByZXF1ZXN0UGFzc3dvcmRBdXRoZW50aWNhdGlvblBlcm1pc3Npb24gaXMgZGVuaWVkCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGRlbmllcyB0aGUgcGFzc3dvcmQgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFBhc3N3b3JkQXV0aGVudGljYXRpb24gcmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb24oCiAgICAgICAgICAgICBTdHJpbmcgckhvc3QsIEluZXRBZGRyZXNzIHJBZGRyLCBpbnQgclBvcnQsIFN0cmluZyByUHJvdG9jb2wsCkBAIC0yMzksOCArMjQyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBob3N0IG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbiwgb3IKLSAgICAgKiBudWxsIGlmIHVua25vd24uCisgICAgICogUmV0dXJucyB0aGUgaG9zdCBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24gb3IKKyAgICAgKiB7QGNvZGUgbnVsbH0gaWYgdW5rbm93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIHJlcXVlc3RpbmcgaG9zdCBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRSZXF1ZXN0aW5nSG9zdCgpIHsKICAgICAgICAgcmV0dXJuIGhvc3Q7CkBAIC0yNTEsMzMgKzI1NywyOCBAQAogICAgICAqIHNlY3VyaXR5IGV4Y2VwdGlvbiwgdGhpcyBtZXRob2QgaW52b2tlcyB0aGUgbWV0aG9kcyBvZiB0aGUgcmVnaXN0ZXJlZAogICAgICAqIGF1dGhlbnRpY2F0b3IgdG8gZ2V0IHRoZSBhdXRoZW50aWNhdGlvbiBpbmZvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB0aGUgYXV0aGVudGljYXRpb24gaW5mbwotICAgICAqIAorICAgICAqIEByZXR1cm4gcGFzc3dvcmQgYXV0aGVudGljYXRpb24gaW5mbyBvciB7QGNvZGUgbnVsbH0gaWYgbm8gYXV0aGVudGljYXRvcgorICAgICAqICAgICAgICAgZXhpc3RzLgogICAgICAqIEBwYXJhbSBySG9zdAotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0aGUgaG9zdCBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMKLSAgICAgKiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICBob3N0IG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbi4KICAgICAgKiBAcGFyYW0gckFkZHIKLSAgICAgKiAgICAgICAgICAgIGphdmEubmV0LkluZXRBZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQKLSAgICAgKiAgICAgICAgICAgIHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24uCiAgICAgICogQHBhcmFtIHJQb3J0Ci0gICAgICogICAgICAgICAgICBpbnQgdGhlIHBvcnQgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgcG9ydCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEBwYXJhbSByUHJvdG9jb2wKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHByb3RvY29sIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMKLSAgICAgKiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICBwcm90b2NvbCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEBwYXJhbSByUHJvbXB0Ci0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSByZWFsbSBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzCi0gICAgICogICAgICAgICAgICBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgcmVhbG0gb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbi4KICAgICAgKiBAcGFyYW0gclNjaGVtZQotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0aGUgc2NoZW1lIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMKLSAgICAgKiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICBzY2hlbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbi4KICAgICAgKiBAcGFyYW0gclVSTAotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMIHRoZSB1cmwgb2YgdGhlIGNvbm5lY3Rpb24gdGhhdCByZXF1ZXN0cwotICAgICAqICAgICAgICAgICAgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIHVybCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHJlcXVlc3RzIGF1dGhlbnRpY2F0aW9uLgogICAgICAqIEBwYXJhbSByZXFUeXBlCi0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUgdGhlIFJlcXVlc3RvclR5cGUgb2YgdGhlCi0gICAgICogICAgICAgICAgICBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgIHJlcXVlc3RvciB0eXBlIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgcmVxdWVzdHMgYXV0aGVudGljYXRpb24uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uUGVybWlzc2lvbiBpcyBkZW5pZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZGVuaWVzIHRoZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgIHBlcm1pc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uKAogICAgICAgICAgICAgU3RyaW5nIHJIb3N0LCBJbmV0QWRkcmVzcyByQWRkciwgaW50IHJQb3J0LCBTdHJpbmcgclByb3RvY29sLApAQCAtMzA4LDM1ICszMDksMzkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBVUkwgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHJlc3VsdGVkIGluIHRoaXMgcmVxdWVzdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXJsIG9mIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgdXJsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBVUkwgZ2V0UmVxdWVzdGluZ1VSTCgpIHsKICAgICAgICAgcmV0dXJuIHVybDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcmVxdWVzdCwgaXQgY2FuIGJlIHByb3h5IG9yIHNlcnZlcgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyByZXF1ZXN0LCBpdCBjYW4gYmUge0Bjb2RlIFBST1hZfSBvciB7QGNvZGUgU0VSVkVSfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJlcXVlc3RvclR5cGUgb2YgcmVxdWVzdAorICAgICAqIEByZXR1cm4gUmVxdWVzdG9yVHlwZSBvZiB0aGUgYXV0aGVudGljYXRpb24gcmVxdWVzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlIGdldFJlcXVlc3RvclR5cGUoKSB7CiAgICAgICAgIHJldHVybiBydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBhbiBlbnVtIGNsYXNzIG9mIHJlcXVlc3RvciB0eXBlCisgICAgICogRW51bWVyYXRpb24gY2xhc3MgZm9yIHRoZSBvcmlnaW4gb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGVudW0gUmVxdWVzdG9yVHlwZSB7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIHR5cGUgb2YgcHJveHkgc2VydmVyCisgICAgICAgICAqIFR5cGUgb2YgcHJveHkgc2VydmVyCiAgICAgICAgICAqLwogICAgICAgICBQUk9YWSwKIAogICAgICAgICAvKioKLSAgICAgICAgICogdHlwZSBvZiBvcmlnaW4gc2VydmVyCisgICAgICAgICAqIFR5cGUgb2Ygb3JpZ2luIHNlcnZlcgogICAgICAgICAgKi8KICAgICAgICAgU0VSVkVSCiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0JpbmRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9CaW5kRXhjZXB0aW9uLmphdmEKaW5kZXggYmMzZDFlNS4uNjliZTMxNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0JpbmRFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQmluZEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyNiArMTgsMzAgQEAKIHBhY2thZ2UgamF2YS5uZXQ7CiAKIC8qKgotICogQSBCaW5kRXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcHJvY2VzcyBjYW5ub3QgYmluZCBhIGxvY2FsIGFkZHJlc3MvcG9ydCwKLSAqIGVpdGhlciBiZWNhdXNlIGl0IGlzIGFscmVhZHkgYm91bmQgb3IgcmVzZXJ2ZWQgYnkgdGhlIE9TLgorICogQSB7QGNvZGUgQmluZEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gYSBwcm9jZXNzIGNhbm5vdCBiaW5kIGEgbG9jYWwKKyAqIGFkZHJlc3MvcG9ydCwgZWl0aGVyIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBib3VuZCBvciByZXNlcnZlZCBieSB0aGUgT1MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQmluZEV4Y2VwdGlvbiBleHRlbmRzIFNvY2tldEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTk0NTAwNTc2ODI1MTcyMjk1MUw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaW5kRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIGRldGFpbCBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpbmRFeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ2FjaGVSZXF1ZXN0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ2FjaGVSZXF1ZXN0LmphdmEKaW5kZXggZDU2YTQ0Yy4uOGM2N2E0NCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0NhY2hlUmVxdWVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9DYWNoZVJlcXVlc3QuamF2YQpAQCAtMjAsNDEgKzIwLDQ1IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiAKIC8qKgotICogQ2FjaGVSZXF1ZXN0IHByb3ZpZGVzIGNoYW5uZWxzIGZvciBzdG9yaW5nIHJlc291cmNlIGRhdGEgaW4gdGhlCi0gKiA8Y29kZT5SZXNwb25zZUNhY2hlPC9jb2RlPi4gUHJvdG9jb2wgaGFuZGxlciBjYWxscyB0aGUKLSAqIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gd2hpY2ggaXMgc3VwcGxpZWQgYnkgQ2FjaGVkUmVxdWVzdCBvYmplY3QsIHRvCi0gKiBzdG9yZSB0aGUgcmVzb3VyY2UgZGF0YSBpbnRvIHRoZSBjYWNoZS4gSXQgYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJydXB0Ci0gKiBhbmQgYWJvcnQgdGhlIGN1cnJlbnQgc3RvcmUgb3BlcmF0aW9uIGJ5IGNhbGxpbmcgbWV0aG9kIDxjb2RlPmFib3J0PC9jb2RlPi4KLSAqIElmIElPRXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSByZXNwb25zZSBvciB3cml0aW5nIGRhdGEgdG8gdGhlCi0gKiBjYWNoZSwgdGhlIGN1cnJlbnQgY2FjaGUgc3RvcmUgb3BlcmF0aW9uIHdpbGwgYmUgYWJhbmRvbmVkLgorICoge0Bjb2RlIENhY2hlUmVxdWVzdH0gaXMgYSBraW5kIG9mIGNoYW5uZWwgZm9yIHN0b3JpbmcgcmVzb3VyY2UgZGF0YSBpbiB0aGUKKyAqIHtAY29kZSBSZXNwb25zZUNhY2hlfS4gQSBwcm90b2NvbCBoYW5kbGVyIGNhbGxzIHRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfQorICogd2hpY2ggaXMgcHJvdmlkZWQgYnkgdGhlIHtAY29kZSBDYWNoZVJlcXVlc3R9IG9iamVjdCwgdG8gc3RvcmUgdGhlIHJlc291cmNlCisgKiBkYXRhIGludG8gdGhlIGNhY2hlLiBJdCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBpbnRlcnJ1cHQgYW5kIGFib3J0IHRoZQorICogY3VycmVudCBzdG9yZSBvcGVyYXRpb24gYnkgY2FsbGluZyB0aGUgbWV0aG9kIHtAY29kZSBhYm9ydH0uIElmIGFuIHtAY29kZQorICogSU9FeGNlcHRpb259IG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSByZXNwb25zZSBvciB3cml0aW5nIGRhdGEgdG8gdGhlIGNhY2hlLAorICogdGhlIGN1cnJlbnQgY2FjaGUgc3RvcmUgb3BlcmF0aW9uIGlzIGFiYW5kb25lZC4KKyAqIAorICogQHNlZSBSZXNwb25zZUNhY2hlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENhY2hlUmVxdWVzdCB7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENhY2hlUmVxdWVzdCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBYm9ydHMgdGhlIGN1cnJlbnQgY2FjaGUgb3BlcmF0aW9uLiBJZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMgd2hpbGUKLSAgICAgKiByZWFkaW5nIHRoZSByZXNwb25zZSBvciB3cml0aW5nIHJlc291cmNlIGRhdGEgdG8gdGhlIGNhY2hlLCB0aGUgY3VycmVudAotICAgICAqIGNhY2hlIHN0b3JlIG9wZXJhdGlvbiB3aWxsIGJlIGFib3J0ZWQuCisgICAgICogQWJvcnRzIHRoZSBjdXJyZW50IGNhY2hlIG9wZXJhdGlvbi4gSWYgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvY2N1cnMKKyAgICAgKiB3aGlsZSByZWFkaW5nIHRoZSByZXNwb25zZSBvciB3cml0aW5nIHJlc291cmNlIGRhdGEgdG8gdGhlIGNhY2hlLCB0aGUKKyAgICAgKiBjdXJyZW50IGNhY2hlIHN0b3JlIG9wZXJhdGlvbiBpcyBhYm9ydGVkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFib3J0KCk7CiAKICAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGFuIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4sIHdoaWNoIGlzIHVzZWQgdG8gd3JpdGUgdGhlCi0gICAgICogcmVzcG9uc2UgYm9keS4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgT3V0cHV0U3RyZWFtfSB3aGljaCBpcyB1c2VkIHRvIHdyaXRlIHRoZSByZXNwb25zZSBib2R5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB3aGljaCBpcyB1c2VkIHRvIHdyaXRlIHRoZQotICAgICAqICAgICAgICAgcmVzcG9uc2UgYm9keS4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBPdXRwdXRTdHJlYW19IHdoaWNoIGlzIHVzZWQgdG8gd3JpdGUgdGhlIHJlc3BvbnNlIGJvZHkuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgd3JpdGluZyByZXNwb25zZSBib2R5CiAgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBPdXRwdXRTdHJlYW0gZ2V0Qm9keSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9DYWNoZVJlc3BvbnNlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ2FjaGVSZXNwb25zZS5qYXZhCmluZGV4IGE4Y2IxOTIuLmFlNWJlNDQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9DYWNoZVJlc3BvbnNlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0NhY2hlUmVzcG9uc2UuamF2YQpAQCAtMjIsNDMgKzIyLDQ3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCi0gKiBDYWNoZVJlc3BvbnNlIGlzIHVzZWQgZm9yIGdldHRpbmcgcmVzb3VyY2UgZnJvbSB0aGUgUmVzcG9uc2VDYWNoZS4gQW4KLSAqIENhY2hlUmVzcG9uc2Ugb2JqZWN0IHByb3ZpZGVzIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB0byBhY2Nlc3MgdGhlCi0gKiByZXNwb25zZSBib2R5LCBhbmQgYWxzbyBhIG1ldGhvZCA8Y29kZT5nZXRIZWFkZXJzKCk8L2NvZGU+IHRvIGZldGNoIHRoZQotICogcmVzcG9uc2UgaGVhZGVycy4KKyAqIHtAY29kZSBDYWNoZVJlc3BvbnNlfSBpcyB1c2VkIGZvciBnZXR0aW5nIHJlc291cmNlIGRhdGEgZnJvbSB0aGUgaW5zdGFsbGVkCisgKiB7QGNvZGUgUmVzcG9uc2VDYWNoZX0uIEEge0Bjb2RlIENhY2hlUmVzcG9uc2V9IG9iamVjdCBwcm92aWRlcyBhbiB7QGNvZGUKKyAqIElucHV0U3RyZWFtfSB0byBhY2Nlc3MgdGhlIHJlc3BvbnNlIGJvZHkgYW5kIGFsc28gYSBtZXRob2Qge0Bjb2RlCisgKiBnZXRIZWFkZXJzKCl9IHRvIGZldGNoIHRoZSByZXNwb25zZSBoZWFkZXJzLgorICogCisgKiBAc2VlIFJlc3BvbnNlQ2FjaGUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2FjaGVSZXNwb25zZSB7CiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgbWV0aG9kCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENhY2hlUmVzcG9uc2UoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gZm9yIHRoZSByZXNwc29uc2UgYm9keSBhY2Nlc3MuCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIGFjY2VzcyB0aGUgcmVzcG9uc2UgYm9keS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmV0Y2ggdGhlCi0gICAgICogICAgICAgICByZXNwb25zZSBib2R5LgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSB3aGljaCBjYW4gYmUgdXNlZCB0byBmZXRjaCB0aGUgcmVzcG9uc2UKKyAgICAgKiAgICAgICAgIGJvZHkuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBpcyBlbmNvdW50ZWQgd2hpbGUgcmV0cmlldmluZyB0aGUgcmVzcG9uc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgcmV0cmlldmluZyB0aGUgcmVzcG9uc2UKICAgICAgKiAgICAgICAgICAgICBib2R5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJbnB1dFN0cmVhbSBnZXRCb2R5KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbW11dGFibGUgPGNvZGU+TWFwPC9jb2RlPiwgd2hpY2ggY29udGFpbnMgdGhlIHJlc3BvbnNlCi0gICAgICogaGVhZGVycyBpbmZvcm1hdGlvbi4KKyAgICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSB7QGNvZGUgTWFwfSB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgaGVhZGVycworICAgICAqIGluZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIDxjb2RlPk1hcDwvY29kZT4sIHdoaWNoIGNvbnRhaW5zIHRoZSByZXNwb25zZQotICAgICAqICAgICAgICAgaGVhZGVycy4gVGhlIG1hcCBpcyBmcm9tIHJlc3BvbnNlIGhlYWRlciBmaWVsZCBuYW1lcyB0byBsaXN0cyBvZgotICAgICAqICAgICAgICAgZmllbGQgdmFsdWVzLiBGaWVsZCBuYW1lIGlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiwgYW5kIHRoZQotICAgICAqICAgICAgICAgZmllbGQgdmFsdWVzIGxpc3QgaXMgYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+LlRoZQotICAgICAqICAgICAgICAgc3RhdHVzIGxpbmUgYXMgaXRzIGZpZWxkIG5hbWUgaGFzIG51bGwgYXMgaXRzIGxpc3Qgb2YgZmllbGQKLSAgICAgKiAgICAgICAgIHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSB7QGNvZGUgTWFwfSB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgaGVhZGVycy4gVGhlCisgICAgICogICAgICAgICBnZW5lcmljIG1hcCBjb250YWlucyByZXNwb25zZSBoZWFkZXIgZmllbGRzIGFzIHRoZSBrZXkgYW5kIGEgbGlzdAorICAgICAqICAgICAgICAgb2Ygc3RyaW5ncyBhcyB2YWx1ZXMuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBpcyBlbmNvdW50ZWQgd2hpbGUgcmV0cmlldmluZyB0aGUgcmVzcG9uc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgcmV0cmlldmluZyB0aGUgcmVzcG9uc2UKICAgICAgKiAgICAgICAgICAgICBoZWFkZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldEhlYWRlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29ubmVjdEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0Nvbm5lY3RFeGNlcHRpb24uamF2YQppbmRleCA3ZWExYTBjLi40MjM4OWM3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29ubmVjdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Db25uZWN0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDI2ICsxOCwzMCBAQAogcGFja2FnZSBqYXZhLm5ldDsKIAogLyoqCi0gKiBUaGlzIENvbm5lY3RFeGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSBjb25uZWN0aW9uIGNhbm5vdCBiZSBlc3RhYmxpc2hlZCB0byBhCi0gKiByZW1vdGUgaG9zdC9wb3J0LCBiZWNhdXNlIGZvciBpbnN0YW5jZSBhIHNlcnZlciB3YXMgbm90IGxpc3RlbmluZy4KKyAqIEEge0Bjb2RlIENvbm5lY3RFeGNlcHRpb259IGlzIHRocm93biBpZiBhIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkIHRvCisgKiBhIHJlbW90ZSBob3N0IG9uIGEgc3BlY2lmaWMgcG9ydC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb25uZWN0RXhjZXB0aW9uIGV4dGVuZHMgU29ja2V0RXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzE0MDQyNzE2MjIzNjkyMTVMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29ubmVjdEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBkZXRhaWwgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb25uZWN0RXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0NvbnRlbnRIYW5kbGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29udGVudEhhbmRsZXIuamF2YQppbmRleCA5MTVjNDgxLi4wNWM2YWNmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29udGVudEhhbmRsZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29udGVudEhhbmRsZXIuamF2YQpAQCAtMjAsNDMgKzIwLDQwIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnZlcnRzIHRoZSBjb250ZW50IG9mIGEgY2VydGFpbiBmb3JtYXQgaW50byBhIEphdmEgdHlwZSBPYmplY3QuCi0gKiBJdCBpcyBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBmb3IgZWFjaCBjb250ZW50IHR5cGUgaW4gZWFjaCBwbGF0Zm9ybS4gSXQgaXMKLSAqIGNyZWF0ZWQgYnkgPGNvZGU+Q29udGVudEhhbmRsZXJGYWN0b3J5PC9jb2RlPgorICogVGhpcyBjbGFzcyBjb252ZXJ0cyB0aGUgY29udGVudCBvZiBhIGNlcnRhaW4gZm9ybWF0IChpLmUuIGEgTUlNRSB0eXBlKSBpbnRvIGEKKyAqIEphdmEgdHlwZSBvYmplY3QuIEl0IGlzIGNyZWF0ZWQgYnkge0Bjb2RlIENvbnRlbnRIYW5kbGVyRmFjdG9yeX0uIFRoZSBkYXRhCisgKiB2YWx1ZXMgc2hvdWxkIGJlIGFjY2Vzc2VkIHZpYSB7QGNvZGUgVVJMfSBvciB7QGNvZGUgVVJMQ29ubmVjdGlvbn0uCiAgKiAKICAqIEBzZWUgQ29udGVudEhhbmRsZXJGYWN0b3J5Ci0gKiBAc2VlIFVSTAorICogQHNlZSBVUkwjZ2V0Q29udGVudCgpCiAgKiBAc2VlIFVSTENvbm5lY3Rpb24jZ2V0Q29udGVudCgpCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRIYW5kbGVyIHsKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgcG9pbnRlZCBieSB0aGUgc3BlY2lmaWVkIFVSTCBDb25uZWN0aW9uCi0gICAgICogPGNvZGU+dUNvbm48L2NvZGU+LgorICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBwb2ludGVkIGJ5IHRoZSBzcGVjaWZpZWQgVVJMIGNvbm5lY3Rpb24ge0Bjb2RlIHVDb25ufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QgdGhlIG9iamVjdCByZWZlcnJlZCBieSA8Y29kZT51Q29ubjwvY29kZT4KICAgICAgKiBAcGFyYW0gdUNvbm4KLSAgICAgKiAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gdGhlIFVSTCBjb25uZWN0aW9uIHRoYXQgcG9pbnRzIHRvIHRoZSBkZXNpcmVkCi0gICAgICogICAgICAgICAgICBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIFVSTCBjb25uZWN0aW9uIHRoYXQgcG9pbnRzIHRvIHRoZSBkZXNpcmVkIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIG9iamVjdCByZWZlcnJlZCBieSB7QGNvZGUgdUNvbm59LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aHJvd24gaWYgYW4gSU8gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgcmV0cmlldmFsIG9mIHRoZQotICAgICAqICAgICAgICAgICAgIG9iamVjdAorICAgICAqICAgICAgICAgICAgIGlmIGFuIElPIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHJldHJpZXZhbCBvZiB0aGUgb2JqZWN0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRDb250ZW50KFVSTENvbm5lY3Rpb24gdUNvbm4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBwb2ludGVkIGJ5IHRoZSBzcGVjaWZpZWQgVVJMIENvbm5lY3Rpb24KLSAgICAgKiA8Y29kZT51Q29ubjwvY29kZT4uCisgICAgICogUmV0dXJucyB0aGUgb2JqZWN0IHBvaW50ZWQgYnkgdGhlIHNwZWNpZmllZCBVUkwgY29ubmVjdGlvbiB7QGNvZGUgdUNvbm59LgogICAgICAqIAogICAgICAqIEBwYXJhbSB1Q29ubgotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiB0aGUgVVJMIGNvbm5lY3Rpb24gdGhhdCBwb2ludHMgdG8gdGhlCi0gICAgICogICAgICAgICAgICBkZXNpcmVkIG9iamVjdAorICAgICAqICAgICAgICAgICAgVVJMIGNvbm5lY3Rpb24gdGhhdCBwb2ludHMgdG8gdGhlIGRlc2lyZWQgb2JqZWN0LgogICAgICAqIEBwYXJhbSB0eXBlcwotICAgICAqICAgICAgICAgICAgVGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBjb250ZW50IHR5cGVzCi0gICAgICogQHJldHVybiBPYmplY3QgVGhlIG9iamVjdCBvZiB0aGUgcmVzb3VyY2UgcG9pbnRlZCBieSB0aGlzIFVSTCwgb3IgbnVsbCBpZgotICAgICAqICAgICAgICAgdGhlIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggYSBzcGVjaWZpZWQgY29udGVudCB0eXBlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgbGlzdCBvZiBhY2NlcHRhYmxlIGNvbnRlbnQgdHlwZXMuCisgICAgICogQHJldHVybiByZXNvdXJjZSBvYmplY3QgcG9pbnRlZCBieSB0aGlzIFVSTCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICBjb250ZW50IGRvZXNuJ3QgbWF0Y2ggb25lIG9mIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlcy4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgb2J0YWluaW5nIHRoZSBjb250ZW50LgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG9idGFpbmluZyB0aGUgY29udGVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICAvLyBDbGFzcyBhcmcgbm90IGdlbmVyaWZpZWQgaW4gdGhlIHNwZWMuCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29udGVudEhhbmRsZXJGYWN0b3J5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29udGVudEhhbmRsZXJGYWN0b3J5LmphdmEKaW5kZXggZDNhYjIwMi4uMWE1NjRlZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0NvbnRlbnRIYW5kbGVyRmFjdG9yeS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Db250ZW50SGFuZGxlckZhY3RvcnkuamF2YQpAQCAtMTgsMTUgKzE4LDIwIEBACiBwYWNrYWdlIGphdmEubmV0OwogCiAvKioKLSAqIERlZmluZXMgYSBmYWN0b3J5IHdoaWNoIGlzIHJlcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgQ29udGVudEhhbmRsZXIKKyAqIERlZmluZXMgYSBmYWN0b3J5IHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIHtAY29kZSBDb250ZW50SGFuZGxlcn0uCisgKiAKKyAqIEBzZWUgQ29udGVudEhhbmRsZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRIYW5kbGVyRmFjdG9yeSB7CiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbnRlbnQgaGFuZGxlciB0byBoYW5kbGUgPGNvZGU+Y29udGVudFR5cGU8L2NvZGU+CisgICAgICogQ3JlYXRlcyBhIGNvbnRlbnQgaGFuZGxlciB0byBoYW5kbGUge0Bjb2RlIGNvbnRlbnRUeXBlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LkNvbnRlbnRIYW5kbGVyCiAgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCisgICAgICogICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGNvbnRlbnQgdHlwZSB3aGljaCBpcyBoYW5kbGVkIGJ5IHRoZSByZXR1cm5lZAorICAgICAqICAgICAgICAgICAge0Bjb2RlIENvbnRlbnRIYW5kbGVyfS4KKyAgICAgKiBAcmV0dXJuIGNvbnRlbnQgaGFuZGxlciBvYmplY3QgZm9yIGEgc3BlY2lmaWMgY29udGVudCB0eXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIENvbnRlbnRIYW5kbGVyIGNyZWF0ZUNvbnRlbnRIYW5kbGVyKFN0cmluZyBjb250ZW50VHlwZSk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29va2llSGFuZGxlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0Nvb2tpZUhhbmRsZXIuamF2YQppbmRleCA5ZTdlNGU3Li4yOTQyOGVjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvQ29va2llSGFuZGxlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Db29raWVIYW5kbGVyLmphdmEKQEAgLTIxLDcgKzIxLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgcmVhZHkgZm9yIG1hbmFnaW5nIGEgc3RhdGVmdWwgY29va2llIHdpdGggSFRUUCBwcm90b2NvbAorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBtYW5hZ2UgY29va2llcyB3aXRoIGEgSFRUUCBwcm90b2NvbCBoYW5kbGVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvb2tpZUhhbmRsZXIgewogCkBAIC0zNCw5ICszNiwxMCBAQAogICAgICAgICAgICAgInNldENvb2tpZUhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN5c3RlbS13aWRlIGNvb2tpZSBoYW5kbGVyLCBvciBudWxsIGlmIG5vdCBzZXQKKyAgICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0td2lkZSBjb29raWUgaGFuZGxlciBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgY29va2llIGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0td2lkZSBjb29raWUgaGFuZGxlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvb2tpZUhhbmRsZXIgZ2V0RGVmYXVsdCgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtNDcsMTAgKzUwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2V0cyBhIHN5c3RlbS13aWRlIGNvb2tpZSBoYW5kbGVyCisgICAgICogU2V0cyB0aGUgc3lzdGVtLXdpZGUgY29va2llIGhhbmRsZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNIYW5kbGVyCi0gICAgICogICAgICAgICAgICB0aGUgY29va2llIGhhbmRsZXIgdG8gc2V0CisgICAgICogICAgICAgICAgICBhIGNvb2tpZSBoYW5kbGVyIHRvIHNldCBhcyB0aGUgc3lzdGVtLXdpZGUgZGVmYXVsdCBoYW5kbGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0KENvb2tpZUhhbmRsZXIgY0hhbmRsZXIpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtNjEsMjkgKzY1LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNocyBhbmQgZ2V0cyBhbGwgY29va2llcyBpbiB0aGUgY2FjaGUgYnkgdGhlIHNwZWNpZmllZCB1cmkgaW4gdGhlCi0gICAgICogcmVxdWVzdCBoZWFkZXIuCisgICAgICogR2V0cyBhbGwgY29va2llcyBmb3IgYSBzcGVjaWZpYyBVUkkgZnJvbSB0aGUgY29va2llIGNhY2hlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgdXJpIHRvIHNlYXJjaCBmb3IKKyAgICAgKiAgICAgICAgICAgIGEgVVJJIHRvIHNlYXJjaCBmb3IgYXBwbGljYWJsZSBjb29raWVzLgogICAgICAqIEBwYXJhbSByZXF1ZXN0SGVhZGVycwotICAgICAqICAgICAgICAgICAgYSBsaXN0IG9mIHJlcXVlc3QgaGVhZGVycwotICAgICAqIEByZXR1cm4gYSBtYXAgdGhhdCByZWNvcmQgYWxsIHN1Y2ggY29va2llcywgdGhlIG1hcCBpcyB1bmNoYW5nZWFibGUKKyAgICAgKiAgICAgICAgICAgIGEgbGlzdCBvZiByZXF1ZXN0IGhlYWRlcnMuCisgICAgICogQHJldHVybiBhbiB1bmNoYW5nZWFibGUgbWFwIG9mIGFsbCBhcHByb3ByaWF0ZSBjb29raWVzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzb21lIGVycm9yIG9mIEkvTyBvcGVyYXRpb24gb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgSS9PIG9wZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXQoVVJJIHVyaSwKICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVxdWVzdEhlYWRlcnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgY29va2llcyBhY2NvcmRpbmcgdG8gdXJpIGFuZCByZXNwb25zZUhlYWRlcnMKKyAgICAgKiBTZXRzIGFsbCBjb29raWVzIG9mIGEgc3BlY2lmaWMgVVJJIGluIHRoZSB7QGNvZGUgcmVzcG9uc2VIZWFkZXJzfSBpbnRvCisgICAgICogdGhlIGNvb2tpZSBjYWNoZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHVyaQorICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbiBVUkkgb2YgdGhlIGNvb2tpZXMuCiAgICAgICogQHBhcmFtIHJlc3BvbnNlSGVhZGVycwotICAgICAqICAgICAgICAgICAgYSBsaXN0IG9mIHJlcXVlc3QgaGVhZGVycworICAgICAqICAgICAgICAgICAgYSBsaXN0IG9mIHJlcXVlc3QgaGVhZGVycy4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc29tZSBlcnJvciBvZiBJL08gb3BlcmF0aW9uIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIEkvTyBvcGVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KFVSSSB1cmksIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVzcG9uc2VIZWFkZXJzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0RhdGFncmFtUGFja2V0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvRGF0YWdyYW1QYWNrZXQuamF2YQppbmRleCA2YjU0ZDZiLi5iY2M1MzFlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvRGF0YWdyYW1QYWNrZXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvRGF0YWdyYW1QYWNrZXQuamF2YQpAQCAtMjAsMTIgKzIwLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogVGhpcyBjbGFzcyBtb2RlbHMgYSBkYXRhZ3JhbSBwYWNrZXQgdG8gYmUgc2VudCBvciByZWNlaXZlZC4gVGhlCi0gKiBEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCwgSW5ldEFkZHJlc3MsIGludCkgY29uc3RydWN0b3IgaXMgdXNlZCBmb3IgcGFja2V0cwotICogdG8gYmUgc2VudCwgd2hpbGUgdGhlIERhdGFncmFtUGFja2V0KGJ5dGVbXSwgaW50KSBjb25zdHJ1Y3RvciBpcyB1c2VkIGZvcgotICogcmVjZWl2ZWQgcGFja2V0cy4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGRhdGFncmFtIHBhY2tldCB3aGljaCBjb250YWlucyBkYXRhIGVpdGhlciB0byBiZSBzZW50CisgKiBvciByZWNlaXZlZCB0aHJvdWdoIGEge0Bjb2RlIERhdGFncmFtU29ja2V0fS4gSXQgaG9sZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogc3VjaCBhcyBpdHMgc291cmNlIG9yIGRlc3RpbmF0aW9uIGhvc3QuCiAgKiAKICAqIEBzZWUgRGF0YWdyYW1Tb2NrZXQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRGF0YWdyYW1QYWNrZXQgewogCkBAIC00MCwyOSArNDAsMzAgQEAKICAgICBpbnQgb2Zmc2V0ID0gMDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RGF0YWdyYW1QYWNrZXQ8L2NvZGU+IHN1aXRhYmxlIGZvciByZWNlaXZpbmcKLSAgICAgKiBkYXRhZ3JhbSBwYWNrZXRzIG9mIGxlbmd0aCB1cCB0byA8Y29kZT5sZW5ndGg8L2NvZGU+LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERhdGFncmFtUGFja2V0fSBvYmplY3QgdG8gcmVjZWl2ZSBkYXRhIHVwIHRvCisgICAgICoge0Bjb2RlIGxlbmd0aH0gYnl0ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXkgdG8gc3RvcmUgdGhlIHJlYWQgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgYSBieXRlIGFycmF5IHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERhdGFncmFtUGFja2V0KGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHRoaXMoZGF0YSwgMCwgbGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRhdGFncmFtUGFja2V0PC9jb2RlPiBzdWl0YWJsZSBmb3IgcmVjZWl2aW5nCi0gICAgICogZGF0YWdyYW0gcGFja2V0cyBvZiBsZW5ndGggdXAgdG8gPGNvZGU+bGVuZ3RoPC9jb2RlPiwgd2l0aCBhbiBvZmZzZXQKLSAgICAgKiBpbnRvIHRoZSBidWZmZXIgPGNvZGU+b2Zmc2V0PC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRhZ3JhbVBhY2tldH0gb2JqZWN0IHRvIHJlY2VpdmUgZGF0YSB1cCB0bworICAgICAqIHtAY29kZSBsZW5ndGh9IGJ5dGVzIHdpdGggYSBzcGVjaWZpZWQgYnVmZmVyIG9mZnNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSB0byBzdG9yZSB0aGUgcmVhZCBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICBhIGJ5dGUgYXJyYXkgdG8gc3RvcmUgdGhlIHJlYWQgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGludG8gdGhlIGJ5dGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGJ5dGUgYXJyYXkgd2hlcmUgdGhlIGJ5dGVzIGlzIHdyaXR0ZW4uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YWdyYW1QYWNrZXQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTcwLDIyICs3MSwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RGF0YWdyYW1QYWNrZXQ8L2NvZGU+IHN1aXRhYmxlIGZvciBzZW5kaW5nCi0gICAgICogcGFja2V0cyB0byB0aGUgbm9taW5hdGVkIGhvc3QvcG9ydC4gVGhlIDxjb2RlPmxlbmd0aDwvY29kZT4gbXVzdCBiZQotICAgICAqIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5kYXRhPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRhZ3JhbVBhY2tldH0gb2JqZWN0IHRvIHNlbmQgZGF0YSB0byB0aGUgcG9ydAorICAgICAqIHtAY29kZSBhUG9ydH0gb2YgdGhlIGFkZHJlc3Mge0Bjb2RlIGhvc3R9LiBUaGUge0Bjb2RlIGxlbmd0aH0gbXVzdCBiZQorICAgICAqIGxlc3NlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHtAY29kZSBkYXRhfS4gVGhlIGZpcnN0IHtAY29kZQorICAgICAqIGxlbmd0aH0gYnl0ZXMgZnJvbSB0aGUgYnl0ZSBhcnJheSBwb3NpdGlvbiB7QGNvZGUgb2Zmc2V0fSBhcmUgc2VudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSB0byBzdG9yZSB0aGUgcmVhZCBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICBhIGJ5dGUgYXJyYXkgd2hpY2ggc3RvcmVzIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIHNlbnQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0byByZWFkL3dyaXRlIGZyb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2Yge0Bjb2RlIGRhdGF9IHdoZXJlIHRvIHJlYWQgZnJvbS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGRhdGEuCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBob3N0CisgICAgICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGhvc3QuCiAgICAgICogQHBhcmFtIGFQb3J0Ci0gICAgICogICAgICAgICAgICB0YXJnZXQgaG9zdCBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvZiB0aGUgdGFyZ2V0IGhvc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0KICAgICBwdWJsaWMgRGF0YWdyYW1QYWNrZXQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCiAgICAgICAgICAgICBJbmV0QWRkcmVzcyBob3N0LCBpbnQgYVBvcnQpIHsKICAgICAgICAgdGhpcyhkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CkBAIC05NCw4OSArOTYsOTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRhdGFncmFtUGFja2V0PC9jb2RlPiBzdWl0YWJsZSBmb3Igc2VuZGluZwotICAgICAqIHBhY2tldHMgdG8gdGhlIG5vbWluYXRlZCBob3N0L3BvcnQuIFRoZSA8Y29kZT5sZW5ndGg8L2NvZGU+IG11c3QgYmUKLSAgICAgKiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+ZGF0YTwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRGF0YWdyYW1QYWNrZXR9IG9iamVjdCB0byBzZW5kIGRhdGEgdG8gdGhlIHBvcnQKKyAgICAgKiB7QGNvZGUgYVBvcnR9IG9mIHRoZSBhZGRyZXNzIHtAY29kZSBob3N0fS4gVGhlIHtAY29kZSBsZW5ndGh9IG11c3QgYmUKKyAgICAgKiBsZXNzZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB7QGNvZGUgZGF0YX0uIFRoZSBmaXJzdCB7QGNvZGUKKyAgICAgKiBsZW5ndGh9IGJ5dGVzIGFyZSBzZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogICAgICAgICAgICBieXRlIGFycmF5IHRvIHN0b3JlIHRoZSByZWFkIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIGEgYnl0ZSBhcnJheSB3aGljaCBzdG9yZXMgdGhlIGNoYXJhY3RlcnMgdG8gYmUgc2VudC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGRhdGEuCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBob3N0CisgICAgICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGhvc3QuCiAgICAgICogQHBhcmFtIHBvcnQKLSAgICAgKiAgICAgICAgICAgIHRhcmdldCBob3N0IHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9mIHRoZSB0YXJnZXQgaG9zdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YWdyYW1QYWNrZXQoYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgsIEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KSB7CiAgICAgICAgIHRoaXMoZGF0YSwgMCwgbGVuZ3RoLCBob3N0LCBwb3J0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG1hY2hpbmUgdGhhdCBpcyB0aGUgdGFyZ2V0IG9yIHNlbmRlciBvZiB0aGlzCi0gICAgICogZGF0YWdyYW0uCisgICAgICogR2V0cyB0aGUgc2VuZGVyIG9yIGRlc3RpbmF0aW9uIElQIGFkZHJlc3Mgb2YgdGhpcyBkYXRhZ3JhbSBwYWNrZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBJbmV0QWRkcmVzcyB0aGUgdGFyZ2V0IGhvc3QgYWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgZGF0YWdyYW0gd2FzIHJlY2VpdmVkIG9yIHRvIHdoaWNoIGl0CisgICAgICogICAgICAgICBpcyBzZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBkYXRhIHNlbnQgb3IgcmVjZWl2ZWQgaW4gdGhpcyBkYXRhZ3JhbS4KKyAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoaXMgZGF0YWdyYW0gcGFja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYnl0ZVtdIHRoZSBkYXRhIHNlbnQvcmVjZWl2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlZCBkYXRhIG9yIHRoZSBkYXRhIHRvIGJlIHNlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBieXRlW10gZ2V0RGF0YSgpIHsKICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgc2VudCBvciByZWNlaXZlZCBpbiB0aGlzIGRhdGFncmFtLgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBzdG9yZWQgaW4gdGhpcyBkYXRhZ3JhbSBwYWNrZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIGxlbmd0aCBvZiB0aGUgc2VudC9yZWNlaXZlZCBkYXRhCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBkYXRhIG9yIHRoZSBkYXRhIHRvIGJlIHNlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TGVuZ3RoKCkgewogICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHNlbnQgb3IgcmVjZWl2ZWQgaW4gdGhpcyBkYXRhZ3JhbSBidWZmZXIuCisgICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGlzIGRhdGFncmFtIHBhY2tldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgc2VudC9yZWNlaXZlZCBkYXRhCisgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIHJlY2VpdmVkIGRhdGEgb3IgdGhlIGRhdGEgdG8gYmUgc2VudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRPZmZzZXQoKSB7CiAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBwb3J0IG51bWJlciBvZiB0aGUgdGFyZ2V0IG9yIHNlbmRlciBtYWNoaW5lIG9mIHRoaXMgZGF0YWdyYW0uCisgICAgICogR2V0cyB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHRhcmdldCBvciBzZW5kZXIgaG9zdCBvZiB0aGlzIGRhdGFncmFtCisgICAgICogcGFja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IGZvciByZWNlaXZlZCBwYWNrZXRzLCB0aGUgc2VuZGVyIGFkZHJlc3MgYW5kIGZvciBzZW50Ci0gICAgICogICAgICAgICBwYWNrZXRzLCB0aGUgdGFyZ2V0IGhvc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IG51bWJlciBvZiB0aGUgb3JpZ2luIG9yIHRhcmdldCBob3N0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBvcnQoKSB7CiAgICAgICAgIHJldHVybiBwb3J0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgbWFjaGluZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhpcyBkYXRhZ3JhbS4KKyAgICAgKiBTZXRzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgaG9zdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcgotICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBob3N0IGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgaG9zdCBhZGRyZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBZGRyZXNzKEluZXRBZGRyZXNzIGFkZHIpIHsKICAgICAgICAgYWRkcmVzcyA9IGFkZHI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBkYXRhIGJ1ZmZlciBmb3IgdGhpcyBkYXRhZ3JhbS4KKyAgICAgKiBTZXRzIHRoZSBkYXRhIGJ1ZmZlciBmb3IgdGhpcyBkYXRhZ3JhbSBwYWNrZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZgotICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdG8gYmUgc2VudAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgZGF0YS4KICAgICAgKiBAcGFyYW0gYW5PZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW50byB0aGUgZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciBvZmZzZXQgd2hlcmUgdGhlIGRhdGEgaXMgc3RvcmVkLgogICAgICAqIEBwYXJhbSBhTGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHNlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgc2VudCBvciB0aGUgbGVuZ3RoIG9mIGJ1ZmZlciB0bworICAgICAqICAgICAgICAgICAgc3RvcmUgdGhlIHJlY2VpdmVkIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldERhdGEoYnl0ZVtdIGJ1ZiwgaW50IGFuT2Zmc2V0LCBpbnQgYUxlbmd0aCkgewogICAgICAgICBpZiAoMCA+IGFuT2Zmc2V0IHx8IGFuT2Zmc2V0ID4gYnVmLmxlbmd0aCB8fCAwID4gYUxlbmd0aApAQCAtMTg5LDEwICsyMDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRhdGEgc2VudCBpbiB0aGlzIGRhdGFncmFtLgorICAgICAqIFNldHMgdGhlIGRhdGEgYnVmZmVyIGZvciB0aGlzIGRhdGFncmFtIHBhY2tldC4gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YWdyYW0KKyAgICAgKiBwYWNrZXQgaXMgc2V0IHRvIHRoZSBidWZmZXIgbGVuZ3RoLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHRvIGJlIHNlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gc3RvcmUgdGhlIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldERhdGEoYnl0ZVtdIGJ1ZikgewogICAgICAgICBsZW5ndGggPSBidWYubGVuZ3RoOyAvLyBUaGlzIHdpbGwgY2hlY2sgZm9yIG51bGwKQEAgLTIwMSwxMCArMjE1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgc2VudCBpbiB0aGlzIGRhdGFncmFtLgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YWdyYW0gcGFja2V0LiBUaGlzIGxlbmd0aCBwbHVzIHRoZSBvZmZzZXQgbXVzdAorICAgICAqIGJlIGxlc3NlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBidWZmZXIgc2l6ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHNlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhpcyBkYXRhZ3JhbSBwYWNrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExlbmd0aChpbnQgbGVuKSB7CiAgICAgICAgIGlmICgwID4gbGVuIHx8IG9mZnNldCArIGxlbiA+IGRhdGEubGVuZ3RoKSB7CkBAIC0yMTQsMTAgKzIzMCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHRhcmdldCBtYWNoaW5lIG9mIHRoaXMgZGF0YWdyYW0uCisgICAgICogU2V0cyB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHRhcmdldCBob3N0IG9mIHRoaXMgZGF0YWdyYW0gcGFja2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhUG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBob3N0IHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgaG9zdCBwb3J0IG51bWJlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UG9ydChpbnQgYVBvcnQpIHsKICAgICAgICAgaWYgKGFQb3J0IDwgMCB8fCBhUG9ydCA+IDY1NTM1KSB7CkBAIC0yMjcsMzYgKzI0NCw0MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RGF0YWdyYW1QYWNrZXQ8L2NvZGU+IHN1aXRhYmxlIGZvciBzZW5kaW5nCi0gICAgICogcGFja2V0cyB0byB0aGUgbm9taW5hdGVkIGhvc3QvcG9ydC4gVGhlIDxjb2RlPmxlbmd0aDwvY29kZT4gbXVzdCBiZQotICAgICAqIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5kYXRhPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRhZ3JhbVBhY2tldH0gb2JqZWN0IHRvIHNlbmQgZGF0YSB0byB0aGUKKyAgICAgKiBhZGRyZXNzIHtAY29kZSBzb2NrQWRkcn0uIFRoZSB7QGNvZGUgbGVuZ3RofSBtdXN0IGJlIGxlc3NlciB0aGFuIG9yIGVxdWFsCisgICAgICogdG8gdGhlIHNpemUgb2Yge0Bjb2RlIGRhdGF9LiBUaGUgZmlyc3Qge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgb2YgdGhlIGRhdGEKKyAgICAgKiBhcmUgc2VudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSB0byBzdG9yZSB0aGUgcmVhZCBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBzdG9yZSB0aGUgZGF0YS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhLgogICAgICAqIEBwYXJhbSBzb2NrQWRkcgotICAgICAqICAgICAgICAgICAgdGhlIG1hY2hpbmUgYWRkcmVzcyBhbmQgcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBob3N0IGFkZHJlc3MgYW5kIHBvcnQuCisgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBpbiB0aGUgdW5kZXJseWluZyBwcm90b2NvbCBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIERhdGFncmFtUGFja2V0KGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoLCBTb2NrZXRBZGRyZXNzIHNvY2tBZGRyKQotICAgICAgICAgICAgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisgICAgcHVibGljIERhdGFncmFtUGFja2V0KGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoLCBTb2NrZXRBZGRyZXNzIHNvY2tBZGRyKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhkYXRhLCAwLCBsZW5ndGgpOwogICAgICAgICBzZXRTb2NrZXRBZGRyZXNzKHNvY2tBZGRyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRhdGFncmFtUGFja2V0PC9jb2RlPiBzdWl0YWJsZSBmb3Igc2VuZGluZwotICAgICAqIHBhY2tldHMgdG8gdGhlIG5vbWluYXRlZCBob3N0L3BvcnQuIFRoZSA8Y29kZT5sZW5ndGg8L2NvZGU+IG11c3QgYmUKLSAgICAgKiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+ZGF0YTwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRGF0YWdyYW1QYWNrZXR9IG9iamVjdCB0byBzZW5kIGRhdGEgdG8gdGhlCisgICAgICogYWRkcmVzcyB7QGNvZGUgc29ja0FkZHJ9LiBUaGUge0Bjb2RlIGxlbmd0aH0gbXVzdCBiZSBsZXNzZXIgdGhhbiBvciBlcXVhbAorICAgICAqIHRvIHRoZSBzaXplIG9mIHtAY29kZSBkYXRhfS4gVGhlIGZpcnN0IHtAY29kZSBsZW5ndGh9IGJ5dGVzIG9mIHRoZSBkYXRhCisgICAgICogYXJlIHNlbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXkgdG8gc3RvcmUgdGhlIHJlYWQgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgdG8gc3RvcmUgdGhlIGRhdGEuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0byByZWFkL3dyaXRlIGZyb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YS4KICAgICAgKiBAcGFyYW0gc29ja0FkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYWNoaW5lIGFkZHJlc3MgYW5kIHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgaG9zdCBhZGRyZXNzIGFuZCBwb3J0LgorICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3IgaW4gdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wgb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRhZ3JhbVBhY2tldChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKICAgICAgICAgICAgIFNvY2tldEFkZHJlc3Mgc29ja0FkZHIpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewpAQCAtMjY1LDE3ICsyODksMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIFNvY2tldEFkZHJlc3MgZm9yIHRoaXMgcGFja2V0LgorICAgICAqIEdldHMgdGhlIGhvc3QgYWRkcmVzcyBhbmQgdGhlIHBvcnQgdG8gd2hpY2ggdGhpcyBkYXRhZ3JhbSBwYWNrZXQgaXMgc2VudAorICAgICAqIGFzIGEge0Bjb2RlIFNvY2tldEFkZHJlc3N9IG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBTb2NrZXRBZGRyZXNzIG9mIHRoZSB0YXJnZXQgaG9zdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFNvY2tldEFkZHJlc3MgZ2V0U29ja2V0QWRkcmVzcygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhnZXRBZGRyZXNzKCksIGdldFBvcnQoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBTb2NrZXRBZGRyZXNzIGZvciB0aGlzIHBhY2tldC4KKyAgICAgKiBTZXRzIHRoZSB7QGNvZGUgU29ja2V0QWRkcmVzc30gZm9yIHRoaXMgZGF0YWdyYW0gcGFja2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb2NrQWRkcgotICAgICAqICAgICAgICAgICAgdGhlIG1hY2hpbmUgYWRkcmVzcyBhbmQgcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIFNvY2tldEFkZHJlc3Mgb2YgdGhlIHRhcmdldCBob3N0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTb2NrZXRBZGRyZXNzKFNvY2tldEFkZHJlc3Mgc29ja0FkZHIpIHsKICAgICAgICAgaWYgKCEoc29ja0FkZHIgaW5zdGFuY2VvZiBJbmV0U29ja2V0QWRkcmVzcykpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0RhdGFncmFtU29ja2V0LmphdmEKaW5kZXggM2I3OTkwYy4uMGM3NzQ1ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0RhdGFncmFtU29ja2V0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0RhdGFncmFtU29ja2V0LmphdmEKQEAgLTIwLDE2ICsyMCwxOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRGF0YWdyYW1DaGFubmVsOwogCi0vL2ltcG9ydCBhbmRyb2lkLm5ldC5Tb2NrZXRJbXBsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlNvY2tldEltcGxQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgbW9kZWxzIGEgc29ja2V0IGZvciBzZW5kaW5nICYgcmVjZWl2aW5nIGRhdGFncmFtIHBhY2tldHMuCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBVRFAgc29ja2V0IGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcge0Bjb2RlCisgKiBEYXRhZ3JhbVBhY2tldH0uIEEge0Bjb2RlIERhdGFncmFtU29ja2V0fSBvYmplY3QgY2FuIGJlIHVzZWQgZm9yIGJvdGgKKyAqIGVuZHBvaW50cyBvZiBhIGNvbm5lY3Rpb24gZm9yIGEgcGFja2V0IGRlbGl2ZXJ5IHNlcnZpY2UuCiAgKiAKICAqIEBzZWUgRGF0YWdyYW1QYWNrZXQKKyAqIEBzZWUgRGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEYXRhZ3JhbVNvY2tldCB7CiAKQEAgLTU3LDI0ICs2MCwyNyBAQAogICAgIHByaXZhdGUgT2JqZWN0IGxvY2sgPSBuZXcgTG9jaygpOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGRhdGFncmFtIHNvY2tldCwgYm91bmQgdG8gYW55IGF2YWlsYWJsZSBwb3J0IG9uIHRoZQotICAgICAqIGxvY2FsaG9zdC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgVURQIGRhdGFncmFtIHNvY2tldCB3aGljaCBpcyBib3VuZCB0byBhbnkgYXZhaWxhYmxlIHBvcnQgb24KKyAgICAgKiB0aGUgbG9jYWxob3N0LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBjcmVhdGluZyBvciBiaW5kaW5nIHRoZSBzb2NrZXQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgb3IgYmluZGluZyB0aGUgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRhZ3JhbVNvY2tldCgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICB0aGlzKDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkYXRhZ3JhbSBzb2NrZXQsIGJvdW5kIHRvIHRoZSBub21pbmF0ZWQgcG9ydCBvbiB0aGUgbG9jYWxob3N0LgorICAgICAqIENvbnN0cnVjdHMgYSBVRFAgZGF0YWdyYW0gc29ja2V0IHdoaWNoIGlzIGJvdW5kIHRvIHRoZSBzcGVjaWZpYyBwb3J0CisgICAgICoge0Bjb2RlIGFQb3J0fSBvbiB0aGUgbG9jYWxob3N0LiBWYWxpZCB2YWx1ZXMgZm9yIHtAY29kZSBhUG9ydH0gYXJlCisgICAgICogYmV0d2VlbiAwIGFuZCA2NTUzNSBpbmNsdXNpdmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCB0byBiaW5kIG9uIHRoZSBsb2NhbGhvc3QKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IHRvIGJpbmQgb24gdGhlIGxvY2FsaG9zdC4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgY3JlYXRpbmcgb3IgYmluZGluZyB0aGUgc29ja2V0CisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIG9yIGJpbmRpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YWdyYW1Tb2NrZXQoaW50IGFQb3J0KSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTgzLDE1ICs4OSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBkYXRhZ3JhbSBzb2NrZXQsIGJvdW5kIHRvIHRoZSBub21pbmF0ZWQgbG9jYWxob3N0L3BvcnQuCisgICAgICogQ29uc3RydWN0cyBhIFVEUCBkYXRhZ3JhbSBzb2NrZXQgd2hpY2ggaXMgYm91bmQgdG8gdGhlIHNwZWNpZmljIGxvY2FsCisgICAgICogYWRkcmVzcyB7QGNvZGUgYWRkcn0gb24gcG9ydCB7QGNvZGUgYVBvcnR9LiBWYWxpZCB2YWx1ZXMgZm9yIHtAY29kZQorICAgICAqIGFQb3J0fSBhcmUgYmV0d2VlbiAwIGFuZCA2NTUzNSBpbmNsdXNpdmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWxob3N0IHRvIGJpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IHRvIGJpbmQgb24gdGhlIGxvY2FsaG9zdC4KICAgICAgKiBAcGFyYW0gYWRkcgotICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb24gdGhlIG11bHRpaG9tZWQgbG9jYWxob3N0IHRvIGJpbmQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIHRvIGJpbmQgb24gdGhlIGxvY2FsaG9zdC4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgY3JlYXRpbmcgb3IgYmluZGluZyB0aGUgc29ja2V0CisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIG9yIGJpbmRpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YWdyYW1Tb2NrZXQoaW50IGFQb3J0LCBJbmV0QWRkcmVzcyBhZGRyKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTEwMCwxMiArMTA4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VudCBwcmlvciB0byBhdHRlbXB0aW5nIHRvIGJpbmQgdGhlIHNvY2tldCwgY2hlY2sgdGhhdCB0aGUgcG9ydCBpcwotICAgICAqIHdpdGhpbiB0aGUgdmFsaWQgcG9ydCByYW5nZSBhbmQgdmVyaWZ5IHdpdGggdGhlIHNlY3VyaXR5IG1hbmFnZXIgdGhhdCB0aGUKLSAgICAgKiBwb3J0IG1heSBiZSBib3VuZCBieSB0aGUgY3VycmVudCBjb250ZXh0LgorICAgICAqIFNlbmRzIHByaW9yIHRvIGF0dGVtcHRpbmcgdG8gYmluZCB0aGUgc29ja2V0LCBjaGVja3Mgd2hldGhlciB0aGUgcG9ydCBpcworICAgICAqIHdpdGhpbiB0aGUgdmFsaWQgcG9ydCByYW5nZSBhbmQgdmVyaWZpZXMgd2l0aCB0aGUgc2VjdXJpdHkgbWFuYWdlciB0aGF0CisgICAgICogdGhlIHBvcnQgbWF5IGJlIGJvdW5kIGJ5IHRoZSBjdXJyZW50IGNvbnRleHQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWxob3N0IHRoYXQgaXMgdG8gYmUgYm91bmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSBsb2NhbGhvc3QgdGhhdCBpcyB0byBiZSBib3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICB2b2lkIGNoZWNrTGlzdGVuKGludCBhUG9ydCkgewogICAgICAgICBpZiAoYVBvcnQgPCAwIHx8IGFQb3J0ID4gNjU1MzUpIHsKQEAgLTExOCw3ICsxMjcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBzb2NrZXQuCisgICAgICogQ2xvc2VzIHRoaXMgVURQIGRhdGFncmFtIHNvY2tldCBhbmQgYWxsIHBvc3NpYmx5IGFzc29jaWF0ZWQgY2hhbm5lbHMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgLy8gSW4gdGhlIGRvY3VtZW50YXRpb24gamRrMS4xLjdhL2d1aWRlL25ldC9taXNjTmV0Lmh0bWwsIHRoaXMgbWV0aG9kIGlzCiAgICAgLy8gbm90ZWQgYXMgbm90IGJlaW5nIHN5bmNocm9uaXplZC4KQEAgLTEyOCwxNCArMTM5LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29ubmVjdCB0aGUgZGF0YWdyYW0gc29ja2V0IHRvIGEgcmVtb3RlIGhvc3QgYW5kIHBvcnQuIFRoZSBob3N0IGFuZCBwb3J0Ci0gICAgICogYXJlIHZhbGlkYXRlZCwgdGhlcmVhZnRlciB0aGUgb25seSB2YWxpZGF0aW9uIG9uIHNlbmQoKSBhbmQgcmVjZWl2ZSgpIGlzCi0gICAgICogdGhhdCB0aGUgcGFja2V0IGFkZHJlc3MvcG9ydCBtYXRjaGVzIHRoZSBjb25uZWN0ZWQgdGFyZ2V0LgorICAgICAqIENvbm5lY3RzIHRoaXMgVURQIGRhdGFncmFtIHNvY2tldCB0byB0aGUgc3BlY2lmaWMgdGFyZ2V0IGhvc3Qgd2l0aCB0aGUKKyAgICAgKiBhZGRyZXNzIHtAY29kZSBhbkFkcmVzc30gb24gcG9ydCB7QGNvZGUgYVBvcnR9LiBUaGUgaG9zdCBhbmQgcG9ydCBhcmUKKyAgICAgKiB2YWxpZGF0ZWQsIHRoZXJlYWZ0ZXIgdGhlIG9ubHkgdmFsaWRhdGlvbiBvbiB7QGNvZGUgc2VuZCgpfSBhbmQge0Bjb2RlCisgICAgICogcmVjZWl2ZSgpfSBpcyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYWNrZXQgYWRkcmVzcy9wb3J0IG1hdGNoZXMgdGhlCisgICAgICogY29ubmVjdGVkIHRhcmdldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYW5BZGRyZXNzCi0gICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgYWRkcmVzcyBvZiB0aGlzIHNvY2tldC4KICAgICAgKiBAcGFyYW0gYVBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBwb3J0IG9mIHRoaXMgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoSW5ldEFkZHJlc3MgYW5BZGRyZXNzLCBpbnQgYVBvcnQpIHsKICAgICAgICAgaWYgKGFuQWRkcmVzcyA9PSBudWxsIHx8IGFQb3J0IDwgMCB8fCBhUG9ydCA+IDY1NTM1KSB7CkBAIC0xNzMsOCArMTg3LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogJ0Rpc2Nvbm5lY3QnIHRoZSBkYXRhZ3JhbSBzb2NrZXQgZnJvbSBhIHJlbW90ZSBob3N0IGFuZCBwb3J0LiBUaGlzIG1ldGhvZAotICAgICAqIG1heSBiZSBjYWxsZWQgb24gYW4gdW5jb25uZWN0ZWQgc29ja2V0LgorICAgICAqIERpc2Nvbm5lY3RzIHRoaXMgVURQIGRhdGFncmFtIHNvY2tldCBmcm9tIHRoZSByZW1vdGUgaG9zdC4gVGhpcyBtZXRob2QKKyAgICAgKiBjYWxsZWQgb24gYW4gdW5jb25uZWN0ZWQgc29ja2V0IGRvZXMgbm90aGluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewogICAgICAgICBpZiAoaXNDbG9zZWQoKSB8fCAhaXNDb25uZWN0ZWQoKSkgewpAQCAtMjAxLDIxICsyMTcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBJbmV0QWRkcmVzc30gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBhZGRyZXNzIHRoaXMKLSAgICAgKiBzb2NrZXQgaGFzIGNvbm5lY3RlZCB0by4KKyAgICAgKiBHZXRzIHRoZSB7QGNvZGUgSW5ldEFkZHJlc3N9IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgcmVtb3RlIGFkZHJlc3MgdG8KKyAgICAgKiB3aGljaCB0aGlzIFVEUCBkYXRhZ3JhbSBzb2NrZXQgaXMgY29ubmVjdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaWYgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkLCB0aGUgYWRkcmVzcyBpdCBpcyBjb25uZWN0ZWQgdG8uIEEKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHJldHVybiBzaWduaWZpZXMgbm8gY29ubmVjdGlvbiBoYXMgYmVlbiBtYWRlLgorICAgICAqIEByZXR1cm4gdGhlIHJlbW90ZSBhZGRyZXNzIHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0byBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoaXMgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEluZXRBZGRyZXNzKCkgewogICAgICAgICByZXR1cm4gYWRkcmVzczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBJbmV0QWRkcmVzc30gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSA8aT5sb2NhbDwvaT4KLSAgICAgKiBhZGRyZXNzIHRoaXMgc29ja2V0IGlzIGJvdW5kIHRvLgorICAgICAqIEdldHMgdGhlIHtAY29kZSBJbmV0QWRkcmVzc30gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBib3VuZCBsb2NhbAorICAgICAqIGFkZHJlc3Mgb2YgdGhpcyBVRFAgZGF0YWdyYW0gc29ja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIGFkZHJlc3MgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBib3VuZAorICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIGFkZHJlc3MgdG8gd2hpY2ggdGhpcyBzb2NrZXQgaXMgYm91bmQgdG8gb3Ige0Bjb2RlCisgICAgICogICAgICAgICBudWxsfSBpZiB0aGlzIHNvY2tldCBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygpIHsKICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKQEAgLTIzNyw5ICsyNTYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGxvY2FsIHBvcnQgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBib3VuZC4KKyAgICAgKiBHZXRzIHRoZSBsb2NhbCBwb3J0IHdoaWNoIHRoaXMgc29ja2V0IGlzIGJvdW5kIHRvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IGxvY2FsIHBvcnQgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBib3VuZAorICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgb2YgdGhpcyBzb2NrZXQgb3Ige0Bjb2RlIC0xfSBpZiB0aGlzIHNvY2tldCBpcworICAgICAqICAgICAgICAgY2xvc2VkIGFuZCB7QGNvZGUgMH0gaWYgaXQgaXMgdW5ib3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKQEAgLTI1MiwzMiArMjczLDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgcG9ydCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8uCisgICAgICogR2V0cyB0aGUgcmVtb3RlIHBvcnQgd2hpY2ggdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSByZW1vdGUgcG9ydCBudW1iZXIgdGhhdCB0aGlzIHNvY2tldCBoYXMgY29ubmVjdGVkIHRvLiBBCi0gICAgICogICAgICAgICByZXR1cm4gb2YgPGNvZGU+LTE8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24KLSAgICAgKiAgICAgICAgIGluIHBsYWNlLgorICAgICAqIEByZXR1cm4gdGhlIHJlbW90ZSBwb3J0IG9mIHRoaXMgc29ja2V0LiBUaGUgcmV0dXJuIHZhbHVlIHtAY29kZSAtMX0KKyAgICAgKiAgICAgICAgIGluZGljYXRlcyB0aGF0IHRoaXMgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQb3J0KCkgewogICAgICAgICByZXR1cm4gcG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzb2NrZXQgaXMgbXVsdGljYXN0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgc29ja2V0IGlzIG11bHRpY2FzdCBvciBub3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBpc011bHRpY2FzdFNvY2tldCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgc29ja2V0IHJlY2VpdmUgYnVmZmVyIHNpemUgKFNPX1JDVkJVRikuCisgICAgICogR2V0cyB0aGUgc29ja2V0IHJlY2VpdmUgYnVmZmVyIHNpemUuICgge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fUkNWQlVGfSApCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgc29ja2V0IHJlY2VpdmUgYnVmZmVyIHNpemUKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBidWZmZXIgc2l6ZS4KICAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdldHRpbmcgdGhlIG9wdGlvbiB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZEJpbmQoZmFsc2UpOwpAQCAtMjg1LDEyICszMDcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplIChTT19TTkRCVUYpLgorICAgICAqIEdldHMgdGhlIHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplLiAoIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX1NOREJVRn0gKQogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplLgogICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2V0dGluZyB0aGUgb3B0aW9uIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNlbmRCdWZmZXJTaXplKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC0yOTgsMTMgKzMyMCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgc29ja2V0IHJlY2VpdmUgdGltZW91dCAoU09fUkNWVElNRU9VVCksIGluIG1pbGxpc2Vjb25kcy4gWmVybwotICAgICAqIGltcGxpZXMgdGhlIHRpbWVvdXQgaXMgZGlzYWJsZWQuCisgICAgICogR2V0cyB0aGUgc29ja2V0IHJlY2VpdmUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIFRoZSByZXR1cm4gdmFsdWUge0Bjb2RlCisgICAgICogMH0gaW1wbGllcyB0aGUgdGltZW91dCBpcyBkaXNhYmxlZC9pbmZpbml0aXZlLiAoIHtAY29kZQorICAgICAqIFNvY2tldE9wdGlvbnMuU09fVElNRU9VVH0gKQogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHNvY2tldCByZWNlaXZlIHRpbWVvdXQKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzb2NrZXQgcmVjZWl2ZSB0aW1lb3V0LgogICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2V0dGluZyB0aGUgb3B0aW9uIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNvVGltZW91dCgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZEJpbmQoZmFsc2UpOwpAQCAtMzEyLDIwICszMzUsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWNlaXZlIG9uIHRoaXMgc29ja2V0IGludG8gdGhlIHBhY2tldCBhcmd1bWVudC4gVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsCi0gICAgICogYSBwYWNrZXQgaXMgcmVjZWl2ZWQgb3IsIGlmIGEgdGltZW91dCBoYXMgYmVlbiBkZWZpbmVkLCB0aGUgdGltZW91dAotICAgICAqIHBlcmlvZCBleHBpcmVzLiBJZiB0aGlzIGlzIGEgY29ubmVjdGVkIHNvY2tldCwgdGhlIHBhY2tldCBob3N0L3BvcnQgYXJlCi0gICAgICogY29tcGFyZWQgdG8gdGhlIGNvbm5lY3Rpb24gaG9zdC9wb3J0IG90aGVyd2lzZSB0aGUgc2VjdXJpdHkgbWFuYWdlciBpZgotICAgICAqIHByZXNlbnQgaXMgcXVlcmllZCB3aGV0aGVyIHRoZSBwYWNrZXQgaG9zdC9wb3J0IGlzIGFjY2VwdGFibGUuIEFueQotICAgICAqIHBhY2tldHMgZnJvbSB1bmFjY2VwdGFibGUgb3JpZ2lucyB3aWxsIGJlIHNpbGVudGx5IGRpc2NhcmRlZC4gVGhlIHBhY2tldAotICAgICAqIGZpZWxkcyBhcmUgc2V0IGFjY29yZGluZyB0byB0aGUgZGF0YSByZWNlaXZlZC4gSWYgdGhlIHJlY2VpdmVkIGRhdGEgaXMKLSAgICAgKiBsb25nZXIgdGhhbiB0aGUgcGFja2V0IGJ1ZmZlciwgaXQgaXMgdHJ1bmNhdGVkLgorICAgICAqIFJlY2VpdmVzIGEgcGFja2V0IGZyb20gdGhpcyBzb2NrZXQgYW5kIHN0b3JlcyBpdCBpbiB0aGUgYXJndW1lbnQge0Bjb2RlCisgICAgICogcGFja30uIEFsbCBmaWVsZHMgb2Yge0Bjb2RlIHBhY2t9IG11c3QgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgZGF0YQorICAgICAqIHJlY2VpdmVkLiBJZiB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBsb25nZXIgdGhhbiB0aGUgcGFja2V0IGJ1ZmZlciBzaXplIGl0CisgICAgICogaXMgdHJ1bmNhdGVkLiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgYSBwYWNrZXQgaXMgcmVjZWl2ZWQgb3IgYSB0aW1lb3V0CisgICAgICogaGFzIGV4cGlyZWQuIElmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMsIGl0cyB7QGNvZGUgY2hlY2tBY2NlcHR9IG1ldGhvZAorICAgICAqIGRldGVybWluZXMgd2hldGhlciBvciBub3QgYSBwYWNrZXQgaXMgZGlzY2FyZGVkLiBBbnkgcGFja2V0cyBmcm9tCisgICAgICogdW5hY2NlcHRhYmxlIG9yaWdpbnMgYXJlIHNpbGVudGx5IGRpc2NhcmRlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFjawotICAgICAqICAgICAgICAgICAgdGhlIERhdGFncmFtUGFja2V0IHRvIHJlY2VpdmUgZGF0YSBpbnRvCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgYSByZWNlaXZlIGVycm9yIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgRGF0YWdyYW1QYWNrZXR9IHRvIHN0b3JlIHRoZSByZWNlaXZlZCBkYXRhLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVjZWl2aW5nIHRoZSBwYWNrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlY2VpdmUoRGF0YWdyYW1QYWNrZXQgcGFjaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKHRydWUpOwpAQCAtNDA3LDE0ICs0MjksMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZW5kIHRoZSBwYWNrZXQgb24gdGhpcyBzb2NrZXQuIFRoZSBwYWNrZXQgbXVzdCBzYXRpc2Z5IHRoZSBzZWN1cml0eQotICAgICAqIHBvbGljeSBiZWZvcmUgaXQgbWF5IGJlIHNlbnQuCisgICAgICogU2VuZHMgYSBwYWNrZXQgb3ZlciB0aGlzIHNvY2tldC4gVGhlIHBhY2tldCBtdXN0IHNhdGlzZnkgdGhlIHNlY3VyaXR5CisgICAgICogcG9saWN5IGJlZm9yZSBpdCBtYXkgYmUgc2VudC4gSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCwgdGhpcworICAgICAqIG1ldGhvZCBjaGVja3Mgd2hldGhlciBpdCBpcyBhbGxvd2VkIHRvIHNlbmQgdGhpcyBwYWNrZXQgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGFkZHJlc3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhY2sKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRhZ3JhbVBhY2tldCB0byBzZW5kCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgYSBzZW5kIGVycm9yIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgRGF0YWdyYW1QYWNrZXR9IHdoaWNoIGhhcyB0byBiZSBzZW50LgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNlbmQoRGF0YWdyYW1QYWNrZXQgcGFjaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKHRydWUpOwpAQCAtNDUyLDE0ICs0NzYsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplLgorICAgICAqIFNldHMgdGhlIHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplLiBUaGlzIGJ1ZmZlciBzaXplIGRldGVybWluZXMgd2hpY2ggdGhlCisgICAgICogbWF4aW11bSBwYWNrZXQgc2l6ZSBpcyB0aGF0IGNhbiBiZSBzZW50IG92ZXIgdGhpcyBzb2NrZXQuIEl0IGRlcGVuZHMgb24KKyAgICAgKiB0aGUgbmV0d29yayBpbXBsZW1lbnRhdGlvbiB3aGF0IHdpbGwgaGFwcGVuIGlmIHRoZSBwYWNrZXQgaXMgYmlnZ2VyIHRoYW4KKyAgICAgKiB0aGUgYnVmZmVyIHNpemUuICgge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fU05EQlVGfSApCiAgICAgICogCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMuIE11c3QgYmUgYXQgbGVhc3Qgb25lIGJ5dGUuCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgc2l6ZSBvciB0aGUgc2l6ZSBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQuCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFRoZSBzaXplIG11c3QgYmUgYXQgbGVhc3Qgb25lIGJ5dGUuCisgICAgICogQGV4Y2VwdGlvbiBTb2NrZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgb3B0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTZW5kQnVmZmVyU2l6ZShpbnQgc2l6ZSkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzaXplIDwgMSkgewpAQCAtNDcwLDE0ICs0OTYsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvY2tldCByZWNlaXZlIGJ1ZmZlciBzaXplLgorICAgICAqIFNldHMgdGhlIHNvY2tldCByZWNlaXZlIGJ1ZmZlciBzaXplLiBUaGlzIGJ1ZmZlciBzaXplIGRldGVybWluZXMgd2hpY2gKKyAgICAgKiB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBpcyB0aGF0IGNhbiBiZSByZWNlaXZlZCBvdmVyIHRoaXMgc29ja2V0LiBJdAorICAgICAqIGRlcGVuZHMgb24gdGhlIG5ldHdvcmsgaW1wbGVtZW50YXRpb24gd2hhdCB3aWxsIGhhcHBlbiBpZiB0aGUgcGFja2V0IGlzCisgICAgICogYmlnZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplLiAoIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX1JDVkJVRn0gKQogICAgICAqIAogICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHNpemUsIGluIGJ5dGVzLiBNdXN0IGJlIGF0IGxlYXN0IG9uZSBieXRlLgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIHNpemUgb3IgdGhlIHNpemUgaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkLgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBUaGUgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBieXRlLgorICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIG9wdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVjZWl2ZUJ1ZmZlclNpemUoaW50IHNpemUpCiAgICAgICAgICAgICB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKQEAgLTQ4OSwxNiArNTE3LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBTT19SQ1ZUSU1FT1VUIHRvIDxjb2RlPnRpbWVvdXQ8L2NvZGU+LCBpbiBtaWxsaXNlY29uZHMuIFRoZQotICAgICAqIHJlY2VpdmUgdGltZW91dCBkZWZpbmVzIHRoZSBwZXJpb2QgYSBzb2NrZXQgd2lsbCBibG9jayB3YWl0aW5nIHRvIHJlY2VpdmUKLSAgICAgKiBkYXRhLCBiZWZvcmUgdGhyb3dpbmcgYW4gSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi4KKyAgICAgKiBTZXRzIHRoZSB0aW1lb3V0IHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB7QGNvZGUgcmVjZWl2ZSgpfSBtZXRob2QuCisgICAgICogVGhpcyByZWNlaXZlIHRpbWVvdXQgZGVmaW5lcyB0aGUgcGVyaW9kIHRoZSBzb2NrZXQgd2lsbCBibG9jayB3YWl0aW5nIHRvCisgICAgICogcmVjZWl2ZSBkYXRhIGJlZm9yZSB0aHJvd2luZyBhbiB7QGNvZGUgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbn0uIFRoZSB2YWx1ZQorICAgICAqIHtAY29kZSAwfSAoZGVmYXVsdCkgaXMgdXNlZCB0byBzZXQgYW4gaW5maW5pdGUgdGltZW91dC4gVG8gaGF2ZSBlZmZlY3QKKyAgICAgKiB0aGlzIG9wdGlvbiBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGJsb2NraW5nIG1ldGhvZCB3YXMgY2FsbGVkLiAoIHtAY29kZQorICAgICAqIFNvY2tldE9wdGlvbnMuU09fVElNRU9VVH0gKQogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgdGltZW91dCBwZXJpb2QsIGluIG1pbGxpc2Vjb25kcwotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIHRpbWVvdXQgb3IgdGhlIHBlcmlvZAotICAgICAqICAgICAgICAgICAgICAgIGlzIGludmFsaWQuCisgICAgICogICAgICAgICAgICB0aGUgdGltZW91dCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzIG9yIHtAY29kZSAwfSBmb3IgaW5maW5pdGUuCisgICAgICogQGV4Y2VwdGlvbiBTb2NrZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgb3B0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTb1RpbWVvdXQoaW50IHRpbWVvdXQpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBpZiAodGltZW91dCA8IDApIHsKQEAgLTUwOSwxMyArNTM5LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBhcHBsaWNhdGlvbidzIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBmYWN0b3J5LiBUaGlzIG1heSBvbmx5Ci0gICAgICogYmUgaW52b2tlZCBvbmNlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiBTZXRzIHRoZSBzb2NrZXQgaW1wbGVtZW50YXRpb24gZmFjdG9yeS4gVGhpcyBtYXkgb25seSBiZSBpbnZva2VkIG9uY2UKKyAgICAgKiBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgYXBwbGljYXRpb24uIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZQorICAgICAqIGEgbmV3IGRhdGFncmFtIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4gSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIHNldCBpdHMKKyAgICAgKiBtZXRob2Qge0Bjb2RlIGNoZWNrU2V0RmFjdG9yeSgpfSBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgdGhlIG9wZXJhdGlvbiBpcworICAgICAqIGFsbG93ZWQuIEEge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufSBpcyB0aHJvd24gaWYgdGhlIG9wZXJhdGlvbiBpcyBub3QKKyAgICAgKiBhbGxvd2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmYWMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgZmFjdG9yeSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgZmFjdG9yeSB0byB1c2UuCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZmFjdG9yeSBoYXMgYWxyZWFkeSBiZWVuIHNldAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmYWN0b3J5IGhhcyBhbHJlYWR5IGJlZW4gc2V0LgorICAgICAqIEBzZWUgRGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeSgKICAgICAgICAgICAgIERhdGFncmFtU29ja2V0SW1wbEZhY3RvcnkgZmFjKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNTMwLDExICs1NjYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgRGF0YWdyYW1Tb2NrZXQgdXNpbmcgdGhlIHNwZWNpZmllZCBEYXRhZ3JhbVNvY2tldEltcGwuIFRoZQotICAgICAqIERhdGFncmFtU29ja2V0IGlzIG5vdCBib3VuZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRhZ3JhbVNvY2tldH0gdXNpbmcgdGhlIHNwZWNpZmljIGRhdGFncmFtCisgICAgICogc29ja2V0IGltcGxlbWVudGF0aW9uIHtAY29kZSBzb2NrZXRJbXBsfS4gVGhlIGNyZWF0ZWQge0Bjb2RlCisgICAgICogRGF0YWdyYW1Tb2NrZXR9IHdpbGwgbm90IGJlIGJvdW5kLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb2NrZXRJbXBsCi0gICAgICogICAgICAgICAgICB0aGUgRGF0YWdyYW1Tb2NrZXRJbXBsIHRvIHVzZQorICAgICAqICAgICAgICAgICAgdGhlIERhdGFncmFtU29ja2V0SW1wbCB0byB1c2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFncmFtU29ja2V0KERhdGFncmFtU29ja2V0SW1wbCBzb2NrZXRJbXBsKSB7CiAgICAgICAgIGlmIChzb2NrZXRJbXBsID09IG51bGwpIHsKQEAgLTU0NCwxNiArNTgyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIERhdGFncmFtU29ja2V0IGJvdW5kIHRvIHRoZSBob3N0L3BvcnQgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIFNvY2tldEFkZHJlc3MsIG9yIGFuIHVuYm91bmQgRGF0YWdyYW1Tb2NrZXQgaWYgdGhlIFNvY2tldEFkZHJlc3MgaXMgbnVsbC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRhZ3JhbVNvY2tldH0gYm91bmQgdG8gdGhlIGhvc3QvcG9ydCBzcGVjaWZpZWQKKyAgICAgKiBieSB0aGUge0Bjb2RlIFNvY2tldEFkZHJlc3N9IHtAY29kZSBsb2NhbEFkZHJ9IG9yIGFuIHVuYm91bmQge0Bjb2RlCisgICAgICogRGF0YWdyYW1Tb2NrZXR9IGlmIHRoZSB7QGNvZGUgU29ja2V0QWRkcmVzc30gaXMge0Bjb2RlIG51bGx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbEFkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtYWNoaW5lIGFkZHJlc3MgYW5kIHBvcnQgdG8gYmluZCB0bwotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIFNvY2tldEFkZHJlc3MgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG1hY2hpbmUgYWRkcmVzcyBhbmQgcG9ydCB0byBiaW5kIHRvLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBjcmVhdGluZyBvciBiaW5kaW5nIHRoZSBzb2NrZXQKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGNyZWF0aW5nIG9yIGJpbmRpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YWdyYW1Tb2NrZXQoU29ja2V0QWRkcmVzcyBsb2NhbEFkZHIpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBpZiAobG9jYWxBZGRyICE9IG51bGwpIHsKQEAgLTU5MCwxNiArNjI3LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmluZCB0aGUgRGF0YWdyYW1Tb2NrZXQgdG8gdGhlIG5vbWluYXRlZCBsb2NhbCBob3N0L3BvcnQuCisgICAgICogQmluZHMgdGhpcyBzb2NrZXQgdG8gdGhlIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQgc3BlY2lmaWVkIGJ5IHtAY29kZQorICAgICAqIGxvY2FsQWRkcn0uIElmIHRoaXMgdmFsdWUgaXMge0Bjb2RlIG51bGx9IGFueSBmcmVlIHBvcnQgb24gYSB2YWxpZCBsb2NhbAorICAgICAqIGFkZHJlc3MgaXMgdXNlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYWxBZGRyCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYWwgbWFjaGluZSBhZGRyZXNzIGFuZCBwb3J0IHRvIGJpbmQgb24KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBTb2NrZXRBZGRyZXNzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtYWNoaW5lIGFkZHJlc3MgYW5kIHBvcnQgdG8gYmluZCBvbi4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBib3VuZCwgb3IgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgYmluZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBib3VuZCBvciBhIHByb2JsZW0gb2NjdXJzIGR1cmluZworICAgICAqICAgICAgICAgICAgIGJpbmRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZChTb2NrZXRBZGRyZXNzIGxvY2FsQWRkcikgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC02MjQsMTUgKzY2MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbm5lY3QgdGhlIGRhdGFncmFtIHNvY2tldCB0byBhIHJlbW90ZSBob3N0IGFuZCBwb3J0LiBUaGUgaG9zdCBhbmQgcG9ydAotICAgICAqIGFyZSB2YWxpZGF0ZWQsIHRoZXJlYWZ0ZXIgdGhlIG9ubHkgdmFsaWRhdGlvbiBvbiBzZW5kKCkgYW5kIHJlY2VpdmUoKSBpcwotICAgICAqIHRoYXQgdGhlIHBhY2tldCBhZGRyZXNzL3BvcnQgbWF0Y2hlcyB0aGUgY29ubmVjdGVkIHRhcmdldC4KKyAgICAgKiBDb25uZWN0cyB0aGlzIGRhdGFncmFtIHNvY2tldCB0byB0aGUgcmVtb3RlIGhvc3QgYW5kIHBvcnQgc3BlY2lmaWVkIGJ5CisgICAgICoge0Bjb2RlIHJlbW90ZUFkZHJ9LiBUaGUgaG9zdCBhbmQgcG9ydCBhcmUgdmFsaWRhdGVkLCB0aGVyZWFmdGVyIHRoZSBvbmx5CisgICAgICogdmFsaWRhdGlvbiBvbiB7QGNvZGUgc2VuZCgpfSBhbmQge0Bjb2RlIHJlY2VpdmUoKX0gaXMgdGhhdCB0aGUgcGFja2V0CisgICAgICogYWRkcmVzcy9wb3J0IG1hdGNoZXMgdGhlIGNvbm5lY3RlZCB0YXJnZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlbW90ZUFkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgYWRkcmVzcyBhbmQgcG9ydAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIHRhcmdldCBob3N0LgogICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgdGhlIGNvbm5lY3QKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGNvbm5lY3RpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIHJlbW90ZUFkZHIpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBpZiAocmVtb3RlQWRkciA9PSBudWxsKSB7CkBAIC02ODEsMzAgKzcxOSwzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBpZiB0aGUgc29ja2V0IGlzIGJvdW5kIHRvIGEgbG9jYWwgYWRkcmVzcyBhbmQgcG9ydC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBib3VuZCB0byBhbiBhZGRyZXNzIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzb2NrZXQgaXMgYm91bmQgdG8gYSBsb2NhbCBhZGRyZXNzLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc29ja2V0IGlzIGJvdW5kLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0JvdW5kKCkgewogICAgICAgICByZXR1cm4gaXNCb3VuZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gaWYgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IGhvc3QuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewogICAgICAgICByZXR1cm4gaXNDb25uZWN0ZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSByZW1vdGUgU29ja2V0QWRkcmVzcyBmb3IgdGhpcyBzb2NrZXQsIG9yIG51bGwgaWYgdGhlIHNvY2tldCBpcwotICAgICAqIG5vdCBjb25uZWN0ZWQuCisgICAgICogR2V0cyB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgY29ubmVjdGVkIHJlbW90ZSBob3N0LiBJZiB0aGlzIHNvY2tldCBpcworICAgICAqIG5vdCBjb25uZWN0ZWQgeWV0LCB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVtb3RlIHNvY2tldCBhZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgcmVtb3RlIHNvY2tldCBhZGRyZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSB7CiAgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgewpAQCAtNzE0LDEyICs3NTMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGxvY2FsIFNvY2tldEFkZHJlc3MgZm9yIHRoaXMgc29ja2V0LCBvciBudWxsIGlmIHRoZSBzb2NrZXQgaXMKLSAgICAgKiBub3QgYm91bmQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyB1c2VmdWwgb24gbXVsdGlob21lZCBob3N0cy4KKyAgICAgKiBHZXRzIHRoZSBib3VuZCBsb2NhbCBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoaXMgc29ja2V0LiBJZiB0aGUgc29ja2V0IGlzCisgICAgICogdW5ib3VuZCwge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHNvY2tldCBhZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgbG9jYWwgc29ja2V0IGFkZHJlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldEFkZHJlc3MgZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkgewogICAgICAgICBpZiAoIWlzQm91bmQoKSkgewpAQCAtNzI5LDEzICs3NjcsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIFNPX1JFVVNFQUREUiBzb2NrZXQgb3B0aW9uLgorICAgICAqIFNldHMgdGhlIHNvY2tldCBvcHRpb24ge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fUkVVU0VBRERSfS4gVGhpcyBvcHRpb24KKyAgICAgKiBoYXMgdG8gYmUgZW5hYmxlZCBpZiBtb3JlIHRoYW4gb25lIFVEUCBzb2NrZXQgd2FudHMgdG8gYmUgYm91bmQgdG8gdGhlCisgICAgICogc2FtZSBhZGRyZXNzLiBUaGF0IGNvdWxkIGJlIG5lZWRlZCBmb3IgcmVjZWl2aW5nIG11bHRpY2FzdCBwYWNrZXRzLgorICAgICAqIDxwPgorICAgICAqIFRoZXJlIGlzIGFuIHVuZGVmaW5lZCBiZWhhdmlvciBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgYWZ0ZXIgdGhlIHNvY2tldCBpcworICAgICAqIGFscmVhZHkgYm91bmQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSByZXVzZQotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBTT19SRVVTRUFERFIgb3B0aW9uIHNldHRpbmcKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgb3B0aW9uIHZhbHVlIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMgb3B0aW9uLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgb3IgdGhlIG9wdGlvbiBpcyBpbnZhbGlkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkIG9yIHRoZSBvcHRpb24gY291bGQgbm90IGJlIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbiByZXVzZSkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC03NDQsMTMgKzc4OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIFNPX1JFVVNFQUREUiBzb2NrZXQgb3B0aW9uLgorICAgICAqIEdldHMgdGhlIHN0YXRlIG9mIHRoZSBzb2NrZXQgb3B0aW9uIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX1JFVVNFQUREUn0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgU09fUkVVU0VBRERSIGlzIGVuYWJsZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcHRpb24gaXMgZW5hYmxlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBvciB0aGUgb3B0aW9uIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0UmV1c2VBZGRyZXNzKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC03NTksMTMgKzgwMiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgU09fQlJPQURDQVNUIHNvY2tldCBvcHRpb24uCisgICAgICogU2V0cyB0aGUgc29ja2V0IG9wdGlvbiB7QGNvZGUgU29ja2V0T3B0aW9ucy5TT19CUk9BRENBU1R9LiBUaGlzIG9wdGlvbgorICAgICAqIG11c3QgYmUgZW5hYmxlZCB0byBzZW5kIGJyb2FkY2FzdCBtZXNzYWdlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnJvYWRjYXN0Ci0gICAgICogICAgICAgICAgICB0aGUgc29ja2V0IFNPX0JST0FEQ0FTVCBvcHRpb24gc2V0dGluZwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBvcHRpb24gdmFsdWUgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBvcHRpb24uCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBvciB0aGUgb3B0aW9uIGlzIGludmFsaWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgb3IgdGhlIG9wdGlvbiBjb3VsZCBub3QgYmUgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJyb2FkY2FzdChib29sZWFuIGJyb2FkY2FzdCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC03NzQsMTMgKzgxOCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIFNPX0JST0FEQ0FTVCBzb2NrZXQgb3B0aW9uLgorICAgICAqIEdldHMgdGhlIHN0YXRlIG9mIHRoZSBzb2NrZXQgb3B0aW9uIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX0JST0FEQ0FTVH0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgU09fQlJPQURDQVNUIGlzIGVuYWJsZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcHRpb24gaXMgZW5hYmxlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBvciB0aGUgb3B0aW9uIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QnJvYWRjYXN0KCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC03ODksMTMgKzgzMiwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgSVBfVE9TIHNvY2tldCBvcHRpb24uCisgICAgICogU2V0cyB0aGUgc29ja2V0IG9wdGlvbiB7QGNvZGUgU29ja2V0T3B0aW9ucy5JUF9UT1N9LiBUaGlzIG9wdGlvbiBkZWZpbmVzCisgICAgICogdGhlIHZhbHVlIG9mIHRoZSB0eXBlLW9mLXNlcnZpY2UgZmllbGQgb2YgdGhlIElQLWhlYWRlciBmb3IgZXZlcnkgcGFja2V0CisgICAgICogc2VudCBieSB0aGlzIHNvY2tldC4gVGhlIHZhbHVlIGNvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIHVuZGVybHlpbmcgbmV0d29yaworICAgICAqIGltcGxlbWVudGF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFZhbHVlcyBiZXR3ZWVuIHtAY29kZSAwfSBhbmQge0Bjb2RlIDI1NX0gaW5jbHVzaXZlIGFyZSB2YWxpZCBmb3IgdGhpcworICAgICAqIG9wdGlvbi4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgc29ja2V0IElQX1RPUyBzZXR0aW5nCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc29ja2V0IG9wdGlvbiB2YWx1ZSB0byBiZSBzZXQgYXMgdHlwZS1vZi1zZXJ2aWNlLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgb3IgdGhlIG9wdGlvbiBpcyBpbnZhbGlkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkIG9yIHRoZSBvcHRpb24gY291bGQgbm90IGJlIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUcmFmZmljQ2xhc3MoaW50IHZhbHVlKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKGZhbHNlKTsKQEAgLTgwNiwxMiArODU2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBJUF9UT1Mgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZS1vZi1zZXJ2aWNlIHNvY2tldCBvcHRpb24ge0Bjb2RlCisgICAgICogU29ja2V0T3B0aW9ucy5JUF9UT1N9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIElQX1RPUyBzb2NrZXQgb3B0aW9uIHZhbHVlCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgdHlwZS1vZi1zZXJ2aWNlIHNvY2tldCBvcHRpb24gdmFsdWUuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW9uIGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBvciB0aGUgb3B0aW9uIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUcmFmZmljQ2xhc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKGZhbHNlKTsKQEAgLTgxOSwyMCArODcwLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkLgorICAgICAqIEdldHMgdGhlIHN0YXRlIG9mIHRoaXMgc29ja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKICAgICAgICAgcmV0dXJuIGlzQ2xvc2VkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIGlmIERhdGFncmFtU29ja2V0IGlzIGNyZWF0ZWQgYnkgYSBEYXRhZ3JhbUNoYW5uZWwsIHJldHVybnMgdGhlIHJlbGF0ZWQKLSAgICAgKiBEYXRhZ3JhbUNoYW5uZWwKKyAgICAgKiBHZXRzIHRoZSByZWxhdGVkIERhdGFncmFtQ2hhbm5lbCBvZiB0aGlzIHNvY2tldC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJldHVybnMgYWx3YXlzIHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWxhdGVkIERhdGFncmFtQ2hhbm5lbCBpZiBhbnkKKyAgICAgKiBAcmV0dXJuIHRoZSByZWxhdGVkIERhdGFncmFtQ2hhbm5lbCBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcyBzb2NrZXQgd2FzCisgICAgICogICAgICAgICBub3QgY3JlYXRlZCBieSBhIHtAY29kZSBEYXRhZ3JhbUNoYW5uZWx9IG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YWdyYW1DaGFubmVsIGdldENoYW5uZWwoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0RhdGFncmFtU29ja2V0SW1wbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0RhdGFncmFtU29ja2V0SW1wbC5qYXZhCmluZGV4IGYyNmU4OTEuLjc5MTUxNTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldEltcGwuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXRJbXBsLmphdmEKQEAgLTI0LDYyICsyNCw4NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtOwogCiAvKioKLSAqIFRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGRhdGFncmFtICYgbXVsdGljYXN0IHNvY2tldCBpbXBsZW1lbnRhdGlvbnMuCisgKiBUaGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgZGF0YWdyYW0gYW5kIG11bHRpY2FzdCBzb2NrZXQgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFncmFtU29ja2V0SW1wbCBpbXBsZW1lbnRzIFNvY2tldE9wdGlvbnMgewogCisgICAgLyoqCisgICAgICogRmlsZSBkZXNjcmlwdG9yIHRoYXQgaXMgdXNlZCB0byBhZGRyZXNzIHRoaXMgc29ja2V0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBGaWxlRGVzY3JpcHRvciBmZDsKIAorICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHBvcnQgdG8gd2hpY2ggdGhpcyBzb2NrZXQgaXMgYm91bmQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBsb2NhbFBvcnQ7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIHVuYm91bmQgZGF0YWdyYW0gc29ja2V0IGltcGxlbWVudGF0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRhZ3JhbVNvY2tldEltcGwoKSB7CiAgICAgICAgIGxvY2FsUG9ydCA9IC0xOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJpbmQgdGhlIGRhdGFncmFtIHNvY2tldCB0byB0aGUgbm9taW5hdGVkIGxvY2FsaG9zdC9wb3J0LiBTb2NrZXRzIG11c3QgYmUKKyAgICAgKiBCaW5kcyB0aGUgZGF0YWdyYW0gc29ja2V0IHRvIHRoZSBnaXZlbiBsb2NhbGhvc3QvcG9ydC4gU29ja2V0cyBtdXN0IGJlCiAgICAgICogYm91bmQgcHJpb3IgdG8gYXR0ZW1wdGluZyB0byBzZW5kIG9yIHJlY2VpdmUgZGF0YS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb24gdGhlIGxvY2FsaG9zdCB0byBiaW5kCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWxob3N0IHRvIGJpbmQuCiAgICAgICogQHBhcmFtIGFkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIG9uIHRoZSBtdWx0aWhvbWVkIGxvY2FsaG9zdCB0byBiaW5kCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvbiB0aGUgbXVsdGlob21lZCBsb2NhbGhvc3QgdG8gYmluZC4KICAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBiaW5kLCBzdWNoIGFzIGlmIHRoZSBwb3J0IHdhcwotICAgICAqICAgICAgICAgICAgICAgIGFscmVhZHkgYm91bmQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYmluZGluZywgZm9yIGV4YW1wbGUsIGlmIHRoZSBwb3J0CisgICAgICogICAgICAgICAgICAgICAgaGFzIGJlZW4gYWxyZWFkeSBib3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBiaW5kKGludCBwb3J0LCBJbmV0QWRkcmVzcyBhZGRyKQogICAgICAgICAgICAgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBzb2NrZXQuCisgICAgICogQ2xvc2VzIHRoaXMgc29ja2V0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNsb3NlKCk7CiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBhbGxvY2F0ZXMgdGhlIHNvY2tldCBkZXNjcmlwdG9yIGluIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZwogICAgICAqIHN5c3RlbS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIEZpbGVEZXNjcmlwdG9yLCB3aGljaCB3aWxsIGJlIGludmFsaWQgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQKLSAgICAgKiBvciBub3QgYm91bmQuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIEZpbGVEZXNjcmlwdG9yfSBvZiB0aGlzIGRhdGFncmFtIHNvY2tldCwgd2hpY2ggaXMgaW52YWxpZAorICAgICAqIGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkIG9yIG5vdCBib3VuZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEZpbGVEZXNjcmlwdG9yIHRoZSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBmaWxlIGRlc2NyaXB0b3Igb2YgdGhpcyBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEZpbGVEZXNjcmlwdG9yIGdldEZpbGVEZXNjcmlwdG9yKCkgewogICAgICAgICByZXR1cm4gZmQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBsb2NhbCBhZGRyZXNzIHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgYm91bmQuCisgICAgICogR2V0cyB0aGUgbG9jYWwgYWRkcmVzcyB0byB3aGljaCB0aGUgc29ja2V0IGlzIGJvdW5kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gSW5ldEFkZHJlc3MgdGhlIGxvY2FsIGFkZHJlc3MgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBib3VuZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBhZGRyZXNzIHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgYm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkgewogICAgICAgICByZXR1cm4gUGxhdGZvcm0uZ2V0TmV0d29ya1N5c3RlbSgpLmdldFNvY2tldExvY2FsQWRkcmVzcyhmZCwKQEAgLTg3LDE3MCArMTA5LDIwNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgbG9jYWwgcG9ydC4gSWYgdGhlIHNvY2tldCB3YXMgYm91bmQgdG8gYW55IGF2YWlsYWJsZSBwb3J0LCBhcwotICAgICAqIGZsYWdnZWQgYnkgYSA8Y29kZT5sb2NhbFBvcnQ8L2NvZGU+IHZhbHVlIG9mIC0xLCBxdWVyeSB0aGUgSVAgc3RhY2suCisgICAgICogR2V0cyB0aGUgbG9jYWwgcG9ydCBvZiB0aGlzIHNvY2tldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgbG9jYWwgcG9ydCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGJvdW5kLgorICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgdG8gd2hpY2ggdGhpcyBzb2NrZXQgaXMgYm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBnZXRMb2NhbFBvcnQoKSB7CiAgICAgICAgIHJldHVybiBsb2NhbFBvcnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBub21pbmF0ZWQgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBzb2NrZXQgb3B0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcHRJRAotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBvcHRpb24gdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIE9iamVjdCB0aGUgb3B0aW9uIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdGhlIHNvY2tldCBvcHRpb24gdG8gYmUgcmV0cmlldmVkLgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBvcHRpb24gdmFsdWUuCiAgICAgICogQGV4Y2VwdGlvbiBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3B0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3B0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0T3B0aW9uKGludCBvcHRJRCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgdGltZS10by1saXZlIChUVEwpIGZvciBtdWx0aWNhc3QgcGFja2V0cyBzZW50IG9uIHRoaXMgc29ja2V0LgorICAgICAqIEdldHMgdGhlIHRpbWUtdG8tbGl2ZSAoVFRMKSBmb3IgbXVsdGljYXN0IHBhY2tldHMgc2VudCBvbiB0aGlzIHNvY2tldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LkluZXRBZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgdGltZS10by1saXZlIG9wdGlvbiBhcyBhIGJ5dGUgdmFsdWUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdldHRpbmcgdGhlIHRpbWUtdG8tbGl2ZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgICB2YWx1ZS4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSB7QGxpbmsgI2dldFRpbWVUb0xpdmV9CiAgICAgICogQHNlZSAjZ2V0VGltZVRvTGl2ZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZSBnZXRUVEwoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHRpbWUtdG8tbGl2ZSAoVFRMKSBmb3IgbXVsdGljYXN0IHBhY2tldHMgc2VudCBvbiB0aGlzIHNvY2tldC4KKyAgICAgKiBHZXRzIHRoZSB0aW1lLXRvLWxpdmUgKFRUTCkgZm9yIG11bHRpY2FzdCBwYWNrZXRzIHNlbnQgb24gdGhpcyBzb2NrZXQuCisgICAgICogVGhlIFRUTCBvcHRpb24gZGVmaW5lcyBob3cgbWFueSByb3V0ZXJzIGEgcGFja2V0IG1heSBiZSBwYXNzIGJlZm9yZSBpdCBpcworICAgICAqIGRpc2NhcmRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludAorICAgICAqIEByZXR1cm4gdGhlIHRpbWUtdG8tbGl2ZSBvcHRpb24gYXMgYW4gaW50ZWdlciB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2V0dGluZyB0aGUgdGltZS10by1saXZlIG9wdGlvbgorICAgICAqICAgICAgICAgICAgIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0VGltZVRvTGl2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFkZCB0aGlzIHNvY2tldCB0byB0aGUgbXVsdGljYXN0IGdyb3VwLiBBIHNvY2tldCBtdXN0IGpvaW4gYSBncm91cCBiZWZvcmUKLSAgICAgKiBkYXRhIG1heSBiZSByZWNlaXZlZC4gQSBzb2NrZXQgbWF5IGJlIGEgbWVtYmVyIG9mIG11bHRpcGxlIGdyb3VwcyBidXQgbWF5Ci0gICAgICogam9pbiBhbnkgZ3JvdXAgb25jZS4KKyAgICAgKiBBZGRzIHRoaXMgc29ja2V0IHRvIHRoZSBtdWx0aWNhc3QgZ3JvdXAge0Bjb2RlIGFkZHJ9LiBBIHNvY2tldCBtdXN0IGpvaW4KKyAgICAgKiBhIGdyb3VwIGJlZm9yZSBiZWluZyBhYmxlIHRvIHJlY2VpdmUgZGF0YS4gRnVydGhlciwgYSBzb2NrZXQgbWF5IGJlIGEKKyAgICAgKiBtZW1iZXIgb2YgbXVsdGlwbGUgZ3JvdXBzIGJ1dCBtYXkgam9pbiBhbnkgZ3JvdXAgb25seSBvbmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICB0aGUgbXVsdGljYXN0IGdyb3VwIHRvIGJlIGpvaW5lZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biB3aGlsZSBqb2luaW5nIGEgZ3JvdXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aWNhc3QgZ3JvdXAgdG8gd2hpY2ggdGhpcyBzb2NrZXQgaGFzIHRvIGJlIGpvaW5lZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGpvaW5pbmcgdGhlIHNwZWNpZmllZCBtdWx0aWNhc3QKKyAgICAgKiAgICAgICAgICAgICBncm91cC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBqb2luKEluZXRBZGRyZXNzIGFkZHIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFkZCB0aGlzIHNvY2tldCB0byB0aGUgbXVsdGljYXN0IGdyb3VwLiBBIHNvY2tldCBtdXN0IGpvaW4gYSBncm91cCBiZWZvcmUKLSAgICAgKiBkYXRhIG1heSBiZSByZWNlaXZlZC4gQSBzb2NrZXQgbWF5IGJlIGEgbWVtYmVyIG9mIG11bHRpcGxlIGdyb3VwcyBidXQgbWF5Ci0gICAgICogam9pbiBhbnkgZ3JvdXAgb25jZS4KKyAgICAgKiBBZGRzIHRoaXMgc29ja2V0IHRvIHRoZSBtdWx0aWNhc3QgZ3JvdXAge0Bjb2RlIGFkZHJ9LiBBIHNvY2tldCBtdXN0IGpvaW4KKyAgICAgKiBhIGdyb3VwIGJlZm9yZSBiZWluZyBhYmxlIHRvIHJlY2VpdmUgZGF0YS4gRnVydGhlciwgYSBzb2NrZXQgbWF5IGJlIGEKKyAgICAgKiBtZW1iZXIgb2YgbXVsdGlwbGUgZ3JvdXBzIGJ1dCBtYXkgam9pbiBhbnkgZ3JvdXAgb25seSBvbmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICB0aGUgbXVsdGljYXN0IGdyb3VwIHRvIGJlIGpvaW5lZAorICAgICAqICAgICAgICAgICAgdGhlIG11bHRpY2FzdCBncm91cCB0byB3aGljaCB0aGlzIHNvY2tldCBoYXMgdG8gYmUgam9pbmVkLgogICAgICAqIEBwYXJhbSBuZXRJbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0aGUgYWRkcmVzc2VzIHNob3VsZCBiZSBkcm9wcGVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIHdoaWxlIGpvaW5pbmcgYSBncm91cAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG5ldHdvcmsgaW50ZXJmYWNlIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgbXVsdGljYXN0CisgICAgICogICAgICAgICAgICBkYXRhZ3JhbSBwYWNrZXRzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgam9pbmluZyB0aGUgc3BlY2lmaWVkIG11bHRpY2FzdAorICAgICAqICAgICAgICAgICAgIGdyb3VwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGpvaW5Hcm91cChTb2NrZXRBZGRyZXNzIGFkZHIsCiAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIG5ldEludGVyZmFjZSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBzb2NrZXQgZnJvbSB0aGUgbXVsdGljYXN0IGdyb3VwLgorICAgICAqIFJlbW92ZXMgdGhpcyBzb2NrZXQgZnJvbSB0aGUgbXVsdGljYXN0IGdyb3VwIHtAY29kZSBhZGRyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcgotICAgICAqICAgICAgICAgICAgdGhlIG11bHRpY2FzdCBncm91cCB0byBiZSBsZWZ0Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBNYXkgYmUgdGhyb3duIHdoaWxlIGxlYXZpbmcgdGhlIGdyb3VwCisgICAgICogICAgICAgICAgICB0aGUgbXVsdGljYXN0IGdyb3VwIHRvIGJlIGxlZnQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsZWF2aW5nIHRoZSBncm91cCBvciBubyBtdWx0aWNhc3QKKyAgICAgKiAgICAgICAgICAgICBhZGRyZXNzIHdhcyBhc3NpZ25lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsZWF2ZShJbmV0QWRkcmVzcyBhZGRyKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIHNvY2tldCBmcm9tIHRoZSBtdWx0aWNhc3QgZ3JvdXAuCisgICAgICogUmVtb3ZlcyB0aGlzIHNvY2tldCBmcm9tIHRoZSBtdWx0aWNhc3QgZ3JvdXAge0Bjb2RlIGFkZHJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICB0aGUgbXVsdGljYXN0IGdyb3VwIHRvIGJlIGxlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aWNhc3QgZ3JvdXAgdG8gYmUgbGVmdC4KICAgICAgKiBAcGFyYW0gbmV0SW50ZXJmYWNlCi0gICAgICogICAgICAgICAgICB0aGUgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGFkZHJlc3NlcyBzaG91bGQgYmUgZHJvcHBlZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gTWF5IGJlIHRocm93biB3aGlsZSBsZWF2aW5nIHRoZSBncm91cAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRoaXMgc29ja2V0IGhhcyB0byBiZQorICAgICAqICAgICAgICAgICAgcmVtb3ZlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGxlYXZpbmcgdGhlIGdyb3VwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxlYXZlR3JvdXAoU29ja2V0QWRkcmVzcyBhZGRyLAogICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXRJbnRlcmZhY2UpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFBlZWsgYXQgdGhlIGluY29taW5nIHBhY2tldCB0byB0aGlzIHNvY2tldCBhbmQgYW5zd2VyIHRoZSBzZW5kZXIncwotICAgICAqIGFkZHJlc3MgaW50byA8Y29kZT5zZW5kZXI8L2NvZGU+LiBUaGUgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgYSBwYWNrZXQKLSAgICAgKiBpcyByZWNlaXZlZCBvciB0aW1lb3V0IGV4cGlyZXMgYW5kIHJldHVybnMgdGhlIHNlbmRlcidzIHBvcnQuCisgICAgICogUGVla3MgYXQgdGhlIGluY29taW5nIHBhY2tldCB0byB0aGlzIHNvY2tldCBhbmQgcmV0dXJucyB0aGUgYWRkcmVzcyBvZgorICAgICAqIHRoZSB7QGNvZGUgc2VuZGVyfS4gVGhlIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIGEgcGFja2V0IGlzIHJlY2VpdmVkIG9yCisgICAgICogdGltZW91dCBleHBpcmVzLgogICAgICAqIAorICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW4gYWRkcmVzcyBvZiBhIHBhY2tldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHtAY29kZSBzZW5kZXJ9IGFzIGFuIGludGVnZXIgdmFsdWUuCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGEgcmVhZCBlcnJvciBvciB0aW1lb3V0IG9jY3VycworICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9yIGEgdGltZW91dCBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgYWRkcmVzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBlZWsoSW5ldEFkZHJlc3Mgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWNlaXZlIGRhdGEgaW50byB0aGUgc3VwcGxpZWQgZGF0YWdyYW0gcGFja2V0LiBUaGlzIGNhbGwgd2lsbCBibG9jawotICAgICAqIHVudGlsIGVpdGhlciBkYXRhIGlzIHJlY2VpdmVkIG9yLCBpZiBhIHRpbWVvdXQgaXMgc2V0LCB0aGUgdGltZW91dAotICAgICAqIGV4cGlyZXMuIElmIHRoZSB0aW1lb3V0IGV4cGlyZXMsIHRoZSBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBSZWNlaXZlcyBkYXRhIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHN1cHBsaWVkIGRhdGFncmFtIHBhY2tldCB7QGNvZGUgcGFja30uCisgICAgICogVGhpcyBjYWxsIHdpbGwgYmxvY2sgdW50aWwgZWl0aGVyIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgb3IsIGlmIGEgdGltZW91dAorICAgICAqIGlzIHNldCwgdGhlIHRpbWVvdXQgaGFzIGV4cGlyZWQuIElmIHRoZSB0aW1lb3V0IGV4cGlyZXMgYW4ge0Bjb2RlCisgICAgICogSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbn0gaXMgdGhyb3duLgogICAgICAqIAorICAgICAqIEBwYXJhbSBwYWNrCisgICAgICogICAgICAgICAgICB0aGUgZGF0YWdyYW0gcGFja2V0IGNvbnRhaW5lciB0byBmaWxsIGluIHRoZSByZWNlaXZlZCBkYXRhLgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhIHJlYWQgZXJyb3Igb3IgdGltZW91dCBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvciB0aW1lb3V0IG9jY3VycyB3aGlsZSByZWNlaXZpbmcgZGF0YS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWNlaXZlKERhdGFncmFtUGFja2V0IHBhY2spIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNlbmRzIHRoZSBzdXBwbGllZCBkYXRhZ3JhbSBwYWNrZXQuIFRoZSBwYWNrZXQgY29udGFpbnMgdGhlIGRlc3RpbmF0aW9uCi0gICAgICogaG9zdCAmIHBvcnQuCisgICAgICogU2VuZHMgdGhlIGdpdmVuIGRhdGFncmFtIHBhY2tldCB7QGNvZGUgcGFja30uIFRoZSBwYWNrZXQgY29udGFpbnMgdGhlCisgICAgICogZGF0YSBhbmQgdGhlIGFkZHJlc3MgYW5kIHBvcnQgaW5mb3JtYXRpb24gb2YgdGhlIHRhcmdldCBob3N0IGFzIHdlbGwuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhY2sKLSAgICAgKiAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHRvIHNlbmQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhZ3JhbSBwYWNrZXQgdG8gYmUgc2VudC4KICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYSB3cml0ZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNlbmQoRGF0YWdyYW1QYWNrZXQgcGFjaykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBub21pbmF0ZWQgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBzb2NrZXQgb3B0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcHRJRAotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBvcHRpb24gdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdGhlIHNvY2tldCBvcHRpb24gdG8gYmUgc2V0LgogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBvcHRpb24gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLgogICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgb3B0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9wdGlvbihpbnQgb3B0SUQsIE9iamVjdCB2YWwpCiAgICAgICAgICAgICB0aHJvd3MgU29ja2V0RXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB0aW1lLXRvLWxpdmUgKFRUTCkgZm9yIG11bHRpY2FzdCBwYWNrZXRzIHNlbnQgb24gdGhpcyBzb2NrZXQuCisgICAgICogU2V0cyB0aGUgdGltZS10by1saXZlIChUVEwpIG9wdGlvbiBmb3IgbXVsdGljYXN0IHBhY2tldHMgc2VudCBvbiB0aGlzCisgICAgICogc29ja2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0dGwKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lLXRvLWxpdmUsIDAgJmx0OyB0dGwgJmx0Oz0gMjU1Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRocm93biB3aGlsZSBzZXR0aW5nIHRoZSBUVEwKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lLXRvLWxpdmUgb3B0aW9uIHZhbHVlLiBWYWxpZCB2YWx1ZXMgYXJlIDAgJmx0OyB0dGwKKyAgICAgKiAgICAgICAgICAgICZsdDs9IDI1NS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIG9wdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRUaW1lVG9MaXZlKGludCB0dGwpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdGltZS10by1saXZlIChUVEwpIGZvciBtdWx0aWNhc3QgcGFja2V0cyBzZW50IG9uIHRoaXMgc29ja2V0LgorICAgICAqIFNldHMgdGhlIHRpbWUtdG8tbGl2ZSAoVFRMKSBvcHRpb24gZm9yIG11bHRpY2FzdCBwYWNrZXRzIHNlbnQgb24gdGhpcworICAgICAqIHNvY2tldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHRsCi0gICAgICogICAgICAgICAgICB0aGUgdGltZS10by1saXZlLCAwICZsdDsgdHRsICZsdDs9IDI1NQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aHJvd24gd2hpbGUgc2V0dGluZyB0aGUgVFRMCisgICAgICogICAgICAgICAgICB0aGUgdGltZS10by1saXZlIG9wdGlvbiB2YWx1ZS4gVmFsaWQgdmFsdWVzIGFyZSAwICZsdDsgdHRsCisgICAgICogICAgICAgICAgICAmbHQ7PSAyNTUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBvcHRpb24uCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkge0BsaW5rICNzZXRUaW1lVG9MaXZlfQogICAgICAqIEBzZWUgI3NldFRpbWVUb0xpdmUoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VFRMKGJ5dGUgdHRsKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDb25uZWN0IHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgYWRkcmVzcyBhbmQgcG9ydC4KKyAgICAgKiBDb25uZWN0cyB0aGlzIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBhZGRyZXNzIGFuZCBwb3J0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmV0QWRkcgotICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBhZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGhvc3Qgd2hpY2ggaGFzIHRvIGJlIGNvbm5lY3RlZC4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBwb3J0Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgdGFyZ2V0IGhvc3Qgd2hpY2ggaGFzIHRvIGJlIGNvbm5lY3RlZC4KICAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHBvc3NpYmx5IHRocm93biwgaWYgdGhlIGRhdGFncmFtIHNvY2tldCBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgYWRkcmVzcyBhbmQgcG9ydAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBkYXRhZ3JhbSBzb2NrZXQgY2Fubm90IGJlIGNvbm5lY3RlZCB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgcmVtb3RlIGFkZHJlc3MgYW5kIHBvcnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgY29ubmVjdChJbmV0QWRkcmVzcyBpbmV0QWRkciwgaW50IHBvcnQpCiAgICAgICAgICAgICB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKQEAgLTI1OCwyNiArMzE3LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzY29ubmVjdCB0aGUgc29ja2V0IGZyb20gdGhlIHJlbW90ZSBhZGRyZXNzIGFuZCBwb3J0LgorICAgICAqIERpc2Nvbm5lY3RzIHRoaXMgc29ja2V0IGZyb20gdGhlIHJlbW90ZSBob3N0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGRpc2Nvbm5lY3QoKSB7CiAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWNlaXZlIGRhdGEgaW50byB0aGUgc3VwcGxpZWQgZGF0YWdyYW0gcGFja2V0IGJ5IHBlZWtpbmcuIFRoZSBkYXRhIGlzCi0gICAgICogbm90IHJlbW92ZWQgYW5kIHdpbGwgYmUgcmVjZWl2ZWQgYnkgYW5vdGhlciBwZWVrRGF0YSgpIG9yIHJlY2VpdmUoKSBjYWxsLgotICAgICAqIAotICAgICAqIFRoaXMgY2FsbCB3aWxsIGJsb2NrIHVudGlsIGVpdGhlciBkYXRhIGlzIHJlY2VpdmVkIG9yLCBpZiBhIHRpbWVvdXQgaXMKLSAgICAgKiBzZXQsIHRoZSB0aW1lb3V0IGV4cGlyZXMuCisgICAgICogUmVjZWl2ZXMgZGF0YSBpbnRvIHRoZSBzdXBwbGllZCBkYXRhZ3JhbSBwYWNrZXQgYnkgcGVla2luZy4gVGhlIGRhdGEgaXMKKyAgICAgKiBub3QgcmVtb3ZlZCBmcm9tIHNvY2tldCBidWZmZXIgYW5kIGNhbiBiZSByZWNlaXZlZCBhZ2FpbiBieSBhbm90aGVyCisgICAgICoge0Bjb2RlIHBlZWtEYXRhKCl9IG9yIHtAY29kZSByZWNlaXZlKCl9IGNhbGwuIFRoaXMgY2FsbCBibG9ja3MgdW50aWwKKyAgICAgKiBlaXRoZXIgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBvciwgaWYgYSB0aW1lb3V0IGlzIHNldCwgdGhlIHRpbWVvdXQgaGFzCisgICAgICogYmVlbiBleHBpcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYWNrCi0gICAgICogICAgICAgICAgICB0aGUgRGF0YWdyYW1QYWNrZXQgdXNlZCB0byBzdG9yZSB0aGUgZGF0YQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBvcnQgdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgZnJvbQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGRhdGFncmFtIHBhY2tldCB1c2VkIHRvIHN0b3JlIHRoZSBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIHBvcnQgdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgZnJvbS4KICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlZWtpbmcgYXQgdGhlIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBwZWVrRGF0YShEYXRhZ3JhbVBhY2tldCBwYWNrKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0RhdGFncmFtU29ja2V0SW1wbEZhY3RvcnkuamF2YQppbmRleCAwNjFlNmExLi5iOTcxNDZlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldEltcGxGYWN0b3J5LmphdmEKQEAgLTE5LDE0ICsxOSwxOSBAQAogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBmYWN0b3J5IGZvciBkYXRhZ3JhbSBzb2NrZXQgaW1wbGVtZW50YXRpb25zLiBJdCBpcwotICogdXNlZCBieSB0aGUgY2xhc3MgPGNvZGU+RGF0YWdyYW1Tb2NrZXQ8L2NvZGU+IHRvIGNyZWF0ZSBkYXRhZ3JhbSBzb2NrZXQKLSAqIGltcGxlbWVudGF0aW9ucy4KKyAqIHVzZWQgYnkgdGhlIGNsYXNzIHtAY29kZSBEYXRhZ3JhbVNvY2tldH0gdG8gY3JlYXRlIGEgbmV3IGRhdGFncmFtIHNvY2tldAorICogaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIEBzZWUgRGF0YWdyYW1Tb2NrZXQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERhdGFncmFtU29ja2V0SW1wbEZhY3RvcnkgeworICAgIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U29ja2V0SW1wbDwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRGF0YWdyYW1Tb2NrZXRJbXBsfSBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFNvY2tldEltcGwKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZGF0YWdyYW0gc29ja2V0IGltcGxlbWVudGF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIERhdGFncmFtU29ja2V0SW1wbCBjcmVhdGVEYXRhZ3JhbVNvY2tldEltcGwoKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9GaWxlTmFtZU1hcC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0ZpbGVOYW1lTWFwLmphdmEKaW5kZXggM2E3MGU4YS4uZThhYzM1ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0ZpbGVOYW1lTWFwLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0ZpbGVOYW1lTWFwLmphdmEKQEAgLTE5LDI0ICsxOSwyNCBAQAogCiAvKioKICAqIERlZmluZXMgYSBzY2hlbWUgZm9yIG1hcHBpbmcgYSBmaWxlbmFtZSB0eXBlIHRvIGEgTUlNRSBjb250ZW50IHR5cGUuIE1haW5seQotICogdXNlZCBieSA8Y29kZT5VUkxTdHJlYW1IYW5kbGVyPC9jb2RlPiBmb3IgZGV0ZXJtaW5pbmcgdGhlIHJpZ2h0IGNvbnRlbnQKLSAqIGhhbmRsZXIgdG8gaGFuZGxlIHRoZSByZXNvdXJjZS4KKyAqIHVzZWQgYnkge0Bjb2RlIFVSTFN0cmVhbUhhbmRsZXJ9IGZvciBkZXRlcm1pbmluZyB0aGUgcmlnaHQgY29udGVudCBoYW5kbGVyIHRvCisgKiBoYW5kbGUgdGhlIHJlc291cmNlLgogICogCiAgKiBAc2VlIENvbnRlbnRIYW5kbGVyCiAgKiBAc2VlIFVSTENvbm5lY3Rpb24jZ2V0RmlsZU5hbWVNYXAoKQogICogQHNlZSBVUkxDb25uZWN0aW9uI2d1ZXNzQ29udGVudFR5cGVGcm9tTmFtZShTdHJpbmcpCiAgKiBAc2VlIFVSTFN0cmVhbUhhbmRsZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEZpbGVOYW1lTWFwIHsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgdGhlIE1JTUUgdHlwZXMgZm9yIGEgZmlsZSA8Y29kZT5maWxlTmFtZTwvY29kZT4gb2YgYQotICAgICAqIDxjb2RlPlVSTDwvY29kZT4uCisgICAgICogRGV0ZXJtaW5lcyB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUge0Bjb2RlIGZpbGVOYW1lfSBvZiBhIFVSTC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNvbnNpZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbWUgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIE1JTUUgdHlwZSBvZiB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlRm9yKFN0cmluZyBmaWxlTmFtZSk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSHR0cFJldHJ5RXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSHR0cFJldHJ5RXhjZXB0aW9uLmphdmEKaW5kZXggMzI1NTRjOS4uNWY2MTNhYjYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9IdHRwUmV0cnlFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSHR0cFJldHJ5RXhjZXB0aW9uLmphdmEKQEAgLTE5LDcgKzE5LDEwIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBUaGUgZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGEgcmVxdWVzdCBjYW5ub3QgYmUgcmV0cmllZC4KKyAqIElmIGEgSFRUUCByZXF1ZXN0IGhhcyB0byBiZSByZXRyaWVkLCB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKKyAqIHJlcXVlc3QgY2Fubm90IGJlIHJldHJpZWQgYXV0b21hdGljYWxseS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBIdHRwUmV0cnlFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKQEAgLTMwLDEyICszMywxNCBAQAogICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKIAogICAgIC8qKgotICAgICAqIG5ldyBhIEh0dHBSZXRyeUV4Y2VwdGlvbiBieSBnaXZlbiBkZXRhaWwgbWVzc2FnZSBhbmQgcmVzcG9uc2VDb2RlCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgSHR0cFJldHJ5RXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZXNwb25zZSBjb2RlIGFuZCB0aGUgZ2l2ZW4gZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbAotICAgICAqICAgICAgICAgICAgZGV0YWlsIGZvciB0aGlzIGV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KICAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgaHR0cCByZXNwb25zZSBjb2RlIHRvIHJldHVybgorICAgICAqICAgICAgICAgICAgdGhlIEhUVFAgcmVzcG9uc2UgY29kZSBmcm9tIHRhcmdldCBob3N0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBIdHRwUmV0cnlFeGNlcHRpb24oU3RyaW5nIGRldGFpbCwgaW50IGNvZGUpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsKTsKQEAgLTQzLDE2ICs0OCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIG5ldyBhIEh0dHBSZXRyeUV4Y2VwdGlvbiBieSBnaXZlbiBkZXRhaWwgbWVzc2FnZSwgcmVzcG9uc2VDb2RlIGFuZCB0aGUKLSAgICAgKiBMb2NhdGlvbiByZXNwb25zZSBoZWFkZXIKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBIdHRwUmV0cnlFeGNlcHRpb259IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHJlc3BvbnNlIGNvZGUsIHRoZSBnaXZlbiBkZXRhaWwgbWVzc2FnZSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbgorICAgICAqIGZpZWxkIGZyb20gdGhlIHJlc3BvbnNlIGhlYWRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsCi0gICAgICogICAgICAgICAgICBkZXRhaWwgZm9yIHRoaXMgZXhjZXB0aW9uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBodHRwIHJlc3BvbnNlIGNvZGUgdG8gcmV0dXJuCisgICAgICogICAgICAgICAgICB0aGUgSFRUUCByZXNwb25zZSBjb2RlIGZyb20gdGFyZ2V0IGhvc3QuCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgZXJyb3IgcmVzdWx0ZWQgZnJvbSByZWRpcmVjdGlvbiwgdGhlIExvY2F0aW9uIGhlYWRlciBjYW4KLSAgICAgKiAgICAgICAgICAgIGJlIHJlY29yZGVkCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gVVJMIG9mIHRoZSByZWRpcmVjdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSHR0cFJldHJ5RXhjZXB0aW9uKFN0cmluZyBkZXRhaWwsIGludCBjb2RlLCBTdHJpbmcgbG9jYXRpb24pIHsKICAgICAgICAgc3VwZXIoZGV0YWlsKTsKQEAgLTYxLDIxICs2NywzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIExvY2F0aW9uIGhlYWRlciByZWNvcmRlZAorICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0b3JlZCBsb2NhdGlvbiBmcm9tIHRoZSBIVFRQIGhlYWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewogICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZGV0YWlsIHJlYXNvbiBmb3IgdGhpcyBleGNlcHRpb24KKyAgICAgKiBHZXRzIHRoZSBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvbigpIHsKICAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgaHR0cCByZXNwb25zZSBjb2RlCisgICAgICogR2V0cyB0aGUgcmVzcG9uc2UgY29kZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBIVFRQIHJlc3BvbnNlIGNvZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCByZXNwb25zZUNvZGUoKSB7CiAgICAgICAgIHJldHVybiByZXNwb25zZUNvZGU7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSHR0cFVSTENvbm5lY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9IdHRwVVJMQ29ubmVjdGlvbi5qYXZhCmluZGV4IDhjMzFlNTQuLjU1Y2MzNjMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9IdHRwVVJMQ29ubmVjdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9IdHRwVVJMQ29ubmVjdGlvbi5qYXZhCkBAIC0yMiwzNCArMjIsNzYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBUaGlzIGFic3RyYWN0IHN1YmNsYXNzIG9mIDxjb2RlPlVSTENvbm5lY3Rpb248L2NvZGU+IGRlZmluZXMgbWV0aG9kIGZvcgotICogbWFuYWdpbmcgSFRUUCBjb25uZWN0aW9uIGFjY29yZGluZyB0byB0aGUgZGVzY3JpcHRpb24gZ2l2ZW4gYnkgUkZDIDIwNjgKKyAqIFRoaXMgYWJzdHJhY3Qgc3ViY2xhc3Mgb2Yge0Bjb2RlIFVSTENvbm5lY3Rpb259IGRlZmluZXMgbWV0aG9kcyBmb3IgbWFuYWdpbmcKKyAqIEhUVFAgY29ubmVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGRlc2NyaXB0aW9uIGdpdmVuIGJ5IFJGQyAyMDY4LgogICogCiAgKiBAc2VlIENvbnRlbnRIYW5kbGVyCiAgKiBAc2VlIFVSTAogICogQHNlZSBVUkxDb25uZWN0aW9uCiAgKiBAc2VlIFVSTFN0cmVhbUhhbmRsZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSHR0cFVSTENvbm5lY3Rpb24gZXh0ZW5kcyBVUkxDb25uZWN0aW9uIHsKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKICAgICBwcml2YXRlIFN0cmluZyBtZXRob2RUb2tlbnNbXSA9IHsgIkdFVCIsICJERUxFVEUiLCAiSEVBRCIsICJPUFRJT05TIiwKICAgICAgICAgICAgICJQT1NUIiwgIlBVVCIsICJUUkFDRSIgfTsKIAotICAgIC8vIFJlcXVlc3QgbWV0aG9kLCBERUZBVUxUOiAiR0VUIgorICAgLyoqCisgICAgICogVGhlIEhUVFAgcmVxdWVzdCBtZXRob2Qgb2YgdGhpcyB7QGNvZGUgSHR0cFVSTENvbm5lY3Rpb259LiBUaGUgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIHtAY29kZSAiR0VUIn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBtZXRob2QgPSAiR0VUIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLy8gUmVzcG9uc2UgY29kZSBvYnRhaW5lZCBmcm9tIHRoZSByZXF1ZXN0CisgICAgLyoqCisgICAgICogVGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBvYnRhaW5lZCBmcm9tIHRoZSBIVFRQIHJlcXVlc3QuIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIC0xfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8bGk+MXh4OiBJbmZvcm1hdGlvbmFsPC9saT4KKyAgICAgKiA8bGk+Mnh4OiBTdWNjZXNzPC9saT4KKyAgICAgKiA8bGk+M3h4OiBSZWxvY2F0aW9uL1JlZGlyZWN0aW9uPC9saT4KKyAgICAgKiA8bGk+NHh4OiBDbGllbnQgRXJyb3I8L2xpPgorICAgICAqIDxsaT41eHg6IFNlcnZlciBFcnJvcjwvbGk+CisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgcmVzcG9uc2VDb2RlID0gLTE7CiAKLSAgICAvLyBSZXNwb25zZSBtZXNzYWdlLCBjb3JyZXNwb25kcyB0byB0aGUgcmVzcG9uc2UgY29kZQorICAgIC8qKgorICAgICAqIFRoZSBIVFRQIHJlc3BvbnNlIG1lc3NhZ2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHJlc3BvbnNlIGNvZGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyByZXNwb25zZU1lc3NhZ2U7CiAKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGRlZmluZSB3aGV0aGVyIHRoZSBwcm90b2NvbCB3aWxsIGF1dG9tYXRpY2FsbHkgZm9sbG93IHJlZGlyZWN0cworICAgICAqIG9yIG5vdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIHRydWV9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGluc3RhbmNlRm9sbG93UmVkaXJlY3RzID0gZm9sbG93UmVkaXJlY3RzOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmb2xsb3dSZWRpcmVjdHMgPSB0cnVlOwogCisgICAgLyoqCisgICAgICogSWYgdGhlIEhUVFAgY2h1bmtlZCBlbmNvZGluZyBpcyBlbmFibGVkIHRoaXMgcGFyYW1ldGVyIGRlZmluZXMgdGhlCisgICAgICogY2h1bmstbGVuZ3RoLiBEZWZhdWx0IHZhbHVlIGlzIHtAY29kZSAtMX0gdGhhdCBtZWFucyB0aGUgY2h1bmtlZCBlbmNvZGluZworICAgICAqIG1vZGUgaXMgZGlzYWJsZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBjaHVua0xlbmd0aCA9IC0xOwogCisgICAgLyoqCisgICAgICogSWYgdXNpbmcgSFRUUCBmaXhlZC1sZW5ndGggc3RyZWFtaW5nIG1vZGUgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyB0aGUKKyAgICAgKiBmaXhlZCBsZW5ndGggb2YgY29udGVudC4gRGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgLTF9IHRoYXQgbWVhbnMgdGhlCisgICAgICogZml4ZWQtbGVuZ3RoIHN0cmVhbWluZyBtb2RlIGlzIGRpc2FibGVkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZml4ZWRDb250ZW50TGVuZ3RoID0gLTE7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9DSFVOS19MRU5HVEggPSAxMDI0OwpAQCAtNjAsMjQzICsxMDIsMzE3IEBACiAgICAgLy8gNVhYOiBzZXJ2ZXIgZXJyb3IKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCAyMDI6IEFjY2VwdGVkCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9BQ0NFUFRFRCA9IDIwMjsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDUwMjogQmFkIEdhdGV3YXkKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX0JBRF9HQVRFV0FZID0gNTAyOwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgNDA1OiBCYWQgTWV0aG9kCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9CQURfTUVUSE9EID0gNDA1OwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgNDAwOiBCYWQgUmVxdWVzdAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfQkFEX1JFUVVFU1QgPSA0MDA7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCA0MDg6IENsaWVudCBUaW1lb3V0CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9DTElFTlRfVElNRU9VVCA9IDQwODsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDQwOTogQ29uZmxpY3QKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX0NPTkZMSUNUID0gNDA5OwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgMjAxOiBDcmVhdGVkCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9DUkVBVEVEID0gMjAxOwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgNDEzOiBFbnRpdHkgdG9vIGxhcmdlCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9FTlRJVFlfVE9PX0xBUkdFID0gNDEzOwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgNDAzOiBGb3JiaWRkZW4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX0ZPUkJJRERFTiA9IDQwMzsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDUwNDogR2F0ZXdheSB0aW1lb3V0CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9HQVRFV0FZX1RJTUVPVVQgPSA1MDQ7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCA0MTA6IEdvbmUKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX0dPTkUgPSA0MTA7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCA1MDA6IEludGVybmFsIGVycm9yCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9JTlRFUk5BTF9FUlJPUiA9IDUwMDsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDQxMTogTGVuZ3RoIHJlcXVpcmVkCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9MRU5HVEhfUkVRVUlSRUQgPSA0MTE7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCAzMDEgTW92ZWQgcGVybWFuZW50bHkKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX01PVkVEX1BFUk0gPSAzMDE7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCAzMDI6IE1vdmVkIHRlbXBvcmFyaWx5CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9NT1ZFRF9URU1QID0gMzAyOwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgMzAwOiBNdWx0aXBsZSBjaG9pY2VzCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9NVUxUX0NIT0lDRSA9IDMwMDsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDIwNDogTm8gY29udGVudAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfTk9fQ09OVEVOVCA9IDIwNDsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDQwNjogTm90IGFjY2VwdGFibGUKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX05PVF9BQ0NFUFRBQkxFID0gNDA2OwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgMjAzOiBOb3QgYXV0aG9yaXRhdGl2ZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfTk9UX0FVVEhPUklUQVRJVkUgPSAyMDM7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCA0MDQ6IE5vdCBmb3VuZAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfTk9UX0ZPVU5EID0gNDA0OwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgNTAxOiBOb3QgaW1wbGVtZW50ZWQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX05PVF9JTVBMRU1FTlRFRCA9IDUwMTsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDMwNDogTm90IG1vZGlmaWVkCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9OT1RfTU9ESUZJRUQgPSAzMDQ7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCAyMDA6IE9LCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9PSyA9IDIwMDsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDIwNjogUGFydGlhbAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfUEFSVElBTCA9IDIwNjsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDQwMjogUGF5bWVudCByZXF1aXJlZAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfUEFZTUVOVF9SRVFVSVJFRCA9IDQwMjsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDQxMjogUHJlY29uZGl0aW9uIGZhaWxlZAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfUFJFQ09OX0ZBSUxFRCA9IDQxMjsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDQwNzogUHJveHkgYXV0aGVudGljYXRpb24gcmVxdWlyZWQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1BST1hZX0FVVEggPSA0MDc7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCA0MTQ6IFJlcXVlc3QgdG9vIGxvbmcKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1JFUV9UT09fTE9ORyA9IDQxNDsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDIwNTogUmVzZXQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1JFU0VUID0gMjA1OwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgMzAzOiBTZWUgb3RoZXIKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1NFRV9PVEhFUiA9IDMwMzsKIAogICAgIC8qKgorICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDUwMDogSW50ZXJuYWwgZXJyb3IKKyAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNIVFRQX0lOVEVSTkFMX0VSUk9SfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9TRVJWRVJfRVJST1IgPSA1MDA7CiAKICAgICAvKioKICAgICAgKiBOdW1lcmljIHN0YXR1cyBjb2RlLCAzMDU6IFVzZSBwcm94eQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfVVNFX1BST1hZID0gMzA1OwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgNDAxOiBVbmF1dGhvcml6ZWQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1VOQVVUSE9SSVpFRCA9IDQwMTsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDQxNTogVW5zdXBwb3J0ZWQgdHlwZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfVU5TVVBQT1JURURfVFlQRSA9IDQxNTsKIAogICAgIC8qKgogICAgICAqIE51bWVyaWMgc3RhdHVzIGNvZGUsIDUwMzogVW5hdmFpbGFibGUKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1VOQVZBSUxBQkxFID0gNTAzOwogCiAgICAgLyoqCiAgICAgICogTnVtZXJpYyBzdGF0dXMgY29kZSwgNTA1OiBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1ZFUlNJT04gPSA1MDU7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+SHR0cFVSTENvbm5lY3Rpb248L2NvZGU+IHBvaW50aW5nIHRvIHRoZSByZXNvdXJjZQotICAgICAqIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+VVJMPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0gaW5zdGFuY2UgcG9pbnRpbmcgdG8gdGhlCisgICAgICogcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSB7QGNvZGUgdXJsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICB0aGUgVVJMIG9mIHRoaXMgY29ubmVjdGlvbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIFVSTCBvZiB0aGlzIGNvbm5lY3Rpb24uCiAgICAgICogQHNlZSBVUkwKICAgICAgKiBAc2VlIFVSTENvbm5lY3Rpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSHR0cFVSTENvbm5lY3Rpb24oVVJMIHVybCkgewogICAgICAgICBzdXBlcih1cmwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBIVFRQIHNlcnZlcgorICAgICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgSFRUUCBzZXJ2ZXIuCiAgICAgICogCiAgICAgICogQHNlZSBVUkxDb25uZWN0aW9uI2Nvbm5lY3QoKQogICAgICAqIEBzZWUgVVJMQ29ubmVjdGlvbiNjb25uZWN0ZWQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW5wdXQgc3RyZWFtIGZyb20gdGhlIHNlcnZlciBpbiB0aGUgY2FzZSBvZiBlcnJvciBzdWNoIGFzIHRoZQotICAgICAqIHJlcXVlc3RlZCBmaWxlICh0eHQsIGh0bSwgaHRtbCkgaXMgbm90IGZvdW5kIG9uIHRoZSByZW1vdGUgc2VydmVyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjb250ZW50IHR5cGUgaXMgbm90IHdoYXQgc3RhdGVkIGFib3ZlLAotICAgICAqIDxjb2RlPkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLgorICAgICAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlIHNlcnZlciBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvciBzdWNoIGFzCisgICAgICogdGhlIHJlcXVlc3RlZCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZCBvbiB0aGUgcmVtb3RlIHNlcnZlci4gVGhpcyBzdHJlYW0KKyAgICAgKiBjYW4gYmUgdXNlZCB0byByZWFkIHRoZSBkYXRhIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kIGJhY2suCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZXJyb3IgaW5wdXQgc3RyZWFtIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0RXJyb3JTdHJlYW0oKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIDxjb2RlPmZvbGxvd1JlZGlyZWN0czwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIGlmCi0gICAgICogdGhpcyBjb25uZWN0aW9uIHdpbGwgZm9sbG93cyBhIGRpZmZlcmVudCBVUkwgcmVkaXJlY3RlZCBieSB0aGUgc2VydmVyLiBJdAotICAgICAqIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB7QGNvZGUgZm9sbG93UmVkaXJlY3RzfSB3aGljaCBpbmRpY2F0ZXMgaWYgdGhpcworICAgICAqIGNvbm5lY3Rpb24gZm9sbG93cyBhIGRpZmZlcmVudCBVUkwgcmVkaXJlY3RlZCBieSB0aGUgc2VydmVyLiBJdCBpcworICAgICAqIGVuYWJsZWQgYnkgZGVmYXVsdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgZmxhZwotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgogICAgICAqIEBzZWUgI3NldEZvbGxvd1JlZGlyZWN0cworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRGb2xsb3dSZWRpcmVjdHMoKSB7CiAgICAgICAgIHJldHVybiBmb2xsb3dSZWRpcmVjdHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGVybWlzc2lvbiBvYmplY3QgKGluIHRoaXMgY2FzZSwgU29ja2V0UGVybWlzc2lvbikgd2l0aCB0aGUKLSAgICAgKiBob3N0IGFuZCB0aGUgcG9ydCBudW1iZXIgYXMgdGhlIHRhcmdldCBuYW1lIGFuZCAicmVzb2x2ZSwgY29ubmVjdCIgYXMgdGhlCi0gICAgICogYWN0aW9uIGxpc3QuCisgICAgICogUmV0dXJucyB0aGUgcGVybWlzc2lvbiBvYmplY3QgKGluIHRoaXMgY2FzZSB7QGNvZGUgU29ja2V0UGVybWlzc2lvbn0pCisgICAgICogd2l0aCB0aGUgaG9zdCBhbmQgdGhlIHBvcnQgbnVtYmVyIGFzIHRoZSB0YXJnZXQgbmFtZSBhbmQge0Bjb2RlCisgICAgICogInJlc29sdmUsIGNvbm5lY3QifSBhcyB0aGUgYWN0aW9uIGxpc3QuIElmIHRoZSBwb3J0IG51bWJlciBvZiB0aGlzIFVSTAorICAgICAqIGluc3RhbmNlIGlzIGxvd2VyIHRoYW4ge0Bjb2RlIDB9IHRoZSBwb3J0IHdpbGwgYmUgc2V0IHRvIHtAY29kZSA4MH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGVybWlzc2lvbiBvYmplY3QgcmVxdWlyZWQgZm9yIHRoaXMgY29ubmVjdGlvbgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBlcm1pc3Npb24gb2JqZWN0IHJlcXVpcmVkIGZvciB0aGlzIGNvbm5lY3Rpb24uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUKICAgICAgKiAgICAgICAgICAgICBwZXJtaXNzaW9uIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzEzLDI0ICs0MjksMjMgQEAKICAgICAgKiByZW1vdGUgSFRUUCBzZXJ2ZXIuIEFsbCBwb3NzaWJsZSBtZXRob2RzIG9mIHRoaXMgSFRUUCBpbXBsZW1lbnRhdGlvbiBpcwogICAgICAqIGxpc3RlZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0IG1ldGhvZCBzdHJpbmcKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0IG1ldGhvZCBzdHJpbmcuCiAgICAgICogQHNlZSAjbWV0aG9kCiAgICAgICogQHNlZSAjc2V0UmVxdWVzdE1ldGhvZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpIHsKICAgICAgICAgcmV0dXJuIG1ldGhvZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBjb2RlIHJldHVybmVkIGJ5IHRoZSByZW1vdGUgSFRUUCBzZXJ2ZXIKKyAgICAgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBjb2RlIHJldHVybmVkIGJ5IHRoZSByZW1vdGUgSFRUUCBzZXJ2ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVzcG9uc2UgY29kZSwgLTEgaWYgbm8gdmFsaWQgcmVzcG9uc2UgY29kZQotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlc3BvbnNlIGNvZGUsIC0xIGlmIG5vIHZhbGlkIHJlc3BvbnNlIGNvZGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIElPIGVycm9yIGR1cmluZyB0aGUgcmV0cmlldmFsLgotICAgICAqIAogICAgICAqIEBzZWUgI2dldFJlc3BvbnNlTWVzc2FnZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UmVzcG9uc2VDb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQ2FsbCBnZXRJbnB1dFN0cmVhbSgpIGZpcnN0IHNpbmNlIGdldEhlYWRlckZpZWxkKCkgZG9lc24ndCByZXR1cm4KQEAgLTM1NywxNSArNDcyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzcG9uc2UgbWVzc2FnZSByZXR1cm5lZCB0aGUgcmVtb3RlIEhUVFAgc2VydmVyCisgICAgICogUmV0dXJucyB0aGUgcmVzcG9uc2UgbWVzc2FnZSByZXR1cm5lZCBieSB0aGUgcmVtb3RlIEhUVFAgc2VydmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHN1Y2ggcmVzcG9uc2UgZXhpc3RzCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4ge0Bjb2RlIG51bGx9IGlmIG5vIHN1Y2ggcmVzcG9uc2UgZXhpc3RzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBJTyBlcnJvciBkdXJpbmcgdGhlIHJldHJpZXZhbC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldHJpZXZhbC4KICAgICAgKiBAc2VlICNnZXRSZXNwb25zZUNvZGUoKQotICAgICAqIEBzZWUgSU9FeGNlcHRpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlTWVzc2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UgIT0gbnVsbCkgewpAQCAtMzc4LDEyICs0OTEsMTIgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmbGFnIG9mIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIHdpbGwgZm9sbG93IHJlZGlyZWN0cyByZXR1cm5lZAogICAgICAqIGJ5IHRoZSByZW1vdGUgc2VydmVyLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCB0aGUgcGVybWlzc2lvbgotICAgICAqIGZyb20gdGhlIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgKiBmcm9tIHRoZSBzZWN1cml0eSBtYW5hZ2VyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhdXRvCi0gICAgICogICAgICAgICAgICBUaGUgdmFsdWUgdG8gc2V0Ci0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrU2V0RmFjdG9yeSgpCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBvcHRpb24uCisgICAgICogQHNlZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tTZXRGYWN0b3J5KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9sbG93UmVkaXJlY3RzKGJvb2xlYW4gYXV0bykgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0zOTgsMTQgKzUxMSwxMyBAQAogICAgICAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgbWFkZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+bm9uLW51bGw8L2NvZGU+IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1ldGhvZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1ldGhvZCB0byBiZSB1c2VkLgogICAgICAqIEB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBUaHJvd24gd2hlbiB0aGlzIGlzIGNhbGxlZCBhZnRlciBjb25uZWN0ZWQsIG9yIHRoZSBtZXRob2QgaXMKLSAgICAgKiAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgSFRUUCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGlzIGNhbGxlZCBhZnRlciBjb25uZWN0ZWQsIG9yIHRoZSBtZXRob2QgaXMgbm90CisgICAgICogICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgSFRUUCBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiBAc2VlICNnZXRSZXF1ZXN0TWV0aG9kKCkKICAgICAgKiBAc2VlICNtZXRob2QKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0TWV0aG9kKFN0cmluZyBtZXRob2QpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKQEAgLTQyNCw0MyArNTM2LDUwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIGNvbm5lY3Rpb24gdXNlcyBwcm94eS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIHVzZXMgYSBwcm94eSBzZXJ2ZXIgb3Igbm90LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gc3VwcG9ydHMgcHJveHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbm5lY3Rpb24gcGFzc2VzIGEgcHJveHkgc2VydmVyLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVzaW5nUHJveHkoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBjb25uZWN0aW9uIGZvbGxvd3MgcmVkaXJlY3RzLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gZm9sbG93cyByZWRpcmVjdHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY29ubmVjdGlvbiBmb2xsb3dzIHJlZGlyZWN0cywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29ubmVjdGlvbiBmb2xsb3dzIHJlZGlyZWN0cywgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cygpIHsKICAgICAgICAgcmV0dXJuIGluc3RhbmNlRm9sbG93UmVkaXJlY3RzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgaWYgdGhpcyBjb25uZWN0aW9uIGZvbGxvd3MgcmVkaXJlY3RzLgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gZm9sbG93cyByZWRpcmVjdHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZvbGxvd1JlZGlyZWN0cwotICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gc2hvdWxkIGZvbGxvd3MgcmVkaXJlY3RzLCBmYWxzZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29ubmVjdGlvbiB3aWxsIGZvbGxvd3MgcmVkaXJlY3RzLCBmYWxzZQogICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGJvb2xlYW4gZm9sbG93UmVkaXJlY3RzKSB7CiAgICAgICAgIGluc3RhbmNlRm9sbG93UmVkaXJlY3RzID0gZm9sbG93UmVkaXJlY3RzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGUgdmFsdWUgaW4gdGhlIGZvcm0gb2YgbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoCi0gICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQgPGNvZGU+ZmllbGQ8L2NvZGU+LiBSZXR1cm5zCi0gICAgICogPGNvZGU+ZGVmYXVsdFZhbHVlPC9jb2RlPiBpZiBubyBzdWNoIGZpZWxkIGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVzcG9uc2UKLSAgICAgKiBoZWFkZXIuCisgICAgICogUmV0dXJucyB0aGUgZGF0ZSB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgc2luY2Uge0Bjb2RlIDAxLjAxLjE5NzAsIDAwOjAwaH0KKyAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBoZWFkZXIgZmllbGQge0Bjb2RlIGZpZWxkfS4gVGhlIHtAY29kZSBkZWZhdWx0VmFsdWV9CisgICAgICogd2lsbCBiZSByZXR1cm5lZCBpZiBubyBzdWNoIGZpZWxkIGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVzcG9uc2UgaGVhZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIGluIHF1ZXN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIGZpZWxkIG5hbWUuCiAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm8gZmllbGQgaXMgZm91bmQKLSAgICAgKiBAcmV0dXJuIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaAorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIHRoZSBzcGVjaWZpZWQgaGVhZGVyIGZpZWxkIHdvbnQgYmUKKyAgICAgKiAgICAgICAgICAgIGZvdW5kLgorICAgICAqIEByZXR1cm4gdGhlIGhlYWRlciBmaWVsZCByZXByZXNlbnRlZCBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLAorICAgICAqICAgICAgICAgMTk3MCBHTVQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgZ2V0SGVhZGVyRmllbGREYXRlKFN0cmluZyBmaWVsZCwgbG9uZyBkZWZhdWx0VmFsdWUpIHsKQEAgLTQ2OCwxNyArNTg3LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgbGVuZ3RoIG9mIGEgSFRUUCByZXF1ZXN0IGJvZHkgaXMga25vd24gYWhlYWQsIHNldHMgZml4ZWQgbGVuZ3RoIHRvCisgICAgICogSWYgdGhlIGxlbmd0aCBvZiBhIEhUVFAgcmVxdWVzdCBib2R5IGlzIGtub3duIGFoZWFkLCBzZXRzIGZpeGVkIGxlbmd0aCB0bwogICAgICAqIGVuYWJsZSBzdHJlYW1pbmcgd2l0aG91dCBidWZmZXJpbmcuIFNldHMgYWZ0ZXIgY29ubmVjdGlvbiB3aWxsIGNhdXNlIGFuCiAgICAgICogZXhjZXB0aW9uLgogICAgICAqIAogICAgICAqIEBzZWUgI3NldENodW5rZWRTdHJlYW1pbmdNb2RlCiAgICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXhlZCBsZW5ndGggb2YgdGhlIEhUVFAgcmVxdWVzdCBib2R5CisgICAgICogICAgICAgICAgICB0aGUgZml4ZWQgbGVuZ3RoIG9mIHRoZSBIVFRQIHJlcXVlc3QgYm9keS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFscmVhZHkgY29ubmVjdGVkIG9yIG90aGVyIG1vZGUgYWxyZWFkeSBzZXQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbHJlYWR5IGNvbm5lY3RlZCBvciBhbiBvdGhlciBtb2RlIGFscmVhZHkgc2V0LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgY29udGVudExlbmd0aCBpcyBsZXNzIHRoYW4gemVybworICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb250ZW50TGVuZ3RofSBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUoaW50IGNvbnRlbnRMZW5ndGgpIHsKICAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZCkgewpAQCAtNDk0LDE2ICs2MTQsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJZiBsZW5ndGggb2YgYSBIVFRQIHJlcXVlc3QgYm9keSBpcyBOT1Qga25vd24gYWhlYWQsIGVuYWJsZSBjaHVua2VkCi0gICAgICogdHJhbnNmZXIgZW5jb2RpbmcgdG8gZW5hYmxlIHN0cmVhbWluZyB3aXRob3V0IGJ1ZmZlcmluZy4gTm90aWNlIHRoYXQgbm90Ci0gICAgICogYWxsIGh0dHAgc2VydmVycyBzdXBwb3J0IHRoaXMgbW9kZS4gU2V0cyBhZnRlciBjb25uZWN0aW9uIHdpbGwgY2F1c2UgYW4KKyAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIGEgSFRUUCByZXF1ZXN0IGJvZHkgaXMgTk9UIGtub3duIGFoZWFkLCBlbmFibGUgY2h1bmtlZAorICAgICAqIHRyYW5zZmVyIGVuY29kaW5nIHRvIGVuYWJsZSBzdHJlYW1pbmcgd2l0aCBidWZmZXJpbmcuIE5vdGljZSB0aGF0IG5vdCBhbGwKKyAgICAgKiBodHRwIHNlcnZlcnMgc3VwcG9ydCB0aGlzIG1vZGUuIFNldHMgYWZ0ZXIgY29ubmVjdGlvbiB3aWxsIGNhdXNlIGFuCiAgICAgICogZXhjZXB0aW9uLgogICAgICAqIAogICAgICAqIEBzZWUgI3NldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZQogICAgICAqIEBwYXJhbSBjaHVua2xlbgotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiBhIGNodW5rCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGEgY2h1bmsuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbHJlYWR5IGNvbm5lY3RlZCBvciBvdGhlciBtb2RlIGFscmVhZHkgc2V0CisgICAgICogICAgICAgICAgICAgaWYgYWxyZWFkeSBjb25uZWN0ZWQgb3IgYW4gb3RoZXIgbW9kZSBhbHJlYWR5IHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDaHVua2VkU3RyZWFtaW5nTW9kZShpbnQgY2h1bmtsZW4pIHsKICAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXQ0QWRkcmVzcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXQ0QWRkcmVzcy5qYXZhCmluZGV4IGVhZWZhOTYuLmRkNmIwODggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9JbmV0NEFkZHJlc3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSW5ldDRBZGRyZXNzLmphdmEKQEAgLTE5LDYgKzE5LDE4IEBACiAKIGltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSAzMiBiaXQgbG9uZyBJUHY0IGFkZHJlc3MuIFRoZSBtb3N0IGNvbW1vbiB0ZXh0dWFsCisgKiByZXByZXNlbnRhdGlvbiBvZiBhbiBJUHY0IGFkZHJlc3MgZm9sbG93cyB0aGUgcGF0dGVybiB7QGNvZGUgYi5iLmIuYn0gd2hlcmUKKyAqIGVhY2gge0Bjb2RlIGJ9IHJlcHJlc2VudHMgb25lIG9mIHRoZSBmb3VyIGJ5dGVzLiBJZiBvbmx5IHRocmVlIHBhcnRzIGFyZQorICogc3BlY2lmaWVkICh7QGNvZGUgYi5iLmJifSApLCB0aGUgbGFzdCBwYXJ0IGlzIHRoZW4gMTYgYml0IGxvbmcsIHRoZSBhZGRyZXNzCisgKiByZXByZXNlbnRzIGEgY2xhc3MgQiBuZXR3b3JrIGFkZHJlc3MgYXMgPGk+MTI4Lm5ldC5ob3N0PC9pPi4gQSB0d28gcGFydAorICogYWRkcmVzcyAoe0Bjb2RlIGIuYmJifSApIGFsbG93cyB0byByZXByZXNlbnQgYSBjbGFzcyBBIG5ldHdvcmsgYWRkcmVzcyBhcworICogPGk+bmV0Lmhvc3Q8L2k+LiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJ0ICh7QGNvZGUgYmJiYn0gKSB0aGUgYWRkcmVzcyBpcworICogcmVwcmVzZW50ZWQgd2l0aG91dCBhbnkgYnl0ZSByZWFycmFuZ2VtZW50LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGZpbmFsIGNsYXNzIEluZXQ0QWRkcmVzcyBleHRlbmRzIEluZXRBZGRyZXNzIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyODYzMTY3NjQ5MTAzMTY1MDdMOwpAQCAtMzMsMTAgKzQ1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MuIFZhbGlkIElQdjQgbXVsdGljYXN0Ci0gICAgICogYWRkcmVzc2VzIGFyZSBwcmVmaXhlZCB3aXRoIDExMTAgPSAweEUKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlcHJlc2VudGVkIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyBvciBub3QuCisgICAgICogVmFsaWQgSVB2NCBtdWx0aWNhc3QgYWRkcmVzc2VzIGFyZSBwcmVmaXhlZCB3aXRoIDExMTAgPSAweEUuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgbXVsdGljYXN0IGFkZHJlc3MsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpY2FzdEFkZHJlc3MoKSB7CkBAIC00NCw5ICs1OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIGFkZHJlc3MgaXMgdGhlIEFOWSBBZGRyZXNzCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZXByZXNlbnRlZCBhZGRyZXNzIGlzIHRoZSBsb2NhbCB3aWxkY2FyZCBBTlkgYWRkcmVzcworICAgICAqIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgdGhlIHdpbGRjYXJkIEFOWQorICAgICAqICAgICAgICAgYWRkcmVzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNBbnlMb2NhbEFkZHJlc3MoKSB7CkBAIC01OSwxMCArNzYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLiBMb29wYmFjayBpcHY0Ci0gICAgICogYWRkcmVzc2VzIGFyZSBwcmVmaXhlZCB3aXRoOiAwMTExMTExMTEgPSAxMjcKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlcHJlc2VudGVkIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzIG9yIG5vdC4KKyAgICAgKiBMb29wYmFjayBJUHY0IGFkZHJlc3NlcyBhcmUgcHJlZml4ZWQgd2l0aDogMDExMTExMTExID0gMTI3LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGxvb2tiYWNrIGFkZHJlc3MsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvb3BiYWNrQWRkcmVzcygpIHsKQEAgLTcwLDEzICs4OSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaGFzIGxpbmstbG9jYWwgc2NvcGUuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWRkcmVzcyBoYXMgYSBsaW5rLWxvY2FsIHNjb3BlIG9yIG5vdC4KKyAgICAgKiA8cD4KKyAgICAgKiBSRkMgMzQ4NCA8YnI+CisgICAgICogRGVmYXVsdCBBZGRyZXNzIFNlbGVjdGlvbiBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgVmVyc2lvbiA2IChJUHY2KSBzdGF0ZXMKKyAgICAgKiBJUHY0IGF1dG8tY29uZmlndXJhdGlvbiBhZGRyZXNzZXMsIHByZWZpeCAxNjkuMjU0LzE2LCBJUHY0IGxvb3BiYWNrCisgICAgICogYWRkcmVzc2VzLCBwcmVmaXggMTI3LzgsIGFyZSBhc3NpZ25lZCBsaW5rLWxvY2FsIHNjb3BlLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBSRkMgMzQ4NCBEZWZhdWx0IEFkZHJlc3MgU2VsZWN0aW9uIGZvciBJbnRlcm5ldCBQcm90b2NvbCB2ZXJzaW9uIDYgKElQdjYpCi0gICAgICogc3RhdGVzIElQdjQgYXV0by1jb25maWd1cmF0aW9uIGFkZHJlc3NlcywgcHJlZml4IDE2OS4yNTQvMTYsIElQdjQKLSAgICAgKiBsb29wYmFjayBhZGRyZXNzZXMsIHByZWZpeCAxMjcvOCwgYXJlIGFzc2lnbmVkIGxpbmstbG9jYWwgc2NvcGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgbGluay1sb2NhbCBhZGRyZXNzLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNMaW5rTG9jYWxBZGRyZXNzKCkgewpAQCAtODYsMTIgKzEwOSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaGFzIHNpdGUtbG9jYWwgc2NvcGUuIFJGQyAzNDg0IERlZmF1bHQKLSAgICAgKiBBZGRyZXNzIFNlbGVjdGlvbiBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgdmVyc2lvbiA2IChJUHY2KSBzdGF0ZXMgSVB2NAotICAgICAqIHByaXZhdGUgYWRkcmVzc2VzLCBwcmVmaXhlcyAxMC84LCAxNzIuMTYvMTIsIGFuZCAxOTIuMTY4LzE2LCBhcmUgYXNzaWduZWQKLSAgICAgKiBzaXRlLWxvY2FsIHNjb3BlLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaGFzIGEgc2l0ZS1sb2NhbCBzY29wZSBvciBub3QuCisgICAgICogPHA+CisgICAgICogUkZDIDM0ODQgPGJyPgorICAgICAqIERlZmF1bHQgQWRkcmVzcyBTZWxlY3Rpb24gZm9yIEludGVybmV0IFByb3RvY29sIFZlcnNpb24gNiAoSVB2Nikgc3RhdGVzCisgICAgICogSVB2NCBwcml2YXRlIGFkZHJlc3NlcywgcHJlZml4ZXMgMTAvOCwgMTcyLjE2LzEyLCBhbmQgMTkyLjE2OC8xNiwgYXJlCisgICAgICogYXNzaWduZWQgc2l0ZS1sb2NhbCBzY29wZS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgc2l0ZS1sb2NhbCBhZGRyZXNzLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNTaXRlTG9jYWxBZGRyZXNzKCkgewpAQCAtMTAyLDExICsxMzAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gYWRkcmVzcyBpcyBhIGdsb2JhbCBtdWx0aWNhc3QgYWRkcmVzcy4gVmFsaWQgTUNHbG9iYWwKLSAgICAgKiBJUHY0IGFkZHJlc3NlcyBhcmUgMjI0LjAuMS4wIC0gMjM4LjI1NS4yNTUuMjU1CisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgZ2xvYmFsIG11bHRpY2FzdCBhZGRyZXNzIG9yIG5vdC4gVmFsaWQKKyAgICAgKiBNQ0dsb2JhbCBJUHY0IGFkZHJlc3NlcyBhcmUgMjI0LjAuMS4wIC0gMjM4LjI1NS4yNTUuMjU1LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCBpZiB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgZ2xvYmFsIG11bHRpY2FzdCBncm91cCwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhZGRyZXNzIGlzIGluIHRoZSBnbG9iYWwgbXVsdGljYXN0IGdyb3VwLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ0dsb2JhbCgpIHsKQEAgLTE0MCwxMCArMTY5LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBmYWxzZSBmb3IgYWxsIElQdjQgYWRkcmVzc2VzLiBUaGVyZSBhcmUgbm8gdmFsaWQgSVB2NCBOb2RlLWxvY2FsCi0gICAgICogYWRkcmVzc2VzCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhZGRyZXNzIGhhcyBhIG5vZGUtbG9jYWwgc2NvcGUgb3Igbm90LiBUaGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgYWx3YXlzIHtAY29kZSBmYWxzZX0gYmVjYXVzZSB0aGVyZSBhcmUgbm8gdmFsaWQgSVB2NCBub2RlLWxvY2FsCisgICAgICogYWRkcmVzc2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqIEByZXR1cm4ge0Bjb2RlIGZhbHNlfSBmb3IgYWxsIElQdjQgYWRkcmVzc2VzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTUNOb2RlTG9jYWwoKSB7CkBAIC0xNTEsMTEgKzE4MiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIGxpbmstbG9jYWwgYWRkcmVzcy5UaGUgdmFsaWQgcmFuZ2UgZm9yCi0gICAgICogSVB2NCBsaW5rLWxvY2FsIGFkZHJlc3NlcyBpczogMjI0LjAuMC4wIHRvIDIzOS4wLjAuMjU1IEhlbmNlIGEgbWFzayBvZgotICAgICAqIDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCA9IDB4RTAwMDAwCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgbGluay1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBvciBub3QuIFRoZQorICAgICAqIHZhbGlkIHJhbmdlIGZvciBJUHY0IGxpbmstbG9jYWwgYWRkcmVzc2VzIGlzOiAyMjQuMC4wLjAgdG8gMjM5LjAuMC4yNTUKKyAgICAgKiBIZW5jZSBhIG1hc2sgb2YgMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwID0gMHhFMDAwMDAuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgbGluay1sb2NhbCBhZGRyZXNzLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ0xpbmtMb2NhbCgpIHsKQEAgLTE2MywxMSArMTk2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgc2l0ZS1sb2NhbCBhZGRyZXNzLlRoZSB2YWxpZCByYW5nZSBmb3IKLSAgICAgKiBJUHY0IHNpdGUtbG9jYWwgYWRkcmVzc2VzIGlzOiAyMzkuMjU1LjAuMCB0byAyMzkuMjU1LjI1NS4yNTUgSGVuY2UgYSBtYXNrCi0gICAgICogb2YgMTExMDExMTEgMTExMTExMTEgPSAweEVGRkYuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgc2l0ZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBvciBub3QuIFRoZQorICAgICAqIHZhbGlkIHJhbmdlIGZvciBJUHY0IHNpdGUtbG9jYWwgYWRkcmVzc2VzIGlzOiAyMzkuMjU1LjAuMCB0bworICAgICAqIDIzOS4yNTUuMjU1LjI1NSBIZW5jZSBhIG1hc2sgb2YgMTExMDExMTEgMTExMTExMTEgPSAweEVGRkYuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgc2l0ZS1sb2NhbCBhZGRyZXNzLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ1NpdGVMb2NhbCgpIHsKQEAgLTE3NSwxMiArMjEwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgb3JnYW5pemF0aW9uLWxvY2FsIGFkZHJlc3MuIFRoZSB2YWxpZAotICAgICAqIHJhbmdlIGZvciBJUHY0IG9yZy1sb2NhbCBhZGRyZXNzZXMgaXM6IDIzOS4xOTIuMC4wIHRvIDIzOS4xOTUuMjU1LjI1NQotICAgICAqIEhlbmNlIG1hc2tzIG9mIDExMTAxMTExIDExMDAwMDAwIHRvIDExMTAxMTExIDExMDAwMDExIGFyZSB2YWxpZC4gMHhFRkMwCi0gICAgICogdG8gMHhFRkMzCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgb3JnYW5pemF0aW9uLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzIG9yCisgICAgICogbm90LiBUaGUgdmFsaWQgcmFuZ2UgZm9yIElQdjQgb3JnYW5pemF0aW9uLWxvY2FsIGFkZHJlc3NlcyBpczoKKyAgICAgKiAyMzkuMTkyLjAuMCB0byAyMzkuMTk1LjI1NS4yNTUgSGVuY2UgbWFza3Mgb2YgMTExMDExMTEgMTEwMDAwMDAgdG8KKyAgICAgKiAxMTEwMTExMSAxMTAwMDAxMSBhcmUgdmFsaWQuIDB4RUZDMCB0byAweEVGQzMKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb3JnIGxvY2FsIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIG9yZ2FuaXphdGlvbi1sb2NhbAorICAgICAqICAgICAgICAgYWRkcmVzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ09yZ0xvY2FsKCkgewpAQCAtMTg5LDkgKzIyNiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIElQIGFkZHJlc3MuCisgICAgICogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJUCBhZGRyZXNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gSG9zdCBhZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGhvc3QgYWRkcmVzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3RBZGRyZXNzKCkgewpAQCAtMjA2LDkgKzI0NCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyB0aGUgYmFzaWMgaGFzaGNvZGUgZnVuY3Rpb24uCisgICAgICogR2V0cyB0aGUgaGFzaGNvZGUgb2YgdGhlIHJlcHJlc2VudGVkIElQIGFkZHJlc3MuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlCisgICAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaGFzaGNvZGUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTIxNiwxMCArMjU1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBJUHY0IGFkZHJlc3MgYW5kIHRoZXkgaGF2ZQotICAgICAqIHRoZSBzYW1lIElQIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBDb21wYXJlcyB0aGlzIGluc3RhbmNlIHdpdGggdGhlIElQIGFkZHJlc3MgaW4gdGhlIG9iamVjdCB7QGNvZGUgb2JqfSBhbmQKKyAgICAgKiByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGV5IGFyZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCByZXByZXNlbnQgdGhlIHNhbWUKKyAgICAgKiBJUCBhZGRyZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwgYW5kIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYmUgdGVzdGVkIGZvciBlcXVhbGl0eS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYWRkcmVzc2VzIGFyZSBlcXVhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9JbmV0NkFkZHJlc3MuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9JbmV0NkFkZHJlc3MuamF2YQppbmRleCA5NjkyOWMyLi40YzEwZmFhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSW5ldDZBZGRyZXNzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXQ2QWRkcmVzcy5qYXZhCkBAIC0yNiw2ICsyNiwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuSW5ldDZVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIDEyOCBiaXQgbG9uZyBJUHY2IGFkZHJlc3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSW5ldDZBZGRyZXNzIGV4dGVuZHMgSW5ldEFkZHJlc3MgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg4MDQxMDA3MDUxNjc5MzM3N0w7CkBAIC02NiwxNSArNzEsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIEluZXRBZGRyZXNzLCByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+IGFuZAotICAgICAqIDxjb2RlPmhvc3ROYW1lPC9jb2RlPiBhbmQgPGNvZGU+c2NvcGVfaWQ8L2NvZGU+CisgICAgICogQ29uc3RydWN0cyBhbiB7QGNvZGUgSW5ldEFkZHJlc3N9IHJlcHJlc2VudGluZyB0aGUge0Bjb2RlIGFkZHJlc3N9IGFuZAorICAgICAqIHtAY29kZSBuYW1lfSBhbmQge0Bjb2RlIHNjb3BlX2lkfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcmVzcwotICAgICAqICAgICAgICAgICAgbmV0d29yayBhZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgbmV0d29yayBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBOYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzcworICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBzY29wZV9pZAotICAgICAqICAgICAgICAgICAgVGhlIHNjb3BlIGlkIGZvciBsaW5rIG9yIHNpdGUgbG9jYWwgYWRkcmVzc2VzCisgICAgICogICAgICAgICAgICB0aGUgc2NvcGUgaWQgZm9yIGxpbmstIG9yIHNpdGUtbG9jYWwgYWRkcmVzc2VzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEluZXQ2QWRkcmVzcyhieXRlIGFkZHJlc3NbXSwgU3RyaW5nIG5hbWUsIGludCBzY29wZV9pZCkgewogICAgICAgICBob3N0TmFtZSA9IG5hbWU7CkBAIC04NiwxOCArOTIsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIElQdjYgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIDxjb2RlPmhvc3Q8L2NvZGU+LAotICAgICAqIDxjb2RlPmFkZHI8L2NvZGU+IGFuZCA8Y29kZT5zY29wZV9pZDwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhbiBJUHY2IGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGNvZGUgaG9zdH0sIHtAY29kZQorICAgICAqIGFkZHJ9IGFuZCB7QGNvZGUgc2NvcGVfaWR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBob3N0Ci0gICAgICogICAgICAgICAgICBob3N0bmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICBuZXR3b3JrIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXR3b3JrIGFkZHJlc3MuCiAgICAgICogQHBhcmFtIHNjb3BlX2lkCi0gICAgICogICAgICAgICAgICB0aGUgc2NvcGUgaWQgZm9yIGxpbmsgb3Igc2l0ZSBsb2NhbCBhZGRyZXNzZXMKLSAgICAgKiBAcmV0dXJuIGFuIEluZXQ2QWRkcmVzcyBpbnN0YW5jZQorICAgICAqICAgICAgICAgICAgdGhlIHNjb3BlIGlkIGZvciBsaW5rLSBvciBzaXRlLWxvY2FsIGFkZHJlc3Nlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBJbmV0NkFkZHJlc3MgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBJUCBhZGRyZXNzLgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBpcyBudWxsIG9yIG9mIGludmFsaWQgbGVuZ3RoCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFkZHJlc3MgaXMgbnVsbCBvciBoYXMgYW4gaW52YWxpZCBsZW5ndGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbmV0NkFkZHJlc3MgZ2V0QnlBZGRyZXNzKFN0cmluZyBob3N0LCBieXRlW10gYWRkciwKICAgICAgICAgICAgIGludCBzY29wZV9pZCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKQEAgLTExMiwyMiArMTE5LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBJUHY2IGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiA8Y29kZT5ob3N0PC9jb2RlPiwKLSAgICAgKiA8Y29kZT5hZGRyPC9jb2RlPiBhbmQgPGNvZGU+bmlmPC9jb2RlPi4gPGNvZGU+c2NvcGVfaWQ8L2NvZGU+IGlzCi0gICAgICogc2V0IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gPGNvZGU+bmlmPC9jb2RlPiBhbmQgdGhlCi0gICAgICogPGNvZGU+YWRkcjxjb2RlPiB0eXBlKGUuZy4gc2l0ZSBsb2NhbCBvciBsaW5rIGxvY2FsKS4KKyAgICAgKiBHZXRzIGFuIElQdjYgYWRkcmVzcyBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAY29kZSBob3N0fSwKKyAgICAgKiB7QGNvZGUgYWRkcn0gYW5kIHtAY29kZSBuaWZ9LiB7QGNvZGUgc2NvcGVfaWR9IGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogZ2l2ZW4ge0Bjb2RlIG5pZn0gYW5kIHRoZSB7QGNvZGUgYWRkcn0gdHlwZSAoZm9yIGV4YW1wbGUgc2l0ZS1sb2NhbCBvcgorICAgICAqIGxpbmstbG9jYWwpLgogICAgICAqIAogICAgICAqIEBwYXJhbSBob3N0Ci0gICAgICogICAgICAgICAgICBob3N0IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgaG9zdG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICBuZXR3b3JrIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXR3b3JrIGFkZHJlc3MuCiAgICAgICogQHBhcmFtIG5pZgotICAgICAqICAgICAgICAgICAgdGhlIE5ldHdvcmsgSW50ZXJmYWNlIHRoYXQgdGhpcyBhZGRyZXNzIGlzIGFzc29jaWF0ZWQgd2l0aC4KLSAgICAgKiBAcmV0dXJuIGFuIEluZXQ2QWRkcmVzcyBpbnN0YW5jZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRoYXQgdGhpcyBhZGRyZXNzIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSBJbmV0NkFkZHJlc3MgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBJUCBhZGRyZXNzLgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBpcyBudWxsIG9yIG9mIGludmFsaWQgbGVuZ3RoLCBvciB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcmZhY2UgZG9lc24ndCBoYXZlIGEgbnVtZXJpYyBzY29wZSBpZCBmb3IgdGhlIGdpdmVuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFkZHJlc3MgaXMge0Bjb2RlIG51bGx9IG9yIGhhcyBhbiBpbnZhbGlkIGxlbmd0aCBvcgorICAgICAqICAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgZG9lc24ndCBoYXZlIGEgbnVtZXJpYyBzY29wZSBpZCBmb3IgdGhlIGdpdmVuCiAgICAgICogICAgICAgICAgICAgYWRkcmVzcyB0eXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW5ldDZBZGRyZXNzIGdldEJ5QWRkcmVzcyhTdHJpbmcgaG9zdCwgYnl0ZVtdIGFkZHIsCiAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIG5pZikgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKQEAgLTE2Nyw5ICsxNzUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIGZvbGxvd2luZyBjYXNlcyBpcyB0cnVlOiAxLiBib3RoIGFkZHJlc3NlcyBhcmUKLSAgICAgKiBzaXRlIGxvY2FsOyAyLiBib3RoIGFkZHJlc3NlcyBhcmUgbGluayBsb2NhbDsgMy4gaWEgaXMgbmVpdGhlciBzaXRlIGxvY2FsCi0gICAgICogbm9yIGxpbmsgbG9jYWw7CisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgb25lIG9mIGZvbGxvd2luZyBjYXNlcyBhcHBsaWVzOgorICAgICAqIDxwPgorICAgICAqIDxsaT4xLiBib3RoIGFkZHJlc3NlcyBhcmUgc2l0ZSBsb2NhbDwvbGk+CisgICAgICogPGxpPjIuIGJvdGggYWRkcmVzc2VzIGFyZSBsaW5rIGxvY2FsPC9saT4KKyAgICAgKiA8bGk+My4ge0Bjb2RlIGlhfSBpcyBuZWl0aGVyIHNpdGUgbG9jYWwgbm9yIGxpbmsgbG9jYWw8L2xpPgorICAgICAqIDwvcD4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZUxvY2FsVHlwZShJbmV0NkFkZHJlc3MgaWEpIHsKICAgICAgICAgaWYgKGlhLmlzU2l0ZUxvY2FsQWRkcmVzcygpICYmIGlzU2l0ZUxvY2FsQWRkcmVzcygpKSB7CkBAIC0xODUsMTMgKzE5NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gSW5ldEFkZHJlc3MsIHJlcHJlc2VudGluZyB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+aG9zdE5hbWU8L2NvZGU+IGFuZCA8Y29kZT5zY29wZV9pZDwvY29kZT4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHtAY29kZSBJbmV0QWRkcmVzc30gcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgYWRkcmVzc30gYW5kCisgICAgICoge0Bjb2RlIHNjb3BlX2lkfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcmVzcwotICAgICAqICAgICAgICAgICAgbmV0d29yayBhZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgbmV0d29yayBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBzY29wZV9pZAotICAgICAqICAgICAgICAgICAgVGhlIHNjb3BlIGlkIGZvciBsaW5rIG9yIHNpdGUgbG9jYWwgYWRkcmVzc2VzCisgICAgICogICAgICAgICAgICB0aGUgc2NvcGUgaWQgZm9yIGxpbmstIG9yIHNpdGUtbG9jYWwgYWRkcmVzc2VzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEluZXQ2QWRkcmVzcyhieXRlIGFkZHJlc3NbXSwgaW50IHNjb3BlX2lkKSB7CiAgICAgICAgIGlwYWRkcmVzcyA9IGFkZHJlc3M7CkBAIC0yMDIsMTMgKzIxNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0cnVlIGlmIHRoZSBJbmV0QWRkcmVzcyBpcyBhbiBJUCBtdWx0aWNhc3QgYWRkcmVzcy4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGFuIElQIG11bHRpY2FzdCBhZGRyZXNzIG9yIG5vdC4gVmFsaWQKKyAgICAgKiBJUHY2IG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIGJpbmFyeSBwcmVmaXhlZCB3aXRoIDExMTExMTExIG9yIEZGIChoZXgpLgogICAgICAqIAotICAgICAqIFZhbGlkIElQdjYgbXVsdGljYXN0IGFkZHJlc3MgaGF2ZSB0aGUgYmluYXJ5IHByZWZpeGVkIHdpdGggMTExMTExMTEgb3IgRkYKLSAgICAgKiAoaGV4KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSwgaWYgdGhlIGFkZHJlc3MgaXMgaW4gdGhlIG11bHRpY2FzdCBncm91cCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYWRkcmVzcyBpcyBpbiB0aGUgbXVsdGljYXN0IGdyb3VwLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aWNhc3RBZGRyZXNzKCkgewpAQCAtMjE3LDEwICsyMjgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgSW5ldEFkZHJlc3MgaXMgdGhlIHVuc3BlY2lmaWVkIGFkZHJlc3MgIjo6Ii4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGEgdW5zcGVjaWZpZWQgd2lsZGNhcmQgYWRkcmVzcyAiOjoiIG9yCisgICAgICogbm90LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCBpZiB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgbXVsdGljYXN0IGdyb3VwLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgd2lsZGNhcmQgYWRkcmVzcywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQW55TG9jYWxBZGRyZXNzKCkgewpAQCAtMjMzLDExICsyNDYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgSW5ldEFkZHJlc3MgaXMgdGhlIGxvb3BiYWNrIGFkZHJlc3MKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIHRoZSBsb29wYmFjayBhZGRyZXNzIG9yIG5vdC4gVGhlIG9ubHkKKyAgICAgKiB2YWxpZCBJUHY2IGxvb3BiYWNrIGFkZHJlc3MgaXMgIjo6MSIuCiAgICAgICogCi0gICAgICogVGhlIHZhbGlkIElQdjYgbG9vcGJhY2sgYWRkcmVzcyBpcyA6OjEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB0aGUgbG9vcGJhY2ssIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyB0aGUgbG9vcGJhY2sgYWRkcmVzcywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTG9vcGJhY2tBZGRyZXNzKCkgewpAQCAtMjU4LDExICsyNzIsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgSW5ldEFkZHJlc3MgaXMgYSBsaW5rLWxvY2FsIGFkZHJlc3MuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWRkcmVzcyBpcyBhIGxpbmstbG9jYWwgYWRkcmVzcyBvciBub3QuIEEgdmFsaWQgSVB2NgorICAgICAqIGxpbmstbG9jYWwgYWRkcmVzcyBpcyBwcmVmaXhlZCB3aXRoIDExMTExMTEwMTAuCiAgICAgICogCi0gICAgICogQSB2YWxpZCBJUHY2IGxpbmstbG9jYWwgYWRkcmVzcyBpcyBwcmVmaXhlZCB3aXRoIDExMTExMTEwMTAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSwgaWYgaXQgaXMgYSBsaW5rLWxvY2FsIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGxpbmstbG9jYWwgYWRkcmVzcywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTGlua0xvY2FsQWRkcmVzcygpIHsKQEAgLTI3MiwxMSArMjg3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRydWUgaWYgdGhlIEluZXRBZGRyZXNzIGlzIGEgc2l0ZS1sb2NhbCBhZGRyZXNzLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaXMgYSBzaXRlLWxvY2FsIGFkZHJlc3Mgb3Igbm90LiBBIHZhbGlkIElQdjYKKyAgICAgKiBzaXRlLWxvY2FsIGFkZHJlc3MgaXMgcHJlZml4ZWQgd2l0aCAxMTExMTExMDExLgogICAgICAqIAotICAgICAqIEEgdmFsaWQgSVB2NiBzaXRlLWxvY2FsIGFkZHJlc3MgaXMgcHJlZml4ZWQgd2l0aCAxMTExMTExMDExCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUsIGlmIGl0IGlzIGEgc2l0ZS1sb2NhbCBhZGRyZXNzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzaXRlLWxvY2FsIGFkZHJlc3MsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NpdGVMb2NhbEFkZHJlc3MoKSB7CkBAIC0yODYsMTIgKzMwMiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0cnVlIGlmIHRoZSBJbmV0QWRkcmVzcyBpcyBhIGdsb2JhbCBtdWx0aWNhc3QgYWRkcmVzcy4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGEgZ2xvYmFsIG11bHRpY2FzdCBhZGRyZXNzIG9yIG5vdC4gQQorICAgICAqIHZhbGlkIElQdjYgZ2xvYmFsIG11bHRpY2FzdCBhZGRyZXNzIGlzIDExMTExMTExeHh4eDExMTAgb3IgRkYwRSBoZXguCiAgICAgICogCi0gICAgICogQSB2YWxpZCBJUHY2IGdsb2JhbCBtdWx0aWNhc3QgYWRkcmVzcyBpcyAxMTExMTExMXh4eHgxMTEwIChpLmUuIEZGMEUpCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUsIGlmIGl0IGlzIGEgZ2xvYmFsIG11bHRpY2FzdCBhZGRyZXNzLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgZ2xvYmFsIG11bHRpY2FzdAorICAgICAqICAgICAgICAgYWRkcmVzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ0dsb2JhbCgpIHsKQEAgLTMwMSwxMyArMzE3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRydWUgaWYgdGhlIEluZXRBZGRyZXNzIGlzIGEgbm9kZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcy4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGEgbm9kZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBvciBub3QuIEEKKyAgICAgKiB2YWxpZCBJUHY2IG5vZGUtbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MgaXMgcHJlZml4ZWQgd2l0aAorICAgICAqIDExMTExMTExeHh4eDAwMDEuCiAgICAgICogCi0gICAgICogQSB2YWxpZCBJUHY2IG5vZGUtbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MgaXMgcHJlZml4ZWQgd2l0aAotICAgICAqIDExMTExMTExeHh4eDAwMDEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSwgaWYgaXQgaXMgYSBub2RlLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgbm9kZS1sb2NhbCBtdWx0aWNhc3QKKyAgICAgKiAgICAgICAgIGFkZHJlc3MsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTUNOb2RlTG9jYWwoKSB7CkBAIC0zMTcsMTMgKzMzMywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0cnVlIGlmIHRoZSBJbmV0QWRkcmVzcyBpcyBhIGxpbmstbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWRkcmVzcyBpcyBhIGxpbmstbG9jYWwgbXVsdGljYXN0IGFkZHJlc3Mgb3Igbm90LiBBCisgICAgICogdmFsaWQgSVB2NiBsaW5rLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzIGlzIHByZWZpeGVkIHdpdGgKKyAgICAgKiAxMTExMTExMXh4eHgwMDEwLgogICAgICAqIAotICAgICAqIEEgdmFsaWQgSVB2NiBsaW5rLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzIGlzIHByZWZpeGVkIHdpdGgKLSAgICAgKiAxMTExMTExMXh4eHgwMDEwCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUsIGlmIGl0IGlzIGEgbGluay1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcywgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGxpbmstbG9jYWwgbXVsdGljYXN0CisgICAgICogICAgICAgICBhZGRyZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01DTGlua0xvY2FsKCkgewpAQCAtMzMzLDEzICszNDksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgSW5ldEFkZHJlc3MgaXMgYSBzaXRlLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaXMgYSBzaXRlLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzIG9yIG5vdC4gQQorICAgICAqIHZhbGlkIElQdjYgc2l0ZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBpcyBwcmVmaXhlZCB3aXRoCisgICAgICogMTExMTExMTF4eHh4MDEwMS4KICAgICAgKiAKLSAgICAgKiBBIHZhbGlkIElQdjYgc2l0ZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBpcyBwcmVmaXhlZCB3aXRoCi0gICAgICogMTExMTExMTF4eHh4MDEwMQotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCBpZiBpdCBpcyBhIHNpdGUtbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzaXRlLWxvY2FsIG11bHRpY2FzdAorICAgICAqICAgICAgICAgYWRkcmVzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ1NpdGVMb2NhbCgpIHsKQEAgLTM0OSwxMyArMzY1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRydWUgaWYgdGhlIEluZXRBZGRyZXNzIGlzIGEgb3JnLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaXMgYSBvcmdhbml6YXRpb24tbG9jYWwgbXVsdGljYXN0IGFkZHJlc3Mgb3IKKyAgICAgKiBub3QuIEEgdmFsaWQgSVB2NiBvcmctbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MgaXMgcHJlZml4ZWQgd2l0aAorICAgICAqIDExMTExMTExeHh4eDEwMDAuCiAgICAgICogCi0gICAgICogQSB2YWxpZCBJUHY2IG9yZy1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBpcyBwcmVmaXhlZCB3aXRoCi0gICAgICogMTExMTExMTF4eHh4MTAwMAotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCBpZiBpdCBpcyBhIG9yZy1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcywgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIG9yZy1sb2NhbCBtdWx0aWNhc3QKKyAgICAgKiAgICAgICAgIGFkZHJlc3MsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTUNPcmdMb2NhbCgpIHsKQEAgLTM2NCwxNiArMzgwLDI0IEBACiAgICAgICAgIHJldHVybiAoaXBhZGRyZXNzWzBdID09IC0xKSAmJiAoaXBhZGRyZXNzWzFdICYgMTUpID09IDg7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIElQIGFkZHJlc3MuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYXMgYSBkb3R0ZWQgc3RyaW5nIGZvcm1hdHRlZCBJUCBhZGRyZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdEFkZHJlc3MoKSB7CiAgICAgICAgIHJldHVybiBJbmV0NlV0aWwuY3JlYXRlSVBBZGRyU3RyaW5nRnJvbUJ5dGVBcnJheShpcGFkZHJlc3MpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxjb2RlPnNjb3BlIGlkPC9jb2RlPiBvZiB0aGlzIGFkZHJlc3MgaWYgaXQgaXMgYXNzb2NpYXRlZAotICAgICAqIHdpdGggYW4gaW50ZXJmYWNlLiBPdGhlcndpc2UgcmV0dXJucyB6ZXJvLgorICAgICAqIEdldHMgdGhlIHNjb3BlIGlkIGFzIGEgbnVtYmVyIGlmIHRoaXMgYWRkcmVzcyBpcyBsaW5rZWQgdG8gYW4gaW50ZXJmYWNlLgorICAgICAqIE90aGVyd2lzZSByZXR1cm5zIHtAY29kZSAwfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzY29wZV9pZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzY29wZV9pZCBvZiB0aGlzIGFkZHJlc3Mgb3IgMCB3aGVuIG5vdCBsaW5rZWQgd2l0aCBhbgorICAgICAqICAgICAgICAgaW50ZXJmYWNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U2NvcGVJZCgpIHsKICAgICAgICAgaWYgKHNjb3BlX2lkX3NldCkgewpAQCAtMzgzLDEwICs0MDcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpZiB0aGlzIGFkZHJlc3MgaXMgaW5zdGFuY2VkIHdpdGggYSBzY29wZWQKLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4gT3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KKyAgICAgKiBHZXRzIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpZiB0aGlzIGFkZHJlc3MgaXMgaW5zdGFuY2VkIHdpdGggYSBzY29wZWQKKyAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4gT3RoZXJ3aXNlIHJldHVybnMge0Bjb2RlIG51bGx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNjb3BlZCBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzY29wZWQgbmV0d29yayBpbnRlcmZhY2Ugb2YgdGhpcyBhZGRyZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOZXR3b3JrSW50ZXJmYWNlIGdldFNjb3BlZEludGVyZmFjZSgpIHsKICAgICAgICAgaWYgKHNjb3BlX2lmbmFtZV9zZXQpIHsKQEAgLTM5Niw5ICs0MjEsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNoY29kZSBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogR2V0cyB0aGUgaGFzaGNvZGUgb2YgdGhlIHJlcHJlc2VudGVkIElQIGFkZHJlc3MuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBoYXNoY29kZSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtNDA3LDEyICs0MzMsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgb2JqIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIElQdjYgYWRkcmVzcyBhbmQgdGhleSBoYXZlCi0gICAgICogdGhlIHNhbWUgSVAgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlLiB0aGUgc2NvcGUgaWQgZG9lcyBub3Qgc2VlbSB0byBiZQotICAgICAqIHBhcnQgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKiBDb21wYXJlcyB0aGlzIGluc3RhbmNlIHdpdGggdGhlIElQIGFkZHJlc3MgaW4gdGhlIG9iamVjdCB7QGNvZGUgb2JqfSBhbmQKKyAgICAgKiByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGV5IGFyZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCByZXByZXNlbnQgdGhlIHNhbWUKKyAgICAgKiBJUCBhZGRyZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4gVGhlIHNjb3BlIGlkIGRvZXMgbm90IHNlZW0gdG8gYmUKKyAgICAgKiBwYXJ0IG9mIHRoZSBjb21wYXJpc29uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICogCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQgZm9yIGVxdWFsaXR5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhZGRyZXNzZXMgYXJlIGVxdWFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtNDIwLDggKzQ0OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuIElQdjQgY29tcGF0aWJsZSBhZGRyZXNzIGlzIHByZWZpeGVkIHdpdGggOTYgYml0cyBvZiAwJ3MuIFRoZSBsYXN0Ci0gICAgICogMzItYml0cyBhcmUgdmFyaWVkIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgMzItYml0IElQdjQgYWRkcmVzcyBzcGFjZS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIElQdjQgY29tcGF0aWJsZSBvciBub3QuIEFuIElQdjQKKyAgICAgKiBjb21wYXRpYmxlIGFkZHJlc3MgaXMgcHJlZml4ZWQgd2l0aCA5NiBiaXRzIG9mIDAncy4gVGhlIGxhc3QgMzItYml0cyBhcmUKKyAgICAgKiB2YXJpZWQgY29ycmVzcG9uZGluZyB3aXRoIHRoZSAzMi1iaXQgSVB2NCBhZGRyZXNzIHNwYWNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhbiBJUHY0IGNvbXBhdGlibGUKKyAgICAgKiAgICAgICAgIGFkZHJlc3MsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSVB2NENvbXBhdGlibGVBZGRyZXNzKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspIHsKQEAgLTQ2OCwxMCArNTAyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogYWRkcmVzcy4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICogSVAgYWRkcmVzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgZGVzY3JpcHRpb24sIGFzIGhvc3QvYWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uLCBhcyBob3N0L2FkZHJlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9JbmV0QWRkcmVzcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXRBZGRyZXNzLmphdmEKaW5kZXggZTAwYWUwYi4uMDkxMjcxMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXRBZGRyZXNzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXRBZGRyZXNzLmphdmEKQEAgLTM3LDkgKzM3LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Qcml2aUFjdGlvbjsKIAogLyoqCi0gKiBUaGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBhZGRyZXNzIGNsYXNzLiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbiBJUAotICogYWRkcmVzcyBhbmQgcHJvdmlkZXMgbmFtZSBhbmQgcmV2ZXJzZSBuYW1lIHJlc29sdXRpb24gZnVuY3Rpb25zLiBUaGUgYWRkcmVzcwotICogaXMgc3RvcmVkIGluIG5ldHdvcmsgb3JkZXIsIGJ1dCBhcyBhIHNpZ25lZCAocmF0aGVyIHRoYW4gdW5zaWduZWQpIGludGVnZXIuCisgKiBUaGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBhZGRyZXNzIHJlcHJlc2VudGF0aW9uIGNsYXNzLiBUaGlzIGNsYXNzCisgKiBlbmNhcHN1bGF0ZXMgYW4gSVAgYWRkcmVzcyBhbmQgcHJvdmlkZXMgbmFtZSBhbmQgcmV2ZXJzZSBuYW1lIHJlc29sdXRpb24KKyAqIGZ1bmN0aW9ucy4gVGhlIGFkZHJlc3MgaXMgc3RvcmVkIGluIG5ldHdvcmsgb3JkZXIsIGJ1dCBhcyBhIHNpZ25lZCAocmF0aGVyCisgKiB0aGFuIHVuc2lnbmVkKSBpbnRlZ2VyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEluZXRBZGRyZXNzIGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIApAQCAtNTgsNiArNjEsMTMgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyODYzMTY3NjQ5MTAzMTY1MDdMOwogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgIC8qKgorICAgICAqIGRlZmF1bHQgdGltZS10by1saXZlIGZvciBETlMgY2FjaGUgZW50cmllczsgNjAwIHNlY29uZHMgPT0gMTAgbWludXRlcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05FVEFERFJfQ0FDSEVfVFRMX1NFQ1MgPSAiNjAwIjsKKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAorCiAgICAgU3RyaW5nIGhvc3ROYW1lOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2FpdFJlYWNoYWJsZSB7CkBAIC05MCwxMSArMTAwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBJbmV0QWRkcmVzcywgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5hZGRyZXNzPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5ob3N0TmFtZTwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhbiB7QGNvZGUgSW5ldEFkZHJlc3N9LCByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBhZGRyZXNzfSBhbmQKKyAgICAgKiB7QGNvZGUgaG9zdE5hbWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICogICAgICAgICAgICBuZXR3b3JrIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXR3b3JrIGFkZHJlc3MuCiAgICAgICovCiAgICAgSW5ldEFkZHJlc3MoYnl0ZVtdIGFkZHJlc3MpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTEwMiwxMSArMTEyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBJbmV0QWRkcmVzcywgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5hZGRyZXNzPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5ob3N0TmFtZTwvY29kZT4uCisgICAgICogQ29uc3RydWN0cyBhbiB7QGNvZGUgSW5ldEFkZHJlc3N9LCByZXByZXNlbnRpbmcgdGhlIHtAY29kZSBhZGRyZXNzfSBhbmQKKyAgICAgKiB7QGNvZGUgaG9zdE5hbWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICogICAgICAgICAgICBuZXR3b3JrIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXR3b3JrIGFkZHJlc3MuCiAgICAgICovCiAgICAgSW5ldEFkZHJlc3MoYnl0ZVtdIGFkZHJlc3MsIFN0cmluZyBob3N0TmFtZSkgewogICAgICAgICBzdXBlcigpOwpAQCAtMTE1LDExICsxMjUsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBhcmd1bWVudCA8Y29kZT5hZGRyPC9jb2RlPiBhcyBhbiBhcnJheS4KLSAgICAgKiBUaGUgZWxlbWVudHMgYXJlIGluIG5ldHdvcmsgb3JkZXIgKHRoZSBoaWdoZXN0IG9yZGVyIGFkZHJlc3MgYnl0ZSBpcyBpbgotICAgICAqIHRoZSB6ZXJvLXRoIGVsZW1lbnQpLgorICAgICAqIFJldHVybnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGFyZ3VtZW50IHtAY29kZSBhZGRyfSBhcyBhIGJ5dGUgYXJyYXkuIFRoZQorICAgICAqIGVsZW1lbnRzIGFyZSBpbiBuZXR3b3JrIG9yZGVyICh0aGUgaGlnaGVzdCBvcmRlciBhZGRyZXNzIGJ5dGUgaXMgaW4gdGhlCisgICAgICogemVyb3RoIGVsZW1lbnQpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYnl0ZVtdIHRoZSBuZXR3b3JrIGFkZHJlc3MgYXMgYSBieXRlIGFycmF5CisgICAgICogQHJldHVybiB0aGUgbmV0d29yayBhZGRyZXNzIGFzIGEgYnl0ZSBhcnJheS4KICAgICAgKi8KICAgICBzdGF0aWMgYnl0ZVtdIGFkZHJlc3NPZihpbnQgYWRkcikgewogICAgICAgICBpbnQgdGVtcCA9IGFkZHI7CkBAIC0xMzYsMTEgKzE0NiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgPGNvZGU+SW5ldEFkZHJlc3M8L2NvZGU+IGFnYWluc3QgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogQ29tcGFyZXMgdGhpcyB7QGNvZGUgSW5ldEFkZHJlc3N9IGluc3RhbmNlIGFnYWluc3QgdGhlIHNwZWNpZmllZCBhZGRyZXNzCisgICAgICogaW4ge0Bjb2RlIG9ian0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQgZm9yIGVxdWFsaXR5Ci0gICAgICogQHJldHVybiBib29sZWFuIHRydWUsIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQgZm9yIGVxdWFsaXR5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJvdGggb2JqZWN0cyBhcmUgZXF1YWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CkBAIC0xNjIsMjggKzE3NCwzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhpcyA8Y29kZT5JbmV0QWRkcmVzczwvY29kZT4gYXMgYW4gYXJyYXkuCi0gICAgICogVGhlIGVsZW1lbnRzIGFyZSBpbiBuZXR3b3JrIG9yZGVyICh0aGUgaGlnaGVzdCBvcmRlciBhZGRyZXNzIGJ5dGUgaXMgaW4KLSAgICAgKiB0aGUgemVyby10aCBlbGVtZW50KS4KKyAgICAgKiBSZXR1cm5zIHRoZSBJUCBhZGRyZXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIEluZXRBZGRyZXNzfSBpbnN0YW5jZQorICAgICAqIGFzIGEgYnl0ZSBhcnJheS4gVGhlIGVsZW1lbnRzIGFyZSBpbiBuZXR3b3JrIG9yZGVyICh0aGUgaGlnaGVzdCBvcmRlcgorICAgICAqIGFkZHJlc3MgYnl0ZSBpcyBpbiB0aGUgemVyb3RoIGVsZW1lbnQpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYnl0ZVtdIHRoZSBhZGRyZXNzIGFzIGEgYnl0ZSBhcnJheQorICAgICAqIEByZXR1cm4gdGhlIGFkZHJlc3MgaW4gZm9ybSBvZiBhIGJ5dGUgYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRBZGRyZXNzKCkgewogICAgICAgICByZXR1cm4gaXBhZGRyZXNzLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBJUCBhZGRyZXNzZXMgb2YgYSBuYW1lZCBob3N0LiBUaGUgaG9zdCBuYW1lIG1heSBlaXRoZXIgYmUgYQotICAgICAqIG1hY2hpbmUgbmFtZSBvciBhIGRvdHRlZCBzdHJpbmcgSVAgYWRkcmVzcy4gSWYgdGhlIGhvc3QgbmFtZSBpcyBlbXB0eSBvcgotICAgICAqIG51bGwsIGFuIFVua25vd25Ib3N0RXhjZXB0aW9uIGlzIHRocm93bi4gSWYgdGhlIGhvc3QgbmFtZSBpcyBhIGRvdHRlZCBJUAotICAgICAqIHN0cmluZywgYW4gYXJyYXkgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzaW5nbGUgSW5ldEFkZHJlc3MgaXMgcmV0dXJuZWQuCisgICAgICogR2V0cyBhbGwgSVAgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ge0Bjb2RlIGhvc3R9IGlkZW50aWZpZWQKKyAgICAgKiBieSBuYW1lIG9yIElQIGFkZHJlc3MgaW4gZG90LW5vdGF0aW9uLiBUaGUgSVAgYWRkcmVzcyBpcyByZXNvbHZlZCBieSB0aGUKKyAgICAgKiBjb25maWd1cmVkIG5hbWUgc2VydmljZS4gSWYgdGhlIGhvc3QgbmFtZSBpcyBlbXB0eSBvciB7QGNvZGUgbnVsbH0gYW4KKyAgICAgKiB7QGNvZGUgVW5rbm93bkhvc3RFeGNlcHRpb259IGlzIHRocm93bi4gSWYgdGhlIGhvc3QgbmFtZSBpcyBhIGRvdHRlZCBJUAorICAgICAqIGFkZHJlc3Mgc3RyaW5nIGFuIGFycmF5IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgc2luZ2xlIHtAY29kZSBJbmV0QWRkcmVzc30KKyAgICAgKiBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaG9zdAotICAgICAqICAgICAgICAgICAgdGhlIGhvc3ROYW1lIHRvIGJlIHJlc29sdmVkIHRvIGFuIGFkZHJlc3MKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEluZXRBZGRyZXNzW10gYW4gYXJyYXkgb2YgYWRkcmVzc2VzIGZvciB0aGUgaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIGhvc3QncyBuYW1lIG9yIElQIHRvIGJlIHJlc29sdmVkIHRvIGFuIGFkZHJlc3MuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGhvc3QuCiAgICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhZGRyZXNzIGxvb2t1cCBmYWlscworICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhZGRyZXNzIGxvb2t1cCBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEluZXRBZGRyZXNzW10gZ2V0QWxsQnlOYW1lKFN0cmluZyBob3N0KQogICAgICAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKQEAgLTI1NCwxNiArMjY5LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIGhvc3QsIGdpdmVuIGEgaG9zdCBzdHJpbmcgbmFtZS4gVGhlIGhvc3Qgc3RyaW5nCi0gICAgICogbWF5IGJlIGVpdGhlciBhIG1hY2hpbmUgbmFtZSBvciBhIGRvdHRlZCBzdHJpbmcgSVAgYWRkcmVzcy4gSWYgdGhlCi0gICAgICogbGF0dGVyLCB0aGUgaG9zdE5hbWUgZmllbGQgd2lsbCBiZSBkZXRlcm1pbmVkIHVwb24gZGVtYW5kLgorICAgICAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgYSBob3N0IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gaG9zdCBzdHJpbmcgbmFtZQorICAgICAqIHtAY29kZSBob3N0fS4gVGhlIGhvc3Qgc3RyaW5nIG1heSBiZSBlaXRoZXIgYSBtYWNoaW5lIG5hbWUgb3IgYSBkb3R0ZWQKKyAgICAgKiBzdHJpbmcgSVAgYWRkcmVzcy4gSWYgdGhlIGxhdHRlciwgdGhlIHtAY29kZSBob3N0TmFtZX0gZmllbGQgaXMKKyAgICAgKiBkZXRlcm1pbmVkIHVwb24gZGVtYW5kLiB7QGNvZGUgaG9zdH0gY2FuIGJlIHtAY29kZSBudWxsfSB3aGljaCBtZWFucyB0aGF0CisgICAgICogYW4gYWRkcmVzcyBvZiB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIGlzIHJldHVybmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBob3N0Ci0gICAgICogICAgICAgICAgICB0aGUgaG9zdE5hbWUgdG8gYmUgcmVzb2x2ZWQgdG8gYW4gYWRkcmVzcwotICAgICAqIEByZXR1cm4gSW5ldEFkZHJlc3MgdGhlIEluZXRBZGRyZXNzIHJlcHJlc2VudGluZyB0aGUgaG9zdAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGhvc3ROYW1lIHRvIGJlIHJlc29sdmVkIHRvIGFuIGFkZHJlc3Mgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBJbmV0QWRkcmVzc30gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBob3N0LgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBsb29rdXAgZmFpbHMKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBsb29rdXAgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbmV0QWRkcmVzcyBnZXRCeU5hbWUoU3RyaW5nIGhvc3QpCiAgICAgICAgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewpAQCAtMjkxLDE4ICszMDgsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGRvdHRlZCBzdHJpbmcgSVAgYWRkcmVzcyByZXByZXNlbnRpbmcgdGhpcyBhZGRyZXNzLgorICAgICAqIEdldHMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJUCBhZGRyZXNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb3JyZXNwb25kaW5nIGRvdHRlZCBzdHJpbmcgSVAgYWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBob3N0IGFkZHJlc3MgaW4gZm9ybSBvZiBhCisgICAgICogICAgICAgICBkb3R0ZWQgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdEFkZHJlc3MoKSB7CiAgICAgICAgIHJldHVybiBpbmV0TnRvYUltcGwoYnl0ZXNUb0ludChpcGFkZHJlc3MsIDApKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGhvc3QgbmFtZS4KKyAgICAgKiBHZXRzIHRoZSBob3N0IG5hbWUgb2YgdGhpcyBJUCBhZGRyZXNzLiBJZiB0aGUgSVAgYWRkcmVzcyBjb3VsZCBub3QgYmUKKyAgICAgKiByZXNvbHZlZCwgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gaW4gYSBkb3R0ZWQtcXVhZC1ub3RhdGlvbiBpcworICAgICAqIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZyBuYW1lCisgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcgbmFtZSBvZiB0aGlzIElQIGFkZHJlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTMzNyw5ICszNTksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVybmV0IGFkZHJlc3MKKyAgICAgKiBHZXRzIHRoZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgZm9yIHRoZSBob3N0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElQCisgICAgICogYWRkcmVzcy4gSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIHNldCwgaXQgaXMgY2hlY2tlZCBpZiB0aGUgbWV0aG9kIGNhbGxlcgorICAgICAqIGlzIGFsbG93ZWQgdG8gZ2V0IHRoZSBob3N0bmFtZS4gT3RoZXJ3aXNlLCB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBpbgorICAgICAqIGEgZG90dGVkLXF1YWQtbm90YXRpb24gaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhvc3QgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBvZiB0aGlzIElQIGFkZHJlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDYW5vbmljYWxIb3N0TmFtZSgpIHsKICAgICAgICAgU3RyaW5nIGNhbm9uaWNhbE5hbWU7CkBAIC0zNjgsMTIgKzM5NCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgbG9jYWwgaG9zdCwgaWYgYWxsb3dlZCBieSB0aGUgc2VjdXJpdHkgcG9saWN5LiBPdGhlcndpc2UsCi0gICAgICogYW5zd2VyIHRoZSBsb29wYmFjayBhZGRyZXNzIHdoaWNoIGFsbG93cyB0aGlzIG1hY2hpbmUgdG8gYmUgY29udGFjdGVkLgorICAgICAqIEdldHMgdGhlIGxvY2FsIGhvc3QgYWRkcmVzcyBpZiB0aGUgc2VjdXJpdHkgcG9saWN5IGFsbG93cyB0aGlzLgorICAgICAqIE90aGVyd2lzZSwgZ2V0cyB0aGUgbG9vcGJhY2sgYWRkcmVzcyB3aGljaCBhbGxvd3MgdGhpcyBtYWNoaW5lIHRvIGJlCisgICAgICogY29udGFjdGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHJldHVybnMgYWx3YXlzIHRoZSBsb29wYmFjayBhZGRyZXNzLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEluZXRBZGRyZXNzIHRoZSBJbmV0QWRkcmVzcyByZXByZXNlbnRpbmcgdGhlIGxvY2FsIGhvc3QKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgSW5ldEFkZHJlc3N9IHJlcHJlc2VudGluZyB0aGUgbG9jYWwgaG9zdC4KICAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGFkZHJlc3MgbG9va3VwIGZhaWxzCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFkZHJlc3MgbG9va3VwIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0TG9jYWxIb3N0KCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0zOTQsOSArNDI1LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIGEgaGFzaGNvZGUgZm9yIHRoaXMgSVAgYWRkcmVzcy4KKyAgICAgKiBHZXRzIHRoZSBoYXNoY29kZSBvZiB0aGUgcmVwcmVzZW50ZWQgSVAgYWRkcmVzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgaGFzaGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBoYXNoY29kZSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtNDA0LDkgKzQzNiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0cnVlIGlmIHRoZSBJbmV0QWRkcmVzcyBpcyBhbiBJUCBtdWx0aWNhc3QgYWRkcmVzcy4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGFuIElQIG11bHRpY2FzdCBhZGRyZXNzIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSwgaWYgdGhlIGFkZHJlc3MgaXMgaW4gdGhlIG11bHRpY2FzdCBncm91cAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYWRkcmVzcyBpcyBpbiB0aGUgbXVsdGljYXN0IGdyb3VwLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aWNhc3RBZGRyZXNzKCkgewogICAgICAgICByZXR1cm4gKChpcGFkZHJlc3NbMF0gJiAyNTUpID4+PiA0KSA9PSAweEU7CkBAIC00MTYsOSArNDUwLDExIEBACiAgICAgICAgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewogICAgICAgICBpbnQgdHRsID0gLTE7CiAKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIFN0cmluZyB0dGxWYWx1ZSA9IEFjY2Vzc0NvbnRyb2xsZXIKICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aUFjdGlvbjxTdHJpbmc+KAotICAgICAgICAgICAgICAgICAgICAgICAgIm5ldHdvcmthZGRyZXNzLmNhY2hlLnR0bCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICAgICAgIm5ldHdvcmthZGRyZXNzLmNhY2hlLnR0bCIsIERFRkFVTFRfTkVUQUREUl9DQUNIRV9UVExfU0VDUykpOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmICh0dGxWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHRsID0gSW50ZWdlci5kZWNvZGUodHRsVmFsdWUpLmludFZhbHVlKCk7CkBAIC00MzEsMTIgKzQ2NywxNCBAQAogICAgICAgICAgICAgQ2FjaGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVsZW1lbnQgPSBDYWNoZS5nZXQoaG9zdCk7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgdHRsID4gMCkgewogICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSBTeXN0ZW0ubmFub1RpbWUoKSAtIGVsZW1lbnQubmFub1RpbWVBZGRlZDsKICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiBzZWNvbmRzVG9OYW5vcyh0dGwpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQogICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pbmV0QWRkcmVzcygpOwpAQCAtNDYxLDIzICs0OTksMjUgQEAKICAgICAgICAgcmV0dXJuIGFuSW5ldEFkZHJlc3M7CiAgICAgfQogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgLyoqCiAgICAgICogTXVsdGlwbGllcyB2YWx1ZSBieSAxIGJpbGxpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNlY29uZHNUb05hbm9zKGludCB0dGwpIHsKLSAgICAgICAgcmV0dXJuIHR0bCAqIDEwMDAwMDAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzZWNvbmRzVG9OYW5vcyhpbnQgdHRsKSB7CisgICAgICAgIHJldHVybiAobG9uZykgdHRsICogMTAwMDAwMDAwMDsKICAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCiAgICAgICogUXVlcnkgdGhlIElQIHN0YWNrIGZvciBhbGlhc2VzIGZvciB0aGUgaG9zdC4gVGhlIGhvc3QgaXMgaW4gc3RyaW5nIG5hbWUKLSAgICAgKiBmb3JtLiBJZiB0aGUgaG9zdCBkb2VzIG5vdCBoYXZlIGFsaWFzZXMgKG9ubHkgbXVsdGktaG9tZWQgaG9zdHMgZG8pLCAKLSAgICAgKiBhbnN3ZXIgYW4gYXJyYXkgd2l0aCBhIHNpbmdsZSBJbmV0QWRkcmVzcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBob3N0IAotICAgICAqIG5hbWUgJiBhZGRyZXNzLgorICAgICAqIGZvcm0uIElmIHRoZSBob3N0IGRvZXMgbm90IGhhdmUgYWxpYXNlcyAob25seSBtdWx0aWhvbWVkIGhvc3RzIGRvKSwKKyAgICAgKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhIHNpbmdsZSB7QGNvZGUgSW5ldEFkZHJlc3N9IGNvbnN0cnVjdGVkIGZyb20gdGhlCisgICAgICogaG9zdCBuYW1lICYgYWRkcmVzcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGhvc3QgbmFtZSB0byBsb29rdXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUgdG8gbG9va3VwLgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvb2t1cAorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbG9va3VwLgogICAgICAqLwogICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIC8vIHN0YXRpYyBuYXRpdmUgSW5ldEFkZHJlc3NbXSBnZXRBbGlhc2VzQnlOYW1lSW1wbChTdHJpbmcgbmFtZSkKQEAgLTUxNywxNCArNTU3LDE0IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZ1tdIGdldGFsaWFzZXNieW5hbWUoU3RyaW5nIG5hbWUpOwogICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKLSAgICAKKwogICAgIC8qKgogICAgICAqIFF1ZXJ5IHRoZSBJUCBzdGFjayBmb3IgdGhlIGhvc3QgYWRkcmVzcy4gVGhlIGhvc3QgaXMgaW4gYWRkcmVzcyBmb3JtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICB0aGUgaG9zdCBhZGRyZXNzIHRvIGxvb2t1cAorICAgICAqICAgICAgICAgICAgdGhlIGhvc3QgYWRkcmVzcyB0byBsb29rdXAuCiAgICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbG9va3VwCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBsb29rdXAuCiAgICAgICovCiAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgLy8gc3RhdGljIG5hdGl2ZSBJbmV0QWRkcmVzcyBnZXRIb3N0QnlBZGRySW1wbChieXRlW10gYWRkcikKQEAgLTU0OSwxNCArNTg5LDE0IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRob3N0YnlhZGRyKFN0cmluZyBhZGRyKTsKICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCi0gICAgCisKICAgICBzdGF0aWMgaW50IGluZXRBZGRyKFN0cmluZyBob3N0KSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gKGhvc3QuZXF1YWxzKCIyNTUuMjU1LjI1NS4yNTUiKSkgPyAweEZGRkZGRkZGIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICA6IGluZXRBZGRySW1wbChob3N0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gSXB2NCBJbnRlcm5ldCBQcm90b2NvbCBkb3R0ZWQgYWRkcmVzcyBpbnRvCisgICAgICogQ29udmVydCBhIHN0cmluZyBjb250YWluaW5nIGFuIElQdjQgSW50ZXJuZXQgUHJvdG9jb2wgZG90dGVkIGFkZHJlc3MgaW50bwogICAgICAqIGEgYmluYXJ5IGFkZHJlc3MuIE5vdGUsIHRoZSBzcGVjaWFsIGNhc2Ugb2YgJzI1NS4yNTUuMjU1LjI1NScgdGhyb3dzIGFuCiAgICAgICogZXhjZXB0aW9uLCBzbyB0aGlzIHZhbHVlIHNob3VsZCBub3QgYmUgdXNlZCBhcyBhbiBhcmd1bWVudC4gU2VlIGFsc28KICAgICAgKiBpbmV0QWRkcihTdHJpbmcpLgpAQCAtNjAxLDcgKzY0MSw2IEBACiAgICAgICogQHBhcmFtIHByZWZlcklQdjZBZGRyZXNzZXMKICAgICAgKiAgICAgICAgICAgIGFkZHJlc3MgcHJlZmVyZW5jZSBpZiB1bmRlcmx5aW5nIHBsYXRmb3JtIGlzIFY0L1Y2CiAgICAgICogQHJldHVybiBJbmV0QWRkcmVzcyB0aGUgaG9zdCBhZGRyZXNzCi0gICAgICogCiAgICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbG9va3VwCiAgICAgICovCkBAIC02MjcsNyArNjY2LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBnZXRob3N0YnluYW1lKFN0cmluZyBob3N0LCBieXRlW10gYWRkcik7CiAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAotICAgIAorCiAgICAgLyoqCiAgICAgICogUXVlcnkgdGhlIElQIHN0YWNrIGZvciB0aGUgaG9zdCBtYWNoaW5lIG5hbWUuCiAgICAgICogCkBAIC02NDcsNyArNjg2LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldGhvc3RuYW1lKCk7CiAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAotICAgIAorCiAgICAgc3RhdGljIFN0cmluZyBnZXRIb3N0TmFtZUludGVybmFsKFN0cmluZyBob3N0KSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewogICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IDAgPT0gaG9zdC5sZW5ndGgoKSkgewogICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzLkxPT1BCQUNLLmdldEhvc3RBZGRyZXNzKCk7CkBAIC02NTksMTAgKzY5OCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIGFkZHJlc3MuCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIElQIGFkZHJlc3MuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGRlc2NyaXB0aW9uLCBhcyBob3N0L2FkZHJlc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiwgYXMgaG9zdC9hZGRyZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC02NzAsNyArNzEwLDkgQEAKICAgICB9CiAKICAgICBjbGFzcyBDYWNoZUVsZW1lbnQgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgbG9uZyBuYW5vVGltZUFkZGVkID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgICAgICBDYWNoZUVsZW1lbnQgbmV4dDsKIApAQCAtNzU2LDcgKzc5OCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIGhvc3QgbmFtZSwgZmFsc2UgaWYgaXQgaXMgYW4gSVAgQWRkcmVzcy4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIGhvc3QgbmFtZSwgZmFsc2UgaWYgaXQgaXMgYW4gSVAgQWRkcmVzcy4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSG9zdE5hbWUoU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIHJldHVybiAhKEluZXQ2VXRpbC5pc1ZhbGlkSVBWNEFkZHJlc3ModmFsdWUpIHx8IEluZXQ2VXRpbApAQCAtNzY0LDE2MyArODA2LDIxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcCBiYWNrIGFkZHJlc3MuIFZhbGlkIElQdjQgbG9vcGJhY2sKLSAgICAgKiBhZGRyZXNzZXMgYXJlIDEyNy5kLmQuZCBWYWxpZCBJUHY2IGxvb3BiYWNrIGFkZHJlc3MgaXMgOjoxCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWRkcmVzcyBpcyBhIGxvb3BiYWNrIGFkZHJlc3Mgb3Igbm90LiBUaGlzCisgICAgICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBhbHdheXMge0Bjb2RlIGZhbHNlfS4gVmFsaWQgSVB2NCBsb29wYmFjaworICAgICAqIGFkZHJlc3NlcyBhcmUgMTI3LmQuZC5kIFRoZSBvbmx5IHZhbGlkIElQdjYgbG9vcGJhY2sgYWRkcmVzcyBpcyA6OjEuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgbG9vcGJhY2sgYWRkcmVzcywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzTG9vcGJhY2tBZGRyZXNzKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbGluayBsb2NhbCBhZGRyZXNzLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaXMgYSBsaW5rLWxvY2FsIGFkZHJlc3Mgb3Igbm90LiBUaGlzCisgICAgICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBhbHdheXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cD4KKyAgICAgKiBWYWxpZCBJUHY2IGxpbmstbG9jYWwgYWRkcmVzc2VzIGFyZSBGRTgwOjowIHRocm91Z2ggdG8KKyAgICAgKiBGRUJGOkZGRkY6RkZGRjpGRkZGOkZGRkY6RkZGRjpGRkZGOkZGRkYuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZXJlIGFyZSBubyB2YWxpZCBJUHY0IGxpbmstbG9jYWwgYWRkcmVzc2VzLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBWYWxpZCBJUHY2IGxpbmsgbG9jYWwgYWRkcmVzc2VzIGFyZSBGRTgwOjowIHRocm91Z2ggdG8KLSAgICAgKiBGRUJGOkZGRkY6RkZGRjpGRkZGOkZGRkY6RkZGRjpGRkZGOkZGRkYKLSAgICAgKiAKLSAgICAgKiBUaGVyZSBhcmUgbm8gdmFsaWQgSVB2NCBsaW5rIGxvY2FsIGFkZHJlc3Nlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBsaW5rLWxvY2FsIGFkZHJlc3MsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmtMb2NhbEFkZHJlc3MoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBzaXRlIGxvY2FsIGFkZHJlc3MuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWRkcmVzcyBpcyBhIHNpdGUtbG9jYWwgYWRkcmVzcyBvciBub3QuIFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwPgorICAgICAqIFZhbGlkIElQdjYgc2l0ZS1sb2NhbCBhZGRyZXNzZXMgYXJlIEZFQzA6OjAgdGhyb3VnaCB0bworICAgICAqIEZFRkY6RkZGRjpGRkZGOkZGRkY6RkZGRjpGRkZGOkZGRkY6RkZGRi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlcmUgYXJlIG5vIHZhbGlkIElQdjQgc2l0ZS1sb2NhbCBhZGRyZXNzZXMuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIFZhbGlkIElQdjYgbGluayBsb2NhbCBhZGRyZXNzZXMgYXJlIEZFQzA6OjAgdGhyb3VnaCB0bwotICAgICAqIEZFRkY6RkZGRjpGRkZGOkZGRkY6RkZGRjpGRkZGOkZGRkY6RkZGRgotICAgICAqIAotICAgICAqIFRoZXJlIGFyZSBubyB2YWxpZCBJUHY0IHNpdGUgbG9jYWwgYWRkcmVzc2VzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHNpdGUtbG9jYWwgYWRkcmVzcywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2l0ZUxvY2FsQWRkcmVzcygpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIGdsb2JhbCBtdWx0aWNhc3QgYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBWYWxpZCBJUHY2IGxpbmsgZ2xvYmFsIG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIEZGeEU6LzExMiB3aGVyZSB4IGlzIGEgc2V0CisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWRkcmVzcyBpcyBhIGdsb2JhbCBtdWx0aWNhc3QgYWRkcmVzcyBvciBub3QuIFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwPgorICAgICAqIFZhbGlkIElQdjYgbGluay1nbG9iYWwgbXVsdGljYXN0IGFkZHJlc3NlcyBhcmUgRkZ4RTovMTEyIHdoZXJlIHggaXMgYSBzZXQKICAgICAgKiBvZiBmbGFncywgYW5kIHRoZSBhZGRpdGlvbmFsIDExMiBiaXRzIG1ha2UgdXAgdGhlIGdsb2JhbCBtdWx0aWNhc3QKLSAgICAgKiBhZGRyZXNzIHNwYWNlCi0gICAgICogCisgICAgICogYWRkcmVzcyBzcGFjZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CiAgICAgICogVmFsaWQgSVB2NCBnbG9iYWwgbXVsdGljYXN0IGFkZHJlc3NlcyBhcmUgYmV0d2VlbjogMjI0LjAuMS4wIHRvCi0gICAgICogMjM4LjI1NS4yNTUuMjU1CisgICAgICogMjM4LjI1NS4yNTUuMjU1LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBnbG9iYWwgbXVsdGljYXN0CisgICAgICogICAgICAgICBhZGRyZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc01DR2xvYmFsKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbm9kZSBsb2NhbCBtdWx0aWNhc3QgYWRkcmVzcy4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGEgbm9kZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBvciBub3QuCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwPgorICAgICAqIFZhbGlkIElQdjYgbm9kZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzc2VzIGFyZSBGRngxOi8xMTIgd2hlcmUgeCBpcyBhIHNldAorICAgICAqIG9mIGZsYWdzLCBhbmQgdGhlIGFkZGl0aW9uYWwgMTEyIGJpdHMgbWFrZSB1cCB0aGUgbm9kZS1sb2NhbCBtdWx0aWNhc3QKKyAgICAgKiBhZGRyZXNzIHNwYWNlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGVyZSBhcmUgbm8gdmFsaWQgSVB2NCBub2RlLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzZXMuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIFZhbGlkIElQdjYgbm9kZSBsb2NhbCBtdWx0aWNhc3QgYWRkcmVzc2VzIGFyZSBGRngxOi8xMTIgd2hlcmUgeCBpcyBhIHNldAotICAgICAqIG9mIGZsYWdzLCBhbmQgdGhlIGFkZGl0aW9uYWwgMTEyIGJpdHMgbWFrZSB1cCB0aGUgbm9kZSBsb2NhbCBtdWx0aWNhc3QKLSAgICAgKiBhZGRyZXNzIHNwYWNlCi0gICAgICogCi0gICAgICogVGhlcmUgYXJlIG5vIHZhbGlkIElQdjQgbm9kZSBsb2NhbCBtdWx0aWNhc3QgYWRkcmVzc2VzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIG5vZGUtbG9jYWwgbXVsdGljYXN0CisgICAgICogICAgICAgICBhZGRyZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc01DTm9kZUxvY2FsKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbGluayBsb2NhbCBtdWx0aWNhc3QgYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBWYWxpZCBJUHY2IGxpbmsgbG9jYWwgbXVsdGljYXN0IGFkZHJlc3NlcyBhcmUgRkZ4MjovMTEyIHdoZXJlIHggaXMgYSBzZXQKLSAgICAgKiBvZiBmbGFncywgYW5kIHRoZSBhZGRpdGlvbmFsIDExMiBiaXRzIG1ha2UgdXAgdGhlIG5vZGUgbG9jYWwgbXVsdGljYXN0Ci0gICAgICogYWRkcmVzcyBzcGFjZQotICAgICAqIAorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFkZHJlc3MgaXMgYSBsaW5rLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzIG9yIG5vdC4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYWx3YXlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPHA+CisgICAgICogVmFsaWQgSVB2NiBsaW5rLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIEZGeDI6LzExMiB3aGVyZSB4IGlzIGEgc2V0CisgICAgICogb2YgZmxhZ3MsIGFuZCB0aGUgYWRkaXRpb25hbCAxMTIgYml0cyBtYWtlIHVwIHRoZSBsaW5rLWxvY2FsIG11bHRpY2FzdAorICAgICAqIGFkZHJlc3Mgc3BhY2UuCisgICAgICogPC9wPgorICAgICAqIDxwPgogICAgICAqIFZhbGlkIElQdjQgbGluay1sb2NhbCBhZGRyZXNzZXMgYXJlIGJldHdlZW46IDIyNC4wLjAuMCB0byAyMjQuMC4wLjI1NQorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBsaW5rLWxvY2FsIG11bHRpY2FzdAorICAgICAqICAgICAgICAgYWRkcmVzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ0xpbmtMb2NhbCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIHNpdGUgbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MuCi0gICAgICogCi0gICAgICogVmFsaWQgSVB2NiBzaXRlIGxvY2FsIG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIEZGeDU6LzExMiB3aGVyZSB4IGlzIGEgc2V0Ci0gICAgICogb2YgZmxhZ3MsIGFuZCB0aGUgYWRkaXRpb25hbCAxMTIgYml0cyBtYWtlIHVwIHRoZSBub2RlIGxvY2FsIG11bHRpY2FzdAotICAgICAqIGFkZHJlc3Mgc3BhY2UKLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGEgc2l0ZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBvciBub3QuCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwPgorICAgICAqIFZhbGlkIElQdjYgc2l0ZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzc2VzIGFyZSBGRng1Oi8xMTIgd2hlcmUgeCBpcyBhIHNldAorICAgICAqIG9mIGZsYWdzLCBhbmQgdGhlIGFkZGl0aW9uYWwgMTEyIGJpdHMgbWFrZSB1cCB0aGUgc2l0ZS1sb2NhbCBtdWx0aWNhc3QKKyAgICAgKiBhZGRyZXNzIHNwYWNlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KICAgICAgKiBWYWxpZCBJUHY0IHNpdGUtbG9jYWwgYWRkcmVzc2VzIGFyZSBiZXR3ZWVuOiAyMzkuMjUyLjAuMCB0bwogICAgICAqIDIzOS4yNTUuMjU1LjI1NQorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzaXRlLWxvY2FsIG11bHRpY2FzdAorICAgICAqICAgICAgICAgYWRkcmVzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNQ1NpdGVMb2NhbCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIG9yZ2FuaXphdGlvbiBsb2NhbCBtdWx0aWNhc3QgYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBWYWxpZCBJUHY2IG9yZ2FuaXphdGlvbiBsb2NhbCBtdWx0aWNhc3QgYWRkcmVzc2VzIGFyZSBGRng4Oi8xMTIgd2hlcmUgeAotICAgICAqIGlzIGEgc2V0IG9mIGZsYWdzLCBhbmQgdGhlIGFkZGl0aW9uYWwgMTEyIGJpdHMgbWFrZSB1cCB0aGUgbm9kZSBsb2NhbAotICAgICAqIG11bHRpY2FzdCBhZGRyZXNzIHNwYWNlCi0gICAgICogCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWRkcmVzcyBpcyBhIG9yZ2FuaXphdGlvbi1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBvcgorICAgICAqIG5vdC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFsd2F5cyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwPgorICAgICAqIFZhbGlkIElQdjYgb3JnYW5pemF0aW9uLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIEZGeDg6LzExMiB3aGVyZSB4CisgICAgICogaXMgYSBzZXQgb2YgZmxhZ3MsIGFuZCB0aGUgYWRkaXRpb25hbCAxMTIgYml0cyBtYWtlIHVwIHRoZQorICAgICAqIG9yZ2FuaXphdGlvbi1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcyBzcGFjZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CiAgICAgICogVmFsaWQgSVB2NCBvcmdhbml6YXRpb24tbG9jYWwgYWRkcmVzc2VzIGFyZSBiZXR3ZWVuOiAyMzkuMTkyLjAuMCB0bwogICAgICAqIDIzOS4yNTEuMjU1LjI1NQorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBvcmdhbml6YXRpb24tbG9jYWwKKyAgICAgKiAgICAgICAgIG11bHRpY2FzdCBhZGRyZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc01DT3JnTG9jYWwoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNZXRob2QgaXNBbnlMb2NhbEFkZHJlc3MuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSB3aWxkY2FyZCBhZGRyZXNzIG9yIG5vdC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJldHVybnMgYWx3YXlzIHtAY29kZSBmYWxzZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgd2lsZGNhcmQgYWRkcmVzcywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQW55TG9jYWxBZGRyZXNzKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJpZXMgdG8gc2VlIGlmIHRoZSBJbmV0QWRkcmVzcyBpcyByZWFjaGFibGUuIFRoaXMgbWV0aG9kIGZpcnN0IHRyaWVzIHRvCi0gICAgICogdXNlIElDTVAoSUNNUCBFQ0hPIFJFUVVFU1QpLiBXaGVuIGZpcnN0IHN0ZXAgZmFpbHMsIHRoZSBUQ1AgY29ubmVjdGlvbiBvbgotICAgICAqIHBvcnQgNyAoRWNobykgc2hhbGwgYmUgbGF1Y2hlZC4KKyAgICAgKiBUcmllcyB0byByZWFjaCB0aGlzIHtAY29kZSBJbmV0QWRkcmVzc30uIFRoaXMgbWV0aG9kIGZpcnN0IHRyaWVzIHRvIHVzZQorICAgICAqIElDTVAgPGk+KElDTVAgRUNITyBSRVFVRVNUKTwvaT4uIFdoZW4gZmlyc3Qgc3RlcCBmYWlscywgYSBUQ1AgY29ubmVjdGlvbgorICAgICAqIG9uIHBvcnQgNyAoRWNobykgb2YgdGhlIHJlbW90ZSBob3N0IGlzIGVzdGFibGlzaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhZGRyZXNzIGlzIHJlYWNoYWJsZQorICAgICAqICAgICAgICAgICAgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSB0ZXN0IGZhaWxzIGlmIG5vIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIGNvdWxkIGJlIGVzdGFibGlzaGVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYWRkcmVzcyBpcyByZWFjaGFibGUsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgSS9PIG9wZXJhdGlvbiBtZWV0cyBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYW4gSS9PIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbGVzcyB0aGFuIHplcm8KKyAgICAgKiAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gaXNSZWFjaGFibGUobnVsbCwgMCwgdGltZW91dCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJpZXMgdG8gc2VlIGlmIHRoZSBJbmV0QWRkcmVzcyBpcyByZWFjaGFibGUuIFRoaXMgbWV0aG9kIGZpcnN0IHRyaWVzIHRvCi0gICAgICogdXNlIElDTVAoSUNNUCBFQ0hPIFJFUVVFU1QpLiBXaGVuIGZpcnN0IHN0ZXAgZmFpbHMsIHRoZSBUQ1AgY29ubmVjdGlvbiBvbgotICAgICAqIHBvcnQgNyAoRWNobykgc2hhbGwgYmUgbGF1Y2hlZC4KKyAgICAgKiBUcmllcyB0byByZWFjaCB0aGlzIHtAY29kZSBJbmV0QWRkcmVzc30uIFRoaXMgbWV0aG9kIGZpcnN0IHRyaWVzIHRvIHVzZQorICAgICAqIElDTVAgPGk+KElDTVAgRUNITyBSRVFVRVNUKTwvaT4uIFdoZW4gZmlyc3Qgc3RlcCBmYWlscywgYSBUQ1AgY29ubmVjdGlvbgorICAgICAqIG9uIHBvcnQgNyAoRWNobykgb2YgdGhlIHJlbW90ZSBob3N0IGlzIGVzdGFibGlzaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXRpZgotICAgICAqICAgICAgICAgICAgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRocm91Z2ggd2hpY2ggdG8gY29ubmVjdAorICAgICAqICAgICAgICAgICAgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGNvbm5lY3Rpb24gc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICBlc3RhYmxpc2hlZC4KICAgICAgKiBAcGFyYW0gdHRsCi0gICAgICogICAgICAgICAgICBtYXggaG9wcyB0byBsaXZlCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBjb3VudCBvZiBob3BzICh0aW1lLXRvLWxpdmUpLgogICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhZGRyZXNzIGlzIHJlYWNoYWJsZQorICAgICAqICAgICAgICAgICAgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSB0ZXN0IGZhaWxzIGlmIG5vIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIGNvdWxkIGJlIGVzdGFibGlzaGVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYWRkcmVzcyBpcyByZWFjaGFibGUsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgSS9PIG9wZXJhdGlvbiBtZWV0cyBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYW4gSS9PIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHR0bCBvciB0aW1lb3V0IGlzIGxlc3MgdGhhbiB6ZXJvCisgICAgICogICAgICAgICAgICAgaWYgdHRsIG9yIHRpbWVvdXQgaXMgbGVzcyB0aGFuIHplcm8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoTmV0d29ya0ludGVyZmFjZSBuZXRpZiwgZmluYWwgaW50IHR0bCwKICAgICAgICAgICAgIGZpbmFsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTA5NywxOSArMTE4NywyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEluZXRBZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFycmF5IG9mIGJ5dGVzLiBJbiB0aGUgY2FzZQotICAgICAqIG9mIGFuIElQdjQgYWRkcmVzcyB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgNCBieXRlcyBhbmQgZm9yIElQdjYgZXhhY3RseSAxNgotICAgICAqIGJ5dGVzLiBJZiBub3QsIGFuIFVua25vd25Ib3N0RXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgSW5ldEFkZHJlc3N9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFycmF5IG9mIGJ5dGVzLiBJbgorICAgICAqIHRoZSBjYXNlIG9mIGFuIElQdjQgYWRkcmVzcyB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgNCBieXRlcyBhbmQgZm9yIElQdjYKKyAgICAgKiBleGFjdGx5IDE2IGJ5dGVzLiBJZiBub3QsIGFuIHtAY29kZSBVbmtub3duSG9zdEV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqIDxwPgogICAgICAqIFRoZSBJUCBhZGRyZXNzIGlzIG5vdCB2YWxpZGF0ZWQgYnkgYSBuYW1lIHNlcnZpY2UuCi0gICAgICogCi0gICAgICogVGhlIGhpZ2ggb3JkZXIgYnl0ZSBpcyA8Y29kZT5pcEFkZHJlc3NbMF08L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgaGlnaCBvcmRlciBieXRlIGlzIHtAY29kZSBpcEFkZHJlc3NbMF19LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaXBBZGRyZXNzCi0gICAgICogICAgICAgICAgICBlaXRoZXIgYSA0IChJUHY0KSBvciAxNiAoSVB2NikgYnl0ZSBhcnJheQotICAgICAqIEByZXR1cm4gdGhlIEluZXRBZGRyZXNzCi0gICAgICogCisgICAgICogICAgICAgICAgICBpcyBlaXRoZXIgYSA0IChJUHY0KSBvciAxNiAoSVB2NikgYnl0ZSBsb25nIGFycmF5LgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIEluZXRBZGRyZXNzfSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIElQIGFkZHJlc3MKKyAgICAgKiAgICAgICAgIHtAY29kZSBpcEFkZHJlc3N9LgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBoYXMgbm8gdmFsaWQgbGVuZ3RoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0QnlBZGRyZXNzKGJ5dGVbXSBpcEFkZHJlc3MpCiAgICAgICAgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewpAQCAtMTExOSwyMSArMTIxMywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEluZXRBZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFycmF5IG9mIGJ5dGVzLiBJbiB0aGUgY2FzZQotICAgICAqIG9mIGFuIElQdjQgYWRkcmVzcyB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgNCBieXRlcyBhbmQgZm9yIElQdjYgZXhhY3RseSAxNgotICAgICAqIGJ5dGVzLiBJZiBub3QsIGFuIFVua25vd25Ib3N0RXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiAKLSAgICAgKiBUaGUgSVAgYWRkcmVzcyBpcyBub3QgdmFsaWRhdGVkIGJ5IGEgbmFtZSBzZXJ2aWNlLgotICAgICAqIAotICAgICAqIFRoZSBoaWdoIG9yZGVyIGJ5dGUgaXMgPGNvZGU+aXBBZGRyZXNzWzBdPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgSW5ldEFkZHJlc3N9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFycmF5IG9mIGJ5dGVzLiBJbgorICAgICAqIHRoZSBjYXNlIG9mIGFuIElQdjQgYWRkcmVzcyB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgNCBieXRlcyBhbmQgZm9yIElQdjYKKyAgICAgKiBleGFjdGx5IDE2IGJ5dGVzLiBJZiBub3QsIGFuIHtAY29kZSBVbmtub3duSG9zdEV4Y2VwdGlvbn0gaXMgdGhyb3duLiBUaGUKKyAgICAgKiBJUCBhZGRyZXNzIGlzIG5vdCB2YWxpZGF0ZWQgYnkgYSBuYW1lIHNlcnZpY2UuIFRoZSBoaWdoIG9yZGVyIGJ5dGUgaXMKKyAgICAgKiB7QGNvZGUgaXBBZGRyZXNzWzBdfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaXBBZGRyZXNzCi0gICAgICogICAgICAgICAgICBlaXRoZXIgYSA0IChJUHY0KSBvciAxNiAoSVB2NikgYnl0ZSBhcnJheQorICAgICAqICAgICAgICAgICAgZWl0aGVyIGEgNCAoSVB2NCkgb3IgMTYgKElQdjYpIGJ5dGUgYXJyYXkuCiAgICAgICogQHBhcmFtIHNjb3BlX2lkCiAgICAgICogICAgICAgICAgICB0aGUgc2NvcGUgaWQgZm9yIGFuIElQVjYgc2NvcGVkIGFkZHJlc3MuIElmIG5vdCBhIHNjb3BlZAotICAgICAqICAgICAgICAgICAgYWRkcmVzcyBqdXN0IHBhc3MgaW4gMAorICAgICAqICAgICAgICAgICAgYWRkcmVzcyBqdXN0IHBhc3MgaW4gMC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbmV0QWRkcmVzcwotICAgICAqIAogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KICAgICAgKi8KICAgICBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0QnlBZGRyZXNzKGJ5dGVbXSBpcEFkZHJlc3MsIGludCBzY29wZV9pZCkKQEAgLTExODIsMjUgKzEyNzMsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJbmV0QWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhcnJheSBvZiBieXRlcywgYW5kIHRoZQotICAgICAqIGdpdmVuIGhvc3RuYW1lLiBJbiB0aGUgY2FzZSBvZiBhbiBJUHY0IGFkZHJlc3MgdGhlcmUgbXVzdCBiZSBleGFjdGx5IDQKLSAgICAgKiBieXRlcyBhbmQgZm9yIElQdjYgZXhhY3RseSAxNiBieXRlcy4gSWYgbm90LCBhbiBVbmtub3duSG9zdEV4Y2VwdGlvbiBpcwotICAgICAqIHRocm93bi4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgSW5ldEFkZHJlc3N9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFycmF5IG9mIGJ5dGVzLCBhbmQKKyAgICAgKiB0aGUgZ2l2ZW4gaG9zdG5hbWUuIEluIHRoZSBjYXNlIG9mIGFuIElQdjQgYWRkcmVzcyB0aGVyZSBtdXN0IGJlIGV4YWN0bHkKKyAgICAgKiA0IGJ5dGVzIGFuZCBmb3IgSVB2NiBleGFjdGx5IDE2IGJ5dGVzLiBJZiBub3QsIGFuIHtAY29kZQorICAgICAqIFVua25vd25Ib3N0RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgaG9zdCBuYW1lIGFuZCBJUCBhZGRyZXNzIGFyZSBub3QgdmFsaWRhdGVkLgotICAgICAqIAorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgaG9zdG5hbWUgZWl0aGVyIGJlIGEgbWFjaGluZSBhbGlhcyBvciBhIHZhbGlkIElQdjYgb3IgSVB2NCBhZGRyZXNzCiAgICAgICogZm9ybWF0LgotICAgICAqIAotICAgICAqIFRoZSBoaWdoIG9yZGVyIGJ5dGUgaXMgPGNvZGU+aXBBZGRyZXNzWzBdPC9jb2RlPi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGhpZ2ggb3JkZXIgYnl0ZSBpcyB7QGNvZGUgaXBBZGRyZXNzWzBdfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGhvc3ROYW1lCi0gICAgICogICAgICAgICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaG9zdG5hbWUgb3IgaXAgYWRkcmVzcworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBob3N0bmFtZSBvciBJUCBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBpcEFkZHJlc3MKLSAgICAgKiAgICAgICAgICAgIGVpdGhlciBhIDQgKElQdjQpIG9yIDE2IChJUHY2KSBieXRlIGFycmF5Ci0gICAgICogQHJldHVybiB0aGUgSW5ldEFkZHJlc3MKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIGVpdGhlciBhIDQgKElQdjQpIG9yIDE2IChJUHY2KSBieXRlIGxvbmcgYXJyYXkuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgSW5ldEFkZHJlc3N9IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gSVAgYWRkcmVzcworICAgICAqICAgICAgICAgYW5kIGhvc3RuYW1lLgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBoYXMgbm8gdmFsaWQgbGVuZ3RoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0QnlBZGRyZXNzKFN0cmluZyBob3N0TmFtZSwgYnl0ZVtdIGlwQWRkcmVzcykKICAgICAgICAgICAgIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CkBAIC0xMjEwLDI3ICsxMzA2LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSW5ldEFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgYXJyYXkgb2YgYnl0ZXMsIGFuZCB0aGUKLSAgICAgKiBnaXZlbiBob3N0bmFtZS4gSW4gdGhlIGNhc2Ugb2YgYW4gSVB2NCBhZGRyZXNzIHRoZXJlIG11c3QgYmUgZXhhY3RseSA0Ci0gICAgICogYnl0ZXMgYW5kIGZvciBJUHY2IGV4YWN0bHkgMTYgYnl0ZXMuIElmIG5vdCwgYW4gVW5rbm93bkhvc3RFeGNlcHRpb24gaXMKLSAgICAgKiB0aHJvd24uCi0gICAgICogCi0gICAgICogVGhlIGhvc3QgbmFtZSBhbmQgSVAgYWRkcmVzcyBhcmUgbm90IHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBUaGUgaG9zdG5hbWUgZWl0aGVyIGJlIGEgbWFjaGluZSBhbGlhcyBvciBhIHZhbGlkIElQdjYgb3IgSVB2NCBhZGRyZXNzCi0gICAgICogZm9ybWF0LgotICAgICAqIAotICAgICAqIFRoZSBoaWdoIG9yZGVyIGJ5dGUgaXMgPGNvZGU+aXBBZGRyZXNzWzBdPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgSW5ldEFkZHJlc3N9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFycmF5IG9mIGJ5dGVzLCBhbmQKKyAgICAgKiB0aGUgZ2l2ZW4gaG9zdG5hbWUuIEluIHRoZSBjYXNlIG9mIGFuIElQdjQgYWRkcmVzcyB0aGVyZSBtdXN0IGJlIGV4YWN0bHkKKyAgICAgKiA0IGJ5dGVzIGFuZCBmb3IgSVB2NiBleGFjdGx5IDE2IGJ5dGVzLiBJZiBub3QsIGFuIHtAY29kZQorICAgICAqIFVua25vd25Ib3N0RXhjZXB0aW9ufSBpcyB0aHJvd24uIFRoZSBob3N0IG5hbWUgYW5kIElQIGFkZHJlc3MgYXJlIG5vdAorICAgICAqIHZhbGlkYXRlZC4gVGhlIGhvc3RuYW1lIGVpdGhlciBiZSBhIG1hY2hpbmUgYWxpYXMgb3IgYSB2YWxpZCBJUHY2IG9yIElQdjQKKyAgICAgKiBhZGRyZXNzIGZvcm1hdC4gVGhlIGhpZ2ggb3JkZXIgYnl0ZSBpcyB7QGNvZGUgaXBBZGRyZXNzWzBdfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaG9zdE5hbWUKLSAgICAgKiAgICAgICAgICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBob3N0bmFtZSBvciBJUCBhZGRyZXNzCisgICAgICogICAgICAgICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcy4KICAgICAgKiBAcGFyYW0gaXBBZGRyZXNzCi0gICAgICogICAgICAgICAgICBlaXRoZXIgYSA0IChJUHY0KSBvciAxNiAoSVB2NikgYnl0ZSBhcnJheQorICAgICAqICAgICAgICAgICAgZWl0aGVyIGEgNCAoSVB2NCkgb3IgMTYgKElQdjYpIGJ5dGUgYXJyYXkuCiAgICAgICogQHBhcmFtIHNjb3BlX2lkCiAgICAgICogICAgICAgICAgICB0aGUgc2NvcGUgaWQgZm9yIGEgc2NvcGVkIGFkZHJlc3MuIElmIG5vdCBhIHNjb3BlZCBhZGRyZXNzCi0gICAgICogICAgICAgICAgICBqdXN0IHBhc3MgaW4gMAorICAgICAqICAgICAgICAgICAganVzdCBwYXNzIGluIDAuCiAgICAgICogQHJldHVybiB0aGUgSW5ldEFkZHJlc3MKLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCiAgICAgICovCiAgICAgc3RhdGljIEluZXRBZGRyZXNzIGdldEJ5QWRkcmVzc0ludGVybmFsKFN0cmluZyBob3N0TmFtZSwgYnl0ZVtdIGlwQWRkcmVzcywKQEAgLTEzMDEsOCArMTM5MSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBJbmV0QWRkcmVzcyBiYXNlZCBvbiBhbiBpcEFkZHJlc3NTdHJpbmcuIE5vIGVycm9yIGhhbmRsaW5nIGlzCi0gICAgICogcGVyZm9ybWVkIGhlcmUuCisgICAgICogQ3JlYXRlcyBhbiBJbmV0QWRkcmVzcyBiYXNlZCBvbiB0aGUge0Bjb2RlIGlwQWRkcmVzc1N0cmluZ30uIE5vIGVycm9yCisgICAgICogaGFuZGxpbmcgaXMgcGVyZm9ybWVkIGhlcmUuCiAgICAgICovCiAgICAgc3RhdGljIEluZXRBZGRyZXNzIGNyZWF0ZUhvc3ROYW1lRnJvbUlQQWRkcmVzcyhTdHJpbmcgaXBBZGRyZXNzU3RyaW5nKQogICAgICAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9JbmV0U29ja2V0QWRkcmVzcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXRTb2NrZXRBZGRyZXNzLmphdmEKaW5kZXggMDRkNmE2ZC4uNjkwMTA1MyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXRTb2NrZXRBZGRyZXNzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0luZXRTb2NrZXRBZGRyZXNzLmphdmEKQEAgLTIwLDYgKzIwLDEyIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwogCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNvY2tldCBlbmRwb2ludCBkZXNjcmliZWQgYnkgYSBJUCBhZGRyZXNzIGFuZCBhIHBvcnQKKyAqIG51bWJlci4gSXQgaXMgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgU29ja2V0QWRkcmVzc30gZm9yIElQLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEluZXRTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MDc2MDAxNDAxMjM0NjMxMjM3TDsKQEAgLTMwLDEwICszNiwzMSBAQAogCiAgICAgcHJpdmF0ZSBpbnQgcG9ydDsKIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzb2NrZXQgZW5kcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gcG9ydCBudW1iZXIge0Bjb2RlIHBvcnR9IGFuZCB0aGUKKyAgICAgKiB3aWxkY2FyZCBhZGRyZXNzIHtAY29kZSBJbmV0QWRkcmVzcy5BTll9LiBUaGUgcmFuZ2UgZm9yIHZhbGlkIHBvcnQgbnVtYmVycworICAgICAqIGlzIGJldHdlZW4gMCBhbmQgNjU1MzUgaW5jbHVzaXZlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHBvcnQgbnVtYmVyIHRvIHdoaWNoIHRoaXMgc29ja2V0IGlzIGJvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBJbmV0U29ja2V0QWRkcmVzcyhpbnQgcG9ydCkgewogICAgICAgICB0aGlzKChJbmV0QWRkcmVzcykgbnVsbCwgcG9ydCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHNvY2tldCBlbmRwb2ludCB3aXRoIHRoZSBnaXZlbiBwb3J0IG51bWJlciB7QGNvZGUgcG9ydH0gYW5kCisgICAgICoge0Bjb2RlIGFkZHJlc3N9LiBUaGUgcmFuZ2UgZm9yIHZhbGlkIHBvcnQgbnVtYmVycyBpcyBiZXR3ZWVuIDAgYW5kIDY1NTM1CisgICAgICogaW5jbHVzaXZlLiBJZiB7QGNvZGUgYWRkcmVzc30gaXMge0Bjb2RlIG51bGx9IHRoaXMgc29ja2V0IGlzIGJvdW5kIHRvIHRoZQorICAgICAqIHdpbGRjYXJkIGFkZHJlc3Mge0Bjb2RlIEluZXRBZGRyZXNzLkFOWX0uCisgICAgICogCisgICAgICogQHBhcmFtIHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcG9ydCBudW1iZXIgdG8gd2hpY2ggdGhpcyBzb2NrZXQgaXMgYm91bmQuCisgICAgICogQHBhcmFtIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB0byB3aGljaCB0aGlzIHNvY2tldCBpcyBib3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpIHsKICAgICAgICAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtNDcsNiArNzQsMjIgQEAKICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc29ja2V0IGVuZHBvaW50IHdpdGggdGhlIGdpdmVuIHBvcnQgbnVtYmVyIHtAY29kZSBwb3J0fSBhbmQgdGhlCisgICAgICogaG9zdG5hbWUge0Bjb2RlIGhvc3R9LiBUaGUgaG9zdG5hbWUgaXMgdHJpZWQgdG8gYmUgcmVzb2x2ZWQgYW5kIGNhbm5vdCBiZQorICAgICAqIHtAY29kZSBudWxsfS4gVGhlIHJhbmdlIGZvciB2YWxpZCBwb3J0IG51bWJlcnMgaXMgYmV0d2VlbiAwIGFuZCA2NTUzNQorICAgICAqIGluY2x1c2l2ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwb3J0IG51bWJlciB0byB3aGljaCB0aGlzIHNvY2tldCBpcyBib3VuZC4KKyAgICAgKiBAcGFyYW0gaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBob3N0bmFtZSB0byB3aGljaCB0aGlzIHNvY2tldCBpcyBib3VuZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIGl0cyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBjaGVja0Nvbm5lY3QoKX0gbWV0aG9kIGRvZXMgbm90IGFsbG93IHRoZSByZXNvbHZpbmcgb2YgdGhlCisgICAgICogICAgICAgICAgICAgaG9zdCBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBJbmV0U29ja2V0QWRkcmVzcyhTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKICAgICAgICAgdGhpcyhob3N0LCBwb3J0LCB0cnVlKTsKICAgICB9CkBAIC02Miw2ICsxMDUsMTIgQEAKICAgICAgICAgaG9zdG5hbWUgPSBob3N0OwogICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwogICAgICAgICBpZiAobmVlZFJlc29sdmVkKSB7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc21nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgICAgIGlmKHNtZ3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNtZ3IuY2hlY2tDb25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0bmFtZSk7CiAgICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBudWxsOwpAQCAtNzQsMzYgKzEyMyw3MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0cyBhbiA8Y29kZT5JbmV0U29ja2V0QWRkcmVzczwvY29kZT4gd2l0aG91dCB0cnlpbmcgdG8gcmVzb2x2ZQotICAgICAqIGhvc3RuYW1lIGludG8gYW4gSW5ldEFkZHJlc3MuIFRoZSBhZGRyZXNzIGZpZWxkIGlzIG1hcmtlZCBhcyB1bnJlc29sdmVkLgorICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIEluZXRTb2NrZXRBZGRyZXNzfSB3aXRob3V0IHRyeWluZyB0byByZXNvbHZlIHRoZQorICAgICAqIGhvc3RuYW1lIGludG8gYW4ge0Bjb2RlIEluZXRBZGRyZXNzfS4gVGhlIGFkZHJlc3MgZmllbGQgaXMgbWFya2VkIGFzCisgICAgICogdW5yZXNvbHZlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBob3N0bmFtZSB0byB3aGljaCB0aGlzIHNvY2tldCBpcyBib3VuZC4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+SW5ldFNvY2tldEFkZHJlc3M8L2NvZGU+IGluc3RhbmNlLgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwb3J0IG51bWJlciB0byB3aGljaCB0aGlzIHNvY2tldCBpcyBib3VuZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIEluZXRTb2NrZXRBZGRyZXNzIGluc3RhbmNlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgaG9zdCBpcyBudWxsIG9yIHRoZSBwb3J0IGlzIG5vdCBpbiB0aGUgcmFuZ2UgYmV0d2VlbiAwIGFuZAotICAgICAqICAgICAgICAgICAgIDY1NTM1LgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBob3N0bmFtZSB7QGNvZGUgaG9zdH0gaXMge0Bjb2RlIG51bGx9IG9yIHRoZSBwb3J0IGlzCisgICAgICogICAgICAgICAgICAgbm90IGluIHRoZSByYW5nZSBiZXR3ZWVuIDAgYW5kIDY1NTM1LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW5ldFNvY2tldEFkZHJlc3MgY3JlYXRlVW5yZXNvbHZlZChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0LCBwb3J0LCBmYWxzZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcG9ydCBudW1iZXIgb2YgdGhpcyBzb2NrZXQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc29ja2V0IGVuZHBvaW50IHBvcnQgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UG9ydCgpIHsKICAgICAgICAgcmV0dXJuIHBvcnQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYWRkcmVzcyBvZiB0aGlzIHNvY2tldC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzb2NrZXQgZW5kcG9pbnQgYWRkcmVzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKICAgICAgICAgcmV0dXJuIGFkZHI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaG9zdG5hbWUgb2YgdGhpcyBzb2NrZXQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc29ja2V0IGVuZHBvaW50IGhvc3RuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7CiAgICAgICAgIHJldHVybiAobnVsbCAhPSBhZGRyKSA/IGFkZHIuZ2V0SG9zdE5hbWUoKSA6IGhvc3RuYW1lOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHNvY2tldCBhZGRyZXNzIGlzIHVucmVzb2x2ZWQgb3Igbm90LgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgc29ja2V0IGFkZHJlc3MgaXMgdW5yZXNvbHZlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzVW5yZXNvbHZlZCgpIHsKICAgICAgICAgcmV0dXJuIGFkZHIgPT0gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc29ja2V0IGluY2x1ZGVkIHRoZSBhZGRyZXNzIGFuZCB0aGUKKyAgICAgKiBwb3J0IG51bWJlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIGFuZCBwb3J0IG51bWJlciBhcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIGhvc3Q7CkBAIC0xMTUsNiArMjAwLDE3IEBACiAgICAgICAgIHJldHVybiBob3N0ICsgIjoiICsgcG9ydDsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbXBhcmVzIHR3byBzb2NrZXQgZW5kcG9pbnRzIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSBhcmUgZXF1YWwuIFR3bworICAgICAqIHNvY2tldCBlbmRwb2ludHMgYXJlIGVxdWFsIGlmIHRoZSBJUCBhZGRyZXNzIG9yIHRoZSBob3N0bmFtZSBvZiBib3RoIGFyZQorICAgICAqIGVxdWFsIGFuZCB0aGV5IGFyZSBib3VuZCB0byB0aGUgc2FtZSBwb3J0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzb2NrZXRBZGRyCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIHRlc3RlZCBmb3IgZXF1YWxpdHkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzb2NrZXQgYW5kIHRoZSBnaXZlbiBzb2NrZXQgb2JqZWN0IHtAY29kZQorICAgICAqICAgICAgICAgc29ja2V0QWRkcn0gYXJlIGVxdWFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHNvY2tldEFkZHIpIHsKICAgICAgICAgaWYgKHRoaXMgPT0gc29ja2V0QWRkcikgewpAQCAtMTQ1LDYgKzI0MSwxMiBAQAogICAgICAgICByZXR1cm4gYWRkci5lcXVhbHMoaVNvY2tBZGRyLmFkZHIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGhhc2hjb2RlIG9mIHRoaXMgc29ja2V0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGhhc2hjb2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGlmIChhZGRyID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9KYXJVUkxDb25uZWN0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSmFyVVJMQ29ubmVjdGlvbi5qYXZhCmluZGV4IDIwMmNkMDkuLjExNTQ1ZmEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9KYXJVUkxDb25uZWN0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0phclVSTENvbm5lY3Rpb24uamF2YQpAQCAtMjUsMTMgKzI1LDI5IEBACiBpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byBhIFVSTCB1c2luZyB0aGUgamFyIHByb3RvY29sLiBKYXIgVVJMcwotICogYXJlIHNwZWNpZmllZCBhcyBmb2xsb3dzOiA8Y2VudGVyPjxjb2RlPmphcjo8dXJsPiEve2VudHJ5fTwvY29kZT48L2NlbnRlcj4KLSAqIHdoZXJlICIhLyIgaXMgY2FsbGVkIGEgc2VwZXJhdG9yLgorICogVGhpcyBjbGFzcyBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gYSB7QGNvZGUgamFyOn0gVVJMIHVzaW5nIHRoZSB7QGNvZGUKKyAqIEpBUn0gcHJvdG9jb2wuIEEge0Bjb2RlIEphclVSTENvbm5lY3Rpb259IGluc3RhbmNlIGNhbiByZWZlciB0byBlaXRoZXIgYSBKQVIKKyAqIGFyY2hpdmUgZmlsZSBvciB0byBhbiBlbnRyeSBvZiBzdWNoIGEgZmlsZS4ge0Bjb2RlIGphcjp9IFVSTHMgYXJlIHNwZWNpZmllZAorICogYXMgZm9sbG93czogPGk+amFyOnthcmNoaXZlLXVybH0hL3tlbnRyeX08L2k+IHdoZXJlICIhLyIgaXMgY2FsbGVkIGEKKyAqIHNlcGFyYXRvci4gVGhpcyBzZXBhcmF0b3IgaXMgaW1wb3J0YW50IHRvIGRldGVybWluZSBpZiBhbiBhcmNoaXZlIG9yIGFuIGVudHJ5CisgKiBvZiBhbiBhcmNoaXZlIGlzIHJlZmVycmVkLgorICogPHA+CisgKiBFeGFtcGxlczoKKyAqIDxsaT5BcmNoaXZlOiB7QGNvZGUgamFyOmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vYXBwbGV0cy9hcmNoaXZlLmphciEvfTwvbGk+CisgKiA8bGk+RmlsZSBFbnRyeToge0Bjb2RlCisgKiBqYXI6aHR0cDovL3d3dy5leGFtcGxlLmNvbS9hcHBsZXRzL2FyY2hpdmUuamFyIS90ZXN0LmNsYXNzfTwvbGk+CisgKiA8bGk+RGlyZWN0b3J5IEVudHJ5OiB7QGNvZGUKKyAqIGphcjpodHRwOi8vd3d3LmV4YW1wbGUuY29tL2FwcGxldHMvYXJjaGl2ZS5qYXIhL2FwcGxldHMvfTwvbGk+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmFyVVJMQ29ubmVjdGlvbiBleHRlbmRzIFVSTENvbm5lY3Rpb24gewogCi0gICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzZXBhcmF0b3IKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYXRpb24gcGFydCBvZiB0aGUgcmVwcmVzZW50ZWQgVVJMLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIGphckZpbGVVUkxDb25uZWN0aW9uOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZW50cnlOYW1lOwpAQCAtNDIsMTAgKzU4LDE0IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZTsKIAogICAgIC8qKgotICAgICAqIENvbnRydWN0cyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5KYXJVUkxDb25uZWN0aW9uPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHtAY29kZSBKYXJVUkxDb25uZWN0aW9ufSB0aGF0IHJlZmVycyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgVVJMLgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmwKLSAgICAgKiAgICAgICAgICAgIGphdmEubmV0LlVSTCB0aGUgVVJMIHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIHRvIGNvbm5lY3QgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgdGhhdCBjb250YWlucyB0aGUgbG9jYXRpb24gdG8gY29ubmVjdCB0by4KKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGludmFsaWQgVVJMIGhhcyBiZWVuIGVudGVyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEphclVSTENvbm5lY3Rpb24oVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKHVybCk7CkBAIC02NCwxMyArODQsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBKYXJFbnRyeSByZWZlcmVuY2VkIGJ5IHRoaXMKLSAgICAgKiA8Y29kZT5KYXJVUkxDb25uZWN0aW9uPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSB7QGNvZGUgSmFyRW50cnl9IHJlZmVyZW5jZWQgYnkgdGhpcyB7QGNvZGUKKyAgICAgKiBKYXJVUkxDb25uZWN0aW9ufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdGhlIEphckVudHJ5Ci0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhyb3duIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmV0cmlldmluZyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBKYXJFbnRyeQorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlZmVyZW5jZWQge0Bjb2RlIEphckVudHJ5fS4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmV0cmlldmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBKQVItZW50cmllcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewogICAgICAgICBKYXJFbnRyeSBqRW50cnkgPSBnZXRKYXJFbnRyeSgpOwpAQCAtNzgsMTQgKzk5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ2VydGlmaWNhdGVzIG9mIHRoZSBKYXJFbnRyeSByZWZlcmVuY2VkIGJ5IHRoaXMKLSAgICAgKiA8Y29kZT5VUkxDb25uZWN0aW9uPC9jb2RlPi4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCB1bnRpbCB0aGUKLSAgICAgKiBJbnB1dFN0cmVhbSBoYXMgYmVlbiBjb21wbGV0ZWx5IHZlcmlmaWVkCisgICAgICogUmV0dXJucyBhbGwgY2VydGlmaWNhdGVzIG9mIHRoZSB7QGNvZGUgSmFyRW50cnl9IHJlZmVyZW5jZWQgYnkgdGhpcworICAgICAqIHtAY29kZSBKYXJVUkxDb25uZWN0aW9ufSBpbnN0YW5jZS4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4ge0Bjb2RlIG51bGx9CisgICAgICogdW50aWwgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gaGFzIGJlZW4gY29tcGxldGVseSB2ZXJpZmllZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENlcnRpZmljYXRlW10gdGhlIENlcnRpZmljYXRlcyBvZiB0aGUgSmFyRW50cnkuCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhyb3duIGlmIHRoZXJlIGlzIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgZ2V0dGluZwotICAgICAqICAgICAgICAgICAgICAgIHRoZSBKYXJFbnRyeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZXMgb2YgdGhlIHtAY29kZSBKYXJFbnRyeX0gYXMgYW4gYXJyYXkuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIEkvTyBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGdldHRpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIEphckVudHJ5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZXMoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAgICAgICAgIEphckVudHJ5IGpFbnRyeSA9IGdldEphckVudHJ5KCk7CkBAIC05NywyMCArMTE5LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSmFyRW50cnkgbmFtZSBvZiB0aGUgZW50cnkgcmVmZXJlbmNlZCBieSB0aGlzCi0gICAgICogPGNvZGU+VVJMQ29ubmVjdGlvbjwvY29kZT4uCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgcmVmZXJlbmNlZCBieSB0aGlzIHtAY29kZSBKYXJVUkxDb25uZWN0aW9ufS4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUge0Bjb2RlIG51bGx9IGlmIHRoaXMgaW5zdGFuY2UgcmVmZXJzIHRvIGEgSkFSCisgICAgICogZmlsZSByYXRoZXIgdGhhbiBhbiBKQVIgZmlsZSBlbnRyeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgdGhlIEphckVudHJ5IG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgSmFyRW50cnl9IG5hbWUgdGhpcyBpbnN0YW5jZSByZWZlcnMgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRFbnRyeU5hbWUoKSB7CiAgICAgICAgIHJldHVybiBlbnRyeU5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSmFyRW50cnkgb2YgdGhlIGVudHJ5IHJlZmVyZW5jZWQgYnkgdGhpcwotICAgICAqIDxjb2RlPlVSTENvbm5lY3Rpb248L2NvZGU+LgorICAgICAqIEdldHMgdGhlIHtAY29kZSBKYXJFbnRyeX0gb2JqZWN0IG9mIHRoZSBlbnRyeSByZWZlcmVuY2VkIGJ5IHRoaXMge0Bjb2RlCisgICAgICogSmFyVVJMQ29ubmVjdGlvbn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLnV0aWwuamFyLkphckVudHJ5IHRoZSBKYXJFbnRyeSByZWZlcmVuY2VkCisgICAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCB7QGNvZGUgSmFyRW50cnl9IG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgbm8KKyAgICAgKiAgICAgICAgIGVudHJ5IG5hbWUgaXMgc3BlY2lmaWVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2V0dGluZyB0aGUgZmlsZSBvciBmaWxlLWVudHJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBKYXJFbnRyeSBnZXRKYXJFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghY29ubmVjdGVkKSB7CkBAIC0xMjQsMjkgKzE1MiwzNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSmFyIFVSTAorICAgICAqIEdldHMgdGhlIG1hbmlmZXN0IGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSkFSLVVSTC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuTWFuaWZlc3QgVGhlIEphckZpbGUncyBNYW5pZmVzdAorICAgICAqIEByZXR1cm4gdGhlIG1hbmlmZXN0IG9mIHRoZSByZWZlcmVuY2VkIEpBUi1maWxlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2V0dGluZyB0aGUgbWFuaWZlc3QgZmlsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRKYXJGaWxlKCkuZ2V0TWFuaWZlc3QoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aGUgSmFyRmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgPGNvZGU+VVJMQ29ubmVjdGlvbjwvY29kZT4uCisgICAgICogR2V0cyB0aGUge0Bjb2RlIEphckZpbGV9IG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoaXMge0Bjb2RlCisgICAgICogSmFyVVJMQ29ubmVjdGlvbn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLnV0aWwuamFyLkphckZpbGUgdGhlIEphckZpbGUKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZXRyaWV2aW5nIHRoZSBKYXIKLSAgICAgKiAgICAgICAgICAgICAgICBmaWxlCisgICAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCBKYXJGaWxlIG9iamVjdC4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmV0cmlldmluZyB0aGUgSkFSLWZpbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEphckZpbGUgZ2V0SmFyRmlsZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSBKYXJGaWxlIHJlZmVyZW5jZWQgYnkgdGhpcwotICAgICAqIDxjb2RlPlVSTENvbm5lY3Rpb248L2NvZGU+LgorICAgICAqIEdldHMgdGhlIFVSTCB0byB0aGUgSkFSLWZpbGUgcmVmZXJlbmNlZCBieSB0aGlzIHtAY29kZSBKYXJVUkxDb25uZWN0aW9ufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LlVSTCB0aGUgVVJMIG9mIHRoZSBKYXJGaWxlLgorICAgICAqIEByZXR1cm4gdGhlIFVSTCB0byB0aGUgSkFSLWZpbGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBhbiBlcnJvcgorICAgICAqICAgICAgICAgcmV0cmlldmluZyB0aGUgVVJMLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkwgZ2V0SmFyRmlsZVVSTCgpIHsKICAgICAgICAgaWYgKGZpbGVVUkwgIT0gbnVsbCkgewpAQCAtMTYxLDEzICsxOTQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYWluIEF0dHJpYnV0ZXMgb2YgdGhlIEphckZpbGUgcmVmZXJlbmNlZCBieSB0aGlzCi0gICAgICogPGNvZGU+VVJMQ29ubmVjdGlvbjwvY29kZT4uCisgICAgICogR2V0cyBhbGwgYXR0cmlidXRlcyBvZiB0aGUgbWFuaWZlc3QgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMge0Bjb2RlCisgICAgICogSmFyVVJMQ29ubmVjdGlvbn0uIElmIHRoaXMgaW5zdGFuY2UgcmVmZXJzIHRvIGEgSkFSLWZpbGUgcmF0aGVyIHRoYW4gYQorICAgICAqIEpBUi1maWxlIGVudHJ5LCB7QGNvZGUgbnVsbH0gd2lsbCBiZSByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyB0aGUgQXR0cmlidXRlcyBvZiB0aGUgdGhlIEphckZpbGUKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZXRyaWV2aW5nIHRoZQotICAgICAqICAgICAgICAgICAgICAgIEphckZpbGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtYW5pZmVzdCBmaWxlIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmV0cmlldmluZyB0aGUge0Bjb2RlCisgICAgICogICAgICAgICAgICAgICAgSmFyRmlsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0TWFpbkF0dHJpYnV0ZXMoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAgICAgICAgIE1hbmlmZXN0IG0gPSBnZXRKYXJGaWxlKCkuZ2V0TWFuaWZlc3QoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb24uamF2YQppbmRleCBlZGI4MGIzLi4zODYyMjhiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTWFsZm9ybWVkVVJMRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L01hbGZvcm1lZFVSTEV4Y2VwdGlvbi5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiAgKiBpbmNvcnJlY3Qgc3BlY2lmaWNhdGlvbi4KICAqIAogICogQHNlZSBVUkwKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCkBAIC0zMSw2ICszMiw4IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC00MSw3ICs0NCw4IEBACiAgICAgICogZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L011bHRpY2FzdFNvY2tldC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L011bHRpY2FzdFNvY2tldC5qYXZhCmluZGV4IGExOTJmMTYuLmNmMjA4OTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9NdWx0aWNhc3RTb2NrZXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTXVsdGljYXN0U29ja2V0LmphdmEKQEAgLTI0LDEwICsyNCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgbW9kZWxzIGEgbXVsdGljYXN0IHNvY2tldCBmb3Igc2VuZGluZyAmIHJlY2VpdmluZyBkYXRhZ3JhbSBwYWNrZXRzCi0gKiB0byBhIG11bHRpY2FzdCBncm91cC4KKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG11bHRpY2FzdCBzb2NrZXQgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBJUAorICogbXVsdGljYXN0IGRhdGFncmFtIHBhY2tldHMuCiAgKiAKICAqIEBzZWUgRGF0YWdyYW1Tb2NrZXQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTXVsdGljYXN0U29ja2V0IGV4dGVuZHMgRGF0YWdyYW1Tb2NrZXQgewogCkBAIC00MCw3ICs0MSw4IEBACiAgICAgICogbG9jYWxob3N0LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGNyZWF0aW5nIG9yIGJpbmRpbmcgdGhlIHNvY2tldAorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyBvciBiaW5kaW5nIHRoZSBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE11bHRpY2FzdFNvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC00OCwxMyArNTAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbXVsdGljYXN0IHNvY2tldCwgYm91bmQgdG8gdGhlIG5vbWluYXRlZCBwb3J0IG9uIHRoZSBsb2NhbGhvc3QuCisgICAgICogQ29uc3RydWN0cyBhIG11bHRpY2FzdCBzb2NrZXQsIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBvbiB0aGUKKyAgICAgKiBsb2NhbGhvc3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCB0byBiaW5kIG9uIHRoZSBsb2NhbGhvc3QKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IHRvIGJpbmQgb24gdGhlIGxvY2FsaG9zdC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBjcmVhdGluZyBvciBiaW5kaW5nIHRoZSBzb2NrZXQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgb3IgYmluZGluZyB0aGUgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNdWx0aWNhc3RTb2NrZXQoaW50IGFQb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihhUG9ydCk7CkBAIC02MiwxMiArNjUsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIG5ldHdvcmsgYWRkcmVzcyB1c2VkIGJ5IHRoZSBzb2NrZXQuIFRoaXMgaXMgdXNlZnVsIG9uCi0gICAgICogbXVsdGktaG9tZWQgbWFjaGluZXMuCisgICAgICogR2V0cyB0aGUgbmV0d29yayBhZGRyZXNzIHVzZWQgYnkgdGhpcyBzb2NrZXQuIFRoaXMgaXMgdXNlZnVsIG9uCisgICAgICogbXVsdGlob21lZCBtYWNoaW5lcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LkluZXRBZGRyZXNzIHRoZSBuZXR3b3JrIGFkZHJlc3MKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhyb3duIHdoaWxlIGdldHRpbmcgdGhlIGFkZHJlc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSB0aHJvdWdoIHdoaWNoIHRoZSBkYXRhZ3JhbQorICAgICAqICAgICAgICAgcGFja2V0cyBhcmUgc2VudCBvciByZWNlaXZlZC4KKyAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBnZXR0aW5nIHRoZSBpbnRlcmZhY2UgYWRkcmVzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0SW50ZXJmYWNlKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC05NywxNCArMTAyLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBuZXR3b3JrIGludGVyZmFjZSB1c2VkIGJ5IHRoZSBzb2NrZXQuIFRoaXMgaXMgdXNlZnVsIG9uCi0gICAgICogbXVsdGktaG9tZWQgbWFjaGluZXMuCisgICAgICogR2V0cyB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGlzIHNvY2tldC4gVGhpcyBpcyB1c2VmdWwgb24KKyAgICAgKiBtdWx0aWhvbWVkIG1hY2hpbmVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSB0aGUgbmV0d29yayBhZGRyZXNzCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRocm93biB3aGlsZSBnZXR0aW5nIHRoZSBhZGRyZXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqIEByZXR1cm4gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhpcyBzb2NrZXQgb3Ige0Bjb2RlIG51bGx9IGlmIG5vCisgICAgICogICAgICAgICBpbnRlcmZhY2UgaXMgc2V0LgorICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdldHRpbmcgdGhlIGludGVyZmFjZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTmV0d29ya0ludGVyZmFjZSBnZXROZXR3b3JrSW50ZXJmYWNlKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC0xNTYsMTEgKzE2MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgdGltZS10by1saXZlIChUVEwpIGZvciBtdWx0aWNhc3QgcGFja2V0cyBzZW50IG9uIHRoaXMgc29ja2V0LgorICAgICAqIEdldHMgdGhlIHRpbWUtdG8tbGl2ZSAoVFRMKSBmb3IgbXVsdGljYXN0IHBhY2tldHMgc2VudCBvbiB0aGlzIHNvY2tldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LkluZXRBZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRpbWUtdG8tbGlmZSBmaWVsZC4KICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRpbWVUb0xpdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZEJpbmQoZmFsc2UpOwpAQCAtMTY4LDE1ICsxNzQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHRpbWUtdG8tbGl2ZSAoVFRMKSBmb3IgbXVsdGljYXN0IHBhY2tldHMgc2VudCBvbiB0aGlzIHNvY2tldC4KKyAgICAgKiBHZXRzIHRoZSB0aW1lLXRvLWxpdmUgKFRUTCkgZm9yIG11bHRpY2FzdCBwYWNrZXRzIHNlbnQgb24gdGhpcyBzb2NrZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLm5ldC5JbmV0QWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSB0aW1lLXRvLWxpZmUgZmllbGQuCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHJlYWRpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkge0BsaW5rICNnZXRUaW1lVG9MaXZlfQogICAgICAqIEBzZWUgI2dldFRpbWVUb0xpdmUoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYnl0ZSBnZXRUVEwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZEJpbmQoZmFsc2UpOwpAQCAtMTg5LDE0ICsxOTUsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGQgdGhpcyBzb2NrZXQgdG8gdGhlIG11bHRpY2FzdCBncm91cC4gQSBzb2NrZXQgbXVzdCBqb2ludCBhIGdyb3VwCi0gICAgICogYmVmb3JlIGRhdGEgbWF5IGJlIHJlY2VpdmVkLiBBIHNvY2tldCBtYXkgYmUgYSBtZW1iZXIgb2YgbXVsdGlwbGUgZ3JvdXBzCi0gICAgICogYnV0IG1heSBqb2luIGFueSBncm91cCBvbmNlLgorICAgICAqIEFkZHMgdGhpcyBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBtdWx0aWNhc3QgZ3JvdXAuIEEgc29ja2V0IG11c3Qgam9pbiBhCisgICAgICogZ3JvdXAgYmVmb3JlIGRhdGEgbWF5IGJlIHJlY2VpdmVkLiBBIHNvY2tldCBtYXkgYmUgYSBtZW1iZXIgb2YgbXVsdGlwbGUKKyAgICAgKiBncm91cHMgYnV0IG1heSBqb2luIGFueSBncm91cCBvbmx5IG9uY2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGdyb3VwQWRkcgotICAgICAqICAgICAgICAgICAgdGhlIG11bHRpY2FzdCBncm91cCB0byBiZSBqb2luZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aWNhc3QgZ3JvdXAgdG8gYmUgam9pbmVkLgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBtYXkgYmUgdGhyb3duIHdoaWxlIGpvaW5pbmcgYSBncm91cAorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBqb2luaW5nIGEgZ3JvdXAuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgam9pbkdyb3VwKEluZXRBZGRyZXNzIGdyb3VwQWRkcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKGZhbHNlKTsKQEAgLTIxMSwyMiArMjE4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkIHRoaXMgc29ja2V0IHRvIHRoZSBtdWx0aWNhc3QgZ3JvdXAuIEEgc29ja2V0IG11c3Qgam9pbiBhIGdyb3VwIGJlZm9yZQotICAgICAqIGRhdGEgbWF5IGJlIHJlY2VpdmVkLiBBIHNvY2tldCBtYXkgYmUgYSBtZW1iZXIgb2YgbXVsdGlwbGUgZ3JvdXBzIGJ1dCBtYXkKLSAgICAgKiBqb2luIGFueSBncm91cCBvbmNlLgorICAgICAqIEFkZHMgdGhpcyBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBtdWx0aWNhc3QgZ3JvdXAuIEEgc29ja2V0IG11c3Qgam9pbiBhCisgICAgICogZ3JvdXAgYmVmb3JlIGRhdGEgbWF5IGJlIHJlY2VpdmVkLiBBIHNvY2tldCBtYXkgYmUgYSBtZW1iZXIgb2YgbXVsdGlwbGUKKyAgICAgKiBncm91cHMgYnV0IG1heSBqb2luIGFueSBncm91cCBvbmx5IG9uY2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGdyb3VwQWRkcmVzcwotICAgICAqICAgICAgICAgICAgdGhlIG11bHRpY2FzdCBncm91cCB0byBiZSBqb2luZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aWNhc3QgZ3JvdXAgdG8gYmUgam9pbmVkLgogICAgICAqIEBwYXJhbSBuZXRJbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0aGUgYWRkcmVzc2VzIHNob3VsZCBiZSBkcm9wcGVkCisgICAgICogICAgICAgICAgICB0aGUgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGRhdGFncmFtIHBhY2tldHMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgcmVjZWl2ZWQuCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdpbGwgYmUgdGhyb3duIGlmIGFkZHJlc3MgaXMgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdpbGwgYmUgdGhyb3duIGlmIGNhbGxlciBpcyBub3QgYXV0aG9yaXplZCB0byBqb2luIGdyb3VwCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2lsbCBiZSB0aHJvdWdoIGlmIGdyb3VwQWRkciBpcyBudWxsCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBpcyBub3QgYSBtdWx0aWNhc3QgYWRkcmVzcy4KKyAgICAgKiBAZXhjZXB0aW9uIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNhbGxlciBpcyBub3QgYXV0aG9yaXplZCB0byBqb2luIHRoZSBncm91cC4KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIG11bHRpY2FzdCBncm91cCBpcyBzcGVjaWZpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgam9pbkdyb3VwKFNvY2tldEFkZHJlc3MgZ3JvdXBBZGRyZXNzLAogICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXRJbnRlcmZhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yNjMsMTYgKzI3MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgc29ja2V0IGZyb20gdGhlIG11bHRpY2FzdCBncm91cC4KKyAgICAgKiBSZW1vdmVzIHRoaXMgc29ja2V0IGZyb20gdGhlIHNwZWNpZmllZCBtdWx0aWNhc3QgZ3JvdXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIGdyb3VwQWRkcgotICAgICAqICAgICAgICAgICAgdGhlIG11bHRpY2FzdCBncm91cCB0byBiZSBsZWZ0CisgICAgICogICAgICAgICAgICB0aGUgbXVsdGljYXN0IGdyb3VwIHRvIGJlIGxlZnQuCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdpbGwgYmUgdGhyb3duIGlmIGFkZHJlc3MgaXMgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdpbGwgYmUgdGhyb3duIGlmIGNhbGxlciBpcyBub3QgYXV0aG9yaXplZCB0byBqb2luIGdyb3VwCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2lsbCBiZSB0aHJvdWdoIGlmIGdyb3VwQWRkciBpcyBudWxsCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBncm91cCBhZGRyZXNzIGlzIG5vdCBhIG11bHRpY2FzdCBhZGRyZXNzLgorICAgICAqIEBleGNlcHRpb24gU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgY2FsbGVyIGlzIG5vdCBhdXRob3JpemVkIHRvIGxlYXZlIHRoZSBncm91cC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsZWF2ZUdyb3VwKEluZXRBZGRyZXNzIGdyb3VwQWRkcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKGZhbHNlKTsKQEAgLTI4NywyMCArMjkzLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBzb2NrZXQgZnJvbSB0aGUgbXVsdGljYXN0IGdyb3VwLgorICAgICAqIFJlbW92ZXMgdGhpcyBzb2NrZXQgZnJvbSB0aGUgc3BlY2lmaWVkIG11bHRpY2FzdCBncm91cC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZ3JvdXBBZGRyZXNzCi0gICAgICogICAgICAgICAgICB0aGUgbXVsdGljYXN0IGdyb3VwIHRvIGJlIGxlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aWNhc3QgZ3JvdXAgdG8gYmUgbGVmdC4KICAgICAgKiBAcGFyYW0gbmV0SW50ZXJmYWNlCi0gICAgICogICAgICAgICAgICB0aGUgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGFkZHJlc3NlcyBzaG91bGQgYmUgZHJvcHBlZAorICAgICAqICAgICAgICAgICAgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBhZGRyZXNzZXMgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICBkcm9wcGVkLgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aWxsIGJlIHRocm93biBpZiBhZGRyZXNzIGlzIG5vdCBhIG11bHRpY2FzdCBhZGRyZXNzCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aWxsIGJlIHRocm93biBpZiBjYWxsZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gam9pbiBncm91cAotICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdpbGwgYmUgdGhyb3VnaCBpZiBncm91cEFkZHIgaXMgbnVsbAotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGdyb3VwIGFkZHJlc3MgaXMgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MuCisgICAgICogQGV4Y2VwdGlvbiBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBjYWxsZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gbGVhdmUgdGhlIGdyb3VwLgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gbXVsdGljYXN0IGdyb3VwIGlzIHNwZWNpZmllZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsZWF2ZUdyb3VwKFNvY2tldEFkZHJlc3MgZ3JvdXBBZGRyZXNzLAogICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXRJbnRlcmZhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zNDAsMTcgKzM0NiwxNSBAQAogICAgICAqIHBvbGljeSBiZWZvcmUgaXQgbWF5IGJlIHNlbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhY2sKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRhZ3JhbVBhY2tldCB0byBzZW5kCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIERhdGFncmFtUGFja2V0fSB0byBzZW5kCiAgICAgICogQHBhcmFtIHR0bAogICAgICAqICAgICAgICAgICAgdGhlIFRUTCBzZXR0aW5nIGZvciB0aGlzIHRyYW5zbWlzc2lvbiwgb3ZlcnJpZGluZyB0aGUgc29ja2V0CiAgICAgICogICAgICAgICAgICBkZWZhdWx0Ci0gICAgICogCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGEgc2VuZCBlcnJvciBvY2N1cnMuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjc2V0VGltZVRvTGl2ZX0KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2VuZGluZyBkYXRhIG9yIHNldHRpbmcgb3B0aW9ucy4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNzZXRUaW1lVG9MaXZlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2VuZChEYXRhZ3JhbVBhY2tldCBwYWNrLCBieXRlIHR0bCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKGZhbHNlKTsKQEAgLTM3NywxMyArMzgxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBuZXR3b3JrIGFkZHJlc3MgdXNlZCBieSB0aGUgc29ja2V0LiBUaGlzIGlzIHVzZWZ1bCBvbiBtdWx0aS1ob21lZAotICAgICAqIG1hY2hpbmVzLgorICAgICAqIFNldHMgdGhlIGludGVyZmFjZSBhZGRyZXNzIHVzZWQgYnkgdGhpcyBzb2NrZXQuIFRoaXMgYWxsb3dzIHRvIHNlbmQKKyAgICAgKiBtdWx0aWNhc3QgcGFja2V0cyBvbiBhIGRpZmZlcmVudCBpbnRlcmZhY2UgdGhhbiB0aGUgZGVmYXVsdCBpbnRlcmZhY2Ugb2YKKyAgICAgKiB0aGUgbG9jYWwgc3lzdGVtLiBUaGlzIGlzIHVzZWZ1bCBvbiBtdWx0aWhvbWVkIG1hY2hpbmVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcyB0aGUgaW50ZXJmYWNlIG5ldHdvcmsgYWRkcmVzcwotICAgICAqIEBleGNlcHRpb24gamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIHdoaWxlIHNldHRpbmcgdGhlIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aWNhc3QgaW50ZXJmYWNlIG5ldHdvcmsgYWRkcmVzcyB0byBzZXQuCisgICAgICogQGV4Y2VwdGlvbiBTb2NrZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICBhZGRyZXNzIG9wdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2UoSW5ldEFkZHJlc3MgYWRkcikgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CkBAIC00MjYsMTUgKzQzMywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc29ja2V0LiBUaGlzIGlzIHVzZWZ1bCBvbgotICAgICAqIG11bHRpLWhvbWVkIG1hY2hpbmVzLgorICAgICAqIFNldHMgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhpcyBzb2NrZXQuIFRoaXMgaXMgdXNlZnVsIGZvcgorICAgICAqIG11bHRpaG9tZWQgbWFjaGluZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ldEludGVyZmFjZQotICAgICAqICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRoZSBleGNlcHRpb24gbWF5IGJlIHRocm93biB3aGlsZSBzZXR0aW5nIHRoZSBhZGRyZXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuNAorICAgICAqICAgICAgICAgICAgdGhlIG11bHRpY2FzdCBuZXR3b3JrIGludGVyZmFjZSB0byBzZXQuCisgICAgICogQGV4Y2VwdGlvbiBTb2NrZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICBvcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmV0d29ya0ludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlIG5ldEludGVyZmFjZSkKICAgICAgICAgICAgIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewpAQCAtNTIwLDEyICs1MjcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRpbWUtdG8tbGl2ZSAoVFRMKSBmb3IgbXVsdGljYXN0IHBhY2tldHMgc2VudCBvbiB0aGlzIHNvY2tldC4KKyAgICAgKiBTZXRzIHRoZSB0aW1lLXRvLWxpdmUgKFRUTCkgZm9yIG11bHRpY2FzdCBwYWNrZXRzIHNlbnQgb24gdGhpcyBzb2NrZXQuCisgICAgICogVmFsaWQgVFRMIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0dGwKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lLXRvLWxpdmUsIDA8PXR0bDw9IDI1NQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGltZS10by1saXZlIGZpZWxkIHZhbHVlIGZvciBwYWNrZXRzIHNlbnQgb24gdGhpcworICAgICAqICAgICAgICAgICAgc29ja2V0LiB7QGNvZGUgMCA8PSB0dGwgPD0gMjU1fS4KICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiB0aHJvd24gd2hpbGUgc2V0dGluZyB0aGUgVFRMCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIFRUTCBvcHRpb24gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZVRvTGl2ZShpbnQgdHRsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZEJpbmQoZmFsc2UpOwpAQCAtNTM2LDE2ICs1NDYsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRpbWUtdG8tbGl2ZSAoVFRMKSBmb3IgbXVsdGljYXN0IHBhY2tldHMgc2VudCBvbiB0aGlzIHNvY2tldC4KKyAgICAgKiBTZXRzIHRoZSB0aW1lLXRvLWxpdmUgKFRUTCkgZm9yIG11bHRpY2FzdCBwYWNrZXRzIHNlbnQgb24gdGhpcyBzb2NrZXQuCisgICAgICogVmFsaWQgVFRMIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0dGwKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lLXRvLWxpdmUsIDA8dHRsPD0gMjU1CisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0aW1lLXRvLWxpdmUgZmllbGQgdmFsdWUgZm9yIHBhY2tldHMgc2VudCBvbiB0aGlzCisgICAgICogICAgICAgICAgICBzb2NrZXQ6IHtAY29kZSAwIDw9IHR0bCA8PSAyNTV9LgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRocm93biB3aGlsZSBzZXR0aW5nIHRoZSBUVEwKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgVFRMIG9wdGlvbiB2YWx1ZS4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSB7QGxpbmsgI3NldFRpbWVUb0xpdmV9CiAgICAgICogQHNlZSAjc2V0VGltZVRvTGl2ZShpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFRUTChieXRlIHR0bCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKGZhbHNlKTsKQEAgLTU3MCwxOCArNTgyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIE11bHRpY2FzdFNvY2tldCBib3VuZCB0byB0aGUgaG9zdC9wb3J0IHNwZWNpZmllZCBieSB0aGUKLSAgICAgKiBTb2NrZXRBZGRyZXNzLCBvciBhbiB1bmJvdW5kIERhdGFncmFtU29ja2V0IGlmIHRoZSBTb2NrZXRBZGRyZXNzIGlzIG51bGwuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBNdWx0aWNhc3RTb2NrZXR9IGJvdW5kIHRvIHRoZSBob3N0L3BvcnQgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlIHtAY29kZSBTb2NrZXRBZGRyZXNzfSwgb3IgYW4gdW5ib3VuZCB7QGNvZGUgRGF0YWdyYW1Tb2NrZXR9IGlmIHRoZQorICAgICAqIHtAY29kZSBTb2NrZXRBZGRyZXNzfSBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsQWRkcgotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG1hY2hpbmUgYWRkcmVzcyBhbmQgcG9ydCB0byBiaW5kIHRvCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWwgbWFjaGluZSBhZGRyZXNzIGFuZCBwb3J0IHRvIGJpbmQgdG8uCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgU29ja2V0QWRkcmVzcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTb2NrZXRBZGRyZXNzfSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGNyZWF0aW5nIG9yIGJpbmRpbmcgdGhlIHNvY2tldAotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgb3IgYmluZGluZyB0aGUgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNdWx0aWNhc3RTb2NrZXQoU29ja2V0QWRkcmVzcyBsb2NhbEFkZHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKGxvY2FsQWRkcik7CkBAIC01ODksMTUgKzYwMCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIElQX01VTFRJQ0FTVF9MT09QIHNvY2tldCBvcHRpb24uCisgICAgICogR2V0cyB0aGUgc3RhdGUgb2YgdGhlIHtAY29kZSBTb2NrZXRPcHRpb25zLklQX01VTFRJQ0FTVF9MT09QfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBJUF9NVUxUSUNBU1RfTE9PUCBpcyBlbmFibGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgSVAgbXVsdGljYXN0IGxvb3AgaXMgZW5hYmxlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgb3IgdGhlIG9wdGlvbiBpcyBpbnZhbGlkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb29wYmFja01vZGUoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRCaW5kKGZhbHNlKTsKQEAgLTYwNiwxNSArNjE1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBJUF9NVUxUSUNBU1RfTE9PUCBzb2NrZXQgb3B0aW9uLgorICAgICAqIFNldHMgdGhlIHtAY29kZSBTb2NrZXRPcHRpb25zLklQX01VTFRJQ0FTVF9MT09QfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9vcAotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBJUF9NVUxUSUNBU1RfTE9PUCBvcHRpb24gc2V0dGluZwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIGZvciB0aGUgc29ja2V0IG9wdGlvbiBzb2NrZXQge0Bjb2RlCisgICAgICogICAgICAgICAgICBTb2NrZXRPcHRpb25zLklQX01VTFRJQ0FTVF9MT09QfS4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkIG9yIHRoZSBvcHRpb24gaXMgaW52YWxpZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS40CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9vcGJhY2tNb2RlKGJvb2xlYW4gbG9vcCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQmluZChmYWxzZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTmVnQ2FjaGVFbGVtZW50LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTmVnQ2FjaGVFbGVtZW50LmphdmEKaW5kZXggYjVhZWIxYi4uMzYyYTk5NCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05lZ0NhY2hlRWxlbWVudC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9OZWdDYWNoZUVsZW1lbnQuamF2YQpAQCAtMTcsMzcgKzE3LDQzIEBACiBwYWNrYWdlIGphdmEubmV0OwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGZhaWxlZCBuYW1lIGxvb2t1cHMKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGZhaWxlZCBob3N0IG5hbWUgbG9va3Vwcy4KKyAqIAorICogQHNlZSBOZWdhdGl2ZUNhY2hlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogY2xhc3MgTmVnQ2FjaGVFbGVtZW50IHsKIAogICAgIC8vIHdlIG5lZWQgdGhlIHRpbWUgdG8gZmlndXJlIG91dCB3aGVuIHRoZSBlbnRyeSBpcyBzdGFsZQorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIGxvbmcgbmFub1RpbWVBZGRlZCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8vIGhvbGRzIHRoZSBuYW1lIG9mIHRoZSBob3N0IGZvciB3aGljaCB0aGUgbG9va3VwIGZhaWxlZAogICAgIFN0cmluZyBob3N0TmFtZTsKIAogICAgIC8qKgotICAgICAqIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBOZWdDYWNoZUVsZW1lbnQoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBzZXQgdGhlIGhvc3RuYW1lIGZvciB0aGUgZmFpbGVkIGVudHJ5CisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBzZXQgdGhlIGhvc3RuYW1lIGZvciB0aGUgZW50cnkgZm9yIHdoaWNoIHRoZSBsb29rdXAKKyAgICAgKiBmYWlsZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGhvc3ROYW1lCi0gICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBsb29rdXAgZmFpbGVkCisgICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSBob3N0IGZvciB3aGljaCB0aGUgbG9va3VwIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgTmVnQ2FjaGVFbGVtZW50KFN0cmluZyBob3N0TmFtZSkgewogICAgICAgICB0aGlzLmhvc3ROYW1lID0gaG9zdE5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaG9zdG5hbWUgZm9yIHRoZSBjYWNoZSBlbGVtZW50CisgICAgICogUmV0dXJucyB0aGUgaG9zdG5hbWUgZm9yIHRoZSBjYWNoZWQgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGhvc3ROYW1lIG5hbWUgb2YgdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGxvb2t1cCBmYWlsZWQKKyAgICAgKiBAcmV0dXJuIGhvc3ROYW1lIG5hbWUgb2YgdGhlIGhvc3QgZm9yIHdoaWNoIHRoZSBsb29rdXAgZmFpbGVkLgogICAgICAqLwogICAgIFN0cmluZyBob3N0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIGhvc3ROYW1lOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05lZ2F0aXZlQ2FjaGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9OZWdhdGl2ZUNhY2hlLmphdmEKaW5kZXggY2FjMTlmZC4uNjM4ZDQzZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05lZ2F0aXZlQ2FjaGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTmVnYXRpdmVDYWNoZS5qYXZhCkBAIC0yMyw3ICsyMywxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuUHJpdmlBY3Rpb247CiAKIC8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgbmVnYXRpdmUgbmFtZSBsb29rdXAgY2FjaGUuCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbWFpbnRhaW4gdGhlIG5lZ2F0aXZlIG5hbWUgbG9va3VwIGNhY2hlLCB3aGljaCBjYWNoZXMKKyAqIGhvc3QgbmFtZXMgd2hpY2ggY291bGQgbm90IGJlIHJlc29sdmVkLCBhcyBhIHNlY3VyaXR5IGZlYXR1cmUuCisgKiAKKyAqIEBzZWUgTmVnQ2FjaGVFbGVtZW50CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogY2xhc3MgTmVnYXRpdmVDYWNoZTxLLCBWPiBleHRlbmRzIExpbmtlZEhhc2hNYXA8SywgVj4gewogCkBAIC0zOCwyMiArNDIsMjQgQEAKICAgICBzdGF0aWMgZmluYWwgZmxvYXQgTE9BRElORyA9IDAuNzVGOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaG9zdG5hbWUgZm9yIHRoZSBjYWNoZSBlbGVtZW50CisgICAgICogUmV0dXJucyB0aGUgaG9zdG5hbWUgZm9yIHRoZSBjYWNoZSBlbGVtZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gaG9zdE5hbWUgbmFtZSBvZiB0aGUgaG9zdCBvbiB3aGljaCB0aGUgbG9va3VwIGZhaWxlZAorICAgICAqIEByZXR1cm4gaG9zdE5hbWUgbmFtZSBvZiB0aGUgaG9zdCBmb3Igd2hpY2ggdGhlIGxvb2t1cCBmYWlsZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgTmVnYXRpdmVDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIGFjY2Vzc09yZGVyKSB7CiAgICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgYWNjZXNzT3JkZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgRWxkZXN0IGVudHJ5LiBXZSByZW1vdmUgdGhlIGVsZGVzdCBlbnRyeQotICAgICAqIGlmIHRoZSBzaXplIGhhcyBncm93biBiZXlvbmQgdGhlIG1heGltdW0gc2l6ZSBhbGxvd2VkIGZvciB0aGUgY2FjaGUuIFdlCi0gICAgICogY3JlYXRlIHRoZSBMaW5rZWRIYXNoTWFwIHN1Y2ggdGhhdCB0aGlzIGRlbGV0ZXMgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQKLSAgICAgKiBlbnRyeQorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZWxkZXN0IGVudHJ5IHNob3VsZCBiZSByZW1vdmVkLiBJdCBpcyByZW1vdmVkIGlmIHRoZQorICAgICAqIHNpemUgaGFzIGdyb3duIGJleW9uZCB0aGUgbWF4aW11bSBzaXplIGFsbG93ZWQgZm9yIHRoZSBjYWNoZS4gQSB7QGNvZGUKKyAgICAgKiBMaW5rZWRIYXNoTWFwfSBpcyBjcmVhdGVkIHN1Y2ggdGhhdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyeSBpcworICAgICAqIGRlbGV0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVsZGVzdAotICAgICAqICAgICAgICAgICAgdGhlIG1hcCBlbnRyeSB3aGljaCB3aWxsIGJlIGRlbGV0ZWQgaWYgd2UgcmV0dXJuIHRydWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgZW50cnkgd2hpY2ggd2lsbCBiZSBkZWxldGVkIGlmIHdlIHJldHVybiB7QGNvZGUgdHJ1ZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PEssIFY+IGVsZGVzdCkgewpAQCAtNjIsMTIgKzY4LDEzIEBACiAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG5hbWUgbG9va3VwIGZhaWwgbWVzc2FnZSB0byB0aGUKLSAgICAgKiBjYWNoZQorICAgICAqIGNhY2hlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBob3N0TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGhvc3QgZm9yIHdoaWNoIHRoZSBsb29rdXAgZmFpbGVkCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgaG9zdCBmb3Igd2hpY2ggdGhlIGxvb2t1cCBmYWlsZWQuCiAgICAgICogQHBhcmFtIGZhaWxlZE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJldHVybmVkIHdoZW4gd2UgZmFpbGVkIHRoZSBsb29rdXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJldHVybmVkIHdoZW4gdGhlIGxvb2t1cCBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBwdXQoU3RyaW5nIGhvc3ROYW1lLCBTdHJpbmcgZmFpbGVkTWVzc2FnZSkgewogICAgICAgICBjaGVja0NhY2hlRXhpc3RzKCk7CkBAIC03NSwxMyArODIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRoYXQgb2NjdXJyZWQgd2hlbiB3ZSBmYWlsZWQgdG8gbG9va3VwIHRoZSBob3N0IGlmCi0gICAgICogc3VjaCBhIGZhaWx1cmUgaXMgd2l0aGluIHRoZSBjYWNoZSBhbmQgdGhlIGVudHJ5IGhhcyBub3QgeWV0IGV4cGlyZWQKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIG9mIHRoZSBuZWdhdGl2ZSBjYWNoZSBpZiB0aGUgZW50cnkgaGFzIG5vdCB5ZXQKKyAgICAgKiBleHBpcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBob3N0TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGhvc3QgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhbiBlbnRyeQotICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugd2hpY2ggd2FzIHJldHVybmVkIHdoZW4gdGhlIGhvc3QgZmFpbGVkIHRvIGJlIGxvb2tlZAotICAgICAqICAgICAgICAgdXAgaWYgdGhlcmUgaXMgc3RpbGwgYSB2YWxpZCBlbnRyeSB3aXRoaW4gdGhlIGNhY2hlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgaG9zdCBmb3Igd2hpY2ggd2UgbG9vayB1cCB0aGUgZW50cnkuCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSB3aGljaCB3YXMgcmV0dXJuZWQgd2hlbiB0aGUgaG9zdCBsb29rdXAgZmFpbGVkIGlmIHRoZQorICAgICAqICAgICAgICAgZW50cnkgaGFzIG5vdCB5ZXQgZXhwaXJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBzdGF0aWMgU3RyaW5nIGdldEZhaWxlZE1lc3NhZ2UoU3RyaW5nIGhvc3ROYW1lKSB7CiAgICAgICAgIGNoZWNrQ2FjaGVFeGlzdHMoKTsKQEAgLTEwMiwxMiArMTEwLDE0IEBACiAgICAgICAgICAgICAgICAgbmVnQ2FjaGUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodHRsICE9IC0xKSB7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICAgICAgbG9uZyBkZWx0YSA9IFN5c3RlbS5uYW5vVGltZSgpIC0gZWxlbWVudC5uYW5vVGltZUFkZGVkOwogICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IHNlY29uZHNUb05hbm9zKHR0bCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGNhY2hlIGFuZCByZXR1cm4gbnVsbAogICAgICAgICAgICAgICAgICAgICBuZWdDYWNoZS5yZW1vdmUoaG9zdE5hbWUpOwogICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKQEAgLTExNiwxNSArMTI2LDE4IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAvKioKICAgICAgKiBNdWx0aXBsaWVzIHZhbHVlIGJ5IDEgYmlsbGlvbi4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2Vjb25kc1RvTmFub3MoaW50IHR0bCkgewogICAgICAgICByZXR1cm4gdHRsICogMTAwMDAwMDAwMDsKICAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB3ZSBoYXZlIGNyZWF0ZWQgdGhlIGNhY2hlIGFuZCBpZiBub3QgY3JlYXRlcyBpdAorICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBjYWNoZSB3YXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBpZiBub3QKKyAgICAgKiBjcmVhdGVzIGl0LgogICAgICAqLwogICAgIHN0YXRpYyB2b2lkIGNoZWNrQ2FjaGVFeGlzdHMoKSB7CiAgICAgICAgIGlmIChuZWdDYWNoZSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTmV0UGVybWlzc2lvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05ldFBlcm1pc3Npb24uamF2YQppbmRleCBkNDMxOGQzLi5lN2NjYThiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTmV0UGVybWlzc2lvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9OZXRQZXJtaXNzaW9uLmphdmEKQEAgLTE4LDcgKzE4LDggQEAKIHBhY2thZ2UgamF2YS5uZXQ7CiAKIC8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHBlcm1pc3Npb24gdG8gYWNjZXNzIG5ldHdvcmsgcmVzb3VyY2VzLgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHBlcm1pc3Npb25zIHRvIGNvbmZpZ3VyZSB0aGUgYWNjZXNzIHRvIG5ldHdvcmsKKyAqIHJlc291cmNlcy4KICAqIDxwPgogICogVGhlcmUgYXJlIHRocmVlIHZhbGlkIHRhcmdldCBuYW1lczoKICAqIDxkbD4KQEAgLTMwLDkgKzMxLDExIEBACiAgKiA8ZGQ+QWxsb3dzIGEgc3RyZWFtIChwcm90b2NvbCkgaGFuZGxlciB0byBiZSBzZXQgd2hlbiBjb25zdHJ1Y3RpbmcgYW4gVVJMCiAgKiBvYmplY3Q8L2RkPgogICogPC9kbD4KKyAqIDwvcD4KICAqIAogICogQHNlZSBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbgogICogQHNlZSBTZWN1cml0eU1hbmFnZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTmV0UGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uIHsKIApAQCAtNDIsMjAgKzQ1LDIyIEBACiAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgbmV3IHBlcm1pc3Npb24uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmV3IE5ldFBlcm1pc3Npb24gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5ldFBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFjdGlvbiBsaXN0LgotICAgICAqIFRoZSBhY3Rpb24gbGlzdCBpcyBpZ25vcmVkLgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhbiBhY3Rpb24gbGlzdC4KKyAgICAgKiBUaGUgYWN0aW9uIGxpc3QgaXMgaWdub3JlZCBhbmQgc2hvdWxkIGJlIHtAY29kZSBudWxsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBuZXcgcGVybWlzc2lvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBuZXcge0Bjb2RlIE5ldFBlcm1pc3Npb259IGluc3RhbmNlLgogICAgICAqIEBwYXJhbSBhY3Rpb25zCi0gICAgICogICAgICAgICAgICBTdHJpbmcgaWdub3JlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpZ25vcmVkIGFjdGlvbiBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5ldFBlcm1pc3Npb24oU3RyaW5nIG5hbWUsIFN0cmluZyBhY3Rpb25zKSB7CiAgICAgICAgIHN1cGVyKG5hbWUsIGFjdGlvbnMpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05ldHdvcmtJbnRlcmZhY2UuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNlLmphdmEKaW5kZXggOTM0ZjRhNi4uNjg0NTJlNmIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05ldHdvcmtJbnRlcmZhY2UuamF2YQpAQCAtMjQsOCArMjQsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIG1ldGhvZHMgdGhhdCBhcmUgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiBuZXR3b3JrIGludGVyZmFjZXMgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0KKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYSBuZXR3b3JrIGludGVyZmFjZSBvZiB0aGUgbG9jYWwgZGV2aWNlLiBBbgorICogaW50ZXJmYWNlIGlzIGRlZmluZWQgYnkgaXRzIGFkZHJlc3MgYW5kIGEgcGxhdGZvcm0gZGVwZW5kZW50IG5hbWUuIFRoZSBjbGFzcworICogcHJvdmlkZXMgbWV0aG9kcyB0byBnZXQgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdmFpbGFibGUgaW50ZXJmYWNlcyBvZiB0aGUKKyAqIHN5c3RlbSBvciB0byBpZGVudGlmeSB0aGUgbG9jYWwgaW50ZXJmYWNlIG9mIGEgam9pbmVkIG11bHRpY2FzdCBncm91cC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBOZXR3b3JrSW50ZXJmYWNlIGV4dGVuZHMgT2JqZWN0IHsKIApAQCAtNDksMTIgKzUzLDEyIEBACiAgICAgcHJpdmF0ZSBpbnQgaGFzaENvZGU7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG5hdGl2ZSByZXR1cm5zIHRoZSBsaXN0IG9mIG5ldHdvcmsgaW50ZXJmYWNlcyBzdXBwb3J0ZWQgYnkgdGhlCi0gICAgICogc3lzdGVtLiBBbiBhcnJheSBpcyByZXR1cm5lZCB3aGljaCBpcyBlYXNpZXIgdG8gZ2VuZXJhdGUgYW5kIHdoaWNoIGNhbgotICAgICAqIGVhc2lseSBiZSBjb252ZXJ0ZWQgaW50byB0aGUgcmVxdWlyZWQgZW51bWVyYXRpb24gb24gdGhlIGphdmEgc2lkZQorICAgICAqIFRoaXMge0Bjb2RlIG5hdGl2ZX0gbWV0aG9kIHJldHVybnMgdGhlIGxpc3Qgb2YgbmV0d29yayBpbnRlcmZhY2VzCisgICAgICogc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0uIEFuIGFycmF5IGlzIHJldHVybmVkIHdoaWNoIGlzIGVhc2llciB0byBnZW5lcmF0ZQorICAgICAqIGFuZCB3aGljaCBjYW4gZWFzaWx5IGJlIGNvbnZlcnRlZCBpbnRvIHRoZSByZXF1aXJlZCBlbnVtZXJhdGlvbiBvbiB0aGUKKyAgICAgKiBqYXZhIHNpZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgTmV0d29ya0ludGVyZmFjZSBvYmplY3RzCi0gICAgICogCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUge0Bjb2RlIE5ldHdvcmtJbnRlcmZhY2V9IG9iamVjdHMKICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGdldHRpbmcgbmV0d29yayBpbnRlcmZhY2UgaW5mb3JtYXRpb24KICAgICAgKi8KQEAgLTYzLDE3ICs2NywxNyBAQAogCiAgICAgLyoqCiAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBuYXRpdmUgbWV0aG9kIGluIG9yZGVyIHRvIGNvbnN0cnVjdCB0aGUKLSAgICAgKiBOZXR3b3JrSW50ZXJmYWNlIG9iamVjdHMgaW4gdGhlIGFycmF5IHRoYXQgaXQgcmV0dXJucworICAgICAqIE5ldHdvcmtJbnRlcmZhY2Ugb2JqZWN0cyBpbiB0aGUgYXJyYXkgdGhhdCBpdCByZXR1cm5zLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBpbnRlcm5hbCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICBpbnRlcm5hbCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJmYWNlLgogICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZQotICAgICAqICAgICAgICAgICAgYSB1c2VyIGludGVycHJldGFibGUgbmFtZSBmb3IgdGhlIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgYSB1c2VyIGludGVycHJldGFibGUgbmFtZSBmb3IgdGhlIGludGVyZmFjZS4KICAgICAgKiBAcGFyYW0gYWRkcmVzc2VzCi0gICAgICogICAgICAgICAgICB0aGUgSW50ZXJuZXQgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICB0aGUgSW50ZXJuZXQgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJmYWNlLgogICAgICAqIEBwYXJhbSBpbnRlcmZhY2VJbmRleAogICAgICAqICAgICAgICAgICAgYW4gaW5kZXggZm9yIHRoZSBpbnRlcmZhY2UuIE9ubHkgc2V0IGZvciBwbGF0Zm9ybXMgdGhhdAotICAgICAqICAgICAgICAgICAgc3VwcG9ydCBJUFY2CisgICAgICogICAgICAgICAgICBzdXBwb3J0IElQVjYuCiAgICAgICovCiAgICAgTmV0d29ya0ludGVyZmFjZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRpc3BsYXlOYW1lLCBJbmV0QWRkcmVzcyBhZGRyZXNzZXNbXSwKICAgICAgICAgICAgIGludCBpbnRlcmZhY2VJbmRleCkgewpAQCAtMTA4LDE4ICsxMTIsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAgICAgKiBHZXRzIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHtAY29kZSBOZXR3b3JrSW50ZXJmYWNlfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgaW50ZXJuZXQgYWRkcmVzc2VzIGJvdW5kIHRvIHRoZSBpbnRlcmZhY2UKKyAgICAgKiBHZXRzIGEgbGlzdCBvZiBhZGRyZXNzZXMgYm91bmQgdG8gdGhpcyBuZXR3b3JrIGludGVyZmFjZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgaW50ZXJuZXQgYWRkcmVzc2VzIGJvdW5kIHRvIHRoZSBpbnRlcmZhY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIGxpc3Qgb2YgdGhlIHJlcHJlc2VudGVkIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxJbmV0QWRkcmVzcz4gZ2V0SW5ldEFkZHJlc3NlcygpIHsKICAgICAgICAgLyoKQEAgLTE4MiwxMCArMTg4LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXNlciByZWFkYWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAgICAgKiBHZXRzIHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gZGlzcGxheSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yayBpbnRlcmZhY2Ugb3IgbnVsbCBpZiBvbmUKLSAgICAgKiAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBuZXR3b3JrIGludGVyZmFjZSBvciB0aGUgbmFtZSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGRpc3BsYXkgbmFtZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7CiAgICAgICAgIC8qCkBAIC0xOTksMTQgKzIwNiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBvbmUgZXhpc3RzCisgICAgICogR2V0cyB0aGUgc3BlY2lmaWMgbmV0d29yayBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaW50ZXJmYWNlIGZvciBuYW1lIHNwZWNpZmllZCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsCi0gICAgICogCisgICAgICogQHBhcmFtIGludGVyZmFjZU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBzZWFyY2hlZCBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIGludGVyZmFjZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpZiBvbmUgZXhpc3RzIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gZ2V0dGluZyBuZXR3b3JrIGludGVyZmFjZSBpbmZvcm1hdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBnZXR0aW5nIHRoZSBuZXR3b3JrIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgIGluZm9ybWF0aW9uLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW50ZXJmYWNlIG5hbWUgcGFzc2VkIGluIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gaW50ZXJmYWNlJ3MgbmFtZSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBOZXR3b3JrSW50ZXJmYWNlIGdldEJ5TmFtZShTdHJpbmcgaW50ZXJmYWNlTmFtZSkKICAgICAgICAgICAgIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewpAQCAtMjMyLDE4ICsyNDMsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXR3b3JrIGludGVyZmFjZSB3aGljaCBoYXMgdGhlIHNwZWNpZmllZCBpbnRlcm5ldCBhZGRyZXNzCi0gICAgICogYm91bmQgdG8gaXQsIGlmIG9uZSBleGlzdHMuCisgICAgICogR2V0cyB0aGUgc3BlY2lmaWMgbmV0d29yayBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBhZGRyZXNzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICogICAgICAgICAgICBhZGRyZXNzIG9mIGludGVyZXN0Ci0gICAgICogQHJldHVybiBuZXR3b3JrIGludGVyZmFjZSBmb3IgaW50ZXJuZXQgYWRkcmVzcyBzcGVjaWZpZWQgaWYgaXQgZXhpc3RzLAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIG51bGwKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIHRvIGlkZW50aWZ5IHRoZSBzZWFyY2hlZCBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIGludGVyZmFjZSB3aXRoIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBpZiBvbmUgZXhpc3RzIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gZ2V0dGluZyBuZXR3b3JrIGludGVyZmFjZSBpbmZvcm1hdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBnZXR0aW5nIHRoZSBuZXR3b3JrIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgIGluZm9ybWF0aW9uLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBwYXNzZWQgaW4gaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBpbnRlcmZhY2UgYWRkcmVzcyBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTmV0d29ya0ludGVyZmFjZSBnZXRCeUluZXRBZGRyZXNzKEluZXRBZGRyZXNzIGFkZHJlc3MpCiAgICAgICAgICAgICB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKQEAgLTI4MywxNCArMjk0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBuZXR3b3JrIGludGVyZmFjZXMgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gb3IgbnVsbCBpZgotICAgICAqIG5vIGludGVyZmFjZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgc3lzdGVtCisgICAgICogR2V0cyBhIGxpc3Qgb2YgYWxsIG5ldHdvcmsgaW50ZXJmYWNlcyBhdmFpbGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbSBvcgorICAgICAqIHtAY29kZSBudWxsfSBpZiBubyBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gRW51bWVyYXRpb24gY29udGFpbmluZyBvbmUgTmV0d29ya0ludGVyZmFjZSBvYmplY3QgZm9yIGVhY2gKLSAgICAgKiAgICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHN5c3RlbQotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Yge0Bjb2RlIE5ldHdvcmtJbnRlcmZhY2V9IGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlCisgICAgICogICAgICAgICBhdmFpbGFibGUgaW50ZXJmYWNlcy4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGdldHRpbmcgbmV0d29yayBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2V0dGluZyB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICBpbmZvcm1hdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uPE5ldHdvcmtJbnRlcmZhY2U+IGdldE5ldHdvcmtJbnRlcmZhY2VzKCkKICAgICAgICAgICAgIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewpAQCAtMzIxLDE2ICszMzMsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIE5ldHdvcmtJbnRlcmZhY2UgYW5kIGFuc3dlciBpZiB0aGV5Ci0gICAgICogYXJlIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTmV0d29ya0ludGVyZmFjZSB3aXRoIHRoZQotICAgICAqIHNhbWUgbmFtZSwgZGlzcGxheU5hbWUgYW5kIGxpc3Qgb2YgbmV0d29yayBpbnRlcmZhY2VzIHRvIGJlIHRoZSBzYW1lCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyB7QGNvZGUgTmV0d29ya0ludGVyZmFjZX0gYW5kCisgICAgICogcmV0dXJucyB3aGV0aGVyIHRoZXkgYXJlIGVxdWFsIG9yIG5vdC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCisgICAgICoge0Bjb2RlIE5ldHdvcmtJbnRlcmZhY2V9IHdpdGggdGhlIHNhbWUgbmFtZSwge0Bjb2RlIGRpc3BsYXlOYW1lfSBhbmQgbGlzdAorICAgICAqIG9mIG5ldHdvcmsgaW50ZXJmYWNlcyB0byBiZSBlcXVhbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBOZXR3b3JrSW50ZXJmY2FlLAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBOZXR3b3JrSW50ZXJmYWNlfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtMzk0LDExICs0MDcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIE5ldHdvcmtJbnRlcmZhY2Ugb2JqZWN0LiBTaW5jZSB0aGUgbmFtZQotICAgICAqIHNob3VsZCBiZSB1bmlxdWUgZm9yIGVhY2ggbmV0d29yayBpbnRlcmZhY2UgdGhlIGhhc2ggY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgKiB1c2luZyB0aGlzIG5hbWUKKyAgICAgKiBHZXRzIHRoZSBoYXNoY29kZSBmb3IgdGhpcyB7QGNvZGUgTmV0d29ya0ludGVyZmFjZX0gaW5zdGFuY2UuIFNpbmNlIHRoZQorICAgICAqIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBmb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSB0aGUgaGFzaGNvZGUgaXMKKyAgICAgKiBnZW5lcmF0ZWQgdXNpbmcgdGhpcyBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2hjb2RlIGZvciBoYXNodGFibGUgaW5kZXhpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgTmV0d29ya0ludGVyZmFjZX0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTQwOSwxMCArNDIzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UKKyAgICAgKiBHZXRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICogbmV0d29yayBpbnRlcmZhY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisgICAgICogQHJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05vUm91dGVUb0hvc3RFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uLmphdmEKaW5kZXggNTU3YmY3Ni4uMDQyY2NkNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L05vUm91dGVUb0hvc3RFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyNyArMTgsMzIgQEAKIHBhY2thZ2UgamF2YS5uZXQ7CiAKIC8qKgotICogVGhlIE5vUm91dGVUb0hvc3RFeGNlcHRpb24gbWF5IGJlIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhCi0gKiByZW1vdGUgbWFjaGluZSBhbmQgYmVjYXVzZSBvZiBuZXR3b3JrIGZhdWx0IG9yIGZpcmV3YWxsLCBubyByb3V0ZSBjYW4gYmUKLSAqIGVzdGFibGlzaGVkLgorICogVGhlIHtAY29kZSBOb1JvdXRlVG9Ib3N0RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93biB3aGlsZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QKKyAqIHRvIGEgcmVtb3RlIGhvc3QgYnV0IHRoZSBob3N0IGNhbm5vdCBiZSByZWFjaGVkIGZvciBpbnN0YW5jZSBiZWNhdXNlIG9mIGEKKyAqIGJhZGx5IGNvbmZpZ3VyZWQgcm91dGVyIG9yIGEgYmxvY2tpbmcgZmlyZXdhbGwuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbiBleHRlbmRzIFNvY2tldEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTg5NzU1MDg5NDg3MzQ5Mzc5MEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBleGNlcHRpb24gd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBleGNlcHRpb24gd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKICAgICAgKiBmaWxsZWQgaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Bhc3N3b3JkQXV0aGVudGljYXRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9QYXNzd29yZEF1dGhlbnRpY2F0aW9uLmphdmEKaW5kZXggZGMzN2Y4Yy4uMzI0Zjg3OCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Bhc3N3b3JkQXV0aGVudGljYXRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvUGFzc3dvcmRBdXRoZW50aWNhdGlvbi5qYXZhCkBAIC0xOCw3ICsxOCwxMSBAQAogcGFja2FnZSBqYXZhLm5ldDsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgorICogVGhpcyBpbW11dGFibGUgY2xhc3MgaXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGVuY2Fwc3VsYXRlcyB1c2VybmFtZSBhbmQKKyAqIHBhc3N3b3JkIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHtAY29kZSBBdXRoZW50aWNhdG9yfSBjbGFzcy4KKyAqIAorICogQHNlZSBBdXRoZW50aWNhdG9yCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFBhc3N3b3JkQXV0aGVudGljYXRpb24gewogCkBAIC0yNywxMyArMzEsMTQgQEAKICAgICBwcml2YXRlIGNoYXJbXSBwYXNzd29yZDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiB3aXRoIGEgdXNlcm5hbWUgYW5kCi0gICAgICogcGFzc3dvcmQuCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIHdpdGggYSBzcGVjaWZpZWQKKyAgICAgKiB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVzZXJOYW1lCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSB1c2VybmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHVzZXJuYW1lIHRvIHN0b3JlLgogICAgICAqIEBwYXJhbSBwYXNzd29yZAotICAgICAqICAgICAgICAgICAgY2hhcltdIHRoZSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgcGFzc3dvcmQgdG8gc3RvcmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBhc3N3b3JkQXV0aGVudGljYXRpb24oU3RyaW5nIHVzZXJOYW1lLCBjaGFyW10gcGFzc3dvcmQpIHsKICAgICAgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOwpAQCAtNDEsMTggKzQ2LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBwYXNzd29yZCBvZiB0aGlzIGNsYXNzLgorICAgICAqIEdldHMgYSBjbG9uZSBvZiB0aGUgcGFzc3dvcmQgc3RvcmVkIGJ5IHRoaXMgaW5zdGFuY2UuIFRoZSB1c2VyIGlzCisgICAgICogcmVzcG9uc2libGUgdG8gZmluYWxpemUgdGhlIHJldHVybmVkIGFycmF5IGlmIHRoZSBwYXNzd29yZCBjbG9uZSBpcyBubworICAgICAqIGxvbmdlciBuZWVkZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBjaGFyW10gdGhlIHJlZmVyZW5jZSBvZiB0aGUgcGFzc3dvcmQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3BpZWQgcGFzc3dvcmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXJbXSBnZXRQYXNzd29yZCgpIHsKICAgICAgICAgcmV0dXJuIHBhc3N3b3JkLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXNlcm5hbWUgb2YgdGhpcyBjbGFzcy4KKyAgICAgKiBHZXRzIHRoZSB1c2VybmFtZSBzdG9yZWQgYnkgdGhpcyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgdGhlIHVzZXJuYW1lIG9mIHRoaXMgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBzdG9yZWQgdXNlcm5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIHVzZXJOYW1lOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1BvcnRVbnJlYWNoYWJsZUV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1BvcnRVbnJlYWNoYWJsZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGFmNWQ5NDcuLjk3M2E5NzggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Qb3J0VW5yZWFjaGFibGVFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uLmphdmEKQEAgLTE3LDEyICsxNywxOCBAQAogCiBwYWNrYWdlIGphdmEubmV0OwogCisvKioKKyAqIFRoaXMge0Bjb2RlIFBvcnRVbnJlYWNoYWJsZUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgYW4ge0Bjb2RlCisgKiBJQ01QX1BvcnRfVW5yZWFjaGFibGV9IG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCisgKi8KIHB1YmxpYyBjbGFzcyBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24gZXh0ZW5kcyBTb2NrZXRFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODQ2MjU0MTk5MjM3NjUwNzMyM0w7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24oKSB7CiAgICAgfQpAQCAtMzIsNyArMzgsOCBAQAogICAgICAqIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBvcnRVbnJlYWNoYWJsZUV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Qcm90b2NvbEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3RvY29sRXhjZXB0aW9uLmphdmEKaW5kZXggMjI2NDQ4Ny4uZjMyZGVkYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3RvY29sRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3RvY29sRXhjZXB0aW9uLmphdmEKQEAgLTE4LDExICsxOCwxMSBAQAogcGFja2FnZSBqYXZhLm5ldDsKIAogLyoqCi0gKiBBbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gYSBzb2NrZXQgb2YgdGhlIHdyb25nIHR5cGUgKHN0cmVhbSBvciBub25zdHJlYW0pCi0gKiB3aWxsIHRyaWdnZXIgdGhpcyBleGNlcHRpb24uIEFuIGludmFsaWQgb3BlcmF0aW9uIGFwcGxpZWQgb24gdGhlIHByb3RvY29sCi0gKiB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdCB3aWxsIGFsc28gdGhyb3cgdGhpcyBleGNlcHRpb24uCisgKiBTaWduYWxzIHRoYXQgZWl0aGVyIGEgY29ubmVjdGlvbiBhdHRlbXB0IHRvIGEgc29ja2V0IG9mIHRoZSB3cm9uZyB0eXBlLCB0aGUKKyAqIGFwcGxpY2F0aW9uIG9mIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBvciB0aGF0IGEgZ2VuZXJhbCBlcnJvciBpbiB0aGUKKyAqIHVuZGVybHlpbmcgcHJvdG9jb2wgaGFzIG9jY3VycmVkLgogICogCi0gKiBAc2VlIFVSTAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24gewogCkBAIC0zMCw2ICszMCw4IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm90b2NvbEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTQwLDcgKzQyLDggQEAKICAgICAgKiBmaWxsZWQgaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Qcm94eS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3h5LmphdmEKaW5kZXggYzZjMzdjMi4uZGYwMzgzZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3h5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3h5LmphdmEKQEAgLTE4LDIwICsxOCwyNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgYWJvdXQgcHJveHkgc2V0dGluZy4gQSBwcm94eSBjb250YWlucyA8Y29kZT50eXBlPC9jb2RlPiwKLSAqIHByb3h5IGhvc3QgYWRkcmVzcyBpbmZvcm1hdGlvbi4gVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIDxjb2RlPlByb3h5PC9jb2RlPjoKLSAqIDxsaT5EaXJlY3QgdHlwZSBwcm94eTwvbGk+Ci0gKiA8bGk+SFRUUCB0eXBlIHByb3h5PC9saT4KLSAqIDxsaT5TT0NLUyB0eXBlIHByb3h5PC9saT4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBwcm94eSBzZXJ2ZXIgc2V0dGluZ3MuIEEgY3JlYXRlZCBpbnN0YW5jZSBvZiB7QGNvZGUKKyAqIFByb3h5fSBzdG9yZXMgYSB0eXBlIGFuZCBhbiBhZGRyZXNzIGFuZCBpcyBpbW11dGFibGUuIFRoZXJlIGFyZSB0aHJlZSB0eXBlcworICogb2YgcHJveGllczoKKyAqIDx1bD4KKyAqIDxsaT5ESVJFQ1Q8L2xpPgorICogPGxpPkhUVFA8L2xpPgorICogPGxpPlNPQ0tTPC9saT48L3VsCiAgKiAKLSAqIEEgPGNvZGU+UHJveHk8L2NvZGU+IGluc3RhbmNlIGlzIGltbXV0YWJsZS4KLSAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQcm94eSB7CiAKICAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIDxjb2RlPlByb3h5LlR5cGUuRElSRUNUPC9jb2RlPiB0eXBlIHByb3h5IHNldHRpbmcuIEl0IHRlbGxzCi0gICAgICogcHJvdG9jb2wgaGFuZGxlcnMgbm90IHRvIHVzZSBhbnkgcHJveHkuCisgICAgICogUmVwcmVzZW50cyB0aGUgcHJveHkgdHlwZSBzZXR0aW5nIHtAY29kZSBQcm94eS5UeXBlLkRJUkVDVH0uIEl0IHRlbGxzCisgICAgICogcHJvdG9jb2wgaGFuZGxlcnMgdGhhdCB0aGVyZSBpcyBubyBwcm94eSB0byBiZSB1c2VkLiBUaGUgYWRkcmVzcyBpcyBzZXQKKyAgICAgKiB0byB7QGNvZGUgbnVsbH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcm94eSBOT19QUk9YWSA9IG5ldyBQcm94eSgpOwogCkBAIC00MCwxOSArNDQsMjEgQEAKICAgICBwcml2YXRlIFNvY2tldEFkZHJlc3MgYWRkcmVzczsKIAogICAgIC8qKgotICAgICAqIE5ldyBhIDxjb2RlPlByb3h5PC9jb2RlPiBpbnN0YW5jZS4gU29ja2V0QWRkcmVzcyBtdXN0IE5PVCBiZSBudWxsIHdoZW4KLSAgICAgKiA8Y29kZT50eXBlPC9jb2RlPiBpcyBlaXRoZXIgPGNvZGU+UHJveHkuVHlwZS5IVFRQPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPlByb3h5LlR5cGUuU09DS1M8L2NvZGU+LiBGb3IgPGNvZGU+UHJveHkuVHlwZS5ESVJFQ1Q8L2NvZGU+Ci0gICAgICogdHlwZSBwcm94eSwgdXNlIDxjb2RlPlByb3h5Lk5PX1BST1hZPC9jb2RlPiBkaXJlY3RseSBpbnN0ZWFkIG9mCi0gICAgICogY29uc3RydWN0aW5nIGl0LgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFByb3h5fSBpbnN0YW5jZS4ge0Bjb2RlIFNvY2tldEFkZHJlc3N9IG11c3QgTk9UIGJlCisgICAgICoge0Bjb2RlIG51bGx9IHdoZW4ge0Bjb2RlIHR5cGV9IGlzIGVpdGhlciB7QGNvZGUgUHJveHkuVHlwZS5IVFRQfSBvcgorICAgICAqIHtAY29kZSBQcm94eS5UeXBlLlNPQ0tTfS4gVG8gY3JlYXRlIGEge0Bjb2RlIFByb3h5fSBpbnN0YW5jZSByZXByZXNlbnRpbmcKKyAgICAgKiB0aGUgcHJveHkgdHlwZSB7QGNvZGUgUHJveHkuVHlwZS5ESVJFQ1R9LCB1c2Uge0Bjb2RlIFByb3h5Lk5PX1BST1hZfQorICAgICAqIGluc3RlYWQgb2YgdGhpcyBjb25zdHJ1Y3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgcHJveHkgdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3h5IHR5cGUgb2YgdGhpcyBpbnN0YW5jZS4KICAgICAgKiBAcGFyYW0gc2EKLSAgICAgKiAgICAgICAgICAgIHByb3h5IGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm94eSBhZGRyZXNzIG9mIHRoaXMgaW5zdGFuY2UuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnR5cGU8L2NvZGU+IGlzIDxjb2RlPlByb3h5LlR5cGUuRElSRUNUPC9jb2RlPgotICAgICAqICAgICAgICAgICAgIG9yIFNvY2tldEFkZHJlc3MgaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFyYW1ldGVyIHtAY29kZSB0eXBlfSBpcyBzZXQgdG8ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgUHJveHkuVHlwZS5ESVJFQ1R9IG9yIHRoZSB2YWx1ZSBmb3Ige0Bjb2RlIFNvY2tldEFkZHJlc3N9IGlzCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm94eShQcm94eS5UeXBlIHR5cGUsIFNvY2tldEFkZHJlc3Mgc2EpIHsKICAgICAgICAgLyoKQEAgLTc3LDMzICs4MywzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3h5IHR5cGUuCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGlzIHtAY29kZSBQcm94eX0gaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJveHkgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdG9yZWQgcHJveHkgdHlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJveHkuVHlwZSB0eXBlKCkgewogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm94eSBhZGRyZXNzLgorICAgICAqIEdldHMgdGhlIGFkZHJlc3Mgb2YgdGhpcyB7QGNvZGUgUHJveHl9IGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3h5IGFkZHJlc3MgZm9yIDxjb2RlPkhUVFA8L2NvZGU+IGFuZCA8Y29kZT5TT0NLUzwvY29kZT4KLSAgICAgKiAgICAgICAgIHR5cGUgcHJveHkuIFJldHVybnMgbnVsbCBmb3IgPGNvZGU+RElSRUNUPC9jb2RlPiB0eXBlIHByb3h5LgorICAgICAqIEByZXR1cm4gdGhlIHN0b3JlZCBwcm94eSBhZGRyZXNzIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJveHkgdHlwZSBpcworICAgICAqICAgICAgICAge0Bjb2RlIERJUkVDVH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldEFkZHJlc3MgYWRkcmVzcygpIHsKICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmVwcmVzZW50aW5nIHN0cmluZyBvZiB0aGUgcHJveHkuIFRoZSBzdHJpbmcgY29uc2lzdHMgb2YKLSAgICAgKiA8Y29kZT50eXBlLnRvU3RyaW5nKCk8L2NvZGU+IGFuZCA8Y29kZT5hZGRyZXNzLnRvU3RyaW5nKCk8L2NvZGU+IGlmCi0gICAgICogPGNvZGU+dHlwZTwvY29kZT4gYW5kIDxjb2RlPmFkZHJlc3M8L2NvZGU+IGFyZSBub3QgbnVsbC4KLSAgICAgKiA8L3A+CisgICAgICogR2V0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgUHJveHl9IGluc3RhbmNlLiBUaGUgc3RyaW5nCisgICAgICogaW5jbHVkZXMgdGhlIHR3byBwYXJ0cyB7QGNvZGUgdHlwZS50b1N0cmluZygpfSBhbmQge0Bjb2RlCisgICAgICogYWRkcmVzcy50b1N0cmluZygpfSBpZiB7QGNvZGUgYWRkcmVzc30gaXMgbm90IHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICogQHJldHVybiByZXByZXNlbnRpbmcgc3RyaW5nIG9mIHRoZSBwcm94eS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXByZXNlbnRpbmcgc3RyaW5nIG9mIHRoaXMgcHJveHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTExNSwxNiArMTIxLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29tcGFyZSA8Y29kZT5vYmo8L2NvZGU+IHdpdGggY3VycmVudCBwcm94eS4gUmV0dXJucyBmYWxzZSBpZiB0aGUKLSAgICAgKiA8Y29kZT5vYmo8L2NvZGU+IGlzIG5vdCBhIDxjb2RlPlByb3h5PC9jb2RlPiBvYmplY3QuIFJldHVybnMgdHJ1ZSBpZgotICAgICAqIGFuZCBvbmx5IGlmIHRoZSA8Y29kZT5vYmo8L2NvZGU+IGhhcyB0aGUgc2FtZSA8Y29kZT5hZGRyZXNzPC9jb2RlPgotICAgICAqIGFuZCA8Y29kZT50eXBlPC9jb2RlPiB2YWx1ZSBhcyBjdXJyZW50IHByb3h5LgotICAgICAqIDwvcD4KKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHtAY29kZSBvYmp9IHRvIHRoaXMge0Bjb2RlIFByb3h5fSBpbnN0YW5jZSBhbmQKKyAgICAgKiByZXR1cm5zIHdoZXRoZXIgdGhleSBhcmUgZXF1YWwgb3Igbm90LiBUaGUgZ2l2ZW4gb2JqZWN0IG11c3QgYmUgYW4KKyAgICAgKiBpbnN0YW5jZSBvZiB7QGNvZGUgUHJveHl9IHdpdGggdGhlIHNhbWUgYWRkcmVzcyBhbmQgdGhlIHNhbWUgdHlwZSB2YWx1ZQorICAgICAqIHRvIGJlIGVxdWFsLgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+b2JqPC9jb2RlPiByZXByZXNlbnRzIHRoZSBzYW1lIHByb3h5LiBPdGhlcndpc2UsCi0gICAgICogICAgICAgICByZXR1cm5zIGZhbHNlLgorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIG9iamVjdCByZXByZXNlbnRzIHRoZSBzYW1lIHtAY29kZQorICAgICAqICAgICAgICAgUHJveHl9IGFzIHRoaXMgaW5zdGFuY2UsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKQEAgLTE0MCwxMCArMTQ3LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZ2V0cyB0aGUgaGFzaCBjb2RlIG9mIDxjb2RlPlByb3h5PC9jb2RlPi4KKyAgICAgKiBHZXRzIHRoZSBoYXNoY29kZSBmb3IgdGhpcyB7QGNvZGUgUHJveHl9IGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIG9mIDxjb2RlPlByb3h5PC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoY29kZSB2YWx1ZSBmb3IgdGhpcyBQcm94eSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewpAQCAtMTU2LDggKzE2MywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBwcm94eSB0eXBlLCBpbmNsdWRlcyA8Y29kZT5ESVJFQ1Q8L2NvZGU+LCA8Y29kZT5IVFRQPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5TT0NLUzwvY29kZT4uCisgICAgICoge0Bjb2RlIEVudW19IGNsYXNzIGZvciB0aGUgcHJveHkgdHlwZS4gUG9zc2libGUgb3B0aW9ucyBhcmUge0Bjb2RlCisgICAgICogRElSRUNUfSwge0Bjb2RlIEhUVFB9IGFuZCB7QGNvZGUgU09DS1N9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBlbnVtIFR5cGUgewogICAgICAgICAvKioKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Qcm94eVNlbGVjdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvUHJveHlTZWxlY3Rvci5qYXZhCmluZGV4IDFmMjRmYzIuLmFhZDRiY2MgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Qcm94eVNlbGVjdG9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3h5U2VsZWN0b3IuamF2YQpAQCAtMTksMjAgKzE5LDEzIEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogPHA+Ci0gKiBTZWxlY3RzIGFwcGxpY2FibGUgcHJveGllcyB3aGVuIGNvbm5lY3RpbmcgdG8gbmV0d29yayByZXNvdWNlIHJlcHJlc2VudGVkIGJ5Ci0gKiBhIDxjb2RlPlVSSTwvY29kZT4uIEFuIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlByb3h5U2VsZWN0b3I8L2NvZGU+Ci0gKiBzaG91bGQgYmUgYSBjb25jcmV0ZSBzdWJjbGFzcyBvZiA8Y29kZT5Qcm94eVNlbGVjdG9yPC9jb2RlPi4gTWV0aG9kCi0gKiA8Y29kZT5zZWxlY3Q8L2NvZGU+IHJldHVybnMgYSBsaXN0IG9mIHByb3hpZXMgYWNjb3JkaW5nIHRvIHRoZQotICogPGNvZGU+dXJpPC9jb2RlPi4gSWYgYSBjb25uZWN0aW9uIGNhbid0IGJlIGVzdGFibGlzaGVkLCB0aGUgY2FsbGVyIHNob3VsZAotICogbm90aWZ5IHByb3h5IHNlbGVjdG9yIGJ5IGludm9raW5nIDxjb2RlPmNvbm5lY3RGYWlsZWQ8L2NvZGU+IG1ldGhvZC4KLSAqIDwvcD4KLSAqIDxwPgotICogQSBwcm94eSBzZWxlY3RvciBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgYnkgY2FsbGluZwotICogPGNvZGU+c2V0RGVmYXVsdDwvY29kZT4gbWV0aG9kIGFuZCByZXRyaWV2ZWQgYnkgY2FsbGluZwotICogPGNvZGU+Z2V0RGVmYXVsdDwvY29kZT4gbWV0aG9kLgotICogPC9wPgorICogU2VsZWN0cyBhbiBhcHBsaWNhYmxlIHByb3h5IHNlcnZlciB3aGVuIGNvbm5lY3RpbmcgdG8gYSByZXNvdXJjZSBzcGVjaWZpZWQgYnkKKyAqIGEgVVJMLiBQcm94eSBzZWxlY3RvcnMgYXJlIGNvbmNyZXRlIHN1YmNsYXNzZXMgb2Yge0Bjb2RlIFByb3h5U2VsZWN0b3J9IGFuZAorICogY2FuIGJlIHNldCBhcyBkZWZhdWx0IGJ5IGNhbGxpbmcgdGhlIHtAY29kZSBzZXREZWZhdWx0KCl9IG1ldGhvZC4gSWYgYQorICogY29ubmVjdGlvbiBjYW4ndCBiZSBlc3RhYmxpc2hlZCwgdGhlIGNhbGxlciBzaG91bGQgbm90aWZ5IHRoZSBwcm94eSBzZWxlY3RvcgorICogYnkgaW52b2tpbmcgdGhlIHtAY29kZSBjb25uZWN0RmFpbGVkKCl9IG1ldGhvZC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm94eVNlbGVjdG9yIHsKIApAQCAtNTMsMTkgKzQ2LDIyIEBACiAgICAgICAgICAgICAic2V0UHJveHlTZWxlY3RvciIpOyAvLyROT04tTkxTLTEkCiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUHJveHlTZWxlY3Rvcn0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb3h5U2VsZWN0b3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBzeXN0ZW0gZGVmYXVsdCA8Y29kZT5Qcm94eVNlbGVjdG9yPC9jb2RlPi4KKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHtAY29kZSBQcm94eVNlbGVjdG9yfSBvZiB0aGUgc3lzdGVtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gc3lzdGVtIGRlZmF1bHQgPGNvZGU+UHJveHlTZWxlY3RvcjwvY29kZT4uCi0gICAgICogQHRocm93cyBTZWN1cnRpeUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBpbnN0YWxsZWQgYW5kIGl0IGRvZXNuJ3QgaGF2ZQotICAgICAqICAgICAgICAgICAgIDxjb2RlPk5ldFBlcm1pc3Npb24oImdldFByb3h5U2VsZWN0b3IiKTwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgY3VycmVudGx5IHNldCBkZWZhdWx0IHtAY29kZSBQcm94eVNlbGVjdG9yfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCBidXQgaXQgZG9lc24ndCBoYXZlIHRoZQorICAgICAqICAgICAgICAgICAgIE5ldFBlcm1pc3Npb24oImdldFByb3h5U2VsZWN0b3IiKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFByb3h5U2VsZWN0b3IgZ2V0RGVmYXVsdCgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtNzYsMTIgKzcyLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBzeXN0ZW0gZGVmYXVsdCA8Y29kZT5Qcm94eVNlbGVjdG9yPC9jb2RlPi4gVW5zZXRzIHN5c3RlbSBkZWZhdWx0Ci0gICAgICogPGNvZGU+UHJveHlTZWxlY3RvcjwvY29kZT4gaWYgPGNvZGU+c2VsZWN0b3I8L2NvZGU+IGlzIG51bGwuCisgICAgICogU2V0cyB0aGUgZGVmYXVsdCB7QGNvZGUgUHJveHlTZWxlY3Rvcn0gb2YgdGhlIHN5c3RlbS4gUmVtb3ZlcyB0aGUgc3lzdGVtCisgICAgICogZGVmYXVsdCB7QGNvZGUgUHJveHlTZWxlY3Rvcn0gaWYgdGhlIHBhcmFtZXRlciB7QGNvZGUgc2VsZWN0b3J9IGlzIHNldCB0bworICAgICAqIHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNlY3VydGl5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCBhbmQgaXQgZG9lc24ndCBoYXZlCi0gICAgICogICAgICAgICAgICAgPGNvZGU+TmV0UGVybWlzc2lvbigic2V0UHJveHlTZWxlY3RvciIpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJveHlTZWxlY3Rvcn0gaW5zdGFuY2UgdG8gc2V0IGFzIGRlZmF1bHQgb3IKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfSB0byByZW1vdmUgdGhlIGN1cnJlbnQgZGVmYXVsdCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFByb3h5U2VsZWN0b3J9LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdGhlCisgICAgICogICAgICAgICAgICAgTmV0UGVybWlzc2lvbigic2V0UHJveHlTZWxlY3RvciIpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0KFByb3h5U2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtOTIsMzggKzk0LDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhcHBsaWNhYmxlIHByb3hpZXMgYmFzZWQgb24gdGhlIGFjY2Vzc2luZyBwcm90b2NvbCBvZgotICAgICAqIDxjb2RlPnVyaTwvY29kZT4uIFRoZSBmb3JtYXQgb2YgVVJJIGlzIGRlZmluZWQgYXMgYmVsb3c6CisgICAgICogR2V0cyBhbGwgYXBwbGljYWJsZSBwcm94aWVzIGJhc2VkIG9uIHRoZSBhY2Nlc3NpbmcgcHJvdG9jb2wgb2Yge0Bjb2RlCisgICAgICogdXJpfS4gVGhlIGZvcm1hdCBvZiBVUkkgaXMgZGVmaW5lZCBhcyBiZWxvdzoKKyAgICAgKiA8cD4KICAgICAgKiA8bGk+aHR0cCBVUkkgc3RhbmRzIGZvciBodHRwIGNvbm5lY3Rpb24uPC9saT4KICAgICAgKiA8bGk+aHR0cHMgVVJJIHN0YW5kcyBmb3IgaHR0cHMgY29ubmVjdGlvbi48L2xpPgogICAgICAqIDxsaT5mdHAgVVJJIHN0YW5kcyBmb3IgZnRwIGNvbm5lY3Rpb24uPC9saT4KICAgICAgKiA8bGk+c29ja2V0OjovL2lwOnBvcnQgVVJJIHN0YW5kcyBmb3IgdGNwIGNsaWVudCBzb2NrZXRzIGNvbm5lY3Rpb24uPC9saT4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIDxjb2RlPlVSSTwvY29kZT4gb2JqZWN0LgotICAgICAqIEByZXR1cm4gYSBsaXN0IGNvbnRhaW5zIGFsbCBhcHBsaWNhYmxlIHByb3hpZXMuIElmIG5vIHByb3h5IGlzIGF2YWlsYWJsZSwKLSAgICAgKiAgICAgICAgIHJldHVybnMgYSBsaXN0IG9ubHkgY29udGFpbnMgb25lIGVsZW1lbnQKLSAgICAgKiAgICAgICAgIDxjb2RlPlByb3h5Lk5PX1BST1hZPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBhcmd1bWVudCBpcyBudWxsLgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBVUkkgb2JqZWN0LgorICAgICAqIEByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgYWxsIGFwcGxpY2FibGUgcHJveGllcy4gSWYgbm8gcHJveHkgaXMKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZSwgdGhlIGxpc3QgY29udGFpbnMgb25seSB0aGUge0Bjb2RlIFByb3h5Lk5PX1BST1hZfQorICAgICAqICAgICAgICAgZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxQcm94eT4gc2VsZWN0KFVSSSB1cmkpOwogCiAgICAgLyoqCi0gICAgICogSWYgdGhlIGNvbm5lY3Rpb24gY2FuIG5vdCBiZSBlc3RhYmxpc2hlZCB0byB0aGUgcHJveHkgc2VydmVyLCB0aGlzIG1ldGhvZAotICAgICAqIHdpbGwgYmUgY2FsbGVkLiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgYWRqdXN0IHByb3h5IHRoZSBzZXF1ZW5jZSBvZgotICAgICAqIHByb3hpZXMgcmV0dXJuZWQgYnkgPGNvZGU+c2VsZWN0KFN0cmluZywgU3RyaW5nKTwvY29kZT4uCisgICAgICogTm90aWZpZXMgdGhlIHtAY29kZSBQcm94eVNlbGVjdG9yfSB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgc2VydmVyCisgICAgICogY291bGQgbm90IGJlIGVzdGFibGlzaGVkLiBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cG9uIHRoaXMKKyAgICAgKiBub3RpZmljYXRpb24gbWFpbnRhaW4gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHByb3hpZXMsIHNpbmNlIGFuIHVwZGF0ZWQKKyAgICAgKiB2ZXJzaW9uIHNob3VsZCBiZSBwcm92aWRlZCBieSB7QGNvZGUgc2VsZWN0KCl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5VUkk8L2NvZGU+IHRoYXQgdGhlIGNvbm5lY3Rpb24gZmFpbHMgdG8gY29ubmVjdAotICAgICAqICAgICAgICAgICAgdG8uCisgICAgICogICAgICAgICAgICB0aGUgVVJJIHRvIHdoaWNoIHRoZSBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZC4KICAgICAgKiBAcGFyYW0gc2EKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNvY2tldEFkZHJlc3M8L2NvZGU+IG9mIHRoZSBwcm94eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm94eS4KICAgICAgKiBAcGFyYW0gaW9lCi0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+IHdoaWNoIGlzIHRocm93biBkdXJpbmcKLSAgICAgKiAgICAgICAgICAgIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBhcmd1bWVudCBpcyBudWxsLgorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCB3YXMgdGhyb3duIGR1cmluZyBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBlc3RhYmxpc2htZW50LgorICAgICAqIEBzZWUgI3NlbGVjdChVUkkpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY29ubmVjdEZhaWxlZChVUkkgdXJpLCBTb2NrZXRBZGRyZXNzIHNhLAogICAgICAgICAgICAgSU9FeGNlcHRpb24gaW9lKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Qcm94eVNlbGVjdG9ySW1wbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3h5U2VsZWN0b3JJbXBsLmphdmEKaW5kZXggNzJlMTA3MC4uNzljZTBjZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3h5U2VsZWN0b3JJbXBsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Byb3h5U2VsZWN0b3JJbXBsLmphdmEKQEAgLTI5LDcgKzI5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uOwogCiAvKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIFByb3h5U2VsZWN0b3IKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHtAY29kZSBQcm94eVNlbGVjdG9yfS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIGNsYXNzIFByb3h5U2VsZWN0b3JJbXBsIGV4dGVuZHMgUHJveHlTZWxlY3RvciB7CiAKQEAgLTI3Myw5ICsyNzUsOSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IGlQb3J0OwogICAgICAgICAgICAgdHJ5IHsKLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIGlQb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0KTsKLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIGlQb3J0ID0gZGVmYXVsdFBvcnQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvUmVzcG9uc2VDYWNoZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Jlc3BvbnNlQ2FjaGUuamF2YQppbmRleCBhYTZmNTRjLi5lN2EwYWNhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvUmVzcG9uc2VDYWNoZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9SZXNwb25zZUNhY2hlLmphdmEKQEAgLTIwLDE1ICsyMCwzMiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgotICogUmVzcG9uc2VDYWNoZSBpbXBsZW1lbnRzIFVSTENvbm5lY3Rpb24gY2FjaGVzLiBTeXN0ZW0gZGVmYXVsdCBjYWNoZSBjYW4gYmUKLSAqIHJlZ2lzdGVyZWQgYnkgaW52b2tpbmcgUmVzcG9uc2VDYWNoZS48Y29kZT5zZXREZWZhdWx0PC9jb2RlPihSZXNwb25zZUNhY2hlKSwKLSAqIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5IGludm9raW5nIFJlc3BvbnNlQ2FjaGUuPGNvZGU+Z2V0RGVmYXVsdDwvY29kZT4uCi0gKiBJZiBVUkxDb25uZWN0aW9uI3VzZUNhY2hlcyBpcyBzZXQsIDxjb2RlPlVSTENvbm5lY3Rpb248L2NvZGU+IGNsYXNzIHdpbGwKLSAqIHVzZSA8Y29kZT5SZXNwb25zZUNhY2hlPC9jb2RlPiB0byBzdG9yZSBhbmQgZ2V0IHJlc291cmNlcy4gV2hldGhlciB0aGUKLSAqIHJlc291cmNlIGlzIGNhY2hlZCBkZXBlbmRzIG9uIDxjb2RlPlJlc3BvbnNlQ2FjaGU8L2NvZGU+IGltcGxlbWVudGF0aW9uLiBJZgotICogYSByZXF1ZXN0IHJlc291cmNlIGlzIGNhY2hlZCwgcHJvdG9jb2wgaGFuZGxlciB3aWxsIGZlY3RoIGl0IGZyb20gdGhlIGNhY2hlLgotICogSWYgdGhlIHByb3RvY29sIGhhbmRsZXIgZmFpbHMgdG8gZ2V0IHJlc291cmNlIGZyb20gdGhlIGNhY2hlLCBpdCB0dXJucyB0byBnZXQKLSAqIHRoZSByZXNvdXJjZSBmcm9tIGl0cyBvcmlnaW5hbCBsb2NhdGlvbi4KKyAqIFRoaXMgY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIFVSTENvbm5lY3Rpb259IGNhY2hlcyBpbnRlbmRlZAorICogcHJpbWFyaWx5IGZvciB0aGUgYWNjb3JkaW5nIHN0cmVhbSBoYW5kbGVyIGltcGxlbWVudGF0aW9ucy4KKyAqIDxwPgorICogVGhlIHN5c3RlbSdzIGRlZmF1bHQgY2FjaGUgY2FuIGJlIHJlZ2lzdGVyZWQgYnkgaW52b2tpbmcgdGhlIG1ldGhvZCB7QGNvZGUKKyAqIHNldERlZmF1bHQoUmVzcG9uc2VDYWNoZSl9IGFuZCBiZSByZXRyaWV2ZWQgYnkgaW52b2tpbmcgdGhlIG1ldGhvZCB7QGNvZGUKKyAqIGdldERlZmF1bHQoKX0uIElmIHtAY29kZSBVUkxDb25uZWN0aW9uI3VzZUNhY2hlc30gaXMgc2V0LCB7QGNvZGUKKyAqIFVSTENvbm5lY3Rpb259IGNsYXNzIHdpbGwgdXNlIHtAY29kZSBSZXNwb25zZUNhY2hlfSB0byBzdG9yZSBhbmQgZ2V0CisgKiByZXNvdXJjZXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGNhY2hlZCBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUKKyAqIFJlc3BvbnNlQ2FjaGV9LiBJZiBzbywgYSB7QGNvZGUgQ2FjaGVSZXNwb25zZX0gaXMgcmV0dXJuZWQgZnJvbSB3aGljaCB0aGUKKyAqIHN0cmVhbSBoYW5kbGVyIHJlYWRzLiBJZiB0aGUgc3RyZWFtIGhhbmRsZXIgZmFpbHMgdG8gZ2V0IGEgcmVzb3VyY2UgZnJvbSB0aGUKKyAqIGNhY2hlLCBpdCBtdXN0IGdldCB0aGUgcmVzb3VyY2UgZnJvbSBpdHMgb3JpZ2luYWwgbG9jYXRpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRvIHdyaXRlIHRvIHRoZSBjYWNoZSwgdGhlIHByb3RvY29sIGhhbmRsZXJzIGNhbGwge0Bjb2RlIHB1dCgpfSwgdXBvbiB3aGljaCBhCisgKiB7QGNvZGUgQ2FjaGVSZXF1ZXN0fSBpcyBzdXBwbGllZCB0byB3aGljaCB0aGUgcmVzb3VyY2VzIGFyZSB3cml0dGVuLgorICogPC9wPgorICogCisgKiBAc2VlICNwdXQoVVJJLCBVUkxDb25uZWN0aW9uKQorICogQHNlZSBDYWNoZVJlcXVlc3QKKyAqIEBzZWUgQ2FjaGVSZXNwb25zZQorICogQHNlZSBVUkxDb25uZWN0aW9uCisgKiBAc2VlIFVSTFN0cmVhbUhhbmRsZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzcG9uc2VDYWNoZSB7CiAKQEAgLTc0LDE5ICs5MSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIG1ldGhvZC4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc3BvbnNlQ2FjaGUoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBzeXN0ZW0gZGVmYXVsdCByZXNwb25zZSBjYWNoZS4KKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJlc3BvbnNlIGNhY2hlIG9mIHRoZSBzeXN0ZW0uCiAgICAgICogCi0gICAgICogQHJldHVybiBkZWZhdWx0IDxjb2RlPlJlc3BvbnNlQ2FjaGU8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQge0Bjb2RlIFJlc3BvbnNlQ2FjaGV9LgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkIGFuZCBpdCBkb2Vzbid0IGhhdmUKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5OZXRQZXJtaXNzaW9uPC9jb2RlPigiZ2V0UmVzcG9uc2VDYWNoZSIpLgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBpbnN0YWxsZWQgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgTmV0UGVybWlzc2lvbigiZ2V0UmVzcG9uc2VDYWNoZSIpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFJlc3BvbnNlQ2FjaGUgZ2V0RGVmYXVsdCgpIHsKICAgICAgICAgY2hlY2tHZXRSZXNwb25zZUNhY2hlUGVybWlzc2lvbigpOwpAQCAtOTQsMTYgKzExNCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN5c3RlbSBkZWZhdWx0IHJlc3BvbnNlIGNhY2hlIHdoZW4gcmVzcG9uc2VDYWNoZSBpcyBub3QgbnVsbC4KLSAgICAgKiBPdGhlcndpc2UsIHRoZSBtZXRob2QgdW5zZXRzIHRoZSBzeXN0ZW0gZGVmYXVsdCByZXNwb25zZSBjYWNoZS4gVGhpcwotICAgICAqIHNldHRpbmcgbWF5IGJlIGlnbm9yZWQgYnkgc29tZSBub24tc3RhbmRhcmQgcHJvdG9jb2xzLgorICAgICAqIFNldHMgdGhlIGRlZmF1bHQgcmVzcG9uc2UgY2FjaGUgb2YgdGhlIHN5c3RlbS4gUmVtb3ZlcyB0aGUgc3lzdGVtJ3MKKyAgICAgKiBkZWZhdWx0IHtAY29kZSBSZXNwb25zZUNhY2hlfSBpZiB0aGUgcGFyYW1ldGVyIHtAY29kZSByZXNwb25zZUNhY2hlfSBpcworICAgICAqIHNldCB0byB7QGNvZGUgbnVsbH0uIFRoaXMgc2V0dGluZyBtYXkgYmUgaWdub3JlZCBieSBzb21lIG5vbi1zdGFuZGFyZAorICAgICAqIHByb3RvY29scy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVzcG9uc2VDYWNoZQotICAgICAqICAgICAgICAgICAgU2V0IGRlZmF1bHQgPGNvZGU+UmVzcG9uc2VDYWNoZTwvY29kZT4uIElmIHJlc3BvbnNlQ2FjaGUgaXMKLSAgICAgKiAgICAgICAgICAgIG51bGwsIGl0IHVuc2V0cyB0aGUgY2FjaGUuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFJlc3BvbnNlQ2FjaGV9IGluc3RhbmNlIHRvIHNldCBhcyBkZWZhdWx0IG9yCisgICAgICogICAgICAgICAgICB7QGNvZGUgbnVsbH0gdG8gcmVtb3ZlIHRoZSBjdXJyZW50IGRlZmF1bHQge0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXNwb25zZUNhY2hlfS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCBhbmQgaXQgZG9lc24ndCBoYXZlCi0gICAgICogICAgICAgICAgICAgPGNvZGU+TmV0UGVybWlzc2lvbjwvY29kZT4oInNldFJlc3BvbnNlQ2FjaGUiKS4KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdGhlCisgICAgICogICAgICAgICAgICAge0Bjb2RlIE5ldFBlcm1pc3Npb24oInNldFJlc3BvbnNlQ2FjaGUiKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoUmVzcG9uc2VDYWNoZSByZXNwb25zZUNhY2hlKSB7CiAgICAgICAgIGNoZWNrU2V0UmVzcG9uc2VDYWNoZVBlcm1pc3Npb24oKTsKQEAgLTExMSw0MyArMTM0LDQ0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2FjaGVkIHJlc3BvbnNlIGFjY29yZGluZyB0byByZXF1ZXN0aW5nIHVyaSxtZXRob2QgYW5kIGhlYWRlcnMuCisgICAgICogR2V0cyB0aGUgY2FjaGVkIHJlc3BvbnNlIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGluZyBVUkksIG1ldGhvZCBhbmQKKyAgICAgKiBoZWFkZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIEEgPGNvZGU+VVJMPC9jb2RlPiByZXByZXNlbnRzIHJlcXVlc3RpbmcgdXJpLgorICAgICAqICAgICAgICAgICAgdGhlIHJlcXVlc3RpbmcgVVJJLgogICAgICAqIEBwYXJhbSBycXN0TWV0aG9kCi0gICAgICogICAgICAgICAgICBBIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50cyByZXF1ZXN0aW5nIG1ldGhvZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0aW5nIG1ldGhvZC4KICAgICAgKiBAcGFyYW0gcnFzdEhlYWRlcnMKLSAgICAgKiAgICAgICAgICAgIEEgPGNvZGU+TWFwPC9jb2RlPiBmcm9tIHJlcXVlc3QgaGVhZGVyIGZpZWxkIG5hbWVzIHRvIGxpc3RzCi0gICAgICogICAgICAgICAgICBvZiBmaWVsZCB2YWx1ZXMgcmVwcmVzZW50cyByZXF1ZXN0aW5nIGhlYWRlcnMuCi0gICAgICogQHJldHVybiBBIDxjb2RlPkNhY2hlUmVzcG9uc2U8L2NvZGU+IG9iamVjdCBpZiB0aGUgcmVxdWVzdCBpcyBhdmFpbGFibGUKLSAgICAgKiAgICAgICAgIGluIHRoZSBjYWNoZS4gT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuCisgICAgICogICAgICAgICAgICBhIG1hcCBvZiByZXF1ZXN0aW5nIGhlYWRlcnMuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIENhY2hlUmVzcG9uc2V9IG9iamVjdCBpZiB0aGUgcmVxdWVzdCBpcyBhdmFpbGFibGUgaW4gdGhlIGNhY2hlCisgICAgICogICAgICAgICBvciB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJL08gZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBnZXR0aW5nIHRoZSBjYWNoZWQgZGF0YS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgc2V0IHRvIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ2FjaGVSZXNwb25zZSBnZXQoVVJJIHVyaSwgU3RyaW5nIHJxc3RNZXRob2QsCiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJxc3RIZWFkZXJzKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBQcm90b2NvbCBoYW5kbGVyIGNhbGxzIHRoaXMgbWV0aG9kIGFmdGVyIHJldHJpZXZpbmcgcmVzb3VyY2VzLiBUaGUKLSAgICAgKiA8Y29kZT5SZXNwb25zZUNhY2hlPC9jb2RlPiBkZWNpZGVzIHdoZXRoZXIgdGhlIHJlc291cmNlIHNob3VsZCBiZQotICAgICAqIGNhY2hlZC4gSWYgdGhlIHJlc291cmNlIG5lZWRzIHRvIGJlIGNhY2hlZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYQotICAgICAqIDxjb2RlPkNhY2hlUmVxdWVzdDwvY29kZT4gd2l0aCBhIDxjb2RlPldyaXRlYWJsZUJ5dGVDaGFubmVsPC9jb2RlPiwKLSAgICAgKiBhbmQgdGhlbiwgcHJvdG9jb2wgaGFuZGxlciB3aWxsIHVzZSB0aGlzIGNoYW5uZWwgdG8gd3JpdGUgdGhlIHJlc291cmNlCi0gICAgICogZGF0YSBpbnRvIHRoZSBjYWNoZS4gT3RoZXJ3aXNlLCBpZiB0aGUgcmVzb3VyY2UgZG9lc24ndCBuZWVkIHRvIGJlCi0gICAgICogY2FjaGVkLCBpdCByZXR1cm5zIG51bGwuCisgICAgICogQWxsb3dzIHRoZSBwcm90b2NvbCBoYW5kbGVyIHRvIGNhY2hlIGRhdGEgYWZ0ZXIgcmV0cmlldmluZyByZXNvdXJjZXMuIFRoZQorICAgICAqIHtAY29kZSBSZXNwb25zZUNhY2hlfSBkZWNpZGVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGRhdGEgc2hvdWxkIGJlIGNhY2hlZAorICAgICAqIG9yIG5vdC4gSWYgc28sIHRoaXMgbWV0aG9kIHJldHVybnMgYSB7QGNvZGUgQ2FjaGVSZXF1ZXN0fSB3aXRoIGEge0Bjb2RlCisgICAgICogV3JpdGVhYmxlQnl0ZUNoYW5uZWx9IHRvIHB1dCB0aGUgcmVzb3VyY2UgZGF0YSBkb3duLiBPdGhlcndpc2UsIHRoaXMKKyAgICAgKiBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHVyaQorICAgICAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlLgogICAgICAqIEBwYXJhbSBjb25uCi0gICAgICogQHJldHVybiBhIDxjb2RlPkNhY2hlUmVxdWVzdDwvY29kZT4gd2hpY2ggY29udGFpbnMKLSAgICAgKiAgICAgICAgIDxjb2RlPldyaXRlYWJsZUJ5dGVDaGFubmVsPC9jb2RlPiBpZiB0aGUgcmVzb3VyY2UgaXMgY2FjaGVkLgotICAgICAqICAgICAgICAgT3RoZXJ3aXNlLCBpdCByZXR1cm5zIG51bGwuCisgICAgICogICAgICAgICAgICB0aGUgY29ubmVjdGlvbiB0byBmZXRjaCB0aGUgcmVzcG9uc2UuCisgICAgICogQHJldHVybiBhIENhY2hlUmVxdWVzdCBvYmplY3Qgd2l0aCBhIFdyaXRlYWJsZUJ5dGVDaGFubmVsIGlmIHRoZSByZXNvdXJjZQorICAgICAqICAgICAgICAgaGFzIHRvIGJlIGNhY2hlZCwge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gSS9PIGVycm9yIGlzIGVuY291bnRlcmVkLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgYWRkaW5nIHRoZSByZXNvdXJjZS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIHNldCB0byB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENhY2hlUmVxdWVzdCBwdXQoVVJJIHVyaSwgVVJMQ29ubmVjdGlvbiBjb25uKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NlY3VyZUNhY2hlUmVzcG9uc2UuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9TZWN1cmVDYWNoZVJlc3BvbnNlLmphdmEKaW5kZXggZjY4NDc1Mi4uZmZmNmI4MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NlY3VyZUNhY2hlUmVzcG9uc2UuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU2VjdXJlQ2FjaGVSZXNwb25zZS5qYXZhCkBAIC0yMiwxMSArMjIsMTkgQEAKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOwogCiAvKioKLSAqIEEgc2VjdXJlIGNhY2hlIHJlc3BvbnNlLCB3aGljaCBpcyBvcmlnbmFsbHkgcmV0cmlldmVkIHRocm91Z2ggc2VjdXJlIHdheXMuCisgKiBBIHNlY3VyZSBjYWNoZSByZXNwb25zZSByZXByZXNlbnRzIGRhdGEgd2hpY2ggaXMgb3JpZ2luYWxseSByZXRyaWV2ZWQgb3ZlciBhCisgKiBzZWN1cmUgY29ubmVjdGlvbi4gU3VjaCBhIGNvbm5lY3Rpb24gY2FuIGJlIHNlY3VyZWQgYnkgdXNpbmcgYSBjcnlwdG9ncmFwaGljCisgKiBwcm90b2NvbCBsaWtlIFRMUyBvciBTU0wuCisgKiAKKyAqIEBzZWUgUmVzcG9uc2VDYWNoZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWN1cmVDYWNoZVJlc3BvbnNlIGV4dGVuZHMgQ2FjaGVSZXNwb25zZSB7CisKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBtZXRob2QKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlY3VyZUNhY2hlUmVzcG9uc2UoKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC0zNiw2MCArNDQsNjAgQEAKICAgICAgKiBHZXRzIHRoZSBjaXBoZXIgc3VpdGUgc3RyaW5nIG9uIHRoZSBjb25uZWN0aW9uIHdoaWNoIGlzIG9yaWdpbmFsbHkgdXNlZAogICAgICAqIHRvIHJldHJpZXZlIHRoZSBuZXR3b3JrIHJlc291cmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNpcGhlciBzdWl0ZSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBjaXBoZXIgc3VpdGUgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2lwaGVyU3VpdGUoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgbG9jYWwgY2VydGlmaWNhdGUgY2hhaW4uIFdoZW4gdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gcmV0cmlldmVkIHRoZQotICAgICAqIHJlc291cmNlIGRhdGEsIGNlcnRpZmljYXRlIGNoYWluIHdhcyBzZW50IHRvIHRoZSBzZXJ2ZXIgZHVyaW5nCisgICAgICogR2V0cyB0aGUgbG9jYWwgY2VydGlmaWNhdGUgY2hhaW4uIFdoZW4gdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gcmV0cmlldmVkCisgICAgICogdGhlIHJlc291cmNlIGRhdGEsIHRoaXMgY2VydGlmaWNhdGUgY2hhaW4gd2FzIHNlbnQgdG8gdGhlIHNlcnZlciBkdXJpbmcKICAgICAgKiBoYW5kc2hha2luZyBwcm9jZXNzLiBUaGlzIG1ldGhvZCBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGNlcnRpZmljYXRlLWJhc2VkCiAgICAgICogY2lwaGVyIHN1aXRlIGlzIGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUgY2hhaW4gdGhhdCB3YXMgc2VudCB0byB0aGUgc2VydmVyLiBUaGUKLSAgICAgKiAgICAgICAgIGNlcnRpZmljYXRlIGNoYWluIGlzIHJlcHJlc2VudGVkIGFzIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YKLSAgICAgKiAgICAgICAgIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPi4gSWYgbm8gY2VydGlmaWNhdGUgY2hhaW4gd2FzIHNlbnQsCi0gICAgICogICAgICAgICB0aGUgbWV0aG9kIHJldHVybnMgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB0aGF0IHdhcyBzZW50IHRvIHRoZSBzZXJ2ZXIuIElmIG5vCisgICAgICogICAgICAgICBjZXJ0aWZpY2F0ZSBjaGFpbiB3YXMgc2VudCwgdGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxDZXJ0aWZpY2F0ZT4gZ2V0TG9jYWxDZXJ0aWZpY2F0ZUNoYWluKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHNlcnZlcidzIGNlcnRpZmljYXRlIGNoYWluIGZyb20gY2FjaGUuIEFzIHBhcnQgb2YgZGVmaW5pbmcgdGhlCisgICAgICogR2V0cyB0aGUgY2FjaGVkIHNlcnZlcidzIGNlcnRpZmljYXRlIGNoYWluLiBBcyBwYXJ0IG9mIGRlZmluaW5nIHRoZQogICAgICAqIHNlc3Npb24sIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB3YXMgZXN0YWJsaXNoZWQgd2hlbiB0aGUgb3JpZ2luYWwKICAgICAgKiBjb25uZWN0aW9uIHJldHJpZXZlZCBuZXR3b3JrIHJlc291cmNlLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkCi0gICAgICogd2hlbiBjZXJ0aWZpY2F0ZWQtYmFzZWQgY3lwaGVyIHN1aXRlcyBpcyBlbmFibGUuIE90aGVyd2lzZSwgaXQgdGhyb3dzIGFuCi0gICAgICogPGNvZGU+U1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb248L2NvZGU+LgorICAgICAqIHdoZW4gY2VydGlmaWNhdGVkLWJhc2VkIGNpcGhlciBzdWl0ZSBpcyBlbmFibGVkLiBPdGhlcndpc2UsIGl0IHRocm93cyBhbgorICAgICAqIHtAY29kZSBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgc2VydmVyJ3MgY2VydGlmaWNhdGUgY2hhaW4sIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEKLSAgICAgKiAgICAgICAgIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZSBjaGFpbi4KICAgICAgKiBAdGhyb3dzIFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHBlZXIgaXMgdW52ZXJpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGVlciBpcyB1bnZlcmlmaWVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PENlcnRpZmljYXRlPiBnZXRTZXJ2ZXJDZXJ0aWZpY2F0ZUNoYWluKCkKICAgICAgICAgICAgIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlcnZlcidzIDxjb2RlPlByaW5jaXBsZTwvY29kZT4uIFdoZW4gdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24KLSAgICAgKiByZXRyaWV2ZWQgbmV0d29yayByZXNvdXJjZSwgdGhlIHByaW5jaXBsZSB3YXMgZXN0YWJsaXNoZWQgd2hlbiBkZWZpbmluZwotICAgICAqIHRoZSBzZXNzaW9uLgorICAgICAqIEdldHMgdGhlIHNlcnZlcidzIHByaW5jaXBsZS4gV2hlbiB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbiByZXRyaWV2ZWQKKyAgICAgKiBuZXR3b3JrIHJlc291cmNlLCB0aGUgcHJpbmNpcGxlIHdhcyBlc3RhYmxpc2hlZCB3aGVuIGRlZmluaW5nIHRoZQorICAgICAqIHNlc3Npb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IHJlcHJlc2VudHMgdGhlIHNlcnZlcidzIHByaW5jaXBhbC4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbmNpcGFsIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcnZlcidzIHByaW5jaXBhbC4KICAgICAgKiBAdGhyb3dzIFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHBlZXIgaXMgdW52ZXJpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGVlciBpcyB1bnZlcmlmaWVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpCiAgICAgICAgICAgICB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Y29kZT5QcmluY2lwbGU8L2NvZGU+IHRoYXQgdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gc2VudCB0bwotICAgICAqIHRoZSBzZXJ2ZXIuIFdoZW4gdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gZmV0Y2hlZCB0aGUgbmV0d29yayByZXNvdXJjZSwKLSAgICAgKiB0aGUgPGNvZGU+UHJpbmNpcGxlPC9jb2RlPiB3YXMgc2VudCB0byB0aGUgc2VydmVyIGR1cmluZyBoYW5kc2hha2luZwotICAgICAqIHByb2Nlc3MuCisgICAgICogR2V0cyB0aGUgbG9jYWwgcHJpbmNpcGxlIHRoYXQgdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gc2VudCB0byB0aGUgc2VydmVyLgorICAgICAqIFdoZW4gdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gZmV0Y2hlZCB0aGUgbmV0d29yayByZXNvdXJjZSwgdGhlIHByaW5jaXBsZQorICAgICAqIHdhcyBzZW50IHRvIHRoZSBzZXJ2ZXIgZHVyaW5nIGhhbmRzaGFraW5nIHByb2Nlc3MuCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+cHJpbmNpcGFsPC9jb2RlPiBzZW50IHRvIHRoZSBzZXJ2ZXIuIFJldHVybnMgYW4KLSAgICAgKiAgICAgICAgIDxjb2RlPlg1MDBQcmluY2lwYWw8L2NvZGU+IGZvciBYNTA5LWJhc2VkIGNpcGhlciBzdWl0ZXMuIElmIG5vCi0gICAgICogICAgICAgICBwcmluY2lwYWwgd2FzIHNlbnQsIGl0IHJldHVybnMgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBwcmluY2lwYWwgb2JqZWN0IGJlaW5nIHNlbnQgdG8gdGhlIHNlcnZlci4gUmV0dXJucyBhbgorICAgICAqICAgICAgICAge0Bjb2RlIFg1MDBQcmluY2lwYWx9IG9iamVjdCBmb3IgWDUwOS1iYXNlZCBjaXBoZXIgc3VpdGVzLiBJZiBubworICAgICAqICAgICAgICAgcHJpbmNpcGFsIHdhcyBzZW50LCBpdCByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUHJpbmNpcGFsIGdldExvY2FsUHJpbmNpcGFsKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU2VydmVyU29ja2V0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU2VydmVyU29ja2V0LmphdmEKaW5kZXggYmE3NzUxNC4uYWQwZDVhMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NlcnZlclNvY2tldC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9TZXJ2ZXJTb2NrZXQuamF2YQpAQCAtMjAsMTkgKzIwLDE4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsOwogCi0vL2ltcG9ydCBhbmRyb2lkLm5ldC5Tb2NrZXRJbXBsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlNvY2tldEltcGxQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFNlcnZlclNvY2tldCBjcmVhdGUgY29ubmVjdGlvbnMgYmV0d2VlbiAnaG9zdCcgYW5kICdjbGllbnQnIG1hY2hpbmVzLiBUaGUKLSAqIFNlcnZlclNvY2tldCBsaXN0ZW5zIG9uIGEgd2VsbCBrbm93biBwb3J0IGFuZCB1cG9uIGEgY29ubmVjdGlvbiByZXF1ZXN0LAotICogaW5zdGFudGlhdGVzIGEgJ2hvc3QnIHNvY2tldHMsIHdoaWNoIGNhcnJpZXMgb24gZnV0dXJlIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSAqIHJlcXVlc3RpbmcgJ2NsaWVudCcgc29ja2V0LCBzbyB0aGF0IHRoZSBzZXJ2ZXIgc29ja2V0IG1heSBjb250aW51ZSBsaXN0ZW5pbmcKLSAqIGZvciBjb25uZWN0aW9uIHJlcXVlc3RzLiBUaGV5IGFyZSBwYXNzaXZlIG9iamVjdHMsIGhhdmluZyBubyBleGVjdXRpb24gdGhyZWFkCi0gKiBvZiB0aGVpciBvd24gdG8gbGlzdGVuIG9uLgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2VydmVyLXNpZGUgc29ja2V0IHRoYXQgd2FpdHMgZm9yIGluY29taW5nIGNsaWVudAorICogY29ubmVjdGlvbnMuIEEge0Bjb2RlIFNlcnZlclNvY2tldH0gaGFuZGxlcyB0aGUgcmVxdWVzdHMgYW5kIHNlbmRzIGJhY2sgYW4KKyAqIGFwcHJvcHJpYXRlIHJlcGx5LiBUaGUgYWN0dWFsIHRhc2tzIHRoYXQgYSBzZXJ2ZXIgc29ja2V0IG11c3QgYWNjb21wbGlzaCBhcmUKKyAqIGltcGxlbWVudGVkIGJ5IGFuIGludGVybmFsIHtAY29kZSBTb2NrZXRJbXBsfSBpbnN0YW5jZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJTb2NrZXQgewogCkBAIC01MSw2MCArNTAsODEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBTZXJ2ZXJTb2NrZXQsIHdoaWNoIGlzIG5vdCBib3VuZCB0byBhbnkgcG9ydC4gVGhlIGRlZmF1bHQKLSAgICAgKiBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9ucyBtYXkgYmUgYmFja2xvZ2dlZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTZXJ2ZXJTb2NrZXR9IGluc3RhbmNlIHdoaWNoIGlzIG5vdCBib3VuZCB0byBhbnkKKyAgICAgKiBwb3J0LiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9ucyBtYXkgYmUgYmFja2xvZ2dlZC4KICAgICAgKiAKLSAgICAgKiBAc2VlIFNvY2tldAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHNlcnZlciBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlcnZlclNvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGltcGwgPSBmYWN0b3J5ICE9IG51bGwgPyBmYWN0b3J5LmNyZWF0ZVNvY2tldEltcGwoKQogICAgICAgICAgICAgICAgIDogU29ja2V0SW1wbFByb3ZpZGVyLmdldFNlcnZlclNvY2tldEltcGwoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBVbnNwZWNpZmllZCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24gaXMgdGVjaG5pY2FsbHkgcGFydCBvZiBBUEkjMS4KKyAgICAgKiBIaWRpbmcgaXQgZm9yIEFQSSMyIGJyb2tlIHNvdXJjZSBjb21wYXRpYmlsaXR5LgorICAgICAqIFJlbW92aW5nIGl0IGVudGlyZWx5IHdvdWxkIHRoZW9yZXRpY2FsbHkgYnJlYWsgYmluYXJ5IGNvbXBhdGliaWxpdHksCisgICAgICogICAgIGFuZCB3b3VsZCBiZSBiZXR0ZXIgZG9uZSB3aXRoIHNvbWUgdmlzaWJpbGl0eSBvdmVyIHRoZSBleHRlbnQKKyAgICAgKiAgICAgb2YgdGhlIGNvbXBhdGliaWxpdHkgYnJlYWthZ2UgKGV4cGVjdGVkIHRvIGJlIG5vbi1leGlzdGVudCkuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLwogICAgIHByb3RlY3RlZCBTZXJ2ZXJTb2NrZXQoU29ja2V0SW1wbCBpbXBsKSB7CiAgICAgICAgIHRoaXMuaW1wbCA9IGltcGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgU2VydmVyU29ja2V0LCBib3VuZCB0byB0aGUgbm9taW5hdGVkIHBvcnQgb24gdGhlIGRlZmF1bHQKLSAgICAgKiBsb2NhbGhvc3QuIFRoZSBkZWZhdWx0IG51bWJlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zIG1heSBiZSBiYWNrbG9nZ2VkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNlcnZlclNvY2tldH0gaW5zdGFuY2UgYm91bmQgdG8gdGhlIG5vbWluYXRlZAorICAgICAqIHBvcnQgb24gdGhlIGxvY2FsaG9zdC4gVGhlIGRlZmF1bHQgbnVtYmVyIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMgbWF5IGJlCisgICAgICogYmFja2xvZ2dlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb24gcmVxdWVzdHMgb24KLSAgICAgKiBAc2VlIFNvY2tldAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbiByZXF1ZXN0cyBvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBzZXJ2ZXIgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXJ2ZXJTb2NrZXQoaW50IGFwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzKGFwb3J0LCBkZWZhdWx0QmFja2xvZygpLCBJbmV0QWRkcmVzcy5BTlkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIFNlcnZlclNvY2tldCwgYm91bmQgdG8gdGhlIG5vbWluYXRlZCBwb3J0IG9uIHRoZSBkZWZhdWx0Ci0gICAgICogbG9jYWxob3N0LiBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMgdGhhdCBtYXkgYmUgYmFja2xvZ2dlZCBpcyBhCi0gICAgICogc3BlY2lmaWVkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNlcnZlclNvY2tldH0gaW5zdGFuY2UgYm91bmQgdG8gdGhlIG5vbWluYXRlZAorICAgICAqIHBvcnQgb24gdGhlIGxvY2FsaG9zdC4gVGhlIG51bWJlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zIHRoYXQgbWF5IGJlCisgICAgICogYmFja2xvZ2dlZCBpcyBzcGVjaWZpZWQgYnkge0Bjb2RlIGJhY2tsb2d9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbiByZXF1ZXN0cyBvbgorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbiByZXF1ZXN0cyBvbi4KICAgICAgKiBAcGFyYW0gYmFja2xvZwotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMsIGJlZm9yZSByZXF1ZXN0cyBhcmUKLSAgICAgKiAgICAgICAgICAgIHJlamVjdGVkCi0gICAgICogQHNlZSBTb2NrZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9uIHJlcXVlc3RzLCBiZWZvcmUgcmVxdWVzdHMKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgcmVqZWN0ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgc2VydmVyIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2VydmVyU29ja2V0KGludCBhcG9ydCwgaW50IGJhY2tsb2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoYXBvcnQsIGJhY2tsb2csIEluZXRBZGRyZXNzLkFOWSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgU2VydmVyU29ja2V0LCBib3VuZCB0byB0aGUgbm9taW5hdGVkIGxvY2FsIGhvc3QvcG9ydC4gVGhlCi0gICAgICogbnVtYmVyIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMgdGhhdCBtYXkgYmUgYmFja2xvZ2dlZCBpcyBhIHNwZWNpZmllZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTZXJ2ZXJTb2NrZXR9IGluc3RhbmNlIGJvdW5kIHRvIHRoZSBub21pbmF0ZWQKKyAgICAgKiBsb2NhbCBob3N0IGFkZHJlc3MgYW5kIHBvcnQuIFRoZSBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9ucyB0aGF0IG1heQorICAgICAqIGJlIGJhY2tsb2dnZWQgaXMgc3BlY2lmaWVkIGJ5IHtAY29kZSBiYWNrbG9nfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb24gcmVxdWVzdHMgb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb24gcmVxdWVzdHMgb24uCiAgICAgICogQHBhcmFtIGxvY2FsQWRkcgotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG1hY2hpbmUgYWRkcmVzcyB0byBiaW5kIG9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWwgbWFjaGluZSBhZGRyZXNzIHRvIGJpbmQgb24uCiAgICAgICogQHBhcmFtIGJhY2tsb2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9uIHJlcXVlc3RzLCBiZWZvcmUgcmVxdWVzdHMgYXJlCi0gICAgICogICAgICAgICAgICByZWplY3RlZAotICAgICAqIEBzZWUgU29ja2V0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgY29ubmVjdGlvbiByZXF1ZXN0cywgYmVmb3JlIHJlcXVlc3RzCisgICAgICogICAgICAgICAgICB3aWxsIGJlIHJlamVjdGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHNlcnZlciBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlcnZlclNvY2tldChpbnQgYXBvcnQsIGludCBiYWNrbG9nLCBJbmV0QWRkcmVzcyBsb2NhbEFkZHIpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTI5LDEyICsxNDksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgZmlyc3QgY29ubmVjdGlvbiByZXF1ZXN0IGFuZCBhbnN3ZXIgdGhlICdob3N0JyBzb2NrZXQgdGhhdAotICAgICAqIHdpbGwgY29uZHVjdCBmdXJ0aGVyIGNvbW11bmljYXRpb25zIHdpdGggdGhlIHJlcXVlc3RpbmcgJ2NsaWVudCcgc29ja2V0LgorICAgICAqIFdhaXRzIGZvciBhbiBpbmNvbWluZyByZXF1ZXN0IGFuZCBibG9ja3MgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbmVkLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzb2NrZXQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUganVzdCBvcGVuZWQKKyAgICAgKiBjb25uZWN0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU29ja2V0IHRoZSAnaG9zdCcgc29ja2V0Ci0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBpbnN0YW50aWF0aW5nIHRoZSAnaG9zdCcgc29ja2V0CisgICAgICogQHJldHVybiB0aGUgY29ubmVjdGlvbiByZXByZXNlbnRpbmcgc29ja2V0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYWNjZXB0aW5nIGEgbmV3IGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldCBhY2NlcHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZShmYWxzZSk7CkBAIC0xNjMsMTIgKzE4NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIHNlcnZlciBtYXkgbGlzdGVuIGZvciBjb25uZWN0aW9uIHJlcXVlc3RzIG9uCi0gICAgICogPGNvZGU+YXBvcnQ8L2NvZGU+LiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHBvcnQgaXMgb3V0c2lkZSB0aGUKLSAgICAgKiB2YWxpZCByYW5nZSBvciBkb2VzIG5vdCBzYXRpc2Z5IHRoZSBzZWN1cml0eSBwb2xpY3kuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNlcnZlciBtYXkgbGlzdGVuIGZvciBjb25uZWN0aW9uIHJlcXVlc3RzIG9uIHtAY29kZQorICAgICAqIGFwb3J0fS4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcG9ydCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZQorICAgICAqIHtAY29kZSAwIDw9IGFwb3J0IDw9IDY1NTM1IH1vciBkb2VzIG5vdCBzYXRpc2Z5IHRoZSBzZWN1cml0eSBwb2xpY3kuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgY2FuZGlkYXRlIHBvcnQgdG8gbGlzdGVuIG9uCisgICAgICogICAgICAgICAgICB0aGUgY2FuZGlkYXRlIHBvcnQgdG8gbGlzdGVuIG9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHZvaWQgY2hlY2tMaXN0ZW4oaW50IGFQb3J0KSB7CiAgICAgICAgIGlmIChhUG9ydCA8IDAgfHwgYVBvcnQgPiA2NTUzNSkgewpAQCAtMTgxLDggKzIwNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgc2VydmVyIHNvY2tldC4gQW55IGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGlzIHNvY2tldAotICAgICAqIHRoZXJlYWZ0ZXIgd2lsbCBmYWlsLgorICAgICAqIENsb3NlcyB0aGlzIHNlcnZlciBzb2NrZXQgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbi4gQW55IGF0dGVtcHQgdG8gY29ubmVjdAorICAgICAqIHRvIHRoaXMgc29ja2V0IHRoZXJlYWZ0ZXIgd2lsbCBmYWlsLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGlzIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKQEAgLTE5MCw3ICsyMTcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgZGVmYXVsdCBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9ucyBvbiBhIHNlcnZlciBzb2NrZXQuCisgICAgICogQW5zd2VyIHRoZSBkZWZhdWx0IG51bWJlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zIG9uIGEgc2VydmVyIHNvY2tldC4gSWYKKyAgICAgKiB0aGUgYmFja2xvZyB2YWx1ZSBtYXhpbXVtIGlzIHJlYWNoZWQsIGFueSBzdWJzZXF1ZW50IGluY29taW5nIHJlcXVlc3QgaXMKKyAgICAgKiByZWplY3RlZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIGludCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9uIHJlcXVlc3RzCiAgICAgICovCkBAIC0xOTksMTAgKzIyOCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgbG9jYWwgSVAgYWRkcmVzcyBmb3IgdGhpcyBzZXJ2ZXIgc29ja2V0LiBSZXR1cm4gbnVsbCBpZiB0aGUKLSAgICAgKiBzb2NrZXQgaXMgbm90IGJvdW5kLiBUaGlzIGlzIHVzZWZ1bCBvbiBtdWx0aWhvbWVkIGhvc3RzLgorICAgICAqIEdldHMgdGhlIGxvY2FsIElQIGFkZHJlc3Mgb2YgdGhpcyBzZXJ2ZXIgc29ja2V0IG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiBzb2NrZXQgaXMgdW5ib3VuZC4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpaG9tZWQgaG9zdHMuCiAgICAgICogCi0gICAgICogQHJldHVybiBJbmV0QWRkcmVzcyB0aGUgbG9jYWwgYWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIGFkZHJlc3Mgb2YgdGhpcyBzZXJ2ZXIgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbmV0QWRkcmVzcyBnZXRJbmV0QWRkcmVzcygpIHsKICAgICAgICAgaWYgKCFpc0JvdW5kKCkpIHsKQEAgLTIxMiwxMCArMjQyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBsb2NhbCBwb3J0IGZvciB0aGlzIHNlcnZlciBzb2NrZXQuIFJldHVybiAtMSBpZiB0aGUgc29ja2V0IGlzCi0gICAgICogbm90IGJvdW5kLgorICAgICAqIEdldHMgdGhlIGxvY2FsIHBvcnQgb2YgdGhpcyBzZXJ2ZXIgc29ja2V0IG9yIHtAY29kZSAtMX0gaWYgdGhlIHNvY2tldCBpcworICAgICAqIHVuYm91bmQuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIGxvY2FsIHBvcnQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBwb3J0IHRoaXMgc2VydmVyIGlzIGxpc3RlbmluZyBvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKICAgICAgICAgaWYgKCFpc0JvdW5kKCkpIHsKQEAgLTIyNSwxMiArMjU2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSB0aW1lLW91dCBwZXJpb2Qgb2YgdGhpcyBzZXJ2ZXIgc29ja2V0LiBUaGlzIGlzIHRoZSB0aW1lIHRoZQotICAgICAqIHNlcnZlciB3aWxsIHdhaXQgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucywgYmVmb3JlIGV4aXRpbmcuCisgICAgICogR2V0cyB0aGUgdGltZW91dCBwZXJpb2Qgb2YgdGhpcyBzZXJ2ZXIgc29ja2V0LiBUaGlzIGlzIHRoZSB0aW1lIHRoZQorICAgICAqIHNlcnZlciB3aWxsIHdhaXQgbGlzdGVuaW5nIGZvciBhY2NlcHRlZCBjb25uZWN0aW9ucyBiZWZvcmUgZXhpdGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgbGlzdGVuaW5nIHRpbWVvdXQKLSAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRocm93biBpZiBvcHRpb24gY2Fubm90IGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIGxpc3RlbmluZyB0aW1lb3V0IHZhbHVlIG9mIHRoaXMgc2VydmVyIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG9wdGlvbiBjYW5ub3QgYmUgcmV0cmlldmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNvVGltZW91dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaXNDcmVhdGVkKSB7CkBAIC0yNTEsMTMgKzI4MywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEludm9rZSB0aGUgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiB0byBhY2NlcHQgYSBjb25uZWN0aW9uIG9uIHRoZQotICAgICAqIG5ld2x5IGNyZWF0ZWQgPGNvZGU+YVNvY2tldDwvY29kZT4uCisgICAgICogSW52b2tlcyB0aGUgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiB0byBhY2NlcHQgYSBjb25uZWN0aW9uIG9uIHRoZQorICAgICAqIGdpdmVuIHNvY2tldCB7QGNvZGUgYVNvY2tldH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGFTb2NrZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb25jcmV0ZSBzb2NrZXRJbXBsIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IG9uCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRocm93biBpZiBjb25uZWN0aW9uIGNhbm5vdCBiZSBhY2NlcHRlZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbmNyZXRlIHtAY29kZSBTb2NrZXRJbXBsfSB0byBhY2NlcHQgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHJlcXVlc3Qgb24uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb25uZWN0aW9uIGNhbm5vdCBiZSBhY2NlcHRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbXBsQWNjZXB0KFNvY2tldCBhU29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbXBsLmFjY2VwdChhU29ja2V0LmltcGwpOwpAQCAtMjY1LDE1ICsyOTksMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gZmFjdG9yeS4gVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUKLSAgICAgKiBpbnZva2VkIHdpdGggc3VmZmljaWVudCBzZWN1cml0eSBhbmQgb25seSBvbmNlIGR1cmluZyB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBsaWZldGltZS4KKyAgICAgKiBTZXRzIHRoZSBzZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIGZhY3Rvcnkgb2YgdGhpcyBpbnN0YW5jZS4gVGhpcworICAgICAqIG1ldGhvZCBtYXkgb25seSBiZSBpbnZva2VkIHdpdGggc3VmZmljaWVudCBzZWN1cml0eSBwcml2aWxlZ2UgYW5kIG9ubHkKKyAgICAgKiBvbmNlIGR1cmluZyB0aGUgYXBwbGljYXRpb24gbGlmZXRpbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFGYWN0b3J5CiAgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtaW5nIHNvY2tldCBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGZ1cnRoZXIgc29ja2V0Ci0gICAgICogICAgICAgICAgICBpbnN0YW50aWF0aW9ucwotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgdGhlIGZhY3RvcnkgaXMgYWxyZWFkeSBzZXQKKyAgICAgKiAgICAgICAgICAgIGluc3RhbnRpYXRpb25zLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmFjdG9yeSBjb3VsZCBub3QgYmUgc2V0IG9yIGlzIGFscmVhZHkgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0U29ja2V0RmFjdG9yeShTb2NrZXRJbXBsRmFjdG9yeSBhRmFjdG9yeSkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yODgsMTIgKzMyMywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgbGlzdGVuIHRpbWUtb3V0IHBlcmlvZCBmb3IgdGhpcyBzZXJ2ZXIgc29ja2V0LgorICAgICAqIFNldHMgdGhlIHRpbWVvdXQgcGVyaW9kIG9mIHRoaXMgc2VydmVyIHNvY2tldC4gVGhpcyBpcyB0aGUgdGltZSB0aGUKKyAgICAgKiBzZXJ2ZXIgd2lsbCB3YWl0IGxpc3RlbmluZyBmb3IgYWNjZXB0ZWQgY29ubmVjdGlvbnMgYmVmb3JlIGV4aXRpbmcuIFRoaXMKKyAgICAgKiB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgdGltZSB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gcmVxdWVzdAotICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgc2V0dGluZyB0aGUgb3B0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuaW5nIHRpbWVvdXQgdmFsdWUgb2YgdGhpcyBzZXJ2ZXIgc29ja2V0LgorICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIG9wdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U29UaW1lb3V0KGludCB0aW1lb3V0KSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRDcmVhdGUodHJ1ZSk7CkBAIC0zMDQsMTEgKzM0MiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHNlcnZlciBzb2NrZXQuIFRoZSA8Y29kZT5wb3J0PC9jb2RlPiBmaWVsZCBpcyByZXBvcnRlZCBhIHplcm8sIGFzIHRoZXJlCi0gICAgICogaXMgbm8gY29ubmVjdGlvbiBmb3JtZWQgdG8gdGhlIHNlcnZlci4KKyAgICAgKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlcnZlciBzb2NrZXQgaW5jbHVkaW5nIHRoZQorICAgICAqIGFkZHJlc3MsIHBvcnQgYW5kIHRoZSBzdGF0ZS4gVGhlIHBvcnQgZmllbGQgaXMgc2V0IHRvIHtAY29kZSAwfSBpZiB0aGVyZQorICAgICAqIGlzIG5vIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzb2NrZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGRlc2NyaXB0aW9uCisgICAgICogQHJldHVybiB0aGUgdGV4dHVhbCBzb2NrZXQgcmVwcmVzZW50YXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTMyNiwzNyArMzY1LDQyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmluZCB0aGUgU2VydmVyU29ja2V0IHRvIHRoZSBub21pbmF0ZWQgbG9jYWwgaG9zdC9wb3J0LiBUaGUgZGVmYXVsdAotICAgICAqIG51bWJlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zIG1heSBiZSBiYWNrbG9nZ2VkLgorICAgICAqIEJpbmRzIHRoaXMgc2VydmVyIHNvY2tldCB0byB0aGUgZ2l2ZW4gbG9jYWwgc29ja2V0IGFkZHJlc3MuIFRoZSBkZWZhdWx0CisgICAgICogbnVtYmVyIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMgbWF5IGJlIGJhY2tsb2dnZWQuIElmIHRoZSB7QGNvZGUgbG9jYWxBZGRyfQorICAgICAqIGlzIHNldCB0byB7QGNvZGUgbnVsbH0gdGhlIHNvY2tldCB3aWxsIGJlIGJvdW5kIHRvIGFuIGF2YWlsYWJsZSBsb2NhbAorICAgICAqIGFkZHJlc3Mgb24gYW55IGZyZWUgcG9ydCBvZiB0aGUgc3lzdGVtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbEFkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtYWNoaW5lIGFkZHJlc3MgYW5kIHBvcnQgdG8gYmluZCBvbgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIFNvY2tldEFkZHJlc3MgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgYm91bmQsIG9yIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nCi0gICAgICogICAgICAgICAgICAgICAgdGhlIGJpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBhZGRyZXNzIGFuZCBwb3J0IHRvIGJpbmQgb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFNvY2tldEFkZHJlc3N9IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBib3VuZCBvciBhIHByb2JsZW0gb2NjdXJzIGR1cmluZworICAgICAqICAgICAgICAgICAgIGJpbmRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZChTb2NrZXRBZGRyZXNzIGxvY2FsQWRkcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYmluZChsb2NhbEFkZHIsIGRlZmF1bHRCYWNrbG9nKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJpbmQgdGhlIFNlcnZlclNvY2tldCB0byB0aGUgbm9taW5hdGVkIGxvY2FsIGhvc3QvcG9ydC4gVGhlIG51bWJlciBvZgotICAgICAqIHBlbmRpbmcgY29ubmVjdGlvbnMgdGhhdCBtYXkgYmUgYmFja2xvZ2dlZCBpcyBhIHNwZWNpZmllZC4KKyAgICAgKiBCaW5kcyB0aGlzIHNlcnZlciBzb2NrZXQgdG8gdGhlIGdpdmVuIGxvY2FsIHNvY2tldCBhZGRyZXNzLiBJZiB0aGUKKyAgICAgKiB7QGNvZGUgbG9jYWxBZGRyfSBpcyBzZXQgdG8ge0Bjb2RlIG51bGx9IHRoZSBzb2NrZXQgd2lsbCBiZSBib3VuZCB0byBhbgorICAgICAqIGF2YWlsYWJsZSBsb2NhbCBhZGRyZXNzIG9uIGFueSBmcmVlIHBvcnQgb2YgdGhlIHN5c3RlbS4gVGhlIHZhbHVlIGZvcgorICAgICAqIHtAY29kZSBiYWNrbG9nfSBtdXN0IGUgZ3JlYXRlciB0aGFuIHtAY29kZSAwfSBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgKiB3aWxsIGJlIHVzZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsQWRkcgotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG1hY2hpbmUgYWRkcmVzcyBhbmQgcG9ydCB0byBiaW5kIG9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWwgbWFjaGluZSBhZGRyZXNzIGFuZCBwb3J0IHRvIGJpbmQgb24uCiAgICAgICogQHBhcmFtIGJhY2tsb2cKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9uIHJlcXVlc3RzLCBiZWZvcmUgcmVxdWVzdHMgYXJlCi0gICAgICogICAgICAgICAgICByZWplY3RlZAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIFNvY2tldEFkZHJlc3MgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgYm91bmQsIG9yIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nCi0gICAgICogICAgICAgICAgICAgICAgdGhlIGJpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9uIHJlcXVlc3RzLCBiZWZvcmUgcmVxdWVzdHMKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgcmVqZWN0ZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFNvY2tldEFkZHJlc3N9IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBib3VuZCBvciBhIHByb2JsZW0gb2NjdXJzIGR1cmluZworICAgICAqICAgICAgICAgICAgIGJpbmRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZChTb2NrZXRBZGRyZXNzIGxvY2FsQWRkciwgaW50IGJhY2tsb2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtMzk1LDggKzQzOSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgbG9jYWwgU29ja2V0QWRkcmVzcyBmb3IgdGhpcyBzZXJ2ZXIgc29ja2V0LCBvciBudWxsIGlmIHRoZQotICAgICAqIHNvY2tldCBpcyBub3QgYm91bmQuIFRoaXMgaXMgdXNlZnVsIG9uIG11bHRpaG9tZWQgaG9zdHMuCisgICAgICogR2V0cyB0aGUgbG9jYWwgc29ja2V0IGFkZHJlc3Mgb2YgdGhpcyBzZXJ2ZXIgc29ja2V0IG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqIHRoZSBzb2NrZXQgaXMgdW5ib3VuZC4gVGhpcyBpcyB1c2VmdWwgb24gbXVsdGlob21lZCBob3N0cy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBzb2NrZXQgYWRkcmVzcyBhbmQgcG9ydCB0aGlzIHNvY2tldCBpcyBib3VuZCB0by4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ja2V0QWRkcmVzcyBnZXRMb2NhbFNvY2tldEFkZHJlc3MoKSB7CiAgICAgICAgIGlmICghaXNCb3VuZCgpKSB7CkBAIC00MDYsMjEgKzQ1MywyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBpZiB0aGUgc2VydmVyIHNvY2tldCBpcyBib3VuZCB0byBhIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIHNvY2tldCBpcyBib3VuZCB0byBhIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQKKyAgICAgKiBvciBub3QuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzb2NrZXQgaXMgYm91bmQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQm91bmQoKSB7CiAgICAgICAgIHJldHVybiBpc0JvdW5kOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBpZiB0aGUgc2VydmVyIHNvY2tldCBpcyBjbG9zZWQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIHNvY2tldCBpcyBjbG9zZWQgb3Igbm90LgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgc29ja2V0IGlzIGNsb3NlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CiAgICAgICAgIHJldHVybiBpc0Nsb3NlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc29ja2V0IGlzIGNsb3NlZCwgYW5kIHRocm93cyBhbiBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKGJvb2xlYW4gY3JlYXRlKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKQEAgLTQ0NywxMCArNTAxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBTT19SRVVTRUFERFIgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNvY2tldCBvcHRpb24ge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fUkVVU0VBRERSfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmV1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgU09fUkVVU0VBRERSIG9wdGlvbiBzZXR0aW5nCisgICAgICogICAgICAgICAgICB0aGUgc29ja2V0IG9wdGlvbiBzZXR0aW5nLgorICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIG9wdGlvbiB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbiByZXVzZSkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtNDU5LDcgKzUxNiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIFNPX1JFVVNFQUREUiBzb2NrZXQgb3B0aW9uLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzb2NrZXQgb3B0aW9uIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX1JFVVNFQUREUn0uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wdGlvbiBpcyBlbmFibGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBvcHRpb24gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0UmV1c2VBZGRyZXNzKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtNDY4LDE0ICs1MzAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvY2tldCByZWNlaXZlIGJ1ZmZlciBzaXplLgorICAgICAqIFNldHMgdGhlIHNlcnZlciBzb2NrZXQgcmVjZWl2ZSBidWZmZXIgc2l6ZSB7QGNvZGUKKyAgICAgKiBTb2NrZXRPcHRpb25zLlNPX1JDVkJVRn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBzaXplIG9yIHRoZSBzaXplIGlzCi0gICAgICogICAgICAgICAgICAgICAgaW52YWxpZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgc2l6ZSBpbiBieXRlcy4KKyAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBzaXplIG9yIHRoZSBzaXplIGlzCisgICAgICogICAgICAgICAgICAgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZWNlaXZlQnVmZmVyU2l6ZShpbnQgc2l6ZSkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtNDg2LDkgKzU0OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgc29ja2V0IHJlY2VpdmUgYnVmZmVyIHNpemUgKFNPX1JDVkJVRikuCisgICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoZSByZWNlaXZlIGJ1ZmZlciBzaXplIHNvY2tldCBvcHRpb24ge0Bjb2RlCisgICAgICogU29ja2V0T3B0aW9ucy5TT19SQ1ZCVUZ9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHNvY2tldCByZWNlaXZlIGJ1ZmZlciBzaXplCisgICAgICogQHJldHVybiB0aGUgcmVjZWl2ZSBidWZmZXIgc2l6ZSBvZiB0aGlzIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBvcHRpb24gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTQ5NiwyNCArNTYzLDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogaWYgU2VydmVyU29ja2V0IGlzIGNyZWF0ZWQgYnkgYSBTZXJ2ZXJTb2NrZXRDaGFubmVsLCByZXR1cm5zIHRoZSByZWxhdGVkCi0gICAgICogU2VydmVyU29ja2V0Q2hhbm5lbAorICAgICAqIEdldHMgdGhlIHJlbGF0ZWQgY2hhbm5lbCBpZiB0aGlzIGluc3RhbmNlIHdhcyBjcmVhdGVkIGJ5IGEKKyAgICAgKiB7QGNvZGUgU2VydmVyU29ja2V0Q2hhbm5lbH0uIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHJldHVybnMgYWx3YXlzIHtAY29kZQorICAgICAqIG51bGx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbGF0ZWQgU2VydmVyU29ja2V0Q2hhbm5lbCBpZiBhbnkKKyAgICAgKiBAcmV0dXJuIHRoZSByZWxhdGVkIHtAY29kZSBTZXJ2ZXJTb2NrZXRDaGFubmVsfSBpZiBhbnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlcnZlclNvY2tldENoYW5uZWwgZ2V0Q2hhbm5lbCgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2V0cyBwZXJmb3JtYW5jZSBwcmVmZXJlbmNlIGZvciBjb25uZWN0aW9uVGltZSxsYXRlbmN5IGFuZCBiYW5kd2lkdGgKKyAgICAgKiBTZXRzIHBlcmZvcm1hbmNlIHByZWZlcmVuY2VzIGZvciBjb25uZWN0aW9uIHRpbWUsIGxhdGVuY3kgYW5kIGJhbmR3aWR0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIGN1cnJlbnRseSBub3RoaW5nLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29ubmVjdGlvblRpbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbXBvcnRhbmNlIG9mIGNvbm5lY3QgdGltZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgaW1wb3J0YW5jZSBvZiBhIHNob3J0IGNvbm5lY3RpbmcKKyAgICAgKiAgICAgICAgICAgIHRpbWUuCiAgICAgICogQHBhcmFtIGxhdGVuY3kKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbXBvcnRhbmNlIG9mIGxhdGVuY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydGFuY2Ugb2YgbG93IGxhdGVuY3kuCiAgICAgICogQHBhcmFtIGJhbmR3aWR0aAotICAgICAqICAgICAgICAgICAgdGhlIGltcG9ydGFuY2Ugb2YgYmFuZHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBpbXBvcnRhbmNlIG9mIGhpZ2ggYmFuZHdpZHRoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBlcmZvcm1hbmNlUHJlZmVyZW5jZXMoaW50IGNvbm5lY3Rpb25UaW1lLCBpbnQgbGF0ZW5jeSwKICAgICAgICAgICAgIGludCBiYW5kd2lkdGgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXQuamF2YQppbmRleCBmMmJjMWEyLi5jZDVjZmUwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldC5qYXZhCkBAIC0yNCwxNSArMjQsMTUgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuTmV0VXRpbDsKLS8vaW1wb3J0IGFuZHJvaWQubmV0LlNvY2tldEltcGxQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuU29ja2V0SW1wbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuUHJpdmlBY3Rpb247CiAKIC8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHNvY2tldHMgdG8gYmUgdXNlZCBpbiBjb25uZWN0aW9uLW9yaWVudGVkIChzdHJlYW1pbmcpCi0gKiBwcm90b2NvbHMuCisgKiBQcm92aWRlcyBhIGNsaWVudC1zaWRlIFRDUCBzb2NrZXQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU29ja2V0IHsKIApAQCAtNzIsMTAgKzcyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgY29ubmVjdGlvbi1vcmllbnRlZCBTb2NrZXQuIFRoZSBTb2NrZXQgaXMgY3JlYXRlZCBpbiB0aGUKLSAgICAgKiA8Y29kZT5mYWN0b3J5PC9jb2RlPiBpZiBkZWNsYXJlZCwgb3Igb3RoZXJ3aXNlIG9mIHRoZSBkZWZhdWx0IHR5cGUuCisgICAgICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQuIFdoZW4gYSBTb2NrZXRJbXBsRmFjdG9yeSBpcyBkZWZpbmVkIGl0CisgICAgICogY3JlYXRlcyB0aGUgaW50ZXJuYWwgc29ja2V0IGltcGxlbWVudGF0aW9uLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgc29ja2V0CisgICAgICogaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGZvciB0aGlzIHNvY2tldC4KICAgICAgKiAKICAgICAgKiBAc2VlIFNvY2tldEltcGxGYWN0b3J5CisgICAgICogQHNlZSBTb2NrZXRJbXBsCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldCgpIHsKICAgICAgICAgaW1wbCA9IGZhY3RvcnkgIT0gbnVsbCA/IGZhY3RvcnkuY3JlYXRlU29ja2V0SW1wbCgpCkBAIC04MywxOSArODYsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgY29ubmVjdGlvbi1vcmllbnRlZCBTb2NrZXQgd2l0aCBzcGVjaWZpZWQgPGNvZGU+cHJveHk8L2NvZGU+LgotICAgICAqIAotICAgICAqIE1ldGhvZCA8Y29kZT5jaGVja0Nvbm5lY3Q8L2NvZGU+IGlzIGNhbGxlZCBpZiBhIHNlY3VyaXR5IG1hbmFnZXIKLSAgICAgKiBleGlzdHMsIGFuZCB0aGUgcHJveHkgaG9zdCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlciBhcmUgcGFzc2VkIGFzCi0gICAgICogcGFyYW1ldGVycy4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB1c2luZyB0aGUgZ2l2ZW4gcHJveHkgdHlwZS4gV2hlbiBhCisgICAgICoge0Bjb2RlIFNvY2tldEltcGxGYWN0b3J5fSBpcyBkZWZpbmVkIGl0IGNyZWF0ZXMgdGhlIGludGVybmFsIHNvY2tldAorICAgICAqIGltcGxlbWVudGF0aW9uLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgc29ja2V0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZAorICAgICAqIGZvciB0aGlzIHNvY2tldC4KKyAgICAgKiA8cD4KKyAgICAgKiBFeGFtcGxlIHRoYXQgd2lsbCBjcmVhdGUgYSBzb2NrZXQgY29ubmVjdGlvbiB0aHJvdWdoIGEge0Bjb2RlIFNPQ0tTfQorICAgICAqIHByb3h5IHNlcnZlcjogPGJyPgorICAgICAqIHtAY29kZSBTb2NrZXQgc29jayA9IG5ldyBTb2NrZXQobmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIG5ldworICAgICAqIEluZXRTb2NrZXRBZGRyZXNzKCJ0ZXN0LmRvbWFpbi5vcmciLCAyMTMwKSkpO30KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHByb3h5Ci0gICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3h5IGZvciB0aGlzIFNvY2tldC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJveHkgZm9yIHRoaXMgc29ja2V0LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3h5IGlzIG51bGwgb3Igb2YgYW4gaW52YWxpZCB0eXBlLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCB7QGNvZGUgcHJveHl9IGlzIHtAY29kZSBudWxsfSBvciBvZiBhbgorICAgICAqICAgICAgICAgICAgIGludmFsaWQgdHlwZS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGVuaWVzIHRoZSBwZXJtaXNzaW9uIHRvCi0gICAgICogICAgICAgICAgICAgY29ubmVjdCB0byBwcm94eS4KKyAgICAgKiAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBnaXZlbiBwcm94eS4KKyAgICAgKiBAc2VlIFNvY2tldEltcGxGYWN0b3J5CisgICAgICogQHNlZSBTb2NrZXRJbXBsCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldChQcm94eSBwcm94eSkgewogICAgICAgICBpZiAobnVsbCA9PSBwcm94eSB8fCBQcm94eS5UeXBlLkhUVFAgPT0gcHJveHkudHlwZSgpKSB7CkBAIC0xMjAsMTkgKzEzMiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIHN0cmVhbSBzb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBub21pbmF0ZWQgZGVzdGluYXRpb24KLSAgICAgKiBob3N0L3BvcnQuIEJ5IGRlZmF1bHQsIHRoZSBzb2NrZXQgYmluZHMgaXQgdG8gYW55IGF2YWlsYWJsZSBwb3J0IG9uIHRoZQotICAgICAqIGRlZmF1bHQgbG9jYWxob3N0LgorICAgICAqIENyZWF0ZXMgYSBuZXcgc3RyZWFtaW5nIHNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCBob3N0IHNwZWNpZmllZCBieQorICAgICAqIHRoZSBwYXJhbWV0ZXJzIHtAY29kZSBkc3ROYW1lfSBhbmQge0Bjb2RlIGRzdFBvcnR9LiBUaGUgc29ja2V0IGlzIGJvdW5kCisgICAgICogdG8gYW55IGF2YWlsYWJsZSBwb3J0IG9uIHRoZSBsb2NhbCBob3N0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkc3ROYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaG9zdCB0byBjb25uZWN0IHRvCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGhvc3QgbmFtZSBvciBJUCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8uCiAgICAgICogQHBhcmFtIGRzdFBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSBkZXN0aW5hdGlvbiBob3N0IHRvIGNvbm5lY3QgdG8KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSB0YXJnZXQgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaG9zdCBjYW5ub3QgYmUgcmVzb2x2ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaG9zdCBuYW1lIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbnRvIGFuIElQIGFkZHJlc3MuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBpbnN0YW50aWF0aW5nIHRoZSBzb2NrZXQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ja2V0KFN0cmluZyBkc3ROYW1lLCBpbnQgZHN0UG9ydCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLAogICAgICAgICAgICAgSU9FeGNlcHRpb24gewpAQCAtMTQzLDIyICsxNTUsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBzdHJlYW0gc29ja2V0IGNvbm5lY3RlZCB0byB0aGUgbm9taW5hdGVkIGRlc3RpbmF0aW9uCi0gICAgICogaG9zdC9wb3J0LiBUaGUgc29ja2V0IGlzIGJvdW5kIGl0IHRvIHRoZSBub21pbmF0ZWQgbG9jYWxBZGRyZXNzL3BvcnQuCisgICAgICogQ3JlYXRlcyBhIG5ldyBzdHJlYW1pbmcgc29ja2V0IGNvbm5lY3RlZCB0byB0aGUgdGFyZ2V0IGhvc3Qgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlIHBhcmFtZXRlcnMge0Bjb2RlIGRzdE5hbWV9IGFuZCB7QGNvZGUgZHN0UG9ydH0uIE9uIHRoZSBsb2NhbCBlbmRwb2ludAorICAgICAqIHRoZSBzb2NrZXQgaXMgYm91bmQgdG8gdGhlIGdpdmVuIGFkZHJlc3Mge0Bjb2RlIGxvY2FsQWRkcmVzc30gb24gcG9ydAorICAgICAqIHtAY29kZSBsb2NhbFBvcnR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkc3ROYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaG9zdCB0byBjb25uZWN0IHRvCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGhvc3QgbmFtZSBvciBJUCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8uCiAgICAgICogQHBhcmFtIGRzdFBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSBkZXN0aW5hdGlvbiBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSB0YXJnZXQgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEBwYXJhbSBsb2NhbEFkZHJlc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBob3N0IGFkZHJlc3MgdG8gYmluZCB0bworICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb24gdGhlIGxvY2FsIGhvc3QgdG8gYmluZCB0by4KICAgICAgKiBAcGFyYW0gbG9jYWxQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgbG9jYWwgcG9ydCB0byBiaW5kIHRvCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWwgaG9zdCB0byBiaW5kIHRvLgogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaG9zdCBjYW5ub3QgYmUgcmVzb2x2ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaG9zdCBuYW1lIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbnRvIGFuIElQIGFkZHJlc3MuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBpbnN0YW50aWF0aW5nIHRoZSBzb2NrZXQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ja2V0KFN0cmluZyBkc3ROYW1lLCBpbnQgZHN0UG9ydCwgSW5ldEFkZHJlc3MgbG9jYWxBZGRyZXNzLAogICAgICAgICAgICAgaW50IGxvY2FsUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE2OSwyMyArMTgzLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIGEgbmV3IHNvY2tldC4gVGhpcyBjb25zdHJ1Y3RvciBpcyBkZXByZWNhdGVkLgorICAgICAqIENyZWF0ZXMgYSBuZXcgc3RyZWFtaW5nIG9yIGRhdGFncmFtIHNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCBob3N0CisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXJzIHtAY29kZSBob3N0TmFtZX0gYW5kIHtAY29kZSBwb3J0fS4gVGhlIHNvY2tldAorICAgICAqIGlzIGJvdW5kIHRvIGFueSBhdmFpbGFibGUgcG9ydCBvbiB0aGUgbG9jYWwgaG9zdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaG9zdE5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgaG9zdCBuYW1lIG9yIElQIGFkZHJlc3MgdG8gY29ubmVjdCB0by4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb24gdGhlIGhvc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSB0YXJnZXQgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEBwYXJhbSBzdHJlYW1pbmcKLSAgICAgKiAgICAgICAgICAgIGlmIHRydWUsIGFuc3dlciBhIHN0cmVhbSBzb2NrZXQsIGVsc2UgYW5zd2VyIGEgYSBkYXRhZ3JhbQotICAgICAqICAgICAgICAgICAgc29ja2V0LgotICAgICAqIAorICAgICAqICAgICAgICAgICAgaWYge0Bjb2RlIHRydWV9IGEgc3RyZWFtaW5nIHNvY2tldCBpcyByZXR1cm5lZCwgYSBkYXRhZ3JhbQorICAgICAqICAgICAgICAgICAgc29ja2V0IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGhvc3QgY2Fubm90IGJlIHJlc29sdmVkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGhvc3QgbmFtZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW50byBhbiBJUCBhZGRyZXNzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW5zdGFudGlhdGluZyB0aGUgc29ja2V0Ci0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSkRLIDEuMSwgcmVwbGFjZWQgYnkgU29ja2V0Ci0gICAgICogQHNlZSAjU29ja2V0KFN0cmluZyxpbnQpCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBzb2NrZXQuCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAY29kZSBTb2NrZXQoU3RyaW5nLCBpbnQpfSBpbnN0ZWFkIG9mIHRoaXMgZm9yIHN0cmVhbWluZworICAgICAqICAgICAgICAgICAgIHNvY2tldHMgb3IgYW4gYXBwcm9wcmlhdGUgY29uc3RydWN0b3Igb2Yge0Bjb2RlCisgICAgICogICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXR9IGZvciBVRFAgdHJhbnNwb3J0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFNvY2tldChTdHJpbmcgaG9zdE5hbWUsIGludCBwb3J0LCBib29sZWFuIHN0cmVhbWluZykKQEAgLTE5NywxNyArMjEzLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgc3RyZWFtIHNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIG5vbWluYXRlZCBkZXN0aW5hdGlvbiBob3N0Ci0gICAgICogYWRkcmVzcy9wb3J0LiBCeSBkZWZhdWx0LCB0aGUgc29ja2V0IGJpbmRzIGl0IHRvIGFueSBhdmFpbGFibGUgcG9ydCBvbgotICAgICAqIHRoZSBkZWZhdWx0IGxvY2FsaG9zdC4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbWluZyBzb2NrZXQgY29ubmVjdGVkIHRvIHRoZSB0YXJnZXQgaG9zdCBzcGVjaWZpZWQgYnkKKyAgICAgKiB0aGUgcGFyYW1ldGVycyB7QGNvZGUgZHN0QWRkcmVzc30gYW5kIHtAY29kZSBkc3RQb3J0fS4gVGhlIHNvY2tldCBpcworICAgICAqIGJvdW5kIHRvIGFueSBhdmFpbGFibGUgcG9ydCBvbiB0aGUgbG9jYWwgaG9zdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZHN0QWRkcmVzcwotICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGhvc3QgYWRkcmVzcyB0byBjb25uZWN0IHRvCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGhvc3QgYWRkcmVzcyB0byBjb25uZWN0IHRvLgogICAgICAqIEBwYXJhbSBkc3RQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgZGVzdGluYXRpb24gaG9zdCB0byBjb25uZWN0IHRvCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgdGFyZ2V0IGhvc3QgdG8gY29ubmVjdCB0by4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGluc3RhbnRpYXRpbmcgdGhlIHNvY2tldAorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXQoSW5ldEFkZHJlc3MgZHN0QWRkcmVzcywgaW50IGRzdFBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoKTsKQEAgLTIxNiwyMCArMjMyLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgc3RyZWFtIHNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIG5vbWluYXRlZCBkZXN0aW5hdGlvbiBob3N0Ci0gICAgICogYWRkcmVzcy9wb3J0LiBUaGUgc29ja2V0IGlzIGJvdW5kIGl0IHRvIHRoZSBub21pbmF0ZWQgbG9jYWxBZGRyZXNzL3BvcnQuCisgICAgICogQ3JlYXRlcyBhIG5ldyBzdHJlYW1pbmcgc29ja2V0IGNvbm5lY3RlZCB0byB0aGUgdGFyZ2V0IGhvc3Qgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlIHBhcmFtZXRlcnMge0Bjb2RlIGRzdEFkZHJlc3N9IGFuZCB7QGNvZGUgZHN0UG9ydH0uIE9uIHRoZSBsb2NhbAorICAgICAqIGVuZHBvaW50IHRoZSBzb2NrZXQgaXMgYm91bmQgdG8gdGhlIGdpdmVuIGFkZHJlc3Mge0Bjb2RlIGxvY2FsQWRkcmVzc30gb24KKyAgICAgKiBwb3J0IHtAY29kZSBsb2NhbFBvcnR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkc3RBZGRyZXNzCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaG9zdCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgaG9zdCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8uCiAgICAgICogQHBhcmFtIGRzdFBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSBkZXN0aW5hdGlvbiBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSB0YXJnZXQgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEBwYXJhbSBsb2NhbEFkZHJlc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBob3N0IGFkZHJlc3MgdG8gYmluZCB0bworICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb24gdGhlIGxvY2FsIGhvc3QgdG8gYmluZCB0by4KICAgICAgKiBAcGFyYW0gbG9jYWxQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgbG9jYWwgcG9ydCB0byBiaW5kIHRvCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWwgaG9zdCB0byBiaW5kIHRvLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW5zdGFudGlhdGluZyB0aGUgc29ja2V0CisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldChJbmV0QWRkcmVzcyBkc3RBZGRyZXNzLCBpbnQgZHN0UG9ydCwKICAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsQWRkcmVzcywgaW50IGxvY2FsUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTIzOSwyMyArMjU3LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIGEgbmV3IHNvY2tldC4gVGhpcyBjb25zdHJ1Y3RvciBpcyBkZXByZWNhdGVkLgorICAgICAqIENyZWF0ZXMgYSBuZXcgc3RyZWFtaW5nIG9yIGRhdGFncmFtIHNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCBob3N0CisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXJzIHtAY29kZSBhZGRyfSBhbmQge0Bjb2RlIHBvcnR9LiBUaGUgc29ja2V0IGlzCisgICAgICogYm91bmQgdG8gYW55IGF2YWlsYWJsZSBwb3J0IG9uIHRoZSBsb2NhbCBob3N0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyCi0gICAgICogICAgICAgICAgICB0aGUgaW50ZXJuZXQgYWRkcmVzcworICAgICAqICAgICAgICAgICAgdGhlIEludGVybmV0IGFkZHJlc3MgdG8gY29ubmVjdCB0by4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb24gdGhlIGhvc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG9uIHRoZSB0YXJnZXQgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEBwYXJhbSBzdHJlYW1pbmcKLSAgICAgKiAgICAgICAgICAgIGlmIHRydWUsIGFuc3dlciBhIHN0cmVhbSBzb2NrZXQsIGVsc2UgYW5zd2VyIGEgZGF0YWdyYW0KLSAgICAgKiAgICAgICAgICAgIHNvY2tldC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGhvc3QgY2Fubm90IGJlIHJlc29sdmVkCisgICAgICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0gYSBzdHJlYW1pbmcgc29ja2V0IGlzIHJldHVybmVkLCBhIGRhdGFncmFtCisgICAgICogICAgICAgICAgICBzb2NrZXQgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW5zdGFudGlhdGluZyB0aGUgc29ja2V0Ci0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSkRLIDEuMSwgcmVwbGFjZWQgYnkgU29ja2V0Ci0gICAgICogQHNlZSAjU29ja2V0KEluZXRBZGRyZXNzLGludCkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0Bjb2RlIFNvY2tldChJbmV0QWRkcmVzcywgaW50KX0gaW5zdGVhZCBvZiB0aGlzIGZvcgorICAgICAqICAgICAgICAgICAgIHN0cmVhbWluZyBzb2NrZXRzIG9yIGFuIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIG9mIHtAY29kZQorICAgICAqICAgICAgICAgICAgIERhdGFncmFtU29ja2V0fSBmb3IgVURQIHRyYW5zcG9ydC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBTb2NrZXQoSW5ldEFkZHJlc3MgYWRkciwgaW50IHBvcnQsIGJvb2xlYW4gc3RyZWFtaW5nKQpAQCAtMjY2LDI3ICsyODQsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIHVuY29ubmVjdGVkIHNvY2tldCwgd3JhcHBpbmcgdGhlIDxjb2RlPnNvY2tldEltcGw8L2NvZGU+Ci0gICAgICogYXJndW1lbnQuCisgICAgICogQ3JlYXRlcyBhbiB1bmNvbm5lY3RlZCBzb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0IGltcGxlbWVudGF0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhbkltcGwKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgdG8gd3JhcAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFzc2lnbmluZyB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU29ja2V0KFNvY2tldEltcGwgYW5JbXBsKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgaW1wbCA9IGFuSW1wbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgY29ubmVjdGlvbiBkZXN0aW5hdGlvbiBzYXRpc2ZpZXMgdGhlIHNlY3VyaXR5IHBvbGljeSBhbmQgaXMgaW4KLSAgICAgKiB0aGUgdmFsaWQgcG9ydCByYW5nZS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY29ubmVjdGlvbiBkZXN0aW5hdGlvbiBzYXRpc2ZpZXMgdGhlIHNlY3VyaXR5IHBvbGljeQorICAgICAqIGFuZCB0aGUgdmFsaWRpdHkgb2YgdGhlIHBvcnQgcmFuZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRlc3RBZGRyCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaG9zdCBhZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaG9zdCBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBkc3RQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgZGVzdGluYXRpb24gaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb24gdGhlIGRlc3RpbmF0aW9uIGhvc3QuCiAgICAgICovCiAgICAgdm9pZCBjaGVja0Rlc3RpbmF0aW9uKEluZXRBZGRyZXNzIGRlc3RBZGRyLCBpbnQgZHN0UG9ydCkgewogICAgICAgICBpZiAoZHN0UG9ydCA8IDAgfHwgZHN0UG9ydCA+IDY1NTM1KSB7CkBAIC0yOTUsMTEgKzMxMiwxMyBAQAogICAgICAgICBjaGVja0Nvbm5lY3RQZXJtaXNzaW9uKGRlc3RBZGRyLmdldEhvc3ROYW1lKCksIGRzdFBvcnQpOwogICAgIH0KIAotICAgIC8qCi0gICAgICogQ2hlY2tzIHRoZSBjb25uZWN0aW9uIGRlc3RpbmF0aW9uIHNhdGlzZmllcyB0aGUgc2VjdXJpdHkgcG9saWN5LgorICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGRlc3RpbmF0aW9uIHNhdGlzZmllcyB0aGUgc2VjdXJpdHkgcG9saWN5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBob3N0bmFtZSB0aGUgZGVzdGluYXRpb24gaG9zdG5hbWUgQHBhcmFtIGRzdFBvcnQgdGhlIHBvcnQgb24gdGhlCi0gICAgICogZGVzdGluYXRpb24gaG9zdAorICAgICAqIEBwYXJhbSBob3N0bmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGhvc3RuYW1lLgorICAgICAqIEBwYXJhbSBkc3RQb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgZGVzdGluYXRpb24gaG9zdC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY2hlY2tDb25uZWN0UGVybWlzc2lvbihTdHJpbmcgaG9zdG5hbWUsIGludCBkc3RQb3J0KSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTMwOSwxMCArMzI4LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIHNvY2tldC4gSXQgaXMgbm90IHZhbGlkIHRvIHVzZSB0aGUgc29ja2V0IHRoZXJlYWZ0ZXIuCisgICAgICogQ2xvc2VzIHRoZSBzb2NrZXQuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWNvbm5lY3Qgb3IgcmViaW5kIHRvIHRoaXMKKyAgICAgKiBzb2NrZXQgdGhlcmVhZnRlciB3aGljaCBtZWFucyBhIG5ldyBzb2NrZXQgaW5zdGFuY2UgaGFzIHRvIGJlIGNyZWF0ZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGNsb3NlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CkBAIC0zMjAsMTEgKzM0MSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4ge0BsaW5rIEluZXRBZGRyZXNzfSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGFkZHJlc3MgdGhpcwotICAgICAqIHNvY2tldCBoYXMgY29ubmVjdGVkIHRvLgorICAgICAqIEdldHMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBob3N0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0by4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGlmIHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCwgdGhlIGFkZHJlc3MgaXQgaXMgY29ubmVjdGVkIHRvLiBBCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiByZXR1cm4gc2lnbmlmaWVzIG5vIGNvbm5lY3Rpb24gaGFzIGJlZW4gbWFkZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBjb25uZWN0ZWQgdGFyZ2V0IGhvc3Qgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICB0aGlzIHNvY2tldCBpcyBub3QgeWV0IGNvbm5lY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0SW5ldEFkZHJlc3MoKSB7CiAgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgewpAQCAtMzM0LDE1ICszNTUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHNvY2tldCBpbnB1dCBzdHJlYW0sIHRvIHJlYWQgYnl0ZSBkYXRhIG9mZiB0aGUgc29ja2V0LiBOb3RlLAotICAgICAqIG11bHRpcGxlIGlucHV0IHN0cmVhbXMgbWF5IGJlIGNyZWF0ZWQgb24gYSBzaW5nbGUgc29ja2V0LgorICAgICAqIEdldHMgYW4gaW5wdXQgc3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tIHRoaXMgc29ja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBieXRlIG9yaWVudGVkIHJlYWQgc3RyZWFtIGZvciB0aGlzIHNvY2tldAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUtb3JpZW50ZWQgaW5wdXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIHN0cmVhbQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlNvY2tldElucHV0U3RyZWFtCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBpbnB1dCBzdHJlYW0gb3IgdGhlCisgICAgICogICAgICAgICAgICAgc29ja2V0IGlzIGluIGFuIGludmFsaWQgc3RhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRDcmVhdGUoZmFsc2UpOwpAQCAtMzUzLDEyICszNzIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIFNPX0tFRVBBTElWRSBvcHRpb24gZm9yIHRoaXMgc29ja2V0LgorICAgICAqIEdldHMgdGhlIHNldHRpbmcgb2YgdGhlIHNvY2tldCBvcHRpb24ge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fS0VFUEFMSVZFfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzb2NrZXQgU09fS0VFUEFMSVZFIG9wdGlvbiBzZXR0aW5nCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX0tFRVBBTElWRX0gaXMKKyAgICAgKiAgICAgICAgIGVuYWJsZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIG9uIHRoZSBvcHRpb24gYWNjZXNzCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgdGhlIHNvY2tldCBvcHRpb24uCisgICAgICogQHNlZSBTb2NrZXRPcHRpb25zI1NPX0tFRVBBTElWRQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEtlZXBBbGl2ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTM2NywxMCArMzg4LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB7QGxpbmsgSW5ldEFkZHJlc3N9IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgPGk+bG9jYWw8L2k+Ci0gICAgICogYWRkcmVzcyB0aGlzIHNvY2tldCBpcyBib3VuZCB0by4KKyAgICAgKiBHZXRzIHRoZSBsb2NhbCBJUCBhZGRyZXNzIHRoaXMgc29ja2V0IGlzIGJvdW5kIHRvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIGFkZHJlc3MgdGhhdCB0aGlzIHNvY2tldCBoYXMgYm91bmQgdG8KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBJUCBhZGRyZXNzIG9mIHRoaXMgc29ja2V0IG9yIHtAY29kZSBJbmV0QWRkcmVzcy5BTll9IGlmCisgICAgICogICAgICAgICB0aGUgc29ja2V0IGlzIHVuYm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygpIHsKICAgICAgICAgaWYgKCFpc0JvdW5kKCkpIHsKQEAgLTM4MSw5ICs0MDMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGxvY2FsIHBvcnQgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBib3VuZC4KKyAgICAgKiBHZXRzIHRoZSBsb2NhbCBwb3J0IHRoaXMgc29ja2V0IGlzIGJvdW5kIHRvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBib3VuZAorICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgb2YgdGhpcyBzb2NrZXQgb3Ige0Bjb2RlIC0xfSBpZiB0aGUgc29ja2V0IGlzCisgICAgICogICAgICAgICB1bmJvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgewogICAgICAgICBpZiAoIWlzQm91bmQoKSkgewpAQCAtMzkzLDE1ICs0MTcsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHNvY2tldCBvdXRwdXQgc3RyZWFtLCBmb3Igd3JpdGluZyBieXRlIGRhdGEgb24gdGhlIHNvY2tldC4KLSAgICAgKiBOb3RlLCBtdWx0aXBsaWUgb3V0cHV0IHN0cmVhbXMgbWF5IGJlIGNyZWF0ZWQgb24gYSBzaW5nbGUgc29ja2V0LgorICAgICAqIEdldHMgYW4gb3V0cHV0IHN0cmVhbSB0byB3cml0ZSBkYXRhIGludG8gdGhpcyBzb2NrZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBPdXRwdXRTdHJlYW0gYSBieXRlIG9yaWVudGVkIHdyaXRlIHN0cmVhbSBmb3IgdGhpcyBzb2NrZXQKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlLW9yaWVudGVkIG91dHB1dCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgc3RyZWFtCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuU29ja2V0T3V0cHV0U3RyZWFtCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBvdXRwdXQgc3RyZWFtIG9yIHRoZQorICAgICAqICAgICAgICAgICAgIHNvY2tldCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRDcmVhdGUoZmFsc2UpOwpAQCAtNDEyLDExICs0MzQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBwb3J0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0by4KKyAgICAgKiBHZXRzIHRoZSBwb3J0IG51bWJlciBvZiB0aGUgdGFyZ2V0IGhvc3QgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSByZW1vdGUgcG9ydCBudW1iZXIgdGhhdCB0aGlzIHNvY2tldCBoYXMgY29ubmVjdGVkIHRvLiBBCi0gICAgICogICAgICAgICByZXR1cm4gb2YgPGNvZGU+MDwvY29kZT4gKHplcm8pIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vCi0gICAgICogICAgICAgICBjb25uZWN0aW9uIGluIHBsYWNlLgorICAgICAqIEByZXR1cm4gdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBjb25uZWN0ZWQgdGFyZ2V0IGhvc3Qgb3Ige0Bjb2RlIDB9IGlmIHRoaXMKKyAgICAgKiAgICAgICAgIHNvY2tldCBpcyBub3QgeWV0IGNvbm5lY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CiAgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgewpAQCAtNDI2LDEzICs0NDgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGxpbmdlci1vbi1jbG9zZSB0aW1lb3V0IGZvciB0aGlzIHNvY2tldCAodGhlIFNPX0xJTkdFUiB2YWx1ZSkuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNvY2tldCBvcHRpb24ge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fTElOR0VSfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgc29ja2V0J3MgU09fTElOR0VSIHZhbHVlLiBBIHZhbHVlIG9mIDxjb2RlPi0xPC9jb2RlPiB3aWxsCi0gICAgICogICAgICAgICBiZSByZXR1cm5lZCBpZiB0aGUgb3B0aW9uIGlzIG5vdCBlbmFibGVkLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG9wdGlvbiB7QGNvZGUgU29ja2V0T3B0aW9ucy5TT19MSU5HRVJ9CisgICAgICogICAgICAgICBvciB7QGNvZGUgLTF9IGlmIHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIG9uIHF1ZXJ5aW5nIHRoaXMgcHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBAc2VlIFNvY2tldE9wdGlvbnMjU09fTElOR0VSCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRTb0xpbmdlcigpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTQ0MCwxMiArNDYzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBzb2NrZXQgcmVjZWl2ZSBidWZmZXIgc2l6ZSAoU09fUkNWQlVGKS4KKyAgICAgKiBHZXRzIHRoZSByZWNlaXZlIGJ1ZmZlciBzaXplIG9mIHRoaXMgc29ja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gc29ja2V0IHJlY2VpdmUgYnVmZmVyIHNpemUKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24ge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fUkNWQlVGfS4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBvbiB0aGUgb3B0aW9uIGFjY2VzcworICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBzb2NrZXQgb3B0aW9uLgorICAgICAqIEBzZWUgU29ja2V0T3B0aW9ucyNTT19SQ1ZCVUYKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTQ1MywxMiArNDc3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBzb2NrZXQgc2VuZCBidWZmZXIgc2l6ZSAoU09fU05EQlVGKS4KKyAgICAgKiBHZXRzIHRoZSBzZW5kIGJ1ZmZlciBzaXplIG9mIHRoaXMgc29ja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gc29ja2V0IHNlbmQgYnVmZmVyIHNpemUKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24ge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fU05EQlVGfS4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBvbiB0aGUgb3B0aW9uIGFjY2VzcworICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBzb2NrZXQgb3B0aW9uLgorICAgICAqIEBzZWUgU29ja2V0T3B0aW9ucyNTT19TTkRCVUYKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTZW5kQnVmZmVyU2l6ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTQ2NiwxNCArNDkxLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBzb2NrZXQgcmVhZCB0aW1lb3V0LiBUaGUgU09fVElNRU9VVCBvcHRpb24sIGEgdmFsdWUgb2YgMAotICAgICAqIGluZGljYXRlcyBpdCBpcyBkaXNhYmxlZCBhbmQgYSByZWFkIG9wZXJhdGlvbiB3aWxsIGJsb2NrIGluZGVmaW5pdGVseQotICAgICAqIHdhaXRpbmcgZm9yIGRhdGEuCisgICAgICogR2V0cyB0aGUgdGltZW91dCBmb3IgdGhpcyBzb2NrZXQgZHVyaW5nIHdoaWNoIGEgcmVhZGluZyBvcGVyYXRpb24gc2hhbGwKKyAgICAgKiBibG9jayB3aGlsZSB3YWl0aW5nIGZvciBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNvY2tldCByZWFkIHRpbWVvdXQKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24ge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fVElNRU9VVH0KKyAgICAgKiAgICAgICAgIG9yIHtAY29kZSAwfSB3aGljaCByZXByZXNlbnRzIGFuIGluZmluaXRlIHRpbWVvdXQuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgb24gdGhlIG9wdGlvbiBhY2Nlc3MKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBAc2VlIFNvY2tldE9wdGlvbnMjU09fVElNRU9VVAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNvVGltZW91dCgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTQ4MSwxMyArNTA3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRydWUgaWYgdGhlIHNvY2tldCBpcyB1c2luZyBOYWdsZSdzIGFsZ29yaXRobS4gVGhlIFRDUF9OT0RFTEFZCi0gICAgICogb3B0aW9uIHNldHRpbmcuCisgICAgICogR2V0cyB0aGUgc2V0dGluZyBvZiB0aGUgc29ja2V0IG9wdGlvbiB7QGNvZGUgU29ja2V0T3B0aW9ucy5UQ1BfTk9ERUxBWX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc29ja2V0IFRDUF9OT0RFTEFZIG9wdGlvbiBzZXR0aW5nCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBTb2NrZXRPcHRpb25zLlRDUF9OT0RFTEFZfSBpcyBlbmFibGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgb24gdGhlIG9wdGlvbiBhY2Nlc3MKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBAc2VlIFNvY2tldE9wdGlvbnMjVENQX05PREVMQVkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRUY3BOb0RlbGF5KCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtNDk2LDEzICs1MjMsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIFNPX0tFRVBBTElWRSBvcHRpb24gZm9yIHRoaXMgc29ja2V0LgorICAgICAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSB7QGNvZGUgU29ja2V0T3B0aW9ucy5TT19LRUVQQUxJVkV9IGZvciB0aGlzIHNvY2tldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgU09fS0VFUEFMSVZFIG9wdGlvbiBzZXR0aW5nCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RhdGUgd2hldGhlciB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIG9yIG5vdC4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBzZXR0aW5nIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgb3B0aW9uLgorICAgICAqIEBzZWUgU29ja2V0T3B0aW9ucyNTT19LRUVQQUxJVkUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRLZWVwQWxpdmUoYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbXBsICE9IG51bGwpIHsKQEAgLTUxMywxMyArNTQxLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBhcHBsaWNhdGlvbidzIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBmYWN0b3J5LiBUaGlzIG1heSBvbmx5Ci0gICAgICogYmUgZXhlY3V0ZWQgdGhlIG9uY2Ugb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIFNldHMgdGhlIGludGVybmFsIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHNvY2tldCBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgbWF5CisgICAgICogb25seSBiZSBleGVjdXRlZCBvbmNlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIGFwcGxpY2F0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmYWMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgZmFjdG9yeSB0byBzZXQKLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBmYWN0b3J5IGhhcyBhbHJlYWR5IGJlZW4gc2V0CisgICAgICogICAgICAgICAgICB0aGUgc29ja2V0IGltcGxlbWVudGF0aW9uIGZhY3RvcnkgdG8gYmUgc2V0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmFjdG9yeSBoYXMgYmVlbiBhbHJlYWR5IHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNvY2tldEltcGxGYWN0b3J5KFNvY2tldEltcGxGYWN0b3J5IGZhYykKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MzQsMTQgKzU2MywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgc29ja2V0IHNlbmQgYnVmZmVyIHNpemUuCisgICAgICogU2V0cyB0aGUgc2VuZCBidWZmZXIgc2l6ZSBvZiB0aGlzIHNvY2tldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciBzaXplLCBpbiBieXRlcwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBUaGlzIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIKKyAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgMH0uCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgc2l6ZSBvciB0aGUgc2l6ZSBpcwotICAgICAqICAgICAgICAgICAgIGludmFsaWQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIHNpemUgb3IgdGhlIGdpdmVuIHZhbHVlCisgICAgICogICAgICAgICAgICAgaXMgYW4gaW52YWxpZCBzaXplLgorICAgICAqIEBzZWUgU29ja2V0T3B0aW9ucyNTT19TTkRCVUYKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2VuZEJ1ZmZlclNpemUoaW50IHNpemUpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTU1MiwxNCArNTgzLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBzb2NrZXQgcmVjZWl2ZSBidWZmZXIgc2l6ZS4KKyAgICAgKiBTZXRzIHRoZSByZWNlaXZlIGJ1ZmZlciBzaXplIG9mIHRoaXMgc29ja2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHNpemUsIGluIGJ5dGVzCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcgorICAgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSAwfS4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHRmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBzaXplIG9yIHRoZSBzaXplIGlzCi0gICAgICogICAgICAgICAgICAgaW52YWxpZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgc2l6ZSBvciB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKiAgICAgICAgICAgICBpcyBhbiBpbnZhbGlkIHNpemUuCisgICAgICogQHNlZSBTb2NrZXRPcHRpb25zI1NPX1JDVkJVRgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWNlaXZlQnVmZmVyU2l6ZShpbnQgc2l6ZSkKICAgICAgICAgICAgIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewpAQCAtNTcxLDE2ICs2MDQsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIFNPX0xJTkdFUiBvcHRpb24sIHdpdGggdGhlIHNwZWNpZmllZCB0aW1lLCBpbiBzZWNvbmRzLiBUaGUKLSAgICAgKiBTT19MSU5HRVIgb3B0aW9uIGlzIHNpbGVudGx5IGxpbWl0ZWQgdG8gNjU1MzUgc2Vjb25kcy4KKyAgICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fTElOR0VSfSB3aXRoIHRoZSBnaXZlbgorICAgICAqIHRpbWVvdXQgaW4gc2Vjb25kcy4gVGhlIHRpbWVvdXQgdmFsdWUgZm9yIHRoaXMgb3B0aW9uIGlzIHNpbGVudGx5IGxpbWl0ZWQKKyAgICAgKiB0byB0aGUgbWF4aW11bSBvZiB7QGNvZGUgNjU1MzV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvbgotICAgICAqICAgICAgICAgICAgaWYgbGluZ2VyIGlzIGVuYWJsZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0ZSB3aGV0aGVyIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgogICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgbGluZ2VyIHRpbWVvdXQgdmFsdWUsIGluIHNlY29uZHMKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaW5nZXIgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHNldHRpbmcgdGhlIG9wdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBvcHRpb24uCisgICAgICogQHNlZSBTb2NrZXRPcHRpb25zI1NPX0xJTkdFUgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNvTGluZ2VyKGJvb2xlYW4gb24sIGludCB0aW1lb3V0KSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRDcmVhdGUodHJ1ZSk7CkBAIC02MDQsMTUgKzYzOSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgcmVhZCB0aW1lb3V0IG9uIHRoaXMgc29ja2V0LiBUaGUgU09fVElNRU9VVCBvcHRpb24sIGlzIHNwZWNpZmllZAotICAgICAqIGluIG1pbGxpc2Vjb25kcy4gVGhlIHJlYWQgb3BlcmF0aW9uIHdpbGwgYmxvY2sgaW5kZWZpbml0ZWx5IGZvciBhIHplcm8KLSAgICAgKiB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSByZWFkaW5nIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGlzIHNvY2tldC4gVGhlIHJlYWQKKyAgICAgKiBvcGVyYXRpb24gd2lsbCBibG9jayBpbmRlZmluaXRlbHkgaWYgdGhpcyBvcHRpb24gdmFsdWUgaXMgc2V0IHRvIHtAY29kZQorICAgICAqIDB9LiBUaGUgdGltZW91dCBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGUgcmVhZCBvcGVyYXRpb24uIEEKKyAgICAgKiB7QGNvZGUgU29ja2V0VGltZW91dEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdGhpcyB0aW1lb3V0IGV4cGlyZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRpbWVvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZWFkIHRpbWVvdXQgdmFsdWUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWFkaW5nIHRpbWVvdXQgdmFsdWUgYXMgbnVtYmVyIGdyZWF0ZXIgdGhhbiB7QGNvZGUgMH0gb3IKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSAwfSBmb3IgYW4gaW5maW5pdGUgdGltZW91dC4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBzZXR0aW5nIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgb3B0aW9uLgorICAgICAqIEBzZWUgU29ja2V0T3B0aW9ucyNTT19USU1FT1VUCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNvVGltZW91dChpbnQgdGltZW91dCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtNjIzLDE0ICs2NjEsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGUgc29ja2V0IGlzIHRvIHVzZSBOYWdsZSdzIGFsZ29yaXRobS4gVGhlIFRDUF9OT0RFTEFZCi0gICAgICogb3B0aW9uIHNldHRpbmcuCisgICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIHtAY29kZSBTb2NrZXRPcHRpb25zLlRDUF9OT0RFTEFZfSBmb3IgdGhpcyBzb2NrZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9uCi0gICAgICogICAgICAgICAgICB0aGUgc29ja2V0IFRDUF9OT0RFTEFZIG9wdGlvbiBzZXR0aW5nCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RhdGUgd2hldGhlciB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIG9yIG5vdC4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBzZXR0aW5nIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgb3B0aW9uLgorICAgICAqIEBzZWUgU29ja2V0T3B0aW9ucyNUQ1BfTk9ERUxBWQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRjcE5vRGVsYXkoYm9vbGVhbiBvbikgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtNjQyLDE3ICs2ODAsMTYgQEAKICAgICAgKiB0aGVuIGNvbm5lY3RzIGl0IHRvIHRoZSBub21pbmF0ZWQgZGVzdGluYXRpb24gYWRkcmVzcy9wb3J0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkc3RBZGRyZXNzCi0gICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaG9zdCBhZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaG9zdCBhZGRyZXNzLgogICAgICAqIEBwYXJhbSBkc3RQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgZGVzdGluYXRpb24gaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb24gdGhlIGRlc3RpbmF0aW9uIGhvc3QuCiAgICAgICogQHBhcmFtIGxvY2FsQWRkcmVzcwotICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gYmluZAorICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gYmluZC4KICAgICAgKiBAcGFyYW0gbG9jYWxQb3J0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byBiaW5kCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byBiaW5kLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aHJvd24gaWYgYSBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBiaW5kIG9yIGNvbm5lY3QKLSAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb25zCisgICAgICogICAgICAgICAgICAgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGJpbmQgb3IgY29ubmVjdAorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbnMuCiAgICAgICovCiAgICAgdm9pZCBzdGFydHVwU29ja2V0KEluZXRBZGRyZXNzIGRzdEFkZHJlc3MsIGludCBkc3RQb3J0LAogICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWxBZGRyZXNzLCBpbnQgbG9jYWxQb3J0LCBib29sZWFuIHN0cmVhbWluZykKQEAgLTY4MiwxMCArNzE5LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICogUmV0dXJucyBhIHtAY29kZSBTdHJpbmd9IGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKICAgICAgKiBzb2NrZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC02OTYsMTIgKzczNCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNodXRkb3duIHRoZSBpbnB1dCBwb3J0aW9uIG9mIHRoZSBzb2NrZXQuCisgICAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhpcyBzb2NrZXQuIEFueSBmdXJ0aGVyIGRhdGEgc2VudCB0byB0aGlzCisgICAgICogc29ja2V0IHdpbGwgYmUgZGlzY2FyZGVkLiBSZWFkaW5nIGZyb20gdGhpcyBzb2NrZXQgYWZ0ZXIgdGhpcyBtZXRob2QgaGFzCisgICAgICogYmVlbiBjYWxsZWQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIHtAY29kZSBFT0Z9LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGUgc29ja2V0IGlucHV0CisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIHNvY2tldCBpbnB1dCBzdHJlYW0uCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBzdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2h1dGRvd25JbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0lucHV0U2h1dGRvd24oKSkgewpAQCAtNzEzLDEyICs3NTQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTaHV0ZG93biB0aGUgb3V0cHV0IHBvcnRpb24gb2YgdGhlIHNvY2tldC4KKyAgICAgKiBDbG9zZXMgdGhlIG91dHB1dCBzdHJlYW0gb2YgdGhpcyBzb2NrZXQuIEFsbCBidWZmZXJlZCBkYXRhIHdpbGwgYmUgc2VudAorICAgICAqIGZvbGxvd2VkIGJ5IHRoZSB0ZXJtaW5hdGlvbiBzZXF1ZW5jZS4gV3JpdGluZyB0byB0aGUgY2xvc2VkIG91dHB1dCBzdHJlYW0KKyAgICAgKiB3aWxsIGNhdXNlIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoZSBzb2NrZXQgb3V0cHV0CisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIHNvY2tldCBvdXRwdXQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bk91dHB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc091dHB1dFNodXRkb3duKCkpIHsKQEAgLTczMCwxMSArNzc0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uIE90aGVyd2lzZSBjcmVhdGUKLSAgICAgKiB0aGUgdW5kZXJseWluZyBTb2NrZXRJbXBsLgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgY2xvc2VkLCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gT3RoZXJ3aXNlCisgICAgICogY3JlYXRlcyB0aGUgdW5kZXJseWluZyBTb2NrZXRJbXBsLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY2hlY2tDbG9zZWRBbmRDcmVhdGUoYm9vbGVhbiBjcmVhdGUpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBpZiAoaXNDbG9zZWQoKSkgewpAQCAtNzcxLDEyICs4MTUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGxvY2FsIFNvY2tldEFkZHJlc3MgZm9yIHRoaXMgc29ja2V0LCBvciBudWxsIGlmIHRoZSBzb2NrZXQgaXMKLSAgICAgKiBub3QgYm91bmQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyB1c2VmdWwgb24gbXVsdGlob21lZCBob3N0cy4KKyAgICAgKiBHZXRzIHRoZSBsb2NhbCBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoaXMgc29ja2V0IGFzIGEgU29ja2V0QWRkcmVzcyBvcgorICAgICAqIHtAY29kZSBudWxsfSBpZiB0aGUgc29ja2V0IGlzIHVuYm91bmQuIFRoaXMgaXMgdXNlZnVsIG9uIG11bHRpaG9tZWQKKyAgICAgKiBob3N0cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBzb2NrZXQgYWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGJvdW5kIGxvY2FsIHNvY2tldCBhZGRyZXNzIGFuZCBwb3J0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldExvY2FsU29ja2V0QWRkcmVzcygpIHsKICAgICAgICAgaWYgKCFpc0JvdW5kKCkpIHsKQEAgLTc4NiwxMCArODMwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSByZW1vdGUgU29ja2V0QWRkcmVzcyBmb3IgdGhpcyBzb2NrZXQsIG9yIG51bGwgaWYgdGhlIHNvY2tldCBpcwotICAgICAqIG5vdCBjb25uZWN0ZWQuCisgICAgICogR2V0cyB0aGUgcmVtb3RlIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhpcyBzb2NrZXQgYXMgYSB7QGNvZGUKKyAgICAgKiBTb2NrZXRBZGRyZXNzfSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHNvY2tldCBpcyBub3QgY29ubmVjdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbW90ZSBzb2NrZXQgYWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIHJlbW90ZSBzb2NrZXQgYWRkcmVzcyBhbmQgcG9ydC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ja2V0QWRkcmVzcyBnZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkgewogICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKCkpIHsKQEAgLTc5OSw1MyArODQ0LDU3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGlmIHRoZSBzb2NrZXQgaXMgYm91bmQgdG8gYSBsb2NhbCBhZGRyZXNzIGFuZCBwb3J0LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHNvY2tldCBpcyBib3VuZCB0byBhIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc29ja2V0IGlzIGJvdW5kIHRvIGEgbG9jYWwgYWRkcmVzcywKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNvY2tldCBpcyBib3VuZCB0byBhIGxvY2FsIGFkZHJlc3MsIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0JvdW5kKCkgewogICAgICAgICByZXR1cm4gaXNCb3VuZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gaWYgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0byBhIHJlbW90ZSBob3N0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKICAgICAgICAgcmV0dXJuIGlzQ29ubmVjdGVkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzb2NrZXQgaXMgY2xvc2VkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKICAgICAgICAgcmV0dXJuIGlzQ2xvc2VkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJpbmQgdGhlIFNvY2tldCB0byB0aGUgbm9taW5hdGVkIGxvY2FsIGhvc3QvcG9ydC4KKyAgICAgKiBCaW5kcyB0aGlzIHNvY2tldCB0byB0aGUgZ2l2ZW4gbG9jYWwgaG9zdCBhZGRyZXNzIGFuZCBwb3J0IHNwZWNpZmllZCBieQorICAgICAqIHRoZSBTb2NrZXRBZGRyZXNzIHtAY29kZSBsb2NhbEFkZHJ9LiBJZiB7QGNvZGUgbG9jYWxBZGRyfSBpcyBzZXQgdG8KKyAgICAgKiB7QGNvZGUgbnVsbH0sIHRoaXMgc29ja2V0IHdpbGwgYmUgYm91bmQgdG8gYW4gYXZhaWxhYmxlIGxvY2FsIGFkZHJlc3Mgb24KKyAgICAgKiBhbnkgZnJlZSBwb3J0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbEFkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtYWNoaW5lIGFkZHJlc3MgYW5kIHBvcnQgdG8gYmluZCBvbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmljIGFkZHJlc3MgYW5kIHBvcnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gYmluZCB0by4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBTb2NrZXRBZGRyZXNzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gU29ja2V0QWRkcmVzcyBpcyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBib3VuZCwgb3IgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgYmluZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBib3VuZCBvciBhbiBlcnJvciBvY2N1cnMgd2hpbGUKKyAgICAgKiAgICAgICAgICAgICBiaW5kaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmQoU29ja2V0QWRkcmVzcyBsb2NhbEFkZHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwogICAgICAgICBpZiAoaXNCb3VuZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDMxNSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwb3J0ID0gMDsKICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLkFOWTsKICAgICAgICAgaWYgKGxvY2FsQWRkciAhPSBudWxsKSB7CkBAIC04NzMsMzcgKzkyMiw0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbm5lY3QgdGhlIFNvY2tldCB0byB0aGUgaG9zdC9wb3J0IHNwZWNpZmllZCBieSB0aGUgU29ja2V0QWRkcmVzcy4KKyAgICAgKiBDb25uZWN0cyB0aGlzIHNvY2tldCB0byB0aGUgZ2l2ZW4gcmVtb3RlIGhvc3QgYWRkcmVzcyBhbmQgcG9ydCBzcGVjaWZpZWQKKyAgICAgKiBieSB0aGUgU29ja2V0QWRkcmVzcyB7QGNvZGUgcmVtb3RlQWRkcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlbW90ZUFkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZW1vdGUgbWFjaGluZSBhZGRyZXNzIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG8KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIFNvY2tldEFkZHJlc3MgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBTb2NrZXRBZGRyZXNzIGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgb3IgYSBwcm9ibGVtIG9jY3VycwotICAgICAqICAgICAgICAgICAgIGR1cmluZyB0aGUgY29ubmVjdAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgICogICAgICAgICAgICAgY29ubmVjdGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY29ubmVjdChyZW1vdGVBZGRyLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25uZWN0IHRoZSBTb2NrZXQgdG8gdGhlIGhvc3QvcG9ydCBzcGVjaWZpZWQgYnkgdGhlIFNvY2tldEFkZHJlc3Mgd2l0aCBhCi0gICAgICogc3BlY2lmaWVkIHRpbWVvdXQuCisgICAgICogQ29ubmVjdHMgdGhpcyBzb2NrZXQgdG8gdGhlIGdpdmVuIHJlbW90ZSBob3N0IGFkZHJlc3MgYW5kIHBvcnQgc3BlY2lmaWVkCisgICAgICogYnkgdGhlIFNvY2tldEFkZHJlc3Mge0Bjb2RlIHJlbW90ZUFkZHJ9IHdpdGggdGhlIHNwZWNpZmllZCB0aW1lb3V0LiBUaGUKKyAgICAgKiBjb25uZWN0aW5nIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIG9yIGFuCisgICAgICogZXJyb3Igb2NjdXJyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlbW90ZUFkZHIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZW1vdGUgbWFjaGluZSBhZGRyZXNzIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCB0byBjb25uZWN0IHRvLgogICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgbWlsbGlzZWNvbmQgdGltZW91dCB2YWx1ZSwgdGhlIGNvbm5lY3Qgd2lsbCBibG9jawotICAgICAqICAgICAgICAgICAgaW5kZWZpbml0ZWx5IGZvciBhIHplcm8gdmFsdWUuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgb3Ige0Bjb2RlIDB9IGZvciBhbiBpbmZpbml0ZQorICAgICAqICAgICAgICAgICAgdGltZW91dC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0aW1lb3V0IGlzIG5lZ2F0aXZlLCBvciB0aGUgU29ja2V0QWRkcmVzcyBpcyBub3QKLSAgICAgKiAgICAgICAgICAgICBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gU29ja2V0QWRkcmVzcyBpcyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQgb3IgdGhlCisgICAgICogICAgICAgICAgICAgdGltZW91dCB2YWx1ZSBpcyBuZWdhdGl2ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgb3IgYSBwcm9ibGVtIG9jY3VycwotICAgICAqICAgICAgICAgICAgIGR1cmluZyB0aGUgY29ubmVjdAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgICogICAgICAgICAgICAgY29ubmVjdGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkciwgaW50IHRpbWVvdXQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtOTUyLDMzICsxMDA0LDM4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGlmIHtAbGluayAjc2h1dGRvd25JbnB1dH0gaGFzIGJlZW4gY2FsbGVkLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaW5jb21pbmcgY2hhbm5lbCBvZiB0aGUgc29ja2V0IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiBjbG9zZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5zaHV0ZG93bklucHV0PC9jb2RlPiBoYXMgYmVlbgotICAgICAqICAgICAgICAgY2FsbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHJlYWRpbmcgZnJvbSB0aGlzIHNvY2tldCBpcyBub3QgcG9zc2libGUgYW55bW9yZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRTaHV0ZG93bigpIHsKICAgICAgICAgcmV0dXJuIGlzSW5wdXRTaHV0ZG93bjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gaWYge0BsaW5rICNzaHV0ZG93bk91dHB1dH0gaGFzIGJlZW4gY2FsbGVkLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0Z29pbmcgY2hhbm5lbCBvZiB0aGUgc29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gCisgICAgICogY2xvc2VkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+c2h1dGRvd25PdXRwdXQ8L2NvZGU+IGhhcyBiZWVuCi0gICAgICogICAgICAgICBjYWxsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgd3JpdGluZyB0byB0aGlzIHNvY2tldCBpcyBub3QgcG9zc2libGUgYW55bW9yZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzT3V0cHV0U2h1dGRvd24oKSB7CiAgICAgICAgIHJldHVybiBpc091dHB1dFNodXRkb3duOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgU09fUkVVU0VBRERSIHNvY2tldCBvcHRpb24uCisgICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX1JFVVNFQUREUn0gZm9yIHRoaXMgc29ja2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSByZXVzZQotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBTT19SRVVTRUFERFIgb3B0aW9uIHNldHRpbmcKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0ZSB3aGV0aGVyIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgb3IgdGhlIG9wdGlvbiBpcyBpbnZhbGlkLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBvcHRpb24uCisgICAgICogQHNlZSBTb2NrZXRPcHRpb25zI1NPX1JFVVNFQUREUgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJldXNlQWRkcmVzcyhib29sZWFuIHJldXNlKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRDcmVhdGUodHJ1ZSk7CkBAIC05ODcsMTMgKzEwNDQsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBTT19SRVVTRUFERFIgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBHZXRzIHRoZSBzZXR0aW5nIG9mIHRoZSBzb2NrZXQgb3B0aW9uIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX1JFVVNFQUREUn0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgU09fUkVVU0VBRERSIGlzIGVuYWJsZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgU29ja2V0T3B0aW9ucy5TT19SRVVTRUFERFJ9IGlzCisgICAgICogICAgICAgICBlbmFibGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkIG9yIHRoZSBvcHRpb24gaXMgaW52YWxpZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBAc2VlIFNvY2tldE9wdGlvbnMjU09fUkVVU0VBRERSCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0UmV1c2VBZGRyZXNzKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKHRydWUpOwpAQCAtMTAwMiwxNCArMTA2MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgU09fT09CSU5MSU5FIHNvY2tldCBvcHRpb24uIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgb3V0IG9mCi0gICAgICogYmFuZCBkYXRhIGlzIHJlY2lldmVkIGluIHRoZSBub3JtYWwgZGF0YSBzdHJlYW0uCisgICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIHtAY29kZSBTb2NrZXRPcHRpb25zLlNPX09PQklOTElORX0gZm9yIHRoaXMgc29ja2V0LgorICAgICAqIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCB1cmdlbnQgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgaW4tbGluZSB3aXRoCisgICAgICogbm9ybWFsIGRhdGEuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9vYmlubGluZQotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBTT19PT0JJTkxJTkUgb3B0aW9uIHNldHRpbmcKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBvciBub3QuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBvciB0aGUgb3B0aW9uIGlzIGludmFsaWQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNldHRpbmcgdGhlIG9wdGlvbi4KKyAgICAgKiBAc2VlIFNvY2tldE9wdGlvbnMjU09fT09CSU5MSU5FCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T09CSW5saW5lKGJvb2xlYW4gb29iaW5saW5lKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRDcmVhdGUodHJ1ZSk7CkBAIC0xMDE4LDEzICsxMDc4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgU09fT09CSU5MSU5FIHNvY2tldCBvcHRpb24uCisgICAgICogR2V0cyB0aGUgc2V0dGluZyBvZiB0aGUgc29ja2V0IG9wdGlvbiB7QGNvZGUgU29ja2V0T3B0aW9ucy5TT19PT0JJTkxJTkV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIFNPX09PQklOTElORSBpcyBlbmFibGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIFNvY2tldE9wdGlvbnMuU09fT09CSU5MSU5FfSBpcworICAgICAqICAgICAgICAgZW5hYmxlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBvciB0aGUgb3B0aW9uIGlzIGludmFsaWQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgdGhlIHNvY2tldCBvcHRpb24uCisgICAgICogQHNlZSBTb2NrZXRPcHRpb25zI1NPX09PQklOTElORQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldE9PQklubGluZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTEwMzMsMTMgKzEwOTQsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIElQX1RPUyBzb2NrZXQgb3B0aW9uLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUgU29ja2V0T3B0aW9ucy5JUF9UT1N9IGZvciB0aGlzIHNvY2tldC4gU2VlCisgICAgICogdGhlIHNwZWNpZmljYXRpb24gUkZDIDEzNDkgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2Ygc2VydmljZQorICAgICAqIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBJUF9UT1Mgc2V0dGluZwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIHNldCBmb3IgdGhpcyBvcHRpb24gd2l0aCBhIHZhbGlkIHJhbmdlIG9mCisgICAgICogICAgICAgICAgICB7QGNvZGUgMC0yNTV9LgogICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgb3IgdGhlIG9wdGlvbiBpcyBpbnZhbGlkLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBvcHRpb24uCisgICAgICogQHNlZSBTb2NrZXRPcHRpb25zI0lQX1RPUworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRyYWZmaWNDbGFzcyhpbnQgdmFsdWUpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZEFuZENyZWF0ZSh0cnVlKTsKQEAgLTEwNTAsMTIgKzExMTUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIElQX1RPUyBzb2NrZXQgb3B0aW9uLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzb2NrZXQgb3B0aW9uIHtAY29kZSBTb2NrZXRPcHRpb25zLklQX1RPU30uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgSVBfVE9TIHNvY2tldCBvcHRpb24gdmFsdWUKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB3aGljaCByZXByZXNlbnRzIHRoZSB0eXBlIG9mIHNlcnZpY2UuCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW9uIGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBAc2VlIFNvY2tldE9wdGlvbnMjSVBfVE9TCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUcmFmZmljQ2xhc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDbG9zZWRBbmRDcmVhdGUodHJ1ZSk7CkBAIC0xMDYzLDEzICsxMTI5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VuZCB0aGUgc2luZ2xlIGJ5dGUgb2YgdXJnZW50IGRhdGEgb24gdGhlIHNvY2tldC4KKyAgICAgKiBTZW5kcyB0aGUgZ2l2ZW4gc2luZ2xlIGJ5dGUgZGF0YSB3aGljaCBpcyByZXByZXNlbnRlZCBieSB0aGUgbG93ZXN0IG9jdGV0CisgICAgICogb2Yge0Bjb2RlIHZhbHVlfSBhcyAiVENQIHVyZ2VudCBkYXRhIi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIG9mIHVyZ2VudCBkYXRhCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHNlbmRpbmcgdXJnZW50IGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIG9mIHVyZ2VudCBkYXRhIHRvIGJlIHNlbnQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZW5kaW5nIHVyZ2VudCBkYXRhLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNlbmRVcmdlbnREYXRhKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpbXBsLnN1cHBvcnRzVXJnZW50RGF0YSgpKSB7CkBAIC0xMDc5LDcgKzExNDYsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgZm9yIGEgU29ja2V0IGNyZWF0ZWQgYnkgU2VydmVyU29ja2V0LmFjY2VwdCgpLgorICAgICAqIFNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgZm9yIGEgc29ja2V0IGNyZWF0ZWQgYnkge0Bjb2RlCisgICAgICogU2VydmVyU29ja2V0LmFjY2VwdCgpfS4KICAgICAgKiAKICAgICAgKiBAc2VlIFNlcnZlclNvY2tldCNpbXBsQWNjZXB0CiAgICAgICovCkBAIC0xMDk0LDI4ICsxMTYyLDM0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogaWYgU29ja2V0IGlzIGNyZWF0ZWQgYnkgYSBTb2NrZXRDaGFubmVsLCByZXR1cm5zIHRoZSByZWxhdGVkCi0gICAgICogU29ja2V0Q2hhbm5lbAorICAgICAqIEdldHMgdGhlIFNvY2tldENoYW5uZWwgb2YgdGhpcyBzb2NrZXQsIGlmIG9uZSBpcyBhdmFpbGFibGUuIFRoZSBjdXJyZW50CisgICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyBhbHdheXMge0Bjb2RlIG51bGx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbGF0ZWQgU29ja2V0Q2hhbm5lbAorICAgICAqIEByZXR1cm4gdGhlIHJlbGF0ZWQgU29ja2V0Q2hhbm5lbCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gY2hhbm5lbCBleGlzdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldENoYW5uZWwgZ2V0Q2hhbm5lbCgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2V0cyBwZXJmb3JtYW5jZSBwcmVmZXJlbmNlIGZvciBjb25uZWN0aW9uVGltZSxsYXRlbmN5IGFuZCBiYW5kd2lkdGgKKyAgICAgKiBTZXRzIHBlcmZvcm1hbmNlIHByZWZlcmVuY2VzIGZvciBjb25uZWN0aW9uVGltZSwgbGF0ZW5jeSBhbmQgYmFuZHdpZHRoLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgY3VycmVudGx5IG5vdGhpbmcuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb25uZWN0aW9uVGltZQotICAgICAqICAgICAgICAgICAgdGhlIGltcG9ydGFuY2Ugb2YgY29ubmVjdCB0aW1lCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBpbXBvcnRhbmNlIG9mIGEgc2hvcnQgY29ubmVjdGluZworICAgICAqICAgICAgICAgICAgdGltZS4KICAgICAgKiBAcGFyYW0gbGF0ZW5jeQotICAgICAqICAgICAgICAgICAgdGhlIGltcG9ydGFuY2Ugb2YgbGF0ZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgaW1wb3J0YW5jZSBvZiBsb3cgbGF0ZW5jeS4KICAgICAgKiBAcGFyYW0gYmFuZHdpZHRoCi0gICAgICogICAgICAgICAgICB0aGUgaW1wb3J0YW5jZSBvZiBiYW5kd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydGFuY2Ugb2YgaGlnaCBiYW5kd2lkdGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlcyhpbnQgY29ubmVjdGlvblRpbWUsIGludCBsYXRlbmN5LAogICAgICAgICAgICAgaW50IGJhbmR3aWR0aCkgewotICAgICAgICAvLyBPdXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9ubHkgcHJvdmlkZXMgb25lIHByb3RvY29sOiBUQ1AvSVAsIHNvCisgICAgICAgIC8vIE91ciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb25seSBwcm92aWRlIG9uZSBwcm90b2NvbDogVENQL0lQLCBzbwogICAgICAgICAvLyB3ZSBkbyBub3RoaW5nIGZvciB0aGlzIG1ldGhvZAogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRBZGRyZXNzLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0QWRkcmVzcy5qYXZhCmluZGV4IDVkN2I1MmIuLjc1NmI1ZmQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRBZGRyZXNzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEFkZHJlc3MuamF2YQpAQCAtMTksOCArMTksMjAgQEAKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCisvKioKKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50cyBhIHByb3RvY29sLWluZGVwZW5kZW50IGJhc2UgZm9yCisgKiBzb2NrZXQtZW5kcG9pbnQgcmVwcmVzZW50aW5nIGNsYXNzZXMuIFRoZSBjbGFzcyBoYXMgdG8gYmUgaW1wbGVtZW50ZWQKKyAqIGFjY29yZGluZyB0byBhIHNwZWNpZmljIHByb3RvY29sLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNvY2tldEFkZHJlc3MgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU29ja2V0QWRkcmVzc30gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFNvY2tldEFkZHJlc3MoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEV4Y2VwdGlvbi5qYXZhCmluZGV4IDkyYjlhNDUuLmI5YjNhMTQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uLmphdmEKQEAgLTIwLDI2ICsyMCwzMiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogVGhpcyBTb2NrZXRFeGNlcHRpb24gbWF5IGJlIHRocm93biBkdXJpbmcgc29ja2V0IGNyZWF0aW9uIG9yIHNldHRpbmcgb3B0aW9ucywKLSAqIGFuZCBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgb3RoZXIgc29ja2V0IHJlbGF0ZWQgZXhjZXB0aW9ucy4KKyAqIFRoaXMge0Bjb2RlIFNvY2tldEV4Y2VwdGlvbn0gbWF5IGJlIHRocm93biBkdXJpbmcgc29ja2V0IGNyZWF0aW9uIG9yIHNldHRpbmcKKyAqIG9wdGlvbnMsIGFuZCBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgb3RoZXIgc29ja2V0IHJlbGF0ZWQgZXhjZXB0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTb2NrZXRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTkzNTg3NDMwMzU1Njg4NjkzNEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNvY2tldEV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCBpdHMgd2Fsa2JhY2sKKyAgICAgKiBmaWxsZWQgaW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU29ja2V0RXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIGl0cyB3YWxrYmFjayBhbmQKKyAgICAgKiBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ja2V0RXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEltcGwuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRJbXBsLmphdmEKaW5kZXggMzc0MGM2My4uZjAxMWU2MyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEltcGwuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0SW1wbC5qYXZhCkBAIC0yOCwyMTEgKzI4LDI0NiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGFsbCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHN0cmVhbWluZyBzb2NrZXRzLgotICogCi0gKiBTdHJlYW1pbmcgc29ja2V0cyBhcmUgd3JhcHBlZCBieSB0d28gY2xhc3NlcywgU2VydmVyU29ja2V0IGFuZCBTb2NrZXQgYXQgdGhlCi0gKiBzZXJ2ZXIgYW5kIGNsaWVudCBlbmQgb2YgYSBjb25uZWN0aW9uIHJlc3BlY3RpdmVseS4gQXQgdGhlIHNlcnZlciB0aGVyZSBhcmUKLSAqIHR3byB0eXBlcyBvZiBzb2NrZXRzIGVuZ2FnZWQgaW4gY29tbXVuaWNhdGlvbiwgdGhlIDxjb2RlPlNlcnZlclNvY2tldDwvY29kZT4KLSAqIG9uIGEgd2VsbCBrbm93biBwb3J0IChoZXJlYWZ0ZXIgcmVmZXJlZCB0byBhcyB0aGUgbGlzdGVuZXIpIHVzZWQgdG8gZXN0YWJsaXNoCi0gKiBhIGNvbm5lY3Rpb24gYW5kIHRoZSByZXN1bHRpbmcgPGNvZGU+U29ja2V0PC9jb2RlPiAoaGVyZWFmdGVyIHJlZmVyZWQgdG8gYXMKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2Ugb2YgYWxsIHN0cmVhbWluZyBzb2NrZXQgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4KKyAqIFN0cmVhbWluZyBzb2NrZXRzIGFyZSB3cmFwcGVkIGJ5IHR3byBjbGFzc2VzLCB7QGNvZGUgU2VydmVyU29ja2V0fSBhbmQKKyAqIHtAY29kZSBTb2NrZXR9IGF0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBlbmQgb2YgYSBjb25uZWN0aW9uLiBBdCB0aGUgc2VydmVyLAorICogdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBzb2NrZXRzIGVuZ2FnZWQgaW4gY29tbXVuaWNhdGlvbiwgdGhlIHtAY29kZQorICogU2VydmVyU29ja2V0fSBvbiBhIHdlbGwga25vd24gcG9ydCAocmVmZXJyZWQgdG8gYXMgbGlzdGVuZXIpIHVzZWQgdG8KKyAqIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gYW5kIHRoZSByZXN1bHRpbmcge0Bjb2RlIFNvY2tldH0gKHJlZmVycmVkIHRvIGFzCiAgKiBob3N0KS4KICAqIAotICogU29tZSBvZiB0aGUgPGNvZGU+U29ja2V0SW1wbDwvY29kZT4gaW5zdGFuY2UgdmFyaWFibGUgdmFsdWVzIG11c3QgYmUKLSAqIGludGVycHJldGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSB3cmFwcGVyLiBTZWUgdGhlIGdldHRlciBtZXRob2RzIGZvciB0aGVzZQotICogZGV0YWlscy4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ja2V0SW1wbCBpbXBsZW1lbnRzIFNvY2tldE9wdGlvbnMgewogCisgICAgLyoqCisgICAgICogVGhlIHJlbW90ZSBhZGRyZXNzIHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0by4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW5ldEFkZHJlc3MgYWRkcmVzczsKIAorICAgIC8qKgorICAgICAqIFRoZSByZW1vdGUgcG9ydCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBwb3J0OwogCisgICAgLyoqCisgICAgICogVGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGlzIHNvY2tldC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgRmlsZURlc2NyaXB0b3IgZmQ7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYWwgcG9ydCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBsb2NhbHBvcnQ7CiAKICAgICBJTmV0d29ya1N5c3RlbSBuZXRJbXBsOwotICAgIAotICAgIHByb3RlY3RlZCBpbnQgcmVjZWl2ZVRpbWVvdXQ7Ci0gICAgCisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyBpbnQgcmVjZWl2ZVRpbWVvdXQ7CisgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorCiAgICAgYm9vbGVhbiBzdHJlYW1pbmcgPSB0cnVlOwogCiAgICAgYm9vbGVhbiBzaHV0ZG93bklucHV0OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgY29ubmVjdGlvbi1vcmllbnRlZCBTb2NrZXRJbXBsLgorICAgICAqIENyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbi1vcmllbnRlZCBzb2NrZXQgaW1wbGVtZW50YXRpb24uCiAgICAgICogCiAgICAgICogQHNlZSBTb2NrZXRJbXBsRmFjdG9yeQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXRJbXBsKCkgewogICAgICAgICB0aGlzLm5ldEltcGwgPSBQbGF0Zm9ybS5nZXROZXR3b3JrU3lzdGVtKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWNjZXB0cyBhIGNvbm5lY3Rpb24gb24gdGhlIHByb3ZpZGVkIHNvY2tldC4KKyAgICAgKiBXYWl0cyBmb3IgYW4gaW5jb21pbmcgcmVxdWVzdCBhbmQgYmxvY2tzIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZAorICAgICAqIG9uIHRoZSBnaXZlbiBzb2NrZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld1NvY2tldAotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCB0byBhY2NlcHQgY29ubmVjdGlvbnMgb24KLSAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhY2NlcHRpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgdG8gYWNjZXB0IGNvbm5lY3Rpb25zIG9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYWNjZXB0aW5nIGEgbmV3IGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWNjZXB0KFNvY2tldEltcGwgbmV3U29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1heSBiZSByZWFkIGZyb20gdGhpcyBzb2NrZXQgd2l0aG91dAotICAgICAqIGJsb2NraW5nLiBUaGlzIGNhbGwgZG9lcyBub3QgYmxvY2suCisgICAgICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIG51bWJlciBvZiBieXRlcyB3aGljaCBhcmUgcmVhZGFibGUgZnJvbSB0aGlzIHNvY2tldAorICAgICAqIHdpdGhvdXQgYmxvY2tpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcKLSAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZWVraW5nCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgdGhlIG51bWJlciBvZiBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEJpbmRzIHRoaXMgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYWwgaG9zdC9wb3J0LgorICAgICAqIEJpbmRzIHRoaXMgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYWwgaG9zdCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcmVzcwotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG1hY2hpbmUgYWRkcmVzcyB0byBiaW5kIHRoZSBzb2NrZXQgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtYWNoaW5lIGFkZHJlc3MgdG8gYmluZCB0aGlzIHNvY2tldCB0by4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gYmluZCB0aGUgc29ja2V0IHRvCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBiaW5kaW5nCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byBiaW5kIHRoaXMgc29ja2V0IHRvLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYmluZGluZyB0aGlzIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBiaW5kKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIHNvY2tldC4gVXNhZ2UgdGhlcmVhZnRlciBpcyBpbnZhbGlkLgorICAgICAqIENsb3NlcyB0aGlzIHNvY2tldC4gVGhpcyBtYWtlcyBsYXRlciBhY2Nlc3MgaW52YWxpZC4KICAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhpcyBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDb25uZWN0cyB0aGlzIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBob3N0L3BvcnQuCisgICAgICogQ29ubmVjdHMgdGhpcyBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgaG9zdCBhbmQgcG9ydCBudW1iZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSByZW1vdGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICogICAgICAgICAgICB0aGUgcmVtb3RlIGhvc3QgdGhpcyBzb2NrZXQgaGFzIHRvIGJlIGNvbm5lY3RlZCB0by4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBwb3J0IHRvIGNvbm5lY3QgdG8KLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbm5lY3RpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW1vdGUgcG9ydCBvbiB3aGljaCB0aGlzIHNvY2tldCBoYXMgdG8gYmUgY29ubmVjdGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29ubmVjdGluZyB0byB0aGUgcmVtb3RlIGhvc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENvbm5lY3RzIHRoaXMgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGhvc3QgYWRkcmVzcy9wb3J0LgorICAgICAqIENvbm5lY3RzIHRoaXMgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGhvc3QgYWRkcmVzcyBhbmQgcG9ydAorICAgICAqIG51bWJlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcmVzcwotICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBob3N0IGFkZHJlc3MgdG8gY29ubmVjdCB0bworICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBob3N0IGFkZHJlc3MgdGhpcyBzb2NrZXQgaGFzIHRvIGJlIGNvbm5lY3RlZCB0by4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBwb3J0IHRvIGNvbm5lY3QgdG8KLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbm5lY3RpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW1vdGUgcG9ydCBvbiB3aGljaCB0aGlzIHNvY2tldCBoYXMgdG8gYmUgY29ubmVjdGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29ubmVjdGluZyB0byB0aGUgcmVtb3RlIGhvc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29ubmVjdChJbmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0LiBJZiBzdHJlYW1pbmcgaXMgdHJ1ZSwgY3JlYXRlIGEgc3RyZWFtCi0gICAgICogc29ja2V0LCBlbHNlIGEgZGF0YWdyYW0gc29ja2V0LgorICAgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0LiBUaGUgYXJndW1lbnQge0Bjb2RlIGlzU3RyZWFtaW5nfQorICAgICAqIGRlZmluZXMgd2hldGhlciB0aGUgbmV3IHNvY2tldCBpcyBhIHN0cmVhbWluZyBvciBhIGRhdGFncmFtIHNvY2tldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaXNTdHJlYW1pbmcKLSAgICAgKiAgICAgICAgICAgIHRydWUsIGlmIHRoZSBzb2NrZXQgaXMgdHlwZSBzdHJlYW1pbmcKLSAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgc29ja2V0CisgICAgICogICAgICAgICAgICBkZWZpbmVzIHdoZXRoZXIgdGhlIHR5cGUgb2YgdGhlIG5ldyBzb2NrZXQgaXMgc3RyZWFtaW5nIG9yCisgICAgICogICAgICAgICAgICBkYXRhZ3JhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlKGJvb2xlYW4gaXNTdHJlYW1pbmcpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgc29ja2V0J3MgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqIEdldHMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGlzIHNvY2tldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEZpbGVEZXNjcmlwdG9yIHRoZSBzb2NrZXQgRmlsZURlc2NyaXB0b3IKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhpcyBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEZpbGVEZXNjcmlwdG9yIGdldEZpbGVEZXNjcmlwdG9yKCkgewogICAgICAgICByZXR1cm4gZmQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBzb2NrZXQncyBhZGRyZXNzLiBSZWZlcmluZyB0byB0aGUgY2xhc3MgY29tbWVudDogTGlzdGVuZXI6IFRoZQotICAgICAqIGxvY2FsIG1hY2hpbmVzIElQIGFkZHJlc3MgdG8gd2hpY2ggdGhpcyBzb2NrZXQgaXMgYm91bmQuIEhvc3Q6IFRoZSBjbGllbnQKLSAgICAgKiBtYWNoaW5lLCB0byB3aGljaCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQuIENsaWVudDogVGhlIGhvc3QgbWFjaGluZSwgdG8KLSAgICAgKiB3aGljaCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQuCisgICAgICogR2V0cyB0aGUgcmVtb3RlIGFkZHJlc3MgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gSW5ldEFkZHJlc3MgdGhlIHNvY2tldCBhZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgcmVtb3RlIGFkZHJlc3Mgb2YgdGhpcyBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEluZXRBZGRyZXNzIGdldEluZXRBZGRyZXNzKCkgewogICAgICAgICByZXR1cm4gYWRkcmVzczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIHNvY2tldCBpbnB1dCBzdHJlYW0uCisgICAgICogR2V0cyB0aGUgaW5wdXQgc3RyZWFtIG9mIHRoaXMgc29ja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gSW5wdXRTdHJlYW0gYW4gSW5wdXRTdHJlYW0gb24gdGhlIHNvY2tldAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgc3RyZWFtCisgICAgICogQHJldHVybiB0aGUgaW5wdXQgc3RyZWFtIG9mIHRoaXMgc29ja2V0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBzb2NrZXQncyBsb2NhbHBvcnQuIFRoZSBmaWVsZCBpcyBpbml0aWFsaXplZCB0byAtMSBhbmQgdXBvbgotICAgICAqIGRlbWFuZCB3aWxsIGdvIHRvIHRoZSBJUCBzdGFjayB0byBnZXQgdGhlIGJvdW5kIHZhbHVlLiBTZWUgdGhlIGNsYXNzCi0gICAgICogY29tbWVudCBmb3IgdGhlIGNvbnRleHQgb2YgdGhlIGxvY2FsIHBvcnQuCisgICAgICogR2V0cyB0aGUgbG9jYWwgcG9ydCBudW1iZXIgb2YgdGhpcyBzb2NrZXQuIFRoZSBmaWVsZCBpcyBpbml0aWFsaXplZCB0bworICAgICAqIHtAY29kZSAtMX0gYW5kIHVwb24gZGVtYW5kIHdpbGwgZ28gdG8gdGhlIElQIHN0YWNrIHRvIGdldCB0aGUgYm91bmQKKyAgICAgKiB2YWx1ZS4gU2VlIHRoZSBjbGFzcyBjb21tZW50IGZvciB0aGUgY29udGV4dCBvZiB0aGUgbG9jYWwgcG9ydC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgc29ja2V0IGxvY2FscG9ydAorICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgbnVtYmVyIHRoaXMgc29ja2V0IGlzIGJvdW5kIHRvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotCiAgICAgcHJvdGVjdGVkIGludCBnZXRMb2NhbFBvcnQoKSB7CiAgICAgICAgIHJldHVybiBsb2NhbHBvcnQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBub21pbmF0ZWQgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc29ja2V0IG9wdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3B0SUQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgb3B0aW9uIHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiBPYmplY3QgdGhlIG9wdGlvbiB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgdGhlIG9wdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBvcHRpb24gdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybiB0aGUgb3B0aW9uIHZhbHVlLgorICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3B0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0T3B0aW9uKGludCBvcHRJRCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgc29ja2V0IG91dHB1dCBzdHJlYW0uCisgICAgICogR2V0cyB0aGUgb3V0cHV0IHN0cmVhbSBvZiB0aGlzIHNvY2tldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE91dHB1dFN0cmVhbSBhbiBPdXRwdXRTdHJlYW0gb24gdGhlIHNvY2tldAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgc3RyZWFtCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0IHN0cmVhbSBvZiB0aGlzIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgc29ja2V0J3MgcmVtb3RlIHBvcnQuIFRoaXMgdmFsdWUgaXMgbm90IG1lYW5pbmdmdWwgd2hlbiB0aGUKLSAgICAgKiBzb2NrZXRJbXBsIGlzIHdyYXBwZWQgYnkgYSBTZXJ2ZXJTb2NrZXQuCisgICAgICogR2V0cyB0aGUgcmVtb3RlIHBvcnQgbnVtYmVyIG9mIHRoaXMgc29ja2V0LiBUaGlzIHZhbHVlIGlzIG5vdCBtZWFuaW5nZnVsCisgICAgICogd2hlbiB0aGlzIGluc3RhbmNlIGlzIHdyYXBwZWQgYnkgYSB7QGNvZGUgU2VydmVyU29ja2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgcmVtb3RlIHBvcnQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICAgKiBAcmV0dXJuIHRoZSByZW1vdGUgcG9ydCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBnZXRQb3J0KCkgewogICAgICAgICByZXR1cm4gcG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMaXN0ZW4gZm9yIGNvbm5lY3Rpb24gcmVxdWVzdHMgb24gdGhpcyBzdHJlYW0gc29ja2V0LiBJbmNvbWluZyBjb25uZWN0aW9uCi0gICAgICogcmVxdWVzdHMgYXJlIHF1ZXVlZCwgdXAgdG8gdGhlIGxpbWl0IG5vbWluYXRlZCBieSBiYWNrbG9nLiBBZGRpdGlvbmFsCi0gICAgICogcmVxdWVzdHMgYXJlIHJlamVjdGVkLiBsaXN0ZW4oKSBtYXkgb25seSBiZSBpbnZva2VkIG9uIHN0cmVhbSBzb2NrZXRzLgorICAgICAqIExpc3RlbnMgZm9yIGNvbm5lY3Rpb24gcmVxdWVzdHMgb24gdGhpcyBzdHJlYW1pbmcgc29ja2V0LiBJbmNvbWluZworICAgICAqIGNvbm5lY3Rpb24gcmVxdWVzdHMgYXJlIHF1ZXVlZCB1cCB0byB0aGUgbGltaXQgc3BlY2lmaWVkIGJ5IHtAY29kZQorICAgICAqIGJhY2tsb2d9LiBBZGRpdGlvbmFsIHJlcXVlc3RzIGFyZSByZWplY3RlZC4gVGhlIG1ldGhvZCB7QGNvZGUgbGlzdGVuKCl9CisgICAgICogbWF5IG9ubHkgYmUgaW52b2tlZCBvbiBzdHJlYW1pbmcgc29ja2V0cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYmFja2xvZwotICAgICAqICAgICAgICAgICAgdGhlIG1heCBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgY29ubmVjdGlvbiByZXF1ZXN0cwotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGxpc3RlbmluZworICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsaXN0ZW5pbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdGVuKGludCBiYWNrbG9nKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBJbiB0aGUgSVAgc3RhY2ssIHJlYWQgYXQgbW9zdCA8Y29kZT5jb3VudDwvY29kZT4gYnl0ZXMgb2ZmIHRoZSBzb2NrZXQKLSAgICAgKiBpbnRvIHRoZSA8Y29kZT5idWZmZXI8L2NvZGU+LCBhdCB0aGUgPGNvZGU+b2Zmc2V0PC9jb2RlPi4gSWYgdGhlCi0gICAgICogdGltZW91dCBpcyB6ZXJvLCBibG9jayBpbmRlZmluaXRlbHkgd2FpdGluZyBmb3IgZGF0YSwgb3RoZXJ3aXNlIHdhaXQgdGhlCisgICAgICogSW4gdGhlIElQIHN0YWNrLCByZWFkIGF0IG1vc3Qge0Bjb2RlIGNvdW50fSBieXRlcyBvZmYgdGhlIHNvY2tldAorICAgICAqIGludG8gdGhlIHtAY29kZSBidWZmZXJ9LCBhdCB0aGUge0Bjb2RlIG9mZnNldH0uIElmIHRoZSB0aW1lb3V0CisgICAgICogaXMgemVybywgYmxvY2sgaW5kZWZpbml0ZWx5IHdhaXRpbmcgZm9yIGRhdGEsIG90aGVyd2lzZSB3YWl0IHRoZQogICAgICAqIHNwZWNpZmllZCBwZXJpb2QgKGluIG1pbGxpc2Vjb25kcykuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgpAQCAtMjUwLDYgKzI4NSw5IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgICAgIGludCByZWNlaXZlVGltZW91dCA9IChJbnRlZ2VyKWdldE9wdGlvbihTb2NrZXRPcHRpb25zLlNPX1RJTUVPVVQpOworICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgICAgIGludCByZWFkID0gdGhpcy5uZXRJbXBsLnJlY2VpdmVTdHJlYW0oZmQsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZVRpbWVvdXQpOwogICAgICAgICAgICAgaWYgKHJlYWQgPT0gLTEpIHsKQEAgLTI2MiwyMyArMzAwLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBub21pbmF0ZWQgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBzb2NrZXQgb3B0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcHRJRAotICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBvcHRpb24gdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgc29ja2V0IG9wdGlvbiB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdGhlIG9wdGlvbiB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gU29ja2V0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBvcHRpb24gdmFsdWUuCisgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgb3B0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9wdGlvbihpbnQgb3B0SUQsIE9iamVjdCB2YWwpCi0gICAgICAgICAgICB0aHJvd3MgU29ja2V0RXhjZXB0aW9uOyAgICAKLSAgICAgCisgICAgICAgICAgICB0aHJvd3MgU29ja2V0RXhjZXB0aW9uOworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgICogc29ja2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBkZXNjcmlwdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgQE92ZXJyaWRlCkBAIC0yODksOCArMzI5LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbiB0aGUgSVAgc3RhY2ssIHdyaXRlIGF0IG1vc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGJ5dGVzIG9uIHRoZSBzb2NrZXQKLSAgICAgKiBmcm9tIHRoZSA8Y29kZT5idWZmZXI8L2NvZGU+LCBmcm9tIHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+LgorICAgICAqIEluIHRoZSBJUCBzdGFjaywgd3JpdGUgYXQgbW9zdCB7QGNvZGUgY291bnR9IGJ5dGVzIG9uIHRoZSBzb2NrZXQKKyAgICAgKiBmcm9tIHRoZSB7QGNvZGUgYnVmZmVyfSwgZnJvbSB0aGUge0Bjb2RlIG9mZnNldH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgogICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byByZWFkIGludG8KQEAgLTMwNCwyMCArMzQ0LDI1IEBACiAgICAgICovCiAgICAgaW50IHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFzdHJlYW1pbmcpIHsKLSAgICAgICAgICAgIHRoaXMubmV0SW1wbAorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciBoYXJtb255IHZlcnNpb24KKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5ldEltcGwKICAgICAgICAgICAgICAgICAgICAgLnNlbmREYXRhZ3JhbTIoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCwgcG9ydCwgYWRkcmVzcyk7CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRoaXMubmV0SW1wbC5zZW5kU3RyZWFtKGZkLCBidWZmZXIsIG9mZnNldCwgY291bnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNodXRkb3duIHRoZSBpbnB1dCBwb3J0aW9uIG9mIHRoZSBzb2NrZXQuCisgICAgICogQ2xvc2VzIHRoZSBpbnB1dCBjaGFubmVsIG9mIHRoaXMgc29ja2V0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIGFuIHtAbGluayBJT0V4Y2VwdGlvbn0gdG8KKyAgICAgKiBpbmRpY2F0ZSB0aGF0IHRoZSBzdWJjbGFzcyBzaG91bGQgaGF2ZSBvdmVycmlkZGVuIHRoaXMgbWV0aG9kLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIGFuIHtAbGluayBJT0V4Y2VwdGlvbn0KLSAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzdWJjbGFzcyBzaG91bGQgaGF2ZSBvdmVycmlkZGVuIHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBBbHdheXMuICBEZXNpZ25lZCB0byBiZSBzdWJjbGFzc2VkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBhbHdheXMgYmVjYXVzZSB0aGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bklucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gS0EwMjU9TWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZApAQCAtMzI1LDEzICszNzAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTaHV0ZG93biB0aGUgb3V0cHV0IHBvcnRpb24gb2YgdGhlIHNvY2tldC4KKyAgICAgKiBDbG9zZXMgdGhlIG91dHB1dCBjaGFubmVsIG9mIHRoaXMgc29ja2V0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIGFuIHtAbGluayBJT0V4Y2VwdGlvbn0gdG8KKyAgICAgKiBpbmRpY2F0ZSB0aGF0IHRoZSBzdWJjbGFzcyBzaG91bGQgaGF2ZSBvdmVycmlkZGVuIHRoaXMgbWV0aG9kLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIGFuIHtAbGluayBJT0V4Y2VwdGlvbn0KLSAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzdWJjbGFzcyBzaG91bGQgaGF2ZSBvdmVycmlkZGVuIHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBBbHdheXMuICBEZXNpZ25lZCB0byBiZSBzdWJjbGFzc2VkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBhbHdheXMgYmVjYXVzZSB0aGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bk91dHB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEtBMDI1PU1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKQEAgLTMzOSw1MiArMzg2LDU0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29ubmVjdCB0aGUgc29ja2V0IHRvIHRoZSBob3N0L3BvcnQgc3BlY2lmaWVkIGJ5IHRoZSBTb2NrZXRBZGRyZXNzIHdpdGggYQotICAgICAqIHNwZWNpZmllZCB0aW1lb3V0LgorICAgICAqIENvbm5lY3RzIHRoaXMgc29ja2V0IHRvIHRoZSByZW1vdGUgaG9zdCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlciBzcGVjaWZpZWQKKyAgICAgKiBieSB0aGUge0Bjb2RlIFNvY2tldEFkZHJlc3N9IG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lb3V0LiBUaGlzIG1ldGhvZAorICAgICAqIHdpbGwgYmxvY2sgaW5kZWZpbml0ZWx5IGlmIHRoZSB0aW1lb3V0IGlzIHNldCB0byB6ZXJvLgogICAgICAqIAogICAgICAqIEBwYXJhbSByZW1vdGVBZGRyCi0gICAgICogICAgICAgICAgICB0aGUgcmVtb3RlIG1hY2hpbmUgYWRkcmVzcyBhbmQgcG9ydCB0byBjb25uZWN0IHRvCisgICAgICogICAgICAgICAgICB0aGUgcmVtb3RlIGhvc3QgYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gY29ubmVjdCB0by4KICAgICAgKiBAcGFyYW0gdGltZW91dAotICAgICAqICAgICAgICAgICAgdGhlIG1pbGxpc2Vjb25kIHRpbWVvdXQgdmFsdWUsIHRoZSBjb25uZWN0IHdpbGwgYmxvY2sKLSAgICAgKiAgICAgICAgICAgIGluZGVmaW5pdGVseSBmb3IgYSB6ZXJvIHZhbHVlLgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyB0aGUgY29ubmVjdAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29ubmVjdGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkciwgaW50IHRpbWVvdXQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgaWYgdGhlIHNvY2tldCBzdXBwb3J0cyB1cmdlbnQgZGF0YS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKLSAgICAgKiB0aGlzIG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNvY2tldCBzdXBwb3J0cyB1cmdlbnQgZGF0YSBvciBub3QuIFN1YmNsYXNzZXMgc2hvdWxkCisgICAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiBmYWxzZSwgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCisgICAgICogQHJldHVybiB7QGNvZGUgZmFsc2V9IGJlY2F1c2Ugc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzVXJnZW50RGF0YSgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHNpbmdsZSBieXRlIG9mIHVyZ2VudCBkYXRhIG9uIHRoZSBzb2NrZXQuCisgICAgICogU2VuZHMgdGhlIHNpbmdsZSBieXRlIG9mIHVyZ2VudCBkYXRhIG9uIHRoZSBzb2NrZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBvZiB1cmdlbnQgZGF0YQotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycyBzZW5kaW5nIHVyZ2VudCBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBvZiB1cmdlbnQgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHNlbmRpbmcgdXJnZW50IGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2VuZFVyZ2VudERhdGEoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHBlcmZvcm1hbmNlIHByZWZlcmVuY2UgZm9yIGNvbm5lY3Rpb25UaW1lLCBsYXRlbmN5IGFuZCBiYW5kd2lkdGguCisgICAgICogU2V0cyBwZXJmb3JtYW5jZSBwcmVmZXJlbmNlIGZvciBjb25uZWN0aW9uIHRpbWUsIGxhdGVuY3kgYW5kIGJhbmR3aWR0aC4KICAgICAgKiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29ubmVjdGlvblRpbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbXBvcnRhbmNlIG9mIGNvbm5lY3QgdGltZQorICAgICAqICAgICAgICAgICAgdGhlIGltcG9ydGFuY2Ugb2YgY29ubmVjdCB0aW1lLgogICAgICAqIEBwYXJhbSBsYXRlbmN5Ci0gICAgICogICAgICAgICAgICB0aGUgaW1wb3J0YW5jZSBvZiBsYXRlbmN5CisgICAgICogICAgICAgICAgICB0aGUgaW1wb3J0YW5jZSBvZiBsYXRlbmN5LgogICAgICAqIEBwYXJhbSBiYW5kd2lkdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbXBvcnRhbmNlIG9mIGJhbmR3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGltcG9ydGFuY2Ugb2YgYmFuZHdpZHRoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldFBlcmZvcm1hbmNlUHJlZmVyZW5jZXMoaW50IGNvbm5lY3Rpb25UaW1lLCBpbnQgbGF0ZW5jeSwKICAgICAgICAgICAgIGludCBiYW5kd2lkdGgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRJbXBsRmFjdG9yeS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEltcGxGYWN0b3J5LmphdmEKaW5kZXggZGMwYzUwOS4uM2NjNDJiMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEltcGxGYWN0b3J5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldEltcGxGYWN0b3J5LmphdmEKQEAgLTE4LDE1ICsxOCwxNyBAQAogcGFja2FnZSBqYXZhLm5ldDsKIAogLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgZmFjdG9yeSBmb3Igc29ja2V0IGltcGxlbWVudGF0aW9ucy4gSXQgaXMgdXNlZCBieQotICogdGhlIGNsYXNzZXMgPGNvZGU+U29ja2V0PC9jb2RlPiBhbmQgPGNvZGU+U2VydmVyU29ja2V0PC9jb2RlPiB0byBjcmVhdGUKLSAqIHNvY2tldCBpbXBsZW1lbnRhdGlvbnMuCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgZmFjdG9yeSBmb3Igc29ja2V0IGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgU29ja2V0SW1wbEZhY3RvcnkgeworICAgIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U29ja2V0SW1wbDwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU29ja2V0SW1wbH0gaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBTb2NrZXRJbXBsCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGNvZGUgU29ja2V0SW1wbH0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgU29ja2V0SW1wbCBjcmVhdGVTb2NrZXRJbXBsKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0T3B0aW9ucy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldE9wdGlvbnMuamF2YQppbmRleCA0NTY2YjJiLi42ZTE3NTNmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0T3B0aW9ucy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRPcHRpb25zLmphdmEKQEAgLTE3LDc1ICsxNywxNzEgQEAKIAogcGFja2FnZSBqYXZhLm5ldDsKIAotLy8gQkVHSU4gYW5kcm9pZC1ub3RlCi0vLyBBZGRlZCBhIGNvbW1lbnQgdG8gU09fVElNRU9VVCwgYmVsb3cuCi0vLyBFTkQgYW5kcm9pZC1ub3RlCiAKIC8qKgotICogRGVmaW5lcyB0aGUgcHJvdG9jb2wgdG8gZ2V0ICYgc2V0IFNvY2tldCBvcHRpb25zLgorICogRGVmaW5lcyBhbiBpbnRlcmZhY2UgZm9yIHNvY2tldCBpbXBsZW1lbnRhdGlvbnMgdG8gZ2V0IGFuZCBzZXQgc29ja2V0CisgKiBvcHRpb25zLiBJdCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3NlcyB7QGNvZGUgU29ja2V0SW1wbH0gYW5kIHtAY29kZQorICogRGF0YWdyYW1Tb2NrZXRJbXBsfS4KKyAqIAorICogQHNlZSBTb2NrZXRJbXBsCisgKiBAc2VlIERhdGFncmFtU29ja2V0SW1wbAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgU29ja2V0T3B0aW9ucyB7CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSB7QGNvZGUgY2xvc2UoKX0gbWV0aG9kIGlmIHRoZXJlCisgICAgICogaXMgc3RpbGwgc29tZSBidWZmZXJlZCBkYXRhIHRvIGJlIHNlbnQgd2hpbGUgY2xvc2luZyB0aGUgc29ja2V0LiBJZiB0aGUKKyAgICAgKiB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8ge0Bjb2RlIDB9IHRoZSBtZXRob2QgY2xvc2VzIHRoZSBUQ1Agc29ja2V0CisgICAgICogZm9yY2VmdWxseSBhbmQgcmV0dXJucyBpbW1lZGlhdGVseS4gSXMgdGhpcyB2YWx1ZSBncmVhdGVyIHRoYW4ge0Bjb2RlIDB9CisgICAgICogdGhlIG1ldGhvZCBibG9ja3MgdGhpcyB0aW1lIGluIG1pbGxpc2Vjb25kcy4gSWYgYWxsIGRhdGEgY291bGQgYmUgc2VudAorICAgICAqIGR1cmluZyB0aGlzIHRpbWVvdXQgdGhlIHNvY2tldCBpcyBjbG9zZWQgbm9ybWFsbHkgb3RoZXJ3aXNlIGZvcmNlZnVsbHkuCisgICAgICogVmFsaWQgdmFsdWVzIGZvciB0aGlzIG9wdGlvbiBhcmUgaW4gdGhlIHJhbmdlIHtAY29kZSAwIDw9IFNPX0xJTkdFUiA8PQorICAgICAqIDY1NTM1fS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19MSU5HRVIgPSAxMjg7CiAKICAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciBibG9ja2luZyBvcGVyYXRpb24uIFRoZSBhcmd1bWVudCB2YWx1ZSBpcyBzcGVjaWZpZWQKLSAgICAgKiBpbiBtaWxsaXNlY29uZHMuCisgICAgICogVGltZW91dCBmb3IgYmxvY2tpbmcgb3BlcmF0aW9ucy4gVGhlIGFyZ3VtZW50IHZhbHVlIGlzIHNwZWNpZmllZCBpbgorICAgICAqIG1pbGxpc2Vjb25kcy4gQW4ge0Bjb2RlIEludGVycnVwdGVkSU9FeGNlcHRpb259IGlzIHRocm93biBpZiB0aGlzIHRpbWVvdXQKKyAgICAgKiBleHBpcmVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1RJTUVPVVQgPSA0MTAyOwogCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gc3BlY2lmaWVzIHdoZXRoZXIgZGF0YSBpcyBzZW50IGltbWVkaWF0ZWx5IG9uIHRoaXMgc29ja2V0LCBhcworICAgICAqIGEgc2lkZS1lZmZlY3QgdGhvdWdoLCB0aGlzIGNvdWxkIGxlYWQgdG8gYSBsb3cgcGFja2V0IGVmZmljaWVuY3kuIFRoZQorICAgICAqIHNvY2tldCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBOYWdsZSdzIGFsZ29yaXRobSB0byB0cnkgdG8gcmVhY2ggYSBoaWdoZXIKKyAgICAgKiBwYWNrZXQgZWZmaWNpZW5jeSBpZiB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQ1BfTk9ERUxBWSA9IDE7CiAKICAgICAvLyBGb3IgNSBhbmQgNiBzZWUgTXVsdGljYXN0U29ja2V0CiAKICAgICAvLyBGb3IgNyBzZWUgUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwKICAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIGludGVyZmFjZSB3aGljaCBpcyB1c2VkIHRvIHNlbmQgbXVsdGljYXN0CisgICAgICogcGFja2V0cy4gSXQncyBvbmx5IGF2YWlsYWJsZSBvbiBhIHtAY29kZSBNdWx0aWNhc3RTb2NrZXR9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQX01VTFRJQ0FTVF9JRiA9IDE2OwogCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2V0IG9uZSBzcGVjaWZpYyBpbnRlcmZhY2Ugb24gYSBtdWx0aWhvbWVkCisgICAgICogaG9zdCBvbiB3aGljaCBpbmNvbWluZyBjb25uZWN0aW9ucyBhcmUgYWNjZXB0ZWQuIEl0J3Mgb25seSBhdmFpbGFibGUgb24KKyAgICAgKiBzZXJ2ZXItc2lkZSBzb2NrZXRzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX0JJTkRBRERSID0gMTU7CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgd2hldGhlciBhIHJldXNlIG9mIGEgbG9jYWwgYWRkcmVzcyBpcyBhbGxvd2VkIGV2ZW4KKyAgICAgKiBpZiBhbiBvdGhlciBzb2NrZXQgaXMgbm90IHlldCByZW1vdmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBJdCdzIG9ubHkKKyAgICAgKiBhdmFpbGFibGUgb24gYSB7QGNvZGUgTXVsdGljYXN0U29ja2V0fS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19SRVVTRUFERFIgPSA0OwogCiAgICAgLy8gMTAgbm90IGN1cnJlbnRseSB1c2VkCiAgICAgCisgICAgLyoqCisgICAgICogQnVmZmVyIHNpemUgb2YgdGhlIG91dGdvaW5nIGNoYW5uZWwuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fU05EQlVGID0gNDA5NzsKIAorICAgIC8qKgorICAgICAqIEJ1ZmZlciBzaXplIG9mIHRoZSBpbmNvbWluZyBjaGFubmVsLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1JDVkJVRiA9IDQwOTg7CiAKICAgICAvLyBGb3IgMTMsIHNlZSBEYXRhZ3JhbVNvY2tldAogICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIHNwZWNpZmllcyB3aGV0aGVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbnMgY2FuIHNlbmQga2VlcGFsaXZlCisgICAgICogbWVzc2FnZXMgaWYgbm8gZGF0YSBoYXMgYmVlbiBzZW50IGZvciBhIGxvbmdlciB0aW1lLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX0tFRVBBTElWRSA9IDg7Ci0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHZhbHVlIGZvciB0aGUgVHlwZS1vZi1TZXJ2aWNlIChUT1MpIGZpZWxkIG9mCisgICAgICogdGhlIElQIGhlYWRlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJUF9UT1MgPSAzOwotCisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGxvY2FsIGxvb3BiYWNrIG9mIG11bHRpY2FzdCBwYWNrZXRzIGlzCisgICAgICogZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0IG9uIG11bHRpY2FzdAorICAgICAqIHNvY2tldHMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVBfTVVMVElDQVNUX0xPT1AgPSAxODsKLQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBicm9hZGNhc3Rpbmcgb24gZGF0YWdyYW0gc29ja2V0cy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19CUk9BRENBU1QgPSAzMjsKLQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIHNwZWNpZmllcyB3aGV0aGVyIHNlbmRpbmcgVENQIHVyZ2VudCBkYXRhIGlzIHN1cHBvcnRlZCBvbgorICAgICAqIHRoaXMgc29ja2V0IG9yIG5vdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19PT0JJTkxJTkUgPSA0MDk5OwotCisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2V0IG9uZSBzcGVjaWZpYyBpbnRlcmZhY2Ugb24gYSBtdWx0aWhvbWVkCisgICAgICogaG9zdCBvbiB3aGljaCBpbmNvbWluZyBjb25uZWN0aW9ucyBhcmUgYWNjZXB0ZWQuIEl0J3Mgb25seSBhdmFpbGFibGUgb24KKyAgICAgKiBzZXJ2ZXItc2lkZSBzb2NrZXRzLiBUaGlzIG9wdGlvbiBzdXBwb3J0cyBzZXR0aW5nIG91dGdvaW5nIGludGVyZmFjZXMKKyAgICAgKiB3aXRoIGVpdGhlciBJUHY0IG9yIElQdjYgYWRkcmVzc2VzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQX01VTFRJQ0FTVF9JRjIgPSAzMTsKIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgZGVjbGFyZWQgc29ja2V0IG9wdGlvbi4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBzb2NrZXQgb3B0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gT2JqZWN0IHRoZSBvcHRpb24gdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRoZSBvcHRpb24gdmFsdWUuCiAgICAgICogQHBhcmFtIG9wdElECi0gICAgICogICAgICAgICAgICB0aGUgb3B0aW9uIGlkZW50aWZpZXIKLSAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRocm93biBpZiBhbiBlcnJvciBvY2N1cnMgZ2V0dGluZyB0aGUgb3B0aW9uCisgICAgICogICAgICAgICAgICB0aGUgb3B0aW9uIGlkZW50aWZpZXIuCisgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyB0aGUgb3B0aW9uIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0T3B0aW9uKGludCBvcHRJRCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVjbGFyZWQgc29ja2V0IG9wdGlvbiB0byB0aGUgdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzb2NrZXQgb3B0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcHRJRAotICAgICAqICAgICAgICAgICAgdGhlIG9wdGlvbiBpZGVudGlmaWVyCisgICAgICogICAgICAgICAgICB0aGUgb3B0aW9uIGlkZW50aWZpZXIuCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdGhlIG9wdGlvbiB2YWx1ZSB0byBiZSBzZXQKLSAgICAgKiBAZXhjZXB0aW9uIFNvY2tldEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRocm93biBpZiBhbiBlcnJvciBvY2N1cnMgc2V0dGluZyB0aGUgb3B0aW9uCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgb3B0aW9uLgorICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHNldHRpbmcgdGhlIG9wdGlvbiB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb24oaW50IG9wdElELCBPYmplY3QgdmFsKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldFBlcm1pc3Npb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRQZXJtaXNzaW9uLmphdmEKaW5kZXggNjVlYzlkNS4uOTExMjU5MCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldFBlcm1pc3Npb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0UGVybWlzc2lvbi5qYXZhCkBAIC0yOCwxMSArMjgsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBTb2NrZXRQZXJtaXNzaW9ucyByZXByZXNlbnQgcGVybWlzc2lvbiB0byBhY2Nlc3MgcmVzb3VyY2VzIHZpYSBzb2NrZXRzLiBUaGUKLSAqIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gc2hvdWxkIGJlIGVpdGhlciB0aGUgKHBvc3NpYmx5IHdpbGRjYXJkZWQgKGVnLgotICogKi5jb21wYW55LmNvbSkpIEROUyBzdHlsZSBuYW1lIG9mIHRoZSBvZiB0aGUgaG9zdCBmb3Igd2hpY2ggYWNjZXNzIGlzIGJlaW5nCi0gKiByZXF1ZXN0ZWQsIG9yIGl0cyBJUCBhZGRyZXNzIGluIHN0YW5kYXJkIG5uLm5uLm5uLm5uICgiZG90Iikgbm90YXRpb24uIFRoZQotICogYWN0aW9uIGxpc3QgY2FuIGJlIG1hZGUgdXAgb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgKiBSZWd1bGF0ZXMgdGhlIGFjY2VzcyB0byBuZXR3b3JrIG9wZXJhdGlvbnMgYXZhaWxhYmxlIHRocm91Z2ggc29ja2V0cyB0aHJvdWdoCisgKiBwZXJtaXNzaW9ucy4gQSBwZXJtaXNzaW9uIGNvbnNpc3RzIG9mIGEgdGFyZ2V0IChhIGhvc3QpLCBhbmQgYW4gYXNzb2NpYXRlZAorICogYWN0aW9uIGxpc3QuIFRoZSB0YXJnZXQgc2hvdWxkIGlkZW50aWZ5IHRoZSBob3N0IGJ5IGVpdGhlciBpbmRpY2F0aW5nIHRoZQorICogKHBvc3NpYmx5IHdpbGRjYXJkZWQgKGVnLiB7QGNvZGUgLmNvbXBhbnkuY29tfSkpIEROUyBzdHlsZSBuYW1lIG9mIHRoZSBob3N0CisgKiBvciBpdHMgSVAgYWRkcmVzcyBpbiBzdGFuZGFyZCB7QGNvZGUgbm4ubm4ubm4ubm59ICgiZG90Iikgbm90YXRpb24uIFRoZQorICogYWN0aW9uIGxpc3QgY2FuIGJlIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zIHNlcGFyYXRlZAorICogYnkgYSBjb21tYToKICAqIDxkbD4KICAqIDxkdD5jb25uZWN0PC9kdD4KICAqIDxkZD5yZXF1ZXN0cyBwZXJtaXNzaW9uIHRvIGNvbm5lY3QgdG8gdGhlIGhvc3Q8L2RkPgpAQCAtNDEsMjMgKzQzLDI3IEBACiAgKiA8ZHQ+YWNjZXB0PC9kdD4KICAqIDxkZD5yZXF1ZXN0cyBwZXJtaXNzaW9uIHRvIGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tIHRoZSBob3N0PC9kZD4KICAqIDxkdD5yZXNvbHZlPC9kdD4KLSAqIDxkZD5yZXF1ZXN0cyBwZXJtaXNzaW9uIHRvIHJlc29sdmUgdGhlIGhvc3QgbmFtZTwvZGQ+CisgKiA8ZGQ+cmVxdWVzdHMgcGVybWlzc2lvbiB0byByZXNvbHZlIHRoZSBob3N0bmFtZTwvZGQ+CiAgKiA8L2RsPgotICogTm90ZSB0aGF0ICJyZXNvbHZlIiBpcyBpbXBsaWVkIHdoZW4gYW55IChvciBub25lKSBvZiB0aGUgb3RoZXJzIGFyZSBwcmVzZW50LgorICogTm90ZSB0aGF0IHtAY29kZSByZXNvbHZlfSBpcyBpbXBsaWVkIHdoZW4gYW55IChvciBub25lKSBvZiB0aGUgb3RoZXJzIGFyZQorICogcHJlc2VudC4KICAqIDxwPgogICogQWNjZXNzIHRvIGEgcGFydGljdWxhciBwb3J0IGNhbiBiZSByZXF1ZXN0ZWQgYnkgYXBwZW5kaW5nIGEgY29sb24gYW5kIGEKLSAqIHNpbmdsZSBkaWdpdCB0byB0aGUgbmFtZSAoZWcuICIqLmNvbXBhbnkuY29tOjcwMDAiKS4gQSByYW5nZSBvZiBwb3J0IG51bWJlcnMKLSAqIGNhbiBhbHNvIGJlIHNwZWNpZmllZCwgYnkgYXBwZW5kaW5nIGEgcGF0dGVybiBvZiB0aGUgZm9ybSA8bG93Pi08aGlnaD4gd2hlcmUKLSAqIDxsb3c+IGFuZCA8aGlnaD4gYXJlIHZhbGlkIHBvcnQgbnVtYmVycy4gSWYgZWl0aGVyIDxsb3c+IG9yIDxoaWdoPiBpcyBvbWl0dGVkCi0gKiBpdCBpcyBlcXVpdmFsZW50IHRvIGVudGVyaW5nIHRoZSBsb3dlc3Qgb3IgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZQotICogcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZToKKyAqIHNpbmdsZSBkaWdpdCB0byB0aGUgbmFtZSAoZWcuIHtAY29kZSAuY29tcGFueS5jb206NzAwMH0pLiBBIHJhbmdlIG9mIHBvcnQKKyAqIG51bWJlcnMgY2FuIGFsc28gYmUgc3BlY2lmaWVkLCBieSBhcHBlbmRpbmcgYSBwYXR0ZXJuIG9mIHRoZSBmb3JtCisgKiA8aT5MT1ctSElHSDwvaT4gd2hlcmUgPGk+TE9XPC9pPiBhbmQgPGk+SElHSDwvaT4gYXJlIHZhbGlkIHBvcnQgbnVtYmVycy4gSWYKKyAqIGVpdGhlciA8aT5MT1c8L2k+IG9yIDxpPkhJR0g8L2k+IGlzIG9taXR0ZWQgaXQgaXMgZXF1aXZhbGVudCB0byBlbnRlcmluZyB0aGUKKyAqIGxvd2VzdCBvciBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlIHJlc3BlY3RpdmVseS4gRm9yIGV4YW1wbGU6CiAgKiAKICAqIDxwcmU+Ci0gKiBTb2NrZXRQZXJtaXNzaW9uKCZxdW90O3d3dy5jb21wYW55LmNvbTo3MDAwLSZxdW90OywgJnF1b3Q7Y29ubmVjdCZxdW90OywgJnF1b3Q7YWNjZXB0JnF1b3Q7KQorICoge0Bjb2RlIFNvY2tldFBlcm1pc3Npb24oJnF1b3Q7d3d3LmNvbXBhbnkuY29tOjcwMDAtJnF1b3Q7LCAmcXVvdDtjb25uZWN0LGFjY2VwdCZxdW90Oyl9CiAgKiA8L3ByZT4KICAqIAotICogcmVwcmVzZW50cyBwZXJtaXNzaW9uIHRvIGNvbm5lY3QgdG8gYW5kIGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tCi0gKiB3d3cuY29tcGFueS5jb20gb24gcG9ydHMgaW4gdGhlIHJhbmdlIDcwMDAgdG8gNjU1MzUuCisgKiByZXByZXNlbnRzIHRoZSBwZXJtaXNzaW9uIHRvIGNvbm5lY3QgdG8gYW5kIGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tIHtAY29kZQorICogd3d3LmNvbXBhbnkuY29tfSBvbiBwb3J0cyBpbiB0aGUgcmFuZ2Uge0Bjb2RlIDcwMDB9IHRvIHtAY29kZSA2NTUzNX0uCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU29ja2V0UGVybWlzc2lvbiBleHRlbmRzIFBlcm1pc3Npb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCkBAIC0xMDUsMTggKzExMSwyMSBAQAogICAgIHRyYW5zaWVudCBpbnQgYWN0aW9uc01hc2sgPSBTUF9SRVNPTFZFOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiBUaGUgaG9zdCBuYW1lIGNhbiBiZSBhIEROUyBuYW1lLCBhbgotICAgICAqIGluZGl2aWR1YWwgaG9zdG5hbWUsIGFuIGlwIGFkZHJlc3Mgb3IgdGhlIGVtcHR5IHN0cmluZyB3aGljaCBpbXBsaWVzCi0gICAgICogbG9jYWxob3N0LiBUaGUgcG9ydCBvciBwb3J0IHJhbmdlIGlzIG9wdGlvbmFsLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNvY2tldFBlcm1pc3Npb259IGluc3RhbmNlLiBUaGUgaG9zdG5hbWUgY2FuIGJlIGEKKyAgICAgKiBETlMgbmFtZSwgYW4gaW5kaXZpZHVhbCBob3N0bmFtZSwgYW4gSVAgYWRkcmVzcyBvciB0aGUgZW1wdHkgc3RyaW5nIHdoaWNoCisgICAgICogaW1wbGllcyB7QGNvZGUgbG9jYWxob3N0fS4gVGhlIHBvcnQgb3IgcG9ydCByYW5nZSBpcyBvcHRpb25hbC4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgYWN0aW9uIGxpc3QgaXMgYSBjb21tYS1zZXBlcmF0ZWQgbGlzdCB3aGljaCBjYW4gY29uc2lzdCBvZiAiY29ubmVjdCIsCi0gICAgICogImxpc3RlbiIsICJhY2NlcHQiLCBhbmQgInJlc29sdmUiLiBUaGV5IGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBjYW4gYmUKLSAgICAgKiBwdXQgdG9nZXRoZXIgaW4gYW55IG9yZGVyLiAicmVzb2x2ZSIgaXMgYWx3YXlzIGltcGxpZWQuCisgICAgICogVGhlIGFjdGlvbiBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgd2hpY2ggY2FuIGNvbnNpc3RzIG9mIHRoZQorICAgICAqIHBvc3NpYmxlIG9wZXJhdGlvbnMge0Bjb2RlICJjb25uZWN0In0sIHtAY29kZSAibGlzdGVuIn0sIHtAY29kZSAiYWNjZXB0In0KKyAgICAgKiAsIGFuZCB7QGNvZGUgInJlc29sdmUifS4gVGhleSBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FuIGJlIHB1dAorICAgICAqIHRvZ2V0aGVyIGluIGFueSBvcmRlci4ge0Bjb2RlICJyZXNvbHZlIn0gaXMgaW1wbGllZCBwZXIgZGVmYXVsdC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIGhvc3QgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGhvc3RuYW1lIHRoaXMgcGVybWlzc2lvbiBpcyB2YWxpZCBmb3IuCiAgICAgICogQHBhcmFtIGFjdGlvbgotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0aGUgYWN0aW9uIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIGFjdGlvbiBzdHJpbmcgb2YgdGhpcyBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXRQZXJtaXNzaW9uKFN0cmluZyBob3N0LCBTdHJpbmcgYWN0aW9uKSB7CiAgICAgICAgIHN1cGVyKGhvc3QuZXF1YWxzKCIiKSA/ICJsb2NhbGhvc3QiIDogaG9zdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTM1LDE1ICsxNDQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgcmVwcmVzZW50Ci0gICAgICogdGhlIGVxdWFsIG9iamVjdHMgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLgotICAgICAqIDxwPgorICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB7QGNvZGUgb30gdG8gdGhpcyBpbnN0YW5jZSBhbmQgcmV0dXJucyB7QGNvZGUgdHJ1ZX0KKyAgICAgKiBpZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSBwZXJtaXNzaW9uIHVzaW5nIGEgY2xhc3Mgc3BlY2lmaWMgY29tcGFyaXNvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbwotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyB7QGNvZGUgU29ja2V0UGVybWlzc2lvbn0KKyAgICAgKiAgICAgICAgICAgIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHBlcm1pc3Npb24sIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtMTcxLDEzICsxODEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gb2JqZWN0cyB3aGljaAotICAgICAqIGFuc3dlciA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byA8Y29kZT4uZXF1YWxzPC9jb2RlPiBtdXN0Ci0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIHZhbHVlIGZvciB0aGlzIHtAY29kZSBTb2NrZXRQZXJtaXNzaW9ufSBpbnN0YW5jZS4gQW55CisgICAgICogdHdvIG9iamVjdHMgd2hpY2ggcmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbiBwYXNzZWQgdG8ge0Bjb2RlIGVxdWFscygpfQorICAgICAqIG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIGEgcmVzdWx0IG9mIHRoaXMgbWV0aG9kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSByZWNlaXZlcidzIGhhc2guCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaGNvZGUgdmFsdWUgZm9yIHRoaXMgaW5zdGFuY2UuCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTE4NSwxMCArMTk1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGFjdGlvbiBsaXN0IG9mIHRoaXMgU29ja2V0UGVybWlzc2lvbiBpbiB0aGUgb3JkZXI6Ci0gICAgICogY29ubmVjdCwgbGlzdGVuLCBhY2NlcHQsIHJlc29sdmUuCisgICAgICogR2V0cyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFsbCBhY3Rpb25zIGFsbG93ZWQgYnkgdGhpcyBwZXJtaXNzaW9uLiBJZgorICAgICAqIG1vcmUgdGhhbiBvbmUgYWN0aW9uIGlzIHJldHVybmVkIHRoZXkgZm9sbG93IHRoaXMgb3JkZXI6IHtAY29kZSBjb25uZWN0fSwKKyAgICAgKiB7QGNvZGUgbGlzdGVufSwge0Bjb2RlIGFjY2VwdH0sIHtAY29kZSByZXNvbHZlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgdGhlIGNhbm9uaWNhbCBhY3Rpb24gbGlzdAorICAgICAqIEByZXR1cm4gdGhlIGNvbW1hLXNlcGFyYXRlZCBhY3Rpb24gbGlzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbnMoKSB7CkBAIC0xOTYsNyArMjA4LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIGFjdGlvbnMgZm9yIHRoaXMgcGVybWlzc2lvbiBhcyBhIGJpdCBmaWVsZAorICAgICAqIFN0b3JlcyB0aGUgYWN0aW9ucyBmb3IgdGhpcyBwZXJtaXNzaW9uIGFzIGEgYml0IGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhY3Rpb25zCiAgICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBhY3Rpb24gbGlzdApAQCAtMjM0LDE2ICsyNDYsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgcGVybWlzc2lvbiB0byBzZWUgaWYgdGhlIGFjdGlvbnMgcmVxdWVzdGVkIGJ5IHRoZSBhcmd1bWVudAotICAgICAqIHBlcm1pc3Npb24gYXJlIHBlcm1pc3NhYmxlLiBBbGwgYXJndW1lbnQgcGVybWlzc2lvbiBhY3Rpb25zLCBob3N0IGFuZAotICAgICAqIHBvcnQgbXVzdCBiZSBpbXBsaWVkIGJ5IHRoaXMgcGVybWlzc2lvbiBpbiBvcmRlciB0byByZXR1cm4gdHJ1ZS4gVGhpcwotICAgICAqIHBlcm1pc3Npb24gbWF5IGltcGx5IGFkZGl0aW9uYWwgYWN0aW9ucyBldGMuIG5vdCBwcmVzZW50IGluIHRoZSBhcmd1bWVudAotICAgICAqIHBlcm1pc3Npb24uCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyB7QGNvZGUgU29ja2V0UGVybWlzc2lvbn0gaW5zdGFuY2UgYWxsb3dzIGFsbCBhY3Rpb25zCisgICAgICogd2hpY2ggYXJlIGFsbG93ZWQgYnkgdGhlIGdpdmVuIHBlcm1pc3Npb24gb2JqZWN0IHtAY29kZSBwfS4gQWxsIGFyZ3VtZW50CisgICAgICogcGVybWlzc2lvbiBhY3Rpb25zLCBob3N0cyBhbmQgcG9ydHMgbXVzdCBiZSBpbXBsaWVkIGJ5IHRoaXMgcGVybWlzc2lvbgorICAgICAqIGluc3RhbmNlIGluIG9yZGVyIHRvIHJldHVybiB7QGNvZGUgdHJ1ZX0uIFRoaXMgcGVybWlzc2lvbiBtYXkgaW1wbHkKKyAgICAgKiBhZGRpdGlvbmFsIGFjdGlvbnMgbm90IHByZXNlbnQgaW4gdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhpcyBwZXJtaXNzaW9uIGltcGxpZXMgPGNvZGU+cDwvY29kZT4sIGFuZAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICogQHBhcmFtIHAKLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgb3RoZXIgc29ja2V0IHBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb2NrZXQgcGVybWlzc2lvbiB3aGljaCBoYXMgdG8gYmUgaW1wbGllZCBieSB0aGlzCisgICAgICogICAgICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHBlcm1pc3Npb24gaW5zdGFuY2UgaW1wbGllcyBhbGwgcGVybWlzc2lvbnMKKyAgICAgKiAgICAgICAgIHJlcHJlc2VudGVkIGJ5IHtAY29kZSBwfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHApIHsKQEAgLTI3Myw5ICsyODcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUGVybWlzc2lvbkNvbGxlY3Rpb24gZm9yIHN0b3JpbmcgU29ja2V0UGVybWlzc2lvbiBvYmplY3RzLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSB0byBzdG9yZSB7QGNvZGUKKyAgICAgKiBTb2NrZXRQZXJtaXNzaW9ufSBvYmplY3RzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiBhIHBlcm1pc3Npb24gY29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBwZXJtaXNzaW9uIGNvbGxlY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFBlcm1pc3Npb25Db2xsZWN0aW9uIG5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgewpAQCAtNDI1LDkgKzQ0MSw5IEBACiAgICAgICAgIHJldHVybiBob3N0LnRvTG93ZXJDYXNlKCk7CiAgICAgfQogCi0gICAgLyoKKyAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoaXMgcGVybWlzc2lvbiBjb3VsZCByZWZlciB0byB0aGUgc2FtZSBob3N0IGFzCi0gICAgICogc3AKKyAgICAgKiBzcC4KICAgICAgKi8KICAgICBib29sZWFuIGNoZWNrSG9zdChTb2NrZXRQZXJtaXNzaW9uIHNwKSB7CiAgICAgICAgIGlmIChpc1BhcnRpYWxXaWxkKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0UGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCmluZGV4IDE2ODcyNjIuLjc3N2Y5YTcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCkBAIC0yMyw5ICsyMywxMSBAQAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgotICogU29ja2V0UGVybWlzc2lvbkNvbGxlY3Rpb24gaXMgYSBjbGFzcyB3aGljaCBob2xkcyBhIGNvbGxlY3Rpb24gb2YKLSAqIFNvY2tldFBlcm1pc3Npb24gb2JqZWN0cyBhbmQgY2FuIGFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhCi0gKiBzcGVjaWZpYyBwZXJtaXNzaW9ucyBpcyBpbXBsaWVkIGJ5IGEgU29ja2V0UGVybWlzc2lvbkNvbGxlY3Rpb24uCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBsaXN0IG9mIHtAY29kZSBTb2NrZXRQZXJtaXNzaW9ufSBvYmplY3RzIGFuZCBwcm92aWRlcworICogYSBtZXRob2QgdG8gY2hlY2sgd2hldGhlciBvciBub3QgYSBzcGVjaWZpYyBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhpcworICoge0Bjb2RlIFNvY2tldFBlcm1pc3Npb25Db2xsZWN0aW9ufS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIGZpbmFsIGNsYXNzIFNvY2tldFBlcm1pc3Npb25Db2xsZWN0aW9uIGV4dGVuZHMgUGVybWlzc2lvbkNvbGxlY3Rpb24gewogCkBAIC01Nyw5ICs1OSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBwZXJtaXNzaW9uIGNvbGxlY3Rpb24gaW1wbGllcyA8Y29kZT5wZXJtaXNzaW9uPC9jb2RlPi4KLSAgICAgKiBCYXNpY2FsbHkgaXQgdGVzdHMgaWYgPGNvZGU+cGVybWlzc2lvbjwvY29kZT4gaXMgdGhlIHN1YnNldCBvZiB0aGlzCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGVybWlzc2lvbiBjb2xsZWN0aW9uIGltcGxpZXMge0Bjb2RlIHBlcm1pc3Npb259LgorICAgICAqIEJhc2ljYWxseSBpdCB0ZXN0cyB3aGV0aGVyIHtAY29kZSBwZXJtaXNzaW9ufSBpcyB0aGUgc3Vic2V0IG9mIHRoaXMKICAgICAgKiBjb2xsZWN0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGltcGxpZXMoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0VGltZW91dEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldFRpbWVvdXRFeGNlcHRpb24uamF2YQppbmRleCAzOTQwMTM5Li4zMmJhMTgzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0VGltZW91dEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uLmphdmEKQEAgLTE5LDIzICsxOSwzMyBAQAogCiBpbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOwogCisvKioKKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgdGltZW91dCBleHBpcmVkIG9uIGEgc29ja2V0IHtAY29kZSByZWFkfSBvcgorICoge0Bjb2RlIGFjY2VwdH0gb3BlcmF0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZXh0ZW5kcyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04ODQ2NjU0ODQxODI2MzUyMzAwTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU29ja2V0VGltZW91dEV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCBpdHMgd2Fsa2JhY2sKKyAgICAgKiBmaWxsZWQgaW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvY2tldFRpbWVvdXRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNvY2tldFRpbWVvdXRFeGNlcHRpb259IGluc3RhbmNlIHdpdGggaXRzIHdhbGtiYWNrCisgICAgICogYW5kIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIG9mIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSSS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSSS5qYXZhCmluZGV4IGNiMWZmMTAuLjRiMWY0ZGYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJJLmphdmEKQEAgLTI4LDYgKzI4LDggQEAKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYSBVUkkgYXMgZGVmaW5lZCBieSBSRkMgMjM5Ni4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBVUkkgaW1wbGVtZW50cyBDb21wYXJhYmxlPFVSST4sIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTc0LDEwICs3NiwzOSBAQAogICAgIHByaXZhdGUgVVJJKCkgewogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgVVJJIGluc3RhbmNlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3RyaW5nIHtAY29kZSB1cml9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmkKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXh0dWFsIFVSSSByZXByZXNlbnRhdGlvbiB0byBiZSBwYXJzZWQgaW50byBhIFVSSSBvYmplY3QuCisgICAgICogQHRocm93cyBVUklTeW50YXhFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gc3RyaW5nIHtAY29kZSB1cml9IGRvZXNuJ3QgZml0IHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gUkZDMjM5NiBvciBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgVVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogICAgICAgICBuZXcgSGVscGVyKCkucGFyc2VVUkkodXJpLCBmYWxzZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBVUkkgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cy4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGZpcnN0IGNyZWF0ZXMgYSB0ZW1wb3JhcnkgVVJJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBjb21wb25lbnRzLiBUaGlzCisgICAgICogc3RyaW5nIHdpbGwgYmUgcGFyc2VkIGxhdGVyIG9uIHRvIGNyZWF0ZSB0aGUgVVJJIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIHtAY29kZSBbc2NoZW1lOl1zY2hlbWUtc3BlY2lmaWMtcGFydFsjZnJhZ21lbnRdfQorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2NoZW1lCisgICAgICogICAgICAgICAgICB0aGUgc2NoZW1lIHBhcnQgb2YgdGhlIFVSSS4KKyAgICAgKiBAcGFyYW0gc3NwCisgICAgICogICAgICAgICAgICB0aGUgc2NoZW1lLXNwZWNpZmljLXBhcnQgb2YgdGhlIFVSSS4KKyAgICAgKiBAcGFyYW0gZnJhZworICAgICAqICAgICAgICAgICAgdGhlIGZyYWdtZW50IHBhcnQgb2YgdGhlIFVSSS4KKyAgICAgKiBAdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0ZW1wb3JhcnkgY3JlYXRlZCBzdHJpbmcgZG9lc24ndCBmaXQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBSRkMyMzk2IG9yIGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBVUkkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIHNzcCwgU3RyaW5nIGZyYWcpCiAgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHVyaSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTk4LDYgKzEyOSwzNSBAQAogICAgICAgICBuZXcgSGVscGVyKCkucGFyc2VVUkkodXJpLnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFVSSSBpbnN0YW5jZSB1c2luZyB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBUaGlzIGNvbnN0cnVjdG9yCisgICAgICogZmlyc3QgY3JlYXRlcyBhIHRlbXBvcmFyeSBVUkkgc3RyaW5nIGZyb20gdGhlIGdpdmVuIGNvbXBvbmVudHMuIFRoaXMKKyAgICAgKiBzdHJpbmcgd2lsbCBiZSBwYXJzZWQgbGF0ZXIgb24gdG8gY3JlYXRlIHRoZSBVUkkgaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICoge0Bjb2RlIFtzY2hlbWU6XVt1c2VyLWluZm9AXWhvc3RbOnBvcnRdW3BhdGhdWz9xdWVyeV1bI2ZyYWdtZW50XX0KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHNjaGVtZQorICAgICAqICAgICAgICAgICAgdGhlIHNjaGVtZSBwYXJ0IG9mIHRoZSBVUkkuCisgICAgICogQHBhcmFtIHVzZXJpbmZvCisgICAgICogICAgICAgICAgICB0aGUgdXNlciBpbmZvcm1hdGlvbiBvZiB0aGUgVVJJIGZvciBhdXRoZW50aWNhdGlvbiBhbmQKKyAgICAgKiAgICAgICAgICAgIGF1dGhvcml6YXRpb24uCisgICAgICogQHBhcmFtIGhvc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUgb2YgdGhlIFVSSS4KKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBVUkkuCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSByZXNvdXJjZSBvbiB0aGUgaG9zdC4KKyAgICAgKiBAcGFyYW0gcXVlcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkkgdG8gc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBmcmFnbWVudAorICAgICAqICAgICAgICAgICAgdGhlIGZyYWdtZW50IHBhcnQgb2YgdGhlIFVSSS4KKyAgICAgKiBAdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0ZW1wb3JhcnkgY3JlYXRlZCBzdHJpbmcgZG9lc24ndCBmaXQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBSRkMyMzk2IG9yIGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBVUkkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIHVzZXJpbmZvLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsCiAgICAgICAgICAgICBTdHJpbmcgcGF0aCwgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZnJhZ21lbnQpCiAgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKQEAgLTE2NCwxMSArMjI0LDU2IEBACiAgICAgICAgIG5ldyBIZWxwZXIoKS5wYXJzZVVSSSh1cmkudG9TdHJpbmcoKSwgdHJ1ZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBVUkkgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cy4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGZpcnN0IGNyZWF0ZXMgYSB0ZW1wb3JhcnkgVVJJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBjb21wb25lbnRzLiBUaGlzCisgICAgICogc3RyaW5nIHdpbGwgYmUgcGFyc2VkIGxhdGVyIG9uIHRvIGNyZWF0ZSB0aGUgVVJJIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIHtAY29kZSBbc2NoZW1lOl1ob3N0W3BhdGhdWyNmcmFnbWVudF19CisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzY2hlbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2hlbWUgcGFydCBvZiB0aGUgVVJJLgorICAgICAqIEBwYXJhbSBob3N0CisgICAgICogICAgICAgICAgICB0aGUgaG9zdCBuYW1lIG9mIHRoZSBVUkkuCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSByZXNvdXJjZSBvbiB0aGUgaG9zdC4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmcmFnbWVudCBwYXJ0IG9mIHRoZSBVUkkuCisgICAgICogQHRocm93cyBVUklTeW50YXhFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGVtcG9yYXJ5IGNyZWF0ZWQgc3RyaW5nIGRvZXNuJ3QgZml0IHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gUkZDMjM5NiBvciBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgVVJJKFN0cmluZyBzY2hlbWUsIFN0cmluZyBob3N0LCBTdHJpbmcgcGF0aCwgU3RyaW5nIGZyYWdtZW50KQogICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoc2NoZW1lLCBudWxsLCBob3N0LCAtMSwgcGF0aCwgbnVsbCwgZnJhZ21lbnQpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgVVJJIGluc3RhbmNlIHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBmaXJzdCBjcmVhdGVzIGEgdGVtcG9yYXJ5IFVSSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gY29tcG9uZW50cy4gVGhpcworICAgICAqIHN0cmluZyB3aWxsIGJlIHBhcnNlZCBsYXRlciBvbiB0byBjcmVhdGUgdGhlIFVSSSBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiB7QGNvZGUgW3NjaGVtZTpdWy8vYXV0aG9yaXR5XVtwYXRoXVs/cXVlcnldWyNmcmFnbWVudF19CisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzY2hlbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2hlbWUgcGFydCBvZiB0aGUgVVJJLgorICAgICAqIEBwYXJhbSBhdXRob3JpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdXRob3JpdHkgcGFydCBvZiB0aGUgVVJJLgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgcmVzb3VyY2Ugb24gdGhlIGhvc3QuCisgICAgICogQHBhcmFtIHF1ZXJ5CisgICAgICogICAgICAgICAgICB0aGUgcXVlcnkgcGFydCBvZiB0aGUgVVJJIHRvIHNwZWNpZnkgcGFyYW1ldGVycyBmb3IgdGhlCisgICAgICogICAgICAgICAgICByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmcmFnbWVudCBwYXJ0IG9mIHRoZSBVUkkuCisgICAgICogQHRocm93cyBVUklTeW50YXhFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGVtcG9yYXJ5IGNyZWF0ZWQgc3RyaW5nIGRvZXNuJ3QgZml0IHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gUkZDMjM5NiBvciBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgVVJJKFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksIFN0cmluZyBwYXRoLCBTdHJpbmcgcXVlcnksCiAgICAgICAgICAgICBTdHJpbmcgZnJhZ21lbnQpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogICAgICAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgcGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwCkBAIC03NDEsNiArODQ2LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGlzIFVSSSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudCB7QGNvZGUgdXJpfS4gVGhpcyBtZXRob2Qgd2lsbAorICAgICAqIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgVVJJIGluc3RhbmNlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4KKyAgICAgKiBhcmd1bWVudCBhbmQgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGlzIFVSSSBpbnN0YW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlCisgICAgICogZ2l2ZW4gYXJndW1lbnQuIFRoZSByZXR1cm4gdmFsdWUge0Bjb2RlIDB9IGluZGljYXRlcyB0aGF0IHRoZSB0d28KKyAgICAgKiBpbnN0YW5jZXMgcmVwcmVzZW50IHRoZSBzYW1lIFVSSS4gVG8gZGVmaW5lIHRoZSBvcmRlciB0aGUgc2luZ2xlIHBhcnRzIG9mCisgICAgICogdGhlIFVSSSBhcmUgY29tcGFyZWQgd2l0aCBlYWNoIG90aGVyLiBTdHJpbmcgY29tcG9uZW50cyB3aWxsIGJlIG9yZGVyZXIKKyAgICAgKiBpbiB0aGUgbmF0dXJhbCBjYXNlLXNlbnNpdGl2ZSB3YXkuIEEgaGllcmFyY2hpY2FsIFVSSSBpcyBsZXNzIHRoYW4gYW4KKyAgICAgKiBvcGFxdWUgVVJJIGFuZCBpZiBvbmUgcGFydCBpcyB7QGNvZGUgbnVsbH0gdGhlIFVSSSB3aXRoIHRoZSB1bmRlZmluZWQKKyAgICAgKiBwYXJ0IGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIgb25lLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmkKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkkgdGhpcyBpbnN0YW5jZSBoYXMgdG8gY29tcGFyZSB3aXRoLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgb2YgdGhlIHR3byBpbnN0YW5jZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oVVJJIHVyaSkgewogICAgICAgICBpbnQgcmV0ID0gMDsKIApAQCAtODQ1LDYgKzk2NiwxNSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIGFyZ3VtZW50IHtAY29kZSB1cml9IGFuZCBjcmVhdGVzIGFuIGFwcHJvcHJpYXRlIFVSSQorICAgICAqIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgd2hpY2ggaGFzIHRvIGJlIHBhcnNlZCB0byBjcmVhdGUgdGhlIFVSSSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gVVJJLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZShTdHJpbmcgdXJpKSB7CiAgICAgICAgIFVSSSByZXN1bHQgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtOTIzLDYgKzEwNTMsMTcgQEAKICAgICAgICAgcmV0dXJuIGZpcnN0LnN1YnN0cmluZyhwcmV2aW5kZXgpLmVxdWFscyhzZWNvbmQuc3Vic3RyaW5nKHByZXZpbmRleCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoaXMgVVJJIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50IHtAY29kZSBvfSBhbmQKKyAgICAgKiBkZXRlcm1pbmVzIGlmIGJvdGggYXJlIGVxdWFsLiBUd28gVVJJIGluc3RhbmNlcyBhcmUgZXF1YWwgaWYgYWxsIHNpbmdsZQorICAgICAqIHBhcnRzIGFyZSBpZGVudGljYWwgaW4gdGhlaXIgbWVhbmluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIFVSSSB0aGlzIGluc3RhbmNlIGhhcyB0byBiZSBjb21wYXJlZCB3aXRoLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJvdGggVVJJIGluc3RhbmNlcyBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgVVJJKSkgewpAQCAtMTAwNCwxMzYgKzExNDUsMTYyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZWNvZGVkIGF1dGhvcml0eSBwYXJ0IG9mIHRoaXMgVVJJLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgYXV0aG9yaXR5IHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhvcml0eSgpIHsKICAgICAgICAgcmV0dXJuIGRlY29kZShhdXRob3JpdHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZyYWdtZW50IGNvbXBvbmVudC4KKyAgICAgKiBHZXRzIHRoZSBkZWNvZGVkIGZyYWdtZW50IHBhcnQgb2YgdGhpcyBVUkkuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGZyYWdtZW50IHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEZyYWdtZW50KCkgewogICAgICAgICByZXR1cm4gZGVjb2RlKGZyYWdtZW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBob3N0IGNvbXBvbmVudC4KKyAgICAgKiBHZXRzIHRoZSBob3N0IHBhcnQgb2YgdGhpcyBVUkkuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBob3N0IHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CiAgICAgICAgIHJldHVybiBob3N0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdGggY29tcG9uZW50LgorICAgICAqIEdldHMgdGhlIGRlY29kZWQgcGF0aCBwYXJ0IG9mIHRoaXMgVVJJLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCBwYXRoIHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CiAgICAgICAgIHJldHVybiBkZWNvZGUocGF0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9ydCBudW1iZXIuCisgICAgICogR2V0cyB0aGUgcG9ydCBudW1iZXIgb2YgdGhpcyBVUkkuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IG51bWJlciBvciB7QGNvZGUgLTF9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CiAgICAgICAgIHJldHVybiBwb3J0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHF1ZXJ5IGNvbXBvbmVudC4KKyAgICAgKiBHZXRzIHRoZSBkZWNvZGVkIHF1ZXJ5IHBhcnQgb2YgdGhpcyBVUkkuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHF1ZXJ5IHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5KCkgewogICAgICAgICByZXR1cm4gZGVjb2RlKHF1ZXJ5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdHkgY29tcG9uZW50IGluIHJhdyBmb3JtLgorICAgICAqIEdldHMgdGhlIGF1dGhvcml0eSBwYXJ0IG9mIHRoaXMgVVJJIGluIHJhdyBmb3JtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBhdXRob3JpdHkgcGFydCBvciB7QGNvZGUgbnVsbH0gaWYgdW5kZWZpbmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmF3QXV0aG9yaXR5KCkgewogICAgICAgICByZXR1cm4gYXV0aG9yaXR5OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZyYWdtZW50IGNvbXBvbmVudCBpbiByYXcgZm9ybS4KKyAgICAgKiBHZXRzIHRoZSBmcmFnbWVudCBwYXJ0IG9mIHRoaXMgVVJJIGluIHJhdyBmb3JtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBmcmFnbWVudCBwYXJ0IG9yIHtAY29kZSBudWxsfSBpZiB1bmRlZmluZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSYXdGcmFnbWVudCgpIHsKICAgICAgICAgcmV0dXJuIGZyYWdtZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdGggY29tcG9uZW50IGluIHJhdyBmb3JtLgorICAgICAqIEdldHMgdGhlIHBhdGggcGFydCBvZiB0aGlzIFVSSSBpbiByYXcgZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgcGF0aCBwYXJ0IG9yIHtAY29kZSBudWxsfSBpZiB1bmRlZmluZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSYXdQYXRoKCkgewogICAgICAgICByZXR1cm4gcGF0aDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBxdWVyeSBjb21wb25lbnQgaW4gcmF3IGZvcm0uCisgICAgICogR2V0cyB0aGUgcXVlcnkgcGFydCBvZiB0aGlzIFVSSSBpbiByYXcgZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgcXVlcnkgcGFydCBvciB7QGNvZGUgbnVsbH0gaWYgdW5kZWZpbmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmF3UXVlcnkoKSB7CiAgICAgICAgIHJldHVybiBxdWVyeTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWUtc3BlY2lmaWMgcGFydCBjb21wb25lbnQgaW4gcmF3IGZvcm0uCisgICAgICogR2V0cyB0aGUgc2NoZW1lLXNwZWNpZmljIHBhcnQgb2YgdGhpcyBVUkkgaW4gcmF3IGZvcm0uCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHNjaGVtZS1zcGVjaWZpYyBwYXJ0IG9yIHtAY29kZSBudWxsfSBpZiB1bmRlZmluZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSYXdTY2hlbWVTcGVjaWZpY1BhcnQoKSB7CiAgICAgICAgIHJldHVybiBzY2hlbWVzcGVjaWZpY3BhcnQ7CiAgICAgfQotCisgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXNlci1pbmZvIGNvbXBvbmVudCBpbiByYXcgZm9ybS4KKyAgICAgKiBHZXRzIHRoZSB1c2VyLWluZm8gcGFydCBvZiB0aGlzIFVSSSBpbiByYXcgZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgdXNlci1pbmZvIHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFJhd1VzZXJJbmZvKCkgewogICAgICAgICByZXR1cm4gdXNlcmluZm87CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1lLgorICAgICAqIEdldHMgdGhlIHNjaGVtZSBwYXJ0IG9mIHRoaXMgVVJJLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICogQHJldHVybiB0aGUgc2NoZW1lIHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKICAgICAgICAgcmV0dXJuIHNjaGVtZTsKICAgICB9Ci0KKyAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWUtc3BlY2lmaWMgcGFydCBjb21wb25lbnQuCisgICAgICogR2V0cyB0aGUgZGVjb2RlZCBzY2hlbWUtc3BlY2lmaWMgcGFydCBvZiB0aGlzIFVSSS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgc2NoZW1lLXNwZWNpZmljIHBhcnQgb3Ige0Bjb2RlIG51bGx9IGlmIHVuZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZVNwZWNpZmljUGFydCgpIHsKICAgICAgICAgcmV0dXJuIGRlY29kZShzY2hlbWVzcGVjaWZpY3BhcnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXJpbmZvLgorICAgICAqIEdldHMgdGhlIGRlY29kZWQgdXNlci1pbmZvIHBhcnQgb2YgdGhpcyBVUkkuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHVzZXItaW5mbyBwYXJ0IG9yIHtAY29kZSBudWxsfSBpZiB1bmRlZmluZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVc2VySW5mbygpIHsKICAgICAgICAgcmV0dXJuIGRlY29kZSh1c2VyaW5mbyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaGFzaGNvZGUgdmFsdWUgb2YgdGhpcyBVUkkgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaGFzaGNvZGUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKQEAgLTExNDMsMTggKzEzMTAsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIFVSSSBpcyBhYnNvbHV0ZQorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgVVJJIGlzIGFic29sdXRlLCB3aGljaCBtZWFucyB0aGF0IGEgc2NoZW1lIHBhcnQgaXMKKyAgICAgKiBkZWZpbmVkIGluIHRoaXMgVVJJLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgVVJJIGlzIGFic29sdXRlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic29sdXRlKCkgewogICAgICAgICByZXR1cm4gYWJzb2x1dGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBVUkkgaXMgb3BhcXVlCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBVUkkgaXMgb3BhcXVlIG9yIG5vdC4gQW4gb3BhcXVlIFVSSSBpcyBhYnNvbHV0ZQorICAgICAqIGFuZCBoYXMgYSBzY2hlbWUtc3BlY2lmaWMgcGFydCB3aGljaCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgc2xhc2gKKyAgICAgKiBjaGFyYWN0ZXIuIEFsbCBwYXJ0cyBleGNlcHQgc2NoZW1lLCBzY2hlbWUtc3BlY2lmaWMgYW5kIGZyYWdtZW50IGFyZQorICAgICAqIHVuZGVmaW5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSBpcyBvcGFxdWUsIG90aGVyd2lzZSBmYWxzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBVUkkgaXMgb3BhcXVlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKICAgICAgICAgcmV0dXJuIG9wYXF1ZTsKQEAgLTEyNDksNiArMTQyMiwxMyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZXMgdGhlIHBhdGggcGFydCBvZiB0aGlzIFVSSS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIFVSSSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGlzIGluc3RhbmNlIHdpdGggYSBub3JtYWxpemVkCisgICAgICogICAgICAgICBwYXRoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBVUkkgbm9ybWFsaXplKCkgewogICAgICAgICBpZiAob3BhcXVlKSB7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKQEAgLTEyNjcsOSArMTQ0NywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGlzIHVyaSBpbnN0YW5jZSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRldGVybWluZWQgYXMgYQotICAgICAqIFNlcnZlckF1dGhvcml0eSBPdGhlcndpc2UgdHJ5IHRvIHBhcnNlIGl0IGFnYWluIGFzIGEgc2VydmVyIGF1dGhvcml0eSB0bwotICAgICAqIHByb2R1Y2UgYSBVUklTeW50YXhFeGNlcHRpb24gd2l0aCB0aGUgcHJvcGVyIGRpYWdub3N0aWMgbWVzc2FnZS4KKyAgICAgKiBUcmllcyB0byBwYXJzZSB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBvZiB0aGlzIFVSSSB0byBkaXZpZGUgaXQgaW50byB0aGUKKyAgICAgKiBob3N0LCBwb3J0LCBhbmQgdXNlci1pbmZvLiBJZiB0aGlzIFVSSSBpcyBhbHJlYWR5IGRldGVybWluZWQgYXMgYQorICAgICAqIFNlcnZlckF1dGhvcml0eSB0aGlzIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQgd2l0aG91dCBjaGFuZ2VzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwYXJzZWQgc2VydmVyIGF1dGhvcml0eS4KKyAgICAgKiBAdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhdXRob3JpdHkgcGFydCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgc2VydmVyLWJhc2VkCisgICAgICogICAgICAgICAgICAgYXV0aG9yaXR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkkgcGFyc2VTZXJ2ZXJBdXRob3JpdHkoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFzZXJ2ZXJBdXRob3JpdHkpIHsKQEAgLTEyNzgsNiArMTQ2NCwxNSBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgZ2l2ZW4gVVJJIHtAY29kZSByZWxhdGl2ZX0gdG8gYSByZWxhdGl2ZSBVUkkgYWdhaW5zdCB0aGUgVVJJCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkkgd2hpY2ggaGFzIHRvIGJlIHJlbGF0aXZpemVkIGFnYWluc3QgdGhpcyBVUkkuCisgICAgICogQHJldHVybiB0aGUgcmVsYXRpdmUgVVJJLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBVUkkgcmVsYXRpdml6ZShVUkkgcmVsYXRpdmUpIHsKICAgICAgICAgaWYgKHJlbGF0aXZlLm9wYXF1ZSB8fCBvcGFxdWUpIHsKICAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZTsKQEAgLTEzMjQsNiArMTUxOSwxNSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkge0Bjb2RlIHJlbGF0aXZlfSBhZ2FpbnN0IHRoZSBVUkkgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZWxhdGl2ZQorICAgICAqICAgICAgICAgICAgdGhlIFVSSSB3aGljaCBoYXMgdG8gYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGlzIFVSSS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBVUkkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFVSSSByZXNvbHZlKFVSSSByZWxhdGl2ZSkgewogICAgICAgICBpZiAocmVsYXRpdmUuYWJzb2x1dGUgfHwgb3BhcXVlKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVsYXRpdmU7CkBAIC0xMzk0LDYgKzE1OTgsMTcgQEAKICAgICAgICAgc3RyaW5nID0gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFVSSSBpbnN0YW5jZSBieSBwYXJzaW5nIHRoZSBnaXZlbiBzdHJpbmcge0Bjb2RlIHJlbGF0aXZlfQorICAgICAqIGFuZCByZXNvbHZlcyB0aGUgY3JlYXRlZCBVUkkgYWdhaW5zdCB0aGUgVVJJIHJlcHJlc2VudGVkIGJ5IHRoaXMKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBzdHJpbmcgdG8gY3JlYXRlIHRoZSBuZXcgVVJJIGluc3RhbmNlIHdoaWNoIGhhcyB0bworICAgICAqICAgICAgICAgICAgYmUgcmVzb2x2ZWQgbGF0ZXIgb24uCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBhbmQgcmVzb2x2ZWQgVVJJLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBVUkkgcmVzb2x2ZShTdHJpbmcgcmVsYXRpdmUpIHsKICAgICAgICAgcmV0dXJuIHJlc29sdmUoY3JlYXRlKHJlbGF0aXZlKSk7CiAgICAgfQpAQCAtMTQzNCwxMCArMTY0OSwyMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVUkkgaW5zdGFuY2UgdXNpbmcgdGhlCisgICAgICogVVMtQVNDSUkgZW5jb2RpbmcuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgVVMtQVNDSUkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVJJLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9BU0NJSVN0cmluZygpIHsKICAgICAgICAgcmV0dXJuIGVuY29kZU90aGVycyh0b1N0cmluZygpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSSSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0dWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSSS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIHsKQEAgLTE1MjEsNiArMTc0OSwxNSBAQAogICAgICAgICByZXR1cm4gY29udmVydEhleFRvTG93ZXJDYXNlKHJlc3VsdC50b1N0cmluZygpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIFVSSSBpbnN0YW5jZSB0byBhIFVSTC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIFVSTCByZXByZXNlbnRpbmcgdGhlIHNhbWUgcmVzb3VyY2UgYXMgdGhpcyBVUkkuCisgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIFVSTCBvciBubyBwcm90b2NvbAorICAgICAqICAgICAgICAgICAgIGhhbmRsZXIgY291bGQgYmUgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFVSTCB0b1VSTCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewogICAgICAgICBpZiAoIWFic29sdXRlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMzEyIikgKyAiOiAiIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCkBAIC0xNTI5LDcgKzE3NjYsNyBAQAogICAgICAgICByZXR1cm4gbmV3IFVSTCh0b1N0cmluZygpKTsKICAgICB9CiAKLSAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CiAgICAgICAgIHRyeSB7CkBAIC0xNTM4LDcgKzE3NzUsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGNhbGwgdG9TdHJpbmcoKSB0byBlbnN1cmUgdGhlIHZhbHVlIG9mIHN0cmluZyBmaWVsZCBpcyBjYWxjdWxhdGVkCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJJRW5jb2RlckRlY29kZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUklFbmNvZGVyRGVjb2Rlci5qYXZhCmluZGV4IGRiMDcyOGQuLmE5ZWYzYzEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUklFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUklFbmNvZGVyRGVjb2Rlci5qYXZhCkBAIC0yMywxMSArMjMsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZzsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZW5jb2RlIGEgc3RyaW5nIHVzaW5nIHRoZSBmb3JtYXQgcmVxdWlyZWQgYnkKLSAqIDxjb2RlPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4gTUlNRSBjb250ZW50IHR5cGUuCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZW5jb2RlIGEgc3RyaW5nIHVzaW5nIHRoZSBmb3JtYXQgcmVxdWlyZWQgYnkge0Bjb2RlCisgKiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9IE1JTUUgY29udGVudCB0eXBlLiBJdCBjb250YWlucyBoZWxwZXIKKyAqIG1ldGhvZHMgdXNlZCBieSB0aGUgVVJJIGNsYXNzLCBhbmQgcGVyZm9ybXMgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGluIGEKKyAqIHNsaWdodGx5IGRpZmZlcmVudCB3YXkgdGhhbiB7QGNvZGUgVVJMRW5jb2Rlcn0gYW5kIHtAY29kZSBVUkxEZWNvZGVyfS4KICAqIAotICogSXQgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdXNlZCBieSB0aGUgVVJJIGNsYXNzLCBhbmQgcGVyZm9ybXMgZW5jb2RpbmcgYW5kCi0gKiBkZWNvZGluZyBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCB3YXkgdGhhbiBVUkxFbmNvZGVyIGFuZCBVUkxEZWNvZGVyLgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIGNsYXNzIFVSSUVuY29kZXJEZWNvZGVyIHsKIApAQCAtMzcsMTkgKzM4LDE4IEBACiAKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZSBhIHN0cmluZyBieSBjaGVja2luZyBpZiBpdCBjb250YWlucyBhbnkgY2hhcmFjdGVycyBvdGhlciB0aGFuOgotICAgICAqIAogICAgICAqIDEuIGxldHRlcnMgKCdhJy4uJ3onLCAnQScuLidaJykgMi4gbnVtYmVycyAoJzAnLi4nOScpIDMuIGNoYXJhY3RlcnMgaW4KLSAgICAgKiB0aGUgbGVnYWxzZXQgcGFyYW1ldGVyIDQuIG90aGVycyAoVW5pY29kZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBpbgorICAgICAqIHRoZSBsZWdhbHNldCBwYXJhbWV0ZXIgNC4gb3RoZXJzICh1bmljb2RlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluCiAgICAgICogVVMtQVNDSUkgc2V0LCBhbmQgYXJlIG5vdCBJU08gQ29udHJvbCBvciBhcmUgbm90IElTTyBTcGFjZSBjaGFyYWN0ZXJzKQogICAgICAqIDxwPgotICAgICAqIGNhbGxlZCBmcm9tIFVSSS5IZWxwZXIucGFyc2VVUkkoKSB0byB2YWxpZGF0ZSBlYWNoIGNvbXBvbmVudAotICAgICAqIDxwPgorICAgICAqIGNhbGxlZCBmcm9tIHtAY29kZSBVUkkuSGVscGVyLnBhcnNlVVJJKCl9IHRvIHZhbGlkYXRlIGVhY2ggY29tcG9uZW50CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCisgICAgICogICAgICAgICAgICB7QGNvZGUgamF2YS5sYW5nLlN0cmluZ30gdGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWQKICAgICAgKiBAcGFyYW0gbGVnYWwKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgU3RyaW5nIHMKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBqYXZhLmxhbmcuU3RyaW5nfSB0aGUgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHMKICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCB2YWxpZGF0ZShTdHJpbmcgcywgU3RyaW5nIGxlZ2FsKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOykgewpAQCAtMTAwLDEyICsxMDAsMTMgQEAKICAgICAgKiBieSAnJScuCiAgICAgICogPHA+CiAgICAgICogRm9yIGV4YW1wbGU6ICcjJyAtPiAlMjMKLSAgICAgKiA8cD4KLSAgICAgKiBPdGhlciBjaGFyYWN0ZXJzLCB3aGljaCBhcmUgVW5pY29kZSBjaGFycyB0aGF0IGFyZSBub3QgVVMtQVNDSUksIGFuZCBhcmUKKyAgICAgKiA8L3A+CisgICAgICogT3RoZXIgY2hhcmFjdGVycywgd2hpY2ggYXJlIHVuaWNvZGUgY2hhcnMgdGhhdCBhcmUgbm90IFVTLUFTQ0lJLCBhbmQgYXJlCiAgICAgICogbm90IElTTyBDb250cm9sIG9yIGFyZSBub3QgSVNPIFNwYWNlIGNoYXJzLCBhcmUgcHJlc2VydmVkLgogICAgICAqIDxwPgotICAgICAqIENhbGxlZCBmcm9tIFVSSS5xdW90ZUNvbXBvbmVudCgpIChmb3IgbXVsdGlwbGUgYXJndW1lbnQgY29uc3RydWN0b3JzKQotICAgICAqIDxwPgorICAgICAqIENhbGxlZCBmcm9tIHtAY29kZSBVUkkucXVvdGVDb21wb25lbnQoKX0gKGZvciBtdWx0aXBsZSBhcmd1bWVudAorICAgICAqIGNvbnN0cnVjdG9ycykKKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHMKICAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKQEAgLTE0NCw5ICsxNDUsOSBAQAogICAgICAqIGNvbnZlcnRlZCBpbnRvIHRoZWlyIGhleGlkZWNpbWFsIHZhbHVlIHByZXBlbmRlZCBieSAnJScuCiAgICAgICogPHA+CiAgICAgICogRm9yIGV4YW1wbGU6IEV1cm8gY3VycmVuY3kgc3ltYm9sIC0+ICIlRTIlODIlQUMiLgotICAgICAqIDxwPgorICAgICAqIDwvcD4KICAgICAgKiBDYWxsZWQgZnJvbSBVUkkudG9BU0NJSVN0cmluZygpCi0gICAgICogPHA+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCiAgICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCkBAIC0xNzEsMTkgKzE3MiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlY29kZXMgdGhlIHN0cmluZyBhcmd1bWVudCB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gdGhlCi0gICAgICogPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPiBNSU1FIGNvbnRlbnQgdHlwZSB1c2luZyB0aGUgVVRGLTgKLSAgICAgKiBlbmNvZGluZyBzY2hlbWUuCisgICAgICogRGVjb2RlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCBpbiB0aGUge0Bjb2RlCisgICAgICogeC13d3ctZm9ybS11cmxlbmNvZGVkfSBNSU1FIGNvbnRlbnQgdHlwZSB1c2luZyB0aGUgVVRGLTggZW5jb2Rpbmcgc2NoZW1lLgogICAgICAqIDxwPgotICAgICAqICclJyBhbmQgdHdvIGZvbGxvd2luZyBoZXggZGlnaXQgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvIHRoZQorICAgICAqJyUnIGFuZCB0d28gZm9sbG93aW5nIGhleCBkaWdpdCBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlCiAgICAgICogZXF1aXZhbGVudCBieXRlIHZhbHVlLiBBbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcGFzc2VkIHRocm91Z2gKICAgICAgKiB1bm1vZGlmaWVkLgotICAgICAqIAotICAgICAqIDxwPgorICAgICAqIDwvcD4KICAgICAgKiBlLmcuICJBJTIwQiUyMEMgJTI0JTI1IiAtPiAiQSBCIEMgJCUiCiAgICAgICogPHA+CiAgICAgICogQ2FsbGVkIGZyb20gVVJJLmdldFhZWigpIG1ldGhvZHMKLSAgICAgKiA8cD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHMKICAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgVGhlIGVuY29kZWQgc3RyaW5nLgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbi5qYXZhCmluZGV4IDZlY2U4MmUuLmU3ZTMzMmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uLmphdmEKQEAgLTIwLDcgKzIwLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogUmVwcmVzZW50cyBhbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBvZiBhIFVSSS4KKyAqIEEge0Bjb2RlIFVSSVN5bnRheEV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgc29tZSBpbmZvcm1hdGlvbiBjb3VsZCBub3QgYmUgcGFyc2VkCisgKiB3aGlsZSBjcmVhdGluZyBhIFVSSS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBVUklTeW50YXhFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCkBAIC0zMSwxNyArMzQsMjIgQEAKICAgICBwcml2YXRlIGludCBpbmRleDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBVUklTeW50YXhFeGNlcHRpb24sIGNvbnRhaW5pbmcgdGhlIGlucHV0IHRoYXQgY2F1c2VkIHRoZQotICAgICAqIGV4Y2VwdGlvbiwgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSwgYW5kIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZXJyb3IKLSAgICAgKiBvY2N1cnJlZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBVUklTeW50YXhFeGNlcHRpb259IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlCisgICAgICogc3RyaW5nIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24sIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gYW5kIHRoZQorICAgICAqIGluZGV4IGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbi4KICAgICAgKiBAcGFyYW0gcmVhc29uCisgICAgICogICAgICAgICAgICB0aGUgcmVhc29uIHdoeSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBpbnB1dCBvciByZWFzb24gaXMgbnVsbAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgaW5kZXggPCAtMQorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgYXJndW1lbnRzIHtAY29kZSBpbnB1dH0gb3Ige0Bjb2RlIHJlYXNvbn0gaXMKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdmFsdWUgZm9yIHtAY29kZSBpbmRleH0gaXMgbGVzc2VyIHRoYW4ge0Bjb2RlIC0xfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJJU3ludGF4RXhjZXB0aW9uKFN0cmluZyBpbnB1dCwgU3RyaW5nIHJlYXNvbiwgaW50IGluZGV4KSB7CiAgICAgICAgIHN1cGVyKHJlYXNvbik7CkBAIC01OSwxNCArNjcsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVVJJU3ludGF4RXhjZXB0aW9uIGNvbnRhaW5pbmcgdGhlIHN0cmluZyB0aGF0IGNhdXNlZCB0aGUKLSAgICAgKiBleGNlcHRpb24gYW5kIGEgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVSSVN5bnRheEV4Y2VwdGlvbn0gaW5zdGFuY2UgY29udGFpbmluZyB0aGUKKyAgICAgKiBzdHJpbmcgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiBhbmQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKkBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSByZWFzb24KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgaW5wdXQgb3IgcmVhc29uIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWFzb24gd2h5IHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgYXJndW1lbnRzIHtAY29kZSBpbnB1dH0gb3Ige0Bjb2RlIHJlYXNvbn0gaXMKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSSVN5bnRheEV4Y2VwdGlvbihTdHJpbmcgaW5wdXQsIFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc3VwZXIocmVhc29uKTsKQEAgLTgwLDQwICs5MSw0NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBzeW50YXggZXJyb3Igd2FzIGZvdW5kLCBvciAtMSBpZiB0aGUgaW5kZXgKLSAgICAgKiBpcyB1bmtub3duL3VuYXZhaWxhYmxlLgorICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBzeW50YXggZXJyb3Igd2FzIGZvdW5kIG9yIHtAY29kZSAtMX0gaWYgdGhlCisgICAgICogaW5kZXggaXMgdW5rbm93bi91bmF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3ludGF4IGVycm9yCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHN5bnRheCBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgewogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzeW50YXggZXJyb3IgaW4gdGhlIFVSSSBzdHJpbmcKKyAgICAgKiBHZXRzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBlcnJvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHN5bnRheCBlcnJvcgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzeW50YXggZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7CiAgICAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU3RyaW5nIHRoYXQgY29udGFpbmVkIHRoZSBzeW50YXggZXJyb3IKKyAgICAgKiBHZXRzIHRoZSBpbml0aWFsIHN0cmluZyB0aGF0IGNvbnRhaW5zIGFuIGludmFsaWQgc3ludGF4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRJbnB1dCgpIHsKICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXhjZXB0aW9uLCBpbmNsdWRpbmcgdGhlIHJlYXNvbiwgdGhlIHN0cmluZwotICAgICAqIHRoYXQgaGFkIHRoZSBzeW50YXggZXJyb3IsIGFuZCB0aGUgaW5kZXggb2YgdGhlIHN5bnRheCBlcnJvciBpZgorICAgICAqIEdldHMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXhjZXB0aW9uLCBpbmNsdWRpbmcgdGhlIHJlYXNvbiwgdGhlIHN0cmluZworICAgICAqIHRoYXQgY2F1c2VkIHRoZSBzeW50YXggZXJyb3IgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3ludGF4IGVycm9yIGlmCiAgICAgICogYXZhaWxhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gYSBzdGluZyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI2dldE1lc3NhZ2UoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkwuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkwuamF2YQppbmRleCBjNzI2ZTQ4Li4yYmM4YzZjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTC5qYXZhCkBAIC0yOSw4ICsyOSwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVXRpbDsKIAogLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBjbGFzcyBVUkwgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBhIHJlc291cmNlIG9uIHRoZSB3b3JsZAotICogd2lkZSB3ZWIgYXMgc3BlY2lmaWVkIGJ5IFJGQyAxNzM4LgorICogQSBVUkwgaW5zdGFuY2Ugc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBhIHJlc291cmNlIG9uIHRoZSBpbnRlcm5ldCBhcworICogc3BlY2lmaWVkIGJ5IFJGQyAxNzM4LiBTdWNoIGEgcmVzb3VyY2UgY2FuIGJlIGEgc2ltcGxlIGZpbGUgb3IgYSBzZXJ2aWNlCisgKiB3aGljaCBnZW5lcmF0ZXMgdGhlIG91dHB1dCBkeW5hbWljYWxseS4gQSBVUkwgaXMgZGl2aWRlZCBpbiBpdHMgcGFydHMKKyAqIHByb3RvY29sLCBob3N0IG5hbWUsIHBvcnQsIHBhdGgsIGZpbGUsIHVzZXItaW5mbywgcXVlcnksIHJlZmVyZW5jZSBhbmQKKyAqIGF1dGhvcml0eS4gSG93ZXZlciwgbm90IGVhY2ggb2YgdGhpcyBwYXJ0cyBoYXMgdG8gYmUgZGVmaW5lZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBVUkwgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2Mjc2Mjk2ODgzNjE1MjQxMTBMOwpAQCAtMTE5LDE1ICsxMjQsMTggQEAKICAgICBwcml2YXRlIHN0YXRpYyBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSBzdHJlYW1IYW5kbGVyRmFjdG9yeTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFVSTCBTdHJlYW0gKHByb3RvY29sKSBoYW5kbGVyIGZhY3RvcnkuIFRoaXMgbWV0aG9kIGNhbiBiZQotICAgICAqIGludm9rZWQgb25seSBvbmNlIGR1cmluZyBhbiBhcHBsaWNhdGlvbidzIGxpZmV0aW1lLgorICAgICAqIFNldHMgdGhlIHtAY29kZSBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeX0gd2hpY2ggY3JlYXRlcyBwcm90b2NvbCBzcGVjaWZpYworICAgICAqIHN0cmVhbSBoYW5kbGVycy4gVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgb25seSBvbmNlIGR1cmluZyBhbgorICAgICAqIGFwcGxpY2F0aW9uJ3MgbGlmZXRpbWUuIElmIHRoZSB7QGNvZGUgVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnl9IGlzIGFscmVhZHkKKyAgICAgKiBzZXQgYW4ge0BsaW5rIEVycm9yfSB3aWxsIGJlIHRocm93bi4KICAgICAgKiA8cD4KLSAgICAgKiBBIHNlY3VyaXR5IGNoZWNrIGlzIHBlcmZvcm1lZCB0byB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCBQb2xpY3kgYWxsb3dzCi0gICAgICogdGhlIHN0cmVhbSBoYW5kbGVyIGZhY3RvcnkgdG8gYmUgc2V0LgorICAgICAqIEEgc2VjdXJpdHkgY2hlY2sgaXMgcGVyZm9ybWVkIHRvIHZlcmlmeSB3aGV0aGVyIHRoZSBjdXJyZW50IHBvbGljeSBhbGxvd3MKKyAgICAgKiB0byBzZXQgdGhlIHN0cmVhbSBoYW5kbGVyIGZhY3RvcnkuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJlYW1GYWN0b3J5Ci0gICAgICogICAgICAgICAgICBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSBUaGUgZmFjdG9yeSB0byB1c2UgZm9yIGZpbmRpbmcgc3RyZWFtCi0gICAgICogICAgICAgICAgICBoYW5kbGVycy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHN0cmVhbSBwcm90b2NvbCBoYW5kbGVycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5KAogICAgICAgICAgICAgVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnkgc3RyZWFtRmFjdG9yeSkgewpAQCAtMTQzLDkwICsxNTEsNTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFVSTCBpbnN0YW5jZSBieSBwYXJzaW5nIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAqIENyZWF0ZXMgYSBuZXcgVVJMIGluc3RhbmNlIGJ5IHBhcnNpbmcgdGhlIHN0cmluZyB7QGNvZGUgc3BlY30uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNwZWMKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYSBVUkwgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdoaWNoIGhhcyB0byBiZSBwYXJzZWQuCiAgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlYyBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGFuIFVSTC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gc3RyaW5nIHtAY29kZSBzcGVjfSBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEKKyAgICAgKiAgICAgICAgICAgICBVUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTChTdHJpbmcgc3BlYykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoKFVSTCkgbnVsbCwgc3BlYywgKFVSTFN0cmVhbUhhbmRsZXIpIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVVJMIGJ5IHBhcnNpbmcgdGhlIHNwZWNpZmljYXRpb24gZ2l2ZW4gYnkKLSAgICAgKiA8Y29kZT5zcGVjPC9jb2RlPiBhbmQgdXNpbmcgdGhlIGNvbnRleHQgcHJvdmlkZWQgYnkKLSAgICAgKiA8Y29kZT5jb250ZXh0PC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdG9jb2wgb2YgdGhlIHNwZWNpZmljYXRpb24gaXMgb2J0YWluZWQgYnkgcGFyc2luZyB0aGUKLSAgICAgKiA8Y29kZT4gc3BlYyA8L2NvZGU+IHN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgPGNvZGU+c3BlYzwvY29kZT4gZG9lcyBub3Qgc3BlY2lmeSBhIHByb3RvY29sOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+SWYgdGhlIGNvbnRleHQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYQotICAgICAqIDxjb2RlPk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjwvY29kZT4uPC9saT4KLSAgICAgKiA8bGk+SWYgdGhlIGNvbnRleHQgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBwcm90b2NvbCBpcwotICAgICAqIG9idGFpbmVkIGZyb20gdGhlIGNvbnRleHQuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIElmIHRoZSA8Y29kZT5zcGVjPC9jb2RlPiBkb2VzIHNwZWNpZnkgYSBwcm90b2NvbDoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPklmIHRoZSBjb250ZXh0IGlzIDxjb2RlPm51bGw8L2NvZGU+LCBvciBzcGVjaWZpZXMgYSBkaWZmZXJlbnQKLSAgICAgKiBwcm90b2NvbCB0aGFuIHRoZSBzcGVjLCB0aGUgY29udGV4dCBpcyBpZ25vcmVkLjwvbGk+Ci0gICAgICogPGxpPklmIHRoZSBjb250ZXh0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgc3BlY2lmaWVzIHRoZSBzYW1lCi0gICAgICogcHJvdG9jb2wgYXMgdGhlIHNwZWNpZmljYXRpb24sIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgPGNvZGU+VVJMPC9jb2RlPgotICAgICAqIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBjb250ZXh0LjwvbGk+Ci0gICAgICogPC91bD4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IFVSTCB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHtAY29kZSBzcGVjfS4gVGhpcyBVUkwgaXMKKyAgICAgKiByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4ge0Bjb2RlIGNvbnRleHR9LiBJZiB0aGUgcHJvdG9jb2wgb2YgdGhlIHBhcnNlZCBVUkwKKyAgICAgKiBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBwcm90b2NvbCBvZiB0aGUgY29udGV4dCBVUkwsIHRoZW4gdGhlIG5ld2x5CisgICAgICogY3JlYXRlZCBVUkwgaXMgYWJzb2x1dGUgYW5kIGJhc2VzIG9ubHkgb24gdGhlIGdpdmVuIFVSTCByZXByZXNlbnRlZCBieQorICAgICAqIHtAY29kZSBzcGVjfS4gT3RoZXJ3aXNlIHRoZSBwcm90b2NvbCBpcyBkZWZpbmVkIGJ5IHRoZSBjb250ZXh0IFVSTC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMIFVSTCB0byB1c2UgYXMgY29udGV4dC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgd2hpY2ggaXMgdXNlZCBhcyB0aGUgY29udGV4dC4KICAgICAgKiBAcGFyYW0gc3BlYwotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhIFVSTCBzcGVjaWZpY2F0aW9uLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIFVSTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2hpY2ggaGFzIHRvIGJlIHBhcnNlZC4KICAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjIGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYW4gVVJMLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBzdHJpbmcge0Bjb2RlIHNwZWN9IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYSBVUkwKKyAgICAgKiAgICAgICAgICAgICBvciBhbiBpbnZhbGlkIHByb3RvY29sIGhhcyBiZWVuIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkwoVVJMIGNvbnRleHQsIFN0cmluZyBzcGVjKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCBzcGVjLCAoVVJMU3RyZWFtSGFuZGxlcikgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBVUkwgYnkgcGFyc2luZyB0aGUgc3BlY2lmaWNhdGlvbiBnaXZlbiBieQotICAgICAqIDxjb2RlPnNwZWM8L2NvZGU+IGFuZCB1c2luZyB0aGUgY29udGV4dCBwcm92aWRlZCBieQotICAgICAqIDxjb2RlPmNvbnRleHQ8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBoYW5kbGVyIGFyZ3VtZW50IGlzIG5vbi1udWxsLCBhIHNlY3VyaXR5IGNoZWNrIGlzIG1hZGUgdG8gdmVyaWZ5Ci0gICAgICogdGhhdCB1c2VyLWRlZmluZWQgcHJvdG9jb2wgaGFuZGxlcnMgY2FuIGJlIHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdG9jb2wgb2YgdGhlIHNwZWNpZmljYXRpb24gaXMgb2J0YWluZWQgYnkgcGFyc2luZyB0aGUKLSAgICAgKiA8Y29kZT4gc3BlYyA8L2NvZGU+IHN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgPGNvZGU+c3BlYzwvY29kZT4gZG9lcyBub3Qgc3BlY2lmeSBhIHByb3RvY29sOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+SWYgdGhlIGNvbnRleHQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYQotICAgICAqIDxjb2RlPk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjwvY29kZT4uPC9saT4KLSAgICAgKiA8bGk+SWYgdGhlIGNvbnRleHQgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBwcm90b2NvbCBpcwotICAgICAqIG9idGFpbmVkIGZyb20gdGhlIGNvbnRleHQuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIElmIHRoZSA8Y29kZT5zcGVjPC9jb2RlPiBkb2VzIHNwZWNpZnkgYSBwcm90b2NvbDoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPklmIHRoZSBjb250ZXh0IGlzIDxjb2RlPm51bGw8L2NvZGU+LCBvciBzcGVjaWZpZXMgYSBkaWZmZXJlbnQKLSAgICAgKiBwcm90b2NvbCB0aGFuIHRoZSBzcGVjLCB0aGUgY29udGV4dCBpcyBpZ25vcmVkLjwvbGk+Ci0gICAgICogPGxpPklmIHRoZSBjb250ZXh0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgc3BlY2lmaWVzIHRoZSBzYW1lCi0gICAgICogcHJvdG9jb2wgYXMgdGhlIHNwZWNpZmljYXRpb24sIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgPGNvZGU+VVJMPC9jb2RlPgotICAgICAqIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBjb250ZXh0LjwvbGk+Ci0gICAgICogPC91bD4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IFVSTCB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHtAY29kZSBzcGVjfS4gVGhpcyBVUkwgaXMKKyAgICAgKiByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4ge0Bjb2RlIGNvbnRleHR9LiBUaGUge0Bjb2RlIGhhbmRsZXJ9IHdpbGwgYmUgdXNlZAorICAgICAqIHRvIHBhcnNlIHRoZSBVUkwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBJZiB0aGlzIGFyZ3VtZW50IGlzIHtAY29kZSBudWxsfQorICAgICAqIHRoZSBkZWZhdWx0IHtAY29kZSBVUkxTdHJlYW1IYW5kbGVyfSB3aWxsIGJlIHVzZWQuIElmIHRoZSBwcm90b2NvbCBvZiB0aGUKKyAgICAgKiBwYXJzZWQgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHByb3RvY29sIG9mIHRoZSBjb250ZXh0IFVSTCwgdGhlbiB0aGUKKyAgICAgKiBuZXdseSBjcmVhdGVkIFVSTCBpcyBhYnNvbHV0ZSBhbmQgYmFzZXMgb25seSBvbiB0aGUgZ2l2ZW4gVVJMIHJlcHJlc2VudGVkCisgICAgICogYnkge0Bjb2RlIHNwZWN9LiBPdGhlcndpc2UgdGhlIHByb3RvY29sIGlzIGRlZmluZWQgYnkgdGhlIGNvbnRleHQgVVJMLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5VUkwgVVJMIHRvIHVzZSBhcyBjb250ZXh0LgorICAgICAqICAgICAgICAgICAgdGhlIFVSTCB3aGljaCBpcyB1c2VkIGFzIHRoZSBjb250ZXh0LgogICAgICAqIEBwYXJhbSBzcGVjCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGEgVVJMIHNwZWNpZmljYXRpb24uCisgICAgICogICAgICAgICAgICB0aGUgVVJMIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aGljaCBoYXMgdG8gYmUgcGFyc2VkLgogICAgICAqIEBwYXJhbSBoYW5kbGVyCi0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyIGEgVVJMU3RyZWFtSGFuZGxlci4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpYyBzdHJlYW0gaGFuZGxlciB0byBiZSB1c2VkIGJ5IHRoaXMgVVJMLgogICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWMgY291bGQgbm90IGJlIHBhcnNlZCBhcyBhbiBVUkwKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gc3RyaW5nIHtAY29kZSBzcGVjfSBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEgVVJMCisgICAgICogICAgICAgICAgICAgb3IgYW4gaW52YWxpZCBwcm90b2NvbCBoYXMgYmVlbiBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMKFVSTCBjb250ZXh0LCBTdHJpbmcgc3BlYywgVVJMU3RyZWFtSGFuZGxlciBoYW5kbGVyKQogICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CkBAIC0yNTksOCArMjM1LDIwIEBACiAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFJGQyAyMzk2IHNjaGVtZSBwYXJ0IHNob3VsZCBtYXRjaAogICAgICAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbjoKICAgICAgICAgICAgICAgICAvLyBhbHBoYSAqKCBhbHBoYSB8IGRpZ2l0IHwgIisiIHwgIi0iIHwgIi4iICkKLSAgICAgICAgICAgICAgICBpZiAoIXByb3RvY29sLm1hdGNoZXMoIlxcQVxccHtBbHBoYX1bXFxwe0FsbnVtfSstLl0qXFx6IikgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wuaW5kZXhPZignLycpID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciB2ZXJzaW9uIG9mIGhhcm1vbnkKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBwcm90b2NvbC5jaGFyQXQoMCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZCA9ICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwgKCdBJyA8PSBjICYmIGMgPD0gJ1onKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgdmFsaWQgJiYgKGkgPCBwcm90b2NvbC5sZW5ndGgoKSk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjID0gcHJvdG9jb2wuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9ICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjID09ICcrJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA9PSAnLScpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPT0gJy4nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI2OCw2ICsyNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBTY2hlbWUgaXMgZGVmaW5lZCBieSBBU0NJSSBjaGFyYWN0ZXJzLgogICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IFV0aWwudG9BU0NJSUxvd2VyQ2FzZShwcm90b2NvbCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMzcsMTcgKzMyNiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVVJMIGluc3RhbmNlIHVzaW5nIHRoZSBhcmd1bWVudHMgcHJvdmlkZWQuCisgICAgICogQ3JlYXRlcyBhIG5ldyBVUkwgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cy4gVGhlIFVSTCB1c2VzIHRoZQorICAgICAqIGRlZmF1bHQgcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgcHJvdG9jb2wgZm9yIHRoZSBVUkwuCisgICAgICogICAgICAgICAgICB0aGUgcHJvdG9jb2wgb2YgdGhlIG5ldyBVUkwuCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgaG9zdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgbmV3IFVSTC4KICAgICAgKiBAcGFyYW0gZmlsZQogICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlcnMgZG8gbm90IHJlcHJlc2VudCBhIHZhbGlkIFVSTC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29tYmluYXRpb24gb2YgYWxsIGFyZ3VtZW50cyBkbyBub3QgcmVwcmVzZW50IGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICBVUkwgb3IgdGhlIHByb3RvY29sIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTChTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBob3N0LCBTdHJpbmcgZmlsZSkKICAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewpAQCAtMzU1LDE5ICszNDYsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFVSTCBpbnN0YW5jZSB1c2luZyB0aGUgYXJndW1lbnRzIHByb3ZpZGVkLgorICAgICAqIENyZWF0ZXMgYSBuZXcgVVJMIGluc3RhbmNlIHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMuIFRoZSBVUkwgdXNlcyB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcG9ydCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHBvcnQgZm9yIHRoZSBnaXZlbiBwcm90b2NvbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgcHJvdG9jb2wgZm9yIHRoZSBVUkwuCisgICAgICogICAgICAgICAgICB0aGUgcHJvdG9jb2wgb2YgdGhlIG5ldyBVUkwuCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgaG9zdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgbmV3IFVSTC4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgaW50IHRoZSBwb3J0IG51bWJlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpYyBwb3J0IG51bWJlciBvZiB0aGUgVVJMLiB7QGNvZGUgLTF9IHJlcHJlc2VudHMgdGhlCisgICAgICogICAgICAgICAgICBkZWZhdWx0IHBvcnQgb2YgdGhlIHByb3RvY29sLgogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgogICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlcnMgZG8gbm90IHJlcHJlc2VudCBhIHZhbGlkIFVSTC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29tYmluYXRpb24gb2YgYWxsIGFyZ3VtZW50cyBkbyBub3QgcmVwcmVzZW50IGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICBVUkwgb3IgdGhlIHByb3RvY29sIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTChTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIGZpbGUpCiAgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKQEAgLTM3NSwyNCArMzY5LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBVUkwgaW5zdGFuY2UgdXNpbmcgdGhlIGFyZ3VtZW50cyBwcm92aWRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaGFuZGxlciBhcmd1bWVudCBpcyBub24tbnVsbCwgYSBzZWN1cml0eSBjaGVjayBpcyBtYWRlIHRvIHZlcmlmeQotICAgICAqIHRoYXQgdXNlci1kZWZpbmVkIHByb3RvY29sIGhhbmRsZXJzIGNhbiBiZSBzcGVjaWZpZWQuCisgICAgICogQ3JlYXRlcyBhIG5ldyBVUkwgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cy4gVGhlIFVSTCB1c2VzIHRoZQorICAgICAqIHNwZWNpZmllZCBwb3J0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhlIGdpdmVuIHByb3RvY29sLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqICAgICAgICAgICAgdGhlIHByb3RvY29sIGZvciB0aGUgVVJMLgorICAgICAqICAgICAgICAgICAgdGhlIHByb3RvY29sIG9mIHRoZSBuZXcgVVJMLgogICAgICAqIEBwYXJhbSBob3N0Ci0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgaG9zdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgbmV3IFVSTC4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyLgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmljIHBvcnQgbnVtYmVyIG9mIHRoZSBVUkwuIHtAY29kZSAtMX0gcmVwcmVzZW50cyB0aGUKKyAgICAgKiAgICAgICAgICAgIGRlZmF1bHQgcG9ydCBvZiB0aGUgcHJvdG9jb2wuCiAgICAgICogQHBhcmFtIGZpbGUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KICAgICAgKiBAcGFyYW0gaGFuZGxlcgotICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIHRoYXQgdGhpcyBVUkwgdXNlcy4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gaGFuZGxlciB0byBiZSB1c2VkIGJ5IHRoaXMgVVJMLgogICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlcnMgZG8gbm90IHJlcHJlc2VudCBhbiBVUkwuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCBhcmd1bWVudHMgZG8gbm90IHJlcHJlc2VudCBhIHZhbGlkCisgICAgICogICAgICAgICAgICAgVVJMIG9yIHRoZSBwcm90b2NvbCBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkwoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBmaWxlLAogICAgICAgICAgICAgVVJMU3RyZWFtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKQEAgLTQ3MSwyMyArNDY1LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvcGVydGllcyBvZiB0aGlzIFVSTCB1c2luZyB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLiBUaGlzIG1ldGhvZAotICAgICAqIGlzIHVzZWQgYm90aCB3aXRoaW4gdGhpcyBjbGFzcyBhbmQgYnkgdGhlIDxjb2RlPlVSTFN0cmVhbUhhbmRsZXI8L2NvZGU+Ci0gICAgICogY29kZS4KKyAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgVVJMIHVzaW5nIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuIE9ubHkgYQorICAgICAqIHtAY29kZSBVUkxTdHJlYW1IYW5kbGVyfSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHNldCBmaWVsZHMgb2YgdGhlCisgICAgICogZXhpc3RpbmcgVVJMIGluc3RhbmNlLiBBIFVSTCBpcyBnZW5lcmFsbHkgY29uc3RhbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHByb3RvY29sCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHByb3RvY29sLgorICAgICAqICAgICAgICAgICAgdGhlIHByb3RvY29sIHRvIGJlIHNldC4KICAgICAgKiBAcGFyYW0gaG9zdAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBob3N0IG5hbWUuCisgICAgICogICAgICAgICAgICB0aGUgaG9zdCBuYW1lIHRvIGJlIHNldC4KICAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwb3J0IG51bWJlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZmlsZSBjb21wb25lbnQuCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIHJlZgotICAgICAqICAgICAgICAgICAgdGhlIG5ldyByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHNlZSBVUkwKLSAgICAgKiBAc2VlIFVSTFN0cmVhbUhhbmRsZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgdG8gYmUgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldChTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIGZpbGUsCiAgICAgICAgICAgICBTdHJpbmcgcmVmKSB7CkBAIC01MDMsMTYgKzQ5NSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgc2FtZSBVUkwuIFR3byBVUkxzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgZmlsZSwgaG9zdCwgcG9ydCwKLSAgICAgKiBwcm90b2NvbCwgYW5kIHJlZmVyZW5jZSBjb21wb25lbnRzLgorICAgICAqIENvbXBhcmVzIHRoaXMgVVJMIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50IHtAY29kZSBvfSBhbmQKKyAgICAgKiBkZXRlcm1pbmVzIGlmIGJvdGggYXJlIGVxdWFsLiBUd28gVVJMIGluc3RhbmNlcyBhcmUgZXF1YWwgaWYgYWxsIHNpbmdsZQorICAgICAqIHBhcnRzIGFyZSBpZGVudGljYWwgaW4gdGhlaXIgbWVhbmluZy4gQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZQorICAgICAqIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIFVSTC4gVHdvIFVSTHMgYXJlCisgICAgICogZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGZpbGUsIGhvc3QsIHBvcnQsIHByb3RvY29sLCBhbmQgcmVmZXJlbmNlCisgICAgICogY29tcG9uZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbwotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBVUkwuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgVVJMLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgdGhpcyBpbnN0YW5jZSBoYXMgdG8gYmUgY29tcGFyZWQgd2l0aC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIGluc3RhbmNlcyByZXByZXNlbnRzIHRoZSBzYW1lIFVSTCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CkBAIC01MjksMjEgKzUyNCwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBhcmd1bWVudCByZWZlciB0byB0aGUgc2FtZSBmaWxlLiBBbGwKLSAgICAgKiBjb21wb25lbnRzIGV4Y2VwdCB0aGUgcmVmZXJlbmNlIGFyZSBjb21wYXJlZC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBVUkwgcmVmZXJzIHRvIHRoZSBzYW1lIHJlc291cmNlIGFzIHRoZSBnaXZlbgorICAgICAqIGFyZ3VtZW50IHtAY29kZSBvdGhlclVSTH0uIEFsbCBVUkwgY29tcG9uZW50cyBleGNlcHQgdGhlIHJlZmVyZW5jZSBmaWVsZAorICAgICAqIGFyZSBjb21wYXJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3RoZXJVUkwKLSAgICAgKiAgICAgICAgICAgIFVSTCB0byBjb21wYXJlIGFnYWluc3QuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzYW1lIHJlc291cmNlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJvdGggaW5zdGFuY2VzIHJlZmVyIHRvIHRoZSBzYW1lIHJlc291cmNlLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2FtZUZpbGUoVVJMIG90aGVyVVJMKSB7CiAgICAgICAgIHJldHVybiBzdHJtSGFuZGxlci5zYW1lRmlsZSh0aGlzLCBvdGhlclVSTCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBmb3IgdGhpcyBVUkwgb2JqZWN0LgorICAgICAqIEdldHMgdGhlIGhhc2hjb2RlIHZhbHVlIG9mIHRoaXMgVVJMIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2hjb2RlIGZvciBoYXNodGFibGUgaW5kZXhpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBoYXNoY29kZSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtNTYxLDggKzU2MCw4IEBACiAgICAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIHN0cmVhbSBoYW5kbGVyIHdpdGggdGhlIG5ldwogICAgICAqIG9uZS4gU2VuZGVycyBtdXN0IGNoZWNrIGlmIHRoZSBzdHJtSGFuZGxlciBpcyBudWxsIGJlZm9yZSBjYWxsaW5nIHRoZQogICAgICAqIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoaXMgYmVoYXZpb3IgKGEgc3BlZWQgb3B0aW1pemF0aW9uKS4KKyAgICAgKiA8L3A+CiAgICAgICovCi0KICAgICB2b2lkIHNldHVwU3RyZWFtSGFuZGxlcigpIHsKICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgY2FjaGVkIChwcmV2aW91c2x5IGxvb2tlZCB1cCkgaGFuZGxlciBmb3IKICAgICAgICAgLy8gdGhlIHJlcXVlc3RlZCBwcm90b2NvbC4KQEAgLTYwNyw3ICs2MDYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gTm8gb25lIGVsc2UgaGFzIHByb3ZpZGVkIGEgaGFuZGxlciwgc28gdHJ5IG91ciBpbnRlcm5hbCBvbmUuCi0gICAgICAgIAorCiAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC4iICsgcHJvdG9jb2wgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICsgIi5IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAogICAgICAgICB0cnkgewpAQCAtNjI0LDI3ICs2MjMsMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlIHJlZmVyZW5jZWQgYnkgdGhpcyBVUkwuCisgICAgICogR2V0cyB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2Ugd2hpY2ggaXMgcmVmZXJyZWQgYnkgdGhpcyBVUkwuIEJ5CisgICAgICogZGVmYXVsdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBvYmplY3QgdHlwZXMgd2lsbCBiZSByZXR1cm5lZDoKKyAgICAgKiA8cD4KKyAgICAgKiA8bGk+SW1hZ2UgZm9yIHBpY3R1cmVzPC9saT4KKyAgICAgKiA8bGk+QXVkaW9DbGlwIGZvciBhdWRpbyBzZXF1ZW5jZXM8L2xpPgorICAgICAqIDxsaT57QGxpbmsgSW5wdXRTdHJlYW19IGZvciBhbGwgb3RoZXIgZGF0YTwvbGk+CisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCBvZiB0aGUgcmVzb3VyY2UgcG9pbnRlZCBieSB0aGlzIFVSTC4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSByZWZlcnJlZCByZXNvdXJjZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgb2J0YWluaW5nIHRoZSBjb250ZW50LgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBvYnRhaW5pbmcgdGhlIGNvbnRlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG9wZW5Db25uZWN0aW9uKCkuZ2V0Q29udGVudCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlZCBieSB0aGlzIFVSTC4KKyAgICAgKiBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZSB3aGljaCBpcyByZWZlcnJlZCBieSB0aGlzIFVSTC4gVGhlCisgICAgICogYXJndW1lbnQge0Bjb2RlIHR5cGVzfSBpcyBhbiBhcnJheSBvZiBhbGxvd2VkIG9yIGV4cGVjdGVkIG9iamVjdCB0eXBlcy4KKyAgICAgKiB7QGNvZGUgbnVsbH0gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgb2J0YWluZWQgb2JqZWN0IHR5cGUgZG9lcyBub3QgbWF0Y2gKKyAgICAgKiB3aXRoIG9uZSBmcm9tIHRoaXMgbGlzdC4gT3RoZXJ3aXNlIHRoZSBmaXJzdCB0eXBlIHRoYXQgbWF0Y2hlcyB3aWxsIGJlCisgICAgICogdXNlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGFjY2VwdGFibGUgY29udGVudCB0eXBlcwotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCBvZiB0aGUgcmVzb3VyY2UgcG9pbnRlZCBieSB0aGlzIFVSTCwgb3IgbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggYSBzcGVjaWZpZWQgY29udGVudCB0eXBlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYWxsb3dlZCBvciBleHBlY3RlZCBvYmplY3QgdHlwZXMuCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2UgcmVmZXJyZWQgYnkgdGhpcyBVUkwsCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgdGhlIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggdG8gYSBzcGVjaWZpZWQgY29udGVudAorICAgICAqICAgICAgICAgdHlwZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgb2J0YWluaW5nIHRoZSBjb250ZW50LgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBvYnRhaW5pbmcgdGhlIGNvbnRlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgLy8gUGFyYW0gbm90IGdlbmVyaWMgaW4gc3BlYwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtNjUzLDYwICs2NjMsNjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIGZvciByZWFkaW5nIGZyb20gdGhpcyBVUkwuCisgICAgICogT3BlbnMgYW4gSW5wdXRTdHJlYW0gdG8gcmVhZCB0aGUgcmVzb3VyY2UgcmVmZXJyZWQgYnkgdGhpcyBVUkwuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmVhbSBvbiB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0cmVhbSB3aGljaCBhbGxvd3MgdG8gcmVhZCB0aGUgcmVzb3VyY2UuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgc3RyZWFtIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBvcGVuaW5nIHRoZSBJbnB1dFN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgSW5wdXRTdHJlYW0gb3BlblN0cmVhbSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB0byB0aGlzIFVSTCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgUHJvdG9jb2xIYW5kbGVyLgorICAgICAqIE9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIHJlc291cmNlIHNwZWNpZmllZCBieSB0aGlzIFVSTC4gVGhpcworICAgICAqIGNvbm5lY3Rpb24gYWxsb3dzIGJpZGlyZWN0aW9uYWwgZGF0YSB0cmFuc2Zlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIHRvIHRoaXMgVVJMLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbm5lY3Rpb24gdG8gdGhpcyBVUkwuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBVUkwgaXMgbm90IHBvc3NpYmxlLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBvcGVuaW5nIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHN0cm1IYW5kbGVyLm9wZW5Db25uZWN0aW9uKHRoaXMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBVUkkgcmVsYXRlZCB3aXRoIHRoaXMgVVJMCisgICAgICogQ29udmVydHMgdGhpcyBVUkwgaW5zdGFuY2UgaW50byBhbiBlcXVpdmFsZW50IFVSSSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFVSSSByZWxhdGVkIHRvIHRoaXMgVVJMCisgICAgICogQHJldHVybiB0aGUgVVJJIGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyB0aGlzIFVSTC4KICAgICAgKiBAdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgVVJMIGNhbm5vdCBmb3JtYXQgaW50byBVUkkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIFVSTCBjYW5ub3QgYmUgY29udmVydGVkIGludG8gYSBVUkkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSSSB0b1VSSSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbmV3IFVSSSh0b0V4dGVybmFsRm9ybSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIDxjb2RlPm9wZW5Db25uZWN0aW9uKCk8L2NvZGU+IGV4Y2VwdCB0aGF0IGl0Ci0gICAgICogdXNlcyB0aGUgPGNvZGU+cHJveHk8L2NvZGU+IHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhpcyBVUkwgdXNpbmcKLSAgICAgKiBhcHByb3ByaWF0ZSBQcm90b2NvbEhhbmRsZXIuCisgICAgICogT3BlbnMgYSBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoaXMgVVJMLiBUaGUKKyAgICAgKiBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcHJveHkgYW5kIGFsbG93cworICAgICAqIGJpZGlyZWN0aW9uYWwgZGF0YSB0cmFuc2Zlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIHRvIHRoaXMgVVJMLgogICAgICAqIEBwYXJhbSBwcm94eQotICAgICAqICAgICAgICAgICAgdGhlIHByb3h5IHdoaWNoIGlzIHVzZWQgdG8gbWFrZSB0aGUgY29ubmVjdGlvbgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYW4gSU8gZXJyb3Igb2NjdXJzIGR1cmluZyBjb25uZWN0aW9uCi0gICAgICogICAgICAgICAgICAgICAgZXN0YWJsaXNobWVudAotICAgICAqIEBleGNlcHRpb24gU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCBhbmQgaXQgZGVuaWVzCi0gICAgICogICAgICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY29ubmVjdCB0byB0aGUgcHJveHkuCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgdGhlIHByb3h5IGlzIG51bGwgb3Igb2YgYW4gaW52YWxpZCB0eXBlLgotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB0aHJvd24gaWYgdGhlIHByb3RvY29sIGhhbmRsZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICBtZXRob2QuCisgICAgICogICAgICAgICAgICB0aGUgcHJveHkgdGhyb3VnaCB3aGljaCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkLgorICAgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIFVSTGNvbm5lY3Rpb24gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQorICAgICAqICAgICAgICAgY29ubmVjdGlvbiB0byB0aGlzIFVSTC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBvcGVuaW5nIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkIGFuZCBpdCBkZW5pZXMgdG8gY29ubmVjdAorICAgICAqICAgICAgICAgICAgIHRvIHRoZSBwcm94eS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBwcm94eSBpcyB7QGNvZGUgbnVsbH0gb3IgaXMgYW4gaW52YWxpZCB0eXBlLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdG9jb2wgaGFuZGxlciBkb2VzIG5vdCBzdXBwb3J0IG9wZW5pbmcgY29ubmVjdGlvbnMKKyAgICAgKiAgICAgICAgICAgICB0aHJvdWdoIHByb3hpZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oUHJveHkgcHJveHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChudWxsID09IHByb3h5KSB7CkBAIC03MTYsMTAgKzcyOCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICogdGhpcyBVUkwuIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kCisgICAgICoge0Bjb2RlIHRvRXh0ZXJuYWxGb3JtKCl9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTcyNywxMyArNzQxLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCByZXR1cm4gdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSTC4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZgorICAgICAqIHRoaXMgVVJMLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVJMLgotICAgICAqIAotICAgICAqIEBzZWUgI3RvU3RyaW5nKCkKLSAgICAgKiBAc2VlIFVSTAotICAgICAqIEBzZWUgVVJMU3RyZWFtSGFuZGxlciN0b0V4dGVybmFsRm9ybShVUkwpCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVJMLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9FeHRlcm5hbEZvcm0oKSB7CiAgICAgICAgIGlmIChzdHJtSGFuZGxlciA9PSBudWxsKSB7CkBAIC03ODYsMTAgKzc5OCwxMCBAQAogICAgICAqIDxwPgogICAgICAqIE5vdGUgdGhhdCwgd2UgcmVhbGx5IG9ubHkgbmVlZCB0aGUgcmVhZE9iamVjdCBtZXRob2QgYnV0IHRoZSBzcGVjIHRoYXQKICAgICAgKiBzYXlzIHJlYWRPYmplY3Qgd2lsbCBiZSBpZ25vcmVkIGlmIG5vIHdyaXRlT2JqZWN0IGlzIHByZXNlbnQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBvbi4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gSU8gRXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgdGhlIHdyaXRlLgogICAgICAqLwpAQCAtNzk4LDExMCArODEwLDExOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgY29tcG9uZW50IG9mIHRoaXMgVVJMLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmaWxlIHBhcnQgb2YgdGhpcyBVUkwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBmaWxlLgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSB0aGlzIFVSTCByZWZlcnMgdG8gb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBmaWxlCisgICAgICogICAgICAgICBwYXJ0IGlzIG5vdCBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGaWxlKCkgewogICAgICAgICByZXR1cm4gZmlsZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBob3N0IGNvbXBvbmVudCBvZiB0aGlzIFVSTC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaG9zdCBwYXJ0IG9mIHRoaXMgVVJMLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaG9zdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBob3N0IG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGlzIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CiAgICAgICAgIHJldHVybiBob3N0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvcnQgY29tcG9uZW50IG9mIHRoaXMgVVJMLgorICAgICAqIEdldHMgdGhlIHBvcnQgbnVtYmVyIG9mIHRoaXMgVVJMIG9yIHtAY29kZSAtMX0gaWYgdGhlIHBvcnQgaXMgbm90IHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHBvcnQuCisgICAgICogQHJldHVybiB0aGUgcG9ydCBudW1iZXIgb2YgdGhpcyBVUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQb3J0KCkgewogICAgICAgICByZXR1cm4gcG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCBjb21wb25lbnQgb2YgdGhpcyBVUkwuCisgICAgICogR2V0cyB0aGUgcHJvdG9jb2wgb2YgdGhpcyBVUkwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBwcm90b2NvbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm90b2NvbCB0eXBlIG9mIHRoaXMgVVJMLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CiAgICAgICAgIHJldHVybiBwcm90b2NvbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgY29tcG9uZW50IG9mIHRoaXMgVVJMLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgcGFydCBvZiB0aGlzIFVSTC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHJlZmVyZW5jZSBjb21wb25lbnQuCisgICAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlIHBhcnQgb2YgdGhpcyBVUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSZWYoKSB7CiAgICAgICAgIHJldHVybiByZWY7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcXVlcnkgY29tcG9uZW50IG9mIHRoaXMgVVJMLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBxdWVyeSBwYXJ0IG9mIHRoaXMgVVJMLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgcXVlcnkuCisgICAgICogQHJldHVybiB0aGUgcXVlcnkgcGFydCBvZiB0aGlzIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5KCkgewogICAgICAgICByZXR1cm4gcXVlcnk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCBjb21wb25lbnQgb2YgdGhpcyBVUkwuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBhdGggcGFydCBvZiB0aGlzIFVSTC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHBhdGguCisgICAgICogQHJldHVybiB0aGUgcGF0aCBwYXJ0IG9mIHRoaXMgVVJMLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXNlciBpbmZvIGNvbXBvbmVudCBvZiB0aGlzIFVSTC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdXNlci1pbmZvIHBhcnQgb2YgdGhpcyBVUkwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyB1c2VyIGluZm8uCisgICAgICogQHJldHVybiB0aGUgdXNlci1pbmZvIHBhcnQgb2YgdGhpcyBVUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVc2VySW5mbygpIHsKICAgICAgICAgcmV0dXJuIHVzZXJJbmZvOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgb2YgdGhpcyBVUkwuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGF1dGhvcml0eSBwYXJ0IG9mIHRoaXMgVVJMLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgYXV0aG9yaXR5LgorICAgICAqIEByZXR1cm4gdGhlIGF1dGhvcml0eSBwYXJ0IG9mIHRoaXMgVVJMLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yaXR5KCkgewogICAgICAgICByZXR1cm4gYXV0aG9yaXR5OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBVUkwgdXNpbmcgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy4gVGhpcyBtZXRob2QKLSAgICAgKiBpcyB1c2VkIGJvdGggd2l0aGluIHRoaXMgY2xhc3MgYW5kIGJ5IHRoZSA8Y29kZT5VUkxTdHJlYW1IYW5kbGVyPC9jb2RlPgotICAgICAqIGNvZGUuCisgICAgICogU2V0cyB0aGUgcHJvcGVydGllcyBvZiB0aGlzIFVSTCB1c2luZyB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLiBPbmx5IGEKKyAgICAgKiB7QGNvZGUgVVJMU3RyZWFtSGFuZGxlcn0gY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBzZXQgZmllbGRzIG9mIHRoZQorICAgICAqIGV4aXN0aW5nIFVSTCBpbnN0YW5jZS4gQSBVUkwgaXMgZ2VuZXJhbGx5IGNvbnN0YW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwcm90b2NvbC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm90b2NvbCB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIGhvc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgaG9zdCBuYW1lLgorICAgICAqICAgICAgICAgICAgdGhlIGhvc3QgbmFtZSB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIHBvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcG9ydCBudW1iZXIuCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBudW1iZXIgdG8gYmUgc2V0LgogICAgICAqIEBwYXJhbSBhdXRob3JpdHkKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYXV0aG9yaXR5LgorICAgICAqICAgICAgICAgICAgdGhlIGF1dGhvcml0eSB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIHVzZXJJbmZvCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHVzZXIgaW5mby4KKyAgICAgKiAgICAgICAgICAgIHRoZSB1c2VyLWluZm8gdG8gYmUgc2V0LgogICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHBhdGggY29tcG9uZW50LgorICAgICAqICAgICAgICAgICAgdGhlIHBhdGggdG8gYmUgc2V0LgogICAgICAqIEBwYXJhbSBxdWVyeQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBxdWVyeS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBxdWVyeSB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIHJlZgotICAgICAqICAgICAgICAgICAgdGhlIG5ldyByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHNlZSBVUkwKLSAgICAgKiBAc2VlIFVSTFN0cmVhbUhhbmRsZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgdG8gYmUgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldChTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwKICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHksIFN0cmluZyB1c2VySW5mbywgU3RyaW5nIHBhdGgsIFN0cmluZyBxdWVyeSwKQEAgLTkyMSwxNiArOTQxLDIxIEBACiAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKICAgICB9CiAKLSAgICBVUkxTdHJlYW1IYW5kbGVyIGdldFN0cmVhbUhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdHJtSGFuZGxlcjsKLSAgICB9CisgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisgICAgLy8gVVJMU3RyZWFtSGFuZGxlciBnZXRTdHJlYW1IYW5kbGVyKCkgeworICAgIC8vICAgICByZXR1cm4gc3RybUhhbmRsZXI7CisgICAgLy8gfQorICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhpcyBVUkwgYXMgZGVmaW5lZCBieSB0aGUgVVJMU3RyZWFtSGFuZGxlci4KKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHBvcnQgbnVtYmVyIG9mIHRoZSBwcm90b2NvbCB1c2VkIGJ5IHRoaXMgVVJMLiBJZiBubworICAgICAqIGRlZmF1bHQgcG9ydCBpcyBkZWZpbmVkIGJ5IHRoZSBwcm90b2NvbCBvciB0aGUge0Bjb2RlIFVSTFN0cmVhbUhhbmRsZXJ9LAorICAgICAqIHtAY29kZSAtMX0gd2lsbCBiZSByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHBvcnQgZm9yIHRoaXMgVVJMCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBwb3J0IG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIHByb3RvY29sIG9mIHRoaXMgVVJMLgogICAgICAqIEBzZWUgVVJMU3RyZWFtSGFuZGxlciNnZXREZWZhdWx0UG9ydAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CiAgICAgICAgIHJldHVybiBzdHJtSGFuZGxlci5nZXREZWZhdWx0UG9ydCgpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTENsYXNzTG9hZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXIuamF2YQppbmRleCA1M2Q4NDlkLi5jNzBlZDQ1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXIuamF2YQpAQCAtNTYsOCArNTYsMTAgQEAKIC8qKgogICogVGhpcyBjbGFzcyBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGZyb20gYQogICogbGlzdCBvZiBVUkxzIHdoaWNoIGNhbiByZWZlciB0byBlaXRoZXIgZGlyZWN0b3JpZXMgb3IgSkFSIGZpbGVzLiBDbGFzc2VzCi0gKiBsb2FkZWQgYnkgdGhpcyA8Y29kZT5VUkxDbGFzc0xvYWRlcjwvY29kZT4gYXJlIGdyYW50ZWQgcGVybWlzc2lvbiB0byBhY2Nlc3MKLSAqIHRoZSBVUkxzIGNvbnRhaW5lZCBpbiB0aGUgVVJMIHNlYXJjaCBsaXN0LgorICogbG9hZGVkIGJ5IHRoaXMge0Bjb2RlIFVSTENsYXNzTG9hZGVyfSBhcmUgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUKKyAqIFVSTHMgY29udGFpbmVkIGluIHRoZSBVUkwgc2VhcmNoIGxpc3QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVVJMQ2xhc3NMb2FkZXIgZXh0ZW5kcyBTZWN1cmVDbGFzc0xvYWRlciB7CiAKQEAgLTk4LDggKzEwMCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogT3ZlcnJpZGVzIHRoZSBsb2FkQ2xhc3MoKSBvZiA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4uIEl0IGNhbGxzCi0gICAgICAgICAqIHRoZSBzZWN1cml0eSBtYW5hZ2VyJ3MgPGNvZGU+Y2hlY2tQYWNrYWdlQWNjZXNzKCk8L2NvZGU+IGJlZm9yZQorICAgICAgICAgKiBPdmVycmlkZXMgdGhlIHtAY29kZSBsb2FkQ2xhc3MoKX0gb2Yge0Bjb2RlIENsYXNzTG9hZGVyfS4gSXQgY2FsbHMKKyAgICAgICAgICogdGhlIHNlY3VyaXR5IG1hbmFnZXIncyB7QGNvZGUgY2hlY2tQYWNrYWdlQWNjZXNzKCl9IGJlZm9yZQogICAgICAgICAgKiBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlIGNsYXNzLgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgQ2xhc3Mgb2JqZWN0LgpAQCAtMTMxLDM1ICsxMzMsMzkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIHdpbGwKLSAgICAgKiBoYXZlIHRoZSBzeXN0ZW0gQ2xhc3NMb2FkZXIgYXMgaXRzIHBhcmVudC4gVVJMcyB0aGF0IGVuZCB3aXRoICIvIiBhcmUKLSAgICAgKiBhc3N1bWVkIHRvIGJlIGRpcmVjdG9yaWVzLCBvdGhlcndpc2UgdGhleSBhcmUgYXNzdW1lZCB0byBiZSBKYXIgZmlsZXMuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgVVJMQ2xhc3NMb2FkZXJ9IGluc3RhbmNlLiBUaGUgbmV3bHkgY3JlYXRlZAorICAgICAqIGluc3RhbmNlIHdpbGwgaGF2ZSB0aGUgc3lzdGVtIENsYXNzTG9hZGVyIGFzIGl0cyBwYXJlbnQuIFVSTHMgdGhhdCBlbmQKKyAgICAgKiB3aXRoICIvIiBhcmUgYXNzdW1lZCB0byBiZSBkaXJlY3Rvcmllcywgb3RoZXJ3aXNlIHRoZXkgYXJlIGFzc3VtZWQgdG8gYmUKKyAgICAgKiBKQVIgZmlsZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVybHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBVUkxzIHRvIHNlYXJjaAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgVVJMcyB3aGVyZSBhIHNwZWNpZmljIGNsYXNzIG9yIGZpbGUgY291bGQgYmUKKyAgICAgKiAgICAgICAgICAgIGZvdW5kLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMgY2hlY2tDcmVhdGVDbGFzc0xvYWRlcgotICAgICAqICAgICAgICAgICAgIG1ldGhvZCBkb2Vzbid0IGFsbG93IGNyZWF0aW9uIG9mIG5ldyBDbGFzc0xvYWRlcnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgY2hlY2tDcmVhdGVDbGFzc0xvYWRlcigpfSBtZXRob2QgZG9lc24ndCBhbGxvdyBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgIG5ldyBDbGFzc0xvYWRlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTENsYXNzTG9hZGVyKFVSTFtdIHVybHMpIHsKICAgICAgICAgdGhpcyh1cmxzLCBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIHdpbGwKLSAgICAgKiBoYXZlIHRoZSBzcGVjaWZpZWQgQ2xhc3NMb2FkZXIgYXMgaXRzIHBhcmVudC4gVVJMcyB0aGF0IGVuZCB3aXRoICIvIiBhcmUKLSAgICAgKiBhc3N1bWVkIHRvIGJlIGRpcmVjdG9yaWVzLCBvdGhlcndpc2UgdGhleSBhcmUgYXNzdW1lZCB0byBiZSBKYXIgZmlsZXMuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBVUkxDbGFzc0xvYWRlciBpbnN0YW5jZS4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2Ugd2lsbAorICAgICAqIGhhdmUgdGhlIHN5c3RlbSBDbGFzc0xvYWRlciBhcyBpdHMgcGFyZW50LiBVUkxzIHRoYXQgZW5kIHdpdGggIi8iIGFyZQorICAgICAqIGFzc3VtZWQgdG8gYmUgZGlyZWN0b3JpZXMsIG90aGVyd2lzZSB0aGV5IGFyZSBhc3N1bWVkIHRvIGJlIEpBUiBmaWxlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXJscwotICAgICAqICAgICAgICAgICAgdGhlIFVSTHMgdG8gc2VhcmNoCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBVUkxzIHdoZXJlIGEgc3BlY2lmaWMgY2xhc3Mgb3IgZmlsZSBjb3VsZCBiZQorICAgICAqICAgICAgICAgICAgZm91bmQuCiAgICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgdGhlIENsYXNzTG9hZGVyIHRvIGFzc2lnbiBhcyB0aGlzIGxvYWRlcidzIHBhcmVudC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBsb2FkZXIgdG8gYXNzaWduIGFzIHRoaXMgbG9hZGVyJ3MgcGFyZW50LgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMgY2hlY2tDcmVhdGVDbGFzc0xvYWRlcgotICAgICAqICAgICAgICAgICAgIG1ldGhvZCBkb2Vzbid0IGFsbG93IGNyZWF0aW9uIG9mIG5ldyBDbGFzc0xvYWRlcnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgY2hlY2tDcmVhdGVDbGFzc0xvYWRlcigpfSBtZXRob2QgZG9lc24ndCBhbGxvdyBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgIG5ldyBjbGFzcyBsb2FkZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkxDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKICAgICAgICAgdGhpcyh1cmxzLCBwYXJlbnQsIG51bGwpOwpAQCAtMTY5LDcgKzE3NSw4IEBACiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIFVSTCB0byB0aGUgc2VhcmNoIGxpc3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMIHRoZSBuZXcgVVJMCisgICAgICogICAgICAgICAgICB0aGUgVVJMIHdoaWNoIGlzIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRVUkwoVVJMIHVybCkgewogICAgICAgICB0cnkgewpAQCAtMTg3LDkgKzE5NCw5IEBACiAgICAgICogUmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBnaXZlbiBVUkwgYWRkZWQgdG8gdGhlIGdpdmVuIGFycmF5LgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmxBcnJheQotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMW10gdGhlIHNvdXJjZSBhcnJheQorICAgICAqICAgICAgICAgICAge0Bjb2RlIGphdmEubmV0LlVSTFtdfSB0aGUgc291cmNlIGFycmF5CiAgICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMIHRoZSBVUkwgdG8gYmUgYWRkZWQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBqYXZhLm5ldC5VUkx9IHRoZSBVUkwgdG8gYmUgYWRkZWQKICAgICAgKiBAcmV0dXJuIGphdmEubmV0LlVSTFtdIGFuIGFycmF5IG1hZGUgb2YgdGhlIGdpdmVuIGFycmF5IGFuZCB0aGUgbmV3IFVSTAogICAgICAqLwogICAgIFVSTFtdIGFkZFVSTChVUkxbXSB1cmxBcnJheSwgVVJMIHVybCkgewpAQCAtMjAzLDE0ICsyMTAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIFVSTHMgdGhhdCBjb250YWluIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICogUmV0dXJucyBhbGwga25vd24gVVJMcyB3aGljaCBwb2ludCB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gRW51bWVyYXRpb24gdGhlIGVudW1lcmF0aW9uIG9mIFVSTHMgdGhhdCBjb250YWluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgIHJlc291cmNlLgogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRpb24gb2YgVVJMcyB3aGljaCBwb2ludCB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aHJvd24gaWYgYW4gSU8gRXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248VVJMPiBmaW5kUmVzb3VyY2VzKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjQ4LDkgKzI1NSw5IEBACiAgICAgICogQHJldHVybiBWZWN0b3IgdGhlIGVudW1lcmF0aW9uIG9mIFVSTHMgdGhhdCBjb250YWluIHRoZSBzcGVjaWZpZWQKICAgICAgKiAgICAgICAgIHJlc291cmNlLgogICAgICAqIEBwYXJhbSBzZWFyY2hVUkxzCi0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5VUkxbXSB0aGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBqYXZhLm5ldC5VUkxbXX0gdGhlIGFycmF5IHRvIGJlIHNlYXJjaGVkLgogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBqYXZhLmxhbmcuU3RyaW5nfSB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlLgogICAgICAqLwogICAgIFZlY3RvcjxVUkw+IGZpbmRSZXNvdXJjZXMoVVJMW10gc2VhcmNoVVJMcywgU3RyaW5nIG5hbWUsIFZlY3RvcjxVUkw+IHJlc3VsdCkgewogICAgICAgICBib29sZWFuIGZpbmRJbkV4dGVuc2lvbnMgPSBzZWFyY2hVUkxzID09IHVybHM7CkBAIC0yNzMsMjQgKzI4MCwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gT2JqZWN0W10gY29udGFpbmluZyBhIENsYXNzLCBhIFVSTCwgYW5kIGEgVmVjdG9yIG9mIFVSTHMsIDIgb2YKLSAgICAgKiB3aGljaCBhcmUgbnVsbCwgYWNjb3JkaW5nIHRvIHRoZSBjYWxsZXIsIHdoaWNoIGlzIGlkZW50aWZpZWQgYnkgdGhlIGludAotICAgICAqIHR5cGUuCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgT2JqZWN0W119IGNvbnRhaW5pbmcgYSBjbGFzcywgYSBVUkwsIGFuZCBhIHZlY3RvciBvZgorICAgICAqIFVSTHMsIHR3byBvZiB3aGljaCBhcmUge0Bjb2RlIG51bGx9LCBhY2NvcmRpbmcgdG8gdGhlIGNhbGxlciwgd2hpY2ggaXMKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSB7QGNvZGUgaW50fSB0eXBlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gT2JqZWN0W10gYSAzLWVsZW1lbnQgYXJyYXkgOiB7Q2xhc3MsIFVSTCwgVmVjdG9yfS4gVGhlIG5vbi1udWxsCiAgICAgICogICAgICAgICBlbGVtZW50IGNvbnRhaW5zIHRoZSByZXNvdXJjZShzKSBmb3VuZCwgd2hpY2ggYXJlIHNlYXJjaGVkIGluIGluCi0gICAgICogICAgICAgICBpbmRleGVzW2ldLgorICAgICAqICAgICAgICAge0Bjb2RlIGluZGV4ZXNbaV19LgogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBpbnQgdGhlIGluZGV4IG9mICdpbmRleGVzJyBhcnJheSB0byB1c2UuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgJ2luZGV4ZXMnIGFycmF5IHRvIHVzZS4KICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSByZXNvdXJjZSB0byBsb29rIGZvciA6IGVpdGhlciBhIHJlc291cmNlIG9yIGEKLSAgICAgKiAgICAgICAgICAgIGNsYXNzLgorICAgICAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRvIGxvb2sgZm9yIDogZWl0aGVyIGEgcmVzb3VyY2Ugb3IgYSBjbGFzcy4KICAgICAgKiBAcGFyYW0gcmVzb3VyY2VzCi0gICAgICogICAgICAgICAgICBib29sZWFuIGluZGljYXRlcyB0aGF0IGEgVmVjdG9yIG9mIFVSTCBzaG91bGQgYmUgcmV0dXJuZWQgYXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbnVsbCBlbGVtZW50IGluIE9iamVjdFtdLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGJvb2xlYW59IGluZGljYXRlcyB0aGF0IGEgdmVjdG9yIG9mIFVSTCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIHJldHVybmVkIGFzIHRoZSBub24ge0Bjb2RlIG51bGx9IGVsZW1lbnQgaW4ge0Bjb2RlIE9iamVjdFtdfS4KICAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICBib29sZWFuIGlmIHRydWUgYSBVUkwgc2hvdWxkIGJlIHJldHVybmVkIGFzIHRoZSBub24gbnVsbAotICAgICAqICAgICAgICAgICAgZWxlbWVudCwgaWYgZmFsc2UgYSBDbGFzcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0gYSBVUkwgc2hvdWxkIGJlIHJldHVybmVkIGFzIHRoZSBub24tbnVsbAorICAgICAqICAgICAgICAgICAgZWxlbWVudCwgaWYge0Bjb2RlIGZhbHNlfSBhIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZC4KICAgICAgKi8KICAgICBPYmplY3QgZmluZEluSW5kZXgoaW50IGksIFN0cmluZyBuYW1lLCBWZWN0b3I8VVJMPiByZXNvdXJjZXMsIGJvb2xlYW4gdXJsKSB7CiAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIFVSTFtdPiBpbmRleCA9IGluZGV4ZXNbaV07CkBAIC0zMzksOSArMzQ1LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIE9iamVjdFtdIGNvbnRhaW5pbmcgYSBDbGFzcywgYSBVUkwsIGFuZCBhIFZlY3RvciBvZiBVUkxzLCAyIG9mCi0gICAgICogd2hpY2ggYXJlIG51bGwsIGFjY29yZGluZyB0byB0aGUgY2FsbGVyLCB3aGljaCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBpbnQKLSAgICAgKiB0eXBlLgorICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIE9iamVjdFtdfSBjb250YWluaW5nIGEgQ2xhc3MsIGEgVVJMLCBhbmQgYSBWZWN0b3Igb2YKKyAgICAgKiBVUkxzLCB0d28gb2Ygd2hpY2ggYXJlIHtAY29kZSBudWxsfSwgYWNjb3JkaW5nIHRvIHRoZSBjYWxsZXIsIHdoaWNoIGlzCisgICAgICogaWRlbnRpZmllZCBieSB0aGUge0Bjb2RlIGludH0gdHlwZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIE9iamVjdFtdIGEgMy1lbGVtZW50IGFycmF5IDoge0NsYXNzLCBVUkwsIFZlY3Rvcn0uIFRoZSBub24tbnVsbAogICAgICAqICAgICAgICAgZWxlbWVudCBjb250YWlucyB0aGUgcmVzb3VyY2UocykgZm91bmQsIHdoaWNoIGFyZSBzZWFyY2hlZCBpbgpAQCAtMzQ5LDE2ICszNTUsMTUgQEAKICAgICAgKiBAcGFyYW0gbmV3RXh0ZW5zaW9ucwogICAgICAqICAgICAgICAgICAgVVJMW10gdGhlIFVSTHMgdG8gbG9vayBpbiBmb3IuCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgcmVzb3VyY2UgdG8gbG9vayBmb3IgOiBlaXRoZXIgYSByZXNvdXJjZSBvciBhCi0gICAgICogICAgICAgICAgICBjbGFzcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSB0byBsb29rIGZvciA6IGVpdGhlciBhIHJlc291cmNlIG9yIGEgY2xhc3MuCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIGludCB0aGUgaW5kZXggb2YgJ2luZGV4ZXMnIGFycmF5IHRvIHVzZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiAnaW5kZXhlcycgYXJyYXkgdG8gdXNlLgogICAgICAqIEBwYXJhbSByZXNvdXJjZXMKLSAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gaW5kaWNhdGVzIHRoYXQgYSBWZWN0b3Igb2YgVVJMIHNob3VsZCBiZSByZXR1cm5lZCBhcwotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIGVsZW1lbnQgaW4gT2JqZWN0W10uCisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhhdCBhIFZlY3RvciBvZiBVUkwgc2hvdWxkIGJlIHJldHVybmVkIGFzIHRoZQorICAgICAqICAgICAgICAgICAgbm9uLW51bGwgZWxlbWVudCBpbiB7QGNvZGUgT2JqZWN0W119LgogICAgICAqIEBwYXJhbSB1cmwKLSAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gaWYgdHJ1ZSBhIFVSTCBzaG91bGQgYmUgcmV0dXJuZWQgYXMgdGhlIG5vbiBudWxsCi0gICAgICogICAgICAgICAgICBlbGVtZW50LCBpZiBmYWxzZSBhIENsYXNzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKiAgICAgICAgICAgIGlmIHtAY29kZSB0cnVlfSBhIFVSTCBzaG91bGQgYmUgcmV0dXJuZWQgYXMgdGhlIG5vbi1udWxsCisgICAgICogICAgICAgICAgICBlbGVtZW50LCBpZiB7QGNvZGUgZmFsc2V9IGEgY2xhc3Mgc2hvdWxkIGJlIHJldHVybmVkLgogICAgICAqLwogICAgIE9iamVjdCBmaW5kSW5FeHRlbnNpb25zKFVSTFtdIG5ld0V4dGVuc2lvbnMsIFN0cmluZyBuYW1lLCBpbnQgaSwKICAgICAgICAgICAgIFZlY3RvcjxVUkw+IHJlc291cmNlcywgYm9vbGVhbiB1cmwpIHsKQEAgLTQzNywxNiArNDQyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGVybWlzc2lvbnMgZm9yIHRoZSBnaXZlbiBjb2RlIHNvdXJjZS4gRmlyc3QgdGhpcyBtZXRob2QKLSAgICAgKiByZXRyaWV2ZXMgdGhlIHBlcm1pc3Npb25zIGZyb20gdGhlIHN5c3RlbSBwb2xpY3kuIElmIHRoZSBwcm90b2NvbCBpcwotICAgICAqICJmaWxlOi8iIHRoZW4gYSBuZXcgcGVybWlzc2lvbiwgPGNvZGU+RmlsZVBlcm1pc3Npb248L2NvZGU+LCBncmFudGluZwotICAgICAqIHRoZSByZWFkIHBlcm1pc3Npb24gdG8gdGhlIGZpbGUgaXMgYWRkZWQgdG8gdGhlIHBlcm1pc3Npb24gY29sbGVjdGlvbi4KKyAgICAgKiBHZXRzIGFsbCBwZXJtaXNzaW9ucyBmb3IgdGhlIHNwZWNpZmllZCB7QGNvZGUgY29kZXNvdXJjZX0uIEZpcnN0LCB0aGlzCisgICAgICogbWV0aG9kIHJldHJpZXZlcyB0aGUgcGVybWlzc2lvbnMgZnJvbSB0aGUgc3lzdGVtIHBvbGljeS4gSWYgdGhlIHByb3RvY29sCisgICAgICogaXMgImZpbGU6LyIgdGhlbiBhIG5ldyBwZXJtaXNzaW9uLCB7QGNvZGUgRmlsZVBlcm1pc3Npb259LCBncmFudGluZyB0aGUKKyAgICAgKiByZWFkIHBlcm1pc3Npb24gdG8gdGhlIGZpbGUgaXMgYWRkZWQgdG8gdGhlIHBlcm1pc3Npb24gY29sbGVjdGlvbi4KICAgICAgKiBPdGhlcndpc2UsIGNvbm5lY3RpbmcgdG8gYW5kIGFjY2VwdGluZyBjb25uZWN0aW9ucyBmcm9tIHRoZSBVUkwgaXMKICAgICAgKiBncmFudGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gUGVybWlzc2lvbkNvbGxlY3Rpb24KICAgICAgKiBAcGFyYW0gY29kZXNvdXJjZQotICAgICAqICAgICAgICAgICAgQ29kZVNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgc291cmNlIG9iamVjdCB3aG9zZSBwZXJtaXNzaW9ucyBoYXZlIHRvIGJlIGtub3duLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgYWNjb3JkaW5nIHRvIHRoZSBjb2RlIHNvdXJjZSBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKGZpbmFsIENvZGVTb3VyY2UgY29kZXNvdXJjZSkgewpAQCAtNDg3LDkgKzQ5MywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlYXJjaCBsaXN0IG9mIHRoaXMgVVJMQ2xhc3NMb2FkZXIKKyAgICAgKiBSZXR1cm5zIHRoZSBzZWFyY2ggbGlzdCBvZiB0aGlzIHtAY29kZSBVUkxDbGFzc0xvYWRlcn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLm5ldC5VUkxbXQorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGtub3duIFVSTHMgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMW10gZ2V0VVJMcygpIHsKICAgICAgICAgcmV0dXJuIG9yZ1VybHMuY2xvbmUoKTsKQEAgLTQ5NywxMCArNTA0LDYgQEAKIAogICAgIC8qKgogICAgICAqIERldGVybWluZXMgaWYgdGhlIFVSTCBpcyBwb2ludGluZyB0byBhIGRpcmVjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5VUkwKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlyZWN0b3J5KFVSTCB1cmwpIHsKICAgICAgICAgU3RyaW5nIGZpbGUgPSB1cmwuZ2V0RmlsZSgpOwpAQCAtNTA4LDE2ICs1MTEsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIDxjb2RlPlVSTENsYXNzTG9hZGVyPC9jb2RlPi4KLSAgICAgKiA8Y29kZT5sb2FkQ2xhc3MoKTwvY29kZT4gb2YgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIGNhbGwgdGhlCi0gICAgICogU2VjdXJpdHlNYW5hZ2VyJ3MgPGNvZGU+Y2hlY2tQYWNrYWdlQWNjZXNzKCk8L2NvZGU+IGJlZm9yZSBsb2FkaW5nIGEKLSAgICAgKiBjbGFzcy4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBVUkxDbGFzc0xvYWRlcn0gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBVUkxzIGFuZCB0aGUKKyAgICAgKiBzeXN0ZW0ge0Bjb2RlIENsYXNzTG9hZGVyfSBhcyBpdHMgcGFyZW50LiBUaGUgbWV0aG9kIHtAY29kZSBsb2FkQ2xhc3MoKX0KKyAgICAgKiBvZiB0aGUgbmV3IGluc3RhbmNlIHdpbGwgY2FsbCB7QGNvZGUKKyAgICAgKiBTZWN1cml0eU1hbmFnZXIuY2hlY2tQYWNrYWdlQWNjZXNzKCl9IGJlZm9yZSBsb2FkaW5nIGEgY2xhc3MuCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciB0aGUgbmV3IGluc3RhbmNlIG9mCi0gICAgICogICAgICAgICA8Y29kZT5VUkxDbGFzc0xvYWRlcjwvY29kZT4KICAgICAgKiBAcGFyYW0gdXJscwotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMW10gYSBsaXN0IG9mIFVSTHMgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIG5ldwotICAgICAqICAgICAgICAgICAgVVJMQ2xhc3Nsb2FkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIFVSTHMgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIG5ldyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFVSTENsYXNzbG9hZGVyfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHtAY29kZSBVUkxDbGFzc0xvYWRlcn0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBVUkxDbGFzc0xvYWRlciBuZXdJbnN0YW5jZShmaW5hbCBVUkxbXSB1cmxzKSB7CiAgICAgICAgIFVSTENsYXNzTG9hZGVyIHN1YiA9IEFjY2Vzc0NvbnRyb2xsZXIKQEAgLTUzMSwxOCArNTM0LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5VUkxDbGFzc0xvYWRlcjwvY29kZT4uCi0gICAgICogPGNvZGU+bG9hZENsYXNzKCk8L2NvZGU+IG9mIHRoZSBuZXcgaW5zdGFuY2Ugd2lsbCBjYWxsIHNlY3VyaXR5Ci0gICAgICogbWFuYWdlcidzIDxjb2RlPmNoZWNrUGFja2FnZUFjY2VzcygpPC9jb2RlPiBiZWZvcmUgbG9hZGluZyBhIGNsYXNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVVJMQ2xhc3NMb2FkZXIgdGhlIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5VUkxDbGFzc0xvYWRlcjwvY29kZT4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBVUkxDbGFzc0xvYWRlcn0gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBVUkxzIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIENsYXNzTG9hZGVyfSBhcyBpdHMgcGFyZW50LiBUaGUgbWV0aG9kIHtAY29kZQorICAgICAqIGxvYWRDbGFzcygpfSBvZiB0aGUgbmV3IGluc3RhbmNlIHdpbGwgY2FsbCB0aGUgU2VjdXJpdHlNYW5hZ2VyJ3Mge0Bjb2RlCisgICAgICogY2hlY2tQYWNrYWdlQWNjZXNzKCl9IGJlZm9yZSBsb2FkaW5nIGEgY2xhc3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVybHMKLSAgICAgKiAgICAgICAgICAgIFVSTFtdIHRoZSBsaXN0IG9mIFVSTHMgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIG5ldwotICAgICAqICAgICAgICAgICAgPGNvZGU+VVJMQ2xhc3Nsb2FkZXI8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBVUkxzIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBuZXcgVVJMQ2xhc3Nsb2FkZXIuCiAgICAgICogQHBhcmFtIHBhcmVudENsCi0gICAgICogICAgICAgICAgICBDbGFzc0xvYWRlciB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgbmV3Ci0gICAgICogICAgICAgICAgICA8Y29kZT5VUkxDbGFzc2xvYWRlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBuZXcKKyAgICAgKiAgICAgICAgICAgIFVSTENsYXNzbG9hZGVyLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0Bjb2RlIFVSTENsYXNzTG9hZGVyfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFVSTENsYXNzTG9hZGVyIG5ld0luc3RhbmNlKGZpbmFsIFVSTFtdIHVybHMsCiAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBwYXJlbnRDbCkgewpAQCAtNTU3LDI0ICs1NjAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIHdpbGwKLSAgICAgKiBoYXZlIHRoZSBzcGVjaWZpZWQgQ2xhc3NMb2FkZXIgYXMgaXRzIHBhcmVudCBhbmQgdXNlIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBmYWN0b3J5IHRvIGNyZWF0ZSBzdHJlYW0gaGFuZGxlcnMuIFVSTHMgdGhhdCBlbmQgd2l0aCAiLyIgYXJlIGFzc3VtZWQgdG8KLSAgICAgKiBiZSBkaXJlY3Rvcmllcywgb3RoZXJ3aXNlIHRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgSmFyIGZpbGVzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVSTENsYXNzTG9hZGVyfSBpbnN0YW5jZS4gVGhlIG5ld2x5IGNyZWF0ZWQKKyAgICAgKiBpbnN0YW5jZSB3aWxsIGhhdmUgdGhlIHNwZWNpZmllZCB7QGNvZGUgQ2xhc3NMb2FkZXJ9IGFzIGl0cyBwYXJlbnQgYW5kCisgICAgICogdXNlIHRoZSBzcGVjaWZpZWQgZmFjdG9yeSB0byBjcmVhdGUgc3RyZWFtIGhhbmRsZXJzLiBVUkxzIHRoYXQgZW5kIHdpdGgKKyAgICAgKiAiLyIgYXJlIGFzc3VtZWQgdG8gYmUgZGlyZWN0b3JpZXMsIG90aGVyd2lzZSB0aGV5IGFyZSBhc3N1bWVkIHRvIGJlIEpBUgorICAgICAqIGZpbGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZWFyY2hVcmxzCi0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5VUkxbXSB0aGUgVVJMcyB0aGF0IHdpbGwgYmUgc2VhcmNoZWQgaW4gdGhlIG9yZGVyCi0gICAgICogICAgICAgICAgICB0aGV5IHdlcmUgc3BlY2lmaWVkIGZvciByZXNvdXJjZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgVVJMcyB3aGVyZSBhIHNwZWNpZmljIGNsYXNzIG9yIGZpbGUgY291bGQgYmUKKyAgICAgKiAgICAgICAgICAgIGZvdW5kLgogICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIENsYXNzTG9hZGVyIHRoZSBDbGFzc0xvYWRlciBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBmaW5kLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDbGFzc0xvYWRlcn0gdG8gYXNzaWduIGFzIHRoaXMgbG9hZGVyJ3MgcGFyZW50LgogICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSB0aGUgZmFjdG9yeSB0aGF0IHdpbGwgdXNlZCB0bwotICAgICAqICAgICAgICAgICAgY3JlYXRlIHN0cmVhbSAocHJvdG9jb2wpIGhhbmRsZXJzCisgICAgICogICAgICAgICAgICB0aGUgZmFjdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgcHJvdG9jb2wtc3BlY2lmaWMKKyAgICAgKiAgICAgICAgICAgIHN0cmVhbSBoYW5kbGVycy4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXRzIGNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIKLSAgICAgKiAgICAgICAgICAgICBtZXRob2QgZG9lc24ndCBhbGxvdyBjcmVhdGlvbiBvZiBuZXcgQ2xhc3NMb2FkZXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXRzIHtAY29kZQorICAgICAqICAgICAgICAgICAgIGNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIoKX0gbWV0aG9kIGRvZXNuJ3QgYWxsb3cgY3JlYXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgICBuZXcge0Bjb2RlIENsYXNzTG9hZGVyfXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTENsYXNzTG9hZGVyKFVSTFtdIHNlYXJjaFVybHMsIENsYXNzTG9hZGVyIHBhcmVudCwKICAgICAgICAgICAgIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IGZhY3RvcnkpIHsKQEAgLTYwNSwxNiArNjA5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9jYXRlcyBhbmQgbG9hZHMgdGhlIHNwZWNpZmllZCBjbGFzcywgc2VhcmNoaW5nIHRoaXMgVVJMQ2xhc3NMb2FkZXIncwotICAgICAqIGxpc3Qgb2YgVVJMUy4KKyAgICAgKiBUcmllcyB0byBsb2NhdGUgYW5kIGxvYWQgdGhlIHNwZWNpZmllZCBjbGFzcyB1c2luZyB0aGUga25vd24gVVJMcy4gSWYgdGhlCisgICAgICogY2xhc3MgY291bGQgYmUgZm91bmQsIGEgY2xhc3Mgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbG9hZGVkIGNsYXNzIHdpbGwKKyAgICAgKiBiZSByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENsYXNzIHRoZSBjbGFzcyB0aGF0IGhhcyBiZWVuIGxvYWRlZC4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyB0aGF0IGhhcyBiZWVuIGxvYWRlZC4KICAgICAgKiBAcGFyYW0gY2xzTmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBoYXMgdG8gYmUgZm91bmQuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBjYW5ub3QgYmUgbG9hZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBDbGFzczw/PiBmaW5kQ2xhc3MoZmluYWwgU3RyaW5nIGNsc05hbWUpCkBAIC02NTgsMTIgKzY2MiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBVUkwgcmVmZXJlbmNpbmcgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBvciBudWxsIGlmIG5vIHJlc291cmNlCi0gICAgICogY291bGQgYmUgZm91bmQuCisgICAgICogUmV0dXJucyBhbiBVUkwgcmVmZXJlbmNpbmcgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVVJMIFVSTCBmb3IgdGhlIHJlc291cmNlLgogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgVVJMIHdoaWNoIHBvaW50cyB0byB0aGUgZ2l2ZW4gcmVzb3VyY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoZmluYWwgU3RyaW5nIG5hbWUpIHsKQEAgLTg1MSwxOSArODU2LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVmaW5lIGEgbmV3IFBhY2thZ2UgdXNpbmcgaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIHNwZWNpZmllZAotICAgICAqIE1hbmlmZXN0LgorICAgICAqIERlZmluZXMgYSBuZXcgcGFja2FnZSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIG1hbmlmZXN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBuZXcgcGFja2FnZS4KICAgICAgKiBAcGFyYW0gbWFuaWZlc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBNYW5pZmVzdCBmb3IgdGhlIFBhY2thZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYW5pZmVzdCBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXcKKyAgICAgKiAgICAgICAgICAgIHBhY2thZ2UuCiAgICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgVGhlIGNvZGUgc291cmNlIGZvciB0aGUgUGFja2FnZQotICAgICAqIEByZXR1cm4gVGhlIFBhY2thZ2UgY3JlYXRlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIFVSTCB0byB0aGUgY29kZSBzb3VyY2UgZm9yIHRoZSBuZXcgcGFja2FnZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHBhY2thZ2UuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgUGFja2FnZSBhbHJlYWR5IGV4aXN0cworICAgICAqICAgICAgICAgICAgIGlmIGEgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBQYWNrYWdlIGRlZmluZVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBNYW5pZmVzdCBtYW5pZmVzdCwKICAgICAgICAgICAgIFVSTCB1cmwpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTENvbm5lY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxDb25uZWN0aW9uLmphdmEKaW5kZXggM2Q3MDA1Yi4uY2U5MmFhZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTENvbm5lY3Rpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMQ29ubmVjdGlvbi5qYXZhCkBAIC0zNCwxMiArMzQsMjAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlV0aWw7CiAKIC8qKgotICogVGhlIFVSTENvbm5lY3Rpb24gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gdG8gYW4KLSAqIFVSTCBmb3IgYSBnaXZlbiBwcm90b2NvbC4gVGhlIGNvcnJlY3QgVVJMQ29ubmVjdGlvbiBzdWJjbGFzcyB0byBjYWxsIGlzCi0gKiBkZXRlcm1pbmVkIGJ5IDxjb2RlPlVSTFN0cmVhbUhhbmRsZXIub3BlbkNvbm5lY3Rpb24oKTwvY29kZT4uCisgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGFic3RyYWN0IHtAY29kZSBVUkxDb25uZWN0aW9ufSBjbGFzcyBwcm92aWRlCisgKiBhIGNvbW11bmljYXRpb24gbGluayB0byBhIFVSTCBmb3IgZXhjaGFuZ2luZyBkYXRhIHdpdGggYSBzcGVjaWZpYyBwcm90b2NvbAorICogdHlwZS4gQSB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gY2FuIG9ubHkgYmUgc2V0IHVwIGFmdGVyIHRoZSBpbnN0YW50aWF0aW9uIGJ1dAorICogYmVmb3JlIGNvbm5lY3RpbmcgdG8gdGhlIHJlbW90ZSByZXNvdXJjZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVUkxDb25uZWN0aW9uIHsKIAorICAgIC8qKgorICAgICAqIFRoZSBVUkwgd2hpY2ggcmVwcmVzZW50cyB0aGUgcmVtb3RlIHRhcmdldCBvZiB0aGlzIHtAY29kZSBVUkxDb25uZWN0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgVVJMIHVybDsKIAogICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRUeXBlOwpAQCAtNTIsMTYgKzYwLDUxIEBACiAKICAgICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkID0gLTE7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSBtdXN0IGJlIG1vZGlmaWVkIG1vcmUgcmVjZW50bHkgdGhhbiB0aGlzIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICogc2luY2UgSmFudWFyeSAxLCAxOTcwLCBHTVQgdG8gYmUgdHJhbnNtaXR0ZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIGxvbmcgaWZNb2RpZmllZFNpbmNlOwogCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVzaW5nIG9mIGNhY2hlcyBpcyBlbmFibGVkIG9yIHRoZSBkYXRhIGhhcyB0byBiZQorICAgICAqIHJlY2VudCBmb3IgZXZlcnkgcmVxdWVzdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VDYWNoZXMgPSBkZWZhdWx0VXNlQ2FjaGVzOwogCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlCisgICAgICogcmVtb3RlIHJlc291cmNlLiBJZiB0aGlzIGZpZWxkIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0gdGhlIGZsYWdzIGZvcgorICAgICAqIHNldHRpbmcgdXAgdGhlIGNvbm5lY3Rpb24gYXJlIG5vdCBjaGFuZ2VhYmxlIGFueW1vcmUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGVkOwogCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gYWxsb3dzIHNlbmRpbmcgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb091dHB1dDsKIAorICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMge0Bjb2RlIFVSTENvbm5lY3Rpb259IGFsbG93cyByZWNlaXZpbmcgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0lucHV0ID0gdHJ1ZTsKIAorICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMge0Bjb2RlIFVSTENvbm5lY3Rpb259IGFsbG93cyB1c2VyIGludGVyYWN0aW9uIGFzCisgICAgICogaXQgaXMgbmVlZGVkIGZvciBhdXRoZW50aWNhdGlvbiBwdXJwb3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd1VzZXJJbnRlcmFjdGlvbiA9IGRlZmF1bHRBbGxvd1VzZXJJbnRlcmFjdGlvbjsKIAogICAgIHByaXZhdGUgc3RhdGljIENvbnRlbnRIYW5kbGVyRmFjdG9yeSBjb250ZW50SGFuZGxlckZhY3Rvcnk7CkBAIC03MSw3ICsxMTQsNyBAQAogICAgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0ID0gMDsKIAogICAgIC8qKgotICAgICAqIENhY2hlIGZvciBzdG9yaW5nIENvbnRlbnQgaGFuZGxlcgorICAgICAqIENhY2hlIGZvciBzdG9yaW5nIGNvbnRlbnQgaGFuZGxlcgogICAgICAqLwogICAgIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGNvbnRlbnRIYW5kbGVycyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CiAKQEAgLTgyLDU2ICsxMjUsNTIgQEAKICAgICBwcml2YXRlIHN0YXRpYyBGaWxlTmFtZU1hcCBmaWxlTmFtZU1hcDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBVUkxDb25uZWN0aW9uIHBvaW50aW5nIHRvIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICogPGNvZGU+dXJsPC9jb2RlPgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFVSTENvbm5lY3Rpb259IGluc3RhbmNlIHBvaW50aW5nIHRvIHRoZSByZXNvdXJjZQorICAgICAqIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gVVJMLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmwKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgd2hpY2ggcmVwcmVzZW50cyB0aGUgcmVzb3VyY2UgdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFVSTENvbm5lY3Rpb259IHdpbGwgcG9pbnQgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24oVVJMIHVybCkgewogICAgICAgICB0aGlzLnVybCA9IHVybDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFc3RhYmxpc2hlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoaXMKLSAgICAgKiA8Y29kZT5VUkw8L2NvZGU+IHdpdGggdGhpcyA8Y29kZT5tZXRob2Q8L2NvZGU+LCBhbG9uZyB3aXRoIG90aGVyCi0gICAgICogb3B0aW9ucyB0aGF0IGNhbiBvbmx5IGJlIHNldCBiZWZvcmUgdGhpcyBjb25uZWN0aW9uIGlzIG1hZGUuCisgICAgICogRXN0YWJsaXNoZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGVhcmxpZXIgY29uZmlndXJlZCByZXNvdXJjZS4gVGhlCisgICAgICogY29ubmVjdGlvbiBjYW4gb25seSBiZSBzZXQgdXAgYmVmb3JlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbm5lY3RpbmcKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiBAc2VlIFVSTFN0cmVhbUhhbmRsZXIKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29ubmVjdGluZyB0byB0aGUgcmVzb3VyY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIDxjb2RlPmFsbG93VXNlckludGVyYWN0aW9uPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMKLSAgICAgKiBpZiB0aGlzIGNvbm5lY3Rpb24gYWxsb3dzIHVzZXIgaW50ZXJhY3Rpb24KKyAgICAgKiBHZXRzIHRoZSBvcHRpb24gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdXNlciBpbnRlcmFjdGlvbiBpcyBhbGxvd2VkCisgICAgICogb24gdGhpcyB7QGNvZGUgVVJMQ29ubmVjdGlvbn0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZsYWcKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UmVxdWVzdFByb3BlcnR5Ci0gICAgICogQHNlZSAjc2V0RGVmYXVsdFJlcXVlc3RQcm9wZXJ0eQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24ge0Bjb2RlIGFsbG93VXNlckludGVyYWN0aW9ufS4KICAgICAgKiBAc2VlICNhbGxvd1VzZXJJbnRlcmFjdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEFsbG93VXNlckludGVyYWN0aW9uKCkgewogICAgICAgICByZXR1cm4gYWxsb3dVc2VySW50ZXJhY3Rpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhpcyA8Y29kZT5VUkw8L2NvZGU+LiBJdCBmaXJzdAotICAgICAqIGF0dGVtcHRzIHRvIGdldCB0aGUgY29udGVudCB0eXBlIGZyb20gPGNvZGU+Z2V0Q29udGVudFR5cGUoKTwvY29kZT4sCi0gICAgICogd2hpY2ggbG9va3MgZm9yIHRoZSByZXNwb25zZSBoZWFkZXIgZmllbGQgIkNvbnRlbnQtVHlwZSIuIElmIG5vbmUgaXMKLSAgICAgKiBmb3VuZCwgaXQgd2lsbCBndWVzcyB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gSWYKLSAgICAgKiB0aGF0IGZhaWxzLCBpdCB3aWxsIGd1ZXNzIGJ5IGluc3BlY3RpbmcgdGhlIHN0cmVhbS4KKyAgICAgKiBHZXRzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlIHRoaXMge0Bjb2RlCisgICAgICogVVJMQ29ubmVjdGlvbn0gaXMgY29ubmVjdGVkIHRvLiBGaXJzdCwgaXQgYXR0ZW1wdHMgdG8gZ2V0IHRoZSBjb250ZW50CisgICAgICogdHlwZSBmcm9tIHRoZSBtZXRob2Qge0Bjb2RlIGdldENvbnRlbnRUeXBlKCl9IHdoaWNoIGxvb2tzIGF0IHRoZSByZXNwb25zZQorICAgICAqIGhlYWRlciBmaWVsZCAiQ29udGVudC1UeXBlIi4gSWYgbm9uZSBpcyBmb3VuZCBpdCB3aWxsIGd1ZXNzIHRoZSBjb250ZW50CisgICAgICogdHlwZSBmcm9tIHRoZSBmaWxlbmFtZSBleHRlbnNpb24uIElmIHRoYXQgZmFpbHMgdGhlIHN0cmVhbSBpdHNlbGYgd2lsbCBiZQorICAgICAqIHVzZWQgdG8gZ3Vlc3MgdGhlIGNvbnRlbnQgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgb2JqZWN0Ci0gICAgICogCisgICAgICogQHJldHVybiB0aGUgY29udGVudCByZXByZXNlbnRpbmcgb2JqZWN0LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBJTyBlcnJvciBvY2N1cnJlZAotICAgICAqIAotICAgICAqIEBzZWUgQ29udGVudEhhbmRsZXIKLSAgICAgKiBAc2VlIENvbnRlbnRIYW5kbGVyRmFjdG9yeQotICAgICAqIEBzZWUgSU9FeGNlcHRpb24KLSAgICAgKiBAc2VlICNzZXRDb250ZW50SGFuZGxlckZhY3RvcnkKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgb2J0YWluaW5nIHRoZSBjb250ZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKQEAgLTE1MCwxOSArMTg5LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhpcyA8Y29kZT5VUkw8L2NvZGU+LiBJdCBmaXJzdAotICAgICAqIGF0dGVtcHRzIHRvIGdldCB0aGUgY29udGVudCB0eXBlIGZyb20gPGNvZGU+Z2V0Q29udGVudFR5cGUoKTwvY29kZT4sCi0gICAgICogd2hpY2ggbG9va3MgZm9yIHRoZSByZXNwb25zZSBoZWFkZXIgZmllbGQgIkNvbnRlbnQtVHlwZSIuIElmIG5vbmUgaXMKLSAgICAgKiBmb3VuZCwgaXQgd2lsbCBndWVzcyB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gSWYKLSAgICAgKiB0aGF0IGZhaWxzLCBpdCB3aWxsIGd1ZXNzIGJ5IGluc3BlY3RpbmcgdGhlIHN0cmVhbS4KKyAgICAgKiBHZXRzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlIHRoaXMge0Bjb2RlCisgICAgICogVVJMQ29ubmVjdGlvbn0gaXMgY29ubmVjdGVkIHRvLiBGaXJzdCwgaXQgYXR0ZW1wdHMgdG8gZ2V0IHRoZSBjb250ZW50CisgICAgICogdHlwZSBmcm9tIHRoZSBtZXRob2Qge0Bjb2RlIGdldENvbnRlbnRUeXBlKCl9IHdoaWNoIGxvb2tzIGF0IHRoZSByZXNwb25zZQorICAgICAqIGhlYWRlciBmaWVsZCAiQ29udGVudC1UeXBlIi4gSWYgbm9uZSBpcyBmb3VuZCBpdCB3aWxsIGd1ZXNzIHRoZSBjb250ZW50CisgICAgICogdHlwZSBmcm9tIHRoZSBmaWxlbmFtZSBleHRlbnNpb24uIElmIHRoYXQgZmFpbHMgdGhlIHN0cmVhbSBpdHNlbGYgd2lsbCBiZQorICAgICAqIHVzZWQgdG8gZ3Vlc3MgdGhlIGNvbnRlbnQgdHlwZS4gVGhlIGNvbnRlbnQgdHlwZSBtdXN0IG1hdGNoIHdpdGggb25lIG9mCisgICAgICogdGhlIGxpc3Qge0Bjb2RlIHR5cGVzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGFjY2VwdGFibGUgY29udGVudCB0eXBlcwotICAgICAqIEByZXR1cm4gT2JqZWN0IFRoZSBvYmplY3Qgb2YgdGhlIHJlc291cmNlIHBvaW50ZWQgYnkgdGhpcyBVUkwsIG9yIG51bGwgaWYKLSAgICAgKiAgICAgICAgIHRoZSBjb250ZW50IGRvZXMgbm90IG1hdGNoIGEgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGFjY2VwdGFibGUgY29udGVudCB0eXBlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IHJlcHJlc2VudGluZyBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBjb250ZW50CisgICAgICogICAgICAgICB0eXBlIGRvZXMgbm90IG1hdGNoIHdpdGggb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycmVkIG9idGFpbmluZyB0aGUgY29udGVudC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgb2J0YWluaW5nIHRoZSBjb250ZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIC8vIFBhcmFtIGlzIG5vdCBnZW5lcmljIGluIHNwZWMKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTE4MywyMCArMjI0LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ29udGVudCBlbmNvZGluZyB0eXBlIG9mIHRoZSByZXNwb25zZSBib2R5LCBudWxsIGlmIG5vIHN1Y2gKLSAgICAgKiBmaWVsZCBpcyBmb3VuZCBpbiB0aGUgaGVhZGVyIHJlc3BvbnNlLgorICAgICAqIEdldHMgdGhlIGNvbnRlbnQgZW5jb2RpbmcgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIHJlc3BvbnNlIGhlYWRlciBmaWVsZAorICAgICAqIHtAY29kZSBjb250ZW50LWVuY29kaW5nfSBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcyBmaWVsZCBpcyBub3Qgc2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgZW5jb2RpbmcgdHlwZQotICAgICAqIAotICAgICAqIEBzZWUgI2dldENvbnRlbnRUeXBlCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIGhlYWRlciBmaWVsZCB7QGNvZGUgY29udGVudC1lbmNvZGluZ30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50RW5jb2RpbmcoKSB7CiAgICAgICAgIHJldHVybiBnZXRIZWFkZXJGaWVsZCgiQ29udGVudC1FbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWMgQ29udGVudEhhbmRsZXIgdGhhdCB3aWxsIGhhbmRsZSB0aGUgdHlwZQotICAgICAqIDxjb2RlPmNvbnRlbnRUeXBlPC9jb2RlPgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmljIENvbnRlbnRIYW5kbGVyIHRoYXQgd2lsbCBoYW5kbGUgdGhlIHR5cGUge0Bjb2RlCisgICAgICogY29udGVudFR5cGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCiAgICAgICogICAgICAgICAgICBUaGUgdHlwZSB0aGF0IG5lZWRzIHRvIGJlIGhhbmRsZWQKQEAgLTI3MCw3MCArMzEwLDYxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZW50IG9yIGJvZHkgaW4gdGhlIHJlc3BvbnNlIGhlYWRlciBpbgotICAgICAqIGJ5dGVzLiBBbnN3ZXIgLTEgaWYgPGNvZGU+IENvbnRlbnQtTGVuZ3RoIDwvY29kZT4gY2Fubm90IGJlIGZvdW5kIGluIHRoZQotICAgICAqIHJlc3BvbnNlIGhlYWRlci4KKyAgICAgKiBHZXRzIHRoZSBjb250ZW50IGxlbmd0aCBpbiBieXRlcyBzcGVjaWZpZWQgYnkgdGhlIHJlc3BvbnNlIGhlYWRlciBmaWVsZAorICAgICAqIHtAY29kZSBjb250ZW50LWxlbmd0aH0gb3Ige0Bjb2RlIC0xfSBpZiB0aGlzIGZpZWxkIGlzIG5vdCBzZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBjb250ZW50Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0Q29udGVudFR5cGUKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVzcG9uc2UgaGVhZGVyIGZpZWxkIHtAY29kZSBjb250ZW50LWxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgewogICAgICAgICByZXR1cm4gZ2V0SGVhZGVyRmllbGRJbnQoIkNvbnRlbnQtTGVuZ3RoIiwgLTEpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY29udGVudC4gUmV0dXJucyA8Y29kZT4gbnVsbCA8L2NvZGU+IGlmIHRoZXJlJ3MKLSAgICAgKiBubyBzdWNoIGZpZWxkLgorICAgICAqIEdldHMgdGhlIE1JTUUtdHlwZSBvZiB0aGUgY29udGVudCBzcGVjaWZpZWQgYnkgdGhlIHJlc3BvbnNlIGhlYWRlciBmaWVsZAorICAgICAqIHtAY29kZSBjb250ZW50LXR5cGV9IG9yIHtAY29kZSBudWxsfSBpZiB0eXBlIGlzIHVua25vd24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgY29udGVudAotICAgICAqIAotICAgICAqIEBzZWUgI2d1ZXNzQ29udGVudFR5cGVGcm9tTmFtZQotICAgICAqIEBzZWUgI2d1ZXNzQ29udGVudFR5cGVGcm9tU3RyZWFtCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIGhlYWRlciBmaWVsZCB7QGNvZGUgY29udGVudC10eXBlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewogICAgICAgICByZXR1cm4gZ2V0SGVhZGVyRmllbGQoIkNvbnRlbnQtVHlwZSIpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggd2hlbiB0aGlzIHJlc3BvbnNlIGhlYWRlcgotICAgICAqIHdhcyBjcmVhdGVkLCBvciAwIGlmIHRoZSBmaWVsZCA8Y29kZT5EYXRlPC9jb2RlPiBpcyBub3QgZm91bmQgaW4gdGhlCi0gICAgICogaGVhZGVyLgorICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoaXMgcmVzcG9uc2UgaGFzIGJlZW4gc2VudCBhcyBhIGRhdGUgaW4KKyAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIEdNVCBvciB7QGNvZGUgMH0gaWYgdGhpcyB0aW1lc3RhbXAgaXMKKyAgICAgKiB1bmtub3duLgogICAgICAqIAotICAgICAqIEByZXR1cm4gRGF0ZSBpbiBtaWxsaXNlY29uZCBzaW5jZSBlcG9jaAotICAgICAqIAotICAgICAqIEBzZWUgI2dldEV4cGlyYXRpb24KLSAgICAgKiBAc2VlICNnZXRMYXN0TW9kaWZpZWQKLSAgICAgKiBAc2VlIGphdmEudXRpbC5EYXRlCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgc2VuZGluZyB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgcmVzcG9uc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0RGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIGdldEhlYWRlckZpZWxkRGF0ZSgiRGF0ZSIsIDApOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29ubmVjdGlvbiBhbGxvdyB1c2VyIGludGVyYWN0aW9uIGJ5IGRlZmF1bHQuCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCBzZXR0aW5nIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIGFsbG93cyB1c2VyIGludGVyYWN0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIDxjb2RlPmRlZmF1bHRBbGxvd1VzZXJJbnRlcmFjdGlvbjwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRBbGxvd1VzZXJJbnRlcmFjdGlvbgotICAgICAqIEBzZWUgI3NldERlZmF1bHRBbGxvd1VzZXJJbnRlcmFjdGlvbgotICAgICAqIEBzZWUgI3NldEFsbG93VXNlckludGVyYWN0aW9uCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgc2V0dGluZyB7QGNvZGUKKyAgICAgKiAgICAgICAgIGRlZmF1bHRBbGxvd1VzZXJJbnRlcmFjdGlvbn0uCiAgICAgICogQHNlZSAjYWxsb3dVc2VySW50ZXJhY3Rpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVmYXVsdEFsbG93VXNlckludGVyYWN0aW9uKCkgewogICAgICAgICByZXR1cm4gZGVmYXVsdEFsbG93VXNlckludGVyYWN0aW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgPGNvZGU+ZmllbGQ8L2NvZGU+LAotICAgICAqIG51bGwgaWYgdGhlcmUncyBubyBzdWNoIGZpZWxkLgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCB7QGNvZGUgZmllbGR9IG9yIHtAY29kZQorICAgICAqIG51bGx9IGlmIHRoZSBmaWVsZCBjb3VsZCBub3QgYmUgZm91bmQuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKKyAgICAgKiBtZXRob2QgcmV0dXJucyBhbHdheXMge0Bjb2RlIG51bGx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHRvIGdldCB0aGUgcmVxdWVzdCBwcm9wZXJ0eSBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZCB0byBiZSBsb29rZWQgdXAKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0IGZpZWxkIHdob3NlIGRlZmF1bHQgdmFsdWUgc2hhbGwgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkLgogICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFJlcXVlc3RQcm9wZXJ0eX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRSZXF1ZXN0UHJvcGVydHkoU3RyaW5nIGZpZWxkKSB7CkBAIC0zNDEsNjQgKzM3Miw1OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gdXNlIGNhY2hlcyBieSBkZWZhdWx0LgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgc2V0dGluZyB3aGV0aGVyIHRoaXMgY29ubmVjdGlvbiBhbGxvd3MgdXNpbmcgY2FjaGVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gdXNlIGNhY2hlcyBieSBkZWZhdWx0LCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRVc2VDYWNoZXMKLSAgICAgKiBAc2VlICNzZXREZWZhdWx0VXNlQ2FjaGVzCi0gICAgICogQHNlZSAjc2V0VXNlQ2FjaGVzCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgc2V0dGluZyB7QGNvZGUgZGVmYXVsdFVzZUNhY2hlc30uCiAgICAgICogQHNlZSAjdXNlQ2FjaGVzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFVzZUNhY2hlcygpIHsKICAgICAgICAgcmV0dXJuIGRlZmF1bHRVc2VDYWNoZXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29ubmVjdGlvbiBzdXBwb3J0cyBpbnB1dC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uIHtAY29kZSBkb0lucHV0fSB3aGljaCBzcGVjaWZpZXMgd2hldGhlciB0aGlzCisgICAgICogY29ubmVjdGlvbiBhbGxvd3MgdG8gcmVjZWl2ZSBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gc3VwcG9ydHMgaW5wdXQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBzZWUgI3NldERvSW5wdXQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbm5lY3Rpb24gYWxsb3dzIGlucHV0LCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjZG9JbnB1dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldERvSW5wdXQoKSB7CiAgICAgICAgIHJldHVybiBkb0lucHV0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gc3VwcG9ydHMgb3V0cHV0LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24ge0Bjb2RlIGRvT3V0cHV0fSB3aGljaCBzcGVjaWZpZXMgd2hldGhlcgorICAgICAqIHRoaXMgY29ubmVjdGlvbiBhbGxvd3MgdG8gc2VuZCBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gc3VwcG9ydHMgb3V0cHV0LCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAc2VlICNzZXREb091dHB1dAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29ubmVjdGlvbiBhbGxvd3Mgb3V0cHV0LCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjZG9PdXRwdXQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXREb091dHB1dCgpIHsKICAgICAgICAgcmV0dXJuIGRvT3V0cHV0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoIHdoZW4gdGhpcyByZXNwb25zZSBoZWFkZXIKLSAgICAgKiBleHBpcmVzIG9yIDAgaWYgdGhlIGZpZWxkIDxjb2RlPkV4cGlyZXM8L2NvZGU+IGlzIG5vdCBmb3VuZCBpbiB0aGUKLSAgICAgKiBoZWFkZXIuCisgICAgICogR2V0cyB0aGUgdGltZXN0YW1wIHdoZW4gdGhpcyByZXNwb25zZSB3aWxsIGJlIGV4cGlyZWQgaW4gbWlsbGlzZWNvbmRzCisgICAgICogc2luY2UgSmFudWFyeSAxLCAxOTcwIEdNVCBvciB7QGNvZGUgMH0gaWYgdGhpcyB0aW1lc3RhbXAgaXMgdW5rbm93bi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIERhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0SGVhZGVyRmllbGQoaW50KQotICAgICAqIEBzZWUgI2dldEhlYWRlckZpZWxkKFN0cmluZykKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZERhdGUoU3RyaW5nLCBsb25nKQotICAgICAqIEBzZWUgI2dldEhlYWRlckZpZWxkSW50KFN0cmluZywgaW50KQotICAgICAqIEBzZWUgI2dldEhlYWRlckZpZWxkS2V5KGludCkKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVzcG9uc2UgaGVhZGVyIGZpZWxkIHtAY29kZSBleHBpcmVzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRFeHBpcmF0aW9uKCkgewogICAgICAgICByZXR1cm4gZ2V0SGVhZGVyRmllbGREYXRlKCJFeHBpcmVzIiwgMCk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNSU1FIHRhYmxlIG9mIHRoaXMgVVJMIGNvbm5lY3Rpb24uCisgICAgICogR2V0cyB0aGUgdGFibGUgd2hpY2ggaXMgdXNlZCBieSBhbGwge0Bjb2RlIFVSTENvbm5lY3Rpb259IGluc3RhbmNlcyB0bworICAgICAqIGRldGVybWluZSB0aGUgTUlNRS10eXBlIGFjY29yZGluZyB0byBhIGZpbGUgZXh0ZW5zaW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gRmlsZU5hbWVNYXAKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIG5hbWUgbWFwIHRvIGRldGVybWluZSB0aGUgTUlNRS10eXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRmlsZU5hbWVNYXAgZ2V0RmlsZU5hbWVNYXAoKSB7CiAgICAgICAgIC8vIE11c3QgdXNlIGxhenkgaW5pdGlhbGl6YXRpb24gb3IgdGhlcmUgaXMgYSBib290c3RyYXAgcHJvYmxlbQpAQCAtNDExLDQyICs0MzcsMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYXQgcG9zaXRpb24gPGNvZGU+cG9zPGNvZGU+LgotICAgICAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gPGNvZGU+cG9zPC9jb2RlPiBmaWVsZHMKLSAgICAgKiBpbiB0aGUgcmVzcG9uc2UgaGVhZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIAkJcG9zIAkJdGhlIHBvc2l0aW9uIG9mIHRoZSBmaWVsZAotICAgICAqIEByZXR1cm4gCQlUaGUgdmFsdWUgb2YgdGhlIGZpZWxkCi0gICAgICoKLSAgICAgKiBAc2VlIAkJI2dldEhlYWRlckZpZWxkRGF0ZQotICAgICAqIEBzZWUgCQkjZ2V0SGVhZGVyRmllbGRJbnQKLSAgICAgKiBAc2VlIAkJI2dldEhlYWRlckZpZWxkS2V5CisgICAgICogR2V0cyB0aGUgaGVhZGVyIHZhbHVlIGF0IHRoZSBmaWVsZCBwb3NpdGlvbiB7QGNvZGUgcG9zfSBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiBpZiB0aGUgaGVhZGVyIGhhcyBmZXdlciB0aGFuIHtAY29kZSBwb3N9IGZpZWxkcy4gVGhlIGN1cnJlbnQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIGFsd2F5cyB7QGNvZGUgbnVsbH0uCisgICAgICogCisgICAgICogQHBhcmFtIHBvcworICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHBvc2l0aW9uIG9mIHRoZSByZXNwb25zZSBoZWFkZXIuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGF0IHBvc2l0aW9uIHtAY29kZSBwb3N9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyRmllbGQoaW50IHBvcykgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhbiB1bm1vZGlmaWFibGUgbWFwIG9mIHRoZSBjb25uZWN0aW9uIGhlYWRlciB2YWx1ZXMuIFRoZSBtYXAKLSAgICAgKiBrZXlzIGFyZSB0aGUgU3RyaW5nIGhlYWRlciBmaWVsZCBuYW1lcy4gRWFjaCBtYXAgdmFsdWUgaXMgYSBMaXN0IG9mIHRoZQotICAgICAqIGhlYWRlciBmaWVsZCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQga2V5IG5hbWUuCisgICAgICogR2V0cyBhbiB1bmNoYW5nZWFibGUgbWFwIG9mIHRoZSByZXNwb25zZS1oZWFkZXIgZmllbGRzIGFuZCB2YWx1ZXMuIFRoZQorICAgICAqIHJlc3BvbnNlLWhlYWRlciBmaWVsZCBuYW1lcyBhcmUgdGhlIGtleSB2YWx1ZXMgb2YgdGhlIG1hcC4gVGhlIG1hcCB2YWx1ZXMKKyAgICAgKiBhcmUgbGlzdHMgb2YgaGVhZGVyIGZpZWxkIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGtleSBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcHBpbmcgb2YgaGVhZGVyIGZpZWxkIG5hbWVzIHRvIHZhbHVlcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjQKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNwb25zZS1oZWFkZXIgcmVwcmVzZW50aW5nIGdlbmVyaWMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldEhlYWRlckZpZWxkcygpIHsKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvdmlkZXMgYW4gdW5tb2RpZmlhYmxlIG1hcCBvZiB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLiBUaGUgbWFwIGtleXMgYXJlCi0gICAgICogU3RyaW5ncywgdGhlIG1hcCB2YWx1ZXMgYXJlIGVhY2ggYSBMaXN0IG9mIFN0cmluZ3MsIHdpdGggZWFjaCByZXF1ZXN0Ci0gICAgICogcHJvcGVydHkgbmFtZSBtYXBwZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzLgorICAgICAqIEdldHMgYW4gdW5jaGFuZ2VhYmxlIG1hcCBvZiBnZW5lcmFsIHJlcXVlc3QgcHJvcGVydGllcyB1c2VkIGJ5IHRoaXMKKyAgICAgKiBjb25uZWN0aW9uLiBUaGUgcmVxdWVzdCBwcm9wZXJ0eSBuYW1lcyBhcmUgdGhlIGtleSB2YWx1ZXMgb2YgdGhlIG1hcC4gVGhlCisgICAgICogbWFwIHZhbHVlcyBhcmUgbGlzdHMgb2YgcHJvcGVydHkgdmFsdWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGtleSBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcHBpbmcgb2YgcmVxdWVzdCBwcm9wZXJ0eSBuYW1lcyB0byB2YWx1ZXMKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS40CisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdC1wcm9wZXJ0eSByZXByZXNlbnRpbmcgZ2VuZXJpYyBtYXAuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0UmVxdWVzdFByb3BlcnRpZXMoKSB7CiAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKQEAgLTQ1NiwyMCArNDc4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gcmVxdWVzdCBwcm9wZXJ0eS4gV2lsbCBub3Qgb3ZlcndyaXRlIGFueSBleGlzdGluZwotICAgICAqIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWVsZCBuYW1lLgorICAgICAqIEFkZHMgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHRoZSByZXF1ZXN0IGhlYWRlci4gRXhpc3RpbmcgcHJvcGVydGllcyB3aXRoCisgICAgICogdGhlIHNhbWUgbmFtZSB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiBieSB0aGlzIG1ldGhvZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0IHByb3BlcnR5IGZpZWxkIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0IHByb3BlcnR5IGZpZWxkIG5hbWUgdG8gYWRkLgogICAgICAqIEBwYXJhbSBuZXdWYWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLQotICAgICAqICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24gYWxyZWFkeSBlc3RhYmxpc2hlZAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQotICAgICAqICAgICAgICAgICAgIGlmIGZpZWxkIGlzIG51bGwKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS40CisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGlzIHRvIGFkZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGFscmVhZHkgZXN0YWJsaXNoZWQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0UHJvcGVydHkoU3RyaW5nIGZpZWxkLCBTdHJpbmcgbmV3VmFsdWUpIHsKICAgICAgICAgaWYgKGNvbm5lY3RlZCkgewpAQCAtNDgxLDM1ICs1MDEsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgY29ycmVzcG9uZGluZyB0byB0aGUgPGNvZGU+a2V5PC9jb2RlPgotICAgICAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBmaWVsZC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyIGZpZWxkIHNwZWNpZmllZCBieSB7QGNvZGUga2V5fSBvciB7QGNvZGUKKyAgICAgKiBudWxsfSBpZiB0aGVyZSBpcyBubyBmaWVsZCB3aXRoIHRoaXMgbmFtZS4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIGFsd2F5cyB7QGNvZGUgbnVsbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWVsZAotICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIgZmllbGQKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZERhdGUKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZEludAotICAgICAqIEBzZWUgI2dldEhlYWRlckZpZWxkS2V5CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIgZmllbGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVsZChTdHJpbmcga2V5KSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGUgdmFsdWUgaW4gdGhlIGZvcm0gb2YgbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoCi0gICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQgPGNvZGU+ZmllbGQ8L2NvZGU+LiBSZXR1cm5zCi0gICAgICogPGNvZGU+ZGVmYXVsdFZhbHVlPC9jb2RlPiBpZiBubyBzdWNoIGZpZWxkIGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVzcG9uc2UKLSAgICAgKiBoZWFkZXIuCisgICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIGhlYWRlciB2YWx1ZSBhcyBhIGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkKKyAgICAgKiAxLCAxOTcwIEdNVC4gUmV0dXJucyB0aGUge0Bjb2RlIGRlZmF1bHRWYWx1ZX0gaWYgbm8gc3VjaCBoZWFkZXIgZmllbGQKKyAgICAgKiBjb3VsZCBiZSBmb3VuZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBpbiBxdWVzdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGhlYWRlciBmaWVsZCBuYW1lIHdob3NlIHZhbHVlIGlzIG5lZWRlZC4KICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBubyBmaWVsZCBpcyBmb3VuZAotICAgICAqIEByZXR1cm4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoCi0gICAgICogCi0gICAgICogQHNlZSAjaWZNb2RpZmllZFNpbmNlCi0gICAgICogQHNlZSAjc2V0SWZNb2RpZmllZFNpbmNlCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBubyBmaWVsZCBoYXMgYmVlbiBmb3VuZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGhlYWRlciBmaWVsZCBhcyBhIGRhdGUgaW4KKyAgICAgKiAgICAgICAgIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRIZWFkZXJGaWVsZERhdGUoU3RyaW5nIGZpZWxkLCBsb25nIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICBTdHJpbmcgZGF0ZSA9IGdldEhlYWRlckZpZWxkKGZpZWxkKTsKQEAgLTUyMCwxNCArNTM2LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLiBSZXR1cm5zIGRlZmF1bHQgdmFsdWUKLSAgICAgKiA8Y29kZT5kZWZhdWx0VmFsdWU8L2NvZGU+IGlmIG5vIHN1Y2ggZmllbGQgZXhpc3RzLgorICAgICAqIEdldHMgdGhlIHNwZWNpZmllZCBoZWFkZXIgdmFsdWUgYXMgYSBudW1iZXIuIFJldHVybnMgdGhlIHtAY29kZQorICAgICAqIGRlZmF1bHRWYWx1ZX0gaWYgbm8gc3VjaCBoZWFkZXIgZmllbGQgY291bGQgYmUgZm91bmQgb3IgdGhlIHZhbHVlIGNvdWxkCisgICAgICogbm90IGJlIHBhcnNlZCBhcyBhbiB7QGNvZGUgSW50ZWdlcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQgdG8gcmV0dXJuCisgICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIGZpZWxkIG5hbWUgd2hvc2UgdmFsdWUgaXMgbmVlZGVkLgogICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRvIGJlIHJldHVybmVkIGlmIDxjb2RlPmZpZWxkPjwvY29kZT4gZG9lcyBub3QgZXhpc3QKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSBmaWVsZAorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm8gZmllbGQgaGFzIGJlZW4gZm91bmQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBoZWFkZXIgZmllbGQgYXMgYSBudW1iZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRIZWFkZXJGaWVsZEludChTdHJpbmcgZmllbGQsIGludCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgdHJ5IHsKQEAgLTUzOCw2OCArNTU2LDUyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYXQgcG9zaXRpb24gc3BlY2lmaWVkIGJ5IDxjb2RlPnBvc248L2NvZGU+LAotICAgICAqIG51bGwgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gPGNvZGU+cG9zbjwvY29kZT4gZmllbGRzLgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWVsZCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24ge0Bjb2RlIHBvc259IG9yCisgICAgICoge0Bjb2RlIG51bGx9IGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuIHtAY29kZSBwb3NufSBmaWVsZHMuIFRoZSBjdXJyZW50CisgICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyBhbHdheXMge0Bjb2RlIG51bGx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3NuCi0gICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gdG8gbG9vayBmb3I7IHRoZSBmaXJzdCBmaWVsZCBiZWluZyAwCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZERhdGUKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZEludAotICAgICAqIEBzZWUgI2dldEhlYWRlckZpZWxkKGludCkKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZChTdHJpbmcpCi0gICAgICogQHNlZSAjZ2V0SGVhZGVyRmllbGREYXRlKFN0cmluZywgbG9uZykKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZEludChTdHJpbmcsIGludCkKLSAgICAgKiBAc2VlICNnZXRIZWFkZXJGaWVsZEtleShpbnQpCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGhlYWRlciBmaWVsZCB3aGljaCBoYXMgdG8gYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgaGVhZGVyIGZpZWxkIG5hbWUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyRmllbGRLZXkoaW50IHBvc24pIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+aWZNb2RpZmllZFNpbmNlPC9jb2RlPiBvZiB0aGlzIGNvbm5lY3Rpb24gaW4KLSAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gKKyAgICAgKiBHZXRzIHRoZSBwb2ludCBvZiB0aW1lIHNpbmNlIHdoZW4gdGhlIGRhdGEgbXVzdCBiZSBtb2RpZmllZCB0byBiZQorICAgICAqIHRyYW5zbWl0dGVkLiBTb21lIHByb3RvY29scyB0cmFuc21pdCBkYXRhIG9ubHkgaWYgaXQgaGFzIGJlZW4gbW9kaWZpZWQKKyAgICAgKiBtb3JlIHJlY2VudGx5IHRoYW4gYSBwYXJ0aWN1bGFyIHRpbWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGltZSBzaW5jZSBlcG9jaAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCBHTVQuCiAgICAgICogQHNlZSAjaWZNb2RpZmllZFNpbmNlCi0gICAgICogQHNlZSAjc2V0SWZNb2RpZmllZFNpbmNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0SWZNb2RpZmllZFNpbmNlKCkgewogICAgICAgICByZXR1cm4gaWZNb2RpZmllZFNpbmNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgZnJvbSB0aGlzIFVSTCBDb25uZWN0aW9uLiBJdCB0aHJvd3MKLSAgICAgKiBVbmtub3duU2VydmljZUV4Y2VwdGlvbiBieSBkZWZhdWx0LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieQotICAgICAqIGl0cyBzdWJjbGFzc2VzCisgICAgICogR2V0cyBhbiB7QGNvZGUgSW5wdXRTdHJlYW19IGZvciByZWFkaW5nIGRhdGEgZnJvbSB0aGUgcmVzb3VyY2UgcG9pbnRlZCBieQorICAgICAqIHRoaXMge0Bjb2RlIFVSTENvbm5lY3Rpb259LiBJdCB0aHJvd3MgYW4gVW5rbm93blNlcnZpY2VFeGNlcHRpb24gYnkKKyAgICAgKiBkZWZhdWx0LiBUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgaXRzIHN1YmNsYXNzZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgSW5wdXRTdHJlYW0gdG8gcmVhZCBmcm9tCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgSW5wdXRTdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIElucHV0U3RyZWFtIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0Q29udGVudCgpCi0gICAgICogQHNlZSAjZ2V0Q29udGVudChDbGFzc1tdKQotICAgICAqIEBzZWUgI2dldE91dHB1dFN0cmVhbQotICAgICAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbQotICAgICAqIEBzZWUgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIG5vIElucHV0U3RyZWFtIGNvdWxkIGJlIGNyZWF0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVua25vd25TZXJ2aWNlRXhjZXB0aW9uKE1zZy5nZXRTdHJpbmcoIkswMDRkIikpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIDxjb2RlPkxhc3QtTW9kaWZpZWQ8L2NvZGU+IGluIHRoZQotICAgICAqIHJlc3BvbnNlIGhlYWRlciwgMCBpZiBubyBzdWNoIGZpZWxkIGV4aXN0cworICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNwb25zZSBoZWFkZXIgZmllbGQge0Bjb2RlIGxhc3QtbW9kaWZpZWR9IG9yCisgICAgICoge0Bjb2RlIDB9IGlmIHRoaXMgdmFsdWUgaXMgbm90IHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgbGFzdCBtb2RpZmllZAotICAgICAqIAotICAgICAqIEBzZWUgamF2YS51dGlsLkRhdGUKLSAgICAgKiBAc2VlICNnZXREYXRlCi0gICAgICogQHNlZSAjZ2V0RXhwaXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUgbGFzdC1tb2RpZmllZH0gaGVhZGVyIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCAhPSAtMSkgewpAQCAtNjA5LDYwICs2MTEsNDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGlzIFVSTCBDb25uZWN0aW9uLiBJdCB0aHJvd3MKLSAgICAgKiBVbmtub3duU2VydmljZUV4Y2VwdGlvbiBieSBkZWZhdWx0LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieQotICAgICAqIHN1YmNsYXNzZXMuCisgICAgICogR2V0cyBhbiB7QGNvZGUgT3V0cHV0U3RyZWFtfSBmb3Igd3JpdGluZyBkYXRhIHRvIHRoaXMge0Bjb2RlCisgICAgICogVVJMQ29ubmVjdGlvbn0uIEl0IHRocm93cyBhbiB7QGNvZGUgVW5rbm93blNlcnZpY2VFeGNlcHRpb259IGJ5IGRlZmF1bHQuCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGl0cyBzdWJjbGFzc2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0bwotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSBkYXRhLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBPdXRwdXRTdHJlYW0gY291bGQgbm90IGJlIGNyZWF0ZWQKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRDb250ZW50KCkKLSAgICAgKiBAc2VlICNnZXRDb250ZW50KENsYXNzW10pCi0gICAgICogQHNlZSAjZ2V0SW5wdXRTdHJlYW0KLSAgICAgKiBAc2VlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBubyBPdXRwdXRTdHJlYW0gY291bGQgYmUgY3JlYXRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBVbmtub3duU2VydmljZUV4Y2VwdGlvbihNc2cuZ2V0U3RyaW5nKCJLMDA1ZiIpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBlcm1pc3Npb25zIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBjb25uZWN0aW9uLiBEZXBlbmRpbmcgb24KLSAgICAgKiB0aGUgcHJvdG9jb2wsIHRoaXMgY2FuIGJlIGFueSBvZiB0aGUgcGVybWlzc2lvbiBzdWJjbGFzc2VzLiBUaGUKLSAgICAgKiBwZXJtaXNzaW9uIHJldHVybmVkIG1heSBhbHNvIGRlcGVuZCBvbiB0aGUgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24sIEUuRwotICAgICAqIEluIHRoZSBjYXNlIG9mIEhUVFAsIHJlZGlyZWN0aW9uIGNhbiBjaGFuZ2UgdGhlIGFwcGxpY2FibGUgcGVybWlzc2lvbiBpZgotICAgICAqIHRoZSBob3N0IGNoYW5nZWQuCisgICAgICogR2V0cyBhIHtAY29kZSBQZXJtaXNzaW9ufSBvYmplY3QgcmVwcmVzZW50aW5nIGFsbCBuZWVkZWQgcGVybWlzc2lvbnMgdG8KKyAgICAgKiBvcGVuIHRoaXMgY29ubmVjdGlvbi4gVGhlIHJldHVybmVkIHBlcm1pc3Npb24gb2JqZWN0IGRlcGVuZHMgb24gdGhlIHN0YXRlCisgICAgICogb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHdpbGwgYmUge0Bjb2RlIG51bGx9IGlmIG5vIHBlcm1pc3Npb25zIGFyZQorICAgICAqIG5lY2Vzc2FyeS4gQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgQWxsUGVybWlzc2lvbn0uCisgICAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcndyaXRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbiBhcHByb3ByaWF0ZQorICAgICAqIHBlcm1pc3Npb24gb2JqZWN0LgogICAgICAqIAotICAgICAqIDxwPgotICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kcyByZXR1cm5zIDxjb2RlPkFsbFBlcm1pc3Npb248L2NvZGU+LgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbgotICAgICAqIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwZXJtaXNzaW9uIG9iamVjdCBnb3Zlcm5pbmcgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwZXJtaXNzaW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5lZWRlZCBwZXJtaXNzaW9ucyB0byBvcGVuCisgICAgICogICAgICAgICB0aGlzIGNvbm5lY3Rpb24uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICBwZXJtaXNzaW9uIG9iamVjdC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBwZXJtaXNzaW9uIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbmV3IGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGluIHRoZSByZXF1ZXN0IEhlYWRlciwgbnVsbAotICAgICAqIGlmIG5vIHN1Y2ggZmllbGQgZXhpc3RzLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0IGhlYWRlciBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkge2NvZGUgZmllbGR9CisgICAgICogb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vIGZpZWxkIHdpdGggdGhpcyBuYW1lLiBUaGUgY3VycmVudAorICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgYWx3YXlzIHtAY29kZSBudWxsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byBnZXQgdGhlIHByb3BlcnR5IGZvcgotICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIHRvIGxvb2sgdXAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtCi0gICAgICogICAgICAgICAgICAgaWYgY29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJlcXVlc3RQcm9wZXJ0eQotICAgICAqIEBzZWUgI3NldERlZmF1bHRSZXF1ZXN0UHJvcGVydHkKLSAgICAgKiBAc2VlICNzZXRSZXF1ZXN0UHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0IGhlYWRlciBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBhbHJlYWR5IGVzdGFibGlzaGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFByb3BlcnR5KFN0cmluZyBmaWVsZCkgewogICAgICAgICBpZiAoY29ubmVjdGVkKSB7CkBAIC02NzIsNTUgKzY2Miw1MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxjb2RlPlVSTDwvY29kZT4gb2YgdGhpcyBjb25uZWN0aW9uCisgICAgICogR2V0cyB0aGUgVVJMIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIFVSTENvbm5lY3Rpb259LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFVSTCBvZiB0aGlzIGNvbm5lY3Rpb24KLSAgICAgKiAKLSAgICAgKiBAc2VlIFVSTAotICAgICAqIEBzZWUgI1VSTENvbm5lY3Rpb24oVVJMKQorICAgICAqIEByZXR1cm4gdGhlIFVSTCBvZiB0aGlzIGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTCBnZXRVUkwoKSB7CiAgICAgICAgIHJldHVybiB1cmw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29ubmVjdGlvbiB1c2VzIGNhY2hlcworICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHdoaWNoIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMge0Bjb2RlCisgICAgICogVVJMQ29ubmVjdGlvbn0gYWxsb3dzIHRvIHVzZSBjYWNoZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZsYWcKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB1c2luZyBjYWNoZXMgaXMgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ2FjaGVzKCkgewogICAgICAgICByZXR1cm4gdXNlQ2FjaGVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICogPGNvZGU+IHN0cmluZyA8L2NvZGU+IFVSTCwgdXNpbmcgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gQW55IGZyYWdtZW50CisgICAgICogRGV0ZXJtaW5lcyB0aGUgTUlNRS10eXBlIG9mIHRoZSBnaXZlbiByZXNvdXJjZSB7QGNvZGUgdXJsfSBieSByZXNvbHZpbmcKKyAgICAgKiB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uIHdpdGggdGhlIGludGVybmFsIEZpbGVOYW1lTWFwLiBBbnkgZnJhZ21lbnQKICAgICAgKiBpZGVudGlmaWVyIGlzIHJlbW92ZWQgYmVmb3JlIHByb2Nlc3NpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gVVJMCi0gICAgICogCi0gICAgICogQHNlZSBGaWxlTmFtZU1hcAotICAgICAqIEBzZWUgRmlsZU5hbWVNYXAjZ2V0Q29udGVudFR5cGVGb3IoU3RyaW5nKQotICAgICAqIEBzZWUgI2dldENvbnRlbnRUeXBlCi0gICAgICogQHNlZSAjZ3Vlc3NDb250ZW50VHlwZUZyb21TdHJlYW0KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgd2l0aCB0aGUgZmlsZW5hbWUgdG8gZ2V0IHRoZSBNSU1FIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgZ3Vlc3NlZCBjb250ZW50IHR5cGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB0eXBlIGNvdWxkIG5vdCBiZQorICAgICAqICAgICAgICAgZGV0ZXJtaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0NvbnRlbnRUeXBlRnJvbU5hbWUoU3RyaW5nIHVybCkgewogICAgICAgICByZXR1cm4gZ2V0RmlsZU5hbWVNYXAoKS5nZXRDb250ZW50VHlwZUZvcih1cmwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4YW1pbmVzIHRoZSBieXRlcyBvZiB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSBNSU1FIHR5cGUsIG51bGwgaWYKLSAgICAgKiBubyBjb250ZW50IHR5cGUgY2FuIGJlIGRlZHVjZWQuCisgICAgICogRGV0ZXJtaW5lcyB0aGUgTUlNRS10eXBlIG9mIHRoZSByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICoge0Bjb2RlIGlzfSBieSByZWFkaW5nIGl0cyBmaXJzdCBmZXcgY2hhcmFjdGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBVUkwKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSByZXByZXNlbnRpbmcgaW5wdXQgc3RyZWFtIHRvIGRldGVybWluZSB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbnRlbnQgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBndWVzc2VkIGNvbnRlbnQgdHlwZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHR5cGUgY291bGQgbm90IGJlCisgICAgICogICAgICAgICBkZXRlcm1pbmVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiBJTyBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1ZXNzQ29udGVudFR5cGVGcm9tU3RyZWFtKElucHV0U3RyZWFtIGlzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTc2NywxNCArNzU1LDE2IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gYWxsb3dzIHVzZXIgaW50ZXJhY3Rpb24KLSAgICAgKiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBwcmlvciB0byBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuCisgICAgICogb3Igbm90LiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgcHJpb3IgdG8gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBlc3RhYmxpc2htZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdWYWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHRvIGJlIHNldAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHRvIGJlIHNldC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgZmxhZyBhZnRlciBhIGNvbm5lY3Rpb24KLSAgICAgKiAgICAgICAgICAgICBoYXMgYmVlbiBlc3RhYmxpc2hlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgZmxhZyBhZnRlciB0aGUKKyAgICAgKiAgICAgICAgICAgICBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqIEBzZWUgI2FsbG93VXNlckludGVyYWN0aW9uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oYm9vbGVhbiBuZXdWYWx1ZSkgewogICAgICAgICBpZiAoY29ubmVjdGVkKSB7CkBAIC03ODQsMjIgKzc3NCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgY29udGVudCBoYW5kbGVyIGZhY3RvcnkgdG8gYmUKLSAgICAgKiA8Y29kZT5jb250ZW50RmFjdG9yeTwvY29kZT4uIEl0IGNhbiBvbmx5IGRvIHNvIHdpdGggdGhlIHBlcm1pc3Npb24gb2YKLSAgICAgKiB0aGUgc2VjdXJpdHkgbWFuYWdlci4gVGhlIENvbnRlbnRGYWN0b3J5IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbmNlCi0gICAgICogZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBhcHBsaWNhdGlvbi4KKyAgICAgKiBTZXRzIHRoZSBpbnRlcm5hbGx5IHVzZWQgY29udGVudCBoYW5kbGVyIGZhY3RvcnkuIFRoZSBjb250ZW50IGZhY3RvcnkgY2FuCisgICAgICogb25seSBiZSBzZXQgaWYgaXQgaXMgYWxsb3dlZCBieSB0aGUgc2VjdXJpdHkgbWFuYWdlciBhbmQgb25seSBvbmNlIGR1cmluZworICAgICAqIHRoZSBsaWZldGltZSBvZiB0aGUgYXBwbGljYXRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbnRlbnRGYWN0b3J5Ci0gICAgICogICAgICAgICAgICB0aGUgZmFjdG9yeQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgZmFjdG9yeSB0byBiZSBzZXQuCiAgICAgICogQHRocm93cyBFcnJvcgotICAgICAqICAgICAgICAgICAgIGlmIGEgQ29udGVudEZhY3RvcnkgaGFzIGJlZW4gY3JlYXRlZCBiZWZvcmUgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2VjdXJpdHkgbWFuYWdlciBkb2VzIG5vdCBhbGxvdyB0aGlzIGFjdGlvbgotICAgICAqIAotICAgICAqIEBzZWUgQ29udGVudEhhbmRsZXIKLSAgICAgKiBAc2VlIENvbnRlbnRIYW5kbGVyRmFjdG9yeQotICAgICAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrU2V0RmFjdG9yeSgpCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNlY3VyaXR5IG1hbmFnZXIgZG9lcyBub3QgYWxsb3cgdG8gc2V0IHRoZSBjb250ZW50CisgICAgICogICAgICAgICAgICAgZmFjdG9yeSBvciBpdCBoYXMgYmVlbiBhbHJlYWR5IHNldCBlYXJsaWVyIGFnby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvbnRlbnRIYW5kbGVyRmFjdG9yeSgKICAgICAgICAgICAgIENvbnRlbnRIYW5kbGVyRmFjdG9yeSBjb250ZW50RmFjdG9yeSkgewpAQCAtODE0LDQyICs3OTgsNDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB1c2VyIGludGVyYWN0aW9uIGlzIGFsbG93ZWQgYnkgZGVmYXVsdC4gRXhpc3RpbmcKLSAgICAgKiBVUkxDb25uZWN0aW9ucyBhcmUgdW5hZmZlY3RlZC4KKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uCisgICAgICogYWxsb3dzIHVzZXIgaW50ZXJhY3Rpb24gb3Igbm90LiBFeGlzdGluZyB7QGNvZGUgVVJMQ29ubmVjdGlvbn1zIGFyZQorICAgICAqIHVuYWZmZWN0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFsbG93cwotICAgICAqICAgICAgICAgICAgYWxsb3cgdXNlciBpbnRlcmFjdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZsYWcgdG8gYmUgdXNlZCBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICAgICAqIEBzZWUgI2RlZmF1bHRBbGxvd1VzZXJJbnRlcmFjdGlvbgorICAgICAqIEBzZWUgI2FsbG93VXNlckludGVyYWN0aW9uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRBbGxvd1VzZXJJbnRlcmFjdGlvbihib29sZWFuIGFsbG93cykgewogICAgICAgICBkZWZhdWx0QWxsb3dVc2VySW50ZXJhY3Rpb24gPSBhbGxvd3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgPGNvZGU+ZmllbGQ8L2NvZGU+IGluIHRoZSBkZWZhdWx0IHJlcXVlc3QgaGVhZGVyIHdpdGggdGhlCi0gICAgICogdmFsdWUgPGNvZGU+dmFsdWU8L2NvZGU+CisgICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyIGZpZWxkLiBUaGlzIHZhbHVlCisgICAgICogd2lsbCBiZSB1c2VkIGZvciB0aGUgc3BlY2lmaWMgZmllbGQgb2YgZXZlcnkgbmV3bHkgY3JlYXRlZCBjb25uZWN0aW9uLgorICAgICAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0IGhlYWRlciBmaWVsZCB0byBiZSBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0IGhlYWRlciBmaWVsZCB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0UmVxdWVzdFByb3BlcnR5fQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZC4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRSZXF1ZXN0UHJvcGVydHl9IG9mIGFuIGV4aXN0aW5nIHtAY29kZQorICAgICAqICAgICAgICAgICAgIFVSTENvbm5lY3Rpb259IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRSZXF1ZXN0UHJvcGVydHkoU3RyaW5nIGZpZWxkLCBTdHJpbmcgdmFsdWUpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciBjYWNoZXMgYXJlIHVzZWQgYnkgZGVmYXVsdC4gRXhpc3RpbmcgVVJMQ29ubmVjdGlvbnMgYXJlCi0gICAgICogdW5hZmZlY3RlZC4KKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uCisgICAgICogYWxsb3dzIHRvIHVzZSBjYWNoZXMuIEV4aXN0aW5nIHtAY29kZSBVUkxDb25uZWN0aW9ufXMgYXJlIHVuYWZmZWN0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld1ZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgdG8gYmUgc2V0Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFVzZUNhY2hlcwotICAgICAqIEBzZWUgI2dldFVzZUNhY2hlcwotICAgICAqIEBzZWUgI3NldFVzZUNhY2hlcworICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZsYWcgdG8gYmUgdXNlZCBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICAgICAqIEBzZWUgI2RlZmF1bHRVc2VDYWNoZXMKICAgICAgKiBAc2VlICN1c2VDYWNoZXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VXNlQ2FjaGVzKGJvb2xlYW4gbmV3VmFsdWUpIHsKICAgICAgICAgaWYgKGNvbm5lY3RlZCkgewpAQCAtODU5LDIwICs4NDcsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBVUkxDb25uZWN0aW9uIGFsbG93cyBpbnB1dC4gSXQgY2Fubm90IGJlIHNldCBhZnRlciB0aGUKLSAgICAgKiBjb25uZWN0aW9uIGlzIG1hZGUuCisgICAgICogU2V0cyB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gYWxsb3dzIGlucHV0LgorICAgICAqIEl0IGNhbm5vdCBiZSBzZXQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld1ZhbHVlCi0gICAgICogICAgICAgICAgICBib29sZWFuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgZmxhZyB0byBiZSBzZXQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXJyb3IKLSAgICAgKiAgICAgICAgICAgICBFeGNlcHRpb24gdGhyb3duIHdoZW4gdGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gY2hhbmdlIHRoZQotICAgICAqICAgICAgICAgICAgIHZhbHVlIGFmdGVyIGNvbm5lY3RlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgdmFsdWUgYWZ0ZXIgdGhlCisgICAgICogICAgICAgICAgICAgY29ubmVjdGlvbiBoYXMgYmVlbiBhbHJlYWR5IGVzdGFibGlzaGVkLgogICAgICAqIEBzZWUgI2RvSW5wdXQKLSAgICAgKiBAc2VlICNnZXREb0lucHV0Ci0gICAgICogQHNlZSAjc2V0RG9JbnB1dAotICAgICAqIEBzZWUgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFcnJvcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERvSW5wdXQoYm9vbGVhbiBuZXdWYWx1ZSkgewogICAgICAgICBpZiAoY29ubmVjdGVkKSB7CkBAIC04ODIsMjAgKzg2NiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGlzIFVSTENvbm5lY3Rpb24gYWxsb3dzIG91dHB1dC4gSXQgY2Fubm90IGJlIHNldCBhZnRlciB0aGUKLSAgICAgKiBjb25uZWN0aW9uIGlzIG1hZGUuCisgICAgICogU2V0cyB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gYWxsb3dzCisgICAgICogb3V0cHV0LiBJdCBjYW5ub3QgYmUgc2V0IGFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdWYWx1ZQotICAgICAqICAgICAgICAgICAgYm9vbGVhbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGZsYWcgdG8gYmUgc2V0LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0Vycm9yCi0gICAgICogICAgICAgICAgICAgRXhjZXB0aW9uIHRocm93biB3aGVuIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZSBhZnRlciBjb25uZWN0ZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBhdHRlbXB0cyB0byBjaGFuZ2UgdGhlIHZhbHVlIGFmdGVyIHRoZQorICAgICAqICAgICAgICAgICAgIGNvbm5lY3Rpb24gaGFzIGJlZW4gYWxyZWFkeSBlc3RhYmxpc2hlZC4KICAgICAgKiBAc2VlICNkb091dHB1dAotICAgICAqIEBzZWUgI2dldERvT3V0cHV0Ci0gICAgICogQHNlZSAjc2V0RG9PdXRwdXQKLSAgICAgKiBAc2VlIGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXJyb3IKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREb091dHB1dChib29sZWFuIG5ld1ZhbHVlKSB7CiAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKQEAgLTkwNSwxMSArODg1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV2l0aCBwZXJtaXNzaW9uIGZyb20gdGhlIHNlY3VyaXR5IG1hbmFnZXIsIHRoaXMgbWV0aG9kIHNldHMgdGhlCi0gICAgICogPGNvZGU+bWFwPC9jb2RlPiB0byBiZSB0aGUgTUlNRSBUYWJsZSBvZiB0aGlzIFVSTCBjb25uZWN0aW9uLgorICAgICAqIFNldHMgdGhlIGludGVybmFsIG1hcCB3aGljaCBpcyB1c2VkIGJ5IGFsbCB7QGNvZGUgVVJMQ29ubmVjdGlvbn0KKyAgICAgKiBpbnN0YW5jZXMgdG8gZGV0ZXJtaW5lIHRoZSBNSU1FLXR5cGUgYWNjb3JkaW5nIHRvIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYXAKICAgICAgKiAgICAgICAgICAgIHRoZSBNSU1FIHRhYmxlIHRvIGJlIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmlsZU5hbWVNYXAoRmlsZU5hbWVNYXAgbWFwKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBtYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpAQCAtOTIwLDEyICs5MDEsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBoZWFkZXIgZmllbGQgPGNvZGU+aWZNb2RpZmllZFNpbmNlPC9jb2RlPi4KKyAgICAgKiBTZXRzIHRoZSBwb2ludCBvZiB0aW1lIHNpbmNlIHdoZW4gdGhlIGRhdGEgbXVzdCBiZSBtb2RpZmllZCB0byBiZQorICAgICAqIHRyYW5zbWl0dGVkLiBTb21lIHByb3RvY29scyB0cmFuc21pdCBkYXRhIG9ubHkgaWYgaXQgaGFzIGJlZW4gbW9kaWZpZWQKKyAgICAgKiBtb3JlIHJlY2VudGx5IHRoYW4gYSBwYXJ0aWN1bGFyIHRpbWUuIFRoZSBkYXRhIHdpbGwgYmUgdHJhbnNtaXR0ZWQKKyAgICAgKiByZWdhcmRsZXNzIG9mIGl0cyB0aW1lc3RhbXAgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIHtAY29kZSAwfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3VmFsdWUKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAgR01ULgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYWxyZWFkeSBjb25uZWN0ZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gaGFzIGFscmVhZHkgYmVlbiBjb25uZWN0ZWQuCisgICAgICogQHNlZSAjaWZNb2RpZmllZFNpbmNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SWZNb2RpZmllZFNpbmNlKGxvbmcgbmV3VmFsdWUpIHsKICAgICAgICAgaWYgKGNvbm5lY3RlZCkgewpAQCAtOTM1LDIzICs5MjEsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBoZWFkZXIgZmllbGQgPGNvZGU+IGZpZWxkIDwvY29kZT4gdG8KLSAgICAgKiA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gT25seSB0aGUgY3VycmVudCBVUkwgQ29ubmVjdGlvbiBpcyBhZmZlY3RlZC4gSXQKLSAgICAgKiBjYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIG1hZGUKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyIGZpZWxkLiBUaGUgdmFsdWUgd2lsbCBvbmx5CisgICAgICogYmUgdXNlZCBieSB0aGUgY3VycmVudCB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gaW5zdGFuY2UuIFRoaXMgbWV0aG9kIGNhbgorICAgICAqIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZAorICAgICAqICAgICAgICAgICAgdGhlIHJlcXVlc3QgaGVhZGVyIGZpZWxkIHRvIGJlIHNldC4KICAgICAgKiBAcGFyYW0gbmV3VmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCdzIG5ldyB2YWx1ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICBpZiBmaWVsZCBpcyBudWxsCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJlcXVlc3RQcm9wZXJ0eQotICAgICAqIEBzZWUgI3NldERlZmF1bHRSZXF1ZXN0UHJvcGVydHkKLSAgICAgKiBAc2VlICNnZXRSZXF1ZXN0UHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGFscmVhZHkgZXN0YWJsaXNoZWQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIge0Bjb2RlIGZpZWxkfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFByb3BlcnR5KFN0cmluZyBmaWVsZCwgU3RyaW5nIG5ld1ZhbHVlKSB7CiAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKQEAgLTk2MywyMCArOTQ1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgY29ubmVjdGlvbiB1c2VzIGNhY2hlcy4gVGhpcyB2YWx1ZQotICAgICAqIGNhbm5vdCBiZSBzZXQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaXMgbWFkZS4KKyAgICAgKiBTZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gYWxsb3dzIHRvIHVzZSBjYWNoZXMgb3IKKyAgICAgKiBub3QuIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBwcmlvciB0byB0aGUgY29ubmVjdGlvbgorICAgICAqIGVzdGFibGlzaG1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld1ZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgdG8gYmUgc2V0Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgdG8gYmUgc2V0LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRXhjZXB0aW9uIHRocm93biB3aGVuIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZSBhZnRlciBjb25uZWN0ZWQKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXREZWZhdWx0VXNlQ2FjaGVzCi0gICAgICogQHNlZSAjc2V0RGVmYXVsdFVzZUNhY2hlcwotICAgICAqIEBzZWUgI2dldFVzZUNhY2hlcworICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgZmxhZyBhZnRlciB0aGUKKyAgICAgKiAgICAgICAgICAgICBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgogICAgICAqIEBzZWUgI3VzZUNhY2hlcworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFVzZUNhY2hlcyhib29sZWFuIG5ld1ZhbHVlKSB7CiAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKQEAgLTk4NiwxMyArOTY1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHRpbWVvdXQgZm9yIGNvbm5lY3Rpb24gdG8gcGVyZm9ybSBub24tYmxvY2suIERlZmF1bHQgaXMgemVyby4KLSAgICAgKiBUaW1lb3V0IG9mIHplcm8gbWVhbnMgaW5maW5pdGUuCisgICAgICogU2V0cyB0aGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgZm9yIGVzdGFibGlzaGluZyB0aGUgY29ubmVjdGlvbiB0bworICAgICAqIHRoZSByZXNvdXJjZSBwb2ludGVkIGJ5IHRoaXMge0Bjb2RlIFVSTENvbm5lY3Rpb259IGluc3RhbmNlLiBBIHtAY29kZQorICAgICAqIFNvY2tldFRpbWVvdXRFeGNlcHRpb259IGlzIHRocm93biBpZiB0aGUgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUKKyAgICAgKiBlc3RhYmxpc2hlZCBpbiB0aGlzIHRpbWUuIERlZmF1bHQgaXMge0Bjb2RlIDB9IHdoaWNoIHN0YW5kcyBmb3IgYW4KKyAgICAgKiBpbmZpbml0ZSB0aW1lb3V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aW1lb3V0IGZvciBjb25uZWN0aW9uIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb25uZWN0aW5nIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGltZW91dCBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFyYW1ldGVyIHtAY29kZSB0aW1lb3V0fSBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgewogICAgICAgICBpZiAoMCA+IHRpbWVvdXQpIHsKQEAgLTEwMDIsMjIgKzk4NSwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0aW1lb3V0IG9mIGNvbm5lY3Rpb24gYnkgbWlsbGlzZWNvbmRzCisgICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBjb25uZWN0aW5nIHRpbWVvdXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aW1lb3V0IG9mIGNvbm5lY3Rpb24gYnkgbWlsbGlzZWNvbmRzCisgICAgICogQHJldHVybiB0aGUgY29ubmVjdGluZyB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldENvbm5lY3RUaW1lb3V0KCkgewogICAgICAgICByZXR1cm4gY29ubmVjdFRpbWVvdXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHRpbWVvdXQgZm9yIHJlYWRpbmcgdG8gcGVyZm9ybSBub24tYmxvY2suIERlZmF1bHQgaXMgemVyby4gVGltZW91dAotICAgICAqIG9mIHplcm8gbWVhbnMgaW5maW5pdGUuCisgICAgICogU2V0cyB0aGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgZm9yIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogb2YgYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbiB0byB0aGUgcmVzb3VyY2UuIEEge0Bjb2RlCisgICAgICogU29ja2V0VGltZW91dEV4Y2VwdGlvbn0gaXMgdGhyb3duIGlmIHRoZSBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZQorICAgICAqIGVzdGFibGlzaGVkIGluIHRoaXMgdGltZS4gRGVmYXVsdCBpcyB7QGNvZGUgMH0gd2hpY2ggc3RhbmRzIGZvciBhbgorICAgICAqIGluZmluaXRlIHRpbWVvdXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRpbWVvdXQKLSAgICAgKiAgICAgICAgICAgIHRpbWVvdXQgZm9yIHJlYWRpbmcgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqICAgICAgICAgICAgdGhlIHJlYWRpbmcgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIge0Bjb2RlIHRpbWVvdXR9IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlYWRUaW1lb3V0KGludCB0aW1lb3V0KSB7CiAgICAgICAgIGlmICgwID4gdGltZW91dCkgewpAQCAtMTAyNywyMSArMTAxNSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0aW1lb3V0IG9mIHJlYWRpbmcgYnkgbWlsbGlzZWNvbmRzCisgICAgICogR2V0cyB0aGUgY29uZmlndXJlZCB0aW1lb3V0IGZvciByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbSBvZiBhbgorICAgICAqIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24gdG8gdGhlIHJlc291cmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGltZW91dCBvZiByZWFkaW5nIGJ5IG1pbGxpc2Vjb25kcworICAgICAqIEByZXR1cm4gdGhlIHJlYWRpbmcgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSZWFkVGltZW91dCgpIHsKICAgICAgICAgcmV0dXJuIHJlYWRUaW1lb3V0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSA8Y29kZT5VUkxDb25uZWN0aW9uIDwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIGFuZAorICAgICAqIHRoZSBVUkwuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+VVJMQ29ubmVjdGlvbjwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRVUkwKLSAgICAgKiBAc2VlICNVUkxDb25uZWN0aW9uKFVSTCkKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgVVJMQ29ubmVjdGlvbn0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxEZWNvZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMRGVjb2Rlci5qYXZhCmluZGV4IDVlMGVjMjEuLmQyNzJhYTcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxEZWNvZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTERlY29kZXIuamF2YQpAQCAtMjQsNDkgKzI0LDUzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5VdGlsOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZWNvZGUgYSBzdHJpbmcgd2hpY2ggaXMgZW5jb2RlZCBpbiB0aGUKLSAqIDxjb2RlPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4gTUlNRSBjb250ZW50IHR5cGUuCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVjb2RlIGEgc3RyaW5nIHdoaWNoIGlzIGVuY29kZWQgaW4gdGhlIHtAY29kZQorICogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkfSBNSU1FIGNvbnRlbnQgdHlwZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBVUkxEZWNvZGVyIHsKIAogICAgIC8qKgotICAgICAqIERlY29kZXMgdGhlIHN0cmluZyBhcmd1bWVudCB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gdGhlCi0gICAgICogPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPiBNSU1FIGNvbnRlbnQgdHlwZS4KKyAgICAgKiBEZWNvZGVzIHRoZSBhcmd1bWVudCB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gdGhlIHtAY29kZQorICAgICAqIHgtd3d3LWZvcm0tdXJsZW5jb2RlZH0gTUlNRSBjb250ZW50IHR5cGUuCiAgICAgICogPHA+Ci0gICAgICogJysnIHdpbGwgYmUgY29udmVydGVkIHRvIHNwYWNlLCAnJScgYW5kIHR3byBmb2xsb3dpbmcgaGV4IGRpZ2l0CisgICAgIConKycgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3BhY2UsICclJyBhbmQgdHdvIGZvbGxvd2luZyBoZXggZGlnaXQKICAgICAgKiBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGVxdWl2YWxlbnQgYnl0ZSB2YWx1ZS4gQWxsIG90aGVyCi0gICAgICogY2hhcmFjdGVycyBhcmUgcGFzc2VkIHRocm91Z2ggdW5tb2RpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBlLmcuICJBK0IrQyAlMjQlMjUiIC0+ICJBIEIgQyAkJSIKKyAgICAgKiBjaGFyYWN0ZXJzIGFyZSBwYXNzZWQgdGhyb3VnaCB1bm1vZGlmaWVkLiBGb3IgZXhhbXBsZSAiQStCK0MgJTI0JTI1IiAtPgorICAgICAqICJBIEIgQyAkJSIuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBlbmNvZGVkIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgVGhlIGRlY29kZWQgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNkZWNvZGUoU3RyaW5nLCBTdHJpbmcpfSBpbnN0ZWFkCisgICAgICogICAgICAgICAgICB0aGUgZW5jb2RlZCBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCBjbGVhci10ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZGVjb2RlKFN0cmluZywgU3RyaW5nKX0gaW5zdGVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgewogICAgICAgICByZXR1cm4gVXRpbC5kZWNvZGUocywgdHJ1ZSk7CiAgICAgfQotCisgICAgCiAgICAgLyoqCi0gICAgICogRGVjb2RlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCBpbiB0aGUKLSAgICAgKiA8Y29kZT54LXd3dy1mb3JtLXVybGVuY29kZWQ8L2NvZGU+IE1JTUUgY29udGVudCB0eXBlIHVzaW5nIHRoZQotICAgICAqIHNwZWNpZmllZCBlbmNvZGluZyBzY2hlbWUuCisgICAgICogRGVjb2RlcyB0aGUgYXJndW1lbnQgd2hpY2ggaXMgYXNzdW1lZCB0byBiZSBlbmNvZGVkIGluIHRoZSB7QGNvZGUKKyAgICAgKiB4LXd3dy1mb3JtLXVybGVuY29kZWR9IE1JTUUgY29udGVudCB0eXBlIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcKKyAgICAgKiBzY2hlbWUuCiAgICAgICogPHA+Ci0gICAgICogJysnIHdpbGwgYmUgY29udmVydGVkIHRvIHNwYWNlLCAnJScgYW5kIHR3byBmb2xsb3dpbmcgaGV4IGRpZ2l0CisgICAgIConKycgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3BhY2UsICclJyBhbmQgdHdvIGZvbGxvd2luZyBoZXggZGlnaXQKICAgICAgKiBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGVxdWl2YWxlbnQgYnl0ZSB2YWx1ZS4gQWxsIG90aGVyCi0gICAgICogY2hhcmFjdGVycyBhcmUgcGFzc2VkIHRocm91Z2ggdW5tb2RpZmllZC4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBlLmcuICJBK0IrQyAlMjQlMjUiIC0+ICJBIEIgQyAkJSIKKyAgICAgKiBjaGFyYWN0ZXJzIGFyZSBwYXNzZWQgdGhyb3VnaCB1bm1vZGlmaWVkLiBGb3IgZXhhbXBsZSAiQStCK0MgJTI0JTI1IiAtPgorICAgICAqICJBIEIgQyAkJSIuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBlbmNvZGVkIHN0cmluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIHN0cmluZy4KICAgICAgKiBAcGFyYW0gZW5jCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBlbmNvZGluZyBzY2hlbWUgdG8gdXNlCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nIFRoZSBkZWNvZGVkIHZlcnNpb24uCisgICAgICogICAgICAgICAgICB0aGUgZW5jb2Rpbmcgc2NoZW1lIHRvIGJlIHVzZWQuCisgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCBjbGVhci10ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBzY2hlbWUgaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpCiAgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMRW5jb2Rlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTEVuY29kZXIuamF2YQppbmRleCA0NGU1NDJmLi42OWYyZDM3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMRW5jb2Rlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxFbmNvZGVyLmphdmEKQEAgLTIxLDcgKzIxLDkgQEAKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZW5jb2RlIGEgc3RyaW5nIHVzaW5nIHRoZSBmb3JtYXQgcmVxdWlyZWQgYnkKLSAqIDxjb2RlPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4gTUlNRSBjb250ZW50IHR5cGUuCisgKiB7QGNvZGUgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkfSBNSU1FIGNvbnRlbnQgdHlwZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBVUkxFbmNvZGVyIHsKIApAQCAtMzQsMjMgKzM2LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBjb250YWlucyBhIHV0aWxpdHkgbWV0aG9kIGZvciBjb252ZXJ0aW5nIGEgc3RyaW5nIHRvIHRoZQotICAgICAqIGZvcm1hdCByZXF1aXJlZCBieSB0aGUgPGNvZGU+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPgotICAgICAqIE1JTUUgY29udGVudCB0eXBlLgorICAgICAqIEVuY29kZXMgYSBnaXZlbiBzdHJpbmcge0Bjb2RlIHN9IGluIGEgeC13d3ctZm9ybS11cmxlbmNvZGVkIHN0cmluZyB1c2luZworICAgICAqIHRoZSBzcGVjaWZpZWQgZW5jb2Rpbmcgc2NoZW1lIHtAY29kZSBlbmN9LgogICAgICAqIDxwPgogICAgICAqIEFsbCBjaGFyYWN0ZXJzIGV4Y2VwdCBsZXR0ZXJzICgnYScuLid6JywgJ0EnLi4nWicpIGFuZCBudW1iZXJzICgnMCcuLic5JykKLSAgICAgKiBhbmQgY2hhcmFjdGVycyAnLicsICctJywgJyonLCAnXycgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZWlyIGhleGlkZWNpbWFsCi0gICAgICogdmFsdWUgcHJlcGVuZGVkIGJ5ICclJy4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgZXhhbXBsZTogJyMnIC0+ICUyMwotICAgICAqIDxwPgotICAgICAqIEluIGFkZGl0aW9uLCBzcGFjZXMgYXJlIHN1YnN0aXR1dGVkIGJ5ICcrJworICAgICAqIGFuZCBjaGFyYWN0ZXJzICcuJywgJy0nLCAnKicsICdfJyBhcmUgY29udmVydGVkIGludG8gdGhlaXIgaGV4YWRlY2ltYWwKKyAgICAgKiB2YWx1ZSBwcmVwZW5kZWQgYnkgJyUnLiBGb3IgZXhhbXBsZTogJyMnIC0+ICUyMy4gSW4gYWRkaXRpb24sIHNwYWNlcyBhcmUKKyAgICAgKiBzdWJzdGl0dXRlZCBieSAnKycKKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCiAgICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIGNvbnZlcnRlZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNlbmNvZGUoU3RyaW5nLCBTdHJpbmcpfSBpbnN0ZWFkCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGVuY29kZWQuCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBzdHJpbmcuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZW5jb2RlKFN0cmluZywgU3RyaW5nKX0gaW5zdGVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgewpAQCAtNzUsMjEgKzc0LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBjb250YWlucyBhIHV0aWxpdHkgbWV0aG9kIGZvciBjb252ZXJ0aW5nIGEgc3RyaW5nIHRvIHRoZQotICAgICAqIGZvcm1hdCByZXF1aXJlZCBieSB0aGUgPGNvZGU+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPgotICAgICAqIE1JTUUgY29udGVudCB0eXBlLgotICAgICAqIAorICAgICAqIEVuY29kZXMgdGhlIGdpdmVuIHN0cmluZyB7QGNvZGUgc30gaW4gYSB4LXd3dy1mb3JtLXVybGVuY29kZWQgc3RyaW5nCisgICAgICogdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBzY2hlbWUge0Bjb2RlIGVuY30uCisgICAgICogPHA+CiAgICAgICogQWxsIGNoYXJhY3RlcnMgZXhjZXB0IGxldHRlcnMgKCdhJy4uJ3onLCAnQScuLidaJykgYW5kIG51bWJlcnMgKCcwJy4uJzknKQogICAgICAqIGFuZCBjaGFyYWN0ZXJzICcuJywgJy0nLCAnKicsICdfJyBhcmUgY29udmVydGVkIGludG8gdGhlaXIgaGV4YWRlY2ltYWwKLSAgICAgKiB2YWx1ZSBwcmVwZW5kZWQgYnkgJyUnLgotICAgICAqIAotICAgICAqIEZvciBleGFtcGxlOiAnIycgLT4gJTIzCi0gICAgICogCi0gICAgICogSW4gYWRkaXRpb24sIHNwYWNlcyBhcmUgc3Vic3RpdHV0ZWQgYnkgJysnCisgICAgICogdmFsdWUgcHJlcGVuZGVkIGJ5ICclJy4gRm9yIGV4YW1wbGU6ICcjJyAtPiAlMjMuIEluIGFkZGl0aW9uLCBzcGFjZXMgYXJlCisgICAgICogc3Vic3RpdHV0ZWQgYnkgJysnCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiBAcGFyYW0gZW5jCisgICAgICogICAgICAgICAgICB0aGUgZW5jb2Rpbmcgc2NoZW1lIHRvIGJlIHVzZWQuCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBzdHJpbmcuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBzY2hlbWUgaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpCiAgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMU3RyZWFtSGFuZGxlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTFN0cmVhbUhhbmRsZXIuamF2YQppbmRleCBlZDMxMGYzLi5mMDVjOGJkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMU3RyZWFtSGFuZGxlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxTdHJlYW1IYW5kbGVyLmphdmEKQEAgLTIzLDQyICsyMyw0NiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVVJMVXRpbDsKIAogLyoqCi0gKiBUaGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB0aGF0IGltcGxlbWVudCBQcm90b2NvbCBIYW5kbGVyLgorICogVGhlIGFic3RyYWN0IGNsYXNzIHtAY29kZSBVUkxTdHJlYW1IYW5kbGVyfSBpcyB0aGUgYmFzZSBmb3IgYWxsIGNsYXNzZXMgd2hpY2gKKyAqIGNhbiBoYW5kbGUgdGhlIGNvbW11bmljYXRpb24gd2l0aCBhIFVSTCBvYmplY3Qgb3ZlciBhIHBhcnRpY3VsYXIgcHJvdG9jb2wKKyAqIHR5cGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVVJMU3RyZWFtSGFuZGxlciB7CisKICAgICAvKioKLSAgICAgKiBFc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIHJlc291cmNlIHNwZWNpZmllZCBieSA8Y29kZT5VUkw8L2NvZGU+LgotICAgICAqIFNpbmNlIGRpZmZlcmVudCBwcm90b2NvbHMgbWF5IGhhdmUgdW5pcXVlIHdheXMgb2YgY29ubmVjdGluZywgaXQgbXVzdCBiZQotICAgICAqIG92ZXJ3cml0dGVuIGJ5IHRoZSBzdWJjbGFzcy4KKyAgICAgKiBFc3RhYmxpc2hlcyBhIG5ldyBjb25uZWN0aW9uIHRvIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgYnkgdGhlIFVSTCB7QGNvZGUKKyAgICAgKiB1fS4gU2luY2UgZGlmZmVyZW50IHByb3RvY29scyBhbHNvIGhhdmUgdW5pcXVlIHdheXMgb2YgY29ubmVjdGluZywgaXQKKyAgICAgKiBtdXN0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBzdWJjbGFzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LlVSTENvbm5lY3Rpb24KICAgICAgKiBAcGFyYW0gdQotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRocm93biBpZiBhbiBJTyBlcnJvciBvY2N1cnMgZHVyaW5nIGNvbm5lY3Rpb24KLSAgICAgKiAgICAgICAgICAgICAgICBlc3RhYmxpc2htZW50CisgICAgICogICAgICAgICAgICB0aGUgVVJMIHRvIHRoZSByZXNvdXJjZSB3aGVyZSBhIGNvbm5lY3Rpb24gaGFzIHRvIGJlIG9wZW5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcGVuZWQgVVJMQ29ubmVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIGR1cmluZyBvcGVuaW5nIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKFVSTCB1KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIDxjb2RlPm9wZW5Db25uZWN0aW9uKFVSTCB1KTwvY29kZT4gZXhjZXB0Ci0gICAgICogdGhhdCBpdCB1c2VzIHRoZSA8Y29kZT5wcm94eTwvY29kZT4gdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUKLSAgICAgKiA8Y29kZT5VUkw8L2NvZGU+LiBTaW5jZSBkaWZmZXJlbnQgcHJvdG9jb2xzIG1heSBoYXZlIGRpZmZlcmVudCB3YXlzIG9mCi0gICAgICogY29ubmVjdGluZywgaXQgbXVzdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgc3ViY2xhc3MuCisgICAgICogRXN0YWJsaXNoZXMgYSBuZXcgY29ubmVjdGlvbiB0byB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSBVUkwge0Bjb2RlCisgICAgICogdX0gdXNpbmcgdGhlIGdpdmVuIHtAY29kZSBwcm94eX0uIFNpbmNlIGRpZmZlcmVudCBwcm90b2NvbHMgYWxzbyBoYXZlCisgICAgICogdW5pcXVlIHdheXMgb2YgY29ubmVjdGluZywgaXQgbXVzdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgc3ViY2xhc3MuCiAgICAgICogCi0gICAgICogQHJldHVybiBqYXZhLm5ldC5VUkxDb25uZWN0aW9uCiAgICAgICogQHBhcmFtIHUKLSAgICAgKiAgICAgICAgICAgIGphdmEubmV0LlVSTAorICAgICAqICAgICAgICAgICAgdGhlIFVSTCB0byB0aGUgcmVzb3VyY2Ugd2hlcmUgYSBjb25uZWN0aW9uIGhhcyB0byBiZSBvcGVuZWQuCiAgICAgICogQHBhcmFtIHByb3h5Ci0gICAgICogICAgICAgICAgICB0aGUgcHJveHkgd2hpY2ggaXMgdXNlZCB0byBtYWtlIHRoZSBjb25uZWN0aW9uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcHJveHkgdGhhdCBpcyB1c2VkIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHJldHVybiB0aGUgb3BlbmVkIFVSTENvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgdGhyb3duIGlmIGFuIElPIGVycm9yIG9jY3VycyBkdXJpbmcgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50CisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyBkdXJpbmcgb3BlbmluZyB0aGUgY29ubmVjdGlvbi4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBhcmd1bWVudCBpcyBudWxsIG9yIHRoZSB0eXBlIG9mIHByb3h5IGlzIHdyb25nLgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBhcmd1bWVudCBpcyB7QGNvZGUgbnVsbH0gb3IgdGhlIHR5cGUgb2YgcHJveHkgaXMKKyAgICAgKiAgICAgICAgICAgICB3cm9uZy4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3RvY29sIGhhbmRsZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKFVSTCB1LCBQcm94eSBwcm94eSkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC02NiwyMyArNzAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgPGNvZGU+c3RyaW5nPC9jb2RlPnN0ciBpbnRvIDxjb2RlPlVSTDwvY29kZT4gdXNpbmcgdSdzCi0gICAgICogY29udGV4dC4gVVJMIHN0cmluZ3MgZ2VuZXJhbGx5IGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0gICAgICogPGNvZGU+PGNlbnRlcj4vL3d3dy5jb21wYW55LmNvbS9qYXZhL2ZpbGUxLmphdmEjcmVmZXJlbmNlIDwvY2VudGVyPjwvY29kZT4KKyAgICAgKiBQYXJzZXMgdGhlIGNsZWFyIHRleHQgVVJMIGluIHtAY29kZSBzdHJ9IGludG8gYSBVUkwgb2JqZWN0LiBVUkwgc3RyaW5ncworICAgICAqIGdlbmVyYWxseSBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgICAqIDxwPgorICAgICAqIGh0dHA6Ly93d3cuY29tcGFueS5jb20vamF2YS9maWxlMS5qYXZhI3JlZmVyZW5jZQorICAgICAqIDwvcD4KICAgICAgKiBUaGUgc3RyaW5nIGlzIHBhcnNlZCBpbiBIVFRQIGZvcm1hdC4gSWYgdGhlIHByb3RvY29sIGhhcyBhIGRpZmZlcmVudCBVUkwKICAgICAgKiBmb3JtYXQgdGhpcyBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSB1Ci0gICAgICogICAgICAgICAgICBqYXZhLm5ldC5VUkwgVGhlIFVSTCB0byByZWNlaXZlIHBhcnNlZCB2YWx1ZXMuCisgICAgICogICAgICAgICAgICB0aGUgVVJMIHRvIGZpbGwgaW4gdGhlIHBhcnNlZCBjbGVhciB0ZXh0IFVSTCBwYXJ0cy4KICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBzdHJpbmcgVVJMIHNwZWMgZnJvbSB3aGljaCB1IGlzIGRlcml2ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgc3RyaW5nIHRoYXQgaXMgdG8gYmUgcGFyc2VkLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgaW50IFRoZSBpbmRleCBpbiB0aGUgc3RyaW5nIGZyb20gd2hpY2ggdG8gYmVnaW4gcGFyc2luZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBwb3NpdGlvbiBmcm9tIHdoZXJlIHRvIGJlZ2luIHBhcnNpbmcuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgaW50IFRoZSBpbmRleCB0byBzdG9wIHBhcnNpbmcKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgcG9zaXRpb24gdG8gc3RvcCBwYXJzaW5nLgogICAgICAqIEBzZWUgI3RvRXh0ZXJuYWxGb3JtCiAgICAgICogQHNlZSBVUkwKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVVSTChVUkwgdSwgU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5LCByZWZlciB0byBIYXJtb255LTI5NDEKQEAgLTIzNiwyNSArMjQyLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmllbGRzIG9mIHRoZSA8Y29kZT5VUkw8L2NvZGU+IHdpdGggdGhlIHN1cHBsaWVkIGFyZ3VtZW50cworICAgICAqIFNldHMgdGhlIGZpZWxkcyBvZiB0aGUgVVJMIHtAY29kZSB1fSB0byB0aGUgdmFsdWVzIG9mIHRoZSBzdXBwbGllZAorICAgICAqIGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdQotICAgICAqICAgICAgICAgICAgamF2YS5uZXQuVVJMIFRoZSBub24tbnVsbCBVUkwgdG8gYmUgc2V0CisgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwgVVJMIG9iamVjdCB0byBiZSBzZXQuCiAgICAgICogQHBhcmFtIHByb3RvY29sCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBwcm90b2NvbAorICAgICAqICAgICAgICAgICAgdGhlIHByb3RvY29sLgogICAgICAqIEBwYXJhbSBob3N0Ci0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBob3N0IG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUuCiAgICAgICogQHBhcmFtIHBvcnQKLSAgICAgKiAgICAgICAgICAgIGludCBUaGUgcG9ydCBudW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlci4KICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgZmlsZSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIGNvbXBvbmVudC4KICAgICAgKiBAcGFyYW0gcmVmCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSByZWZlcmVuY2UKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEudXRpbC5TZXQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UuCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHNldFVSTChVUkwsIFN0cmluZyBTdHJpbmcsIGludCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywKLSAgICAgKiAgICAgICAgICAgICBTdHJpbmcsIFN0cmluZykKKyAgICAgKiAgICAgICAgICAgICBTdHJpbmcsIFN0cmluZykgaW5zdGVhZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVSTChVUkwgdSwgU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsCkBAIC0yNjYsMjggKzI3MSwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpZWxkcyBvZiB0aGUgPGNvZGU+VVJMPC9jb2RlPiB3aXRoIHRoZSBzdXBwbGllZCBhcmd1bWVudHMKKyAgICAgKiBTZXRzIHRoZSBmaWVsZHMgb2YgdGhlIFVSTCB7QGNvZGUgdX0gdG8gdGhlIHZhbHVlcyBvZiB0aGUgc3VwcGxpZWQKKyAgICAgKiBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHUKLSAgICAgKiAgICAgICAgICAgIGphdmEubmV0LlVSTCBUaGUgbm9uLW51bGwgVVJMIHRvIGJlIHNldAorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsIFVSTCBvYmplY3QgdG8gYmUgc2V0LgogICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgcHJvdG9jb2wKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm90b2NvbC4KICAgICAgKiBAcGFyYW0gaG9zdAotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgaG9zdCBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgaG9zdCBuYW1lLgogICAgICAqIEBwYXJhbSBwb3J0Ci0gICAgICogICAgICAgICAgICBpbnQgVGhlIHBvcnQgbnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBudW1iZXIuCiAgICAgICogQHBhcmFtIGF1dGhvcml0eQotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgYXV0aG9yaXR5CisgICAgICogICAgICAgICAgICB0aGUgYXV0aG9yaXR5LgogICAgICAqIEBwYXJhbSB1c2VySW5mbwotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgdXNlciBpbmZvCisgICAgICogICAgICAgICAgICB0aGUgdXNlciBpbmZvLgogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBmaWxlIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgY29tcG9uZW50LgogICAgICAqIEBwYXJhbSBxdWVyeQotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgcXVlcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBxdWVyeS4KICAgICAgKiBAcGFyYW0gcmVmCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSByZWZlcmVuY2UKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEudXRpbC5TZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VVJMKFVSTCB1LCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwKICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHksIFN0cmluZyB1c2VySW5mbywgU3RyaW5nIGZpbGUsIFN0cmluZyBxdWVyeSwKQEAgLTI5OSwxNCArMzA0LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGVxdWl2YWxlbnQgb2YgYW4gVVJMIHVzaW5nIEhUVFAgcGFyc2luZiBmb3JtYXQuCisgICAgICogUmV0dXJucyB0aGUgY2xlYXIgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIGdpdmVuIFVSTCB1c2luZyBIVFRQIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSTAogICAgICAqIEBwYXJhbSB1cmwKLSAgICAgKiAgICAgICAgICAgIGphdmEubmV0LlVSTCB0aGUgdXJsIG9iamVjdCB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGVhciB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgVVJMLgogICAgICAqIEBzZWUgI3BhcnNlVVJMCiAgICAgICogQHNlZSBVUkwjdG9FeHRlcm5hbEZvcm0oKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgdG9FeHRlcm5hbEZvcm0oVVJMIHVybCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgYW5zd2VyID0gbmV3IFN0cmluZ0J1ZmZlcih1cmwuZ2V0UHJvdG9jb2woKS5sZW5ndGgoKQpAQCAtMzMxLDE4ICszMzYsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgdHdvIHVybHMsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQgdGhlIHNhbWUgVVJMLgotICAgICAqIFR3byBVUkxzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgZmlsZSwgaG9zdCwgcG9ydCwgcHJvdG9jb2wsCi0gICAgICogcXVlcnksIGFuZCByZWYgY29tcG9uZW50cy4KKyAgICAgKiBDb21wYXJlcyB0d28gVVJMIG9iamVjdHMgd2hldGhlciB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSBVUkwuIFR3byBVUkxzCisgICAgICogYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBmaWxlLCBob3N0LCBwb3J0LCBwcm90b2NvbCwgcXVlcnksIGFuZAorICAgICAqIHJlZmVyZW5jZSBjb21wb25lbnRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmwxCi0gICAgICogICAgICAgICAgICBVUkwgdGhlIGZpcnN0IFVSTCB0byBjb21wYXJlCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgVVJMIHRvIGNvbXBhcmUuCiAgICAgICogQHBhcmFtIHVybDIKLSAgICAgKiAgICAgICAgICAgIFVSTCB0aGUgc2Vjb25kIFVSTCB0byBjb21wYXJlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgVVJMcyBhcmUgdGhlIHNhbWUgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBpZiB0aGUgVVJMcyBhcmUgZGlmZmVyZW50Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIFVSTCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBVUkxzIGFyZSB0aGUgc2FtZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbHMoVVJMIHVybDEsIFVSTCB1cmwyKSB7CiAgICAgICAgIGlmICghc2FtZUZpbGUodXJsMSwgdXJsMikpIHsKQEAgLTM1OCwxNCArMzYyLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHBvcnQuCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBwb3J0IG9mIHRoZSBwcm90b2NvbCB1c2VkIGJ5IHRoZSBoYW5kbGVkIFVSTC4gVGhlCisgICAgICogY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFsd2F5cyB7QGNvZGUgLTF9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgcG9ydCBudW1iZXIgb2YgdGhlIHByb3RvY29sLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEluZXRBZGRyZXNzIGZvciB0aGUgaG9zdCBvZiB0aGUgVVJMLCBvciBudWxsLgorICAgICAqIFJldHVybnMgdGhlIGhvc3QgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gVVJMLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmwKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgb2JqZWN0IHdoZXJlIHRvIHJlYWQgdGhlIGhvc3QgYWRkcmVzcyBmcm9tLgorICAgICAqIEByZXR1cm4gdGhlIGhvc3QgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW5ldEFkZHJlc3MgZ2V0SG9zdEFkZHJlc3MoVVJMIHVybCkgewogICAgICAgICB0cnkgewpAQCAtMzgwLDIwICszOTMsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGUgVVJMIG9iamVjdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoY29kZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIFVSTCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIGhhc2hjb2RlIGZvciBoYXNodGFibGUgaW5kZXhpbmcKKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogICAgICAgICAgICB0aGUgVVJMIHRvIGRldGVybWluZSB0aGUgaGFzaGNvZGUuCisgICAgICogQHJldHVybiB0aGUgaGFzaGNvZGUgb2YgdGhlIGdpdmVuIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGhhc2hDb2RlKFVSTCB1cmwpIHsKICAgICAgICAgcmV0dXJuIHRvRXh0ZXJuYWxGb3JtKHVybCkuaGFzaENvZGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgdHdvIHVybHMsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGhvc3QKLSAgICAgKiBjb21wb25lbnRzLgorICAgICAqIENvbXBhcmVzIHR3byBVUkwgb2JqZWN0cyB3aGV0aGVyIHRoZXkgcmVmZXIgdG8gdGhlIHNhbWUgaG9zdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBob3N0cyBvZiB0aGUgVVJMcyBhcmUgdGhlIHNhbWUKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgaG9zdHMgYXJlIGRpZmZlcmVudAorICAgICAqIEBwYXJhbSB1cmwxCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgVVJMIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEBwYXJhbSB1cmwyCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIFVSTCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIFVSTHMgcmVmZXIgdG8gdGhlIHNhbWUgaG9zdCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGhvc3RzRXF1YWwoVVJMIHVybDEsIFVSTCB1cmwyKSB7CiAgICAgICAgIFN0cmluZyBob3N0MSA9IGdldEhvc3QodXJsMSksIGhvc3QyID0gZ2V0SG9zdCh1cmwyKTsKQEAgLTQxMCwxMCArNDMwLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1cmxzIHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuIENvbXBhcmVzIHRoZSBwcm90b2NvbCwKLSAgICAgKiBob3N0LCBwb3J0IGFuZCBmaWxlIGNvbXBvbmVudHMuCisgICAgICogQ29tcGFyZXMgdHdvIFVSTCBvYmplY3RzIHdoZXRoZXIgdGhleSByZWZlciB0byB0aGUgc2FtZSBmaWxlLiBJbiB0aGUKKyAgICAgKiBjb21wYXJpc29uIGluY2x1ZGVkIGFyZSB0aGUgVVJMIGNvbXBvbmVudHMgcHJvdG9jb2wsIGhvc3QsIHBvcnQgYW5kIGZpbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHNhbWUgcmVzb3VyY2UsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSB1cmwxCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgVVJMIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEBwYXJhbSB1cmwyCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIFVSTCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIFVSTHMgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZSwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHNhbWVGaWxlKFVSTCB1cmwxLCBVUkwgdXJsMikgewogICAgICAgICBTdHJpbmcgczEgPSB1cmwxLmdldFByb3RvY29sKCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhCmluZGV4IDk2MDdmNWYuLmU2OTY0MTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhCkBAIC0xOCwxNiArMTgsMjEgQEAKIHBhY2thZ2UgamF2YS5uZXQ7CiAKIC8qKgotICogRGVmaW5lcyBhIGZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBVUkwgU3RyZWFtIChwcm90b2NvbCkgSGFuZGxlciBJdCBpcyB1c2VkIGJ5Ci0gKiB0aGUgY2xhc3NlcyA8Y29kZT5VUkw8L2NvZGU+CisgKiBEZWZpbmVzIGEgZmFjdG9yeSB3aGljaCBjcmVhdGVzIGFuIHtAY29kZSBVUkxTdHJlYW1IYW5kbGVyfSBmb3IgYSBzcGVjaWZpZWQKKyAqIHByb3RvY29sLiBJdCBpcyB1c2VkIGJ5IHRoZSBjbGFzcyB7QGNvZGUgVVJMfS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkgeworICAgIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VVJMIFN0cmVhbSBIYW5kbGVyPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBVUkxTdHJlYW1IYW5kbGVyfSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHtAY29kZQorICAgICAqIHByb3RvY29sfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXIKICAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm90b2NvbCBmb3Igd2hpY2ggYSBoYW5kbGVyIGlzIG5lZWRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGhhbmRsZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgVVJMU3RyZWFtSGFuZGxlciBjcmVhdGVVUkxTdHJlYW1IYW5kbGVyKFN0cmluZyBwcm90b2NvbCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDVlZmNiNmIuLjlmN2M2M2EgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbi5qYXZhCkBAIC0yMCwyNiArMjAsMzEgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoaXMgVW5rbm93bkhvc3RFeGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYW4gSVAgYWRkcmVzcyByZXNvbHV0aW9uIGlzCi0gKiBhdHRlbXB0ZWQgYW5kIG5vIGhvc3Qgb3IgcmVzb2x2ZXIgbWF5IGJlIGZvdW5kLgorICogSXMgdGhyb3duIHdoZW4gYSBob3N0bmFtZSBjYW4gbm90IGJlIHJlc29sdmVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFVua25vd25Ib3N0RXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2MzkxMjYwNzYwNTI4NzU0MDNMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBVbmtub3duSG9zdEV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCBpdHMgd2Fsa2JhY2sKKyAgICAgKiBmaWxsZWQgaW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVua25vd25Ib3N0RXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBVbmtub3duSG9zdEV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCBpdHMgd2Fsa2JhY2sKKyAgICAgKiBhbmQgbWVzc2FnZSBmaWxsZWQgaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbmtub3duSG9zdEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Vbmtub3duU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Vua25vd25TZXJ2aWNlRXhjZXB0aW9uLmphdmEKaW5kZXggN2MwYThmYy4uNDg2NWQ2ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Vua25vd25TZXJ2aWNlRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1Vua25vd25TZXJ2aWNlRXhjZXB0aW9uLmphdmEKQEAgLTIwLDI4ICsyMCwzNCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogVGhpcyBVbmtub3duU2VydmljZUV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIHBhcnRpY3VsYXIgc2VydmljZSByZXF1ZXN0ZWQKLSAqIGlzbid0IHN1cHBvcnQgYnkgdGhlIFVSTC4gRXhhbXBsZXMgYXJlIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBhbiBVUkwgdmlhIGFuCi0gKiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gb3Igd3JpdGUgdG8gYW4gVVJMIHZpYSBhbgotICogPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPgorICogSXMgdGhyb3duIGlmIG5vIGFwcHJvcHJpYXRlIHtAY29kZSBDb250ZW50SGFuZGxlcn0gY291bGQgYmUgZm91bmQgZm9yIGEKKyAqIHBhcnRpY3VsYXIgc2VydmljZSByZXF1ZXN0ZWQgYnkgdGhlIFVSTCBjb25uZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGhhcHBlbmVkIGlmCisgKiB0aGVyZSBpcyBhbiBpbnZhbGlkIE1JTUUgdHlwZSBvciB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8gc2VuZCBkYXRhIG92ZXIgYQorICogcmVhZC1vbmx5IGNvbm5lY3Rpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5rbm93blNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDE2OTAzMzI0ODg1MzYzOTUwOEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVua25vd25TZXJ2aWNlRXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIGl0cworICAgICAqIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5rbm93blNlcnZpY2VFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVua25vd25TZXJ2aWNlRXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIGl0cworICAgICAqIHdhbGtiYWNrIGFuZCBtZXNzYWdlIGZpbGxlZCBpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGV0YWlsTWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVua25vd25TZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L3BhY2thZ2UuaHRtbCBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9wYWNrYWdlLmh0bWwKaW5kZXggOGZiOTVjMS4uYjRlOGI4ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L3BhY2thZ2UuaHRtbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvcGFja2FnZS5odG1sCkBAIC0yLDcgKzIsOCBAQAogICA8Ym9keT4KICAgICA8cD4KICAgICAgIFByb3ZpZGVzIG5ldHdvcmtpbmctcmVsYXRlZCBmdW5jdGlvbmFsaXR5LCBzdWNoIGFzIHN0cmVhbWluZyBhbmQgZGF0YWdyYW0KLSAgICAgIHNvY2tldHMsIGhhbmRsaW5nIG9mIEludGVybmV0IGFkZHJlc3NlcywgYW5kIGRlYWxpbmcgd2l0aCBIVFRQIHJlcXVlc3RzLiAgCisgICAgICBzb2NrZXRzLCBoYW5kbGluZyBvZiBJbnRlcm5ldCBhZGRyZXNzZXMsIGFuZCBkZWFsaW5nIHdpdGggSFRUUCByZXF1ZXN0cy4gCiAgICAgPC9wPgorICAgIEBzaW5jZSBBbmRyb2lkIDEuMCAKICAgPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbi5qYXZhCmluZGV4IDI4MDQ1NDUuLjlmMjY0NDUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb24uamF2YQpAQCAtMjEsNjQgKzIxLDYxIEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiAKIC8qKgotICogQWJzdHJhY3RDb2xsZWN0aW9uIGlzIGFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb2xsZWN0aW9uIGludGVyZmFjZS4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcuIEEgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0gKiBhYnN0cmFjdCBtZXRob2RzIGl0ZXJhdG9yKCkgYW5kIHNpemUoKS4KLSAqIEBzaW5jZSAxLjIKKyAqIENsYXNzIHtAY29kZSBBYnN0cmFjdENvbGxlY3Rpb259IGlzIGFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGNvZGUKKyAqIENvbGxlY3Rpb259IGludGVyZmFjZS4gQSBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYWJzdHJhY3QgbWV0aG9kcyB7QGNvZGUKKyAqIGl0ZXJhdG9yKCl9IGFuZCB7QGNvZGUgc2l6ZSgpfSB0byBjcmVhdGUgYW4gaW1tdXRhYmxlIGNvbGxlY3Rpb24uIFRvIGNyZWF0ZSBhCisgKiBtb2RpZmlhYmxlIGNvbGxlY3Rpb24gaXQncyBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgdGhlIHtAY29kZSBhZGQoKX0gbWV0aG9kIHRoYXQKKyAqIGN1cnJlbnRseSB0aHJvd3MgYW4ge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbGxlY3Rpb248RT4gaW1wbGVtZW50cyBDb2xsZWN0aW9uPEU+IHsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBBYnN0cmFjdENvbGxlY3Rpb24uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHtAY29kZSBBYnN0cmFjdENvbGxlY3Rpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBBYnN0cmFjdENvbGxlY3Rpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgd2l0aGluIHRoaXMgY29sbGVjdGlvbiwgYW5kCi0gICAgICogYWRkaXRpb24gb2YgdGhpcyBlbGVtZW50IHN1Y2NlZWRzLCB0aGVuIHRydWUgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlCi0gICAgICogc3BlY2lmaWVkIGVsZW1lbnQgaXMgYWxyZWFkeSBjb250YWluZWQgd2l0aGluIHRoaXMgY29sbGVjdGlvbiwgb3IKLSAgICAgKiBkdXBsaWNhdGlvbiBpcyBub3QgcGVybWl0dGVkLCBmYWxzZSB3aWxsIGJlIHJldHVybmVkLiBEaWZmZXJlbnQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMgbWF5IGFkZCBzcGVjaWZpYyBsaW1pdGF0aW9ucyBvbiB0aGlzIG1ldGhvZCB0byBmaWx0ZXIKLSAgICAgKiBwZXJtaXR0ZWQgZWxlbWVudHMuIEZvciBleGFtcGxlLCBpbiBzb21lIGltcGxlbWVudGF0aW9uLCBudWxsIGVsZW1lbnQgbWF5Ci0gICAgICogYmUgZGVuaWVkLCBhbmQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0LiBUaGVzZSBsaW1pdGF0aW9ucwotICAgICAqIHNob3VsZCBiZSBleHBsaWNpdGx5IGRvY3VtZW50ZWQgYnkgc3BlY2lmaWMgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBBZGQgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYW5kCi0gICAgICogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2lsbCBhbHdheXMgYmUgdGhyb3duIG91dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byBiZSBhZGRlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gaXMgY2hhbmdlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgaW52b2tpbmcKLSAgICAgKiAgICAgICAgIHRoaXMgbWV0aG9kLiBPdGhlcndpc2UsIGZhbHNlLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhZGQgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjbGFzcy4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgbnVsbCBpcyB1c2VkIHRvIGludm9rZSB0aGlzIG1ldGhvZCwgYW5kIG51bGwgaXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgcGVybWl0dGVkIGJ5IHRoaXMgY29sbGVjdGlvbi4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIHBlcm1pdHRlZCBjbGFzcyB0eXBlLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgbGltaXRhdGlvbnMgb2YgdGhpcyBjb2xsZWN0aW9uIHByZXZlbnQgdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnQgZnJvbSBiZWluZyBhZGRlZAotICAgICAqLworICAgICAqIEBzZWUgQ29sbGVjdGlvbiNhZGQKKyAgICAgKi8gICAgICAgICAKICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBvYmplY3QpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gdG8gdGhpcyBDb2xsZWN0aW9uLgorICAgICAqIEF0dGVtcHRzIHRvIGFkZCBhbGwgb2YgdGhlIG9iamVjdHMgY29udGFpbmVkIGluIHtAY29kZSBjb2xsZWN0aW9ufQorICAgICAqIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSAob3B0aW9uYWwpLiBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICogaXRlcmF0ZXMgb3ZlciB0aGUgZ2l2ZW4ge0Bjb2RlIENvbGxlY3Rpb259IGFuZCBjYWxscyB7QGNvZGUgYWRkfSBmb3IgZWFjaAorICAgICAqIGVsZW1lbnQuIElmIGFueSBvZiB0aGVzZSBjYWxscyByZXR1cm4ge0Bjb2RlIHRydWV9LCB0aGVuIHtAY29kZSB0cnVlfSBpcworICAgICAqIHJldHVybmVkIGFzIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBjYWxsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4gSWYgdGhpcworICAgICAqIHtAY29kZSBDb2xsZWN0aW9ufSBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBlbGVtZW50cywgYW4ge0Bjb2RlCisgICAgICogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcGFzc2VkIHtAY29kZSBDb2xsZWN0aW9ufSBpcyBjaGFuZ2VkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgZWxlbWVudHMKKyAgICAgKiB0byB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSwgdGhlIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIGJlaGF2aW9yIG9mIHRoZSBwYXNzZWQKKyAgICAgKiB7QGNvZGUgQ29sbGVjdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBDb2xsZWN0aW9uIGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBDb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgbnVsbCBpcyB1c2VkIHRvIGludm9rZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBpcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFkZGluZyB0byB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgQ29sbGVjdGlvbn0uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0uCisgICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGNvbGxlY3Rpb259IGlzIHtAY29kZSBudWxsfSwgb3IgaWYgaXQgY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0gZWxlbWVudHMgYW5kIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiAgICAgICAgICAgICAgICBzdWNoIGVsZW1lbnRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CkBAIC05MiwxNiArODksMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhpcyBjb2xsZWN0aW9uLiBUaGlzIGNvbGxlY3Rpb24gd2lsbCBiZSAKLSAgICAgKiBjbGVhcmVkIHVwIGFmdGVyIHRoaXMgb3BlcmF0aW9uLiBUaGUgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgdGhlIAotICAgICAqIGNvbGxlY3Rpb24sIHJlbW92ZXMgZXZlcnkgZWxlbWVudCB1c2luZyBJdGVyYXRvci5yZW1vdmUgbWV0aG9kLgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0sIGxlYXZpbmcgaXQgZW1wdHkgKG9wdGlvbmFsKS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGl0ZXJhdGVzIG92ZXIgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gYW5kIGNhbGxzIHRoZSB7QGNvZGUKKyAgICAgKiByZW1vdmV9IG1ldGhvZCBvbiBlYWNoIGVsZW1lbnQuIElmIHRoZSBpdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IHJlbW92YWwKKyAgICAgKiBvZiBlbGVtZW50cywgYW4ge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogPHA+CisgICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIHVzdWFsbHkgY2FuIGNsZWFyIGEge0Bjb2RlIENvbGxlY3Rpb259IG1vcmUgZWZmaWNpZW50bHkKKyAgICAgKiBhbmQgc2hvdWxkIHRoZXJlZm9yZSBvdmVyd3JpdGUgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0IGlmIHRoZSBpdGVyYXRvciByZXR1cm5lZAotICAgICAqIGJ5IHRoaXMgY29sbGVjdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIHJlbW92ZSBtZXRob2QgYW5kIHRoZSBjb2xsZWN0aW9uCi0gICAgICogaXMgbm90IHplcm8gbGVuZ3RoLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gCi0gICAgICogICAgICAgICAgICAgICAgICBpZiB0aGlzIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgcmVtb3ZpbmcgZWxlbWVudHMgZnJvbQorICAgICAqICAgICAgICAgICAgICAgIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259CisgICAgICogQHNlZSAjaXRlcmF0b3IKKyAgICAgKiBAc2VlICNpc0VtcHR5CisgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogICAgICAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yKCk7CkBAIC0xMTIsMTIgKzExNCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgQ29sbGVjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogVGVzdHMgd2hldGhlciB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBjb250YWlucyB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIGl0ZXJhdGVzIG92ZXIgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gYW5kIHRlc3RzLCB3aGV0aGVyIGFueQorICAgICAqIGVsZW1lbnQgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIG9iamVjdC4gSWYge0Bjb2RlIG9iamVjdCAhPSBudWxsfSB0aGVuCisgICAgICoge0Bjb2RlIG9iamVjdC5lcXVhbHMoZSl9IGlzIGNhbGxlZCBmb3IgZWFjaCBlbGVtZW50IHtAY29kZSBlfSByZXR1cm5lZCBieQorICAgICAqIHRoZSBpdGVyYXRvciB1bnRpbCB0aGUgZWxlbWVudCBpcyBmb3VuZC4gSWYge0Bjb2RlIG9iamVjdCA9PSBudWxsfSB0aGVuCisgICAgICogZWFjaCBlbGVtZW50IHtAY29kZSBlfSByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IgaXMgY29tcGFyZWQgd2l0aCB0aGUgdGVzdAorICAgICAqIHtAY29kZSBlID09IG51bGx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIGFuIGVsZW1lbnQgb2YgdGhpcyBDb2xsZWN0aW9uLAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgb2JqZWN0IGlzIGFuIGVsZW1lbnQgb2YgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0sIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgdG8gbG9vayBmb3IgaXNuJ3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCB0byBsb29rIGZvciBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgQ29sbGVjdGlvbn0gZG9lc24ndCBzdXBwb3J0IHtAY29kZSBudWxsfSBlbGVtZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7CiAgICAgICAgIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3IoKTsKQEAgLTEzOCwxNCArMTUyLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBDb2xsZWN0aW9uIGZvciBhbGwgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24uCisgICAgICogVGVzdHMgd2hldGhlciB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBjb250YWlucyBhbGwgb2JqZWN0cyBjb250YWluZWQgaW4gdGhlCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBDb2xsZWN0aW9ufS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgQ29sbGVjdGlvbn0uIElmIG9uZSBlbGVtZW50IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBpcyBub3QgY29udGFpbmVkIGluCisgICAgICogdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0sIHRoZW4ge0Bjb2RlIGZhbHNlfSBpcyByZXR1cm5lZDsge0Bjb2RlIHRydWV9IG90aGVyd2lzZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gb2Ygb2JqZWN0cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gYXJlIGVsZW1lbnRzIG9mCi0gICAgICogICAgICAgICB0aGlzIENvbGxlY3Rpb24sIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBudWxsIGlzIHVzZWQgdG8gaW52b2tlIHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQge0Bjb2RlIENvbGxlY3Rpb259IGFyZQorICAgICAqICAgICAgICAgZWxlbWVudHMgb2YgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgb25lIG9yIG1vcmUgZWxlbWVudHMgb2Yge0Bjb2RlIGNvbGxlY3Rpb259IGlzbid0IG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgIGNvcnJlY3QgdHlwZS4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGNvbGxlY3Rpb259IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBkb2Vzbid0IHN1cHBvcnQge0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICAgICAgICAgZWxlbWVudHMuCisgICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBjb2xsZWN0aW9ufSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CiAgICAgICAgIEl0ZXJhdG9yPD8+IGl0ID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwpAQCAtMTU4LDQwICsxODMsNTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gaGFzIG5vIGVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIGlmIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGNvbnRhaW5zIG5vIGVsZW1lbnRzLiBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICogdGVzdHMsIHdoZXRoZXIge0Bjb2RlIHNpemV9IHJldHVybnMgMC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gaGFzIG5vIGVsZW1lbnQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaGFzIG5vIGVsZW1lbnRzLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CiAgICAgICAgIHJldHVybiBzaXplKCkgPT0gMDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIENvbGxlY3Rpb24uIEEgc3ViY2xhc3MgbXVzdAotICAgICAqIGltcGxlbWVudCB0aGUgYWJzdHJhY3QgbWV0aG9kcyBpdGVyYXRvcigpIGFuZCBzaXplKCkuCisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSXRlcmF0b3J9IHRoYXQgbWF5IGJlIHVzZWQgdG8gYWNjZXNzIHRoZQorICAgICAqIG9iamVjdHMgY29udGFpbmVkIGJ5IHRoaXMge0Bjb2RlIENvbGxlY3Rpb259LiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGVsZW1lbnRzIGFyZQorICAgICAqIHJldHVybmVkIGJ5IHRoZSB7QGxpbmsgSXRlcmF0b3J9IGlzIG5vdCBkZWZpbmVkIHVubGVzcyB0aGUgaW5zdGFuY2Ugb2YgdGhlCisgICAgICoge0Bjb2RlIENvbGxlY3Rpb259IGhhcyBhIGRlZmluZWQgb3JkZXIuICBJbiB0aGF0IGNhc2UsIHRoZSBlbGVtZW50cyBhcmUgcmV0dXJuZWQgaW4gdGhhdCBvcmRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiB0aGlzIGNsYXNzIHRoaXMgbWV0aG9kIGlzIGRlY2xhcmVkIGFic3RyYWN0IGFuZCBoYXMgdG8gYmUgaW1wbGVtZW50ZWQKKyAgICAgKiBieSBjb25jcmV0ZSB7QGNvZGUgQ29sbGVjdGlvbn0gaW1wbGVtZW50YXRpb25zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgQ29sbGVjdGlvbgotICAgICAqIAotICAgICAqIEBzZWUgSXRlcmF0b3IKKyAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciBhY2Nlc3NpbmcgdGhlIHtAY29kZSBDb2xsZWN0aW9ufSBjb250ZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGlzCi0gICAgICogQ29sbGVjdGlvbi4gVGhpcyBvcGVyYXRpb24gdHJhdmVyc2VzIG92ZXIgdGhlIGNvbGxlY3Rpb24sIGxvb2tpbmcKLSAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuIE9uY2UgdGhlIG9iamVjdCBpcyBmb3VuZCwgdGhlIG9iamVjdCB3aWxsCi0gICAgICogYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBpdGVyYXRvcidzIHJlbW92ZSBtZXRob2QuIAotICAgICAqIAotICAgICAqIFRoaXMgY29sbGVjdGlvbiB3aWxsIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSAKLSAgICAgKiBpdGVyYXRvciByZXR1cm5lZCBkb2VzIG5vdCBpbXBsZW1lbnQgcmVtb3ZlIG1ldGhvZCwgYW5kIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBvYmplY3QgaXMgaW4gdGhpcyBjb2xsZWN0aW9uLgorICAgICAqIFJlbW92ZXMgb25lIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaWYgb25lCisgICAgICogaXMgY29udGFpbmVkIChvcHRpb25hbCkuIFRoaXMgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciB0aGlzCisgICAgICoge0Bjb2RlIENvbGxlY3Rpb259IGFuZCB0ZXN0cyBmb3IgZWFjaCBlbGVtZW50IHtAY29kZSBlfSByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IsCisgICAgICogd2hldGhlciB7QGNvZGUgZX0gaXMgZXF1YWwgdG8gdGhlIGdpdmVuIG9iamVjdC4gSWYge0Bjb2RlIG9iamVjdCAhPSBudWxsfQorICAgICAqIHRoZW4gdGhpcyB0ZXN0IGlzIHBlcmZvcm1lZCB1c2luZyB7QGNvZGUgb2JqZWN0LmVxdWFscyhlKX0sIG90aGVyd2lzZQorICAgICAqIHVzaW5nIHtAY29kZSBvYmplY3QgPT0gbnVsbH0uIElmIGFuIGVsZW1lbnQgZXF1YWwgdG8gdGhlIGdpdmVuIG9iamVjdCBpcworICAgICAqIGZvdW5kLCB0aGVuIHRoZSB7QGNvZGUgcmVtb3ZlfSBtZXRob2QgaXMgY2FsbGVkIG9uIHRoZSBpdGVyYXRvciBhbmQKKyAgICAgKiB7QGNvZGUgdHJ1ZX0gaXMgcmV0dXJuZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLiBJZiB0aGUgaXRlcmF0b3IgZG9lcworICAgICAqIG5vdCBzdXBwb3J0IHJlbW92aW5nIGVsZW1lbnRzLCBhbiB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259CisgICAgICogaXMgdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgQ29sbGVjdGlvbiBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIENvbGxlY3Rpb24gaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byByZW1vdmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgcGFzc2VkIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLgorICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgb2JqZWN0fSBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259CisgICAgICogICAgICAgICAgICAgICAgZG9lc24ndCBzdXBwb3J0IHtAY29kZSBudWxsfSBlbGVtZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewogICAgICAgICBJdGVyYXRvcjw/PiBpdCA9IGl0ZXJhdG9yKCk7CkBAIC0yMTQsMjUgKzI1NiwzNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIGluIHRoaXMgQ29sbGVjdGlvbiBvZiBlYWNoIG9iamVjdCBpbiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgQ29sbGVjdGlvbi4gVGhpcyBvcGVyYXRpb24gdHJhdmVyc2VzIG92ZXIgdGhlIGNvbGxlY3Rpb24KLSAgICAgKiBpdHNlbGYsIHRvIHZlcmlmeSB3aGV0aGVyIGVhY2ggZWxlbWVudCBpcyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBjb2xsZWN0aW9uLiBUaGUgb2JqZWN0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uIGl0c2VsZiB1c2luZyAKLSAgICAgKiB0aGUgaXRlcmF0b3IncyByZW1vdmUgbWV0aG9kIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIAotICAgICAqIGNvbGxlY3Rpb24uIAotICAgICAqIAotICAgICAqIFRoaXMgY29sbGVjdGlvbiB3aWxsIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSAKLSAgICAgKiBpdGVyYXRvciByZXR1cm5lZCBkb2VzIG5vdCBpbXBsZW1lbnQgcmVtb3ZlIG1ldGhvZCwgYW5kIHRoZSBlbGVtZW50IAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBjb250YWluZWQgaW4gdGhpcyBjb2xsZWN0aW9uLgorICAgICAqIFJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIGluIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IG9mIGVhY2ggb2JqZWN0IGluIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgQ29sbGVjdGlvbn0gKG9wdGlvbmFsKS4gQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyBub25lIG9mIHRoZQorICAgICAqIGVsZW1lbnRzIGluIHRoZSBwYXNzZWQge0Bjb2RlIENvbGxlY3Rpb259IGNhbiBiZSBmb3VuZCBpbiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufQorICAgICAqIGFueW1vcmUuCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGFuZCB0ZXN0cyBmb3IgZWFjaAorICAgICAqIGVsZW1lbnQge0Bjb2RlIGV9IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciwgd2hldGhlciBpdCBpcyBjb250YWluZWQgaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHtAY29kZSBDb2xsZWN0aW9ufS4gSWYgdGhpcyB0ZXN0IGlzIHBvc2l0aXZlLCB0aGVuIHRoZSB7QGNvZGUKKyAgICAgKiByZW1vdmV9IG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIGl0ZXJhdG9yLiBJZiB0aGUgaXRlcmF0b3IgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IHJlbW92aW5nIGVsZW1lbnRzLCBhbiB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGlzCisgICAgICogdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIENvbGxlY3Rpb24gaXMgbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBDb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgbnVsbCBpcyB1c2VkIHRvIGludm9rZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byByZW1vdmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBvbmUgb3IgbW9yZSBlbGVtZW50cyBvZiB7QGNvZGUgY29sbGVjdGlvbn0gaXNuJ3Qgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgY29ycmVjdCB0eXBlLgorICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgY29sbGVjdGlvbn0gY29udGFpbnMgYXQgbGVhc3Qgb25lIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnQgYW5kIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGRvZXNuJ3Qgc3VwcG9ydCB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgICAgICAgICBlbGVtZW50cy4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGNvbGxlY3Rpb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CkBAIC0yNDcsMjUgKzI5OCwzNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIENvbGxlY3Rpb24gdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgQ29sbGVjdGlvbi4gVGhpcyBvcGVyYXRpb24gdHJhdmVyc2VzIG92ZXIgdGhlIGNvbGxlY3Rpb24KLSAgICAgKiBpdHNlbGYsIHRvIHZlcmlmeSB3aGV0aGVyIGFueSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIAotICAgICAqIGNvbGxlY3Rpb24uIFRoZSBvYmplY3Qgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24gaXRzZWxmIHVzaW5nIAotICAgICAqIHRoZSBpdGVyYXRvcidzIHJlbW92ZSBtZXRob2QgaWYgaXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIAotICAgICAqIGNvbGxlY3Rpb24uIAotICAgICAqIAotICAgICAqIFRoaXMgY29sbGVjdGlvbiB3aWxsIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSAKLSAgICAgKiBpdGVyYXRvciByZXR1cm5lZCBkb2VzIG5vdCBpbXBsZW1lbnQgcmVtb3ZlIG1ldGhvZCwgYW5kIHRoZSBjb2xsZWN0aW9uCi0gICAgICogaXRzZWxmIGRvZXMgY29udGFpbiBlbGVtZW50cyB3aGljaCBkbyBub3QgZXhpc3QgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgorICAgICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSB0aGF0IGFyZSBub3QgYWxzbyBmb3VuZCBpbiB0aGUKKyAgICAgKiB7QGNvZGUgQ29sbGVjdGlvbn0gcGFzc2VkIChvcHRpb25hbCkuIEFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0KKyAgICAgKiB3aWxsIG9ubHkgY29udGFpbiBlbGVtZW50cyB0aGF0IGFsc28gY2FuIGJlIGZvdW5kIGluIHRoZSB7QGNvZGUgQ29sbGVjdGlvbn0KKyAgICAgKiBwYXNzZWQgdG8gdGhpcyBtZXRob2QuCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGFuZCB0ZXN0cyBmb3IgZWFjaAorICAgICAqIGVsZW1lbnQge0Bjb2RlIGV9IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciwgd2hldGhlciBpdCBpcyBjb250YWluZWQgaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHtAY29kZSBDb2xsZWN0aW9ufS4gSWYgdGhpcyB0ZXN0IGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSB7QGNvZGUKKyAgICAgKiByZW1vdmV9IG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIGl0ZXJhdG9yLiBJZiB0aGUgaXRlcmF0b3IgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IHJlbW92aW5nIGVsZW1lbnRzLCBhbiB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGlzCisgICAgICogdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJldGFpbgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIENvbGxlY3Rpb24gaXMgbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBDb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgbnVsbCBpcyB1c2VkIHRvIGludm9rZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byByZXRhaW4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBvbmUgb3IgbW9yZSBlbGVtZW50cyBvZiB7QGNvZGUgY29sbGVjdGlvbn0KKyAgICAgKiAgICAgICAgICAgICAgICBpc24ndCBvZiB0aGUgY29ycmVjdCB0eXBlLgorICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgY29sbGVjdGlvbn0gY29udGFpbnMgYXQgbGVhc3Qgb25lCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9IGVsZW1lbnQgYW5kIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfSBlbGVtZW50cy4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGNvbGxlY3Rpb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CkBAIC0yODAsMjEgKzM0MCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIENvbGxlY3Rpb24uCisgICAgICogUmV0dXJucyBhIGNvdW50IG9mIGhvdyBtYW55IG9iamVjdHMgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gY29udGFpbnMuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyBjbGFzcyB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCBhYnN0cmFjdCBhbmQgaGFzIHRvIGJlIGltcGxlbWVudGVkCisgICAgICogYnkgY29uY3JldGUge0Bjb2RlIENvbGxlY3Rpb259IGltcGxlbWVudGF0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBDb2xsZWN0aW9uCisgICAgICogQHJldHVybiBob3cgbWFueSBvYmplY3RzIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGNvbnRhaW5zLCBvciB7QGNvZGUgSW50ZWdlci5NQVhfVkFMVUV9CisgICAgICogICAgICAgICBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIHtAY29kZSBJbnRlZ2VyLk1BWF9WQUxVRX0gZWxlbWVudHMgaW4gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIENvbGxlY3Rpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2l6ZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBDb2xsZWN0aW9uLgotICAgICAqIEFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IHdpbGwgbm90IGJlIHJlZmVyZW5jZWQgYnkgdGhlIGNvbGxlY3Rpb24uCi0gICAgICogVGhlIGVsZW1lbnRzIGluIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIHNvcnRlZCB0byB0aGUgc2FtZSBvcmRlciBhcyAKLSAgICAgKiB0aG9zZSByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3Igb2YgdGhpcyBjb2xsZWN0aW9uIGl0c2VsZiBpZiB0aGUgY29sbGVjdGlvbiAgCi0gICAgICogZ3VhcmFudGVlcyB0aGUgb3JkZXIuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBDb2xsZWN0aW9uCi0gICAgICovCiAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CiAgICAgICAgIGludCBzaXplID0gc2l6ZSgpLCBpbmRleCA9IDA7CiAgICAgICAgIEl0ZXJhdG9yPD8+IGl0ID0gaXRlcmF0b3IoKTsKQEAgLTMwNSwyMyArMzYyLDYgQEAKICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMgQ29sbGVjdGlvbi4gSWYKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbGVtZW50cywgdGhlIHNwZWNpZmllZAotICAgICAqIGFycmF5IGlzIHVzZWQsIG90aGVyd2lzZSBhbiBhcnJheSBvZiB0aGUgc2FtZSB0eXBlIGlzIGNyZWF0ZWQuIElmIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheSBpcyB1c2VkIGFuZCBpcyBsYXJnZXIgdGhhbiB0aGlzIENvbGxlY3Rpb24sIHRoZSBhcnJheQotICAgICAqIGVsZW1lbnQgZm9sbG93aW5nIHRoZSBjb2xsZWN0aW9uIGVsZW1lbnRzIGlzIHNldCB0byBudWxsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50cwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5Ci0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIENvbGxlY3Rpb24KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5U3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyBDb2xsZWN0aW9uIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIG51bGwgaXMgdXNlZCB0byBpbnZva2UgdGhpcyBtZXRob2QKLSAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBjb250ZW50cykgewogICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKSwgaW5kZXggPSAwOwpAQCAtMzM5LDExICszNzksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBDb2xsZWN0aW9uLiBUaGUgcHJlc2VudGF0aW9uCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259LiBUaGUgcHJlc2VudGF0aW9uCiAgICAgICogaGFzIGEgc3BlY2lmaWMgZm9ybWF0LiBJdCBpcyBlbmNsb3NlZCBieSBzcXVhcmUgYnJhY2tldHMgKCJbXSIpLiBFbGVtZW50cwogICAgICAqIGFyZSBzZXBhcmF0ZWQgYnkgJywgJyAoY29tbWEgYW5kIHNwYWNlKS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBDb2xsZWN0aW9uCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0TGlzdC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdExpc3QuamF2YQppbmRleCAwMDU5NjgxLi5jZmQ4YzZmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0TGlzdC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RMaXN0LmphdmEKQEAgLTE4LDE2ICsxOCwyMyBAQAogcGFja2FnZSBqYXZhLnV0aWw7CiAKIC8qKgotICogQWJzdHJhY3RMaXN0IGlzIGFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBMaXN0IGludGVyZmFjZSwgb3B0aW1pemVkCisgKiB7QGNvZGUgQWJzdHJhY3RMaXN0fSBpcyBhbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0Bjb2RlIExpc3R9IGludGVyZmFjZSwgb3B0aW1pemVkCiAgKiBmb3IgYSBiYWNraW5nIHN0b3JlIHdoaWNoIHN1cHBvcnRzIHJhbmRvbSBhY2Nlc3MuIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcwogICogbm90IHN1cHBvcnQgYWRkaW5nIG9yIHJlcGxhY2luZy4gQSBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYWJzdHJhY3QKLSAqIG1ldGhvZHMgZ2V0KCkgYW5kIHNpemUoKS4KKyAqIG1ldGhvZHMge0Bjb2RlIGdldCgpfSBhbmQge0Bjb2RlIHNpemUoKX0sIGFuZCB0byBjcmVhdGUgYQorICogbW9kaWZpYWJsZSB7QGNvZGUgTGlzdH0gaXQncyBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgdGhlIHtAY29kZSBhZGQoKX0gbWV0aG9kIHRoYXQKKyAqIGN1cnJlbnRseSB0aHJvd3MgYW4ge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KICAqIAotICogQHNpbmNlIDEuMgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3Q8RT4gZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248RT4gaW1wbGVtZW50cwogICAgICAgICBMaXN0PEU+IHsKIAorICAgIC8qKgorICAgICAqIEEgY291bnRlciBmb3IgY2hhbmdlcyB0byB0aGUgbGlzdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBtb2RDb3VudDsKIAogICAgIHByaXZhdGUgY2xhc3MgU2ltcGxlTGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewpAQCAtMzY4LDYgKzM3NSw3IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIEFic3RyYWN0TGlzdC4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RMaXN0KCkgewogICAgICAgICBzdXBlcigpOwpAQCAtMzc5LDIxICszODcsMjQgQEAKICAgICAgKiBsb2NhdGlvbi4gSWYgdGhlIGxvY2F0aW9uIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoaXMgTGlzdCwgdGhlIG9iamVjdAogICAgICAqIGlzIGFkZGVkIGF0IHRoZSBlbmQuCiAgICAgICogCisgICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIHRoYXQgd291bGQgbGlrZSB0byBzdXBwb3J0IHRoZSBhZGQgZnVuY3Rpb25hbGl0eQorICAgICAqIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuICAgICAgICAgIAogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydC4KICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQuCiAgICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYWRkaW5nIHRvIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcwogICAgICAqICAgICAgICAgICAgICAgIExpc3QKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBMaXN0Ci0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBMaXN0CisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CkBAIC00MDcsMTMgKzQxOCwxNCBAQAogICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKICAgICAgKiBAcmV0dXJuIHRydWUKICAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhZGRpbmcgdG8gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKICAgICAgKiAgICAgICAgICAgICAgICBMaXN0Ci0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgTGlzdAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBMaXN0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KSB7CkBAIC00MjQsMjMgKzQzNiwyMiBAQAogICAgIC8qKgogICAgICAqIEluc2VydHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KICAgICAgKiBpbiB0aGlzIExpc3QuIFRoZSBvYmplY3RzIGFyZSBhZGRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgZnJvbQotICAgICAqIHRoZSBDb2xsZWN0aW9uIGl0ZXJhdG9yLgotICAgICAqIAorICAgICAqIHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0LgogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCiAgICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgTGlzdCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiBhbiBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcyBMaXN0Ci0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBMaXN0Ci0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgTGlzdCBpcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFkZGluZyB0byB0aGlzIGxpc3QgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBvZiBhbiBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcyBsaXN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIGxpc3QuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+IHNpemUoKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGxvY2F0aW9uLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7CiAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdCA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKQEAgLTQ1MSwxNCArNDYyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIExpc3QsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIGxpc3QsIGxlYXZpbmcgaXQgZW1wdHkuCiAgICAgICogCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIExpc3QgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIAorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiByZW1vdmluZyBmcm9tIHRoaXMgbGlzdCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqIEBzZWUgTGlzdCNpc0VtcHR5CiAgICAgICogQHNlZSBMaXN0I3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKQEAgLTQ2NiwxNyArNDc2LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBMaXN0IGFuZCBhbnN3ZXIgaWYgdGhleSBhcmUgZXF1YWwuCi0gICAgICogVGhlIG9iamVjdCBtdXN0IGJlIGEgTGlzdCB3aGljaCBjb250YWlucyB0aGUgc2FtZSBvYmplY3RzIGluIHRoZSBzYW1lCi0gICAgICogb3JkZXIuCi0gICAgICogCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBsaXN0IGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZQorICAgICAqIGVxdWFsLiBUd28gbGlzdHMgYXJlIGVxdWFsIHdoZW4gdGhleSBib3RoIGNvbnRhaW4gdGhlIHNhbWUgb2JqZWN0cyBpbiB0aGUKKyAgICAgKiBzYW1lIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgTGlzdCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgbGlzdCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTUwMiwyNiArNTExLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoaXMgTGlzdC4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyBsaXN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBFIGdldChpbnQgbG9jYXRpb24pOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIG9mIHRoaXMgbGlzdC4gVGhlIGhhc2ggY29kZSBpcyBjYWxjdWxhdGVkIGJ5IHRha2luZworICAgICAqIGVhY2ggZWxlbWVudCdzIGhhc2hjb2RlIGludG8gYWNjb3VudC4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUuCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHNlZSBMaXN0I2hhc2hDb2RlKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtNTM1LDEzICs1NDMsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIExpc3QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUKKyAgICAgKiBTZWFyY2hlcyB0aGlzIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUKICAgICAgKiBmaXJzdCBvY2N1cnJlbmNlLgogICAgICAqIAotICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb2JqZWN0LCBvciAtMSBpZiBpdCB3YXMKKyAgICAgKiAgICAgICAgIG5vdCBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewogICAgICAgICBMaXN0SXRlcmF0b3I8Pz4gaXQgPSBsaXN0SXRlcmF0b3IoKTsKQEAgLTU2MiwxMyArNTcxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaXN0LiBUaGUgZWxlbWVudHMgYXJlCi0gICAgICogaXRlcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IG9jY3VyIGluIHRoZSBMaXN0LgorICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZQorICAgICAqIGl0ZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhlIGxpc3QuCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaXN0Ci0gICAgICogCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0LgogICAgICAqIEBzZWUgSXRlcmF0b3IKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7CkBAIC01NzYsMTMgKzU4NCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgTGlzdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZQorICAgICAqIFNlYXJjaGVzIHRoaXMgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZQogICAgICAqIGxhc3Qgb2NjdXJyZW5jZS4KICAgICAgKiAKLSAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBvYmplY3QsIG9yIC0xIGlmIHRoZQorICAgICAqICAgICAgICAgb2JqZWN0IHdhcyBub3QgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7CiAgICAgICAgIExpc3RJdGVyYXRvcjw/PiBpdCA9IGxpc3RJdGVyYXRvcihzaXplKCkpOwpAQCAtNjAzLDY4ICs2MTIsNjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTGlzdEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIExpc3QuIFRoZSBlbGVtZW50cyBhcmUKLSAgICAgKiBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgaW4gdGhlIExpc3QuCisgICAgICogUmV0dXJucyBhIExpc3RJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0LiBUaGUgZWxlbWVudHMgYXJlCisgICAgICogaXRlcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IG9jY3VyIGluIHRoZSBsaXN0LgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBMaXN0SXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgTGlzdAotICAgICAqIAorICAgICAqIEByZXR1cm4gYSBMaXN0SXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdAogICAgICAqIEBzZWUgTGlzdEl0ZXJhdG9yCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7CiAgICAgICAgIHJldHVybiBsaXN0SXRlcmF0b3IoMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIExpc3RJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaXN0LiBUaGUgZWxlbWVudHMgYXJlCi0gICAgICogaXRlcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IG9jY3VyIGluIHRoZSBMaXN0LiBUaGUgaXRlcmF0aW9uCisgICAgICogUmV0dXJucyBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZQorICAgICAqIGl0ZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhlIGxpc3QuIFRoZSBpdGVyYXRpb24KICAgICAgKiBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KICAgICAgKiAKLSAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCB0aGUgaXRlcmF0aW9uCi0gICAgICogQHJldHVybiBhIExpc3RJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaXN0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBpdGVyYXRpb24uCisgICAgICogQHJldHVybiBhIExpc3RJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgbG9jYXRpb24gPiBzaXplKCl9CiAgICAgICogQHNlZSBMaXN0SXRlcmF0b3IKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihpbnQgbG9jYXRpb24pIHsKICAgICAgICAgcmV0dXJuIG5ldyBGdWxsTGlzdEl0ZXJhdG9yKGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBmcm9tIHRoaXMgTGlzdC4KLSAgICAgKiAKKyAgICAgKiBSZW1vdmVzIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBmcm9tIHRoaXMgbGlzdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIExpc3QgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcmVtb3ZpbmcgZnJvbSB0aGlzIGxpc3QgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbG9jYXRpb24gPCAwIHx8ID49IHNpemUoKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSByZW1vdmUoaW50IGxvY2F0aW9uKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSBmcm9tIHRoZSBzdGFydCB0byB0aGUsIGJ1dCBub3QKLSAgICAgKiBpbmNsdWRpbmcsIGVuZCBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBSZW1vdmVzIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UgZnJvbSB0aGUgc3RhcnQgdG8gdGhlIGVuZAorICAgICAqIGluZGV4IG1pbnVzIG9uZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCByZW1vdmluZworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbW92aW5nLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byByZW1vdmUKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA8IDAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBlbGVtZW50IHRvIHJlbW92ZS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcmVtb3ZpbmcgZnJvbSB0aGlzIGxpc3QgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSBvciB7QGNvZGUgc3RhcnQgPj0gc2l6ZSgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgSXRlcmF0b3I8Pz4gaXQgPSBsaXN0SXRlcmF0b3Ioc3RhcnQpOwpAQCAtNjc1LDcyICs2NzksNzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoaXMgTGlzdCB3aXRoIHRoZQorICAgICAqIFJlcGxhY2VzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyBsaXN0IHdpdGggdGhlCiAgICAgICogc3BlY2lmaWVkIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBwdXQgdGhlIHNwZWNpZmllZCBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBwdXQgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBlbGVtZW50IGF0IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlcGxhY2luZyBlbGVtZW50cyBpbiB0aGlzIExpc3QgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMgTGlzdAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgTGlzdAotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQgYXQgdGhlIGluZGV4LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiByZXBsYWNpbmcgZWxlbWVudHMgaW4gdGhpcyBsaXN0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMgbGlzdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBsaXN0LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIHNldChpbnQgbG9jYXRpb24sIEUgb2JqZWN0KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwYXJ0IG9mIGNvbnNlY3V0aXZlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCBhcyBhIHZpZXcuIEZyb20gc3RhcnQKLSAgICAgKiAoaW5jbHVzaXZlKSwgdG8gZW5kKGV4Y2x1c2l2ZSkuIFRoZSByZXR1cm5lZCB2aWV3IHdpbGwgYmUgb2YgemVybyBsZW5ndGgKLSAgICAgKiBpZiBzdGFydCBlcXVhbHMgZW5kLiBBbnkgY2hhbmdlIG9jY3VycyBpbiB0aGUgcmV0dXJuZWQgc3ViTGlzdCB3aWxsIGJlCi0gICAgICogcmVmbGVjdGVkIHRvIHRoZSBvcmlnaW5hbCBsaXN0LCBhbmQgdmljZS12ZXJzYS4gQWxsIHRoZSBzdXBwb3J0ZWQKLSAgICAgKiBvcHRpb25hbCBvcGVyYXRpb25zIGJ5IHRoZSBvcmlnaW5hbCBsaXN0IHdpbGwgYWxzbyBiZSBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAqIHN1Ykxpc3QuCi0gICAgICogCisgICAgICogUmV0dXJucyBhIHBhcnQgb2YgY29uc2VjdXRpdmUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGFzIGEgdmlldy4gVGhlCisgICAgICogcmV0dXJuZWQgdmlldyB3aWxsIGJlIG9mIHplcm8gbGVuZ3RoIGlmIHN0YXJ0IGVxdWFscyBlbmQuIEFueSBjaGFuZ2UgdGhhdAorICAgICAqIG9jY3VycyBpbiB0aGUgcmV0dXJuZWQgc3ViTGlzdCB3aWxsIGJlIHJlZmxlY3RlZCB0byB0aGUgb3JpZ2luYWwgbGlzdCwKKyAgICAgKiBhbmQgdmljZS12ZXJzYS4gQWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9uYWwgb3BlcmF0aW9ucyBieSB0aGUgb3JpZ2luYWwKKyAgICAgKiBsaXN0IHdpbGwgYWxzbyBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBzdWJMaXN0LgorICAgICAqIDxwPgogICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGFzIGEgaGFuZHkgbWV0aG9kIHRvIGRvIHNvbWUgb3BlcmF0aW9ucyBvbiBhIHN1YgotICAgICAqIHJhbmdlIG9mIHRoZSBvcmlnaW5hbCBsaXN0LiBGb3IgZXhhbXBsZTogbGlzdC5zdWJMaXN0KGZyb20sIHRvKS5jbGVhcigpOwotICAgICAqIAotICAgICAqIElmIHRoZSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkIG90aGVyIHRoYW4gdGhyb3VnaCB0aGUgcmV0dXJuZWQgc3ViTGlzdCwKLSAgICAgKiB0aGUgYmVoYXZpb3Igb2YgdGhlIHJldHVybmVkIHN1Ykxpc3QgYmVjb21lcyB1bmRlZmluZWQuCi0gICAgICogCisgICAgICogcmFuZ2Ugb2YgdGhlIG9yaWdpbmFsIGxpc3QsIGZvciBleGFtcGxlCisgICAgICoge0Bjb2RlIGxpc3Quc3ViTGlzdChmcm9tLCB0bykuY2xlYXIoKTt9CisgICAgICogPHA+CisgICAgICogSWYgdGhlIG9yaWdpbmFsIGxpc3QgaXMgbW9kaWZpZWQgaW4gb3RoZXIgd2F5cyB0aGFuIHRocm91Z2ggdGhlIHJldHVybmVkCisgICAgICogc3ViTGlzdCwgdGhlIGJlaGF2aW9yIG9mIHRoZSByZXR1cm5lZCBzdWJMaXN0IGJlY29tZXMgdW5kZWZpbmVkLgorICAgICAqIDxwPgogICAgICAqIFRoZSByZXR1cm5lZCBzdWJMaXN0IGlzIGEgc3ViY2xhc3Mgb2YgQWJzdHJhY3RMaXN0LiBUaGUgc3ViY2xhc3Mgc3RvcmVzCiAgICAgICogb2Zmc2V0LCBzaXplIG9mIGl0c2VsZiwgYW5kIG1vZENvdW50IG9mIHRoZSBvcmlnaW5hbCBsaXN0LiBJZiB0aGUKICAgICAgKiBvcmlnaW5hbCBsaXN0IGltcGxlbWVudHMgUmFuZG9tQWNjZXNzIGludGVyZmFjZSwgdGhlIHJldHVybmVkIHN1Ykxpc3QKICAgICAgKiBhbHNvIGltcGxlbWVudHMgUmFuZG9tQWNjZXNzIGludGVyZmFjZS4KLSAgICAgKiAKKyAgICAgKiA8cD4KICAgICAgKiBUaGUgc3ViTGlzdCdzIHNldChpbnQsIE9iamVjdCksIGdldChpbnQpLCBhZGQoaW50LCBPYmplY3QpLCByZW1vdmUoaW50KSwKICAgICAgKiBhZGRBbGwoaW50LCBDb2xsZWN0aW9uKSBhbmQgcmVtb3ZlUmFuZ2UoaW50LCBpbnQpIG1ldGhvZHMgZmlyc3QgY2hlY2sgdGhlCiAgICAgICogYm91bmRzLCBhZGp1c3Qgb2Zmc2V0cyBhbmQgdGhlbiBjYWxsIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb2YgdGhlCiAgICAgICogb3JpZ2luYWwgQWJzdHJhY3RMaXN0LiBhZGRBbGwoQ29sbGVjdGlvbiBjKSBtZXRob2Qgb2YgdGhlIHJldHVybmVkCiAgICAgICogc3ViTGlzdCBjYWxscyB0aGUgb3JpZ2luYWwgYWRkQWxsKG9mZnNldCArIHNpemUsIGMpLgotICAgICAqIAorICAgICAqIDxwPgogICAgICAqIFRoZSBsaXN0SXRlcmF0b3IoaW50KSBtZXRob2Qgb2YgdGhlIHN1Ykxpc3Qgd3JhcHMgdGhlIG9yaWdpbmFsIGxpc3QKICAgICAgKiBpdGVyYXRvci4gVGhlIGl0ZXJhdG9yKCkgbWV0aG9kIG9mIHRoZSBzdWJMaXN0IGludm9rZXMgdGhlIG9yaWdpbmFsCiAgICAgICogbGlzdEl0ZXJhdG9yKCkgbWV0aG9kLCBhbmQgdGhlIHNpemUoKSBtZXRob2QgbWVyZWx5IHJldHVybnMgdGhlIHNpemUgb2YKICAgICAgKiB0aGUgc3ViTGlzdC4KLSAgICAgKiAKKyAgICAgKiA8cD4KICAgICAgKiBBbGwgbWV0aG9kcyB3aWxsIHRocm93IGEgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kQ291bnQKICAgICAgKiBvZiB0aGUgb3JpZ2luYWwgbGlzdCBpcyBub3QgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgc3RhcnQgaW5kZXggb2YgdGhlIHN1Ykxpc3QsIGluY2x1ZGUgc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHN0YXJ0IGluZGV4IG9mIHRoZSBzdWJMaXN0IChpbmNsdXNpdmUpLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIGVuZCBpbmRleCBvZiB0aGUgc3ViTGlzdCwgZXhjbHVkZSBlbmQKLSAgICAgKiBAcmV0dXJuIGEgc3ViTGlzdCB2aWV3IG9mIHRoaXMgbGlzdCBzdGFydCBmcm9tIHN0YXJ0IChpbmNsdXNpdmUpLCBlbmQKLSAgICAgKiAgICAgICAgIHdpdGggZW5kIChleGNsdXNpdmUpCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiAoc3RhcnQgPCAwIHx8IGVuZCA+IHNpemUoKSkKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gKHN0YXJ0ID4gZW5kKQorICAgICAqICAgICAgICAgICAgZW5kIGluZGV4IG9mIHRoZSBzdWJMaXN0LCAoZXhjbHVzaXZlKS4KKyAgICAgKiBAcmV0dXJuIGEgc3ViTGlzdCB2aWV3IG9mIHRoaXMgbGlzdCBzdGFydGluZyBmcm9tIHtAY29kZSBzdGFydH0KKyAgICAgKiAgICAgICAgIChpbmNsdXNpdmUpLCBhbmQgZW5kaW5nIHdpdGgge0Bjb2RlIGVuZH0gKGV4Y2x1c2l2ZSkKKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHNpemUoKSkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIChzdGFydCA+IGVuZCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBpZiAoMCA8PSBzdGFydCAmJiBlbmQgPD0gc2l6ZSgpKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0TWFwLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0TWFwLmphdmEKaW5kZXggMzkwYmFmMS4uMDAyNjZhNyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdE1hcC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RNYXAuamF2YQpAQCAtMTcsMTIgKzE3LDE3IEBACiAKIHBhY2thZ2UgamF2YS51dGlsOwogCisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisvLyBjb3BpZWQgZnJvbSBuZXdlciBoYXJtb255CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCisKIC8qKgotICogQWJzdHJhY3RNYXAgaXMgYW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1hcCBpbnRlcmZhY2UuIFRoaXMKLSAqIEltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLiBBIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQorICogVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0Bjb2RlIE1hcH0gaW50ZXJmYWNlLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy4gQSBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKICAqIGFic3RyYWN0IG1ldGhvZCBlbnRyeVNldCgpLgogICogCi0gKiBAc2luY2UgMS4yCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKIApAQCAtMzIsMzEgKzM3LDM1IEBACiAgICAgQ29sbGVjdGlvbjxWPiB2YWx1ZXNDb2xsZWN0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIEFic3RyYWN0TWFwLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB7QGNvZGUgQWJzdHJhY3RNYXB9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBBYnN0cmFjdE1hcCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgTWFwLCBsZWF2aW5nIGl0IGVtcHR5LgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBtYXAsIGxlYXZpbmcgaXQgZW1wdHkuCiAgICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIE1hcCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogCi0gICAgICogQHNlZSAjaXNFbXB0eQotICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgcmVtb3ZpbmcgZnJvbSB0aGlzIG1hcCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzZWUgI2lzRW1wdHkoKQorICAgICAqIEBzZWUgI3NpemUoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogICAgICAgICBlbnRyeVNldCgpLmNsZWFyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBNYXAgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+a2V5PC9jb2RlPiBpcyBhIGtleSBvZiB0aGlzIE1hcCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXksCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gaXQgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7CkBAIC03NywxMiArODYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIE1hcCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT52YWx1ZTwvY29kZT4gaXMgYSB2YWx1ZSBvZiB0aGlzIE1hcCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gaXQgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7CkBAIC0xMDMsMjggKzExMywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiBFYWNoIGVsZW1lbnQgaW4KLSAgICAgKiB0aGlzIHNldCBpcyBhIE1hcC5FbnRyeS4gVGhlIHNldCBpcyBiYWNrZWQgYnkgdGhlIG1hcCBzbyBjaGFuZ2VzIHRvIG9uZQotICAgICAqIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiAoSWYgdGhlIG1hcCBpcyBtb2RpZmllZCB3aGlsZSBhbiBpdGVyYXRpb24KLSAgICAgKiBvdmVyIHRoZSBzZXQgaXMgaW4gcHJvZ3Jlc3MsIHRoZSByZXN1bHRzIG9mIHRoZSBpdGVyYXRpb24gYXJlIHVuZGVmaW5lZC4pCi0gICAgICogVGhlIHNldCBzdXBwb3J0cyByZW1vdmUsIHJlbW92ZUFsbCwgcmV0YWluQWxsIGFuZCBjbGVhciBvcGVyYXRpb25zLCBhbmQKLSAgICAgKiBpdCBkb2VzIG5vdCBzdXBwb3J0IGFkZCBvciBhZGRBbGwgb3BlcmF0aW9ucy4KKyAgICAgKiBSZXR1cm5zIGEgc2V0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4gRWFjaCBtYXBwaW5nIGlzCisgICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1hcC5FbnRyeX0uIEFzIHRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgbWFwLAorICAgICAqIGNoYW5nZXMgaW4gb25lIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBvdGhlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBtYXBwaW5ncyBjb250YWluZWQgaW4gdGhpcyBtYXAKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBtYXBwaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKTsKIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMgTWFwIGFuZCBhbnN3ZXIgaWYgdGhleSBhcmUgZXF1YWwuCi0gICAgICogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIE1hcCBhbmQgY29udGFpbiB0aGUgc2FtZSBrZXkvdmFsdWUKLSAgICAgKiBwYWlycy4KKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIGluc3RhbmNlLCBhbmQgcmV0dXJucyB7QGNvZGUgdHJ1ZX0KKyAgICAgKiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIG1hcCBhbmQgYm90aCBtYXBzIGNvbnRhaW4gdGhlIHNhbWUgbWFwcGluZ3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBNYXAsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiBib29sZWFuIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0LAorICAgICAqICAgICAgICAgYW5kIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBvYmplY3QuCisgICAgICogQHNlZSAjaGFzaENvZGUoKQorICAgICAqIEBzZWUgI2VudHJ5U2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtMTM3LDEzICsxNDUsMTkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFNldDw/PiBvYmplY3RTZXQgPSBtYXAuZW50cnlTZXQoKTsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CiAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGl0ID0gZW50cnlTZXQoKS5pdGVyYXRvcigpOwogICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGlmICghb2JqZWN0U2V0LmNvbnRhaW5zKGl0Lm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICBFbnRyeTxLLCBWPiBlbnRyeSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBLIGtleSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIFYgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBtYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgaWYoIG51bGwgIT0gb2JqICYmICghb2JqLmVxdWFscyh2YWx1ZSkpIHx8IG51bGwgPT0gb2JqICYmIG9iaiAhPSB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTUzLDggKzE2NywxMCBAQAogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiBubyBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGtleSBpcyBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgViBnZXQoT2JqZWN0IGtleSkgewogICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGl0ID0gZW50cnlTZXQoKS5pdGVyYXRvcigpOwpAQCAtMTc3LDEyICsxOTMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgb2JqZWN0LiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbCBtdXN0CisgICAgICogcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBvYmplY3QuCisgICAgICogQHNlZSAjZXF1YWxzKE9iamVjdCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtMTk1LDIyICsyMTEsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgTWFwIGhhcyBubyBlbGVtZW50cywgYSBzaXplIG9mIHplcm8uCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWFwIGlzIGVtcHR5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIE1hcCBoYXMgbm8gZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBoYXMgbm8gZWxlbWVudHMsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNzaXplKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewogICAgICAgICByZXR1cm4gc2l6ZSgpID09IDA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNldCBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBNYXAuIFRoZSBzZXQgaXMgYmFja2VkIGJ5Ci0gICAgICogdGhpcyBNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZSBzZXQgZG9lcyBub3QKLSAgICAgKiBzdXBwb3J0IGFkZGluZy4KKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gVGhlIHNldCBpcyBiYWNrZWQgYnkKKyAgICAgKiB0aGlzIG1hcCBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIHJldHVybmVkIHNldAorICAgICAqIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTZXQgb2YgdGhlIGtleXMKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgewogICAgICAgICBpZiAoa2V5U2V0ID09IG51bGwpIHsKQEAgLTI1Myw0MyArMjcxLDQzIEBACiAgICAgICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBhbnkgcHJldmlvdXMgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IG9yIG51bGwKLSAgICAgKiAgICAgICAgIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgTWFwIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBrZXkgb3IgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZSBmb3IKLSAgICAgKiAgICAgICAgICAgICAgICB0aGlzIE1hcAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUga2V5IG9yIHZhbHVlIGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIE1hcAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBrZXkgb3IgdmFsdWUgaXMgbnVsbCBhbmQgdGhpcyBNYXAgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICBzdXBwb3J0IG51bGwga2V5cyBvciB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBhbnkgcHJldmlvdXMgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFkZGluZyB0byB0aGlzIG1hcCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIHRoZSBrZXkgb3IgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgIG1hcC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBrZXkgb3IgdmFsdWUgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgbWFwLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUga2V5IG9yIHZhbHVlIGlzIHtAY29kZSBudWxsfSBhbmQgdGhpcyBNYXAgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwb3J0IHtAY29kZSBudWxsfSBrZXlzIG9yIHZhbHVlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29waWVzIGV2ZXJ5IG1hcHBpbmcgaW4gdGhlIHNwZWNpZmllZCBNYXAgdG8gdGhpcyBNYXAuCisgICAgICogQ29waWVzIGV2ZXJ5IG1hcHBpbmcgaW4gdGhlIHNwZWNpZmllZCBtYXAgdG8gdGhpcyBtYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIE1hcCB0byBjb3B5IG1hcHBpbmdzIGZyb20KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBNYXAgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgYSBrZXkgb3IgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcwotICAgICAqICAgICAgICAgICAgICAgIE1hcAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhIGtleSBvciB2YWx1ZSBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBNYXAKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhIGtleSBvciB2YWx1ZSBpcyBudWxsIGFuZCB0aGlzIE1hcCBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICogICAgICAgICAgICAgICAgbnVsbCBrZXlzIG9yIHZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIG1hcCB0byBjb3B5IG1hcHBpbmdzIGZyb20uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFkZGluZyB0byB0aGlzIG1hcCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIGEga2V5IG9yIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICBtYXAuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhIGtleSBvciB2YWx1ZSBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBtYXAuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGEga2V5IG9yIHZhbHVlIGlzIHtAY29kZSBudWxsfSBhbmQgdGhpcyBtYXAgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwb3J0IHtAY29kZSBudWxsfSBrZXlzIG9yIHZhbHVlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbWFwKSB7CiAgICAgICAgIGZvciAoTWFwLkVudHJ5PD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewpAQCAtMzAxLDEyICszMTksMTIgQEAKICAgICAgKiBSZW1vdmVzIGEgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBNYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBtYXBwaW5nIG9yIG51bGwgaWYga2V5IGlzIG5vdCBhIGtleSBpbgotICAgICAqICAgICAgICAgdGhpcyBNYXAKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMgTWFwIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIG1hcHBpbmcgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIG1hcHBpbmcKKyAgICAgKiAgICAgICAgIGZvciB0aGUgc3BlY2lmaWVkIGtleSB3YXMgZm91bmQuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHJlbW92aW5nIGZyb20gdGhpcyBtYXAgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGl0ID0gZW50cnlTZXQoKS5pdGVyYXRvcigpOwpAQCAtMzMxLDE4ICszNDksMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBNYXAuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbWFwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIE1hcAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIG1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBlbnRyeVNldCgpLnNpemUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBNYXAuCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWFwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIE1hcAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMzgxLDIwICs0MDEsMjIgQEAKICAgICAgKiBpcyBiYWNrZWQgYnkgdGhpcyBtYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZQogICAgICAqIGNvbGxlY3Rpb24gc3VwcG9ydHMgcmVtb3ZlLCByZW1vdmVBbGwsIHJldGFpbkFsbCBhbmQgY2xlYXIgb3BlcmF0aW9ucywKICAgICAgKiBhbmQgaXQgZG9lcyBub3Qgc3VwcG9ydCBhZGQgb3IgYWRkQWxsIG9wZXJhdGlvbnMuCi0gICAgICogCisgICAgICogPHA+CiAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGNvbGxlY3Rpb24gd2hpY2ggaXMgdGhlIHN1YmNsYXNzIG9mCiAgICAgICogQWJzdHJhY3RDb2xsZWN0aW9uLiBUaGUgaXRlcmF0b3IgbWV0aG9kIG9mIHRoaXMgc3ViY2xhc3MgcmV0dXJucyBhCi0gICAgICogIndyYXBwZXIgb2JqZWN0IiBvdmVyIHRoZSBpdGVyYXRvciBvZiBtYXAncyBlbnRyeVNldCgpLiBUaGUgc2l6ZSBtZXRob2QKLSAgICAgKiB3cmFwcyB0aGUgbWFwJ3Mgc2l6ZSBtZXRob2QgYW5kIHRoZSBjb250YWlucyBtZXRob2Qgd3JhcHMgdGhlIG1hcCdzCi0gICAgICogY29udGFpbnNWYWx1ZSBtZXRob2QuCisgICAgICogIndyYXBwZXIgb2JqZWN0IiBvdmVyIHRoZSBpdGVyYXRvciBvZiBtYXAncyBlbnRyeVNldCgpLiBUaGUge0Bjb2RlIHNpemV9CisgICAgICogbWV0aG9kIHdyYXBzIHRoZSBtYXAncyBzaXplIG1ldGhvZCBhbmQgdGhlIHtAY29kZSBjb250YWluc30gbWV0aG9kIHdyYXBzCisgICAgICogdGhlIG1hcCdzIGNvbnRhaW5zVmFsdWUgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgICAqIGFuZCByZXR1cm5lZCBpbiByZXNwb25zZSB0byBhbGwgc3Vic2VxdWVudCBjYWxscy4gVGhpcyBtZXRob2QgbWF5IHJldHVybgorICAgICAqIGRpZmZlcmVudCBjb2xsZWN0aW9ucyB3aGVuIG11bHRpcGxlIGNvbmN1cnJlbnQgY2FsbHMgb2NjdXIgdG8gdGhpcworICAgICAqIG1ldGhvZCwgc2luY2Ugbm8gc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogVGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdCBmaXJzdCB0aW1lIGFuZAotICAgICAqIHJldHVybmVkIGluIHJlc3BvbnNlIHRvIGFsbCBzdWJzZXF1ZW50IGNhbGxzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuCi0gICAgICogZGlmZmVyZW50IENvbGxlY3Rpb24gd2hlbiBtdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCwgc2luY2UgaXQgaGFzIG5vCi0gICAgICogc3luY2hyb25pemF0aW9uIHBlcmZvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcAotICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKICAgICAgICAgaWYgKHZhbHVlc0NvbGxlY3Rpb24gPT0gbnVsbCkgewpAQCAtNDM0LDEzICs0NTYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIGNsYXNzIGFzIHRoZSByZWNlaXZlciwgd2hvc2Ugc2xvdHMKLSAgICAgKiBoYXZlIGJlZW4gZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlcyBpbiB0aGUgc2xvdHMgb2YgdGhlIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgY2xhc3MgYXMgdGhpcyBpbnN0YW5jZSwgd2hvc2Ugc2xvdHMKKyAgICAgKiBoYXZlIGJlZW4gZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlcyBvZiB0aGUgc2xvdHMgb2YgdGhpcyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE9iamVjdCBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiBAZXhjZXB0aW9uIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHJlY2VpdmVyJ3MgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgICAgICBDbG9uZWFibGUuCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIENsb25lYWJsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0UXVldWUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZS5qYXZhCmluZGV4IDM1ZDhhOTguLjBiOWJkZjEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZS5qYXZhCkBAIC0xNywyMSArMTcsMjMgQEAKIHBhY2thZ2UgamF2YS51dGlsOwogCiAvKioKLSAqIAotICogQW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggZ2l2ZXMgb3V0IHNrZWxldGFsIGltcGxlbWVudGF0aW9ucyBmb3Igc29tZSBtZXRob2RzCi0gKiBpbiBRdWV1ZSB3aGljaCBpbmNsdWRlIGFkZCwgcmVtb3ZlLCBhbmQgZWxlbWVudCB0aGF0IGFyZSBiYXNlZCBvbiBvZmZlciwKLSAqIHBvbGwsIGFuZCBwZWVrIGV4Y2VwdCB0aGF0IHRoZXkgdGhyb3cgZXhjZXB0aW9uIHRvIGluZGljYXRlIHRoZSBvY2N1cnJlbmNlIG9mCi0gKiBzb21lIGVycm9yIGluc3RlYWQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiBmYWxzZSBvciBudWxsLgorICogQWJzdHJhY3RRdWV1ZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4KKyAqIHtAbGluayBRdWV1ZX0uIFRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbnMgb2Yge0Bjb2RlIGFkZCwgcmVtb3ZlfSBhbmQKKyAqIHtAY29kZSBlbGVtZW50fSBhcmUgYmFzZWQgb24ge0Bjb2RlIG9mZmVyLCBwb2xsfSwgYW5kIHtAY29kZSBwZWVrfSBleGNlcHQKKyAqIHRoYXQgdGhleSB0aHJvdyBleGNlcHRpb25zIHRvIGluZGljYXRlIHNvbWUgZXJyb3IgaW5zdGVhZCBvZiByZXR1cm5pbmcgdHJ1ZQorICogb3IgZmFsc2UuCiAgKiAKICAqIEBwYXJhbSA8RT4KICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVldWU8RT4gZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248RT4gaW1wbGVtZW50cwogICAgICAgICBRdWV1ZTxFPiB7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIHN1YiBjbGFzc2VzLgorICAgICAqIENvbnN0cnVjdG9yIHRvIGJlIHVzZWQgYnkgc3ViY2xhc3Nlcy4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RRdWV1ZSgpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTQwLDExICs0MiwxMiBAQAogICAgIC8qKgogICAgICAqIEFkZHMgYW4gZWxlbWVudCB0byB0aGUgcXVldWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIGVsZW1lbnQgYWRkZWQgdG8gdGhlIHF1ZXVlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgaXMgbnVsbC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB0byBiZSBhZGRlZAotICAgICAqICAgICAgICAgdG8gdGhlIHF1ZXVlLgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgcXVldWUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB0byBiZSBhZGRlZCB0byB0aGUgcXVldWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewpAQCAtNTksMjAgKzYyLDIxIEBACiAKICAgICAvKioKICAgICAgKiBBZGRzIGFsbCB0aGUgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uIHRvIHRoZSBxdWV1ZS4gSWYgdGhlIGNvbGxlY3Rpb24gaXMKLSAgICAgKiB0aGUgcXVldWUgaXRzZWxmLCB0aGVuIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBvdXQuIElmCi0gICAgICogZHVyaW5nIHRoZSBwcm9jZXNzLCBzb21lIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biBvdXQsIHRoZW4gcGFydCBvZgotICAgICAqIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiB0aGF0IGhhdmUgc3VjY2Vzc2Z1bGx5IGFkZGVkIHdpbGwgcmVtYWluCi0gICAgICogaW4gdGhlIHF1ZXVlLgorICAgICAqIHRoZSBxdWV1ZSBpdHNlbGYsIHRoZW4gYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBJZgorICAgICAqIGR1cmluZyB0aGUgcHJvY2Vzcywgc29tZSBydW50aW1lIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gdGhvc2UgZWxlbWVudHMKKyAgICAgKiBpbiB0aGUgY29sbGVjdGlvbiB3aGljaCBoYXZlIGFscmVhZHkgc3VjY2Vzc2Z1bGx5IGJlZW4gYWRkZWQgd2lsbCByZW1haW4KKyAgICAgKiBpbiB0aGUgcXVldWUuIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBpcyB1bmRlZmluZWQgaWYgdGhlIGNvbGxlY3Rpb24gaXMKKyAgICAgKiBtb2RpZmllZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgdGhlIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgaXMgdW5kZWZpbmVkIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG1vZGlmaWVkCi0gICAgICogZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHRoZSBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNvbGxlY3Rpb24gdG8gYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gb3IgYW55IGVsZW1lbnQgb2YgaXQgaXMKLSAgICAgKiAgICAgICAgIG51bGwuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIGNvbGxlY3Rpb24gdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICogICAgICAgICBxdWV1ZSBpcyB0aGUgcXVldWUgaXRzZWxmLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiB0byBiZSBhZGRlZCB0byB0aGUgcXVldWUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb2xsZWN0aW9uIG9yIGFueSBlbGVtZW50IG9mIGl0IGlzIG51bGwuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY29sbGVjdGlvbiB0byBiZSBhZGRlZCB0byB0aGUgcXVldWUgaXMgdGhlIHF1ZXVlCisgICAgICogICAgICAgICAgICAgaXRzZWxmLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7CkBAIC04NiwxMCArOTAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuZCByZW1vdmVzIHRoZSBlbGVtZW50IGluIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJucyBpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGluIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSByZW1vdmUoKSB7CiAgICAgICAgIEUgbyA9IHBvbGwoKTsKQEAgLTEwMCwxMCArMTA2LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBidXQgbm90IHJlbW92ZXMgdGhlIGVsZW1lbnQgaW4gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorICAgICAqIFJldHVybnMgYnV0IGRvZXMgbm90IHJlbW92ZSB0aGUgZWxlbWVudCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBpbiB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEUgZWxlbWVudCgpIHsKICAgICAgICAgRSBvID0gcGVlaygpOwpAQCAtMTE0LDcgKzEyMiw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgb2YgdGhlIHF1ZXVlLgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIG9mIHRoZSBxdWV1ZSwgbGVhdmluZyBpdCBlbXB0eS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RTZXF1ZW50aWFsTGlzdC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdFNlcXVlbnRpYWxMaXN0LmphdmEKaW5kZXggZjMxZTFjYy4uNGNhOGY3YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdFNlcXVlbnRpYWxMaXN0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdFNlcXVlbnRpYWxMaXN0LmphdmEKQEAgLTIyLDY2ICsyMiwyNSBAQAogICogQWJzdHJhY3RTZXF1ZW50aWFsTGlzdCBpcyBhbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLiBBIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQogICogYWJzdHJhY3QgbWV0aG9kIGxpc3RJdGVyYXRvcigpLgotICogQHNpbmNlIDEuMgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VxdWVudGlhbExpc3Q8RT4gZXh0ZW5kcyBBYnN0cmFjdExpc3Q8RT4gewogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIEFic3RyYWN0U2VxdWVudGlhbExpc3QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0U2VxdWVudGlhbExpc3QoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIHRoaXMgTGlzdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotICAgICAqIFRoZSBvYmplY3QgaXMgaW5zZXJ0ZWQgYmVmb3JlIGFueSBwcmV2aW91cyBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQKLSAgICAgKiBsb2NhdGlvbi4gSWYgdGhlIGxvY2F0aW9uIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoaXMgTGlzdCwgdGhlIG9iamVjdAotICAgICAqIGlzIGFkZGVkIGF0IHRoZSBlbmQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0Ci0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcwotICAgICAqICAgICAgICAgICAgICAgIExpc3QKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBMaXN0Ci0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgaXMgbnVsbCBhbmQgdGhpcyBMaXN0IGRvZXMgbm90IHN1cHBvcnQKLSAgICAgKiAgICAgICAgICAgICAgICBudWxsIGVsZW1lbnRzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkKGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKICAgICAgICAgbGlzdEl0ZXJhdG9yKGxvY2F0aW9uKS5hZGQob2JqZWN0KTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uCi0gICAgICogaW4gdGhpcyBMaXN0LiBUaGUgb2JqZWN0cyBhcmUgYWRkZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkIGZyb20KLSAgICAgKiB0aGUgQ29sbGVjdGlvbiBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gb2Ygb2JqZWN0cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIExpc3QgaXMgbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFkZGluZyB0byB0aGlzIExpc3QgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMgTGlzdAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgTGlzdAotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGxvY2F0aW9uLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7CiAgICAgICAgIExpc3RJdGVyYXRvcjxFPiBpdCA9IGxpc3RJdGVyYXRvcihsb2NhdGlvbik7CkBAIC0xMDYsMTYgKzY1LDYgQEAKICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyBMaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRSBnZXQoaW50IGxvY2F0aW9uKSB7CiAgICAgICAgIHRyeSB7CkBAIC0xMjUsNDggKzc0LDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIExpc3QuIFRoZSBlbGVtZW50cyBhcmUKLSAgICAgKiBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgaW4gdGhlIExpc3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaXN0Ci0gICAgICogCi0gICAgICogQHNlZSBJdGVyYXRvcgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKICAgICAgICAgcmV0dXJuIGxpc3RJdGVyYXRvcigwKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTGlzdEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIExpc3QuIFRoZSBlbGVtZW50cyBhcmUKLSAgICAgKiBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgaW4gdGhlIExpc3QuIFRoZSBpdGVyYXRpb24KLSAgICAgKiBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCB0aGUgaXRlcmF0aW9uCi0gICAgICogQHJldHVybiBhIExpc3RJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaXN0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIAotICAgICAqIEBzZWUgTGlzdEl0ZXJhdG9yCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGFic3RyYWN0IExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGxvY2F0aW9uKTsKIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGZyb20gdGhpcyBMaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0aGUgcmVtb3ZlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFIHJlbW92ZShpbnQgbG9jYXRpb24pIHsKICAgICAgICAgdHJ5IHsKQEAgLTE3OSwyNSArOTQsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIExpc3Qgd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHB1dCB0aGUgc3BlY2lmaWVkIG9iamVjdAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCBhdCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgZWxlbWVudHMgaW4gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIGFuIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzIExpc3QKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIExpc3QKLSAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCk8L2NvZGU+Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEUgc2V0KGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKICAgICAgICAgTGlzdEl0ZXJhdG9yPEU+IGl0ID0gbGlzdEl0ZXJhdG9yKGxvY2F0aW9uKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RTZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RTZXQuamF2YQppbmRleCBhZTVkOTIxLi5hMTliMWY3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0U2V0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdFNldC5qYXZhCkBAIC0xOCwzMiArMTgsMzUgQEAKIHBhY2thZ2UgamF2YS51dGlsOwogCiAvKioKLSAqIEFic3RyYWN0U2V0IGlzIGFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZXQgaW50ZXJmYWNlLiBUaGlzCi0gKiBJbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy4gQSBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKKyAqIEFuIEFic3RyYWN0U2V0IGlzIGFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZXQgaW50ZXJmYWNlLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy4gQSBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKICAqIGFic3RyYWN0IG1ldGhvZHMgaXRlcmF0b3IoKSBhbmQgc2l6ZSgpLgogICogCi0gKiBAc2luY2UgMS4yCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2V0PEU+IGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+IGltcGxlbWVudHMKICAgICAgICAgU2V0PEU+IHsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBBYnN0cmFjdFNldC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTZXQoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBTZXQgYW5kIGFuc3dlciBpZiB0aGV5IGFyZSBlcXVhbC4KLSAgICAgKiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgU2V0IGFuZCBjb250YWluIHRoZSBzYW1lIG9iamVjdHMuCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBTZXQgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IGFyZQorICAgICAqIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgU2V0IGFuZCBjb250YWluIHRoZSBzYW1lCisgICAgICogb2JqZWN0cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIFNldCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBzZXQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBzZXQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTUyLDI1ICs1NSwyNiBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXQpIHsKICAgICAgICAgICAgIFNldDw/PiBzID0gKFNldDw/Pikgb2JqZWN0OwotICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC11cGRhdGVkCi0gICAgICAgICAgICAvLyAoVGFrZW4gZnJvbSBuZXdlciBIYXJtb255IHJldmlzaW9uKQorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAvLyBjb3BpZWQgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZSgpID09IHMuc2l6ZSgpICYmIGNvbnRhaW5zQWxsKHMpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLXVwZGF0ZWQKKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIHNldC4gVHdvIHNldCB3aGljaCBhcmUgZXF1YWwgbXVzdCByZXR1cm4KKyAgICAgKiB0aGUgc2FtZSB2YWx1ZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxjdWxhdGVzIHRoZSBoYXNoIGNvZGUgYnkgYWRkaW5nCisgICAgICogZWFjaCBlbGVtZW50J3MgaGFzaCBjb2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBvZiB0aGlzIHNldC4KICAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtODQsMTUgKzg4LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgaW4gdGhpcyBDb2xsZWN0aW9uIG9mIGVhY2ggb2JqZWN0IGluIHRoZQotICAgICAqIHNwZWNpZmllZCBDb2xsZWN0aW9uLgorICAgICAqIFJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIGluIHRoaXMgY29sbGVjdGlvbiB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoZQorICAgICAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIENvbGxlY3Rpb24gaXMgbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byByZW1vdmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb2xsZWN0aW9uIHdhcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBDb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBjb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BcnJheUxpc3QuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQXJyYXlMaXN0LmphdmEKaW5kZXggZWRlMzExOS4uNWVhMzE2YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BcnJheUxpc3QuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5TGlzdC5qYXZhCkBAIC0yNiwxMCArMjYsMTEgQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKIAogLyoqCi0gKiBBcnJheUxpc3QgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgTGlzdCwgYmFja2VkIGJ5IGFuIGFycmF5LiBBbGwgb3B0aW9uYWwKLSAqIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCwgYWRkaW5nLCByZW1vdmluZywgYW5kIHJlcGxhY2luZy4gVGhlIGVsZW1lbnRzIGNhbgotICogYmUgYW55IG9iamVjdHMuCi0gKiBAc2luY2UgMS4yCisgKiBBcnJheUxpc3QgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3R9LCBiYWNrZWQgYnkgYW4gYXJyYXkuIEFsbAorICogb3B0aW9uYWwgb3BlcmF0aW9ucyBhZGRpbmcsIHJlbW92aW5nLCBhbmQgcmVwbGFjaW5nIGFyZSBzdXBwb3J0ZWQuIFRoZQorICogZWxlbWVudHMgY2FuIGJlIGFueSBvYmplY3RzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFycmF5TGlzdDxFPiBleHRlbmRzIEFic3RyYWN0TGlzdDxFPiBpbXBsZW1lbnRzIExpc3Q8RT4sIENsb25lYWJsZSwKICAgICAgICAgU2VyaWFsaXphYmxlLCBSYW5kb21BY2Nlc3MgewpAQCAtNDIsMjMgKzQzLDI3IEBACiAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBmaXJzdEluZGV4OwotCisgICAgCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGxhc3RJbmRleDsKIAogICAgIHByaXZhdGUgdHJhbnNpZW50IEVbXSBhcnJheTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgQXJyYXlMaXN0IHdpdGggemVybyBjYXBhY2l0eS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBBcnJheUxpc3R9IHdpdGggemVybyBjYXBhY2l0eS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXlMaXN0KCkgewogICAgICAgICB0aGlzKDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgQXJyYXlMaXN0IHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eS4KLSAgICAgKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFycmF5TGlzdH0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY2FwYWNpdHkuCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGlzIEFycmF5TGlzdAorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhpcyB7QGNvZGUgQXJyYXlMaXN0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXlMaXN0KGludCBjYXBhY2l0eSkgewogICAgICAgICBmaXJzdEluZGV4ID0gbGFzdEluZGV4ID0gMDsKQEAgLTcwLDEzICs3NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgQXJyYXlMaXN0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLiBUaGUgQXJyYXlMaXN0IHdpbGwgaGF2ZSBhbiBpbml0aWFsIGNhcGFjaXR5IHdoaWNoCi0gICAgICogaXMgMTEwJSBvZiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbi4gVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzCi0gICAgICogQXJyYXlMaXN0IGlzIHRoZSBvcmRlciB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbiBpdGVyYXRvci4KLSAgICAgKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFycmF5TGlzdH0gY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHtAY29kZSBBcnJheUxpc3R9IHdpbGwKKyAgICAgKiBiZSAxMCUgaGlnaGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgorICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyB0byBhZGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXlMaXN0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKICAgICAgICAgaW50IHNpemUgPSBjb2xsZWN0aW9uLnNpemUoKTsKQEAgLTg0LDcgKzg5LDcgQEAKICAgICAgICAgYXJyYXkgPSBuZXdFbGVtZW50QXJyYXkoc2l6ZSArIChzaXplIC8gMTApKTsKICAgICAgICAgYWRkQWxsKGNvbGxlY3Rpb24pOwogICAgIH0KLQorICAgIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHByaXZhdGUgRVtdIG5ld0VsZW1lbnRBcnJheShpbnQgc2l6ZSkgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCkBAIC05NywxOCArMTAyLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIHRoaXMgQXJyYXlMaXN0IGF0IHRoZSBzcGVjaWZpZWQKKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhpcyB7QGNvZGUgQXJyYXlMaXN0fSBhdCB0aGUgc3BlY2lmaWVkCiAgICAgICogbG9jYXRpb24uIFRoZSBvYmplY3QgaXMgaW5zZXJ0ZWQgYmVmb3JlIGFueSBwcmV2aW91cyBlbGVtZW50IGF0IHRoZQogICAgICAqIHNwZWNpZmllZCBsb2NhdGlvbi4gSWYgdGhlIGxvY2F0aW9uIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoaXMKLSAgICAgKiBBcnJheUxpc3QsIHRoZSBvYmplY3QgaXMgYWRkZWQgYXQgdGhlIGVuZC4KLSAgICAgKgorICAgICAqIHtAY29kZSBBcnJheUxpc3R9LCB0aGUgb2JqZWN0IGlzIGFkZGVkIGF0IHRoZSBlbmQuCisgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBvYmplY3QuCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkKGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKQEAgLTE0NywxMSArMTUyLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgZW5kIG9mIHRoaXMgQXJyYXlMaXN0LgotICAgICAqCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgZW5kIG9mIHRoaXMge0Bjb2RlIEFycmF5TGlzdH0uCisgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRydWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEByZXR1cm4gYWx3YXlzIHRydWUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBvYmplY3QpIHsKQEAgLTE2NCwxNiArMTcwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbgotICAgICAqIGluIHRoaXMgQXJyYXlMaXN0LiBUaGUgb2JqZWN0cyBhcmUgYWRkZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkCi0gICAgICogZnJvbSB0aGUgQ29sbGVjdGlvbiBpdGVyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0Ci0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gdGhlIENvbGxlY3Rpb24gb2Ygb2JqZWN0cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIEFycmF5TGlzdCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbgotICAgICAqICAgICAgICAgICAgPGNvZGU+bG9jYXRpb24gPCAwIHx8ID4gc2l6ZSgpPC9jb2RlPgorICAgICAqIEluc2VydHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KKyAgICAgKiBpbiB0aGlzIExpc3QuIFRoZSBvYmplY3RzIGFyZSBhZGRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgZnJvbQorICAgICAqIHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0LgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIEFycmF5TGlzdH0gaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgPiBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBsb2NhdGlvbiwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewpAQCAtMjI3LDExICsyMzYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiB0byB0aGlzIEFycmF5TGlzdC4KLSAgICAgKgorICAgICAqIEFkZHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRvIHRoaXMge0Bjb2RlIEFycmF5TGlzdH0uCisgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBBcnJheUxpc3QgaXMgbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBBcnJheUxpc3R9IGlzIG1vZGlmaWVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKQEAgLTI1MiwxMCArMjYzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIEFycmF5TGlzdCwgbGVhdmluZyBpdCBlbXB0eS4KLSAgICAgKgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyB7QGNvZGUgQXJyYXlMaXN0fSwgbGVhdmluZyBpdCBlbXB0eS4KKyAgICAgKiAKICAgICAgKiBAc2VlICNpc0VtcHR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewpAQCAtMjY3LDEyICsyNzksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEFycmF5TGlzdCB3aXRoIHRoZSBzYW1lIGVsZW1lbnRzLCBzaXplIGFuZCBjYXBhY2l0eSBhcyB0aGlzCi0gICAgICogQXJyYXlMaXN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIEFycmF5TGlzdAotICAgICAqCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQXJyYXlMaXN0fSB3aXRoIHRoZSBzYW1lIGVsZW1lbnRzLCB0aGUgc2FtZSBzaXplIGFuZAorICAgICAqIHRoZSBzYW1lIGNhcGFjaXR5IGFzIHRoaXMge0Bjb2RlIEFycmF5TGlzdH0uCisgICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBBcnJheUxpc3R9CiAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC0yODcsMTIgKzI5OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgQXJyYXlMaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLSAgICAgKgorICAgICAqIFNlYXJjaGVzIHRoaXMge0Bjb2RlIEFycmF5TGlzdH0gZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIGFuIGVsZW1lbnQgb2YgdGhpcyBBcnJheUxpc3QsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgb2JqZWN0fSBpcyBhbiBlbGVtZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBBcnJheUxpc3R9LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKQEAgLTMxMywxMiArMzI2LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IHRoaXMgQXJyYXlMaXN0IGNhbiBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gICAgICogd2l0aG91dCBncm93aW5nLgotICAgICAqCisgICAgICogRW5zdXJlcyB0aGF0IGFmdGVyIHRoaXMgb3BlcmF0aW9uIHRoZSB7QGNvZGUgQXJyYXlMaXN0fSBjYW4gaG9sZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgZnVydGhlciBncm93aW5nLgorICAgICAqIAogICAgICAqIEBwYXJhbSBtaW5pbXVtQ2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHRoaXMgQXJyYXlMaXN0IHdpbGwgaG9sZAotICAgICAqICAgICAgICAgICAgYmVmb3JlIGdyb3dpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIGNhcGFjaXR5IGFza2VkIGZvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbWluaW11bUNhcGFjaXR5KSB7CiAgICAgICAgIGlmIChhcnJheS5sZW5ndGggPCBtaW5pbXVtQ2FwYWNpdHkpIHsKQEAgLTMzMCwxNiArMzQzLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIEFycmF5TGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFIGdldChpbnQgbG9jYXRpb24pIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkOiBzbGlnaHQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQKQEAgLTQzOCwxNCArNDQxLDYgQEAKICAgICAgICAgYXJyYXkgPSBuZXdBcnJheTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIEFycmF5TGlzdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mCi0gICAgICogdGhlIGZpcnN0IG9jY3VycmVuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb2JqZWN0Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7CkBAIC00NjQsMjYgKzQ1OSwxMSBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIEFycmF5TGlzdCBoYXMgbm8gZWxlbWVudHMsIGEgc2l6ZSBvZiB6ZXJvLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgQXJyYXlMaXN0IGhhcyBubyBlbGVtZW50cywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICoKLSAgICAgKiBAc2VlICNzaXplCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKICAgICAgICAgcmV0dXJuIGxhc3RJbmRleCA9PSBmaXJzdEluZGV4OwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgQXJyYXlMaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YKLSAgICAgKiB0aGUgbGFzdCBvY2N1cnJlbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb2JqZWN0Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7CiAgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgewpAQCAtNTAzLDE0ICs0ODMsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBmcm9tIHRoaXMgQXJyYXlMaXN0LgotICAgICAqCisgICAgICogUmVtb3ZlcyB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gZnJvbSB0aGlzIGxpc3QuCisgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIG9iamVjdAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEUgcmVtb3ZlKGludCBsb2NhdGlvbikgewpAQCAtNTQ2LDcgKzUyNiw3IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIC8qCiAgICAgICogVGhlIHJlbW92ZShPYmplY3QpIGltcGxlbWVudGF0aW9uIGZyb20gQWJzdHJhY3RDb2xsZWN0aW9uIGNyZWF0ZXMKICAgICAgKiBhIG5ldyBJdGVyYXRvciBvbiBldmVyeSByZW1vdmUgYW5kIGVuZHMgdXAgY2FsbGluZyByZW1vdmUoaW50KS4KQEAgLTU2MCwyMCArNTQwLDE5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSBmcm9tIHRoZSBzdGFydCB0byB0aGUgZW5kLCBidXQKICAgICAgKiBub3QgaW5jbHVkaW5nIHRoZSBlbmQgaW5kZXguCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCByZW1vdmluZworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbW92aW5nLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byByZW1vdmUKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwLCBzdGFydCA+IGVuZDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBzaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb25lIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIHJlbW92ZS4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHtAY29kZSBzdGFydCA8IDAsIHN0YXJ0ID4gZW5kfSBvciB7QGNvZGUgZW5kID4gc2l6ZSgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewpAQCAtNjAyLDE3ICs1ODEsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoaXMgQXJyYXlMaXN0IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIG9iamVjdC4KLSAgICAgKgorICAgICAqIFJlcGxhY2VzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyB7QGNvZGUgQXJyYXlMaXN0fQorICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCBhdCB0aGUgaW5kZXgKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQgYXQgdGhlIGluZGV4LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEUgc2V0KGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKQEAgLTYyNyw5ICs2MDYsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBBcnJheUxpc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBBcnJheUxpc3QKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyB7QGNvZGUgQXJyYXlMaXN0fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyB7QGNvZGUgQXJyYXlMaXN0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CkBAIC02MzcsOSArNjE3LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBBcnJheUxpc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgQXJyYXlMaXN0CisgICAgICogUmV0dXJucyBhIG5ldyBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcworICAgICAqIHtAY29kZSBBcnJheUxpc3R9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyB7QGNvZGUgQXJyYXlMaXN0fQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewpAQCAtNjUwLDE5ICs2MzIsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIEFycmF5TGlzdC4gSWYKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbGVtZW50cywgdGhlIHNwZWNpZmllZAotICAgICAqIGFycmF5IGlzIHVzZWQsIG90aGVyd2lzZSBhbiBhcnJheSBvZiB0aGUgc2FtZSB0eXBlIGlzIGNyZWF0ZWQuIElmIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheSBpcyB1c2VkIGFuZCBpcyBsYXJnZXIgdGhhbiB0aGlzIEFycmF5TGlzdCwgdGhlIGFycmF5Ci0gICAgICogZWxlbWVudCBmb2xsb3dpbmcgdGhlIGNvbGxlY3Rpb24gZWxlbWVudHMgaXMgc2V0IHRvIG51bGwuCi0gICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzCisgICAgICoge0Bjb2RlIEFycmF5TGlzdH0uIElmIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICAgICogZWxlbWVudHMsIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMgdXNlZCwgb3RoZXJ3aXNlIGFuIGFycmF5IG9mIHRoZSBzYW1lCisgICAgICogdHlwZSBpcyBjcmVhdGVkLiBJZiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIHVzZWQgYW5kIGlzIGxhcmdlciB0aGFuIHRoaXMKKyAgICAgKiB7QGNvZGUgQXJyYXlMaXN0fSwgdGhlIGFycmF5IGVsZW1lbnQgZm9sbG93aW5nIHRoZSBjb2xsZWN0aW9uIGVsZW1lbnRzCisgICAgICogaXMgc2V0IHRvIG51bGwuCisgICAgICogCiAgICAgICogQHBhcmFtIGNvbnRlbnRzCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgQXJyYXlMaXN0Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEFycmF5U3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyBBcnJheUxpc3QgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMge0Bjb2RlIEFycmF5TGlzdH0uCisgICAgICogQHRocm93cyBBcnJheVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoaXMge0Bjb2RlIEFycmF5TGlzdH0gY2Fubm90CisgICAgICogICAgICAgICAgICAgYmUgc3RvcmVkIGluIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC02ODAsOSArNjYzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2FwYWNpdHkgb2YgdGhpcyBBcnJheUxpc3QgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHNpemUuCi0gICAgICoKKyAgICAgKiBTZXRzIHRoZSBjYXBhY2l0eSBvZiB0aGlzIHtAY29kZSBBcnJheUxpc3R9IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50CisgICAgICogc2l6ZS4KKyAgICAgKiAKICAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJpbVRvU2l6ZSgpIHsKICAgICAgICAgaW50IHNpemUgPSBzaXplKCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5cy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BcnJheXMuamF2YQppbmRleCAzZmViM2QwLi5kOGFhNmVlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5cy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQXJyYXlzLmphdmEKQEAgLTIxLDkgKzIxLDkgQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKIAogLyoqCi0gKiBBcnJheXMgY29udGFpbnMgc3RhdGljIG1ldGhvZHMgd2hpY2ggb3BlcmF0ZSBvbiBhcnJheXMuCi0gKiAKLSAqIEBzaW5jZSAxLjIKKyAqIHtAY29kZSBBcnJheXN9IGNvbnRhaW5zIHN0YXRpYyBtZXRob2RzIHdoaWNoIG9wZXJhdGUgb24gYXJyYXlzLgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBcnJheXMgewogCkBAIC0xNTEsMTQgKzE1MSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0IG9uIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuIFRoZSBzaXplIG9mIHRoZQotICAgICAqIExpc3QgY2Fubm90IGJlIG1vZGlmaWVkLCBpLmUuIGFkZGluZyBhbmQgcmVtb3ZpbmcgYXJlIHVuc3VwcG9ydGVkLCBidXQKKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIExpc3R9IG9mIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuIFRoZSBzaXplIG9mIHRoZQorICAgICAqIHtAY29kZSBMaXN0fSBjYW5ub3QgYmUgbW9kaWZpZWQsIGkuZS4gYWRkaW5nIGFuZCByZW1vdmluZyBhcmUgdW5zdXBwb3J0ZWQsIGJ1dAogICAgICAqIHRoZSBlbGVtZW50cyBjYW4gYmUgc2V0LiBTZXR0aW5nIGFuIGVsZW1lbnQgbW9kaWZpZXMgdGhlIHVuZGVybHlpbmcKICAgICAgKiBhcnJheS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheQotICAgICAqIEByZXR1cm4gYSBMaXN0IG9uIHRoZSBzcGVjaWZpZWQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIExpc3R9IG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gYXNMaXN0KFQuLi4gYXJyYXkpIHsKICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8VD4oYXJyYXkpOwpAQCAtMTY2LDE0ICsxNjcsMTcgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzb3J0ZWQgYXJyYXkuCisgICAgICogYXNjZW5kaW5nIHNvcnRlZCBhcnJheS4gU2VhcmNoaW5nIGluIGFuIHVuc29ydGVkIGFycmF5IGhhcyBhbiB1bmRlZmluZWQKKyAgICAgKiByZXN1bHQuIEl0J3MgYWxzbyB1bmRlZmluZWQgd2hpY2ggZWxlbWVudCBpcyBmb3VuZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgKiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBieXRlIGFycmF5IHRvIHNlYXJjaAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCB7QGNvZGUgYnl0ZX0gYXJyYXkgdG8gc2VhcmNoLgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgZWxlbWVudCB0byBmaW5kCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IGVsZW1lbnQgdG8gZmluZC4KICAgICAgKiBAcmV0dXJuIHRoZSBub24tbmVnYXRpdmUgaW5kZXggb2YgdGhlIGVsZW1lbnQsIG9yIGEgbmVnYXRpdmUgaW5kZXggd2hpY2gKLSAgICAgKiAgICAgICAgIGlzIHRoZSAtaW5kZXggLSAxIHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkCisgICAgICogICAgICAgICBpcyB7QGNvZGUgLWluZGV4IC0gMX0gd2hlcmUgdGhlIGVsZW1lbnQgd291bGQgYmUgaW5zZXJ0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKGJ5dGVbXSBhcnJheSwgYnl0ZSB2YWx1ZSkgewogICAgICAgICBpbnQgbG93ID0gMCwgbWlkID0gLTEsIGhpZ2ggPSBhcnJheS5sZW5ndGggLSAxOwpAQCAtMTk2LDE0ICsyMDAsMTcgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzb3J0ZWQgYXJyYXkuCisgICAgICogYXNjZW5kaW5nIHNvcnRlZCBhcnJheS4gU2VhcmNoaW5nIGluIGFuIHVuc29ydGVkIGFycmF5IGhhcyBhbiB1bmRlZmluZWQKKyAgICAgKiByZXN1bHQuIEl0J3MgYWxzbyB1bmRlZmluZWQgd2hpY2ggZWxlbWVudCBpcyBmb3VuZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgKiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBjaGFyIGFycmF5IHRvIHNlYXJjaAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCB7QGNvZGUgY2hhcn0gYXJyYXkgdG8gc2VhcmNoLgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgZWxlbWVudCB0byBmaW5kCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGNoYXJ9IGVsZW1lbnQgdG8gZmluZC4KICAgICAgKiBAcmV0dXJuIHRoZSBub24tbmVnYXRpdmUgaW5kZXggb2YgdGhlIGVsZW1lbnQsIG9yIGEgbmVnYXRpdmUgaW5kZXggd2hpY2gKLSAgICAgKiAgICAgICAgIGlzIHRoZSAtaW5kZXggLSAxIHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkCisgICAgICogICAgICAgICBpcyB7QGNvZGUgLWluZGV4IC0gMX0gd2hlcmUgdGhlIGVsZW1lbnQgd291bGQgYmUgaW5zZXJ0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewogICAgICAgICBpbnQgbG93ID0gMCwgbWlkID0gLTEsIGhpZ2ggPSBhcnJheS5sZW5ndGggLSAxOwpAQCAtMjI1LDE0ICsyMzIsMTcgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzb3J0ZWQgYXJyYXkuCisgICAgICogYXNjZW5kaW5nIHNvcnRlZCBhcnJheS4gU2VhcmNoaW5nIGluIGFuIHVuc29ydGVkIGFycmF5IGhhcyBhbiB1bmRlZmluZWQKKyAgICAgKiByZXN1bHQuIEl0J3MgYWxzbyB1bmRlZmluZWQgd2hpY2ggZWxlbWVudCBpcyBmb3VuZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgKiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBkb3VibGUgYXJyYXkgdG8gc2VhcmNoCisgICAgICogICAgICAgICAgICB0aGUgc29ydGVkIHtAY29kZSBkb3VibGV9IGFycmF5IHRvIHNlYXJjaC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgZWxlbWVudCB0byBmaW5kCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGRvdWJsZX0gZWxlbWVudCB0byBmaW5kLgogICAgICAqIEByZXR1cm4gdGhlIG5vbi1uZWdhdGl2ZSBpbmRleCBvZiB0aGUgZWxlbWVudCwgb3IgYSBuZWdhdGl2ZSBpbmRleCB3aGljaAotICAgICAqICAgICAgICAgaXMgdGhlIC1pbmRleCAtIDEgd2hlcmUgdGhlIGVsZW1lbnQgd291bGQgYmUgaW5zZXJ0ZWQKKyAgICAgKiAgICAgICAgIGlzIHtAY29kZSAtaW5kZXggLSAxfSB3aGVyZSB0aGUgZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBiaW5hcnlTZWFyY2goZG91YmxlW10gYXJyYXksIGRvdWJsZSB2YWx1ZSkgewogICAgICAgICBsb25nIGxvbmdCaXRzID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModmFsdWUpOwpAQCAtMjU1LDE0ICsyNjUsMTcgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzb3J0ZWQgYXJyYXkuCisgICAgICogYXNjZW5kaW5nIHNvcnRlZCBhcnJheS4gU2VhcmNoaW5nIGluIGFuIHVuc29ydGVkIGFycmF5IGhhcyBhbiB1bmRlZmluZWQKKyAgICAgKiByZXN1bHQuIEl0J3MgYWxzbyB1bmRlZmluZWQgd2hpY2ggZWxlbWVudCBpcyBmb3VuZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgKiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBmbG9hdCBhcnJheSB0byBzZWFyY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQge0Bjb2RlIGZsb2F0fSBhcnJheSB0byBzZWFyY2guCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgZWxlbWVudCB0byBmaW5kCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGZsb2F0fSBlbGVtZW50IHRvIGZpbmQuCiAgICAgICogQHJldHVybiB0aGUgbm9uLW5lZ2F0aXZlIGluZGV4IG9mIHRoZSBlbGVtZW50LCBvciBhIG5lZ2F0aXZlIGluZGV4IHdoaWNoCi0gICAgICogICAgICAgICBpcyB0aGUgLWluZGV4IC0gMSB3aGVyZSB0aGUgZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZAorICAgICAqICAgICAgICAgaXMge0Bjb2RlIC1pbmRleCAtIDF9IHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChmbG9hdFtdIGFycmF5LCBmbG9hdCB2YWx1ZSkgewogICAgICAgICBpbnQgaW50Qml0cyA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKHZhbHVlKTsKQEAgLTI4NSwxNCArMjk4LDE3IEBACiAKICAgICAvKioKICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogc29ydGVkIGFycmF5LgorICAgICAqIGFzY2VuZGluZyBzb3J0ZWQgYXJyYXkuIFNlYXJjaGluZyBpbiBhbiB1bnNvcnRlZCBhcnJheSBoYXMgYW4gdW5kZWZpbmVkCisgICAgICogcmVzdWx0LiBJdCdzIGFsc28gdW5kZWZpbmVkIHdoaWNoIGVsZW1lbnQgaXMgZm91bmQgaWYgdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICogb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgaW50IGFycmF5IHRvIHNlYXJjaAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCB7QGNvZGUgaW50fSBhcnJheSB0byBzZWFyY2guCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaW50IGVsZW1lbnQgdG8gZmluZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBpbnR9IGVsZW1lbnQgdG8gZmluZC4KICAgICAgKiBAcmV0dXJuIHRoZSBub24tbmVnYXRpdmUgaW5kZXggb2YgdGhlIGVsZW1lbnQsIG9yIGEgbmVnYXRpdmUgaW5kZXggd2hpY2gKLSAgICAgKiAgICAgICAgIGlzIHRoZSAtaW5kZXggLSAxIHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkCisgICAgICogICAgICAgICBpcyB7QGNvZGUgLWluZGV4IC0gMX0gd2hlcmUgdGhlIGVsZW1lbnQgd291bGQgYmUgaW5zZXJ0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKICAgICAgICAgaW50IGxvdyA9IDAsIG1pZCA9IC0xLCBoaWdoID0gYXJyYXkubGVuZ3RoIC0gMTsKQEAgLTMxNCwxNCArMzMwLDE3IEBACiAKICAgICAvKioKICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogc29ydGVkIGFycmF5LgorICAgICAqIGFzY2VuZGluZyBzb3J0ZWQgYXJyYXkuIFNlYXJjaGluZyBpbiBhbiB1bnNvcnRlZCBhcnJheSBoYXMgYW4gdW5kZWZpbmVkCisgICAgICogcmVzdWx0LiBJdCdzIGFsc28gdW5kZWZpbmVkIHdoaWNoIGVsZW1lbnQgaXMgZm91bmQgaWYgdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICogb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgbG9uZyBhcnJheSB0byBzZWFyY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQge0Bjb2RlIGxvbmd9IGFycmF5IHRvIHNlYXJjaC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIGVsZW1lbnQgdG8gZmluZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBsb25nfSBlbGVtZW50IHRvIGZpbmQuCiAgICAgICogQHJldHVybiB0aGUgbm9uLW5lZ2F0aXZlIGluZGV4IG9mIHRoZSBlbGVtZW50LCBvciBhIG5lZ2F0aXZlIGluZGV4IHdoaWNoCi0gICAgICogICAgICAgICBpcyB0aGUgLWluZGV4IC0gMSB3aGVyZSB0aGUgZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZAorICAgICAqICAgICAgICAgaXMge0Bjb2RlIC1pbmRleCAtIDF9IHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChsb25nW10gYXJyYXksIGxvbmcgdmFsdWUpIHsKICAgICAgICAgaW50IGxvdyA9IDAsIG1pZCA9IC0xLCBoaWdoID0gYXJyYXkubGVuZ3RoIC0gMTsKQEAgLTM0MywxOSArMzYyLDIwIEBACiAKICAgICAvKioKICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogc29ydGVkIGFycmF5LgorICAgICAqIGFzY2VuZGluZyBzb3J0ZWQgYXJyYXkuIFNlYXJjaGluZyBpbiBhbiB1bnNvcnRlZCBhcnJheSBoYXMgYW4gdW5kZWZpbmVkCisgICAgICogcmVzdWx0LiBJdCdzIGFsc28gdW5kZWZpbmVkIHdoaWNoIGVsZW1lbnQgaXMgZm91bmQgaWYgdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICogb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgT2JqZWN0IGFycmF5IHRvIHNlYXJjaAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCB7QGNvZGUgT2JqZWN0fSBhcnJheSB0byBzZWFyY2guCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBlbGVtZW50IHRvIGZpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSBlbGVtZW50IHRvIGZpbmQuCiAgICAgICogQHJldHVybiB0aGUgbm9uLW5lZ2F0aXZlIGluZGV4IG9mIHRoZSBlbGVtZW50LCBvciBhIG5lZ2F0aXZlIGluZGV4IHdoaWNoCi0gICAgICogICAgICAgICBpcyB0aGUgLWluZGV4IC0gMSB3aGVyZSB0aGUgZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZAotICAgICAqIAorICAgICAqICAgICAgICAgaXMge0Bjb2RlIC1pbmRleCAtIDF9IHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkLgogICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBlbGVtZW50IGluIHRoZSBhcnJheSBvciB0aGUgc2VhcmNoIGVsZW1lbnQgZG9lcwotICAgICAqICAgICAgICAgICAgICAgIG5vdCBpbXBsZW1lbnQgQ29tcGFyYWJsZSwgb3IgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2gKLSAgICAgKiAgICAgICAgICAgICAgICBvdGhlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5IG9yIHRoZSBzZWFyY2ggZWxlbWVudCBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgICAgIGltcGxlbWVudCB7QGNvZGUgQ29tcGFyYWJsZX0sIG9yIGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoIG90aGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChPYmplY3RbXSBhcnJheSwgT2JqZWN0IG9iamVjdCkgewpAQCAtMzc5LDIwICszOTksMjMgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzb3J0ZWQgYXJyYXkgdXNpbmcgdGhlIENvbXBhcmF0b3IgdG8gY29tcGFyZSBlbGVtZW50cy4KKyAgICAgKiBhc2NlbmRpbmcgc29ydGVkIGFycmF5IHVzaW5nIHRoZSB7QGNvZGUgQ29tcGFyYXRvcn0gdG8gY29tcGFyZSBlbGVtZW50cy4KKyAgICAgKiBTZWFyY2hpbmcgaW4gYW4gdW5zb3J0ZWQgYXJyYXkgaGFzIGFuIHVuZGVmaW5lZCByZXN1bHQuIEl0J3MgYWxzbworICAgICAqIHVuZGVmaW5lZCB3aGljaCBlbGVtZW50IGlzIGZvdW5kIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUKKyAgICAgKiBzYW1lIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgc29ydGVkIGNoYXIgYXJyYXkgdG8gc2VhcmNoCisgICAgICogICAgICAgICAgICB0aGUgc29ydGVkIGFycmF5IHRvIHNlYXJjaAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGVsZW1lbnQgdG8gZmluZAorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gZmluZAogICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgQ29tcGFyYXRvcgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDb21wYXJhdG9yfSBzdWVkIHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgogICAgICAqIEByZXR1cm4gdGhlIG5vbi1uZWdhdGl2ZSBpbmRleCBvZiB0aGUgZWxlbWVudCwgb3IgYSBuZWdhdGl2ZSBpbmRleCB3aGljaAotICAgICAqICAgICAgICAgaXMgdGhlIC1pbmRleCAtIDEgd2hlcmUgdGhlIGVsZW1lbnQgd291bGQgYmUgaW5zZXJ0ZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgIGlzIHtAY29kZSAtaW5kZXggLSAxfSB3aGVyZSB0aGUgZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZC4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gZWxlbWVudCBpbiB0aGUgYXJyYXkgYW5kIHRoZSBzZWFyY2ggZWxlbWVudCBjYW5ub3QKLSAgICAgKiAgICAgICAgICAgICAgICBiZSBjb21wYXJlZCB0byBlYWNoIG90aGVyIHVzaW5nIHRoZSBDb21wYXJhdG9yCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZWxlbWVudCBpbiB0aGUgYXJyYXkgY2Fubm90IGJlIGNvbXBhcmVkIHRvIHRoZSBzZWFyY2ggZWxlbWVudCAKKyAgICAgKiAgICAgICAgICAgICAgICB1c2luZyB0aGUge0Bjb2RlIENvbXBhcmF0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IGludCBiaW5hcnlTZWFyY2goVFtdIGFycmF5LCBUIG9iamVjdCwKICAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CkBAIC00MTYsMTQgKzQzOSwxNyBAQAogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZAotICAgICAqIHNvcnRlZCBhcnJheS4KKyAgICAgKiBhc2NlbmRpbmcgc29ydGVkIGFycmF5LiBTZWFyY2hpbmcgaW4gYW4gdW5zb3J0ZWQgYXJyYXkgaGFzIGFuIHVuZGVmaW5lZAorICAgICAqIHJlc3VsdC4gSXQncyBhbHNvIHVuZGVmaW5lZCB3aGljaCBlbGVtZW50IGlzIGZvdW5kIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQorICAgICAqIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgc29ydGVkIHNob3J0IGFycmF5IHRvIHNlYXJjaAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCB7QGNvZGUgc2hvcnR9IGFycmF5IHRvIHNlYXJjaC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCBlbGVtZW50IHRvIGZpbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgc2hvcnR9IGVsZW1lbnQgdG8gZmluZC4KICAgICAgKiBAcmV0dXJuIHRoZSBub24tbmVnYXRpdmUgaW5kZXggb2YgdGhlIGVsZW1lbnQsIG9yIGEgbmVnYXRpdmUgaW5kZXggd2hpY2gKLSAgICAgKiAgICAgICAgIGlzIHRoZSAtaW5kZXggLSAxIHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkCisgICAgICogICAgICAgICBpcyB7QGNvZGUgLWluZGV4IC0gMX0gd2hlcmUgdGhlIGVsZW1lbnQgd291bGQgYmUgaW5zZXJ0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKHNob3J0W10gYXJyYXksIHNob3J0IHZhbHVlKSB7CiAgICAgICAgIGludCBsb3cgPSAwLCBtaWQgPSAtMSwgaGlnaCA9IGFycmF5Lmxlbmd0aCAtIDE7CkBAIC00NDcsOSArNDczLDEwIEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChieXRlW10gYXJyYXksIGJ5dGUgdmFsdWUpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewpAQCAtNDYxLDE5ICs0ODgsMTggQEAKICAgICAgKiBGaWxscyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBlbGVtZW50Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IGVsZW1lbnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoYnl0ZVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQsIGJ5dGUgdmFsdWUpIHsKICAgICAgICAgLy8gQ2hlY2sgZm9yIG51bGwgZmlyc3QKQEAgLTQ5Myw5ICs1MTksMTAgQEAKICAgICAgKiBGaWxscyB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IGFycmF5IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgc2hvcnR9IGFycmF5IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgc2hvcnQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBzaG9ydH0gZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChzaG9ydFtdIGFycmF5LCBzaG9ydCB2YWx1ZSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CkBAIC01MDcsMTkgKzUzNCwxOCBAQAogICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IGFycmF5IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgc2hvcnR9IGFycmF5IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBmaWxsLgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IGVsZW1lbnQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgc2hvcnR9IGVsZW1lbnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoc2hvcnRbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBzaG9ydCB2YWx1ZSkgewogICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBmaXJzdApAQCAtNTM5LDkgKzU2NSwxMCBAQAogICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGNoYXJ9IGFycmF5IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgY2hhciBlbGVtZW50CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGNoYXJ9IGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKQEAgLTU1MywxOSArNTgwLDE4IEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCByYW5nZSBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGNoYXJ9IGFycmF5IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBmaWxsLgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgZWxlbWVudAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBjaGFyfSBlbGVtZW50LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA+IGVuZDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPiBlbmR9LgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+ZW5kID4gYXJyYXkuc2l6ZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBlbmQgPiBhcnJheS5sZW5ndGh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBjaGFyIHZhbHVlKSB7CiAgICAgICAgIC8vIENoZWNrIGZvciBudWxsIGZpcnN0CkBAIC01ODUsOSArNjExLDEwIEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgYXJyYXkgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBpbnR9IGFycmF5IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaW50IGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgaW50fSBlbGVtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewpAQCAtNTk5LDE5ICs2MjYsMTggQEAKICAgICAgKiBGaWxscyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgYXJyYXkgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBpbnR9IGFycmF5IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBmaWxsLgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGludCBlbGVtZW50Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGludH0gZWxlbWVudC4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPiBlbmQ8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0ID4gZW5kfS4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmVuZCA+IGFycmF5LnNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSBvciB7QGNvZGUgZW5kID4gYXJyYXkubGVuZ3RofS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChpbnRbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgdmFsdWUpIHsKICAgICAgICAgLy8gQ2hlY2sgZm9yIG51bGwgZmlyc3QKQEAgLTYzMSw5ICs2NTcsMTAgQEAKICAgICAgKiBGaWxscyB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgYXJyYXkgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBsb25nfSBhcnJheSB0byBmaWxsLgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgZWxlbWVudAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBsb25nfSBlbGVtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGxvbmdbXSBhcnJheSwgbG9uZyB2YWx1ZSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CkBAIC02NDUsMTkgKzY3MiwxOCBAQAogICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgYXJyYXkgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBsb25nfSBhcnJheSB0byBmaWxsLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0byBmaWxsLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIGVsZW1lbnQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgbG9uZ30gZWxlbWVudC4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPiBlbmQ8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0ID4gZW5kfS4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmVuZCA+IGFycmF5LnNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSBvciB7QGNvZGUgZW5kID4gYXJyYXkubGVuZ3RofS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChsb25nW10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCwgbG9uZyB2YWx1ZSkgewogICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBmaXJzdApAQCAtNjc3LDkgKzcwMywxMCBAQAogICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBmbG9hdH0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBlbGVtZW50CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGZsb2F0fSBlbGVtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGZsb2F0W10gYXJyYXksIGZsb2F0IHZhbHVlKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKQEAgLTY5MSwxOSArNzE4LDE4IEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCByYW5nZSBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBmbG9hdH0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgZWxlbWVudAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBmbG9hdH0gZWxlbWVudC4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPiBlbmQ8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0ID4gZW5kfS4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmVuZCA+IGFycmF5LnNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSBvciB7QGNvZGUgZW5kID4gYXJyYXkubGVuZ3RofS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChmbG9hdFtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0IHZhbHVlKSB7CiAgICAgICAgIC8vIENoZWNrIGZvciBudWxsIGZpcnN0CkBAIC03MjMsOSArNzQ5LDEwIEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGRvdWJsZX0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBlbGVtZW50CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGRvdWJsZX0gZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChkb3VibGVbXSBhcnJheSwgZG91YmxlIHZhbHVlKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKQEAgLTczNywxOSArNzY0LDE4IEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCByYW5nZSBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgZG91YmxlfSBhcnJheSB0byBmaWxsLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0byBmaWxsLgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgZWxlbWVudAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBkb3VibGV9IGVsZW1lbnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoZG91YmxlW10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCwgZG91YmxlIHZhbHVlKSB7CiAgICAgICAgIC8vIENoZWNrIGZvciBudWxsIGZpcnN0CkBAIC03NjksOSArNzk1LDEwIEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIGFycmF5IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYm9vbGVhbn0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYm9vbGVhbn0gZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChib29sZWFuW10gYXJyYXksIGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewpAQCAtNzgzLDE5ICs4MTAsMTggQEAKICAgICAgKiBGaWxscyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIGFycmF5IHRvIGZpbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYm9vbGVhbn0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiBlbGVtZW50Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJvb2xlYW59IGVsZW1lbnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoYm9vbGVhbltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgLy8gQ2hlY2sgZm9yIG51bGwgZmlyc3QKQEAgLTgxNSw5ICs4NDEsMTAgQEAKICAgICAgKiBGaWxscyB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBhcnJheSB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgZWxlbWVudAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3R9IGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CkBAIC04MjksMTkgKzg1NiwxOCBAQAogICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBhcnJheSB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gYXJyYXkgdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdG8gZmlsbC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gZmlsbAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIGZpbGwuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IGVsZW1lbnQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSBlbGVtZW50LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA+IGVuZDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPiBlbmR9LgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+ZW5kID4gYXJyYXkuc2l6ZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBlbmQgPiBhcnJheS5sZW5ndGh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKE9iamVjdFtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQsIE9iamVjdCB2YWx1ZSkgewogICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBmaXJzdApAQCAtODU5LDE4ICs4ODUsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBhcnJheS4gRm9yIGFueSB0d28KLSAgICAgKiBib29sZWFuIGFycmF5cyBhIGFuZCBiLCBpZiBBcnJheXMuZXF1YWxzKGEsIGIpIHJldHVybnMgdHJ1ZSwgaXQgbWVhbnMKLSAgICAgKiB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgQXJyYXlzLmhhc2hDb2RlKGEpIGVxdWFscyBBcnJheXMuaGFzaENvZGUoYikuCi0gICAgICogCisgICAgICoge0Bjb2RlIGJvb2xlYW59IGFycmF5cyB7QGNvZGUgYX0gYW5kIHtAY29kZSBifSwgaWYgCisgICAgICoge0Bjb2RlIEFycmF5cy5lcXVhbHMoYSwgYil9IHJldHVybnMge0Bjb2RlIHRydWV9LCBpdCBtZWFucworICAgICAqIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGEpfSBlcXVhbHMge0Bjb2RlIEFycmF5cy5oYXNoQ29kZShiKX0uCisgICAgICogPHA+CiAgICAgICogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIHZhbHVlIGFzIHRoZQogICAgICAqIHtAbGluayBMaXN0I2hhc2hDb2RlKCl9fSBtZXRob2Qgd2hpY2ggaXMgaW52b2tlZCBvbiBhIHtAbGluayBMaXN0fX0KICAgICAgKiBjb250YWluaW5nIGEgc2VxdWVuY2Ugb2Yge0BsaW5rIEJvb2xlYW59fSBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIHRoZQotICAgICAqIGVsZW1lbnRzIG9mIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUgYXJyYXkgaXMgbnVsbCwgdGhlIHJldHVybgorICAgICAqIGVsZW1lbnRzIG9mIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGUgcmV0dXJuCiAgICAgICogdmFsdWUgaXMgMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoYm9vbGVhbltdIGFycmF5KSB7CiAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CkBAIC04ODYsMTkgKzkxNCwyMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5LiBGb3IgYW55IHR3bwotICAgICAqIG5vdC1udWxsIGludCBhcnJheXMgYSBhbmQgYiwgaWYgQXJyYXlzLmVxdWFscyhhLCBiKSByZXR1cm5zIHRydWUsIGl0Ci0gICAgICogbWVhbnMgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIEFycmF5cy5oYXNoQ29kZShhKSBlcXVhbHMKLSAgICAgKiBBcnJheXMuaGFzaENvZGUoYikuCi0gICAgICogCisgICAgICogbm90LW51bGwge0Bjb2RlIGludH0gYXJyYXlzIHtAY29kZSBhfSBhbmQge0Bjb2RlIGJ9LCBpZiAKKyAgICAgKiB7QGNvZGUgQXJyYXlzLmVxdWFscyhhLCBiKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGl0IG1lYW5zCisgICAgICogdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAY29kZSBBcnJheXMuaGFzaENvZGUoYSl9IGVxdWFscyB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGIpfS4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlCiAgICAgICoge0BsaW5rIExpc3QjaGFzaENvZGUoKX19IG1ldGhvZCB3aGljaCBpcyBpbnZva2VkIG9uIGEge0BsaW5rIExpc3R9fQogICAgICAqIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiB7QGxpbmsgSW50ZWdlcn19IGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlCi0gICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyBudWxsLCB0aGUgcmV0dXJuCisgICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyB7QGNvZGUgbnVsbH0sIHRoZSByZXR1cm4KICAgICAgKiB2YWx1ZSBpcyAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGZvciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlLgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3Ige0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShpbnRbXSBhcnJheSkgewogICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtOTE0LDE4ICs5NDMsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBhcnJheS4gRm9yIGFueSB0d28KLSAgICAgKiBzaG9ydCBhcnJheXMgYSBhbmQgYiwgaWYgQXJyYXlzLmVxdWFscyhhLCBiKSByZXR1cm5zIHRydWUsIGl0IG1lYW5zIHRoYXQKLSAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIEFycmF5cy5oYXNoQ29kZShhKSBlcXVhbHMgQXJyYXlzLmhhc2hDb2RlKGIpLgotICAgICAqIAorICAgICAqIHtAY29kZSBzaG9ydH0gYXJyYXlzIHtAY29kZSBhfSBhbmQge0Bjb2RlIGJ9LCBpZiAKKyAgICAgKiB7QGNvZGUgQXJyYXlzLmVxdWFscyhhLCBiKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGl0IG1lYW5zCisgICAgICogdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAY29kZSBBcnJheXMuaGFzaENvZGUoYSl9IGVxdWFscyB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGIpfS4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlCiAgICAgICoge0BsaW5rIExpc3QjaGFzaENvZGUoKX19IG1ldGhvZCB3aGljaCBpcyBpbnZva2VkIG9uIGEge0BsaW5rIExpc3R9fQogICAgICAqIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiB7QGxpbmsgU2hvcnR9fSBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIHRoZQotICAgICAqIGVsZW1lbnRzIG9mIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUgYXJyYXkgaXMgbnVsbCwgdGhlIHJldHVybgorICAgICAqIGVsZW1lbnRzIG9mIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGUgcmV0dXJuCiAgICAgICogdmFsdWUgaXMgMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoc2hvcnRbXSBhcnJheSkgewogICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtOTQxLDE4ICs5NzIsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBhcnJheS4gRm9yIGFueSB0d28KLSAgICAgKiBjaGFyIGFycmF5cyBhIGFuZCBiLCBpZiBBcnJheXMuZXF1YWxzKGEsIGIpIHJldHVybnMgdHJ1ZSwgaXQgbWVhbnMgdGhhdAotICAgICAqIHRoZSByZXR1cm4gdmFsdWUgb2YgQXJyYXlzLmhhc2hDb2RlKGEpIGVxdWFscyBBcnJheXMuaGFzaENvZGUoYikuCi0gICAgICogCisgICAgICoge0Bjb2RlIGNoYXJ9IGFycmF5cyB7QGNvZGUgYX0gYW5kIHtAY29kZSBifSwgaWYgCisgICAgICoge0Bjb2RlIEFycmF5cy5lcXVhbHMoYSwgYil9IHJldHVybnMge0Bjb2RlIHRydWV9LCBpdCBtZWFucworICAgICAqIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGEpfSBlcXVhbHMge0Bjb2RlIEFycmF5cy5oYXNoQ29kZShiKX0uCisgICAgICogPHA+CiAgICAgICogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIHZhbHVlIGFzIHRoZQogICAgICAqIHtAbGluayBMaXN0I2hhc2hDb2RlKCl9fSBtZXRob2Qgd2hpY2ggaXMgaW52b2tlZCBvbiBhIHtAbGluayBMaXN0fX0KICAgICAgKiBjb250YWluaW5nIGEgc2VxdWVuY2Ugb2Yge0BsaW5rIENoYXJhY3Rlcn19IGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlCi0gICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyBudWxsLCB0aGUgcmV0dXJuCisgICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyB7QGNvZGUgbnVsbH0sIHRoZSByZXR1cm4KICAgICAgKiB2YWx1ZSBpcyAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGZvciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlLgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3Ige0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShjaGFyW10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTk2OCwxOCArMTAwMSwyMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5LiBGb3IgYW55IHR3bwotICAgICAqIGJ5dGUgYXJyYXlzIGEgYW5kIGIsIGlmIEFycmF5cy5lcXVhbHMoYSwgYikgcmV0dXJucyB0cnVlLCBpdCBtZWFucyB0aGF0Ci0gICAgICogdGhlIHJldHVybiB2YWx1ZSBvZiBBcnJheXMuaGFzaENvZGUoYSkgZXF1YWxzIEFycmF5cy5oYXNoQ29kZShiKS4KLSAgICAgKiAKKyAgICAgKiB7QGNvZGUgYnl0ZX0gYXJyYXlzIHtAY29kZSBhfSBhbmQge0Bjb2RlIGJ9LCBpZiAKKyAgICAgKiB7QGNvZGUgQXJyYXlzLmVxdWFscyhhLCBiKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGl0IG1lYW5zCisgICAgICogdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAY29kZSBBcnJheXMuaGFzaENvZGUoYSl9IGVxdWFscyB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGIpfS4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlCiAgICAgICoge0BsaW5rIExpc3QjaGFzaENvZGUoKX19IG1ldGhvZCB3aGljaCBpcyBpbnZva2VkIG9uIGEge0BsaW5rIExpc3R9fQogICAgICAqIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiB7QGxpbmsgQnl0ZX19IGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlCi0gICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyBudWxsLCB0aGUgcmV0dXJuCisgICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyB7QGNvZGUgbnVsbH0sIHRoZSByZXR1cm4KICAgICAgKiB2YWx1ZSBpcyAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGZvciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlLgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3Ige0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShieXRlW10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTk5NSwxOCArMTAzMCwyMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5LiBGb3IgYW55IHR3bwotICAgICAqIGxvbmcgYXJyYXlzIGEgYW5kIGIsIGlmIEFycmF5cy5lcXVhbHMoYSwgYikgcmV0dXJucyB0cnVlLCBpdCBtZWFucyB0aGF0Ci0gICAgICogdGhlIHJldHVybiB2YWx1ZSBvZiBBcnJheXMuaGFzaENvZGUoYSkgZXF1YWxzIEFycmF5cy5oYXNoQ29kZShiKS4KLSAgICAgKiAKKyAgICAgKiB7QGNvZGUgbG9uZ30gYXJyYXlzIHtAY29kZSBhfSBhbmQge0Bjb2RlIGJ9LCBpZiAKKyAgICAgKiB7QGNvZGUgQXJyYXlzLmVxdWFscyhhLCBiKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGl0IG1lYW5zCisgICAgICogdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAY29kZSBBcnJheXMuaGFzaENvZGUoYSl9IGVxdWFscyB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGIpfS4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlCiAgICAgICoge0BsaW5rIExpc3QjaGFzaENvZGUoKX19IG1ldGhvZCB3aGljaCBpcyBpbnZva2VkIG9uIGEge0BsaW5rIExpc3R9fQogICAgICAqIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiB7QGxpbmsgTG9uZ319IGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlCi0gICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyBudWxsLCB0aGUgcmV0dXJuCisgICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyB7QGNvZGUgbnVsbH0sIHRoZSByZXR1cm4KICAgICAgKiB2YWx1ZSBpcyAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGZvciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlLgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3Ige0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShsb25nW10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTEwMjYsMTggKzEwNjMsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBhcnJheS4gRm9yIGFueSB0d28KLSAgICAgKiBmbG9hdCBhcnJheXMgYSBhbmQgYiwgaWYgQXJyYXlzLmVxdWFscyhhLCBiKSByZXR1cm5zIHRydWUsIGl0IG1lYW5zIHRoYXQKLSAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIEFycmF5cy5oYXNoQ29kZShhKSBlcXVhbHMgQXJyYXlzLmhhc2hDb2RlKGIpLgotICAgICAqIAorICAgICAqIHtAY29kZSBmbG9hdH0gYXJyYXlzIHtAY29kZSBhfSBhbmQge0Bjb2RlIGJ9LCBpZiAKKyAgICAgKiB7QGNvZGUgQXJyYXlzLmVxdWFscyhhLCBiKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGl0IG1lYW5zCisgICAgICogdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAY29kZSBBcnJheXMuaGFzaENvZGUoYSl9IGVxdWFscyB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGIpfS4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlCiAgICAgICoge0BsaW5rIExpc3QjaGFzaENvZGUoKX19IG1ldGhvZCB3aGljaCBpcyBpbnZva2VkIG9uIGEge0BsaW5rIExpc3R9fQogICAgICAqIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiB7QGxpbmsgRmxvYXR9fSBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIHRoZQotICAgICAqIGVsZW1lbnRzIG9mIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUgYXJyYXkgaXMgbnVsbCwgdGhlIHJldHVybgorICAgICAqIGVsZW1lbnRzIG9mIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGUgcmV0dXJuCiAgICAgICogdmFsdWUgaXMgMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoZmxvYXRbXSBhcnJheSkgewogICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtMTA1NiwxOCArMTA5NSwyMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5LiBGb3IgYW55IHR3bwotICAgICAqIGRvdWJsZSBhcnJheXMgYSBhbmQgYiwgaWYgQXJyYXlzLmVxdWFscyhhLCBiKSByZXR1cm5zIHRydWUsIGl0IG1lYW5zIHRoYXQKLSAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIEFycmF5cy5oYXNoQ29kZShhKSBlcXVhbHMgQXJyYXlzLmhhc2hDb2RlKGIpLgotICAgICAqIAorICAgICAqIHtAY29kZSBkb3VibGV9IGFycmF5cyB7QGNvZGUgYX0gYW5kIHtAY29kZSBifSwgaWYgCisgICAgICoge0Bjb2RlIEFycmF5cy5lcXVhbHMoYSwgYil9IHJldHVybnMge0Bjb2RlIHRydWV9LCBpdCBtZWFucworICAgICAqIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGEpfSBlcXVhbHMge0Bjb2RlIEFycmF5cy5oYXNoQ29kZShiKX0uCisgICAgICogPHA+CiAgICAgICogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIHZhbHVlIGFzIHRoZQogICAgICAqIHtAbGluayBMaXN0I2hhc2hDb2RlKCl9fSBtZXRob2Qgd2hpY2ggaXMgaW52b2tlZCBvbiBhIHtAbGluayBMaXN0fX0KICAgICAgKiBjb250YWluaW5nIGEgc2VxdWVuY2Ugb2Yge0BsaW5rIERvdWJsZX19IGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlCi0gICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyBudWxsLCB0aGUgcmV0dXJuCisgICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBhcnJheSBpcyB7QGNvZGUgbnVsbH0sIHRoZSByZXR1cm4KICAgICAgKiB2YWx1ZSBpcyAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGZvciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdob3NlIGhhc2ggY29kZSB0byBjb21wdXRlLgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3Ige0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShkb3VibGVbXSBhcnJheSkgewogICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtMTA5MiwxNyArMTEzMywyMCBAQAogICAgICAqIHRoZWlyIGlkZW50aXRpZXMgbm90IHRoZWlyIGNvbnRlbnRzLiBTbyBpdCBpcyBhY2NlcHRhYmxlIHRvIGludm9rZSB0aGlzCiAgICAgICogbWV0aG9kIG9uIGFuIGFycmF5IHRoYXQgY29udGFpbnMgaXRzZWxmIGFzIGFuIGVsZW1lbnQsIGVpdGhlciBkaXJlY3RseSBvcgogICAgICAqIGluZGlyZWN0bHkuCi0gICAgICogCi0gICAgICogRm9yIGFueSB0d28gYXJyYXlzIGEgYW5kIGIsIGlmIEFycmF5cy5lcXVhbHMoYSwgYikgcmV0dXJucyB0cnVlLCBpdCBtZWFucwotICAgICAqIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBvZiBBcnJheXMuaGFzaENvZGUoYSkgZXF1YWxzIEFycmF5cy5oYXNoQ29kZShiKS4KLSAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgYW55IHR3byBhcnJheXMge0Bjb2RlIGF9IGFuZCB7QGNvZGUgYn0sIGlmIAorICAgICAqIHtAY29kZSBBcnJheXMuZXF1YWxzKGEsIGIpfSByZXR1cm5zIHtAY29kZSB0cnVlfSwgaXQgbWVhbnMKKyAgICAgKiB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2Yge0Bjb2RlIEFycmF5cy5oYXNoQ29kZShhKX0gZXF1YWxzIAorICAgICAqIHtAY29kZSBBcnJheXMuaGFzaENvZGUoYil9LgorICAgICAqIDxwPgogICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgbWV0aG9kCi0gICAgICogQXJyYXlzLmFzTGlzdChhcnJheSkuaGFzaENvZGUoKS4gSWYgdGhlIGFycmF5IGlzIG51bGwsIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiBBcnJheXMuYXNMaXN0KGFycmF5KS5oYXNoQ29kZSgpLiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGUgcmV0dXJuIHZhbHVlCiAgICAgICogaXMgMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoT2JqZWN0W10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTExMjUsMzAgKzExNjksMzAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGJhc2VkIG9uIHRoZSAiZGVlcCBjb250ZW50cyIgb2YgdGhlIGdpdmVuIGFycmF5LiBJZgogICAgICAqIHRoZSBhcnJheSBjb250YWlucyBvdGhlciBhcnJheXMgYXMgaXRzIGVsZW1lbnRzLCB0aGUgaGFzaCBjb2RlIGlzIGJhc2VkCi0gICAgICogb24gdGhlaXIgY29udGVudHMgbm90IHRoZWlyIGlkZW50aXRpZXMuIFNvIEl0IGlzIG5vdCBhY2NlcHRhYmxlIHRvIGludm9rZQorICAgICAqIG9uIHRoZWlyIGNvbnRlbnRzIG5vdCB0aGVpciBpZGVudGl0aWVzLiBTbyBpdCBpcyBub3QgYWNjZXB0YWJsZSB0byBpbnZva2UKICAgICAgKiB0aGlzIG1ldGhvZCBvbiBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGl0c2VsZiBhcyBhbiBlbGVtZW50LCBlaXRoZXIKICAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotICAgICAqIAotICAgICAqIEZvciBhbnkgdHdvIGFycmF5cyBhIGFuZCBiLCBpZiBBcnJheXMuZGVlcEVxdWFscyhhLCBiKSByZXR1cm5zIHRydWUsIGl0Ci0gICAgICogbWVhbnMgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIEFycmF5cy5kZWVwSGFzaENvZGUoYSkgZXF1YWxzCi0gICAgICogQXJyYXlzLmRlZXBIYXNoQ29kZShiKS4KLSAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgYW55IHR3byBhcnJheXMge0Bjb2RlIGF9IGFuZCB7QGNvZGUgYn0sIGlmIAorICAgICAqIHtAY29kZSBBcnJheXMuZGVlcEVxdWFscyhhLCBiKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGl0CisgICAgICogbWVhbnMgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAY29kZSBBcnJheXMuZGVlcEhhc2hDb2RlKGEpfSBlcXVhbHMKKyAgICAgKiB7QGNvZGUgQXJyYXlzLmRlZXBIYXNoQ29kZShiKX0uCisgICAgICogPHA+CiAgICAgICogVGhlIGNvbXB1dGF0aW9uIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHRoYXQKLSAgICAgKiBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rIExpc3QjaGFzaENvZGUoKX19IG1ldGhvZCBpbnZva2VkIG9uIGEKKyAgICAgKiBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rIExpc3QjaGFzaENvZGUoKX19IGludm9rZWQgb24gYQogICAgICAqIHtAbGluayBMaXN0fX0gY29udGFpbmluZyBhIHNlcXVlbmNlIG9mIGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlCiAgICAgICogZWxlbWVudHMgb2YgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIuIFRoZSBkaWZmZXJlbmNlIGlzOiBJZiBhbiBlbGVtZW50IGUKICAgICAgKiBvZiBhcnJheSBpcyBpdHNlbGYgYW4gYXJyYXksIGl0cyBoYXNoIGNvZGUgaXMgY29tcHV0ZWQgYnkgY2FsbGluZyB0aGUKLSAgICAgKiBhcHByb3ByaWF0ZSBvdmVybG9hZGluZyBvZiBBcnJheXMuaGFzaENvZGUoZSkgaWYgZSBpcyBhbiBhcnJheSBvZiBhCi0gICAgICogcHJpbWl0aXZlIHR5cGUsIG9yIGJ5IGNhbGxpbmcgQXJyYXlzLmRlZXBIYXNoQ29kZShlKSByZWN1cnNpdmVseSBpZiBlIGlzCi0gICAgICogYW4gYXJyYXkgb2YgYSByZWZlcmVuY2UgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG1ldGhvZAotICAgICAqIEFycmF5cy5hc0xpc3QoYXJyYXkpLmhhc2hDb2RlKCkuIElmIHRoZSBhcnJheSBpcyBudWxsLCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICogaXMgMC4KKyAgICAgKiBhcHByb3ByaWF0ZSBvdmVybG9hZGluZyBvZiB7QGNvZGUgQXJyYXlzLmhhc2hDb2RlKGUpfSBpZiBlIGlzIGFuIGFycmF5IG9mIGEKKyAgICAgKiBwcmltaXRpdmUgdHlwZSwgb3IgYnkgY2FsbGluZyB7QGNvZGUgQXJyYXlzLmRlZXBIYXNoQ29kZShlKX0gcmVjdXJzaXZlbHkgaWYgZSBpcworICAgICAqIGFuIGFycmF5IG9mIGEgcmVmZXJlbmNlIHR5cGUuIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyB0aGUKKyAgICAgKiBzYW1lIHZhbHVlIGFzIHRoZSBtZXRob2Qge0Bjb2RlIEFycmF5cy5hc0xpc3QoYXJyYXkpLmhhc2hDb2RlKCl9LiBJZiB0aGUgYXJyYXkgaXMKKyAgICAgKiB7QGNvZGUgbnVsbH0sIHRoZSByZXR1cm4gdmFsdWUgaXMgMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aG9zZSBoYXNoIGNvZGUgdG8gY29tcHV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZGVlcEhhc2hDb2RlKE9iamVjdFtdIGFycmF5KSB7CiAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CkBAIC0xMjA4LDExICsxMjUyLDEzIEBACiAgICAgICogQ29tcGFyZXMgdGhlIHR3byBhcnJheXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5MQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGJ5dGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCB7QGNvZGUgYnl0ZX0gYXJyYXkuCiAgICAgICogQHBhcmFtIGFycmF5MgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBieXRlIGFycmF5Ci0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGFycmF5cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzIGF0Ci0gICAgICogICAgICAgICBlYWNoIGluZGV4IGluIHRoZSB0d28gYXJyYXlzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHtAY29kZSBieXRlfSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIGFycmF5cyBhcmUge0Bjb2RlIG51bGx9IG9yIGlmIHRoZSBhcnJheXMgaGF2ZSB0aGUKKyAgICAgKiAgICAgICAgIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQgZWFjaCBpbmRleCBpbiB0aGUgdHdvIGFycmF5cyBhcmUKKyAgICAgKiAgICAgICAgIGVxdWFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGJ5dGVbXSBhcnJheTEsIGJ5dGVbXSBhcnJheTIpIHsKICAgICAgICAgaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKQEAgLTEyMzMsMTEgKzEyNzksMTMgQEAKICAgICAgKiBDb21wYXJlcyB0aGUgdHdvIGFycmF5cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3Qgc2hvcnQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCB7QGNvZGUgc2hvcnR9IGFycmF5LgogICAgICAqIEBwYXJhbSBhcnJheTIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2hvcnQgYXJyYXkKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgYXJyYXlzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQKLSAgICAgKiAgICAgICAgIGVhY2ggaW5kZXggaW4gdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQge0Bjb2RlIHNob3J0fSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIGFycmF5cyBhcmUge0Bjb2RlIG51bGx9IG9yIGlmIHRoZSBhcnJheXMgaGF2ZSB0aGUKKyAgICAgKiAgICAgICAgIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQgZWFjaCBpbmRleCBpbiB0aGUgdHdvIGFycmF5cyBhcmUKKyAgICAgKiAgICAgICAgIGVxdWFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKHNob3J0W10gYXJyYXkxLCBzaG9ydFtdIGFycmF5MikgewogICAgICAgICBpZiAoYXJyYXkxID09IGFycmF5MikgewpAQCAtMTI1OCwxMSArMTMwNiwxMyBAQAogICAgICAqIENvbXBhcmVzIHRoZSB0d28gYXJyYXlzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qge0Bjb2RlIGNoYXJ9IGFycmF5LgogICAgICAqIEBwYXJhbSBhcnJheTIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY2hhciBhcnJheQotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBhcnJheXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYW5kIHRoZSBlbGVtZW50cyBhdAotICAgICAqICAgICAgICAgZWFjaCBpbmRleCBpbiB0aGUgdHdvIGFycmF5cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCB7QGNvZGUgY2hhcn0gYXJyYXkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYm90aCBhcnJheXMgYXJlIHtAY29kZSBudWxsfSBvciBpZiB0aGUgYXJyYXlzIGhhdmUgdGhlCisgICAgICogICAgICAgICBzYW1lIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzIGF0IGVhY2ggaW5kZXggaW4gdGhlIHR3byBhcnJheXMgYXJlCisgICAgICogICAgICAgICBlcXVhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKSB7CiAgICAgICAgIGlmIChhcnJheTEgPT0gYXJyYXkyKSB7CkBAIC0xMjgzLDExICsxMzMzLDEzIEBACiAgICAgICogQ29tcGFyZXMgdGhlIHR3byBhcnJheXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5MQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGludCBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHtAY29kZSBpbnR9IGFycmF5LgogICAgICAqIEBwYXJhbSBhcnJheTIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaW50IGFycmF5Ci0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGFycmF5cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzIGF0Ci0gICAgICogICAgICAgICBlYWNoIGluZGV4IGluIHRoZSB0d28gYXJyYXlzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHtAY29kZSBpbnR9IGFycmF5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJvdGggYXJyYXlzIGFyZSB7QGNvZGUgbnVsbH0gb3IgaWYgdGhlIGFycmF5cyBoYXZlIHRoZQorICAgICAqICAgICAgICAgc2FtZSBsZW5ndGggYW5kIHRoZSBlbGVtZW50cyBhdCBlYWNoIGluZGV4IGluIHRoZSB0d28gYXJyYXlzIGFyZQorICAgICAqICAgICAgICAgZXF1YWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpIHsKICAgICAgICAgaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKQEAgLTEzMDgsMTEgKzEzNjAsMTMgQEAKICAgICAgKiBDb21wYXJlcyB0aGUgdHdvIGFycmF5cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgbG9uZyBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHtAY29kZSBsb25nfSBhcnJheS4KICAgICAgKiBAcGFyYW0gYXJyYXkyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGxvbmcgYXJyYXkKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgYXJyYXlzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQKLSAgICAgKiAgICAgICAgIGVhY2ggaW5kZXggaW4gdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQge0Bjb2RlIGxvbmd9IGFycmF5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJvdGggYXJyYXlzIGFyZSB7QGNvZGUgbnVsbH0gb3IgaWYgdGhlIGFycmF5cyBoYXZlIHRoZQorICAgICAqICAgICAgICAgc2FtZSBsZW5ndGggYW5kIHRoZSBlbGVtZW50cyBhdCBlYWNoIGluZGV4IGluIHRoZSB0d28gYXJyYXlzIGFyZQorICAgICAqICAgICAgICAgZXF1YWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMobG9uZ1tdIGFycmF5MSwgbG9uZ1tdIGFycmF5MikgewogICAgICAgICBpZiAoYXJyYXkxID09IGFycmF5MikgewpAQCAtMTMzMSwxNiArMTM4NSwxNyBAQAogCiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhlIHR3byBhcnJheXMuIFRoZSB2YWx1ZXMgYXJlIGNvbXBhcmVkIGluIHRoZSBzYW1lIG1hbm5lciBhcwotICAgICAqIEZsb2F0LmVxdWFscygpLgorICAgICAqIHtAY29kZSBGbG9hdC5lcXVhbHMoKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5MQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGZsb2F0IGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qge0Bjb2RlIGZsb2F0fSBhcnJheS4KICAgICAgKiBAcGFyYW0gYXJyYXkyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGZsb2F0IGFycmF5Ci0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGFycmF5cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzIGF0Ci0gICAgICogICAgICAgICBlYWNoIGluZGV4IGluIHRoZSB0d28gYXJyYXlzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHtAY29kZSBmbG9hdH0gYXJyYXkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYm90aCBhcnJheXMgYXJlIHtAY29kZSBudWxsfSBvciBpZiB0aGUgYXJyYXlzIGhhdmUgdGhlCisgICAgICogICAgICAgICBzYW1lIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzIGF0IGVhY2ggaW5kZXggaW4gdGhlIHR3byBhcnJheXMgYXJlCisgICAgICogICAgICAgICBlcXVhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSBGbG9hdCNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoZmxvYXRbXSBhcnJheTEsIGZsb2F0W10gYXJyYXkyKSB7CiAgICAgICAgIGlmIChhcnJheTEgPT0gYXJyYXkyKSB7CkBAIC0xMzYwLDE2ICsxNDE1LDE3IEBACiAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGUgdHdvIGFycmF5cy4gVGhlIHZhbHVlcyBhcmUgY29tcGFyZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzCi0gICAgICogRG91YmxlLmVxdWFscygpLgorICAgICAqIHtAY29kZSBEb3VibGUuZXF1YWxzKCl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBkb3VibGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCB7QGNvZGUgZG91YmxlfSBhcnJheS4KICAgICAgKiBAcGFyYW0gYXJyYXkyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGRvdWJsZSBhcnJheQotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBhcnJheXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYW5kIHRoZSBlbGVtZW50cyBhdAotICAgICAqICAgICAgICAgZWFjaCBpbmRleCBpbiB0aGUgdHdvIGFycmF5cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCB7QGNvZGUgZG91YmxlfSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIGFycmF5cyBhcmUge0Bjb2RlIG51bGx9IG9yIGlmIHRoZSBhcnJheXMgaGF2ZSB0aGUKKyAgICAgKiAgICAgICAgIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQgZWFjaCBpbmRleCBpbiB0aGUgdHdvIGFycmF5cyBhcmUKKyAgICAgKiAgICAgICAgIGVxdWFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlIERvdWJsZSNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoZG91YmxlW10gYXJyYXkxLCBkb3VibGVbXSBhcnJheTIpIHsKICAgICAgICAgaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKQEAgLTEzOTEsMTEgKzE0NDcsMTMgQEAKICAgICAgKiBDb21wYXJlcyB0aGUgdHdvIGFycmF5cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgYm9vbGVhbiBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHtAY29kZSBib29sZWFufSBhcnJheS4KICAgICAgKiBAcGFyYW0gYXJyYXkyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGJvb2xlYW4gYXJyYXkKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgYXJyYXlzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQKLSAgICAgKiAgICAgICAgIGVhY2ggaW5kZXggaW4gdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQge0Bjb2RlIGJvb2xlYW59IGFycmF5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJvdGggYXJyYXlzIGFyZSB7QGNvZGUgbnVsbH0gb3IgaWYgdGhlIGFycmF5cyBoYXZlIHRoZQorICAgICAqICAgICAgICAgc2FtZSBsZW5ndGggYW5kIHRoZSBlbGVtZW50cyBhdCBlYWNoIGluZGV4IGluIHRoZSB0d28gYXJyYXlzIGFyZQorICAgICAqICAgICAgICAgZXF1YWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoYm9vbGVhbltdIGFycmF5MSwgYm9vbGVhbltdIGFycmF5MikgewogICAgICAgICBpZiAoYXJyYXkxID09IGFycmF5MikgewpAQCAtMTQxNiwxMSArMTQ3NCwxMyBAQAogICAgICAqIENvbXBhcmVzIHRoZSB0d28gYXJyYXlzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBPYmplY3QgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCB7QGNvZGUgT2JqZWN0fSBhcnJheS4KICAgICAgKiBAcGFyYW0gYXJyYXkyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIE9iamVjdCBhcnJheQotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBhcnJheXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYW5kIHRoZSBlbGVtZW50cyBhdAotICAgICAqICAgICAgICAgZWFjaCBpbmRleCBpbiB0aGUgdHdvIGFycmF5cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCB7QGNvZGUgT2JqZWN0fSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIGFycmF5cyBhcmUge0Bjb2RlIG51bGx9IG9yIGlmIHRoZSBhcnJheXMgaGF2ZSB0aGUKKyAgICAgKiAgICAgICAgIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQgZWFjaCBpbmRleCBpbiB0aGUgdHdvIGFycmF5cyBhcmUKKyAgICAgKiAgICAgICAgIGVxdWFsIGFjY29yZGluZyB0byB7QGNvZGUgZXF1YWxzKCl9LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7CiAgICAgICAgIGlmIChhcnJheTEgPT0gYXJyYXkyKSB7CkBAIC0xNDM5LDM5ICsxNDk5LDQxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gZ2l2ZW4gYXJyYXlzIGFyZSBkZWVwbHkgZXF1YWwgdG8gb25lIGFub3RoZXIuCi0gICAgICogVW5saWtlIHRoZSBtZXRob2QgZXF1YWxzKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSwgdGhpcyBtZXRob2QKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgdHdvIGdpdmVuIGFycmF5cyBhcmUgZGVlcGx5IGVxdWFsIHRvIG9uZSBhbm90aGVyLgorICAgICAqIFVubGlrZSB0aGUgbWV0aG9kIHtAY29kZSBlcXVhbHMoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpfSwgdGhpcyBtZXRob2QKICAgICAgKiBpcyBhcHByb3ByaWF0ZSBmb3IgdXNlIGZvciBuZXN0ZWQgYXJyYXlzIG9mIGFyYml0cmFyeSBkZXB0aC4KLSAgICAgKiAKLSAgICAgKiBUd28gYXJyYXkgcmVmZXJlbmNlcyBhcmUgY29uc2lkZXJlZCBkZWVwbHkgZXF1YWwgaWYgdGhleSBhcmUgYm90aCBudWxsLAorICAgICAqIDxwPgorICAgICAqIFR3byBhcnJheSByZWZlcmVuY2VzIGFyZSBjb25zaWRlcmVkIGRlZXBseSBlcXVhbCBpZiB0aGV5IGFyZSBib3RoIHtAY29kZSBudWxsfSwKICAgICAgKiBvciBpZiB0aGV5IHJlZmVyIHRvIGFycmF5cyB0aGF0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQKICAgICAgKiBlYWNoIGluZGV4IGluIHRoZSB0d28gYXJyYXlzIGFyZSBlcXVhbC4KLSAgICAgKiAKLSAgICAgKiBUd28gbnVsbCBlbGVtZW50cyBlbGVtZW50MSBhbmQgZWxlbWVudDIgYXJlIHBvc3NpYmx5IGRlZXBseSBlcXVhbCBpZiBhbnkKKyAgICAgKiA8cD4KKyAgICAgKiBUd28ge0Bjb2RlIG51bGx9IGVsZW1lbnRzIHtAY29kZSBlbGVtZW50MX0gYW5kIHtAY29kZSBlbGVtZW50Mn0gYXJlIHBvc3NpYmx5IGRlZXBseSBlcXVhbCBpZiBhbnkKICAgICAgKiBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgc2F0aXNmaWVkOgotICAgICAqIAotICAgICAqIGVsZW1lbnQxIGFuZCBlbGVtZW50MiBhcmUgYm90aCBhcnJheXMgb2Ygb2JqZWN0IHJlZmVyZW5jZSB0eXBlcywgYW5kCi0gICAgICogQXJyYXlzLmRlZXBFcXVhbHMoZWxlbWVudDEsIGVsZW1lbnQyKSB3b3VsZCByZXR1cm4gdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBlbGVtZW50MSBhbmQgZWxlbWVudDIgYXJlIGFycmF5cyBvZiB0aGUgc2FtZSBwcmltaXRpdmUgdHlwZSwgYW5kIHRoZQotICAgICAqIGFwcHJvcHJpYXRlIG92ZXJsb2FkaW5nIG9mIEFycmF5cy5lcXVhbHMoZWxlbWVudDEsIGVsZW1lbnQyKSB3b3VsZCByZXR1cm4KLSAgICAgKiB0cnVlLgotICAgICAqIAotICAgICAqIGVsZW1lbnQxID09IGVsZW1lbnQyCi0gICAgICogCi0gICAgICogZWxlbWVudDEuZXF1YWxzKGVsZW1lbnQyKSB3b3VsZCByZXR1cm4gdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBkZWZpbml0aW9uIHBlcm1pdHMgbnVsbCBlbGVtZW50cyBhdCBhbnkgZGVwdGguCi0gICAgICogCisgICAgICogPHA+CisgICAgICoge0Bjb2RlIGVsZW1lbnQxfSBhbmQge0Bjb2RlIGVsZW1lbnQyfSBhcmUgYm90aCBhcnJheXMgb2Ygb2JqZWN0IHJlZmVyZW5jZSB0eXBlcywgYW5kCisgICAgICoge0Bjb2RlIEFycmF5cy5kZWVwRXF1YWxzKGVsZW1lbnQxLCBlbGVtZW50Mil9IHdvdWxkIHJldHVybiB7QGNvZGUgdHJ1ZX0uCisgICAgICogPHA+CisgICAgICoge0Bjb2RlIGVsZW1lbnQxfSBhbmQge0Bjb2RlIGVsZW1lbnQyfSBhcmUgYXJyYXlzIG9mIHRoZSBzYW1lIHByaW1pdGl2ZSB0eXBlLCBhbmQgdGhlCisgICAgICogYXBwcm9wcmlhdGUgb3ZlcmxvYWRpbmcgb2Yge0Bjb2RlIEFycmF5cy5lcXVhbHMoZWxlbWVudDEsIGVsZW1lbnQyKX0gd291bGQgcmV0dXJuCisgICAgICoge0Bjb2RlIHRydWV9LgorICAgICAqIDxwPgorICAgICAqIHtAY29kZSBlbGVtZW50MSA9PSBlbGVtZW50Mn0KKyAgICAgKiA8cD4KKyAgICAgKiB7QGNvZGUgZWxlbWVudDEuZXF1YWxzKGVsZW1lbnQyKX0gd291bGQgcmV0dXJuIHtAY29kZSB0cnVlfS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBkZWZpbml0aW9uIHBlcm1pdHMge0Bjb2RlIG51bGx9IGVsZW1lbnRzIGF0IGFueSBkZXB0aC4KKyAgICAgKiA8cD4KICAgICAgKiBJZiBlaXRoZXIgb2YgdGhlIGdpdmVuIGFycmF5cyBjb250YWluIHRoZW1zZWx2ZXMgYXMgZWxlbWVudHMsIHRoZQotICAgICAqIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIGluY2VydGl0dWRlLgorICAgICAqIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHVuY2VydGFpbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgT2JqZWN0IGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qge0Bjb2RlIE9iamVjdH0gYXJyYXkuCiAgICAgICogQHBhcmFtIGFycmF5MgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBPYmplY3QgYXJyYXkKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgYXJyYXlzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgZWxlbWVudHMgYXQKLSAgICAgKiAgICAgICAgIGVhY2ggaW5kZXggaW4gdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQge0Bjb2RlIE9iamVjdH0gYXJyYXkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYm90aCBhcnJheXMgYXJlIHtAY29kZSBudWxsfSBvciBpZiB0aGUgYXJyYXlzIGhhdmUgdGhlCisgICAgICogICAgICAgICBzYW1lIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzIGF0IGVhY2ggaW5kZXggaW4gdGhlIHR3byBhcnJheXMgYXJlCisgICAgICogICAgICAgICBlcXVhbCBhY2NvcmRpbmcgdG8ge0Bjb2RlIGVxdWFscygpfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlZXBFcXVhbHMoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKICAgICAgICAgaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKQEAgLTE2MjQsMzAgKzE2ODYsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBudW1lcmljYWwgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBiZSBzb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgdG8gYmUgc29ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGJ5dGVbXSBhcnJheSkgewogICAgICAgICBzb3J0KDAsIGFycmF5Lmxlbmd0aCwgYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgdG8gYmUgc29ydGVkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IGFycmF5IHRvIGJlIHNvcnRlZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCB0byBzb3J0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gc29ydAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoYnl0ZVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTE3NDYsMzAgKzE4MDgsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBudW1lcmljYWwgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0byBiZSBzb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgY2hhcn0gYXJyYXkgdG8gYmUgc29ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGNoYXJbXSBhcnJheSkgewogICAgICAgICBzb3J0KDAsIGFycmF5Lmxlbmd0aCwgYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdG8gYmUgc29ydGVkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGNoYXJ9IGFycmF5IHRvIGJlIHNvcnRlZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCB0byBzb3J0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gc29ydAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTE4NTgsMzUgKzE5MjAsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBudW1lcmljYWwgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHRvIGJlIHNvcnRlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBkb3VibGV9IGFycmF5IHRvIGJlIHNvcnRlZC4KICAgICAgKiBAc2VlICNzb3J0KGRvdWJsZVtdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChkb3VibGVbXSBhcnJheSkgewogICAgICAgICBzb3J0KDAsIGFycmF5Lmxlbmd0aCwgYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4gVGhlIHZhbHVlcyBhcmUKLSAgICAgKiBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbXBvc2VkIGJ5IERvdWJsZS5jb21wYXJlVG8oKS4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLiBUaGUKKyAgICAgKiB2YWx1ZXMgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIGltcG9zZWQgYnkge0Bjb2RlIERvdWJsZS5jb21wYXJlVG8oKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHRvIGJlIHNvcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBkb3VibGV9IGFycmF5IHRvIGJlIHNvcnRlZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCB0byBzb3J0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gc29ydAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+Ci0gICAgICogCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCiAgICAgICogQHNlZSBEb3VibGUjY29tcGFyZVRvKERvdWJsZSkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChkb3VibGVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CkBAIC0xOTc1LDM1ICsyMDM1LDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBhcnJheSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBhcnJheSBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IHRvIGJlIHNvcnRlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBmbG9hdH0gYXJyYXkgdG8gYmUgc29ydGVkLgogICAgICAqIEBzZWUgI3NvcnQoZmxvYXRbXSwgaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoZmxvYXRbXSBhcnJheSkgewogICAgICAgICBzb3J0KDAsIGFycmF5Lmxlbmd0aCwgYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4gVGhlIHZhbHVlcyBhcmUKLSAgICAgKiBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbXBvc2VkIGJ5IEZsb2F0LmNvbXBhcmVUbygpLgorICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBudW1lcmljYWwgb3JkZXIuIFRoZQorICAgICAqIHZhbHVlcyBhcmUgc29ydGVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIgaW1wb3NlZCBieSB7QGNvZGUgRmxvYXQuY29tcGFyZVRvKCl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IHRvIGJlIHNvcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBmbG9hdH0gYXJyYXkgdG8gYmUgc29ydGVkLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IHRvIHNvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCB0byBzb3J0LgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBzb3J0Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gc29ydC4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPiBlbmQ8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0ID4gZW5kfS4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RhcnQgPCAwPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmVuZCA+IGFycmF5LnNpemUoKTwvY29kZT4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPCAwfSBvciB7QGNvZGUgZW5kID4gYXJyYXkubGVuZ3RofS4KICAgICAgKiBAc2VlIEZsb2F0I2NvbXBhcmVUbyhGbG9hdCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChmbG9hdFtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTIwOTIsMzAgKzIxNTAsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBudW1lcmljYWwgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgaW50IGFycmF5IHRvIGJlIHNvcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBpbnR9IGFycmF5IHRvIGJlIHNvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChpbnRbXSBhcnJheSkgewogICAgICAgICBzb3J0KDAsIGFycmF5Lmxlbmd0aCwgYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGludCBhcnJheSB0byBiZSBzb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgaW50fSBhcnJheSB0byBiZSBzb3J0ZWQuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IHRvIHNvcnQuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBzb3J0LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA+IGVuZDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPiBlbmR9LgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+ZW5kID4gYXJyYXkuc2l6ZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBlbmQgPiBhcnJheS5sZW5ndGh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGludFtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTIyMDQsMzAgKzIyNjIsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBudW1lcmljYWwgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgbG9uZyBhcnJheSB0byBiZSBzb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgbG9uZ30gYXJyYXkgdG8gYmUgc29ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGxvbmdbXSBhcnJheSkgewogICAgICAgICBzb3J0KDAsIGFycmF5Lmxlbmd0aCwgYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgYXJyYXkgdG8gYmUgc29ydGVkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGxvbmd9IGFycmF5IHRvIGJlIHNvcnRlZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCB0byBzb3J0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gc29ydAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQobG9uZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTIzMTYsMzcgKzIzNzQsNDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIGFycmF5IGluIGFzY2VuZGluZyBuYXR1cmFsIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBhcnJheSB0byBiZSBzb3J0ZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSBhcnJheSB0byBiZSBzb3J0ZWQuCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5IGRvZXMgbm90IGltcGxlbWVudCBDb21wYXJhYmxlCi0gICAgICogICAgICAgICAgICAgICAgb3IgZWxlbWVudHMgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlbGVtZW50IGluIHRoZSBhcnJheSBkb2VzIG5vdCBpbXBsZW1lbnQge0Bjb2RlIENvbXBhcmFibGV9CisgICAgICogICAgICAgICAgICAgICAgb3IgaWYgc29tZSBlbGVtZW50cyBjYW5ub3QgYmUgY29tcGFyZWQgdG8gZWFjaCBvdGhlci4KKyAgICAgKiBAc2VlICNzb3J0KE9iamVjdFtdLCBpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChPYmplY3RbXSBhcnJheSkgewogICAgICAgICBzb3J0KDAsIGFycmF5Lmxlbmd0aCwgYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgbmF0dXJhbCBvcmRlci4gQWxsCisgICAgICogZWxlbWVudHMgbXVzdCBpbXBsZW1lbnQgdGhlIHtAY29kZSBDb21wYXJhYmxlfSBpbnRlcmZhY2UgYW5kIG11c3QgYmUKKyAgICAgKiBjb21wYXJhYmxlIHRvIGVhY2ggb3RoZXIgd2l0aG91dCBhIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259IGJlaW5nCisgICAgICogdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBhcnJheSB0byBiZSBzb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSBhcnJheSB0byBiZSBzb3J0ZWQuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IHRvIHNvcnQuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBzb3J0LgogICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBlbGVtZW50IGluIHRoZSBhcnJheSBkb2VzIG5vdCBpbXBsZW1lbnQgQ29tcGFyYWJsZQotICAgICAqICAgICAgICAgICAgICAgIG9yIGVsZW1lbnRzIGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoIG90aGVyCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZWxlbWVudCBpbiB0aGUgYXJyYXkgZG9lcyBub3QgaW1wbGVtZW50IHtAY29kZSBDb21wYXJhYmxlfQorICAgICAqICAgICAgICAgICAgICAgIG9yIHNvbWUgZWxlbWVudHMgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoT2JqZWN0W10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtMjM4NywxNSArMjQ0OCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIHNwZWNpZmllZCBhcnJheSBvZiBvYmplY3RzLiBUaGUgcmFuZ2UgdG8KLSAgICAgKiBiZSBzb3J0ZWQgZXh0ZW5kcyBmcm9tIGluZGV4IGZyb21JbmRleCwgaW5jbHVzaXZlLCB0byBpbmRleCB0b0luZGV4LAotICAgICAqIGV4Y2x1c2l2ZS4gKElmIGZyb21JbmRleD09dG9JbmRleCwgdGhlIHJhbmdlIHRvIGJlIHNvcnRlZCBpcyBlbXB0eS4pIFRoaXMKKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2Yge0Bjb2RlIE9iamVjdHN9LiBUaGUgcmFuZ2UgdG8KKyAgICAgKiBiZSBzb3J0ZWQgZXh0ZW5kcyBmcm9tIGluZGV4IHtAY29kZSBmcm9tSW5kZXh9LCBpbmNsdXNpdmUsIHRvIGluZGV4IHtAY29kZSB0b0luZGV4fSwKKyAgICAgKiBleGNsdXNpdmUuIChJZiB7QGNvZGUgZnJvbUluZGV4PT10b0luZGV4fSwgdGhlIHJhbmdlIHRvIGJlIHNvcnRlZCBpcyBlbXB0eS4pIFRoaXMKICAgICAgKiBzb3J0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlOiBlcXVhbCBlbGVtZW50cyB3aWxsIG5vdCBiZSByZW9yZGVyZWQgYXMKICAgICAgKiBhIHJlc3VsdCBvZiB0aGUgc29ydC4KICAgICAgKiAKICAgICAgKiBUaGUgc29ydGluZyBhbGdvcml0aG0gaXMgYSBtZXJnZXNvcnQgd2l0aCBleHBvbmVudGlhbCBzZWFyY2ggKGluIHdoaWNoCiAgICAgICogdGhlIG1lcmdlIGlzIHBlcmZvcm1lZCBieSBleHBvbmVudGlhbCBzZWFyY2gpLiBUaGlzIGFsZ29yaXRobSBvZmZlcnMKLSAgICAgKiBndWFyYW50ZWVkIG4qbG9nKG4pIHBlcmZvcm1hbmNlIGFuZCBpbiBhdmVyYWdlIGNhc2UgZmFzdGVyIHRoZW4gYW55CisgICAgICogZ3VhcmFudGVlZCB7QGNvZGUgbipsb2cobil9IHBlcmZvcm1hbmNlIGFuZCBpbiBhdmVyYWdlIGNhc2UgZmFzdGVyIHRoZW4gYW55CiAgICAgICogbWVyZ2Vzb3J0IGluIHdoaWNoIHRoZSBtZXJnZSBpcyBwZXJmb3JtZWQgYnkgbGluZWFyIHNlYXJjaC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4gLQpAQCAtMjU1OSwxNSArMjYyMCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBwbGFjZSBvZiBzcGVjaWZpZWQgcmFuZ2Ugb2Ygc3BlY2lmaWVkIHNvcnRlZCBhcnJheSwgd2hlcmUgdGhlCi0gICAgICogZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIGdldHRpbmcgc29ydGVkIGFycmF5LiBVc2VzIGV4cG9uZW50aWFsCi0gICAgICogc2VhcmNoIGFsZ29yaXRobS4KKyAgICAgKiBGaW5kcyB0aGUgcGxhY2Ugd2hlcmUgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCAKKyAgICAgKiByYW5nZSBvZiB0aGUgc3BlY2lmaWVkIHNvcnRlZCBhcnJheSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgYXJyYXkgd291bGQKKyAgICAgKiByZW1haW4gc29ydGVkLiBVc2VzIGFuIGV4cG9uZW50aWFsIHNlYXJjaCBhbGdvcml0aG0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGFyciAtCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgd2l0aCBhbHJlYWR5IHNvcnRlZCByYW5nZQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdpdGggYSBzb3J0ZWQgcmFuZ2UKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsIC0KLSAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byBiZSBpbnNlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSBpbnNlcnRlZAogICAgICAqIAogICAgICAqIEBwYXJhbSBsIC0KICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCAoaW5jbHVzaXZlKQpAQCAtMjU3Niw5ICsyNjM3LDEzIEBACiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCAoaW5jbHVzaXZlKQogICAgICAqIAogICAgICAqIEBwYXJhbSBibmQgLQotICAgICAqICAgICAgICAgICAgcG9zc2libGUgdmFsdWVzIDAsLTEuICItMSIgLSB2YWwgaXMgbG9jYXRlZCBhdCBpbmRleCBtb3JlIHRoZW4KLSAgICAgKiAgICAgICAgICAgIGVsZW1lbnRzIGVxdWFscyB0byB2YWwuICIwIiAtIHZhbCBpcyBsb2NhdGVkIGF0IGluZGV4IGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoZW4gZWxlbWVudHMgZXF1YWxzIHRvIHZhbC4KKyAgICAgKiAgICAgICAgICAgIEEgc3BlY2lmaWVyIHRvIGluZGljYXRlIGhvdyB0byB0cmVhdCB0aGUgY2FzZSB3aGVyZSB0aGUgCisgICAgICogICAgICAgICAgICBhcnJheSByYW5nZSBjb250YWlucyBhbiBlbGVtZW50IG9yIGVsZW1lbnRzIGVxdWFsIHRvIAorICAgICAqICAgICAgICAgICAge0Bjb2RlIHZhbH0uICAie0Bjb2RlIC0xfSIgaW5kaWNhdGVzIHRoYXQgdmFsIHNob3VsZCBiZSBwbGFjZWQgYXQgCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggZ3JlYXRlciB0aGFuIHRoZSBpbmRpY2VzIG9mIGFueSBlbGVtZW50cyBlcXVhbCB0byAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB2YWx9LiAie0Bjb2RlIDB9IiAtIGluZGljYXRlcyB0aGF0IHZhbCBzaG91bGQgYmUgcGxhY2VkIGF0IAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGxlc3MgdGhhbiB0aGUgaW5kaWNlcyBvZiBhbnkgZWxlbWVudHMgZXF1YWwgdG8gCisgICAgICogICAgICAgICAgICB7QGNvZGUgdmFsfS4KICAgICAgKiAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTI2MDcsMTUgKzI2NzIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgcGxhY2Ugb2Ygc3BlY2lmaWVkIHJhbmdlIG9mIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXksIHdoZXJlIHRoZQotICAgICAqIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkIGZvciBnZXR0aW5nIHNvcnRlZCBhcnJheS4gVXNlcyBleHBpb25lbnRpYWwKLSAgICAgKiBzZWFyY2ggYWxnb3JpdGhtLgorICAgICAqIEZpbmRzIHRoZSBwbGFjZSB3aGVyZSB0aGUgZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIAorICAgICAqIHJhbmdlIG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIGFycmF5IHNvIHRoYXQgdGhlIHJlc3VsdGluZyBhcnJheSB3b3VsZAorICAgICAqIHJlbWFpbiBzb3J0ZWQuIFVzZXMgYW4gZXhwb25lbnRpYWwgc2VhcmNoIGFsZ29yaXRobS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyIC0KLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aXRoIGFscmVhZHkgc29ydGVkIHJhbmdlCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgd2l0aCBhIHNvcnRlZCByYW5nZQogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwgLQotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIGJlIGluc2VydGVkCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGluc2VydGVkCiAgICAgICogCiAgICAgICogQHBhcmFtIGwgLQogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IChpbmNsdXNpdmUpCkBAIC0yNjI0LDEyICsyNjg5LDE2IEBACiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCAoaW5jbHVzaXZlKQogICAgICAqIAogICAgICAqIEBwYXJhbSBibmQgLQotICAgICAqICAgICAgICAgICAgcG9zc2libGUgdmFsdWVzIDAsLTEuICItMSIgLSB2YWwgaXMgbG9jYXRlZCBhdCBpbmRleCBtb3JlIHRoZW4KLSAgICAgKiAgICAgICAgICAgIGVsZW1lbnRzIGVxdWFscyB0byB2YWwuICIwIiAtIHZhbCBpcyBsb2NhdGVkIGF0IGluZGV4IGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoZW4gZWxlbWVudHMgZXF1YWxzIHRvIHZhbC4KKyAgICAgKiAgICAgICAgICAgIEEgc3BlY2lmaWVyIHRvIGluZGljYXRlIGhvdyB0byB0cmVhdCB0aGUgY2FzZSB3aGVyZSB0aGUgCisgICAgICogICAgICAgICAgICBhcnJheSByYW5nZSBjb250YWlucyBhbiBlbGVtZW50IG9yIGVsZW1lbnRzIGVxdWFsIHRvIAorICAgICAqICAgICAgICAgICAge0Bjb2RlIHZhbH0uICAie0Bjb2RlIC0xfSIgaW5kaWNhdGVzIHRoYXQgdmFsIHNob3VsZCBiZSBwbGFjZWQgYXQgCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggZ3JlYXRlciB0aGFuIHRoZSBpbmRpY2VzIG9mIGFueSBlbGVtZW50cyBlcXVhbCB0byAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB2YWx9LiAie0Bjb2RlIDB9IiAtIGluZGljYXRlcyB0aGF0IHZhbCBzaG91bGQgYmUgcGxhY2VkIGF0IAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGxlc3MgdGhhbiB0aGUgaW5kaWNlcyBvZiBhbnkgZWxlbWVudHMgZXF1YWwgdG8gCisgICAgICogICAgICAgICAgICB7QGNvZGUgdmFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYyAtCi0gICAgICogICAgICAgICAgICB0aGUgY29tcGFyYXRvciB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIHRoZSBhcnJheS4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ29tcGFyYXRvcn0gdG8gZGV0ZXJtaW5lIHRoZSBvcmRlcmluZyBvZiB0aGUgYXJyYXkuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmQoT2JqZWN0W10gYXJyLCBPYmplY3QgdmFsLCBpbnQgYm5kLCBpbnQgbCwgaW50IHIsCkBAIC0yNzE1LDcgKzI3ODQsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIHNwZWNpZmllZCBhcnJheSBvZiBTdHJpbmcuCisgICAgICogU29ydHMgdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBTdHJpbmd9IGFycmF5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnIgLQogICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRvIGJlIHNvcnRlZApAQCAtMjczMCw3ICsyNzk5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgU3RyaW5nLiBVc2Ugc3RhYmxlCisgICAgICogU29ydHMgdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBTdHJpbmd9IGFycmF5LiBVc2Ugc3RhYmxlCiAgICAgICogdGVybmFyeSBxdWljayBzb3J0IGFsZ29yaXRobS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyIC0KQEAgLTI3NDQsNyArMjgxMyw3IEBACiAgICAgICogQHBhcmFtIHRvSW5kZXggLQogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVsZW1lbnQgKGV4Y2x1c2l2ZSkgdG8gYmUgc29ydGVkLgogICAgICAqIEBwYXJhbSBjaElkIC0KLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIGNoYXIgZm9yIGN1cnJlbnQgc29ydGluZworICAgICAqICAgICAgICAgICAgaW5kZXggb2Yge0Bjb2RlIGNoYXJ9IGZvciBjdXJyZW50IHNvcnRpbmcKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHN0YWJsZVN0cmluZ1NvcnQoU3RyaW5nW10gYXJyLCBTdHJpbmdbXSBzcmMsCiAgICAgICAgICAgICBTdHJpbmdbXSBkc3QsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBpbnQgY2hJZCkgewpAQCAtMjg0NSwyNSArMjkxNCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5IHVzaW5nIHRoZSBzcGVjaWZpZWQgQ29tcGFyYXRvci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSB1c2luZyB0aGUgc3BlY2lmaWVkIHtAY29kZSBDb21wYXJhdG9yfS4KKyAgICAgKiBBbGwgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIHRvIGVhY2ggb3RoZXIgd2l0aG91dCBhCisgICAgICoge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBhcnJheSB0byBiZSBzb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSBhcnJheSB0byBiZSBzb3J0ZWQuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IHRvIHNvcnQuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0ICsgMSBpbmRleCB0byBzb3J0LgogICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgQ29tcGFyYXRvcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDb21wYXJhdG9yfS4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gZWxlbWVudHMgaW4gdGhlIGFycmF5IGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoCi0gICAgICogICAgICAgICAgICAgICAgb3RoZXIgdXNpbmcgdGhlIENvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIKKyAgICAgKiAgICAgICAgICAgICAgICB1c2luZyB0aGUge0Bjb2RlIENvbXBhcmF0b3J9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA+IGVuZDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnQgPiBlbmR9LgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+ZW5kID4gYXJyYXkuc2l6ZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBlbmQgPiBhcnJheS5sZW5ndGh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgc29ydChUW10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CkBAIC0yODg3LDQ2ICsyOTU3LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBhcnJheSB1c2luZyB0aGUgc3BlY2lmaWVkIENvbXBhcmF0b3IuCisgICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBhcnJheSB1c2luZyB0aGUgc3BlY2lmaWVkIHtAY29kZSBDb21wYXJhdG9yfS4gQWxsIGVsZW1lbnRzCisgICAgICogbXVzdCBiZSBjb21wYXJhYmxlIHRvIGVhY2ggb3RoZXIgd2l0aG91dCBhIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259IGJlaW5nIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgYXJyYXkgdG8gYmUgc29ydGVkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gYXJyYXkgdG8gYmUgc29ydGVkLgogICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgQ29tcGFyYXRvcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDb21wYXJhdG9yfS4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gZWxlbWVudHMgaW4gdGhlIGFycmF5IGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoCi0gICAgICogICAgICAgICAgICAgICAgb3RoZXIgdXNpbmcgdGhlIENvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIKKyAgICAgKiAgICAgICAgICAgICAgICB1c2luZyB0aGUge0Bjb2RlIENvbXBhcmF0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgc29ydChUW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CiAgICAgICAgIHNvcnQoMCwgYXJyYXkubGVuZ3RoLCBhcnJheSwgY29tcGFyYXRvcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBhcnJheSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBhcnJheSBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IGFycmF5IHRvIGJlIHNvcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBzaG9ydH0gYXJyYXkgdG8gYmUgc29ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KHNob3J0W10gYXJyYXkpIHsKICAgICAgICAgc29ydCgwLCBhcnJheS5sZW5ndGgsIGFycmF5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgICogU29ydHMgdGhlIHNwZWNpZmllZCByYW5nZSBpbiB0aGUgYXJyYXkgaW4gYXNjZW5kaW5nIG51bWVyaWNhbCBvcmRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCBhcnJheSB0byBiZSBzb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgc2hvcnR9IGFycmF5IHRvIGJlIHNvcnRlZC4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCB0byBzb3J0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggdG8gc29ydC4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgbGFzdCArIDEgaW5kZXggdG8gc29ydAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgKyAxIGluZGV4IHRvIHNvcnQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0ID4gZW5kPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA+IGVuZH0uCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5lbmQgPiBhcnJheS5zaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0gb3Ige0Bjb2RlIGVuZCA+IGFycmF5Lmxlbmd0aH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoc2hvcnRbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CkBAIC0zMDE2LDE4ICszMDg3LDE3IEBACiAKICAgICAvKioKICAgICAgKiA8cD4KLSAgICAgKiBDcmVhdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICAgKiA8Y29kZT5ib29sZWFuW108L2NvZGU+IHBhc3NlZC4gVGhlIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICg8Y29kZT4mcXVvdDtbXSZxdW90OzwvY29kZT4pLAotICAgICAqIGVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZpYSB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoYm9vbGVhbil9IGFuZCBzZXBhcmF0ZWQgYnkKLSAgICAgKiA8Y29kZT4mcXVvdDssICZxdW90OzwvY29kZT4uIElmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICAgKiB0aGVuIDxjb2RlPiZxdW90O251bGwmcXVvdDs8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGUge0Bjb2RlIGJvb2xlYW5bXX0gcGFzc2VkLgorICAgICAqIFRoZSByZXN1bHQgaXMgc3Vycm91bmRlZCBieSBicmFja2V0cyAoe0Bjb2RlICZxdW90O1tdJnF1b3Q7fSksIGVhY2gKKyAgICAgKiBlbGVtZW50IGlzIGNvbnZlcnRlZCB0byBhIHtAY29kZSBTdHJpbmd9IHZpYSB0aGUKKyAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoYm9vbGVhbil9IGFuZCBzZXBhcmF0ZWQgYnkge0Bjb2RlICZxdW90OywgJnF1b3Q7fS4KKyAgICAgKiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGVuIHtAY29kZSAmcXVvdDtudWxsJnF1b3Q7fSBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gYXJyYXkgdG8gY29udmVydC4KLSAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIDxjb2RlPmFycmF5PC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJvb2xlYW59IGFycmF5IHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuW10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTMwNDksMTggKzMxMTksMTcgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5ieXRlW108L2NvZGU+Ci0gICAgICogcGFzc2VkLiBUaGUgcmVzdWx0IGlzIHN1cnJvdW5kZWQgYnkgYnJhY2tldHMgKDxjb2RlPiZxdW90O1tdJnF1b3Q7PC9jb2RlPiksCi0gICAgICogZWFjaCBlbGVtZW50IGlzIGNvbnZlcnRlZCB0byBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmlhIHRoZQotICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihpbnQpfSBhbmQgc2VwYXJhdGVkIGJ5IDxjb2RlPiZxdW90OywgJnF1b3Q7PC9jb2RlPi4KLSAgICAgKiBJZiB0aGUgYXJyYXkgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gPGNvZGU+JnF1b3Q7bnVsbCZxdW90OzwvY29kZT4KLSAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAY29kZSBieXRlW119IHBhc3NlZC4gVGhlCisgICAgICogcmVzdWx0IGlzIHN1cnJvdW5kZWQgYnkgYnJhY2tldHMgKHtAY29kZSAmcXVvdDtbXSZxdW90O30pLCBlYWNoIGVsZW1lbnQKKyAgICAgKiBpcyBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgU3RyaW5nfSB2aWEgdGhlIHtAbGluayBTdHJpbmcjdmFsdWVPZihpbnQpfSBhbmQKKyAgICAgKiBzZXBhcmF0ZWQgYnkge0Bjb2RlICZxdW90OywgJnF1b3Q7fS4gSWYgdGhlIGFycmF5IGlzIHtAY29kZSBudWxsfSwgdGhlbgorICAgICAqIHtAY29kZSAmcXVvdDtudWxsJnF1b3Q7fSBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+Ynl0ZTwvY29kZT4gYXJyYXkgdG8gY29udmVydC4KLSAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIDxjb2RlPmFycmF5PC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IGFycmF5IHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhieXRlW10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTMwODIsMTggKzMxNTEsMTcgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5jaGFyW108L2NvZGU+Ci0gICAgICogcGFzc2VkLiBUaGUgcmVzdWx0IGlzIHN1cnJvdW5kZWQgYnkgYnJhY2tldHMgKDxjb2RlPiZxdW90O1tdJnF1b3Q7PC9jb2RlPiksCi0gICAgICogZWFjaCBlbGVtZW50IGlzIGNvbnZlcnRlZCB0byBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmlhIHRoZQotICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihjaGFyKX0gYW5kIHNlcGFyYXRlZCBieSA8Y29kZT4mcXVvdDssICZxdW90OzwvY29kZT4uCi0gICAgICogSWYgdGhlIGFycmF5IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIDxjb2RlPiZxdW90O251bGwmcXVvdDs8L2NvZGU+Ci0gICAgICogaXMgcmV0dXJuZWQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGNvZGUgY2hhcltdfSBwYXNzZWQuIFRoZQorICAgICAqIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICh7QGNvZGUgJnF1b3Q7W10mcXVvdDt9KSwgZWFjaCBlbGVtZW50CisgICAgICogaXMgY29udmVydGVkIHRvIGEge0Bjb2RlIFN0cmluZ30gdmlhIHRoZSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoY2hhcil9IGFuZAorICAgICAqIHNlcGFyYXRlZCBieSB7QGNvZGUgJnF1b3Q7LCAmcXVvdDt9LiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGVuCisgICAgICoge0Bjb2RlICZxdW90O251bGwmcXVvdDt9IGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiBhcnJheSB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgPGNvZGU+YXJyYXk8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgY2hhcn0gYXJyYXkgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgYXJyYXl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGNoYXJbXSBhcnJheSkgewogICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtMzExNSwxOCArMzE4MywxNyBAQAogCiAgICAgLyoqCiAgICAgICogPHA+Ci0gICAgICogQ3JlYXRlcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAgICogPGNvZGU+ZG91YmxlW108L2NvZGU+IHBhc3NlZC4gVGhlIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICg8Y29kZT4mcXVvdDtbXSZxdW90OzwvY29kZT4pLAotICAgICAqIGVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZpYSB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoZG91YmxlKX0gYW5kIHNlcGFyYXRlZCBieQotICAgICAqIDxjb2RlPiZxdW90OywgJnF1b3Q7PC9jb2RlPi4gSWYgdGhlIGFycmF5IGlzIDxjb2RlPm51bGw8L2NvZGU+LAotICAgICAqIHRoZW4gPGNvZGU+JnF1b3Q7bnVsbCZxdW90OzwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGNvZGUgZG91YmxlW119IHBhc3NlZC4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIHN1cnJvdW5kZWQgYnkgYnJhY2tldHMgKHtAY29kZSAmcXVvdDtbXSZxdW90O30pLCBlYWNoCisgICAgICogZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgU3RyaW5nfSB2aWEgdGhlCisgICAgICoge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGRvdWJsZSl9IGFuZCBzZXBhcmF0ZWQgYnkge0Bjb2RlICZxdW90OywgJnF1b3Q7fS4KKyAgICAgKiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGVuIHtAY29kZSAmcXVvdDtudWxsJnF1b3Q7fSBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiBhcnJheSB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgPGNvZGU+YXJyYXk8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgZG91YmxlfSBhcnJheSB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoZG91YmxlW10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTMxNDgsMTggKzMyMTUsMTcgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAqIDxjb2RlPmZsb2F0W108L2NvZGU+IHBhc3NlZC4gVGhlIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICg8Y29kZT4mcXVvdDtbXSZxdW90OzwvY29kZT4pLAotICAgICAqIGVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZpYSB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoZmxvYXQpfSBhbmQgc2VwYXJhdGVkIGJ5Ci0gICAgICogPGNvZGU+JnF1b3Q7LCAmcXVvdDs8L2NvZGU+LiBJZiB0aGUgYXJyYXkgaXMgPGNvZGU+bnVsbDwvY29kZT4sCi0gICAgICogdGhlbiA8Y29kZT4mcXVvdDtudWxsJnF1b3Q7PC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAY29kZSBmbG9hdFtdfSBwYXNzZWQuCisgICAgICogVGhlIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICh7QGNvZGUgJnF1b3Q7W10mcXVvdDt9KSwgZWFjaAorICAgICAqIGVsZW1lbnQgaXMgY29udmVydGVkIHRvIGEge0Bjb2RlIFN0cmluZ30gdmlhIHRoZQorICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihmbG9hdCl9IGFuZCBzZXBhcmF0ZWQgYnkge0Bjb2RlICZxdW90OywgJnF1b3Q7fS4KKyAgICAgKiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGVuIHtAY29kZSAmcXVvdDtudWxsJnF1b3Q7fSBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IGFycmF5IHRvIGNvbnZlcnQuCi0gICAgICogQHJldHVybiBUaGUgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiA8Y29kZT5hcnJheTwvY29kZT4uCi0gICAgICogQHNpbmNlIDEuNQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBmbG9hdH0gYXJyYXkgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgYXJyYXl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGZsb2F0W10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTMxODEsMTggKzMyNDcsMTcgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5pbnRbXTwvY29kZT4KLSAgICAgKiBwYXNzZWQuIFRoZSByZXN1bHQgaXMgc3Vycm91bmRlZCBieSBicmFja2V0cyAoPGNvZGU+JnF1b3Q7W10mcXVvdDs8L2NvZGU+KSwKLSAgICAgKiBlYWNoIGVsZW1lbnQgaXMgY29udmVydGVkIHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2aWEgdGhlCi0gICAgICoge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGludCl9IGFuZCBzZXBhcmF0ZWQgYnkgPGNvZGU+JnF1b3Q7LCAmcXVvdDs8L2NvZGU+LgotICAgICAqIElmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiA8Y29kZT4mcXVvdDtudWxsJnF1b3Q7PC9jb2RlPgotICAgICAqIGlzIHJldHVybmVkLgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGUge0Bjb2RlIGludFtdfSBwYXNzZWQuIFRoZQorICAgICAqIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICh7QGNvZGUgJnF1b3Q7W10mcXVvdDt9KSwgZWFjaCBlbGVtZW50CisgICAgICogaXMgY29udmVydGVkIHRvIGEge0Bjb2RlIFN0cmluZ30gdmlhIHRoZSB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoaW50KX0gYW5kCisgICAgICogc2VwYXJhdGVkIGJ5IHtAY29kZSAmcXVvdDssICZxdW90O30uIElmIHRoZSBhcnJheSBpcyB7QGNvZGUgbnVsbH0sIHRoZW4KKyAgICAgKiB7QGNvZGUgJnF1b3Q7bnVsbCZxdW90O30gaXMgcmV0dXJuZWQuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPmludDwvY29kZT4gYXJyYXkgdG8gY29udmVydC4KLSAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIDxjb2RlPmFycmF5PC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGludH0gYXJyYXkgdG8gY29udmVydC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgYXJyYXl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGludFtdIGFycmF5KSB7CiAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CkBAIC0zMjE0LDE4ICszMjc5LDE3IEBACiAKICAgICAvKioKICAgICAgKiA8cD4KLSAgICAgKiBDcmVhdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+bG9uZ1tdPC9jb2RlPgotICAgICAqIHBhc3NlZC4gVGhlIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICg8Y29kZT4mcXVvdDtbXSZxdW90OzwvY29kZT4pLAotICAgICAqIGVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZpYSB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YobG9uZyl9IGFuZCBzZXBhcmF0ZWQgYnkgPGNvZGU+JnF1b3Q7LCAmcXVvdDs8L2NvZGU+LgotICAgICAqIElmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiA8Y29kZT4mcXVvdDtudWxsJnF1b3Q7PC9jb2RlPgotICAgICAqIGlzIHJldHVybmVkLgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGUge0Bjb2RlIGxvbmdbXX0gcGFzc2VkLiBUaGUKKyAgICAgKiByZXN1bHQgaXMgc3Vycm91bmRlZCBieSBicmFja2V0cyAoe0Bjb2RlICZxdW90O1tdJnF1b3Q7fSksIGVhY2ggZWxlbWVudAorICAgICAqIGlzIGNvbnZlcnRlZCB0byBhIHtAY29kZSBTdHJpbmd9IHZpYSB0aGUge0BsaW5rIFN0cmluZyN2YWx1ZU9mKGxvbmcpfSBhbmQKKyAgICAgKiBzZXBhcmF0ZWQgYnkge0Bjb2RlICZxdW90OywgJnF1b3Q7fS4gSWYgdGhlIGFycmF5IGlzIHtAY29kZSBudWxsfSwgdGhlbgorICAgICAqIHtAY29kZSAmcXVvdDtudWxsJnF1b3Q7fSBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+bG9uZzwvY29kZT4gYXJyYXkgdG8gY29udmVydC4KLSAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIDxjb2RlPmFycmF5PC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGxvbmd9IGFycmF5IHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIGFycmF5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhsb25nW10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTMyNDcsMTggKzMzMTEsMTcgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAqIDxjb2RlPnNob3J0W108L2NvZGU+IHBhc3NlZC4gVGhlIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICg8Y29kZT4mcXVvdDtbXSZxdW90OzwvY29kZT4pLAotICAgICAqIGVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZpYSB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoaW50KX0gYW5kIHNlcGFyYXRlZCBieQotICAgICAqIDxjb2RlPiZxdW90OywgJnF1b3Q7PC9jb2RlPi4gSWYgdGhlIGFycmF5IGlzIDxjb2RlPm51bGw8L2NvZGU+LAotICAgICAqIHRoZW4gPGNvZGU+JnF1b3Q7bnVsbCZxdW90OzwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGNvZGUgc2hvcnRbXX0gcGFzc2VkLgorICAgICAqIFRoZSByZXN1bHQgaXMgc3Vycm91bmRlZCBieSBicmFja2V0cyAoe0Bjb2RlICZxdW90O1tdJnF1b3Q7fSksIGVhY2gKKyAgICAgKiBlbGVtZW50IGlzIGNvbnZlcnRlZCB0byBhIHtAY29kZSBTdHJpbmd9IHZpYSB0aGUKKyAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoaW50KX0gYW5kIHNlcGFyYXRlZCBieSB7QGNvZGUgJnF1b3Q7LCAmcXVvdDt9LiBJZgorICAgICAqIHRoZSBhcnJheSBpcyB7QGNvZGUgbnVsbH0sIHRoZW4ge0Bjb2RlICZxdW90O251bGwmcXVvdDt9IGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5zaG9ydDwvY29kZT4gYXJyYXkgdG8gY29udmVydC4KLSAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIDxjb2RlPmFycmF5PC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIHNob3J0fSBhcnJheSB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoc2hvcnRbXSBhcnJheSkgewogICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtMzI4MCwxOCArMzM0MywxNyBAQAogCiAgICAgLyoqCiAgICAgICogPHA+Ci0gICAgICogQ3JlYXRlcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAgICogPGNvZGU+T2JqZWN0W108L2NvZGU+IHBhc3NlZC4gVGhlIHJlc3VsdCBpcyBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzICg8Y29kZT4mcXVvdDtbXSZxdW90OzwvY29kZT4pLAotICAgICAqIGVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZpYSB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX0gYW5kIHNlcGFyYXRlZCBieQotICAgICAqIDxjb2RlPiZxdW90OywgJnF1b3Q7PC9jb2RlPi4gSWYgdGhlIGFycmF5IGlzIDxjb2RlPm51bGw8L2NvZGU+LAotICAgICAqIHRoZW4gPGNvZGU+JnF1b3Q7bnVsbCZxdW90OzwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGNvZGUgT2JqZWN0W119IHBhc3NlZC4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIHN1cnJvdW5kZWQgYnkgYnJhY2tldHMgKHtAY29kZSAmcXVvdDtbXSZxdW90O30pLCBlYWNoCisgICAgICogZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgU3RyaW5nfSB2aWEgdGhlCisgICAgICoge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9IGFuZCBzZXBhcmF0ZWQgYnkge0Bjb2RlICZxdW90OywgJnF1b3Q7fS4KKyAgICAgKiBJZiB0aGUgYXJyYXkgaXMge0Bjb2RlIG51bGx9LCB0aGVuIHtAY29kZSAmcXVvdDtudWxsJnF1b3Q7fSBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+T2JqZWN0PC9jb2RlPiBhcnJheSB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgPGNvZGU+YXJyYXk8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSBhcnJheSB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0W10gYXJyYXkpIHsKICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTMzMTMsMjUgKzMzNzUsMjMgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSA8aT4iZGVlcCI8L2k+IDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAgICogPGNvZGU+T2JqZWN0W108L2NvZGU+IHBhc3NlZCwgc3VjaCB0aGF0IGlmIHRoZSBhcnJheSBjb250YWlucyBvdGhlcgotICAgICAqIGFycmF5cywgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhvc2UgYXJyYXlzIGlzCi0gICAgICogZ2VuZXJhdGVkIGFzIHdlbGwuCisgICAgICogQ3JlYXRlcyBhIDxpPiJkZWVwIjwvaT4ge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICoge0Bjb2RlIE9iamVjdFtdfSBwYXNzZWQsIHN1Y2ggdGhhdCBpZiB0aGUgYXJyYXkgY29udGFpbnMgb3RoZXIgYXJyYXlzLAorICAgICAqIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aG9zZSBhcnJheXMgaXMgZ2VuZXJhdGVkIGFzIHdlbGwuCiAgICAgICogPC9wPgogICAgICAqIDxwPgogICAgICAqIElmIGFueSBvZiB0aGUgZWxlbWVudHMgYXJlIHByaW1pdGl2ZSBhcnJheXMsIHRoZSBnZW5lcmF0aW9uIGlzIGRlbGVnYXRlZAotICAgICAqIHRvIHRoZSBvdGhlciA8Y29kZT50b1N0cmluZzwvY29kZT4gbWV0aG9kcyBpbiB0aGlzIGNsYXNzLiBJZiBhbnkKLSAgICAgKiBlbGVtZW50IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBhcnJheSwgdGhlbiBpdCB3aWxsIGJlCi0gICAgICogcmVwcmVzZW50ZWQgYXMgPGNvZGU+IlsuLi5dIjwvY29kZT4uIElmIGFuIGVsZW1lbnQgaXMgYW4KLSAgICAgKiA8Y29kZT5PYmplY3RbXTwvY29kZT4sIHRoZW4gaXRzIHJlcHJlc2VudGF0aW9uIGlzIGdlbmVyYXRlZCBieSBhCi0gICAgICogcmVjdXJzaXZlIGNhbGwgdG8gdGhpcyBtZXRob2QuIEFsbCBvdGhlciBlbGVtZW50cyBhcmUgY29udmVydGVkIHZpYSB0aGUKLSAgICAgKiB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX0gbWV0aG9kLgorICAgICAqIHRvIHRoZSBvdGhlciB7QGNvZGUgdG9TdHJpbmd9IG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4gSWYgYW55IGVsZW1lbnQKKyAgICAgKiBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgYXJyYXksIHRoZW4gaXQgd2lsbCBiZSByZXByZXNlbnRlZAorICAgICAqIGFzIHtAY29kZSAiWy4uLl0ifS4gSWYgYW4gZWxlbWVudCBpcyBhbiB7QGNvZGUgT2JqZWN0W119LCB0aGVuIGl0cworICAgICAqIHJlcHJlc2VudGF0aW9uIGlzIGdlbmVyYXRlZCBieSBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHRoaXMgbWV0aG9kLiBBbGwgb3RoZXIKKyAgICAgKiBlbGVtZW50cyBhcmUgY29udmVydGVkIHZpYSB0aGUge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9IG1ldGhvZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+T2JqZWN0PC9jb2RlPiBhcnJheSB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgPGNvZGU+YXJyYXk8L2NvZGU+LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSBhcnJheSB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBhcnJheX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcFRvU3RyaW5nKE9iamVjdFtdIGFycmF5KSB7CiAgICAgICAgIC8vIGRlbGVnYXRlIHRoaXMgdG8gdGhlIHJlY3Vyc2l2ZSBtZXRob2QKQEAgLTMzNDQsMTQgKzM0MDQsMTQgQEAKICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgPGNvZGU+T2JqZWN0W108L2NvZGU+IHRvIGRpdmUgaW50by4KLSAgICAgKiBAcGFyYW0gb3JpZ2luYWwKLSAgICAgKiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCA8Y29kZT5PYmplY3RbXTwvY29kZT47IHVzZWQgdG8gdGVzdCBmb3Igc2VsZgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3RbXX0gdG8gZGl2ZSBpbnRvLgorICAgICAqIEBwYXJhbSBvcmlnQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luYWwge0Bjb2RlIE9iamVjdFtdfTsgdXNlZCB0byB0ZXN0IGZvciBzZWxmCiAgICAgICogICAgICAgICAgICByZWZlcmVuY2VzLgogICAgICAqIEBwYXJhbSBzYgotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPlN0cmluZ0J1aWxkZXI8L2NvZGU+IGluc3RhbmNlIHRvIGFwcGVuZCB0byBvcgotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gb25lIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LgotICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU3RyaW5nQnVpbGRlcn0gaW5zdGFuY2UgdG8gYXBwZW5kIHRvIG9yCisgICAgICogICAgICAgICAgICB7QGNvZGUgbnVsbH0gb25lIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdC4KICAgICAgKiBAc2VlICNkZWVwVG9TdHJpbmcoT2JqZWN0W10pCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZXBUb1N0cmluZ0ltcGwoT2JqZWN0W10gYXJyYXksIE9iamVjdFtdIG9yaWdBcnJheXMsCkBAIC0zNDQwLDkgKzM1MDAsOSBAQAogICAgICAqIEBwYXJhbSBvcmlnQXJyYXlzCiAgICAgICogICAgICAgICAgICBBbiBhcnJheSBvZiBPYmplY3RbXSByZWZlcmVuY2VzLgogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgQW4gT2JqZWN0W10gcmVmZXJlbmNlIHRvIGxvb2sgZm9yIGluIDxjb2RlPm9yaWdBcnJheXM8L2NvZGU+LgotICAgICAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgYW4KLSAgICAgKiAgICAgICAgIGVsZW1lbnQgaW4gPGNvZGU+b3JpZ0FycmF5czwvY29kZT4uCisgICAgICogICAgICAgICAgICBBbiBPYmplY3RbXSByZWZlcmVuY2UgdG8gbG9vayBmb3IgaW4ge0Bjb2RlIG9yaWdBcnJheXN9LgorICAgICAqIEByZXR1cm4gQSB2YWx1ZSBvZiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGFycmF5fSBpcyBhbgorICAgICAqICAgICAgICAgZWxlbWVudCBpbiB7QGNvZGUgb3JpZ0FycmF5c30uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWVwVG9TdHJpbmdJbXBsQ29udGFpbnMoT2JqZWN0W10gb3JpZ0FycmF5cywKICAgICAgICAgICAgIE9iamVjdCBhcnJheSkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9CaXRTZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQml0U2V0LmphdmEKaW5kZXggODJhNGEzNS4uYWE2MGJlMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9CaXRTZXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0JpdFNldC5qYXZhCkBAIC0yMiw5ICsyMiwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRoZSBCaXRTZXQgY2xhc3MgaW1wbGVtZW50cyBhIGJpdCBmaWVsZC4gRWFjaCBlbGVtZW50IGluIGEgQml0U2V0IGNhbiBiZQotICogb24oMSkgb3Igb2ZmKDApLiBBIEJpdFNldCBpcyBjcmVhdGVkIHdpdGggYSBnaXZlbiBzaXplIGFuZCBncm93cyB3aGVuIHRoaXMKLSAqIHNpemUgaXMgZXhjZWVkZWQuIEdyb3d0aCBpcyBhbHdheXMgcm91bmRlZCB0byBhIDY0IGJpdCBib3VuZGFyeS4KKyAqIFRoZSB7QGNvZGUgQml0U2V0fSBjbGFzcyBpbXBsZW1lbnRzIGEgYml0IGZpZWxkLiBFYWNoIGVsZW1lbnQgaW4gYQorICoge0Bjb2RlIEJpdFNldH0gY2FuIGJlIG9uKDEpIG9yIG9mZigwKS4gQSB7QGNvZGUgQml0U2V0fSBpcyBjcmVhdGVkIHdpdGggYQorICogZ2l2ZW4gc2l6ZSBhbmQgZ3Jvd3MgaWYgdGhpcyBzaXplIGlzIGV4Y2VlZGVkLiBHcm93dGggaXMgYWx3YXlzIHJvdW5kZWQgdG8gYQorICogNjQgYml0IGJvdW5kYXJ5LgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCaXRTZXQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzk5NzY5ODU4ODk4Njg3ODc1M0w7CkBAIC0zNSw3ICszOCw3IEBACiAgICAgcHJpdmF0ZSBsb25nW10gYml0czsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBCaXRTZXQgd2l0aCBzaXplIGVxdWFsIHRvIDY0IGJpdHMKKyAgICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIEJpdFNldH0gd2l0aCBzaXplIGVxdWFsIHRvIDY0IGJpdHMuCiAgICAgICogCiAgICAgICogQHNlZSAjY2xlYXIoaW50KQogICAgICAqIEBzZWUgI3NldChpbnQpCkBAIC00NCwyMSArNDcsMjEgQEAKICAgICAgKiBAc2VlICNzZXQoaW50LCBib29sZWFuKQogICAgICAqIEBzZWUgI3NldChpbnQsIGludCkKICAgICAgKiBAc2VlICNzZXQoaW50LCBpbnQsIGJvb2xlYW4pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpdFNldCgpIHsKICAgICAgICAgdGhpcyg2NCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEJpdFNldCB3aXRoIHNpemUgZXF1YWwgdG8gbmJpdHMuIElmIG5iaXRzIGlzIG5vdCBhIG11bHRpcGxlCi0gICAgICogb2YgNjQsIHRoZW4gY3JlYXRlIGEgQml0U2V0IHdpdGggc2l6ZSBuYml0cyByb3VuZGVkIHRvIHRoZSBuZXh0IGNsb3Nlc3QKLSAgICAgKiBtdWx0aXBsZSBvZiA2NC4KKyAgICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIEJpdFNldH0gd2l0aCBzaXplIGVxdWFsIHRvIG5iaXRzLiBJZiBuYml0cyBpcyBub3QgYQorICAgICAqIG11bHRpcGxlIG9mIDY0LCB0aGVuIGNyZWF0ZSBhIHtAY29kZSBCaXRTZXR9IHdpdGggc2l6ZSBuYml0cyByb3VuZGVkIHRvCisgICAgICogdGhlIG5leHQgY2xvc2VzdCBtdWx0aXBsZSBvZiA2NC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmJpdHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBiaXQgc2V0CisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYml0IHNldC4KICAgICAgKiBAdGhyb3dzIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbmJpdHMgPCAwLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuYml0c30gaXMgbmVnYXRpdmUuCiAgICAgICogQHNlZSAjY2xlYXIoaW50KQogICAgICAqIEBzZWUgI3NldChpbnQpCiAgICAgICogQHNlZSAjY2xlYXIoKQpAQCAtNjYsNiArNjksNyBAQAogICAgICAqIEBzZWUgI3NldChpbnQsIGJvb2xlYW4pCiAgICAgICogQHNlZSAjc2V0KGludCwgaW50KQogICAgICAqIEBzZWUgI3NldChpbnQsIGludCwgYm9vbGVhbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQml0U2V0KGludCBuYml0cykgewogICAgICAgICBpZiAobmJpdHMgPj0gMCkgewpAQCAtODYsOSArOTAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgQml0U2V0CisgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyB7QGNvZGUgQml0U2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgY29weSBvZiB0aGlzIEJpdFNldC4KKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIHtAY29kZSBCaXRTZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CkBAIC0xMDIsMTQgKzEwNywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGlzIEJpdFNldCBhbmQgYW5zd2VyIGlmIHRoZXkgYXJlIGVxdWFsLiBUaGUKLSAgICAgKiBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBCaXRTZXQgd2l0aCB0aGUgc2FtZSBiaXRzIHNldC4KKyAgICAgKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhpcyB7QGNvZGUgQml0U2V0fSBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZXkgYXJlCisgICAgICogZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgQml0U2V0fSB3aXRoIHRoZSBzYW1lCisgICAgICogYml0cyBzZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPkJpdFNldDwvY29kZT4gb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgQml0U2V0IGFuZCBvYmogYXJlIGVxdWFsCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEJpdFNldH0gb2JqZWN0IHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiBhIHtAY29kZSBib29sZWFufSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMge0Bjb2RlIEJpdFNldH0gYW5kCisgICAgICogICAgICAgICB7QGNvZGUgb2JqfSBhcmUgZXF1YWwuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtMTUxLDExICsxNTgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdG8gYWNjb21tb2RhdGUgcG9zIGJpdHMuIFRoZSBuZXcKLSAgICAgKiBhcnJheSBtYXggaW5kZXggd2lsbCBiZSBhIG11bHRpcGxlIG9mIDY0CisgICAgICogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGFycmF5IHRvIGFjY29tbW9kYXRlIHtAY29kZSBwb3N9IGJpdHMuCisgICAgICogVGhlIG5ldyBhcnJheSBtYXggaW5kZXggd2lsbCBiZSBhIG11bHRpcGxlIG9mIDY0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0aGUgbmV3IGFycmF5IG5lZWRzIHRvIGJlIGFibGUgdG8gYWNjZXNzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdGhlIG5ldyBhcnJheSBuZWVkcyB0byBiZSBhYmxlIHRvIGFjY2Vzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZ3Jvd0JpdHMoaW50IHBvcykgewogICAgICAgICBwb3MrKzsgLy8gSW5jIHRvIGdldCBjb3JyZWN0IGJpdCBjb3VudApAQCAtMTY2LDEzICsxNzQsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIEJpdFNldC4KKyAgICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIHtAY29kZSBCaXRTZXR9LiBJZiB0d28ge0Bjb2RlIEJpdFNldH1zIGFyZSBlcXVhbAorICAgICAqIHRoZSBoYXZlIHRvIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHtAY29kZSBoYXNoQ29kZSgpfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIGJpdAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBpbnR9IHJlcHJlc2VudGluZyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIGJpdAogICAgICAqICAgICAgICAgc2V0LgotICAgICAqIAogICAgICAqIEBzZWUgI2VxdWFscwogICAgICAqIEBzZWUgamF2YS51dGlsLkhhc2h0YWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC0xODYsMTUgKzE5NSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBiaXQgYXQgaW5kZXggcG9zLiBHcm93cyB0aGUgQml0U2V0IGlmIHBvcyA+IHNpemUuCisgICAgICogUmV0cmlldmVzIHRoZSBiaXQgYXQgaW5kZXgge0Bjb2RlIHBvc30uIEdyb3dzIHRoZSB7QGNvZGUgQml0U2V0fSBpZgorICAgICAqIHtAY29kZSBwb3MgPiBzaXplfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9zCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGJpdCB0byBiZSByZXRyaWV2ZWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBiaXQgYXQgPGNvZGU+cG9zPC9jb2RlPiBpcyBzZXQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGJpdCB0byBiZSByZXRyaWV2ZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGJpdCBhdCB7QGNvZGUgcG9zfSBpcyBzZXQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnBvczwvY29kZT4gPCAwCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBvc30gaXMgbmVnYXRpdmUuCiAgICAgICogQHNlZSAjY2xlYXIoaW50KQogICAgICAqIEBzZWUgI3NldChpbnQpCiAgICAgICogQHNlZSAjY2xlYXIoKQpAQCAtMjAyLDYgKzIxMSw3IEBACiAgICAgICogQHNlZSAjc2V0KGludCwgYm9vbGVhbikKICAgICAgKiBAc2VlICNzZXQoaW50LCBpbnQpCiAgICAgICogQHNlZSAjc2V0KGludCwgaW50LCBib29sZWFuKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldChpbnQgcG9zKSB7CiAgICAgICAgIGlmIChwb3MgPj0gMCkgewpAQCAtMjE1LDE5ICsyMjUsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGJpdHMgc3RhcnRpbmcgZnJvbSBwb3MxIHRvIHBvczIgYW5kIHJldHVybnMgYmFjayBhIG5ldwotICAgICAqIGJpdHNldCBtYWRlIG9mIHRoZXNlIGJpdHMuIEdyb3dzIHRoZSBCaXRTZXQgaWYgcG9zMiA+IHNpemUuCisgICAgICogUmV0cmlldmVzIHRoZSBiaXRzIHN0YXJ0aW5nIGZyb20ge0Bjb2RlIHBvczF9IHRvIHtAY29kZSBwb3MyfSBhbmQgcmV0dXJucworICAgICAqIGJhY2sgYSBuZXcgYml0c2V0IG1hZGUgb2YgdGhlc2UgYml0cy4gR3Jvd3MgdGhlIHtAY29kZSBCaXRTZXR9IGlmCisgICAgICoge0Bjb2RlIHBvczIgPiBzaXplfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9zMQotICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICBiZWdpbm5pbmcgcG9zaXRpb24uCiAgICAgICogQHBhcmFtIHBvczIKLSAgICAgKiAgICAgICAgICAgIGVuZGluZyBwb3NpdGlvbgotICAgICAqIEByZXR1cm4gbmV3IGJpdHNldAorICAgICAqICAgICAgICAgICAgZW5kaW5nIHBvc2l0aW9uLgorICAgICAqIEByZXR1cm4gbmV3IGJpdHNldCBvZiB0aGUgcmFuZ2Ugc3BlY2lmaWVkLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gcG9zMSBvciBwb3MyIGlzIG5lZ2F0aXZlLCBvciB3aGVuIHBvczIgaXMgbm90IHNtYWxsZXIKLSAgICAgKiAgICAgICAgICAgICB0aGFuIHBvczEKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcG9zMX0gb3Ige0Bjb2RlIHBvczJ9IGlzIG5lZ2F0aXZlLCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBwb3MyfSBpcyBzbWFsbGVyIHRoYW4ge0Bjb2RlIHBvczF9LgogICAgICAqIEBzZWUgI2dldChpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpdFNldCBnZXQoaW50IHBvczEsIGludCBwb3MyKSB7CiAgICAgICAgIGlmIChwb3MxID49IDAgJiYgcG9zMiA+PSAwICYmIHBvczIgPj0gcG9zMSkgewpAQCAtMjgwLDE2ICsyOTEsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBiaXQgYXQgaW5kZXggcG9zIHRvIDEuIEdyb3dzIHRoZSBCaXRTZXQgaWYgcG9zID4gc2l6ZS4KKyAgICAgKiBTZXRzIHRoZSBiaXQgYXQgaW5kZXgge0Bjb2RlIHBvc30gdG8gMS4gR3Jvd3MgdGhlIHtAY29kZSBCaXRTZXR9IGlmCisgICAgICoge0Bjb2RlIHBvcyA+IHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgYml0IHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gc2V0LgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gcG9zIDwgMAotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwb3N9IGlzIG5lZ2F0aXZlLgogICAgICAqIEBzZWUgI2NsZWFyKGludCkKICAgICAgKiBAc2VlICNjbGVhcigpCiAgICAgICogQHNlZSAjY2xlYXIoaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0KGludCBwb3MpIHsKICAgICAgICAgaWYgKHBvcyA+PSAwKSB7CkBAIC0zMDMsMTYgKzMxNSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJpdCBhdCBpbmRleCBwb3MgdG8gdGhlIHZhbHVlLiBHcm93cyB0aGUgQml0U2V0IGlmIHBvcyA+IHNpemUuCisgICAgICogU2V0cyB0aGUgYml0IGF0IGluZGV4IHtAY29kZSBwb3N9IHRvIHtAY29kZSB2YWx9LiBHcm93cyB0aGUKKyAgICAgKiB7QGNvZGUgQml0U2V0fSBpZiB7QGNvZGUgcG9zID4gc2l6ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBvcwotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGJpdCB0byBzZXQuCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gc2V0IHRoZSBiaXQKKyAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIHNldCB0aGUgYml0LgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gcG9zIDwgMAotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwb3N9IGlzIG5lZ2F0aXZlLgogICAgICAqIEBzZWUgI3NldChpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0KGludCBwb3MsIGJvb2xlYW4gdmFsKSB7CiAgICAgICAgIGlmICh2YWwpIHsKQEAgLTMyMywxOCArMzM2LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYml0cyBzdGFydGluZyBmcm9tIHBvczEgdG8gcG9zMi4gR3Jvd3MgdGhlIEJpdFNldCBpZiBwb3MyID4KLSAgICAgKiBzaXplLgorICAgICAqIFNldHMgdGhlIGJpdHMgc3RhcnRpbmcgZnJvbSB7QGNvZGUgcG9zMX0gdG8ge0Bjb2RlIHBvczJ9LiBHcm93cyB0aGUKKyAgICAgKiB7QGNvZGUgQml0U2V0fSBpZiB7QGNvZGUgcG9zMiA+IHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MxCi0gICAgICogICAgICAgICAgICBiZWdpbm5pbmcgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIGJlZ2lubmluZyBwb3NpdGlvbi4KICAgICAgKiBAcGFyYW0gcG9zMgotICAgICAqICAgICAgICAgICAgZW5kaW5nIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICBlbmRpbmcgcG9zaXRpb24uCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBwb3MxIG9yIHBvczIgaXMgbmVnYXRpdmUsIG9yIHdoZW4gcG9zMiBpcyBub3Qgc21hbGxlcgotICAgICAqICAgICAgICAgICAgIHRoYW4gcG9zMQotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwb3MxfSBvciB7QGNvZGUgcG9zMn0gaXMgbmVnYXRpdmUsIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHBvczJ9IGlzIHNtYWxsZXIgdGhhbiB7QGNvZGUgcG9zMX0uCiAgICAgICogQHNlZSAjc2V0KGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IHBvczEsIGludCBwb3MyKSB7CiAgICAgICAgIGlmIChwb3MxID49IDAgJiYgcG9zMiA+PSAwICYmIHBvczIgPj0gcG9zMSkgewpAQCAtMzY1LDIwICszNzgsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBiaXRzIHN0YXJ0aW5nIGZyb20gcG9zMSB0byBwb3MyIHRvIHRoZSBnaXZlbiBib29sZWFuIHZhbHVlLgotICAgICAqIEdyb3dzIHRoZSBCaXRTZXQgaWYgcG9zMiA+IHNpemUuCisgICAgICogU2V0cyB0aGUgYml0cyBzdGFydGluZyBmcm9tIHtAY29kZSBwb3MxfSB0byB7QGNvZGUgcG9zMn0gdG8gdGhlIGdpdmVuCisgICAgICoge0Bjb2RlIHZhbH0uIEdyb3dzIHRoZSB7QGNvZGUgQml0U2V0fSBpZiB7QGNvZGUgcG9zMiA+IHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MxCi0gICAgICogICAgICAgICAgICBiZWdpbm5pbmcgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIGJlZ2lubmluZyBwb3NpdGlvbi4KICAgICAgKiBAcGFyYW0gcG9zMgotICAgICAqICAgICAgICAgICAgZW5kaW5nIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICBlbmRpbmcgcG9zaXRpb24uCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gc2V0IHRoZXNlIGJpdHMKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIHNldCB0aGVzZSBiaXRzLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gcG9zMSBvciBwb3MyIGlzIG5lZ2F0aXZlLCBvciB3aGVuIHBvczIgaXMgbm90IHNtYWxsZXIKLSAgICAgKiAgICAgICAgICAgICB0aGFuIHBvczEKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcG9zMX0gb3Ige0Bjb2RlIHBvczJ9IGlzIG5lZ2F0aXZlLCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBwb3MyfSBpcyBzbWFsbGVyIHRoYW4ge0Bjb2RlIHBvczF9LgogICAgICAqIEBzZWUgI3NldChpbnQsaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldChpbnQgcG9zMSwgaW50IHBvczIsIGJvb2xlYW4gdmFsKSB7CiAgICAgICAgIGlmICh2YWwpIHsKQEAgLTM4OSwxMCArNDAyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIGFsbCB0aGUgYml0cyBpbiB0aGlzIGJpdHNldC4KKyAgICAgKiBDbGVhcnMgYWxsIHRoZSBiaXRzIGluIHRoaXMge0Bjb2RlIEJpdFNldH0uCiAgICAgICogCiAgICAgICogQHNlZSAjY2xlYXIoaW50KQogICAgICAqIEBzZWUgI2NsZWFyKGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpdHMubGVuZ3RoOyBpKyspIHsKQEAgLTQwMSwxNCArNDE1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBiaXQgYXQgaW5kZXggcG9zLiBHcm93cyB0aGUgQml0U2V0IGlmIHBvcyA+IHNpemUuCisgICAgICogQ2xlYXJzIHRoZSBiaXQgYXQgaW5kZXgge0Bjb2RlIHBvc30uIEdyb3dzIHRoZSB7QGNvZGUgQml0U2V0fSBpZgorICAgICAqIHtAY29kZSBwb3MgPiBzaXplfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9zCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGJpdCB0byBjbGVhcgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gY2xlYXIuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBwb3MgPCAwCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBvc30gaXMgbmVnYXRpdmUuCiAgICAgICogQHNlZSAjY2xlYXIoaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXIoaW50IHBvcykgewogICAgICAgICBpZiAocG9zID49IDApIHsKQEAgLTQyMiwxOCArNDM3LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBiaXRzIHN0YXJ0aW5nIGZyb20gcG9zMSB0byBwb3MyLiBHcm93cyB0aGUgQml0U2V0IGlmIHBvczIgPgotICAgICAqIHNpemUuCisgICAgICogQ2xlYXJzIHRoZSBiaXRzIHN0YXJ0aW5nIGZyb20ge0Bjb2RlIHBvczF9IHRvIHtAY29kZSBwb3MyfS4gR3Jvd3MgdGhlCisgICAgICoge0Bjb2RlIEJpdFNldH0gaWYge0Bjb2RlIHBvczIgPiBzaXplfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9zMQotICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICBiZWdpbm5pbmcgcG9zaXRpb24uCiAgICAgICogQHBhcmFtIHBvczIKLSAgICAgKiAgICAgICAgICAgIGVuZGluZyBwb3NpdGlvbgorICAgICAqICAgICAgICAgICAgZW5kaW5nIHBvc2l0aW9uLgogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gcG9zMSBvciBwb3MyIGlzIG5lZ2F0aXZlLCBvciB3aGVuIHBvczIgaXMgbm90IHNtYWxsZXIKLSAgICAgKiAgICAgICAgICAgICB0aGFuIHBvczEKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcG9zMX0gb3Ige0Bjb2RlIHBvczJ9IGlzIG5lZ2F0aXZlLCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBwb3MyfSBpcyBzbWFsbGVyIHRoYW4ge0Bjb2RlIHBvczF9LgogICAgICAqIEBzZWUgI2NsZWFyKGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhcihpbnQgcG9zMSwgaW50IHBvczIpIHsKICAgICAgICAgaWYgKHBvczEgPj0gMCAmJiBwb3MyID49IDAgJiYgcG9zMiA+PSBwb3MxKSB7CkBAIC00NjUsMTQgKzQ4MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsaXBzIHRoZSBiaXQgYXQgaW5kZXggcG9zLiBHcm93cyB0aGUgQml0U2V0IGlmIHBvcyA+IHNpemUuCisgICAgICogRmxpcHMgdGhlIGJpdCBhdCBpbmRleCB7QGNvZGUgcG9zfS4gR3Jvd3MgdGhlIHtAY29kZSBCaXRTZXR9IGlmCisgICAgICoge0Bjb2RlIHBvcyA+IHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGZsaXAKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGZsaXAuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBwb3MgPCAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBvc30gaXMgbmVnYXRpdmUuCiAgICAgICogQHNlZSAjZmxpcChpbnQsIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmbGlwKGludCBwb3MpIHsKICAgICAgICAgaWYgKHBvcyA+PSAwKSB7CkBAIC00ODYsMTggKzUwMiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsaXBzIHRoZSBiaXRzIHN0YXJ0aW5nIGZyb20gcG9zMSB0byBwb3MyLiBHcm93cyB0aGUgQml0U2V0IGlmIHBvczIgPgotICAgICAqIHNpemUuCisgICAgICogRmxpcHMgdGhlIGJpdHMgc3RhcnRpbmcgZnJvbSB7QGNvZGUgcG9zMX0gdG8ge0Bjb2RlIHBvczJ9LiBHcm93cyB0aGUKKyAgICAgKiB7QGNvZGUgQml0U2V0fSBpZiB7QGNvZGUgcG9zMiA+IHNpemV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MxCi0gICAgICogICAgICAgICAgICBiZWdpbm5pbmcgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIGJlZ2lubmluZyBwb3NpdGlvbi4KICAgICAgKiBAcGFyYW0gcG9zMgotICAgICAqICAgICAgICAgICAgZW5kaW5nIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICBlbmRpbmcgcG9zaXRpb24uCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBwb3MxIG9yIHBvczIgaXMgbmVnYXRpdmUsIG9yIHdoZW4gcG9zMiBpcyBub3Qgc21hbGxlcgotICAgICAqICAgICAgICAgICAgIHRoYW4gcG9zMQotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwb3MxfSBvciB7QGNvZGUgcG9zMn0gaXMgbmVnYXRpdmUsIG9yIGlmCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHBvczJ9IGlzIHNtYWxsZXIgdGhhbiB7QGNvZGUgcG9zMX0uCiAgICAgICogQHNlZSAjZmxpcChpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmxpcChpbnQgcG9zMSwgaW50IHBvczIpIHsKICAgICAgICAgaWYgKHBvczEgPj0gMCAmJiBwb3MyID49IDAgJiYgcG9zMiA+PSBwb3MxKSB7CkBAIC01MjgsMTMgKzU0NCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGVzZSB0d28gYml0c2V0cyBoYXZlIGF0IGxlYXN0IG9uZSBiaXQgc2V0IHRvIHRydWUgaW4gdGhlIHNhbWUKKyAgICAgKiBDaGVja3MgaWYgdGhlc2UgdHdvIHtAY29kZSBCaXRTZXR9cyBoYXZlIGF0IGxlYXN0IG9uZSBiaXQgc2V0IHRvIHRydWUgaW4gdGhlIHNhbWUKICAgICAgKiBwb3NpdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnMKLSAgICAgKiAgICAgICAgICAgIEJpdFNldCB1c2VkIHRvIGNhbGN1bGF0ZSBpbnRlcnNlY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJzIGludGVyc2VjdHMgd2l0aCB0aGlzIEJpdFNldCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaXRTZXR9IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBpbnRlcnNlY3Rpb24uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYnMgaW50ZXJzZWN0cyB3aXRoIHRoaXMge0Bjb2RlIEJpdFNldH0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKEJpdFNldCBicykgewogICAgICAgICBsb25nW10gYnNCaXRzID0gYnMuYml0czsKQEAgLTU1OCwxMyArNTc1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGxvZ2ljYWwgQU5EIG9mIHRoaXMgQml0U2V0IHdpdGggYW5vdGhlciBCaXRTZXQuCisgICAgICogUGVyZm9ybXMgdGhlIGxvZ2ljYWwgQU5EIG9mIHRoaXMge0Bjb2RlIEJpdFNldH0gd2l0aCBhbm90aGVyIAorICAgICAqIHtAY29kZSBCaXRTZXR9LiBUaGUgdmFsdWVzIG9mIHRoaXMge0Bjb2RlIEJpdFNldH0gYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJzCi0gICAgICogICAgICAgICAgICBCaXRTZXQgdG8gQU5EIHdpdGgKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaXRTZXR9IHRvIEFORCB3aXRoLgogICAgICAqIEBzZWUgI29yCiAgICAgICogQHNlZSAjeG9yCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAKICAgICBwdWJsaWMgdm9pZCBhbmQoQml0U2V0IGJzKSB7CkBAIC01ODYsMTAgKzYwNCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogQ2xlYXJzIGFsbCBiaXRzIGluIHRoZSByZWNlaXZlciB3aGljaCBhcmUgYWxzbyBzZXQgaW4gdGhlIHBhcmFtZXRlcgotICAgICAqIEJpdFNldC4KKyAgICAgKiB7QGNvZGUgQml0U2V0fS4gVGhlIHZhbHVlcyBvZiB0aGlzIHtAY29kZSBCaXRTZXR9IGFyZSBjaGFuZ2VkIGFjY29yZGluZ2x5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBicwotICAgICAqICAgICAgICAgICAgQml0U2V0IHRvIEFORE5PVCB3aXRoCisgICAgICogICAgICAgICAgICB7QGNvZGUgQml0U2V0fSB0byBBTkROT1Qgd2l0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhbmROb3QoQml0U2V0IGJzKSB7CiAgICAgICAgIGxvbmdbXSBic0JpdHMgPSBicy5iaXRzOwpAQCAtNjAwLDEzICs2MTksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgbG9naWNhbCBPUiBvZiB0aGlzIEJpdFNldCB3aXRoIGFub3RoZXIgQml0U2V0LgorICAgICAqIFBlcmZvcm1zIHRoZSBsb2dpY2FsIE9SIG9mIHRoaXMge0Bjb2RlIEJpdFNldH0gd2l0aCBhbm90aGVyIHtAY29kZSBCaXRTZXR9LgorICAgICAqIFRoZSB2YWx1ZXMgb2YgdGhpcyB7QGNvZGUgQml0U2V0fSBhcmUgY2hhbmdlZCBhY2NvcmRpbmdseS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnMKLSAgICAgKiAgICAgICAgICAgIEJpdFNldCB0byBPUiB3aXRoCi0gICAgICogCisgICAgICogICAgICAgICAgICB7QGNvZGUgQml0U2V0fSB0byBPUiB3aXRoLgogICAgICAqIEBzZWUgI3hvcgogICAgICAqIEBzZWUgI2FuZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9yKEJpdFNldCBicykgewogICAgICAgICBpbnQgbmJpdHMgPSBicy5sZW5ndGgoKTsKQEAgLTYyMSwxMyArNjQxLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGxvZ2ljYWwgWE9SIG9mIHRoaXMgQml0U2V0IHdpdGggYW5vdGhlciBCaXRTZXQuCisgICAgICogUGVyZm9ybXMgdGhlIGxvZ2ljYWwgWE9SIG9mIHRoaXMge0Bjb2RlIEJpdFNldH0gd2l0aCBhbm90aGVyIHtAY29kZSBCaXRTZXR9LgorICAgICAqIFRoZSB2YWx1ZXMgb2YgdGhpcyB7QGNvZGUgQml0U2V0fSBhcmUgY2hhbmdlZCBhY2NvcmRpbmdseS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnMKLSAgICAgKiAgICAgICAgICAgIEJpdFNldCB0byBYT1Igd2l0aAotICAgICAqIAorICAgICAqICAgICAgICAgICAge0Bjb2RlIEJpdFNldH0gdG8gWE9SIHdpdGguCiAgICAgICogQHNlZSAjb3IKICAgICAgKiBAc2VlICNhbmQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB4b3IoQml0U2V0IGJzKSB7CiAgICAgICAgIGludCBuYml0cyA9IGJzLmxlbmd0aCgpOwpAQCAtNjQzLDExICs2NjQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyB0aGlzIGJpdHNldCBoYXMuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhpcyB7QGNvZGUgQml0U2V0fSBoYXMuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJpdHMgY29udGFpbmVkIGluIHRoaXMgQml0U2V0LgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGNvbnRhaW5lZCBpbiB0aGlzIHtAY29kZSBCaXRTZXR9LgogICAgICAqIEBzZWUgI2xlbmd0aAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIGJpdHMubGVuZ3RoICogRUxNX1NJWkU7CkBAIC02NTYsNyArNjc3LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBoaWdoZXN0IGJpdCBzZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBCaXRTZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHtAY29kZSBCaXRTZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogICAgICAgICBpbnQgaWR4ID0gYml0cy5sZW5ndGggLSAxOwpAQCAtNjc4LDcgKzcwMCw4IEBACiAgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgICogcmVjZWl2ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBBIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIHRoZSBpbmRpY2VzIG9mIGFsbCBiaXRzIHRoYXQgYXJlIHNldC4KKyAgICAgKiBAcmV0dXJuIGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIGluZGljZXMgb2YgYWxsIGJpdHMgdGhhdCBhcmUgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC03MDcsMTEgKzczMCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgdGhhdCBpcyB0cnVlIG9uIG9yIGFmdGVyIHBvcworICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgdGhhdCBpcyB7QGNvZGUgdHJ1ZX0gb24gb3IgYWZ0ZXIge0Bjb2RlIHBvc30uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBvcwotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIChpbmNsdXNpdmUpCi0gICAgICogQHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBiaXRzIHRoYXQgYXJlIHNldCB0byB0cnVlIG9uIG9yIGFmdGVyIHBvcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKS4KKyAgICAgKiBAcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIGJpdHMgdGhhdCBhcmUgc2V0IHRvIHtAY29kZSB0cnVlfSBvbiBvciBhZnRlciB7QGNvZGUgcG9zfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IG5leHRTZXRCaXQoaW50IHBvcykgewogICAgICAgICBpZiAocG9zID49IDApIHsKQEAgLTc1MSwxMiArNzc1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCB0aGF0IGlzIGZhbHNlIG9uIG9yIGFmdGVyIHBvcworICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgdGhhdCBpcyB7QGNvZGUgZmFsc2V9IG9uIG9yIGFmdGVyIHtAY29kZSBwb3N9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKQotICAgICAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGJpdCBzZXQgdG8gZmFsc2UsIGV2ZW4gaWYgaXQgaXMgZnVydGhlcgotICAgICAqICAgICAgICAgdGhhbiB0aGlzIGJpdHNldCdzIHNpemUuCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9zaXRpb24gKGluY2x1c2l2ZSkuCisgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgYml0IHNldCB0byB7QGNvZGUgZmFsc2V9LCBldmVuIGlmIGl0IGlzIGZ1cnRoZXIKKyAgICAgKiAgICAgICAgIHRoYW4gdGhpcyB7QGNvZGUgQml0U2V0fSdzIHNpemUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0Q2xlYXJCaXQoaW50IHBvcykgewogICAgICAgICBpZiAocG9zID49IDApIHsKQEAgLTc5NywxMCArODIyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFsbCB0aGUgYml0cyBpbiB0aGlzIGJpdHNldCBhcmUgc2V0IHRvIGZhbHNlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIGJpdHMgaW4gdGhpcyB7QGNvZGUgQml0U2V0fSBhcmUgc2V0IHRvIGZhbHNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEJpdFNldCBpcyBlbXB0eSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIEJpdFNldH0gaXMgZW1wdHksCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewogICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBiaXRzLmxlbmd0aDsgaWR4KyspIHsKQEAgLTgxMyw5ICs4MzksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGFyZSB0cnVlIGluIHRoaXMgYml0c2V0LgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgYXJlIHtAY29kZSB0cnVlfSBpbiB0aGlzIHtAY29kZSBCaXRTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0cnVlIGJpdHMgaW4gdGhlIHNldAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB7QGNvZGUgdHJ1ZX0gYml0cyBpbiB0aGUgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2FyZGluYWxpdHkoKSB7CiAgICAgICAgIGludCBjb3VudCA9IDA7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NhbGVuZGFyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NhbGVuZGFyLmphdmEKaW5kZXggYmY1NDY5NC4uOTg4NDBiMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9DYWxlbmRhci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ2FsZW5kYXIuamF2YQpAQCAtMTQsNiArMTQsMTIgQEAKICAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KIAogcGFja2FnZSBqYXZhLnV0aWw7CiAKQEAgLTI0LDE1ICszMCwyODUgQEAKIGltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIC8qKgotICogQ2FsZW5kYXIgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiBEYXRlcyBhbmQKLSAqIGludGVnZXIgY2FsZW5kYXIgZmllbGRzLCBzdWNoIGFzIHRoZSBtb250aCwgeWVhciBvciBtaW51dGUuIFN1YmNsYXNzZXMgb2YKLSAqIHRoaXMgY2xhc3MgaW1wbGVtZW50IGEgc3BlY2lmaWMgY2FsZW5kYXIgdHlwZSwgc3VjaCBhcyB0aGUgZ3JlZ29yaWFuCi0gKiBjYWxlbmRhci4KKyAqIHtAY29kZSBDYWxlbmRhcn0gaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGEKKyAqIHtAY29kZSBEYXRlfSBvYmplY3QgYW5kIGEgc2V0IG9mIGludGVnZXIgZmllbGRzIHN1Y2ggYXMKKyAqIHtAY29kZSBZRUFSfSwge0Bjb2RlIE1PTlRIfSwge0Bjb2RlIERBWX0sCisgKiB7QGNvZGUgSE9VUn0sIGFuZCBzbyBvbi4gKEEge0Bjb2RlIERhdGV9IG9iamVjdCByZXByZXNlbnRzIGEKKyAqIHNwZWNpZmljIGluc3RhbnQgaW4gdGltZSB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi4gU2VlIHtAbGluayBEYXRlfSBmb3IKKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGNvZGUgRGF0ZX0gY2xhc3MuKQorICogCisgKiA8cD4KKyAqIFN1YmNsYXNzZXMgb2Yge0Bjb2RlIENhbGVuZGFyfSBpbnRlcnByZXQgYSB7QGNvZGUgRGF0ZX0KKyAqIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgYSBzcGVjaWZpYyBjYWxlbmRhciBzeXN0ZW0uCisgKiAKKyAqIDxwPgorICogTGlrZSBvdGhlciBsb2NhbGUtc2Vuc2l0aXZlIGNsYXNzZXMsIHtAY29kZSBDYWxlbmRhcn0gcHJvdmlkZXMgYSBjbGFzcworICogbWV0aG9kLCB7QGNvZGUgZ2V0SW5zdGFuY2V9LCBmb3IgZ2V0dGluZyBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YKKyAqIHRoaXMgY2xhc3MgZm9yIGdlbmVyYWwgdXNlLiB7QGNvZGUgQ2FsZW5kYXJ9J3Mge0Bjb2RlIGdldEluc3RhbmNlfSBtZXRob2QKKyAqIHJldHVybnMgYSBjYWxlbmRhciB3aG9zZSBsb2NhbGUgaXMgYmFzZWQgb24gc3lzdGVtIHNldHRpbmdzIGFuZCB3aG9zZSB0aW1lIGZpZWxkcworICogaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZTogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+Q2FsZW5kYXIgcmlnaHROb3cgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIAorICogPHA+CisgKiBBIHtAY29kZSBDYWxlbmRhcn0gb2JqZWN0IGNhbiBwcm9kdWNlIGFsbCB0aGUgdGltZSBmaWVsZCB2YWx1ZXMgbmVlZGVkCisgKiB0byBpbXBsZW1lbnQgdGhlIGRhdGUtdGltZSBmb3JtYXR0aW5nIGZvciBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgYW5kIGNhbGVuZGFyCisgKiBzdHlsZSAoZm9yIGV4YW1wbGUsIEphcGFuZXNlLUdyZWdvcmlhbiwgSmFwYW5lc2UtVHJhZGl0aW9uYWwpLgorICoge0Bjb2RlIENhbGVuZGFyfSBkZWZpbmVzIHRoZSByYW5nZSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgY2VydGFpbgorICogZmllbGRzLCBhcyB3ZWxsIGFzIHRoZWlyIG1lYW5pbmcuIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgbW9udGggb2YgdGhlIHllYXIKKyAqIGhhcyB2YWx1ZSB7QGNvZGUgTU9OVEh9ID09IHtAY29kZSBKQU5VQVJZfSBmb3IgYWxsIGNhbGVuZGFycy4KKyAqIE90aGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBieSB0aGUgY29uY3JldGUgc3ViY2xhc3MsIHN1Y2ggYXMge0Bjb2RlIEVSQX0KKyAqIGFuZCB7QGNvZGUgWUVBUn0uIFNlZSBpbmRpdmlkdWFsIGZpZWxkIGRvY3VtZW50YXRpb24gYW5kIHN1YmNsYXNzCisgKiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorICogCisgKiA8cD4KKyAqIFdoZW4gYSB7QGNvZGUgQ2FsZW5kYXJ9IGlzIDxlbT5sZW5pZW50PC9lbT4sIGl0IGFjY2VwdHMgYSB3aWRlcgorICogcmFuZ2Ugb2YgZmllbGQgdmFsdWVzIHRoYW4gaXQgcHJvZHVjZXMuIEZvciBleGFtcGxlLCBhIGxlbmllbnQKKyAqIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gaW50ZXJwcmV0cyB7QGNvZGUgTU9OVEh9ID09CisgKiB7QGNvZGUgSkFOVUFSWX0sIHtAY29kZSBEQVlfT0ZfTU9OVEh9ID09IDMyIGFzIEZlYnJ1YXJ5IDEuIEEKKyAqIG5vbi1sZW5pZW50IHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGdpdmVuCisgKiBvdXQtb2YtcmFuZ2UgZmllbGQgc2V0dGluZ3MuIFdoZW4gY2FsZW5kYXJzIHJlY29tcHV0ZSBmaWVsZCB2YWx1ZXMgZm9yIHJldHVybgorICogYnkge0Bjb2RlIGdldCgpfSwgdGhleSBub3JtYWxpemUgdGhlbS4gRm9yIGV4YW1wbGUsIGEKKyAqIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gYWx3YXlzIHByb2R1Y2VzIHtAY29kZSBEQVlfT0ZfTU9OVEh9CisgKiB2YWx1ZXMgYmV0d2VlbiAxIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aC4KKyAqIAorICogPHA+CisgKiB7QGNvZGUgQ2FsZW5kYXJ9IGRlZmluZXMgYSBsb2NhbGUtc3BlY2lmaWMgc2V2ZW4gZGF5IHdlZWsgdXNpbmcgdHdvCisgKiBwYXJhbWV0ZXJzOiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGFuZCB0aGUgbWluaW1hbCBkYXlzIGluIGZpcnN0IHdlZWsKKyAqIChmcm9tIDEgdG8gNykuIFRoZXNlIG51bWJlcnMgYXJlIHRha2VuIGZyb20gdGhlIGxvY2FsZSByZXNvdXJjZSBkYXRhIHdoZW4gYQorICoge0Bjb2RlIENhbGVuZGFyfSBpcyBjb25zdHJ1Y3RlZC4gVGhleSBtYXkgYWxzbyBiZSBzcGVjaWZpZWQgZXhwbGljaXRseQorICogdGhyb3VnaCB0aGUgQVBJLgorICogCisgKiA8cD4KKyAqIFdoZW4gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB7QGNvZGUgV0VFS19PRl9NT05USH0gb3IKKyAqIHtAY29kZSBXRUVLX09GX1lFQVJ9IGZpZWxkcywge0Bjb2RlIENhbGVuZGFyfSBtdXN0IGRldGVybWluZQorICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIG1vbnRoIG9yIHllYXIgYXMgYSByZWZlcmVuY2UgcG9pbnQuIFRoZSBmaXJzdCB3ZWVrIG9mIGEKKyAqIG1vbnRoIG9yIHllYXIgaXMgZGVmaW5lZCBhcyB0aGUgZWFybGllc3Qgc2V2ZW4gZGF5IHBlcmlvZCBiZWdpbm5pbmcgb24KKyAqIHtAY29kZSBnZXRGaXJzdERheU9mV2VlaygpfSBhbmQgY29udGFpbmluZyBhdCBsZWFzdAorICoge0Bjb2RlIGdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKX0gZGF5cyBvZiB0aGF0IG1vbnRoIG9yIHllYXIuIFdlZWtzCisgKiBudW1iZXJlZCAuLi4sIC0xLCAwIHByZWNlZGUgdGhlIGZpcnN0IHdlZWs7IHdlZWtzIG51bWJlcmVkIDIsIDMsLi4uIGZvbGxvdworICogaXQuIE5vdGUgdGhhdCB0aGUgbm9ybWFsaXplZCBudW1iZXJpbmcgcmV0dXJuZWQgYnkge0Bjb2RlIGdldCgpfSBtYXkKKyAqIGJlIGRpZmZlcmVudC4gRm9yIGV4YW1wbGUsIGEgc3BlY2lmaWMge0Bjb2RlIENhbGVuZGFyfSBzdWJjbGFzcyBtYXkKKyAqIGRlc2lnbmF0ZSB0aGUgd2VlayBiZWZvcmUgd2VlayAxIG9mIGEgeWVhciBhcyB3ZWVrIDxlbT5uPC9lbT4gb2YgdGhlCisgKiBwcmV2aW91cyB5ZWFyLgorICogCisgKiA8cD4KKyAqIFdoZW4gY29tcHV0aW5nIGEge0Bjb2RlIERhdGV9IGZyb20gdGltZSBmaWVsZHMsIHR3byBzcGVjaWFsCisgKiBjaXJjdW1zdGFuY2VzIG1heSBhcmlzZTogdGhlcmUgbWF5IGJlIGluc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBjb21wdXRlIHRoZQorICoge0Bjb2RlIERhdGV9IChzdWNoIGFzIG9ubHkgeWVhciBhbmQgbW9udGggYnV0IG5vIGRheSBpbiB0aGUgbW9udGgpLCBvcgorICogdGhlcmUgbWF5IGJlIGluY29uc2lzdGVudCBpbmZvcm1hdGlvbiAoc3VjaCBhcyAiVHVlc2RheSwgSnVseSAxNSwgMTk5NiIgLS0KKyAqIEp1bHkgMTUsIDE5OTYgaXMgYWN0dWFsbHkgYSBNb25kYXkpLgorICogCisgKiA8cD4KKyAqIDxzdHJvbmc+SW5zdWZmaWNpZW50IGluZm9ybWF0aW9uLjwvc3Ryb25nPiBUaGUgY2FsZW5kYXIgd2lsbCB1c2UgZGVmYXVsdAorICogaW5mb3JtYXRpb24gdG8gc3BlY2lmeSB0aGUgbWlzc2luZyBmaWVsZHMuIFRoaXMgbWF5IHZhcnkgYnkgY2FsZW5kYXI7IGZvciB0aGUKKyAqIEdyZWdvcmlhbiBjYWxlbmRhciwgdGhlIGRlZmF1bHQgZm9yIGEgZmllbGQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgc3RhcnQKKyAqIG9mIHRoZSBlcG9jaDogaS5lLiwgWUVBUiA9IDE5NzAsIE1PTlRIID0gSkFOVUFSWSwgREFURSA9IDEsIGV0Yy4KKyAqIAorICogPHA+CisgKiA8c3Ryb25nPkluY29uc2lzdGVudCBpbmZvcm1hdGlvbi48L3N0cm9uZz4gSWYgZmllbGRzIGNvbmZsaWN0LCB0aGUgY2FsZW5kYXIKKyAqIHdpbGwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGZpZWxkcyBzZXQgbW9yZSByZWNlbnRseS4gRm9yIGV4YW1wbGUsIHdoZW4KKyAqIGRldGVybWluaW5nIHRoZSBkYXksIHRoZSBjYWxlbmRhciB3aWxsIGxvb2sgZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiBjb21iaW5hdGlvbnMgb2YgZmllbGRzLiBUaGUgbW9zdCByZWNlbnQgY29tYmluYXRpb24sIGFzIGRldGVybWluZWQgYnkgdGhlCisgKiBtb3N0IHJlY2VudGx5IHNldCBzaW5nbGUgZmllbGQsIHdpbGwgYmUgdXNlZC4KKyAqIAorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBNT05USCArIERBWV9PRl9NT05USAorICogTU9OVEggKyBXRUVLX09GX01PTlRIICsgREFZX09GX1dFRUsKKyAqIE1PTlRIICsgREFZX09GX1dFRUtfSU5fTU9OVEggKyBEQVlfT0ZfV0VFSworICogREFZX09GX1lFQVIKKyAqIERBWV9PRl9XRUVLICsgV0VFS19PRl9ZRUFSPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIAorICogRm9yIHRoZSB0aW1lIG9mIGRheToKKyAqIAorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBIT1VSX09GX0RBWQorICogQU1fUE0gKyBIT1VSPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIAorICogPHA+CisgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZXJlIGFyZSBjZXJ0YWluIHBvc3NpYmxlIGFtYmlndWl0aWVzIGluCisgKiBpbnRlcnByZXRhdGlvbiBvZiBjZXJ0YWluIHNpbmd1bGFyIHRpbWVzLCB3aGljaCBhcmUgcmVzb2x2ZWQgaW4gdGhlIGZvbGxvd2luZworICogd2F5czoKKyAqIDxvbD4KKyAqIDxsaT4gMjQ6MDA6MDAgImJlbG9uZ3MiIHRvIHRoZSBmb2xsb3dpbmcgZGF5LiBUaGF0IGlzLCAyMzo1OSBvbiBEZWMgMzEsIDE5NjkKKyAqICZsdDsgMjQ6MDAgb24gSmFuIDEsIDE5NzAgJmx0OyAyNDowMTowMCBvbiBKYW4gMSwgMTk3MCBmb3JtIGEgc2VxdWVuY2Ugb2YgCisgKiB0aHJlZSBjb25zZWN1dGl2ZSBtaW51dGVzIGluIHRpbWUuIAorICogCisgKiA8bGk+IEFsdGhvdWdoIGhpc3RvcmljYWxseSBub3QgcHJlY2lzZSwgbWlkbmlnaHQgYWxzbyBiZWxvbmdzIHRvICJhbSIsIGFuZAorICogbm9vbiBiZWxvbmdzIHRvICJwbSIsIHNvIG9uIHRoZSBzYW1lIGRheSwgd2UgaGF2ZSAxMjowMCBhbSAobWlkbmlnaHQpICZsdDsgMTI6MDEgYW0sCisgKiBhbmQgMTI6MDAgcG0gKG5vb24pICZsdDsgMTI6MDEgcG0KKyAqIDwvb2w+CisgKiAKKyAqIDxwPgorICogVGhlIGRhdGUgb3IgdGltZSBmb3JtYXQgc3RyaW5ncyBhcmUgbm90IHBhcnQgb2YgdGhlIGRlZmluaXRpb24gb2YgYSBjYWxlbmRhciwKKyAqIGFzIHRob3NlIG11c3QgYmUgbW9kaWZpYWJsZSBvciBvdmVycmlkYWJsZSBieSB0aGUgdXNlciBhdCBydW50aW1lLiBVc2UKKyAqIHtAbGluayBqYXZhLnRleHQuRGF0ZUZvcm1hdH0gdG8gZm9ybWF0IGRhdGVzLgorICogCisgKiA8cD4KKyAqIDxzdHJvbmc+RmllbGQgbWFuaXB1bGF0aW9uIG1ldGhvZHM8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIAorICogPHA+CisgKiB7QGNvZGUgQ2FsZW5kYXJ9IGZpZWxkcyBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aHJlZSBtZXRob2RzOgorICoge0Bjb2RlIHNldCgpfSwge0Bjb2RlIGFkZCgpfSwgYW5kIHtAY29kZSByb2xsKCl9LgorICogPC9wPgorICogCisgKiA8cD4KKyAqIDxzdHJvbmc+e0Bjb2RlIHNldChmLCB2YWx1ZSl9PC9zdHJvbmc+IGNoYW5nZXMgZmllbGQge0Bjb2RlIGZ9CisgKiB0byB7QGNvZGUgdmFsdWV9LiBJbiBhZGRpdGlvbiwgaXQgc2V0cyBhbiBpbnRlcm5hbCBtZW1iZXIgdmFyaWFibGUgdG8KKyAqIGluZGljYXRlIHRoYXQgZmllbGQge0Bjb2RlIGZ9IGhhcyBiZWVuIGNoYW5nZWQuIEFsdGhvdWdoIGZpZWxkCisgKiB7QGNvZGUgZn0gaXMgY2hhbmdlZCBpbW1lZGlhdGVseSwgdGhlIGNhbGVuZGFyJ3MgbWlsbGlzZWNvbmRzIGlzIG5vdAorICogcmVjb21wdXRlZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHtAY29kZSBnZXQoKX0sCisgKiB7QGNvZGUgZ2V0VGltZSgpfSwgb3Ige0Bjb2RlIGdldFRpbWVJbk1pbGxpcygpfSBpcyBtYWRlLiBUaHVzLAorICogbXVsdGlwbGUgY2FsbHMgdG8ge0Bjb2RlIHNldCgpfSBkbyBub3QgdHJpZ2dlciBtdWx0aXBsZSwgdW5uZWNlc3NhcnkKKyAqIGNvbXB1dGF0aW9ucy4gQXMgYSByZXN1bHQgb2YgY2hhbmdpbmcgYSBmaWVsZCB1c2luZyB7QGNvZGUgc2V0KCl9LAorICogb3RoZXIgZmllbGRzIG1heSBhbHNvIGNoYW5nZSwgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCwgdGhlIGZpZWxkIHZhbHVlLCBhbmQKKyAqIHRoZSBjYWxlbmRhciBzeXN0ZW0uIEluIGFkZGl0aW9uLCB7QGNvZGUgZ2V0KGYpfSB3aWxsIG5vdCBuZWNlc3NhcmlseQorICogcmV0dXJuIHtAY29kZSB2YWx1ZX0gYWZ0ZXIgdGhlIGZpZWxkcyBoYXZlIGJlZW4gcmVjb21wdXRlZC4gVGhlCisgKiBzcGVjaWZpY3MgYXJlIGRldGVybWluZWQgYnkgdGhlIGNvbmNyZXRlIGNhbGVuZGFyIGNsYXNzLgorICogPC9wPgorICogCisgKiA8cD4KKyAqIDxlbT5FeGFtcGxlPC9lbT46IENvbnNpZGVyIGEge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyfSBvcmlnaW5hbGx5CisgKiBzZXQgdG8gQXVndXN0IDMxLCAxOTk5LiBDYWxsaW5nIDxjb2RlPnNldChDYWxlbmRhci5NT05USCwKKyAqIENhbGVuZGFyLlNFUFRFTUJFUik8L2NvZGU+CisgKiBzZXRzIHRoZSBjYWxlbmRhciB0byBTZXB0ZW1iZXIgMzEsIDE5OTkuIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaW50ZXJuYWwKKyAqIHJlcHJlc2VudGF0aW9uIHRoYXQgcmVzb2x2ZXMgdG8gT2N0b2JlciAxLCAxOTk5IGlmIHtAY29kZSBnZXRUaW1lKCl9aXMKKyAqIHRoZW4gY2FsbGVkLiBIb3dldmVyLCBhIGNhbGwgdG8ge0Bjb2RlIHNldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIDMwKX0KKyAqIGJlZm9yZSB0aGUgY2FsbCB0byB7QGNvZGUgZ2V0VGltZSgpfSBzZXRzIHRoZSBjYWxlbmRhciB0byBTZXB0ZW1iZXIKKyAqIDMwLCAxOTk5LCBzaW5jZSBubyByZWNvbXB1dGF0aW9uIG9jY3VycyBhZnRlciB7QGNvZGUgc2V0KCl9IGl0c2VsZi4KKyAqIDwvcD4KKyAqIAorICogPHA+CisgKiA8c3Ryb25nPntAY29kZSBhZGQoZiwgZGVsdGEpfTwvc3Ryb25nPiBhZGRzIHtAY29kZSBkZWx0YX0gdG8KKyAqIGZpZWxkIHtAY29kZSBmfS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+c2V0KGYsCisgKiBnZXQoZikgKyBkZWx0YSk8L2NvZGU+CisgKiB3aXRoIHR3byBhZGp1c3RtZW50czoKKyAqIDwvcD4KKyAqIAorICogPGJsb2NrcXVvdGU+CisgKiA8cD4KKyAqIDxzdHJvbmc+QWRkIHJ1bGUgMTwvc3Ryb25nPi4gVGhlIHZhbHVlIG9mIGZpZWxkIHtAY29kZSBmfSBhZnRlciB0aGUKKyAqIGNhbGwgbWludXMgdGhlIHZhbHVlIG9mIGZpZWxkIHtAY29kZSBmfSBiZWZvcmUgdGhlIGNhbGwgaXMKKyAqIHtAY29kZSBkZWx0YX0sIG1vZHVsbyBhbnkgb3ZlcmZsb3cgdGhhdCBoYXMgb2NjdXJyZWQgaW4gZmllbGQKKyAqIHtAY29kZSBmfS4gT3ZlcmZsb3cgb2NjdXJzIHdoZW4gYSBmaWVsZCB2YWx1ZSBleGNlZWRzIGl0cyByYW5nZSBhbmQsCisgKiBhcyBhIHJlc3VsdCwgdGhlIG5leHQgbGFyZ2VyIGZpZWxkIGlzIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkIGFuZCB0aGUKKyAqIGZpZWxkIHZhbHVlIGlzIGFkanVzdGVkIGJhY2sgaW50byBpdHMgcmFuZ2UuCisgKiA8L3A+CisgKiAKKyAqIDxwPgorICogPHN0cm9uZz5BZGQgcnVsZSAyPC9zdHJvbmc+LiBJZiBhIHNtYWxsZXIgZmllbGQgaXMgZXhwZWN0ZWQgdG8gYmUgaW52YXJpYW50LAorICogYnV0ICZuYnNwOyBpdCBpcyBpbXBvc3NpYmxlIGZvciBpdCB0byBiZSBlcXVhbCB0byBpdHMgcHJpb3IgdmFsdWUgYmVjYXVzZSBvZgorICogY2hhbmdlcyBpbiBpdHMgbWluaW11bSBvciBtYXhpbXVtIGFmdGVyIGZpZWxkIHtAY29kZSBmfSBpcyBjaGFuZ2VkLAorICogdGhlbiBpdHMgdmFsdWUgaXMgYWRqdXN0ZWQgdG8gYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLgorICogQSBzbWFsbGVyIGZpZWxkIHJlcHJlc2VudHMgYSBzbWFsbGVyIHVuaXQgb2YgdGltZS4ge0Bjb2RlIEhPVVJ9IGlzIGEKKyAqIHNtYWxsZXIgZmllbGQgdGhhbiB7QGNvZGUgREFZX09GX01PTlRIfS4gTm8gYWRqdXN0bWVudCBpcyBtYWRlIHRvCisgKiBzbWFsbGVyIGZpZWxkcyB0aGF0IGFyZSBub3QgZXhwZWN0ZWQgdG8gYmUgaW52YXJpYW50LiBUaGUgY2FsZW5kYXIgc3lzdGVtCisgKiBkZXRlcm1pbmVzIHdoYXQgZmllbGRzIGFyZSBleHBlY3RlZCB0byBiZSBpbnZhcmlhbnQuCisgKiA8L3A+CisgKiA8L2Jsb2NrcXVvdGU+CisgKiAKKyAqIDxwPgorICogSW4gYWRkaXRpb24sIHVubGlrZSB7QGNvZGUgc2V0KCl9LCB7QGNvZGUgYWRkKCl9IGZvcmNlcyBhbgorICogaW1tZWRpYXRlIHJlY29tcHV0YXRpb24gb2YgdGhlIGNhbGVuZGFyJ3MgbWlsbGlzZWNvbmRzIGFuZCBhbGwgZmllbGRzLgorICogPC9wPgorICogCisgKiA8cD4KKyAqIDxlbT5FeGFtcGxlPC9lbT46IENvbnNpZGVyIGEge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyfSBvcmlnaW5hbGx5CisgKiBzZXQgdG8gQXVndXN0IDMxLCAxOTk5LiBDYWxsaW5nIHtAY29kZSBhZGQoQ2FsZW5kYXIuTU9OVEgsIDEzKX0gc2V0cworICogdGhlIGNhbGVuZGFyIHRvIFNlcHRlbWJlciAzMCwgMjAwMC4gPHN0cm9uZz5BZGQgcnVsZSAxPC9zdHJvbmc+IHNldHMgdGhlCisgKiB7QGNvZGUgTU9OVEh9IGZpZWxkIHRvIFNlcHRlbWJlciwgc2luY2UgYWRkaW5nIDEzIG1vbnRocyB0byBBdWd1c3QKKyAqIGdpdmVzIFNlcHRlbWJlciBvZiB0aGUgbmV4dCB5ZWFyLiBTaW5jZSB7QGNvZGUgREFZX09GX01PTlRIfSBjYW5ub3QgYmUKKyAqIDMxIGluIFNlcHRlbWJlciBpbiBhIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0sIDxzdHJvbmc+YWRkIHJ1bGUgMjwvc3Ryb25nPgorICogc2V0cyB0aGUge0Bjb2RlIERBWV9PRl9NT05USH0gdG8gMzAsIHRoZSBjbG9zZXN0IHBvc3NpYmxlIHZhbHVlLgorICogQWx0aG91Z2ggaXQgaXMgYSBzbWFsbGVyIGZpZWxkLCB7QGNvZGUgREFZX09GX1dFRUt9IGlzIG5vdCBhZGp1c3RlZCBieQorICogcnVsZSAyLCBzaW5jZSBpdCBpcyBleHBlY3RlZCB0byBjaGFuZ2Ugd2hlbiB0aGUgbW9udGggY2hhbmdlcyBpbiBhCisgKiB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9LgorICogPC9wPgorICogCisgKiA8cD4KKyAqIDxzdHJvbmc+e0Bjb2RlIHJvbGwoZiwgZGVsdGEpfTwvc3Ryb25nPiBhZGRzIHtAY29kZSBkZWx0YX0gdG8KKyAqIGZpZWxkIHtAY29kZSBmfSB3aXRob3V0IGNoYW5naW5nIGxhcmdlciBmaWVsZHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICogY2FsbGluZyB7QGNvZGUgYWRkKGYsIGRlbHRhKX0gd2l0aCB0aGUgZm9sbG93aW5nIGFkanVzdG1lbnQ6CisgKiA8L3A+CisgKiAKKyAqIDxibG9ja3F1b3RlPgorICogPHA+CisgKiA8c3Ryb25nPlJvbGwgcnVsZTwvc3Ryb25nPi4gTGFyZ2VyIGZpZWxkcyBhcmUgdW5jaGFuZ2VkIGFmdGVyIHRoZSBjYWxsLiBBCisgKiBsYXJnZXIgZmllbGQgcmVwcmVzZW50cyBhIGxhcmdlciB1bml0IG9mIHRpbWUuIHtAY29kZSBEQVlfT0ZfTU9OVEh9IGlzCisgKiBhIGxhcmdlciBmaWVsZCB0aGFuIHtAY29kZSBIT1VSfS4KKyAqIDwvcD4KKyAqIDwvYmxvY2txdW90ZT4KKyAqIAorICogPHA+CisgKiA8ZW0+RXhhbXBsZTwvZW0+OiBDb25zaWRlciBhIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gb3JpZ2luYWxseQorICogc2V0IHRvIEF1Z3VzdCAzMSwgMTk5OS4gQ2FsbGluZyA8Y29kZT5yb2xsKENhbGVuZGFyLk1PTlRILAorICogOCk8L2NvZGU+IHNldHMKKyAqIHRoZSBjYWxlbmRhciB0byBBcHJpbCAzMCwgPHN0cm9uZz4xOTk5PC9zdHJvbmc+LiBBZGQgcnVsZSAxIHNldHMgdGhlCisgKiB7QGNvZGUgTU9OVEh9IGZpZWxkIHRvIEFwcmlsLiBVc2luZyBhIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0sCisgKiB0aGUge0Bjb2RlIERBWV9PRl9NT05USH0gY2Fubm90IGJlIDMxIGluIHRoZSBtb250aCBBcHJpbC4gQWRkIHJ1bGUgMgorICogc2V0cyBpdCB0byB0aGUgY2xvc2VzdCBwb3NzaWJsZSB2YWx1ZSwgMzAuIEZpbmFsbHksIHRoZSA8c3Ryb25nPnJvbGwgcnVsZTwvc3Ryb25nPgorICogbWFpbnRhaW5zIHRoZSB7QGNvZGUgWUVBUn0gZmllbGQgdmFsdWUgb2YgMTk5OS4KKyAqIDwvcD4KKyAqIAorICogPHA+CisgKiA8ZW0+RXhhbXBsZTwvZW0+OiBDb25zaWRlciBhIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gb3JpZ2luYWxseQorICogc2V0IHRvIFN1bmRheSBKdW5lIDYsIDE5OTkuIENhbGxpbmcKKyAqIHtAY29kZSByb2xsKENhbGVuZGFyLldFRUtfT0ZfTU9OVEgsIC0xKX0gc2V0cyB0aGUgY2FsZW5kYXIgdG8gVHVlc2RheQorICogSnVuZSAxLCAxOTk5LCB3aGVyZWFzIGNhbGxpbmcge0Bjb2RlIGFkZChDYWxlbmRhci5XRUVLX09GX01PTlRILCAtMSl9CisgKiBzZXRzIHRoZSBjYWxlbmRhciB0byBTdW5kYXkgTWF5IDMwLCAxOTk5LiBUaGlzIGlzIGJlY2F1c2UgdGhlIHJvbGwgcnVsZQorICogaW1wb3NlcyBhbiBhZGRpdGlvbmFsIGNvbnN0cmFpbnQ6IFRoZSB7QGNvZGUgTU9OVEh9IG11c3Qgbm90IGNoYW5nZQorICogd2hlbiB0aGUge0Bjb2RlIFdFRUtfT0ZfTU9OVEh9IGlzIHJvbGxlZC4gVGFrZW4gdG9nZXRoZXIgd2l0aCBhZGQgcnVsZQorICogMSwgdGhlIHJlc3VsdGFudCBkYXRlIG11c3QgYmUgYmV0d2VlbiBUdWVzZGF5IEp1bmUgMSBhbmQgU2F0dXJkYXkgSnVuZSA1LgorICogQWNjb3JkaW5nIHRvIGFkZCBydWxlIDIsIHRoZSB7QGNvZGUgREFZX09GX1dFRUt9LCBhbiBpbnZhcmlhbnQgd2hlbgorICogY2hhbmdpbmcgdGhlIHtAY29kZSBXRUVLX09GX01PTlRIfSwgaXMgc2V0IHRvIFR1ZXNkYXksIHRoZSBjbG9zZXN0CisgKiBwb3NzaWJsZSB2YWx1ZSB0byBTdW5kYXkgKHdoZXJlIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKS4KKyAqIDwvcD4KKyAqIAorICogPHA+CisgKiA8c3Ryb25nPlVzYWdlIG1vZGVsPC9zdHJvbmc+LiBUbyBtb3RpdmF0ZSB0aGUgYmVoYXZpb3Igb2Yge0Bjb2RlIGFkZCgpfQorICogYW5kIHtAY29kZSByb2xsKCl9LCBjb25zaWRlciBhIHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudCB3aXRoCisgKiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGZvciB0aGUgbW9udGgsIGRheSwgYW5kIHllYXIsIGFuZCBhbgorICogdW5kZXJseWluZyB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9LiBJZiB0aGUgaW50ZXJmYWNlIHJlYWRzIEphbnVhcnkKKyAqIDMxLCAxOTk5IGFuZCB0aGUgdXNlciBwcmVzc2VzIHRoZSBtb250aCBpbmNyZW1lbnQgYnV0dG9uLCB3aGF0IHNob3VsZCBpdAorICogcmVhZD8gSWYgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gdXNlcyB7QGNvZGUgc2V0KCl9LCBpdCBtaWdodAorICogcmVhZCBNYXJjaCAzLCAxOTk5LiBBIGJldHRlciByZXN1bHQgd291bGQgYmUgRmVicnVhcnkgMjgsIDE5OTkuIEZ1cnRoZXJtb3JlLAorICogaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgbW9udGggaW5jcmVtZW50IGJ1dHRvbiBhZ2FpbiwgaXQgc2hvdWxkIHJlYWQgTWFyY2gKKyAqIDMxLCAxOTk5LCBub3QgTWFyY2ggMjgsIDE5OTkuIEJ5IHNhdmluZyB0aGUgb3JpZ2luYWwgZGF0ZSBhbmQgdXNpbmcgZWl0aGVyCisgKiB7QGNvZGUgYWRkKCl9IG9yIHtAY29kZSByb2xsKCl9LCBkZXBlbmRpbmcgb24gd2hldGhlciBsYXJnZXIKKyAqIGZpZWxkcyBzaG91bGQgYmUgYWZmZWN0ZWQsIHRoZSB1c2VyIGludGVyZmFjZSBjYW4gYmVoYXZlIGFzIG1vc3QgdXNlcnMgd2lsbAorICogaW50dWl0aXZlbHkgZXhwZWN0LgorICogPC9wPgorICogCisgKiA8cD4KKyAqIDxiPk5vdGU6PC9iPiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2Uge0Bjb2RlIHJvbGx9IGFuZCB7QGNvZGUgYWRkfSByYXRoZXIgdGhhbgorICogYXR0ZW1wdGluZyB0byBwZXJmb3JtIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBkaXJlY3RseSBvbiB0aGUgZmllbGRzIG9mIGEKKyAqIDx0dD5DYWxlbmRhcjwvdHQ+LiBJdCBpcyBxdWl0ZSBwb3NzaWJsZSBmb3IgPHR0PkNhbGVuZGFyPC90dD4gc3ViY2xhc3NlcworICogdG8gaGF2ZSBmaWVsZHMgd2l0aCBub24tbGluZWFyIGJlaGF2aW9yLCBmb3IgZXhhbXBsZSBtaXNzaW5nIG1vbnRocyBvciBkYXlzCisgKiBkdXJpbmcgbm9uLWxlYXAgeWVhcnMuIFRoZSBzdWJjbGFzc2VzJyA8dHQ+YWRkPC90dD4gYW5kIDx0dD5yb2xsPC90dD4KKyAqIG1ldGhvZHMgd2lsbCB0YWtlIHRoaXMgaW50byBhY2NvdW50LCB3aGlsZSBzaW1wbGUgYXJpdGhtZXRpYyBtYW5pcHVsYXRpb25zCisgKiBtYXkgZ2l2ZSBpbnZhbGlkIHJlc3VsdHMuCiAgKiAKICAqIEBzZWUgRGF0ZQogICogQHNlZSBHcmVnb3JpYW5DYWxlbmRhcgogICogQHNlZSBUaW1lWm9uZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYWxlbmRhciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLAogICAgICAgICBDb21wYXJhYmxlPENhbGVuZGFyPiB7CkBAIC00MCwzMCArMzE2LDQwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE4MDc1NDc1MDU4MjE1OTA2NDJMOwogCiAgICAgLyoqCi0gICAgICogU2V0IHRvIHRydWUgd2hlbiB0aGUgY2FsZW5kYXIgZmllbGRzIGhhdmUgYmVlbiBzZXQgZnJvbSB0aGUgdGltZSwgc2V0IHRvCi0gICAgICogZmFsc2Ugd2hlbiBhIGZpZWxkIGlzIGNoYW5nZWQgYW5kIHRoZSBmaWVsZHMgbXVzdCBiZSByZWNvbXB1dGVkLgorICAgICAqIFNldCB0byB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY2FsZW5kYXIgZmllbGRzIGhhdmUgYmVlbiBzZXQgZnJvbSB0aGUgdGltZSwgc2V0IHRvCisgICAgICoge0Bjb2RlIGZhbHNlfSB3aGVuIGEgZmllbGQgaXMgY2hhbmdlZCBhbmQgdGhlIGZpZWxkcyBtdXN0IGJlIHJlY29tcHV0ZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlRmllbGRzU2V0OwogCiAgICAgLyoqCi0gICAgICogQW4gaW50ZWdlciBhcnJheSBvZiBjYWxlbmRhciBmaWVsZHMuCisgICAgICogQW4gaW50ZWdlciBhcnJheSBvZiBjYWxlbmRhciBmaWVsZHMuIFRoZSBsZW5ndGggaXMge0Bjb2RlIEZJRUxEX0NPVU5UfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50W10gZmllbGRzOwogCi0gICAgLyoKKyAgICAvKioKICAgICAgKiBBIGJvb2xlYW4gYXJyYXkuIEVhY2ggZWxlbWVudCBpbmRpY2F0ZXMgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaGFzCi0gICAgICogYmVlbiBzZXQuCisgICAgICogYmVlbiBzZXQuIFRoZSBsZW5ndGggaXMge0Bjb2RlIEZJRUxEX0NPVU5UfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbltdIGlzU2V0OwogCiAgICAgLyoqCi0gICAgICogU2V0IHRvIHRydWUgd2hlbiB0aGUgdGltZSBoYXMgYmVlbiBzZXQsIHNldCB0byBmYWxzZSB3aGVuIGEgZmllbGQgaXMKKyAgICAgKiBTZXQgdG8ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIHRpbWUgaGFzIGJlZW4gc2V0LCBzZXQgdG8ge0Bjb2RlIGZhbHNlfSB3aGVuIGEgZmllbGQgaXMKICAgICAgKiBjaGFuZ2VkIGFuZCB0aGUgdGltZSBtdXN0IGJlIHJlY29tcHV0ZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUaW1lU2V0OwogCiAgICAgLyoqCiAgICAgICogVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgbG9uZyB0aW1lOwogCkBAIC03OSwyMyArMzY1LDQxNSBAQAogCiAgICAgcHJpdmF0ZSBUaW1lWm9uZSB6b25lOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFOVUFSWSA9IDAsIEZFQlJVQVJZID0gMSwgTUFSQ0ggPSAyLCBBUFJJTCA9IDMsCi0gICAgICAgICAgICBNQVkgPSA0LCBKVU5FID0gNSwgSlVMWSA9IDYsIEFVR1VTVCA9IDcsIFNFUFRFTUJFUiA9IDgsCi0gICAgICAgICAgICBPQ1RPQkVSID0gOSwgTk9WRU1CRVIgPSAxMCwgREVDRU1CRVIgPSAxMSwgVU5ERUNJTUJFUiA9IDEyLAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB7QGNvZGUgTU9OVEh9IGZpZWxkIGluZGljYXRpbmcgdGhlIGZpcnN0IG1vbnRoIG9mIHRoZQorICAgICAqIHllYXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFOVUFSWSA9IDA7CiAKLSAgICAgICAgICAgIFNVTkRBWSA9IDEsIE1PTkRBWSA9IDIsIFRVRVNEQVkgPSAzLCBXRURORVNEQVkgPSA0LCBUSFVSU0RBWSA9IDUsCi0gICAgICAgICAgICBGUklEQVkgPSA2LCBTQVRVUkRBWSA9IDc7CisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBNT05USH0gZmllbGQgaW5kaWNhdGluZyB0aGUgc2Vjb25kIG1vbnRoIG9mCisgICAgICogdGhlIHllYXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVCUlVBUlkgPSAxOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJBID0gMCwgWUVBUiA9IDEsIE1PTlRIID0gMiwgV0VFS19PRl9ZRUFSID0gMywKLSAgICAgICAgICAgIFdFRUtfT0ZfTU9OVEggPSA0LCBEQVRFID0gNSwgREFZX09GX01PTlRIID0gNSwgREFZX09GX1lFQVIgPSA2LAotICAgICAgICAgICAgREFZX09GX1dFRUsgPSA3LCBEQVlfT0ZfV0VFS19JTl9NT05USCA9IDgsCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBNT05USH0gZmllbGQgaW5kaWNhdGluZyB0aGUgdGhpcmQgbW9udGggb2YgdGhlCisgICAgICogeWVhci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVJDSCA9IDI7CiAKLSAgICAgICAgICAgIEFNX1BNID0gOSwgSE9VUiA9IDEwLCBIT1VSX09GX0RBWSA9IDExLCBNSU5VVEUgPSAxMiwgU0VDT05EID0gMTMsCi0gICAgICAgICAgICBNSUxMSVNFQ09ORCA9IDE0LCBaT05FX09GRlNFVCA9IDE1LCBEU1RfT0ZGU0VUID0gMTYsCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBNT05USH0gZmllbGQgaW5kaWNhdGluZyB0aGUgZm91cnRoIG1vbnRoIG9mCisgICAgICogdGhlIHllYXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBSSUwgPSAzOwogCi0gICAgICAgICAgICBGSUVMRF9DT1VOVCA9IDE3LAorICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB7QGNvZGUgTU9OVEh9IGZpZWxkIGluZGljYXRpbmcgdGhlIGZpZnRoIG1vbnRoIG9mIHRoZQorICAgICAqIHllYXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFZID0gNDsKIAotICAgICAgICAgICAgQU0gPSAwLCBQTSA9IDE7CisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBNT05USH0gZmllbGQgaW5kaWNhdGluZyB0aGUgc2l4dGggbW9udGggb2YgdGhlCisgICAgICogeWVhci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKVU5FID0gNTsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB7QGNvZGUgTU9OVEh9IGZpZWxkIGluZGljYXRpbmcgdGhlIHNldmVudGggbW9udGggb2YKKyAgICAgKiB0aGUgeWVhci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKVUxZID0gNjsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB7QGNvZGUgTU9OVEh9IGZpZWxkIGluZGljYXRpbmcgdGhlIGVpZ2h0aCBtb250aCBvZgorICAgICAqIHRoZSB5ZWFyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVR1VTVCA9IDc7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB0aGUge0Bjb2RlIE1PTlRIfSBmaWVsZCBpbmRpY2F0aW5nIHRoZSBuaW50aCBtb250aCBvZiB0aGUKKyAgICAgKiB5ZWFyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUFRFTUJFUiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB0aGUge0Bjb2RlIE1PTlRIfSBmaWVsZCBpbmRpY2F0aW5nIHRoZSB0ZW50aCBtb250aCBvZiB0aGUKKyAgICAgKiB5ZWFyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DVE9CRVIgPSA5OworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBNT05USH0gZmllbGQgaW5kaWNhdGluZyB0aGUgZWxldmVudGggbW9udGggb2YKKyAgICAgKiB0aGUgeWVhci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1ZFTUJFUiA9IDEwOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBNT05USH0gZmllbGQgaW5kaWNhdGluZyB0aGUgdHdlbGZ0aCBtb250aCBvZgorICAgICAqIHRoZSB5ZWFyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ0VNQkVSID0gMTE7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB0aGUge0Bjb2RlIE1PTlRIfSBmaWVsZCBpbmRpY2F0aW5nIHRoZSB0aGlydGVlbnRoIG1vbnRoCisgICAgICogb2YgdGhlIHllYXIuIEFsdGhvdWdoIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gZG9lcyBub3QgdXNlIHRoaXMKKyAgICAgKiB2YWx1ZSwgbHVuYXIgY2FsZW5kYXJzIGRvLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVDSU1CRVIgPSAxMjsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB7QGNvZGUgREFZX09GX1dFRUt9IGZpZWxkIGluZGljYXRpbmcgU3VuZGF5LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVTkRBWSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB0aGUge0Bjb2RlIERBWV9PRl9XRUVLfSBmaWVsZCBpbmRpY2F0aW5nIE1vbmRheS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT05EQVkgPSAyOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBEQVlfT0ZfV0VFS30gZmllbGQgaW5kaWNhdGluZyBUdWVzZGF5LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRVRVNEQVkgPSAzOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBEQVlfT0ZfV0VFS30gZmllbGQgaW5kaWNhdGluZyBXZWRuZXNkYXkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VETkVTREFZID0gNDsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB7QGNvZGUgREFZX09GX1dFRUt9IGZpZWxkIGluZGljYXRpbmcgVGh1cnNkYXkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhVUlNEQVkgPSA1OworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHtAY29kZSBEQVlfT0ZfV0VFS30gZmllbGQgaW5kaWNhdGluZyBGcmlkYXkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJJREFZID0gNjsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB7QGNvZGUgREFZX09GX1dFRUt9IGZpZWxkIGluZGljYXRpbmcgU2F0dXJkYXkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FUVVJEQVkgPSA3OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBlcmEsIGUuZy4sIEFEIG9yIEJDIGluIHRoZSBKdWxpYW4gY2FsZW5kYXIuIFRoaXMgaXMgYSBjYWxlbmRhci1zcGVjaWZpYworICAgICAqIHZhbHVlOyBzZWUgc3ViY2xhc3MgZG9jdW1lbnRhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIEdyZWdvcmlhbkNhbGVuZGFyI0FECisgICAgICogQHNlZSBHcmVnb3JpYW5DYWxlbmRhciNCQworICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSQSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBudW1iZXIgZm9yIHtAY29kZSBnZXR9IGFuZCB7QGNvZGUgc2V0fSBpbmRpY2F0aW5nIHRoZQorICAgICAqIHllYXIuIFRoaXMgaXMgYSBjYWxlbmRhci1zcGVjaWZpYyB2YWx1ZTsgc2VlIHN1YmNsYXNzIGRvY3VtZW50YXRpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVBUiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBudW1iZXIgZm9yIHtAY29kZSBnZXR9IGFuZCB7QGNvZGUgc2V0fSBpbmRpY2F0aW5nIHRoZQorICAgICAqIG1vbnRoLiBUaGlzIGlzIGEgY2FsZW5kYXItc3BlY2lmaWMgdmFsdWUuIFRoZSBmaXJzdCBtb250aCBvZiB0aGUgeWVhciBpcworICAgICAqIHtAY29kZSBKQU5VQVJZfTsgdGhlIGxhc3QgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIG1vbnRocyBpbiBhCisgICAgICogeWVhci4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNKQU5VQVJZCisgICAgICogQHNlZSAjRkVCUlVBUlkKKyAgICAgKiBAc2VlICNNQVJDSAorICAgICAqIEBzZWUgI0FQUklMCisgICAgICogQHNlZSAjTUFZCisgICAgICogQHNlZSAjSlVORQorICAgICAqIEBzZWUgI0pVTFkKKyAgICAgKiBAc2VlICNBVUdVU1QKKyAgICAgKiBAc2VlICNTRVBURU1CRVIKKyAgICAgKiBAc2VlICNPQ1RPQkVSCisgICAgICogQHNlZSAjTk9WRU1CRVIKKyAgICAgKiBAc2VlICNERUNFTUJFUgorICAgICAqIEBzZWUgI1VOREVDSU1CRVIKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT05USCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBudW1iZXIgZm9yIHtAY29kZSBnZXR9IGFuZCB7QGNvZGUgc2V0fSBpbmRpY2F0aW5nIHRoZQorICAgICAqIHdlZWsgbnVtYmVyIHdpdGhpbiB0aGUgY3VycmVudCB5ZWFyLiBUaGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciwgYXMKKyAgICAgKiBkZWZpbmVkIGJ5IHtAY29kZSBnZXRGaXJzdERheU9mV2VlaygpfSBhbmQKKyAgICAgKiB7QGNvZGUgZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpfSwgaGFzIHZhbHVlIDEuIFN1YmNsYXNzZXMKKyAgICAgKiBkZWZpbmUgdGhlIHZhbHVlIG9mIHtAY29kZSBXRUVLX09GX1lFQVJ9IGZvciBkYXlzIGJlZm9yZSB0aGUgZmlyc3QKKyAgICAgKiB3ZWVrIG9mIHRoZSB5ZWFyLgorICAgICAqIAorICAgICAqIEBzZWUgI2dldEZpcnN0RGF5T2ZXZWVrCisgICAgICogQHNlZSAjZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaworICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFRUtfT0ZfWUVBUiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBudW1iZXIgZm9yIHtAY29kZSBnZXR9IGFuZCB7QGNvZGUgc2V0fSBpbmRpY2F0aW5nIHRoZQorICAgICAqIHdlZWsgbnVtYmVyIHdpdGhpbiB0aGUgY3VycmVudCBtb250aC4gVGhlIGZpcnN0IHdlZWsgb2YgdGhlIG1vbnRoLCBhcworICAgICAqIGRlZmluZWQgYnkge0Bjb2RlIGdldEZpcnN0RGF5T2ZXZWVrKCl9IGFuZAorICAgICAqIHtAY29kZSBnZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKCl9LCBoYXMgdmFsdWUgMS4gU3ViY2xhc3NlcworICAgICAqIGRlZmluZSB0aGUgdmFsdWUgb2Yge0Bjb2RlIFdFRUtfT0ZfTU9OVEh9IGZvciBkYXlzIGJlZm9yZSB0aGUKKyAgICAgKiBmaXJzdCB3ZWVrIG9mIHRoZSBtb250aC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRGaXJzdERheU9mV2VlaworICAgICAqIEBzZWUgI2dldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUVLX09GX01PTlRIID0gNDsKKworICAgIC8qKgorICAgICAqIEZpZWxkIG51bWJlciBmb3Ige0Bjb2RlIGdldH0gYW5kIHtAY29kZSBzZXR9IGluZGljYXRpbmcgdGhlCisgICAgICogZGF5IG9mIHRoZSBtb250aC4gVGhpcyBpcyBhIHN5bm9ueW0gZm9yIHtAY29kZSBEQVlfT0ZfTU9OVEh9LiBUaGUKKyAgICAgKiBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIGhhcyB2YWx1ZSAxLgorICAgICAqIAorICAgICAqIEBzZWUgI0RBWV9PRl9NT05USAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEUgPSA1OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBkYXkgb2YgdGhlIG1vbnRoLiBUaGlzIGlzIGEgc3lub255bSBmb3Ige0Bjb2RlIERBVEV9LiBUaGUgZmlyc3QKKyAgICAgKiBkYXkgb2YgdGhlIG1vbnRoIGhhcyB2YWx1ZSAxLgorICAgICAqIAorICAgICAqIEBzZWUgI0RBVEUKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVlfT0ZfTU9OVEggPSA1OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBkYXkgbnVtYmVyIHdpdGhpbiB0aGUgY3VycmVudCB5ZWFyLiBUaGUgZmlyc3QgZGF5IG9mIHRoZSB5ZWFyIGhhcyB2YWx1ZQorICAgICAqIDEuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFZX09GX1lFQVIgPSA2OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBkYXkgb2YgdGhlIHdlZWsuIFRoaXMgZmllbGQgdGFrZXMgdmFsdWVzIHtAY29kZSBTVU5EQVl9LAorICAgICAqIHtAY29kZSBNT05EQVl9LCB7QGNvZGUgVFVFU0RBWX0sIHtAY29kZSBXRURORVNEQVl9LAorICAgICAqIHtAY29kZSBUSFVSU0RBWX0sIHtAY29kZSBGUklEQVl9LCBhbmQKKyAgICAgKiB7QGNvZGUgU0FUVVJEQVl9LgorICAgICAqIAorICAgICAqIEBzZWUgI1NVTkRBWQorICAgICAqIEBzZWUgI01PTkRBWQorICAgICAqIEBzZWUgI1RVRVNEQVkKKyAgICAgKiBAc2VlICNXRURORVNEQVkKKyAgICAgKiBAc2VlICNUSFVSU0RBWQorICAgICAqIEBzZWUgI0ZSSURBWQorICAgICAqIEBzZWUgI1NBVFVSREFZCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFZX09GX1dFRUsgPSA3OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBvcmRpbmFsIG51bWJlciBvZiB0aGUgZGF5IG9mIHRoZSB3ZWVrIHdpdGhpbiB0aGUgY3VycmVudCBtb250aC4gVG9nZXRoZXIKKyAgICAgKiB3aXRoIHRoZSB7QGNvZGUgREFZX09GX1dFRUt9IGZpZWxkLCB0aGlzIHVuaXF1ZWx5IHNwZWNpZmllcyBhIGRheQorICAgICAqIHdpdGhpbiBhIG1vbnRoLiBVbmxpa2Uge0Bjb2RlIFdFRUtfT0ZfTU9OVEh9IGFuZAorICAgICAqIHtAY29kZSBXRUVLX09GX1lFQVJ9LCB0aGlzIGZpZWxkJ3MgdmFsdWUgZG9lcyA8ZW0+bm90PC9lbT4KKyAgICAgKiBkZXBlbmQgb24ge0Bjb2RlIGdldEZpcnN0RGF5T2ZXZWVrKCl9IG9yCisgICAgICoge0Bjb2RlIGdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKX0uIHtAY29kZSBEQVlfT0ZfTU9OVEggMX0KKyAgICAgKiB0aHJvdWdoIHtAY29kZSA3fSBhbHdheXMgY29ycmVzcG9uZCB0byA8Y29kZT5EQVlfT0ZfV0VFS19JTl9NT05USAorICAgICAqIDE8L2NvZGU+OworICAgICAqIHtAY29kZSA4fSB0aHJvdWdoIHtAY29kZSAxNX0gY29ycmVzcG9uZCB0bworICAgICAqIHtAY29kZSBEQVlfT0ZfV0VFS19JTl9NT05USCAyfSwgYW5kIHNvIG9uLgorICAgICAqIHtAY29kZSBEQVlfT0ZfV0VFS19JTl9NT05USCAwfSBpbmRpY2F0ZXMgdGhlIHdlZWsgYmVmb3JlCisgICAgICoge0Bjb2RlIERBWV9PRl9XRUVLX0lOX01PTlRIIDF9LiBOZWdhdGl2ZSB2YWx1ZXMgY291bnQgYmFjayBmcm9tCisgICAgICogdGhlIGVuZCBvZiB0aGUgbW9udGgsIHNvIHRoZSBsYXN0IFN1bmRheSBvZiBhIG1vbnRoIGlzIHNwZWNpZmllZCBhcworICAgICAqIHtAY29kZSBEQVlfT0ZfV0VFSyA9IFNVTkRBWSwgREFZX09GX1dFRUtfSU5fTU9OVEggPSAtMX0uIEJlY2F1c2UKKyAgICAgKiBuZWdhdGl2ZSB2YWx1ZXMgY291bnQgYmFja3dhcmQgdGhleSB3aWxsIHVzdWFsbHkgYmUgYWxpZ25lZCBkaWZmZXJlbnRseQorICAgICAqIHdpdGhpbiB0aGUgbW9udGggdGhhbiBwb3NpdGl2ZSB2YWx1ZXMuIEZvciBleGFtcGxlLCBpZiBhIG1vbnRoIGhhcyAzMQorICAgICAqIGRheXMsIHtAY29kZSBEQVlfT0ZfV0VFS19JTl9NT05USCAtMX0gd2lsbCBvdmVybGFwCisgICAgICoge0Bjb2RlIERBWV9PRl9XRUVLX0lOX01PTlRIIDV9IGFuZCB0aGUgZW5kIG9mIHtAY29kZSA0fS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNEQVlfT0ZfV0VFSworICAgICAqIEBzZWUgI1dFRUtfT0ZfTU9OVEgKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVlfT0ZfV0VFS19JTl9NT05USCA9IDg7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBudW1iZXIgZm9yIHtAY29kZSBnZXR9IGFuZCB7QGNvZGUgc2V0fSBpbmRpY2F0aW5nCisgICAgICogd2hldGhlciB0aGUge0Bjb2RlIEhPVVJ9IGlzIGJlZm9yZSBvciBhZnRlciBub29uLiBFLmcuLCBhdAorICAgICAqIDEwOjA0OjE1LjI1MCBQTSB0aGUge0Bjb2RlIEFNX1BNfSBpcyB7QGNvZGUgUE19LgorICAgICAqIAorICAgICAqIEBzZWUgI0FNCisgICAgICogQHNlZSAjUE0KKyAgICAgKiBAc2VlICNIT1VSCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU1fUE0gPSA5OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBob3VyIG9mIHRoZSBtb3JuaW5nIG9yIGFmdGVybm9vbi4ge0Bjb2RlIEhPVVJ9IGlzIHVzZWQgZm9yIHRoZQorICAgICAqIDEyLWhvdXIgY2xvY2suIEUuZy4sIGF0IDEwOjA0OjE1LjI1MCBQTSB0aGUge0Bjb2RlIEhPVVJ9IGlzIDEwLgorICAgICAqIAorICAgICAqIEBzZWUgI0FNX1BNCisgICAgICogQHNlZSAjSE9VUl9PRl9EQVkKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT1VSID0gMTA7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBudW1iZXIgZm9yIHtAY29kZSBnZXR9IGFuZCB7QGNvZGUgc2V0fSBpbmRpY2F0aW5nIHRoZQorICAgICAqIGhvdXIgb2YgdGhlIGRheS4ge0Bjb2RlIEhPVVJfT0ZfREFZfSBpcyB1c2VkIGZvciB0aGUgMjQtaG91cgorICAgICAqIGNsb2NrLiBFLmcuLCBhdCAxMDowNDoxNS4yNTAgUE0gdGhlIHtAY29kZSBIT1VSX09GX0RBWX0gaXMgMjIuCisgICAgICogCisgICAgICogQHNlZSAjSE9VUgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVVJfT0ZfREFZID0gMTE7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBudW1iZXIgZm9yIHtAY29kZSBnZXR9IGFuZCB7QGNvZGUgc2V0fSBpbmRpY2F0aW5nIHRoZQorICAgICAqIG1pbnV0ZSB3aXRoaW4gdGhlIGhvdXIuIEUuZy4sIGF0IDEwOjA0OjE1LjI1MCBQTSB0aGUge0Bjb2RlIE1JTlVURX0KKyAgICAgKiBpcyA0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVURSA9IDEyOworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBzZWNvbmQgd2l0aGluIHRoZSBtaW51dGUuIEUuZy4sIGF0IDEwOjA0OjE1LjI1MCBQTSB0aGUKKyAgICAgKiB7QGNvZGUgU0VDT05EfSBpcyAxNS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUNPTkQgPSAxMzsKKworICAgIC8qKgorICAgICAqIEZpZWxkIG51bWJlciBmb3Ige0Bjb2RlIGdldH0gYW5kIHtAY29kZSBzZXR9IGluZGljYXRpbmcgdGhlCisgICAgICogbWlsbGlzZWNvbmQgd2l0aGluIHRoZSBzZWNvbmQuIEUuZy4sIGF0IDEwOjA0OjE1LjI1MCBQTSB0aGUKKyAgICAgKiB7QGNvZGUgTUlMTElTRUNPTkR9IGlzIDI1MC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUxMSVNFQ09ORCA9IDE0OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiByYXcgb2Zmc2V0IGZyb20gR01UIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaT05FX09GRlNFVCA9IDE1OworCisgICAgLyoqCisgICAgICogRmllbGQgbnVtYmVyIGZvciB7QGNvZGUgZ2V0fSBhbmQge0Bjb2RlIHNldH0gaW5kaWNhdGluZyB0aGUKKyAgICAgKiBkYXlsaWdodCBzYXZpbmdzIG9mZnNldCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFNUX09GRlNFVCA9IDE2OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIGNhbGVuZGFyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0NPVU5UID0gMTc7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB0aGUge0Bjb2RlIEFNX1BNfSBmaWVsZCBpbmRpY2F0aW5nIHRoZSBwZXJpb2Qgb2YgdGhlIGRheQorICAgICAqIGZyb20gbWlkbmlnaHQgdG8ganVzdCBiZWZvcmUgbm9vbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB0aGUge0Bjb2RlIEFNX1BNfSBmaWVsZCBpbmRpY2F0aW5nIHRoZSBwZXJpb2Qgb2YgdGhlIGRheQorICAgICAqIGZyb20gbm9vbiB0byBqdXN0IGJlZm9yZSBtaWRuaWdodC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTSA9IDE7CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmllbGROYW1lcyA9IHsgIkVSQT0iLCAiWUVBUj0iLCAiTU9OVEg9IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKICAgICAgICAgICAgICJXRUVLX09GX1lFQVI9IiwgIldFRUtfT0ZfTU9OVEg9IiwgIkRBWV9PRl9NT05USD0iLCAiREFZX09GX1lFQVI9IiwgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JApAQCAtMTA0LDggKzc4Miw5IEBACiAgICAgICAgICAgICAiWk9ORV9PRkZTRVQ9IiwgIkRTVF9PRkZTRVQ9IiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgQ2FsZW5kYXIgaW5zdGFuY2UgdXNpbmcgdGhlIGRlZmF1bHQgVGltZVpvbmUgYW5kIExvY2FsZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSB1c2luZyB0aGUgZGVmYXVsdCB7QGNvZGUgVGltZVpvbmV9IGFuZCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2FsZW5kYXIoKSB7CiAgICAgICAgIHRoaXMoVGltZVpvbmUuZ2V0RGVmYXVsdCgpLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKQEAgLTEyMCwxMyArNzk5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhpcyBDYWxlbmRhciBpbnN0YW5jZSB1c2luZyB0aGUgc3BlY2lmaWVkIFRpbWVab25lIGFuZAotICAgICAqIExvY2FsZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSB1c2luZyB0aGUgc3BlY2lmaWVkIHtAY29kZSBUaW1lWm9uZX0gYW5kIHtAY29kZSBMb2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lem9uZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWV6b25lCisgICAgICogICAgICAgICAgICB0aGUgdGltZXpvbmUuCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2FsZW5kYXIoVGltZVpvbmUgdGltZXpvbmUsIExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgdGhpcyh0aW1lem9uZSk7CkBAIC0xMzcsMzAgKzgxNywyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBhbW91bnQgdG8gYSBDYWxlbmRhciBmaWVsZC4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYW1vdW50IHRvIGEge0Bjb2RlIENhbGVuZGFyfSBmaWVsZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBmaWVsZCB0byBtb2RpZnkKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9IGZpZWxkIHRvIG1vZGlmeS4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBhbW91bnQgdG8gYWRkIHRvIHRoZSBmaWVsZAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgc3BlY2lmaWVkIGZpZWxkIGlzIERTVF9PRkZTRVQgb3IgWk9ORV9PRkZTRVQuCisgICAgICogICAgICAgICAgICB0aGUgYW1vdW50IHRvIGFkZCB0byB0aGUgZmllbGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgYWRkKGludCBmaWVsZCwgaW50IHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIERhdGUgc3BlY2lmaWVkIGJ5IHRoaXMgQ2FsZW5kYXIgaW5zdGFuY2UgaXMgYWZ0ZXIgdGhlIERhdGUKLSAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlci4gVGhlIGNvbXBhcmlzb24gaXMgbm90IGRlcGVuZGVudCBvbiB0aGUKLSAgICAgKiB0aW1lIHpvbmVzIG9mIHRoZSBDYWxlbmRhcnMuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB7QGNvZGUgRGF0ZX0gc3BlY2lmaWVkIGJ5IHRoaXMge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSBpcyBhZnRlciB0aGUge0Bjb2RlIERhdGV9CisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIuIFRoZSBjb21wYXJpc29uIGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlIHRpbWUKKyAgICAgKiB6b25lcyBvZiB0aGUge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2FsZW5kYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBpbnN0YW5jZSB0byBjb21wYXJlCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhpcyBDYWxlbmRhciBpcyBhZnRlciBjYWxlbmRhciwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0aW1lIGlzIG5vdCBzZXQgYW5kIHRoZSB0aW1lIGNhbm5vdCBiZSBjb21wdXRlZAotICAgICAqICAgICAgICAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgZmllbGQgdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhpcyBDYWxlbmRhciBpcyBhZnRlciBjYWxlbmRhciwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXIoT2JqZWN0IGNhbGVuZGFyKSB7CiAgICAgICAgIGlmICghKGNhbGVuZGFyIGluc3RhbmNlb2YgQ2FsZW5kYXIpKSB7CkBAIC0xNzAsMTcgKzg0NSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIERhdGUgc3BlY2lmaWVkIGJ5IHRoaXMgQ2FsZW5kYXIgaW5zdGFuY2UgaXMgYmVmb3JlIHRoZQotICAgICAqIERhdGUgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIuIFRoZSBjb21wYXJpc29uIGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlCi0gICAgICogdGltZSB6b25lcyBvZiB0aGUgQ2FsZW5kYXJzLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUge0Bjb2RlIERhdGV9IHNwZWNpZmllZCBieSB0aGlzIHtAY29kZSBDYWxlbmRhcn0gaW5zdGFuY2UgaXMgYmVmb3JlIHRoZQorICAgICAqIHtAY29kZSBEYXRlfSBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlci4gVGhlIGNvbXBhcmlzb24gaXMgbm90IGRlcGVuZGVudCBvbiB0aGUKKyAgICAgKiB0aW1lIHpvbmVzIG9mIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjYWxlbmRhcgotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGluc3RhbmNlIHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGlzIENhbGVuZGFyIGlzIGJlZm9yZSBjYWxlbmRhciwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0aW1lIGlzIG5vdCBzZXQgYW5kIHRoZSB0aW1lIGNhbm5vdCBiZSBjb21wdXRlZAotICAgICAqICAgICAgICAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgZmllbGQgdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhpcyBDYWxlbmRhciBpcyBiZWZvcmUgY2FsZW5kYXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZShPYmplY3QgY2FsZW5kYXIpIHsKICAgICAgICAgaWYgKCEoY2FsZW5kYXIgaW5zdGFuY2VvZiBDYWxlbmRhcikpIHsKQEAgLTE5MCw5ICs4NjIsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIG9mIHRoZSBmaWVsZHMgb2YgdGhpcyBDYWxlbmRhci4gQWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgdG8KKyAgICAgKiBDbGVhcnMgYWxsIG9mIHRoZSBmaWVsZHMgb2YgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LiBBbGwgZmllbGRzIGFyZSBpbml0aWFsaXplZCB0bwogICAgICAqIHplcm8uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklFTERfQ09VTlQ7IGkrKykgewpAQCAtMjAzLDEwICs4NzYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIHNwZWNpZmllZCBmaWVsZCB0byB6ZXJvLgorICAgICAqIENsZWFycyB0aGUgc3BlY2lmaWVkIGZpZWxkIHRvIHplcm8gYW5kIHNldHMgdGhlIGlzU2V0IGZsYWcgdG8ge0Bjb2RlIGZhbHNlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byBjbGVhcgorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHRvIGNsZWFyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKGludCBmaWVsZCkgewogICAgICAgICBmaWVsZHNbZmllbGRdID0gMDsKQEAgLTIxNSwxMSArODg5LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBDYWxlbmRhciB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQ2FsZW5kYXJ9IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgQ2FsZW5kYXIKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMjQwLDcgKzkxNSw4IEBACiAgICAgICogCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0aW1lIGlzIG5vdCBzZXQgYW5kIHRoZSB0aW1lIGNhbm5vdCBiZSBjb21wdXRlZAotICAgICAqICAgICAgICAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgZmllbGQgdmFsdWVzCisgICAgICogICAgICAgICAgICAgICAgZnJvbSB0aGUgY3VycmVudCBmaWVsZCB2YWx1ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgY29tcGxldGUoKSB7CiAgICAgICAgIGlmICghaXNUaW1lU2V0KSB7CkBAIC0yNTQsMjkgKzkzMCwzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBDYWxlbmRhciBmaWVsZHMgZnJvbSB0aGUgdGltZS4KKyAgICAgKiBDb21wdXRlcyB0aGUge0Bjb2RlIENhbGVuZGFyfSBmaWVsZHMgZnJvbSB7QGNvZGUgdGltZX0uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29tcHV0ZUZpZWxkcygpOwogCiAgICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIHRpbWUgZnJvbSB0aGUgQ2FsZW5kYXIgZmllbGRzLgorICAgICAqIENvbXB1dGVzIHtAY29kZSB0aW1lfSBmcm9tIHRoZSBDYWxlbmRhciBmaWVsZHMuCiAgICAgICogCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0aW1lIGNhbm5vdCBiZSBjb21wdXRlZCBmcm9tIHRoZSBjdXJyZW50IGZpZWxkCi0gICAgICogICAgICAgICAgICAgICAgdmFsdWVzCisgICAgICogICAgICAgICAgICAgICAgdmFsdWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbXB1dGVUaW1lKCk7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIENhbGVuZGFyIGFuZCBhbnN3ZXIgaWYgdGhleSBhcmUKLSAgICAgKiBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIENhbGVuZGFyIGFuZCBoYXZlIHRoZSBzYW1lCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9IGFuZCByZXR1cm5zIHdoZXRoZXIgdGhleSBhcmUKKyAgICAgKiBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAY29kZSBDYWxlbmRhcn0gYW5kIGhhdmUgdGhlIHNhbWUKICAgICAgKiBwcm9wZXJ0aWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgQ2FsZW5kYXIsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlIENhbGVuZGFyfSwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC0yOTYsMTYgKzk3NSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgYWZ0ZXIgY29tcHV0aW5nIHRoZSBmaWVsZCB2YWx1ZXMKLSAgICAgKiBmcm9tIHRoZSB0aW1lIGlmIHJlcXVpcmVkLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgYWZ0ZXIgY29tcHV0aW5nIHRoZSBmaWVsZCB2YWx1ZXMgYnkKKyAgICAgKiBjYWxsaW5nIHtAY29kZSBjb21wbGV0ZSgpfSBmaXJzdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byBnZXQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KICAgICAgKiAKICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGZpZWxkcyBhcmUgbm90IHNldCwgdGhlIHRpbWUgaXMgbm90IHNldCwgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgICAgIHRpbWUgY2Fubm90IGJlIGNvbXB1dGVkIGZyb20gdGhlIGN1cnJlbnQgZmllbGQgdmFsdWVzCisgICAgICogICAgICAgICAgICAgICAgdGltZSBjYW5ub3QgYmUgY29tcHV0ZWQgZnJvbSB0aGUgY3VycmVudCBmaWVsZCB2YWx1ZXMuCisgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmllbGQgaXMgbm90IGluc2lkZSB0aGUgcmFuZ2Ugb2YgcG9zc2libGUgZmllbGRzLgorICAgICAqICAgICAgICAgICAgICAgIFRoZSByYW5nZSBpcyBzdGFydGluZyBhdCAwIHVwIHRvIHtAY29kZSBGSUVMRF9DT1VOVH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXQoaW50IGZpZWxkKSB7CiAgICAgICAgIGNvbXBsZXRlKCk7CkBAIC0zMTYsOCArOTk5LDkgQEAKICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgZm9yIHRoZSBjdXJyZW50IGRhdGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRBY3R1YWxNYXhpbXVtKGludCBmaWVsZCkgewogICAgICAgICBpbnQgdmFsdWUsIG5leHQ7CkBAIC0zNDEsOCArMTAyNSw5IEBACiAgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkIGZvciB0aGUgY3VycmVudCBkYXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QWN0dWFsTWluaW11bShpbnQgZmllbGQpIHsKICAgICAgICAgaW50IHZhbHVlLCBuZXh0OwpAQCAtMzYzLDc4ICsxMDQ4LDg3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgTG9jYWxlcyB3aGljaCBzdXBwb3J0IENhbGVuZGFyLgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIHtAY29kZSBMb2NhbGV9cyB3aGljaCBzdXBwb3J0IHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBMb2NhbGUKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAY29kZSBMb2NhbGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExvY2FsZVtdIGdldEF2YWlsYWJsZUxvY2FsZXMoKSB7CiAgICAgICAgIHJldHVybiBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBmb3IgdGhpcyBDYWxlbmRhci4KKyAgICAgKiBHZXRzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgZm9yIHRoaXMge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgQ2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Rmlyc3REYXlPZldlZWsoKSB7CiAgICAgICAgIHJldHVybiBmaXJzdERheU9mV2VlazsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncmVhdGVzdCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCisgICAgICogR2V0cyB0aGUgZ3JlYXRlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLiBUaGlzIGlzIHRoZQorICAgICAqIGJpZ2dlc3QgdmFsdWUgdGhhdCB7QGNvZGUgZ2V0QWN0dWFsTWluaW11bX0gY2FuIHJldHVybiBmb3IgYW55IHBvc3NpYmxlCisgICAgICogdGltZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZAotICAgICAqIEByZXR1cm4gdGhlIGdyZWF0ZXN0IG1pbmltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZAorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIGdyZWF0ZXN0IG1pbmltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBwdWJsaWMgaW50IGdldEdyZWF0ZXN0TWluaW11bShpbnQgZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQ2FsZW5kYXIgc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIHRoZQotICAgICAqIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHtAY29kZSBDYWxlbmRhcn0gc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIHRoZQorICAgICAqIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIENhbGVuZGFyIHN1YmNsYXNzIGluc3RhbmNlIHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGluCi0gICAgICogICAgICAgICB0aGUgZGVmYXVsdCB0aW1lem9uZQorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2FsZW5kYXJ9IHN1YmNsYXNzIGluc3RhbmNlIHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGluCisgICAgICogICAgICAgICB0aGUgZGVmYXVsdCB7QGNvZGUgVGltZXpvbmV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENhbGVuZGFyIGdldEluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQ2FsZW5kYXIgc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIHRoZQotICAgICAqIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0Bjb2RlIENhbGVuZGFyfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUgdG8gdXNlCi0gICAgICogQHJldHVybiBhIENhbGVuZGFyIHN1YmNsYXNzIGluc3RhbmNlIHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIENhbGVuZGFyfSBzdWJjbGFzcyBpbnN0YW5jZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDYWxlbmRhciBnZXRJbnN0YW5jZShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIHJldHVybiBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIobG9jYWxlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBDYWxlbmRhciBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAgICogZGVmYXVsdCBMb2NhbGUsIHVzaW5nIHRoZSBzcGVjaWZpZWQgVGltZVpvbmUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0Bjb2RlIENhbGVuZGFyfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhlCisgICAgICogZGVmYXVsdCB7QGNvZGUgTG9jYWxlfSwgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgVGltZVpvbmV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lem9uZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWV6b25lIHRvIHVzZQotICAgICAqIEByZXR1cm4gYSBDYWxlbmRhciBzdWJjbGFzcyBpbnN0YW5jZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbgotICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCB0aW1lem9uZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBUaW1lWm9uZX0gdG8gdXNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2FsZW5kYXJ9IHN1YmNsYXNzIGluc3RhbmNlIHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGluCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIHRpbWV6b25lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENhbGVuZGFyIGdldEluc3RhbmNlKFRpbWVab25lIHRpbWV6b25lKSB7CiAgICAgICAgIHJldHVybiBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIodGltZXpvbmUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENhbGVuZGFyIHN1YmNsYXNzIGFwcHJvcHJpYXRlIGZvciB0aGUKLSAgICAgKiBzcGVjaWZpZWQgTG9jYWxlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHtAY29kZSBDYWxlbmRhcn0gc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGltZXpvbmUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lem9uZSB0byB1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgVGltZVpvbmV9IHRvIHVzZS4KICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIHRvIHVzZQotICAgICAqIEByZXR1cm4gYSBDYWxlbmRhciBzdWJjbGFzcyBpbnN0YW5jZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbgotICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCB0aW1lem9uZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2NhbGV9IHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIENhbGVuZGFyfSBzdWJjbGFzcyBpbnN0YW5jZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbgorICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCB0aW1lem9uZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDYWxlbmRhciBnZXRJbnN0YW5jZShUaW1lWm9uZSB0aW1lem9uZSwKICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUpIHsKQEAgLTQ0Miw0OSArMTEzNiw1OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBHZXRzIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuIFRoaXMgaXMgdGhlCisgICAgICogc21hbGxlc3QgdmFsdWUgdGhhdCB7QGNvZGUgZ2V0QWN0dWFsTWF4aW11bSgpfSBjYW4gcmV0dXJuIGZvciBhbnkKKyAgICAgKiBwb3NzaWJsZSB0aW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQgbnVtYmVyLgorICAgICAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBwdWJsaWMgaW50IGdldExlYXN0TWF4aW11bShpbnQgZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ3JlYXRlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEdldHMgdGhlIGdyZWF0ZXN0IG1heGltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4gVGhpcyByZXR1cm5zIHRoZQorICAgICAqIGJpZ2dlc3QgdmFsdWUgdGhhdCB7QGNvZGUgZ2V0fSBjYW4gcmV0dXJuIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgZ2V0TWF4aW11bShpbnQgZmllbGQpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWluaW1hbCBkYXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltYWwgZGF5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhcgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltYWwgZGF5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKSB7CiAgICAgICAgIHJldHVybiBtaW5pbWFsRGF5c0luRmlyc3RXZWVrOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNtYWxsZXN0IG1pbmltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBHZXRzIHRoZSBzbWFsbGVzdCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuIHRoaXMgcmV0dXJucyB0aGUKKyAgICAgKiBzbWFsbGVzdCB2YWx1ZSB0aGV0IHtAY29kZSBnZXR9IGNhbiByZXR1cm4gZm9yIHRoZSBzcGVjaWZpZWQgZmllbGQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQKLSAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBudW1iZXIuCisgICAgICogQHJldHVybiB0aGUgc21hbGxlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgZ2V0TWluaW11bShpbnQgZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSBvZiB0aGlzIENhbGVuZGFyIGFzIGEgRGF0ZSBvYmplY3QuCisgICAgICogR2V0cyB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0gYXMgYSB7QGNvZGUgRGF0ZX0gb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgRGF0ZSBpbml0aWFsaXplZCB0byB0aGUgdGltZSBvZiB0aGlzIENhbGVuZGFyCisgICAgICogQHJldHVybiBhIG5ldyB7QGNvZGUgRGF0ZX0gaW5pdGlhbGl6ZWQgdG8gdGhlIHRpbWUgb2YgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqIAogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgdGltZSBpcyBub3Qgc2V0IGFuZCB0aGUgdGltZSBjYW5ub3QgYmUgY29tcHV0ZWQKLSAgICAgKiAgICAgICAgICAgICAgICBmcm9tIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlcworICAgICAqICAgICAgICAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgZmllbGQgdmFsdWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBEYXRlIGdldFRpbWUoKSB7CiAgICAgICAgIHJldHVybiBuZXcgRGF0ZShnZXRUaW1lSW5NaWxsaXMoKSk7CkBAIC00OTMsMTEgKzExOTYsMTIgQEAKICAgICAvKioKICAgICAgKiBDb21wdXRlcyB0aGUgdGltZSBmcm9tIHRoZSBmaWVsZHMgaWYgcmVxdWlyZWQgYW5kIHJldHVybnMgdGhlIHRpbWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGltZSBvZiB0aGlzIENhbGVuZGFyCisgICAgICogQHJldHVybiB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICogCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0aW1lIGlzIG5vdCBzZXQgYW5kIHRoZSB0aW1lIGNhbm5vdCBiZSBjb21wdXRlZAotICAgICAqICAgICAgICAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgZmllbGQgdmFsdWVzCisgICAgICogICAgICAgICAgICAgICAgZnJvbSB0aGUgY3VycmVudCBmaWVsZCB2YWx1ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0VGltZUluTWlsbGlzKCkgewogICAgICAgICBpZiAoIWlzVGltZVNldCkgewpAQCAtNTA4LDkgKzEyMTIsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lem9uZSBvZiB0aGlzIENhbGVuZGFyLgorICAgICAqIEdldHMgdGhlIHRpbWV6b25lIG9mIHRoaXMge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lem9uZSB1c2VkIGJ5IHRoaXMgQ2FsZW5kYXIKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgVGltZVpvbmV9IHVzZWQgYnkgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZSgpIHsKICAgICAgICAgcmV0dXJuIHpvbmU7CkBAIC01MTgsMTEgKzEyMjMsMTIgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCisgICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoLgogICAgICAqIAogICAgICAqIEBzZWUgI2VxdWFscworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC01MzQsNDQgKzEyNDAsNDggQEAKICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkIHdpdGhvdXQgcmVjb21wdXRpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGludGVybmFsR2V0KGludCBmaWVsZCkgewogICAgICAgICByZXR1cm4gZmllbGRzW2ZpZWxkXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgQ2FsZW5kYXIgYWNjZXB0cyBmaWVsZCB2YWx1ZXMgd2hpY2ggYXJlIG91dHNpZGUgdGhlIHZhbGlkCisgICAgICogUmV0dXJucyBpZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0gYWNjZXB0cyBmaWVsZCB2YWx1ZXMgd2hpY2ggYXJlIG91dHNpZGUgdGhlIHZhbGlkCiAgICAgICogcmFuZ2UgZm9yIHRoZSBmaWVsZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBDYWxlbmRhciBpcyBsZW5pZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0gaXMgbGVuaWVudCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMZW5pZW50KCkgewogICAgICAgICByZXR1cm4gbGVuaWVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBzcGVjaWZpZWQgZmllbGQgaXMgc2V0LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpZWxkIGlzIHNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIGEgY2FsZW5kYXIgZmllbGQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmaWVsZCBpcyBzZXQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgQ2FsZW5kYXJ9IGZpZWxkIG51bWJlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIGZpZWxkIGlzIHNldCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTZXQoaW50IGZpZWxkKSB7CiAgICAgICAgIHJldHVybiBpc1NldFtmaWVsZF07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGFtb3VudCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCB3cmFwIHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgKiBmaWVsZCB3aGVuIGl0IGdvZXMgYmV5b25kIHRoZSBtYXhpbXVtIG9yIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBjdXJyZW50Ci0gICAgICogZGF0ZS4gT3RoZXIgZmllbGRzIHdpbGwgYmUgYWRqdXN0ZWQgYXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50Ci0gICAgICogZGF0ZS4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYW1vdW50IHRvIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHdyYXBzIHRoZSB2YWx1ZSBvZgorICAgICAqIHRoZSBmaWVsZCB3aGVuIGl0IGdvZXMgYmV5b25kIHRoZSBtYXhpbXVtIG9yIG1pbmltdW0gdmFsdWUgZm9yIHRoZQorICAgICAqIGN1cnJlbnQgZGF0ZS4gT3RoZXIgZmllbGRzIHdpbGwgYmUgYWRqdXN0ZWQgYXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYQorICAgICAqIGNvbnNpc3RlbnQgZGF0ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byByb2xsCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQgdG8gcm9sbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBhbW91bnQgdG8gYWRkCisgICAgICogICAgICAgICAgICB0aGUgYW1vdW50IHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByb2xsKGludCBmaWVsZCwgaW50IHZhbHVlKSB7CiAgICAgICAgIGJvb2xlYW4gaW5jcmVtZW50ID0gdmFsdWUgPj0gMDsKQEAgLTU4OCw5ICsxMjk4LDEwIEBACiAgICAgICogZGF0ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byByb2xsCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIGluZGljYXRpbmcgdGhlIGZpZWxkIHRvIHJvbGwuCiAgICAgICogQHBhcmFtIGluY3JlbWVudAotICAgICAqICAgICAgICAgICAgdHJ1ZSB0byBpbmNyZW1lbnQgdGhlIGZpZWxkLCBmYWxzZSB0byBkZWNyZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBpbmNyZW1lbnQgdGhlIGZpZWxkLCB7QGNvZGUgZmFsc2V9IHRvIGRlY3JlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCByb2xsKGludCBmaWVsZCwgYm9vbGVhbiBpbmNyZW1lbnQpOwogCkBAIC01OTgsOSArMTMwOSwxMCBAQAogICAgICAqIFNldHMgYSBmaWVsZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGZpZWxkIHRvIG1vZGlmeQorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgaW5kaWNhdGluZyB0aGUge0Bjb2RlIENhbGVuZGFyfSBmaWVsZCB0byBtb2RpZnkuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGZpZWxkLCBpbnQgdmFsdWUpIHsKICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IHZhbHVlOwpAQCAtNjE4LDE0ICsxMzMwLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgeWVhciwgbW9udGggYW5kIGRheSBvZiB0aGUgbW9udGggZmllbGRzLgorICAgICAqIFNldHMgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgb2YgdGhlIG1vbnRoIGZpZWxkcy4gT3RoZXIgZmllbGRzIGFyZSBub3QKKyAgICAgKiBjaGFuZ2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB5ZWFyCi0gICAgICogICAgICAgICAgICB0aGUgeWVhcgorICAgICAqICAgICAgICAgICAgdGhlIHllYXIuCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgbW9udGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb250aC4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpIHsKICAgICAgICAgc2V0KFlFQVIsIHllYXIpOwpAQCAtNjM1LDE3ICsxMzQ5LDE5IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB5ZWFyLCBtb250aCwgZGF5IG9mIHRoZSBtb250aCwgaG91ciBvZiBkYXkgYW5kIG1pbnV0ZSBmaWVsZHMuCisgICAgICogT3RoZXIgZmllbGRzIGFyZSBub3QgY2hhbmdlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geWVhcgotICAgICAqICAgICAgICAgICAgdGhlIHllYXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyLgogICAgICAqIEBwYXJhbSBtb250aAotICAgICAqICAgICAgICAgICAgdGhlIG1vbnRoCisgICAgICogICAgICAgICAgICB0aGUgbW9udGguCiAgICAgICogQHBhcmFtIGRheQotICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXkgb2YgdGhlIG1vbnRoLgogICAgICAqIEBwYXJhbSBob3VyT2ZEYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBob3VyIG9mIGRheQorICAgICAqICAgICAgICAgICAgdGhlIGhvdXIgb2YgZGF5LgogICAgICAqIEBwYXJhbSBtaW51dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW51dGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW51dGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyT2ZEYXksCiAgICAgICAgICAgICBpbnQgbWludXRlKSB7CkBAIC02NTYsMjAgKzEzNzIsMjEgQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHllYXIsIG1vbnRoLCBkYXkgb2YgdGhlIG1vbnRoLCBob3VyIG9mIGRheSwgbWludXRlIGFuZCBzZWNvbmQKLSAgICAgKiBmaWVsZHMuCisgICAgICogZmllbGRzLiBPdGhlciBmaWVsZHMgYXJlIG5vdCBjaGFuZ2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB5ZWFyCi0gICAgICogICAgICAgICAgICB0aGUgeWVhcgorICAgICAqICAgICAgICAgICAgdGhlIHllYXIuCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgbW9udGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb250aC4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGguCiAgICAgICogQHBhcmFtIGhvdXJPZkRheQotICAgICAqICAgICAgICAgICAgdGhlIGhvdXIgb2YgZGF5CisgICAgICogICAgICAgICAgICB0aGUgaG91ciBvZiBkYXkuCiAgICAgICogQHBhcmFtIG1pbnV0ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZQorICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZS4KICAgICAgKiBAcGFyYW0gc2Vjb25kCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ck9mRGF5LAogICAgICAgICAgICAgaW50IG1pbnV0ZSwgaW50IHNlY29uZCkgewpAQCAtNjc4LDIxICsxMzk1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGZvciB0aGlzIENhbGVuZGFyLgorICAgICAqIFNldHMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBmb3IgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgYSBDYWxlbmRhciBkYXkgb2YgdGhlIHdlZWsKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIENhbGVuZGFyfSBkYXkgb2YgdGhlIHdlZWsuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Rmlyc3REYXlPZldlZWsoaW50IHZhbHVlKSB7CiAgICAgICAgIGZpcnN0RGF5T2ZXZWVrID0gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGlzIENhbGVuZGFyIHRvIGFjY2VwdCBmaWVsZCB2YWx1ZXMgd2hpY2ggYXJlIG91dHNpZGUgdGhlIHZhbGlkCisgICAgICogU2V0cyB0aGlzIHtAY29kZSBDYWxlbmRhcn0gdG8gYWNjZXB0IGZpZWxkIHZhbHVlcyB3aGljaCBhcmUgb3V0c2lkZSB0aGUgdmFsaWQKICAgICAgKiByYW5nZSBmb3IgdGhlIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgYSBib29sZWFuIHZhbHVlCisgICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGVuaWVudChib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGxlbmllbnQgPSB2YWx1ZTsKQEAgLTcwMiwyNyArMTQyMSwzMCBAQAogICAgICAqIFNldHMgdGhlIG1pbmltYWwgZGF5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbWFsIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbWFsIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWluaW1hbERheXNJbkZpcnN0V2VlayhpbnQgdmFsdWUpIHsKICAgICAgICAgbWluaW1hbERheXNJbkZpcnN0V2VlayA9IHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpbWUgb2YgdGhpcyBDYWxlbmRhci4KKyAgICAgKiBTZXRzIHRoZSB0aW1lIG9mIHRoaXMge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqICAgICAgICAgICAgYSBEYXRlIG9iamVjdAorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgRGF0ZX0gb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFRpbWUoRGF0ZSBkYXRlKSB7CiAgICAgICAgIHNldFRpbWVJbk1pbGxpcyhkYXRlLmdldFRpbWUoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZSBvZiB0aGlzIENhbGVuZGFyLgorICAgICAqIFNldHMgdGhlIHRpbWUgb2YgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbi4gMSwgMTk3MAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgSmFuLiAxLCAxOTcwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVJbk1pbGxpcyhsb25nIG1pbGxpc2Vjb25kcykgewogICAgICAgICB0aW1lID0gbWlsbGlzZWNvbmRzOwpAQCAtNzMyLDE5ICsxNDU0LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZXpvbmUgdXNlZCBieSB0aGlzIENhbGVuZGFyLgorICAgICAqIFNldHMgdGhlIHtAY29kZSBUaW1lWm9uZX0gdXNlZCBieSB0aGlzIENhbGVuZGFyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lem9uZQotICAgICAqICAgICAgICAgICAgYSBUaW1lWm9uZQorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgVGltZVpvbmV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKFRpbWVab25lIHRpbWV6b25lKSB7CiAgICAgICAgIHpvbmUgPSB0aW1lem9uZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBDYWxlbmRhci4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIENhbGVuZGFyCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIENhbGVuZGFyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtNzcwLDE5ICsxNDk0LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHRpbWVzIG9mIHRoZSB0d28gQ2FsZW5kYXJzLCB3aGljaCByZXByZXNlbnQgdGhlIG1pbGxpc2Vjb25kcworICAgICAqIENvbXBhcmVzIHRoZSB0aW1lcyBvZiB0aGUgdHdvIHtAY29kZSBDYWxlbmRhcn0sIHdoaWNoIHJlcHJlc2VudCB0aGUgbWlsbGlzZWNvbmRzCiAgICAgICogZnJvbSB0aGUgSmFudWFyeSAxLCAxOTcwIDAwOjAwOjAwLjAwMCBHTVQgKEdyZWdvcmlhbikuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFub3RoZXJDYWxlbmRhcgotICAgICAqICAgICAgICAgICAgYW5vdGhlciBjYWxlbmRhciB0aGF0IGlzIGNvbXBhcmVkIHdpdGguCi0gICAgICogQHJldHVybiAwIGlmIHRoZSB0aW1lcyBvZiB0aGUgdHdvIGNhbGVuZGFyIGFyZSBlcXVhbCwgLTEgaWYgdGhlIHRpbWUgb2YKLSAgICAgKiAgICAgICAgIHRoaXMgY2FsZW5kYXIgaXMgYmVmb3JlIHRoZSBvdGhlciBvbmUsIDEgaWYgdGhlIHRpbWUgb2YgdGhpcwotICAgICAqICAgICAgICAgY2FsZW5kYXIgaXMgYWZ0ZXIgdGhlIG90aGVyIG9uZS4KKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgY2FsZW5kYXIgdGhhdCB0aGlzIG9uZSBpcyBjb21wYXJlZCB3aXRoLgorICAgICAqIEByZXR1cm4gMCBpZiB0aGUgdGltZXMgb2YgdGhlIHR3byB7QGNvZGUgQ2FsZW5kYXJ9cyBhcmUgZXF1YWwsIC0xIGlmIHRoZSB0aW1lIG9mCisgICAgICogICAgICAgICB0aGlzIHtAY29kZSBDYWxlbmRhcn0gaXMgYmVmb3JlIHRoZSBvdGhlciBvbmUsIDEgaWYgdGhlIHRpbWUgb2YgdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIENhbGVuZGFyfSBpcyBhZnRlciB0aGUgb3RoZXIgb25lLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgb2YgY2FsZW5kYXIgaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBvZiB0aGUgY2FsZW5kYXIgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHRpbWUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHRpbWUKICAgICAgKiAgICAgICAgICAgICB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhDYWxlbmRhciBhbm90aGVyQ2FsZW5kYXIpIHsKICAgICAgICAgaWYgKG51bGwgPT0gYW5vdGhlckNhbGVuZGFyKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NvbGxlY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ29sbGVjdGlvbi5qYXZhCmluZGV4IGU4MjFkODIuLmUyNmRiYTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ29sbGVjdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ29sbGVjdGlvbi5qYXZhCkBAIC0xOSw3NCArMTksMTQ5IEBACiAKIAogLyoqCi0gKiBDb2xsZWN0aW9uIGlzIHRoZSByb290IG9mIHRoZSBjb2xsZWN0aW9uIGhpZXJhcmNoeS4KKyAqIHtAY29kZSBDb2xsZWN0aW9ufSBpcyB0aGUgcm9vdCBvZiB0aGUgY29sbGVjdGlvbiBoaWVyYXJjaHkuIEl0IGRlZmluZXMgb3BlcmF0aW9ucyBvbgorICogZGF0YSBjb2xsZWN0aW9ucyBhbmQgdGhlIGJlaGF2aW9yIHRoYXQgdGhleSB3aWxsIGhhdmUgaW4gYWxsIGltcGxlbWVudGF0aW9ucworICogb2Yge0Bjb2RlIENvbGxlY3Rpb259cy4KKyAqIAorICogQWxsIGRpcmVjdCBvciBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbnMgb2Yge0Bjb2RlIENvbGxlY3Rpb259IHNob3VsZCBpbXBsZW1lbnQgYXQKKyAqIGxlYXN0IHR3byBjb25zdHVjdG9ycy4gT25lIHdpdGggbm8gcGFyYW1ldGVycyB3aGljaCBjcmVhdGVzIGFuIGVtcHR5CisgKiBjb2xsZWN0aW9uIGFuZCBvbmUgd2l0aCBhIHBhcmFtZXRlciBvZiB0eXBlIHtAY29kZSBDb2xsZWN0aW9ufS4gVGhpcyBzZWNvbmQKKyAqIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgZGlmZmVyZW50IHR5cGUgYXMgdGhlCisgKiBpbml0aWFsIGNvbGxlY3Rpb24gYnV0IHdpdGggdGhlIHNhbWUgZWxlbWVudHMuIEltcGxlbWVudGF0aW9ucyBvZiB7QGNvZGUgQ29sbGVjdGlvbn0KKyAqIGNhbm5vdCBiZSBmb3JjZWQgdG8gaW1wbGVtZW50IHRoZXNlIHR3byBjb25zdHJ1Y3RvcnMgYnV0IGF0IGxlYXN0IGFsbAorICogaW1wbGVtZW50YXRpb25zIHVuZGVyIHtAY29kZSBqYXZhLnV0aWx9IGRvLgorICogCisgKiBNZXRob2RzIHRoYXQgY2hhbmdlIHRoZSBjb250ZW50IG9mIGEgY29sbGVjdGlvbiB0aHJvdyBhbgorICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpZiB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIGRvZXMgbm90CisgKiBzdXBwb3J0IHRoYXQgb3BlcmF0aW9uLCB0aG91Z2ggaXQncyBub3QgbWFuZGF0b3J5IHRvIHRocm93IHN1Y2ggYW4ge0Bjb2RlIEV4Y2VwdGlvbn0KKyAqIGluIGNhc2VzIHdoZXJlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIHdvdWxkIG5vdCBjaGFuZ2UgdGhlIGNvbGxlY3Rpb24uIEluCisgKiB0aGVzZSBjYXNlcyBpdCdzIHVwIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB3aGV0aGVyIGl0IHRocm93cyBhbgorICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBvciBub3QuCisgKiAKKyAqIE1ldGhvZHMgbWFya2VkIHdpdGggKG9wdGlvbmFsKSBjYW4gdGhyb3cgYW4KKyAqIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gaWYgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBkb2Vzbid0CisgKiBzdXBwb3J0IHRoYXQgbWV0aG9kLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uPEU+IGV4dGVuZHMgSXRlcmFibGU8RT4gewogCiAgICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gYWRkIDxjb2RlPm9iamVjdDwvY29kZT4gdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPi4KKyAgICAgKiBBdHRlbXB0cyB0byBhZGQge0Bjb2RlIG9iamVjdH0gdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyAgICAgKiB7QGNvZGUgQ29sbGVjdGlvbn0gKG9wdGlvbmFsKS4KKyAgICAgKiAKKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBmaW5pc2hlcyBzdWNjZXNzZnVsbHkgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBvYmplY3QKKyAgICAgKiBpcyBjb250YWluZWQgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICogCisgICAgICogSWYgdGhlIGNvbGxlY3Rpb24gd2FzIG1vZGlmaWVkIGl0IHJldHVybnMge0Bjb2RlIHRydWV9LCB7QGNvZGUgZmFsc2V9IGlmCisgICAgICogbm8gY2hhbmdlcyB3ZXJlIG1hZGUuCisgICAgICogCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIENvbGxlY3Rpb259IG1heSBuYXJyb3cgdGhlIHNldCBvZiBhY2NlcHRlZAorICAgICAqIG9iamVjdHMsIGJ1dCBpdCBoYXMgdG8gc3BlY2lmeSB0aGlzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgb2JqZWN0CisgICAgICogdG8gYmUgYWRkZWQgZG9lcyBub3QgbWVldCB0aGlzIHJlc3RyaWN0aW9uLCB0aGVuIGFuCisgICAgICoge0Bjb2RlIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIElmIGEgY29sbGVjdGlvbiBkb2VzIG5vdCB5ZXQgY29udGFpbiBhbiBvYmplY3QgdGhhdCBpcyB0byBiZSBhZGRlZCBhbmQKKyAgICAgKiBhZGRpbmcgdGhlIG9iamVjdCBmYWlscywgdGhpcyBtZXRob2QgPGk+bXVzdDwvaT4gdGhyb3cgYW4gYXBwcm9wcmlhdGUKKyAgICAgKiB1bmNoZWNrZWQgRXhjZXB0aW9uLiBSZXR1cm5pbmcgZmFsc2UgaXMgbm90IHBlcm1pdHRlZCBpbiB0aGlzIGNhc2UKKyAgICAgKiBiZWNhdXNlIGl0IHdvdWxkIHZpb2xhdGUgdGhlIHBvc3Rjb25kaXRpb24gdGhhdCB0aGUgZWxlbWVudCB3aWxsIGJlIHBhcnQKKyAgICAgKiBvZiB0aGUgY29sbGVjdGlvbiBhZnRlciB0aGlzIG1ldGhvZCBmaW5pc2hlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgbW9kaWZpZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGlzCisgICAgICogICAgICAgICBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgQ29sbGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcwotICAgICAqICAgICAgICAgICAgICAgIENvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIENvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259LgorICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIG51bGwgZWxlbWVudHMgY2Fubm90IGJlIGFkZGVkIHRvIHRoZSB7QGNvZGUgQ29sbGVjdGlvbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KTsKIAogICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGFkZCBhbGwgb2YgdGhlIG9iamVjdHMgY29udGFpbmVkIGluIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+Ci0gICAgICogdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgY29sbGVjdGlvbi4KKyAgICAgKiBBdHRlbXB0cyB0byBhZGQgYWxsIG9mIHRoZSBvYmplY3RzIGNvbnRhaW5lZCBpbiB7QGNvZGUgQ29sbGVjdGlvbn0KKyAgICAgKiB0byB0aGUgY29udGVudHMgb2YgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gKG9wdGlvbmFsKS4gSWYgdGhlIHBhc3NlZCB7QGNvZGUgQ29sbGVjdGlvbn0KKyAgICAgKiBpcyBjaGFuZ2VkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgZWxlbWVudHMgdG8gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0sIHRoZQorICAgICAqIGJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgQ29sbGVjdGlvbiBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENvbGxlY3Rpb259IG9mIG9iamVjdHMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBDb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFkZGluZyB0byB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICBDb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIENvbGxlY3Rpb259LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgQ29sbGVjdGlvbgorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufS4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgd2hlbiB7QGNvZGUgY29sbGVjdGlvbn0gaXMge0Bjb2RlIG51bGx9LCBvciBpZiBpdAorICAgICAqICAgICAgICAgICAgICAgIGNvbnRhaW5zIHtAY29kZSBudWxsfSBlbGVtZW50cyBhbmQgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gZG9lcworICAgICAqICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0IHN1Y2ggZWxlbWVudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIENvbGxlY3Rpb24sIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSwgbGVhdmluZyBpdCBlbXB0eSAob3B0aW9uYWwpLgogICAgICAqIAogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBDb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiAKICAgICAgKiBAc2VlICNpc0VtcHR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIENvbGxlY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gY29udGFpbnMgdGhlIHNwZWNpZmllZCBvYmplY3QuIFJldHVybnMKKyAgICAgKiB7QGNvZGUgdHJ1ZX0gaWYgYW5kIG9ubHkgaWYgYXQgbGVhc3Qgb25lIGVsZW1lbnQge0Bjb2RlIGVsZW19IGluIHRoaXMKKyAgICAgKiB7QGNvZGUgQ29sbGVjdGlvbn0gbWVldHMgZm9sbG93aW5nIHJlcXVpcmVtZW50OgorICAgICAqIHtAY29kZSAob2JqZWN0PT1udWxsID8gZWxlbT09bnVsbCA6IG9iamVjdC5lcXVhbHMoZWxlbSkpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqZWN0IGlzIGFuIGVsZW1lbnQgb2YgdGhpcyBDb2xsZWN0aW9uLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvYmplY3QgaXMgYW4gZWxlbWVudCBvZiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCB0byBsb29rIGZvciBpc24ndCBvZiB0aGUgY29ycmVjdAorICAgICAqICAgICAgICAgICAgICAgIHR5cGUuCisgICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgdG8gbG9vayBmb3IgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGlzCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIENvbGxlY3Rpb259IGRvZXNuJ3Qgc3VwcG9ydCB7QGNvZGUgbnVsbH0gZWxlbWVudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCk7CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIENvbGxlY3Rpb24gZm9yIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGNvbnRhaW5zIGFsbCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIENvbGxlY3Rpb259LiBJZiBhbiBlbGVtZW5ldCB7QGNvZGUgZWxlbX0gaXMgY29udGFpbmVkIHNldmVyYWwKKyAgICAgKiB0aW1lcyBpbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBDb2xsZWN0aW9ufSwgdGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfSBldmVuCisgICAgICogaWYge0Bjb2RlIGVsZW19IGlzIGNvbnRhaW5lZCBvbmx5IG9uY2UgaW4gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIGFyZSBlbGVtZW50cyBvZgotICAgICAqICAgICAgICAgdGhpcyBDb2xsZWN0aW9uLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCB7QGNvZGUgQ29sbGVjdGlvbn0gYXJlCisgICAgICogICAgICAgICBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBvbmUgb3IgbW9yZSBlbGVtZW50cyBvZiB7QGNvZGUgY29sbGVjdGlvbn0gaXNuJ3Qgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgY29ycmVjdCB0eXBlLgorICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgY29sbGVjdGlvbn0gY29udGFpbnMgYXQgbGVhc3Qgb25lIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnQgYW5kIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGRvZXNuJ3Qgc3VwcG9ydCB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgICAgICAgICBlbGVtZW50cy4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGNvbGxlY3Rpb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pOwogCkBAIC05NSwxMDcgKzE3MCwxNjQgQEAKICAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIE9iamVjdCB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzCi0gICAgICogICAgICAgICBvYmplY3QgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0LgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdCBhbmQKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBvYmplY3QuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAorICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaC4KICAgICAgKiAKICAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgQ29sbGVjdGlvbiBoYXMgbm8gZWxlbWVudHMsIGEgc2l6ZSBvZiB6ZXJvLgorICAgICAqIFJldHVybnMgaWYgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gY29udGFpbnMgbm8gZWxlbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgQ29sbGVjdGlvbiBoYXMgbm8gZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGhhcyBubyBlbGVtZW50cywge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIAogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBJdGVyYXRvcn0gdGhhdCBtYXkgYmUgdXNlZCB0byBhY2Nlc3MgdGhlCi0gICAgICogb2JqZWN0cyBjb250YWluZWQgYnkgdGhpcyBjb2xsZWN0aW9uLgorICAgICAqIG9iamVjdHMgY29udGFpbmVkIGJ5IHRoaXMge0Bjb2RlIENvbGxlY3Rpb259LiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGVsZW1lbnRzIGFyZQorICAgICAqIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBpcyBub3QgZGVmaW5lZC4gT25seSBpZiB0aGUgaW5zdGFuY2Ugb2YgdGhlCisgICAgICoge0Bjb2RlIENvbGxlY3Rpb259IGhhcyBhIGRlZmluZWQgb3JkZXIgdGhlIGVsZW1lbnRzIGFyZSByZXR1cm5lZCBpbiB0aGF0IG9yZGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIGFjY2Vzc2luZyB0aGUgY29sbGVjdGlvbiBjb250ZW50cworICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIGFjY2Vzc2luZyB0aGUge0Bjb2RlIENvbGxlY3Rpb259IGNvbnRlbnRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMKLSAgICAgKiBDb2xsZWN0aW9uLgorICAgICAqIFJlbW92ZXMgb25lIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaWYgb25lCisgICAgICogaXMgY29udGFpbmVkIChvcHRpb25hbCkuIFRoZSBlbGVtZW50IHtAY29kZSBlbGVtfSB0aGF0IGlzIHJlbW92ZWQKKyAgICAgKiBjb21wbGllcyB3aXRoIHtAY29kZSAob2JqZWN0PT1udWxsID8gZWxlbT09bnVsbCA6IG9iamVjdC5lcXVhbHMoZWxlbSl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgQ29sbGVjdGlvbiBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBpcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBDb2xsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBwYXNzZWQgaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuCisgICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBvYmplY3R9IGlzIHtAY29kZSBudWxsfSBhbmQgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0KKyAgICAgKiAgICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQge0Bjb2RlIG51bGx9IGVsZW1lbnRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIGluIHRoaXMgQ29sbGVjdGlvbiBvZiBlYWNoIG9iamVjdCBpbiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBpbiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBvZiBlYWNoIG9iamVjdCBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIENvbGxlY3Rpb259IChvcHRpb25hbCkuIEFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMgbm9uZSBvZiB0aGUKKyAgICAgKiBlbGVtZW50cyBpbiB0aGUgcGFzc2VkIHtAY29kZSBDb2xsZWN0aW9ufSBjYW4gYmUgZm91bmQgaW4gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0KKyAgICAgKiBhbnltb3JlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIENvbGxlY3Rpb24gaXMgbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byByZW1vdmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiAKICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMgQ29sbGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBvbmUgb3IgbW9yZSBlbGVtZW50cyBvZiB7QGNvZGUgY29sbGVjdGlvbn0KKyAgICAgKiAgICAgICAgICAgICAgICBpc24ndCBvZiB0aGUgY29ycmVjdCB0eXBlLgorICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgY29sbGVjdGlvbn0gY29udGFpbnMgYXQgbGVhc3Qgb25lCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9IGVsZW1lbnQgYW5kIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfSBlbGVtZW50cy4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGNvbGxlY3Rpb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIENvbGxlY3Rpb24gdGhhdCBhcmUgbm90IGFsc28gZm91bmQgaW4gdGhlCi0gICAgICogY29udGVudHMgb2YgPGNvZGU+Y29sbGVjdGlvbjwvY29kZT4uCisgICAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IHRoYXQgYXJlIG5vdCBhbHNvIGZvdW5kIGluIHRoZQorICAgICAqIHtAY29kZSBDb2xsZWN0aW9ufSBwYXNzZWQgKG9wdGlvbmFsKS4gQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufQorICAgICAqIHdpbGwgb25seSBjb250YWluIGVsZW1lbnRzIHRoYXQgYWxzbyBjYW4gYmUgZm91bmQgaW4gdGhlIHtAY29kZSBDb2xsZWN0aW9ufQorICAgICAqIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byByZXRhaW4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBDb2xsZWN0aW9uIGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmV0YWluLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259IGlzIG1vZGlmaWVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIENvbGxlY3Rpb24gaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgb25lIG9yIG1vcmUgZWxlbWVudHMgb2Yge0Bjb2RlIGNvbGxlY3Rpb259CisgICAgICogICAgICAgICAgICAgICAgaXNuJ3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KKyAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGNvbGxlY3Rpb259IGNvbnRhaW5zIGF0IGxlYXN0IG9uZQorICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfSBlbGVtZW50IGFuZCB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBkb2Vzbid0IHN1cHBvcnQKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0gZWxlbWVudHMuCisgICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBjb2xsZWN0aW9ufSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbik7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY291bnQgb2YgaG93IG1hbnkgb2JqZWN0cyBhcmUgY29udGFpbmVkIGJ5IHRoaXMgY29sbGVjdGlvbi4KKyAgICAgKiBSZXR1cm5zIGEgY291bnQgb2YgaG93IG1hbnkgb2JqZWN0cyB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufSBjb250YWlucy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGhvdyBtYW55IG9iamVjdHMgYXJlIGNvbnRhaW5lZCBieSB0aGlzIGNvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIGhvdyBtYW55IG9iamVjdHMgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gY29udGFpbnMsIG9yIEludGVnZXIuTUFYX1ZBTFVFCisgICAgICogICAgICAgICBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIEludGVnZXIuTUFYX1ZBTFVFIGVsZW1lbnRzIGluIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBDb2xsZWN0aW9ufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHNpemUoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMgQ29sbGVjdGlvbi4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIHtAY29kZSBDb2xsZWN0aW9ufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgQ29sbGVjdGlvbgorICAgICAqIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgb3JkZXJlZCBlbGVtZW50cyBpdCB3aWxsIHJldHVybiB0aGUgZWxlbWVudAorICAgICAqIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyIGFzIGFuIGl0ZXJhdG9yIHdvdWxkIHJldHVybiB0aGVtLgorICAgICAqIAorICAgICAqIFRoZSBhcnJheSByZXR1cm5lZCBkb2VzIG5vdCByZWZsZWN0IGFueSBjaGFuZ2VzIG9mIHRoZSB7QGNvZGUgQ29sbGVjdGlvbn0uIEEgbmV3CisgICAgICogYXJyYXkgaXMgY3JlYXRlZCBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIGlzIGFscmVhZHkgYW4KKyAgICAgKiBhcnJheS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIENvbGxlY3Rpb24uIElmCisgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0uIElmCiAgICAgICogdGhlIHNwZWNpZmllZCBhcnJheSBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZWxlbWVudHMsIHRoZSBzcGVjaWZpZWQKICAgICAgKiBhcnJheSBpcyB1c2VkLCBvdGhlcndpc2UgYW4gYXJyYXkgb2YgdGhlIHNhbWUgdHlwZSBpcyBjcmVhdGVkLiBJZiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgYXJyYXkgaXMgdXNlZCBhbmQgaXMgbGFyZ2VyIHRoYW4gdGhpcyBDb2xsZWN0aW9uLCB0aGUgYXJyYXkKLSAgICAgKiBlbGVtZW50IGZvbGxvd2luZyB0aGUgY29sbGVjdGlvbiBlbGVtZW50cyBpcyBzZXQgdG8gbnVsbC4KKyAgICAgKiBzcGVjaWZpZWQgYXJyYXkgaXMgdXNlZCBhbmQgaXMgbGFyZ2VyIHRoYW4gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0sIHRoZSBhcnJheQorICAgICAqIGVsZW1lbnQgZm9sbG93aW5nIHRoZSB7QGNvZGUgQ29sbGVjdGlvbn0gZWxlbWVudHMgaXMgc2V0IHRvIG51bGwuCisgICAgICogCisgICAgICogSWYgdGhlIGltcGxlbWVudGF0aW9uIGhhcyBvcmRlcmVkIGVsZW1lbnRzIGl0IHdpbGwgcmV0dXJuIHRoZSBlbGVtZW50CisgICAgICogYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgYW4gaXRlcmF0b3Igd291bGQgcmV0dXJuIHRoZW0uCisgICAgICogCisgICAgICoge0Bjb2RlIHRvQXJyYXkobmV3IE9iamVjdFswXSl9IGJlaGF2ZXMgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKKyAgICAgKiB7QGNvZGUgdG9BcnJheSgpfSBkb2VzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5Ci0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIENvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMge0Bjb2RlIENvbGxlY3Rpb259LgogICAgICAqIAogICAgICAqIEBleGNlcHRpb24gQXJyYXlTdG9yZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGlzIENvbGxlY3Rpb24gY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyB7QGNvZGUgQ29sbGVjdGlvbn0gY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYXJyYXkpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Db2xsZWN0aW9ucy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Db2xsZWN0aW9ucy5qYXZhCmluZGV4IDE4MjRlYzMuLjU5MDViYzIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ29sbGVjdGlvbnMuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NvbGxlY3Rpb25zLmphdmEKQEAgLTI1LDkgKzI1LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIENvbGxlY3Rpb25zIGNvbnRhaW5zIHN0YXRpYyBtZXRob2RzIHdoaWNoIG9wZXJhdGUgb24gQ29sbGVjdGlvbiBjbGFzc2VzLgorICoge0Bjb2RlIENvbGxlY3Rpb25zfSBjb250YWlucyBzdGF0aWMgbWV0aG9kcyB3aGljaCBvcGVyYXRlIG9uCisgKiB7QGNvZGUgQ29sbGVjdGlvbn0gY2xhc3Nlcy4KICAqIAotICogQHNpbmNlIDEuMgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb2xsZWN0aW9ucyB7CiAKQEAgLTE2OCwxMiArMTY5LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBbiBlbXB0eSBpbW11dGFibGUgaW5zdGFuY2Ugb2Yge0BsaW5rIExpc3R9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBFTVBUWV9MSVNUID0gbmV3IEVtcHR5TGlzdCgpOwogCisgICAgLyoqCisgICAgICogQW4gZW1wdHkgaW1tdXRhYmxlIGluc3RhbmNlIG9mIHtAbGluayBTZXR9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IEVNUFRZX1NFVCA9IG5ldyBFbXB0eVNldCgpOwogCisgICAgLyoqCisgICAgICogQW4gZW1wdHkgaW1tdXRhYmxlIGluc3RhbmNlIG9mIHtAbGluayBNYXB9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIEVNUFRZX01BUCA9IG5ldyBFbXB0eU1hcCgpOwogCkBAIC0xNDEzLDE4ICsxNDI5LDIxIEBACiAKICAgICAvKioKICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogc29ydGVkIExpc3QuCisgICAgICogc29ydGVkIExpc3QuIFRoZSBMaXN0IG5lZWRzIHRvIGJlIGFscmVhZHkgc29ydGVkIGluIG5hdHVyYWwgc29ydGluZworICAgICAqIG9yZGVyLiBTZWFyY2hpbmcgaW4gYW4gdW5zb3J0ZWQgYXJyYXkgaGFzIGFuIHVuZGVmaW5lZCByZXN1bHQuIEl0J3MgYWxzbworICAgICAqIHVuZGVmaW5lZCB3aGljaCBlbGVtZW50IGlzIGZvdW5kIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUKKyAgICAgKiBzYW1lIGVsZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgTGlzdCB0byBzZWFyY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgTGlzdCB0byBzZWFyY2guCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gZmluZAorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gZmluZC4KICAgICAgKiBAcmV0dXJuIHRoZSBub24tbmVnYXRpdmUgaW5kZXggb2YgdGhlIGVsZW1lbnQsIG9yIGEgbmVnYXRpdmUgaW5kZXggd2hpY2gKLSAgICAgKiAgICAgICAgIGlzIHRoZSAtaW5kZXggLSAxIHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkCi0gICAgICogCisgICAgICogICAgICAgICBpcyB0aGUge0Bjb2RlIC1pbmRleCAtIDF9IHdoZXJlIHRoZSBlbGVtZW50IHdvdWxkIGJlIGluc2VydGVkCiAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGFuIGVsZW1lbnQgaW4gdGhlIExpc3Qgb3IgdGhlIHNlYXJjaCBlbGVtZW50IGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgaW1wbGVtZW50IENvbXBhcmFibGUsIG9yIGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoIG90aGVyCisgICAgICogICAgICAgICAgICAgaWYgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBvciB0aGUgc2VhcmNoIGVsZW1lbnQgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpbXBsZW1lbnQgQ29tcGFyYWJsZSwgb3IgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyA8VD4gaW50IGJpbmFyeVNlYXJjaCgKQEAgLTE0NjcsMjEgKzE0ODYsMjQgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzb3J0ZWQgTGlzdCB1c2luZyB0aGUgc3BlY2lmaWVkIENvbXBhcmF0b3IuCisgICAgICogc29ydGVkIExpc3QgdXNpbmcgdGhlIHNwZWNpZmllZCBDb21wYXJhdG9yLiBUaGUgTGlzdCBuZWVkcyB0byBiZSBhbHJlYWR5CisgICAgICogc29ydGVkIGFjY29yZGluZyB0byB0aGUgY29tcGFyYXRvciBwYXNzZWQuIFNlYXJjaGluZyBpbiBhbiB1bnNvcnRlZCBhcnJheQorICAgICAqIGhhcyBhbiB1bmRlZmluZWQgcmVzdWx0LiBJdCdzIGFsc28gdW5kZWZpbmVkIHdoaWNoIGVsZW1lbnQgaXMgZm91bmQgaWYKKyAgICAgKiB0aGVyZSBhcmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBMaXN0IHRvIHNlYXJjaAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBMaXN0IHRvIHNlYXJjaC4KICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byBmaW5kCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byBmaW5kLgogICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgQ29tcGFyYXRvci4gSWYgdGhlIGNvbXBhcmF0b3IgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbgotICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCB1c2VzIHRoZSBvYmplY3RzJyBuYXR1cmFsIG9yZGVyaW5nLgorICAgICAqICAgICAgICAgICAgdGhlIENvbXBhcmF0b3IuIElmIHRoZSBjb21wYXJhdG9yIGlzIHtAY29kZSBudWxsfSB0aGVuIHRoZQorICAgICAqICAgICAgICAgICAgc2VhcmNoIHVzZXMgdGhlIG9iamVjdHMnIG5hdHVyYWwgb3JkZXJpbmcuCiAgICAgICogQHJldHVybiB0aGUgbm9uLW5lZ2F0aXZlIGluZGV4IG9mIHRoZSBlbGVtZW50LCBvciBhIG5lZ2F0aXZlIGluZGV4IHdoaWNoCi0gICAgICogICAgICAgICBpcyB0aGUgLWluZGV4IC0gMSB3aGVyZSB0aGUgZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZAotICAgICAqIAorICAgICAqICAgICAgICAgaXMgdGhlIHtAY29kZSAtaW5kZXggLSAxfSB3aGVyZSB0aGUgZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZC4KICAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIHdoZW4gYW4gZWxlbWVudCBpbiB0aGUgbGlzdCBhbmQgdGhlIHNlYXJjaGVkIGVsZW1lbnQgY2Fubm90Ci0gICAgICogICAgICAgICAgICAgYmUgY29tcGFyZWQgdG8gZWFjaCBvdGhlciB1c2luZyB0aGUgQ29tcGFyYXRvcgorICAgICAqICAgICAgICAgICAgIGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIgdXNpbmcgdGhlIENvbXBhcmF0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyA8VD4gaW50IGJpbmFyeVNlYXJjaChMaXN0PD8gZXh0ZW5kcyBUPiBsaXN0LCBUIG9iamVjdCwKQEAgLTE1MTksMTYgKzE1NDEsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHNvdXJjZSBsaXN0IHRvIHRoZSBkZXN0aW5hdGlvbiBsaXN0LgorICAgICAqIENvcGllcyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgc291cmNlIGxpc3QgdG8gdGhlIGRlc3RpbmF0aW9uIGxpc3QuIEF0IHRoZQorICAgICAqIGVuZCBib3RoIGxpc3RzIHdpbGwgaGF2ZSB0aGUgc2FtZSBvYmplY3RzIGF0IHRoZSBzYW1lIGluZGV4LiBJZiB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiBhcnJheSBpcyBsYXJnZXIgdGhhbiB0aGUgc291cmNlIGxpc3QsIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiBsaXN0IHdpdGgge0Bjb2RlIGluZGV4ID49IHNvdXJjZS5zaXplKCl9IHdpbGwgYmUgdW5jaGFuZ2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgd2hvc2UgZWxlbWVudHMgYXJlIHNldCBmcm9tIHRoZSBzb3VyY2UgbGlzdC4KICAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCB3aXRoIHRoZSBlbGVtZW50cyB0byBiZSBjb3BpZWQgaW50byB0aGUgZGVzdGluYXRpb24uCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgZGVzdGluYXRpb24gTGlzdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNvdXJjZSBMaXN0CisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgZGVzdGluYXRpb24gTGlzdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNvdXJjZSBMaXN0LgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICB3aGVuIHJlcGxhY2luZyBhbiBlbGVtZW50IGluIHRoZSBkZXN0aW5hdGlvbiBsaXN0IGlzIG5vdAotICAgICAqICAgICAgICAgICAgIHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgIHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIGNvcHkoTGlzdDw/IHN1cGVyIFQ+IGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgVD4gc291cmNlKSB7CkBAIC0xNTQ4LDExICsxNTc1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBvbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24uCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgRW51bWVyYXRpb259IG9uIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gdG8gZW51bWVyYXRlCi0gICAgICogQHJldHVybiBhbiBFbnVtZXJhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gdG8gZW51bWVyYXRlLgorICAgICAqIEByZXR1cm4gYW4gRW51bWVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gRW51bWVyYXRpb248VD4gZW51bWVyYXRpb24oQ29sbGVjdGlvbjxUPiBjb2xsZWN0aW9uKSB7CiAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248VD4gYyA9IGNvbGxlY3Rpb247CkBAIC0xNTczLDEyICsxNjAxLDEyIEBACiAgICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCBMaXN0IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsaXN0Ci0gICAgICogICAgICAgICAgICB0aGUgTGlzdCB0byBmaWxsCisgICAgICogICAgICAgICAgICB0aGUgTGlzdCB0byBmaWxsLgogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxsIGVsZW1lbnQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHRvIGZpbGwgdGhlIGxpc3Qgd2l0aC4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgZmlsbChMaXN0PD8gc3VwZXIgVD4gbGlzdCwgVCBvYmplY3QpIHsKICAgICAgICAgTGlzdEl0ZXJhdG9yPD8gc3VwZXIgVD4gaXQgPSBsaXN0Lmxpc3RJdGVyYXRvcigpOwpAQCAtMTU5MiwxMiArMTYyMCwxMyBAQAogICAgICAqIFNlYXJjaGVzIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBmb3IgdGhlIG1heGltdW0gZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gdG8gc2VhcmNoCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiB0byBzZWFyY2guCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uLgogICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgd2hlbiBhbiBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uIGRvZXMgbm90IGltcGxlbWVudAotICAgICAqICAgICAgICAgICAgIENvbXBhcmFibGUgb3IgZWxlbWVudHMgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgQ29tcGFyYWJsZX0gb3IgZWxlbWVudHMgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2gKKyAgICAgKiAgICAgICAgICAgICBvdGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgT2JqZWN0ICYgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiBUIG1heCgKICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGNvbGxlY3Rpb24pIHsKQEAgLTE2MTcsMTQgKzE2NDYsMTQgQEAKICAgICAgKiBzcGVjaWZpZWQgQ29tcGFyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gdG8gc2VhcmNoCisgICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiB0byBzZWFyY2guCiAgICAgICogQHBhcmFtIGNvbXBhcmF0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBDb21wYXJhdG9yCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgQ29tcGFyYXRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgaW4gdGhlIENvbGxlY3Rpb24uCiAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICB3aGVuIGVsZW1lbnRzIGluIHRoZSBDb2xsZWN0aW9uIGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoCi0gICAgICogICAgICAgICAgICAgb3RoZXIgdXNpbmcgdGhlIENvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgICBvdGhlciB1c2luZyB0aGUge0Bjb2RlIENvbXBhcmF0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgbWF4KENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGNvbGxlY3Rpb24sCiAgICAgICAgICAgICBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY29tcGFyYXRvcikgewpAQCAtMTY0MywxMiArMTY3MiwxMyBAQAogICAgICAqIFNlYXJjaGVzIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBmb3IgdGhlIG1pbmltdW0gZWxlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gdG8gc2VhcmNoCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiB0byBzZWFyY2guCisgICAgICogQHJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uLgogICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgd2hlbiBhbiBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uIGRvZXMgbm90IGltcGxlbWVudAotICAgICAqICAgICAgICAgICAgIENvbXBhcmFibGUgb3IgZWxlbWVudHMgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgQ29tcGFyYWJsZX0gb3IgZWxlbWVudHMgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2gKKyAgICAgKiAgICAgICAgICAgICBvdGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgT2JqZWN0ICYgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiBUIG1pbigKICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGNvbGxlY3Rpb24pIHsKQEAgLTE2NjgsMTQgKzE2OTgsMTQgQEAKICAgICAgKiBzcGVjaWZpZWQgQ29tcGFyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gdG8gc2VhcmNoCisgICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiB0byBzZWFyY2guCiAgICAgICogQHBhcmFtIGNvbXBhcmF0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBDb21wYXJhdG9yCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IGluIHRoZSBDb2xsZWN0aW9uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgQ29tcGFyYXRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgaW4gdGhlIENvbGxlY3Rpb24uCiAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICB3aGVuIGVsZW1lbnRzIGluIHRoZSBDb2xsZWN0aW9uIGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoCi0gICAgICogICAgICAgICAgICAgb3RoZXIgdXNpbmcgdGhlIENvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgICBvdGhlciB1c2luZyB0aGUge0Bjb2RlIENvbXBhcmF0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgbWluKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGNvbGxlY3Rpb24sCiAgICAgICAgICAgICBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY29tcGFyYXRvcikgewpAQCAtMTY5MiwzMCArMTcyMiwzMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIExpc3QgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0gICAgICogVGhlIGxpc3QgY2Fubm90IGJlIG1vZGlmaWVkLgorICAgICAqIFRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZC4gVGhlIGxpc3QgaXMgc2VyaWFsaXphYmxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBMaXN0CisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgbGlzdC4KICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gYSBMaXN0IGNvbnRhaW5pbmcgPGNvZGU+bGVuZ3RoPC9jb2RlPiBjb3BpZXMgb2YgdGhlIGVsZW1lbnQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHRvIGJlIGFkZGVkIHtAY29kZSBsZW5ndGh9IHRpbWVzIHRvIGEgbGlzdC4KKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBjb250YWluaW5nIHtAY29kZSBsZW5ndGh9IGNvcGllcyBvZiB0aGUgZWxlbWVudC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+bGVuZ3RoIDwgMDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHtAY29kZSBsZW5ndGggPCAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IG5Db3BpZXMoZmluYWwgaW50IGxlbmd0aCwgVCBvYmplY3QpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDb3BpZXNMaXN0PFQ+KGxlbmd0aCwgb2JqZWN0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdXBwbGllZCA8Y29kZT5MaXN0PC9jb2RlPiB3aXRoIHRoZSBvcmRlciBvZiBpdHMgY29udGFpbmVkCi0gICAgICogZWxlbWVudHMgcmV2ZXJzZWQuCisgICAgICogTW9kaWZpZXMgdGhlIHNwZWNpZmllZCB7QGNvZGUgTGlzdH0gYnkgcmV2ZXJzaW5nIHRoZSBvcmRlciBvZiB0aGUKKyAgICAgKiBlbGVtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gcmV2ZXJzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gcmV2ZXJzZS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXZlcnNlKExpc3Q8Pz4gbGlzdCkgewpAQCAtMTczMiwzOSArMTc2MiwzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgogICAgICAqIEEgQ29tcGFyYXRvciB3aGljaCByZXZlcnNlcyB0aGUgbmF0dXJhbCBvcmRlciBvZiB0aGUgZWxlbWVudHMuIFRoZQotICAgICAqIDxjb2RlPkNvbXBhcmF0b3I8L2NvZGU+IHRoYXQncyByZXR1cm5lZCBpcyB7QGxpbmsgU2VyaWFsaXphYmxlfS4KLSAgICAgKiA8L3A+CisgICAgICoge0Bjb2RlIENvbXBhcmF0b3J9IHRoYXQncyByZXR1cm5lZCBpcyB7QGxpbmsgU2VyaWFsaXphYmxlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgPGNvZGU+Q29tcGFyYXRvcjwvY29kZT4gaW5zdGFuY2UuCi0gICAgICogCisgICAgICogQHJldHVybiBhIHtAY29kZSBDb21wYXJhdG9yfSBpbnN0YW5jZS4KICAgICAgKiBAc2VlIENvbXBhcmF0b3IKICAgICAgKiBAc2VlIENvbXBhcmFibGUKICAgICAgKiBAc2VlIFNlcmlhbGl6YWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENvbXBhcmF0b3I8VD4gcmV2ZXJzZU9yZGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IFJldmVyc2VDb21wYXJhdG9yPFQ+KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+CiAgICAgICogUmV0dXJucyBhIHtAbGluayBDb21wYXJhdG9yfSB0aGF0IHJldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUKLSAgICAgKiA8Y29kZT5Db21wYXJhdG9yPC9jb2RlPiBwYXNzZWQuIElmIHRoZSA8Y29kZT5Db21wYXJhdG9yPC9jb2RlPiBwYXNzZWQKLSAgICAgKiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCi0gICAgICoge0BsaW5rICNyZXZlcnNlT3JkZXIoKX0uCi0gICAgICogPC9wPgotICAgICAqIAorICAgICAqIHtAY29kZSBDb21wYXJhdG9yfSBwYXNzZWQuIElmIHRoZSB7QGNvZGUgQ29tcGFyYXRvcn0gcGFzc2VkIGlzCisgICAgICoge0Bjb2RlIG51bGx9LCB0aGVuIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8ge0BsaW5rICNyZXZlcnNlT3JkZXIoKX0uCiAgICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPkNvbXBhcmF0b3I8L2NvZGU+IHRoYXQncyByZXR1cm5lZCBpcyB7QGxpbmsgU2VyaWFsaXphYmxlfSBpZgotICAgICAqIHRoZSA8Y29kZT5Db21wYXJhdG9yPC9jb2RlPiBwYXNzZWQgaXMgc2VyaWFsaXphYmxlIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIFRoZSB7QGNvZGUgQ29tcGFyYXRvcn0gdGhhdCdzIHJldHVybmVkIGlzIHtAbGluayBTZXJpYWxpemFibGV9IGlmIHRoZQorICAgICAqIHtAY29kZSBDb21wYXJhdG9yfSBwYXNzZWQgaXMgc2VyaWFsaXphYmxlIG9yIHtAY29kZSBudWxsfS4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5Db21wYXJhdG9yPC9jb2RlPiB0byByZXZlcnNlIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gQSA8Y29kZT5Db21wYXJhdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ29tcGFyYXRvcn0gdG8gcmV2ZXJzZSBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBhIHtAY29kZSBDb21wYXJhdG9yfSBpbnN0YW5jZS4KICAgICAgKiBAc2VlIENvbXBhcmF0b3IKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gQ29tcGFyYXRvcjxUPiByZXZlcnNlT3JkZXIoQ29tcGFyYXRvcjxUPiBjKSB7CiAgICAgICAgIGlmIChjID09IG51bGwpIHsKQEAgLTE3NzcsMTAgKzE4MDEsMTEgQEAKICAgICAgKiBNb3ZlcyBldmVyeSBlbGVtZW50IG9mIHRoZSBMaXN0IHRvIGEgcmFuZG9tIG5ldyBwb3NpdGlvbiBpbiB0aGUgbGlzdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2h1ZmZsZQorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2h1ZmZsZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaHVmZmxlKExpc3Q8Pz4gbGlzdCkgewogICAgICAgICBzaHVmZmxlKGxpc3QsIG5ldyBSYW5kb20oKSk7CkBAIC0xNzkxLDEyICsxODE2LDEzIEBACiAgICAgICogdXNpbmcgdGhlIHNwZWNpZmllZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2h1ZmZsZQorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2h1ZmZsZS4KICAgICAgKiBAcGFyYW0gcmFuZG9tCi0gICAgICogICAgICAgICAgICB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgd2hlbiByZXBsYWNpbmcgYW4gZWxlbWVudCBpbiB0aGUgTGlzdCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaHVmZmxlKExpc3Q8Pz4gbGlzdCwgUmFuZG9tIHJhbmRvbSkgewpAQCAtMTgzMywxMSArMTg1OSwxMiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIFNldCBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gVGhlIHNldCBjYW5ub3QgYmUKLSAgICAgKiBtb2RpZmllZC4KKyAgICAgKiBtb2RpZmllZC4gVGhlIHNldCBpcyBzZXJpYWxpemFibGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIGEgU2V0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYSBTZXQgY29udGFpbmluZyB0aGUgZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gc2luZ2xldG9uKEUgb2JqZWN0KSB7CiAgICAgICAgIHJldHVybiBuZXcgU2luZ2xldG9uU2V0PEU+KG9iamVjdCk7CkBAIC0xODQ1LDExICsxODcyLDEyIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgTGlzdCBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gVGhlIGxpc3QgY2Fubm90IGJlCi0gICAgICogbW9kaWZpZWQuCisgICAgICogbW9kaWZpZWQuIFRoZSBsaXN0IGlzIHNlcmlhbGl6YWJsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gYSBMaXN0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYSBMaXN0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzaW5nbGV0b25MaXN0KEUgb2JqZWN0KSB7CiAgICAgICAgIHJldHVybiBuZXcgU2luZ2xldG9uTGlzdDxFPihvYmplY3QpOwpAQCAtMTg1NywyNyArMTg4NSwyOSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIE1hcCBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQga2V5IGFuZCB2YWx1ZS4gVGhlIG1hcCBjYW5ub3QgYmUKLSAgICAgKiBtb2RpZmllZC4KKyAgICAgKiBtb2RpZmllZC4gVGhlIG1hcCBpcyBzZXJpYWxpemFibGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZQotICAgICAqIEByZXR1cm4gYSBNYXAgY29udGFpbmluZyB0aGUga2V5IGFuZCB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBNYXAgY29udGFpbmluZyB0aGUga2V5IGFuZCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gc2luZ2xldG9uTWFwKEsga2V5LCBWIHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBuZXcgU2luZ2xldG9uTWFwPEssIFY+KGtleSwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgTGlzdCBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBMaXN0IGluIGFzY2VuZGluZyBuYXR1cmFsIG9yZGVyLiBUaGUgYWxnb3JpdGhtIGlzCisgICAgICogc3RhYmxlIHdoaWNoIG1lYW5zIGVxdWFsIGVsZW1lbnRzIGRvbid0IGdldCByZW9yZGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIGJlIHNvcnRlZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gYmUgc29ydGVkLgogICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgd2hlbiBhbiBlbGVtZW50IGluIHRoZSBMaXN0IGRvZXMgbm90IGltcGxlbWVudCBDb21wYXJhYmxlIG9yCi0gICAgICogICAgICAgICAgICAgZWxlbWVudHMgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIKKyAgICAgKiAgICAgICAgICAgICBlbGVtZW50cyBjYW5ub3QgYmUgY29tcGFyZWQgdG8gZWFjaCBvdGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiB2b2lkIHNvcnQoTGlzdDxUPiBsaXN0KSB7CkBAIC0xODkyLDE2ICsxOTIyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU29ydHMgdGhlIHNwZWNpZmllZCBMaXN0IHVzaW5nIHRoZSBzcGVjaWZpZWQgQ29tcGFyYXRvci4KKyAgICAgKiBTb3J0cyB0aGUgc3BlY2lmaWVkIExpc3QgdXNpbmcgdGhlIHNwZWNpZmllZCBDb21wYXJhdG9yLiBUaGUgYWxnb3JpdGhtIGlzCisgICAgICogc3RhYmxlIHdoaWNoIG1lYW5zIGVxdWFsIGVsZW1lbnRzIGRvbid0IGdldCByZW9yZGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIGJlIHNvcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gYmUgc29ydGVkLgogICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgQ29tcGFyYXRvcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIENvbXBhcmF0b3IuCiAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICB3aGVuIGVsZW1lbnRzIGluIHRoZSBMaXN0IGNhbm5vdCBiZSBjb21wYXJlZCB0byBlYWNoIG90aGVyCi0gICAgICogICAgICAgICAgICAgdXNpbmcgdGhlIENvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgICB1c2luZyB0aGUgQ29tcGFyYXRvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIHNvcnQoTGlzdDxUPiBsaXN0LCBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY29tcGFyYXRvcikgewpAQCAtMTkxNiwxOSArMTk0NywyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN3YXBzIHRoZSBlbGVtZW50cyBvZiBMaXN0IDxjb2RlPmxpc3Q8L2NvZGU+IGF0IGluZGljZXMKLSAgICAgKiA8Y29kZT5pbmRleDE8L2NvZGU+IGFuZCA8Y29kZT5pbmRleDI8L2NvZGU+CisgICAgICogU3dhcHMgdGhlIGVsZW1lbnRzIG9mIExpc3Qge0Bjb2RlIGxpc3R9IGF0IGluZGljZXMge0Bjb2RlIGluZGV4MX0gYW5kCisgICAgICoge0Bjb2RlIGluZGV4Mn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIG1hbmlwdWxhdGUgb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIG1hbmlwdWxhdGUuCiAgICAgICogQHBhcmFtIGluZGV4MQotICAgICAqICAgICAgICAgICAgaW50IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBlbGVtZW50IHRvIHN3YXAgd2l0aCB0aGUgZWxlbWVudCBpbgotICAgICAqICAgICAgICAgICAgaW5kZXgyCisgICAgICogICAgICAgICAgICBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgZWxlbWVudCB0byBzd2FwIHdpdGggdGhlIGVsZW1lbnQgaW4KKyAgICAgKiAgICAgICAgICAgIGluZGV4Mi4KICAgICAgKiBAcGFyYW0gaW5kZXgyCi0gICAgICogICAgICAgICAgICBpbnQgcG9zaXRpb24gb2YgdGhlIG90aGVyIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHBvc2l0aW9uIG9mIHRoZSBvdGhlciBlbGVtZW50LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGluZGV4MSBvciBpbmRleDIgaXMgb3V0IG9mIHJhbmdlIG9mIHRoaXMgbGlzdAorICAgICAqICAgICAgICAgICAgIGlmIGluZGV4MSBvciBpbmRleDIgaXMgb3V0IG9mIHJhbmdlIG9mIHRoaXMgbGlzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3dhcChMaXN0PD8+IGxpc3QsIGludCBpbmRleDEsIGludCBpbmRleDIpIHsKQEAgLTE5NDMsMjMgKzE5NzUsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2YgT2JqZWN0IDxjb2RlPm9iajwvY29kZT4gaW4KLSAgICAgKiA8Y29kZT5saXN0PC9jb2RlPiB3aXRoIDxjb2RlPm5ld09iajwvY29kZT4uIElmIHRoZSA8Y29kZT5vYmo8L2NvZGU+Ci0gICAgICogaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYWxsIG9jY3VycmVuY2VzIG9mIDxjb2RlPm51bGw8L2NvZGU+IGlzCi0gICAgICogcmVwbGFjZWQgd2l0aCA8Y29kZT5uZXdPYmo8L2NvZGU+LgorICAgICAqIFJlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiBPYmplY3Qge0Bjb2RlIG9ian0gaW4ge0Bjb2RlIGxpc3R9IHdpdGgKKyAgICAgKiB7QGNvZGUgbmV3T2JqfS4gSWYgdGhlIHtAY29kZSBvYmp9IGlzIHtAY29kZSBudWxsfSwgdGhlbiBhbGwKKyAgICAgKiBvY2N1cnJlbmNlcyBvZiB7QGNvZGUgbnVsbH0gYXJlIHJlcGxhY2VkIHdpdGgge0Bjb2RlIG5ld09ian0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIG1vZGlmeQorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gbW9kaWZ5LgogICAgICAqIEBwYXJhbSBvYmoKICAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gZmluZCBhbmQgcmVwbGFjZSBvY2N1cnJlbmNlcyBvZi4KICAgICAgKiBAcGFyYW0gb2JqMgotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiA8Y29kZT5vYmo8L2NvZGU+IGluCi0gICAgICogICAgICAgICAgICA8Y29kZT5saXN0PC9jb2RlPgotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYXQgbGVhc3Qgb25lIG9jY3VycmVuY2Ugb2YgPGNvZGU+b2JqPC9jb2RlPiBoYXMgYmVlbgotICAgICAqICAgICAgICAgZm91bmQgaW4gPGNvZGU+bGlzdDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2Yge0Bjb2RlIG9ian0gaW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaXN0fS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGF0IGxlYXN0IG9uZSBvY2N1cnJlbmNlIG9mIHtAY29kZSBvYmp9IGhhcyBiZWVuIGZvdW5kIGluCisgICAgICogICAgICAgICB7QGNvZGUgbGlzdH0uCiAgICAgICogCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsaXN0IGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyBlbGVtZW50cworICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsaXN0IGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyBlbGVtZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUPiBib29sZWFuIHJlcGxhY2VBbGwoTGlzdDxUPiBsaXN0LCBUIG9iaiwgVCBvYmoyKSB7CiAgICAgICAgIGludCBpbmRleDsKQEAgLTE5NzMsMTcgKzIwMDUsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSb3RhdGVzIHRoZSBlbGVtZW50cyBpbiBMaXN0IDxjb2RlPmxpc3Q8L2NvZGU+IGJ5IHRoZSBkaXN0YW5jZQotICAgICAqIDxjb2RlPmRpc3Q8L2NvZGU+CisgICAgICogUm90YXRlcyB0aGUgZWxlbWVudHMgaW4gTGlzdCB7QGNvZGUgbGlzdH0gYnkgdGhlIGRpc3RhbmNlIHtAY29kZSBkaXN0fQogICAgICAqIDxwPgogICAgICAqIGUuZy4gZm9yIGEgZ2l2ZW4gbGlzdCB3aXRoIGVsZW1lbnRzIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwXSwKICAgICAgKiBjYWxsaW5nIHJvdGF0ZShsaXN0LCAzKSBvciByb3RhdGUobGlzdCwgLTcpIHdvdWxkIG1vZGlmeSB0aGUgbGlzdCB0byBsb29rCiAgICAgICogbGlrZSB0aGlzOiBbOCwgOSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgN10KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGxzdAorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIHJvdGF0ZWQuCiAgICAgICogQHBhcmFtIGRpc3QKLSAgICAgKiAgICAgICAgICAgIEl0IGNhbiBiZSBhbnkgaW50ZWdlcjogMCwgcG9zaXRpdmUsIG5lZ2F0aXZlLCBsYXJnZXIgdGhhbiB0aGUKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgc2l6ZQorICAgICAqICAgICAgICAgICAgaXMgdGhlIGRpc3RhbmNlIHRoZSBsaXN0IGlzIHJvdGF0ZWQuIFRoaXMgY2FuIGJlIGFueSB2YWxpZAorICAgICAqICAgICAgICAgICAgaW50ZWdlci4gTmVnYXRpdmUgdmFsdWVzIHJvdGF0ZSB0aGUgbGlzdCBiYWNrd2FyZHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJvdGF0ZShMaXN0PD8+IGxzdCwgaW50IGRpc3QpIHsKQEAgLTIwMzEsMTggKzIwNjUsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGUgPGNvZGU+bGlzdDwvY29kZT4gZm9yIDxjb2RlPnN1Ymxpc3Q8L2NvZGU+IGFuZCByZXR1cm5zCi0gICAgICogdGhlIGJlZ2lubmluZyBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgKiBTZWFyY2hlcyB0aGUge0Bjb2RlIGxpc3R9IGZvciB7QGNvZGUgc3VibGlzdH0gYW5kIHJldHVybnMgdGhlIGJlZ2lubmluZworICAgICAqIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlLgogICAgICAqIDxwPgotICAgICAqIC0xIGlzIHJldHVybmVkIGlmIHRoZSA8Y29kZT5zdWJsaXN0PC9jb2RlPiBkb2VzIG5vdCBleGlzdCBpbgotICAgICAqIDxjb2RlPmxpc3Q8L2NvZGU+CisgICAgICogLTEgaXMgcmV0dXJuZWQgaWYgdGhlIHtAY29kZSBzdWJsaXN0fSBkb2VzIG5vdCBleGlzdCBpbiB7QGNvZGUgbGlzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIHNlYXJjaCA8Y29kZT5zdWJsaXN0PC9jb2RlPiBpbgorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2VhcmNoIHtAY29kZSBzdWJsaXN0fSBpbi4KICAgICAgKiBAcGFyYW0gc3VibGlzdAotICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2VhcmNoIGluIDxjb2RlPmxpc3Q8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mCi0gICAgICogICAgICAgICA8Y29kZT5zdWJsaXN0PC9jb2RlPiBpbiA8Y29kZT5saXN0PC9jb2RlPiwgb3IgLTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIHNlYXJjaCBpbiB7QGNvZGUgbGlzdH0uCisgICAgICogQHJldHVybiB0aGUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHtAY29kZSBzdWJsaXN0fSBpbgorICAgICAqICAgICAgICAge0Bjb2RlIGxpc3R9LCBvciAtMS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBpbmRleE9mU3ViTGlzdChMaXN0PD8+IGxpc3QsIExpc3Q8Pz4gc3VibGlzdCkgewogICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwpAQCAtMjA5OSwxOCArMjEzMywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoZSA8Y29kZT5saXN0PC9jb2RlPiBmb3IgPGNvZGU+c3VibGlzdDwvY29kZT4gYW5kIHJldHVybnMKLSAgICAgKiB0aGUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2UuCisgICAgICogU2VhcmNoZXMgdGhlIHtAY29kZSBsaXN0fSBmb3Ige0Bjb2RlIHN1Ymxpc3R9IGFuZCByZXR1cm5zIHRoZSBiZWdpbm5pbmcKKyAgICAgKiBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlLgogICAgICAqIDxwPgotICAgICAqIC0xIGlzIHJldHVybmVkIGlmIHRoZSA8Y29kZT5zdWJsaXN0PC9jb2RlPiBkb2VzIG5vdCBleGlzdCBpbgotICAgICAqIDxjb2RlPmxpc3Q8L2NvZGU+CisgICAgICogLTEgaXMgcmV0dXJuZWQgaWYgdGhlIHtAY29kZSBzdWJsaXN0fSBkb2VzIG5vdCBleGlzdCBpbiB7QGNvZGUgbGlzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIHNlYXJjaCA8Y29kZT5zdWJsaXN0PC9jb2RlPiBpbgorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2VhcmNoIHtAY29kZSBzdWJsaXN0fSBpbi4KICAgICAgKiBAcGFyYW0gc3VibGlzdAotICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2VhcmNoIGluIDxjb2RlPmxpc3Q8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YKLSAgICAgKiAgICAgICAgIDxjb2RlPnN1Ymxpc3Q8L2NvZGU+IGluIDxjb2RlPmxpc3Q8L2NvZGU+LCBvciAtMQorICAgICAqICAgICAgICAgICAgdGhlIExpc3QgdG8gc2VhcmNoIGluIHtAY29kZSBsaXN0fS4KKyAgICAgKiBAcmV0dXJuIHRoZSBiZWdpbm5pbmcgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB7QGNvZGUgc3VibGlzdH0gaW4KKyAgICAgKiAgICAgICAgIHtAY29kZSBsaXN0fSwgb3IgLTEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2ZTdWJMaXN0KExpc3Q8Pz4gbGlzdCwgTGlzdDw/PiBzdWJsaXN0KSB7CiAgICAgICAgIGludCBzdWJsaXN0U2l6ZSA9IHN1Ymxpc3Quc2l6ZSgpOwpAQCAtMjE2NCwxMyArMjE5OCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gQXJyYXlMaXN0IHdpdGggYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUKLSAgICAgKiA8Y29kZT5lbnVtZXJhdGlvbjwvY29kZT4uIFRoZSBlbGVtZW50cyBpbiB0aGUgcmV0dXJuZWQgQXJyYXlMaXN0IGFyZQotICAgICAqIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSA8Y29kZT5lbnVtZXJhdGlvbjwvY29kZT4uCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgQXJyYXlMaXN0fSB3aXRoIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICoge0Bjb2RlIGVudW1lcmF0aW9ufS4gVGhlIGVsZW1lbnRzIGluIHRoZSByZXR1cm5lZCBBcnJheUxpc3QgYXJlIGluIHRoZQorICAgICAqIHNhbWUgb3JkZXIgYXMgaW4gdGhlIHtAY29kZSBlbnVtZXJhdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGVudW1lcmF0aW9uCi0gICAgICogICAgICAgICAgICBFbnVtZXJhdGlvbgotICAgICAqIEByZXR1cm4gYW5kIEFycmF5TGlzdAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSB7QGxpbmsgRW51bWVyYXRpb259LgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIEFycmF5TGlzdH0gZnJvbSB7QGNvZGUgZW51bWVyYXRpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEFycmF5TGlzdDxUPiBsaXN0KEVudW1lcmF0aW9uPFQ+IGVudW1lcmF0aW9uKSB7CiAgICAgICAgIEFycmF5TGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPigpOwpAQCAtMjE4NSw4ICsyMjIwLDkgQEAKICAgICAgKiBhY2Nlc3MgdG8gdGhlIENvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uCi0gICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiB0byB3cmFwIGluIGEgc3luY2hyb25pemVkIGNvbGxlY3Rpb24uCisgICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENvbGxlY3Rpb248VD4gc3luY2hyb25pemVkQ29sbGVjdGlvbigKICAgICAgICAgICAgIENvbGxlY3Rpb248VD4gY29sbGVjdGlvbikgewpAQCAtMjIwMSw4ICsyMjM3LDkgQEAKICAgICAgKiB0aGUgTGlzdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqICAgICAgICAgICAgdGhlIExpc3QKLSAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIExpc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIHdyYXAgaW4gYSBzeW5jaHJvbml6ZWQgbGlzdC4KKyAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIExpc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiBzeW5jaHJvbml6ZWRMaXN0KExpc3Q8VD4gbGlzdCkgewogICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CkBAIC0yMjE5LDggKzIyNTYsOSBAQAogICAgICAqIHRoZSBNYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIE1hcAotICAgICAqIEByZXR1cm4gYSBzeW5jaHJvbml6ZWQgTWFwCisgICAgICogICAgICAgICAgICB0aGUgTWFwIHRvIHdyYXAgaW4gYSBzeW5jaHJvbml6ZWQgbWFwLgorICAgICAqIEByZXR1cm4gYSBzeW5jaHJvbml6ZWQgTWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBzeW5jaHJvbml6ZWRNYXAoTWFwPEssIFY+IG1hcCkgewogICAgICAgICBpZiAobWFwID09IG51bGwpIHsKQEAgLTIyMzQsOCArMjI3Miw5IEBACiAgICAgICogdGhlIFNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgU2V0Ci0gICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBTZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBTZXQgdG8gd3JhcCBpbiBhIHN5bmNocm9uaXplZCBzZXQuCisgICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBTZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IHN5bmNocm9uaXplZFNldChTZXQ8RT4gc2V0KSB7CiAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgewpAQCAtMjI0OSw4ICsyMjg4LDkgQEAKICAgICAgKiBhY2Nlc3MgdG8gdGhlIFNvcnRlZE1hcC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICB0aGUgU29ydGVkTWFwCi0gICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBTb3J0ZWRNYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBTb3J0ZWRNYXAgdG8gd3JhcCBpbiBhIHN5bmNocm9uaXplZCBzb3J0ZWQgbWFwLgorICAgICAqIEByZXR1cm4gYSBzeW5jaHJvbml6ZWQgU29ydGVkTWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IFNvcnRlZE1hcDxLLCBWPiBzeW5jaHJvbml6ZWRTb3J0ZWRNYXAoCiAgICAgICAgICAgICBTb3J0ZWRNYXA8SywgVj4gbWFwKSB7CkBAIC0yMjY1LDggKzIzMDUsOSBAQAogICAgICAqIGFjY2VzcyB0byB0aGUgU29ydGVkU2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBTb3J0ZWRTZXQKLSAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIFNvcnRlZFNldAorICAgICAqICAgICAgICAgICAgdGhlIFNvcnRlZFNldCB0byB3cmFwIGluIGEgc3luY2hyb25pemVkIHNvcnRlZCBzZXQuCisgICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBTb3J0ZWRTZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RT4gU29ydGVkU2V0PEU+IHN5bmNocm9uaXplZFNvcnRlZFNldChTb3J0ZWRTZXQ8RT4gc2V0KSB7CiAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgewpAQCAtMjI3NywxMiArMjMxOCwxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHdyYXBwZXIgb24gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIHdoaWNoIHRocm93cyBhbgotICAgICAqIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiB3aGVuZXZlciBhbiBhdHRlbXB0IGlzIG1hZGUKLSAgICAgKiB0byBtb2RpZnkgdGhlIENvbGxlY3Rpb24uCisgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSB3aGVuZXZlciBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KKyAgICAgKiBtb2RpZnkgdGhlIENvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgQ29sbGVjdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gdG8gd3JhcCBpbiBhbiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBDb2xsZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgPEU+IENvbGxlY3Rpb248RT4gdW5tb2RpZmlhYmxlQ29sbGVjdGlvbigKQEAgLTIyOTUsMTIgKzIzMzcsMTMgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB3cmFwcGVyIG9uIHRoZSBzcGVjaWZpZWQgTGlzdCB3aGljaCB0aHJvd3MgYW4KLSAgICAgKiA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlCi0gICAgICogdG8gbW9kaWZ5IHRoZSBMaXN0LgorICAgICAqIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvCisgICAgICogbW9kaWZ5IHRoZSBMaXN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsaXN0Ci0gICAgICogICAgICAgICAgICB0aGUgTGlzdAotICAgICAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIExpc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBMaXN0IHRvIHdyYXAgaW4gYW4gdW5tb2RpZmlhYmxlIGxpc3QuCisgICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgTGlzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHVubW9kaWZpYWJsZUxpc3QoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewpAQCAtMjMxNSwxMiArMjM1OCwxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHdyYXBwZXIgb24gdGhlIHNwZWNpZmllZCBNYXAgd2hpY2ggdGhyb3dzIGFuCi0gICAgICogPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+IHdoZW5ldmVyIGFuIGF0dGVtcHQgaXMgbWFkZQotICAgICAqIHRvIG1vZGlmeSB0aGUgTWFwLgorICAgICAqIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvCisgICAgICogbW9kaWZ5IHRoZSBNYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIE1hcAotICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgTWFwCisgICAgICogICAgICAgICAgICB0aGUgTWFwIHRvIHdyYXAgaW4gYW4gdW5tb2RpZmlhYmxlIG1hcC4KKyAgICAgKiBAcmV0dXJuIGEgdW5tb2RpZmlhYmxlIE1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gdW5tb2RpZmlhYmxlTWFwKApAQCAtMjMzMywxMiArMjM3NywxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHdyYXBwZXIgb24gdGhlIHNwZWNpZmllZCBTZXQgd2hpY2ggdGhyb3dzIGFuCi0gICAgICogPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+IHdoZW5ldmVyIGFuIGF0dGVtcHQgaXMgbWFkZQotICAgICAqIHRvIG1vZGlmeSB0aGUgU2V0LgorICAgICAqIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvCisgICAgICogbW9kaWZ5IHRoZSBTZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNldAotICAgICAqICAgICAgICAgICAgdGhlIFNldAotICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgU2V0CisgICAgICogICAgICAgICAgICB0aGUgU2V0IHRvIHdyYXAgaW4gYW4gdW5tb2RpZmlhYmxlIHNldC4KKyAgICAgKiBAcmV0dXJuIGEgdW5tb2RpZmlhYmxlIFNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gdW5tb2RpZmlhYmxlU2V0KFNldDw/IGV4dGVuZHMgRT4gc2V0KSB7CkBAIC0yMzUwLDEyICsyMzk1LDEzIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgd3JhcHBlciBvbiB0aGUgc3BlY2lmaWVkIFNvcnRlZE1hcCB3aGljaCB0aHJvd3MgYW4KLSAgICAgKiA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlCi0gICAgICogdG8gbW9kaWZ5IHRoZSBTb3J0ZWRNYXAuCisgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSB3aGVuZXZlciBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KKyAgICAgKiBtb2RpZnkgdGhlIFNvcnRlZE1hcC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICB0aGUgU29ydGVkTWFwCi0gICAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBTb3J0ZWRNYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBTb3J0ZWRNYXAgdG8gd3JhcCBpbiBhbiB1bm1vZGlmaWFibGUgc29ydGVkIG1hcC4KKyAgICAgKiBAcmV0dXJuIGEgdW5tb2RpZmlhYmxlIFNvcnRlZE1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiBTb3J0ZWRNYXA8SywgVj4gdW5tb2RpZmlhYmxlU29ydGVkTWFwKApAQCAtMjM2OCwxMiArMjQxNCwxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHdyYXBwZXIgb24gdGhlIHNwZWNpZmllZCBTb3J0ZWRTZXQgd2hpY2ggdGhyb3dzIGFuCi0gICAgICogPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+IHdoZW5ldmVyIGFuIGF0dGVtcHQgaXMgbWFkZQotICAgICAqIHRvIG1vZGlmeSB0aGUgU29ydGVkU2V0LgorICAgICAqIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvCisgICAgICogbW9kaWZ5IHRoZSBTb3J0ZWRTZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNldAotICAgICAqICAgICAgICAgICAgdGhlIFNvcnRlZFNldAotICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgU29ydGVkU2V0CisgICAgICogICAgICAgICAgICB0aGUgU29ydGVkU2V0IHRvIHdyYXAgaW4gYW4gdW5tb2RpZmlhYmxlIHNvcnRlZCBzZXQuCisgICAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBTb3J0ZWRTZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RT4gU29ydGVkU2V0PEU+IHVubW9kaWZpYWJsZVNvcnRlZFNldChTb3J0ZWRTZXQ8RT4gc2V0KSB7CiAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgewpAQCAtMjM4MywyMyArMjQzMCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gdGhhdAotICAgICAqIG1hdGNoIHRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHBhc3NlZC4gSWYgdGhlIDxjb2RlPk9iamVjdDwvY29kZT4gaXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgbnVtYmVyIG9mIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzIGlzCi0gICAgICogcmV0dXJuZWQuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB7QGNvZGUgQ29sbGVjdGlvbn0gdGhhdCBtYXRjaCB0aGUKKyAgICAgKiB7QGNvZGUgT2JqZWN0fSBwYXNzZWQuIElmIHRoZSB7QGNvZGUgT2JqZWN0fSBpcyB7QGNvZGUgbnVsbH0sIHRoZW4gdGhlCisgICAgICogbnVtYmVyIG9mIHtAY29kZSBudWxsfSBlbGVtZW50cyBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiB0byBzZWFyY2guCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENvbGxlY3Rpb259IHRvIHNlYXJjaC4KICAgICAgKiBAcGFyYW0gbwotICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPk9iamVjdDwvY29kZT4gdG8gc2VhcmNoIGZvci4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgZWxlbWVudHMuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgZWxlbWVudHMuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIgaXMKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS41CisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBDb2xsZWN0aW9ufSBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGZyZXF1ZW5jeShDb2xsZWN0aW9uPD8+IGMsIE9iamVjdCBvKSB7CiAgICAgICAgIGlmIChjID09IG51bGwpIHsKQEAgLTI0MjIsOSArMjQ2NSw5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHR5cGUtc2FmZSBlbXB0eSwgaW1tdXRhYmxlIHtAbGluayBMaXN0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGVtcHR5IHtAbGluayBMaXN0fS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHJldHVybiBhbiBlbXB0eSB7QGxpbmsgTGlzdH0uCiAgICAgICogQHNlZSAjRU1QVFlfTElTVAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgPFQ+IExpc3Q8VD4gZW1wdHlMaXN0KCkgewpAQCAtMjQzNCw5ICsyNDc3LDkgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgdHlwZS1zYWZlIGVtcHR5LCBpbW11dGFibGUge0BsaW5rIFNldH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBlbXB0eSB7QGxpbmsgU2V0fS4KLSAgICAgKiBAc2luY2UgMS41CisgICAgICogQHJldHVybiBhbiBlbXB0eSB7QGxpbmsgU2V0fS4KICAgICAgKiBAc2VlICNFTVBUWV9TRVQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIDxUPiBTZXQ8VD4gZW1wdHlTZXQoKSB7CkBAIC0yNDQ2LDkgKzI0ODksOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB0eXBlLXNhZmUgZW1wdHksIGltbXV0YWJsZSB7QGxpbmsgTWFwfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGVtcHR5IHtAbGluayBNYXB9LgotICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IHtAbGluayBNYXB9LgogICAgICAqIEBzZWUgI0VNUFRZX01BUAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgPEssIFY+IE1hcDxLLCBWPiBlbXB0eU1hcCgpIHsKQEAgLTI0NTYsMTQgKzI0OTksMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgdHlwZXNhZmUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCisgICAgICogUmV0dXJucyBhIGR5bmFtaWNhbGx5IHR5cGVzYWZlIHZpZXcgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLiBUcnlpbmcKKyAgICAgKiB0byBpbnNlcnQgYW4gZWxlbWVudCBvZiB0aGUgd3JvbmcgdHlwZSBpbnRvIHRoaXMgY29sbGVjdGlvbiB0aHJvd3MgYQorICAgICAqIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259LiBBdCBjcmVhdGlvbiB0aW1lIHRoZSB0eXBlcyBpbiB7QGNvZGUgY30gYXJlCisgICAgICogbm90IGNoZWNrZWQgZm9yIGNvcnJlY3QgdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIHRvIGJlIHdyYXBwZWQgaW4gYSB0eXBlc2FmZSBjb2xsZWN0aW9uLgogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgcGVybWl0dGVkIHRvIGluc2VydAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSB0eXBlc2FmZSBjb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgcGVybWl0dGVkIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIGEgdHlwZXNhZmUgY29sbGVjdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxFPiBDb2xsZWN0aW9uPEU+IGNoZWNrZWRDb2xsZWN0aW9uKENvbGxlY3Rpb248RT4gYywKICAgICAgICAgICAgIENsYXNzPEU+IHR5cGUpIHsKQEAgLTI0NzEsMTYgKzI1MTcsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgdHlwZXNhZmUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIG1hcC4KKyAgICAgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgdHlwZXNhZmUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIG1hcC4gVHJ5aW5nIHRvCisgICAgICogaW5zZXJ0IGFuIGVsZW1lbnQgb2YgdGhlIHdyb25nIHR5cGUgaW50byB0aGlzIG1hcCB0aHJvd3MgYQorICAgICAqIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259LiBBdCBjcmVhdGlvbiB0aW1lIHRoZSB0eXBlcyBpbiB7QGNvZGUgbX0gYXJlCisgICAgICogbm90IGNoZWNrZWQgZm9yIGNvcnJlY3QgdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbQotICAgICAqICAgICAgICAgICAgdGhlIG1hcAorICAgICAqICAgICAgICAgICAgdGhlIG1hcCB0byBiZSB3cmFwcGVkIGluIGEgdHlwZXNhZmUgbWFwLgogICAgICAqIEBwYXJhbSBrZXlUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUga2V5cyBwZXJtaXR0ZWQgdG8gaW5zZXJ0CisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUga2V5cyBwZXJtaXR0ZWQgdG8gaW5zZXJ0LgogICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgcGVybWl0dGVkIHRvIGluc2VydAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSB0eXBlc2FmZSBtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgcGVybWl0dGVkIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIGEgdHlwZXNhZmUgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBjaGVja2VkTWFwKE1hcDxLLCBWPiBtLCBDbGFzczxLPiBrZXlUeXBlLAogICAgICAgICAgICAgQ2xhc3M8Vj4gdmFsdWVUeXBlKSB7CkBAIC0yNDg4LDE0ICsyNTM3LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGR5bmFtaWNhbGx5IHR5cGVzYWZlIHZpZXcgb2YgdGhlIHNwZWNpZmllZCBsaXN0LgorICAgICAqIFJldHVybnMgYSBkeW5hbWljYWxseSB0eXBlc2FmZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4gVHJ5aW5nIHRvCisgICAgICogaW5zZXJ0IGFuIGVsZW1lbnQgb2YgdGhlIHdyb25nIHR5cGUgaW50byB0aGlzIGxpc3QgdGhyb3dzIGEKKyAgICAgKiB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufS4gQXQgY3JlYXRpb24gdGltZSB0aGUgdHlwZXMgaW4ge0Bjb2RlIGxpc3R9CisgICAgICogYXJlIG5vdCBjaGVja2VkIGZvciBjb3JyZWN0IHR5cGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0CisgICAgICogICAgICAgICAgICB0aGUgbGlzdCB0byBiZSB3cmFwcGVkIGluIGEgdHlwZXNhZmUgbGlzdC4KICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIHBlcm1pdHRlZCB0byBpbnNlcnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgdHlwZXNhZmUgbGlzdAorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIHBlcm1pdHRlZCB0byBpbnNlcnQuCisgICAgICogQHJldHVybiBhIHR5cGVzYWZlIGxpc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBjaGVja2VkTGlzdChMaXN0PEU+IGxpc3QsIENsYXNzPEU+IHR5cGUpIHsKICAgICAgICAgaWYgKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKQEAgLTI1MDUsMzAgKzI1NTcsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgdHlwZXNhZmUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIHNldC4KKyAgICAgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgdHlwZXNhZmUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIHNldC4gVHJ5aW5nIHRvCisgICAgICogaW5zZXJ0IGFuIGVsZW1lbnQgb2YgdGhlIHdyb25nIHR5cGUgaW50byB0aGlzIHNldCB0aHJvd3MgYQorICAgICAqIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259LiBBdCBjcmVhdGlvbiB0aW1lIHRoZSB0eXBlcyBpbiB7QGNvZGUgc30gYXJlCisgICAgICogbm90IGNoZWNrZWQgZm9yIGNvcnJlY3QgdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgdGhlIHNldAorICAgICAqICAgICAgICAgICAgdGhlIHNldCB0byBiZSB3cmFwcGVkIGluIGEgdHlwZXNhZmUgc2V0LgogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgcGVybWl0dGVkIHRvIGluc2VydAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSB0eXBlc2FmZSBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBwZXJtaXR0ZWQgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gYSB0eXBlc2FmZSBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IGNoZWNrZWRTZXQoU2V0PEU+IHMsIENsYXNzPEU+IHR5cGUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDaGVja2VkU2V0PEU+KHMsIHR5cGUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkeW5hbWljYWxseSB0eXBlc2FmZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIG1hcC4KKyAgICAgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgdHlwZXNhZmUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIHNvcnRlZCBtYXAuIFRyeWluZworICAgICAqIHRvIGluc2VydCBhbiBlbGVtZW50IG9mIHRoZSB3cm9uZyB0eXBlIGludG8gdGhpcyBzb3J0ZWQgbWFwIHRocm93cyBhCisgICAgICoge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0uIEF0IGNyZWF0aW9uIHRpbWUgdGhlIHR5cGVzIGluIHtAY29kZSBtfSBhcmUKKyAgICAgKiBub3QgY2hlY2tlZCBmb3IgY29ycmVjdCB0eXBlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtCi0gICAgICogICAgICAgICAgICB0aGUgc29ydGVkIG1hcAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBtYXAgdG8gYmUgd3JhcHBlZCBpbiBhIHR5cGVzYWZlIHNvcnRlZCBtYXAuCiAgICAgICogQHBhcmFtIGtleVR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBrZXlzIHBlcm1pdHRlZCB0byBpbnNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBrZXlzIHBlcm1pdHRlZCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIHZhbHVlVHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyBwZXJtaXR0ZWQgdG8gaW5zZXJ0Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIHR5cGVzYWZlIHNvcnRlZCBtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgcGVybWl0dGVkIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIGEgdHlwZXNhZmUgc29ydGVkIG1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiBTb3J0ZWRNYXA8SywgVj4gY2hlY2tlZFNvcnRlZE1hcChTb3J0ZWRNYXA8SywgVj4gbSwKICAgICAgICAgICAgIENsYXNzPEs+IGtleVR5cGUsIENsYXNzPFY+IHZhbHVlVHlwZSkgewpAQCAtMjUzNiwxNCArMjU5NCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkeW5hbWljYWxseSB0eXBlc2FmZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIHNldC4KKyAgICAgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgdHlwZXNhZmUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIHNvcnRlZCBzZXQuIFRyeWluZworICAgICAqIHRvIGluc2VydCBhbiBlbGVtZW50IG9mIHRoZSB3cm9uZyB0eXBlIGludG8gdGhpcyBzb3J0ZWQgc2V0IHRocm93cyBhCisgICAgICoge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0uIEF0IGNyZWF0aW9uIHRpbWUgdGhlIHR5cGVzIGluIHtAY29kZSBzfSBhcmUKKyAgICAgKiBub3QgY2hlY2tlZCBmb3IgY29ycmVjdCB0eXBlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICB0aGUgc29ydGVkIHNldAorICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBzZXQgdG8gYmUgd3JhcHBlZCBpbiBhIHR5cGVzYWZlIHNvcnRlZCBzZXQuCiAgICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBwZXJtaXR0ZWQgdG8gaW5zZXJ0Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIHR5cGVzYWZlIHNvcnRlZCBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBwZXJtaXR0ZWQgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gYSB0eXBlc2FmZSBzb3J0ZWQgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNvcnRlZFNldDxFPiBjaGVja2VkU29ydGVkU2V0KFNvcnRlZFNldDxFPiBzLAogICAgICAgICAgICAgQ2xhc3M8RT4gdHlwZSkgewpAQCAtMjU1MSwyMCArMjYxMiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgYWxsIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uCisgICAgICogQWRkcyBhbGwgdGhlIHNwZWNpZmllZCBlbGVtZW50cyB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIHRoZSBlbGVtZW50cyBhcmUgdG8gYmUgaW5zZXJ0ZWQgaW50bworICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gdGhlIGVsZW1lbnRzIGFyZSB0byBiZSBpbnNlcnRlZCBpbnRvLgogICAgICAqIEBwYXJhbSBhCi0gICAgICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gaW5zZXJ0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgZHVyaW5nIGluc2VydGlvbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGluc2VydC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBkdXJpbmcgaW5zZXJ0aW9uLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBtZXRob2QgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIGMgb3IgZWxlbWVudHMgaXMgbnVsbCwgb3IgZWxlbWVudHMgY29udGFpbnMgb25lIG9yIG1vcmUKLSAgICAgKiAgICAgICAgICAgICBudWxsIGVsZW1lbnRzIGFuZCBjIGRvZXNuJ3Qgc3VwcG9ydCBudWxsIGVsZW1lbnRzCisgICAgICogICAgICAgICAgICAgd2hlbiB7QGNvZGUgY30gb3Ige0Bjb2RlIGF9IGlzIHtAY29kZSBudWxsfSwgb3Ige0Bjb2RlIGF9CisgICAgICogICAgICAgICAgICAgY29udGFpbnMgb25lIG9yIG1vcmUge0Bjb2RlIG51bGx9IGVsZW1lbnRzIGFuZCB7QGNvZGUgY30KKyAgICAgKiAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQge0Bjb2RlIG51bGx9IGVsZW1lbnRzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBlbGVtZW50cyBjYW4ndCBiZSBpbnNlcnRlZCBpbnRvIHRoZQorICAgICAqICAgICAgICAgICAgIGNvbGxlY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIFQ+IGMsIFQuLi4gYSkgewogICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CkBAIC0yNTc1LDE3ICsyNjM5LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9ucyBoYXZlIG5vIGVsZW1lbnRzIGluIGNvbW1vbgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25zIGhhdmUgbm8gZWxlbWVudHMgaW4gY29tbW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjMQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2xsZWN0aW9uLgogICAgICAqIEBwYXJhbSBjMgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2xsZWN0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9ucyBoYXZlIG5vIGVsZW1lbnRzIGluIGNvbW1vbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb2xsZWN0aW9ucyBoYXZlIG5vIGVsZW1lbnRzIGluIGNvbW1vbiwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIGNvbGxlY3Rpb25zIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIGNvbGxlY3Rpb25zIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzam9pbnQoQ29sbGVjdGlvbjw/PiBjMSwgQ29sbGVjdGlvbjw/PiBjMikgewogICAgICAgICBpZiAoKGMxIGluc3RhbmNlb2YgU2V0KSAmJiAhKGMyIGluc3RhbmNlb2YgU2V0KQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Db21wYXJhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NvbXBhcmF0b3IuamF2YQppbmRleCBlOGY3MjYzLi43YjA5NDQ4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NvbXBhcmF0b3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NvbXBhcmF0b3IuamF2YQpAQCAtMTgsMzYgKzE4LDU2IEBACiBwYWNrYWdlIGphdmEudXRpbDsKIAogLyoqCi0gKiBDb21wYXJhdG9yIGlzIHVzZWQgdG8gY29tcGFyZSB0d28gb2JqZWN0cyB0byBkZXRlcm1pbmUgdGhlaXIgb3JkZXJpbmcgaW4KLSAqIHJlc3BlY3QgdG8gZWFjaCBvdGhlci4KLSAqIAotICogQHNpbmNlIDEuMgorICogQSB7QGNvZGUgQ29tcGFyYXRvcn0gaXMgdXNlZCB0byBjb21wYXJlIHR3byBvYmplY3RzIHRvIGRldGVybWluZSB0aGVpciBvcmRlcmluZyB3aXRoCisgKiByZXNwZWN0IHRvIGVhY2ggb3RoZXIuIE9uIGEgZ2l2ZW4ge0Bjb2RlIENvbGxlY3Rpb259LCBhIHtAY29kZSBDb21wYXJhdG9yfSBjYW4gYmUgdXNlZCB0bworICogb2J0YWluIGEgc29ydGVkIHtAY29kZSBDb2xsZWN0aW9ufSB3aGljaCBpcyA8aT50b3RhbGx5IG9yZGVyZWQ8L2k+LiBGb3IgYSB7QGNvZGUgQ29tcGFyYXRvcn0KKyAqIHRvIGJlIDxpPmNvbnNpc3RlbnQgd2l0aCBlcXVhbHM8L2k+LCBpdHMge2NvZGUgI2NvbXBhcmUoT2JqZWN0LCBPYmplY3QpfQorICogbWV0aG9kIGhhcyB0byByZXR1cm4gemVybyBmb3IgZWFjaCBwYWlyIG9mIGVsZW1lbnRzIChhLGIpIHdoZXJlIGEuZXF1YWxzKGIpCisgKiBob2xkcyB0cnVlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGEge0Bjb2RlIENvbXBhcmF0b3J9IGltcGxlbWVudHMKKyAqIHtAbGluayBqYXZhLmlvLlNlcmlhbGl6YWJsZX0uCisgKiAgCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDb21wYXJhdG9yPFQ+IHsKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSB0d28gb2JqZWN0cyB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIG9yZGVyaW5nLgorICAgICAqIENvbXBhcmVzIHRoZSB0d28gc3BlY2lmaWVkIG9iamVjdHMgdG8gZGV0ZXJtaW5lIHRoZWlyIHJlbGF0aXZlIG9yZGVyaW5nLiBUaGUgb3JkZXJpbmcKKyAgICAgKiBpbXBsaWVkIGJ5IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QgZm9yIGFsbCBwb3NzaWJsZSBwYWlycyBvZgorICAgICAqIHtAY29kZSAob2JqZWN0MSwgb2JqZWN0Mil9IHNob3VsZCBmb3JtIGFuIDxpPmVxdWl2YWxlbmNlIHJlbGF0aW9uPC9pPi4KKyAgICAgKiBUaGlzIG1lYW5zIHRoYXQKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBjb21wYXJlKGEsYSl9IHJldHVybnMgemVybyBmb3IgYWxsIHtAY29kZSBhfTwvbGk+CisgICAgICogPGxpPnRoZSBzaWduIG9mIHtAY29kZSBjb21wYXJlKGEsYil9IG11c3QgYmUgdGhlIG9wcG9zaXRlIG9mIHRoZSBzaWduIG9mIHtAY29kZQorICAgICAqIGNvbXBhcmUoYixhKX0gZm9yIGFsbCBwYWlycyBvZiAoYSxiKTwvbGk+CisgICAgICogPGxpPkZyb20ge0Bjb2RlIGNvbXBhcmUoYSxiKSA+IDB9IGFuZCB7QGNvZGUgY29tcGFyZShiLGMpID4gMH0gaXQgbXVzdAorICAgICAqIGZvbGxvdyB7QGNvZGUgY29tcGFyZShhLGMpID4gMH0gZm9yIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2Yge0Bjb2RlCisgICAgICogKGEsYixjKX08L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdDEKLSAgICAgKiAgICAgICAgICAgIGFuIE9iamVjdCB0byBjb21wYXJlCisgICAgICogICAgICAgICAgICBhbiB7QGNvZGUgT2JqZWN0fS4KICAgICAgKiBAcGFyYW0gb2JqZWN0MgotICAgICAqICAgICAgICAgICAgYW4gT2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIGFuIGludCA8IDAgaWYgb2JqZWN0MSBpcyBsZXNzIHRoYW4gb2JqZWN0MiwgMCBpZiB0aGV5IGFyZSBlcXVhbCwKLSAgICAgKiAgICAgICAgIGFuZCA+IDAgaWYgb2JqZWN0MSBpcyBncmVhdGVyCi0gICAgICogCisgICAgICogICAgICAgICAgICBhIHNlY29uZCB7QGNvZGUgT2JqZWN0fSB0byBjb21wYXJlIHdpdGgge0Bjb2RlIG9iamVjdDF9LgorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciA8IDAgaWYge0Bjb2RlIG9iamVjdDF9IGlzIGxlc3MgdGhhbiB7QGNvZGUgb2JqZWN0Mn0sIDAgaWYgdGhleSBhcmUKKyAgICAgKiAgICAgICAgIGVxdWFsLCBhbmQgPiAwIGlmIHtAY29kZSBvYmplY3QxfSBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIG9iamVjdDJ9LgogICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBvYmplY3RzIGFyZSBub3QgdGhlIGNvcnJlY3QgdHlwZQorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gb2JqZWN0cyBhcmUgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlKFQgb2JqZWN0MSwgVCBvYmplY3QyKTsKIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLgorICAgICAqIENvbXBhcmVzIHRoaXMge0Bjb2RlIENvbXBhcmF0b3J9IHdpdGggdGhlIHNwZWNpZmllZCB7QGNvZGUgT2JqZWN0fSBhbmQgaW5kaWNhdGVzIHdoZXRoZXIgdGhleQorICAgICAqIGFyZSBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvYmplY3R9IG11c3QgcmVwcmVzZW50IHRoZSBzYW1lIG9iamVjdAorICAgICAqIGFzIHRoaXMgaW5zdGFuY2UgdXNpbmcgYSBjbGFzcy1zcGVjaWZpYyBjb21wYXJpc29uLgorICAgICAqIDxwPgorICAgICAqIEEge0Bjb2RlIENvbXBhcmF0b3J9IG5ldmVyIG5lZWRzIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBidXQgbWF5IGNob29zZSBzbyBmb3IKKyAgICAgKiBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIE9iamVjdCB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzCi0gICAgICogICAgICAgICBvYmplY3QgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0LgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3R9IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGNvbXBhcmF0b3IuCisgICAgICogQHJldHVybiBib29sZWFuIHtAY29kZSB0cnVlfSBpZiBzcGVjaWZpZWQge0Bjb2RlIE9iamVjdH0gaXMgdGhlIHNhbWUgYXMgdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIE9iamVjdH0sIGFuZCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlIE9iamVjdCNoYXNoQ29kZQorICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggY2NiYzQ4Ni4uNDNkNWE2MyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTE3LDMwICsxNywzMiBAQAogCiBwYWNrYWdlIGphdmEudXRpbDsKIAotCiAvKioKLSAqIFRoaXMgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSBDb2xsZWN0aW9uIGlzIG1vZGlmaWVkIGFuZCBhbgotICogZXhpc3RpbmcgaXRlcmF0b3Igb24gdGhlIENvbGxlY3Rpb24gaXMgdXNlZCB0byBtb2RpZnkgdGhlIENvbGxlY3Rpb24gYXMgd2VsbC4KKyAqIEFuIHtAY29kZSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhIENvbGxlY3Rpb24gaXMKKyAqIG1vZGlmaWVkIGFuZCBhbiBleGlzdGluZyBpdGVyYXRvciBvbiB0aGUgQ29sbGVjdGlvbiBpcyB1c2VkIHRvIG1vZGlmeSB0aGUKKyAqIENvbGxlY3Rpb24gYXMgd2VsbC4KICAqIAogICogQHNlZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzY2Njc1MTAwODk2NTk1MzYwM0w7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiBzdGFjayB0cmFjZSBmaWxsZWQgaW4uCiAgICAgICovCiAgICAgcHVibGljIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKSB7CiAgICAgICAgIC8qZW1wdHkqLwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50CisgICAgICogc3RhY2sgdHJhY2UgYW5kIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIoZGV0YWlsTWVzc2FnZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0N1cnJlbmN5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0N1cnJlbmN5LmphdmEKaW5kZXggMmNjMjM4Mi4uYWZkMjM1OSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9DdXJyZW5jeS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ3VycmVuY3kuamF2YQpAQCAtMjQsNiArMjQsOCBAQAogLyoqCiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjdXJyZW5jeSBhcyBpZGVudGlmaWVkIGluIHRoZSBJU08gNDIxNyBjdXJyZW5jeQogICogY29kZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ3VycmVuY3kgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCkBAIC00NSwxNiArNDcsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW5jeSBpbnN0YW5jZSBmb3IgdGhpcyBjdXJyZW5jeSBjb2RlLgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBDdXJyZW5jeX0gaW5zdGFuY2UgZm9yIHRoaXMgY3VycmVuY3kgY29kZS4KICAgICAgKiA8cD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY3VycmVuY3lDb2RlCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICogQHJldHVybiBjdXJyZW5jeSBqYXZhLnV0aWwuQ3VycmVuY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBjdXJyZW5jeSBjb2RlLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDdXJyZW5jeX0gaW5zdGFuY2UgZm9yIHRoaXMgY3VycmVuY3kgY29kZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3VycmVuY3kgY29kZSBpcyBub3QgYSBzdXBwb3J0ZWQgSVNPIDQyMTcgY3VycmVuY3kKLSAgICAgKiAgICAgICAgICAgICBjb2RlCisgICAgICogICAgICAgICAgICAgY29kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEN1cnJlbmN5IGdldEluc3RhbmNlKFN0cmluZyBjdXJyZW5jeUNvZGUpIHsKICAgICAgICAgQ3VycmVuY3kgY3VycmVuY3kgPSBjb2Rlc1RvQ3VycmVuY2llcy5nZXQoY3VycmVuY3lDb2RlKTsKQEAgLTgwLDE1ICs4MywxNiBAQAogICAgICAgICByZXR1cm4gY3VycmVuY3k7CiAgICAgfQogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbmN5IGluc3RhbmNlIGZvciB0aGlzIGxvY2FsZS4KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgQ3VycmVuY3l9IGluc3RhbmNlIGZvciB0aGlzIHtAY29kZSBMb2NhbGV9J3MgY291bnRyeS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICBqYXZhLnV0aWwuTG9jYWxlCi0gICAgICogQHJldHVybiBjdXJyZW5jeSBqYXZhLnV0aWwuQ3VycmVuY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTG9jYWxlfSBvZiBhIGNvdW50cnkuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIEN1cnJlbmN5fSB1c2VkIGluIHRoZSBjb3VudHJ5IGRlZmluZWQgYnkgdGhlIGxvY2FsZSBwYXJhbWV0ZXIuCiAgICAgICogCiAgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGxvY2FsZSdzIGNvdW50cnkgaXMgbm90IGEgc3VwcG9ydGVkIElTTyAzMTY2IENvdW50cnkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbG9jYWxlJ3MgY291bnRyeSBpcyBub3QgYSBzdXBwb3J0ZWQgSVNPIDMxNjYgQ291bnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEN1cnJlbmN5IGdldEluc3RhbmNlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwpAQCAtMTE1LDkgKzExOSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBjdXJyZW5jeSdzIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUuCisgICAgICogUmV0dXJucyB0aGlzIHtAY29kZSBDdXJyZW5jeX0ncyBJU08gNDIxNyBjdXJyZW5jeSBjb2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBjdXJyZW5jeSdzIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIEN1cnJlbmN5fSdzIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDdXJyZW5jeUNvZGUoKSB7CiAgICAgICAgIHJldHVybiBjdXJyZW5jeUNvZGU7CkBAIC0xMjksMzQgKzEzNCwzNSBAQAogICAgICAqIG90aGVyIGxvY2FsZXMgaXQgbWF5IGJlICJVUyQiLiBJZiBubyBzeW1ib2wgY2FuIGJlIGRldGVybWluZWQsIHRoZSBJU08KICAgICAgKiA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIFVTIGRvbGxhciBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoaXMgY3VycmVuY3kgaW4gdGhlIGRlZmF1bHQgbG9jYWxlCisgICAgICogQHJldHVybiB0aGUgc3ltYm9sIGZvciB0aGlzIHtAY29kZSBDdXJyZW5jeX0gaW4gdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTeW1ib2woKSB7CiAgICAgICAgIHJldHVybiBnZXRTeW1ib2woTG9jYWxlLmdldERlZmF1bHQoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoaXMgY3VycmVuY3kgaW4gdGhlIGdpdmVuIGxvY2FsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBzeW1ib2wgZm9yIHRoaXMgY3VycmVuY3kgaW4gdGhlIGdpdmVuIHtAY29kZSBMb2NhbGV9LgogICAgICAqIDxwPgotICAgICAqIAogICAgICAqIElmIHRoZSBsb2NhbGUgZG9lc24ndCBoYXZlIGFueSBjb3VudHJpZXMgKGUuZy4KLSAgICAgKiA8Y29kZT5Mb2NhbGUuSkFQQU5FU0UsIG5ldyBMb2NhbGUoImVuIiwiIik8L2NvZGU+KSwgY3VycmVuY3lDb2RlIGlzCi0gICAgICogcmV0dXJuZWQuCisgICAgICoge0Bjb2RlIExvY2FsZS5KQVBBTkVTRSwgbmV3IExvY2FsZSgiZW4iLCIiKX0pLCB0aGUgdGhlIElTTworICAgICAqIDQyMTcgY3VycmVuY3kgY29kZSBpcyByZXR1cm5lZC4KICAgICAgKiA8cD4KLSAgICAgKiBGaXJzdCB0aGUgbG9jYWxlIGJ1bmRsZSBpcyBjaGVja2VkLCBpZiB0aGUgbG9jYWxlIGhhcyB0aGUgc2FtZSBjdXJyZW5jeSwKKyAgICAgKiBGaXJzdCB0aGUgbG9jYWxlJ3MgcmVzb3VyY2UgYnVuZGxlIGlzIGNoZWNrZWQsIGlmIHRoZSBsb2NhbGUgaGFzIHRoZSBzYW1lIGN1cnJlbmN5LAogICAgICAqIHRoZSBDdXJyZW5jeVN5bWJvbCBpbiB0aGlzIGxvY2FsZSBidW5kbGUgaXMgcmV0dXJuZWQuCiAgICAgICogPHA+CiAgICAgICogVGhlbiBhIGN1cnJlbmN5IGJ1bmRsZSBmb3IgdGhpcyBsb2NhbGUgaXMgc2VhcmNoZWQuCiAgICAgICogPHA+CiAgICAgICogSWYgYSBjdXJyZW5jeSBidW5kbGUgZm9yIHRoaXMgbG9jYWxlIGRvZXMgbm90IGV4aXN0LCBvciB0aGVyZSBpcyBubwotICAgICAqIHN5bWJvbCBmb3IgdGhpcyBjdXJyZW5jeSBpbiB0aGlzIGJ1bmRsZSwgdGhhbiA8Y29kZT5jdXJyZW5jeUNvZGU8L2NvZGU+Ci0gICAgICogaXMgcmV0dXJuZWQuCisgICAgICogc3ltYm9sIGZvciB0aGlzIGN1cnJlbmN5IGluIHRoaXMgYnVuZGxlLCB0aGVuIHRoZQorICAgICAqIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgaXMgcmV0dXJuZWQuCiAgICAgICogPHA+CiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbGUKLSAgICAgKiBAcmV0dXJuIHN5bWJvbCBqYXZhLmxhbmcuU3RyaW5nIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEN1cnJlbmN5J3MKLSAgICAgKiAgICAgICAgIHN5bWJvbCBpbiB0aGlzIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZSBmb3Igd2hpY2ggdGhlIGN1cnJlbmN5IHN5bWJvbCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgQ3VycmVuY3l9J3Mgc3ltYm9sIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGxvY2FsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFN5bWJvbChMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGlmIChsb2NhbGUuZ2V0Q291bnRyeSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJApAQCAtMTk5LDcgKzIwNSw4IEBACiAgICAgICogRm9yIHRoZSBKYXBhbmVzZSBZZW4gdGhlIG51bWJlciBpcyAwLiBJbiB0aGUgY2FzZSBvZiBwc2V1ZG8tY3VycmVuY2llcywKICAgICAgKiBzdWNoIGFzIElNRiBTcGVjaWFsIERyYXdpbmcgUmlnaHRzLCAtMSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgZm9yIHRoaXMgY3VycmVuY3kKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgZm9yIHRoaXMgY3VycmVuY3kuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREZWZhdWx0RnJhY3Rpb25EaWdpdHMoKSB7CiAgICAgICAgIHJldHVybiBkZWZhdWx0RnJhY3Rpb25EaWdpdHM7CkBAIC0yMDgsNyArMjE1LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoaXMgY3VycmVuY3kncyBJU08gNDIxNyBjdXJyZW5jeSBjb2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBjdXJyZW5jeSdzIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoaXMgY3VycmVuY3kncyBJU08gNDIxNyBjdXJyZW5jeSBjb2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0RhdGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRGF0ZS5qYXZhCmluZGV4IGFlNmQxZTYuLjE3MmY2ODIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRGF0ZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRGF0ZS5qYXZhCkBAIC0yOCwxMyArMjgsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogRGF0ZSByZXByZXNlbnRzIGEgc3BlY2lmaWMgbW9tZW50IGluIHRpbWUsIHRvIHRoZSBtaWxsaXNlY29uZC4KKyAqIHtAY29kZSBEYXRlfSByZXByZXNlbnRzIGEgc3BlY2lmaWMgbW9tZW50IGluIHRpbWUsIHRvIHRoZSBtaWxsaXNlY29uZC4KICAqIAogICogQHNlZSBTeXN0ZW0jY3VycmVudFRpbWVNaWxsaXMKICAqIEBzZWUgQ2FsZW5kYXIKICAqIEBzZWUgR3JlZ29yaWFuQ2FsZW5kYXIKICAqIEBzZWUgU2ltcGxlVGltZVpvbmUKICAqIEBzZWUgVGltZVpvbmUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGF0ZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPERhdGU+IHsKIApAQCAtNDYsMjUgKzQ3LDI4IEBACiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBtaWxsaXNlY29uZHM7CiAKICAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIERhdGUgaW5zdGFuY2UgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZS4KKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBEYXRlfSBpbnN0YW5jZSB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlKCkgewogICAgICAgICB0aGlzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERhdGUgaW5pdGlhbGl6ZWQgdG8gbWlkbmlnaHQgaW4gdGhlIGRlZmF1bHQgVGltZVpvbmUgb24KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRlfSBpbml0aWFsaXplZCB0byBtaWRuaWdodCBpbiB0aGUgZGVmYXVsdCB7QGNvZGUgVGltZVpvbmV9IG9uCiAgICAgICogdGhlIHNwZWNpZmllZCBkYXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB5ZWFyCi0gICAgICogICAgICAgICAgICB0aGUgeWVhciwgMCBpcyAxOTAwCisgICAgICogICAgICAgICAgICB0aGUgeWVhciwgMCBpcyAxOTAwLgogICAgICAqIEBwYXJhbSBtb250aAotICAgICAqICAgICAgICAgICAgdGhlIG1vbnRoLCAwIC0gMTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb250aCwgMCAtIDExLgogICAgICAqIEBwYXJhbSBkYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBkYXkgb2YgdGhlIG1vbnRoLCAxIC0gMzEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXkgb2YgdGhlIG1vbnRoLCAxIC0gMzEuCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBHcmVnb3JpYW5DYWxlbmRhciNHcmVnb3JpYW5DYWxlbmRhcihpbnQsIGludCwgaW50KX0KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgR3JlZ29yaWFuQ2FsZW5kYXIjR3JlZ29yaWFuQ2FsZW5kYXIoaW50LCBpbnQsIGludCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgRGF0ZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KSB7CkBAIC03NCwyMSArNzgsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERhdGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNwZWNpZmllZCBkYXRlIGFuZCB0aW1lIGluIHRoZQotICAgICAqIGRlZmF1bHQgVGltZVpvbmUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRGF0ZX0gaW5pdGlhbGl6ZWQgdG8gdGhlIHNwZWNpZmllZCBkYXRlIGFuZCB0aW1lIGluIHRoZQorICAgICAqIGRlZmF1bHQge0Bjb2RlIFRpbWVab25lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geWVhcgotICAgICAqICAgICAgICAgICAgdGhlIHllYXIsIDAgaXMgMTkwMAorICAgICAqICAgICAgICAgICAgdGhlIHllYXIsIDAgaXMgMTkwMC4KICAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtb250aCwgMCAtIDExCisgICAgICogICAgICAgICAgICB0aGUgbW9udGgsIDAgLSAxMS4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aCwgMSAtIDMxCisgICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aCwgMSAtIDMxLgogICAgICAqIEBwYXJhbSBob3VyCi0gICAgICogICAgICAgICAgICB0aGUgaG91ciBvZiBkYXksIDAgLSAyMworICAgICAqICAgICAgICAgICAgdGhlIGhvdXIgb2YgZGF5LCAwIC0gMjMuCiAgICAgICogQHBhcmFtIG1pbnV0ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgMCAtIDU5CisgICAgICogICAgICAgICAgICB0aGUgbWludXRlIG9mIHRoZSBob3VyLCAwIC0gNTkuCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBHcmVnb3JpYW5DYWxlbmRhciNHcmVnb3JpYW5DYWxlbmRhcihpbnQsIGludCwgaW50LCBpbnQsIGludCl9CisgICAgICogQGRlcHJlY2F0ZWQgdXNlCisgICAgICogICAgICAgICAgICAge0BsaW5rIEdyZWdvcmlhbkNhbGVuZGFyI0dyZWdvcmlhbkNhbGVuZGFyKGludCwgaW50LCBpbnQsIGludCwgaW50KX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBEYXRlKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyLCBpbnQgbWludXRlKSB7CkBAIC05OCwyMyArMTA0LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEYXRlIGluaXRpYWxpemVkIHRvIHRoZSBzcGVjaWZpZWQgZGF0ZSBhbmQgdGltZSBpbiB0aGUKLSAgICAgKiBkZWZhdWx0IFRpbWVab25lLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERhdGV9IGluaXRpYWxpemVkIHRvIHRoZSBzcGVjaWZpZWQgZGF0ZSBhbmQgdGltZSBpbiB0aGUKKyAgICAgKiBkZWZhdWx0IHtAY29kZSBUaW1lWm9uZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHllYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyLCAwIGlzIDE5MDAKKyAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyLCAwIGlzIDE5MDAuCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgbW9udGgsIDAgLSAxMQorICAgICAqICAgICAgICAgICAgdGhlIG1vbnRoLCAwIC0gMTEuCiAgICAgICogQHBhcmFtIGRheQotICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGgsIDEgLSAzMQorICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGgsIDEgLSAzMS4KICAgICAgKiBAcGFyYW0gaG91cgotICAgICAqICAgICAgICAgICAgdGhlIGhvdXIgb2YgZGF5LCAwIC0gMjMKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3VyIG9mIGRheSwgMCAtIDIzLgogICAgICAqIEBwYXJhbSBtaW51dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIDAgLSA1OQorICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgMCAtIDU5LgogICAgICAqIEBwYXJhbSBzZWNvbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgMCAtIDU5CisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIDAgLSA1OS4KICAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEdyZWdvcmlhbkNhbGVuZGFyI0dyZWdvcmlhbkNhbGVuZGFyKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfQorICAgICAqIEBkZXByZWNhdGVkIHVzZQorICAgICAqICAgICAgICAgICAgIHtAbGluayBHcmVnb3JpYW5DYWxlbmRhciNHcmVnb3JpYW5DYWxlbmRhcihpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBEYXRlKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKSB7CkBAIC0xMjQsMjQgKzEzMiwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgRGF0ZSBpbnN0YW5jZSB1c2luZyB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kIHZhbHVlLiBUaGUKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBEYXRlfSBpbnN0YW5jZSB1c2luZyB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kIHZhbHVlLiBUaGUKICAgICAgKiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW4uIDEsIDE5NzAgR01ULgogICAgICAqIAogICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbi4gMSwgMTk3MCBHTVQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbi4gMSwgMTk3MCBHTVQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERhdGUobG9uZyBtaWxsaXNlY29uZHMpIHsKICAgICAgICAgdGhpcy5zZXRUaW1lKG1pbGxpc2Vjb25kcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEYXRlIGluaXRpYWxpemVkIHRvIHRoZSBkYXRlIGFuZCB0aW1lIHBhcnNlZCBmcm9tIHRoZQorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERhdGV9IGluaXRpYWxpemVkIHRvIHRoZSBkYXRlIGFuZCB0aW1lIHBhcnNlZCBmcm9tIHRoZQogICAgICAqIHNwZWNpZmllZCBTdHJpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBwYXJzZQorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBwYXJzZS4KICAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIERhdGVGb3JtYXR9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgRGF0ZShTdHJpbmcgc3RyaW5nKSB7CkBAIC0xNDksMzUgKzE1OSwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBEYXRlIGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZS4KKyAgICAgKiBSZXR1cm5zIGlmIHRoaXMge0Bjb2RlIERhdGV9IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqICAgICAgICAgICAgYSBEYXRlIGluc3RhbmNlIHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBEYXRlIGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICBhIERhdGUgaW5zdGFuY2UgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBEYXRlfSBpcyBhZnRlciB0aGUgc3BlY2lmaWVkIHtAY29kZSBEYXRlfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGFmdGVyKERhdGUgZGF0ZSkgewogICAgICAgICByZXR1cm4gbWlsbGlzZWNvbmRzID4gZGF0ZS5taWxsaXNlY29uZHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQm9vbGVhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgb3Igbm90IHRoaXMgPGNvZGU+RGF0ZTwvY29kZT4gb2NjdXJzCi0gICAgICogZWFybGllciB0aGFuIHRoZSA8Y29kZT5EYXRlPC9jb2RlPiBhcmd1bWVudC4KKyAgICAgKiBSZXR1cm5zIGlmIHRoaXMge0Bjb2RlIERhdGV9IGlzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIERhdGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIGEgRGF0ZSBpbnN0YW5jZSB0byBjb21wYXJlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIDxjb2RlPkRhdGU8L2NvZGU+IG9jY3VycyBlYXJsaWVyCi0gICAgICogICAgICAgICB0aGFuIDxjb2RlPmRhdGU8L2NvZGU+LCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogICAgICAgICAgICBhIHtAY29kZSBEYXRlfSBpbnN0YW5jZSB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIERhdGV9IGlzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIHtAY29kZSBEYXRlfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZShEYXRlIGRhdGUpIHsKICAgICAgICAgcmV0dXJuIG1pbGxpc2Vjb25kcyA8IGRhdGUubWlsbGlzZWNvbmRzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgRGF0ZSB3aXRoIHRoZSBzYW1lIG1pbGxpc2Vjb25kIHZhbHVlIGFzIHRoaXMgRGF0ZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBEYXRlfSB3aXRoIHRoZSBzYW1lIG1pbGxpc2Vjb25kIHZhbHVlIGFzIHRoaXMge0Bjb2RlIERhdGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBEYXRlCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBEYXRlfS4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMTg5LDEzICsyMDIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSByZWNlaXZlciB0byB0aGUgc3BlY2lmaWVkIERhdGUgdG8gZGV0ZXJtaW5lIHRoZSByZWxhdGl2ZQorICAgICAqIENvbXBhcmUgdGhlIHJlY2VpdmVyIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIERhdGV9IHRvIGRldGVybWluZSB0aGUgcmVsYXRpdmUKICAgICAgKiBvcmRlcmluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqICAgICAgICAgICAgYSBEYXRlCi0gICAgICogQHJldHVybiBhbiBpbnQgPCAwIGlmIHRoaXMgRGF0ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCBEYXRlLCAwIGlmCi0gICAgICogICAgICAgICB0aGV5IGFyZSBlcXVhbCwgYW5kID4gMCBpZiB0aGlzIERhdGUgaXMgZ3JlYXRlcgorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgRGF0ZX0gdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIGludCA8IDB9IGlmIHRoaXMge0Bjb2RlIERhdGV9IGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBEYXRlfSwge0Bjb2RlIDB9IGlmCisgICAgICogICAgICAgICB0aGV5IGFyZSBlcXVhbCwgYW5kIGFuIHtAY29kZSBpbnQgPiAwfSBpZiB0aGlzIHtAY29kZSBEYXRlfSBpcyBncmVhdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKERhdGUgZGF0ZSkgewogICAgICAgICBpZiAobWlsbGlzZWNvbmRzIDwgZGF0ZS5taWxsaXNlY29uZHMpIHsKQEAgLTIwOCwxNiArMjIyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBEYXRlIGFuZCBhbnN3ZXIgaWYgdGhleSBhcmUgZXF1YWwuCi0gICAgICogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIERhdGUgYW5kIGhhdmUgdGhlIHNhbWUgbWlsbGlzZWNvbmQKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIHtAY29kZSBEYXRlfSBhbmQgcmV0dXJucyBpZiB0aGV5IGFyZSBlcXVhbC4KKyAgICAgKiBUbyBiZSBlcXVhbCwgdGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAY29kZSBEYXRlfSBhbmQgaGF2ZSB0aGUgc2FtZSBtaWxsaXNlY29uZAogICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgRGF0ZSwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB7QGNvZGUgRGF0ZX0sIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiAKICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC0yMjYsMTEgKzI0MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBkYXkgb2YgdGhlIG1vbnRoIGZvciB0aGlzIERhdGUgb2JqZWN0LgorICAgICAqIFJldHVybnMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBkYXkgb2YgdGhlIG1vbnRoIGZvciB0aGlzIHtAY29kZSBEYXRlfSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF5IG9mIHRoZSBtb250aAorICAgICAqIEByZXR1cm4gdGhlIGRheSBvZiB0aGUgbW9udGguCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIENhbGVuZGFyLmdldChDYWxlbmRhci5EQVRFKQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGNvZGUgQ2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBVEUpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXREYXRlKCkgewpAQCAtMjM4LDExICsyNTQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrIGZvciB0aGlzIERhdGUgb2JqZWN0LgorICAgICAqIFJldHVybnMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBkYXkgb2YgdGhlIHdlZWsgZm9yIHRoaXMge0Bjb2RlIERhdGV9IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXkgb2YgdGhlIHdlZWsKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXkgb2YgdGhlIHdlZWsuCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIENhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSykKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIENhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldERheSgpIHsKQEAgLTI1MCwxMSArMjY3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIGhvdXIgb2YgdGhlIGRheSBmb3IgdGhpcyBEYXRlIG9iamVjdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgaG91ciBvZiB0aGUgZGF5IGZvciB0aGlzIHtAY29kZSBEYXRlfSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaG91ciBvZiB0aGUgZGF5CisgICAgICogQHJldHVybiB0aGUgaG91ciBvZiB0aGUgZGF5LgogICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHVzZSBDYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBDYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRIb3VycygpIHsKQEAgLTI2MiwxMSArMjgwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIG1pbnV0ZSBvZiB0aGUgaG91ciBmb3IgdGhpcyBEYXRlIG9iamVjdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgbWludXRlIG9mIHRoZSBob3VyIGZvciB0aGlzIHtAY29kZSBEYXRlfSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWludXRlcworICAgICAqIEByZXR1cm4gdGhlIG1pbnV0ZXMuCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIENhbGVuZGFyLmdldChDYWxlbmRhci5NSU5VVEUpCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBDYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0TWludXRlcygpIHsKQEAgLTI3NCwxMSArMjkzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIG1vbnRoIGZvciB0aGlzIERhdGUgb2JqZWN0LgorICAgICAqIFJldHVybnMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBtb250aCBmb3IgdGhpcyB7QGNvZGUgRGF0ZX0gb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1vbnRoCisgICAgICogQHJldHVybiB0aGUgbW9udGguCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIENhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIENhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldE1vbnRoKCkgewpAQCAtMjg2LDExICszMDYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgc2Vjb25kIG9mIHRoZSBtaW51dGUgZm9yIHRoaXMgRGF0ZSBvYmplY3QuCisgICAgICogUmV0dXJucyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIHNlY29uZCBvZiB0aGUgbWludXRlIGZvciB0aGlzIHtAY29kZSBEYXRlfSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2Vjb25kcworICAgICAqIEByZXR1cm4gdGhlIHNlY29uZHMuCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIENhbGVuZGFyLmdldChDYWxlbmRhci5TRUNPTkQpCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBDYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0U2Vjb25kcygpIHsKQEAgLTI5OCwyMiArMzE5LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIERhdGUgYXMgYSBtaWxsaXNlY29uZCB2YWx1ZS4gVGhlIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YKLSAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgSmFuLiAxLCAxOTcwIEdNVC4KKyAgICAgKiBSZXR1cm5zIHRoaXMge0Bjb2RlIERhdGV9IGFzIGEgbWlsbGlzZWNvbmQgdmFsdWUuIFRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mCisgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIEphbi4gMSwgMTk3MCwgbWlkbmlnaHQgR01ULgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgSmFuLiAxLCAxOTcwIEdNVC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbi4gMSwgMTk3MCwgbWlkbmlnaHQgR01ULgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldFRpbWUoKSB7CiAgICAgICAgIHJldHVybiBtaWxsaXNlY29uZHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMgb2YgdGhlIGRlZmF1bHQgVGltZVpvbmUuCisgICAgICogUmV0dXJucyB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMgb2YgdGhlIGRlZmF1bHQge0Bjb2RlIFRpbWVab25lfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBvZiB0aGUgZGVmYXVsdCBUaW1lWm9uZQorICAgICAqIEByZXR1cm4gdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzIG9mIHRoZSBkZWZhdWx0IHtAY29kZSBUaW1lWm9uZX0uCiAgICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlCi0gICAgICogICAgICAgICAgICAgPGNvZGU+KENhbGVuZGFyLmdldChDYWxlbmRhci5aT05FX09GRlNFVCkgKyBDYWxlbmRhci5nZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCkpIC8gNjAwMDA8L2NvZGU+CisgICAgICogICAgICAgICAgICAge0Bjb2RlIChDYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpICsgQ2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpKSAvIDYwMDAwfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRUaW1lem9uZU9mZnNldCgpIHsKQEAgLTMyMiwxMSArMzQ1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIHllYXIgc2luY2UgMTkwMCBmb3IgdGhpcyBEYXRlIG9iamVjdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgeWVhciBzaW5jZSAxOTAwIGZvciB0aGlzIHtAY29kZSBEYXRlfSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeWVhciAtIDE5MDAKKyAgICAgKiBAcmV0dXJuIHRoZSB5ZWFyIC0gMTkwMC4KICAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgPGNvZGU+Q2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpIC0gMTkwMDwvY29kZT4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIENhbGVuZGFyLmdldChDYWxlbmRhci5ZRUFSKSAtIDE5MDB9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFllYXIoKSB7CkBAIC0zMzUsMTEgKzM1OSwxMiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIERhdGV9J3MgaGFzaC4KICAgICAgKiAKICAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtMzU3LDE0ICszODIsMTUgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1pbGxpc2Vjb25kIHZhbHVlIG9mIHRoZSBkYXRlIGFuZCB0aW1lIHBhcnNlZCBmcm9tIHRoZQotICAgICAqIHNwZWNpZmllZCBTdHJpbmcuIE1hbnkgZGF0ZS90aW1lIGZvcm1hdHMgYXJlIHJlY29nbml6ZWQsIGluY2x1ZGluZyBJRVRGCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBTdHJpbmd9LiBNYW55IGRhdGUvdGltZSBmb3JtYXRzIGFyZSByZWNvZ25pemVkLCBpbmNsdWRpbmcgSUVURgogICAgICAqIHN0YW5kYXJkIHN5bnRheCwgaS5lLiBUdWUsIDIyIEp1biAxOTk5IDEyOjE2OjAwIEdNVC0wNTAwCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBwYXJzZQotICAgICAqIEByZXR1cm4gdGhlIG1pbGxpc2Vjb25kIHZhbHVlIHBhcnNlZCBmcm9tIHRoZSBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UuCisgICAgICogQHJldHVybiB0aGUgbWlsbGlzZWNvbmQgdmFsdWUgcGFyc2VkIGZyb20gdGhlIFN0cmluZy4KICAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIERhdGVGb3JtYXR9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGxvbmcgcGFyc2UoU3RyaW5nIHN0cmluZykgewpAQCAtNTQ3LDEyICs1NzMsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgZGF5IG9mIHRoZSBtb250aCBmb3IgdGhpcyBEYXRlIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgZGF5IG9mIHRoZSBtb250aCBmb3IgdGhpcyB7QGNvZGUgRGF0ZX0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBkYXkgb2YgdGhlIG1vbnRoCisgICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aC4KICAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgQ2FsZW5kYXIuc2V0KENhbGVuZGFyLkRBVEUsIGRheSkKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIENhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCBkYXkpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0RGF0ZShpbnQgZGF5KSB7CkBAIC01NjIsMTIgKzU4OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBob3VyIG9mIHRoZSBkYXkgZm9yIHRoaXMgRGF0ZSBvYmplY3QuCisgICAgICogU2V0cyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIGhvdXIgb2YgdGhlIGRheSBmb3IgdGhpcyB7QGNvZGUgRGF0ZX0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBob3VyCi0gICAgICogICAgICAgICAgICB0aGUgaG91ciBvZiB0aGUgZGF5CisgICAgICogICAgICAgICAgICB0aGUgaG91ciBvZiB0aGUgZGF5LgogICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHVzZSBDYWxlbmRhci5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGhvdXIpCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBDYWxlbmRhci5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGhvdXIpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0SG91cnMoaW50IGhvdXIpIHsKQEAgLTU3NywxMiArNjA1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIG1pbnV0ZSBvZiB0aGUgaG91ciBmb3IgdGhpcyBEYXRlIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgbWludXRlIG9mIHRoZSBob3VyIGZvciB0aGlzIHtAY29kZSBEYXRlfSBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1pbnV0ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW51dGVzLgogICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHVzZSBDYWxlbmRhci5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBtaW51dGUpCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBDYWxlbmRhci5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBtaW51dGUpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0TWludXRlcyhpbnQgbWludXRlKSB7CkBAIC01OTIsMTIgKzYyMSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBtb250aCBmb3IgdGhpcyBEYXRlIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgbW9udGggZm9yIHRoaXMge0Bjb2RlIERhdGV9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIG1vbnRoLgogICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHVzZSBDYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIG1vbnRoKQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGNvZGUgQ2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBtb250aCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRNb250aChpbnQgbW9udGgpIHsKQEAgLTYwNywxMiArNjM3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyIHNlY29uZCBvZiB0aGUgbWludXRlIGZvciB0aGlzIERhdGUgb2JqZWN0LgorICAgICAqIFNldHMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBzZWNvbmQgb2YgdGhlIG1pbnV0ZSBmb3IgdGhpcyB7QGNvZGUgRGF0ZX0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZWNvbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kcy4KICAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgQ2FsZW5kYXIuc2V0KENhbGVuZGFyLlNFQ09ORCwgc2Vjb25kKQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGNvZGUgQ2FsZW5kYXIuc2V0KENhbGVuZGFyLlNFQ09ORCwgc2Vjb25kKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFNlY29uZHMoaW50IHNlY29uZCkgewpAQCAtNjIyLDIzICs2NTMsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgRGF0ZSB0byB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kIHZhbHVlLiBUaGUgdmFsdWUgaXMgdGhlCisgICAgICogU2V0cyB0aGlzIHtAY29kZSBEYXRlfSB0byB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kIHZhbHVlLiBUaGUgdmFsdWUgaXMgdGhlCiAgICAgICogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW4uIDEsIDE5NzAgR01ULgogICAgICAqIAogICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbi4gMSwgMTk3MCBHTVQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZShsb25nIG1pbGxpc2Vjb25kcykgewogICAgICAgICB0aGlzLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIgeWVhciBzaW5jZSAxOTAwIGZvciB0aGlzIERhdGUgb2JqZWN0LgorICAgICAqIFNldHMgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciB5ZWFyIHNpbmNlIDE5MDAgZm9yIHRoaXMge0Bjb2RlIERhdGV9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geWVhcgotICAgICAqICAgICAgICAgICAgdGhlIHllYXIgc2luY2UgMTkwMAorICAgICAqICAgICAgICAgICAgdGhlIHllYXIgc2luY2UgMTkwMC4KICAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgQ2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIgKyAxOTAwKQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGNvZGUgQ2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIgKyAxOTAwKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFllYXIoaW50IHllYXIpIHsKQEAgLTY0OCwxMiArNjgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZSBpbiBHTVQgaW4gdGhlIGZvcm1hdDogMjIKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgRGF0ZX0gaW4gR01UIGluIHRoZSBmb3JtYXQ6IDIyCiAgICAgICogSnVuIDE5OTkgMTM6MDI6MDAgR01UCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZSBpbiBHTVQKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgRGF0ZX0gaW4gR01ULgogICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgRGF0ZUZvcm1hdH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBTdHJpbmcgdG9HTVRTdHJpbmcoKSB7CkBAIC02NzAsMTEgKzcwNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGUgZm9yIHRoZSBjdXJyZW50IExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgRGF0ZX0gZm9yIHRoZSBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGUgZm9yIHRoZSBjdXJyZW50IExvY2FsZQorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBEYXRlfSBmb3IgdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBEYXRlRm9ybWF0fQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFN0cmluZyB0b0xvY2FsZVN0cmluZygpIHsKQEAgLTY4MiwxMCArNzE3LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZSBpbiB0aGUgZm9ybWF0OiBUdWUgSnVuIDIyCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIERhdGV9IGluIHRoZSBmb3JtYXQ6IFR1ZSBKdW4gMjIKICAgICAgKiAxMzowNzowMCBHTVQgMTk5OQogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgRGF0ZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTY5OCwyMyArNzM0LDI0IEBACiAgICAgICogUmV0dXJucyB0aGUgbWlsbGlzZWNvbmQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBkYXRlIGFuZCB0aW1lIGluIEdNVC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geWVhcgotICAgICAqICAgICAgICAgICAgdGhlIHllYXIsIDAgaXMgMTkwMAorICAgICAqICAgICAgICAgICAgdGhlIHllYXIsIDAgaXMgMTkwMC4KICAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtb250aCwgMCAtIDExCisgICAgICogICAgICAgICAgICB0aGUgbW9udGgsIDAgLSAxMS4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aCwgMSAtIDMxCisgICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aCwgMSAtIDMxLgogICAgICAqIEBwYXJhbSBob3VyCi0gICAgICogICAgICAgICAgICB0aGUgaG91ciBvZiBkYXksIDAgLSAyMworICAgICAqICAgICAgICAgICAgdGhlIGhvdXIgb2YgZGF5LCAwIC0gMjMuCiAgICAgICogQHBhcmFtIG1pbnV0ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgMCAtIDU5CisgICAgICogICAgICAgICAgICB0aGUgbWludXRlIG9mIHRoZSBob3VyLCAwIC0gNTkuCiAgICAgICogQHBhcmFtIHNlY29uZAotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCAwIC0gNTkKLSAgICAgKiBAcmV0dXJuIGxvbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgMCAtIDU5LgorICAgICAqIEByZXR1cm4gdGhlIGRhdGUgYW5kIHRpbWUgaW4gR01UIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCB1c2U6IDxjb2RlPgogICAgICAqICBDYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKICAgICAgKiAgY2FsLnNldCh5ZWFyICsgMTkwMCwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpOwogICAgICAqICBjYWwuZ2V0VGltZSgpLmdldFRpbWUoKTs8L2NvZGU+CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGxvbmcgVVRDKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyLCBpbnQgbWludXRlLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9EaWN0aW9uYXJ5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0RpY3Rpb25hcnkuamF2YQppbmRleCAyMDdhMjBkLi4yMzZkZGYwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0RpY3Rpb25hcnkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0RpY3Rpb25hcnkuamF2YQpAQCAtMTcsMTA3ICsxNywxMTAgQEAKIAogcGFja2FnZSBqYXZhLnV0aWw7CiAKLQogLyoqCi0gKiBEaWN0aW9uYXJ5IGlzIGEgYWJzdHJhY3QgY2xhc3Mgd2hpY2ggaXMgdGhlIHN1cGVyY2xhc3Mgb2YgYWxsIGNsYXNzZXMgdGhhdAotICogYXNzb2NpYXRlIGtleXMgd2l0aCB2YWx1ZXMsIHN1Y2ggYXMgSGFzaHRhYmxlLgorICogPHN0cm9uZz5Ob3RlOiBEbyBub3QgdXNlIHRoaXMgY2xhc3Mgc2luY2UgaXQgaXMgb2Jzb2xldGUuIFBsZWFzZSB1c2UgdGhlCisgKiB7QGxpbmsgTWFwfSBpbnRlcmZhY2UgZm9yIG5ldyBpbXBsZW1lbnRhdGlvbnMuPC9zdHJvbmc+CisgKiA8cD4KKyAqIERpY3Rpb25hcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggaXMgdGhlIHN1cGVyY2xhc3Mgb2YgYWxsIGNsYXNzZXMgdGhhdAorICogYXNzb2NpYXRlIGtleXMgd2l0aCB2YWx1ZXMsIHN1Y2ggYXMge0Bjb2RlIEhhc2h0YWJsZX0uCiAgKiAKICAqIEBzZWUgSGFzaHRhYmxlCi0gKiBAc2luY2UgMS4wCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERpY3Rpb25hcnk8SyxWPiB7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERpY3Rpb25hcnkoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBEaWN0aW9uYXJ5LgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgZGljdGlvbmFyeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uIG9mIHRoZSB2YWx1ZXMgb2YgdGhpcyBEaWN0aW9uYXJ5Ci0gICAgICogCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgdmFsdWVzIG9mIHRoaXMgZGljdGlvbmFyeS4KICAgICAgKiBAc2VlICNrZXlzCiAgICAgICogQHNlZSAjc2l6ZQogICAgICAqIEBzZWUgRW51bWVyYXRpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRW51bWVyYXRpb248Vj4gZWxlbWVudHMoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+LgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSB2YWx1ZSByZXR1cm5lZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHtAY29kZSBrZXl9LCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LgogICAgICAqIEBzZWUgI3B1dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBWIGdldChPYmplY3Qga2V5KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBEaWN0aW9uYXJ5IGhhcyBubyBrZXkvdmFsdWUgcGFpcnMsIGEgc2l6ZSBvZiB6ZXJvLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgaGFzIG5vIGtleS92YWx1ZSBwYWlycy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBEaWN0aW9uYXJ5IGhhcyBubyBrZXkvdmFsdWUgcGFpcnMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgZGljdGlvbmFyeSBoYXMgbm8ga2V5L3ZhbHVlIHBhaXJzLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW1wdHkoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gb24gdGhlIGtleXMgb2YgdGhpcyBEaWN0aW9uYXJ5LgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb24gdGhlIGtleXMgb2YgdGhpcyBkaWN0aW9uYXJ5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gRW51bWVyYXRpb24gb2YgdGhlIGtleXMgb2YgdGhpcyBEaWN0aW9uYXJ5Ci0gICAgICogCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUga2V5cyBvZiB0aGlzIGRpY3Rpb25hcnkuCiAgICAgICogQHNlZSAjZWxlbWVudHMKICAgICAgKiBAc2VlICNzaXplCiAgICAgICogQHNlZSBFbnVtZXJhdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBFbnVtZXJhdGlvbjxLPiBrZXlzKCk7CiAKICAgICAvKioKLSAgICAgKiBBc3NvY2lhdGUgPGNvZGU+a2V5PC9jb2RlPiB3aXRoIDxjb2RlPnZhbHVlPC9jb2RlPiBpbiB0aGlzCi0gICAgICogPGNvZGU+RGljdGlvbmFyeTwvY29kZT4uIElmIDxjb2RlPmtleTwvY29kZT4gZXhpc3RzIGluIHRoZQotICAgICAqIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IHByaW9yIHRvIHRoaXMgY2FsbCBiZWluZyBtYWRlLCB0aGUgb2xkIHZhbHVlIGlzCi0gICAgICogcmVwbGFjZWQuCisgICAgICogQXNzb2NpYXRlIHtAY29kZSBrZXl9IHdpdGgge0Bjb2RlIHZhbHVlfSBpbiB0aGlzIGRpY3Rpb25hcnkuIElmIHtAY29kZQorICAgICAqIGtleX0gZXhpc3RzIGluIHRoZSBkaWN0aW9uYXJ5IGJlZm9yZSB0aGlzIGNhbGwsIHRoZSBvbGQgdmFsdWUgaW4gdGhlCisgICAgICogZGljdGlvbmFyeSBpcyByZXBsYWNlZCBieSB7QGNvZGUgdmFsdWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gYWRkCisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGFkZC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPiBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgPGNvZGU+a2V5PC9jb2RlPiBpcyBuZXcgdG8gdGhlCi0gICAgICogICAgICAgICA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPi4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBhZGQuCisgICAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIHtAY29kZSBrZXl9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgbnVsbH0gaWYge0Bjb2RlIGtleX0gaXMgbmV3IHRvIHRoZSBkaWN0aW9uYXJ5LgogICAgICAqIEBzZWUgI2VsZW1lbnRzCiAgICAgICogQHNlZSAjZ2V0CiAgICAgICogQHNlZSAja2V5cworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBWIHB1dChLIGtleSwgViB2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNwZWNpZmllZCA8Y29kZT5rZXk8L2NvZGU+IGZyb20gdGhpcwotICAgICAqIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+LgorICAgICAqIFJlbW92ZXMgdGhlIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNwZWNpZmllZCB7QGNvZGUga2V5fSBmcm9tIHRoaXMKKyAgICAgKiBkaWN0aW9uYXJ5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBvciBlbHNlIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogICAgICAgICA8Y29kZT5rZXk8L2NvZGU+IGlzIG5vdCBrbm93biB0byB0aGlzIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGJlZm9yZSB0aGUgZGVsZXRpb24gb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICB7QGNvZGUga2V5fSB3YXMgbm90IGtub3duIHRvIHRoaXMgZGljdGlvbmFyeS4KICAgICAgKiBAc2VlICNnZXQKICAgICAgKiBAc2VlICNwdXQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgViByZW1vdmUoT2JqZWN0IGtleSk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGluIHRoaXMgRGljdGlvbmFyeS4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGluIHRoaXMgZGljdGlvbmFyeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGluIHRoaXMgRGljdGlvbmFyeQotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgaW4gdGhpcyBkaWN0aW9uYXJ5LgogICAgICAqIEBzZWUgI2VsZW1lbnRzCiAgICAgICogQHNlZSAja2V5cworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2l6ZSgpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9EdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9EdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbi5qYXZhCmluZGV4IGM1ZmJjMjkuLjkwOGFhMzYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0R1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uLmphdmEKQEAgLTE5LDYgKzE5LDkgQEAKIC8qKgogICogVGhlIHVuY2hlY2tlZCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0IGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgZmxhZ3MgZ2l2ZW4KICAqIG91dCBpbiB0aGUgZm9ybWF0IHNwZWNpZmllci4KKyAqIAorICogQHNlZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24gewogICAgIApAQCAtMjcsOSArMzAsMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBmbGFnczsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBEdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbiB3aGljaCBmbGFncyBpcyBzcGVjaWZpZWQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb259IHdpdGggdGhlIGZsYWdzCisgICAgICogY29udGFpbmluZyBkdXBsaWNhdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIFRoZSBmb3JtYXQgZmxhZ3MgdGhhdCBjb250YWluIGEgZHVwbGljYXRlIGZsYWcuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgdGhlIGZvcm1hdCBmbGFncyB0aGF0IGNvbnRhaW4gYSBkdXBsaWNhdGUgZmxhZy4KICAgICAgKi8KICAgICBwdWJsaWMgRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb24oU3RyaW5nIGYpIHsKICAgICAgICAgaWYgKG51bGwgPT0gZikgewpAQCAtNDEsNyArNDYsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGZvcm1hdCBmbGFncyB0aGF0IGNvbnRhaW4gYSBkdXBsaWNhdGUgZmxhZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXQgZmxhZ3MgdGhhdCBjb250YWluIGEgZHVwbGljYXRlIGZsYWcuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0IGZsYWdzIHRoYXQgY29udGFpbiBhIGR1cGxpY2F0ZSBmbGFnLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmxhZ3MoKSB7CiAgICAgICAgIHJldHVybiBmbGFnczsKQEAgLTUwLDcgKzU1LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBvZiB0aGUgRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIER1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoZSBEdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbi4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0VtcHR5U3RhY2tFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW1wdHlTdGFja0V4Y2VwdGlvbi5qYXZhCmluZGV4IGNjMTEwOGMuLjczZDMzYmEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW1wdHlTdGFja0V4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW1wdHlTdGFja0V4Y2VwdGlvbi5qYXZhCkBAIC0xOSwxNSArMTksMTkgQEAKIAogCiAvKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIHdoaWNoIGlzIHRocm93biB3aGVuIHBvcC9wZWVrIG1ldGhvZCBvZiBzdGFjayBpcyBleGVjdXRlZAotICogb24gYSBzdGFjayB3aGljaCBpcyBlbXB0eQorICogQW4ge0Bjb2RlIEVtcHR5U3RhY2tFeGNlcHRpb259IGlzIHRocm93biBpZiB0aGUgcG9wL3BlZWsgbWV0aG9kIG9mIGEgc3RhY2sgaXMKKyAqIGV4ZWN1dGVkIG9uIGFuIGVtcHR5IHN0YWNrLgorICogCisgKiBAc2VlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEVtcHR5U3RhY2tFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwODQ2ODYzNzg0OTMzMDIwOTVMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBFbXB0eVN0YWNrRXhjZXB0aW9ufSB3aXRoIHRoZSBzdGFjayB0cmFjZSBmaWxsZWQKKyAgICAgKiBpbi4KICAgICAgKi8KICAgICBwdWJsaWMgRW1wdHlTdGFja0V4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW51bU1hcC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtTWFwLmphdmEKaW5kZXggNTQ3NGQ4Mi4uMTM1MTA2OSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtTWFwLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtTWFwLmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiAKKy8qKgorICogQW4ge0Bjb2RlIE1hcH0gc3BlY2lhbGl6ZWQgZm9yIHVzZSB3aXRoIHtAY29kZSBFbnVtfSB0eXBlcyBhcyBrZXlzLgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBFbnVtTWFwPEsgZXh0ZW5kcyBFbnVtPEs+LCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IGltcGxlbWVudHMKICAgICAgICAgTWFwPEssIFY+LCBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDU4NjYxMjQwMDY5MTkyODY1TDsKQEAgLTM3Miw0MyArMzc3LDQwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBlbnVtIG1hcCB1c2luZyB0aGUgZ2l2ZW4ga2V5IHR5cGUuCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSB7QGNvZGUgRW51bU1hcH0gdXNpbmcgdGhlIGdpdmVuIGtleSB0eXBlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXlUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgb2JqZWN0IG9mIHRoZSBrZXkgdHlwZSB1c2VkIGJ5IHRoaXMgZW51bSBtYXAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGtleVR5cGUgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIG9iamVjdCBnaXZpbmcgdGhlIHR5cGUgb2YgdGhlIGtleXMgdXNlZCBieSB0aGlzIHtAY29kZSBFbnVtTWFwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRW51bU1hcChDbGFzczxLPiBrZXlUeXBlKSB7CiAgICAgICAgIGluaXRpYWxpemF0aW9uKGtleVR5cGUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZW51bSBtYXAgdXNpbmcgdGhlIHNhbWUga2V5IHR5cGUgYXMgdGhlIGdpdmVuIGVudW0gbWFwIGFuZAorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIEVudW1NYXB9IHVzaW5nIHRoZSBzYW1lIGtleSB0eXBlIGFzIHRoZSBnaXZlbiB7QGNvZGUgRW51bU1hcH0gYW5kCiAgICAgICogaW5pdGlhbGx5IGNvbnRhaW5pbmcgdGhlIHNhbWUgbWFwcGluZ3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIGVudW0gbWFwIGZyb20gd2hpY2ggdGhpcyBlbnVtIG1hcCBpcyBpbml0aWFsaXplZAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbWFwIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgRW51bU1hcH0gZnJvbSB3aGljaCB0aGlzIHtAY29kZSBFbnVtTWFwfSBpcyBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRW51bU1hcChFbnVtTWFwPEssID8gZXh0ZW5kcyBWPiBtYXApIHsKICAgICAgICAgaW5pdGlhbGl6YXRpb24obWFwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGVudW0gbWFwIGluaXRpYWxpemVkIGZyb20gdGhlIGdpdmVuIG1hcC4gSWYgdGhlIGdpdmVuIG1hcAotICAgICAqIGlzIGFuIEVudW1NYXAgaW5zdGFuY2UsIHRoaXMgY29uc3RydWN0b3IgYmVoYXZlcyBpbiB0aGUgZXhhY3RseSB0aGUgc2FtZQotICAgICAqIHdheSBhcyB7QGxpbmsgRW51bU1hcCNFbnVtTWFwKEVudW1NYXApfX0uIE90aGVyd2lzZSwgdGhlIGdpdmVuIG1hcCBhdAotICAgICAqIGxlYXN0IHNob3VsZCBjb250YWluIG9uZSBtYXBwaW5nLgorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIEVudW1NYXB9IGluaXRpYWxpemVkIGZyb20gdGhlIGdpdmVuIG1hcC4gSWYgdGhlIGdpdmVuIG1hcAorICAgICAqIGlzIGFuIHtAY29kZSBFbnVtTWFwfSBpbnN0YW5jZSwgdGhpcyBjb25zdHJ1Y3RvciBiZWhhdmVzIGluIHRoZSBleGFjdGx5IHRoZSBzYW1lCisgICAgICogd2F5IGFzIHtAbGluayBFbnVtTWFwI0VudW1NYXAoRW51bU1hcCl9fS4gT3RoZXJ3aXNlLCB0aGUgZ2l2ZW4gbWFwIAorICAgICAqIHNob3VsZCBjb250YWluIGF0IGxlYXN0IG9uZSBtYXBwaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgZnJvbSB3aGljaCB0aGlzIGVudW0gbWFwIGlzIGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICB0aGUgbWFwIGZyb20gd2hpY2ggdGhpcyB7QGNvZGUgRW51bU1hcH0gaXMgaW5pdGlhbGl6ZWQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbWFwIGlzIG5vdCBhbiBlbnVtIG1hcCBpbnN0YW5jZSBhbmQgZG9lcyBub3QgY29udGFpbgotICAgICAqICAgICAgICAgICAgIGFueSBtYXBwaW5ncwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbWFwIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbWFwfSBpcyBub3QgYW4ge0Bjb2RlIEVudW1NYXB9IGluc3RhbmNlIGFuZCBkb2VzIG5vdCBjb250YWluCisgICAgICogICAgICAgICAgICAgYW55IG1hcHBpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFbnVtTWFwKE1hcDxLLCA/IGV4dGVuZHMgVj4gbWFwKSB7CiAgICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBFbnVtTWFwKSB7CkBAIC00MzAsNyArNDMyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgaW4gdGhpcyBtYXAuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBFbnVtTWFwfSwgbGVhdmluZyBpdCBlbXB0eS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNpc0VtcHR5KCkKKyAgICAgKiBAc2VlICNzaXplKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKQEAgLTQ0MCw5ICs0NDYsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgbWFwLgorICAgICAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyB7QGNvZGUgRW51bU1hcH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG1hcAorICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyB7QGNvZGUgRW51bU1hcH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1NYXA8SywgVj4gY2xvbmUoKSB7CkBAIC00NTYsMTEgKzQ2MywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBoYXMgYSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHtAY29kZSBFbnVtTWFwfSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IHdob3NlIHByZXNlbmNlIGluIHRoaXMgbWFwIGlzIHRvIGJlIHRlc3RlZAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBoYXMgYSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIEVudW1NYXB9IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewpAQCAtNDcyLDExICs0ODEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgaGFzIG9uZSBvciBtb3JlIGtleXMgbWFwcGVkIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB7QGNvZGUgRW51bU1hcH0gY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIG1hcCBpcyB0byBiZSB0ZXN0ZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtYXAgaGFzIG9uZSBvciBtb3JlIGtleXMgbWFwcGVkIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIEVudW1NYXB9IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdmFsdWUsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewpAQCAtNDk3LDEzICs1MDgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNldH19IHZpZXcgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gVGhlCi0gICAgICogcmV0dXJuZWQgc2V0IGNvbXBsaWVzIHdpdGggdGhlIGdlbmVyYWwgcnVsZSBzcGVjaWZpZWQgaW4KLSAgICAgKiB7QGxpbmsgTWFwI2VudHJ5U2V0KCl9fS4gVGhlIHNldCdzIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIHRoZSBtYXBwaW5ncyBpbgotICAgICAqIHRoZSB0aGVpciBrZXlzJyBuYXR1cmFsIG9yZGVyKHRoZSBlbnVtIGNvbnN0YW50cyBhcmUgZGVjbGFyZWQgaW4gdGhpcwotICAgICAqIG9yZGVyKQorICAgICAqIFJldHVybnMgYSB7QGNvZGUgU2V0fSBjb250YWluaW5nIGFsbCBvZiB0aGUgbWFwcGluZ3MgaW4gdGhpcyB7QGNvZGUgRW51bU1hcH0uIEVhY2ggbWFwcGluZyBpcworICAgICAqIGFuIGluc3RhbmNlIG9mIHtAbGluayBNYXAuRW50cnl9LiBBcyB0aGUge0Bjb2RlIFNldH0gaXMgYmFja2VkIGJ5IHRoaXMge0Bjb2RlIEVudW1NYXB9LAorICAgICAqIGNoYW5nZXMgaW4gb25lIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBvdGhlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2V0IHZpZXcgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNldH0gb2YgdGhlIG1hcHBpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsKQEAgLTUxNCwxMiArNTI0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoaXMgbWFwLiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdAotICAgICAqIGlzIGVxdWFsIHRvIHRoaXMgbWFwLgorICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIE9iamVjdH0gaXMgYW4ge0Bjb2RlIEVudW1NYXB9IGFuZCBib3RoIHtAY29kZSBFbnVtTWFwfXMgY29udGFpbiB0aGUgc2FtZSBtYXBwaW5ncy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGggdGhpcyBtYXAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIG1hcC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSB0byBjb21wYXJlIHdpdGggdGhpcyB7QGNvZGUgRW51bU1hcH0uCisgICAgICogQHJldHVybiBib29sZWFuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgb2JqZWN0fSBpcyB0aGUgc2FtZSBhcyB0aGlzIHtAY29kZSBFbnVtTWFwfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI2hhc2hDb2RlKCkKKyAgICAgKiBAc2VlICNlbnRyeVNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTUzOCwxMyArNTUyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgd2hpY2ggaXMgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXkgaW4gdGhpcyBtYXAsIG9yIG51bGwKLSAgICAgKiBpZiB0aGlzIG1hcCBoYXMgbm8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIGdpdmVuIGtleSwgb3IgbnVsbCBpZiB0aGlzCi0gICAgICogICAgICAgICBtYXAgaGFzIG5vIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBrZXkuCisgICAgICogICAgICAgICAgICB0aGUga2V5LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgbm8gbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBrZXkgaXMgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC01NTcsMTIgKzU3MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgU2V0fX0gdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZQotICAgICAqIHJldHVybmVkIHNldCBjb21wbGllcyB3aXRoIHRoZSBnZW5lcmFsIHJ1bGUgc3BlY2lmaWVkIGluCi0gICAgICoge0BsaW5rIE1hcCNrZXlTZXQoKX19LiBUaGUgc2V0J3MgaXRlcmF0b3Igd2lsbCByZXR1cm4gdGhlIGtleXMgaW4gdGhlCi0gICAgICogdGhlaXIgbmF0dXJhbCBvcmRlcih0aGUgZW51bSBjb25zdGFudHMgYXJlIGRlY2xhcmVkIGluIHRoaXMgb3JkZXIpCisgICAgICogUmV0dXJucyBhIHNldCBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyB7QGNvZGUgRW51bU1hcH0uIFRoZSB7QGNvZGUgU2V0fSBpcyBiYWNrZWQgYnkKKyAgICAgKiB0aGlzIHtAY29kZSBFbnVtTWFwfSBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGluIHRoZSBvdGhlci4gVGhlIHtAY29kZSBTZXR9IGRvZXMgbm90CisgICAgICogc3VwcG9ydCBhZGRpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNldH0gb2YgdGhlIGtleXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxLPiBrZXlTZXQoKSB7CkBAIC01NzMsMTcgKzU4NywyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFzc29jaWF0ZXMgdGhlIGdpdmVuIHZhbHVlIHdpdGggdGhlIGdpdmVuIGtleSBpbiB0aGlzIG1hcC4gSWYgdGhlIG1hcAotICAgICAqIHByZXZpb3VzbHkgaGFkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQgdmFsdWUgaXMgcmVwbGFjZWQuCisgICAgICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgd2l0aCB3aGljaCB0aGUgZ2l2ZW4gdmFsdWUgaXMgdG8gYmUgYXNzb2NpYXRlZCB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIGdpdmVuIGtleSwgb3IgbnVsbCBpZiB0aGlzCi0gICAgICogICAgICAgICBtYXAgaGFzIG5vIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBrZXkuCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhZGRpbmcgdG8gdGhpcyBtYXAgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBvZiB0aGUga2V5IG9yIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICBtYXAuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUga2V5IG9yIHZhbHVlIGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIG1hcC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGtleSBpcyBudWxsCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGtleSBvciB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoaXMge0Bjb2RlIEVudW1NYXB9IGRvZXMgbm90CisgICAgICogICAgICAgICAgICAgICAgc3VwcG9ydCB7QGNvZGUgbnVsbH0ga2V5cyBvciB2YWx1ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC01OTIsMTUgKzYxNCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyBhbGwgdGhlIG1hcHBpbmdzIGluIHRoZSBnaXZlbiBtYXAgdG8gdGhpcyBtYXAuIFRoZXNlIG1hcHBpbmdzIHdpbGwKLSAgICAgKiByZXBsYWNlIGFsbCBtYXBwaW5ncyB0aGF0IHRoaXMgbWFwIGhhZCBmb3IgYWxsIG9mIHRoZSBrZXlzIGN1cnJlbnRseSBpbgotICAgICAqIHRoZSBnaXZlbiBtYXAuCisgICAgICogQ29waWVzIGV2ZXJ5IG1hcHBpbmcgaW4gdGhlIHNwZWNpZmllZCB7QGNvZGUgTWFwfSB0byB0aGlzIHtAY29kZSBFbnVtTWFwfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICB0aGUga2V5IHdob3NlIHByZXNlbmNlIGluIHRoaXMgbWFwIGlzIHRvIGJlIHRlc3RlZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBNYXB9IHRvIGNvcHkgbWFwcGluZ3MgZnJvbS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYWRkaW5nIHRvIHRoaXMge0Bjb2RlIEVudW1NYXB9IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgYSBrZXkgb3IgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSBFbnVtTWFwfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGEga2V5IG9yIHZhbHVlIGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIG1hcC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIG1hcCBpcyBudWxsLCBvciBpZiBvbmUgb3IgbW9yZSBrZXlzIGluIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgICAgIG1hcCBhcmUgbnVsbAorICAgICAqICAgICAgICAgICAgICAgIGlmIGEga2V5IG9yIHZhbHVlIGlzIHtAY29kZSBudWxsfSBhbmQgdGhpcyB7QGNvZGUgRW51bU1hcH0gZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwb3J0IHtAY29kZSBudWxsfSBrZXlzIG9yIHZhbHVlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTYwOSwxMiArNjM3LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyBrZXkgZnJvbSB0aGlzIG1hcCBpZiBpdCBpcyBwcmVzZW50LgorICAgICAqIFJlbW92ZXMgYSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGlzIHtAY29kZSBFbnVtTWFwfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGwgaWYgdGhpcwotICAgICAqICAgICAgICAgbWFwIGhhcyBubyBtYXBwaW5nIGZvciB0aGlzIGtleS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIG1hcHBpbmcgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIG1hcHBpbmcKKyAgICAgKiAgICAgICAgIGZvciB0aGUgc3BlY2lmaWVkIGtleSB3YXMgZm91bmQuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHJlbW92aW5nIGZyb20gdGhpcyB7QGNvZGUgRW51bU1hcH0gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTYzMyw5ICs2NjQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIG1hcHBpbmdzIGluIHRoaXMgbWFwLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHtAY29kZSBFbnVtTWFwfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIG1hcHBpbmdzIGluIHRoaXMgbWFwCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIEVudW1NYXB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKQEAgLTY0MywxMyArNjc1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBDb2xsZWN0aW9ufX0gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KLSAgICAgKiBUaGUgcmV0dXJuZWQgY29sbGVjdGlvbiBjb21wbHlzIHdpdGggdGhlIGdlbmVyYWwgcnVsZSBzcGVjaWZpZWQgaW4KLSAgICAgKiB7QGxpbmsgTWFwI3ZhbHVlcygpfX0uIFRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3Igd2lsbCByZXR1cm4gdGhlIHZhbHVlcwotICAgICAqIGluIHRoZSB0aGVpciBjb3JyZXNwb25kaW5nIGtleXMnIG5hdHVyYWwgb3JkZXIodGhlIGVudW0gY29uc3RhbnRzIGFyZQotICAgICAqIGRlY2xhcmVkIGluIHRoaXMgb3JkZXIpCisgICAgICogUmV0dXJucyBhIHtAY29kZSBDb2xsZWN0aW9ufSBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIHtAY29kZSBFbnVtTWFwfS4gVGhlIHJldHVybmVkCisgICAgICoge0Bjb2RlIENvbGxlY3Rpb259IGNvbXBsaWVzIHdpdGggdGhlIGdlbmVyYWwgcnVsZSBzcGVjaWZpZWQgaW4KKyAgICAgKiB7QGxpbmsgTWFwI3ZhbHVlcygpfS4gVGhlIHtAY29kZSBDb2xsZWN0aW9ufSdzIHtAY29kZSBJdGVyYXRvcn0gd2lsbCByZXR1cm4gdGhlIHZhbHVlcworICAgICAqIGluIHRoZSB0aGVpciBjb3JyZXNwb25kaW5nIGtleXMnIG5hdHVyYWwgb3JkZXIgKHRoZSB7QGNvZGUgRW51bX0gY29uc3RhbnRzIGFyZQorICAgICAqIGRlY2xhcmVkIGluIHRoaXMgb3JkZXIpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIHZpZXcgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIHtAY29kZSBFbnVtTWFwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0VudW1TZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW51bVNldC5qYXZhCmluZGV4IDE0MDIxYWYuLjRlNDRmMmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW51bVNldC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW51bVNldC5qYXZhCkBAIC0xNSwxNSArMTUsMjIgQEAKICAqLwogcGFja2FnZSBqYXZhLnV0aWw7CiAKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLkxhbmdBY2Nlc3M7CisvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKKy8qKgorICogQW4gRW51bVNldCBpcyBhIHNwZWNpYWxpemVkIFNldCB0byBiZSB1c2VkIHdpdGggZW51bXMgYXMga2V5cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnVtU2V0PEUgZXh0ZW5kcyBFbnVtPEU+PiBleHRlbmRzIEFic3RyYWN0U2V0PEU+CiAgICAgICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewogICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKLSAgICAvKioKLSAgICAgKiBudWxsLW9rOyBwYWNrYWdlIGFjY2VzcyB0byA8Y29kZT5qYXZhLmxhbmc8L2NvZGU+LCBzZXQgZHVyaW5nCisgICAgLyoKKyAgICAgKiBudWxsLW9rOyBwYWNrYWdlIGFjY2VzcyB0byB7QGNvZGUgamF2YS5sYW5nfSwgc2V0IGR1cmluZwogICAgICAqIGZpcnN0IG5lZWQuIFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgZGlyZWN0bHkuIEluc3RlYWQsIHVzZSB7QGxpbmsKICAgICAgKiBTcGVjaWFsQWNjZXNzI0xBTkd9LCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGluaXRpYWxpemVkLgogICAgICAqLwpAQCAtMzksMTQgKzQ2LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBlbnVtIHNldC4gVGhlIHBlcm1pdHRlZCBlbGVtZW50cyBhcmUgb2YgdHlwZSBDbGFzczxFPi4KKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGVudW0gc2V0LiBUaGUgcGVybWl0dGVkIGVsZW1lbnRzIGFyZSBvZiB0eXBlCisgICAgICogQ2xhc3MmbHQ7RSZndDsuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVsZW1lbnRUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgb2JqZWN0IGZvciB0aGUgZWxlbWVudHMgY29udGFpbmVkCi0gICAgICogQHJldHVybiBhbiBlbXB0eSBlbnVtIHNldCwgd2l0aCBwZXJtaXR0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgZWxlbWVudFR5cGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50VHlwZSBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgb2JqZWN0IGZvciB0aGUgZWxlbWVudHMgY29udGFpbmVkLgorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgZW51bSBzZXQsIHdpdGggcGVybWl0dGVkIGVsZW1lbnRzIG9mIHR5cGUge0Bjb2RlCisgICAgICogICAgICAgICBlbGVtZW50VHlwZX0uCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZSBpcyBub3QgYW5kIGVudW0gdHlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgRW51bTxFPj4gRW51bVNldDxFPiBub25lT2YoQ2xhc3M8RT4gZWxlbWVudFR5cGUpIHsKICAgICAgICAgaWYgKCFlbGVtZW50VHlwZS5pc0VudW0oKSkgewpAQCAtNjIsMTQgKzcxLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbnVtIHNldC4gRWxlbWVudCBpcyBjb250YWluZWQgaW4gdGhpcyBlbnVtIHNldCBpZiBhbmQgb25seSBpZgotICAgICAqIGl0IGlzIGEgbWVtYmVyIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlLgorICAgICAqIENyZWF0ZXMgYW4gZW51bSBzZXQgZmlsbGVkIHdpdGggYWxsIHRoZSBlbnVtIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgZWxlbWVudFR5cGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBlbGVtZW50VHlwZQotICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIG9iamVjdCBmb3IgdGhlIGVsZW1lbnRzIGNvbnRhaW5lZAotICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgd2l0aCBlbGVtZW50cyBzb2xlbHkgZnJvbSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRUeXBlIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBvYmplY3QgZm9yIHRoZSBlbGVtZW50cyBjb250YWluZWQuCisgICAgICogQHJldHVybiBhbiBlbnVtIHNldCB3aXRoIGVsZW1lbnRzIHNvbGVseSBmcm9tIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUgaXMgbm90IGFuZCBlbnVtIHR5cGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gYWxsT2YoQ2xhc3M8RT4gZWxlbWVudFR5cGUpIHsKICAgICAgICAgRW51bVNldDxFPiBzZXQgPSBub25lT2YoZWxlbWVudFR5cGUpOwpAQCAtNzgsMTQgKzg4LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbnVtIHNldC4gQWxsIHRoZSBjb250YWluZWQgZWxlbWVudHMgYXJlIG9mIHR5cGUgQ2xhc3M8RT4sCi0gICAgICogYW5kIHRoZSBjb250YWluZWQgZWxlbWVudHMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGNvbnRhaW5lZCBpbiBzLgorICAgICAqIENyZWF0ZXMgYW4gZW51bSBzZXQuIEFsbCB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGFyZSBvZiB0eXBlCisgICAgICogQ2xhc3MmbHQ7RSZndDssIGFuZCB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZQorICAgICAqIGNvbnRhaW5lZCBpbiB7QGNvZGUgc30uCiAgICAgICogCiAgICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbnVtIHNldCBmcm9tIHdoaWNoIHRvIGNvcHkKLSAgICAgKiBAcmV0dXJuIGFuIGVudW0gc2V0IHdpdGggYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgZW51bSBzZXQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBlbnVtIHNldCBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgZW51bSBzZXQgZnJvbSB3aGljaCB0byBjb3B5LgorICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBlbnVtIHNldC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlIGlzIG5vdCBhbmQgZW51bSB0eXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBFbnVtPEU+PiBFbnVtU2V0PEU+IGNvcHlPZihFbnVtU2V0PEU+IHMpIHsKICAgICAgICAgRW51bVNldDxFPiBzZXQgPSBFbnVtU2V0Lm5vbmVPZihzLmVsZW1lbnRDbGFzcyk7CkBAIC05NSwxNiArMTA3LDE2IEBACiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGFuIGVudW0gc2V0LiBUaGUgY29udGFpbmVkIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZQotICAgICAqIGNvbnRhaW5lZCBpbiBjb2xsZWN0aW9uIGMuIElmIGMgaXMgYW4gZW51bSBzZXQsIGludm9raW5nIHRoaXMgbWV0aG9kIGlzCi0gICAgICogdGhlIHNhbWUgYXMgaW52b2tpbmcge0BsaW5rICNjb3B5T2YoRW51bVNldCl9LgorICAgICAqIGNvbnRhaW5lZCBpbiBjb2xsZWN0aW9uIHtAY29kZSBjfS4gSWYgYyBpcyBhbiBlbnVtIHNldCwgaW52b2tpbmcgdGhpcworICAgICAqIG1ldGhvZCBpcyB0aGUgc2FtZSBhcyBpbnZva2luZyB7QGxpbmsgI2NvcHlPZihFbnVtU2V0KX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIGZyb20gd2hpY2ggdG8gY29weQotICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBmcm9tIHdoaWNoIHRvIGNvcHkuIGlmIGl0IGlzIG5vdCBhbiBlbnVtIHNldCwKKyAgICAgKiAgICAgICAgICAgIGl0IG11c3Qgbm90IGJlIGVtcHR5LgorICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYyBpcyBub3QgYW4gZW51bSBzZXQgYW5kIGNvbnRhaW5zIG5vIGVsZW1lbnRzIGF0IGFsbAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIGMgaXMgbm90IGFuIGVudW0gc2V0IGFuZCBjb250YWlucyBubyBlbGVtZW50cyBhdCBhbGwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gY29weU9mKENvbGxlY3Rpb248RT4gYykgewogICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIEVudW1TZXQpIHsKQEAgLTEyOCwxMSArMTQwLDEwIEBACiAgICAgICogc3BlY2lmaWVkIGVudW0gc2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGVudW0gc2V0Ci0gICAgICogQHJldHVybiBhbiBlbnVtIHNldCB3aXRoIGFsbCB0aGUgZWxlbWVudHMgY29tcGxlbWVudCB0aG9zZSBmcm9tIHRoZQotICAgICAqICAgICAgICAgc3BlY2lmaWVkIGVudW0gc2V0Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgZW51bSBzZXQgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBlbnVtIHNldC4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW0gc2V0IHdpdGggYWxsIHRoZSBlbGVtZW50cyBjb21wbGVtZW50YXJ5IHRvIHRob3NlIGZyb20gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgZW51bSBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gY29tcGxlbWVudE9mKEVudW1TZXQ8RT4gcykgewogICAgICAgICBFbnVtU2V0PEU+IHNldCA9IEVudW1TZXQubm9uZU9mKHMuZWxlbWVudENsYXNzKTsKQEAgLTE0NiwxNCArMTU3LDEzIEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBlbnVtIHNldCwgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gVGhlcmUgYXJlCiAgICAgICogc2l4IG92ZXJsb2FkaW5ncyBvZiB0aGUgbWV0aG9kLiBUaGV5IGFjY2VwdCBmcm9tIG9uZSB0byBmaXZlIGVsZW1lbnRzCi0gICAgICogcmVzcGVjdGl2ZWx5LiBUaGUgc2l4dGggb25lIHJlY2VpdmVzIGFyYml0cmFyeSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZAotICAgICAqIHJ1bnMgc2xvd2VyIHRoYW4gdGhvc2Ugb25seSByZWNlaXZlIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgKiByZXNwZWN0aXZlbHkuIFRoZSBzaXh0aCBvbmUgcmVjZWl2ZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGVtZW50cywgYW5kCisgICAgICogcnVucyBzbG93ZXIgdGhhbiB0aG9zZSB0aGF0IG9ubHkgcmVjZWl2ZSBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAotICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHRvIGJlIGluaXRpYWxseSBjb250YWluZWQuCisgICAgICogQHJldHVybiBhbiBlbnVtIHNldCBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgRW51bTxFPj4gRW51bVNldDxFPiBvZihFIGUpIHsKICAgICAgICAgRW51bVNldDxFPiBzZXQgPSBFbnVtU2V0Lm5vbmVPZihlLmdldERlY2xhcmluZ0NsYXNzKCkpOwpAQCAtMTYyLDE4ICsxNzIsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVudW0gc2V0LCBjb250YWluaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4gVGhlcmUgYXJlCisgICAgICogQ3JlYXRlcyBhIG5ldyBlbnVtIHNldCwgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gVGhlcmUgYXJlCiAgICAgICogc2l4IG92ZXJsb2FkaW5ncyBvZiB0aGUgbWV0aG9kLiBUaGV5IGFjY2VwdCBmcm9tIG9uZSB0byBmaXZlIGVsZW1lbnRzCi0gICAgICogcmVzcGVjdGl2ZWx5LiBUaGUgc2l4dGggb25lIHJlY2VpdmVzIGFyYml0cmFyeSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZAotICAgICAqIHJ1bnMgc2xvd2VyIHRoYW4gdGhvc2Ugb25seSByZWNlaXZlIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgKiByZXNwZWN0aXZlbHkuIFRoZSBzaXh0aCBvbmUgcmVjZWl2ZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGVtZW50cywgYW5kCisgICAgICogcnVucyBzbG93ZXIgdGhhbiB0aG9zZSB0aGF0IG9ubHkgcmVjZWl2ZSBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGUyCi0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAotICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gb2YoRSBlMSwgRSBlMikgewogICAgICAgICBFbnVtU2V0PEU+IHNldCA9IG9mKGUxKTsKQEAgLTE4MiwyMCArMTkxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBlbnVtIHNldCwgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuIFRoZXJlIGFyZQorICAgICAqIENyZWF0ZXMgYSBuZXcgZW51bSBzZXQsIGNvbnRhaW5pbmcgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuIFRoZXJlIGFyZQogICAgICAqIHNpeCBvdmVybG9hZGluZ3Mgb2YgdGhlIG1ldGhvZC4gVGhleSBhY2NlcHQgZnJvbSBvbmUgdG8gZml2ZSBlbGVtZW50cwotICAgICAqIHJlc3BlY3RpdmVseS4gVGhlIHNpeHRoIG9uZSByZWNlaXZlcyBhcmJpdHJhcnkgbnVtYmVyIG9mIGVsZW1lbnRzLCBhbmQKLSAgICAgKiBydW5zIHNsb3dlciB0aGFuIHRob3NlIG9ubHkgcmVjZWl2ZSBmaXhlZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICogcmVzcGVjdGl2ZWx5LiBUaGUgc2l4dGggb25lIHJlY2VpdmVzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZAorICAgICAqIHJ1bnMgc2xvd2VyIHRoYW4gdGhvc2UgdGhhdCBvbmx5IHJlY2VpdmUgYSBmaXhlZCBudW1iZXIgb2YgZWxlbWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGUxCi0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50CisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50LgogICAgICAqIEBwYXJhbSBlMgotICAgICAqICAgICAgICAgICAgYW5vdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50LgogICAgICAqIEBwYXJhbSBlMwotICAgICAqICAgICAgICAgICAgYW5vdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIGFuIGVudW0gc2V0IGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBlbGVtZW50cwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBpcyBudWxsCisgICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW0gc2V0IGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBlbGVtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBFbnVtPEU+PiBFbnVtU2V0PEU+IG9mKEUgZTEsIEUgZTIsIEUgZTMpIHsKICAgICAgICAgRW51bVNldDxFPiBzZXQgPSBvZihlMSwgZTIpOwpAQCAtMjA0LDIyICsyMTIsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVudW0gc2V0LCBjb250YWluaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4gVGhlcmUgYXJlCisgICAgICogQ3JlYXRlcyBhIG5ldyBlbnVtIHNldCwgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gVGhlcmUgYXJlCiAgICAgICogc2l4IG92ZXJsb2FkaW5ncyBvZiB0aGUgbWV0aG9kLiBUaGV5IGFjY2VwdCBmcm9tIG9uZSB0byBmaXZlIGVsZW1lbnRzCi0gICAgICogcmVzcGVjdGl2ZWx5LiBUaGUgc2l4dGggb25lIHJlY2VpdmVzIGFyYml0cmFyeSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZAotICAgICAqIHJ1bnMgc2xvd2VyIHRoYW4gdGhvc2Ugb25seSByZWNlaXZlIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgKiByZXNwZWN0aXZlbHkuIFRoZSBzaXh0aCBvbmUgcmVjZWl2ZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGVtZW50cywgYW5kCisgICAgICogcnVucyBzbG93ZXIgdGhhbiB0aG9zZSB0aGF0IG9ubHkgcmVjZWl2ZSBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGUyCi0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgYW5vdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGUzCi0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgYW5vdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGU0Ci0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAotICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gb2YoRSBlMSwgRSBlMiwgRSBlMywgRSBlNCkgewogICAgICAgICBFbnVtU2V0PEU+IHNldCA9IG9mKGUxLCBlMiwgZTMpOwpAQCAtMjI4LDI0ICsyMzUsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVudW0gc2V0LCBjb250YWluaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4gVGhlcmUgYXJlCisgICAgICogQ3JlYXRlcyBhIG5ldyBlbnVtIHNldCwgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gVGhlcmUgYXJlCiAgICAgICogc2l4IG92ZXJsb2FkaW5ncyBvZiB0aGUgbWV0aG9kLiBUaGV5IGFjY2VwdCBmcm9tIG9uZSB0byBmaXZlIGVsZW1lbnRzCi0gICAgICogcmVzcGVjdGl2ZWx5LiBUaGUgc2l4dGggb25lIHJlY2VpdmVzIGFyYml0cmFyeSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZAotICAgICAqIHJ1bnMgc2xvd2VyIHRoYW4gdGhvc2Ugb25seSByZWNlaXZlIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgKiByZXNwZWN0aXZlbHkuIFRoZSBzaXh0aCBvbmUgcmVjZWl2ZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGVtZW50cywgYW5kCisgICAgICogcnVucyBzbG93ZXIgdGhhbiB0aG9zZSB0aGF0IG9ubHkgcmVjZWl2ZSBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZTEKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGUyCi0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgYW5vdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGUzCi0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgYW5vdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGU0Ci0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgYW5vdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGU1Ci0gICAgICogICAgICAgICAgICBhbm90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudAotICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gb2YoRSBlMSwgRSBlMiwgRSBlMywgRSBlNCwgRSBlNSkgewogICAgICAgICBFbnVtU2V0PEU+IHNldCA9IG9mKGUxLCBlMiwgZTMsIGU0KTsKQEAgLTI1NCwxNyArMjYwLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBlbnVtIHNldCwgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuIEl0Ci0gICAgICogcmVjZWl2ZXMgYXJiaXRyYXJ5IG51bWJlciBvZiBlbGVtZW50cywgYW5kIHJ1bnMgc2xvd2VyIHRoYW4gdGhvc2Ugb25seQotICAgICAqIHJlY2VpdmUgZml4ZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAqIENyZWF0ZXMgYSBuZXcgZW51bSBzZXQsIGNvbnRhaW5pbmcgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzLiBJdCBjYW4KKyAgICAgKiByZWNlaXZlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBydW5zIHNsb3dlciB0aGFuIHRob3NlIG9ubHkKKyAgICAgKiByZWNlaXZpbmcgYSBmaXhlZCBudW1iZXIgb2YgZWxlbWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgaW5pdGlhbGx5IGNvbnRhaW5lZCBlbGVtZW50LgogICAgICAqIEBwYXJhbSBvdGhlcnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBvdGhlciBpbml0aWFsbHkgY29udGFpbmVkIGVsZW1lbnRzCi0gICAgICogQHJldHVybiBhbiBlbnVtIHNldCBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG90aGVyIGluaXRpYWxseSBjb250YWluZWQgZWxlbWVudHMuCisgICAgICogQHJldHVybiBhbiBlbnVtIHNldCBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gb2YoRSBzdGFydCwgRS4uLiBvdGhlcnMpIHsKICAgICAgICAgRW51bVNldDxFPiBzZXQgPSBvZihzdGFydCk7CkBAIC0yNzYsMTcgKzI4MSwxNyBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhbiBlbnVtIHNldCBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgd2l0aGluIHRoZSByYW5nZSBkZWZpbmVkCi0gICAgICogYnkgc3RhcnQgYW5kIGVuZCAoaW5jbHVzaXZlKS4gQWxsIHRoZSBlbGVtZW50cyBtdXN0IGJlIGluIG9yZGVyLgorICAgICAqIGJ5IHtAY29kZSBzdGFydH0gYW5kIHtAY29kZSBlbmR9IChpbmNsdXNpdmUpLiBBbGwgdGhlIGVsZW1lbnRzIG11c3QgYmUgaW4KKyAgICAgKiBvcmRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHVzZWQgdG8gZGVmaW5lIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCB1c2VkIHRvIGRlZmluZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZS4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCB1c2VkIHRvIGRlZmluZSB0aGUgZW5kIG9mIHRoZSByYW5nZQotICAgICAqIEByZXR1cm4gYW4gZW51bSBzZXQgd2l0aCBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgZnJvbSBzdGFydCB0byBlbmQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW55IG9uZSBvZiBzdGFydCBvciBlbmQgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdXNlZCB0byBkZWZpbmUgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICogQHJldHVybiBhbiBlbnVtIHNldCB3aXRoIGVsZW1lbnRzIGluIHRoZSByYW5nZSBmcm9tIHN0YXJ0IHRvIGVuZC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHN0YXJ0IGlzIGJlaGluZCBlbmQKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnR9IGlzIGJlaGluZCB7QGNvZGUgZW5kfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgRW51bTxFPj4gRW51bVNldDxFPiByYW5nZShFIHN0YXJ0LCBFIGVuZCkgewogICAgICAgICBpZiAoc3RhcnQuY29tcGFyZVRvKGVuZCkgPiAwKSB7CkBAIC0zMDQsNyArMzA5LDggQEAKICAgICAgKiBlbnVtIHNldC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIGEgbmV3IGVudW0gc2V0IHdpdGggdGhlIHNhbWUgZWxlbWVudHMgYXMgdGhvc2UgY29udGFpbmVkIGluIHRoaXMKLSAgICAgKiAgICAgICAgIGVudW0gc2V0CisgICAgICogICAgICAgICBlbnVtIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW51bWVyYXRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW51bWVyYXRpb24uamF2YQppbmRleCBlMzdhODllLi5kNjBiZGQyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0VudW1lcmF0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtZXJhdGlvbi5qYXZhCkBAIC0yMCwzMSArMjAsMzUgQEAKIAogLyoqCiAgKiBBbiBFbnVtZXJhdGlvbiBpcyB1c2VkIHRvIHNlcXVlbmNlIG92ZXIgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCisgKiA8cD4KKyAqIFByZWZlcmFibHkgYW4gSXRlcmF0b3Igc2hvdWxkIGJlIHVzZWQuIEl0ZXJhdG9yIHJlcGxhY2VzIHRoZSBFbnVtZXJhdGlvbgorICogaW50ZXJmYWNlIGFuZCBhZGRzIGEgd2F5IHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGEgY29sbGVjdGlvbi4KKyAqIDwvcD4KICAqIAogICogQHNlZSBIYXNodGFibGUKICAqIEBzZWUgUHJvcGVydGllcwogICogQHNlZSBWZWN0b3IKLSAqIEB2ZXJzaW9uIDEuMAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRW51bWVyYXRpb248RT4geworCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIEVudW1lcmF0aW9uIGhhcyBtb3JlIGVsZW1lbnRzLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHtAY29kZSBFbnVtZXJhdGlvbn0gaGFzIG1vcmUgZWxlbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjbmV4dEVsZW1lbnQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGlzIEVudW1lcmF0aW9uLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGlzIHtAY29kZSBFbnVtZXJhdGlvbn0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IGluIHRoaXMgRW51bWVyYXRpb24KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50Li4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cy4KICAgICAgKiBAc2VlICNoYXNNb3JlRWxlbWVudHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSBuZXh0RWxlbWVudCgpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FdmVudExpc3RlbmVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0V2ZW50TGlzdGVuZXIuamF2YQppbmRleCA5MWQ2N2U5Li45ZmY0ODc2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0V2ZW50TGlzdGVuZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0V2ZW50TGlzdGVuZXIuamF2YQpAQCAtMjEsNyArMjEsOCBAQAogLyoqCiAgKiBFdmVudExpc3RlbmVyIGlzIHRoZSBzdXBlcmNsYXNzIG9mIGFsbCBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2VzLgogICoKLSAqIEBzZWUgICAgICAgICAgICBFdmVudE9iamVjdAorICogQHNlZSBFdmVudE9iamVjdAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRMaXN0ZW5lciB7CiAgICAgLyplbXB0eSovCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0V2ZW50TGlzdGVuZXJQcm94eS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FdmVudExpc3RlbmVyUHJveHkuamF2YQppbmRleCBlY2E0YzE2Li5hMTY1Mzg1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0V2ZW50TGlzdGVuZXJQcm94eS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRXZlbnRMaXN0ZW5lclByb3h5LmphdmEKQEAgLTE5LDIxICsxOSwzMiBAQAogCiAKIC8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyBhIHNpbXBsZSB3cmFwcGVyIHRvIHR5cGVzIG9mIEV2ZW50TGlzdGVuZXIuCi0gKiAKKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgYSBzaW1wbGUgd3JhcHBlciBmb3Igb2JqZWN0cyBvZiB0eXBlIHtAY29kZSBFdmVudExpc3RlbmVyfS4KKyAqICAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXZlbnRMaXN0ZW5lclByb3h5IGltcGxlbWVudHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwcml2YXRlIGZpbmFsIEV2ZW50TGlzdGVuZXIgbGlzdGVuZXI7CiAKICAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFdmVudExpc3RlbmVyfSBwcm94eSBpbnN0YW5jZS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3cmFwcGVkIGJ5IHRoaXMgcHJveHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEV2ZW50TGlzdGVuZXJQcm94eShFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIHtAY29kZSBFdmVudExpc3RlbmVyfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIHtAY29kZSBFdmVudExpc3RlbmVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgRXZlbnRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRXZlbnRPYmplY3QuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRXZlbnRPYmplY3QuamF2YQppbmRleCBjMzM1ZDZlLi42MWU1MzBhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0V2ZW50T2JqZWN0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FdmVudE9iamVjdC5qYXZhCkBAIC0yMSwxMCArMjEsMTIgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBFdmVudE9iamVjdHMgcmVwcmVzZW50IGV2ZW50cy4gVHlwaWNhbGx5IGFwcGxpY2F0aW9ucyBzdWJjbGFzcyB0aGlzIGNsYXNzIHRvCisgKiB7QGNvZGUgRXZlbnRPYmplY3R9cyByZXByZXNlbnQgZXZlbnRzLiBUeXBpY2FsbHkgYXBwbGljYXRpb25zIHN1YmNsYXNzIHRoaXMgY2xhc3MgdG8KICAqIGFkZCBldmVudCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KICAqIAogICogQHNlZSBFdmVudExpc3RlbmVyCisgKiAgCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEV2ZW50T2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKICAgICAKQEAgLTMyLDYgKzM0LDggQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBldmVudCBzb3VyY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBPYmplY3Qgc291cmNlOwogCkBAIC0zOSw3ICs0Myw4IEBACiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2hpY2ggZmlyZWQgdGhlIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHdoaWNoIGZpcmVkIHRoZSBldmVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRXZlbnRPYmplY3QoT2JqZWN0IHNvdXJjZSkgewogICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKQEAgLTUyLDE2ICs1NywxOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGV2ZW50IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgd2hpY2ggZmlyZWQgdGhlIGV2ZW50CisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHdoaWNoIGZpcmVkIHRoZSBldmVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpIHsKICAgICAgICAgcmV0dXJuIHNvdXJjZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBFdmVudE9iamVjdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgRXZlbnRPYmplY3R9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEV2ZW50T2JqZWN0CisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIEV2ZW50T2JqZWN0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Gb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Gb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCmluZGV4IGU5ZWQ2ZTcuLmFhMGM5NjcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdEZsYWdzQ29udmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTE5LDggKzE5LDExIEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogVGhlIHVuY2hlY2tlZCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0IGlmIGEgY29udmVyc2lvbiBhbmQgZmxhZ3MgYXJlCi0gKiBpbmNvbXBhdGlibGUuCisgKiBBIHtAY29kZSBGb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgYQorICogY29udmVyc2lvbiBhbmQgdGhlIGZsYWdzIGFyZSBpbmNvbXBhdGlibGUuCisgKiAKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24gZXh0ZW5kcwogICAgICAgICBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKQEAgLTMyLDEzICszNSwxMyBAQAogICAgIHByaXZhdGUgY2hhciBjOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24gd2l0aCB0aGUgZmxhZ3MgYW5kCi0gICAgICogY29udmVyc2lvbiBzcGVjaWZpZWQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZmxhZ3MgYW5kIGNvbnZlcnNpb24gc3BlY2lmaWVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmCi0gICAgICogICAgICAgICAgICBUaGUgZmxhZ3MKKyAgICAgKiAgICAgICAgICAgdGhlIGZsYWdzLgogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICBUaGUgY29udmVyc2lvbgorICAgICAqICAgICAgICAgICB0aGUgY29udmVyc2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24oU3RyaW5nIGYsIGNoYXIgYykgewogICAgICAgICBpZiAobnVsbCA9PSBmKSB7CkBAIC01MSwyNSArNTQsMjUgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbmNvbXBhdGlibGUgZm9ybWF0IGZsYWcuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgaW5jb21wYXRpYmxlIGZvcm1hdCBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIGluY29tcGF0aWJsZSBmb3JtYXQgZmxhZy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEZsYWdzKCkgewogICAgICAgICByZXR1cm4gZjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmNvbXBhdGlibGUgQ29udmVyc2lvbi4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmNvbXBhdGlibGUgY29udmVyc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBpbmNvbXBhdGlibGUgQ29udmVyc2lvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmNvbXBhdGlibGUgY29udmVyc2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBnZXRDb252ZXJzaW9uKCkgewogICAgICAgICByZXR1cm4gYzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBvZiB0aGUgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIHtAY29kZSBGb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIEZvcm1hdEZsYWdzQ29udmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoZSB7QGNvZGUgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb259LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0dGFibGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0dGFibGUuamF2YQppbmRleCAwYzY3YWVhLi4yNTY0YzA0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRhYmxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Gb3JtYXR0YWJsZS5qYXZhCkBAIC0xNyw0MCArMTcsNDQgQEAKIHBhY2thZ2UgamF2YS51dGlsOwogCiAvKioKLSAqIEFueSBjbGFzcyB0aGF0IG5lZWQgdG8gcGVyZm9ybSBjdXN0b21lciBmb3JtYXR0aW5nIGJ5IHRyYW5zZmVycmluZyBjb252ZXJ0ZXIKLSAqIHNwZWNpZmllciAncycgdG8gRm9ybWF0dGVyIHNob3VsZCBpbXBsZW1lbnQgdGhlIEZvcm1hdHRhYmxlIGludGVyZmFjZS4gQmFzaWMKLSAqIGZvcm1hdCBpcyBhbGxvd2VkIGJ5IHRoZSBpbnRlcmZhY2UgdG8gZm9ybWF0IGFyYml0cmFyeSBvYmplY3RzLgorICogQ2xhc3NlcyB0aGF0IGhhbmRsZSBjdXN0b20gZm9ybWF0dGluZyBmb3IgdGhlICdzJyBzcGVjaWZpZXIgb2Yge0Bjb2RlIEZvcm1hdHRlcn0KKyAqIHNob3VsZCBpbXBsZW1lbnQgdGhlIHtAY29kZSBGb3JtYXR0YWJsZX0gaW50ZXJmYWNlLiBJdCBnaXZlcyBiYXNpYyBjb250cm9sIG92ZXIKKyAqIGZvcm1hdHRpbmcgb2JqZWN0cy4KKyAqICAKKyAqIEBzZWUgRm9ybWF0dGVyCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogCiBwdWJsaWMgaW50ZXJmYWNlIEZvcm1hdHRhYmxlIHsKIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIG9iamVjdCB1c2luZyB0aGUgc3BlY2lmaWVkIGZvcm1hdHRlci4KKyAgICAgKiBGb3JtYXRzIHRoZSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgRm9ybWF0dGVyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZm9ybWF0dGVyCi0gICAgICogICAgICAgICAgICBUaGUgZm9ybWF0dGVyIHRvIHVzZSBpbiB0aGUgZm9ybWF0VG8uCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gdG8gdXNlLgogICAgICAqIEBwYXJhbSBmbGFncwotICAgICAqICAgICAgICAgICAgVGhlIGZsYWdzIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBmb3JtYXQsIHdoaWNoIGlzIGEgYml0bWFzawotICAgICAqICAgICAgICAgICAgdGhhdCBpcyBhbnkgY29tYmluYXRpb24gb2YgRm9ybWF0dGFibGVGbGFncy5MRUZUX0pVU1RJRlksCi0gICAgICogICAgICAgICAgICBGb3JtYXR0YWJsZUZsYWdzLlVQUEVSQ0FTRSwgYW5kIEZvcm1hdHRhYmxlRmxhZ3MuQUxURVJOQVRFLiBJZgorICAgICAqICAgICAgICAgICAgdGhlIGZsYWdzIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBmb3JtYXQsIHdoaWNoIGlzIGEgYml0bWFzaworICAgICAqICAgICAgICAgICAgdGhhdCBpcyBhbnkgY29tYmluYXRpb24gb2Yge0Bjb2RlIEZvcm1hdHRhYmxlRmxhZ3MuTEVGVF9KVVNUSUZZfSwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBGb3JtYXR0YWJsZUZsYWdzLlVQUEVSQ0FTRX0sIGFuZCB7QGNvZGUgRm9ybWF0dGFibGVGbGFncy5BTFRFUk5BVEV9LiBJZgogICAgICAqICAgICAgICAgICAgbm8gc3VjaCBmbGFnIGlzIHNldCwgdGhlIG91dHB1dCBpcyBmb3JtYXR0ZWQgYnkgdGhlIGRlZmF1bHQKLSAgICAgKiAgICAgICAgICAgIGZvcm1hdHRpbmcgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UuCisgICAgICogICAgICAgICAgICBmb3JtYXR0aW5nIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiBAcGFyYW0gd2lkdGgKLSAgICAgKiAgICAgICAgICAgIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlCi0gICAgICogICAgICAgICAgICBvdXRwdXQuIEFkZGl0aW9uYWwgc3BhY2UgJyAnIGlzIGFkZGVkIHRvIHRoZSBvdXRwdXQgaWYgdGhlCi0gICAgICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHdpZHRoIHVudGlsIHRoZQotICAgICAqICAgICAgICAgICAgbGVuZ3RoIGVxdWFscyB0aGUgd2lkdGguIFRoZXNlIHNwYWNlcyBhcmUgYWRkZWQgYXQgdGhlCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZQorICAgICAqICAgICAgICAgICAgb3V0cHV0LiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgbGVzcyB0aGFuIHtAY29kZSB3aWR0aH0KKyAgICAgKiAgICAgICAgICAgIEFkZGl0aW9uYWwgc3BhY2UgY2hhcmFjdGVycyAoJyAnKSBhcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIGFzIG5lZWRlZCB0byBtYWtlIHVwIHRoZSBkaWZmZXJlbmNlLiBUaGVzZSBzcGFjZXMgYXJlIGFkZGVkIGF0IHRoZQogICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIGJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBmbGFnCiAgICAgICogICAgICAgICAgICBGb3JtYXR0YWJsZUZsYWdzLkxFRlRfSlVTVElGWSBpcyBzZXQsIHdoaWNoIGRlbm90ZXMgdGhhdAotICAgICAqICAgICAgICAgICAgcGFkZGluZyBzaG91bGQgYmUgYWRkZWQgYXQgdGhlIGVuZC4gSWYgd2lkdGggaXMgLTEsIHRoZW4gbm8KLSAgICAgKiAgICAgICAgICAgIG1pbmltdW0gcmVxdWlyZW1lbnQuCisgICAgICogICAgICAgICAgICBwYWRkaW5nIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgZW5kLiBJZiB3aWR0aCBpcyAtMSwgdGhlbgorICAgICAqICAgICAgICAgICAgbWluaW11bSBsZW5ndGggaXMgbm90IGVuZm9yY2VkLgogICAgICAqIEBwYXJhbSBwcmVjaXNpb24KLSAgICAgKiAgICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlCi0gICAgICogICAgICAgICAgICBvdXRwdXQuIFRoZSBwcm9jZWR1cmUgdG8gdHJ1bmsgdGhlIG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICogICAgICAgICAgICBwcmVjaXNpb24gaXMgaW52b2tlZCBiZWZvcmUgdGhhdCBvZiBwYWRkaW5nIHRvIHdpZHRoLiBJZiB0aGUKLSAgICAgKiAgICAgICAgICAgIHByZWNpc2lvbiBpcyAtMSwgdGhlbiBubyBtYXhpbXVtIHJlcXVpcmVtZW50LgorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIG91dHB1dC4gVGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGlzIHRyaW1tZWQgZG93biB0byB0aGlzIHNpemUKKyAgICAgKiAgICAgICAgICAgIGJlZm9yZSB0aGUgd2lkdGggcGFkZGluZyBpcyBhcHBsaWVkLiBJZiB0aGUgcHJlY2lzaW9uCisgICAgICogICAgICAgICAgICBpcyAtMSwgdGhlbiBtYXhpbXVtIGxlbmd0aCBpcyBub3QgZW5mb3JjZWQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgdm9pZCBmb3JtYXRUbyhGb3JtYXR0ZXIgZm9ybWF0dGVyLCBpbnQgZmxhZ3MsIGludCB3aWR0aCwgaW50IHByZWNpc2lvbikKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Gb3JtYXR0YWJsZUZsYWdzLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRhYmxlRmxhZ3MuamF2YQppbmRleCBlNzdjMDE0Li5iNTA3OGU0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRhYmxlRmxhZ3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRhYmxlRmxhZ3MuamF2YQpAQCAtMTYsNDEgKzE2LDUwIEBACiBwYWNrYWdlIGphdmEudXRpbDsKIAogLyoqCi0gKiBGb3JtYXR0YWJsZUZsYWdzIGFyZSB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIG1ldGhvZCBGb3JtYXR0YWJsZS5mb3JtYXRUbygpIGFuZAotICogaW5zdHJ1Y3QgdGhlIG91dHB1dCBmb3JtYXQgaW4gRm9ybWF0dGFibGVzLiBUaGUgdmFsaWRhdGlvbiBhbmQgaW50ZXJwcmV0YXRpb24KLSAqIGFyZSBmdWxmaWxsZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIEZvcm1hdHRhYmxlLgorICogRm9ybWF0dGFibGVGbGFncyBhcmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0bworICoge0BsaW5rIEZvcm1hdHRhYmxlI2Zvcm1hdFRvKEZvcm1hdHRlciwgaW50LCBpbnQsIGludCl9IGFuZCBjaGFuZ2UgdGhlIG91dHB1dAorICogZm9ybWF0IGluIHtAY29kZSBGb3JtYXR0YWJsZX1zLiBUaGUgdmFsaWRhdGlvbiBhbmQgaW50ZXJwcmV0YXRpb24gb2YgdGhlCisgKiBmbGFncyBtdXN0IGJlIGRvbmUgYnkgdGhlIGltcGxlbWVudGF0aW9ucy4KKyAqICAKKyAqIEBzZWUgRm9ybWF0dGFibGUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBGb3JtYXR0YWJsZUZsYWdzIHsKICAgICAKICAgICBwcml2YXRlIEZvcm1hdHRhYmxlRmxhZ3MoKXsKLSAgICAgICAgLy9wcmV2ZW50IHRoaXMgY2xhc3MgdG8gYmUgaW5zdGFudGlhbGl6ZWQKKyAgICAgICAgLy9wcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogRGVub3RlcyB0aGUgb3V0cHV0IHRvIGJlIGxlZnQtanVzdGlmaWVkLiBJbiBvcmRlciB0byBmaWxsIHRoZSBtaW5pbXVtCisgICAgICogRGVub3RlcyB0aGUgb3V0cHV0IGlzIHRvIGJlIGxlZnQtanVzdGlmaWVkLiBJbiBvcmRlciB0byBmaWxsIHRoZSBtaW5pbXVtCiAgICAgICogd2lkdGggcmVxdWlyZW1lbnQsIHNwYWNlcygnXHUwMDIwJykgd2lsbCBiZSBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICAqIHNwZWNpZmllZCBvdXRwdXQgZWxlbWVudC4gSWYgbm8gc3VjaCBmbGFnIGlzIHNldCwgdGhlIG91dHB1dCBpcwogICAgICAqIHJpZ2h0LWp1c3RpZmllZC4KICAgICAgKiAKICAgICAgKiBUaGUgZmxhZyBjb3JyZXNwb25kcyB0byAnLScgKCdcdTAwMmQnKSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX0pVU1RJRlkgPSAxOwogCiAgICAgLyoqCi0gICAgICogRGVub3RlcyB0aGUgb3V0cHV0IHRvIGJlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlIGluIHRoZSB3YXkgdGhlIGxvY2FsZQorICAgICAqIERlbm90ZXMgdGhlIG91dHB1dCBpcyB0byBiZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBpbiB0aGUgd2F5IHRoZSBsb2NhbGUKICAgICAgKiBwYXJhbWV0ZXIgb2YgRm9ybWF0dGVyLmZvcm1hdFRvKCkgcmVxdWlyZXMuIFRoZSBvdXRwdXQgaGFzIHRoZSBzYW1lCi0gICAgICogZWZmZWN0IGFzIFN0cmluZy50b1VwcGVyQ2FzZShqYXZhLnV0aWwuTG9jYWxlKS4KKyAgICAgKiBlZmZlY3QgYXMge0Bjb2RlIFN0cmluZy50b1VwcGVyQ2FzZShqYXZhLnV0aWwuTG9jYWxlKX0uCiAgICAgICogCi0gICAgICogVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvICdeJyAoJ1x1MDA1ZScpIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVyLgorICAgICAqIFRoaXMgZmxhZyBjb3JyZXNwb25kcyB0byB7QGNvZGUgJ14nICgnXHUwMDVlJyl9IGluIHRoZSBmb3JtYXQgc3BlY2lmaWVyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQUEVSQ0FTRSA9IDI7CiAKICAgICAvKioKLSAgICAgKiBEZW5vdGVzIHRoZSBvdXRwdXQgdG8gYmUgZm9ybWF0dGVkIGluIGFuIGFsdGVybmF0ZSBmb3JtLiBUaGUgZGVmaW5pdGlvbgotICAgICAqIG9mIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyBnaXZlbiBvdXQgYnkgRm9ybWF0dGFibGUuCisgICAgICogRGVub3RlcyB0aGUgb3V0cHV0IGlzIHRvIGJlIGZvcm1hdHRlZCBpbiBhbiBhbHRlcm5hdGUgZm9ybS4gVGhlIGRlZmluaXRpb24KKyAgICAgKiBvZiB0aGUgYWx0ZXJuYXRlIGZvcm0gaXMgZGV0ZXJtaW5lZCBieSB0aGUge0Bjb2RlIEZvcm1hdHRhYmxlfS4KICAgICAgKiAKLSAgICAgKiBUaGlzIGZsYWcgY29ycmVzcG9uZHMgdG8gJyMnICgnXHUwMDIzJykgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZXIuCisgICAgICogVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvIHtAY29kZSAnIycgKCdcdTAwMjMnKX0gaW4gdGhlIGZvcm1hdCBzcGVjaWZpZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxURVJOQVRFID0gNDsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0dGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRlci5qYXZhCmluZGV4IGRkMzUyYWMuLmE2ZjE0ZjAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0dGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Gb3JtYXR0ZXIuamF2YQpAQCAtNDIsMjQgKzQyLDI0IEBACiAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKIC8qKgotICogPHA+VGhlIEZvcm1hdHRlciBjbGFzcyBpcyBhIFN0cmluZy1mb3JtYXR0aW5nIHV0aWxpdHkgdGhhdCBpcyBkZXNpZ25lZAotICogdG8gd29yayBsaWtlIHRoZSA8Y29kZT5wcmludGY8L2NvZGU+IGZ1bmN0aW9uIG9mIHRoZSBDIHByb2dyYW1taW5nIGxhbmd1YWdlLiAKLSAqIEl0cyBrZXkgbWV0aG9kcyBhcmUgdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gbWV0aG9kcyB3aGljaCBjcmVhdGUgYSBmb3JtYXR0ZWQKLSAqIFN0cmluZyBieSByZXBsYWNpbmcgYSBzZXQgb2YgcGxhY2Vob2xkZXJzIChmb3JtYXQgdG9rZW5zKSB3aXRoIGZvcm1hdHRlZCAKKyAqIDxwPlRoZSB7QGNvZGUgRm9ybWF0dGVyfSBjbGFzcyBpcyBhIFN0cmluZy1mb3JtYXR0aW5nIHV0aWxpdHkgdGhhdCBpcyBkZXNpZ25lZAorICogdG8gd29yayBsaWtlIHRoZSB7QGNvZGUgcHJpbnRmfSBmdW5jdGlvbiBvZiB0aGUgQyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gCisgKiBJdHMga2V5IG1ldGhvZHMgYXJlIHRoZSB7QGNvZGUgZm9ybWF0fSBtZXRob2RzIHdoaWNoIGNyZWF0ZSBhIGZvcm1hdHRlZAorICoge0Bjb2RlIFN0cmluZ30gYnkgcmVwbGFjaW5nIGEgc2V0IG9mIHBsYWNlaG9sZGVycyAoZm9ybWF0IHRva2Vucykgd2l0aCBmb3JtYXR0ZWQgCiAgKiB2YWx1ZXMuIFRoZSBzdHlsZSB1c2VkIHRvIGZvcm1hdCBlYWNoIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGZvcm1hdAogICogdG9rZW4gdXNlZC4gIEZvciBleGFtcGxlLCB0aGUgY2FsbDxici8+Ci0gKiA8Y29kZT5mb3JtYXQoIk15IGRlY2ltYWwgdmFsdWUgaXMgJWQgYW5kIG15IFN0cmluZyBpcyAlcy4iLCAzLCAiSGVsbG8iKTs8L2NvZGU+PGJyLz4KLSAqIHJldHVybnMgdGhlIFN0cmluZzxici8+Ci0gKiA8Y29kZT5NeSBkZWNpbWFsIHZhbHVlIGlzIDMgYW5kIG15IFN0cmluZyBpcyBIZWxsby48L2NvZGU+PC9wPgorICoge0Bjb2RlIGZvcm1hdCgiTXkgZGVjaW1hbCB2YWx1ZSBpcyAlZCBhbmQgbXkgU3RyaW5nIGlzICVzLiIsIDMsICJIZWxsbyIpO308YnIvPgorICogcmV0dXJucyB0aGUge0Bjb2RlIFN0cmluZ308YnIvPgorICoge0Bjb2RlIE15IGRlY2ltYWwgdmFsdWUgaXMgMyBhbmQgbXkgU3RyaW5nIGlzIEhlbGxvLn08L3A+CiAgKiAKICAqPHA+VGhlIGZvcm1hdCB0b2tlbiBjb25zaXN0cyBvZiBhIHBlcmNlbnQgc2lnbiwgb3B0aW9uYWxseSBmb2xsb3dlZCAKICAqIGJ5IGZsYWdzIGFuZCBwcmVjaXNpb24gYXJndW1lbnRzLCBhbmQgdGhlbiBhIHNpbmdsZSBjaGFyYWN0ZXIgdGhhdCAKICAqIGluZGljYXRlcyB0aGUgdHlwZSBvZiB2YWx1ZQogICogYmVpbmcgZm9ybWF0dGVkLiAgSWYgdGhlIHR5cGUgaXMgYSB0aW1lL2RhdGUsIHRoZW4gdGhlIHR5cGUgY2hhcmFjdGVyCi0gKiA8Y29kZT50PC9jb2RlPiBpcyBmb2xsb3dlZCBieSBhbiBhZGRpdGlvbmFsIGNoYXJhY3RlciB0aGF0IGluZGljYXRlcyBob3cgdGhlIAotICogZGF0ZSBpcyB0byBiZSBmb3JtYXR0ZWQuIFRoZSB0d28gY2hhcmFjdGVycyA8Y29kZT48JDwvY29kZT4gaW1tZWRpYXRlbHkgCisgKiB7QGNvZGUgdH0gaXMgZm9sbG93ZWQgYnkgYW4gYWRkaXRpb25hbCBjaGFyYWN0ZXIgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSAKKyAqIGRhdGUgaXMgdG8gYmUgZm9ybWF0dGVkLiBUaGUgdHdvIGNoYXJhY3RlcnMge0Bjb2RlIDwkfSBpbW1lZGlhdGVseSAKICAqIGZvbGxvd2luZyB0aGUgJSBzaWduIGluZGljYXRlIHRoYXQgdGhlIHByZXZpb3VzIHZhbHVlIHNob3VsZCBiZSB1c2VkIGFnYWluCi0gKiBpbnN0ZWFkIG9mIG1vdmluZyBvbiB0byB0aGUgbmV4dCB2YWx1ZSBhcmd1bWVudC4gQSBudW1iZXIgPGNvZGU+bjwvY29kZT4KKyAqIGluc3RlYWQgb2YgbW92aW5nIG9uIHRvIHRoZSBuZXh0IHZhbHVlIGFyZ3VtZW50LiBBIG51bWJlciB7QGNvZGUgbn0KICAqIGFuZCBhIGRvbGxhciBzaWduIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgJSBzaWduIG1ha2UgbiB0aGUgbmV4dCBhcmd1bWVudAogICogdG8gYmUgdXNlZC48L3A+ICAKICAqIApAQCAtNzEsMjggKzcxLDI4IEBACiAgKiA8Qj5UZXh0IHZhbHVlIHR5cGVzPC9CPjwvVEQ+CiAgKiA8L3RyPgogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+czwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBzfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlN0cmluZzwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJXMsICVzIiwgImhlbGxvIiwgIkhlbGxvIik7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmhlbGxvLCBIZWxsbzwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIlcywgJXMiLCAiaGVsbG8iLCAiSGVsbG8iKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGhlbGxvLCBIZWxsb308L3RkPiAKICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPlM8L2NvZGU+LCA8Y29kZT5zPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIFN9LCB7QGNvZGUgc308L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5TdHJpbmcgdG8gY2FwaXRhbHM8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiVTLCAlUyIsICJoZWxsbyIsICJIZWxsbyIpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5IRUxMTywgSEVMTE88L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJVMsICVTIiwgImhlbGxvIiwgIkhlbGxvIik7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBIRUxMTywgSEVMTE99PC90ZD4gCiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5jPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIGN9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+Q2hhcmFjdGVyPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIlYywgJWMiLCAnZCcsIDB4NjUpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5kLCBlPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJWMsICVjIiwgJ2QnLCAweDY1KTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGQsIGV9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPkM8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgQ308L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5DaGFyYWN0ZXIgdG8gY2FwaXRhbHM8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiVDLCAlQyIsICdkJywgMHg2NSk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPkQsIEU8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIlQywgJUMiLCAnZCcsIDB4NjUpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgRCwgRX08L3RkPgogICogPC90cj4gIAogICogPHRyIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+CiAgKiA8VEQgQ09MU1BBTj00PgpAQCAtMTAxLDMyICsxMDEsMzIgQEAKICAqIGNoYXJhY3RlcnMgb2YgdGhlIGZvcm1hdHRlZCB2YWx1ZSAgPC9URD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT4tPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIC19PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+TGVmdCBqdXN0aWZ5ICh3aWR0aCB2YWx1ZSBpcyByZXF1aXJlZCk8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiUtM0MsICUzQyIsICdkJywgMHg2NSk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPkQgICwgICBFPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJS0zQywgJTNDIiwgJ2QnLCAweDY1KTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIEQgICwgICBFfTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KICAqIDxURCBDT0xTUEFOPTQ+CiAgKiA8Qj5JbnRlZ2VyIHR5cGVzPC9CPjwvVEQ+CiAgKiA8L3RyPgogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+ZDwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBkfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPmludCwgZm9ybWF0dGVkIGFzIGRlY2ltYWw8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiVkLCAlZCIxJCwgMzUsIDB4MTApOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4zNSwgMTY8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIlZCwgJWQiMSQsIDM1LCAweDEwKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDM1LCAxNn08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+bzwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBvfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPmludCwgZm9ybWF0dGVkIGFzIG9jdGFsPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIlbywgJW8iLCA4LCAwMTApOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4xMCwgMTA8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIlbywgJW8iLCA4LCAwMTApO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMTAsIDEwfTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5YPC9jb2RlPiwgPGNvZGU+eDwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBYfSwge0Bjb2RlIHh9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+aW50LCBmb3JtYXR0ZWQgYXMgaGV4aWRlY2ltYWw8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiV4LCAlWCIsIDEwLCAxMCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmEsIEE8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIleCwgJVgiLCAxMCwgMTApO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgYSwgQX08L3RkPgogICogPC90cj4gIAogICogPHRyIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+CiAgKiA8VEQgQ09MU1BBTj00PgpAQCAtMTM1LDQyICsxMzUsNDIgQEAKICAqIGNoYXJhY3RlcnMgb2YgdGhlIGZvcm1hdHRlZCB2YWx1ZSAgPC9URD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT4rPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlICt9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+bGVhZCB3aXRoIHRoZSBudW1iZXIncyBzaWduPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIlK2QsICUrNGQiLCA1LCA1KTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+KzUsICAgKzU8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIlK2QsICUrNGQiLCA1LCA1KTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlICs1LCAgICs1fTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT4tPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIC19PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+TGVmdCBqdXN0aWZ5ICh3aWR0aCB2YWx1ZSBpcyByZXF1aXJlZCk8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiUtNmR4IiwgNSk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjUgICAgICB4PC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJS02ZHgiLCA1KTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDUgICAgICB4fTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT4jPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlICN9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+UHJpbnQgdGhlIGxlYWRpbmcgY2hhcmFjdGVycyB0aGF0IGluZGljYXRlIAogICogaGV4aWRlY2ltYWwgb3Igb2N0YWwgKGZvciB1c2Ugb25seSB3aXRoIGhleCBhbmQgb2N0YWwgdHlwZXMpIDwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJSNvIiwgMDEwKTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+MDEwPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJSNvIiwgMDEwKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDAxMH08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+IDwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSAgfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPkEgc3BhY2UgaW5kaWNhdGVzIHRoYXQgbm9uLW5lZ2F0aXZlIG51bWJlcnMgCiAgKiBzaG91bGQgaGF2ZSBhIGxlYWRpbmcgc3BhY2UuIDwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgieCUgZCUgNWQiLCA0LCA0KTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+eCA0ICAgIDQ8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCJ4JSBkJSA1ZCIsIDQsIDQpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgeCA0ICAgIDR9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPjA8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgMH08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5QYWQgdGhlIG51bWJlciB3aXRoIGxlYWRpbmcgemVyb3MgKHdpZHRoIHZhbHVlIGlzIHJlcXVpcmVkKTwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJTA3ZCwgJTAzZCIsIDQsIDU1NTUpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4wMDAwMDA0LCA1NTU1PC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJTA3ZCwgJTAzZCIsIDQsIDU1NTUpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMDAwMDAwNCwgNTU1NX08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+KDwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSAofTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlB1dCBwYXJlbnRoZXNlcyBhcm91bmQgbmVnYXRpdmUgbnVtYmVycyAoZGVjaW1hbCBvbmx5KTwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJShkLCAlKGQsICUoNmQiLCAxMiwgLTEyLCAtMTIpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4xMiwgKDEyKSwgICAoMTIpPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJShkLCAlKGQsICUoNmQiLCAxMiwgLTEyLCAtMTIpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMTIsICgxMiksICAgKDEyKX08L3RkPgogICogPC90cj4gIAogICogPHRyIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+CiAgKiA8VEQgQ09MU1BBTj00PgpAQCAtMTgwLDMyICsxODAsMzIgQEAKICAqIGdpdmVzIHRoZSBwcmVjaXNpb24gKDYgYnkgZGVmYXVsdCkuPC9URD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5mPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIGZ9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+ZmxvYXQgKG9yIGRvdWJsZSkgZm9ybWF0dGVkIGFzIGEgZGVjaW1hbCwgd2hlcmUgCiAgKiB0aGUgcHJlY2lzaW9uIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiVmICU8LjFmICU8MS41ZiAlPDEwZiAlPDYuMGYiLCAxMjMuNDU2Zik7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjEyMy40NTYwMDEgMTIzLjUgMTIzLjQ1NjAwIDEyMy40NTYwMDEgICAgMTIzPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJWYgJTwuMWYgJTwxLjVmICU8MTBmICU8Ni4wZiIsIDEyMy40NTZmKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDEyMy40NTYwMDEgMTIzLjUgMTIzLjQ1NjAwIDEyMy40NTYwMDEgICAgMTIzfTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5FPC9jb2RlPiwgPGNvZGU+ZTwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBFfSwge0Bjb2RlIGV9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+ZmxvYXQgKG9yIGRvdWJsZSkgZm9ybWF0dGVkIGluIGRlY2ltYWwgZXhwb25lbnRpYWwKICAqIG5vdGF0aW9uLCB3aGVyZSB0aGUgcHJlY2lzaW9uIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cy48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiVFICU8LjFlICU8MS41RSAlPDEwRSAlPDYuMEUiLCAxMjMuNDU2Zik7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjEuMjM0NTYwRSswMiAxLjJlKzAyIDEuMjM0NTZFKzAyIDEuMjM0NTYwRSswMiAgMUUrMDI8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIlRSAlPC4xZSAlPDEuNUUgJTwxMEUgJTw2LjBFIiwgMTIzLjQ1NmYpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMS4yMzQ1NjBFKzAyIDEuMmUrMDIgMS4yMzQ1NkUrMDIgMS4yMzQ1NjBFKzAyICAxRSswMn08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+RzwvY29kZT4sIDxjb2RlPmc8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgR30sIHtAY29kZSBnfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPmZsb2F0IChvciBkb3VibGUpIGZvcm1hdHRlZCBpbiBkZWNpbWFsIGV4cG9uZW50aWFsCiAgKiBub3RhdGlvbiAsIHdoZXJlIHRoZSBwcmVjaXNpb24gaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMuPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIlRyAlPC4xZyAlPDEuNUcgJTwxMEcgJTw2LjBHIiwgMTIzLjQ1NmYpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4xMjMuNDU2IDFlKzAyIDEyMy40NiAgICAxMjMuNDU2ICAxRSswMjwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQoIiVHICU8LjFnICU8MS41RyAlPDEwRyAlPDYuMEciLCAxMjMuNDU2Zik7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSAxMjMuNDU2IDFlKzAyIDEyMy40NiAgICAxMjMuNDU2ICAxRSswMn08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+QTwvY29kZT4sIDxjb2RlPmE8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgQX0sIHtAY29kZSBhfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPmZsb2F0IChvciBkb3VibGUpIGZvcm1hdHRlZCBhcyBhIGhleGlkZWNpbWFsIGluIGV4cG9uZW50aWFsCiAgKiBub3RhdGlvbiwgd2hlcmUgdGhlIHByZWNpc2lvbiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMuPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIlQSAlPC4xYSAlPDEuNUEgJTwxMEEgJTw2LjBBIiwgMTIzLjQ1NmYpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4wWDEuRUREMkYyUDYgMHgxLmZwNiAwWDEuRUREMkZQNiAwWDEuRUREMkYyUDYgMFgxLkZQNjwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQoIiVBICU8LjFhICU8MS41QSAlPDEwQSAlPDYuMEEiLCAxMjMuNDU2Zik7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSAwWDEuRUREMkYyUDYgMHgxLmZwNiAwWDEuRUREMkZQNiAwWDEuRUREMkYyUDYgMFgxLkZQNn08L3RkPgogICogPC90cj4gIAogICogPHRyIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+CiAgKiA8VEQgQ09MU1BBTj00PgpAQCAtMjE0LDE4MiArMjE0LDE5NSBAQAogICogc2FtZSBhcyBmb3IgaW50ZWdlciB0eXBlcyB3aXRoIG9uZSBhZGRpdGlvbjogPC9URD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT4sPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlICx9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+VXNlIGEgY29tbWEgaW4gcGxhY2Ugb2YgYSBkZWNpbWFsIGlmIHRoZSBsb2NhbGUKICAqIHJlcXVpcmVzIGl0LiA8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQobmV3IExvY2FsZSgiZnIiKSwgIiUsNy4yZiIsIDYuMDNmKTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+ICAgNiwwMzwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQobmV3IExvY2FsZSgiZnIiKSwgIiUsNy4yZiIsIDYuMDNmKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlICAgIDYsMDN9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0ciBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgogICogPFREIENPTFNQQU49ND4KICAqIDxCPkRhdGUgdHlwZXM8L0I+PC9URD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT50PC9jb2RlPiwgPGNvZGU+VDwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSB0fSwge0Bjb2RlIFR9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+RGF0ZTwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdChuZXcgTG9jYWxlKCJmciIpLCAiJXRCICVUQiIsIENhbGVuZGFyLmdldEluc3RhbmNlKCksIENhbGVuZGFyLmdldEluc3RhbmNlKCkpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5hdnJpbCBBVlJJTDwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQobmV3IExvY2FsZSgiZnIiKSwgIiV0QiAlVEIiLCBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLCBDYWxlbmRhci5nZXRJbnN0YW5jZSgpKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGF2cmlsIEFWUklMfTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KICAqIDxURCBDT0xTUEFOPTQ+CiAgKiA8Qj5EYXRlIGZvcm1hdCBwcmVjaXNpb25zPC9CPjxici8+VGhlIGZvcm1hdCBwcmVjaXNpb24gY2hhcmFjdGVyIAotICogZm9sbG93cyB0aGUgPGNvZGU+dDwvY29kZT4uIDwvVEQ+CisgKiBmb2xsb3dzIHRoZSB7QGNvZGUgdH0uIDwvVEQ+CiAgKiA8L3RyPgogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+QTwvY29kZT4sIDxjb2RlPmE8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgQX0sIHtAY29kZSBhfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlRoZSBkYXkgb2YgdGhlIHdlZWs8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiV0YSAldEEiLCBjYWwsIGNhbCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPlR1ZSBUdWVzZGF5PC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJXRhICV0QSIsIGNhbCwgY2FsKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIFR1ZSBUdWVzZGF5fTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5iPC9jb2RlPiwgPGNvZGU+QjwvY29kZT4sIDxjb2RlPmg8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgYn0sIHtAY29kZSBCfSwge0Bjb2RlIGh9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+VGhlIG5hbWUgb2YgdGhlIG1vbnRoPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIldGIgJTx0QiAlPHRoIiwgY2FsLCBjYWwsIGNhbCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPkFwciBBcHJpbCBBcHI8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldGIgJTx0QiAlPHRoIiwgY2FsLCBjYWwsIGNhbCk7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBBcHIgQXByaWwgQXByfTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5DPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIEN9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+VGhlIGNlbnR1cnk8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiV0Q1xuIiwgY2FsKTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+MjA8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldENcbiIsIGNhbCk7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSAyMH08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+ZDwvY29kZT4sIDxjb2RlPmU8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgZH0sIHtAY29kZSBlfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlRoZSBkYXkgb2YgdGhlIG1vbnRoICh3aXRoIG9yIHdpdGhvdXQgbGVhZGluZyB6ZXJvcyk8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiV0ZCAldGUiLCBjYWwsIGNhbCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjAxIDE8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldGQgJXRlIiwgY2FsLCBjYWwpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMDEgMX08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+RjwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBGfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlRoZSBjb21wbGV0ZSBkYXRlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLUREPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIldEYiLCBjYWwpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4yMDA4LTA0LTAxPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJXRGIiwgY2FsKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDIwMDgtMDQtMDF9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPkQ8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgRH08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5UaGUgY29tcGxldGUgZGF0ZSBmb3JtYXR0ZWQgYXMgTU0vREQvWVkgCiAgKiAobm90IGNvcnJlY3RlZCBmb3IgbG9jYWxlKSA8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQobmV3IExvY2FsZSgiZW5fVVMiKSwgIiV0RCIsIGNhbCk7PGJyLz5mb3JtYXQobmV3IExvY2FsZSgiZW5fVUsiKSwgIiAldEQiLCBjYWwpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4wNC8wMS8wOCAwNC8wMS8wODwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQobmV3IExvY2FsZSgiZW5fVVMiKSwgIiV0RCIsIGNhbCk7PGJyLz5mb3JtYXQobmV3IExvY2FsZSgiZW5fVUsiKSwgIiAldEQiLCBjYWwpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMDQvMDEvMDggMDQvMDEvMDh9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPmo8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgan08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5UaGUgbnVtYmVyIG9mIHRoZSBkYXkgKGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgeWVhcikuPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIldGpcbiIsIGNhbCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjA5MjwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQoIiV0alxuIiwgY2FsKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDA5Mn08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+bTwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBtfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlRoZSBudW1iZXIgb2YgdGhlIG1vbnRoPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIldG1cbiIsIGNhbCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjA0PC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJXRtXG4iLCBjYWwpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMDR9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPnk8L2NvZGU+LCA8Y29kZT5ZPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIHl9LCB7QGNvZGUgWX08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5UaGUgeWVhcjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJXR5ICV0WSIsIGNhbCwgY2FsKTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+MDggMjAwODwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQoIiV0eSAldFkiLCBjYWwsIGNhbCk7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSAwOCAyMDA4fTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5IPC9jb2RlPiwgPGNvZGU+STwvY29kZT4sIDxjb2RlPms8L2NvZGU+LCA8Y29kZT5sPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIEh9LCB7QGNvZGUgSX0sIHtAY29kZSBrfSwge0Bjb2RlIGx9PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+VGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMTIgb3IgMjQgaG91ciBmb3JtYXQsIHdpdGggb3IKICAqIHdpdGhvdXQgYSBsZWFkaW5nIHplcm88L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiV0SCAldEkgJXRrICV0bCIsIGNhbCwgY2FsLCBjYWwsIGNhbCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjE2IDA0IDE2IDQ8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldEggJXRJICV0ayAldGwiLCBjYWwsIGNhbCwgY2FsLCBjYWwpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMTYgMDQgMTYgNH08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+cDwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBwfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPmEubS4gb3IgcC5tLjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJXRwICVUcCIsIGNhbCwgY2FsKTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+cG0gUE08L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldHAgJVRwIiwgY2FsLCBjYWwpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgcG0gUE19PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPk08L2NvZGU+LCA8Y29kZT5TPC9jb2RlPiwgPGNvZGU+TDwvY29kZT4sIDxjb2RlPk48L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgTX0sIHtAY29kZSBTfSwge0Bjb2RlIEx9LCB7QGNvZGUgTn08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5UaGUgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzLCBhbmQgbmFub3NlY29uZHM8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoIiV0TSAldFMgJXRMICV0TiIsIGNhbCwgY2FsLCBjYWwsIGNhbCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjA4IDE3IDM1OSAzNTkwMDAwMDA8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldE0gJXRTICV0TCAldE4iLCBjYWwsIGNhbCwgY2FsLCBjYWwpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMDggMTcgMzU5IDM1OTAwMDAwMH08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+WjwvY29kZT4sIDxjb2RlPno8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgWn0sIHtAY29kZSB6fTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlRoZSB0aW1lIHpvbmU6IGl0cyBhYmJyZXZpYXRpb24gb3Igb2Zmc2V0IGZyb20gR01UPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIldFogJXR6IiwgY2FsLCBjYWwpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5DRVNUICswMTAwPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJXRaICV0eiIsIGNhbCwgY2FsKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIENFU1QgKzAxMDB9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPlI8L2NvZGU+LCA8Y29kZT5yPC9jb2RlPiwgPGNvZGU+VDwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBSfSwge0Bjb2RlIHJ9LCB7QGNvZGUgVH08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5UaGUgY29tcGxldGUgdGltZTwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJXRSICV0ciAldFQiLCBjYWwsIGNhbCwgY2FsKTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+MTY6MTUgMDQ6MTU6MzIgUE0gMTY6MTU6MzI8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldFIgJXRyICV0VCIsIGNhbCwgY2FsLCBjYWwpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgMTY6MTUgMDQ6MTU6MzIgUE0gMTY6MTU6MzJ9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPnM8L2NvZGU+LCA8Y29kZT5RPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIHN9LCB7QGNvZGUgUX08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5UaGUgbnVtYmVyIG9mIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIGZyb20gInRoZSBlcG9jaCIKICAqICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpIDwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJXRzICV0USIsIGNhbCwgY2FsKTs8L2NvZGU+PC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+MTIwNzA1OTQxMiAxMjA3MDU5NDEyNjU2PC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJXRzICV0USIsIGNhbCwgY2FsKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDEyMDcwNTk0MTIgMTIwNzA1OTQxMjY1Nn08L3RkPgogICogPC90cj4gIAogICogPHRyPgotICogPHRkIHdpZHRoPSI1JSI+PGNvZGU+YzwvY29kZT48L3RkPiAKKyAqIDx0ZCB3aWR0aD0iNSUiPntAY29kZSBjfTwvdGQ+IAogICogPHRkIHdpZHRoPSIxMCUiPlRoZSBjb21wbGV0ZSB0aW1lIGFuZCBkYXRlPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIldGMiLCBjYWwpOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5UdWUgQXByIDAxIDE2OjE5OjE3IENFU1QgMjAwODwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQoIiV0YyIsIGNhbCk7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBUdWUgQXByIDAxIDE2OjE5OjE3IENFU1QgMjAwOH08L3RkPgogICogPC90cj4gIAogICogPHRyIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+CiAgKiA8VEQgQ09MU1BBTj00PgogICogPEI+T3RoZXIgZGF0YSB0eXBlczwvQj48L1REPgogICogPC90cj4KICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPkI8L2NvZGU+LCA8Y29kZT5iPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIEJ9LCB7QGNvZGUgYn08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5Cb29sZWFuPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIlYiwgJUIiLCB0cnVlLCBmYWxzZSk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPnRydWUsIEZBTFNFPC9jb2RlPjwvdGQ+CisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIGZvcm1hdCgiJWIsICVCIiwgdHJ1ZSwgZmFsc2UpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgdHJ1ZSwgRkFMU0V9PC90ZD4KICAqIDwvdHI+ICAKICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPkg8L2NvZGU+LCA8Y29kZT5oPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIEh9LCB7QGNvZGUgaH08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5IYXNoY29kZTwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZvcm1hdCgiJWgsICVIIiwgb2JqLCBvYmopOzwvY29kZT48L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT4xOTBkMTEsIDE5MEQxMTwvY29kZT48L3RkPgorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBmb3JtYXQoIiVoLCAlSCIsIG9iaiwgb2JqKTt9PC90ZD4gCisgKiA8dGQgd2lkdGg9IjMwJSI+e0Bjb2RlIDE5MGQxMSwgMTkwRDExfTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8dHI+Ci0gKiA8dGQgd2lkdGg9IjUlIj48Y29kZT5uPC9jb2RlPjwvdGQ+IAorICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIG59PC90ZD4gCiAgKiA8dGQgd2lkdGg9IjEwJSI+bGluZSBzZXBhcmF0b3I8L3RkPiAKLSAqIDx0ZCB3aWR0aD0iMzAlIj48Y29kZT5mb3JtYXQoImZpcnN0JW5zZWNvbmQiLCAiPz8/Iik7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPmZpcnN0PGJyLz5zZWNvbmQ8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCJmaXJzdCVuc2Vjb25kIiwgIj8/PyIpO308L3RkPiAKKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZmlyc3Q8YnIvPnNlY29uZH08L3RkPgogICogPC90cj4gIAogICogPHRyIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+CiAgKiA8VEQgQ09MU1BBTj00PgogICogPEI+RXNjYXBlIHNlcXVlbmNlczwvQj48L1REPgogICogPC90cj4KICAqIDx0cj4KLSAqIDx0ZCB3aWR0aD0iNSUiPjxjb2RlPiU8L2NvZGU+PC90ZD4gCisgKiA8dGQgd2lkdGg9IjUlIj57QGNvZGUgJX08L3RkPiAKICAqIDx0ZCB3aWR0aD0iMTAlIj5Fc2NhcGUgdGhlICUgY2hhcmFjdGVyPC90ZD4gCi0gKiA8dGQgd2lkdGg9IjMwJSI+PGNvZGU+Zm9ybWF0KCIlZCUlLCAlZCIsIDUwLCA2MCk7PC9jb2RlPjwvdGQ+IAotICogPHRkIHdpZHRoPSIzMCUiPjxjb2RlPjUwJSwgNjA8L2NvZGU+PC90ZD4KKyAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIlZCUlLCAlZCIsIDUwLCA2MCk7fTwvdGQ+IAorICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSA1MCUsIDYwfTwvdGQ+CiAgKiA8L3RyPiAgCiAgKiA8L3RhYmxlPiAgIAogICogCiAgKiA8cD5BbiBpbnN0YW5jZSBvZiBGb3JtYXR0ZXIgY2FuIGJlIGNyZWF0ZWQgdG8gd3JpdGUgdGhlIGZvcm1hdHRlZAogICogb3V0cHV0IHRvIHN0YW5kYXJkIHR5cGVzIG9mIG91dHB1dCBzdHJlYW1zLiAgSXRzIGZ1bmN0aW9uYWxpdHkgY2FuIAogICogYWxzbyBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBmb3JtYXQgbWV0aG9kcyBvZiBhbiBvdXRwdXQgc3RyZWFtIAotICogb3Igb2YgU3RyaW5nOjxici8+Ci0gKiA8Y29kZT5TeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiJXR5XG4iLCBjYWwpKTs8L2NvZGU+PGJyLz4KLSAqIDxjb2RlPlN5c3RlbS5vdXQuZm9ybWF0KCIldHlcbiIsIGNhbCk7PC9jb2RlPjwvcD4KKyAqIG9yIG9mIHtAY29kZSBTdHJpbmd9Ojxici8+CisgKiB7QGNvZGUgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiV0eVxuIiwgY2FsKSk7fTxici8+CisgKiB7QGNvZGUgU3lzdGVtLm91dC5mb3JtYXQoIiV0eVxuIiwgY2FsKTt9PC9wPgogICogCiAgKiA8cD5UaGUgY2xhc3MgaXMgbm90IG11bHRpLXRocmVhZGVkIHNhZmUuIFRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciAKLSAqIG1haW50YWluaW5nIGEgdGhyZWFkLXNhZmUgZGVzaWduIGlmIGEgRm9ybWF0dGVyIGlzCisgKiBtYWludGFpbmluZyBhIHRocmVhZC1zYWZlIGRlc2lnbiBpZiBhIHtAY29kZSBGb3JtYXR0ZXJ9IGlzCiAgKiBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiA8L3A+CiAgKiAKLSAqIEBzaW5jZSAxLjUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRm9ybWF0dGVyIGltcGxlbWVudHMgQ2xvc2VhYmxlLCBGbHVzaGFibGUgewogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgLyoqCi0gICAgICogVGhlIGVudW1lcmF0aW9uIGdpdmluZyB0aGUgYXZhaWxhYmxlIHN0eWxlcwotICAgICAqIGZvciBmb3JtYXR0aW5nIHZlcnkgbGFyZ2UgZGVjaW1hbCBudW1iZXJzLgorICAgICAqIFRoZSBlbnVtZXJhdGlvbiBnaXZpbmcgdGhlIGF2YWlsYWJsZSBzdHlsZXMgZm9yIGZvcm1hdHRpbmcgdmVyeSBsYXJnZQorICAgICAqIGRlY2ltYWwgbnVtYmVycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8gICAgCiAgICAgcHVibGljIGVudW0gQmlnRGVjaW1hbExheW91dEZvcm0gewotICAgICAgICBTQ0lFTlRJRklDLCBERUNJTUFMX0ZMT0FUCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2Ugc2NpZW50aWZpYyBzdHlsZSBmb3IgQmlnRGVjaW1hbHMuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KKyAgICAgICAgU0NJRU5USUZJQywgCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2Ugbm9ybWFsIGRlY2ltYWwvZmxvYXQgc3R5bGUgZm9yIEJpZ0RlY2ltYWxzLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCisgICAgICAgIERFQ0lNQUxfRkxPQVQKICAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgcHJpdmF0ZSBBcHBlbmRhYmxlIG91dDsKIApAQCAtNDAwLDU0ICs0MTMsNjMgQEAKICAgICBwcml2YXRlIElPRXhjZXB0aW9uIGxhc3RJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBmb3JtYXR0ZXIuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBGb3JtYXR0ZXJ9LgogICAgICAqIAotICAgICAqIFRoZSBvdXRwdXQgaXMgYSBTdHJpbmdCdWlsZGVyIHdoaWNoIGNhbiBiZSBhY2hpZXZlZCBieSBpbnZva2luZyB0aGUgb3V0Ci0gICAgICogbWV0aG9kIGFuZCB3aG9zZSBjb250ZW50cyBjYW4gYmUgYXR0YWluZWQgYnkgY2FsbGluZyB0aGUgdG9TdHJpbmcgbWV0aG9kLgorICAgICAqIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byBhIHtAY29kZSBTdHJpbmdCdWlsZGVyfSB3aGljaCBjYW4gYmUgYWNxdWlyZWQgYnkgaW52b2tpbmcKKyAgICAgKiB7QGxpbmsgI291dCgpfSBhbmQgd2hvc2UgY29udGVudCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworICAgICAqIHtAY29kZSB0b1N0cmluZygpfS4KICAgICAgKiAKLSAgICAgKiBUaGUgbG9jYWxlIGZvciB0aGUgZm9ybWF0dGVyIGlzIHRoZSBkZWZhdWx0IGxvY2FsZSBvZiB0aGUgSlZNLgorICAgICAqIFRoZSB7QGNvZGUgTG9jYWxlfSBmb3IgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGlzIHRoZSBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoKSB7CiAgICAgICAgIHRoaXMobmV3IFN0cmluZ0J1aWxkZXIoKSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGZvcm1hdHRlciBvZiB3aGljaCB0aGUgb3V0cHV0IGlzIGRlbm90ZWQuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBGb3JtYXR0ZXJ9IHdob3NlIG91dHB1dCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIAorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgQXBwZW5kYWJsZX0uCiAgICAgICogCi0gICAgICogVGhlIGxvY2FsZSBmb3IgdGhlIGZvcm1hdHRlciBpcyB0aGUgZGVmYXVsdCBsb2NhbGUgb2YgdGhlIEpWTS4KKyAgICAgKiBUaGUgbG9jYWxlIGZvciB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaXMgdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGEKLSAgICAgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgb2YgdGhlIGZvcm1hdHRlci4gSWYgYSBpcyBudWxsLCB0aGVuIGEKLSAgICAgKiAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgd2lsbCBiZSB1c2VkLgorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBkZXN0aW5hdGlvbiBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uIElmIHtAY29kZSBhfSBpcyB7QGNvZGUgbnVsbH0sCisgICAgICogICAgICAgICAgICB0aGVuIGEge0Bjb2RlIFN0cmluZ0J1aWxkZXJ9IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRm9ybWF0dGVyKEFwcGVuZGFibGUgYSkgewogICAgICAgICB0aGlzKGEsIExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBmb3JtYXR0ZXIgb2Ygd2hpY2ggdGhlIGxvY2FsZSBpcyBkZW5vdGVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aXRoIHRoZSBzcGVjaWZpZWQge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCi0gICAgICogVGhlIG91dHB1dCBkZXN0aW5hdGlvbiBpcyBhIFN0cmluZ0J1aWxkZXIgd2hpY2ggY2FuIGJlIGFjaGlldmVkIGJ5Ci0gICAgICogaW52b2tpbmcgdGhlIG91dCBtZXRob2QgYW5kIHdob3NlIGNvbnRlbnRzIGNhbiBiZSBhdHRhaW5lZCBieSBjYWxsaW5nIHRoZQotICAgICAqIHRvU3RyaW5nIG1ldGhvZC4KKyAgICAgKiBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gYSB7QGNvZGUgU3RyaW5nQnVpbGRlcn0gd2hpY2ggY2FuIGJlIGFjcXVpcmVkIGJ5IGludm9raW5nCisgICAgICoge0BsaW5rICNvdXQoKX0gYW5kIHdob3NlIGNvbnRlbnQgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKyAgICAgKiB7QGNvZGUgdG9TdHJpbmcoKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgb2YgdGhlIGZvcm1hdHRlci4gSWYgbCBpcyBudWxsLCB0aGVuIG5vCi0gICAgICogICAgICAgICAgICBsb2NhbGl6YXRpb24gd2lsbCBiZSB1c2VkLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2NhbGV9IG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4gSWYge0Bjb2RlIGx9IGlzIHtAY29kZSBudWxsfSwKKyAgICAgKiAgICAgICAgICAgIHRoZW4gbm8gbG9jYWxpemF0aW9uIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRm9ybWF0dGVyKExvY2FsZSBsKSB7CiAgICAgICAgIHRoaXMobmV3IFN0cmluZ0J1aWxkZXIoKSwgbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGZvcm1hdHRlciBvZiB3aGljaCB0aGUgb3V0cHV0IGFuZCBsb2NhbGUgaXMgZGVub3RlZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIEZvcm1hdHRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9IAorICAgICAqIGFuZCB3aG9zZSBvdXRwdXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSAKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIEFwcGVuZGFibGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhCi0gICAgICogICAgICAgICAgICBUaGUgb3V0cHV0IG9mIHRoZSBmb3JtYXR0ZXIuIElmIGEgaXMgbnVsbCwgdGhlbiBhCi0gICAgICogICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHdpbGwgYmUgdXNlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gb2YgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LiBJZiB7QGNvZGUgYX0gaXMge0Bjb2RlIG51bGx9LAorICAgICAqICAgICAgICAgICAgdGhlbiBhIHtAY29kZSBTdHJpbmdCdWlsZGVyfSB3aWxsIGJlIHVzZWQuCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgb2YgdGhlIGZvcm1hdHRlci4gSWYgbCBpcyBudWxsLCB0aGVuIG5vCi0gICAgICogICAgICAgICAgICBsb2NhbGl6YXRpb24gd2lsbCBiZSB1c2VkLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2NhbGV9IG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4gSWYge0Bjb2RlIGx9IGlzIHtAY29kZSBudWxsfSwKKyAgICAgKiAgICAgICAgICAgIHRoZW4gbm8gbG9jYWxpemF0aW9uIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRm9ybWF0dGVyKEFwcGVuZGFibGUgYSwgTG9jYWxlIGwpIHsKICAgICAgICAgaWYgKG51bGwgPT0gYSkgewpAQCAtNDU5LDI1ICs0ODEsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZm9ybWF0dGVyIG9mIHdoaWNoIHRoZSBmaWxlbmFtZSBpcyBkZW5vdGVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aG9zZSBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgICAgICogCi0gICAgICogVGhlIGNoYXJzZXQgb2YgdGhlIGZvcm1hdHRlciBpcyB0aGUgZGVmYXVsdCBjaGFyc2V0IG9mIEpWTS4KKyAgICAgKiBUaGUgY2hhcnNldCBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaXMgdGhlIGRlZmF1bHQgY2hhcnNldC4KICAgICAgKiAKLSAgICAgKiBUaGUgbG9jYWxlIGZvciB0aGUgZm9ybWF0dGVyIGlzIHRoZSBkZWZhdWx0IGxvY2FsZSBvZiB0aGUgSlZNLgorICAgICAqIFRoZSB7QGNvZGUgTG9jYWxlfSBmb3IgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGlzIHRoZSBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqICAgICAgICAgICAgVGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRoYXQgaXMgdXNlZCBhcyB0aGUgb3V0cHV0Ci0gICAgICogICAgICAgICAgICBkZXN0aW5hdGlvbiBmb3IgdGhlIGZvcm1hdHRlci4gVGhlIGZpbGUgd2lsbCBiZSB0cnVuY2F0ZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGlzIHVzZWQgYXMgdGhlIG91dHB1dAorICAgICAqICAgICAgICAgICAgZGVzdGluYXRpb24gZm9yIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4gVGhlIGZpbGUgd2lsbCBiZSB0cnVuY2F0ZWQgdG8KICAgICAgKiAgICAgICAgICAgIHplcm8gc2l6ZSBpZiB0aGUgZmlsZSBleGlzdHMsIG9yIGVsc2UgYSBuZXcgZmlsZSB3aWxsIGJlCi0gICAgICogICAgICAgICAgICBjcmVhdGVkLiBUaGUgb3V0cHV0IG9mIHRoZSBmb3JtYXR0ZXIgaXMgYnVmZmVyZWQuCisgICAgICogICAgICAgICAgICBjcmVhdGVkLiBUaGUgb3V0cHV0IG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfSBpcyBidWZmZXJlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBmaWxlbmFtZSBkb2VzIG5vdCBkZW5vdGUgYSBub3JtYWwgYW5kIHdyaXRhYmxlIGZpbGUsCi0gICAgICogICAgICAgICAgICAgb3IgYSBuZXcgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCBvciBhbnkgZXJyb3IgcmlzZXMgd2hlbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBkb2VzIG5vdCBkZW5vdGUgYSBub3JtYWwgYW5kIHdyaXRhYmxlIGZpbGUsCisgICAgICogICAgICAgICAgICAgb3IgaWYgYSBuZXcgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgb3IgaWYgYW55IGVycm9yIGFyaXNlcyB3aGVuCiAgICAgICogICAgICAgICAgICAgb3BlbmluZyBvciBjcmVhdGluZyB0aGUgZmlsZS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyIGFuZCBpdCBkZW5pZXMgd3JpdGluZyB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICBmaWxlIGluIGNoZWNrV3JpdGUoZmlsZS5nZXRQYXRoKCkpLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaW4gcGxhY2Ugd2hpY2ggZGVuaWVzIHBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgICB0byB3cml0ZSB0byB0aGUgZmlsZSBpbiB7QGNvZGUgY2hlY2tXcml0ZShmaWxlLmdldFBhdGgoKSl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhuZXcgRmlsZShmaWxlTmFtZSkpOwpAQCAtNDg1LDI3ICs1MDgsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZm9ybWF0dGVyIG9mIHdoaWNoIHRoZSBmaWxlbmFtZSBhbmQgY2hhcnNldCBpcyBkZW5vdGVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aG9zZSBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgICAgICogCi0gICAgICogVGhlIGxvY2FsZSBmb3IgdGhlIGZvcm1hdHRlciBpcyB0aGUgZGVmYXVsdCBsb2NhbGUgb2YgdGhlIEpWTS4KKyAgICAgKiBUaGUge0Bjb2RlIExvY2FsZX0gZm9yIHRoZSB7QGNvZGUgRm9ybWF0dGVyfSBpcyB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGlzIHVzZWQgYXMgdGhlIG91dHB1dAotICAgICAqICAgICAgICAgICAgZGVzdGluYXRpb24gZm9yIHRoZSBmb3JtYXR0ZXIuIFRoZSBmaWxlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvCisgICAgICogICAgICAgICAgICB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgdGhhdCBpcyB1c2VkIGFzIHRoZSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIGZvciB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uIFRoZSBmaWxlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvCiAgICAgICogICAgICAgICAgICB6ZXJvIHNpemUgaWYgdGhlIGZpbGUgZXhpc3RzLCBvciBlbHNlIGEgbmV3IGZpbGUgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgY3JlYXRlZC4gVGhlIG91dHB1dCBvZiB0aGUgZm9ybWF0dGVyIGlzIGJ1ZmZlcmVkLgorICAgICAqICAgICAgICAgICAgY3JlYXRlZC4gVGhlIG91dHB1dCBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaXMgYnVmZmVyZWQuCiAgICAgICogQHBhcmFtIGNzbgotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNoYXJzZXQgZm9yIHRoZSBmb3JtYXR0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hhcnNldCBmb3IgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZpbGVuYW1lIGRvZXMgbm90IGRlbm90ZSBhIG5vcm1hbCBhbmQgd3JpdGFibGUgZmlsZSwKLSAgICAgKiAgICAgICAgICAgICBvciBhIG5ldyBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkIG9yIGFueSBlcnJvciByaXNlcyB3aGVuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIGRvZXMgbm90IGRlbm90ZSBhIG5vcm1hbCBhbmQgd3JpdGFibGUgZmlsZSwKKyAgICAgKiAgICAgICAgICAgICBvciBpZiBhIG5ldyBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLCBvciBpZiBhbnkgZXJyb3IgYXJpc2VzIHdoZW4KICAgICAgKiAgICAgICAgICAgICBvcGVuaW5nIG9yIGNyZWF0aW5nIHRoZSBmaWxlLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIgYW5kIGl0IGRlbmllcyB3cml0aW5nIHRvIHRoZQotICAgICAqICAgICAgICAgICAgIGZpbGUgaW4gY2hlY2tXcml0ZShmaWxlLmdldFBhdGgoKSkuCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpbiBwbGFjZSB3aGljaCBkZW5pZXMgcGVybWlzc2lvbgorICAgICAqICAgICAgICAgICAgIHRvIHdyaXRlIHRvIHRoZSBmaWxlIGluIHtAY29kZSBjaGVja1dyaXRlKGZpbGUuZ2V0UGF0aCgpKX0uCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYXJzZXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhcnNldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY3NuKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAogICAgICAgICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CkBAIC01MTMsMzAgKzUzNywzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBmb3JtYXR0ZXIgb2Ygd2hpY2ggdGhlIGZpbGVuYW1lLCBjaGFyc2V0IGFuZCBsb2NhbGUgaXMKLSAgICAgKiBkZW5vdGVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUgTG9jYWxlfSBhbmQgY2hhcnNldCwgCisgICAgICogYW5kIHdob3NlIG91dHB1dCBpcyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGlzIHVzZWQgYXMgdGhlIG91dHB1dAotICAgICAqICAgICAgICAgICAgZGVzdGluYXRpb24gZm9yIHRoZSBmb3JtYXR0ZXIuIFRoZSBmaWxlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvCisgICAgICogICAgICAgICAgICB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgdGhhdCBpcyB1c2VkIGFzIHRoZSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIGZvciB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uIFRoZSBmaWxlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvCiAgICAgICogICAgICAgICAgICB6ZXJvIHNpemUgaWYgdGhlIGZpbGUgZXhpc3RzLCBvciBlbHNlIGEgbmV3IGZpbGUgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgY3JlYXRlZC4gVGhlIG91dHB1dCBvZiB0aGUgZm9ybWF0dGVyIGlzIGJ1ZmZlcmVkLgorICAgICAqICAgICAgICAgICAgY3JlYXRlZC4gVGhlIG91dHB1dCBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaXMgYnVmZmVyZWQuCiAgICAgICogQHBhcmFtIGNzbgotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNoYXJzZXQgZm9yIHRoZSBmb3JtYXR0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hhcnNldCBmb3IgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LgogICAgICAqIEBwYXJhbSBsCi0gICAgICogICAgICAgICAgICBUaGUgbG9jYWxlIG9mIHRoZSBmb3JtYXR0ZXIuIElmIGwgaXMgbnVsbCwgdGhlbiBubwotICAgICAqICAgICAgICAgICAgbG9jYWxpemF0aW9uIHdpbGwgYmUgdXNlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTG9jYWxlfSBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uIElmIHtAY29kZSBsfSBpcyB7QGNvZGUgbnVsbH0sCisgICAgICogICAgICAgICAgICB0aGVuIG5vIGxvY2FsaXphdGlvbiB3aWxsIGJlIHVzZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZmlsZW5hbWUgZG9lcyBub3QgZGVub3RlIGEgbm9ybWFsIGFuZCB3cml0YWJsZSBmaWxlLAotICAgICAqICAgICAgICAgICAgIG9yIGEgbmV3IGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYW55IGVycm9yIHJpc2VzIHdoZW4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgZG9lcyBub3QgZGVub3RlIGEgbm9ybWFsIGFuZCB3cml0YWJsZSBmaWxlLAorICAgICAqICAgICAgICAgICAgIG9yIGlmIGEgbmV3IGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQsIG9yIGlmIGFueSBlcnJvciBhcmlzZXMgd2hlbgogICAgICAqICAgICAgICAgICAgIG9wZW5pbmcgb3IgY3JlYXRpbmcgdGhlIGZpbGUuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciBhbmQgaXQgZGVuaWVzIHdyaXRpbmcgdG8gdGhlCi0gICAgICogICAgICAgICAgICAgZmlsZSBpbiBjaGVja1dyaXRlKGZpbGUuZ2V0UGF0aCgpKS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGluIHBsYWNlIHdoaWNoIGRlbmllcyBwZXJtaXNzaW9uCisgICAgICogICAgICAgICAgICAgdG8gd3JpdGUgdG8gdGhlIGZpbGUgaW4ge0Bjb2RlIGNoZWNrV3JpdGUoZmlsZS5nZXRQYXRoKCkpfS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhcnNldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFyc2V0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZvcm1hdHRlcihTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBjc24sIExvY2FsZSBsKQogICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CkBAIC01NDUsNTEgKzU2OSw1NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBmb3JtYXR0ZXIgb2Ygd2hpY2ggdGhlIGZpbGUgaXMgZGVub3RlZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIEZvcm1hdHRlcn0gd2hvc2Ugb3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgRmlsZX0uCiAgICAgICogCi0gICAgICogVGhlIGNoYXJzZXQgb2YgdGhlIGZvcm1hdHRlciBpcyB0aGUgZGVmYXVsdCBjaGFyc2V0IG9mIEpWTS4KKyAgICAgKiBUaGUgY2hhcnNldCBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaXMgdGhlIGRlZmF1bHQgY2hhcnNldC4KICAgICAgKiAKLSAgICAgKiBUaGUgbG9jYWxlIGZvciB0aGUgZm9ybWF0dGVyIGlzIHRoZSBkZWZhdWx0IGxvY2FsZSBvZiB0aGUgSlZNLgorICAgICAqIFRoZSB7QGNvZGUgTG9jYWxlfSBmb3IgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGlzIHRoZSBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBUaGUgZmlsZSB0aGF0IGlzIHVzZWQgYXMgdGhlIG91dHB1dCBkZXN0aW5hdGlvbiBmb3IgdGhlCi0gICAgICogICAgICAgICAgICBmb3JtYXR0ZXIuIFRoZSBmaWxlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHplcm8gc2l6ZSBpZiB0aGUgZmlsZQotICAgICAqICAgICAgICAgICAgZXhpc3RzLCBvciBlbHNlIGEgbmV3IGZpbGUgd2lsbCBiZSBjcmVhdGVkLiBUaGUgb3V0cHV0IG9mIHRoZQotICAgICAqICAgICAgICAgICAgZm9ybWF0dGVyIGlzIGJ1ZmZlcmVkLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBGaWxlfSB0aGF0IGlzIHVzZWQgYXMgdGhlIG91dHB1dCBkZXN0aW5hdGlvbiBmb3IgdGhlCisgICAgICogICAgICAgICAgICB7QGNvZGUgRm9ybWF0dGVyfS4gVGhlIHtAY29kZSBGaWxlfSB3aWxsIGJlIHRydW5jYXRlZCB0byB6ZXJvIHNpemUgaWYgdGhlIHtAY29kZSBGaWxlfQorICAgICAqICAgICAgICAgICAgZXhpc3RzLCBvciBlbHNlIGEgbmV3IHtAY29kZSBGaWxlfSB3aWxsIGJlIGNyZWF0ZWQuIFRoZSBvdXRwdXQgb2YgdGhlCisgICAgICogICAgICAgICAgICB7QGNvZGUgRm9ybWF0dGVyfSBpcyBidWZmZXJlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBmaWxlIGRvZXMgbm90IGRlbm90ZSBhIG5vcm1hbCBhbmQgd3JpdGFibGUgZmlsZSwgb3IgYQotICAgICAqICAgICAgICAgICAgIG5ldyBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkIG9yIGFueSBlcnJvciByaXNlcyB3aGVuIG9wZW5pbmcgb3IKLSAgICAgKiAgICAgICAgICAgICBjcmVhdGluZyB0aGUgZmlsZS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIEZpbGV9IGlzIG5vdCBhIG5vcm1hbCBhbmQgd3JpdGFibGUge0Bjb2RlIEZpbGV9LCBvciBpZiBhCisgICAgICogICAgICAgICAgICAgbmV3IHtAY29kZSBGaWxlfSBjYW5ub3QgYmUgY3JlYXRlZCwgb3IgaWYgYW55IGVycm9yIHJpc2VzIHdoZW4gb3BlbmluZyBvcgorICAgICAqICAgICAgICAgICAgIGNyZWF0aW5nIHRoZSB7QGNvZGUgRmlsZX0uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciBhbmQgaXQgZGVuaWVzIHdyaXRpbmcgdG8gdGhlCi0gICAgICogICAgICAgICAgICAgZmlsZSBpbiBjaGVja1dyaXRlKGZpbGUuZ2V0UGF0aCgpKS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGluIHBsYWNlIHdoaWNoIGRlbmllcyBwZXJtaXNzaW9uCisgICAgICogICAgICAgICAgICAgdG8gd3JpdGUgdG8gdGhlIHtAY29kZSBGaWxlfSBpbiB7QGNvZGUgY2hlY2tXcml0ZShmaWxlLmdldFBhdGgoKSl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGZvcm1hdHRlciBvZiB3aGljaCB0aGUgZmlsZSBhbmQgY2hhcnNldCBpcyBkZW5vdGVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aXRoIHRoZSBnaXZlbiBjaGFyc2V0LCAKKyAgICAgKiBhbmQgd2hvc2Ugb3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgRmlsZX0uCiAgICAgICogCi0gICAgICogVGhlIGxvY2FsZSBmb3IgdGhlIGZvcm1hdHRlciBpcyB0aGUgZGVmYXVsdCBsb2NhbGUgb2YgdGhlIEpWTS4KKyAgICAgKiBUaGUge0Bjb2RlIExvY2FsZX0gZm9yIHRoZSB7QGNvZGUgRm9ybWF0dGVyfSBpcyB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgVGhlIGZpbGUgb2YgdGhlIGZpbGUgdGhhdCBpcyB1c2VkIGFzIHRoZSBvdXRwdXQgZGVzdGluYXRpb24KLSAgICAgKiAgICAgICAgICAgIGZvciB0aGUgZm9ybWF0dGVyLiBUaGUgZmlsZSB3aWxsIGJlIHRydW5jYXRlZCB0byB6ZXJvIHNpemUgaWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cywgb3IgZWxzZSBhIG5ldyBmaWxlIHdpbGwgYmUgY3JlYXRlZC4gVGhlCi0gICAgICogICAgICAgICAgICBvdXRwdXQgb2YgdGhlIGZvcm1hdHRlciBpcyBidWZmZXJlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgRmlsZX0gdGhhdCBpcyB1c2VkIGFzIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gZm9yIHRoZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIEZvcm1hdHRlcn0uIFRoZSB7QGNvZGUgRmlsZX0gd2lsbCBiZSB0cnVuY2F0ZWQgdG8gemVybyBzaXplIGlmIHRoZSB7QGNvZGUgRmlsZX0KKyAgICAgKiAgICAgICAgICAgIGV4aXN0cywgb3IgZWxzZSBhIG5ldyB7QGNvZGUgRmlsZX0gd2lsbCBiZSBjcmVhdGVkLiBUaGUgb3V0cHV0IG9mIHRoZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIEZvcm1hdHRlcn0gaXMgYnVmZmVyZWQuCiAgICAgICogQHBhcmFtIGNzbgotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNoYXJzZXQgZm9yIHRoZSBmb3JtYXR0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hhcnNldCBmb3IgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LgogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZGVub3RlIGEgbm9ybWFsIGFuZCB3cml0YWJsZSBmaWxlLCBvciBhCi0gICAgICogICAgICAgICAgICAgbmV3IGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYW55IGVycm9yIHJpc2VzIHdoZW4gb3BlbmluZyBvcgotICAgICAqICAgICAgICAgICAgIGNyZWF0aW5nIHRoZSBmaWxlLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgRmlsZX0gaXMgbm90IGEgbm9ybWFsIGFuZCB3cml0YWJsZSB7QGNvZGUgRmlsZX0sIG9yIGlmIGEKKyAgICAgKiAgICAgICAgICAgICBuZXcge0Bjb2RlIEZpbGV9IGNhbm5vdCBiZSBjcmVhdGVkLCBvciBpZiBhbnkgZXJyb3IgcmlzZXMgd2hlbiBvcGVuaW5nIG9yCisgICAgICogICAgICAgICAgICAgY3JlYXRpbmcgdGhlIHtAY29kZSBGaWxlfS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyIGFuZCBpdCBkZW5pZXMgd3JpdGluZyB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICBmaWxlIGluIGNoZWNrV3JpdGUoZmlsZS5nZXRQYXRoKCkpLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaW4gcGxhY2Ugd2hpY2ggZGVuaWVzIHBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgICB0byB3cml0ZSB0byB0aGUge0Bjb2RlIEZpbGV9IGluIHtAY29kZSBjaGVja1dyaXRlKGZpbGUuZ2V0UGF0aCgpKX0uCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYXJzZXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhcnNldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoRmlsZSBmaWxlLCBTdHJpbmcgY3NuKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAogICAgICAgICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CkBAIC01OTcsMjcgKzYyNCwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBmb3JtYXR0ZXIgb2Ygd2hpY2ggdGhlIGZpbGUsIGNoYXJzZXQgYW5kIGxvY2FsZSBpcyBkZW5vdGVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUgTG9jYWxlfSBhbmQgY2hhcnNldCwgCisgICAgICogYW5kIHdob3NlIG91dHB1dCBpcyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIEZpbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBmaWxlIHRoYXQgaXMgdXNlZCBhcyB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIGZvciB0aGUgZm9ybWF0dGVyLgotICAgICAqICAgICAgICAgICAgVGhlIGZpbGUgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gemVybyBzaXplIGlmIHRoZSBmaWxlIGV4aXN0cywgb3IKLSAgICAgKiAgICAgICAgICAgIGVsc2UgYSBuZXcgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuIFRoZSBvdXRwdXQgb2YgdGhlIGZvcm1hdHRlcgotICAgICAqICAgICAgICAgICAgaXMgYnVmZmVyZWQuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEZpbGV9IHRoYXQgaXMgdXNlZCBhcyB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBGb3JtYXR0ZXJ9LiBUaGUge0Bjb2RlIEZpbGV9IHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHplcm8gc2l6ZSBpZiB0aGUge0Bjb2RlIEZpbGV9CisgICAgICogICAgICAgICAgICBleGlzdHMsIG9yIGVsc2UgYSBuZXcge0Bjb2RlIEZpbGV9IHdpbGwgYmUgY3JlYXRlZC4gVGhlIG91dHB1dCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBGb3JtYXR0ZXJ9IGlzIGJ1ZmZlcmVkLgogICAgICAqIEBwYXJhbSBjc24KLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0IGZvciB0aGUgZm9ybWF0dGVyLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoYXJzZXQgZm9yIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4KICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgVGhlIGxvY2FsZSBvZiB0aGUgZm9ybWF0dGVyLiBJZiBsIGlzIG51bGwsIHRoZW4gbm8KLSAgICAgKiAgICAgICAgICAgIGxvY2FsaXphdGlvbiB3aWxsIGJlIHVzZWQuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIExvY2FsZX0gb2YgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LiBJZiB7QGNvZGUgbH0gaXMge0Bjb2RlIG51bGx9LAorICAgICAqICAgICAgICAgICAgdGhlbiBubyBsb2NhbGl6YXRpb24gd2lsbCBiZSB1c2VkLgogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZGVub3RlIGEgbm9ybWFsIGFuZCB3cml0YWJsZSBmaWxlLCBvciBhCi0gICAgICogICAgICAgICAgICAgbmV3IGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYW55IGVycm9yIHJpc2VzIHdoZW4gb3BlbmluZyBvcgotICAgICAqICAgICAgICAgICAgIGNyZWF0aW5nIHRoZSBmaWxlLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgRmlsZX0gaXMgbm90IGEgbm9ybWFsIGFuZCB3cml0YWJsZSB7QGNvZGUgRmlsZX0sIG9yIGlmIGEKKyAgICAgKiAgICAgICAgICAgICBuZXcge0Bjb2RlIEZpbGV9IGNhbm5vdCBiZSBjcmVhdGVkLCBvciBpZiBhbnkgZXJyb3IgcmlzZXMgd2hlbiBvcGVuaW5nIG9yCisgICAgICogICAgICAgICAgICAgY3JlYXRpbmcgdGhlIHtAY29kZSBGaWxlfS4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyIGFuZCBpdCBkZW5pZXMgd3JpdGluZyB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICBmaWxlIGluIGNoZWNrV3JpdGUoZmlsZS5nZXRQYXRoKCkpLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaW4gcGxhY2Ugd2hpY2ggZGVuaWVzIHBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgICB0byB3cml0ZSB0byB0aGUge0Bjb2RlIEZpbGV9IGluIHtAY29kZSBjaGVja1dyaXRlKGZpbGUuZ2V0UGF0aCgpKX0uCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYXJzZXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhcnNldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoRmlsZSBmaWxlLCBTdHJpbmcgY3NuLCBMb2NhbGUgbCkKICAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewpAQCAtNjQwLDE0ICs2NjksMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZm9ybWF0dGVyIG9mIHdoaWNoIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gaXMgc3BlY2lmaWVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aG9zZSBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkIHtAY29kZSBPdXRwdXRTdHJlYW19LgogICAgICAqIAotICAgICAqIFRoZSBjaGFyc2V0IG9mIHRoZSBmb3JtYXR0ZXIgaXMgdGhlIGRlZmF1bHQgY2hhcnNldCBvZiBKVk0uCisgICAgICogVGhlIGNoYXJzZXQgb2YgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGlzIHRoZSBkZWZhdWx0IGNoYXJzZXQuCiAgICAgICogCi0gICAgICogVGhlIGxvY2FsZSBmb3IgdGhlIGZvcm1hdHRlciBpcyB0aGUgZGVmYXVsdCBsb2NhbGUgb2YgdGhlIEpWTS4KKyAgICAgKiBUaGUge0Bjb2RlIExvY2FsZX0gZm9yIHRoZSB7QGNvZGUgRm9ybWF0dGVyfSBpcyB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3MKLSAgICAgKiAgICAgICAgICAgIFRoZSBzdHJlYW0gdXNlZCBhcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGZvcm1hdHRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gYmUgdXNlZCBhcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoT3V0cHV0U3RyZWFtIG9zKSB7CiAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zLCBDaGFyc2V0CkBAIC02NTksMTcgKzY4OSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBmb3JtYXR0ZXIgb2Ygd2hpY2ggdGhlIG91dHB1dCBkZXN0aW5hdGlvbiBhbmQgdGhlIGNoYXJzZXQgaXMKLSAgICAgKiBzcGVjaWZpZWQuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBGb3JtYXR0ZXJ9IHdpdGggdGhlIGdpdmVuIGNoYXJzZXQsIAorICAgICAqIGFuZCB3aG9zZSBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkIHtAY29kZSBPdXRwdXRTdHJlYW19LgogICAgICAqIAotICAgICAqIFRoZSBsb2NhbGUgZm9yIHRoZSBmb3JtYXR0ZXIgaXMgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0uCisgICAgICogVGhlIHtAY29kZSBMb2NhbGV9IGZvciB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaXMgdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9zCi0gICAgICogICAgICAgICAgICBUaGUgc3RyZWFtIHVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBmb3JtYXR0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4KICAgICAgKiBAcGFyYW0gY3NuCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY2hhcnNldCBmb3IgdGhlIGZvcm1hdHRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0IGZvciB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYXJzZXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhcnNldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIoT3V0cHV0U3RyZWFtIG9zLCBTdHJpbmcgY3NuKQogICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewpAQCAtNjc4LDE4ICs3MDksMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZm9ybWF0dGVyIG9mIHdoaWNoIHRoZSBvdXRwdXQgZGVzdGluYXRpb24sIHRoZSBjaGFyc2V0IGFuZAotICAgICAqIHRoZSBsb2NhbGUgaXMgc3BlY2lmaWVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUgTG9jYWxlfSBhbmQgY2hhcnNldCwgCisgICAgICogYW5kIHdob3NlIG91dHB1dCBpcyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIE91dHB1dFN0cmVhbX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9zCi0gICAgICogICAgICAgICAgICBUaGUgc3RyZWFtIHVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBmb3JtYXR0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4KICAgICAgKiBAcGFyYW0gY3NuCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY2hhcnNldCBmb3IgdGhlIGZvcm1hdHRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0IGZvciB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgb2YgdGhlIGZvcm1hdHRlci4gSWYgbCBpcyBudWxsLCB0aGVuIG5vCi0gICAgICogICAgICAgICAgICBsb2NhbGl6YXRpb24gd2lsbCBiZSB1c2VkLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2NhbGV9IG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4gSWYge0Bjb2RlIGx9IGlzIHtAY29kZSBudWxsfSwKKyAgICAgKiAgICAgICAgICAgIHRoZW4gbm8gbG9jYWxpemF0aW9uIHdpbGwgYmUgdXNlZC4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhcnNldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFyc2V0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZvcm1hdHRlcihPdXRwdXRTdHJlYW0gb3MsIFN0cmluZyBjc24sIExvY2FsZSBsKQogICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewpAQCAtNzAzLDE1ICs3MzUsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZm9ybWF0dGVyIG9mIHdoaWNoIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gaXMgc3BlY2lmaWVkLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRm9ybWF0dGVyfSB3aG9zZSBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkIHtAY29kZSBQcmludFN0cmVhbX0uCiAgICAgICogCi0gICAgICogVGhlIGNoYXJzZXQgb2YgdGhlIGZvcm1hdHRlciBpcyB0aGUgZGVmYXVsdCBjaGFyc2V0IG9mIEpWTS4KKyAgICAgKiBUaGUgY2hhcnNldCBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaXMgdGhlIGRlZmF1bHQgY2hhcnNldC4KICAgICAgKiAKLSAgICAgKiBUaGUgbG9jYWxlIGZvciB0aGUgZm9ybWF0dGVyIGlzIHRoZSBkZWZhdWx0IGxvY2FsZSBvZiB0aGUgSlZNLgorICAgICAqIFRoZSB7QGNvZGUgTG9jYWxlfSBmb3IgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGlzIHRoZSBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwcwotICAgICAqICAgICAgICAgICAgVGhlIHByaW50IHN0cmVhbSB1c2VkIGFzIGRlc3RpbmF0aW9uIG9mIHRoZSBmb3JtYXR0ZXIuIElmIHBzCi0gICAgICogICAgICAgICAgICBpcyBudWxsLCB0aGVuIE51bGxQb2ludGVyRXhjZXBpdG9uIHdpbGwgYmUgdGhyb3duIG91dC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJpbnRTdHJlYW19IHVzZWQgYXMgZGVzdGluYXRpb24gb2YgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LiBJZgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHBzfSBpcyB7QGNvZGUgbnVsbH0sIHRoZW4gYSB7QCBjb2RlIE51bGxQb2ludGVyRXhjZXBpdG9ufSB3aWxsCisgICAgICogICAgICAgICAgICBiZSByYWlzZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZvcm1hdHRlcihQcmludFN0cmVhbSBwcykgewogICAgICAgICBpZiAobnVsbCA9PSBwcykgewpAQCAtNzI4LDExICs3NjIsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbGUgb2YgdGhlIGZvcm1hdHRlci4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgTG9jYWxlfSBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbG9jYWxlIGZvciB0aGUgZm9ybWF0dGVyIGFuZCBudWxsIGZvciBubyBsb2NhbGUuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIExvY2FsZX0gZm9yIHRoZSB7QGNvZGUgRm9ybWF0dGVyfSBvciB7QGNvZGUgbnVsbH0gZm9yIG5vIHtAY29kZSBMb2NhbGV9LgogICAgICAqIEB0aHJvd3MgRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTG9jYWxlIGxvY2FsZSgpIHsKICAgICAgICAgY2hlY2tDbG9zZWQoKTsKQEAgLTc0MCwxMSArNzc1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIG9mIHRoZSBmb3JtYXR0ZXIuCisgICAgICogUmV0dXJucyB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBvdXRwdXQgZGVzdGluYXRpb24gb2YgdGhlIGZvcm1hdHRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gb2YgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LgogICAgICAqIEB0aHJvd3MgRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXBwZW5kYWJsZSBvdXQoKSB7CiAgICAgICAgIGNoZWNrQ2xvc2VkKCk7CkBAIC03NTIsMTMgKzc4OCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgYnkgY2FsbGluZyB0aGUgdG9TdHJpbmcoKSBtZXRob2Qgb2YgdGhlIG91dHB1dAorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgYnkgY2FsbGluZyB0aGUge0Bjb2RlIHRvU3RyaW5nKCl9IG1ldGhvZCBvZiB0aGUgb3V0cHV0CiAgICAgICogZGVzdGluYXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgY29udGVudCBieSBjYWxsaW5nIHRoZSB0b1N0cmluZygpIG1ldGhvZCBvZiB0aGUgb3V0cHV0CisgICAgICogQHJldHVybiB0aGUgY29udGVudCBieSBjYWxsaW5nIHRoZSB7QGNvZGUgdG9TdHJpbmcoKX0gbWV0aG9kIG9mIHRoZSBvdXRwdXQKICAgICAgKiAgICAgICAgIGRlc3RpbmF0aW9uLgogICAgICAqIEB0aHJvd3MgRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtNzY3LDExICs4MDQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGbHVzaGVzIHRoZSBmb3JtYXR0ZXIuIElmIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gaXMge0BsaW5rIEZsdXNoYWJsZX0sCi0gICAgICogdGhlbiB0aGUgbWV0aG9kIGZsdXNoKCkgd2lsbCBiZSBjYWxsZWQgb24gdGhhdCBkZXN0aW5hdGlvbi4KKyAgICAgKiBGbHVzaGVzIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4gSWYgdGhlIG91dHB1dCBkZXN0aW5hdGlvbiBpcyB7QGxpbmsgRmx1c2hhYmxlfSwKKyAgICAgKiB0aGVuIHRoZSBtZXRob2Qge0AgY29kZSBmbHVzaCgpfSB3aWxsIGJlIGNhbGxlZCBvbiB0aGF0IGRlc3RpbmF0aW9uLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKICAgICAgICAgY2hlY2tDbG9zZWQoKTsKQEAgLTc4NSwxNCArODIzLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBmb3JtYXR0ZXIuIElmIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gaXMge0BsaW5rIENsb3NlYWJsZX0sCi0gICAgICogdGhlbiB0aGUgbWV0aG9kIGNsb3NlKCkgd2lsbCBiZSBjYWxsZWQgb24gdGhhdCBkZXN0aW5hdGlvbi4KKyAgICAgKiBDbG9zZXMgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9LiBJZiB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIGlzIHtAbGluayBDbG9zZWFibGV9LAorICAgICAqIHRoZW4gdGhlIG1ldGhvZCB7QGNvZGUgY2xvc2UoKX0gd2lsbCBiZSBjYWxsZWQgb24gdGhhdCBkZXN0aW5hdGlvbi4KICAgICAgKiAKLSAgICAgKiBJZiB0aGUgZm9ybWF0dGVyIGhhcyBiZWVuIGNsb3NlZCwgdGhlbiBjYWxsaW5nIHRoZSBjbG9zZSB3aWxsIGhhdmUgbm8KKyAgICAgKiBJZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaGFzIGJlZW4gY2xvc2VkLCB0aGVuIGNhbGxpbmcgdGhlIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubwogICAgICAqIGVmZmVjdC4KICAgICAgKiAKLSAgICAgKiBBbnkgbWV0aG9kIGJ1dCB0aGUgaW9FeGNlcHRpb24oKSB0aGF0IGlzIGNhbGxlZCBhZnRlciB0aGUgZm9ybWF0dGVyIGhhcwotICAgICAqIGJlZW4gY2xvc2VkIHdpbGwgcmFpc2UgYSBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24uCisgICAgICogQW55IG1ldGhvZCBidXQgdGhlIHtAbGluayAjaW9FeGNlcHRpb24oKX0gdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCisgICAgICoge0Bjb2RlIEZvcm1hdHRlcn0gaGFzIGJlZW4gY2xvc2VkIHdpbGwgcmFpc2UgYSB7QGNvZGUgRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKQEAgLTgwNywzMyArODQ3LDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFzdCBJT0V4Y2VwdGlvbiB0aHJvd24gb3V0IGJ5IHRoZSBmb3JtYXR0ZXIncyBvdXRwdXQKLSAgICAgKiBkZXN0aW5hdGlvbi4gSWYgdGhlIGFwcGVuZCgpIG1ldGhvZCBvZiB0aGUgZGVzdGluYXRpb24gd2lsbCBub3QgdGhyb3cKLSAgICAgKiBJT0V4Y2VwdGlvbiwgdGhlIGlvRXhjZXB0aW9uKCkgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBudWxsLgorICAgICAqIFJldHVybnMgdGhlIGxhc3Qge0Bjb2RlIElPRXhjZXB0aW9ufSB0aHJvd24gYnkgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9J3Mgb3V0cHV0CisgICAgICogZGVzdGluYXRpb24uIElmIHRoZSB7QGNvZGUgYXBwZW5kKCl9IG1ldGhvZCBvZiB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QgdGhyb3cKKyAgICAgKiB7QGNvZGUgSU9FeGNlcHRpb259cywgdGhlIHtAY29kZSBpb0V4Y2VwdGlvbigpfSBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIHtAY29kZSBudWxsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBsYXN0IElPRXhjZXB0aW9uIHRocm93biBvdXQgYnkgdGhlIGZvcm1hdHRlcidzIG91dHB1dAorICAgICAqIEByZXR1cm4gdGhlIGxhc3Qge0Bjb2RlIElPRXhjZXB0aW9ufSB0aHJvd24gYnkgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9J3Mgb3V0cHV0CiAgICAgICogICAgICAgICBkZXN0aW5hdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSU9FeGNlcHRpb24gaW9FeGNlcHRpb24oKSB7CiAgICAgICAgIHJldHVybiBsYXN0SU9FeGNlcHRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgZm9ybWF0dGVkIHN0cmluZyB0byB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIG9mIHRoZSBmb3JtYXR0ZXIuCisgICAgICogV3JpdGVzIGEgZm9ybWF0dGVkIHN0cmluZyB0byB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIG9mIHRoZSB7QGNvZGUgRm9ybWF0dGVyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICBBIGZvcm1hdCBzdHJpbmcuCisgICAgICogICAgICAgICAgICBhIGZvcm1hdCBzdHJpbmcuCiAgICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgbGlzdCB1c2VkIGluIHRoZSBmb3JtYXQoKSBtZXRob2QuIElmIHRoZXJlIGFyZQorICAgICAqICAgICAgICAgICAgdGhlIGFyZ3VtZW50cyBsaXN0IHVzZWQgaW4gdGhlIHtAY29kZSBmb3JtYXQoKX0gbWV0aG9kLiBJZiB0aGVyZSBhcmUKICAgICAgKiAgICAgICAgICAgIG1vcmUgYXJndW1lbnRzIHRoYW4gdGhvc2Ugc3BlY2lmaWVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nLCB0aGVuCiAgICAgICogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCi0gICAgICogQHJldHVybiBUaGlzIGZvcm1hdHRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIEZvcm1hdHRlcn0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaWxsZWdhbCBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMgb3IgdGhlIGFyZ3VtZW50cyBhcmUgbGVzcyB0aGFuIHRob3NlIHJlcXVpcmVkIGJ5Ci0gICAgICogICAgICAgICAgICAgdGhlIGZvcm1hdCBzdHJpbmcgb3IgYW55IG90aGVyIGlsbGVnYWwgc2l0dWF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGlsbGVnYWwgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgYXJndW1lbnRzLCBvciBpZiBmZXdlciBhcmd1bWVudHMgYXJlIHNlbnQgdGhhbiB0aG9zZSByZXF1aXJlZCBieQorICAgICAqICAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nLCBvciBhbnkgb3RoZXIgaWxsZWdhbCBzaXR1YXRpb24uCiAgICAgICogQHRocm93cyBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZm9ybWF0dGVyIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXIgZm9ybWF0KFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIHJldHVybiBmb3JtYXQobG9jYWxlLCBmb3JtYXQsIGFyZ3MpOwpAQCAtODQ4LDM3ICs4OTAsMzkgQEAKIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGZvcm1hdHRlZCBzdHJpbmcgdG8gdGhlIG91dHB1dCBkZXN0aW5hdGlvbiBvZiB0aGUgZm9ybWF0dGVyLgorICAgICAqIFdyaXRlcyBhIGZvcm1hdHRlZCBzdHJpbmcgdG8gdGhlIG91dHB1dCBkZXN0aW5hdGlvbiBvZiB0aGUge0Bjb2RlIEZvcm1hdHRlcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgdXNlZCBpbiB0aGUgbWV0aG9kLiBJZiBsb2NhbGUgaXMgbnVsbCwgdGhlbiBubwotICAgICAqICAgICAgICAgICAgbG9jYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZC4gVGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgbG9jYWxlIHNwZWNpZmllZCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2NhbGV9IHVzZWQgaW4gdGhlIG1ldGhvZC4gSWYge0Bjb2RlIGxvY2FsZX0gaXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfSwgdGhlbiBubyBsb2NhbGl6YXRpb24gd2lsbCBiZSBhcHBsaWVkLiBUaGlzCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgZG9lcyBub3QgaW5mbHVlbmNlIHRoZSB7QGNvZGUgTG9jYWxlfSBzcGVjaWZpZWQgZHVyaW5nCisgICAgICogICAgICAgICAgICBjb25zdHJ1Y3Rpb24uCiAgICAgICogQHBhcmFtIGZvcm1hdAotICAgICAqICAgICAgICAgICAgQSBmb3JtYXQgc3RyaW5nLgorICAgICAqICAgICAgICAgICAgYSBmb3JtYXQgc3RyaW5nLgogICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogICAgICAgICAgICBUaGUgYXJndW1lbnRzIGxpc3QgdXNlZCBpbiB0aGUgZm9ybWF0KCkgbWV0aG9kLiBJZiB0aGVyZSBhcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudHMgbGlzdCB1c2VkIGluIHRoZSB7QGNvZGUgZm9ybWF0KCl9IG1ldGhvZC4gSWYgdGhlcmUgYXJlCiAgICAgICogICAgICAgICAgICBtb3JlIGFyZ3VtZW50cyB0aGFuIHRob3NlIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgdGhlbgogICAgICAqICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gVGhpcyBmb3JtYXR0ZXIuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBGb3JtYXR0ZXJ9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGlsbGVnYWwgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlCi0gICAgICogICAgICAgICAgICAgYXJndW1lbnRzIG9yIHRoZSBhcmd1bWVudHMgYXJlIGxlc3MgdGhhbiB0aG9zZSByZXF1aXJlZCBieQotICAgICAqICAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIG9yIGFueSBvdGhlciBpbGxlZ2FsIHNpdHVhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBpbGxlZ2FsIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAqICAgICAgICAgICAgIGFyZ3VtZW50cywgb3IgaWYgZmV3ZXIgYXJndW1lbnRzIGFyZSBzZW50IHRoYW4gdGhvc2UgcmVxdWlyZWQgYnkKKyAgICAgKiAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZywgb3IgYW55IG90aGVyIGlsbGVnYWwgc2l0dWF0aW9uLgogICAgICAqIEB0aHJvd3MgRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGZvcm1hdHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBGb3JtYXR0ZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRm9ybWF0dGVyIGZvcm1hdChMb2NhbGUgbCwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKICAgICAgICAgY2hlY2tDbG9zZWQoKTsKICAgICAgICAgQ2hhckJ1ZmZlciBmb3JtYXRCdWZmZXIgPSBDaGFyQnVmZmVyLndyYXAoZm9ybWF0KTsKICAgICAgICAgUGFyc2VyU3RhdGVNYWNoaW5lIHBhcnNlciA9IG5ldyBQYXJzZXJTdGF0ZU1hY2hpbmUoZm9ybWF0QnVmZmVyKTsKIAotLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAvLyBSZXVzZSB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZXIgaWYgdGhlIGxvY2FsZSBtYXRjaGVzLgogICAgICAgICBpZiAodHJhbnNmb3JtZXIgPT0gbnVsbCB8fCAhIHRyYW5zZm9ybWVyLmxvY2FsZS5lcXVhbHMobCkpIHsKICAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gbmV3IFRyYW5zZm9ybWVyKHRoaXMsIGwpOwogICAgICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgICAgICBpbnQgY3VycmVudE9iamVjdEluZGV4ID0gMDsKICAgICAgICAgT2JqZWN0IGxhc3RBcmd1bWVudCA9IG51bGw7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRlckNsb3NlZEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Gb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24uamF2YQppbmRleCAxOWZmMDA1Li42M2QxMDUyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRlckNsb3NlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uLmphdmEKQEAgLTE5LDE2ICsxOSwxOSBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIFRoZSB1bmNoZWNrZWQgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG91dCBpZiB0aGUgZm9ybWF0dGVyIGhhcyBiZWVuIGNsb3NlZC4KKyAqIEEge0Bjb2RlIEZvcm1hdHRlckNsb3NlZEV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGZvcm1hdHRlciBoYXMgYmVlbgorICogY2xvc2VkLgogICogCisgKiBAc2VlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZvcm1hdHRlckNsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpbXBsZW1lbnRzCiAgICAgICAgIFNlcmlhbGl6YWJsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTgxMTEyMTZMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3R1Y3RzIGFuIGluc3RhbmNlIG9mIEZvcm1hdHRlckNsb3NlZEV4Y2VwdGlvbi4KLSAgICAgKiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb259IHdpdGggdGhlIHN0YWNrIHRyYWNlCisgICAgICogZmlsbGVkIGluLgogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9HcmVnb3JpYW5DYWxlbmRhci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9HcmVnb3JpYW5DYWxlbmRhci5qYXZhCmluZGV4IDNjOTU0YTUuLjMyMzY4ZWMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvR3JlZ29yaWFuQ2FsZW5kYXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0dyZWdvcmlhbkNhbGVuZGFyLmphdmEKQEAgLTE0LDYgKzE0LDEyIEBACiAgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCiAKIHBhY2thZ2UgamF2YS51dGlsOwogCkBAIC0yMSwxNCArMjcsMTcyIEBACiBpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBUaGUgY2xhc3MgamF2YWRvYyBhbmQgc29tZSBvZiB0aGUgbWV0aG9kIGRlc2NyaXB0aW9ucyBhcmUgY29waWVkIGZyb20gSUNVNEoKKy8vIHNvdXJjZSBmaWxlcy4gQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgY29waWVkIGRlc2NyaXB0aW9ucy4KKy8vIFRoZSBpY3UgbGljZW5zZSBoZWFkZXIgd2FzIGFkZGVkIHRvIHRoaXMgZmlsZS4gCisvLyBFTkQgYW5kcm9pZC1ub3RlCiAvKioKLSAqIEdyZWdvcmlhbkNhbGVuZGFyIHByb3ZpZGVzIHRoZSBjb252ZXJzaW9uIGJldHdlZW4gRGF0ZXMgYW5kIGludGVnZXIgY2FsZW5kYXIKLSAqIGZpZWxkcywgc3VjaCBhcyB0aGUgbW9udGgsIHllYXIgb3IgbWludXRlLCBmb3IgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci4gU2VlCi0gKiBDYWxlbmRhciBmb3IgdGhlIGRlZmluZWQgZmllbGRzLgorICoge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyfSBpcyBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mIHtAbGluayBDYWxlbmRhcn0KKyAqIGFuZCBwcm92aWRlcyB0aGUgc3RhbmRhcmQgY2FsZW5kYXIgdXNlZCBieSBtb3N0IG9mIHRoZSB3b3JsZC4KKyAqIAorICogPHA+CisgKiBUaGUgc3RhbmRhcmQgKEdyZWdvcmlhbikgY2FsZW5kYXIgaGFzIDIgZXJhcywgQkMgYW5kIEFELgorICogCisgKiA8cD4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyBhIHNpbmdsZSBkaXNjb250aW51aXR5LCB3aGljaCBjb3JyZXNwb25kcyBieQorICogZGVmYXVsdCB0byB0aGUgZGF0ZSB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHdhcyBpbnN0aXR1dGVkIChPY3RvYmVyIDE1LCAxNTgyCisgKiBpbiBzb21lIGNvdW50cmllcywgbGF0ZXIgaW4gb3RoZXJzKS4gVGhlIGN1dG92ZXIgZGF0ZSBtYXkgYmUgY2hhbmdlZCBieSB0aGUKKyAqIGNhbGxlciBieSBjYWxsaW5nIHtAY29kZSBzZXRHcmVnb3JpYW5DaGFuZ2UoKX0uCisgKiAKKyAqIDxwPgorICogSGlzdG9yaWNhbGx5LCBpbiB0aG9zZSBjb3VudHJpZXMgd2hpY2ggYWRvcHRlZCB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIGZpcnN0LAorICogT2N0b2JlciA0LCAxNTgyIHdhcyB0aHVzIGZvbGxvd2VkIGJ5IE9jdG9iZXIgMTUsIDE1ODIuIFRoaXMgY2FsZW5kYXIgbW9kZWxzCisgKiB0aGlzIGNvcnJlY3RseS4gQmVmb3JlIHRoZSBHcmVnb3JpYW4gY3V0b3Zlciwge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyfQorICogaW1wbGVtZW50cyB0aGUgSnVsaWFuIGNhbGVuZGFyLiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdyZWdvcmlhbiBhbmQKKyAqIHRoZSBKdWxpYW4gY2FsZW5kYXIgaXMgdGhlIGxlYXAgeWVhciBydWxlLiBUaGUgSnVsaWFuIGNhbGVuZGFyIHNwZWNpZmllcyBsZWFwCisgKiB5ZWFycyBldmVyeSBmb3VyIHllYXJzLCB3aGVyZWFzIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgb21pdHMgY2VudHVyeSB5ZWFycworICogd2hpY2ggYXJlIG5vdCBkaXZpc2libGUgYnkgNDAwLgorICogCisgKiA8cD4KKyAqIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gaW1wbGVtZW50cyA8ZW0+cHJvbGVwdGljPC9lbT4gR3JlZ29yaWFuCisgKiBhbmQgSnVsaWFuIGNhbGVuZGFycy4gVGhhdCBpcywgZGF0ZXMgYXJlIGNvbXB1dGVkIGJ5IGV4dHJhcG9sYXRpbmcgdGhlCisgKiBjdXJyZW50IHJ1bGVzIGluZGVmaW5pdGVseSBmYXIgYmFja3dhcmQgYW5kIGZvcndhcmQgaW4gdGltZS4gQXMgYSByZXN1bHQsCisgKiB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IG1heSBiZSB1c2VkIGZvciBhbGwgeWVhcnMgdG8gZ2VuZXJhdGUKKyAqIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3RlbnQgcmVzdWx0cy4gSG93ZXZlciwgZGF0ZXMgb2J0YWluZWQgdXNpbmcKKyAqIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gYXJlIGhpc3RvcmljYWxseSBhY2N1cmF0ZSBvbmx5IGZyb20gTWFyY2ggMSwKKyAqIDQgQUQgb253YXJkLCB3aGVuIG1vZGVybiBKdWxpYW4gY2FsZW5kYXIgcnVsZXMgd2VyZSBhZG9wdGVkLiBCZWZvcmUgdGhpcworICogZGF0ZSwgbGVhcCB5ZWFyIHJ1bGVzIHdlcmUgYXBwbGllZCBpcnJlZ3VsYXJseSwgYW5kIGJlZm9yZSA0NSBCQyB0aGUgSnVsaWFuCisgKiBjYWxlbmRhciBkaWQgbm90IGV2ZW4gZXhpc3QuCisgKiAKKyAqIDxwPgorICogUHJpb3IgdG8gdGhlIGluc3RpdHV0aW9uIG9mIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIsIE5ldyBZZWFyJ3MgRGF5IHdhcyBNYXJjaAorICogMjUuIFRvIGF2b2lkIGNvbmZ1c2lvbiwgdGhpcyBjYWxlbmRhciBhbHdheXMgdXNlcyBKYW51YXJ5IDEuIEEgbWFudWFsCisgKiBhZGp1c3RtZW50IG1heSBiZSBtYWRlIGlmIGRlc2lyZWQgZm9yIGRhdGVzIHRoYXQgYXJlIHByaW9yIHRvIHRoZSBHcmVnb3JpYW4KKyAqIGNoYW5nZW92ZXIgYW5kIHdoaWNoIGZhbGwgYmV0d2VlbiBKYW51YXJ5IDEgYW5kIE1hcmNoIDI0LgorICogCisgKiA8cD4KKyAqIFZhbHVlcyBjYWxjdWxhdGVkIGZvciB0aGUge0Bjb2RlIFdFRUtfT0ZfWUVBUn0gZmllbGQgcmFuZ2UgZnJvbSAxIHRvCisgKiA1My4gV2VlayAxIGZvciBhIHllYXIgaXMgdGhlIGVhcmxpZXN0IHNldmVuIGRheSBwZXJpb2Qgc3RhcnRpbmcgb24KKyAqIHtAY29kZSBnZXRGaXJzdERheU9mV2VlaygpfSB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0CisgKiB7QGNvZGUgZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpfSBkYXlzIGZyb20gdGhhdCB5ZWFyLiBJdCB0aHVzCisgKiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2Yge0Bjb2RlIGdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKX0sCisgKiB7QGNvZGUgZ2V0Rmlyc3REYXlPZldlZWsoKX0sIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIEphbnVhcnkgMS4KKyAqIFdlZWtzIGJldHdlZW4gd2VlayAxIG9mIG9uZSB5ZWFyIGFuZCB3ZWVrIDEgb2YgdGhlIGZvbGxvd2luZyB5ZWFyIGFyZQorICogbnVtYmVyZWQgc2VxdWVudGlhbGx5IGZyb20gMiB0byA1MiBvciA1MyAoYXMgbmVlZGVkKS4KKyAqIAorICogPHA+CisgKiBGb3IgZXhhbXBsZSwgSmFudWFyeSAxLCAxOTk4IHdhcyBhIFRodXJzZGF5LiBJZgorICoge0Bjb2RlIGdldEZpcnN0RGF5T2ZXZWVrKCl9IGlzIHtAY29kZSBNT05EQVl9IGFuZAorICoge0Bjb2RlIGdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKX0gaXMgNCAodGhlc2UgYXJlIHRoZSB2YWx1ZXMKKyAqIHJlZmxlY3RpbmcgSVNPIDg2MDEgYW5kIG1hbnkgbmF0aW9uYWwgc3RhbmRhcmRzKSwgdGhlbiB3ZWVrIDEgb2YgMTk5OCBzdGFydHMKKyAqIG9uIERlY2VtYmVyIDI5LCAxOTk3LCBhbmQgZW5kcyBvbiBKYW51YXJ5IDQsIDE5OTguIElmLCBob3dldmVyLAorICoge0Bjb2RlIGdldEZpcnN0RGF5T2ZXZWVrKCl9IGlzIHtAY29kZSBTVU5EQVl9LCB0aGVuIHdlZWsgMSBvZgorICogMTk5OCBzdGFydHMgb24gSmFudWFyeSA0LCAxOTk4LCBhbmQgZW5kcyBvbiBKYW51YXJ5IDEwLCAxOTk4OyB0aGUgZmlyc3QgdGhyZWUKKyAqIGRheXMgb2YgMTk5OCB0aGVuIGFyZSBwYXJ0IG9mIHdlZWsgNTMgb2YgMTk5Ny4KKyAqIAorICogPHA+CisgKiBWYWx1ZXMgY2FsY3VsYXRlZCBmb3IgdGhlIHtAY29kZSBXRUVLX09GX01PTlRIfSBmaWVsZCByYW5nZSBmcm9tIDAgb3IKKyAqIDEgdG8gNCBvciA1LiBXZWVrIDEgb2YgYSBtb250aCAodGhlIGRheXMgd2l0aCA8Y29kZT5XRUVLX09GX01PTlRIID0KKyAqIDE8L2NvZGU+KQorICogaXMgdGhlIGVhcmxpZXN0IHNldCBvZiBhdCBsZWFzdCB7QGNvZGUgZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpfQorICogY29udGlndW91cyBkYXlzIGluIHRoYXQgbW9udGgsIGVuZGluZyBvbiB0aGUgZGF5IGJlZm9yZQorICoge0Bjb2RlIGdldEZpcnN0RGF5T2ZXZWVrKCl9LiBVbmxpa2Ugd2VlayAxIG9mIGEgeWVhciwgd2VlayAxIG9mIGEKKyAqIG1vbnRoIG1heSBiZSBzaG9ydGVyIHRoYW4gNyBkYXlzLCBuZWVkIG5vdCBzdGFydCBvbgorICoge0Bjb2RlIGdldEZpcnN0RGF5T2ZXZWVrKCl9LCBhbmQgd2lsbCBub3QgaW5jbHVkZSBkYXlzIG9mIHRoZQorICogcHJldmlvdXMgbW9udGguIERheXMgb2YgYSBtb250aCBiZWZvcmUgd2VlayAxIGhhdmUgYQorICoge0Bjb2RlIFdFRUtfT0ZfTU9OVEh9IG9mIDAuCisgKiAKKyAqIDxwPgorICogRm9yIGV4YW1wbGUsIGlmIHtAY29kZSBnZXRGaXJzdERheU9mV2VlaygpfSBpcyB7QGNvZGUgU1VOREFZfQorICogYW5kIHtAY29kZSBnZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKCl9IGlzIDQsIHRoZW4gdGhlIGZpcnN0IHdlZWsgb2YKKyAqIEphbnVhcnkgMTk5OCBpcyBTdW5kYXksIEphbnVhcnkgNCB0aHJvdWdoIFNhdHVyZGF5LCBKYW51YXJ5IDEwLiBUaGVzZSBkYXlzCisgKiBoYXZlIGEge0Bjb2RlIFdFRUtfT0ZfTU9OVEh9IG9mIDEuIFRodXJzZGF5LCBKYW51YXJ5IDEgdGhyb3VnaAorICogU2F0dXJkYXksIEphbnVhcnkgMyBoYXZlIGEge0Bjb2RlIFdFRUtfT0ZfTU9OVEh9IG9mIDAuIElmCisgKiB7QGNvZGUgZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpfSBpcyBjaGFuZ2VkIHRvIDMsIHRoZW4gSmFudWFyeSAxCisgKiB0aHJvdWdoIEphbnVhcnkgMyBoYXZlIGEge0Bjb2RlIFdFRUtfT0ZfTU9OVEh9IG9mIDEuCisgKiAKKyAqIDxwPgorICogPHN0cm9uZz5FeGFtcGxlOjwvc3Ryb25nPiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIC8vIGdldCB0aGUgc3VwcG9ydGVkIGlkcyBmb3IgR01ULTA4OjAwIChQYWNpZmljIFN0YW5kYXJkIFRpbWUpCisgKiBTdHJpbmdbXSBpZHMgPSBUaW1lWm9uZS5nZXRBdmFpbGFibGVJRHMoLTggKiA2MCAqIDYwICogMTAwMCk7CisgKiAvLyBpZiBubyBpZHMgd2VyZSByZXR1cm5lZCwgc29tZXRoaW5nIGlzIHdyb25nLiBnZXQgb3V0LgorICogaWYgKGlkcy5sZW5ndGggPT0gMCkKKyAqICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAqCisgKiAgLy8gYmVnaW4gb3V0cHV0CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgVGltZSIpOworICoKKyAqIC8vIGNyZWF0ZSBhIFBhY2lmaWMgU3RhbmRhcmQgVGltZSB0aW1lIHpvbmUKKyAqIFNpbXBsZVRpbWVab25lIHBkdCA9IG5ldyBTaW1wbGVUaW1lWm9uZSgtOCAqIDYwICogNjAgKiAxMDAwLCBpZHNbMF0pOworICoKKyAqIC8vIHNldCB1cCBydWxlcyBmb3IgZGF5bGlnaHQgc2F2aW5ncyB0aW1lCisgKiBwZHQuc2V0U3RhcnRSdWxlKENhbGVuZGFyLkFQUklMLCAxLCBDYWxlbmRhci5TVU5EQVksIDIgKiA2MCAqIDYwICogMTAwMCk7CisgKiBwZHQuc2V0RW5kUnVsZShDYWxlbmRhci5PQ1RPQkVSLCAtMSwgQ2FsZW5kYXIuU1VOREFZLCAyICogNjAgKiA2MCAqIDEwMDApOworICoKKyAqIC8vIGNyZWF0ZSBhIEdyZWdvcmlhbkNhbGVuZGFyIHdpdGggdGhlIFBhY2lmaWMgRGF5bGlnaHQgdGltZSB6b25lCisgKiAvLyBhbmQgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZQorICogQ2FsZW5kYXIgY2FsZW5kYXIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIocGR0KTsKKyAqIERhdGUgdHJpYWxUaW1lID0gbmV3IERhdGUoKTsKKyAqIGNhbGVuZGFyLnNldFRpbWUodHJpYWxUaW1lKTsKKyAqCisgKiAvLyBwcmludCBvdXQgYSBidW5jaCBvZiBpbnRlcmVzdGluZyB0aGluZ3MKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiRVJBOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkVSQSkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJZRUFSOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiTU9OVEg6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTU9OVEgpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiV0VFS19PRl9ZRUFSOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLldFRUtfT0ZfWUVBUikpOworICogU3lzdGVtLm91dC5wcmludGxuKCJXRUVLX09GX01PTlRIOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLldFRUtfT0ZfTU9OVEgpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFURTogIiArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVRFKSk7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oIkRBWV9PRl9NT05USDogIiArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFZX09GX1lFQVI6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX1lFQVIpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFZX09GX1dFRUs6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX1dFRUspKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFZX09GX1dFRUtfSU5fTU9OVEg6ICIKKyAqICAgICAgICAgICAgICAgICAgICArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFS19JTl9NT05USCkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJBTV9QTTogIiArIGNhbGVuZGFyLmdldChDYWxlbmRhci5BTV9QTSkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJIT1VSOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVIpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiSE9VUl9PRl9EQVk6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiTUlOVVRFOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJTRUNPTkQ6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKSk7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oIk1JTExJU0VDT05EOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSk7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oIlpPTkVfT0ZGU0VUOiAiCisgKiAgICAgICAgICAgICAgICAgICAgKyAoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKS8oNjAqNjAqMTAwMCkpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiRFNUX09GRlNFVDogIgorICogICAgICAgICAgICAgICAgICAgICsgKGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKS8oNjAqNjAqMTAwMCkpKTsKKworICogU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IFRpbWUsIHdpdGggaG91ciByZXNldCB0byAzIik7CisgKiBjYWxlbmRhci5jbGVhcihDYWxlbmRhci5IT1VSX09GX0RBWSk7IC8vIHNvIGRvZXNuJ3Qgb3ZlcnJpZGUKKyAqIGNhbGVuZGFyLnNldChDYWxlbmRhci5IT1VSLCAzKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiRVJBOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkVSQSkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJZRUFSOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiTU9OVEg6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTU9OVEgpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiV0VFS19PRl9ZRUFSOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLldFRUtfT0ZfWUVBUikpOworICogU3lzdGVtLm91dC5wcmludGxuKCJXRUVLX09GX01PTlRIOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLldFRUtfT0ZfTU9OVEgpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFURTogIiArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVRFKSk7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oIkRBWV9PRl9NT05USDogIiArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFZX09GX1lFQVI6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX1lFQVIpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFZX09GX1dFRUs6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX1dFRUspKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiREFZX09GX1dFRUtfSU5fTU9OVEg6ICIKKyAqICAgICAgICAgICAgICAgICAgICArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFS19JTl9NT05USCkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJBTV9QTTogIiArIGNhbGVuZGFyLmdldChDYWxlbmRhci5BTV9QTSkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJIT1VSOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVIpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiSE9VUl9PRl9EQVk6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiTUlOVVRFOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSkpOworICogU3lzdGVtLm91dC5wcmludGxuKCJTRUNPTkQ6ICIgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKSk7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oIk1JTExJU0VDT05EOiAiICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSk7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oIlpPTkVfT0ZGU0VUOiAiCisgKiAgICAgICAgKyAoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKS8oNjAqNjAqMTAwMCkpKTsgLy8gaW4gaG91cnMKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiRFNUX09GRlNFVDogIgorICogICAgICAgICsgKGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKS8oNjAqNjAqMTAwMCkpKTsgLy8gaW4gaG91cnMKKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CiAgKiAKICAqIEBzZWUgQ2FsZW5kYXIKICAqIEBzZWUgVGltZVpvbmUKLSAqIEBzZWUgU2ltcGxlVGltZVpvbmUKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBHcmVnb3JpYW5DYWxlbmRhciBleHRlbmRzIENhbGVuZGFyIHsKIApAQCAtMzYsMTEgKzIwMCwxNSBAQAogCiAgICAgLyoqCiAgICAgICogVmFsdWUgZm9yIHRoZSBCQyBlcmEuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkMgPSAwOwogCiAgICAgLyoqCiAgICAgICogVmFsdWUgZm9yIHRoZSBBRCBlcmEuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUQgPSAxOwogICAgIApAQCAtODEsMjMgKzI0OSwyNiBAQAogICAgIHByaXZhdGUgaW50IGxhc3RZZWFyU2tldyA9IDA7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEdyZWdvcmlhbkNhbGVuZGFyIGluaXRpYWxpemVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kCi0gICAgICogdGltZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gaW5pdGlhbGl6ZWQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQKKyAgICAgKiB0aW1lIHdpdGggdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0gYW5kIHtAY29kZSBUaW1lWm9uZX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyKCkgewogICAgICAgICB0aGlzKFRpbWVab25lLmdldERlZmF1bHQoKSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBHcmVnb3JpYW5DYWxlbmRhciBpbml0aWFsaXplZCB0byBtaWRuaWdodCBpbiB0aGUgZGVmYXVsdAotICAgICAqIHRpbWUgem9uZSBvbiB0aGUgc3BlY2lmaWVkIGRhdGUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IGluaXRpYWxpemVkIHRvIG1pZG5pZ2h0IGluIHRoZSBkZWZhdWx0CisgICAgICoge0Bjb2RlIFRpbWVab25lfSBhbmQge0Bjb2RlIExvY2FsZX0gb24gdGhlIHNwZWNpZmllZCBkYXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB5ZWFyCi0gICAgICogICAgICAgICAgICB0aGUgeWVhcgorICAgICAqICAgICAgICAgICAgdGhlIHllYXIuCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgbW9udGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb250aC4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpIHsKICAgICAgICAgc3VwZXIoVGltZVpvbmUuZ2V0RGVmYXVsdCgpLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKQEAgLTEwNSwxOSArMjc2LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBHcmVnb3JpYW5DYWxlbmRhciBpbml0aWFsaXplZCB0byB0aGUgc3BlY2lmaWVkIGRhdGUgYW5kCi0gICAgICogdGltZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0gaW5pdGlhbGl6ZWQgdG8gdGhlIHNwZWNpZmllZCBkYXRlIGFuZAorICAgICAqIHRpbWUgaW4gdGhlIGRlZmF1bHQge0Bjb2RlIFRpbWVab25lfSBhbmQge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHllYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyCisgICAgICogICAgICAgICAgICB0aGUgeWVhci4KICAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIG1vbnRoLgogICAgICAqIEBwYXJhbSBkYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBkYXkgb2YgdGhlIG1vbnRoCisgICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aC4KICAgICAgKiBAcGFyYW0gaG91cgotICAgICAqICAgICAgICAgICAgdGhlIGhvdXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3VyLgogICAgICAqIEBwYXJhbSBtaW51dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW51dGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW51dGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyLCBpbnQgbWludXRlKSB7CiAgICAgICAgIHN1cGVyKFRpbWVab25lLmdldERlZmF1bHQoKSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CkBAIC0xMjUsMjEgKzI5NywyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIgaW5pdGlhbGl6ZWQgdG8gdGhlIHNwZWNpZmllZCBkYXRlIGFuZAotICAgICAqIHRpbWUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IGluaXRpYWxpemVkIHRvIHRoZSBzcGVjaWZpZWQgZGF0ZSBhbmQKKyAgICAgKiB0aW1lIGluIHRoZSBkZWZhdWx0IHtAY29kZSBUaW1lWm9uZX0gYW5kIHtAY29kZSBMb2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB5ZWFyCi0gICAgICogICAgICAgICAgICB0aGUgeWVhcgorICAgICAqICAgICAgICAgICAgdGhlIHllYXIuCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgbW9udGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb250aC4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGguCiAgICAgICogQHBhcmFtIGhvdXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBob3VyCisgICAgICogICAgICAgICAgICB0aGUgaG91ci4KICAgICAgKiBAcGFyYW0gbWludXRlCi0gICAgICogICAgICAgICAgICB0aGUgbWludXRlCisgICAgICogICAgICAgICAgICB0aGUgbWludXRlLgogICAgICAqIEBwYXJhbSBzZWNvbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyLAogICAgICAgICAgICAgaW50IG1pbnV0ZSwgaW50IHNlY29uZCkgewpAQCAtMTUzLDM1ICszMjYsMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEdyZWdvcmlhbkNhbGVuZGFyIGluaXRpYWxpemVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kCi0gICAgICogdGltZSBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IGluaXRpYWxpemVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kCisgICAgICogdGltZSBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgTG9jYWxlfSBhbmQgdGhlIGRlZmF1bHQge0Bjb2RlIFRpbWVab25lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgTG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIExvY2FsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgdGhpcyhUaW1lWm9uZS5nZXREZWZhdWx0KCksIGxvY2FsZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBHcmVnb3JpYW5DYWxlbmRhciBpbml0aWFsaXplZCB0byB0aGUgY3VycmVudCBkYXRlIGFuZAotICAgICAqIHRpbWUgYW5kIHVzaW5nIHRoZSBzcGVjaWZpZWQgVGltZVpvbmUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IGluaXRpYWxpemVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kCisgICAgICogdGltZSBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgVGltZVpvbmV9IGFuZCB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGltZXpvbmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBUaW1lWm9uZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBUaW1lWm9uZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lIHRpbWV6b25lKSB7CiAgICAgICAgIHRoaXModGltZXpvbmUsIExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIgaW5pdGlhbGl6ZWQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQKLSAgICAgKiB0aW1lIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIFRpbWVab25lIGFuZCBMb2NhbGUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IGluaXRpYWxpemVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kCisgICAgICogdGltZSBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgVGltZVpvbmV9IGFuZCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGltZXpvbmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBUaW1lWm9uZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBUaW1lWm9uZX0uCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2NhbGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZSB0aW1lem9uZSwgTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBzdXBlcih0aW1lem9uZSwgbG9jYWxlKTsKQEAgLTE5NSwxNSArMzcxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGFtb3VudCB0byBhIENhbGVuZGFyIGZpZWxkLgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBhbW91bnQgdG8gYSB7QGNvZGUgQ2FsZW5kYXJ9IGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGZpZWxkIHRvIG1vZGlmeQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gZmllbGQgdG8gbW9kaWZ5LgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGFtb3VudCB0byBhZGQgdG8gdGhlIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgYW1vdW50IHRvIGFkZCB0byB0aGUgZmllbGQuCiAgICAgICogCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBzcGVjaWZpZWQgZmllbGQgaXMgRFNUX09GRlNFVCBvciBaT05FX09GRlNFVC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGZpZWxkLCBpbnQgdmFsdWUpIHsKQEAgLTI5OSw5ICs0NzYsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiBHcmVnb3JpYW5DYWxlbmRhciB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMuCisgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyfSB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIEdyZWdvcmlhbkNhbGVuZGFyCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKQEAgLTQzOSw5ICs2MTcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIENhbGVuZGFyIGZpZWxkcyBmcm9tIHRoZSB0aW1lLgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVGaWVsZHMoKSB7CiAgICAgICAgIGludCB6b25lT2Zmc2V0ID0gZ2V0VGltZVpvbmUoKS5nZXRSYXdPZmZzZXQoKTsKQEAgLTU0NCwxMyArNzE5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSB0aW1lIGZyb20gdGhlIENhbGVuZGFyIGZpZWxkcy4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHRpbWUgY2Fubm90IGJlIGNvbXB1dGVkIGZyb20gdGhlIGN1cnJlbnQgZmllbGQKLSAgICAgKiAgICAgICAgICAgICAgICB2YWx1ZXMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlVGltZSgpIHsKICAgICAgICAgaWYgKCFpc0xlbmllbnQoKSkgewpAQCAtODMyLDIwICsxMDAwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBHcmVnb3JpYW5DYWxlbmRhciBhbmQgYW5zd2VyIGlmCi0gICAgICogdGhleSBhcmUgZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBHcmVnb3JpYW5DYWxlbmRhciBhbmQKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHtAY29kZSBPYmplY3R9IHRvIHRoaXMge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyfSBhbmQgcmV0dXJucyB3aGV0aGVyCisgICAgICogdGhleSBhcmUgZXF1YWwuIFRvIGJlIGVxdWFsLCB0aGUge0Bjb2RlIE9iamVjdH0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IGFuZAogICAgICAqIGhhdmUgdGhlIHNhbWUgcHJvcGVydGllcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIEdyZWdvcmlhbkNhbGVuZGFyLAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gdG8gY29tcGFyZSB3aXRoIHRoaXMge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgb2JqZWN0fSBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHRpbWUgaXMgbm90IHNldCBhbmQgdGhlIHRpbWUgY2Fubm90IGJlIGNvbXB1dGVkCi0gICAgICogICAgICAgICAgICAgICAgZnJvbSB0aGUgY3VycmVudCBmaWVsZCB2YWx1ZXMKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICBmcm9tIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlcy4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC04NTgsOCArMTAyNSw5IEBACiAgICAgICogZXhhbXBsZSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgaW4gdGhlIGN1cnJlbnQgbW9udGguCiAgICAgICogCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRBY3R1YWxNYXhpbXVtKGludCBmaWVsZCkgewpAQCAtOTI2LDExICsxMDk0LDEyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkIGZvciB0aGUgY3VycmVudCBkYXRlLiBGb3IKICAgICAgKiB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyLCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzCi0gICAgICogPGNvZGU+Z2V0TWluaW11bSgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgZ2V0TWluaW11bSgpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZAorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEFjdHVhbE1pbmltdW0oaW50IGZpZWxkKSB7CkBAIC05MzksMTEgKzExMDgsMTIgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGdyZWF0ZXN0IG1pbmltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4gRm9yIHRoZSBncmVnb3JpYW4KLSAgICAgKiBjYWxlbmRhciwgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyA8Y29kZT5nZXRNaW5pbXVtKCk8L2NvZGU+LgorICAgICAqIGNhbGVuZGFyLCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHtAY29kZSBnZXRNaW5pbXVtKCl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0R3JlYXRlc3RNaW5pbXVtKGludCBmaWVsZCkgewpAQCAtOTU0LDcgKzExMjQsOCBAQAogICAgICAqIFJldHVybnMgdGhlIGdyZWdvcmlhbiBjaGFuZ2UgZGF0ZSBvZiB0aGlzIGNhbGVuZGFyLiBUaGlzIGlzIHRoZSBkYXRlIG9uCiAgICAgICogd2hpY2ggdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBjYW1lIGludG8gZWZmZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBEYXRlIHdoaWNoIHJlcHJlc2VudHMgdGhlIGdyZWdvcmlhbiBjaGFuZ2UgZGF0ZQorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgRGF0ZX0gd2hpY2ggcmVwcmVzZW50cyB0aGUgZ3JlZ29yaWFuIGNoYW5nZSBkYXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBEYXRlIGdldEdyZWdvcmlhbkNoYW5nZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGdyZWdvcmlhbkN1dG92ZXIpOwpAQCAtOTY1LDggKzExMzYsOSBAQAogICAgICAqIGZvciB0aGUgZGF5IG9mIG1vbnRoIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0TGVhc3RNYXhpbXVtKGludCBmaWVsZCkgewpAQCAtOTg4LDggKzExNjAsOSBAQAogICAgICAqIGZvciB0aGUgZGF5IG9mIG1vbnRoIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bShpbnQgZmllbGQpIHsKQEAgLTEwMDAsOCArMTE3Myw5IEBACiAgICAgICogR2V0cyB0aGUgc21hbGxlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiB0aGUgc21hbGxlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgc21hbGxlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0TWluaW11bShpbnQgZmllbGQpIHsKQEAgLTEwNTksMTEgKzEyMzMsMTIgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCisgICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoLgogICAgICAqIAogICAgICAqIEBzZWUgI2VxdWFscworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC0xMDcyLDExICsxMjQ3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgc3BlY2lmaWVkIHllYXIgaXMgYSBsZWFwIHllYXIuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgeWVhciBpcyBhIGxlYXAgeWVhci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geWVhcgotICAgICAqICAgICAgICAgICAgdGhlIHllYXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB5ZWFyIGlzIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgeWVhciBpcyBhIGxlYXAgeWVhciwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzTGVhcFllYXIoaW50IHllYXIpIHsKICAgICAgICAgaWYgKHllYXIgPiBjaGFuZ2VZZWFyKSB7CkBAIC0xMTA3LDE4ICsxMjg0LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGFtb3VudCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCB3cmFwIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYW1vdW50IHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHdyYXBzIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgKiBmaWVsZCB3aGVuIGl0IGdvZXMgYmV5b25kIHRoZSBtYXhpbXVtIG9yIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBjdXJyZW50CiAgICAgICogZGF0ZS4gT3RoZXIgZmllbGRzIHdpbGwgYmUgYWRqdXN0ZWQgYXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50CiAgICAgICogZGF0ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byByb2xsCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQgdG8gcm9sbC4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBhbW91bnQgdG8gYWRkCisgICAgICogICAgICAgICAgICB0aGUgYW1vdW50IHRvIGFkZC4KICAgICAgKiAKICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gaW52YWxpZCBmaWVsZCBpcyBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIGludmFsaWQgZmllbGQgaXMgc3BlY2lmaWVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJvbGwoaW50IGZpZWxkLCBpbnQgdmFsdWUpIHsKQEAgLTEyMDYsMTkgKzEzODQsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmNyZW1lbnQgb3IgZGVjcmVtZW50IHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHdyYXAgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIEluY3JlbWVudHMgb3IgZGVjcmVtZW50cyB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCB3cmFwcyB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICogZmllbGQgd2hlbiBpdCBnb2VzIGJleW9uZCB0aGUgbWF4aW11bSBvciBtaW5pbXVtIHZhbHVlIGZvciB0aGUgY3VycmVudAogICAgICAqIGRhdGUuIE90aGVyIGZpZWxkcyB3aWxsIGJlIGFkanVzdGVkIGFzIHJlcXVpcmVkIHRvIG1haW50YWluIGEgY29uc2lzdGVudAogICAgICAqIGRhdGUuIEZvciBleGFtcGxlLCBNYXJjaCAzMSB3aWxsIHJvbGwgdG8gQXByaWwgMzAgd2hlbiByb2xsaW5nIHRoZSBtb250aAogICAgICAqIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHRvIHJvbGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byByb2xsLgogICAgICAqIEBwYXJhbSBpbmNyZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRydWUgdG8gaW5jcmVtZW50IHRoZSBmaWVsZCwgZmFsc2UgdG8gZGVjcmVtZW50Ci0gICAgICogCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gaW5jcmVtZW50IHRoZSBmaWVsZCwge0Bjb2RlIGZhbHNlfSB0bworICAgICAqICAgICAgICAgICAgZGVjcmVtZW50LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBpbnZhbGlkIGZpZWxkIGlzIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gaW52YWxpZCBmaWVsZCBpcyBzcGVjaWZpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcm9sbChpbnQgZmllbGQsIGJvb2xlYW4gaW5jcmVtZW50KSB7CkBAIC0xMjI5LDcgKzE0MDgsOCBAQAogICAgICAqIFNldHMgdGhlIGdyZWdvcmlhbiBjaGFuZ2UgZGF0ZSBvZiB0aGlzIGNhbGVuZGFyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRlCi0gICAgICogICAgICAgICAgICBhIERhdGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgZ3JlZ29yaWFuIGNoYW5nZSBkYXRlCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBEYXRlfSB3aGljaCByZXByZXNlbnRzIHRoZSBncmVnb3JpYW4gY2hhbmdlIGRhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0R3JlZ29yaWFuQ2hhbmdlKERhdGUgZGF0ZSkgewogICAgICAgICBncmVnb3JpYW5DdXRvdmVyID0gZGF0ZS5nZXRUaW1lKCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0hhc2hNYXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaE1hcC5qYXZhCmluZGV4IDA0OGM4NTguLjA1NmMxMTMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaE1hcC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaE1hcC5qYXZhCkBAIC0yMyw4ICsyMywxMCBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIEhhc2hNYXAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgTWFwLiBBbGwgb3B0aW9uYWwgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLAotICogYWRkaW5nIGFuZCByZW1vdmluZy4gS2V5cyBhbmQgdmFsdWVzIGNhbiBiZSBhbnkgb2JqZWN0cy4KKyAqIEhhc2hNYXAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgTWFwLiBBbGwgb3B0aW9uYWwgb3BlcmF0aW9ucyAoYWRkaW5nIGFuZAorICogcmVtb3ZpbmcpIGFyZSBzdXBwb3J0ZWQuIEtleXMgYW5kIHZhbHVlcyBjYW4gYmUgYW55IG9iamVjdHMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSGFzaE1hcDxLLCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+LAogICAgICAgICBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7CkBAIC05Myw3ICs5NSw2IEBACiAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIEVudHJ5PEtULCBWVD5bXSBlbGVtZW50RGF0YSA9IGFzc29jaWF0ZWRNYXAuZWxlbWVudERhdGE7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZWxlbWVudERhdGEubGVuZ3RoOwpAQCAtMjI3LDMzICsyMjgsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBlbGVtZW50IGFycmF5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcwotICAgICAqIEByZXR1cm4gUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGFycmF5Ci0gICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgRW50cnk8SywgVj5bXSBuZXdFbGVtZW50QXJyYXkoaW50IHMpIHsKICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVtzXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGluc3RhbmNlIG9mIEhhc2hNYXAuCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IHtAY29kZSBIYXNoTWFwfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSGFzaE1hcCgpIHsKICAgICAgICAgdGhpcyhERUZBVUxUX1NJWkUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgSGFzaE1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBIYXNoTWFwfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGlzIEhhc2hNYXAKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHplcm8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgaGFzaCBtYXAuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSGFzaE1hcChpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5ID49IDApIHsKQEAgLTI2NywxOCArMjYzLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBIYXNoTWFwIHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eSBhbmQgbG9hZAotICAgICAqIGZhY3Rvci4KLSAgICAgKgotICAgICAqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSGFzaE1hcH0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5IGFuZAorICAgICAqIGxvYWQgZmFjdG9yLgorICAgICAqIAogICAgICAqIEBwYXJhbSBjYXBhY2l0eQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgaGFzaCBtYXAuCiAgICAgICogQHBhcmFtIGxvYWRGYWN0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGxvYWQgZmFjdG9yCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgbG9hZCBmYWN0b3IuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gemVybyBvciB0aGUgbG9hZCBmYWN0b3IgaXMKLSAgICAgKiAgICAgICAgICAgICAgICBsZXNzIG9yIGVxdWFsIHRvIHplcm8KKyAgICAgKiAgICAgICAgICAgICAgICBsZXNzIG9yIGVxdWFsIHRvIHplcm8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEhhc2hNYXAoaW50IGNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CiAgICAgICAgIGlmIChjYXBhY2l0eSA+PSAwICYmIGxvYWRGYWN0b3IgPiAwKSB7CkBAIC0yOTIsMTEgKzI4NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgSGFzaE1hcCBjb250YWluaW5nIHRoZSBtYXBwaW5ncyBmcm9tIHRoZQotICAgICAqIHNwZWNpZmllZCBNYXAuCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBIYXNoTWFwfSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBtYXBwaW5ncyBmcm9tCisgICAgICogdGhlIHNwZWNpZmllZCBtYXAuCisgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIG1hcHBpbmdzIHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIG1hcHBpbmdzIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSGFzaE1hcChNYXA8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPiBtYXApIHsKICAgICAgICAgdGhpcyhtYXAuc2l6ZSgpIDwgNiA/IDExIDogbWFwLnNpemUoKSAqIDIpOwpAQCAtMzA0LDEwICszMDAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgSGFzaE1hcCwgbGVhdmluZyBpdCBlbXB0eS4KLSAgICAgKgorICAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBoYXNoIG1hcCwgbGVhdmluZyBpdCBlbXB0eS4KKyAgICAgKiAKICAgICAgKiBAc2VlICNpc0VtcHR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewpAQCAtMzE5LDE2ICszMTYsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEhhc2hNYXAgd2l0aCB0aGUgc2FtZSBtYXBwaW5ncyBhbmQgc2l6ZSBhcyB0aGlzIEhhc2hNYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgSGFzaE1hcAotICAgICAqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgICAgICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG1hcC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIEhhc2hNYXA8SywgVj4gbWFwID0gKEhhc2hNYXA8SywgVj4pIHN1cGVyLmNsb25lKCk7CiAgICAgICAgICAgICBtYXAuZWxlbWVudENvdW50ID0gMDsKICAgICAgICAgICAgIG1hcC5lbGVtZW50RGF0YSA9IG5ld0VsZW1lbnRBcnJheShlbGVtZW50RGF0YS5sZW5ndGgpOwpAQCAtMzQxLDYgKzMzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0SW1wbChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbWFwOwogICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CkBAIC0zNTMsMTIgKzM1MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgSGFzaE1hcCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICoKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgYSBrZXkgb2YgdGhpcyBIYXNoTWFwLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXksCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CkBAIC0zNzQsMTIgKzM3MywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgSGFzaE1hcCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyBhIHZhbHVlIG9mIHRoaXMgSGFzaE1hcCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CkBAIC00MDgsMTEgKzQwOCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTZXQgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIEhhc2hNYXAuIEVhY2ggZWxlbWVudCBpbgotICAgICAqIHRoZSBzZXQgaXMgYSBNYXAuRW50cnkuIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgSGFzaE1hcCBzbyBjaGFuZ2VzIHRvCi0gICAgICogb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUgc2V0IGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBhIFNldCBvZiB0aGUgbWFwcGluZ3MKKyAgICAgKiBSZXR1cm5zIGEgc2V0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4gRWFjaCBtYXBwaW5nIGlzCisgICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1hcC5FbnRyeX0uIEFzIHRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgbWFwLAorICAgICAqIGNoYW5nZXMgaW4gb25lIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBvdGhlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBtYXBwaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CkBAIC00MjAsMTIgKzQyMSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuIElmIG5vIGVudHJ5IGlzCi0gICAgICogZm91bmQgbnVsbCBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICBlbnRyeSBkb2Vzbid0IGV4aXN0LgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIG5vIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGlzIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBWIGdldChPYmplY3Qga2V5KSB7CkBAIC00NDYsOSArNDQ4LDYgQEAKICAgICBmaW5hbCBFbnRyeTxLLFY+IGZpbmROb25OdWxsS2V5RW50cnkoT2JqZWN0IGtleSwgaW50IGluZGV4LCBpbnQga2V5SGFzaCkgewogICAgICAgICBFbnRyeTxLLFY+IG0gPSBlbGVtZW50RGF0YVtpbmRleF07CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAotLy8gICAgICAgIHdoaWxlIChtICE9IG51bGwgJiYgKG0ub3JpZ0tleUhhc2ggIT0ga2V5SGFzaCB8fCAha2V5LmVxdWFscyhtLmtleSkpKSB7Ci0vLyAgICAgICAgICAgIG0gPSBtLm5leHQ7Ci0vLyAgICAgICAgfQogICAgICAgICB3aGlsZSAobSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobS5vcmlnS2V5SGFzaCA9PSBrZXlIYXNoKSB7CiAgICAgICAgICAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIFN0cmluZykgewpAQCAtNDc2LDExICs0NzUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgSGFzaE1hcCBoYXMgbm8gZWxlbWVudHMsIGEgc2l6ZSBvZiB6ZXJvLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgSGFzaE1hcCBoYXMgbm8gZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqCi0gICAgICogQHNlZSAjc2l6ZQorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBpcyBlbXB0eS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBoYXMgbm8gZWxlbWVudHMsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNzaXplKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewpAQCAtNDg4LDExICs0ODgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIEhhc2hNYXAuIFRoZSBzZXQgaXMgYmFja2VkIGJ5Ci0gICAgICogdGhpcyBIYXNoTWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUgc2V0IGRvZXMKLSAgICAgKiBub3Qgc3VwcG9ydCBhZGRpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU2V0IG9mIHRoZSBrZXlzCisgICAgICogUmV0dXJucyBhIHNldCBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZSBzZXQgaXMgYmFja2VkIGJ5CisgICAgICogdGhpcyBtYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZSBzZXQgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IGFkZGluZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgewpAQCAtNTM1LDIwICs1MzYsMjEgQEAKIAogICAgIC8qKgogICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBhbnkgcHJldmlvdXMgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IG9yIG51bGwKLSAgICAgKiAgICAgICAgIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBzdWNoIG1hcHBpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgcHV0KEsga2V5LCBWIHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBwdXRJbXBsKGtleSwgdmFsdWUpOwogICAgIH0KIAotICAgIFYgcHV0SW1wbChLIGtleSwgViB2YWx1ZSkgeworICAgIHByaXZhdGUgViBwdXRJbXBsKEsga2V5LCBWIHZhbHVlKSB7CiAgICAgICAgIEVudHJ5PEssVj4gZW50cnk7CiAgICAgICAgIGlmKGtleSA9PSBudWxsKSB7CiAgICAgICAgICAgICBlbnRyeSA9IGZpbmROdWxsS2V5RW50cnkoKTsKQEAgLTU5MywxNCArNTk1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29waWVzIGFsbCB0aGUgbWFwcGluZ3MgaW4gdGhlIGdpdmVuIG1hcCB0byB0aGlzIG1hcC4gVGhlc2UgbWFwcGluZ3Mgd2lsbAotICAgICAqIHJlcGxhY2UgYWxsIG1hcHBpbmdzIHRoYXQgdGhpcyBtYXAgaGFkIGZvciBhbnkgb2YgdGhlIGtleXMgY3VycmVudGx5IGluCi0gICAgICogdGhlIGdpdmVuIG1hcC4KLSAgICAgKgorICAgICAqIENvcGllcyBhbGwgdGhlIG1hcHBpbmdzIGluIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgbWFwLiBUaGVzZSBtYXBwaW5ncworICAgICAqIHdpbGwgcmVwbGFjZSBhbGwgbWFwcGluZ3MgdGhhdCB0aGlzIG1hcCBoYWQgZm9yIGFueSBvZiB0aGUga2V5cyBjdXJyZW50bHkKKyAgICAgKiBpbiB0aGUgZ2l2ZW4gbWFwLgorICAgICAqIAogICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBNYXAgdG8gY29weSBtYXBwaW5ncyBmcm9tCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBtYXAgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG1hcCB0byBjb3B5IG1hcHBpbmdzIGZyb20uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgewpAQCAtNjQyLDEyICs2NDMsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBIYXNoTWFwLgotICAgICAqCisgICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBtYXAuCisgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBtYXBwaW5nIG9yIG51bGwgaWYga2V5IGlzIG5vdCBhIGtleSBpbgotICAgICAqICAgICAgICAgdGhpcyBIYXNoTWFwCisgICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBtYXBwaW5nIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBtYXBwaW5nIG9yIHtAY29kZSBudWxsfSBpZiBubyBtYXBwaW5nCisgICAgICogICAgICAgICBmb3IgdGhlIHNwZWNpZmllZCBrZXkgd2FzIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBWIHJlbW92ZShPYmplY3Qga2V5KSB7CkBAIC02OTEsOSArNjkzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHRoaXMgSGFzaE1hcC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtYXBwaW5ncyBpbiB0aGlzIEhhc2hNYXAKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBtYXAuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKQEAgLTcwMSwxMSArNzA0LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBIYXNoTWFwLiBUaGUKLSAgICAgKiBjb2xsZWN0aW9uIGlzIGJhY2tlZCBieSB0aGlzIEhhc2hNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieQotICAgICAqIHRoZSBvdGhlci4gVGhlIGNvbGxlY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZSBjb2xsZWN0aW9uCisgICAgICogaXMgYmFja2VkIGJ5IHRoaXMgbWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUKKyAgICAgKiBjb2xsZWN0aW9uIHN1cHBvcnRzIHJlbW92ZSwgcmVtb3ZlQWxsLCByZXRhaW5BbGwgYW5kIGNsZWFyIG9wZXJhdGlvbnMsCisgICAgICogYW5kIGl0IGRvZXMgbm90IHN1cHBvcnQgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBjb2xsZWN0aW9uIHdoaWNoIGlzIHRoZSBzdWJjbGFzcyBvZgorICAgICAqIEFic3RyYWN0Q29sbGVjdGlvbi4gVGhlIGl0ZXJhdG9yIG1ldGhvZCBvZiB0aGlzIHN1YmNsYXNzIHJldHVybnMgYQorICAgICAqICJ3cmFwcGVyIG9iamVjdCIgb3ZlciB0aGUgaXRlcmF0b3Igb2YgbWFwJ3MgZW50cnlTZXQoKS4gVGhlIHtAY29kZSBzaXplfQorICAgICAqIG1ldGhvZCB3cmFwcyB0aGUgbWFwJ3Mgc2l6ZSBtZXRob2QgYW5kIHRoZSB7QGNvZGUgY29udGFpbnN9IG1ldGhvZCB3cmFwcworICAgICAqIHRoZSBtYXAncyBjb250YWluc1ZhbHVlIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgKiBhbmQgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gYWxsIHN1YnNlcXVlbnQgY2FsbHMuIFRoaXMgbWV0aG9kIG1heSByZXR1cm4KKyAgICAgKiBkaWZmZXJlbnQgY29sbGVjdGlvbnMgd2hlbiBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIG9jY3VyLCBzaW5jZSBubworICAgICAqIHN5bmNocm9uaXphdGlvbiBpcyBwZXJmb3JtZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaFNldC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9IYXNoU2V0LmphdmEKaW5kZXggZjM3ODI3Zi4uZmU4OTEwOSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9IYXNoU2V0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9IYXNoU2V0LmphdmEKQEAgLTI0LDggKzI0LDEwIEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogSGFzaFNldCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBTZXQuIEFsbCBvcHRpb25hbCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQsCi0gKiBhZGRpbmcgYW5kIHJlbW92aW5nLiBUaGUgZWxlbWVudHMgY2FuIGJlIGFueSBvYmplY3RzLgorICogSGFzaFNldCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFNldC4gQWxsIG9wdGlvbmFsIG9wZXJhdGlvbnMgKGFkZGluZyBhbmQKKyAqIHJlbW92aW5nKSBhcmUgc3VwcG9ydGVkLiBUaGUgZWxlbWVudHMgY2FuIGJlIGFueSBvYmplY3RzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEhhc2hTZXQ8RT4gZXh0ZW5kcyBBYnN0cmFjdFNldDxFPiBpbXBsZW1lbnRzIFNldDxFPiwgQ2xvbmVhYmxlLAogICAgICAgICBTZXJpYWxpemFibGUgewpAQCAtMzUsNDEgKzM3LDQ2IEBACiAgICAgdHJhbnNpZW50IEhhc2hNYXA8RSwgSGFzaFNldDxFPj4gYmFja2luZ01hcDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgSGFzaFNldC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGluc3RhbmNlIG9mIHtAY29kZSBIYXNoU2V0fS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSGFzaFNldCgpIHsKICAgICAgICAgdGhpcyhuZXcgSGFzaE1hcDxFLCBIYXNoU2V0PEU+PigpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIEhhc2hTZXQgd2l0aCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEhhc2hTZXR9IHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgSGFzaFNldAorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhpcyB7QGNvZGUgSGFzaFNldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEhhc2hTZXQoaW50IGNhcGFjaXR5KSB7CiAgICAgICAgIHRoaXMobmV3IEhhc2hNYXA8RSwgSGFzaFNldDxFPj4oY2FwYWNpdHkpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIEhhc2hTZXQgd2l0aCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5IGFuZCBsb2FkCi0gICAgICogZmFjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEhhc2hTZXR9IHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eQorICAgICAqIGFuZCBsb2FkIGZhY3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5CisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eS4KICAgICAgKiBAcGFyYW0gbG9hZEZhY3RvcgotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgbG9hZCBmYWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGxvYWQgZmFjdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBIYXNoU2V0KGludCBjYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewogICAgICAgICB0aGlzKG5ldyBIYXNoTWFwPEUsIEhhc2hTZXQ8RT4+KGNhcGFjaXR5LCBsb2FkRmFjdG9yKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBIYXNoU2V0IGNvbnRhaW5pbmcgdGhlIHVuaXF1ZSBlbGVtZW50cyBpbgotICAgICAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBIYXNoU2V0fSBjb250YWluaW5nIHRoZSB1bmlxdWUKKyAgICAgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBIYXNoU2V0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKICAgICAgICAgdGhpcyhuZXcgSGFzaE1hcDxFLCBIYXNoU2V0PEU+Pihjb2xsZWN0aW9uLnNpemUoKSA8IDYgPyAxMSA6IGNvbGxlY3Rpb24uc2l6ZSgpICogMikpOwpAQCAtODMsMTIgKzkwLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIEhhc2hTZXQuCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIHtAY29kZSBIYXNoU2V0fSBpZiBub3QgYWxyZWFkeSBwcmVzZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhpcyBIYXNoU2V0IGRpZCBub3QgYWxyZWFkeSBjb250YWluIHRoZSBvYmplY3QsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhpcyB7QGNvZGUgSGFzaFNldH0gZGlkIG5vdCBhbHJlYWR5IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIHRoZSBvYmplY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KSB7CkBAIC05NiwxMCArMTA0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIEhhc2hTZXQsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBIYXNoU2V0fSwgbGVhdmluZyBpdCBlbXB0eS4KICAgICAgKiAKICAgICAgKiBAc2VlICNpc0VtcHR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewpAQCAtMTA3LDExICsxMTYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEhhc2hTZXQgd2l0aCB0aGUgc2FtZSBlbGVtZW50cyBhbmQgc2l6ZSBhcyB0aGlzIEhhc2hTZXQuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgSGFzaFNldH0gd2l0aCB0aGUgc2FtZSBlbGVtZW50cyBhbmQgc2l6ZSBhcyB0aGlzCisgICAgICoge0Bjb2RlIEhhc2hTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBIYXNoU2V0Ci0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBIYXNoU2V0fS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTEyNiwxMiArMTM2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBIYXNoU2V0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBTZWFyY2hlcyB0aGlzIHtAY29kZSBIYXNoU2V0fSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgYW4gZWxlbWVudCBvZiB0aGlzIEhhc2hTZXQsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgb2JqZWN0fSBpcyBhbiBlbGVtZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBIYXNoU2V0fSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgewpAQCAtMTM5LDExICsxNTAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgSGFzaFNldCBoYXMgbm8gZWxlbWVudHMsIGEgc2l6ZSBvZiB6ZXJvLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHtAY29kZSBIYXNoU2V0fSBoYXMgbm8gZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBIYXNoU2V0IGhhcyBubyBlbGVtZW50cywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgSGFzaFNldH0gaGFzIG5vIGVsZW1lbnRzLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CkBAIC0xNTEsMTEgKzE2MywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgSGFzaFNldC4KKyAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBIYXNoU2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIEhhc2hTZXQKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBIYXNoU2V0fS4KICAgICAgKiBAc2VlIEl0ZXJhdG9yCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewpAQCAtMTYzLDExICsxNzUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGlzIEhhc2hTZXQuCisgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMge0Bjb2RlIEhhc2hTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgSGFzaFNldCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IHdhcyByZW1vdmVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewpAQCAtMTc1LDkgKzE4OCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIEhhc2hTZXQuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIEhhc2hTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIEhhc2hTZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyB7QGNvZGUgSGFzaFNldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBzaXplKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9IYXNodGFibGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaHRhYmxlLmphdmEKaW5kZXggZWVmMThlZC4uYWJlZGUyZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9IYXNodGFibGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0hhc2h0YWJsZS5qYXZhCkBAIC0yNSwxNyArMjUsMTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogSGFzaHRhYmxlIGFzc29jaWF0ZXMga2V5cyB3aXRoIHZhbHVlcy4gS2V5cyBhbmQgdmFsdWVzIGNhbm5vdCBiZSBudWxsLiBUaGUKLSAqIHNpemUgb2YgdGhlIEhhc2h0YWJsZSBpcyB0aGUgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyBpdCBjb250YWlucy4gVGhlCisgKiBIYXNodGFibGUgYXNzb2NpYXRlcyBrZXlzIHdpdGggdmFsdWVzLiBCb3RoIGtleXMgYW5kIHZhbHVlcyBjYW5ub3QgYmUgbnVsbC4KKyAqIFRoZSBzaXplIG9mIHRoZSBIYXNodGFibGUgaXMgdGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgaXQgY29udGFpbnMuIFRoZQogICogY2FwYWNpdHkgaXMgdGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgdGhlIEhhc2h0YWJsZSBjYW4gaG9sZC4gVGhlIGxvYWQKICAqIGZhY3RvciBpcyBhIGZsb2F0IHZhbHVlIHdoaWNoIGRldGVybWluZXMgaG93IGZ1bGwgdGhlIEhhc2h0YWJsZSBnZXRzIGJlZm9yZQogICogZXhwYW5kaW5nIHRoZSBjYXBhY2l0eS4gSWYgdGhlIGxvYWQgZmFjdG9yIG9mIHRoZSBIYXNodGFibGUgaXMgZXhjZWVkZWQsIHRoZQogICogY2FwYWNpdHkgaXMgZG91YmxlZC4KLSAqCisgKiAKICAqIEBzZWUgRW51bWVyYXRpb24KICAqIEBzZWUgamF2YS5pby5TZXJpYWxpemFibGUKICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMKICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIAogcHVibGljIGNsYXNzIEhhc2h0YWJsZTxLLCBWPiBleHRlbmRzIERpY3Rpb25hcnk8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4sCkBAIC0yNTQsMTggKzI1NSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSGFzaHRhYmxlIHVzaW5nIHRoZSBkZWZhdWx0IGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBIYXNodGFibGV9IHVzaW5nIHRoZSBkZWZhdWx0IGNhcGFjaXR5IGFuZCBsb2FkCisgICAgICogZmFjdG9yLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBIYXNodGFibGUoKSB7CiAgICAgICAgIHRoaXMoMTEpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSGFzaHRhYmxlIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgYW5kIHRoZSBkZWZhdWx0Ci0gICAgICogbG9hZCBmYWN0b3IuCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBIYXNodGFibGV9IHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgYW5kIHRoZQorICAgICAqIGRlZmF1bHQgbG9hZCBmYWN0b3IuCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eQorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEhhc2h0YWJsZShpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5ID49IDApIHsKQEAgLTI4MCwxMiArMjg1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBIYXNodGFibGUgdXNpbmcgdGhlIHNwZWNpZmllZCBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBIYXNodGFibGV9IHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgYW5kIGxvYWQKKyAgICAgKiBmYWN0b3IuCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eQorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkuCiAgICAgICogQHBhcmFtIGxvYWRGYWN0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGxvYWQgZmFjdG9yCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBsb2FkIGZhY3Rvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSGFzaHRhYmxlKGludCBjYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewogICAgICAgICBpZiAoY2FwYWNpdHkgPj0gMCAmJiBsb2FkRmFjdG9yID4gMCkgewpAQCAtMzAwLDExICszMDcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIEhhc2h0YWJsZSBjb250YWluaW5nIHRoZSBtYXBwaW5ncyBmcm9tIHRoZQotICAgICAqIHNwZWNpZmllZCBNYXAuCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBIYXNodGFibGV9IGNvbnRhaW5pbmcgdGhlIG1hcHBpbmdzCisgICAgICogZnJvbSB0aGUgc3BlY2lmaWVkIG1hcC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICB0aGUgbWFwcGluZ3MgdG8gYWRkCisgICAgICogICAgICAgICAgICB0aGUgbWFwcGluZ3MgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBIYXNodGFibGUoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbWFwKSB7CiAgICAgICAgIHRoaXMobWFwLnNpemUoKSA8IDYgPyAxMSA6IChtYXAuc2l6ZSgpICogNCAvIDMpICsgMTEpOwpAQCAtMzE3LDExICszMjUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGlzIEhhc2h0YWJsZSwgbGVhdmluZyB0aGUgc2l6ZSB6ZXJvCi0gICAgICogYW5kIHRoZSBjYXBhY2l0eSB1bmNoYW5nZWQuCi0gICAgICoKKyAgICAgKiBSZW1vdmVzIGFsbCBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGlzIHtAY29kZSBIYXNodGFibGV9LCBsZWF2aW5nIHRoZQorICAgICAqIHNpemUgemVybyBhbmQgdGhlIGNhcGFjaXR5IHVuY2hhbmdlZC4KKyAgICAgKiAKICAgICAgKiBAc2VlICNpc0VtcHR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKICAgICAgICAgZWxlbWVudENvdW50ID0gMDsKQEAgLTMzMCwxMiArMzM5LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBIYXNodGFibGUgd2l0aCB0aGUgc2FtZSBrZXkvdmFsdWUgcGFpcnMsIGNhcGFjaXR5IGFuZCBsb2FkCi0gICAgICogZmFjdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIEhhc2h0YWJsZQotICAgICAqCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgSGFzaHRhYmxlfSB3aXRoIHRoZSBzYW1lIGtleS92YWx1ZSBwYWlycywgY2FwYWNpdHkKKyAgICAgKiBhbmQgbG9hZCBmYWN0b3IuCisgICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBIYXNodGFibGV9LgogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtMzYwLDE1ICszNjksMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgSGFzaHRhYmxlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIHRoZSB2YWx1ZSBvZgotICAgICAqIGF0IGxlYXN0IG9uZSBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzLgotICAgICAqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMge0Bjb2RlIEhhc2h0YWJsZX0gY29udGFpbnMgdGhlIHNwZWNpZmllZCBvYmplY3QgYXMKKyAgICAgKiB0aGUgdmFsdWUgb2YgYXQgbGVhc3Qgb25lIG9mIHRoZSBrZXkvdmFsdWUgcGFpcnMuCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yIGFzIGEgdmFsdWUgaW4gdGhpcyBIYXNodGFibGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqZWN0IGlzIGEgdmFsdWUgaW4gdGhpcyBIYXNodGFibGUsIGZhbHNlIG90aGVyd2lzZQotICAgICAqCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yIGFzIGEgdmFsdWUgaW4gdGhpcyB7QGNvZGUgSGFzaHRhYmxlfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvYmplY3QgaXMgYSB2YWx1ZSBpbiB0aGlzIHtAY29kZSBIYXNodGFibGV9LAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjY29udGFpbnNLZXkKICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zKE9iamVjdCB2YWx1ZSkgewogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewpAQCAtMzg4LDQyICszOTgsNDQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgSGFzaHRhYmxlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEga2V5IG9mIG9uZQotICAgICAqIG9mIHRoZSBrZXkvdmFsdWUgcGFpcnMuCi0gICAgICoKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB7QGNvZGUgSGFzaHRhYmxlfSBjb250YWlucyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhCisgICAgICoga2V5IG9mIG9uZSBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gbG9vayBmb3IgYXMgYSBrZXkgaW4gdGhpcyBIYXNodGFibGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqZWN0IGlzIGEga2V5IGluIHRoaXMgSGFzaHRhYmxlLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBsb29rIGZvciBhcyBhIGtleSBpbiB0aGlzIHtAY29kZSBIYXNodGFibGV9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG9iamVjdCBpcyBhIGtleSBpbiB0aGlzIHtAY29kZSBIYXNodGFibGV9LAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjY29udGFpbnMKICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKICAgICAgICAgcmV0dXJuIGdldEVudHJ5KGtleSkgIT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIEhhc2h0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKgorICAgICAqIFNlYXJjaGVzIHRoaXMge0Bjb2RlIEhhc2h0YWJsZX0gZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIGEgdmFsdWUgb2YgdGhpcyBIYXNodGFibGUsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgdmFsdWV9IGlzIGEgdmFsdWUgb2YgdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIEhhc2h0YWJsZX0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBjb250YWlucyh2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBvbiB0aGUgdmFsdWVzIG9mIHRoaXMgSGFzaHRhYmxlLiBUaGUgcmVzdWx0cyBvZgotICAgICAqIHRoZSBFbnVtZXJhdGlvbiBtYXkgYmUgYWZmZWN0ZWQgaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgSGFzaHRhYmxlIGFyZQotICAgICAqIG1vZGlmaWVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBFbnVtZXJhdGlvbiBvZiB0aGUgdmFsdWVzIG9mIHRoaXMgSGFzaHRhYmxlCi0gICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9uIHRoZSB2YWx1ZXMgb2YgdGhpcyB7QGNvZGUgSGFzaHRhYmxlfS4gVGhlCisgICAgICogcmVzdWx0cyBvZiB0aGUgRW51bWVyYXRpb24gbWF5IGJlIGFmZmVjdGVkIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzCisgICAgICoge0Bjb2RlIEhhc2h0YWJsZX0gYXJlIG1vZGlmaWVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIHZhbHVlcyBvZiB0aGlzIHtAY29kZSBIYXNodGFibGV9LgogICAgICAqIEBzZWUgI2tleXMKICAgICAgKiBAc2VlICNzaXplCiAgICAgICogQHNlZSBFbnVtZXJhdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtNDM1LDExICs0NDcsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2V0IG9mIHRoZSBtYXBwaW5ncyBjb250YWluZWQgaW4gdGhpcyBIYXNodGFibGUuIEVhY2ggZWxlbWVudAotICAgICAqIGluIHRoZSBzZXQgaXMgYSBNYXAuRW50cnkuIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgSGFzaHRhYmxlIHNvIGNoYW5nZXMKLSAgICAgKiB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZSBzZXQgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU2V0IG9mIHRoZSBtYXBwaW5ncworICAgICAqIFJldHVybnMgYSBzZXQgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIHtAY29kZSBIYXNodGFibGV9LiBFYWNoCisgICAgICogZWxlbWVudCBpbiB0aGUgc2V0IGlzIGEge0BsaW5rIE1hcC5FbnRyeX0uIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMKKyAgICAgKiB7QGNvZGUgSGFzaHRhYmxlfSBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIHNldAorICAgICAqIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgdGhlIG1hcHBpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9ucy5TeW5jaHJvbml6ZWRTZXQ8TWFwLkVudHJ5PEssIFY+PigKQEAgLTQ5NCwxNiArNTA4LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBIYXNodGFibGUgYW5kIGFuc3dlciBpZiB0aGV5IGFyZQotICAgICAqIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTWFwIGFuZCBjb250YWluIHRoZSBzYW1lCi0gICAgICoga2V5L3ZhbHVlIHBhaXJzLgotICAgICAqCisgICAgICogQ29tcGFyZXMgdGhpcyB7QGNvZGUgSGFzaHRhYmxlfSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBpbmRpY2F0ZXMKKyAgICAgKiBpZiB0aGV5IGFyZSBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvYmplY3R9IG11c3QgYmUgYW4KKyAgICAgKiBpbnN0YW5jZSBvZiBNYXAgYW5kIGNvbnRhaW4gdGhlIHNhbWUga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgTWFwLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgTWFwLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTUyOCwxNCArNTQyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgSGFzaHRhYmxlLgotICAgICAqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMKKyAgICAgKiB7QGNvZGUgSGFzaHRhYmxlfS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSB2YWx1ZSByZXR1cm5lZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCBrZXkgZG9lcyBub3QgZXhpc3QKLSAgICAgKgorICAgICAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LgogICAgICAqIEBzZWUgI3B1dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgViBnZXQoT2JqZWN0IGtleSkgewpAQCAtNTY0LDE0ICs1NzksNiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqCi0gICAgICogQHNlZSAjZXF1YWxzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCByZXN1bHQgPSAwOwpAQCAtNTg5LDExICs1OTYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgSGFzaHRhYmxlIGhhcyBubyBrZXkvdmFsdWUgcGFpcnMsIGEgc2l6ZSBvZiB6ZXJvLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgSGFzaHRhYmxlIGhhcyBubyBrZXkvdmFsdWUgcGFpcnMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMge0Bjb2RlIEhhc2h0YWJsZX0gaGFzIG5vIGtleS92YWx1ZSBwYWlycy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBIYXNodGFibGV9IGhhcyBubyBrZXkvdmFsdWUgcGFpcnMsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRW1wdHkoKSB7CkBAIC02MDEsMTUgKzYwOSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gb24gdGhlIGtleXMgb2YgdGhpcyBIYXNodGFibGUuIFRoZSByZXN1bHRzIG9mIHRoZQotICAgICAqIEVudW1lcmF0aW9uIG1heSBiZSBhZmZlY3RlZCBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBIYXNodGFibGUgYXJlCi0gICAgICogbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uIG9mIHRoZSBrZXlzIG9mIHRoaXMgSGFzaHRhYmxlCi0gICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9uIHRoZSBrZXlzIG9mIHRoaXMge0Bjb2RlIEhhc2h0YWJsZX0gaW5zdGFuY2UuCisgICAgICogVGhlIHJlc3VsdHMgb2YgdGhlIGVudW1lcmF0aW9uIG1heSBiZSBhZmZlY3RlZCBpZiB0aGUgY29udGVudHMgb2YgdGhpcworICAgICAqIHtAY29kZSBIYXNodGFibGV9IGFyZSBtb2RpZmllZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBrZXlzIG9mIHRoaXMge0Bjb2RlIEhhc2h0YWJsZX0uCiAgICAgICogQHNlZSAjZWxlbWVudHMKICAgICAgKiBAc2VlICNzaXplCiAgICAgICogQHNlZSBFbnVtZXJhdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtNjIxLDExICs2MjksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIEhhc2h0YWJsZS4gVGhlIHNldCBpcyBiYWNrZWQKLSAgICAgKiBieSB0aGlzIEhhc2h0YWJsZSBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIHNldAotICAgICAqIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBhIFNldCBvZiB0aGUga2V5cworICAgICAqIFJldHVybnMgYSBzZXQgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMge0Bjb2RlIEhhc2h0YWJsZX0uIFRoZSBzZXQKKyAgICAgKiBpcyBiYWNrZWQgYnkgdGhpcyB7QGNvZGUgSGFzaHRhYmxlfSBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5CisgICAgICogdGhlIG90aGVyLiBUaGUgc2V0IGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgdGhlIGtleXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNldDxLPiBrZXlTZXQoKSB7CiAgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbnMuU3luY2hyb25pemVkU2V0PEs+KG5ldyBBYnN0cmFjdFNldDxLPigpIHsKQEAgLTY3MSwyMSArNjgwLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIEhhc2h0YWJsZS4KLSAgICAgKiBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgb2xkIHZhbHVlIGlzIHJlcGxhY2VkLiBUaGUga2V5IGFuZCB2YWx1ZQotICAgICAqIGNhbm5vdCBiZSBudWxsLgotICAgICAqCisgICAgICogQXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzCisgICAgICoge0Bjb2RlIEhhc2h0YWJsZX0uIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBvbGQgdmFsdWUgaXMgcmVwbGFjZWQuCisgICAgICogVGhlIGtleSBhbmQgdmFsdWUgY2Fubm90IGJlIG51bGwuCisgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBhZGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gYWRkLgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGFkZAotICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG51bGwgaWYgdGhlIGtleQotICAgICAqICAgICAgICAgZGlkIG5vdCBleGlzdAotICAgICAqCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYWRkLgorICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgdGhlIGtleSBkaWQgbm90IGV4aXN0LgogICAgICAqIEBzZWUgI2VsZW1lbnRzCiAgICAgICogQHNlZSAjZ2V0CiAgICAgICogQHNlZSAja2V5cwogICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFYgcHV0KEsga2V5LCBWIHZhbHVlKSB7CkBAIC03MjEsMTAgKzczMCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyBldmVyeSBtYXBwaW5nIGluIHRoZSBzcGVjaWZpZWQgTWFwIHRvIHRoaXMgSGFzaHRhYmxlLgotICAgICAqCisgICAgICogQ29waWVzIGV2ZXJ5IG1hcHBpbmcgdG8gdGhpcyB7QGNvZGUgSGFzaHRhYmxlfSBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwLgorICAgICAqIAogICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBNYXAgdG8gY29weSBtYXBwaW5ncyBmcm9tCisgICAgICogICAgICAgICAgICB0aGUgbWFwIHRvIGNvcHkgbWFwcGluZ3MgZnJvbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgewogICAgICAgICBmb3IgKE1hcC5FbnRyeTw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKQEAgLTczMyw4ICs3NDMsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmNyZWFzZXMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgSGFzaHRhYmxlLiBUaGlzIG1ldGhvZCBpcyBzZW50IHdoZW4gdGhlCi0gICAgICogc2l6ZSBvZiB0aGlzIEhhc2h0YWJsZSBleGNlZWRzIHRoZSBsb2FkIGZhY3Rvci4KKyAgICAgKiBJbmNyZWFzZXMgdGhlIGNhcGFjaXR5IG9mIHRoaXMge0Bjb2RlIEhhc2h0YWJsZX0uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqIHdoZW4gdGhlIHNpemUgb2YgdGhpcyB7QGNvZGUgSGFzaHRhYmxlfSBleGNlZWRzIHRoZSBsb2FkIGZhY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZWhhc2goKSB7CiAgICAgICAgIGludCBsZW5ndGggPSAoZWxlbWVudERhdGEubGVuZ3RoIDw8IDEpICsgMTsKQEAgLTc2NywxNSArNzc5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBrZXkvdmFsdWUgcGFpciB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBIYXNodGFibGUuCi0gICAgICoKKyAgICAgKiBSZW1vdmVzIHRoZSBrZXkvdmFsdWUgcGFpciB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcworICAgICAqIHtAY29kZSBIYXNodGFibGV9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgc3BlY2lmaWVkIGtleSBkaWQgbm90IGV4aXN0Ci0gICAgICoKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIGtleSBkaWQgbm90IGV4aXN0LgogICAgICAqIEBzZWUgI2dldAogICAgICAqIEBzZWUgI3B1dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgViByZW1vdmUoT2JqZWN0IGtleSkgewpAQCAtODAzLDEyICs4MTYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGluIHRoaXMgSGFzaHRhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyBpbiB0aGlzIEhhc2h0YWJsZQotICAgICAqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyBpbiB0aGlzIHtAY29kZSBIYXNodGFibGV9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgaW4gdGhpcyB7QGNvZGUgSGFzaHRhYmxlfS4KICAgICAgKiBAc2VlICNlbGVtZW50cwogICAgICAqIEBzZWUgI2tleXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgewpAQCAtODE2LDkgKzgyOSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEhhc2h0YWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEhhc2h0YWJsZQorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBIYXNodGFibGV9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBIYXNodGFibGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtODU3LDExICs4NzEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIEhhc2h0YWJsZS4gVGhlCi0gICAgICogY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhpcyBIYXNodGFibGUgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieQotICAgICAqIHRoZSBvdGhlci4gVGhlIGNvbGxlY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyB7QGNvZGUgSGFzaHRhYmxlfS4KKyAgICAgKiBUaGUgY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhpcyB7QGNvZGUgSGFzaHRhYmxlfSBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUKKyAgICAgKiByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUgY29sbGVjdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9ucy5TeW5jaHJvbml6ZWRDb2xsZWN0aW9uPFY+KApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JZGVudGl0eUhhc2hNYXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwLmphdmEKaW5kZXggNGQzNGMzNy4uMzMwMWE5OSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JZGVudGl0eUhhc2hNYXAuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lkZW50aXR5SGFzaE1hcC5qYXZhCkBAIC0yMywyMCArMjMsMjMgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBJZGVudGl0eUhhc2hNYXAKLSAqIAotICogVGhpcyBpcyBhIHZhcmlhbnQgb24gSGFzaE1hcCB3aGljaCB0ZXN0cyBlcXVhbGl0eSBieSByZWZlcmVuY2UgaW5zdGVhZCBvZiBieQotICogdmFsdWUuIEJhc2ljYWxseSwga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkgYnkgY2hlY2tpbmcgaWYKLSAqIHRoZWlyIHJlZmVyZW5jZXMgYXJlIGVxdWFsIHJhdGhlciB0aGFuIGJ5IGNhbGxpbmcgdGhlICJlcXVhbHMiIGZ1bmN0aW9uLgotICogCisgKiBJZGVudGl0eUhhc2hNYXAgaXMgYSB2YXJpYW50IG9uIEhhc2hNYXAgd2hpY2ggdGVzdHMgZXF1YWxpdHkgYnkgcmVmZXJlbmNlCisgKiBpbnN0ZWFkIG9mIGVxdWFsaXR5IGJ5IHZhbHVlLiBCYXNpY2FsbHksIGtleXMgYW5kIHZhbHVlcyBhcmUgY29tcGFyZWQgZm9yCisgKiBlcXVhbGl0eSBieSBjaGVja2luZyBpZiB0aGVpciByZWZlcmVuY2VzIGFyZSBlcXVhbCByYXRoZXIgdGhhbiBieSBjYWxsaW5nIHRoZQorICogImVxdWFscyIgZnVuY3Rpb24uCisgKiA8cD4KKyAqIDxiPk5vdGU6IFRoaXMgY2xhc3MgaW50ZW50aW9uYWxseSB2aW9sYXRlcyB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZiB7QGNvZGUKKyAqIE1hcH0ncyBvbiBjb21wYXJpbmcgb2JqZWN0cyBieSB0aGVpciB7QGNvZGUgZXF1YWxzfSBtZXRob2QuPC9iPgorICogPC9wPgorICogPHA+CiAgKiBJZGVudGl0eUhhc2hNYXAgdXNlcyBvcGVuIGFkZHJlc3NpbmcgKGxpbmVhciBwcm9iaW5nIGluIHBhcnRpY3VsYXIpIGZvcgogICogY29sbGlzaW9uIHJlc29sdXRpb24uIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gSGFzaE1hcCB3aGljaCB1c2VzIENoYWluaW5nLgotICogCisgKiA8L3A+CiAgKiBMaWtlIEhhc2hNYXAsIElkZW50aXR5SGFzaE1hcCBpcyBub3QgdGhyZWFkIHNhZmUsIHNvIGFjY2VzcyBieSBtdWx0aXBsZQogICogdGhyZWFkcyBtdXN0IGJlIHN5bmNocm9uaXplZCBieSBhbiBleHRlcm5hbCBtZWNoYW5pc20gc3VjaCBhcwogICogQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwLgogICogCi0gKiBAc2luY2UgMS40CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIElkZW50aXR5SGFzaE1hcDxLLCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IGltcGxlbWVudHMKICAgICAgICAgTWFwPEssIFY+LCBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CkBAIC0yMzUsMTggKzIzOCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBJZGVudGl0eUhhc2hNYXAgd2l0aCBkZWZhdWx0IG1heGltdW0gc2l6ZQorICAgICAqIENyZWF0ZXMgYW4gSWRlbnRpdHlIYXNoTWFwIHdpdGggZGVmYXVsdCBleHBlY3RlZCBtYXhpbXVtIHNpemUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElkZW50aXR5SGFzaE1hcCgpIHsKICAgICAgICAgdGhpcyhERUZBVUxUX01BWF9TSVpFKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gSWRlbnRpdHlIYXNoTWFwIHdpdGggdGhlIGdpdmVuIG1heGltdW0gc2l6ZSBwYXJhbWV0ZXIKKyAgICAgKiBDcmVhdGVzIGFuIElkZW50aXR5SGFzaE1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBzaXplIHBhcmFtZXRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWF4U2l6ZQogICAgICAqICAgICAgICAgICAgVGhlIGVzdGltYXRlZCBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgd2lsbCBiZSBwdXQgaW4KICAgICAgKiAgICAgICAgICAgIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJZGVudGl0eUhhc2hNYXAoaW50IG1heFNpemUpIHsKICAgICAgICAgaWYgKG1heFNpemUgPj0gMCkgewpAQCAtMjY4LDIyICsyNzQsMTYgQEAKICAgICAgICAgcmV0dXJuIChpbnQpICgoKGxvbmcpIHRocmVzaG9sZCAqIDEwMDAwKSAvIGxvYWRGYWN0b3IpICogMjsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZWxlbWVudCBhcnJheQotICAgICAqIAotICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gICAgICogQHJldHVybiBSZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXJyYXkKLSAgICAgKi8KICAgICBwcml2YXRlIE9iamVjdFtdIG5ld0VsZW1lbnRBcnJheShpbnQgcykgewogICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtzXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gSWRlbnRpdHlIYXNoTWFwIHVzaW5nIHRoZSBnaXZlbiBNYXAgYXMgaW5pdGlhbCB2YWx1ZXMuCisgICAgICogQ3JlYXRlcyBhbiBJZGVudGl0eUhhc2hNYXAgdXNpbmcgdGhlIGdpdmVuIG1hcCBhcyBpbml0aWFsIHZhbHVlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICBBIG1hcCBvZiAoa2V5LHZhbHVlKSBwYWlycyB0byBjb3B5IGludG8gdGhlIElkZW50aXR5SGFzaE1hcAorICAgICAqICAgICAgICAgICAgQSBtYXAgb2YgKGtleSx2YWx1ZSkgcGFpcnMgdG8gY29weSBpbnRvIHRoZSBJZGVudGl0eUhhc2hNYXAuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElkZW50aXR5SGFzaE1hcChNYXA8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPiBtYXApIHsKICAgICAgICAgdGhpcyhtYXAuc2l6ZSgpIDwgNiA/IDExIDogbWFwLnNpemUoKSAqIDIpOwpAQCAtMjk2LDEzICsyOTYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgTWFwLCBsZWF2aW5nIGl0IGVtcHR5LgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBtYXAsIGxlYXZpbmcgaXQgZW1wdHkuCiAgICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIE1hcCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogCi0gICAgICogQHNlZSAjaXNFbXB0eQotICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2VlICNpc0VtcHR5KCkKKyAgICAgKiBAc2VlICNzaXplKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKQEAgLTMxNCwxMSArMzEyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBNYXAgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+a2V5PC9jb2RlPiBpcyBhIGtleSBvZiB0aGlzIE1hcCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXksCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CkBAIC0zMzEsMTMgKzMzMSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgTWFwIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqIAorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyBhIHZhbHVlIG9mIHRoaXMgTWFwLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKQEAgLTM1Nyw4ICszNTcsOSBAQAogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgViBnZXQoT2JqZWN0IGtleSkgewpAQCAtMzg5LDEwICszOTAsNiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIElkZW50aXR5SGFzaE1hcEVudHJ5IHdpdGhvdXQgdGhlCi0gICAgICogTlVMTF9PQkpFQ1QgZWxlbWVudHMKLSAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwcml2YXRlIElkZW50aXR5SGFzaE1hcEVudHJ5PEssIFY+IGdldEVudHJ5KGludCBpbmRleCkgewogICAgICAgICBPYmplY3Qga2V5ID0gZWxlbWVudERhdGFbaW5kZXhdOwpAQCAtNDA4LDEwICs0MDUsNiBAQAogICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5SGFzaE1hcEVudHJ5PEssIFY+KChLKSBrZXksIChWKSB2YWx1ZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggd2hlcmUgdGhlIGtleSBpcyBmb3VuZCBhdCwgb3IgdGhlIGluZGV4IG9mIHRoZSBuZXh0Ci0gICAgICogZW1wdHkgc3BvdCBpZiB0aGUga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLgotICAgICAqLwogICAgIHByaXZhdGUgaW50IGZpbmRJbmRleChPYmplY3Qga2V5LCBPYmplY3RbXSBhcnJheSkgewogICAgICAgICBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgICBpbnQgaW5kZXggPSBnZXRNb2R1bG9IYXNoKGtleSwgbGVuZ3RoKTsKQEAgLTQzNywxMSArNDMwLDEyIEBACiAgICAgICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBhbnkgcHJldmlvdXMgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IG9yIG51bGwKLSAgICAgKiAgICAgICAgIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBzdWNoIG1hcHBpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgcHV0KEsga2V5LCBWIHZhbHVlKSB7CkBAIC00NzgsMTQgKzQ3MiwxMyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBDb3BpZXMgYWxsIHRoZSBtYXBwaW5ncyBpbiB0aGUgZ2l2ZW4gbWFwIHRvIHRoaXMgbWFwLiBUaGVzZSBtYXBwaW5ncyB3aWxsCi0gICAgICogcmVwbGFjZSBhbGwgbWFwcGluZ3MgdGhhdCB0aGlzIG1hcCBoYWQgZm9yIGFueSBvZiB0aGUga2V5cyBjdXJyZW50bHkgaW4KLSAgICAgKiB0aGUgZ2l2ZW4gbWFwLgorICAgICAqIENvcGllcyBhbGwgdGhlIG1hcHBpbmdzIGluIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgbWFwLiBUaGVzZSBtYXBwaW5ncworICAgICAqIHdpbGwgcmVwbGFjZSBhbGwgbWFwcGluZ3MgdGhhdCB0aGlzIG1hcCBoYWQgZm9yIGFueSBvZiB0aGUga2V5cyBjdXJyZW50bHkKKyAgICAgKiBpbiB0aGUgZ2l2ZW4gbWFwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBNYXAgdG8gY29weSBtYXBwaW5ncyBmcm9tCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBtYXAgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG1hcCB0byBjb3B5IG1hcHBpbmdzIGZyb20uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgewpAQCAtNTE2LDEyICs1MDksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBJZGVudGl0eUhhc2hNYXAuCisgICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBtYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBtYXBwaW5nLCBvciBudWxsIGlmIGtleSBpcyBub3QgYSBrZXkgaW4KLSAgICAgKiAgICAgICAgIHRoaXMgTWFwCisgICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBtYXBwaW5nIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBtYXBwaW5nLCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gbWFwcGluZworICAgICAqICAgICAgICAgZm9yIHRoZSBzcGVjaWZpZWQga2V5IHdhcyBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgViByZW1vdmUoT2JqZWN0IGtleSkgewpAQCAtNTc2LDEyICs1NzAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2V0IG9mIHRoZSBtYXBwaW5ncyBjb250YWluZWQgaW4gdGhpcyBJZGVudGl0eUhhc2hNYXAuIEVhY2gKLSAgICAgKiBlbGVtZW50IGluIHRoZSBzZXQgaXMgYSBNYXAuRW50cnkuIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgTWFwIHNvCi0gICAgICogY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZSBzZXQgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqIGFkZGluZy4KKyAgICAgKiBSZXR1cm5zIGEgc2V0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4gRWFjaCBtYXBwaW5nIGlzCisgICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1hcC5FbnRyeX0uIEFzIHRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgbWFwLAorICAgICAqIGNoYW5nZXMgaW4gb25lIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBvdGhlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU2V0IG9mIHRoZSBtYXBwaW5ncworICAgICAqIEByZXR1cm4gYSBzZXQgb2YgdGhlIG1hcHBpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsKQEAgLTU4OSwxMSArNTgzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNldCBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBJZGVudGl0eUhhc2hNYXAuIFRoZSBzZXQgaXMKLSAgICAgKiBiYWNrZWQgYnkgdGhpcyBJZGVudGl0eUhhc2hNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUKLSAgICAgKiBvdGhlci4gVGhlIHNldCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy4KKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gVGhlIHNldCBpcyBiYWNrZWQgYnkKKyAgICAgKiB0aGlzIG1hcCBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIHNldCBkb2VzIG5vdAorICAgICAqIHN1cHBvcnQgYWRkaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTZXQgb2YgdGhlIGtleXMKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgewpAQCAtNjM4LDExICs2MzMsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIElkZW50aXR5SGFzaE1hcC4gVGhlCi0gICAgICogY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhpcyBJZGVudGl0eUhhc2hNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlCi0gICAgICogcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIGNvbGxlY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcuCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZSBjb2xsZWN0aW9uCisgICAgICogaXMgYmFja2VkIGJ5IHRoaXMgbWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUKKyAgICAgKiBjb2xsZWN0aW9uIHN1cHBvcnRzIHJlbW92ZSwgcmVtb3ZlQWxsLCByZXRhaW5BbGwgYW5kIGNsZWFyIG9wZXJhdGlvbnMsCisgICAgICogYW5kIGl0IGRvZXMgbm90IHN1cHBvcnQgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBjb2xsZWN0aW9uIHdoaWNoIGlzIHRoZSBzdWJjbGFzcyBvZgorICAgICAqIEFic3RyYWN0Q29sbGVjdGlvbi4gVGhlIGl0ZXJhdG9yIG1ldGhvZCBvZiB0aGlzIHN1YmNsYXNzIHJldHVybnMgYQorICAgICAqICJ3cmFwcGVyIG9iamVjdCIgb3ZlciB0aGUgaXRlcmF0b3Igb2YgbWFwJ3MgZW50cnlTZXQoKS4gVGhlIHtAY29kZSBzaXplfQorICAgICAqIG1ldGhvZCB3cmFwcyB0aGUgbWFwJ3Mgc2l6ZSBtZXRob2QgYW5kIHRoZSB7QGNvZGUgY29udGFpbnN9IG1ldGhvZCB3cmFwcworICAgICAqIHRoZSBtYXAncyBjb250YWluc1ZhbHVlIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgKiBhbmQgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gYWxsIHN1YnNlcXVlbnQgY2FsbHMuIFRoaXMgbWV0aG9kIG1heSByZXR1cm4KKyAgICAgKiBkaWZmZXJlbnQgY29sbGVjdGlvbnMgd2hlbiBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIG9jY3VyLCBzaW5jZSBubworICAgICAqIHN5bmNocm9uaXphdGlvbiBpcyBwZXJmb3JtZWQuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMKKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7CkBAIC02OTIsMTMgKzcwMiwxNSBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgbWFwIHdpdGggb3RoZXIgb2JqZWN0cy4gVGhpcyBtYXAgaXMgZXF1YWwgdG8gYW5vdGhlciBtYXAgaXMKICAgICAgKiBpdCByZXByZXNlbnRzIHRoZSBzYW1lIHNldCBvZiBtYXBwaW5ncy4gV2l0aCB0aGlzIG1hcCwgdHdvIG1hcHBpbmdzIGFyZQotICAgICAqIHRoZSBzYW1lIGlmIGJvdGggdGhlIGtleSBhbmQgdGhlIHZhbHVlIGFyZSBlcXVhbCBieSByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogV2hlbiBjb21wYXJlZCB3aXRoIGEgbWFwIHRoYXQgaXMgbm90IGFuIElkZW50aXR5SGFzaE1hcCwgdGhlIGVxdWFscwotICAgICAqIG1ldGhvZCBpcyBub3QgbmVjZXNzYXJpbHkgc3ltbWV0cmljIChhLmVxdWFscyhiKSBpbXBsaWVzIGIuZXF1YWxzKGEpKSBub3IKKyAgICAgKiB0aGUgc2FtZSBpZiBib3RoIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSBhcmUgZXF1YWwgYnkgcmVmZXJlbmNlLiBXaGVuCisgICAgICogY29tcGFyZWQgd2l0aCBhIG1hcCB0aGF0IGlzIG5vdCBhbiBJZGVudGl0eUhhc2hNYXAsIHRoZSBlcXVhbHMgbWV0aG9kIGlzCisgICAgICogbmVpdGhlciBuZWNlc3NhcmlseSBzeW1tZXRyaWMgKGEuZXF1YWxzKGIpIGltcGxpZXMgYi5lcXVhbHMoYSkpIG5vcgogICAgICAqIHRyYW5zaXRpdmUgKGEuZXF1YWxzKGIpIGFuZCBiLmVxdWFscyhjKSBpbXBsaWVzIGEuZXF1YWxzKGMpKS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGFyZ3VtZW50IG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIG9iamVjdAorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGFyZ3VtZW50IG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtNzMxLDkgKzc0Myw5IEBACiAgICAgICogUmV0dXJucyBhIG5ldyBJZGVudGl0eUhhc2hNYXAgd2l0aCB0aGUgc2FtZSBtYXBwaW5ncyBhbmQgc2l6ZSBhcyB0aGlzCiAgICAgICogb25lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBJZGVudGl0eUhhc2hNYXAKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgSWRlbnRpdHlIYXNoTWFwLgogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CkBAIC03NDUsMTEgKzc1NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBJZGVudGl0eUhhc2hNYXAgaGFzIG5vIGVsZW1lbnRzLCBhIHNpemUgb2YgemVyby4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJZGVudGl0eUhhc2hNYXAgaGFzIG5vIGVsZW1lbnRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIElkZW50aXR5SGFzaE1hcCBoYXMgbm8gZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIElkZW50aXR5SGFzaE1hcCBoYXMgbm8gZWxlbWVudHMsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNzaXplKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewpAQCAtNzU5LDcgKzc3Miw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHRoaXMgSWRlbnRpdHlIYXNoTWFwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtYXBwaW5ncyBpbiB0aGlzIElkZW50aXR5SGFzaE1hcAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtYXBwaW5ncyBpbiB0aGlzIElkZW50aXR5SGFzaE1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbi5qYXZhCmluZGV4IGEzODMyMTIuLmUwNGVlYmEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbi5qYXZhCkBAIC0xOSw5ICsxOSwxMiBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIFRoZSB1bmNoZWNrZWQgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG91dCBpZiBhbiBpbnZhbGlkIFVuaWNvZGUgY29kZSBwb2ludCwKLSAqIHdoaWNoIGlzIENoYXJhY3Rlci5pc1ZhbGlkQ29kZVBvaW50KGludCksIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0bwotICogRm9ybWF0dGVyLgorICogQW4ge0Bjb2RlIElsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duIGlmIGFuIGludmFsaWQKKyAqIFVuaWNvZGUgY29kZSBwb2ludCAoZGVmaW5lZCBieSB7QGxpbmsgQ2hhcmFjdGVyI2lzVmFsaWRDb2RlUG9pbnQoaW50KX0pIGlzCisgKiBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSBGb3JtYXR0ZXIuCisgKiAKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24KICAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewpAQCAtMzAsMjkgKzMzLDI5IEBACiAgICAgcHJpdmF0ZSBpbnQgYzsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbiB3aGljaCBpcyBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICogaW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbn0gd2hpY2ggaXMKKyAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGludmFsaWQgVW5pY29kZSBjb2RlIHBvaW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICBUaGUgaW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCisgICAgICogICAgICAgICAgIHRoZSBpbnZhbGlkIFVuaWNvZGUgY29kZSBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbihpbnQgYykgewogICAgICAgICB0aGlzLmMgPSBjOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCisgICAgICogUmV0dXJucyB0aGUgaW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgaW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgaW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRDb2RlUG9pbnQoKSB7CiAgICAgICAgIHJldHVybiBjOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIElsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24uCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIElsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIElsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIElsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IDJmZjdiMGEuLjc2OTM4MWIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKQEAgLTE5LDkgKzE5LDExIEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogVGhlIHVuY2hlY2tlZCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0IHdoZW4gdGhlIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUKLSAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IHNwZWNpZmllci4KLSAqIEBzaW5jZSAxLjUKKyAqIEFuIHtAY29kZSBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gd2hlbiB0aGUgcGFyYW1ldGVyCisgKiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgc3BlY2lmaWVyLgorICogCisgKiBAc2VlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIElsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgogICAgICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CkBAIC0zMiwxMyArMzQsMTMgQEAKICAgICBwcml2YXRlIENsYXNzPD8+IGFyZzsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24gd2l0aCB0aGUgY2xhc3Mgb2YgdGhlCi0gICAgICogbWlzbWF0Y2hlZCBjb252ZXJzaW9uIGFuZCBjb3JyZXNwb25kaW5nIHBhcmFtZXRlci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbn0gd2l0aCB0aGUgY2xhc3MKKyAgICAgKiBvZiB0aGUgbWlzbWF0Y2hlZCBjb252ZXJzaW9uIGFuZCBjb3JyZXNwb25kaW5nIHBhcmFtZXRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYwotICAgICAqICAgICAgICAgICAgVGhlIGNsYXNzIG9mIHRoZSBtaXNtYXRjaGVkIGNvbnZlcnNpb24uCisgICAgICogICAgICAgICAgIHRoZSBjbGFzcyBvZiB0aGUgbWlzbWF0Y2hlZCBjb252ZXJzaW9uLgogICAgICAqIEBwYXJhbSBhcmcKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlci4KKyAgICAgKiAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyLgogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbihjaGFyIGMsIENsYXNzPD8+IGFyZykgewogICAgICAgICB0aGlzLmMgPSBjOwpAQCAtNDksMjcgKzUxLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgbWlzbWF0Y2hlZCBwYXJhbWV0ZXIuCisgICAgICogUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIG1pc21hdGNoZWQgcGFyYW1ldGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIG9mIHRoZSBtaXNtYXRjaGVkIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgbWlzbWF0Y2hlZCBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIENsYXNzPD8+IGdldEFyZ3VtZW50Q2xhc3MoKSB7CiAgICAgICAgIHJldHVybiBhcmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBpbmNvbXBhdGlibGUgY29udmVyc2lvbi4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmNvbXBhdGlibGUgY29udmVyc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBpbmNvbXBhdGlibGUgY29udmVyc2lvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmNvbXBhdGlibGUgY29udmVyc2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBnZXRDb252ZXJzaW9uKCkgewogICAgICAgICByZXR1cm4gYzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoZSBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbi4KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBvZiB0aGUgSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIElsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoZSBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDU3YmNiNzkuLjJjMWYyZDcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxMiArMTgsMTMgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBVbmNoZWNrZWQgRXhjZXB0aW9uIHRoYXQgaXMgdG8gYmUgdGhyb3duIG91dCB3aGVuIGEgZm9ybWF0IHN0cmluZyB0aGF0CisgKiBBbiB7QGNvZGUgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gYSBmb3JtYXQgc3RyaW5nIHRoYXQKICAqIGNvbnRhaW5zIGVpdGhlciBhbiBpbGxlZ2FsIHN5bnRheCBvciBmb3JtYXQgc3BlY2lmaWVyIGlzIHRyYW5zZmVycmVkIGFzIGEKLSAqIHBhcmFtZXRlci4gT25seSBzdWJjbGFzcyB0aGF0IGlzIGluaGVyaXRlZCBleHBsaWNpdGx5IGZyb20gdGhpcyBleGNlcHRpb24gaXMKLSAqIGFsbG93ZWQgdG8gYmUgaW5zdGFudGlhbGl6ZWQuCisgKiBwYXJhbWV0ZXIuIE9ubHkgc3ViY2xhc3NlcyBpbmhlcml0aW5nIGV4cGxpY2l0bHkgZnJvbSB0aGlzIGV4Y2VwdGlvbiBhcmUKKyAqIGFsbG93ZWQgdG8gYmUgaW5zdGFudGlhdGVkLgogICogCi0gKiAKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzCiAgICAgICAgIFNlcmlhbGl6YWJsZSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24uamF2YQppbmRleCBhNDc2NzhkLi42YjI3Yzc0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uLmphdmEKQEAgLTE5LDEwICsxOSwxMSBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKKyAqIEFuIHtAY29kZSBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBjb21iaW5hdGlvbiBvZgorICogdGhlIGZvcm1hdCBmbGFncyBpcyBpbGxlZ2FsLgogICogCi0gKiBUaGUgdW5jaGVja2VkIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBvdXQgaWYgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBmb3JtYXQKLSAqIGZsYWdzIGlzIGlsbGVnYWwuCi0gKiAKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgogICAgICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CkBAIC0zMSwxMCArMzIsMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBmbGFnczsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBmbGFncy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGZsYWdzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBmCi0gICAgICogICAgICAgICAgICBUaGUgc3BlY2lmaWVkIGZsYWdzLgorICAgICAqICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGZsYWdzLgogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24oU3RyaW5nIGYpIHsKICAgICAgICAgaWYgKG51bGwgPT0gZikgewpAQCAtNDQsMTggKzQ2LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBmbGFncyB0aGF0IGFyZSBpbGxlZ2FsLgorICAgICAqIFJldHVybnMgdGhlIGZsYWdzIHRoYXQgYXJlIGlsbGVnYWwuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgZmxhZ3MgdGhhdCBhcmUgaWxsZWdhbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbGFncyB0aGF0IGFyZSBpbGxlZ2FsLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmxhZ3MoKSB7CiAgICAgICAgIHJldHVybiBmbGFnczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoZSBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24uCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgb2YgdGhlIElsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZyBvZiB0aGUgSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoZSBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24uamF2YQppbmRleCBiN2RkNTRkLi42Y2NmNWQyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24uamF2YQpAQCAtMTcsMTEgKzE3LDExIEBACiBwYWNrYWdlIGphdmEudXRpbDsKIAogLyoqCisgKiBBbiB7QGNvZGUgSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgdGhlIHByZWNpc2lvbiBpcworICogYSBuZWdhdGl2ZSBvdGhlciB0aGFuIC0xIG9yIGluIG90aGVyIGNhc2VzIHdoZXJlIHByZWNpc2lvbiBpcyBub3Qgc3VwcG9ydGVkLgogICogCi0gKiBUaGUgdW5jaGVja2VkIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBvdXQgd2hlbiB0aGUgcHJlY2lzaW9uIGlzIGEgbmVnYXRpdmUKLSAqIG90aGVyIHRoYW4gLTEsIG9yIHRoZSBjb252ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgYSBwcmVjaXNpb24gb3Igb3RoZXIgY2FzZXMKLSAqIHdoZW4gdGhlIHByZWNpc2lvbiBpcyBub3Qgc3VwcG9ydGVkLgotICogCisgKiBAc2VlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24gewpAQCAtMzAsMTAgKzMwLDExIEBACiAgICAgcHJpdmF0ZSBpbnQgcDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBJbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uIHdpdGggc3BlY2lmaWVkIHByZWNpc2lvbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9ufSB3aXRoIHNwZWNpZmllZAorICAgICAqIHByZWNpc2lvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcAotICAgICAqICAgICAgICAgICAgVGhlIHByZWNpc2lvbi4KKyAgICAgKiAgICAgICAgICAgdGhlIHByZWNpc2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbihpbnQgcCkgewogICAgICAgICB0aGlzLnAgPSBwOwpAQCAtNTEsNyArNTIsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdFdpZHRoRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbi5qYXZhCmluZGV4IDlmN2ZjZjIuLjgzNDhlYzcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdFdpZHRoRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24uamF2YQpAQCAtMTcsMTEgKzE3LDEyIEBACiBwYWNrYWdlIGphdmEudXRpbDsKIAogLyoqCisgKiBBbiB7QGNvZGUgSWxsZWdhbEZvcm1hdFdpZHRoRXhjZXB0aW9ufSB3aWxsIGJlIHRocm93biBpZiB0aGUgd2lkdGggaXMgYQorICogbmVnYXRpdmUgdmFsdWUgb3RoZXIgdGhhbiAtMSBvciBpbiBvdGhlciBjYXNlcyB3aGVyZSBhIHdpZHRoIGlzIG5vdAorICogc3VwcG9ydGVkLgogICogCi0gKiBUaGUgdW5jaGVja2VkIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBvdXQgd2hlbiB0aGUgd2lkdGggaXMgYSBuZWdhdGl2ZSBvdGhlcgotICogdGhhbiAtMSwgb3IgdGhlIGNvbnZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBhIHdpZHRoIG9yIG90aGVyIGNhc2VzIHdoZW4gdGhlCi0gKiB3aWR0aCBpcyBub3Qgc3VwcG9ydGVkLgotICogCisgKiBAc2VlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIElsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxGb3JtYXRFeGNlcHRpb24gewogCkBAIC0zMCwxMCArMzEsMTEgQEAKICAgICBwcml2YXRlIGludCB3OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIElsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiB3aXRoIHNwZWNpZmllZCB3aWR0aC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb259IHdpdGggc3BlY2lmaWVkCisgICAgICogd2lkdGguCiAgICAgICogCiAgICAgICogQHBhcmFtIHcKLSAgICAgKiAgICAgICAgICAgIFRoZSB3aWR0aC4KKyAgICAgKiAgICAgICAgICAgdGhlIHdpZHRoLgogICAgICAqLwogICAgIHB1YmxpYyBJbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24oaW50IHcpIHsKICAgICAgICAgdGhpcy53ID0gdzsKQEAgLTUxLDcgKzUzLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lucHV0TWlzbWF0Y2hFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCmluZGV4IGM0OGFjNmYuLjBmYzUzODUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxMCArMTgsMTMgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBBbiBJbnB1dE1pc21hdGNoRXhjZXB0aW9uIGlzIHRocm93biBieSBhIHNjYW5uZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbmV4dAotICogdG9rZW4gZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gdGhlIHNwZWNpZmllZCB0eXBlLgorICogQW4ge0Bjb2RlIElucHV0TWlzbWF0Y2hFeGNlcHRpb259IGlzIHRocm93biBieSBhIHNjYW5uZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUKKyAqIG5leHQgdG9rZW4gZG9lcyBub3QgbWF0Y2ggb3IgaXMgb3V0IG9mIHJhbmdlIGZvciB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlCisgKiBwYXR0ZXJuLgogICogCiAgKiBAc2VlIFNjYW5uZXIKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cwogICAgICAgICBTZXJpYWxpemFibGUgewpAQCAtMjksMTggKzMyLDE5IEBACiAgICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg4MTEyMzA3NjA5OTcwNjY0MjhMOwogICAgIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBJbnB1dE1pc21hdGNoRXhjZXB0aW9uIHdpdGggbm8gZXJyb3IgbWVzc2FnZQotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIElucHV0TWlzbWF0Y2hFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBmaWxsZWQgaW4uCiAgICAgICovCiAgICAgcHVibGljIElucHV0TWlzbWF0Y2hFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIElucHV0TWlzbWF0Y2hFeGNlcHRpb24gd2l0aCBtc2cgYXMgaXRzIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnB1dE1pc21hdGNoRXhjZXB0aW9ufSB3aXRoIHRoZSBzdGFjayB0cmFjZQorICAgICAqIGZpbGxlZCBpbiBhbmQge0Bjb2RlIG1zZ30gYXMgaXRzIGVycm9yIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgVGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlCisgICAgICogICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZXJyb3IgbWVzc2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0ludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0ludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uLmphdmEKaW5kZXggYjBlYjM2ZS4uNGU4YTNlMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JbnZhbGlkUHJvcGVydGllc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb24uamF2YQpAQCAtMjIsMTQgKzIyLDM5IEBACiBpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAorLyoqCisgKiBBbiB7QGNvZGUgSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb259IGlzIHRocm93biBpZiBsb2FkaW5nIHRoZSBYTUwKKyAqIGRvY3VtZW50IGRlZmluaW5nIHRoZSBwcm9wZXJ0aWVzIGRvZXMgbm90IGZvbGxvdyB0aGUge0Bjb2RlIFByb3BlcnRpZXN9CisgKiBzcGVjaWZpY2F0aW9uLgorICogCisgKiBFdmVuIHRob3VnaCB0aGlzIEV4Y2VwdGlvbiBpbmhlcml0cyB0aGUge0Bjb2RlIFNlcmlhbGl6YWJsZX0gaW50ZXJmYWNlLCBpdCBpcyBub3QKKyAqIHNlcmlhbGl6YWJsZS4gVGhlIG1ldGhvZHMgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiB0aHJvdworICoge0Bjb2RlIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbn1zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc3NjMwNTYwNzYwMDkzNjAyMTlMOwotICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogY3VycmVudCBzdGFjayB0cmFjZSBhbmQgbWVzc2FnZSBmaWxsZWQgaW4uCisgICAgICogCisgICAgICogQHBhcmFtIG0KKyAgICAgKiAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkUHJvcGVydGllc0Zvcm1hdEV4Y2VwdGlvbihTdHJpbmcgbSkgewogICAgICAgICBzdXBlcihtKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnZhbGlkUHJvcGVydGllc0Zvcm1hdEV4Y2VwdGlvbn0gd2l0aCB0aGUgY2F1c2UKKyAgICAgKiBmb3IgdGhlIEV4Y2VwdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICB0aGUgY2F1c2UgZm9yIHRoZSBFeGNlcHRpb24uCisgICAgICovCiAgICAgcHVibGljIEludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uKFRocm93YWJsZSBjKSB7CiAgICAgICAgIGluaXRDYXVzZShjKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0l0ZXJhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0l0ZXJhdG9yLmphdmEKaW5kZXggMzc5MDAzMS4uOWYyMGRjNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JdGVyYXRvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSXRlcmF0b3IuamF2YQpAQCAtMTksNDEgKzE5LDUwIEBACiAKIAogLyoqCi0gKiBBbiBJdGVyYXRvciBpcyB1c2VkIHRvIHNlcXVlbmNlIG92ZXIgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCisgKiBBbiBJdGVyYXRvciBpcyB1c2VkIHRvIHNlcXVlbmNlIG92ZXIgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuIENvbmNlcHR1YWwsIGFuCisgKiBpdGVyYXRvciBpcyBhbHdheXMgcG9zaXRpb25lZCBiZXR3ZWVuIHR3byBlbGVtZW50cyBvZiBhIGNvbGxlY3Rpb24uIEEgZnJlc2gKKyAqIGl0ZXJhdG9yIGlzIGFsd2F5cyBwb3NpdGlvbmVkIGluIGZyb250IG9mIHRoZSBmaXJzdCBlbGVtZW50LgorICogCisgKiBJZiBhIGNvbGxlY3Rpb24gaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSBpdHMgY3JlYXRpb24sIG1ldGhvZHMge0Bjb2RlIG5leHR9IGFuZAorICoge0Bjb2RlIGhhc05leHQoKX0gbWF5IHRocm93IGEge0Bjb2RlIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LgorICogSXRlcmF0b3JzIHdpdGggdGhpcyBiZWhhdmlvciBhcmUgY2FsbGVkIGZhaWwtZmFzdCBpdGVyYXRvcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEl0ZXJhdG9yPEU+IHsKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIGl0ZXJhdGUuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIGl0ZXJhdGUsIGkuZS4gd2hldGhlciB0aGUKKyAgICAgKiBpdGVyYXRvciBpcyBwb3NpdGlvbmVkIGluIGZyb250IG9mIGFuIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjbmV4dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgb2JqZWN0IGluIHRoZSBpdGVyYXRpb24uCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGl0ZXJhdGlvbiwgaS5lLiByZXR1cm5zIHRoZSBlbGVtZW50IGluCisgICAgICogZnJvbnQgb2YgdGhlIGl0ZXJhdG9yIGFuZCBhZHZhbmNlcyB0aGUgaXRlcmF0b3IgYnkgb25lIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cwotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzLgogICAgICAqIEBzZWUgI2hhc05leHQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSBuZXh0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBsYXN0IG9iamVjdCByZXR1cm5lZCBieSA8Y29kZT5uZXh0PC9jb2RlPiBmcm9tIHRoZQotICAgICAqIGNvbGxlY3Rpb24uCisgICAgICogUmVtb3ZlcyB0aGUgbGFzdCBvYmplY3QgcmV0dXJuZWQgYnkge0Bjb2RlIG5leHR9IGZyb20gdGhlIGNvbGxlY3Rpb24uCisgICAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIge0Bjb2RlIG5leHR9IHdhcyBjYWxsZWQuCiAgICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29sbGVjdGlvbiBiZWluZwotICAgICAqICAgICAgICAgICAgICAgIGl0ZXJhdGVkCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPm5leHQ8L2NvZGU+IGhhcyBub3QgYmVlbiBjYWxsZWQsIG9yCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+cmVtb3ZlPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhZnRlciB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBsYXN0IGNhbGwgdG8gPGNvZGU+bmV4dDwvY29kZT4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcmVtb3ZpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29sbGVjdGlvbiBiZWluZworICAgICAqICAgICAgICAgICAgIGl0ZXJhdGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5leHR9IGhhcyBub3QgYmVlbiBjYWxsZWQsIG9yIHtAY29kZSByZW1vdmV9IGhhcworICAgICAqICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0byB7QGNvZGUgbmV4dH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpbmtlZEhhc2hNYXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcC5qYXZhCmluZGV4IDY2NDI2MjAuLjFhNjEzNDUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcC5qYXZhCkBAIC0xOSwxNiArMTksMTkgQEAKIAogCiAvKioKLSAqIExpbmtlZEhhc2hNYXAgaXMgYSB2YXJpYW50IG9uIEhhc2hNYXAuIEl0cyBlbnRyaWVzIGFyZSBrZXB0IGluIGEgZG91Ymx5LWxpbmtlZCBsaXN0LgotICogVGhlIGl0ZXJhdGlvbiBvcmRlciBpcywgYnkgZGVmYXVsdCwgdGhlIG9yZGVyIGluIHdoaWNoIGtleXMgd2VyZSBpbnNlcnRlZC4KLSAqIDxwPiAKLSAqIElmIHRoZSB0aHJlZSBhcmd1bWVudCBjb25zdHJ1Y3RvciBpcyB1c2VkLCBhbmQgPGNvZGU+b3JkZXI8L2NvZGU+IGlzIHNwZWNpZmllZCBhcyA8Y29kZT50cnVlPC9jb2RlPiwgCi0gKiB0aGUgaXRlcmF0aW9uIHdvdWxkIGJlIGluIHRoZSBvcmRlciB0aGF0IGVudHJpZXMgd2VyZSBhY2Nlc3NlZC4gVGhlIGFjY2VzcyBvcmRlciBnZXRzIAotICogYWZmZWN0ZWQgYnkgcHV0KCksIGdldCgpLCBwdXRBbGwoKSBvcGVyYXRpb25zLCBidXQgbm90IGJ5IG9wZXJhdGlvbnMgb24gdGhlIGNvbGxlY3Rpb24gdmlld3MuCisgKiBMaW5rZWRIYXNoTWFwIGlzIGEgdmFyaWFudCBvbiBIYXNoTWFwLiBJdHMgZW50cmllcyBhcmUga2VwdCBpbiBhCisgKiBkb3VibHktbGlua2VkIGxpc3QuIFRoZSBpdGVyYXRpb24gb3JkZXIgaXMsIGJ5IGRlZmF1bHQsIHRoZSBvcmRlciBpbiB3aGljaAorICoga2V5cyB3ZXJlIGluc2VydGVkLgogICogPHA+Ci0gKiBOdWxsIGVsZW1lbnRzIGFyZSBhbGxvd2VkLCBhbmQgYWxsIHRoZSBvcHRpb25hbCBNYXAgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICogSWYgdGhlIHRocmVlIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGlzIHVzZWQsIGFuZCB7QGNvZGUgb3JkZXJ9IGlzIHNwZWNpZmllZCBhcworICoge0Bjb2RlIHRydWV9LCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgaW4gdGhlIG9yZGVyIHRoYXQgZW50cmllcyB3ZXJlIGFjY2Vzc2VkLgorICogVGhlIGFjY2VzcyBvcmRlciBnZXRzIGFmZmVjdGVkIGJ5IHB1dCgpLCBnZXQoKSwgcHV0QWxsKCkgb3BlcmF0aW9ucywgYnV0IG5vdAorICogYnkgb3BlcmF0aW9ucyBvbiB0aGUgY29sbGVjdGlvbiB2aWV3cy4KICAqIDxwPgotICogQHNpbmNlIDEuNAorICogTnVsbCBlbGVtZW50cyBhcmUgYWxsb3dlZCwgYW5kIGFsbCB0aGUgb3B0aW9uYWwgbWFwIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAqIDxwPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIExpbmtlZEhhc2hNYXA8SywgVj4gZXh0ZW5kcyBIYXNoTWFwPEssIFY+IHsKIApAQCAtMzksNyArNDIsOSBAQAogICAgIHRyYW5zaWVudCBwcml2YXRlIExpbmtlZEhhc2hNYXBFbnRyeTxLLCBWPiBoZWFkLCB0YWlsOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiBMaW5rZWRIYXNoTWFwLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkge0Bjb2RlIExpbmtlZEhhc2hNYXB9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rZWRIYXNoTWFwKCkgewogICAgICAgICBzdXBlcigpOwpAQCAtNDgsMTAgKzUzLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igd2l0aCBzcGVjaWZpZWQgc2l6ZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBMaW5rZWRIYXNoTWFwfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjYXBhY2l0eS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgU2l6ZSBvZiBMaW5rZWRIYXNoTWFwIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGlzIG1hcC4KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rZWRIYXNoTWFwKGludCBzKSB7CiAgICAgICAgIHN1cGVyKHMpOwpAQCAtNjAsMTIgKzY5LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igd2l0aCBzcGVjaWZpZWQgc2l6ZSBhbmQgbG9hZCBmYWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTGlua2VkSGFzaE1hcH0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBTaXplIG9mIExpbmtlZEhhc2hNYXAgcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgbWFwLgogICAgICAqIEBwYXJhbSBsZgotICAgICAqICAgICAgICAgICAgTG9hZCBmYWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGxvYWQgZmFjdG9yLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHplcm8gb3IgdGhlIGxvYWQgZmFjdG9yIGlzCisgICAgICogICAgICAgICAgICAgbGVzcyBvciBlcXVhbCB0byB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rZWRIYXNoTWFwKGludCBzLCBmbG9hdCBsZikgewogICAgICAgICBzdXBlcihzLCBsZik7CkBAIC03NSwxNSArODksMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHNwZWNpZmllZCBzaXplLCBsb2FkIGZhY3RvciBhbmQgYWNjZXNzIG9yZGVyCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTGlua2VkSGFzaE1hcH0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY2FwYWNpdHksIGxvYWQgZmFjdG9yIGFuZCBhIGZsYWcgc3BlY2lmeWluZyB0aGUgb3JkZXJpbmcgYmVoYXZpb3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIFNpemUgb2YgTGlua2VkSGFzaG1hcCByZXF1aXJlZAorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhpcyBoYXNoIG1hcC4KICAgICAgKiBAcGFyYW0gbGYKLSAgICAgKiAgICAgICAgICAgIExvYWQgZmFjdG9yCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBsb2FkIGZhY3Rvci4KICAgICAgKiBAcGFyYW0gb3JkZXIKLSAgICAgKiAgICAgICAgICAgIElmIHRydWUgaW5kaWNhdGVzIHRoYXQgdHJhdmVyc2FsIG9yZGVyIHNob3VsZCBiZWdpbiB3aXRoIG1vc3QKLSAgICAgKiAgICAgICAgICAgIHJlY2VudGx5IGFjY2Vzc2VkCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9yZGVyaW5nIHNob3VsZCBiZSBkb25lIGJhc2VkIG9uIHRoZSBsYXN0CisgICAgICogICAgICAgICAgICBhY2Nlc3MgKGZyb20gbGVhc3QtcmVjZW50bHkgYWNjZXNzZWQgdG8gbW9zdC1yZWNlbnRseQorICAgICAqICAgICAgICAgICAgYWNjZXNzZWQpLCBhbmQge0Bjb2RlIGZhbHNlfSBpZiB0aGUgb3JkZXJpbmcgc2hvdWxkIGJlIHRoZQorICAgICAqICAgICAgICAgICAgb3JkZXIgaW4gd2hpY2ggdGhlIGVudHJpZXMgd2VyZSBpbnNlcnRlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB6ZXJvIG9yIHRoZSBsb2FkIGZhY3RvciBpcworICAgICAqICAgICAgICAgICAgIGxlc3Mgb3IgZXF1YWwgdG8gemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGlua2VkSGFzaE1hcChpbnQgcywgZmxvYXQgbGYsIGJvb2xlYW4gb3JkZXIpIHsKICAgICAgICAgc3VwZXIocywgbGYpOwpAQCAtOTMsMTAgKzExNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHdpdGggaW5wdXQgbWFwCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTGlua2VkSGFzaE1hcH0gaW5zdGFuY2UgY29udGFpbmluZyB0aGUgbWFwcGluZ3MKKyAgICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtCi0gICAgICogICAgICAgICAgICBJbnB1dCBtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXBwaW5ncyB0byBhZGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpbmtlZEhhc2hNYXAoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbSkgewogICAgICAgICBhY2Nlc3NPcmRlciA9IGZhbHNlOwpAQCAtMjIyLDEyICsyNDUsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGVsZW1lbnQgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcwotICAgICAqIEByZXR1cm4gUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGFycmF5Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgRW50cnk8SywgVj5bXSBuZXdFbGVtZW50QXJyYXkoaW50IHMpIHsKQEAgLTIzNSwxMSArMjUyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIG1hcCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkuCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICBLZXkgdmFsdWUKLSAgICAgKiBAcmV0dXJuIG1hcHBlZCB2YWx1ZSBvciBudWxsIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiBubyBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGtleSBpcyBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgViBnZXQoT2JqZWN0IGtleSkgewpAQCAtMjk0LDE1ICszMTMsMTcgQEAKICAgICAgICAgcmV0dXJuIG07CiAgICAgfQogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBtYXBwZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICBLZXkgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBOZXcgbWFwcGVkIHZhbHVlCi0gICAgICogQHJldHVybiBUaGUgb2xkIHZhbHVlIGlmIHRoZSBrZXkgd2FzIGFscmVhZHkgaW4gdGhlIG1hcCBvciBudWxsCi0gICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBzdWNoIG1hcHBpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgcHV0KEsga2V5LCBWIHZhbHVlKSB7CkBAIC0zMzksNyArMzYwLDcgQEAKICAgICAgICAgICAgIGludCBoYXNoID0ga2V5Lmhhc2hDb2RlKCk7CiAgICAgICAgICAgICBpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOwogICAgICAgICAgICAgbSA9IChMaW5rZWRIYXNoTWFwRW50cnk8SywgVj4pZmluZE5vbk51bGxLZXlFbnRyeShrZXksIGluZGV4LCBoYXNoKTsKLSAgICAgICAgICAgIGlmIChtID09IG51bGwpIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbW9kQ291bnQrKzsKICAgICAgICAgICAgICAgICBpZiAoKytlbGVtZW50Q291bnQgPiB0aHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgICAgICAgcmVoYXNoKCk7CkBAIC0zNTUsNiArMzc2LDcgQEAKICAgICAgICAgbS52YWx1ZSA9IHZhbHVlOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKgogICAgICAqIEBwYXJhbSBtCkBAIC00MTMsMTEgKzQzNSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTZXQgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIEhhc2hNYXAuIEVhY2ggZWxlbWVudCBpbgotICAgICAqIHRoZSBzZXQgaXMgYSBNYXAuRW50cnkuIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgSGFzaE1hcCBzbyBjaGFuZ2VzIHRvCi0gICAgICogb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUgc2V0IGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgorICAgICAqIFJldHVybnMgYSBzZXQgY29udGFpbmluZyBhbGwgb2YgdGhlIG1hcHBpbmdzIGluIHRoaXMgbWFwLiBFYWNoIG1hcHBpbmcgaXMKKyAgICAgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWFwLkVudHJ5fS4gQXMgdGhlIHNldCBpcyBiYWNrZWQgYnkgdGhpcyBtYXAsCisgICAgICogY2hhbmdlcyBpbiBvbmUgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIG90aGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTZXQgb2YgdGhlIG1hcHBpbmdzCisgICAgICogQHJldHVybiBhIHNldCBvZiB0aGUgbWFwcGluZ3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxNYXAuRW50cnk8SywgVj4+IGVudHJ5U2V0KCkgewpAQCAtNDI1LDExICs0NDgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIEhhc2hNYXAuIFRoZSBzZXQgaXMgYmFja2VkIGJ5Ci0gICAgICogdGhpcyBIYXNoTWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUgc2V0IGRvZXMKLSAgICAgKiBub3Qgc3VwcG9ydCBhZGRpbmcuCisgICAgICogUmV0dXJucyBhIHNldCBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZSBzZXQgaXMgYmFja2VkIGJ5CisgICAgICogdGhpcyBtYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZSBzZXQgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IGFkZGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU2V0IG9mIHRoZSBrZXlzCisgICAgICogQHJldHVybiBhIHNldCBvZiB0aGUga2V5cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2V0PEs+IGtleVNldCgpIHsKQEAgLTQ3MywxMSArNDk3LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBIYXNoTWFwLiBUaGUKLSAgICAgKiBjb2xsZWN0aW9uIGlzIGJhY2tlZCBieSB0aGlzIEhhc2hNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieQotICAgICAqIHRoZSBvdGhlci4gVGhlIGNvbGxlY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcuCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZSBjb2xsZWN0aW9uCisgICAgICogaXMgYmFja2VkIGJ5IHRoaXMgbWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUKKyAgICAgKiBjb2xsZWN0aW9uIHN1cHBvcnRzIHJlbW92ZSwgcmVtb3ZlQWxsLCByZXRhaW5BbGwgYW5kIGNsZWFyIG9wZXJhdGlvbnMsCisgICAgICogYW5kIGl0IGRvZXMgbm90IHN1cHBvcnQgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBjb2xsZWN0aW9uIHdoaWNoIGlzIHRoZSBzdWJjbGFzcyBvZgorICAgICAqIEFic3RyYWN0Q29sbGVjdGlvbi4gVGhlIGl0ZXJhdG9yIG1ldGhvZCBvZiB0aGlzIHN1YmNsYXNzIHJldHVybnMgYQorICAgICAqICJ3cmFwcGVyIG9iamVjdCIgb3ZlciB0aGUgaXRlcmF0b3Igb2YgbWFwJ3MgZW50cnlTZXQoKS4gVGhlIHNpemUgbWV0aG9kCisgICAgICogd3JhcHMgdGhlIG1hcCdzIHNpemUgbWV0aG9kIGFuZCB0aGUgY29udGFpbnMgbWV0aG9kIHdyYXBzIHRoZSBtYXAncworICAgICAqIGNvbnRhaW5zVmFsdWUgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgICAqIGFuZCByZXR1cm5lZCBpbiByZXNwb25zZSB0byBhbGwgc3Vic2VxdWVudCBjYWxscy4gVGhpcyBtZXRob2QgbWF5IHJldHVybgorICAgICAqIGRpZmZlcmVudCBjb2xsZWN0aW9ucyB3aGVuIG11bHRpcGxlIGNvbmN1cnJlbnQgY2FsbHMgb2NjdXIsIHNpbmNlIG5vCisgICAgICogc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcworICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKQEAgLTUxMiwxMiArNTUxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkuCisgICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBtYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IG9yIG51bGwgaWYgdGhlIGtleSB3YXMgbm8gaW4KLSAgICAgKiAgICAgICAgIHRoZSBtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIG1hcHBpbmcgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIG1hcHBpbmcKKyAgICAgKiAgICAgICAgIGZvciB0aGUgc3BlY2lmaWVkIGtleSB3YXMgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKQEAgLTU0NCwyNCArNTg0LDQ3IEBACiAgICAgICogVGhpcyBtZXRob2QgaXMgcXVlcmllZCBmcm9tIHRoZSBwdXQgYW5kIHB1dEFsbCBtZXRob2RzIHRvIGNoZWNrIGlmIHRoZQogICAgICAqIGVsZGVzdCBtZW1iZXIgb2YgdGhlIG1hcCBzaG91bGQgYmUgZGVsZXRlZCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgbWVtYmVyLgogICAgICAqIElmIHRoaXMgbWFwIHdhcyBjcmVhdGVkIHdpdGggYWNjZXNzT3JkZXIgPSB0cnVlLCB0aGVuIHRoZSByZXN1bHQgb2YKLSAgICAgKiByZW1vdmVFbGRlc3JFbnRyeSBpcyBhc3N1bWVkIHRvIGJlIGZhbHNlLgorICAgICAqIHJlbW92ZUVsZGVzdEVudHJ5IGlzIGFzc3VtZWQgdG8gYmUgZmFsc2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVsZGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxkZXN0IG1lbWJlciBzaG91bGQgYmUgcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgdGhlIGVudHJ5IHRvIGNoZWNrIGlmIGl0IHNob3VsZCBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBlbGRlc3QgbWVtYmVyIHNob3VsZCBiZSByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeTxLLFY+IGVsZGVzdCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIEhhc2hNYXAsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIG1hcCwgbGVhdmluZyBpdCBlbXB0eS4KICAgICAgKiAKICAgICAgKiBAc2VlICNpc0VtcHR5KCkKICAgICAgKiBAc2VlICNzaXplKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKICAgICAgICAgc3VwZXIuY2xlYXIoKTsKICAgICAgICAgaGVhZCA9IHRhaWwgPSBudWxsOwogICAgIH0KKworICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgIC8vIC8qKgorICAgIC8vICAqIEFuc3dlcnMgYSBuZXcgSGFzaE1hcCB3aXRoIHRoZSBzYW1lIG1hcHBpbmdzIGFuZCBzaXplIGFzIHRoaXMgSGFzaE1hcC4KKyAgICAvLyAgKiAKKyAgICAvLyAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgSGFzaE1hcAorICAgIC8vICAqIAorICAgIC8vICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgIC8vICAqLworICAgIC8vIEBPdmVycmlkZQorICAgIC8vIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIC8vIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgLy8gICAgIExpbmtlZEhhc2hNYXA8SywgVj4gbWFwID0gKExpbmtlZEhhc2hNYXA8SywgVj4pIHN1cGVyLmNsb25lKCk7CisgICAgLy8gICAgIG1hcC5jbGVhcigpOworICAgIC8vICAgICBmb3IgKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA6IGVudHJ5U2V0KCkpIHsKKyAgICAvLyAgICAgICAgIG1hcC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgIC8vICAgICB9CisgICAgLy8gICAgIHJldHVybiBtYXA7CisgICAgLy8gfQorICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlua2VkSGFzaFNldC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaW5rZWRIYXNoU2V0LmphdmEKaW5kZXggN2NhNGQxYy4uOTQzZTAxYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaW5rZWRIYXNoU2V0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaW5rZWRIYXNoU2V0LmphdmEKQEAgLTIxLDE0ICsyMSwxNyBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIExpbmtlZEhhc2hTZXQgaXMgYSB2YXJpYW50IG9uIEhhc2hTZXQuIEl0cyBlbnRyaWVzIGFyZSBrZXB0IGluIGEgZG91Ymx5LWxpbmtlZCBsaXN0LgotICogVGhlIGl0ZXJhdGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggZW50cmllcyB3ZXJlIGluc2VydGVkLgorICogTGlua2VkSGFzaFNldCBpcyBhIHZhcmlhbnQgb2YgSGFzaFNldC4gSXRzIGVudHJpZXMgYXJlIGtlcHQgaW4gYQorICogZG91Ymx5LWxpbmtlZCBsaXN0LiBUaGUgaXRlcmF0aW9uIG9yZGVyIGlzIHRoZSBvcmRlciBpbiB3aGljaCBlbnRyaWVzIHdlcmUKKyAqIGluc2VydGVkLgogICogPHA+CiAgKiBOdWxsIGVsZW1lbnRzIGFyZSBhbGxvd2VkLCBhbmQgYWxsIHRoZSBvcHRpb25hbCBTZXQgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgogICogPHA+Ci0gKiBMaWtlIEhhc2hTZXQsIExpbmtlZEhhc2hTZXQgaXMgbm90IHRocmVhZCBzYWZlLCBzbyBhY2Nlc3MgYnkgbXVsdGlwbGUgdGhyZWFkcyBtdXN0IGJlIHN5bmNocm9uaXplZAotICogYnkgYW4gZXh0ZXJuYWwgbWVjaGFuaXNtIHN1Y2ggYXMgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0LgotICogQHNpbmNlIDEuNAorICogTGlrZSBIYXNoU2V0LCBMaW5rZWRIYXNoU2V0IGlzIG5vdCB0aHJlYWQgc2FmZSwgc28gYWNjZXNzIGJ5IG11bHRpcGxlIHRocmVhZHMKKyAqIG11c3QgYmUgc3luY2hyb25pemVkIGJ5IGFuIGV4dGVybmFsIG1lY2hhbmlzbSBzdWNoIGFzCisgKiB7QGxpbmsgQ29sbGVjdGlvbnMjc3luY2hyb25pemVkU2V0KFNldCl9LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIExpbmtlZEhhc2hTZXQ8RT4gZXh0ZW5kcyBIYXNoU2V0PEU+IGltcGxlbWVudHMgU2V0PEU+LCBDbG9uZWFibGUsCiAgICAgICAgIFNlcmlhbGl6YWJsZSB7CkBAIC0zNiw0MSArMzksNDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjg1MTY2NzY3OTk3MTAzODY5MEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGluc3RhbmNlIG9mIExpbmtlZEhhc2hTZXQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiB7QGNvZGUgTGlua2VkSGFzaFNldH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpbmtlZEhhc2hTZXQoKSB7CiAgICAgICAgIHN1cGVyKG5ldyBMaW5rZWRIYXNoTWFwPEUsIEhhc2hTZXQ8RT4+KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTGlua2VkSGFzaFNldCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgTGlua2VkSGFzaFNldH0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY2FwYWNpdHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGlzIEhhc2hTZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMge0Bjb2RlIExpbmtlZEhhc2hTZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rZWRIYXNoU2V0KGludCBjYXBhY2l0eSkgewogICAgICAgICBzdXBlcihuZXcgTGlua2VkSGFzaE1hcDxFLCBIYXNoU2V0PEU+PihjYXBhY2l0eSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTGlua2VkSGFzaFNldCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkKLSAgICAgKiBhbmQgbG9hZCBmYWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgTGlua2VkSGFzaFNldH0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjYXBhY2l0eQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5LgogICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yCi0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBsb2FkIGZhY3RvcgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgbG9hZCBmYWN0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpbmtlZEhhc2hTZXQoaW50IGNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CiAgICAgICAgIHN1cGVyKG5ldyBMaW5rZWRIYXNoTWFwPEUsIEhhc2hTZXQ8RT4+KGNhcGFjaXR5LCBsb2FkRmFjdG9yKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBMaW5rZWRIYXNoU2V0IGNvbnRhaW5pbmcgdGhlIHVuaXF1ZSBlbGVtZW50cwotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBMaW5rZWRIYXNoU2V0fSBjb250YWluaW5nIHRoZSB1bmlxdWUKKyAgICAgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rZWRIYXNoU2V0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKICAgICAgICAgc3VwZXIobmV3IExpbmtlZEhhc2hNYXA8RSwgSGFzaFNldDxFPj4oY29sbGVjdGlvbi5zaXplKCkgPCA2ID8gMTEKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlua2VkTGlzdC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaW5rZWRMaXN0LmphdmEKaW5kZXggN2Y4OWI4MC4uN2NmZWZlNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaW5rZWRMaXN0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaW5rZWRMaXN0LmphdmEKQEAgLTI2LDkgKzI2LDEwIEBACiAKIC8qKgogICogTGlua2VkTGlzdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBMaXN0LCBiYWNrZWQgYnkgYSBsaW5rZWQgbGlzdC4gQWxsCi0gKiBvcHRpb25hbCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQsIGFkZGluZywgcmVtb3ZpbmcgYW5kIHJlcGxhY2luZy4gVGhlCisgKiBvcHRpb25hbCBvcGVyYXRpb25zIChhZGRpbmcsIHJlbW92aW5nIGFuZCByZXBsYWNpbmcpIGFyZSBzdXBwb3J0ZWQuIFRoZQogICogZWxlbWVudHMgY2FuIGJlIGFueSBvYmplY3RzLgotICogQHNpbmNlIDEuMgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIExpbmtlZExpc3Q8RT4gZXh0ZW5kcyBBYnN0cmFjdFNlcXVlbnRpYWxMaXN0PEU+IGltcGxlbWVudHMKICAgICAgICAgTGlzdDxFPiwgUXVldWU8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKQEAgLTE3Niw4ICsxNzcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgTGlua2VkTGlzdC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGluc3RhbmNlIG9mIHtAY29kZSBMaW5rZWRMaXN0fS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGlua2VkTGlzdCgpIHsKICAgICAgICAgdm9pZExpbmsgPSBuZXcgTGluazxFPihudWxsLCBudWxsLCBudWxsKTsKQEAgLTE4NiwxMyArMTg4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5MaW5rZWRMaXN0PC9jb2RlPiB0aGF0IGhvbGRzIAotICAgICAqIGFsbCBvZiB0aGUgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBzdXBwbGllZCA8Y29kZT5jb2xsZWN0aW9uPC9jb2RlPgotICAgICAqIGFyZ3VtZW50LiBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbmV3IDxjb2RlPkxpbmtlZExpc3Q8L2NvZGU+IAotICAgICAqIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+LiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBMaW5rZWRMaXN0fSB0aGF0IGhvbGRzIGFsbCBvZiB0aGUKKyAgICAgKiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCB7QGNvZGUgY29sbGVjdGlvbn0uIFRoZSBvcmRlciBvZiB0aGUKKyAgICAgKiBlbGVtZW50cyBpbiB0aGlzIG5ldyB7QGNvZGUgTGlua2VkTGlzdH0gd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZQorICAgICAqIGl0ZXJhdGlvbiBvcmRlciBvZiB7QGNvZGUgY29sbGVjdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rZWRMaXN0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKICAgICAgICAgdGhpcygpOwpAQCAtMjAwLDE4ICsyMDMsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhpcyBMaW5rZWRMaXN0IGF0IHRoZSBzcGVjaWZpZWQKLSAgICAgKiBsb2NhdGlvbi4gVGhlIG9iamVjdCBpcyBpbnNlcnRlZCBiZWZvcmUgYW55IHByZXZpb3VzIGVsZW1lbnQgYXQgdGhlCi0gICAgICogc3BlY2lmaWVkIGxvY2F0aW9uLiBJZiB0aGUgbG9jYXRpb24gaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhpcwotICAgICAqIExpbmtlZExpc3QsIHRoZSBvYmplY3QgaXMgYWRkZWQgYXQgdGhlIGVuZC4KKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhpcyB7QGNvZGUgTGlua2VkTGlzdH0gYXQgdGhlCisgICAgICogc3BlY2lmaWVkIGxvY2F0aW9uLiBUaGUgb2JqZWN0IGlzIGluc2VydGVkIGJlZm9yZSBhbnkgcHJldmlvdXMgZWxlbWVudCBhdAorICAgICAqIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIElmIHRoZSBsb2NhdGlvbiBpcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGlzCisgICAgICoge0Bjb2RlIExpbmtlZExpc3R9LCB0aGUgb2JqZWN0IGlzIGFkZGVkIGF0IHRoZSBlbmQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0LgogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkKGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKQEAgLTIzOCwxMSArMjQxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgZW5kIG9mIHRoaXMgTGlua2VkTGlzdC4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhpcyB7QGNvZGUgTGlua2VkTGlzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRydWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEByZXR1cm4gYWx3YXlzIHRydWUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBvYmplY3QpIHsKQEAgLTI1NywxNiArMjYxLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbgotICAgICAqIGluIHRoaXMgTGlua2VkTGlzdC4gVGhlIG9iamVjdHMgYXJlIGFkZGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZXR1cm5lZAotICAgICAqIGZyb20gdGhlIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IGl0ZXJhdG9yLgorICAgICAqIEluc2VydHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KKyAgICAgKiBpbiB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fS4gVGhlIG9iamVjdHMgYXJlIGFkZGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZQorICAgICAqIHJldHVybmVkIGZyb20gdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBMaW5rZWRMaXN0IGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbgotICAgICAqICAgICAgICAgICAgPGNvZGU+bG9jYXRpb24gPCAwIHx8ID4gc2l6ZSgpPC9jb2RlPgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydC4KKyAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9IGlzIG1vZGlmaWVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMgbGlzdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBsaXN0LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgPiBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBsb2NhdGlvbiwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewpAQCAtMzAyLDExICszMTMsMTMgQEAKIAogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gdG8gdGhpcyBMaW5rZWRMaXN0LgorICAgICAqIEFkZHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIHRvIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgTGlua2VkTGlzdCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9IGlzIG1vZGlmaWVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKQEAgLTMyOCwxMCArMzQxLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgTGlua2VkTGlzdC4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyB7QGNvZGUgTGlua2VkTGlzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEZpcnN0KEUgb2JqZWN0KSB7CiAgICAgICAgIExpbms8RT4gb2xkRmlyc3QgPSB2b2lkTGluay5uZXh0OwpAQCAtMzQzLDEwICszNTcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhpcyBMaW5rZWRMaXN0LgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgdGhlIGVuZCBvZiB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkTGFzdChFIG9iamVjdCkgewogICAgICAgICBMaW5rPEU+IG9sZExhc3QgPSB2b2lkTGluay5wcmV2aW91czsKQEAgLTM1OCwxMCArMzczLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIExpbmtlZExpc3QsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fSwgbGVhdmluZyBpdCBlbXB0eS4KICAgICAgKiAKICAgICAgKiBAc2VlIExpc3QjaXNFbXB0eQogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKQEAgLTM3NCwxMiArMzkwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBMaW5rZWRMaXN0IHdpdGggdGhlIHNhbWUgZWxlbWVudHMgYW5kIHNpemUgYXMgdGhpcwotICAgICAqIExpbmtlZExpc3QuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgTGlua2VkTGlzdH0gd2l0aCB0aGUgc2FtZSBlbGVtZW50cyBhbmQgc2l6ZSBhcyB0aGlzCisgICAgICoge0Bjb2RlIExpbmtlZExpc3R9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBMaW5rZWRMaXN0Ci0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBAT3ZlcnJpZGUKQEAgLTM5OCwxMiArNDE0LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBMaW5rZWRMaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBTZWFyY2hlcyB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgYW4gZWxlbWVudCBvZiB0aGlzIExpbmtlZExpc3QsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgb2JqZWN0fSBpcyBhbiBlbGVtZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBMaW5rZWRMaXN0fSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7CkBAIC00NDUsMTIgKzQ2MiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhpcyBMaW5rZWRMaXN0LgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhpcyB7QGNvZGUgTGlua2VkTGlzdH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhpcyBMaW5rZWRMaXN0IGlzIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fSBpcyBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSBnZXRGaXJzdCgpIHsKICAgICAgICAgTGluazxFPiBmaXJzdCA9IHZvaWRMaW5rLm5leHQ7CkBAIC00NjEsMTIgKzQ3OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGlzIExpbmtlZExpc3QuCisgICAgICogUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IGluIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGxhc3QgZWxlbWVudAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhpcyBMaW5rZWRMaXN0IGlzIGVtcHR5CisgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgTGlua2VkTGlzdH0gaXMgZW1wdHkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSBnZXRMYXN0KCkgewogICAgICAgICBMaW5rPEU+IGxhc3QgPSB2b2lkTGluay5wcmV2aW91czsKQEAgLTQ3NiwxNCArNDkzLDYgQEAKICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIExpbmtlZExpc3QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSBpbmRleAotICAgICAqIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBvYmplY3QKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewogICAgICAgICBpbnQgcG9zID0gMDsKQEAgLTUwOSwxMiArNTE4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBMaW5rZWRMaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgaW5kZXgKLSAgICAgKiBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlLgorICAgICAqIFNlYXJjaGVzIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIG9iamVjdCwgb3IgLTEgaWYgaXQgd2FzCisgICAgICogICAgICAgICBub3QgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7CkBAIC01NDEsMTggKzU1MiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0SXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgTGlua2VkTGlzdC4gVGhlIGVsZW1lbnRzCi0gICAgICogYXJlIGl0ZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBvY2N1ciBpbiB0aGUgTGlua2VkTGlzdC4gVGhlCi0gICAgICogaXRlcmF0aW9uIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAqIFJldHVybnMgYSBMaXN0SXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9LiBUaGUKKyAgICAgKiBlbGVtZW50cyBhcmUgaXRlcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IG9jY3VyIGluIHRoZQorICAgICAqIHtAY29kZSBMaW5rZWRMaXN0fS4gVGhlIGl0ZXJhdGlvbiBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCB0aGUgaXRlcmF0aW9uCi0gICAgICogQHJldHVybiBhIExpc3RJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaW5rZWRMaXN0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqIEByZXR1cm4gYSBMaXN0SXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9CisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCl9CiAgICAgICogQHNlZSBMaXN0SXRlcmF0b3IKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihpbnQgbG9jYXRpb24pIHsKQEAgLTU2MCwxNCArNTcwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gZnJvbSB0aGlzIExpbmtlZExpc3QuCisgICAgICogUmVtb3ZlcyB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gZnJvbSB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZQogICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFIHJlbW92ZShpbnQgbG9jYXRpb24pIHsKQEAgLTYxOCwxMiArNjI4LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZmlyc3Qgb2JqZWN0IGZyb20gdGhpcyBMaW5rZWRMaXN0LgorICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIExpbmtlZExpc3QgaXMgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fSBpcyBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSByZW1vdmVGaXJzdCgpIHsKICAgICAgICAgTGluazxFPiBmaXJzdCA9IHZvaWRMaW5rLm5leHQ7CkBAIC02MzksMTIgKzY0OSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGxhc3Qgb2JqZWN0IGZyb20gdGhpcyBMaW5rZWRMaXN0LgorICAgICAqIFJlbW92ZXMgdGhlIGxhc3Qgb2JqZWN0IGZyb20gdGhpcyB7QGNvZGUgTGlua2VkTGlzdH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVtb3ZlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoaXMgTGlua2VkTGlzdCBpcyBlbXB0eQorICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9IGlzIGVtcHR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIHJlbW92ZUxhc3QoKSB7CiAgICAgICAgIExpbms8RT4gbGFzdCA9IHZvaWRMaW5rLnByZXZpb3VzOwpAQCAtNjYwLDE3ICs2NzAsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoaXMgTGlua2VkTGlzdCB3aXRoCi0gICAgICogdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogUmVwbGFjZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fQorICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCBhdCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBlbGVtZW50IGF0IHRoZSBpbmRleC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBvZiBhbiBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcyBsaXN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIGxpc3QuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEUgc2V0KGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKQEAgLTY5Myw5ICs3MDcsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBMaW5rZWRMaXN0LgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBMaW5rZWRMaXN0CisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKQEAgLTcyNSw5ICs3NDAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIExpbmtlZExpc3QuCisgICAgICogUmV0dXJucyBhIG5ldyBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcworICAgICAqIHtAY29kZSBMaW5rZWRMaXN0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgTGlua2VkTGlzdAorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyB7QGNvZGUgTGlua2VkTGlzdH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CkBAIC03NDIsMTkgKzc1OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMgTGlua2VkTGlzdC4gSWYKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbGVtZW50cywgdGhlIHNwZWNpZmllZAotICAgICAqIGFycmF5IGlzIHVzZWQsIG90aGVyd2lzZSBhbiBhcnJheSBvZiB0aGUgc2FtZSB0eXBlIGlzIGNyZWF0ZWQuIElmIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheSBpcyB1c2VkIGFuZCBpcyBsYXJnZXIgdGhhbiB0aGlzIExpbmtlZExpc3QsIHRoZSBhcnJheQotICAgICAqIGVsZW1lbnQgZm9sbG93aW5nIHRoZSBjb2xsZWN0aW9uIGVsZW1lbnRzIGlzIHNldCB0byBudWxsLgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMKKyAgICAgKiB7QGNvZGUgTGlua2VkTGlzdH0uIElmIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICAgICogZWxlbWVudHMsIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMgdXNlZCwgb3RoZXJ3aXNlIGFuIGFycmF5IG9mIHRoZSBzYW1lCisgICAgICogdHlwZSBpcyBjcmVhdGVkLiBJZiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIHVzZWQgYW5kIGlzIGxhcmdlciB0aGFuIHRoaXMKKyAgICAgKiB7QGNvZGUgTGlua2VkTGlzdH0sIHRoZSBhcnJheSBlbGVtZW50IGZvbGxvd2luZyB0aGUgY29sbGVjdGlvbiBlbGVtZW50cworICAgICAqIGlzIHNldCB0byBudWxsLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb250ZW50cwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5Ci0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIExpbmtlZExpc3QKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIEFycmF5U3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyBMaW5rZWRMaXN0IGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBMaW5rZWRMaXN0fS4KKyAgICAgKiBAdGhyb3dzIEFycmF5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoaXMge0Bjb2RlIExpbmtlZExpc3R9IGNhbm5vdAorICAgICAqICAgICAgICAgICAgIGJlIHN0b3JlZCBpbiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaXN0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3QuamF2YQppbmRleCAyMmU3Y2EyLi5kOTViMmQ1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3QuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3QuamF2YQpAQCAtMTksMzM3ICsxOSwzNjIgQEAKIAogCiAvKioKLSAqIExpc3QgaXMgYSBjb2xsZWN0aW9uIHdoaWNoIG1haW50YWlucyBhbiBvcmRlcmluZyBmb3IgaXRzIGVsZW1lbnRzLiBFdmVyeQotICogZWxlbWVudCBpbiB0aGUgbGlzdCBoYXMgYW4gaW5kZXguCisgKiBBIHtAY29kZSBMaXN0fSBpcyBhIGNvbGxlY3Rpb24gd2hpY2ggbWFpbnRhaW5zIGFuIG9yZGVyaW5nIGZvciBpdHMgZWxlbWVudHMuIEV2ZXJ5CisgKiBlbGVtZW50IGluIHRoZSB7QGNvZGUgTGlzdH0gaGFzIGFuIGluZGV4LiBFYWNoIGVsZW1lbnQgY2FuIHRodXMgYmUgYWNjZXNzZWQgYnkgaXRzCisgKiBpbmRleCwgd2l0aCB0aGUgZmlyc3QgaW5kZXggYmVpbmcgemVyby4gTm9ybWFsbHksIHtAY29kZSBMaXN0fXMgYWxsb3cgZHVwbGljYXRlCisgKiBlbGVtZW50cywgYXMgY29tcGFyZWQgdG8gU2V0cywgd2hlcmUgZWxlbWVudHMgaGF2ZSB0byBiZSB1bmlxdWUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIExpc3Q8RT4gZXh0ZW5kcyBDb2xsZWN0aW9uPEU+IHsKICAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhpcyBWZWN0b3IgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLSAgICAgKiBUaGUgb2JqZWN0IGlzIGluc2VydGVkIGJlZm9yZSBhbnkgcHJldmlvdXMgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkCi0gICAgICogbG9jYXRpb24uIElmIHRoZSBsb2NhdGlvbiBpcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGlzIExpc3QsIHRoZSBvYmplY3QKLSAgICAgKiBpcyBhZGRlZCBhdCB0aGUgZW5kLgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byB0aGlzIHtAY29kZSBMaXN0fSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAqIFRoZSBvYmplY3QgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBjdXJyZW50IGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZAorICAgICAqIGxvY2F0aW9uLiBJZiB0aGUgbG9jYXRpb24gaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhpcyB7QGNvZGUgTGlzdH0sIHRoZSBvYmplY3QKKyAgICAgKiBpcyBhZGRlZCBhdCB0aGUgZW5kLiBJZiB0aGUgbG9jYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSBzaXplIG9mIHRoaXMKKyAgICAgKiB7QGNvZGUgTGlzdH0sIHRoZW4gYWxsIGVsZW1lbnRzIGJleW9uZCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGFyZSBtb3ZlZCBieSBvbmUKKyAgICAgKiBwb3NpdGlvbiB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIHtAY29kZSBMaXN0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFkZGluZyB0byB0aGlzIExpc3QgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMge0Bjb2RlIExpc3R9IGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICBMaXN0CisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIExpc3R9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIExpc3QKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMge0Bjb2RlIExpc3R9LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgbG9jYXRpb24gPiBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKGludCBsb2NhdGlvbiwgRSBvYmplY3QpOwogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgZW5kIG9mIHRoaXMgTGlzdC4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhpcyB7QGNvZGUgTGlzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRydWUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkLgorICAgICAqIEByZXR1cm4gYWx3YXlzIHRydWUuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyB7QGNvZGUgTGlzdH0gaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcwotICAgICAqICAgICAgICAgICAgICAgIExpc3QKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgTGlzdH0uCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgTGlzdAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyB7QGNvZGUgTGlzdH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KTsKIAogICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLSAgICAgKiBpbiB0aGlzIExpc3QuIFRoZSBvYmplY3RzIGFyZSBhZGRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgZnJvbQotICAgICAqIHRoZSBDb2xsZWN0aW9uIGl0ZXJhdG9yLgorICAgICAqIEluc2VydHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KKyAgICAgKiBpbiB0aGlzIHtAY29kZSBMaXN0fS4gVGhlIG9iamVjdHMgYXJlIGFkZGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZXR1cm5lZCBmcm9tCisgICAgICogdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQuCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBMaXN0IGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMge0Bjb2RlIExpc3R9IGhhcyBiZWVuIG1vZGlmaWVkIHRocm91Z2ggdGhlIGluc2VydGlvbiwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSAoaS5lLiBpZiB0aGUgcGFzc2VkIGNvbGxlY3Rpb24gd2FzIGVtcHR5KS4KICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFkZGluZyB0byB0aGlzIHtAY29kZSBMaXN0fSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMgTGlzdAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIGFuIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIExpc3R9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgTGlzdAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIHtAY29kZSBMaXN0fS4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgd2hlbiB7QGNvZGUgbG9jYXRpb24gPCAwIHx8ID4gc2l6ZSgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgbG9jYXRpb24sIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pOwogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGlzIExpc3QuIFRoZQotICAgICAqIG9iamVjdHMgYXJlIGFkZGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZXR1cm5lZCBmcm9tIHRoZSBDb2xsZWN0aW9uCi0gICAgICogaXRlcmF0b3IuCisgICAgICogQWRkcyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGlzIHtAY29kZSBMaXN0fS4gVGhlCisgICAgICogb2JqZWN0cyBhcmUgYWRkZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHJldHVybmVkIGZyb20gdGhlCisgICAgICogY29sbGVjdGlvbidzIGl0ZXJhdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgTGlzdCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIExpc3R9IGlzIG1vZGlmaWVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqICAgICAgICAgKGkuZS4gaWYgdGhlIHBhc3NlZCBjb2xsZWN0aW9uIHdhcyBlbXB0eSkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyB7QGNvZGUgTGlzdH0gaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIGFuIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzIExpc3QKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiBhbiBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSBMaXN0fS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIExpc3QKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyB7QGNvZGUgTGlzdH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIExpc3QsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBMaXN0fSwgbGVhdmluZyBpdCBlbXB0eS4KICAgICAgKiAKICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMgTGlzdCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogCisgICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMge0Bjb2RlIExpc3R9IGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHNlZSAjaXNFbXB0eQogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhcigpOwogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBMaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMge0Bjb2RlIExpc3R9IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBvYmplY3QgaXMgYW4gZWxlbWVudCBvZiB0aGlzIExpc3QsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG9iamVjdCBpcyBhbiBlbGVtZW50IG9mIHRoaXMge0Bjb2RlIExpc3R9LCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KTsKIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgTGlzdCBmb3IgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uLgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyB7QGNvZGUgTGlzdH0gY29udGFpbnMgYWxsIG9iamVjdHMgY29udGFpbmVkIGluIHRoZQorICAgICAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBhcmUgZWxlbWVudHMgb2YKLSAgICAgKiAgICAgICAgIHRoaXMgTGlzdCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFyZQorICAgICAqICAgICAgICAgZWxlbWVudHMgb2YgdGhpcyB7QGNvZGUgTGlzdH0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbik7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgcmVwcmVzZW50Ci0gICAgICogdGhlIDxlbT5zYW1lPC9lbT4gb2JqZWN0IHVzaW5nIGEgY2xhc3Mgc3BlY2lmaWMgY29tcGFyaXNvbi4KKyAgICAgKiBDb21wYXJlcyB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIHtAY29kZSBMaXN0fSwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5CisgICAgICogcmVwcmVzZW50IHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uIEZvcgorICAgICAqIHtAY29kZSBMaXN0fXMsIHRoaXMgbWVhbnMgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gZXhhY3RseSB0aGUgc2FtZQorICAgICAqIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIE9iamVjdCB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzCi0gICAgICogICAgICAgICBvYmplY3QgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0LgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiBib29sZWFuIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0LAorICAgICAqICAgICAgICAgYW5kIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBvYmplY3QuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyBMaXN0LgorICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIHtAY29kZSBMaXN0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIGdldChpbnQgbG9jYXRpb24pOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIHtAY29kZSBMaXN0fS4gSXQgaXMgY2FsY3VsYXRlZCBieSB0YWtpbmcgZWFjaAorICAgICAqIGVsZW1lbnQnIGhhc2hjb2RlIGFuZCBpdHMgcG9zaXRpb24gaW4gdGhlIHtAY29kZSBMaXN0fSBpbnRvIGFjY291bnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIG9mIHRoZSB7QGNvZGUgTGlzdH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpOwogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBMaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlCisgICAgICogU2VhcmNoZXMgdGhpcyB7QGNvZGUgTGlzdH0gZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUKICAgICAgKiBmaXJzdCBvY2N1cnJlbmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb2JqZWN0IG9yIC0xIGlmIHRoZQorICAgICAqICAgICAgICAgb2JqZWN0IHdhcyBub3QgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIExpc3QgaGFzIG5vIGVsZW1lbnRzLCBhIHNpemUgb2YgemVyby4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB7QGNvZGUgTGlzdH0gY29udGFpbnMgbm8gZWxlbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgTGlzdCBoYXMgbm8gZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIExpc3R9IGhhcyBubyBlbGVtZW50cywge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIExpc3QuIFRoZSBlbGVtZW50cyBhcmUKLSAgICAgKiBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgaW4gdGhlIExpc3QuCisgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyB7QGNvZGUgTGlzdH0uIFRoZSBlbGVtZW50cyBhcmUKKyAgICAgKiBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IG9jY3VyIGluIHRoZSB7QGNvZGUgTGlzdH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBMaXN0Ci0gICAgICogCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyB7QGNvZGUgTGlzdH0uCiAgICAgICogQHNlZSBJdGVyYXRvcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBMaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlCisgICAgICogU2VhcmNoZXMgdGhpcyB7QGNvZGUgTGlzdH0gZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUKICAgICAgKiBsYXN0IG9jY3VycmVuY2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb2JqZWN0LCBvciAtMSBpZiB0aGUKKyAgICAgKiAgICAgICAgIG9iamVjdCB3YXMgbm90IGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG9iamVjdCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTGlzdEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIExpc3QuIFRoZSBlbGVtZW50cyBhcmUKLSAgICAgKiBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgaW4gdGhlIExpc3QuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBMaXN0fSBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyB7QGNvZGUgTGlzdH0uIFRoZSBlbGVtZW50cyBhcmUKKyAgICAgKiBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgaW4gdGhlIHtAY29kZSBMaXN0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgTGlzdEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIExpc3QKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIExpc3R9IGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBMaXN0fQogICAgICAqIAogICAgICAqIEBzZWUgTGlzdEl0ZXJhdG9yCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0SXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgTGlzdC4gVGhlIGVsZW1lbnRzIGFyZQotICAgICAqIGl0ZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBvY2N1ciBpbiB0aGUgTGlzdC4gVGhlIGl0ZXJhdGlvbgorICAgICAqIFJldHVybnMgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBMaXN0fS4gVGhlIGVsZW1lbnRzIGFyZQorICAgICAqIGl0ZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhlIHtAY29kZSBMaXN0fS4gVGhlIGl0ZXJhdGlvbgogICAgICAqIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBpdGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIGEgTGlzdEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIExpc3QKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCB0aGUgaXRlcmF0aW9uLgorICAgICAqIEByZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBMaXN0fS4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCk8L2NvZGU+Ci0gICAgICogCisgICAgICogICAgICAgICAgICAgICAgd2hlbiB7QGNvZGUgbG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID4gc2l6ZSgpfQogICAgICAqIEBzZWUgTGlzdEl0ZXJhdG9yCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGxvY2F0aW9uKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGZyb20gdGhpcyBMaXN0LgorICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGZyb20gdGhpcyB7QGNvZGUgTGlzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIG9iamVjdAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0LgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyB7QGNvZGUgTGlzdH0gaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgd2hlbiB7QGNvZGUgbG9jYXRpb24gPCAwIHx8ID49IHNpemUoKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSByZW1vdmUoaW50IGxvY2F0aW9uKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGlzIExpc3QuCisgICAgICogUmVtb3ZlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMge0Bjb2RlIExpc3R9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgTGlzdCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB7QGNvZGUgTGlzdH0gd2FzIG1vZGlmaWVkIGJ5IHRoaXMgb3BlcmF0aW9uLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyB7QGNvZGUgTGlzdH0gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCk7CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBpbiB0aGlzIExpc3Qgb2YgZWFjaCBvYmplY3QgaW4gdGhlIHNwZWNpZmllZAotICAgICAqIENvbGxlY3Rpb24uCisgICAgICogUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgaW4gdGhpcyB7QGNvZGUgTGlzdH0gb2YgZWFjaCBvYmplY3QgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgTGlzdCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBMaXN0fSBpcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIExpc3QgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIHtAY29kZSBMaXN0fSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMgTGlzdCB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBDb2xsZWN0aW9uLgorICAgICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIHtAY29kZSBMaXN0fSB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZQorICAgICAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJldGFpbgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIExpc3QgaXMgbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byByZXRhaW4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgTGlzdH0gaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBMaXN0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyB7QGNvZGUgTGlzdH0gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKTsKIAogICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyBMaXN0IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBSZXBsYWNlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoaXMge0Bjb2RlIExpc3R9IHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIG9iamVjdC4gVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSB7QGNvZGUgTGlzdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCBhdCB0aGUgaW5kZXgKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gaW5zZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQgYXQgdGhlIGluZGV4LgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlcGxhY2luZyBlbGVtZW50cyBpbiB0aGlzIExpc3QgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVwbGFjaW5nIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIExpc3R9IGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiBhbiBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcyBMaXN0CisgICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgYW4gb2JqZWN0IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgTGlzdH0uCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBMaXN0CisgICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMge0Bjb2RlIExpc3R9LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIHNldChpbnQgbG9jYXRpb24sIEUgb2JqZWN0KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIExpc3QuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIExpc3R9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIExpc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyB7QGNvZGUgTGlzdH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzaXplKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTGlzdCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyBMaXN0IGZyb20gdGhlIHN0YXJ0IGluZGV4Ci0gICAgICogdG8gb25lIGxlc3MgdGhhbiB0aGUgZW5kIGluZGV4LiBUaGUgcmV0dXJuZWQgTGlzdCBpcyBiYWNrZWQgYnkgdGhpcyBsaXN0Ci0gICAgICogc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBMaXN0fSBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyB7QGNvZGUgTGlzdH0gZnJvbSB0aGUgZ2l2ZW4gc3RhcnQKKyAgICAgKiBpbmRleCB0byB0aGUgZW5kIGluZGV4IG1pbnVzIG9uZS4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyBiYWNrZWQgYnkgdGhpcworICAgICAqIHtAY29kZSBMaXN0fSBzbyBjaGFuZ2VzIHRvIGl0IGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBzdWJsaXN0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHN1Ymxpc3QuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIHN1Ymxpc3QKLSAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiBhIHBvcnRpb24gb2YgdGhpcyBMaXN0Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3VibGlzdC4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhIHBvcnRpb24gb2YgdGhpcyB7QGNvZGUgTGlzdH0uCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5zdGFydCA8IDAsIHN0YXJ0ID4gZW5kPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmVuZCA+IHNpemUoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBzdGFydCA8IDAsIHN0YXJ0ID4gZW5kfSBvciB7QGNvZGUgZW5kID4KKyAgICAgKiAgICAgICAgICAgICAgICBzaXplKCl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgc3RhcnQsIGludCBlbmQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBMaXN0LgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMge0Bjb2RlIExpc3R9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBMaXN0CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBMaXN0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBMaXN0LiBJZiB0aGUKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIHtAY29kZSBMaXN0fS4gSWYgdGhlCiAgICAgICogc3BlY2lmaWVkIGFycmF5IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbGVtZW50cywgdGhlIHNwZWNpZmllZCBhcnJheQogICAgICAqIGlzIHVzZWQsIG90aGVyd2lzZSBhbiBhcnJheSBvZiB0aGUgc2FtZSB0eXBlIGlzIGNyZWF0ZWQuIElmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBhcnJheSBpcyB1c2VkIGFuZCBpcyBsYXJnZXIgdGhhbiB0aGlzIExpc3QsIHRoZSBhcnJheSBlbGVtZW50IGZvbGxvd2luZworICAgICAqIGFycmF5IGlzIHVzZWQgYW5kIGlzIGxhcmdlciB0aGFuIHRoaXMge0Bjb2RlIExpc3R9LCB0aGUgYXJyYXkgZWxlbWVudCBmb2xsb3dpbmcKICAgICAgKiB0aGUgY29sbGVjdGlvbiBlbGVtZW50cyBpcyBzZXQgdG8gbnVsbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBMaXN0Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBMaXN0fS4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5U3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyBMaXN0IGNhbm5vdCBiZSBzdG9yZWQKLSAgICAgKiAgICAgICAgICAgICAgICBpbiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5CisgICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoaXMge0Bjb2RlIExpc3R9IGNhbm5vdCBiZSBzdG9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICBpbiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGFycmF5KTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlzdEl0ZXJhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3RJdGVyYXRvci5qYXZhCmluZGV4IDI1MzhiMDUuLjZjZTk0YzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlzdEl0ZXJhdG9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaXN0SXRlcmF0b3IuamF2YQpAQCAtMjAsMTI1ICsyMCwxMjQgQEAKIAogLyoqCiAgKiBBbiBMaXN0SXRlcmF0b3IgaXMgdXNlZCB0byBzZXF1ZW5jZSBvdmVyIGEgTGlzdCBvZiBvYmplY3RzLiBMaXN0SXRlcmF0b3IgY2FuCi0gKiBtb3ZlIGJhY2t3YXJkcyBvciBmb3J3YXJkcyB0aHJvdWdoIHRoZSBMaXN0LgorICogbW92ZSBiYWNrd2FyZHMgb3IgZm9yd2FyZHMgdGhyb3VnaCB0aGUgbGlzdC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTGlzdEl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4gewogICAgIAogICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byB0aGUgbGlzdCBiZXR3ZWVuIDxjb2RlPm5leHQ8L2NvZGU+Ci0gICAgICogYW5kIDxjb2RlPnByZXZpb3VzPC9jb2RlPi4gVGhlIG9iamVjdCBpbnNlcnRlZCB3aWxsIGJlIHRoZSBwcmV2aW91cwotICAgICAqIG9iamVjdC4KKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhlIGxpc3QgYmV0d2VlbiB7QGNvZGUgbmV4dH0gYW5kCisgICAgICoge0Bjb2RlIHByZXZpb3VzfS4gVGhlIG9iamVjdCBpbnNlcnRlZCB3aWxsIGJlIHRoZSBwcmV2aW91cyBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBpbnNlcnQKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBiZWluZyBpdGVyYXRlZAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGUgbGlzdAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBpbnNlcnQuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFkZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsaXN0IGJlaW5nIGl0ZXJhdGVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGxpc3QuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICB2b2lkIGFkZChFIG9iamVjdCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIGl0ZXJhdGUuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIGl0ZXJhdGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjbmV4dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlcmUgYXJlIHByZXZpb3VzIGVsZW1lbnRzIHRvIGl0ZXJhdGUuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGFyZSBwcmV2aW91cyBlbGVtZW50cyB0byBpdGVyYXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgcHJldmlvdXMgZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGFyZSBwcmV2aW91cyBlbGVtZW50cywge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI3ByZXZpb3VzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG5leHQgb2JqZWN0IGluIHRoZSBpdGVyYXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgbmV4dCBvYmplY3QuCisgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMuCiAgICAgICogQHNlZSAjaGFzTmV4dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIG5leHQoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXh0IG9iamVjdAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBvYmplY3QsIG9yIHRoZSBzaXplIG9mIHRoZSBsaXN0IGlmIHRoZQorICAgICAqICAgICAgICAgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cy4KICAgICAgKiBAc2VlICNuZXh0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIG9iamVjdAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlcmUgYXJlIG5vIHByZXZpb3VzIGVsZW1lbnRzCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBwcmV2aW91cyBlbGVtZW50cy4KICAgICAgKiBAc2VlICNoYXNQcmV2aW91cworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIHByZXZpb3VzKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXMgb2JqZWN0IGluIHRoZSBpdGVyYXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHByZXZpb3VzIG9iamVjdAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlcmUgYXJlIG5vIHByZXZpb3VzIGVsZW1lbnRzCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHByZXZpb3VzIG9iamVjdCwgb3IgLTEgaWYgdGhlIGl0ZXJhdG9yIGlzIGF0IHRoZQorICAgICAqICAgICAgICAgYmVnaW5uaW5nLgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBwcmV2aW91cyBlbGVtZW50cy4KICAgICAgKiBAc2VlICNwcmV2aW91cworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGFzdCBvYmplY3QgcmV0dXJuZWQgYnkgPGNvZGU+bmV4dDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5wcmV2aW91czwvY29kZT4gZnJvbSB0aGUgbGlzdC4KKyAgICAgKiBSZW1vdmVzIHRoZSBsYXN0IG9iamVjdCByZXR1cm5lZCBieSB7QGNvZGUgbmV4dH0gb3Ige0Bjb2RlIHByZXZpb3VzfSBmcm9tCisgICAgICogdGhlIGxpc3QuCiAgICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBiZWluZyBpdGVyYXRlZAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5uZXh0PC9jb2RlPiBvciA8Y29kZT5wcmV2aW91czwvY29kZT4gaGF2ZQotICAgICAqICAgICAgICAgICAgICAgIG5vdCBiZWVuIGNhbGxlZCwgb3IgPGNvZGU+cmVtb3ZlPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmFkZDwvY29kZT4gaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGFmdGVyIHRoZSBsYXN0Ci0gICAgICogICAgICAgICAgICAgICAgY2FsbCB0byA8Y29kZT5uZXh0PC9jb2RlPiBvciA8Y29kZT5wcmV2aW91czwvY29kZT4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcmVtb3ZpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBiZWluZyBpdGVyYXRlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuZXh0fSBvciB7QGNvZGUgcHJldmlvdXN9IGhhdmUgbm90IGJlZW4gY2FsbGVkLCBvcgorICAgICAqICAgICAgICAgICAgIHtAY29kZSByZW1vdmV9IG9yIHtAY29kZSBhZGR9IGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhZnRlcgorICAgICAqICAgICAgICAgICAgIHRoZSBsYXN0IGNhbGwgdG8ge0Bjb2RlIG5leHR9IG9yIHtAY29kZSBwcmV2aW91c30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgbGFzdCBvYmplY3QgcmV0dXJuZWQgYnkgPGNvZGU+bmV4dDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5wcmV2aW91czwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBSZXBsYWNlcyB0aGUgbGFzdCBvYmplY3QgcmV0dXJuZWQgYnkge0Bjb2RlIG5leHR9IG9yIHtAY29kZSBwcmV2aW91c30KKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxpc3QgYmVpbmcgaXRlcmF0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGxpc3QKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bmV4dDwvY29kZT4gb3IgPGNvZGU+cHJldmlvdXM8L2NvZGU+IGhhdmUKLSAgICAgKiAgICAgICAgICAgICAgICBub3QgYmVlbiBjYWxsZWQsIG9yIDxjb2RlPnJlbW92ZTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5hZGQ8L2NvZGU+IGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhZnRlciB0aGUgbGFzdAotICAgICAqICAgICAgICAgICAgICAgIGNhbGwgdG8gPGNvZGU+bmV4dDwvY29kZT4gb3IgPGNvZGU+cHJldmlvdXM8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNldC4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgc2V0dGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsaXN0IGJlaW5nIGl0ZXJhdGVkCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGUgbGlzdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5leHR9IG9yIHtAY29kZSBwcmV2aW91c30gaGF2ZSBub3QgYmVlbiBjYWxsZWQsIG9yCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHJlbW92ZX0gb3Ige0Bjb2RlIGFkZH0gaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGFmdGVyCisgICAgICogICAgICAgICAgICAgdGhlIGxhc3QgY2FsbCB0byB7QGNvZGUgbmV4dH0gb3Ige0Bjb2RlIHByZXZpb3VzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICB2b2lkIHNldChFIG9iamVjdCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3RSZXNvdXJjZUJ1bmRsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaXN0UmVzb3VyY2VCdW5kbGUuamF2YQppbmRleCAzZWU4ODBhLi4yMGQ2NGFjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3RSZXNvdXJjZUJ1bmRsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlzdFJlc291cmNlQnVuZGxlLmphdmEKQEAgLTE5LDM2ICsxOSw0MSBAQAogCiAKIC8qKgotICogTGlzdFJlc291cmNlQnVuZGxlIGlzIHRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGNsYXNzZXMgd2hpY2ggcHJvdmlkZQotICogcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgPGNvZGU+Z2V0Q29udGVudHMoKTwvY29kZT4gbWV0aG9kIHRvIHJldHVybgorICoge0Bjb2RlIExpc3RSZXNvdXJjZUJ1bmRsZX0gaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgY2xhc3NlcyB3aGljaCBwcm92aWRlCisgKiByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSB7QGNvZGUgZ2V0Q29udGVudHMoKX0gbWV0aG9kIHRvIHJldHVybgogICogdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLgogICogCiAgKiBAc2VlIFJlc291cmNlQnVuZGxlCi0gKiBAc2luY2UgMS4xCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RSZXNvdXJjZUJ1bmRsZSBleHRlbmRzIFJlc291cmNlQnVuZGxlIHsKICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHRhYmxlOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0UmVzb3VyY2VCdW5kbGUoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBPYmplY3QgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIHJlc291cmNlcyBvZiB0aGlzCi0gICAgICogTGlzdFJlc291cmNlQnVuZGxlLiBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIGFuIGFycmF5IG9mIHR3bwotICAgICAqIGVsZW1lbnRzLCB0aGUgZmlyc3QgaXMgdGhlIHJlc291cmNlIGtleSBhbmQgdGhlIHNlY29uZCBpcyB0aGUgcmVzb3VyY2UuCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgT2JqZWN0fSBhcnJheSB3aGljaCBjb250YWlucyB0aGUgcmVzb3VyY2VzIG9mIHRoaXMKKyAgICAgKiB7QGNvZGUgTGlzdFJlc291cmNlQnVuZGxlfS4gRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBhbiBhcnJheSBvZiB0d28KKyAgICAgKiBlbGVtZW50cywgdGhlIGZpcnN0IGlzIHRoZSByZXNvdXJjZSBrZXkgc3RyaW5nIGFuZCB0aGUgc2Vjb25kIGlzIHRoZQorICAgICAqIHJlc291cmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBPYmplY3QgYXJyYXkgY29udGFpbmluZyB0aGUgcmVzb3VyY2VzCisgICAgICogQHJldHVybiBhIHtAY29kZSBPYmplY3R9IGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0W11bXSBnZXRDb250ZW50cygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBMaXN0UmVzb3VyY2VCdW5kbGUuCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyB7QGNvZGUgTGlzdFJlc291cmNlQnVuZGxlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uIG9mIHRoZSByZXNvdXJjZSBuYW1lcworICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIEVudW1lcmF0aW9ufSBvZiB0aGUgcmVzb3VyY2UgbmFtZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0S2V5cygpIHsKQEAgLTEwMSwxNCArMTA2LDYgQEAKICAgICAgICAgfTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCByZXNvdXJjZSBmcm9tIHRoaXMgUmVzb3VyY2VCdW5kbGUsIG9yIG51bGwgaWYgdGhlCi0gICAgICogcmVzb3VyY2UgaXMgbm90IGZvdW5kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9iamVjdAotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgaGFuZGxlR2V0T2JqZWN0KFN0cmluZyBrZXkpIHsKICAgICAgICAgaWYgKHRhYmxlID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTG9jYWxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xvY2FsZS5qYXZhCmluZGV4IDhiNzg4MTQuLmJiZjcyMzkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTG9jYWxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Mb2NhbGUuamF2YQpAQCAtNDAsMTMgKzQwLDE0IEBACiAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAvKioKLSAqIExvY2FsZSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UvY291bnRyeS92YXJpYW50IGNvbWJpbmF0aW9uLiBJdCBpcyBhbiBpZGVudGlmaWVyCisgKiB7QGNvZGUgTG9jYWxlfSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UvY291bnRyeS92YXJpYW50IGNvbWJpbmF0aW9uLiBJdCBpcyBhbiBpZGVudGlmaWVyCiAgKiB3aGljaCBkaWN0YXRlcyBwYXJ0aWN1bGFyIGNvbnZlbnRpb25zIGZvciB0aGUgcHJlc2VudGF0aW9uIG9mIGluZm9ybWF0aW9uLgogICogVGhlIGxhbmd1YWdlIGNvZGVzIGFyZSB0d28gbGV0dGVyIGxvd2VyY2FzZSBjb2RlcyBhcyBkZWZpbmVkIGJ5IElTTy02MzkuIFRoZQogICogY291bnRyeSBjb2RlcyBhcmUgdGhyZWUgbGV0dGVyIHVwcGVyY2FzZSBjb2RlcyBhcyBkZWZpbmVkIGJ5IElTTy0zMTY2LiBUaGUKICAqIHZhcmlhbnQgY29kZXMgYXJlIHVuc3BlY2lmaWVkLgogICogCiAgKiBAc2VlIFJlc291cmNlQnVuZGxlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIExvY2FsZSBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKICAgICAKQEAgLTYwLDEwNiArNjEsMTQ4IEBACiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIGVuX0NBLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIENBTkFEQSA9IG5ldyBMb2NhbGUoImVuIiwgIkNBIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciBmcl9DQS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBDQU5BREFfRlJFTkNIID0gbmV3IExvY2FsZSgiZnIiLCAiQ0EiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIHpoX0NOLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIENISU5BID0gbmV3IExvY2FsZSgiemgiLCAiQ04iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIHpoLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIENISU5FU0UgPSBuZXcgTG9jYWxlKCJ6aCIsICIiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIGVuLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIEVOR0xJU0ggPSBuZXcgTG9jYWxlKCJlbiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIGZyX0ZSLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIEZSQU5DRSA9IG5ldyBMb2NhbGUoImZyIiwgIkZSIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciBmci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBGUkVOQ0ggPSBuZXcgTG9jYWxlKCJmciIsICIiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIGRlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIEdFUk1BTiA9IG5ldyBMb2NhbGUoImRlIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogICAgIC8qKgogICAgICAqIExvY2FsZSBjb25zdGFudCBmb3IgZGVfREUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2NhbGUgR0VSTUFOWSA9IG5ldyBMb2NhbGUoImRlIiwgIkRFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciBpdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBJVEFMSUFOID0gbmV3IExvY2FsZSgiaXQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciBpdF9JVC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBJVEFMWSA9IG5ldyBMb2NhbGUoIml0IiwgIklUIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciBqYV9KUC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBKQVBBTiA9IG5ldyBMb2NhbGUoImphIiwgIkpQIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciBqYS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBKQVBBTkVTRSA9IG5ldyBMb2NhbGUoImphIiwgIiIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAogICAgIC8qKgogICAgICAqIExvY2FsZSBjb25zdGFudCBmb3Iga29fS1IuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2NhbGUgS09SRUEgPSBuZXcgTG9jYWxlKCJrbyIsICJLUiIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAogICAgIC8qKgogICAgICAqIExvY2FsZSBjb25zdGFudCBmb3Iga28uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2NhbGUgS09SRUFOID0gbmV3IExvY2FsZSgia28iLCAiIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciB6aF9DTi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBQUkMgPSBuZXcgTG9jYWxlKCJ6aCIsICJDTiIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAogICAgIC8qKgogICAgICAqIExvY2FsZSBjb25zdGFudCBmb3IgemhfQ04uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2NhbGUgU0lNUExJRklFRF9DSElORVNFID0gbmV3IExvY2FsZSgiemgiLCAiQ04iKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIHpoX1RXLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIFRBSVdBTiA9IG5ldyBMb2NhbGUoInpoIiwgIlRXIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAgICAgLyoqCiAgICAgICogTG9jYWxlIGNvbnN0YW50IGZvciB6aF9UVy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBUUkFESVRJT05BTF9DSElORVNFID0gbmV3IExvY2FsZSgiemgiLCAiVFciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIGVuX0dCLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIFVLID0gbmV3IExvY2FsZSgiZW4iLCAiR0IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKICAgICAvKioKICAgICAgKiBMb2NhbGUgY29uc3RhbnQgZm9yIGVuX1VTLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxlIFVTID0gbmV3IExvY2FsZSgiZW4iLCAiVVMiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAKQEAgLTE5MywzNCArMjM2LDQ0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBMb2NhbGUgdXNpbmcgdGhlIHNwZWNpZmllZCBsYW5ndWFnZS4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTG9jYWxlfSB1c2luZyB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLgogICAgICAqIAorICAgICAqIEBwYXJhbSBsYW5ndWFnZQorICAgICAqICAgICAgICAgICAgdGhlIGxhbmd1YWdlIHRoaXMge0Bjb2RlIExvY2FsZX0gcmVwcmVzZW50cy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTG9jYWxlKFN0cmluZyBsYW5ndWFnZSkgewogICAgICAgICB0aGlzKGxhbmd1YWdlLCAiIiwgIiIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExvY2FsZSB1c2luZyB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGNvZGVzLgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSAKLSAgICAgKiBAcGFyYW0gY291bnRyeSAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBMb2NhbGV9IHVzaW5nIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29kZXMuCiAgICAgICogCisgICAgICogQHBhcmFtIGxhbmd1YWdlCisgICAgICogICAgICAgICAgICB0aGUgbGFuZ3VhZ2UgdGhpcyB7QGNvZGUgTG9jYWxlfSByZXByZXNlbnRzLgorICAgICAqIEBwYXJhbSBjb3VudHJ5CisgICAgICogICAgICAgICAgICB0aGUgY291bnRyeSB0aGlzIHtAY29kZSBMb2NhbGV9IHJlcHJlc2VudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExvY2FsZShTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBjb3VudHJ5KSB7CiAgICAgICAgIHRoaXMobGFuZ3VhZ2UsIGNvdW50cnksICIiKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgTG9jYWxlIHVzaW5nIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UsIGNvdW50cnksIGFuZAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIExvY2FsZX0gdXNpbmcgdGhlIHNwZWNpZmllZCBsYW5ndWFnZSwgY291bnRyeSwgYW5kCiAgICAgICogdmFyaWFudCBjb2Rlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYW5ndWFnZSB0aGlzIHtAY29kZSBMb2NhbGV9IHJlcHJlc2VudHMuCiAgICAgICogQHBhcmFtIGNvdW50cnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb3VudHJ5IHRoaXMge0Bjb2RlIExvY2FsZX0gcmVwcmVzZW50cy4KICAgICAgKiBAcGFyYW0gdmFyaWFudAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+bGFuZ3VhZ2U8L2NvZGU+LAotICAgICAqICAgICAgICAgPGNvZGU+Y291bnRyeTwvY29kZT4gb3IgPGNvZGU+dmFyaWFudDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgdGhlIHZhcmlhbnQgdGhpcyB7QGNvZGUgTG9jYWxlfSByZXByZXNlbnRzLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbGFuZ3VhZ2V9LCB7QGNvZGUgY291bnRyeX0sIG9yCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHZhcmlhbnR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTG9jYWxlKFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGNvdW50cnksIFN0cmluZyB2YXJpYW50KSB7CiAgICAgICAgIGlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGNvdW50cnkgPT0gbnVsbCB8fCB2YXJpYW50ID09IG51bGwpIHsKQEAgLTI0NCwxMiArMjk3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBMb2NhbGUgd2l0aCB0aGUgc2FtZSBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCBjb2RlcyBhcwotICAgICAqIHRoaXMgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIExvY2FsZX0gd2l0aCB0aGUgc2FtZSBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCBjb2RlcyBhcworICAgICAqIHRoaXMge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIExvY2FsZQotICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMjYxLDE2ICszMTQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIExvY2FsZSBhbmQgYW5zd2VyIGlmIHRoZXkgYXJlCi0gICAgICogZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBMb2NhbGUgYW5kIGhhdmUgdGhlIHNhbWUKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIHtAY29kZSBMb2NhbGV9IGFuZCByZXR1cm5zIHdoZXRoZXIgdGhleSBhcmUKKyAgICAgKiBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAY29kZSBMb2NhbGV9IGFuZCBoYXZlIHRoZSBzYW1lCiAgICAgICogbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBMb2NhbGUsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlIExvY2FsZX0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC00MDAsMTEgKzQ1MywxMyBAQAogICAgICAgICByZXR1cm4gdGVtcC50b0FycmF5KHJlc3VsdCk7CiAgICAgfQogICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCi0gICAgCisKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBMb2NhbGVzLgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIHtAY29kZSBMb2NhbGV9LiBBdCBsZWFzdCBhIHtAY29kZSBMb2NhbGV9IHRoYXQgaXMgZXF1YWwgdG8KKyAgICAgKiB7QGNvZGUgTG9jYWxlLlVTfSBtdXN0IGJlIGNvbnRhaW5lZCBpbiB0aGlzIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgTG9jYWxlCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGNvZGUgTG9jYWxlfXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2NhbGVbXSBnZXRBdmFpbGFibGVMb2NhbGVzKCkgewogICAgICAgICBpZiAoYXZhaWxhYmxlTG9jYWxlcyA9PSBudWxsKSB7CkBAIC00MjUsNDIgKzQ4MCw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvdW50cnkgY29kZSBmb3IgdGhpcyBMb2NhbGUuCisgICAgICogR2V0cyB0aGUgY291bnRyeSBjb2RlIGZvciB0aGlzIHtAY29kZSBMb2NhbGV9IG9yIGFuIGVtcHR5IHN0cmluZyBvZiBubyBjb3VudHJ5CisgICAgICogd2FzIHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgY291bnRyeSBjb2RlCisgICAgICogQHJldHVybiBhIGNvdW50cnkgY29kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50cnkoKSB7CiAgICAgICAgIHJldHVybiBjb3VudHJ5Q29kZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgTG9jYWxlCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExvY2FsZSBnZXREZWZhdWx0KCkgewogICAgICAgICByZXR1cm4gZGVmYXVsdExvY2FsZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmdWxsIGNvdW50cnkgbmFtZSBpbiB0aGUgZGVmYXVsdCBMb2NhbGUgZm9yIHRoZSBjb3VudHJ5IGNvZGUgb2YKLSAgICAgKiB0aGlzIExvY2FsZS4gSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgY291bnRyeSBuYW1lLCB0aGUgY291bnRyeSBjb2RlIGlzCisgICAgICogR2V0cyB0aGUgZnVsbCBjb3VudHJ5IG5hbWUgaW4gdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0gZm9yIHRoZSBjb3VudHJ5IGNvZGUgb2YKKyAgICAgKiB0aGlzIHtAY29kZSBMb2NhbGV9LiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBjb3VudHJ5IG5hbWUsIHRoZSBjb3VudHJ5IGNvZGUgaXMKICAgICAgKiByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgY291bnRyeSBuYW1lCisgICAgICogQHJldHVybiBhIGNvdW50cnkgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERpc3BsYXlDb3VudHJ5KCkgewogICAgICAgICByZXR1cm4gZ2V0RGlzcGxheUNvdW50cnkoZ2V0RGVmYXVsdCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmdWxsIGNvdW50cnkgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIExvY2FsZSBmb3IgdGhlIGNvdW50cnkgY29kZQotICAgICAqIG9mIHRoaXMgTG9jYWxlLiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBjb3VudHJ5IG5hbWUsIHRoZSBjb3VudHJ5IGNvZGUgaXMKKyAgICAgKiBHZXRzIHRoZSBmdWxsIGNvdW50cnkgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9IGZvciB0aGUgY291bnRyeSBjb2RlCisgICAgICogb2YgdGhpcyB7QGNvZGUgTG9jYWxlfS4gSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgY291bnRyeSBuYW1lLCB0aGUgY291bnRyeSBjb2RlIGlzCiAgICAgICogcmV0dXJuZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZQotICAgICAqIEByZXR1cm4gYSBjb3VudHJ5IG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTG9jYWxlfSBmb3Igd2hpY2ggdGhlIGRpc3BsYXkgbmFtZSBpcyByZXRyaWV2ZWQuCisgICAgICogQHJldHVybiBhIGNvdW50cnkgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlDb3VudHJ5KExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgaWYgKGNvdW50cnlDb2RlLmxlbmd0aCgpID09IDApIHsKQEAgLTQ2OSw3ICs1MjksOSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gRmlyc3QgdHJ5IHRoZSBzcGVjaWZpZWQgbG9jYWxlCiAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoIkNvdW50cnkiLCBsb2NhbGUpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBidW5kbGUuZ2V0U3RyaW5nKHRoaXMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQpAQCAtNDg0LDI0ICs1NDYsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmdWxsIGxhbmd1YWdlIG5hbWUgaW4gdGhlIGRlZmF1bHQgTG9jYWxlIGZvciB0aGUgbGFuZ3VhZ2UgY29kZQotICAgICAqIG9mIHRoaXMgTG9jYWxlLiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBsYW5ndWFnZSBuYW1lLCB0aGUgbGFuZ3VhZ2UgY29kZQorICAgICAqIEdldHMgdGhlIGZ1bGwgbGFuZ3VhZ2UgbmFtZSBpbiB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfSBmb3IgdGhlIGxhbmd1YWdlIGNvZGUKKyAgICAgKiBvZiB0aGlzIHtAY29kZSBMb2NhbGV9LiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBsYW5ndWFnZSBuYW1lLCB0aGUgbGFuZ3VhZ2UgY29kZQogICAgICAqIGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsYW5ndWFnZSBuYW1lCisgICAgICogQHJldHVybiBhIGxhbmd1YWdlIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREaXNwbGF5TGFuZ3VhZ2UoKSB7CiAgICAgICAgIHJldHVybiBnZXREaXNwbGF5TGFuZ3VhZ2UoZ2V0RGVmYXVsdCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmdWxsIGxhbmd1YWdlIG5hbWUgaW4gdGhlIHNwZWNpZmllZCBMb2NhbGUgZm9yIHRoZSBsYW5ndWFnZSBjb2RlCi0gICAgICogb2YgdGhpcyBMb2NhbGUuIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGxhbmd1YWdlIG5hbWUsIHRoZSBsYW5ndWFnZSBjb2RlCisgICAgICogR2V0cyB0aGUgZnVsbCBsYW5ndWFnZSBuYW1lIGluIHRoZSBzcGVjaWZpZWQge0Bjb2RlIExvY2FsZX0gZm9yIHRoZSBsYW5ndWFnZSBjb2RlCisgICAgICogb2YgdGhpcyB7QGNvZGUgTG9jYWxlfS4gSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgbGFuZ3VhZ2UgbmFtZSwgdGhlIGxhbmd1YWdlIGNvZGUKICAgICAgKiBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgTG9jYWxlCi0gICAgICogQHJldHVybiBhIGxhbmd1YWdlIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTG9jYWxlfSBmb3Igd2hpY2ggdGhlIGRpc3BsYXkgbmFtZSBpcyByZXRyaWV2ZWQuCisgICAgICogQHJldHVybiBhIGxhbmd1YWdlIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TGFuZ3VhZ2UoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBpZiAobGFuZ3VhZ2VDb2RlLmxlbmd0aCgpID09IDApIHsKQEAgLTUxMCw3ICs1NzQsOSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gRmlyc3QgdHJ5IHRoZSBzcGVjaWZpZWQgbG9jYWxlCiAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoIkxhbmd1YWdlIiwgbG9jYWxlKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYnVuZGxlLmdldFN0cmluZyh0aGlzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KQEAgLTUyNSwxMCArNTkxLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnVsbCBsYW5ndWFnZSwgY291bnRyeSwgYW5kIHZhcmlhbnQgbmFtZXMgaW4gdGhlIGRlZmF1bHQgTG9jYWxlCi0gICAgICogZm9yIHRoZSBjb2RlcyBvZiB0aGlzIExvY2FsZS4KKyAgICAgKiBHZXRzIHRoZSBmdWxsIGxhbmd1YWdlLCBjb3VudHJ5LCBhbmQgdmFyaWFudCBuYW1lcyBpbiB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfQorICAgICAqIGZvciB0aGUgY29kZXMgb2YgdGhpcyB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgTG9jYWxlIG5hbWUKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIExvY2FsZX0gbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewogICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoZ2V0RGVmYXVsdCgpKTsKQEAgLTUzNiwxMSArNjAzLDEyIEBACiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBmdWxsIGxhbmd1YWdlLCBjb3VudHJ5LCBhbmQgdmFyaWFudCBuYW1lcyBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogTG9jYWxlIGZvciB0aGUgY29kZXMgb2YgdGhpcyBMb2NhbGUuCisgICAgICogTG9jYWxlIGZvciB0aGUgY29kZXMgb2YgdGhpcyB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgTG9jYWxlCi0gICAgICogQHJldHVybiBhIExvY2FsZSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIExvY2FsZX0gZm9yIHdoaWNoIHRoZSBkaXNwbGF5IG5hbWUgaXMgcmV0cmlldmVkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTG9jYWxlfSBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBpbnQgY291bnQgPSAwOwpAQCAtNTcyLDI0ICs2NDAsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmdWxsIHZhcmlhbnQgbmFtZSBpbiB0aGUgZGVmYXVsdCBMb2NhbGUgZm9yIHRoZSB2YXJpYW50IGNvZGUgb2YKLSAgICAgKiB0aGlzIExvY2FsZS4gSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgdmFyaWFudCBuYW1lLCB0aGUgdmFyaWFudCBjb2RlIGlzCisgICAgICogR2V0cyB0aGUgZnVsbCB2YXJpYW50IG5hbWUgaW4gdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0gZm9yIHRoZSB2YXJpYW50IGNvZGUgb2YKKyAgICAgKiB0aGlzIHtAY29kZSBMb2NhbGV9LiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyB2YXJpYW50IG5hbWUsIHRoZSB2YXJpYW50IGNvZGUgaXMKICAgICAgKiByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgdmFyaWFudCBuYW1lCisgICAgICogQHJldHVybiBhIHZhcmlhbnQgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERpc3BsYXlWYXJpYW50KCkgewogICAgICAgICByZXR1cm4gZ2V0RGlzcGxheVZhcmlhbnQoZ2V0RGVmYXVsdCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmdWxsIHZhcmlhbnQgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIExvY2FsZSBmb3IgdGhlIHZhcmlhbnQgY29kZQotICAgICAqIG9mIHRoaXMgTG9jYWxlLiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyB2YXJpYW50IG5hbWUsIHRoZSB2YXJpYW50IGNvZGUgaXMKKyAgICAgKiBHZXRzIHRoZSBmdWxsIHZhcmlhbnQgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9IGZvciB0aGUgdmFyaWFudCBjb2RlCisgICAgICogb2YgdGhpcyB7QGNvZGUgTG9jYWxlfS4gSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgdmFyaWFudCBuYW1lLCB0aGUgdmFyaWFudCBjb2RlIGlzCiAgICAgICogcmV0dXJuZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZQotICAgICAqIEByZXR1cm4gYSB2YXJpYW50IG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTG9jYWxlfSBmb3Igd2hpY2ggdGhlIGRpc3BsYXkgbmFtZSBpcyByZXRyaWV2ZWQuCisgICAgICogQHJldHVybiBhIHZhcmlhbnQgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlWYXJpYW50KExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgaWYgKHZhcmlhbnRDb2RlLmxlbmd0aCgpID09IDApIHsKQEAgLTY0MCw0MyArNzEwLDQ4IEBACiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0aHJlZSBsZXR0ZXIgSVNPIGNvdW50cnkgY29kZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgY291bnRyeQotICAgICAqIGNvZGUgZm9yIHRoaXMgTG9jYWxlLgorICAgICAqIGNvZGUgZm9yIHRoaXMge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHRocmVlIGxldHRlciBJU08gbGFuZ3VhZ2UgY29kZQotICAgICAqIAorICAgICAqIEByZXR1cm4gYSB0aHJlZSBsZXR0ZXIgSVNPIGxhbmd1YWdlIGNvZGUuCiAgICAgICogQGV4Y2VwdGlvbiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHRocmVlIGxldHRlciBJU08gY291bnRyeSBjb2RlCisgICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyB0aHJlZSBsZXR0ZXIgSVNPIGNvdW50cnkgY29kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldElTTzNDb3VudHJ5KCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjb3VudHJ5Q29kZS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoIklTTzNDb3VudHJpZXMiLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcodGhpcy50b1N0cmluZygpKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHRocmVlIGxldHRlciBJU08gbGFuZ3VhZ2UgY29kZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgbGFuZ3VhZ2UKLSAgICAgKiBjb2RlIGZvciB0aGlzIExvY2FsZS4KKyAgICAgKiBjb2RlIGZvciB0aGlzIHtAY29kZSBMb2NhbGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB0aHJlZSBsZXR0ZXIgSVNPIGxhbmd1YWdlIGNvZGUKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgdGhyZWUgbGV0dGVyIElTTyBsYW5ndWFnZSBjb2RlLgogICAgICAqIEBleGNlcHRpb24gTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyB0aHJlZSBsZXR0ZXIgSVNPIGxhbmd1YWdlIGNvZGUKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHRocmVlIGxldHRlciBJU08gbGFuZ3VhZ2UgY29kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldElTTzNMYW5ndWFnZSgpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewogICAgICAgICBpZiAobGFuZ3VhZ2VDb2RlLmxlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgiSVNPM0xhbmd1YWdlcyIsIHRoaXMpOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gYnVuZGxlLmdldFN0cmluZyh0aGlzLnRvU3RyaW5nKCkpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbGlzdCBvZiB0d28gbGV0dGVyIElTTyBjb3VudHJ5IGNvZGVzIHdoaWNoIGNhbiBiZSB1c2VkIGFzIHRoZQotICAgICAqIGNvdW50cnkgY29kZSBmb3IgYSBMb2NhbGUuCisgICAgICogY291bnRyeSBjb2RlIGZvciBhIHtAY29kZSBMb2NhbGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SVNPQ291bnRyaWVzKCkgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKQEAgLTcwMSw5ICs3NzYsMTAgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgdHdvIGxldHRlciBJU08gbGFuZ3VhZ2UgY29kZXMgd2hpY2ggY2FuIGJlIHVzZWQgYXMgdGhlCi0gICAgICogbGFuZ3VhZ2UgY29kZSBmb3IgYSBMb2NhbGUuCisgICAgICogbGFuZ3VhZ2UgY29kZSBmb3IgYSB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZworICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldElTT0xhbmd1YWdlcygpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCkBAIC03MjMsMTggKzc5OSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMgTG9jYWxlLgorICAgICAqIEdldHMgdGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMge0Bjb2RlIExvY2FsZX0gb3IgdGhlIGVtcHR5IHN0cmluZyBvZiBubyBsYW5ndWFnZQorICAgICAqIHdhcyBzZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGxhbmd1YWdlIGNvZGUKKyAgICAgKiBAcmV0dXJuIGEgbGFuZ3VhZ2UgY29kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewogICAgICAgICByZXR1cm4gbGFuZ3VhZ2VDb2RlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhcmlhbnQgY29kZSBmb3IgdGhpcyBMb2NhbGUuCisgICAgICogR2V0cyB0aGUgdmFyaWFudCBjb2RlIGZvciB0aGlzIHtAY29kZSBMb2NhbGV9IG9yIGFuIGVtcHR5IHtAY29kZSBTdHJpbmd9IG9mIG5vIHZhcmlhbnQKKyAgICAgKiB3YXMgc2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB2YXJpYW50IGNvZGUKKyAgICAgKiBAcmV0dXJuIGEgdmFyaWFudCBjb2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFudCgpIHsKICAgICAgICAgcmV0dXJuIHZhcmlhbnRDb2RlOwpAQCAtNzQyLDExICs4MjIsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoLgogICAgICAqIEBzZWUgI2VxdWFscworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgewpAQCAtNzU1LDE0ICs4MzUsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZSB0byB0aGUgc3BlY2lmaWVkIExvY2FsZS4KKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHtAY29kZSBMb2NhbGV9IHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIExvY2FsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBkZWZhdWx0IExvY2FsZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgogICAgICAqIEBleGNlcHRpb24gU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciB3aGljaCBkb2VzIG5vdCBhbGxvdyB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpbiBwbGFjZSB3aGljaCBkb2VzIG5vdCBhbGxvdyB0aGlzCisgICAgICogICAgICAgICAgICAgICAgb3BlcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkgewpAQCAtNzc3LDkgKzg1NywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgTG9jYWxlfS4gSXQgY29uc2lzdHMgb2YgdGhlCisgICAgICogbGFuZ3VhZ2UgZm9sbG93ZWQgYnkgdGhlIGNvdW50cnkgYW5kIGF0IHRoZSBlbmQgdGhlIHZhcmlhbnQuIFRoZXkgYXJlCisgICAgICogc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzLiBJZiB0aGUgbGFuZ3VhZ2UgaXMgbWlzc2luZyB0aGUgc3RyaW5nIGJlZ2lucworICAgICAqIHdpdGggYW4gdW5kZXJzY29yZS4gSWYgdGhlIGNvdW50cnkgaXMgbWlzc2luZyB0aGVyZSBhcmUgMiB1bmRlcnNjb3JlcworICAgICAqIGJldHdlZW4gdGhlIGxhbmd1YWdlIGFuZCB0aGUgdmFyaWFudC4gdGhlIHZhcmlhbnQgYWxvbmUgY2Fub3QgYmUgZGVmaW5lZAorICAgICAqIHdpdGhvdXQgYSBsYW5ndWFnZSBhbmQvb3IgYSBjb3VudHJ5IChpbiB0aGlzIGNhc2UgdGhpcyBtZXRob2Qgd291bGQKKyAgICAgKiByZXR1cm4gdGhlIGVtcHR5IHN0cmluZykuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgTG9jYWxlCisgICAgICogRXhhbXBsZXM6ICJlbiIsICJlbl9VUyIsICJfVVMiLCAiZW5fX1BPU0lYIiwgImVuX1VTX1BPU0lYIgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBMb2NhbGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL01hcC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9NYXAuamF2YQppbmRleCAwN2U4MDRjLi5kOGIxZTYyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL01hcC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTWFwLmphdmEKQEAgLTE5LDExMyArMTksMTMxIEBACiAKIAogLyoqCi0gKiBNYXAgaGFzIGEgc2V0IG9mIGtleXMsIGVhY2gga2V5IGlzIG1hcHBlZCB0byBhIHNpbmdsZSB2YWx1ZS4KKyAqIEEge0Bjb2RlIE1hcH0gaXMgYSBkYXRhIHN0cnVjdHVyZSBjb25zaXN0aW5nIG9mIGEgc2V0IG9mIGtleXMgYW5kIHZhbHVlcworICogaW4gd2hpY2ggZWFjaCBrZXkgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIHZhbHVlLiAgVGhlIGNsYXNzIG9mIHRoZSBvYmplY3RzCisgKiB1c2VkIGFzIGtleXMgaXMgZGVjbGFyZWQgd2hlbiB0aGUge0Bjb2RlIE1hcH0gaXMgZGVjbGFyZWQsIGFzIGlzIHRoZSAKKyAqIGNsYXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4KKyAqIDxwPkEge0Bjb2RlIE1hcH0gcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgCisgKiBrZXlzIGNvbnRhaW5lZCBpbiBpdCwgYXMgd2VsbCBhcyB2YXJpb3VzIG1ldGhvZHMgdG8gYWNjZXNzIGFuZCB1cGRhdGUgCisgKiB0aGUga2V5L3ZhbHVlIHBhaXJzLiAgCisgKiA8L3A+ICAKKyAqICAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE1hcDxLLFY+IHsKKwogICAgIC8qKgotICAgICAqIE1hcC5FbnRyeSBpcyBhIGtleS92YWx1ZSBtYXBwaW5nIHdoaWNoIGlzIGNvbnRhaW5lZCBpbiBhIE1hcC4KLSAgICAgKiAKKyAgICAgKiB7QGNvZGUgTWFwLkVudHJ5fSBpcyBhIGtleS92YWx1ZSBtYXBwaW5nIGNvbnRhaW5lZCBpbiBhIHtAY29kZSBNYXB9LgorICAgICAqICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBpbnRlcmZhY2UgRW50cnk8SyxWPiB7CisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRW50cnk8SyxWPiB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIE1hcC5FbnRyeSBhbmQgYW5zd2VyIGlmIHRoZXkKLSAgICAgICAgICogYXJlIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTWFwLkVudHJ5IGFuZCBoYXZlIHRoZQorICAgICAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIHtAY29kZSBNYXAuRW50cnl9IGFuZCByZXR1cm5zIGlmIHRoZXkKKyAgICAgICAgICogYXJlIGVxdWFsLiBUbyBiZSBlcXVhbCwgdGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAY29kZSBNYXAuRW50cnl9IGFuZCBoYXZlIHRoZQogICAgICAgICAgKiBzYW1lIGtleSBhbmQgdmFsdWUuCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgTWFwLkVudHJ5LAotICAgICAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gdG8gY29tcGFyZSB3aXRoIHRoaXMge0Bjb2RlIE9iamVjdH0uCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQge0Bjb2RlIE9iamVjdH0gaXMgZXF1YWwgdG8gdGhpcworICAgICAgICAgKiAgICAgICAgIHtAY29kZSBNYXAuRW50cnl9LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICogQHNlZSAjaGFzaENvZGUoKQorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUga2V5LgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBrZXkuCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIHRoZSBrZXkKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgSyBnZXRLZXkoKTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdmFsdWUuCisgICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlLgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgViBnZXRWYWx1ZSgpOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlCi0gICAgICAgICAqIGVxdWFsIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4ge0Bjb2RlIE9iamVjdH0gd2hpY2ggYXJlCisgICAgICAgICAqIGVxdWFsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgI2VxdWFscworICAgICAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2ggY29kZS4KKyAgICAgICAgICogQHNlZSAjZXF1YWxzKE9iamVjdCkKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCk7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHZhbHVlLgorICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIGVudHJ5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJlcGxhY2luZyBhbnkKKyAgICAgICAgICogZXhpc3RpbmcgdmFsdWUuCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQotICAgICAgICAgKiBAcmV0dXJuIG9iamVjdAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgdG8gc2V0LgorICAgICAgICAgKiBAcmV0dXJuIG9iamVjdCB0aGUgcmVwbGFjZWQgdmFsdWUgb2YgdGhpcyBlbnRyeS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgViBzZXRWYWx1ZShWIG9iamVjdCk7CiAgICAgfTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBNYXAsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHtAY29kZSBNYXB9LCBsZWF2aW5nIGl0IGVtcHR5LgogICAgICAqIAotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBNYXAgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIAotICAgICAqIEBzZWUgI2lzRW1wdHkKLSAgICAgKiBAc2VlICNzaXplCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHJlbW92aW5nIGVsZW1lbnRzIGZyb20gdGhpcyB7QGNvZGUgTWFwfSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzZWUgI2lzRW1wdHkoKQorICAgICAqIEBzZWUgI3NpemUoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIE1hcCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMge0Bjb2RlIE1hcH0gY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgYSBrZXkgb2YgdGhpcyBNYXAsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSk7CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIE1hcCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB7QGNvZGUgTWFwfSBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyBhIHZhbHVlIG9mIHRoaXMgTWFwLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPlNldDwvY29kZT4gd2hvc2UgZWxlbWVudHMgY29tcHJpc2UgYWxsIG9mIHRoZSBtYXBwaW5ncwotICAgICAqIHRoYXQgYXJlIHRvIGJlIGZvdW5kIGluIHRoaXMgPGNvZGU+TWFwPC9jb2RlPi4gSW5mb3JtYXRpb24gb24gZWFjaCBvZgotICAgICAqIHRoZSBtYXBwaW5ncyBpcyBlbmNhcHN1bGF0ZWQgaW4gYSBzZXBhcmF0ZSB7QGxpbmsgTWFwLkVudHJ5fSBpbnN0YW5jZS4gQXMKLSAgICAgKiB0aGUgPGNvZGU+U2V0PC9jb2RlPiBpcyBiYWNrZWQgYnkgdGhpcyA8Y29kZT5NYXA8L2NvZGU+LCB1c2VycwotICAgICAqIHNob3VsZCBiZSBhd2FyZSB0aGF0IGNoYW5nZXMgaW4gb25lIHdpbGwgYmUgaW1tZWRpYXRlbHkgdmlzaWJsZSBpbiB0aGUKLSAgICAgKiBvdGhlci4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIFNldH0gY29udGFpbmluZyBhbGwgb2YgdGhlIG1hcHBpbmdzIGluIHRoaXMge0Bjb2RlIE1hcH0uIEVhY2ggbWFwcGluZyBpcworICAgICAqIGFuIGluc3RhbmNlIG9mIHtAbGluayBNYXAuRW50cnl9LiBBcyB0aGUge0Bjb2RlIFNldH0gaXMgYmFja2VkIGJ5IHRoaXMge0Bjb2RlIE1hcH0sCisgICAgICogY2hhbmdlcyBpbiBvbmUgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIG90aGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSA8Y29kZT5TZXQ8L2NvZGU+IG9mIHRoZSBtYXBwaW5ncworICAgICAqIEByZXR1cm4gYSBzZXQgb2YgdGhlIG1hcHBpbmdzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNldDxNYXAuRW50cnk8SyxWPj4gZW50cnlTZXQoKTsKIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLgorICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgb2JqZWN0IGlzIGEge0Bjb2RlIE1hcH0gYW5kIGJvdGgge0Bjb2RlIE1hcH1zIGNvbnRhaW4gdGhlIHNhbWUgbWFwcGluZ3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgT2JqZWN0IHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMKLSAgICAgKiAgICAgICAgIG9iamVjdCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBvYmplY3QuCi0gICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSB0byBjb21wYXJlIHdpdGggdGhpcyB7QGNvZGUgT2JqZWN0fS4KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgT2JqZWN0fSBpcyB0aGUgc2FtZSBhcyB0aGlzIHtAY29kZSBPYmplY3R9CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMge0Bjb2RlIE9iamVjdH0uCisgICAgICogQHNlZSAjaGFzaENvZGUoKQorICAgICAqIEBzZWUgI2VudHJ5U2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCk7CiAKQEAgLTEzMywzNiArMTUxLDQwIEBACiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIG5vIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGlzIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBWIGdldChPYmplY3Qga2V5KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4ge0Bjb2RlIE9iamVjdH1zIHdoaWNoIGFyZSBlcXVhbAorICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoLgorICAgICAqIEBzZWUgI2VxdWFscyhPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIE1hcCBoYXMgbm8gZWxlbWVudHMsIGEgc2l6ZSBvZiB6ZXJvLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBpcyBlbXB0eS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBNYXAgaGFzIG5vIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAc2VlICNzaXplCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgaGFzIG5vIGVsZW1lbnRzLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNlZSAjc2l6ZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNldCBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBNYXAuIFRoZSBzZXQgaXMgYmFja2VkIGJ5Ci0gICAgICogdGhpcyBNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIHNldCBkb2VzIG5vdAorICAgICAqIFJldHVybnMgYSBzZXQgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMge0Bjb2RlIE1hcH0uIFRoZSB7QGNvZGUgU2V0fSBpcyBiYWNrZWQgYnkKKyAgICAgKiB0aGlzIHtAY29kZSBNYXB9IHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUge0Bjb2RlIFNldH0gZG9lcyBub3QKICAgICAgKiBzdXBwb3J0IGFkZGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU2V0IG9mIHRoZSBrZXlzCisgICAgICogQHJldHVybiBhIHNldCBvZiB0aGUga2V5cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2V0PEs+IGtleVNldCgpOwogCkBAIC0xNzAsNzEgKzE5Miw4NyBAQAogICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5LgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvciBudWxsCi0gICAgICogICAgICAgICBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZwotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFkZGluZyB0byB0aGlzIE1hcCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiB0aGUga2V5IG9yIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUgZm9yCi0gICAgICogICAgICAgICAgICAgICAgdGhpcyBNYXAKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGtleSBvciB2YWx1ZSBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBNYXAKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUga2V5IG9yIHZhbHVlIGlzIG51bGwgYW5kIHRoaXMgTWFwIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgc3VwcG9ydCBudWxsIGtleXMgb3IgdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhZGRpbmcgdG8gdGhpcyB7QGNvZGUgTWFwfSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIHRoZSBrZXkgb3IgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZSBmb3IKKyAgICAgKiAgICAgICAgICAgICAgICB0aGlzIHtAY29kZSBNYXB9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGtleSBvciB2YWx1ZSBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyB7QGNvZGUgTWFwfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGtleSBvciB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoaXMge0Bjb2RlIE1hcH0gZG9lcworICAgICAqICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0IHtAY29kZSBudWxsfSBrZXlzIG9yIHZhbHVlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogQ29waWVzIGV2ZXJ5IG1hcHBpbmcgaW4gdGhlIHNwZWNpZmllZCBNYXAgdG8gdGhpcyBNYXAuCisgICAgICogQ29waWVzIGV2ZXJ5IG1hcHBpbmcgaW4gdGhlIHNwZWNpZmllZCB7QGNvZGUgTWFwfSB0byB0aGlzIHtAY29kZSBNYXB9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBNYXAgdG8gY29weSBtYXBwaW5ncyBmcm9tCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgTWFwIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIGEga2V5IG9yIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICBNYXAKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYSBrZXkgb3IgdmFsdWUgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgTWFwCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYSBrZXkgb3IgdmFsdWUgaXMgbnVsbCBhbmQgdGhpcyBNYXAgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqICAgICAgICAgICAgICAgIG51bGwga2V5cyBvciB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTWFwfSB0byBjb3B5IG1hcHBpbmdzIGZyb20uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFkZGluZyB0byB0aGlzIHtAY29kZSBNYXB9IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgYSBrZXkgb3IgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBNYXB9IGlzCisgICAgICogICAgICAgICAgICAgICAgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcyB7QGNvZGUgTWFwfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGEga2V5IG9yIHZhbHVlIGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIHtAY29kZSBNYXB9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhIGtleSBvciB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoaXMge0Bjb2RlIE1hcH0gZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwb3J0IHtAY29kZSBudWxsfSBrZXlzIG9yIHZhbHVlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLD8gZXh0ZW5kcyBWPiBtYXApOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoaXMgTWFwLgorICAgICAqIFJlbW92ZXMgYSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGlzIHtAY29kZSBNYXB9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlbW92ZWQgbWFwcGluZyBvciBudWxsIGlmIGtleSBpcyBub3QgYSBrZXkgaW4KLSAgICAgKiAgICAgICAgIHRoaXMgTWFwCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIE1hcCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBtYXBwaW5nIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBtYXBwaW5nIG9yIHtAY29kZSBudWxsfSBpZiBubyBtYXBwaW5nCisgICAgICogICAgICAgICBmb3IgdGhlIHNwZWNpZmllZCBrZXkgd2FzIGZvdW5kLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiByZW1vdmluZyBmcm9tIHRoaXMge0Bjb2RlIE1hcH0gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgViByZW1vdmUoT2JqZWN0IGtleSk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBNYXAuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHRoaXMge0Bjb2RlIE1hcH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgTWFwCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHRoaXMge0Bjb2RlIE1hcH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzaXplKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgY3VycmVudCA8Y29kZT5NYXA8L2NvZGU+IHZhbHVlcyBpbiBhCi0gICAgICogPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4uIEFzIHRoZSByZXR1cm5lZCA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBpcwotICAgICAqIGJhY2tlZCBieSB0aGlzIDxjb2RlPk1hcDwvY29kZT4sIHVzZXJzIHNob3VsZCBiZSBhd2FyZSB0aGF0IGNoYW5nZXMgaW4KLSAgICAgKiBvbmUgd2lsbCBiZSBpbW1lZGlhdGVseSB2aXNpYmxlIGluIHRoZSBvdGhlci4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIENvbGxlY3Rpb259IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMge0Bjb2RlIE1hcH0uIFRoZSB7QGNvZGUgQ29sbGVjdGlvbn0KKyAgICAgKiBpcyBiYWNrZWQgYnkgdGhpcyB7QGNvZGUgTWFwfSBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlCisgICAgICoge0Bjb2RlIENvbGxlY3Rpb259IHN1cHBvcnRzIHtAbGluayBDb2xsZWN0aW9uI3JlbW92ZX0sIHtAbGluayBDb2xsZWN0aW9uI3JlbW92ZUFsbH0sIAorICAgICAqIHtAbGluayBDb2xsZWN0aW9uI3JldGFpbkFsbH0sIGFuZCB7QGxpbmsgQ29sbGVjdGlvbiNjbGVhcn0gb3BlcmF0aW9ucywKKyAgICAgKiBhbmQgaXQgZG9lcyBub3Qgc3VwcG9ydCB7QGxpbmsgQ29sbGVjdGlvbiNhZGR9IG9yIHtAbGluayBDb2xsZWN0aW9uI2FkZEFsbH0gb3BlcmF0aW9ucy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEge0Bjb2RlIENvbGxlY3Rpb259IHdoaWNoIGlzIHRoZSBzdWJjbGFzcyBvZgorICAgICAqIHtAbGluayBBYnN0cmFjdENvbGxlY3Rpb259LiBUaGUge0BsaW5rIEFic3RyYWN0Q29sbGVjdGlvbiNpdGVyYXRvcn0gbWV0aG9kIG9mIHRoaXMgc3ViY2xhc3MgcmV0dXJucyBhCisgICAgICogIndyYXBwZXIgb2JqZWN0IiBvdmVyIHRoZSBpdGVyYXRvciBvZiB0aGlzIHtAY29kZSBNYXB9J3Mge0BsaW5rICNlbnRyeVNldCgpfS4gVGhlIHtAbGluayBBYnN0cmFjdENvbGxlY3Rpb24jc2l6ZX0gbWV0aG9kCisgICAgICogd3JhcHMgdGhpcyB7QGNvZGUgTWFwfSdzIHtAbGluayAjc2l6ZX0gbWV0aG9kIGFuZCB0aGUge0BsaW5rIEFic3RyYWN0Q29sbGVjdGlvbiNjb250YWluc30gbWV0aG9kIHdyYXBzIHRoaXMge0Bjb2RlIE1hcH0ncworICAgICAqIHtAbGluayAjY29udGFpbnNWYWx1ZX0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IGZpcnN0IHRpbWUgYW5kCisgICAgICogcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gYWxsIHN1YnNlcXVlbnQgY2FsbHMuIFRoaXMgbWV0aG9kIG1heSByZXR1cm4KKyAgICAgKiBkaWZmZXJlbnQgQ29sbGVjdGlvbiB3aGVuIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCBzaW5jZSBpdCBoYXMgbm8KKyAgICAgKiBzeW5jaHJvbml6YXRpb24gcGVyZm9ybWVkLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzCisgICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBtYXAuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbGxlY3Rpb248Vj4gdmFsdWVzKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL01pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9NaXNzaW5nRm9ybWF0QXJndW1lbnRFeGNlcHRpb24uamF2YQppbmRleCA3YWI3N2ZjLi5iY2QyNDBjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL01pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uLmphdmEKQEAgLTE5LDkgKzE5LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogVGhlIHVuY2hlY2tlZCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0IGlmIHRoZXJlIG5vIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQKLSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb252ZXJzaW9uIG9yIGFuIGFyZ3VtZW50IGluZGV4IHRoYXQgcmVmZXJzIHRvIGEKLSAqIG1pc3NpbmcgYXJndW1lbnQuCisgKiBBIHtAY29kZSBNaXNzaW5nRm9ybWF0QXJndW1lbnRFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duIGlmIHRoZXJlIGlzIG5vCisgKiBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjb252ZXJzaW9uIG9yIGFuIGFyZ3VtZW50IGluZGV4CisgKiB0aGF0IHJlZmVycyB0byBhIG1pc3NpbmcgYXJndW1lbnQuCisgKiAKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTkxOTAxMTVMOwpAQCAtMjksMTEgKzMyLDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgczsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIGNvbnZlcnNpb24gdGhhdCBsYWNrcyB0aGUgYXJndW1lbnQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBjb252ZXJzaW9uIHRoYXQgbGFja3MgdGhlIGFyZ3VtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBUaGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gdGhhdCBsYWNrcyB0aGUgYXJndW1lbnQuCisgICAgICogICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY29udmVyc2lvbiB0aGF0IGxhY2tzIHRoZSBhcmd1bWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZyBzKSB7CiAgICAgICAgIGlmIChudWxsID09IHMpIHsKQEAgLTQ1LDcgKzQ4LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb252ZXJzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNvbnZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgY29udmVyc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdFNwZWNpZmllcigpIHsKICAgICAgICAgcmV0dXJuIHM7CkBAIC01NCw3ICs1Nyw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9NaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTWlzc2luZ0Zvcm1hdFdpZHRoRXhjZXB0aW9uLmphdmEKaW5kZXggZWQ4ZDY2My4uMTlhZjdkNyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9NaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL01pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbi5qYXZhCkBAIC0xNywxMCArMTcsMTEgQEAKIHBhY2thZ2UgamF2YS51dGlsOwogCiAvKioKLSAqIFRoZSB1bmNoZWNrZWQgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG91dCBpZiB0aGUgZm9ybWF0IHdpZHRoIGlzIG1pc3NpbmcgYnV0Ci0gKiBpcyByZXF1aXJlZC4KKyAqIEEge0Bjb2RlIE1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGZvcm1hdCB3aWR0aCBpcworICogbWlzc2luZyBidXQgaXMgcmVxdWlyZWQuCiAgKiAKLSAqIAorICogQHNlZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBNaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNTU2MDEyM0w7CkBAIC0yOCwxMSArMjksMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBzOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIE1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0Ci0gICAgICogc3BlY2lmaWVyLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogZm9ybWF0IHNwZWNpZmllci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgVGhlIHNwZWNpZmllZCBmb3JtYXQgc3BlY2lmaWVyLgorICAgICAqICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzcGVjaWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIE1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICBpZiAobnVsbCA9PSBzKSB7CkBAIC00NCw3ICs0NSw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZm9ybWF0IHNwZWNpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXQgc3BlY2lmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdCBzcGVjaWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXRTcGVjaWZpZXIoKSB7CiAgICAgICAgIHJldHVybiBzOwpAQCAtNTMsNyArNTQsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGNmN2NmZTkuLmMzYTdlZmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uamF2YQpAQCAtMTksMTAgKzE5LDEzIEBACiAKIAogLyoqCi0gKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biBieSBSZXNvdXJjZUJ1bmRsZSB3aGVuIGEgcmVzb3VjZSBidW5kbGUKLSAqIGNhbm5vdCBiZSBmb3VuZCBvciBhIHJlc291cmNlIGlzIG1pc3NpbmcgZnJvbSBhIHJlc291cmNlIGJ1bmRsZS4KKyAqIEEge0Bjb2RlIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbn0gaXMgdGhyb3duIGJ5IFJlc291cmNlQnVuZGxlIHdoZW4gYQorICogcmVzb3VyY2UgYnVuZGxlIGNhbm5vdCBiZSBmb3VuZCBvciBhIHJlc291cmNlIGlzIG1pc3NpbmcgZnJvbSBhIHJlc291cmNlCisgKiBidW5kbGUuCiAgKiAKICAqIEBzZWUgUmVzb3VyY2VCdW5kbGUKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAKQEAgLTMxLDE1ICszNCwxNiBAQAogICAgIFN0cmluZyBjbGFzc05hbWUsIGtleTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjaywgbWVzc2FnZSwgdGhlCi0gICAgICogY2xhc3MgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWlzc2luZyByZXNvdXJjZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb259IHdpdGggdGhlIHN0YWNrIHRyYWNlLAorICAgICAqIG1lc3NhZ2UsIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIHRoZSBuYW1lIG9mIHRoZQorICAgICAqIG1pc3NpbmcgcmVzb3VyY2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCiAgICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUuCisgICAgICogICAgICAgICAgIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUuCiAgICAgICogQHBhcmFtIHJlc291cmNlTmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtaXNzaW5nIHJlc291cmNlLgorICAgICAqICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbWlzc2luZyByZXNvdXJjZS4KICAgICAgKi8KICAgICBwdWJsaWMgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlLCBTdHJpbmcgY2xhc3NOYW1lLAogICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSkgewpAQCAtNTMsNyArNTcsNyBAQAogICAgICAqIG5vdCBiZSBmb3VuZCwgb3IgaW4gdGhlIGNhc2Ugb2YgYSBtaXNzaW5nIHJlc291cmNlLCB0aGUgbmFtZSBvZiB0aGUKICAgICAgKiBtaXNzaW5nIHJlc291cmNlIGJ1bmRsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKQEAgLTYzLDcgKzY3LDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtaXNzaW5nIHJlc291cmNlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlCiAgICAgICogcmVzb3VyY2UgYnVuZGxlIGlzIG1pc3NpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWUgb2YgdGhlIG1pc3NpbmcgcmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWlzc2luZyByZXNvdXJjZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKICAgICAgICAgcmV0dXJuIGtleTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uLmphdmEKaW5kZXggZGUxNzFiOS4uNTM3OGUxZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uLmphdmEKQEAgLTE5LDI5ICsxOSwzMiBAQAogCiAKIC8qKgotICogVGhpcyBydW50aW1lIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiB0cnlpbmcgdG8gcmV0cmlldmUgYW4gZWxlbWVudCBwYXN0IHRoZQotICogZW5kIG9mIGFuIEVudW1lcmF0aW9uLCBvciB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IGZyb20gYW4gZW1wdHkgVmVjdG9yLgorICogQSB7QGNvZGUgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJldHJpZXZlIGFuIGVsZW1lbnQKKyAqIHBhc3QgdGhlIGVuZCBvZiBhbiBFbnVtZXJhdGlvbiwgb3IgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBmcm9tIGFuIGVtcHR5CisgKiBWZWN0b3IuCiAgKiAKICAqIEBzZWUgRW51bWVyYXRpb24KICAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjc2OTgyOTI1MDYzOTQxMTg4MEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE5vU3VjaEVsZW1lbnRFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBmaWxsZWQgaW4uCiAgICAgICovCiAgICAgcHVibGljIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE5vU3VjaEVsZW1lbnRFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgbWVzc2FnZSBmaWxsZWQgaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSkgewogICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvT2JzZXJ2YWJsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9PYnNlcnZhYmxlLmphdmEKaW5kZXggZjZlNmY3ZS4uYTRjMDMzMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9PYnNlcnZhYmxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9PYnNlcnZhYmxlLmphdmEKQEAgLTIwLDcgKzIwLDE2IEBACiAKIC8qKgogICogT2JzZXJ2YWJsZSBpcyB1c2VkIHRvIG5vdGlmeSBhIGdyb3VwIG9mIE9ic2VydmVyIG9iamVjdHMgd2hlbiBhIGNoYW5nZQotICogb2NjdXJzLgorICogb2NjdXJzLiBPbiBjcmVhdGlvbiwgdGhlIHNldCBvZiBvYnNlcnZlcnMgaXMgZW1wdHkuIEFmdGVyIGEgY2hhbmdlIG9jY3VycmVkLAorICogdGhlIGFwcGxpY2F0aW9uIGNhbiBjYWxsIHRoZSB7QGxpbmsgI25vdGlmeU9ic2VydmVycygpfSBtZXRob2QuIFRoaXMgd2lsbAorICogY2F1c2UgdGhlIGludm9jYXRpb24gb2YgdGhlIHtAY29kZSB1cGRhdGUoKX0gbWV0aG9kIG9mIGFsbCByZWdpc3RlcmVkCisgKiBPYnNlcnZlcnMuIFRoZSBvcmRlciBvZiBpbnZvY2F0aW9uIGlzIG5vdCBzcGVjaWZpZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbAorICogY2FsbCB0aGUgT2JzZXJ2ZXJzIGluIHRoZSBvcmRlciB0aGV5IHJlZ2lzdGVyZWQuIFN1YmNsYXNzZXMgYXJlIGNvbXBsZXRlbHkKKyAqIGZyZWUgaW4gd2hhdCBvcmRlciB0aGV5IGNhbGwgdGhlIHVwZGF0ZSBtZXRob2RzLgorICogCisgKiBAc2VlIE9ic2VydmVyCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgT2JzZXJ2YWJsZSB7CiAgICAgCkBAIC0yOSwxNyArMzgsMjEgQEAKICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgT2JzZXJ2YWJsZSBvYmplY3QuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgT2JzZXJ2YWJsZX0gb2JqZWN0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYnNlcnZhYmxlKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBPYnNlcnZlciB0byB0aGUgbGlzdCBvZiBvYnNlcnZlcnMuCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9ic2VydmVyIHRvIHRoZSBsaXN0IG9mIG9ic2VydmVycy4gSWYgaXQgaXMgYWxyZWFkeQorICAgICAqIHJlZ2lzdGVyZWQsIGl0IGlzIG5vdCBhZGRlZCBhIHNlY29uZCB0aW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYnNlcnZlcgotICAgICAqICAgICAgICAgICAgdGhlIE9ic2VydmVyIHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIE9ic2VydmVyIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkT2JzZXJ2ZXIoT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgaWYgKG9ic2VydmVyID09IG51bGwpIHsKQEAgLTUwLDY2ICs2Myw3OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgY2hhbmdlZCBmbGFnIGZvciB0aGlzIE9ic2VydmFibGUuICBBZnRlciBjYWxsaW5nIDxjb2RlPmNsZWFyQ2hhbmdlZCgpPC9jb2RlPiwgPGNvZGU+aGFzQ2hhbmdlZCgpPC9jb2RlPiB3aWxsIHJldHVybiBmYWxzZS4KKyAgICAgKiBDbGVhcnMgdGhlIGNoYW5nZWQgZmxhZyBmb3IgdGhpcyB7QGNvZGUgT2JzZXJ2YWJsZX0uIEFmdGVyIGNhbGxpbmcKKyAgICAgKiB7QGNvZGUgY2xlYXJDaGFuZ2VkKCl9LCB7QGNvZGUgaGFzQ2hhbmdlZCgpfSB3aWxsIHJldHVybiB7QGNvZGUgZmFsc2V9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckNoYW5nZWQoKSB7CiAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgT2JzZXJ2ZXJzIGluIHRoZSBsaXN0IG9mIG9ic2VydmVycy4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgdG8gdGhpcyB7QGNvZGUgT2JzZXJ2YWJsZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG9ic2VydmVycworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBvYnNlcnZlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgY291bnRPYnNlcnZlcnMoKSB7CiAgICAgICAgIHJldHVybiBvYnNlcnZlcnMuc2l6ZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBPYnNlcnZlciBmcm9tIHRoZSBsaXN0IG9mIG9ic2VydmVycy4KKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgb2JzZXJ2ZXIgZnJvbSB0aGUgbGlzdCBvZiBvYnNlcnZlcnMuIFBhc3NpbmcgbnVsbAorICAgICAqIHdvbid0IGRvIGFueXRoaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYnNlcnZlcgotICAgICAqICAgICAgICAgICAgdGhlIE9ic2VydmVyIHRvIHJlbW92ZQorICAgICAqICAgICAgICAgICAgdGhlIG9ic2VydmVyIHRvIHJlbW92ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVsZXRlT2JzZXJ2ZXIoT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgb2JzZXJ2ZXJzLnJlbW92ZUVsZW1lbnQob2JzZXJ2ZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIE9ic2VydmVycyBmcm9tIHRoZSBsaXN0IG9mIG9ic2VydmVycy4KKyAgICAgKiBSZW1vdmVzIGFsbCBvYnNlcnZlcnMgZnJvbSB0aGUgbGlzdCBvZiBvYnNlcnZlcnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlbGV0ZU9ic2VydmVycygpIHsKICAgICAgICAgb2JzZXJ2ZXJzLnNldFNpemUoMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hhbmdlZCBmbGFnIGZvciB0aGlzIE9ic2VydmFibGUuCisgICAgICogUmV0dXJucyB0aGUgY2hhbmdlZCBmbGFnIGZvciB0aGlzIHtAY29kZSBPYnNlcnZhYmxlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgY2hhbmdlZCBmbGFnIGZvciB0aGlzIE9ic2VydmFibGUgaXMgc2V0LCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY2hhbmdlZCBmbGFnIGZvciB0aGlzIHtAY29kZSBPYnNlcnZhYmxlfSBpcworICAgICAqICAgICAgICAgc2V0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzQ2hhbmdlZCgpIHsKICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgPGNvZGU+aGFzQ2hhbmdlZCgpPC9jb2RlPiByZXR1cm5zIHRydWUsIGNhbGxzIHRoZSA8Y29kZT51cGRhdGUoKTwvY29kZT4gbWV0aG9kIGZvcgotICAgICAqIGV2ZXJ5IE9ic2VydmVyIGluIHRoZSBsaXN0IG9mIG9ic2VydmVycyB1c2luZyBudWxsIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgKiBBZnRlcndhcmRzIGNhbGxzIDxjb2RlPmNsZWFyQ2hhbmdlZCgpPC9jb2RlPi4KKyAgICAgKiBJZiB7QGNvZGUgaGFzQ2hhbmdlZCgpfSByZXR1cm5zIHtAY29kZSB0cnVlfSwgY2FsbHMgdGhlIHtAY29kZSB1cGRhdGUoKX0KKyAgICAgKiBtZXRob2QgZm9yIGV2ZXJ5IG9ic2VydmVyIGluIHRoZSBsaXN0IG9mIG9ic2VydmVycyB1c2luZyBudWxsIGFzIHRoZQorICAgICAqIGFyZ3VtZW50LiBBZnRlcndhcmRzLCBjYWxscyB7QGNvZGUgY2xlYXJDaGFuZ2VkKCl9LgorICAgICAqIDxwPgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGNvZGUgbm90aWZ5T2JzZXJ2ZXJzKG51bGwpfS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIDxjb2RlPm5vdGlmeU9ic2VydmVycyhudWxsKTwvY29kZT4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlPYnNlcnZlcnMoKSB7CiAgICAgICAgIG5vdGlmeU9ic2VydmVycyhudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJZiA8Y29kZT5oYXNDaGFuZ2VkKCk8L2NvZGU+IHJldHVybnMgdHJ1ZSwgY2FsbHMgdGhlIDxjb2RlPnVwZGF0ZSgpPC9jb2RlPiBtZXRob2QgZm9yCi0gICAgICogZXZlcnkgT2JzZXJ2ZXIgaW4gdGhlIGxpc3Qgb2Ygb2JzZXJ2ZXJzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCi0gICAgICogQWZ0ZXJ3YXJkcyBjYWxscyA8Y29kZT5jbGVhckNoYW5nZWQoKTwvY29kZT4uCisgICAgICogSWYge0Bjb2RlIGhhc0NoYW5nZWQoKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGNhbGxzIHRoZSB7QGNvZGUgdXBkYXRlKCl9CisgICAgICogbWV0aG9kIGZvciBldmVyeSBPYnNlcnZlciBpbiB0aGUgbGlzdCBvZiBvYnNlcnZlcnMgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGFyZ3VtZW50LiBBZnRlcndhcmRzIGNhbGxzIHtAY29kZSBjbGVhckNoYW5nZWQoKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdXBkYXRlKCkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8ge0Bjb2RlIHVwZGF0ZSgpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCBub3RpZnlPYnNlcnZlcnMoT2JqZWN0IGRhdGEpIHsKQEAgLTEyNSw3ICsxNTEsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGFuZ2VkIGZsYWcgZm9yIHRoaXMgT2JzZXJ2YWJsZS4gQWZ0ZXIgY2FsbGluZyA8Y29kZT5zZXRDaGFuZ2VkKCk8L2NvZGU+LCA8Y29kZT5oYXNDaGFuZ2VkKCk8L2NvZGU+IHdpbGwgcmV0dXJuIHRydWUuCisgICAgICogU2V0cyB0aGUgY2hhbmdlZCBmbGFnIGZvciB0aGlzIHtAY29kZSBPYnNlcnZhYmxlfS4gQWZ0ZXIgY2FsbGluZworICAgICAqIHtAY29kZSBzZXRDaGFuZ2VkKCl9LCB7QGNvZGUgaGFzQ2hhbmdlZCgpfSB3aWxsIHJldHVybiB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldENoYW5nZWQoKSB7CiAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9PYnNlcnZlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9PYnNlcnZlci5qYXZhCmluZGV4IGI5ZDNiNmIuLjJjODQxN2IgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvT2JzZXJ2ZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL09ic2VydmVyLmphdmEKQEAgLTE5LDE2ICsxOSwyNCBAQAogCiAKIC8qKgotICogT2JzZXJ2ZXIgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBvYmplY3RzIHdoaWNoIGFyZSBhZGRlZCB0byBhbiBPYnNlcnZhYmxlLgorICoge0Bjb2RlIE9ic2VydmVyfSBpcyB0aGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IG9iamVjdHMgdGhhdCAKKyAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHVwZGF0ZXMgb24gYW4ge0Bjb2RlIE9ic2VydmFibGV9IG9iamVjdC4KKyAqIAorICogQHNlZSBPYnNlcnZhYmxlIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT2JzZXJ2ZXIgewotICAgIC8qCi0gICAgICogV2hlbiB0aGUgc3BlY2lmaWVkIG9ic2VydmFibGUgb2JqZWN0J3MgPGNvZGU+bm90aWZ5T2JzZXJ2ZXJzPC9jb2RlPgotICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYW5kIHRoZSBvYnNlcnZhYmxlIG9iamVjdCBoYXMgY2hhbmdlZCwgdGhpcyBtZXRob2QgaXMKLSAgICAgKiBjYWxsZWQuCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaWYgdGhlIHNwZWNpZmllZCB7QGNvZGUgT2JzZXJ2YWJsZX0gb2JqZWN0J3MKKyAgICAgKiB7QGNvZGUgbm90aWZ5T2JzZXJ2ZXJzfSBtZXRob2QgaXMgY2FsbGVkIChiZWNhdXNlIHRoZSB7QGNvZGUgT2JzZXJ2YWJsZX0gCisgICAgICogb2JqZWN0IGhhcyBiZWVuIHVwZGF0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9ic2VydmFibGUgdGhlIG9ic2VydmFibGUgb2JqZWN0IEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBhc3NlZCB0bwotICAgICAqIDxjb2RlPm5vdGlmeU9ic2VydmVyczwvY29kZT4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2YWJsZQorICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBPYnNlcnZhYmxlfSBvYmplY3QuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHBhc3NlZCB0byB7QGxpbmsgT2JzZXJ2YWJsZSNub3RpZnlPYnNlcnZlcnMoT2JqZWN0KX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgdm9pZCB1cGRhdGUoT2JzZXJ2YWJsZSBvYnNlcnZhYmxlLCBPYmplY3QgZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1ByaW9yaXR5UXVldWUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZS5qYXZhCmluZGV4IDc5ODdiYWMuLjU0NGM1MzggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZS5qYXZhCkBAIC0yMSwxNiArMjEsMTggQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBQcmlvcml0eVF1ZXVlIGhvbGRzIGVsZW1lbnRzIG9uIGEgcHJpb3JpdHkgaGVhcCwgd2hpY2ggb3JkZXJzIGVsZW1lbnRzCi0gKiBhY2NvcmRpbmcgdG8gdGhlIGNvbXBhcmF0b3Igc3BlY2lmaWVkIGF0IGNvbnN0cnVjdGlvbiBvciB0aGVpciBuYXR1cmFsIG9yZGVyLgotICogSWYgdGhlIHF1ZXVlIHVzZXMgbmF0dXJhbCBvcmRlciwgYW55IGVsZW1lbnQgdGhhdCBpcyBub3QgY29tcGFyYWJsZSBpcyBub3QKLSAqIHBlcm1pdHRlZCB0byBpbnNlcnQgdG8gdGhlIHF1ZXVlLgotICogCisgKiBBIFByaW9yaXR5UXVldWUgaG9sZHMgZWxlbWVudHMgb24gYSBwcmlvcml0eSBoZWFwLCB3aGljaCBvcmRlcnMgdGhlIGVsZW1lbnRzCisgKiBhY2NvcmRpbmcgdG8gdGhlaXIgbmF0dXJhbCBvcmRlciBvciBhY2NvcmRpbmcgdG8gdGhlIGNvbXBhcmF0b3Igc3BlY2lmaWVkIGF0CisgKiBjb25zdHJ1Y3Rpb24gdGltZS4gSWYgdGhlIHF1ZXVlIHVzZXMgbmF0dXJhbCBvcmRlcmluZywgb25seSBlbGVtZW50cyB0aGF0IGFyZQorICogY29tcGFyYWJsZSBhcmUgcGVybWl0dGVkIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHF1ZXVlLgorICogPHA+CiAgKiBUaGUgbGVhc3QgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIG9yZGVyaW5nIGlzIHN0b3JlZCBhdCB0aGUgaGVhZCBvZiB0aGUKICAqIHF1ZXVlIGFuZCB0aGUgZ3JlYXRlc3QgZWxlbWVudCBpcyBzdG9yZWQgYXQgdGhlIHRhaWwgb2YgdGhlIHF1ZXVlLgorICogPHA+CisgKiBBIFByaW9yaXR5UXVldWUgaXMgbm90IHN5bmNocm9uaXplZC4gSWYgbXVsdGlwbGUgdGhyZWFkcyB3aWxsIGhhdmUgdG8gYWNjZXNzCisgKiBpdCBjb25jdXJyZW50bHksIHVzZSB0aGUge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LlByaW9yaXR5QmxvY2tpbmdRdWV1ZX0uCiAgKiAKLSAqIFByaW9yaXR5UXVldWUgaXMgbm90IHN5bmNocm9uaXplZC4gSWYgbXVsdGlwbGUgdGhyZWFkcyB3aWxsIGFjY2VzcyBpdAotICogY29uY3VycmVudGx5LCB1c2UgdGhlIFByaW9yaXR5QmxvY2tpbmdRdWV1ZS4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUHJpb3JpdHlRdWV1ZTxFPiBleHRlbmRzIEFic3RyYWN0UXVldWU8RT4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCkBAIC00OSwyOSArNTEsNDAgQEAKICAgICBwcml2YXRlIHRyYW5zaWVudCBFW10gZWxlbWVudHM7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcHJpb3JpdHkgcXVldWUgd2l0aCB0aGUgY2FwYWNpdHkgb2YgMTEgYW5kIG5hdHVyYWwgb3JkZXJpbmcuCisgICAgICogQ29uc3RydWN0cyBhIHByaW9yaXR5IHF1ZXVlIHdpdGggYW4gaW5pdGlhbCBjYXBhY2l0eSBvZiAxMSBhbmQgbmF0dXJhbAorICAgICAqIG9yZGVyaW5nLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmlvcml0eVF1ZXVlKCkgewogICAgICAgICB0aGlzKERFRkFVTFRfQ0FQQUNJVFkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBwcmlvcml0eSBxdWV1ZSB3aXRoIHNwZWNpZmllZCBjYXBhY2l0eSBhbmQgbmF0dXJhbCBvcmRlcmluZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgcHJpb3JpdHkgcXVldWUgd2l0aCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5IGFuZCBuYXR1cmFsCisgICAgICogb3JkZXJpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsQ2FwYWNpdHkgaXMgbGVzcyB0aGFuIDEKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluaXRpYWxDYXBhY2l0eSBpcyBsZXNzIHRoYW4gMS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpb3JpdHlRdWV1ZShpbnQgaW5pdGlhbENhcGFjaXR5KSB7CiAgICAgICAgIHRoaXMoaW5pdGlhbENhcGFjaXR5LCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcHJpb3JpdHkgcXVldWUgd2l0aCBzcGVjaWZpZWQgY2FwYWNpdHkgYW5kIGNvbXBhcmF0b3IuCisgICAgICogQ29uc3RydWN0cyBhIHByaW9yaXR5IHF1ZXVlIHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eSBhbmQgY29tcGFyYXRvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLiBJZiBpdCBpcyBudWxsLCB0aGUgbmF0dXJhbAotICAgICAqICAgICAgICBvcmRlcmluZyB3aWxsIGJlIHVzZWQuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWxDYXBhY2l0eSBpcyBsZXNzIHRoYW4gMQorICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCisgICAgICogQHBhcmFtIGNvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4gSWYgaXQgaXMgbnVsbCwgdGhlIG5hdHVyYWwgb3JkZXJpbmcKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbml0aWFsQ2FwYWNpdHkgaXMgbGVzcyB0aGFuIDEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW9yaXR5UXVldWUoaW50IGluaXRpYWxDYXBhY2l0eSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKICAgICAgICAgaWYgKGluaXRpYWxDYXBhY2l0eSA8IDEpIHsKQEAgLTgzLDE2ICs5NiwxOCBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIHByaW9yaXR5IHF1ZXVlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbi4KLSAgICAgKiBUaGUgY29uc3RydWN0ZWQgcHJpb3JpdHkgcXVldWUgaGFzIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIDExMCUgdGhlCi0gICAgICogY29sbGVjdGlvbi4gQW5kIHRoZSBwcmlvcml0eSBxdWV1ZSB1c2VzIG5hdHVyYWwgb3JkZXJpbmcgdG8gb3JkZXIgaXRzCisgICAgICogVGhlIGNvbnN0cnVjdGVkIHByaW9yaXR5IHF1ZXVlIGhhcyB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiAxMTAlIG9mIHRoZQorICAgICAqIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24uIFRoZSBxdWV1ZSB1c2VzIG5hdHVyYWwgb3JkZXJpbmcgdG8gb3JkZXIgaXRzCiAgICAgICogZWxlbWVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNvbGxlY3Rpb24gd2hvc2UgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcHJpb3JpdHkKLSAgICAgKiAgICAgICAgcXVldWUgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBpcwotICAgICAqICAgICAgICAgbm90IGNvbXBhcmFibGUuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwaXRvbiBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIGlzCi0gICAgICogICAgICAgICBudWxsLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwcmlvcml0eQorICAgICAqICAgICAgICAgICAgcXVldWUgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIGFyZSBub3QgY29tcGFyYWJsZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBhcmUgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpb3JpdHlRdWV1ZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7CiAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgUHJpb3JpdHlRdWV1ZSkgewpAQCAtMTA4LDExICsxMjMsMTMgQEAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgcHJpb3JpdHkgcXVldWUgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgYW5vdGhlcgogICAgICAqIHByaW9yaXR5IHF1ZXVlLiBUaGUgY29uc3RydWN0ZWQgcHJpb3JpdHkgcXVldWUgaGFzIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogb2YgMTEwJSB0aGUgbGF0dGVyIG9uZS4gQW5kIHRoZSB0d28gcHJpb3JpdHkgcXVldWUgaGFzIHRoZSBzYW1lCisgICAgICogb2YgMTEwJSBvZiB0aGUgc3BlY2lmaWVkIG9uZS4gQm90aCBwcmlvcml0eSBxdWV1ZXMgaGF2ZSB0aGUgc2FtZQogICAgICAqIGNvbXBhcmF0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIHByaW9yaXR5IHF1ZXVlIHdob3NlIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHByaW9yaXR5Ci0gICAgICogICAgICAgIHF1ZXVlIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgcHJpb3JpdHkgcXVldWUgd2hvc2UgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHByaW9yaXR5IHF1ZXVlIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmlvcml0eVF1ZXVlKFByaW9yaXR5UXVldWU8PyBleHRlbmRzIEU+IGMpIHsKICAgICAgICAgZ2V0RnJvbVByaW9yaXR5UXVldWUoYyk7CkBAIC0xMjAsMTIgKzEzNywxNCBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIHByaW9yaXR5IHF1ZXVlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIGEgc29ydGVkIHNldC4KLSAgICAgKiBUaGUgY29uc3RydWN0ZWQgcHJpb3JpdHkgcXVldWUgaGFzIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIDExMCUgdGhlCi0gICAgICogc29ydGVkIHNldC4gQW5kIHRoZSBwcmlvcml0eSBxdWV1ZSBoYXMgdGhlIHNhbWUgY29tcGFyYXRvciBvZiB0aGUgc29ydGVkCi0gICAgICogc2V0LgorICAgICAqIFRoZSBjb25zdHJ1Y3RlZCBwcmlvcml0eSBxdWV1ZSBoYXMgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgMTEwJSBvZiB0aGUKKyAgICAgKiBzaXplIG9mIHRoZSBzb3J0ZWQgc2V0LiBUaGUgcHJpb3JpdHkgcXVldWUgd2lsbCBoYXZlIHRoZSBzYW1lIGNvbXBhcmF0b3IKKyAgICAgKiBhcyB0aGUgc29ydGVkIHNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyB0aGUgc29ydGVkIHNldCB3aG9zZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwcmlvcml0eQotICAgICAqICAgICAgICBxdWV1ZSB0byBiZSBjb25zdHJ1Y3RlZC4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIHNvcnRlZCBzZXQgd2hvc2UgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcHJpb3JpdHkKKyAgICAgKiAgICAgICAgICAgIHF1ZXVlIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmlvcml0eVF1ZXVlKFNvcnRlZFNldDw/IGV4dGVuZHMgRT4gYykgewogICAgICAgICBnZXRGcm9tU29ydGVkU2V0KGMpOwpAQCAtMTM2LDYgKzE1NSw3IEBACiAgICAgICogaW4gYW55IHNwZWNpZmllZCBvcmRlcmluZy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvciBvZiB0aGUgcHJpb3JpdHkgcXVldWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewpAQCAtMTQ3LDYgKzE2Nyw3IEBACiAgICAgICogdGhhbiB0aGUgSW50ZWdlci5NQVgsIHRoZW4gaXQgcmV0dXJucyBJbnRlZ2VyLk1BWC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwcmlvcml0eSBxdWV1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CkBAIC0xNTUsNiArMTc2LDggQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgcHJpb3JpdHkgcXVldWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CkBAIC0xNjUsMTEgKzE4OCwxMyBAQAogICAgIC8qKgogICAgICAqIEluc2VydHMgdGhlIGVsZW1lbnQgdG8gdGhlIHByaW9yaXR5IHF1ZXVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZQotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZQotICAgICAqICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHByaW9yaXR5IHF1ZXVlIHVzaW5nIHRoZSBvcmRlcmluZyBvZiB0aGUgcHJpb3JpdHkKLSAgICAgKiAgICAgICAgIHF1ZXVlLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcGl0b24gaWYgdGhlIGVsZW1lbnQgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBwcmlvcml0eSBxdWV1ZS4KKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB0cnVlCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICogICAgICAgICAgICAgcHJpb3JpdHkgcXVldWUgdXNpbmcgdGhlIG9yZGVyaW5nIG9mIHRoZSBwcmlvcml0eSBxdWV1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvZmZlcihFIG8pIHsKICAgICAgICAgaWYgKG51bGwgPT0gbykgewpAQCAtMTg0LDcgKzIwOSw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyBhbmQgcmVtb3ZlcyB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGVhZCBvZiB0aGUgcXVldWUuIE51bGwgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICAgICAqIEByZXR1cm4gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIG9yIG51bGwgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIHBvbGwoKSB7CiAgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKQEAgLTE5Niw5ICsyMjIsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGJ1dCBub3QgcmVtb3ZlcyB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisgICAgICogR2V0cyBidXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4gTnVsbCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgICAgICogQHJldHVybiB0aGUgaGVhZCBvZiB0aGUgcXVldWUgb3IgbnVsbCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEUgcGVlaygpIHsKICAgICAgICAgaWYgKGlzRW1wdHkoKSkgewpAQCAtMjEwLDE5ICsyMzcsMjIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb21wYXJhdG9yIG9mIHRoZSBwcmlvcml0eSBxdWV1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21wYXJhdG9yIG9mIHRoZSBwcmlvcml0eSBxdWV1ZS4gTnVsbCBpZiB0aGUgbmF0dXJhbAorICAgICAqIEByZXR1cm4gdGhlIGNvbXBhcmF0b3Igb2YgdGhlIHByaW9yaXR5IHF1ZXVlIG9yIG51bGwgaWYgdGhlIG5hdHVyYWwKICAgICAgKiAgICAgICAgIG9yZGVyaW5nIGlzIHVzZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKCkgewogICAgICAgICByZXR1cm4gY29tcGFyYXRvcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG9mIHRoZSBwcmlvcml0eSBxdWV1ZS4KKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIHByaW9yaXR5IHF1ZXVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgdG8gYmUgcmVtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBpbiB0aGUgcHJpb3JpdHkgcXVldWUsIGZhbHNlIGlmIHRoZSBvYmplY3QKLSAgICAgKiAgICAgICAgIGlzIG5vdCBpbiB0aGUgcHJpb3JpdHkgcXVldWUuCisgICAgICogQHBhcmFtIG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCB3YXMgaW4gdGhlIHByaW9yaXR5IHF1ZXVlLCBmYWxzZSBpZiB0aGUgb2JqZWN0CisgICAgICogICAgICAgICB3YXMgbm90IGluIHRoZSBwcmlvcml0eSBxdWV1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTI0NiwxMiArMjc2LDEzIEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgcHJpb3JpdHkgcXVldWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIG9iamVjdCB0byBiZSBhZGRlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlCi0gICAgICogICAgICAgICBlbGVtZW50cyBpbiB0aGUgcHJpb3JpdHkgcXVldWUgdXNpbmcgdGhlIG9yZGVyaW5nIG9mIHRoZSBwcmlvcml0eQotICAgICAqICAgICAgICAgcXVldWUuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwaXRvbiBpZiB0aGUgZWxlbWVudCBpcyBudWxsLgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGFkZGVkLgorICAgICAqIEByZXR1cm4gYWx3YXlzIHRydWUuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICogICAgICAgICAgICAgcHJpb3JpdHkgcXVldWUgdXNpbmcgdGhlIG9yZGVyaW5nIG9mIHRoZSBwcmlvcml0eSBxdWV1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Byb3BlcnRpZXMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydGllcy5qYXZhCmluZGV4IDM0MTUxMzMuLjE1Yjc0ZWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydGllcy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydGllcy5qYXZhCkBAIC00MiwxOSArNDIsMjggQEAKIAogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisvLyBFTkQgYW5kcm9pZC1hZGRlZAogCisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisvLyBjb3BpZWQgZnJvbSBuZXdlciB2ZXJzaW9uIG9mIEhhcm9tbnkKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CisvLyBFTkQgYW5kcm9pZC1hZGRlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuUHJpdmlBY3Rpb247CiAKIC8qKgotICogUHJvcGVydGllcyBpcyBhIEhhc2h0YWJsZSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIG11c3QgYmUgU3RyaW5ncy4gRWFjaAotICogUHJvcGVydGllcyBjYW4gaGF2ZSBhIGRlZmF1bHQgUHJvcGVydGllcyB3aGljaCBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgdmFsdWVzCi0gKiB3aGljaCBhcmUgdXNlZCBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGlzIFByb3BlcnRpZXMuCisgKiBBIHtAY29kZSBQcm9wZXJ0aWVzfSBvYmplY3QgaXMgYSB7QGNvZGUgSGFzaHRhYmxlfSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIAorICogbXVzdCBiZSB7QGNvZGUgU3RyaW5nfXMuIEVhY2ggcHJvcGVydHkgY2FuIGhhdmUgYSBkZWZhdWx0IAorICoge0Bjb2RlIFByb3BlcnRpZXN9IGxpc3Qgd2hpY2ggc3BlY2lmaWVzIHRoZSBkZWZhdWx0CisgKiB2YWx1ZXMgdG8gYmUgdXNlZCB3aGVuIGEgZ2l2ZW4ga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGlzIHtAY29kZSBQcm9wZXJ0aWVzfQorICogaW5zdGFuY2UuCiAgKiAKICAqIEBzZWUgSGFzaHRhYmxlCiAgKiBAc2VlIGphdmEubGFuZy5TeXN0ZW0jZ2V0UHJvcGVydGllcworICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzIGV4dGVuZHMgSGFzaHRhYmxlPE9iamVjdCxPYmplY3Q+IHsKICAgICAKQEAgLTc0LDcgKzgzLDEwIEBACiAgICAgICAgICAgICArICIgICAgPCFBVFRMSVNUIGVudHJ5IGtleSBDREFUQSAjUkVRVUlSRUQgPiI7CiAgICAgCiAgICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGlzIFByb3BlcnRpZXMuCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciBrZXlzIG5vdCBmb3VuZCBpbiB0aGlzIHtAY29kZSBQcm9wZXJ0aWVzfQorICAgICAqIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIGRlZmF1bHRzOwogCkBAIC04MiwxOCArOTQsMjEgQEAKICAgICAgICAgICAgIEtFWV9ET05FID0gNCwgSUdOT1JFID0gNTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUHJvcGVydGllcyBvYmplY3QuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgUHJvcGVydGllc30gb2JqZWN0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm9wZXJ0aWVzKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUHJvcGVydGllcyBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCBkZWZhdWx0Ci0gICAgICogcHJvcGVydGllcy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBQcm9wZXJ0aWVzfSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCBkZWZhdWx0CisgICAgICoge0Bjb2RlIFByb3BlcnRpZXN9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB7QGNvZGUgUHJvcGVydGllc30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7CiAgICAgICAgIGRlZmF1bHRzID0gcHJvcGVydGllczsKQEAgLTE0MSwxMiArMTU2LDEzIEBACiAKICAgICAvKioKICAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBJZiB0aGUgcHJvcGVydHkgaXMgbm90Ci0gICAgICogZm91bmQsIGxvb2sgaW4gdGhlIGRlZmF1bHQgcHJvcGVydGllcy4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBpbgotICAgICAqIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMsIGFuc3dlciBudWxsLgorICAgICAqIGZvdW5kLCB0aGUgZGVmYXVsdCB7QGNvZGUgUHJvcGVydGllc30gYXJlIGNoZWNrZWQuIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QKKyAgICAgKiBmb3VuZCBpbiB0aGUgZGVmYXVsdCB7QGNvZGUgUHJvcGVydGllc30sIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGZpbmQuCisgICAgICogQHJldHVybiB0aGUgbmFtZWQgcHJvcGVydHkgdmFsdWUsIG9yIHtAY29kZSBudWxsfSBpZiBpdCBjYW4ndCBiZSBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CiAgICAgICAgIE9iamVjdCByZXN1bHQgPSBzdXBlci5nZXQobmFtZSk7CkBAIC0xNTksMTQgKzE3NSwxNiBAQAogCiAgICAgLyoqCiAgICAgICogU2VhcmNoZXMgZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdAotICAgICAqIGZvdW5kLCBsb29rIGluIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMuIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQgaW4KLSAgICAgKiB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzLCBhbnN3ZXIgdGhlIHNwZWNpZmllZCBkZWZhdWx0LgorICAgICAqIGZvdW5kLCBpdCBsb29rcyBpbiB0aGUgZGVmYXVsdCB7QGNvZGUgUHJvcGVydGllc30uIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QKKyAgICAgKiBmb3VuZCBpbiB0aGUgZGVmYXVsdCB7QGNvZGUgUHJvcGVydGllc30sIGl0IHJldHVybnMgdGhlIHNwZWNpZmllZAorICAgICAqIGRlZmF1bHQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBmaW5kCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZmluZC4KICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIG5hbWVkIHByb3BlcnR5IHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgIE9iamVjdCByZXN1bHQgPSBzdXBlci5nZXQobmFtZSk7CkBAIC0xODEsMTEgKzE5OSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExpc3RzIHRoZSBtYXBwaW5ncyBpbiB0aGlzIFByb3BlcnRpZXMgdG8gdGhlIHNwZWNpZmllZCBQcmludFN0cmVhbSBpbiBhCisgICAgICogTGlzdHMgdGhlIG1hcHBpbmdzIGluIHRoaXMge0Bjb2RlIFByb3BlcnRpZXN9IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgUHJpbnRTdHJlYW19IGluIGEKICAgICAgKiBodW1hbiByZWFkYWJsZSBmb3JtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBQcmludFN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQcmludFN0cmVhbX0gdG8gd3JpdGUgdGhlIGNvbnRlbnQgdG8gaW4gaHVtYW4gcmVhZGFibGUKKyAgICAgKiAgICAgICAgICAgIGZvcm0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbGlzdChQcmludFN0cmVhbSBvdXQpIHsKICAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CkBAIC0yMTUsMTEgKzIzNiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExpc3RzIHRoZSBtYXBwaW5ncyBpbiB0aGlzIFByb3BlcnRpZXMgdG8gdGhlIHNwZWNpZmllZCBQcmludFdyaXRlciBpbiBhCisgICAgICogTGlzdHMgdGhlIG1hcHBpbmdzIGluIHRoaXMge0Bjb2RlIFByb3BlcnRpZXN9IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgUHJpbnRXcml0ZXJ9IGluIGEKICAgICAgKiBodW1hbiByZWFkYWJsZSBmb3JtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBQcmludFdyaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQcmludFdyaXRlcn0gdG8gd3JpdGUgdGhlIGNvbnRlbnQgdG8gaW4gaHVtYW4KKyAgICAgKiAgICAgICAgICAgIHJlYWRhYmxlIGZvcm0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbGlzdChQcmludFdyaXRlciB3cml0ZXIpIHsKICAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CkBAIC0yNDksMTIgKzI3MywzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWRzIHByb3BlcnRpZXMgZnJvbSB0aGUgc3BlY2lmaWVkIElucHV0U3RyZWFtLiBUaGUgcHJvcGVydGllcyBhcmUgb2YKLSAgICAgKiB0aGUgZm9ybSA8Y29kZT5rZXk9dmFsdWU8L2NvZGU+LCBvbmUgcHJvcGVydHkgcGVyIGxpbmUuCisgICAgICogTG9hZHMgcHJvcGVydGllcyBmcm9tIHRoZSBzcGVjaWZpZWQge0Bjb2RlIElucHV0U3RyZWFtfS4gVGhlIGVuY29kaW5nIGlzCisgICAgICogSVNPODg1OS0xLiBUaGUge0Bjb2RlIFByb3BlcnRpZXN9IGZpbGUgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIGZvbGxvd2luZyBydWxlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkVtcHR5IGxpbmVzIGFyZSBpZ25vcmVkLjwvbGk+CisgICAgICogPGxpPkxpbmVzIHN0YXJ0aW5nIHdpdGggZWl0aGVyIGEgIiMiIG9yIGEgIiEiIGFyZSBjb21tZW50IGxpbmVzIGFuZCBhcmUKKyAgICAgKiBpZ25vcmVkLjwvbGk+CisgICAgICogPGxpPkEgYmFja3NsYXNoIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgZXNjYXBlcyB0aGUgZm9sbG93aW5nIG5ld2xpbmUKKyAgICAgKiBjaGFyYWN0ZXIgKCJcciIsICJcbiIsICJcclxuIikuIElmIHRoZXJlJ3MgYSB3aGl0ZXNwYWNlIGFmdGVyIHRoZQorICAgICAqIGJhY2tzbGFzaCBpdCB3aWxsIGp1c3QgZXNjYXBlIHRoYXQgd2hpdGVzcGFjZSBpbnN0ZWFkIG9mIGNvbmNhdGVuYXRpbmcKKyAgICAgKiB0aGUgbGluZXMuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gY29tbWVudCBsaW5lcy48L2xpPgorICAgICAqIDxsaT5BIHByb3BlcnR5IGxpbmUgY29uc2lzdHMgb2YgdGhlIGtleSwgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGtleSBhbmQKKyAgICAgKiB0aGUgdmFsdWUsIGFuZCB0aGUgdmFsdWUuIFRoZSBrZXkgZ29lcyB1cCB0byB0aGUgZmlyc3Qgd2hpdGVzcGFjZSwgIj0iIG9yCisgICAgICogIjoiIHRoYXQgaXMgbm90IGVzY2FwZWQuIFRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSBjb250YWlucworICAgICAqIGVpdGhlciBvbmUgd2hpdGVzcGFjZSwgb25lICI9IiBvciBvbmUgIjoiIGFuZCBhbnkgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgICAgKiB3aGl0ZXNwYWNlcyBiZWZvcmUgYW5kIGFmdGVyIHRoYXQgY2hhcmFjdGVyLiBUaGUgdmFsdWUgc3RhcnRzIHdpdGggdGhlCisgICAgICogZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZS48L2xpPgorICAgICAqIDxsaT5Gb2xsb3dpbmcgZXNjYXBlIHNlcXVlbmNlcyBhcmUgcmVjb2duaXplZDogIlwgIiwgIlxcIiwgIlxyIiwgIlxuIiwKKyAgICAgKiAiXCEiLCAiXCMiLCAiXHQiLCAiXGIiLCAiXGYiLCBhbmQgIiYjOTI7dVhYWFgiICh1bmljb2RlIGNoYXJhY3RlcikuPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIElucHV0U3RyZWFtfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZXJyb3Igb2NjdXJzIGR1cmluZyByZWFkaW5nIGZyb20gdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBtb2RlID0gTk9ORSwgdW5pY29kZSA9IDAsIGNvdW50ID0gMDsKQEAgLTI4MCwxMiArMzI0LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobW9kZSA9PSBVTklDT0RFKSB7CiAgICAgICAgICAgICAgICAgaW50IGRpZ2l0ID0gQ2hhcmFjdGVyLmRpZ2l0KG5leHRDaGFyLCAxNik7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBIYXJtb255CiAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSA9ICh1bmljb2RlIDw8IDQpICsgZGlnaXQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50IDwgNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbHVuaS4wOT1JbnZhbGlkIFVuaWNvZGUgc2VxdWVuY2U6IGlsbGVnYWwgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJsdW5pLjA5IikpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICAgICAgbW9kZSA9IE5PTkU7CiAgICAgICAgICAgICAgICAgYnVmW29mZnNldCsrXSA9IChjaGFyKSB1bmljb2RlOwogICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciAhPSAnXG4nKSB7CkBAIC00MDMsNiArNDUzLDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWZbb2Zmc2V0KytdID0gbmV4dENoYXI7CiAgICAgICAgIH0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICAvLyBjb3BpZWQgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgSGFybW9ueQorICAgICAgICBpZiAobW9kZSA9PSBVTklDT0RFICYmIGNvdW50IDw9IDQpIHsKKyAgICAgICAgICAgIC8vIGx1bmkuMDg9SW52YWxpZCBVbmljb2RlIHNlcXVlbmNlOiBleHBlY3RlZCBmb3JtYXQgXFx1eHh4eAorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImx1bmkuMDgiKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgaWYgKGtleUxlbmd0aCA+PSAwKSB7CiAgICAgICAgICAgICBTdHJpbmcgdGVtcCA9IG5ldyBTdHJpbmcoYnVmLCAwLCBvZmZzZXQpOwogICAgICAgICAgICAgcHV0KHRlbXAuc3Vic3RyaW5nKDAsIGtleUxlbmd0aCksIHRlbXAuc3Vic3RyaW5nKGtleUxlbmd0aCkpOwpAQCAtNDEwLDkgKzQ2NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBwcm9wZXJ0eSBuYW1lcyB0aGF0IHRoaXMgUHJvcGVydGllcyBjb250YWlucy4KKyAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgcHJvcGVydHkgbmFtZXMgdGhhdCB0aGlzIHtAY29kZSBQcm9wZXJ0aWVzfSBvYmplY3QKKyAgICAgKiBjb250YWlucy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCBwcm9wZXJ0aWVzCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgRW51bWVyYXRpb259IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCBwcm9wZXJ0aWVzCisgICAgICogICAgICAgICB0aGF0IHRoaXMge0Bjb2RlIFByb3BlcnRpZXN9IG9iamVjdCBjb250YWlucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb248Pz4gcHJvcGVydHlOYW1lcygpIHsKICAgICAgICAgaWYgKGRlZmF1bHRzID09IG51bGwpIHsKQEAgLTQzMiwxOSArNDkyLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIG1hcHBpbmdzIGluIHRoaXMgUHJvcGVydGllcyB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwKLSAgICAgKiBwdXR0aW5nIHRoZSBzcGVjaWZpZWQgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nLiBUaGUgb3V0cHV0IGZyb20gdGhpcwotICAgICAqIG1ldGhvZCBpcyBzdWl0YWJsZSBmb3IgYmVpbmcgcmVhZCBieSB0aGUgbG9hZCgpIG1ldGhvZC4KKyAgICAgKiBTYXZlcyB0aGUgbWFwcGluZ3MgaW4gdGhpcyB7QGNvZGUgUHJvcGVydGllc30gdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBPdXRwdXRTdHJlYW19LCBwdXR0aW5nIHRoZSBzcGVjaWZpZWQgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nLiBUaGUgb3V0cHV0CisgICAgICogZnJvbSB0aGlzIG1ldGhvZCBpcyBzdWl0YWJsZSBmb3IgYmVpbmcgcmVhZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgI2xvYWQoSW5wdXRTdHJlYW0pfSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIE91dHB1dFN0cmVhbQotICAgICAqIEBwYXJhbSBjb21tZW50Ci0gICAgICogICAgICAgICAgICB0aGUgY29tbWVudAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUga2V5IG9yIHZhbHVlIG9mIGEgbWFwcGluZyBpcyBub3QgYSBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBEb2VzIG5vdCB0aHJvdyBhbiBJT0V4Y2VwdGlvbiwgdXNlIHtAbGluayAjc3RvcmV9CisgICAgICogQHBhcmFtIG91dCB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdG8uCisgICAgICogQHBhcmFtIGNvbW1lbnQgdGhlIGNvbW1lbnQgdG8gYWRkIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiB0aGUga2V5IG9yIHZhbHVlIG9mIGEgbWFwcGluZyBpcyBub3QgYQorICAgICAqICAgICAgICAgICAgICAgIFN0cmluZy4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpZ25vcmVzIGFueSB7QGNvZGUgSU9FeGNlcHRpb259IHRocm93biB3aGlsZQorICAgICAqICAgICAgICAgICAgIHdyaXRpbmcgLS0gdXNlIHtAbGluayAjc3RvcmV9IGluc3RlYWQgZm9yIGJldHRlciBleGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBoYW5kbGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGNvbW1lbnQpIHsKQEAgLTQ1NiwxMyArNTE2LDE0IEBACiAKICAgICAvKioKICAgICAgKiBNYXBzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsCi0gICAgICogdGhlIG9sZCB2YWx1ZSBpcyByZXBsYWNlZC4gVGhlIGtleSBhbmQgdmFsdWUgY2Fubm90IGJlIG51bGwuCisgICAgICogdGhlIG9sZCB2YWx1ZSBpcyByZXBsYWNlZC4gVGhlIGtleSBhbmQgdmFsdWUgY2Fubm90IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBtYXBwZWQgdG8gdGhlIGtleSwgb3IgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBtYXBwZWQgdG8gdGhlIGtleSwgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3Qgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogICAgICAgICByZXR1cm4gcHV0KG5hbWUsIHZhbHVlKTsKQEAgLTQ3MSwxOCArNTMyLDE4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxpbmVTZXBhcmF0b3I7CiAKICAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIG1hcHBpbmdzIGluIHRoaXMgUHJvcGVydGllcyB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwKLSAgICAgKiBwdXR0aW5nIHRoZSBzcGVjaWZpZWQgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nLiBUaGUgb3V0cHV0IGZyb20gdGhpcwotICAgICAqIG1ldGhvZCBpcyBzdWl0YWJsZSBmb3IgYmVpbmcgcmVhZCBieSB0aGUgbG9hZCgpIG1ldGhvZC4KKyAgICAgKiBTdG9yZXMgdGhlIG1hcHBpbmdzIGluIHRoaXMge0Bjb2RlIFByb3BlcnRpZXN9IHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogT3V0cHV0U3RyZWFtfSwgcHV0dGluZyB0aGUgc3BlY2lmaWVkIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZy4gVGhlIG91dHB1dAorICAgICAqIGZyb20gdGhpcyBtZXRob2QgaXMgc3VpdGFibGUgZm9yIGJlaW5nIHJlYWQgYnkgdGhlCisgICAgICoge0BsaW5rICNsb2FkKElucHV0U3RyZWFtKX0gbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBPdXRwdXRTdHJlYW0KLSAgICAgKiBAcGFyYW0gY29tbWVudAotICAgICAqICAgICAgICAgICAgdGhlIGNvbW1lbnQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUga2V5IG9yIHZhbHVlIG9mIGEgbWFwcGluZyBpcyBub3QgYSBTdHJpbmcKKyAgICAgKiBAcGFyYW0gb3V0IHRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfSB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCB0byBwdXQgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHdyaXRlIHRvIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBPdXRwdXRTdHJlYW19LgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gdGhlIGtleSBvciB2YWx1ZSBvZiBhIG1hcHBpbmcgaXMgbm90IGEKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgU3RyaW5nfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcmUoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGNvbW1lbnQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNTE0LDYgKzU3NSwyNSBAQAogICAgICAgICB3cml0ZXIuZmx1c2goKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgcHJvcGVydGllcyBmcm9tIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0gY29udGFpbmluZyB0aGUKKyAgICAgKiBwcm9wZXJ0aWVzIGluIFhNTCBmb3JtLiBUaGUgWE1MIGRvY3VtZW50IG11c3QgYmVnaW4gd2l0aCAoYW5kIGNvbmZvcm0gdG8pCisgICAgICogZm9sbG93aW5nIERPQ1RZUEU6CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiAmbHQ7IURPQ1RZUEUgcHJvcGVydGllcyBTWVNURU0gJnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9kdGQvcHJvcGVydGllcy5kdGQmcXVvdDsmZ3Q7CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogQWxzbyB0aGUgY29udGVudCBvZiB0aGUgWE1MIGRhdGEgbXVzdCBzYXRpc2Z5IHRoZSBEVEQgYnV0IHRoZSB4bWwgaXMgbm90CisgICAgICogdmFsaWRhdGVkIGFnYWluc3QgaXQuIFRoZSBEVEQgaXMgbm90IGxvYWRlZCBmcm9tIHRoZSBTWVNURU0gSUQuIEFmdGVyCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSW5wdXRTdHJlYW0gaXMgbm90IGNsb3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW4gdGhlIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGluIGNhc2UgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBhIHJlYWQgb3BlcmF0aW9uLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb24gaWYgdGhlIFhNTCBkYXRhIGlzIG5vdCBhIHZhbGlkCisgICAgICogICAgICAgICAgICAgcHJvcGVydGllcyBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkRnJvbVhNTChJbnB1dFN0cmVhbSBpbikgCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGluID09IG51bGwpIHsKQEAgLTU3OCw3ICs2NTgsNyBAQAogICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRUZXh0Q29udGVudChlbnRyeSk7CiAgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKLQorICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICoga2V5ICE9IG51bGwgJiB2YWx1ZSAhPSBudWxsCiAgICAgICAgICAgICAgICAgICogYnV0IGtleSBvcihhbmQpIHZhbHVlIGNhbiBiZSBlbXB0eSBTdHJpbmcKQEAgLTU5MSwxMiArNjcxLDQ5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYWxsIHByb3BlcnRpZXMgc3RvcmVkIGluIHRoaXMgaW5zdGFuY2UgaW50byB0aGUge0Bjb2RlCisgICAgICogT3V0cHV0U3RyZWFtfSBpbiBYTUwgcmVwcmVzZW50YXRpb24uIFRoZSBET0NUWVBFIGlzCisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiAmbHQ7IURPQ1RZUEUgcHJvcGVydGllcyBTWVNURU0gJnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9kdGQvcHJvcGVydGllcy5kdGQmcXVvdDsmZ3Q7CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogSWYgdGhlIGNvbW1lbnQgaXMgbnVsbCwgbm8gY29tbWVudCBpcyBhZGRlZCB0byB0aGUgb3V0cHV0LiBVVEYtOCBpcyB1c2VkCisgICAgICogYXMgdGhlIGVuY29kaW5nLiBUaGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gaXMgbm90IGNsb3NlZCBhdCB0aGUgZW5kLiBBCisgICAgICogY2FsbCB0byB0aGlzIG1ldGhvZCBpcyB0aGUgc2FtZSBhcyBhIGNhbGwgdG8ge0Bjb2RlIHN0b3JlVG9YTUwob3MsCisgICAgICogY29tbWVudCwgIlVURi04Iil9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcyB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdG8uCisgICAgICogQHBhcmFtIGNvbW1lbnQgdGhlIGNvbW1lbnQgdG8gYWRkLiBJZiBudWxsLCBubyBjb21tZW50IGlzIGFkZGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB3cml0aW5nIHRvIHRoZSBvdXRwdXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcmVUb1hNTChPdXRwdXRTdHJlYW0gb3MsIFN0cmluZyBjb21tZW50KSAKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN0b3JlVG9YTUwob3MsIGNvbW1lbnQsICJVVEYtOCIpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbGwgcHJvcGVydGllcyBzdG9yZWQgaW4gdGhpcyBpbnN0YW5jZSBpbnRvIHRoZSB7QGNvZGUKKyAgICAgKiBPdXRwdXRTdHJlYW19IGluIFhNTCByZXByZXNlbnRhdGlvbi4gVGhlIERPQ1RZUEUgaXMKKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqICZsdDshRE9DVFlQRSBwcm9wZXJ0aWVzIFNZU1RFTSAmcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcm9wZXJ0aWVzLmR0ZCZxdW90OyZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiBJZiB0aGUgY29tbWVudCBpcyBudWxsLCBubyBjb21tZW50IGlzIGFkZGVkIHRvIHRoZSBvdXRwdXQuIFRoZSBwYXJhbWV0ZXIKKyAgICAgKiB7QGNvZGUgZW5jb2Rpbmd9IGRlZmluZXMgd2hpY2ggZW5jb2Rpbmcgc2hvdWxkIGJlIHVzZWQuIFRoZSB7QGNvZGUKKyAgICAgKiBPdXRwdXRTdHJlYW19IGlzIG5vdCBjbG9zZWQgYXQgdGhlIGVuZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3MgdGhlIHtAY29kZSBPdXRwdXRTdHJlYW19IHRvIHdyaXRlIHRvLgorICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHRvIGFkZC4gSWYgbnVsbCwgbm8gY29tbWVudCBpcyBhZGRlZC4KKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGNvZGUgaWRlbnRpZnlpbmcgdGhlIGVuY29kaW5nIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHdyaXRlIGludG8gdGhlIHtAY29kZSBPdXRwdXRTdHJlYW19LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB3cml0aW5nIHRvIHRoZSBvdXRwdXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlVG9YTUwoT3V0cHV0U3RyZWFtIG9zLCBTdHJpbmcgY29tbWVudCwKICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Qcm9wZXJ0eVBlcm1pc3Npb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydHlQZXJtaXNzaW9uLmphdmEKaW5kZXggNTg4OWFjZi4uY2RiZmUzNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Qcm9wZXJ0eVBlcm1pc3Npb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Byb3BlcnR5UGVybWlzc2lvbi5qYXZhCkBAIC0yOCw3ICsyOCwxOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVXRpbDsKIAogLyoqCi0gKiBQcm9wZXJ0eVBlcm1pc3Npb24gb2JqZWN0cyByZXByZXNlbnQgcGVybWlzc2lvbiB0byBhY2Nlc3Mgc3lzdGVtIHByb3BlcnRpZXMuCisgKiB7QGNvZGUgUHJvcGVydHlQZXJtaXNzaW9ufSBvYmplY3RzIHJlcHJlc2VudCBhIHBlcm1pc3Npb24gdG8gYWNjZXNzIHN5c3RlbQorICogcHJvcGVydGllcy4KKyAqIDxwPgorICogQSBwZXJtaXNzaW9uIGlzIG9uZSBvZiB0aGUgcG9zc2libGUgcGVybWlzc2lvbiBzdHJpbmdzIGxpa2UgInVzZXIubmFtZSIgb3IKKyAqICJqYXZhLnZlcnNpb24iLiBJdCdzIGFsc28gcG9zc2libGUgdG8gdXNlIGEgd2lsZGNhcmQgdG8gZGVmaW5lIHRoZSBwZXJtaXNzaW9uCisgKiB0byBzZXZlcmFsIHByb3BlcnRpZXMgYXQgb25jZS4gRm9yIGV4YW1wbGUgInVzZXIuKiIgd2lsbCBkZWZpbmUgdGhlCisgKiBwZXJtaXNzaW9uIGZvciAidXNlci5ob21lIiwgInVzZXIubmFtZSIsICJ1c2VyLmRpciIsIC4uLiAiKiIgZGVmaW5lcyB0aGUKKyAqIHBlcm1pc3Npb24gZm9yIGFsbCBhdmFpbGFibGUgcHJvcGVydGllcy4KKyAqIDxwPgorICogVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBwZXJtaXNzaW9uIGFjdGlvbiB0eXBlczogcmVhZCBhbmQgd3JpdGUuIFBvc3NpYmxlCisgKiBhY3Rpb25zIGFyZSAicmVhZCIsICJ3cml0ZSIsIG9yICJyZWFkLHdyaXRlIi8id3JpdGUscmVhZCIuCisgKiAgCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnR5UGVybWlzc2lvbiBleHRlbmRzIEJhc2ljUGVybWlzc2lvbiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODg1NDM4ODI1Mzk5OTQyODUxTDsKQEAgLTM5LDEwICs1MSwxMiBAQAogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0aGUgKHBvc3NpYmx5IHdpbGRjYXJkZWQpIG5hbWUgb2YgdGhlCi0gICAgICogICAgICAgICAgICBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgIHRoZSAocG9zc2libHkgd2lsZGNhcmRlZCkgbmFtZSBvZiB0aGUgcHJvcGVydHkuCiAgICAgICogQHBhcmFtIGFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIGFjdGlvbnMgd2hpY2ggYXJlIGFwcGxpY2FibGUgdG8gaXQuCisgICAgICogICAgICAgICAgICB0aGUgYWN0aW9ucyB3aGljaCBhcmUgYXBwbGljYWJsZSB0byBpdC4gUG9zc2libGUgYWN0aW9ucyBhcmUKKyAgICAgKiAgICAgICAgICAgICJyZWFkIiwgIndyaXRlIiwgb3IgInJlYWQsd3JpdGUiLyJ3cml0ZSxyZWFkIi4gQW55dGhpbmcgZWxzZQorICAgICAqICAgICAgICAgICAgd2lsbCByZXN1bHQgaW4gYW4ge0Bjb2RlIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb3BlcnR5UGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKICAgICAgICAgc3VwZXIobmFtZSk7CkBAIC03MCwxNCArODQsMTcgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgcmVwcmVzZW50CiAgICAgICogdGhlIDxlbT5zYW1lPC9lbT4gb2JqZWN0IHVzaW5nIGEgY2xhc3Mgc3BlY2lmaWMgY29tcGFyaXNvbi4gSW4gdGhpcwotICAgICAqIGNhc2UsIHRoZSByZWNlaXZlciBtdXN0IGJlIGZvciB0aGUgc2FtZSBwcm9wZXJ0eSBhcyB0aGUgYXJndW1lbnQsIGFuZAotICAgICAqIG11c3QgaGF2ZSB0aGUgc2FtZSBhY3Rpb25zLgorICAgICAqIGNhc2UsIHRoZSByZWNlaXZlciBtdXN0IGJlIGEge0Bjb2RlIFByb3BlcnR5UGVybWlzc2lvbn0gZm9yIHRoZSBzYW1lIAorICAgICAqIHByb3BlcnR5IGFzIHRoZSBhcmd1bWVudCwgYW5kIG11c3QgaGF2ZSB0aGUgc2FtZSBhY3Rpb25zLgorICAgICAqIElmIHtAY29kZSBvfSBpcyBhIHBlcm1pc3Npb24gdGhhdCBpcyBub3QgYSB7QGNvZGUgUHJvcGVydHlQZXJtaXNzaW9ufSwKKyAgICAgKiB0aGlzIG1ldGhvZCBtYXkgdGhyb3cgYSB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufS4gICAgIAogICAgICAqIAogICAgICAqIEBwYXJhbSBvCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE9iamVjdH0gdG8gY29tcGFyZSB3aXRoIHRoaXMge0Bjb2RlIE9iamVjdH0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBPYmplY3R9IGlzIHRoZSBzYW1lIGFzIHRoaXMge0Bjb2RlIE9iamVjdH0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMge0Bjb2RlIE9iamVjdH0uCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKQEAgLTkyLDcgKzEwOSw4IEBACiAgICAgICogUmV0dXJucyB0aGUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLiBUaGUgcmVzdWx0IHdpbGwgYmUKICAgICAgKiBlaXRoZXIgInJlYWQiLCAid3JpdGUiLCBvciAicmVhZCx3cml0ZSIuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25zKCkgewpAQCAtMTAxLDEyICsxMTksMTIgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byBvYmplY3RzIHdoaWNoCi0gICAgICogYW5zd2VyIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHBhc3NlZCB0byB7QGNvZGUgZXF1YWxzfSBtdXN0IHJldHVybiB0aGUgc2FtZQorICAgICAqIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2guCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTExNiwxMCArMTM0LDExIEBACiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGUgcmVjZWl2ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQKLSAgICAgKiAgICAgICAgIGJ5IHRoZSByZWNlaXZlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QuCisgICAgICogQHJldHVybiBib29sZWFuIHtAY29kZSB0cnVlfSBpZiB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIsIGFuZCB7QGNvZGUgZmFsc2V9IGlmIGl0IGlzIG5vdC4KICAgICAgKiBAcGFyYW0gcGVybWlzc2lvbgotICAgICAqICAgICAgICAgICAgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBjaGVjay4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewpAQCAtMTMxLDEyICsxNTAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciBob2xkaW5nIHBlcm1pc3Npb25zIG9mIHRoaXMgY2xhc3MuCi0gICAgICogQW5zd2VyIG51bGwgaWYgYW55IHBlcm1pc3Npb24gY29sbGVjdGlvbiBjYW4gYmUgdXNlZC4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gZm9yIGhvbGRpbmcgcGVybWlzc2lvbnMgb2YgdGhpcyBjbGFzcy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSBudWxsfSBpZiBhbnkge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSBjYW4gYmUgdXNlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uIG9yIG51bGwKLSAgICAgKiAKLSAgICAgKiBzZWUgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uCisgICAgICogQHJldHVybiBhIG5ldyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Byb3BlcnR5UGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydHlQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCmluZGV4IGEwZThlYjUuLjQ1ZTg5ZDkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydHlQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydHlQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCkBAIC0yNSw3ICsyNSw5IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKIAogLyoqCi0gKiBBIFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciBob2xkaW5nIFByb3BlcnR5UGVybWlzc2lvbnMuCisgKiBBIHtAY29kZSBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gZm9yIGhvbGRpbmcge0Bjb2RlIFByb3BlcnR5UGVybWlzc2lvbn1zLgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIGNsYXNzIFByb3BlcnR5UGVybWlzc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBQZXJtaXNzaW9uQ29sbGVjdGlvbiB7CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJvcGVydHlSZXNvdXJjZUJ1bmRsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Qcm9wZXJ0eVJlc291cmNlQnVuZGxlLmphdmEKaW5kZXggNTg4NDRiYy4uYWNjMzI2MyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Qcm9wZXJ0eVJlc291cmNlQnVuZGxlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Qcm9wZXJ0eVJlc291cmNlQnVuZGxlLmphdmEKQEAgLTIyLDI0ICsyMiwyNyBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKIC8qKgotICogUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBsb2FkcyByZXNvdXJjZXMgZnJvbSBhbiBJbnB1dFN0cmVhbS4gQWxsIHJlc291cmNlcyBhcmUKLSAqIFN0cmluZ3MuIFRoZSByZXNvdXJjZXMgbXVzdCBiZSBvZiB0aGUgZm9ybSA8Y29kZT5rZXk9dmFsdWU8L2NvZGU+LCBvbmUKLSAqIHJlc291cmNlIHBlciBsaW5lLgorICoge0Bjb2RlIFByb3BlcnR5UmVzb3VyY2VCdW5kbGV9IGxvYWRzIHJlc291cmNlcyBmcm9tIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0uIEFsbCByZXNvdXJjZXMgYXJlCisgKiBTdHJpbmdzLiBUaGUgcmVzb3VyY2VzIG11c3QgYmUgb2YgdGhlIGZvcm0ge0Bjb2RlIGtleT12YWx1ZX0sIG9uZQorICogcmVzb3VyY2UgcGVyIGxpbmUgKHNlZSBQcm9wZXJ0aWVzKS4KICAqIAogICogQHNlZSBSZXNvdXJjZUJ1bmRsZQogICogQHNlZSBQcm9wZXJ0aWVzCi0gKiBAc2luY2UgMS4xCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFByb3BlcnR5UmVzb3VyY2VCdW5kbGUgZXh0ZW5kcyBSZXNvdXJjZUJ1bmRsZSB7CiAgICAgUHJvcGVydGllcyByZXNvdXJjZXM7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIFByb3BlcnR5UmVzb3VyY2VCdW5kbGUgYW5kIGxvYWRzIHRoZQotICAgICAqIHByb3BlcnRpZXMgZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFByb3BlcnR5UmVzb3VyY2VCdW5kbGV9IGFuZCBsb2FkcyB0aGUKKyAgICAgKiBwcm9wZXJ0aWVzIGZpbGUgZnJvbSB0aGUgc3BlY2lmaWVkIHtAY29kZSBJbnB1dFN0cmVhbX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIElucHV0U3RyZWFtfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBhIHJlYWQgb3BlcmF0aW9uIG9uIHRoZQorICAgICAqICAgICAgICAgICAgIHtAY29kZSBJbnB1dFN0cmVhbX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXNvdXJjZXMgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtNTEsMTIgKzU0LDYgQEAKICAgICAgICAgcmV0dXJuIChFbnVtZXJhdGlvbjxTdHJpbmc+KXJlc291cmNlcy5wcm9wZXJ0eU5hbWVzKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcwotICAgICAqIFByb3BlcnR5UmVzb3VyY2VCdW5kbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBFbnVtZXJhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbmFtZXMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRLZXlzKCkgewogICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKQEAgLTEwNSwxNCArMTAyLDYgQEAKICAgICAgICAgfTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCByZXNvdXJjZSBmcm9tIHRoaXMgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSwgb3IgbnVsbCBpZgotICAgICAqIHRoZSByZXNvdXJjZSBpcyBub3QgZm91bmQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2Ugb2JqZWN0Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBoYW5kbGVHZXRPYmplY3QoU3RyaW5nIGtleSkgewogICAgICAgICByZXR1cm4gcmVzb3VyY2VzLmdldChrZXkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9RdWV1ZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9RdWV1ZS5qYXZhCmluZGV4IDE4ZmQwNTguLjUwMzVjZTcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUXVldWUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1F1ZXVlLmphdmEKQEAgLTE3LDcyICsxNyw4NCBAQAogcGFja2FnZSBqYXZhLnV0aWw7CiAKIC8qKgotICogQSBraW5kIG9mIGNvbGxlY3Rpb24gcHJvdmlkZXMgYWR2YW5jZWQgb3BlcmF0aW9ucyB0aGFuIG90aGVyIGJhc2ljCisgKiBUaGlzIGtpbmQgb2YgY29sbGVjdGlvbiBwcm92aWRlcyBhZHZhbmNlZCBvcGVyYXRpb25zIGNvbXBhcmVkIHRvIGJhc2ljCiAgKiBjb2xsZWN0aW9ucywgc3VjaCBhcyBpbnNlcnRpb24sIGV4dHJhY3Rpb24sIGFuZCBpbnNwZWN0aW9uLgorICogPHA+CisgKiBHZW5lcmFsbHksIGEgcXVldWUgb3JkZXJzIGl0cyBlbGVtZW50cyBieSBtZWFucyBvZiBmaXJzdC1pbi1maXJzdC1vdXQuCisgKiBIb3dldmVyLCBhIHByaW9yaXR5IHF1ZXVlIG9yZGVycyBpdHMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIGEgY29tcGFyYXRvcgorICogc3BlY2lmaWVkIG9yIHRoZSBlbGVtZW50cycgbmF0dXJhbCBvcmRlci4gRnVydGhlcm1vcmUsIGEgc3RhY2sgb3JkZXJzIGl0cworICogZWxlbWVudHMgbGFzdC1pbi1maXJzdCBvdXQuCisgKiA8L3A+CisgKiA8cD4KKyAqIEEgdHlwaWNhbCBxdWV1ZSBkb2VzIG5vdCBhbGxvdyB7QGNvZGUgbnVsbH0gdG8gYmUgaW5zZXJ0ZWQgYXMgaXRzIGVsZW1lbnQsCisgKiB3aGlsZSBzb21lIGltcGxlbWVudGF0aW9ucyBzdWNoIGFzIHtAY29kZSBMaW5rZWRMaXN0fSBhbGxvdyBpdC4gQnV0IHtAY29kZQorICogbnVsbH0gc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCBldmVuIGluIHRoZXNlIGltcGxlbWVudGF0aW9ucywgc2luY2UgdGhlIG1ldGhvZAorICoge0Bjb2RlIHBvbGx9IHJldHVybnMge0Bjb2RlIG51bGx9IHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gZWxlbWVudCBsZWZ0CisgKiBpbiB0aGUgcXVldWUuCisgKiA8L3A+CisgKiA8cD4KKyAqIHtAY29kZSBRdWV1ZX0gZG9lcyBub3QgcHJvdmlkZSBibG9ja2luZyBxdWV1ZSBtZXRob2RzLCB3aGljaCB3b3VsZCBibG9jaworICogdW50aWwgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbWV0aG9kIGlzIGFsbG93ZWQuIFNlZSB0aGUKKyAqIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlfSBpbnRlcmZhY2UgZm9yIGluZm9ybWF0aW9uIGFib3V0CisgKiBibG9ja2luZyBxdWV1ZSBtZXRob2RzLgorICogPC9wPgogICogCi0gKiBHZW5lcmFsbHksIGEgcXVldWUgb3JkZXJzIGl0cyBlbGVtZW50cyBieSBtZWFucyBvZiBmaXJzdC1pbi1maXJzdC1vdXQuIFdoaWxlCi0gKiBwcmlvcml0eSBxdWV1ZSBvcmRlcnMgaXRzIGVsZW1lbnRzIGFjY29yZGluZyB0byBhIGNvbXBhcmF0b3Igc3BlY2lmaWVkIG9yIHRoZQotICogZWxlbWVudHMnIG5hdHVyYWwgb3JkZXIuIEZ1cnRoZXJtb3JlLCBhIHN0YWNrIG9yZGVycyBpdHMgZWxlbWVudHMKLSAqIGxhc3QtaW4tZmlyc3Qgb3V0LgotICogCi0gKiBBIHR5cGljYWwgcXVldWUgZG9lcyBub3QgYWxsb3cgbnVsbCB0byBiZSBpbnNlcnRlZCBhcyBpdHMgZWxlbWVudCwgd2hpbGUgc29tZQotICogaW1wbGVtZW50YXRpb25zIHN1Y2ggYXMgTGlua2VkTGlzdCBhbGxvdyBpdC4gQnV0IG51bGwgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZAotICogZXZlbiBpbiB0aGVzZSBpbXBsZW1lbnRhdGlvbnMsIHNpbmNlIG1ldGhvZCBwb2xsIHJldHVybiBudWxsIHRvIGluZGljYXRlIHRoYXQKLSAqIHRoZXJlIGlzIG5vIGVsZW1lbnQgbGVmdCBpbiB0aGUgcXVldWUuCi0gKiAKLSAqIFF1ZXVlIGRvZXMgbm90IHByb3ZpZGUgYmxvY2tpbmcgcXVldWUgbWV0aG9kcywgd2hpY2ggd2lsbCBibG9jayB1bnRpbCB0aGUKLSAqIG9wZXJhdGlvbiBvZiB0aGUgbWV0aG9kIGlzIGFsbG93ZWQuIEJsb2NraW5nUXVldWUgaW50ZXJmYWNlIGRlZmluZXMgc3VjaAotICogbWV0aG9kcy4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFF1ZXVlPEU+IGV4dGVuZHMgQ29sbGVjdGlvbjxFPiB7CiAKICAgICAvKioKICAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoZSBxdWV1ZSBwcm92aWRlZCB0aGF0IHRoZSBjb25kaXRpb24KLSAgICAgKiBhbGxvd3Mgc3VjaCBhbiBvcGVyYXRpb24uIFRoZSBtZXRob2QgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdGhlCi0gICAgICogY29sbGVjdGlvbi5hZGQoRSksIHNpbmNlIHRoZSBsYXR0ZXIgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAgICAqIGFsbG93cyBzdWNoIGFuIG9wZXJhdGlvbi4gVGhlIG1ldGhvZCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0bworICAgICAqIHtAbGluayBDb2xsZWN0aW9uI2FkZH0sIHNpbmNlIHRoZSBsYXR0ZXIgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZQogICAgICAqIG9wZXJhdGlvbiBmYWlscy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbwogICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIGluc2VydCBpbnRvIHRoZSBxdWV1ZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBhbmQgZmFsc2UgaWYgaXQgZmFpbHMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBhbmQge0Bjb2RlIGZhbHNlfSBpZiBpdAorICAgICAqICAgICAgICAgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoRSBvKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYW5kIHJlbW92ZXMgdGhlIGVsZW1lbnQgaW4gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLCBvciByZXR1cm5zIG51bGwgaWYKLSAgICAgKiB0aGVyZSBpcyBubyBlbGVtZW50IGluIHRoZSBxdWV1ZS4KKyAgICAgKiBHZXRzIGFuZCByZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSwgb3IgcmV0dXJucyB7QGNvZGUKKyAgICAgKiBudWxsfSBpZiB0aGVyZSBpcyBubyBlbGVtZW50IGluIHRoZSBxdWV1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGluIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vCi0gICAgICogICAgICAgICBlbGVtZW50IGluIHRoZSBxdWV1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgaXMKKyAgICAgKiAgICAgICAgIG5vIGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIHBvbGwoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYW5kIHJlbW92ZXMgdGhlIGVsZW1lbnQgaW4gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLiBUaHJvd3MgYQorICAgICAqIEdldHMgYW5kIHJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLiBUaHJvd3MgYQogICAgICAqIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBpbiB0aGUgcXVldWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBpbiB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCiAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBpbiB0aGUgcXVldWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEUgcmVtb3ZlKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGJ1dCBub3QgcmVtb3ZlcyB0aGUgZWxlbWVudCBpbiB0aGUgaGVhZCBvZiB0aGUgcXVldWUsIG9yIHRocm93cwotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBlbGVtZW50IGluIHRoZSBxdWV1ZS4KKyAgICAgKiBHZXRzIGJ1dCBkb2VzIG5vdCByZW1vdmUgdGhlIGVsZW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgaW4gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLSAgICAgKiAgICAgICAgIGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcworICAgICAqICAgICAgICAgbm8gZWxlbWVudCBpbiB0aGUgcXVldWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEUgcGVlaygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBidXQgbm90IHJlbW92ZXMgdGhlIGVsZW1lbnQgaW4gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLiBUaHJvd3MgYQotICAgICAqIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBpbiB0aGUgcXVldWUuCisgICAgICogR2V0cyBidXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4gVGhyb3dzIGEKKyAgICAgKiB7QGNvZGUgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbn0gaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBpbiB0aGUgcXVldWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBpbiB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCiAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBpbiB0aGUgcXVldWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEUgZWxlbWVudCgpOwogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1JhbmRvbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9SYW5kb20uamF2YQppbmRleCAyOTMzZmVjLi5mOTJjM2VlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1JhbmRvbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUmFuZG9tLmphdmEKQEAgLTIyLDEwICsyMiwxMSBAQAogCiAvKioKICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IGdlbmVyYXRlcyBwc2V1ZG8tcmFuZG9tIG51bWJlcnMgb2YgZGlmZmVyZW50Ci0gKiB0eXBlcywgc3VjaCBhcyBpbnQsIGxvbmcsIGRvdWJsZSBhbmQgZmxvYXQgdXNpbmcgZWl0aGVyCisgKiB0eXBlcywgc3VjaCBhcyB7QGNvZGUgaW50fSwge0Bjb2RlIGxvbmd9LCB7QGNvZGUgZG91YmxlfSwgYW5kIHtAY29kZSBmbG9hdH0uCiAgKiAKICAqIEBzZWUgUHJvcGVydGllcwogICogQHNlZSBQcm9wZXJ0eVJlc291cmNlQnVuZGxlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJhbmRvbSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAgICAgCkBAIC00MSw3ICs0Miw5IEBACiAgICAgYm9vbGVhbiBoYXZlTmV4dE5leHRHYXVzc2lhbiA9IGZhbHNlOwogCiAgICAgLyoqCi0gICAgICogQHNlcmlhbCBJdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVybmFsIHN0YXRlIG9mIHRoaXMgZ2VuZXJhdG9yLgorICAgICAqIEl0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBnZW5lcmF0b3IuCisgICAgICogICAgICAKKyAgICAgKiBAc2VyaWFsCiAgICAgICovCiAgICAgbG9uZyBzZWVkOwogCkBAIC01NywzNSArNjAsMzYgQEAKICAgICAgKiBhcyB0aGUgaW5pdGlhbCBzdGF0ZS4KICAgICAgKiAKICAgICAgKiBAc2VlICNzZXRTZWVkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJhbmRvbSgpIHsKICAgICAgICAgc2V0U2VlZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgcmFuZG9tIGdlbmVyYXRvciB3aXRoIHRoZSBnaXZlbiA8Y29kZT5zZWVkPC9jb2RlPiBhcyB0aGUKKyAgICAgKiBDb25zdHJ1Y3QgYSByYW5kb20gZ2VuZXJhdG9yIHdpdGggdGhlIGdpdmVuIHtAY29kZSBzZWVkfSBhcyB0aGUKICAgICAgKiBpbml0aWFsIHN0YXRlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZWVkCiAgICAgICogICAgICAgICAgICB0aGUgc2VlZCB0aGF0IHdpbGwgZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoaXMgcmFuZG9tCi0gICAgICogICAgICAgICAgICBudW1iZXIgZ2VuZXJhdG9yCi0gICAgICogCisgICAgICogICAgICAgICAgICBudW1iZXIgZ2VuZXJhdG9yLgogICAgICAqIEBzZWUgI3NldFNlZWQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmFuZG9tKGxvbmcgc2VlZCkgewogICAgICAgICBzZXRTZWVkKHNlZWQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwc2V1ZG8tcmFuZG9tIHVuaWZvcm1seSBkaXN0cmlidXRlZCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG9mCi0gICAgICogdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgPGNvZGU+Yml0czwvY29kZT4gYXMKKyAgICAgKiBSZXR1cm5zIGEgcHNldWRvLXJhbmRvbSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQge0Bjb2RlIGludH0gdmFsdWUgb2YKKyAgICAgKiB0aGUgbnVtYmVyIG9mIGJpdHMgc3BlY2lmaWVkIGJ5IHRoZSBhcmd1bWVudCB7QGNvZGUgYml0c30gYXMKICAgICAgKiBkZXNjcmliZWQgYnkgRG9uYWxkIEUuIEtudXRoIGluIDxpPlRoZSBBcnQgb2YgQ29tcHV0ZXIgUHJvZ3JhbW1pbmcsCiAgICAgICogVm9sdW1lIDI6IFNlbWludW1lcmljYWwgQWxnb3JpdGhtczwvaT4sIHNlY3Rpb24gMy4yLjEuCiAgICAgICogCi0gICAgICogQHJldHVybiBpbnQgYSBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRlZCBpbnQgbnVtYmVyCiAgICAgICogQHBhcmFtIGJpdHMKLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIG9mIHRoZSByZXR1cm5lZCB2YWx1ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRlZCBpbnQgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqIEBzZWUgI25leHRCeXRlcwogICAgICAqIEBzZWUgI25leHREb3VibGUKICAgICAgKiBAc2VlICNuZXh0RmxvYXQKQEAgLTkzLDYgKzk3LDcgQEAKICAgICAgKiBAc2VlICNuZXh0SW50KGludCkKICAgICAgKiBAc2VlICNuZXh0R2F1c3NpYW4KICAgICAgKiBAc2VlICNuZXh0TG9uZworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IG5leHQoaW50IGJpdHMpIHsKICAgICAgICAgc2VlZCA9IChzZWVkICogbXVsdGlwbGllciArIDB4YkwpICYgKCgxTCA8PCA0OCkgLSAxKTsKQEAgLTEwMCwyMyArMTA1LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBwc2V1ZG8tcmFuZG9tLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYm9vbGVhbiB2YWx1ZQorICAgICAqIFJldHVybnMgdGhlIG5leHQgcHNldWRvLXJhbmRvbSwgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHtAY29kZSBib29sZWFufSB2YWx1ZQogICAgICAqIGdlbmVyYXRlZCBieSB0aGlzIGdlbmVyYXRvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gYSBwc2V1ZG8tcmFuZG9tLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYm9vbGVhbiB2YWx1ZQorICAgICAqIEByZXR1cm4gYSBwc2V1ZG8tcmFuZG9tLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBuZXh0Qm9vbGVhbigpIHsKICAgICAgICAgcmV0dXJuIG5leHQoMSkgIT0gMDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNb2RpZmllcyB0aGUgYnl0ZSBhcnJheSBieSBhIHJhbmRvbSBzZXF1ZW5jZSBvZiBieXRlcyBnZW5lcmF0ZWQgYnkgdGhpcworICAgICAqIE1vZGlmaWVzIHRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgYnkgYSByYW5kb20gc2VxdWVuY2Ugb2Yge0Bjb2RlIGJ5dGV9cyBnZW5lcmF0ZWQgYnkgdGhpcwogICAgICAqIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIG5vbi1udWxsIGFycmF5IHRvIGNvbnRhaW4gdGhlIG5ldyByYW5kb20gYnl0ZXMKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIG5vbi1udWxsIGFycmF5IHRvIGNvbnRhaW4gdGhlIG5ldyByYW5kb20ge0Bjb2RlIGJ5dGV9cy4KICAgICAgKiBAc2VlICNuZXh0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbmV4dEJ5dGVzKGJ5dGVbXSBidWYpIHsKICAgICAgICAgaW50IHJhbmQgPSAwLCBjb3VudCA9IDAsIGxvb3AgPSAwOwpAQCAtMTMzLDQwICsxMzksNDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBub3JtYWxseSBkaXN0cmlidXRlZCByYW5kb20gZG91YmxlIG51bWJlciBiZXR3ZWVuIDAuMAorICAgICAqIEdlbmVyYXRlcyBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJhbmRvbSB7QGNvZGUgZG91YmxlfSBudW1iZXIgYmV0d2VlbiAwLjAKICAgICAgKiBpbmNsdXNpdmVseSBhbmQgMS4wIGV4Y2x1c2l2ZWx5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gZG91YmxlCi0gICAgICogCisgICAgICogQHJldHVybiBhIHJhbmRvbSB7QGNvZGUgZG91YmxlfSBpbiB0aGUgcmFuZ2UgWzAuMCAtIDEuMCkKICAgICAgKiBAc2VlICNuZXh0RmxvYXQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIG5leHREb3VibGUoKSB7CiAgICAgICAgIHJldHVybiAoKCgobG9uZykgbmV4dCgyNikgPDwgMjcpICsgbmV4dCgyNykpIC8gKGRvdWJsZSkgKDFMIDw8IDUzKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIGZsb2F0IG51bWJlciBiZXR3ZWVuIDAuMAorICAgICAqIEdlbmVyYXRlcyBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJhbmRvbSB7QGNvZGUgZmxvYXR9IG51bWJlciBiZXR3ZWVuIDAuMAogICAgICAqIGluY2x1c2l2ZWx5IGFuZCAxLjAgZXhjbHVzaXZlbHkuCiAgICAgICogCi0gICAgICogQHJldHVybiBmbG9hdCBhIHJhbmRvbSBmbG9hdCBudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDEuMAotICAgICAqIAorICAgICAqIEByZXR1cm4gZmxvYXQgYSByYW5kb20ge0Bjb2RlIGZsb2F0fSBudW1iZXIgYmV0d2VlbiBbMC4wIGFuZCAxLjApCiAgICAgICogQHNlZSAjbmV4dERvdWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBuZXh0RmxvYXQoKSB7CiAgICAgICAgIHJldHVybiAobmV4dCgyNCkgLyAxNjc3NzIxNmYpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHBzZXVkby1yYW5kb21seSBnZW5lcmF0ZXMgKGFwcHJveGltYXRlbHkpIGEgbm9ybWFsbHkgZGlzdHJpYnV0ZWQKLSAgICAgKiA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIHdpdGggbWVhbiAwLjAgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIHZhbHVlCi0gICAgICogb2YgPGNvZGU+MS4wPC9jb2RlPiB1c2luZyB0aGUgPGk+cG9sYXIgbWV0aG9kPGk+IG9mIEcuIEUuIFAuIEJveCwgTS4KKyAgICAgKiBQc2V1ZG8tcmFuZG9tbHkgZ2VuZXJhdGVzIChhcHByb3hpbWF0ZWx5KSBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkCisgICAgICoge0Bjb2RlIGRvdWJsZX0gdmFsdWUgd2l0aCBtZWFuIDAuMCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gdmFsdWUKKyAgICAgKiBvZiB7QGNvZGUgMS4wfSB1c2luZyB0aGUgPGk+cG9sYXIgbWV0aG9kPGk+IG9mIEcuIEUuIFAuIEJveCwgTS4KICAgICAgKiBFLiBNdWxsZXIsIGFuZCBHLiBNYXJzYWdsaWEsIGFzIGRlc2NyaWJlZCBieSBEb25hbGQgRS4gS251dGggaW4gPGk+VGhlCiAgICAgICogQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nLCBWb2x1bWUgMjogU2VtaW51bWVyaWNhbCBBbGdvcml0aG1zPC9pPiwKLSAgICAgKiBzZWN0aW9uIDMuNC4xLCBzdWJzZWN0aW9uIEMsIGFsZ29yaXRobSBQCisgICAgICogc2VjdGlvbiAzLjQuMSwgc3Vic2VjdGlvbiBDLCBhbGdvcml0aG0gUC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGRvdWJsZQotICAgICAqIAorICAgICAqIEByZXR1cm4gYSByYW5kb20ge0Bjb2RlIGRvdWJsZX0KICAgICAgKiBAc2VlICNuZXh0RG91YmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBkb3VibGUgbmV4dEdhdXNzaWFuKCkgewogICAgICAgICBpZiAoaGF2ZU5leHROZXh0R2F1c3NpYW4pIHsgLy8gaWYgWDEgaGFzIGJlZW4gcmV0dXJuZWQsIHJldHVybiB0aGUKQEAgLTE5MSwyOCArMTk3LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIDMyLWJpdCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGZyb20KLSAgICAgKiB0aGUgdGhpcyByYW5kb20gbnVtYmVyIHNlcXVlbmNlLgorICAgICAqIEdlbmVyYXRlcyBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCAzMi1iaXQge0Bjb2RlIGludH0gdmFsdWUgZnJvbQorICAgICAqIHRoZSByYW5kb20gbnVtYmVyIHNlcXVlbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHVuaWZvcm1seSBkaXN0cmlidXRlZCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAgICogCisgICAgICogQHJldHVybiBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCB7QGNvZGUgaW50fSB2YWx1ZS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5JbnRlZ2VyI01BWF9WQUxVRQogICAgICAqIEBzZWUgamF2YS5sYW5nLkludGVnZXIjTUlOX1ZBTFVFCiAgICAgICogQHNlZSAjbmV4dAogICAgICAqIEBzZWUgI25leHRMb25nCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0SW50KCkgewogICAgICAgICByZXR1cm4gbmV4dCgzMik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0byB0aGUgY2FsbGVyIGEgbmV3IHBzZXVkby1yYW5kb20gaW50ZWdlciB2YWx1ZSB3aGljaCBpcyB1bmlmb3JtbHkKLSAgICAgKiBkaXN0cmlidXRlZCBiZXR3ZWVuIDAgKGluY2x1c2l2ZWx5KSBhbmQgdGhlIHZhbHVlIG9mIDxjb2RlPm48L2NvZGU+Ci0gICAgICogKGV4Y2x1c2l2ZWx5KS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHBzZXVkby1yYW5kb20ge0Bjb2RlIGludH0gdmFsdWUgd2hpY2ggaXMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkCisgICAgICogYmV0d2VlbiAwIChpbmNsdXNpdmVseSkgYW5kIHRoZSB2YWx1ZSBvZiB7QGNvZGUgbn0gKGV4Y2x1c2l2ZWx5KS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludAogICAgICAqIEBwYXJhbSBuCi0gICAgICogICAgICAgICAgICBpbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNsdXNpdmUgdXBwZXIgYm9yZGVyIG9mIHRoZSByYW5nZSBbMCAtIG4pLgorICAgICAqIEByZXR1cm4gYSByYW5kb20ge0Bjb2RlIGludH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0SW50KGludCBuKSB7CiAgICAgICAgIGlmIChuID4gMCkgewpAQCAtMjMwLDMxICsyMzYsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgNjQtYml0IDxjb2RlPmludDwvY29kZT4gdmFsdWUgZnJvbQotICAgICAqIHRoZSB0aGlzIHJhbmRvbSBudW1iZXIgc2VxdWVuY2UuCisgICAgICogR2VuZXJhdGVzIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20KKyAgICAgKiB0aGUgcmFuZG9tIG51bWJlciBzZXF1ZW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDY0LWJpdCA8Y29kZT5pbnQ8L2NvZGU+IHJhbmRvbSBudW1iZXIKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIDY0LWJpdCByYW5kb20gaW50ZWdlci4KICAgICAgKiBAc2VlIGphdmEubGFuZy5JbnRlZ2VyI01BWF9WQUxVRQogICAgICAqIEBzZWUgamF2YS5sYW5nLkludGVnZXIjTUlOX1ZBTFVFCiAgICAgICogQHNlZSAjbmV4dAogICAgICAqIEBzZWUgI25leHRJbnQoKQogICAgICAqIEBzZWUgI25leHRJbnQoaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIG5leHRMb25nKCkgewogICAgICAgICByZXR1cm4gKChsb25nKSBuZXh0KDMyKSA8PCAzMikgKyBuZXh0KDMyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNb2RpZmllcyB0aGUgc2VlZCB1c2luZyBsaW5lYXIgY29uZ3J1ZW50aWFsIGZvcm11bGEgcHJlc2VudGVkIGluIDxpPlRoZQorICAgICAqIE1vZGlmaWVzIHRoZSBzZWVkIGEgdXNpbmcgbGluZWFyIGNvbmdydWVudGlhbCBmb3JtdWxhIHByZXNlbnRlZCBpbiA8aT5UaGUKICAgICAgKiBBcnQgb2YgQ29tcHV0ZXIgUHJvZ3JhbW1pbmcsIFZvbHVtZSAyPC9pPiwgU2VjdGlvbiAzLjIuMS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2VlZAotICAgICAqICAgICAgICAgICAgdGhlIHNlZWQgdGhhdCBhbHRlcnMgdGhlIHN0YXRlIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHNlZWQgdGhhdCBhbHRlcnMgdGhlIHN0YXRlIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KICAgICAgKiBAc2VlICNuZXh0CiAgICAgICogQHNlZSAjUmFuZG9tKCkKICAgICAgKiBAc2VlICNSYW5kb20obG9uZykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2VlZChsb25nIHNlZWQpIHsKICAgICAgICAgdGhpcy5zZWVkID0gKHNlZWQgXiBtdWx0aXBsaWVyKSAmICgoMUwgPDwgNDgpIC0gMSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1JhbmRvbUFjY2Vzcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9SYW5kb21BY2Nlc3MuamF2YQppbmRleCBjMGNhYTc5Li5hOGE5MGRlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1JhbmRvbUFjY2Vzcy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUmFuZG9tQWNjZXNzLmphdmEKQEAgLTE5LDggKzE5LDEwIEBACiAKIAogLyoqCi0gKiBSYW5kb21BY2Nlc3MgaXMgaW1wbGVtZW50ZWQgYnkgPGNvZGU+TGlzdDwvY29kZT4gaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydAotICogZmFzdCAodXN1YWxseSBjb25zdGFudCB0aW1lKSByYW5kb20gYWNjZXNzLgorICogUmFuZG9tQWNjZXNzIGlzIGltcGxlbWVudGVkIGJ5IHtAY29kZSBMaXN0fSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IGZhc3QKKyAqICh1c3VhbGx5IGNvbnN0YW50IHRpbWUpIHJhbmRvbSBhY2Nlc3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJhbmRvbUFjY2VzcyB7CiAgICAgLyplbXB0eSovCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Jlc291cmNlQnVuZGxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Jlc291cmNlQnVuZGxlLmphdmEKaW5kZXggMGE2OTNkMi4uMTE4NzM1OCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUmVzb3VyY2VCdW5kbGUuamF2YQpAQCAtMjIsMjggKzIyLDY5IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uVk07Ci0KLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorLy8gaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uVk07CiBpbXBvcnQgY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1TdGFjazsKLS8vIEVORCBhbmRyb2lkLWFkZGVkCisvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKIC8qKgotICogUmVzb3VyY2VCdW5kbGUgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggaXMgdGhlIHN1cGVyY2xhc3Mgb2YgY2xhc3NlcyB3aGljaAotICogcHJvdmlkZSBsb2NhbGUgc3BlY2lmaWMgcmVzb3VyY2VzLiBBIGJ1bmRsZSBjb250YWlucyBhIG51bWJlciBvZiBuYW1lZAotICogcmVzb3VyY2VzLCB3aGVyZSB0aGUgbmFtZXMgYXJlIFN0cmluZ3MuIEEgYnVuZGxlIG1heSBoYXZlIGEgcGFyZW50IGJ1bmRsZSwKLSAqIHdoZW4gYSByZXNvdXJjZSBpcyBub3QgZm91bmQgaW4gYSBidW5kbGUsIHRoZSBwYXJlbnQgYnVuZGxlIGlzIHNlYXJjaGVkIGZvcgotICogdGhlIHJlc291cmNlLgorICoge0Bjb2RlIFJlc291cmNlQnVuZGxlfSBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBpcyB0aGUgc3VwZXJjbGFzcyBvZiBjbGFzc2VzIHdoaWNoCisgKiBwcm92aWRlIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIHJlc291cmNlcy4gQSBidW5kbGUgY29udGFpbnMgYSBudW1iZXIgb2YgbmFtZWQKKyAqIHJlc291cmNlcywgd2hlcmUgdGhlIG5hbWVzIGFyZSB7QGNvZGUgU3RyaW5nc30uIEEgYnVuZGxlIG1heSBoYXZlIGEgcGFyZW50IGJ1bmRsZSwKKyAqIGFuZCB3aGVuIGEgcmVzb3VyY2UgaXMgbm90IGZvdW5kIGluIGEgYnVuZGxlLCB0aGUgcGFyZW50IGJ1bmRsZSBpcyBzZWFyY2hlZCBmb3IKKyAqIHRoZSByZXNvdXJjZS4gSWYgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbSByZWFjaGVzIHRoZSBiYXNlIGJ1bmRsZSBhbmQgc3RpbGwKKyAqIGNhbid0IGZpbmQgdGhlIHJlc291cmNlIGl0IHRocm93cyBhIHtAY29kZSBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb259LgorICogCisgKiA8dWw+CisgKiA8bGk+QWxsIGJ1bmRsZXMgZm9yIHRoZSBzYW1lIGdyb3VwIG9mIHJlc291cmNlcyBzaGFyZSBhIGNvbW1vbiBiYXNlIGJ1bmRsZS4KKyAqIFRoaXMgYmFzZSBidW5kbGUgYWN0cyBhcyB0aGUgcm9vdCBhbmQgaXMgdGhlIGxhc3QgZmFsbGJhY2sgaW4gY2FzZSBub25lIG9mCisgKiBpdHMgY2hpbGRyZW4gd2FzIGFibGUgdG8gcmVzcG9uZCB0byBhIHJlcXVlc3QuPC9saT4KKyAqIDxsaT5UaGUgZmlyc3QgbGV2ZWwgY29udGFpbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBsYW5ndWFnZXMuIE9ubHkgdGhlCisgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIGEgbGFuZ3VhZ2UgYW5kIHRoZSBsYW5ndWFnZSBvZiB0aGUgYmFzZSBidW5kbGUgbmVlZCB0byBiZQorICogaGFuZGxlZCBieSBhIGxhbmd1YWdlLXNwZWNpZmljIHtAY29kZSBSZXNvdXJjZUJ1bmRsZX0uPC9saT4KKyAqIDxsaT5UaGUgc2Vjb25kIGxldmVsIGNvbnRhaW5zIGNoYW5nZXMgYmV0d2VlbiBkaWZmZXJlbnQgY291bnRyaWVzIHRoYXQgdXNlCisgKiB0aGUgc2FtZSBsYW5ndWFnZS4gT25seSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIGNvdW50cnkgYW5kIHRoZSBjb3VudHJ5IG9mCisgKiB0aGUgbGFuZ3VhZ2UgYnVuZGxlIG5lZWQgdG8gYmUgaGFuZGxlZCBieSBhIGNvdW50cnktc3BlY2lmaWMge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KKyAqIDwvbGk+CisgKiA8bGk+VGhlIHRoaXJkIGxldmVsIGNvbnRhaW5zIGNoYW5nZXMgdGhhdCBkb24ndCBoYXZlIGEgZ2VvZ3JhcGhpYyByZWFzb24KKyAqIChlLmcuIGNoYW5nZXMgdGhhdCB3aGVyZSBtYWRlIGF0IHNvbWUgcG9pbnQgaW4gdGltZSBsaWtlIHtAY29kZSBQUkVFVVJPfSB3aGVyZSB0aGUKKyAqIGN1cnJlbmN5IG9mIGNvbWUgY291bnRyaWVzIGNoYW5nZWQuIFRoZSBjb3VudHJ5IGJ1bmRsZSB3b3VsZCByZXR1cm4gdGhlCisgKiBjdXJyZW50IGN1cnJlbmN5IChFdXJvKSBhbmQgdGhlIHtAY29kZSBQUkVFVVJPfSB2YXJpYW50IGJ1bmRsZSB3b3VsZCByZXR1cm4gdGhlIG9sZAorICogY3VycmVuY3kgKGUuZy4gRE0gZm9yIEdlcm1hbnkpLjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8c3Ryb25nPkV4YW1wbGVzPC9zdHJvbmc+CisgKiA8dWw+CisgKiA8bGk+QmFzZU5hbWUgKGJhc2UgYnVuZGxlKQorICogPGxpPkJhc2VOYW1lX2RlIChnZXJtYW4gbGFuZ3VhZ2UgYnVuZGxlKQorICogPGxpPkJhc2VOYW1lX2ZyIChmcmVuY2ggbGFuZ3VhZ2UgYnVuZGxlKQorICogPGxpPkJhc2VOYW1lX2RlX0RFIChidW5kbGUgd2l0aCBHZXJtYW55IHNwZWNpZmljIHJlc291cmNlcyBpbiBnZXJtYW4pCisgKiA8bGk+QmFzZU5hbWVfZGVfQ0ggKGJ1bmRsZSB3aXRoIFN3aXR6ZXJsYW5kIHNwZWNpZmljIHJlc291cmNlcyBpbiBnZXJtYW4pCisgKiA8bGk+QmFzZU5hbWVfZnJfQ0ggKGJ1bmRsZSB3aXRoIFN3aXR6ZXJsYW5kIHNwZWNpZmljIHJlc291cmNlcyBpbiBmcmVuY2gpCisgKiA8bGk+QmFzZU5hbWVfZGVfREVfUFJFRVVSTyAoYnVuZGxlIHdpdGggR2VybWFueSBzcGVjaWZpYyByZXNvdXJjZXMgaW4gZ2VybWFuIG9mCisgKiB0aGUgdGltZSBiZWZvcmUgdGhlIEV1cm8pCisgKiA8bGk+QmFzZU5hbWVfZnJfRlJfUFJFRVVSTyAoYnVuZGxlIHdpdGggRnJhbmNlIHNwZWNpZmljIHJlc291cmNlcyBpbiBmcmVuY2ggb2YKKyAqIHRoZSB0aW1lIGJlZm9yZSB0aGUgRXVybykKKyAqIDwvdWw+CisgKiAKKyAqIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgdmFyaWFudHMgZm9yIGxhbmd1YWdlcyBvciBjb3VudHJpZXMuIFRoaXMgY2FuIGJlCisgKiBkb25lIGJ5IGp1c3Qgc2tpcHBpbmcgdGhlIGNvdW50cnkgb3IgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uOgorICogQmFzZU5hbWVfdXNfX1BPU0lYIG9yIEJhc2VOYW1lX19ERV9QUkVFVVJPLiBCdXQgaXQncyBub3QgYWxsb3dlZCB0bworICogY2lyY3VtdmVudCBib3RoIGxhbmd1YWdlIGFuZCBjb3VudHJ5OiBCYXNlTmFtZV9fX1ZBUklBTlQgaXMgaWxsZWdhbC4KICAqIAogICogQHNlZSBQcm9wZXJ0aWVzCiAgKiBAc2VlIFByb3BlcnR5UmVzb3VyY2VCdW5kbGUKLSAqIEBzaW5jZSAxLjEKKyAqIEBzZWUgTGlzdFJlc291cmNlQnVuZGxlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc291cmNlQnVuZGxlIHsKIAogICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgb2YgdGhpcyBSZXNvdXJjZUJ1bmRsZS4KKyAgICAgKiBUaGUgcGFyZW50IG9mIHRoaXMge0Bjb2RlIFJlc291cmNlQnVuZGxlfSB0aGF0IGlzIHVzZWQgaWYgdGhpcyBidW5kbGUgZG9lc24ndAorICAgICAqIGluY2x1ZGUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcGFyZW50OwogCkBAIC02Nyw0MSArMTA4LDUwIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWFrSGFzaE1hcDxPYmplY3QsIEhhc2h0YWJsZTxTdHJpbmcsIFJlc291cmNlQnVuZGxlPj4gY2FjaGUgPSBuZXcgV2Vha0hhc2hNYXA8T2JqZWN0LCBIYXNodGFibGU8U3RyaW5nLCBSZXNvdXJjZUJ1bmRsZT4+KCk7CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOworICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc291cmNlQnVuZGxlKCkgewogICAgICAgICAvKiBlbXB0eSAqLwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBuYW1lZCByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBkZWZhdWx0IGxvY2FsZS4KKyAgICAgKiBGaW5kcyB0aGUgbmFtZWQgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfSBhbmQgdGhlIGNhbGxlcidzCisgICAgICoge0Bjb2RlIENsYXNzTG9hZGVyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVuZGxlTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQotICAgICAqIEByZXR1cm4gUmVzb3VyY2VCdW5kbGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgUmVzb3VyY2VCdW5kbGV9LgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB7QGNvZGUgUmVzb3VyY2VCdW5kbGV9LgogICAgICAqIEBleGNlcHRpb24gTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgcmVzb3VyY2UgYnVuZGxlIGNhbm5vdCBiZSBmb3VuZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgUmVzb3VyY2VCdW5kbGV9IGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgYnVuZGxlTmFtZSkKICAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QnVuZGxlSW1wbChidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBWTQotICAgICAgICAgICAgICAgIC5jYWxsZXJDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHJldHVybiBnZXRCdW5kbGVJbXBsKGJ1bmRsZU5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCksIFZNU3RhY2sKKyAgICAgICAgICAgICAgICAuZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCkpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZHMgdGhlIG5hbWVkIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGUuCisgICAgICogRmluZHMgdGhlIG5hbWVkIHtAY29kZSBSZXNvdXJjZUJ1bmRsZX0gZm9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlIExvY2FsZX0gYW5kIHRoZSBjYWxsZXIKKyAgICAgKiB7QGNvZGUgQ2xhc3NMb2FkZXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidW5kbGVOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYWxlCi0gICAgICogQHJldHVybiBSZXNvdXJjZUJ1bmRsZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2NhbGV9LgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBidW5kbGUuCiAgICAgICogQGV4Y2VwdGlvbiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSByZXNvdXJjZSBidW5kbGUgY2Fubm90IGJlIGZvdW5kCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHJlc291cmNlIGJ1bmRsZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIGJ1bmRsZU5hbWUsCiAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7CkBAIC0xMTIsNDYgKzE2Miw3NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBuYW1lZCByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgorICAgICAqIEZpbmRzIHRoZSBuYW1lZCByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlIExvY2FsZX0gYW5kIHtAY29kZSBDbGFzc0xvYWRlcn0uCisgICAgICogCisgICAgICogVGhlIHBhc3NlZCBiYXNlIG5hbWUgYW5kIHtAY29kZSBMb2NhbGV9IGFyZSB1c2VkIHRvIGNyZWF0ZSByZXNvdXJjZSBidW5kbGUgbmFtZXMuCisgICAgICogVGhlIGZpcnN0IG5hbWUgaXMgY3JlYXRlZCBieSBjb25jYXRlbmF0aW5nIHRoZSBiYXNlIG5hbWUgd2l0aCB0aGUgcmVzdWx0CisgICAgICogb2Yge0BsaW5rIExvY2FsZSN0b1N0cmluZygpfS4gRnJvbSB0aGlzIG5hbWUgYWxsIHBhcmVudCBidW5kbGUgbmFtZXMgYXJlCisgICAgICogZGVyaXZlZC4gVGhlbiB0aGUgc2FtZSB0aGluZyBpcyBkb25lIGZvciB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfS4gVGhpcyByZXN1bHRzCisgICAgICogaW4gYSBsaXN0IG9mIHBvc3NpYmxlIGJ1bmRsZSBuYW1lcy4KKyAgICAgKiAKKyAgICAgKiA8c3Ryb25nPkV4YW1wbGU8L3N0cm9uZz4gRm9yIHRoZSBiYXNlbmFtZSAiQmFzZU5hbWUiLCB0aGUge0Bjb2RlIExvY2FsZX0gb2YgdGhlCisgICAgICogR2VybWFuIHBhcnQgb2YgU3dpdHplcmxhbmQgKGRlX0NIKSBhbmQgdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0gZW5fVVMgdGhlIGxpc3QKKyAgICAgKiB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgICAgICogCisgICAgICogPG9sPgorICAgICAqIDxsaT5CYXNlTmFtZV9kZV9DSDwvbGk+CisgICAgICogPGxpPkJhc2VOYW1lX2RlPC9saT4KKyAgICAgKiA8bGk+QmFzZW5hbWVfZW5fVVM8L2xpPgorICAgICAqIDxsaT5CYXNlbmFtZV9lbjwvbGk+CisgICAgICogPGxpPkJhc2VOYW1lPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIAorICAgICAqIFRoaXMgbGlzdCBhbHNvIHNob3dzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYnVuZGxlcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBhIHJlcXVlc3RlZAorICAgICAqIHJlc291cmNlIGluIHRoZSBHZXJtYW4gcGFydCBvZiBTd2l0emVybGFuZCAoZGVfQ0gpLgorICAgICAqIAorICAgICAqIEFzIGEgZmlyc3Qgc3RlcCwgdGhpcyBtZXRob2QgdHJpZXMgdG8gaW5zdGFudGlhdGUgCisgICAgICogYSB7QGNvZGUgUmVzb3VyY2VCdW5kbGV9IHdpdGggdGhlIG5hbWVzIHByb3ZpZGVkLgorICAgICAqIElmIHN1Y2ggYSBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIGFuZCBpbml0aWFsaXplZCwgaXQgaXMgcmV0dXJuZWQgYW5kCisgICAgICogYWxsIHRoZSBwYXJlbnQgYnVuZGxlcyBhcmUgaW5zdGFudGlhdGVkIHRvby4gSWYgbm8gc3VjaCBjbGFzcyBjYW4gYmUKKyAgICAgKiBmb3VuZCB0aGlzIG1ldGhvZCB0cmllcyB0byBsb2FkIGEge0Bjb2RlIC5wcm9wZXJ0aWVzfSBmaWxlIHdpdGggdGhlIG5hbWVzIGJ5CisgICAgICogcmVwbGFjaW5nIGRvdHMgaW4gdGhlIGJhc2UgbmFtZSB3aXRoIGEgc2xhc2ggYW5kIGJ5IGFwcGVuZGluZworICAgICAqICJ7QGNvZGUgLnByb3BlcnRpZXN9IiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIElmIHN1Y2ggYSByZXNvdXJjZSBjYW4gYmUgZm91bmQKKyAgICAgKiBieSBjYWxsaW5nIHtAbGluayBDbGFzc0xvYWRlciNnZXRSZXNvdXJjZShTdHJpbmcpfSBpdCBpcyB1c2VkIHRvCisgICAgICogaW5pdGlhbGl6ZSBhIHtAbGluayBQcm9wZXJ0eVJlc291cmNlQnVuZGxlfS4gSWYgdGhpcyBzdWNjZWVkcywgaXQgd2lsbAorICAgICAqIGFsc28gbG9hZCB0aGUgcGFyZW50cyBvZiB0aGlzIHtAY29kZSBSZXNvdXJjZUJ1bmRsZX0uCisgICAgICogCisgICAgICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlLCB0aGUgYnVuZGxlIG5hbWUgaXNuJ3QgcmVxdWlyZWQgdG8gYmUKKyAgICAgKiBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiBJdCdzIGFsc28gcG9zc2libGUgdG8gZGlyZWN0bHkgcGFzcworICAgICAqIHRoZSBwYXRoIHRvIGEgcHJvcGVydGllcyBmaWxlICh3aXRob3V0IGEgZmlsZSBleHRlbnNpb24pLgogICAgICAqIAogICAgICAqIEBwYXJhbSBidW5kbGVOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIExvY2FsZX0uCiAgICAgICogQHBhcmFtIGxvYWRlcgotICAgICAqICAgICAgICAgICAgdGhlIENsYXNzTG9hZGVyIHRvIHVzZQotICAgICAqIEByZXR1cm4gUmVzb3VyY2VCdW5kbGUKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2xhc3NMb2FkZXJ9IHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KICAgICAgKiBAZXhjZXB0aW9uIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHJlc291cmNlIGJ1bmRsZSBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFJlc291cmNlQnVuZGxlfSBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIGJ1bmRsZU5hbWUsIExvY2FsZSBsb2NhbGUsCiAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewogICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChidW5kbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKLSAgICAgICAgICAgIGlmICghbG9jYWxlLmVxdWFscyhMb2NhbGUuZ2V0RGVmYXVsdCgpKSkgewotICAgICAgICAgICAgICAgIGlmICgoYnVuZGxlID0gaGFuZGxlR2V0QnVuZGxlKGJ1bmRsZU5hbWUsICJfIiArIGxvY2FsZSwgZmFsc2UsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcikpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGJ1bmRsZSA9IGhhbmRsZUdldEJ1bmRsZShidW5kbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAiXyIgKyBMb2NhbGUuZ2V0RGVmYXVsdCgpLCB0cnVlLCBsb2FkZXIpKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihudWxsLCBidW5kbGVOYW1lICsgJ18nICsgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHJldHVybiBnZXRCdW5kbGVJbXBsKGJ1bmRsZU5hbWUsIGxvY2FsZSwgbG9hZGVyKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZUltcGwoU3RyaW5nIGJ1bmRsZU5hbWUsCiAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBsb2FkZXIpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewogICAgICAgICBpZiAoYnVuZGxlTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICBpZiAoIWRlZmF1bHRMb2NhbGUuZXF1YWxzKExvY2FsZS5nZXREZWZhdWx0KCkpKSB7CisgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICBpZiAoIWxvY2FsZS5lcXVhbHMoTG9jYWxlLmdldERlZmF1bHQoKSkpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxlTmFtZSA9IGxvY2FsZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhbGVOYW1lLmxlbmd0aCgpID4gMCkgewpAQCAtMTc2LDMwICsyNTUsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGlzIFJlc291cmNlQnVuZGxlLgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uIG9mIHRoZSByZXNvdXJjZSBuYW1lcworICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIEVudW1lcmF0aW9ufSBvZiB0aGUgcmVzb3VyY2UgbmFtZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0S2V5cygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTG9jYWxlIG9mIHRoaXMgUmVzb3VyY2VCdW5kbGUuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIExvY2FsZX0gb2YgdGhpcyB7QGNvZGUgUmVzb3VyY2VCdW5kbGV9LiBJbiBjYXNlIGEgYnVuZGxlIHdhcyBub3QKKyAgICAgKiBmb3VuZCBmb3IgdGhlIHJlcXVlc3RlZCB7QGNvZGUgTG9jYWxlfSwgdGhpcyB3aWxsIHJldHVybiB0aGUgYWN0dWFsIHtAY29kZSBMb2NhbGV9IG9mCisgICAgICogdGhpcyByZXNvdXJjZSBidW5kbGUgdGhhdCB3YXMgZm91bmQgYWZ0ZXIgZG9pbmcgYSBmYWxsYmFjay4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBMb2NhbGUgb2YgdGhpcyBSZXNvdXJjZUJ1bmRsZQorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBMb2NhbGV9IG9mIHRoaXMge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKICAgICAgICAgcmV0dXJuIGxvY2FsZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCByZXNvdXJjZSBmcm9tIHRoaXMgUmVzb3VyY2VCdW5kbGUuCisgICAgICogUmV0dXJucyB0aGUgbmFtZWQgcmVzb3VyY2UgZnJvbSB0aGlzIHtAY29kZSBSZXNvdXJjZUJ1bmRsZX0uIElmIHRoZSByZXNvdXJjZQorICAgICAqIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIGJ1bmRsZSwgaXQgZmFsbHMgYmFjayB0byB0aGUgcGFyZW50IGJ1bmRsZSAoaWYKKyAgICAgKiBpdCdzIG5vdCBudWxsKSBieSBjYWxsaW5nIHRoZSB7QGxpbmsgI2hhbmRsZUdldE9iamVjdH0gbWV0aG9kLiBJZiB0aGUgcmVzb3VyY2Ugc3RpbGwKKyAgICAgKiBjYW4ndCBiZSBmb3VuZCBpdCB0aHJvd3MgYSB7QGNvZGUgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBvYmplY3QKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBvYmplY3QuCiAgICAgICogQGV4Y2VwdGlvbiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSByZXNvdXJjZSBpcyBub3QgZm91bmQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBrZXkpIHsKICAgICAgICAgUmVzb3VyY2VCdW5kbGUgbGFzdCwgdGhlUGFyZW50ID0gdGhpczsKQEAgLTIxNSwyOCArMzAxLDM0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZWQgcmVzb3VyY2UgZnJvbSB0aGlzIFJlc291cmNlQnVuZGxlLgorICAgICAqIFJldHVybnMgdGhlIG5hbWVkIHN0cmluZyByZXNvdXJjZSBmcm9tIHRoaXMge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzdHJpbmcKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzdHJpbmcuCiAgICAgICogQGV4Y2VwdGlvbiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSByZXNvdXJjZSBpcyBub3QgZm91bmQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IGZvdW5kLgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHJlc291cmNlIGZvdW5kIGlzIG5vdCBhIHN0cmluZy4KKyAgICAgKiBAc2VlICNnZXRPYmplY3QoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldE9iamVjdChrZXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVkIHJlc291cmNlIGZyb20gdGhpcyBSZXNvdXJjZUJ1bmRsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCByZXNvdXJjZSBmcm9tIHRoaXMge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzdHJpbmcgYXJyYXkKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzdHJpbmcgYXJyYXkuCiAgICAgICogQGV4Y2VwdGlvbiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSByZXNvdXJjZSBpcyBub3QgZm91bmQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IGZvdW5kLgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHJlc291cmNlIGZvdW5kIGlzIG5vdCBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzZWUgI2dldE9iamVjdChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyBrZXkpIHsKICAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgZ2V0T2JqZWN0KGtleSk7CkBAIC0yODQsMTggKzM3NiwyNSBAQAogICAgICAgICAgICAgaWYoYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5sb2NhbGUuIikpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgaWN1QnVuZGxlTmFtZSA9IGJ1bmRsZU5hbWUuc3Vic3RyaW5nKDQwKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgaWN1TG9jYWxlID0gKGxvY2FsZS5sZW5ndGgoKSA+IDAgPyBsb2NhbGUuc3Vic3RyaW5nKDEpIDogbG9jYWxlKTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IHRoYXQgUmVzb3VyY2VzIHdpbGwgZGVsaXZlciBhbiBhc3NpZ25hYmxlIGNsYXNzCiAgICAgICAgICAgICAgICAgYnVuZGxlID0gUmVzb3VyY2VzLmdldEluc3RhbmNlKGljdUJ1bmRsZU5hbWUsIGljdUxvY2FsZSk7Ci0gICAgICAgICAgICAgICAgYnVuZGxlLnNldExvY2FsZShsb2NhbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBDbGFzczw/PiBidW5kbGVDbGFzcyA9IENsYXNzLmZvck5hbWUoYnVuZGxlTmFtZSwgdHJ1ZSwgbG9hZGVyKTsKLSAgICAgICAgICAgICAgICBidW5kbGUgPSAoUmVzb3VyY2VCdW5kbGUpIGJ1bmRsZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgYnVuZGxlLnNldExvY2FsZShsb2NhbGUpOworICAgICAgICAgICAgICAgIGlmIChSZXNvdXJjZUJ1bmRsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJ1bmRsZUNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoUmVzb3VyY2VCdW5kbGUpIGJ1bmRsZUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgewogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciB2ZXJzaW9uIG9mIEhhcm1vbnkKKyAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidW5kbGUuc2V0TG9jYWxlKGxvY2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSBidW5kbGVOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwogICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gQWNjZXNzQ29udHJvbGxlcgpAQCAtMzQ2LDIxICs0NDUsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCByZXNvdXJjZSBmcm9tIHRoaXMgUmVzb3VyY2VCdW5kbGUsIG9yIG51bGwgaWYgdGhlCisgICAgICogUmV0dXJucyB0aGUgbmFtZWQgcmVzb3VyY2UgZnJvbSB0aGlzIHtAY29kZSBSZXNvdXJjZUJ1bmRsZX0sIG9yIG51bGwgaWYgdGhlCiAgICAgICogcmVzb3VyY2UgaXMgbm90IGZvdW5kLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGhhbmRsZUdldE9iamVjdChTdHJpbmcga2V5KTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhcmVudCByZXNvdXJjZSBidW5kbGUgb2YgdGhpcyBSZXNvdXJjZUJ1bmRsZS4gVGhlIHBhcmVudCBpcwotICAgICAqIHNlYXJjaGVkIGZvciByZXNvdXJjZXMgd2hpY2ggYXJlIG5vdCBmb3VuZCBpbiB0aGlzIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKiBTZXRzIHRoZSBwYXJlbnQgcmVzb3VyY2UgYnVuZGxlIG9mIHRoaXMge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4gVGhlIHBhcmVudCBpcworICAgICAqIHNlYXJjaGVkIGZvciByZXNvdXJjZXMgd2hpY2ggYXJlIG5vdCBmb3VuZCBpbiB0aGlzIHtAY29kZSBSZXNvdXJjZUJ1bmRsZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1bmRsZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCByZXNvdXJjZSBidW5kbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQge0Bjb2RlIFJlc291cmNlQnVuZGxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnQoUmVzb3VyY2VCdW5kbGUgYnVuZGxlKSB7CiAgICAgICAgIHBhcmVudCA9IGJ1bmRsZTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU2Nhbm5lci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TY2FubmVyLmphdmEKaW5kZXggOWE4YjNkOC4uYWNhY2ViYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TY2FubmVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TY2FubmVyLmphdmEKQEAgLTM3LDIxICszNywyOCBAQAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiAvKioKLSAqIEEgcGFyc2VyIHRoYXQgcGFyc2VzIGEgdGV4dCBzdHJpbmcgdG8gcHJpbWl0aXZlIHR5cGVzIHdpdGggdGhlIGhlbHAgb2YKLSAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSXQgc3VwcG9ydHMgbG9jYWxpemVkIG51bWJlciBhbmQgdmFyaW91cyByYWRpeGVzLgotICogCi0gKiBUaGUgaW5wdXQgaXMgYnJva2VuIGludG8gdG9rZW5zIGJ5IHRoZSBkZWxpbWl0ZXIgcGF0dGVybiwgd2hpY2ggaXMgd2hpdGVzcGFjZQotICogYnkgZGVmYXVsdC4gVGhlIHByaW1pdGl2ZSB0eXBlcyBjYW4gYmUgZ290IHZpYSBjb3JyZXNwb25kaW5nIG5leHQgbWV0aG9kcy4gSWYKLSAqIHRoZSB0b2tlbiBpcyBub3QgaW4gdmFsaWQgZm9ybWF0LCBhbiBJbnB1dE1pc3NtYXRjaEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKiAKLSAqIEZvciBleGFtcGxlOiBTY2FubmVyIHMgPSBuZXcgU2Nhbm5lcigiMUEgdHJ1ZSIpOwotICogU3lzdGVtLm91dC5wcmludGxuKHMubmV4dEludCgxNikpOyBTeXN0ZW0ub3V0LnByaW50bG4ocy5uZXh0Qm9vbGVhbigpKTsgVGhlCi0gKiByZXN1bHQ6IDI2IHRydWUKLSAqIAotICogQSBzY2FubmVyIGNhbiBmaW5kIG9yIHNraXAgc3BlY2lmaWMgcGF0dGVybiB3aXRoIG5vIHJlZ2FyZCB0byB0aGUgZGVsaW1pdGVyLgotICogQWxsIHRoZXNlIG1ldGhvZHMgYW5kIHRoZSB2YXJpb3VzIG5leHQgYW5kIGhhc05leHQgbWV0aG9kcyBtYXkgYmxvY2suCi0gKiAKLSAqIFNjYW5uZXIgaXMgbm90IHRocmVhZC1zYWZlIHdpdGhvdXQgZXh0ZXJuYWwgc3luY2hyb25pemF0aW9uCisgKiBBIHBhcnNlciB0aGF0IHBhcnNlcyBhIHRleHQgc3RyaW5nIG9mIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RyaW5ncyB3aXRoIHRoZQorICogaGVscCBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiBJdCBzdXBwb3J0cyBsb2NhbGl6ZWQgbnVtYmVycyBhbmQgdmFyaW91cworICogcmFkaXhlcy4gVGhlIGlucHV0IGlzIGJyb2tlbiBpbnRvIHRva2VucyBieSB0aGUgZGVsaW1pdGVyIHBhdHRlcm4sIHdoaWNoIGlzCisgKiB3aGl0ZXNwYWNlIGJ5IGRlZmF1bHQuIFRoZSBwcmltaXRpdmUgdHlwZXMgY2FuIGJlIG9idGFpbmVkIHZpYSBjb3JyZXNwb25kaW5nCisgKiBuZXh0KiBtZXRob2RzLiBJZiB0aGUgdG9rZW4gaXMgbm90IGluIGEgdmFsaWQgZm9ybWF0LCBhbgorICoge0Bjb2RlIElucHV0TWlzbWF0Y2hFeGNlcHRpb259IGlzIHRocm93bi4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6IDwvcD4KKyAqIDxwcmU+CisgKiBTY2FubmVyIHMgPSBuZXcgU2Nhbm5lcigiMUEgdHJ1ZSIpOworICogU3lzdGVtLm91dC5wcmludGxuKHMubmV4dEludCgxNikpOworICogU3lzdGVtLm91dC5wcmludGxuKHMubmV4dEJvb2xlYW4oKSk7CisgKiA8L3ByZT4KKyAqIDxwPgorICogWWllbGRzIHRoZSByZXN1bHQ6IHtAY29kZSAyNiB0cnVlfQorICogPC9wPgorICogPHA+QSB7QGNvZGUgU2Nhbm5lcn0gY2FuIGFsc28gZmluZCBvciBza2lwIHNwZWNpZmljIHBhdHRlcm5zIHdpdGhvdXQgcmVnYXJkIGZvciB0aGUKKyAqIGRlbGltaXRlci4gQWxsIHRoZXNlIG1ldGhvZHMgYW5kIHRoZSB2YXJpb3VzIG5leHQqIGFuZCBoYXNOZXh0KiBtZXRob2RzIG1heQorICogYmxvY2suCisgKiA8L3A+CisgKiBUaGUge0Bjb2RlIFNjYW5uZXJ9IGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZS4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU2Nhbm5lciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFN0cmluZz4gewogCkBAIC0xNTMsMzAgKzE2MCwzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBzY2FubmVyIHRoYXQgdXNlcyBGaWxlIGFzIGl0cyBpbnB1dC4gVGhlIGRlZmF1bHQgY2hhcnNldCBpcwotICAgICAqIGFwcGxpZWQgd2hlbiByZWFkaW5nIHRoZSBmaWxlLgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU2Nhbm5lcn0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAY29kZSBGaWxlfSBhcyBpbnB1dC4gVGhlIGRlZmF1bHQgY2hhcnNldAorICAgICAqIGlzIGFwcGxpZWQgd2hlbiByZWFkaW5nIHRoZSBmaWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNjYW5uZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNjYW5uZWQuCiAgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgbm90IGZvdW5kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBmaWxlIGRvZXMgbm90IGV4aXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTY2FubmVyKEZpbGUgc3JjKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhzcmMsIENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKS5uYW1lKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBzY2FubmVyIHRoYXQgdXNlcyBGaWxlIGFzIGl0cyBpbnB1dC4gVGhlIHNwZWNpZmllZCBjaGFyc2V0CisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTY2FubmVyfSB3aXRoIHRoZSBzcGVjaWZpZWQge0Bjb2RlIEZpbGV9IGFzIGlucHV0LiBUaGUgc3BlY2lmaWVkIGNoYXJzZXQKICAgICAgKiBpcyBhcHBsaWVkIHdoZW4gcmVhZGluZyB0aGUgZmlsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSBzY2FubmVkCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSBzY2FubmVkLgogICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIHR5cGUgb2YgdGhlIGZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0eXBlIG9mIHRoZSBmaWxlLgogICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBmaWxlIGlzIG5vdCBmb3VuZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgZmlsZSBkb2VzIG5vdCBleGlzdC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBjb2RpbmcgZG9lcyBub3QgZXhpc3QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNvZGluZyBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2Nhbm5lcihGaWxlIHNyYywgU3RyaW5nIGNoYXJzZXROYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgPT0gc3JjKSB7CkBAIC0yMDIsMTAgKzIxMSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBzY2FubmVyIHRoYXQgdXNlcyBTdHJpbmcgYXMgaXRzIGlucHV0LgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU2Nhbm5lcn0gb24gdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBzY2FubmVkCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIHNjYW5uZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNjYW5uZXIoU3RyaW5nIHNyYykgewogICAgICAgICBpbnB1dCA9IG5ldyBTdHJpbmdSZWFkZXIoc3JjKTsKQEAgLTIxMywyNiArMjIzLDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIHNjYW5uZXIgdGhhdCB1c2VzIElucHV0U3RyZWFtIGFzIGl0cyBpbnB1dC4gVGhlIGRlZmF1bHQKLSAgICAgKiBjaGFyc2V0IGlzIGFwcGxpZWQgd2hlbiBkZWNvZGluZyB0aGUgaW5wdXQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTY2FubmVyfSBvbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBJbnB1dFN0cmVhbX0uIFRoZSBkZWZhdWx0IGNoYXJzZXQgaXMKKyAgICAgKiBhcHBsaWVkIHdoZW4gZGVjb2RpbmcgdGhlIGlucHV0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgc2Nhbm5lZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gYmUgc2Nhbm5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2Nhbm5lcihJbnB1dFN0cmVhbSBzcmMpIHsKICAgICAgICAgdGhpcyhzcmMsIENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKS5uYW1lKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBzY2FubmVyIHRoYXQgdXNlcyBJbnB1dFN0cmVhbSBhcyBpdHMgaW5wdXQuIFRoZSBzcGVjaWZpZWQKLSAgICAgKiBjaGFyc2V0IGlzIGFwcGxpZWQgd2hlbiBkZWNvZGluZyB0aGUgaW5wdXQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTY2FubmVyfSBvbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBJbnB1dFN0cmVhbX0uIFRoZSBzcGVjaWZpZWQgY2hhcnNldCBpcworICAgICAqIGFwcGxpZWQgd2hlbiBkZWNvZGluZyB0aGUgaW5wdXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byBiZSBzY2FubmVkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIElucHV0U3RyZWFtfSB0byBiZSBzY2FubmVkLgogICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGVuY29kaW5nIHR5cGUgb2YgdGhlIGlucHV0IHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIGVuY29kaW5nIHR5cGUgb2YgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNldCBpcyBub3QgZm91bmQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQgaXMgbm90IGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTY2FubmVyKElucHV0U3RyZWFtIHNyYywgU3RyaW5nIGNoYXJzZXROYW1lKSB7CiAgICAgICAgIGlmIChudWxsID09IHNyYykgewpAQCAtMjQ4LDEwICsyNjAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgc2Nhbm5lciB0aGF0IHVzZXMgUmVhZGFibGUgYXMgaXRzIGlucHV0LgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU2Nhbm5lcn0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAY29kZSBSZWFkYWJsZX0gYXMgaW5wdXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgdGhlIFJlYWRhYmxlIHRvIGJlIHNjYW5uZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUmVhZGFibGV9IHRvIGJlIHNjYW5uZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNjYW5uZXIoUmVhZGFibGUgc3JjKSB7CiAgICAgICAgIGlmIChudWxsID09IHNyYykgewpAQCAtMjYyLDI2ICsyNzUsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgc2Nhbm5lciB0aGF0IHVzZXMgUmVhZGFibGVCeXRlQ2hhbm5lbCBhcyBpdHMgaW5wdXQuIFRoZQotICAgICAqIGRlZmF1bHQgY2hhcnNldCBpcyBhcHBsaWVkIHdoZW4gZGVjb2RpbmcgdGhlIGlucHV0LgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgU2Nhbm5lcn0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAY29kZSBSZWFkYWJsZUJ5dGVDaGFubmVsfSBhcworICAgICAqIGlucHV0LiBUaGUgZGVmYXVsdCBjaGFyc2V0IGlzIGFwcGxpZWQgd2hlbiBkZWNvZGluZyB0aGUgaW5wdXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgdGhlIFJlYWRhYmxlQnl0ZUNoYW5uZWwgdG8gYmUgc2Nhbm5lZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBSZWFkYWJsZUJ5dGVDaGFubmVsfSB0byBiZSBzY2FubmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTY2FubmVyKFJlYWRhYmxlQnl0ZUNoYW5uZWwgc3JjKSB7CiAgICAgICAgIHRoaXMoc3JjLCBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkubmFtZSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgc2Nhbm5lciB0aGF0IHVzZXMgUmVhZGFibGVCeXRlQ2hhbm5lbCBhcyBpdHMgaW5wdXQuIFRoZQotICAgICAqIHNwZWNpZmllZCBjaGFyc2V0IGlzIGFwcGxpZWQgd2hlbiBkZWNvZGluZyB0aGUgaW5wdXQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBTY2FubmVyfSB3aXRoIHRoZSBzcGVjaWZpZWQge0Bjb2RlIFJlYWRhYmxlQnl0ZUNoYW5uZWx9IGFzCisgICAgICogaW5wdXQuIFRoZSBzcGVjaWZpZWQgY2hhcnNldCBpcyBhcHBsaWVkIHdoZW4gZGVjb2RpbmcgdGhlIGlucHV0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIHRoZSBSZWFkYWJsZUJ5dGVDaGFubmVsIHRvIGJlIHNjYW5uZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUmVhZGFibGVCeXRlQ2hhbm5lbH0gdG8gYmUgc2Nhbm5lZC4KICAgICAgKiBAcGFyYW0gY2hhcnNldE5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGluZyB0eXBlIG9mIHRoZSBjb250ZW50IGluIHRoZSBSZWFkYWJsZUJ5dGVDaGFubmVsCisgICAgICogICAgICAgICAgICB0aGUgZW5jb2RpbmcgdHlwZSBvZiB0aGUgY29udGVudC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0IGlzIG5vdCBmb3VuZCAgICAgICAgICAgCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0IGlzIG5vdCBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2Nhbm5lcihSZWFkYWJsZUJ5dGVDaGFubmVsIHNyYywgU3RyaW5nIGNoYXJzZXROYW1lKSB7CiAgICAgICAgIGlmIChudWxsID09IHNyYykgewpAQCAtMjk3LDEwICszMTIsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIHVuZGVybHlpbmcgaW5wdXQgaWYgdGhlIGlucHV0IGltcGxlbWVudHMgQ2xvc2VhYmxlLiBJZiB0aGUKLSAgICAgKiBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZCwgdGhpcyBtZXRob2Qgd2lsbCB0YWtlIG5vIGVmZmVjdC4gVGhlIHNjYW5uaW5nCi0gICAgICogb3BlcmF0aW9uIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBDbG9zZXMgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gYW5kIHRoZSB1bmRlcmx5aW5nIGlucHV0IGlmIHRoZSBpbnB1dCBpbXBsZW1lbnRzCisgICAgICoge0Bjb2RlIENsb3NlYWJsZX0uIElmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLCB0aGlzIG1ldGhvZCB3aWxsIGhhdmUKKyAgICAgKiBubyBlZmZlY3QuIEFueSBzY2FubmluZyBvcGVyYXRpb24gY2FsbGVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdworICAgICAqIGFuIHtAY29kZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LgogICAgICAqIAorICAgICAqIEBzZWUgQ2xvc2VhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgIGlmIChjbG9zZWQpIHsKQEAgLTMxNywyOCArMzM1LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+UGF0dGVybjwvY29kZT4gaW4gdXNlIGJ5IHRoaXMgc2Nhbm5lci4KKyAgICAgKiBSZXR1cm5zIHRoZSBkZWxpbWl0ZXIge0Bjb2RlIFBhdHRlcm59IGluIHVzZSBieSB0aGlzIHtAY29kZSBTY2FubmVyfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5QYXR0ZXJuPC9jb2RlPiBwcmVzZW50bHkgaW4gdXNlIGJ5IHRoaXMgc2Nhbm5lcgorICAgICAqIEByZXR1cm4gdGhlIGRlbGltaXRlciB7QGNvZGUgUGF0dGVybn0gaW4gdXNlIGJ5IHRoaXMge0Bjb2RlIFNjYW5uZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQYXR0ZXJuIGRlbGltaXRlcigpIHsKICAgICAgICAgcmV0dXJuIGRlbGltaXRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmllcyB0byBmaW5kIHRoZSBwYXR0ZXJuIGluIGlucHV0LiBEZWxpbWl0ZXJzIGFyZSBpZ25vcmVkLiBJZiB0aGUKKyAgICAgKiBUcmllcyB0byBmaW5kIHRoZSBwYXR0ZXJuIGluIHRoZSBpbnB1dC4gRGVsaW1pdGVycyBhcmUgaWdub3JlZC4gSWYgdGhlCiAgICAgICogcGF0dGVybiBpcyBmb3VuZCBiZWZvcmUgbGluZSB0ZXJtaW5hdG9yLCB0aGUgbWF0Y2hlZCBzdHJpbmcgd2lsbCBiZQotICAgICAqIHJldHVybmVkLCBhbmQgdGhlIHNjYW5uZXIgd2lsbCBhZHZhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoZWQgc3RyaW5nLgotICAgICAqIE90aGVyd2lzZSwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgc2Nhbm5lciB3aWxsIG5vdCBhZHZhbmNlIHRoZQotICAgICAqIGlucHV0LiBXaGVuIHdhaXRpbmcgZm9yIGlucHV0LCB0aGUgc2Nhbm5lciBtYXkgYmUgYmxvY2tlZC4KLSAgICAgKiAKLSAgICAgKiBBbGwgdGhlIGlucHV0IG1heSBiZSBjYWNoZWQgaWYgbm8gbGluZSB0ZXJtaW5hdG9yIGV4aXN0cyBpbiB0aGUgYnVmZmVyLgorICAgICAqIHJldHVybmVkLCBhbmQgdGhlIHtAY29kZSBTY2FubmVyfSB3aWxsIGFkdmFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2hlZCBzdHJpbmcuCisgICAgICogT3RoZXJ3aXNlLCB7QGNvZGUgbnVsbH0gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlIHtAY29kZSBTY2FubmVyfSB3aWxsIG5vdCBhZHZhbmNlLgorICAgICAqIFdoZW4gd2FpdGluZyBmb3IgaW5wdXQsIHRoZSB7QGNvZGUgU2Nhbm5lcn0gbWF5IGJlIGJsb2NrZWQuIEFsbCB0aGUKKyAgICAgKiBpbnB1dCBtYXkgYmUgY2FjaGVkIGlmIG5vIGxpbmUgdGVybWluYXRvciBleGlzdHMgaW4gdGhlIGJ1ZmZlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIHBhdHRlcm4gdXNlZCB0byBtYXRjaCBpbnB1dAotICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZWQgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgcGF0dGVybiB0byBmaW5kIGluIHRoZSBpbnB1dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGVkIHN0cmluZyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhdHRlcm4gaXMgbm90IGZvdW5kCisgICAgICogICAgICAgICBiZWZvcmUgdGhlIG5leHQgbGluZSB0ZXJtaW5hdG9yLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaXMgY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBmaW5kSW5MaW5lKFBhdHRlcm4gcGF0dGVybikgewogICAgICAgICBjaGVja0Nsb3NlZCgpOwpAQCAtMzY5LDEwICszODksMTAgQEAKICAgICAgICAgbWF0Y2hlci51c2VQYXR0ZXJuKHBhdHRlcm4pOwogCiAgICAgICAgIC8qCi0gICAgICAgICAqIFRPRE8gVGhlIGZvbGxvd2luZyAyIHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gZGVhbCB3aXRoIHJlZ2V4J3MKLSAgICAgICAgICogYnVnLiBqYXZhLnV0aWwucmVnZXguTWF0Y2hlci5yZWdpb24oaW50IHN0YXJ0LCBpbnQgZW5kKQotICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3RzIHdoZW4gY2FsbGVkLiBUaGV5IHdpbGwgYmUKLSAgICAgICAgICogcmVtb3ZlZCBvbmNlIHRoZSBidWcgaXMgZml4ZWQuCisgICAgICAgICAqIFRPRE8gVGhlIGZvbGxvd2luZyAyIHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gZGVhbCB3aXRoIHJlZ2V4J3MgYnVnLgorICAgICAgICAgKiBqYXZhLnV0aWwucmVnZXguTWF0Y2hlci5yZWdpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgKiBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3RzIHdoZW4gY2FsbGVkLiBUaGV5IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZQorICAgICAgICAgKiBidWcgaXMgZml4ZWQuCiAgICAgICAgICAqLwogICAgICAgICBpbnQgb2xkTGltaXQgPSBidWZmZXIubGltaXQoKTsKICAgICAgICAgYnVmZmVyLmxpbWl0KGhvcml6b25MaW5lU2VwYXJhdG9yKTsKQEAgLTQwNCw1MiArNDI0LDU2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJpZXMgdG8gZmluZCB0aGUgcGF0dGVybiBjb21waWxlZCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiBUaGUKLSAgICAgKiBkZWxpbWl0ZXIgd2lsbCBiZSBpZ25vcmVkLiBJdCBpcyB0aGUgc2FtZSBhcyBpbnZva2UKLSAgICAgKiBmaW5kSW5MaW5lKFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSkKKyAgICAgKiBDb21waWxlcyB0aGUgcGF0dGVybiBzdHJpbmcgYW5kIHRyaWVzIHRvIGZpbmQgYSBzdWJzdGluZyBtYXRjaGluZyBpdCBpbiB0aGUgaW5wdXQgZGF0YS4gVGhlCisgICAgICogZGVsaW1pdGVyIHdpbGwgYmUgaWdub3JlZC4gVGhpcyBpcyB0aGUgc2FtZSBhcyBpbnZva2luZworICAgICAqIHtAY29kZSBmaW5kSW5MaW5lKFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyB1c2VkIHRvIGNvbnN0cnVjdCBhIHBhdHRlcm4gd2hpY2ggaW4gdHVybiB1c2VkIHRvCi0gICAgICogICAgICAgICAgICBtYXRjaCBpbnB1dAotICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZWQgc3RyaW5nCisgICAgICogICAgICAgICAgICBhIHN0cmluZyB1c2VkIHRvIGNvbnN0cnVjdCBhIHBhdHRlcm4gd2hpY2ggaXMgaW4gdHVybiB1c2VkIHRvCisgICAgICogICAgICAgICAgICBtYXRjaCBhIHN1YnN0cmluZyBvZiB0aGUgaW5wdXQgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGVkIHN0cmluZyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhdHRlcm4gaXMgbm90IGZvdW5kCisgICAgICogICAgICAgICBiZWZvcmUgdGhlIG5leHQgbGluZSB0ZXJtaW5hdG9yLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaXMgY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBpcyBjbG9zZWQuCisgICAgICogQHNlZSAjZmluZEluTGluZShQYXR0ZXJuKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZmluZEluTGluZShTdHJpbmcgcGF0dGVybikgewogICAgICAgICByZXR1cm4gZmluZEluTGluZShQYXR0ZXJuLmNvbXBpbGUocGF0dGVybikpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyaWVzIHRvIGZpbmQgdGhlIHBhdHRlcm4gaW4gaW5wdXQgZnJvbSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBUcmllcyB0byBmaW5kIHRoZSBwYXR0ZXJuIGluIHRoZSBpbnB1dCBiZXR3ZWVuIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCB0aGUgc3BlY2lmaWVkCiAgICAgICogaG9yaXpvbi4gRGVsaW1pdGVycyBhcmUgaWdub3JlZC4gSWYgdGhlIHBhdHRlcm4gaXMgZm91bmQsIHRoZSBtYXRjaGVkCi0gICAgICogc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQsIGFuZCB0aGUgc2Nhbm5lciB3aWxsIGFkdmFuY2UgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAgKiBtYXRjaGVkIHN0cmluZy4gT3RoZXJ3aXNlLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHNjYW5uZXIgd2lsbCBub3QKLSAgICAgKiBhZHZhbmNlIHRoZSBpbnB1dC4gV2hlbiB3YWl0aW5nIGZvciBpbnB1dCwgdGhlIHNjYW5uZXIgbWF5IGJlIGJsb2NrZWQuCi0gICAgICogCi0gICAgICogU2Nhbm5lciB3aWxsIG5ldmVyIHNlYXJjaCBleGNlZWQgaG9yaXpvbiBjb2RlIHBvaW50cyBmcm9tIGN1cnJlbnQKLSAgICAgKiBwb3NpdGlvbi4gVGhlIHBvc2l0aW9uIG9mIGhvcml6b24gZG9lcyBoYXZlIGVmZmVjdHMgb24gdGhlIHJlc3VsdCBvZgotICAgICAqIG1hdGNoLiBGb3IgZXhhbXBsZSwgd2hlbiBpbnB1dCBpcyAiMTIzIiwgYW5kIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgemVybywKLSAgICAgKiBmaW5kV2l0aGluSG9yaXpvbihQYXR0ZXJuLmNvbXBpbGUoIlxccHtEaWdpdH17M30iKSwgMikgd2lsbCByZXR1cm4gbnVsbC4KLSAgICAgKiBXaGlsZSBmaW5kV2l0aGluSG9yaXpvbihQYXR0ZXJuLmNvbXBpbGUoIlxccHtEaWdpdH17M30iKSwgMykgd2lsbCByZXR1cm4KLSAgICAgKiAiMTIzIi4gSG9yaXpvbiBpcyB0cmVhdGVkIGFzIGEgdHJhbnNwYXJlbnQsIG5vbi1hbmNob3JpbmcgYm91bmQuIChyZWZlcgotICAgICAqIHRvIHtAbGluayBNYXRjaGVyI3VzZVRyYW5zcGFyZW50Qm91bmRzfSBhbmQKLSAgICAgKiB7QGxpbmsgTWF0Y2hlciN1c2VBbmNob3JpbmdCb3VuZHN9KQotICAgICAqIAotICAgICAqIEhvcml6b24gd2hvc2UgdmFsdWUgaXMgemVybyB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSB3aG9sZSBpbnB1dCB3aWxsIGJlCi0gICAgICogdXNlZCBmb3Igc2VhcmNoLiBVbmRlciB0aGlzIHNpdHVhdGlvbiwgYWxsIHRoZSBpbnB1dCBtYXkgYmUgY2FjaGVkLgotICAgICAqIAotICAgICAqIEFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBvdXQgaWYgaG9yaXpvbiBpcyBsZXNzIHRoYW4KLSAgICAgKiB6ZXJvLgorICAgICAqIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLCBhbmQgdGhlIHtAY29kZSBTY2FubmVyfSB3aWxsIGFkdmFuY2UgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBtYXRjaGVkIHN0cmluZy4gT3RoZXJ3aXNlLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHtAY29kZSBTY2FubmVyfSB3aWxsIG5vdAorICAgICAqIGFkdmFuY2UuIFdoZW4gd2FpdGluZyBmb3IgaW5wdXQsIHRoZSB7QGNvZGUgU2Nhbm5lcn0gbWF5IGJlIGJsb2NrZWQuCisgICAgICogPHA+CisgICAgICogVGhlIHtAY29kZSBTY2FubmVyfSdzIHNlYXJjaCB3aWxsIG5ldmVyIGdvIG1vcmUgdGhhbiB7QGNvZGUgaG9yaXpvbn0gY29kZSBwb2ludHMgZnJvbSBjdXJyZW50CisgICAgICogcG9zaXRpb24uIFRoZSBwb3NpdGlvbiBvZiB7QGNvZGUgaG9yaXpvbn0gZG9lcyBoYXZlIGFuIGVmZmVjdCBvbiB0aGUgcmVzdWx0IG9mIHRoZSAKKyAgICAgKiBtYXRjaC4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlIGlucHV0IGlzICIxMjMiIGFuZCBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHplcm8sCisgICAgICoge0Bjb2RlIGZpbmRXaXRoaW5Ib3Jpem9uKFBhdHRlcm4uY29tcGlsZSgiXFxwJiMxMjM7RGlnaXQmIzEyNTsmIzEyMzszJiMxMjU7IiksIDIpfQorICAgICAqIHdpbGwgcmV0dXJuIHtAY29kZSBudWxsfS4gV2hpbGUKKyAgICAgKiB7QGNvZGUgZmluZFdpdGhpbkhvcml6b24oUGF0dGVybi5jb21waWxlKCJcXHAmIzEyMztEaWdpdCYjMTI1OyYjMTIzOzMmIzEyNTsiKSwgMyl9CisgICAgICogd2lsbCByZXR1cm4ge0Bjb2RlICIxMjMifS4ge0Bjb2RlIGhvcml6b259IGlzIHRyZWF0ZWQgYXMgYSB0cmFuc3BhcmVudCwKKyAgICAgKiBub24tYW5jaG9yaW5nIGJvdW5kLiAocmVmZXIgdG8KKyAgICAgKiB7QGxpbmsgTWF0Y2hlciN1c2VUcmFuc3BhcmVudEJvdW5kcyhib29sZWFuKX0gYW5kCisgICAgICoge0BsaW5rIE1hdGNoZXIjdXNlQW5jaG9yaW5nQm91bmRzKGJvb2xlYW4pfSkKKyAgICAgKiA8L3A+CisgICAgICogQSB7QGNvZGUgaG9yaXpvbn0gd2hvc2UgdmFsdWUgaXMgemVybyB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSB3aG9sZSBpbnB1dCB3aWxsIGJlCisgICAgICogdXNlZCBmb3Igc2VhcmNoLiBJbiB0aGlzIHNpdHVhdGlvbiwgYWxsIHRoZSBpbnB1dCBtYXkgYmUgY2FjaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgcGF0dGVybiB1c2VkIHRvIHNjYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHVzZWQgdG8gc2Nhbi4KICAgICAgKiBAcGFyYW0gaG9yaXpvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBsaW1pdAotICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZWQgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGxpbWl0LgorICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZWQgc3RyaW5nIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcGF0dGVybiBpcyBub3QgZm91bmQKKyAgICAgKiAgICAgICAgIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBob3Jpem9ufS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGlzIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgaG9yaXpvbiBpcyBsZXNzIHRoYW4gemVybworICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBob3Jpem9ufSBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGZpbmRXaXRoaW5Ib3Jpem9uKFBhdHRlcm4gcGF0dGVybiwgaW50IGhvcml6b24pIHsKICAgICAgICAgY2hlY2tDbG9zZWQoKTsKQEAgLTUxMSw1MCArNTM1LDUzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJpZXMgdG8gZmluZCB0aGUgcGF0dGVybiBpbiBpbnB1dCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvcml6b24uIERlbGltaXRlcnMgYXJlIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogSXQgaXMgdGhlIHNhbWUgYXMgaW52b2tlIGZpbmRXaXRoaW5Ib3Jpem9uKFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSkuCisgICAgICogVHJpZXMgdG8gZmluZCB0aGUgcGF0dGVybiBpbiB0aGUgaW5wdXQgYmV0d2VlbiB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBob3Jpem9ufS4gRGVsaW1pdGVycyBhcmUgaWdub3JlZC4gVGhpcyBjYWxsIGlzIHRoZSBzYW1lIGFzIGludm9raW5nCisgICAgICoge0Bjb2RlIGZpbmRXaXRoaW5Ib3Jpem9uKFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgcGF0dGVybiB1c2VkIHRvIHNjYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHVzZWQgdG8gc2Nhbi4KICAgICAgKiBAcGFyYW0gaG9yaXpvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBsaW1pdAotICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZWQgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGxpbWl0LgorICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZWQgc3RyaW5nLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhdHRlcm4gaXMgbm90IGZvdW5kCisgICAgICogICAgICAgICB3aXRoaW4gdGhlIHNwZWNpZmllZCBob3Jpem9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaXMgY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBob3Jpem9uIGlzIGxlc3MgdGhhbiB6ZXJvCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGhvcml6b259IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEBzZWUgI2ZpbmRXaXRoaW5Ib3Jpem9uKFBhdHRlcm4sIGludCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGZpbmRXaXRoaW5Ib3Jpem9uKFN0cmluZyBwYXR0ZXJuLCBpbnQgaG9yaXpvbikgewogICAgICAgICByZXR1cm4gZmluZFdpdGhpbkhvcml6b24oUGF0dGVybi5jb21waWxlKHBhdHRlcm4pLCBob3Jpem9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FubmVyIGhhcyBuZXh0IHRva2VuLiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZAotICAgICAqIHdoZW4gaXQgaXMgd2FpdGluZyBmb3IgaW5wdXQgdG8gc2Nhbi4gVGhpcyBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdAotICAgICAqIHRoZSBpbnB1dC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIG9uZSBvciBtb3JlIHRva2VucyByZW1haW5pbmcgdG8gcGFyc2UuCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiB0aGUgZGF0YSBpcyBzdGlsbCBiZWluZyByZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSAKLSAgICAgKiAgICAgICAgICAgICBpZmYgdGhpcyBzY2FubmVyIGhhcyBuZXh0IHRva2VuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIG9uZSBvciBtb3JlIHRva2VucyByZW1haW5pbmcsCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CiAgICAgICAgIHJldHVybiBoYXNOZXh0KEFOWV9QQVRURVJOKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FubmVyJ3MgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcGF0dGVybi4KLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZCB3aGVuIGl0IGlzIHdhaXRpbmcgZm9yIGlucHV0IHRvIHNjYW4uIFRoaXMKLSAgICAgKiBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdCB0aGUgaW5wdXQgdGhhdCBtYXRjaGVkIHRoZSBwYXR0ZXJuLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHtAY29kZSBTY2FubmVyfSBoYXMgb25lIG9yIG1vcmUgdG9rZW5zIHJlbWFpbmluZyB0byBwYXJzZQorICAgICAqIGFuZCB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHRoZSBkYXRhIGlzCisgICAgICogc3RpbGwgYmVpbmcgcmVhZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIHRvIHNjYW4KLSAgICAgKiBAcmV0dXJuIAotICAgICAqICAgICAgICAgICAgdHJ1ZSBpZmYgdGhpcyBzY2FubmVyJ3MgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcGF0dGVybgorICAgICAqICAgICAgICAgICAgdGhlIHBhdHRlcm4gdG8gY2hlY2sgZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBtb3JlIHRva2VucyBhbmQgdGhlIG5leHQgdG9rZW4KKyAgICAgKiAgICAgICAgIG1hdGNoZXMgdGhlIHBhdHRlcm4sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBpZiB0aGUgc2Nhbm5lciBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KFBhdHRlcm4gcGF0dGVybikgewogICAgICAgICBjaGVja0Nsb3NlZCgpOwpAQCAtNTgwLDMzICs2MDcsMzIgQEAKIAogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2Nhbm5lcidzIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgcGF0dGVybiBjb25zdHJ1Y3RlZAotICAgICAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuIFRoaXMgbWV0aG9kIG1heSBiZSBibG9ja2VkIHdoZW4gaXQgaXMgd2FpdGluZwotICAgICAqIGZvciBpbnB1dCB0byBzY2FuLiBUaGlzIHNjYW5uZXIgZG9lcyBub3QgYWR2YW5jZSBwYXN0IHRoZSBpbnB1dCB0aGF0Ci0gICAgICogbWF0Y2hlZCB0aGUgcGF0dGVybi4KLSAgICAgKiAKLSAgICAgKiBUaGUgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCBpbiB0aGUgZm9ybSBoYXNOZXh0KHBhdHRlcm4pIGJlaGF2ZXMgaW4gdGhlCi0gICAgICogc2FtZSB3YXkgYXMgdGhlIGludm9jYXRpb24gb2YgaGFzTmV4dChQYXR0ZXJuLmNvbXBpbGUocGF0dGVybikpLgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBvbmUgb3IgbW9yZSB0b2tlbnMgcmVtYWluaW5nIHRvIHBhcnNlCisgICAgICogYW5kIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgYSBwYXR0ZXJuIGNvbXBpbGVkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbAorICAgICAqIGJsb2NrIGlmIHRoZSBkYXRhIGlzIHN0aWxsIGJlaW5nIHJlYWQuIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvCisgICAgICoge0Bjb2RlIGhhc05leHQoUGF0dGVybi5jb21waWxlKHBhdHRlcm4pKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhdHRlcm4KICAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcGF0dGVybiB0byBzY2FuIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSAKLSAgICAgKiAgICAgICAgICAgIGlmZiB0aGlzIHNjYW5uZXIncyBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIG1hdGNoZXMgdGhpcyB7QGNvZGUgU2Nhbm5lcn0ncworICAgICAqICAgICAgICAgbmV4dCB0b2tlbiwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2Nhbm5lciBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KFN0cmluZyBwYXR0ZXJuKSB7CiAgICAgICAgIHJldHVybiBoYXNOZXh0KFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2Nhbm5lcidzIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCi0gICAgICogQmlnRGVjaW1hbC4gVGhlIHNjYW5uZXIgZG9lcyBub3QgYWR2YW5jZSBwYXN0IHRoZSBpbnB1dC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICoge0Bjb2RlIEJpZ0RlY2ltYWx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgY2FuIGJlIHRyYW5zbGF0ZWQKLSAgICAgKiAgICAgICAgIGludG8gYSB2YWxpZCBCaWdEZWNpbWFsCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICB7QGNvZGUgQmlnRGVjaW1hbH0sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2UufQogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dEJpZ0RlY2ltYWwoKSB7CiAgICAgICAgIFBhdHRlcm4gZmxvYXRQYXR0ZXJuID0gZ2V0RmxvYXRQYXR0ZXJuKCk7CkBAIC02MjUsMzAgKzY1MSwzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYW5uZXIncyBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAotICAgICAqIEJpZ0ludGVnZXIgaW4gdGhlIGRlZmF1bHQgcmFkaXguIFRoZSBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdCB0aGUKLSAgICAgKiBpbnB1dC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICoge0Bjb2RlIEJpZ0ludGVnZXJ9IGluIHRoZSBkZWZhdWx0IHJhZGl4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgY2FuIGJlIHRyYW5zbGF0ZWQKLSAgICAgKiAgICAgICAgIGludG8gYSB2YWxpZCBCaWdJbnRlZ2VyCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICB7QGNvZGUgQmlnSW50ZWdlcn0sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dEJpZ0ludGVnZXIoKSB7CiAgICAgICAgIHJldHVybiBoYXNOZXh0QmlnSW50ZWdlcihpbnRlZ2VyUmFkaXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYW5uZXIncyBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAotICAgICAqIEJpZ0ludGVnZXIgaW4gdGhlIHNwZWNpZmllZCByYWRpeC4gVGhlIHNjYW5uZXIgZG9lcyBub3QgYWR2YW5jZSBwYXN0IHRoZQotICAgICAqIGlucHV0LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiB7QGNvZGUgQmlnSW50ZWdlcn0gaW4gdGhlIHNwZWNpZmllZCByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4gaW50byBhIEJpZ0ludGVnZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGNhbiBiZSB0cmFuc2xhdGVkCi0gICAgICogICAgICAgICBpbnRvIGEgdmFsaWQgQmlnSW50ZWdlcgorICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIGEKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaWdJbnRlZ2VyfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgIHtAY29kZSBCaWdJbnRlZ2VyfSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2Nhbm5lciBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0QmlnSW50ZWdlcihpbnQgcmFkaXgpIHsKICAgICAgICAgUGF0dGVybiBpbnRlZ2VyUGF0dGVybiA9IGdldEludGVnZXJQYXR0ZXJuKHJhZGl4KTsKQEAgLTY2Nyw0NCArNjk0LDQ1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2Nhbm5lcidzIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCi0gICAgICogYm9vbGVhbiB2YWx1ZS4gVGhlIHNjYW5uZXIgZG9lcyBub3QgYWR2YW5jZSBwYXN0IHRoZSBpbnB1dCB0aGF0IG1hdGNoZWQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqIHtAY29kZSBib29sZWFufSB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgCi0gICAgICogICAgICAgICAgICAgaWZmIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGNhbiBiZSB0cmFuc2xhdGVkCi0gICAgICogICAgICAgICBpbnRvIGEgdmFsaWQgYm9vbGVhbiB2YWx1ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAge0Bjb2RlIGJvb2xlYW59IHZhbHVlLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRCb29sZWFuKCkgewogICAgICAgICByZXR1cm4gaGFzTmV4dChCT09MRUFOX1BBVFRFUk4pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYW5uZXIncyBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAotICAgICAqIGJ5dGUgdmFsdWUgaW4gdGhlIGRlZmF1bHQgcmFkaXguIFRoZSBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdCB0aGUKLSAgICAgKiBpbnB1dC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICoge0Bjb2RlIGJ5dGV9IHZhbHVlIGluIHRoZSBkZWZhdWx0IHJhZGl4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgY2FuIGJlIHRyYW5zbGF0ZWQKLSAgICAgKiAgICAgICAgIGludG8gYSB2YWxpZCBieXRlIHZhbHVlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICB7QGNvZGUgYnl0ZX0gdmFsdWUsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dEJ5dGUoKSB7CiAgICAgICAgIHJldHVybiBoYXNOZXh0Qnl0ZShpbnRlZ2VyUmFkaXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYW5uZXIncyBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAotICAgICAqIGJ5dGUgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCByYWRpeC4gVGhlIHNjYW5uZXIgZG9lcyBub3QgYWR2YW5jZSBwYXN0IHRoZQotICAgICAqIGlucHV0LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiB7QGNvZGUgYnl0ZX0gdmFsdWUgaW4gdGhlIHNwZWNpZmllZCByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4gaW50byBhIGJ5dGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGNhbiBiZSB0cmFuc2xhdGVkCi0gICAgICogICAgICAgICBpbnRvIGEgdmFsaWQgYnl0ZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIGEge0Bjb2RlIGJ5dGV9CisgICAgICogICAgICAgICAgICB2YWx1ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAge0Bjb2RlIGJ5dGV9IHZhbHVlLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRCeXRlKGludCByYWRpeCkgewogICAgICAgICBQYXR0ZXJuIGludGVnZXJQYXR0ZXJuID0gZ2V0SW50ZWdlclBhdHRlcm4ocmFkaXgpOwpAQCAtNzIzLDEzICs3NTEsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FubmVyJ3MgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKLSAgICAgKiBkb3VibGUgdmFsdWUuIFRoZSBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdCB0aGUgaW5wdXQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkIHtAY29kZSBkb3VibGV9CisgICAgICogdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBjYW4gYmUgdHJhbnNsYXRlZAotICAgICAqICAgICAgICAgaW50byBhIHZhbGlkIGRvdWJsZSB2YWx1ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAge0Bjb2RlIGRvdWJsZX0gdmFsdWUsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dERvdWJsZSgpIHsKICAgICAgICAgUGF0dGVybiBmbG9hdFBhdHRlcm4gPSBnZXRGbG9hdFBhdHRlcm4oKTsKQEAgLTc0OCwxMyArNzc3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2Nhbm5lcidzIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCi0gICAgICogZmxvYXQgdmFsdWUuIFRoZSBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdCB0aGUgaW5wdXQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqIHtAY29kZSBmbG9hdH0gdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBjYW4gYmUgdHJhbnNsYXRlZAotICAgICAqICAgICAgICAgaW50byBhIHZhbGlkIGZsb2F0IHZhbHVlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICB7QGNvZGUgZmxvYXR9IHZhbHVlLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRGbG9hdCgpIHsKICAgICAgICAgUGF0dGVybiBmbG9hdFBhdHRlcm4gPSBnZXRGbG9hdFBhdHRlcm4oKTsKQEAgLTc3MywzMCArODAzLDMyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2Nhbm5lcidzIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCi0gICAgICogaW50IHZhbHVlIGluIHRoZSBkZWZhdWx0IHJhZGl4LiBUaGUgc2Nhbm5lciBkb2VzIG5vdCBhZHZhbmNlIHBhc3QgdGhlCi0gICAgICogaW5wdXQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCB7QGNvZGUgaW50fQorICAgICAqIHZhbHVlIGluIHRoZSBkZWZhdWx0IHJhZGl4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgY2FuIGJlIHRyYW5zbGF0ZWQKLSAgICAgKiAgICAgICAgIGludG8gYSB2YWxpZCBpbnQgdmFsdWUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgIHtAY29kZSBpbnR9IHZhbHVlLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRJbnQoKSB7CiAgICAgICAgIHJldHVybiBoYXNOZXh0SW50KGludGVnZXJSYWRpeCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2Nhbm5lcidzIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCi0gICAgICogaW50IHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgcmFkaXguIFRoZSBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdCB0aGUKLSAgICAgKiBpbnB1dC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkIHtAY29kZSBpbnR9CisgICAgICogdmFsdWUgaW4gdGhlIHNwZWNpZmllZCByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4gaW50byBhbiBpbnQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGNhbiBiZSB0cmFuc2xhdGVkCi0gICAgICogICAgICAgICBpbnRvIGEgdmFsaWQgaW50IHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdXNlZCB0byB0cmFuc2xhdGUgdGhlIHRva2VuIGludG8gYW4ge0Bjb2RlIGludH0KKyAgICAgKiAgICAgICAgICAgIHZhbHVlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGluIHRoaXMge0Bjb2RlIFNjYW5uZXJ9J3MgaW5wdXQgY2FuIGJlCisgICAgICogICAgICAgICB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCB7QGNvZGUgaW50fSB2YWx1ZSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dEludChpbnQgcmFkaXgpIHsKICAgICAgICAgUGF0dGVybiBpbnRlZ2VyUGF0dGVybiA9IGdldEludGVnZXJQYXR0ZXJuKHJhZGl4KTsKQEAgLTgwNSw3ICs4MzcsNyBAQAogICAgICAgICAgICAgU3RyaW5nIGludFN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoKTsKICAgICAgICAgICAgIGludFN0cmluZyA9IHJlbW92ZUxvY2FsZUluZm8oaW50U3RyaW5nLCBEYXRhVHlwZS5JTlQpOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAljYWNoZUhhc05leHRWYWx1ZSA9IEludGVnZXIudmFsdWVPZihpbnRTdHJpbmcsIHJhZGl4KTsKKyAgICAgICAgICAgICAgICBjYWNoZUhhc05leHRWYWx1ZSA9IEludGVnZXIudmFsdWVPZihpbnRTdHJpbmcsIHJhZGl4KTsKICAgICAgICAgICAgICAgICBpc0ludFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgbWF0Y2hTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC04MTMsMTYgKzg0NSwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpc0ludFZhbHVlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVyIGxpbmUgaW4gdGhlIGlucHV0LiBPdGhlcndpc2UsIHJldHVybnMKLSAgICAgKiBmYWxzZS4gV2hlbiB3YWl0aW5nIGZvciBpbnB1dCwgdGhlIHNjYW5uZXIgbWF5IGJlIGJsb2NrZWQuIE5vIG1hdHRlciB0cnVlCi0gICAgICogb3IgZmFsc2UsIHRoZSBzY2FubmVyIHdpbGwgbm90IGFkdmFuY2UgYW55IGlucHV0LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGVyZSBpcyBhIGxpbmUgdGVybWluYXRvciBpbiB0aGUgaW5wdXQuCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJsb2NrLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVyIGxpbmUgaW4gdGhlIGlucHV0LiBPdGhlcndpc2UsIGZhbHNlIHdpbGwKLSAgICAgKiAgICAgICAgIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGlzIGEgbGluZSB0ZXJtaW5hdG9yIGluIHRoZSBpbnB1dCwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSwge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGlzIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaXMgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRMaW5lKCkgewogICAgICAgICBjaGVja0Nsb3NlZCgpOwpAQCAtODUyLDMwICs4ODQsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FubmVyJ3MgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKLSAgICAgKiBsb25nIHZhbHVlIGluIHRoZSBkZWZhdWx0IHJhZGl4LiBUaGUgc2Nhbm5lciBkb2VzIG5vdCBhZHZhbmNlIHBhc3QgdGhlCi0gICAgICogaW5wdXQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqIHtAY29kZSBsb25nfSB2YWx1ZSBpbiB0aGUgZGVmYXVsdCByYWRpeC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGNhbiBiZSB0cmFuc2xhdGVkCi0gICAgICogICAgICAgICBpbnRvIGEgdmFsaWQgbG9uZyB2YWx1ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAge0Bjb2RlIGxvbmd9IHZhbHVlLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRMb25nKCkgewogICAgICAgICByZXR1cm4gaGFzTmV4dExvbmcoaW50ZWdlclJhZGl4KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FubmVyJ3MgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKLSAgICAgKiBsb25nIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgcmFkaXguIFRoZSBzY2FubmVyIGRvZXMgbm90IGFkdmFuY2UgcGFzdCB0aGUKLSAgICAgKiBpbnB1dC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICoge0Bjb2RlIGxvbmd9IHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgcmFkaXguCiAgICAgICogCiAgICAgICogQHBhcmFtIHJhZGl4Ci0gICAgICogICAgICAgICAgICB0aGUgcmFkaXggdXNlZCB0byB0cmFuc2xhdGUgdGhlIHRva2VuIGludG8gYSBsb25nIHZhbHVlCi0gICAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBjYW4gYmUgdHJhbnNsYXRlZAotICAgICAqICAgICAgICAgaW50byBhIHZhbGlkIGxvbmcgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4gaW50byBhIHtAY29kZSBsb25nfQorICAgICAqICAgICAgICAgICAgdmFsdWUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICB7QGNvZGUgbG9uZ30gdmFsdWUsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dExvbmcoaW50IHJhZGl4KSB7CiAgICAgICAgIFBhdHRlcm4gaW50ZWdlclBhdHRlcm4gPSBnZXRJbnRlZ2VyUGF0dGVybihyYWRpeCk7CkBAIC04OTUsMzAgKzkyOCwzMSBAQAogCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FubmVyJ3MgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKLSAgICAgKiBzaG9ydCB2YWx1ZSBpbiB0aGUgZGVmYXVsdCByYWRpeC4gVGhlIHNjYW5uZXIgZG9lcyBub3QgYWR2YW5jZSBwYXN0IHRoZQotICAgICAqIGlucHV0LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiB7QGNvZGUgc2hvcnR9IHZhbHVlIGluIHRoZSBkZWZhdWx0IHJhZGl4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgY2FuIGJlIHRyYW5zbGF0ZWQKLSAgICAgKiAgICAgICAgIGludG8gYSB2YWxpZCBzaG9ydCB2YWx1ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAge0Bjb2RlIHNob3J0fSB2YWx1ZSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2Nhbm5lciBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0U2hvcnQoKSB7CiAgICAgICAgIHJldHVybiBoYXNOZXh0U2hvcnQoaW50ZWdlclJhZGl4KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FubmVyJ3MgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKLSAgICAgKiBzaG9ydCB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBUaGUgc2Nhbm5lciBkb2VzIG5vdCBhZHZhbmNlIHBhc3QgdGhlCi0gICAgICogaW5wdXQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqIHtAY29kZSBzaG9ydH0gdmFsdWUgaW4gdGhlIHNwZWNpZmllZCByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4gaW50byBhIHNob3J0IHZhbHVlCi0gICAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBjYW4gYmUgdHJhbnNsYXRlZAotICAgICAqICAgICAgICAgaW50byBhIHZhbGlkIHNob3J0IHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdXNlZCB0byB0cmFuc2xhdGUgdGhlIHRva2VuIGludG8gYSB7QGNvZGUgc2hvcnR9CisgICAgICogICAgICAgICAgICB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgIHtAY29kZSBzaG9ydH0gdmFsdWUsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dFNob3J0KGludCByYWRpeCkgewogICAgICAgICBQYXR0ZXJuIGludGVnZXJQYXR0ZXJuID0gZ2V0SW50ZWdlclBhdHRlcm4ocmFkaXgpOwpAQCAtOTI3LDcgKzk2MSw3IEBACiAgICAgICAgICAgICBTdHJpbmcgaW50U3RyaW5nID0gbWF0Y2hlci5ncm91cCgpOwogICAgICAgICAgICAgaW50U3RyaW5nID0gcmVtb3ZlTG9jYWxlSW5mbyhpbnRTdHJpbmcsIERhdGFUeXBlLklOVCk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgCWNhY2hlSGFzTmV4dFZhbHVlID0gU2hvcnQudmFsdWVPZihpbnRTdHJpbmcsIHJhZGl4KTsKKyAgICAgICAgICAgICAgICBjYWNoZUhhc05leHRWYWx1ZSA9IFNob3J0LnZhbHVlT2YoaW50U3RyaW5nLCByYWRpeCk7CiAgICAgICAgICAgICAgICAgaXNTaG9ydFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgbWF0Y2hTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC05MzcsNDIgKzk3MSwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhc3QgSU9FeGNlcHRpb24gdGhyb3duIHdoZW4gcmVhZGluZyB0aGUgdW5kZXJseWluZyBpbnB1dC4gSWYKLSAgICAgKiBubyBleGNlcHRpb24gaXMgdGhyb3duLCByZXR1cm4gbnVsbC4KKyAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IHtAY29kZSBJT0V4Y2VwdGlvbn0gdGhhdCB3YXMgcmFpc2VkIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgdW5kZXJseWluZworICAgICAqIGlucHV0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhc3QgSU9FeGNlcHRpb24gdGhyb3duCisgICAgICogQHJldHVybiB0aGUgbGFzdCB0aHJvd24ge0Bjb2RlIElPRXhjZXB0aW9ufSwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgd2FzIHRocm93bi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSU9FeGNlcHRpb24gaW9FeGNlcHRpb24oKSB7CiAgICAgICAgIHJldHVybiBsYXN0SU9FeGNlcHRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBsb2NhbGUgb2YgdGhpcyBzY2FubmVyLgorICAgICAqIFJldHVybiB0aGUge0Bjb2RlIExvY2FsZX0gb2YgdGhpcyB7QGNvZGUgU2Nhbm5lcn0uCiAgICAgICogCi0gICAgICogQHJldHVybiAKLSAgICAgKiAgICAgICAgICAgICB0aGUgbG9jYWxlIG9mIHRoaXMgc2Nhbm5lcgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBMb2NhbGV9IG9mIHRoaXMge0Bjb2RlIFNjYW5uZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMb2NhbGUgbG9jYWxlKCkgewogICAgICAgICByZXR1cm4gbG9jYWxlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hdGNoIHJlc3VsdCBvZiB0aGlzIHNjYW5uZXIncyBsYXN0IG1hdGNoIG9wZXJhdGlvbi5UaGlzCi0gICAgICogbWV0aG9kIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbm8gbWF0Y2ggb3BlcmF0aW9uIGhhcyBiZWVuCi0gICAgICogcGVyZm9ybWVkLCBvciBpZiB0aGUgbGFzdCBtYXRjaCB3YXMgdW5zdWNjZXNzZnVsLgorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBtYXRjaGluZyBvcGVyYXRpb24uCisgICAgICogPHA+CisgICAgICogVGhlIG5leHQqIGFuZCBmaW5kKiBtZXRob2RzIHJldHVybiB0aGUgbWF0Y2ggcmVzdWx0IGluIHRoZSBjYXNlIG9mIGEKKyAgICAgKiBzdWNjZXNzZnVsIG1hdGNoLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBUaGUgdmFyaW91cyBuZXh0WFhYIG1ldGhvZHMgb2YgU2Nhbm5lciBwcm92aWRlIGEgbWF0Y2ggcmVzdWx0IGlmIHRoZXkgZG8KLSAgICAgKiBub3QgY29tcGxldGUgd2l0aCB0aHJvd2luZyBhbiBleGNlcHRpb24uIEZvciBleGFtcGxlLCBhZnRlciBhbiBpbnZvY2F0aW9uCi0gICAgICogb2YgdGhlIG5leHRCb29sZWFuKCkgbWV0aG9kIHdoaWNoIHJldHVybmVkIGEgYm9vbGVhbiB2YWx1ZSwgdGhpcyBtZXRob2QKLSAgICAgKiByZXR1cm5zIGEgbWF0Y2ggcmVzdWx0IGZvciB0aGUgc2VhcmNoIG9mIHRoZSBCb29sZWFuIHJlZ3VsYXIgZXhwcmVzc2lvbgotICAgICAqIGRlZmluZWQgYWJvdmUuIEluIHRoZSBzYW1lIHdheSx0aGUgZmluZEluTGluZShqYXZhLmxhbmcuU3RyaW5nKSwKLSAgICAgKiBmaW5kV2l0aGluSG9yaXpvbihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpLCBhbmQKLSAgICAgKiBza2lwKGphdmEudXRpbC5yZWdleC5QYXR0ZXJuKSBtZXRob2RzIHdpbGwgcHJvdmlkZSBhIG1hdGNoIHJlc3VsdCBpZiB0aGV5Ci0gICAgICogYXJlIHN1Y2Nlc3NmdWwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF0Y2ggcmVzdWx0IG9mIHRoZSBsYXN0IG1hdGNoIG9wZXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG1hdGNoIHJlc3VsdCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIG1hdGNoIG9wZXJhdGlvbgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG1hdGNoIHJlc3VsdCBpcyBub3QgYXZhaWxhYmxlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG1hdGNoIHJlc3VsdCBpcyBub3QgYXZhaWxhYmxlLCBvZiBpZiB0aGUgbGFzdCBtYXRjaAorICAgICAqICAgICAgICAgICAgIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWF0Y2hSZXN1bHQgbWF0Y2goKSB7CiAgICAgICAgIGlmICghbWF0Y2hTdWNjZXNzZnVsKSB7CkBAIC05ODIsMzkgKzEwMTIsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5kcyBhbmQgUmV0dXJucyB0aGUgbmV4dCBjb21wbGV0ZSB0b2tlbiB3aGljaCBpcyBwcmVmaXhlZCBhbmQgcG9zdGZpeGVkCi0gICAgICogYnkgaW5wdXQgdGhhdCBtYXRjaGVzIHRoZSBkZWxpbWl0ZXIgcGF0dGVybi4gVGhpcyBtZXRob2QgbWF5IGJlIGJsb2NrZWQKLSAgICAgKiB3aGVuIGl0IGlzIHdhaXRpbmcgZm9yIGlucHV0IHRvIHNjYW4sIGV2ZW4gaWYgYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mCi0gICAgICogaGFzTmV4dCgpIHJldHVybmVkIHRydWUuIElmIHRoaXMgbWF0Y2ggc3VjY2Vzc2VzLCB0aGUgc2Nhbm5lciBhZHZhbmNlcwotICAgICAqIHBhc3QgdGhlIG5leHQgY29tcGxldGUgdG9rZW4uCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbi4gVGhlIHRva2VuIHdpbGwgYmUgYm90aCBwcmVmaXhlZCBhbmQgcG9zdGZpeGVkIGJ5CisgICAgICogdGhlIGRlbGltaXRlciB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyB1c2VkIChvciBhIHN0cmluZyB0aGF0IG1hdGNoZXMgdGhlCisgICAgICogZGVsaW1pdGVyIHBhdHRlcm4pLiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIGlmIGlucHV0IGlzIGJlaW5nIHJlYWQuCiAgICAgICogCi0gICAgICogQHJldHVybiAKLSAgICAgKiAgICAgICAgICAgICB0aGUgbmV4dCBjb21wbGV0ZSB0b2tlbgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY29tcGxldGUgdG9rZW4uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZAorICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIG5leHQoKSB7CiAgICAgICAgIHJldHVybiBuZXh0KEFOWV9QQVRURVJOKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIHdoaWNoIGlzIHByZWZpeGVkIGFuZCBwb3N0Zml4ZWQgYnkgaW5wdXQgdGhhdAotICAgICAqIG1hdGNoZXMgdGhlIGRlbGltaXRlciBwYXR0ZXJuIGlmIHRoaXMgdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCi0gICAgICogcGF0dGVybi4gVGhpcyBtZXRob2QgbWF5IGJlIGJsb2NrZWQgd2hlbiBpdCBpcyB3YWl0aW5nIGZvciBpbnB1dCB0byBzY2FuLAotICAgICAqIGV2ZW4gaWYgYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGhhc05leHQoUGF0dGVybikgcmV0dXJuZWQgdHJ1ZS4gSWYgdGhpcwotICAgICAqIG1hdGNoIHN1Y2Nlc3NlcywgdGhlIHNjYW5uZXIgYWR2YW5jZXMgcGFzdCB0aGUgbmV4dCB0b2tlbiB0aGF0IG1hdGNoZWQKLSAgICAgKiB0aGUgcGF0dGVybi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGlmIGl0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLiBUaGUgdG9rZW4KKyAgICAgKiB3aWxsIGJlIGJvdGggcHJlZml4ZWQgYW5kIHBvc3RmaXhlZCBieSB0aGUgZGVsaW1pdGVyIHRoYXQgaXMgY3VycmVudGx5CisgICAgICogYmVpbmcgdXNlZCAob3IgYSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBkZWxpbWl0ZXIgcGF0dGVybikuIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgKiBpZiBpbnB1dCBpcyBiZWluZyByZWFkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gdG8gc2NhbgotICAgICAqIEByZXR1cm4gCi0gICAgICogICAgICAgICAgICAgdGhlIG5leHQgdG9rZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcGF0dGVybiB0byBzY2FuLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZAorICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZC4KKyAgICAgKiBAdGhyb3dzIElucHV0TWlzbWF0Y2hFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiBnaXZlbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIG5leHQoUGF0dGVybiBwYXR0ZXJuKSB7CiAgICAgICAgIGNoZWNrQ2xvc2VkKCk7CkBAIC0xMDM3LDYwICsxMDY1LDU1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiB3aGljaCBpcyBwcmVmaXhlZCBhbmQgcG9zdGZpeGVkIGJ5IGlucHV0IHRoYXQKLSAgICAgKiBtYXRjaGVzIHRoZSBkZWxpbWl0ZXIgcGF0dGVybiBpZiB0aGlzIHRva2VuIG1hdGNoZXMgdGhlIHBhdHRlcm4KLSAgICAgKiBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzZXBjaWZpZWQgc3RyaW5nLiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZCB3aGVuIGl0Ci0gICAgICogaXMgd2FpdGluZyBmb3IgaW5wdXQgdG8gc2Nhbi4gSWYgdGhpcyBtYXRjaCBzdWNjZXNzZXMsIHRoZSBzY2FubmVyCi0gICAgICogYWR2YW5jZXMgcGFzdCB0aGUgbmV4dCB0b2tlbiB0aGF0IG1hdGNoZWQgdGhlIHBhdHRlcm4uCi0gICAgICogCi0gICAgICogVGhlIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QgaW4gdGhlIGZvcm0gbmV4dChwYXR0ZXJuKSBiZWhhdmVzIGluIHRoZQotICAgICAqIHNhbWUgd2F5IGFzIHRoZSBpbnZvY2F0aW9uIG9mIG5leHQoUGF0dGVybi5jb21waWxlKHBhdHRlcm4pKS4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGlmIGl0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLiBUaGUgdG9rZW4KKyAgICAgKiB3aWxsIGJlIGJvdGggcHJlZml4ZWQgYW5kIHBvc3RmaXhlZCBieSB0aGUgZGVsaW1pdGVyIHRoYXQgaXMgY3VycmVudGx5CisgICAgICogYmVpbmcgdXNlZCAob3IgYSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBkZWxpbWl0ZXIgcGF0dGVybikuIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgKiBpZiBpbnB1dCBpcyBiZWluZyByZWFkLiBDYWxsaW5nIHRoaXMgbWV0aG9zIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgKiB7QGNvZGUgbmV4dChQYXR0ZXJuLmNvbXBpbGUocGF0dGVybikpfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBwYXR0ZXJuIHRvIHNjYW4gZm9yCi0gICAgICogQHJldHVybiAKLSAgICAgKiAgICAgICAgICAgICB0aGUgbmV4dCB0b2tlbgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBwYXR0ZXJuIHRvIHNjYW4gZm9yLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZAorICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZC4KKyAgICAgKiBAdGhyb3dzIElucHV0TWlzbWF0Y2hFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiBnaXZlbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIG5leHQoU3RyaW5nIHBhdHRlcm4pIHsKICAgICAgICAgcmV0dXJuIG5leHQoUGF0dGVybi5jb21waWxlKHBhdHRlcm4pKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGludG8gYSBCaWdEZWNpbWFsIGFuZAotICAgICAqIHJldHVybnMgdGhpcyB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGJsb2NrZWQgd2hlbiBpdCBpcyB3YWl0aW5nIGZvcgotICAgICAqIGlucHV0IHRvIHNjYW4sIGV2ZW4gaWYgYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGhhc05leHRCaWdEZWNpbWFsKCkKLSAgICAgKiByZXR1cm5lZCB0cnVlLiBJZiB0aGlzIG1hdGNoIHN1Y2NlZWRzLCB0aGUgc2Nhbm5lciBhZHZhbmNlcyBwYXN0IHRoZQotICAgICAqIGlucHV0IHRoYXQgbWF0Y2hlZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGFzIGEge0Bjb2RlIEJpZ0RlY2ltYWx9LiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIGlmIGlucHV0IGlzCisgICAgICogYmVpbmcgcmVhZC4gSWYgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhIHtAY29kZSBCaWdEZWNpbWFsfQorICAgICAqIHRoZSBmb2xsb3dpbmcgaXMgZG9uZTogQWxsIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIHByZWZpeGVzLCBncm91cCBzZXBhcmF0b3JzLAorICAgICAqIGFuZCB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4gVGhlbiBub24tQVNDSUkgZGlnaXRzIGFyZQorICAgICAqIG1hcHBlZCBpbnRvIEFTQ0lJIGRpZ2l0cyB2aWEge0BsaW5rIENoYXJhY3RlciNkaWdpdChjaGFyLCBpbnQpfSwgYW5kIGEKKyAgICAgKiBuZWdhdGl2ZSBzaWduICgtKSBpcyBhZGRlZCBpZiB0aGUge0Bjb2RlIExvY2FsZX0tc3BlY2lmaWMgbmVnYXRpdmUgcHJlZml4IG9yCisgICAgICogc3VmZml4IHdhcyBwcmVzZW50LiBGaW5hbGx5IHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHBhc3NlZCB0bworICAgICAqIHtAY29kZSBCaWdEZWNpbWFsKFN0cmluZykgfS4KICAgICAgKiAKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBGbG9hdCByZWd1bGFyIGV4cHJlc3Npb24gc3VjY2Vzc2Z1bGx5LCB0aGUKLSAgICAgKiB0b2tlbiBpcyB0cmFuc2xhdGVkIGludG8gYSBCaWdEZWNpbWFsIGFzIGZvbGxvd2luZyBzdGVwcy4gQXQgZmlyc3QgYWxsCi0gICAgICogbG9jYWxlIHNwZWNpZmljIHByZWZpeGVzICxncm91cCBzZXBhcmF0b3JzLCBhbmQgbG9jYWxlIHNwZWNpZmljIHN1ZmZpeGVzCi0gICAgICogYXJlIHJlbW92ZWQuIFRoZW4gbm9uLUFTQ0lJIGRpZ2l0cyBhcmUgbWFwcGVkIGludG8gQVNDSUkgZGlnaXRzIHZpYQotICAgICAqIHtAbGluayBDaGFyYWN0ZXIjZGlnaXQoY2hhciwgaW50KX19LCBhIG5lZ2F0aXZlIHNpZ24gKC0pIGlzIGFkZGVkIGlmIHRoZQotICAgICAqIGxvY2FsZSBzcGVjaWZpYyBuZWdhdGl2ZSBwcmVmaXhlcyBhbmQgc3VmZml4ZXMgd2VyZSBwcmVzZW50LiBBdCBsYXN0IHRoZQotICAgICAqIHJlc3VsdGluZyBTdHJpbmcgaXMgcGFzc2VkIHRvIHtAbGluayBCaWdEZWNpbWFsI0JpZ0RlY2ltYWwoU3RyaW5nKX19LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEJpZ0RlY2ltYWwgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgQmlnRGVjaW1hbH0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZAorICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZC4KICAgICAgKiBAdGhyb3dzIElucHV0TWlzbWF0Y2hFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCi0gICAgICogICAgICAgICAgICAgQmlnRGVjaW1hbAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBCaWdEZWNpbWFsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBuZXh0QmlnRGVjaW1hbCgpIHsKLSAgICAJY2hlY2tDbG9zZWQoKTsKLQkJT2JqZWN0IG9iaiA9IGNhY2hlSGFzTmV4dFZhbHVlOwotCQljYWNoZUhhc05leHRWYWx1ZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7Ci0JCQlmaW5kU3RhcnRJbmRleCA9IGNhY2hlaGFzTmV4dEluZGV4OwotCQkJcmV0dXJuIChCaWdEZWNpbWFsKSBvYmo7Ci0JCX0KKyAgICAgICAgY2hlY2tDbG9zZWQoKTsKKyAgICAgICAgT2JqZWN0IG9iaiA9IGNhY2hlSGFzTmV4dFZhbHVlOworICAgICAgICBjYWNoZUhhc05leHRWYWx1ZSA9IG51bGw7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7CisgICAgICAgICAgICBmaW5kU3RhcnRJbmRleCA9IGNhY2hlaGFzTmV4dEluZGV4OworICAgICAgICAgICAgcmV0dXJuIChCaWdEZWNpbWFsKSBvYmo7CisgICAgICAgIH0KICAgICAgICAgUGF0dGVybiBmbG9hdFBhdHRlcm4gPSBnZXRGbG9hdFBhdHRlcm4oKTsKICAgICAgICAgU3RyaW5nIGZsb2F0U3RyaW5nID0gbmV4dChmbG9hdFBhdHRlcm4pOwogICAgICAgICBmbG9hdFN0cmluZyA9IHJlbW92ZUxvY2FsZUluZm9Gcm9tRmxvYXQoZmxvYXRTdHJpbmcpOwpAQCAtMTEwNiw2NCArMTEyOSw1NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgaW50byBhIEJpZ0ludGVnZXIgYW5kCi0gICAgICogcmV0dXJucyB0aGlzIHZhbHVlLiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZCB3aGVuIGl0IGlzIHdhaXRpbmcgZm9yCi0gICAgICogaW5wdXQgdG8gc2NhbiwgZXZlbiBpZiBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgaGFzTmV4dEJpZ0ludGVnZXIoKQotICAgICAqIHJldHVybmVkIHRydWUuIElmIHRoaXMgbWF0Y2ggc3VjY2VlZHMsIHRoZSBzY2FubmVyIGFkdmFuY2VzIHBhc3QgdGhlCi0gICAgICogaW5wdXQgdGhhdCBtYXRjaGVkLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgQmlnSW50ZWdlcn0uIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgaWYgaW5wdXQgaXMKKyAgICAgKiBiZWluZyByZWFkLiBFcXVpdmFsZW50IHRvIHtAY29kZSBuZXh0QmlnSW50ZWdlcihERUZBVUxUX1JBRElYKX0uCiAgICAgICogCi0gICAgICogVGhlIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QgaW4gdGhlIGZvcm0gbmV4dEJpZ0ludGVnZXIoKSBiZWhhdmVzIGluIHRoZQotICAgICAqIHNhbWUgd2F5IGFzIHRoZSBpbnZvY2F0aW9uIG9mIG5leHRCaWdJbnRlZ2VyKHJhZGl4KSwgdGhlIHJhZGl4IGlzIHRoZQotICAgICAqIGRlZmF1bHQgcmFkaXggb2YgdGhpcyBzY2FubmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEJpZ0ludGVnZXIgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMge0Bjb2RlIEJpZ0ludGVnZXJ9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAotICAgICAqICAgICAgICAgICAgIEJpZ0ludGVnZXIsIG9yIGl0IGlzIG91dCBvZiByYW5nZQorICAgICAqICAgICAgICAgICAgIHtAY29kZSBCaWdJbnRlZ2VyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBuZXh0QmlnSW50ZWdlcigpIHsKICAgICAgICAgcmV0dXJuIG5leHRCaWdJbnRlZ2VyKGludGVnZXJSYWRpeCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBpbnRvIGEgQmlnSW50ZWdlciBhbmQKLSAgICAgKiByZXR1cm5zIHRoaXMgdmFsdWUuIFRoaXMgbWV0aG9kIG1heSBiZSBibG9ja2VkIHdoZW4gaXQgaXMgd2FpdGluZyBmb3IKLSAgICAgKiBpbnB1dCB0byBzY2FuLCBldmVuIGlmIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBoYXNOZXh0QmlnSW50ZWdlcihyYWRpeCkKLSAgICAgKiByZXR1cm5lZCB0cnVlLiBJZiB0aGlzIG1hdGNoIHN1Y2NlZWRzLCB0aGUgc2Nhbm5lciBhZHZhbmNlcyBwYXN0IHRoZQotICAgICAqIGlucHV0IHRoYXQgbWF0Y2hlZC4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBJbnRlZ2VyIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWNjZXNzZnVsbHksCi0gICAgICogdGhlIHRva2VuIGlzIHRyYW5zbGF0ZWQgaW50byBhIEJpZ0ludGVnZXIgYXMgZm9sbG93aW5nIHN0ZXBzLiBBdCBmaXJzdAotICAgICAqIGFsbCBsb2NhbGUgc3BlY2lmaWMgcHJlZml4ZXMgLGdyb3VwIHNlcGFyYXRvcnMsIGFuZCBsb2NhbGUgc3BlY2lmaWMKLSAgICAgKiBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4gVGhlbiBub24tQVNDSUkgZGlnaXRzIGFyZSBtYXBwZWQgaW50byBBU0NJSSBkaWdpdHMKLSAgICAgKiB2aWEge0BsaW5rIENoYXJhY3RlciNkaWdpdChjaGFyLCBpbnQpfX0sIGEgbmVnYXRpdmUgc2lnbiAoLSkgaXMgYWRkZWQgaWYKLSAgICAgKiB0aGUgbG9jYWxlIHNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB3ZXJlIHByZXNlbnQuIEF0IGxhc3QKLSAgICAgKiB0aGUgcmVzdWx0aW5nIFN0cmluZyBpcyBwYXNzZWQgdG8KLSAgICAgKiB7QGxpbmsgQmlnSW50ZWdlciNCaWdJbnRlZ2VyKFN0cmluZywgaW50KX19IHdpdGggdGhlIHNwZWNpZmllZCByYWRpeC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGFzIGEge0Bjb2RlIEJpZ0ludGVnZXJ9IHdpdGggdGhlIHNwZWNpZmllZCByYWRpeC4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIGlmIGlucHV0IGlzIGJlaW5nIHJlYWQuIElmIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkCisgICAgICogaW50byBhIHtAY29kZSBCaWdJbnRlZ2VyfSB0aGUgZm9sbG93aW5nIGlzIGRvbmU6IEFsbCB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYworICAgICAqIHByZWZpeGVzLCBncm91cCBzZXBhcmF0b3JzLCBhbmQge0Bjb2RlIExvY2FsZX0tc3BlY2lmaWMgc3VmZml4ZXMgYXJlIHJlbW92ZWQuCisgICAgICogVGhlbiBub24tQVNDSUkgZGlnaXRzIGFyZSBtYXBwZWQgaW50byBBU0NJSSBkaWdpdHMgdmlhCisgICAgICoge0BsaW5rIENoYXJhY3RlciNkaWdpdChjaGFyLCBpbnQpfSwgYW5kIGEgbmVnYXRpdmUgc2lnbiAoLSkgaXMgYWRkZWQgaWYgdGhlCisgICAgICoge0Bjb2RlIExvY2FsZX0tc3BlY2lmaWMgbmVnYXRpdmUgcHJlZml4IG9yIHN1ZmZpeCB3YXMgcHJlc2VudC4gRmluYWxseSB0aGUKKyAgICAgKiByZXN1bHRpbmcgU3RyaW5nIGlzIHBhc3NlZCB0byB7QGxpbmsgQmlnSW50ZWdlciNCaWdJbnRlZ2VyKFN0cmluZywgaW50KX19CisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHJhZGl4LgogICAgICAqIAogICAgICAqIEBwYXJhbSByYWRpeAotICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIGEgQmlnSW50ZWdlcgotICAgICAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBzY2FubmVkIGZyb20gdGhlIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdXNlZCB0byB0cmFuc2xhdGUgdGhlIHRva2VuIGludG8gYQorICAgICAqICAgICAgICAgICAge0Bjb2RlIEJpZ0ludGVnZXJ9LgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgQmlnSW50ZWdlcn0KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc2Nhbm5lciBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCiAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgaW5wdXQgaGFzIGJlZW4gZXhoYXVzdGVkCisgICAgICogICAgICAgICAgICAgaWYgaW5wdXQgaGFzIGJlZW4gZXhoYXVzdGVkLgogICAgICAqIEB0aHJvd3MgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXh0IHRva2VuIGNhbiBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKLSAgICAgKiAgICAgICAgICAgICBCaWdJbnRlZ2VyLCBvciBpdCBpcyBvdXQgb2YgcmFuZ2UKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgQmlnSW50ZWdlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgbmV4dEJpZ0ludGVnZXIoaW50IHJhZGl4KSB7Ci0gICAgCWNoZWNrQ2xvc2VkKCk7Ci0JCU9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKLQkJY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgewotCQkJZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKLQkJCXJldHVybiAoQmlnSW50ZWdlcikgb2JqOwotCQl9CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgICAgIE9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKKyAgICAgICAgY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgeworICAgICAgICAgICAgZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKKyAgICAgICAgICAgIHJldHVybiAoQmlnSW50ZWdlcikgb2JqOworICAgICAgICB9CiAgICAgICAgIFBhdHRlcm4gaW50ZWdlclBhdHRlcm4gPSBnZXRJbnRlZ2VyUGF0dGVybihyYWRpeCk7CiAgICAgICAgIFN0cmluZyBpbnRTdHJpbmcgPSBuZXh0KGludGVnZXJQYXR0ZXJuKTsKICAgICAgICAgaW50U3RyaW5nID0gcmVtb3ZlTG9jYWxlSW5mbyhpbnRTdHJpbmcsIERhdGFUeXBlLklOVCk7CkBAIC0xMTc5LDg1ICsxMTkzLDczIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBpbnRvIGEgYm9vbGVhbiB2YWx1ZSBhbmQKLSAgICAgKiByZXR1cm5zIHRoaXMgdmFsdWUuIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbiBpZiB0aGUKLSAgICAgKiBuZXh0IHRva2VuIGNhbiBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBib29sZWFuIHZhbHVlIHdpdGggYSBjYXNlCi0gICAgICogaW5zZW5zaXRpdmUgcGF0dGVybiBjcmVhdGVkIGZyb20gdGhlIHN0cmluZyAidHJ1ZXxmYWxzZSIuIElmIHRoaXMgbWF0Y2gKLSAgICAgKiBzdWNjZWVkcywgdGhlIHNjYW5uZXIgYWR2YW5jZXMgcGFzdCB0aGUgaW5wdXQgdGhhdCBtYXRjaGVkLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgYm9vbGVhbn0uIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgaWYgaW5wdXQgaXMKKyAgICAgKiBiZWluZyByZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgYm9vbGVhbn0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZAorICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZC4KICAgICAgKiBAdGhyb3dzIElucHV0TWlzbWF0Y2hFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkIGJvb2xlYW4KLSAgICAgKiAgICAgICAgICAgICB2YWx1ZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXh0IHRva2VuIGNhbiBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYm9vbGVhbn0gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbmV4dEJvb2xlYW4oKSB7CiAgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihuZXh0KEJPT0xFQU5fUEFUVEVSTikpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgaW50byBhIGJ5dGUgdmFsdWUgYW5kCi0gICAgICogcmV0dXJucyB0aGlzIHZhbHVlLiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZCB3aGVuIGl0IGlzIHdhaXRpbmcgZm9yCi0gICAgICogaW5wdXQgdG8gc2NhbiwgZXZlbiBpZiBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgaGFzTmV4dEJ5dGUoKSByZXR1cm5lZAotICAgICAqIHRydWUuIElmIHRoaXMgbWF0Y2ggc3VjY2VlZHMsIHRoZSBzY2FubmVyIGFkdmFuY2VzIHBhc3QgdGhlIGlucHV0IHRoYXQKLSAgICAgKiBtYXRjaGVkLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgYnl0ZX0uIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgaWYgaW5wdXQgaXMgYmVpbmcKKyAgICAgKiByZWFkLiBFcXVpdmFsZW50IHRvIHtAY29kZSBuZXh0Qnl0ZShERUZBVUxUX1JBRElYKX0uCiAgICAgICogCi0gICAgICogVGhlIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QgaW4gdGhlIGZvcm0gbmV4dEJ5dGUoKSBiZWhhdmVzIGluIHRoZSBzYW1lCi0gICAgICogd2F5IGFzIHRoZSBpbnZvY2F0aW9uIG9mIG5leHRCeXRlKHJhZGl4KSwgdGhlIHJhZGl4IGlzIHRoZSBkZWZhdWx0IHJhZGl4Ci0gICAgICogb2YgdGhpcyBzY2FubmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgdmFsdWUgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgYnl0ZX0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZAorICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZC4KICAgICAgKiBAdGhyb3dzIElucHV0TWlzbWF0Y2hFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkIGJ5dGUKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZSwgb3IgaXQgaXMgb3V0IG9mIHJhbmdlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBieXRlfSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBuZXh0Qnl0ZSgpIHsKICAgICAgICAgcmV0dXJuIG5leHRCeXRlKGludGVnZXJSYWRpeCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBpbnRvIGEgYnl0ZSB2YWx1ZSBhbmQKLSAgICAgKiByZXR1cm5zIHRoaXMgdmFsdWUuIFRoaXMgbWV0aG9kIG1heSBiZSBibG9ja2VkIHdoZW4gaXQgaXMgd2FpdGluZyBmb3IKLSAgICAgKiBpbnB1dCB0byBzY2FuLCBldmVuIGlmIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBoYXNOZXh0Qnl0ZShyYWRpeCkKLSAgICAgKiByZXR1cm5lZCB0cnVlLiBJZiB0aGlzIG1hdGNoIHN1Y2NlZWRzLCB0aGUgc2Nhbm5lciBhZHZhbmNlcyBwYXN0IHRoZQotICAgICAqIGlucHV0IHRoYXQgbWF0Y2hlZC4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBJbnRlZ2VyIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWNjZXNzZnVsbHksCi0gICAgICogdGhlIHRva2VuIGlzIHRyYW5zbGF0ZWQgaW50byBhIGJ5dGUgdmFsdWUgYXMgZm9sbG93aW5nIHN0ZXBzLiBBdCBmaXJzdAotICAgICAqIGFsbCBsb2NhbGUgc3BlY2lmaWMgcHJlZml4ZXMgLGdyb3VwIHNlcGFyYXRvcnMsIGFuZCBsb2NhbGUgc3BlY2lmaWMKLSAgICAgKiBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4gVGhlbiBub24tQVNDSUkgZGlnaXRzIGFyZSBtYXBwZWQgaW50byBBU0NJSSBkaWdpdHMKLSAgICAgKiB2aWEge0BsaW5rIENoYXJhY3RlciNkaWdpdChjaGFyLCBpbnQpfX0sIGEgbmVnYXRpdmUgc2lnbiAoLSkgaXMgYWRkZWQgaWYKLSAgICAgKiB0aGUgbG9jYWxlIHNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB3ZXJlIHByZXNlbnQuIEF0IGxhc3QKLSAgICAgKiB0aGUgcmVzdWx0aW5nIFN0cmluZyBpcyBwYXNzZWQgdG8ge0BsaW5rIEJ5dGUjcGFyc2VCeXRlKFN0cmluZywgaW50KX19Ci0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHJhZGl4LgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgYnl0ZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHJhZGl4LiBXaWxsCisgICAgICogYmxvY2sgaWYgaW5wdXQgaXMgYmVpbmcgcmVhZC4gSWYgdGhlIG5leHQgdG9rZW4gY2FuIGJlIHRyYW5zbGF0ZWQgaW50byBhCisgICAgICoge0Bjb2RlIGJ5dGV9IHRoZSBmb2xsb3dpbmcgaXMgZG9uZTogQWxsIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIHByZWZpeGVzLCBncm91cAorICAgICAqIHNlcGFyYXRvcnMsIGFuZCB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4gVGhlbiBub24tQVNDSUkKKyAgICAgKiBkaWdpdHMgYXJlIG1hcHBlZCBpbnRvIEFTQ0lJIGRpZ2l0cyB2aWEKKyAgICAgKiB7QGxpbmsgQ2hhcmFjdGVyI2RpZ2l0KGNoYXIsIGludCl9LCBhbmQgYSBuZWdhdGl2ZSBzaWduICgtKSBpcyBhZGRlZCBpZiB0aGUKKyAgICAgKiB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBuZWdhdGl2ZSBwcmVmaXggb3Igc3VmZml4IHdhcyBwcmVzZW50LiBGaW5hbGx5IHRoZQorICAgICAqIHJlc3VsdGluZyBTdHJpbmcgaXMgcGFzc2VkIHRvIHtAbGluayBCeXRlI3BhcnNlQnl0ZShTdHJpbmcsIGludCl9fSB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4gaW50byBieXRlIHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgYnl0ZSB2YWx1ZSBzY2FubmVkIGZyb20gdGhlIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgcmFkaXggdXNlZCB0byB0cmFuc2xhdGUgdGhlIHRva2VuIGludG8ge0Bjb2RlIGJ5dGV9IHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgYnl0ZX0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHNjYW5uZXIgaGFzIGJlZW4gY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gaGFzIGJlZW4gY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZAorICAgICAqICAgICAgICAgICAgIGlmIGlucHV0IGhhcyBiZWVuIGV4aGF1c3RlZC4KICAgICAgKiBAdGhyb3dzIElucHV0TWlzbWF0Y2hFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkIGJ5dGUKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZSwgb3IgaXQgaXMgb3V0IG9mIHJhbmdlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBieXRlfSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgYnl0ZSBuZXh0Qnl0ZShpbnQgcmFkaXgpIHsKLSAgICAJY2hlY2tDbG9zZWQoKTsKLSAgICAJT2JqZWN0IG9iaiA9IGNhY2hlSGFzTmV4dFZhbHVlOwotCQljYWNoZUhhc05leHRWYWx1ZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBCeXRlKSB7Ci0JCQlmaW5kU3RhcnRJbmRleCA9IGNhY2hlaGFzTmV4dEluZGV4OwotCQkJcmV0dXJuIChCeXRlKSBvYmo7Ci0JCX0KKyAgICAgICAgY2hlY2tDbG9zZWQoKTsKKyAgICAgICAgT2JqZWN0IG9iaiA9IGNhY2hlSGFzTmV4dFZhbHVlOworICAgICAgICBjYWNoZUhhc05leHRWYWx1ZSA9IG51bGw7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBCeXRlKSB7CisgICAgICAgICAgICBmaW5kU3RhcnRJbmRleCA9IGNhY2hlaGFzTmV4dEluZGV4OworICAgICAgICAgICAgcmV0dXJuIChCeXRlKSBvYmo7CisgICAgICAgIH0KICAgICAgICAgUGF0dGVybiBpbnRlZ2VyUGF0dGVybiA9IGdldEludGVnZXJQYXR0ZXJuKHJhZGl4KTsKICAgICAgICAgU3RyaW5nIGludFN0cmluZyA9IG5leHQoaW50ZWdlclBhdHRlcm4pOwogICAgICAgICBpbnRTdHJpbmcgPSByZW1vdmVMb2NhbGVJbmZvKGludFN0cmluZywgRGF0YVR5cGUuSU5UKTsKQEAgLTEyNzMsNDAgKzEyNzUsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGludG8gYSBkb3VibGUgdmFsdWUgYW5kCi0gICAgICogcmV0dXJucyB0aGlzIHZhbHVlLiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZCB3aGVuIGl0IGlzIHdhaXRpbmcgZm9yCi0gICAgICogaW5wdXQgdG8gc2NhbiwgZXZlbiBpZiBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgaGFzTmV4dERvdWJsZSgpIHJldHVybmVkCi0gICAgICogdHJ1ZS4gSWYgdGhpcyBtYXRjaCBzdWNjZWVkcywgdGhlIHNjYW5uZXIgYWR2YW5jZXMgcGFzdCB0aGUgaW5wdXQgdGhhdAotICAgICAqIG1hdGNoZWQuCi0gICAgICogCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgRmxvYXQgcmVndWxhciBleHByZXNzaW9uIHN1Y2Nlc3NmdWxseSwgdGhlCi0gICAgICogdG9rZW4gaXMgdHJhbnNsYXRlZCBpbnRvIGEgZG91YmxlIHZhbHVlIGFzIGZvbGxvd2luZyBzdGVwcy4gQXQgZmlyc3QgYWxsCi0gICAgICogbG9jYWxlIHNwZWNpZmljIHByZWZpeGVzICxncm91cCBzZXBhcmF0b3JzLCBhbmQgbG9jYWxlIHNwZWNpZmljIHN1ZmZpeGVzCi0gICAgICogYXJlIHJlbW92ZWQuIFRoZW4gbm9uLUFTQ0lJIGRpZ2l0cyBhcmUgbWFwcGVkIGludG8gQVNDSUkgZGlnaXRzIHZpYQotICAgICAqIHtAbGluayBDaGFyYWN0ZXIjZGlnaXQoY2hhciwgaW50KX19LCBhIG5lZ2F0aXZlIHNpZ24gKC0pIGlzIGFkZGVkIGlmIHRoZQotICAgICAqIGxvY2FsZSBzcGVjaWZpYyBuZWdhdGl2ZSBwcmVmaXhlcyBhbmQgc3VmZml4ZXMgd2VyZSBwcmVzZW50LiBBdCBsYXN0IHRoZQotICAgICAqIHJlc3VsdGluZyBTdHJpbmcgaXMgcGFzc2VkIHRvIHtAbGluayBEb3VibGUjcGFyc2VEb3VibGUoU3RyaW5nKX19LklmIHRoZQotICAgICAqIHRva2VuIG1hdGNoZXMgdGhlIGxvY2FsaXplZCBOYU4gb3IgaW5maW5pdHkgc3RyaW5ncywgaXQgaXMgYWxzbyBwYXNzZWQgdG8KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGFzIGEge0Bjb2RlIGRvdWJsZX0uIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgaWYgaW5wdXQgaXMgYmVpbmcKKyAgICAgKiByZWFkLiBJZiB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEge0Bjb2RlIGRvdWJsZX0gdGhlCisgICAgICogZm9sbG93aW5nIGlzIGRvbmU6IEFsbCB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBwcmVmaXhlcywgZ3JvdXAgc2VwYXJhdG9ycywgYW5kCisgICAgICoge0Bjb2RlIExvY2FsZX0tc3BlY2lmaWMgc3VmZml4ZXMgYXJlIHJlbW92ZWQuIFRoZW4gbm9uLUFTQ0lJIGRpZ2l0cyBhcmUgbWFwcGVkCisgICAgICogaW50byBBU0NJSSBkaWdpdHMgdmlhIHtAbGluayBDaGFyYWN0ZXIjZGlnaXQoY2hhciwgaW50KX0sIGFuZCBhIG5lZ2F0aXZlCisgICAgICogc2lnbiAoLSkgaXMgYWRkZWQgaWYgdGhlIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeCBvciBzdWZmaXggd2FzCisgICAgICogcHJlc2VudC4gRmluYWxseSB0aGUgcmVzdWx0aW5nIFN0cmluZyBpcyBwYXNzZWQgdG8KKyAgICAgKiB7QGxpbmsgRG91YmxlI3BhcnNlRG91YmxlKFN0cmluZyl9fS4gSWYgdGhlIHRva2VuIG1hdGNoZXMgdGhlIGxvY2FsaXplZAorICAgICAqIE5hTiBvciBpbmZpbml0eSBzdHJpbmdzLCBpdCBpcyBhbHNvIHBhc3NlZCB0bwogICAgICAqIHtAbGluayBEb3VibGUjcGFyc2VEb3VibGUoU3RyaW5nKX19LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSB2YWx1ZSBzY2FubmVkIGZyb20gdGhlIGlucHV0CisgICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbiBhcyBhIHtAY29kZSBkb3VibGV9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCBkb3VibGUKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXh0IHRva2VuIGNhbiBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgZG91YmxlfSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgZG91YmxlIG5leHREb3VibGUoKSB7Ci0gICAgCWNoZWNrQ2xvc2VkKCk7Ci0gICAgCU9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKLQkJY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQlmaW5kU3RhcnRJbmRleCA9IGNhY2hlaGFzTmV4dEluZGV4OwotCQkJcmV0dXJuIChEb3VibGUpIG9iajsKLQkJfQorICAgICAgICBjaGVja0Nsb3NlZCgpOworICAgICAgICBPYmplY3Qgb2JqID0gY2FjaGVIYXNOZXh0VmFsdWU7CisgICAgICAgIGNhY2hlSGFzTmV4dFZhbHVlID0gbnVsbDsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICAgICAgZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKKyAgICAgICAgICAgIHJldHVybiAoRG91YmxlKSBvYmo7CisgICAgICAgIH0KICAgICAgICAgUGF0dGVybiBmbG9hdFBhdHRlcm4gPSBnZXRGbG9hdFBhdHRlcm4oKTsKICAgICAgICAgU3RyaW5nIGZsb2F0U3RyaW5nID0gbmV4dChmbG9hdFBhdHRlcm4pOwogICAgICAgICBmbG9hdFN0cmluZyA9IHJlbW92ZUxvY2FsZUluZm9Gcm9tRmxvYXQoZmxvYXRTdHJpbmcpOwpAQCAtMTMyMiw0MCArMTMyMCwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgdGhlIG5leHQgdG9rZW4gaW4gdGhpcyBzY2FubmVyJ3MgaW5wdXQgaW50byBhIGZsb2F0IHZhbHVlIGFuZAotICAgICAqIHJldHVybnMgdGhpcyB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGJsb2NrZWQgd2hlbiBpdCBpcyB3YWl0aW5nIGZvcgotICAgICAqIGlucHV0IHRvIHNjYW4sIGV2ZW4gaWYgYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGhhc05leHRGbG9hdCgpIHJldHVybmVkCi0gICAgICogdHJ1ZS4gSWYgdGhpcyBtYXRjaCBzdWNjZWVkcywgdGhlIHNjYW5uZXIgYWR2YW5jZXMgcGFzdCB0aGUgaW5wdXQgdGhhdAotICAgICAqIG1hdGNoZWQuCi0gICAgICogCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgRmxvYXQgcmVndWxhciBleHByZXNzaW9uIHN1Y2Nlc3NmdWxseSwgdGhlCi0gICAgICogdG9rZW4gaXMgdHJhbnNsYXRlZCBpbnRvIGEgZmxvYXQgdmFsdWUgYXMgZm9sbG93aW5nIHN0ZXBzLiBBdCBmaXJzdCBhbGwKLSAgICAgKiBsb2NhbGUgc3BlY2lmaWMgcHJlZml4ZXMgLGdyb3VwIHNlcGFyYXRvcnMsIGFuZCBsb2NhbGUgc3BlY2lmaWMgc3VmZml4ZXMKLSAgICAgKiBhcmUgcmVtb3ZlZC4gVGhlbiBub24tQVNDSUkgZGlnaXRzIGFyZSBtYXBwZWQgaW50byBBU0NJSSBkaWdpdHMgdmlhCi0gICAgICoge0BsaW5rIENoYXJhY3RlciNkaWdpdChjaGFyLCBpbnQpfX0sIGEgbmVnYXRpdmUgc2lnbiAoLSkgaXMgYWRkZWQgaWYgdGhlCi0gICAgICogbG9jYWxlIHNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB3ZXJlIHByZXNlbnQuIEF0IGxhc3QgdGhlCi0gICAgICogcmVzdWx0aW5nIFN0cmluZyBpcyBwYXNzZWQgdG8ge0BsaW5rIEZsb2F0I3BhcnNlRmxvYXQoU3RyaW5nKX19LklmIHRoZQotICAgICAqIHRva2VuIG1hdGNoZXMgdGhlIGxvY2FsaXplZCBOYU4gb3IgaW5maW5pdHkgc3RyaW5ncywgaXQgaXMgYWxzbyBwYXNzZWQgdG8KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGFzIGEge0Bjb2RlIGZsb2F0fS4gVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiBpbnB1dCBpcyBiZWluZworICAgICAqIHJlYWQuIElmIHRoZSBuZXh0IHRva2VuIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYSB7QGNvZGUgZmxvYXR9IHRoZQorICAgICAqIGZvbGxvd2luZyBpcyBkb25lOiBBbGwge0Bjb2RlIExvY2FsZX0tc3BlY2lmaWMgcHJlZml4ZXMsIGdyb3VwIHNlcGFyYXRvcnMsIGFuZAorICAgICAqIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIHN1ZmZpeGVzIGFyZSByZW1vdmVkLiBUaGVuIG5vbi1BU0NJSSBkaWdpdHMgYXJlIG1hcHBlZAorICAgICAqIGludG8gQVNDSUkgZGlnaXRzIHZpYSB7QGxpbmsgQ2hhcmFjdGVyI2RpZ2l0KGNoYXIsIGludCl9LCBhbmQgYSBuZWdhdGl2ZQorICAgICAqIHNpZ24gKC0pIGlzIGFkZGVkIGlmIHRoZSB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBuZWdhdGl2ZSBwcmVmaXggb3Igc3VmZml4IHdhcworICAgICAqIHByZXNlbnQuIEZpbmFsbHkgdGhlIHJlc3VsdGluZyBTdHJpbmcgaXMgcGFzc2VkIHRvCisgICAgICoge0BsaW5rIEZsb2F0I3BhcnNlRmxvYXQoU3RyaW5nKX19LklmIHRoZSB0b2tlbiBtYXRjaGVzIHRoZSBsb2NhbGl6ZWQgTmFOCisgICAgICogb3IgaW5maW5pdHkgc3RyaW5ncywgaXQgaXMgYWxzbyBwYXNzZWQgdG8KICAgICAgKiB7QGxpbmsgRmxvYXQjcGFyc2VGbG9hdChTdHJpbmcpfX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgdmFsdWUgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgZmxvYXR9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCBmbG9hdAotICAgICAqICAgICAgICAgICAgIHZhbHVlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBmbG9hdH0gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCiAgICAgcHVibGljIGZsb2F0IG5leHRGbG9hdCgpIHsKLSAgICAJY2hlY2tDbG9zZWQoKTsKLSAgICAJT2JqZWN0IG9iaiA9IGNhY2hlSGFzTmV4dFZhbHVlOwotCQljYWNoZUhhc05leHRWYWx1ZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCkgewotCQkJZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKLQkJCXJldHVybiAoRmxvYXQpIG9iajsKLQkJfQorICAgICAgICBjaGVja0Nsb3NlZCgpOworICAgICAgICBPYmplY3Qgb2JqID0gY2FjaGVIYXNOZXh0VmFsdWU7CisgICAgICAgIGNhY2hlSGFzTmV4dFZhbHVlID0gbnVsbDsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICBmaW5kU3RhcnRJbmRleCA9IGNhY2hlaGFzTmV4dEluZGV4OworICAgICAgICAgICAgcmV0dXJuIChGbG9hdCkgb2JqOworICAgICAgICB9CiAgICAgICAgIFBhdHRlcm4gZmxvYXRQYXR0ZXJuID0gZ2V0RmxvYXRQYXR0ZXJuKCk7CiAgICAgICAgIFN0cmluZyBmbG9hdFN0cmluZyA9IG5leHQoZmxvYXRQYXR0ZXJuKTsKICAgICAgICAgZmxvYXRTdHJpbmcgPSByZW1vdmVMb2NhbGVJbmZvRnJvbUZsb2F0KGZsb2F0U3RyaW5nKTsKQEAgLTEzNzEsNjQgKzEzNjUsNTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGludG8gYW4gaW50IHZhbHVlIGFuZAotICAgICAqIHJldHVybnMgdGhpcyB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGJsb2NrZWQgd2hlbiBpdCBpcyB3YWl0aW5nIGZvcgotICAgICAqIGlucHV0IHRvIHNjYW4sIGV2ZW4gaWYgYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGhhc05leHRJbnQoKSByZXR1cm5lZAotICAgICAqIHRydWUuIElmIHRoaXMgbWF0Y2ggc3VjY2VlZHMsIHRoZSBzY2FubmVyIGFkdmFuY2VzIHBhc3QgdGhlIGlucHV0IHRoYXQKLSAgICAgKiBtYXRjaGVkLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gYXMgYW4ge0Bjb2RlIGludH0uIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgaWYgaW5wdXQgaXMgYmVpbmcKKyAgICAgKiByZWFkLiBFcXVpdmFsZW50IHRvIHtAY29kZSBuZXh0SW50KERFRkFVTFRfUkFESVgpfS4KICAgICAgKiAKLSAgICAgKiBUaGUgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCBpbiB0aGUgZm9ybSBuZXh0SW50KCkgYmVoYXZlcyBpbiB0aGUgc2FtZQotICAgICAqIHdheSBhcyB0aGUgaW52b2NhdGlvbiBvZiBuZXh0SW50KHJhZGl4KSwgdGhlIHJhZGl4IGlzIHRoZSBkZWZhdWx0IHJhZGl4Ci0gICAgICogb2YgdGhpcyBzY2FubmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBzY2FubmVkIGZyb20gdGhlIGlucHV0CisgICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbiBhcyBhbiB7QGNvZGUgaW50fQogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCBpbnQKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXh0IHRva2VuIGNhbiBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgaW50fSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IG5leHRJbnQoKSB7CiAgICAgICAgIHJldHVybiBuZXh0SW50KGludGVnZXJSYWRpeCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBpbnRvIGFuIGludCB2YWx1ZSBhbmQKLSAgICAgKiByZXR1cm5zIHRoaXMgdmFsdWUuIFRoaXMgbWV0aG9kIG1heSBiZSBibG9ja2VkIHdoZW4gaXQgaXMgd2FpdGluZyBmb3IKLSAgICAgKiBpbnB1dCB0byBzY2FuLCBldmVuIGlmIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBoYXNOZXh0SW50KHJhZGl4KQotICAgICAqIHJldHVybmVkIHRydWUuIElmIHRoaXMgbWF0Y2ggc3VjY2VlZHMsIHRoZSBzY2FubmVyIGFkdmFuY2VzIHBhc3QgdGhlCi0gICAgICogaW5wdXQgdGhhdCBtYXRjaGVkLgotICAgICAqIAotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIEludGVnZXIgcmVndWxhciBleHByZXNzaW9uIHN1Y2Nlc3NmdWxseSwKLSAgICAgKiB0aGUgdG9rZW4gaXMgdHJhbnNsYXRlZCBpbnRvIGFuIGludCB2YWx1ZSBhcyBmb2xsb3dpbmcgc3RlcHMuIEF0IGZpcnN0Ci0gICAgICogYWxsIGxvY2FsZSBzcGVjaWZpYyBwcmVmaXhlcyAsZ3JvdXAgc2VwYXJhdG9ycywgYW5kIGxvY2FsZSBzcGVjaWZpYwotICAgICAqIHN1ZmZpeGVzIGFyZSByZW1vdmVkLiBUaGVuIG5vbi1BU0NJSSBkaWdpdHMgYXJlIG1hcHBlZCBpbnRvIEFTQ0lJIGRpZ2l0cwotICAgICAqIHZpYSBDaGFyYWN0ZXIuZGlnaXQsIGEgbmVnYXRpdmUgc2lnbiAoLSkgaXMgYWRkZWQgaWYgdGhlIGxvY2FsZSBzcGVjaWZpYwotICAgICAqIG5lZ2F0aXZlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB3ZXJlIHByZXNlbnQuIEF0IGxhc3QgdGhlIHJlc3VsdGluZyBTdHJpbmcKLSAgICAgKiBpcyBwYXNzZWQgdG8gSW50ZWdlci5wYXJzZUludCB3aXRoIHRoZSBzcGVjaWZpZWQgcmFkaXguCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBhcyBhbiB7QGNvZGUgaW50fSB3aXRoIHRoZSBzcGVjaWZpZWQgcmFkaXguIFRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiBibG9jayBpZiBpbnB1dCBpcyBiZWluZyByZWFkLiBJZiB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGFuCisgICAgICoge0Bjb2RlIGludH0gdGhlIGZvbGxvd2luZyBpcyBkb25lOiBBbGwge0Bjb2RlIExvY2FsZX0tc3BlY2lmaWMgcHJlZml4ZXMsIGdyb3VwCisgICAgICogc2VwYXJhdG9ycywgYW5kIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIHN1ZmZpeGVzIGFyZSByZW1vdmVkLiBUaGVuIG5vbi1BU0NJSQorICAgICAqIGRpZ2l0cyBhcmUgbWFwcGVkIGludG8gQVNDSUkgZGlnaXRzIHZpYQorICAgICAqIHtAbGluayBDaGFyYWN0ZXIjZGlnaXQoY2hhciwgaW50KX0sIGFuZCBhIG5lZ2F0aXZlIHNpZ24gKC0pIGlzIGFkZGVkIGlmIHRoZQorICAgICAqIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeCBvciBzdWZmaXggd2FzIHByZXNlbnQuIEZpbmFsbHkgdGhlCisgICAgICogcmVzdWx0aW5nIFN0cmluZyBpcyBwYXNzZWQgdG8ge0BsaW5rIEludGVnZXIjcGFyc2VJbnQoU3RyaW5nLCBpbnQpfSB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4gaW50byBhbiBpbnQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIGFuIHtAY29kZSBpbnR9CisgICAgICogICAgICAgICAgICB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHRva2VuIGFzIGFuIHtAY29kZSBpbnR9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCBpbnQKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXh0IHRva2VuIGNhbiBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgaW50fSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgaW50IG5leHRJbnQoaW50IHJhZGl4KSB7Ci0gICAgCWNoZWNrQ2xvc2VkKCk7Ci0gICAgCU9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKLQkJY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKLQkJCXJldHVybiAoSW50ZWdlcikgb2JqOwotCQl9CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgICAgIE9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKKyAgICAgICAgY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKKyAgICAgICAgICAgIHJldHVybiAoSW50ZWdlcikgb2JqOworICAgICAgICB9CiAgICAgICAgIFBhdHRlcm4gaW50ZWdlclBhdHRlcm4gPSBnZXRJbnRlZ2VyUGF0dGVybihyYWRpeCk7CiAgICAgICAgIFN0cmluZyBpbnRTdHJpbmc9bmV4dChpbnRlZ2VyUGF0dGVybik7CiAgICAgICAgIGludFN0cmluZyA9IHJlbW92ZUxvY2FsZUluZm8oaW50U3RyaW5nLCBEYXRhVHlwZS5JTlQpOwpAQCAtMTQ0NCwxOCArMTQzMCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNraXBwZWQgaW5wdXQgYW5kIGFkdmFuY2VzIHRoZSBzY2FubmVyIHRvIHRoZSBiZWdpbm5pbmcgb2YKLSAgICAgKiB0aGUgbmV4dCBsaW5lLiBUaGUgcmV0dXJuZWQgcmVzdWx0IHdpbGwgZXhjbHVkZSBhbnkgbGluZSB0ZXJtaW5hdG9yLgorICAgICAqIFJldHVybnMgdGhlIHNraXBwZWQgaW5wdXQgYW5kIGFkdmFuY2VzIHRoZSB7QGNvZGUgU2Nhbm5lcn0gdG8gdGhlIGJlZ2lubmluZyBvZgorICAgICAqIHRoZSBuZXh0IGxpbmUuIFRoZSByZXR1cm5lZCByZXN1bHQgd2lsbCBleGNsdWRlIGFueSBsaW5lIHRlcm1pbmF0b3IuIFdoZW4KKyAgICAgKiBzZWFyY2hpbmcsIGlmIG5vIGxpbmUgdGVybWluYXRvciBpcyBmb3VuZCwgdGhlbiBhIGxhcmdlIGFtb3VudCBvZiBpbnB1dAorICAgICAqIHdpbGwgYmUgY2FjaGVkLiBJZiBubyBsaW5lIGF0IGFsbCBjYW4gYmUgZm91bmQsIGEge0Bjb2RlIE5vU3VjaEVsZW1lbnRFeGNlcHRpb259CisgICAgICogd2lsbCBiZSB0aHJvd24uCiAgICAgICogCi0gICAgICogV2hlbiBzZWFyY2hpbmcsIGlmIG5vIGxpbmUgdGVybWluYXRvciBpcyBmb3VuZCwgdGhlbiBhIGxhcmdlIGFtb3VudCBvZgotICAgICAqIGlucHV0IHdpbGwgYmUgY2FjaGVkLiBJZiBubyBsaW5lIGF0IGFsbCBjYW4gYmUgZm91bmQsIGEKLSAgICAgKiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG91dC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBza2lwcGVkIGxpbmUKKyAgICAgKiBAcmV0dXJuIHRoZSBza2lwcGVkIGxpbmUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2Nhbm5lciBpcyBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFNjYW5uZXJ9IGlzIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBubyBsaW5lIGNhbiBiZSBmb3VuZCwgZS5nLiB3aGVuIGlucHV0IGlzIGFuIGVtcHR5IHN0cmluZworICAgICAqICAgICAgICAgICAgIGlmIG5vIGxpbmUgY2FuIGJlIGZvdW5kLCBlLmcuIHdoZW4gaW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgbmV4dExpbmUoKSB7CiAgICAgICAgIGNoZWNrQ2xvc2VkKCk7CkBAIC0xNDkzLDY1ICsxNDc5LDU2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBpbnRvIGEgbG9uZyB2YWx1ZSBhbmQKLSAgICAgKiByZXR1cm5zIHRoaXMgdmFsdWUuIFRoaXMgbWV0aG9kIG1heSBiZSBibG9ja2VkIHdoZW4gaXQgaXMgd2FpdGluZyBmb3IKLSAgICAgKiBpbnB1dCB0byBzY2FuLCBldmVuIGlmIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBoYXNOZXh0TG9uZygpIHJldHVybmVkCi0gICAgICogdHJ1ZS4gSWYgdGhpcyBtYXRjaCBzdWNjZWVkcywgdGhlIHNjYW5uZXIgYWR2YW5jZXMgcGFzdCB0aGUgaW5wdXQgdGhhdAotICAgICAqIG1hdGNoZWQuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBhcyBhIHtAY29kZSBsb25nfS4gVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiBpbnB1dCBpcyBiZWluZworICAgICAqIHJlYWQuIEVxdWl2YWxlbnQgdG8ge0Bjb2RlIG5leHRMb25nKERFRkFVTFRfUkFESVgpfS4KICAgICAgKiAKLSAgICAgKiBUaGUgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCBpbiB0aGUgZm9ybSBuZXh0TG9uZygpIGJlaGF2ZXMgaW4gdGhlIHNhbWUKLSAgICAgKiB3YXkgYXMgdGhlIGludm9jYXRpb24gb2YgbmV4dExvbmcocmFkaXgpLCB0aGUgcmFkaXggaXMgdGhlIGRlZmF1bHQgcmFkaXgKLSAgICAgKiBvZiB0aGlzIHNjYW5uZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9uZyB2YWx1ZSBzY2FubmVkIGZyb20gdGhlIGlucHV0CisgICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbiBhcyBhIHtAY29kZSBsb25nfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgc2Nhbm5lciBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBTY2FubmVyfSBoYXMgYmVlbiBjbG9zZWQuCiAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgaW5wdXQgaGFzIGJlZW4gZXhoYXVzdGVkCisgICAgICogICAgICAgICAgICAgaWYgaW5wdXQgaGFzIGJlZW4gZXhoYXVzdGVkLgogICAgICAqIEB0aHJvd3MgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXh0IHRva2VuIGNhbiBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQgbG9uZwotICAgICAqICAgICAgICAgICAgIHZhbHVlLCBvciBpdCBpcyBvdXQgb2YgcmFuZ2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxvbmd9IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIG5leHRMb25nKCkgewogICAgICAgICByZXR1cm4gbmV4dExvbmcoaW50ZWdlclJhZGl4KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHRoZSBuZXh0IHRva2VuIGluIHRoaXMgc2Nhbm5lcidzIGlucHV0IGludG8gYSBsb25nIHZhbHVlIGFuZAotICAgICAqIHJldHVybnMgdGhpcyB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGJsb2NrZWQgd2hlbiBpdCBpcyB3YWl0aW5nIGZvcgotICAgICAqIGlucHV0IHRvIHNjYW4sIGV2ZW4gaWYgYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGhhc05leHRMb25nKHJhZGl4KQotICAgICAqIHJldHVybmVkIHRydWUuIElmIHRoaXMgbWF0Y2ggc3VjY2VlZHMsIHRoZSBzY2FubmVyIGFkdmFuY2VzIHBhc3QgdGhlCi0gICAgICogaW5wdXQgdGhhdCBtYXRjaGVkLgotICAgICAqIAotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIEludGVnZXIgcmVndWxhciBleHByZXNzaW9uIHN1Y2Nlc3NmdWxseSwKLSAgICAgKiB0aGUgdG9rZW4gaXMgdHJhbnNsYXRlZCBpbnRvIGEgbG9uZyB2YWx1ZSBhcyBmb2xsb3dpbmcgc3RlcHMuIEF0IGZpcnN0Ci0gICAgICogYWxsIGxvY2FsZSBzcGVjaWZpYyBwcmVmaXhlcywgZ3JvdXAgc2VwYXJhdG9ycywgYW5kIGxvY2FsZSBzcGVjaWZpYwotICAgICAqIHN1ZmZpeGVzIGFyZSByZW1vdmVkLiBUaGVuIG5vbi1BU0NJSSBkaWdpdHMgYXJlIG1hcHBlZCBpbnRvIEFTQ0lJIGRpZ2l0cwotICAgICAqIHZpYSB7QGxpbmsgQ2hhcmFjdGVyI2RpZ2l0KGNoYXIsIGludCl9fSwgYSBuZWdhdGl2ZSBzaWduICgtKSBpcyBhZGRlZCBpZgotICAgICAqIHRoZSBsb2NhbGUgc3BlY2lmaWMgbmVnYXRpdmUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHdlcmUgcHJlc2VudC4gQXQgbGFzdAotICAgICAqIHRoZSByZXN1bHRpbmcgU3RyaW5nIGlzIHBhc3NlZCB0byB7QGxpbmsgTG9uZyNwYXJzZUxvbmcoU3RyaW5nLCBpbnQpfX0KLSAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcmFkaXguCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBhcyBhIHtAY29kZSBsb25nfSB3aXRoIHRoZSBzcGVjaWZpZWQgcmFkaXguIFRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiBibG9jayBpZiBpbnB1dCBpcyBiZWluZyByZWFkLiBJZiB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEKKyAgICAgKiB7QGNvZGUgbG9uZ30gdGhlIGZvbGxvd2luZyBpcyBkb25lOiBBbGwge0Bjb2RlIExvY2FsZX0tc3BlY2lmaWMgcHJlZml4ZXMsIGdyb3VwCisgICAgICogc2VwYXJhdG9ycywgYW5kIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIHN1ZmZpeGVzIGFyZSByZW1vdmVkLiBUaGVuIG5vbi1BU0NJSQorICAgICAqIGRpZ2l0cyBhcmUgbWFwcGVkIGludG8gQVNDSUkgZGlnaXRzIHZpYQorICAgICAqIHtAbGluayBDaGFyYWN0ZXIjZGlnaXQoY2hhciwgaW50KX0sIGFuZCBhIG5lZ2F0aXZlIHNpZ24gKC0pIGlzIGFkZGVkIGlmIHRoZQorICAgICAqIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeCBvciBzdWZmaXggd2FzIHByZXNlbnQuIEZpbmFsbHkgdGhlCisgICAgICogcmVzdWx0aW5nIFN0cmluZyBpcyBwYXNzZWQgdG8ge0BsaW5rIExvbmcjcGFyc2VMb25nKFN0cmluZywgaW50KX19IHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHJhZGl4LgogICAgICAqIAogICAgICAqIEBwYXJhbSByYWRpeAotICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIGEgbG9uZyB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIGxvbmcgdmFsdWUgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIGEge0Bjb2RlIGxvbmd9CisgICAgICogICAgICAgICAgICB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHRva2VuIGFzIGEge0Bjb2RlIGxvbmd9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCBsb25nCi0gICAgICogICAgICAgICAgICAgdmFsdWUsIG9yIGl0IGlzIG91dCBvZiByYW5nZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXh0IHRva2VuIGNhbiBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbG9uZ30gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCiAgICAgcHVibGljIGxvbmcgbmV4dExvbmcoaW50IHJhZGl4KSB7Ci0gICAgCWNoZWNrQ2xvc2VkKCk7Ci0gICAgCU9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKLQkJY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTG9uZykgewotCQkJZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKLQkJCXJldHVybiAoTG9uZykgb2JqOwotCQl9CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgICAgIE9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKKyAgICAgICAgY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgZmluZFN0YXJ0SW5kZXggPSBjYWNoZWhhc05leHRJbmRleDsKKyAgICAgICAgICAgIHJldHVybiAoTG9uZykgb2JqOworICAgICAgICB9CiAgICAgICAgIFBhdHRlcm4gaW50ZWdlclBhdHRlcm4gPSBnZXRJbnRlZ2VyUGF0dGVybihyYWRpeCk7CiAgICAgICAgIFN0cmluZyBpbnRTdHJpbmcgPSBuZXh0KGludGVnZXJQYXR0ZXJuKTsKICAgICAgICAgaW50U3RyaW5nID0gcmVtb3ZlTG9jYWxlSW5mbyhpbnRTdHJpbmcsIERhdGFUeXBlLklOVCk7CkBAIC0xNTY3LDY1ICsxNTQ0LDU2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBpbnRvIGEgc2hvcnQgdmFsdWUgYW5kCi0gICAgICogcmV0dXJucyB0aGlzIHZhbHVlLiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZCB3aGVuIGl0IGlzIHdhaXRpbmcgZm9yCi0gICAgICogaW5wdXQgdG8gc2NhbiwgZXZlbiBpZiBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgaGFzTmV4dFNob3J0KCkgcmV0dXJuZWQKLSAgICAgKiB0cnVlLiBJZiB0aGlzIG1hdGNoIHN1Y2NlZWRzLCB0aGUgc2Nhbm5lciBhZHZhbmNlcyBwYXN0IHRoZSBpbnB1dCB0aGF0Ci0gICAgICogbWF0Y2hlZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGFzIGEge0Bjb2RlIHNob3J0fS4gVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiBpbnB1dCBpcyBiZWluZworICAgICAqIHJlYWQuIEVxdWl2YWxlbnQgdG8ge0Bjb2RlIG5leHRTaG9ydChERUZBVUxUX1JBRElYKX0uCiAgICAgICogCi0gICAgICogVGhlIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QgaW4gdGhlIGZvcm0gbmV4dFNob3J0KCkgYmVoYXZlcyBpbiB0aGUgc2FtZQotICAgICAqIHdheSBhcyB0aGUgaW52b2NhdGlvbiBvZiBuZXh0U2hvcnQocmFkaXgpLCB0aGUgcmFkaXggaXMgdGhlIGRlZmF1bHQgcmFkaXgKLSAgICAgKiBvZiB0aGlzIHNjYW5uZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hvcnQgdmFsdWUgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgc2hvcnR9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCBzaG9ydAotICAgICAqICAgICAgICAgICAgIHZhbHVlLCBvciBpdCBpcyBvdXQgb2YgcmFuZ2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHNob3J0fSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnQgbmV4dFNob3J0KCkgewogICAgICAgICByZXR1cm4gbmV4dFNob3J0KGludGVnZXJSYWRpeCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyB0aGUgbmV4dCB0b2tlbiBpbiB0aGlzIHNjYW5uZXIncyBpbnB1dCBpbnRvIGEgc2hvcnQgdmFsdWUgYW5kCi0gICAgICogcmV0dXJucyB0aGlzIHZhbHVlLiBUaGlzIG1ldGhvZCBtYXkgYmUgYmxvY2tlZCB3aGVuIGl0IGlzIHdhaXRpbmcgZm9yCi0gICAgICogaW5wdXQgdG8gc2NhbiwgZXZlbiBpZiBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgaGFzTmV4dFNob3J0KHJhZGl4KQotICAgICAqIHJldHVybmVkIHRydWUuIElmIHRoaXMgbWF0Y2ggc3VjY2VlZHMsIHRoZSBzY2FubmVyIGFkdmFuY2VzIHBhc3QgdGhlCi0gICAgICogaW5wdXQgdGhhdCBtYXRjaGVkLgotICAgICAqIAotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIEludGVnZXIgcmVndWxhciBleHByZXNzaW9uIHN1Y2Nlc3NmdWxseSwKLSAgICAgKiB0aGUgdG9rZW4gaXMgdHJhbnNsYXRlZCBpbnRvIGEgc2hvcnQgdmFsdWUgYXMgZm9sbG93aW5nIHN0ZXBzLiBBdCBmaXJzdAotICAgICAqIGFsbCBsb2NhbGUgc3BlY2lmaWMgcHJlZml4ZXMsIGdyb3VwIHNlcGFyYXRvcnMsIGFuZCBsb2NhbGUgc3BlY2lmaWMKLSAgICAgKiBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4gVGhlbiBub24tQVNDSUkgZGlnaXRzIGFyZSBtYXBwZWQgaW50byBBU0NJSSBkaWdpdHMKLSAgICAgKiB2aWEge0BsaW5rIENoYXJhY3RlciNkaWdpdChjaGFyLCBpbnQpfX0sIGEgbmVnYXRpdmUgc2lnbiAoLSkgaXMgYWRkZWQgaWYKLSAgICAgKiB0aGUgbG9jYWxlIHNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB3ZXJlIHByZXNlbnQuIEF0IGxhc3QKLSAgICAgKiB0aGUgcmVzdWx0aW5nIFN0cmluZyBpcyBwYXNzZWQgdG8ge0BsaW5rIFNob3J0I3BhcnNlU2hvcnQoU3RyaW5nLCBpbnQpfX0KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGFzIGEge0Bjb2RlIHNob3J0fSB3aXRoIHRoZSBzcGVjaWZpZWQgcmFkaXguIFRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiBibG9jayBpZiBpbnB1dCBpcyBiZWluZyByZWFkLiBJZiB0aGUgbmV4dCB0b2tlbiBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGEKKyAgICAgKiB7QGNvZGUgc2hvcnR9IHRoZSBmb2xsb3dpbmcgaXMgZG9uZTogQWxsIHtAY29kZSBMb2NhbGV9LXNwZWNpZmljIHByZWZpeGVzLCBncm91cAorICAgICAqIHNlcGFyYXRvcnMsIGFuZCB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4gVGhlbiBub24tQVNDSUkKKyAgICAgKiBkaWdpdHMgYXJlIG1hcHBlZCBpbnRvIEFTQ0lJIGRpZ2l0cyB2aWEKKyAgICAgKiB7QGxpbmsgQ2hhcmFjdGVyI2RpZ2l0KGNoYXIsIGludCl9LCBhbmQgYSBuZWdhdGl2ZSBzaWduICgtKSBpcyBhZGRlZCBpZiB0aGUKKyAgICAgKiB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBuZWdhdGl2ZSBwcmVmaXggb3Igc3VmZml4IHdhcyBwcmVzZW50LiBGaW5hbGx5IHRoZQorICAgICAqIHJlc3VsdGluZyBTdHJpbmcgaXMgcGFzc2VkIHRvIHtAbGluayBTaG9ydCNwYXJzZVNob3J0KFN0cmluZywgaW50KX19CiAgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHJhZGl4LgogICAgICAqIAogICAgICAqIEBwYXJhbSByYWRpeAotICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIHNob3J0IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgc2hvcnQgdmFsdWUgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIHJhZGl4IHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbiBpbnRvIHtAY29kZSBzaG9ydH0KKyAgICAgKiAgICAgICAgICAgIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgYSB7QGNvZGUgc2hvcnR9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBzY2FubmVyIGhhcyBiZWVuIGNsb3NlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnB1dCBoYXMgYmVlbiBleGhhdXN0ZWQuCiAgICAgICogQHRocm93cyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIG5leHQgdG9rZW4gY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gYSB2YWxpZCBzaG9ydAotICAgICAqICAgICAgICAgICAgIHZhbHVlLCBvciBpdCBpcyBvdXQgb2YgcmFuZ2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbmV4dCB0b2tlbiBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIHZhbGlkCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHNob3J0fSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgc2hvcnQgbmV4dFNob3J0KGludCByYWRpeCkgewotICAgIAljaGVja0Nsb3NlZCgpOwotICAgIAlPYmplY3Qgb2JqID0gY2FjaGVIYXNOZXh0VmFsdWU7Ci0JCWNhY2hlSGFzTmV4dFZhbHVlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNob3J0KSB7Ci0JCQlmaW5kU3RhcnRJbmRleCA9IGNhY2hlaGFzTmV4dEluZGV4OwotCQkJcmV0dXJuIChTaG9ydCkgb2JqOwotCQl9CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgICAgIE9iamVjdCBvYmogPSBjYWNoZUhhc05leHRWYWx1ZTsKKyAgICAgICAgY2FjaGVIYXNOZXh0VmFsdWUgPSBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU2hvcnQpIHsKKyAgICAgICAgICAgIGZpbmRTdGFydEluZGV4ID0gY2FjaGVoYXNOZXh0SW5kZXg7CisgICAgICAgICAgICByZXR1cm4gKFNob3J0KSBvYmo7CisgICAgICAgIH0KICAgICAgICAgUGF0dGVybiBpbnRlZ2VyUGF0dGVybiA9IGdldEludGVnZXJQYXR0ZXJuKHJhZGl4KTsKICAgICAgICAgU3RyaW5nIGludFN0cmluZyA9IG5leHQoaW50ZWdlclBhdHRlcm4pOwogICAgICAgICBpbnRTdHJpbmcgPSByZW1vdmVMb2NhbGVJbmZvKGludFN0cmluZywgRGF0YVR5cGUuSU5UKTsKQEAgLTE2NDEsMzUgKzE2MDksMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHJhZGl4IG9mIHRoaXMgc2Nhbm5lci4KKyAgICAgKiBSZXR1cm4gdGhlIHJhZGl4IG9mIHRoaXMge0Bjb2RlIFNjYW5uZXJ9LgogICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgICAgICAgIHRoZSByYWRpeCBvZiB0aGlzIHNjYW5uZXIKKyAgICAgKiBAcmV0dXJuIHRoZSByYWRpeCBvZiB0aGlzIHtAY29kZSBTY2FubmVyfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmFkaXgoKSB7CiAgICAgICAgIHJldHVybiBpbnRlZ2VyUmFkaXg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJpZXMgdG8gdXNlIHNwZWNpZmllZCBwYXR0ZXJuIHRvIG1hdGNoIGlucHV0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gICAgICogVGhlIGRlbGltaXRlciB3aWxsIGJlIGlnbm9yZWQuIElmIG1hdGNoZXMsIHRoZSBtYXRjaGVkIGlucHV0IHdpbGwgYmUKLSAgICAgKiBza2lwcGVkLiBJZiBhbiBhbmNob3JlZCBtYXRjaCBvZiB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gc3VjY2VlZHMsIGlucHV0Ci0gICAgICogd2lsbCBhbHNvIGJlIHNraXBwZWQuIE90aGVyd2lzZSwgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0gICAgICogb3V0LgotICAgICAqIAotICAgICAqIFBhdHRlcm5zIHRoYXQgY2FuIG1hdGNoIGEgbG90IG9mIGlucHV0IG1heSBjYXVzZSB0aGUgc2Nhbm5lciB0byByZWFkIGluIGEKLSAgICAgKiBsYXJnZSBhbW91bnQgb2YgaW5wdXQuCi0gICAgICogCi0gICAgICogVXNlcyBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIG5vdGhpbmcoIHNjLnNraXAoUGF0dGVybi5jb21waWxlKCJbIFx0XSoiKSkgKQotICAgICAqIHdpbGwgc3VwcHJlc3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4KKyAgICAgKiBUcmllcyB0byB1c2Ugc3BlY2lmaWVkIHBhdHRlcm4gdG8gbWF0Y2ggaW5wdXQgc3RhcnRpbmcgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBUaGUgZGVsaW1pdGVyIHdpbGwgYmUgaWdub3JlZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG1hdGNoZWQgaW5wdXQgd2lsbCBiZQorICAgICAqIHNraXBwZWQuIElmIGFuIGFuY2hvcmVkIG1hdGNoIG9mIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBzdWNjZWVkcywgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQKKyAgICAgKiB3aWxsIGFsc28gYmUgc2tpcHBlZC4gT3RoZXJ3aXNlLCBhIHtAY29kZSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBQYXR0ZXJucyB0aGF0IGNhbiBtYXRjaCBhIGxvdCBvZiBpbnB1dCBtYXkgY2F1c2UgdGhlIHtAY29kZSBTY2FubmVyfSB0byByZWFkCisgICAgICogaW4gYSBsYXJnZSBhbW91bnQgb2YgaW5wdXQuIAogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB1c2VkIHRvIHNraXAgb3ZlciBpbnB1dAotICAgICAqIEByZXR1cm4gdGhlIHNjYW5uZXIgaXRzZWxmCisgICAgICogICAgICAgICAgICB1c2VkIHRvIHNraXAgb3ZlciBpbnB1dC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaXRzZWxmLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaXMgY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIG1hdGNoIGZhaWxzCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIG1hdGNoIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTY2FubmVyIHNraXAoUGF0dGVybiBwYXR0ZXJuKSB7CiAgICAgICAgIGNoZWNrQ2xvc2VkKCk7CkBAIC0xNzAwLDI5ICsxNjY0LDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJpZXMgdG8gdXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGNvbnN0cnVjdCBhIHBhdHRlcm4uIEFuZCB0aGVuIHVzZXMKLSAgICAgKiB0aGUgY29uc3RydWN0ZWQgcGF0dGVybiB0byBtYXRjaCBpbnB1dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBUaGUKLSAgICAgKiBkZWxpbWl0ZXIgd2lsbCBiZSBpZ25vcmVkLgotICAgICAqIAotICAgICAqIEl0IGlzIHRoZSBzYW1lIGFzIGludm9rZSBza2lwKFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSkKKyAgICAgKiBUcmllcyB0byB1c2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gY29uc3RydWN0IGEgcGF0dGVybiBhbmQgdGhlbiB1c2VzCisgICAgICogdGhlIGNvbnN0cnVjdGVkIHBhdHRlcm4gdG8gbWF0Y2ggaW5wdXQgc3RhcnRpbmcgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4gVGhlCisgICAgICogZGVsaW1pdGVyIHdpbGwgYmUgaWdub3JlZC4gVGhpcyBjYWxsIGlzIHRoZSBzYW1lIGFzIGludm9rZQorICAgICAqIHtAY29kZSBza2lwKFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHVzZWQgdG8gY29uc3RydWN0IGEgcGF0dGVybiB3aGljaCBpbiB0dXJuIHVzZWQgdG8KLSAgICAgKiAgICAgICAgICAgIG1hdGNoIGlucHV0Ci0gICAgICogQHJldHVybiB0aGUgbWF0Y2hlZCBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB1c2VkIHRvIGNvbnN0cnVjdCBhIHBhdHRlcm4gd2hpY2ggaW4gdHVybiBpcyB1c2VkIHRvCisgICAgICogICAgICAgICAgICBtYXRjaCBpbnB1dC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgU2Nhbm5lcn0gaXRzZWxmLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNjYW5uZXIgaXMgY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBTY2FubmVyfSBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNjYW5uZXIgc2tpcChTdHJpbmcgcGF0dGVybikgewogICAgICAgICByZXR1cm4gc2tpcChQYXR0ZXJuLmNvbXBpbGUocGF0dGVybikpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcuIFRoZSBzdHJpbmcgaXMgdXNlZCB0byByZXByZXNlbnQgdGhpcyBzY2FubmVyLiBDb250YWluZWQKLSAgICAgKiBpbmZvcm1hdGlvbiBtYXkgYmUgaGVscGZ1bCBmb3IgZGVidWdnaW5nLiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMKLSAgICAgKiB1bnNwZWNpZmllZC4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFNjYW5uZXJ9LiBUaGUgaW5mb3JtYXRpb24KKyAgICAgKiByZXR1cm5lZCBtYXkgYmUgaGVscGZ1bCBmb3IgZGVidWdnaW5nLiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgdW5zcGVjaWZpZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyB0byByZXByZXNlbnQgdGhpcyBzY2FubmVyCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbmRhdGlvbiBvZiB0aGlzIHtAY29kZSBTY2FubmVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMTczNywxMSArMTcwMSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVsaW1pdGluZyBwYXR0ZXJuIG9mIHRoaXMgc2Nhbm5lcgorICAgICAqIFNldHMgdGhlIGRlbGltaXRpbmcgcGF0dGVybiBvZiB0aGlzIHtAY29kZSBTY2FubmVyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIGRlbGltaXRpbmcgcGF0dGVybiB0byB1c2UKLSAgICAgKiBAcmV0dXJuIHRoaXMgc2Nhbm5lcgorICAgICAqICAgICAgICAgICAgdGhlIGRlbGltaXRpbmcgcGF0dGVybiB0byB1c2UuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBTY2FubmVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2Nhbm5lciB1c2VEZWxpbWl0ZXIoUGF0dGVybiBwYXR0ZXJuKSB7CiAgICAgICAgIGRlbGltaXRlciA9IHBhdHRlcm47CkBAIC0xNzQ5LDI1ICsxNzE0LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBkZWxpbWl0aW5nIHBhdHRlcm4gb2YgdGhpcyBzY2FubmVyIHdpdGggYSBwYXR0ZXJuIGNvbXBpbGVkIGZyb20KLSAgICAgKiB0aGUgc3VwcGxpZWQgc3RyaW5nIHZhbHVlCisgICAgICogU2V0cyB0aGUgZGVsaW1pdGluZyBwYXR0ZXJuIG9mIHRoaXMge0Bjb2RlIFNjYW5uZXJ9IHdpdGggYSBwYXR0ZXJuIGNvbXBpbGVkIGZyb20KKyAgICAgKiB0aGUgc3VwcGxpZWQgc3RyaW5nIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyBmcm9tIHdoaWNoIGEgPGNvZGU+UGF0dGVybjwvY29kZT4gY2FuIGJlIGNvbXBpbGVkCi0gICAgICogQHJldHVybiB0aGlzIHNjYW5uZXIKKyAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIGZyb20gd2hpY2ggYSB7QGNvZGUgUGF0dGVybn0gY2FuIGJlIGNvbXBpbGVkLgorICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgU2Nhbm5lcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNjYW5uZXIgdXNlRGVsaW1pdGVyKFN0cmluZyBwYXR0ZXJuKSB7CiAgICAgICAgIHJldHVybiB1c2VEZWxpbWl0ZXIoUGF0dGVybi5jb21waWxlKHBhdHRlcm4pKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB7QGNvZGUgTG9jYWxlfSBvZiB0aGlzIHtAY29kZSBTY2FubmVyfSB0byBhIHNwZWNpZmllZCB7QGNvZGUgTG9jYWxlfS4KICAgICAgKiAKLSAgICAgKiBTZXQgdGhlIGxvY2FsZSBvZiB0aGlzIHNjYW5uZXIgdG8gYSBzcGVjaWZpZWQgbG9jYWxlLiAKLSAgICAgKgogICAgICAqIEBwYXJhbSBsCi0gICAgICogICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbG9jYWxlIHRvIHVzZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgICAgICAgICAgdGhpcyBzY2FubmVyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9IHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIFNjYW5uZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTY2FubmVyIHVzZUxvY2FsZShMb2NhbGUgbCkgewogICAgICAgICBpZiAobnVsbCA9PSBsKSB7CkBAIC0xNzc4LDEzICsxNzQzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogCi0gICAgICogU2V0IHRoZSByYWRpeCBvZiB0aGlzIHNjYW5uZXIgdG8gYSBzcGVjaWZpZWQgcmFkaXguCisgICAgICogU2V0cyB0aGUgcmFkaXggb2YgdGhpcyB7QGNvZGUgU2Nhbm5lcn0gdG8gdGhlIHNwZWNpZmllZCByYWRpeC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKLSAgICAgKiAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHJhZGl4IHRvIHVzZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgICAgICAgICB0aGlzIHNjYW5uZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmFkaXggdG8gdXNlLgorICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgU2Nhbm5lcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNjYW5uZXIgdXNlUmFkaXgoaW50IHJhZGl4KSB7CiAgICAgICAgIGlmIChyYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVggfHwgcmFkaXggPiBDaGFyYWN0ZXIuTUFYX1JBRElYKSB7CkBAIC0xNzk2LDE5ICsxNzYwLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVtb3ZlIGlzIG5vdCBhIHN1cHBvcnRlZCBvcGVyYXRpb24gb24ge0Bjb2RlIFNjYW5uZXJ9LgogICAgICAqIAotICAgICAqIFRoZSBvcGVyYXRpb24gb2YgcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIEl0ZXJhdG9yLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gCi0gICAgICogICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKgotICAgICAqIEluaXRpYWwgc29tZSBjb21wb25lbnRzLgorICAgICAqIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXphdGlvbigpIHsKICAgICAgICAgYnVmZmVyID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZShERUZBVUxUX1RSVU5LX1NJWkUpOwpAQCAtMTgxNyw3ICsxNzgwLDcgQEAKICAgICB9CiAgICAgCiAgICAgLyoKLSAgICAgKiBDaGVjayB0aGUgc2Nhbm5lcidzIHN0YXRlLCBpZiBpdCBpcyBjbG9zZWQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlCisgICAgICogQ2hlY2sgdGhlIHtAY29kZSBTY2FubmVyfSdzIHN0YXRlLCBpZiBpdCBpcyBjbG9zZWQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlCiAgICAgICogdGhyb3duLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjaGVja0Nsb3NlZCgpIHsKQEAgLTE4NTYsNyArMTgxOSw3IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBDaGFuZ2UgdGhlIG1hdGNoZXIncyBzdGF0dXMgdG8gIGxhc3QgZmluZCBwb3NpdGlvbgorICAgICAqIENoYW5nZSB0aGUgbWF0Y2hlcidzIHN0YXR1cyB0byBsYXN0IGZpbmQgcG9zaXRpb24KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVjb3ZlclByZXZpb3VzU3RhdHVzKCkgewogICAgICAgICBmaW5kU3RhcnRJbmRleCA9IHByZVN0YXJ0SW5kZXg7CkBAIC0xOTQ5LDcgKzE5MTIsNyBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogQWRkIHRoZSBsb2NhbGUgc3BlY2lmaWMgcG9zaXRpdmUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHRvIHRoZSBwYXR0ZXJuCisgICAgICogQWRkIHRoZSB7QGNvZGUgTG9jYWxlfS1zcGVjaWZpYyBwb3NpdGl2ZSBwcmVmaXhlcyBhbmQgc3VmZml4ZXMgdG8gdGhlIHBhdHRlcm4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgYWRkUG9zaXRpdmVTaWduKFN0cmluZ0J1aWxkZXIgdW5TaWduTnVtZXJhbCkgewogICAgICAgICBTdHJpbmcgcG9zaXRpdmVQcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJApAQCAtMTk2Nyw3ICsxOTMwLDcgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIEFkZCB0aGUgbG9jYWxlIHNwZWNpZmljIG5lZ2F0aXZlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB0byB0aGUgcGF0dGVybgorICAgICAqIEFkZCB0aGUge0Bjb2RlIExvY2FsZX0gc3BlY2lmaWMgbmVnYXRpdmUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHRvIHRoZSBwYXR0ZXJuCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGFkZE5lZ2F0aXZlU2lnbihTdHJpbmdCdWlsZGVyIHVuU2lnbk51bWVyYWwpIHsKICAgICAgICAgU3RyaW5nIG5lZ2F0aXZlUHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKQEAgLTE5ODUsNyArMTk0OCw3IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBSZW1vdmUgbG9jYWxlIHJlbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSBmbG9hdCBTdHJpbmcKKyAgICAgKiBSZW1vdmUge0Bjb2RlIExvY2FsZX0gcmVsYXRlZCBpbmZvcm1hdGlvbiBmcm9tIGZsb2F0IFN0cmluZwogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZUxvY2FsZUluZm9Gcm9tRmxvYXQoU3RyaW5nIGZsb2F0U3RyaW5nKSB7CiAgICAgICAgIC8vIElmIHRoZSB0b2tlbiBpcyBIZXhGbG9hdApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU2V0LmphdmEKaW5kZXggM2ZlY2E0Zi4uZjUyNjY2ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TZXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NldC5qYXZhCkBAIC0xOSwxODAgKzE5LDE5MyBAQAogCiAKIC8qKgotICogU2V0IGlzIGEgY29sbGVjdGlvbiB3aGljaCBkb2VzIG5vdCBhbGxvdyBkdXBsaWNhdGUgZWxlbWVudHMuCi0gKiBAc2luY2UgMS4yCisgKiBBIHtAY29kZSBTZXR9IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggZG9lcyBub3QgYWxsb3cgZHVwbGljYXRlIGVsZW1lbnRzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTZXQ8RT4gZXh0ZW5kcyBDb2xsZWN0aW9uPEU+IHsKICAgICAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMgU2V0LiBUaGUgU2V0IGlzIG5vdCBtb2RpZmllZCBpZiBpdAorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBzZXQuIFRoZSBzZXQgaXMgbm90IG1vZGlmaWVkIGlmIGl0CiAgICAgICogYWxyZWFkeSBjb250YWlucyB0aGUgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgU2V0IGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBTZXQgaXMgbm90IHN1cHBvcnRlZAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzIFNldAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIFNldAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzZXQgaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIGFkZGluZyB0byB0aGlzIHNldCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzIHNldC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KTsKIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIHdoaWNoIGRvIG5vdCBleGlzdCBpbiB0aGlzCi0gICAgICogU2V0LgorICAgICAqIEFkZHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHdoaWNoIGRvIG5vdCBleGlzdCB5ZXQgaW4KKyAgICAgKiB0aGlzIHNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gb2Ygb2JqZWN0cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFNldCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYWRkaW5nIHRvIHRoaXMgU2V0IGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIGFuIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzIFNldAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgU2V0CisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgc2V0IGlzIG1vZGlmaWVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiBhZGRpbmcgdG8gdGhpcyBzZXQgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIGFuIG9iamVjdCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzIHNldC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGlzIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbik7CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgU2V0LCBsZWF2aW5nIGl0IGVtcHR5LgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQsIGxlYXZpbmcgaXQgZW1wdHkuCiAgICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIFNldCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIHNldCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqIEBzZWUgI2lzRW1wdHkKICAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXIoKTsKIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgU2V0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBTZWFyY2hlcyB0aGlzIHNldCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIG9iamVjdCBpcyBhbiBlbGVtZW50IG9mIHRoaXMgU2V0LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvYmplY3QgaXMgYW4gZWxlbWVudCBvZiB0aGlzIHNldCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpOwogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBTZXQgZm9yIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKiBTZWFyY2hlcyB0aGlzIHNldCBmb3IgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBhcmUgZWxlbWVudHMgb2YKLSAgICAgKiAgICAgICAgIHRoaXMgU2V0LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFyZQorICAgICAqICAgICAgICAgZWxlbWVudHMgb2YgdGhpcyBzZXQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbik7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgcmVwcmVzZW50Ci0gICAgICogdGhlIDxlbT5zYW1lPC9lbT4gb2JqZWN0IHVzaW5nIGEgY2xhc3Mgc3BlY2lmaWMgY29tcGFyaXNvbi4KKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIHNldCwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5CisgICAgICogcmVwcmVzZW50IHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uCisgICAgICogRXF1YWxpdHkgZm9yIGEgc2V0IG1lYW5zIHRoYXQgYm90aCBzZXRzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhbmQgdGhlIHNhbWUKKyAgICAgKiBlbGVtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICBPYmplY3QgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcwotICAgICAqICAgICAgICAgb2JqZWN0IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzIG9iamVjdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdCwKKyAgICAgKiAgICAgICAgIGFuZCB7QGNvZGUgZmFsc2V9IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0LgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIHNldC4gVHdvIHNldCB3aGljaCBhcmUgZXF1YWwgbXVzdCByZXR1cm4KKyAgICAgKiB0aGUgc2FtZSB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBzZXQuCiAgICAgICogCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIFNldCBoYXMgbm8gZWxlbWVudHMsIGEgc2l6ZSBvZiB6ZXJvLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNldCBoYXMgbm8gZWxlbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgU2V0IGhhcyBubyBlbGVtZW50cywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzZXQgaGFzIG5vIGVsZW1lbnRzLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgU2V0LgorICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgc2V0LiBUaGUgZWxlbWVudHMgYXJlCisgICAgICogdW5vcmRlcmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgU2V0Ci0gICAgICogCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBzZXQuCiAgICAgICogQHNlZSBJdGVyYXRvcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMgU2V0LgorICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGlzIHNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFNldCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIFNldCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHNldCB3YXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHJlbW92aW5nIGZyb20gdGhpcyBzZXQgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCk7CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBmcm9tIHRoaXMgU2V0LgorICAgICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGZyb20gdGhpcyBzZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgU2V0IGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMgU2V0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgc2V0IHdhcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIHNldCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMgU2V0IHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZAotICAgICAqIENvbGxlY3Rpb24uCisgICAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMgc2V0IHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmV0YWluCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgU2V0IGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiByZW1vdmluZyBmcm9tIHRoaXMgU2V0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmV0YWluLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgc2V0IHdhcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gcmVtb3ZpbmcgZnJvbSB0aGlzIHNldCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgU2V0LgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBTZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzaXplKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIFNldC4KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgU2V0CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBTZXQuIElmIHRoZQorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMgc2V0LiBJZiB0aGUKICAgICAgKiBzcGVjaWZpZWQgYXJyYXkgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVsZW1lbnRzLCB0aGUgc3BlY2lmaWVkIGFycmF5CiAgICAgICogaXMgdXNlZCwgb3RoZXJ3aXNlIGFuIGFycmF5IG9mIHRoZSBzYW1lIHR5cGUgaXMgY3JlYXRlZC4gSWYgdGhlIHNwZWNpZmllZAotICAgICAqIGFycmF5IGlzIHVzZWQgYW5kIGlzIGxhcmdlciB0aGFuIHRoaXMgU2V0LCB0aGUgYXJyYXkgZWxlbWVudCBmb2xsb3dpbmcKKyAgICAgKiBhcnJheSBpcyB1c2VkIGFuZCBpcyBsYXJnZXIgdGhhbiB0aGlzIHNldCwgdGhlIGFycmF5IGVsZW1lbnQgZm9sbG93aW5nCiAgICAgICogdGhlIGNvbGxlY3Rpb24gZWxlbWVudHMgaXMgc2V0IHRvIG51bGwuCiAgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgU2V0Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBBcnJheVN0b3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoaXMgU2V0IGNhbm5vdCBiZSBzdG9yZWQKLSAgICAgKiAgICAgICAgICAgICAgICBpbiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHNldC4KKyAgICAgKiBAdGhyb3dzIEFycmF5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyBzZXQgY2Fubm90IGJlIHN0b3JlZCBpbgorICAgICAqICAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCisgICAgICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYXJyYXkpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TaW1wbGVUaW1lWm9uZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TaW1wbGVUaW1lWm9uZS5qYXZhCmluZGV4IDg0MzcyNGMuLjE4ZDA3NmYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU2ltcGxlVGltZVpvbmUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NpbXBsZVRpbWVab25lLmphdmEKQEAgLTE0LDYgKzE0LDEyIEBACiAgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCiAKIHBhY2thZ2UgamF2YS51dGlsOwogCkBAIC0yNCwxMiArMzAsMjUgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIC8qKgotICogU2ltcGxlVGltZVpvbmUgcmVwcmVzZW50cyBhIGxvY2FsIHRpbWUgem9uZSBhbmQgaXRzIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICogcnVsZXMgZm9yIHRoZSBncmVnb3JpYW4gY2FsZW5kYXIuCisgKiB7QGNvZGUgU2ltcGxlVGltZVpvbmV9IGlzIGEgY29uY3JldGUgc3ViY2xhc3Mgb2Yge0Bjb2RlIFRpbWVab25lfQorICogdGhhdCByZXByZXNlbnRzIGEgdGltZSB6b25lIGZvciB1c2Ugd2l0aCBhIEdyZWdvcmlhbiBjYWxlbmRhci4gVGhpcyBjbGFzcworICogZG9lcyBub3QgaGFuZGxlIGhpc3RvcmljYWwgY2hhbmdlcy4KKyAqIDxQPgorICogVXNlIGEgbmVnYXRpdmUgdmFsdWUgZm9yIHtAY29kZSBkYXlPZldlZWtJbk1vbnRofSB0byBpbmRpY2F0ZSB0aGF0CisgKiB7QGNvZGUgU2ltcGxlVGltZVpvbmV9IHNob3VsZCBjb3VudCBmcm9tIHRoZSBlbmQgb2YgdGhlIG1vbnRoCisgKiBiYWNrd2FyZHMuIEZvciBleGFtcGxlLCBEYXlsaWdodCBTYXZpbmdzIFRpbWUgZW5kcyBhdCB0aGUgbGFzdAorICogKGRheU9mV2Vla0luTW9udGggPSAtMSkgU3VuZGF5IGluIE9jdG9iZXIsIGF0IDIgQU0gaW4gc3RhbmRhcmQgdGltZS4KICAqIAogICogQHNlZSBDYWxlbmRhcgorICogQHNlZSBHcmVnb3JpYW5DYWxlbmRhcgogICogQHNlZSBUaW1lWm9uZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTaW1wbGVUaW1lWm9uZSBleHRlbmRzIFRpbWVab25lIHsKICAgICAKQEAgLTQ2LDIwICs2NSwyOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET01fTU9ERSA9IDEsIERPV19JTl9NT05USF9NT0RFID0gMiwKICAgICAgICAgICAgIERPV19HRV9ET01fTU9ERSA9IDMsIERPV19MRV9ET01fTU9ERSA9IDQ7CiAKLSAgICAvKiBDb25zdGFudCBmb3IgcmVwcmVzZW50aW5nIHN0YXJ0IG9yIGVuZCB0aW1lIGluIEdNVCB0aW1lIG1vZGUuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IGZvciByZXByZXNlbnRpbmcgYSBzdGFydCBvciBlbmQgdGltZSBpbiBHTVQgdGltZSBtb2RlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVUQ19USU1FID0gMjsKIAotICAgIC8qCi0gICAgICogQ29uc3RhbnQgZm9yIHJlcHJlc2VudGluZyBzdGFydCBvciBlbmQgdGltZSBpbiBzdGFuZGFyZCBsb2NhbCB0aW1lIG1vZGUsCi0gICAgICogYmFzZWQgb24gdGltZXpvbmUncyByYXcgb2Zmc2V0IGZyb20gR01ULCBkb2VzIG5vdCBpbmNsdWRlIERheWxpZ2h0CisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IGZvciByZXByZXNlbnRpbmcgYSBzdGFydCBvciBlbmQgdGltZSBpbiBzdGFuZGFyZCBsb2NhbCB0aW1lIG1vZGUsCisgICAgICogYmFzZWQgb24gdGltZXpvbmUncyByYXcgb2Zmc2V0IGZyb20gR01UOyBkb2VzIG5vdCBpbmNsdWRlIERheWxpZ2h0CiAgICAgICogc2F2aW5ncy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFOREFSRF9USU1FID0gMTsKIAotICAgIC8qCi0gICAgICogQ29uc3RhbnQgZm9yIHJlcHJlc2VudGluZyBzdGFydCBvciBlbmQgdGltZSBpbiBsb2NhbCB3YWxsIGNsb2NrIHRpbWUKLSAgICAgKiBtb2RlLCBiYXNlZCBvbiB0aW1lem9uZSdzIGFkanVzdGVkIG9mZnNldCBmcm9tIEdNVCwgaXQgZG9lcyBpbmNsdWRlCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IGZvciByZXByZXNlbnRpbmcgYSBzdGFydCBvciBlbmQgdGltZSBpbiBsb2NhbCB3YWxsIGNsb2NrIHRpbWUKKyAgICAgKiBtb2RlLCBiYXNlZCBvbiB0aW1lem9uZSdzIGFkanVzdGVkIG9mZnNldCBmcm9tIEdNVDsgaW5jbHVkZXMKICAgICAgKiBEYXlsaWdodCBzYXZpbmdzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBTExfVElNRSA9IDA7CiAKQEAgLTcwLDEzICs5NywxNyBAQAogICAgIHByaXZhdGUgaW50IGRzdFNhdmluZ3MgPSAzNjAwMDAwOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTaW1wbGVUaW1lWm9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIG9mZnNldCBmb3Igc3RhbmRhcmQKLSAgICAgKiB0aW1lIGZyb20gR01UIGFuZCB0aGUgc3BlY2lmaWVkIHRpbWUgem9uZSBJRC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIFNpbXBsZVRpbWVab25lfSB3aXRoIHRoZSBnaXZlbiBiYXNlIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBHTVQKKyAgICAgKiBhbmQgdGltZSB6b25lIElELiBUaW1lem9uZSBJRHMgY2FuIGJlIG9idGFpbmVkIGZyb20KKyAgICAgKiB7QGNvZGUgVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzfS4gTm9ybWFsbHkgeW91IHNob3VsZCB1c2Uge0Bjb2RlIFRpbWVab25lLmdldERlZmF1bHR9IHRvCisgICAgICogY29uc3RydWN0IGEge0Bjb2RlIFRpbWVab25lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHN0YW5kYXJkIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gYmFzZSB0aW1lIHpvbmUgb2Zmc2V0IHRvIEdNVC4KICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgem9uZSBJRAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgem9uZSBJRCB3aGljaCBpcyBvYnRhaW5lZCBmcm9tCisgICAgICogICAgICAgICAgICB7QGNvZGUgVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2ltcGxlVGltZVpvbmUoaW50IG9mZnNldCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc2V0SUQobmFtZSk7CkBAIC04NCwzNiArMTE1LDc0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTaW1wbGVUaW1lWm9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIG9mZnNldCBmb3Igc3RhbmRhcmQKLSAgICAgKiB0aW1lIGZyb20gR01ULCB0aGUgc3BlY2lmaWVkIHRpbWUgem9uZSBJRCBhbmQgdGhlIHJ1bGVzIGZvciBkYXlsaWdodAotICAgICAqIHNhdmluZ3MgdGltZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIFNpbXBsZVRpbWVab25lfSB3aXRoIHRoZSBnaXZlbiBiYXNlIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBHTVQsCisgICAgICogdGltZSB6b25lIElELCBhbmQgdGltZXMgdG8gc3RhcnQgYW5kIGVuZCB0aGUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLiBUaW1lem9uZSBJRHMgY2FuCisgICAgICogYmUgb2J0YWluZWQgZnJvbSB7QGNvZGUgVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzfS4gTm9ybWFsbHkgeW91IHNob3VsZCB1c2UKKyAgICAgKiB7QGNvZGUgVGltZVpvbmUuZ2V0RGVmYXVsdH0gdG8gY3JlYXRlIGEge0Bjb2RlIFRpbWVab25lfS4gRm9yIGEgdGltZSB6b25lIHRoYXQgZG9lcyBub3QKKyAgICAgKiB1c2UgZGF5bGlnaHQgc2F2aW5nIHRpbWUsIGRvIG5vdCB1c2UgdGhpcyBjb25zdHJ1Y3RvcjsgaW5zdGVhZCB5b3Ugc2hvdWxkCisgICAgICogdXNlIHtAY29kZSBTaW1wbGVUaW1lWm9uZShyYXdPZmZzZXQsIElEKX0uCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCwgdGhpcyBjb25zdHJ1Y3RvciBzcGVjaWZpZXMgZGF5LW9mLXdlZWstaW4tbW9udGggcnVsZXMuIFRoYXQKKyAgICAgKiBpcywgaWYgdGhlIHtAY29kZSBzdGFydERheX0gaXMgMSwgYW5kIHRoZSB7QGNvZGUgc3RhcnREYXlPZldlZWt9IGlzIHtAY29kZSBTVU5EQVl9LCB0aGVuIHRoaXMKKyAgICAgKiBpbmRpY2F0ZXMgdGhlIGZpcnN0IFN1bmRheSBpbiB0aGUge0Bjb2RlIHN0YXJ0TW9udGh9LiBBIHtAY29kZSBzdGFydERheX0gb2YgLTEgbGlrZXdpc2UKKyAgICAgKiBpbmRpY2F0ZXMgdGhlIGxhc3QgU3VuZGF5LiBIb3dldmVyLCBieSB1c2luZyBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlcyBmb3IKKyAgICAgKiBjZXJ0YWluIHBhcmFtZXRlcnMsIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGNhbiBiZSBzcGVjaWZpZWQuCisgICAgICogPHA+CisgICAgICogRGF5IG9mIG1vbnRoOiBUbyBzcGVjaWZ5IGFuIGV4YWN0IGRheSBvZiB0aGUgbW9udGgsIHN1Y2ggYXMgTWFyY2ggMSwgc2V0CisgICAgICoge0Bjb2RlIHN0YXJ0RGF5T2ZXZWVrfSB0byB6ZXJvLgorICAgICAqIDxwPgorICAgICAqIERheSBvZiB3ZWVrIGFmdGVyIGRheSBvZiBtb250aDogVG8gc3BlY2lmeSB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrCisgICAgICogb2NjdXJyaW5nIG9uIG9yIGFmdGVyIGFuIGV4YWN0IGRheSBvZiB0aGUgbW9udGgsIG1ha2UgdGhlIGRheSBvZiB0aGUgd2VlaworICAgICAqIG5lZ2F0aXZlLiBGb3IgZXhhbXBsZSwgaWYge0Bjb2RlIHN0YXJ0RGF5fSBpcyA1IGFuZCB7QGNvZGUgc3RhcnREYXlPZldlZWt9IGlzIHtAY29kZSAtTU9OREFZfSwKKyAgICAgKiB0aGlzIGluZGljYXRlcyB0aGUgZmlyc3QgTW9uZGF5IG9uIG9yIGFmdGVyIHRoZSA1dGggZGF5IG9mIHRoZQorICAgICAqIHtAY29kZSBzdGFydE1vbnRofS4KKyAgICAgKiA8cD4KKyAgICAgKiBEYXkgb2Ygd2VlayBiZWZvcmUgZGF5IG9mIG1vbnRoOiBUbyBzcGVjaWZ5IHRoZSBsYXN0IGRheSBvZiB0aGUgd2VlaworICAgICAqIG9jY3VycmluZyBvbiBvciBiZWZvcmUgYW4gZXhhY3QgZGF5IG9mIHRoZSBtb250aCwgbWFrZSB0aGUgZGF5IG9mIHRoZQorICAgICAqIHdlZWsgYW5kIHRoZSBkYXkgb2YgdGhlIG1vbnRoIG5lZ2F0aXZlLiBGb3IgZXhhbXBsZSwgaWYge0Bjb2RlIHN0YXJ0RGF5fSBpcyB7QGNvZGUgLTIxfQorICAgICAqIGFuZCB7QGNvZGUgc3RhcnREYXlPZldlZWt9IGlzIHtAY29kZSAtV0VETkVTREFZfSwgdGhpcyBpbmRpY2F0ZXMgdGhlIGxhc3QgV2VkbmVzZGF5IG9uIG9yCisgICAgICogYmVmb3JlIHRoZSAyMXN0IG9mIHRoZSB7QGNvZGUgc3RhcnRNb250aH0uCisgICAgICogPHA+CisgICAgICogVGhlIGFib3ZlIGV4YW1wbGVzIHJlZmVyIHRvIHRoZSB7QGNvZGUgc3RhcnRNb250aH0sIHtAY29kZSBzdGFydERheX0sIGFuZCB7QGNvZGUgc3RhcnREYXlPZldlZWt9OworICAgICAqIHRoZSBzYW1lIGFwcGxpZXMgZm9yIHRoZSB7QGNvZGUgZW5kTW9udGh9LCB7QGNvZGUgZW5kRGF5fSwgYW5kIHtAY29kZSBlbmREYXlPZldlZWt9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZGlmZmVyZW5jZSBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWU6IG9uZSBob3VyLiAgICAgICAgICAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHN0YW5kYXJkIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gYmFzZSB0aW1lIHpvbmUgb2Zmc2V0IHRvIEdNVC4KICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgem9uZSBJRAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgem9uZSBJRCB3aGljaCBpcyBvYnRhaW5lZCBmcm9tCisgICAgICogICAgICAgICAgICB7QGNvZGUgVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzfS4KICAgICAgKiBAcGFyYW0gc3RhcnRNb250aAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIG1vbnRoIGluIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIG1vbnRoLiBUaGUgbW9udGggaW5kZXhpbmcgaXMgMC1iYXNlZC4gZWcsIDAKKyAgICAgKiAgICAgICAgICAgIGZvciBKYW51YXJ5LgogICAgICAqIEBwYXJhbSBzdGFydERheQotICAgICAqICAgICAgICAgICAgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodAotICAgICAqICAgICAgICAgICAgc2F2aW5ncyB0aW1lIHN0YXJ0cworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgZGF5LW9mLXdlZWstaW4tbW9udGguIFBsZWFzZSBzZWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZW1iZXIgZGVzY3JpcHRpb24gZm9yIGFuIGV4YW1wbGUuCiAgICAgICogQHBhcmFtIHN0YXJ0RGF5T2ZXZWVrCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgc3RhcnRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyBkYXktb2Ytd2Vlay4gUGxlYXNlIHNlZSB0aGUKKyAgICAgKiAgICAgICAgICAgIG1lbWJlciBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZS4KICAgICAgKiBAcGFyYW0gc3RhcnRUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgdGltZSBvZiBkYXkgaW4gbWlsbGlzZWNvbmRzIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgc3RhcnRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyB0aW1lIGluIGxvY2FsIHdhbGwgdGltZSwgd2hpY2gKKyAgICAgKiAgICAgICAgICAgIGlzIHN0YW5kYXJkIHRpbWUgaW4gdGhpcyBjYXNlLiBQbGVhc2Ugc2VlIHRoZSBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBlbmRNb250aAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIG1vbnRoIGluIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcgbW9udGguIFRoZSBtb250aCBpbmRleGluZyBpcyAwLWJhc2VkLiBlZywgMCBmb3IKKyAgICAgKiAgICAgICAgICAgIEphbnVhcnkuCiAgICAgICogQHBhcmFtIGVuZERheQotICAgICAqICAgICAgICAgICAgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodAotICAgICAqICAgICAgICAgICAgc2F2aW5ncyB0aW1lIGVuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyBkYXktb2Ytd2Vlay1pbi1tb250aC4gUGxlYXNlIHNlZQorICAgICAqICAgICAgICAgICAgdGhlIG1lbWJlciBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZS4KICAgICAgKiBAcGFyYW0gZW5kRGF5T2ZXZWVrCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgZW5kcworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIGRheS1vZi13ZWVrLiBQbGVhc2Ugc2VlIHRoZSBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBlbmRUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgdGltZSBvZiBkYXkgaW4gbWlsbGlzZWNvbmRzIHN0YW5kYXJkIHRpbWUgb24gd2hpY2gKLSAgICAgKiAgICAgICAgICAgIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcgdGltZSBpbiBsb2NhbCB3YWxsIHRpbWUsIHdoaWNoIGlzCisgICAgICogICAgICAgICAgICBkYXlsaWdodCB0aW1lIGluIHRoaXMgY2FzZS4gUGxlYXNlIHNlZSB0aGUgbWVtYmVyIGRlc2NyaXB0aW9uCisgICAgICogICAgICAgICAgICBmb3IgYW4gZXhhbXBsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBtb250aCwgZGF5LCBkYXlPZldlZWssIG9yIHRpbWUgcGFyYW1ldGVycyBhcmUgb3V0IG9mCisgICAgICogICAgICAgICAgICAgcmFuZ2UgZm9yIHRoZSBzdGFydCBvciBlbmQgcnVsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2ltcGxlVGltZVpvbmUoaW50IG9mZnNldCwgU3RyaW5nIG5hbWUsIGludCBzdGFydE1vbnRoLAogICAgICAgICAgICAgaW50IHN0YXJ0RGF5LCBpbnQgc3RhcnREYXlPZldlZWssIGludCBzdGFydFRpbWUsIGludCBlbmRNb250aCwKQEAgLTEyMywzOCArMTkyLDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTaW1wbGVUaW1lWm9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIG9mZnNldCBmb3Igc3RhbmRhcmQKLSAgICAgKiB0aW1lIGZyb20gR01ULCB0aGUgc3BlY2lmaWVkIHRpbWUgem9uZSBJRCBhbmQgdGhlIHJ1bGVzIGZvciBkYXlsaWdodAotICAgICAqIHNhdmluZ3MgdGltZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIFNpbXBsZVRpbWVab25lfSB3aXRoIHRoZSBnaXZlbiBiYXNlIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBHTVQsCisgICAgICogdGltZSB6b25lIElELCB0aW1lcyB0byBzdGFydCBhbmQgZW5kIHRoZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIGFuZCAKKyAgICAgKiB0aGUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGRpZmZlcmVuY2UgaW4gbWlsbGlzZWNvbmRzCiAgICAgICogCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBmcm9tIEdNVCBvZiBzdGFuZGFyZCB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIGJhc2UgdGltZSB6b25lIG9mZnNldCB0byBHTVQuCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIHpvbmUgSUQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIHpvbmUgSUQgd2hpY2ggaXMgb2J0YWluZWQgZnJvbQorICAgICAqICAgICAgICAgICAge0Bjb2RlIFRpbWVab25lLmdldEF2YWlsYWJsZUlEc30uCiAgICAgICogQHBhcmFtIHN0YXJ0TW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBtb250aCBpbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgc3RhcnRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyBtb250aC4gTW9udGggaXMgMC1iYXNlZC4gZWcsIDAKKyAgICAgKiAgICAgICAgICAgIGZvciBKYW51YXJ5LgogICAgICAqIEBwYXJhbSBzdGFydERheQotICAgICAqICAgICAgICAgICAgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodAotICAgICAqICAgICAgICAgICAgc2F2aW5ncyB0aW1lIHN0YXJ0cworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgZGF5LW9mLXdlZWstaW4tbW9udGguIFBsZWFzZSBzZWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdGlvbiBvZiB7QGxpbmsgI1NpbXBsZVRpbWVab25lKGludCwgU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCl9IGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBzdGFydERheU9mV2VlawotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUKLSAgICAgKiAgICAgICAgICAgIHN0YXJ0cworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgZGF5LW9mLXdlZWsuIFBsZWFzZSBzZWUgdGhlCisgICAgICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB7QGxpbmsgI1NpbXBsZVRpbWVab25lKGludCwgU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCl9IGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBzdGFydFRpbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0gICAgICogICAgICAgICAgICBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIFRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIHRpbWUgaW4gbG9jYWwgd2FsbCB0aW1lLCB3aGljaAorICAgICAqICAgICAgICAgICAgaXMgc3RhbmRhcmQgdGltZSBpbiB0aGlzIGNhc2UuIFBsZWFzZSBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIAorICAgICAqICAgICAgICAgICAge0BsaW5rICNTaW1wbGVUaW1lWm9uZShpbnQsIFN0cmluZywgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfSBmb3IgYW4gZXhhbXBsZS4KICAgICAgKiBAcGFyYW0gZW5kTW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBtb250aCBpbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZW5kcworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIG1vbnRoLiBNb250aCBpcyAwLWJhc2VkLiBlZywgMCBmb3IKKyAgICAgKiAgICAgICAgICAgIEphbnVhcnkuCiAgICAgICogQHBhcmFtIGVuZERheQotICAgICAqICAgICAgICAgICAgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodAotICAgICAqICAgICAgICAgICAgc2F2aW5ncyB0aW1lIGVuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyBkYXktb2Ytd2Vlay1pbi1tb250aC4gUGxlYXNlIHNlZQorICAgICAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0aW9uIG9mIHtAbGluayAjU2ltcGxlVGltZVpvbmUoaW50LCBTdHJpbmcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KX0gZm9yIGFuIGV4YW1wbGUuCiAgICAgICogQHBhcmFtIGVuZERheU9mV2VlawotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUKLSAgICAgKiAgICAgICAgICAgIGVuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyBkYXktb2Ytd2Vlay4gUGxlYXNlIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgCisgICAgICogICAgICAgICAgICB7QGxpbmsgI1NpbXBsZVRpbWVab25lKGludCwgU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCl9IGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBlbmRUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgdGltZSBvZiBkYXkgaW4gbWlsbGlzZWNvbmRzIHN0YW5kYXJkIHRpbWUgb24gd2hpY2gKLSAgICAgKiAgICAgICAgICAgIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcgdGltZSBpbiBsb2NhbCB3YWxsIHRpbWUsIHdoaWNoIGlzCisgICAgICogICAgICAgICAgICBkYXlsaWdodCB0aW1lIGluIHRoaXMgY2FzZS4gUGxlYXNlIHNlZSB0aGUgZGVzY3JpcHRpb24gb2Yge0BsaW5rICNTaW1wbGVUaW1lWm9uZShpbnQsIFN0cmluZywgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfQorICAgICAqICAgICAgICAgICAgZm9yIGFuIGV4YW1wbGUuCiAgICAgICogQHBhcmFtIGRheWxpZ2h0U2F2aW5ncwotICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIHRoZSBtb250aCwgZGF5LCBkYXlPZldlZWssIG9yIHRpbWUgcGFyYW1ldGVycyBhcmUgb3V0IG9mCisgICAgICogICAgICAgICAgICAgICAgcmFuZ2UgZm9yIHRoZSBzdGFydCBvciBlbmQgcnVsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2ltcGxlVGltZVpvbmUoaW50IG9mZnNldCwgU3RyaW5nIG5hbWUsIGludCBzdGFydE1vbnRoLAogICAgICAgICAgICAgaW50IHN0YXJ0RGF5LCBpbnQgc3RhcnREYXlPZldlZWssIGludCBzdGFydFRpbWUsIGludCBlbmRNb250aCwKQEAgLTE3MCw0MiArMjQ4LDUxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTaW1wbGVUaW1lWm9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIG9mZnNldCBmb3Igc3RhbmRhcmQKLSAgICAgKiB0aW1lIGZyb20gR01ULCB0aGUgc3BlY2lmaWVkIHRpbWUgem9uZSBJRCwgdGhlIHJ1bGVzIGZvciBkYXlsaWdodCBzYXZpbmdzCi0gICAgICogdGltZSwgYW5kIHRoZSBtb2RlcyBpbmRpY2F0aW5nIFVUQywgc3RhbmRhcmQsIG9yIHdhbGwgdGltZS4KKyAgICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgU2ltcGxlVGltZVpvbmV9IHdpdGggdGhlIGdpdmVuIGJhc2UgdGltZSB6b25lIG9mZnNldCBmcm9tIEdNVCwKKyAgICAgKiB0aW1lIHpvbmUgSUQsIHRpbWVzIHRvIHN0YXJ0IGFuZCBlbmQgdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpbmNsdWRpbmcgYSAKKyAgICAgKiBtb2RlIHNwZWNpZmllciwgdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBUaGUgbW9kZSBzcGVjaWZpZXMgZWl0aGVyIHtAbGluayAjV0FMTF9USU1FfSwge0BsaW5rICNTVEFOREFSRF9USU1FfSwgb3IKKyAgICAgKiB7QGxpbmsgI1VUQ19USU1FfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHN0YW5kYXJkIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gYmFzZSB0aW1lIHpvbmUgb2Zmc2V0IHRvIEdNVC4KICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgem9uZSBJRAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgem9uZSBJRCB3aGljaCBpcyBvYnRhaW5lZCBmcm9tCisgICAgICogICAgICAgICAgICB7QGNvZGUgVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzfS4KICAgICAgKiBAcGFyYW0gc3RhcnRNb250aAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIG1vbnRoIGluIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIG1vbnRoLiBUaGUgbW9udGggaW5kZXhpbmcgaXMgMC1iYXNlZC4gZWcsIDAKKyAgICAgKiAgICAgICAgICAgIGZvciBKYW51YXJ5LgogICAgICAqIEBwYXJhbSBzdGFydERheQotICAgICAqICAgICAgICAgICAgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodAotICAgICAqICAgICAgICAgICAgc2F2aW5ncyB0aW1lIHN0YXJ0cworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgZGF5LW9mLXdlZWstaW4tbW9udGguIFBsZWFzZSBzZWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdGlvbiBvZiB7QGxpbmsgI1NpbXBsZVRpbWVab25lKGludCwgU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCl9IGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBzdGFydERheU9mV2VlawotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUKLSAgICAgKiAgICAgICAgICAgIHN0YXJ0cworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgZGF5LW9mLXdlZWsuIFBsZWFzZSBzZWUgdGhlCisgICAgICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB7QGxpbmsgI1NpbXBsZVRpbWVab25lKGludCwgU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCl9IGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBzdGFydFRpbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0gICAgICogICAgICAgICAgICBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyAKKyAgICAgKiAgICAgICAgICAgIHRpbWUgc3RhcnRzLCBiYXNlZCBvbiB0aGUge0Bjb2RlIHN0YXJ0VGltZU1vZGV9LgogICAgICAqIEBwYXJhbSBzdGFydFRpbWVNb2RlCi0gICAgICogICAgICAgICAgICB0aGUgbW9kZSAoVVRDLCBzdGFuZGFyZCwgb3Igd2FsbCB0aW1lKSBvZiB0aGUgc3RhcnQgdGltZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG1vZGUgKFVUQywgc3RhbmRhcmQsIG9yIHdhbGwgdGltZSkgb2YgdGhlIHN0YXJ0IHRpbWUKKyAgICAgKiAgICAgICAgICAgIHZhbHVlLgorICAgICAqIEBwYXJhbSBlbmREYXkgCisgICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzLiAKICAgICAgKiBAcGFyYW0gZW5kTW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBtb250aCBpbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZW5kcwotICAgICAqIEBwYXJhbSBlbmREYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggZGF5bGlnaHQKLSAgICAgKiAgICAgICAgICAgIHNhdmluZ3MgdGltZSBlbmRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcgbW9udGguIFRoZSBtb250aCBpbmRleGluZyBpcyAwLWJhc2VkLiBlZywgMCBmb3IKKyAgICAgKiAgICAgICAgICAgIEphbnVhcnkuCiAgICAgICogQHBhcmFtIGVuZERheU9mV2VlawotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUKLSAgICAgKiAgICAgICAgICAgIGVuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyBkYXktb2Ytd2Vlay4gUGxlYXNlIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgCisgICAgICogICAgICAgICAgICB7QGxpbmsgI1NpbXBsZVRpbWVab25lKGludCwgU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCl9IGZvciBhbiBleGFtcGxlLgogICAgICAqIEBwYXJhbSBlbmRUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgdGltZSBvZiBkYXkgaW4gbWlsbGlzZWNvbmRzIHN0YW5kYXJkIHRpbWUgb24gd2hpY2gKLSAgICAgKiAgICAgICAgICAgIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzCisgICAgICogICAgICAgICAgICB0aGUgdGltZSBvZiBkYXkgaW4gbWlsbGlzZWNvbmRzIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgCisgICAgICogICAgICAgICAgICB0aW1lIGVuZHMsIGJhc2VkIG9uIHRoZSB7QGNvZGUgZW5kVGltZU1vZGV9LgogICAgICAqIEBwYXJhbSBlbmRUaW1lTW9kZQotICAgICAqICAgICAgICAgICAgdGhlIG1vZGUgKFVUQywgc3RhbmRhcmQsIG9yIHdhbGwgdGltZSkgb2YgdGhlIGVuZCB0aW1lIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbW9kZSAoVVRDLCBzdGFuZGFyZCwgb3Igd2FsbCB0aW1lKSBvZiB0aGUgZW5kIHRpbWUgdmFsdWUuCiAgICAgICogQHBhcmFtIGRheWxpZ2h0U2F2aW5ncwotICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcworICAgICAqICAgICAgICAgICAgdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBtb250aCwgZGF5LCBkYXlPZldlZWssIG9yIHRpbWUgcGFyYW1ldGVycyBhcmUgb3V0IG9mCisgICAgICogICAgICAgICAgICAgcmFuZ2UgZm9yIHRoZSBzdGFydCBvciBlbmQgcnVsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2ltcGxlVGltZVpvbmUoaW50IG9mZnNldCwgU3RyaW5nIG5hbWUsIGludCBzdGFydE1vbnRoLAogICAgICAgICAgICAgaW50IHN0YXJ0RGF5LCBpbnQgc3RhcnREYXlPZldlZWssIGludCBzdGFydFRpbWUsIGludCBzdGFydFRpbWVNb2RlLApAQCAtMjE5LDEyICszMDYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFNpbXBsZVRpbWVab25lIHdpdGggdGhlIHNhbWUgSUQsIHJhd09mZnNldCBhbmQgZGF5bGlnaHQKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBTaW1wbGVUaW1lWm9uZX0gd2l0aCB0aGUgc2FtZSBJRCwge0Bjb2RlIHJhd09mZnNldH0gYW5kIGRheWxpZ2h0CiAgICAgICogc2F2aW5ncyB0aW1lIHJ1bGVzIGFzIHRoaXMgU2ltcGxlVGltZVpvbmUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIFNpbXBsZVRpbWVab25lCi0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBTaW1wbGVUaW1lWm9uZX0uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKQEAgLTIzNiwxNiArMzIzLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBTaW1wbGVUaW1lWm9uZSBhbmQgYW5zd2VyIGlmIHRoZXkKLSAgICAgKiBhcmUgZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBTaW1wbGVUaW1lWm9uZSBhbmQgaGF2ZSB0aGUKLSAgICAgKiBzYW1lIHByb3BlcnRpZXMuCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyB7QGNvZGUgU2ltcGxlVGltZVpvbmV9IGFuZCByZXR1cm5zIHdoZXRoZXIgdGhleQorICAgICAqIGFyZSBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAY29kZSBTaW1wbGVUaW1lWm9uZX0gYW5kIGhhdmUgdGhlCisgICAgICogc2FtZSBpbnRlcm5hbCBkYXRhLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgU2ltcGxlVGltZVpvbmUsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBTaW1wbGVUaW1lWm9uZX0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTI2NiwxMyArMzUzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVuZFRpbWUgPT0gdHouZW5kVGltZSAmJiBlbmRNb2RlID09IHR6LmVuZE1vZGUgJiYgZHN0U2F2aW5ncyA9PSB0ei5kc3RTYXZpbmdzKSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF5bGlnaHQgc2F2aW5ncyBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGlzIFNpbXBsZVRpbWVab25lLgotICAgICAqIAotICAgICAqIElmIHRoaXMgU2ltcGxlVGltZXpvbmUgZG9lcyBub3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmdzLCByZXR1cm5zIDAuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF5bGlnaHQgc2F2aW5ncyBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXREU1RTYXZpbmdzKCkgewogICAgICAgICBpZiAoIXVzZURheWxpZ2h0KSB7CkBAIC0yODEsMjYgKzM2MSw2IEBACiAgICAgICAgIHJldHVybiBkc3RTYXZpbmdzOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG9mZnNldCBmcm9tIEdNVCBvZiB0aGlzIFNpbXBsZVRpbWVab25lIGZvciB0aGUgc3BlY2lmaWVkIGRhdGUKLSAgICAgKiBhbmQgdGltZS4gVGhlIG9mZnNldCBpbmNsdWRlcyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaWYgdGhlIHNwZWNpZmllZCBkYXRlCi0gICAgICogYW5kIHRpbWUgYXJlIHdpdGhpbiB0aGUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXJhCi0gICAgICogICAgICAgICAgICB0aGUgR3JlZ29yaWFuQ2FsZW5kYXIgZXJhLCBlaXRoZXIgR3JlZ29yaWFuQ2FsZW5kYXIuQkMgb3IKLSAgICAgKiAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyLkFECi0gICAgICogQHBhcmFtIHllYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyCi0gICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgbW9udGgKLSAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aAotICAgICAqIEBwYXJhbSBkYXlPZldlZWsKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBkYXkgb2YgdGhlIHdlZWsKLSAgICAgKiBAcGFyYW0gdGltZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgb2YgZGF5IGluIG1pbGxpc2Vjb25kcwotICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBmcm9tIEdNVCBpbiBtaWxsaXNlY29uZHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldE9mZnNldChpbnQgZXJhLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgZGF5T2ZXZWVrLAogICAgICAgICAgICAgaW50IHRpbWUpIHsKQEAgLTQzMCwxNSArNDkwLDYgQEAKICAgICAgICAgcmV0dXJuIHJhd09mZnNldCArIGRzdFNhdmluZ3M7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHRoaXMgU2ltcGxlVGltZVpvbmUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0ZS4KLSAgICAgKiBUaGUgb2Zmc2V0IGluY2x1ZGVzIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpZiB0aGUgc3BlY2lmaWVkIGRhdGUgaXMgd2l0aGluCi0gICAgICogdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRpbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAgMDA6MDA6MDAgR01UCi0gICAgICogQHJldHVybiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIG1pbGxpc2Vjb25kcwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGxvbmcgdGltZSkgewogICAgICAgICBpZiAoIXVzZURheWxpZ2h0VGltZSgpKSB7CkBAIC00NTAsMTEgKzUwMSw2IEBACiAgICAgICAgIHJldHVybiBkYXlsaWdodFNhdmluZ3MuZ2V0T2Zmc2V0KHRpbWUgKyByYXdPZmZzZXQpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG9mZnNldCBmb3Igc3RhbmRhcmQgdGltZSBmcm9tIEdNVCBmb3IgdGhpcyBTaW1wbGVUaW1lWm9uZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgZnJvbSBHTVQgb2Ygc3RhbmRhcmQgdGltZSBpbiBtaWxsaXNlY29uZHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFJhd09mZnNldCgpIHsKICAgICAgICAgcmV0dXJuIHJhd09mZnNldDsKQEAgLTQ2MiwxMSArNTA4LDExIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaC4KICAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKQEAgLTQ3OSwxNSArNTI1LDYgQEAKICAgICAgICAgcmV0dXJuIGhhc2hDb2RlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHNwZWNpZmllZCBUaW1lWm9uZSBoYXMgdGhlIHNhbWUgcmF3IG9mZnNldCBhbmQgZGF5bGlnaHQKLSAgICAgKiBzYXZpbmdzIHRpbWUgcnVsZXMgYXMgdGhpcyBTaW1wbGVUaW1lWm9uZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gem9uZQotICAgICAqICAgICAgICAgICAgYSBUaW1lWm9uZQotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBUaW1lWm9uZXMgaGF2ZSB0aGUgc2FtZSByYXcgb2Zmc2V0IGFuZCBkYXlsaWdodAotICAgICAqICAgICAgICAgc2F2aW5ncyB0aW1lIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTYW1lUnVsZXMoVGltZVpvbmUgem9uZSkgewogICAgICAgICBpZiAoISh6b25lIGluc3RhbmNlb2YgU2ltcGxlVGltZVpvbmUpKSB7CkBAIC01MDksMTUgKzU0Niw2IEBACiAgICAgICAgICAgICAgICAgJiYgZW5kVGltZSA9PSB0ei5lbmRUaW1lICYmIGVuZE1vZGUgPT0gdHouZW5kTW9kZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBzcGVjaWZpZWQgRGF0ZSBpcyBpbiB0aGUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZCBmb3IKLSAgICAgKiB0aGlzIFNpbXBsZVRpbWVab25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aW1lCi0gICAgICogICAgICAgICAgICBhIERhdGUKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgRGF0ZSBpcyBpbiB0aGUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGluRGF5bGlnaHRUaW1lKERhdGUgdGltZSkgewogICAgICAgICAvLyBjaGVjayBmb3IgbnVsbCBwb2ludGVyCkBAIC01NDQsMTAgKzU3MiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgb2Zmc2V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhpcyBTaW1wbGVUaW1lWm9uZS4KKyAgICAgKiBTZXRzIHRoZSBkYXlsaWdodCBzYXZpbmdzIG9mZnNldCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoaXMge0Bjb2RlIFNpbXBsZVRpbWVab25lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzCi0gICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgZGF5bGlnaHQgc2F2aW5ncyBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERTVFNhdmluZ3MoaW50IG1pbGxpc2Vjb25kcykgewogICAgICAgICBpZiAobWlsbGlzZWNvbmRzID4gMCkgewpAQCAtNjEwLDEzICs2MzksMTQgQEAKICAgICAgKiBTZXRzIHRoZSBydWxlIHdoaWNoIHNwZWNpZmllcyB0aGUgZW5kIG9mIGRheWxpZ2h0IHNhdmluZ3MgdGltZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBtb250aCBpbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZW5kcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gbW9udGggaW4gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGVuZHMuCiAgICAgICogQHBhcmFtIGRheU9mTW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgZW5kcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUKKyAgICAgKiAgICAgICAgICAgIGVuZHMuCiAgICAgICogQHBhcmFtIHRpbWUKICAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMgc3RhbmRhcmQgdGltZSBvbiB3aGljaAotICAgICAqICAgICAgICAgICAgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGVuZHMKKyAgICAgKiAgICAgICAgICAgIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVuZFJ1bGUoaW50IG1vbnRoLCBpbnQgZGF5T2ZNb250aCwgaW50IHRpbWUpIHsKICAgICAgICAgZW5kTW9udGggPSBtb250aDsKQEAgLTYzMCwxNiArNjYwLDE3IEBACiAgICAgICogU2V0cyB0aGUgcnVsZSB3aGljaCBzcGVjaWZpZXMgdGhlIGVuZCBvZiBkYXlsaWdodCBzYXZpbmdzIHRpbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgbW9udGggaW4gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGVuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9IG1vbnRoIGluIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzLgogICAgICAqIEBwYXJhbSBkYXkKICAgICAgKiAgICAgICAgICAgIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggZGF5bGlnaHQKLSAgICAgKiAgICAgICAgICAgIHNhdmluZ3MgdGltZSBlbmRzCisgICAgICogICAgICAgICAgICBzYXZpbmdzIHRpbWUgZW5kcy4KICAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgZW5kcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQorICAgICAqICAgICAgICAgICAgZW5kcy4KICAgICAgKiBAcGFyYW0gdGltZQogICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgb2YgZGF5IGluIG1pbGxpc2Vjb25kcyBzdGFuZGFyZCB0aW1lIG9uIHdoaWNoCi0gICAgICogICAgICAgICAgICBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZW5kcworICAgICAqICAgICAgICAgICAgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGVuZHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RW5kUnVsZShpbnQgbW9udGgsIGludCBkYXksIGludCBkYXlPZldlZWssIGludCB0aW1lKSB7CiAgICAgICAgIGVuZE1vbnRoID0gbW9udGg7CkBAIC02NTMsMTcgKzY4NCwxOCBAQAogICAgICAqIFNldHMgdGhlIHJ1bGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBlbmQgb2YgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtb250aAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIG1vbnRoIGluIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBlbmRzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSBtb250aCBpbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZW5kcy4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gZGF5IG9mIHRoZSBtb250aC4KICAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgZW5kcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQorICAgICAqICAgICAgICAgICAgZW5kcy4KICAgICAgKiBAcGFyYW0gdGltZQogICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgb2YgZGF5IGluIG1pbGxpc2Vjb25kcyBvbiB3aGljaCBkYXlsaWdodCBzYXZpbmdzIHRpbWUKLSAgICAgKiAgICAgICAgICAgIGVuZHMKKyAgICAgKiAgICAgICAgICAgIGVuZHMuCiAgICAgICogQHBhcmFtIGFmdGVyCi0gICAgICogICAgICAgICAgICBzZWxlY3RzIHRoZSBkYXkgYWZ0ZXIgb3IgYmVmb3JlIHRoZSBkYXkgb2YgbW9udGgKKyAgICAgKiAgICAgICAgICAgIHNlbGVjdHMgdGhlIGRheSBhZnRlciBvciBiZWZvcmUgdGhlIGRheSBvZiBtb250aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbmRSdWxlKGludCBtb250aCwgaW50IGRheSwgaW50IGRheU9mV2VlaywgaW50IHRpbWUsCiAgICAgICAgICAgICBib29sZWFuIGFmdGVyKSB7CkBAIC02NzUsMTAgKzcwNywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9mZnNldCBmb3Igc3RhbmRhcmQgdGltZSBmcm9tIEdNVCBmb3IgdGhpcyBTaW1wbGVUaW1lWm9uZS4KKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgZm9yIHN0YW5kYXJkIHRpbWUgZnJvbSBHTVQgZm9yIHRoaXMge0Bjb2RlIFNpbXBsZVRpbWVab25lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHN0YW5kYXJkIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHN0YW5kYXJkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJhd09mZnNldChpbnQgb2Zmc2V0KSB7CkBAIC03MjAsMTMgKzc1MywxNCBAQAogICAgICAqIFNldHMgdGhlIHJ1bGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBzdGFydCBvZiBkYXlsaWdodCBzYXZpbmdzIHRpbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgbW9udGggaW4gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHN0YXJ0cworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gbW9udGggaW4gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHN0YXJ0cy4KICAgICAgKiBAcGFyYW0gZGF5T2ZNb250aAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0gICAgICogICAgICAgICAgICBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9IGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCisgICAgICogICAgICAgICAgICBzdGFydHMuCiAgICAgICogQHBhcmFtIHRpbWUKICAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0gICAgICogICAgICAgICAgICBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHN0YXJ0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFJ1bGUoaW50IG1vbnRoLCBpbnQgZGF5T2ZNb250aCwgaW50IHRpbWUpIHsKICAgICAgICAgc3RhcnRNb250aCA9IG1vbnRoOwpAQCAtNzQwLDE2ICs3NzQsMTcgQEAKICAgICAgKiBTZXRzIHRoZSBydWxlIHdoaWNoIHNwZWNpZmllcyB0aGUgc3RhcnQgb2YgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtb250aAotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIG1vbnRoIGluIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9IG1vbnRoIGluIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBzdGFydHMuCiAgICAgICogQHBhcmFtIGRheQogICAgICAqICAgICAgICAgICAgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCBkYXlsaWdodAotICAgICAqICAgICAgICAgICAgc2F2aW5ncyB0aW1lIHN0YXJ0cworICAgICAqICAgICAgICAgICAgc2F2aW5ncyB0aW1lIHN0YXJ0cy4KICAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgc3RhcnRzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCisgICAgICogICAgICAgICAgICBzdGFydHMuCiAgICAgICogQHBhcmFtIHRpbWUKICAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0gICAgICogICAgICAgICAgICBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHN0YXJ0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFJ1bGUoaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgZGF5T2ZXZWVrLCBpbnQgdGltZSkgewogICAgICAgICBzdGFydE1vbnRoID0gbW9udGg7CkBAIC03NjMsMTcgKzc5OCwxOCBAQAogICAgICAqIFNldHMgdGhlIHJ1bGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBzdGFydCBvZiBkYXlsaWdodCBzYXZpbmdzIHRpbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgbW9udGggaW4gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHN0YXJ0cworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gbW9udGggaW4gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHN0YXJ0cy4KICAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gZGF5IG9mIHRoZSBtb250aC4KICAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotICAgICAqICAgICAgICAgICAgc3RhcnRzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCisgICAgICogICAgICAgICAgICBzdGFydHMuCiAgICAgICogQHBhcmFtIHRpbWUKICAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMgb24gd2hpY2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0gICAgICogICAgICAgICAgICBzdGFydHMKKyAgICAgKiAgICAgICAgICAgIHN0YXJ0cy4KICAgICAgKiBAcGFyYW0gYWZ0ZXIKLSAgICAgKiAgICAgICAgICAgIHNlbGVjdHMgdGhlIGRheSBhZnRlciBvciBiZWZvcmUgdGhlIGRheSBvZiBtb250aAorICAgICAqICAgICAgICAgICAgc2VsZWN0cyB0aGUgZGF5IGFmdGVyIG9yIGJlZm9yZSB0aGUgZGF5IG9mIG1vbnRoLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0UnVsZShpbnQgbW9udGgsIGludCBkYXksIGludCBkYXlPZldlZWssIGludCB0aW1lLAogICAgICAgICAgICAgYm9vbGVhbiBhZnRlcikgewpAQCAtNzg1LDExICs4MjEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdGFydGluZyB5ZWFyIGZvciBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW4gdGhpcyBTaW1wbGVUaW1lWm9uZS4KKyAgICAgKiBTZXRzIHRoZSBzdGFydGluZyB5ZWFyIGZvciBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW4gdGhpcyB7QGNvZGUgU2ltcGxlVGltZVpvbmV9LgogICAgICAqIFllYXJzIGJlZm9yZSB0aGlzIHN0YXJ0IHllYXIgd2lsbCBhbHdheXMgYmUgaW4gc3RhbmRhcmQgdGltZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geWVhcgotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHllYXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyB5ZWFyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0WWVhcihpbnQgeWVhcikgewogICAgICAgICBzdGFydFllYXIgPSB5ZWFyOwpAQCAtNzk3LDkgKzgzNCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNpbXBsZVRpbWVab25lLgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBTaW1wbGVUaW1lWm9uZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU2ltcGxlVGltZVpvbmUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgU2ltcGxlVGltZVpvbmV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC04MjksMTIgKzg2Nyw2IEBACiAgICAgICAgICAgICAgICAgKyAiLGVuZFRpbWU9IiArIGVuZFRpbWUgKyAiXSI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBUaW1lWm9uZSBoYXMgYSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcGVyaW9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRpbWUgem9uZSBoYXMgYSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcGVyaW9kLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gdXNlRGF5bGlnaHRUaW1lKCkgewogICAgICAgICByZXR1cm4gdXNlRGF5bGlnaHQ7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NvcnRlZE1hcC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Tb3J0ZWRNYXAuamF2YQppbmRleCBkYWNiNTJhLi4xMGIyNjQ3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NvcnRlZE1hcC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU29ydGVkTWFwLmphdmEKQEAgLTE5LDk4ICsxOSwxMTggQEAKIAogCiAvKioKLSAqIFNvcnRlZE1hcCBpcyBhIE1hcCB3aGVyZSB0aGUgaXRlcmF0b3JzIHNlcXVlbmNlIGluIG9yZGVyIG9mIHRoZSBzb3J0ZWQga2V5cy4KKyAqIEEgbWFwIHRoYXQgaGFzIGl0cyBrZXlzIG9yZGVyZWQuIFRoZSBzb3J0aW5nIGlzIGFjY29yZGluZyB0byBlaXRoZXIgdGhlCisgKiBuYXR1cmFsIG9yZGVyaW5nIG9mIGl0cyBrZXlzIG9yIHRoZSBvcmRlcmluZyBnaXZlbiBieSBhIHNwZWNpZmllZCBjb21wYXJhdG9yLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTb3J0ZWRNYXA8SyxWPiBleHRlbmRzIE1hcDxLLFY+IHsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSBlbGVtZW50cyBpbiB0aGlzIFNvcnRlZE1hcC4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSBrZXlzIGluIHRoaXMgc29ydGVkIG1hcC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgQ29tcGFyYXRvciBvciBudWxsIGlmIHRoZSBuYXR1cmFsIG9yZGVyIGlzIHVzZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wYXJhdG9yIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgbmF0dXJhbCBvcmRlciBpcyB1c2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb21wYXJhdG9yPD8gc3VwZXIgSz4gY29tcGFyYXRvcigpOwogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBmaXJzdCBzb3J0ZWQga2V5IGluIHRoaXMgU29ydGVkTWFwLgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGtleSBpbiB0aGlzIHNvcnRlZCBtYXAuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlyc3Qgc29ydGVkIGtleQotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGtleSBpbiB0aGlzIHNvcnRlZCBtYXAuCiAgICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIFNvcnRlZE1hcCBpcyBlbXB0eQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgc29ydGVkIG1hcCBpcyBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSyBmaXJzdEtleSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPlNvcnRlZE1hcDwvY29kZT4gb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5Tb3J0ZWRNYXA8L2NvZGU+IHdoaWNoIGNvbnRhaW5zIGtleXMgbGVzcyB0aGFuIHRoZSBlbmQga2V5LiBVc2VycwotICAgICAqIHNob3VsZCBiZSBhd2FyZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgYWN0dWFsbHkgYmFja2VkIGJ5IHRoaXMKLSAgICAgKiA8Y29kZT5Tb3J0ZWRNYXA8L2NvZGU+LiBIZW5jZSBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIG9uZSB3aWxsIGJlCi0gICAgICogaW1tZWRpYXRlbHkgdmlzaWJsZSB0byB0aGUgb3RoZXIuCisgICAgICogUmV0dXJucyBhIHNvcnRlZCBtYXAgb3ZlciBhIHJhbmdlIG9mIHRoaXMgc29ydGVkIG1hcCB3aXRoIGFsbCBrZXlzIHRoYXQKKyAgICAgKiBhcmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGVuZEtleX0uIENoYW5nZXMgdG8gdGhlIHJldHVybmVkCisgICAgICogc29ydGVkIG1hcCBhcmUgcmVmbGVjdGVkIGluIHRoaXMgc29ydGVkIG1hcCBhbmQgdmljZSB2ZXJzYS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBUaGUgcmV0dXJuZWQgbWFwIHdpbGwgbm90IGFsbG93IGFuIGluc2VydGlvbiBvZiBhIGtleSBvdXRzaWRlIHRoZQorICAgICAqIHNwZWNpZmllZCByYW5nZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGVuZEtleQotICAgICAqICAgICAgICAgICAgdGhlIGVuZCBrZXkKLSAgICAgKiBAcmV0dXJuIGEgc3VibWFwIHdoZXJlIHRoZSBrZXlzIGFyZSBsZXNzIHRoYW4gPGNvZGU+ZW5kS2V5PC9jb2RlPgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgdGhlIGVuZCBrZXkgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcwotICAgICAqICAgICAgICAgICAgICAgIFN1Yk1hcAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBlbmQga2V5IGlzIG51bGwgYW5kIHRoaXMgU29ydGVkTWFwIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgc3VwcG9ydCBudWxsIGtleXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBoaWdoIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBzcGVjaWZpZWQuCisgICAgICogQHJldHVybiBhIHNvcnRlZCBtYXAgd2hlcmUgdGhlIGtleXMgYXJlIGxlc3MgdGhhbiB7QGNvZGUgZW5kS2V5fS4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBvZiB0aGUgZW5kIGtleSBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzIHNvcnRlZAorICAgICAqICAgICAgICAgICAgIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZCBrZXkgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGlzIHNvcnRlZCBtYXAgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICBzdXBwb3J0IHtAY29kZSBudWxsfSBrZXlzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtYXAgaXMgaXRzZWxmIGEgc29ydGVkIG1hcCBvdmVyIGEgcmFuZ2Ugb2YgYW5vdGhlcgorICAgICAqICAgICAgICAgICAgIG1hcCBhbmQgdGhlIHNwZWNpZmllZCBrZXkgaXMgb3V0c2lkZSBvZiBpdHMgcmFuZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvcnRlZE1hcDxLLFY+IGhlYWRNYXAoSyBlbmRLZXkpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFzdCBzb3J0ZWQga2V5IGluIHRoaXMgU29ydGVkTWFwLgorICAgICAqIFJldHVybnMgdGhlIGxhc3Qga2V5IGluIHRoaXMgc29ydGVkIG1hcC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IHNvcnRlZCBrZXkKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGtleSBpbiB0aGlzIHNvcnRlZCBtYXAuCiAgICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIFNvcnRlZE1hcCBpcyBlbXB0eQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgc29ydGVkIG1hcCBpcyBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSyBsYXN0S2V5KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU29ydGVkTWFwIG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIFNvcnRlZE1hcCB3aGljaAotICAgICAqIGNvbnRhaW5zIGtleXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQga2V5IGJ1dCBsZXNzIHRoYW4gdGhlIGVuZAotICAgICAqIGtleS4gVXNlcnMgc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBhY3R1YWxseSBiYWNrZWQgYnkKLSAgICAgKiB0aGlzIDxjb2RlPlNvcnRlZE1hcDwvY29kZT4uIEhlbmNlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gb25lIHdpbGwKLSAgICAgKiBiZSBpbW1lZGlhdGVseSB2aXNpYmxlIHRvIHRoZSBvdGhlci4KKyAgICAgKiBSZXR1cm5zIGEgc29ydGVkIG1hcCBvdmVyIGEgcmFuZ2Ugb2YgdGhpcyBzb3J0ZWQgbWFwIHdpdGggYWxsIGtleXMKKyAgICAgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgc3RhcnRLZXl9IGFuZCBsZXNzIHRoYW4gdGhlCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBlbmRLZXl9LiBDaGFuZ2VzIHRvIHRoZSByZXR1cm5lZCBzb3J0ZWQgbWFwIGFyZQorICAgICAqIHJlZmxlY3RlZCBpbiB0aGlzIHNvcnRlZCBtYXAgYW5kIHZpY2UgdmVyc2EuCisgICAgICogPHA+CisgICAgICogTm90ZTogVGhlIHJldHVybmVkIG1hcCB3aWxsIG5vdCBhbGxvdyBhbiBpbnNlcnRpb24gb2YgYSBrZXkgb3V0c2lkZSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmFuZ2UuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydEtleQotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGtleQorICAgICAqICAgICAgICAgICAgdGhlIGxvdyBib3VuZGFyeSBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSkuCiAgICAgICogQHBhcmFtIGVuZEtleQotICAgICAqICAgICAgICAgICAgdGhlIGVuZCBrZXkKLSAgICAgKiBAcmV0dXJuIGEgc3VibWFwIHdoZXJlIHRoZSBrZXlzIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvCi0gICAgICogICAgICAgICA8Y29kZT5zdGFydEtleTwvY29kZT4gYW5kIGxlc3MgdGhhbiA8Y29kZT5lbmRLZXk8L2NvZGU+Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiB0aGUgc3RhcnQgb3IgZW5kIGtleSBpcyBpbmFwcHJvcHJpYXRlCi0gICAgICogICAgICAgICAgICAgICAgZm9yIHRoaXMgU3ViTWFwCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YXJ0IG9yIGVuZCBrZXkgaXMgbnVsbCBhbmQgdGhpcyBTb3J0ZWRNYXAgZG9lcwotICAgICAqICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0IG51bGwga2V5cwotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgc3RhcnQga2V5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGhpZ2ggYm91bmRhcnkgb2YgdGhlIHJhbmdlIChleGNsdXNpdmUpLAorICAgICAqIEByZXR1cm4gYSBzb3J0ZWQgbWFwIHdpdGggdGhlIGtleSBmcm9tIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgdGhlIHN0YXJ0IG9yIGVuZCBrZXkgaXMgaW5hcHByb3ByaWF0ZSBmb3IKKyAgICAgKiAgICAgICAgICAgICB0aGlzIHNvcnRlZCBtYXAuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdGFydCBvciBlbmQga2V5IGlzIHtAY29kZSBudWxsfSBhbmQgdGhpcyBzb3J0ZWQgbWFwCisgICAgICogICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCB7QGNvZGUgbnVsbH0ga2V5cy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzdGFydCBrZXkgaXMgZ3JlYXRlciB0aGFuIHRoZSBlbmQga2V5LCBvciBpZiB0aGlzIG1hcAorICAgICAqICAgICAgICAgICAgIGlzIGl0c2VsZiBhIHNvcnRlZCBtYXAgb3ZlciBhIHJhbmdlIG9mIGFub3RoZXIgc29ydGVkIG1hcCBhbmQKKyAgICAgKiAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHJhbmdlIGlzIG91dHNpZGUgb2YgaXRzIHJhbmdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTb3J0ZWRNYXA8SyxWPiBzdWJNYXAoSyBzdGFydEtleSwgSyBlbmRLZXkpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNvcnRlZE1hcCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyBTb3J0ZWRNYXAgd2hpY2gKLSAgICAgKiBjb250YWlucyBrZXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHN0YXJ0IGtleS4gVGhlIHJldHVybmVkIFNvcnRlZE1hcAotICAgICAqIGlzIGJhY2tlZCBieSB0aGlzIFNvcnRlZE1hcCBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4KKyAgICAgKiBSZXR1cm5zIGEgc29ydGVkIG1hcCBvdmVyIGEgcmFuZ2Ugb2YgdGhpcyBzb3J0ZWQgbWFwIHdpdGggYWxsIGtleXMgdGhhdAorICAgICAqIGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgc3RhcnRLZXl9LiBDaGFuZ2VzIHRvCisgICAgICogdGhlIHJldHVybmVkIHNvcnRlZCBtYXAgYXJlIHJlZmxlY3RlZCBpbiB0aGlzIHNvcnRlZCBtYXAgYW5kIHZpY2UgdmVyc2EuCisgICAgICogPHA+CisgICAgICogTm90ZTogVGhlIHJldHVybmVkIG1hcCB3aWxsIG5vdCBhbGxvdyBhbiBpbnNlcnRpb24gb2YgYSBrZXkgb3V0c2lkZSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmFuZ2UuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydEtleQotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGtleQotICAgICAqIEByZXR1cm4gYSBzdWJtYXAgd2hlcmUgdGhlIGtleXMgYXJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8KLSAgICAgKiAgICAgICAgIDxjb2RlPnN0YXJ0S2V5PC9jb2RlPgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgdGhlIHN0YXJ0IGtleSBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgU3ViTWFwCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YXJ0IGtleSBpcyBudWxsIGFuZCB0aGlzIFNvcnRlZE1hcCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgIHN1cHBvcnQgbnVsbCBrZXlzCisgICAgICogICAgICAgICAgICB0aGUgbG93IGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBzcGVjaWZpZWQuCisgICAgICogQHJldHVybiBhIHNvcnRlZCBtYXAgd2hlcmUgdGhlIGtleXMgYXJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgIHtAY29kZSBzdGFydEtleX0uCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgdGhlIHN0YXJ0IGtleSBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzCisgICAgICogICAgICAgICAgICAgc29ydGVkIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0YXJ0IGtleSBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoaXMgc29ydGVkIG1hcCBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgIHN1cHBvcnQge0Bjb2RlIG51bGx9IGtleXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1hcCBpdHNlbGYgYSBzb3J0ZWQgbWFwIG92ZXIgYSByYW5nZSBvZiBhbm90aGVyIG1hcAorICAgICAqICAgICAgICAgICAgIGFuZCB0aGUgc3BlY2lmaWVkIGtleSBpcyBvdXRzaWRlIG9mIGl0cyByYW5nZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ydGVkTWFwPEssVj4gdGFpbE1hcChLIHN0YXJ0S2V5KTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU29ydGVkU2V0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NvcnRlZFNldC5qYXZhCmluZGV4IGJjOTk1OGQuLjI0ZmEwMTcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU29ydGVkU2V0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Tb3J0ZWRTZXQuamF2YQpAQCAtMTksOTYgKzE5LDEwOCBAQAogCiAKIC8qKgotICogU29ydGVkU2V0IGlzIGEgU2V0IHdoaWNoIGl0ZXJhdGVzIGl0cyBlbGVtZW50cyBpbiBzb3J0ZWQgb3JkZXIuCisgKiBTb3J0ZWRTZXQgaXMgYSBTZXQgd2hpY2ggaXRlcmF0ZXMgb3ZlciBpdHMgZWxlbWVudHMgaW4gYSBzb3J0ZWQgb3JkZXIuIFRoZQorICogb3JkZXIgaXMgZGV0ZXJtaW5lZCBlaXRoZXIgYnkgdGhlIGVsZW1lbnRzIG5hdHVyYWwgb3JkZXJpbmcsIG9yIGJ5IGEKKyAqIHtAbGluayBDb21wYXJhdG9yfSB3aGljaCBpcyBwYXNzZWQgaW50byBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGF0CisgKiBjb25zdHJ1Y3Rpb24gdGltZS4gQWxsIGVsZW1lbnRzIGluIHRoaXMgc2V0IG11c3QgYmUgbXV0dWFsbHkgY29tcGFyYWJsZS4gVGhlCisgKiBvcmRlcmluZyBpbiB0aGlzIHNldCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB7QGNvZGUgZXF1YWxzfSBvZiBpdHMgZWxlbWVudHMuCisgKiAKKyAqIEBzZWUgQ29tcGFyYXRvcgorICogQHNlZSBDb21wYXJhYmxlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTb3J0ZWRTZXQ8RT4gZXh0ZW5kcyBTZXQ8RT4gewogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIENvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIGVsZW1lbnRzIGluIHRoaXMgU29ydGVkU2V0LgorICAgICAqIFJldHVybnMgdGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIFNvcnRlZFNldH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIENvbXBhcmF0b3Igb3IgbnVsbCBpZiB0aGUgbmF0dXJhbCBvcmRlciBpcyB1c2VkCisgICAgICogQHJldHVybiBhIGNvbXBhcmF0b3Igb3IgbnVsbCBpZiB0aGUgbmF0dXJhbCBvcmRlcmluZyBpcyB1c2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcigpOwogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBmaXJzdCBzb3J0ZWQgZWxlbWVudCBpbiB0aGlzIFNvcnRlZFNldC4KKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoaXMge0Bjb2RlIFNvcnRlZFNldH0uIFRoZSBmaXJzdCBlbGVtZW50CisgICAgICogaXMgdGhlIGxvd2VzdCBlbGVtZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHNvcnRlZCBlbGVtZW50Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIFNvcnRlZFNldCBpcyBlbXB0eQorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQuCisgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGlzIHtAY29kZSBTb3J0ZWRTZXR9IGlzIGVtcHR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFIGZpcnN0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU29ydGVkU2V0IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIFNvcnRlZFNldCB3aGljaAotICAgICAqIGNvbnRhaW5zIGVsZW1lbnRzIGxlc3MgdGhhbiB0aGUgZW5kIGVsZW1lbnQuIFRoZSByZXR1cm5lZCBTb3J0ZWRTZXQgaXMKLSAgICAgKiBiYWNrZWQgYnkgdGhpcyBTb3J0ZWRTZXQgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBTb3J0ZWRTZXR9IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzCisgICAgICoge0Bjb2RlIFNvcnRlZFNldH0gd2hpY2ggY29udGFpbnMgZWxlbWVudHMgbGVzcyB0aGFuIHRoZSBlbmQgZWxlbWVudC4gVGhlCisgICAgICogcmV0dXJuZWQge0Bjb2RlIFNvcnRlZFNldH0gaXMgYmFja2VkIGJ5IHRoaXMge0Bjb2RlIFNvcnRlZFNldH0gc28gY2hhbmdlcworICAgICAqIHRvIG9uZSBzZXQgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGVuZCBlbGVtZW50Ci0gICAgICogQHJldHVybiBhIHN1YnNldCB3aGVyZSB0aGUgZWxlbWVudHMgYXJlIGxlc3MgdGhhbiA8Y29kZT5lbmQ8L2NvZGU+Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiB0aGUgZW5kIGVsZW1lbnQgaXMgaW5hcHByb3ByaWF0ZSBmb3IKLSAgICAgKiAgICAgICAgICAgICAgICB0aGlzIFN1YlNldAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBlbmQgZWxlbWVudCBpcyBudWxsIGFuZCB0aGlzIFNvcnRlZFNldCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgIHN1cHBvcnQgbnVsbCBlbGVtZW50cworICAgICAqICAgICAgICAgICAgdGhlIGVuZCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYSBzdWJzZXQgd2hlcmUgdGhlIGVsZW1lbnRzIGFyZSBsZXNzIHRoYW4ge0Bjb2RlIGVuZH0uCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiB0aGUgZW5kIGVsZW1lbnQgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgIFN1YlNldC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgZW5kIGVsZW1lbnQgaXMgbnVsbCBhbmQgdGhpcyB7QGNvZGUgU29ydGVkU2V0fSBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IHN1cHBvcnQgbnVsbCBlbGVtZW50cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ydGVkU2V0PEU+IGhlYWRTZXQoRSBlbmQpOwogCiAgICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBsYXN0IHNvcnRlZCBlbGVtZW50IGluIHRoaXMgU29ydGVkU2V0LgorICAgICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGlzIHtAY29kZSBTb3J0ZWRTZXR9LiBUaGUgbGFzdCBlbGVtZW50IGlzCisgICAgICogdGhlIGhpZ2hlc3QgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IHNvcnRlZCBlbGVtZW50Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIFNvcnRlZFNldCBpcyBlbXB0eQorICAgICAqIEByZXR1cm4gdGhlIGxhc3QgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoaXMge0Bjb2RlIFNvcnRlZFNldH0gaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEUgbGFzdCgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNvcnRlZFNldCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyBTb3J0ZWRTZXQgd2hpY2gKLSAgICAgKiBjb250YWlucyBlbGVtZW50cyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydCBlbGVtZW50IGJ1dCBsZXNzIHRoYW4gdGhlCi0gICAgICogZW5kIGVsZW1lbnQuIFRoZSByZXR1cm5lZCBTb3J0ZWRTZXQgaXMgYmFja2VkIGJ5IHRoaXMgU29ydGVkTWFwIHNvCi0gICAgICogY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBTb3J0ZWRTZXR9IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzCisgICAgICoge0Bjb2RlIFNvcnRlZFNldH0gd2hpY2ggY29udGFpbnMgZWxlbWVudHMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQKKyAgICAgKiBlbGVtZW50IGJ1dCBsZXNzIHRoYW4gdGhlIGVuZCBlbGVtZW50LiBUaGUgcmV0dXJuZWQge0Bjb2RlIFNvcnRlZFNldH0gaXMKKyAgICAgKiBiYWNrZWQgYnkgdGhpcyBTb3J0ZWRNYXAgc28gY2hhbmdlcyB0byBvbmUgc2V0IGFyZSByZWZsZWN0ZWQgYnkgdGhlCisgICAgICogb3RoZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGVsZW1lbnQuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGVuZCBlbGVtZW50Ci0gICAgICogQHJldHVybiBhIHN1YnNldCB3aGVyZSB0aGUgZWxlbWVudHMgYXJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8KLSAgICAgKiAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgbGVzcyB0aGFuIDxjb2RlPmVuZDwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBzdGFydCBvciBlbmQgZWxlbWVudCBpcwotICAgICAqICAgICAgICAgICAgICAgIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMgU3ViU2V0Ci0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YXJ0IG9yIGVuZCBlbGVtZW50IGlzIG51bGwgYW5kIHRoaXMgU29ydGVkU2V0Ci0gICAgICogICAgICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCBudWxsIGVsZW1lbnRzCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIGEgc3Vic2V0IHdoZXJlIHRoZSBlbGVtZW50cyBhcmUgZ3JlYXRlciBvciBlcXVhbCB0byB7QGNvZGUgc3RhcnR9CisgICAgICogICAgICAgICBhbmQgbGVzcyB0aGFuIHtAY29kZSBlbmR9LgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgY2xhc3Mgb2YgdGhlIHN0YXJ0IG9yIGVuZCBlbGVtZW50IGlzIGluYXBwcm9wcmlhdGUKKyAgICAgKiAgICAgICAgICAgICBmb3IgdGhpcyBTdWJTZXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHN0YXJ0IG9yIGVuZCBlbGVtZW50IGlzIG51bGwgYW5kIHRoaXMKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgU29ydGVkU2V0fSBkb2VzIG5vdCBzdXBwb3J0IG51bGwgZWxlbWVudHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvcnRlZFNldDxFPiBzdWJTZXQoRSBzdGFydCwgRSBlbmQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNvcnRlZFNldCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyBTb3J0ZWRTZXQgd2hpY2gKLSAgICAgKiBjb250YWlucyBlbGVtZW50cyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydCBlbGVtZW50LiBUaGUgcmV0dXJuZWQKLSAgICAgKiBTb3J0ZWRTZXQgaXMgYmFja2VkIGJ5IHRoaXMgU29ydGVkU2V0IHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkKLSAgICAgKiB0aGUgb3RoZXIuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBTb3J0ZWRTZXR9IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzCisgICAgICoge0Bjb2RlIFNvcnRlZFNldH0gd2hpY2ggY29udGFpbnMgZWxlbWVudHMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQKKyAgICAgKiBlbGVtZW50LiBUaGUgcmV0dXJuZWQge0Bjb2RlIFNvcnRlZFNldH0gaXMgYmFja2VkIGJ5IHRoaXMKKyAgICAgKiB7QGNvZGUgU29ydGVkU2V0fSBzbyBjaGFuZ2VzIHRvIG9uZSBzZXQgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgZWxlbWVudAotICAgICAqIEByZXR1cm4gYSBzdWJzZXQgd2hlcmUgdGhlIGVsZW1lbnRzIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvCi0gICAgICogICAgICAgICA8Y29kZT5zdGFydDwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNsYXNzIG9mIHRoZSBzdGFydCBlbGVtZW50IGlzIGluYXBwcm9wcmlhdGUgZm9yCi0gICAgICogICAgICAgICAgICAgICAgdGhpcyBTdWJTZXQKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgc3RhcnQgZWxlbWVudCBpcyBudWxsIGFuZCB0aGlzIFNvcnRlZFNldCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgIHN1cHBvcnQgbnVsbCBlbGVtZW50cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGVsZW1lbnQuCisgICAgICogQHJldHVybiBhIHN1YnNldCB3aGVyZSB0aGUgZWxlbWVudHMgYXJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8ge0Bjb2RlIHN0YXJ0fSAuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBjbGFzcyBvZiB0aGUgc3RhcnQgZWxlbWVudCBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGlzCisgICAgICogICAgICAgICAgICAgU3ViU2V0LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBlbGVtZW50IGlzIG51bGwgYW5kIHRoaXMge0Bjb2RlIFNvcnRlZFNldH0KKyAgICAgKiAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IG51bGwgZWxlbWVudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNvcnRlZFNldDxFPiB0YWlsU2V0KEUgc3RhcnQpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TcGVjaWFsQWNjZXNzLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NwZWNpYWxBY2Nlc3MuamF2YQppbmRleCA2Mzc1ODYyLi44NTJhOTc4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NwZWNpYWxBY2Nlc3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NwZWNpYWxBY2Nlc3MuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogICogSG9sZGVyIGZvciBzcGVjaWFsIGNyb3NzLXBhY2thZ2UgYWNjZXNzIG9iamVjdHMuCiAgKi8KIC8qcGFja2FnZSovIGZpbmFsIGNsYXNzIFNwZWNpYWxBY2Nlc3MgewotICAgIC8qKiBub24tbnVsbDsgcGFja2FnZSBhY2Nlc3MgdG8gPGNvZGU+amF2YS5sYW5nPC9jb2RlPiAqLworICAgIC8qKiBub24tbnVsbDsgcGFja2FnZSBhY2Nlc3MgdG8ge0Bjb2RlIGphdmEubGFuZ30gKi8KICAgICBzdGF0aWMgLypwYWNrYWdlKi8gZmluYWwgTGFuZ0FjY2VzcyBMQU5HOwogCiAgICAgc3RhdGljIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU3RhY2suamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU3RhY2suamF2YQppbmRleCBhNGZjZmFhLi44ZWNiNzY1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1N0YWNrLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TdGFjay5qYXZhCkBAIC0xOSwyNSArMTksMzAgQEAKIAogCiAvKioKLSAqIDxjb2RlPlN0YWNrPC9jb2RlPiBpcyBhIExhc3QtSW4vRmlyc3QtT3V0KExJRk8pIGRhdGEgc3RydWN0dXJlIHdoaWNoCi0gKiByZXByZXNlbnRzIGEgc3RhY2sgb2Ygb2JqZWN0cy4gSXQgZW5hYmxlcyB1c2VycyB0byBwb3AgYW5kIHB1c2ggb250byB0aGUKLSAqIHN0YWNrLCBpbmNsdWRpbmcgbnVsbCBvYmplY3RzLiBUaGVyZSBpcyBubyBsaW1pdCB0byB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sKKyAqIHtAY29kZSBTdGFja30gaXMgYSBMYXN0LUluL0ZpcnN0LU91dChMSUZPKSBkYXRhIHN0cnVjdHVyZSB3aGljaCByZXByZXNlbnRzIGEKKyAqIHN0YWNrIG9mIG9iamVjdHMuIEl0IGVuYWJsZXMgdXNlcnMgdG8gcG9wIHRvIGFuZCBwdXNoIGZyb20gdGhlIHN0YWNrLAorICogaW5jbHVkaW5nIG51bGwgb2JqZWN0cy4gVGhlcmUgaXMgbm8gbGltaXQgdG8gdGhlIHNpemUgb2YgdGhlIHN0YWNrLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFN0YWNrPEU+IGV4dGVuZHMgVmVjdG9yPEU+IHsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMjI0NDYzMTY0NTQxMzM5MTY1TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBzdGFjayB3aXRoIHRoZSBkZWZhdWx0IHNpemUgb2YgPGNvZGU+VmVjdG9yPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgc3RhY2sgd2l0aCB0aGUgZGVmYXVsdCBzaXplIG9mIHtAY29kZSBWZWN0b3J9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdGFjaygpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBzdGFjayBpcyBlbXB0eSBvciBub3QuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzdGFjayBpcyBlbXB0eSBvciBub3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdGFjayBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN0YWNrIGlzIGVtcHR5LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb3VudCA9PSAwOwpAQCAtNDYsMTAgKzUxLDExIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgU3RhY2sKLSAgICAgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5KCkgaXMgdHJ1ZQorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisgICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0YWNrIGlzIGVtcHR5LgogICAgICAqIEBzZWUgI3BvcAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRSBwZWVrKCkgewogICAgICAgICB0cnkgewpAQCAtNjMsMTAgKzY5LDExIEBACiAgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgcmVtb3ZlcyBpdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotICAgICAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkoKSBpcyB0cnVlCisgICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0YWNrIGlzIGVtcHR5LgogICAgICAqIEBzZWUgI3BlZWsKICAgICAgKiBAc2VlICNwdXNoCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBFIHBvcCgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTgwLDE1ICs4NywxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFB1c2hlcyB0aGUgb2JqZWN0IGZyb20gdGhlIHBhcmFtZXRlciBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorICAgICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gYmUgYWRkZWQgdG8gdGhlIHN0YWNrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IGFyZ3VtZW50Ci0gICAgICogCisgICAgICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGJlIGFkZGVkIG9uIHRvcCBvZiB0aGUgc3RhY2suCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGFyZ3VtZW50LgogICAgICAqIEBzZWUgI3BlZWsKICAgICAgKiBAc2VlICNwb3AKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIEUgcHVzaChFIG9iamVjdCkgewogICAgICAgICBhZGRFbGVtZW50KG9iamVjdCk7CkBAIC05NiwxMSArMTAyLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIG9iamVjdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb2JqZWN0LCBzdGFydGluZyBmcm9tCisgICAgICogdGhlIHRvcCBvZiB0aGUgc3RhY2suCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBvYmplY3QsIGFzc3VtaW5nIHRoYXQKKyAgICAgKiAgICAgICAgIHRoZSB0b3Btb3N0IG9iamVjdCBvbiB0aGUgc3RhY2sgaGFzIGEgZGlzdGFuY2Ugb2Ygb25lLgogICAgICAqIEBwYXJhbSBvCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIHNlYXJjaGVkCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIHNlYXJjaGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNlYXJjaChPYmplY3QgbykgewogICAgICAgICBpbnQgaW5kZXggPSBsYXN0SW5kZXhPZihvKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1N0cmluZ1Rva2VuaXplci5qYXZhCmluZGV4IDQ5MDk0ZTIuLjNiYmVlZmEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TdHJpbmdUb2tlbml6ZXIuamF2YQpAQCAtMTQsMTkgKzE0LDExNiBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA2LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwogCiBwYWNrYWdlIGphdmEudXRpbDsKIAogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIC8qKgotICogU3RyaW5nIHRva2VuaXplciBpcyB1c2VkIHRvIGJyZWFrIGEgc3RyaW5nIGFwYXJ0IGludG8gdG9rZW5zLgorICogPHA+CisgKiBUaGUge0Bjb2RlIFN0cmluZ1Rva2VuaXplcn0gY2xhc3MgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGJyZWFrIGEgc3RyaW5nCisgKiBpbnRvIHRva2VucyBieSBwZXJmb3JtaW5nIGNvZGUgcG9pbnQgY29tcGFyaXNvbi4gVGhlIHtAY29kZSBTdHJpbmdUb2tlbml6ZXJ9CisgKiBtZXRob2RzIGRvIG5vdCBkaXN0aW5ndWlzaCBhbW9uZyBpZGVudGlmaWVycywgbnVtYmVycywgYW5kIHF1b3RlZCBzdHJpbmdzLAorICogbm9yIGRvIHRoZXkgcmVjb2duaXplIGFuZCBza2lwIGNvbW1lbnRzLgorICogPC9wPgorICogPHA+CisgKiBUaGUgc2V0IG9mIGRlbGltaXRlcnMgKHRoZSBjb2RlcG9pbnRzIHRoYXQgc2VwYXJhdGUgdG9rZW5zKSBtYXkgYmUgc3BlY2lmaWVkCisgKiBlaXRoZXIgYXQgY3JlYXRpb24gdGltZSBvciBvbiBhIHBlci10b2tlbiBiYXNpcy4KKyAqIDwvcD4KKyAqIDxwPgorICogQW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIFN0cmluZ1Rva2VuaXplcn0gYmVoYXZlcyBpbiBvbmUgb2YgdGhyZWUgd2F5cywKKyAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IHdhcyBjcmVhdGVkIHdpdGggdGhlIHtAY29kZSByZXR1cm5EZWxpbWl0ZXJzfSBmbGFnCisgKiBoYXZpbmcgdGhlIHZhbHVlIHtAY29kZSB0cnVlfSBvciB7QGNvZGUgZmFsc2V9OgorICogPHVsPgorICogPGxpPklmIHJldHVybkRlbGltcyBpcyB7QGNvZGUgZmFsc2V9LCBkZWxpbWl0ZXIgY29kZSBwb2ludHMgc2VydmUgdG8gc2VwYXJhdGUKKyAqIHRva2Vucy4gQSB0b2tlbiBpcyBhIG1heGltYWwgc2VxdWVuY2Ugb2YgY29uc2VjdXRpdmUgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90CisgKiBkZWxpbWl0ZXJzLgorICogPGxpPklmIHJldHVybkRlbGltcyBpcyB7QGNvZGUgdHJ1ZX0sIGRlbGltaXRlciBjb2RlIHBvaW50cyBhcmUgdGhlbXNlbHZlcworICogY29uc2lkZXJlZCB0byBiZSB0b2tlbnMuIEluIHRoaXMgY2FzZSBhIHRva2VuIHdpbGwgYmUgcmVjZWl2ZWQgZm9yIGVhY2gKKyAqIGRlbGltaXRlciBjb2RlIHBvaW50LgorICogPC91bD4KKyAqIDxwPgorICogQSB0b2tlbiBpcyB0aHVzIGVpdGhlciBvbmUgZGVsaW1pdGVyIGNvZGUgcG9pbnQsIG9yIGEgbWF4aW1hbCBzZXF1ZW5jZSBvZgorICogY29uc2VjdXRpdmUgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IGRlbGltaXRlcnMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEEge0Bjb2RlIFN0cmluZ1Rva2VuaXplcn0gb2JqZWN0IGludGVybmFsbHkgbWFpbnRhaW5zIGEgY3VycmVudCBwb3NpdGlvbgorICogd2l0aGluIHRoZSBzdHJpbmcgdG8gYmUgdG9rZW5pemVkLiBTb21lIG9wZXJhdGlvbnMgYWR2YW5jZSB0aGlzIGN1cnJlbnQKKyAqIHBvc2l0aW9uIHBhc3QgdGhlIGNvZGUgcG9pbnQgcHJvY2Vzc2VkLgorICogPC9wPgorICogPHA+CisgKiBBIHRva2VuIGlzIHJldHVybmVkIGJ5IHRha2luZyBhIHN1YnN0cmluZyBvZiB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQgdG8KKyAqIGNyZWF0ZSB0aGUge0Bjb2RlIFN0cmluZ1Rva2VuaXplcn0gb2JqZWN0LgorICogPC9wPgorICogPHA+CisgKiBIZXJlJ3MgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoZSBkZWZhdWx0IGRlbGltaXRlciB7QGNvZGUgU3RyaW5nVG9rZW5pemVyfQorICogOiA8YmxvY2txdW90ZT4KICAqIAotICogSWYgcmV0dXJuRGVsaW1pdGVycyBpcyBmYWxzZSwgc3VjY2Vzc2l2ZSBjYWxscyB0byBuZXh0VG9rZW4oKSByZXR1cm4gbWF4aW1hbAotICogYmxvY2tzIG9mIGNoYXJhY3RlcnMgdGhhdCBkbyBub3QgY29udGFpbiBhIGRlbGltaXRlci4KKyAqIDxwcmU+CisgKiBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCZxdW90O3RoaXMgaXMgYSB0ZXN0JnF1b3Q7KTsKKyAqIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAqICAgICBwcmludGxuKHN0Lm5leHRUb2tlbigpKTsKKyAqIH0KKyAqIDwvcHJlPgogICogCi0gKiBJZiByZXR1cm5EZWxpbWl0ZXJzIGlzIHRydWUsIGRlbGltaXRlcnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdG9rZW5zLCBhbmQKLSAqIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gbmV4dFRva2VuKCkgcmV0dXJuIGVpdGhlciBhIG9uZSBjaGFyYWN0ZXIgZGVsaW1pdGVyLCBvciBhCi0gKiBtYXhpbWFsIGJsb2NrIG9mIHRleHQgYmV0d2VlbiBkZWxpbWl0ZXJzLgorICogPC9ibG9ja3F1b3RlPgorICogPC9wPgorICogPHA+CisgKiBUaGlzIHByaW50cyB0aGUgZm9sbG93aW5nIG91dHB1dDogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiAgICAgdGhpcworICogICAgIGlzCisgKiAgICAgYQorICogICAgIHRlc3QKKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8L3A+CisgKiA8cD4KKyAqIEhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgYSB7QGNvZGUgU3RyaW5nVG9rZW5pemVyfSB3aXRoIGEgdXNlcgorICogc3BlY2lmaWVkIGRlbGltaXRlcjogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAorICogICAgICAgICAmcXVvdDt0aGlzIGlzIGEgdGVzdCB3aXRoIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycyBcdWQ4MDBcdWQ4MDBcdWRjMDBcdWRjMDAmcXVvdDssCisgKiAgICAgICAgICZxdW90OyBcdWQ4MDBcdWRjMDAmcXVvdDspOworICogd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICogICAgIHByaW50bG4oc3QubmV4dFRva2VuKCkpOworICogfQorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBwcmludHMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6IDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogICAgIHRoaXMKKyAqICAgICBpcworICogICAgIGEKKyAqICAgICB0ZXN0CisgKiAgICAgd2l0aAorICogICAgIHN1cHBsZW1lbnRhcnkKKyAqICAgICBjaGFyYWN0ZXJzCisgKiAgICAgXHVkODAwCisgKiAgICAgXHVkYzAwCisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFN0cmluZ1Rva2VuaXplciBpbXBsZW1lbnRzIEVudW1lcmF0aW9uPE9iamVjdD4gewogICAgIApAQCAtMzksMzkgKzEzNiw0OSBAQAogICAgIHByaXZhdGUgaW50IHBvc2l0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTdHJpbmdUb2tlbml6ZXIgZm9yIHN0cmluZyB1c2luZyB3aGl0ZXNwYWNlIGFzIHRoZQotICAgICAqIGRlbGltaXRlciwgcmV0dXJuRGVsaW1pdGVycyBpcyBmYWxzZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdUb2tlbml6ZXJ9IGZvciB0aGUgcGFyYW1ldGVyIHN0cmluZyB1c2luZworICAgICAqIHdoaXRlc3BhY2UgYXMgdGhlIGRlbGltaXRlci4gVGhlIHtAY29kZSByZXR1cm5EZWxpbWl0ZXJzfSBmbGFnIGlzIHNldCB0bworICAgICAqIHtAY29kZSBmYWxzZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB0b2tlbml6ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgdG9rZW5pemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdUb2tlbml6ZXIoU3RyaW5nIHN0cmluZykgewogICAgICAgICB0aGlzKHN0cmluZywgIiBcdFxuXHJcZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU3RyaW5nVG9rZW5pemVyIGZvciBzdHJpbmcgdXNpbmcgdGhlIHNwZWNpZmllZAotICAgICAqIGRlbGltaXRlcnMsIHJldHVybkRlbGltaXRlcnMgaXMgZmFsc2UuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyaW5nVG9rZW5pemVyfSBmb3IgdGhlIHBhcmFtZXRlciBzdHJpbmcgdXNpbmcKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMuIFRoZSB7QGNvZGUgcmV0dXJuRGVsaW1pdGVyc30gZmxhZyBpcyBzZXQgdG8KKyAgICAgKiB7QGNvZGUgZmFsc2V9LiBJZiB7QGNvZGUgZGVsaW1pdGVyc30gaXMge0Bjb2RlIG51bGx9LCB0aGlzIGNvbnN0cnVjdG9yCisgICAgICogZG9lc24ndCB0aHJvdyBhbiB7QGNvZGUgRXhjZXB0aW9ufSwgYnV0IGxhdGVyIGNhbGxzIHRvIHNvbWUgbWV0aG9kcyBtaWdodAorICAgICAqIHRocm93IGEge0Bjb2RlIE51bGxQb2ludGVyRXhjZXB0aW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIHRva2VuaXplZAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB0b2tlbml6ZWQuCiAgICAgICogQHBhcmFtIGRlbGltaXRlcnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZWxpbWl0ZXJzIHRvIHVzZQorICAgICAqICAgICAgICAgICAgdGhlIGRlbGltaXRlcnMgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdUb2tlbml6ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlcnMpIHsKICAgICAgICAgdGhpcyhzdHJpbmcsIGRlbGltaXRlcnMsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ1Rva2VuaXplciBmb3Igc3RyaW5nIHVzaW5nIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBkZWxpbWl0ZXJzIGFuZCByZXR1cm5pbmcgZGVsaW1pdGVycyBhcyB0b2tlbnMgd2hlbiBzcGVjaWZpZWQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyaW5nVG9rZW5pemVyfSBmb3IgdGhlIHBhcmFtZXRlciBzdHJpbmcgdXNpbmcKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMsIHJldHVybmluZyB0aGUgZGVsaW1pdGVycyBhcyB0b2tlbnMgaWYgdGhlCisgICAgICogcGFyYW1ldGVyIHtAY29kZSByZXR1cm5EZWxpbWl0ZXJzfSBpcyB7QGNvZGUgdHJ1ZX0uIElmIHtAY29kZSBkZWxpbWl0ZXJzfQorICAgICAqIGlzIG51bGwgdGhpcyBjb25zdHJ1Y3RvciBkb2Vzbid0IHRocm93IGFuIHtAY29kZSBFeGNlcHRpb259LCBidXQgbGF0ZXIKKyAgICAgKiBjYWxscyB0byBzb21lIG1ldGhvZHMgbWlnaHQgdGhyb3cgYSB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgdG9rZW5pemVkCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIHRva2VuaXplZC4KICAgICAgKiBAcGFyYW0gZGVsaW1pdGVycwotICAgICAqICAgICAgICAgICAgdGhlIGRlbGltaXRlcnMgdG8gdXNlCisgICAgICogICAgICAgICAgICB0aGUgZGVsaW1pdGVycyB0byB1c2UuCiAgICAgICogQHBhcmFtIHJldHVybkRlbGltaXRlcnMKLSAgICAgKiAgICAgICAgICAgIHRydWUgdG8gcmV0dXJuIGVhY2ggZGVsaW1pdGVyIGFzIGEgdG9rZW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byByZXR1cm4gZWFjaCBkZWxpbWl0ZXIgYXMgYSB0b2tlbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nVG9rZW5pemVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXJzLAogICAgICAgICAgICAgYm9vbGVhbiByZXR1cm5EZWxpbWl0ZXJzKSB7CkBAIC04Nyw4ICsxOTQsOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1bnByb2Nlc3NlZCB0b2tlbnMgcmVtYWluaW5nIGluIHRoZSBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgdG9rZW5zIHRoYXQgY2FuIGJlIHJldHJlaXZlZCBiZWZvcmUgYW4gZXhjZXB0aW9uIHdpbGwKLSAgICAgKiAgICAgICAgIHJlc3VsdAorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHRva2VucyB0aGF0IGNhbiBiZSByZXRyZWl2ZWQgYmVmb3JlIGFuIHtAY29kZQorICAgICAqICAgICAgICAgRXhjZXB0aW9ufSB3aWxsIHJlc3VsdCBmcm9tIGEgY2FsbCB0byB7QGNvZGUgbmV4dFRva2VuKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY291bnRUb2tlbnMoKSB7CiAgICAgICAgIGludCBjb3VudCA9IDA7CkBAIC0xMTEsMTggKzIxOSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB1bnByb2Nlc3NlZCB0b2tlbnMgcmVtYWluLgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHVucHJvY2Vzc2VkIHRva2VucyByZW1haW4uIFRoaXMgbWV0aG9kIGlzCisgICAgICogaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gc2F0aXNmeSB0aGUge0Bjb2RlIEVudW1lcmF0aW9ufSBpbnRlcmZhY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHVucHJvY2Vzc2VkIHRva2VucyByZW1haW4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB1bnByb2Nlc3NlZCB0b2tlbnMgcmVtYWluLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKICAgICAgICAgcmV0dXJuIGhhc01vcmVUb2tlbnMoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdW5wcm9jZXNzZWQgdG9rZW5zIHJlbWFpbi4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB1bnByb2Nlc3NlZCB0b2tlbnMgcmVtYWluLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB1bnByb2Nlc3NlZCB0b2tlbnMgcmVtYWluCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdW5wcm9jZXNzZWQgdG9rZW5zIHJlbWFpbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewogICAgICAgICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwpAQCAtMTQwLDIyICsyNTEsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJpbmcgYXMgYW4gT2JqZWN0LgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmluZyBhcyBhbiB7QGNvZGUgT2JqZWN0fS4gVGhpcyBtZXRob2QgaXMKKyAgICAgKiBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBzYXRpc2Z5IHRoZSB7QGNvZGUgRW51bWVyYXRpb259IGludGVyZmFjZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG5leHQgdG9rZW4gaW4gdGhlIHN0cmluZyBhcyBhbiBPYmplY3QKKyAgICAgKiBAcmV0dXJuIG5leHQgdG9rZW4gaW4gdGhlIHN0cmluZyBhcyBhbiB7QGNvZGUgT2JqZWN0fQogICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIHRva2VucyByZW1haW4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyB0b2tlbnMgcmVtYWluLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CiAgICAgICAgIHJldHVybiBuZXh0VG9rZW4oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJpbmcgYXMgYSBTdHJpbmcuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyaW5nIGFzIGEge0Bjb2RlIFN0cmluZ30uCiAgICAgICogCi0gICAgICogQHJldHVybiBuZXh0IHRva2VuIGluIHRoZSBzdHJpbmcgYXMgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIG5leHQgdG9rZW4gaW4gdGhlIHN0cmluZyBhcyBhIHtAY29kZSBTdHJpbmd9LgogICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIHRva2VucyByZW1haW4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyB0b2tlbnMgcmVtYWluLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgbmV4dFRva2VuKCkgewogICAgICAgICBpbnQgaSA9IHBvc2l0aW9uOwpAQCAtMTg1LDE2ICsyOTksMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJpbmcgYXMgYSBTdHJpbmcuIFRoZSBkZWxpbWl0ZXJzIHVzZWQgYXJlCi0gICAgICogY2hhbmdlZCB0byB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyaW5nIGFzIGEge0Bjb2RlIFN0cmluZ30uIFRoZSBkZWxpbWl0ZXJzCisgICAgICogdXNlZCBhcmUgY2hhbmdlZCB0byB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRlbGltcwotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBkZWxpbWl0ZXJzIHRvIHVzZQotICAgICAqIEByZXR1cm4gbmV4dCB0b2tlbiBpbiB0aGUgc3RyaW5nIGFzIGEgU3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGRlbGltaXRlcnMgdG8gdXNlLgorICAgICAqIEByZXR1cm4gbmV4dCB0b2tlbiBpbiB0aGUgc3RyaW5nIGFzIGEge0Bjb2RlIFN0cmluZ30uCiAgICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgbm8gdG9rZW5zIHJlbWFpbgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIHRva2VucyByZW1haW4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBuZXh0VG9rZW4oU3RyaW5nIGRlbGltcykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgIGlmIChkZWxpbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgdGhpcy5kZWxpbWl0ZXJzID0gZGVsaW1zOwogICAgICAgICByZXR1cm4gbmV4dFRva2VuKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UaW1lWm9uZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UaW1lWm9uZS5qYXZhCmluZGV4IGEzOGE0MDUuLmM5NzA5Y2UgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVGltZVpvbmUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RpbWVab25lLmphdmEKQEAgLTE0LDkgKzE0LDIyIEBACiAgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gVGhlIGNsYXNzIGphdmFkb2MgYW5kIHNvbWUgb2YgdGhlIG1ldGhvZCBkZXNjcmlwdGlvbnMgYXJlIGNvcGllZCBmcm9tIElDVTRKCisvLyBzb3VyY2UgZmlsZXMuIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGNvcGllZCBkZXNjcmlwdGlvbnMuCisvLyBUaGUgaWN1IGxpY2Vuc2UgaGVhZGVyIHdhcyBhZGRlZCB0byB0aGlzIGZpbGUuIAorLy8gRU5EIGFuZHJvaWQtbm90ZQogCiBwYWNrYWdlIGphdmEudXRpbDsKIAorCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKIC8vIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CkBAIC0yNSwyMiArMzgsNjIgQEAKIC8vIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uOwogLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogCisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwudXRpbC5ab25lSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC51dGlsLlpvbmVJbmZvREI7CiBpbXBvcnQgY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzOwotCisvLyBFTkQgYW5kcm9pZC1hZGRlZAogLyoqCi0gKiBUaW1lWm9uZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCByZXByZXNlbnRzIGEgbG9jYWwgdGltZSB6b25lIGFuZCBpdHMKLSAqIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBydWxlcy4gU3ViY2xhc3NlcyBzdXBwb3J0IGEgcGFydGljdWxhciBjYWxlbmRhciB0eXBlLAotICogc3VjaCBhcyB0aGUgZ3JlZ29yaWFuIGNhbGVuZGFyLgorICoge0Bjb2RlIFRpbWVab25lfSByZXByZXNlbnRzIGEgdGltZSB6b25lIG9mZnNldCwgdGFraW5nIGludG8gYWNjb3VudAorICogZGF5bGlnaHQgc2F2aW5ncy4KKyAqIDxwPgorICogVHlwaWNhbGx5LCB5b3UgZ2V0IGEge0Bjb2RlIFRpbWVab25lfSB1c2luZyB7QGNvZGUgZ2V0RGVmYXVsdH0KKyAqIHdoaWNoIGNyZWF0ZXMgYSB7QGNvZGUgVGltZVpvbmV9IGJhc2VkIG9uIHRoZSB0aW1lIHpvbmUgd2hlcmUgdGhlCisgKiBwcm9ncmFtIGlzIHJ1bm5pbmcuIEZvciBleGFtcGxlLCBmb3IgYSBwcm9ncmFtIHJ1bm5pbmcgaW4gSmFwYW4sCisgKiB7QGNvZGUgZ2V0RGVmYXVsdH0gY3JlYXRlcyBhIHtAY29kZSBUaW1lWm9uZX0gb2JqZWN0IGJhc2VkIG9uCisgKiBKYXBhbmVzZSBTdGFuZGFyZCBUaW1lLgorICogPHA+CisgKiBZb3UgY2FuIGFsc28gZ2V0IGEge0Bjb2RlIFRpbWVab25lfSB1c2luZyB7QGNvZGUgZ2V0VGltZVpvbmV9CisgKiBhbG9uZyB3aXRoIGEgdGltZSB6b25lIElELiBGb3IgaW5zdGFuY2UsIHRoZSB0aW1lIHpvbmUgSUQgZm9yIHRoZSBVLlMuCisgKiBQYWNpZmljIFRpbWUgem9uZSBpcyAiQW1lcmljYS9Mb3NfQW5nZWxlcyIuIFNvLCB5b3UgY2FuIGdldCBhIFUuUy4gUGFjaWZpYworICogVGltZSB7QGNvZGUgVGltZVpvbmV9IG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmc6IDxibG9ja3F1b3RlPgogICogCi0gKiBQbGVhc2Ugbm90ZSB0aGUgdHlwZSByZXR1cm5lZCBieSBmYWN0b3J5IG1ldGhvZHMsIGkuZS4gPGNvZGU+Z2V0RGVmYXVsdCgpPC9jb2RlPiAKLSAqIGFuZCA8Y29kZT5nZXRUaW1lWm9uZShTdHJpbmcpPC9jb2RlPiwgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LCBzbyB0aGF0IAotICogaXQgbWF5IGludHJvZHVjZSBzZXJpYWxpemF0aW9uIGluY29tcGF0aWJpbGl0eSBpc3N1ZSBiZXR3ZWVuIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMuIAotICogSGFybW9ueSByZXR1cm5zIGluc3RhbmNlIG9mIHtAbGluayBTaW1wbGVUaW1lWm9uZSBTaW1wbGVUaW1lWm9uZX0gc28gdGhhdCB0aGUgCi0gKiBieXRlcyBzZXJpYWxpemVkIGJ5IEhhcm1vbnkgY2FuIGJlIGRlc2VyaWFsaXplZCBvbiBvdGhlciBpbXBsZW1lbnRhdGlvbiBzdWNjZXNzZnVsbHksIAotICogYnV0IHRoZSByZXZlcnNlIGNvbXBhdGliaWxpdHkgY2Fubm90IGJlIGd1YXJhbnRlZWQuIAorICogPHByZT4KKyAqIFRpbWVab25lIHR6ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoJnF1b3Q7QW1lcmljYS9Mb3NfQW5nZWxlcyZxdW90Oyk7CisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPiBZb3UgY2FuIHVzZSB0aGUge0Bjb2RlIGdldEF2YWlsYWJsZUlEc30gbWV0aG9kIHRvIGl0ZXJhdGUKKyAqIHRocm91Z2ggYWxsIHRoZSBzdXBwb3J0ZWQgdGltZSB6b25lIElEcy4gWW91IGNhbiB0aGVuIGNob29zZSBhIHN1cHBvcnRlZCBJRAorICogdG8gZ2V0IGEge0Bjb2RlIFRpbWVab25lfS4gSWYgdGhlIHRpbWUgem9uZSB5b3Ugd2FudCBpcyBub3QKKyAqIHJlcHJlc2VudGVkIGJ5IG9uZSBvZiB0aGUgc3VwcG9ydGVkIElEcywgdGhlbiB5b3UgY2FuIGNyZWF0ZSBhIGN1c3RvbSB0aW1lCisgKiB6b25lIElEIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6IDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogR01UWyt8LV1oaFtbOl1tbV0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+IEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc3BlY2lmeSBHTVQrMTQ6MDAgYXMgYSBjdXN0b20gdGltZSB6b25lCisgKiBJRC4gVGhlIHtAY29kZSBUaW1lWm9uZX0gdGhhdCBpcyByZXR1cm5lZCB3aGVuIHlvdSBzcGVjaWZ5IGEgY3VzdG9tCisgKiB0aW1lIHpvbmUgSUQgZG9lcyBub3QgaW5jbHVkZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUuCisgKiA8cD4KKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggSkRLIDEuMS54LCBzb21lIG90aGVyIHRocmVlLWxldHRlciB0aW1lIHpvbmUgSURzIChzdWNoCisgKiBhcyAiUFNUIiwgIkNUVCIsICJBU1QiKSBhcmUgYWxzbyBzdXBwb3J0ZWQuIEhvd2V2ZXIsIDxzdHJvbmc+dGhlaXIgdXNlIGlzCisgKiBkZXByZWNhdGVkPC9zdHJvbmc+IGJlY2F1c2UgdGhlIHNhbWUgYWJicmV2aWF0aW9uIGlzIG9mdGVuIHVzZWQgZm9yIG11bHRpcGxlCisgKiB0aW1lIHpvbmVzIChmb3IgZXhhbXBsZSwgIkNTVCIgY291bGQgYmUgVS5TLiAiQ2VudHJhbCBTdGFuZGFyZCBUaW1lIiBhbmQKKyAqICJDaGluYSBTdGFuZGFyZCBUaW1lIiksIGFuZCB0aGUgSmF2YSBwbGF0Zm9ybSBjYW4gdGhlbiBvbmx5IHJlY29nbml6ZSBvbmUgb2YKKyAqIHRoZW0uCisgKiA8cD4KKyAqIFBsZWFzZSBub3RlIHRoZSB0eXBlIHJldHVybmVkIGJ5IGZhY3RvcnkgbWV0aG9kcywgaS5lLgorICoge0Bjb2RlIGdldERlZmF1bHQoKX0gYW5kIHtAY29kZSBnZXRUaW1lWm9uZShTdHJpbmcpfSwgaXMKKyAqIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCwgc28gaXQgbWF5IGludHJvZHVjZSBzZXJpYWxpemF0aW9uCisgKiBpbmNvbXBhdGliaWxpdHkgaXNzdWVzIGJldHdlZW4gZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucy4gQW5kcm9pZCByZXR1cm5zCisgKiBpbnN0YW5jZXMgb2Yge0BsaW5rIFNpbXBsZVRpbWVab25lfSBzbyB0aGF0IHRoZSBieXRlcyBzZXJpYWxpemVkIGJ5IEFuZHJvaWQKKyAqIGNhbiBiZSBkZXNlcmlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IG9uIG90aGVyIGltcGxlbWVudGF0aW9ucywgYnV0IHRoZSByZXZlcnNlCisgKiBjb21wYXRpYmlsaXR5IGNhbm5vdCBiZSBndWFyYW50ZWVkLgogICogCiAgKiBAc2VlIEdyZWdvcmlhbkNhbGVuZGFyCiAgKiBAc2VlIFNpbXBsZVRpbWVab25lCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGltZVpvbmUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CkBAIC00OCwzOCArMTAxLDQzIEBACiAKICAgICAvKioKICAgICAgKiBUaGUgU0hPUlQgZGlzcGxheSBuYW1lIHN0eWxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUID0gMDsKIAogICAgIC8qKgogICAgICAqIFRoZSBMT05HIGRpc3BsYXkgbmFtZSBzdHlsZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT05HID0gMTsKIAotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgVGltZVpvbmU+IEF2YWlsYWJsZVpvbmVzOwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotICAgIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgIC8vIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBUaW1lWm9uZT4gQXZhaWxhYmxlWm9uZXM7CisgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgVGltZVpvbmUgRGVmYXVsdDsKIAogICAgIHN0YXRpYyBUaW1lWm9uZSBHTVQgPSBuZXcgU2ltcGxlVGltZVpvbmUoMCwgIkdNVCIpOyAvLyBHcmVlbndpY2ggTWVhbiBUaW1lCiAKICAgICBwcml2YXRlIFN0cmluZyBJRDsKIAotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVBdmFpbGFibGUoKSB7Ci0vLyAgICAgICAgVGltZVpvbmVbXSB6b25lcyA9IFRpbWVab25lcy5nZXRUaW1lWm9uZXMoKTsKLS8vICAgICAgICBBdmFpbGFibGVab25lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGltZVpvbmU+KCh6b25lcy5sZW5ndGggKyAxKSAqIDQgLyAzKTsKLS8vICAgICAgICBBdmFpbGFibGVab25lcy5wdXQoR01ULmdldElEKCksIEdNVCk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB6b25lcy5sZW5ndGg7IGkrKykgewotLy8gICAgICAgICAgICBBdmFpbGFibGVab25lcy5wdXQoem9uZXNbaV0uZ2V0SUQoKSwgem9uZXNbaV0pOwotLy8gICAgICAgIH0KLS8vICAgIH0KLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKLSAgICAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVBdmFpbGFibGUoKSB7CisgICAgLy8gICAgIFRpbWVab25lW10gem9uZXMgPSBUaW1lWm9uZXMuZ2V0VGltZVpvbmVzKCk7CisgICAgLy8gICAgIEF2YWlsYWJsZVpvbmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUaW1lWm9uZT4oKHpvbmVzLmxlbmd0aCArIDEpICogNCAvIDMpOworICAgIC8vICAgICBBdmFpbGFibGVab25lcy5wdXQoR01ULmdldElEKCksIEdNVCk7CisgICAgLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgem9uZXMubGVuZ3RoOyBpKyspIHsKKyAgICAvLyAgICAgICAgIEF2YWlsYWJsZVpvbmVzLnB1dCh6b25lc1tpXS5nZXRJRCgpLCB6b25lc1tpXSk7CisgICAgLy8gICAgIH0KKyAgICAvLyB9CisgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lWm9uZSgpIHsKICAgICB9CkBAIC05NSwxMiArMTUzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBUaW1lWm9uZSB3aXRoIHRoZSBzYW1lIElELCByYXdPZmZzZXQgYW5kIGRheWxpZ2h0IHNhdmluZ3MKLSAgICAgKiB0aW1lIHJ1bGVzIGFzIHRoaXMgVGltZVpvbmUuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgVGltZVpvbmV9IHdpdGggdGhlIHNhbWUgSUQsIHtAY29kZSByYXdPZmZzZXR9IGFuZCBkYXlsaWdodCBzYXZpbmdzCisgICAgICogdGltZSBydWxlcyBhcyB0aGlzIHtAY29kZSBUaW1lWm9uZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIFRpbWVab25lCi0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBUaW1lWm9uZX0uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKQEAgLTExMyw2NiArMTcxLDcxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXZhaWxhYmxlIHRpbWUgem9uZSBJRHMuCisgICAgICogR2V0cyB0aGUgYXZhaWxhYmxlIHRpbWUgem9uZSBJRHMuIEFueSBvbmUgb2YgdGhlc2UgSURzIGNhbiBiZSBwYXNzZWQgdG8KKyAgICAgKiB7QGNvZGUgZ2V0KCl9IHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyB7QGNvZGUgVGltZVpvbmV9IGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGltZSB6b25lIElEIHN0cmluZ3MKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRpbWUgem9uZSBJRCBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldEF2YWlsYWJsZUlEcygpIHsKLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgICAgIGlmIChBdmFpbGFibGVab25lcyA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgIGluaXRpYWxpemVBdmFpbGFibGUoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgaW50IGxlbmd0aCA9IEF2YWlsYWJsZVpvbmVzLnNpemUoKTsKLS8vICAgICAgICBTdHJpbmdbXSBhbnN3ZXIgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0vLyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBrZXlzID0gQXZhaWxhYmxlWm9uZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0vLyAgICAgICAgICAgIGFuc3dlcltpXSA9IGtleXMubmV4dCgpOwotLy8gICAgICAgIH0KLS8vICAgICAgICByZXR1cm4gYW5zd2VyOwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGlmIChBdmFpbGFibGVab25lcyA9PSBudWxsKSB7CisgICAgICAgIC8vICAgICBpbml0aWFsaXplQXZhaWxhYmxlKCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gaW50IGxlbmd0aCA9IEF2YWlsYWJsZVpvbmVzLnNpemUoKTsKKyAgICAgICAgLy8gU3RyaW5nW10gYW5zd2VyID0gbmV3IFN0cmluZ1tsZW5ndGhdOworICAgICAgICAvLyBJdGVyYXRvcjxTdHJpbmc+IGtleXMgPSBBdmFpbGFibGVab25lcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAvLyBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIC8vICAgICBhbnN3ZXJbaV0gPSBrZXlzLm5leHQoKTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyByZXR1cm4gYW5zd2VyOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICByZXR1cm4gWm9uZUluZm9EQi5nZXRBdmFpbGFibGVJRHMoKTsKLS8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXZhaWxhYmxlIHRpbWUgem9uZSBJRHMgd2hpY2ggbWF0Y2ggdGhlIHNwZWNpZmllZCBvZmZzZXQgZnJvbQotICAgICAqIEdNVC4KKyAgICAgKiBHTVQuIEFueSBvbmUgb2YgdGhlc2UgSURzIGNhbiBiZSBwYXNzZWQgdG8ge0Bjb2RlIGdldCgpfSB0byBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiB7QGNvZGUgVGltZVpvbmV9IGluc3RhbmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZnJvbSBHTVQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aW1lIHpvbmUgSUQgc3RyaW5ncworICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBmcm9tIEdNVCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aW1lIHpvbmUgSUQgc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXRBdmFpbGFibGVJRHMoaW50IG9mZnNldCkgewotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICAgICAgaWYgKEF2YWlsYWJsZVpvbmVzID09IG51bGwpIHsKLS8vICAgICAgICAgICAgaW5pdGlhbGl6ZUF2YWlsYWJsZSgpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpbnQgY291bnQgPSAwLCBsZW5ndGggPSBBdmFpbGFibGVab25lcy5zaXplKCk7Ci0vLyAgICAgICAgU3RyaW5nW10gYWxsID0gbmV3IFN0cmluZ1tsZW5ndGhdOwotLy8gICAgICAgIEl0ZXJhdG9yPFRpbWVab25lPiB6b25lcyA9IEF2YWlsYWJsZVpvbmVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotLy8gICAgICAgICAgICBUaW1lWm9uZSB0eiA9IHpvbmVzLm5leHQoKTsKLS8vICAgICAgICAgICAgaWYgKHR6LmdldFJhd09mZnNldCgpID09IG9mZnNldCkgewotLy8gICAgICAgICAgICAgICAgYWxsW2NvdW50KytdID0gdHouZ2V0SUQoKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgICBTdHJpbmdbXSBhbnN3ZXIgPSBuZXcgU3RyaW5nW2NvdW50XTsKLS8vICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFsbCwgMCwgYW5zd2VyLCAwLCBjb3VudCk7Ci0vLyAgICAgICAgcmV0dXJuIGFuc3dlcjsKLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGlmIChBdmFpbGFibGVab25lcyA9PSBudWxsKSB7CisgICAgICAgIC8vICAgICBpbml0aWFsaXplQXZhaWxhYmxlKCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gaW50IGNvdW50ID0gMCwgbGVuZ3RoID0gQXZhaWxhYmxlWm9uZXMuc2l6ZSgpOworICAgICAgICAvLyBTdHJpbmdbXSBhbGwgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisgICAgICAgIC8vIEl0ZXJhdG9yPFRpbWVab25lPiB6b25lcyA9IEF2YWlsYWJsZVpvbmVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgLy8gICAgIFRpbWVab25lIHR6ID0gem9uZXMubmV4dCgpOworICAgICAgICAvLyAgICAgaWYgKHR6LmdldFJhd09mZnNldCgpID09IG9mZnNldCkgeworICAgICAgICAvLyAgICAgICAgIGFsbFtjb3VudCsrXSA9IHR6LmdldElEKCk7CisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gU3RyaW5nW10gYW5zd2VyID0gbmV3IFN0cmluZ1tjb3VudF07CisgICAgICAgIC8vIFN5c3RlbS5hcnJheWNvcHkoYWxsLCAwLCBhbnN3ZXIsIDAsIGNvdW50KTsKKyAgICAgICAgLy8gcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogICAgICAgICAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICByZXR1cm4gWm9uZUluZm9EQi5nZXRBdmFpbGFibGVJRHMob2Zmc2V0KTsKLS8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIAogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdGltZSB6b25lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGltZSB6b25lCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB0aW1lIHpvbmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgVGltZVpvbmUgZ2V0RGVmYXVsdCgpIHsKICAgICAgICAgaWYgKERlZmF1bHQgPT0gbnVsbCkgewpAQCAtMTgyLDc4ICsyNDUsODQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBMT05HIG5hbWUgZm9yIHRoaXMgVGltZVpvbmUgZm9yIHRoZSBkZWZhdWx0IExvY2FsZSBpbiBzdGFuZGFyZAorICAgICAqIEdldHMgdGhlIExPTkcgbmFtZSBmb3IgdGhpcyB7QGNvZGUgVGltZVpvbmV9IGZvciB0aGUgZGVmYXVsdCB7QGNvZGUgTG9jYWxlfSBpbiBzdGFuZGFyZAogICAgICAqIHRpbWUuIElmIHRoZSBuYW1lIGlzIG5vdCBhdmFpbGFibGUsIHRoZSByZXN1bHQgaXMgaW4gdGhlIGZvcm1hdAotICAgICAqIEdNVFsrLV1oaDptbS4KKyAgICAgKiB7QGNvZGUgR01UWystXWhoOm1tfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUaW1lWm9uZSBuYW1lCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFRpbWVab25lfSBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7CiAgICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZShmYWxzZSwgTE9ORywgTG9jYWxlLmdldERlZmF1bHQoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTE9ORyBuYW1lIGZvciB0aGlzIFRpbWVab25lIGZvciB0aGUgc3BlY2lmaWVkIExvY2FsZSBpbiBzdGFuZGFyZAorICAgICAqIEdldHMgdGhlIExPTkcgbmFtZSBmb3IgdGhpcyB7QGNvZGUgVGltZVpvbmV9IGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9IGluIHN0YW5kYXJkCiAgICAgICogdGltZS4gSWYgdGhlIG5hbWUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIHJlc3VsdCBpcyBpbiB0aGUgZm9ybWF0Ci0gICAgICogR01UWystXWhoOm1tLgorICAgICAqIHtAY29kZSBHTVRbKy1daGg6bW19LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIHRoZSBUaW1lWm9uZSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIExvY2FsZX0uCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFRpbWVab25lfSBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoZmFsc2UsIExPTkcsIGxvY2FsZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHN0eWxlIG9mIG5hbWUgKExPTkcgb3IgU0hPUlQpIGZvciB0aGlzIFRpbWVab25lIGZvcgotICAgICAqIHRoZSBkZWZhdWx0IExvY2FsZSBpbiBlaXRoZXIgc3RhbmRhcmQgb3IgZGF5bGlnaHQgdGltZSBhcyBzcGVjaWZpZWQuIElmCi0gICAgICogdGhlIG5hbWUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIHJlc3VsdCBpcyBpbiB0aGUgZm9ybWF0IEdNVFsrLV1oaDptbS4KKyAgICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgc3R5bGUgb2YgbmFtZSAoe0Bjb2RlIExPTkd9IG9yIHtAY29kZSBTSE9SVH0pIGZvciB0aGlzIHtAY29kZSBUaW1lWm9uZX0gZm9yCisgICAgICogdGhlIGRlZmF1bHQge0Bjb2RlIExvY2FsZX0gaW4gZWl0aGVyIHN0YW5kYXJkIG9yIGRheWxpZ2h0IHRpbWUgYXMgc3BlY2lmaWVkLiBJZgorICAgICAqIHRoZSBuYW1lIGlzIG5vdCBhdmFpbGFibGUsIHRoZSByZXN1bHQgaXMgaW4gdGhlIGZvcm1hdCB7QGNvZGUgR01UWystXWhoOm1tfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF5bGlnaHRUaW1lCi0gICAgICogICAgICAgICAgICB0cnVlIGZvciBkYXlsaWdodCB0aW1lLCBmYWxzZSBmb3Igc3RhbmRhcmQgdGltZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGZvciBkYXlsaWdodCB0aW1lLCB7QGNvZGUgZmFsc2V9IGZvciBzdGFuZGFyZAorICAgICAqICAgICAgICAgICAgdGltZS4KICAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKiAgICAgICAgICAgIEVpdGhlciBMT05HIG9yIFNIT1JUCi0gICAgICogQHJldHVybiB0aGUgVGltZVpvbmUgbmFtZQorICAgICAqICAgICAgICAgICAgRWl0aGVyIHtAY29kZSBMT05HfSBvciB7QGNvZGUgU0hPUlR9LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBUaW1lWm9uZX0gbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERpc3BsYXlOYW1lKGJvb2xlYW4gZGF5bGlnaHRUaW1lLCBpbnQgc3R5bGUpIHsKICAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKGRheWxpZ2h0VGltZSwgc3R5bGUsIExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNwZWNpZmllZCBzdHlsZSBvZiBuYW1lIChMT05HIG9yIFNIT1JUKSBmb3IgdGhpcyBUaW1lWm9uZSBmb3IKLSAgICAgKiB0aGUgc3BlY2lmaWVkIExvY2FsZSBpbiBlaXRoZXIgc3RhbmRhcmQgb3IgZGF5bGlnaHQgdGltZSBhcyBzcGVjaWZpZWQuIElmCi0gICAgICogdGhlIG5hbWUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIHJlc3VsdCBpcyBpbiB0aGUgZm9ybWF0IEdNVFsrLV1oaDptbS4KKyAgICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgc3R5bGUgb2YgbmFtZSAoe0Bjb2RlIExPTkd9IG9yIHtAY29kZSBTSE9SVH0pIGZvciB0aGlzIHtAY29kZSBUaW1lWm9uZX0gZm9yCisgICAgICogdGhlIHNwZWNpZmllZCB7QGNvZGUgTG9jYWxlfSBpbiBlaXRoZXIgc3RhbmRhcmQgb3IgZGF5bGlnaHQgdGltZSBhcyBzcGVjaWZpZWQuIElmCisgICAgICogdGhlIG5hbWUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIHJlc3VsdCBpcyBpbiB0aGUgZm9ybWF0IHtAY29kZSBHTVRbKy1daGg6bW19LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkYXlsaWdodFRpbWUKLSAgICAgKiAgICAgICAgICAgIHRydWUgZm9yIGRheWxpZ2h0IHRpbWUsIGZhbHNlIGZvciBzdGFuZGFyZCB0aW1lCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gZm9yIGRheWxpZ2h0IHRpbWUsIHtAY29kZSBmYWxzZX0gZm9yIHN0YW5kYXJkCisgICAgICogICAgICAgICAgICB0aW1lLgogICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqICAgICAgICAgICAgRWl0aGVyIExPTkcgb3IgU0hPUlQKKyAgICAgKiAgICAgICAgICAgIEVpdGhlciBMT05HIG9yIFNIT1JULgogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIHRoZSBUaW1lWm9uZSBuYW1lCisgICAgICogICAgICAgICAgICBFaXRoZXIge0Bjb2RlIExPTkd9IG9yIHtAY29kZSBTSE9SVH0uCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFRpbWVab25lfSBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoYm9vbGVhbiBkYXlsaWdodFRpbWUsIGludCBzdHlsZSwgTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBpZiAoc3R5bGUgPT0gU0hPUlQgfHwgc3R5bGUgPT0gTE9ORykgewogICAgICAgICAgICAgYm9vbGVhbiB1c2VEYXlsaWdodCA9IGRheWxpZ2h0VGltZSAmJiB1c2VEYXlsaWdodFRpbWUoKTsKLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotLy8gICAgICAgICAgICBEYXRlRm9ybWF0U3ltYm9scyBkYXRhID0gbmV3IERhdGVGb3JtYXRTeW1ib2xzKGxvY2FsZSk7Ci0vLyAgICAgICAgICAgIFN0cmluZyBpZCA9IGdldElEKCk7Ci0vLyAgICAgICAgICAgIFN0cmluZ1tdW10gem9uZXMgPSBkYXRhLmdldFpvbmVTdHJpbmdzKCk7Ci0vLyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgem9uZXMubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoem9uZXNbaV1bMF0pKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlID09IFNIT1JUID8gem9uZXNbaV1bdXNlRGF5bGlnaHQgPyA0IDogMl0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogem9uZXNbaV1bdXNlRGF5bGlnaHQgPyAzIDogMV07Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgICAgICAvLyBEYXRlRm9ybWF0U3ltYm9scyBkYXRhID0gbmV3IERhdGVGb3JtYXRTeW1ib2xzKGxvY2FsZSk7CisgICAgICAgICAgICAvLyBTdHJpbmcgaWQgPSBnZXRJRCgpOworICAgICAgICAgICAgLy8gU3RyaW5nW11bXSB6b25lcyA9IGRhdGEuZ2V0Wm9uZVN0cmluZ3MoKTsKKyAgICAgICAgICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgem9uZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vICAgICBpZiAoaWQuZXF1YWxzKHpvbmVzW2ldWzBdKSkgeworICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gc3R5bGUgPT0gU0hPUlQgPyB6b25lc1tpXVt1c2VEYXlsaWdodCA/IDQgOiAyXQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIDogem9uZXNbaV1bdXNlRGF5bGlnaHQgPyAzIDogMV07CisgICAgICAgICAgICAvLyAgICAgfQorICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCiAgICAgICAgICAgICAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBSZXNvdXJjZXMuZ2V0RGlzcGxheVRpbWVab25lKGdldElEKCksIGRheWxpZ2h0VGltZSwgc3R5bGUsIGxvY2FsZS50b1N0cmluZygpKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgICAgIAogICAgICAgICAgICAgaW50IG9mZnNldCA9IGdldFJhd09mZnNldCgpOwogICAgICAgICAgICAgaWYgKHVzZURheWxpZ2h0ICYmIHRoaXMgaW5zdGFuY2VvZiBTaW1wbGVUaW1lWm9uZSkgewpAQCAtMjc3LDE2ICszNDYsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJRCBvZiB0aGlzIFRpbWVab25lLgorICAgICAqIEdldHMgdGhlIElEIG9mIHRoaXMge0Bjb2RlIFRpbWVab25lfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lIHpvbmUgSUQgc3RyaW5nCisgICAgICogQHJldHVybiB0aGUgdGltZSB6b25lIElEIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgewogICAgICAgICByZXR1cm4gSUQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF5bGlnaHQgc2F2aW5ncyBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGlzIFRpbWVab25lLgorICAgICAqIEdldHMgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgb2Zmc2V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhpcyB7QGNvZGUgVGltZVpvbmV9LgogICAgICAqIDxwPgogICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyAzNjAwMDAwICgxIGhvdXIpLCBvciAwIGlmIHRoZSB0aW1lIHpvbmUgZG9lcwogICAgICAqIG5vdCBvYnNlcnZlIGRheWxpZ2h0IHNhdmluZ3MuCkBAIC0yOTUsOSArMzY1LDkgQEAKICAgICAgKiBob3VyLgogICAgICAqIDxwPgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRheWxpZ2h0IHNhdmluZ3Mgb2Zmc2V0IGluIG1pbGxpc2Vjb25kcyBpZiB0aGlzIFRpbWVab25lCisgICAgICogQHJldHVybiB0aGUgZGF5bGlnaHQgc2F2aW5ncyBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIGlmIHRoaXMge0Bjb2RlIFRpbWVab25lfQogICAgICAqICAgICAgICAgb2JzZXJ2ZXMgZGF5bGlnaHQgc2F2aW5ncywgemVybyBvdGhlcndpc2UuCi0gICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREU1RTYXZpbmdzKCkgewogICAgICAgICBpZiAodXNlRGF5bGlnaHRUaW1lKCkpIHsKQEAgLTMwNywxMyArMzc3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHRoaXMgVGltZVpvbmUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0ZS4gVGhlCisgICAgICogR2V0cyB0aGUgb2Zmc2V0IGZyb20gR01UIG9mIHRoaXMge0Bjb2RlIFRpbWVab25lfSBmb3IgdGhlIHNwZWNpZmllZCBkYXRlLiBUaGUKICAgICAgKiBvZmZzZXQgaW5jbHVkZXMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGlmIHRoZSBzcGVjaWZpZWQgZGF0ZSBpcyB3aXRoaW4gdGhlCiAgICAgICogZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGltZQogICAgICAqICAgICAgICAgICAgdGhlIGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCAwMDowMDowMCBHTVQKLSAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgZnJvbSBHTVQgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldChsb25nIHRpbWUpIHsKICAgICAgICAgaWYgKGluRGF5bGlnaHRUaW1lKG5ldyBEYXRlKHRpbWUpKSkgewpAQCAtMzIzLDU0ICszOTQsNTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBvZmZzZXQgZnJvbSBHTVQgb2YgdGhpcyBUaW1lWm9uZSBmb3IgdGhlIHNwZWNpZmllZCBkYXRlIGFuZAorICAgICAqIEdldHMgdGhlIG9mZnNldCBmcm9tIEdNVCBvZiB0aGlzIHtAY29kZSBUaW1lWm9uZX0gZm9yIHRoZSBzcGVjaWZpZWQgZGF0ZSBhbmQKICAgICAgKiB0aW1lLiBUaGUgb2Zmc2V0IGluY2x1ZGVzIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpZiB0aGUgc3BlY2lmaWVkIGRhdGUgYW5kCiAgICAgICogdGltZSBhcmUgd2l0aGluIHRoZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcGVyaW9kLgogICAgICAqIAogICAgICAqIEBwYXJhbSBlcmEKLSAgICAgKiAgICAgICAgICAgIHRoZSBHcmVnb3JpYW5DYWxlbmRhciBlcmEsIGVpdGhlciBHcmVnb3JpYW5DYWxlbmRhci5CQyBvcgotICAgICAqICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIuQUQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXJ9IGVyYSwgZWl0aGVyIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhci5CQ30gb3IKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhci5BRH0uCiAgICAgICogQHBhcmFtIHllYXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyCisgICAgICogICAgICAgICAgICB0aGUgeWVhci4KICAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBtb250aAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gbW9udGguCiAgICAgICogQHBhcmFtIGRheQotICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXkgb2YgdGhlIG1vbnRoLgogICAgICAqIEBwYXJhbSBkYXlPZldlZWsKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciBkYXkgb2YgdGhlIHdlZWsKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9IGRheSBvZiB0aGUgd2Vlay4KICAgICAgKiBAcGFyYW0gdGltZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgb2YgZGF5IGluIG1pbGxpc2Vjb25kcwotICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBmcm9tIEdNVCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIGRheSBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBwdWJsaWMgaW50IGdldE9mZnNldChpbnQgZXJhLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LAogICAgICAgICAgICAgaW50IGRheU9mV2VlaywgaW50IHRpbWUpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgb2Zmc2V0IGZvciBzdGFuZGFyZCB0aW1lIGZyb20gR01UIGZvciB0aGlzIFRpbWVab25lLgorICAgICAqIEdldHMgdGhlIG9mZnNldCBmb3Igc3RhbmRhcmQgdGltZSBmcm9tIEdNVCBmb3IgdGhpcyB7QGNvZGUgVGltZVpvbmV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBmcm9tIEdNVCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgZnJvbSBHTVQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgZ2V0UmF3T2Zmc2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgd2l0aCB0aGUgc3BlY2lmaWVkIElELgorICAgICAqIEdldHMgdGhlIHtAY29kZSBUaW1lWm9uZX0gd2l0aCB0aGUgc3BlY2lmaWVkIElELgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBhIHRpbWUgem9uZSBzdHJpbmcgSUQKLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lIHpvbmUgd2l0aCB0aGUgc3BlY2lmaWVkIElEIG9yIG51bGwgaWYgYSB0aW1lIHpvbmUgd2l0aAotICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdAorICAgICAqICAgICAgICAgICAgYSB0aW1lIHpvbmUgc3RyaW5nIElELgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBUaW1lWm9uZX0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIG9yIG51bGwgaWYgbm8ge0Bjb2RlIFRpbWVab25lfSB3aXRoCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIElEIGV4aXN0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUaW1lWm9uZSBnZXRUaW1lWm9uZShTdHJpbmcgbmFtZSkgewotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICAgICAgaWYgKEF2YWlsYWJsZVpvbmVzID09IG51bGwpIHsKLS8vICAgICAgICAgICAgaW5pdGlhbGl6ZUF2YWlsYWJsZSgpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBUaW1lWm9uZSB6b25lID0gQXZhaWxhYmxlWm9uZXMuZ2V0KG5hbWUpOwotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgLy8gaWYgKEF2YWlsYWJsZVpvbmVzID09IG51bGwpIHsKKyAgICAgICAgLy8gICAgIGluaXRpYWxpemVBdmFpbGFibGUoKTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBUaW1lWm9uZSB6b25lID0gQXZhaWxhYmxlWm9uZXMuZ2V0KG5hbWUpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAgICAgICAgIAotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIFRpbWVab25lIHpvbmUgPSBab25lSW5mby5nZXRUaW1lWm9uZShuYW1lKTsKLS8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGlmICh6b25lID09IG51bGwpIHsKICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIkdNVCIpICYmIG5hbWUubGVuZ3RoKCkgPiAzKSB7CiAgICAgICAgICAgICAgICAgY2hhciBzaWduID0gbmFtZS5jaGFyQXQoMyk7CkBAIC00MzcsMTIgKzUxMSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHNwZWNpZmllZCBUaW1lWm9uZSBoYXMgdGhlIHNhbWUgcmF3IG9mZnNldCBhcyB0aGlzCi0gICAgICogVGltZVpvbmUuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQge0Bjb2RlIFRpbWVab25lfSBoYXMgdGhlIHNhbWUgcmF3IG9mZnNldCBhcyB0aGlzCisgICAgICoge0Bjb2RlIFRpbWVab25lfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gem9uZQotICAgICAqICAgICAgICAgICAgYSBUaW1lWm9uZQotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBUaW1lWm9uZXMgaGF2ZSB0aGUgc2FtZSByYXcgb2Zmc2V0LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIFRpbWVab25lfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSB7QGNvZGUgVGltZVpvbmV9IGhhdmUgdGhlIHNhbWUgcmF3IG9mZnNldCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1NhbWVSdWxlcyhUaW1lWm9uZSB6b25lKSB7CiAgICAgICAgIGlmICh6b25lID09IG51bGwpIHsKQEAgLTQ1MiwxMyArNTI4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgc3BlY2lmaWVkIERhdGUgaXMgaW4gdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QgZm9yCi0gICAgICogdGhpcyBUaW1lWm9uZS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB7QGNvZGUgRGF0ZX0gaXMgaW4gdGhlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QgZm9yCisgICAgICogdGhpcyB7QGNvZGUgVGltZVpvbmV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lCi0gICAgICogICAgICAgICAgICBhIERhdGUKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgRGF0ZSBpcyBpbiB0aGUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgRGF0ZX0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUge0Bjb2RlIERhdGV9IGlzIGluIHRoZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcGVyaW9kLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaW5EYXlsaWdodFRpbWUoRGF0ZSB0aW1lKTsKIApAQCAtNDczLDI2ICs1NTAsMjMgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKLSAgICAvLyBBdWdtZW50ZWQgdGhlIGphdmFkb2MuCi0gICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdGltZSB6b25lLiBJZiBwYXNzZWQgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4KLSAgICAgKiB0aGUgbmV4dCB0aW1lIHtAbGluayAjZ2V0RGVmYXVsdH0gaXMgY2FsbGVkLCB0aGUgZGVmYXVsdCB0aW1lCi0gICAgICogem9uZSB3aXRoIGJlIGRldGVybWluZWQuIFRoaXMgYmVoYXZpb3IgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4KLSAgICAgKiB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRoaXMgbWV0aG9kLCBidXQgaXQgZm9sbG93cyB0aGUgc3Bpcml0Ci0gICAgICogb2YgaXQuCisgICAgICogU2V0cyB0aGUgZGVmYXVsdCB0aW1lIHpvbmUuIElmIHBhc3NlZCB7QGNvZGUgbnVsbH0sIHRoZW4gdGhlIG5leHQKKyAgICAgKiB0aW1lIHtAbGluayAjZ2V0RGVmYXVsdH0gaXMgY2FsbGVkLCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgd2lsbCBiZQorICAgICAqIGRldGVybWluZWQuIFRoaXMgYmVoYXZpb3IgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlIGNhbm9uaWNhbAorICAgICAqIGRlc2NyaXB0aW9uIG9mIHRoaXMgbWV0aG9kLCBidXQgaXQgZm9sbG93cyB0aGUgc3Bpcml0IG9mIGl0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lem9uZQotICAgICAqICAgICAgICAgICAgYSBUaW1lWm9uZSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIFRpbWVab25lfSBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0KFRpbWVab25lIHRpbWV6b25lKSB7Ci0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotLy8gICAgICAgICAgICBEZWZhdWx0ID0gdGltZXpvbmU7Ci0vLyAgICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBpZiAodGltZXpvbmUgIT0gbnVsbCkgeworICAgICAgICAvLyAgICAgRGVmYXVsdCA9IHRpbWV6b25lOworICAgICAgICAvLyAgICAgcmV0dXJuOworICAgICAgICAvLyB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIERlZmF1bHQgPSB0aW1lem9uZTsKQEAgLTUwMSw0OCArNTc1LDQ5IEBACiAgICAgICAgIFpvbmVJbmZvREIuc2V0RGVmYXVsdCh0aW1lem9uZSk7CiAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIAotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICAgICAgU3RyaW5nIHpvbmUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlBY3Rpb248U3RyaW5nPigKLS8vICAgICAgICAidXNlci50aW1lem9uZSIpKTsKLS8vCi0vLyAgICAgICAgLy8gaWYgcHJvcGVydHkgdXNlci50aW1lem9uZSBpcyBub3Qgc2V0LCB3ZSBjYWxsIHRoZSBuYXRpdmUgbWV0aG9kCi0vLyAgICAgICAgLy8gZ2V0Q3VzdG9tVGltZVpvbmUKLS8vICAgICAgICBpZiAoem9uZSA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgIGludFtdIHR6aW5mbyA9IG5ldyBpbnRbMTBdOwotLy8gICAgICAgICAgICBib29sZWFuW10gaXNDdXN0b21UaW1lWm9uZSA9IG5ldyBib29sZWFuWzFdOwotLy8KLS8vICAgICAgICAgICAgU3RyaW5nIHpvbmVJZCA9IGdldEN1c3RvbVRpbWVab25lKHR6aW5mbywgaXNDdXN0b21UaW1lWm9uZSk7Ci0vLwotLy8gICAgICAgICAgICAvLyBpZiByZXR1cm5lZCBUaW1lWm9uZSBpcyBhIHVzZXIgY3VzdG9taXplZCBUaW1lWm9uZQotLy8gICAgICAgICAgICBpZiAoaXNDdXN0b21UaW1lWm9uZVswXSkgewotLy8gICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBuZXcgU2ltcGxlVGltZVpvbmUKLS8vICAgICAgICAgICAgICAgIHN3aXRjaCAodHppbmZvWzFdKSB7Ci0vLyAgICAgICAgICAgICAgICBjYXNlIDA6Ci0vLyAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgb2JzZXJ2ZSBEU1QKLS8vICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gbmV3IFNpbXBsZVRpbWVab25lKHR6aW5mb1swXSwgem9uZUlkKTsKLS8vICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0vLyAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgRFNUCi0vLyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9IG5ldyBTaW1wbGVUaW1lWm9uZSh0emluZm9bMF0sIHpvbmVJZCwgdHppbmZvWzVdLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvWzRdLCB0emluZm9bM10sIHR6aW5mb1syXSwgdHppbmZvWzldLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvWzhdLCB0emluZm9bN10sIHR6aW5mb1s2XSwgdHppbmZvWzFdKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgIC8vIGdldCBUaW1lWm9uZQotLy8gICAgICAgICAgICAgICAgRGVmYXVsdCA9IGdldFRpbWVab25lKHpvbmVJZCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAvLyBpZiBwcm9wZXJ0eSB1c2VyLnRpbWV6b25lIGlzIHNldCBpbiBjb21tYW5kIGxpbmUgKHdpdGggLUQgb3B0aW9uKQotLy8gICAgICAgICAgICBEZWZhdWx0ID0gZ2V0VGltZVpvbmUoem9uZSk7Ci0vLyAgICAgICAgfQotLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgLy8gU3RyaW5nIHpvbmUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlBY3Rpb248U3RyaW5nPigKKyAgICAgICAgLy8gInVzZXIudGltZXpvbmUiKSk7CisgICAgICAgIC8vCisgICAgICAgIC8vIC8vIGlmIHByb3BlcnR5IHVzZXIudGltZXpvbmUgaXMgbm90IHNldCwgd2UgY2FsbCB0aGUgbmF0aXZlIG1ldGhvZAorICAgICAgICAvLyAvLyBnZXRDdXN0b21UaW1lWm9uZQorICAgICAgICAvLyBpZiAoem9uZSA9PSBudWxsKSB7CisgICAgICAgIC8vICAgIGludFtdIHR6aW5mbyA9IG5ldyBpbnRbMTBdOworICAgICAgICAvLyAgICAgYm9vbGVhbltdIGlzQ3VzdG9tVGltZVpvbmUgPSBuZXcgYm9vbGVhblsxXTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIFN0cmluZyB6b25lSWQgPSBnZXRDdXN0b21UaW1lWm9uZSh0emluZm8sIGlzQ3VzdG9tVGltZVpvbmUpOworICAgICAgICAvLworICAgICAgICAvLyAgICAgLy8gaWYgcmV0dXJuZWQgVGltZVpvbmUgaXMgYSB1c2VyIGN1c3RvbWl6ZWQgVGltZVpvbmUKKyAgICAgICAgLy8gICAgIGlmIChpc0N1c3RvbVRpbWVab25lWzBdKSB7CisgICAgICAgIC8vICAgICAgICAgLy8gYnVpbGQgYSBuZXcgU2ltcGxlVGltZVpvbmUKKyAgICAgICAgLy8gICAgICAgICBzd2l0Y2ggKHR6aW5mb1sxXSkgeworICAgICAgICAvLyAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgLy8gICAgICAgICAgICAgLy8gZG9lcyBub3Qgb2JzZXJ2ZSBEU1QKKyAgICAgICAgLy8gICAgICAgICAgICAgRGVmYXVsdCA9IG5ldyBTaW1wbGVUaW1lWm9uZSh0emluZm9bMF0sIHpvbmVJZCk7CisgICAgICAgIC8vICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vICAgICAgICAgICAgIC8vIG9ic2VydmVzIERTVAorICAgICAgICAvLyAgICAgICAgICAgICBEZWZhdWx0ID0gbmV3IFNpbXBsZVRpbWVab25lKHR6aW5mb1swXSwgem9uZUlkLCB0emluZm9bNV0sCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgdHppbmZvWzRdLCB0emluZm9bM10sIHR6aW5mb1syXSwgdHppbmZvWzldLAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHR6aW5mb1s4XSwgdHppbmZvWzddLCB0emluZm9bNl0sIHR6aW5mb1sxXSk7CisgICAgICAgIC8vICAgICAgICAgfQorICAgICAgICAvLyAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gICAgICAgICAvLyBnZXQgVGltZVpvbmUKKyAgICAgICAgLy8gICAgICAgICBEZWZhdWx0ID0gZ2V0VGltZVpvbmUoem9uZUlkKTsKKyAgICAgICAgLy8gICAgIH0KKyAgICAgICAgLy8gfSBlbHNlIHsKKyAgICAgICAgLy8gICAgIC8vIGlmIHByb3BlcnR5IHVzZXIudGltZXpvbmUgaXMgc2V0IGluIGNvbW1hbmQgbGluZSAod2l0aCAtRCBvcHRpb24pCisgICAgICAgIC8vICAgICBEZWZhdWx0ID0gZ2V0VGltZVpvbmUoem9uZSk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIElEIG9mIHRoaXMgVGltZVpvbmUuCisgICAgICogU2V0cyB0aGUgSUQgb2YgdGhpcyB7QGNvZGUgVGltZVpvbmV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyB3aGljaCBpcyB0aGUgdGltZSB6b25lIElECisgICAgICogICAgICAgICAgICBhIHN0cmluZyB3aGljaCBpcyB0aGUgdGltZSB6b25lIElELgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKQEAgLTU1Miw0MyArNjI3LDQ1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgb2Zmc2V0IGZvciBzdGFuZGFyZCB0aW1lIGZyb20gR01UIGZvciB0aGlzIFRpbWVab25lLgorICAgICAqIFNldHMgdGhlIG9mZnNldCBmb3Igc3RhbmRhcmQgdGltZSBmcm9tIEdNVCBmb3IgdGhpcyB7QGNvZGUgVGltZVpvbmV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZnJvbSBHTVQgaW4gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGZyb20gR01UIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBzZXRSYXdPZmZzZXQoaW50IG9mZnNldCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgVGltZVpvbmUgaGFzIGEgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB7QGNvZGUgVGltZVpvbmV9IGhhcyBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdGltZSB6b25lIGhhcyBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBUaW1lWm9uZX0gaGFzIGEgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIHVzZURheWxpZ2h0VGltZSgpOwogCi0vLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgIC8qKgotLy8gICAgICogR2V0cyB0aGUgbmFtZSBhbmQgdGhlIGRldGFpbHMgb2YgdGhlIHVzZXItc2VsZWN0ZWQgVGltZVpvbmUgb24gdGhlCi0vLyAgICAgKiBkZXZpY2UuCi0vLyAgICAgKiAKLS8vICAgICAqIEBwYXJhbSB0emluZm8KLS8vICAgICAqICAgICAgICAgICAgaW50IGFycmF5IG9mIDEwIGVsZW1lbnRzIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBUaW1lWm9uZQotLy8gICAgICogICAgICAgICAgICBpbmZvcm1hdGlvbi4gT25jZSBmaWxsZWQsIHRoZSBjb250ZW50cyBvZiB0aGUgYXJyYXkgYXJlCi0vLyAgICAgKiAgICAgICAgICAgIGZvcm1hdHRlZCBhcyBmb2xsb3dzOiB0emluZm9bMF0gLT4gdGhlIHRpbWV6b25lIG9mZnNldDsKLS8vICAgICAqICAgICAgICAgICAgdHppbmZvWzFdIC0+IHRoZSBkc3QgYWRqdXN0bWVudDsgdHppbmZvWzJdIC0+IHRoZSBkc3Qgc3RhcnQKLS8vICAgICAqICAgICAgICAgICAgaG91cjsgdHppbmZvWzNdIC0+IHRoZSBkc3Qgc3RhcnQgZGF5IG9mIHdlZWs7IHR6aW5mb1s0XSAtPiB0aGUKLS8vICAgICAqICAgICAgICAgICAgZHN0IHN0YXJ0IHdlZWsgb2YgbW9udGg7IHR6aW5mb1s1XSAtPiB0aGUgZHN0IHN0YXJ0IG1vbnRoOwotLy8gICAgICogICAgICAgICAgICB0emluZm9bNl0gLT4gdGhlIGRzdCBlbmQgaG91cjsgdHppbmZvWzddIC0+IHRoZSBkc3QgZW5kIGRheSBvZgotLy8gICAgICogICAgICAgICAgICB3ZWVrOyB0emluZm9bOF0gLT4gdGhlIGRzdCBlbmQgd2VlayBvZiBtb250aDsgdHppbmZvWzldIC0+IHRoZQotLy8gICAgICogICAgICAgICAgICBkc3QgZW5kIG1vbnRoOwotLy8gICAgICogQHBhcmFtIGlzQ3VzdG9tVGltZVpvbmUKLS8vICAgICAqICAgICAgICAgICAgYm9vbGVhbiBhcnJheSBvZiBzaXplIDEgdGhhdCBpbmRpY2F0ZXMgaWYgYSB0aW1lem9uZQotLy8gICAgICogICAgICAgICAgICBtYXRjaCBpcyBmb3VuZAotLy8gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgVGltZVpvbmUgb3IgbnVsbCBpZiBlcnJvciBvY2N1cnMgaW4gbmF0aXZlCi0vLyAgICAgKiAgICAgICAgIG1ldGhvZC4KLS8vICAgICAqLwotLy8gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRDdXN0b21UaW1lWm9uZShpbnRbXSB0emluZm8sCi0vLyAgICAgICAgICAgIGJvb2xlYW5bXSBpc0N1c3RvbVRpbWVab25lKTsKLS8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyAvKioKKyAgICAvLyAgKiBHZXRzIHRoZSBuYW1lIGFuZCB0aGUgZGV0YWlscyBvZiB0aGUgdXNlci1zZWxlY3RlZCBUaW1lWm9uZSBvbiB0aGUKKyAgICAvLyAgKiBkZXZpY2UuCisgICAgLy8gICogCisgICAgLy8gICogQHBhcmFtIHR6aW5mbworICAgIC8vICAqICAgICAgICAgICAgaW50IGFycmF5IG9mIDEwIGVsZW1lbnRzIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBUaW1lWm9uZQorICAgIC8vICAqICAgICAgICAgICAgaW5mb3JtYXRpb24uIE9uY2UgZmlsbGVkLCB0aGUgY29udGVudHMgb2YgdGhlIGFycmF5IGFyZQorICAgIC8vICAqICAgICAgICAgICAgZm9ybWF0dGVkIGFzIGZvbGxvd3M6IHR6aW5mb1swXSAtPiB0aGUgdGltZXpvbmUgb2Zmc2V0OworICAgIC8vICAqICAgICAgICAgICAgdHppbmZvWzFdIC0+IHRoZSBkc3QgYWRqdXN0bWVudDsgdHppbmZvWzJdIC0+IHRoZSBkc3Qgc3RhcnQKKyAgICAvLyAgKiAgICAgICAgICAgIGhvdXI7IHR6aW5mb1szXSAtPiB0aGUgZHN0IHN0YXJ0IGRheSBvZiB3ZWVrOyB0emluZm9bNF0gLT4gdGhlCisgICAgLy8gICogICAgICAgICAgICBkc3Qgc3RhcnQgd2VlayBvZiBtb250aDsgdHppbmZvWzVdIC0+IHRoZSBkc3Qgc3RhcnQgbW9udGg7CisgICAgLy8gICogICAgICAgICAgICB0emluZm9bNl0gLT4gdGhlIGRzdCBlbmQgaG91cjsgdHppbmZvWzddIC0+IHRoZSBkc3QgZW5kIGRheSBvZgorICAgIC8vICAqICAgICAgICAgICAgd2VlazsgdHppbmZvWzhdIC0+IHRoZSBkc3QgZW5kIHdlZWsgb2YgbW9udGg7IHR6aW5mb1s5XSAtPiB0aGUKKyAgICAvLyAgKiAgICAgICAgICAgIGRzdCBlbmQgbW9udGg7CisgICAgLy8gICogQHBhcmFtIGlzQ3VzdG9tVGltZVpvbmUKKyAgICAvLyAgKiAgICAgICAgICAgIGJvb2xlYW4gYXJyYXkgb2Ygc2l6ZSAxIHRoYXQgaW5kaWNhdGVzIGlmIGEgdGltZXpvbmUKKyAgICAvLyAgKiAgICAgICAgICAgIG1hdGNoIGlzIGZvdW5kCisgICAgLy8gICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgVGltZVpvbmUgb3IgbnVsbCBpZiBlcnJvciBvY2N1cnMgaW4gbmF0aXZlCisgICAgLy8gICogICAgICAgICBtZXRob2QuCisgICAgLy8gICovCisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRDdXN0b21UaW1lWm9uZShpbnRbXSB0emluZm8sCisgICAgLy8gICAgICAgICBib29sZWFuW10gaXNDdXN0b21UaW1lWm9uZSk7CisgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UaW1lci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UaW1lci5qYXZhCmluZGV4IDEwNzYwMTUuLmNjZmY5MjkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVGltZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RpbWVyLmphdmEKQEAgLTIwLDI2ICsyMCw0MiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnOwogCiAvKioKLSAqIFRpbWVycyBhcmUgdXNlZCB0byBzY2hlZHVsZSBqb2JzIGZvciBleGVjdXRpb24gaW4gYSBiYWNrZ3JvdW5kIHByb2Nlc3MuIEEKKyAqIHtAY29kZSBUaW1lcn1zIGFyZSB1c2VkIHRvIHNjaGVkdWxlIGpvYnMgZm9yIGV4ZWN1dGlvbiBpbiBhIGJhY2tncm91bmQgcHJvY2Vzcy4gQQogICogc2luZ2xlIHRocmVhZCBpcyB1c2VkIGZvciB0aGUgc2NoZWR1bGluZyBhbmQgdGhpcyB0aHJlYWQgaGFzIHRoZSBvcHRpb24gb2YKLSAqIGJlaW5nIGEgZGFlbW9uIHRocmVhZC4gQnkgY2FsbGluZyA8Y29kZT5jYW5jZWw8L2NvZGU+IHlvdSBjYW4gdGVybWluYXRlIGEKLSAqIHRpbWVyIGFuZCBpdCdzIGFzc29jaWF0ZWQgdGhyZWFkLiBBbGwgdGFza3Mgd2hpY2ggYXJlIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIKKyAqIGJlaW5nIGEgZGFlbW9uIHRocmVhZC4gQnkgY2FsbGluZyB7QGNvZGUgY2FuY2VsfSB5b3UgY2FuIHRlcm1pbmF0ZSBhCisgKiB7QGNvZGUgVGltZXJ9IGFuZCBpdHMgYXNzb2NpYXRlZCB0aHJlYWQuIEFsbCB0YXNrcyB3aGljaCBhcmUgc2NoZWR1bGVkIHRvIHJ1biBhZnRlcgogICogdGhpcyBwb2ludCBhcmUgY2FuY2VsbGVkLiBUYXNrcyBhcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5IGJ1dCBhcmUgc3ViamVjdCB0bwogICogdGhlIGRlbGF5cyBmcm9tIG90aGVyIHRhc2tzIHJ1biBtZXRob2RzLiBJZiBhIHNwZWNpZmljIHRhc2sgdGFrZXMgYW4KICAqIGV4Y2Vzc2l2ZSBhbW91bnQgb2YgdGltZSB0byBydW4gaXQgbWF5IGltcGFjdCB0aGUgdGltZSBhdCB3aGljaCBzdWJzZXF1ZW50CiAgKiB0YXNrcyBtYXkgcnVuLgogICogPHA+CiAgKiAKLSAqIFRoZSBUaW1lciB0YXNrIGRvZXMgbm90IG9mZmVyIGFueSBndWFyYW50ZWVzIGFib3V0IHRoZSByZWFsLXRpbWUgbmF0dXJlIG9mCi0gKiBzY2hlZHVsaW5nIHRhc2tzIGFzIGl0J3MgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlCi0gKiA8Y29kZT5PYmplY3Qud2FpdChsb25nKTwvY29kZT4gbWV0aG9kLgorICogVGhlIHtAY29kZSBUaW1lclRhc2t9IGRvZXMgbm90IG9mZmVyIGFueSBndWFyYW50ZWVzIGFib3V0IHRoZSByZWFsLXRpbWUgbmF0dXJlIG9mCisgKiBzY2hlZHVsaW5nIHRhc2tzIGFzIGl0cyB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiB0aGUKKyAqIHtAY29kZSBPYmplY3Qud2FpdChsb25nKX0gbWV0aG9kLgorICogPC9wPgogICogPHA+Ci0gKiAKLSAqIE11bHRpcGxlIHRocmVhZHMgY2FuIHNoYXJlIGEgc2luZ2xlIFRpbWVyIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHRoZWlyIG93bgotICogc3luY2hyb25pemF0aW9uLgorICogTXVsdGlwbGUgdGhyZWFkcyBjYW4gc2hhcmUgYSBzaW5nbGUge0Bjb2RlIFRpbWVyfSB3aXRob3V0IHRoZSBuZWVkIGZvciB0aGVpciBvd24KKyAqIHN5bmNocm9uaXphdGlvbi48L3A+CisgKiA8cD4KKyAqIEEge0Bjb2RlIFRpbWVyfSBjYW4gYmUgc2V0IHRvIHNjaGVkdWxlIHRhc2tzIGVpdGhlciBhdCBhIGZpeGVkIHJhdGUgb3IgCisgKiB3aXRoIGEgZml4ZWQgcGVyaW9kLiBGaXhlZC1wZXJpb2QgZXhlY3V0aW9uIGlzIHRoZSBkZWZhdWx0LjwvcD4KKyAqIDxwPgorICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBmaXhlZC1yYXRlIGFuZCBmaXhlZC1wZXJpb2QgZXhlY3V0aW9uIAorICogaXMgdGhlIGZvbGxvd2luZzogIFdpdGggZml4ZWQtcmF0ZSBleGVjdXRpb24sIHRoZSBzdGFydCB0aW1lIG9mIGVhY2ggCisgKiBzdWNjZXNzaXZlIHJ1biBvZiB0aGUgdGFzayBpcyBzY2hlZHVsZWQgaW4gYWJzb2x1dGUgdGVybXMgd2l0aG91dCByZWdhcmQgZm9yIHdoZW4gdGhlIHByZXZpb3VzCisgKiB0YXNrIHJ1biBhY3R1YWxseSB0b29rIHBsYWNlLiBUaGlzIGNhbiByZXN1bHQgaW4gYSBzZXJpZXMgb2YgYnVuY2hlZC11cCBydW5zIAorICogKG9uZSBsYXVuY2hlZCBpbW1lZGlhdGVseSBhZnRlciBhbm90aGVyKSBpZiBidXN5IHJlc291cmNlcyBvciBvdGhlciAKKyAqIHN5c3RlbSBkZWxheXMgcHJldmVudCB0aGUge0Bjb2RlIFRpbWVyfSBmcm9tIGZpcmluZyBmb3IgYW4gZXh0ZW5kZWQgdGltZS4KKyAqIFdpdGggZml4ZWQtcGVyaW9kIGV4ZWN1dGlvbiwgZWFjaCBzdWNjZXNzaXZlIHJ1biBvZiB0aGUgCisgKiB0YXNrIGlzIHNjaGVkdWxlZCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgdGltZSBvZiB0aGUgcHJldmlvdXMgcnVuIG9mIHRoZSAKKyAqIHRhc2ssIHNvIHR3byBydW5zIG9mIHRoZSB0YXNrIGFyZSBuZXZlciBmaXJlZCBjbG9zZXIgdG9nZXRoZXIgaW4gdGltZSB0aGFuIAorICogdGhlIHNwZWNpZmllZCB7QGNvZGUgcGVyaW9kfS48L3A+CisgKiA8L3A+CiAgKiAKICAqIEBzZWUgVGltZXJUYXNrCiAgKiBAc2VlIGphdmEubGFuZy5PYmplY3Qjd2FpdChsb25nKQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBUaW1lciB7CiAKQEAgLTE2Nyw3ICsxODMsNyBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBWZWN0b3IgY29uc2lzdHMgb2Ygc2NoZWR1bGVkIGV2ZW50cywgc29ydGVkIGFjY29yZGluZyB0bwotICAgICAgICAgKiA8Y29kZT53aGVuPC9jb2RlPiBmaWVsZCBvZiBUYXNrU2NoZWR1bGVkIG9iamVjdC4KKyAgICAgICAgICoge0Bjb2RlIHdoZW59IGZpZWxkIG9mIFRhc2tTY2hlZHVsZWQgb2JqZWN0LgogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBUaW1lclRyZWUgdGFza3MgPSBuZXcgVGltZXJUcmVlKCk7CiAKQEAgLTMyNCwxMCArMzQwLDExIEBACiAgICAgfTsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgVGltZXIgd2hpY2ggbWF5IGJlIHNwZWNpZmllZCB0byBiZSBydW4gYXMgYSBEYWVtb24gVGhyZWFkLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFRpbWVyfSB3aGljaCBtYXkgYmUgc3BlY2lmaWVkIHRvIGJlIHJ1biBhcyBhIGRhZW1vbiB0aHJlYWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGlzRGFlbW9uCi0gICAgICogICAgICAgICAgICB0cnVlIGlmIFRpbWVycyB0aHJlYWQgc2hvdWxkIGJlIGEgZGFlbW9uIHRocmVhZC4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIFRpbWVyfSdzIHRocmVhZCBzaG91bGQgYmUgYSBkYWVtb24gdGhyZWFkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lcihib29sZWFuIGlzRGFlbW9uKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZApAQCAtMzM2LDcgKzM1Myw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBub24tZGFlbW9uIFRpbWVyLgorICAgICAqIENyZWF0ZXMgYSBuZXcgbm9uLWRhZW1vbiB7QGNvZGUgVGltZXJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lcigpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCkBAIC0zNDQsMjMgKzM2Myw1MSBAQAogICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBuYW1lZCB7QGNvZGUgVGltZXJ9IHdoaWNoIG1heSBiZSBzcGVjaWZpZWQgdG8gYmUgcnVuIGFzIGEKKyAgICAgKiBkYWVtb24gdGhyZWFkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRpbWVyfS4KKyAgICAgKiBAcGFyYW0gaXNEYWVtb24KKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYge0Bjb2RlIFRpbWVyfSdzIHRocmVhZCBzaG91bGQgYmUgYSBkYWVtb24gdGhyZWFkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBUaW1lcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0RhZW1vbikgewogICAgICAgICBpbXBsID0gbmV3IFRpbWVySW1wbChuYW1lLCBpc0RhZW1vbik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBuYW1lZCB7QGNvZGUgVGltZXJ9IHdoaWNoIGRvZXMgbm90IHJ1biBhcyBhIGRhZW1vbiB0aHJlYWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBUaW1lci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgVGltZXIoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaW1wbCA9IG5ldyBUaW1lckltcGwobmFtZSwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbmNlbHMgdGhlIFRpbWVyIGFuZCByZW1vdmVkIGFueSBzY2hlZHVsZWQgdGFza3MuIElmIHRoZXJlIGlzIGEKLSAgICAgKiBjdXJyZW50bHkgcnVubmluZyB0YXNrIGl0IGlzIG5vdCBlZmZlY3RlZC4gTm8gbW9yZSB0YXNrcyBtYXkgYmUgc2NoZWR1bGVkCi0gICAgICogb24gdGhpcyBUaW1lci4gU3Vic2VxdWVudCBjYWxscyBkbyBub3RoaW5nLgorICAgICAqIENhbmNlbHMgdGhlIHtAY29kZSBUaW1lcn0gYW5kIHJlbW92ZXMgYW55IHNjaGVkdWxlZCB0YXNrcy4gSWYgdGhlcmUgaXMgYQorICAgICAqIGN1cnJlbnRseSBydW5uaW5nIHRhc2sgaXQgaXMgbm90IGFmZmVjdGVkLiBObyBtb3JlIHRhc2tzIG1heSBiZSBzY2hlZHVsZWQKKyAgICAgKiBvbiB0aGlzIHtAY29kZSBUaW1lcn0uIFN1YnNlcXVlbnQgY2FsbHMgZG8gbm90aGluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CiAgICAgICAgIGltcGwuY2FuY2VsKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgY2FuY2VsZWQgdGFza3MgZnJvbSB0aGUgdGFzayBxdWV1ZS4gSWYgdGhlcmUgYXJlIG5vCisgICAgICogb3RoZXIgcmVmZXJlbmNlcyBvbiB0aGUgdGFza3MsIHRoZW4gYWZ0ZXIgdGhpcyBjYWxsIHRoZXkgYXJlIGZyZWUgCisgICAgICogdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNhbmNlbGVkIHRhc2tzIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhlIHRhc2sKKyAgICAgKiAgICAgICAgIHF1ZXVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBpbnQgcHVyZ2UoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoaW1wbCkgewogICAgICAgICAgICAgcmV0dXJuIGltcGwucHVyZ2UoKTsKQEAgLTM2OCwxOSArNDE1LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2NoZWR1bGUgYSB0YXNrIGZvciBzaW5nbGUgZXhlY3V0aW9uLiBJZiB3aGVuIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudAotICAgICAqIHRpbWUsIGl0IHdpbGwgYmUgc2NoZWR1bGVkIHRvIGV4ZWN1dGVkIGFzIHNvb24gYXMgcG9zc2libGUuCisgICAgICogU2NoZWR1bGUgYSB0YXNrIGZvciBzaW5nbGUgZXhlY3V0aW9uLiBJZiB7QGNvZGUgd2hlbn0gaXMgbGVzcyB0aGFuIHRoZQorICAgICAqIGN1cnJlbnQgdGltZSwgaXQgd2lsbCBiZSBzY2hlZHVsZWQgdG8gYmUgZXhlY3V0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGFzawotICAgICAqICAgICAgICAgICAgVGhlIHRhc2sgdG8gc2NoZWR1bGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXNrIHRvIHNjaGVkdWxlLgogICAgICAqIEBwYXJhbSB3aGVuCi0gICAgICogICAgICAgICAgICBUaW1lIG9mIGV4ZWN1dGlvbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGltZSBvZiBleGVjdXRpb24uCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB3aGVuLmdldFRpbWUoKSA8IDAKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgd2hlbi5nZXRUaW1lKCkgPCAwfS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB0aW1lciBoYXMgYmVlbiBjYW5jZWxsZWQsIHRoZSB0YXNrIGhhcyBiZWVuCi0gICAgICogICAgICAgICAgICAgICAgc2NoZWR1bGVkIG9yIGNhbmNlbGxlZC4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFRpbWVyfSBoYXMgYmVlbiBjYW5jZWxlZCwgb3IgaWYgdGhlIHRhc2sgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgICAgICAgICBzY2hlZHVsZWQgb3IgY2FuY2VsZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2NoZWR1bGUoVGltZXJUYXNrIHRhc2ssIERhdGUgd2hlbikgewogICAgICAgICBpZiAod2hlbi5nZXRUaW1lKCkgPCAwKSB7CkBAIC0zOTEsMTggKzQzOCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjaGVkdWxlIGEgdGFzayBmb3Igc2luZ2xlIGV4ZWN1dGlvbiBhZnRlciBhIHNwZWNpZmljIGRlbGF5LgorICAgICAqIFNjaGVkdWxlIGEgdGFzayBmb3Igc2luZ2xlIGV4ZWN1dGlvbiBhZnRlciBhIHNwZWNpZmllZCBkZWxheS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGFzawotICAgICAqICAgICAgICAgICAgVGhlIHRhc2sgdG8gc2NoZWR1bGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXNrIHRvIHNjaGVkdWxlLgogICAgICAqIEBwYXJhbSBkZWxheQotICAgICAqICAgICAgICAgICAgQW1vdW50IG9mIHRpbWUgYmVmb3JlIGV4ZWN1dGlvbgotICAgICAqIAorICAgICAqICAgICAgICAgICAgYW1vdW50IG9mIHRpbWUgYmVmb3JlIGV4ZWN1dGlvbi4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGRlbGF5IDwgMAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBkZWxheSA8IDB9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHRpbWVyIGhhcyBiZWVuIGNhbmNlbGxlZCwgdGhlIHRhc2sgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgICAgICAgICBzY2hlZHVsZWQgb3IgY2FuY2VsbGVkLgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgVGltZXJ9IGhhcyBiZWVuIGNhbmNlbGVkLCBvciBpZiB0aGUgdGFzayBoYXMgYmVlbgorICAgICAqICAgICAgICAgICAgICAgIHNjaGVkdWxlZCBvciBjYW5jZWxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZShUaW1lclRhc2sgdGFzaywgbG9uZyBkZWxheSkgewogICAgICAgICBpZiAoZGVsYXkgPCAwKSB7CkBAIC00MTIsMjAgKzQ1OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjaGVkdWxlIGEgdGFzayBmb3IgcmVwZWF0ZWQgZml4LWRlbGF5IGV4ZWN1dGlvbiBhZnRlciBhIHNwZWNpZmljIGRlbGF5LgorICAgICAqIFNjaGVkdWxlIGEgdGFzayBmb3IgcmVwZWF0ZWQgZml4ZWQtZGVsYXkgZXhlY3V0aW9uIGFmdGVyIGEgc3BlY2lmaWMgZGVsYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRhc2sKLSAgICAgKiAgICAgICAgICAgIFRoZSB0YXNrIHRvIHNjaGVkdWxlCisgICAgICogICAgICAgICAgICB0aGUgdGFzayB0byBzY2hlZHVsZS4KICAgICAgKiBAcGFyYW0gZGVsYXkKLSAgICAgKiAgICAgICAgICAgIEFtb3VudCBvZiB0aW1lIGJlZm9yZSBmaXJzdCBleGVjdXRpb24KKyAgICAgKiAgICAgICAgICAgIGFtb3VudCBvZiB0aW1lIGJlZm9yZSBmaXJzdCBleGVjdXRpb24uCiAgICAgICogQHBhcmFtIHBlcmlvZAotICAgICAqICAgICAgICAgICAgQW1vdW50IG9mIHRpbWUgYmV0d2VlbiBzdWJzZXF1ZW50IGV4ZWN1dGlvbnMKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gc3Vic2VxdWVudCBleGVjdXRpb25zLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgZGVsYXkgPCAwIG9yIHBlcmlvZCA8IDAKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgZGVsYXkgPCAwfSBvciB7QGNvZGUgcGVyaW9kIDwgMH0uCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgdGltZXIgaGFzIGJlZW4gY2FuY2VsbGVkLCB0aGUgdGFzayBoYXMgYmVlbgotICAgICAqICAgICAgICAgICAgICAgIHNjaGVkdWxlZCBvciBjYW5jZWxsZWQuCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBUaW1lcn0gaGFzIGJlZW4gY2FuY2VsZWQsIG9yIGlmIHRoZSB0YXNrIGhhcyBiZWVuCisgICAgICogICAgICAgICAgICAgICAgc2NoZWR1bGVkIG9yIGNhbmNlbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlKFRpbWVyVGFzayB0YXNrLCBsb25nIGRlbGF5LCBsb25nIHBlcmlvZCkgewogICAgICAgICBpZiAoZGVsYXkgPCAwIHx8IHBlcmlvZCA8PSAwKSB7CkBAIC00MzUsMjEgKzQ4MiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjaGVkdWxlIGEgdGFzayBmb3IgcmVwZWF0ZWQgZml4LWRlbGF5IGV4ZWN1dGlvbiBhZnRlciBhIHNwZWNpZmljIHRpbWUKKyAgICAgKiBTY2hlZHVsZSBhIHRhc2sgZm9yIHJlcGVhdGVkIGZpeGVkLWRlbGF5IGV4ZWN1dGlvbiBhZnRlciBhIHNwZWNpZmljIHRpbWUKICAgICAgKiBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0YXNrCi0gICAgICogICAgICAgICAgICBUaGUgdGFzayB0byBzY2hlZHVsZQorICAgICAqICAgICAgICAgICAgdGhlIHRhc2sgdG8gc2NoZWR1bGUuCiAgICAgICogQHBhcmFtIHdoZW4KLSAgICAgKiAgICAgICAgICAgIFRpbWUgb2YgZmlyc3QgZXhlY3V0aW9uCisgICAgICogICAgICAgICAgICB0aW1lIG9mIGZpcnN0IGV4ZWN1dGlvbi4KICAgICAgKiBAcGFyYW0gcGVyaW9kCi0gICAgICogICAgICAgICAgICBBbW91bnQgb2YgdGltZSBiZXR3ZWVuIHN1YnNlcXVlbnQgZXhlY3V0aW9ucwotICAgICAqIAorICAgICAqICAgICAgICAgICAgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiBzdWJzZXF1ZW50IGV4ZWN1dGlvbnMuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB3aGVuLmdldFRpbWUoKSA8IDAgb3IgcGVyaW9kIDwgMAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSB3aGVuLmdldFRpbWUoKSA8IDB9IG9yIHtAY29kZSBwZXJpb2QgPCAwfS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB0aW1lciBoYXMgYmVlbiBjYW5jZWxsZWQsIHRoZSB0YXNrIGhhcyBiZWVuCi0gICAgICogICAgICAgICAgICAgICAgc2NoZWR1bGVkIG9yIGNhbmNlbGxlZC4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFRpbWVyfSBoYXMgYmVlbiBjYW5jZWxlZCwgb3IgaWYgdGhlIHRhc2sgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgICAgICAgICBzY2hlZHVsZWQgb3IgY2FuY2VsZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2NoZWR1bGUoVGltZXJUYXNrIHRhc2ssIERhdGUgd2hlbiwgbG9uZyBwZXJpb2QpIHsKICAgICAgICAgaWYgKHBlcmlvZCA8PSAwIHx8IHdoZW4uZ2V0VGltZSgpIDwgMCkgewpAQCAtNDYxLDIyICs1MDgsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFNjaGVkdWxlIGEgdGFzayBmb3IgcmVwZWF0ZWQgZml4ZWQtcmF0ZSBleGVjdXRpb24gYWZ0ZXIgYSBzcGVjaWZpYyBkZWxheQotICAgICAqIGhhcyBiZWVuIGhhcHBlbmVkLiBUaGUgZGlmZmVyZW5jZSBvZiBmaXhlZC1yYXRlIGlzIHRoYXQgaXQgbWF5IGJ1bmNoIHVwCi0gICAgICogc3Vic2VxdWVudCB0YXNrIHJ1bnMgdG8gdHJ5IHRvIGdldCB0aGUgdGFzayByZXBlYXRpbmcgYXQgaXQncyBkZXNpcmVkCi0gICAgICogdGltZS4KKyAgICAgKiBoYXMgcGFzc2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0YXNrCi0gICAgICogICAgICAgICAgICBUaGUgdGFzayB0byBzY2hlZHVsZQorICAgICAqICAgICAgICAgICAgdGhlIHRhc2sgdG8gc2NoZWR1bGUuCiAgICAgICogQHBhcmFtIGRlbGF5Ci0gICAgICogICAgICAgICAgICBBbW91bnQgb2YgdGltZSBiZWZvcmUgZmlyc3QgZXhlY3V0aW9uCisgICAgICogICAgICAgICAgICBhbW91bnQgb2YgdGltZSBiZWZvcmUgZmlyc3QgZXhlY3V0aW9uLgogICAgICAqIEBwYXJhbSBwZXJpb2QKLSAgICAgKiAgICAgICAgICAgIEFtb3VudCBvZiB0aW1lIGJldHdlZW4gc3Vic2VxdWVudCBleGVjdXRpb25zCi0gICAgICogCisgICAgICogICAgICAgICAgICBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHN1YnNlcXVlbnQgZXhlY3V0aW9ucy4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGRlbGF5IDwgMCBvciBwZXJpb2QgPCAwCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGRlbGF5IDwgMH0gb3Ige0Bjb2RlIHBlcmlvZCA8IDB9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHRpbWVyIGhhcyBiZWVuIGNhbmNlbGxlZCwgdGhlIHRhc2sgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgICAgICAgICBzY2hlZHVsZWQgb3IgY2FuY2VsbGVkLgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgVGltZXJ9IGhhcyBiZWVuIGNhbmNlbGVkLCBvciBpZiB0aGUgdGFzayBoYXMgYmVlbgorICAgICAqICAgICAgICAgICAgICAgIHNjaGVkdWxlZCBvciBjYW5jZWxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZUF0Rml4ZWRSYXRlKFRpbWVyVGFzayB0YXNrLCBsb25nIGRlbGF5LCBsb25nIHBlcmlvZCkgewogICAgICAgICBpZiAoZGVsYXkgPCAwIHx8IHBlcmlvZCA8PSAwKSB7CkBAIC00ODcsMjIgKzUzMiwyMCBAQAogCiAgICAgLyoqCiAgICAgICogU2NoZWR1bGUgYSB0YXNrIGZvciByZXBlYXRlZCBmaXhlZC1yYXRlIGV4ZWN1dGlvbiBhZnRlciBhIHNwZWNpZmljIHRpbWUKLSAgICAgKiBoYXMgYmVlbiByZWFjaGVkLiBUaGUgZGlmZmVyZW5jZSBvZiBmaXhlZC1yYXRlIGlzIHRoYXQgaXQgbWF5IGJ1bmNoIHVwCi0gICAgICogc3Vic2VxdWVudCB0YXNrIHJ1bnMgdG8gdHJ5IHRvIGdldCB0aGUgdGFzayByZXBlYXRpbmcgYXQgaXQncyBkZXNpcmVkCi0gICAgICogdGltZS4KKyAgICAgKiBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0YXNrCi0gICAgICogICAgICAgICAgICBUaGUgdGFzayB0byBzY2hlZHVsZQorICAgICAqICAgICAgICAgICAgdGhlIHRhc2sgdG8gc2NoZWR1bGUuCiAgICAgICogQHBhcmFtIHdoZW4KLSAgICAgKiAgICAgICAgICAgIFRpbWUgb2YgZmlyc3QgZXhlY3V0aW9uCisgICAgICogICAgICAgICAgICB0aW1lIG9mIGZpcnN0IGV4ZWN1dGlvbi4KICAgICAgKiBAcGFyYW0gcGVyaW9kCi0gICAgICogICAgICAgICAgICBBbW91bnQgb2YgdGltZSBiZXR3ZWVuIHN1YnNlcXVlbnQgZXhlY3V0aW9ucwotICAgICAqIAorICAgICAqICAgICAgICAgICAgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiBzdWJzZXF1ZW50IGV4ZWN1dGlvbnMuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB3aGVuLmdldFRpbWUoKSA8IDAgb3IgcGVyaW9kIDwgMAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSB3aGVuLmdldFRpbWUoKSA8IDB9IG9yIHtAY29kZSBwZXJpb2QgPCAwfS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB0aW1lciBoYXMgYmVlbiBjYW5jZWxsZWQsIHRoZSB0YXNrIGhhcyBiZWVuCi0gICAgICogICAgICAgICAgICAgICAgc2NoZWR1bGVkIG9yIGNhbmNlbGxlZC4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFRpbWVyfSBoYXMgYmVlbiBjYW5jZWxlZCwgb3IgaWYgdGhlIHRhc2sgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgICAgICAgICBzY2hlZHVsZWQgb3IgY2FuY2VsZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2NoZWR1bGVBdEZpeGVkUmF0ZShUaW1lclRhc2sgdGFzaywgRGF0ZSB3aGVuLCBsb25nIHBlcmlvZCkgewogICAgICAgICBpZiAocGVyaW9kIDw9IDAgfHwgd2hlbi5nZXRUaW1lKCkgPCAwKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RpbWVyVGFzay5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UaW1lclRhc2suamF2YQppbmRleCAwMzI1ZGE5Li4zODQ3NDZmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RpbWVyVGFzay5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVGltZXJUYXNrLmphdmEKQEAgLTE4LDExICsxOCwxMiBAQAogcGFja2FnZSBqYXZhLnV0aWw7CiAKIC8qKgotICogVGhlIFRpbWVyVGFzayBjbGFzcyBpcyByZXByZXNlbnRzIGEgdGFzayB0byBydW4gYXQgc3BlY2lmaWVkIHRpbWUuIFRoZSB0YXNrCisgKiBUaGUge0Bjb2RlIFRpbWVyVGFza30gY2xhc3MgcmVwcmVzZW50cyBhIHRhc2sgdG8gcnVuIGF0IGEgc3BlY2lmaWVkIHRpbWUuIFRoZSB0YXNrCiAgKiBtYXkgYmUgcnVuIG9uY2Ugb3IgcmVwZWF0ZWRseS4KICAqIAogICogQHNlZSBUaW1lcgogICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3dhaXQobG9uZykKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGltZXJUYXNrIGltcGxlbWVudHMgUnVubmFibGUgewogICAgIC8qIExvY2sgb2JqZWN0IGZvciBzeW5jaHJvbml6YXRpb24uIEl0J3MgYWxzbyB1c2VkIGJ5IFRpbWVyIGNsYXNzLiAqLwpAQCAtNjUsNyArNjYsNyBAQAogICAgIC8qCiAgICAgICogSXMgVGltZXJUYXNrIHNjaGVkdWxlZCBpbnRvIGFueSB0aW1lcj8KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0aW1lciB0YXNrIGlzIHNjaGVkdWxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRpbWVyIHRhc2sgaXMgc2NoZWR1bGVkLCB7QGNvZGUgZmFsc2V9CiAgICAgICogb3RoZXJ3aXNlLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNTY2hlZHVsZWQoKSB7CkBAIC03NCwxNyArNzUsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFRpbWVyVGFza30uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIFRpbWVyVGFzaygpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoZSBUYXNrIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIFRpbWVyJ3MgcXVldWUuIEdlbmVyYWxseSwgaXQKLSAgICAgKiByZXR1cm5zIGZhbHNlIGlmIHRoZSBjYWxsIGRpZCBub3QgcHJldmVudCBhIFRpbWVyVGFzayBmcm9tIHJ1bm5pbmcgYXQKKyAgICAgKiBDYW5jZWxzIHRoZSB7QGNvZGUgVGltZXJUYXNrfSBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSB7QGNvZGUgVGltZXJ9J3MgcXVldWUuIEdlbmVyYWxseSwgaXQKKyAgICAgKiByZXR1cm5zIHtAY29kZSBmYWxzZX0gaWYgdGhlIGNhbGwgZGlkIG5vdCBwcmV2ZW50IGEge0Bjb2RlIFRpbWVyVGFza30gZnJvbSBydW5uaW5nIGF0CiAgICAgICogbGVhc3Qgb25jZS4gU3Vic2VxdWVudCBjYWxscyBoYXZlIG5vIGVmZmVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjYWxsIHByZXZlbnRlZCBhIHNjaGVkdWxlZCBleGVjdXRpb24KLSAgICAgKiAgICAgICAgIGZyb20gdGFraW5nIHBsYWNlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjYWxsIHByZXZlbnRlZCBhIHNjaGVkdWxlZCBleGVjdXRpb24KKyAgICAgKiAgICAgICAgIGZyb20gdGFraW5nIHBsYWNlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWwoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtOTYsMTAgKzEwMywxMSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc2NoZWR1bGVkIGV4ZWN1dGlvbiB0aW1lLiBJZiB0aGUgdGFzayBleGVjdXRpb24gaXMgaW4KLSAgICAgKiBwcm9ncmVzcyByZXR1cm5zIHRoZSBleGVjdXRpb24gdGltZSBvZiBvbmdvaW5nIHRhc2suIFRhc2tzIHdoaWNoIGhhdmUgbm90Ci0gICAgICogeWV0IHJ1biByZXR1cm4gYW4gdW5kZWZpbmVkIHZhbHVlLgorICAgICAqIHByb2dyZXNzIGl0IHJldHVybnMgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBvbmdvaW5nIHRhc2suIFRhc2tzIHdoaWNoCisgICAgICogaGF2ZSBub3QgeWV0IHJ1biByZXR1cm4gYW4gdW5kZWZpbmVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGV4ZWN1dGlvbiB0aW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNjaGVkdWxlZEV4ZWN1dGlvblRpbWUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtMTA4LDggKzExNiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSB0YXNrIHRvIHJ1biBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcnVuKCkKKyAgICAgKiBUaGUgdGFzayB0byBydW4gc2hvdWxkIGJlIHNwZWNpZmllZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAY29kZSBydW4oKX0KICAgICAgKiBtZXRob2QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCk7CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uLmphdmEKaW5kZXggNWQwMDNjNC4uMzJiMjEzMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uLmphdmEKQEAgLTE5LDI5ICsxOSwzMCBAQAogCiAKIC8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkZCBtb3JlIHRoYW4gb25lCi0gKiBsaXN0ZW5lciB0byBhbiBldmVudCBzb3VyY2Ugd2hpY2ggb25seSBzdXBwb3J0cyBhIHNpbmdsZSBsaXN0ZW5lci4gSXQgaXMgYWxzbwotICogdGhyb3duIHdoZW4gdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCisgKiBBIHtAY29kZSBUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkCisgKiBtb3JlIHRoYW4gb25lIGxpc3RlbmVyIHRvIGFuIGV2ZW50IHNvdXJjZSB3aGljaCBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlCisgKiBsaXN0ZW5lci4gSXQgaXMgYWxzbyB0aHJvd24gd2hlbiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KICAqIAotICogQHNlZSBqYXZhLmxhbmcuRXhjZXB0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTA3NDY0MDU0NDc3MDY4NzgzMUw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBmaWxsZWQgaW4uCiAgICAgICovCiAgICAgcHVibGljIFRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb259IHdpdGggdGhlIHN0YWNrIHRyYWNlCisgICAgICogYW5kIG1lc3NhZ2UgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UcmVlTWFwLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RyZWVNYXAuamF2YQppbmRleCA3ZGFiYWUxLi5lM2RjNWE3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RyZWVNYXAuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RyZWVNYXAuamF2YQpAQCAtMjMsMTEgKzIzLDEyIEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogVHJlZU1hcCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBTb3J0ZWRNYXAuIEFsbCBvcHRpb25hbCBvcGVyYXRpb25zIGFyZQotICogc3VwcG9ydGVkLCBhZGRpbmcgYW5kIHJlbW92aW5nLiBUaGUgdmFsdWVzIGNhbiBiZSBhbnkgb2JqZWN0cy4gVGhlIGtleXMgY2FuCi0gKiBiZSBhbnkgb2JqZWN0cyB3aGljaCBhcmUgY29tcGFyYWJsZSB0byBlYWNoIG90aGVyIGVpdGhlciB1c2luZyB0aGVpciBuYXR1cmFsCisgKiBUcmVlTWFwIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFNvcnRlZE1hcC4gQWxsIG9wdGlvbmFsIG9wZXJhdGlvbnMgKGFkZGluZworICogYW5kIHJlbW92aW5nKSBhcmUgc3VwcG9ydGVkLiBUaGUgdmFsdWVzIGNhbiBiZSBhbnkgb2JqZWN0cy4gVGhlIGtleXMgY2FuIGJlCisgKiBhbnkgb2JqZWN0cyB3aGljaCBhcmUgY29tcGFyYWJsZSB0byBlYWNoIG90aGVyIGVpdGhlciB1c2luZyB0aGVpciBuYXR1cmFsCiAgKiBvcmRlciBvciBhIHNwZWNpZmllZCBDb21wYXJhdG9yLgotICogQHNpbmNlIDEuMgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFRyZWVNYXA8SywgVj4gZXh0ZW5kcyBBYnN0cmFjdE1hcDxLLCBWPiBpbXBsZW1lbnRzIFNvcnRlZE1hcDxLLCBWPiwgQ2xvbmVhYmxlLAogICAgICAgICBTZXJpYWxpemFibGUgewpAQCAtNjU5LDM0ICs2NjAsMzcgQEAKICAgICAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiBUcmVlTWFwLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkge0Bjb2RlIFRyZWVNYXB9IGluc3RhbmNlLgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUcmVlTWFwKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgVHJlZU1hcCB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBDb21wYXJhdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkge0Bjb2RlIFRyZWVNYXB9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGNvbXBhcmF0b3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbXBhcmF0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBDb21wYXJhdG9yCisgICAgICogICAgICAgICAgICB0aGUgY29tcGFyYXRvciB0byBjb21wYXJlIGtleXMgd2l0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVHJlZU1hcChDb21wYXJhdG9yPD8gc3VwZXIgSz4gY29tcGFyYXRvcikgewogICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgVHJlZU1hcCBjb250YWluaW5nIHRoZSBtYXBwaW5ncyBmcm9tIHRoZQotICAgICAqIHNwZWNpZmllZCBNYXAgYW5kIHVzaW5nIHRoZSBuYXR1cmFsIG9yZGVyaW5nLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRyZWVNYXB9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIG1hcHBpbmdzIGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIG1hcCBhbmQgdXNpbmcgbmF0dXJhbCBvcmRlcmluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICB0aGUgbWFwcGluZ3MgdG8gYWRkCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGEga2V5IGluIHRoZSBNYXAgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBDb21wYXJhYmxlCi0gICAgICogICAgICAgICAgICAgICAgaW50ZXJmYWNlLCBvciB0aGV5IGtleXMgaW4gdGhlIE1hcCBjYW5ub3QgYmUgY29tcGFyZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXBwaW5ncyB0byBhZGQuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGtleSBpbiB0aGUgc3BlY2lmaWVkIG1hcCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlCisgICAgICogICAgICAgICAgICAgQ29tcGFyYWJsZSBpbnRlcmZhY2UsIG9yIGlmIHRoZSBrZXlzIGluIHRoZSBtYXAgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgY29tcGFyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRyZWVNYXAoTWFwPD8gZXh0ZW5kcyBLLD8gZXh0ZW5kcyBWPiBtYXApIHsKICAgICAgICAgdGhpcygpOwpAQCAtNjk0LDExICs2OTgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIFRyZWVNYXAgY29udGFpbmluZyB0aGUgbWFwcGluZ3MgZnJvbSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgU29ydGVkTWFwIGFuZCB1c2luZyB0aGUgc2FtZSBDb21wYXJhdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFRyZWVNYXB9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIG1hcHBpbmdzIGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIFNvcnRlZE1hcCBhbmQgdXNpbmcgdGhlIHNhbWUgY29tcGFyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICB0aGUgbWFwcGluZ3MgdG8gYWRkCisgICAgICogICAgICAgICAgICB0aGUgbWFwcGluZ3MgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUcmVlTWFwKFNvcnRlZE1hcDxLLD8gZXh0ZW5kcyBWPiBtYXApIHsKICAgICAgICAgdGhpcyhtYXAuY29tcGFyYXRvcigpKTsKQEAgLTc2NCw4ICs3NjksOSBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBUcmVlTWFwLCBsZWF2aW5nIGl0IGVtcHR5LgogICAgICAqIAotICAgICAqIEBzZWUgTWFwI2lzRW1wdHkKLSAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNlZSBNYXAjaXNFbXB0eSgpCisgICAgICogQHNlZSAjc2l6ZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CkBAIC03NzUsMTIgKzc4MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgVHJlZU1hcCB3aXRoIHRoZSBzYW1lIG1hcHBpbmdzLCBzaXplIGFuZCBjb21wYXJhdG9yIGFzIHRoaXMKLSAgICAgKiBUcmVlTWFwLgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIFRyZWVNYXB9IHdpdGggdGhlIHNhbWUgbWFwcGluZ3MsIHNpemUgYW5kIGNvbXBhcmF0b3IKKyAgICAgKiBhcyB0aGlzIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBUcmVlTWFwCi0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGluc3RhbmNlLgogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIEBPdmVycmlkZQpAQCAtNzk4LDI3ICs4MDQsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSBlbGVtZW50cyBpbiB0aGlzIFRyZWVNYXAuCisgICAgICogUmV0dXJucyB0aGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgaW4gdGhpcyBtYXAuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIENvbXBhcmF0b3Igb3IgbnVsbCBpZiB0aGUgbmF0dXJhbCBvcmRlcmluZyBpcyB1c2VkCisgICAgICogQHJldHVybiB0aGUgY29tcGFyYXRvciBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIG5hdHVyYWwgb3JkZXJpbmcgaXMgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29tcGFyYXRvcjw/IHN1cGVyIEs+IGNvbXBhcmF0b3IoKSB7CiAgICAgICAgIHJldHVybiBjb21wYXJhdG9yOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgVHJlZU1hcCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5rZXk8L2NvZGU+IGlzIGEga2V5IG9mIHRoaXMgVHJlZU1hcCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUga2V5IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZSBrZXlzIGluIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICBUcmVlTWFwCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGtleSBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKQEAgLTgyNiwxMiArODI4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBUcmVlTWFwIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyBhIHZhbHVlIG9mIHRoaXMgVHJlZU1hcCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CkBAIC04NTksMTEgKzg2MiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTZXQgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIFRyZWVNYXAuIEVhY2ggZWxlbWVudCBpbgotICAgICAqIHRoZSBzZXQgaXMgYSBNYXAuRW50cnkuIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgVHJlZU1hcCBzbyBjaGFuZ2VzIHRvCi0gICAgICogb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUgc2V0IGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgorICAgICAqIFJldHVybnMgYSBzZXQgY29udGFpbmluZyBhbGwgb2YgdGhlIG1hcHBpbmdzIGluIHRoaXMgbWFwLiBFYWNoIG1hcHBpbmcgaXMKKyAgICAgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWFwLkVudHJ5fS4gQXMgdGhlIHNldCBpcyBiYWNrZWQgYnkgdGhpcyBtYXAsCisgICAgICogY2hhbmdlcyBpbiBvbmUgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIG90aGVyLiBJdCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZworICAgICAqIG9wZXJhdGlvbnMuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFNldCBvZiB0aGUgbWFwcGluZ3MKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBtYXBwaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CkBAIC05NjUsMTIgKzk3MCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgZmlyc3Qgc29ydGVkIGtleSBpbiB0aGlzIFRyZWVNYXAuCisgICAgICogUmV0dXJucyB0aGUgZmlyc3Qga2V5IGluIHRoaXMgbWFwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHNvcnRlZCBrZXkKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBrZXkgaW4gdGhpcyBtYXAuCiAgICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIFRyZWVNYXAgaXMgZW1wdHkKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIHNvcnRlZCBtYXAgaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEsgZmlyc3RLZXkoKSB7CiAgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKQEAgLTEwNTcsMTQgKzEwNjIsMTQgQEAKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBrZXkgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleXMgaW4gdGhpcwotICAgICAqICAgICAgICAgICAgICAgIFRyZWVNYXAKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUga2V5IGlzIG51bGwgYW5kIHRoZSBjb21wYXJhdG9yIGNhbm5vdCBoYW5kbGUgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aCB0aGUga2V5cyBpbiB0aGlzIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBpcyB7QGNvZGUgbnVsbH0gYW5kIHRoZSBjb21wYXJhdG9yIGNhbm5vdCBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpIHsKQEAgLTEwNzYsMjAgKzEwODEsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU29ydGVkTWFwIG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIFRyZWVNYXAgd2hpY2gKLSAgICAgKiBjb250YWlucyBrZXlzIGxlc3MgdGhhbiB0aGUgZW5kIGtleS4gVGhlIHJldHVybmVkIFNvcnRlZE1hcCBpcyBiYWNrZWQgYnkKLSAgICAgKiB0aGlzIFRyZWVNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCisgICAgICogUmV0dXJucyBhIHNvcnRlZCBtYXAgb3ZlciBhIHJhbmdlIG9mIHRoaXMgc29ydGVkIG1hcCB3aXRoIGFsbCBrZXlzIHRoYXQKKyAgICAgKiBhcmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGVuZEtleX0uIENoYW5nZXMgdG8gdGhlIHJldHVybmVkCisgICAgICogc29ydGVkIG1hcCBhcmUgcmVmbGVjdGVkIGluIHRoaXMgc29ydGVkIG1hcCBhbmQgdmljZSB2ZXJzYS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBUaGUgcmV0dXJuZWQgbWFwIHdpbGwgbm90IGFsbG93IGFuIGluc2VydGlvbiBvZiBhIGtleSBvdXRzaWRlIHRoZQorICAgICAqIHNwZWNpZmllZCByYW5nZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGVuZEtleQotICAgICAqICAgICAgICAgICAgdGhlIGVuZCBrZXkKLSAgICAgKiBAcmV0dXJuIGEgc3ViLW1hcCB3aGVyZSB0aGUga2V5cyBhcmUgbGVzcyB0aGFuIDxjb2RlPmVuZEtleTwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGVuZCBrZXkgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleXMgaW4gdGhpcwotICAgICAqICAgICAgICAgICAgICAgIFRyZWVNYXAKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgZW5kIGtleSBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlCi0gICAgICogICAgICAgICAgICAgICAgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGhpZ2ggYm91bmRhcnkgb2YgdGhlIHJhbmdlIHNwZWNpZmllZC4KKyAgICAgKiBAcmV0dXJuIGEgc29ydGVkIG1hcCB3aGVyZSB0aGUga2V5cyBhcmUgbGVzcyB0aGFuIHtAY29kZSBlbmRLZXl9LgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleXMgaW4gdGhpcworICAgICAqICAgICAgICAgICAgIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUgY29tcGFyYXRvcgorICAgICAqICAgICAgICAgICAgIGNhbm5vdCBoYW5kbGUge0Bjb2RlIG51bGx9IGtleXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1hcCBpcyBpdHNlbGYgYSBzb3J0ZWQgbWFwIG92ZXIgYSByYW5nZSBvZiBhbm90aGVyCisgICAgICogICAgICAgICAgICAgbWFwIGFuZCB0aGUgc3BlY2lmaWVkIGtleSBpcyBvdXRzaWRlIG9mIGl0cyByYW5nZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ydGVkTWFwPEssIFY+IGhlYWRNYXAoSyBlbmRLZXkpIHsKICAgICAgICAgLy8gQ2hlY2sgZm9yIGVycm9ycwpAQCAtMTEwMiwxMSArMTExNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTZXQgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMgVHJlZU1hcC4gVGhlIHNldCBpcyBiYWNrZWQgYnkKLSAgICAgKiB0aGlzIFRyZWVNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZSBzZXQgZG9lcwotICAgICAqIG5vdCBzdXBwb3J0IGFkZGluZy4KKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gVGhlIHNldCBpcyBiYWNrZWQgYnkKKyAgICAgKiB0aGlzIG1hcCBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIHNldCBkb2VzIG5vdAorICAgICAqIHN1cHBvcnQgYWRkaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTZXQgb2YgdGhlIGtleXMKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgewpAQCAtMTEzNywxMiArMTE1MCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgbGFzdCBzb3J0ZWQga2V5IGluIHRoaXMgVHJlZU1hcC4KKyAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IGtleSBpbiB0aGlzIG1hcC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IHNvcnRlZCBrZXkKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoaXMgVHJlZU1hcCBpcyBlbXB0eQorICAgICAqIEByZXR1cm4gdGhlIGxhc3Qga2V5IGluIHRoaXMgbWFwLgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWFwIGlzIGVtcHR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBLIGxhc3RLZXkoKSB7CiAgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKQEAgLTEyMDEsMTcgKzEyMTQsMTggQEAKICAgICAgKiBNYXBzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIGFueSBwcmV2aW91cyBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgb3IgbnVsbAotICAgICAqICAgICAgICAgaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGtleSBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aCB0aGUga2V5cyBpbiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgVHJlZU1hcAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBrZXkgaXMgbnVsbCBhbmQgdGhlIGNvbXBhcmF0b3IgY2Fubm90IGhhbmRsZSBudWxsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleXMgaW4gdGhpcworICAgICAqICAgICAgICAgICAgIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUgY29tcGFyYXRvcgorICAgICAqICAgICAgICAgICAgIGNhbm5vdCBoYW5kbGUge0Bjb2RlIG51bGx9IGtleXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgcHV0KEsga2V5LCBWIHZhbHVlKSB7CkBAIC0xMjIyLDE3ICsxMjM2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29waWVzIGV2ZXJ5IG1hcHBpbmcgaW4gdGhlIHNwZWNpZmllZCBNYXAgdG8gdGhpcyBUcmVlTWFwLgorICAgICAqIENvcGllcyBhbGwgdGhlIG1hcHBpbmdzIGluIHRoZSBnaXZlbiBtYXAgdG8gdGhpcyBtYXAuIFRoZXNlIG1hcHBpbmdzIHdpbGwKKyAgICAgKiByZXBsYWNlIGFsbCBtYXBwaW5ncyB0aGF0IHRoaXMgbWFwIGhhZCBmb3IgYW55IG9mIHRoZSBrZXlzIGN1cnJlbnRseSBpbgorICAgICAqIHRoZSBnaXZlbiBtYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIE1hcCB0byBjb3B5IG1hcHBpbmdzIGZyb20KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYSBrZXkgaW4gdGhlIE1hcCBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aCB0aGUga2V5cyBpbgotICAgICAqICAgICAgICAgICAgICAgIHRoaXMgVHJlZU1hcAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGEga2V5IGluIHRoZSBNYXAgaXMgbnVsbCBhbmQgdGhlIGNvbXBhcmF0b3IgY2Fubm90Ci0gICAgICogICAgICAgICAgICAgICAgaGFuZGxlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgdG8gY29weSBtYXBwaW5ncyBmcm9tLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBrZXkgaW4gdGhlIHNwZWNpZmllZCBtYXAgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAga2V5cyBpbiB0aGlzIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBrZXkgaW4gdGhlIHNwZWNpZmllZCBtYXAgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUKKyAgICAgKiAgICAgICAgICAgICBjb21wYXJhdG9yIGNhbm5vdCBoYW5kbGUge0Bjb2RlIG51bGx9IGtleXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgewpAQCAtMTMwNCwxOCArMTMyMCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGlzIFRyZWVNYXAuCisgICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhpcyBtYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBtYXBwaW5nIG9yIG51bGwgaWYga2V5IGlzIG5vdCBhIGtleSBpbgotICAgICAqICAgICAgICAgdGhpcyBUcmVlTWFwCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBrZXkgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleXMgaW4gdGhpcwotICAgICAqICAgICAgICAgICAgICAgIFRyZWVNYXAKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUga2V5IGlzIG51bGwgYW5kIHRoZSBjb21wYXJhdG9yIGNhbm5vdCBoYW5kbGUgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlbW92ZWQgbWFwcGluZyBvciB7QGNvZGUgbnVsbH0gaWYgbm8gbWFwcGluZworICAgICAqICAgICAgICAgZm9yIHRoZSBzcGVjaWZpZWQga2V5IHdhcyBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZSBrZXlzIGluIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBtYXAuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIHtAY29kZSBudWxsfSBhbmQgdGhlIGNvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgICBjYW5ub3QgaGFuZGxlIHtAY29kZSBudWxsfSBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBWIHJlbW92ZShPYmplY3Qga2V5KSB7CkBAIC0xMzUyLDkgKzEzNjksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgaW4gdGhpcyBUcmVlTWFwLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXBwaW5ncyBpbiB0aGlzIG1hcC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgaW4gdGhpcyBUcmVlTWFwCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKQEAgLTEzNjIsMjQgKzEzODAsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU29ydGVkTWFwIG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIFRyZWVNYXAgd2hpY2gKLSAgICAgKiBjb250YWlucyBrZXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHN0YXJ0IGtleSBidXQgbGVzcyB0aGFuIHRoZSBlbmQKLSAgICAgKiBrZXkuIFRoZSByZXR1cm5lZCBTb3J0ZWRNYXAgaXMgYmFja2VkIGJ5IHRoaXMgVHJlZU1hcCBzbyBjaGFuZ2VzIHRvIG9uZQotICAgICAqIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLgorICAgICAqIFJldHVybnMgYSBzb3J0ZWQgbWFwIG92ZXIgYSByYW5nZSBvZiB0aGlzIHNvcnRlZCBtYXAgd2l0aCBhbGwga2V5cworICAgICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHtAY29kZSBzdGFydEtleX0gYW5kIGxlc3MgdGhhbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIGVuZEtleX0uIENoYW5nZXMgdG8gdGhlIHJldHVybmVkIHNvcnRlZCBtYXAgYXJlCisgICAgICogcmVmbGVjdGVkIGluIHRoaXMgc29ydGVkIG1hcCBhbmQgdmljZSB2ZXJzYS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBUaGUgcmV0dXJuZWQgbWFwIHdpbGwgbm90IGFsbG93IGFuIGluc2VydGlvbiBvZiBhIGtleSBvdXRzaWRlIHRoZQorICAgICAqIHNwZWNpZmllZCByYW5nZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0S2V5Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQga2V5CisgICAgICogICAgICAgICAgICB0aGUgbG93IGJvdW5kYXJ5IG9mIHRoZSByYW5nZSAoaW5jbHVzaXZlKS4KICAgICAgKiBAcGFyYW0gZW5kS2V5Ci0gICAgICogICAgICAgICAgICB0aGUgZW5kIGtleQotICAgICAqIEByZXR1cm4gYSBzdWItbWFwIHdoZXJlIHRoZSBrZXlzIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvCi0gICAgICogICAgICAgICA8Y29kZT5zdGFydEtleTwvY29kZT4gYW5kIGxlc3MgdGhhbiA8Y29kZT5lbmRLZXk8L2NvZGU+Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBvciBlbmQga2V5IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZSBrZXlzCi0gICAgICogICAgICAgICAgICAgICAgaW4gdGhpcyBUcmVlTWFwCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YXJ0IG9yIGVuZCBrZXkgaXMgbnVsbCBhbmQgdGhlIGNvbXBhcmF0b3IKLSAgICAgKiAgICAgICAgICAgICAgICBjYW5ub3QgaGFuZGxlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBoaWdoIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSAoZXhjbHVzaXZlKSwKKyAgICAgKiBAcmV0dXJuIGEgc29ydGVkIG1hcCB3aXRoIHRoZSBrZXkgZnJvbSB0aGUgc3BlY2lmaWVkIHJhbmdlLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0YXJ0IG9yIGVuZCBrZXkgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleXMgaW4KKyAgICAgKiAgICAgICAgICAgICB0aGlzIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0YXJ0IG9yIGVuZCBrZXkgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUgY29tcGFyYXRvcgorICAgICAqICAgICAgICAgICAgIGNhbm5vdCBoYW5kbGUge0Bjb2RlIG51bGx9IGtleXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3RhcnQga2V5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIGtleSwgb3IgaWYgdGhpcyBtYXAKKyAgICAgKiAgICAgICAgICAgICBpcyBpdHNlbGYgYSBzb3J0ZWQgbWFwIG92ZXIgYSByYW5nZSBvZiBhbm90aGVyIHNvcnRlZCBtYXAgYW5kCisgICAgICogICAgICAgICAgICAgdGhlIHNwZWNpZmllZCByYW5nZSBpcyBvdXRzaWRlIG9mIGl0cyByYW5nZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ydGVkTWFwPEssIFY+IHN1Yk1hcChLIHN0YXJ0S2V5LCBLIGVuZEtleSkgewogICAgICAgICBpZiAoY29tcGFyYXRvciA9PSBudWxsKSB7CkBAIC0xNDA3LDIxICsxNDMyLDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNvcnRlZE1hcCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyBUcmVlTWFwIHdoaWNoCi0gICAgICogY29udGFpbnMga2V5cyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydCBrZXkuIFRoZSByZXR1cm5lZCBTb3J0ZWRNYXAKLSAgICAgKiBpcyBiYWNrZWQgYnkgdGhpcyBUcmVlTWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLgorICAgICAqIFJldHVybnMgYSBzb3J0ZWQgbWFwIG92ZXIgYSByYW5nZSBvZiB0aGlzIHNvcnRlZCBtYXAgd2l0aCBhbGwga2V5cyB0aGF0CisgICAgICogYXJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHtAY29kZSBzdGFydEtleX0uIENoYW5nZXMgdG8KKyAgICAgKiB0aGUgcmV0dXJuZWQgc29ydGVkIG1hcCBhcmUgcmVmbGVjdGVkIGluIHRoaXMgc29ydGVkIG1hcCBhbmQgdmljZSB2ZXJzYS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBUaGUgcmV0dXJuZWQgbWFwIHdpbGwgbm90IGFsbG93IGFuIGluc2VydGlvbiBvZiBhIGtleSBvdXRzaWRlIHRoZQorICAgICAqIHNwZWNpZmllZCByYW5nZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0S2V5Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQga2V5Ci0gICAgICogQHJldHVybiBhIHN1Yi1tYXAgd2hlcmUgdGhlIGtleXMgYXJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8KLSAgICAgKiAgICAgICAgIDxjb2RlPnN0YXJ0S2V5PC9jb2RlPgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgc3RhcnQga2V5IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZSBrZXlzIGluCi0gICAgICogICAgICAgICAgICAgICAgdGhpcyBUcmVlTWFwCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YXJ0IGtleSBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QKLSAgICAgKiAgICAgICAgICAgICAgICBoYW5kbGUgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIGxvdyBib3VuZGFyeSBvZiB0aGUgcmFuZ2Ugc3BlY2lmaWVkLgorICAgICAqIEByZXR1cm4gYSBzb3J0ZWQgbWFwIHdoZXJlIHRoZSBrZXlzIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvCisgICAgICogICAgICAgICB7QGNvZGUgc3RhcnRLZXl9LgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleXMgaW4gdGhpcworICAgICAqICAgICAgICAgICAgIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMge0Bjb2RlIG51bGx9IGFuZCB0aGUgY29tcGFyYXRvcgorICAgICAqICAgICAgICAgICAgIGNhbm5vdCBoYW5kbGUge0Bjb2RlIG51bGx9IGtleXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1hcCBpdHNlbGYgYSBzb3J0ZWQgbWFwIG92ZXIgYSByYW5nZSBvZiBhbm90aGVyIG1hcAorICAgICAqICAgICAgICAgICAgIGFuZCB0aGUgc3BlY2lmaWVkIGtleSBpcyBvdXRzaWRlIG9mIGl0cyByYW5nZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU29ydGVkTWFwPEssIFY+IHRhaWxNYXAoSyBzdGFydEtleSkgewogICAgICAgICAvLyBDaGVjayBmb3IgZXJyb3JzCkBAIC0xNDM0LDExICsxNDY2LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBUcmVlTWFwLiBUaGUKLSAgICAgKiBjb2xsZWN0aW9uIGlzIGJhY2tlZCBieSB0aGlzIFRyZWVNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieQotICAgICAqIHRoZSBvdGhlci4gVGhlIGNvbGxlY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcuCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZSBjb2xsZWN0aW9uCisgICAgICogaXMgYmFja2VkIGJ5IHRoaXMgbWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLiBUaGUKKyAgICAgKiBjb2xsZWN0aW9uIHN1cHBvcnRzIHJlbW92ZSwgcmVtb3ZlQWxsLCByZXRhaW5BbGwgYW5kIGNsZWFyIG9wZXJhdGlvbnMsCisgICAgICogYW5kIGl0IGRvZXMgbm90IHN1cHBvcnQgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBjb2xsZWN0aW9uIHdoaWNoIGlzIHRoZSBzdWJjbGFzcyBvZgorICAgICAqIEFic3RyYWN0Q29sbGVjdGlvbi4gVGhlIGl0ZXJhdG9yIG1ldGhvZCBvZiB0aGlzIHN1YmNsYXNzIHJldHVybnMgYQorICAgICAqICJ3cmFwcGVyIG9iamVjdCIgb3ZlciB0aGUgaXRlcmF0b3Igb2YgbWFwJ3MgZW50cnlTZXQoKS4gVGhlIHtAY29kZSBzaXplfQorICAgICAqIG1ldGhvZCB3cmFwcyB0aGUgbWFwJ3Mgc2l6ZSBtZXRob2QgYW5kIHRoZSB7QGNvZGUgY29udGFpbnN9IG1ldGhvZCB3cmFwcworICAgICAqIHRoZSBtYXAncyBjb250YWluc1ZhbHVlIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgKiBhbmQgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gYWxsIHN1YnNlcXVlbnQgY2FsbHMuIFRoaXMgbWV0aG9kIG1heSByZXR1cm4KKyAgICAgKiBkaWZmZXJlbnQgY29sbGVjdGlvbnMgd2hlbiBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIG9jY3VyLCBzaW5jZSBubworICAgICAqIHN5bmNocm9uaXphdGlvbiBpcyBwZXJmb3JtZWQuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMKKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RyZWVTZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVHJlZVNldC5qYXZhCmluZGV4IDJhZTNkYzMuLmJmZDU3MmYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVHJlZVNldC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVHJlZVNldC5qYXZhCkBAIC0yNCwxMSArMjQsMTIgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBUcmVlU2V0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFNvcnRlZFNldC4gQWxsIG9wdGlvbmFsIG9wZXJhdGlvbnMgYXJlCi0gKiBzdXBwb3J0ZWQsIGFkZGluZyBhbmQgcmVtb3ZpbmcuIFRoZSBlbGVtZW50cyBjYW4gYmUgYW55IG9iamVjdHMgd2hpY2ggYXJlCisgKiBUcmVlU2V0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFNvcnRlZFNldC4gQWxsIG9wdGlvbmFsIG9wZXJhdGlvbnMgKGFkZGluZworICogYW5kIHJlbW92aW5nKSBhcmUgc3VwcG9ydGVkLiBUaGUgZWxlbWVudHMgY2FuIGJlIGFueSBvYmplY3RzIHdoaWNoIGFyZQogICogY29tcGFyYWJsZSB0byBlYWNoIG90aGVyIGVpdGhlciB1c2luZyB0aGVpciBuYXR1cmFsIG9yZGVyIG9yIGEgc3BlY2lmaWVkCiAgKiBDb21wYXJhdG9yLgotICogQHNpbmNlIDEuMgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFRyZWVTZXQ8RT4gZXh0ZW5kcyBBYnN0cmFjdFNldDxFPiBpbXBsZW1lbnRzIFNvcnRlZFNldDxFPiwgQ2xvbmVhYmxlLAogICAgICAgICBTZXJpYWxpemFibGUgewpAQCAtNDIsMjQgKzQzLDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiBUcmVlU2V0IHdoaWNoIHVzZXMgbmF0dXJhbCBvcmRlcmluZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGluc3RhbmNlIG9mIHtAY29kZSBUcmVlU2V0fSB3aGljaCB1c2VzIG5hdHVyYWwKKyAgICAgKiBvcmRlcmluZy4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVHJlZVNldCgpIHsKICAgICAgICAgYmFja2luZ01hcCA9IG5ldyBUcmVlTWFwPEUsIEU+KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUcmVlU2V0IHdoaWNoIHVzZXMgbmF0dXJhbCBvcmRlcmluZyBhbmQKLSAgICAgKiBjb250YWluaW5nIHRoZSB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFRyZWVTZXR9IHdoaWNoIHVzZXMgbmF0dXJhbCBvcmRlcmluZworICAgICAqIGFuZCBjb250YWluaW5nIHRoZSB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyB0byBhZGQKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gZWxlbWVudCBpbiB0aGUgQ29sbGVjdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgQ29tcGFyYWJsZSBpbnRlcmZhY2UsIG9yIHRoZSBlbGVtZW50cyBpbiB0aGUgQ29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBjb21wYXJlZAorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgdG8gYWRkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uIGRvZXMgbm90IGltcGxlbWVudCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBDb21wYXJhYmxlIGludGVyZmFjZSwgb3IgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICAgICAgY2Fubm90IGJlIGNvbXBhcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUcmVlU2V0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKICAgICAgICAgdGhpcygpOwpAQCAtNjcsMjIgKzcwLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiBUcmVlU2V0IHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZAotICAgICAqIENvbXBhcmF0b3IuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiB7QGNvZGUgVHJlZVNldH0gd2hpY2ggdXNlcyB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY29tcGFyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29tcGFyYXRvcgotICAgICAqICAgICAgICAgICAgdGhlIENvbXBhcmF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wYXJhdG9yIHRvIHVzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVHJlZVNldChDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewogICAgICAgICBiYWNraW5nTWFwID0gbmV3IFRyZWVNYXA8RSwgRT4oY29tcGFyYXRvcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUcmVlU2V0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBTb3J0ZWRTZXQgYW5kIHVzaW5nIHRoZSBzYW1lIENvbXBhcmF0b3IuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgVHJlZVNldH0gY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YKKyAgICAgKiB0aGUgc3BlY2lmaWVkIFNvcnRlZFNldCBhbmQgdXNpbmcgdGhlIHNhbWUgQ29tcGFyYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgU29ydGVkU2V0IG9mIGVsZW1lbnRzIHRvIGFkZAorICAgICAqICAgICAgICAgICAgdGhlIFNvcnRlZFNldCBvZiBlbGVtZW50cyB0byBhZGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRyZWVTZXQoU29ydGVkU2V0PEU+IHNldCkgewogICAgICAgICB0aGlzKHNldC5jb21wYXJhdG9yKCkpOwpAQCAtOTMsMTkgKzk4LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIFRyZWVTZXQuCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIHtAY29kZSBUcmVlU2V0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgVHJlZVNldCBkaWQgbm90IGFscmVhZHkgY29udGFpbiB0aGUgb2JqZWN0LCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGVsZW1lbnRzIGluCi0gICAgICogICAgICAgICAgICAgICAgdGhpcyBUcmVlU2V0Ci0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlCi0gICAgICogICAgICAgICAgICAgICAgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGlzIHtAY29kZSBUcmVlU2V0fSBkaWQgbm90IGFscmVhZHkgY29udGFpbgorICAgICAqICAgICAgICAgdGhlIG9iamVjdCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGVsZW1lbnRzIGluIHRoaXMKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgVHJlZVNldH0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlCisgICAgICogICAgICAgICAgICAgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBvYmplY3QpIHsKQEAgLTExMywxOCArMTE4LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gdG8gdGhpcyBUcmVlU2V0LgorICAgICAqIEFkZHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRvIHRoaXMge0Bjb2RlIFRyZWVTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVHJlZVNldCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIG9iamVjdCBpbiB0aGUgQ29sbGVjdGlvbiBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aAotICAgICAqICAgICAgICAgICAgICAgIHRoZSBlbGVtZW50cyBpbiB0aGlzIFRyZWVTZXQKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgaW4gdGhlIENvbGxlY3Rpb24gaXMgbnVsbCBhbmQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gYWRkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIFRyZWVTZXR9IHdhcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiBhbiBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24gY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhpcyB7QGNvZGUgVHJlZVNldH0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IGluIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwgYW5kIHRoZSBjb21wYXJhdG9yCisgICAgICogICAgICAgICAgICAgY2Fubm90IGhhbmRsZSBudWxsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7CkBAIC0xMzIsMTAgKzEzOCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBUcmVlU2V0LCBsZWF2aW5nIGl0IGVtcHR5LgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyB7QGNvZGUgVHJlZVNldH0sIGxlYXZpbmcgaXQgZW1wdHkuCiAgICAgICogCiAgICAgICogQHNlZSAjaXNFbXB0eQogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKQEAgLTE0MywxMiArMTUwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBUcmVlU2V0IHdpdGggdGhlIHNhbWUgZWxlbWVudHMsIHNpemUgYW5kIGNvbXBhcmF0b3IgYXMgdGhpcwotICAgICAqIFRyZWVTZXQuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgVHJlZVNldH0gd2l0aCB0aGUgc2FtZSBlbGVtZW50cywgc2l6ZSBhbmQgY29tcGFyYXRvcgorICAgICAqIGFzIHRoaXMge0Bjb2RlIFRyZWVTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBUcmVlU2V0Ci0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBUcmVlU2V0fS4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBAT3ZlcnJpZGUKQEAgLTE2NywyOCArMTc0LDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgaW4gdGhpcyBUcmVlU2V0LgorICAgICAqIFJldHVybnMgdGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIFRyZWVTZXR9LgogICAgICAqIAogICAgICAqIEByZXR1cm4gYSBDb21wYXJhdG9yIG9yIG51bGwgaWYgdGhlIG5hdHVyYWwgb3JkZXJpbmcgaXMgdXNlZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcigpIHsKICAgICAgICAgcmV0dXJuIGJhY2tpbmdNYXAuY29tcGFyYXRvcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgVHJlZVNldCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogU2VhcmNoZXMgdGhpcyB7QGNvZGUgVHJlZVNldH0gZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIGFuIGVsZW1lbnQgb2YgdGhpcyBUcmVlU2V0LAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGVsZW1lbnRzIGluCi0gICAgICogICAgICAgICAgICAgICAgdGhpcyBUcmVlU2V0Ci0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlCi0gICAgICogICAgICAgICAgICAgICAgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBvYmplY3R9IGlzIGFuIGVsZW1lbnQgb2YgdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIFRyZWVTZXR9LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhpcworICAgICAqICAgICAgICAgICAgIHtAY29kZSBUcmVlU2V0fS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgb2JqZWN0IGlzIG51bGwgYW5kIHRoZSBjb21wYXJhdG9yIGNhbm5vdCBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICBudWxsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKQEAgLTE5NiwzMiArMjA0LDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGlzIFRyZWVTZXQuCisgICAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGlzIHtAY29kZSBUcmVlU2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIFRyZWVTZXQgaXMgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50LgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhpcyB7QGNvZGUgVHJlZVNldH0gaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEUgZmlyc3QoKSB7CiAgICAgICAgIHJldHVybiBiYWNraW5nTWFwLmZpcnN0S2V5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNvcnRlZFNldCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyBUcmVlU2V0IHdoaWNoCi0gICAgICogY29udGFpbnMgZWxlbWVudHMgbGVzcyB0aGFuIHRoZSBlbmQgZWxlbWVudC4gVGhlIHJldHVybmVkIFNvcnRlZFNldCBpcwotICAgICAqIGJhY2tlZCBieSB0aGlzIFRyZWVTZXQgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCisgICAgICogUmV0dXJucyBhIFNvcnRlZFNldCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhpcyB7QGNvZGUgVHJlZVNldH0KKyAgICAgKiB3aGljaCBjb250YWlucyBlbGVtZW50cyB3aGljaCBhcmUgYWxsIGxlc3MgdGhhbiB0aGUgZW5kIGVsZW1lbnQuIFRoZQorICAgICAqIHJldHVybmVkIFNvcnRlZFNldCBpcyBiYWNrZWQgYnkgdGhpcyB7QGNvZGUgVHJlZVNldH0gc28gY2hhbmdlcyB0byBvbmUKKyAgICAgKiBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgZW5kIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIGEgc3Vic2V0IHdoZXJlIHRoZSBlbGVtZW50cyBhcmUgbGVzcyB0aGFuIDxjb2RlPmVuZDwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGVuZCBvYmplY3QgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGVsZW1lbnRzCi0gICAgICogICAgICAgICAgICAgICAgaW4gdGhpcyBUcmVlU2V0Ci0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGVuZCBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGNvbXBhcmF0b3IgY2Fubm90Ci0gICAgICogICAgICAgICAgICAgICAgaGFuZGxlIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIGEgc3Vic2V0IHdoZXJlIHRoZSBlbGVtZW50cyBhcmUgbGVzcyB0aGFuIHtAY29kZSBlbmR9CisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBlbmQgb2JqZWN0IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZSBlbGVtZW50cyBpbgorICAgICAqICAgICAgICAgICAgIHRoaXMge0Bjb2RlIFRyZWVTZXR9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBlbmQgb2JqZWN0IGlzIG51bGwgYW5kIHRoZSBjb21wYXJhdG9yIGNhbm5vdCBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICBudWxsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBTb3J0ZWRTZXQ8RT4gaGVhZFNldChFIGVuZCkgewpAQCAtMjM2LDExICsyNDUsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgVHJlZVNldCBoYXMgbm8gZWxlbWVudHMsIGEgc2l6ZSBvZiB6ZXJvLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHtAY29kZSBUcmVlU2V0fSBoYXMgbm8gZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFRyZWVTZXQgaGFzIG5vIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB7QGNvZGUgVHJlZVNldH0gaGFzIG5vIGVsZW1lbnQuCiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CkBAIC0yNDgsMTEgKzI1NywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgVHJlZVNldC4KKyAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBUcmVlU2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIFRyZWVTZXQKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBvZiB0aGlzIHtAY29kZSBUcmVlU2V0fS4KICAgICAgKiBAc2VlIEl0ZXJhdG9yCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewpAQCAtMjYwLDMwICsyNjksMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhpcyBUcmVlU2V0LgorICAgICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGlzIHtAY29kZSBUcmVlU2V0fS4gVGhlIGxhc3QgZWxlbWVudCBpcworICAgICAqIHRoZSBoaWdoZXN0IGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGFzdCBlbGVtZW50Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGlzIFRyZWVTZXQgaXMgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGVsZW1lbnQuCisgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGlzIHtAY29kZSBUcmVlU2V0fSBpcyBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRSBsYXN0KCkgewogICAgICAgICByZXR1cm4gYmFja2luZ01hcC5sYXN0S2V5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhpcyBUcmVlU2V0LgorICAgICAqIFJlbW92ZXMgYW4gb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMge0Bjb2RlIFRyZWVTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVHJlZVNldCBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGVsZW1lbnRzIGluCi0gICAgICogICAgICAgICAgICAgICAgdGhpcyBUcmVlU2V0Ci0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlCi0gICAgICogICAgICAgICAgICAgICAgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byByZW1vdmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgVHJlZVNldH0gd2FzIG1vZGlmaWVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGVsZW1lbnRzIGluIHRoaXMKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgVHJlZVNldH0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QgaGFuZGxlCisgICAgICogICAgICAgICAgICAgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewpAQCAtMjkxLDkgKzMwMiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIFRyZWVTZXQuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMge0Bjb2RlIFRyZWVTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIFRyZWVTZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyB7QGNvZGUgVHJlZVNldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBzaXplKCkgewpAQCAtMzAxLDI0ICszMTMsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU29ydGVkU2V0IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIFRyZWVTZXQgd2hpY2gKLSAgICAgKiBjb250YWlucyBlbGVtZW50cyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydCBlbGVtZW50IGJ1dCBsZXNzIHRoYW4gdGhlCi0gICAgICogZW5kIGVsZW1lbnQuIFRoZSByZXR1cm5lZCBTb3J0ZWRTZXQgaXMgYmFja2VkIGJ5IHRoaXMgVHJlZVNldCBzbyBjaGFuZ2VzCi0gICAgICogdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLgorICAgICAqIFJldHVybnMgYSBTb3J0ZWRTZXQgb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoaXMge0Bjb2RlIFRyZWVTZXR9CisgICAgICogd2hpY2ggY29udGFpbnMgZWxlbWVudHMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQgZWxlbWVudCBidXQgbGVzcworICAgICAqIHRoYW4gdGhlIGVuZCBlbGVtZW50LiBUaGUgcmV0dXJuZWQgU29ydGVkU2V0IGlzIGJhY2tlZCBieSB0aGlzCisgICAgICoge0Bjb2RlIFRyZWVTZXR9IHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBlbGVtZW50LgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgZWxlbWVudAotICAgICAqIEByZXR1cm4gYSBzdWJzZXQgd2hlcmUgdGhlIGVsZW1lbnRzIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvCi0gICAgICogICAgICAgICA8Y29kZT5zdGFydDwvY29kZT4gYW5kIGxlc3MgdGhhbiA8Y29kZT5lbmQ8L2NvZGU+Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBvciBlbmQgb2JqZWN0IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZQotICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoaXMgVHJlZVNldAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBvciBlbmQgb2JqZWN0IGlzIG51bGwgYW5kIHRoZSBjb21wYXJhdG9yCi0gICAgICogICAgICAgICAgICAgICAgY2Fubm90IGhhbmRsZSBudWxsCisgICAgICogICAgICAgICAgICB0aGUgZW5kIGVsZW1lbnQgKGV4Y2x1c2l2ZSkuCisgICAgICogQHJldHVybiBhIHN1YnNldCB3aGVyZSB0aGUgZWxlbWVudHMgYXJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8ge0Bjb2RlIHN0YXJ0fQorICAgICAqICAgICAgICAgYW5kIGxlc3MgdGhhbiB7QGNvZGUgZW5kfQorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgc3RhcnQgb3IgZW5kIG9iamVjdCBjYW5ub3QgYmUgY29tcGFyZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGlzIHtAY29kZSBUcmVlU2V0fS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgc3RhcnQgb3IgZW5kIG9iamVjdCBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvcgorICAgICAqICAgICAgICAgICAgIGNhbm5vdCBoYW5kbGUgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgU29ydGVkU2V0PEU+IHN1YlNldChFIHN0YXJ0LCBFIGVuZCkgewpAQCAtMzM2LDIyICszNDgsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU29ydGVkU2V0IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIFRyZWVTZXQgd2hpY2gKLSAgICAgKiBjb250YWlucyBlbGVtZW50cyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydCBlbGVtZW50LiBUaGUgcmV0dXJuZWQKLSAgICAgKiBTb3J0ZWRTZXQgaXMgYmFja2VkIGJ5IHRoaXMgVHJlZVNldCBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5Ci0gICAgICogdGhlIG90aGVyLgorICAgICAqIFJldHVybnMgYSBTb3J0ZWRTZXQgb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoaXMge0Bjb2RlIFRyZWVTZXR9CisgICAgICogd2hpY2ggY29udGFpbnMgZWxlbWVudHMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQgZWxlbWVudC4gVGhlCisgICAgICogcmV0dXJuZWQgU29ydGVkU2V0IGlzIGJhY2tlZCBieSB0aGlzIHtAY29kZSBUcmVlU2V0fSBzbyBjaGFuZ2VzIHRvIG9uZQorICAgICAqIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIGEgc3Vic2V0IHdoZXJlIHRoZSBlbGVtZW50cyBhcmUgZ3JlYXRlciBvciBlcXVhbCB0bwotICAgICAqICAgICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBvYmplY3QgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggdGhlIGVsZW1lbnRzCi0gICAgICogICAgICAgICAgICAgICAgaW4gdGhpcyBUcmVlU2V0Ci0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YXJ0IG9iamVjdCBpcyBudWxsIGFuZCB0aGUgY29tcGFyYXRvciBjYW5ub3QKLSAgICAgKiAgICAgICAgICAgICAgICBoYW5kbGUgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGVsZW1lbnQuCisgICAgICogQHJldHVybiBhIHN1YnNldCB3aGVyZSB0aGUgZWxlbWVudHMgYXJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8ge0Bjb2RlIHN0YXJ0fQorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiB0aGUgc3RhcnQgb2JqZWN0IGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHRoZSBlbGVtZW50cyBpbgorICAgICAqICAgICAgICAgICAgIHRoaXMge0Bjb2RlIFRyZWVTZXR9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSBzdGFydCBvYmplY3QgaXMgbnVsbCBhbmQgdGhlIGNvbXBhcmF0b3IgY2Fubm90CisgICAgICogICAgICAgICAgICAgaGFuZGxlIG51bGwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIFNvcnRlZFNldDxFPiB0YWlsU2V0KEUgc3RhcnQpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVVVJRC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9VVUlELmphdmEKaW5kZXggZTNjNWM4Ni4uYTVhYjcwMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9VVUlELmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9VVUlELmphdmEKQEAgLTM5LDggKzM5LDcgQEAKICAqIGRldGFpbHMuCiAgKiA8L3A+CiAgKiAKLSAqIEBzaW5jZSAxLjUKLSAqIEBhdXRob3IgTmF0aGFuIEJleWVyIChIYXJtb255KQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBVVUlEIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDb21wYXJhYmxlPFVVSUQ+IHsKIApAQCAtNjMsOCArNjIsMTEgQEAKICAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBiaXRzLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9zdFNpZ0JpdHMgVGhlIDY0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgVVVJRC4KLSAgICAgKiBAcGFyYW0gbGVhc3RTaWdCaXRzIFRoZSA2NCBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBVVUlELgorICAgICAqIEBwYXJhbSBtb3N0U2lnQml0cworICAgICAqICAgICAgICAgICAgVGhlIDY0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgVVVJRC4KKyAgICAgKiBAcGFyYW0gbGVhc3RTaWdCaXRzCisgICAgICogICAgICAgICAgICBUaGUgNjQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgVVVJRC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVVJRChsb25nIG1vc3RTaWdCaXRzLCBsb25nIGxlYXN0U2lnQml0cykgewogICAgICAgICBzdXBlcigpOwpAQCAtNzYsNyArNzgsNyBAQAogICAgIC8qKgogICAgICAqIDxwPgogICAgICAqIFNldHMgdXAgdGhlIHRyYW5zaWVudCBmaWVsZHMgb2YgdGhpcyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZXMKLSAgICAgKiBvZiB0aGUgPGNvZGU+bW9zdFNpZ0JpdHM8L2NvZGU+IGFuZCA8Y29kZT5sZWFzdFNpZ0JpdHM8L2NvZGU+IGZpZWxkcy4KKyAgICAgKiBvZiB0aGUge0Bjb2RlIG1vc3RTaWdCaXRzfSBhbmQge0Bjb2RlIGxlYXN0U2lnQml0c30gZmllbGRzLgogICAgICAqIDwvcD4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKQEAgLTEyMyw3ICsxMjUsOCBAQAogICAgICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0Ij5SRkMgNDEyMjwvYT4uCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSBVVUlEIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gYW4gVVVJRCBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFVVSUQgcmFuZG9tVVVJRCgpIHsKICAgICAgICAgYnl0ZVtdIGRhdGE7CkBAIC0xNjMsNyArMTY2LDEwIEBACiAgICAgICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHQiPlJGQyA0MTIyPC9hPi4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBBIFVVSUQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHVzZWQgYXMgYnl0ZSBhcnJheSB0byBjcmVhdGUgYW4gVVVJRC4KKyAgICAgKiBAcmV0dXJuIGFuIFVVSUQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBVVUlEIG5hbWVVVUlERnJvbUJ5dGVzKGJ5dGVbXSBuYW1lKSB7CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKQEAgLTIwNSwxMSArMjExLDEyIEBACiAgICAgICogUGFyc2VzIGEgVVVJRCBzdHJpbmcgd2l0aCB0aGUgZm9ybWF0IGRlZmluZWQgYnkge0BsaW5rICN0b1N0cmluZygpfS4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIHV1aWQgVGhlIFVVSUQgc3RyaW5nIHRvIHBhcnNlLgotICAgICAqIEByZXR1cm4gQSBVVUlEIGluc3RhbmNlLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+dXVpZDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+dXVpZDwvY29kZT4gaXMgbm90IGZvcm1hdHRlZAotICAgICAqICAgICAgICAgY29ycmVjdGx5LgorICAgICAqIEBwYXJhbSB1dWlkCisgICAgICogICAgICAgICAgICB0aGUgVVVJRCBzdHJpbmcgdG8gcGFyc2UuCisgICAgICogQHJldHVybiBhbiBVVUlEIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHV1aWR9IGlzIG5vdCBmb3JtYXR0ZWQgY29ycmVjdGx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVVVJRCBmcm9tU3RyaW5nKFN0cmluZyB1dWlkKSB7CiAgICAgICAgIGlmICh1dWlkID09IG51bGwpIHsKQEAgLTI1MSw3ICsyNTgsOCBAQAogICAgICAqIFRoZSA2NCBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBVVUlELgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgbG9uZyB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSA2NCBsZWFzdCBzaWduaWZpY2FudCBiaXRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldExlYXN0U2lnbmlmaWNhbnRCaXRzKCkgewogICAgICAgICByZXR1cm4gbGVhc3RTaWdCaXRzOwpAQCAtMjYyLDcgKzI3MCw4IEBACiAgICAgICogVGhlIDY0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgVVVJRC4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBBIGxvbmcgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgNjQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldE1vc3RTaWduaWZpY2FudEJpdHMoKSB7CiAgICAgICAgIHJldHVybiBtb3N0U2lnQml0czsKQEAgLTI4Miw3ICsyOTEsOCBAQAogICAgICAqIDxsaT41IC0gTmFtZS1iYXNlZCB3aXRoIFNIQS0xIGhhc2hpbmcgVVVJRDwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGludCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBpbnR9IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgdmVyc2lvbigpIHsKICAgICAgICAgcmV0dXJuIHZlcnNpb247CkBAIC0zMDAsNyArMzEwLDggQEAKICAgICAgKiA8bGk+NyAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gaW50IHZhbHVlLgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIGludH0gdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCB2YXJpYW50KCkgewogICAgICAgICByZXR1cm4gdmFyaWFudDsKQEAgLTMxMiw4ICszMjMsMTAgQEAKICAgICAgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dCI+UkZDIDQxMjI8L2E+LgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgbG9uZyB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHtAbGluayAjdmVyc2lvbigpfSBpcyBub3QgMS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGxvbmd9IHZhbHVlLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGxpbmsgI3ZlcnNpb24oKX0gaXMgbm90IDEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgdGltZXN0YW1wKCkgewogICAgICAgICBpZiAodmVyc2lvbiAhPSAxKSB7CkBAIC0zMjgsOCArMzQxLDEwIEBACiAgICAgICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHQiPlJGQyA0MTIyPC9hPi4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBBIGxvbmcgdmFsdWUuCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB7QGxpbmsgI3ZlcnNpb24oKX0gaXMgbm90IDEuCisgICAgICogQHJldHVybiBhIHtAY29kZSBsb25nfSB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0BsaW5rICN2ZXJzaW9uKCl9IGlzIG5vdCAxLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2xvY2tTZXF1ZW5jZSgpIHsKICAgICAgICAgaWYgKHZlcnNpb24gIT0gMSkgewpAQCAtMzQ0LDggKzM1OSwxMCBAQAogICAgICAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0Ij5SRkMgNDEyMjwvYT4uCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSBsb25nIHZhbHVlLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYge0BsaW5rICN2ZXJzaW9uKCl9IGlzIG5vdCAxLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgbG9uZ30gdmFsdWUuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAbGluayAjdmVyc2lvbigpfSBpcyBub3QgMS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBub2RlKCkgewogICAgICAgICBpZiAodmVyc2lvbiAhPSAxKSB7CkBAIC0zNjEsOSArMzc4LDExIEBACiAgICAgICogc2lnbmlmaWNhbnQuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBVVUlEIHRvIGNvbXBhcmUgdG8uCi0gICAgICogQHJldHVybiBBIHZhbHVlIG9mIC0xLCAwIG9yIDEgaWYgdGhpcyBVVUlEIGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8gb3IKLSAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT51dWlkPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdXVpZAorICAgICAqICAgICAgICAgICAgdGhlIFVVSUQgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIGEgdmFsdWUgb2YgLTEsIDAgb3IgMSBpZiB0aGlzIFVVSUQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0byBvcgorICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSB1dWlkfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhVVUlEIHV1aWQpIHsKICAgICAgICAgaWYgKHV1aWQgPT0gdGhpcykgewpAQCAtMzg3LDE0ICs0MDYsMTYgQEAKIAogICAgIC8qKgogICAgICAqIDxwPgotICAgICAqIENvbXBhcmVzIHRoaXMgVVVJRCB0byBhbm90aGVyIG9iamVjdCBmb3IgZXF1YWxpdHkuIElmIDxjb2RlPm9iamVjdDwvY29kZT4KLSAgICAgKiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGEgVVVJRCBpbnN0YW5jZSBhbmQgYWxsIGJpdHMgYXJlIGVxdWFscywKLSAgICAgKiB0aGVuIDxjb2RlPnRydWU8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIENvbXBhcmVzIHRoaXMgVVVJRCB0byBhbm90aGVyIG9iamVjdCBmb3IgZXF1YWxpdHkuIElmIHtAY29kZSBvYmplY3R9CisgICAgICogaXMgbm90IHtAY29kZSBudWxsfSwgaXMgYSBVVUlEIGluc3RhbmNlLCBhbmQgYWxsIGJpdHMgYXJlIGVxdWFsLCB0aGVuCisgICAgICoge0Bjb2RlIHRydWV9IGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBPYmplY3QgdG8gY29tcGFyZSB0by4KLSAgICAgKiBAcmV0dXJuIEEgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBVVUlEIGlzIGVxdWFsIHRvCi0gICAgICogICAgICAgICA8Y29kZT5vYmplY3Q8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QuCisgICAgICogQHBhcmFtIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3R9IHRvIGNvbXBhcmUgdG8uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBVVUlEIGlzIGVxdWFsIHRvIHtAY29kZSBvYmplY3R9CisgICAgICogICAgICAgICBvciB7QGNvZGUgZmFsc2V9IGlmIG5vdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtNDIyLDcgKzQ0Myw4IEBACiAgICAgICoge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGludCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBpbnR9IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC00NTMsNyArNDc1LDggQEAKICAgICAgKiAgICAgICAgICAgICAgICAmcXVvdDtBJnF1b3Q7IC8gJnF1b3Q7QiZxdW90OyAvICZxdW90O0MmcXVvdDsgLyAmcXVvdDtEJnF1b3Q7IC8gJnF1b3Q7RSZxdW90OyAvICZxdW90O0YmcXVvdDsKICAgICAgKiA8L3ByZT4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTQ4Niw5ICs1MDksMTIgQEAKICAgICAgKiBSZXNldHMgdGhlIHRyYW5zaWVudCBmaWVsZHMgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9mIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiA8Y29kZT5pbjwvY29kZT4gdGhyb3dzIGl0LgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiA8Y29kZT5pbjwvY29kZT4gdGhyb3dzIGl0LgorICAgICAqIEBwYXJhbSBpbgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcmVhZCBmcm9tLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW59IHRocm93cyBpdC4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW59IHRocm93cyBpdC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Vua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Vua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKaW5kZXggOWJkNDk2OC4uMTliOWI2ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Vbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24uamF2YQpAQCAtMTgsMTAgKzE4LDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogVGhlIHVuY2hlY2tlZCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0IGlmIHRoZSBmb3JtYXQgY29udmVyc2lvbiBpcwotICogdW5rbm93bi4KKyAqIEFuIHtAY29kZSBVbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGZvcm1hdAorICogY29udmVyc2lvbiBpcyB1bmtub3duLgogICogCi0gKiAKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOTA2MDQxOEw7CkBAIC0yOSwxMSArMzAsMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBzOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBVbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbiB3aXRoIHRoZSB1bmtub3duIGZvcm1hdAotICAgICAqIGNvbnZlcnNpb24uCisgICAgICogQ29uc3RydWN0cyBhbiB7QGNvZGUgVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb259IHdpdGggdGhlIHVua25vd24KKyAgICAgKiBmb3JtYXQgY29udmVyc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgVGhlIHVua25vd24gZm9ybWF0IGNvbnZlcnNpb24KKyAgICAgKiBAcGFyYW0gcyAKKyAgICAgKiAgICAgICAgICAgdGhlIHVua25vd24gZm9ybWF0IGNvbnZlcnNpb24uCiAgICAgICovCiAgICAgcHVibGljIFVua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAgICAgICAgIHRoaXMucyA9IHM7CkBAIC00Miw3ICs0Myw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY29udmVyc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjb252ZXJzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDb252ZXJzaW9uKCkgewogICAgICAgICByZXR1cm4gczsKQEAgLTUxLDcgKzUyLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Vua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Vbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb24uamF2YQppbmRleCBlODdkN2JjLi44MzczMjhhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1Vua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uLmphdmEKQEAgLTE5LDggKzE5LDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiAKIC8qKgotICogVGhlIHVuY2hlY2tlZCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb3V0IGlmIHRoZXJlIGlzIGFuIHVua25vd24gZmxhZy4KKyAqIEFuIHtAY29kZSBVbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duIGlmIHRoZXJlIGlzCisgKiBhbiB1bmtub3duIGZsYWcuCiAgKiAKKyAqIEBzZWUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiB7CiAKQEAgLTI5LDEwICszMiwxMSBAQAogICAgIHByaXZhdGUgU3RyaW5nIGZsYWdzOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBVbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGZsYWdzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogZmxhZ3MuCiAgICAgICogCiAgICAgICogQHBhcmFtIGYKLSAgICAgKiAgICAgICAgICAgIFRoZSBzcGVjaWZpZWQgZmxhZ3MuCisgICAgICogICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZmxhZ3MuCiAgICAgICovCiAgICAgcHVibGljIFVua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbihTdHJpbmcgZikgewogICAgICAgICBpZiAobnVsbCA9PSBmKSB7CkBAIC00NCw3ICs0OCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGbGFncygpIHsKICAgICAgICAgcmV0dXJuIGZsYWdzOwpAQCAtNTMsNyArNTcsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVmVjdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1ZlY3Rvci5qYXZhCmluZGV4IDY4OTkyZTAuLjdhNWM3NzUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVmVjdG9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9WZWN0b3IuamF2YQpAQCAtMjQsMjAgKzI0LDIxIEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiAKIC8qKgotICogVmVjdG9yIGlzIGEgdmFyaWFibGUgc2l6ZSBjb250aWd1b3VzIGluZGV4YWJsZSBhcnJheSBvZiBPYmplY3RzLiBUaGUgc2l6ZSBvZgotICogdGhlIFZlY3RvciBpcyB0aGUgbnVtYmVyIG9mIE9iamVjdHMgaXQgY29udGFpbnMuIFRoZSBjYXBhY2l0eSBvZiB0aGUgVmVjdG9yCi0gKiBpcyB0aGUgbnVtYmVyIG9mIE9iamVjdHMgaXQgY2FuIGhvbGQuCisgKiBWZWN0b3IgaXMgYSB2YXJpYWJsZSBzaXplIGNvbnRpZ3VvdXMgaW5kZXhhYmxlIGFycmF5IG9mIG9iamVjdHMuIFRoZSBzaXplIG9mCisgKiB0aGUgdmVjdG9yIGlzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpdCBjb250YWlucy4gVGhlIGNhcGFjaXR5IG9mIHRoZSB2ZWN0b3IKKyAqIGlzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpdCBjYW4gaG9sZC4KICAqIDxwPgotICogT2JqZWN0cyBtYXkgYmUgaW5zZXJ0ZWQgYXQgYW55IHBvc2l0aW9uIHVwIHRvIHRoZSBzaXplIG9mIHRoZSBWZWN0b3IsCi0gKiBpbmNyZWFzaW5nIHRoZSBzaXplIG9mIHRoZSBWZWN0b3IuIE9iamVjdHMgYXQgYW55IHBvc2l0aW9uIGluIHRoZSBWZWN0b3IgbWF5Ci0gKiBiZSByZW1vdmVkLCBzaHJpbmtpbmcgdGhlIHNpemUgb2YgdGhlIFZlY3Rvci4gT2JqZWN0cyBhdCBhbnkgcG9zaXRpb24gaW4gdGhlCi0gKiBWZWN0b3IgbWF5IGJlIHJlcGxhY2VkLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIFZlY3RvciBzaXplLgorICogT2JqZWN0cyBtYXkgYmUgaW5zZXJ0ZWQgYXQgYW55IHBvc2l0aW9uIHVwIHRvIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3IsIHRodXMKKyAqIGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIHZlY3Rvci4gT2JqZWN0cyBhdCBhbnkgcG9zaXRpb24gaW4gdGhlIHZlY3RvciBtYXkKKyAqIGJlIHJlbW92ZWQsIHRodXMgc2hyaW5raW5nIHRoZSBzaXplIG9mIHRoZSBWZWN0b3IuIE9iamVjdHMgYXQgYW55IHBvc2l0aW9uIGluCisgKiB0aGUgVmVjdG9yIG1heSBiZSByZXBsYWNlZCwgd2hpY2ggZG9lcyBub3QgYWZmZWN0IHRoZSB2ZWN0b3IncyBzaXplLgogICogPHA+Ci0gKiBUaGUgY2FwYWNpdHkgb2YgYSBWZWN0b3IgbWF5IGJlIHNwZWNpZmllZCB3aGVuIHRoZSBWZWN0b3IgaXMgY3JlYXRlZC4gSWYgdGhlCi0gKiBjYXBhY2l0eSBvZiB0aGUgVmVjdG9yIGlzIGV4Y2VlZGVkLCB0aGUgY2FwYWNpdHkgaXMgaW5jcmVhc2VkLCBkb3VibGluZyBieQotICogZGVmYXVsdC4KKyAqIFRoZSBjYXBhY2l0eSBvZiBhIHZlY3RvciBtYXkgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIHZlY3RvciBpcyBjcmVhdGVkLiBJZiB0aGUKKyAqIGNhcGFjaXR5IG9mIHRoZSB2ZWN0b3IgaXMgZXhjZWVkZWQsIHRoZSBjYXBhY2l0eSBpcyBpbmNyZWFzZWQgKGRvdWJsZWQgYnkKKyAqIGRlZmF1bHQpLgogICogCiAgKiBAc2VlIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVmVjdG9yPEU+IGV4dGVuZHMgQWJzdHJhY3RMaXN0PEU+IGltcGxlbWVudHMgTGlzdDxFPiwgUmFuZG9tQWNjZXNzLAogICAgICAgICBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7CkBAIC00Niw0NyArNDcsNjIgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgb3IgdGhlIHNpemUgb2YgdGhlIHZlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGVsZW1lbnRDb3VudDsKIAogICAgIC8qKgogICAgICAqIFRoZSBlbGVtZW50cyBvZiB0aGUgdmVjdG9yLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBPYmplY3RbXSBlbGVtZW50RGF0YTsKIAogICAgIC8qKgogICAgICAqIEhvdyBtYW55IGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdmVjdG9yIHdoZW4gaXQgaXMgZGV0ZWN0ZWQgdGhhdAotICAgICAqIGl0IG5lZWRzIHRvIGdyb3cgdG8gYWNjb21tb2RhdGUgZXh0cmEgZW50cmllcy4KKyAgICAgKiBpdCBuZWVkcyB0byBncm93IHRvIGFjY29tbW9kYXRlIGV4dHJhIGVudHJpZXMuIElmIHRoaXMgdmFsdWUgaXMgemVybyBvcgorICAgICAqIG5lZ2F0aXZlIHRoZSBzaXplIHdpbGwgYmUgZG91YmxlZCBpZiBhbiBpbmNyZWFzZSBpcyBuZWVkZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBjYXBhY2l0eUluY3JlbWVudDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NJWkUgPSAxMDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVmVjdG9yIHVzaW5nIHRoZSBkZWZhdWx0IGNhcGFjaXR5LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgdmVjdG9yIHVzaW5nIHRoZSBkZWZhdWx0IGNhcGFjaXR5LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBWZWN0b3IoKSB7CiAgICAgICAgIHRoaXMoREVGQVVMVF9TSVpFLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFZlY3RvciB1c2luZyB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgdmVjdG9yIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgbmV3IHZlY3RvcgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIG5ldyB2ZWN0b3IuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY2FwYWNpdHl9IGlzIG5lZ2F0aXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBWZWN0b3IoaW50IGNhcGFjaXR5KSB7CiAgICAgICAgIHRoaXMoY2FwYWNpdHksIDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVmVjdG9yIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgYW5kIGNhcGFjaXR5CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB2ZWN0b3IgdXNpbmcgdGhlIHNwZWNpZmllZCBjYXBhY2l0eSBhbmQgY2FwYWNpdHkKICAgICAgKiBpbmNyZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgbmV3IFZlY3RvcgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIG5ldyB2ZWN0b3IuCiAgICAgICogQHBhcmFtIGNhcGFjaXR5SW5jcmVtZW50Ci0gICAgICogICAgICAgICAgICB0aGUgYW1vdW50IHRvIGluY3JlYXNlIHRoZSBjYXBhY2l0eSB3aGVuIHRoaXMgVmVjdG9yIGlzIGZ1bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbW91bnQgdG8gaW5jcmVhc2UgdGhlIGNhcGFjaXR5IHdoZW4gdGhpcyB2ZWN0b3IgaXMgZnVsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjYXBhY2l0eX0gaXMgbmVnYXRpdmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcihpbnQgY2FwYWNpdHksIGludCBjYXBhY2l0eUluY3JlbWVudCkgewogICAgICAgICBlbGVtZW50Q291bnQgPSAwOwpAQCAtOTksMTMgKzExNSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+VmVjdG9yPC9jb2RlPiBjb250YWluaW5nIHRoZQotICAgICAqIGVsZW1lbnRzIGluIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+LiBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQotICAgICAqIG5ldyA8Y29kZT5WZWN0b3I8L2NvZGU+IGlzIGRlcGVuZGVudCBvbiB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mIHRoZSBzZWVkCi0gICAgICogY29sbGVjdGlvbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBWZWN0b3J9IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluCisgICAgICoge0Bjb2RlIGNvbGxlY3Rpb259LiBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBuZXcge0Bjb2RlIFZlY3Rvcn0KKyAgICAgKiBpcyBkZXBlbmRlbnQgb24gdGhlIGl0ZXJhdGlvbiBvcmRlciBvZiB0aGUgc2VlZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyB0byBhZGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVmVjdG9yKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKICAgICAgICAgdGhpcyhjb2xsZWN0aW9uLnNpemUoKSwgMCk7CkBAIC0xMjEsMjEgKzEzNywyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byB0aGlzIFZlY3RvciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiBUaGUKLSAgICAgKiBvYmplY3QgaXMgaW5zZXJ0ZWQgYmVmb3JlIGFueSBwcmV2aW91cyBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCi0gICAgICogSWYgdGhlIGxvY2F0aW9uIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoaXMgVmVjdG9yLCB0aGUgb2JqZWN0IGlzIGFkZGVkCi0gICAgICogYXQgdGhlIGVuZC4KKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhpcyB2ZWN0b3IgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gVGhlCisgICAgICogb2JqZWN0IGlzIGluc2VydGVkIGJlZm9yZSBhbnkgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG9yIGEgaGlnaGVyIGluZGV4CisgICAgICogaW5jcmVhc2luZyB0aGVpciBpbmRleCBieSAxLiBJZiB0aGUgbG9jYXRpb24gaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhpcworICAgICAqIHZlY3RvciwgdGhlIG9iamVjdCBpcyBhZGRlZCBhdCB0aGUgZW5kLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgZWxlbWVudAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgZWxlbWVudC4KICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGluc2VydCBpbiB0aGlzIFZlY3RvcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBpbnNlcnQgaW4gdGhpcyB2ZWN0b3IuCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMCB8fCA+IHNpemUoKTwvY29kZT4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgbG9jYXRpb24gPiBzaXplKCl9LgogICAgICAqIEBzZWUgI2FkZEVsZW1lbnQKICAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkKGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKQEAgLTE0MywxMSArMTU4LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgZW5kIG9mIHRoaXMgVmVjdG9yLgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgdGhlIGVuZCBvZiB0aGlzIHZlY3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgVmVjdG9yCi0gICAgICogQHJldHVybiB0cnVlCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgdmVjdG9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KSB7CkBAIC0xNTYsMTkgKzE3MiwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLSAgICAgKiBpbiB0aGlzIFZlY3Rvci4gVGhlIG9iamVjdHMgYXJlIGluc2VydGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZQotICAgICAqIHJldHVybmVkIGZyb20gdGhlIENvbGxlY3Rpb24gaXRlcmF0b3IuCisgICAgICogSW5zZXJ0cyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbgorICAgICAqIGluIHRoaXMgdmVjdG9yLiBUaGUgb2JqZWN0cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlCisgICAgICogcmV0dXJuZWQgZnJvbSB0aGUgQ29sbGVjdGlvbiBpdGVyYXRvci4gVGhlIGVsZW1lbnRzIHdpdGggYW4gaW5kZXggZXF1YWwKKyAgICAgKiBvciBoaWdoZXIgdGhhbiB7QGNvZGUgbG9jYXRpb259IGhhdmUgdGhlaXIgaW5kZXggaW5jcmVhc2VkIGJ5IHRoZSBzaXplIG9mCisgICAgICogdGhlIGFkZGVkIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gdG8gaW5zZXJ0IHRoZSBvYmplY3RzCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gdG8gaW5zZXJ0IHRoZSBvYmplY3RzLgogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVmVjdG9yIGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB2ZWN0b3IgaXMgbW9kaWZpZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDA8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+bG9jYXRpb24gPiBzaXplKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgd2hlbiB7QGNvZGUgbG9jYXRpb24gPCAwfSBvciB7QGNvZGUgbG9jYXRpb24gPiBzaXplKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRBbGwoaW50IGxvY2F0aW9uLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7CkBAIC0xOTgsMTEgKzIxNSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIHRvIHRoZSBlbmQgb2YgdGhpcyBWZWN0b3IuCisgICAgICogQWRkcyB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGlzIHZlY3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIENvbGxlY3Rpb24gb2Ygb2JqZWN0cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFZlY3RvciBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgdmVjdG9yIGlzIG1vZGlmaWVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKQEAgLTIxMCwxMCArMjI4LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgZW5kIG9mIHRoaXMgVmVjdG9yLgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgdGhlIGVuZCBvZiB0aGlzIHZlY3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgVmVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgdmVjdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRFbGVtZW50KEUgb2JqZWN0KSB7CiAgICAgICAgIGlmIChlbGVtZW50Q291bnQgPT0gZWxlbWVudERhdGEubGVuZ3RoKSB7CkBAIC0yMjQsMjIgKzI0MywyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGlzIFZlY3RvciBjYW4gaG9sZCB3aXRob3V0IGdyb3dpbmcuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoaXMgdmVjdG9yIGNhbiBob2xkIHdpdGhvdXQgZ3Jvd2luZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjYXBhY2l0eSBvZiB0aGlzIFZlY3RvcgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNhcGFjaXR5IG9mIHRoaXMgdmVjdG9yLgogICAgICAqIEBzZWUgI2Vuc3VyZUNhcGFjaXR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGNhcGFjaXR5KCkgewogICAgICAgICByZXR1cm4gZWxlbWVudERhdGEubGVuZ3RoOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBWZWN0b3IsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHZlY3RvciwgbGVhdmluZyBpdCBlbXB0eS4KICAgICAgKiAKICAgICAgKiBAc2VlICNpc0VtcHR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewpAQCAtMjQ3LDEyICsyNjcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvciB3aXRoIHRoZSBzYW1lIGVsZW1lbnRzLCBzaXplLCBjYXBhY2l0eSBhbmQgY2FwYWNpdHkKLSAgICAgKiBpbmNyZW1lbnQgYXMgdGhpcyBWZWN0b3IuCisgICAgICogUmV0dXJucyBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgc2FtZSBlbGVtZW50cywgc2l6ZSwgY2FwYWNpdHkgYW5kIGNhcGFjaXR5CisgICAgICogaW5jcmVtZW50IGFzIHRoaXMgdmVjdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBWZWN0b3IKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgdmVjdG9yLgogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtMjY3LDE1ICsyODcsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGlzIFZlY3RvciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogU2VhcmNoZXMgdGhpcyB2ZWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gbG9vayBmb3IgaW4gdGhpcyBWZWN0b3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqZWN0IGlzIGFuIGVsZW1lbnQgb2YgdGhpcyBWZWN0b3IsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBsb29rIGZvciBpbiB0aGlzIHZlY3Rvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvYmplY3QgaXMgYW4gZWxlbWVudCBvZiB0aGlzIHZlY3RvciwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2luZGV4T2YoT2JqZWN0KQogICAgICAqIEBzZWUgI2luZGV4T2YoT2JqZWN0LCBpbnQpCiAgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKQEAgLTI4MywxMiArMzA0LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBWZWN0b3IgZm9yIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKiBTZWFyY2hlcyB0aGlzIHZlY3RvciBmb3IgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBhcmUgZWxlbWVudHMgb2YKLSAgICAgKiAgICAgICAgIHRoaXMgVmVjdG9yLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFyZQorICAgICAqICAgICAgICAgZWxlbWVudHMgb2YgdGhpcyB2ZWN0b3IsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKQEAgLTI5NiwzMCArMzE4LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gY29weSBlbGVtZW50cyBjb250YWluZWQgYnkgdGhpcyA8Y29kZT5WZWN0b3I8L2NvZGU+IGludG8KLSAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGUgc3VwcGxpZWQgPGNvZGU+T2JqZWN0PC9jb2RlPiBhcnJheS4KKyAgICAgKiBBdHRlbXB0cyB0byBjb3B5IGVsZW1lbnRzIGNvbnRhaW5lZCBieSB0aGlzIHtAY29kZSBWZWN0b3J9IGludG8gdGhlCisgICAgICogY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGUgc3VwcGxpZWQge0Bjb2RlIE9iamVjdH0gYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGVsZW1lbnRzCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiBhcnJheSBpbnRvIHdoaWNoIHRoZSBlbGVtZW50cyBvZgotICAgICAqICAgICAgICAgICAgdGhpcyBWZWN0b3IgYXJlIGNvcGllZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3R9IGFycmF5IGludG8gd2hpY2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHZlY3RvciBhcmUgY29waWVkLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbGVtZW50c30gaXMgbm90IGJpZyBlbm91Z2guCiAgICAgICogQHNlZSAjY2xvbmUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29weUludG8oT2JqZWN0W10gZWxlbWVudHMpIHsKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShlbGVtZW50RGF0YSwgMCwgZWxlbWVudHMsIDAsIGVsZW1lbnRDb3VudCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoaXMgVmVjdG9yLgorICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIHZlY3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4gaW4gdGhpcyBWZWN0b3IKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4gaW4gdGhpcyB2ZWN0b3IuCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSBzaXplKCl9LgogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIEUgZWxlbWVudEF0KGludCBsb2NhdGlvbikgewogICAgICAgICBpZiAobG9jYXRpb24gPCBlbGVtZW50Q291bnQpIHsKQEAgLTMyOSwxMyArMzUyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBvbiB0aGUgZWxlbWVudHMgb2YgdGhpcyBWZWN0b3IuIFRoZSByZXN1bHRzIG9mIHRoZQotICAgICAqIEVudW1lcmF0aW9uIG1heSBiZSBhZmZlY3RlZCBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBWZWN0b3IgYXJlIG1vZGlmaWVkLgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgdmVjdG9yLiBUaGUgcmVzdWx0cyBvZiB0aGUKKyAgICAgKiBlbnVtZXJhdGlvbiBtYXkgYmUgYWZmZWN0ZWQgaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdmVjdG9yIGlzIG1vZGlmaWVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gRW51bWVyYXRpb24gb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgVmVjdG9yCi0gICAgICogCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgZWxlbWVudHMgb2YgdGhpcyB2ZWN0b3IuCiAgICAgICogQHNlZSAjZWxlbWVudEF0CiAgICAgICogQHNlZSBFbnVtZXJhdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxFPiBlbGVtZW50cygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdGlvbjxFPigpIHsKQEAgLTM1OSwxNCArMzgyLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IHRoaXMgVmVjdG9yIGNhbiBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICogRW5zdXJlcyB0aGF0IHRoaXMgdmVjdG9yIGNhbiBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzCiAgICAgICogd2l0aG91dCBncm93aW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtaW5pbXVtQ2FwYWNpdHkKICAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHRoaXMgdmVjdG9yIHdpbGwgaG9sZAotICAgICAqICAgICAgICAgICAgYmVmb3JlIGdyb3dpbmcKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIGJlZm9yZSBncm93aW5nLgogICAgICAqIEBzZWUgI2NhcGFjaXR5CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBtaW5pbXVtQ2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxlbmd0aCA8IG1pbmltdW1DYXBhY2l0eSkgewpAQCAtMzc4LDE2ICs0MDEsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIFZlY3RvciBhbmQgYW5zd2VyIGlmIHRoZXkgYXJlCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyB2ZWN0b3IgYW5kIHJldHVybnMgaWYgdGhleSBhcmUKICAgICAgKiBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGEgTGlzdCB3aGljaCBjb250YWlucyB0aGUgc2FtZSBvYmplY3RzIGluIHRoZQogICAgICAqIHNhbWUgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAogICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBWZWN0b3IsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHZlY3RvciwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC00MTQsMTYgKzQzNywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhpcyBWZWN0b3IuCisgICAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGlzIHZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBmaXJzdCBwb3NpdGlvbgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgogICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhpcyB2ZWN0b3IgaXMgZW1wdHkKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoaXMgdmVjdG9yIGlzIGVtcHR5LgogICAgICAqIEBzZWUgI2VsZW1lbnRBdAogICAgICAqIEBzZWUgI2xhc3RFbGVtZW50CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRSBmaXJzdEVsZW1lbnQoKSB7CiAgICAgICAgIGlmIChlbGVtZW50Q291bnQgPiAwKSB7CkBAIC00MzMsMTYgKzQ1NSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIFZlY3Rvci4KKyAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyB2ZWN0b3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuIGluIHRoaXMgVmVjdG9yCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuIGluIHRoaXMgdmVjdG9yLgorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID49IHNpemUoKTwvY29kZT4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBsb2NhdGlvbiA8IDAgfHwgbG9jYXRpb24gPj0gc2l6ZSgpfS4KICAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBFIGdldChpbnQgbG9jYXRpb24pIHsKQEAgLTQ5NywxMSArNTE4LDExIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaC4KICAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKQEAgLTUxNCwxOCArNTM1LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgaW4gdGhpcyBWZWN0b3IgZm9yIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhlIHNlYXJjaAorICAgICAqIFNlYXJjaGVzIGluIHRoaXMgdmVjdG9yIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoZSBzZWFyY2gKICAgICAgKiBmb3IgdGhlIG9iamVjdCBzdGFydHMgYXQgdGhlIGJlZ2lubmluZyBhbmQgbW92ZXMgdG93YXJkcyB0aGUgZW5kIG9mIHRoaXMKLSAgICAgKiBWZWN0b3IuCisgICAgICogdmVjdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZmluZCBpbiB0aGlzIFZlY3RvcgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgVmVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgLTEgaWYgdGhlCi0gICAgICogICAgICAgICBlbGVtZW50IGlzbid0IGZvdW5kCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZpbmQgaW4gdGhpcyB2ZWN0b3IuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyB2ZWN0b3Igb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50LCAtMSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGVsZW1lbnQgaXNuJ3QgZm91bmQuCiAgICAgICogQHNlZSAjY29udGFpbnMKICAgICAgKiBAc2VlICNsYXN0SW5kZXhPZihPYmplY3QpCiAgICAgICogQHNlZSAjbGFzdEluZGV4T2YoT2JqZWN0LCBpbnQpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKQEAgLTUzMywyMyArNTU0LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgaW4gdGhpcyBWZWN0b3IgZm9yIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhlIHNlYXJjaAorICAgICAqIFNlYXJjaGVzIGluIHRoaXMgdmVjdG9yIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoZSBzZWFyY2gKICAgICAgKiBmb3IgdGhlIG9iamVjdCBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBhbmQgbW92ZXMgdG93YXJkcyB0aGUgZW5kCi0gICAgICogb2YgdGhpcyBWZWN0b3IuCisgICAgICogb2YgdGhpcyB2ZWN0b3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmaW5kIGluIHRoaXMgVmVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZpbmQgaW4gdGhpcyB2ZWN0b3IuCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgc2VhcmNoaW5nCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyBWZWN0b3Igb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50LCAtMSBpZiB0aGUKLSAgICAgKiAgICAgICAgIGVsZW1lbnQgaXNuJ3QgZm91bmQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCBzZWFyY2hpbmcuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyB2ZWN0b3Igb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50LCAtMSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGVsZW1lbnQgaXNuJ3QgZm91bmQuCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMDwvY29kZT4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBsb2NhdGlvbiA8IDB9LgogICAgICAqIEBzZWUgI2NvbnRhaW5zCiAgICAgICogQHNlZSAjbGFzdEluZGV4T2YoT2JqZWN0KQogICAgICAqIEBzZWUgI2xhc3RJbmRleE9mKE9iamVjdCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCwgaW50IGxvY2F0aW9uKSB7CiAgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgewpAQCAtNTY5LDIxICs1ODksMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhpcyBWZWN0b3IgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gdGhpcyB2ZWN0b3IgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KICAgICAgKiBUaGlzIG9iamVjdCBpcyBpbnNlcnRlZCBiZWZvcmUgYW55IHByZXZpb3VzIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZAotICAgICAqIGxvY2F0aW9uLiBJZiB0aGUgbG9jYXRpb24gaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhpcyBWZWN0b3IsIHRoZSBvYmplY3QKLSAgICAgKiBpcyBhZGRlZCBhdCB0aGUgZW5kLgorICAgICAqIGxvY2F0aW9uLiBBbGwgZWxlbWVudHMgd2l0aCBhbiBpbmRleCBlcXVhbCBvciBncmVhdGVyIHRoYW4KKyAgICAgKiB7QGNvZGUgbG9jYXRpb259IGhhdmUgdGhlaXIgaW5kZXggaW5jcmVhc2VkIGJ5IDEuIElmIHRoZSBsb2NhdGlvbiBpcworICAgICAqIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoaXMgdmVjdG9yLCB0aGUgb2JqZWN0IGlzIGFkZGVkIGF0IHRoZSBlbmQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBpbnNlcnQgaW4gdGhpcyBWZWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gaW5zZXJ0IGluIHRoaXMgdmVjdG9yLgogICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgZWxlbWVudAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgZWxlbWVudC4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPCAwIHx8ID4gc2l6ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+IHNpemUoKX0uCiAgICAgICogQHNlZSAjYWRkRWxlbWVudAogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zZXJ0RWxlbWVudEF0KEUgb2JqZWN0LCBpbnQgbG9jYXRpb24pIHsKICAgICAgICAgaWYgKDAgPD0gbG9jYXRpb24gJiYgbG9jYXRpb24gPD0gZWxlbWVudENvdW50KSB7CkBAIC02MDQsMTEgKzYyNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBWZWN0b3IgaGFzIG5vIGVsZW1lbnRzLCBhIHNpemUgb2YgemVyby4KKyAgICAgKiBSZXR1cm5zIGlmIHRoaXMgdmVjdG9yIGhhcyBubyBlbGVtZW50cywgYSBzaXplIG9mIHplcm8uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVmVjdG9yIGhhcyBubyBlbGVtZW50cywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB2ZWN0b3IgaGFzIG5vIGVsZW1lbnRzLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0VtcHR5KCkgewpAQCAtNjE2LDE2ICs2MzcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhpcyBWZWN0b3IuCisgICAgICogUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IGluIHRoaXMgdmVjdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIGxhc3QgcG9zaXRpb24KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBsYXN0IHBvc2l0aW9uLgogICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhpcyB2ZWN0b3IgaXMgZW1wdHkKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoaXMgdmVjdG9yIGlzIGVtcHR5LgogICAgICAqIEBzZWUgI2VsZW1lbnRBdAogICAgICAqIEBzZWUgI2ZpcnN0RWxlbWVudAogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIEUgbGFzdEVsZW1lbnQoKSB7CiAgICAgICAgIHRyeSB7CkBAIC02MzYsMTggKzY1NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGluIHRoaXMgVmVjdG9yIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoZSBzZWFyY2gKKyAgICAgKiBTZWFyY2hlcyBpbiB0aGlzIHZlY3RvciBmb3IgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiBUaGUgc2VhcmNoCiAgICAgICogZm9yIHRoZSBvYmplY3Qgc3RhcnRzIGF0IHRoZSBlbmQgYW5kIG1vdmVzIHRvd2FyZHMgdGhlIHN0YXJ0IG9mIHRoaXMKLSAgICAgKiBWZWN0b3IuCisgICAgICogdmVjdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZmluZCBpbiB0aGlzIFZlY3RvcgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgVmVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgLTEgaWYgdGhlCi0gICAgICogICAgICAgICBlbGVtZW50IGlzbid0IGZvdW5kCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZpbmQgaW4gdGhpcyB2ZWN0b3IuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyB2ZWN0b3Igb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50LCAtMSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGVsZW1lbnQgaXNuJ3QgZm91bmQuCiAgICAgICogQHNlZSAjY29udGFpbnMKICAgICAgKiBAc2VlICNpbmRleE9mKE9iamVjdCkKICAgICAgKiBAc2VlICNpbmRleE9mKE9iamVjdCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QpIHsKQEAgLTY1NSwyMyArNjc1LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgaW4gdGhpcyBWZWN0b3IgZm9yIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhlIHNlYXJjaAorICAgICAqIFNlYXJjaGVzIGluIHRoaXMgdmVjdG9yIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoZSBzZWFyY2gKICAgICAgKiBmb3IgdGhlIG9iamVjdCBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBhbmQgbW92ZXMgdG93YXJkcyB0aGUKLSAgICAgKiBzdGFydCBvZiB0aGlzIFZlY3Rvci4KKyAgICAgKiBzdGFydCBvZiB0aGlzIHZlY3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZpbmQgaW4gdGhpcyBWZWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZmluZCBpbiB0aGlzIHZlY3Rvci4KICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBzdGFydCBzZWFyY2hpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIFZlY3RvciBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsIC0xIGlmIHRoZQotICAgICAqICAgICAgICAgZWxlbWVudCBpc24ndCBmb3VuZAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbiB0aGlzIHZlY3RvciBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsIC0xIGlmIHRoZQorICAgICAqICAgICAgICAgZWxlbWVudCBpc24ndCBmb3VuZC4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gPGNvZGU+bG9jYXRpb24gPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uID49IHNpemUoKX0uCiAgICAgICogQHNlZSAjY29udGFpbnMKICAgICAgKiBAc2VlICNpbmRleE9mKE9iamVjdCkKICAgICAgKiBAc2VlICNpbmRleE9mKE9iamVjdCwgaW50KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QsIGludCBsb2NhdGlvbikgewogICAgICAgICBpZiAobG9jYXRpb24gPCBlbGVtZW50Q291bnQpIHsKQEAgLTY5MywxMCArNzEyLDE3IEBACiAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24obG9jYXRpb24pOwogICAgIH0KIAotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGZyb20gdGhpcyB2ZWN0b3IuIEFsbAorICAgICAqIGVsZW1lbnRzIHdpdGggYW4gaW5kZXggYmlnZ2VyIHRoYW4ge0Bjb2RlIGxvY2F0aW9ufSBoYXZlIHRoZWlyIGluZGV4CisgICAgICogZGVjcmVhc2VkIGJ5IDEuCiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmUoaW50KQorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0LgorICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSBzaXplKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRSByZW1vdmUoaW50IGxvY2F0aW9uKSB7CkBAIC03MTcsMTUgKzc0MywxOCBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSwgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBhbmQgbW92aW5nCi0gICAgICogdG93YXJkcyB0aGUgZW5kLCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMgVmVjdG9yLgorICAgICAqIHRvd2FyZHMgdGhlIGVuZCwgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGlzIHZlY3Rvci4gQWxsIGVsZW1lbnRzCisgICAgICogd2l0aCBhbiBpbmRleCBiaWdnZXIgdGhhbiB0aGUgZWxlbWVudCB0aGF0IGdldHMgcmVtb3ZlZCBoYXZlIHRoZWlyIGluZGV4CisgICAgICogZGVjcmVhc2VkIGJ5IDEuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGlzIFZlY3RvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGlzIHZlY3Rvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCB3YXMgZm91bmQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNyZW1vdmVBbGxFbGVtZW50cwogICAgICAqIEBzZWUgI3JlbW92ZUVsZW1lbnRBdAogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewpAQCAtNzMzLDEyICs3NjIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBpbiB0aGlzIFZlY3RvciBvZiBlYWNoIG9iamVjdCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgaW4gdGhpcyB2ZWN0b3Igb2YgZWFjaCBvYmplY3QgaW4gdGhlIHNwZWNpZmllZAogICAgICAqIENvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVmVjdG9yIGlzIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgdmVjdG9yIGlzIG1vZGlmaWVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNyZW1vdmUoT2JqZWN0KQorICAgICAqIEBzZWUgI2NvbnRhaW5zKE9iamVjdCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewpAQCAtNzQ2LDExICs3NzgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgVmVjdG9yLCBsZWF2aW5nIHRoZSBzaXplIHplcm8gYW5kIHRoZQorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyB2ZWN0b3IsIGxlYXZpbmcgdGhlIHNpemUgemVybyBhbmQgdGhlCiAgICAgICogY2FwYWNpdHkgdW5jaGFuZ2VkLgogICAgICAqIAogICAgICAqIEBzZWUgI2lzRW1wdHkKICAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFsbEVsZW1lbnRzKCkgewogICAgICAgICBBcnJheXMuZmlsbChlbGVtZW50RGF0YSwgMCwgZWxlbWVudENvdW50LCBudWxsKTsKQEAgLTc2MCwxNSArNzkzLDE4IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlLCBzdGFydGluZyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBtb3ZpbmcKLSAgICAgKiB0b3dhcmRzIHRoZSBlbmQsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhpcyBWZWN0b3IuCisgICAgICogdG93YXJkcyB0aGUgZW5kLCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMgdmVjdG9yLiBBbGwgZWxlbWVudHMKKyAgICAgKiB3aXRoIGFuIGluZGV4IGJpZ2dlciB0aGFuIHRoZSBlbGVtZW50IHRoYXQgZ2V0cyByZW1vdmVkIGhhdmUgdGhlaXIgaW5kZXgKKyAgICAgKiBkZWNyZWFzZWQgYnkgMS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgVmVjdG9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdhcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgdmVjdG9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdhcyBmb3VuZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI3JlbW92ZUFsbEVsZW1lbnRzCiAgICAgICogQHNlZSAjcmVtb3ZlRWxlbWVudEF0CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVFbGVtZW50KE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgaW50IGluZGV4OwpAQCAtNzgwLDE4ICs4MTYsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50IGZvdW5kIGF0IGluZGV4IHBvc2l0aW9uIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBmcm9tCi0gICAgICogdGhpcyA8Y29kZT5WZWN0b3I8L2NvZGU+IGFuZCBkZWNyZW1lbnRzIHRoZSBzaXplIGFjY29yZGluZ2x5LgorICAgICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQgZm91bmQgYXQgaW5kZXggcG9zaXRpb24ge0Bjb2RlIGxvY2F0aW9ufSBmcm9tCisgICAgICogdGhpcyB7QGNvZGUgVmVjdG9yfS4gQWxsIGVsZW1lbnRzIHdpdGggYW4gaW5kZXggYmlnZ2VyIHRoYW4KKyAgICAgKiB7QGNvZGUgbG9jYXRpb259IGhhdmUgdGhlaXIgaW5kZXggZGVjcmVhc2VkIGJ5IDEuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlLgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSBzaXplKCl9LgogICAgICAqIEBzZWUgI3JlbW92ZUVsZW1lbnQKICAgICAgKiBAc2VlICNyZW1vdmVBbGxFbGVtZW50cwogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlRWxlbWVudEF0KGludCBsb2NhdGlvbikgewogICAgICAgICBpZiAoMCA8PSBsb2NhdGlvbiAmJiBsb2NhdGlvbiA8IGVsZW1lbnRDb3VudCkgewpAQCAtODEwLDE2ICs4NDYsMTcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSBmcm9tIHRoZSBzdGFydCB0byB0aGUsIGJ1dCBub3QKLSAgICAgKiBpbmNsdWRpbmcsIGVuZCBpbmRleC4KKyAgICAgKiBpbmNsdWRpbmcsIGVuZCBpbmRleC4gQWxsIGVsZW1lbnRzIHdpdGggYW4gaW5kZXggYmlnZ2VyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiB7QGNvZGUgZW5kfSBoYXZlIHRoZWlyIGluZGV4IGRlY3JlYXNlZCBieSB7QGNvZGUgZW5kIC0gc3RhcnR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbW92aW5nCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgcmVtb3ZpbmcuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIHJlbW92ZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIHJlbW92ZS4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMCwgc3RhcnQgPiBlbmQ8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+ZW5kID4gc2l6ZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIHN0YXJ0IDwgMCwgc3RhcnQgPiBlbmR9IG9yCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIGVuZCA+IHNpemUoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CkBAIC04NDQsMTIgKzg4MSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIFZlY3RvciB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBDb2xsZWN0aW9uLgorICAgICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIHZlY3RvciB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZQorICAgICAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgQ29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJldGFpbgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFZlY3RvciBpcyBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHJldGFpbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHZlY3RvciBpcyBtb2RpZmllZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSAjcmVtb3ZlKE9iamVjdCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewpAQCAtODU3LDE5ICs4OTYsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoaXMgVmVjdG9yIHdpdGggdGhlCisgICAgICogUmVwbGFjZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIHZlY3RvciB3aXRoIHRoZQogICAgICAqIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gcHV0IHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkIHRvIHRoaXMgVmVjdG9yCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCBhdCB0aGUgbG9jYXRpb24KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkIHRvIHRoaXMgdmVjdG9yLgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQgYXQgdGhlIGxvY2F0aW9uLgogICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiA8Y29kZT5sb2NhdGlvbiA8IDAgfHwgPj0gc2l6ZSgpPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgICAgIHdoZW4ge0Bjb2RlIGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSBzaXplKCl9LgogICAgICAqIEBzZWUgI3NpemUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEUgc2V0KGludCBsb2NhdGlvbiwgRSBvYmplY3QpIHsKQEAgLTg4MiwxOCArOTIwLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGlzIFZlY3RvciB3aXRoIHRoZQorICAgICAqIFJlcGxhY2VzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhpcyB2ZWN0b3Igd2l0aCB0aGUKICAgICAgKiBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRkIHRvIHRoaXMgVmVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGlzIHZlY3Rvci4KICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBwdXQgdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBwdXQgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPmxvY2F0aW9uIDwgMCB8fCA+PSBzaXplKCk8L2NvZGU+Ci0gICAgICogCisgICAgICogICAgICAgICAgICAgICAgd2hlbiB7QGNvZGUgbG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID49IHNpemUoKX0uCiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFbGVtZW50QXQoRSBvYmplY3QsIGludCBsb2NhdGlvbikgewogICAgICAgICBpZiAobG9jYXRpb24gPCBlbGVtZW50Q291bnQpIHsKQEAgLTkwNCwxNSArOTQxLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIFZlY3RvciB0byB0aGUgc3BlY2lmaWVkIHNpemUuIElmIHRoZXJlIGFyZSBtb3JlCi0gICAgICogdGhhbiBsZW5ndGggZWxlbWVudHMgaW4gdGhpcyBWZWN0b3IsIHRoZSBlbGVtZW50cyBhdCBlbmQgYXJlIGxvc3QuIElmCi0gICAgICogdGhlcmUgYXJlIGxlc3MgdGhhbiBsZW5ndGggZWxlbWVudHMgaW4gdGhlIFZlY3RvciwgdGhlIGFkZGl0aW9uYWwKKyAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoaXMgdmVjdG9yIHRvIHRoZSBzcGVjaWZpZWQgc2l6ZS4gSWYgdGhlcmUgYXJlIG1vcmUKKyAgICAgKiB0aGFuIGxlbmd0aCBlbGVtZW50cyBpbiB0aGlzIHZlY3RvciwgdGhlIGVsZW1lbnRzIGF0IGVuZCBhcmUgbG9zdC4gSWYKKyAgICAgKiB0aGVyZSBhcmUgbGVzcyB0aGFuIGxlbmd0aCBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLCB0aGUgYWRkaXRpb25hbAogICAgICAqIGVsZW1lbnRzIGNvbnRhaW4gbnVsbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHNpemUgb2YgdGhpcyBWZWN0b3IKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc2l6ZSBvZiB0aGlzIHZlY3Rvci4KICAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNpemUoaW50IGxlbmd0aCkgewogICAgICAgICBpZiAobGVuZ3RoID09IGVsZW1lbnRDb3VudCkgewpAQCAtOTI3LDEyICs5NjQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBWZWN0b3IuCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgdmVjdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIFZlY3RvcgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHZlY3Rvci4KICAgICAgKiBAc2VlICNlbGVtZW50Q291bnQKICAgICAgKiBAc2VlICNsYXN0RWxlbWVudAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CkBAIC05NDAsMTkgKzk3NywyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIFZlY3RvciBmcm9tIHRoZSBzdGFydAorICAgICAqIFJldHVybnMgYSBMaXN0IG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGlzIHZlY3RvciBmcm9tIHRoZSBzdGFydAogICAgICAqIGluZGV4IHRvIG9uZSBsZXNzIHRoYW4gdGhlIGVuZCBpbmRleC4gVGhlIHJldHVybmVkIExpc3QgaXMgYmFja2VkIGJ5IHRoaXMKLSAgICAgKiBWZWN0b3Igc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCisgICAgICogdmVjdG9yIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQgYnkgdGhlIG90aGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBzdWJsaXN0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHN1Ymxpc3QuCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIHN1Ymxpc3QKLSAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiBhIHBvcnRpb24gb2YgdGhpcyBWZWN0b3IKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdWJsaXN0LgorICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIGEgcG9ydGlvbiBvZiB0aGlzIHZlY3Rvci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0YXJ0IDwgMCBvciA8Y29kZT5lbmQgPiBzaXplKCk8L2NvZGU+Ci0gICAgICogQGV4Y2VwdGlvbiAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiA8Y29kZT5zdGFydCA+IGVuZDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBlbmQgPiBzaXplKCl9LgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgd2hlbiB7QGNvZGUgc3RhcnQgPiBlbmR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxFPiBzdWJMaXN0KGludCBzdGFydCwgaW50IGVuZCkgewpAQCAtOTYxLDkgKzk5OSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMgVmVjdG9yLgorICAgICAqIFJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMgdmVjdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBWZWN0b3IKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgdmVjdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0W10gdG9BcnJheSgpIHsKQEAgLTk3MywxOSArMTAxMiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoaXMgVmVjdG9yLiBJZiB0aGUKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIHZlY3Rvci4gSWYgdGhlCiAgICAgICogc3BlY2lmaWVkIGFycmF5IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbGVtZW50cywgdGhlIHNwZWNpZmllZCBhcnJheQogICAgICAqIGlzIHVzZWQsIG90aGVyd2lzZSBhbiBhcnJheSBvZiB0aGUgc2FtZSB0eXBlIGlzIGNyZWF0ZWQuIElmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBhcnJheSBpcyB1c2VkIGFuZCBpcyBsYXJnZXIgdGhhbiB0aGlzIFZlY3RvciwgdGhlIGFycmF5IGVsZW1lbnQgZm9sbG93aW5nCisgICAgICogYXJyYXkgaXMgdXNlZCBhbmQgaXMgbGFyZ2VyIHRoYW4gdGhpcyB2ZWN0b3IsIHRoZSBhcnJheSBlbGVtZW50IGZvbGxvd2luZwogICAgICAqIHRoZSBjb2xsZWN0aW9uIGVsZW1lbnRzIGlzIHNldCB0byBudWxsLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb250ZW50cwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5Ci0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIFZlY3RvcgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRvIGZpbGwuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHZlY3Rvci4KICAgICAgKiBAZXhjZXB0aW9uIEFycmF5U3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyBWZWN0b3IgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhpcyB2ZWN0b3IgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC0xMDAyLDExICsxMDQxLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVmVjdG9yLgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBWZWN0b3IKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3IuCiAgICAgICogQHNlZSAjZWxlbWVudHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTEwMzQsMTEgKzEwNzMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjYXBhY2l0eSBvZiB0aGlzIFZlY3RvciB0byBiZSB0aGUgc2FtZSBhcyB0aGUgc2l6ZS4KKyAgICAgKiBTZXRzIHRoZSBjYXBhY2l0eSBvZiB0aGlzIHZlY3RvciB0byBiZSB0aGUgc2FtZSBhcyB0aGUgc2l6ZS4KICAgICAgKiAKICAgICAgKiBAc2VlICNjYXBhY2l0eQogICAgICAqIEBzZWUgI2Vuc3VyZUNhcGFjaXR5CiAgICAgICogQHNlZSAjc2l6ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB0cmltVG9TaXplKCkgewogICAgICAgICBpZiAoZWxlbWVudERhdGEubGVuZ3RoICE9IGVsZW1lbnRDb3VudCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9XZWFrSGFzaE1hcC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9XZWFrSGFzaE1hcC5qYXZhCmluZGV4IGVlNzI3YWQuLmUwMjI4ZTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvV2Vha0hhc2hNYXAuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1dlYWtIYXNoTWFwLmphdmEKQEAgLTIxLDE0ICsyMSwxNSBAQAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIAogLyoqCi0gKiBXZWFrSGFzaE1hcCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNYXAgd2l0aCBrZXlzIHdoaWNoIGFyZSBXZWFrUmVmZXJlbmNlcy4KLSAqIFRoZSBrZXkvdmFsdWUgbWFwcGluZyBpcyByZW1vdmVkIHdoZW4gdGhlIGtleSBpcyBubyBsb25nZXIgcmVmZXJlbmNlZC4gQWxsCi0gKiBvcHRpb25hbCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQsIGFkZGluZyBhbmQgcmVtb3ZpbmcuIEtleXMgYW5kIHZhbHVlcyBjYW4KLSAqIGJlIGFueSBvYmplY3RzLgorICogV2Vha0hhc2hNYXAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgTWFwIHdpdGgga2V5cyB3aGljaCBhcmUgV2Vha1JlZmVyZW5jZXMuIEEKKyAqIGtleS92YWx1ZSBtYXBwaW5nIGlzIHJlbW92ZWQgd2hlbiB0aGUga2V5IGlzIG5vIGxvbmdlciByZWZlcmVuY2VkLiBBbGwKKyAqIG9wdGlvbmFsIG9wZXJhdGlvbnMgKGFkZGluZyBhbmQgcmVtb3ZpbmcpIGFyZSBzdXBwb3J0ZWQuIEtleXMgYW5kIHZhbHVlcyBjYW4KKyAqIGJlIGFueSBvYmplY3RzLiBOb3RlIHRoYXQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGFjdHMgc2ltaWxhciB0byBhIHNlY29uZAorICogdGhyZWFkIG9uIHRoaXMgY29sbGVjdGlvbiwgcG9zc2libHkgcmVtb3Zpbmcga2V5cy4KICAqIAotICogQHNpbmNlIDEuMgogICogQHNlZSBIYXNoTWFwCiAgKiBAc2VlIFdlYWtSZWZlcmVuY2UKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgV2Vha0hhc2hNYXA8SywgVj4gZXh0ZW5kcyBBYnN0cmFjdE1hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAKQEAgLTE4MSwyMCArMTgyLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiBXZWFrSGFzaE1hcC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IHtAY29kZSBXZWFrSGFzaE1hcH0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFdlYWtIYXNoTWFwKCkgewogICAgICAgICB0aGlzKERFRkFVTFRfU0laRSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBXZWFrSGFzaE1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgV2Vha0hhc2hNYXB9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGNhcGFjaXR5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjYXBhY2l0eQotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhpcyBXZWFrSGFzaE1hcAotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHplcm8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgbWFwLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBXZWFrSGFzaE1hcChpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5ID49IDApIHsKQEAgLTIwOSwxNyArMjEzLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBXZWFrSGFzaE1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgYW5kCi0gICAgICogbG9hZCBmYWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgV2Vha0hhc2hNYXB9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eQorICAgICAqIGFuZCBsb2FkIGZhY3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGNhcGFjaXR5CisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGlzIG1hcC4KICAgICAgKiBAcGFyYW0gbG9hZEZhY3RvcgotICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgbG9hZCBmYWN0b3IKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB6ZXJvIG9yIHRoZSBsb2FkIGZhY3RvciBpcwotICAgICAqICAgICAgICAgICAgICAgIGxlc3Mgb3IgZXF1YWwgdG8gemVybworICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgbG9hZCBmYWN0b3IuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHplcm8gb3IgdGhlIGxvYWQgZmFjdG9yIGlzIGxlc3MKKyAgICAgKiAgICAgICAgICAgICBvciBlcXVhbCB0byB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBXZWFrSGFzaE1hcChpbnQgY2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5ID49IDAgJiYgbG9hZEZhY3RvciA+IDApIHsKQEAgLTIzNCwxMSArMjM4LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBIYXNoTWFwIGNvbnRhaW5pbmcgdGhlIG1hcHBpbmdzIGZyb20gdGhlCi0gICAgICogc3BlY2lmaWVkIE1hcC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBXZWFrSGFzaE1hcH0gaW5zdGFuY2UgY29udGFpbmluZyB0aGUgbWFwcGluZ3MKKyAgICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXBwaW5ncyB0byBhZGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXBwaW5ncyB0byBhZGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFdlYWtIYXNoTWFwKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgewogICAgICAgICB0aGlzKG1hcC5zaXplKCkgPCA2ID8gMTEgOiBtYXAuc2l6ZSgpICogMik7CkBAIC0yNDYsMTAgKzI1MSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBXZWFrSGFzaE1hcCwgbGVhdmluZyBpdCBlbXB0eS4KKyAgICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgbWFwLCBsZWF2aW5nIGl0IGVtcHR5LgogICAgICAqIAotICAgICAqIEBzZWUgI2lzRW1wdHkKLSAgICAgKiBAc2VlICNzaXplCisgICAgICogQHNlZSAjaXNFbXB0eSgpCisgICAgICogQHNlZSAjc2l6ZSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CkBAIC0yNjgsMTIgKzI3NCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoaXMgV2Vha0hhc2hNYXAgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+a2V5PC9jb2RlPiBpcyBhIGtleSBvZiB0aGlzIFdlYWtIYXNoTWFwLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXksCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CkBAIC0yODEsMTIgKzI4OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTZXQgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIFdlYWtIYXNoTWFwLiBFYWNoIGVsZW1lbnQKLSAgICAgKiBpbiB0aGUgc2V0IGlzIGEgTWFwLkVudHJ5LiBUaGUgc2V0IGlzIGJhY2tlZCBieSB0aGlzIFdlYWtIYXNoTWFwIHNvCi0gICAgICogY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuIFRoZSBzZXQgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqIGFkZGluZy4KKyAgICAgKiBSZXR1cm5zIGEgc2V0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4gRWFjaCBtYXBwaW5nIGlzCisgICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1hcC5FbnRyeX0uIEFzIHRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgbWFwLAorICAgICAqIGNoYW5nZXMgaW4gb25lIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBvdGhlci4gSXQgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcKKyAgICAgKiBvcGVyYXRpb25zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTZXQgb2YgdGhlIG1hcHBpbmdzCisgICAgICogQHJldHVybiBhIHNldCBvZiB0aGUgbWFwcGluZ3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxNYXAuRW50cnk8SywgVj4+IGVudHJ5U2V0KCkgewpAQCAtMzQwLDExICszNDgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIFdlYWtIYXNoTWFwLiBUaGUgc2V0IGlzCi0gICAgICogYmFja2VkIGJ5IHRoaXMgV2Vha0hhc2hNYXAgc28gY2hhbmdlcyB0byBvbmUgYXJlIHJlZmxlY3RlZCBieSB0aGUgb3RoZXIuCi0gICAgICogVGhlIHNldCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy4KKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gVGhlIHNldCBpcyBiYWNrZWQgYnkKKyAgICAgKiB0aGlzIG1hcCBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlIHNldCBkb2VzIG5vdAorICAgICAqIHN1cHBvcnQgYWRkaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTZXQgb2YgdGhlIGtleXMKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIHRoZSBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgewpAQCAtMzg5LDExICszOTgsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIFdlYWtIYXNoTWFwLiBUaGUKLSAgICAgKiBjb2xsZWN0aW9uIGlzIGJhY2tlZCBieSB0aGlzIFdlYWtIYXNoTWFwIHNvIGNoYW5nZXMgdG8gb25lIGFyZSByZWZsZWN0ZWQKLSAgICAgKiBieSB0aGUgb3RoZXIuIFRoZSBjb2xsZWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nLgorICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLiBUaGUgY29sbGVjdGlvbgorICAgICAqIGlzIGJhY2tlZCBieSB0aGlzIG1hcCBzbyBjaGFuZ2VzIHRvIG9uZSBhcmUgcmVmbGVjdGVkIGJ5IHRoZSBvdGhlci4gVGhlCisgICAgICogY29sbGVjdGlvbiBzdXBwb3J0cyByZW1vdmUsIHJlbW92ZUFsbCwgcmV0YWluQWxsIGFuZCBjbGVhciBvcGVyYXRpb25zLAorICAgICAqIGFuZCBpdCBkb2VzIG5vdCBzdXBwb3J0IGFkZCBvciBhZGRBbGwgb3BlcmF0aW9ucy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgY29sbGVjdGlvbiB3aGljaCBpcyB0aGUgc3ViY2xhc3Mgb2YKKyAgICAgKiBBYnN0cmFjdENvbGxlY3Rpb24uIFRoZSBpdGVyYXRvciBtZXRob2Qgb2YgdGhpcyBzdWJjbGFzcyByZXR1cm5zIGEKKyAgICAgKiAid3JhcHBlciBvYmplY3QiIG92ZXIgdGhlIGl0ZXJhdG9yIG9mIG1hcCdzIGVudHJ5U2V0KCkuIFRoZSBzaXplIG1ldGhvZAorICAgICAqIHdyYXBzIHRoZSBtYXAncyBzaXplIG1ldGhvZCBhbmQgdGhlIGNvbnRhaW5zIG1ldGhvZCB3cmFwcyB0aGUgbWFwJ3MKKyAgICAgKiBjb250YWluc1ZhbHVlIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdCBmaXJzdCB0aW1lIGFuZAorICAgICAqIHJldHVybmVkIGluIHJlc3BvbnNlIHRvIGFsbCBzdWJzZXF1ZW50IGNhbGxzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuCisgICAgICogZGlmZmVyZW50IENvbGxlY3Rpb24gd2hlbiBtdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCwgc2luY2UgaXQgaGFzIG5vCisgICAgICogc3luY2hyb25pemF0aW9uIHBlcmZvcm1lZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcworICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKQEAgLTQzMiw4ICs0NTYsMTAgQEAKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgbm8gbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBrZXkgaXMgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpIHsKQEAgLTQ4MywxMyArNTA5LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhpcyBXZWFrSGFzaE1hcCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSwgYW5kIHJldHVybnMgdHJ1ZSwgaWYKLSAgICAgKiBhdCBsZWFzdCBvbmUgZW50cnkgaGFzIHRoaXMgb2JqZWN0IGFzIGl0cyB2YWx1ZS4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT52YWx1ZTwvY29kZT4gaXMgYSB2YWx1ZSBpbiB0aGlzIFdlYWtIYXNoTWFwLAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKQEAgLTUyMiwxMSArNTQ4LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIFdlYWtIYXNoTWFwIGhhcyBubyBlbGVtZW50cywgYSBzaXplIG9mIHplcm8uCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbWFwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIEhhc2hNYXAgaGFzIG5vIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAc2VlICNzaXplCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbWFwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CkBAIC01NjcsMTEgKzU5MiwxMiBAQAogICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5LgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYW55IHByZXZpb3VzIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvciBudWxsCi0gICAgICogICAgICAgICBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIGFueSBwcmV2aW91cyBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpIHsKQEAgLTYzNCw5ICs2NjAsOCBAQAogICAgICAqIHRoZSBnaXZlbiBtYXAuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIE1hcCB0byBjb3B5IG1hcHBpbmdzIGZyb20KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIG1hcCBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgbWFwIHRvIGNvcHkgbWFwcGluZ3MgZnJvbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbWFwKSB7CkBAIC02NDQsMTIgKzY2OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGlzIFdlYWtIYXNoTWFwLgorICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoaXMgbWFwLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlbW92ZWQgbWFwcGluZyBvciBudWxsIGlmIGtleSBpcyBub3QgYSBrZXkgaW4KLSAgICAgKiAgICAgICAgIHRoaXMgV2Vha0hhc2hNYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIG1hcHBpbmcgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIG1hcHBpbmcKKyAgICAgKiAgICAgICAgIGZvciB0aGUgc3BlY2lmaWVkIGtleSB3YXMgZm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKQEAgLTY4NCw5ICs3MTAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgaW4gdGhpcyBXZWFrSGFzaE1hcC4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBtYXAuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHRoaXMgV2Vha0hhc2hNYXAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBtYXAuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBzaXplKCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3BhY2thZ2UuaHRtbAppbmRleCBkZDc5ODA2Li42YjM4MzU3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3BhY2thZ2UuaHRtbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3BhY2thZ2UuaHRtbApAQCAtMyw4ICszLDkgQEAKICAgICA8cD4KICAgICAgIFByb3ZpZGVzIGFuIGV4dGVuc2l2ZSBzZXQgb2YgdXRpbGl0eSBjbGFzc2VzLiBUaGlzIGVuY29tcGFzc2VzIHRoaW5ncwogICAgICAgc3VjaCBhcyBiYXNpYyBjb250YWluZXIgZGF0YSBzdHJ1Y3R1cmVzICh2YXJpb3VzIGZvcm1zIG9mIGxpc3RzLCBzZXRzLAotICAgICAgYW5kIG1hcHMpLCBjbGFzc2VzIGZvciBkZWFsaW5nIHdpdGggZGF0ZSBhbmQgdGltZSwgYW5kIHRoZWlyIGZvcm1hdHRpbmcsCi0gICAgICBhbmQgICAgCisgICAgICBhbmQgbWFwcyksIGNsYXNzZXMgZm9yIGRlYWxpbmcgd2l0aCBkYXRlIGFuZCB0aW1lLCBTdHJpbmctaGFuZGxpbmcsIGZvcm1hdHRpbmcsCisgICAgICBsb2NhbGl6YXRpb24sIGFuZCBzY2hlZHVsaW5nIHJlcGVhdGVkIHRhc2tzLgogICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKICAgPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSGVhZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0hlYWRlci5qYXZhCmluZGV4IGYzNmY4NDYuLjI3MTgxOTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSGVhZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IZWFkZXIuamF2YQpAQCAtMTAyLDEyICsxMDIsMTQgQEAKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBsaXN0ID0ga2V5VGFibGUuZ2V0KGtleSk7CiAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKICAgICAgICAgICAgIGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CiAgICAgICAgICAgICBrZXlUYWJsZS5wdXQoa2V5LCBsaXN0KTsKICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKICAgICAgICAgcHJvcHMuYWRkKGtleSk7CiAgICAgICAgIHByb3BzLmFkZCh2YWx1ZSk7CkBAIC0xMjQsNyArMTI2LDkgQEAKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gbGlzdCA9IGtleVRhYmxlLmdldChrZXkpOwogICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CiAgICAgICAgICAgICBhZGQoa2V5LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBDb25maWd1cmF0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBDb25maWd1cmF0aW9uLmphdmEKaW5kZXggMmExZjFiMy4uNmEyNjM2NSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cENvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTQsNiArMTQsMTIgQEAKICAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKworLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBUaGlzIGNsYXNzIHdhcyBjb3BpZWQgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQorLy8gdG8gaW1wcm92ZSByZXVzYWJpbGl0eSBvZiBVUkxDb25uZWN0aW9ucworLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cDsKIAogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwQ29ubmVjdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwQ29ubmVjdGlvbi5qYXZhCmluZGV4IDkzYjdlNTQuLmY3YzhkOTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cENvbm5lY3Rpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBDb25uZWN0aW9uLmphdmEKQEAgLTE0LDYgKzE0LDEyIEBACiAgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gVGhpcyBjbGFzcyB3YXMgY29waWVkIGZyb20gYSBuZXdlciB2ZXJzaW9uIG9mIGhhcm1vbnkKKy8vIHRvIGltcHJvdmUgcmV1c2FiaWxpdHkgb2YgVVJMQ29ubmVjdGlvbnMKKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHA7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKaW5kZXggMTZjNGU0OC4uOWE5MDYxMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBDb25uZWN0aW9uTWFuYWdlci5qYXZhCkBAIC0xNCw2ICsxNCwxMiBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoaXMgY2xhc3Mgd2FzIGNvcGllZCBmcm9tIGEgbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisvLyB0byBpbXByb3ZlIHJldXNhYmlsaXR5IG9mIFVSTENvbm5lY3Rpb25zCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cFVSTENvbm5lY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cFVSTENvbm5lY3Rpb24uamF2YQppbmRleCAyYzllZTBhLi43NjQzMmU2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbi5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gVGhpcyBjbGFzcyBhbmQgc29tZSBoZWxwZXIgY2xhc3NlcyB3aGVyZSBjb3BpZWQgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQorLy8gdG8gaW1wcm92ZSByZXVzYWJpbGl0eSBvZiBVUkxDb25uZWN0aW9ucworLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cHMvSHR0cHNVUkxDb25uZWN0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwcy9IdHRwc1VSTENvbm5lY3Rpb24uamF2YQppbmRleCA0ZDBhZmY3Li4zMWMxMTk4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwcy9IdHRwc1VSTENvbm5lY3Rpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwcy9IdHRwc1VSTENvbm5lY3Rpb24uamF2YQpAQCAtMTQsNiArMTQsNyBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cHM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjEsNiArMjIsMTAgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Qcm94eTsKKy8vIEJFR0lOIGFuZG9yaWQtcmVtb3ZlZAorLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisvLyBpbXBvcnQgamF2YS5uZXQuU29ja2V0OworLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CkBAIC0zODUsNyArMzkwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLCByZXNwb25zZUNvZGUpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIHNvbWUgcmVtYWluaW5nIGRhdGEgaW4gdGhlIHN0cmVhbSAtIHJlYWQgaXQgb3V0CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kb3JpZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CiAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIHdoaWxlIChpcy5hdmFpbGFibGUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlzLnJlYWQoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zOTUsOCArNDAzLDExIEBACiAgICAgICAgICAgICAgICAgc3VwZXIuY29ubmVjdCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtYWtpbmdTU0xUdW5uZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRvcmlkLWNoYW5nZWQKKyAgICAgICAgICAgICAgICAvLyBjb3BpZWQgZnJvbSBuZXdlciB2ZXJzaW9uIG9mIGhhcm1vbnkKICAgICAgICAgICAgICAgICBzc2xTb2NrZXQgPSBjb25uZWN0aW9uLmdldFNlY3VyZVNvY2tldChnZXRTU0xTb2NrZXRGYWN0b3J5KCksIGdldEhvc3RuYW1lVmVyaWZpZXIoKSk7CiAgICAgICAgICAgICAgICAgc2V0VXBUcmFuc3BvcnRJTyhjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDE5LDUgKzQzMCwyMyBAQAogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RTdHJpbmcoKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyAvKioKKyAgICAgICAgLy8gICogQ3JlYXRlIHRoZSBzZWN1cmUgc29ja2V0IG92ZXIgdGhlIGNvbm5lY3RlZCBzb2NrZXQgYW5kIHZlcmlmeSByZW1vdGUKKyAgICAgICAgLy8gICogaG9zdG5hbWUuCisgICAgICAgIC8vICAqLworICAgICAgICAvLyBwcml2YXRlIFNvY2tldCB3cmFwQ29ubmVjdGlvbihTb2NrZXQgc29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyAgICAgU3RyaW5nIGhvc3RuYW1lID0gdXJsLmdldEhvc3QoKTsKKyAgICAgICAgLy8gICAgIC8vIGNyZWF0ZSB0aGUgd3JhcHBlciBvdmVyIGNvbm5lY3RlZCBzb2NrZXQKKyAgICAgICAgLy8gICAgIHNzbFNvY2tldCA9IChTU0xTb2NrZXQpIGdldFNTTFNvY2tldEZhY3RvcnkoKS5jcmVhdGVTb2NrZXQoc29ja2V0LAorICAgICAgICAvLyAgICAgICAgICAgICBob3N0bmFtZSwgdXJsLmdldFBvcnQoKSwgdHJ1ZSk7CisgICAgICAgIC8vICAgICBzc2xTb2NrZXQuc2V0VXNlQ2xpZW50TW9kZSh0cnVlKTsKKyAgICAgICAgLy8gICAgIHNzbFNvY2tldC5zdGFydEhhbmRzaGFrZSgpOworICAgICAgICAvLyAgICAgaWYgKCFnZXRIb3N0bmFtZVZlcmlmaWVyKCkudmVyaWZ5KGhvc3RuYW1lLCBzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpKSkgeworICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImx1bmkuMDIiLCBob3N0bmFtZSkpOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vICAgICByZXR1cm4gc3NsU29ja2V0OworICAgICAgICAvLyB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9qYXIvSmFyVVJMQ29ubmVjdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb24uamF2YQppbmRleCAzZTEyNjY4Li5lNjg1YTA2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9qYXIvSmFyVVJMQ29ubmVjdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2phci9KYXJVUkxDb25uZWN0aW9uLmphdmEKQEAgLTQxLDcgKzQxLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5WTTsKKy8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorLy8gaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uVk07CisvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2c7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5VdGlsOwogCkBAIC03Nyw3ICs3OSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmdldEludGVnZXIoImphci5jYWNoZVNpemUiLCA1MDApOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwotICAgICAgICBWTS5jbG9zZUphcnMoKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIFRPRE8gdGhpcyBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBvbmNlIHRoaXMgaXMgYXZhaWxhYmxlLgorICAgICAgICAvLyBWTS5jbG9zZUphcnMoKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogICAgIH0KIAogICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWNoZUVudHJ5PFQgZXh0ZW5kcyBKYXJGaWxlPiBleHRlbmRzIFdlYWtSZWZlcmVuY2U8VD4gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCmluZGV4IDA2MTM4ZjYuLmY5MzVhNzUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKQEAgLTIxLDYgKzIxLDEwIEBACiAgKiBpZiB0aGlzIHRvb2wgcnVucyBhZ2Fpbi4gQmV0dGVyIG1ha2UgY2hhbmdlcyBpbiB0aGUgdGVtcGxhdGUgZmlsZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFJlZHVuZGFudCBjb2RlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vdyBjYWxsZWQgZnJvbSBNc2dIZWxwLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5sczsKIAogCkBAIC0zMCw4ICszNCw5IEBACiBpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOworLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2dIZWxwOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKICAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHN0cmluZ3MgZnJvbSBhIHJlc291cmNlIGJ1bmRsZSBhbmQgcmV0dXJucyB0aGVtLApAQCAtNDgsOSArNTMsMTEgQEAKICAqIAogICovCiBwdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotICAgIAorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNSZXNvdXJjZSA9CiAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5ubHMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIGEgbWVzc2FnZSB3aGljaCBoYXMgbm8gYXJndW1lbnRzLgpAQCAtNjAsNyArNjcsOSBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2cpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjcsNiArMTM2LDEyIEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2csIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZywgYXJncyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBEdXBsaWNhdGUgY29kZSB3YXMgZHJvcHBlZCBpbiBmYXZvciBvZiB1c2luZyBNc2dIZWxwLgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9ubHMvbWVzc2FnZXMucHJvcGVydGllcyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9ubHMvbWVzc2FnZXMucHJvcGVydGllcwppbmRleCAwZGMyYzdiLi5mZTM5MmI3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmxzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25scy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0yMSwzICsyMSw4IEBACiBsdW5pLjA0PXRoaXMgTWFwCiBsdW5pLjA1PUF0dGVtcHQgdG8gaW5zZXJ0IHswfSBlbGVtZW50IGludG8gY29sbGVjdGlvbiB3aXRoIGVsZW1lbnQgdHlwZSB7MX0KIGx1bmkuMDY9VGhlIHN0cmluZyBhcmd1bWVudCBpcyBudWxsCisjIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyMgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CitsdW5pLjA4PUludmFsaWQgVW5pY29kZSBzZXF1ZW5jZTogZXhwZWN0ZWQgZm9ybWF0IFxcdXh4eHgKK2x1bmkuMDk9SW52YWxpZCBVbmljb2RlIHNlcXVlbmNlOiBpbGxlZ2FsIGNoYXJhY3RlcgorIyAvLyBFTkQgYW5kcm9pZC1hZGRlZApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9ab25lSW5mby5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL3V0aWwvWm9uZUluZm8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBsdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1pvbmVJbmZvLmphdmEKcmVuYW1lIHRvIGx1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC91dGlsL1pvbmVJbmZvLmphdmEKaW5kZXggOTc3ZjVjNi4uMTEwYTBmZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9ab25lSW5mby5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC91dGlsL1pvbmVJbmZvLmphdmEKQEAgLTE0LDE3ICsxNCwzMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBqYXZhLnV0aWw7CitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCi0vKiBwYWNrYWdlICovIGNsYXNzIFpvbmVJbmZvCi1leHRlbmRzIFRpbWVab25lCi17CisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIFpvbmVJbmZvIGV4dGVuZHMgVGltZVpvbmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSUxMSVNFQ09ORFNfUEVSX0RBWSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSUxMSVNFQ09ORFNfUEVSXzQwMF9ZRUFSUyA9CisgICAgICAgIE1JTExJU0VDT05EU19QRVJfREFZICogKDQwMCAqIDM2NSArIDEwMCAtIDMpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVTklYX09GRlNFVCA9IDYyMTY3MjE5MjAwMDAwTDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE5PUk1BTCA9IG5ldyBpbnRbXSB7CisgICAgICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBMRUFQID0gbmV3IGludFtdIHsKKyAgICAgICAgMCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzUsCisgICAgfTsKKwogICAgIHB1YmxpYyBzdGF0aWMgVGltZVpvbmUgZ2V0VGltZVpvbmUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKICAgICAgICAgewpAQCAtNzMsMjIgKzg4LDI2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobGFzdGRzdCA+PSAwKQorICAgICAgICBpZiAobGFzdGRzdCA+PSAwKSB7CiAgICAgICAgICAgICBtRGF5bGlnaHROYW1lID0gbnVsbE5hbWUoZGF0YSwgYWJicmV2b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiYnJldlttVHlwZXNbbGFzdGRzdF0gJiAweEZGXSk7Ci0gICAgICAgIGlmIChsYXN0c3RkID49IDApCisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhc3RzdGQgPj0gMCkgewogICAgICAgICAgICAgbVN0YW5kYXJkTmFtZSA9IG51bGxOYW1lKGRhdGEsIGFiYnJldm9mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmJyZXZbbVR5cGVzW2xhc3RzdGRdICYgMHhGRl0pOworICAgICAgICB9CiAKICAgICAgICAgLy8gVXNlIHRoZSBsYXRlc3Qgbm9uLURTVCBvZmZzZXQgaWYgYW55IGFzIHRoZSByYXcgb2Zmc2V0CiAKLSAgICAgICAgaWYgKGxhc3RzdGQgPCAwKQorICAgICAgICBpZiAobGFzdHN0ZCA8IDApIHsKICAgICAgICAgICAgIGxhc3RzdGQgPSAwOworICAgICAgICB9CiAKLSAgICAgICAgaWYgKGxhc3RzdGQgPj0gbVR5cGVzLmxlbmd0aCkKKyAgICAgICAgaWYgKGxhc3RzdGQgPj0gbVR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICAgbVJhd09mZnNldCA9IG1HbXRPZmZzWzBdOwotICAgICAgICBlbHNlCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUmF3T2Zmc2V0ID0gbUdtdE9mZnNbbVR5cGVzW2xhc3RzdGRdICYgMHhGRl07CisgICAgICAgIH0KIAogICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgcmF3IG9mZnNldCBmcm9tIGFsbCBvZmZzZXRzIHNvIGl0IGNhbiBiZSBjaGFuZ2VkCiAgICAgICAgIC8vIGFuZCBhZmZlY3QgdGhlbSB0b28uCkBAIC05NywxNSArMTE2LDE5IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUdtdE9mZnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIG1HbXRPZmZzW2ldIC09IG1SYXdPZmZzZXQ7CiAKLSAgICAgICAgICAgIGlmIChtSXNEc3RzW2ldICE9IDApCisgICAgICAgICAgICBpZiAobUlzRHN0c1tpXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbVVzZURzdCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBtUmF3T2Zmc2V0ICo9IDEwMDA7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXRPZmZzZXQoaW50IGVyYSwgaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF5T2ZXZWVrLCBpbnQgbWlsbGlzKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRPZmZzZXQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBlcmEsCisgICAgICAgIGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgZGF5T2ZXZWVrLAorICAgICAgICBpbnQgbWlsbGlzKSB7CiAgICAgICAgIC8vIFhYWCBUaGlzIGFzc3VtZXMgR3JlZ29yaWFuIGFsd2F5czsgQ2FsZW5kYXIgc3dpdGNoZXMgZnJvbQogICAgICAgICAvLyBKdWxpYW4gdG8gR3JlZ29yaWFuIGluIDE1ODIuICBXaGF0IGNhbGVuZGFyIHN5c3RlbSBhcmUgdGhlCiAgICAgICAgIC8vIGFyZ3VtZW50cyBzdXBwb3NlZCB0byBjb21lIGZyb20/CkBAIC0xMTksOCArMTQyLDggQEAKICAgICAgICAgaWYgKHllYXIgPiAwKQogICAgICAgICAgICAgY2FsYyAtPSAoKHllYXIgLSAxKSAvIDEwMCkgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWTsKIAotICAgICAgICBib29sZWFuIGxlYXAgPSAoeWVhciA9PSAwIHx8ICh5ZWFyICUgNCA9PSAwICYmIHllYXIgJSAxMDAgIT0gMCkpOwotICAgICAgICBpbnRbXSBtbGVuID0gbGVhcCA/IExFQVAgOiBOT1JNQUw7CisgICAgICAgIGJvb2xlYW4gaXNMZWFwID0gKHllYXIgPT0gMCB8fCAoeWVhciAlIDQgPT0gMCAmJiB5ZWFyICUgMTAwICE9IDApKTsKKyAgICAgICAgaW50W10gbWxlbiA9IGlzTGVhcCA/IExFQVAgOiBOT1JNQUw7CiAKICAgICAgICAgY2FsYyArPSBtbGVuW21vbnRoXSAqIE1JTExJU0VDT05EU19QRVJfREFZOwogICAgICAgICBjYWxjICs9IChkYXkgLSAxKSAqIE1JTExJU0VDT05EU19QRVJfREFZOwpAQCAtMTMyLDY4ICsxNTUsNTEgQEAKICAgICAgICAgcmV0dXJuIGdldE9mZnNldChjYWxjKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTExJU0VDT05EU19QRVJfREFZID0gODY0MDAgKiAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElTRUNPTkRTX1BFUl80MDBfWUVBUlMgPQotICAgICAgICBNSUxMSVNFQ09ORFNfUEVSX0RBWSAqICg0MDAgKiAzNjUgKyAxMDAgLSAzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVU5JWF9PRkZTRVQgPSA2MjE2NzIxOTIwMDAwMEw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOT1JNQUwgPSBuZXcgaW50W10gewotICAgICAgICAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTEVBUCA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIDAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1LAotICAgIH07Ci0KLSAgICBwdWJsaWMgaW50IGdldE9mZnNldChsb25nIHdoZW4pCi0gICAgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGxvbmcgd2hlbikgewogICAgICAgICBpbnQgdW5peCA9IChpbnQpICh3aGVuIC8gMTAwMCk7CiAgICAgICAgIGludCB0cmFucyA9IEFycmF5cy5iaW5hcnlTZWFyY2gobVRyYW5zaXRpb25zLCB1bml4KTsKIAotICAgICAgICBpZiAodHJhbnMgPT0gfjApCisgICAgICAgIGlmICh0cmFucyA9PSB+MCkgewogICAgICAgICAgICAgcmV0dXJuIG1HbXRPZmZzWzBdICogMTAwMCArIG1SYXdPZmZzZXQ7Ci0KLSAgICAgICAgaWYgKHRyYW5zIDwgMCkKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnMgPCAwKSB7CiAgICAgICAgICAgICB0cmFucyA9IH50cmFucyAtIDE7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbUdtdE9mZnNbbVR5cGVzW3RyYW5zXSAmIDB4RkZdICogMTAwMCArIG1SYXdPZmZzZXQ7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRSYXdPZmZzZXQoKSB7CiAgICAgICAgIHJldHVybiBtUmF3T2Zmc2V0OwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJhd09mZnNldChpbnQgb2ZmKSB7CiAgICAgICAgIG1SYXdPZmZzZXQgPSBvZmY7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaW5EYXlsaWdodFRpbWUoRGF0ZSB3aGVuKSB7CiAgICAgICAgIGludCB1bml4ID0gKGludCkgKHdoZW4uZ2V0VGltZSgpIC8gMTAwMCk7CiAgICAgICAgIGludCB0cmFucyA9IEFycmF5cy5iaW5hcnlTZWFyY2gobVRyYW5zaXRpb25zLCB1bml4KTsKIAotICAgICAgICBpZiAodHJhbnMgPT0gfjApCisgICAgICAgIGlmICh0cmFucyA9PSB+MCkgewogICAgICAgICAgICAgcmV0dXJuIG1Jc0RzdHNbMF0gIT0gMDsKLQotICAgICAgICBpZiAodHJhbnMgPCAwKQorICAgICAgICB9CisgICAgICAgIGlmICh0cmFucyA8IDApIHsKICAgICAgICAgICAgIHRyYW5zID0gfnRyYW5zIC0gMTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBtSXNEc3RzW21UeXBlc1t0cmFuc10gJiAweEZGXSAhPSAwOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHVzZURheWxpZ2h0VGltZSgpIHsKICAgICAgICAgcmV0dXJuIG1Vc2VEc3Q7CiAgICAgfQogCi0vLyAgICAvKiBwYWNrYWdlICovIFN0cmluZyBnZXREaXNwbGF5TmFtZUludGVybmFsKGJvb2xlYW4gZGF5bGlnaHQsIGludCBzdHlsZSkgewotLy8gICAgICAgIGlmIChkYXlsaWdodCAmJiBtRGF5bGlnaHROYW1lICE9IG51bGwpCi0vLyAgICAgICAgICAgIHJldHVybiBtRGF5bGlnaHROYW1lOwotLy8gICAgICAgIGlmICghZGF5bGlnaHQgJiYgbVN0YW5kYXJkTmFtZSAhPSBudWxsKQotLy8gICAgICAgICAgICByZXR1cm4gbVN0YW5kYXJkTmFtZTsKLS8vCi0vLyAgICAgICAgcmV0dXJuIHN1cGVyLmdldERpc3BsYXlOYW1lSW50ZXJuYWwoZGF5bGlnaHQsIHN0eWxlKTsKLS8vICAgIH0KLQogICAgIHByaXZhdGUgaW50IG1SYXdPZmZzZXQ7CiAgICAgcHJpdmF0ZSBpbnRbXSBtVHJhbnNpdGlvbnM7CiAgICAgcHJpdmF0ZSBpbnRbXSBtR210T2ZmczsKQEAgLTIwMiw0ICsyMDgsNDMgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZURzdDsKICAgICBwcml2YXRlIFN0cmluZyBtRGF5bGlnaHROYW1lOwogICAgIHByaXZhdGUgU3RyaW5nIG1TdGFuZGFyZE5hbWU7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBab25lSW5mbykpIHsKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgICAgfQorICAgICAgICBab25lSW5mbyBvdGhlciA9IChab25lSW5mbykgb2JqOworICAgICAgICByZXR1cm4gbVVzZURzdCA9PSBvdGhlci5tVXNlRHN0CisgICAgICAgICAgICAgICAgJiYgKG1EYXlsaWdodE5hbWUgPT0gbnVsbCA/IG90aGVyLm1EYXlsaWdodE5hbWUgPT0gbnVsbCA6CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF5bGlnaHROYW1lLmVxdWFscyhvdGhlci5tRGF5bGlnaHROYW1lKSkKKyAgICAgICAgICAgICAgICAmJiAobVN0YW5kYXJkTmFtZSA9PSBudWxsID8gb3RoZXIubVN0YW5kYXJkTmFtZSA9PSBudWxsIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGFyZE5hbWUuZXF1YWxzKG90aGVyLm1TdGFuZGFyZE5hbWUpKQorICAgICAgICAgICAgICAgICYmIG1SYXdPZmZzZXQgPT0gb3RoZXIubVJhd09mZnNldAorICAgICAgICAgICAgICAgIC8vIEFycmF5cy5lcXVhbHMgcmV0dXJucyB0cnVlIGlmIGJvdGggYXJyYXlzIGFyZSBudWxsCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhtR210T2Zmcywgb3RoZXIubUdtdE9mZnMpCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhtSXNEc3RzLCBvdGhlci5tSXNEc3RzKQorICAgICAgICAgICAgICAgICYmIEFycmF5cy5lcXVhbHMobVR5cGVzLCBvdGhlci5tVHlwZXMpCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhtVHJhbnNpdGlvbnMsIG90aGVyLm1UcmFuc2l0aW9ucyk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1EYXlsaWdodE5hbWUgPT0gbnVsbCkgPyAwIDoKKyAgICAgICAgICAgICAgICBtRGF5bGlnaHROYW1lLmhhc2hDb2RlKCkpOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIEFycmF5cy5oYXNoQ29kZShtR210T2Zmcyk7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgQXJyYXlzLmhhc2hDb2RlKG1Jc0RzdHMpOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIG1SYXdPZmZzZXQ7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtU3RhbmRhcmROYW1lID09IG51bGwpID8gMCA6CisgICAgICAgICAgICAgICAgbVN0YW5kYXJkTmFtZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBBcnJheXMuaGFzaENvZGUobVRyYW5zaXRpb25zKTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBBcnJheXMuaGFzaENvZGUobVR5cGVzKTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAobVVzZURzdCA/IDEyMzEgOiAxMjM3KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1pvbmVJbmZvREIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC91dGlsL1pvbmVJbmZvREIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBsdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1pvbmVJbmZvREIuamF2YQpyZW5hbWUgdG8gbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL3V0aWwvWm9uZUluZm9EQi5qYXZhCmluZGV4IDM2MDQyMmUuLjNlN2JkYzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvWm9uZUluZm9EQi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC91dGlsL1pvbmVJbmZvREIuamF2YQpAQCAtMTQsMzQgKzE0LDY4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGphdmEudXRpbDsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC51dGlsLlRpbWV6b25lR2V0dGVyOwotCi0vKnBhY2thZ2UqLyBmaW5hbCBjbGFzcyBab25lSW5mb0RCIHsKKy8qKgorICogQSBjbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHRpbWUgem9uZSBkYXRhYmFzZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUKKyAqICd6b25laW5mbycgZGF0YWJhc2UgYXMgdGhlIHNvdXJjZSBvZiB0aW1lIHpvbmUgaW5mb3JtYXRpb24uICBIb3dldmVyLCB0byBjb25zZXJ2ZQorICogZGlzayBzcGFjZSB0aGUgZGF0YSBmb3IgYWxsIHRpbWUgem9uZXMgYXJlIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIGZpbGUsIGFuZCBhCisgKiBzZWNvbmQgZmlsZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBlYWNoIHRpbWUgem9uZSByZWNvcmQuICBBCisgKiB0aGlyZCBmaWxlIGluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgem9uZWluZm8gZGF0YWJzZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkYXRhLgorICoKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFpvbmVJbmZvREIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWk5BTUVfTEVOR1RIID0gNDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRaSU5UX0xFTkdUSCA9IDQ7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRpbmluZyB0aGUgdGltZSB6b25lIGRhdGFiYXNlIGZpbGVzLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaT05FX0RJUkVDVE9SWV9OQU1FID0KICAgICAgICAgU3lzdGVtLmdldGVudigiQU5EUk9JRF9ST09UIikgKyAiL3Vzci9zaGFyZS96b25laW5mby8iOwogCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIHRpbWUgem9uZSByZWNvcmRzLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaT05FX0ZJTEVfTkFNRSA9CiAgICAgICAgIFpPTkVfRElSRUNUT1JZX05BTUUgKyAiem9uZWluZm8uZGF0IjsKIAorICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluZGV4IHRvIGVhY2ggdGltZSB6b25lIHJlY29yZCB3aXRoaW4KKyAgICAgKiB0aGUgem9uZWluZm8uZGF0IGZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX0ZJTEVfTkFNRSA9CiAgICAgICAgIFpPTkVfRElSRUNUT1JZX05BTUUgKyAiem9uZWluZm8uaWR4IjsKIAorICAgIC8qKgorICAgICAqICBab25laW5mbyB2ZXJzaW9uIHVzZWQgcHJpb3IgdG8gY3JlYXRpb24gb2YgdGhlIHpvbmVpbmZvLnZlcnNpb24gZmlsZSwKKyAgICAgKiAgZXF1YWwgdG8gIjIwMDdoIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WRVJTSU9OID0gIjIwMDdoIjsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGluZGljYXRpbmcgdGhlIGRhdGFiYXNlIHZlcnNpb24gaW4gdXNlLiAgSWYgdGhlIGZpbGUgaXMgbm90CisgICAgICogcHJlc2VudCBvciBpcyB1bnJlYWRhYmxlLCB3ZSBhc3N1bWUgYSB2ZXJzaW9uIG9mIERFRkFVTFRfVkVSU0lPTi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9GSUxFX05BTUUgPQorICAgICAgICBaT05FX0RJUkVDVE9SWV9OQU1FICsgInpvbmVpbmZvLnZlcnNpb24iOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgVGltZVpvbmUgZGVmYXVsdFpvbmUgPSBudWxsOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHZlcnNpb247CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc3RhcnRzOwogICAgIHByaXZhdGUgc3RhdGljIGludFtdIGxlbmd0aHM7CkBAIC01NCwxNiArODgsMjUgQEAKICAgICAgICAgLy8gVGhpcyBzcGFjZSBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRWZXJzaW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSB2ZXJzaW9uRmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKFZFUlNJT05fRklMRV9OQU1FLCAiciIpOworICAgICAgICBpbnQgbGVuID0gKGludCkgdmVyc2lvbkZpbGUubGVuZ3RoKCk7CisgICAgICAgIGJ5dGVbXSB2YnVmID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgdmVyc2lvbkZpbGUucmVhZEZ1bGx5KHZidWYpOworICAgICAgICB2ZXJzaW9uID0gbmV3IFN0cmluZyh2YnVmLCAwLCBsZW4sICJJU08tODg1OS0xIikudHJpbSgpOworICAgICAgICB2ZXJzaW9uRmlsZS5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZERhdGFiYXNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHN0YXJ0cyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShJTkRFWF9GSUxFX05BTUUsICJyIik7CisgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgaW5kZXhGaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoSU5ERVhfRklMRV9OQU1FLCAiciIpOwogICAgICAgICBieXRlW10gbmJ1ZiA9IG5ldyBieXRlW1RaTkFNRV9MRU5HVEhdOwogCiAgICAgICAgIGludCBudW1FbnRyaWVzID0KLSAgICAgICAgICAgIChpbnQpIChmaWxlLmxlbmd0aCgpIC8gKFRaTkFNRV9MRU5HVEggKyAzKlRaSU5UX0xFTkdUSCkpOworICAgICAgICAgICAgKGludCkgKGluZGV4RmlsZS5sZW5ndGgoKSAvIChUWk5BTUVfTEVOR1RIICsgMypUWklOVF9MRU5HVEgpKTsKIAogICAgICAgICBjaGFyW10gbmFtZWJ1ZiA9IG5ldyBjaGFyW251bUVudHJpZXMgKiBUWk5BTUVfTEVOR1RIXTsKICAgICAgICAgaW50W10gbmFtZWVuZCA9IG5ldyBpbnRbbnVtRW50cmllc107CkBAIC03NCwxOSArMTE3LDE4IEBACiAgICAgICAgIG9mZnNldHMgPSBuZXcgaW50W251bUVudHJpZXNdOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKSB7Ci0gICAgICAgICAgICBmaWxlLnJlYWRGdWxseShuYnVmKTsKLSAgICAgICAgICAgIHN0YXJ0c1tpXSA9IGZpbGUucmVhZEludCgpOwotICAgICAgICAgICAgbGVuZ3Roc1tpXSA9IGZpbGUucmVhZEludCgpOwotICAgICAgICAgICAgb2Zmc2V0c1tpXSA9IGZpbGUucmVhZEludCgpOworICAgICAgICAgICAgaW5kZXhGaWxlLnJlYWRGdWxseShuYnVmKTsKKyAgICAgICAgICAgIHN0YXJ0c1tpXSA9IGluZGV4RmlsZS5yZWFkSW50KCk7CisgICAgICAgICAgICBsZW5ndGhzW2ldID0gaW5kZXhGaWxlLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG9mZnNldHNbaV0gPSBpbmRleEZpbGUucmVhZEludCgpOwogCiAgICAgICAgICAgICAvLyBEb24ndCBpbmNsdWRlIG51bGwgY2hhcnMgaW4gdGhlIFN0cmluZwogICAgICAgICAgICAgaW50IGxlbiA9IG5idWYubGVuZ3RoOwogICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgIGlmIChuYnVmW2pdID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZWJ1ZltuYW1lb2ZmKytdID0gKGNoYXIpIChuYnVmW2pdICYgMHhGRik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5hbWVidWZbbmFtZW9mZisrXSA9IChjaGFyKSAobmJ1ZltqXSAmIDB4RkYpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBuYW1lZW5kW2ldID0gbmFtZW9mZjsKQEAgLTEwMSwxNiArMTQzLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVlbmRbaV0pOwogICAgICAgICB9CiAKLSAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICBpbmRleEZpbGUuY2xvc2UoKTsKICAgICB9CiAKICAgICBzdGF0aWMgeworICAgICAgICAvLyBEb24ndCBhdHRlbXB0IHRvIGxvZyBoZXJlIGJlY2F1c2UgdGhlIGxvZ2dlciByZXF1aXJlcyB0aGlzIGNsYXNzIHRvIGJlIGluaXRpYWxpemVkCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICByZWFkVmVyc2lvbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUaGUgdmVyc2lvbiBjYW4ndCBiZSByZWFkLCB3ZSBjYW4gY29udGludWUgd2l0aG91dCBpdAorICAgICAgICAgICAgdmVyc2lvbiA9IERFRkFVTFRfVkVSU0lPTjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkRGF0YWJhc2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gVGhlIGRhdGFiYXNlIGNhbid0IGJlIHJlYWQsIHRyeSB0byBjb250aW51ZSB3aXRob3V0IGl0Ci0gICAgICAgICAgICBMb2dnZXIuZ2xvYmFsLndhcm5pbmcoIklPRXhjZXB0aW9uICIgKyBlICsKLSAgICAgICAgICAgICAgICAgICAgIiBsb2FkaW5nIHRoZSB6b25laW5mbyBkYXRhYmFzZSIpOwogICAgICAgICAgICAgbmFtZXMgPSBuZXcgU3RyaW5nWzBdOwogICAgICAgICAgICAgc3RhcnRzID0gbmV3IGludFswXTsKICAgICAgICAgICAgIGxlbmd0aHMgPSBuZXcgaW50WzBdOwpAQCAtMTE4LDEwICsxNjYsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QXZhaWxhYmxlSURzKCkgewogICAgICAgICByZXR1cm4gX2dldEF2YWlsYWJsZUlEcygwLCBmYWxzZSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBdmFpbGFibGVJRHMoaW50IHJhd09mZnNldCkgewogICAgICAgICByZXR1cm4gX2dldEF2YWlsYWJsZUlEcyhyYXdPZmZzZXQsIHRydWUpOwogICAgIH0KQEAgLTEzMCwxMiArMTgyLDEyIEBACiAgICAgICAgICAgICBib29sZWFuIGNoZWNrT2Zmc2V0KSB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAKLSAgICAgICAgaW50W10gb2Zmc2V0cyA9IFpvbmVJbmZvREIub2Zmc2V0czsKLSAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBab25lSW5mb0RCLm5hbWVzOwotICAgICAgICBpbnQgbGVuID0gb2Zmc2V0cy5sZW5ndGg7CisgICAgICAgIGludFtdIF9vZmZzZXRzID0gWm9uZUluZm9EQi5vZmZzZXRzOworICAgICAgICBTdHJpbmdbXSBfbmFtZXMgPSBab25lSW5mb0RCLm5hbWVzOworICAgICAgICBpbnQgbGVuID0gX29mZnNldHMubGVuZ3RoOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWNoZWNrT2Zmc2V0IHx8IG9mZnNldHNbaV0gPT0gcmF3T2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQobmFtZXNbaV0pOworICAgICAgICAgICAgaWYgKCFjaGVja09mZnNldCB8fCBfb2Zmc2V0c1tpXSA9PSByYXdPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChfbmFtZXNbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE1MSwxMyArMjAzLDE0IEBACiAgICAgICAgIGlmICghZi5leGlzdHMoKSkgewogICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShaT05FX0ZJTEVfTkFNRSk7CiAgICAgICAgICAgICBpbnQgaSA9IEFycmF5cy5iaW5hcnlTZWFyY2goWm9uZUluZm9EQi5uYW1lcywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA8IDApCisKKyAgICAgICAgICAgIGlmIChpIDwgMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQgc3RhcnQgPSBab25lSW5mb0RCLnN0YXJ0c1tpXTsKICAgICAgICAgICAgIGxlbmd0aCA9IFpvbmVJbmZvREIubGVuZ3Roc1tpXTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaXMuc2tpcChzdGFydCk7CiAgICAgICAgIH0KIApAQCAtMjA5LDcgKzI2Miw2IEBACiAgICAgICAgIGludFtdIGdtdG9mZiA9IG5ldyBpbnRbbmdtdG9mZl07CiAgICAgICAgIGJ5dGVbXSBpc2RzdCA9IG5ldyBieXRlW25nbXRvZmZdOwogICAgICAgICBieXRlW10gYWJicmV2ID0gbmV3IGJ5dGVbbmdtdG9mZl07Ci0gICAgICAgIGludCBkc3RhYmJyZXYgPSAtMSwgc3RkYWJicmV2ID0gLTE7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmdtdG9mZjsgaSsrKSB7CiAgICAgICAgICAgICBnbXRvZmZbaV0gPSByZWFkNChkYXRhLCBiYXNlICsgNiAqIGkpOwogICAgICAgICAgICAgaXNkc3RbaV0gPSBkYXRhW2Jhc2UgKyA2ICogaSArIDRdOwpAQCAtMjE4LDEwICsyNzAsOSBAQAogCiAgICAgICAgIGJhc2UgKz0gNiAqIG5nbXRvZmY7CiAKLSAgICAgICAgcmV0dXJuIG5ldyBab25lSW5mbyhuYW1lLCB0cmFuc2l0aW9ucywgdHlwZSwgZ210b2ZmLCBpc2RzdCwgYWJicmV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGJhc2UpOworICAgICAgICByZXR1cm4gbmV3IFpvbmVJbmZvKG5hbWUsIHRyYW5zaXRpb25zLCB0eXBlLCBnbXRvZmYsIGlzZHN0LCBhYmJyZXYsIGRhdGEsIGJhc2UpOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIGludCByZWFkNChieXRlW10gZGF0YSwgaW50IG9mZikgewogICAgICAgICByZXR1cm4gKChkYXRhW29mZiAgICBdICYgMHhGRikgPDwgMjQpIHwKICAgICAgICAgICAgICAgICgoZGF0YVtvZmYgKyAxXSAmIDB4RkYpIDw8IDE2KSB8CkBAIC0yMjksMjEgKzI4MCw2IEBACiAgICAgICAgICAgICAgICAoKGRhdGFbb2ZmICsgM10gJiAweEZGKSA8PCAgMCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzY2FuRm9yWm9uZXMoRmlsZSBkaXIsIFNldCBzZXQsIGludCBpbmRleCkgewotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRpci5saXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZmlsZXMubGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIuZ2V0UGF0aCgpICsgIi8iICsgZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHNjYW5Gb3Jab25lcyhmLCBzZXQsIGluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICAgICAgICAgIHNldC5hZGQocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCiAgICAgcHVibGljIHN0YXRpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZShTdHJpbmcgaWQpIHsKICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoIkdNVCIpIHx8IGlkLmVxdWFscygiVVRDIikpIHsKQEAgLTI1Miw4ICsyODgsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0ejsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoIkdNVCIpKQorICAgICAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoIkdNVCIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNaW5pbWFsVGltZVpvbmUocGFyc2VOdW1lcmljWm9uZShpZCkgKiAxMDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIFRpbWVab25lIHR6ID0gWm9uZUluZm8uZ2V0VGltZVpvbmUoaWQpOwpAQCAtMjk1LDcgKzMzMiw4IEBACiAgICAgICAgIHJldHVybiB6b25lOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0KFRpbWVab25lIHpvbmUpIHsKKyAgICAvLyBUT0RPIC0gd2h5IGRvZXMgdGhpcyBpZ25vcmUgdGhlICd6b25lJyBwYXJhbWV0ZXI/CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRpbWVab25lIHpvbmUpIHsKICAgICAgICAgLyoKICAgICAgICAgICogaWYgKHpvbmUgPT0gbnVsbCksIHRoZSBuZXh0IGNhbGwgdG8gZ2V0RGVmYXVsdCB3aWxsIHNldCBpdCB0byB0aGUKICAgICAgICAgICogdGhlIHN5c3RlbSdzIGRlZmF1bHQgdGltZSB6b25lLgpAQCAtMzY2LDI0ICs0MDQsMzAgQEAKICAgICAgICAgICAgIHJhd09mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgIHNldElEKGdldERpc3BsYXlOYW1lKCkpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGdldE9mZnNldChpbnQgZXJhLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF5T2ZXZWVrLCBpbnQgbWlsbGlzKSB7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldE9mZnNldChpbnQgZXJhLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgZGF5T2ZXZWVrLCBpbnQgbWlsbGlzKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmF3T2Zmc2V0KCk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBnZXRSYXdPZmZzZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gcmF3T2Zmc2V0OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFJhd09mZnNldChpbnQgb2ZmKSB7CiAgICAgICAgICAgICByYXdPZmZzZXQgPSBvZmY7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGluRGF5bGlnaHRUaW1lKERhdGUgd2hlbikgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZURheWxpZ2h0VGltZSgpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2xhbmcvcmVmbGVjdC9HZW5lcmljU2lnbmF0dXJlUGFyc2VyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbGFuZy9yZWZsZWN0L0dlbmVyaWNTaWduYXR1cmVQYXJzZXIuamF2YQppbmRleCBjOTYzZGE4Li44MzUwNWUxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbGFuZy9yZWZsZWN0L0dlbmVyaWNTaWduYXR1cmVQYXJzZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbGFuZy9yZWZsZWN0L0dlbmVyaWNTaWduYXR1cmVQYXJzZXIuamF2YQpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlKSB7CiAgICAgICAgIHNldElucHV0KGdlbmVyaWNEZWNsLCBzaWduYXR1cmUpOwogICAgICAgICBpZiAoIWVvZikgewotICAgICAgICAgICAgcGFyc2VNZXRob2RUeXBlU2lnbmF0dXJlKGZhbHNlKTsKKyAgICAgICAgICAgIHBhcnNlTWV0aG9kVHlwZVNpZ25hdHVyZSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYoZ2VuZXJpY0RlY2wgaW5zdGFuY2VvZiBNZXRob2QpIHsKICAgICAgICAgICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIGdlbmVyaWNEZWNsOwpAQCAtMTcwLDcgKzE3MCw3IEBACiAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlKSB7CiAgICAgICAgIHNldElucHV0KGdlbmVyaWNEZWNsLCBzaWduYXR1cmUpOwogICAgICAgICBpZiAoIWVvZikgewotICAgICAgICAgICAgcGFyc2VNZXRob2RUeXBlU2lnbmF0dXJlKHRydWUpOworICAgICAgICAgICAgcGFyc2VNZXRob2RUeXBlU2lnbmF0dXJlKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZihnZW5lcmljRGVjbCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgYyA9IChDb25zdHJ1Y3RvcikgZ2VuZXJpY0RlY2w7CkBAIC0zODEsNyArMzgxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcGFyc2VNZXRob2RUeXBlU2lnbmF0dXJlKGJvb2xlYW4gaXNDb250cnVjdG9yKSB7CisgICAgdm9pZCBwYXJzZU1ldGhvZFR5cGVTaWduYXR1cmUoKSB7CiAgICAgICAgIC8vIE1ldGhvZFR5cGVTaWduYXR1cmUgOjo9IFtGb3JtYWxUeXBlUGFyYW1ldGVyc10gCiAgICAgICAgIC8vICAgICAgICAgIigiIHtUeXBlU2lnbmF0dXJlfSAiKSIgUmV0dXJuVHlwZSB7VGhyb3dzU2lnbmF0dXJlfS4KIApAQCAtMzk0LDkgKzM5NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgZXhwZWN0KCcpJyk7CiAKLSAgICAgICAgaWYgKCFpc0NvbnRydWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVyblR5cGUgPSBwYXJzZVJldHVyblR5cGUoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm5UeXBlID0gcGFyc2VSZXR1cm5UeXBlKCk7CiAKICAgICAgICAgZXhjZXB0aW9uVHlwZXMgPSBuZXcgTGlzdE9mVHlwZXMoOCk7CiAgICAgICAgIHdoaWxlIChzeW1ib2wgPT0gJ14nKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbmV0L1BsYWluU29ja2V0SW1wbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL25ldC9QbGFpblNvY2tldEltcGwuamF2YQppbmRleCBkZDU2ZGYyLi40ZmI4YjkxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbmV0L1BsYWluU29ja2V0SW1wbC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9uZXQvUGxhaW5Tb2NrZXRJbXBsLmphdmEKQEAgLTc2LDEwICs3Niw4IEBACiAKICAgICBwcm90ZWN0ZWQgSU5ldHdvcmtTeXN0ZW0gbmV0SW1wbCA9IFBsYXRmb3JtLmdldE5ldHdvcmtTeXN0ZW0oKTsKIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtZGVsZXRlLCBkZWxldGUgcmVhc29uOiBTb2NrZXRJbXBsIGhhcyByZWNlaXZlVGltZW91dCwKLSAgICAvLyBwdWJsaWMgaW50IHJlY2VpdmVUaW1lb3V0ID0gMDsKLSAgICAvLyBFTkQgYW5kb3JpZC1kZWxldGUKLSAgICAKKyAgICBwdWJsaWMgaW50IHJlY2VpdmVUaW1lb3V0ID0gMDsKKwogICAgIHB1YmxpYyBib29sZWFuIHN0cmVhbWluZyA9IHRydWU7CiAKICAgICBwdWJsaWMgYm9vbGVhbiBzaHV0ZG93bklucHV0OwpAQCAtMzA2LDEyICszMDQsMTIgQEAKICAgICAgICAgfQogICAgICAgICBuZXRJbXBsLmxpc3RlblN0cmVhbVNvY2tldChmZCwgYmFja2xvZyk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0T3B0aW9uKGludCBvcHRJRCwgT2JqZWN0IHZhbCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChvcHRJRCA9PSBTb2NrZXRPcHRpb25zLlNPX1RJTUVPVVQpIHsKICAgICAgICAgICAgIHJlY2VpdmVUaW1lb3V0ID0gKChJbnRlZ2VyKSB2YWwpLmludFZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG5ldEltcGwuc2V0U29ja2V0T3B0aW9uKGZkLCBvcHRJRCwgdmFsKTsKICAgICAgICAgICAgICAgICBpZiAob3B0SUQgPT0gU29ja2V0T3B0aW9ucy5UQ1BfTk9ERUxBWQpAQCAtMzI1LDcgKzMyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgIAorCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogc2F2ZSB0aGlzIHZhbHVlIGFzIGl0IGlzIGFjdHVhbGx5IHVzZWQgZGlmZmVyZW50bHkgZm9yIElQdjQgYW5kCiAgICAgICAgICAgICAgKiBJUHY2IHNvIHdlIGNhbm5vdCBnZXQgdGhlIHZhbHVlIHVzaW5nIHRoZSBnZXRPcHRpb24uIFRoZSBvcHRpb24KQEAgLTU0OCw5ICs1NDYsOSBAQAogICAgICAgICBpZiAoc2h1dGRvd25JbnB1dCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcmVhZCA9IG5ldEltcGwucmVjZWl2ZVN0cmVhbShmZCwgYnVmZmVyLCBvZmZzZXQsIGNvdW50LCByZWNlaXZlVGltZW91dCk7Ci0gICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCByZWFkID0gbmV0SW1wbC5yZWNlaXZlU3RyZWFtKGZkLCBidWZmZXIsIG9mZnNldCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVUaW1lb3V0KTsKICAgICAgICAgICAgIGlmIChyZWFkID09IC0xKSB7CiAgICAgICAgICAgICAgICAgc2h1dGRvd25JbnB1dCA9IHRydWU7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vQWJzdHJhY3RNZW1vcnlTcHkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9BYnN0cmFjdE1lbW9yeVNweS5qYXZhCmluZGV4IGZhZWM2NmYuLjEzMDQ1NGYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9BYnN0cmFjdE1lbW9yeVNweS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9BYnN0cmFjdE1lbW9yeVNweS5qYXZhCkBAIC02NywxMCArNjcsMTEgQEAKICAgICAgICAgQWRkcmVzc1dyYXBwZXIgd3JhcHBlcjsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICB3cmFwcGVyID0gbWVtb3J5SW5Vc2UucmVtb3ZlKGFkZHJlc3MpOwotCisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICBpZiAod3JhcHBlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmVmVG9TaGFkb3cucmVtb3ZlKHdyYXBwZXIud3JBZGRyZXNzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIH0KICAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmcmVlIG1lbW9yeSB3ZSBkaWRuJ3QgYWxsb2MKQEAgLTEwMiw2ICsxMDMsOCBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgb3JwaGFuZWRNZW1vcnkoUmVmZXJlbmNlIHJlZikgewogICAgICAgICBBZGRyZXNzV3JhcHBlciB3cmFwcGVyOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgUGxhdGZvcm1BZGRyZXNzIHNoYWRvdyA9IHJlZlRvU2hhZG93LnJlbW92ZShyZWYpOwogICAgICAgICAgICAgd3JhcHBlciA9IG1lbW9yeUluVXNlLmdldChzaGFkb3cpOwpAQCAtMTE1LDUgKzExOCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmVmLmNsZWFyKCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vSUZpbGVTeXN0ZW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9JRmlsZVN5c3RlbS5qYXZhCmluZGV4IGFjYmFiY2YuLmZiMmZmOWQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9JRmlsZVN5c3RlbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9JRmlsZVN5c3RlbS5qYXZhCkBAIC0xNSw2ICsxNSwxMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gYWRkcmVzcyBsZW5ndGggd2FzIGNoYW5nZWQgZnJvbSBsb25nIHRvIGludCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vSU1lbW9yeVN5c3RlbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL0lNZW1vcnlTeXN0ZW0uamF2YQppbmRleCBkYWQ3Y2FiLi5iNzY1YzdkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vSU1lbW9yeVN5c3RlbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9JTWVtb3J5U3lzdGVtLmphdmEKQEAgLTE1LDYgKzE1LDEwIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBhZGRyZXNzIGxlbmd0aCB3YXMgY2hhbmdlZCBmcm9tIGxvbmcgdG8gaW50IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9JTmV0d29ya1N5c3RlbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL0lOZXR3b3JrU3lzdGVtLmphdmEKaW5kZXggMzQ2Zjk5Zi4uOWY3MDUxNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL0lOZXR3b3JrU3lzdGVtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL0lOZXR3b3JrU3lzdGVtLmphdmEKQEAgLTE1LDYgKzE1LDEwIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBhZGRyZXNzIGxlbmd0aCB3YXMgY2hhbmdlZCBmcm9tIGxvbmcgdG8gaW50IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9NYXBwZWRQbGF0Zm9ybUFkZHJlc3MuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9NYXBwZWRQbGF0Zm9ybUFkZHJlc3MuamF2YQppbmRleCAwZDI0ZWFhLi40Nzk5OTMwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vTWFwcGVkUGxhdGZvcm1BZGRyZXNzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL01hcHBlZFBsYXRmb3JtQWRkcmVzcy5qYXZhCkBAIC0xMyw2ICsxMywxMSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKworLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBhZGRyZXNzIGxlbmd0aCB3YXMgY2hhbmdlZCBmcm9tIGxvbmcgdG8gaW50IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtOwogCiBwdWJsaWMgY2xhc3MgTWFwcGVkUGxhdGZvcm1BZGRyZXNzIGV4dGVuZHMgUGxhdGZvcm1BZGRyZXNzIHsKQEAgLTQ5LDQgKzU0LDkgQEAKICAgICBwdWJsaWMgZmluYWwgUGxhdGZvcm1BZGRyZXNzIG9mZnNldEJ5dGVzKGludCBvZmZzZXQpIHsKICAgICAgICAgcmV0dXJuIFBsYXRmb3JtQWRkcmVzc0ZhY3RvcnkubWFwT24ob3NhZGRyICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKICAgICB9CisgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgLy8gcHVibGljIGZpbmFsIFBsYXRmb3JtQWRkcmVzcyBvZmZzZXRCeXRlcyhsb25nIG9mZnNldCkgeworICAgIC8vICAgICByZXR1cm4gUGxhdGZvcm1BZGRyZXNzRmFjdG9yeS5tYXBPbihvc2FkZHIgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQpOworICAgIC8vIH0KKyAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vT1NDb21wb25lbnQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9PU0NvbXBvbmVudC5qYXZhCmluZGV4IDE0N2I2MDAuLmI1ZjE0ZjIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9PU0NvbXBvbmVudC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9PU0NvbXBvbmVudC5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtOwogCiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOworLy9CRUdJTiBhbmRyb2lkLWNoYW5nZWQKK2ltcG9ydCBkYWx2aWsuc3lzdGVtLlZNU3RhY2s7CisvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKIC8qKgogICogT1NDb21wb25lbnQKQEAgLTMwLDkgKzMyLDExIEBACiAgICAgICovCiAgICAgcHVibGljIE9TQ29tcG9uZW50KCkgewogICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoVk0uY2FsbGVyQ2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBpZiAoVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9PU0ZpbGVTeXN0ZW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9PU0ZpbGVTeXN0ZW0uamF2YQppbmRleCBlNjFmMTNjLi4yNzU5ZDZiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vT1NGaWxlU3lzdGVtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL09TRmlsZVN5c3RlbS5qYXZhCkBAIC0xLDIwICsxLDI0IEBACiAvKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCi0gKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGCi0gKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBhZGRyZXNzIGxlbmd0aCB3YXMgY2hhbmdlZCBmcm9tIGxvbmcgdG8gaW50IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKQEAgLTU3LDkgKzYxLDkgQEAKICAgICAgICAgICAgIGludCB0eXBlLCBib29sZWFuIHdhaXQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JhbnVsYXJpdHkgZm9yIHZpcnR1YWwgbWVtb3J5IGFsbG9jYXRpb24uIE5vdGUgdGhhdCB0aGlzCi0gICAgICogdmFsdWUgZm9yIFdpbmRvd3MgZGlmZmVycyBmcm9tIHRoZSBvbmUgZm9yIHRoZSBwYWdlIHNpemUgKDY0SyBhbmQgNEsKLSAgICAgKiByZXNwZWN0aXZlbHkpLgorICAgICAqIFJldHVybnMgdGhlIGdyYW51bGFyaXR5IGZvciB2aXJ0dWFsIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgICAqIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGZvciBXaW5kb3dzIGRpZmZlcnMgZnJvbSB0aGUgb25lIGZvciB0aGUKKyAgICAgKiBwYWdlIHNpemUgKDY0SyBhbmQgNEsgcmVzcGVjdGl2ZWx5KS4KICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGludCBnZXRBbGxvY0dyYW51bGFyaXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCkBAIC0yNDIsMTkgKzI0NiwxOCBAQAogICAgICAgICAgICAgRmlsZURlc2NyaXB0b3Igc29ja2V0RGVzY3JpcHRvciwgbG9uZyBvZmZzZXQsIGxvbmcgY291bnQpOwogCiAgICAgLy8gQkVHSU4gYW5kcm9pZC1kZWxldGVkCi0vLyAgICAgcHVibGljIGxvbmcgdHR5QXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLS8vICAgICAgICAgbG9uZyBuQ2hhciA9IHR0eUF2YWlsYWJsZUltcGwoKTsKLS8vICAgICAgICAgaWYgKG5DaGFyIDwgMCkgewotLy8gICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0vLyAgICAgICAgIH0KLS8vICAgICAgICAgcmV0dXJuIG5DaGFyOwotLy8gICAgIH0KLS8vCi0vLyAgICAgcHJpdmF0ZSBuYXRpdmUgbG9uZyB0dHlBdmFpbGFibGVJbXBsKCk7CisgICAgLy8gcHVibGljIGxvbmcgdHR5QXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyAgICAgbG9uZyBuQ2hhciA9IHR0eUF2YWlsYWJsZUltcGwoKTsKKyAgICAvLyAgICAgaWYgKG5DaGFyIDwgMCkgeworICAgIC8vICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CisgICAgLy8gICAgIH0KKyAgICAvLyAgICAgcmV0dXJuIG5DaGFyOworICAgIC8vIH0KKyAgICAvLworICAgIC8vIHByaXZhdGUgbmF0aXZlIGxvbmcgdHR5QXZhaWxhYmxlSW1wbCgpOwogICAgIC8vIEVORCBhbmRyb2lkLWRlbGV0ZWQKIAotICAgIHB1YmxpYyBsb25nIHR0eVJlYWQoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgbG9uZyB0dHlSZWFkKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbG9uZyBuQ2hhciA9IHR0eVJlYWRJbXBsKGJ5dGVzLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAobkNoYXIgPCAtMSkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL09TTWVtb3J5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vT1NNZW1vcnkuamF2YQppbmRleCA2NDZjYjYwLi5lM2U3YzQ2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vT1NNZW1vcnkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vT1NNZW1vcnkuamF2YQpAQCAtMTUsNiArMTUsMTAgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIGFkZHJlc3MgbGVuZ3RoIHdhcyBjaGFuZ2VkIGZyb20gbG9uZyB0byBpbnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm07CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNzgsNiArODIsOSBAQAogICAgICAgICBzdXBlcigpOwogICAgIH0KIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIGNoYW5nZWQgdG8gcHJpdmF0ZQorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJ5dGUgb3JkZXIgb2YgdGhpcyBtYWNoaW5lIGlzIGxpdHRsZSBlbmRpYW4gb3Igbm90Li4KICAgICAgKiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9PU05ldHdvcmtTeXN0ZW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9PU05ldHdvcmtTeXN0ZW0uamF2YQppbmRleCA4Yjk5ZDY2Li5jMTUzNDI4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vT1NOZXR3b3JrU3lzdGVtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL09TTmV0d29ya1N5c3RlbS5qYXZhCkBAIC0xNSw2ICsxNSwxMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gYWRkcmVzcyBsZW5ndGggd2FzIGNoYW5nZWQgZnJvbSBsb25nIHRvIGludCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CkBAIC0yNSw3ICsyOSw5IEBACiBpbXBvcnQgamF2YS5uZXQuU29ja2V0SW1wbDsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsOwotCisvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKy8vIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKKy8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIC8qCiAgKiAKICAqIFRoaXMgQ2xhc3MgaXMgdXNlZCBmb3IgbmF0aXZlIGNvZGUgd3JhcCwgdGhlIGltcGxlbWVudCBjbGFzcyBvZgpAQCAtMjgwLDcgKzI4Niw3IEBACiAgICAgLy8gICAgICAgICAgICAgdGltZW91dCk7CiAgICAgLy8gfQogICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKLSAgICAKKwogICAgIC8qCiAgICAgICogCiAgICAgICogQHBhcmFtIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL1BsYXRmb3JtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vUGxhdGZvcm0uamF2YQppbmRleCAxOGU5YTg0Li42OGQyNTE1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vUGxhdGZvcm0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vUGxhdGZvcm0uamF2YQpAQCAtMTYsOCArMTYsOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtOwogCi0KLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOworLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVN0YWNrOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKICAqIFBsYXRmb3JtCkBAIC00MCw5ICs0MSwxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWNjZXNzQ2hlY2soKSB7Ci0gICAgICAgIGlmIChWTS5jYWxsZXJDbGFzc0xvYWRlcigpICE9IG51bGwpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIGlmIChWTVN0YWNrLmdldENhbGxpbmdDbGFzc0xvYWRlcigpICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigpOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIElGaWxlU3lzdGVtIGdldEZpbGVTeXN0ZW0oKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vUGxhdGZvcm1BZGRyZXNzLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vUGxhdGZvcm1BZGRyZXNzLmphdmEKaW5kZXggYTE5ZWQyZi4uNDM3MDJiMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL1BsYXRmb3JtQWRkcmVzcy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9QbGF0Zm9ybUFkZHJlc3MuamF2YQpAQCAtMTUsNiArMTUsMTAgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIGFkZHJlc3MgbGVuZ3RoIHdhcyBjaGFuZ2VkIGZyb20gbG9uZyB0byBpbnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm07CiAKIApAQCAtNjksNiArNzMsMTIgQEAKICAgICAgICAgcmV0dXJuIFBsYXRmb3JtQWRkcmVzc0ZhY3Rvcnkub24ob3NhZGRyICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAvLyBwdWJsaWMgUGxhdGZvcm1BZGRyZXNzIG9mZnNldEJ5dGVzKGxvbmcgb2Zmc2V0KSB7CisgICAgLy8gICAgIHJldHVybiBQbGF0Zm9ybUFkZHJlc3NGYWN0b3J5Lm9uKG9zYWRkciArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7CisgICAgLy8gfQorICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1vdmVUbyhQbGF0Zm9ybUFkZHJlc3MgZGVzdCwgbG9uZyBudW1CeXRlcykgewogICAgICAgICBvc01lbW9yeS5tZW1tb3ZlKGRlc3Qub3NhZGRyLCBvc2FkZHIsIG51bUJ5dGVzKTsKICAgICB9CkBAIC0yNDAsOSArMjUwLDExIEBACiAgICAgICAgIHJldHVybiBvc01lbW9yeS5nZXREb3VibGUob3NhZGRyICsgb2Zmc2V0KTsKICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgcHVibGljIGZpbmFsIGludCB0b0ludCgpIHsKICAgICAgICAgcmV0dXJuIG9zYWRkcjsKICAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIHB1YmxpYyBmaW5hbCBsb25nIHRvTG9uZygpIHsKICAgICAgICAgcmV0dXJuIG9zYWRkcjsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9QbGF0Zm9ybUFkZHJlc3NGYWN0b3J5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvcGxhdGZvcm0vUGxhdGZvcm1BZGRyZXNzRmFjdG9yeS5qYXZhCmluZGV4IDgyZmJiZTMuLjVjMzE5ODAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9QbGF0Zm9ybUFkZHJlc3NGYWN0b3J5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL1BsYXRmb3JtQWRkcmVzc0ZhY3RvcnkuamF2YQpAQCAtMTMsNiArMTMsMTEgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gYWRkcmVzcyBsZW5ndGggd2FzIGNoYW5nZWQgZnJvbSBsb25nIHRvIGludCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9EZWxldGVPbkV4aXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL0RlbGV0ZU9uRXhpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2NkYmMxLi4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL0RlbGV0ZU9uRXhpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlT25FeGl0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBWZWN0b3I8U3RyaW5nPiBkZWxldGVMaXN0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBWTS5kZWxldGVPbkV4aXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmlsZShTdHJpbmcgdG9EZWxldGUpIHsKLSAgICAgICAgZGVsZXRlTGlzdC5hZGRFbGVtZW50KHRvRGVsZXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlT25FeGl0KCkgewotICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc29ydChkZWxldGVMaXN0LAotICAgICAgICAgICAgICAgIG5ldyBqYXZhLnV0aWwuQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzMi5sZW5ndGgoKSAtIHMxLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZXRlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBkZWxldGVMaXN0LmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIG5ldyBGaWxlKG5hbWUpLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvRXh0ZXJuYWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvRXh0ZXJuYWxNZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IDBlNGQzYTYuLmJjMTY4OGYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL0V4dGVybmFsTWVzc2FnZXMucHJvcGVydGllcworKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9FeHRlcm5hbE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTc3LDkgKzc3LDkgQEAKIEswMDU3PUhhcyB0aHJlYWRzCiBLMDA1OD1zaXplIG11c3QgYmUgPiAwCiBLMDA1OT1TdHJlYW0gaXMgY2xvc2VkCi0jIEJFR0lOIGFuZHJvaWQtZGVsZXRlZAotI0swMDVhPU1hcmsgaGFzIGJlZW4gaW52YWxpZGF0ZWQuCi0jIEVORCBhbmRyb2lkLWRlbGV0ZWQKKyMgLy8gQkVHSU4gYW5kcm9pZC1kZWxldGVkCisjIC8vIEswMDVhPU1hcmsgaGFzIGJlZW4gaW52YWxpZGF0ZWQuCisjIC8vIEVORCBhbmRyb2lkLWRlbGV0ZWQKIEswMDViPUJ1ZmZlcmVkUmVhZGVyIGlzIGNsb3NlZAogSzAwNWM9SW52YWxpZCBNYXJrLgogSzAwNWQ9V3JpdGVyIGlzIGNsb3NlZC4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL0luZXQ2VXRpbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvSW5ldDZVdGlsLmphdmEKaW5kZXggOGE3NGJiYy4uYjA2MmFlZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvSW5ldDZVdGlsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvSW5ldDZVdGlsLmphdmEKQEAgLTQ2OCw3ICs0NjgsNyBAQAogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgLy8gZ2VuZXJhbCB0ZXN0CiAgICAgICAgIGlmICghdmFsdWUubWF0Y2hlcygiXFxwe0RpZ2l0fSsoXFwuXFxwe0RpZ2l0fSspKiIpKSB7Ci0gICAgICAgIAlyZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IHZhbHVlLnNwbGl0KCJcXC4iKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL01zZy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvTXNnLmphdmEKaW5kZXggZTljYzQ0My4uMTU2MWRhNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvTXNnLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvTXNnLmphdmEKQEAgLTE4LDExICsxOCwxMyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsOwogCiAKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKIApAQCAtNDEsOSArNDMsMTAgQEAKICAqIAogICovCiBwdWJsaWMgY2xhc3MgTXNnIHsKLSAgICAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1Jlc291cmNlID0KICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuRXh0ZXJuYWxNZXNzYWdlcyI7CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIGEgbWVzc2FnZSB3aGljaCBoYXMgbm8gYXJndW1lbnRzLgpAQCAtNTMsMTAgKzU2LDEyIEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IE1zZ0hlbHAubG9hZEJ1bmRsZShzUmVzb3VyY2UpOwogICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcobXNnKTsKICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKQEAgLTEyOSw3ICsxMzQsOSBAQAogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnLCBPYmplY3RbXSBhcmdzKSB7CiAgICAgICAgIFN0cmluZyBmb3JtYXQgPSBtc2c7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gTXNnSGVscC5sb2FkQnVuZGxlKHNSZXNvdXJjZSk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBmb3JtYXQgPSBidW5kbGUuZ2V0U3RyaW5nKG1zZyk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Nc2dIZWxwLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Nc2dIZWxwLmphdmEKaW5kZXggMThkOGNhYS4uYjBkNDMyMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvTXNnSGVscC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL01zZ0hlbHAuamF2YQpAQCAtMTgsMTYgKzE4LDIwIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWw7CiAKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOworLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVN0YWNrOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKICAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgZm9yIGxvYWRpbmcgcmVzb3VyY2UgYnVuZGxlcyBhbmQKQEAgLTM1LDM1ICszOSwxMSBAQAogICovCiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBNc2dIZWxwIHsKLSAgICAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgLy8gQSBIYXNoTWFwIG1hcHBpbmcgYSByZXNvdXJjZSBuYW1lIHRvIGEgU29mdFJlZmVyZW5jZSB0byBhIFJlc291cmNlQnVuZGxlCiAgICAgLy8gaG9sZGluZyB0aGUgbWVzc2FnZXMgZm9yIHRoYXQgcmVzb3VyY2UuCiAgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFNvZnRSZWZlcmVuY2U8UmVzb3VyY2VCdW5kbGU+PiBzUmVmTWFwID0gbnVsbDsKICAgICAKLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSBsb2NhbGUgb2YgdGhlIG1lc3NhZ2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIExvY2FsZSB0aGUgbG9jYWxlIHRvIGNoYW5nZSB0by4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFJlc291cmNlQnVuZGxlIHNldExvY2FsZShmaW5hbCBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIgPSBWTS5ib290Q2FsbGVyQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIHJldHVybiAoUmVzb3VyY2VCdW5kbGUpIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxPYmplY3Q+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZSwgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyICE9IG51bGwgPyBsb2FkZXIgOiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGxvYWRCdW5kbGUoU3RyaW5nIHJlc291cmNlKSB7CiAgICAgICAgIGlmIChzUmVmTWFwID09IG51bGwpIHsKICAgICAgICAgICAgIHNSZWZNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNvZnRSZWZlcmVuY2U8UmVzb3VyY2VCdW5kbGU+PigpOwpAQCAtMTExLDYgKzkxLDcgQEAKIAogICAgICAgICByZXR1cm4gZm9ybWF0KGZvcm1hdCwgYXJncyk7CiAgICAgfQorICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICAvKioKICAgICAgKiBHZW5lcmF0ZXMgYSBmb3JtYXR0ZWQgdGV4dCBzdHJpbmcgZ2l2ZW4gYSBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5pbmcKQEAgLTE3Niw0ICsxNTcsMzIgQEAKICAgICAgICAgICAgIGFuc3dlci5hcHBlbmQoZm9ybWF0LnN1YnN0cmluZyhsYXN0SSwgZm9ybWF0Lmxlbmd0aCgpKSk7CiAgICAgICAgIHJldHVybiBhbnN3ZXIudG9TdHJpbmcoKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBsb2NhbGUgb2YgdGhlIG1lc3NhZ2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIExvY2FsZSB0aGUgbG9jYWxlIHRvIGNoYW5nZSB0by4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIFJlc291cmNlQnVuZGxlIHNldExvY2FsZShmaW5hbCBMb2NhbGUgbG9jYWxlLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgICAgIC8vIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciA9IFZNLmJvb3RDYWxsZXJDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAgICAgcmV0dXJuIChSZXNvdXJjZUJ1bmRsZSkgQWNjZXNzQ29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlLCBsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbWlzYy9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbWlzYy9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQppbmRleCA1Mzc2ZWUzLi4xMjg1NDViIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L21pc2MvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9taXNjL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCkBAIC0zMSw4ICszMSw5IEBACiBpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOworLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2dIZWxwOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKICAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHN0cmluZ3MgZnJvbSBhIHJlc291cmNlIGJ1bmRsZSBhbmQgcmV0dXJucyB0aGVtLApAQCAtNDksMTAgKzUwLDExIEBACiAgKiAKICAqLwogcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLSAgICAKKworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzUmVzb3VyY2UgPQogICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIC8qKgogICAgICAqIFJldHJpZXZlcyBhIG1lc3NhZ2Ugd2hpY2ggaGFzIG5vIGFyZ3VtZW50cy4KICAgICAgKiAKQEAgLTYxLDcgKzYzLDkgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4LDYgKzEzMiwxMiBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2csIGFyZ3MpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gRHVwbGljYXRlIGNvZGUgd2FzIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgTXNnSGVscC4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9jYmlnaW50LmggYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9jYmlnaW50LmgKaW5kZXggN2Q2YzAwMS4uMjIwYWJhOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvY2JpZ2ludC5oCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2NiaWdpbnQuaApAQCAtMTksOCArMTksNiBAQAogI2RlZmluZSBjYmlnaW50X2gKICNpbmNsdWRlICJmbHRjb25zdC5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKLS8vI2luY2x1ZGUgImpuaS5oIgotLy8jaW5jbHVkZSAidm1pLmgiCiAjZGVmaW5lIExPV19VMzJfRlJPTV9WQVIodTY0KSAgICAgTE9XX1UzMl9GUk9NX0xPTkc2NCh1NjQpCiAjZGVmaW5lIExPV19VMzJfRlJPTV9QVFIodTY0cHRyKSAgTE9XX1UzMl9GUk9NX0xPTkc2NF9QVFIodTY0cHRyKQogI2RlZmluZSBISUdIX1UzMl9GUk9NX1ZBUih1NjQpICAgIEhJR0hfVTMyX0ZST01fTE9ORzY0KHU2NCkKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2NvbW1vbkRibFBhcmNlLmMgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9jb21tb25EYmxQYXJjZS5jCmluZGV4IGEyMGFhMmUuLjVkODU2NDUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2NvbW1vbkRibFBhcmNlLmMKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvY29tbW9uRGJsUGFyY2UuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgImNvbW1vbkRibFBhcmNlLmgiCi0jaW5jbHVkZSAiZXhjZXB0aW9ucy5oIgogI2luY2x1ZGUgImNiaWdpbnQuaCIKIAogCkBAIC0xMDIsOSArMTAxLDYgQEAKICAgICAgICAgfSBcCiAgICAgfQogCi0vLz8/PyBVdGlsOiBkb24ndCB3YW50IHBvcnRhYmxpbGl0eSBsYXllci4KLS8vI2RlZmluZSBhbGxvY2F0ZVU2NCh4LCBuKSBpZiAoISgoeCkgPSAoVV82NCopIGh5bWVtX2FsbG9jYXRlX21lbW9yeSgobikgKiBzaXplb2YoVV82NCkpKSkgZ290byBPdXRPZk1lbW9yeTsKLS8vI2RlZmluZSByZWxlYXNlKHIpIGlmICgocikpIGh5bWVtX2ZyZWVfbWVtb3J5KChyKSk7CiAjZGVmaW5lIGFsbG9jYXRlVTY0KHgsIG4pIGlmICghKCh4KSA9IChVXzY0KikgbWFsbG9jKChuKSAqIHNpemVvZihVXzY0KSkpKSBnb3RvIE91dE9mTWVtb3J5OwogI2RlZmluZSByZWxlYXNlKHIpIGlmICgocikpIGZyZWUoKHIpKTsKIApAQCAtMjkxLDkgKzI4NywxNCBAQAogICAgICAgICAgZmlyc3QgYW5kIGxldCBpdCBmYWxsIHRvIHplcm8gaWYgbmVlZCBiZS4gKi8KIAogICAgICAgaWYgKHJlc3VsdCA9PSAwLjApCi0gICAgICAgIERPVUJMRV9UT19MT05HQklUUyAocmVzdWx0KSA9IE1JTklNVU1fTE9OR0JJVFM7CisgICAgICAgIHsKKyAgICAgICAgICBET1VCTEVfVE9fTE9OR0JJVFMgKHJlc3VsdCkgPSBNSU5JTVVNX0xPTkdCSVRTOworICAgICAgICB9CiAgICAgICBlbHNlCi0gICAgICAgIERPVUJMRV9UT19MT05HQklUUyAocmVzdWx0KSA9IElORklOSVRFX0xPTkdCSVRTOworICAgICAgICB7CisgICAgICAgICAgRE9VQkxFX1RPX0xPTkdCSVRTIChyZXN1bHQpID0gSU5GSU5JVEVfTE9OR0JJVFM7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQogICAgIH0KICAgZWxzZSBpZiAoZSA+IEFQUFJPWF9NSU5fTUFHTklUVURFKQogICAgIHsKQEAgLTQyOCw4ICs0MjksNiBAQAogICBJREFUQSBrLCBjb21wYXJpc29uLCBjb21wYXJpc29uMjsKICAgVV82NCAqeCwgKnksICpELCAqRDI7CiAgIElEQVRBIHhMZW5ndGgsIHlMZW5ndGgsIERMZW5ndGgsIEQyTGVuZ3RoLCBkZWNBcHByb3hDb3VudCwgaW5jQXBwcm94Q291bnQ7Ci0gIC8vPz8/IFV0aWw6IHBvcnRhYmlsaXR5IGxheWVyOiBvdXQuCi0gIC8vUE9SVF9BQ0NFU1NfRlJPTV9FTlYgKGVudik7CiAKICAgeCA9IHkgPSBEID0gRDIgPSAwOwogICB4TGVuZ3RoID0geUxlbmd0aCA9IERMZW5ndGggPSBEMkxlbmd0aCA9IDA7CkBAIC00NDEsOCArNDQwLDYgQEAKICAgICAgIGsgPSBkb3VibGVFeHBvbmVudCAoeik7CiAKICAgICAgIGlmICh4ICYmIHggIT0gZikKLS8vPz8/IFV0aWw6IG5vdCB1c2luZyBwb3J0YWJpbGl0eSBsYXllcgotLy8gICAgICAgIGpjbG1lbV9mcmVlX21lbW9yeSAoZW52LCB4KTsKICAgICAgICAgICBmcmVlKHgpOwogCiAgICAgICByZWxlYXNlICh5KTsKQEAgLTU4OSw4ICs1ODYsNiBAQAogICB3aGlsZSAoMSk7CiAKICAgaWYgKHggJiYgeCAhPSBmKQotLy8/Pz8gVXRpbDogbm90IHVzaW5nIHBvcnRhYmlsaXR5IGxheWVyCi0vLyAgICBqY2xtZW1fZnJlZV9tZW1vcnkgKGVudiwgeCk7CiAgICAgIGZyZWUoeCk7CiAgIHJlbGVhc2UgKHkpOwogICByZWxlYXNlIChEKTsKQEAgLTU5OSw4ICs1OTQsNiBAQAogCiBPdXRPZk1lbW9yeToKICAgaWYgKHggJiYgeCAhPSBmKQotLy8/Pz8gVXRpbDogbm90IHVzaW5nIHBvcnRhYmlsaXR5IGxheWVyCi0vLyAgICBqY2xtZW1fZnJlZV9tZW1vcnkgKGVudiwgeCk7CiAgICAgICBmcmVlKHgpOwogICByZWxlYXNlICh5KTsKICAgcmVsZWFzZSAoeSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9leGNlcHRpb25zLmMgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9leGNlcHRpb25zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDMyMTEuLjAwMDAwMDAKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvZXhjZXB0aW9ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImV4Y2VwdGlvbnMuaCIKLQotdm9pZCB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShKTklFbnYqIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSkKLXsKLSAgamNsYXNzIGV4Y2VwdGlvbkNsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCBuYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbkNsYXNzID09IE5VTEwpIHsgCi0gICAgLyogSnVzdCByZXR1cm4gaWYgd2UgY2FuJ3QgbG9hZCB0aGUgZXhjZXB0aW9uIGNsYXNzLiAqLwotICAgIHJldHVybjsKLSAgfQotICAoKmVudiktPlRocm93TmV3KGVudiwgZXhjZXB0aW9uQ2xhc3MsIG1lc3NhZ2UpOwotfSAgCi0KLS8qKgotICAqIFRocm93IGphdmEuaW8uSU9FeGNlcHRpb24gd2l0aCB0aGUgbWVzc2FnZSBwcm92aWRlZAotICAqLwotdm9pZCB0aHJvd0phdmFJb0lPRXhjZXB0aW9uKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXNzYWdlKQotewotICB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShlbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgbWVzc2FnZSk7Ci19Ci0KLS8qKgotICAqIFRocm93IGphdmEuaW8uSU9FeGNlcHRpb24gd2l0aCB0aGUgIkZpbGUgY2xvc2VkIiBtZXNzYWdlCi0gICogQ29uc29saWRhdGUgYWxsIHRocm91Z2ggaGVyZSBzbyBtZXNzYWdlIGlzIGNvbnNpc3RlbnQuCi0gICovCi12b2lkIHRocm93SmF2YUlvSU9FeGNlcHRpb25DbG9zZWQoSk5JRW52KiBlbnYpCi17Ci0gIHRocm93SmF2YUlvSU9FeGNlcHRpb24oZW52LCAiRmlsZSBjbG9zZWQiKTsKLX0KLQotLyoqCi0gICogVGhyb3cgamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgKi8KLXZvaWQgdGhyb3dJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKEpOSUVudiogZW52KQotewotICB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShlbnYsICJqYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsICIiKTsKLX0KLQotLyoqCi0gICogVGhyb3cgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIHdpdGggdGhlIG1lc3NhZ2UgcHJvdmlkZWQKLSAgKiBOb3RlOiBUaGlzIGlzIG5vdCBuYW1lZCB0aHJvd051bGxQb2ludGVyRXhjZXB0aW9uIGJlY2F1c2UgaXQgY29uZmxpY3RzCi0gICogd2l0aCBhIFZNIGZ1bmN0aW9uIG9mIHRoYXQgc2FtZSBuYW1lIGFuZCB0aGlzIGNhdXNlcyBwcm9ibGVtcyBvbgotICAqIHNvbWUgcGxhdGZvcm1zLgotICAqLwotdm9pZCB0aHJvd05QRXhjZXB0aW9uKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXNzYWdlKQotewotICB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShlbnYsICJqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBtZXNzYWdlKTsKLX0KLQotLyoqCi0gICogVGhyb3cgamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3IKLSAgKi8KLXZvaWQgdGhyb3dOZXdPdXRPZk1lbW9yeUVycm9yKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXNzYWdlKQotewotICB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShlbnYsICJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIsIG1lc3NhZ2UpOwotfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvZXhjZXB0aW9ucy5oIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvZXhjZXB0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJmYzc0Li4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2V4Y2VwdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRVhDRVBUSU9OU19ICi0jZGVmaW5lIEVYQ0VQVElPTlNfSAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0vLyNpbmNsdWRlICJ2bWkuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShKTklFbnYqIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSk7Ci12b2lkIHRocm93TmV3T3V0T2ZNZW1vcnlFcnJvcihKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWVzc2FnZSk7Ci12b2lkIHRocm93SmF2YUlvSU9FeGNlcHRpb24oSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOwotdm9pZCB0aHJvd0phdmFJb0lPRXhjZXB0aW9uQ2xvc2VkKEpOSUVudiogZW52KTsKLXZvaWQgdGhyb3dOUEV4Y2VwdGlvbihKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWVzc2FnZSk7Ci12b2lkIHRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihKTklFbnYqIGVudik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9pb19GaWxlLmMgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2lvX0ZpbGUuYwppbmRleCA1NzVjNDNjLi5iZjg5NjgxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2lvX0ZpbGUuYworKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2lvX0ZpbGUuYwpAQCAtMTMwLDcgKzEzMCw2IEBACiAgICAgY2MgPSB1bmxpbmsocGF0aENvcHkpOwogICAgIGlmKGNjIDwgMCkgewogICAgICAgICBpbnQgZXJyID0gZXJybm87Ci0gICAgICAgIExPR0QoIiB1bmFibGUgdG8gdW5saW5rICclcycgKGVycm5vPSVkKVxuIiwgcGF0aENvcHksIGVycik7CiAKICAgICAgICAgLyoKICAgICAgICAgICogQWNjb3JkaW5nIHRvIHRoZSBtYW4gcGFnZXMsIExpbnV4IHVzZXMgRUlTRElSIGFuZCBNYWMgT1MgWApAQCAtMTQzLDkgKzE0MiwxMiBAQAogICAgICAgICAgICAgY2MgPSBybWRpcihwYXRoQ29weSk7CiAgICAgICAgICAgICBpZihjYyA8IDApIHsKICAgICAgICAgICAgICAgICAvKiBwcm9iYWJseSBFTk9URU1QVFkgKi8KLSAgICAgICAgICAgICAgICBMT0dEKCIgICB1bmFibGUgdG8gcm1kaXIgJyVzJyAoZXJybm89JWQpXG4iLAotICAgICAgICAgICAgICAgICAgICBwYXRoQ29weSwgZXJybm8pOworICAgICAgICAgICAgICAgIExPR0QoInVuYWJsZSB0byBybWRpciAnJXMnOiAlcyAoZXJybm89JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBwYXRoQ29weSwgc3RyZXJyb3IoZXJyKSwgZXJyKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoInVuYWJsZSB0byB1bmxpbmsgJyVzJzogJXMgKGVycm5vPSVkKVxuIiwgCisgICAgICAgICAgICAgICAgICAgIHBhdGhDb3B5LCBzdHJlcnJvcihlcnIpLCBlcnIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNjEsNiArMzYzLDggQEAKICAgICByZXR1cm4gY2MgPT0gMDsKIH0KIAorLy8gQkVHSU4gYW5kcm9pZC1kZWxldGVkCisjaWYgMAogc3RhdGljIGpib29sZWFuIGphdmFfaW9fRmlsZV9pc1JlYWRPbmx5SW1wbChKTklFbnYqIGVudiwgam9iamVjdCByZWN2LCAKICAgICAgICAgamJ5dGVBcnJheSBwYXRoKSB7CiAKQEAgLTM3NCw2ICszNzgsOCBAQAogICAgIHJldHVybiAoIWphdmFfaW9fRmlsZV9yZWFkYWJsZShlbnYsIHJlY3YsIHBhdGgpIAogICAgICAgICAgICAgJiYgamF2YV9pb19GaWxlX3dyaXRhYmxlKGVudiwgcmVjdiwgcGF0aCkpOwogfQorI2VuZGlmCisvLyBFTkQgYW5kcm9pZC1kZWxldGVkCiAKIHN0YXRpYyBqYnl0ZUFycmF5IGphdmFfaW9fRmlsZV9nZXRMaW5rSW1wbChKTklFbnYqIGVudiwgam9iamVjdCByZWN2LCAKICAgICAgICAgamJ5dGVBcnJheSBwYXRoKSB7CkBAIC02NzQsOCArNjgwLDEwIEBACiAgICAgeyAiaXNEaXJlY3RvcnlJbXBsIiwgICAgIihbQilaIiwgICh2b2lkKikgamF2YV9pb19GaWxlX2lzRGlyZWN0b3J5SW1wbCB9LAogICAgIHsgImlzRmlsZUltcGwiLCAgICAgICAgICIoW0IpWiIsICAodm9pZCopIGphdmFfaW9fRmlsZV9pc0ZpbGVJbXBsIH0sCiAgICAgeyAiaXNIaWRkZW5JbXBsIiwgICAgICAgIihbQilaIiwgICh2b2lkKikgamF2YV9pb19GaWxlX2lzSGlkZGVuSW1wbCB9LAotICAgIHsgImlzUmVhZE9ubHlJbXBsIiwgICAgICIoW0IpWiIsICAodm9pZCopIGphdmFfaW9fRmlsZV9pc1JlYWRPbmx5SW1wbCB9LAotICAgIHsgImlzV3JpdGVPbmx5SW1wbCIsICAgICIoW0IpWiIsICAodm9pZCopIGphdmFfaW9fRmlsZV9pc1dyaXRlT25seUltcGwgfSwKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICB7ICJpc1JlYWRhYmxlSW1wbCIsICAgICAiKFtCKVoiLCAgKHZvaWQqKSBqYXZhX2lvX0ZpbGVfcmVhZGFibGUgfSwKKyAgICB7ICJpc1dyaXRlYWJsZUltcGwiLCAgICAiKFtCKVoiLCAgKHZvaWQqKSBqYXZhX2lvX0ZpbGVfd3JpdGFibGUgfSwKKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgeyAiZ2V0TGlua0ltcGwiLCAgICAgICAgIihbQilbQiIsICh2b2lkKikgamF2YV9pb19GaWxlX2dldExpbmtJbXBsIH0sCiAgICAgeyAibGFzdE1vZGlmaWVkSW1wbCIsICAgIihbQilKIiwgICh2b2lkKikgamF2YV9pb19GaWxlX2xhc3RNb2RpZmllZEltcGwgfSwKICAgICB7ICJzZXRSZWFkT25seUltcGwiLCAgICAiKFtCKVoiLCAgKHZvaWQqKSBqYXZhX2lvX0ZpbGVfc2V0UmVhZE9ubHlJbXBsIH0sCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfcmVmbGVjdF9Qcm94eS5jIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9sYW5nX3JlZmxlY3RfUHJveHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1MmNmMS4uMDAwMDAwMAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfcmVmbGVjdF9Qcm94eS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW5jbHVkZSAiSk5JSGVscC5oIgotCi0jaWYgMCAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAotCi1zdGF0aWMgamNsYXNzIGphdmFfbGFuZ19yZWZsZWN0X2RlZmluZUNsYXNzSW1wbChKTklFbnYgKiBlbnYsIAotICAgICAgICBqY2xhc3MgcmVjdkNsYXNzLCBqb2JqZWN0IGNsYXNzTG9hZGVyLCBqc3RyaW5nIGNsYXNzTmFtZSwgCi0gICAgICAgIGpieXRlQXJyYXkgY2xhc3NCeXRlcykgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgamJ5dGUgKmJ5dGVzOwotICAgIGpjbGFzcyByZXR1cm5DbGFzczsKLSAgICBqaW50IGxlbmd0aDsKLQotICAgIG5hbWUgPSAoKmVudiktPkdldFN0cmluZ1VURkNoYXJzIChlbnYsIGNsYXNzTmFtZSwgTlVMTCk7Ci0gICAgaWYgKCFuYW1lKQotICAgIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1ZpcnR1YWxNYWNoaW5lRXJyb3IiLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfTsKLSAgICBieXRlcyA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMgKGVudiwgY2xhc3NCeXRlcywgTlVMTCk7Ci0gICAgaWYgKCFieXRlcykKLSAgICB7Ci0gICAgICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzIChlbnYsIGNsYXNzTmFtZSwgbmFtZSk7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9WaXJ0dWFsTWFjaGluZUVycm9yIiwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBsZW5ndGggPSAoKmVudiktPkdldEFycmF5TGVuZ3RoIChlbnYsIGNsYXNzQnl0ZXMpOwotCi0gICAgcmV0dXJuQ2xhc3MgPSAoKmVudiktPkRlZmluZUNsYXNzIChlbnYsIG5hbWUsIGNsYXNzTG9hZGVyLCBieXRlcywgbGVuZ3RoKTsKLQotICAgICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzIChlbnYsIGNsYXNzQnl0ZXMsIGJ5dGVzLCBKTklfQ09NTUlUKTsKLSAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyAoZW52LCBjbGFzc05hbWUsIG5hbWUpOwotICAgIHJldHVybiByZXR1cm5DbGFzczsKLX0KLQotLyoKLSAqIEpOSSByZWdpc3RyYXRpb24KLSAqLwotc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewotICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwotICAgIHsgImRlZmluZUNsYXNzSW1wbCIsIAotICAgICAgICAgICAgIihMamF2YS9sYW5nL0NsYXNzTG9hZGVyO0xqYXZhL2xhbmcvU3RyaW5nO1tCKUxqYXZhL2xhbmcvQ2xhc3M7IiwgIAotICAgICAgICAgICAgKHZvaWQqKSBqYXZhX2xhbmdfcmVmbGVjdF9kZWZpbmVDbGFzc0ltcGwgfQotfTsKLQotaW50IHJlZ2lzdGVyX2phdmFfbGFuZ19yZWZsZWN0X1Byb3h5KEpOSUVudiogZW52KQotewotICAgIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiamF2YS9sYW5nL3JlZmxlY3QvUHJveHkiLAotICAgICAgICAgICAgICAgIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOwotfQotCi0jZW5kaWYgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfbmV0X0luZXRBZGRyZXNzLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfbmV0X0luZXRBZGRyZXNzLmNwcAppbmRleCA4Y2YwYzViLi42NDE2NWIxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX25ldF9JbmV0QWRkcmVzcy5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9uZXRfSW5ldEFkZHJlc3MuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvYWRiX25ldHdvcmtpbmcuaD4KQEAgLTY3LDIwICs2OCwyMCBAQAogICAgICAgICB0aHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICBqYm9vbGVhbiByZXQ7CiAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZVN0ciwgTlVMTCk7CiAKICAgICBjaGFyIHVzZUFkYk5ldHdvcmtpbmdQcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGNoYXIgYWRiQ29ubmVjdGVkW1BST1BFUlRZX1ZBTFVFX01BWF07CiAKLSAgICBwcm9wZXJ0eV9nZXQgKCJhbmRyb2lkLm5ldC51c2UtYWRiLW5ldHdvcmtpbmciLCAKKyAgICBwcm9wZXJ0eV9nZXQgKCJhbmRyb2lkLm5ldC51c2UtYWRiLW5ldHdvcmtpbmciLAogICAgICAgICAgICAgdXNlQWRiTmV0d29ya2luZ1Byb3BlcnR5LCAiIik7CiAKLSAgICBwcm9wZXJ0eV9nZXQgKCJhZGIuY29ubmVjdGVkIiwgCisgICAgcHJvcGVydHlfZ2V0ICgiYWRiLmNvbm5lY3RlZCIsCiAgICAgICAgICAgICBhZGJDb25uZWN0ZWQsICIiKTsKIAotICAgIGlmICgoc3RybGVuKHVzZUFkYk5ldHdvcmtpbmdQcm9wZXJ0eSkgPiAwKSAKKyAgICBpZiAoKHN0cmxlbih1c2VBZGJOZXR3b3JraW5nUHJvcGVydHkpID4gMCkKICAgICAgICAgICAgICYmIChzdHJsZW4oYWRiQ29ubmVjdGVkKSA+IDApICkgewogICAgICAgICAvLyBBbnkgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZSBmb3IgdXNlLWFkYi1uZXR3b3JraW5nIGlzIGNvbnNpZGVyZWQgInNldCIKICAgICAgICAgdW5pb24gewpAQCAtOTIsOCArOTMsOCBAQAogICAgICAgICBpbnQgZXJyOwogICAgICAgICBlcnIgPSBhZGJfbmV0d29ya2luZ19nZXRob3N0YnluYW1lKG5hbWUsICYob3V0YWRkci5hKSk7CiAjaWYgMAotICAgICAgICBMT0dJKCJBREIgbmV0d29ya2luZzogLWdldGhvc3RieW5hbWUgZXJyICVkIGFkZHIgMHglMDh4ICV1LiV1LiV1LiV1IiwgCi0gICAgICAgICAgICAgICAgZXJyLCAodW5zaWduZWQgaW50KW91dGFkZHIuYS5zX2FkZHIsIAorICAgICAgICBMT0dJKCJBREIgbmV0d29ya2luZzogLWdldGhvc3RieW5hbWUgZXJyICVkIGFkZHIgMHglMDh4ICV1LiV1LiV1LiV1IiwKKyAgICAgICAgICAgICAgICBlcnIsICh1bnNpZ25lZCBpbnQpb3V0YWRkci5hLnNfYWRkciwKICAgICAgICAgICAgICAgICBvdXRhZGRyLmpbMF0sb3V0YWRkci5qWzFdLAogICAgICAgICAgICAgICAgIG91dGFkZHIualsyXSxvdXRhZGRyLmpbM10pOwogI2VuZGlmCkBAIC0xMDIsMTcgKzEwMywyMyBAQAogICAgICAgICAgICAgcmV0ID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oYWRkciwgMCwgNCwgb3V0YWRkci5qKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFkZHIsIDAsIDQsIG91dGFkZHIuaik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBub3JtYWwgY2FzZS4uLm5vIGFkYiBuZXR3b3JraW5nCiAgICAgICAgIHN0cnVjdCBob3N0ZW50KiBlbnQgPSBnZXRob3N0YnluYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZW50ICE9IE5VTEwgICYmIGVudC0+aF9sZW5ndGggPiAwKSB7CisKKyAgICAgICAgaWYgKGVudCAhPSBOVUxMICYmIGVudC0+aF9sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICBqYnl0ZSB2WzRdOwogICAgICAgICAgICAgbWVtY3B5KHYsIGVudC0+aF9hZGRyLCA0KTsKICAgICAgICAgICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFkZHIsIDAsIDQsIHYpOwogICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFQUNDRVMpIHsKKyAgICAgICAgICAgIC8qIE5vIHBlcm1pc3Npb24gdG8gdXNlIG5ldHdvcmsgKi8KKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGVudiwgImphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJQZXJtaXNzaW9uIGRlbmllZCAobWF5YmUgbWlzc2luZyBJTlRFUk5FVCBwZXJtaXNzaW9uKSIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0ID0gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV9sdW5pX3BsYXRmb3JtX09TTmV0d29ya1N5c3RlbS5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9vcmdfYXBhY2hlX2hhcm1vbnlfbHVuaV9wbGF0Zm9ybV9PU05ldHdvcmtTeXN0ZW0uY3BwCmluZGV4IGFlNGZjYzMuLjdhZmI1NGUgMTAwNzU1Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV9sdW5pX3BsYXRmb3JtX09TTmV0d29ya1N5c3RlbS5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvb3JnX2FwYWNoZV9oYXJtb255X2x1bmlfcGxhdGZvcm1fT1NOZXR3b3JrU3lzdGVtLmNwcApAQCAtMjE4LDEyICsyMTgsMTAgQEAKICAgICBtZW1zZXQoYWRkcmVzcywgMCwgc2l6ZW9mKGFkZHJlc3MpKTsKIAogICAgIGlmIChqYXZhX2FkZHJlc3MgPT0gTlVMTCkgewotICAgICAgICB0aHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBpZiAoZW52LT5HZXRBcnJheUxlbmd0aChqYXZhX2FkZHJlc3MpICE9IHNpemVvZihhZGRyZXNzLT5zX2FkZHIpKSB7Ci0gICAgICAgIHRocm93SU9FeGNlcHRpb25TdHIoZW52LCAiaW5fYWRkciBpbmNvcnJlY3Qgc2l6ZSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0yNDgsMTIgKzI0NiwxMCBAQAogICAgICAgICBKTklFbnYgKmVudiwgc3RydWN0IGluX2FkZHIgKmFkZHJlc3MsIGpieXRlQXJyYXkgamF2YV9hZGRyZXNzKSB7CiAKICAgICBpZiAoamF2YV9hZGRyZXNzID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgaWYgKGVudi0+R2V0QXJyYXlMZW5ndGgoamF2YV9hZGRyZXNzKSAhPSBzaXplb2YoYWRkcmVzcy0+c19hZGRyKSkgewotICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC01NjIsNyArNTU4LDcgQEAKICAgICAgICAgY2FzZSBTT0NLRVJSX0VQSVBFOgogICAgICAgICAgICAgcmV0dXJuICJCcm9rZW4gcGlwZSI7CiAgICAgICAgIGNhc2UgU09DS0VSUl9FQUNDRVM6Ci0gICAgICAgICAgICByZXR1cm4gIlBlcm1pc3Npb25zIGRvIG5vdCBhbGxvdyBhY3Rpb24gb24gc29ja2V0IjsKKyAgICAgICAgICAgIHJldHVybiAiUGVybWlzc2lvbiBkZW5pZWQgKG1heWJlIG1pc3NpbmcgSU5URVJORVQgcGVybWlzc2lvbikiOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHNvY2tldCBlcnJvciAlZCIsIGFuRXJyb3JOdW0pOwpAQCAtNjEyLDYgKzYwOCwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIFNPQ0tFUlJfRVBJUEU7CiAgICAgICAgIGNhc2UgRUhPU1RVTlJFQUNIOgogICAgICAgICAgICAgcmV0dXJuIFNPQ0tFUlJfRUhPU1RVTlJFQUNIOworICAgICAgICBjYXNlIEVBRERSSU5VU0U6CisgICAgICAgICAgICByZXR1cm4gU09DS0VSUl9BRERSSU5VU0U7CisgICAgICAgIGNhc2UgRUFERFJOT1RBVkFJTDoKKyAgICAgICAgICAgIHJldHVybiBTT0NLRVJSX0FERFJOT1RBVkFJTDsKKyAgICAgICAgY2FzZSBFTVNHU0laRToKKyAgICAgICAgICAgIHJldHVybiBTT0NLRVJSX01TR1NJWkU7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dFKCJ1bmNsYXNzaWZpZWQgZXJybm8gJWQgKCVzKSIsIGVycm9yQ29kZSwgc3RyZXJyb3IoZXJyb3JDb2RlKSk7CiAgICAgICAgICAgICByZXR1cm4gU09DS0VSUl9PUEZBSUxFRDsKQEAgLTEzNDQsNyArMTM0Niw4IEBACiAgICAgaW50IHJldCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CiAKICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICB0aHJvd1NvY2tldEV4Y2VwdGlvbihlbnYsIHJldCk7CisgICAgICAgIGludCBlcnIgPSBjb252ZXJ0RXJyb3IoZXJybm8pOworICAgICAgICB0aHJvd1NvY2tldEV4Y2VwdGlvbihlbnYsIGVycik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEzNjAsNyArMTM2Myw4IEBACiAgICAgaW50IHJldCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKIAogICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgcmV0KTsKKyAgICAgICAgaW50IGVyciA9IGNvbnZlcnRFcnJvcihlcnJubyk7CisgICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgZXJyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTM5OCw3ICsxNDAyLDcgQEAKICAgICB9IHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKIAogICAgIGlmICgwID09IHJldCkgewotICAgICAgICByZXR1cm4gLSAxOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIGlmIChyZXQgPT0gLTEpIHsKICAgICAgICAgaW50IGVyciA9IGNvbnZlcnRFcnJvcihlcnJubyk7CiAgICAgICAgIGxvZ19zb2NrZXRfY2xvc2UoaGFuZGxlLCBlcnIpOwpAQCAtMTU5NywyMCArMTYwMSwxMyBAQAogICAgICAgICBzb2NrQ29ubmVjdFdpdGhUaW1lb3V0KGhhbmRsZSwgYWRkcmVzcywgMCwgU09DS0VUX1NURVBfRE9ORSwgTlVMTCk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gU09DS0VSUl9OT1RDT05ORUNURUQpIHsKICAgICAgICAgLyogY2FuIG5vdCBjb25uZWN0Li4uICovCi0gICAgICAgIGlmICgoU09DS0VSUl9DT05OUkVTRVQgPT0gcmVzdWx0KSB8fAotICAgICAgICAgICAoU09DS0VSUl9DT05ORUNUSU9OX1JFRlVTRUQgPT0gcmVzdWx0KSB8fAotICAgICAgICAgICAoU09DS0VSUl9BRERSTk9UQVZBSUwgPT0gcmVzdWx0KSB8fAotICAgICAgICAgICAoU09DS0VSUl9BRERSSU5VU0UgPT0gcmVzdWx0KSB8fAotICAgICAgICAgICAoU09DS0VSUl9FTkVUVU5SRUFDSCA9PSByZXN1bHQpIHx8Ci0gICAgICAgICAgIChTT0NLRVJSX0VBQ0NFUyA9PSByZXN1bHQpKSB7Ci0gICAgICAgICAgICBzb2NrQ29ubmVjdFdpdGhUaW1lb3V0KGhhbmRsZSwgYWRkcmVzcywgMCwgU09DS0VUX1NURVBfRE9ORSwgTlVMTCk7Ci0gICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL25ldC9Db25uZWN0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgbmV0TG9va3VwRXJyb3JTdHJpbmcocmVzdWx0KSk7Ci0KKyAgICAgICAgc29ja0Nvbm5lY3RXaXRoVGltZW91dChoYW5kbGUsIGFkZHJlc3MsIDAsIFNPQ0tFVF9TVEVQX0RPTkUsIE5VTEwpOworICAgICAgICBpZiAocmVzdWx0ID09IFNPQ0tFUlJfRUFDQ0VTKSB7CisgICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0TG9va3VwRXJyb3JTdHJpbmcocmVzdWx0KSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2NrQ29ubmVjdFdpdGhUaW1lb3V0KGhhbmRsZSwgYWRkcmVzcywgMCwgU09DS0VUX1NURVBfRE9ORSwgTlVMTCk7CiAgICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL25ldC9Db25uZWN0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgbmV0TG9va3VwRXJyb3JTdHJpbmcocmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRMb29rdXBFcnJvclN0cmluZyhyZXN1bHQpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY4MCwyMyArMTY3NywxNiBAQAogICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBTT0NLRVJSX05PVENPTk5FQ1RFRCkgewogICAgICAgICAgICAgbG9nX3NvY2tldF9jbG9zZShoYW5kbGUsIHJlc3VsdCk7CisgICAgICAgICAgICBzb2NrQ29ubmVjdFdpdGhUaW1lb3V0KGhhbmRsZSwgYWRkcmVzcywgMCwgU09DS0VUX1NURVBfRE9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7CiAgICAgICAgICAgICAvKiB3ZSBnb3QgYW4gZXJyb3Igb3RoZXIgdGhhbiBOT1RDT05ORUNURUQgc28gd2UgY2Fubm90IGNvbnRpbnVlICovCi0gICAgICAgICAgICBpZiAoKFNPQ0tFUlJfQ09OTlJFU0VUID09IHJlc3VsdCkgfHwKLSAgICAgICAgICAgICAgIChTT0NLRVJSX0NPTk5FQ1RJT05fUkVGVVNFRCA9PSByZXN1bHQpIHx8Ci0gICAgICAgICAgICAgICAoU09DS0VSUl9BRERSTk9UQVZBSUwgPT0gcmVzdWx0KSB8fAotICAgICAgICAgICAgICAgKFNPQ0tFUlJfQUREUklOVVNFID09IHJlc3VsdCkgfHwKLSAgICAgICAgICAgICAgIChTT0NLRVJSX0VORVRVTlJFQUNIID09IHJlc3VsdCkgfHwKLSAgICAgICAgICAgICAgIChTT0NLRVJSX0VBQ0NFUyA9PSByZXN1bHQpKSB7Ci0gICAgICAgICAgICAgICAgc29ja0Nvbm5lY3RXaXRoVGltZW91dChoYW5kbGUsIGFkZHJlc3MsIHJlbWFpbmluZ1RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTT0NLRVRfU1RFUF9ET05FLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB0aHJvd1NvY2tldEV4Y2VwdGlvbihlbnYsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgaWYgKFNPQ0tFUlJfRUFDQ0VTID09IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0TG9va3VwRXJyb3JTdHJpbmcocmVzdWx0KSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvY2tDb25uZWN0V2l0aFRpbWVvdXQoaGFuZGxlLCBhZGRyZXNzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgU09DS0VUX1NURVBfRE9ORSwgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgdGhyb3dTb2NrZXRFeGNlcHRpb24oZW52LCByZXN1bHQpOwotICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgfQogCiAgICAgICAgIHdoaWxlIChTT0NLRVJSX05PVENPTk5FQ1RFRCA9PSByZXN1bHQpIHsKQEAgLTE3NTUsMjMgKzE3NDUsMjIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxvZ19zb2NrZXRfY2xvc2UoaGFuZGxlLCByZXN1bHQpOworICAgICAgICAgICAgICAgIHNvY2tDb25uZWN0V2l0aFRpbWVvdXQoaGFuZGxlLCBhZGRyZXNzLCByZW1haW5pbmdUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09DS0VUX1NURVBfRE9ORSwgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgaWYgKChTT0NLRVJSX0NPTk5SRVNFVCA9PSByZXN1bHQpIHx8Ci0gICAgICAgICAgICAgICAgICAgKFNPQ0tFUlJfQ09OTkVDVElPTl9SRUZVU0VEID09IHJlc3VsdCkgfHwKLSAgICAgICAgICAgICAgICAgICAoU09DS0VSUl9BRERSTk9UQVZBSUwgPT0gcmVzdWx0KSB8fAotICAgICAgICAgICAgICAgICAgIChTT0NLRVJSX0FERFJJTlVTRSA9PSByZXN1bHQpIHx8Ci0gICAgICAgICAgICAgICAgICAgKFNPQ0tFUlJfRU5FVFVOUkVBQ0ggPT0gcmVzdWx0KSB8fAotICAgICAgICAgICAgICAgICAgIChTT0NLRVJSX0VBQ0NFUyA9PSByZXN1bHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tDb25uZWN0V2l0aFRpbWVvdXQoaGFuZGxlLCBhZGRyZXNzLCByZW1haW5pbmdUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tFVF9TVEVQX0RPTkUsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAoU09DS0VSUl9DT05ORUNUSU9OX1JFRlVTRUQgPT0gcmVzdWx0KSB8fAorICAgICAgICAgICAgICAgICAgICAoU09DS0VSUl9BRERSTk9UQVZBSUwgPT0gcmVzdWx0KSB8fAorICAgICAgICAgICAgICAgICAgICAoU09DS0VSUl9BRERSSU5VU0UgPT0gcmVzdWx0KSB8fAorICAgICAgICAgICAgICAgICAgICAoU09DS0VSUl9FTkVUVU5SRUFDSCA9PSByZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbmV0L0Nvbm5lY3RFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldExvb2t1cEVycm9yU3RyaW5nKHJlc3VsdCkpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldExvb2t1cEVycm9yU3RyaW5nKHJlc3VsdCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU09DS0VSUl9FQUNDRVMgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldExvb2t1cEVycm9yU3RyaW5nKHJlc3VsdCkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tDb25uZWN0V2l0aFRpbWVvdXQoaGFuZGxlLCBhZGRyZXNzLCByZW1haW5pbmdUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tFVF9TVEVQX0RPTkUsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICB0aHJvd1NvY2tldEV4Y2VwdGlvbihlbnYsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTkzMyw4ICsxOTIyLDkgQEAKICAgICByZXN1bHQgPSByZWN2KGhhbmRsZSwgKGpieXRlICopIG1lc3NhZ2UsIEJVRkZFUlNJWkUsIE1TR19QRUVLKTsKIAogICAgIGlmICgwID4gcmVzdWx0KSB7Ci0gICAgICAgIGxvZ19zb2NrZXRfY2xvc2UoaGFuZGxlLCByZXN1bHQpOwotICAgICAgICB0aHJvd1NvY2tldEV4Y2VwdGlvbihlbnYsIGNvbnZlcnRFcnJvcihlcnJubykpOworICAgICAgICBpbnQgZXJyID0gY29udmVydEVycm9yKGVycm5vKTsKKyAgICAgICAgbG9nX3NvY2tldF9jbG9zZShoYW5kbGUsIGVycik7CisgICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgZXJyKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGFkZF9yZWN2X3N0YXRzKGhhbmRsZSwgcmVzdWx0KTsKQEAgLTIyMDYsNyArMjE5NiwxMSBAQAogICAgIGlmIChwYWNrZXQgIT0gTlVMTCkgewogICAgICAgICBpbnQgcG9ydCA9IG50b2hzKHNvY2tBZGRyLnNpbl9wb3J0KTsKICAgICAgICAgamJ5dGVBcnJheSBhZGRyID0gZW52LT5OZXdCeXRlQXJyYXkoc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0gICAgICAgIHN0cnVjdEluVG9KYXZhQWRkcmVzcyhlbnYsICZzb2NrQWRkci5zaW5fYWRkciwgYWRkcik7CisgICAgICAgIGlmICgoc3RydWN0SW5Ub0phdmFBZGRyZXNzKGVudiwgJnNvY2tBZGRyLnNpbl9hZGRyLCBhZGRyKSkgPCAwKSB7CisgICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBhZGRyZXNzIG9mIHBhY2tldC4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgICAgIGpvYmplY3Qgc2VuZGVyID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKAogICAgICAgICAgICAgICAgIGdDYWNoZWRGaWVsZHMuaWFkZHJfY2xhc3MsIGdDYWNoZWRGaWVsZHMuaWFkZHJfZ2V0YnlhZGRyZXNzLAogICAgICAgICAgICAgICAgIGFkZHIpOwpAQCAtMjMyNywxMyArMjMyMSwxMyBAQAogICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciopJnJlY2VpdmVyLCBzaXplb2YocmVjZWl2ZXIpKTsKIAogICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbnZlcnRFcnJvcihlcnJubyk7Ci0gICAgICAgIGlmICgoU09DS0VSUl9DT05OUkVTRVQgPT0gcmVzdWx0KQotICAgICAgICAgICAgICAgIHx8IChTT0NLRVJSX0NPTk5FQ1RJT05fUkVGVVNFRCA9PSByZXN1bHQpKSB7CisgICAgICAgIGludCBlcnIgPSBjb252ZXJ0RXJyb3IoZXJybm8pOworICAgICAgICBpZiAoKFNPQ0tFUlJfQ09OTlJFU0VUID09IGVycikKKyAgICAgICAgICAgICAgICB8fCAoU09DS0VSUl9DT05ORUNUSU9OX1JFRlVTRUQgPT0gZXJyKSkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2dfc29ja2V0X2Nsb3NlKGhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgcmVzdWx0KTsKKyAgICAgICAgICAgIGxvZ19zb2NrZXRfY2xvc2UoaGFuZGxlLCBlcnIpOworICAgICAgICAgICAgdGhyb3dTb2NrZXRFeGNlcHRpb24oZW52LCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMzcwLDEzICsyMzY0LDEyIEBACiAgICAgaW50IHJlc3VsdCA9IHNlbmQoaGFuZGxlLCAoY2hhciopKGFkZHJlc3MgKyBvZmZzZXQpLCBsZW5ndGgsIDApOwogCiAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgcmVzdWx0ID0gZXJybm87CiAgICAgICAgIGludCBlcnIgPSBjb252ZXJ0RXJyb3IoZXJybm8pOwogICAgICAgICBpZiAoKFNPQ0tFUlJfQ09OTlJFU0VUID09IGVycikgfHwgKFNPQ0tFUlJfQ09OTkVDVElPTl9SRUZVU0VEID09IGVycikpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nX3NvY2tldF9jbG9zZShoYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICB0aHJvd1NvY2tldEV4Y2VwdGlvbihlbnYsIHJlc3VsdCk7CisgICAgICAgICAgICBsb2dfc29ja2V0X2Nsb3NlKGhhbmRsZSwgZXJyKTsKKyAgICAgICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQwOSw3ICsyNDAyLDggQEAKICAgICBpbnQgaGFuZGxlID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKIAogICAgIGlmIChoYW5kbGUgPCAwKSB7Ci0gICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgaGFuZGxlKTsKKyAgICAgICAgaW50IGVyciA9IGNvbnZlcnRFcnJvcihlcnJubyk7CisgICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgZXJyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjQyNyw3ICsyNDIxLDggQEAKICAgICBpbnQgaGFuZGxlID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogCiAgICAgaWYgKGhhbmRsZSA8IDApIHsKLSAgICAgICAgdGhyb3dTb2NrZXRFeGNlcHRpb24oZW52LCBoYW5kbGUpOworICAgICAgICBpbnQgZXJyID0gY29udmVydEVycm9yKGVycm5vKTsKKyAgICAgICAgdGhyb3dTb2NrZXRFeGNlcHRpb24oZW52LCBlcnIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNDcxLDcgKzI0NjYsNyBAQAogCiAgICAgZG8gewogICAgICAgICByZXN1bHQgPSByZWN2KGhhbmRsZSwgYm9keSArIG9mZnNldCwgbG9jYWxDb3VudCwgU09DS0VUX05PRkxBR1MpOwotICAgIH0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgcmVzdWx0ID09IEVJTlRSKTsKKyAgICB9IHdoaWxlIChyZXN1bHQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKIAogICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIGJvZHksIDApOwogCkBAIC0yNDkwLDkgKzI0ODUsOSBAQAogICAgICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9uZXQvU29ja2V0VGltZW91dEV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRMb29rdXBFcnJvclN0cmluZyhTT0NLRVJSX1RJTUVPVVQpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBlcnJjb2RlID0gY29udmVydEVycm9yKGVycm5vKTsKLSAgICAgICAgICAgIGxvZ19zb2NrZXRfY2xvc2UoaGFuZGxlLCBlcnJjb2RlKTsKLSAgICAgICAgICAgIHRocm93U29ja2V0RXhjZXB0aW9uKGVudiwgZXJyY29kZSk7CisgICAgICAgICAgICBpbnQgZXJyID0gY29udmVydEVycm9yKGVycm5vKTsKKyAgICAgICAgICAgIGxvZ19zb2NrZXRfY2xvc2UoaGFuZGxlLCBlcnIpOworICAgICAgICAgICAgdGhyb3dTb2NrZXRFeGNlcHRpb24oZW52LCBlcnIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI1MzMsMTAgKzI1MjgsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBMT0dEKCJ3cml0ZSBibG9ja2VkICVkIiwgc2VudCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBtZXNzYWdlLCAwKTsKICAgICAgICAgICAgIGludCBlcnIgPSBjb252ZXJ0RXJyb3IocmVzdWx0KTsKICAgICAgICAgICAgIGxvZ19zb2NrZXRfY2xvc2UoaGFuZGxlLCBlcnIpOwogICAgICAgICAgICAgdGhyb3dTb2NrZXRFeGNlcHRpb24oZW52LCBlcnIpOwotICAgICAgICAgICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgbWVzc2FnZSwgMCk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBzZW50ICs9IHJlc3VsdDsKQEAgLTI2MDQsNyArMjU5OSw3IEBACiAgICAgdW5zaWduZWQgc2hvcnQgblBvcnQ7CiAgICAgaW50IHJlc3VsdCA9IDAsIHNlbnQgPSAwOwogICAgIGludCBoYW5kbGUgPSAwOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc29ja2FkZHJQOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrYWRkclA7CiAKICAgICBpZiAoaW5ldEFkZHJlc3MgIT0gTlVMTCkgewogCkBAIC0yNjQ1LDcgKzI2NDAsNyBAQAogCiAgICAgICAgIHJlc3VsdCA9IHNlbmR0byhoYW5kbGUsIChjaGFyICopIChtZXNzYWdlICsgc2VudCksCiAgICAgICAgICAgICAgICAgKGludCkgKGxlbmd0aCAtIHNlbnQpLCBTT0NLRVRfTk9GTEFHUywKLSAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopIHNvY2thZGRyUCwgc2l6ZW9mKHNvY2thZGRyUCkpOworICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2thZGRyUCwgc2l6ZW9mKHNvY2thZGRyUCkpOwogCiAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CiAgICAgICAgICAgICBpbnQgZXJyID0gY29udmVydEVycm9yKGVycm5vKTsKQEAgLTI2NzgsNyArMjY3Myw3IEBACiAgICAgamludCAqZmxhZ0FycmF5OwogICAgIGludCB2YWw7CiAgICAgdW5zaWduZWQgaW50IHRpbWVfc2VjID0gKHVuc2lnbmVkIGludCl0aW1lb3V0LzEwMDA7Ci0gICAgdW5zaWduZWQgaW50IHRpbWVfbXNlYyA9ICh1bnNpZ25lZCBpbnQpKHRpbWVvdXQlMTAwMCkqMTAwMDsKKyAgICB1bnNpZ25lZCBpbnQgdGltZV9tc2VjID0gKHVuc2lnbmVkIGludCkodGltZW91dCUxMDAwKTsKIAogICAgIGZkc2V0X3JlYWQgPSAoZmRfc2V0ICopbWFsbG9jKHNpemVvZihmZF9zZXQpKTsKICAgICBmZHNldF93cml0ZSA9IChmZF9zZXQgKiltYWxsb2Moc2l6ZW9mKGZkX3NldCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvb3JnX2FwYWNoZV9oYXJtb255X2x1bmlfdXRpbF9mbHRwYXJzZS5jIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvb3JnX2FwYWNoZV9oYXJtb255X2x1bmlfdXRpbF9mbHRwYXJzZS5jCmluZGV4IGNjNzFmMTcuLmQ4YTFlNjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV9sdW5pX3V0aWxfZmx0cGFyc2UuYworKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9vcmdfYXBhY2hlX2hhcm1vbnlfbHVuaV91dGlsX2ZsdHBhcnNlLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiY29tbW9uRGJsUGFyY2UuaCIKICNpbmNsdWRlICJjYmlnaW50LmgiCi0jaW5jbHVkZSAiZXhjZXB0aW9ucy5oIgogCiAjaWYgZGVmaW5lZChMSU5VWCkKICNkZWZpbmUgVVNFX0xMCkBAIC0xMTgsOSArMTE3LDYgQEAKICAgICB9CiAjZGVmaW5lIEVSUk9SX09DQ1VSRUQoeCkgKEhJR0hfSTMyX0ZST01fVkFSKHgpIDwgMCkKIAotLy8/Pz8gVXRpbCAtIGRvIG5vdCB3YW50IHBvcnRhYmlsaXR5IGxheWVyLgotLy8jZGVmaW5lIGFsbG9jYXRlVTY0KHB0ciwgbikgaWYgKCEoKHB0cikgPSAoVV82NCopIGh5bWVtX2FsbG9jYXRlX21lbW9yeSgobikgKiBzaXplb2YoVV82NCkpKSkgZ290byBPdXRPZk1lbW9yeTsKLS8vI2RlZmluZSByZWxlYXNlKHIpIGlmICgocikpIGh5bWVtX2ZyZWVfbWVtb3J5KChyKSk7CiAjZGVmaW5lIGFsbG9jYXRlVTY0KHgsIG4pIGlmICghKCh4KSA9IChVXzY0KikgbWFsbG9jKChuKSAqIHNpemVvZihVXzY0KSkpKSBnb3RvIE91dE9mTWVtb3J5OwogI2RlZmluZSByZWxlYXNlKHIpIGlmICgocikpIGZyZWUoKHIpKTsKIApAQCAtMzYzLDcgKzM1OSw2IEBACiAgIFVfNjQgKngsICp5LCAqRCwgKkQyOwogICBJREFUQSB4TGVuZ3RoLCB5TGVuZ3RoLCBETGVuZ3RoLCBEMkxlbmd0aDsKICAgSURBVEEgZGVjQXBwcm94Q291bnQsIGluY0FwcHJveENvdW50OwotICAvL1BPUlRfQUNDRVNTX0ZST01fRU5WIChlbnYpOwogCiAgIHggPSB5ID0gRCA9IEQyID0gMDsKICAgeExlbmd0aCA9IHlMZW5ndGggPSBETGVuZ3RoID0gRDJMZW5ndGggPSAwOwpAQCAtMzc1LDggKzM3MCw2IEBACiAgICAgICBrID0gZmxvYXRFeHBvbmVudCAoeik7CiAKICAgICAgIGlmICh4ICYmIHggIT0gZikKLSAgICAgIC8vPz8/IFV0aWwgLSBkb24ndCB3YW50IHBvcnRhYmlsaXR5IGxheWVyLgotICAgICAgLy9qY2xtZW1fZnJlZV9tZW1vcnkgKGVudiwgeCk7CiAgICAgICAgICAgZnJlZSh4KTsKIAogICAgICAgcmVsZWFzZSAoeSk7CkBAIC01MjMsOCArNTE2LDYgQEAKICAgd2hpbGUgKDEpOwogCiAgIGlmICh4ICYmIHggIT0gZikKLSAgICAvLz8/PyBVdGlsIC0gZG9uJ3Qgd2FudCBwb3J0YWJpbGl0eSBsYXllci4KLSAgICAvL2pjbG1lbV9mcmVlX21lbW9yeSAoZW52LCB4KTsKICAgICAgIGZyZWUoeCk7CiAgIHJlbGVhc2UgKHkpOwogICByZWxlYXNlIChEKTsKQEAgLTUzMyw4ICs1MjQsNiBAQAogCiBPdXRPZk1lbW9yeToKICAgaWYgKHggJiYgeCAhPSBmKQotICAvLz8/PyBVdGlsIC0gZG9uJ3Qgd2FudCBwb3J0YWJpbGl0eSBsYXllci4KLSAgLy9qY2xtZW1fZnJlZV9tZW1vcnkgKGVudiwgeCk7CiAgICAgICBmcmVlKHgpOwogICByZWxlYXNlICh5KTsKICAgcmVsZWFzZSAoRCk7CkBAIC01NjQsMTIgKzU1MywxMiBAQAogICAgICAgcmV0dXJuIGZsdDsKICAgICB9CiAgIGVsc2UgaWYgKCgoSV8zMikgRkxPQVRfVE9fSU5UQklUUyAoZmx0KSkgPT0gKElfMzIpIC0gMSkKLSAgICB7Ci0gICAgICB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShlbnYsICJqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uIiwgIiIpOworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXJGb3JtYXRFeGNlcHRpb24gKi8KKyAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb24iLCAiIik7CiAgICAgfQogICBlbHNlCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dE9mTWVtb3J5RXJyb3IgKi8KLSAgICAgIHRocm93TmV3T3V0T2ZNZW1vcnlFcnJvcihlbnYsICIiKTsKKyAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwgIiIpOwogICAgIH0KIAogICByZXR1cm4gMC4wOwpAQCAtNTkxLDExICs1ODAsMTEgQEAKICAgICB9CiAgIGVsc2UgaWYgKExPV19JMzJfRlJPTV9WQVIgKGRibCkgPT0gKElfMzIpIC0gMSkKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyRm9ybWF0RXhjZXB0aW9uICovCi0gICAgICB0aHJvd05ld0V4Y2VwdGlvbkJ5TmFtZShlbnYsICJqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uIiwgIiIpOworICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbiIsICIiKTsKICAgICB9CiAgIGVsc2UKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0T2ZNZW1vcnlFcnJvciAqLwotICAgICAgdGhyb3dOZXdPdXRPZk1lbW9yeUVycm9yKGVudiwgIiIpOworICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiLCAiIik7CiAgICAgfQogCiAgIHJldHVybiAwLjA7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9zdWIubWsgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9zdWIubWsKaW5kZXggZGQzNzFmNy4uZDI3N2Y4MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvc3ViLm1rCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL3N1Yi5tawpAQCAtMTIsMTEgKzEyLDkgQEAKIAlqYXZhX2xhbmdfRmxvYXQuYyBcCiAJamF2YV9sYW5nX01hdGguYyBcCiAJamF2YV9sYW5nX1N0cmljdE1hdGguYyBcCi0JamF2YV9sYW5nX3JlZmxlY3RfUHJveHkuYyBcCiAJamF2YV9uZXRfSW5ldEFkZHJlc3MuY3BwIFwKIAlqYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlLmMgXAogCWNiaWdpbnQuYyBcCi0JZXhjZXB0aW9ucy5jIFwKIAljb21tb25EYmxQYXJjZS5jIFwKIAlvcmdfYXBhY2hlX2hhcm1vbnlfbHVuaV91dGlsX2ZsdHBhcnNlLmMgXAogCW9yZ19hcGFjaGVfaGFybW9ueV9sdW5pX3V0aWxfTnVtYmVyQ29udmVydC5jIFwKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NvcmV0ZXN0cy9TdGF0VGVzdFJ1bm5lci5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY29yZXRlc3RzL1N0YXRUZXN0UnVubmVyLmphdmEKaW5kZXggYjQ2NDJiOC4uMTIxYzEzNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY29yZXRlc3RzL1N0YXRUZXN0UnVubmVyLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY29yZXRlc3RzL1N0YXRUZXN0UnVubmVyLmphdmEKQEAgLTI3LDE5ICsyNyw4NiBAQAogCiAvKioKICAqIEEgY29tbWFuZCBsaW5lIGJhc2VkIHRvb2wgdG8gcnVuIHRlc3RzLgorICogCiAgKiA8cHJlPgogICogamF2YSBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lciBbLXdhaXRdIFRlc3RDYXNlQ2xhc3MKICAqIDwvcHJlPgotICogVGVzdFJ1bm5lciBleHBlY3RzIHRoZSBuYW1lIG9mIGEgVGVzdENhc2UgY2xhc3MgYXMgYXJndW1lbnQuCi0gKiBJZiB0aGlzIGNsYXNzIGRlZmluZXMgYSBzdGF0aWMgPGNvZGU+c3VpdGU8L2NvZGU+IG1ldGhvZCBpdCAKLSAqIHdpbGwgYmUgaW52b2tlZCBhbmQgdGhlIHJldHVybmVkIHRlc3QgaXMgcnVuLiBPdGhlcndpc2UgYWxsIAotICogdGhlIG1ldGhvZHMgc3RhcnRpbmcgd2l0aCAidGVzdCIgaGF2aW5nIG5vIGFyZ3VtZW50cyBhcmUgcnVuLgorICogCisgKiBUZXN0UnVubmVyIGV4cGVjdHMgdGhlIG5hbWUgb2YgYSBUZXN0Q2FzZSBjbGFzcyBhcyBhcmd1bWVudC4gSWYgdGhpcyBjbGFzcworICogZGVmaW5lcyBhIHN0YXRpYyA8Y29kZT5zdWl0ZTwvY29kZT4gbWV0aG9kIGl0IHdpbGwgYmUgaW52b2tlZCBhbmQgdGhlCisgKiByZXR1cm5lZCB0ZXN0IGlzIHJ1bi4gT3RoZXJ3aXNlIGFsbCB0aGUgbWV0aG9kcyBzdGFydGluZyB3aXRoICJ0ZXN0IiBoYXZpbmcKKyAqIG5vIGFyZ3VtZW50cyBhcmUgcnVuLgogICogPHA+Ci0gKiBXaGVuIHRoZSB3YWl0IGNvbW1hbmQgbGluZSBhcmd1bWVudCBpcyBnaXZlbiBUZXN0UnVubmVyCi0gKiB3YWl0cyB1bnRpbCB0aGUgdXNlcnMgdHlwZXMgUkVUVVJOLgorICogV2hlbiB0aGUgd2FpdCBjb21tYW5kIGxpbmUgYXJndW1lbnQgaXMgZ2l2ZW4gVGVzdFJ1bm5lciB3YWl0cyB1bnRpbCB0aGUgdXNlcnMKKyAqIHR5cGVzIFJFVFVSTi4KICAqIDxwPgotICogVGVzdFJ1bm5lciBwcmludHMgYSB0cmFjZSBhcyB0aGUgdGVzdHMgYXJlIGV4ZWN1dGVkIGZvbGxvd2VkIGJ5IGEKLSAqIHN1bW1hcnkgYXQgdGhlIGVuZC4gCisgKiBUZXN0UnVubmVyIHByaW50cyBhIHRyYWNlIGFzIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgZm9sbG93ZWQgYnkgYSBzdW1tYXJ5IGF0CisgKiB0aGUgZW5kLgorICogPHA+CisgKiBTYW1wbGUgY29tbWFuZCBsaW5lczogVGhlIHR5cGljYWwgdXNhZ2Ugd2lsbCBsb29rIGxpa2UgdGhpczoKKyAqIAorICogPHByZT4KKyAqIGRhbHZpay9zdGF0LWNvcmUtdGVzdHMuc2ggREI6L2hvbWUvbWMvbXlUZXN0U3RhdHMuZGIgdGVzdHMuYXJjaGl2ZS5BbGxUZXN0cworICogZGFsdmlrL3N0YXQtY29yZS10ZXN0cy5zaCArbm9iaWcgK2JhZCArczEwMDAgdGVzdHMuYXJjaGl2ZS5BbGxUZXN0cworICogPC9wcmU+CisgKiBUaGUgU1FMaXRlIGRhdGFiYXNlIC90bXAvdGVzdFN0YXRzLmRiIHdpbGwgYmUgdXNlZC4gQWxsIGZhaWx1cmVzIGFuZCBlcnJvcnMKKyAqIHdpbGwgYmUgbGlzdGVkLiBBbGwgdGVzdCBjYXNlcyBydW5uaW5nIGF0IGxlYXN0IG9uZSBzZWNvbmQgd2lsbCBiZSBsaXN0ZWQuIE5vCisgKiBiaWcgaGlnaCBsaWdodGluZyBvdXRwdXQgd2lsbCBiZSBwcm9kdWNlZCBmb3IgZ29vZCB0byBiYWQgcnVucy4KKyAqIDxwPgorICogY29tLmdvb2dsZS5jb3JldGVzdHMuU3RhdCBoYW5kbGVzIGFsbCBwYXJhbWV0ZXIgdGhhdAorICogY29tLmdvb2dsZS5jb3JldGVzdHMuTWFpbiBkb2VzIGFuZCBzb21lIGFkZGl0aW9uYWwgb25lcyBkZXNjcmliZWQgYmVsb3cuCisgKiBTdGF0VGVzdFJ1bm5lciB3aWxsIHJ1biB0aGUgdGVzdCBjYXNlcyBpbiB0aGUgc2FtZSB3YXkgYW5kIHByb2R1Y2UgdGhlIHNhbWUKKyAqIG91dHB1dCBhcyB0aGUgbm9ybWFsIFRlc3RSdW5uZXIgZG9lcy4gT25seSBpbiBhIHNlY29uZCBwYXNzLCBpdCB3aWxsCisgKiBzeW5jaHJvbml6ZSB0aGUgdGVzdCByZXN1bHRzIHdpdGggYW4gU1FMaXRlIGRhdGFiYXNlIGFuZCBwcm9kdWNlIGFkZGl0aW9uYWwKKyAqIG91dHB1dC4gVGhlIG1haW4gZ29hbCBvZiB0aGUgU3RhdFRlc3RSdW5uZXIgaXMgdG8gZGV0ZWN0IGFuZCBsaXN0IHJlbGV2YW50CisgKiB0ZXN0IGJlaGF2aW91ciB0cmFuc2l0aW9ucy4gVGhlIGNsYXNzIFN0YXRTdG9yZSBhYnN0cmFjdHMgdGhlIHN0b3JhZ2Ugb2YgdGhlCisgKiBzdGF0aXN0aWNhbCB0ZXN0IGluZm9ybWF0aW9uIGFuZCBpcyBiYXNlZCBvbiBKREJDLiBUaGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkCisgKiBpbiB0aHJlZSB0YWJsZXM6IFRlc3RfQ2FzZXMgaXMgdGhlIG1haW4gdGFibGUgYW5kIHRoZSBvbmx5IG9uZSByZWFkIGJ5CisgKiBTdGF0c1N0b3JlLiBUZXN0X0Nhc2VfUnVucyBhbmQgVGVzdF9DYXNlX0V2ZW50cyBhcmUgZGV0YWlsIHRhYmxlcyB3aXRoCisgKiBmb3JlaWduIGtleSB0byB0aGUgbWFpbiB0YWJsZS4gTm90ZSB0aGF0IHRoZXNlIHRhYmxlcyBhcmUgb25seSB3cml0dGVuIGJ5CisgKiBTdGF0c1N0b3JlIGZvciBmdXR1cmUgZXZhbHVhdGlvbiBwdXJwb3NlLgorICogPHA+CisgKiBBZGRpdGlvbmFsIFBhcmFtZXRlcnMgcmVzb2x2ZWQgYnkgU3RhdFRlc3RSdW5uZXIuc3RhcnQoKToKKyAqIDx1bD4KKyAqIDxsaT5EQjo8c3FsaXRlRGJGaWxlPiAtIFNwZWNpZmljYXRpb24gb2YgdGhlIFNRTElURSBkYXRhYmFzZSBmaWxlLiBUaGUKKyAqIGRlZmF1bHQgZmlsZSBpcyB0ZXN0U3RhdHMuZGIgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCBpLmUuIHVzdWFsbHkKKyAqIC90bXAvdGVzdFN0YXRzLmRiIHdoaWNoIGlzIG5vdCB1c2VmdWwgd2hlbiB3ZSB3YW50IHRvIGtlZXAgdGhlIGhpc3RvcnkgbG9uZ2VyCisgKiB0aGFuIHVudGlsIHRoZSBuZXh0IHJlYm9vdC48L2xpPgorICogPGxpPithbGwgLSBTaW1wbHkgbGlzdCBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBmb3IgYWxsIHRlc3QgY2FzZXMgKG5vdCBvbmx5CisgKiB0aGUgcmVsZXZhbnQgb25lcykuPC9saT4KKyAqIDxsaT4rYmFkIC0gTGlzdCBpbmZvcm1hdGlvbiBmb3IgYWxsIGZhaWx1cmVzIGFuZCBlcnJvcnMsIGV2ZW4gaWYgdGhleSBhcmUgbm90CisgKiBuZXcuPC9saT4KKyAqIDxsaT4rbm9iaWcgLSBEb24ndCBkdW1wIGFkZGl0aW9uYWwgbWFya2luZyBsaW5lcyBmb3IgVkJBRCBjYXNlcyAodGVzdHMgdGhhdAorICogb25jZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBkb24ndCBzdWNjZWVkIGFueW1vcmUpLiBOb3JtYWxseSBmb3Igc3VjaAorICogY2FzZXMgc2V2ZW4gYWRkaXRpb25hbCBoaWdoIGxpZ2h0aW5nIGxpbmVzIGFyZSBwcmludGVkIGluIG9yZGVyIHRvIGNhbGwgdGhlCisgKiBuZWNjZXNzYXJ5IGF0dGVudGlvbiB0byB0aGUgdXNlci48L2xpPgorICogPGxpPitzPG1zQWRob2NEdXJhdGlvbj4gLSBMaXN0IGFsbCB0ZXN0IGNhc2VzIHRoYXQgcnVuIGxvbmdlciB0aGFuIHRoZQorICogdGhyZXNob2xkIHNwZWNpZmllZCAoK3MxMDAwIGZvciBvbmUgc2Vjb25kIChub3RlOiBubyBzcGFjZSBiZXR3ZWVuIHMgYW5kIDEpKS4KKyAqIDwvbGk+CisgKiA8L3VsPgorICogQWRkaXRpb25hbCBPdXRwdXQgb2YgU3RhdFRlc3RSdW5uZXI6PGJyIC8+IEZvciBlYWNoIHJlbGV2YW50IHRlc3QgY2FzZSBhCisgKiBzaW5nbGUgbGluZSBpcyBwcmludGVkIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyAqIAorICogPHByZT4KKyAqIC00IFZCQUQgIHRlc3RfY2FzZTEoZnVsbC5jbGFzcy5OYW1lKTogMiMgMjEoMjApIFsxMS4uMjFdIDE3LjMgbXMKKyAqIC0yIFNMT1chIHRlc3RfY2FzZTIoZnVsbC5jbGFzcy5OYW1lKTogMyMgMjEoMjApIFsxMS4uMjFdIDE3LjMgbXMKKyAqIDwvcHJlPgorICogPHVsPgorICogPGxpPi00IFZCQUQgYW5kIC0yIFNMT1cgLSBSZWxldmFuY2UgQ29kZXMuPC9saT4KKyAqIDxsaT4hIC0gVHJhbnNpdGlvbiBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGF0IGluIHRoaXMgcnVuIHRoZXJlIHdhcyBhIHJlbGV2YW50CisgKiBjaGFuZ2UgaW4gdGhlIGJlaGF2aW91ciBvZiB0aGlzIHRlc3QgY2FzZSBhbmQgYSByb3cgd2FzIGluc2VydGVkIGFjY29yZGluZ2x5CisgKiBpbnRvIFRlc3RfQ2FzZV9FdmVudHMuPC9saT4KKyAqIDxsaT4zIyAtIE51bWJlciBvZiBydW5zLjwvbGk+CisgKiA8bGk+MjEoMjApIC0gRHVyYXRpb24gKER1cmF0aW9uIG9mIHByZXZpb3VzIHJ1bikuPC9saT4KKyAqIDxsaT5bMTEuLjIxXSAtIFtNaW5pbWFsIGR1cmF0aW9uIC4uIE1heGltYWwgZHVyYXRpb25dLjwvbGk+CisgKiA8bGk+MTcuMyAtIEF2ZXJhZ2UgZHVyYXRpb24uPC9saT4KKyAqIDxsaT5tcyAtIFVuaXQgb2YgTWVhc3VyZW1lbnQgZm9yIGFsbCBkdXJhdGlvbiBmaWd1cmVzLjwvbGk+CisgKiA8L3VsPgorICogTm90ZSB0aGF0IGZvciB0aGUgZmlyc3QgdGVzdCBjYXNlIHRlc3RfY2FzZTEgdGhlcmUgd2FzIG5vIHRyYW5zaXRpb24gaW4gdGhpcworICogcnVuLiBTdGlsbCB0aGUgVkJBRCBsaW5lIGlzIHByb2R1Y2VkIHNpbmNlIHRoZSB0ZXN0IHJhbiBmaW5lIGF0IHNvbWUgcG9pbnQKKyAqIGVhcmxpZXIuCisgKiA8cD4KKyAqIFJlbGV2YW5jZSBDb2RlczogdG8gYmUgZGVzY3JpYmVkLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGF0VGVzdFJ1bm5lciBleHRlbmRzIEJhc2VUZXN0UnVubmVyIHsKICAgICBwcml2YXRlIFJlc3VsdFByaW50ZXIgZlByaW50ZXI7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0FsbFRlc3RzLmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZGI3MgotLS0gL2Rldi9udWxsCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogVGhpcyBpcyBhdXRvZ2VuZXJhdGVkIHNvdXJjZSBmaWxlLiBJbmNsdWRlcyB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YXgubmV0LnNzbDsKKyAqLworCitwdWJsaWMgY2xhc3MgQWxsVGVzdHMgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0cyBmb3IgSHR0cFVSTENvbm5lY3RvbiwgSHR0cHNVUkxDb25uZWN0aW9uLiIpOworICAgICAgICAvLyAkSlVuaXQtQkVHSU4kCisKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEh0dHBVUkxDb25uZWN0aW9uVGVzdC5jbGFzcyk7CisKKyAgICAgICAgLy8gJEpVbml0LUVORCQKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cFVSTENvbm5lY3Rpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IDE4MjE5NzUuLmIzMzdhYWYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cFVSTENvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwVVJMQ29ubmVjdGlvblRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHA7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yOwogaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwpAQCAtMzksNiArNDQsNyBAQAogICogVGVzdHMgZm9yIDxjb2RlPkhUVFBVUkxDb25uZWN0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCiAgKgogICovCitAVGVzdFRhcmdldENsYXNzKEh0dHBVUkxDb25uZWN0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBIdHRwVVJMQ29ubmVjdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgYm91bmQgPSBuZXcgT2JqZWN0KCk7CkBAIC0xNTgsNyArMTY0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cuaHR0cC5nZXRPdXRwdXRTdHJlYW0oKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0T3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS00ODIKICAgICAgICAgTW9ja1NlcnZlciBodHRwU2VydmVyID0KICAgICAgICAgICAgIG5ldyBNb2NrU2VydmVyKCJTZXJ2ZXJTb2NrZXQgZm9yIEh0dHBVUkxDb25uZWN0aW9uVGVzdCIpOwpAQCAtMTgzLDYgKzE5OCwxNiBAQAogICAgICAqIFRlc3QgY2hlY2tzIGlmIHRoZSBwcm94eSBzcGVjaWZpZWQgaW4gb3BlbkNvbm5lY3Rpb24KICAgICAgKiBtZXRob2Qgd2lsbCBiZSB1c2VkIGZvciBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpZiB0aGUgcHJveHkgc3BlY2lmaWVkIGluIG9wZW5Db25uZWN0aW9uICIgKyAKKyAgICAgICAgICAgICJtZXRob2Qgd2lsbCBiZSB1c2VkIGZvciBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXNpbmdQcm94eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVc2luZ1Byb3h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNTcwCiAgICAgICAgIE1vY2tTZXJ2ZXIgc2VydmVyID0gbmV3IE1vY2tTZXJ2ZXIoInNlcnZlciIpOwpAQCAtMjIzLDYgKzI0OCwxNiBAQAogICAgICAqIFRlc3QgY2hlY2tzIGlmIHRoZSBwcm94eSBwcm92aWRlZCBieSBwcm94eSBzZWxlY3RvcgogICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaWYgdGhlIHByb3h5IHByb3ZpZGVkIGJ5IHByb3h5IHNlbGVjdG9yICIgKyAKKyAgICAgICAgICAgICJ3aWxsIGJlIHVzZWQgZm9yIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1c2luZ1Byb3h5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVzaW5nUHJveHlTZWxlY3RvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTU3MAogICAgICAgICBNb2NrU2VydmVyIHNlcnZlciA9IG5ldyBNb2NrU2VydmVyKCJzZXJ2ZXIiKTsKQEAgLTI2NCw3ICsyOTksMTkgQEAKICAgICAgICAgICAgIFByb3h5U2VsZWN0b3Iuc2V0RGVmYXVsdChkZWZQUyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmVzcG9uc2VDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3h5QXV0aG9yaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgdXAgdGVzdCBBdXRoZW50aWNhdG9yCiAgICAgICAgIEF1dGhlbnRpY2F0b3Iuc2V0RGVmYXVsdChuZXcgQXV0aGVudGljYXRvcigpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHBzL0FsbFRlc3RzLmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwcy9BbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODA1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwcy9BbGxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKworLyoqCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOworICovCisKK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihBbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3RzIGZvciBIdHRwVVJMQ29ubmVjdG9uLCBIdHRwc1VSTENvbm5lY3Rpb24uIik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSHR0cHNVUkxDb25uZWN0aW9uVGVzdC5jbGFzcyk7CisKKyAgICAgICAgLy8gJEpVbml0LUVORCQKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHBzL0h0dHBzVVJMQ29ubmVjdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHBzL0h0dHBzVVJMQ29ubmVjdGlvblRlc3QuamF2YQppbmRleCBmNmQxNjExLi4zZmViZDY1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwcy9IdHRwc1VSTENvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cHMvSHR0cHNVUkxDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtNjUsNiArNzAsNyBAQAogICogPGJyPgogICogVGhlIHBhc3N3b3JkIHRvIHRoZSBjZXJ0c3RvcmUgc2hvdWxkIGJlICJwYXNzd29yZCIgKHdpdGhvdXQgcXVvdGVzKS4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhIdHRwc1VSTENvbm5lY3Rpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEh0dHBzVVJMQ29ubmVjdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvLyB0aGUgcGFzc3dvcmQgdG8gdGhlIHN0b3JlCkBAIC0xMDEsNyArMTA3LDE3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHRoYXQgSHR0cHNVUkxDb25uZWN0aW9uJ3MgZGVmYXVsdCBTU0xTb2NrZXRGYWN0b3J5IGlzIG9wZXJhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U1NMU29ja2V0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgSHR0cHNVUkxDb25uZWN0aW9uJ3MgZGVmYXVsdCAiICsKKyAgICAgICAgICAgICJTU0xTb2NrZXRGYWN0b3J5IGlzIG9wZXJhYmxlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXREZWZhdWx0U1NMU29ja2V0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBzZXQgdXAgdGhlIHByb3BlcnRpZXMgZGVmaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG5lZWRlZCBieSBTU0wgc3R1ZmYKICAgICAgICAgc2V0VXBTdG9yZVByb3BlcnRpZXMoKTsKIApAQCAtMTI3LDcgKzE0MywxOSBAQAogICAgICAqIHRlc3QgY2hlY2tzIGNvbm5lY3Rpb24gc3RhdGUgcGFyYW1ldGVycyBlc3RhYmxpc2hlZCBieQogICAgICAqIEh0dHBzVVJMQ29ubmVjdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cHNDb25uZWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgIGlmIEhUVFBTIGNvbm5lY3Rpb24gcGVyZm9ybXMgaW5pdGlhbCBTU0wgIiArCisgICAgICAgICAgICAiaGFuZHNoYWtlIHdpdGggdGhlIHNlcnZlciB3b3JraW5nIG92ZXIgU1NMLCBzZW5kcyAiICsKKyAgICAgICAgICAgICJlbmNyeXB0ZWQgSFRUUCByZXF1ZXN0LCBhbmQgcmVjZWl2ZXMgZXhwZWN0ZWQgSFRUUCAiICsKKyAgICAgICAgICAgICJyZXNwb25zZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0SHR0cHNDb25uZWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIHNldCB1cCB0aGUgcHJvcGVydGllcyBkZWZpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgbmVlZGVkIGJ5IFNTTCBzdHVmZgogICAgICAgICBzZXRVcFN0b3JlUHJvcGVydGllcygpOwogCkBAIC0xNjQsNyArMTkyLDI1IEBACiAgICAgICogVGVzdHMgdGhlIGJlaGF2aW91ciBvZiBIVFRQUyBjb25uZWN0aW9uIGluIGNhc2Ugb2YgdW5hdmFpbGFiaWxpdHkKICAgICAgKiBvZiByZXF1ZXN0ZWQgcmVzb3VyY2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEh0dHBzQ29ubmVjdGlvbl9Ob3RfRm91bmRfUmVzcG9uc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgYmVoYXZpb3VyIG9mIEhUVFBTIGNvbm5lY3Rpb24gaW4gY2FzZSBvZiAiICsKKyAgICAgICAgICAgICJ1bmF2YWlsYWJpbGl0eSBvZiByZXF1ZXN0ZWQgcmVzb3VyY2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RG9JbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENvbm5lY3RUaW1lb3V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRSZWFkVGltZW91dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0SHR0cHNDb25uZWN0aW9uX05vdF9Gb3VuZF9SZXNwb25zZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBzZXQgdXAgdGhlIHByb3BlcnRpZXMgZGVmaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG5lZWRlZCBieSBTU0wgc3R1ZmYKICAgICAgICAgc2V0VXBTdG9yZVByb3BlcnRpZXMoKTsKIApAQCAtMjA1LDcgKzI1MSwxNyBAQAogICAgICAqIFRlc3RzIHBvc3NpYmlsaXR5IHRvIHNldCB1cCB0aGUgZGVmYXVsdCBTU0xTb2NrZXRGYWN0b3J5CiAgICAgICogdG8gYmUgdXNlZCBieSBIdHRwc1VSTENvbm5lY3Rpb24uCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zc2liaWxpdHkgdG8gc2V0IHVwIHRoZSBkZWZhdWx0ICIgKworICAgICAgICAgICAgIlNTTFNvY2tldEZhY3RvcnkgdG8gYmUgdXNlZCBieSBIdHRwc1VSTENvbm5lY3Rpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFNldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgU1NMU2VydmVyU29ja2V0IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBzZXJ2ZXIgc2lkZQogICAgICAgICBTU0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKICAgICAgICAgU1NMU2VydmVyU29ja2V0IHNzID0gKFNTTFNlcnZlclNvY2tldCkgY3R4LmdldFNlcnZlclNvY2tldEZhY3RvcnkoKQpAQCAtMjU0LDcgKzMxMCwxNyBAQAogICAgICAqIFRlc3RzIHBvc3NpYmlsaXR5IHRvIHNldCB1cCB0aGUgU1NMU29ja2V0RmFjdG9yeQogICAgICAqIHRvIGJlIHVzZWQgYnkgSHR0cHNVUkxDb25uZWN0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTU0xTb2NrZXRGYWN0b3J5KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zc2liaWxpdHkgdG8gc2V0IHVwIHRoZSBTU0xTb2NrZXRGYWN0b3J5ICIgKyAKKyAgICAgICAgICAgICJ0byBiZSB1c2VkIGJ5IEh0dHBzVVJMQ29ubmVjdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTU0xTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RTZXRTU0xTb2NrZXRGYWN0b3J5KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgU1NMU2VydmVyU29ja2V0IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBzZXJ2ZXIgc2lkZQogICAgICAgICBTU0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKICAgICAgICAgU1NMU2VydmVyU29ja2V0IHNzID0gKFNTTFNlcnZlclNvY2tldCkgY3R4LmdldFNlcnZlclNvY2tldEZhY3RvcnkoKQpAQCAtMzAxLDYgKzM2NywzMyBAQAogICAgICAqIFRlc3RzIHRoZSBiZWhhdmlvdXIgb2YgSHR0cHNVUkxDb25uZWN0aW9uIGluIGNhc2Ugb2YgcmV0cmlldmluZwogICAgICAqIG9mIHRoZSBjb25uZWN0aW9uIHN0YXRlIHBhcmFtZXRlcnMgYmVmb3JlIGNvbm5lY3Rpb24gaGFzIGJlZW4gbWFkZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgYmVoYXZpb3VyIG9mIEh0dHBzVVJMQ29ubmVjdGlvbiBpbiBjYXNlICIgKworICAgICAgICAgICAgIm9mIHJldHJpZXZpbmcgb2YgdGhlIGNvbm5lY3Rpb24gc3RhdGUgcGFyYW1ldGVycyBiZWZvcmUgIiArCisgICAgICAgICAgICAiY29ubmVjdGlvbiBoYXMgYmVlbiBtYWRlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENpcGhlclN1aXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZWVyUHJpbmNpcGFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbFByaW5jaXBhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VydmVyQ2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbENlcnRpZmljYXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVbmNvbm5lY3RlZFN0YXRlUGFyYW1ldGVycygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBjcmVhdGUgSHR0cHNVUkxDb25uZWN0aW9uIHRvIGJlIHRlc3RlZAogICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cHM6Ly9sb2NhbGhvc3Q6NTU1NTUiKTsKQEAgLTMzMyw3ICs0MjYsMTcgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBpZiBzZXRIb3N0bmFtZVZlcmlmaWVyKCkgbWV0aG9kIHJlcGxhY2VzIGRlZmF1bHQgdmVyaWZpZXIuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEhvc3RuYW1lVmVyaWZpZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpZiBzZXRIb3N0bmFtZVZlcmlmaWVyKCkgbWV0aG9kIHJlcGxhY2VzICIgKworICAgICAgICAgICAgImRlZmF1bHQgdmVyaWZpZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SG9zdG5hbWVWZXJpZmllciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0U2V0SG9zdG5hbWVWZXJpZmllcigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBzZXR0aW5nIHVwIHRoZSBwcm9wZXJ0aWVzIHBvaW50aW5nIHRvIHRoZSBrZXkvdHJ1c3Qgc3RvcmVzCiAgICAgICAgIHNldFVwU3RvcmVQcm9wZXJ0aWVzKCk7CiAKQEAgLTM3NSw3ICs0NzgsMTcgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGUgYmVoYXZpb3VyIGluIGNhc2Ugb2Ygc2VuZGluZyB0aGUgZGF0YSB0byB0aGUgc2VydmVyLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZG9PdXRwdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgYmVoYXZpb3VyIGluIGNhc2Ugb2Ygc2VuZGluZyB0aGUgZGF0YSB0byAiICsKKyAgICAgICAgICAgICJ0aGUgc2VydmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERvT3V0cHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2RvT3V0cHV0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIHNldHRpbmcgdXAgdGhlIHByb3BlcnRpZXMgcG9pbnRpbmcgdG8gdGhlIGtleS90cnVzdCBzdG9yZXMKICAgICAgICAgc2V0VXBTdG9yZVByb3BlcnRpZXMoKTsKIApAQCAtNDEwLDcgKzUyMywyNSBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIEhUVFBTIGNvbm5lY3Rpb24gcHJvY2VzcyBtYWRlIHRocm91Z2ggdGhlIHByb3h5IHNlcnZlci4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJveHlDb25uZWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSFRUUFMgY29ubmVjdGlvbiBwcm9jZXNzIG1hZGUgdGhyb3VnaCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRoZSBwcm94eSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RG9JbnB1dCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldENvbm5lY3RUaW1lb3V0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRSZWFkVGltZW91dCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgCisgICAgcHVibGljIHZvaWQgX3Rlc3RQcm94eUNvbm5lY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gc2V0dGluZyB1cCB0aGUgcHJvcGVydGllcyBwb2ludGluZyB0byB0aGUga2V5L3RydXN0IHN0b3JlcwogICAgICAgICBzZXRVcFN0b3JlUHJvcGVydGllcygpOwogCkBAIC00NDYsNyArNTc3LDI1IEBACiAgICAgICogVGVzdHMgSFRUUFMgY29ubmVjdGlvbiBwcm9jZXNzIG1hZGUgdGhyb3VnaCB0aGUgcHJveHkgc2VydmVyLgogICAgICAqIFByb3h5IHNlcnZlciBuZWVkcyBhdXRoZW50aWNhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJveHlBdXRoQ29ubmVjdGlvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEhUVFBTIGNvbm5lY3Rpb24gcHJvY2VzcyBtYWRlIHRocm91Z2ggdGhlIHByb3h5ICIgKworICAgICAgICAgICAgInNlcnZlci4gUHJveHkgc2VydmVyIG5lZWRzIGF1dGhlbnRpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldERvSW5wdXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICAgKSwKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDb25uZWN0VGltZW91dCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICksCisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmVhZFRpbWVvdXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFByb3h5QXV0aENvbm5lY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gc2V0dGluZyB1cCB0aGUgcHJvcGVydGllcyBwb2ludGluZyB0byB0aGUga2V5L3RydXN0IHN0b3JlcwogICAgICAgICBzZXRVcFN0b3JlUHJvcGVydGllcygpOwogCkBAIC00OTIsNyArNjQxLDI1IEBACiAgICAgICogdGhlIGNvbm5lY3Rpb24gaXMgb3BlbmVkIHRocm91Z2ggb25lIHByb3h5LAogICAgICAqIGZvciB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCBhbm90aGVyLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zZXF1ZW50UHJveHlDb25uZWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSFRUUFMgY29ubmVjdGlvbiBwcm9jZXNzIG1hZGUgdGhyb3VnaCAiICsKKyAgICAgICAgICAgICJ0aGUgcHJveHkgc2VydmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENpcGhlclN1aXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbFByaW5jaXBhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGVlclByaW5jaXBhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0Q29uc2VxdWVudFByb3h5Q29ubmVjdGlvbigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBzZXR0aW5nIHVwIHRoZSBwcm9wZXJ0aWVzIHBvaW50aW5nIHRvIHRoZSBrZXkvdHJ1c3Qgc3RvcmVzCiAgICAgICAgIHNldFVwU3RvcmVQcm9wZXJ0aWVzKCk7CiAKQEAgLTUzNyw3ICs3MDQsMzAgQEAKICAgICAgKiBQcm94eSBzZXJ2ZXIgbmVlZHMgYXV0aGVudGljYXRpb24uCiAgICAgICogQ2xpZW50IHNlbmRzIGRhdGEgdG8gdGhlIHNlcnZlci4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJveHlBdXRoQ29ubmVjdGlvbl9kb091dHB1dCgpIHRocm93cyBUaHJvd2FibGUgeworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEhUVFBTIGNvbm5lY3Rpb24gcHJvY2VzcyBtYWRlIHRocm91Z2ggdGhlICIgKworICAgICAgICAgICAgICAgICAgICAicHJveHkgc2VydmVyLiBQcm94eSBzZXJ2ZXIgbmVlZHMgYXV0aGVudGljYXRpb24uICIgKworICAgICAgICAgICAgICAgICAgIkNsaWVudCBzZW5kcyBkYXRhIHRvIHRoZSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RG9JbnB1dCIsCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldENvbm5lY3RUaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRSZWFkVGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RG9PdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RQcm94eUF1dGhDb25uZWN0aW9uX2RvT3V0cHV0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIHNldHRpbmcgdXAgdGhlIHByb3BlcnRpZXMgcG9pbnRpbmcgdG8gdGhlIGtleS90cnVzdCBzdG9yZXMKICAgICAgICAgc2V0VXBTdG9yZVByb3BlcnRpZXMoKTsKIApAQCAtNTgxLDcgKzc3MSwyNiBAQAogICAgICAqIFByb3h5IHNlcnZlciBuZWVkcyBhdXRoZW50aWNhdGlvbiBidXQgY2xpZW50IGZhaWxzIHRvIGF1dGhlbnRpY2F0ZQogICAgICAqIChBdXRoZW50aWNhdG9yIHdhcyBub3Qgc2V0IHVwIGluIHRoZSBzeXN0ZW0pLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm94eUF1dGhDb25uZWN0aW9uRmFpbGVkKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSFRUUFMgY29ubmVjdGlvbiBwcm9jZXNzIG1hZGUgdGhyb3VnaCB0aGUgcHJveHkgIiArCisgICAgICAgICAgICAic2VydmVyLiBQcm94eSBzZXJ2ZXIgbmVlZHMgYXV0aGVudGljYXRpb24gYnV0IGNsaWVudCBmYWlscyAiICsKKyAgICAgICAgICAgICJ0byBhdXRoZW50aWNhdGUgKEF1dGhlbnRpY2F0b3Igd2FzIG5vdCBzZXQgdXAgaW4gdGhlIHN5c3RlbSkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RG9JbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENvbm5lY3RUaW1lb3V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRSZWFkVGltZW91dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KSAgICAKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFByb3h5QXV0aENvbm5lY3Rpb25GYWlsZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gc2V0dGluZyB1cCB0aGUgcHJvcGVydGllcyBwb2ludGluZyB0byB0aGUga2V5L3RydXN0IHN0b3JlcwogICAgICAgICBzZXRVcFN0b3JlUHJvcGVydGllcygpOwogCkBAIC02MjIsNyArODMxLDI1IEBACiAgICAgICogVGVzdHMgdGhlIGJlaGF2aW91ciBvZiBIVFRQUyBjb25uZWN0aW9uIGluIGNhc2Ugb2YgdW5hdmFpbGFiaWxpdHkKICAgICAgKiBvZiByZXF1ZXN0ZWQgcmVzb3VyY2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3h5Q29ubmVjdGlvbl9Ob3RfRm91bmRfUmVzcG9uc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgYmVoYXZpb3VyIG9mIEhUVFBTIGNvbm5lY3Rpb24gaW4gY2FzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9mIHVuYXZhaWxhYmlsaXR5IG9mIHJlcXVlc3RlZCByZXNvdXJjZS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREb0lucHV0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q29ubmVjdFRpbWVvdXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldFJlYWRUaW1lb3V0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgICAKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFByb3h5Q29ubmVjdGlvbl9Ob3RfRm91bmRfUmVzcG9uc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gc2V0dGluZyB1cCB0aGUgcHJvcGVydGllcyBwb2ludGluZyB0byB0aGUga2V5L3RydXN0IHN0b3JlcwogICAgICAgICBzZXRVcFN0b3JlUHJvcGVydGllcygpOwogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9CdWZmZXJlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vQnVmZmVyZWRJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA4M2ZkZWY0Li5hZjE1MzdhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9CdWZmZXJlZElucHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDcxICsxNiwxMDMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhCdWZmZXJlZElucHV0U3RyZWFtLmNsYXNzKQogcHVibGljIGNsYXNzIEJ1ZmZlcmVkSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBidWYgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDAsIDEsIDIsIDMsIDQgfSksIDIpOwotCQlidWYubWFyaygzKTsKLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbM107Ci0JCWludCByZXN1bHQgPSBidWYucmVhZChieXRlcyk7Ci0JCWFzc2VydEVxdWFscygzLCByZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoIkFzc2VydCAwOiIsIDAsIGJ5dGVzWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMToiLCAxLCBieXRlc1sxXSk7Ci0JCWFzc2VydEVxdWFscygiQXNzZXJ0IDI6IiwgMiwgYnl0ZXNbMl0pOwotCQlhc3NlcnRFcXVhbHMoIkFzc2VydCAzOiIsIDMsIGJ1Zi5yZWFkKCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jbWFyayhpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcmsiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBidWYgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDAsIDEsIDIsIDMsIDQgfSksIDIpOworICAgICAgICBidWYubWFyaygzKTsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbM107CisgICAgICAgIGludCByZXN1bHQgPSBidWYucmVhZChieXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAwOiIsIDAsIGJ5dGVzWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMToiLCAxLCBieXRlc1sxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXNzZXJ0IDI6IiwgMiwgYnl0ZXNbMl0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAzOiIsIDMsIGJ1Zi5yZWFkKCkpOwogCi0JCWJ1ZiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMCwgMSwgMiwgMywgNCB9KSwgMik7Ci0JCWJ1Zi5tYXJrKDMpOwotCQlieXRlcyA9IG5ldyBieXRlWzRdOwotCQlyZXN1bHQgPSBidWYucmVhZChieXRlcyk7Ci0JCWFzc2VydEVxdWFscyg0LCByZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoIkFzc2VydCA0OiIsIDAsIGJ5dGVzWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgNToiLCAxLCBieXRlc1sxXSk7Ci0JCWFzc2VydEVxdWFscygiQXNzZXJ0IDY6IiwgMiwgYnl0ZXNbMl0pOwotCQlhc3NlcnRFcXVhbHMoIkFzc2VydCA3OiIsIDMsIGJ5dGVzWzNdKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgODoiLCA0LCBidWYucmVhZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgOToiLCAtMSwgYnVmLnJlYWQoKSk7CisgICAgICAgIGJ1ZiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMCwgMSwgMiwgMywgNCB9KSwgMik7CisgICAgICAgIGJ1Zi5tYXJrKDMpOworICAgICAgICBieXRlcyA9IG5ldyBieXRlWzRdOworICAgICAgICByZXN1bHQgPSBidWYucmVhZChieXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCByZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCA0OiIsIDAsIGJ5dGVzWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgNToiLCAxLCBieXRlc1sxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXNzZXJ0IDY6IiwgMiwgYnl0ZXNbMl0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCA3OiIsIDMsIGJ5dGVzWzNdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgODoiLCA0LCBidWYucmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgOToiLCAtMSwgYnVmLnJlYWQoKSk7CiAKLQkJYnVmID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0IH0pLCAyKTsKLQkJYnVmLm1hcmsoSW50ZWdlci5NQVhfVkFMVUUpOwotCQlidWYucmVhZCgpOwotCQlidWYuY2xvc2UoKTsKLQl9Ci0JCi0JLyoKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gc3RyID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obnVsbCk7Ci0JCQlzdHIucmVhZCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgYW4gSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gRXhwZWN0ZWQKLQkJfQotCX0KLQkvKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtSSgpIHsKLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gc3RyID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obnVsbCwgMSk7Ci0JCQlzdHIucmVhZCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgYW4gSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gRXhwZWN0ZWQKLQkJfQotCX0KKyAgICAgICAgYnVmID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0IH0pLCAyKTsKKyAgICAgICAgYnVmLm1hcmsoSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICBidWYucmVhZCgpOworICAgICAgICBidWYuY2xvc2UoKTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNrZWQgb25seS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCdWZmZXJlZElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gc3RyID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obnVsbCk7CisgICAgICAgICAgICBzdHIucmVhZCgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYW4gSU9FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tlZCBvbmx5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJ1ZmZlcmVkSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW1JKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBzdHIgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShudWxsLCAxKTsKKyAgICAgICAgICAgIHN0ci5yZWFkKCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhbiBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vQnVmZmVyZWRSZWFkZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9CdWZmZXJlZFJlYWRlclRlc3QuamF2YQppbmRleCA4YjMwNDcxLi5jNGU0Nzc0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9CdWZmZXJlZFJlYWRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9CdWZmZXJlZFJlYWRlclRlc3QuamF2YQpAQCAtMTYsODAgKzE2LDEwMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoQnVmZmVyZWRSZWFkZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQnVmZmVyZWRSZWFkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIjcmVhZChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTU0Ci0JCWNoYXJbXSBjaCA9IHt9OwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IENoYXJBcnJheVJlYWRlcihjaCkpOwotCQl0cnkgewotCQkJLy8gQ2hlY2sgZXhjZXB0aW9uIHRocm93biB3aGVuIHRoZSByZWFkZXIgaXMgb3Blbi4KLQkJCXJlYWRlci5yZWFkKG51bGwsIDEsIDApOwotCQkJZmFpbCgiQXNzZXJ0IDA6IE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEV4cGVjdGVkCi0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGV4Y2VwdGlvbnMiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTU0CisgICAgICAgIGNoYXJbXSBjaCA9IHt9OworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IENoYXJBcnJheVJlYWRlcihjaCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ2hlY2sgZXhjZXB0aW9uIHRocm93biB3aGVuIHRoZSByZWFkZXIgaXMgb3Blbi4KKyAgICAgICAgICAgIHJlYWRlci5yZWFkKG51bGwsIDEsIDApOworICAgICAgICAgICAgZmFpbCgiQXNzZXJ0IDA6IE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgIH0KIAotCQkvLyBOb3cgY2hlY2sgSU9FeGNlcHRpb24gaXMgdGhyb3duIGluIHByZWZlcmVuY2UgdG8KLQkJLy8gTnVsbFBvaW50ZXJleGNlcHRpb24gd2hlbiB0aGUgcmVhZGVyIGlzIGNsb3NlZC4KLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZWFkZXIucmVhZChudWxsLCAxLCAwKTsKLQkJCWZhaWwoIkFzc2VydCAxOiBJT0V4Y2VwdGlvbiBleHBlY3RlZCIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFeHBlY3RlZAotCQl9CisgICAgICAgIC8vIE5vdyBjaGVjayBJT0V4Y2VwdGlvbiBpcyB0aHJvd24gaW4gcHJlZmVyZW5jZSB0bworICAgICAgICAvLyBOdWxsUG9pbnRlcmV4Y2VwdGlvbiB3aGVuIHRoZSByZWFkZXIgaXMgY2xvc2VkLgorICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5yZWFkKG51bGwsIDEsIDApOworICAgICAgICAgICAgZmFpbCgiQXNzZXJ0IDE6IElPRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJLy8gQW5kIGNoZWNrIHRoYXQgdGhlIElPRXhjZXB0aW9uIGlzIHRocm93biBiZWZvcmUKLQkJCS8vIEFycmF5SW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uCi0JCQlyZWFkZXIucmVhZChjaCwgMCwgNDIpOwotCQkJZmFpbCgiQXNzZXJ0IDI6IElPRXhjZXB0aW9uIGV4cGVjdGVkIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIjbWFyayhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJ1ZiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCIwMTIzNCIpLCAyKTsKLQkJYnVmLm1hcmsoMyk7Ci0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzNdOwotCQlpbnQgcmVzdWx0ID0gYnVmLnJlYWQoY2hhcnMpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMDoiLCAnMCcsIGNoYXJzWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMToiLCAnMScsIGNoYXJzWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMjoiLCAnMicsIGNoYXJzWzJdKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMzoiLCAnMycsIGJ1Zi5yZWFkKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQW5kIGNoZWNrIHRoYXQgdGhlIElPRXhjZXB0aW9uIGlzIHRocm93biBiZWZvcmUKKyAgICAgICAgICAgIC8vIEFycmF5SW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICByZWFkZXIucmVhZChjaCwgMCwgNDIpOworICAgICAgICAgICAgZmFpbCgiQXNzZXJ0IDI6IElPRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIjbWFyayhpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICYgSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcmsiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnVmID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIjAxMjM0IiksIDIpOworICAgICAgICBidWYubWFyaygzKTsKKyAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbM107CisgICAgICAgIGludCByZXN1bHQgPSBidWYucmVhZChjaGFycyk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAwOiIsICcwJywgY2hhcnNbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAxOiIsICcxJywgY2hhcnNbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAyOiIsICcyJywgY2hhcnNbMl0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAzOiIsICczJywgYnVmLnJlYWQoKSk7CiAKLQkJYnVmID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIjAxMjM0IiksIDIpOwotCQlidWYubWFyaygzKTsKLQkJY2hhcnMgPSBuZXcgY2hhcls0XTsKLQkJcmVzdWx0ID0gYnVmLnJlYWQoY2hhcnMpOwotCQlhc3NlcnRFcXVhbHMoIkFzc2VydCA0OiIsIDQsIHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiQXNzZXJ0IDU6IiwgJzAnLCBjaGFyc1swXSk7Ci0JCWFzc2VydEVxdWFscygiQXNzZXJ0IDY6IiwgJzEnLCBjaGFyc1sxXSk7Ci0JCWFzc2VydEVxdWFscygiQXNzZXJ0IDc6IiwgJzInLCBjaGFyc1syXSk7Ci0JCWFzc2VydEVxdWFscygiQXNzZXJ0IDg6IiwgJzMnLCBjaGFyc1szXSk7Ci0JCWFzc2VydEVxdWFscygiQXNzZXJ0IDk6IiwgJzQnLCBidWYucmVhZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMTA6IiwgLTEsIGJ1Zi5yZWFkKCkpOworICAgICAgICBidWYgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiMDEyMzQiKSwgMik7CisgICAgICAgIGJ1Zi5tYXJrKDMpOworICAgICAgICBjaGFycyA9IG5ldyBjaGFyWzRdOworICAgICAgICByZXN1bHQgPSBidWYucmVhZChjaGFycyk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXNzZXJ0IDQ6IiwgNCwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgNToiLCAnMCcsIGNoYXJzWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgNjoiLCAnMScsIGNoYXJzWzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgNzoiLCAnMicsIGNoYXJzWzJdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgODoiLCAnMycsIGNoYXJzWzNdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgOToiLCAnNCcsIGJ1Zi5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAxMDoiLCAtMSwgYnVmLnJlYWQoKSk7CiAKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIjAxMjM0IikpOwotCQlyZWFkZXIubWFyayhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCXJlYWRlci5yZWFkKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCX0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIjAxMjM0IikpOworICAgICAgICByZWFkZXIubWFyayhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIHJlYWRlci5yZWFkKCk7CisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vRmlsZUlucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vRmlsZUlucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDgxMGVmMjYuLmIxOTYwNmQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9GaWxlSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDE2ICsxNiwzMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoRmlsZUlucHV0U3RyZWFtLmNsYXNzKQogcHVibGljIGNsYXNzIEZpbGVJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNraW5nIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMjg1CiAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJGaWxlSW5wdXRTdHJlYW0udG1wIik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vRmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAzYTgzNTdmLi4yNGMyZmE1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDE2ICsxNiwzMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEZpbGVPdXRwdXRTdHJlYW0uY2xhc3MpCiBwdWJsaWMgY2xhc3MgRmlsZU91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIE51bGxQb2ludGVyRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTI4NQogICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiRmlsZU91dHB1dFN0cmVhbS50bXAiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL0ZpbGVQZXJtaXNzaW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vRmlsZVBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggYWRmN2VkNy4uMDQ5YTZkZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vRmlsZVBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vRmlsZVBlcm1pc3Npb25UZXN0LmphdmEKQEAgLTE2LDI1ICsxNiwzOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlUGVybWlzc2lvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhGaWxlUGVybWlzc2lvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBGaWxlUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlUGVybWlzc2lvbiNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2ltcGxpZXNMamF2YV9pb19GaWxlUGVybWlzc2lvbigpIHsKLQkJLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS00NwotCQljaGFyIHNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJY2hhciBub25TZXBhcmF0b3IgPSAoc2VwYXJhdG9yID09ICcvJykgPyAnXFwnIDogJy8nOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uI2ltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9pbXBsaWVzTGphdmFfaW9fRmlsZVBlcm1pc3Npb24oKSB7CisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDcKKyAgICAgICAgY2hhciBzZXBhcmF0b3IgPSBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgIGNoYXIgbm9uU2VwYXJhdG9yID0gKHNlcGFyYXRvciA9PSAnLycpID8gJ1xcJyA6ICcvJzsKIAotCQlGaWxlUGVybWlzc2lvbiBmcDEgPSBuZXcgRmlsZVBlcm1pc3Npb24obm9uU2VwYXJhdG9yICsgIioiLCAicmVhZCIpOwotCQlGaWxlUGVybWlzc2lvbiBmcDIgPSBuZXcgRmlsZVBlcm1pc3Npb24oc2VwYXJhdG9yICsgImEiLCAicmVhZCIpOwotCQlhc3NlcnRGYWxzZSgiQXNzZXJ0IDA6IG5vbi1zZXBhcmF0b3Igd29ya2VkIiwgZnAxLmltcGxpZXMoZnAyKSk7Ci0JCWZwMSA9IG5ldyBGaWxlUGVybWlzc2lvbihub25TZXBhcmF0b3IgKyAiLSIsICJyZWFkIik7Ci0JCWFzc2VydEZhbHNlKCJBc3NlcnQgMTogbm9uLXNlcGFyYXRvciB3b3JrZWQiLCBmcDEuaW1wbGllcyhmcDIpKTsKLQl9CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZwMSA9IG5ldyBGaWxlUGVybWlzc2lvbihub25TZXBhcmF0b3IgKyAiKiIsICJyZWFkIik7CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZwMiA9IG5ldyBGaWxlUGVybWlzc2lvbihzZXBhcmF0b3IgKyAiYSIsICJyZWFkIik7CisgICAgICAgIGFzc2VydEZhbHNlKCJBc3NlcnQgMDogbm9uLXNlcGFyYXRvciB3b3JrZWQiLCBmcDEuaW1wbGllcyhmcDIpKTsKKyAgICAgICAgZnAxID0gbmV3IEZpbGVQZXJtaXNzaW9uKG5vblNlcGFyYXRvciArICItIiwgInJlYWQiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkFzc2VydCAxOiBub24tc2VwYXJhdG9yIHdvcmtlZCIsIGZwMS5pbXBsaWVzKGZwMikpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL0ZpbGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9GaWxlVGVzdC5qYXZhCmluZGV4IGRhMTc2MjMuLjQ4NGFlOWIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL0ZpbGVUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vRmlsZVRlc3QuamF2YQpAQCAtMTYsNzggKzE2LDExMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEZpbGUuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI0ZpbGUoamF2YS5pby5GaWxlLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0yMQotCQlGaWxlIHBhdGggPSBuZXcgRmlsZSgiL2Rpci9maWxlIik7Ci0JCUZpbGUgcm9vdCA9IG5ldyBGaWxlKCIvIik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJvb3QsICIvZGlyL2ZpbGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgMTogd3JvbmcgcGF0aCByZXN1bHQgIiwgcGF0aC5nZXRQYXRoKCksIGZpbGUKLQkJCQkuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiQXNzZXJ0IDEuMTogcGF0aCBub3QgYWJzb2x1dGUgIiwgbmV3IEZpbGUoIlxcXFxcXGFcYiIpLmlzQWJzb2x1dGUoKSk7Ci0JCQotCQkvLyBUZXN0IGRhdGEgdXNlZCBpbiBhIGZldyBwbGFjZXMgYmVsb3cKLQkJU3RyaW5nIGRpck5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9ICJpbnB1dC50c3QiOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjRmlsZShqYXZhLmlvLkZpbGUsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZUxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMjEKKyAgICAgICAgRmlsZSBwYXRoID0gbmV3IEZpbGUoIi9kaXIvZmlsZSIpOworICAgICAgICBGaWxlIHJvb3QgPSBuZXcgRmlsZSgiLyIpOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyb290LCAiL2Rpci9maWxlIik7CisgICAgICAgIGFzc2VydEVxdWFscygiQXNzZXJ0IDE6IHdyb25nIHBhdGggcmVzdWx0ICIsIHBhdGguZ2V0UGF0aCgpLCBmaWxlCisgICAgICAgICAgICAgICAgLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkFzc2VydCAxLjE6IHBhdGggbm90IGFic29sdXRlICIsIG5ldyBGaWxlKCJcXFxcXFxhXGIiKS5pc0Fic29sdXRlKCkpOworICAgICAgICAKKyAgICAgICAgLy8gVGVzdCBkYXRhIHVzZWQgaW4gYSBmZXcgcGxhY2VzIGJlbG93CisgICAgICAgIFN0cmluZyBkaXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAiaW5wdXQudHN0IjsKIAotCQkvLyBDaGVjayBmaWxlbmFtZSBpcyBwcmVzZXJ2ZWQgY29ycmVjdGx5Ci0JCUZpbGUgZCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShkLCBmaWxlTmFtZSk7Ci0JCWlmICghZGlyTmFtZQotCQkJCS5yZWdpb25NYXRjaGVzKChkaXJOYW1lLmxlbmd0aCgpIC0gMSksIEZpbGUuc2VwYXJhdG9yLCAwLCAxKSkgewotCQkJZGlyTmFtZSArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCQlkaXJOYW1lICs9IGZpbGVOYW1lOwotCQlhc3NlcnRUcnVlKCJBc3NlcnQgMjogQ3JlYXRlZCBpbmNvcnJlY3QgZmlsZSAiICsgZi5nZXRQYXRoKCksIGYKLQkJCQkuZ2V0UGF0aCgpLmVxdWFscyhkaXJOYW1lKSk7CisgICAgICAgIC8vIENoZWNrIGZpbGVuYW1lIGlzIHByZXNlcnZlZCBjb3JyZWN0bHkKKyAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUoZGlyTmFtZSk7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGQsIGZpbGVOYW1lKTsKKyAgICAgICAgaWYgKCFkaXJOYW1lCisgICAgICAgICAgICAgICAgLnJlZ2lvbk1hdGNoZXMoKGRpck5hbWUubGVuZ3RoKCkgLSAxKSwgRmlsZS5zZXBhcmF0b3IsIDAsIDEpKSB7CisgICAgICAgICAgICBkaXJOYW1lICs9IEZpbGUuc2VwYXJhdG9yOworICAgICAgICB9CisgICAgICAgIGRpck5hbWUgKz0gZmlsZU5hbWU7CisgICAgICAgIGFzc2VydFRydWUoIkFzc2VydCAyOiBDcmVhdGVkIGluY29ycmVjdCBmaWxlICIgKyBmLmdldFBhdGgoKSwgZgorICAgICAgICAgICAgICAgIC5nZXRQYXRoKCkuZXF1YWxzKGRpck5hbWUpKTsKIAotCQkvLyBDaGVjayBudWxsIGFyZ3VtZW50IGlzIGhhbmRsZWQKLQkJdHJ5IHsKLQkJCWYgPSBuZXcgRmlsZShkLCBudWxsKTsKLQkJCWZhaWwoIkFzc2VydCAzOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duLiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFeHBlY3RlZC4KLQkJfQorICAgICAgICAvLyBDaGVjayBudWxsIGFyZ3VtZW50IGlzIGhhbmRsZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYgPSBuZXcgRmlsZShkLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkFzc2VydCAzOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZC4KKyAgICAgICAgfQogCi0JCWYgPSBuZXcgRmlsZSgoRmlsZSkgbnVsbCwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJBc3NlcnQgNDogQ3JlYXRlZCBpbmNvcnJlY3QgZmlsZSAiICsgZi5nZXRQYXRoKCksIGYKLQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGRpck5hbWUpKTsKLQkJCi0JCS8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDYKLQkJRmlsZSBmMSA9IG5ldyBGaWxlKCJhIik7Ci0JCUZpbGUgZjIgPSBuZXcgRmlsZSgiYS8iKTsKLQkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgNTogVHJhaWxpbmcgc2xhc2ggZmlsZSBuYW1lIGlzIGluY29ycmVjdCIsIGYxLCBmMik7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JCS8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNTMKLQkJU3RyaW5nIG1peGVkRm5hbWUgPSAiU29NZSBGaUxlTmFNZSI7Ci0JCUZpbGUgbWZpbGUgPSBuZXcgRmlsZShtaXhlZEZuYW1lKTsKLQkJRmlsZSBsZmlsZSA9IG5ldyBGaWxlKG1peGVkRm5hbWUudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIGYgPSBuZXcgRmlsZSgoRmlsZSkgbnVsbCwgZmlsZU5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJBc3NlcnQgNDogQ3JlYXRlZCBpbmNvcnJlY3QgZmlsZSAiICsgZi5nZXRQYXRoKCksIGYKKyAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGRpck5hbWUpKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDYKKyAgICAgICAgRmlsZSBmMSA9IG5ldyBGaWxlKCJhIik7CisgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZSgiYS8iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBc3NlcnQgNTogVHJhaWxpbmcgc2xhc2ggZmlsZSBuYW1lIGlzIGluY29ycmVjdCIsIGYxLCBmMik7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjaGFzaENvZGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNTMKKyAgICAgICAgU3RyaW5nIG1peGVkRm5hbWUgPSAiU29NZSBGaUxlTmFNZSI7CisgICAgICAgIEZpbGUgbWZpbGUgPSBuZXcgRmlsZShtaXhlZEZuYW1lKTsKKyAgICAgICAgRmlsZSBsZmlsZSA9IG5ldyBGaWxlKG1peGVkRm5hbWUudG9Mb3dlckNhc2UoKSk7CiAKLQkJaWYgKG1maWxlLmVxdWFscyhsZmlsZSkpIHsKLQkJCWFzc2VydFRydWUoIkFzc2VydCAwOiB3cm9uZyBoYXNoY29kZSIsIG1maWxlLmhhc2hDb2RlKCkgPT0gbGZpbGUuaGFzaENvZGUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRGYWxzZSgiQXNzZXJ0IDE6IHdyb25nIGhhc2hjb2RlIiwgbWZpbGUuaGFzaENvZGUoKSA9PSBsZmlsZS5oYXNoQ29kZSgpKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKG1maWxlLmVxdWFscyhsZmlsZSkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFzc2VydCAwOiB3cm9uZyBoYXNoY29kZSIsIG1maWxlLmhhc2hDb2RlKCkgPT0gbGZpbGUuaGFzaENvZGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiQXNzZXJ0IDE6IHdyb25nIGhhc2hjb2RlIiwgbWZpbGUuaGFzaENvZGUoKSA9PSBsZmlsZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZ2V0UGF0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhdGgoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDQ0CiAgICAgICAgIEZpbGUgZmlsZTsKQEAgLTEwMyw2ICsxMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2dldFBhdGgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQYXRoX1dpdGhfRW1wdHlfRmlsZU5hbWUoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODI5CiAgICAgICAgIFN0cmluZyBmMVBhcmVudE5hbWUgPSAiMDEiOwpAQCAtMTI2LDYgKzE2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlbGYgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VyaWFsaXphdGlvbl9zZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZSgidGVzdC5zZXIiKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZih0ZXN0RmlsZSk7CkBAIC0xMzQsNiArMTg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VyaWFsaXphdGlvbl9jb21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJGaWxlVGVzdC5nb2xkZW4uc2VyIik7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBmaWxlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL0lucHV0U3RyZWFtUmVhZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXJUZXN0LmphdmEKaW5kZXggN2E0MWZjMC4uNzVkZThhYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXJUZXN0LmphdmEKQEAgLTE2LDE0ICsxNiwzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoSW5wdXRTdHJlYW1SZWFkZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSW5wdXRTdHJlYW1SZWFkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnB1dFN0cmVhbVJlYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSAKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbmNvZGluZ19TdHJlYW1DbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbiA9IG51bGw7CiAgICAgICAgIGJ5dGUgYltdID0gbmV3IGJ5dGVbNV07CkBAIC0zMywxMSArNTEsMTggQEAKICAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEB0ZXN0cyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyI3JlYWQoKQotICAgICAqLwotCi0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIklucHV0U3RyZWFtUmVhZGVyIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RW5jb2RpbmdfTm90SGlzdG9yaWNhbCgpIHsKICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaW4gPSBudWxsOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW1UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAwMDE5ODUxLi42YzlmOTMyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMzIsOSArMzcsMTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKE9iamVjdElucHV0U3RyZWFtLmNsYXNzKQogcHVibGljIGNsYXNzIE9iamVjdElucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gQ2hlY2tzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRVbnNoYXJlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZFVuc2hhcmVkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTgxOQogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKQEAgLTU1LDg0ICs2OSwxMDIgQEAKICAgICAgICAgfQogICAgIH0gCiAKLQkvKioKLQkgKiBNaWNyby1zY2VuYXJpbyBvZiBkZS9zZXJpYWxpemF0aW9uIG9mIGFuIG9iamVjdCB3aXRoIG5vbi1zZXJpYWxpemFibGUgc3VwZXJjbGFzcy4KLQkgKiBUaGUgc3VwZXItY29uc3RydWN0b3Igb25seSBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgZGVzZXJpYWxpemVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZE9iamVjdF9IaWVyYXJjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7IAorICAgIC8qKgorICAgICAqIE1pY3JvLXNjZW5hcmlvIG9mIGRlL3NlcmlhbGl6YXRpb24gb2YgYW4gb2JqZWN0IHdpdGggbm9uLXNlcmlhbGl6YWJsZSBzdXBlcmNsYXNzLgorICAgICAqIFRoZSBzdXBlci1jb25zdHJ1Y3RvciBvbmx5IHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBkZXNlcmlhbGl6ZWQgaW5zdGFuY2UuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZE9iamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZE9iamVjdF9IaWVyYXJjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7IAogCi0JICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOyAKLQkgICAgb29zLndyaXRlT2JqZWN0KG5ldyBCKCkpOwotCSAgICBvb3MuY2xvc2UoKTsgCisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOyAKKyAgICAgICAgb29zLndyaXRlT2JqZWN0KG5ldyBCKCkpOworICAgICAgICBvb3MuY2xvc2UoKTsgCiAKLQkgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsgCi0JICAgIEIgYiA9IChCKSBvaXMucmVhZE9iamVjdCgpOwotCSAgICBvaXMuY2xvc2UoKTsKLQkgICAgCi0JICAgIGFzc2VydFRydWUoInNob3VsZCBjb25zdHJ1Y3Qgc3VwZXIiLCBBLmxpc3QuY29udGFpbnMoYikpOwotCSAgICBhc3NlcnRGYWxzZSgic2hvdWxkIG5vdCBjb25zdHJ1Y3Qgc2VsZiIsIEIubGlzdC5jb250YWlucyhiKSk7Ci0JICAgIGFzc2VydEVxdWFscygic3VwZXIgZmllbGQgQS5zIiwgQS5ERUZBVUxULCAoKEEpYikucyk7Ci0JICAgIGFzc2VydE51bGwoInRyYW5zaWVudCBmaWVsZCBCLnMiLCBiLnMpOwotCX0KLQkKLQkvKioKLQkgKiBAdGVzdHMge0BsaW5rIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jcmVhZE5ld0xvbmdTdHJpbmcoKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWROZXdMb25nU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxvbmdTdHJpbmcgbG9uZ1N0cmluZyA9IG5ldyBMb25nU3RyaW5nKCk7Ci0JCVNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobG9uZ1N0cmluZyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvbmdTdHJpbmcgaW1wbGVtZW50cyBTZXJpYWxpemFibGV7Ci0JCVN0cmluZyBsU3RyaW5nOwotCQkKLQkJcHVibGljIExvbmdTdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJLy8gY29uc3RydWN0IGEgc3RyaW5nIHdob3NlIGxlbmd0aCA+IDY0SwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA2NTYzNjsgaSsrKSB7Ci0JCQkJYnVpbGRlci5hcHBlbmQoJzEnKTsKLQkJCX0KLQkJCWxTdHJpbmcgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvID09IHRoaXMpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvIGluc3RhbmNlb2YgTG9uZ1N0cmluZykgewotCQkJCUxvbmdTdHJpbmcgbCA9IChMb25nU3RyaW5nKSBvOwotCQkJCXJldHVybiBsLmxTdHJpbmcuZXF1YWxzKGwubFN0cmluZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gbFN0cmluZy5oYXNoQ29kZSgpOwotCQl9Ci0JfQorICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOyAKKyAgICAgICAgQiBiID0gKEIpIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGNvbnN0cnVjdCBzdXBlciIsIEEubGlzdC5jb250YWlucyhiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJzaG91bGQgbm90IGNvbnN0cnVjdCBzZWxmIiwgQi5saXN0LmNvbnRhaW5zKGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdXBlciBmaWVsZCBBLnMiLCBBLkRFRkFVTFQsICgoQSliKS5zKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgidHJhbnNpZW50IGZpZWxkIEIucyIsIGIucyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkTmV3TG9uZ1N0cmluZygpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZE5ld0xvbmdTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9uZ1N0cmluZyBsb25nU3RyaW5nID0gbmV3IExvbmdTdHJpbmcoKTsKKyAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihsb25nU3RyaW5nKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9uZ1N0cmluZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZXsKKyAgICAgICAgU3RyaW5nIGxTdHJpbmc7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgTG9uZ1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBzdHJpbmcgd2hvc2UgbGVuZ3RoID4gNjRLCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY1NjM2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnMScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbFN0cmluZyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gdGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMb25nU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgTG9uZ1N0cmluZyBsID0gKExvbmdTdHJpbmcpIG87CisgICAgICAgICAgICAgICAgcmV0dXJuIGwubFN0cmluZy5lcXVhbHMobC5sU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBsU3RyaW5nLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlzdGF0aWMgY2xhc3MgQSB7IAotCQlzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEE+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEE+KCk7ICAKLQkgICAgU3RyaW5nIHM7Ci0JICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiYWFhIjsKLQkgICAgcHVibGljIEEoKSB7Ci0JICAgIAlzID0gREVGQVVMVDsKLQkgICAgCWxpc3QuYWRkKHRoaXMpOwotCSAgICB9Ci0JfSAKKyAgICBzdGF0aWMgY2xhc3MgQSB7IAorICAgICAgICBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEE+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEE+KCk7ICAKKyAgICAgICAgU3RyaW5nIHM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiYWFhIjsKKyAgICAgICAgcHVibGljIEEoKSB7CisgICAgICAgICAgICBzID0gREVGQVVMVDsKKyAgICAgICAgICAgIGxpc3QuYWRkKHRoaXMpOworICAgICAgICB9CisgICAgfSAKIAotCXN0YXRpYyBjbGFzcyBCIGV4dGVuZHMgQSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7IAorICAgIHN0YXRpYyBjbGFzcyBCIGV4dGVuZHMgQSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7IAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKICAgICAgICAgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxBPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxBPigpOyAgCi0JICAgIHRyYW5zaWVudCBTdHJpbmcgczsKLQkgICAgcHVibGljIEIoKSB7Ci0JICAgIAlzID0gImJiYiI7Ci0JICAgIAlsaXN0LmFkZCh0aGlzKTsKLQkgICAgfQotCX0gCQorICAgICAgICB0cmFuc2llbnQgU3RyaW5nIHM7CisgICAgICAgIHB1YmxpYyBCKCkgeworICAgICAgICAgICAgcyA9ICJiYmIiOworICAgICAgICAgICAgbGlzdC5hZGQodGhpcyk7CisgICAgICAgIH0KKyAgICB9ICAgICAKICAgICAKICAgICBjbGFzcyBPSVMgZXh0ZW5kcyBPYmplY3RJbnB1dFN0cmVhbSB7CiAgICAgICAgIApAQCAtMTQ1LDcgKzE3NywxNiBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgIH0KLSAgICAKKyAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJ3aHkgc2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uPyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDbGFzc0Rlc2NyaXB0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRDbGFzc0Rlc2NyaXB0b3IoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbixJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgT0lTKCkudGVzdCgpOwpAQCAtMTc4LDcgKzIxOSwxNSBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTExMUw7CiAgICAgICAgIGludCBpID0gMDsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgSW52YWxpZENsYXNzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc29sdmVDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc29sdmVDbGFzc19pbnZhbGlkQ2xhc3NOYW1lKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTkyMApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vT2JqZWN0U3RyZWFtQ29uc3RhbnRzVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vT2JqZWN0U3RyZWFtQ29uc3RhbnRzVGVzdC5qYXZhCmluZGV4IGI1ZWNmNTIuLjkwZTg1NWEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL09iamVjdFN0cmVhbUNvbnN0YW50c1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9PYmplY3RTdHJlYW1Db25zdGFudHNUZXN0LmphdmEKQEAgLTE2LDI5ICsxNiwzMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNvbnN0YW50czsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoT2JqZWN0U3RyZWFtQ29uc3RhbnRzLmNsYXNzKQogcHVibGljIGNsYXNzIE9iamVjdFN0cmVhbUNvbnN0YW50c1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHMjVENfRU5VTQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfVENfRU5VTSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDEyNiwgT2JqZWN0U3RyZWFtQ29uc3RhbnRzLlRDX0VOVU0pOwotCX0KLQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUNvbnN0YW50cyNTQ19FTlVNCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9TQ19FTlVNKCkgewotCQlhc3NlcnRFcXVhbHMoMTYsIE9iamVjdFN0cmVhbUNvbnN0YW50cy5TQ19FTlVNKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHMjVENfTUFYCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9UQ19NQVgoKSB7Ci0JCWFzc2VydEVxdWFscygxMjYsIE9iamVjdFN0cmVhbUNvbnN0YW50cy5UQ19NQVgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHMjVENfRU5VTQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiQ29uc3RhbnQgdGVzdCwgc3RpbGwgbWFueSBjb25zdGFudHMgbm90IHRlc3RlZCIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0YW50cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNiwgT2JqZWN0U3RyZWFtQ29uc3RhbnRzLlRDX0VOVU0pOworICAgICAgICBhc3NlcnRFcXVhbHMoMTYsIE9iamVjdFN0cmVhbUNvbnN0YW50cy5TQ19FTlVNKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNiwgT2JqZWN0U3RyZWFtQ29uc3RhbnRzLlRDX01BWCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vT3V0cHV0U3RyZWFtV3JpdGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vT3V0cHV0U3RyZWFtV3JpdGVyVGVzdC5qYXZhCmluZGV4IGQ4ZTk2NDUuLmY0ODFkYTggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL091dHB1dFN0cmVhbVdyaXRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9PdXRwdXRTdHJlYW1Xcml0ZXJUZXN0LmphdmEKQEAgLTE2LDQxICsxNiw2OCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhPdXRwdXRTdHJlYW1Xcml0ZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgT3V0cHV0U3RyZWFtV3JpdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5jb2RpbmdfU3RyZWFtQ2xvc2VkKCkgewotCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLAotCQkJCQkiVVRGLTE2QkUiKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJTaG91bGQgbm90IHRocm93IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iKTsKLQkJfQotCQl0cnkgewotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlNob3VsZCBub3QgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gb3V0LmdldEVuY29kaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzdWx0KTsKLQl9CisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIElPRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEVuY29kaW5nX1N0cmVhbUNsb3NlZCgpIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG91dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgIlVURi0xNkJFIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCB0aHJvdyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IHRocm93IElPRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG91dC5nZXRFbmNvZGluZygpOworICAgICAgICBhc3NlcnROdWxsKHJlc3VsdCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEdldEVuY29kaW5nX05vdEhpc3RvcmljYWwoKSB7Ci0JCU91dHB1dFN0cmVhbVdyaXRlciBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksCi0JCQkJCSJVVEYtMTZCRSIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9rCi0JCX0KLQkJU3RyaW5nIHJlc3VsdCA9IG91dC5nZXRFbmNvZGluZygpOwotCQlhc3NlcnRFcXVhbHMoIlVuaWNvZGVCaWdVbm1hcmtlZCIsIHJlc3VsdCk7Ci0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RW5jb2RpbmdfTm90SGlzdG9yaWNhbCgpIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG91dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgIlVURi0xNkJFIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb3V0LmdldEVuY29kaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5pY29kZUJpZ1VubWFya2VkIiwgcmVzdWx0KTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vUHVzaEJhY2tJbnB1dFN0cmVhbVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL1B1c2hCYWNrSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNWMxYjUwZi4uOTk2ODE0NyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vUHVzaEJhY2tJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9QdXNoQmFja0lucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMzEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhQdXNoYmFja0lucHV0U3RyZWFtLmNsYXNzKQogcHVibGljIGNsYXNzIFB1c2hCYWNrSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoKICAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoQmFja0lucHV0U3RyZWFtKElucHV0U3RyZWFtKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBJT0V4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlB1c2hiYWNrSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgUHVzaGJhY2tJbnB1dFN0cmVhbSBzdHIgPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShudWxsKTsKQEAgLTQwLDYgKzU0LDE1IEBACiAgICAgLyoKICAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoQmFja0lucHV0U3RyZWFtKElucHV0U3RyZWFtLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIElPRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHVzaGJhY2tJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbUwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQdXNoYmFja0lucHV0U3RyZWFtIHN0ciA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKG51bGwsIDEpOwpAQCAtNDksMzkgKzcyLDY0IEBACiAgICAgICAgICAgICAvLyBFeHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jdW5yZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF91bnJlYWQkQklJKCkgewotCQkvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ5Ci0JCXRyeSB7Ci0JCQlQdXNoYmFja0lucHV0U3RyZWFtIHBiID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oCi0JCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMCB9KSwgMik7Ci0JCQlwYi51bnJlYWQobmV3IGJ5dGVbMV0sIDAsIDUpOwotCQkJZmFpbCgiQXNzZXJ0IDA6IHNob3VsZCB0aHJvdyBJT0UiKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB7Ci0JCVB1c2hiYWNrSW5wdXRTdHJlYW0gcGIgPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbSgKLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDAgfSksIDIpOwotCQl0cnkgewotCQkJcGIucmVzZXQoKTsKLQkJCWZhaWwoIlNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9tYXJrKCkgewotCQlQdXNoYmFja0lucHV0U3RyZWFtIHBiID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAwIH0pLCAyKTsKLQkJcGIubWFyayhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCXBiLm1hcmsoMCk7Ci0JCXBiLm1hcmsoLTEpOwotCQlwYi5tYXJrKEludGVnZXIuTUlOX1ZBTFVFKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSN1bnJlYWQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bnJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF91bnJlYWQkQklJKCkgeworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQdXNoYmFja0lucHV0U3RyZWFtIHBiID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMCB9KSwgMik7CisgICAgICAgICAgICBwYi51bnJlYWQobmV3IGJ5dGVbMV0sIDAsIDUpOworICAgICAgICAgICAgZmFpbCgiQXNzZXJ0IDA6IHNob3VsZCB0aHJvdyBJT0UiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICBQdXNoYmFja0lucHV0U3RyZWFtIHBiID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAwIH0pLCAyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBiLnJlc2V0KCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFyayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFyaygpIHsKKyAgICAgICAgUHVzaGJhY2tJbnB1dFN0cmVhbSBwYiA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMCB9KSwgMik7CisgICAgICAgIHBiLm1hcmsoSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICBwYi5tYXJrKDApOworICAgICAgICBwYi5tYXJrKC0xKTsKKyAgICAgICAgcGIubWFyayhJbnRlZ2VyLk1JTl9WQUxVRSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vUmFuZG9tQWNjZXNzRmlsZVRlc3QuamF2YQppbmRleCAzZjBiYzllLi45OGYzMzI3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGVUZXN0LmphdmEKQEAgLTE2LDE5ICsxNiwzMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0gIAorQFRlc3RUYXJnZXRDbGFzcyhSYW5kb21BY2Nlc3NGaWxlLmNsYXNzKQogcHVibGljIGNsYXNzIFJhbmRvbUFjY2Vzc0ZpbGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNSYW5kb21BY2Nlc3NGaWxlKGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS01MAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjUmFuZG9tQWNjZXNzRmlsZShqYXZhLmlvLkZpbGUsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUmFuZG9tQWNjZXNzRmlsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTUwCiAgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInh4eCIsICJ5eXkiKTsKICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmLCAicndzIik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9SZWFkZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9SZWFkZXJUZXN0LmphdmEKaW5kZXggOTRjZjJhZC4uNTJlNjliYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vUmVhZGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL1JlYWRlclRlc3QuamF2YQpAQCAtMTYsMTQgKzE2LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhSZWFkZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSZWFkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9SZWFkZXJfQ2hhckJ1ZmZlcl9udWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHMgPSAiTVkgVEVTVCBTVFJJTkciOwogICAgICAgICBNb2NrUmVhZGVyIG1vY2tSZWFkZXIgPSBuZXcgTW9ja1JlYWRlcihzLnRvQ2hhckFycmF5KCkpOwpAQCAtMzUsNyArNDksMTUgQEAKICAgICAgICAgICAgIC8vZXhwZWN0ZWQ7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1JlYWRlcl9DaGFyQnVmZmVyX1plcm9DaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy90aGUgY2hhckJ1ZmZlciBoYXMgdGhlIGNhcGFjaXR5IG9mIDAsIHRoZW4gdGhlcmUgdGhlIG51bWJlciBvZiBjaGFyIHJlYWQKICAgICAgICAgLy8gdG8gdGhlIENoYXJCdWZmZXIgaXMgMC4gRnVydGhlcm1vcmUsIHRoZSBNb2NrUmVhZGVyIGlzIGludGFjdCBpbiBpdHMgY29udGVudC4KQEAgLTQ5LDcgKzcxLDE1IEBACiAgICAgICAgIG1vY2tSZWFkZXIucmVhZChkZXN0QnVmZmVyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIFN0cmluZy52YWx1ZU9mKGRlc3RCdWZmZXIpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1JlYWRlcl9DaGFyQnVmZmVyQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBzID0gIk1ZIFRFU1QgU1RSSU5HIjsKICAgICAgICAgY2hhcltdIHNyY0J1ZmZlciA9IHMudG9DaGFyQXJyYXkoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL1dyaXRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2lvL1dyaXRlclRlc3QuamF2YQppbmRleCBlNGVmYTk0Li42ZjQzOWEyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9pby9Xcml0ZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvaW8vV3JpdGVyVGVzdC5qYXZhCkBAIC0xNiw0NyArMTYsNjAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoV3JpdGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uV3JpdGVyI3dyaXRlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTUxCi0JCU9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwotCQlXcml0ZXIgd3IgPSBuZXcgTW9ja1dyaXRlcihsb2NrKTsKLQkJLy8gRklYTUUgVGhpcyB0ZXN0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZXhjbHVzaW9uIGxpc3QgdW50aWwKLQkJLy8gVGhyZWFkLmhvbGRzTG9jayB3b3JrcyBvbiBJQk0gVk1FCi0vLwkJd3Iud3JpdGUoIlNvbWUgc3RyaW5nIik7Ci0JCXdyLmNsb3NlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLldyaXRlciN3cml0ZShTdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiBSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS01MQorICAgICAgICBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgV3JpdGVyIHdyID0gbmV3IE1vY2tXcml0ZXIobG9jayk7CisgICAgICAgIHdyLndyaXRlKCJTb21lIHN0cmluZyIpOworICAgICAgICB3ci5jbG9zZSgpOworICAgIH0KIAotCWNsYXNzIE1vY2tXcml0ZXIgZXh0ZW5kcyBXcml0ZXIgewotCQlmaW5hbCBPYmplY3QgbXlMb2NrOworICAgIGNsYXNzIE1vY2tXcml0ZXIgZXh0ZW5kcyBXcml0ZXIgeworICAgICAgICBmaW5hbCBPYmplY3QgbXlMb2NrOwogCi0JCU1vY2tXcml0ZXIoT2JqZWN0IGxvY2spIHsKLQkJCXN1cGVyKGxvY2spOwotCQkJbXlMb2NrID0gbG9jazsKLQkJfQorICAgICAgICBNb2NrV3JpdGVyKE9iamVjdCBsb2NrKSB7CisgICAgICAgICAgICBzdXBlcihsb2NrKTsKKyAgICAgICAgICAgIG15TG9jayA9IGxvY2s7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQorICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJYXNzZXJ0VHJ1ZShUaHJlYWQuaG9sZHNMb2NrKG15TG9jaykpOwotCQl9Ci0JfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShUaHJlYWQuaG9sZHNMb2NrKG15TG9jaykpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9BbGxUZXN0cy5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9BbGxUZXN0cy5qYXZhCmluZGV4IGEwMmY5ODYuLjRjZTAxZTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQWxsVGVzdHMuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0FsbFRlc3RzLmphdmEKQEAgLTg0LDEzICs4NCwxMyBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTnVtYmVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShPYmplY3RUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE91dE9mTWVtb3J5RXJyb3JUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBhY2thZ2VUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGFja2FnZVRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvY2Vzc0J1aWxkZXJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJ1bnRpbWVFeGNlcHRpb25UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJ1bnRpbWVQZXJtaXNzaW9uVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSdW50aW1lVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWN1cml0eUV4Y2VwdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VjdXJpdHlNYW5hZ2VyMlRlc3QuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWN1cml0eU1hbmFnZXIyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWN1cml0eU1hbmFnZXJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNob3J0VGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdGFja092ZXJmbG93RXJyb3JUZXN0LmNsYXNzKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQXJpdGhtZXRpY0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQXJpdGhtZXRpY0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmOTliZTIwLi4yOGI2YmI1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0FyaXRobWV0aWNFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Bcml0aG1ldGljRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQXJpdGhtZXRpY0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQXJpdGhtZXRpY0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkFyaXRobWV0aWNFeGNlcHRpb24jQXJpdGhtZXRpY0V4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFyaXRobWV0aWNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBBcml0aG1ldGljRXhjZXB0aW9uIGUgPSBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTMzLDYgKzQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Bcml0aG1ldGljRXhjZXB0aW9uI0FyaXRobWV0aWNFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEFyaXRobWV0aWNFeGNlcHRpb24gZSA9IG5ldyBBcml0aG1ldGljRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZWFkZTM1MC4uNjIxMDdkNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiNBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKICAgICAgICAgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUgPSBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKC0xKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNSw2ICs1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uI0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlID0gbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTQ0LDYgKzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24jQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlID0gbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0FycmF5U3RvcmVFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0FycmF5U3RvcmVFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggYzg5NzlkMC4uOWVmZDM0ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9BcnJheVN0b3JlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQXJyYXlTdG9yZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEFycmF5U3RvcmVFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEFycmF5U3RvcmVFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5BcnJheVN0b3JlRXhjZXB0aW9uI0FycmF5U3RvcmVFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBcnJheVN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgQXJyYXlTdG9yZUV4Y2VwdGlvbiBlID0gbmV3IEFycmF5U3RvcmVFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQXJyYXlTdG9yZUV4Y2VwdGlvbiNBcnJheVN0b3JlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFycmF5U3RvcmVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBBcnJheVN0b3JlRXhjZXB0aW9uIGUgPSBuZXcgQXJyYXlTdG9yZUV4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0Fzc2VydGlvbkVycm9yVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Bc3NlcnRpb25FcnJvclRlc3QuamF2YQppbmRleCBlNWE1MWNjLi5mN2EwOTA2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0Fzc2VydGlvbkVycm9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQXNzZXJ0aW9uRXJyb3JUZXN0LmphdmEKQEAgLTE3LDE2ICsxNywzOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhBc3NlcnRpb25FcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQXNzZXJ0aW9uRXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFzc2VydGlvbkVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgQXNzZXJ0aW9uRXJyb3IgZSA9IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldENhdXNlKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBc3NlcnRpb25FcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yT2JqZWN0KCkgewogICAgICAgICBPYmplY3Qgb2JqID0gInRvU3RyaW5nIjsKICAgICAgICAgQXNzZXJ0aW9uRXJyb3IgZSA9IG5ldyBBc3NlcnRpb25FcnJvcihvYmopOwpAQCAtMzgsMzcgKzYxLDg1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhucGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICBhc3NlcnRTYW1lKG5wZSwgZS5nZXRDYXVzZSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXNzZXJ0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckJvb2xlYW4oKSB7CiAgICAgICAgIEFzc2VydGlvbkVycm9yIGUgPSBuZXcgQXNzZXJ0aW9uRXJyb3IodHJ1ZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldENhdXNlKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBc3NlcnRpb25FcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yQ2hhcigpIHsKICAgICAgICAgQXNzZXJ0aW9uRXJyb3IgZSA9IG5ldyBBc3NlcnRpb25FcnJvcignYScpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRDYXVzZSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXNzZXJ0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySW50KCkgewogICAgICAgICBBc3NlcnRpb25FcnJvciBlID0gbmV3IEFzc2VydGlvbkVycm9yKDEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRDYXVzZSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXNzZXJ0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvbmcoKSB7CiAgICAgICAgIEFzc2VydGlvbkVycm9yIGUgPSBuZXcgQXNzZXJ0aW9uRXJyb3IoMUwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRDYXVzZSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXNzZXJ0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JGbG9hdCgpIHsKICAgICAgICAgQXNzZXJ0aW9uRXJyb3IgZSA9IG5ldyBBc3NlcnRpb25FcnJvcigxLjBGKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjAiLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRDYXVzZSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXNzZXJ0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yRG91YmxlKCkgewogICAgICAgICBBc3NlcnRpb25FcnJvciBlID0gbmV3IEFzc2VydGlvbkVycm9yKDEuMEQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMCIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQm9vbGVhblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQm9vbGVhblRlc3QuamF2YQppbmRleCA0YzdjM2U0Li42ZDU1ZGE0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0Jvb2xlYW5UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Cb29sZWFuVGVzdC5qYXZhCkBAIC0xNiwxMyArMTYsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQm9vbGVhbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQm9vbGVhblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJvb2xlYW4jaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxMjMxLCBCb29sZWFuLlRSVUUuaGFzaENvZGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxMjM3LCBCb29sZWFuLkZBTFNFLmhhc2hDb2RlKCkpOwpAQCAtMzEsNiArNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJvb2xlYW4jQm9vbGVhbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBuZXcgQm9vbGVhbigiVFJVRSIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbmV3IEJvb2xlYW4oInRydWUiKSk7CkBAIC00Myw2ICs2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQm9vbGVhbiNCb29sZWFuKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvclooKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG5ldyBCb29sZWFuKHRydWUpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG5ldyBCb29sZWFuKGZhbHNlKSk7CkBAIC01MSw2ICs4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQm9vbGVhbiNib29sZWFuVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJib29sZWFuVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Jvb2xlYW5WYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShCb29sZWFuLlRSVUUuYm9vbGVhblZhbHVlKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShCb29sZWFuLkZBTFNFLmJvb2xlYW5WYWx1ZSgpKTsKQEAgLTU5LDYgKzEwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQm9vbGVhbiNlcXVhbHMoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShCb29sZWFuLlRSVUUuZXF1YWxzKEJvb2xlYW4uVFJVRSkpOwogICAgICAgICBhc3NlcnRUcnVlKEJvb2xlYW4uVFJVRS5lcXVhbHMobmV3IEJvb2xlYW4odHJ1ZSkpKTsKQEAgLTcyLDYgKzEyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQm9vbGVhbiNnZXRCb29sZWFuKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qm9vbGVhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJvb2xlYW5MamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KGdldENsYXNzKCkuZ2V0TmFtZSgpLCAidHJ1ZSIpOwogICAgICAgICBhc3NlcnRUcnVlKEJvb2xlYW4uZ2V0Qm9vbGVhbihnZXRDbGFzcygpLmdldE5hbWUoKSkpOwpAQCAtODYsNiArMTQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Cb29sZWFuI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOwpAQCAtOTQsNiArMTYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Cb29sZWFuI3RvU3RyaW5nKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmdaKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBCb29sZWFuLnRvU3RyaW5nKHRydWUpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIEJvb2xlYW4udG9TdHJpbmcoZmFsc2UpKTsKQEAgLTEwMiw2ICsxODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJvb2xlYW4jdmFsdWVPZihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIEJvb2xlYW4udmFsdWVPZigidHJ1ZSIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4udmFsdWVPZigiZmFsc2UiKSk7CkBAIC0xMjIsNiArMjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Cb29sZWFuI3ZhbHVlT2YoYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZaKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi52YWx1ZU9mKGZhbHNlKSk7CkBAIC0xMzAsNiArMjI2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Cb29sZWFuI3BhcnNlQm9vbGVhbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlQm9vbGVhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlQm9vbGVhbkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRUcnVlKEJvb2xlYW4ucGFyc2VCb29sZWFuKCJ0cnVlIikpOwogICAgICAgICBhc3NlcnRUcnVlKEJvb2xlYW4ucGFyc2VCb29sZWFuKCJUUlVFIikpOwpAQCAtMTQyLDYgKzI0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQm9vbGVhbiNjb21wYXJlVG8oQm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5Cb29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBhcmVUb0xqYXZhX2xhbmdfQm9vbGVhbigpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShCb29sZWFuLlRSVUUuY29tcGFyZVRvKEJvb2xlYW4uVFJVRSkgPT0gMCk7CiAgICAgICAgIGFzc2VydFRydWUoQm9vbGVhbi5GQUxTRS5jb21wYXJlVG8oQm9vbGVhbi5GQUxTRSkgPT0gMCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0J5dGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0J5dGVUZXN0LmphdmEKaW5kZXggYzEzMTdjYy4uYmNkODA3ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9CeXRlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQnl0ZVRlc3QuamF2YQpAQCAtMTYsMTMgKzE2LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEJ5dGUuY2xhc3MpIAogcHVibGljIGNsYXNzIEJ5dGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI3ZhbHVlT2YoYnl0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZCKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJ5dGUoQnl0ZS5NSU5fVkFMVUUpLCBCeXRlLnZhbHVlT2YoQnl0ZS5NSU5fVkFMVUUpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKEJ5dGUuTUFYX1ZBTFVFKSwgQnl0ZS52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFKSk7CkBAIC0zOSw2ICs1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5ldyBCeXRlKChieXRlKSAxKS5oYXNoQ29kZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5ldyBCeXRlKChieXRlKSAyKS5oYXNoQ29kZSgpKTsKQEAgLTQ5LDYgKzczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI0J5dGUoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKChieXRlKSAwKSwgbmV3IEJ5dGUoIjAiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQnl0ZSgoYnl0ZSkgMSksIG5ldyBCeXRlKCIxIikpOwpAQCAtODIsNiArMTE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI0J5dGUoYnl0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yQigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5ldyBCeXRlKChieXRlKSAxKS5ieXRlVmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCBuZXcgQnl0ZSgoYnl0ZSkgMikuYnl0ZVZhbHVlKCkpOwpAQCAtOTIsNyArMTM0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI2J5dGVWYWx1ZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9ib29sZWFuVmFsdWUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9ieXRlVmFsdWUxKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3IEJ5dGUoKGJ5dGUpIDEpLmJ5dGVWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5ldyBCeXRlKChieXRlKSAyKS5ieXRlVmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBuZXcgQnl0ZSgoYnl0ZSkgMCkuYnl0ZVZhbHVlKCkpOwpAQCAtMTAyLDYgKzE1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSNlcXVhbHMoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKChieXRlKSAwKSwgQnl0ZS52YWx1ZU9mKChieXRlKSAwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQnl0ZSgoYnl0ZSkgMSksIEJ5dGUudmFsdWVPZigoYnl0ZSkgMSkpOwpAQCAtMTE2LDYgKzE3NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCItMSIsIG5ldyBCeXRlKChieXRlKSAtMSkudG9TdHJpbmcoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiMCIsIG5ldyBCeXRlKChieXRlKSAwKS50b1N0cmluZygpKTsKQEAgLTEyNiw2ICsxOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjdG9TdHJpbmcoYnl0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZ0IoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiLTEiLCBCeXRlLnRvU3RyaW5nKChieXRlKSAtMSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjAiLCBCeXRlLnRvU3RyaW5nKChieXRlKSAwKSk7CkBAIC0xMzYsNiArMjE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI3ZhbHVlT2YoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJDaGVja3Mgb25seSBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQnl0ZSgoYnl0ZSkgMCksIEJ5dGUudmFsdWVPZigiMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKChieXRlKSAxKSwgQnl0ZS52YWx1ZU9mKCIxIikpOwpAQCAtMTY5LDYgKzI1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSN2YWx1ZU9mKFN0cmluZyxpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKChieXRlKSAwKSwgQnl0ZS52YWx1ZU9mKCIwIiwgMTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKChieXRlKSAxKSwgQnl0ZS52YWx1ZU9mKCIxIiwgMTApKTsKQEAgLTIwNiw2ICszMDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjcGFyc2VCeXRlKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VCeXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBCeXRlLnBhcnNlQnl0ZSgiMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEJ5dGUucGFyc2VCeXRlKCIxIikpOwpAQCAtMjM5LDYgKzM0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSNwYXJzZUJ5dGUoU3RyaW5nLGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZUJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlQnl0ZUxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEJ5dGUucGFyc2VCeXRlKCIwIiwgMTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEJ5dGUucGFyc2VCeXRlKCIxIiwgMTApKTsKQEAgLTI3Niw2ICszOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjZGVjb2RlKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVjb2RlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQnl0ZSgoYnl0ZSkgMCksIEJ5dGUuZGVjb2RlKCIwIikpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJ5dGUoKGJ5dGUpIDEpLCBCeXRlLmRlY29kZSgiMSIpKTsKQEAgLTMwOCw2ICs0MzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjZG91YmxlVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIk5vIGJvdW5kYXJ5IHZlcmlmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb3VibGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZG91YmxlVmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMUQsIG5ldyBCeXRlKChieXRlKSAtMSkuZG91YmxlVmFsdWUoKSwgMEQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMEQsIG5ldyBCeXRlKChieXRlKSAwKS5kb3VibGVWYWx1ZSgpLCAwRCk7CkBAIC0zMTcsNiArNDQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI2Zsb2F0VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mbG9hdFZhbHVlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoLTFGLCBuZXcgQnl0ZSgoYnl0ZSkgLTEpLmZsb2F0VmFsdWUoKSwgMEYpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMEYsIG5ldyBCeXRlKChieXRlKSAwKS5mbG9hdFZhbHVlKCksIDBGKTsKQEAgLTMyNiw2ICs0NjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjaW50VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIk5vIGJvdW5kYXJ5IHZlcmlmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgbmV3IEJ5dGUoKGJ5dGUpIC0xKS5pbnRWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5ldyBCeXRlKChieXRlKSAwKS5pbnRWYWx1ZSgpKTsKQEAgLTMzNSw2ICs0ODUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjbG9uZ1ZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJObyBib3VuZGFyeSB2ZXJpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb25nVmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMUwsIG5ldyBCeXRlKChieXRlKSAtMSkubG9uZ1ZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIG5ldyBCeXRlKChieXRlKSAwKS5sb25nVmFsdWUoKSk7CkBAIC0zNDQsNiArNTAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI3Nob3J0VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Nob3J0VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgbmV3IEJ5dGUoKGJ5dGUpIC0xKS5zaG9ydFZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IEJ5dGUoKGJ5dGUpIDApLnNob3J0VmFsdWUoKSk7CkBAIC0zNTMsNiArNTIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI2NvbXBhcmVUbyhCeXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkJ5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvTGphdmFfbGFuZ19CeXRlKCkgewogICAgICAgICBmaW5hbCBCeXRlIG1pbiA9IG5ldyBCeXRlKEJ5dGUuTUlOX1ZBTFVFKTsKICAgICAgICAgZmluYWwgQnl0ZSB6ZXJvID0gbmV3IEJ5dGUoKGJ5dGUpIDApOwpAQCAtMzgxLDYgKzU1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSNCeXRlKGJ5dGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQm91bmRhcnkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JCMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5CeXRlKGJ5dGUpCiAKQEAgLTM5MSw2ICs1NzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjQnl0ZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgZW1wdHkgc3RyaW5nIG9yIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkJ5dGUoamF2YS5sYW5nLlN0cmluZykKIApAQCAtNDA0LDYgKzU5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSNieXRlVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkJvdW5kYXJ5IHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ieXRlVmFsdWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBieXRlIGphdmEubGFuZy5CeXRlLmJ5dGVWYWx1ZSgpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBieXRlIHZhbHVlIiwKQEAgLTQxMyw2ICs2MTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjY29tcGFyZVRvKGphdmEubGFuZy5CeXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkJ5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvTGphdmFfbGFuZ19CeXRlMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuQnl0ZS5jb21wYXJlVG8oamF2YS5sYW5nLkJ5dGUpCiAgICAgICAgIGFzc2VydFRydWUoIkNvbXBhcmlzb24gZmFpbGVkIiwgbmV3IEJ5dGUoKGJ5dGUpIDEpLmNvbXBhcmVUbyhuZXcgQnl0ZSgoYnl0ZSkgMikpIDwgMCk7CkBAIC00MjMsNiArNjM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI2RlY29kZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWNvZGVMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuQnl0ZQogICAgICAgICAvLyBqYXZhLmxhbmcuQnl0ZS5kZWNvZGUoamF2YS5sYW5nLlN0cmluZykKQEAgLTQ4Myw2ICs3MDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjZG91YmxlVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBib3VuZGFyeSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb3VibGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZG91YmxlVmFsdWUyKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMTI3RCwgbmV3IEJ5dGUoKGJ5dGUpIDEyNykuZG91YmxlVmFsdWUoKSwgMC4wKTsKICAgICB9CkBAIC00OTAsNiArNzIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyB0aGF0IG5lZ2F0aXZlIHZhbHVlIGRvZXNuJ3QgZXF1YWwgdG8gcG9zaXRpdmUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuQnl0ZS5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgQnl0ZSBiMSA9IG5ldyBCeXRlKChieXRlKSA5MCk7CkBAIC01MDIsNiArNzQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI2Zsb2F0VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkJvdW5kYXJ5IHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxvYXRWYWx1ZTIoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxMjdGLCBuZXcgQnl0ZSgoYnl0ZSkgMTI3KS5mbG9hdFZhbHVlKCksIDAuMCk7CiAgICAgfQpAQCAtNTA5LDYgKzc1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQm91bmRhcnkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5CeXRlLmhhc2hDb2RlKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgaGFzaCByZXR1cm5lZCIsIDEyNywgbmV3IEJ5dGUoKGJ5dGUpIDEyNykuaGFzaENvZGUoKSk7CkBAIC01MTcsNiArNzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI2ludFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJCb3VuZGFyeSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnRWYWx1ZTIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLkJ5dGUuaW50VmFsdWUoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBpbnQgdmFsdWUiLCAxMjcsIG5ldyBCeXRlKChieXRlKSAxMjcpLmludFZhbHVlKCkpOwpAQCAtNTI1LDYgKzc5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQnl0ZSNsb25nVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvbmdWYWx1ZTIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEubGFuZy5CeXRlLmxvbmdWYWx1ZSgpCiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGxvbmcgdmFsdWUiLCAxMjdMLCBuZXcgQnl0ZSgoYnl0ZSkgMTI3KS5sb25nVmFsdWUoKSk7CkBAIC01MzMsNiArODA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI3BhcnNlQnl0ZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkJvdW5kYXJ5IHZlcmlmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZUJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUJ5dGVMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSkxMjcsIEJ5dGUucGFyc2VCeXRlKCIxMjciKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSktMTI4LCBCeXRlLnBhcnNlQnl0ZSgiLTEyOCIpKTsKQEAgLTU2Miw2ICs4NDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjcGFyc2VCeXRlKGphdmEubGFuZy5TdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJCb3VuZGFyeSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlQnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VCeXRlTGphdmFfbGFuZ19TdHJpbmdJMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJ5dGUgamF2YS5sYW5nLkJ5dGUucGFyc2VCeXRlKGphdmEubGFuZy5TdHJpbmcsIGludCkKICAgICAgICAgYnl0ZSBiID0gQnl0ZS5wYXJzZUJ5dGUoIjEyNyIsIDEwKTsKQEAgLTYxMyw2ICs5MDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjc2hvcnRWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQm91bmRhcnkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaG9ydFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaG9ydFZhbHVlMigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMjcsIG5ldyBCeXRlKChieXRlKTEyNykuc2hvcnRWYWx1ZSgpKTsKICAgICB9CkBAIC02MjAsNiArOTIzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJCb3VuZGFyeSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZzIoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IFN0cmluZyIsICIxMjciLCBuZXcgQnl0ZSgoYnl0ZSkgMTI3KS50b1N0cmluZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgU3RyaW5nIiwgIi0xMjciLCBuZXcgQnl0ZSgoYnl0ZSkgLTEyNykudG9TdHJpbmcoKSk7CkBAIC02MjksNiArOTQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI3RvU3RyaW5nKGJ5dGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQm91bmRhcnkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nQjIoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IFN0cmluZyIsICIxMjciLCBCeXRlLnRvU3RyaW5nKChieXRlKSAxMjcpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgU3RyaW5nIiwgIi0xMjciLCBCeXRlLnRvU3RyaW5nKChieXRlKSAtMTI3KSk7CkBAIC02MzgsNiArOTU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5CeXRlI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJCb3VuZGFyeSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcyKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBieXRlIiwgMCwgQnl0ZS52YWx1ZU9mKCIwIikuYnl0ZVZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBieXRlIiwgMTI3LCBCeXRlLnZhbHVlT2YoIjEyNyIpLmJ5dGVWYWx1ZSgpKTsKQEAgLTY1NCw2ICs5ODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkJ5dGUjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQm91bmRhcnkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmdJMigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgYnl0ZSIsIDEwLCBCeXRlLnZhbHVlT2YoIkEiLCAxNikuYnl0ZVZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBieXRlIiwgMTI3LCBCeXRlLnZhbHVlT2YoIjEyNyIsIDEwKS5ieXRlVmFsdWUoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NoYXJhY3RlckltcGxUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NoYXJhY3RlckltcGxUZXN0LmphdmEKaW5kZXggN2Q5YjNhZi4uMjJmMTljMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJJbXBsVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2hhcmFjdGVySW1wbFRlc3QuamF2YQpAQCAtMTYsMTAgKzE2LDI1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKENoYXJhY3Rlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ2hhcmFjdGVySW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZDKCkgewogICAgICAgICAvLyB0ZXN0IHRoZSBjYWNoZSByYW5nZQogICAgICAgICBmb3IgKGNoYXIgYyA9ICdcdTAwMDAnOyBjIDwgNTEyOyBjKyspIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2hhcmFjdGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJUZXN0LmphdmEKaW5kZXggMDc2NDkwMC4uMjk4ZjEzMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJUZXN0LmphdmEKQEAgLTE2LDEyICsxNiwyNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworQFRlc3RUYXJnZXRDbGFzcyhDaGFyYWN0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIENoYXJhY3RlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZDKCkgewogICAgICAgICAvLyB0ZXN0IHRoZSBjYWNoZSByYW5nZQogICAgICAgICBmb3IgKGNoYXIgYyA9ICdcdTAwMDAnOyBjIDwgNTEyOyBjKyspIHsKQEAgLTM0LDcgKzQ5LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENoYXJhY3RlcigoY2hhcikgYyksIENoYXJhY3Rlci52YWx1ZU9mKChjaGFyKSBjKSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNWYWxpZENvZGVQb2ludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWYWxpZENvZGVQb2ludEkoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc1ZhbGlkQ29kZVBvaW50KC0xKSk7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzVmFsaWRDb2RlUG9pbnQoMCkpOwpAQCAtNDcsNyArNzAsMTUgQEAKIAogICAgICAgICBhc3NlcnRGYWxzZShDaGFyYWN0ZXIuaXNWYWxpZENvZGVQb2ludCgweDEwRkZGRiArIDEpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwbGVtZW50YXJ5Q29kZVBvaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1N1cHBsZW1lbnRhcnlDb2RlUG9pbnRJKCkgewogICAgICAgICBhc3NlcnRGYWxzZShDaGFyYWN0ZXIuaXNTdXBwbGVtZW50YXJ5Q29kZVBvaW50KC0xKSk7CiAKQEAgLTYxLDcgKzkyLDE1IEBACiAKICAgICAgICAgYXNzZXJ0RmFsc2UoQ2hhcmFjdGVyLmlzU3VwcGxlbWVudGFyeUNvZGVQb2ludCgweDEwRkZGRiArIDEpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNIaWdoU3Vycm9nYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNIaWdoU3Vycm9nYXRlQygpIHsKICAgICAgICAgLy8gKFx1RDgwMC1cdURCRkYpCiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUoKGNoYXIpICgnXHVEODAwJyAtIDEpKSk7CkBAIC03MSw3ICsxMTAsMTUgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoQ2hhcmFjdGVyLmlzSGlnaFN1cnJvZ2F0ZSgoY2hhcikgKCdcdURCRkYnICsgMSkpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoQ2hhcmFjdGVyLmlzSGlnaFN1cnJvZ2F0ZSgnXHVGRkZGJykpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xvd1N1cnJvZ2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG93U3Vycm9nYXRlQygpIHsKICAgICAgICAgLy8gKFx1REMwMC1cdURGRkYpCiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc0xvd1N1cnJvZ2F0ZSgoY2hhcikgKCdcdURDMDAnIC0gMSkpKTsKQEAgLTgwLDcgKzEyNywxNSBAQAogICAgICAgICB9CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc0xvd1N1cnJvZ2F0ZSgoY2hhcikgKCdcdURGRkYnICsgMSkpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXJyb2dhdGVQYWlyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3MsIGNoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTdXJyb2dhdGVQYWlyQ0MoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc1N1cnJvZ2F0ZVBhaXIoJ1x1MDAwMCcsICdcdTAwMDAnKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc1N1cnJvZ2F0ZVBhaXIoJ1x1MDAwMCcsICdcdURDMDAnKSk7CkBAIC05MSw3ICsxNDYsMTUgQEAKIAogICAgICAgICBhc3NlcnRGYWxzZShDaGFyYWN0ZXIuaXNTdXJyb2dhdGVQYWlyKCdcdURCRkYnLCAnXHVGMDAwJykpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGFyQ291bnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoYXJDb3VudEkoKSB7CiAKICAgICAgICAgZm9yIChpbnQgYyA9ICdcdTAwMDAnOyBjIDw9ICdcdUZGRkYnOyBjKyspIHsKQEAgLTEwNSw3ICsxNjgsMTUgQEAKICAgICAgICAgLy8gaW52YWxpZCBjb2RlIHBvaW50cyB3b3JrIGluIHRoaXMgbWV0aG9kCiAgICAgICAgIGFzc2VydEVxdWFscygyLCBDaGFyYWN0ZXIuY2hhckNvdW50KEludGVnZXIuTUFYX1ZBTFVFKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvQ29kZVBvaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3MsIGNoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9Db2RlUG9pbnRDQygpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IENoYXJhY3Rlci50b0NvZGVQb2ludCgnXHVEODAwJywgJ1x1REMwMCcpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMHgwMDAxMDAwMCwgcmVzdWx0KTsKQEAgLTEyMSw2ICsxOTIsMTUgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvZGVQb2ludEF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb2RlUG9pbnRBdExqYXZhX2xhbmdfQ2hhclNlcXVlbmNlSSgpIHsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBDaGFyYWN0ZXIuY29kZVBvaW50QXQoKENoYXJTZXF1ZW5jZSkgImFiYyIsIDApKTsKQEAgLTE0OSw3ICsyMjksMTUgQEAKICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29kZVBvaW50QXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29kZVBvaW50QXQkQ0koKSB7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdhJywgQ2hhcmFjdGVyLmNvZGVQb2ludEF0KCJhYmMiLnRvQ2hhckFycmF5KCksIDApKTsKQEAgLTE3OCw3ICsyNjYsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29kZVBvaW50QXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb2RlUG9pbnRBdCRDSUkoKSB7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdhJywgQ2hhcmFjdGVyLmNvZGVQb2ludEF0KCJhYmMiLnRvQ2hhckFycmF5KCksIDAsIDMpKTsKQEAgLTIyMSw3ICszMTcsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29kZVBvaW50QmVmb3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29kZVBvaW50QmVmb3JlTGphdmFfbGFuZ19DaGFyU2VxdWVuY2VJKCkgewogCkBAIC0yNTEsNyArMzU1LDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvZGVQb2ludEJlZm9yZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb2RlUG9pbnRCZWZvcmUkQ0koKSB7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdhJywgQ2hhcmFjdGVyLmNvZGVQb2ludEJlZm9yZSgiYWJjIi50b0NoYXJBcnJheSgpLCAxKSk7CkBAIC0yODAsNyArMzkyLDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvZGVQb2ludEJlZm9yZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvZGVQb2ludEJlZm9yZSRDSUkoKSB7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdhJywgQ2hhcmFjdGVyLmNvZGVQb2ludEJlZm9yZSgiYWJjIi50b0NoYXJBcnJheSgpLCAxLCAwKSk7CkBAIC0zMjMsNyArNDQzLDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvQ2hhcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBjaGFyW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0NoYXJzSSRDSSgpIHsKICAgICAgICAgY2hhcltdIGRzdCA9IG5ldyBjaGFyWzJdOwogICAgICAgICBpbnQgcmVzdWx0ID0gQ2hhcmFjdGVyLnRvQ2hhcnMoMHgxMDAwMCwgZHN0LCAwKTsKQEAgLTM2Niw3ICs0OTQsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9DaGFycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9DaGFyc0koKSB7CiAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1x1RDgwMCcsICdcdURDMDAnIH0sIENoYXJhY3RlcgogICAgICAgICAgICAgICAgIC50b0NoYXJzKDB4MTAwMDApKSk7CkBAIC0zODMsNyArNTE5LDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29kZVBvaW50Q291bnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29kZVBvaW50Q291bnRMamF2YV9sYW5nX0NoYXJTZXF1ZW5jZUlJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2hhcmFjdGVyLmNvZGVQb2ludENvdW50KCJcdUQ4MDBcdURDMDAiLCAwLCAyKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBDaGFyYWN0ZXIuY29kZVBvaW50Q291bnQoIlx1RDgwMFx1REMwMSIsIDAsIDIpKTsKQEAgLTQxNyw3ICs1NjEsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2Zmc2V0QnlDb2RlUG9pbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29mZnNldEJ5Q29kZVBvaW50c0xqYXZhX2xhbmdfQ2hhclNlcXVlbmNlSUkoKSB7CiAgICAgICAgIGludCByZXN1bHQgPSBDaGFyYWN0ZXIub2Zmc2V0QnlDb2RlUG9pbnRzKCJhXHVEODAwXHVEQzAwYiIsIDAsIDIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0KTsKQEAgLTQ3Myw3ICs2MjUsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2Zmc2V0QnlDb2RlUG9pbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29mZnNldEJ5Q29kZVBvaW50cyRDSUlJSSgpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IENoYXJhY3Rlci5vZmZzZXRCeUNvZGVQb2ludHMoImFcdUQ4MDBcdURDMDBiIgogICAgICAgICAgICAgICAgIC50b0NoYXJBcnJheSgpLCAwLCA0LCAwLCAyKTsKQEAgLTU3Nyw2ICs3MzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNjb21wYXJlVG8oQ2hhcmFjdGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9sYW5nX0J5dGUoKSB7CiAgICAgICAgIGZpbmFsIENoYXJhY3RlciBtaW4gPSBuZXcgQ2hhcmFjdGVyKENoYXJhY3Rlci5NSU5fVkFMVUUpOwogICAgICAgICBmaW5hbCBDaGFyYWN0ZXIgbWlkID0gbmV3IENoYXJhY3RlcigoY2hhcikoQ2hhcmFjdGVyLk1BWF9WQUxVRS8yKSk7CkBAIC02MDEsNyArNzcwLDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb2RlUG9pbnRBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvZGVQb2ludEF0X0ludmFsaWQoKSB7CiAKICAgICAgICAgdHJ5IHsgICAgICAgICAgIApAQCAtNjM1LDYgKzgxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI0NoYXJhY3RlcihjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyYWN0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckMoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ29uc3RydWN0b3IgZmFpbGVkIiwgJ1QnLCBuZXcgQ2hhcmFjdGVyKCdUJykuY2hhclZhbHVlKCkpOwogICAgIH0KQEAgLTY0Miw2ICs4MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNjaGFyVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGFyVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoYXJWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY2hhciB2YWx1ZSByZXR1cm5lZCIsICdUJywgbmV3IENoYXJhY3RlcignVCcpCiAgICAgICAgICAgICAgICAgLmNoYXJWYWx1ZSgpKTsKQEAgLTY1MCw2ICs4NDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNjb21wYXJlVG8oamF2YS5sYW5nLkNoYXJhY3RlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvTGphdmFfbGFuZ19DaGFyYWN0ZXIoKSB7CiAgICAgICAgIENoYXJhY3RlciBjID0gbmV3IENoYXJhY3RlcignYycpOwogICAgICAgICBDaGFyYWN0ZXIgeCA9IG5ldyBDaGFyYWN0ZXIoJ2MnKTsKQEAgLTY2OCw2ICs4NzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNkaWdpdChjaGFyLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYm91bmRhcnkgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlnaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RpZ2l0Q0koKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGRpZ2l0IiwgMSwgQ2hhcmFjdGVyLmRpZ2l0KCcxJywgMTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgZGlnaXQiLCAxNSwgQ2hhcmFjdGVyLmRpZ2l0KCdGJywgMTYpKTsKQEAgLTY3Niw2ICs4ODksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNkaWdpdChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlnaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGlnaXRfSUkoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBDaGFyYWN0ZXIuZGlnaXQoKGludCknMScsIDEwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxNSwgQ2hhcmFjdGVyLmRpZ2l0KChpbnQpJ0YnLCAxNikpOwpAQCAtNjkyLDYgKzkxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLkNoYXJhY3Rlci5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXF1YWxpdHkgdGVzdCBmYWlsZWQiLCBuZXcgQ2hhcmFjdGVyKCdBJykKQEAgLTcwMyw2ICs5MzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNmb3JEaWdpdChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9yRGlnaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9yRGlnaXRJSSgpIHsKICAgICAgICAgY2hhciBoZXhDaGFyc1tdID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCiAgICAgICAgICAgICAgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwpAQCAtNzI0LDYgKzk2NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2dldE51bWVyaWNWYWx1ZShjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROdW1lcmljVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXROdW1lcmljVmFsdWVDKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBudW1lcmljIHZhbHVlIDEiLCAxLCBDaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAuZ2V0TnVtZXJpY1ZhbHVlKCcxJykpOwpAQCAtNzQyLDYgKzk5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2dldE51bWVyaWNWYWx1ZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE51bWVyaWNWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TnVtZXJpY1ZhbHVlX0koKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKChpbnQpJzEnKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxNSwgQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZSgoaW50KSdGJykpOwpAQCAtNzc2LDYgKzEwMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNnZXRUeXBlKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlQygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IHR5cGUgZm9yOiBcbiIsCiAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmdldFR5cGUoJ1xuJykgPT0gQ2hhcmFjdGVyLkNPTlRST0wpOwpAQCAtODA2LDYgKzEwNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNnZXRUeXBlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZV9JKCkgewogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5nZXRUeXBlKChpbnQpICdcbicpID09IENoYXJhY3Rlci5DT05UUk9MKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDaGFyYWN0ZXIuZ2V0VHlwZSgoaW50KSAnMScpID09IENoYXJhY3Rlci5ERUNJTUFMX0RJR0lUX05VTUJFUik7CkBAIC05MTEsNiArMTE4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBoYXNoIHJldHVybmVkIiwKICAgICAgICAgICAgICAgICA4OSwgbmV3IENoYXJhY3RlcignWScpLmhhc2hDb2RlKCkpOwpAQCAtOTE5LDYgKzEyMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0RlZmluZWQoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEZWZpbmVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNEZWZpbmVkQygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGVmaW5lZCBjaGFyYWN0ZXIgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNEZWZpbmVkKCd2JykpOwogICAgICAgICBhc3NlcnRUcnVlKCJEZWZpbmVkIGNoYXJhY3RlciByZXR1cm5lZCBmYWxzZSIsIENoYXJhY3RlcgpAQCAtOTI4LDYgKzEyMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0RlZmluZWQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RlZmluZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRGVmaW5lZF9JKCl7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzRGVmaW5lZCgoaW50KSd2JykpOwogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0RlZmluZWQoKGludCknXHU2MDM5JykpOwpAQCAtOTQxLDYgKzEyNDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0RpZ2l0KGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRGlnaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0RpZ2l0QygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlnaXQgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNEaWdpdCgnMScpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm9uLURpZ2l0IHJldHVybmVkIGZhbHNlIiwgIUNoYXJhY3Rlci5pc0RpZ2l0KCdBJykpOwpAQCAtOTQ5LDYgKzEyNjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0RpZ2l0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEaWdpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNEaWdpdF9JKCkgewogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0RpZ2l0KChpbnQpICcxJykpOwogICAgICAgICBhc3NlcnRGYWxzZShDaGFyYWN0ZXIuaXNEaWdpdCgoaW50KSAnQScpKTsKQEAgLTk4NCw2ICsxMzA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNJZGVudGlmaWVySWdub3JhYmxlKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSWRlbnRpZmllcklnbm9yYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSWRlbnRpZmllcklnbm9yYWJsZUMoKSB7CiAgICAgICAgIGFzc2VydFRydWUoIklnbm9yYWJsZSB3aGl0ZXNwYWNlIHJldHVybmVkIGZhbHNlIiwgQ2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgLmlzSWRlbnRpZmllcklnbm9yYWJsZSgnXHUwMDA3JykpOwpAQCAtMTAwOCw2ICsxMzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNJZGVudGlmaWVySWdub3JhYmxlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNJZGVudGlmaWVySWdub3JhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0lkZW50aWZpZXJJZ25vcmFibGVfSSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShDaGFyYWN0ZXIuaXNJZGVudGlmaWVySWdub3JhYmxlKDB4MDAwMCkpOwogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0lkZW50aWZpZXJJZ25vcmFibGUoMHgwMDA0KSk7CkBAIC0xMDM1LDYgKzEzNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc01pcnJvcmVkKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTWlycm9yZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc01pcnJvcmVkX0MoKSB7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzTWlycm9yZWQoJ1x1MDAyOCcpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoQ2hhcmFjdGVyLmlzTWlycm9yZWQoJ1x1RkZGRicpKTsKQEAgLTEwNDMsNiArMTM5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzTWlycm9yZWQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01pcnJvcmVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc01pcnJvcmVkX0koKSB7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzTWlycm9yZWQoMHgwMDI4KSk7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc01pcnJvcmVkKDB4RkZGRikpOyAgICAgCkBAIC0xMDUyLDYgKzE0MDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0lTT0NvbnRyb2woY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIHJldHVybmVkIGZhbHNlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0lTT0NvbnRyb2wiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0lTT0NvbnRyb2xDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuQ2hhcmFjdGVyLmlzSVNPQ29udHJvbChjaGFyKQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspCkBAIC0xMDY2LDYgKzE0MzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0lTT0NvbnRyb2woaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0lTT0NvbnRyb2wiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSVNPQ29udHJvbEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5DaGFyYWN0ZXIuaXNJU09Db250cm9sKGNoYXIpCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykKQEAgLTEwODYsNiArMTQ2MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzSmF2YUlkZW50aWZpZXJQYXJ0KGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSmF2YUlkZW50aWZpZXJQYXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNKYXZhSWRlbnRpZmllclBhcnRDKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJsZXR0ZXIgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoJ2wnKSk7CiAgICAgICAgIGFzc2VydFRydWUoImN1cnJlbmN5IHJldHVybmVkIGZhbHNlIiwgQ2hhcmFjdGVyCkBAIC0xMTAyLDYgKzE0ODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyUGFydChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSmF2YUlkZW50aWZpZXJQYXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0phdmFJZGVudGlmaWVyUGFydF9JKCkgeyAgICAgIAogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCgoaW50KSdsJykpOwogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCgoaW50KSckJykpOwpAQCAtMTE1MCw2ICsxNTQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSmF2YUlkZW50aWZpZXJTdGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSmF2YUlkZW50aWZpZXJTdGFydEMoKSB7CiAgICAgICAgIGFzc2VydFRydWUoImxldHRlciByZXR1cm5lZCBmYWxzZSIsIENoYXJhY3RlcgogICAgICAgICAgICAgICAgIC5pc0phdmFJZGVudGlmaWVyU3RhcnQoJ2wnKSk7CkBAIC0xMTY2LDYgKzE1NjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyU3RhcnQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0phdmFJZGVudGlmaWVyU3RhcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSmF2YUlkZW50aWZpZXJTdGFydF9JKCkgewogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGludCknbCcpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KChpbnQpJyQnKSk7CkBAIC0xMjAwLDYgKzE2MTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0phdmFMZXR0ZXIoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNKYXZhTGV0dGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0phdmFMZXR0ZXJDKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJsZXR0ZXIgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNKYXZhTGV0dGVyKCdsJykpOwpAQCAtMTIxNiw2ICsxNjM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNKYXZhTGV0dGVyT3JEaWdpdChjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0phdmFMZXR0ZXJPckRpZ2l0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0phdmFMZXR0ZXJPckRpZ2l0QygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgibGV0dGVyIHJldHVybmVkIGZhbHNlIiwgQ2hhcmFjdGVyLmlzSmF2YUxldHRlck9yRGlnaXQoJ2wnKSk7CkBAIC0xMjMwLDYgKzE2NTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0xldHRlcihjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xldHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTGV0dGVyQygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGV0dGVyIHJldHVybmVkIGZhbHNlIiwgQ2hhcmFjdGVyLmlzTGV0dGVyKCdMJykpOwogICAgICAgICBhc3NlcnRUcnVlKCJOb24tTGV0dGVyIHJldHVybmVkIHRydWUiLCAhQ2hhcmFjdGVyLmlzTGV0dGVyKCc5JykpOwpAQCAtMTIzOCw2ICsxNjc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNMZXR0ZXIoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xldHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMZXR0ZXJfSSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShDaGFyYWN0ZXIuaXNMZXR0ZXIoKGludCknTCcpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoQ2hhcmFjdGVyLmlzTGV0dGVyKChpbnQpJzknKSk7CkBAIC0xMjU0LDYgKzE3MDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc0xldHRlck9yRGlnaXQoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMZXR0ZXJPckRpZ2l0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMZXR0ZXJPckRpZ2l0QygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlnaXQgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KCc5JykpOwogICAgICAgICBhc3NlcnRUcnVlKCJMZXR0ZXIgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KCdLJykpOwpAQCAtMTI2NCw2ICsxNzIwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNMZXR0ZXJPckRpZ2l0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMZXR0ZXJPckRpZ2l0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0xldHRlck9yRGlnaXRfSSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KChpbnQpJzknKSk7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCgoaW50KSdLJykpOwpAQCAtMTI4Niw2ICsxNzUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNMb3dlckNhc2UoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb3dlckNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0xvd2VyQ2FzZUMoKSB7CiAgICAgICAgIGFzc2VydFRydWUoImxvd2VyIHJldHVybmVkIGZhbHNlIiwgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKCdhJykpOwogICAgICAgICBhc3NlcnRUcnVlKCJ1cHBlciByZXR1cm5lZCB0cnVlIiwgIUNoYXJhY3Rlci5pc0xvd2VyQ2FzZSgnVCcpKTsKQEAgLTEyOTQsNiArMTc2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzTG93ZXJDYXNlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb3dlckNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG93ZXJDYXNlX0koKSB7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKChpbnQpJ2EnKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoaW50KSdUJykpOwpAQCAtMTMwOSw2ICsxNzkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNTcGFjZShjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1NwYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1NwYWNlQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLkNoYXJhY3Rlci5pc1NwYWNlKGNoYXIpCkBAIC0xMzE5LDYgKzE4MTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc1NwYWNlQ2hhcihjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1NwYWNlQ2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU3BhY2VDaGFyQygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgic3BhY2UgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoJ1x1MDAyMCcpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgibm9uLXNwYWNlIHJldHVybmVkIHRydWUiLCAhQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKCdcbicpKTsKQEAgLTEzMjcsNiArMTgyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzU3BhY2VDaGFyKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTcGFjZUNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU3BhY2VDaGFyX0koKSB7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKChpbnQpJ1x1MDAyMCcpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKChpbnQpJ1xuJykpOwpAQCAtMTM0Myw2ICsxODUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNUaXRsZUNhc2UoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNUaXRsZUNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1RpdGxlQ2FzZUMoKSB7CiAgICAgICAgIGNoYXJbXSB0Q2hhcnMgPSB7IChjaGFyKSAweDAxYzUsIChjaGFyKSAweDAxYzgsIChjaGFyKSAweDAxY2IsCiAgICAgICAgICAgICAgICAgKGNoYXIpIDB4MDFmMiwgKGNoYXIpIDB4MWY4OCwgKGNoYXIpIDB4MWY4OSwgKGNoYXIpIDB4MWY4YSwKQEAgLTEzNzEsNiArMTg5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzVGl0bGVDYXNlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNUaXRsZUNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVGl0bGVDYXNlX0koKSB7CiAgICAgICAgIC8vYWxsIHRoZSB0aXRsZWNhc2UgY2hhcmFjdGVycwogICAgICAgICBpbnRbXSB0aXRsZUNhc2VDaGFyYWN0ZXJzID0geyAweDAxYzUsIDB4MDFjOCwgMHgwMWNiLCAweDAxZjIsIDB4MWY4OCwKQEAgLTEzODksNiArMTkxNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzVW5pY29kZUlkZW50aWZpZXJQYXJ0KGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVW5pY29kZUlkZW50aWZpZXJQYXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNVbmljb2RlSWRlbnRpZmllclBhcnRDKCkgewogICAgICAgICBhc3NlcnRUcnVlKCInYScgcmV0dXJuZWQgZmFsc2UiLCBDaGFyYWN0ZXIuaXNVbmljb2RlSWRlbnRpZmllclBhcnQoJ2EnKSk7CiAgICAgICAgIGFzc2VydFRydWUoIicyJyByZXR1cm5lZCBmYWxzZSIsIENoYXJhY3Rlci5pc1VuaWNvZGVJZGVudGlmaWVyUGFydCgnMicpKTsKQEAgLTEzOTgsNiArMTkzNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzVW5pY29kZUlkZW50aWZpZXJQYXJ0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNVbmljb2RlSWRlbnRpZmllclBhcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVW5pY29kZUlkZW50aWZpZXJQYXJ0X0koKSB7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzVW5pY29kZUlkZW50aWZpZXJQYXJ0KChpbnQpJ2EnKSk7CiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzVW5pY29kZUlkZW50aWZpZXJQYXJ0KChpbnQpJzInKSk7CkBAIC0xNDQ1LDYgKzE5OTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc1VuaWNvZGVJZGVudGlmaWVyU3RhcnQoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNVbmljb2RlSWRlbnRpZmllclN0YXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNVbmljb2RlSWRlbnRpZmllclN0YXJ0QygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiJ2EnIHJldHVybmVkIGZhbHNlIiwgQ2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgLmlzVW5pY29kZUlkZW50aWZpZXJTdGFydCgnYScpKTsKQEAgLTE0NTcsNiArMjAxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzVW5pY29kZUlkZW50aWZpZXJTdGFydChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVW5pY29kZUlkZW50aWZpZXJTdGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNVbmljb2RlSWRlbnRpZmllclN0YXJ0X0koKSB7CiAgICAgICAgCiAgICAgICAgIGFzc2VydFRydWUoQ2hhcmFjdGVyLmlzVW5pY29kZUlkZW50aWZpZXJTdGFydCgoaW50KSAnYScpKTsKQEAgLTE0ODUsNiArMjA0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzVXBwZXJDYXNlKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgc3ltYm9scy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1VwcGVyQ2FzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVXBwZXJDYXNlQygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGNhc2UgdmFsdWUiLCAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKCd0JykpOwogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgY2FzZSB2YWx1ZSIsIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgnVCcpKTsKQEAgLTE0OTMsNiArMjA2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzVXBwZXJDYXNlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNVcHBlckNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVXBwZXJDYXNlX0koKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoaW50KSd0JykpOwogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoaW50KSdUJykpOwpAQCAtMTUwOCw2ICsyMDkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjaXNXaGl0ZXNwYWNlKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzV2hpdGVzcGFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzV2hpdGVzcGFjZUMoKSB7CiAgICAgICAgIGFzc2VydFRydWUoInNwYWNlIHJldHVybmVkIGZhbHNlIiwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgnXG4nKSk7CiAgICAgICAgIGFzc2VydFRydWUoIm5vbi1zcGFjZSByZXR1cm5lZCB0cnVlIiwgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoJ1QnKSk7CkBAIC0xNTE2LDYgKzIxMDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNpc1doaXRlc3BhY2UoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1doaXRlc3BhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzV2hpdGVzcGFjZV9JKCkgewogICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGludCknXG4nKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGludCknVCcpKTsKQEAgLTE1NTAsNiArMjE1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI3JldmVyc2VCeXRlcyhjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXZlcnNlQnl0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXZlcnNlQnl0ZXNDKCkgewogICAgICAgICBjaGFyIG9yaWdpbmFsW10gPSBuZXcgY2hhcltdezB4MDAwMCwgMHgwMDEwLCAweDAwQUEsIDB4QjAwMCwgMHhDQzAwLCAweEFCQ0QsIDB4RkZBQX07CiAgICAgICAgIGNoYXIgcmV2ZXJzZWRbXSA9IG5ldyBjaGFyW117MHgwMDAwLCAweDEwMDAsIDB4QUEwMCwgMHgwMEIwLCAweDAwQ0MsIDB4Q0RBQiwgMHhBQUZGfTsKQEAgLTE1NjksNiArMjE3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI3RvTG93ZXJDYXNlKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgc3ltYm9scywgbGV0dGVyIGluIGxvdyBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvTG93ZXJDYXNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9Mb3dlckNhc2VDKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBjaGFuZ2UgY2FzZSIsICd0JywgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKCdUJykpOwogICAgIH0KQEAgLTE1NzYsNiArMjE5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI3RvTG93ZXJDYXNlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9Mb3dlckNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvTG93ZXJDYXNlX0koKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygndCcsIENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoaW50KSdUJykpOwogICAgICAgICAKQEAgLTE1OTAsNiArMjIxNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBzeW1ib2xzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgU3RyaW5nIHJldHVybmVkIiwgIlQiLCBuZXcgQ2hhcmFjdGVyKCdUJykudG9TdHJpbmcoKSk7CiAgICAgfQpAQCAtMTU5Nyw2ICsyMjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9UaXRsZUNhc2UoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9UaXRsZUNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1RpdGxlQ2FzZUMoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHRpdGxlIGNhc2UgZm9yIGEiLAogICAgICAgICAgICAgICAgICdBJywgQ2hhcmFjdGVyLnRvVGl0bGVDYXNlKCdhJykpOwpAQCAtMTYwOSw2ICsyMjU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9UaXRsZUNhc2UoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1RpdGxlQ2FzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9UaXRsZUNhc2VfSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdBJywgQ2hhcmFjdGVyLnRvVGl0bGVDYXNlKChpbnQpJ2EnKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygnQScsIENoYXJhY3Rlci50b1RpdGxlQ2FzZSgoaW50KSdBJykpOwpAQCAtMTYyNCw2ICsyMjc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9VcHBlckNhc2UoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9VcHBlckNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1VwcGVyQ2FzZUMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBjaGFyIGphdmEubGFuZy5DaGFyYWN0ZXIudG9VcHBlckNhc2UoY2hhcikKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdXBwZXIgY2FzZSBmb3IgYSIsCkBAIC0xNjM3LDYgKzIzMDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciN0b1VwcGVyQ2FzZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvVXBwZXJDYXNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1VwcGVyQ2FzZV9JKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoJ0EnLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGludCknYScpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdBJywgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChpbnQpJ0EnKSk7CkBAIC0xNjUyLDYgKzIzMjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNoYXJhY3RlciNnZXREaXJlY3Rpb25hbGl0eShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERpcmVjdGlvbmFsaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0RpcmVjdGlvbmFsaXlfSSgpewogICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1VOREVGSU5FRCwgQ2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgLmdldERpcmVjdGlvbmFsaXR5KDB4RkZGRSkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJfU3Vic2V0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJfU3Vic2V0VGVzdC5qYXZhCmluZGV4IGJjZTRhM2MuLjM0ZGRkMTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2hhcmFjdGVyX1N1YnNldFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NoYXJhY3Rlcl9TdWJzZXRUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDaGFyYWN0ZXIuU3Vic2V0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJfU3Vic2V0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2hhcmFjdGVyLlN1YnNldCNDaGFyYWN0ZXIuU3Vic2V0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIG51bGwgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN1YnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0N0b3IoKSB7CiAKICAgICAgICAgdHJ5IHsKQEAgLTM4LDYgKzUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DaGFyYWN0ZXIuU3Vic2V0I3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogCiAgICAgICAgIFN0cmluZyBuYW1lID0gIm5hbWUiOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJfVW5pY29kZUJsb2NrVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DaGFyYWN0ZXJfVW5pY29kZUJsb2NrVGVzdC5qYXZhCmluZGV4IGNkNDg1ZjIuLmMzZGUyNzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2hhcmFjdGVyX1VuaWNvZGVCbG9ja1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NoYXJhY3Rlcl9Vbmljb2RlQmxvY2tUZXN0LmphdmEKQEAgLTE2LDEwICsxNiwyNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJfVW5pY29kZUJsb2NrVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29mQygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKENoYXJhY3Rlci5Vbmljb2RlQmxvY2suQkFTSUNfTEFUSU4sIENoYXJhY3Rlci5Vbmljb2RlQmxvY2sub2YoKGNoYXIpMHgwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLkJBU0lDX0xBVElOLCBDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLm9mKChjaGFyKTB4N2YpKTsKQEAgLTI1OCw2ICsyNzMsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKENoYXJhY3Rlci5Vbmljb2RlQmxvY2suU1BFQ0lBTFMsIENoYXJhY3Rlci5Vbmljb2RlQmxvY2sub2YoKGNoYXIpMHhmZmYwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLlNQRUNJQUxTLCBDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLm9mKChjaGFyKTB4ZmZmZikpOwogICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb2ZJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5CQVNJQ19MQVRJTiwgQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5vZigweDApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKENoYXJhY3Rlci5Vbmljb2RlQmxvY2suQkFTSUNfTEFUSU4sIENoYXJhY3Rlci5Vbmljb2RlQmxvY2sub2YoMHg3ZikpOwpAQCAtNTYwLDcgKzU4NCwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5TVVBQTEVNRU5UQVJZX1BSSVZBVEVfVVNFX0FSRUFfQiwgQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5vZigweDEwMDAwMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5TVVBQTEVNRU5UQVJZX1BSSVZBVEVfVVNFX0FSRUFfQiwgQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5vZigweDEwZmZmZikpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vZklFeGNlcHRpb25zKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5vZihDaGFyYWN0ZXIuTUFYX0NPREVfUE9JTlQgKyAxKTsKQEAgLTU2OCw3ICs2MDAsMTUgQEAKICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JOYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLlNVUlJPR0FURVNfQVJFQSwgQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5mb3JOYW1lKCJTVVJST0dBVEVTX0FSRUEiKSk7CkBAIC04NjMsNiArOTAzLDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLlNVUFBMRU1FTlRBUllfUFJJVkFURV9VU0VfQVJFQV9CLCBDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLmZvck5hbWUoIlN1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYS1CIikpOwogICAgIH0KICAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9yTmFtZUxqYXZhX2xhbmdfU3RyaW5nRXhjZXB0aW9ucygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENoYXJhY3Rlci5Vbmljb2RlQmxvY2suZm9yTmFtZShudWxsKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xhc3NDYXN0RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc0Nhc3RFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZDlhNGI4MS4uN2E4YTJiZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc0Nhc3RFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc0Nhc3RFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDbGFzc0Nhc3RFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIENsYXNzQ2FzdEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbiNDbGFzc0Nhc3RFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDbGFzc0Nhc3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBDbGFzc0Nhc3RFeGNlcHRpb24gZSA9IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uI0NsYXNzQ2FzdEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDbGFzc0Nhc3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBDbGFzc0Nhc3RFeGNlcHRpb24gZSA9IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc0xvYWRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xhc3NMb2FkZXJUZXN0LmphdmEKaW5kZXggMDJlNDgyNS4uMjU4ZDA5OSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc0xvYWRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NsYXNzTG9hZGVyVGVzdC5qYXZhCkBAIC0xNyw4ICsxNywxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwpAQCAtMjYsOCArMzIsOCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuUG9saWN5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2xhc3NMb2FkZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIENsYXNzTG9hZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9sYXRpbGUgaW50IGZsYWc7CkBAIC0zNiw3ICs0MiwxNiBAQAogICAgICAqIFRlc3RzIHRoYXQgQ2xhc3Nsb2FkZXIuZGVmaW5lQ2xhc3MoKSBhc3NpZ25zIGFwcHJvcHJpYXRlIAogICAgICAqIGRlZmF1bHQgZG9tYWlucyB0byB0aGUgZGVmaW5lZCBjbGFzc2VzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVmaW5lQ2xhc3NfZGVmYXVsdERvbWFpbigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG9ubHkgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWZpbmVDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9kZWZpbmVDbGFzc19kZWZhdWx0RG9tYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNzY1IAogICAgICAgICBEeW5hbWljUG9saWN5IHBsYyA9IG5ldyBEeW5hbWljUG9saWN5KCk7CiAgICAgICAgIFBvbGljeSBiYWNrID0gUG9saWN5LmdldFBvbGljeSgpOwpAQCAtMTM1LDcgKzE1MCwxNiBAQAogICAgICAqIGFuZCB0aGUgc2FtZSBjbGFzc2xvYWRlci4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBib3RoIHRocmVhZHMgc3VjY2VlZCBidXQKICAgICAgKiBjbGFzcyBtdXN0IGJlIGRlZmluZWQganVzdCBvbmNlLiAgCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9sb2FkQ2xhc3NfY29uY3VycmVudExvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImxvYWRDbGFzcyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9sb2FkQ2xhc3NfY29uY3VycmVudExvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIAogICAgIHsgICAgCiAgICAgICAgIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwogICAgICAgICBTeW5jVGVzdENsYXNzTG9hZGVyIGNsID0gbmV3IFN5bmNUZXN0Q2xhc3NMb2FkZXIobG9jayk7CkBAIC0xNjMsNiArMTg3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzc0xvYWRlciNnZXRSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG9ubHkgcG9zaXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlc291cmNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5VUkwKICAgICAgICAgLy8gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmdldFJlc291cmNlKGphdmEubGFuZy5TdHJpbmcpCkBAIC0xODEsNiArMjE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzc0xvYWRlciNnZXRSZXNvdXJjZUFzU3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgb25seSBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlc291cmNlQXNTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZXNvdXJjZUFzU3RyZWFtTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLklucHV0U3RyZWFtCiAgICAgICAgIC8vIGphdmEubGFuZy5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCkBAIC0xOTksNiArMjQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzc0xvYWRlciNnZXRTeXN0ZW1DbGFzc0xvYWRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN5c3RlbUNsYXNzTG9hZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTeXN0ZW1DbGFzc0xvYWRlcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzc0xvYWRlcgogICAgICAgICAvLyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKQpAQCAtMjE1LDYgKzI2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIjZ2V0U3lzdGVtUmVzb3VyY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTeXN0ZW1SZXNvdXJjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbVJlc291cmNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5VUkwKICAgICAgICAgLy8gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKGphdmEubGFuZy5TdHJpbmcpCkBAIC0yMjUsNyArMjg1LDE2IEBACiAgICAgCiAgICAgCiAgICAgLy9SZWdyZXNzaW9uIFRlc3QgZm9yIEpJUkEtMjA0NwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzb3VyY2VBc1N0cmVhbV93aXRoU2hhcnBDaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgb25seSBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlc291cmNlQXNTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0UmVzb3VyY2VBc1N0cmVhbV93aXRoU2hhcnBDaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFRoZSBIYXJtb255IHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZCBhbnl3aGVyZSwgc28gd2UgdGFrZQogICAgICAgICAgKiBvdXIgb3duLgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IGNhMTM1YzUuLjc5YTU2MWIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDbGFzc05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiNDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSA9IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24jQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlID0gbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xhc3NUZXN0LmphdmEKaW5kZXggYzMwNmEzMC4uNDU5ODE3NCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbGFzc1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NsYXNzVGVzdC5qYXZhCkBAIC0xNyw5ICsxNywxMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKQEAgLTQzLDYgKzQ3LDcgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2xhc3MuY2xhc3MpIAogcHVibGljIGNsYXNzIENsYXNzVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKgpAQCAtMTA1LDYgKzExMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZm9yTmFtZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBpcyBub3QgdGVzdGVkLCBpZiBpdCdzIHBvc3NpYmxlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvck5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JOYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0U2FtZSgiQ2xhc3MgZm9yIG5hbWUgZmFpbGVkIGZvciBqYXZhLmxhbmcuT2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5PYmplY3QiKSk7CkBAIC0xODMsNiArMTk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXRDbGFzc2VzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2xhc3NlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xhc3NlcygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY2xhc3MgYXJyYXkgcmV0dXJuZWQiLAogICAgICAgICAgICAgICAgICAgICAgMiwgQ2xhc3NUZXN0LmNsYXNzLmdldENsYXNzZXMoKS5sZW5ndGgpOwpAQCAtMTkxLDcgKzIxNCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0Q2xhc3NlcygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDbGFzc2VzX3N1YnRlc3QwKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDbGFzc2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0Q2xhc3Nlc19zdWJ0ZXN0MCgpIHsKICAgICAgICAgZmluYWwgUGVybWlzc2lvbiBwcml2Q2hlY2tQZXJtaXNzaW9uID0gbmV3IEJhc2ljUGVybWlzc2lvbigiUHJpdmlsZWdlIGNoZWNrIikgewogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAgICAgICAgIH07CkBAIC0zNzYsNiArNDA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXRDb21wb25lbnRUeXBlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29tcG9uZW50VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29tcG9uZW50VHlwZSgpIHsKICAgICAgICAgYXNzZXJ0U2FtZSgiaW50IGFycmF5IGRvZXMgbm90IGhhdmUgaW50IGNvbXBvbmVudCB0eXBlIiwgaW50LmNsYXNzLCBpbnRbXS5jbGFzcwogICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRUeXBlKCkpOwpAQCAtMzg3LDYgKzQyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0Q29uc3RydWN0b3IoamF2YS5sYW5nLkNsYXNzW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eSBhbmQgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29uc3RydWN0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29uc3RydWN0b3IkTGphdmFfbGFuZ19DbGFzcygpCiAgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewogICAgICAgICBUZXN0Q2xhc3MuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzWzBdKTsKQEAgLTQwMSw2ICs0NTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzI2dldENvbnN0cnVjdG9ycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29uc3RydWN0b3JzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb25zdHJ1Y3RvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ29uc3RydWN0b3JbXSBjID0gVGVzdENsYXNzLmNsYXNzLmdldENvbnN0cnVjdG9ycygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgY29uc3RydWN0b3JzIHJldHVybmVkIiwgMSwgYy5sZW5ndGgpOwpAQCAtNDA5LDYgKzQ2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0RGVjbGFyZWRDbGFzc2VzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBnZXREZWNsYXJlZENsYXNzZXMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlY2xhcmVkQ2xhc3NlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjbGFyZWRDbGFzc2VzKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjbGFzcyBhcnJheSByZXR1cm5lZCIsIDIsIENsYXNzVGVzdC5jbGFzcy5nZXRDbGFzc2VzKCkubGVuZ3RoKTsKICAgICB9CkBAIC00MTYsNiArNDg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXREZWNsYXJlZENvbnN0cnVjdG9yKGphdmEubGFuZy5DbGFzc1tdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNsYXJlZENvbnN0cnVjdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzc1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlY2xhcmVkQ29uc3RydWN0b3IkTGphdmFfbGFuZ19DbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb25zdHJ1Y3RvcjxUZXN0Q2xhc3M+IGMgPSBUZXN0Q2xhc3MuY2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbMF0pOwogICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgY29uc3RydWN0b3IgcmV0dXJuZWQiLCBjLm5ld0luc3RhbmNlKCkuY1ZhbHVlKCkpOwpAQCAtNDI1LDYgKzUwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNsYXJlZENvbnN0cnVjdG9ycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ29uc3RydWN0b3JbXSBjID0gVGVzdENsYXNzLmNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG51bWJlciBvZiBjb25zdHJ1Y3RvcnMgcmV0dXJuZWQiLCAyLCBjLmxlbmd0aCk7CkBAIC00MzMsNiArNTE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXREZWNsYXJlZEZpZWxkKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBhcmUgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlY2xhcmVkRmllbGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREZWNsYXJlZEZpZWxkTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmllbGQgZiA9IFRlc3RDbGFzcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJwdWJGaWVsZCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBmaWVsZCIsIDIsIGYuZ2V0SW50KG5ldyBUZXN0Q2xhc3MoKSkpOwpAQCAtNDQxLDYgKzUzNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0RGVjbGFyZWRGaWVsZHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNsYXJlZEZpZWxkcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjbGFyZWRGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmllbGRbXSBmID0gVGVzdENsYXNzLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBmaWVsZHMiLCA0LCBmLmxlbmd0aCk7CkBAIC00NTMsNiArNTU3LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXREZWNsYXJlZE1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuQ2xhc3NbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGFyZSBub3QgdGVzdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlY2xhcmVkTWV0aG9kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5DbGFzc1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlY2xhcmVkTWV0aG9kTGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19DbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbSA9IFRlc3RDbGFzcy5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgicHViTWV0aG9kIiwgbmV3IENsYXNzWzBdKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgbWV0aG9kIiwgMiwgKChJbnRlZ2VyKSAobS5pbnZva2UobmV3IFRlc3RDbGFzcygpKSkpCkBAIC00NjMsNiArNTc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXREZWNsYXJlZE1ldGhvZHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNsYXJlZE1ldGhvZHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlY2xhcmVkTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2RbXSBtID0gVGVzdENsYXNzLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBudW1iZXIgb2YgbWV0aG9kcyIsIDMsIG0ubGVuZ3RoKTsKQEAgLTQ3Myw2ICs1OTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzI2dldERlY2xhcmluZ0NsYXNzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTaW1wbGUgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNsYXJpbmdDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhDbGFzc1Rlc3QuY2xhc3MsIFRlc3RDbGFzcy5jbGFzcy5nZXREZWNsYXJpbmdDbGFzcygpKTsKICAgICB9CkBAIC00ODAsNiArNjExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiBhcmUgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmllbGRMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWVsZCBmID0gVGVzdENsYXNzLmNsYXNzLmdldEZpZWxkKCJwdWJGaWVsZCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBmaWVsZCIsIDIsIGYuZ2V0SW50KG5ldyBUZXN0Q2xhc3MoKSkpOwpAQCAtNDk0LDYgKzYzNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0RmllbGRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBpcyBub3QgdGVzdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZpZWxkcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpZWxkW10gZiA9IFRlc3RDbGFzcy5jbGFzcy5nZXRGaWVsZHMoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGZpZWxkcyIsIDIsIGYubGVuZ3RoKTsKQEAgLTUwNSw2ICs2NTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzI2dldEludGVyZmFjZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnRlcmZhY2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnRlcmZhY2VzKCkgewogICAgICAgICBDbGFzc1tdIGludGVyZmFjZXM7CiAgICAgICAgIExpc3Q8Pz4gaW50ZXJmYWNlTGlzdDsKQEAgLTUyMCw2ICs2NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzI2dldE1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3NbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNZXRob2QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLkNsYXNzW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kTGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19DbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbSA9IFRlc3RDbGFzcy5jbGFzcy5nZXRNZXRob2QoInB1Yk1ldGhvZCIsIG5ldyBDbGFzc1swXSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG1ldGhvZCIsIDIsICgoSW50ZWdlcikgKG0uaW52b2tlKG5ldyBUZXN0Q2xhc3MoKSkpKQpAQCAtNTM2LDYgKzcwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0TWV0aG9kcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHRlc3RlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNZXRob2RzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZFtdIG0gPSBUZXN0Q2xhc3MuY2xhc3MuZ2V0TWV0aG9kcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBudW1iZXIgb2YgbWV0aG9kcyIsCkBAIC01NTEsNiArNzI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXRNb2RpZmllcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNb2RpZmllcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZGlmaWVycygpIHsKICAgICAgICAgaW50IGRjbSA9IFByaXZhdGVDbGFzcy5jbGFzcy5nZXRNb2RpZmllcnMoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoImRlZmF1bHQgY2xhc3MgaXMgcHVibGljIiwgTW9kaWZpZXIuaXNQdWJsaWMoZGNtKSk7CkBAIC01NjYsNiArNzUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpLmdldE5hbWUoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChjbGFzc05hbWUpOwpAQCAtNTg1LDYgKzc3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjZ2V0UmVzb3VyY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlc291cmNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gIi9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSGVsbG9Xb3JsZC50eHQiOwogICAgICAgICBVUkwgcmVzID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShuYW1lKTsKQEAgLTU5NCw3ICs3OTcsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzI2dldFJlc291cmNlQXNTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlc291cmNlQXNTdHJlYW1MamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZUFzU3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFJlc291cmNlQXNTdHJlYW1MamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9ICIvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvdGVzdF9yZXNvdXJjZS50eHQiOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJ0aGUgZmlsZSAiICsgbmFtZSArICIgY2FuIG5vdCBiZSBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSIsIGdldENsYXNzKCkKICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKSk7CkBAIC02MjAsNiArODMyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNnZXRTdXBlcmNsYXNzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3VwZXJjbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3VwZXJjbGFzcygpIHsKICAgICAgICAgYXNzZXJ0TnVsbCgiT2JqZWN0IGhhcyBhIHN1cGVyY2xhc3M/Pz8iLCBPYmplY3QuY2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKICAgICAgICAgYXNzZXJ0U2FtZSgiTm9ybWFsIGNsYXNzIGhhcyBib2d1cyBzdXBlcmNsYXNzIiwgSW5wdXRTdHJlYW0uY2xhc3MsCkBAIC02MzMsNiArODU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5DbGFzcyNpc0FycmF5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNBcnJheSgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm9uLWFycmF5IHR5cGUgY2xhaW1zIHRvIGJlLiIsICFpbnQuY2xhc3MuaXNBcnJheSgpKTsKICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBudWxsOwpAQCAtNjQ5LDYgKzg3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjaXNBc3NpZ25hYmxlRnJvbShqYXZhLmxhbmcuQ2xhc3MpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQXNzaWduYWJsZUZyb20iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQXNzaWduYWJsZUZyb21MamF2YV9sYW5nX0NsYXNzKCkgewogICAgICAgICBDbGFzczw/PiBjbGF6ejEgPSBudWxsOwogICAgICAgICBDbGFzczw/PiBjbGF6ejIgPSBudWxsOwpAQCAtNjY4LDYgKzkwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjaXNJbnRlcmZhY2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0ludGVyZmFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNJbnRlcmZhY2UoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIlByaW0gdHlwZSBjbGFpbXMgdG8gYmUgaW50ZXJmYWNlLiIsICFpbnQuY2xhc3MuaXNJbnRlcmZhY2UoKSk7CiAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbnVsbDsKQEAgLTY4Niw2ICs5MzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzI2lzUHJpbWl0aXZlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNQcmltaXRpdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUHJpbWl0aXZlKCkgewogICAgICAgICBhc3NlcnRGYWxzZSgiSW50ZXJmYWNlIHR5cGUgY2xhaW1zIHRvIGJlIHByaW1pdGl2ZS4iLCBSdW5uYWJsZS5jbGFzcy5pc1ByaW1pdGl2ZSgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIk9iamVjdCB0eXBlIGNsYWltcyB0byBiZSBwcmltaXRpdmUuIiwgT2JqZWN0LmNsYXNzLmlzUHJpbWl0aXZlKCkpOwpAQCAtNjk4LDYgKzk1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ2xhc3MjbmV3SW5zdGFuY2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3SW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBudWxsOwogICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5PYmplY3QiKTsKQEAgLTcxOSw2ICs5ODUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsYXNzI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzIHRvU3RyaW5nIHByaW50ZWQgd3JvbmcgdmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgImludCIsIGludC5jbGFzcy50b1N0cmluZygpKTsKQEAgLTczNiw5ICsxMDExLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgW0xqYXZhLmxhbmcuT2JqZWN0OyIsIGNsYXp6LnRvU3RyaW5nKCkpOwogICAgIH0KICAgICAKLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmVzb3VyY2VBc1N0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICAvLyBSZWdyZXNzaW9uIFRlc3QgZm9yIEpJUkEtMjA0NwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzb3VyY2VBc1N0cmVhbV93aXRoU2hhcnBDaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRSZXNvdXJjZUFzU3RyZWFtX3dpdGhTaGFycENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uewogICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiLyIrRklMRU5BTUUpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGluKTsKICAgICAgICAgaW4uY2xvc2UoKTsKQEAgLTc1Niw3ICsxMDM5LDE3IEBACiAgICAgICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0yNjQ0OgogICAgICAgICAgKiBMb2FkIHN5c3RlbSBhbmQgbm9uLXN5c3RlbSBhcnJheSBjbGFzc2VzIHZpYSBDbGFzcy5mb3JOYW1lKCkKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9yTmFtZV9hcnJheXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgICAgcHVycG9zZSA9ICJMaW5rYWdlRXJyb3IsIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBhcmUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IHZlcmlmaWVkLiIsCisgICAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZvck5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Zvck5hbWVfYXJyYXlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBDbGFzcyBjMSA9IGdldENsYXNzKCk7CiAgICAgICAgICAgICBTdHJpbmcgcyA9IGMxLmdldE5hbWUoKTsKICAgICAgICAgICAgIENsYXNzIGExID0gQ2xhc3MuZm9yTmFtZSgiW0wiICsgcyArICI7Iik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NsYXNzVGVzdDIuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xhc3NUZXN0Mi5qYXZhCmluZGV4IDRjZTBhMzYuLjk5ZWE5NGIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xhc3NUZXN0Mi5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xhc3NUZXN0Mi5qYXZhCkBAIC0xNyw5ICsxNywxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDbGFzcy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ2xhc3NUZXN0MiBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKQEAgLTM5LDYgKzQ1LDE1IEBACiAgICAgLyoqCiAgICAgICogIFRlc3RzIGxvYWRpbmcgYSByZXNvdXJjZSB3aXRoIGEgcmVsYXRpdmUgbmFtZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZXNvdXJjZUFzU3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZUFzU3RyZWFtMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIENsYXNzIGNsYXp6ID0gZ2V0Q2xhc3MoKTsKICAgICAgICAgCkBAIC01Niw2ICs3MSwxNSBAQAogICAgIC8qKgogICAgICAqICBUZXN0cyBsb2FkaW5nIGEgcmVzb3VyY2Ugd2l0aCBhIGdsb2JhbCBuYW1lLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlc291cmNlQXNTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlQXNTdHJlYW0yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3MgY2xhenogPSBnZXRDbGFzcygpOwogICAgICAgICAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDRjM2E0MjIuLjEwYjZiYzcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uI0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlID0gbmV3IENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uI0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSA9IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NvbXBpbGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Db21waWxlclRlc3QuamF2YQppbmRleCBhMTUwZTE1Li40NjJiOTI1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0NvbXBpbGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvQ29tcGlsZXJUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDb21waWxlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ29tcGlsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Db21waWxlciNjb21tYW5kKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbW1hbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21tYW5kTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgYmVoYXZpb3IuIiwgQ29tcGlsZXIuY29tbWFuZChuZXcgT2JqZWN0KCkpKTsKQEAgLTM1LDYgKzUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Db21waWxlciNjb21waWxlQ2xhc3MoamF2YS5sYW5nLkNsYXNzKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21waWxlQ2xhc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBpbGVDbGFzc0xqYXZhX2xhbmdfQ2xhc3MoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBEbyBub3QgdGVzdCByZXR1cm4gdmFsdWUsIG1heSByZXR1cm4gdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24KQEAgLTQ4LDYgKzcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Db21waWxlciNjb21waWxlQ2xhc3NlcyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21waWxlQ2xhc3NlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBpbGVDbGFzc2VzTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBEbyBub3QgdGVzdCByZXR1cm4gdmFsdWUsIG1heSByZXR1cm4gdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24KQEAgLTYxLDYgKzk0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Db21waWxlciNkaXNhYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0aGF0IGRpc2FibGUoKSBtZXRob2QgY2F1c2VzIHRoZSBDb21waWxlciAiICsKKyAgICAgICAgICAgICJ0byBjZWFzZSBvcGVyYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGlzYWJsZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENvbXBpbGVyLmRpc2FibGUoKTsKQEAgLTczLDYgKzExNiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuQ29tcGlsZXIjZW5hYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0aGF0IGVuYWJsZSgpIG1ldGhvZCBjYXVzZXMgdGhlIENvbXBpbGVyICIgKworICAgICAgICAgICAgInRvIHJlc3VtZSBvcGVyYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5hYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbmFibGUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDb21waWxlci5kaXNhYmxlKCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0RvdWJsZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRG91YmxlVGVzdC5qYXZhCmluZGV4IDBmNmMxYmQuLjkyN2EzYjkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRG91YmxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRG91YmxlVGVzdC5qYXZhCkBAIC0xNiwxMCArMTYsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRG91YmxlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBEb3VibGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgcmF3Qml0c0ZvcjNfNGVuMzI0VG9OMVtdID0geyAweDFMLCAweDdMLCAweDQ1TCwgMHgyYjBMLCAweDFhZTJMLAogICAgICAgICAgICAgMHgxMGNkMUwsIDB4YTgwMjhMLCAweDY5MDE4ZEwsIDB4NDFhMGY3ZUwsIDB4MjkwNDlhZWRMLCAweDE5YTJlMGQ0NEwsCkBAIC0yMDUsNiArMjExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjRG91YmxlKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckQoKSB7CiAgICAgICAgIERvdWJsZSBkID0gbmV3IERvdWJsZSgzOTA4OS44ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ3JlYXRlZCBpbmNvcnJlY3QgZG91YmxlIiwgMzkwODkuODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgsIGQKQEAgLTIxNCw2ICsyMjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNEb3VibGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgRG91YmxlIGQgPSBuZXcgRG91YmxlKCIzOTA4OS44ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkNyZWF0ZWQgaW5jb3JyZWN0IGRvdWJsZSIsIDM5MDg5Ljg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4LCBkCkBAIC0yMzEsNiArMjU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjYnl0ZVZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJieXRlVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2J5dGVWYWx1ZSgpIHsKICAgICAgICAgRG91YmxlIGQgPSBuZXcgRG91YmxlKDE5MjMzMTEuNDc3MTIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBieXRlIHZhbHVlIiwgKGJ5dGUpIC0xNywgZC5ieXRlVmFsdWUoKSk7CkBAIC0yNDAsNiArMjczLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjY29tcGFyZVRvKGphdmEubGFuZy5Eb3VibGUpCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjY29tcGFyZShkb3VibGUsIGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlKCkgewogICAgICAgICBkb3VibGVbXSB2YWx1ZXMgPSBuZXcgZG91YmxlW10geyBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFksIC1Eb3VibGUuTUFYX1ZBTFVFLCAtMmQsCiAgICAgICAgICAgICAgICAgLURvdWJsZS5NSU5fVkFMVUUsIC0wZCwgMGQsIERvdWJsZS5NSU5fVkFMVUUsIDJkLCBEb3VibGUuTUFYX1ZBTFVFLApAQCAtMjczLDYgKzMxNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI2RvdWJsZVRvTG9uZ0JpdHMoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgTmFOLCBwb3NpdGl2ZSBpbmZpbml0eSwgbmVnYXRpdmUgaW5maW5pdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVG9Mb25nQml0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZG91YmxlVG9Mb25nQml0c0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyhkb3VibGUpCiAgICAgICAgIERvdWJsZSBkID0gbmV3IERvdWJsZShEb3VibGUuTUFYX1ZBTFVFKTsKQEAgLTI4NSw2ICszMzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNkb3VibGVUb1Jhd0xvbmdCaXRzKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIE5hTiwgaW5maW5pdGllcyB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVG9SYXdMb25nQml0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZG91YmxlVG9SYXdMb25nQml0c0QoKSB7CiAgICAgICAgIGxvbmcgbCA9IDB4N2ZmODAwMDAwMDAwMDRkMkw7CiAgICAgICAgIGRvdWJsZSBkID0gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUobCk7CkBAIC0yOTQsNiArMzU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjZG91YmxlVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kb3VibGVWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG91YmxlIHZhbHVlIHJldHVybmVkIiwgOTk5OTk5OTk5OTk5OTk5Ljk5OTk5OTk5OTk5OTksCiAgICAgICAgICAgICAgICAgbmV3IERvdWJsZSg5OTk5OTk5OTk5OTk5OTkuOTk5OTk5OTk5OTk5OSkuZG91YmxlVmFsdWUoKSwgMEQpOwpAQCAtMzAyLDYgKzM3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI2Zsb2F0VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zsb2F0VmFsdWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBmbG9hdCBqYXZhLmxhbmcuRG91YmxlLmZsb2F0VmFsdWUoKQogICAgICAgICBhc3NlcnRUcnVlKApAQCAtMzEzLDYgKzM5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5Eb3VibGUuaGFzaENvZGUoKQogICAgICAgICBmb3IgKGludCBpID0gLTEwMDA7IGkgPCAxMDAwOyBpKyspIHsKQEAgLTMzMSw2ICs0MTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNpbnRWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBOYU4sIGluZmluaXRpZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ludFZhbHVlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5Eb3VibGUuaW50VmFsdWUoKQogICAgICAgICBEb3VibGUgZCA9IG5ldyBEb3VibGUoMTkyMzMxMS40NzcxMik7CkBAIC0zNDAsNiArNDM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjaXNJbmZpbml0ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBNQVgvTUlOIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0luZmluaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0luZmluaXRlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuRG91YmxlLmlzSW5maW5pdGUoKQogICAgICAgICBhc3NlcnRUcnVlKCJORUdBVElWRV9JTkZJTklUWSByZXR1cm5lZCBmYWxzZSIsIG5ldyBEb3VibGUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKQpAQCAtMzUyLDYgKzQ1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI2lzSW5maW5pdGUoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBpbmZpbml0aWVzICsgTUFYIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSW5maW5pdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSW5maW5pdGVEKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuRG91YmxlLmlzSW5maW5pdGUoZG91YmxlKQogICAgICAgICBhc3NlcnRUcnVlKCJJbmZpbml0eSBjaGVjayBmYWlsZWQiLCBEb3VibGUuaXNJbmZpbml0ZShEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpCkBAIC0zNjIsNiArNDc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjaXNOYU4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc05hTiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNOYU4oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5Eb3VibGUuaXNOYU4oKQogICAgICAgICBEb3VibGUgZCA9IG5ldyBEb3VibGUoMC4wIC8gMC4wKTsKQEAgLTM3Myw2ICs0OTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNpc05hTihkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRE9lc24ndCBjaGVjayByZXR1cm5lZCBmYWxzZSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc05hTiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNOYU5EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuRG91YmxlLmlzTmFOKGRvdWJsZSkKIApAQCAtMzgzLDYgKzUxNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI2xvbmdCaXRzVG9Eb3VibGUobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ0JpdHNUb0RvdWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvbmdCaXRzVG9Eb3VibGVKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5Eb3VibGUubG9uZ0JpdHNUb0RvdWJsZShsb25nKQogCkBAIC0zOTYsNiArNTM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjbG9uZ1ZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb25nVmFsdWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEubGFuZy5Eb3VibGUubG9uZ1ZhbHVlKCkKICAgICAgICAgRG91YmxlIGQgPSBuZXcgRG91YmxlKDE5MjMzMTEuNDc3MTIpOwpAQCAtNDA1LDYgKzU1NSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI3BhcnNlRG91YmxlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYm91bmRhcnkgdmFsdWVzIGFuZCB0aGUgbG9vcCBkdWUgdG8gIiArCisgICAgICAgICAgICAidGhlIGRpZmZlcmVuY2UgaW4gdGhlIGV4cGVjdGVkIG91dHB1dCBzdHJpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkb3VibGUgcmV0dXJuZWQsIGV4cGVjdGVkIHplcm8uIiwgMC4wLCBEb3VibGUKICAgICAgICAgICAgICAgICAucGFyc2VEb3VibGUoIjIuNDcwMzI4MjI5MjA2MjMyNzIwODgyODQzOTY0MzQxMWUtMzI0IiksIDAuMCk7CkBAIC01NTcsNiArNzE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjcGFyc2VEb3VibGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdW1iZXJGb3JtYXRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX0lsbGVnYWwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBEb3VibGUucGFyc2VEb3VibGUoIjAuMHAwRCIpOwpAQCAtNjI1LDYgKzc5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI3BhcnNlRG91YmxlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX0Zyb21IZXhTdHJpbmcoKSB7CiAgICAgICAgIGRvdWJsZSBhY3R1YWw7CiAgICAgICAgIGRvdWJsZSBleHBlY3RlZDsKQEAgLTcwOSw2ICs4ODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNwYXJzZURvdWJsZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX05vcm1hbFBvc2l0aXZlRXhwb25lbnQoKSB7CiAgICAgICAgIGxvbmdbXSBleHBlY3RlZHMgPSB7CiAgICAgICAgICAgICAgICAgMHgzZjMyMzQ1Njc4OWFiY2RmTCwgICAgICAgICAgICAgICAgMHg0MGUxMTEwMTIzNDU2NzhhTCwgICAgICAgICAgICAgICAgMHg0MWExMTEwMDkxYTJiM2M1TCwKQEAgLTc3MCw2ICs5NTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNwYXJzZURvdWJsZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX05vcm1hbE5lZ2F0aXZlRXhwb25lbnQoKSB7CiAgICAgICAgIGxvbmdbXSBleHBlY3RlZHMgPSB7CiAgICAgICAgICAgICAgICAgMHgzZjMyMzQ1Njc4OWFiY2RmTCwgICAgICAgICAgICAgICAgMHgzZjgxMTEwMTIzNDU2NzhhTCwgICAgICAgICAgICAgICAgMHgzZWUxMTEwMDkxYTJiM2M1TCwKQEAgLTgzMSw2ICsxMDI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjcGFyc2VEb3VibGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtYXggYm91bmRhcnkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX01heE5vcm1hbEJvdW5kYXJ5KCkgewogICAgICAgIGxvbmdbXSBleHBlY3RlZHMgPSB7CiAgICAgICAgICAgICAgICAweDdmZWZmZmZmZmZmZmZmZmZMLCAgICAgICAgICAgICAgIDB4N2ZlZmZmZmZmZmZmZmZmZkwsICAgICAgICAgICAgICAgMHg3ZmVmZmZmZmZmZmZmZmZmTCwKQEAgLTg5NSw2ICsxMTAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjcGFyc2VEb3VibGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBNaW4gYm91bmRhcnkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX01pbk5vcm1hbEJvdW5kYXJ5KCkgewogICAgICAgICBsb25nW10gZXhwZWN0ZWRzID0gewogICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAwMDAwMDBMLCAgICAgICAgICAgICAgICAweDEwMDAwMDAwMDAwMDAwTCwgICAgICAgICAgICAgICAgMHgxMDAwMDAwMDAwMDAwMEwsCkBAIC05NTksNiArMTE3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI3BhcnNlRG91YmxlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTWF4IGJvdW5kYXJ5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlRG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VEb3VibGVfTFN0cmluZ19NYXhTdWJOb3JtYWxCb3VuZGFyeSgpIHsKICAgICAgICAgbG9uZ1tdIGV4cGVjdGVkcyA9IHsKICAgICAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZMLCAgICAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZMLCAgICAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZMLApAQCAtMTAyMyw2ICsxMjQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjcGFyc2VEb3VibGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBNaW4gYm91bmRhcnkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX01pblN1Yk5vcm1hbEJvdW5kYXJ5KCkgewogICAgICAgICBsb25nW10gZXhwZWN0ZWRzID0gewogICAgICAgICAgICAgICAgIDB4MUwsICAgICAgICAgICAgICAgIDB4MUwsICAgICAgICAgICAgICAgIDB4MkwsCkBAIC0xMDg3LDYgKzEzMTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNwYXJzZURvdWJsZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHplcm8gYm91bmRhcnkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZURvdWJsZV9MU3RyaW5nX1plcm9Cb3VuZGFyeSgpIHsKICAgICAgICAgbG9uZ1tdIGV4cGVjdGVkcyA9IHsKICAgICAgICAgICAgICAgICAweDBMLCAgICAgICAgICAgICAgICAweDBMLCAgICAgICAgICAgICAgICAweDBMLApAQCAtMTEzNCw2ICsxMzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjc2hvcnRWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Nob3J0VmFsdWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBzaG9ydCBqYXZhLmxhbmcuRG91YmxlLnNob3J0VmFsdWUoKQogICAgICAgICBEb3VibGUgZCA9IG5ldyBEb3VibGUoMTkyMzMxMS40NzcxMik7CkBAIC0xMTQzLDYgKzEzOTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLkRvdWJsZS50b1N0cmluZygpCiAgICAgICAgIHRlc3RfdG9TdHJpbmcoMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwgIjEuNzk3NjkzMTM0ODYyMzE1N0UzMDgiKTsKQEAgLTExNTIsNiArMTQxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI3RvU3RyaW5nKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLkRvdWJsZS50b1N0cmluZyhkb3VibGUpCiAgICAgICAgIHRlc3RfdG9TdHJpbmcoMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwgIjEuNzk3NjkzMTM0ODYyMzE1N0UzMDgiKTsKQEAgLTEyMzksNiArMTUwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5Eb3VibGUKICAgICAgICAgLy8gamF2YS5sYW5nLkRvdWJsZS52YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpCkBAIC0xMjk2LDYgKzE1NzMsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLkRvdWJsZSkKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSNjb21wYXJlKGRvdWJsZSwgZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9sYW5nX0RvdWJsZSgpIHsKICAgICAgICAgLy8gQSBzZWxlY3Rpb24gb2YgZG91YmxlIHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIuCiAgICAgICAgIGRvdWJsZVtdIHZhbHVlcyA9IG5ldyBkb3VibGVbXSB7IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSwgLURvdWJsZS5NQVhfVkFMVUUsIC0yZCwKQEAgLTEzMzcsNiArMTYyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRG91YmxlI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgRG91YmxlIGQxID0gbmV3IERvdWJsZSg4NzY1NDMyMS4xMjM0NWQpOwogICAgICAgICBEb3VibGUgZDIgPSBuZXcgRG91YmxlKDg3NjU0MzIxLjEyMzQ1ZCk7CkBAIC0xMzU5LDYgKzE2NTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkRvdWJsZSN0b0hleFN0cmluZyhkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvSGV4U3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0hleFN0cmluZ0YoKSB7CiAgICAgICAgIC8vIHRoZSBmb2xsb3cgdmFsdWVzIGNvbWUgZnJvbSB0aGUgRG91YmxlIEphdmFkb2MvU3BlYwogICAgICAgICBhc3NlcnRFcXVhbHMoIjB4MC4wcDAiLCBEb3VibGUudG9IZXhTdHJpbmcoMC4wRCkpOwpAQCAtMTM5MSw2ICsxNjk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Eb3VibGUjdmFsdWVPZihkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZEKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERvdWJsZShEb3VibGUuTUlOX1ZBTFVFKSwgRG91YmxlLnZhbHVlT2YoRG91YmxlLk1JTl9WQUxVRSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERvdWJsZShEb3VibGUuTUFYX1ZBTFVFKSwgRG91YmxlLnZhbHVlT2YoRG91YmxlLk1BWF9WQUxVRSkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9FbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9FbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDJmZWExYjEuLmZlNmYwODAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0VudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDggKzE2LDE0IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHVibGljIGVudW0gRml4dHVyZSB7CkBAIC0yOCw2ICszNCwxNSBAQAogICAgICAqIEB0ZXN0IGphdmEubGFuZy5FbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9uI0VudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb24oQ2xhc3M8PwogICAgICAqIGV4dGVuZHMgRW51bT4sIFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfQ2xhc3NMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9uKG51bGwsICIiKTsKQEAgLTM5LDYgKzU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5sYW5nLkVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb24jZW51bVR5cGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnVtVHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW51bVR5cGUoKSB7CiAgICAgICAgIEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb24gZSA9IG5ldyBFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9uKEZpeHR1cmUuY2xhc3MsICJGT1VSIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhGaXh0dXJlLmNsYXNzLCBlLmVudW1UeXBlKCkpOwpAQCAtNDcsNiArNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLmxhbmcuRW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbiNjb25zdGFudE5hbWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25zdGFudE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0YW50TmFtZSgpIHsKICAgICAgICAgRW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbiBlID0gbmV3IEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb24oRml4dHVyZS5jbGFzcywgIkZPVVIiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGT1VSIiwgZS5jb25zdGFudE5hbWUoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0VudW1UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0VudW1UZXN0LmphdmEKaW5kZXggOWMyM2NkNy4uYzU1MzliMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9FbnVtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRW51bVRlc3QuamF2YQpAQCAtMTYsMTQgKzE2LDIwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCiBpbXBvcnQgdGVzdHMudXRpbC5TZXJpYWxpemF0aW9uVGVzdGVyOwogCitAVGVzdFRhcmdldENsYXNzKEVudW0uY2xhc3MpIAogcHVibGljIGNsYXNzIEVudW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgZW51bSBTYW1wbGUgewpAQCAtNDgsNiArNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkVudW0jY29tcGFyZVRvKGphdmEubGFuZy5FbnVtKSAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5FbnVtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBhcmVUb0xqYXZhX2xhbmdfRW51bSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgU2FtcGxlLk1PRS5jb21wYXJlVG8oU2FtcGxlLkxBUlJZKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBTYW1wbGUuTU9FLmNvbXBhcmVUbyhTYW1wbGUuTU9FKSk7CkBAIC02Myw2ICs3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRW51bSNlcXVhbHMoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UobW9lLmVxdWFscygiYm9iIikpOwogICAgICAgICBhc3NlcnRUcnVlKG1vZS5lcXVhbHMoU2FtcGxlLk1PRSkpOwpAQCAtNzQsNiArOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkVudW0jZ2V0RGVjbGFyaW5nQ2xhc3MoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNsYXJpbmdDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhTYW1wbGUuY2xhc3MsIG1vZS5nZXREZWNsYXJpbmdDbGFzcygpKTsKICAgICB9CkBAIC04MSw2ICsxMTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkVudW0jaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgaGFzaCBjb2RlIG9mIGRpZmZlcmVudCBvYmplY3RzLGVxdWFsIG9iamVjdHMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMgKG1vZS5oYXNoQ29kZSgpLCBtb2UuaGFzaENvZGUoKSk7CiAgICAgfQpAQCAtODgsNiArMTMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5FbnVtI25hbWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uYW1lKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIk1PRSIsIG1vZS5uYW1lKCkpOwogICAgIH0KQEAgLTk1LDYgKzE0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRW51bSNvcmRpbmFsKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3JkaW5hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3JkaW5hbCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxhcnJ5Lm9yZGluYWwoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBtb2Uub3JkaW5hbCgpKTsKQEAgLTEwNCw2ICsxNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkVudW0jdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydFRydWUobW9lLnRvU3RyaW5nKCkuZXF1YWxzKCJNT0UiKSk7CiAgICAgfQpAQCAtMTExLDYgKzE4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRW51bSN2YWx1ZU9mKENsYXNzLCBTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0U2FtZShTYW1wbGUuQ1VSTFksIFNhbXBsZS52YWx1ZU9mKCJDVVJMWSIpKTsKICAgICAgICAgYXNzZXJ0U2FtZShTYW1wbGUuTEFSUlksIFNhbXBsZS52YWx1ZU9mKCJMQVJSWSIpKTsKQEAgLTE3Miw2ICsyNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkVudW0jdmFsdWVzCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGhlcmUgaXMgbm8gc3VjaCBtZXRob2QgaW4gdGhlIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZXMoKSB7CiAgICAgICAgIFNhbXBsZVtdIG15VmFsdWVzID0gU2FtcGxlLnZhbHVlcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMywgbXlWYWx1ZXMubGVuZ3RoKTsKQEAgLTE4Niw3ICsyNzMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBTZXJpYWxpemF0aW9uL2Rlc2VyaWxhemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBIYXJtb255LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGF0aWJpbGl0eVNlcmlhbGl6YXRpb25faW5DbGFzc19Db21wbGV4X0hhcm1vbnkoKSB0aHJvd3MgRXhjZXB0aW9ueworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlNlcmlhbGl6YXRpb24vZGVzZXJpbGF6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2NvbXBhdGliaWxpdHlTZXJpYWxpemF0aW9uX2luQ2xhc3NfQ29tcGxleF9IYXJtb255KCkgdGhyb3dzIEV4Y2VwdGlvbnsKICAgICAgICAgLy8gVE9ETyBtaWdyYXRlIHRvIHRoZSBuZXcgdGVzdGluZyBmcmFtZXdvcmsgCiAgICAgICAgIGFzc2VydFRydWUoU2VyaWFsaXphdGlvblRlc3Rlci5hc3NlcnRDb21wYWJpbGl0eUVxdWFscyhuZXcgTW9ja0VudW0yKCksCiAgICAgICAgICAgICAic2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRW51bVRlc3QuaGFybW9ueS5zZXIiKSk7CkBAIC0xOTUsNiArMjkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gdGVzdCBhIG1hcCBjbGFzcyB0aGF0IGhhcyBlbnVtcy4KQEAgLTIyNSw2ICszMzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMTE2MwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9FcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRXJyb3JUZXN0LmphdmEKaW5kZXggNDNmZjY1YzIuLmNhNmJkOGMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRXJyb3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9FcnJvclRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEVycm9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBFcnJvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkVycm9yI0Vycm9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBFcnJvciBlID0gbmV3IEVycm9yKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkVycm9yI0Vycm9yKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgRXJyb3IgZSA9IG5ldyBFcnJvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yVGVzdC5qYXZhCmluZGV4IDdlMGQ4ZTkuLmRjYzhhMDYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMjYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3JUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yI0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlID0gbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTMyLDYgKzQ3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5FeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IjRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlID0gbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CkBAIC00MSw2ICs2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRXhjZXB0aW9uSW5Jbml0aWFsaXplckV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciNFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IoamF2YS5sYW5nLlRocm93YWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKICAgICAgICAgTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlID0gbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlID0gbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihucGUpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9FeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCA5ZTFhMTAzLi41ZDAxYmMxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0V4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRXhjZXB0aW9uI0V4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5FeGNlcHRpb24jRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0Zsb2F0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9GbG9hdFRlc3QuamF2YQppbmRleCA2M2ZmYmVmLi41ZjE4YzMxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0Zsb2F0VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvRmxvYXRUZXN0LmphdmEKQEAgLTE2LDggKzE2LDE0IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEZsb2F0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGbG9hdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmF3Qml0c0ZvcjNfNGVOMzhUbzM4W10gPSB7IDB4MTM5NDQ3MCwgMHgyZTc5NThjLCAweDQ5MGJkNzcsIDB4NjM0ZWNkNSwKQEAgLTk3LDYgKzEwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjRmxvYXQoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5GbG9hdChmbG9hdCkKIApAQCAtMTA3LDYgKzEyMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjRmxvYXQoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGlsbGVnYWwgY2FzZXMsIE51bWJlckZvcm1hdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuRmxvYXQoamF2YS5sYW5nLlN0cmluZykKIApAQCAtMTE3LDYgKzE0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjYnl0ZVZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ieXRlVmFsdWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBieXRlIGphdmEubGFuZy5GbG9hdC5ieXRlVmFsdWUoKQogICAgICAgICBGbG9hdCBmID0gbmV3IEZsb2F0KDAuNDY4NzRmKTsKQEAgLTEyOCw2ICsxNjEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I2NvbXBhcmVUbyhqYXZhLmxhbmcuRmxvYXQpCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNjb21wYXJlKGZsb2F0LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZSgpIHsKICAgICAgICAgZmxvYXRbXSB2YWx1ZXMgPSBuZXcgZmxvYXRbXSB7IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZLCAtRmxvYXQuTUFYX1ZBTFVFLCAtMmYsCiAgICAgICAgICAgICAgICAgLUZsb2F0Lk1JTl9WQUxVRSwgLTBmLCAwZiwgRmxvYXQuTUlOX1ZBTFVFLCAyZiwgRmxvYXQuTUFYX1ZBTFVFLApAQCAtMTYxLDYgKzIwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjZG91YmxlVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb3VibGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZG91YmxlVmFsdWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLkZsb2F0LmRvdWJsZVZhbHVlKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRvdWJsZSB2YWx1ZSByZXR1cm5lZCIsIE1hdGguYWJzKG5ldyBGbG9hdCg5OTk5OTkuOTk5ZikKQEAgLTE3MCw2ICsyMjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I2Zsb2F0VG9JbnRCaXRzKGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFRvSW50Qml0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mbG9hdFRvSW50Qml0c0YoKSB7CiAgICAgICAgIGZsb2F0IGYgPSA5ODc2LjIzNDVmOwogICAgICAgICBpbnQgYml0cyA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKGYpOwpAQCAtMTgwLDYgKzI0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjZmxvYXRUb1Jhd0ludEJpdHMoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYm91bmRhcnkgdmFsdWVzIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VG9SYXdJbnRCaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zsb2F0VG9SYXdJbnRCaXRzRigpIHsKICAgICAgICAgaW50IGkgPSAweDdmYzAwNGQyOwogICAgICAgICBmbG9hdCBmID0gRmxvYXQuaW50Qml0c1RvRmxvYXQoaSk7CkBAIC0xODksNiArMjU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNmbG9hdFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxvYXRWYWx1ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0IGphdmEubGFuZy5GbG9hdC5mbG9hdFZhbHVlKCkKICAgICAgICAgRmxvYXQgZiA9IG5ldyBGbG9hdCg4Ny42NTdmKTsKQEAgLTIwMSw2ICsyNzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBoYXNoIGNvZGVzIG9mIG5vbiBlcXVhbCBvYmplY3RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuRmxvYXQuaGFzaENvZGUoKQogICAgICAgICBGbG9hdCBmID0gbmV3IEZsb2F0KDE5MDguODc4NmYpOwpAQCAtMjE5LDYgKzMwNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjaW50Qml0c1RvRmxvYXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRCaXRzVG9GbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50Qml0c1RvRmxvYXRJKCkgewogICAgICAgICBmbG9hdCBmID0gOTg3Ni4yMzQ1ZjsKICAgICAgICAgaW50IGJpdHMgPSBGbG9hdC5mbG9hdFRvSW50Qml0cyhmKTsKQEAgLTIyOSw2ICszMjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I2ludFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ludFZhbHVlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5GbG9hdC5pbnRWYWx1ZSgpCiAgICAgICAgIEZsb2F0IGYgPSBuZXcgRmxvYXQoMC40Njg3NGYpOwpAQCAtMjM5LDYgKzM0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjaXNJbmZpbml0ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSW5maW5pdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSW5maW5pdGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5GbG9hdC5pc0luZmluaXRlKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5maW5pdHkgY2hlY2sgZmFpbGVkIiwKQEAgLTI1MCw2ICszNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I2lzSW5maW5pdGUoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSW5maW5pdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNJbmZpbml0ZUYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5GbG9hdC5pc0luZmluaXRlKGZsb2F0KQogCkBAIC0yNjAsNiArMzgzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNpc05hTigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTmFOIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc05hTigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLkZsb2F0LmlzTmFOKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTkFOIGNoZWNrIGZhaWxlZCIsIG5ldyBGbG9hdChGbG9hdC5OYU4pLmlzTmFOKCkKQEAgLTI2OSw2ICs0MDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I2lzTmFOKGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTmFOIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTmFORigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLkZsb2F0LmlzTmFOKGZsb2F0KQogICAgICAgICBhc3NlcnRUcnVlKCJOYU4gY2hlY2sgZmFpbGVkIiwgRmxvYXQuaXNOYU4oRmxvYXQuTmFOKSAmJiAhKEZsb2F0LmlzTmFOKDEyLjA5ZikpKTsKQEAgLTI3Nyw2ICs0MTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I2xvbmdWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvbmdWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9uZ1ZhbHVlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmxhbmcuRmxvYXQubG9uZ1ZhbHVlKCkKICAgICAgICAgRmxvYXQgZiA9IG5ldyBGbG9hdCgwLjQ2ODc0Zik7CkBAIC0yODcsNiArNDM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNwYXJzZUZsb2F0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYm91bmRhcnkgY2FzZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlRmxvYXRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZmxvYXQgcmV0dXJuZWQsIGV4cGVjdGVkIHplcm8uIiwgMC4wLCBGbG9hdAogICAgICAgICAgICAgICAgIC5wYXJzZUZsb2F0KCI3LjAwNjQ5MjMyMTYyNDA4NTM1NDYxODY0NzkxNjQ0OTVlLTQ2IiksIDAuMCk7CkBAIC00MDcsNiArNTY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNwYXJzZUZsb2F0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlRmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUZsb2F0X0xTdHJpbmdfVW51c3VhbCgpIHsKICAgICAgICAgZmxvYXQgYWN0dWFsOwogICAgICAgICAKQEAgLTQ1Myw2ICs2MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I3BhcnNlRmxvYXQoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBleHBvbmVudC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZUZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VGbG9hdF9MU3RyaW5nX05vcm1hbFBvc2l0aXZlRXhwb25lbnQoKSB7CiAgICAgICAgIGludFtdIGV4cGVjdGVkcyA9IHsKICAgICAgICAgICAgICAgICAweDM5OTFhMmI0LCAgICAgICAgICAgICAgICAweDQzY2MwMjQ3LCAgICAgICAgICAgICAgICAweDQ3OTA5MDA5LApAQCAtNDg2LDYgKzY2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjcGFyc2VGbG9hdChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG5lZ2F0aXZlIGV4cG9uZW50LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlRmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUZsb2F0X0xTdHJpbmdfTm9ybWFsTmVnYXRpdmVFeHBvbmVudCgpIHsKICAgICAgICAgaW50W10gZXhwZWN0ZWRzID0gewogICAgICAgICAgICAgICAgIDB4Mzk5MWEyYjQsCkBAIC01MzUsNiArNzIxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNwYXJzZUZsb2F0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWF4IGJvdW5kYXJ5IHZhbHVlLiAiICsKKyAgICAgICAgICAgICJEb2Vzbid0IHZlcmlmeSBOdW1iZXJGb3JtYXRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlRmxvYXRfTFN0cmluZ19NYXhOb3JtYWxCb3VuZGFyeSgpIHsKICAgICAgICAgaW50W10gZXhwZWN0ZWRzID17CiAgICAgICAgICAgICAgICAgMHg3ZjdmZmZmZiwKQEAgLTU4NSw2ICs3ODEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkZsb2F0I3BhcnNlRmxvYXQoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtaW4gYm91bmRhcnkgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlRmxvYXRfTFN0cmluZ19NaW5Ob3JtYWxCb3VuZGFyeSgpIHsKICAgICAgICAgaW50IGV4cGVjdGVkc1tdID0gewogICAgICAgICAgICAgICAgIDB4ODAwMDAwLApAQCAtNjM1LDYgKzg0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjcGFyc2VGbG9hdChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1heCBib3VuZGFyeSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZUZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VGbG9hdF9MU3RyaW5nX01heFN1Yk5vcm1hbEJvdW5kYXJ5KCkgewogICAgICAgICBpbnQgZXhwZWN0ZWRzW10gPSB7CiAgICAgICAgICAgICAgICAgMHg3ZmZmZmYsCkBAIC02ODUsNiArODk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNwYXJzZUZsb2F0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWluIGJvdW5kYXJ5IHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlRmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUZsb2F0X0xTdHJpbmdfTWluU3ViTm9ybWFsQm91bmRhcnkoKSB7CiAgICAgICAgIGludCBleHBlY3RlZHNbXSA9IHsKICAgICAgICAgICAgICAgICAweDEsCkBAIC03MzUsNiArOTU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNwYXJzZUZsb2F0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgemVybyBib3VuZGFyeSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZUZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VGbG9hdF9MU3RyaW5nX1plcm9Cb3VuZGFyeSgpIHsKICAgICAgICAgaW50IGV4cGVjdGVkc1tdID0gewogICAgICAgICAgICAgICAgIDB4MCwKQEAgLTc4NSw2ICsxMDE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNzaG9ydFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hvcnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2hvcnRWYWx1ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHNob3J0IGphdmEubGFuZy5GbG9hdC5zaG9ydFZhbHVlKCkKICAgICAgICAgRmxvYXQgZiA9IG5ldyBGbG9hdCgwLjQ2ODc0Zik7CkBAIC03OTYsNiArMTAzNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5GbG9hdC50b1N0cmluZygpCiAKQEAgLTgwNyw2ICsxMDU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCN0b1N0cmluZyhmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmdGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuRmxvYXQudG9TdHJpbmcoZmxvYXQpCiAKQEAgLTgyNyw2ICsxMDg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuRmxvYXQKICAgICAgICAgLy8gamF2YS5sYW5nLkZsb2F0LnZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykKQEAgLTkwNSw2ICsxMTczLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5GbG9hdCNjb21wYXJlVG8oamF2YS5sYW5nLkZsb2F0KQogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjY29tcGFyZShmbG9hdCwgZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuRmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvTGphdmFfbGFuZ19GbG9hdCgpIHsKICAgICAgICAgLy8gQSBzZWxlY3Rpb24gb2YgZmxvYXQgdmFsdWVzIGluIGFzY2VuZGluZyBvcmRlci4KICAgICAgICAgZmxvYXRbXSB2YWx1ZXMgPSBuZXcgZmxvYXRbXSB7IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZLCAtRmxvYXQuTUFYX1ZBTFVFLCAtMmYsCkBAIC05NDIsNiArMTIxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBGbG9hdCBmMSA9IG5ldyBGbG9hdCg4NzY1LjQzMjFmKTsKICAgICAgICAgRmxvYXQgZjIgPSBuZXcgRmxvYXQoODc2NS40MzIxZik7CkBAIC05NzAsNiArMTI1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjdG9IZXhTdHJpbmcoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvSGV4U3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvSGV4U3RyaW5nRigpIHsKICAgICAgICAgLy8gdGhlIGZvbGxvdyB2YWx1ZXMgY29tZXMgZnJvbSB0aGUgRmxvYXQgSmF2YWRvYy9TcGVjCiAgICAgICAgIGFzc2VydEVxdWFscygiMHgwLjBwMCIsIEZsb2F0LnRvSGV4U3RyaW5nKDAuMEYpKTsKQEAgLTEwMDIsNiArMTI5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuRmxvYXQjdmFsdWVPZihmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mRigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGbG9hdChGbG9hdC5NSU5fVkFMVUUpLCBGbG9hdC52YWx1ZU9mKEZsb2F0Lk1JTl9WQUxVRSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZsb2F0KEZsb2F0Lk1BWF9WQUxVRSksIEZsb2F0LnZhbHVlT2YoRmxvYXQuTUFYX1ZBTFVFKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0Vycm9yVGVzdC5qYXZhCmluZGV4IGRhNmFhOTIuLjk2ZWI3MGUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0Vycm9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0Vycm9yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSWxsZWdhbEFjY2Vzc0Vycm9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbGxlZ2FsQWNjZXNzRXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXJyb3IjSWxsZWdhbEFjY2Vzc0Vycm9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbEFjY2Vzc0Vycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgSWxsZWdhbEFjY2Vzc0Vycm9yIGUgPSBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFcnJvciNJbGxlZ2FsQWNjZXNzRXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbEFjY2Vzc0Vycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgSWxsZWdhbEFjY2Vzc0Vycm9yIGUgPSBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmMzEzYjY0Li5kZWE2Njk3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb24jSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUgPSBuZXcgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uI0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSA9IG5ldyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZTBiNWM3ZS4uNTNlNWZiMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDE1ICsxNywyOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiNJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNiw2ICs1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uI0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpAQCAtNDUsNiArNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiNJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLFRocm93YWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfVGhyb3dhYmxlKCkgewogICAgICAgICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKQEAgLTU3LDYgKzg5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSk7CiAgICAgfQpAQCAtNjQsNiArMTA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMzdjZTljMy4uY2Y3YWI5YyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uI0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBlID0gbmV3IElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiNJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIGUgPSBuZXcgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDU2MWFkNWIuLjUwZTZmNzUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxNSArMTcsMjkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24jSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzYsNiArNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiNJbGxlZ2FsU3RhdGVFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTQ1LDYgKzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CkBAIC01Myw2ICs4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDFkOWUxODguLjc1OTgyOTMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24jSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUgPSBuZXcgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLklsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiNJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUgPSBuZXcgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclRlc3QuamF2YQppbmRleCBmOTRkMGY2Li5lNzc1OWFlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IjSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGUgPSBuZXcgSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yI0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IgZSA9IG5ldyBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCBiZTQwNTMyLi45M2E1YzAwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24jSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUgPSBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uI0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSA9IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5oZXJpdGFibGVUaHJlYWRMb2NhbFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5oZXJpdGFibGVUaHJlYWRMb2NhbFRlc3QuamF2YQppbmRleCBlZTMzMWJkLi45OWZiYTM4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0luaGVyaXRhYmxlVGhyZWFkTG9jYWxUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Jbmhlcml0YWJsZVRocmVhZExvY2FsVGVzdC5qYXZhCkBAIC0xNywxOCArMTcsNDEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSW5oZXJpdGFibGVUaHJlYWRMb2NhbC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW5oZXJpdGFibGVUaHJlYWRMb2NhbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkluaGVyaXRhYmxlVGhyZWFkTG9jYWwjSW5oZXJpdGFibGVUaHJlYWRMb2NhbCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkluaGVyaXRhYmxlVGhyZWFkTG9jYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBJbmhlcml0YWJsZVRocmVhZExvY2FsPFN0cmluZz4gaXRsID0gbmV3IEluaGVyaXRhYmxlVGhyZWFkTG9jYWw8U3RyaW5nPigpOwogICAgICAgICBhc3NlcnROdWxsKGl0bC5nZXQoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0aWFsVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRpYWxWYWx1ZSgpIHsKICAgICAgICAgSW5oZXJpdGFibGVUaHJlYWRMb2NhbDxTdHJpbmc+IGl0bCA9IG5ldyBJbmhlcml0YWJsZVRocmVhZExvY2FsPFN0cmluZz4oKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5zdGFudGlhdGlvbkVycm9yVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnN0YW50aWF0aW9uRXJyb3JUZXN0LmphdmEKaW5kZXggOWVjMDNhYy4uNThkNjk5MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnN0YW50aWF0aW9uRXJyb3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnN0YW50aWF0aW9uRXJyb3JUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbnN0YW50aWF0aW9uRXJyb3IuY2xhc3MpIAogcHVibGljIGNsYXNzIEluc3RhbnRpYXRpb25FcnJvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkluc3RhbnRpYXRpb25FcnJvciNJbnN0YW50aWF0aW9uRXJyb3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnN0YW50aWF0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBJbnN0YW50aWF0aW9uRXJyb3IgZSA9IG5ldyBJbnN0YW50aWF0aW9uRXJyb3IoKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkVycm9yI0luc3RhbnRpYXRpb25FcnJvcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnN0YW50aWF0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBJbnN0YW50aWF0aW9uRXJyb3IgZSA9IG5ldyBJbnN0YW50aWF0aW9uRXJyb3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IGY4ZGQ5NDkuLjdlYzJkNTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW5zdGFudGlhdGlvbkV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbnN0YW50aWF0aW9uRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiNJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSA9IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb24jSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlID0gbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnRlZ2VyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnRlZ2VyVGVzdC5qYXZhCmluZGV4IGNiZGM5MTcuLjE3OWNhN2QgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW50ZWdlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0ludGVnZXJUZXN0LmphdmEKQEAgLTE2LDEwICsxNiwxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitAVGVzdFRhcmdldENsYXNzKEludGVnZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIEludGVnZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIHByaXZhdGUgUHJvcGVydGllcyBvcmdQcm9wczsKICAgICAKQEAgLTM2LDYgKzQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI2J5dGVWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJ5dGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYnl0ZVZhbHVlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBqYXZhLmxhbmcuSW50ZWdlci5ieXRlVmFsdWUoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBieXRlIHZhbHVlIiwgLTEsIG5ldyBJbnRlZ2VyKDY1NTM1KQpAQCAtNDcsNiArNjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjY29tcGFyZVRvKGphdmEubGFuZy5JbnRlZ2VyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvTGphdmFfbGFuZ19JbnRlZ2VyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5JbnRlZ2VyLmNvbXBhcmVUbyhqYXZhLmxhbmcuSW50ZWdlcikKICAgICAgICAgYXNzZXJ0VHJ1ZSgiLTIgY29tcGFyZWQgdG8gMSBnYXZlIG5vbi1uZWdhdGl2ZSBhbnN3ZXIiLCBuZXcgSW50ZWdlcigtMikKQEAgLTY2LDYgKzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI2RlY29kZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWNvZGVMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuSW50ZWdlcgogICAgICAgICAvLyBqYXZhLmxhbmcuSW50ZWdlci5kZWNvZGUoamF2YS5sYW5nLlN0cmluZykKQEAgLTE1MCw2ICsxODMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjZG91YmxlVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBpbnRlZ2VyJ3MgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kb3VibGVWYWx1ZTIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLkludGVnZXIuZG91YmxlVmFsdWUoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBkb3VibGUgdmFsdWUiLCAyMTQ3NDgzNjQ3LjAsIG5ldyBJbnRlZ2VyKDIxNDc0ODM2NDcpCkBAIC0xNjEsNiArMjAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdDIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5JbnRlZ2VyLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBJbnRlZ2VyIGkxID0gbmV3IEludGVnZXIoMTAwMCk7CkBAIC0xNzIsNiArMjIzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI2Zsb2F0VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zsb2F0VmFsdWUyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZmxvYXQgamF2YS5sYW5nLkludGVnZXIuZmxvYXRWYWx1ZSgpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBmbG9hdCB2YWx1ZSIsIG5ldyBJbnRlZ2VyKDY1NTM1KQpAQCAtMTgzLDYgKzI0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNnZXRJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnRlZ2VyTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuSW50ZWdlcgogICAgICAgICAvLyBqYXZhLmxhbmcuSW50ZWdlci5nZXRJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcpCkBAIC0xOTgsNiArMjY3LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI2dldEludGVnZXIoamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGNhc2Ugd2hlbiBwcm9wZXJ0eSBjb250YWlucyBpbGxlZ2FsIG51bWVyaWMgIiArCisgICAgICAgICAgICAiZm9ybWF0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludGVnZXJMamF2YV9sYW5nX1N0cmluZ0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuSW50ZWdlcgogICAgICAgICAvLyBqYXZhLmxhbmcuSW50ZWdlci5nZXRJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcsIGludCkKQEAgLTIxMyw2ICsyOTIsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjZ2V0SW50ZWdlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBjYXNlIHdoZW4gcHJvcGVydHkgY29udGFpbnMgaWxsZWdhbCBudW1lcmljICIgKworICAgICAgICAgICAgImZvcm1hdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnRlZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludGVnZXJMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfSW50ZWdlcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5JbnRlZ2VyCiAgICAgICAgIC8vIGphdmEubGFuZy5JbnRlZ2VyLmdldEludGVnZXIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIpCkBAIC0yMjgsNiArMzE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuSW50ZWdlci5oYXNoQ29kZSgpCiAKQEAgLTI0MCw2ICszMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjaW50VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBvbmUgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ludFZhbHVlMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuSW50ZWdlci5pbnRWYWx1ZSgpCiAKQEAgLTI1MCw2ICszNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjbG9uZ1ZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3Mgb25lIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvbmdWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9uZ1ZhbHVlMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5sYW5nLkludGVnZXIubG9uZ1ZhbHVlKCkKICAgICAgICAgSW50ZWdlciBpID0gbmV3IEludGVnZXIoODkwMCk7CkBAIC0yNTksNiArMzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI3BhcnNlSW50KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUludExqYXZhX2xhbmdfU3RyaW5nMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuSW50ZWdlci5wYXJzZUludChqYXZhLmxhbmcuU3RyaW5nKQogCkBAIC0zMDEsNiArNDI2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI3BhcnNlSW50KGphdmEubGFuZy5TdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlSW50TGphdmFfbGFuZ19TdHJpbmdJMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuSW50ZWdlci5wYXJzZUludChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICAgIGFzc2VydEVxdWFscygiUGFyc2VkIGRlYyB2YWwgaW5jb3JyZWN0bHkiLApAQCAtMzgyLDYgKzUxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNzaG9ydFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3Mgb25lIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Nob3J0VmFsdWUyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgc2hvcnQgamF2YS5sYW5nLkludGVnZXIuc2hvcnRWYWx1ZSgpCiAgICAgICAgIEludGVnZXIgaSA9IG5ldyBJbnRlZ2VyKDIxNDc0NTA4ODApOwpAQCAtMzkxLDYgKzUzNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciN0b0JpbmFyeVN0cmluZyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvQmluYXJ5U3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0JpbmFyeVN0cmluZ0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEubGFuZy5JbnRlZ2VyLnRvQmluYXJ5U3RyaW5nKGludCkKQEAgLTQwMyw2ICs1NTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjdG9IZXhTdHJpbmcoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0hleFN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9IZXhTdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuSW50ZWdlci50b0hleFN0cmluZyhpbnQpCiAKQEAgLTQyNSw2ICs1ODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjdG9PY3RhbFN0cmluZyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvT2N0YWxTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvT2N0YWxTdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuSW50ZWdlci50b09jdGFsU3RyaW5nKGludCkKICAgICAgICAgLy8gU3BlYyBzdGF0ZXMgdGhhdCB0aGUgaW50IGFyZyBpcyB0cmVhdGVkIGFzIHVuc2lnbmVkCkBAIC00MzcsNiArNjA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3Mgb25lIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5JbnRlZ2VyLnRvU3RyaW5nKCkKIApAQCAtNDQ4LDYgKzYyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciN0b1N0cmluZyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZ0kyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuSW50ZWdlci50b1N0cmluZyhpbnQpCiAKQEAgLTQ2NCw2ICs2NTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjdG9TdHJpbmcoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5JbnRlZ2VyLnRvU3RyaW5nKGludCwgaW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBvY3RhbCBzdHJpbmciLCAiMTc3Nzc3Nzc3NzciLCBJbnRlZ2VyLnRvU3RyaW5nKApAQCAtNTAyLDYgKzY5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkludGVnZXIKICAgICAgICAgLy8gamF2YS5sYW5nLkludGVnZXIudmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKQpAQCAtNTM0LDYgKzc0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZ0kyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkludGVnZXIKICAgICAgICAgLy8gamF2YS5sYW5nLkludGVnZXIudmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCkBAIC02MTIsNiArODI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI3ZhbHVlT2YoYnl0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkkoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihJbnRlZ2VyLk1JTl9WQUxVRSksIEludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1JTl9WQUxVRSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoSW50ZWdlci5NQVhfVkFMVUUpLCBJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpKTsKQEAgLTYyOCw2ICs4NTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXcgSW50ZWdlcigxKS5oYXNoQ29kZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5ldyBJbnRlZ2VyKDIpLmhhc2hDb2RlKCkpOwpAQCAtNjM4LDYgKzg3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNJbnRlZ2VyKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW50ZWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoIjAiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoIjEiKSk7CkBAIC02NjcsNiArOTA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI0ludGVnZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW50ZWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3IEludGVnZXIoMSkuaW50VmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCBuZXcgSW50ZWdlcigyKS5pbnRWYWx1ZSgpKTsKQEAgLTY4MCw2ICs5MzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjYnl0ZVZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ib29sZWFuVmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXcgSW50ZWdlcigxKS5ieXRlVmFsdWUoKSk7ICAgIAogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmV3IEludGVnZXIoMikuYnl0ZVZhbHVlKCkpOwpAQCAtNjkwLDYgKzk1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNlcXVhbHMoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCBJbnRlZ2VyLnZhbHVlT2YoMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIEludGVnZXIudmFsdWVPZigxKSk7CkBAIC03MDQsNiArOTczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIi0xIiwgbmV3IEludGVnZXIoLTEpLnRvU3RyaW5nKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjAiLCBuZXcgSW50ZWdlcigwKS50b1N0cmluZygpKTsKQEAgLTcxNCw2ICs5OTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjdG9TdHJpbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCItMSIsIEludGVnZXIudG9TdHJpbmcoLTEpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgSW50ZWdlci50b1N0cmluZygwKSk7CkBAIC03MjQsNiArMTAxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciN2YWx1ZU9mKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIEludGVnZXIudmFsdWVPZigiMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCBJbnRlZ2VyLnZhbHVlT2YoIjEiKSk7CkBAIC03NTMsNiArMTA0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciN2YWx1ZU9mKFN0cmluZyxpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCBJbnRlZ2VyLnZhbHVlT2YoIjAiLCAxMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIEludGVnZXIudmFsdWVPZigiMSIsIDEwKSk7CkBAIC03ODYsNiArMTA5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNwYXJzZUludChTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUludExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgSW50ZWdlci5wYXJzZUludCgiMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEludGVnZXIucGFyc2VJbnQoIjEiKSk7CkBAIC04MTUsNiArMTEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNwYXJzZUludChTdHJpbmcsaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZUludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VJbnRMamF2YV9sYW5nX1N0cmluZ0koKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBJbnRlZ2VyLnBhcnNlSW50KCIwIiwgMTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEludGVnZXIucGFyc2VJbnQoIjEiLCAxMCkpOwpAQCAtODQ4LDYgKzExNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjZGVjb2RlKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVjb2RlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgSW50ZWdlci5kZWNvZGUoIjAiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxKSwgSW50ZWdlci5kZWNvZGUoIjEiKSk7CkBAIC04NzcsNiArMTIwOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNkb3VibGVWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyaWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kb3VibGVWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xRCwgbmV3IEludGVnZXIoLTEpLmRvdWJsZVZhbHVlKCksIDBEKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDBELCBuZXcgSW50ZWdlcigwKS5kb3VibGVWYWx1ZSgpLCAwRCk7CkBAIC04ODYsNiArMTIyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNmbG9hdFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mbG9hdFZhbHVlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoLTFGLCBuZXcgSW50ZWdlcigtMSkuZmxvYXRWYWx1ZSgpLCAwRik7CiAgICAgICAgIGFzc2VydEVxdWFscygwRiwgbmV3IEludGVnZXIoMCkuZmxvYXRWYWx1ZSgpLCAwRik7CkBAIC04OTUsNiArMTI0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNpbnRWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGVyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ludFZhbHVlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5ldyBJbnRlZ2VyKC0xKS5pbnRWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5ldyBJbnRlZ2VyKDApLmludFZhbHVlKCkpOwpAQCAtOTA0LDYgKzEyNjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjbG9uZ1ZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvbmdWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xTCwgbmV3IEludGVnZXIoLTEpLmxvbmdWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBuZXcgSW50ZWdlcigwKS5sb25nVmFsdWUoKSk7CkBAIC05MTMsNiArMTI4MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNzaG9ydFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Nob3J0VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgbmV3IEludGVnZXIoLTEpLnNob3J0VmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBuZXcgSW50ZWdlcigwKS5zaG9ydFZhbHVlKCkpOwpAQCAtOTIxLDYgKzEyOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjaGlnaGVzdE9uZUJpdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhpZ2hlc3RPbmVCaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hpZ2hlc3RPbmVCaXRJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMHgwOCwgSW50ZWdlci5oaWdoZXN0T25lQml0KDB4MEEpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MDgsIEludGVnZXIuaGlnaGVzdE9uZUJpdCgweDBCKSk7CkBAIC05NDEsNiArMTMyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNsb3dlc3RPbmVCaXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb3dlc3RPbmVCaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvd2VzdE9uZUJpdEkoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygweDEwLCBJbnRlZ2VyLmxvd2VzdE9uZUJpdCgweEYwKSk7CiAgICAgICAgIApAQCAtOTY5LDYgKzEzNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjbnVtYmVyT2ZMZWFkaW5nWmVyb3MoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJudW1iZXJPZkxlYWRpbmdaZXJvcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbnVtYmVyT2ZMZWFkaW5nWmVyb3NJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMzIsIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MoMHgwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygzMSwgSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcygweDEpKTsKQEAgLTEwMTMsOCArMTQxNywxOCBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjbnVtYmVyT2ZUcmFpbGluZ1plcm9zKGludCkKKyAgICAgKiBAdGVzdHMgCisgICAgICogamF2YS5sYW5nLkludGVnZXIjbnVtYmVyT2ZUcmFpbGluZ1plcm9zKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibnVtYmVyT2ZUcmFpbGluZ1plcm9zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9udW1iZXJPZlRyYWlsaW5nWmVyb3NJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMzIsIEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKDB4MCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMzEsIEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKEludGVnZXIuTUlOX1ZBTFVFKSk7CkBAIC0xMDU2LDYgKzE0NzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjYml0Q291bnQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaXRDb3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYml0Q291bnRJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgSW50ZWdlci5iaXRDb3VudCgweDApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEludGVnZXIuYml0Q291bnQoMHgxKSk7CkBAIC0xMDg2LDYgKzE1MDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjcm90YXRlTGVmdChpbnQsaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb3RhdGVMZWZ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JvdGF0ZUxlZnRJSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4RiwgSW50ZWdlci5yb3RhdGVMZWZ0KDB4RiwgMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMHhGMCwgSW50ZWdlci5yb3RhdGVMZWZ0KDB4RiwgNCkpOwpAQCAtMTEwMSw2ICsxNTMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI3JvdGF0ZVJpZ2h0KGludCxpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJvdGF0ZVJpZ2h0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JvdGF0ZVJpZ2h0SUkoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygweEYsIEludGVnZXIucm90YXRlUmlnaHQoMHhGMCwgNCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMHhGLCBJbnRlZ2VyLnJvdGF0ZVJpZ2h0KDB4RjAwLCA4KSk7CkBAIC0xMTE3LDYgKzE1NTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkludGVnZXIjcmV2ZXJzZUJ5dGVzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmV2ZXJzZUJ5dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXZlcnNlQnl0ZXNJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMHhBQUJCQ0NERCwgSW50ZWdlci5yZXZlcnNlQnl0ZXMoMHhERENDQkJBQSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMHgxMTIyMzM0NCwgSW50ZWdlci5yZXZlcnNlQnl0ZXMoMHg0NDMzMjIxMSkpOwpAQCAtMTEyNyw2ICsxNTc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlZ2VyI3JldmVyc2UoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXZlcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXZlcnNlSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBJbnRlZ2VyLnJldmVyc2UoLTEpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4ODAwMDAwMDAsSW50ZWdlci5yZXZlcnNlKDEpKTsKQEAgLTExMzUsNiArMTU5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZWdlciNzaWdudW0oaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaWdudW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpZ251bUkoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAtMTI4OyBpPDA7IGkrKykgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBJbnRlZ2VyLnNpZ251bShpKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0ludGVybmFsRXJyb3JUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0ludGVybmFsRXJyb3JUZXN0LmphdmEKaW5kZXggNjUzYzAwMC4uNjhiYzMzZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnRlcm5hbEVycm9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW50ZXJuYWxFcnJvclRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEludGVybmFsRXJyb3IuY2xhc3MpIAogcHVibGljIGNsYXNzIEludGVybmFsRXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlcm5hbEVycm9yI0ludGVybmFsRXJyb3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnRlcm5hbEVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgSW50ZXJuYWxFcnJvciBlID0gbmV3IEludGVybmFsRXJyb3IoKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW50ZXJuYWxFcnJvciNJbnRlcm5hbEVycm9yKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludGVybmFsRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBJbnRlcm5hbEVycm9yIGUgPSBuZXcgSW50ZXJuYWxFcnJvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA4ZDA1MTE0Li5jMjk0ZDlkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbnRlcnJ1cHRlZEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW50ZXJydXB0ZWRFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiNJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludGVycnVwdGVkRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSA9IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiNJbnRlcnJ1cHRlZEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIGUgPSBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9MaW5rYWdlRXJyb3JUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0xpbmthZ2VFcnJvclRlc3QuamF2YQppbmRleCAwYjBlZmE0Li45YmY4NWUyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0xpbmthZ2VFcnJvclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0xpbmthZ2VFcnJvclRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKExpbmthZ2VFcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTGlua2FnZUVycm9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTGlua2FnZUVycm9yI0xpbmthZ2VFcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxpbmthZ2VFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIExpbmthZ2VFcnJvciBlID0gbmV3IExpbmthZ2VFcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5MaW5rYWdlRXJyb3IjTGlua2FnZUVycm9yKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxpbmthZ2VFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIExpbmthZ2VFcnJvciBlID0gbmV3IExpbmthZ2VFcnJvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0xvbmdUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL0xvbmdUZXN0LmphdmEKaW5kZXggNjg2ZTg1Ny4uYTM3MjNiZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Mb25nVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTG9uZ1Rlc3QuamF2YQpAQCAtMTYsMTAgKzE2LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoTG9uZy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTG9uZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIG9yZ1Byb3BzOwogICAgIApAQCAtMzYsNiArNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjYnl0ZVZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgYm91bmFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ieXRlVmFsdWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBieXRlIGphdmEubGFuZy5Mb25nLmJ5dGVWYWx1ZSgpCiAgICAgICAgIExvbmcgbCA9IG5ldyBMb25nKDEyNyk7CkBAIC00Nyw2ICs2MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNjb21wYXJlVG8oamF2YS5sYW5nLkxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuTG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9sYW5nX0xvbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLkxvbmcuY29tcGFyZVRvKGphdmEubGFuZy5Mb25nKQogICAgICAgICBhc3NlcnRUcnVlKCItMiBjb21wYXJlZCB0byAxIGdhdmUgbm9uLW5lZ2F0aXZlIGFuc3dlciIsIG5ldyBMb25nKC0yTCkKQEAgLTY2LDYgKzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2RlY29kZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWNvZGVMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuTG9uZwogICAgICAgICAvLyBqYXZhLmxhbmcuTG9uZy5kZWNvZGUoamF2YS5sYW5nLlN0cmluZykKQEAgLTE1Miw2ICsxODUsMTYgQEAKICAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2dldExvbmcoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGNhc2Ugd2hlbiBwcm9wZXJ0eSBjb250YWlucyBpbGxlZ2FsIHZhbHVlIGFuZCAiICsKKyAgICAgICAgICAgICJudWxsIGlzIHJldHVybmVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb25nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuTG9uZwogICAgICAgICAvLyBqYXZhLmxhbmcuTG9uZy5nZXRMb25nKGphdmEubGFuZy5TdHJpbmcpCkBAIC0xNjcsNiArMjEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2dldExvbmcoamF2YS5sYW5nLlN0cmluZywgbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGNhc2Ugd2hlbiBwcm9wZXJ0eSBjb250YWlucyBpbGxlZ2FsIHZhbHVlIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExvbmdMamF2YV9sYW5nX1N0cmluZ0ooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuTG9uZwogICAgICAgICAvLyBqYXZhLmxhbmcuTG9uZy5nZXRMb25nKGphdmEubGFuZy5TdHJpbmcsIGxvbmcpCkBAIC0xODIsNiArMjM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2dldExvbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBjYXNlIHdoZW4gcHJvcGVydHkgY29udGFpbnMgaWxsZWdhbCB2YWx1ZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLkxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9uZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19Mb25nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkxvbmcKICAgICAgICAgLy8gamF2YS5sYW5nLkxvbmcuZ2V0TG9uZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuTG9uZykKQEAgLTE5Nyw2ICsyNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjcGFyc2VMb25nKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGJvdW5kYXJ5IHZhbHVlcyBhbmQgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZUxvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUxvbmdMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEubGFuZy5Mb25nLnBhcnNlTG9uZyhqYXZhLmxhbmcuU3RyaW5nKQogCkBAIC0yMzAsNiArMzAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3BhcnNlTG9uZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlTG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMb25nTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmxhbmcuTG9uZy5wYXJzZUxvbmcoamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCB2YWx1ZSIsCkBAIC0zMTQsNiArMzkzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3RvQmluYXJ5U3RyaW5nKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvQmluYXJ5U3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9CaW5hcnlTdHJpbmdKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuTG9uZy50b0JpbmFyeVN0cmluZyhsb25nKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBiaW5hcnkgc3RyaW5nIHJldHVybmVkIiwgIjExMDExMDAxMDEwMDEwMDEwMDAwIiwgTG9uZy50b0JpbmFyeVN0cmluZygKQEAgLTMzMyw2ICs0MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjdG9IZXhTdHJpbmcobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9IZXhTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0hleFN0cmluZ0ooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5Mb25nLnRvSGV4U3RyaW5nKGxvbmcpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGhleCBzdHJpbmcgcmV0dXJuZWQiLCAiNTRlMDg0NSIsIExvbmcudG9IZXhTdHJpbmcoODkwMDAwMDVMKQpAQCAtMzQ2LDYgKzQ0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyN0b09jdGFsU3RyaW5nKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvT2N0YWxTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b09jdGFsU3RyaW5nSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLkxvbmcudG9PY3RhbFN0cmluZyhsb25nKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBvY3Qgc3RyaW5nIiwgIjc3Nzc3Nzc3Nzc3IiwgTG9uZy50b09jdGFsU3RyaW5nKApAQCAtMzU5LDYgKzQ2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5Mb25nLnRvU3RyaW5nKCkKICAgICAgICAgTG9uZyBsID0gbmV3IExvbmcoODkwMDAwMDAwMDVMKTsKQEAgLTM3Myw2ICs0ODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjdG9TdHJpbmcobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZ0oyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuTG9uZy50b1N0cmluZyhsb25nKQogCkBAIC0zODcsNiArNTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3RvU3RyaW5nKGxvbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nSkkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5Mb25nLnRvU3RyaW5nKGxvbmcsIGludCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgZGVjIHN0cmluZyIsICIxMDAwMDAwMDAiLCBMb25nLnRvU3RyaW5nKDEwMDAwMDAwMEwsCkBAIC00MTEsNiArNTQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuTG9uZwogICAgICAgICAvLyBqYXZhLmxhbmcuTG9uZy52YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpCkBAIC00NTYsNiArNTk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkxvbmcKICAgICAgICAgLy8gamF2YS5sYW5nLkxvbmcudmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCkBAIC01MDgsNiArNjU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3ZhbHVlT2YobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZKKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoTG9uZy5NSU5fVkFMVUUpLCBMb25nLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKExvbmcuTUFYX1ZBTFVFKSwgTG9uZy52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKSk7CkBAIC01MjQsNiArNjg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoKGludCkoMUwgXiAoMUwgPj4+IDMyKSksIG5ldyBMb25nKDEpLmhhc2hDb2RlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoKGludCkoMkwgXiAoMkwgPj4+IDMyKSksIG5ldyBMb25nKDIpLmhhc2hDb2RlKCkpOwpAQCAtNTM0LDYgKzcwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNMb25nKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygwKSwgbmV3IExvbmcoIjAiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygxKSwgbmV3IExvbmcoIjEiKSk7CkBAIC01NjMsNiArNzQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI0xvbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5ldyBMb25nKDEpLmludFZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmV3IExvbmcoMikuaW50VmFsdWUoKSk7CkBAIC01NzMsNyArNzYwLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2J5dGVWYWx1ZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9ib29sZWFuVmFsdWUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9ieXRlVmFsdWUyKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3IExvbmcoMSkuYnl0ZVZhbHVlKCkpOyAgICAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5ldyBMb25nKDIpLmJ5dGVWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5ldyBMb25nKDApLmJ5dGVWYWx1ZSgpKTsKQEAgLTU4Myw2ICs3NzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjZXF1YWxzKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygwKSwgTG9uZy52YWx1ZU9mKDApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDEpLCBMb25nLnZhbHVlT2YoMSkpOwpAQCAtNTk3LDYgKzgwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCItMSIsIG5ldyBMb25nKC0xKS50b1N0cmluZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgbmV3IExvbmcoMCkudG9TdHJpbmcoKSk7CkBAIC02MDcsNiArODIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3RvU3RyaW5nCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmdKKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIi0xIiwgTG9uZy50b1N0cmluZygtMSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjAiLCBMb25nLnRvU3RyaW5nKDApKTsKQEAgLTYxNyw2ICs4NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjdmFsdWVPZihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygwKSwgTG9uZy52YWx1ZU9mKCIwIikpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoMSksIExvbmcudmFsdWVPZigiMSIpKTsKQEAgLTY0Niw2ICs4NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjdmFsdWVPZihTdHJpbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nSigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDApLCBMb25nLnZhbHVlT2YoIjAiLCAxMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoMSksIExvbmcudmFsdWVPZigiMSIsIDEwKSk7CkBAIC02NzksNiArOTIwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI3BhcnNlTG9uZyhTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMb25nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBMb25nLnBhcnNlTG9uZygiMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIExvbmcucGFyc2VMb25nKCIxIikpOwpAQCAtNzA4LDYgKzk1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNwYXJzZUxvbmcoU3RyaW5nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUxvbmdMamF2YV9sYW5nX1N0cmluZ0ooKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBMb25nLnBhcnNlTG9uZygiMCIsIDEwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBMb25nLnBhcnNlTG9uZygiMSIsIDEwKSk7CkBAIC03NDEsNiArMTAwMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNkZWNvZGUoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWNvZGVMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDApLCBMb25nLmRlY29kZSgiMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDEpLCBMb25nLmRlY29kZSgiMSIpKTsKQEAgLTc3MCw2ICsxMDM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2RvdWJsZVZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RvdWJsZVZhbHVlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoLTFELCBuZXcgTG9uZygtMSkuZG91YmxlVmFsdWUoKSwgMEQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMEQsIG5ldyBMb25nKDApLmRvdWJsZVZhbHVlKCksIDBEKTsKQEAgLTc3OSw2ICsxMDU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2Zsb2F0VmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zsb2F0VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMUYsIG5ldyBMb25nKC0xKS5mbG9hdFZhbHVlKCksIDBGKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDBGLCBuZXcgTG9uZygwKS5mbG9hdFZhbHVlKCksIDBGKTsKQEAgLTc4OCw2ICsxMDc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI2ludFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgbmV3IExvbmcoLTEpLmludFZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IExvbmcoMCkuaW50VmFsdWUoKSk7CkBAIC03OTcsNiArMTA5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNsb25nVmFsdWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3RjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb25nVmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMUwsIG5ldyBMb25nKC0xKS5sb25nVmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwTCwgbmV3IExvbmcoMCkubG9uZ1ZhbHVlKCkpOwpAQCAtODA2LDYgKzExMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjc2hvcnRWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hvcnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2hvcnRWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBuZXcgTG9uZygtMSkuc2hvcnRWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5ldyBMb25nKDApLnNob3J0VmFsdWUoKSk7CkBAIC04MTQsNiArMTEyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNoaWdoZXN0T25lQml0KGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhpZ2hlc3RPbmVCaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oaWdoZXN0T25lQml0SigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MDgsIExvbmcuaGlnaGVzdE9uZUJpdCgweDBBKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygweDA4LCBMb25nLmhpZ2hlc3RPbmVCaXQoMHgwQikpOwpAQCAtODM0LDYgKzExNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjbG93ZXN0T25lQml0KGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvd2VzdE9uZUJpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvd2VzdE9uZUJpdEooKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygweDEwLCBMb25nLmxvd2VzdE9uZUJpdCgweEYwKSk7CiAgICAgICAgIApAQCAtODYyLDYgKzExOTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjbnVtYmVyT2ZMZWFkaW5nWmVyb3MobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibnVtYmVyT2ZMZWFkaW5nWmVyb3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9udW1iZXJPZkxlYWRpbmdaZXJvc0ooKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyg2NCwgTG9uZy5udW1iZXJPZkxlYWRpbmdaZXJvcygweDBMKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyg2MywgTG9uZy5udW1iZXJPZkxlYWRpbmdaZXJvcygweDEpKTsKQEAgLTkwOCw2ICsxMjQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Mb25nI251bWJlck9mVHJhaWxpbmdaZXJvcyhsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJudW1iZXJPZlRyYWlsaW5nWmVyb3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9udW1iZXJPZlRyYWlsaW5nWmVyb3NKKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoNjQsIExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zKDB4MCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoNjMsIExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zKExvbmcuTUlOX1ZBTFVFKSk7CkBAIC05NDksNiArMTI5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNiaXRDb3VudChsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaXRDb3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2JpdENvdW50SigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIExvbmcuYml0Q291bnQoMHgwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBMb25nLmJpdENvdW50KDB4MSkpOwpAQCAtOTc5LDYgKzEzMzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjcm90YXRlTGVmdChsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJvdGF0ZUxlZnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JvdGF0ZUxlZnRKSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4RiwgTG9uZy5yb3RhdGVMZWZ0KDB4RiwgMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMHhGMCwgTG9uZy5yb3RhdGVMZWZ0KDB4RiwgNCkpOwpAQCAtOTk0LDYgKzEzNjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjcm90YXRlUmlnaHQobG9uZyxsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb3RhdGVSaWdodCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfcm90YXRlUmlnaHRKSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4RiwgTG9uZy5yb3RhdGVSaWdodCgweEYwLCA0KSk7CiAgICAgICAgIGFzc2VydEVxdWFscygweEYsIExvbmcucm90YXRlUmlnaHQoMHhGMDAsIDgpKTsKQEAgLTEwMTAsNiArMTM4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNyZXZlcnNlQnl0ZXMobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmV2ZXJzZUJ5dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmV2ZXJzZUJ5dGVzSigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QUFCQkNDREQwMDExMjIzM0wsIExvbmcucmV2ZXJzZUJ5dGVzKDB4MzMyMjExMDBERENDQkJBQUwpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MTEyMjMzNDQ1NTY2Nzc4OEwsIExvbmcucmV2ZXJzZUJ5dGVzKDB4ODg3NzY2NTU0NDMzMjIxMUwpKTsKQEAgLTEwMjAsNiArMTQwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTG9uZyNyZXZlcnNlKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJldmVyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXZlcnNlSigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIExvbmcucmV2ZXJzZSgwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgTG9uZy5yZXZlcnNlKC0xKSk7CkBAIC0xMDI5LDYgKzE0MjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLkxvbmcjc2lnbnVtKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpZ251bSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpZ251bUooKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAtMTI4OyBpPDA7IGkrKykgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBMb25nLnNpZ251bShpKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL01hdGhUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL01hdGhUZXN0LmphdmEKaW5kZXggMDM4ZTc0Mi4uMzdkNGVhOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9NYXRoVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTWF0aFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoTWF0aC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTWF0aFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgZG91YmxlIEhZUCA9IE1hdGguc3FydCgyLjApOwpAQCAtNDUsOSArNTEsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjYWJzKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Fic0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLk1hdGguYWJzKGRvdWJsZSkKLQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZG91YmxlIGFicyB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgKE1hdGguYWJzKC0xOTA4Ljg5NzYpID09IDE5MDguODk3NikpOwogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZG91YmxlIGFicyB2YWx1ZSIsCkBAIC01Nyw2ICs3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNhYnMoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Fic0YoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBmbG9hdCBqYXZhLmxhbmcuTWF0aC5hYnMoZmxvYXQpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBmbG9hdCBhYnMgdmFsdWUiLApAQCAtNjgsNiArOTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjYWJzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Fic0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLk1hdGguYWJzKGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGludCBhYnMgdmFsdWUiLCAoTWF0aC5hYnMoLTE5MDg4OTcpID09IDE5MDg4OTcpKTsKQEAgLTc3LDYgKzEwOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNhYnMobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hYnNKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmxhbmcuTWF0aC5hYnMobG9uZykKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGxvbmcgYWJzIHZhbHVlIiwKQEAgLTg4LDYgKzEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNhY29zKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIE5hTiwgYW5kIGdyZWF0ZXIgdGhhbiAxLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFjb3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Fjb3NEKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLmFjb3MoZG91YmxlKQogICAgICAgICBkb3VibGUgciA9IE1hdGguY29zKE1hdGguYWNvcyhBREogLyBIWVApKTsKQEAgLTEwMCw2ICsxNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjYXNpbihkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBOYU4sIGFuZCBncmVhdGVyIHRoYW4gMSwgYW5kIHplcm8uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNpbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXNpbkQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLk1hdGguYXNpbihkb3VibGUpCiAgICAgICAgIGRvdWJsZSByID0gTWF0aC5zaW4oTWF0aC5hc2luKE9QUCAvIEhZUCkpOwpAQCAtMTEyLDYgKzE3MSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNhdGFuKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlczogTmFOIGFuZCB6ZXJvIGFjY29yZGluZyB0byAiICsKKyAgICAgICAgICAgICJzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImF0YW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2F0YW5EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLmF0YW4oZG91YmxlKQogICAgICAgICBkb3VibGUgYW5zd2VyID0gTWF0aC50YW4oTWF0aC5hdGFuKDEuMCkpOwpAQCAtMTIyLDYgKzE5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNhdGFuMihkb3VibGUsIGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdGFuMiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hdGFuMkREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLmF0YW4yKGRvdWJsZSwgZG91YmxlKQogICAgICAgICBkb3VibGUgYW5zd2VyID0gTWF0aC5hdGFuKE1hdGgudGFuKDEuMCkpOwpAQCAtMTMyLDYgKzIxMCwxNSBAQAogICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjY2JydChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNicnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NicnRfRCgpIHsKICAgICAgICAgLy9UZXN0IGZvciBzcGVjaWFsIHNpdHVhdGlvbnMKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIHJldHVybiBEb3VibGUuTmFOIiwgRG91YmxlLmlzTmFOKE1hdGgKQEAgLTE2Nyw2ICsyNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjY2VpbChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2VpbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2VpbEQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLk1hdGguY2VpbChkb3VibGUpCiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY2VpbGluZyBmb3IgZG91YmxlIiwKQEAgLTE3OCw2ICsyNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjY29zKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nvc0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLk1hdGguY29zKGRvdWJsZSkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYW5zd2VyIiwgMS4wLCBNYXRoLmNvcygwKSwgMEQpOwpAQCAtMTg3LDYgKzI5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNjb3NoKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29zaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29zaF9EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIHNpdHVhdGlvbnMKICAgICAgICAgYXNzZXJ0VHJ1ZShEb3VibGUuaXNOYU4oTWF0aC5jb3NoKERvdWJsZS5OYU4pKSk7CkBAIC0yMTYsNiArMzMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI2V4cChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9leHBEKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLmV4cChkb3VibGUpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBhbnN3ZXIgcmV0dXJuZWQgZm9yIHNpbXBsZSBwb3dlciIsIE1hdGguYWJzKE1hdGgKQEAgLTIyOCw2ICszNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjZXhwbTEoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleHBtMSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXhwbTFfRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3Igc3BlY2lhbCBjYXNlcwogICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgcmV0dXJuIE5hTiIsIERvdWJsZS5pc05hTihNYXRoLmV4cG0xKERvdWJsZS5OYU4pKSk7CkBAIC0yNTgsNiArMzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI2Zsb29yKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9vciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxvb3JEKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLmZsb29yKGRvdWJsZSkKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBmbG9vciBmb3IgZG91YmxlIiwKQEAgLTI2OSw2ICs0MTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjaHlwb3QoZG91YmxlLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaHlwb3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzLCBkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaHlwb3RfREQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIHNwZWNpYWwgY2FzZXMKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgcmV0dXJuIFBPU0lUSVZFX0lORklOSVRZIiwKQEAgLTMwNyw2ICs0NTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjSUVFRXJlbWFpbmRlcihkb3VibGUsIGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJRUVFcmVtYWluZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0lFRUVyZW1haW5kZXJERCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuTWF0aC5JRUVFcmVtYWluZGVyKGRvdWJsZSwgZG91YmxlKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCByZW1haW5kZXIgcmV0dXJuZWQiLApAQCAtMzE5LDYgKzQ3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNsb2coZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvZ0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLk1hdGgubG9nKGRvdWJsZSkKICAgICAgICAgZm9yIChkb3VibGUgZCA9IDEwOyBkID49IC0xMDsgZCAtPSAwLjUpIHsKQEAgLTMzMiw2ICs1MDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjbG9nMTAoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2cxMCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9nMTBfRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3Igc3BlY2lhbCBjYXNlcwpAQCAtMzU1LDYgKzUzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNsb2cxcChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvZzFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb2cxcF9EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIGNhc2VzCiAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCByZXR1cm4gTmFOIiwgRG91YmxlLmlzTmFOKE1hdGgubG9nMXAoRG91YmxlLk5hTikpKTsKQEAgLTM4Myw2ICs1NjksMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjbWF4KGRvdWJsZSwgZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uOiAiICsKKyAgICAgICAgICAgICJOYU4sICsvLTAgLi4uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21heEREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLm1heChkb3VibGUsIGRvdWJsZSkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG91YmxlIG1heCB2YWx1ZSIsIDE5MDg4OTcuNjAwMDA4OSwgTWF0aC5tYXgoLTE5MDg4OTcuNjAwMDA4OSwKQEAgLTM5Nyw2ICs1OTMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjbWF4KGZsb2F0LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbjogIiArIAorICAgICAgICAgICAgIk5hTiwgKy8tMCAuLi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21heEZGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZmxvYXQgamF2YS5sYW5nLk1hdGgubWF4KGZsb2F0LCBmbG9hdCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGZsb2F0IG1heCB2YWx1ZSIsIE1hdGgubWF4KC0xOTA4ODk3LjYwMGYsCkBAIC00MTAsNiArNjE2LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI21heChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbjogIiArIAorICAgICAgICAgICAgICAgICAgIk5hTiwgKy8tMCAuLi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXgiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21heElJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5NYXRoLm1heChpbnQsIGludCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgaW50IG1heCB2YWx1ZSIsCkBAIC00MjIsNiArNjM4LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI21heChsb25nLCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uOiAiICsgCisgICAgICAgICAgICAgICAgICAiTmFOLCArLy0wIC4uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1heCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICB9KSAgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXhKSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5sYW5nLk1hdGgubWF4KGxvbmcsIGxvbmcpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxvbmcgbWF4IHZhbHVlIiwgMTkwODg5NzYwMDAwODlMLCBNYXRoLm1heCgtMTkwODg5NzYwMDAwODlMLApAQCAtNDM1LDYgKzY2MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNtaW4oZG91YmxlLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21pbkREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLm1pbihkb3VibGUsIGRvdWJsZSkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG91YmxlIG1pbiB2YWx1ZSIsIC0xOTA4ODk3LjYwMDAwODksIE1hdGgubWluKC0xOTA4ODk3LjYwMDAwODksCkBAIC00NDgsNiArNjgzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI21pbihmbG9hdCwgZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9taW5GRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0IGphdmEubGFuZy5NYXRoLm1pbihmbG9hdCwgZmxvYXQpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBmbG9hdCBtaW4gdmFsdWUiLCBNYXRoLm1pbigtMTkwODg5Ny42MDBmLApAQCAtNDYxLDYgKzcwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNtaW4oaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21pbklJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5NYXRoLm1pbihpbnQsIGludCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgaW50IG1pbiB2YWx1ZSIsCkBAIC00NzQsNiArNzI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI21pbihsb25nLCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1pbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21pbkpKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmxhbmcuTWF0aC5taW4obG9uZywgbG9uZykKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbG9uZyBtaW4gdmFsdWUiLCAtMTkwODg5NzYwMDAwODlMLCBNYXRoLm1pbigtMTkwODg5NzYwMDAwODlMLApAQCAtNDg3LDYgKzc0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNwb3coZG91YmxlLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG93IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Bvd0REKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5NYXRoLnBvdyhkb3VibGUsIGRvdWJsZSkKICAgICAgICAgYXNzZXJ0VHJ1ZSgicG93IHJldHVybmVkIGluY29ycmVjdCB2YWx1ZSIsCkBAIC01MDAsNiArNzcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3JpbnQoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yaW50RCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuTWF0aC5yaW50KGRvdWJsZSkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcm91bmQgcHJvcGVybHkgLSB1cCB0byBvZGQiLApAQCAtNTE1LDYgKzc5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNyb3VuZChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicm91bmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JvdW5kRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5sYW5nLk1hdGgucm91bmQoZG91YmxlKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCByb3VuZGluZyBvZiBhIGZsb2F0IiwgLTkxLCBNYXRoLnJvdW5kKC05MC44OWQpKTsKQEAgLTUyMyw2ICs4MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjcm91bmQoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJvdW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JvdW5kRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuTWF0aC5yb3VuZChmbG9hdCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgcm91bmRpbmcgb2YgYSBmbG9hdCIsIC05MSwgTWF0aC5yb3VuZCgtOTAuODlmKSk7CkBAIC01MzEsNiArODI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3NpZ251bShkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpZ251bSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2lnbnVtX0QoKSB7CiAgICAgICAgIGFzc2VydFRydWUoRG91YmxlLmlzTmFOKE1hdGguc2lnbnVtKERvdWJsZS5OYU4pKSk7CiAgICAgICAgIGFzc2VydFRydWUoRG91YmxlLmlzTmFOKE1hdGguc2lnbnVtKERvdWJsZS5OYU4pKSk7CkBAIC01NTcsNiArODY0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3NpZ251bShmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2lnbnVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpZ251bV9GKCkgewogICAgICAgICBhc3NlcnRUcnVlKEZsb2F0LmlzTmFOKE1hdGguc2lnbnVtKEZsb2F0Lk5hTikpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEZsb2F0LmZsb2F0VG9JbnRCaXRzKDAuMGYpLCBGbG9hdApAQCAtNTgyLDYgKzg5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNzaW4oZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2luRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuTWF0aC5zaW4oZG91YmxlKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbnN3ZXIiLCAwLjAsIE1hdGguc2luKDApLCAwRCk7CkBAIC01OTEsNiArOTE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3NpbmgoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaW5oIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaW5oX0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIHNwZWNpYWwgc2l0dWF0aW9ucwogICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgcmV0dXJuIE5hTiIsIERvdWJsZS5pc05hTihNYXRoLnNpbmgoRG91YmxlLk5hTikpKTsKQEAgLTYyNCw2ICs5NTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjc3FydChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3FydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3FydEQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLk1hdGguc3FydChkb3VibGUpCiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgcm9vdCByZXR1cm5lZDIiLCA3LCBNYXRoLnNxcnQoNDkpLCAwKTsKQEAgLTYzMiw2ICs5NzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk1hdGgjdGFuKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0YW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RhbkQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLk1hdGgudGFuKGRvdWJsZSkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYW5zd2VyIiwgMC4wLCBNYXRoLnRhbigwKSwgMEQpOwpAQCAtNjQyLDYgKzk5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCN0YW5oKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidGFuaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdGFuaF9EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIHNpdHVhdGlvbnMKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIHJldHVybiBOYU4iLCBEb3VibGUuaXNOYU4oTWF0aC50YW5oKERvdWJsZS5OYU4pKSk7CkBAIC02NzAsNiArMTAzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTWF0aCNyYW5kb20oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyYW5kb20iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JhbmRvbSgpIHsKICAgICAgICAgLy8gVGhlcmUgaXNuJ3QgYSBwbGFjZSBmb3IgdGhlc2UgdGVzdHMgc28ganVzdCBzdGljayB0aGVtIGhlcmUKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyB2YWx1ZSBFIiwKQEAgLTY4Nyw2ICsxMDU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3RvUmFkaWFucyhkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvUmFkaWFucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9SYWRpYW5zRCgpIHsKICAgICAgICAgZm9yIChkb3VibGUgZCA9IDUwMDsgZCA+PSAwOyBkIC09IDEuMCkgewogICAgICAgICAgICAgZG91YmxlIGNvbnZlcnRlZCA9IE1hdGgudG9EZWdyZWVzKE1hdGgudG9SYWRpYW5zKGQpKTsKQEAgLTY5OCw2ICsxMDc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3RvRGVncmVlcyhkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvRGVncmVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9EZWdyZWVzRCgpIHsKICAgICAgICAgZm9yIChkb3VibGUgZCA9IDUwMDsgZCA+PSAwOyBkIC09IDEuMCkgewogICAgICAgICAgICAgZG91YmxlIGNvbnZlcnRlZCA9IE1hdGgudG9SYWRpYW5zKE1hdGgudG9EZWdyZWVzKGQpKTsKQEAgLTcwOSw2ICsxMDk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3VscChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVscCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdWxwX0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIHNwZWNpYWwgY2FzZXMKQEAgLTc0NCw2ICsxMTQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5NYXRoI3VscChmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidWxwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VscF9mKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIGNhc2VzCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAzN2YwMWI0Li5iMjU3MDY5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiNOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gZSA9IG5ldyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiNOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIGUgPSBuZXcgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24oImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTm9DbGFzc0RlZkZvdW5kRXJyb3JUZXN0LmphdmEKaW5kZXggY2ViYTE2NC4uNmFlMTM0MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vQ2xhc3NEZWZGb3VuZEVycm9yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTm9DbGFzc0RlZkZvdW5kRXJyb3IuY2xhc3MpIAogcHVibGljIGNsYXNzIE5vQ2xhc3NEZWZGb3VuZEVycm9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3IjTm9DbGFzc0RlZkZvdW5kRXJyb3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb0NsYXNzRGVmRm91bmRFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUgPSBuZXcgTm9DbGFzc0RlZkZvdW5kRXJyb3IoKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3IjTm9DbGFzc0RlZkZvdW5kRXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9DbGFzc0RlZkZvdW5kRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBOb0NsYXNzRGVmRm91bmRFcnJvciBlID0gbmV3IE5vQ2xhc3NEZWZGb3VuZEVycm9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvclRlc3QuamF2YQppbmRleCAzN2M5MjZiLi45YTk4ODJkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vU3VjaEZpZWxkRXJyb3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Ob1N1Y2hGaWVsZEVycm9yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTm9TdWNoRmllbGRFcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTm9TdWNoRmllbGRFcnJvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk5vU3VjaEZpZWxkRXJyb3IjTm9TdWNoRmllbGRFcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaEZpZWxkRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBOb1N1Y2hGaWVsZEVycm9yIGUgPSBuZXcgTm9TdWNoRmllbGRFcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Ob1N1Y2hGaWVsZEVycm9yI05vU3VjaEZpZWxkRXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoRmllbGRFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIE5vU3VjaEZpZWxkRXJyb3IgZSA9IG5ldyBOb1N1Y2hGaWVsZEVycm9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDllMDg4YmEuLmUwMjQxMjUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKE5vU3VjaEZpZWxkRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBOb1N1Y2hGaWVsZEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk5vU3VjaEZpZWxkRXhjZXB0aW9uI05vU3VjaEZpZWxkRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoRmllbGRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlID0gbmV3IE5vU3VjaEZpZWxkRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk5vU3VjaEZpZWxkRXhjZXB0aW9uI05vU3VjaEZpZWxkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaEZpZWxkRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgTm9TdWNoRmllbGRFeGNlcHRpb24gZSA9IG5ldyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vU3VjaE1ldGhvZEVycm9yVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFcnJvclRlc3QuamF2YQppbmRleCAzNzMyOWFmLi41MDEwNTNlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vU3VjaE1ldGhvZEVycm9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXJyb3JUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhOb1N1Y2hNZXRob2RFcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTm9TdWNoTWV0aG9kRXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFcnJvciNOb1N1Y2hNZXRob2RFcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaE1ldGhvZEVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgTm9TdWNoTWV0aG9kRXJyb3IgZSA9IG5ldyBOb1N1Y2hNZXRob2RFcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFcnJvciNOb1N1Y2hNZXRob2RFcnJvcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1N1Y2hNZXRob2RFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIE5vU3VjaE1ldGhvZEVycm9yIGUgPSBuZXcgTm9TdWNoTWV0aG9kRXJyb3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmNTUwMjMxLi4xMjBhNGExIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uI05vU3VjaE1ldGhvZEV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlID0gbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24jTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlID0gbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmYjUyZjU0Li40YTc0NDc0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDEzICsxNiwyOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTnVsbFBvaW50ZXJFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiNOdWxsUG9pbnRlckV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTMzLDYgKzQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiNOdWxsUG9pbnRlckV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIE51bGxQb2ludGVyRXhjZXB0aW9uIGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA0N2UxMTkxLi5hNWJhNzQ4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKE51bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTnVtYmVyRm9ybWF0RXhjZXB0aW9uI051bWJlckZvcm1hdEV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk51bWJlckZvcm1hdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlID0gbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5OdW1iZXJGb3JtYXRFeGNlcHRpb24jTnVtYmVyRm9ybWF0RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk51bWJlckZvcm1hdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlID0gbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL051bWJlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTnVtYmVyVGVzdC5qYXZhCmluZGV4IDE5ZTdjN2YuLjIzNDFjMzYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTnVtYmVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvTnVtYmVyVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMjYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoTnVtYmVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBOdW1iZXJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuTnVtYmVyI2J5dGVWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJ5dGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYnl0ZVZhbHVlKCkgewogICAgICAgICBpbnQgbnVtYmVyID0gMTIzMTI0MzsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGUgcmV0dXJuZWQgZm9yOiAiICsgbnVtYmVyLApAQCAtNDQsNiArNTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk51bWJlciNzaG9ydFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hvcnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2hvcnRWYWx1ZSgpIHsKICAgICAgICAgaW50IG51bWJlciA9IDEyMzEyNDM7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBieXRlIHJldHVybmVkIGZvcjogIiArIG51bWJlciwKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvT2JqZWN0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9PYmplY3RUZXN0LmphdmEKaW5kZXggZjY3NmJjYS4uMzk1OGEwMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9PYmplY3RUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9PYmplY3RUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitAVGVzdFRhcmdldENsYXNzKE9iamVjdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgT2JqZWN0VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKQEAgLTM1LDYgKzQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5PYmplY3QjT2JqZWN0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiT2JqZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QoKQogICAgICAgICBhc3NlcnROb3ROdWxsKCJDb25zdHJ1Y3RvciBmYWlsZWQgISEhIiwgbmV3IE9iamVjdCgpKTsKQEAgLTQzLDYgKzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBhc3NlcnRUcnVlKCJTYW1lIG9iamVjdCBzaG91bGQgYmUgZXF1YWwiLCBvYmoxLmVxdWFscyhvYmoxKSk7CkBAIC01Miw2ICs3NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuT2JqZWN0I2dldENsYXNzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2xhc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENsYXNzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkNsYXNzIGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lc1tdID0geyAiamF2YS5sYW5nLk9iamVjdCIsICJqYXZhLmxhbmcuVGhyb3dhYmxlIiwKQEAgLTc4LDYgKzExMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQogICAgICAgICBhc3NlcnRUcnVlKCJTYW1lIG9iamVjdCBzaG91bGQgaGF2ZSBzYW1lIGhhc2guIiwKQEAgLTg5LDYgKzEzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuT2JqZWN0I25vdGlmeSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibm90aWZ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ub3RpZnkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5PYmplY3Qubm90aWZ5KCkKIApAQCAtMTU5LDYgKzIxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuT2JqZWN0I25vdGlmeUFsbCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiAgaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5vdGlmeUFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfbm90aWZ5QWxsKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuT2JqZWN0Lm5vdGlmeUFsbCgpCiAKQEAgLTIzMiw2ICsyOTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLk9iamVjdC50b1N0cmluZygpCiAgICAgICAgIGFzc2VydE5vdE51bGwoIk9iamVjdCB0b1N0cmluZyByZXR1cm5lZCBudWxsLiIsIG9iajEudG9TdHJpbmcoKSk7CkBAIC0yNDAsNiArMzA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5PYmplY3Qjd2FpdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBhcmUgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndhaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dhaXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5PYmplY3Qud2FpdCgpCiAKQEAgLTI1Niw3ICszMzQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICA7CisgICAgICAgIAogCiAgICAgICAgIC8vIFN0YXJ0IG9mIHRlc3QgY29kZS4KIApAQCAtMjg3LDYgKzM2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuT2JqZWN0I3dhaXQobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGFyZSBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid2FpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dhaXRKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuT2JqZWN0LndhaXQobG9uZykKIApAQCAtMzQzLDYgKzQzMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuT2JqZWN0I3dhaXQobG9uZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3YWl0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93YWl0SkkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5PYmplY3Qud2FpdChsb25nLCBpbnQpCiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvclRlc3QuamF2YQppbmRleCAyNTM2YzA5Li5hODNjNzlmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMjYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoT3V0T2ZNZW1vcnlFcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgT3V0T2ZNZW1vcnlFcnJvclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5PdXRPZk1lbW9yeUVycm9yI091dE9mTWVtb3J5RXJyb3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJPdXRPZk1lbW9yeUVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PdXRPZk1lbW9yeUVycm9yKCkKICAgICAgICAgRXJyb3IgZSA9IG5ldyBPdXRPZk1lbW9yeUVycm9yKCk7CkBAIC0zMiw2ICs0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvciNPdXRPZk1lbW9yeUVycm9yKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk91dE9mTWVtb3J5RXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgRXJyb3IgZSA9IG5ldyBPdXRPZk1lbW9yeUVycm9yKG51bGwpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9QYWNrYWdlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9QYWNrYWdlVGVzdC5qYXZhCmluZGV4IDA5NmM2MGYuLjkwZDAwNjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUGFja2FnZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1BhY2thZ2VUZXN0LmphdmEKQEAgLTE2LDEzICsxNiwxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIAorQFRlc3RUYXJnZXRDbGFzcyhQYWNrYWdlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQYWNrYWdlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIEZpbGUgcmVzb3VyY2VzOwpAQCAtNjEsNyArNjUsMzYgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlBhY2thZ2UjZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKQogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUGFja2FnZSNnZXRJbXBsZW1lbnRhdGlvblRpdGxlKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hlbHBlcl9BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEltcGxlbWVudGF0aW9uVGl0bGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEltcGxlbWVudGF0aW9uVmVuZG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNwZWNpZmljYXRpb25UaXRsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3BlY2lmaWNhdGlvblZlbmRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9oZWxwZXJfQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFBhY2thZ2UgcCA9IGdldFRlc3RQYWNrYWdlKCJoeXRzX2FsbF9hdHRyaWJ1dGVzLmphciIsICJwLkMiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKApAQCAtMTcxLDcgKzIwNCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUGFja2FnZSNnZXROYW1lKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFja2FnZSBwID0gZ2V0VGVzdFBhY2thZ2UoImh5dHNfcHEuamFyIiwgInAucS5DIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiUGFja2FnZSBnZXROYW1lIHJldHVybnMgYSB3cm9uZyBzdHJpbmciLCAicC5xIiwgcAogICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOwpAQCAtMTgwLDcgKzIyMiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUGFja2FnZSNnZXRQYWNrYWdlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRQYWNrYWdlTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBjYXNlIHdoZW4gbnVsbCBzaG91bGQgYmUgcmV0dXJuZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFja2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRQYWNrYWdlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoIlBhY2thZ2UgZ2V0UGFja2FnZSBmYWlsZWQgZm9yIGphdmEubGFuZyIsIFBhY2thZ2UKICAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZSgiamF2YS5sYW5nIiksIFBhY2thZ2UuZ2V0UGFja2FnZSgiamF2YS5sYW5nIikpOwogCkBAIC0xOTEsNyArMjQyLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5QYWNrYWdlI2dldFBhY2thZ2VzKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhY2thZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhY2thZ2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0UGFja2FnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFja2FnZVtdIHBja2dzID0gUGFja2FnZS5nZXRQYWNrYWdlcygpOwogICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGNrZ3MubGVuZ3RoOyBpKyspIHsKQEAgLTIwNiw3ICsyNjYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlBhY2thZ2UjaGFzaENvZGUoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIFBhY2thZ2UgcDEgPSBQYWNrYWdlLmdldFBhY2thZ2UoImphdmEubGFuZyIpOwogICAgICAgICBpZiAocDEgIT0gbnVsbCkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHAxLmhhc2hDb2RlKCksICJqYXZhLmxhbmciLmhhc2hDb2RlKCkpOwpAQCAtMjE2LDcgKzI4NSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUGFja2FnZSNpc0NvbXBhdGlibGVXaXRoKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0NvbXBhdGlibGVXaXRoTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNDb21wYXRpYmxlV2l0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9pc0NvbXBhdGlibGVXaXRoTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFja2FnZSBwID0gZ2V0VGVzdFBhY2thZ2UoImh5dHNfYy5qYXIiLCAicC5DIik7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUGFja2FnZSBpc0NvbXBhdGlibGVXaXRoIGZhaWxzIHdpdGggbG93ZXIgdmVyc2lvbiIsIHAKQEAgLTI2Niw3ICszNDQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlBhY2thZ2UjaXNTZWFsZWQoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZWFsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGZhbHNlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU2VhbGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaXNTZWFsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFja2FnZSBwID0gZ2V0VGVzdFBhY2thZ2UoImh5dHNfcHEuamFyIiwgInAucS5DIik7CiAgICAgICAgIGFzc2VydFRydWUoIlBhY2thZ2UgaXNTZWFsZWQgcmV0dXJucyB3cm9uZyBib29sZWFuIiwgcC5pc1NlYWxlZCgpKTsKICAgICB9CkBAIC0yNzQsNyArMzYxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5QYWNrYWdlI2lzU2VhbGVkKGphdmEubmV0LlVSTCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2VhbGVkTGphdmFfbmV0X1VSTCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1NlYWxlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5VUkwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2lzU2VhbGVkTGphdmFfbmV0X1VSTCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQYWNrYWdlIHAgPSBnZXRUZXN0UGFja2FnZSgiaHl0c19jLmphciIsICJwLkMiKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlBhY2thZ2UgaXNTZWFsZWQgcmV0dXJucyB3cm9uZyBib29sZWFuICgxKSIsIHAKICAgICAgICAgICAgICAgICAuaXNTZWFsZWQobmV3IFVSTCgiZmlsZTovIiArIHJlc1BhdGggKyAiLyIpKSk7CkBAIC0yODUsNyArMzgxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5QYWNrYWdlI3RvU3RyaW5nKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFja2FnZSBwID0gZ2V0VGVzdFBhY2thZ2UoImh5dHNfYy5qYXIiLCAicC5DIik7CiAgICAgICAgIGFzc2VydFRydWUoIlBhY2thZ2UgdG9TdHJpbmcgcmV0dXJucyB3cm9uZyBzdHJpbmciLCBwLnRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAubGVuZ3RoKCkgPiAwKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Byb2Nlc3NCdWlsZGVyVGVzdC5qYXZhCmluZGV4IDgxZjYxNzUuLjYwN2JlZDQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Qcm9jZXNzQnVpbGRlclRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMjQsMTQgKzMxLDI5IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhQcm9jZXNzQnVpbGRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUHJvY2Vzc0J1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb2Nlc3NCdWlsZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NCdWlsZGVyU3RyaW5nQXJyYXkoKSB7CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3Mgb25seSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcm9jZXNzQnVpbGRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NCdWlsZGVyTGlzdE9mU3RyaW5nKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IFByb2Nlc3NCdWlsZGVyKChMaXN0PFN0cmluZz4pIG51bGwpOwpAQCAtMzksNyArNjEsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbW1hbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWFuZCgpIHsKICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoImNvbW1hbmQiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBiLmNvbW1hbmQoKS5zaXplKCkpOwpAQCAtNTQsNyArODQsMTUgQEAKICAgICAgICAgbGlzdC50b0FycmF5KGNvbW1hbmQpOwogICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdeyJCQkIiLCJDQ0MiLCJEREQifSwgY29tbWFuZCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21tYW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbW1hbmRTdHJpbmdBcnJheSgpIHsKICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoImNvbW1hbmQiKTsKICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGJSZXR1cm4gPSBwYi5jb21tYW5kKCJjbWQiKTsKQEAgLTYyLDcgKzEwMCwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGIuY29tbWFuZCgpLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiY21kIiwgcGIuY29tbWFuZCgpLmdldCgwKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21tYW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWFuZExpc3RPZlN0cmluZygpIHsKICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoImNvbW1hbmQiKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IG5ld0NtZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwpAQCAtNzcsMTIgKzEyMywyOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImNtZCIsIHBiLmNvbW1hbmQoKS5nZXQoMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImFyZyIsIHBiLmNvbW1hbmQoKS5nZXQoMSkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXJlY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0b3J5KCkgewogICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcigiY29tbWFuZCIpOwogICAgICAgICBhc3NlcnROdWxsKHBiLmRpcmVjdG9yeSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlyZWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeUZpbGUoKSB7CiAgICAgICAgIFByb2Nlc3NCdWlsZGVyIHBiID0gbmV3IFByb2Nlc3NCdWlsZGVyKCJjb21tYW5kIik7CiAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKQEAgLTk0LDggKzE1NiwxNiBAQAogICAgICAgICBhc3NlcnRTYW1lKHBiLCBwYlJldHVybik7CiAgICAgICAgIGFzc2VydE51bGwocGIuZGlyZWN0b3J5KCkpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZpcm9ubWVudCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW52aXJvbm1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEVudmlyb25tZW50KCkgewogICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcigiY29tbWFuZCIpOwogICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IHBiLmVudmlyb25tZW50KCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhTeXN0ZW0uZ2V0ZW52KCksIGVudik7CkBAIC0xMjcsMTIgKzE5NywyOCBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQ7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVkaXJlY3RFcnJvclN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdEVycm9yU3RyZWFtKCkgewogICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcigiY29tbWFuZCIpOwogICAgICAgICBhc3NlcnRGYWxzZShwYi5yZWRpcmVjdEVycm9yU3RyZWFtKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGZhbHNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlZGlyZWN0RXJyb3JTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0RXJyb3JTdHJlYW1Cb29sZWFuKCkgewogICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcigiY29tbWFuZCIpOwogICAgICAgICBQcm9jZXNzQnVpbGRlciBwYlJldHVybiA9IHBiLnJlZGlyZWN0RXJyb3JTdHJlYW0odHJ1ZSk7CkBAIC0xNDQsNiArMjMwLDE1IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlByb2Nlc3NCdWlsZGVyI3N0YXJ0KCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0YXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoImphdmEiLCAiLXZlcnNpb24iKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAwOThjOGI2Li5mMGYwYzQ4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUnVudGltZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24jUnVudGltZUV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJ1bnRpbWVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBSdW50aW1lRXhjZXB0aW9uIGUgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uI1J1bnRpbWVFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUnVudGltZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUnVudGltZVBlcm1pc3Npb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1J1bnRpbWVQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IDM1ZmNkYTcuLjA4OTkyYTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUnVudGltZVBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9SdW50aW1lUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMTcsMTEgKzE3LDI2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitAVGVzdFRhcmdldENsYXNzKFJ1bnRpbWVQZXJtaXNzaW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBSdW50aW1lUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiNSdW50aW1lUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSdW50aW1lUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgUnVudGltZVBlcm1pc3Npb24gciA9IG5ldyBSdW50aW1lUGVybWlzc2lvbigiY3JlYXRlQ2xhc3NMb2FkZXIiKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiNSdW50aW1lUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSdW50aW1lUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9SdW50aW1lVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9SdW50aW1lVGVzdC5qYXZhCmluZGV4IGU2NWFiNjAuLmZhMjdkNDMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvUnVudGltZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1J1bnRpbWVUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCitAVGVzdFRhcmdldENsYXNzKFJ1bnRpbWUuY2xhc3MpIAogcHVibGljIGNsYXNzIFJ1bnRpbWVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIFJ1bnRpbWUgciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwpAQCAtNTksNiArNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlJ1bnRpbWUjZXhpdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbm9ybWFsbHksIGFuZCBjYW4ndCBiZSB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXhpdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5SdW50aW1lLmV4aXQoaW50KQogICAgICAgICBhc3NlcnRUcnVlKCJDYW4ndCByZWFsbHkgdGVzdCB0aGlzIiwgdHJ1ZSk7CkBAIC02Nyw3ICs4MiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUnVudGltZSNleGVjKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9leGVjKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2V4ZWMoKSB7CiAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwogCiAgICAgICAgIC8qIHN1Y2Nlc3NmdWwgZXhlYydzIGFyZSB0ZXN0ZWQgYnkgamF2YS5sYW5nLlByb2Nlc3MgKi8KQEAgLTg0LDYgKzEwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUnVudGltZSNmcmVlTWVtb3J5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZnJlZU1lbW9yeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZnJlZU1lbW9yeSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5sYW5nLlJ1bnRpbWUuZnJlZU1lbW9yeSgpCiAgICAgICAgIGFzc2VydFRydWUoImZyZWVNZW1vcnkgcmV0dXJuZWQgbm9uc2Vuc2UgdmFsdWUiLCByLmZyZWVNZW1vcnkoKSA+IDApOwpAQCAtOTIsNiArMTI1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5SdW50aW1lI2djKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2djKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuUnVudGltZS5nYygpCiAgICAgICAgIHRyeSB7CkBAIC0xMTgsNiArMTYwLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5SdW50aW1lI2dldFJ1bnRpbWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJnZXRSdW50aW1lIG1ldGhvZCBpcyB2ZXJpZmllZCBpbiBpbml0aWFsIHNldHVwIGZvciAiICsKKyAgICAgICAgICAgICJvdGhlciB0ZXN0cy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW50aW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSdW50aW1lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlJ1bnRpbWUgamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpCiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwpAQCAtMTI2LDYgKzE3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUnVudGltZSNydW5GaW5hbGl6YXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJydW5GaW5hbGl6YXRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3J1bkZpbmFsaXphdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlJ1bnRpbWUucnVuRmluYWxpemF0aW9uKCkKIApAQCAtMTQ0LDYgKzIwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUnVudGltZSN0b3RhbE1lbW9yeSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvdGFsTWVtb3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b3RhbE1lbW9yeSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5sYW5nLlJ1bnRpbWUudG90YWxNZW1vcnkoKQogICAgICAgICBhc3NlcnRUcnVlKCJ0b3RhbE1lbW9yeSByZXR1cm5lZCBub25zZW5zZSB2YWx1ZSIsIHIudG90YWxNZW1vcnkoKSA+PSByCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA0OWJiNDY4Li40NTA5NDMzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDE1ICsxNywyOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU2VjdXJpdHlFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24jU2VjdXJpdHlFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFNlY3VyaXR5RXhjZXB0aW9uIGUgPSBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNiw2ICs1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24jU2VjdXJpdHlFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBTZWN1cml0eUV4Y2VwdGlvbiBlID0gbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTQ1LDYgKzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbiNTZWN1cml0eUV4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19UaHJvd2FibGUoKSB7CiAgICAgICAgIE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwpAQCAtNTYsNiArODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uI1NlY3VyaXR5RXhjZXB0aW9uKFRocm93YWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfVGhyb3dhYmxlKCkgewogICAgICAgICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKQEAgLTY2LDYgKzEwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgU2VjdXJpdHlFeGNlcHRpb24oKSk7CkBAIC03NCw2ICsxMjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBTZWN1cml0eUV4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU2VjdXJpdHlNYW5hZ2VyMlRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU2VjdXJpdHlNYW5hZ2VyMlRlc3QuamF2YQppbmRleCBmMjQ5N2ZiLi5mNjkxN2U4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1NlY3VyaXR5TWFuYWdlcjJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TZWN1cml0eU1hbmFnZXIyVGVzdC5qYXZhCkBAIC0xNiwxNCArMTYsMzAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0V4ZWM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHlNYW5hZ2VyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTZWN1cml0eU1hbmFnZXIyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VjdXJpdHlNYW5hZ2VyX3ZpYV9TeXN0ZW1Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZWN1cml0eU1hbmFnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9TZWN1cml0eU1hbmFnZXJfdmlhX1N5c3RlbVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZ1tdIGFyZyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgIi1EamF2YS5zZWN1cml0eS5tYW5hZ2VyPSIgKyBNeVNlY3VyaXR5TWFuYWdlci5jbGFzcy5nZXROYW1lKCksCiAgICAgICAgICAgICAgICAgVGVzdEZvclN5c3RlbVByb3BlcnR5LmNsYXNzLmdldE5hbWUoKSB9OwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TZWN1cml0eU1hbmFnZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1NlY3VyaXR5TWFuYWdlclRlc3QuamF2YQppbmRleCA5MjIzNmU5Li42OWM2MDRlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1NlY3VyaXR5TWFuYWdlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1NlY3VyaXR5TWFuYWdlclRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOwpAQCAtMzAsMTIgKzM3LDEyIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb247CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfRXhlYzsKIAogLyoqCiAgKiBUZXN0IGNhc2UgZm9yIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIKICAqLworQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eU1hbmFnZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFNlY3VyaXR5TWFuYWdlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgTXV0YWJsZVNlY3VyaXR5TWFuYWdlciBtdXRhYmxlU00gPSBudWxsOwogCkBAIC01MCw2ICs1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI1NlY3VyaXR5TWFuYWdlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3VyaXR5TWFuYWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBsb2NhbE1hbmFnZXIgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtNzUsNiArOTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1BhY2thZ2VBY2Nlc3MoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1BhY2thZ2VBY2Nlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1BhY2thZ2VBY2Nlc3NMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG9sZCA9IFNlY3VyaXR5LmdldFByb3BlcnR5KCJwYWNrYWdlLmFjY2VzcyIpOwogICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgicGFja2FnZS5hY2Nlc3MiLCAiYS4sYmJiLCBjLmQuIik7CkBAIC0xMjMsNiArMTQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQYWNrYWdlRGVmaW5pdGlvbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGFja2FnZURlZmluaXRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1BhY2thZ2VEZWZpbml0aW9uTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBvbGQgPSBTZWN1cml0eS5nZXRQcm9wZXJ0eSgicGFja2FnZS5kZWZpbml0aW9uIik7CiAgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJwYWNrYWdlLmRlZmluaXRpb24iLCAiYS4sYmJiLCBjLmQuIik7CkBAIC0xNzEsNyArMjA1LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNZW1iZXJBY2Nlc3MoamF2YS5sYW5nLkNsYXNzLCBpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9jaGVja01lbWJlckFjY2Vzc0xqYXZhX2xhbmdfQ2xhc3NJKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2FsbCBjaGVja01lbWJlckFjY2Vzcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja01lbWJlckFjY2VzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2xhc3MuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfY2hlY2tNZW1iZXJBY2Nlc3NMamF2YV9sYW5nX0NsYXNzSSgpIHsKICAgICAgICAgLy8gZW5hYmxlIGFsbCBidXQgb25lIGNoZWNrCiAgICAgICAgIG11dGFibGVTTS5hZGRQZXJtaXNzaW9uKG5ldyBBbGxQZXJtaXNzaW9uKCkpOwogICAgICAgICBtdXRhYmxlU00KQEAgLTE5NCw3ICsyMzcsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tQZXJtaXNzaW9uTGphdmFfc2VjdXJpdHlfUGVybWlzc2lvbigpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBhcmUgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2NoZWNrUGVybWlzc2lvbkxqYXZhX3NlY3VyaXR5X1Blcm1pc3Npb24oKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gdG1wIHVzZXIgaG9tZSB0byBhdm9pZCBwcmVzZW5jZSBvZiAke3VzZXIuaG9tZX0vLmphdmEucG9saWN5CkBAIC0yMzYsNiArMjg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tBY2Nlc3MoamF2YS5sYW5nLlRocmVhZCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGFyZSBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tBY2Nlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocmVhZC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja0FjY2Vzc0xqYXZhX2xhbmdfVGhyZWFkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS02NgogICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CkBAIC0yNTEsNiArMzEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXB0KFN0cmluZywgaW50KX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tBY2NlcHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrQWNjZXB0TGphdmFfbGFuZ19TdHJpbmdfaW50KCkgewogICAgICAgICAvLyBlbmFibGUgYWxsIGJ1dCBvbmUgY2hlY2sKQEAgLTI2OSw2ICszMzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KFN0cmluZywgaW50KX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tDb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja0Nvbm5lY3RMamF2YV9sYW5nX1N0cmluZ0koKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKQEAgLTI4Niw4ICszNjUsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KFN0cmluZywgaW50LCBPYmplY3QpfQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja0Nvbm5lY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrQ29ubmVjdExqYXZhX2xhbmdfU3RyaW5nX2ludF9MamF2YV9sYW5nX09iamVjdCgpIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9jaGVja0Nvbm5lY3RMamF2YV9sYW5nX1N0cmluZ19pbnRfTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKICAgICAgICAgbXV0YWJsZVNNLmRlbnlQZXJtaXNzaW9uKG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJsb2NhbGhvc3Q6MTAyNC0iLApAQCAtMzA0LDYgKzM5MiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBwb3NpdGl2ZSBmdW5jdGlvbmxpdHk/IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tDcmVhdGVDbGFzc0xvYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KSAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tDcmVhdGVDbGFzc0xvYWRlcigpIHsKICAgICAgICAgLy8gZW5hYmxlIGFsbCBidXQgb25lIGNoZWNrCiAgICAgICAgIG11dGFibGVTTS5hZGRQZXJtaXNzaW9uKG5ldyBBbGxQZXJtaXNzaW9uKCkpOwpAQCAtMzI3LDcgKzQyNCwxNyBAQAogICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgbWV0aGQgY291bGQgYmUgdmVyaWZpZWQgdmlhIHRoZSBkZWxldGUgbWV0aG9kIG9mIGNsYXNzIEZpbGUgIiArCisgICAgICAgICAgICAiYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrRGVsZXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tEZWxldGVMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gZW5hYmxlIGFsbCBidXQgb25lIGNoZWNrCiAgICAgICAgIG11dGFibGVTTS5hZGRQZXJtaXNzaW9uKG5ldyBBbGxQZXJtaXNzaW9uKCkpOwpAQCAtMzU2LDYgKzQ2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0V4ZWMoU3RyaW5nKX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tFeGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tFeGVjTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawpAQCAtMzc0LDYgKzQ5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0V4aXQoaW50KX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tFeGl0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja0V4aXRfaW50KCkgewogICAgICAgICAvLyBlbmFibGUgYWxsIGJ1dCBvbmUgY2hlY2sKQEAgLTM5MSw2ICs1MTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tMaW5rKFN0cmluZyl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tMaW5rIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tMaW5rTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawpAQCAtNDA4LDYgKzU0MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0xpc3RlbihpbnQpfQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja0xpc3RlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tMaXN0ZW5faW50KCkgewogICAgICAgICAvLyBlbmFibGUgYWxsIGJ1dCBvbmUgY2hlY2sKQEAgLTQzOCw2ICs1ODEsMTUgQEAKICAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTXVsdGljYXN0KGphdmEubmV0LkluZXRBZGRyZXNzKX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja011bHRpY2FzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5JbmV0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja011bHRpY2FzdExqYXZhX25ldF9JbmV0QWRkcmVzcygpCiAgICAgICAgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewpAQCAtNDU4LDYgKzYxMCwxNSBAQAogICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNdWx0aWNhc3QoamF2YS5uZXQuSW5ldEFkZHJlc3MsYnl0ZSl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tNdWx0aWNhc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuSW5ldEFkZHJlc3MuY2xhc3MsIGJ5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7ICJubHMiLCAiZGVwcmVjYXRpb24iIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja011bHRpY2FzdExqYXZhX25ldF9JbmV0QWRkcmVzc19pbnQoKQogICAgICAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKQEAgLTQ4MCw4ICs2NDEsMTcgQEAKICAgICAgKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiwgT2JqZWN0KX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Blcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrUGVybWlzc2lvbkxqYXZhX3NlY3VyaXR5X1Blcm1pc3Npb25MamF2YV9sYW5nX09iamVjdCgpIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9jaGVja1Blcm1pc3Npb25MamF2YV9zZWN1cml0eV9QZXJtaXNzaW9uTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKICAgICAgICAgUGVybWlzc2lvbiBkZW55cCA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJsb2NhbGhvc3Q6MTAyNC0iLApAQCAtNTAyLDYgKzY3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1ByaW50Sm9iQWNjZXNzKCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tQcmludEpvYkFjY2VzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tQcmludEpvYkFjY2VzcygpIHsKICAgICAgICAgLy8gZW5hYmxlIGFsbCBidXQgb25lIGNoZWNrCkBAIC01MTUsNyArNjk0LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tQcm9wZXJ0aWVzQWNjZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1Byb3BlcnRpZXNBY2Nlc3MoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKQEAgLTUzOSw3ICs3MjYsMTUgQEAKICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Byb3BlcnR5QWNjZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tQcm9wZXJ0eUFjY2Vzc0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBlbmFibGUgYWxsIGJ1dCBvbmUgY2hlY2sKICAgICAgICAgbXV0YWJsZVNNLmFkZFBlcm1pc3Npb24obmV3IEFsbFBlcm1pc3Npb24oKSk7CkBAIC01NzksNiArNzc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChGaWxlRGVzY3JpcHRvcil9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tSZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZURlc2NyaXB0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tSZWFkTGphdmFfaW9fRmlsZURlc2NyaXB0b3IoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawpAQCAtNTkyLDcgKzc5NiwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrUmVhZExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBlbmFibGUgYWxsIGJ1dCBvbmUgY2hlY2sKICAgICAgICAgbXV0YWJsZVNNLmFkZFBlcm1pc3Npb24obmV3IEFsbFBlcm1pc3Npb24oKSk7CkBAIC02MjEsOCArODMzLDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChTdHJpbmcsT2JqZWN0KX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1JlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi0gICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1JlYWRMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCkgeworICAgIHB1YmxpYyB2b2lkIF90ZXN0X2NoZWNrUmVhZExqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKICAgICAgICAgbXV0YWJsZVNNLmRlbnlQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigiPDxBTEwgRklMRVM+PiIsICJyZWFkIikpOwpAQCAtNjM3LDcgKzg1OCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrU2VjdXJpdHlBY2Nlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1NlY3VyaXR5QWNjZXNzTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKQEAgLTY3Nyw2ICs5MDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tTZXRGYWN0b3J5KCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgU2VjdXJpdHlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tTZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1NldEZhY3RvcnkoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawpAQCAtNjkwLDggKzkyOCwxNiBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tUb3BMZXZlbFdpbmRvd0xqYXZhX2xhbmdfT2JqZWN0KCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1RvcExldmVsV2luZG93IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2NoZWNrVG9wTGV2ZWxXaW5kb3dMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoIkNhbGxpbmcgdGhyZWFkIGlzbid0IHRydXN0ZWQgdG8gYnJpbmcgdXAgdGhlIHRvcC1sZXZlbCB3aW5kb3ciLAogICAgICAgICAgICAgICAgIG11dGFibGVTTS5jaGVja1RvcExldmVsV2luZG93KHRoaXMpKTsKIApAQCAtNzEwLDcgKzk1NiwxNSBAQAogICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrV3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1dyaXRlTGphdmFfaW9fRmlsZURlc2NyaXB0b3IoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKQEAgLTcyMyw3ICs5NzcsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1dyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tXcml0ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBlbmFibGUgYWxsIGJ1dCBvbmUgY2hlY2sKICAgICAgICAgbXV0YWJsZVNNLmFkZFBlcm1pc3Npb24obmV3IEFsbFBlcm1pc3Npb24oKSk7CkBAIC03NTIsNiArMTAxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNnZXRJbkNoZWNrKCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluQ2hlY2siLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluY2hlY2soKSB7CiAgICAgICAgIG1vY2tTTS5zZXRJbkNoZWNrKGZhbHNlKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobW9ja1NNLmdldEluQ2hlY2soKSk7CkBAIC03NjIsOCArMTAzMywxNyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNnZXRTZWN1cml0eUNvbnRleHQoKX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBTZWN1cml0eUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZWN1cml0eUNvbnRleHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Q29udGV4dCgpIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRTZWN1cml0eUNvbnRleHQoKSB7CiAgICAgICAgIC8vIGVuYWJsZSBhbGwgYnV0IG9uZSBjaGVjawogICAgICAgICBtdXRhYmxlU00uYWRkUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKICAgICAgICAgbXV0YWJsZVNNLmRlbnlQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigiPDxBTEwgRklMRVM+PiIsICJyZWFkIikpOwpAQCAtNzc1LDcgKzEwNTUsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGhyZWFkR3JvdXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRocmVhZEdyb3VwKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgVGhyZWFkR3JvdXAgdGdyb3VwID0gbXV0YWJsZVNNLmdldFRocmVhZEdyb3VwKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkluY29ycmVjdCB0aHJlYWQgZ3JvdXAiLCB0Z3JvdXApOwpAQCAtNzk1LDYgKzEwODMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2xhc3NEZXB0aChTdHJpbmcpfQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgY2xhc3NEZXB0aChTdHJpbmcpIHJldHVybnMgLTEgZm9yIG5vdCAiICsKKyAgICAgICAgICAgICJmb3VuZCBmcmFtZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGFzc0RlcHRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xhc3NEZXB0aExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG1vY2tTTS5jbGFzc0RlcHRoKCJub3RoaW5nIikpOwpAQCAtODAzLDYgKzExMDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2xhc3NMb2FkZXJEZXB0aCgpfQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgY2FzZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsYXNzTG9hZGVyRGVwdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsYXNzTG9hZGVyRGVwdGgoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgbW9ja1NNLmNsYXNzTG9hZGVyRGVwdGgoKSk7CiAgICAgfQpAQCAtODEwLDYgKzExMTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY3VycmVudENsYXNzTG9hZGVyKCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBhbGwgY2FzZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImN1cnJlbnRDbGFzc0xvYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3VycmVudENsYXNzTG9hZGVyKCkgewogICAgICAgICBhc3NlcnROdWxsKG1vY2tTTS5jdXJyZW50Q2xhc3NMb2FkZXIoKSk7CiAgICAgfQpAQCAtODE3LDYgKzExMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY3VycmVudExvYWRlZENsYXNzKCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBhbGwgY2FzZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImN1cnJlbnRMb2FkZWRDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3VycmVudExvYWRlZENsYXNzKCkgewogICAgICAgICBhc3NlcnROdWxsKG1vY2tTTS5jdXJyZW50TG9hZGVkQ2xhc3MoKSk7CiAgICAgfQpAQCAtODI0LDYgKzExNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjaW5DbGFzcyhTdHJpbmcpfQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbkNsYXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5DbGFzc0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRGYWxzZShtb2NrU00uaW5DbGFzcygibm90aGluZyIpKTsKQEAgLTgzMyw2ICsxMTY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2luQ2xhc3NMb2FkZXIoKX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5DbGFzc0xvYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5DbGFzc0xvYWRlcigpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UobW9ja1NNLmluQ2xhc3NMb2FkZXIoKSk7CiAgICAgfQpAQCAtODQwLDcgKzExODMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjZ2V0Q2xhc3NDb250ZXh0KCl9CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDbGFzc0NvbnRleHQoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENsYXNzQ29udGV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldENsYXNzQ29udGV4dCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNb2NrU2VjdXJpdHlNYW5hZ2VyIHNob3VsZCBiZSB0aGUgZmlyc3QgaW4gdGhlIGNsYXNzZXMgc3RhY2siLAogICAgICAgICAgICAgICAgIG1vY2tTTS5nZXRDbGFzc0NvbnRleHQoKVswXSwgTW9ja1NlY3VyaXR5TWFuYWdlci5jbGFzcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TaG9ydFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU2hvcnRUZXN0LmphdmEKaW5kZXggOTU5ZDhiMS4uNWFkYWVlMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TaG9ydFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Nob3J0VGVzdC5qYXZhCkBAIC0xNiw4ICsxNiwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhTaG9ydC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU2hvcnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIHByaXZhdGUgU2hvcnQgc3AgPSBuZXcgU2hvcnQoKHNob3J0KSAxODAwMCk7CiAgICAgcHJpdmF0ZSBTaG9ydCBzbiA9IG5ldyBTaG9ydCgoc2hvcnQpIC0xOTAwMCk7CkBAIC0yNSw2ICszMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjYnl0ZVZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJ5dGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYnl0ZVZhbHVlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBqYXZhLmxhbmcuU2hvcnQuYnl0ZVZhbHVlKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgYnl0ZSB2YWx1ZSIsIDAsIG5ldyBTaG9ydChTaG9ydC5NSU5fVkFMVUUpCkBAIC0zNiw2ICs1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjY29tcGFyZVRvKGphdmEubGFuZy5TaG9ydCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TaG9ydC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9sYW5nX1Nob3J0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5TaG9ydC5jb21wYXJlVG8oamF2YS5sYW5nLlNob3J0KQogICAgICAgICBTaG9ydCBzID0gbmV3IFNob3J0KChzaG9ydCkgMSk7CkBAIC02MSw2ICs4NSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjZGVjb2RlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayB0aGF0IG5vIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgcGVybWl0dGVkICIgKworICAgICAgICAgICAgICAgICAgImluIHRoZSBTdHJpbmcuICIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWNvZGVMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU2hvcnQKICAgICAgICAgLy8gamF2YS5sYW5nLlNob3J0LmRlY29kZShqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMTI5LDYgKzE2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjcGFyc2VTaG9ydChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZVNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VTaG9ydExqYXZhX2xhbmdfU3RyaW5nMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHNob3J0IGphdmEubGFuZy5TaG9ydC5wYXJzZVNob3J0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIHNob3J0IHNwID0gU2hvcnQucGFyc2VTaG9ydCgiMzI3NDYiKTsKQEAgLTE2NCw2ICsyMDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I3BhcnNlU2hvcnQoamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZVNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZVNob3J0TGphdmFfbGFuZ19TdHJpbmdJMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHNob3J0IGphdmEubGFuZy5TaG9ydC5wYXJzZVNob3J0KGphdmEubGFuZy5TdHJpbmcsCiAgICAgICAgIC8vIGludCkKQEAgLTI1Nyw2ICszMDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlNob3J0LnRvU3RyaW5nKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW52YWxpZCBzdHJpbmcgcmV0dXJuZWQiLCBzcC50b1N0cmluZygpLmVxdWFscygiMTgwMDAiKQpAQCAtMjcyLDYgKzMzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjdG9TdHJpbmcoc2hvcnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7c2hvcnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmdTMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlNob3J0LnRvU3RyaW5nKHNob3J0KQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBzdHJpbmciLCAiMzI3NjciLCBTaG9ydC50b1N0cmluZygoc2hvcnQpIDMyNzY3KQpAQCAtMjg1LDYgKzM1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZzIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU2hvcnQKICAgICAgICAgLy8gamF2YS5sYW5nLlNob3J0LnZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykKQEAgLTI5Nyw2ICszNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmdJMigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TaG9ydAogICAgICAgICAvLyBqYXZhLmxhbmcuU2hvcnQudmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCkBAIC0zNDEsOCArNDI5LDE3IEBACiAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24gd2hlbiBwYXNzZWQgc3RyaW5nIGxhcmdlciB0aGFuIDE2IGJpdHMiKTsKICAgICB9CiAgICAgLyoqCi0gICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCN2YWx1ZU9mKGJ5dGUpCisgICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCN2YWx1ZU9mKHNob3J0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZTKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFNob3J0KFNob3J0Lk1JTl9WQUxVRSksIFNob3J0LnZhbHVlT2YoU2hvcnQuTUlOX1ZBTFVFKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU2hvcnQoU2hvcnQuTUFYX1ZBTFVFKSwgU2hvcnQudmFsdWVPZihTaG9ydC5NQVhfVkFMVUUpKTsKQEAgLTM1OSw2ICs0NTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3IFNob3J0KChzaG9ydCkxKS5oYXNoQ29kZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5ldyBTaG9ydCgoc2hvcnQpMikuaGFzaENvZGUoKSk7CkBAIC0zNjksNiArNDc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCNTaG9ydChTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTaG9ydCgoc2hvcnQpMCksIG5ldyBTaG9ydCgiMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTaG9ydCgoc2hvcnQpMSksIG5ldyBTaG9ydCgiMSIpKTsKQEAgLTM5OCw2ICs1MTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I1Nob3J0KHNob3J0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvclMoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXcgU2hvcnQoKHNob3J0KTEpLnNob3J0VmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCBuZXcgU2hvcnQoKHNob3J0KTIpLnNob3J0VmFsdWUoKSk7CkBAIC00MDgsNyArNTMyLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCNieXRlVmFsdWUoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfYm9vbGVhblZhbHVlKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJ5dGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfYnl0ZVZhbHVlMSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5ldyBTaG9ydCgoc2hvcnQpMSkuYnl0ZVZhbHVlKCkpOyAgICAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5ldyBTaG9ydCgoc2hvcnQpMikuYnl0ZVZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IFNob3J0KChzaG9ydCkwKS5ieXRlVmFsdWUoKSk7CkBAIC00MTgsNiArNTUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCNlcXVhbHMoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTaG9ydCgoc2hvcnQpMCksIFNob3J0LnZhbHVlT2YoKHNob3J0KTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTaG9ydCgoc2hvcnQpMSksIFNob3J0LnZhbHVlT2YoKHNob3J0KTEpKTsKQEAgLTQzMiw2ICs1NzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIi0xIiwgbmV3IFNob3J0KChzaG9ydCktMSkudG9TdHJpbmcoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiMCIsIG5ldyBTaG9ydCgoc2hvcnQpMCkudG9TdHJpbmcoKSk7CkBAIC00NDIsNiArNTkzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCN0b1N0cmluZyhzaG9ydCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZ1MoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiLTEiLCBTaG9ydC50b1N0cmluZygoc2hvcnQpLTEpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgU2hvcnQudG9TdHJpbmcoKHNob3J0KTApKTsKQEAgLTQ1Miw2ICs2MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I3ZhbHVlT2YoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU2hvcnQoKHNob3J0KTApLCBTaG9ydC52YWx1ZU9mKCIwIikpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFNob3J0KChzaG9ydCkxKSwgU2hvcnQudmFsdWVPZigiMSIpKTsKQEAgLTQ4MSw2ICs2NTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I3ZhbHVlT2YoU3RyaW5nLGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTaG9ydCgoc2hvcnQpMCksIFNob3J0LnZhbHVlT2YoIjAiLCAxMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFNob3J0KChzaG9ydCkxKSwgU2hvcnQudmFsdWVPZigiMSIsIDEwKSk7CkBAIC01MTQsNiArNjkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCNwYXJzZVNob3J0KFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcywgdW5pY29kZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlU2hvcnRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFNob3J0LnBhcnNlU2hvcnQoIjAiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBTaG9ydC5wYXJzZVNob3J0KCIxIikpOwpAQCAtNTQzLDYgKzczMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjcGFyc2VTaG9ydChTdHJpbmcsaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlU2hvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlU2hvcnRMamF2YV9sYW5nX1N0cmluZ0koKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBTaG9ydC5wYXJzZVNob3J0KCIwIiwgMTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNob3J0LnBhcnNlU2hvcnQoIjEiLCAxMCkpOwpAQCAtNTc2LDYgKzc3MiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjZGVjb2RlKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIHRoYXQgbm8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBwZXJtaXR0ZWQgIiArCisgICAgICAgICAgICAiaW4gdGhlIFN0cmluZy4gIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVjb2RlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU2hvcnQoKHNob3J0KTApLCBTaG9ydC5kZWNvZGUoIjAiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU2hvcnQoKHNob3J0KTEpLCBTaG9ydC5kZWNvZGUoIjEiKSk7CkBAIC02MDUsNiArODExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TaG9ydCNkb3VibGVWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kb3VibGVWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xRCwgbmV3IFNob3J0KChzaG9ydCktMSkuZG91YmxlVmFsdWUoKSwgMEQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMEQsIG5ldyBTaG9ydCgoc2hvcnQpMCkuZG91YmxlVmFsdWUoKSwgMEQpOwpAQCAtNjE0LDYgKzgyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjZmxvYXRWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxvYXRWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xRiwgbmV3IFNob3J0KChzaG9ydCktMSkuZmxvYXRWYWx1ZSgpLCAwRik7CiAgICAgICAgIGFzc2VydEVxdWFscygwRiwgbmV3IFNob3J0KChzaG9ydCkwKS5mbG9hdFZhbHVlKCksIDBGKTsKQEAgLTYyMyw2ICs4NDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlNob3J0I2ludFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgbmV3IFNob3J0KChzaG9ydCktMSkuaW50VmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBuZXcgU2hvcnQoKHNob3J0KTApLmludFZhbHVlKCkpOwpAQCAtNjMyLDYgKzg2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjbG9uZ1ZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvbmdWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xTCwgbmV3IFNob3J0KChzaG9ydCktMSkubG9uZ1ZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIG5ldyBTaG9ydCgoc2hvcnQpMCkubG9uZ1ZhbHVlKCkpOwpAQCAtNjQxLDYgKzg4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjc2hvcnRWYWx1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hvcnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2hvcnRWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBuZXcgU2hvcnQoKHNob3J0KS0xKS5zaG9ydFZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IFNob3J0KChzaG9ydCkwKS5zaG9ydFZhbHVlKCkpOwpAQCAtNjUwLDYgKzkwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU2hvcnQjcmV2ZXJzZUJ5dGVzKHNob3J0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJldmVyc2VCeXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXZlcnNlQnl0ZXNTKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTB4QUJDRCwgU2hvcnQucmV2ZXJzZUJ5dGVzKChzaG9ydCkweENEQUIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkweDEyMzQsIFNob3J0LnJldmVyc2VCeXRlcygoc2hvcnQpMHgzNDEyKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0YWNrT3ZlcmZsb3dFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RhY2tPdmVyZmxvd0Vycm9yVGVzdC5qYXZhCmluZGV4IGEzYTAyMzQuLjQ0ZTYxYzcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RhY2tPdmVyZmxvd0Vycm9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RhY2tPdmVyZmxvd0Vycm9yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RhY2tPdmVyZmxvd0Vycm9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTdGFja092ZXJmbG93RXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdGFja092ZXJmbG93RXJyb3IjU3RhY2tPdmVyZmxvd0Vycm9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RhY2tPdmVyZmxvd0Vycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgU3RhY2tPdmVyZmxvd0Vycm9yIGUgPSBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0YWNrT3ZlcmZsb3dFcnJvciNTdGFja092ZXJmbG93RXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RhY2tPdmVyZmxvd0Vycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgU3RhY2tPdmVyZmxvd0Vycm9yIGUgPSBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnRPcmlnaW5hbC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudE9yaWdpbmFsLmphdmEKaW5kZXggODYzMTAwOC4uN2I0MTgzNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudE9yaWdpbmFsLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudE9yaWdpbmFsLmphdmEKQEAgLTE2LDggKzE2LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RhY2tUcmFjZUVsZW1lbnQuY2xhc3MpIAogcHVibGljIGNsYXNzIFN0YWNrVHJhY2VFbGVtZW50T3JpZ2luYWwgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwdWJsaWMgdm9pZCBwdXJlSmF2YU1ldGhvZChPYmplY3QgdGVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudFRlc3QuamF2YQppbmRleCBhNmFlZGFlLi43ZWQwNTkzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnRUZXN0LmphdmEKQEAgLTE2LDggKzE2LDE0IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFN0YWNrVHJhY2VFbGVtZW50LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTdGFja1RyYWNlRWxlbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBTdGFja1RyYWNlRWxlbWVudE9yaWdpbmFsIG9yaWdpbmFsOwogCkBAIC0zNiw2ICs0MiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQjU3RhY2tUcmFjZUVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdGFja1RyYWNlRWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkCiAgICAgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0koKSB7CiAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IHN0ZTIgPSBudWxsOwpAQCAtODgsNiArMTAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBvcmlnaW5hbC5wdXJlSmF2YU1ldGhvZChuZXcgT2JqZWN0KCkpOwpAQCAtMTA1LDYgKzEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQjZ2V0Q2xhc3NOYW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2xhc3NOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDbGFzc05hbWUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBvcmlnaW5hbC5wdXJlSmF2YU1ldGhvZChuZXcgT2JqZWN0KCkpOwpAQCAtMTIzLDYgKzE1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQjZ2V0RmlsZU5hbWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaWxlTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZU5hbWUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBvcmlnaW5hbC5wdXJlSmF2YU1ldGhvZChuZXcgT2JqZWN0KCkpOwpAQCAtMTM5LDcgKzE4MSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQjZ2V0TGluZU51bWJlcigpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lTnVtYmVyKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMaW5lTnVtYmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0TGluZU51bWJlcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9yaWdpbmFsLnB1cmVKYXZhTWV0aG9kKG5ldyBPYmplY3QoKSk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CkBAIC0xNTEsNiArMjAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudCNnZXRNZXRob2ROYW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWV0aG9kTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kTmFtZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9yaWdpbmFsLnB1cmVKYXZhTWV0aG9kKG5ldyBPYmplY3QoKSk7CkBAIC0xNjcsNiArMjI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudCNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9yaWdpbmFsLnB1cmVKYXZhTWV0aG9kKG5ldyBPYmplY3QoKSk7CkBAIC0xODcsNiArMjU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudCNpc05hdGl2ZU1ldGhvZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTmF0aXZlTWV0aG9kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc05hdGl2ZU1ldGhvZCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9yaWdpbmFsLnB1cmVKYXZhTWV0aG9kKG5ldyBPYmplY3QoKSk7CkBAIC0yMDUsNyArMjgzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudCN0b1N0cmluZygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9yaWdpbmFsLnB1cmVKYXZhTWV0aG9kKG5ldyBPYmplY3QoKSk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0cmljdE1hdGhUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0cmljdE1hdGhUZXN0LmphdmEKaW5kZXggMTllODcyMy4uNzA2NWU1YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpY3RNYXRoVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaWN0TWF0aFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaWN0TWF0aC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RyaWN0TWF0aFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgZG91YmxlIEhZUCA9IFN0cmljdE1hdGguc3FydCgyLjApOwpAQCAtMzEsNiArMzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjcG93KGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzLCBkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG93KCkgewogICAgICAgICAvLyB0ZXN0cyBjaGFuZ2VzIGluIGZkbGlibTUuMwogICAgICAgICBhc3NlcnRUcnVlKERvdWJsZS5sb25nQml0c1RvRG91YmxlKC00NjEwMDY4NTkxNTM5ODkwMzI2TCkgPT0gU3RyaWN0TWF0aC5wb3coLTEuMDAwMDAwMDAwMDAwMDAwMmUrMDAsNC41MDM1OTk2MjczNzA0OTcwZSsxNSkpOwpAQCAtNDAsNiArNTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjdGFuKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0YW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RhbigpewogICAgICAgICAvLyB0ZXN0cyBjaGFuZ2VzIGluIGZkbGlibTUuMwogICAgICAgICBhc3NlcnRUcnVlKERvdWJsZS5sb25nQml0c1RvRG91YmxlKCA0ODUwMjM2NTQxNjU0NTg4Njc4TCkgPT0gU3RyaWN0TWF0aC50YW4oIDEuNzc2NTI0MTkwNzU0ODAyNEUrMjY5KSk7CkBAIC01MSw2ICs3NSwyNyBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNzaW5oKGRvdWJsZSkKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjZXhwbTEoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBvbmUgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNpbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaW5oIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleHBtMSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5leGFjdCgpewogICAgICAgICBhc3NlcnRUcnVlKCA0NDg1NTg1MjI4NzQzODQwMjk4TCA9PSBEb3VibGUuZG91YmxlVG9SYXdMb25nQml0cyhTdHJpY3RNYXRoLmFzaW4oNy40NTA1ODA1RS05KSkpOwogICAgICAgICBhc3NlcnRUcnVlKCA0NjA3MTgyNDE4ODE2Nzk0NjI0TCA9PSBEb3VibGUuZG91YmxlVG9SYXdMb25nQml0cyhTdHJpY3RNYXRoLmV4cCgzLjcyNTI5MDJFLTkpKSk7CkBAIC02MSw2ICsxMDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjYWJzKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Fic0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLlN0cmljdE1hdGguYWJzKGRvdWJsZSkKIApAQCAtNzMsNiArMTI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI2FicyhmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWJzRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0IGphdmEubGFuZy5TdHJpY3RNYXRoLmFicyhmbG9hdCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGZsb2F0IGFicyB2YWx1ZSIsCkBAIC04NCw2ICsxNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjYWJzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Fic0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlN0cmljdE1hdGguYWJzKGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGludCBhYnMgdmFsdWUiLApAQCAtOTUsNiArMTY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI2Ficyhsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFicyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Fic0ooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEubGFuZy5TdHJpY3RNYXRoLmFicyhsb25nKQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbG9uZyBhYnMgdmFsdWUiLCAoU3RyaWN0TWF0aApAQCAtMTA2LDYgKzE4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNhY29zKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY29zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hY29zRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuU3RyaWN0TWF0aC5hY29zKGRvdWJsZSkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGFyYyBjb3NpbmUiLCBTdHJpY3RNYXRoLmNvcyhTdHJpY3RNYXRoCkBAIC0xMTUsNiArMjA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI2FzaW4oZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFzaW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FzaW5EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5TdHJpY3RNYXRoLmFzaW4oZG91YmxlKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgYXJjIHNpbmUiLCBTdHJpY3RNYXRoLnNpbihTdHJpY3RNYXRoCkBAIC0xMjQsNiArMjIzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI2F0YW4oZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdGFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hdGFuRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuU3RyaWN0TWF0aC5hdGFuKGRvdWJsZSkKICAgICAgICAgZG91YmxlIGFuc3dlciA9IFN0cmljdE1hdGgudGFuKFN0cmljdE1hdGguYXRhbigxLjApKTsKQEAgLTEzNCw2ICsyNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjYXRhbjIoZG91YmxlLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXRhbjIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzLCBkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXRhbjJERCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuU3RyaWN0TWF0aC5hdGFuMihkb3VibGUsIGRvdWJsZSkKICAgICAgICAgZG91YmxlIGFuc3dlciA9IFN0cmljdE1hdGguYXRhbihTdHJpY3RNYXRoLnRhbigxLjApKTsKQEAgLTE0NCw2ICsyNjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjY2JydChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2JydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2JydF9EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIHNpdHVhdGlvbnMKQEAgLTE4Nyw2ICszMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjY2VpbChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2VpbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2VpbEQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLlN0cmljdE1hdGguY2VpbChkb3VibGUpCiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY2VpbGluZyBmb3IgZG91YmxlIiwKQEAgLTE5OCw2ICszMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjY29zKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nvc0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLlN0cmljdE1hdGguY29zKGRvdWJsZSkKIApAQCAtMjA4LDYgKzM1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNjb3NoKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29zaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29zaF9EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIHNpdHVhdGlvbnMgICAgICAgIApAQCAtMjQyLDYgKzM5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNleHAoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4cCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXhwRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuU3RyaWN0TWF0aC5leHAoZG91YmxlKQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYW5zd2VyIHJldHVybmVkIGZvciBzaW1wbGUgcG93ZXIiLCBTdHJpY3RNYXRoCkBAIC0yNTQsNiArNDE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI2V4cG0xKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhwbTEiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2V4cG0xX0QoKSB7CiAgICAgICAgIC8vVGVzdCBmb3Igc3BlY2lhbCBjYXNlcyAgICAgICAgCkBAIC0yODYsNiArNDU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI2Zsb29yKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9vciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxvb3JEKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5TdHJpY3RNYXRoLmZsb29yKGRvdWJsZSkKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBmbG9vciBmb3IgZG91YmxlIiwKQEAgLTI5Nyw2ICs0NzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjaHlwb3QoZG91YmxlLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImh5cG90IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2h5cG90X0REKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIGNhc2VzCkBAIC0zMzcsNiArNTI2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI0lFRUVyZW1haW5kZXIoZG91YmxlLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSUVFRXJlbWFpbmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9JRUVFcmVtYWluZGVyREQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLlN0cmljdE1hdGguSUVFRXJlbWFpbmRlcihkb3VibGUsCiAgICAgICAgIC8vIGRvdWJsZSkKQEAgLTM1MSw2ICs1NDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjbG9nKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvZ0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLlN0cmljdE1hdGgubG9nKGRvdWJsZSkKICAgICAgICAgZm9yIChkb3VibGUgZCA9IDEwOyBkID49IC0xMDsgZCAtPSAwLjUpIHsKQEAgLTM2NSw2ICs1NzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjbG9nMTAoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2cxMCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9nMTBfRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3Igc3BlY2lhbCBjYXNlcyAgICAgICAgCkBAIC0zOTksNiArNjE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI2xvZzFwKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9nMXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvZzFwX0QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIHNwZWNpYWwgY2FzZXMKQEAgLTQzMSw2ICs2NTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjbWF4KGRvdWJsZSwgZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1heCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXhERCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmxhbmcuU3RyaWN0TWF0aC5tYXgoZG91YmxlLCBkb3VibGUpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRvdWJsZSBtYXggdmFsdWUiLCAxOTA4ODk3LjYwMDAwODksIFN0cmljdE1hdGgubWF4KApAQCAtNDQ1LDYgKzY3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNtYXgoZmxvYXQsIGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1heCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWF4RkYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBmbG9hdCBqYXZhLmxhbmcuU3RyaWN0TWF0aC5tYXgoZmxvYXQsIGZsb2F0KQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZmxvYXQgbWF4IHZhbHVlIiwgU3RyaWN0TWF0aC5tYXgoLTE5MDg4OTcuNjAwZiwKQEAgLTQ1OCw2ICs3MDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjbWF4KGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1heCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXhJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuU3RyaWN0TWF0aC5tYXgoaW50LCBpbnQpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGludCBtYXggdmFsdWUiLCAxOTA4ODk3NiwgU3RyaWN0TWF0aC5tYXgoLTE5MDg4OTc2LApAQCAtNDcxLDYgKzcyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNtYXgobG9uZywgbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXhKSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5sYW5nLlN0cmljdE1hdGgubWF4KGxvbmcsIGxvbmcpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxvbmcgbWF4IHZhbHVlIiwgMTkwODg5NzYwMDAwODlMLCBTdHJpY3RNYXRoLm1heCgtMTkwODg5NzYwMDAwODlMLApAQCAtNDg0LDYgKzc0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNtaW4oZG91YmxlLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21pbkREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5TdHJpY3RNYXRoLm1pbihkb3VibGUsIGRvdWJsZSkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG91YmxlIG1pbiB2YWx1ZSIsIC0xOTA4ODk3LjYwMDAwODksIFN0cmljdE1hdGgubWluKApAQCAtNDk3LDYgKzc2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNtaW4oZmxvYXQsIGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1pbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWluRkYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBmbG9hdCBqYXZhLmxhbmcuU3RyaWN0TWF0aC5taW4oZmxvYXQsIGZsb2F0KQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZmxvYXQgbWluIHZhbHVlIiwgU3RyaWN0TWF0aC5taW4oLTE5MDg4OTcuNjAwZiwKQEAgLTUxMCw2ICs3ODksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjbWluKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1pbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9taW5JSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuU3RyaWN0TWF0aC5taW4oaW50LCBpbnQpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGludCBtaW4gdmFsdWUiLCAtMTkwODg5NzYsIFN0cmljdE1hdGgubWluKC0xOTA4ODk3NiwKQEAgLTUyNCw2ICs4MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjbWluKGxvbmcsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWluSkooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEubGFuZy5TdHJpY3RNYXRoLm1pbihsb25nLCBsb25nKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBsb25nIG1pbiB2YWx1ZSIsIC0xOTA4ODk3NjAwMDA4OUwsIFN0cmljdE1hdGgubWluKC0xOTA4ODk3NjAwMDA4OUwsCkBAIC01MzcsNiArODM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI3Bvdyhkb3VibGUsIGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzLCBkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG93REQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLlN0cmljdE1hdGgucG93KGRvdWJsZSwgZG91YmxlKQogICAgICAgICBhc3NlcnRUcnVlKCJwb3cgcmV0dXJuZWQgaW5jb3JyZWN0IHZhbHVlIiwKQEAgLTU0OCw2ICs4NTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjcmludChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJpbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JpbnREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5TdHJpY3RNYXRoLnJpbnQoZG91YmxlKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByb3VuZCBwcm9wZXJseSAtIHVwIHRvIG9kZCIsCkBAIC01NjMsNiArODc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI3JvdW5kKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb3VuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfcm91bmREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmxhbmcuU3RyaWN0TWF0aC5yb3VuZChkb3VibGUpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJvdW5kaW5nIG9mIGEgZmxvYXQiLApAQCAtNTcyLDYgKzg5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNyb3VuZChmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb3VuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yb3VuZEYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlN0cmljdE1hdGgucm91bmQoZmxvYXQpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJvdW5kaW5nIG9mIGEgZmxvYXQiLApAQCAtNTgxLDYgKzkxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNzaWdudW0oZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaWdudW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpZ251bV9EKCkgewogICAgICAgICBhc3NlcnRUcnVlKERvdWJsZS5pc05hTihTdHJpY3RNYXRoLnNpZ251bShEb3VibGUuTmFOKSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoMC4wKSwgRG91YmxlCkBAIC02MDcsNiArOTQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI3NpZ251bShmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2lnbnVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpZ251bV9GKCkgewogICAgICAgICBhc3NlcnRUcnVlKEZsb2F0LmlzTmFOKFN0cmljdE1hdGguc2lnbnVtKEZsb2F0Lk5hTikpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEZsb2F0LmZsb2F0VG9JbnRCaXRzKDAuMGYpLCBGbG9hdApAQCAtNjMyLDYgKzk4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNzaW4oZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2luIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaW5EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5TdHJpY3RNYXRoLnNpbihkb3VibGUpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBzaW5lIiwgU3RyaWN0TWF0aC5zaW4oU3RyaWN0TWF0aApAQCAtNjQxLDYgKzEwMDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjc2luaChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpbmgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpbmhfRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3Igc3BlY2lhbCBzaXR1YXRpb25zCiAgICAgICAgIGFzc2VydFRydWUoRG91YmxlLmlzTmFOKFN0cmljdE1hdGguc2luaChEb3VibGUuTmFOKSkpOwpAQCAtNjc2LDYgKzEwNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmljdE1hdGgjc3FydChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3FydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3FydEQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5sYW5nLlN0cmljdE1hdGguc3FydChkb3VibGUpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJvb3QgcmV0dXJuZWQxIiwKQEAgLTY4Niw2ICsxMDY0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI3Rhbihkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidGFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90YW5EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEubGFuZy5TdHJpY3RNYXRoLnRhbihkb3VibGUpCiAgICAgICAgIGFzc2VydFRydWUoCkBAIC02OTcsNiArMTA4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCN0YW5oKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidGFuaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdGFuaF9EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIHNpdHVhdGlvbnMKICAgICAgICAgYXNzZXJ0VHJ1ZShEb3VibGUuaXNOYU4oU3RyaWN0TWF0aC50YW5oKERvdWJsZS5OYU4pKSk7CkBAIC03MjYsNiArMTEyMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCNyYW5kb20oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyYW5kb20iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JhbmRvbSgpIHsKICAgICAgICAgLy8gVGhlcmUgaXNuJ3QgYSBwbGFjZSBmb3IgdGhlc2UgdGVzdHMgc28ganVzdCBzdGljayB0aGVtIGhlcmUKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyB2YWx1ZSBFIiwKQEAgLTc0Myw2ICsxMTQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI3RvUmFkaWFucyhkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvUmFkaWFucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9SYWRpYW5zRCgpIHsKICAgICAgICAgZm9yIChkb3VibGUgZCA9IDUwMDsgZCA+PSAwOyBkIC09IDEuMCkgewogICAgICAgICAgICAgZG91YmxlIGNvbnZlcnRlZCA9IFN0cmljdE1hdGgudG9EZWdyZWVzKFN0cmljdE1hdGgudG9SYWRpYW5zKGQpKTsKQEAgLTc1NCw2ICsxMTY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI3RvRGVncmVlcyhkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvRGVncmVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9EZWdyZWVzRCgpIHsKICAgICAgICAgZm9yIChkb3VibGUgZCA9IDUwMDsgZCA+PSAwOyBkIC09IDEuMCkgewogICAgICAgICAgICAgZG91YmxlIGNvbnZlcnRlZCA9IFN0cmljdE1hdGgudG9SYWRpYW5zKFN0cmljdE1hdGgudG9EZWdyZWVzKGQpKTsKQEAgLTc2NSw2ICsxMTg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpY3RNYXRoI3VscChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVscCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VscF9EKCkgewogICAgICAgICAvLyBUZXN0IGZvciBzcGVjaWFsIGNhc2VzCkBAIC04MDEsNiArMTIzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaWN0TWF0aCN1bHAoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVscCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF91bHBfZigpIHsKICAgICAgICAgLy8gVGVzdCBmb3Igc3BlY2lhbCBjYXNlcwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmcyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmcyVGVzdC5qYXZhCmluZGV4IGQzY2MwMDMuLjQ3ZDZiZDEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nMlRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0cmluZzJUZXN0LmphdmEKQEAgLTE3LDkgKzE3LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaW5nLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTdHJpbmcyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBTdHJpbmcgaHcxID0gIkhlbGxvV29ybGQiOwpAQCAtNDUsNiArNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcoKQogICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIGluY29ycmVjdCBzdHJpbmciLCBuZXcgU3RyaW5nKCkuZXF1YWxzKCIiKSk7CkBAIC01Myw2ICs2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI1N0cmluZyhieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcoYnl0ZSBbXSkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBzdHJpbmciLCBuZXcgU3RyaW5nKGh3MS5nZXRCeXRlcygpKQpAQCAtNjIsNiArODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoYnl0ZVtdLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEJJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyhieXRlIFtdLCBpbnQpCkBAIC03NCw2ICsxMDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyhieXRlIFtdLCBpbnQsIGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBzdHJpbmciLCBuZXcgU3RyaW5nKGh3MS5nZXRCeXRlcygpLCAwLCBodzEKQEAgLTkxLDYgKzEzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI1N0cmluZyhieXRlW10sIGludCwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyhieXRlIFtdLCBpbnQsIGludCwgaW50KQpAQCAtMTAzLDYgKzE1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI1N0cmluZyhieXRlW10sIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCSUlMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyhieXRlIFtdLCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgU3RyaW5nIHMgPSBudWxsOwpAQCAtMTE5LDYgKzE3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI1N0cmluZyhieXRlW10sIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyhieXRlIFtdLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBTdHJpbmcgcyA9IG51bGw7CkBAIC0xMzMsNiArMjAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGNoYXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyhjaGFyIFtdKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCBDb25zdHJ1Y3RvciB0ZXN0IiwgIldvcmxkIiwgbmV3IFN0cmluZyhidWYpKTsKQEAgLTE0MSw2ICsyMTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoY2hhcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQ0lJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyhjaGFyIFtdLCBpbnQsIGludCkKICAgICAgICAgY2hhcltdIGJ1ZiA9IHsgJ0gnLCAnZScsICdsJywgJ2wnLCAnbycsICdXJywgJ28nLCAncicsICdsJywgJ2QnIH07CkBAIC0xNTksNiArMjQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGludFtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRJSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nKGludCBbXSwgaW50LCBpbnQpCiAgICAgICAgIHRyeSB7CkBAIC0xNzIsNiArMjY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZygiSGVsbG8gV29ybGQiKTsKQEAgLTE4Miw2ICsyODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0J1ZmZlcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcoamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtMTkzLDYgKzMwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2NoYXJBdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hhckF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGFyQXRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgY2hhciBqYXZhLmxhbmcuU3RyaW5nLmNoYXJBdChpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBjaGFyYWN0ZXIgcmV0dXJuZWQiLCBodzEuY2hhckF0KDUpID09ICdXJwpAQCAtMjAyLDYgKzMyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2NvbXBhcmVUbyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuU3RyaW5nLmNvbXBhcmVUbyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgdmFsdWUgZm9yIGZpcnN0IDwgc2Vjb25kIiwgImFhYWFhYiIKQEAgLTIyMyw2ICszNTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNjb21wYXJlVG9JZ25vcmVDYXNlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvSWdub3JlQ2FzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBhcmVUb0lnbm9yZUNhc2VMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludAogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nLmNvbXBhcmVUb0lnbm9yZUNhc2UoamF2YS5sYW5nLlN0cmluZykKQEAgLTI2Myw2ICs0MDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNjb25jYXQoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29uY2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uY2F0TGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcuY29uY2F0KGphdmEubGFuZy5TdHJpbmcpCkBAIC0yOTksNiArNDQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjY29weVZhbHVlT2YoY2hhcltdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb3B5VmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29weVZhbHVlT2YkQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy5jb3B5VmFsdWVPZihjaGFyCiAgICAgICAgIC8vIFtdKQpAQCAtMzEwLDYgKzQ2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2NvcHlWYWx1ZU9mKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb3B5VmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvcHlWYWx1ZU9mJENJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy5jb3B5VmFsdWVPZihjaGFyCiAgICAgICAgIC8vIFtdLCBpbnQsIGludCkKQEAgLTMyMSw2ICs0ODksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNlbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGZhbHNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZHNXaXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW5kc1dpdGhMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmluZSBlbmRpbmcgc3RyaW5nIiwgaHcxLmVuZHNXaXRoKCJsZCIpKTsKQEAgLTMyOSw2ICs1MDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBmYWxzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RyaW5nIG5vdCBlcXVhbCIsIGh3MS5lcXVhbHMoaHcyKSAmJiAhKGh3MS5lcXVhbHMoY29tcDExKSkpOwpAQCAtMzM3LDYgKzUyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2VxdWFsc0lnbm9yZUNhc2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGZhbHNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFsc0lnbm9yZUNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNJZ25vcmVDYXNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMzQ3LDYgKzU0MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2dldEJ5dGVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qnl0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ5dGVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBbXSBqYXZhLmxhbmcuU3RyaW5nLmdldEJ5dGVzKCkKICAgICAgICAgYnl0ZVtdIHNieXRlcyA9IGh3MS5nZXRCeXRlcygpOwpAQCAtNDIyLDYgKzYyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2dldEJ5dGVzKGludCwgaW50LCBieXRlW10sIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCeXRlc0lJJEJJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuU3RyaW5nLmdldEJ5dGVzKGludCwgaW50LCBieXRlIFtdLApAQCAtNDQyLDYgKzY1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2dldEJ5dGVzKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Qnl0ZXNMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBbXSBqYXZhLmxhbmcuU3RyaW5nLmdldEJ5dGVzKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIGJ5dGVbXSBidWYgPSAiSGVsbG8gV29ybGQiLmdldEJ5dGVzKCk7CkBAIC00NzUsNiArNjk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjZ2V0Q2hhcnMoaW50LCBpbnQsIGNoYXJbXSwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBjaGFyW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyc0lJJENJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuU3RyaW5nLmdldENoYXJzKGludCwgaW50LCBjaGFyIFtdLAogICAgICAgICAvLyBpbnQpCkBAIC00ODcsNiArNzE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlN0cmluZy5oYXNoQ29kZSgpCiAgICAgICAgIGludCBod0hhc2hDb2RlID0gMDsKQEAgLTUwNiw2ICs3NDYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNpbmRleE9mKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIHRoYXQgLTEgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gc3VjaCAiICsKKyAgICAgICAgICAgICJjaGFyYWN0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5kZXhPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlN0cmluZy5pbmRleE9mKGludCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGluZGV4IHJldHVybmVkIiwgMSwgaHcxLmluZGV4T2YoJ2UnKSk7CkBAIC01MTUsNiArNzY1LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjaW5kZXhPZihpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIHRoYXQgLTEgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gc3VjaCAiICsKKyAgICAgICAgICAgICJjaGFyYWN0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5kZXhPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbmRleE9mSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlN0cmluZy5pbmRleE9mKGludCwgaW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgY2hhcmFjdGVyIGluZGV4IHJldHVybmVkIiwgNSwgaHcxLmluZGV4T2YoJ1cnLCAyKSk7CkBAIC01MjQsNiArNzg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjaW5kZXhPZihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgdGhhdCAtMSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBzdWNoIGNoYXJhY3Rlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbmRleE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5TdHJpbmcuaW5kZXhPZihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmluZCBzdHJpbmciLCBodzEuaW5kZXhPZigiV29ybGQiKSA+IDApOwpAQCAtNTMzLDYgKzgwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2luZGV4T2YoamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgdGhhdCAtMSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBzdWNoIGNoYXJhY3Rlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbmRleE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5TdHJpbmcuaW5kZXhPZihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBmaW5kIHN0cmluZyIsIGh3MS5pbmRleE9mKCJXb3JsZCIsIDApID4gMCk7CkBAIC01NDYsNiArODI0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjaW50ZXJuKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50ZXJuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnRlcm4oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TdHJpbmcuaW50ZXJuKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW50ZXJuIHJldHVybmVkIGluY29ycmVjdCByZXN1bHQiLCBodzEuaW50ZXJuKCkgPT0gaHcyCkBAIC01NTUsNiArODQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjbGFzdEluZGV4T2YoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsYXN0SW5kZXhPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGFzdEluZGV4T2ZJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5TdHJpbmcubGFzdEluZGV4T2YoaW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZXR1cm4gY29ycmVjdCBpbmRleCIsIDUsIGh3MS5sYXN0SW5kZXhPZignVycpKTsKQEAgLTU2Niw2ICs4NjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNsYXN0SW5kZXhPZihpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGFzdEluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGFzdEluZGV4T2ZJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuU3RyaW5nLmxhc3RJbmRleE9mKGludCwgaW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZXR1cm4gY29ycmVjdCBpbmRleCIsCkBAIC01ODAsNiArODg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjbGFzdEluZGV4T2YoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGFzdEluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sYXN0SW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5TdHJpbmcubGFzdEluZGV4T2YoamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgaW5kZXgiLCA1LCBodzEubGFzdEluZGV4T2YoIldvcmxkIikpOwpAQCAtNTkwLDYgKzkwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2xhc3RJbmRleE9mKGphdmEubGFuZy5TdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGFzdEluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xhc3RJbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5TdHJpbmcubGFzdEluZGV4T2YoamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gaW50KQpAQCAtNjA1LDYgKzkyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2xlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGVuZ3RoKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGxlbmd0aCByZXR1cm5lZCIsIDExLCBjb21wMTEubGVuZ3RoKCkpOwpAQCAtNjEzLDYgKzk0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI3JlZ2lvbk1hdGNoZXMoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGFsbCBjYXNlcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVnaW9uTWF0Y2hlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlZ2lvbk1hdGNoZXNJTGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLlN0cmluZy5yZWdpb25NYXRjaGVzKGludCwKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCkBAIC02MjgsNiArOTY5LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjcmVnaW9uTWF0Y2hlcyhib29sZWFuLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYWxsIGNhc2VzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWdpb25NYXRjaGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3MsIGludC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVnaW9uTWF0Y2hlc1pJTGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLlN0cmluZy5yZWdpb25NYXRjaGVzKGJvb2xlYW4sIGludCwKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCkBAIC02NDcsNiArOTk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjcmVwbGFjZShjaGFyLCBjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgbmVnYXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXBsYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3MsIGNoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVwbGFjZUNDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgcmVwbGFjZSIsICJIZXp6b1dvcnpkIiwgaHcxLnJlcGxhY2UoJ2wnLCAneicpKTsKQEAgLTY1NSw2ICsxMDE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjcmVwbGFjZShDaGFyU2VxdWVuY2UsIENoYXJTZXF1ZW5jZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIG5lZ2F0aXZlIGNhc2UgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVwbGFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlcGxhY2VMamF2YV9sYW5nQ2hhclNlcXVlbmNlTGphdmFfbGFuZ0NoYXJTZXF1ZW5jZSgpIHsgICAgICAgICAgICAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgcmVwbGFjZSIsICJhYWNjZGQiLCAiYWFiYmRkIi5yZXBsYWNlKAogICAgICAgICAgICAgbmV3IFN0cmluZ0J1ZmZlcigiYmIiKSwgImNjIikpOwpAQCAtNjY3LDYgKzEwMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNzdGFydHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0YXJ0c1dpdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdGFydHNXaXRoTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5TdHJpbmcuc3RhcnRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmluZCBzdHJpbmciLCBodzEuc3RhcnRzV2l0aCgiSGVsbG8iKSk7CkBAIC02NzYsNiArMTA1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI3N0YXJ0c1dpdGgoamF2YS5sYW5nLlN0cmluZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdGFydHNXaXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdGFydHNXaXRoTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuU3RyaW5nLnN0YXJ0c1dpdGgoamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gaW50KQpAQCAtNjg2LDYgKzEwNzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNzdWJzdHJpbmcoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3Vic3RyaW5nSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdWJzdHJpbmcgcmV0dXJuZWQiLCAKQEAgLTY5Niw2ICsxMDkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjc3Vic3RyaW5nKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdWJzdHJpbmdJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBzdWJzdHJpbmcgcmV0dXJuZWQiLCBodzEuc3Vic3RyaW5nKDAsIDUpLmVxdWFscygKQEAgLTcwNyw2ICsxMTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdG9DaGFyQXJyYXkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0NoYXJBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9DaGFyQXJyYXkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBjaGFyIFtdIGphdmEubGFuZy5TdHJpbmcudG9DaGFyQXJyYXkoKQogCkBAIC03MTksNiArMTEzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI3RvTG93ZXJDYXNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9Mb3dlckNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvTG93ZXJDYXNlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuU3RyaW5nLnRvTG93ZXJDYXNlKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgidG9Mb3dlckNhc2UgY2FzZSBjb252ZXJzaW9uIGRpZCBub3Qgc3VjY2VlZCIsIGh3dWMKQEAgLTczMyw2ICsxMTU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdG9Mb3dlckNhc2UoamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9Mb3dlckNhc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0xvd2VyQ2FzZUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nLnRvTG93ZXJDYXNlKGphdmEudXRpbC5Mb2NhbGUpCkBAIC03NDcsNiArMTE3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuU3RyaW5nLnRvU3RyaW5nKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN0cmluZyByZXR1cm5lZCIsIGh3MS50b1N0cmluZygpLmVxdWFscyhodzEpKTsKQEAgLTc1NSw2ICsxMTk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdG9VcHBlckNhc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1VwcGVyQ2FzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9VcHBlckNhc2UoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TdHJpbmcudG9VcHBlckNhc2UoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBzdHJpbmcgaXMgbm90IFVwcGVyQ2FzZSIsIGh3bGMudG9VcHBlckNhc2UoKQpAQCAtNzcwLDYgKzEyMTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyN0b1VwcGVyQ2FzZShqYXZhLnV0aWwuTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1VwcGVyQ2FzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvVXBwZXJDYXNlTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcudG9VcHBlckNhc2UoamF2YS51dGlsLkxvY2FsZSkKQEAgLTc4NCw2ICsxMjQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdG9VcHBlckNhc2UoamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvVXBwZXJDYXNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9VcHBlckNhc2VMamF2YV91dGlsX0xvY2FsZV9zdWJ0ZXN0MCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZy50b1VwcGVyQ2FzZShqYXZhLnV0aWwuTG9jYWxlKQpAQCAtNzkyLDYgKzEyNTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyN0cmltKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGZvciBzdHJpbmcgd2l0aCBtYW55IHNwYWNlcywgZW1wdHkgc3RyaW5nLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRyaW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyaW0oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TdHJpbmcudHJpbSgpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBzdHJpbmcgcmV0dXJuZWQiLCAiIEhlbGxvV29ybGQgIi50cmltKCkuZXF1YWxzKApAQCAtODAxLDYgKzEyNzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGNoYXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mJEMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZihjaGFyIFtdKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBTdHJpbmciLCAKQEAgLTgxMCw2ICsxMjk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mJENJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKGNoYXIgW10sCiAgICAgICAgIC8vIGludCwgaW50KQpAQCAtODIxLDYgKzEzMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKGNoYXIpCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjU1MzY7IGkrKykKQEAgLTgzMSw2ICsxMzM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZEKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoZG91YmxlKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkb3VibGUgc3RyaW5nIHJldHVybmVkIiwgIjEuNzk3NjkzMTM0ODYyMzE1N0UzMDgiLCBTdHJpbmcudmFsdWVPZigKQEAgLTg0MCw2ICsxMzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKGZsb2F0KQogICAgICAgICBhc3NlcnRUcnVlKCJpbmNvcnJlY3QgZmxvYXQgc3RyaW5nIHJldHVybmVkLS1nb3Q6ICIKQEAgLTg1Niw2ICsxMzc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoaW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybmVkIGludmFsaWQgaW50IHN0cmluZyIsICIxIiwgU3RyaW5nLnZhbHVlT2YoMSkpOwpAQCAtODY0LDYgKzEzOTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZU9mSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKGxvbmcpCiAgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IGxvbmcgc3RyaW5nIiwgIjkyNzY1NDMyMTA5OCIsIFN0cmluZy52YWx1ZU9mKApAQCAtODczLDYgKzE0MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBudWxsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoamF2YS5sYW5nLk9iamVjdCkKQEAgLTg4Myw2ICsxNDMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZlooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZihib29sZWFuKQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYm9vbGVhbiBzdHJpbmcgcmV0dXJuZWQiLCBTdHJpbmcudmFsdWVPZihmYWxzZSkKQEAgLTg5Myw2ICsxNDUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjY29udGVudEVxdWFscyhDaGFyU2VxdWVuY2UgY3MpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRlbnRFcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250ZW50RXF1YWxzTGphdmFfbGFuZ19DaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TdHJpbmcuY29udGVudEVxdWFscyhDaGFyU2VxdWVuY2UgY3MpCiAgICAgICAgIGFzc2VydEZhbHNlKCJJbmNvcnJlY3QgcmVzdWx0IG9mIGNvbXBhcmUiLCAicXdlcnR5Ii5jb250ZW50RXF1YWxzKCIiKSk7CkBAIC05MDEsNiArMTQ2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2Zvcm1hdChMb2NhbGUsIFN0cmluZywgT2JqZWN0W10pCiAgICAgICovICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxGb3JtYXRFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0KCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIjEzJSBvZiBzdW0gaXMgMHgxMSIsIApAQCAtOTE1LDYgKzE0OTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNmb3JtYXQoTG9jYWxlLCBTdHJpbmcsIE9iamVjdC4uLikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdF9Mb2NhbGUoKSB7CiAgICAgICAgIExvY2FsZSBsID0gbmV3IExvY2FsZSgiVUsiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nQnVmZmVyMlRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nQnVmZmVyMlRlc3QuamF2YQppbmRleCBmMDQwYjdlLi44NjEzYWI2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmdCdWZmZXIyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworQFRlc3RUYXJnZXRDbGFzcyhTdHJpbmdCdWZmZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFN0cmluZ0J1ZmZlcjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIFN0cmluZ0J1ZmZlciB0ZXN0QnVmZmVyOwpAQCAtMjQsNiArMzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNTdHJpbmdCdWZmZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmdCdWZmZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpCiAgICAgICAgIG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTMzLDYgKzQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjU3RyaW5nQnVmZmVyKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nQnVmZmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKGludCkKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig4KTsKQEAgLTQzLDYgKzY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjU3RyaW5nQnVmZmVyKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZ0J1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKGphdmEubGFuZy5TdHJpbmcpCiAKQEAgLTYzLDYgKzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjYXBwZW5kKGNoYXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmQkQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoY2hhciBbXSkKQEAgLTc2LDYgKzExOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2FwcGVuZChjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzIG9mIG9mZnNldCBhbmQgbGVuZ3RoLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZCRDSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuYXBwZW5kKGNoYXIgW10sIGludCwgaW50KQpAQCAtOTMsNiArMTQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjYXBwZW5kKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZEMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuYXBwZW5kKGNoYXIpCkBAIC0xMTAsNiArMTcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjYXBwZW5kKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmFwcGVuZChkb3VibGUpCkBAIC0xMjMsNiArMTkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjYXBwZW5kKGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoZmxvYXQpCkBAIC0xMzgsNiArMjE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjYXBwZW5kKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmFwcGVuZChpbnQpCkBAIC0xNTMsNiArMjQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjYXBwZW5kKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZEooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuYXBwZW5kKGxvbmcpCkBAIC0xNjgsNiArMjY0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjYXBwZW5kKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmFwcGVuZChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTgzLDYgKzI4OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2FwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKQEAgLTIwMCw2ICszMTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNhcHBlbmQoYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kWigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoYm9vbGVhbikKQEAgLTIxNSw2ICszMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNjYXBhY2l0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhcGFjaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jYXBhY2l0eSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNhcGFjaXR5KCkKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CkBAIC0yMjYsNiArMzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjY2hhckF0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hhckF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGFyQXRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgY2hhciBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNoYXJBdChpbnQpCiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGNoYXIiLCAncycsIHRlc3RCdWZmZXIuY2hhckF0KDMpKTsKQEAgLTI0NCw2ICszODUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNkZWxldGUoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlbGV0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWxldGVJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5kZWxldGUoaW50LCBpbnQpCkBAIC0yNzUsNiArNDI1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjZGVsZXRlQ2hhckF0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWxldGVDaGFyQXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZUNoYXJBdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuZGVsZXRlQ2hhckF0KGludCkKQEAgLTI4Niw2ICs0NDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNlbnN1cmVDYXBhY2l0eShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5zdXJlQ2FwYWNpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Vuc3VyZUNhcGFjaXR5SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5lbnN1cmVDYXBhY2l0eShpbnQpCiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwpAQCAtMjk3LDYgKzQ2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2dldENoYXJzKGludCwgaW50LCBjaGFyW10sIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2hhcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3MsIGNoYXJbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENoYXJzSUkkQ0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuZ2V0Q2hhcnMoaW50LCBpbnQsIGNoYXIKICAgICAgICAgLy8gW10sIGludCkKQEAgLTMxOSw2ICs0OTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNpbnNlcnQoaW50LCBjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGNoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJJEMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuaW5zZXJ0KGludCwgY2hhciBbXSkKQEAgLTM0Miw2ICs1MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNpbnNlcnQoaW50LCBjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydEkkQ0lJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmluc2VydChpbnQsIGNoYXIgW10sIGludCwgaW50KQpAQCAtMzY4LDYgKzU2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2luc2VydChpbnQsIGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5zZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5pbnNlcnQoaW50LCBjaGFyKQpAQCAtMzc5LDYgKzU4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2luc2VydChpbnQsIGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0SUQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuaW5zZXJ0KGludCwgZG91YmxlKQpAQCAtMzkwLDYgKzYwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2luc2VydChpbnQsIGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmluc2VydChpbnQsIGZsb2F0KQpAQCAtNDA1LDYgKzYyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2luc2VydChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0SUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuaW5zZXJ0KGludCwgaW50KQpAQCAtNDE2LDYgKzY0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2luc2VydChpbnQsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5zZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5pbnNlcnQoaW50LCBsb25nKQpAQCAtNDI3LDYgKzY2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI2luc2VydChpbnQsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5zZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuaW5zZXJ0KGludCwgamF2YS5sYW5nLk9iamVjdCkKQEAgLTQzOSw2ICs2ODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNpbnNlcnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0SUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmluc2VydChpbnQsIGphdmEubGFuZy5TdHJpbmcpCkBAIC00NTEsNiArNzA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjaW5zZXJ0KGludCwgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElaKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmluc2VydChpbnQsIGJvb2xlYW4pCkBAIC00NjIsNiArNzI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjbGVuZ3RoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sZW5ndGgoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5sZW5ndGgoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBsZW5ndGggcmV0dXJuZWQiLCAyMSwgdGVzdEJ1ZmZlci5sZW5ndGgoKSk7CkBAIC00NzAsNiArNzQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjcmVwbGFjZShpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXBsYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlcGxhY2VJSUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLnJlcGxhY2UoaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcpCkBAIC01MzEsNiArODE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjcmV2ZXJzZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJldmVyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JldmVyc2UoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmdCdWZmZXIucmV2ZXJzZSgpCkBAIC01NTIsNiArODQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjc2V0Q2hhckF0KGludCwgY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDaGFyQXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENoYXJBdElDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLnNldENoYXJBdChpbnQsIGNoYXIpCiAgICAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigiSGVsbG9Xb3JsZCIpOwpAQCAtNTYyLDYgKzg2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI3NldExlbmd0aChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRMZW5ndGhJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLnNldExlbmd0aChpbnQpCiAgICAgICAgIHRlc3RCdWZmZXIuc2V0TGVuZ3RoKDEwMDApOwpAQCAtNTc3LDYgKzg4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyI3N1YnN0cmluZyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3Vic3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdWJzdHJpbmdJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLnN1YnN0cmluZyhpbnQpCkBAIC01ODcsNiArOTA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjc3Vic3RyaW5nKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdWJzdHJpbmdJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5zdWJzdHJpbmcoaW50LCBpbnQpCkBAIC01OTcsNiArOTI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TdHJpbmdCdWZmZXIudG9TdHJpbmcoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdHJpbmcgdmFsdWUgcmV0dXJuZWQiLCAiVGhpcyBpcyBhIHRlc3QgYnVmZmVyIiwgdGVzdEJ1ZmZlci50b1N0cmluZygpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0cmluZ0J1ZmZlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nQnVmZmVyVGVzdC5qYXZhCmluZGV4IDZjZTFhOWIuLjczNDcxNDcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nQnVmZmVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nQnVmZmVyVGVzdC5qYXZhCkBAIC0xNiwxOCArMTYsMzMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaW5nQnVmZmVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTdHJpbmdCdWZmZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjc2V0TGVuZ3RoKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldExlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGVuZ3RoSSgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS05MAogICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiYWJjZGUiKTsKQEAgLTQyLDYgKzU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFN0cmluZ0J1ZmZlci5TdHJpbmdCdWZmZXIoQ2hhclNlcXVlbmNlKTsKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmdCdWZmZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25zdHJ1Y3RvckxqYXZhX2xhbmdfQ2hhclNlcXVlbmNlKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IFN0cmluZ0J1ZmZlcigoQ2hhclNlcXVlbmNlKSBudWxsKTsKQEAgLTUwLDcgKzc0LDE1IEBACiAgICAgICAgIAogICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2VydCAxOiBtdXN0IGVxdWFsICdhYmMnLiIsICJhYmMiLCBuZXcgU3RyaW5nQnVmZmVyKChDaGFyU2VxdWVuY2UpImFiYyIpLnRvU3RyaW5nKCkpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJpbVRvU2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJpbVRvU2l6ZSgpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjUpOwogICAgICAgICBidWZmZXIuYXBwZW5kKCJhYmMiKTsKQEAgLTY1LDYgKzk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuYXBwZW5kKENoYXJTZXF1ZW5jZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19DaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgYXNzZXJ0U2FtZShzYiwgc2IuYXBwZW5kKChDaGFyU2VxdWVuY2UpICJhYiIpKTsKQEAgLTgwLDYgKzEyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmFwcGVuZChDaGFyU2VxdWVuY2UsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19DaGFyU2VxdWVuY2VJSSgpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtMTAyLDYgKzE1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmFwcGVuZChjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmQkQ0lJXzIoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBvYmogPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgIHRyeSB7CkBAIC0xMTUsNiArMTc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuYXBwZW5kKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kJENJSV8zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBvYmogPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgIHRyeSB7CkBAIC0xMjgsNiArMTk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuaW5zZXJ0KGludCwgQ2hhclNlcXVlbmNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElMamF2YV9sYW5nX0NoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDAwMCI7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZml4dHVyZSk7CkBAIC0xNzAsNiArMjQ3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuaW5zZXJ0KGludCwgQ2hhclNlcXVlbmNlLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5zZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElMamF2YV9sYW5nX0NoYXJTZXF1ZW5jZUlJKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMDAwIjsKQEAgLTI1Miw2ICszMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5pbnNlcnQoaW50LCBjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElDKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgb2JqID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICB0cnkgewpAQCAtMjY1LDYgKzM2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmFwcGVuZENvZGVQb2ludChpbnQpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmRDb2RlUG9pbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZENvZGVQb2ludEkoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgc2IuYXBwZW5kQ29kZVBvaW50KDB4MTAwMDApOwpAQCAtMjc4LDYgKzM4MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNvZGVQb2ludEF0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29kZVBvaW50QXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvZGVQb2ludEF0SSgpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiYWJjIik7CiAgICAgICAgIGFzc2VydEVxdWFscygnYScsIHNiLmNvZGVQb2ludEF0KDApKTsKQEAgLTMxMyw2ICs0MjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5jb2RlUG9pbnRCZWZvcmUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb2RlUG9pbnRCZWZvcmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvZGVQb2ludEJlZm9yZUkoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoImFiYyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBzYi5jb2RlUG9pbnRCZWZvcmUoMSkpOwpAQCAtMzQ4LDYgKzQ3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNvZGVQb2ludENvdW50KGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb2RlUG9pbnRDb3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb2RlUG9pbnRDb3VudElJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3IFN0cmluZ0J1ZmZlcigiXHVEODAwXHVEQzAwIikuY29kZVBvaW50Q291bnQoMCwgMikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3IFN0cmluZ0J1ZmZlcigiXHVEODAwXHVEQzAxIikuY29kZVBvaW50Q291bnQoMCwgMikpOwpAQCAtMzgzLDYgKzUxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmdldENoYXJzKGludCwgaW50LCBjaGFyW10sIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBjaGFyW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyc0lJJENJKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgb2JqID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICB0cnkgewpAQCAtMzk5LDYgKzUzOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLm9mZnNldEJ5Q29kZVBvaW50cyhpbnQsIGludCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9mZnNldEJ5Q29kZVBvaW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vZmZzZXRCeUNvZGVQb2ludHNJSSgpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoImFcdUQ4MDBcdURDMDBiIikub2Zmc2V0QnlDb2RlUG9pbnRzKDAsIDIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0KTsKQEAgLTQ2NCw2ICs2MTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubGFuZy5TdHJpbmdCdWZmZXIjaW5kZXhPZihTdHJpbmcsIGludCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0luZGV4T2ZTdHJpbmdJbnQoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAxMjM0NTY3ODkiOwpAQCAtNDk0LDYgKzY1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciNsYXN0SW5kZXhPZihTdHJpbmcsIGludCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3RJbmRleE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9sYXN0SW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDEyMzQ1Njc4OSI7CkBAIC01MzksNiArNzA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IFN0cmluZ0J1ZmZlcigiMDEyMzQ1Njc4OSIpLApAQCAtNTQ4LDYgKzcyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IFN0cmluZ0J1ZmZlcigiMDEyMzQ1Njc4OSIpLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyVGVzdC5qYXZhCmluZGV4IDA2MGI5NTMuLjhmMDVkMGUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nQnVpbGRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0cmluZ0J1aWxkZXJUZXN0LmphdmEKQEAgLTE3LDE5ICsxNywzNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaW5nQnVpbGRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RyaW5nQnVpbGRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuU3RyaW5nQnVpbGRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZ0J1aWxkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYik7CkBAIC0zOSw2ICs1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5TdHJpbmdCdWlsZGVyKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nQnVpbGRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjQpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHNiKTsKQEAgLTU3LDYgKzgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLlN0cmluZ0J1aWxkZXIoQ2hhclNlcXVlbmNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmdCdWlsZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19DaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigoQ2hhclNlcXVlbmNlKSAiZml4dHVyZSIpOwpAQCAtNzgsNiArMTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLlN0cmluZ0J1aWxkZXIoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmdCdWlsZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIHNiLnRvU3RyaW5nKCkpOwpAQCAtOTMsNiArMTM1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRaKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgYXNzZXJ0U2FtZShzYiwgc2IuYXBwZW5kKHRydWUpKTsKQEAgLTEwNSw2ICsxNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZEMoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBhc3NlcnRTYW1lKHNiLCBzYi5hcHBlbmQoJ2EnKSk7CkBAIC0xMTcsNiArMTc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kJEMoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBhc3NlcnRTYW1lKHNiLCBzYi5hcHBlbmQobmV3IGNoYXJbXSB7ICdhJywgJ2InIH0pKTsKQEAgLTEzNSw2ICsyMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZCRDSUkoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBhc3NlcnRTYW1lKHNiLCBzYi5hcHBlbmQobmV3IGNoYXJbXSB7ICdhJywgJ2InIH0sIDAsIDIpKTsKQEAgLTE4Nyw2ICsyNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKENoYXJTZXF1ZW5jZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19DaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBhc3NlcnRTYW1lKHNiLCBzYi5hcHBlbmQoKENoYXJTZXF1ZW5jZSkgImFiIikpOwpAQCAtMjAyLDYgKzI4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoQ2hhclNlcXVlbmNlLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZExqYXZhX2xhbmdfQ2hhclNlcXVlbmNlSUkoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMjI0LDYgKzMyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZEQoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBhc3NlcnRTYW1lKHNiLCBzYi5hcHBlbmQoMUQpKTsKQEAgLTI1NCw2ICszNTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kRigpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGFzc2VydFNhbWUoc2IsIHNiLmFwcGVuZCgxRikpOwpAQCAtMjg0LDYgKzM5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZEkoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBhc3NlcnRTYW1lKHNiLCBzYi5hcHBlbmQoMSkpOwpAQCAtMzA1LDYgKzQyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTCgpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGFzc2VydFNhbWUoc2IsIHNiLmFwcGVuZCgxTCkpOwpAQCAtMzI2LDYgKzQ1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoT2JqZWN0KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBhc3NlcnRTYW1lKHNiLCBzYi5hcHBlbmQoRml4dHVyZS5JTlNUQU5DRSkpOwpAQCAtMzM5LDYgKzQ4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGFzc2VydFNhbWUoc2IsIHNiLmFwcGVuZCgiYWIiKSk7CkBAIC0zNTQsNiArNTA0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChTdHJpbmdCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nQnVmZmVyKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgYXNzZXJ0U2FtZShzYiwgc2IuYXBwZW5kKG5ldyBTdHJpbmdCdWZmZXIoImFiIikpKTsKQEAgLTM2OSw2ICs1MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kQ29kZVBvaW50KGludCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZENvZGVQb2ludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ29kZVBvaW50SSgpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIHNiLmFwcGVuZENvZGVQb2ludCgweDEwMDAwKTsKQEAgLTM4Miw2ICs1NTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuY2FwYWNpdHkoKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FwYWNpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NhcGFjaXR5KCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDE2LCBzYi5jYXBhY2l0eSgpKTsKQEAgLTM5Miw2ICs1NjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuY2hhckF0KGludCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoYXJBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hhckF0SSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTQyMiw2ICs2MDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuY29kZVBvaW50QXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb2RlUG9pbnRBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29kZVBvaW50QXRJKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImFiYyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBzYi5jb2RlUG9pbnRBdCgwKSk7CkBAIC00NTksNiArNjU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmNvZGVQb2ludEJlZm9yZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvZGVQb2ludEJlZm9yZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29kZVBvaW50QmVmb3JlSSgpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJhYmMiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdhJywgc2IuY29kZVBvaW50QmVmb3JlKDEpKTsKQEAgLTQ5Nyw2ICs3MDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuY29kZVBvaW50Q291bnQoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvZGVQb2ludENvdW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvZGVQb2ludENvdW50SUkoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXcgU3RyaW5nQnVpbGRlcigiXHVEODAwXHVEQzAwIikuY29kZVBvaW50Q291bnQoMCwgMikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3IFN0cmluZ0J1aWxkZXIoIlx1RDgwMFx1REMwMSIpLmNvZGVQb2ludENvdW50KDAsIDIpKTsKQEAgLTUzMyw2ICs3NDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuZGVsZXRlKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWxldGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlSUkoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAxMjM0NTY3ODkiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC01NzcsNiArNzk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmRlbGV0ZUNoYXJBdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlbGV0ZUNoYXJBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlQ2hhckF0SSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTYxNyw2ICs4NDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuZW5zdXJlQ2FwYWNpdHkoaW50KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5zdXJlQ2FwYWNpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Vuc3VyZUNhcGFjaXR5SSgpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoNSwgc2IuY2FwYWNpdHkoKSk7CkBAIC02MzEsNiArODcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmdldENoYXJzKGludCwgaW50LCBjaGFyW10sIGludCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBjaGFyW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyc0lJJENJKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMTIzNDU2Nzg5IjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtNzAyLDYgKzk1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5pbmRleE9mKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5kZXhPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTcyMSw2ICs5NzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuaW5kZXhPZihTdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5kZXhPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSW5kZXhPZlN0cmluZ0ludCgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTc1MCw2ICsxMDE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmluc2VydChpbnQsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0SVooKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAwMDAiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC03OTIsNiArMTA2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5pbnNlcnQoaW50LCBjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGNoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0SUMoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAwMDAiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC04MzksNiArMTEyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5pbnNlcnQoaW50LCBjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElDXzIoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgb2JqID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgdHJ5IHsKQEAgLTg1Miw2ICsxMTQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmluc2VydChpbnQsIGNoYXJbXSknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGNoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJJEMoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAwMDAiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC05MDMsNiArMTIwNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5pbnNlcnQoaW50LCBjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydEkkQ0lJKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMDAwIjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtOTkzLDYgKzEzMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuaW5zZXJ0KGludCwgQ2hhclNlcXVlbmNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElMamF2YV9sYW5nX0NoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDAwMCI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTEwMzUsNiArMTM1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5pbnNlcnQoaW50LCBDaGFyU2VxdWVuY2UsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0SUxqYXZhX2xhbmdfQ2hhclNlcXVlbmNlSUkoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAwMDAiOwpAQCAtMTExNyw2ICsxNDQ3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmluc2VydChpbnQsIGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5zZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElEKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMDAwIjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtMTE1OSw2ICsxNDk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmluc2VydChpbnQsIGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJRigpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDAwMCI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTEyMDEsNiArMTU0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5pbnNlcnQoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJSSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDAwMCI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTEyNDMsNiArMTYwMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5pbnNlcnQoaW50LCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElKKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMDAwIjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtMTI4NSw2ICsxNjUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmluc2VydChpbnQsIE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5zZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRJTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAwMDAiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC0xMzI3LDYgKzE3MDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuaW5zZXJ0KGludCwgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnNlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luc2VydElMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDAwMCI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTEzNjksNiArMTc1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5sYXN0SW5kZXhPZihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3RJbmRleE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGFzdEluZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTEzODgsNiArMTc4MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5sYXN0SW5kZXhPZihTdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGFzdEluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xhc3RJbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMTIzNDU2Nzg5IjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtMTQxNyw2ICsxODE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmxlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGVuZ3RoKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNiLmxlbmd0aCgpKTsKQEAgLTE0MjcsNiArMTgzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5vZmZzZXRCeUNvZGVQb2ludHMoaW50LCBpbnQpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvZmZzZXRCeUNvZGVQb2ludHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb2Zmc2V0QnlDb2RlUG9pbnRzSUkoKSB7CiAgICAgICAgIGludCByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigiYVx1RDgwMFx1REMwMGIiKS5vZmZzZXRCeUNvZGVQb2ludHMoMCwgMik7CiAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXN1bHQpOwpAQCAtMTQ5Myw2ICsxOTEzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnJlcGxhY2UoaW50LCBpbnQsIFN0cmluZyknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlcGxhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVwbGFjZUlJTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAwMDAiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC0xNTU2LDYgKzE5ODUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIucmV2ZXJzZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJldmVyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JldmVyc2UoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAxMjM0NTY3ODkiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC0xNTc4LDYgKzIwMTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuc2V0Q2hhckF0KGludCwgY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2hhckF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRDaGFyQXRJQygpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDAwMCI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTE2MTUsNiArMjA2MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5zZXRMZW5ndGgoaW50KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRMZW5ndGhJKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMTIzNDU2Nzg5IjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtMTYzOSw2ICsyMDk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnN1YlNlcXVlbmNlKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1YlNlcXVlbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1YlNlcXVlbmNlSUkoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAxMjM0NTY3ODkiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC0xNjgwLDYgKzIxNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuc3Vic3RyaW5nKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3Vic3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdWJzdHJpbmdJKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMTIzNDU2Nzg5IjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtMTcxNCw2ICsyMTg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnN1YnN0cmluZyhpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3Vic3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1YnN0cmluZ0lJKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZml4dHVyZSA9ICIwMTIzNDU2Nzg5IjsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpeHR1cmUpOwpAQCAtMTc1NSw2ICsyMjM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpeHR1cmUgPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaXh0dXJlKTsKQEAgLTE3NjQsNiArMjI1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci50cmltVG9TaXplKCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRyaW1Ub1NpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyaW1Ub1NpemUoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaXh0dXJlID0gIjAxMjM0NTY3ODkiOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZml4dHVyZSk7CkBAIC0xNzkyLDYgKzIyOTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IFN0cmluZ0J1aWxkZXIoIjAxMjM0NTY3ODkiKSwKQEAgLTE4MDEsNiArMjMxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IFN0cmluZ0J1aWxkZXIoIjAxMjM0NTY3ODkiKSwKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCA4ZmZlYjNhLi5iNzhjYWQwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24jU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUgPSBuZXcgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uI1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSA9IG5ldyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmdUZXN0LmphdmEKaW5kZXggYzFmYWYyOS4uNjJiMzdmNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmdUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmdUZXN0LmphdmEKQEAgLTE3LDExICsxNywxNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaW5nLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTdHJpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uc3RydWN0b3I8U3RyaW5nPiBVTlNBRkVfQ09OU1RSVUNUT1I7CkBAIC01Myw2ICs1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ3JlYXRlZCBpbmNvcnJlY3Qgc3RyaW5nIiwgIiIsIG5ldyBTdHJpbmcoKSk7CiAgICAgfQpAQCAtNjAsNiArNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEIoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGNyZWF0ZSBzdHJpbmciLCAiSGVsbG9Xb3JsZCIsIG5ldyBTdHJpbmcoCiAgICAgICAgICAgICAgICAgIkhlbGxvV29ybGQiLmdldEJ5dGVzKCkpKTsKQEAgLTY4LDYgKzkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGJ5dGVbXSwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCSSgpIHsKICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKG5ldyBieXRlW10geyA2NSwgNjYsIDY3LCA2OCwgNjkgfSwgMCk7CkBAIC03OSw2ICsxMTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJKCkgewogICAgICAgICBieXRlW10gaHdiYSA9ICJIZWxsb1dvcmxkIi5nZXRCeXRlcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBjcmVhdGUgc3RyaW5nIiwgIkhlbGxvV29ybGQiLCBuZXcgU3RyaW5nKGh3YmEsCkBAIC05NCw2ICsxMzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoYnl0ZVtdLCBpbnQsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCSUlJKCkgewogICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcobmV3IGJ5dGVbXSB7IDY1LCA2NiwgNjcsIDY4LCA2OSB9LCAwLCAxLCAzKTsKQEAgLTEwNSw2ICsxNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoYnl0ZVtdLCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKG5ldyBieXRlW10geyA2NSwgNjYsIDY3LCA2OCwgNjkgfSwgMCwgNSwgIjg4NTlfMSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdHJpbmcgcmV0dXJuZWQ6ICIgKyBzLCAiQUJDREUiLCBzKTsKQEAgLTEyMCw2ICsxODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZyNTdHJpbmcoYnl0ZVtdLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQkxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhuZXcgYnl0ZVtdIHsgNjUsIDY2LCA2NywgNjgsIDY5IH0sICI4ODU5XzEiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc3RyaW5nIHJldHVybmVkOiAiICsgcywgIkFCQ0RFIiwgcyk7CkBAIC0xMjgsNiArMTk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGNoYXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRDKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCBDb25zdHJ1Y3RvciB0ZXN0IiwgIldvcmxkIiwgbmV3IFN0cmluZyhuZXcgY2hhcltdIHsKICAgICAgICAgICAgICAgICAnVycsICdvJywgJ3InLCAnbCcsICdkJyB9KSk7CkBAIC0xMzYsNiArMjE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJENJSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjaGFyW10gYnVmID0geyAnSCcsICdlJywgJ2wnLCAnbCcsICdvJywgJ1cnLCAnbycsICdyJywgJ2wnLCAnZCcgfTsKICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CkBAIC0xNTEsNiArMjM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZygiSGVsbG8gV29ybGQiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gY29uc3RydWN0IGNvcnJlY3Qgc3RyaW5nIiwgIkhlbGxvIFdvcmxkIiwgcyk7CkBAIC0xNTksNiArMjU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdCdWZmZXIoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgc2IuYXBwZW5kKCJIZWxsb1dvcmxkIik7CkBAIC0xNjgsNiArMjczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZ0J1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nQnVpbGRlcigpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDMyKTsKICAgICAgICAgc2IuYXBwZW5kKCJIZWxsb1dvcmxkIik7CkBAIC0xODMsNiArMjk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjU3RyaW5nKGludFtdLGludCxpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkSUlJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvV29ybGQiLCBuZXcgU3RyaW5nKG5ldyBpbnRbXSB7ICdIJywgJ2UnLCAnbCcsICdsJywKICAgICAgICAgICAgICAgICAnbycsICdXJywgJ28nLCAncicsICdsJywgJ2QnIH0sIDAsIDEwKSk7CkBAIC0yMzEsNiArMzU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjY29udGVudEVxdWFscyhDaGFyU2VxdWVuY2UpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRlbnRFcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250ZW50RXF1YWxzTGphdmFfbGFuZ19DaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIFN0cmluZyBzID0gImFiYyI7CiAgICAgICAgIGFzc2VydFRydWUocy5jb250ZW50RXF1YWxzKChDaGFyU2VxdWVuY2UpIG5ldyBTdHJpbmdCdWZmZXIoImFiYyIpKSk7CkBAIC0yNTIsNiArMzg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmcjY29udGVudEVxdWFscyhTdHJpbmdCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRlbnRFcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZ0J1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9ib29sZWFuX2NvbnRlbnRFcXVhbHNfU3RyaW5nQnVmZmVyKCkgewogICAgICAgICBTdHJpbmcgcyA9ICJhYmMiOwpAQCAtMjc1LDYgKzQxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nI2NvbnRhaW5zKENoYXJTZXF1ZW5jZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMamF2YV9sYW5nX0NoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgU3RyaW5nIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwpAQCAtMjk3LDYgKzQ0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3RyaW5nLm9mZnNldEJ5Q29kZVBvaW50cyhpbnQsIGludCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9mZnNldEJ5Q29kZVBvaW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vZmZzZXRCeUNvZGVQb2ludHNJSSgpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IG5ldyBTdHJpbmcoImFcdUQ4MDBcdURDMDBiIikub2Zmc2V0QnlDb2RlUG9pbnRzKDAsIDIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0KTsKQEAgLTQyMCw2ICs1NzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuY29kZVBvaW50QXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb2RlUG9pbnRBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29kZVBvaW50QXRJKCkgewogICAgICAgICBTdHJpbmcgcyA9ICJhYmMiOwogICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBzLmNvZGVQb2ludEF0KDApKTsKQEAgLTQ4MSw2ICs2NDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuY29kZVBvaW50QmVmb3JlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29kZVBvaW50QmVmb3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb2RlUG9pbnRCZWZvcmVJKCkgewogICAgICAgICBTdHJpbmcgcyA9ICJhYmMiOwogICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBzLmNvZGVQb2ludEJlZm9yZSgxKSk7CkBAIC01NDIsNiArNzE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmNvZGVQb2ludENvdW50KGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb2RlUG9pbnRDb3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb2RlUG9pbnRDb3VudElJKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgIlx1RDgwMFx1REMwMCIuY29kZVBvaW50Q291bnQoMCwgMikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgIlx1RDgwMFx1REMwMSIuY29kZVBvaW50Q291bnQoMCwgMikpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9TeXN0ZW1UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N5c3RlbVRlc3QuamF2YQppbmRleCA1MDc4NjNhLi5kNzFjMDYzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N5c3RlbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1N5c3RlbVRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yNSwxMCArMzAsMTAgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCitAVGVzdFRhcmdldENsYXNzKFN5c3RlbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3lzdGVtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBzdGF0aWMgYm9vbGVhbiBmbGFnID0gZmFsc2U7CkBAIC0zOCw2ICs0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3lzdGVtI3NldEluKGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5MamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKICAgICAgICAgSW5wdXRTdHJlYW0gb3JnSW4gPSBTeXN0ZW0uaW47CiAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsKQEAgLTQ5LDYgKzYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jc2V0T3V0KGphdmEuaW8uUHJpbnRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE91dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlByaW50U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE91dExqYXZhX2lvX1ByaW50U3RyZWFtKCkgewogICAgICAgICBQcmludFN0cmVhbSBvcmdPdXQgPSBTeXN0ZW0ub3V0OwogICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKQEAgLTYwLDYgKzgzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jc2V0RXJyKGphdmEuaW8uUHJpbnRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEVyciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlByaW50U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVyckxqYXZhX2lvX1ByaW50U3RyZWFtKCkgewogICAgICAgICBQcmludFN0cmVhbSBvcmdFcnIgPSBTeXN0ZW0uZXJyOwogICAgICAgICBQcmludFN0cmVhbSBlcnIgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKQEAgLTcyLDYgKzEwNCwxNiBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3lzdGVtI2FycmF5Y29weShqYXZhLmxhbmcuT2JqZWN0LCBpbnQsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMsIGFuZCBib3VuZGFyeSBjYXNlcyB3aGljaCBkZXNjcmliZWQgIiArCisgICAgICAgICAgICAiaW4gdGhlIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXljb3B5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXJyYXljb3B5TGphdmFfbGFuZ19PYmplY3RJTGphdmFfbGFuZ19PYmplY3RJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkoamF2YS5sYW5nLk9iamVjdCwKICAgICAgICAgLy8gaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGludCkKQEAgLTEwMyw2ICsxNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImN1cnJlbnRUaW1lTWlsbGlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jdXJyZW50VGltZU1pbGxpcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCiAgICAgICAgIHRyeSB7CkBAIC0xMjIsNiArMTczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jZXhpdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGl0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9leGl0SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlN5c3RlbS5leGl0KGludCkKICAgICAgICAgLy8gVGVzdGVkIGluIGRlc3RydWN0aXZlIHRlc3Q6IFRlc3RfU3lzdGVtX0V4aXQgPz8/CkBAIC0xMzAsNyArMTkwLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jZ2V0UHJvcGVydGllcygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0aWVzKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm9wZXJ0aWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0UHJvcGVydGllcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGphdmEubGFuZy5TeXN0ZW0uZ2V0UHJvcGVydGllcygpCiAgICAgICAgIFByb3BlcnRpZXMgcCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBwcm9wZXJ0aWVzIHJldHVybmVkIiwgcC5nZXRQcm9wZXJ0eSgKQEAgLTE1NSw3ICsyMjQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN5c3RlbSNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3BlcnR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEubGFuZy5TeXN0ZW0uZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJldHVybiBjb3JyZWN0IHByb3BlcnR5IHZhbHVlIiwgU3lzdGVtCkBAIC0xOTUsNyArMjczLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm9wZXJ0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRQcm9wZXJ0eUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEubGFuZy5TeXN0ZW0uZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJldHVybiBjb3JyZWN0IHByb3BlcnR5IHZhbHVlOiAiCkBAIC0yMDgsNiArMjk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jc2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UHJvcGVydHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0eUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEubGFuZy5TeXN0ZW0uc2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKQEAgLTIzMSw2ICszMjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlN5c3RlbSNnZXRTZWN1cml0eU1hbmFnZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZWN1cml0eU1hbmFnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5TWFuYWdlcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIKICAgICAgICAgLy8gamF2YS5sYW5nLlN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKQpAQCAtMjQxLDYgKzM0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaWRlbnRpdHlIYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lkZW50aXR5SGFzaENvZGVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludAogICAgICAgICAvLyBqYXZhLmxhbmcuU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoamF2YS5sYW5nLk9iamVjdCkKQEAgLTI1OCw3ICszNzIsMTYgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jaW5oZXJpdGVkQ2hhbm5lbCgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9pbmhlcml0ZWRDaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5oZXJpdGVkQ2hhbm5lbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2luaGVyaXRlZENoYW5uZWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFubmVsIGlDaGFubmVsID0gU3lzdGVtLmluaGVyaXRlZENoYW5uZWwoKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IHZhbHVlIG9mIGNoYW5uZWwiLCBpQ2hhbm5lbCk7CiAgICAgICAgIFNlbGVjdG9yUHJvdmlkZXIgc3AgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCk7CkBAIC0yODEsNiArNDA0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jcnVuRmluYWxpemF0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicnVuRmluYWxpemF0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ydW5GaW5hbGl6YXRpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5TeXN0ZW0ucnVuRmluYWxpemF0aW9uKCkKIApAQCAtMjk5LDYgKzQzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuU3lzdGVtI3J1bkZpbmFsaXplcnNPbkV4aXQoYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIHdpdGggdHJ1ZSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicnVuRmluYWxpemVyc09uRXhpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcnVuRmluYWxpemVyc09uRXhpdFooKSB7CiAgICAgICAgIC8vIENhbiB3ZSBjYWxsIHRoZSBtZXRob2QgYXQgbGVhc3Q/CkBAIC0zMTIsNiArNDUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5TeXN0ZW0jc2V0UHJvcGVydGllcyhqYXZhLnV0aWwuUHJvcGVydGllcykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UHJvcGVydGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuUHJvcGVydGllcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0aWVzTGphdmFfdXRpbF9Qcm9wZXJ0aWVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmxhbmcuU3lzdGVtLnNldFByb3BlcnRpZXMoamF2YS51dGlsLlByb3BlcnRpZXMpCkBAIC0zMzEsNiArNDgxLDE1IEBACiAgICAgfQogCiAgICAgLy9SZWdyZXNzaW9uIFRlc3QgZm9yIEhhcm1vbnktMjM1NgorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRlbnYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW52VW5tb2RpZmlhYmxlKCkgewogICAgICAgICBNYXAgbWFwID0gU3lzdGVtLmdldGVudigpOwogICAgICAgICB0cnkgewpAQCAtNDExLDcgKzU3MCwyMCBAQAogICAgICAgICB9CiAKICAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNlY3VyaXR5TWFuYWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlY3VyaXR5TWFuYWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKIAorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTZWN1cml0eU1hbmFnZXJMamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlcigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgU2VjdXJpdHlNYW5hZ2VyIiwKICAgICAgICAgICAgICAgICBudWxsLCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWREZWF0aFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyZWFkRGVhdGhUZXN0LmphdmEKaW5kZXggYjE5ZTg4NC4uNTQ0NzAwZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWREZWF0aFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1RocmVhZERlYXRoVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMjYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoVGhyZWFkRGVhdGguY2xhc3MpIAogcHVibGljIGNsYXNzIFRocmVhZERlYXRoVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZERlYXRoI1RocmVhZERlYXRoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGhyZWFkRGVhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBUaHJlYWREZWF0aCB0ZCA9IG5ldyBUaHJlYWREZWF0aCgpOwogICAgICAgICBhc3NlcnROdWxsKHRkLmdldENhdXNlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWRHcm91cFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyZWFkR3JvdXBUZXN0LmphdmEKaW5kZXggZGRkZmU3OC4uNTIxYThmNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWRHcm91cFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1RocmVhZEdyb3VwVGVzdC5qYXZhCkBAIC0xNyw5ICsxNywxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorQFRlc3RUYXJnZXRDbGFzcyhUaHJlYWRHcm91cC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVGhyZWFkR3JvdXBUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIGltcGxlbWVudHMgVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciB7CiAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgCkBAIC02OSw2ICs3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjVGhyZWFkR3JvdXAoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGhyZWFkR3JvdXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlRocmVhZEdyb3VwKGphdmEubGFuZy5TdHJpbmcpCiAKQEAgLTkzLDYgKzEwOCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjVGhyZWFkR3JvdXAoamF2YS5sYW5nLlRocmVhZEdyb3VwLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUaHJlYWRHcm91cCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyZWFkR3JvdXAuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1RocmVhZEdyb3VwTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuVGhyZWFkR3JvdXAoamF2YS5sYW5nLlRocmVhZEdyb3VwLAogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMTM2LDYgKzE2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjYWN0aXZlQ291bnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY3RpdmVDb3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWN0aXZlQ291bnQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlRocmVhZEdyb3VwLmFjdGl2ZUNvdW50KCkKICAgICAgICAgVGhyZWFkR3JvdXAgdGcgPSBuZXcgVGhyZWFkR3JvdXAoImFjdGl2ZUNvdW50Iik7CkBAIC0xNjUsNiArMTk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWRHcm91cCNhY3RpdmVHcm91cENvdW50KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWN0aXZlR3JvdXBDb3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWN0aXZlR3JvdXBDb3VudCgpIHsKICAgICAgICAgVGhyZWFkR3JvdXAgdGcgPSBuZXcgVGhyZWFkR3JvdXAoImdyb3VwIGNvdW50Iik7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG51bWJlciBvZiBncm91cHMiLApAQCAtMTkwLDYgKzIzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjYWxsb3dUaHJlYWRTdXNwZW5zaW9uKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFsbG93VGhyZWFkU3VzcGVuc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWxsb3dUaHJlYWRTdXNwZW5zaW9uWigpIHsKICAgICAgICAgVGhyZWFkR3JvdXAgdGcgPSBuZXcgVGhyZWFkR3JvdXAoInRocmVhZCBzdXNwZW5zaW9uIik7CkBAIC0yMDMsNiArMjU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWRHcm91cCNjaGVja0FjY2VzcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrQWNjZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja0FjY2VzcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlRocmVhZEdyb3VwLmNoZWNrQWNjZXNzKCkKIApAQCAtMjI5LDYgKzI4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjZGVzdHJveSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlc3Ryb3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Rlc3Ryb3koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWRHcm91cC5kZXN0cm95KCkKIApAQCAtMjUwLDcgKzMxOSw3IEBACiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICA7CisgICAgICAgICAgICAKICAgICAgICAgICAgIGFzc2VydFRydWUoIkRlc3Ryb3llZCBjaGlsZCBjYW4ndCBiZSBkZXN0cm95ZWQgYWdhaW4iLCBwYXNzZWQpOwogICAgICAgICB9CiAKQEAgLTI2OSw3ICszMzgsNyBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICA7CisgICAgICAgIAogICAgICAgICBhc3NlcnRUcnVlKCJEYWVtb24gc2hvdWxkIGhhdmUgYmVlbiBkZXN0cm95ZWQgYWxyZWFkeSIsIHBhc3NlZCk7CiAKICAgICAgICAgcGFzc2VkID0gZmFsc2U7CkBAIC0yNzgsNyArMzQ3LDcgQEAKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgOworICAgICAgICAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGFlbW9uIHBhcmVudCBzaG91bGQgaGF2ZSBiZWVuIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5IiwKICAgICAgICAgICAgICAgICBwYXNzZWQpOwogCkBAIC0zMDMsNyArMzcyLDcgQEAKICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgaW50ZXJydXB0ZWQiKTsKICAgICAgICAgfQotICAgICAgICA7CisgICAgICAgIAogCiAgICAgICAgIHBhc3NlZCA9IGZhbHNlOwogICAgICAgICB0cnkgewpAQCAtMzExLDcgKzM4MCw3IEBACiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIDsKKyAgICAgICAgCiAgICAgICAgIGFzc2VydFRydWUoCiAgICAgICAgICAgICAgICAgIkRhZW1vbiBncm91cCBzaG91bGQgaGF2ZSBiZWVuIGRlc3Ryb3llZCBhbHJlYWR5IHdoZW4gbGFzdCB0aHJlYWQgZGllZCIsCiAgICAgICAgICAgICAgICAgcGFzc2VkKTsKQEAgLTM0Niw3ICs0MTUsNyBAQAogICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewogICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBiZSBpbnRlcnJ1cHRlZCIpOwogICAgICAgICB9Ci0gICAgICAgIDsKKyAgICAgICAgCiAgICAgICAgIHBhc3NlZCA9IHRydWU7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0ZXN0Um9vdC5kZXN0cm95KCk7CkBAIC0zNjIsNiArNDMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWRHcm91cCNkZXN0cm95KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVzdHJveSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVzdHJveV9zdWJ0ZXN0MCgpIHsKICAgICAgICAgVGhyZWFkR3JvdXAgZ3JvdXAxID0gbmV3IFRocmVhZEdyb3VwKCJ0ZXN0X2Rlc3Ryb3lfc3VidGVzdDAiKTsKICAgICAgICAgZ3JvdXAxLmRlc3Ryb3koKTsKQEAgLTM3NSw2ICs0NTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI2dldE1heFByaW9yaXR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4UHJpb3JpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heFByaW9yaXR5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5UaHJlYWRHcm91cC5nZXRNYXhQcmlvcml0eSgpCiAKQEAgLTM5OSw2ICs0ODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI2dldE5hbWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAuZ2V0TmFtZSgpCiAKQEAgLTQxNiw2ICs1MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI2dldFBhcmVudCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhcmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlRocmVhZEdyb3VwCiAgICAgICAgIC8vIGphdmEubGFuZy5UaHJlYWRHcm91cC5nZXRQYXJlbnQoKQpAQCAtNDc2LDYgKzU4MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjaW50ZXJydXB0KCkKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGludGVycnVwdGVkID0gZmFsc2U7CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImludGVycnVwdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ludGVycnVwdCgpIHsKICAgICAgICAgVGhyZWFkLnNldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIodGhpcyk7CiAgICAgICAgIFRocmVhZEdyb3VwIHRnID0gbmV3IFRocmVhZEdyb3VwKCJpbnRlcnJ1cHQiKTsKQEAgLTUwNCw2ICs2MTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI2lzRGFlbW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEYWVtb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRGFlbW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcuVGhyZWFkR3JvdXAuaXNEYWVtb24oKQogCkBAIC01MTUsNiArNjM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWRHcm91cCNpc0Rlc3Ryb3llZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRGVzdHJveWVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0Rlc3Ryb3llZCgpIHsKICAgICAgICAgZmluYWwgVGhyZWFkR3JvdXAgb3JpZ2luYWxDdXJyZW50ID0gZ2V0SW5pdGlhbFRocmVhZEdyb3VwKCk7CiAgICAgICAgIGZpbmFsIFRocmVhZEdyb3VwIHRlc3RSb290ID0gbmV3IFRocmVhZEdyb3VwKG9yaWdpbmFsQ3VycmVudCwKQEAgLTUzMCw2ICs2NjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI2xpc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9saXN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkR3JvdXAubGlzdCgpCiAKQEAgLTU4NCw2ICs3MjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI3BhcmVudE9mKGphdmEubGFuZy5UaHJlYWRHcm91cCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyZW50T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocmVhZEdyb3VwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcmVudE9mTGphdmFfbGFuZ19UaHJlYWRHcm91cCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS5sYW5nLlRocmVhZEdyb3VwLnBhcmVudE9mKGphdmEubGFuZy5UaHJlYWRHcm91cCkKQEAgLTYxOCw2ICs3NjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI3Jlc3VtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc3VtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXN1bWUoKSB0aHJvd3MgT3V0T2ZNZW1vcnlFcnJvciB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWRHcm91cC5yZXN1bWUoKQpAQCAtNjk5LDYgKzg1OCwxNyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjc2V0RGFlbW9uKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayB0aGF0IGRhZW1vbiB0aHJlYWQgZ3JvdXAgaXMgZGVzdHJveWVkIHdoZW4gIiArCisgICAgICAgICAgICAibGFzdCB0aHJlYWQgZnJvbSB0aGlzIGdyb3VwIGlzIHN0b3BwZWQgb3IgaXRzIGxhc3QgdGhyZWFkIGdyb3VwICIgKworICAgICAgICAgICAgImlzIGRlc3Ryb3llZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYWVtb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXREYWVtb25aKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkR3JvdXAuc2V0RGFlbW9uKGJvb2xlYW4pCiAKQEAgLTcwOSw2ICs4NzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI3NldE1heFByaW9yaXR5KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWF4UHJpb3JpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1heFByaW9yaXR5SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlRocmVhZEdyb3VwLnNldE1heFByaW9yaXR5KGludCkKIApAQCAtODMzLDYgKzEwMTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZEdyb3VwI3N0b3AoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdG9wIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB0aHJvd3MgT3V0T2ZNZW1vcnlFcnJvciB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWRHcm91cC5zdG9wKCkKQEAgLTg5OCw2ICsxMDg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWRHcm91cCNzdXNwZW5kKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VzcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXNwZW5kKCkgdGhyb3dzIE91dE9mTWVtb3J5RXJyb3IgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkR3JvdXAuc3VzcGVuZCgpCkBAIC05NjcsNiArMTE2NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5UaHJlYWRHcm91cC50b1N0cmluZygpCiAKQEAgLTEwMDUsNiArMTIxMSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAjdW5jYXVnaHRFeGNlcHRpb24oamF2YS5sYW5nLlRocmVhZCwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5jYXVnaHRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocmVhZC5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VuY2F1Z2h0RXhjZXB0aW9uTGphdmFfbGFuZ19UaHJlYWRMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyZWFkTG9jYWxUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1RocmVhZExvY2FsVGVzdC5qYXZhCmluZGV4IDFiNDFhZjIuLmM0MzUyYTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyZWFkTG9jYWxUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWRMb2NhbFRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFRocmVhZExvY2FsLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZExvY2FsI1RocmVhZExvY2FsKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGhyZWFkTG9jYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IFRocmVhZExvY2FsPE9iamVjdD4oKTsKQEAgLTM1LDYgKzUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWRMb2NhbCNyZW1vdmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSgpIHsKICAgICAgICAgVGhyZWFkTG9jYWw8U3RyaW5nPiB0bCA9IG5ldyBUaHJlYWRMb2NhbDxTdHJpbmc+KCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC01Myw2ICs3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkTG9jYWwjZ2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEubGFuZy5UaHJlYWRMb2NhbC5nZXQoKQogICAgICAgICBUaHJlYWRMb2NhbDxPYmplY3Q+IGwgPSBuZXcgVGhyZWFkTG9jYWw8T2JqZWN0PigpOwpAQCAtMTEzLDYgKzE0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkTG9jYWwjc2V0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWRMb2NhbC5zZXQoamF2YS5sYW5nLk9iamVjdCkKIApAQCAtMTU1LDYgKzE5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuSW5oZXJpdGFibGVUaHJlYWRMb2NhbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gInRoaXMgdGVzdCBpcyBmb3IgSW5oZXJpdGFibGVUaHJlYWRMb2NhbCBjbGFzcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUaHJlYWRMb2NhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfTGphdmFfbGFuZ19Jbmhlcml0YWJsZVRocmVhZExvY2FsKCkKICAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IG5ldyBPYmplY3QoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyZWFkVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWRUZXN0LmphdmEKaW5kZXggOGZmMTIwNC4uYmU1ZTg1MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UaHJlYWRUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5UaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitAVGVzdFRhcmdldENsYXNzKFRocmVhZC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVGhyZWFkVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBzdGF0aWMgY2xhc3MgU2ltcGxlVGhyZWFkIGltcGxlbWVudHMgUnVubmFibGUgewpAQCAtMTM4LDYgKzE0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI1RocmVhZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRocmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuVGhyZWFkKCkKIApAQCAtMTczLDYgKzE4OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI1RocmVhZChqYXZhLmxhbmcuUnVubmFibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRocmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuUnVubmFibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1J1bm5hYmxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlRocmVhZChqYXZhLmxhbmcuUnVubmFibGUpCiAgICAgICAgIHRyeSB7CkBAIC0xODYsNiArMjEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjVGhyZWFkKGphdmEubGFuZy5SdW5uYWJsZSwgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGhyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5SdW5uYWJsZS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfUnVubmFibGVMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5UaHJlYWQoamF2YS5sYW5nLlJ1bm5hYmxlLAogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMTk4LDYgKzIzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI1RocmVhZChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUaHJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlRocmVhZChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlRlc3RpbmciKTsKQEAgLTIwOSw2ICsyNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNUaHJlYWQoamF2YS5sYW5nLlRocmVhZEdyb3VwLCBqYXZhLmxhbmcuUnVubmFibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRocmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyZWFkR3JvdXAuY2xhc3MsIGphdmEubGFuZy5SdW5uYWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfVGhyZWFkR3JvdXBMamF2YV9sYW5nX1J1bm5hYmxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlRocmVhZChqYXZhLmxhbmcuVGhyZWFkR3JvdXAsCiAgICAgICAgIC8vIGphdmEubGFuZy5SdW5uYWJsZSkKQEAgLTIyNyw2ICsyNzgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNUaHJlYWQoamF2YS5sYW5nLlRocmVhZEdyb3VwLCBqYXZhLmxhbmcuUnVubmFibGUsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRocmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyZWFkR3JvdXAuY2xhc3MsIGphdmEubGFuZy5SdW5uYWJsZS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfVGhyZWFkR3JvdXBMamF2YV9sYW5nX1J1bm5hYmxlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuVGhyZWFkKGphdmEubGFuZy5UaHJlYWRHcm91cCwKICAgICAgICAgLy8gamF2YS5sYW5nLlJ1bm5hYmxlLCBqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMjYxLDYgKzMyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI1RocmVhZChqYXZhLmxhbmcuVGhyZWFkR3JvdXAsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRocmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyZWFkR3JvdXAuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1RocmVhZEdyb3VwTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuVGhyZWFkKGphdmEubGFuZy5UaHJlYWRHcm91cCwKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKQEAgLTI3Myw2ICszNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNhY3RpdmVDb3VudCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFjdGl2ZUNvdW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hY3RpdmVDb3VudCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcuVGhyZWFkLmFjdGl2ZUNvdW50KCkKICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBTaW1wbGVUaHJlYWQoMSkpOwpAQCAtMjg4LDYgKzM2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI2NoZWNrQWNjZXNzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tBY2Nlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrQWNjZXNzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkLmNoZWNrQWNjZXNzKCkKICAgICAgICAgVGhyZWFkR3JvdXAgdGcgPSBuZXcgVGhyZWFkR3JvdXAoIlRlc3QgR3JvdXAzIik7CkBAIC0zMDksNiArMzk2LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjY291bnRTdGFja0ZyYW1lcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiaWYgdGhpcyB0aHJlYWQgaXMgbm90IHN1c3BlbmRlZCwgY291bnRTdGFja0ZyYW1lcygpIG1ldGhvZCAiICsKKyAgICAgICAgICAgICJzaG91bGQgdGhyb3cgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvdW50U3RhY2tGcmFtZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY291bnRTdGFja0ZyYW1lcygpIHsKICAgICAgICAgLyoKQEAgLTMyNSw2ICs0MjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNjdXJyZW50VGhyZWFkKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3VycmVudFRocmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3VycmVudFRocmVhZCgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKICAgICB9CkBAIC0zMzIsNiArNDM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjZGVzdHJveSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm9TdWNoTWV0aG9kRXJyb3Igc2hvdWxkIGJlIHRocm93bi4gTmVlZCB0byBhZGQgdmVyaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlc3Ryb3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVzdHJveSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTM0NSw3ICs0NjAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNlbnVtZXJhdGUoamF2YS5sYW5nLlRocmVhZFtdKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZW51bWVyYXRlJExqYXZhX2xhbmdfVGhyZWFkKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnVtZXJhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocmVhZFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9lbnVtZXJhdGUkTGphdmFfbGFuZ19UaHJlYWQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5sYW5nLlRocmVhZC5lbnVtZXJhdGUoamF2YS5sYW5nLlRocmVhZCBbXSkKICAgICAgICAgLy8gVGhlIHRlc3QgaGFzIGJlZW4gdXBkYXRlZCBhY2NvcmRpbmcgdG8gSEFSTU9OWS0xOTc0IEpJUkEgaXNzdWUuCiAKQEAgLTQzMCw2ICs1NTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb250ZXh0Q2xhc3NMb2FkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRleHRDbGFzc0xvYWRlcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzc0xvYWRlcgogICAgICAgICAvLyBqYXZhLmxhbmcuVGhyZWFkLmdldENvbnRleHRDbGFzc0xvYWRlcigpCkBAIC00NDQsNiArNTc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjZ2V0TmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5UaHJlYWQuZ2V0TmFtZSgpCiAgICAgICAgIHN0ID0gbmV3IFRocmVhZChuZXcgU2ltcGxlVGhyZWFkKDEpLCAiU2ltcGxlVGhyZWFkNiIpOwpAQCAtNDU1LDYgKzU5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI2dldFByaW9yaXR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpb3JpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaW9yaXR5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5UaHJlYWQuZ2V0UHJpb3JpdHkoKQogICAgICAgICBzdCA9IG5ldyBUaHJlYWQobmV3IFNpbXBsZVRocmVhZCgxKSk7CkBAIC00NjcsNiArNjE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjZ2V0VGhyZWFkR3JvdXAoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUaHJlYWRHcm91cCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VGhyZWFkR3JvdXAoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuVGhyZWFkR3JvdXAKICAgICAgICAgLy8gamF2YS5sYW5nLlRocmVhZC5nZXRUaHJlYWRHcm91cCgpCkBAIC01MDgsNiArNjY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjaW50ZXJydXB0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50ZXJydXB0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnRlcnJ1cHQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWQuaW50ZXJydXB0KCkKICAgICAgICAgZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7CkBAIC01NjksNiArNzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjaW50ZXJydXB0ZWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRlcnJ1cHRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50ZXJydXB0ZWQoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKCJJbnRlcnJ1cHRlZCByZXR1cm5lZCB0cnVlIGZvciBub24taW50ZXJydXB0ZWQgdGhyZWFkIiwgVGhyZWFkCiAgICAgICAgICAgICAgICAgLmludGVycnVwdGVkKCkpOwpAQCAtNTgwLDYgKzc1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI2lzQWxpdmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5lZWQgdG8gY2hlY2sgYWZ0ZXIgaW50ZXJydXB0KCksIGV0Yy4uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQWxpdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQWxpdmUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5UaHJlYWQuaXNBbGl2ZSgpCiAgICAgICAgIFNpbXBsZVRocmVhZCBzaW1wbGU7CkBAIC02MDQsNiArNzkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjaXNEYWVtb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RhZW1vbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNEYWVtb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5UaHJlYWQuaXNEYWVtb24oKQogICAgICAgICBzdCA9IG5ldyBUaHJlYWQobmV3IFNpbXBsZVRocmVhZCgxKSwgIlNpbXBsZVRocmVhZDEwIik7CkBAIC02MTYsNiArODEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjaXNJbnRlcnJ1cHRlZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSW50ZXJydXB0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSW50ZXJydXB0ZWQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5UaHJlYWQuaXNJbnRlcnJ1cHRlZCgpCiAgICAgICAgIGNsYXNzIFNwaW5UaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CkBAIC02NDksNiArODU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjam9pbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW50ZXJydXB0ZWRFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImpvaW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2pvaW4oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWQuam9pbigpCiAgICAgICAgIFNpbXBsZVRocmVhZCBzaW1wbGU7CkBAIC02ODAsNiArODk0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjam9pbihsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVycnVwdGVkRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJqb2luIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfam9pbkooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWQuam9pbihsb25nKQogICAgICAgICBTaW1wbGVUaHJlYWQgc2ltcGxlOwpAQCAtNzQ2LDYgKzk2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI2pvaW4obG9uZywgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVycnVwdGVkRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJqb2luIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9qb2luSkkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWQuam9pbihsb25nLCBpbnQpCiAgICAgICAgIFNpbXBsZVRocmVhZCBzaW1wbGU7CkBAIC04MDMsOCArMTAzNSwxNyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI3Jlc3VtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc3VtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZXN1bWUoKSB7CisgICAgcHVibGljIHZvaWQgX3Rlc3RfcmVzdW1lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkLnJlc3VtZSgpCiAgICAgICAgIGludCBvcmd2YWw7CiAgICAgICAgIFJlc1N1cFRocmVhZCB0OwpAQCAtODM1LDYgKzEwNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNydW4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJydW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3J1bigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlRocmVhZC5ydW4oKQogICAgICAgICBjbGFzcyBSdW5UaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CkBAIC04NjQsNiArMTExNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI3NldERhZW1vbihib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYWVtb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXREYWVtb25aKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkLnNldERhZW1vbihib29sZWFuKQogICAgICAgICBzdCA9IG5ldyBUaHJlYWQobmV3IFNpbXBsZVRocmVhZCgxKSwgIlNpbXBsZVRocmVhZDE0Iik7CkBAIC04ODYsNiArMTE0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLlRocmVhZC5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIHN0ID0gbmV3IFRocmVhZChuZXcgU2ltcGxlVGhyZWFkKDEpLCAiU2ltcGxlVGhyZWFkMTUiKTsKQEAgLTkwNSw2ICsxMTczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjc2V0UHJpb3JpdHkoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQcmlvcml0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJpb3JpdHlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkLnNldFByaW9yaXR5KGludCkKICAgICAgICAgc3QgPSBuZXcgVGhyZWFkKG5ldyBTaW1wbGVUaHJlYWQoMSkpOwpAQCAtOTE3LDYgKzExOTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNzbGVlcChsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVycnVwdGVkRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4gVGVzdCBuZWVkcyBlbmhhbmNpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2xlZXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zbGVlcEooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWQuc2xlZXAobG9uZykKIApAQCAtOTM1LDYgKzEyMjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNzbGVlcChsb25nLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBhcmUgbm90IHZlcmlmaWVkLiBUZXN0IG5lZWRzIHJldmlzaXRpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2xlZXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NsZWVwSkkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWQuc2xlZXAobG9uZywgaW50KQogCkBAIC05NTUsNiArMTI1MCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI3N0YXJ0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiAiICsKKyAgICAgICAgICAgICJUZXN0IG5lZWRzIHJldmlzaXRpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3RhcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkLnN0YXJ0KCkKICAgICAgICAgdHJ5IHsKQEAgLTk3OCw4ICsxMjgzLDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjc3RvcCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3AiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RvcCgpIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zdG9wKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkLnN0b3AoKQogICAgICAgICB0cnkgewogICAgICAgICAgICAgUnVubmFibGUgciA9IG5ldyBSZXNTdXBUaHJlYWQobnVsbCk7CkBAIC0xMDA2LDYgKzEzMjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNzdG9wKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZWN1cml0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdG9wIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0b3Bfc3VidGVzdDAoKSB7CiAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgidCIpOwpAQCAtMTA1OSw2ICsxMzgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjc3RvcChqYXZhLmxhbmcuVGhyb3dhYmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlY3VyaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3AiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0b3BMamF2YV9sYW5nX1Rocm93YWJsZV9zdWJ0ZXN0MCgpIHsKICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJ0Iik7CkBAIC0xMTE2LDggKzE0NDgsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNzdG9wKGphdmEubGFuZy5UaHJvd2FibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3AiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0b3BMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zdG9wTGphdmFfbGFuZ19UaHJvd2FibGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJlYWQuc3RvcChqYXZhLmxhbmcuVGhyb3dhYmxlKQogICAgICAgICBSZXNTdXBUaHJlYWQgdCA9IG5ldyBSZXNTdXBUaHJlYWQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CiAgICAgICAgIHN5bmNocm9uaXplZCAodCkgewpAQCAtMTE0NCw4ICsxNDg1LDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjc3VzcGVuZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1c3BlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VzcGVuZCgpIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zdXNwZW5kKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcuVGhyZWFkLnN1c3BlbmQoKQogICAgICAgICBpbnQgb3JndmFsOwogICAgICAgICBSZXNTdXBUaHJlYWQgdCA9IG5ldyBSZXNTdXBUaHJlYWQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CkBAIC0xMTk3LDYgKzE1NDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLlRocmVhZC50b1N0cmluZygpCiAgICAgICAgIFRocmVhZEdyb3VwIHRnID0gbmV3IFRocmVhZEdyb3VwKCJUZXN0IEdyb3VwNSIpOwpAQCAtMTIxNiw2ICsxNTc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjZ2V0QWxsU3RhY2tUcmFjZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGxTdGFja1RyYWNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxsU3RhY2tUcmFjZXMoKSB7CiAgICAgICAgIE1hcDxUaHJlYWQsIFN0YWNrVHJhY2VFbGVtZW50W10+IHN0TWFwID0gVGhyZWFkLmdldEFsbFN0YWNrVHJhY2VzKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoc3RNYXApOwpAQCAtMTIyNiw2ICsxNTk0LDE5IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjZ2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI3NldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldF9zZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkgewogICAgICAgICBjbGFzcyBIYW5kbGVyIGltcGxlbWVudHMgVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZCB0aHJlYWQsIFRocm93YWJsZSBleCkgewpAQCAtMTI0NCw2ICsxNjI1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjZ2V0U3RhY2tUcmFjZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN0YWNrVHJhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN0YWNrVHJhY2UoKSB7CiAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwogICAgICAgICAKQEAgLTEyNjcsNiArMTY1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyZWFkI2dldFN0YXRlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJhZGQgYWRkaXRpb25hbCBzdGF0ZSB0ZXN0cy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RhdGUoKSB7CiAgICAgICAgIFRocmVhZC5TdGF0ZSBzdGF0ZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhdGUoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzdGF0ZSk7CkBAIC0xMjc4LDYgKzE2NzcsMTkgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNnZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocmVhZCNzZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRfc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkgewogICAgICAgICBjbGFzcyBIYW5kbGVyIGltcGxlbWVudHMgVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZCB0aHJlYWQsIFRocm93YWJsZSBleCkgewpAQCAtMTI5Niw2ICsxNzA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjZ2V0SWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SWQoKSB7CiAgICAgICAgIGFzc2VydFRydWUoImN1cnJlbnQgdGhyZWFkJ3MgSUQgaXMgbm90IHBvc2l0aXZlIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpID4gMCk7CiAgICAgICAgIApAQCAtMTMwOSw2ICsxNzMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJlYWQjaG9sZExvY2soKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJob2xkc0xvY2siLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ob2xkc0xvY2soKSB7CiAgICAgICAgIE1vbml0b3JlZENsYXNzIG1vbml0b3IgPSBuZXcgTW9uaXRvcmVkQ2xhc3MoKTsKICAgICAgICAgCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Rocm93YWJsZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyb3dhYmxlVGVzdC5qYXZhCmluZGV4IDNmMTg5ZGYuLmQwZDRkYjYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyb3dhYmxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVGhyb3dhYmxlVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMzIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoVGhyb3dhYmxlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBUaHJvd2FibGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGhyb3dhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgVGhyb3dhYmxlIGUgPSBuZXcgVGhyb3dhYmxlKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGhyb3dhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgVGhyb3dhYmxlIGUgPSBuZXcgVGhyb3dhYmxlKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTQ2LDYgKzcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJvd2FibGUjZmlsbEluU3RhY2tUcmFjZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGxJblN0YWNrVHJhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbGxJblN0YWNrVHJhY2UoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuVGhyb3dhYmxlCiAgICAgICAgIC8vIGphdmEubGFuZy5UaHJvd2FibGUuZmlsbEluU3RhY2tUcmFjZSgpCkBAIC0xMjQsNiArMTU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRTdGFja1RyYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludFN0YWNrVHJhY2UoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5UaHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCkKICAgICAgICAgVGhyb3dhYmxlIHggPSBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiQSBUZXN0IE1lc3NhZ2UiKTsKQEAgLTE0Miw2ICsxODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRTdGFja1RyYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUHJpbnRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlTGphdmFfaW9fUHJpbnRTdHJlYW0oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEubGFuZy5UaHJvd2FibGUucHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0pCkBAIC0xNTgsNiArMjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50U3RhY2tUcmFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlByaW50V3JpdGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50U3RhY2tUcmFjZUxqYXZhX2lvX1ByaW50V3JpdGVyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmxhbmcuVGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyKQpAQCAtMTc1LDYgKzIzNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVGhyb3dhYmxlI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBUaHJvd2FibGUgZSA9IG5ldyBUaHJvd2FibGUoIlRocm93Iik7CiAgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlRocm93YWJsZTogVGhyb3ciLCBlLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UeXBlTm90UHJlc2VudEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVHlwZU5vdFByZXNlbnRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMWY4NjY0OC4uOGY3MzdiMzAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVHlwZU5vdFByZXNlbnRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9UeXBlTm90UHJlc2VudEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTYsMTMgKzE2LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlR5cGVOb3RQcmVzZW50RXhjZXB0aW9uLlR5cGVOb3RQcmVzZW50RXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUeXBlTm90UHJlc2VudEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKICAgICAgICAgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24gZSA9IG5ldyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsKQEAgLTQzLDYgKzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5UeXBlTm90UHJlc2VudEV4Y2VwdGlvbi50eXBlTmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInR5cGVOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90eXBlTmFtZSgpIHsKICAgICAgICAgVHlwZU5vdFByZXNlbnRFeGNlcHRpb24gZSA9IG5ldyBUeXBlTm90UHJlc2VudEV4Y2VwdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLnR5cGVOYW1lKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9Vbmtub3duRXJyb3JUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Vua25vd25FcnJvclRlc3QuamF2YQppbmRleCAxM2I3OTVlLi5kZDFlOGM1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Vua25vd25FcnJvclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Vua25vd25FcnJvclRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFVua25vd25FcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVW5rbm93bkVycm9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVW5rbm93bkVycm9yI1Vua25vd25FcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVua25vd25FcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFVua25vd25FcnJvciBlID0gbmV3IFVua25vd25FcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5Vbmtub3duRXJyb3IjVW5rbm93bkVycm9yKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVua25vd25FcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIFVua25vd25FcnJvciBlID0gbmV3IFVua25vd25FcnJvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLCBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Vuc2F0aXNmaWVkTGlua0Vycm9yVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9VbnNhdGlzZmllZExpbmtFcnJvclRlc3QuamF2YQppbmRleCBkZWNlZWFmLi5hZmRhN2U2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Vuc2F0aXNmaWVkTGlua0Vycm9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVW5zYXRpc2ZpZWRMaW5rRXJyb3JUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhVbnNhdGlzZmllZExpbmtFcnJvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5VbnNhdGlzZmllZExpbmtFcnJvciNVbnNhdGlzZmllZExpbmtFcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVuc2F0aXNmaWVkTGlua0Vycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSA9IG5ldyBVbnNhdGlzZmllZExpbmtFcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5VbnNhdGlzZmllZExpbmtFcnJvciNVbnNhdGlzZmllZExpbmtFcnJvcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbnNhdGlzZmllZExpbmtFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIFVuc2F0aXNmaWVkTGlua0Vycm9yIGUgPSBuZXcgVW5zYXRpc2ZpZWRMaW5rRXJyb3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25UZXN0LmphdmEKaW5kZXggYWIyYzA2ZS4uOWZkMDZiOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxNSArMTcsMjkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24jVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgPSBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNiw2ICs1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24jVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlID0gbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTQ1LDYgKzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpKTsKQEAgLTUzLDYgKzg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9WZXJpZnlFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVmVyaWZ5RXJyb3JUZXN0LmphdmEKaW5kZXggYWQxYTQ5Yy4uMmU4MmU1YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9WZXJpZnlFcnJvclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1ZlcmlmeUVycm9yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVmVyaWZ5RXJyb3IuY2xhc3MpIAogcHVibGljIGNsYXNzIFZlcmlmeUVycm9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVmVyaWZ5RXJyb3IjVmVyaWZ5RXJyb3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJWZXJpZnlFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFZlcmlmeUVycm9yIGUgPSBuZXcgVmVyaWZ5RXJyb3IoKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVmVyaWZ5RXJyb3IjVmVyaWZ5RXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVmVyaWZ5RXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBWZXJpZnlFcnJvciBlID0gbmV3IFZlcmlmeUVycm9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiZml4dHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVmlydHVhbE1hY2hpbmVFcnJvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvVmlydHVhbE1hY2hpbmVFcnJvclRlc3QuamF2YQppbmRleCAxYjQ2MzQyLi40MjQ0ZWU1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL1ZpcnR1YWxNYWNoaW5lRXJyb3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9WaXJ0dWFsTWFjaGluZUVycm9yVGVzdC5qYXZhCkBAIC0xNywxNCArMTcsMjkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorQFRlc3RUYXJnZXRDbGFzcyhWaXJ0dWFsTWFjaGluZUVycm9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBWaXJ0dWFsTWFjaGluZUVycm9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciNWaXJ0dWFsTWFjaGluZUVycm9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVmlydHVhbE1hY2hpbmVFcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFZpcnR1YWxNYWNoaW5lRXJyb3IgZSA9IG5ldyBWaXJ0dWFsTWFjaGluZUVycm9yKCkge307CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzUsNiArNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IjVmlydHVhbE1hY2hpbmVFcnJvcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJWaXJ0dWFsTWFjaGluZUVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgVmlydHVhbE1hY2hpbmVFcnJvciBlID0gbmV3IFZpcnR1YWxNYWNoaW5lRXJyb3IoImZpeHR1cmUiKSB7fTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZS5nZXRNZXNzYWdlKCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9yZWYvUGhhbnRvbVJlZmVyZW5jZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvcmVmL1BoYW50b21SZWZlcmVuY2VUZXN0LmphdmEKaW5kZXggNDZhNTI1NS4uOTE4MDkxMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9yZWYvUGhhbnRvbVJlZmVyZW5jZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9QaGFudG9tUmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMTkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmcucmVmOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CiAKIC8vVE9ETzogd3JpdGUgYSB0ZXN0IHRvIHZlcmlmeSB0aGF0IHRoZSByZWZlcmVudCdzIGZpbmFsaXplKCkgaGFwcGVucwogLy8gICAgICBiZWZvcmUgdGhlIFBoYW50b21SZWZlcmVuY2UgaXMgZW5xdWV1ZWQuCiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUGhhbnRvbVJlZmVyZW5jZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUGhhbnRvbVJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIHN0YXRpYyBCb29sZWFuIGJvb2w7CiAKQEAgLTM0LDYgKzQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZSNnZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldCgpIHsKICAgICAgICAgUmVmZXJlbmNlUXVldWUgcnEgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKICAgICAgICAgYm9vbCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKQEAgLTQ0LDYgKzU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5SdW50aW1lI2djKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnRlcmFjdGlvbiB0ZXN0IHdpdGggUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQaGFudG9tUmVmZXJlbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nY0ludGVyYWN0aW9uKCkgewogICAgICAgICBjbGFzcyBUZXN0UGhhbnRvbVJlZmVyZW5jZTxUPiBleHRlbmRzIFBoYW50b21SZWZlcmVuY2U8VD4gewogICAgICAgICAgICAgcHVibGljIFRlc3RQaGFudG9tUmVmZXJlbmNlKFQgcmVmZXJlbnQsCkBAIC0xMDAsNiArMTI0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZSNQaGFudG9tUmVmZXJlbmNlKGphdmEubGFuZy5PYmplY3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBoYW50b21SZWZlcmVuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzLCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX3JlZl9SZWZlcmVuY2VRdWV1ZSgpIHsKICAgICAgICAgUmVmZXJlbmNlUXVldWUgcnEgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKICAgICAgICAgYm9vbCA9IG5ldyBCb29sZWFuKHRydWUpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZVRlc3QuamF2YQppbmRleCAwOWQzNDBmLi41ODNhMDQxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZVRlc3QuamF2YQpAQCAtMTcsMTAgKzE3LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nLnJlZjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwogCitAVGVzdFRhcmdldENsYXNzKFJlZmVyZW5jZVF1ZXVlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBSZWZlcmVuY2VRdWV1ZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIHN0YXRpYyBCb29sZWFuIGI7CiAKQEAgLTU2LDYgKzYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUjcG9sbCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayB0aGF0IHBvbGwoKSByZXR1cm5zIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG9sbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9sbCgpIHsKICAgICAgICAgLy8gc3RvcmUgaW4gYSBzdGF0aWMgc28gaXQgd29uJ3QgYmUgZ2MnZWQgYmVjYXVzZSB0aGUgaml0CiAgICAgICAgIC8vIG9wdGltaXplZCBpdCBvdXQKQEAgLTczLDYgKzg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUjcmVtb3ZlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSgpIHsKICAgICAgICAgLy8gc3RvcmUgaW4gYSBzdGF0aWMgc28gaXQgd29uJ3QgYmUgZ2MnZWQgYmVjYXVzZSB0aGUgaml0CiAgICAgICAgIC8vIG9wdGltaXplZCBpdCBvdXQKQEAgLTkwLDYgKzExNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlI3JlbW92ZShsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVKKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0TnVsbCgiUXVldWUgc2hvdWxkIGJlIGVtcHR5LiAocG9sbCkiLCBycS5wb2xsKCkpOwpAQCAtMTEwLDYgKzE0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlI1JlZmVyZW5jZVF1ZXVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAic2V0VXAoKSBtZXRob2QgdmVyaWZpZXMgY29uc3RydWN0b3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUmVmZXJlbmNlUXVldWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIGZvciB0ZXN0aW5nLiIsIHRydWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVRlc3QuamF2YQppbmRleCBhYmU3ODM0Li43OGZiNDI5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0xNiwxOCArMTYsNzIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmcucmVmOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhSZWZlcmVuY2UuY2xhc3MpIAogcHVibGljIGNsYXNzIFJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIE9iamVjdCB0bXBBLCB0bXBCLCBvYmo7CiAKICAgICB2b2xhdGlsZSBXZWFrUmVmZXJlbmNlIHdyOworCisgICAgLyogCisgICAgICogRm9yIHRlc3Rfc3ViY2xhc3MoKS4KKyAgICAgKi8KKyAgICBzdGF0aWMgVGVzdFdlYWtSZWZlcmVuY2UgdHdyOwogICAgIHN0YXRpYyBBc3NlcnRpb25GYWlsZWRFcnJvciBlcnJvcjsKICAgICBzdGF0aWMgYm9vbGVhbiB0ZXN0T2JqZWN0RmluYWxpemVkOworICAgIHN0YXRpYyBjbGFzcyBUZXN0V2Vha1JlZmVyZW5jZTxUPiBleHRlbmRzIFdlYWtSZWZlcmVuY2U8VD4geworICAgICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBjbGVhclNlZW4gPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gZW5xdWV1ZVNlZW4gPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgVGVzdFdlYWtSZWZlcmVuY2UoVCByZWZlcmVudCkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RXZWFrUmVmZXJlbmNlKFQgcmVmZXJlbnQsIFJlZmVyZW5jZVF1ZXVlPD8gc3VwZXIgVD4gcSkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbnQsIHEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBzdXBlci5jbGVhcigpOworICAgICAgICAgICAgY2xlYXJTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICh0ZXN0T2JqZWN0RmluYWxpemVkKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIkNsZWFyIHNob3VsZCBoYXBwZW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIGZpbmFsaXphdGlvbi4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbnF1ZXVlU2VlbikgeworICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJDbGVhciBzaG91bGQgaGFwcGVuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZSBlbnF1ZXVlLiIpOworICAgICAgICAgICAgICAgIHRocm93IGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZW5xdWV1ZSgpIHsKKyAgICAgICAgICAgIGVucXVldWVTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghY2xlYXJTZWVuKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIkNsZWFyIHNob3VsZCBoYXBwZW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIGVucXVldWUuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERvIHRoaXMgbGFzdDsgIGl0IG1heSBub3RpZnkgdGhlIG1haW4gdGVzdCB0aHJlYWQsCisgICAgICAgICAgICAgKiBhbmQgYW55dGhpbmcgd2UnZCBkbyBhZnRlciBpdCAoZS5nLiwgc2V0dGluZyBjbGVhclNlZW4pCisgICAgICAgICAgICAgKiB3b3VsZG4ndCBiZSBzZWVuLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5xdWV1ZSgpOworICAgICAgICB9CisgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZVN1aXRlKCkgewogICAgICAgICB0bXBBID0gdG1wQiA9IG9iaiA9IG51bGw7CkBAIC0zNiw2ICs5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgdG1wQSA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgdG1wQiA9IG5ldyBPYmplY3QoKTsKQEAgLTU0LDYgKzExNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSNlbnF1ZXVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5xdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW5xdWV1ZSgpIHsKICAgICAgICAgUmVmZXJlbmNlUXVldWUgcnEgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKICAgICAgICAgb2JqID0gbmV3IE9iamVjdCgpOwpAQCAtODEsNiArMTUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlI2VucXVldWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9ubGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dlbmVyYWwoKSB7CiAgICAgICAgIC8vIFRlc3QgdGhlIGdlbmVyYWwvb3ZlcmFsbCBmdW5jdGlvbmFsaXR5IG9mIFJlZmVyZW5jZS4KIApAQCAtMTQ0LDYgKzIyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSNnZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXQoKSB7CiAgICAgICAgIC8vIFNNLgogICAgICAgICBvYmogPSBuZXcgT2JqZWN0KCk7CkBAIC0xNTQsNiArMjQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlI2lzRW5xdWV1ZWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VucXVldWVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0VucXVldWVkKCkgewogICAgICAgICBSZWZlcmVuY2VRdWV1ZSBycSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwogICAgICAgICBvYmogPSBuZXcgT2JqZWN0KCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9Tb2Z0UmVmZXJlbmNlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9yZWYvU29mdFJlZmVyZW5jZVRlc3QuamF2YQppbmRleCA0ZGI3M2FhLi44NGZhYmNmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9Tb2Z0UmVmZXJlbmNlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2VUZXN0LmphdmEKQEAgLTE2LDkgKzE2LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nLnJlZjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwogCitAVGVzdFRhcmdldENsYXNzKFNvZnRSZWZlcmVuY2UuY2xhc3MpIAogcHVibGljIGNsYXNzIFNvZnRSZWZlcmVuY2VUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBzdGF0aWMgQm9vbGVhbiBib29sOwogCkBAIC0zMCw2ICszNiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2UjU29mdFJlZmVyZW5jZShqYXZhLmxhbmcuT2JqZWN0LAogICAgICAqICAgICAgICBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTb2Z0UmVmZXJlbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19yZWZfUmVmZXJlbmNlUXVldWUoKSB7CiAgICAgICAgIFJlZmVyZW5jZVF1ZXVlIHJxID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7CiAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbih0cnVlKTsKQEAgLTUzLDYgKzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZSNTb2Z0UmVmZXJlbmNlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvZnRSZWZlcmVuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbih0cnVlKTsKICAgICAgICAgdHJ5IHsKQEAgLTY3LDYgKzkxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZSNnZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoaXMgIiArCisgICAgICAgICAgICAicmVmZXJlbmNlIG9iamVjdCBoYXMgYmVlbiBjbGVhcmVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0KCkgewogICAgICAgICBib29sID0gbmV3IEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBTb2Z0UmVmZXJlbmNlIHNyID0gbmV3IFNvZnRSZWZlcmVuY2UoYm9vbCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZVRlc3QuamF2YQppbmRleCA3NzNmZGQwLi5lNTExMjYyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2VUZXN0LmphdmEKQEAgLTE3LDkgKzE3LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5sYW5nLnJlZjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCitAVGVzdFRhcmdldENsYXNzKFdlYWtSZWZlcmVuY2UuY2xhc3MpIAogcHVibGljIGNsYXNzIFdlYWtSZWZlcmVuY2VUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBzdGF0aWMgQm9vbGVhbiBib29sOwogCkBAIC0zMSw2ICszNywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UjV2Vha1JlZmVyZW5jZShqYXZhLmxhbmcuT2JqZWN0LAogICAgICAqICAgICAgICBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJXZWFrUmVmZXJlbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19yZWZfUmVmZXJlbmNlUXVldWUoKSB7CiAgICAgICAgIFJlZmVyZW5jZVF1ZXVlIHJxID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7CiAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbih0cnVlKTsKQEAgLTU3LDYgKzcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSNXZWFrUmVmZXJlbmNlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIldlYWtSZWZlcmVuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbih0cnVlKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9Db250ZW50SGFuZGxlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9Db250ZW50SGFuZGxlclRlc3QuamF2YQppbmRleCAwN2EzNzRiLi5jODJmOWRmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvQ29udGVudEhhbmRsZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L0NvbnRlbnRIYW5kbGVyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuQ29udGVudEhhbmRsZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMOwpAQCAtMjQsMTIgKzI5LDIyIEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ29udGVudEhhbmRsZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIENvbnRlbnRIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Db250ZW50SGFuZGxlciNnZXRDb250ZW50KGphdmEubmV0LlVSTENvbm5lY3Rpb24sCiAgICAgICogICAgICAgIGphdmEubGFuZy5DbGFzc1tdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbnRlbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJMQ29ubmVjdGlvbi5jbGFzcywgQ2xhc3NbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gbmV3IFVSTCgiaHR0cDovL3d3dy5hcGFjaGUub3JnIikub3BlbkNvbm5lY3Rpb24oKTsKICAgICAgICAgQ2xhc3NbXSBjbGFzc2VzID0geyBGb28uY2xhc3MsIFN0cmluZy5jbGFzcywgfTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9IdHRwUmV0cnlFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvSHR0cFJldHJ5RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IGJjMTRkNmYuLmMzZjlkMjcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9IdHRwUmV0cnlFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L0h0dHBSZXRyeUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLm5ldC5IdHRwUmV0cnlFeGNlcHRpb247CiAKQEAgLTI1LDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKEh0dHBSZXRyeUV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSHR0cFJldHJ5RXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ICJIdHRwIHRlc3QiOyAvLyROT04tTkxTLTEkCkBAIC00OCw2ICs1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIkNoZWNrcyBzZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IEh0dHBSZXRyeUV4Y2VwdGlvbihERVRBSUwsIDEwMCwKICAgICAgICAgICAgICAgICBMT0NBVElPTiksIGNvbXBhcmF0b3IpOwpAQCAtNTYsNiArNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIHNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IEh0dHBSZXRyeUV4Y2VwdGlvbihERVRBSUwsCiAgICAgICAgICAgICAgICAgMTAwLCBMT0NBVElPTiksIGNvbXBhcmF0b3IpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L0luZXQ0QWRkcmVzc1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9JbmV0NEFkZHJlc3NUZXN0LmphdmEKaW5kZXggNzU2MzkyOC4uMGQxYWIzNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L0luZXQ0QWRkcmVzc1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvSW5ldDRBZGRyZXNzVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEubmV0LkluZXQ0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKQEAgLTI0LDExICsyOSwyMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSW5ldDRBZGRyZXNzLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbmV0NEFkZHJlc3NUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MjaXNNdWx0aWNhc3RBZGRyZXNzKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc011bHRpY2FzdEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTXVsdGljYXN0QWRkcmVzcygpIHsKIAogICAgICAgICAvLyBDcmVhdGUgMiBJUCB2NCBhZGRyZXNzZXMgYW5kIGNhbGwgImlzTXVsdGljYXN0QWRkcmVzcygpIgpAQCAtNjEsNiArNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDRBZGRyZXNzI2lzQW55TG9jYWxBZGRyZXNzKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0FueUxvY2FsQWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNBbnlMb2NhbEFkZHJlc3MoKSB7CiAgICAgICAgIFN0cmluZyBhZGRyTmFtZSA9ICIiOwogICAgICAgICB0cnkgewpAQCAtNzYsNiArMTAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXQ0QWRkcmVzcyNpc0xvb3BiYWNrQWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMb29wYmFja0FkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG9vcGJhY2tBZGRyZXNzKCkgewogICAgICAgICAvLyBDcmVhdGUgc29tZSBJUCBWNCBhZGRyZXNzZXMgYW5kIHRlc3QgaWYgdGhleSBhcmUgbG9jYWwuLi4KIApAQCAtMTA4LDYgKzE0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MjaXNMaW5rTG9jYWxBZGRyZXNzKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xpbmtMb2NhbEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTGlua0xvY2FsQWRkcmVzcygpIHsKIAogICAgICAgICBTdHJpbmcgYWRkck5hbWUgPSAiIjsKQEAgLTEyOCw2ICsxNzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDRBZGRyZXNzI2lzU2l0ZUxvY2FsQWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTaXRlTG9jYWxBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1NpdGVMb2NhbEFkZHJlc3MoKSB7CiAgICAgICAgIFN0cmluZyBhZGRyTmFtZSA9ICIiOwogICAgICAgICB0cnkgewpAQCAtMTQ3LDYgKzE5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MjaXNNQ0dsb2JhbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNQ0dsb2JhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNNQ0dsb2JhbCgpIHsKIAogICAgICAgICAvLyBDcmVhdGUgYW4gSVB2NCBtdWxpdGNhc3QgYWRkcmVzcy4gSXQgc2hvdWxkIHJldHVybgpAQCAtMTk5LDYgKzI1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MjaXNNQ05vZGVMb2NhbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNQ05vZGVMb2NhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNNQ05vZGVMb2NhbCgpIHsKICAgICAgICAgLy8gQ3JlYXRlIGFuIElQdjQgbXVsaXRjYXN0IGFkZHJlc3MuIEl0IHNob3VsZCByZXR1cm4KICAgICAgICAgLy8gZmFsc2UgZm9yIG5vZGUtbG9jYWwgbXV0bGljYXN0LiBUaGVyZSBhcmUgbm8gdmFsaWQgSVB2NApAQCAtMjMwLDYgKzI5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MjaXNNQ0xpbmtMb2NhbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNQ0xpbmtMb2NhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNNQ0xpbmtMb2NhbCgpIHsKICAgICAgICAgLy8gQ3JlYXRlIGFuIElQdjQgbXVsaXRjYXN0IGFkZHJlc3MuIEl0IHNob3VsZCByZXR1cm4KICAgICAgICAgLy8gZmFsc2UgZm9yIGxpbmstbG9jYWwgbXV0bGljYXN0LiBUaGVyZSBhcmUgbm8gdmFsaWQgSVB2NApAQCAtMjczLDYgKzM1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MjaXNNQ1NpdGVMb2NhbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNQ1NpdGVMb2NhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNNQ1NpdGVMb2NhbCgpIHsKICAgICAgICAgLy8gQ3JlYXRlIGFuIElQdjQgbXVsaXRjYXN0IGFkZHJlc3MuIEl0IHNob3VsZCByZXR1cm4KICAgICAgICAgLy8gZmFsc2UgZm9yIHNpdGUtbG9jYWwgbXV0bGljYXN0LiBUaGVyZSBhcmUgbm8gdmFsaWQgSVB2NApAQCAtMzIyLDYgKzQwOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MjaXNNQ09yZ0xvY2FsKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01DT3JnTG9jYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTUNPcmdMb2NhbCgpIHsKICAgICAgICAgLy8gQ3JlYXRlIGFuIElQdjQgbXVsaXRjYXN0IGFkZHJlc3MuIEl0IHNob3VsZCByZXR1cm4KICAgICAgICAgLy8gZmFsc2UgZm9yIG9yZ2FuaXphdGlvbi1sb2NhbCBtdXRsaWNhc3QuIFRoZXJlIGFyZSBubyB2YWxpZCBJUHY0CkBAIC0zODQsNiArNDgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJDaGVja3Mgc2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYoSW5ldDRBZGRyZXNzLmdldEJ5TmFtZSgibG9jYWxob3N0IiksCkBAIC0zOTMsNiArNDk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIkNoZWNrcyBzZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgSW5ldDRBZGRyZXNzCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvSW5ldDZBZGRyZXNzVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L0luZXQ2QWRkcmVzc1Rlc3QuamF2YQppbmRleCBiNGU3OTc0Li43MTY5NDRhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvSW5ldDZBZGRyZXNzVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9JbmV0NkFkZHJlc3NUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5uZXQuSW5ldDZBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwpAQCAtMjYsMTEgKzMxLDIxIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbmV0NkFkZHJlc3MuY2xhc3MpIAogcHVibGljIGNsYXNzIEluZXQ2QWRkcmVzc1Rlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXQ2QWRkcmVzcyNpc011bHRpY2FzdEFkZHJlc3MoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTXVsdGljYXN0QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNNdWx0aWNhc3RBZGRyZXNzKCkgewogCiAgICAgICAgIFN0cmluZyBhZGRyTmFtZSA9ICIiOwpAQCAtOTksNiArMTE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXQ2QWRkcmVzcyNpc0FueUxvY2FsQWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNBbnlMb2NhbEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQW55TG9jYWxBZGRyZXNzKCkgewogCiAgICAgICAgIFN0cmluZyBhZGRyTmFtZSA9ICIiOwpAQCAtMTM1LDYgKzE1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NkFkZHJlc3MjaXNMb29wYmFja0FkZHJlc3MoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTG9vcGJhY2tBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0xvb3BiYWNrQWRkcmVzcygpIHsKIAogICAgICAgICBTdHJpbmcgYWRkck5hbWUgPSAiIjsKQEAgLTIyMiw2ICsyNTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDZBZGRyZXNzI2lzTGlua0xvY2FsQWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMaW5rTG9jYWxBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0xpbmtMb2NhbEFkZHJlc3MoKSB7CiAKICAgICAgICAgU3RyaW5nIGFkZHJOYW1lID0gIiI7CkBAIC0yNjksNiArMzExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXQ2QWRkcmVzcyNpc1NpdGVMb2NhbEFkZHJlc3MoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU2l0ZUxvY2FsQWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTaXRlTG9jYWxBZGRyZXNzKCkgewogICAgICAgICBTdHJpbmcgYWRkck5hbWUgPSAiIjsKICAgICAgICAgdHJ5IHsKQEAgLTMwOSw2ICszNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDZBZGRyZXNzI2lzTUNHbG9iYWwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTUNHbG9iYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTUNHbG9iYWwoKSB7CiAgICAgICAgIFN0cmluZyBhZGRyTmFtZSA9ICIiOwogICAgICAgICB0cnkgewpAQCAtMzkxLDYgKzQ1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NkFkZHJlc3MjaXNNQ05vZGVMb2NhbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNQ05vZGVMb2NhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNNQ05vZGVMb2NhbCgpIHsKICAgICAgICAgU3RyaW5nIGFkZHJOYW1lID0gIiI7CiAgICAgICAgIHRyeSB7CkBAIC00NjAsNiArNTI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXQ2QWRkcmVzcyNpc01DTGlua0xvY2FsKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01DTGlua0xvY2FsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc01DTGlua0xvY2FsKCkgewogICAgICAgICBTdHJpbmcgYWRkck5hbWUgPSAiIjsKICAgICAgICAgdHJ5IHsKQEAgLTU1MSw2ICs2MjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDZBZGRyZXNzI2lzTUNTaXRlTG9jYWwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTUNTaXRlTG9jYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTUNTaXRlTG9jYWwoKSB7CiAgICAgICAgIFN0cmluZyBhZGRyTmFtZSA9ICIiOwogICAgICAgICB0cnkgewpAQCAtNjQxLDYgKzcyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NkFkZHJlc3MjaXNNQ09yZ0xvY2FsKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01DT3JnTG9jYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTUNPcmdMb2NhbCgpIHsKICAgICAgICAgU3RyaW5nIGFkZHJOYW1lID0gIiI7CiAgICAgICAgIHRyeSB7CkBAIC03MzMsNiArODI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXQ2QWRkcmVzcyNpc0lQdjRDb21wYXRpYmxlQWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNJUHY0Q29tcGF0aWJsZUFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSVB2NENvbXBhdGlibGVBZGRyZXNzKCkgewogICAgICAgICBTdHJpbmcgYWRkck5hbWUgPSAiIjsKICAgICAgICAgSW5ldDZBZGRyZXNzIGFkZHIgPSBudWxsOwpAQCAtNzc0LDYgKzg3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NkFkZHJlc3MjZ2V0QWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGVtcHR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFkZHJlc3MoKSB7CiAgICAgICAgIC8vIFRPRE8gOiBJbXBsZW1lbnRhdGlvbgogICAgIH0KQEAgLTc4MSw2ICs4OTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDZBZGRyZXNzI2dldEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QnlOYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gb25lcyB0byBhZGQgIjo6MjU1LjI1NS4yNTUuMjU1IiwgIjo6RkZGRjowLjAuMC4wIiwKICAgICAgICAgLy8gIjAuMC4wLjAuMC4wOjoyNTUuMjU1LjI1NS4yNTUiLCAiRjpGOkY6RjpGOkY6RjpGIiwKQEAgLTgyNyw2ICs5NTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDZBZGRyZXNzI2dldEJ5QWRkcmVzcyhTdHJpbmcsIGJ5dGVbXSwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ5QWRkcmVzc0xTdHJpbmckQkkoKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb257CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJbmV0NkFkZHJlc3MuZ2V0QnlBZGRyZXNzKCIxMjMiLCBudWxsLCAwKTsKQEAgLTg1Niw2ICs5ODgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldDZBZGRyZXNzI2dldEJ5QWRkcmVzcyhTdHJpbmcsIGJ5dGVbXSwKICAgICAgKiAgICAgICAgTmV0d29ya0ludGVyZmFjZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeUFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3MsIE5ldHdvcmtJbnRlcmZhY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QnlBZGRyZXNzTFN0cmluZyRCTE5ldHdvcmtJbnRlcmZhY2UoKQogICAgICAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuaWYgPSBudWxsOwpAQCAtODg0LDYgKzEwMjUsMTUgQEAKICAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXQ2QWRkcmVzcyNnZXRTY29wZUlEKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTY29wZUlkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTY29wZUlEKCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKICAgICAgICAgSW5ldDZBZGRyZXNzIHY2aWE7CiAgICAgICAgIGJ5dGVbXSBhZGRyID0geyAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MDIsIDB4MTEsCkBAIC05MDMsNiArMTA1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0NkFkZHJlc3MjZ2V0U2NvcGVkSW50ZXJmYWNlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTY29wZWRJbnRlcmZhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNjb3BlZEludGVyZmFjZSgpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBhZGRyID0geyAoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDA5LCAoYnl0ZSkgMHhiNSwKICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4YTQsIDAsIDAsIDAsIDAsIDAsIDAsIChieXRlKSAweDA5LApAQCAtOTg2LDYgKzExNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJDaGVja3Mgc2VyaWFsaXphdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGJ5dGVbXSBsb2NhbHY2ID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxIH07CkBAIC05OTcsNiArMTE2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJDaGVja3Mgc2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgYnl0ZVtdIGxvY2FsdjYgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9JbmV0QWRkcmVzc1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9JbmV0QWRkcmVzc1Rlc3QuamF2YQppbmRleCAwYTQ5MTVkLi5kZDk2NTM4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvSW5ldEFkZHJlc3NUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L0luZXRBZGRyZXNzVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQ7CkBAIC0zMyw2ICszOCw3IEBACiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfQ29uZmlndXJhdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbmV0QWRkcmVzcy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW5ldEFkZHJlc3NUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNvbWVvbmVEb25lW10gPSBuZXcgYm9vbGVhblsyXTsKQEAgLTEzMyw2ICsxMzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldEFkZHJlc3MjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5uZXQuSW5ldEFkZHJlc3MuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIHRyeSB7CkBAIC0xNTAsNiArMTY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXRBZGRyZXNzI2dldEFkZHJlc3MoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFkZHJlc3MoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBieXRlIFtdIGphdmEubmV0LkluZXRBZGRyZXNzLmdldEFkZHJlc3MoKQogICAgICAgICB0cnkgewpAQCAtMTcwLDYgKzE5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRBbGxCeU5hbWUoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlVua25vd25Ib3N0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGxCeU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsbEJ5TmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5JbmV0QWRkcmVzcyBbXQogICAgICAgICAvLyBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRBbGxCeU5hbWUoamF2YS5sYW5nLlN0cmluZykKQEAgLTIxMiw2ICsyNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldEFkZHJlc3MjZ2V0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNlaGNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ5TmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5JbmV0QWRkcmVzcwogICAgICAgICAvLyBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykKQEAgLTI0Niw2ICsyODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldEFkZHJlc3MjZ2V0SG9zdEFkZHJlc3MoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEhvc3RBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRIb3N0QWRkcmVzcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKQpAQCAtMjY0LDYgKzMxNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRIb3N0TmFtZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SG9zdE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEhvc3ROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubmV0LkluZXRBZGRyZXNzLmdldEhvc3ROYW1lKCkKICAgICAgICAgSW5ldEFkZHJlc3MgaWEgPSBJbmV0QWRkcmVzcwpAQCAtMzU2LDYgKzQxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRMb2NhbEhvc3QoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVW5rbm93bkhvc3RFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsSG9zdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxIb3N0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuSW5ldEFkZHJlc3MKICAgICAgICAgLy8gamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkKQEAgLTM3NSw2ICs0NDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldEFkZHJlc3MjaGFzaENvZGUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5JbmV0QWRkcmVzcy5oYXNoQ29kZSgpCiAgICAgICAgIHRyeSB7CkBAIC0zOTEsNiArNDY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXRBZGRyZXNzI2lzTXVsdGljYXN0QWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNdWx0aWNhc3RBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc011bHRpY2FzdEFkZHJlc3MoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubmV0LkluZXRBZGRyZXNzLmlzTXVsdGljYXN0QWRkcmVzcygpCiAgICAgICAgIHRyeSB7CkBAIC00MDUsNiArNDkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXRBZGRyZXNzI3RvU3RyaW5nKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5uZXQuSW5ldEFkZHJlc3MudG9TdHJpbmcoKQogICAgICAgICBJbmV0QWRkcmVzcyBpYTIgPSBJbmV0QWRkcmVzcwpAQCAtNDIwLDYgKzUxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRCeUFkZHJlc3MoamF2YS5sYW5nLlN0cmluZywgYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVW5rbm93bkhvc3RFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCeUFkZHJlc3NMamF2YV9sYW5nX1N0cmluZyRCKCkgewogICAgICAgICAvLyBDaGVjayBhbiBJUHY0IGFkZHJlc3Mgd2l0aCBhbiBJUHY2IGhvc3RuYW1lCiAgICAgICAgIGJ5dGUgaXBBZGRyZXNzW10gPSB7IDEyNywgMCwgMCwgMSB9OwpAQCAtNDQ3LDYgKzU1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRDYW5vbmljYWxIb3N0TmFtZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2Fub25pY2FsSG9zdE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENhbm9uaWNhbEhvc3ROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEluZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBudWxsOwogICAgICAgICB0aGVBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CkBAIC00NzIsNiArNTg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXRBZGRyZXNzI2lzUmVhY2hhYmxlSQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhY2hhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1JlYWNoYWJsZUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSW5ldEFkZHJlc3MgaWEgPSBJbmV0NEFkZHJlc3MuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShpYS5pc1JlYWNoYWJsZSgxMDAwMCkpOwpAQCAtNDg3LDYgKzYxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0QWRkcmVzcyNpc1JlYWNoYWJsZUxqYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlSUkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlYWNoYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtOZXR3b3JrSW50ZXJmYWNlLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1JlYWNoYWJsZUxqYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gdGVzdHMgbG9jYWwgYWRkcmVzcwogICAgICAgICBJbmV0QWRkcmVzcyBpYSA9IEluZXQ0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpOwpAQCAtNTQzLDYgKzY3NSwxNSBAQAogICAgIH07CiAgICAgCiAgICAgLy8gUmVncmVzc2lvbiBUZXN0IGZvciBIYXJtb255LTIyOTAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ2VyZXNzaW9uIHRlc3QuIEZ1bmN0aW9uYWwgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlYWNoYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtOZXR3b3JrSW50ZXJmYWNlLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1JlYWNoYWJsZUxqYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlSUlfbG9vcGJhY2tJbnRlcmZhY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgVFRMID0gMjA7CiAgICAgICAgIGZpbmFsIGludCBUSU1FX09VVCA9IDMwMDA7CkBAIC01ODAsNiArNzIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihJbmV0QWRkcmVzcy5nZXRCeU5hbWUoImxvY2FsaG9zdCIpLApAQCAtNTg5LDYgKzczOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJDaGVja3Mgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLApAQCAtNTk4LDYgKzc1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRCeUFkZHJlc3MoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2VkIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QnlBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCeUFkZHJlc3MoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNjEKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9JbmV0U29ja2V0QWRkcmVzc1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9JbmV0U29ja2V0QWRkcmVzc1Rlc3QuamF2YQppbmRleCA4YzYyZWVhLi41YzM2ZDAxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvSW5ldFNvY2tldEFkZHJlc3NUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L0luZXRTb2NrZXRBZGRyZXNzVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogCkBAIC0yMywxMSArMjgsMjEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKEluZXRTb2NrZXRBZGRyZXNzLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbmV0U29ja2V0QWRkcmVzc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MjSW5ldFNvY2tldEFkZHJlc3MoU3RyaW5nLCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbmV0U29ja2V0QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMTA0MgogICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCAwKTsKQEAgLTM3LDYgKzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzI2NyZWF0ZVVucmVzb2x2ZWQoU3RyaW5nLCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIHRoZSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNyZWF0ZVVucmVzb2x2ZWQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZVVucmVzb2x2ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVW5yZXNvbHZlZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKICAgICAgICAgSG9zdFBvcnRQYWlyW10gbGVnYWxIb3N0UG9ydFBhaXJzID0geyBuZXcgSG9zdFBvcnRQYWlyKCIxMjcuMC4wLjEiLCAxMjM0KSwKICAgICAgICAgICAgICAgICBuZXcgSG9zdFBvcnRQYWlyKCIxOTIuMTY4LjAuMSIsIDEwMDAwKSwgbmV3IEhvc3RQb3J0UGFpcigiMTI3LjAuMCIsIDApLApAQCAtNTUsNiArNzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MjY3JlYXRlVW5yZXNvbHZlZChTdHJpbmcsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgdGhlIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY3JlYXRlVW5yZXNvbHZlZCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlVW5yZXNvbHZlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVVbnJlc29sdmVkTGphdmFfbGFuZ19TdHJpbmdJX0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpIHsKICAgICAgICAgSG9zdFBvcnRQYWlyW10gaWxsZWdhbEhvc3RQb3J0UGFpcnMgPSB7IG5ldyBIb3N0UG9ydFBhaXIobnVsbCwgMSksCiAgICAgICAgICAgICAgICAgbmV3IEhvc3RQb3J0UGFpcigiaG9zdCIsIC0xKSwgbmV3IEhvc3RQb3J0UGFpcigiaG9zdCIsIDY1NTM2KSB9OwpAQCAtMTAzLDYgKzEzNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBzZXJpYWxpemF0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgT2JqZWN0W10gdGVzdENhc2VzID0gewpAQCAtMTE1LDcgKzE1NywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJDaGVja3Mgc2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIE9iamVjdFtdIHRlc3RDYXNlcyA9IHsKICAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcy5jcmVhdGVVbnJlc29sdmVkKCJiYWRob3N0IiwgMTAwMCksIC8vIHVucmVzb2x2ZWQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUklUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvVVJJVGVzdC5qYXZhCmluZGV4IGIxZmRjNGMuLjZiYTI3NTEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUklUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L1VSSVRlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDMwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuVVJJOwogaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhVUkkuY2xhc3MpIAogcHVibGljIGNsYXNzIFVSSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSSSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMjMKICAgICAgICAgdHJ5IHsKQEAgLTYxLDYgKzc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2VkIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVVJJIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIHNjaGVtZSBjYW4gbm90IGJlIGVtcHR5IHN0cmluZyAgICAKICAgICAgICAgdHJ5IHsKQEAgLTc1LDYgKzk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNyZWxhdGl2aXplKGphdmEubmV0LlVSSSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWxhdGl2aXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1VSSS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWxhdGl2aXplTGphdmFfbmV0X1VSSSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb257CiAgICAgICAgIFVSSSBhID0gbmV3IFVSSSgiaHR0cDovL2hvc3QvZGlyIik7CiAgICAgICAgIFVSSSBiID0gbmV3IFVSSSgiaHR0cDovL2hvc3QvZGlyL2ZpbGU/cXVlcnkiKTsgICAgICAgIApAQCAtOTcsNiArMTMwLDE1IEBACiAgICAgICAgICAgICAgICAgbmV3IFVSSSgiZmlsZTovLy9+L2ZpcnN0IiksIGIucmVsYXRpdml6ZShhKSk7CiAgICAgfQogICAgIAorQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVsYXRpdml6ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVsYXRpdml6ZUJhc2VkT25lRWNsaXBzZUNvcmVSZXNvdXJjZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgVVJJIG9uZSA9IG5ldyBVUkkoImZpbGU6L0M6L3Rlc3Qvd3MiKTsKICAgICAgICAgVVJJIHR3byA9IG5ldyBVUkkoImZpbGU6L0M6L3Rlc3Qvd3MiKTsKQEAgLTExNiw2ICsxNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2NvbXBhcmVUbyhqYXZhLm5ldC5VUkkpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDbGFzc0Nhc3RFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtVUkkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvTGphdmFfbmV0X1VSSSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb257CiAgICAgICAgIFVSSSB1cmkxLCB1cmkyOwogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvVVJMQ29ubmVjdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUkxDb25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IDRjMjJjZGIuLjc1ZDYwMjIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUkxDb25uZWN0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUkxDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKQEAgLTIzLDExICsyOCwyMSBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFVSTENvbm5lY3Rpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFVSTENvbm5lY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSTENvbm5lY3Rpb24jYWRkUmVxdWVzdFByb3BlcnR5KFN0cmluZywgU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2VkIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkUmVxdWVzdFByb3BlcnR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZFJlcXVlc3RQcm9wZXJ0eSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CiAKQEAgLTU1LDYgKzcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSTENvbm5lY3Rpb24jc2V0UmVxdWVzdFByb3BlcnR5KFN0cmluZywgU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2VkIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmVxdWVzdFByb3BlcnR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlcXVlc3RQcm9wZXJ0eSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CiAKQEAgLTgxLDYgKzEwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkxDb25uZWN0aW9uI3NldFVzZUNhY2hlcyhib29sZWFuKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2VkIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VXNlQ2FjaGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VXNlQ2FjaGVzWigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTcxCkBAIC05OCw2ICsxMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiNzZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihib29sZWFuKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2VkIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QWxsb3dVc2VySW50ZXJhY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRBbGxvd1VzZXJJbnRlcmFjdGlvblooKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAogICAgICAgICAgICAgSU9FeGNlcHRpb24gewogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvVVJMRW5jb2RlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUkxFbmNvZGVyVGVzdC5qYXZhCmluZGV4IGYxZWU0Y2MuLjg5YjAxNmIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUkxFbmNvZGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUkxFbmNvZGVyVGVzdC5qYXZhCkBAIC0xNiwxNiArMTYsMzEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhVUkxFbmNvZGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBVUkxFbmNvZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICAvKioKICAgICAgKiBAdGVzdHMgVVJMRW5jb2RlciNlbmNvZGUoU3RyaW5nLCBTdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIENoZWNrcyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uICYgTnVsbFBvaW50ZXJFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW5jb2RlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTI0CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvVVJMVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvbmV0L1VSTFRlc3QuamF2YQppbmRleCA1MmM4MDM0Li5lMjhmMjU1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS9uZXQvVVJMVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL25ldC9VUkxUZXN0LmphdmEKQEAgLTE2LDE2ICsxNiwzMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVVJMLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBVUkxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSTCNnZXRIb3N0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SG9zdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SG9zdCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTYwCiAgICAgICAgIFN0cmluZyBpcHY2SG9zdCA9ICJGRURDOkJBOTg6NzY1NDozMjEwOkZFREM6QkE5ODo3NjU0OjMyMTAiOwpAQCAtMzYsNiArNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJMI1VSTChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSTCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUxqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTgzCkBAIC01Miw2ICs3NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkwjVVJMKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJNYWxmb3JtZWRVUkxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSTCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFN0cmFuZ2UgYmVoYXZpb3IgaW4gcmVmZXJlbmNlLCB0aGUgaG9zdG5hbWUgY29udGFpbnMgYSAnOicgc28gaXQgZ2V0cyB3cmFwcGVkIGluICdbJywgJ10nCiAgICAgICAgIFVSTCB0ZXN0VVJMID0gbmV3IFVSTCgiaHR0cCIsICJ3d3cuYXBhY2hlLm9yZzo4MDgwIiwgInRlc3QuaHRtbCNhbmNoIik7CkBAIC02Niw2ICs5OSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkwjVVJMKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCiAgICAgICoKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVUkwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9qYXZhX3Byb3RvY29sX2hhbmRsZXJfcGtnc19wcm9wKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0zMDk0CiAgICAgICAgIGZpbmFsIFN0cmluZyBIQU5ETEVSX1BLR1MgPSAiamF2YS5wcm90b2NvbC5oYW5kbGVyLnBrZ3MiOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvblRlc3QuamF2YQppbmRleCA2MDIxYzMyLi5jNmQ3ZWI2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvblRlc3QuamF2YQpAQCAtMTcsMTcgKzE3LDMzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBBYnN0cmFjdENvbGxlY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24jYWRkKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBwYXJhbWV0ZXIuIERvc24ndCBjaGVjayBhbnkgT2JqZWN0IGFzIGEgIiArCisgICAgICAgICAgICAicGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIEFic3RyYWN0Q29sbGVjdGlvbjxPYmplY3Q+IGFjID0gbmV3IEFic3RyYWN0Q29sbGVjdGlvbjxPYmplY3Q+KCkgewogCkBAIC01Myw2ICs2OSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgIiArICAKKyAgICAgICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZml4dHVyZXMgPSBBcnJheXMuYXNMaXN0KCIwIiwgIjEiLCAiMiIpOwogICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPiBhYyA9IG5ldyBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPigpIHsKQEAgLTgyLDYgKzEwOCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI2NvbnRhaW5zQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIERvZXNuJ3QgdmVyaWZ5ICIgKworICAgICAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zQWxsTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZml4dHVyZXMgPSBBcnJheXMuYXNMaXN0KCIwIiwgIjEiLCAiMiIpOwogICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPiBhYyA9IG5ldyBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPigpIHsKQEAgLTExMSw2ICsxNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiNpc0VtcHR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzRW1wdHkoKSByZXR1cm5zIHRydWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFbXB0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKICAgICAgICAgZmluYWwgYm9vbGVhbltdIHNpemVDYWxsZWQgPSBuZXcgYm9vbGVhblsxXTsKICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uPE9iamVjdD4gYWMgPSBuZXcgQWJzdHJhY3RDb2xsZWN0aW9uPE9iamVjdD4oKXsKQEAgLTEzMiw2ICsxNzcsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4gIiArCisgICAgICAgICAgICAiRG9lc24ndCB2ZXJpZnkgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24sICIgKworICAgICAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZUFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGxMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlbW92ZWQgPSBuZXcgU3RyaW5nWzNdOwogICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPiBhYyA9IG5ldyBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPigpIHsKQEAgLTE3NCw2ICsyMzAsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iICsKKyAgICAgICAgICAgICJEb2Vzbid0IHZlcmlmeSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmV0YWluQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JldGFpbkFsbExqYXZhX3V0aWxfQ29sbGVjdGlvbigpIHsKICAgICAgICAgZmluYWwgU3RyaW5nW10gcmVtb3ZlZCA9IG5ldyBTdHJpbmdbMV07CiAgICAgICAgIEFic3RyYWN0Q29sbGVjdGlvbjxTdHJpbmc+IGFjID0gbmV3IEFic3RyYWN0Q29sbGVjdGlvbjxTdHJpbmc+KCkgewpAQCAtMjEyLDYgKzI3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI3RvQXJyYXkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0FycmF5KCkgewogICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPiBhYyA9IG5ldyBBYnN0cmFjdENvbGxlY3Rpb248U3RyaW5nPigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMjUyLDYgKzMyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI3RvQXJyYXkoamF2YS5sYW5nLk9iamVjdFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvQXJyYXkkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIEFic3RyYWN0Q29sbGVjdGlvbjxTdHJpbmc+IGFjID0gbmV3IEFic3RyYWN0Q29sbGVjdGlvbjxTdHJpbmc+KCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0zMTEsNiArMzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24jdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIHNlZSBIQVJNT05ZLTE1MjIKICAgICAgICAgLy8gY29sbGVjdGlvbiB0aGF0IHJldHVybnMgbnVsbCBpdGVyYXRvcih0aGlzIGlzIGFnYWluc3QgdGhlIHNwZWMuKQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9BYnN0cmFjdE1hcFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQWJzdHJhY3RNYXBUZXN0LmphdmEKaW5kZXggYTQyZWY2Ni4uMzhjZDRmMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9BYnN0cmFjdE1hcFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0Fic3RyYWN0TWFwVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CkBAIC0yOSw2ICszNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEudXRpbC5BYnN0cmFjdE1hcC5jbGFzcykKIHB1YmxpYyBjbGFzcyBBYnN0cmFjdE1hcFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBzcGVjaWFsS2V5ID0gInNwZWNpYWxLZXkiLmludGVybigpOwpAQCAtNjgsNiArNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0TWFwI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgcmV0dXJuZWQgc2V0IG9mIGtleXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXQoKSB7CiAgICAgICAgIEFic3RyYWN0TWFwIG1hcDEgPSBuZXcgSGFzaE1hcCgwKTsKICAgICAgICAgYXNzZXJ0U2FtZSgiSGFzaE1hcCgwKSIsIG1hcDEua2V5U2V0KCksIG1hcDEua2V5U2V0KCkpOwpAQCAtOTQsNiArMTA5LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdE1hcCNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbmQgIiArCisgICAgICAgICAgICAibmVnYXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgT2JqZWN0IGtleSA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgT2JqZWN0IHZhbHVlID0gbmV3IE9iamVjdCgpOwpAQCAtMTMyLDYgKzE1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAjdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSByZXR1cm5lZCBDb2xsZWN0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVzKCkgewogICAgICAgICBBYnN0cmFjdE1hcCBtYXAxID0gbmV3IEhhc2hNYXAoMCk7CiAgICAgICAgIGFzc2VydFNhbWUoIkhhc2hNYXAoMCkiLCBtYXAxLnZhbHVlcygpLCBtYXAxLnZhbHVlcygpKTsKQEAgLTE1OCw2ICsxOTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0TWFwI2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIGNsYXNzIE15TWFwIGV4dGVuZHMgQWJzdHJhY3RNYXAgaW1wbGVtZW50cyBDbG9uZWFibGUgewogICAgICAgICAgICAgcHJpdmF0ZSBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQXJyYXlMaXN0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9BcnJheUxpc3RUZXN0LmphdmEKaW5kZXggM2Q2MmU5Ni4uNDM4ZGYyYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9BcnJheUxpc3RUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9BcnJheUxpc3RUZXN0LmphdmEKQEAgLTEsMTEgKzEsMjYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS51dGlsOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitAVGVzdFRhcmdldENsYXNzKEFycmF5TGlzdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQXJyYXlMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorICAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsQ29sbGVjdGlvbk9mUWV4dGVuZHNFKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTUzOQogICAgICAgICAvLyBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0hBUk1PTlktNTM5CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0FycmF5c1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQXJyYXlzVGVzdC5qYXZhCmluZGV4IGUwYjJiNTkuLmRjNzc1MzYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQXJyYXlzVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQXJyYXlzVGVzdC5qYXZhCkBAIC0xNywyMSArMTcsMzYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKEFycmF5cy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQXJyYXlzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2JpbmFyeVNlYXJjaChkb3VibGVbXSwgZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5hcnlTZWFyY2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5hcnlTZWFyY2gkREQoKSB7CiAgICAgICAgIGRvdWJsZVtdIHNwZWNpYWxzID0gbmV3IGRvdWJsZVtdIHsgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZLAogICAgICAgICAgICAgICAgIC1Eb3VibGUuTUFYX1ZBTFVFLCAtMmQsIC1Eb3VibGUuTUlOX1ZBTFVFLCAtMGQsIDBkLApAQCAtNTIsNiArNjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNiaW5hcnlTZWFyY2goZmxvYXRbXSwgZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmFyeVNlYXJjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5hcnlTZWFyY2gkRkYoKSB7CiAgICAgICAgIGZsb2F0W10gc3BlY2lhbHMgPSBuZXcgZmxvYXRbXSB7IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZLAogICAgICAgICAgICAgICAgIC1GbG9hdC5NQVhfVkFMVUUsIC0yZiwgLUZsb2F0Lk1JTl9WQUxVRSwgLTBmLCAwZiwKQEAgLTcyLDYgKzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZXF1YWxzKGRvdWJsZVtdLCBkb3VibGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzLCBkb3VibGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHMkRCREKCkgewogICAgICAgICBkb3VibGUgZFtdID0gbmV3IGRvdWJsZVsxMDBdOwogICAgICAgICBkb3VibGUgeFtdID0gbmV3IGRvdWJsZVsxMDBdOwpAQCAtOTUsNiArMTI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZXF1YWxzKGZsb2F0W10sIGZsb2F0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzLCBmbG9hdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFscyRGJEYoKSB7CiAgICAgICAgIGZsb2F0IGRbXSA9IG5ldyBmbG9hdFsxMDBdOwogICAgICAgICBmbG9hdCB4W10gPSBuZXcgZmxvYXRbMTAwXTsKQEAgLTExNSw2ICsxNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGRvdWJsZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkRCgpIHsKICAgICAgICAgLy8gVGVzdCBhIGJhc2ljIHNvcnQKICAgICAgICAgZG91YmxlW10gcmV2ZXJzZWRBcnJheSA9IG5ldyBkb3VibGVbMTAwXTsKQEAgLTE1Miw2ICsyMDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGZsb2F0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JEYoKSB7CiAgICAgICAgIC8vIFRlc3QgYSBiYXNpYyBzb3J0CiAgICAgICAgIGZsb2F0W10gcmV2ZXJzZWRBcnJheSA9IG5ldyBmbG9hdFsxMDBdOwpAQCAtMTg4LDYgKzI0OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3RvU3RyaW5nKGJvb2xlYW5bXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nJFooKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygibnVsbCIsIEFycmF5cy50b1N0cmluZygoYm9vbGVhbltdKW51bGwpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXSIsIEFycmF5cy50b1N0cmluZyhuZXcgYm9vbGVhbltdIHt9KSk7CkBAIC0xOTksNiArMjY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjdG9TdHJpbmcoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmckQigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgQXJyYXlzLnRvU3RyaW5nKChieXRlW10pbnVsbCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgQXJyYXlzLnRvU3RyaW5nKG5ldyBieXRlW10ge30pKTsKQEAgLTIxMCw2ICsyODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyN0b1N0cmluZyhjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZyRDKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIm51bGwiLCBBcnJheXMudG9TdHJpbmcoKGNoYXJbXSludWxsKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiW10iLCBBcnJheXMudG9TdHJpbmcobmV3IGNoYXJbXSB7fSkpOwpAQCAtMjIxLDYgKzMwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3RvU3RyaW5nKGRvdWJsZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZyREKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIm51bGwiLCBBcnJheXMudG9TdHJpbmcoKGRvdWJsZVtdKW51bGwpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXSIsIEFycmF5cy50b1N0cmluZyhuZXcgZG91YmxlW10ge30pKTsKQEAgLTIzMiw2ICszMjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyN0b1N0cmluZyhmbG9hdFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nJEYoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygibnVsbCIsIEFycmF5cy50b1N0cmluZygoZmxvYXRbXSludWxsKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiW10iLCBBcnJheXMudG9TdHJpbmcobmV3IGZsb2F0W10ge30pKTsKQEAgLTI0Myw2ICszNDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyN0b1N0cmluZyhpbnRbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmckSSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgQXJyYXlzLnRvU3RyaW5nKChpbnRbXSludWxsKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiW10iLCBBcnJheXMudG9TdHJpbmcobmV3IGludFtdIHt9KSk7CkBAIC0yNTQsNiArMzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjdG9TdHJpbmcobG9uZ1tdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmckSigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgQXJyYXlzLnRvU3RyaW5nKChsb25nW10pbnVsbCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgQXJyYXlzLnRvU3RyaW5nKG5ldyBsb25nW10ge30pKTsKQEAgLTI2NSw2ICszODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyN0b1N0cmluZyhzaG9ydFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nJFMoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygibnVsbCIsIEFycmF5cy50b1N0cmluZygoc2hvcnRbXSludWxsKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiW10iLCBBcnJheXMudG9TdHJpbmcobmV3IHNob3J0W10ge30pKTsKQEAgLTI3Niw2ICs0MDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyN0b1N0cmluZyhPYmplY3RbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIm51bGwiLCBBcnJheXMudG9TdHJpbmcoKE9iamVjdFtdKW51bGwpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXSIsIEFycmF5cy50b1N0cmluZyhuZXcgT2JqZWN0W10ge30pKTsKQEAgLTI4Nyw2ICs0MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNkZWVwVG9TdHJpbmcoT2JqZWN0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlZXBUb1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVlcFRvU3RyaW5nJGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygibnVsbCIsIEFycmF5cy5kZWVwVG9TdHJpbmcoKE9iamVjdFtdKW51bGwpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXSIsIEFycmF5cy5kZWVwVG9TdHJpbmcobmV3IE9iamVjdFtdIHt9KSk7CkBAIC0zMzMsNyArNDgzLDE1IEBACiAgICAgICAgIAogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEFycmF5cy5kZWVwVG9TdHJpbmcoZml4dHVyZSkpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNMaXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FzTGlzdFR2YXJhcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3NMaXN0ID0gQXJyYXlzLmFzTGlzdCgiMCIsICIxIik7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCBzdHJpbmdzTGlzdC5zaXplKCkpOwpAQCAtMzYxLDcgKzUxOSwxNSBAQAogICAgICAgICAgICAgZmFpbCgiTm8gTlBFIik7CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHt9CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5hcnlTZWFyY2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBqYXZhLnV0aWwuQ29tcGFyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5hcnlTZWFyY2gkVFRMamF2YV91dGlsX0NvbXBhcmF0b3JzdXBlclQoKSB7CiAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW10geyAiYSIsICJCIiwgImMiLCAiRCIgfTsKICAgICAgICAgQXJyYXlzLnNvcnQoc3RyaW5ncywgU3RyaW5nLkNBU0VfSU5TRU5TSVRJVkVfT1JERVIpOwpAQCAtNDE5LDcgKzU4NSwxNSBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0W10uY2xhc3MsIGphdmEudXRpbC5Db21wYXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkVExqYXZhX2xhbmdfQ29tcGFyYXRvcnN1cGVyVCgpIHsKICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgIkIiLCAiYyIsICJEIiB9OwogICAgICAgICBBcnJheXMuc29ydChzdHJpbmdzLCBTdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUik7CkBAIC00NDEsNyArNjE1LDE2IEBACiAgICAgICAgICAgICBmYWlsKCJObyBOUEUiKTsKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkge30KICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkVElJTGphdmFfbGFuZ19Db21wYXJhdG9yc3VwZXJUKCkgewogICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiQiIsICJjIiwgIkQiIH07CiAgICAgICAgIEFycmF5cy5zb3J0KHN0cmluZ3MsIDAsIHN0cmluZ3MubGVuZ3RoLCBTdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0JpdFNldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQml0U2V0VGVzdC5qYXZhCmluZGV4IGJiNzQ0MjguLjVhZTk2MzUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQml0U2V0VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQml0U2V0VGVzdC5qYXZhCkBAIC0xNywxNSArMTcsMzAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQml0U2V0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBCaXRTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjY2xlYXIoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xlYXJJSSgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS05OAogICAgICAgICBCaXRTZXQgYml0c2V0ID0gbmV3IEJpdFNldCgpOwpAQCAtMzYsOCArNTEsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNjbGVhcihpbnQsIGludCkKKyAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNmbGlwKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsaXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxpcElJKCkgewogICAgICAgICBCaXRTZXQgYml0c2V0ID0gbmV3IEJpdFNldCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKQEAgLTQ5LDYgKzczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjZ2V0KGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJSSgpIHsKICAgICAgICAgQml0U2V0IGJpdHNldCA9IG5ldyBCaXRTZXQoMzApOwogICAgICAgICBiaXRzZXQuZ2V0KDMsIDMpOwpAQCAtNTcsNiArOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNzZXQoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElJKCkgewogICAgICAgICBCaXRTZXQgYml0c2V0ID0gbmV3IEJpdFNldCgzMCk7CiAgICAgICAgIGJpdHNldC5zZXQoMjksIDI5KTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQ29sbGVjdGlvbnNUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0NvbGxlY3Rpb25zVGVzdC5qYXZhCmluZGV4IGUxZmE3NmMuLmFkZDJjOGMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQ29sbGVjdGlvbnNUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9Db2xsZWN0aW9uc1Rlc3QuamF2YQpAQCAtMTcsNiArMTcsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0zOSw5ICs0Niw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCB0ZXN0cy51dGlsLlNlcmlhbGl6YXRpb25UZXN0ZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ29sbGVjdGlvbnMuY2xhc3MpIAogcHVibGljIGNsYXNzIENvbGxlY3Rpb25zVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlcmlhbGl6YWJsZUFzc2VydCBjb21wYXJhdG9yID0gbmV3IFNlcmlhbGl6YWJsZUFzc2VydCgpIHsKQEAgLTU0LDYgKzYxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNiaW5hcnlTZWFyY2goamF2YS51dGlsLkxpc3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db21wYXJhdG9yKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5hcnlTZWFyY2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEudXRpbC5Db21wYXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2JpbmFyeVNlYXJjaExqYXZhX3V0aWxfTGlzdExqYXZhX2xhbmdfT2JqZWN0TGphdmFfdXRpbF9Db21wYXJhdG9yKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTk0CiAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbHN0ID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKQEAgLTY3LDYgKzgzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNiaW5hcnlTZWFyY2goamF2YS51dGlsLkxpc3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBhcmUgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmFyeVNlYXJjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5hcnlTZWFyY2hMamF2YV91dGlsX0xpc3RMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiBmb3IgSGFybW9ueS0xMzY3CkBAIC04NCw2ICsxMDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JvdGF0ZShqYXZhLnV0aWwuTGlzdCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicm90YXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfcm90YXRlTGphdmFfdXRpbF9MaXN0SSgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xOSBSb3RhdGUgYW4gKmVtcHR5KiBsaXN0CiAgICAgICAgIENvbGxlY3Rpb25zLnJvdGF0ZShuZXcgQXJyYXlMaXN0PE9iamVjdD4oKSwgMjUpOwpAQCAtMTEyLDYgKzE0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkQ29sbGVjdGlvbihqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeW5jaHJvbml6ZWRDb2xsZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N5bmNocm9uaXplZENvbGxlY3Rpb25MamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTkzCkBAIC0xMjUsNiArMTY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRTb3J0ZWRNYXAoamF2YS51dGlsLlNvcnRlZE1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeW5jaHJvbml6ZWRTb3J0ZWRNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNvcnRlZE1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zeW5jaHJvbml6ZWRTb3J0ZWRNYXBMamF2YV91dGlsX1NvcnRlZE1hcCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktOTMKQEAgLTEzOCw2ICsxOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmNocm9uaXplZE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N5bmNocm9uaXplZE1hcExqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS05MwpAQCAtMTUxLDYgKzIxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkU2V0KGphdmEudXRpbC5TZXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3luY2hyb25pemVkU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3luY2hyb25pemVkU2V0TGphdmFfdXRpbF9TZXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTkzCkBAIC0xNjQsNiArMjM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRTb3J0ZWRTZXQoamF2YS51dGlsLlNvcnRlZFNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeW5jaHJvbml6ZWRTb3J0ZWRTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNvcnRlZFNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zeW5jaHJvbml6ZWRTb3J0ZWRTZXRMamF2YV91dGlsX1NvcnRlZFNldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktOTMKQEAgLTE3Nyw2ICsyNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3VubW9kaWZpYWJsZUNvbGxlY3Rpb24oamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tb2RpZmlhYmxlQ29sbGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bm1vZGlmaWFibGVDb2xsZWN0aW9uTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS05MwpAQCAtMTkwLDYgKzI3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlTWFwKGphdmEudXRpbC5NYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tb2RpZmlhYmxlTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5tb2RpZmlhYmxlTWFwTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTkzCkBAIC0yMDMsNiArMzAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyN1bm1vZGlmaWFibGVTZXQoamF2YS51dGlsLlNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1vZGlmaWFibGVTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bm1vZGlmaWFibGVTZXRMamF2YV91dGlsX1NldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktOTMKQEAgLTIxNiw2ICszMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3VubW9kaWZpYWJsZVNvcnRlZE1hcChqYXZhLnV0aWwuU29ydGVkTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVubW9kaWZpYWJsZVNvcnRlZE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU29ydGVkTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VubW9kaWZpYWJsZVNvcnRlZE1hcExqYXZhX3V0aWxfU29ydGVkTWFwKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS05MwpAQCAtMjI5LDYgKzM0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlU29ydGVkU2V0KGphdmEudXRpbC5Tb3J0ZWRTZXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tb2RpZmlhYmxlU29ydGVkU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Tb3J0ZWRTZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5tb2RpZmlhYmxlU29ydGVkU2V0TGphdmFfdXRpbF9Tb3J0ZWRTZXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTkzCkBAIC0yNDIsNiArMzY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNmcmVxdWVuY3koamF2YS51dGlsLkNvbGxlY3Rpb24sT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmcmVxdWVuY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZnJlcXVlbmN5TGphdmFfdXRpbF9Db2xsZWN0aW9uTGludCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENvbGxlY3Rpb25zLmZyZXF1ZW5jeShudWxsLCBudWxsKTsKQEAgLTI3OCw2ICs0MTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JldmVyc2VPcmRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJldmVyc2VPcmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmV2ZXJzZU9yZGVyKCkgewogICAgICAgICBDb21wYXJhdG9yPFN0cmluZz4gcm9jID0gQ29sbGVjdGlvbnMucmV2ZXJzZU9yZGVyKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkFzc2VydCAwOiBjb21wYXJhdG9yIG11c3Qgbm90IGJlIG51bGwiLCByb2MpOwpAQCAtMjk1LDYgKzQzNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjcmV2ZXJzZU9yZGVyKGphdmEudXRpbC5Db21wYXJhdG9yKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXZlcnNlT3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Q29tcGFyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXZlcnNlT3JkZXJMamF2YV91dGlsX0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIENvbXBhcmF0b3I8U3RyaW5nPiByb2MgPSBDb2xsZWN0aW9ucwogICAgICAgICAgICAgICAgIC5yZXZlcnNlT3JkZXIoU3RyaW5nLkNBU0VfSU5TRU5TSVRJVkVfT1JERVIpOwpAQCAtMzIwLDcgKzQ3MSwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJBc3NlcnQgNTogdGhlIGFycmF5cyBhcmUgbm90IGVxdWFsLCB0aGUgc29ydCBmYWlsZWQiLAogICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoZml4dHVyZURlc2MsIG51bWJlcnMpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGFyZSBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzLCBPYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9BZGRBbGwoKSB7CiAgICAgICAgIExpc3Q8T2JqZWN0PiBsID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CiAgICAgICAgIGFzc2VydEZhbHNlKENvbGxlY3Rpb25zLmFkZEFsbChsLCBuZXcgT2JqZWN0W10ge30pKTsKQEAgLTMzMSw3ICs0OTAsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShsLmVxdWFscyhBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDEpLAogICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigzKSB9KSkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXNqb2ludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzcywgamF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRGlzam9pbnQoKSB7CiAgICAgICAgIE9iamVjdFtdIGFycjEgPSBuZXcgT2JqZWN0WzEwXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgaSsrKSB7CkBAIC0zOTQsNiArNTYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucy5FbXB0eUxpc3QjcmVhZFJlc29sdmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRW1wdHlMaXN0X3JlYWRSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgY29tcGFyYXRvcik7CiAgICAgfQpAQCAtNDAxLDYgKzU3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuRW1wdHlNYXAjcmVhZFJlc29sdmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRW1wdHlNYXBfcmVhZFJlc29sdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIGNvbXBhcmF0b3IpOwogICAgIH0KQEAgLTQwOCw1MCArNTkzLDExNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuRW1wdHlTZXQjcmVhZFJlc29sdmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRW1wdHlTZXRfcmVhZFJlc29sdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIGNvbXBhcmF0b3IpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tlZENvbGxlY3Rpb25TZXJpYWxpemF0aW9uQ29tcGF0YWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAgICAgICAgIGMgPSBDb2xsZWN0aW9ucy5jaGVja2VkQ29sbGVjdGlvbihjLCBTdHJpbmcuY2xhc3MpOwogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdGVyLmFzc2VydENvbXBhYmlsaXR5RXF1YWxzKGMsICIvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQ29sbGVjdGlvbnNfQ2hlY2tlZENvbGxlY3Rpb24uZ29sZGVuLnNlciIpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tlZExpc3RSYW5kb21BY2Nlc3NTZXJpYWxpemF0aW9uQ29tcGF0YWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBMaXN0PFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgICAgICBhc3NlcnRUcnVlKGMgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpOwogICAgICAgICBjID0gQ29sbGVjdGlvbnMuY2hlY2tlZExpc3QoYywgU3RyaW5nLmNsYXNzKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3Rlci5hc3NlcnRDb21wYWJpbGl0eUVxdWFscyhjLCAiL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0NvbGxlY3Rpb25zX0NoZWNrZWRMaXN0UmFuZG9tQWNjZXNzLmdvbGRlbi5zZXIiKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrZWRMaXN0U2VyaWFsaXphdGlvbkNvbXBhdGFiaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTGlzdDxTdHJpbmc+IGMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGMgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpOwogICAgICAgICBjID0gQ29sbGVjdGlvbnMuY2hlY2tlZExpc3QoYywgU3RyaW5nLmNsYXNzKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3Rlci5hc3NlcnRDb21wYWJpbGl0eUVxdWFscyhjLCAiL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0NvbGxlY3Rpb25zX0NoZWNrZWRMaXN0LmdvbGRlbi5zZXIiKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrZWRTZXRTZXJpYWxpemF0aW9uQ29tcGF0YWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXQ8U3RyaW5nPiBjID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgICAgICBhc3NlcnRGYWxzZShjIGluc3RhbmNlb2YgU29ydGVkU2V0KTsKICAgICAgICAgYyA9IENvbGxlY3Rpb25zLmNoZWNrZWRTZXQoYywgU3RyaW5nLmNsYXNzKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3Rlci5hc3NlcnRDb21wYWJpbGl0eUVxdWFscyhjLCAiL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0NvbGxlY3Rpb25zX0NoZWNrZWRTZXQuZ29sZGVuLnNlciIpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tlZE1hcFNlcmlhbGl6YXRpb25Db21wYXRhYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgICBhc3NlcnRGYWxzZShjIGluc3RhbmNlb2YgU29ydGVkTWFwKTsKICAgICAgICAgYyA9IENvbGxlY3Rpb25zLmNoZWNrZWRNYXAoYywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdGVyLmFzc2VydENvbXBhYmlsaXR5RXF1YWxzKGMsICIvc2VyaWFsaXphdGlvbi9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvQ29sbGVjdGlvbnNfQ2hlY2tlZE1hcC5nb2xkZW4uc2VyIik7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja2VkU29ydGVkU2V0U2VyaWFsaXphdGlvbkNvbXBhdGFiaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU29ydGVkU2V0PFN0cmluZz4gYyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKICAgICAgICAgYyA9IENvbGxlY3Rpb25zLmNoZWNrZWRTb3J0ZWRTZXQoYywgU3RyaW5nLmNsYXNzKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3Rlci5hc3NlcnRDb21wYWJpbGl0eUVxdWFscyhjLCAiL3NlcmlhbGl6YXRpb24vb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0NvbGxlY3Rpb25zX0NoZWNrZWRTb3J0ZWRTZXQuZ29sZGVuLnNlciIpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tlZFNvcnRlZE1hcFNlcmlhbGl6YXRpb25Db21wYXRhYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gYyA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgICBjID0gQ29sbGVjdGlvbnMuY2hlY2tlZFNvcnRlZE1hcChjLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcyk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0RhdGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0RhdGVUZXN0LmphdmEKaW5kZXggZDg5OTUzMC4uNDRmMTVlMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9EYXRlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRGF0ZVRlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDMxIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS51dGlsOwogCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRGF0ZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRGF0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjcGFyc2UoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNwZWNpYWwgcmVncmVzc2lvbiB0ZXN0LiBEb2Vzbid0IHZlcmlmeSBhbGwgY2FzZXMgYWNjb3JkaW5nICIgKworICAgICAgICAgICAgInRvIHRoZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTEwMgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9EdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZmY2YzA4Zi4uZWJlMzY0OCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9EdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0R1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwxOSArMTYsMzQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb247CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkR1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uOworCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhEdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbiNEdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBEdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbihudWxsKTsKQEAgLTQxLDYgKzU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbiNnZXRGbGFncygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZsYWdzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGbGFncygpIHsKICAgICAgICAgU3RyaW5nIHN0ckZsYWdzID0gIk1ZVEVTVEZMQUdTIjsKICAgICAgICAgRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb24gZHVwbGljYXRlRm9ybWF0RXhjZXB0aW9uID0gbmV3IER1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uKApAQCAtNTEsNiArNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkR1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uI2dldE1lc3NhZ2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNZXNzYWdlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewogICAgICAgICBTdHJpbmcgc3RyRmxhZ3MgPSAiTVlURVNURkxBR1MiOwogICAgICAgICBEdXBsaWNhdGVGb3JtYXRGbGFnc0V4Y2VwdGlvbiBkdXBsaWNhdGVGb3JtYXRFeGNlcHRpb24gPSBuZXcgRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb24oCkBAIC03Nyw2ICsxMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IER1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uKApAQCAtODYsNiArMTI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IER1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9Gb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMmVhZDczNC4uNjkzYWViOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9Gb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0Zvcm1hdEZsYWdzQ29udmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwyMCArMTYsMzUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb247CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkZvcm1hdEZsYWdzQ29udmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uOworCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhGb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5jbGFzcykgICAgIAogcHVibGljIGNsYXNzIEZvcm1hdEZsYWdzQ29udmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24jRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24oU3RyaW5nLAogICAgICAqICAgICAgICBjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdEZsYWdzQ29udmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGNoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24obnVsbCwgJyAnKTsKQEAgLTQzLDYgKzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiNnZXRGbGFncygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZsYWdzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGbGFncygpIHsKICAgICAgICAgU3RyaW5nIGZsYWdzID0gIk1ZVEVTVEZMQUdTIjsKICAgICAgICAgY2hhciBjb252ZXJzaW9uID0gJ1QnOwpAQCAtNTQsMTAgKzc4LDIxIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiNnZXRDb252ZXJzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29udmVyc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udmVyc2lvbigpIHsKICAgICAgICAgU3RyaW5nIGZsYWdzID0gIk1ZVEVTVEZMQUdTIjsKICAgICAgICAgY2hhciBjb252ZXJzaW9uID0gJ1QnOwotICAgICAgICBGb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiBmb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiA9IG5ldyBGb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbigKKyAgICAgICAgRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24gCisgICAgICAgICAgICAgICAgZm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICBmbGFncywgY29udmVyc2lvbik7CiAgICAgICAgIGFzc2VydEVxdWFscyhjb252ZXJzaW9uLCBmb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbgogICAgICAgICAgICAgICAgIC5nZXRDb252ZXJzaW9uKCkpOwpAQCAtNjcsNiArMTAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiNnZXRNZXNzYWdlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWVzc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKICAgICAgICAgU3RyaW5nIGZsYWdzID0gIk1ZVEVTVEZMQUdTIjsKICAgICAgICAgY2hhciBjb252ZXJzaW9uID0gJ1QnOwpAQCAtOTYsNiArMTQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKApAQCAtMTA2LDYgKzE1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0Zvcm1hdHRlckNsb3NlZEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDFmN2UyZTkuLjk1MTJmNDYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMzMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlckNsb3NlZEV4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24oKSk7CkBAIC0zNSw2ICs1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24oKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0Zvcm1hdHRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRm9ybWF0dGVyVGVzdC5qYXZhCmluZGV4IDY2ZDE4YjUuLmJiYTc2MDYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRm9ybWF0dGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvRm9ybWF0dGVyVGVzdC5qYXZhCkBAIC0xNiwyNSArMTYsNTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm07CisKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS51dGlsLiAgICBGb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm0uY2xhc3MpIAogcHVibGljIGNsYXNzIEZvcm1hdHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybSN2YWx1ZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlcygpIHsKICAgICAgICAgQmlnRGVjaW1hbExheW91dEZvcm1bXSB2YWxzID0gQmlnRGVjaW1hbExheW91dEZvcm0udmFsdWVzKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBsZW5ndGggb2YgZW51bSB2YWx1ZXMiLCAyLCB2YWxzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3Jvbmcgc2NpZW50aWZpYyB2YWx1ZSBpbiBlbnVtIiwgQmlnRGVjaW1hbExheW91dEZvcm0uU0NJRU5USUZJQywgdmFsc1swXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZGVjIGZsb2F0IHZhbHVlIGluIGVudW0iLCBCaWdEZWNpbWFsTGF5b3V0Rm9ybS5ERUNJTUFMX0ZMT0FULCB2YWxzWzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBzY2llbnRpZmljIHZhbHVlIGluIGVudW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbExheW91dEZvcm0uU0NJRU5USUZJQywgdmFsc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZGVjIGZsb2F0IHZhbHVlIGluIGVudW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbExheW91dEZvcm0uREVDSU1BTF9GTE9BVCwgdmFsc1sxXSk7CiAgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtI3ZhbHVlT2YoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBCaWdEZWNpbWFsTGF5b3V0Rm9ybSBzY2kgPSBCaWdEZWNpbWFsTGF5b3V0Rm9ybS52YWx1ZU9mKCJTQ0lFTlRJRklDIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiV3Jvbmcgc2NpZW50aWZpYyB2YWx1ZSBpbiBlbnVtIiwgQmlnRGVjaW1hbExheW91dEZvcm0uU0NJRU5USUZJQywgc2NpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSGFzaE1hcFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSGFzaE1hcFRlc3QuamF2YQppbmRleCBkMjZjOGFiLi4xYTAzZTJiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0hhc2hNYXBUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9IYXNoTWFwVGVzdC5qYXZhCkBAIC0xNiwxMyArMTYsMTkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKEhhc2hNYXAuY2xhc3MpIAogcHVibGljIGNsYXNzIEhhc2hNYXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIGNsYXNzIFN1Yk1hcDxLLCBWPiBleHRlbmRzIEhhc2hNYXA8SywgVj4gewogICAgICAgICBwdWJsaWMgU3ViTWFwKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG0pIHsKQEAgLTM3LDYgKzQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoTWFwI0hhc2hNYXAoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSGFzaE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKICAgICAgICAgbWFwLnB1dCgiYSIsICJhIik7CkBAIC00OCw2ICs2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgICAgIGhtLnB1dCgia2V5IiwgInZhbHVlIik7CkBAIC02Miw2ICs4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgICAgIGhtLnB1dCgia2V5IiwgInZhbHVlIik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lkZW50aXR5SGFzaE1hcFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwVGVzdC5qYXZhCmluZGV4IGM5MWZkNGEuLjM2MjY4ODggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMjksNiArMzQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSWRlbnRpdHlIYXNoTWFwLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJZGVudGl0eUhhc2hNYXBUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgpAQCAtMzcsNiArNDMsMjcgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCNwdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCNnZXQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWluc0tleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbnVsbF9LZXlzX2FuZF9WYWx1ZXMoKSB7CiAgICAgICAgIC8vIHRlc3RzIHdpdGggbnVsbCBrZXlzIGFuZCB2YWx1ZXMKICAgICAgICAgSWRlbnRpdHlIYXNoTWFwIG1hcCA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKQEAgLTkyLDYgKzExOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBJZGVudGl0eUhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+IG1hcCA9IG5ldyBJZGVudGl0eUhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CiAgICAgICAgIApAQCAtMTEwLDYgKzE0NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgcmVtb3ZlZCB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmUoKSB7CiAgICAgICAgIElkZW50aXR5SGFzaE1hcCBtYXAgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7CiAgICAgICAgIG1hcC5wdXQobnVsbCwgbnVsbCk7CkBAIC0xMjksNiArMTc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXBUZXN0I3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0zNwogICAgICAgICBJZGVudGl0eUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhhc2hNYXAgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwpAQCAtMTUwLDYgKzIwNCwyMyBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2tleVNldCgpCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudHJ5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldHMoKSB7CiAgICAgICAgIC8vIHRlc3RzIHdpdGggbnVsbCBrZXlzIGFuZCB2YWx1ZXMKICAgICAgICAgSWRlbnRpdHlIYXNoTWFwIG1hcCA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKQEAgLTE4NSw2ICsyNTYsMjAgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCNlbnRyeVNldCgpCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4gRG9lc24ndCB2ZXJpZnkgdGhhdCByZW1vdmUgIiArCisgICAgICAgICAgICAibWV0aG9kIHJldHVybnMgbnVsbCBpZiB0aGVyZSB3YXMgbm8gZW50cnkgZm9yIGtleS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cnlTZXRfcmVtb3ZlQWxsKCkgewogICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgewpAQCAtMjA0LDYgKzI4OSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2tleVNldCgpCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjY2xlYXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXRfY2xlYXIoKSB7CiAgICAgICAgIElkZW50aXR5SGFzaE1hcCBtYXAgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CkBAIC0yMjIsNiArMzE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlcygpIHsKIAogICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwpAQCAtMjczLDYgKzM3NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2tleVNldCgpCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXRfcmVtb3ZlQWxsKCkgewogICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgewpAQCAtMjkxLDYgKzQwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXRfcmV0YWluQWxsKCkgewogICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgewpAQCAtMzE3LDYgKzQzOCwxOSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2tleVNldCgpCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlzZXRfcmVtb3ZlKCkgewogICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwogCkBAIC0zNzIsNiArNTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSWRlbnRpdHlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBpZGVudGl0eUhhc2hNYXAgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgICBpZGVudGl0eUhhc2hNYXAucHV0KCJrZXkxIiwgInZhbHVlMSIpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDdlZjk3MTUuLmZjZjZkZTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDE5ICsxNiwzNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEudXRpbDsKIAotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uOworCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbi5JbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbigpIHsKICAgICAgICAgSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbiBpbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uID0gbmV3IElsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgLTEpOwpAQCAtMzgsNiArNTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24uZ2V0Q29kZVBvaW50KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29kZVBvaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb2RlUG9pbnQoKSB7CiAgICAgICAgIGludCBjb2RlUG9pbnQgPSAxMjM0NTsKICAgICAgICAgSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbiBpbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uID0gbmV3IElsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24oCkBAIC00OCw2ICs3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWVzc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKICAgICAgICAgaW50IGNvZGVQb2ludCA9IDEyMzQ1OwogICAgICAgICBJbGxlZ2FsRm9ybWF0Q29kZVBvaW50RXhjZXB0aW9uIGlsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24gPSBuZXcgSWxsZWdhbEZvcm1hdENvZGVQb2ludEV4Y2VwdGlvbigKQEAgLTc0LDYgKzEwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZigKQEAgLTgzLDYgKzEyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA0ZDVjMzdkLi5mMDdlYzcwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDIwICsxNiwzNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEudXRpbDsKIAotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKElsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uI0lsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uKGNoYXIsCiAgICAgICogICAgICAgIENsYXNzKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3MsIGphdmEubGFuZy5DbGFzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbignICcsIG51bGwpOwpAQCAtNDIsNiArNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uI2dldEFyZ3VtZW50Q2xhc3MoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBcmd1bWVudENsYXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBcmd1bWVudENsYXNzKCkgewogICAgICAgICBjaGFyIGMgPSAnKic7CiAgICAgICAgIENsYXNzPFN0cmluZz4gYXJnQ2xhc3MgPSBTdHJpbmcuY2xhc3M7CkBAIC01NSw2ICs3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24jZ2V0Q29udmVyc2lvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbnZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbnZlcnNpb24oKSB7CiAgICAgICAgIGNoYXIgYyA9ICcqJzsKICAgICAgICAgQ2xhc3M8U3RyaW5nPiBhcmdDbGFzcyA9IFN0cmluZy5jbGFzczsKQEAgLTY3LDYgKzEwMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24jZ2V0TWVzc2FnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CiAgICAgICAgIGNoYXIgYyA9ICcqJzsKICAgICAgICAgQ2xhc3M8U3RyaW5nPiBhcmdDbGFzcyA9IFN0cmluZy5jbGFzczsKQEAgLTk3LDYgKzEzOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgSWxsZWdhbEZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24oJyonLApAQCAtMTA2LDYgKzE1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDUzMGYyODEuLjg5MGNkMTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwxOSArMTYsMzQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKElsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uI0lsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IElsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbihudWxsKTsKQEAgLTQxLDYgKzU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24uZ2V0RmxhZ3MoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGbGFncyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmxhZ3MoKSB7CiAgICAgICAgIFN0cmluZyBmbGFncyA9ICJURVNURkxBR1MiOwogICAgICAgICBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24gaWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uID0gbmV3IElsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbigKQEAgLTUxLDYgKzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24uZ2V0TWVzc2FnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CiAgICAgICAgIFN0cmluZyBmbGFncyA9ICJURVNURkxBR1MiOwogICAgICAgICBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24gaWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uID0gbmV3IElsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbigKQEAgLTc3LDYgKzExMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgSWxsZWdhbEZvcm1hdEZsYWdzRXhjZXB0aW9uKApAQCAtODYsNiArMTI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IElsbGVnYWxGb3JtYXRGbGFnc0V4Y2VwdGlvbigKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmN2M2MGVhLi4xMTVhNzUyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSwxOSArMTUsMzQgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbjsKKwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24jSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbihpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24oKSB7CiAgICAgICAgIElsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24gaWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbiA9IG5ldyBJbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFKTsKQEAgLTM4LDYgKzUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uI2dldFByZWNpc2lvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByZWNpc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJlY2lzaW9uKCkgewogICAgICAgICBpbnQgcHJlY2lzaW9uID0gMTIzNDU7CiAgICAgICAgIElsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24gaWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbiA9IG5ldyBJbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uKApAQCAtNDgsNiArNzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgbWV0aG9kIGZvciAnamF2YS51dGlsLklsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24jZ2V0TWVzc2FnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CiAgICAgICAgIGludCBwcmVjaXNpb24gPSAxMjM0NTsKICAgICAgICAgSWxsZWdhbEZvcm1hdFByZWNpc2lvbkV4Y2VwdGlvbiBpbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uID0gbmV3IElsbGVnYWxGb3JtYXRQcmVjaXNpb25FeGNlcHRpb24oCkBAIC03NSw2ICsxMDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYoCkBAIC04NCw2ICsxMjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9JbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA0MjYyYWEwLi45Y2ZmYTNhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsMTkgKzE1LDM0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS51dGlsOwogCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLklsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdFdpZHRoRXhjZXB0aW9uOworCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIElsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiNJbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24oaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbigpIHsKICAgICAgICAgaW50IHdpZHRoID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgIElsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiBpbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24gPSBuZXcgSWxsZWdhbEZvcm1hdFdpZHRoRXhjZXB0aW9uKApAQCAtMzksNiArNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiNnZXRXaWR0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFdpZHRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRXaWR0aCgpIHsKICAgICAgICAgaW50IHdpZHRoID0gMTIzNDU7CiAgICAgICAgIElsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiBpbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24gPSBuZXcgSWxsZWdhbEZvcm1hdFdpZHRoRXhjZXB0aW9uKApAQCAtNTAsNiArNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiNnZXRNZXNzYWdlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWVzc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKICAgICAgICAgaW50IHdpZHRoID0gMTIzNDU7CiAgICAgICAgIElsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiBpbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24gPSBuZXcgSWxsZWdhbEZvcm1hdFdpZHRoRXhjZXB0aW9uKApAQCAtNzYsNiArMTA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbGxlZ2FsRm9ybWF0V2lkdGhFeGNlcHRpb24oMTIzNDUpLApAQCAtODUsNiArMTI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IElsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbigKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSW5wdXRNaXNtYXRjaEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvSW5wdXRNaXNtYXRjaEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA2MGM1ZGM3Li42MTNjNTJjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0lucHV0TWlzbWF0Y2hFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9JbnB1dE1pc21hdGNoRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSwxNCArMTUsMjAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTUVTU0FHRSA9ICJmb3Igc2VyaWFsaXphdGlvbiB0ZXN0IjsgLy8kTk9OLU5MUy0xJApAQCAtMzAsNiArMzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklucHV0TWlzbWF0Y2hFeGNlcHRpb24jSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklucHV0TWlzbWF0Y2hFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbigpOwpAQCAtNDEsNiArNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklucHV0TWlzbWF0Y2hFeGNlcHRpb24jSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklucHV0TWlzbWF0Y2hFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBJbnB1dE1pc21hdGNoRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG5ldyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIEVSUk9SX01FU1NBR0UpOwpAQCAtNTEsNiArNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IElucHV0TWlzbWF0Y2hFeGNlcHRpb24oRVJST1JfTUVTU0FHRSkpOwpAQCAtNTksNiArOTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbigKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcFRlc3QuamF2YQppbmRleCA3YzkxZDczLi5jMzQ3ZTg0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL0xpbmtlZEhhc2hNYXBUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9MaW5rZWRIYXNoTWFwVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0zNCw2ICszOSw3IEBACiAvKioKICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcAogICovCitAVGVzdFRhcmdldENsYXNzKExpbmtlZEhhc2hNYXAuY2xhc3MpIAogcHVibGljIGNsYXNzIExpbmtlZEhhc2hNYXBUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIExpbmtlZEhhc2hNYXAgaG07CkBAIC03Myw2ICs3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNMaW5rZWRIYXNoTWFwKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGlua2VkSGFzaE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCgpCiAgICAgICAgIG5ldyBTdXBwb3J0X01hcFRlc3QyKG5ldyBMaW5rZWRIYXNoTWFwKCkpLnJ1blRlc3QoKTsKQEAgLTg0LDYgKzk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI0xpbmtlZEhhc2hNYXAoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMaW5rZWRIYXNoTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcChpbnQpCiAgICAgICAgIExpbmtlZEhhc2hNYXAgaG0yID0gbmV3IExpbmtlZEhhc2hNYXAoNSk7CkBAIC0xMDUsNiArMTI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI0xpbmtlZEhhc2hNYXAoaW50LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGlua2VkSGFzaE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcChpbnQsIGZsb2F0KQogICAgICAgICBMaW5rZWRIYXNoTWFwIGhtMiA9IG5ldyBMaW5rZWRIYXNoTWFwKDUsIChmbG9hdCkgMC41KTsKQEAgLTEyNSw2ICsxNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAjTGlua2VkSGFzaE1hcChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMaW5rZWRIYXNoTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX01hcCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKGphdmEudXRpbC5NYXApCiAgICAgICAgIE1hcCBteU1hcCA9IG5ldyBUcmVlTWFwKCk7CkBAIC0xMzksNiArMTgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI2dldChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS51dGlsLkxpbmtlZEhhc2hNYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCkBAIC0xNTgsNiArMjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dExqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLnB1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTc4LDYgKzIzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNwdXRBbGwoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBvbmx5IHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0QWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLnB1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAgICBMaW5rZWRIYXNoTWFwIGhtMiA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CkBAIC0xOTAsNiArMjU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3B1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dEFsbF9MamF2YV91dGlsX01hcF9OdWxsKCkgewogICAgICAgICBMaW5rZWRIYXNoTWFwIGxpbmtlZEhhc2hNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwogICAgICAgICB0cnkgewpAQCAtMjEwLDYgKzI4OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNlbnRyeVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudHJ5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbnRyeVNldCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TZXQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAuZW50cnlTZXQoKQogICAgICAgICBTZXQgcyA9IGhtLmVudHJ5U2V0KCk7CkBAIC0yMjYsNiArMzEzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfa2V5U2V0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNldCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5rZXlTZXQoKQogICAgICAgICBTZXQgcyA9IGhtLmtleVNldCgpOwpAQCAtMjc5LDYgKzM3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCN2YWx1ZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Db2xsZWN0aW9uIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLnZhbHVlcygpCiAgICAgICAgIENvbGxlY3Rpb24gYyA9IGhtLnZhbHVlcygpOwpAQCAtMzA1LDYgKzQxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLnJlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMzI3LDYgKzQ0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAuY2xlYXIoKQogICAgICAgICBobS5jbGVhcigpOwpAQCAtMzQwLDYgKzQ2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAuY2xvbmUoKQogICAgICAgICBMaW5rZWRIYXNoTWFwIGhtMiA9IChMaW5rZWRIYXNoTWFwKSBobS5jbG9uZSgpOwpAQCAtMzc2LDYgKzUwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNjb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWluc0tleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zS2V5TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLmNvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCkBAIC0zOTMsNiArNTM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI2NvbnRhaW5zVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zVmFsdWVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLkxpbmtlZEhhc2hNYXAuY29udGFpbnNWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNDA1LDYgKzU1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNpc0VtcHR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFbXB0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkxpbmtlZEhhc2hNYXAuaXNFbXB0eSgpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGZhbHNlIGZvciBuZXcgbWFwIiwgbmV3IExpbmtlZEhhc2hNYXAoKS5pc0VtcHR5KCkpOwpAQCAtNDE0LDYgKzU3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5zaXplKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IHNpemUiLApAQCAtNDIzLDYgKzU5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNlbnRyeVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudHJ5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vcmRlcmVkX2VudHJ5U2V0KCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IHN6ID0gMTAwOwpAQCAtNDg1LDYgKzY2MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNrZXlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29yZGVyZWRfa2V5U2V0KCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IHN6ID0gMTAwOwpAQCAtNTQxLDYgKzcyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCN2YWx1ZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29yZGVyZWRfdmFsdWVzKCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IHN6ID0gMTAwOwpAQCAtNTk3LDYgKzc5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNyZW1vdmVFbGRlc3RFbnRyeShqYXZhLnV0aWwuTWFwJEVudHJ5KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlRWxkZXN0RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5FbnRyeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVfZWxkZXN0KCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IHN6ID0gMTA7CkBAIC02MTYsNiArODIwLDE5IEBACiAgICAgICAgIGFzc2VydFRydWUoIkVudHJpZXMgbGVmdCBpbiBtYXAiLCAhaXQxLmhhc05leHQoKSk7CiAgICAgfQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVyYWN0aW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGlua2VkSGFzaE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGZsb2F0LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgcHVibGljIHZvaWQgdGVzdExpbmtlZEhhc2hNYXAoKSB7CiAgICAgICAgIC8vIHdlIHdhbnQgdG8gdGVzdCB0aGUgTGlua2VkSGFzaE1hcCBpbiBhY2Nlc3Mgb3JkZXJpbmcgbW9kZS4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvTG9jYWxlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9Mb2NhbGVUZXN0LmphdmEKaW5kZXggM2YyNDIxYS4uMGY1NTI5NiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9Mb2NhbGVUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9Mb2NhbGVUZXN0LmphdmEKQEAgLTE2LDE1ICsxNiwzMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEudXRpbDsKIAotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworQFRlc3RUYXJnZXRDbGFzcyhMb2NhbGUuY2xhc3MpIAogcHVibGljIGNsYXNzIExvY2FsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxvY2FsZSNnZXRBdmFpbGFibGVMb2NhbGVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXZhaWxhYmxlTG9jYWxlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHsKICAgICAgICAgTG9jYWxlW10gbG9jYWxlcyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICAgICAgIC8vIEFzc3VtZXMgdGhhdCB0aGVyZSB3aWxsIGJlIGEgZGVjZW50IG51bWJlciBvZiBsb2NhbGVzCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL01pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDcwNWI1OTcuLjkzNDZiMzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwxOSArMTYsMzQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nRm9ybWF0QXJndW1lbnRFeGNlcHRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKE1pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uI01pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uKCkgewogCiAgICAgICAgIHRyeSB7CkBAIC00Miw2ICs1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uI2dldEZvcm1hdFNwZWNpZmllcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZvcm1hdFNwZWNpZmllciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9ybWF0U3BlY2lmaWVyKCkgewogICAgICAgICBTdHJpbmcgcyA9ICJNWVRFU1RTVFJJTkciOwogICAgICAgICBNaXNzaW5nRm9ybWF0QXJndW1lbnRFeGNlcHRpb24gbWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uID0gbmV3IE1pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvbigKQEAgLTUyLDYgKzc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5NaXNzaW5nRm9ybWF0QXJndW1lbnRFeGNlcHRpb24jZ2V0TWVzc2FnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CiAgICAgICAgIFN0cmluZyBzID0gIk1ZVEVTVFNUUklORyI7CiAgICAgICAgIE1pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvbiBtaXNzaW5nRm9ybWF0QXJndW1lbnRFeGNlcHRpb24gPSBuZXcgTWlzc2luZ0Zvcm1hdEFyZ3VtZW50RXhjZXB0aW9uKApAQCAtNzksNiArMTEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBNaXNzaW5nRm9ybWF0QXJndW1lbnRFeGNlcHRpb24oCkBAIC04OCw2ICsxMzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9NaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL01pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA4MWZhMmQ3Li4yNzg4Y2MwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL01pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL01pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsMTkgKzE1LDM0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS51dGlsOwogCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ0Zvcm1hdFdpZHRoRXhjZXB0aW9uOworCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhNaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIE1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLk1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbiNNaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24oU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBNaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24obnVsbCk7CkBAIC00MCw2ICs1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTWlzc2luZ0Zvcm1hdFdpZHRoRXhjZXB0aW9uI2dldEZvcm1hdFNwZWNpZmllcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZvcm1hdFNwZWNpZmllciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9ybWF0U3BlY2lmaWVyKCkgewogICAgICAgICBTdHJpbmcgcyA9ICJNWVRFU1RTVFJJTkciOwogICAgICAgICBNaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24gbWlzc2luZ0Zvcm1hdFdpZHRoRXhjZXB0aW9uID0gbmV3IE1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbigKQEAgLTUxLDYgKzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5NaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24jZ2V0TWVzc2FnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CiAgICAgICAgIFN0cmluZyBzID0gIk1ZVEVTVFNUUklORyI7CiAgICAgICAgIE1pc3NpbmdGb3JtYXRXaWR0aEV4Y2VwdGlvbiBtaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24gPSBuZXcgTWlzc2luZ0Zvcm1hdFdpZHRoRXhjZXB0aW9uKApAQCAtNzgsNiArMTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBNaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24oCkBAIC04Nyw2ICsxMjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgTWlzc2luZ0Zvcm1hdFdpZHRoRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9VVUlEVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9VVUlEVGVzdC5qYXZhCmluZGV4IDc3NjViNGMuLjViZGQzN2QgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVVVJRFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL1VVSURUZXN0LmphdmEKQEAgLTE3LDE3ICsxNywzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhVVUlELmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBVVUlEVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEBzZWUgVVVJRCNVVUlEKGxvbmcsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVVSUQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3R1ckpKKCkgewogICAgICAgICBVVUlEIHV1aWQgPSBuZXcgVVVJRCgweGY4MWQ0ZmFlN2RlYzExZDBMLCAweGE3NjUwMGEwYzkxZTZiZjZMKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHV1aWQudmFyaWFudCgpKTsKQEAgLTQxLDYgKzU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHNlZSBVVUlEI2dldExlYXN0U2lnbmlmaWNhbnRCaXRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExlYXN0U2lnbmlmaWNhbnRCaXRzKCkgewogICAgICAgICBVVUlEIHV1aWQgPSBuZXcgVVVJRCgwLCAwKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHV1aWQuZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKSk7CkBAIC01Myw2ICs3NywxNSBAQAogICAgIC8qKgogICAgICAqIEBzZWUgVVVJRCNnZXRNb3N0U2lnbmlmaWNhbnRCaXRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TW9zdFNpZ25pZmljYW50Qml0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9zdFNpZ25pZmljYW50Qml0cygpIHsKICAgICAgICAgVVVJRCB1dWlkID0gbmV3IFVVSUQoMCwgMCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB1dWlkLmdldE1vc3RTaWduaWZpY2FudEJpdHMoKSk7CkBAIC02NSw2ICs5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEBzZWUgVVVJRCN2ZXJzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmVyc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmVyc2lvbigpIHsKICAgICAgICAgVVVJRCB1dWlkID0gbmV3IFVVSUQoMCwgMCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB1dWlkLnZlcnNpb24oKSk7CkBAIC04Myw2ICsxMjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAc2VlIFVVSUQjdmFyaWFudCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhcmlhbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhcmlhbnQoKSB7CiAgICAgICAgIFVVSUQgdXVpZCA9IG5ldyBVVUlEKDAsIDB4MDAwMDAwMDAwMDAwMDAwMEwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXVpZC52YXJpYW50KCkpOwpAQCAtMTE2LDYgKzE2NywxNSBAQAogICAgIC8qKgogICAgICAqIEBzZWUgVVVJRCN0aW1lc3RhbXAoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0aW1lc3RhbXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RpbWVzdGFtcCgpIHsKICAgICAgICAgVVVJRCB1dWlkID0gbmV3IFVVSUQoMHgwMDAwMDAwMDAwMDAxMDAwTCwgMHg4MDAwMDAwMDAwMDAwMDAwTCk7CiAgICAgICAgIGFzc2VydEVxdWFscygweDAsIHV1aWQudGltZXN0YW1wKCkpOwpAQCAtMTM5LDYgKzE5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEBzZWUgVVVJRCNjbG9ja1NlcXVlbmNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvY2tTZXF1ZW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvY2tTZXF1ZW5jZSgpIHsKICAgICAgICAgVVVJRCB1dWlkID0gbmV3IFVVSUQoMHgwMDAwMDAwMDAwMDAxMDAwTCwgMHg4MDAwMDAwMDAwMDAwMDAwTCk7CiAgICAgICAgIGFzc2VydEVxdWFscygweDAsIHV1aWQuY2xvY2tTZXF1ZW5jZSgpKTsKQEAgLTE2NSw2ICsyMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAc2VlIFVVSUQjbm9kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25vZGUoKSB7CiAgICAgICAgIFVVSUQgdXVpZCA9IG5ldyBVVUlEKDB4MDAwMDAwMDAwMDAwMTAwMEwsIDB4ODAwMDAwMDAwMDAwMDAwMEwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMHgwLCB1dWlkLm5vZGUoKSk7CkBAIC0xODgsNiArMjY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHNlZSBVVUlEI2NvbXBhcmVUbyhVVUlEKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlVVSUQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvKCkgewogICAgICAgICBVVUlEIHV1aWQxID0gbmV3IFVVSUQoMCwgMCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB1dWlkMS5jb21wYXJlVG8odXVpZDEpKTsKQEAgLTIwMyw2ICsyOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAc2VlIFVVSUQjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIFVVSUQgdXVpZCA9IG5ldyBVVUlEKDAsIDApOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXVpZC5oYXNoQ29kZSgpKTsKQEAgLTIxNCw2ICszMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAc2VlIFVVSUQjZXF1YWxzKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzT2JqZWN0KCkgewogICAgICAgICBVVUlEIHV1aWQxID0gbmV3IFVVSUQoMCwgMCk7CiAgICAgICAgIGFzc2VydEVxdWFscyh1dWlkMSwgdXVpZDEpOwpAQCAtMjM2LDYgKzM0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEBzZWUgVVVJRCN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgVVVJRCB1dWlkID0gbmV3IFVVSUQoMHhmODFkNGZhZTdkZWMxMWQwTCwgMHhhNzY1MDBhMGM5MWU2YmY2TCk7CiAgICAgICAgIFN0cmluZyBhY3R1YWwgPSB1dWlkLnRvU3RyaW5nKCk7CkBAIC0yNDksNiArMzYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgVVVJRCgweGY4MWQ0ZmFlN2RlYzExZDBMLAogICAgICAgICAgICAgICAgIDB4YTc2NTAwYTBjOTFlNmJmNkwpKTsKQEAgLTI1Nyw2ICszODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IFVVSUQoMHhmODFkNGZhZTdkZWMxMWQwTCwKICAgICAgICAgICAgICAgICAweGE3NjUwMGEwYzkxZTZiZjZMKSk7CkBAIC0yNjUsNiArMzk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHNlZSBVVUlEI3JhbmRvbVVVSUQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyYW5kb21VVUlEIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yYW5kb21VVUlEKCkgewogICAgICAgICBVVUlEIHV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHV1aWQudmFyaWFudCgpKTsKQEAgLTI3NCw2ICs0MTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAc2VlIFVVSUQjbmFtZVVVSURGcm9tQnl0ZXMoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuYW1lVVVJREZyb21CeXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmFtZVVVSURGcm9tQnl0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIG5hbWUgPSB7IChieXRlKSAweDZiLCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4YjgsIChieXRlKSAweDExLAogICAgICAgICAgICAgICAgIChieXRlKSAweDlkLCAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4MTEsIChieXRlKSAweGQxLApAQCAtMzA0LDYgKzQ1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEBzZWUgVVVJRCNmcm9tU3RyaW5nKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZnJvbVN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zyb21TdHJpbmcoKSB7CiAgICAgICAgIFVVSUQgYWN0dWFsID0gVVVJRC5mcm9tU3RyaW5nKCJmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYiKTsKICAgICAgICAgVVVJRCBleHBlY3RlZCA9IG5ldyBVVUlEKDB4ZjgxZDRmYWU3ZGVjMTFkMEwsIDB4YTc2NTAwYTBjOTFlNmJmNkwpOwpAQCAtMzU5LDYgKzUxOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVVVJRCNmcm9tU3RyaW5nKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZnJvbVN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zyb21TdHJpbmdfTFN0cmluZ19FeGNlcHRpb24oKSB7CiAKICAgICAgICAgVVVJRCB1dWlkID0gVVVJRC5mcm9tU3RyaW5nKCIwLTAtMC0wLTAiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL1Vua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDI2MmRiNGQuLjljZmQwMmYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9Vbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsMTkgKzE1LDM0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuamF2YS51dGlsOwogCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlVua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Vbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbjsKKwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFVua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24jVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24oU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uKCkgewogCiAgICAgICAgIC8vIFJJIDUuMCB3aWxsIG5vdCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiwgaXQgaXMgdGhlIGJ1ZyBhY2NvcmRpbmcKQEAgLTQyLDYgKzU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Vbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbiNnZXRDb252ZXJzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29udmVyc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udmVyc2lvbigpIHsKICAgICAgICAgU3RyaW5nIHMgPSAiTVlURVNUU1RSSU5HIjsKICAgICAgICAgVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24gVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24gPSBuZXcgVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24oCkBAIC01Miw2ICs3NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24jZ2V0TWVzc2FnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CiAgICAgICAgIFN0cmluZyBzID0gIk1ZVEVTVFNUUklORyI7CiAgICAgICAgIFVua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uIFVua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uID0gbmV3IFVua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uKApAQCAtNzgsNiArMTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBVbmtub3duRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbigKQEAgLTg3LDYgKzEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL1Vua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDMyMjFjYzUuLmI3YTkyOWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwxOSArMTYsMzQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Vbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKFVua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uI1Vua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uKCkgewogCiAgICAgICAgIHRyeSB7CkBAIC00Miw2ICs1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uI2dldEZsYWdzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmxhZ3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEZsYWdzKCkgewogICAgICAgICBTdHJpbmcgcyA9ICJNWVRFU1RTVFJJTkciOwogICAgICAgICBVbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb24gVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uID0gbmV3IFVua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbigKQEAgLTUyLDYgKzc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Vbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb24jZ2V0TWVzc2FnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWVzc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKICAgICAgICAgU3RyaW5nIHMgPSAiTVlURVNUU1RSSU5HIjsKICAgICAgICAgVW5rbm93bkZvcm1hdEZsYWdzRXhjZXB0aW9uIFVua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbiA9IG5ldyBVbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb24oCkBAIC03Nyw2ICsxMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IFVua25vd25Gb3JtYXRGbGFnc0V4Y2VwdGlvbigKQEAgLTg2LDYgKzEyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBVbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb24oCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL1ZlY3RvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVmVjdG9yVGVzdC5qYXZhCmluZGV4IDcxZGViY2IuLmYwY2RkODAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVmVjdG9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvVmVjdG9yVGVzdC5qYXZhCkBAIC0xNiwxNSArMTYsMzAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoVmVjdG9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBWZWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIEVuc3VyZSB0b1N0cmluZyB3b3JrcyB3aXRoIHNlbGYtcmVmZXJlbmNpbmcgZWxlbWVudHMuCiAgICAgICAgIFZlY3RvcjxPYmplY3Q+IHZlYyA9IG5ldyBWZWN0b3I8T2JqZWN0PigzKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvV2Vha0hhc2hNYXBUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvamF2YS91dGlsL1dlYWtIYXNoTWFwVGVzdC5qYXZhCmluZGV4IDQzMDc0NjMuLjJhNWMwZWEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy9qYXZhL3V0aWwvV2Vha0hhc2hNYXBUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL2phdmEvdXRpbC9XZWFrSGFzaE1hcFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTIzLDggKzMwLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhXZWFrSGFzaE1hcC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgV2Vha0hhc2hNYXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgT2JqZWN0W10gS0VZX0FSUkFZOwpAQCAtMzQsNiArNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLldlYWtIYXNoTWFwI2VudHJ5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cnlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VudHJ5U2V0KCkgewogICAgICAgICBXZWFrSGFzaE1hcDxPYmplY3QsIE9iamVjdD4gd2Vha01hcCA9IG5ldyBXZWFrSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKICAgICAgICAgS0VZX0FSUkFZID0gbmV3IE9iamVjdFsxMDBdOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL3V0aWwvQmFzZTY0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL3V0aWwvQmFzZTY0VGVzdC5qYXZhCmluZGV4IGNiNGYzOTguLmZiZDkzOTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy91dGlsL0Jhc2U2NFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvdXRpbC9CYXNlNjRUZXN0LmphdmEKQEAgLTE1LDcgKzE1LDEyIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy51dGlsOworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy51dGlsOyAKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLkJhc2U2NDsKIApAQCAtMjUsMTIgKzMwLDIyIEBACiAKIC8qKgogICogQmFzZTY0IGVuY29kZXIvZGVjb2RlciB0ZXN0LgotICovCisgKi8gCitAVGVzdFRhcmdldENsYXNzKEJhc2U2NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBCYXNlNjRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHRoZSByZXN1bHQgb24gZW1wdHkgcGFyYW1ldGVyLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlQmFzZTY0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdERlY29kZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTUxMwogICAgICAgICBieXRlW10gcmVzdWx0ID0gQmFzZTY0LmRlY29kZShuZXcgYnl0ZVswXSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvdXRpbC9Nc2dIZWxwVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL3V0aWwvTXNnSGVscFRlc3QuamF2YQppbmRleCBhOGU3OGQ4Li45ZTQ0MDBhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvdXRpbC9Nc2dIZWxwVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy91dGlsL01zZ0hlbHBUZXN0LmphdmEKQEAgLTE0LDEyICsxNCwxOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy51dGlsOworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy51dGlsOyAgCisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZ0hlbHA7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTXNnSGVscC5jbGFzcykKIHB1YmxpYyBjbGFzcyBNc2dIZWxwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHB1YmxpYyBNc2dIZWxwVGVzdChTdHJpbmcgbmFtZSkgewpAQCAtMzAsNiArMzYsMTUgQEAKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ29yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscC5mb3JtYXQoU3RyaW5nLAogICAgICAqIE9iamVjdFtdKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIE9iamVjdFtdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbXB0eSIsIE1zZ0hlbHAuZm9ybWF0KCJlbXB0eSIsIG5ldyBPYmplY3RbMF0pKTsKIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL3V0aWwvTllJVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3Rlc3RzL3V0aWwvTllJVGVzdC5qYXZhCmluZGV4IDJjOGQ0NTAuLjRmOTdiNmIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS90ZXN0cy91dGlsL05ZSVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdGVzdHMvdXRpbC9OWUlUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtMjgsOCArMzMsMTkgQEAKIC8qKgogICogVGVzdGluZyB0aGUgTllJIGZyYW1ld29yayBjb2RlLgogICovCisvLyB3ZWxsIHRoaXMgc2hvdWxkIGJlIHRoZSBwYXN0IG5vdy4KK0BUZXN0VGFyZ2V0Q2xhc3MoTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgTllJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm90SW1wbGVtZW50ZWRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlByaW50U3RyZWFtLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdE5ZSSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oNDAwKTsKICAgICAgICAgUHJpbnRTdHJlYW0gc3RyZWFtID0gbmV3IFByaW50U3RyZWFtKGJvcywgdHJ1ZSwgIlVURi04Iik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvQWxsVGVzdHMuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9BbGxUZXN0cy5qYXZhCmluZGV4IDlhOGUyYzQuLjJhYzRiNjcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9BbGxUZXN0cy5qYXZhCkBAIC0zMCw1MSArMzAsMjggQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSAgIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CiAgICAgICAgIAotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoCi0gICAgICAgICAgICAgICAgdGVzdHMuYXBpLm9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwuZGFsdmlrLlRocmVhZHNUZXN0LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUodGVzdHMuYXBpLmphdmEubGFuZy5yZWYuUmVmZXJlbmNlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlVGVzdC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQWRkIHNvbWUgZXhpc3RpbmcgQW5kcm9pZCB0ZXN0cyBmb3IgdGhlIGx1bmkgbW9kdWxlLgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmFubm90YXRpb24uQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMuYXJjaGl2ZS5BbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5jb25jdXJyZW50LkFsbFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmNyeXB0by5BbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5sb2dnaW5nLkFsbFRlc3RzLnN1aXRlKCkpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmx1bmkuQWxsVGVzdHMuc3VpdGUoKSk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBsdW5pIHRlc3RzIGZyb20gSGFybW9ueS4gTm90IGluY2x1ZGVkIGluIGFib3ZlLiAKLSAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5sdW5pLkFsbFRlc3RzTGFuZy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5sdW5pLkFsbFRlc3RzVXRpbC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5sdW5pLkFsbFRlc3RzTmV0LnN1aXRlKCkpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmx1bmkuQWxsVGVzdHNJby5zdWl0ZSgpKTsKLQotICAgICAgICAvLyBBZGQgdGhlIHRlc3RzIGZvciBzb21lIHBhY2thZ2VzIHRoYXQgYXJlIGJhc2ljYWxseSBwYXJ0Ci0gICAgICAgIC8vIG9mIGx1bmksIGJ1dCBkaWQgZ2V0IHRoZWlyIG93biBtb2R1bGUgZm9yIHNvbWUgcmVhc29uLiAKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5sdW5pLkFsbFRlc3RzTGFuZy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5sdW5pLkFsbFRlc3RzTmV0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmx1bmkuQWxsVGVzdHNVdGlsLnN1aXRlKCkpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLm1hdGguQWxsVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMudGV4dC5BbGxUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5yZWdleC5BbGxUZXN0cy5zdWl0ZSgpKTsKLQotICAgICAgICAvLyBBZGQgdGhlIHRlc3RzIGZvciB0aGUgbmlvIGFuZCBuaW8tY2hhciBtb2R1bGVzLgogICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLm5pby5BbGxUZXN0cy5zdWl0ZSgpKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5uaW9fY2hhci5BbGxUZXN0cy5zdWl0ZSgpKTsKLQotICAgICAgICAvLyBBZGQgdGhlIHRlc3RzIGZvciBzb21lIHNlY3VyaXR5LXJlbGF0ZWQgbW9kdWxlcy4KLSAgICAgICAgLy8gVE9ETyBUYWtlcyBhZ2VzLCBjb21tZW50aW5nIG91dCBmb3IgdGhlIG1vbWVudC4KLSAgICAgICAgLy8gc3VpdGUuYWRkVGVzdCh0ZXN0cy5zZWN1cml0eS5BbGxUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5uZXQuc3NsLkFsbFRlc3RzLnN1aXRlKCkpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgdGVzdHMgZm9yIG1pc2NlbGxhbmVvdXMgb3RoZXIgbW9kdWxlcy4KLSAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5sb2dnaW5nLkFsbFRlc3RzLnN1aXRlKCkpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLnByZWZzLkFsbFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLnhtbC5BbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5yZWdleC5BbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5zZWN1cml0eS5BbGxUZXN0cy5zdWl0ZSgpKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5zcWwuQWxsVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIGFkZGVkIHRoZXNlIHN1aXRlcyBzbyB0aGV5IHdvbid0IGJlIGZvcmdvdHRlbi4KLSAgICAgICAgLy8gTm90IHN1cmUgaWYgdGhleSBoYXZlIGFueSBwcm9ibGVtcyBydW5uaW5nIHRocm91Z2guCi0gICAgICAgIC8vIHN1aXRlLmFkZFRlc3QodGVzdHMuYXJjaGl2ZS5BbGxUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgLy8gc3VpdGUuYWRkVGVzdCh0ZXN0cy5hbm5vdGF0aW9uLkFsbFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLnRleHQuQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMueG1sLkFsbFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLnhuZXQuQWxsVGVzdHMuc3VpdGUoKSk7CiAKICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9BbGxUZXN0cy5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0FsbFRlc3RzLmphdmEKaW5kZXggZjZiZTljNS4uMGNkZDEwNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0FsbFRlc3RzLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0FsbFRlc3RzLmphdmEKQEAgLTEsMTggKzEsMTcgQEAKIC8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKICAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKQEAgLTIxLDggKzIwLDkgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwogCiAvKioKLSAqIFRPRE8gVHlwZSBkZXNjcmlwdGlvbgorICogVGhpcyBpcyBhdXRvZ2VuZXJhdGVkIHNvdXJjZSBmaWxlLiBJbmNsdWRlcyB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKICAqLworCiBwdWJsaWMgY2xhc3MgQWxsVGVzdHMgewogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewpAQCAtMzAsOSArMzAsOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3IgamF2YS5pbyIpOwotCisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsiKTsKICAgICAgICAgLy8gJEpVbml0LUJFR0lOJAorCiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCdWZmZXJlZElucHV0U3RyZWFtVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCdWZmZXJlZE91dHB1dFN0cmVhbVRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnVmZmVyZWRSZWFkZXJUZXN0LmNsYXNzKTsKQEAgLTQyLDYgKzQyLDcgQEAKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENoYXJBcnJheVJlYWRlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhckFycmF5V3JpdGVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaGFyQ29udmVyc2lvbkV4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcHV0ZVNlcmlhbFZlcnNpb25VSURUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERhdGFJbnB1dFN0cmVhbVRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0YU91dHB1dFN0cmVhbVRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRU9GRXhjZXB0aW9uVGVzdC5jbGFzcyk7CkBAIC01NSwxMCArNTYsMTAgQEAKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEZpbGVXcml0ZXJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcklucHV0U3RyZWFtVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJPdXRwdXRTdHJlYW1UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKElPRXhjZXB0aW9uVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbnB1dFN0cmVhbVJlYWRlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW52YWxpZENsYXNzRXhjZXB0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJT0V4Y2VwdGlvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTGluZU51bWJlcklucHV0U3RyZWFtVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMaW5lTnVtYmVyUmVhZGVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOb3RBY3RpdmVFeGNlcHRpb25UZXN0LmNsYXNzKTsKQEAgLTg1LDYgKzg2LDcgQEAKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0Mi5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDMuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VyaWFsaXphdGlvblN0cmVzc1Rlc3Q0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0NC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDUuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdHJlYW1Ub2tlbml6ZXJUZXN0LmNsYXNzKTsKQEAgLTkyLDEyICs5NCwxMiBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nUmVhZGVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdXcml0ZXJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNGYWlsZWRFeGNlcHRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb25UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURkRhdGFGb3JtYXRFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb25UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFdyaXRlQWJvcnRlZEV4Y2VwdGlvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoV3JpdGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vICRKVW5pdC1FTkQkCiAKKyAgICAgICAgLy8gJEpVbml0LUVORCQKICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9CdWZmZXJlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggMjMxYzdjNS4uMjgxZDJhNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDYgKzE3LDEwIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTI4LDM5NiArMzIsNDc0IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9QbGF0Zm9ybUZpbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQnVmZmVyZWRJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQnVmZmVyZWRJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLQlwdWJsaWMgU3RyaW5nIGZpbGVOYW1lOworICAgIHB1YmxpYyBTdHJpbmcgZmlsZU5hbWU7CiAKLQlwcml2YXRlIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaXM7CisgICAgcHJpdmF0ZSBCdWZmZXJlZElucHV0U3RyZWFtIGlzOwogCi0JcHJpdmF0ZSBGaWxlSW5wdXRTdHJlYW0gaXNGaWxlOworICAgIHByaXZhdGUgRmlsZUlucHV0U3RyZWFtIGlzRmlsZTsKIAotCWJ5dGVbXSBpYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgYnl0ZVtdIGlidWYgPSBuZXcgYnl0ZVs0MDk2XTsKIAotCXB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlck91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSU9FeGNlcHRpb25cblRlc3RfamF2YV9pb19PdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19QcmludFN0cmVhbVxuVGVzdF9qYXZhX2lvX1JhbmRvbUFjY2Vzc0ZpbGVcblRlc3RfamF2YV9pb19TeW5jRmFpbGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BYnN0cmFjdE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Bcml0aG1ldGljRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5U3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Jvb2xlYW5cblRlc3RfamF2YV9sYW5nX0J5dGVcblRlc3RfamF2YV9sYW5nX0NoYXJhY3RlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NcblRlc3RfamF2YV9sYW5nX0NsYXNzQ2FzdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDaXJjdWxhcml0eUVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Zvcm1hdEVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0xvYWRlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0RvdWJsZVxuVGVzdF9qYXZhX2xhbmdfRXJyb3JcblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yXG5UZXN0X2phdmFfbGFuZ19GbG9hdFxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0Vycm9yXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnRlZ2VyXG5UZXN0X2phdmFfbGFuZ19JbnRlcm5hbEVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnRlcnJ1cHRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTGlua2FnZUVycm9yXG5UZXN0X2phdmFfbGFuZ19Mb25nXG5UZXN0X2phdmFfbGFuZ19NYXRoXG5UZXN0X2phdmFfbGFuZ19OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTm9DbGFzc0RlZkZvdW5kRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaEZpZWxkRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19OdWxsUG9pbnRlckV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJGb3JtYXRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX09iamVjdFxuVGVzdF9qYXZhX2xhbmdfT3V0T2ZNZW1vcnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfUnVudGltZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU2VjdXJpdHlNYW5hZ2VyXG5UZXN0X2phdmFfbGFuZ19TaG9ydFxuVGVzdF9qYXZhX2xhbmdfU3RhY2tPdmVyZmxvd0Vycm9yXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdcblRlc3RfamF2YV9sYW5nX1N0cmluZ0J1ZmZlclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU3lzdGVtXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRcblRlc3RfamF2YV9sYW5nX1RocmVhZERlYXRoXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRHcm91cFxuVGVzdF9qYXZhX2xhbmdfVGhyb3dhYmxlXG5UZXN0X2phdmFfbGFuZ19Vbmtub3duRXJyb3JcblRlc3RfamF2YV9sYW5nX1Vuc2F0aXNmaWVkTGlua0Vycm9yXG5UZXN0X2phdmFfbGFuZ19WZXJpZnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmlydHVhbE1hY2hpbmVFcnJvclxuVGVzdF9qYXZhX2xhbmdfdm1fSW1hZ2VcblRlc3RfamF2YV9sYW5nX3ZtX01lbW9yeVNlZ21lbnRcblRlc3RfamF2YV9sYW5nX3ZtX1JPTVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ192bV9WTVxuVGVzdF9qYXZhX2xhbmdfVm9pZFxuVGVzdF9qYXZhX25ldF9CaW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0Nvbm5lY3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfRGF0YWdyYW1QYWNrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X0luZXRBZGRyZXNzXG5UZXN0X2phdmFfbmV0X05vUm91dGVUb0hvc3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfUGxhaW5EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfUGxhaW5Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Tb2NrZXRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfVW5rbm93bkhvc3RFeGNlcHRpb25cblRlc3RfamF2YV91dGlsX0FycmF5RW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfRGF0ZVxuVGVzdF9qYXZhX3V0aWxfRXZlbnRPYmplY3RcblRlc3RfamF2YV91dGlsX0hhc2hFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9IYXNodGFibGVcblRlc3RfamF2YV91dGlsX1Byb3BlcnRpZXNcblRlc3RfamF2YV91dGlsX1Jlc291cmNlQnVuZGxlXG5UZXN0X2phdmFfdXRpbF90bVxuVGVzdF9qYXZhX3V0aWxfVmVjdG9yXG4iOworICAgIHB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlck91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSU9FeGNlcHRpb25cblRlc3RfamF2YV9pb19PdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19QcmludFN0cmVhbVxuVGVzdF9qYXZhX2lvX1JhbmRvbUFjY2Vzc0ZpbGVcblRlc3RfamF2YV9pb19TeW5jRmFpbGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BYnN0cmFjdE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Bcml0aG1ldGljRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5U3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Jvb2xlYW5cblRlc3RfamF2YV9sYW5nX0J5dGVcblRlc3RfamF2YV9sYW5nX0NoYXJhY3RlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NcblRlc3RfamF2YV9sYW5nX0NsYXNzQ2FzdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDaXJjdWxhcml0eUVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Zvcm1hdEVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0xvYWRlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0RvdWJsZVxuVGVzdF9qYXZhX2xhbmdfRXJyb3JcblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yXG5UZXN0X2phdmFfbGFuZ19GbG9hdFxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0Vycm9yXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnRlZ2VyXG5UZXN0X2phdmFfbGFuZ19JbnRlcm5hbEVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnRlcnJ1cHRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTGlua2FnZUVycm9yXG5UZXN0X2phdmFfbGFuZ19Mb25nXG5UZXN0X2phdmFfbGFuZ19NYXRoXG5UZXN0X2phdmFfbGFuZ19OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTm9DbGFzc0RlZkZvdW5kRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaEZpZWxkRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19OdWxsUG9pbnRlckV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJGb3JtYXRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX09iamVjdFxuVGVzdF9qYXZhX2xhbmdfT3V0T2ZNZW1vcnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfUnVudGltZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU2VjdXJpdHlNYW5hZ2VyXG5UZXN0X2phdmFfbGFuZ19TaG9ydFxuVGVzdF9qYXZhX2xhbmdfU3RhY2tPdmVyZmxvd0Vycm9yXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdcblRlc3RfamF2YV9sYW5nX1N0cmluZ0J1ZmZlclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU3lzdGVtXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRcblRlc3RfamF2YV9sYW5nX1RocmVhZERlYXRoXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRHcm91cFxuVGVzdF9qYXZhX2xhbmdfVGhyb3dhYmxlXG5UZXN0X2phdmFfbGFuZ19Vbmtub3duRXJyb3JcblRlc3RfamF2YV9sYW5nX1Vuc2F0aXNmaWVkTGlua0Vycm9yXG5UZXN0X2phdmFfbGFuZ19WZXJpZnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmlydHVhbE1hY2hpbmVFcnJvclxuVGVzdF9qYXZhX2xhbmdfdm1fSW1hZ2VcblRlc3RfamF2YV9sYW5nX3ZtX01lbW9yeVNlZ21lbnRcblRlc3RfamF2YV9sYW5nX3ZtX1JPTVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ192bV9WTVxuVGVzdF9qYXZhX2xhbmdfVm9pZFxuVGVzdF9qYXZhX25ldF9CaW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0Nvbm5lY3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfRGF0YWdyYW1QYWNrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X0luZXRBZGRyZXNzXG5UZXN0X2phdmFfbmV0X05vUm91dGVUb0hvc3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfUGxhaW5EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfUGxhaW5Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Tb2NrZXRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfVW5rbm93bkhvc3RFeGNlcHRpb25cblRlc3RfamF2YV91dGlsX0FycmF5RW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfRGF0ZVxuVGVzdF9qYXZhX3V0aWxfRXZlbnRPYmplY3RcblRlc3RfamF2YV91dGlsX0hhc2hFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9IYXNodGFibGVcblRlc3RfamF2YV91dGlsX1Byb3BlcnRpZXNcblRlc3RfamF2YV91dGlsX1Jlc291cmNlQnVuZGxlXG5UZXN0X2phdmFfdXRpbF90bVxuVGVzdF9qYXZhX3V0aWxfVmVjdG9yXG4iOwogCi0JLyoqCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI0J1ZmZlcmVkSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0sIGludCkKLQkJYm9vbGVhbiBleGNlcHRpb25GaXJlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gQ3JlYXRlIGJ1ZmZlciB3aXRoIGV4YWN0IHNpemUgb2YgZmlsZQotCQkJaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpc0ZpbGUsIHRoaXMuZmlsZVN0cmluZwotCQkJCQkubGVuZ3RoKCkpOwotCQkJLy8gRW5zdXJlIGJ1ZmZlciBnZXRzIGZpbGxlZCBieSBldmFsdWF0aW5nIG9uZSByZWFkCi0JCQlpcy5yZWFkKCk7Ci0JCQkvLyBDbG9zZSB1bmRlcmx5aW5nIEZpbGVJbnB1dFN0cmVhbSwgYWxsIGJ1dCAxIGJ1ZmZlcmVkIGJ5dGVzIHNob3VsZAotCQkJLy8gc3RpbGwgYmUgYXZhaWxhYmxlLgotCQkJaXNGaWxlLmNsb3NlKCk7Ci0JCQkvLyBSZWFkIHRoZSByZW1haW5pbmcgYnVmZmVyZWQgY2hhcmFjdGVycywgbm8gSU9FeGNlcHRpb24gc2hvdWxkCi0JCQkvLyBvY2N1ci4KLQkJCWlzLnNraXAodGhpcy5maWxlU3RyaW5nLmxlbmd0aCgpIC0gMik7Ci0JCQlpcy5yZWFkKCk7Ci0JCQl0cnkgewotCQkJCS8vIGlzLnJlYWQgc2hvdWxkIG5vdyB0aHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSBpdCB3aWxsIGhhdmUgdG8KLQkJCQkvLyBiZSBmaWxsZWQuCi0JCQkJaXMucmVhZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWV4Y2VwdGlvbkZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRyaWdnZXJlZCBieSByZWFkKCkiLAotCQkJCQlleGNlcHRpb25GaXJlZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdF8xX0NvbnN0cnVjdG9yIik7Ci0JCX0KLQkJCi0JCS8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgaGFybW9ueS0yNDA3Ci0JCW5ldyB0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbS5idWYpOwotCQl0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbS5idWYgPSBudWxsOwotCQluZXcgdGVzdEJ1ZmZlcmVkSW5wdXRTdHJlYW0obnVsbCwgMTAwKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbS5idWYpOwotCX0KLQkKLQlzdGF0aWMgY2xhc3MgdGVzdEJ1ZmZlcmVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtIHsKLQkJc3RhdGljIGJ5dGVbXSBidWY7Ci0JCXRlc3RCdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJc3VwZXIoaXMpOwotCQkJYnVmID0gc3VwZXIuYnVmOwotCQl9CisgICAgLyoqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI0J1ZmZlcmVkSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKKyAgICAgKiAgICAgICAgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBCdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJCdWZmZXJlZElucHV0U3RyZWFtIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbUkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0sIGludCkKKyAgICAgICAgYm9vbGVhbiBleGNlcHRpb25GaXJlZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGJ1ZmZlciB3aXRoIGV4YWN0IHNpemUgb2YgZmlsZQorICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpc0ZpbGUsIHRoaXMuZmlsZVN0cmluZworICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpOworICAgICAgICAgICAgLy8gRW5zdXJlIGJ1ZmZlciBnZXRzIGZpbGxlZCBieSBldmFsdWF0aW5nIG9uZSByZWFkCisgICAgICAgICAgICBpcy5yZWFkKCk7CisgICAgICAgICAgICAvLyBDbG9zZSB1bmRlcmx5aW5nIEZpbGVJbnB1dFN0cmVhbSwgYWxsIGJ1dCAxIGJ1ZmZlcmVkIGJ5dGVzIHNob3VsZAorICAgICAgICAgICAgLy8gc3RpbGwgYmUgYXZhaWxhYmxlLgorICAgICAgICAgICAgaXNGaWxlLmNsb3NlKCk7CisgICAgICAgICAgICAvLyBSZWFkIHRoZSByZW1haW5pbmcgYnVmZmVyZWQgY2hhcmFjdGVycywgbm8gSU9FeGNlcHRpb24gc2hvdWxkCisgICAgICAgICAgICAvLyBvY2N1ci4KKyAgICAgICAgICAgIGlzLnNraXAodGhpcy5maWxlU3RyaW5nLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICBpcy5yZWFkKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGlzLnJlYWQgc2hvdWxkIG5vdyB0aHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSBpdCB3aWxsIGhhdmUgdG8KKyAgICAgICAgICAgICAgICAvLyBiZSBmaWxsZWQuCisgICAgICAgICAgICAgICAgaXMucmVhZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkZpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRyaWdnZXJlZCBieSByZWFkKCkiLAorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25GaXJlZCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdF8xX0NvbnN0cnVjdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgaGFybW9ueS0yNDA3CisgICAgICAgIG5ldyB0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbShudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbS5idWYpOworICAgICAgICB0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbS5idWYgPSBudWxsOworICAgICAgICBuZXcgdGVzdEJ1ZmZlcmVkSW5wdXRTdHJlYW0obnVsbCwgMTAwKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbS5idWYpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgdGVzdEJ1ZmZlcmVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtIHsKKyAgICAgICAgc3RhdGljIGJ5dGVbXSBidWY7CisgICAgICAgIHRlc3RCdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoaXMpOworICAgICAgICAgICAgYnVmID0gc3VwZXIuYnVmOworICAgICAgICB9CiAKLQkJdGVzdEJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJc3VwZXIoaXMsIHNpemUpOwotCQkJYnVmID0gc3VwZXIuYnVmOwotCQl9Ci0JfQorICAgICAgICB0ZXN0QnVmZmVyZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihpcywgc2l6ZSk7CisgICAgICAgICAgICBidWYgPSBzdXBlci5idWY7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI2F2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9hdmFpbGFibGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLmF2YWlsYWJsZSgpCi0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGF2YWlsYWJsZSBieXRlcyIsIGlzCi0JCQkJCS5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBhdmFpbGFibGUgdGVzdCIpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSNhdmFpbGFibGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgYXZhaWxhYmxlKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImF2YWlsYWJsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfYXZhaWxhYmxlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbS5hdmFpbGFibGUoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMiLCBpcworICAgICAgICAgICAgICAgICAgICAuYXZhaWxhYmxlKCkgPT0gZmlsZVN0cmluZy5sZW5ndGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgYXZhaWxhYmxlIHRlc3QiKTsKKyAgICAgICAgfQogCi0JCS8vIFRlc3QgdGhhdCBhIGNsb3NlZCBzdHJlYW0gdGhyb3dzIGFuIElPRSBmb3IgYXZhaWxhYmxlKCkKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7ICdoJywgJ2UnLCAnbCcsICdsJywgJ28nLAotCQkJCQkJJyAnLCAndCcsICdpJywgJ20nIH0pKTsKLQkJaW50IGF2YWlsYWJsZTsKLQkJdHJ5IHsKLQkJCWF2YWlsYWJsZSA9IGJpcy5hdmFpbGFibGUoKTsKLQkJCWJpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJZmFpbCgpOwotCQkJcmV0dXJuOyAvLyBuZXZlciByZWFjaGVkLgotCQl9Ci0JCWFzc2VydFRydWUoYXZhaWxhYmxlICE9IDApOworICAgICAgICAvLyBUZXN0IHRoYXQgYSBjbG9zZWQgc3RyZWFtIHRocm93cyBhbiBJT0UgZm9yIGF2YWlsYWJsZSgpCisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAnaCcsICdlJywgJ2wnLCAnbCcsICdvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICcgJywgJ3QnLCAnaScsICdtJyB9KSk7CisgICAgICAgIGludCBhdmFpbGFibGUgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXZhaWxhYmxlID0gYmlzLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgYmlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShhdmFpbGFibGUgIT0gMCk7CiAKLQkJdHJ5IHsKLQkJCWJpcy5hdmFpbGFibGUoKTsKLQkJCWZhaWwoIkV4cGVjdGVkIHRlc3QgdG8gdGhyb3cgSU9FLiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlmYWlsKCJFeHBlY3RlZCB0ZXN0IHRvIHRocm93IElPRSBub3QgIgotCQkJCQkrIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJpcy5hdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRlc3QgdG8gdGhyb3cgSU9FLiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0ZXN0IHRvIHRocm93IElPRSBub3QgIgorICAgICAgICAgICAgICAgICAgICArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbS5jbG9zZSgpCi0JCW5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzRmlsZSk7Ci0JCW5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzRmlsZSk7Ci0JCQotCQkvL3JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNjY3CisgICAgLyoqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjbG9zZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLmNsb3NlKCkKKyAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXNGaWxlKTsKKyAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXNGaWxlKTsKKyAgICAgICAgCisgICAgICAgIC8vcmVncmVzc2lvbiBmb3IgSEFSTU9OWS02NjcKICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBidWYgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShudWxsLCA1KTsKICAgICAgICAgYnVmLmNsb3NlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jbWFyayhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLm1hcmsoaW50KQotCQlieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwMF07Ci0JCWJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbMTAwXTsKLQkJdHJ5IHsKLQkJCWlzLnNraXAoMzAwMCk7Ci0JCQlpcy5tYXJrKDEwMDApOwotCQkJaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7Ci0JCQlpcy5yZXNldCgpOwotCQkJaXMucmVhZChidWYyLCAwLCBidWYyLmxlbmd0aCk7Ci0JCQlpcy5yZXNldCgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIG1hcmsgY29ycmVjdCBwb3NpdGlvbiIsIG5ldyBTdHJpbmcoYnVmMSwgMCwKLQkJCQkJYnVmMS5sZW5ndGgpLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZjIsIDAsIGJ1ZjIubGVuZ3RoKSkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jbWFyayhpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1hcmsoaW50IHJlYWRsaW1pdCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hcmsiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0ubWFyayhpbnQpCisgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgYnl0ZVtdIGJ1ZjIgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMuc2tpcCgzMDAwKTsKKyAgICAgICAgICAgIGlzLm1hcmsoMTAwMCk7CisgICAgICAgICAgICBpcy5yZWFkKGJ1ZjEsIDAsIGJ1ZjEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlzLnJlc2V0KCk7CisgICAgICAgICAgICBpcy5yZWFkKGJ1ZjIsIDAsIGJ1ZjIubGVuZ3RoKTsKKyAgICAgICAgICAgIGlzLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gbWFyayBjb3JyZWN0IHBvc2l0aW9uIiwgbmV3IFN0cmluZyhidWYxLCAwLAorICAgICAgICAgICAgICAgICAgICBidWYxLmxlbmd0aCkuZXF1YWxzKG5ldyBTdHJpbmcoYnVmMiwgMCwgYnVmMi5sZW5ndGgpKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QiKTsKLQkJfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCIpOworICAgICAgICB9CiAKLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMjU2XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsyNTZdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgICAgICBieXRlc1tpXSA9IChieXRlKSBpOwogICAgICAgICB9Ci0JCUlucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgMTIpOwotCQl0cnkgewotCQkJaW4uc2tpcCg2KTsKLQkJCWluLm1hcmsoMTQpOwotCQkJaW4ucmVhZChuZXcgYnl0ZVsxNF0sIDAsIDE0KTsKLQkJCWluLnJlc2V0KCk7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBieXRlcyIsIGluLnJlYWQoKSA9PSA2ICYmIGluLnJlYWQoKSA9PSA3KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QgMiIpOwotCQl9CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgMTIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4uc2tpcCg2KTsKKyAgICAgICAgICAgIGluLm1hcmsoMTQpOworICAgICAgICAgICAgaW4ucmVhZChuZXcgYnl0ZVsxNF0sIDAsIDE0KTsKKyAgICAgICAgICAgIGluLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBieXRlcyIsIGluLnJlYWQoKSA9PSA2ICYmIGluLnJlYWQoKSA9PSA3KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QgMiIpOworICAgICAgICB9CiAKLQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpLCAxMik7Ci0JCXRyeSB7Ci0JCQlpbi5za2lwKDYpOwotCQkJaW4ubWFyayg4KTsKLQkJCWluLnNraXAoNyk7Ci0JCQlpbi5yZXNldCgpOwotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgYnl0ZXMgMiIsIGluLnJlYWQoKSA9PSA2ICYmIGluLnJlYWQoKSA9PSA3KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QgMyIpOwotCQl9Ci0JfQorICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyksIDEyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluLnNraXAoNik7CisgICAgICAgICAgICBpbi5tYXJrKDgpOworICAgICAgICAgICAgaW4uc2tpcCg3KTsKKyAgICAgICAgICAgIGluLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBieXRlcyAyIiwgaW4ucmVhZCgpID09IDYgJiYgaW4ucmVhZCgpID09IDcpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCAzIik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKQotCQlhc3NlcnRUcnVlKCJtYXJrU3VwcG9ydGVkIHJldHVybmVkIGluY29ycmVjdCB2YWx1ZSIsIGlzLm1hcmtTdXBwb3J0ZWQoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jbWFya1N1cHBvcnRlZCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1hcmtTdXBwb3J0ZWQoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWFya1N1cHBvcnRlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKQorICAgICAgICBhc3NlcnRUcnVlKCJtYXJrU3VwcG9ydGVkIHJldHVybmVkIGluY29ycmVjdCB2YWx1ZSIsIGlzLm1hcmtTdXBwb3J0ZWQoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLnJlYWQoKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jcmVhZCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLnJlYWQoKQogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCWludCBjID0gaXMucmVhZCgpOwotCQkJYXNzZXJ0VHJ1ZSgicmVhZCByZXR1cm5lZCBpbmNvcnJlY3QgY2hhciIsIGMgPT0gZmlsZVN0cmluZwotCQkJCQkuY2hhckF0KDApKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QiICsgZS50b1N0cmluZygpKTsKLQkJfQorICAgICAgICAgICAgaW50IGMgPSBpcy5yZWFkKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJyZWFkIHJldHVybmVkIGluY29ycmVjdCBjaGFyIiwgYyA9PSBmaWxlU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC5jaGFyQXQoMCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CiAKLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMjU2XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsyNTZdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgICAgICBieXRlc1tpXSA9IChieXRlKSBpOwogICAgICAgICB9Ci0JCUlucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgMTIpOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBpbml0aWFsIGJ5dGUiLCAwLCBpbi5yZWFkKCkpOyAvLyBGaWxsIHRoZQotCQkJLy8gYnVmZmVyCi0JCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMTRdOwotCQkJaW4ucmVhZChidWYsIDAsIDE0KTsgLy8gUmVhZCBncmVhdGVyIHRoYW4gdGhlIGJ1ZmZlcgotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgYmxvY2sgcmVhZCBkYXRhIiwgbmV3IFN0cmluZyhidWYsIDAsIDE0KQotCQkJCQkuZXF1YWxzKG5ldyBTdHJpbmcoYnl0ZXMsIDEsIDE0KSkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBieXRlcyIsIDE1LCBpbi5yZWFkKCkpOyAvLyBDaGVjayBuZXh0IGJ5dGUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgMiIpOwotCQl9Ci0JfQorICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyksIDEyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgaW5pdGlhbCBieXRlIiwgMCwgaW4ucmVhZCgpKTsgLy8gRmlsbCB0aGUKKyAgICAgICAgICAgIC8vIGJ1ZmZlcgorICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzE0XTsKKyAgICAgICAgICAgIGluLnJlYWQoYnVmLCAwLCAxNCk7IC8vIFJlYWQgZ3JlYXRlciB0aGFuIHRoZSBidWZmZXIKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGJsb2NrIHJlYWQgZGF0YSIsIG5ldyBTdHJpbmcoYnVmLCAwLCAxNCkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgU3RyaW5nKGJ5dGVzLCAxLCAxNCkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYnl0ZXMiLCAxNSwgaW4ucmVhZCgpKTsgLy8gQ2hlY2sgbmV4dCBieXRlCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDIiKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUlfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShudWxsKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJDaGVja3MgZXhjZXB0aW9ucyBvbmx5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSV9FeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG51bGwpOwogCi0JCXRyeSB7Ci0JCQliaXMucmVhZChudWxsLCAtMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYmlzLnJlYWQobnVsbCwgLTEsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJYmlzLnJlYWQobmV3IGJ5dGVbMF0sIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYmlzLnJlYWQobmV3IGJ5dGVbMF0sIC0xLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQliaXMucmVhZChuZXcgYnl0ZVswXSwgMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJpcy5yZWFkKG5ldyBieXRlWzBdLCAxLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQliaXMucmVhZChuZXcgYnl0ZVswXSwgMSwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJYmlzLmNsb3NlKCk7Ci0JCQotCQl0cnkgewotCQkJYmlzLnJlYWQobnVsbCwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0ucmVhZChieXRlIFtdLCBpbnQsCi0JCS8vIGludCkKLQkJYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsxMDBdOwotCQl0cnkgewotCQkJaXMuc2tpcCgzMDAwKTsKLQkJCWlzLm1hcmsoMTAwMCk7Ci0JCQlpcy5yZWFkKGJ1ZjEsIDAsIGJ1ZjEubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgZGF0YSIsIG5ldyBTdHJpbmcoYnVmMSwgMCwKLQkJCQkJYnVmMS5sZW5ndGgpLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygzMDAwLCAzMTAwKSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYmlzLnJlYWQobmV3IGJ5dGVbMF0sIDEsIDEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJpcy5jbG9zZSgpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJpcy5yZWFkKG51bGwsIC0xLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSwgaW50LAorICAgICAgICAvLyBpbnQpCisgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLnNraXAoMzAwMCk7CisgICAgICAgICAgICBpcy5tYXJrKDEwMDApOworICAgICAgICAgICAgaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGRhdGEiLCBuZXcgU3RyaW5nKGJ1ZjEsIDAsCisgICAgICAgICAgICAgICAgICAgIGJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMzAwMCwgMzEwMCkpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCIpOwotCQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0Iik7CisgICAgICAgIH0KIAotCQlCdWZmZXJlZElucHV0U3RyZWFtIGJ1ZmluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtKCkgewotCQkJaW50IHNpemUgPSAyLCBwb3MgPSAwOworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJ1ZmluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgaW50IHNpemUgPSAyLCBwb3MgPSAwOwogCi0JCQlieXRlW10gY29udGVudHMgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIGJ5dGVbXSBjb250ZW50cyA9IG5ldyBieXRlW3NpemVdOwogCi0JCQlAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlpZiAocG9zID49IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zID49IHNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZWFkIHBhc3QgZW5kIG9mIGRhdGEiKTsKICAgICAgICAgICAgICAgICB9Ci0JCQkJcmV0dXJuIGNvbnRlbnRzW3BvcysrXTsKLQkJCX0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudHNbcG9zKytdOworICAgICAgICAgICAgfQogCi0JCQlAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJaWYgKHBvcyA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBzaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUmVhZCBwYXN0IGVuZCBvZiBkYXRhIik7CiAgICAgICAgICAgICAgICAgfQotCQkJCWludCB0b1JlYWQgPSBsZW47Ci0JCQkJaWYgKHRvUmVhZCA+IGF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgaW50IHRvUmVhZCA9IGxlbjsKKyAgICAgICAgICAgICAgICBpZiAodG9SZWFkID4gYXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdG9SZWFkID0gYXZhaWxhYmxlKCk7CiAgICAgICAgICAgICAgICAgfQotCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIHBvcywgYnVmLCBvZmYsIHRvUmVhZCk7Ci0JCQkJcG9zICs9IHRvUmVhZDsKLQkJCQlyZXR1cm4gdG9SZWFkOwotCQkJfQorICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIHBvcywgYnVmLCBvZmYsIHRvUmVhZCk7CisgICAgICAgICAgICAgICAgcG9zICs9IHRvUmVhZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9SZWFkOworICAgICAgICAgICAgfQogCi0JCQlAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB7Ci0JCQkJcmV0dXJuIHNpemUgLSBwb3M7Ci0JCQl9Ci0JCX0pOwotCQl0cnkgewotCQkJYnVmaW4ucmVhZCgpOwotCQkJaW50IHJlc3VsdCA9IGJ1ZmluLnJlYWQobmV3IGJ5dGVbMl0sIDAsIDIpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHJlc3VsdDogIiArIHJlc3VsdCwgcmVzdWx0ID09IDEpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkOiAiICsgZSk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgLSBwb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVmaW4ucmVhZCgpOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IGJ1ZmluLnJlYWQobmV3IGJ5dGVbMl0sIDAsIDIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHJlc3VsdDogIiArIHJlc3VsdCwgcmVzdWx0ID09IDEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0ucmVzZXQoKQotCi0JCWJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTBdOwotCQlieXRlW10gYnVmMiA9IG5ldyBieXRlWzEwXTsKLQkJdHJ5IHsKLQkJCWlzLm1hcmsoMjAwMCk7Ci0JCQlpcy5yZWFkKGJ1ZjEsIDAsIDEwKTsKLQkJCWlzLnJlc2V0KCk7Ci0JCQlpcy5yZWFkKGJ1ZjIsIDAsIDEwKTsKLQkJCWlzLnJlc2V0KCk7Ci0JCQlhc3NlcnRUcnVlKCJSZXNldCBmYWlsZWQiLCBuZXcgU3RyaW5nKGJ1ZjEsIDAsIGJ1ZjEubGVuZ3RoKQotCQkJCQkuZXF1YWxzKG5ldyBTdHJpbmcoYnVmMiwgMCwgYnVmMi5sZW5ndGgpKSk7Ci0KLQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYkluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiMTIzNDU2Nzg5MCIuZ2V0Qnl0ZXMoKSkpOwotCQkJYkluLm1hcmsoMTApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7Ci0JCQkJYkluLnJlYWQoKTsKLQkJCX0KLQkJCWJJbi5yZXNldCgpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVzZXQgdGVzdCIpOwotCQl9Ci0JfQotCQogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVzZXRfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShudWxsKTsKLQkJCi0JCS8vdGhyb3dzIElPRXhjZXBpdG9uIHdpdGggbWVzc2FnZSAiTWFyayBoYXMgYmVlbiBpbnZhbGlkYXRlZCIKLQkJdHJ5IHsKLQkJCWJpcy5yZXNldCgpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJCi0JCS8vZG9lcyBub3QgdGhyb3cgSU9FeGNlcHRpb24KLQkJYmlzLm1hcmsoMSk7Ci0JCWJpcy5yZXNldCgpOwotCQkKLQkJYmlzLmNsb3NlKCk7CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlc2V0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICAKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLnJlc2V0KCkKIAotCQkvL3Rocm93cyBJT0V4Y2VwdGlvbiB3aXRoIG1lc3NhZ2UgInN0cmVhbSBpcyBjbG9zZWQiCi0JCXRyeSB7Ci0JCQliaXMucmVzZXQoKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQorICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgYnl0ZVtdIGJ1ZjIgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcy5tYXJrKDIwMDApOworICAgICAgICAgICAgaXMucmVhZChidWYxLCAwLCAxMCk7CisgICAgICAgICAgICBpcy5yZXNldCgpOworICAgICAgICAgICAgaXMucmVhZChidWYyLCAwLCAxMCk7CisgICAgICAgICAgICBpcy5yZXNldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzZXQgZmFpbGVkIiwgbmV3IFN0cmluZyhidWYxLCAwLCBidWYxLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZjIsIDAsIGJ1ZjIubGVuZ3RoKSkpOworCisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJJbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIjEyMzQ1Njc4OTAiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgIGJJbi5tYXJrKDEwKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTE7IGkrKykgeworICAgICAgICAgICAgICAgIGJJbi5yZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiSW4ucmVzZXQoKTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlc2V0IHRlc3QiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtI3Jlc2V0KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJDaGVja3MgSU9FeGNlcHRpb24iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXNldCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzZXRfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShudWxsKTsKKyAgICAgICAgCisgICAgICAgIC8vdGhyb3dzIElPRXhjZXBpdG9uIHdpdGggbWVzc2FnZSAiTWFyayBoYXMgYmVlbiBpbnZhbGlkYXRlZCIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJpcy5yZXNldCgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vZG9lcyBub3QgdGhyb3cgSU9FeGNlcHRpb24KKyAgICAgICAgYmlzLm1hcmsoMSk7CisgICAgICAgIGJpcy5yZXNldCgpOworICAgICAgICAKKyAgICAgICAgYmlzLmNsb3NlKCk7CisKKyAgICAgICAgLy90aHJvd3MgSU9FeGNlcHRpb24gd2l0aCBtZXNzYWdlICJzdHJlYW0gaXMgY2xvc2VkIgorICAgICAgICB0cnkgeworICAgICAgICAgICAgYmlzLnJlc2V0KCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KIAogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9za2lwSigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtLnNraXAobG9uZykKLQkJYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsxMF07Ci0JCXRyeSB7Ci0JCQlpcy5tYXJrKDIwMDApOwotCQkJaXMuc2tpcCgxMDAwKTsKLQkJCWlzLnJlYWQoYnVmMSwgMCwgYnVmMS5sZW5ndGgpOwotCQkJaXMucmVzZXQoKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBza2lwIHRvIGNvcnJlY3QgcG9zaXRpb24iLCBuZXcgU3RyaW5nKGJ1ZjEsCi0JCQkJCTAsIGJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMTAwMCwgMTAxMCkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBza2lwIHRlc3QiKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0jc2tpcChsb25nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBza2lwKGxvbmcgbikgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNraXAiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0uc2tpcChsb25nKQorICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLm1hcmsoMjAwMCk7CisgICAgICAgICAgICBpcy5za2lwKDEwMDApOworICAgICAgICAgICAgaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7CisgICAgICAgICAgICBpcy5yZXNldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNraXAgdG8gY29ycmVjdCBwb3NpdGlvbiIsIG5ldyBTdHJpbmcoYnVmMSwKKyAgICAgICAgICAgICAgICAgICAgMCwgYnVmMS5sZW5ndGgpLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygxMDAwLCAxMDEwKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNraXAgdGVzdCIpOworICAgICAgICB9CiAKLQkJLy9yZWdyZXNzaW9uIGZvciBIQVJNT05ZLTY2NworICAgICAgICAvL3JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNjY3CiAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYnVmID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obnVsbCwgNSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuc2tpcCgxMCk7CkBAIC00MjUsNTQgKzUwNyw1NCBAQAogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0JfQorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCUBPdmVycmlkZQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewogCi0JCXRyeSB7Ci0JCQlmaWxlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQkJCVN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JCQlpZiAoZmlsZU5hbWUuY2hhckF0KGZpbGVOYW1lLmxlbmd0aCgpIC0gMSkgPT0gc2VwYXJhdG9yLmNoYXJBdCgwKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOworICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmNoYXJBdChmaWxlTmFtZS5sZW5ndGgoKSAtIDEpID09IHNlcGFyYXRvci5jaGFyQXQoMCkpIHsKICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IFN1cHBvcnRfUGxhdGZvcm1GaWxlLmdldE5ld1BsYXRmb3JtRmlsZShmaWxlTmFtZSwKLQkJCQkJCSJpbnB1dC50c3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dC50c3QiKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBTdXBwb3J0X1BsYXRmb3JtRmlsZS5nZXROZXdQbGF0Zm9ybUZpbGUoZmlsZU5hbWUKLQkJCQkJCSsgc2VwYXJhdG9yLCAiaW5wdXQudHN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICArIHNlcGFyYXRvciwgImlucHV0LnRzdCIpOwogICAgICAgICAgICAgfQotCQkJT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCWZvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlpc0ZpbGUgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCWlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXNGaWxlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIHNldHVwIik7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICAgICAgZm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGlzRmlsZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpc0ZpbGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgc2V0dXAiKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKIAotCQl0cnkgewotCQkJaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyBCSVMgdGVhckRvd24iKTsKLQkJfQotCQl0cnkgewotCQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJZi5kZWxldGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyBCSVMgdGVhckRvd24iKTsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgQklTIHRlYXJEb3duIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgQklTIHRlYXJEb3duIik7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQnVmZmVyZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQnVmZmVyZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggMzZlMDE4Ny4uOWMyOTBhYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J1ZmZlcmVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9CdWZmZXJlZE91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTcsMjg0ICsxNywzMzEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCitAVGVzdFRhcmdldENsYXNzKEJ1ZmZlcmVkT3V0cHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBCdWZmZXJlZE91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JcHJpdmF0ZSBqYXZhLmlvLk91dHB1dFN0cmVhbSBvczsKKyAgICBwcml2YXRlIGphdmEuaW8uT3V0cHV0U3RyZWFtIG9zOwogCi0JamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvczsKKyAgICBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zOwogCi0JamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzOworICAgIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpczsKIAotCXB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlck91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSU9FeGNlcHRpb25cblRlc3RfamF2YV9pb19PdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19QcmludFN0cmVhbVxuVGVzdF9qYXZhX2lvX1JhbmRvbUFjY2Vzc0ZpbGVcblRlc3RfamF2YV9pb19TeW5jRmFpbGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BYnN0cmFjdE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Bcml0aG1ldGljRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5U3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Jvb2xlYW5cblRlc3RfamF2YV9sYW5nX0J5dGVcblRlc3RfamF2YV9sYW5nX0NoYXJhY3RlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NcblRlc3RfamF2YV9sYW5nX0NsYXNzQ2FzdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDaXJjdWxhcml0eUVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Zvcm1hdEVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0xvYWRlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0RvdWJsZVxuVGVzdF9qYXZhX2xhbmdfRXJyb3JcblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yXG5UZXN0X2phdmFfbGFuZ19GbG9hdFxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0Vycm9yXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnRlZ2VyXG5UZXN0X2phdmFfbGFuZ19JbnRlcm5hbEVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnRlcnJ1cHRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTGlua2FnZUVycm9yXG5UZXN0X2phdmFfbGFuZ19Mb25nXG5UZXN0X2phdmFfbGFuZ19NYXRoXG5UZXN0X2phdmFfbGFuZ19OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTm9DbGFzc0RlZkZvdW5kRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaEZpZWxkRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19OdWxsUG9pbnRlckV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJGb3JtYXRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX09iamVjdFxuVGVzdF9qYXZhX2xhbmdfT3V0T2ZNZW1vcnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfUnVudGltZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU2VjdXJpdHlNYW5hZ2VyXG5UZXN0X2phdmFfbGFuZ19TaG9ydFxuVGVzdF9qYXZhX2xhbmdfU3RhY2tPdmVyZmxvd0Vycm9yXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdcblRlc3RfamF2YV9sYW5nX1N0cmluZ0J1ZmZlclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU3lzdGVtXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRcblRlc3RfamF2YV9sYW5nX1RocmVhZERlYXRoXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRHcm91cFxuVGVzdF9qYXZhX2xhbmdfVGhyb3dhYmxlXG5UZXN0X2phdmFfbGFuZ19Vbmtub3duRXJyb3JcblRlc3RfamF2YV9sYW5nX1Vuc2F0aXNmaWVkTGlua0Vycm9yXG5UZXN0X2phdmFfbGFuZ19WZXJpZnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmlydHVhbE1hY2hpbmVFcnJvclxuVGVzdF9qYXZhX2xhbmdfdm1fSW1hZ2VcblRlc3RfamF2YV9sYW5nX3ZtX01lbW9yeVNlZ21lbnRcblRlc3RfamF2YV9sYW5nX3ZtX1JPTVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ192bV9WTVxuVGVzdF9qYXZhX2xhbmdfVm9pZFxuVGVzdF9qYXZhX25ldF9CaW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0Nvbm5lY3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfRGF0YWdyYW1QYWNrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X0luZXRBZGRyZXNzXG5UZXN0X2phdmFfbmV0X05vUm91dGVUb0hvc3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfUGxhaW5EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfUGxhaW5Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Tb2NrZXRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfVW5rbm93bkhvc3RFeGNlcHRpb25cblRlc3RfamF2YV91dGlsX0FycmF5RW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfRGF0ZVxuVGVzdF9qYXZhX3V0aWxfRXZlbnRPYmplY3RcblRlc3RfamF2YV91dGlsX0hhc2hFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9IYXNodGFibGVcblRlc3RfamF2YV91dGlsX1Byb3BlcnRpZXNcblRlc3RfamF2YV91dGlsX1Jlc291cmNlQnVuZGxlXG5UZXN0X2phdmFfdXRpbF90bVxuVGVzdF9qYXZhX3V0aWxfVmVjdG9yXG4iOworICAgIHB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlck91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSU9FeGNlcHRpb25cblRlc3RfamF2YV9pb19PdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19QcmludFN0cmVhbVxuVGVzdF9qYXZhX2lvX1JhbmRvbUFjY2Vzc0ZpbGVcblRlc3RfamF2YV9pb19TeW5jRmFpbGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BYnN0cmFjdE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Bcml0aG1ldGljRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5U3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Jvb2xlYW5cblRlc3RfamF2YV9sYW5nX0J5dGVcblRlc3RfamF2YV9sYW5nX0NoYXJhY3RlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NcblRlc3RfamF2YV9sYW5nX0NsYXNzQ2FzdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDaXJjdWxhcml0eUVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Zvcm1hdEVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0xvYWRlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0RvdWJsZVxuVGVzdF9qYXZhX2xhbmdfRXJyb3JcblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yXG5UZXN0X2phdmFfbGFuZ19GbG9hdFxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0Vycm9yXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnRlZ2VyXG5UZXN0X2phdmFfbGFuZ19JbnRlcm5hbEVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnRlcnJ1cHRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTGlua2FnZUVycm9yXG5UZXN0X2phdmFfbGFuZ19Mb25nXG5UZXN0X2phdmFfbGFuZ19NYXRoXG5UZXN0X2phdmFfbGFuZ19OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTm9DbGFzc0RlZkZvdW5kRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaEZpZWxkRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19OdWxsUG9pbnRlckV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJGb3JtYXRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX09iamVjdFxuVGVzdF9qYXZhX2xhbmdfT3V0T2ZNZW1vcnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfUnVudGltZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU2VjdXJpdHlNYW5hZ2VyXG5UZXN0X2phdmFfbGFuZ19TaG9ydFxuVGVzdF9qYXZhX2xhbmdfU3RhY2tPdmVyZmxvd0Vycm9yXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdcblRlc3RfamF2YV9sYW5nX1N0cmluZ0J1ZmZlclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU3lzdGVtXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRcblRlc3RfamF2YV9sYW5nX1RocmVhZERlYXRoXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRHcm91cFxuVGVzdF9qYXZhX2xhbmdfVGhyb3dhYmxlXG5UZXN0X2phdmFfbGFuZ19Vbmtub3duRXJyb3JcblRlc3RfamF2YV9sYW5nX1Vuc2F0aXNmaWVkTGlua0Vycm9yXG5UZXN0X2phdmFfbGFuZ19WZXJpZnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmlydHVhbE1hY2hpbmVFcnJvclxuVGVzdF9qYXZhX2xhbmdfdm1fSW1hZ2VcblRlc3RfamF2YV9sYW5nX3ZtX01lbW9yeVNlZ21lbnRcblRlc3RfamF2YV9sYW5nX3ZtX1JPTVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ192bV9WTVxuVGVzdF9qYXZhX2xhbmdfVm9pZFxuVGVzdF9qYXZhX25ldF9CaW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0Nvbm5lY3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfRGF0YWdyYW1QYWNrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X0luZXRBZGRyZXNzXG5UZXN0X2phdmFfbmV0X05vUm91dGVUb0hvc3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfUGxhaW5EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfUGxhaW5Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Tb2NrZXRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfVW5rbm93bkhvc3RFeGNlcHRpb25cblRlc3RfamF2YV91dGlsX0FycmF5RW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfRGF0ZVxuVGVzdF9qYXZhX3V0aWxfRXZlbnRPYmplY3RcblRlc3RfamF2YV91dGlsX0hhc2hFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9IYXNodGFibGVcblRlc3RfamF2YV91dGlsX1Byb3BlcnRpZXNcblRlc3RfamF2YV91dGlsX1Jlc291cmNlQnVuZGxlXG5UZXN0X2phdmFfdXRpbF90bVxuVGVzdF9qYXZhX3V0aWxfVmVjdG9yXG4iOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0jQnVmZmVyZWRPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JCXRyeSB7Ci0JCQliYW9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MpOwotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCA1MDApOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNvbnN0cmN1dG9yIHRlc3QgZmFpbGVkIik7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbSNCdWZmZXJlZE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhlIHRlc3QgdmVyaWZpZXMgQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiQnVmZmVyZWRPdXRwdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiYW9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MpOworICAgICAgICAgICAgb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCA1MDApOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNvbnN0cmN1dG9yIHRlc3QgZmFpbGVkIik7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbSNCdWZmZXJlZE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSwKLQkgKiAgICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW1JKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSwKLQkJLy8gaW50KQotCQl0cnkgewotCQkJYmFvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJb3MgPSBuZXcgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbShiYW9zLCAxMDI0KTsKLQkJCW9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgNTAwKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgQ29uc3RyY3V0b3IgdGVzdCIpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0jQnVmZmVyZWRPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0sCisgICAgICogICAgICAgIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkJ1ZmZlcmVkT3V0cHV0U3RyZWFtIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtLAorICAgICAgICAvLyBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiYW9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MsIDEwMjQpOworICAgICAgICAgICAgb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCA1MDApOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyBDb25zdHJjdXRvciB0ZXN0Iik7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbSNmbHVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9mbHVzaCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbS5mbHVzaCgpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0jZmx1c2goKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmbHVzaCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9mbHVzaCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbS5mbHVzaCgpCiAKLQkJdHJ5IHsKLQkJCWJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MsIDYwMCk7Ci0JCQlvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIDUwMCk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCeXRlcyBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsCi0JCQkJCTUwMCwgKChCeXRlQXJyYXlPdXRwdXRTdHJlYW0pIGJhb3MpLnNpemUoKSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmx1c2ggdGVzdCBmYWlsZWQiKTsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MsIDYwMCk7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIDUwMCk7CisgICAgICAgICAgICBvcy5mbHVzaCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJCeXRlcyBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsCisgICAgICAgICAgICAgICAgICAgIDUwMCwgKChCeXRlQXJyYXlPdXRwdXRTdHJlYW0pIGJhb3MpLnNpemUoKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmx1c2ggdGVzdCBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZSBbXSwgaW50LAotCQkvLyBpbnQpCi0JCXRyeSB7Ci0JCQlvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotCQkJCQliYW9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksNTEyKTsKLQkJCW9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgNTAwKTsKLQkJCWJhaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJCeXRlcyB3cml0dGVuLCBub3QgYnVmZmVyZWQiLCAwLCBiYWlzLmF2YWlsYWJsZSgpKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQliYWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLQkJCWFzc2VydEVxdWFscygiQnl0ZXMgbm90IHdyaXR0ZW4gYWZ0ZXIgZmx1c2giLCA1MDAsIGJhaXMuYXZhaWxhYmxlKCkpOwotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCA1MDAsIDUxMyk7Ci0JCQliYWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLQkJCWFzc2VydFRydWUoIkJ5dGVzIG5vdCB3cml0dGVuIHdoZW4gYnVmZmVyIGZ1bGwiLAotCQkJCQliYWlzLmF2YWlsYWJsZSgpID49IDEwMDApOwotCQkJYnl0ZVtdIHdieXRlcyA9IG5ldyBieXRlWzEwMTNdOwotCQkJYmFpcy5yZWFkKHdieXRlcywgMCwgMTAxMyk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZXMgd3JpdHRlbiIsIGZpbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDEwMTMpCi0JCQkJCS5lcXVhbHMobmV3IFN0cmluZyh3Ynl0ZXMsIDAsIHdieXRlcy5sZW5ndGgpKSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmx1c2ggdGVzdCBmYWlsZWQiKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZSBbXSwgaW50LAorICAgICAgICAvLyBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBiYW9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksNTEyKTsKKyAgICAgICAgICAgIG9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgNTAwKTsKKyAgICAgICAgICAgIGJhaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJCeXRlcyB3cml0dGVuLCBub3QgYnVmZmVyZWQiLCAwLCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgICAgIG9zLmZsdXNoKCk7CisgICAgICAgICAgICBiYWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQnl0ZXMgbm90IHdyaXR0ZW4gYWZ0ZXIgZmx1c2giLCA1MDAsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgICAgICAgICAgb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCA1MDAsIDUxMyk7CisgICAgICAgICAgICBiYWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkJ5dGVzIG5vdCB3cml0dGVuIHdoZW4gYnVmZmVyIGZ1bGwiLAorICAgICAgICAgICAgICAgICAgICBiYWlzLmF2YWlsYWJsZSgpID49IDEwMDApOworICAgICAgICAgICAgYnl0ZVtdIHdieXRlcyA9IG5ldyBieXRlWzEwMTNdOworICAgICAgICAgICAgYmFpcy5yZWFkKHdieXRlcywgMCwgMTAxMyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZXMgd3JpdHRlbiIsIGZpbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDEwMTMpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV3IFN0cmluZyh3Ynl0ZXMsIDAsIHdieXRlcy5sZW5ndGgpKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmx1c2ggdGVzdCBmYWlsZWQiKTsKKyAgICAgICAgfQogCi0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZV8kQklJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsJCi0JCWJ5dGVbXSBudWxsQnl0ZUFycmF5ID0gbnVsbDsKLQkJYnl0ZVtdIGJ5dGVBcnJheSA9IG5ldyBieXRlWzEwXTsKLQkJCi0JCXRyeSB7Ci0JCQlib3Mud3JpdGUobnVsbEJ5dGVBcnJheSwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZV8kQklJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsgICAgCisgICAgICAgIGJ5dGVbXSBudWxsQnl0ZUFycmF5ID0gbnVsbDsKKyAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3Mud3JpdGUobnVsbEJ5dGVBcnJheSwgLTEsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCWJvcy53cml0ZShudWxsQnl0ZUFycmF5LCAtMSwgMCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWJvcy53cml0ZShudWxsQnl0ZUFycmF5LCAtMSwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKG51bGxCeXRlQXJyYXksIC0xLCAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKG51bGxCeXRlQXJyYXksIC0xLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCWJvcy53cml0ZShudWxsQnl0ZUFycmF5LCAwLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKG51bGxCeXRlQXJyYXksIDAsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCWJvcy53cml0ZShudWxsQnl0ZUFycmF5LCAwLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJYm9zLndyaXRlKG51bGxCeXRlQXJyYXksIDAsIDEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlib3Mud3JpdGUobnVsbEJ5dGVBcnJheSwgMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvcy53cml0ZShudWxsQnl0ZUFycmF5LCAwLCAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKG51bGxCeXRlQXJyYXksIDAsIDEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3Mud3JpdGUobnVsbEJ5dGVBcnJheSwgMSwgLTEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJYm9zLndyaXRlKG51bGxCeXRlQXJyYXksIDEsIDApOwotCQkJZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlib3Mud3JpdGUobnVsbEJ5dGVBcnJheSwgMSwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWJvcy53cml0ZShieXRlQXJyYXksIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3Mud3JpdGUobnVsbEJ5dGVBcnJheSwgMSwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvcy53cml0ZShudWxsQnl0ZUFycmF5LCAxLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKGJ5dGVBcnJheSwgLTEsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJYm9zLndyaXRlKGJ5dGVBcnJheSwgLTEsIDApOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWJvcy53cml0ZShieXRlQXJyYXksIC0xLCAxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvcy53cml0ZShieXRlQXJyYXksIC0xLCAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3Mud3JpdGUoYnl0ZUFycmF5LCAtMSwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCWJvcy53cml0ZShieXRlQXJyYXksIDAsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvcy53cml0ZShieXRlQXJyYXksIDAsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQlib3Mud3JpdGUoYnl0ZUFycmF5LCAwLCAwKTsKKyAgICAgICAgYm9zLndyaXRlKGJ5dGVBcnJheSwgMCwgMCk7CiAgICAgICAgIGJvcy53cml0ZShieXRlQXJyYXksIDAsIDEpOwogICAgICAgICBib3Mud3JpdGUoYnl0ZUFycmF5LCAwLCBieXRlQXJyYXkubGVuZ3RoKTsKLQkJCQotCQl0cnkgewotCQkJYm9zLndyaXRlKGJ5dGVBcnJheSwgMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3Mud3JpdGUoYnl0ZUFycmF5LCAxLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CiAKLQkJYm9zLndyaXRlKGJ5dGVBcnJheSwgMSwgMCk7Ci0JCWJvcy53cml0ZShieXRlQXJyYXksIDEsIDEpOworICAgICAgICBib3Mud3JpdGUoYnl0ZUFycmF5LCAxLCAwKTsKKyAgICAgICAgYm9zLndyaXRlKGJ5dGVBcnJheSwgMSwgMSk7CiAKIAotCQlib3Mud3JpdGUoYnl0ZUFycmF5LCBieXRlQXJyYXkubGVuZ3RoLCAwKTsKLQkJCi0JCXRyeSB7Ci0JCQlib3Mud3JpdGUoYnl0ZUFycmF5LCBieXRlQXJyYXkubGVuZ3RoICsgMSwgMCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlib3Mud3JpdGUoYnl0ZUFycmF5LCBieXRlQXJyYXkubGVuZ3RoICsgMSwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KKyAgICAgICAgYm9zLndyaXRlKGJ5dGVBcnJheSwgYnl0ZUFycmF5Lmxlbmd0aCwgMCk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKGJ5dGVBcnJheSwgYnl0ZUFycmF5Lmxlbmd0aCArIDEsIDApOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKGJ5dGVBcnJheSwgYnl0ZUFycmF5Lmxlbmd0aCArIDEsIDEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CiAKLQkJYm9zLmNsb3NlKCk7CisgICAgICAgIGJvcy5jbG9zZSgpOwogCi0JCXRyeSB7Ci0JCQlib3Mud3JpdGUoYnl0ZUFycmF5LCAtMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLndyaXRlKGJ5dGVBcnJheSwgLTEsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtI3dyaXRlKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbS53cml0ZShpbnQpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0jd3JpdGUoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW0ud3JpdGUoaW50KQogCi0JCXRyeSB7Ci0JCQliYW9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlvcyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MpOwotCQkJb3Mud3JpdGUoJ3QnKTsKLQkJCWJhaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJCeXRlIHdyaXR0ZW4sIG5vdCBidWZmZXJlZCIsIDAsIGJhaXMuYXZhaWxhYmxlKCkpOwotCQkJb3MuZmx1c2goKTsKLQkJCWJhaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJCeXRlIG5vdCB3cml0dGVuIGFmdGVyIGZsdXNoIiwgMSwgYmFpcy5hdmFpbGFibGUoKSk7Ci0JCQlieXRlW10gd2J5dGVzID0gbmV3IGJ5dGVbMV07Ci0JCQliYWlzLnJlYWQod2J5dGVzLCAwLCAxKTsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGJ5dGUgd3JpdHRlbiIsICd0Jywgd2J5dGVzWzBdKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJXcml0ZSB0ZXN0IGZhaWxlZCIpOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYmFvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgb3MgPSBuZXcgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAgICAgICAgIG9zLndyaXRlKCd0Jyk7CisgICAgICAgICAgICBiYWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQnl0ZSB3cml0dGVuLCBub3QgYnVmZmVyZWQiLCAwLCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgICAgIG9zLmZsdXNoKCk7CisgICAgICAgICAgICBiYWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQnl0ZSBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsIDEsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgICAgICAgICAgYnl0ZVtdIHdieXRlcyA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgYmFpcy5yZWFkKHdieXRlcywgMCwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBieXRlIHdyaXR0ZW4iLCAndCcsIHdieXRlc1swXSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiV3JpdGUgdGVzdCBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQkJdHJ5IHsKLQkJCWlmIChiYWlzICE9IG51bGwpCi0JCQkJYmFpcy5jbG9zZSgpOwotCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJb3MuY2xvc2UoKTsKLQkJCWlmIChiYW9zICE9IG51bGwpCi0JCQkJYmFvcy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIHRlYXJEb3duIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoYmFpcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJhaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoYmFvcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyB0ZWFyRG93biIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J1ZmZlcmVkUmVhZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J1ZmZlcmVkUmVhZGVyVGVzdC5qYXZhCmluZGV4IDdkZjdmMGIuLmY2MmExMGEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9CdWZmZXJlZFJlYWRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQnVmZmVyZWRSZWFkZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwpAQCAtMjcsMjQ0ICszMiwyODYgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9TdHJpbmdSZWFkZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQnVmZmVyZWRSZWFkZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIEJ1ZmZlcmVkUmVhZGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlCdWZmZXJlZFJlYWRlciBicjsKKyAgICBCdWZmZXJlZFJlYWRlciBicjsKIAotCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRlc3RfQWxsX1Rlc3RzXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5SW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19EYXRhSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlXG5UZXN0X2phdmFfaW9fRmlsZURlc2NyaXB0b3JcblRlc3RfamF2YV9pb19GaWxlSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9pb19GaWxlT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKKyAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CdWZmZXJlZE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRGF0YUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsZVxuVGVzdF9qYXZhX2lvX0ZpbGVEZXNjcmlwdG9yXG5UZXN0X2phdmFfaW9fRmlsZUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsZU5vdEZvdW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fRmlsZU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlcklucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVyT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19JT0V4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX091dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX1ByaW50U3RyZWFtXG5UZXN0X2phdmFfaW9fUmFuZG9tQWNjZXNzRmlsZVxuVGVzdF9qYXZhX2lvX1N5bmNGYWlsZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Fic3RyYWN0TWV0aG9kRXJyb3JcblRlc3RfamF2YV9sYW5nX0FyaXRobWV0aWNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlTdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQm9vbGVhblxuVGVzdF9qYXZhX2xhbmdfQnl0ZVxuVGVzdF9qYXZhX2xhbmdfQ2hhcmFjdGVyXG5UZXN0X2phdmFfbGFuZ19DbGFzc1xuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDYXN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19DbGFzc0NpcmN1bGFyaXR5RXJyb3JcblRlc3RfamF2YV9sYW5nX0NsYXNzRm9ybWF0RXJyb3JcblRlc3RfamF2YV9sYW5nX0NsYXNzTG9hZGVyXG5UZXN0X2phdmFfbGFuZ19DbGFzc05vdEZvdW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRG91YmxlXG5UZXN0X2phdmFfbGFuZ19FcnJvclxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3JcblRlc3RfamF2YV9sYW5nX0Zsb2F0XG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXJyb3JcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yXG5UZXN0X2phdmFfbGFuZ19JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXJyb3JcblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0ludGVnZXJcblRlc3RfamF2YV9sYW5nX0ludGVybmFsRXJyb3JcblRlc3RfamF2YV9sYW5nX0ludGVycnVwdGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19MaW5rYWdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0xvbmdcblRlc3RfamF2YV9sYW5nX01hdGhcblRlc3RfamF2YV9sYW5nX05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Ob0NsYXNzRGVmRm91bmRFcnJvclxuVGVzdF9qYXZhX2xhbmdfTm9TdWNoRmllbGRFcnJvclxuVGVzdF9qYXZhX2xhbmdfTm9TdWNoTWV0aG9kRXJyb3JcblRlc3RfamF2YV9sYW5nX051bGxQb2ludGVyRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJcblRlc3RfamF2YV9sYW5nX051bWJlckZvcm1hdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfT2JqZWN0XG5UZXN0X2phdmFfbGFuZ19PdXRPZk1lbW9yeUVycm9yXG5UZXN0X2phdmFfbGFuZ19SdW50aW1lRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19TZWN1cml0eU1hbmFnZXJcblRlc3RfamF2YV9sYW5nX1Nob3J0XG5UZXN0X2phdmFfbGFuZ19TdGFja092ZXJmbG93RXJyb3JcblRlc3RfamF2YV9sYW5nX1N0cmluZ1xuVGVzdF9qYXZhX2xhbmdfU3RyaW5nQnVmZmVyXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19TeXN0ZW1cblRlc3RfamF2YV9sYW5nX1RocmVhZFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkRGVhdGhcblRlc3RfamF2YV9sYW5nX1RocmVhZEdyb3VwXG5UZXN0X2phdmFfbGFuZ19UaHJvd2FibGVcblRlc3RfamF2YV9sYW5nX1Vua25vd25FcnJvclxuVGVzdF9qYXZhX2xhbmdfVW5zYXRpc2ZpZWRMaW5rRXJyb3JcblRlc3RfamF2YV9sYW5nX1ZlcmlmeUVycm9yXG5UZXN0X2phdmFfbGFuZ19WaXJ0dWFsTWFjaGluZUVycm9yXG5UZXN0X2phdmFfbGFuZ192bV9JbWFnZVxuVGVzdF9qYXZhX2xhbmdfdm1fTWVtb3J5U2VnbWVudFxuVGVzdF9qYXZhX2xhbmdfdm1fUk9NU3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX3ZtX1ZNXG5UZXN0X2phdmFfbGFuZ19Wb2lkXG5UZXN0X2phdmFfbmV0X0JpbmRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfQ29ubmVjdEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVBhY2tldFxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVNvY2tldFxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfSW5ldEFkZHJlc3NcblRlc3RfamF2YV9uZXRfTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9QbGFpbkRhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9QbGFpblNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0XG5UZXN0X2phdmFfbmV0X1NvY2tldEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldElucHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1NvY2tldE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Vbmtub3duSG9zdEV4Y2VwdGlvblxuVGVzdF9qYXZhX3V0aWxfQXJyYXlFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9EYXRlXG5UZXN0X2phdmFfdXRpbF9FdmVudE9iamVjdFxuVGVzdF9qYXZhX3V0aWxfSGFzaEVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0hhc2h0YWJsZVxuVGVzdF9qYXZhX3V0aWxfUHJvcGVydGllc1xuVGVzdF9qYXZhX3V0aWxfUmVzb3VyY2VCdW5kbGVcblRlc3RfamF2YV91dGlsX3RtXG5UZXN0X2phdmFfdXRpbF9WZWN0b3JcbiI7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNCdWZmZXJlZFJlYWRlcihqYXZhLmlvLlJlYWRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fUmVhZGVyKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CdWZmZXJlZFJlYWRlcihqYXZhLmlvLlJlYWRlcikKLQkJYXNzZXJ0VHJ1ZSgiVXNlZCBpbiB0ZXN0cyIsIHRydWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNCdWZmZXJlZFJlYWRlcihqYXZhLmlvLlJlYWRlcikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGR1bW15LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkJ1ZmZlcmVkUmVhZGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBqYXZhLmlvLlJlYWRlci5jbGFzcyB9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIoamF2YS5pby5SZWFkZXIpCisgICAgICAgIGFzc2VydFRydWUoIlVzZWQgaW4gdGVzdHMiLCB0cnVlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNCdWZmZXJlZFJlYWRlcihqYXZhLmlvLlJlYWRlciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19SZWFkZXJJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CdWZmZXJlZFJlYWRlcihqYXZhLmlvLlJlYWRlciwgaW50KQotCQlhc3NlcnRUcnVlKCJVc2VkIGluIHRlc3RzIiwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI0J1ZmZlcmVkUmVhZGVyKGphdmEuaW8uUmVhZGVyLCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBkdW1teS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJCdWZmZXJlZFJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHsgamF2YS5pby5SZWFkZXIuY2xhc3MsIGludC5jbGFzcyB9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlckkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyKGphdmEuaW8uUmVhZGVyLCBpbnQpCisgICAgICAgIGFzc2VydFRydWUoIlVzZWQgaW4gdGVzdHMiLCB0cnVlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZFJlYWRlci5jbG9zZSgpCi0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIodGVzdFN0cmluZykpOwotCQkJYnIuY2xvc2UoKTsKLQkJCWJyLnJlYWQoKTsKLQkJCWZhaWwoIlJlYWQgb24gY2xvc2VkIHN0cmVhbSIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGNsb3NlIHRlc3QgIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIjY2xvc2UoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjbG9zZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZFJlYWRlci5jbG9zZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIodGVzdFN0cmluZykpOworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgICAgIGJyLnJlYWQoKTsKKyAgICAgICAgICAgIGZhaWwoIlJlYWQgb24gY2xvc2VkIHN0cmVhbSIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGNsb3NlIHRlc3QgIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyLm1hcmsoaW50KQotCQljaGFyW10gYnVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7Ci0JCQlici5za2lwKDUwMCk7Ci0JCQlici5tYXJrKDEwMDApOwotCQkJYnIuc2tpcCgyNTApOwotCQkJYnIucmVzZXQoKTsKLQkJCWJ1ZiA9IG5ldyBjaGFyW3Rlc3RTdHJpbmcubGVuZ3RoKCldOwotCQkJYnIucmVhZChidWYsIDAsIDUwMCk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gc2V0IG1hcmsgcHJvcGVybHkiLCB0ZXN0U3RyaW5nLnN1YnN0cmluZyg1MDAsCi0JCQkJCTEwMDApLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZiwgMCwgNTAwKSkpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbWFyayB0ZXN0Iik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSwgODAwKTsKLQkJCWJyLnNraXAoNTAwKTsKLQkJCWJyLm1hcmsoMjUwKTsKLQkJCWJyLnJlYWQoYnVmLCAwLCAxMDAwKTsKLQkJCWJyLnJlc2V0KCk7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gaW52YWxpZGF0ZSBtYXJrIHByb3Blcmx5Iik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI21hcmsoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWFyayIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFya0koKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIubWFyayhpbnQpCisgICAgICAgIGNoYXJbXSBidWYgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgICAgIGJyLnNraXAoNTAwKTsKKyAgICAgICAgICAgIGJyLm1hcmsoMTAwMCk7CisgICAgICAgICAgICBici5za2lwKDI1MCk7CisgICAgICAgICAgICBici5yZXNldCgpOworICAgICAgICAgICAgYnVmID0gbmV3IGNoYXJbdGVzdFN0cmluZy5sZW5ndGgoKV07CisgICAgICAgICAgICBici5yZWFkKGJ1ZiwgMCwgNTAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBzZXQgbWFyayBwcm9wZXJseSIsIHRlc3RTdHJpbmcuc3Vic3RyaW5nKDUwMCwKKyAgICAgICAgICAgICAgICAgICAgMTAwMCkuZXF1YWxzKG5ldyBTdHJpbmcoYnVmLCAwLCA1MDApKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpLCA4MDApOworICAgICAgICAgICAgYnIuc2tpcCg1MDApOworICAgICAgICAgICAgYnIubWFyaygyNTApOworICAgICAgICAgICAgYnIucmVhZChidWYsIDAsIDEwMDApOworICAgICAgICAgICAgYnIucmVzZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBpbnZhbGlkYXRlIG1hcmsgcHJvcGVybHkiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworICAgICAgICB9CiAKLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMjU2XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCWNoYXJzW2ldID0gKGNoYXIpIGk7Ci0JCVJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIobmV3IFN0cmluZygKLQkJCQljaGFycykpLCAxMik7Ci0JCXRyeSB7Ci0JCQlpbi5za2lwKDYpOwotCQkJaW4ubWFyaygxNCk7Ci0JCQlpbi5yZWFkKG5ldyBjaGFyWzE0XSwgMCwgMTQpOwotCQkJaW4ucmVzZXQoKTsKLQkJCWFzc2VydFRydWUoIldyb25nIGNoYXJzIiwgaW4ucmVhZCgpID09IChjaGFyKSA2Ci0JCQkJCSYmIGluLnJlYWQoKSA9PSAoY2hhcikgNyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbWFyayB0ZXN0IDI6IiArIGUpOwotCQl9CisgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzI1Nl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBjaGFyc1tpXSA9IChjaGFyKSBpOworICAgICAgICBSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgY2hhcnMpKSwgMTIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4uc2tpcCg2KTsKKyAgICAgICAgICAgIGluLm1hcmsoMTQpOworICAgICAgICAgICAgaW4ucmVhZChuZXcgY2hhclsxNF0sIDAsIDE0KTsKKyAgICAgICAgICAgIGluLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBjaGFycyIsIGluLnJlYWQoKSA9PSAoY2hhcikgNgorICAgICAgICAgICAgICAgICAgICAmJiBpbi5yZWFkKCkgPT0gKGNoYXIpIDcpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCAyOiIgKyBlKTsKKyAgICAgICAgfQogCi0JCWluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihuZXcgU3RyaW5nKGNoYXJzKSksIDEyKTsKLQkJdHJ5IHsKLQkJCWluLnNraXAoNik7Ci0JCQlpbi5tYXJrKDgpOwotCQkJaW4uc2tpcCg3KTsKLQkJCWluLnJlc2V0KCk7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBjaGFycyAyIiwgaW4ucmVhZCgpID09IChjaGFyKSA2Ci0JCQkJCSYmIGluLnJlYWQoKSA9PSAoY2hhcikgNyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbWFyayB0ZXN0IDM6IiArIGUpOwotCQl9Ci0JfQorICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIobmV3IFN0cmluZyhjaGFycykpLCAxMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbi5za2lwKDYpOworICAgICAgICAgICAgaW4ubWFyayg4KTsKKyAgICAgICAgICAgIGluLnNraXAoNyk7CisgICAgICAgICAgICBpbi5yZXNldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgY2hhcnMgMiIsIGluLnJlYWQoKSA9PSAoY2hhcikgNgorICAgICAgICAgICAgICAgICAgICAmJiBpbi5yZWFkKCkgPT0gKGNoYXIpIDcpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCAzOiIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5CdWZmZXJlZFJlYWRlci5tYXJrU3VwcG9ydGVkKCkKLQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKLQkJYXNzZXJ0VHJ1ZSgibWFya1N1cHBvcnRlZCByZXR1cm5lZCBmYWxzZSIsIGJyLm1hcmtTdXBwb3J0ZWQoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI21hcmtTdXBwb3J0ZWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCB2ZXJpZmllcyBtYXJrU3VwcG9ydGVkKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hcmtTdXBwb3J0ZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIubWFya1N1cHBvcnRlZCgpCisgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7CisgICAgICAgIGFzc2VydFRydWUoIm1hcmtTdXBwb3J0ZWQgcmV0dXJuZWQgZmFsc2UiLCBici5tYXJrU3VwcG9ydGVkKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CdWZmZXJlZFJlYWRlci5yZWFkKCkKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7Ci0JCQlpbnQgciA9IGJyLnJlYWQoKTsKLQkJCWFzc2VydFRydWUoIkNoYXIgcmVhZCBpbXByb3Blcmx5IiwgdGVzdFN0cmluZy5jaGFyQXQoMCkgPT0gcik7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIobmV3IFN0cmluZygKLQkJCQkJbmV3IGNoYXJbXSB7ICdcdTg3NjUnIH0pKSk7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBkb3VibGUgYnl0ZSBjaGFyYWN0ZXIiLCBici5yZWFkKCkgPT0gJ1x1ODc2NScpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0Iik7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyLnJlYWQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgICAgIGludCByID0gYnIucmVhZCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2hhciByZWFkIGltcHJvcGVybHkiLCB0ZXN0U3RyaW5nLmNoYXJBdCgwKSA9PSByKTsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihuZXcgU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBuZXcgY2hhcltdIHsgJ1x1ODc2NScgfSkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGRvdWJsZSBieXRlIGNoYXJhY3RlciIsIGJyLnJlYWQoKSA9PSAnXHU4NzY1Jyk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QiKTsKKyAgICAgICAgfQogCi0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzI1Nl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQljaGFyc1tpXSA9IChjaGFyKSBpOwotCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoCi0JCQkJY2hhcnMpKSwgMTIpOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBpbml0aWFsIGNoYXIiLCAwLCBpbi5yZWFkKCkpOyAvLyBGaWxsIHRoZQotCQkJLy8gYnVmZmVyCi0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbMTRdOwotCQkJaW4ucmVhZChidWYsIDAsIDE0KTsgLy8gUmVhZCBncmVhdGVyIHRoYW4gdGhlIGJ1ZmZlcgotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgYmxvY2sgcmVhZCBkYXRhIiwgbmV3IFN0cmluZyhidWYpCi0JCQkJCS5lcXVhbHMobmV3IFN0cmluZyhjaGFycywgMSwgMTQpKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIGNoYXJzIiwgMTUsIGluLnJlYWQoKSk7IC8vIENoZWNrIG5leHQgYnl0ZQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCAyOiIgKyBlKTsKLQkJfQotCQkKLQkJLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTg0MQotCQlhc3NlcnRUcnVlKG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgQ2hhckFycmF5UmVhZGVyKG5ldyBjaGFyWzVdLCAxLCAwKSwgMikucmVhZCgpID09IC0xKTsKLQl9CisgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzI1Nl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBjaGFyc1tpXSA9IChjaGFyKSBpOworICAgICAgICBSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgY2hhcnMpKSwgMTIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBpbml0aWFsIGNoYXIiLCAwLCBpbi5yZWFkKCkpOyAvLyBGaWxsIHRoZQorICAgICAgICAgICAgLy8gYnVmZmVyCisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTRdOworICAgICAgICAgICAgaW4ucmVhZChidWYsIDAsIDE0KTsgLy8gUmVhZCBncmVhdGVyIHRoYW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgYmxvY2sgcmVhZCBkYXRhIiwgbmV3IFN0cmluZyhidWYpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV3IFN0cmluZyhjaGFycywgMSwgMTQpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGNoYXJzIiwgMTUsIGluLnJlYWQoKSk7IC8vIENoZWNrIG5leHQgYnl0ZQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCAyOiIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTg0MQorICAgICAgICBhc3NlcnRUcnVlKG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgQ2hhckFycmF5UmVhZGVyKG5ldyBjaGFyWzVdLCAxLCAwKSwgMikucmVhZCgpID09IC0xKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSSgpIHRocm93cyBFeGNlcHRpb257Ci0JCWNoYXJbXSBjYSA9IG5ldyBjaGFyWzJdOwotCQlCdWZmZXJlZFJlYWRlciB0b1JldCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSkpOwotCQl0cnkgewotCQkJdG9SZXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCAxOiAiICsgZSk7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHJlYWQoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUkoKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICBjaGFyW10gY2EgPSBuZXcgY2hhclsyXTsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgdG9SZXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRvUmV0LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgMTogIiArIGUpOworICAgICAgICB9CiAKLQkJLyogQ2xvc2VkIHJlYWRlciBzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24gcmVhZGluZyB6ZXJvIGJ5dGVzICovCi0JCXRyeSB7Ci0JCQl0b1JldC5yZWFkKGNhLCAwLCAwKTsKLQkJCWZhaWwoIlJlYWRpbmcgemVybyBieXRlcyBvbiBhIGNsb3NlZCByZWFkZXIgc2hvdWxkIG5vdCB3b3JrIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICAgICAgLyogQ2xvc2VkIHJlYWRlciBzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24gcmVhZGluZyB6ZXJvIGJ5dGVzICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0b1JldC5yZWFkKGNhLCAwLCAwKTsKKyAgICAgICAgICAgIGZhaWwoIlJlYWRpbmcgemVybyBieXRlcyBvbiBhIGNsb3NlZCByZWFkZXIgc2hvdWxkIG5vdCB3b3JrIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQkvKgotCQkgKiBDbG9zZWQgcmVhZGVyIHNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiBpbiBwcmVmZXJlbmNlIHRvIGluZGV4IG91dCBvZgotCQkgKiBib3VuZHMKLQkJICovCi0JCXRyeSB7Ci0JCQkvLyBSZWFkIHNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiBiZWZvcmUKLQkJCS8vIEFycmF5SW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uCi0JCQl0b1JldC5yZWFkKGNhLCAxLCA1KTsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICAgICAgLy8gVGVzdCB0byBlbnN1cmUgdGhhdCBhIGRyYWluZWQgc3RyZWFtIHJldHVybnMgMCBhdCBFT0YKKyAgICAgICAgdG9SZXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVsyXSkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRW1wdHlpbmcgdGhlIHJlYWRlciBzaG91bGQgcmV0dXJuIHR3byBieXRlcyIsIDIsCisgICAgICAgICAgICAgICAgICAgIHRvUmV0LnJlYWQoY2EsIDAsIDIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRU9GIG9uIGEgcmVhZGVyIHNob3VsZCBiZSAtMSIsIC0xLCB0b1JldC5yZWFkKGNhLCAwLAorICAgICAgICAgICAgICAgICAgICAyKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlYWRpbmcgemVybyBieXRlcyBhdCBFT0Ygc2hvdWxkIHdvcmsiLCAwLCB0b1JldAorICAgICAgICAgICAgICAgICAgICAucmVhZChjYSwgMCwgMCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiA6ICIgKyBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworICAgICAgICB9CiAKLQkJLy8gVGVzdCB0byBlbnN1cmUgdGhhdCBhIGRyYWluZWQgc3RyZWFtIHJldHVybnMgMCBhdCBFT0YKLQkJdG9SZXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVsyXSkpKTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiRW1wdHlpbmcgdGhlIHJlYWRlciBzaG91bGQgcmV0dXJuIHR3byBieXRlcyIsIDIsCi0JCQkJCXRvUmV0LnJlYWQoY2EsIDAsIDIpKTsKLQkJCWFzc2VydEVxdWFscygiRU9GIG9uIGEgcmVhZGVyIHNob3VsZCBiZSAtMSIsIC0xLCB0b1JldC5yZWFkKGNhLCAwLAotCQkJCQkyKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlJlYWRpbmcgemVybyBieXRlcyBhdCBFT0Ygc2hvdWxkIHdvcmsiLCAwLCB0b1JldAotCQkJCQkucmVhZChjYSwgMCwgMCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiA6ICIgKyBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CdWZmZXJlZFJlYWRlci5yZWFkKGNoYXIgW10sIGludCwgaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW3Rlc3RTdHJpbmcubGVuZ3RoKCldOworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgICAgIGJyLnJlYWQoYnVmLCA1MCwgNTAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNoYXJzIHJlYWQgaW1wcm9wZXJseSIsIG5ldyBTdHJpbmcoYnVmLCA1MCwgNTAwKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRlc3RTdHJpbmcuc3Vic3RyaW5nKDAsIDUwMCkpKTsKIAotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uQnVmZmVyZWRSZWFkZXIucmVhZChjaGFyIFtdLCBpbnQsIGludCkKLQkJdHJ5IHsKLQkJCWNoYXJbXSBidWYgPSBuZXcgY2hhclt0ZXN0U3RyaW5nLmxlbmd0aCgpXTsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7Ci0JCQlici5yZWFkKGJ1ZiwgNTAsIDUwMCk7Ci0JCQlhc3NlcnRUcnVlKCJDaGFycyByZWFkIGltcHJvcGVybHkiLCBuZXcgU3RyaW5nKGJ1ZiwgNTAsIDUwMCkKLQkJCQkJLmVxdWFscyh0ZXN0U3RyaW5nLnN1YnN0cmluZygwLCA1MDApKSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QiKTsKLQkJfQorICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBici5yZWFkKGJ1ZiwgMCwgMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5sZW5ndGgsIGJyLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYnIucmVhZChidWYsIGJ1Zi5sZW5ndGgsIDApKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgUmVhZGVyKCkgeworICAgICAgICAgICAgaW50IHNpemUgPSAyLCBwb3MgPSAwOwogCi0JCUJ1ZmZlcmVkUmVhZGVyIGJ1ZmluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBSZWFkZXIoKSB7Ci0JCQlpbnQgc2l6ZSA9IDIsIHBvcyA9IDA7CisgICAgICAgICAgICBjaGFyW10gY29udGVudHMgPSBuZXcgY2hhcltzaXplXTsKIAotCQkJY2hhcltdIGNvbnRlbnRzID0gbmV3IGNoYXJbc2l6ZV07CisgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZWFkIHBhc3QgZW5kIG9mIGRhdGEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudHNbcG9zKytdOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCWlmIChwb3MgPj0gc2l6ZSkKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZWFkIHBhc3QgZW5kIG9mIGRhdGEiKTsKLQkJCQlyZXR1cm4gY29udGVudHNbcG9zKytdOwotCQkJfQorICAgICAgICAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBzaXplKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlJlYWQgcGFzdCBlbmQgb2YgZGF0YSIpOworICAgICAgICAgICAgICAgIGludCB0b1JlYWQgPSBsZW47CisgICAgICAgICAgICAgICAgaWYgKHRvUmVhZCA+IChzaXplIC0gcG9zKSkKKyAgICAgICAgICAgICAgICAgICAgdG9SZWFkID0gc2l6ZSAtIHBvczsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCBwb3MsIGJ1Ziwgb2ZmLCB0b1JlYWQpOworICAgICAgICAgICAgICAgIHBvcyArPSB0b1JlYWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvUmVhZDsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIGludCByZWFkKGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJaWYgKHBvcyA+PSBzaXplKQotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlJlYWQgcGFzdCBlbmQgb2YgZGF0YSIpOwotCQkJCWludCB0b1JlYWQgPSBsZW47Ci0JCQkJaWYgKHRvUmVhZCA+IChzaXplIC0gcG9zKSkKLQkJCQkJdG9SZWFkID0gc2l6ZSAtIHBvczsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCBwb3MsIGJ1Ziwgb2ZmLCB0b1JlYWQpOwotCQkJCXBvcyArPSB0b1JlYWQ7Ci0JCQkJcmV0dXJuIHRvUmVhZDsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZSAtIHBvcyA+IDA7CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gc2l6ZSAtIHBvcyA+IDA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCX0KLQkJfSk7Ci0JCXRyeSB7Ci0JCQlidWZpbi5yZWFkKCk7Ci0JCQlpbnQgcmVzdWx0ID0gYnVmaW4ucmVhZChuZXcgY2hhclsyXSwgMCwgMik7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgcmVzdWx0OiAiICsgcmVzdWx0LCByZXN1bHQgPT0gMSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQ6ICIgKyBlKTsKLQkJfQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1ZmluLnJlYWQoKTsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBidWZpbi5yZWFkKG5ldyBjaGFyWzJdLCAwLCAyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCByZXN1bHQ6ICIgKyByZXN1bHQsIHJlc3VsdCA9PSAxKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZDogIiArIGUpOworICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvL3JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODMxCiAgICAgICAgIHRyeXsKQEAgLTI3MiwxOTcgKzMxOSwyMDAgQEAKICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CiAgICAgICAgIH1jYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpewogICAgICAgICB9Ci0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3JlYWQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJENJSV9FeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIodGVzdFN0cmluZykpOwotCQljaGFyW10gbnVsbENoYXJBcnJheSA9IG51bGw7Ci0JCWNoYXJbXSBjaGFyQXJyYXkgPSB0ZXN0U3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCQotCQl0cnkgewotCQkJYnIucmVhZChudWxsQ2hhckFycmF5LCAtMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJYnIucmVhZChudWxsQ2hhckFycmF5LCAtMSwgMCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhhdCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCB0aHJvd3MgZXhjZXB0aW9ucyBpbiBhcHByb3ByaWF0ZSBjYXNlcy4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kQ0lJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7CisgICAgICAgIGNoYXJbXSBudWxsQ2hhckFycmF5ID0gbnVsbDsKKyAgICAgICAgY2hhcltdIGNoYXJBcnJheSA9IHRlc3RTdHJpbmcudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBici5yZWFkKG51bGxDaGFyQXJyYXksIDAsIDApOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJYnIucmVhZChudWxsQ2hhckFycmF5LCAwLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIucmVhZChjaGFyQXJyYXksIDAsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlici5yZWFkKG51bGxDaGFyQXJyYXksIDAsIDApOwotCQkJZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlici5yZWFkKG51bGxDaGFyQXJyYXksIDAsIDEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlici5yZWFkKGNoYXJBcnJheSwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIucmVhZChjaGFyQXJyYXksIC0xLCAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyLnJlYWQoY2hhckFycmF5LCBjaGFyQXJyYXkubGVuZ3RoICsgMSwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyLnJlYWQoY2hhckFycmF5LCBjaGFyQXJyYXkubGVuZ3RoLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIucmVhZChjaGFyQXJyYXksIDAsIGNoYXJBcnJheS5sZW5ndGggKyAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIucmVhZChjaGFyQXJyYXksIDEsIGNoYXJBcnJheS5sZW5ndGgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJYnIucmVhZChjaGFyQXJyYXksIC0xLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICBici5jbG9zZSgpOwogCi0JCWJyLnJlYWQoY2hhckFycmF5LCAwLCAwKTsKLSAgICAgICAgYnIucmVhZChjaGFyQXJyYXksIDAsIGNoYXJBcnJheS5sZW5ndGgpOwotICAgICAgICBici5yZWFkKGNoYXJBcnJheSwgY2hhckFycmF5Lmxlbmd0aCwgMCk7Ci0JCQotCQl0cnkgewotCQkJYnIucmVhZChjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggKyAxLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJYnIucmVhZChjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggKyAxLCAxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBici5yZWFkKGNoYXJBcnJheSwgMCwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZWFkTGluZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiQ2hlY2tpbmcgZm9yICdccicgJiBJT0V4Y2VwdGlvbiBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZExpbmUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMaW5lKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7CisgICAgICAgICAgICBTdHJpbmcgciA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJlYWRMaW5lIHJldHVybmVkIGluY29ycmVjdCBzdHJpbmciLCAiVGVzdF9BbGxfVGVzdHMiLCByKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWRMaW5lIHRlc3QiKTsKKyAgICAgICAgfQorICAgIH0KIAotCQlici5jbG9zZSgpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3JlYWR5KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZHkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWR5KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyLnJlYWR5KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJyZWFkeSByZXR1cm5lZCBmYWxzZSIsIGJyLnJlYWR5KCkpOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZHkgdGVzdCIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JCXRyeSB7Ci0JCQlici5yZWFkKG51bGxDaGFyQXJyYXksIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3Jlc2V0KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhlIHRlc3QgdmVyaWZpZXMgcmVzZXQoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVzZXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIucmVzZXQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgICAgIGJyLnNraXAoNTAwKTsKKyAgICAgICAgICAgIGJyLm1hcmsoOTAwKTsKKyAgICAgICAgICAgIGJyLnNraXAoNTAwKTsKKyAgICAgICAgICAgIGJyLnJlc2V0KCk7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbdGVzdFN0cmluZy5sZW5ndGgoKV07CisgICAgICAgICAgICBici5yZWFkKGJ1ZiwgMCwgNTAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byByZXNldCBwcm9wZXJseSIsIHRlc3RTdHJpbmcuc3Vic3RyaW5nKDUwMCwKKyAgICAgICAgICAgICAgICAgICAgMTAwMCkuZXF1YWxzKG5ldyBTdHJpbmcoYnVmLCAwLCA1MDApKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZXNldCB0ZXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7CisgICAgICAgICAgICBici5za2lwKDUwMCk7CisgICAgICAgICAgICBici5yZXNldCgpOworICAgICAgICAgICAgZmFpbCgiUmVzZXQgc3VjY2VlZGVkIG9uIHVubWFya2VkIHN0cmVhbSIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICByZXR1cm47CiAKLQkJdHJ5IHsKLQkJCWJyLnJlYWQoY2hhckFycmF5LCAtMSwgMCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCWJyLnJlYWQoY2hhckFycmF5LCAwLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZWFkTGluZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkTGluZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5CdWZmZXJlZFJlYWRlci5yZWFkTGluZSgpCi0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIodGVzdFN0cmluZykpOwotCQkJU3RyaW5nIHIgPSBici5yZWFkTGluZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJyZWFkTGluZSByZXR1cm5lZCBpbmNvcnJlY3Qgc3RyaW5nIiwgIlRlc3RfQWxsX1Rlc3RzIiwgcgotCQkJCQkpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZExpbmUgdGVzdCIpOwotCQl9Ci0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWR5KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyLnJlYWR5KCkKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7Ci0JCQlhc3NlcnRUcnVlKCJyZWFkeSByZXR1cm5lZCBmYWxzZSIsIGJyLnJlYWR5KCkpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZHkgdGVzdCIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3NraXAobG9uZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJza2lwIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcEooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIuc2tpcChsb25nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgICAgIGJyLnNraXAoNTAwKTsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclt0ZXN0U3RyaW5nLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIGJyLnJlYWQoYnVmLCAwLCA1MDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNldCBza2lwIHByb3Blcmx5IiwgdGVzdFN0cmluZy5zdWJzdHJpbmcoNTAwLAorICAgICAgICAgICAgICAgICAgICAxMDAwKS5lcXVhbHMobmV3IFN0cmluZyhidWYsIDAsIDUwMCkpKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNraXAgdGVzdCIpOworICAgICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZFJlYWRlci5yZXNldCgpCi0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIodGVzdFN0cmluZykpOwotCQkJYnIuc2tpcCg1MDApOwotCQkJYnIubWFyayg5MDApOwotCQkJYnIuc2tpcCg1MDApOwotCQkJYnIucmVzZXQoKTsKLQkJCWNoYXJbXSBidWYgPSBuZXcgY2hhclt0ZXN0U3RyaW5nLmxlbmd0aCgpXTsKLQkJCWJyLnJlYWQoYnVmLCAwLCA1MDApOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlc2V0IHByb3Blcmx5IiwgdGVzdFN0cmluZy5zdWJzdHJpbmcoNTAwLAotCQkJCQkxMDAwKS5lcXVhbHMobmV3IFN0cmluZyhidWYsIDAsIDUwMCkpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlc2V0IHRlc3QiKTsKLQkJfQotCQl0cnkgewotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKTsKLQkJCWJyLnNraXAoNTAwKTsKLQkJCWJyLnJlc2V0KCk7Ci0JCQlmYWlsKCJSZXNldCBzdWNjZWVkZWQgb24gdW5tYXJrZWQgc3RyZWFtIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCXJldHVybjsKKyAgICB9CiAKLQkJfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCX0KLQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyLnNraXAobG9uZykKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSk7Ci0JCQlici5za2lwKDUwMCk7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbdGVzdFN0cmluZy5sZW5ndGgoKV07Ci0JCQlici5yZWFkKGJ1ZiwgMCwgNTAwKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBzZXQgc2tpcCBwcm9wZXJseSIsIHRlc3RTdHJpbmcuc3Vic3RyaW5nKDUwMCwKLQkJCQkJMTAwMCkuZXF1YWxzKG5ldyBTdHJpbmcoYnVmLCAwLCA1MDApKSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBza2lwIHRlc3QiKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQotCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlici5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9CdWZmZXJlZFdyaXRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9CdWZmZXJlZFdyaXRlclRlc3QuamF2YQppbmRleCBiNWE2OGIwLi5mYzc2NWYxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQnVmZmVyZWRXcml0ZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J1ZmZlcmVkV3JpdGVyVGVzdC5qYXZhCkBAIC0xNywyNjMgKzE3LDM1NyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9TdHJpbmdXcml0ZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQnVmZmVyZWRXcml0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIEJ1ZmZlcmVkV3JpdGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlCdWZmZXJlZFdyaXRlciBidzsKKyAgICBCdWZmZXJlZFdyaXRlciBidzsKIAotCVN1cHBvcnRfU3RyaW5nV3JpdGVyIHN3OworICAgIFN1cHBvcnRfU3RyaW5nV3JpdGVyIHN3OwogCi0JcHVibGljIFN0cmluZyB0ZXN0U3RyaW5nID0gIlRlc3RfQWxsX1Rlc3RzXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5SW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19EYXRhSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlXG5UZXN0X2phdmFfaW9fRmlsZURlc2NyaXB0b3JcblRlc3RfamF2YV9pb19GaWxlSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9pb19GaWxlT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlck91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSU9FeGNlcHRpb25cblRlc3RfamF2YV9pb19PdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19QcmludFN0cmVhbVxuVGVzdF9qYXZhX2lvX1JhbmRvbUFjY2Vzc0ZpbGVcblRlc3RfamF2YV9pb19TeW5jRmFpbGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BYnN0cmFjdE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Bcml0aG1ldGljRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5U3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Jvb2xlYW5cblRlc3RfamF2YV9sYW5nX0J5dGVcblRlc3RfamF2YV9sYW5nX0NoYXJhY3RlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NcblRlc3RfamF2YV9sYW5nX0NsYXNzQ2FzdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDaXJjdWxhcml0eUVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Zvcm1hdEVycm9yXG5UZXN0X2phdmFfbGFuZ19DbGFzc0xvYWRlclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0RvdWJsZVxuVGVzdF9qYXZhX2xhbmdfRXJyb3JcblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yXG5UZXN0X2phdmFfbGFuZ19GbG9hdFxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0Vycm9yXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnRlZ2VyXG5UZXN0X2phdmFfbGFuZ19JbnRlcm5hbEVycm9yXG5UZXN0X2phdmFfbGFuZ19JbnRlcnJ1cHRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTGlua2FnZUVycm9yXG5UZXN0X2phdmFfbGFuZ19Mb25nXG5UZXN0X2phdmFfbGFuZ19NYXRoXG5UZXN0X2phdmFfbGFuZ19OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTm9DbGFzc0RlZkZvdW5kRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaEZpZWxkRXJyb3JcblRlc3RfamF2YV9sYW5nX05vU3VjaE1ldGhvZEVycm9yXG5UZXN0X2phdmFfbGFuZ19OdWxsUG9pbnRlckV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJGb3JtYXRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX09iamVjdFxuVGVzdF9qYXZhX2xhbmdfT3V0T2ZNZW1vcnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfUnVudGltZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU2VjdXJpdHlNYW5hZ2VyXG5UZXN0X2phdmFfbGFuZ19TaG9ydFxuVGVzdF9qYXZhX2xhbmdfU3RhY2tPdmVyZmxvd0Vycm9yXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdcblRlc3RfamF2YV9sYW5nX1N0cmluZ0J1ZmZlclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfU3lzdGVtXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRcblRlc3RfamF2YV9sYW5nX1RocmVhZERlYXRoXG5UZXN0X2phdmFfbGFuZ19UaHJlYWRHcm91cFxuVGVzdF9qYXZhX2xhbmdfVGhyb3dhYmxlXG5UZXN0X2phdmFfbGFuZ19Vbmtub3duRXJyb3JcblRlc3RfamF2YV9sYW5nX1Vuc2F0aXNmaWVkTGlua0Vycm9yXG5UZXN0X2phdmFfbGFuZ19WZXJpZnlFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmlydHVhbE1hY2hpbmVFcnJvclxuVGVzdF9qYXZhX2xhbmdfdm1fSW1hZ2VcblRlc3RfamF2YV9sYW5nX3ZtX01lbW9yeVNlZ21lbnRcblRlc3RfamF2YV9sYW5nX3ZtX1JPTVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ192bV9WTVxuVGVzdF9qYXZhX2xhbmdfVm9pZFxuVGVzdF9qYXZhX25ldF9CaW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0Nvbm5lY3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfRGF0YWdyYW1QYWNrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRcblRlc3RfamF2YV9uZXRfRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X0luZXRBZGRyZXNzXG5UZXN0X2phdmFfbmV0X05vUm91dGVUb0hvc3RFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfUGxhaW5EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfUGxhaW5Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Tb2NrZXRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfVW5rbm93bkhvc3RFeGNlcHRpb25cblRlc3RfamF2YV91dGlsX0FycmF5RW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfRGF0ZVxuVGVzdF9qYXZhX3V0aWxfRXZlbnRPYmplY3RcblRlc3RfamF2YV91dGlsX0hhc2hFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9IYXNodGFibGVcblRlc3RfamF2YV91dGlsX1Byb3BlcnRpZXNcblRlc3RfamF2YV91dGlsX1Jlc291cmNlQnVuZGxlXG5UZXN0X2phdmFfdXRpbF90bVxuVGVzdF9qYXZhX3V0aWxfVmVjdG9yXG4iOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjQnVmZmVyZWRXcml0ZXIoamF2YS5pby5Xcml0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1dyaXRlcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoamF2YS5pby5Xcml0ZXIpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjQnVmZmVyZWRXcml0ZXIoamF2YS5pby5Xcml0ZXIpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlRoZSB0ZXN0IHZlcmlmaWVzIEJ1ZmZlcmVkV3JpdGVyKFdyaXRlciBvdXQpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkJ1ZmZlcmVkV3JpdGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uV3JpdGVyLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1dyaXRlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoamF2YS5pby5Xcml0ZXIpCiAKLQkJc3cgPSBuZXcgU3VwcG9ydF9TdHJpbmdXcml0ZXIoKTsKLQkJYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIoc3cpOwotCQlzdy53cml0ZSgiSGkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJDb25zdHJ1Y3RvciBmYWlsZWQiLCAiSGkiLCBzdy50b1N0cmluZygpKTsKKyAgICAgICAgc3cgPSBuZXcgU3VwcG9ydF9TdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIoc3cpOworICAgICAgICBzdy53cml0ZSgiSGkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb25zdHJ1Y3RvciBmYWlsZWQiLCAiSGkiLCBzdy50b1N0cmluZygpKTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFdyaXRlciNCdWZmZXJlZFdyaXRlcihqYXZhLmlvLldyaXRlciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19Xcml0ZXJJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CdWZmZXJlZFdyaXRlcihqYXZhLmlvLldyaXRlciwgaW50KQotCQlhc3NlcnRUcnVlKCJVc2VkIGluIHRlc3RzIiwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyI0J1ZmZlcmVkV3JpdGVyKGphdmEuaW8uV3JpdGVyLCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gU2VlIHNldFVwIGZvciBpbmZvLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkJ1ZmZlcmVkV3JpdGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uV3JpdGVyLmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19Xcml0ZXJJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CdWZmZXJlZFdyaXRlcihqYXZhLmlvLldyaXRlciwgaW50KQorICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIGluIHRlc3RzIiwgdHJ1ZSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIuY2xvc2UoKQotCQl0cnkgewotCQkJYncuY2xvc2UoKTsKLQkJCWJ3LndyaXRlKHRlc3RTdHJpbmcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JpdGUgYWZ0ZXIgY2xvc2UiLCAhc3cudG9TdHJpbmcoKS5lcXVhbHModGVzdFN0cmluZykpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFdyaXRlciNjbG9zZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZFdyaXRlci5jbG9zZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy5jbG9zZSgpOworICAgICAgICAgICAgYncud3JpdGUodGVzdFN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJXcml0ZSBhZnRlciBjbG9zZSIsICFzdy50b1N0cmluZygpLmVxdWFscyh0ZXN0U3RyaW5nKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIuZmx1c2goKQotCQl0cnkgewotCQkJYncud3JpdGUoIlRoaXMgc2hvdWxkIG5vdCBjYXVzZSBhIGZsdXNoIik7Ci0JCQlhc3NlcnRUcnVlKCJCeXRlcyB3cml0dGVuIHdpdGhvdXQgZmx1c2giLCBzdy50b1N0cmluZygpLmVxdWFscygiIikpOwotCQkJYncuZmx1c2goKTsKLQkJCWFzc2VydEVxdWFscygiQnl0ZXMgbm90IGZsdXNoZWQiLCAKLQkJCQkJIlRoaXMgc2hvdWxkIG5vdCBjYXVzZSBhIGZsdXNoIiwgc3cudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGZsdXNoIHRlc3QiKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFdyaXRlciNmbHVzaCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImZsdXNoIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIuZmx1c2goKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncud3JpdGUoIlRoaXMgc2hvdWxkIG5vdCBjYXVzZSBhIGZsdXNoIik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJCeXRlcyB3cml0dGVuIHdpdGhvdXQgZmx1c2giLCBzdy50b1N0cmluZygpLmVxdWFscygiIikpOworICAgICAgICAgICAgYncuZmx1c2goKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQnl0ZXMgbm90IGZsdXNoZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgc2hvdWxkIG5vdCBjYXVzZSBhIGZsdXNoIiwgc3cudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGZsdXNoIHRlc3QiKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyI25ld0xpbmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbmV3TGluZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZFdyaXRlci5uZXdMaW5lKCkKLQkJdHJ5IHsKLQkJCVN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JCQlidy53cml0ZSgiSGVsbG8iKTsKLQkJCWJ3Lm5ld0xpbmUoKTsKLQkJCWJ3LndyaXRlKCJXb3JsZCIpOwotCQkJYncuZmx1c2goKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBzdHJpbmcgd3JpdHRlbjogIiArIHN3LnRvU3RyaW5nKCksIHN3Ci0JCQkJCS50b1N0cmluZygpLmVxdWFscygiSGVsbG8iICsgc2VwYXJhdG9yICsgIldvcmxkIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0Iik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjbmV3TGluZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibmV3TGluZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X25ld0xpbmUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIubmV3TGluZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICAgICAgYncud3JpdGUoIkhlbGxvIik7CisgICAgICAgICAgICBidy5uZXdMaW5lKCk7CisgICAgICAgICAgICBidy53cml0ZSgiV29ybGQiKTsKKyAgICAgICAgICAgIGJ3LmZsdXNoKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW46ICIgKyBzdy50b1N0cmluZygpLCBzdworICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKS5lcXVhbHMoIkhlbGxvIiArIHNlcGFyYXRvciArICJXb3JsZCIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCIpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZFdyaXRlci53cml0ZShjaGFyIFtdLCBpbnQsIGludCkKLQkJdHJ5IHsKLQkJCWNoYXJbXSB0ZXN0Q2hhckFycmF5ID0gdGVzdFN0cmluZy50b0NoYXJBcnJheSgpOwotCQkJYncud3JpdGUodGVzdENoYXJBcnJheSwgNTAwLCAxMDAwKTsKLQkJCWJ3LmZsdXNoKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4iLCBzdy50b1N0cmluZygpLmVxdWFscygKLQkJCQkJdGVzdFN0cmluZy5zdWJzdHJpbmcoNTAwLCAxNTAwKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0Iik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlXyRDSUlfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRXcml0ZXIgYldyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihzdyk7Ci0JCWNoYXJbXSBudWxsQ2hhckFycmF5ID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CdWZmZXJlZFdyaXRlciN3cml0ZShjaGFyW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQ0lJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyLndyaXRlKGNoYXIgW10sIGludCwgaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhcltdIHRlc3RDaGFyQXJyYXkgPSB0ZXN0U3RyaW5nLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICBidy53cml0ZSh0ZXN0Q2hhckFycmF5LCA1MDAsIDEwMDApOworICAgICAgICAgICAgYncuZmx1c2goKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBzdHJpbmcgd3JpdHRlbiIsIHN3LnRvU3RyaW5nKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICB0ZXN0U3RyaW5nLnN1YnN0cmluZyg1MDAsIDE1MDApKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBpZHggPSBzdy50b1N0cmluZygpLmxlbmd0aCgpOworICAgICAgICAgICAgYncud3JpdGUodGVzdENoYXJBcnJheSwgMCwgdGVzdENoYXJBcnJheS5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkeCArIHRlc3RDaGFyQXJyYXkubGVuZ3RoLCBzdy50b1N0cmluZygpLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGJ3LndyaXRlKHRlc3RDaGFyQXJyYXksIDAsIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkeCArIHRlc3RDaGFyQXJyYXkubGVuZ3RoLCBzdy50b1N0cmluZygpLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGJ3LndyaXRlKHRlc3RDaGFyQXJyYXksIHRlc3RDaGFyQXJyYXkubGVuZ3RoLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpZHggKyB0ZXN0Q2hhckFycmF5Lmxlbmd0aCwgc3cudG9TdHJpbmcoKS5sZW5ndGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QiKTsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQliV3JpdGVyLndyaXRlKG51bGxDaGFyQXJyYXksIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGF0IHdyaXRlKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCB0aHJvd3MgZXhjZXB0aW9ucyBpbiBhcHByb3ByaWF0ZSBjYXNlcy4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlXyRDSUlfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcltdIG51bGxDaGFyQXJyYXkgPSBudWxsOworICAgICAgICBjaGFyW10gY2hhckFycmF5ID0gdGVzdFN0cmluZy50b0NoYXJBcnJheSgpOwogCi0JCXRyeSB7Ci0JCQliV3JpdGVyLndyaXRlKG51bGxDaGFyQXJyYXksIC0xLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncud3JpdGUobnVsbENoYXJBcnJheSwgMCwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQliV3JpdGVyLndyaXRlKG51bGxDaGFyQXJyYXksIDAsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy53cml0ZShjaGFyQXJyYXksIC0xLCAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQliV3JpdGVyLndyaXRlKG51bGxDaGFyQXJyYXksIDAsIDApOwotCQkJZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQotCQljaGFyW10gdGVzdENoYXJBcnJheSA9IHRlc3RTdHJpbmcudG9DaGFyQXJyYXkoKTsKLQotCQliV3JpdGVyLndyaXRlKHRlc3RDaGFyQXJyYXksIDAsIDApOwotCi0JCWJXcml0ZXIud3JpdGUodGVzdENoYXJBcnJheSwgdGVzdENoYXJBcnJheS5sZW5ndGgsIDApOwotCQkKLQkJdHJ5IHsKLQkJCWJXcml0ZXIud3JpdGUodGVzdENoYXJBcnJheSwgdGVzdENoYXJBcnJheS5sZW5ndGggKyAxLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0KLQkJYldyaXRlci5jbG9zZSgpOwotCi0JCXRyeSB7Ci0JCQliV3JpdGVyLndyaXRlKG51bGxDaGFyQXJyYXksIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyI3dyaXRlKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CdWZmZXJlZFdyaXRlci53cml0ZShpbnQpCi0JCXRyeSB7Ci0JCQlidy53cml0ZSgnVCcpOwotCQkJYXNzZXJ0VHJ1ZSgiQ2hhciB3cml0dGVuIHdpdGhvdXQgZmx1c2giLCBzdy50b1N0cmluZygpLmVxdWFscygiIikpOwotCQkJYncuZmx1c2goKTsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNoYXIgd3JpdHRlbiIsICJUIiwgc3cudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyLndyaXRlKGphdmEubGFuZy5TdHJpbmcsCi0JCS8vIGludCwgaW50KQotCQl0cnkgewotCQkJYncud3JpdGUodGVzdFN0cmluZyk7Ci0JCQlidy5mbHVzaCgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN0cmluZyB3cml0dGVuIiwgc3cudG9TdHJpbmcoKS5lcXVhbHMoCi0JCQkJCXRlc3RTdHJpbmcpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfTFN0cmluZ0lJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkV3JpdGVyIGJXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIoc3cpOwotCi0JCWJXcml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAtMSk7CQkKLQkJYldyaXRlci53cml0ZSgoU3RyaW5nKSBudWxsICwgLTEsIDApOwotICAgICAgICBiV3JpdGVyLndyaXRlKChTdHJpbmcpIG51bGwgLCAwICwgLTEpOwotICAgICAgICBiV3JpdGVyLndyaXRlKChTdHJpbmcpIG51bGwgLCAwICwgMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy53cml0ZShjaGFyQXJyYXksIDAsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQogICAgICAgICAKLQkJdHJ5IHsKLQkJCWJXcml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy53cml0ZShjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggKyAxLCAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncud3JpdGUoY2hhckFycmF5LCBjaGFyQXJyYXkubGVuZ3RoLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncud3JpdGUoY2hhckFycmF5LCAwLCBjaGFyQXJyYXkubGVuZ3RoICsgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ3LndyaXRlKGNoYXJBcnJheSwgMSwgY2hhckFycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYncuY2xvc2UoKTsKIAotCQliV3JpdGVyLndyaXRlKHRlc3RTdHJpbmcsIDAsIDApOwotCQliV3JpdGVyLndyaXRlKHRlc3RTdHJpbmcsIHRlc3RTdHJpbmcubGVuZ3RoKCksIDApOwkJCi0JCWJXcml0ZXIud3JpdGUodGVzdFN0cmluZywgdGVzdFN0cmluZy5sZW5ndGgoKSArIDEsIDApOwotCQkKLQkJdHJ5IHsKLQkJCWJXcml0ZXIud3JpdGUodGVzdFN0cmluZywgdGVzdFN0cmluZy5sZW5ndGgoKSArIDEsIDEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy53cml0ZShudWxsQ2hhckFycmF5LCAtMSwgLTEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CiAKLQkJYldyaXRlci5jbG9zZSgpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyI3dyaXRlKGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIud3JpdGUoaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncud3JpdGUoJ1QnKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNoYXIgd3JpdHRlbiB3aXRob3V0IGZsdXNoIiwgc3cudG9TdHJpbmcoKS5lcXVhbHMoIiIpKTsKKyAgICAgICAgICAgIGJ3LmZsdXNoKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjaGFyIHdyaXR0ZW4iLCAiVCIsIHN3LnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0Iik7CisgICAgICAgIH0KKyAgICB9CiAKLQkJdHJ5IHsKLQkJCWJXcml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWJXcml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJYldyaXRlci53cml0ZSh0ZXN0U3RyaW5nICwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUxqYXZhX2xhbmdfU3RyaW5nSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIud3JpdGUoamF2YS5sYW5nLlN0cmluZywKKyAgICAgICAgLy8gaW50LCBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy53cml0ZSh0ZXN0U3RyaW5nKTsKKyAgICAgICAgICAgIGJ3LmZsdXNoKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4iLCBzdy50b1N0cmluZygpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgdGVzdFN0cmluZykpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoYXQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pICIgKworICAgICAgICAgICAgICAgICAgICAibWV0aG9kIHRocm93cyBleGNlcHRpb25zIGluIGFwcHJvcHJpYXRlIGNhc2VzLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlX0xTdHJpbmdJSV9FeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCXN3ID0gbmV3IFN1cHBvcnRfU3RyaW5nV3JpdGVyKCk7Ci0JCWJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKHN3LCA1MDApOwotCX0KKyAgICAgICAgYncud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAtMSk7ICAgICAgICAKKyAgICAgICAgYncud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAwKTsKKyAgICAgICAgYncud3JpdGUoKFN0cmluZykgbnVsbCAsIDAgLCAtMSk7CisgICAgICAgIGJ3LndyaXRlKChTdHJpbmcpIG51bGwgLCAwICwgMCk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgYncud3JpdGUodGVzdFN0cmluZywgMCwgMCk7CisgICAgICAgIGJ3LndyaXRlKHRlc3RTdHJpbmcsIHRlc3RTdHJpbmcubGVuZ3RoKCksIDApOyAgICAgICAgCisgICAgICAgIGJ3LndyaXRlKHRlc3RTdHJpbmcsIHRlc3RTdHJpbmcubGVuZ3RoKCkgKyAxLCAwKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy53cml0ZSh0ZXN0U3RyaW5nLCB0ZXN0U3RyaW5nLmxlbmd0aCgpICsgMSwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJYncuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgYncuY2xvc2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYncud3JpdGUoKFN0cmluZykgbnVsbCAsIC0xLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ3LndyaXRlKChTdHJpbmcpIG51bGwgLCAtMSwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ3LndyaXRlKHRlc3RTdHJpbmcgLCAtMSwgLTEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc3cgPSBuZXcgU3VwcG9ydF9TdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIoc3csIDUwMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ3LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW1UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggYjEwOGY1YS4uNWNhMDlkMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9CeXRlQXJyYXlJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTcsMjI5ICsxNywzMDUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQnl0ZUFycmF5SW5wdXRTdHJlYW0uY2xhc3MpIAogcHVibGljIGNsYXNzIEJ5dGVBcnJheUlucHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlwcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaXM7CisgICAgcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGlzOwogCi0JcHVibGljIFN0cmluZyBmaWxlU3RyaW5nID0gIlRlc3RfQWxsX1Rlc3RzXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkT3V0cHV0U3RyZWFtXG5UZXN0X0J5dGVBcnJheUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRGF0YUlucHV0U3RyZWFtXG4iOworICAgIHB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CdWZmZXJlZE91dHB1dFN0cmVhbVxuVGVzdF9CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuIjsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI0J5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEIoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGUgW10pCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZVtdKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlW10gYnVmKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJCeXRlQXJyYXlJbnB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZSBbXSkKIAotCQlqYXZhLmlvLklucHV0U3RyZWFtIGJpcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGZpbGVTdHJpbmcKLQkJCQkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gYmlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oZmlsZVN0cmluZworICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKIAotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGNyZWF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSIsCi0JCQkJCWJpcy5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0Iik7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gY3JlYXRlIEJ5dGVBcnJheUlucHV0U3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgYmlzLmF2YWlsYWJsZSgpID09IGZpbGVTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3QiKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0JICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZVtdLCBpbnQsCi0JICogICAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGUgW10sIGludCwgaW50KQorICAgIC8qKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCisgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZVtdLCBpbnQsCisgICAgICogICAgICAgIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiQnl0ZUFycmF5SW5wdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZSBbXSwgaW50LCBpbnQpCiAKLQkJYnl0ZVtdIHp6ID0gZmlsZVN0cmluZy5nZXRCeXRlcygpOwotCQlqYXZhLmlvLklucHV0U3RyZWFtIGJpcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKHp6LCAwLCAxMDApOworICAgICAgICBieXRlW10genogPSBmaWxlU3RyaW5nLmdldEJ5dGVzKCk7CisgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gYmlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oenosIDAsIDEwMCk7CiAKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiVW5hYmxlIHRvIGNyZWF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSIsCi0JCQkJCTEwMCwgYmlzLmF2YWlsYWJsZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdCIpOwotCQl9Ci0JCQotCQkvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMjQwNQotCQluZXcgU3ViQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDEsIDIgfSwgNDQ0LCAxMyk7Ci0JCWFzc2VydEVxdWFscyg0NDQsIFN1YkJ5dGVBcnJheUlucHV0U3RyZWFtLnBvcyk7Ci0JCWFzc2VydEVxdWFscyg0NDQsIFN1YkJ5dGVBcnJheUlucHV0U3RyZWFtLm1hcmspOwotCQlhc3NlcnRFcXVhbHMoMiwgU3ViQnl0ZUFycmF5SW5wdXRTdHJlYW0uY291bnQpOwotCX0KLQkKLQlzdGF0aWMgY2xhc3MgU3ViQnl0ZUFycmF5SW5wdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlJbnB1dFN0cmVhbSB7Ci0JCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGJ1ZjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5hYmxlIHRvIGNyZWF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgIDEwMCwgYmlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdCIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMjQwNQorICAgICAgICBuZXcgU3ViQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDEsIDIgfSwgNDQ0LCAxMyk7CisgICAgICAgIGFzc2VydEVxdWFscyg0NDQsIFN1YkJ5dGVBcnJheUlucHV0U3RyZWFtLnBvcyk7CisgICAgICAgIGFzc2VydEVxdWFscyg0NDQsIFN1YkJ5dGVBcnJheUlucHV0U3RyZWFtLm1hcmspOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgU3ViQnl0ZUFycmF5SW5wdXRTdHJlYW0uY291bnQpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgU3ViQnl0ZUFycmF5SW5wdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlJbnB1dFN0cmVhbSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGJ1ZjsKIAotCQlwdWJsaWMgc3RhdGljIGludCBtYXJrLCBwb3MsIGNvdW50OworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBtYXJrLCBwb3MsIGNvdW50OwogCi0JCVN1YkJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyKGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJYnVmID0gc3VwZXIuYnVmOwotCQkJbWFyayA9IHN1cGVyLm1hcms7Ci0JCQlwb3MgPSBzdXBlci5wb3M7Ci0JCQljb3VudCA9IHN1cGVyLmNvdW50OwotCQl9Ci0JfQorICAgICAgICBTdWJCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihidWYsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1ZiA9IHN1cGVyLmJ1ZjsKKyAgICAgICAgICAgIG1hcmsgPSBzdXBlci5tYXJrOworICAgICAgICAgICAgcG9zID0gc3VwZXIucG9zOworICAgICAgICAgICAgY291bnQgPSBzdXBlci5jb3VudDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI2F2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9hdmFpbGFibGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbS5hdmFpbGFibGUoKQotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMiLCBpcwotCQkJCQkuYXZhaWxhYmxlKCkgPT0gZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGF2YWlsYWJsZSB0ZXN0Iik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXZhaWxhYmxlKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImF2YWlsYWJsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLmF2YWlsYWJsZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGF2YWlsYWJsZSBieXRlcyIsIGlzCisgICAgICAgICAgICAgICAgICAgIC5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgYXZhaWxhYmxlIHRlc3QiKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLmNsb3NlKCkKLQkJdHJ5IHsKLQkJCWlzLnJlYWQoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgcmVhZGluZyBmcm9tIGlucHV0IHN0cmVhbSIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCBjbG9zaW5nIGlucHV0IHN0cmVhbSIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpcy5yZWFkKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJTaG91bGQgYmUgYWJsZSB0byByZWFkIGZyb20gY2xvc2VkIHN0cmVhbSIpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY2xvc2UiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0uY2xvc2UoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMucmVhZCgpOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCByZWFkaW5nIGZyb20gaW5wdXQgc3RyZWFtIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIGNsb3NpbmcgaW5wdXQgc3RyZWFtIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLnJlYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBiZSBhYmxlIHRvIHJlYWQgZnJvbSBjbG9zZWQgc3RyZWFtIik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLm1hcmsoaW50KQotCQlieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwMF07Ci0JCWJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbMTAwXTsKLQkJdHJ5IHsKLQkJCWlzLnNraXAoMzAwMCk7Ci0JCQlpcy5tYXJrKDEwMDApOwotCQkJaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7Ci0JCQlpcy5yZXNldCgpOwotCQkJaXMucmVhZChidWYyLCAwLCBidWYyLmxlbmd0aCk7Ci0JCQlpcy5yZXNldCgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIG1hcmsgY29ycmVjdCBwb3NpdGlvbiIsIG5ldyBTdHJpbmcoYnVmMSwgMCwKLQkJCQkJYnVmMS5sZW5ndGgpLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZjIsIDAsIGJ1ZjIubGVuZ3RoKSkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI21hcmsoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hcmsiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLm1hcmsoaW50KQorICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwMF07CisgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLnNraXAoMzAwMCk7CisgICAgICAgICAgICBpcy5tYXJrKDEwMDApOworICAgICAgICAgICAgaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7CisgICAgICAgICAgICBpcy5yZXNldCgpOworICAgICAgICAgICAgaXMucmVhZChidWYyLCAwLCBidWYyLmxlbmd0aCk7CisgICAgICAgICAgICBpcy5yZXNldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIG1hcmsgY29ycmVjdCBwb3NpdGlvbiIsIG5ldyBTdHJpbmcoYnVmMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgYnVmMS5sZW5ndGgpLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZjIsIDAsIGJ1ZjIubGVuZ3RoKSkpOwogCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCIpOwotCQl9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCIpOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jbWFya1N1cHBvcnRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9tYXJrU3VwcG9ydGVkKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKQotCQlhc3NlcnRUcnVlKCJtYXJrU3VwcG9ydGVkIHJldHVybmVkIGluY29ycmVjdCB2YWx1ZSIsIGlzLm1hcmtTdXBwb3J0ZWQoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtYXJrU3VwcG9ydGVkKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hcmtTdXBwb3J0ZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpCisgICAgICAgIGFzc2VydFRydWUoIm1hcmtTdXBwb3J0ZWQgcmV0dXJuZWQgaW5jb3JyZWN0IHZhbHVlIiwgaXMubWFya1N1cHBvcnRlZCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbS5yZWFkKCkKLQkJdHJ5IHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcmVhZCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLnJlYWQoKQorICAgICAgICB0cnkgewogCi0JCQlpbnQgYyA9IGlzLnJlYWQoKTsKLQkJCWlzLnJlc2V0KCk7Ci0JCQlhc3NlcnRUcnVlKCJyZWFkIHJldHVybmVkIGluY29ycmVjdCBjaGFyIiwgYyA9PSBmaWxlU3RyaW5nCi0JCQkJCS5jaGFyQXQoMCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QiKTsKLQkJfQotCX0KKyAgICAgICAgICAgIGludCBjID0gaXMucmVhZCgpOworICAgICAgICAgICAgaXMucmVzZXQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXIiLCBjID09IGZpbGVTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLmNoYXJBdCgwKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCIpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sIGludCwKLQkJLy8gaW50KQotCQlieXRlW10gYnVmMSA9IG5ldyBieXRlWzIwXTsKLQkJdHJ5IHsKLQkJCWlzLnNraXAoNTApOwotCQkJaXMubWFyaygxMDApOwotCQkJaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGRhdGEiLCBuZXcgU3RyaW5nKGJ1ZjEsIDAsCi0JCQkJCWJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoNTAsIDcwKSkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQklJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0ucmVhZChieXRlIFtdLCBpbnQsCisgICAgICAgIC8vIGludCkKKyAgICAgICAgYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsyMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcy5za2lwKDUwKTsKKyAgICAgICAgICAgIGlzLm1hcmsoMTAwKTsKKyAgICAgICAgICAgIGlzLnJlYWQoYnVmMSwgMCwgYnVmMS5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBkYXRhIiwgbmV3IFN0cmluZyhidWYxLCAwLAorICAgICAgICAgICAgICAgICAgICBidWYxLmxlbmd0aCkuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDUwLCA3MCkpKTsKIAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3Q6ICIgKyBlKTsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0OiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbS5yZXNldCgpCi0JCWJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTBdOwotCQlieXRlW10gYnVmMiA9IG5ldyBieXRlWzEwXTsKLQkJdHJ5IHsKLQkJCWlzLm1hcmsoMjAwKTsKLQkJCWlzLnJlYWQoYnVmMSwgMCwgMTApOwotCQkJaXMucmVzZXQoKTsKLQkJCWlzLnJlYWQoYnVmMiwgMCwgMTApOwotCQkJaXMucmVzZXQoKTsKLQkJCWFzc2VydFRydWUoIlJlc2V0IGZhaWxlZCIsIG5ldyBTdHJpbmcoYnVmMSwgMCwgYnVmMS5sZW5ndGgpCi0JCQkJCS5lcXVhbHMobmV3IFN0cmluZyhidWYyLCAwLCBidWYyLmxlbmd0aCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVzZXQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jcmVzZXQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCB2ZXJpZmllcyByZXNldCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXNldCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLnJlc2V0KCkKKyAgICAgICAgYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbMTBdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMubWFyaygyMDApOworICAgICAgICAgICAgaXMucmVhZChidWYxLCAwLCAxMCk7CisgICAgICAgICAgICBpcy5yZXNldCgpOworICAgICAgICAgICAgaXMucmVhZChidWYyLCAwLCAxMCk7CisgICAgICAgICAgICBpcy5yZXNldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzZXQgZmFpbGVkIiwgbmV3IFN0cmluZyhidWYxLCAwLCBidWYxLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZjIsIDAsIGJ1ZjIubGVuZ3RoKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZXNldCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtLnNraXAobG9uZykKLQkJYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsxMF07Ci0JCXRyeSB7Ci0JCQlpcy5za2lwKDEwMCk7Ci0JCQlpcy5yZWFkKGJ1ZjEsIDAsIGJ1ZjEubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBza2lwIHRvIGNvcnJlY3QgcG9zaXRpb24iLCBuZXcgU3RyaW5nKGJ1ZjEsCi0JCQkJCTAsIGJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMTAwLCAxMTApKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNraXAgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0jc2tpcChsb25nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJza2lwIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcEooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0uc2tpcChsb25nKQorICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLnNraXAoMTAwKTsKKyAgICAgICAgICAgIGlzLnJlYWQoYnVmMSwgMCwgYnVmMS5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNraXAgdG8gY29ycmVjdCBwb3NpdGlvbiIsIG5ldyBTdHJpbmcoYnVmMSwKKyAgICAgICAgICAgICAgICAgICAgMCwgYnVmMS5sZW5ndGgpLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygxMDAsIDExMCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2tpcCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewogCi0JCWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewogCi0JCXRyeSB7Ci0JCQlpcy5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMuY2xvc2UoKTsKIAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggZTgxMThiYS4uYjliYTA0ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwpAQCAtMjgsMTExICszMywxNjAgQEAKICAqIAogICogQHNlZSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbQogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CiAKLQlwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9CeXRlQXJyYXlPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19EYXRhSW5wdXRTdHJlYW1cbiI7CisgICAgcHVibGljIFN0cmluZyBmaWxlU3RyaW5nID0gIlRlc3RfQWxsX1Rlc3RzXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5SW5wdXRTdHJlYW1cblRlc3RfQnl0ZUFycmF5T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRGF0YUlucHV0U3RyZWFtXG4iOwogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWJvcy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7Ci0JCX0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCkKLQkJYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMCk7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW0iLCAwLCBib3Muc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQotCQlib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gY3JlYXRlIHN0cmVhbSIsIDAsIGJvcy5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0uY2xvc2UoKQotCi0JCWFzc2VydFRydWUoCi0JCQkJImNsb3NlKCkgZG9lcyBub3RoaW5nIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIG9mIE91dHB1dFN0ZWFtIiwKLQkJCQl0cnVlKTsKLQotCQkvLyBUaGUgc3BlYyBzZWVtcyB0byBzYXkgdGhhdCBhIGNsb3NlZCBvdXRwdXQgc3RyZWFtIGNhbid0IGJlIHdyaXR0ZW4KLQkJLy8gdG8uIFdlIGRvbid0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhdHRlbXB0IGlzIG1hZGUgdG8gd3JpdGUuCi0JCS8vIFJpZ2h0IG5vdyBvdXIgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBhbnl0aGluZyB0ZXN0YWJsZSBidXQKLQkJLy8gc2hvdWxkIHdlIGRlY2lkZSB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgYSBjbG9zZWQgc3RyZWFtIGlzCi0JCS8vIHdyaXR0ZW4gdG8sIHRoZSBhcHByb3ByaWF0ZSB0ZXN0IGlzIGNvbW1lbnRlZCBvdXQgYmVsb3cuCi0KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCSAqIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldwotCQkgKiBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOyBib3Mud3JpdGUgKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwKLQkJICogMTAwKTsgdHJ5IHsgYm9zLmNsb3NlKCk7IH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkgKiBmYWlsKCJJT0V4Y2VwdGlvbiBjbG9zaW5nIHN0cmVhbSIpOyB9IHRyeSB7IGJvcy53cml0ZQotCQkgKiAoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxMDApOyBib3MudG9CeXRlQXJyYXkoKTsgZmFpbCgiV3JvdGUKLQkJICogdG8gY2xvc2VkIHN0cmVhbSIpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyB9Ci0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0KLQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0ucmVzZXQoKQotCQlib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgMTAwKTsKLQkJYm9zLnJlc2V0KCk7Ci0JCWFzc2VydEVxdWFscygicmVzZXQgZmFpbGVkIiwgMCwgYm9zLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3NpemUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS5zaXplKCkKLQkJYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWJvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIDEwMCk7Ci0JCWFzc2VydEVxdWFscygic2l6ZSB0ZXN0IGZhaWxlZCIsIDEwMCwgYm9zLnNpemUoKSk7Ci0JCWJvcy5yZXNldCgpOwotCQlhc3NlcnRFcXVhbHMoInNpemUgdGVzdCBmYWlsZWQiLCAwLCBib3Muc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jdG9CeXRlQXJyYXkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdG9CeXRlQXJyYXkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBieXRlIFtdIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkKLQkJYnl0ZVtdIGJ5dGVzOwotCQlieXRlW10gc2J5dGVzID0gZmlsZVN0cmluZy5nZXRCeXRlcygpOwotCQlib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCWJ5dGVzID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZVN0cmluZy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKCJFcnJvciBpbiBieXRlIGFycmF5IiwgYnl0ZXNbaV0gPT0gc2J5dGVzW2ldKTsKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKICAgICAgICAgfQotCX0KKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jdG9TdHJpbmcoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkJ5dGVBcnJheU91dHB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oaW50KQorICAgICAgICBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gY3JlYXRlIHN0cmVhbSIsIDAsIGJvcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSNCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJCeXRlQXJyYXlPdXRwdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKyAgICAgICAgYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW0iLCAwLCBib3Muc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jY2xvc2UoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgc2VlIHRlYXJEb3duIGZvciBpbmZvLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmNsb3NlKCkKKworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJjbG9zZSgpIGRvZXMgbm90aGluZyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPdXRwdXRTdGVhbSIsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisKKyAgICAgICAgLy8gVGhlIHNwZWMgc2VlbXMgdG8gc2F5IHRoYXQgYSBjbG9zZWQgb3V0cHV0IHN0cmVhbSBjYW4ndCBiZSB3cml0dGVuCisgICAgICAgIC8vIHRvLiBXZSBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYXR0ZW1wdCBpcyBtYWRlIHRvIHdyaXRlLgorICAgICAgICAvLyBSaWdodCBub3cgb3VyIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcgdGVzdGFibGUgYnV0CisgICAgICAgIC8vIHNob3VsZCB3ZSBkZWNpZGUgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY2xvc2VkIHN0cmVhbSBpcworICAgICAgICAvLyB3cml0dGVuIHRvLCB0aGUgYXBwcm9wcmlhdGUgdGVzdCBpcyBjb21tZW50ZWQgb3V0IGJlbG93LgorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcKKyAgICAgICAgICogamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsgYm9zLndyaXRlIChmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsCisgICAgICAgICAqIDEwMCk7IHRyeSB7IGJvcy5jbG9zZSgpOyB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICogZmFpbCgiSU9FeGNlcHRpb24gY2xvc2luZyBzdHJlYW0iKTsgfSB0cnkgeyBib3Mud3JpdGUKKyAgICAgICAgICogKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgMTAwKTsgYm9zLnRvQnl0ZUFycmF5KCk7IGZhaWwoIldyb3RlCisgICAgICAgICAqIHRvIGNsb3NlZCBzdHJlYW0iKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jcmVzZXQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyByZXNldCgpIG1ldGhpZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXNldCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS5yZXNldCgpCisgICAgICAgIGJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxMDApOworICAgICAgICBib3MucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXNldCBmYWlsZWQiLCAwLCBib3Muc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jc2l6ZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNpemUoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2l6ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpemUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0uc2l6ZSgpCisgICAgICAgIGJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUgdGVzdCBmYWlsZWQiLCAxMDAsIGJvcy5zaXplKCkpOworICAgICAgICBib3MucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIHRlc3QgZmFpbGVkIiwgMCwgYm9zLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3RvQnl0ZUFycmF5KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdG9CeXRlQXJyYXkoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9CeXRlQXJyYXkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF90b0J5dGVBcnJheSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJ5dGUgW10gamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKQorICAgICAgICBieXRlW10gYnl0ZXM7CisgICAgICAgIGJ5dGVbXSBzYnl0ZXMgPSBmaWxlU3RyaW5nLmdldEJ5dGVzKCk7CisgICAgICAgIGJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgYnl0ZXMgPSBib3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkVycm9yIGluIGJ5dGUgYXJyYXkiLCBieXRlc1tpXSA9PSBzYnl0ZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3RvU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7IGphdmEubGFuZy5TdHJpbmcuY2xhc3MgfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvczsKQEAgLTE0OCw2MSArMjAyLDk3IEBACiAgICAgICAgICAgICAgICAgLmVxdWFscyhmaWxlU3RyaW5nKSk7CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwotCQkvLyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS50b1N0cmluZygpCi0JCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7Ci0JCWJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IFN0cmluZyIsIGJvcy50b1N0cmluZygpLmVxdWFscygKLQkJCQlmaWxlU3RyaW5nKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN0b1N0cmluZygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRvU3RyaW5nKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInRvU3RyaW5nIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCisgICAgICAgIC8vIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvU3RyaW5nKCkKKyAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKKyAgICAgICAgYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGJvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIGZpbGVTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgU3RyaW5nIiwgYm9zLnRvU3RyaW5nKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIGZpbGVTdHJpbmcpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jdG9TdHJpbmcoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmdJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwotCQkvLyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS50b1N0cmluZyhpbnQpCi0JCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7Ci0JCWJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IFN0cmluZyIsCi0JCQkJYm9zLnRvU3RyaW5nKDUpLmxlbmd0aCgpID09IGZpbGVTdHJpbmcubGVuZ3RoKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jdG9TdHJpbmcoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0b1N0cmluZyhpbnQgaGlieXRlKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7IGludC5jbGFzcyB9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmdJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZworICAgICAgICAvLyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS50b1N0cmluZyhpbnQpCisgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisgICAgICAgIGJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IFN0cmluZyIsCisgICAgICAgICAgICAgICAgYm9zLnRvU3RyaW5nKDUpLmxlbmd0aCgpID09IGZpbGVTdHJpbmcubGVuZ3RoKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN3cml0ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGludCkKLQkJYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWJvcy53cml0ZSgndCcpOwotCQlieXRlW10gcmVzdWx0ID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IGJ5dGVzIiwKLQkJCQkidCIsIG5ldyBTdHJpbmcocmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sCi0JCS8vIGludCwgaW50KQotCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgMTAwKTsKLQkJYnl0ZVtdIHJlc3VsdCA9IGJvcy50b0J5dGVBcnJheSgpOwotCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZXMiLAotCQkJCW5ldyBTdHJpbmcocmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZwotCQkJCQkJLnN1YnN0cmluZygwLCAxMDApKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN3cml0ZShpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBpbnQuY2xhc3MgfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGludCkKKyAgICAgICAgYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGJvcy53cml0ZSgndCcpOworICAgICAgICBieXRlW10gcmVzdWx0ID0gYm9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAidCIsIG5ldyBTdHJpbmcocmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIG1ldGhvZC4gIiArCisgICAgICAgICAgICAgICAgICAgICJbTmVlZCB2ZXJpZmljYXRpb25zIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMuXSIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzIH0pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQklJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZShieXRlIFtdLAorICAgICAgICAvLyBpbnQsIGludCkKKyAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGJvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIDEwMCk7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBib3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCkuZXF1YWxzKGZpbGVTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMTAwKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gZm9yIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7IGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MgfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUlfMigpIHsKICAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTM4NwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb2JqID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwpAQCAtMjE2LDIxICszMDYsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN3cml0ZVRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVUb0xqYXZhX2lvX091dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZVRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zMiA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxMDApOwotCQlib3Mud3JpdGVUbyhib3MyKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IFN0cmluZyIsIGJvczIudG9TdHJpbmcoKS5lcXVhbHMoCi0JCQkJZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgMTAwKSkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN3cml0ZVRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZVRvIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcyB9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVUb0xqYXZhX2lvX091dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZVRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKQorICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zMiA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBib3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxMDApOworICAgICAgICBib3Mud3JpdGVUbyhib3MyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IFN0cmluZyIsIGJvczIudG9TdHJpbmcoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgMTAwKSkpOwogCiAgICAgICAgIC8vUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTgzNAotCQkvL25vIGV4Y2VwdGlvbiBleHBlY3RlZAotCQluZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkud3JpdGVUbyhuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZURlc2NyaXB0b3IoKSkpOwotCX0KKyAgICAgICAgLy9ubyBleGNlcHRpb24gZXhwZWN0ZWQKKyAgICAgICAgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLndyaXRlVG8obmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGVEZXNjcmlwdG9yKCkpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQ2hhckFycmF5UmVhZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0NoYXJBcnJheVJlYWRlclRlc3QuamF2YQppbmRleCBhNDI2OWRmLi5hNzIxYzM0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQ2hhckFycmF5UmVhZGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9DaGFyQXJyYXlSZWFkZXJUZXN0LmphdmEKQEAgLTE3LDIwMSArMTcsMjc3IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhDaGFyQXJyYXlSZWFkZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIENoYXJBcnJheVJlYWRlclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JY2hhcltdIGh3ID0geyAnSCcsICdlJywgJ2wnLCAnbCcsICdvJywgJ1cnLCAnbycsICdyJywgJ2wnLCAnZCcgfTsKKyAgICBjaGFyW10gaHcgPSB7ICdIJywgJ2UnLCAnbCcsICdsJywgJ28nLCAnVycsICdvJywgJ3InLCAnbCcsICdkJyB9OwogCi0JQ2hhckFycmF5UmVhZGVyIGNyOworICAgIENoYXJBcnJheVJlYWRlciBjcjsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNDaGFyQXJyYXlSZWFkZXIoY2hhcltdKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyKGNoYXIgW10pCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyI0NoYXJBcnJheVJlYWRlcihjaGFyW10pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENoYXJBcnJheVJlYWRlcihjaGFyW10gYnVmKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJDaGFyQXJyYXlSZWFkZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyKGNoYXIgW10pCiAKLQkJdHJ5IHsKLQkJCWNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIHJlYWRlciIsIGNyLnJlYWR5KCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZGV0ZXJtaW5pbmcgcmVhZHkgc3RhdGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3IgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGh3KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgcmVhZGVyIiwgY3IucmVhZHkoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkZXRlcm1pbmluZyByZWFkeSBzdGF0ZSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIjQ2hhckFycmF5UmVhZGVyKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRDSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcihjaGFyIFtdLCBpbnQsIGludCkKLQkJdHJ5IHsKLQkJCWNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodywgNSwgNSk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIHJlYWRlciIsIGNyLnJlYWR5KCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZGV0ZXJtaW5pbmcgcmVhZHkgc3RhdGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnQgYyA9IGNyLnJlYWQoKTsKLQkJCWFzc2VydFRydWUoIkNyZWF0ZWQgaW5jb3JyZWN0IHJlYWRlci0tcmV0dXJuZWQgJyIgKyAoY2hhcikgYwotCQkJCQkrICInIGludHNlYWQgb2YgJ1cnIiwgYyA9PSAnVycpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gcmVhZGluZyBmcm9tIG5ldyByZWFkZXIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNDaGFyQXJyYXlSZWFkZXIoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkNoYXJBcnJheVJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQ0lJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIoY2hhciBbXSwgaW50LCBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoaHcsIDUsIDUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSByZWFkZXIiLCBjci5yZWFkeSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGRldGVybWluaW5nIHJlYWR5IHN0YXRlIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGMgPSBjci5yZWFkKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIGluY29ycmVjdCByZWFkZXItLXJldHVybmVkICciICsgKGNoYXIpIGMKKyAgICAgICAgICAgICAgICAgICAgKyAiJyBpbnRzZWFkIG9mICdXJyIsIGMgPT0gJ1cnKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlYWRpbmcgZnJvbSBuZXcgcmVhZGVyIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIuY2xvc2UoKQotCQljciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoaHcpOwotCQljci5jbG9zZSgpOwotCQl0cnkgewotCQkJY3IucmVhZCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IC8vIENvcnJlY3QKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIG9uIHJlcWFkIGZyb20gY2xvc2VkIHN0cmVhbSIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIjY2xvc2UoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjbG9zZSgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjbG9zZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5jbG9zZSgpCisgICAgICAgIGNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7CisgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjci5yZWFkKCk7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIG9uIHJlcWFkIGZyb20gY2xvc2VkIHN0cmVhbSIpOyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IC8vIENvcnJlY3QKKyAgICAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyI21hcmsoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbWFya0koKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyLm1hcmsoaW50KQotCQl0cnkgewotCQkJY3IgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGh3KTsKLQkJCWNyLnNraXAoNUwpOwotCQkJY3IubWFyaygxMDApOwotCQkJY3IucmVhZCgpOwotCQkJY3IucmVzZXQoKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIG1hcmsgY29ycmVjdCBwb3NpdGlvbiIsICdXJywgY3IucmVhZCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5DaGFyQXJyYXlSZWFkZXIubWFya1N1cHBvcnRlZCgpCi0JCWNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7Ci0JCWFzc2VydFRydWUoIm1hcmtTdXBwb3J0ZWQgcmV0dXJuZWQgZmFsc2UiLCBjci5tYXJrU3VwcG9ydGVkKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIjbWFyayhpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hcmsiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7IGludC5jbGFzcyB9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5tYXJrKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7CisgICAgICAgICAgICBjci5za2lwKDVMKTsKKyAgICAgICAgICAgIGNyLm1hcmsoMTAwKTsKKyAgICAgICAgICAgIGNyLnJlYWQoKTsKKyAgICAgICAgICAgIGNyLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBtYXJrIGNvcnJlY3QgcG9zaXRpb24iLCAnVycsIGNyLnJlYWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbWFyayB0ZXN0OiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5yZWFkKCkKLQkJdHJ5IHsKLQkJCWNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7Ci0JCQlhc3NlcnRFcXVhbHMoIlJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXIiLCAnSCcsIGNyLnJlYWQoKSk7Ci0JCQljciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIobmV3IGNoYXJbXSB7ICdcdTg3NjUnIH0pOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRvdWJsZSBieXRlIGNoYXIiLCBjci5yZWFkKCkgPT0gJ1x1ODc2NScpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIjbWFya1N1cHBvcnRlZCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1hcmtTdXBwb3J0ZWQoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWFya1N1cHBvcnRlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5DaGFyQXJyYXlSZWFkZXIubWFya1N1cHBvcnRlZCgpCisgICAgICAgIGNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7CisgICAgICAgIGFzc2VydFRydWUoIm1hcmtTdXBwb3J0ZWQgcmV0dXJuZWQgZmFsc2UiLCBjci5tYXJrU3VwcG9ydGVkKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5yZWFkKGNoYXIgW10sIGludCwgaW50KQotCQljaGFyW10gYyA9IG5ldyBjaGFyWzExXTsKLQkJdHJ5IHsKLQkJCWNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7Ci0JCQljci5yZWFkKGMsIDEsIDEwKTsKLQkJCWFzc2VydFRydWUoIlJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXJzIiwgbmV3IFN0cmluZyhjLCAxLCAxMCkKLQkJCQkJLmVxdWFscyhuZXcgU3RyaW5nKGh3LCAwLCAxMCkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIucmVhZCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoaHcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWFkIHJldHVybmVkIGluY29ycmVjdCBjaGFyIiwgJ0gnLCBjci5yZWFkKCkpOworICAgICAgICAgICAgY3IgPSBuZXcgQ2hhckFycmF5UmVhZGVyKG5ldyBjaGFyW10geyAnXHU4NzY1JyB9KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBkb3VibGUgYnl0ZSBjaGFyIiwgY3IucmVhZCgpID09ICdcdTg3NjUnKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIjcmVhZHkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZHkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyLnJlYWR5KCkKLQkJY3IgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGh3KTsKLQkJYm9vbGVhbiBleHBlY3RFeGNlcHRpb24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoInJlYWR5IHJldHVybmVkIGZhbHNlIiwgY3IucmVhZHkoKSk7Ci0JCQljci5za2lwKDEwMDApOwotCQkJYXNzZXJ0VHJ1ZSgicmVhZHkgcmV0dXJuZWQgdHJ1ZSIsICFjci5yZWFkeSgpKTsKLQkJCWNyLmNsb3NlKCk7Ci0JCQlleHBlY3RFeGNlcHRpb24gPSB0cnVlOwotCQkJY3IucmVhZHkoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiAxIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmICghZXhwZWN0RXhjZXB0aW9uKQotCQkJCWZhaWwoIlVuZXhwZWN0ZWQ6ICIgKyBlKTsKLQkJfQotCQl0cnkgewotCQkJY3IgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGh3KTsKLQkJCWNyLmNsb3NlKCk7Ci0JCQljci5yZWFkeSgpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIDIiKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyI3JlYWQoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5yZWFkKGNoYXIgW10sIGludCwgaW50KQorICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyWzExXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7CisgICAgICAgICAgICBjci5yZWFkKGMsIDEsIDEwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXJzIiwgbmV3IFN0cmluZyhjLCAxLCAxMCkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgU3RyaW5nKGh3LCAwLCAxMCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNyZWFkeSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHJlYWR5KCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWR5IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWR5KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5yZWFkeSgpCisgICAgICAgIGNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7CisgICAgICAgIGJvb2xlYW4gZXhwZWN0RXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJyZWFkeSByZXR1cm5lZCBmYWxzZSIsIGNyLnJlYWR5KCkpOworICAgICAgICAgICAgY3Iuc2tpcCgxMDAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInJlYWR5IHJldHVybmVkIHRydWUiLCAhY3IucmVhZHkoKSk7CisgICAgICAgICAgICBjci5jbG9zZSgpOworICAgICAgICAgICAgZXhwZWN0RXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGNyLnJlYWR5KCk7CisgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gMSIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoIWV4cGVjdEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7CisgICAgICAgICAgICBjci5jbG9zZSgpOworICAgICAgICAgICAgY3IucmVhZHkoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiAyIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5yZXNldCgpCi0JCXRyeSB7Ci0JCQljciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoaHcpOwotCQkJY3Iuc2tpcCg1TCk7Ci0JCQljci5tYXJrKDEwMCk7Ci0JCQljci5yZWFkKCk7Ci0JCQljci5yZXNldCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJSZXNldCBmYWlsZWQgdG8gcmV0dXJuIHRvIG1hcmtlciBwb3NpdGlvbiIsCi0JCQkJCSdXJywgY3IucmVhZCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZXNldCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlSZWFkZXIjc2tpcChsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2tpcEooKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyLnNraXAobG9uZykKLQkJbG9uZyBza2lwcGVkID0gMDsKLQkJdHJ5IHsKLQkJCWNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7Ci0JCQlza2lwcGVkID0gY3Iuc2tpcCg1TCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2tpcCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBza2lwIGNvcnJlY3QgbnVtYmVyIG9mIGNoYXJzIiwgNUwsIHNraXBwZWQpOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCJTa2lwIHNraXBwZWQgd3JvbmcgY2hhcnMiLCAnVycsIGNyLnJlYWQoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInJlYWQgZXhjZXB0aW9uIGR1cmluZyBza2lwIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNyZXNldCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlc2V0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyLnJlc2V0KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyID0gbmV3IENoYXJBcnJheVJlYWRlcihodyk7CisgICAgICAgICAgICBjci5za2lwKDVMKTsKKyAgICAgICAgICAgIGNyLm1hcmsoMTAwKTsKKyAgICAgICAgICAgIGNyLnJlYWQoKTsKKyAgICAgICAgICAgIGNyLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc2V0IGZhaWxlZCB0byByZXR1cm4gdG8gbWFya2VyIHBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgJ1cnLCBjci5yZWFkKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlc2V0IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlciNza2lwKGxvbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNraXAiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkNoYXJBcnJheVJlYWRlci5za2lwKGxvbmcpCisgICAgICAgIGxvbmcgc2tpcHBlZCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoaHcpOworICAgICAgICAgICAgc2tpcHBlZCA9IGNyLnNraXAoNUwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNraXAgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2tpcCBjb3JyZWN0IG51bWJlciBvZiBjaGFycyIsIDVMLCBza2lwcGVkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU2tpcCBza2lwcGVkIHdyb25nIGNoYXJzIiwgJ1cnLCBjci5yZWFkKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZWFkIGV4Y2VwdGlvbiBkdXJpbmcgc2tpcCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAoY3IgIT0gbnVsbCkKLQkJCWNyLmNsb3NlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBpZiAoY3IgIT0gbnVsbCkKKyAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0NoYXJBcnJheVdyaXRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9DaGFyQXJyYXlXcml0ZXJUZXN0LmphdmEKaW5kZXggMTYwNTJmMi4uOTcyYWQxYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0NoYXJBcnJheVdyaXRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQ2hhckFycmF5V3JpdGVyVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMTcgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogCitAVGVzdFRhcmdldENsYXNzKENoYXJBcnJheVdyaXRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ2hhckFycmF5V3JpdGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBjaGFyW10gaHcgPSB7ICdIJywgJ2UnLCAnbCcsICdsJywgJ28nLCAnVycsICdvJywgJ3InLCAnbCcsICdkJyB9OwpAQCAtMzEsMTkgKzM3LDMzIEBACiAgICAgQ2hhckFycmF5UmVhZGVyIGNyOwogCiAgICAgLyoqCi0gICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyI0NoYXJBcnJheVdyaXRlcigpCisgICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyI0NoYXJBcnJheVdyaXRlcihpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLSAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyKCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkNoYXJBcnJheVdyaXRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIoaW50KQogICAgICAgICBjdyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoOTApOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkNyZWF0ZWQgaW5jb3JyZWN0IHdyaXRlciIsIDAsIGN3LnNpemUoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyI0NoYXJBcnJheVdyaXRlcihpbnQpCisgICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyI0NoYXJBcnJheVdyaXRlcigpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0gICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcihpbnQpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENoYXJBcnJheVdyaXRlcigpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJDaGFyQXJyYXlXcml0ZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIoKQogICAgICAgICBjdyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDcmVhdGVkIGluY29ycmVjdCB3cml0ZXIiLCAwLCBjdy5zaXplKCkpOwogICAgIH0KQEAgLTUxLDYgKzcxLDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyI2Nsb3NlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2xvc2UoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY2xvc2UiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIuY2xvc2UoKQogICAgICAgICBjdy5jbG9zZSgpOwpAQCAtNTksNiArODYsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIjZmx1c2goKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmbHVzaCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmbHVzaCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyLmZsdXNoKCkKICAgICAgICAgY3cuZmx1c2goKTsKQEAgLTY3LDYgKzEwMSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciNyZXNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHJlc2V0KCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlc2V0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlci5yZXNldCgpCiAgICAgICAgIGN3LndyaXRlKCJIZWxsb1dvcmxkIiwgNSwgNSk7CkBAIC04Niw2ICsxMjcsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIjc2l6ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNpemUoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2l6ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlci5zaXplKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc2l6ZSIsIDAsIGN3LnNpemUoKSk7CkBAIC05Niw2ICsxNDQsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIjdG9DaGFyQXJyYXkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0b0NoYXJBcnJheSgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ0b0NoYXJBcnJheSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvQ2hhckFycmF5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgY2hhciBbXSBqYXZhLmlvLkNoYXJBcnJheVdyaXRlci50b0NoYXJBcnJheSgpCiAgICAgICAgIGN3LndyaXRlKCJIZWxsb1dvcmxkIiwgMCwgMTApOwpAQCAtMTEzLDYgKzE2OCwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRvU3RyaW5nKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInRvU3RyaW5nIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIudG9TdHJpbmcoKQogICAgICAgICBjdy53cml0ZSgiSGVsbG9Xb3JsZCIsIDUsIDUpOwpAQCAtMTI0LDYgKzE4NiwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciN3cml0ZShjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB3cml0ZShjaGFyW10gYywgaW50IG9mZiwgaW50IGxlbikgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIud3JpdGUoY2hhciBbXSwgaW50LCBpbnQpCiAgICAgICAgIGN3LndyaXRlKGh3LCA1LCA1KTsKQEAgLTE0Miw2ICsyMTEsMTMgQEAKICAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKICAgICAgKiBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTM4NwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gZm9yIHdyaXRlKGNoYXJbXSBjLCBpbnQgb2ZmLCBpbnQgbGVuKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSV8yKCkgewogICAgICAgICBDaGFyQXJyYXlXcml0ZXIgb2JqID0gbmV3IENoYXJBcnJheVdyaXRlcigpOwogICAgICAgICB0cnkgewpAQCAtMTU3LDYgKzIzMywxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciN3cml0ZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHdyaXRlKGludCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyLndyaXRlKGludCkKICAgICAgICAgY3cud3JpdGUoJ1QnKTsKQEAgLTE3MSw2ICsyNTQsMTQgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHdyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KSBtZXRob2QuICIgKworICAgICAgICAgICAgICAgICAgICAiW05lZWQgdG8gY2hlY2sgZGlmZmVyZW50IHN0cmluZ3M/XSIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUxqYXZhX2xhbmdfU3RyaW5nSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyLndyaXRlKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICAgIC8vIGludCwgaW50KQpAQCAtMTkwLDYgKzI4MSwxMyBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKICAgICAgKiBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTM4NwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gZm9yIHdyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUxqYXZhX2xhbmdfU3RyaW5nSUlfMigpIHRocm93cyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhckFycmF5V3JpdGVyIG9iaiA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKICAgICAgICAgdHJ5IHsKQEAgLTIwMiw2ICszMDAsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIjd3JpdGVUbyhqYXZhLmlvLldyaXRlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVUbyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLldyaXRlci5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlVG9MamF2YV9pb19Xcml0ZXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyLndyaXRlVG8oamF2YS5pby5Xcml0ZXIpCiAgICAgICAgIGN3LndyaXRlKCJIZWxsb1dvcmxkIiwgMCwgMTApOwpAQCAtMjM2LDYgKzM0MSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciNhcHBlbmQoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXBwZW5kKGNoYXIgYykgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImFwcGVuZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoYXIgdGVzdENoYXIgPSAnICc7CiAgICAgICAgIENoYXJBcnJheVdyaXRlciB3cml0ZXIgPSBuZXcgQ2hhckFycmF5V3JpdGVyKDEwKTsKQEAgLTI0OCw2ICszNjAsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIjYXBwZW5kKENoYXJTZXF1ZW5jZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXBwZW5kKENoYXJTZXF1ZW5jZSBjc3EpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJhcHBlbmQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZENoYXJTZXF1ZW5jZSgpIHsKIAogICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBUZXN0IFN0cmluZyI7CkBAIC0yNjEsNiArMzgwLDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyI2FwcGVuZChDaGFyU2VxdWVuY2UsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImFwcGVuZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyU2VxdWVuY2VJbnRJbnQoKSB7CiAgICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIk15IFRlc3QgU3RyaW5nIjsKICAgICAgICAgQ2hhckFycmF5V3JpdGVyIHdyaXRlciA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoMTApOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0NoYXJDb252ZXJzaW9uRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0NoYXJDb252ZXJzaW9uRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDBmZTM1YjguLjE5N2M3ZTQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9DaGFyQ29udmVyc2lvbkV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQ2hhckNvbnZlcnNpb25FeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDUyICsxNyw3MiBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDaGFyQ29udmVyc2lvbkV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24jQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uKCkKLQkJLy8gQ3VycmVudGx5LCB0aGVyZSBhcmUgbm8gcmVmcyB0byBDaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiBzbyB0aGlzIGlzCi0JCS8vIHRoZSBiZXN0IHRlc3Qgd2UgY2FuIGRvCi0JCXRyeSB7Ci0JCQlpZiAodHJ1ZSkgLy8gQkI6IGdldHRpbmcgYXJvdW5kIExGCi0JCQkJdGhyb3cgbmV3IGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oKTsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0TnVsbCgKLQkJCQkJIkV4Y2VwdGlvbiBkZWZpbmVkIHdpdGggbm8gbWVzc2FnZSBhbnN3ZXJzIG5vbi1udWxsIHRvIGdldE1lc3NhZ2UoKSIsCi0JCQkJCWUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiNDaGFyQ29udmVyc2lvbkV4Y2VwdGlvbigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENoYXJDb252ZXJzaW9uRXhjZXB0aW9uKCkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiQ2hhckNvbnZlcnNpb25FeGNlcHRpb24iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oKQorICAgICAgICAvLyBDdXJyZW50bHksIHRoZXJlIGFyZSBubyByZWZzIHRvIENoYXJDb252ZXJzaW9uRXhjZXB0aW9uIHNvIHRoaXMgaXMKKyAgICAgICAgLy8gdGhlIGJlc3QgdGVzdCB3ZSBjYW4gZG8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0cnVlKSAvLyBCQjogZ2V0dGluZyBhcm91bmQgTEYKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGRlZmluZWQgd2l0aCBubyBtZXNzYWdlIGFuc3dlcnMgbm9uLW51bGwgdG8gZ2V0TWVzc2FnZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24jQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlpZiAodHJ1ZSkgLy8gZ2V0dGluZyBhcm91bmQgTEYKLQkJCQl0aHJvdyBuZXcgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbigiQmxhaCIpOwotCQkJZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4Y2VwdGlvbiBkZWZpbmVkIHdpdGggbm8gbWVzc2FnZSBhbnN3ZXJzIG5vbi1udWxsIHRvIGdldE1lc3NhZ2UoKSIsCi0JCQkJCSJCbGFoIiwgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uI0NoYXJDb252ZXJzaW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENoYXJDb252ZXJzaW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodHJ1ZSkgLy8gZ2V0dGluZyBhcm91bmQgTEYKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbigiQmxhaCIpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4Y2VwdGlvbiBkZWZpbmVkIHdpdGggbm8gbWVzc2FnZSBhbnN3ZXJzIG5vbi1udWxsIHRvIGdldE1lc3NhZ2UoKSIsCisgICAgICAgICAgICAgICAgICAgICJCbGFoIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQ29tcHV0ZVNlcmlhbFZlcnNpb25VSURUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vQ29tcHV0ZVNlcmlhbFZlcnNpb25VSURUZXN0LmphdmEKaW5kZXggY2U1NjdlNi4uMjZhMzIxNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0NvbXB1dGVTZXJpYWxWZXJzaW9uVUlEVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9Db21wdXRlU2VyaWFsVmVyc2lvblVJRFRlc3QuamF2YQpAQCAtMiwxMSArMiwyNiBAQAogCiBpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworQFRlc3RUYXJnZXRDbGFzcyhPYmplY3RJbnB1dFN0cmVhbS5jbGFzcykKIHB1YmxpYyBjbGFzcyBDb21wdXRlU2VyaWFsVmVyc2lvblVJRFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAKICAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gInNlcmlhbGl6YXRpb24vdGVzdHMvYXBpL2phdmEvaW8vIjsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVTVUlEQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKENsYXNzTG9hZGVyCiAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocGF0aCArICJ0ZXN0Q29tcHV0ZVNVSURDbGFzcy5zZXIiKSk7CkBAIC0yNSw2ICs0MCwxNSBAQAogICAgICAgICBvaXMuY2xvc2UoKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wdXRlU1VJREludGVyZmFjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKENsYXNzTG9hZGVyCiAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocGF0aApAQCAtNTgsNiArODIsMTUgQEAKICAgICAgICAgb2lzLmNsb3NlKCk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVNVSURGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKENsYXNzTG9hZGVyCiAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocGF0aCArICJ0ZXN0Q29tcHV0ZVNVSURGaWVsZHMuc2VyIikpOwpAQCAtOTYsNiArMTI5LDE1IEBACiAgICAgICAgIG9pcy5jbG9zZSgpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVTVUlEQ29uc3RydWN0b3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShDbGFzc0xvYWRlcgogICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKHBhdGgKQEAgLTExOSw2ICsxNjEsMTUgQEAKICAgICAgICAgb2lzLmNsb3NlKCk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVNVSURNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShDbGFzc0xvYWRlcgogICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKHBhdGggKyAidGVzdENvbXB1dGVTVUlETWV0aG9kcy5zZXIiKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRGF0YUlucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0RhdGFJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA1Y2VmMWMzLi5mMDZkMTQ5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRGF0YUlucHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9EYXRhSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKQEAgLTIzLDIwMSArMjgsMjczIEBACiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhEYXRhSW5wdXRTdHJlYW0uY2xhc3MpIAogcHVibGljIGNsYXNzIERhdGFJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JcHJpdmF0ZSBEYXRhT3V0cHV0U3RyZWFtIG9zOworICAgIHByaXZhdGUgRGF0YU91dHB1dFN0cmVhbSBvczsKIAotCXByaXZhdGUgRGF0YUlucHV0U3RyZWFtIGRpczsKKyAgICBwcml2YXRlIERhdGFJbnB1dFN0cmVhbSBkaXM7CiAKLQlwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3M7CisgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zOwogCi0JU3RyaW5nIHVuaWh3ID0gIlx1MDA0OFx1MDA2NVx1MDA2Q1x1MDA2Q1x1MDA2Rlx1MDAyMFx1MDA1N1x1MDA2Rlx1MDA3Mlx1MDA2Q1x1MDA2NCI7CisgICAgU3RyaW5nIHVuaWh3ID0gIlx1MDA0OFx1MDA2NVx1MDA2Q1x1MDA2Q1x1MDA2Rlx1MDAyMFx1MDA1N1x1MDA2Rlx1MDA3Mlx1MDA2Q1x1MDA2NCI7CiAKLQlwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9EYXRhSW5wdXRTdHJlYW1cbiI7CisgICAgcHVibGljIFN0cmluZyBmaWxlU3RyaW5nID0gIlRlc3RfQWxsX1Rlc3RzXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5SW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlPdXRwdXRTdHJlYW1cblRlc3RfRGF0YUlucHV0U3RyZWFtXG4iOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI0RhdGFJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUNoYXIoJ3QnKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyBjb25zdHJ1Y3RvciB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZGlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIGNvbnN0cnVjdG9yIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNEYXRhSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRGF0YUlucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkRhdGFJbnB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZUNoYXIoJ3QnKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyBjb25zdHJ1Y3RvciB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIGNvbnN0cnVjdG9yIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWQoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSkKLQkJdHJ5IHsKLQkJCW9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYnl0ZSByYnl0ZXNbXSA9IG5ldyBieXRlW2ZpbGVTdHJpbmcubGVuZ3RoKCldOwotCQkJZGlzLnJlYWQocmJ5dGVzKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBkYXRhIHJlYWQiLCBuZXcgU3RyaW5nKHJieXRlcywgMCwgZmlsZVN0cmluZwotCQkJCQkubGVuZ3RoKCkpLmVxdWFscyhmaWxlU3RyaW5nKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgYnl0ZSByYnl0ZXNbXSA9IG5ldyBieXRlW2ZpbGVTdHJpbmcubGVuZ3RoKCldOworICAgICAgICAgICAgZGlzLnJlYWQocmJ5dGVzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBkYXRhIHJlYWQiLCBuZXcgU3RyaW5nKHJieXRlcywgMCwgZmlsZVN0cmluZworICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpLmVxdWFscyhmaWxlU3RyaW5nKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQklJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSwgaW50LCBpbnQpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWJ5dGUgcmJ5dGVzW10gPSBuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXTsKLQkJCWRpcy5yZWFkKHJieXRlcywgMCwgcmJ5dGVzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSByZWFkIiwgbmV3IFN0cmluZyhyYnl0ZXMsIDAsIGZpbGVTdHJpbmcKLQkJCQkJLmxlbmd0aCgpKS5lcXVhbHMoZmlsZVN0cmluZykpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQklJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSwgaW50LCBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGUgcmJ5dGVzW10gPSBuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIGRpcy5yZWFkKHJieXRlcywgMCwgcmJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSByZWFkIiwgbmV3IFN0cmluZyhyYnl0ZXMsIDAsIGZpbGVTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKS5lcXVhbHMoZmlsZVN0cmluZykpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkQm9vbGVhbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkQm9vbGVhbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZEJvb2xlYW4oKQotCQl0cnkgewotCQkJb3Mud3JpdGVCb29sZWFuKHRydWUpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBib29sZWFuIHdyaXR0ZW4iLCBkaXMucmVhZEJvb2xlYW4oKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInJlYWRCb29sZWFuIHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZEJvb2xlYW4oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRCb29sZWFuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRCb29sZWFuKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkQm9vbGVhbigpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZUJvb2xlYW4odHJ1ZSk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJvb2xlYW4gd3JpdHRlbiIsIGRpcy5yZWFkQm9vbGVhbigpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgicmVhZEJvb2xlYW4gdGVzdCBmYWlsZWQgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRCeXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWRCeXRlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkQnl0ZSgpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoKGJ5dGUpIDEyNyk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGUgcmVhZCIsIGRpcy5yZWFkQnl0ZSgpID09IChieXRlKSAxMjcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZEJ5dGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRCeXRlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkQnl0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZEJ5dGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBieXRlIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRCeXRlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlQnl0ZSgoYnl0ZSkgMTI3KTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZSByZWFkIiwgZGlzLnJlYWRCeXRlKCkgPT0gKGJ5dGUpIDEyNyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkQnl0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkQ2hhcigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkQ2hhcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGNoYXIgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZENoYXIoKQotCQl0cnkgewotCQkJb3Mud3JpdGVDaGFyKCd0Jyk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY2hhciByZWFkIiwgJ3QnLCBkaXMucmVhZENoYXIoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkQ2hhciB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZENoYXIoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRDaGFyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZENoYXIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBjaGFyIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRDaGFyKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlQ2hhcigndCcpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNoYXIgcmVhZCIsICd0JywgZGlzLnJlYWRDaGFyKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZENoYXIgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZERvdWJsZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkRG91YmxlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWREb3VibGUoKQotCQl0cnkgewotCQkJb3Mud3JpdGVEb3VibGUoMjM0NS43NjgzNDcyMDIwMik7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG91YmxlIHJlYWQiLAotCQkJCQkyMzQ1Ljc2ODM0NzIwMjAyLCBkaXMucmVhZERvdWJsZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWREb3VibGUgdGVzdCIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkRG91YmxlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkRG91YmxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgIAorICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWREb3VibGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZERvdWJsZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZURvdWJsZSgyMzQ1Ljc2ODM0NzIwMjAyKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkb3VibGUgcmVhZCIsCisgICAgICAgICAgICAgICAgICAgIDIzNDUuNzY4MzQ3MjAyMDIsIGRpcy5yZWFkRG91YmxlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZERvdWJsZSB0ZXN0IiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZEZsb2F0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWRGbG9hdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRGbG9hdCgpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUZsb2F0KDI5LjA4NzY0Zik7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGZsb2F0IHJlYWQiLCBkaXMucmVhZEZsb2F0KCkgPT0gMjkuMDg3NjRmKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgicmVhZEZsb2F0IHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZEZsb2F0KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkRmxvYXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRGbG9hdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRGbG9hdCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZUZsb2F0KDI5LjA4NzY0Zik7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGZsb2F0IHJlYWQiLCBkaXMucmVhZEZsb2F0KCkgPT0gMjkuMDg3NjRmKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgicmVhZEZsb2F0IHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkRnVsbHkoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZEZ1bGx5JEIoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRGdWxseShieXRlIFtdKQotCQl0cnkgewotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlieXRlIHJieXRlc1tdID0gbmV3IGJ5dGVbZmlsZVN0cmluZy5sZW5ndGgoKV07Ci0JCQlkaXMucmVhZEZ1bGx5KHJieXRlcyk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSByZWFkIiwgbmV3IFN0cmluZyhyYnl0ZXMsIDAsIGZpbGVTdHJpbmcKLQkJCQkJLmxlbmd0aCgpKS5lcXVhbHMoZmlsZVN0cmluZykpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZEZ1bGx5IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkRnVsbHkoYnl0ZVtdKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRGdWxseSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZEZ1bGx5JEIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRGdWxseShieXRlIFtdKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBieXRlIHJieXRlc1tdID0gbmV3IGJ5dGVbZmlsZVN0cmluZy5sZW5ndGgoKV07CisgICAgICAgICAgICBkaXMucmVhZEZ1bGx5KHJieXRlcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSByZWFkIiwgbmV3IFN0cmluZyhyYnl0ZXMsIDAsIGZpbGVTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKS5lcXVhbHMoZmlsZVN0cmluZykpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZEZ1bGx5IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZEZ1bGx5JEJJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZEZ1bGx5KGJ5dGUgW10sIGludCwKLQkJLy8gaW50KQotCQl0cnkgewotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlieXRlIHJieXRlc1tdID0gbmV3IGJ5dGVbZmlsZVN0cmluZy5sZW5ndGgoKV07Ci0JCQlkaXMucmVhZEZ1bGx5KHJieXRlcywgMCwgZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSByZWFkIiwgbmV3IFN0cmluZyhyYnl0ZXMsIDAsIGZpbGVTdHJpbmcKLQkJCQkJLmxlbmd0aCgpKS5lcXVhbHMoZmlsZVN0cmluZykpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZEZ1bGx5IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkRnVsbHkoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkRnVsbHkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkRnVsbHkkQklJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkRnVsbHkoYnl0ZSBbXSwgaW50LAorICAgICAgICAvLyBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGUgcmJ5dGVzW10gPSBuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIGRpcy5yZWFkRnVsbHkocmJ5dGVzLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBkYXRhIHJlYWQiLCBuZXcgU3RyaW5nKHJieXRlcywgMCwgZmlsZVN0cmluZworICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpLmVxdWFscyhmaWxlU3RyaW5nKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkRnVsbHkgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgcmVhZEZ1bGx5KGJ5dGUgW10sIGludCwgaW50KSBtZXRob2QgIiArCisgICAgICAgICAgICAgICAgICAgICJ0aHJvd3MgZXhjZXB0aW9ucyBpbiBhcHByb3ByaWF0ZSBjYXNlcy4gRU9GRXhjZXB0aW9uICYgSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRGdWxseSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkRnVsbHkkQklJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIERhdGFJbnB1dFN0cmVhbSBpcyA9ICBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXSkpOwogCi0gICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXTsgCi0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMucmVhZEZ1bGx5KGJ5dGVBcnJheSwgLTEsIC0xKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQorICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gbmV3IGJ5dGVbZmlsZVN0cmluZy5sZW5ndGgoKV07CiAgICAgICAgIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaXMucmVhZEZ1bGx5KGJ5dGVBcnJheSwgMCwgLTEpOwpAQCAtMjI3LDI3ICszMDQsMjEgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIDEsIC0xKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotCi0gICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIC0xLCAwKTsKLSAgICAgICAgaXMucmVhZEZ1bGx5KGJ5dGVBcnJheSwgMCwgMCk7Ci0gICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIDEsIDApOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIC0xLCAxKTsKKyAgICAgICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5sZW5ndGggKyAxKTsKICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaXMucmVhZEZ1bGx5KGJ5dGVBcnJheSwgMCwgMSk7Ci0gICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIDEsIDEpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMucmVhZEZ1bGx5KGJ5dGVBcnJheSwgMCwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgaXMucmVhZEZ1bGx5KGJ5dGVBcnJheSwgMSwgYnl0ZUFycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcy5yZWFkRnVsbHkoYnl0ZUFycmF5LCAtMSwgYnl0ZUFycmF5Lmxlbmd0aCk7CiAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwogICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCkBAIC0yNTcsNTkgKzMyOCwzNCBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkRnVsbHkoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHJlYWRGdWxseShieXRlIFtdLCBpbnQsIGludCkgbWV0aG9kICIgKworICAgICAgICAgICAgICAgICAgICAidGhyb3dzIGV4Y2VwdGlvbiBpZiBpdCdzIGNhbGxlZCB3aXRoIG51bGwgYXJyYXkgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZEZ1bGx5IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRGdWxseSRCSUlfTnVsbEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGlzID0gIG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW2ZpbGVTdHJpbmcubGVuZ3RoKCldKSk7Ci0gICAgICAgIAotICAgICAgICBieXRlW10gbnVsbEJ5dGVBcnJheSA9IG51bGw7Ci0gICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcy5yZWFkRnVsbHkobnVsbEJ5dGVBcnJheSwgLTEsIC0xKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQorICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gbmV3IGJ5dGVbMV07CiAgICAgICAgIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMucmVhZEZ1bGx5KG51bGxCeXRlQXJyYXksIDAsIC0xKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAxLCAtMSk7CisgICAgICAgICAgICBpcy5yZWFkRnVsbHkoYnl0ZUFycmF5LCBieXRlQXJyYXkubGVuZ3RoLCAxKTsKICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogCi0gICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAtMSwgMCk7Ci0gICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAwLCAwKTsKLSAgICAgICAgaXMucmVhZEZ1bGx5KG51bGxCeXRlQXJyYXksIDEsIDApOwotICAgICAgICAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAtMSwgMSk7CisgICAgICAgICAgICBpcy5yZWFkRnVsbHkobnVsbCwgMCwgMSk7CiAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAwLCAxKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAxLCAxKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMucmVhZEZ1bGx5KG51bGxCeXRlQXJyYXksIDAsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIG5ldyBEYXRhSW5wdXRTdHJlYW0obnVsbCkucmVhZEZ1bGx5KGJ5dGVBcnJheSwgMCwgMSk7CiAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKQEAgLTMxOSw5MSArMzY1LDQwIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgcmVhZEZ1bGx5KGJ5dGUgW10sIGludCwgaW50KSBtZXRob2QgIiArCisgICAgICAgICAgICAgICAgICAgICJ0aHJvd3MgZXhjZXB0aW9uIGlmIGl0J3MgY2FsbGVkIHdpdGggd3JvbmcgaW50IHZhbHVlcyBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRGdWxseSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkRnVsbHkkQklJX051bGxTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKG51bGwpOwogICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gbmV3IGJ5dGVbZmlsZVN0cmluZy5sZW5ndGgoKV07IAogICAgICAgICAgICAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIC0xLCAtMSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcy5yZWFkRnVsbHkoYnl0ZUFycmF5LCAwLCAtMSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcy5yZWFkRnVsbHkoYnl0ZUFycmF5LCAxLCAtMSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLQotICAgICAgICBpcy5yZWFkRnVsbHkoYnl0ZUFycmF5LCAtMSwgMCk7Ci0gICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIDAsIDApOwotICAgICAgICBpcy5yZWFkRnVsbHkoYnl0ZUFycmF5LCAxLCAwKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcy5yZWFkRnVsbHkoYnl0ZUFycmF5LCAtMSwgMSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIDAsIDEpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMucmVhZEZ1bGx5KGJ5dGVBcnJheSwgMSwgMSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShieXRlQXJyYXksIDAsIEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgcmVhZEZ1bGx5KGJ5dGUgW10sIGludCwgaW50KSBtZXRob2QgIiArCisgICAgICAgICAgICAgICAgICAgICJ0aHJvd3MgZXhjZXB0aW9uIGlmIGl0J3MgY2FsbGVkIHdpdGggd3JvbmcgcGFyYW1ldGVycy4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkRnVsbHkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkRnVsbHkkQklJX051bGxTdHJlYW1fTnVsbEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShudWxsKTsKICAgICAgICAgYnl0ZVtdIG51bGxCeXRlQXJyYXkgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAtMSwgLTEpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMucmVhZEZ1bGx5KG51bGxCeXRlQXJyYXksIDAsIC0xKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzLnJlYWRGdWxseShudWxsQnl0ZUFycmF5LCAxLCAtMSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KIAogICAgICAgICBpcy5yZWFkRnVsbHkobnVsbEJ5dGVBcnJheSwgLTEsIDApOwogICAgICAgICBpcy5yZWFkRnVsbHkobnVsbEJ5dGVBcnJheSwgMCwgMCk7CkBAIC00MzksMTk0ICs0MzQsMjU3IEBACiAgICAgICAgIAogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkSW50KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWRJbnQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZEludCgpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUludCg3NjgzNDcyMDIpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGludCByZWFkIiwgNzY4MzQ3MjAyLCBkaXMucmVhZEludCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWRJbnQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRJbnQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRJbnQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkSW50KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRJbnQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVJbnQoNzY4MzQ3MjAyKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBpbnQgcmVhZCIsIDc2ODM0NzIwMiwgZGlzLnJlYWRJbnQoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkSW50IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRMaW5lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMaW5lKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkTGluZSgpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGVzKCJIZWxsbyIpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCVN0cmluZyBsaW5lID0gZGlzLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGluZSByZWFkOiAiICsgbGluZSwgbGluZS5lcXVhbHMoIkhlbGxvIikpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZExpbmUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRMaW5lKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZExpbmUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZExpbmUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRMaW5lKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlQnl0ZXMoIkhlbGxvIik7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBkaXMucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBsaW5lIHJlYWQ6ICIgKyBsaW5lLCBsaW5lLmVxdWFscygiSGVsbG8iKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkTGluZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkTG9uZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkTG9uZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZExvbmcoKQotCQl0cnkgewotCQkJb3Mud3JpdGVMb25nKDk4NzU2NDUyODMzMzNMKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBsb25nIHJlYWQiLCA5ODc1NjQ1MjgzMzMzTCwgZGlzLnJlYWRMb25nKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJyZWFkIGxvbmcgdGVzdCBmYWlsZWQgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkTG9uZygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZExvbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTG9uZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZExvbmcoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVMb25nKDk4NzU2NDUyODMzMzNMKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBsb25nIHJlYWQiLCA5ODc1NjQ1MjgzMzMzTCwgZGlzLnJlYWRMb25nKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZWFkIGxvbmcgdGVzdCBmYWlsZWQgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRTaG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkU2hvcnQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBzaG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkU2hvcnQoKQotCQl0cnkgewotCQkJb3Mud3JpdGVTaG9ydCg5ODc1KTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc2hvcnQgcmVhZCIsIGRpcy5yZWFkU2hvcnQoKSA9PSAoc2hvcnQpIDk4NzUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgc2hvcnQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRTaG9ydCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZFNob3J0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRTaG9ydCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHNob3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRTaG9ydCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZVNob3J0KDk4NzUpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBzaG9ydCByZWFkIiwgZGlzLnJlYWRTaG9ydCgpID09IChzaG9ydCkgOTg3NSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCBzaG9ydCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkVW5zaWduZWRCeXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWRVbnNpZ25lZEJ5dGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZFVuc2lnbmVkQnl0ZSgpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoKGJ5dGUpIC0xMjcpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGJ5dGUgcmVhZCIsIDEyOSwgZGlzLnJlYWRVbnNpZ25lZEJ5dGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkVW5zaWduZWRCeXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNyZWFkVW5zaWduZWRCeXRlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkVW5zaWduZWRCeXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZFVuc2lnbmVkQnl0ZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkVW5zaWduZWRCeXRlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlQnl0ZSgoYnl0ZSkgLTEyNyk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSByZWFkIiwgMTI5LCBkaXMucmVhZFVuc2lnbmVkQnl0ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWRVbnNpZ25lZEJ5dGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZFVuc2lnbmVkU2hvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZFVuc2lnbmVkU2hvcnQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKQotCQl0cnkgewotCQkJb3Mud3JpdGVTaG9ydCg5ODc1KTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzaG9ydCByZWFkIiwgOTg3NSwgZGlzLnJlYWRVbnNpZ25lZFNob3J0KCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWRTaG9ydCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZFVuc2lnbmVkU2hvcnQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHJlYWRVbnNpZ25lZFNob3J0KCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRVbnNpZ25lZFNob3J0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkVW5zaWduZWRTaG9ydCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZVNob3J0KDk4NzUpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNob3J0IHJlYWQiLCA5ODc1LCBkaXMucmVhZFVuc2lnbmVkU2hvcnQoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZFNob3J0IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRVVEYoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZFVURigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZFVURigpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZVVURih1bmlodyk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHdyaXRlIHN0cmluZyBpbiBVVEYgZm9ybWF0IiwKLQkJCQkJZGlzLmF2YWlsYWJsZSgpID09IHVuaWh3Lmxlbmd0aCgpICsgMik7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHJlYWQiLCBkaXMucmVhZFVURigpLmVxdWFscyh1bmlodykpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkVVRGIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZFVURigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZFVURiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRVVEYoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRVVEYoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVVVEYodW5paHcpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byB3cml0ZSBzdHJpbmcgaW4gVVRGIGZvcm1hdCIsCisgICAgICAgICAgICAgICAgICAgIGRpcy5hdmFpbGFibGUoKSA9PSB1bmlody5sZW5ndGgoKSArIDIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN0cmluZyByZWFkIiwgZGlzLnJlYWRVVEYoKS5lcXVhbHModW5paHcpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZFVURiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZFVURihqYXZhLmlvLkRhdGFJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWRVVEZMamF2YV9pb19EYXRhSW5wdXQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCi0JCS8vIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnJlYWRVVEYoamF2YS5pby5EYXRhSW5wdXQpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZVVURih1bmlodyk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHdyaXRlIHN0cmluZyBpbiBVVEYgZm9ybWF0IiwKLQkJCQkJZGlzLmF2YWlsYWJsZSgpID09IHVuaWh3Lmxlbmd0aCgpICsgMik7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHJlYWQiLCBEYXRhSW5wdXRTdHJlYW0ucmVhZFVURihkaXMpCi0JCQkJCS5lcXVhbHModW5paHcpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZFVURiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3JlYWRVVEYoamF2YS5pby5EYXRhSW5wdXQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZFVURiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkRhdGFJbnB1dC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkVVRGTGphdmFfaW9fRGF0YUlucHV0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZworICAgICAgICAvLyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbS5yZWFkVVRGKGphdmEuaW8uRGF0YUlucHV0KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVVVEYodW5paHcpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byB3cml0ZSBzdHJpbmcgaW4gVVRGIGZvcm1hdCIsCisgICAgICAgICAgICAgICAgICAgIGRpcy5hdmFpbGFibGUoKSA9PSB1bmlody5sZW5ndGgoKSArIDIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN0cmluZyByZWFkIiwgRGF0YUlucHV0U3RyZWFtLnJlYWRVVEYoZGlzKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHVuaWh3KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWRVVEYgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtI3NraXBCeXRlcyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9za2lwQnl0ZXNJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtLnNraXBCeXRlcyhpbnQpCi0JCXRyeSB7Ci0JCQlieXRlIGZpbGVCeXRlc1tdID0gZmlsZVN0cmluZy5nZXRCeXRlcygpOwotCQkJb3Mud3JpdGUoZmlsZUJ5dGVzKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlkaXMuc2tpcEJ5dGVzKDEwMCk7Ci0JCQlieXRlIHJieXRlc1tdID0gbmV3IGJ5dGVbZmlsZVN0cmluZy5sZW5ndGgoKV07Ci0JCQlkaXMucmVhZChyYnl0ZXMsIDAsIDUwKTsKLQkJCWRpcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRhdGEgcmVhZCIsIG5ldyBTdHJpbmcocmJ5dGVzLCAwLCA1MCkKLQkJCQkJLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygxMDAsIDE1MCkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHNraXBCeXRlcyB0ZXN0IDEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQkvLyBib29sZWFuIGVvZkV4Y2VwdGlvbiA9IGZhbHNlOyAvL3doYXQgaXMgdGhpcyB2YXIgZm9yPwotCQkJaW50IHNraXBwZWQgPSAwOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKLQkJCQlza2lwcGVkID0gZGlzLnNraXBCeXRlcyg1MDAwMCk7Ci0JCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewotCQkJCS8vIGVvZkV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCQk7Ci0JCQlhc3NlcnRUcnVlKCJTa2lwcGVkIHNob3VsZCByZXBvcnQgIiArIGZpbGVTdHJpbmcubGVuZ3RoKCkgKyAiIG5vdCAiCi0JCQkJCSsgc2tpcHBlZCwgc2tpcHBlZCA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHNraXBCeXRlcyB0ZXN0IDIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSNza2lwQnl0ZXMoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBza2lwQnl0ZXMoaW50KSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2tpcEJ5dGVzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30gKSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBCeXRlc0koKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0uc2tpcEJ5dGVzKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGUgZmlsZUJ5dGVzW10gPSBmaWxlU3RyaW5nLmdldEJ5dGVzKCk7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlQnl0ZXMpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGRpcy5za2lwQnl0ZXMoMTAwKTsKKyAgICAgICAgICAgIGJ5dGUgcmJ5dGVzW10gPSBuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIGRpcy5yZWFkKHJieXRlcywgMCwgNTApOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSByZWFkIiwgbmV3IFN0cmluZyhyYnl0ZXMsIDAsIDUwKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDEwMCwgMTUwKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgc2tpcEJ5dGVzIHRlc3QgMSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJvb2xlYW4gZW9mRXhjZXB0aW9uID0gZmFsc2U7IC8vd2hhdCBpcyB0aGlzIHZhciBmb3I/CisgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IDA7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNraXBwZWQgPSBkaXMuc2tpcEJ5dGVzKDUwMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gZW9mRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNraXBwZWQgc2hvdWxkIHJlcG9ydCAiICsgZmlsZVN0cmluZy5sZW5ndGgoKSArICIgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgKyBza2lwcGVkLCBza2lwcGVkID09IGZpbGVTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgc2tpcEJ5dGVzIHRlc3QgMiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgb3BlbkRhdGFJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKSk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBvcGVuRGF0YUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJvcyk7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYm9zKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQkJdHJ5IHsKLQkJCW9zLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGRpcy5jbG9zZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICB9Ci0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9EYXRhT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0RhdGFPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggZjI4NTQyYS4uNjFhNWVjMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0RhdGFPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0RhdGFPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDMyNiArMTcsNDQ0IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhEYXRhT3V0cHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBEYXRhT3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlwcml2YXRlIERhdGFPdXRwdXRTdHJlYW0gb3M7CisgICAgcHJpdmF0ZSBEYXRhT3V0cHV0U3RyZWFtIG9zOwogCi0JcHJpdmF0ZSBEYXRhSW5wdXRTdHJlYW0gZGlzOworICAgIHByaXZhdGUgRGF0YUlucHV0U3RyZWFtIGRpczsKIAotCXByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvczsKKyAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3M7CiAKLQlTdHJpbmcgdW5paHcgPSAiXHUwMDQ4XHUwMDY1XHUwMDZDXHUwMDZDXHUwMDZGXHUwMDIwXHUwMDU3XHUwMDZGXHUwMDcyXHUwMDZDXHUwMDY0IjsKKyAgICBTdHJpbmcgdW5paHcgPSAiXHUwMDQ4XHUwMDY1XHUwMDZDXHUwMDZDXHUwMDZGXHUwMDIwXHUwMDU3XHUwMDZGXHUwMDcyXHUwMDZDXHUwMDY0IjsKIAotCXB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CdWZmZXJlZE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRGF0YUlucHV0U3RyZWFtXG4iOworICAgIHB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CdWZmZXJlZE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRGF0YUlucHV0U3RyZWFtXG4iOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSNEYXRhT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW0oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JCWFzc2VydFRydWUoIlVzZWQgaW4gYWxsIHRlc3RzIiwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jRGF0YU91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiQ2hlY2sgc2V5VXAgbWV0aG9kIGZvciBzb3VyY2VzLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkRhdGFPdXRwdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9ICkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQorICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIGluIGFsbCB0ZXN0cyIsIHRydWUpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS5mbHVzaCgpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUludCg5MDg3NTg5KTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlpbnQgYyA9IGRpcy5yZWFkSW50KCk7Ci0JCQlkaXMuY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIGZsdXNoIGNvcnJlY3RseSIsIDkwODc1ODksIGMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGZsdXNoIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jZmx1c2goKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmbHVzaCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZsdXNoKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0uZmx1c2goKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVJbnQoOTA4NzU4OSk7CisgICAgICAgICAgICBvcy5mbHVzaCgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgaW50IGMgPSBkaXMucmVhZEludCgpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBmbHVzaCBjb3JyZWN0bHkiLCA5MDg3NTg5LCBjKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBmbHVzaCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jc2l6ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS5zaXplKCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3NpemUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzaXplKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNpemUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS5zaXplKCkKIAotCQl0cnkgewotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxNTApOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbMTUwXTsKLQkJCWRpcy5yZWFkKHJidWYsIDAsIDE1MCk7Ci0JCQlkaXMuY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNpemUgcmV0dXJuZWQiLCAxNTAsIG9zLnNpemUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIDE1MCk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgYnl0ZVtdIHJidWYgPSBuZXcgYnl0ZVsxNTBdOworICAgICAgICAgICAgZGlzLnJlYWQocmJ1ZiwgMCwgMTUwKTsKKyAgICAgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2l6ZSByZXR1cm5lZCIsIDE1MCwgb3Muc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEJJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKLQkJLy8gaW50KQotCQl0cnkgewotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxNTApOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbMTUwXTsKLQkJCWRpcy5yZWFkKHJidWYsIDAsIDE1MCk7Ci0JCQlkaXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBieXRlcyB3cml0dGVuIiwgbmV3IFN0cmluZyhyYnVmLCAwLCAxNTApCi0JCQkJCS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgMTUwKSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEJJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCAxNTApOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbMTUwXTsKKyAgICAgICAgICAgIGRpcy5yZWFkKHJidWYsIDAsIDE1MCk7CisgICAgICAgICAgICBkaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBieXRlcyB3cml0dGVuIiwgbmV3IFN0cmluZyhyYnVmLCAwLCAxNTApCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgMTUwKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZShpbnQpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZSgoaW50KSAndCcpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWludCBjID0gZGlzLnJlYWQoKTsKLQkJCWRpcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGludCB3cml0dGVuIiwgKGludCkgJ3QnID09IGMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGUoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGUoaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGUoKGludCkgJ3QnKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBpbnQgYyA9IGRpcy5yZWFkKCk7CisgICAgICAgICAgICBkaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBpbnQgd3JpdHRlbiIsIChpbnQpICd0JyA9PSBjKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGVCb29sZWFuKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUJvb2xlYW5aKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGVCb29sZWFuKGJvb2xlYW4pCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUJvb2xlYW4odHJ1ZSk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYm9vbGVhbiBjID0gZGlzLnJlYWRCb29sZWFuKCk7Ci0JCQlkaXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBib29sZWFuIHdyaXR0ZW4iLCBjKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZUJvb2xlYW4gdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZUJvb2xlYW4oYm9vbGVhbikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVCb29sZWFuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVCb29sZWFuWigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtLndyaXRlQm9vbGVhbihib29sZWFuKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVCb29sZWFuKHRydWUpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJvb2xlYW4gYyA9IGRpcy5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYm9vbGVhbiB3cml0dGVuIiwgYyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVCb29sZWFuIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZUJ5dGUoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVCeXRlSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtLndyaXRlQnl0ZShpbnQpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoKGJ5dGUpIDEyNyk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJb3BlbkRhdGFJbnB1dFN0cmVhbSgpOwotCQkJYnl0ZSBjID0gZGlzLnJlYWRCeXRlKCk7Ci0JCQlkaXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBieXRlIHdyaXR0ZW4iLCBjID09IChieXRlKSAxMjcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlQnl0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlQnl0ZShpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlQnl0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlQnl0ZUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZUJ5dGUoaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVCeXRlKChieXRlKSAxMjcpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGUgYyA9IGRpcy5yZWFkQnl0ZSgpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZSB3cml0dGVuIiwgYyA9PSAoYnl0ZSkgMTI3KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZUJ5dGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlQnl0ZXMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlQnl0ZXNMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZUJ5dGVzKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNDAwMF07Ci0JCQlkaXMucmVhZChyYnVmLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJCWRpcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGVzIHdyaXR0ZW4iLCBuZXcgU3RyaW5nKHJidWYsIDAsCi0JCQkJCWZpbGVTdHJpbmcubGVuZ3RoKCkpLmVxdWFscyhmaWxlU3RyaW5nKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVCeXRlcyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTEwMQotCQluZXcgRGF0YU91dHB1dFN0cmVhbShudWxsKS53cml0ZUJ5dGVzKCIiKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZUJ5dGVzKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlQnl0ZXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlQnl0ZXNMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZUJ5dGVzKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNDAwMF07CisgICAgICAgICAgICBkaXMucmVhZChyYnVmLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGVzIHdyaXR0ZW4iLCBuZXcgU3RyaW5nKHJidWYsIDAsCisgICAgICAgICAgICAgICAgICAgIGZpbGVTdHJpbmcubGVuZ3RoKCkpLmVxdWFscyhmaWxlU3RyaW5nKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVCeXRlcyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTEwMQorICAgICAgICBuZXcgRGF0YU91dHB1dFN0cmVhbShudWxsKS53cml0ZUJ5dGVzKCIiKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlQ2hhcihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUNoYXJJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGVDaGFyKGludCkKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQ2hhcignVCcpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWNoYXIgYyA9IGRpcy5yZWFkQ2hhcigpOwotCQkJZGlzLmNsb3NlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjaGFyIHdyaXR0ZW4iLCAnVCcsIGMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlQ2hhciB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlQ2hhcihpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlQ2hhciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUNoYXJJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGVDaGFyKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlQ2hhcignVCcpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGNoYXIgYyA9IGRpcy5yZWFkQ2hhcigpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjaGFyIHdyaXR0ZW4iLCAnVCcsIGMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlQ2hhciB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGVDaGFycyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVDaGFyc0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGVDaGFycyhqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJb3Mud3JpdGVDaGFycygiVGVzdCBTdHJpbmciKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcls1MF07Ci0JCQlpbnQgaSwgYSA9IGRpcy5hdmFpbGFibGUoKSAvIDI7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYTsgaSsrKQotCQkJCWNoYXJzW2ldID0gZGlzLnJlYWRDaGFyKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjaGFycyB3cml0dGVuIiwgIlRlc3QgU3RyaW5nIiwgbmV3IFN0cmluZyhjaGFycywgMCwgaSkKLQkJCQkJKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZUNoYXJzIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGVDaGFycyhqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUNoYXJzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVDaGFyc0xqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGVDaGFycyhqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVDaGFycygiVGVzdCBTdHJpbmciKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcls1MF07CisgICAgICAgICAgICBpbnQgaSwgYSA9IGRpcy5hdmFpbGFibGUoKSAvIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYTsgaSsrKQorICAgICAgICAgICAgICAgIGNoYXJzW2ldID0gZGlzLnJlYWRDaGFyKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjaGFycyB3cml0dGVuIiwgIlRlc3QgU3RyaW5nIiwgbmV3IFN0cmluZyhjaGFycywgMCwgaSkKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZUNoYXJzIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZURvdWJsZShkb3VibGUpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZURvdWJsZUQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZURvdWJsZShkb3VibGUpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZURvdWJsZSg5MDg3NTU1NTU0NTYuOTgpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWRvdWJsZSBjID0gZGlzLnJlYWREb3VibGUoKTsKLQkJCWRpcy5jbG9zZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG91YmxlIHdyaXR0ZW4iLCA5MDg3NTU1NTU0NTYuOTgsIGMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlRG91YmxlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGVEb3VibGUoZG91YmxlKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZURvdWJsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZURvdWJsZUQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZURvdWJsZShkb3VibGUpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZURvdWJsZSg5MDg3NTU1NTU0NTYuOTgpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGRvdWJsZSBjID0gZGlzLnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZG91YmxlIHdyaXR0ZW4iLCA5MDg3NTU1NTU0NTYuOTgsIGMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlRG91YmxlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZUZsb2F0KGZsb2F0KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVGbG9hdEYoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZUZsb2F0KGZsb2F0KQotCQl0cnkgewotCQkJb3Mud3JpdGVGbG9hdCg5MDg3LjQ1NmYpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWZsb2F0IGMgPSBkaXMucmVhZEZsb2F0KCk7Ci0JCQlkaXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBmbG9hdCB3cml0dGVuIiwgYyA9PSA5MDg3LjQ1NmYpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlRmxvYXR0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlRmxvYXQoZmxvYXQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUZsb2F0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUZsb2F0RigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtLndyaXRlRmxvYXQoZmxvYXQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy53cml0ZUZsb2F0KDkwODcuNDU2Zik7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgZmxvYXQgYyA9IGRpcy5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGZsb2F0IHdyaXR0ZW4iLCBjID09IDkwODcuNDU2Zik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVGbG9hdHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZUludChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUludEkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZUludChpbnQpCi0JCXRyeSB7Ci0JCQlvcy53cml0ZUludCg5MDg3NTg5KTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlpbnQgYyA9IGRpcy5yZWFkSW50KCk7Ci0JCQlkaXMuY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGludCB3cml0dGVuIiwgOTA4NzU4OSwgYyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVJbnQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZUludChpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlSW50IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJbnRJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGVJbnQoaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVJbnQoOTA4NzU4OSk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgb3BlbkRhdGFJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgaW50IGMgPSBkaXMucmVhZEludCgpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBpbnQgd3JpdHRlbiIsIDkwODc1ODksIGMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlSW50IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSN3cml0ZUxvbmcobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTG9uZ0ooKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZUxvbmcobG9uZykKLQkJdHJ5IHsKLQkJCW9zLndyaXRlTG9uZyg5MDg3NTU1NTU0NTZMKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlsb25nIGMgPSBkaXMucmVhZExvbmcoKTsKLQkJCWRpcy5jbG9zZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbG9uZyB3cml0dGVuIiwgOTA4NzU1NTU1NDU2TCwgYyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVMb25nIHRlc3QiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGVMb25nKGxvbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlTG9uZyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMb25nSigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtLndyaXRlTG9uZyhsb25nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Mud3JpdGVMb25nKDkwODc1NTU1NTQ1NkwpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGxvbmcgYyA9IGRpcy5yZWFkTG9uZygpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBsb25nIHdyaXR0ZW4iLCA5MDg3NTU1NTU0NTZMLCBjKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZUxvbmcgdGVzdCIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlU2hvcnQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVTaG9ydEkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZVNob3J0KGludCkKLQkJdHJ5IHsKLQkJCW9zLndyaXRlU2hvcnQoKHNob3J0KSA5MDg3KTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcGVuRGF0YUlucHV0U3RyZWFtKCk7Ci0JCQlzaG9ydCBjID0gZGlzLnJlYWRTaG9ydCgpOwotCQkJZGlzLmNsb3NlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzaG9ydCB3cml0dGVuIiwgOTA4NywgYyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVTaG9ydCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlU2hvcnQoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZVNob3J0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVTaG9ydEkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZVNob3J0KGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlU2hvcnQoKHNob3J0KSA5MDg3KTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBzaG9ydCBjID0gZGlzLnJlYWRTaG9ydCgpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzaG9ydCB3cml0dGVuIiwgOTA4NywgYyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGVTaG9ydCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0jd3JpdGVVVEYoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlVVRGTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbS53cml0ZVVURihqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJb3Mud3JpdGVVVEYodW5paHcpOwotCQkJb3MuY2xvc2UoKTsKLQkJCW9wZW5EYXRhSW5wdXRTdHJlYW0oKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byB3cml0ZSBzdHJpbmcgaW4gVVRGIGZvcm1hdCIsCi0JCQkJCWRpcy5hdmFpbGFibGUoKSA9PSB1bmlody5sZW5ndGgoKSArIDIpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN0cmluZyByZXR1cm5lZCIsIGRpcy5yZWFkVVRGKCkuZXF1YWxzKHVuaWh3KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlVVRGIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtI3dyaXRlVVRGKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlVVRGIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZVVURkxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0ud3JpdGVVVEYoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLndyaXRlVVRGKHVuaWh3KTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuRGF0YUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gd3JpdGUgc3RyaW5nIGluIFVURiBmb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICBkaXMuYXZhaWxhYmxlKCkgPT0gdW5paHcubGVuZ3RoKCkgKyAyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBzdHJpbmcgcmV0dXJuZWQiLCBkaXMucmVhZFVURigpLmVxdWFscyh1bmlodykpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZVVURiIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgb3BlbkRhdGFJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKSk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBvcGVuRGF0YUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJvcyk7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYm9zKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQkJdHJ5IHsKLQkJCWlmIChvcyAhPSBudWxsKQotCQkJCW9zLmNsb3NlKCk7Ci0JCQlpZiAoZGlzICE9IG51bGwpCi0JCQkJZGlzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoZGlzICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9FT0ZFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRU9GRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDVkNGExYjguLmU1Mjg3ZDggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9FT0ZFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0VPRkV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNTUgKzE3LDc1IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhFT0ZFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEVPRkV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRU9GRXhjZXB0aW9uI0VPRkV4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRU9GRXhjZXB0aW9uKCkKLQkJdHJ5IHsKLQkJCW5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzFdKSkKLQkJCQkJLnJlYWRTaG9ydCgpOwotCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBFT0ZFeGNlcHRpb24gdGVzdCIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRU9GRXhjZXB0aW9uI0VPRkV4Y2VwdGlvbigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEVPRkV4Y2VwdGlvbigpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkVPRkV4Y2VwdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRU9GRXhjZXB0aW9uKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzFdKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlYWRTaG9ydCgpOworICAgICAgICB9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBFT0ZFeGNlcHRpb24gdGVzdCIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5FT0ZFeGNlcHRpb24jRU9GRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5FT0ZFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkJdHJ5IHsKLQkJCW5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzFdKSkKLQkJCQkJLnJlYWRTaG9ydCgpOwotCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBFT0ZFeGNlcHRpb24gdGVzdCIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRU9GRXhjZXB0aW9uI0VPRkV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBFT0ZFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRU9GRXhjZXB0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5FT0ZFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzFdKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlYWRTaG9ydCgpOworICAgICAgICB9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBFT0ZFeGNlcHRpb24gdGVzdCIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlRGVzY3JpcHRvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlRGVzY3JpcHRvclRlc3QuamF2YQppbmRleCBiNzFhNGNkLi4yMTFhZjZmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZURlc2NyaXB0b3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVEZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwpAQCAtMjQsMzQgKzI4LDQ5IEBACiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhGaWxlRGVzY3JpcHRvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsZURlc2NyaXB0b3JUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwbGF0Zm9ybUlkID0gIkpESyIKLQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLnZlcnNpb24iKS5yZXBsYWNlKCcuJywgJy0nKTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxhdGZvcm1JZCA9ICJKREsiCisgICAgICAgICAgICArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZXJzaW9uIikucmVwbGFjZSgnLicsICctJyk7CiAKLQlGaWxlT3V0cHV0U3RyZWFtIGZvczsKKyAgICBGaWxlT3V0cHV0U3RyZWFtIGZvczsKIAotCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG9zOworICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG9zOwogCi0JRmlsZUlucHV0U3RyZWFtIGZpczsKKyAgICBGaWxlSW5wdXRTdHJlYW0gZmlzOwogCi0JRmlsZSBmOworICAgIEZpbGUgZjsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yI0ZpbGVEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpCi0JCUZpbGVEZXNjcmlwdG9yIGZkID0gbmV3IEZpbGVEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgRmlsZURlc2NyaXB0b3IiLAotCQkJCWZkIGluc3RhbmNlb2YgRmlsZURlc2NyaXB0b3IpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlRGVzY3JpcHRvciNGaWxlRGVzY3JpcHRvcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEZpbGVEZXNjcmlwdG9yKCkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZURlc2NyaXB0b3IiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKQorICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IG5ldyBGaWxlRGVzY3JpcHRvcigpOworICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIEZpbGVEZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICAgICBmZCBpbnN0YW5jZW9mIEZpbGVEZXNjcmlwdG9yKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlRGVzY3JpcHRvciNzeW5jKCkKLQkgKi8KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlRGVzY3JpcHRvciNzeW5jKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTeW5jRmFpbGVkRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzeW5jIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCiAgICAgICAgcHVibGljIHZvaWQgdGVzdF9zeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsZURlc2NyaXB0b3Iuc3luYygpCisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsZURlc2NyaXB0b3Iuc3luYygpCiAgICAgICAgIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJmZCIgKyBwbGF0Zm9ybUlkICsgIi50c3QiKTsKICAgICAgICAgZi5kZWxldGUoKTsKICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZi5nZXRQYXRoKCkpOwpAQCAtNzMsNTggKzkyLDY1IEBACiAgICAgICAgIGZkID0gcmFmLmdldEZEKCk7IAogICAgICAgICBmZC5zeW5jKCk7CiAgICAgICAgIHJhZi5jbG9zZSgpOwotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlRGVzY3JpcHRvciN2YWxpZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF92YWxpZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWxlRGVzY3JpcHRvci52YWxpZCgpCi0JCXRyeSB7Ci0JCQlmID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLCAiZmQudHN0Iik7Ci0JCQlmLmRlbGV0ZSgpOwotCQkJb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZgotCQkJCQkuZ2V0UGF0aCgpKSwgNDA5Nik7Ci0JCQlGaWxlRGVzY3JpcHRvciBmZCA9IGZvcy5nZXRGRCgpOwotCQkJYXNzZXJ0VHJ1ZSgiVmFsaWQgZmQgcmV0dXJuZWQgZmFsc2UiLCBmZC52YWxpZCgpKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbnZhbGlkIGZkIHJldHVybmVkIHRydWUiLCAhZmQudmFsaWQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZURlc2NyaXB0b3IjdmFsaWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB2YWxpZCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ2YWxpZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbGlkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLnZhbGlkKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJmZC50c3QiKTsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICBvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmCisgICAgICAgICAgICAgICAgICAgIC5nZXRQYXRoKCkpLCA0MDk2KTsKKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gZm9zLmdldEZEKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBmZCByZXR1cm5lZCBmYWxzZSIsIGZkLnZhbGlkKCkpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkludmFsaWQgZmQgcmV0dXJuZWQgdHJ1ZSIsICFmZC52YWxpZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlvcy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlmaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJZm9zLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCWYuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBkb25lU3VpdGUoKSB7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGRvbmVTdWl0ZSgpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZUlucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA1ZmVlY2VhLi5jZWYzZjJkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZUlucHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtMjcsMTc4ICszMiwyNTAgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9QbGF0Zm9ybUZpbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRmlsZUlucHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGaWxlSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCXB1YmxpYyBTdHJpbmcgZmlsZU5hbWU7CisgICAgcHVibGljIFN0cmluZyBmaWxlTmFtZTsKIAotCXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBpczsKKyAgICBwcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaXM7CiAKLQlieXRlW10gaWJ1ZiA9IG5ldyBieXRlWzQwOTZdOworICAgIGJ5dGVbXSBpYnVmID0gbmV3IGJ5dGVbNDA5Nl07CiAKLQlwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9GaWxlSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9pb19GaWxlT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9GaWxlSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9pb19GaWxlT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNGaWxlSW5wdXRTdHJlYW0oamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oamF2YS5pby5GaWxlKQotCQl0cnkgewotCQkJamF2YS5pby5GaWxlIGYgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKTsKLQkJCWlzID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGYpOwotCQkJaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBjcmVhdGUgRmlsZUlucHV0U3RyZWFtIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNGaWxlSW5wdXRTdHJlYW0oamF2YS5pby5GaWxlKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uICYgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlSW5wdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShqYXZhLmlvLkZpbGUpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoZmlsZU5hbWUpOworICAgICAgICAgICAgaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZik7CisgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBGaWxlSW5wdXRTdHJlYW0gOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI0ZpbGVJbnB1dFN0cmVhbShqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlRGVzY3JpcHRvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0JCXRyeSB7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZvcy5nZXRGRCgpKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJZmlzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGNvbnN0cmN1dG9yIHRlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNGaWxlSW5wdXRTdHJlYW0oamF2YS5pby5GaWxlRGVzY3JpcHRvcikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZUlucHV0U3RyZWFtIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZURlc2NyaXB0b3IuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGVEZXNjcmlwdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oamF2YS5pby5GaWxlRGVzY3JpcHRvcikKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZm9zLmdldEZEKCkpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgY29uc3RyY3V0b3IgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0jRmlsZUlucHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKLQkJdHJ5IHsKLQkJCWlzID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCWlzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gY3JlYXRlIEZpbGVJbnB1dFN0cmVhbSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI0ZpbGVJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uICYgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlSW5wdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gY3JlYXRlIEZpbGVJbnB1dFN0cmVhbSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbS5hdmFpbGFibGUoKQotCQl0cnkgewotCQkJaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMiLCBpcwotCQkJCQkuYXZhaWxhYmxlKCkgPT0gZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGF2YWlsYWJsZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNhdmFpbGFibGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJhdmFpbGFibGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfYXZhaWxhYmxlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtLmF2YWlsYWJsZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGF2YWlsYWJsZSBieXRlcyIsIGlzCisgICAgICAgICAgICAgICAgICAgIC5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgYXZhaWxhYmxlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtLmNsb3NlKCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0jY2xvc2UoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjbG9zZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0uY2xvc2UoKQogCi0JCXRyeSB7Ci0JCQlpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBhdHRlbXB0aW5nIHRvIGNsb3NlIHN0cmVhbSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gYXR0ZW1wdGluZyB0byBjbG9zZSBzdHJlYW0gOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIDsKIAotCQl0cnkgewotCQkJaXMucmVhZCgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJBYmxlIHRvIHJlYWQgZnJvbSBjbG9zZWQgc3RyZWFtIik7Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMucmVhZCgpOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJBYmxlIHRvIHJlYWQgZnJvbSBjbG9zZWQgc3RyZWFtIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI2dldEZEKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEZEKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlRGVzY3JpcHRvcgotCQkvLyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbS5nZXRGRCgpCi0JCXRyeSB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI2dldEZEKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0RkQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGRCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZURlc2NyaXB0b3IKKyAgICAgICAgLy8gamF2YS5pby5GaWxlSW5wdXRTdHJlYW0uZ2V0RkQoKQorICAgICAgICB0cnkgewogCi0JCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbnZhbGlkIGZkIiwgZmlzLmdldEZEKCkudmFsaWQoKSk7Ci0JCQlmaXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIlJldHVybmVkIGludmFsaWQgZmQiLCAhZmlzLmdldEZEKCkudmFsaWQoKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDb3VsZCBub3QgZmluZCA6ICIgKyBmaWxlTmFtZSk7Ci0JCX0KKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGludmFsaWQgZmQiLCBmaXMuZ2V0RkQoKS52YWxpZCgpKTsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW52YWxpZCBmZCIsICFmaXMuZ2V0RkQoKS52YWxpZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIDogIiArIGZpbGVOYW1lKTsKKyAgICAgICAgfQogCi0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0ucmVhZCgpCi0JCXRyeSB7Ci0JCQlpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlpbnQgYyA9IGlzLnJlYWQoKTsKLQkJCWlzLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKCJyZWFkIHJldHVybmVkIGluY29ycmVjdCBjaGFyIiwgYyA9PSBmaWxlU3RyaW5nCi0JCQkJCS5jaGFyQXQoMCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0ucmVhZCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7CisgICAgICAgICAgICBpbnQgYyA9IGlzLnJlYWQoKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJyZWFkIHJldHVybmVkIGluY29ycmVjdCBjaGFyIiwgYyA9PSBmaWxlU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC5jaGFyQXQoMCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI3JlYWQoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSkKLQkJYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsxMDBdOwotCQl0cnkgewotCQkJaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJaXMuc2tpcCgzMDAwKTsKLQkJCWlzLnJlYWQoYnVmMSk7Ci0JCQlpcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBkYXRhIiwgbmV3IFN0cmluZyhidWYxLCAwLAotCQkJCQlidWYxLmxlbmd0aCkuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDMwMDAsIDMxMDApKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI3JlYWQoYnl0ZVtdKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10pCisgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGlzLnNraXAoMzAwMCk7CisgICAgICAgICAgICBpcy5yZWFkKGJ1ZjEpOworICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgZGF0YSIsIG5ldyBTdHJpbmcoYnVmMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgYnVmMS5sZW5ndGgpLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygzMDAwLCAzMTAwKSkpOwogCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0ucmVhZChieXRlIFtdLCBpbnQsIGludCkKLQkJYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsxMDBdOwotCQl0cnkgewotCQkJaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJaXMuc2tpcCgzMDAwKTsKLQkJCWlzLnJlYWQoYnVmMSwgMCwgYnVmMS5sZW5ndGgpOwotCQkJaXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgZGF0YSIsIG5ldyBTdHJpbmcoYnVmMSwgMCwKLQkJCQkJYnVmMS5sZW5ndGgpLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygzMDAwLCAzMTAwKSkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sIGludCwgaW50KQorICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7CisgICAgICAgICAgICBpcy5za2lwKDMwMDApOworICAgICAgICAgICAgaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7CisgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBkYXRhIiwgbmV3IFN0cmluZyhidWYxLCAwLAorICAgICAgICAgICAgICAgICAgICBidWYxLmxlbmd0aCkuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDMwMDAsIDMxMDApKSk7CiAKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgcmVhZChieXRlW10sIGludCwgaW50KSBtZXRob2QgIiArCisgICAgICAgICAgICAgICAgICAgICJ0aHJvd3MgSU9FeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kQklJX0lPRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMDBdOwogICAgICAgICB0cnkgewpAQCAtMjg0LDYgKzM2MSwxNCBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCByZWFkKGJ5dGVbXSwgaW50LCBpbnQpIG1ldGhvZCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJEJJSV9OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBidWYgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMzAwLDYgKzM4NSwxNCBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCByZWFkKGJ5dGVbXSwgaW50LCBpbnQpIG1ldGhvZCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kQklJX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAwMF07CiAgICAgICAgIHRyeSB7CkBAIC0zMTQsMjcgKzQwNyw0MSBAQAogICAgICAgICB9CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbS5za2lwKGxvbmcpCi0JCWJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTBdOwotCQl0cnkgewotCQkJaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJaXMuc2tpcCgxMDAwKTsKLQkJCWlzLnJlYWQoYnVmMSwgMCwgYnVmMS5sZW5ndGgpOwotCQkJaXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBza2lwIHRvIGNvcnJlY3QgcG9zaXRpb24iLCBuZXcgU3RyaW5nKGJ1ZjEsCi0JCQkJCTAsIGJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMTAwMCwgMTAxMCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2tpcCB0ZXN0ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI3NraXAobG9uZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2tpcCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9za2lwSigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0uc2tpcChsb25nKQorICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGlzLnNraXAoMTAwMCk7CisgICAgICAgICAgICBpcy5yZWFkKGJ1ZjEsIDAsIGJ1ZjEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gc2tpcCB0byBjb3JyZWN0IHBvc2l0aW9uIiwgbmV3IFN0cmluZyhidWYxLAorICAgICAgICAgICAgICAgICAgICAwLCBidWYxLmxlbmd0aCkuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDEwMDAsIDEwMTApKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNraXAgdGVzdCAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhlIHRlc3QgaWQgcmVncmVzc2lvbiBmb3IgcmVhZChieXRlW10sIGludCwgaW50KSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWdyZXNzaW9uTk5OKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS00MzQKICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7CkBAIC0zNjksNiArNDc2LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI0ZpbGVJbnB1dFN0cmVhbShTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlSW5wdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX0xTdHJpbmdfV2l0aFNlY3VyaXR5TWFuYWdlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGQgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CiAgICAgICAgIHRyeSB7CkBAIC0zODYsNiArNTAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtI3NraXAobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHNraXAobG9uZykgbWV0aG9kIHRocm93cyAiICsKKyAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIG5lZ2F0aXZlICIgKworICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2tpcCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcE5lZ2F0aXZlQXJndW1lbnRKKCkgdGhyb3dzIElPRXhjZXB0aW9uewogICAgICAgICAKICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7CkBAIC00MDYsMzMgKzUyOSwzMyBAQAogICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAogICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgogICAgICAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCQl0cnkgewotCQkJZmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ci0JCQlTdHJpbmcgc2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCQkJaWYgKGZpbGVOYW1lLmNoYXJBdChmaWxlTmFtZS5sZW5ndGgoKSAtIDEpID09IHNlcGFyYXRvci5jaGFyQXQoMCkpCi0JCQkJZmlsZU5hbWUgPSBTdXBwb3J0X1BsYXRmb3JtRmlsZS5nZXROZXdQbGF0Zm9ybUZpbGUoZmlsZU5hbWUsCi0JCQkJCQkiaW5wdXQudHN0Iik7Ci0JCQllbHNlCi0JCQkJZmlsZU5hbWUgPSBTdXBwb3J0X1BsYXRmb3JtRmlsZS5nZXROZXdQbGF0Zm9ybUZpbGUoZmlsZU5hbWUKLQkJCQkJCSsgc2VwYXJhdG9yLCAiaW5wdXQudHN0Iik7Ci0JCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBmb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCWZvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIHNldHVwIik7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOworICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmNoYXJBdChmaWxlTmFtZS5sZW5ndGgoKSAtIDEpID09IHNlcGFyYXRvci5jaGFyQXQoMCkpCisgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBTdXBwb3J0X1BsYXRmb3JtRmlsZS5nZXROZXdQbGF0Zm9ybUZpbGUoZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQudHN0Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBTdXBwb3J0X1BsYXRmb3JtRmlsZS5nZXROZXdQbGF0Zm9ybUZpbGUoZmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2VwYXJhdG9yLCAiaW5wdXQudHN0Iik7CisgICAgICAgICAgICBqYXZhLmlvLk91dHB1dFN0cmVhbSBmb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGZvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIHNldHVwIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCW5ldyBGaWxlKGZpbGVOYW1lKS5kZWxldGUoKTsKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgbmV3IEZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOwogCi0JfQorICAgIH0KIH0KIAogY2xhc3MgTW9ja1NlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7ICAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDg3ZTIwZDQuLjQ2YTI3YWEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMzggKzE3LDU4IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRmlsZU5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGaWxlTm90Rm91bmRFeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiNGaWxlTm90Rm91bmRFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlTm90Rm91bmRFeGNlcHRpb24iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlID0gbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0TWVzc2FnZSgpKTsKICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24jRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQlTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgZm91bmQgZmlsZTogOTovLzAvL2wiOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiNGaWxlTm90Rm91bmRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ2Fubm90IGZvdW5kIGZpbGU6IDk6Ly8wLy9sIjsKICAgICAgICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUgPSBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICAgICBhc3NlcnRTYW1lKG1lc3NhZ2UsIGUuZ2V0TWVzc2FnZSgpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IGFmYTNjN2QuLjQ2NDBhZDggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMTcgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRmlsZU91dHB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsZU91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHVibGljIFN0cmluZyBmaWxlTmFtZTsKQEAgLTM5LDYgKzQ1LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSNGaWxlT3V0cHV0U3RyZWFtKGphdmEuaW8uRmlsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiAmIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZU91dHB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGphdmEuaW8uRmlsZSkKICAgICAgICAgZiA9IG5ldyBGaWxlKGZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSwgImZvcy50c3QiKTsKQEAgLTQ4LDYgKzYxLDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSNGaWxlT3V0cHV0U3RyZWFtKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkZpbGVPdXRwdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGVEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oamF2YS5pby5GaWxlRGVzY3JpcHRvcikKICAgICAgICAgZiA9IG5ldyBGaWxlKGZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSwgImZvcy50c3QiKTsKQEAgLTY0LDYgKzg0LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSNGaWxlT3V0cHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gJiBGaWxlTm90Rm91bmRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkZpbGVPdXRwdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIGYgPSBuZXcgRmlsZShmaWxlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIiksICJmb3MudHN0Iik7CkBAIC03NSw2ICsxMDIsMTMgQEAKICAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtI0ZpbGVPdXRwdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiAmIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZU91dHB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ1ooKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQogICAgICAgICBmID0gbmV3IGphdmEuaW8uRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLCAiZm9zLnRzdCIpOwpAQCAtOTQsNiArMTI4LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSNjbG9zZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbS5jbG9zZSgpCiAKQEAgLTExMyw2ICsxNTQsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtI2dldEZEKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0RkQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGRCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlRGVzY3JpcHRvcgogICAgICAgICAvLyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0uZ2V0RkQoKQpAQCAtMTI3LDYgKzE3NSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbS53cml0ZShieXRlIFtdKQogICAgICAgICBmID0gbmV3IGphdmEuaW8uRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLCAib3V0cHV0LnRzdCIpOwpAQCAtMTQyLDYgKzE5NywxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEJJSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZSBbXSwgaW50LAogICAgICAgICAvLyBpbnQpCkBAIC0xNTgsNiArMjIwLDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSN3cml0ZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0ud3JpdGUoaW50KQogICAgICAgICBmID0gbmV3IGphdmEuaW8uRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLCAib3V0cHV0LnRzdCIpOwpAQCAtMTcwLDYgKzIzOSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQklJMigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQzNwogCkBAIC0yMTEsNiArMjg3LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODM0CiAgICAgICAgIC8vbm8gZXhjZXB0aW9uIGV4cGVjdGVkCkBAIC0yMjAsMjAgKzMwMywyNyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0jZ2V0Q2hhbm5lbCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldENoYW5uZWwoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0Q2hhbm5lbCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENoYW5uZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS01MDgKLQkJRmlsZSB0bXBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiRmlsZU91dHB1dFN0cmVhbSIsICJ0bXAiKTsKLQkJdG1wZmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBmaWxlKTsKLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMF07Ci0JCWZvciAoaW50IGkgPSAxMDsgaSA8IGIubGVuZ3RoOyBpKyspIHsKLQkJCWJbaV0gPSAoYnl0ZSkgaTsKLQkJfQotCQlmb3Mud3JpdGUoYik7Ci0JCWZvcy5mbHVzaCgpOwotCQlmb3MuY2xvc2UoKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wZmlsZSwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygxMCwgZi5nZXRDaGFubmVsKCkucG9zaXRpb24oKSk7IAorICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTUwOAorICAgICAgICBGaWxlIHRtcGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJGaWxlT3V0cHV0U3RyZWFtIiwgInRtcCIpOworICAgICAgICB0bXBmaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcGZpbGUpOworICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDEwOyBpIDwgYi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYltpXSA9IChieXRlKSBpOworICAgICAgICB9CisgICAgICAgIGZvcy53cml0ZShiKTsKKyAgICAgICAgZm9zLmZsdXNoKCk7CisgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBmaWxlLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBmLmdldENoYW5uZWwoKS5wb3NpdGlvbigpKTsgCiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZVBlcm1pc3Npb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZVBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggY2Q2M2Q4Ny4uMDU3N2E1NSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMTcsMzkgKzE3LDUzIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZVBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhGaWxlUGVybWlzc2lvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsZVBlcm1pc3Npb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCUZpbGVQZXJtaXNzaW9uIHJlYWRBbGxGaWxlcyA9IG5ldyBGaWxlUGVybWlzc2lvbigiPDxBTEwgRklMRVM+PiIsICJyZWFkIik7CisgICAgRmlsZVBlcm1pc3Npb24gcmVhZEFsbEZpbGVzID0gbmV3IEZpbGVQZXJtaXNzaW9uKCI8PEFMTCBGSUxFUz4+IiwgInJlYWQiKTsKIAotCUZpbGVQZXJtaXNzaW9uIGFsc29SZWFkQWxsRmlsZXMgPSBuZXcgRmlsZVBlcm1pc3Npb24oIjw8QUxMIEZJTEVTPj4iLAotCQkJInJlYWQiKTsKKyAgICBGaWxlUGVybWlzc2lvbiBhbHNvUmVhZEFsbEZpbGVzID0gbmV3IEZpbGVQZXJtaXNzaW9uKCI8PEFMTCBGSUxFUz4+IiwKKyAgICAgICAgICAgICJyZWFkIik7CiAKLQlGaWxlUGVybWlzc2lvbiBhbGxJbkN1cnJlbnQgPSBuZXcgRmlsZVBlcm1pc3Npb24oIioiLAotCQkJInJlYWQsIHdyaXRlLCBleGVjdXRlLGRlbGV0ZSIpOworICAgIEZpbGVQZXJtaXNzaW9uIGFsbEluQ3VycmVudCA9IG5ldyBGaWxlUGVybWlzc2lvbigiKiIsCisgICAgICAgICAgICAicmVhZCwgd3JpdGUsIGV4ZWN1dGUsZGVsZXRlIik7CiAKLQlGaWxlUGVybWlzc2lvbiByZWFkSW5DdXJyZW50ID0gbmV3IEZpbGVQZXJtaXNzaW9uKCIqIiwgInJlYWQiKTsKKyAgICBGaWxlUGVybWlzc2lvbiByZWFkSW5DdXJyZW50ID0gbmV3IEZpbGVQZXJtaXNzaW9uKCIqIiwgInJlYWQiKTsKIAotCUZpbGVQZXJtaXNzaW9uIHJlYWRJbkZpbGUgPSBuZXcgRmlsZVBlcm1pc3Npb24oImFGaWxlLmZpbGUiLCAicmVhZCIpOworICAgIEZpbGVQZXJtaXNzaW9uIHJlYWRJbkZpbGUgPSBuZXcgRmlsZVBlcm1pc3Npb24oImFGaWxlLmZpbGUiLCAicmVhZCIpOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZVBlcm1pc3Npb24jRmlsZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKLQkJLy8gamF2YS5sYW5nLlN0cmluZykKLQkJYXNzZXJ0VHJ1ZSgiVXNlZCB0byB0ZXN0IiwgdHJ1ZSk7Ci0JCUZpbGVQZXJtaXNzaW9uIGNvbnN0cnVjdEZpbGUgPSBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QgY29uc3RydWN0b3IiLAotCQkJCSJ3cml0ZSIpOwotCQlhc3NlcnRFcXVhbHMoImFjdGlvbiBnaXZlbiB0byB0aGUgY29uc3RydWN0b3IgZGlkIG5vdCBjb3JyZXNwb25kIC0gY29uc3RydWN0b3IgZmFpbGVkIiwKLQkJCQkid3JpdGUiLCBjb25zdHJ1Y3RGaWxlLmdldEFjdGlvbnMoKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkJIm5hbWUgZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjb3RyIGRpZCBub3QgY29ycmVzcG9uZCAtIGNvbnN0cnVjb3RyIGZhaWxlZCIsCi0JCQkJY29uc3RydWN0RmlsZS5nZXROYW1lKCkgPT0gInRlc3QgY29uc3RydWN0b3IiKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlUGVybWlzc2lvbiNGaWxlUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBGaWxlUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlUGVybWlzc2lvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKKyAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVXNlZCB0byB0ZXN0IiwgdHJ1ZSk7CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGNvbnN0cnVjdEZpbGUgPSBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgICJ3cml0ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFjdGlvbiBnaXZlbiB0byB0aGUgY29uc3RydWN0b3IgZGlkIG5vdCBjb3JyZXNwb25kIC0gY29uc3RydWN0b3IgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAid3JpdGUiLCBjb25zdHJ1Y3RGaWxlLmdldEFjdGlvbnMoKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIm5hbWUgZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjb3RyIGRpZCBub3QgY29ycmVzcG9uZCAtIGNvbnN0cnVjb3RyIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgY29uc3RydWN0RmlsZS5nZXROYW1lKCkgPT0gInRlc3QgY29uc3RydWN0b3IiKTsKIAogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTA1MAogICAgICAgICB0cnkgewpAQCAtNzIsMTQ5ICs4NiwxODQgQEAKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIEV4cGVjdGVkCiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZVBlcm1pc3Npb24jZ2V0QWN0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRBY3Rpb25zKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uLmdldEFjdGlvbnMoKQotCQlhc3NlcnRFcXVhbHMoImdldEFjdGlvbnMgc2hvdWxkIGhhdmUgcmV0dXJuZWQgb25seSByZWFkIiwgInJlYWQiLCByZWFkQWxsRmlsZXMKLQkJCQkuZ2V0QWN0aW9ucygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRBY3Rpb25zIHNob3VsZCBoYXZlIHJldHVybmVkIGFsbCBhY3Rpb25zIiwgInJlYWQsd3JpdGUsZXhlY3V0ZSxkZWxldGUiLCBhbGxJbkN1cnJlbnQKLQkJCQkuZ2V0QWN0aW9ucygpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZVBlcm1pc3Npb24jZ2V0QWN0aW9ucygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEFjdGlvbnMoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0QWN0aW9ucyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBY3Rpb25zKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uLmdldEFjdGlvbnMoKQorICAgICAgICBhc3NlcnRFcXVhbHMoImdldEFjdGlvbnMgc2hvdWxkIGhhdmUgcmV0dXJuZWQgb25seSByZWFkIiwgInJlYWQiLCByZWFkQWxsRmlsZXMKKyAgICAgICAgICAgICAgICAuZ2V0QWN0aW9ucygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRBY3Rpb25zIHNob3VsZCBoYXZlIHJldHVybmVkIGFsbCBhY3Rpb25zIiwgInJlYWQsd3JpdGUsZXhlY3V0ZSxkZWxldGUiLCBhbGxJbkN1cnJlbnQKKyAgICAgICAgICAgICAgICAuZ2V0QWN0aW9ucygpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlUGVybWlzc2lvbiNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCQkvLyB0ZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlUGVybWlzc2lvbi5lcXVhbHMoKQotCQlhc3NlcnRUcnVlKAotCQkJCSJyZXR1cm5lZCBmYWxzZSB3aGVuIHR3byBpbnN0YW5jZSBvZiBGaWxlUGVybWlzc2lvbiBpcyBlcXVhbCIsCi0JCQkJcmVhZEFsbEZpbGVzLmVxdWFscyhhbHNvUmVhZEFsbEZpbGVzKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkJInJldHVybmVkIHRydWUgd2hlbiB0d28gaW5zdGFuY2UJb2YgRmlsZVBlcm1pc3Npb24gaXMgbm90IGVxdWFsIiwKLQkJCQkhKHJlYWRJbkN1cnJlbnQuZXF1YWxzKHJlYWRJbkZpbGUpKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImVxdWFscyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CisgICAgICAgIC8vIHRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uLmVxdWFscygpCisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgInJldHVybmVkIGZhbHNlIHdoZW4gdHdvIGluc3RhbmNlIG9mIEZpbGVQZXJtaXNzaW9uIGlzIGVxdWFsIiwKKyAgICAgICAgICAgICAgICByZWFkQWxsRmlsZXMuZXF1YWxzKGFsc29SZWFkQWxsRmlsZXMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAicmV0dXJuZWQgdHJ1ZSB3aGVuIHR3byBpbnN0YW5jZSAgICBvZiBGaWxlUGVybWlzc2lvbiBpcyBub3QgZXF1YWwiLAorICAgICAgICAgICAgICAgICEocmVhZEluQ3VycmVudC5lcXVhbHMocmVhZEluRmlsZSkpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlUGVybWlzc2lvbiNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2ltcGxpZXNMamF2YV9zZWN1cml0eV9QZXJtaXNzaW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgotCQkvLyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uLmltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCB0cnVlIGZvciBub24tc3Vic2V0IG9mIGFjdGlvbnMiLCAhcmVhZEFsbEZpbGVzCi0JCQkJLmltcGxpZXMoYWxsSW5DdXJyZW50KSk7Ci0JCWFzc2VydFRydWUoIlJldHVybmVkIHRydWUgZm9yIG5vbi1zdWJzZXQgb2YgZmlsZXMiLCAhYWxsSW5DdXJyZW50Ci0JCQkJLmltcGxpZXMocmVhZEFsbEZpbGVzKSk7Ci0JCWFzc2VydFRydWUoIlJldHVybmVkIGZhbHNlIGZvciBzdWJzZXQgb2YgYWN0aW9ucyIsIGFsbEluQ3VycmVudAotCQkJCS5pbXBsaWVzKHJlYWRJbkN1cnJlbnQpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgZmFsc2UgZm9yIHN1YnNldCBvZiBmaWxlcyIsIHJlYWRBbGxGaWxlcwotCQkJCS5pbXBsaWVzKHJlYWRJbkN1cnJlbnQpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgZmFsc2UgZm9yIHN1YnNldCBvZiBmaWxlcyBhbmQgYWN0aW9ucyIsCi0JCQkJYWxsSW5DdXJyZW50LmltcGxpZXMocmVhZEluRmlsZSkpOwotCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBmYWxzZSBmb3IgZXF1YWwgRmlsZVBlcm1pc3Npb25zIiwgcmVhZEFsbEZpbGVzCi0JCQkJLmltcGxpZXMoYWxzb1JlYWRBbGxGaWxlcykpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uI2ltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImltcGxpZXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9pbXBsaWVzTGphdmFfc2VjdXJpdHlfUGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KKyAgICAgICAgLy8gamF2YS5pby5GaWxlUGVybWlzc2lvbi5pbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgdHJ1ZSBmb3Igbm9uLXN1YnNldCBvZiBhY3Rpb25zIiwgIXJlYWRBbGxGaWxlcworICAgICAgICAgICAgICAgIC5pbXBsaWVzKGFsbEluQ3VycmVudCkpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCB0cnVlIGZvciBub24tc3Vic2V0IG9mIGZpbGVzIiwgIWFsbEluQ3VycmVudAorICAgICAgICAgICAgICAgIC5pbXBsaWVzKHJlYWRBbGxGaWxlcykpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBmYWxzZSBmb3Igc3Vic2V0IG9mIGFjdGlvbnMiLCBhbGxJbkN1cnJlbnQKKyAgICAgICAgICAgICAgICAuaW1wbGllcyhyZWFkSW5DdXJyZW50KSk7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGZhbHNlIGZvciBzdWJzZXQgb2YgZmlsZXMiLCByZWFkQWxsRmlsZXMKKyAgICAgICAgICAgICAgICAuaW1wbGllcyhyZWFkSW5DdXJyZW50KSk7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGZhbHNlIGZvciBzdWJzZXQgb2YgZmlsZXMgYW5kIGFjdGlvbnMiLAorICAgICAgICAgICAgICAgIGFsbEluQ3VycmVudC5pbXBsaWVzKHJlYWRJbkZpbGUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgZmFsc2UgZm9yIGVxdWFsIEZpbGVQZXJtaXNzaW9ucyIsIHJlYWRBbGxGaWxlcworICAgICAgICAgICAgICAgIC5pbXBsaWVzKGFsc29SZWFkQWxsRmlsZXMpKTsKIAotCQlGaWxlUGVybWlzc2lvbiBmcDMgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi9ib2IvKiIucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKSwgInJlYWQsd3JpdGUiKTsKLQkJRmlsZVBlcm1pc3Npb24gZnA0ID0gbmV3IEZpbGVQZXJtaXNzaW9uKCIvYm9iLyIucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKSwgIndyaXRlIik7Ci0JCWFzc2VydFRydWUoInJldHVybmVkIHRydWUgZm9yIHNhbWUgZGlyIHVzaW5nICogYW5kIG5vdCAqIiwgIWZwMwotCQkJCS5pbXBsaWVzKGZwNCkpOwotCQlGaWxlUGVybWlzc2lvbiBmcDUgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi9ib2IvZmlsZSIucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKSwgIndyaXRlIik7Ci0JCWFzc2VydFRydWUoInJldHVybmVkIGZhbHNlIGZvciBzYW1lIGRpciB1c2luZyAqIGFuZCBmaWxlIiwgZnAzCi0JCQkJLmltcGxpZXMoZnA1KSk7CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZwMyA9IG5ldyBGaWxlUGVybWlzc2lvbigiL2JvYi8qIi5yZXBsYWNlKCcvJywKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpLCAicmVhZCx3cml0ZSIpOworICAgICAgICBGaWxlUGVybWlzc2lvbiBmcDQgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi9ib2IvIi5yZXBsYWNlKCcvJywKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpLCAid3JpdGUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgdHJ1ZSBmb3Igc2FtZSBkaXIgdXNpbmcgKiBhbmQgbm90ICoiLCAhZnAzCisgICAgICAgICAgICAgICAgLmltcGxpZXMoZnA0KSk7CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZwNSA9IG5ldyBGaWxlUGVybWlzc2lvbigiL2JvYi9maWxlIi5yZXBsYWNlKCcvJywKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpLCAid3JpdGUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgZmFsc2UgZm9yIHNhbWUgZGlyIHVzaW5nICogYW5kIGZpbGUiLCBmcDMKKyAgICAgICAgICAgICAgICAuaW1wbGllcyhmcDUpKTsKIAotCQlGaWxlUGVybWlzc2lvbiBmcDYgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi9ib2IvIi5yZXBsYWNlKCcvJywKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIpLCAicmVhZCx3cml0ZSIpOwotCQlGaWxlUGVybWlzc2lvbiBmcDcgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi9ib2IvKiIucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKSwgIndyaXRlIik7Ci0JCWFzc2VydFRydWUoInJldHVybmVkIGZhbHNlIGZvciBzYW1lIGRpciB1c2luZyBub3QgKiBhbmQgKiIsICFmcDYKLQkJCQkuaW1wbGllcyhmcDcpKTsKLQkJYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgZmFsc2UgZm9yIHNhbWUgc3ViZGlyIiwgZnA2LmltcGxpZXMoZnA0KSk7CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZwNiA9IG5ldyBGaWxlUGVybWlzc2lvbigiL2JvYi8iLnJlcGxhY2UoJy8nLAorICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhciksICJyZWFkLHdyaXRlIik7CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZwNyA9IG5ldyBGaWxlUGVybWlzc2lvbigiL2JvYi8qIi5yZXBsYWNlKCcvJywKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpLCAid3JpdGUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgZmFsc2UgZm9yIHNhbWUgZGlyIHVzaW5nIG5vdCAqIGFuZCAqIiwgIWZwNgorICAgICAgICAgICAgICAgIC5pbXBsaWVzKGZwNykpOworICAgICAgICBhc3NlcnRUcnVlKCJyZXR1cm5lZCBmYWxzZSBmb3Igc2FtZSBzdWJkaXIiLCBmcDYuaW1wbGllcyhmcDQpKTsKIAotCQlGaWxlUGVybWlzc2lvbiBmcDggPSBuZXcgRmlsZVBlcm1pc3Npb24oIi8iLnJlcGxhY2UoJy8nLAotCQkJCUZpbGUuc2VwYXJhdG9yQ2hhciksICJyZWFkLHdyaXRlIik7Ci0JCUZpbGVQZXJtaXNzaW9uIGZwOSA9IG5ldyBGaWxlUGVybWlzc2lvbigiLyIucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKSwgIndyaXRlIik7Ci0JCWFzc2VydFRydWUoInJldHVybmVkIGZhbHNlIGZvciBzYW1lIGRpciIsIGZwOC5pbXBsaWVzKGZwOSkpOworICAgICAgICBGaWxlUGVybWlzc2lvbiBmcDggPSBuZXcgRmlsZVBlcm1pc3Npb24oIi8iLnJlcGxhY2UoJy8nLAorICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhciksICJyZWFkLHdyaXRlIik7CisgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZwOSA9IG5ldyBGaWxlUGVybWlzc2lvbigiLyIucmVwbGFjZSgnLycsCisgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyKSwgIndyaXRlIik7CisgICAgICAgIGFzc2VydFRydWUoInJldHVybmVkIGZhbHNlIGZvciBzYW1lIGRpciIsIGZwOC5pbXBsaWVzKGZwOSkpOwogCi0JCUZpbGVQZXJtaXNzaW9uIGZwMTAgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi8iLnJlcGxhY2UoJy8nLAotCQkJCUZpbGUuc2VwYXJhdG9yQ2hhciksICJyZWFkLHdyaXRlIik7Ci0JCUZpbGVQZXJtaXNzaW9uIGZwMTEgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi8iLnJlcGxhY2UoJy8nLAotCQkJCUZpbGUuc2VwYXJhdG9yQ2hhciksICJ3cml0ZSIpOwotCQlhc3NlcnRUcnVlKCJyZXR1cm5lZCBmYWxzZSBmb3Igc2FtZSBkaXIiLCBmcDEwLmltcGxpZXMoZnAxMSkpOworICAgICAgICBGaWxlUGVybWlzc2lvbiBmcDEwID0gbmV3IEZpbGVQZXJtaXNzaW9uKCIvIi5yZXBsYWNlKCcvJywKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpLCAicmVhZCx3cml0ZSIpOworICAgICAgICBGaWxlUGVybWlzc2lvbiBmcDExID0gbmV3IEZpbGVQZXJtaXNzaW9uKCIvIi5yZXBsYWNlKCcvJywKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpLCAid3JpdGUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgZmFsc2UgZm9yIHNhbWUgZGlyIiwgZnAxMC5pbXBsaWVzKGZwMTEpKTsKIAotCQlGaWxlUGVybWlzc2lvbiBmcDEyID0gbmV3IEZpbGVQZXJtaXNzaW9uKCIvKiIucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKSwgInJlYWQsd3JpdGUiKTsKLQkJYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgZmFsc2UgZm9yIHNhbWUgZGlyIHVzaW5nICogYW5kIGRpciIsICFmcDEyCi0JCQkJLmltcGxpZXMoZnAxMCkpOwotCX0KKyAgICAgICAgRmlsZVBlcm1pc3Npb24gZnAxMiA9IG5ldyBGaWxlUGVybWlzc2lvbigiLyoiLnJlcGxhY2UoJy8nLAorICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhciksICJyZWFkLHdyaXRlIik7CisgICAgICAgIGFzc2VydFRydWUoInJldHVybmVkIGZhbHNlIGZvciBzYW1lIGRpciB1c2luZyAqIGFuZCBkaXIiLCAhZnAxMgorICAgICAgICAgICAgICAgIC5pbXBsaWVzKGZwMTApKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlUGVybWlzc2lvbiNuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKLQkJLy8gdGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVBlcm1pc3Npb24ubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24KLQkJY2hhciBzID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlUGVybWlzc2lvbiBwZXJtW10gPSBuZXcgRmlsZVBlcm1pc3Npb25bNF07Ci0JCXBlcm1bMF0gPSByZWFkQWxsRmlsZXM7Ci0JCXBlcm1bMV0gPSBhbGxJbkN1cnJlbnQ7Ci0JCXBlcm1bMl0gPSBuZXcgRmlsZVBlcm1pc3Npb24ocyArICJ0bXAiICsgcyArICJ0ZXN0IiArIHMgKyAiKiIsCi0JCQkJInJlYWQsd3JpdGUiKTsKLQkJcGVybVszXSA9IG5ldyBGaWxlUGVybWlzc2lvbihzICsgInRtcCIgKyBzICsgInRlc3QiICsgcwotCQkJCSsgImNvbGxlY3Rpb24uZmlsZSIsICJyZWFkIik7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZVBlcm1pc3Npb24jbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CisgICAgICAgIC8vIHRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uCisgICAgICAgIGNoYXIgcyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgRmlsZVBlcm1pc3Npb24gcGVybVtdID0gbmV3IEZpbGVQZXJtaXNzaW9uWzRdOworICAgICAgICBwZXJtWzBdID0gcmVhZEFsbEZpbGVzOworICAgICAgICBwZXJtWzFdID0gYWxsSW5DdXJyZW50OworICAgICAgICBwZXJtWzJdID0gbmV3IEZpbGVQZXJtaXNzaW9uKHMgKyAidG1wIiArIHMgKyAidGVzdCIgKyBzICsgIioiLAorICAgICAgICAgICAgICAgICJyZWFkLHdyaXRlIik7CisgICAgICAgIHBlcm1bM10gPSBuZXcgRmlsZVBlcm1pc3Npb24ocyArICJ0bXAiICsgcyArICJ0ZXN0IiArIHMKKyAgICAgICAgICAgICAgICArICJjb2xsZWN0aW9uLmZpbGUiLCAicmVhZCIpOwogCi0JCVBlcm1pc3Npb25Db2xsZWN0aW9uIGNvbGxlY3QgPSBwZXJtWzBdLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGVybS5sZW5ndGg7IGkrKykgewotCQkJY29sbGVjdC5hZGQocGVybVtpXSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgZmFsc2UgZm9yIHN1YnNldCBvZiBmaWxlcyIsIGNvbGxlY3QKLQkJCQkuaW1wbGllcyhuZXcgRmlsZVBlcm1pc3Npb24oIioiLCAid3JpdGUiKSkpOwotCQlhc3NlcnRUcnVlKCJyZXR1cm5lZCBmYWxzZSBmb3Igc3Vic2V0IG9mIG5hbWUgYW5kIGFjdGlvbiIsIGNvbGxlY3QKLQkJCQkuaW1wbGllcyhuZXcgRmlsZVBlcm1pc3Npb24ocyArICJ0bXAiLCAicmVhZCIpKSk7Ci0JCWFzc2VydFRydWUoInJldHVybmVkIHRydWUgZm9yIG5vbiBzdWJzZXQgb2YgZmlsZSBhbmQgYWN0aW9uIiwgY29sbGVjdAotCQkJCS5pbXBsaWVzKHJlYWRJbkZpbGUpKTsKKyAgICAgICAgUGVybWlzc2lvbkNvbGxlY3Rpb24gY29sbGVjdCA9IHBlcm1bMF0ubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJtLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2xsZWN0LmFkZChwZXJtW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJyZXR1cm5lZCBmYWxzZSBmb3Igc3Vic2V0IG9mIGZpbGVzIiwgY29sbGVjdAorICAgICAgICAgICAgICAgIC5pbXBsaWVzKG5ldyBGaWxlUGVybWlzc2lvbigiKiIsICJ3cml0ZSIpKSk7CisgICAgICAgIGFzc2VydFRydWUoInJldHVybmVkIGZhbHNlIGZvciBzdWJzZXQgb2YgbmFtZSBhbmQgYWN0aW9uIiwgY29sbGVjdAorICAgICAgICAgICAgICAgIC5pbXBsaWVzKG5ldyBGaWxlUGVybWlzc2lvbihzICsgInRtcCIsICJyZWFkIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmV0dXJuZWQgdHJ1ZSBmb3Igbm9uIHN1YnNldCBvZiBmaWxlIGFuZCBhY3Rpb24iLCBjb2xsZWN0CisgICAgICAgICAgICAgICAgLmltcGxpZXMocmVhZEluRmlsZSkpOwogCi0JCUZpbGVQZXJtaXNzaW9uIGZwMSA9IG5ldyBGaWxlUGVybWlzc2lvbigiL3RtcC8tIi5yZXBsYWNlKCcvJywKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIpLCAicmVhZCIpOwotCQlQZXJtaXNzaW9uQ29sbGVjdGlvbiBmcGMgPSBmcDEubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQkJZnBjLmFkZChmcDEpOwotCQlmcGMuYWRkKG5ldyBGaWxlUGVybWlzc2lvbigiL3RtcC9zY3JhdGNoL2Zvby8qIi5yZXBsYWNlKCcvJywKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIpLCAid3JpdGUiKSk7Ci0JCUZpbGVQZXJtaXNzaW9uIGZwMiA9IG5ldyBGaWxlUGVybWlzc2lvbigiL3RtcC9zY3JhdGNoL2Zvby9maWxlIgotCQkJCS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSwgInJlYWQsd3JpdGUiKTsKLQkJYXNzZXJ0VHJ1ZSgiY29sbGVjdGlvbiBkb2VzIG5vdCBjb2xsYXRlIiwgZnBjLmltcGxpZXMoZnAyKSk7Ci0JfQorICAgICAgICBGaWxlUGVybWlzc2lvbiBmcDEgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi90bXAvLSIucmVwbGFjZSgnLycsCisgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyKSwgInJlYWQiKTsKKyAgICAgICAgUGVybWlzc2lvbkNvbGxlY3Rpb24gZnBjID0gZnAxLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7CisgICAgICAgIGZwYy5hZGQoZnAxKTsKKyAgICAgICAgZnBjLmFkZChuZXcgRmlsZVBlcm1pc3Npb24oIi90bXAvc2NyYXRjaC9mb28vKiIucmVwbGFjZSgnLycsCisgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyKSwgIndyaXRlIikpOworICAgICAgICBGaWxlUGVybWlzc2lvbiBmcDIgPSBuZXcgRmlsZVBlcm1pc3Npb24oIi90bXAvc2NyYXRjaC9mb28vZmlsZSIKKyAgICAgICAgICAgICAgICAucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhciksICJyZWFkLHdyaXRlIik7CisgICAgICAgIGFzc2VydFRydWUoImNvbGxlY3Rpb24gZG9lcyBub3QgY29sbGF0ZSIsIGZwYy5pbXBsaWVzKGZwMikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uI2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCQkvLyB0ZXN0IG1ldGhvZCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uLmhhc0NvZGUoKQotCQlhc3NlcnRUcnVlKAotCQkJCSJ0d28gZXF1YWwgZmlsZVBlcm1pc3Npb24gaW5zdGFuY2VzIHJldHVybmVkIGRpZmZlcmVudCBoYXNoQ29kZSIsCi0JCQkJcmVhZEFsbEZpbGVzLmhhc2hDb2RlKCkgPT0gYWxzb1JlYWRBbGxGaWxlcy5oYXNoQ29kZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkidHdvIGZpbGVQZXJtaXNzaW9uIGluc3RhbmNlcyB3aXRoIHNhbWUgcGVybWlzc2lvbiBuYW1lIHJldHVybmVkIHNhbWUgaGFzaENvZGUiLAotCQkJCXJlYWRJbkN1cnJlbnQuaGFzaENvZGUoKSAhPSBhbGxJbkN1cnJlbnQuaGFzaENvZGUoKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZVBlcm1pc3Npb24jaGFzaENvZGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNoQ29kZSgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CisgICAgICAgIC8vIHRlc3QgbWV0aG9kIGphdmEuaW8uRmlsZVBlcm1pc3Npb24uaGFzQ29kZSgpCisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgInR3byBlcXVhbCBmaWxlUGVybWlzc2lvbiBpbnN0YW5jZXMgcmV0dXJuZWQgZGlmZmVyZW50IGhhc2hDb2RlIiwKKyAgICAgICAgICAgICAgICByZWFkQWxsRmlsZXMuaGFzaENvZGUoKSA9PSBhbHNvUmVhZEFsbEZpbGVzLmhhc2hDb2RlKCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJ0d28gZmlsZVBlcm1pc3Npb24gaW5zdGFuY2VzIHdpdGggc2FtZSBwZXJtaXNzaW9uIG5hbWUgcmV0dXJuZWQgc2FtZSBoYXNoQ29kZSIsCisgICAgICAgICAgICAgICAgcmVhZEluQ3VycmVudC5oYXNoQ29kZSgpICE9IGFsbEluQ3VycmVudC5oYXNoQ29kZSgpKTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlUmVhZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVSZWFkZXJUZXN0LmphdmEKaW5kZXggNTRjMmI1NC4uNzBkYzJlNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVSZWFkZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVSZWFkZXJUZXN0LmphdmEKQEAgLTE3LDExNiArMTcsMTQzIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhGaWxlUmVhZGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGaWxlUmVhZGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlGaWxlUmVhZGVyIGJyOworICAgIEZpbGVSZWFkZXIgYnI7CiAKLQlCdWZmZXJlZFdyaXRlciBidzsKKyAgICBCdWZmZXJlZFdyaXRlciBidzsKIAotCUZpbGVJbnB1dFN0cmVhbSBmaXM7CisgICAgRmlsZUlucHV0U3RyZWFtIGZpczsKIAotCUZpbGUgZjsKKyAgICBGaWxlIGY7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlUmVhZGVyI0ZpbGVSZWFkZXIoamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlUmVhZGVyKGphdmEuaW8uRmlsZSkKLQkJdHJ5IHsKLQkJCWJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGYuZ2V0UGF0aCgpKSk7Ci0JCQlidy53cml0ZSgiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgMCwgMTgpOwotCQkJYncuY2xvc2UoKTsKLQkJCWJyID0gbmV3IEZpbGVSZWFkZXIoZik7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwXTsKLQkJCWludCByID0gYnIucmVhZChidWYpOwotCQkJYnIuY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBjaGFycyIsICIgQWZ0ZXIgdGVzdCBzdHJpbmciLCBuZXcgU3RyaW5nKGJ1ZiwgMCwgcikKLQkJCQkJKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdCAiICsgZS50b1N0cmluZygpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlUmVhZGVyI0ZpbGVSZWFkZXIoamF2YS5pby5GaWxlKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZVJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVSZWFkZXIoamF2YS5pby5GaWxlKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZi5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgIGJ3LndyaXRlKCIgQWZ0ZXIgdGVzdCBzdHJpbmciLCAwLCAxOCk7CisgICAgICAgICAgICBidy5jbG9zZSgpOworICAgICAgICAgICAgYnIgPSBuZXcgRmlsZVJlYWRlcihmKTsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxMDBdOworICAgICAgICAgICAgaW50IHIgPSBici5yZWFkKGJ1Zik7CisgICAgICAgICAgICBici5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGNoYXJzIiwgIiBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZVJlYWRlciNGaWxlUmVhZGVyKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGVEZXNjcmlwdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlUmVhZGVyKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0JCXRyeSB7Ci0JCQlidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmLmdldFBhdGgoKSkpOwotCQkJYncud3JpdGUoIiBBZnRlciB0ZXN0IHN0cmluZyIsIDAsIDE4KTsKLQkJCWJ3LmNsb3NlKCk7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmLmdldFBhdGgoKSk7Ci0JCQliciA9IG5ldyBGaWxlUmVhZGVyKGZpcy5nZXRGRCgpKTsKLQkJCWNoYXJbXSBidWYgPSBuZXcgY2hhclsxMDBdOwotCQkJaW50IHIgPSBici5yZWFkKGJ1Zik7Ci0JCQlici5jbG9zZSgpOwotCQkJZmlzLmNsb3NlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgY2hhcnMiLCAiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgbmV3IFN0cmluZyhidWYsIDAsIHIpCi0JCQkJCSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3QgIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZVJlYWRlciNGaWxlUmVhZGVyKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEZpbGVSZWFkZXIoamF2YS5pby5GaWxlRGVzY3JpcHRvcikgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZVJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlRGVzY3JpcHRvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVJlYWRlcihqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZi5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgIGJ3LndyaXRlKCIgQWZ0ZXIgdGVzdCBzdHJpbmciLCAwLCAxOCk7CisgICAgICAgICAgICBidy5jbG9zZSgpOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgYnIgPSBuZXcgRmlsZVJlYWRlcihmaXMuZ2V0RkQoKSk7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwXTsKKyAgICAgICAgICAgIGludCByID0gYnIucmVhZChidWYpOworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGNoYXJzIiwgIiBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZVJlYWRlciNGaWxlUmVhZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlUmVhZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmLmdldFBhdGgoKSkpOwotCQkJYncud3JpdGUoIiBBZnRlciB0ZXN0IHN0cmluZyIsIDAsIDE4KTsKLQkJCWJ3LmNsb3NlKCk7Ci0JCQliciA9IG5ldyBGaWxlUmVhZGVyKGYuZ2V0UGF0aCgpKTsKLQkJCWNoYXJbXSBidWYgPSBuZXcgY2hhclsxMDBdOwotCQkJaW50IHIgPSBici5yZWFkKGJ1Zik7Ci0JCQlici5jbG9zZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGNoYXJzIiwgIiBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQotCQkJCQkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVSZWFkZXIjRmlsZVJlYWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZVJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVSZWFkZXIoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGYuZ2V0UGF0aCgpKSk7CisgICAgICAgICAgICBidy53cml0ZSgiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgMCwgMTgpOworICAgICAgICAgICAgYncuY2xvc2UoKTsKKyAgICAgICAgICAgIGJyID0gbmV3IEZpbGVSZWFkZXIoZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwMF07CisgICAgICAgICAgICBpbnQgciA9IGJyLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgY2hhcnMiLCAiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgbmV3IFN0cmluZyhidWYsIDAsIHIpCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3QgIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKIAotCQlmID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSwgInJlYWRlci50c3QiKTsKKyAgICAgICAgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIiksICJyZWFkZXIudHN0Iik7CiAKLQkJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCWlmICghZi5kZWxldGUoKSkgewotCQkJCWZhaWwoIlVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlIik7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoIWYuZGVsZXRlKCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gZGVsZXRlIHRlc3QgZmlsZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CiAKLQkJdHJ5IHsKLQkJCWJ3LmNsb3NlKCk7Ci0JCQlici5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidy5jbG9zZSgpOworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlpZiAoZmlzICE9IG51bGwpCi0JCQkJZmlzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZi5kZWxldGUoKTsKLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlzICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZi5kZWxldGUoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlVGVzdC5qYXZhCmluZGV4IGQwNWI5ODMuLmNhNmM5ZTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWxlVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CkBAIC0zNCwyODcgKzM5LDM1NyBAQAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9FeGVjOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9QbGF0Zm9ybUZpbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRmlsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqIExvY2F0aW9uIHRvIHN0b3JlIHRlc3RzIGluICovCi0JcHJpdmF0ZSBGaWxlIHRlbXBEaXJlY3Rvcnk7CisgICAgLyoqIExvY2F0aW9uIHRvIHN0b3JlIHRlc3RzIGluICovCisgICAgcHJpdmF0ZSBGaWxlIHRlbXBEaXJlY3Rvcnk7CiAKLQkvKiogVGVtcCBmaWxlIHRoYXQgZG9lcyBleGlzdCAqLwotCXByaXZhdGUgRmlsZSB0ZW1wRmlsZTsKKyAgICAvKiogVGVtcCBmaWxlIHRoYXQgZG9lcyBleGlzdCAqLworICAgIHByaXZhdGUgRmlsZSB0ZW1wRmlsZTsKIAotCS8qKiBGaWxlIHNlcGFyYXRvciAqLwotCXByaXZhdGUgU3RyaW5nIHNsYXNoID0gRmlsZS5zZXBhcmF0b3I7CisgICAgLyoqIEZpbGUgc2VwYXJhdG9yICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2xhc2ggPSBGaWxlLnNlcGFyYXRvcjsKIAotCXB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CdWZmZXJlZE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRGF0YUlucHV0U3RyZWFtXG5UZXN0X0ZpbGVcblRlc3RfRmlsZURlc2NyaXB0b3JcblRlc3RfRmlsZUlucHV0U3RyZWFtXG5UZXN0X0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9GaWxlT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9GaWxlXG5UZXN0X0ZpbGVEZXNjcmlwdG9yXG5UZXN0X0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9GaWxlTm90Rm91bmRFeGNlcHRpb25cblRlc3RfRmlsZU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlcklucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVyT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19JT0V4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX091dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX1ByaW50U3RyZWFtXG5UZXN0X2phdmFfaW9fUmFuZG9tQWNjZXNzRmlsZVxuVGVzdF9qYXZhX2lvX1N5bmNGYWlsZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Fic3RyYWN0TWV0aG9kRXJyb3JcblRlc3RfamF2YV9sYW5nX0FyaXRobWV0aWNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlTdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQm9vbGVhblxuVGVzdF9qYXZhX2xhbmdfQnl0ZVxuVGVzdF9qYXZhX2xhbmdfQ2hhcmFjdGVyXG5UZXN0X2phdmFfbGFuZ19DbGFzc1xuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDYXN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19DbGFzc0NpcmN1bGFyaXR5RXJyb3JcblRlc3RfamF2YV9sYW5nX0NsYXNzRm9ybWF0RXJyb3JcblRlc3RfamF2YV9sYW5nX0NsYXNzTG9hZGVyXG5UZXN0X2phdmFfbGFuZ19DbGFzc05vdEZvdW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRG91YmxlXG5UZXN0X2phdmFfbGFuZ19FcnJvclxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3JcblRlc3RfamF2YV9sYW5nX0Zsb2F0XG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXJyb3JcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yXG5UZXN0X2phdmFfbGFuZ19JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXJyb3JcblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0ludGVnZXJcblRlc3RfamF2YV9sYW5nX0ludGVybmFsRXJyb3JcblRlc3RfamF2YV9sYW5nX0ludGVycnVwdGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19MaW5rYWdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0xvbmdcblRlc3RfamF2YV9sYW5nX01hdGhcblRlc3RfamF2YV9sYW5nX05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Ob0NsYXNzRGVmRm91bmRFcnJvclxuVGVzdF9qYXZhX2xhbmdfTm9TdWNoRmllbGRFcnJvclxuVGVzdF9qYXZhX2xhbmdfTm9TdWNoTWV0aG9kRXJyb3JcblRlc3RfamF2YV9sYW5nX051bGxQb2ludGVyRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJcblRlc3RfamF2YV9sYW5nX051bWJlckZvcm1hdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfT2JqZWN0XG5UZXN0X2phdmFfbGFuZ19PdXRPZk1lbW9yeUVycm9yXG5UZXN0X2phdmFfbGFuZ19SdW50aW1lRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19TZWN1cml0eU1hbmFnZXJcblRlc3RfamF2YV9sYW5nX1Nob3J0XG5UZXN0X2phdmFfbGFuZ19TdGFja092ZXJmbG93RXJyb3JcblRlc3RfamF2YV9sYW5nX1N0cmluZ1xuVGVzdF9qYXZhX2xhbmdfU3RyaW5nQnVmZmVyXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19TeXN0ZW1cblRlc3RfamF2YV9sYW5nX1RocmVhZFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkRGVhdGhcblRlc3RfamF2YV9sYW5nX1RocmVhZEdyb3VwXG5UZXN0X2phdmFfbGFuZ19UaHJvd2FibGVcblRlc3RfamF2YV9sYW5nX1Vua25vd25FcnJvclxuVGVzdF9qYXZhX2xhbmdfVW5zYXRpc2ZpZWRMaW5rRXJyb3JcblRlc3RfamF2YV9sYW5nX1ZlcmlmeUVycm9yXG5UZXN0X2phdmFfbGFuZ19WaXJ0dWFsTWFjaGluZUVycm9yXG5UZXN0X2phdmFfbGFuZ192bV9JbWFnZVxuVGVzdF9qYXZhX2xhbmdfdm1fTWVtb3J5U2VnbWVudFxuVGVzdF9qYXZhX2xhbmdfdm1fUk9NU3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX3ZtX1ZNXG5UZXN0X2phdmFfbGFuZ19Wb2lkXG5UZXN0X2phdmFfbmV0X0JpbmRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfQ29ubmVjdEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVBhY2tldFxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVNvY2tldFxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfSW5ldEFkZHJlc3NcblRlc3RfamF2YV9uZXRfTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9QbGFpbkRhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9QbGFpblNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0XG5UZXN0X2phdmFfbmV0X1NvY2tldEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldElucHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1NvY2tldE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Vbmtub3duSG9zdEV4Y2VwdGlvblxuVGVzdF9qYXZhX3V0aWxfQXJyYXlFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9EYXRlXG5UZXN0X2phdmFfdXRpbF9FdmVudE9iamVjdFxuVGVzdF9qYXZhX3V0aWxfSGFzaEVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0hhc2h0YWJsZVxuVGVzdF9qYXZhX3V0aWxfUHJvcGVydGllc1xuVGVzdF9qYXZhX3V0aWxfUmVzb3VyY2VCdW5kbGVcblRlc3RfamF2YV91dGlsX3RtXG5UZXN0X2phdmFfdXRpbF9WZWN0b3JcbiI7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxhdGZvcm1JZCA9ICJKREsiCi0JCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZXJzaW9uIikucmVwbGFjZSgnLicsICctJyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBsYXRmb3JtSWQgPSAiSkRLIgorICAgICAgICAgICAgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVyc2lvbiIpLnJlcGxhY2UoJy4nLCAnLScpOwogCi0JewotCQkvLyBEZWxldGUgYWxsIG9sZCB0ZW1wb3JhcnkgZmlsZXMKLQkJRmlsZSB0ZW1wRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKLQkJU3RyaW5nW10gZmlsZXMgPSB0ZW1wRGlyLmxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmID0gbmV3IEZpbGUodGVtcERpciwgZmlsZXNbaV0pOwotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQkJCWlmIChmaWxlc1tpXS5zdGFydHNXaXRoKCJoeXRzX3Jlc291cmNlcyIpKQotCQkJCQlkZWxldGVUZW1wRm9sZGVyKGYpOwotCQkJfQotCQkJaWYgKGZpbGVzW2ldLnN0YXJ0c1dpdGgoImh5dHNfIikgfHwgZmlsZXNbaV0uc3RhcnRzV2l0aCgiaHlqYXJfIikpCi0JCQkJbmV3IEZpbGUodGVtcERpciwgZmlsZXNbaV0pLmRlbGV0ZSgpOwotCQl9Ci0JfQorICAgIHsKKyAgICAgICAgLy8gRGVsZXRlIGFsbCBvbGQgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAgIEZpbGUgdGVtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gdGVtcERpci5saXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHRlbXBEaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0uc3RhcnRzV2l0aCgiaHl0c19yZXNvdXJjZXMiKSkKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlVGVtcEZvbGRlcihmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS5zdGFydHNXaXRoKCJoeXRzXyIpIHx8IGZpbGVzW2ldLnN0YXJ0c1dpdGgoImh5amFyXyIpKQorICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRlbXBEaXIsIGZpbGVzW2ldKS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBkZWxldGVUZW1wRm9sZGVyKEZpbGUgZGlyKSB7Ci0JCVN0cmluZyBmaWxlc1tdID0gZGlyLmxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKQotCQkJCWRlbGV0ZVRlbXBGb2xkZXIoZik7Ci0JCQllbHNlIHsKLQkJCQlmLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0JCWRpci5kZWxldGUoKTsKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlVGVtcEZvbGRlcihGaWxlIGRpcikgeworICAgICAgICBTdHJpbmcgZmlsZXNbXSA9IGRpci5saXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICBkZWxldGVUZW1wRm9sZGVyKGYpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaXIuZGVsZXRlKCk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNGaWxlKGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlKGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkJU3RyaW5nIGRpck5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ci0JCUZpbGUgZCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShkLCAiaW5wdXQudHN0Iik7Ci0JCWlmICghZGlyTmFtZS5yZWdpb25NYXRjaGVzKChkaXJOYW1lLmxlbmd0aCgpIC0gMSksIHNsYXNoLCAwLCAxKSkKLQkJCWRpck5hbWUgKz0gc2xhc2g7Ci0JCWRpck5hbWUgKz0gImlucHV0LnRzdCI7Ci0JCWFzc2VydFRydWUoIlRlc3QgMTogQ3JlYXRlZCBJbmNvcnJlY3QgRmlsZSAiICsgZi5nZXRQYXRoKCksIGYuZ2V0UGF0aCgpCi0JCQkJLmVxdWFscyhkaXJOYW1lKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNGaWxlKGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsZShqYXZhLmlvLkZpbGUsIGphdmEubGFuZy5TdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkZpbGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGVMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZShqYXZhLmlvLkZpbGUsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIFN0cmluZyBkaXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZShkaXJOYW1lKTsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZCwgImlucHV0LnRzdCIpOworICAgICAgICBpZiAoIWRpck5hbWUucmVnaW9uTWF0Y2hlcygoZGlyTmFtZS5sZW5ndGgoKSAtIDEpLCBzbGFzaCwgMCwgMSkpCisgICAgICAgICAgICBkaXJOYW1lICs9IHNsYXNoOworICAgICAgICBkaXJOYW1lICs9ICJpbnB1dC50c3QiOworICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDE6IENyZWF0ZWQgSW5jb3JyZWN0IEZpbGUgIiArIGYuZ2V0UGF0aCgpLCBmLmdldFBhdGgoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoZGlyTmFtZSkpOwogCi0JCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmID0gbmV3IEZpbGUoZCwgZmlsZU5hbWUpOwotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gTm90IFRocm93bi4iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9CisgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoZCwgZmlsZU5hbWUpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gTm90IFRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJZCA9IG51bGw7Ci0JCWYgPSBuZXcgRmlsZShkLCAiaW5wdXQudHN0Iik7Ci0JCWFzc2VydFRydWUoIlRlc3QgMjogQ3JlYXRlZCBJbmNvcnJlY3QgRmlsZSAiICsgZi5nZXRQYXRoKCksIGYKLQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGRpck5hbWUpKTsKKyAgICAgICAgZCA9IG51bGw7CisgICAgICAgIGYgPSBuZXcgRmlsZShkLCAiaW5wdXQudHN0Iik7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMjogQ3JlYXRlZCBJbmNvcnJlY3QgRmlsZSAiICsgZi5nZXRQYXRoKCksIGYKKyAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGRpck5hbWUpKTsKIAotCQkvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMzgyCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0zODIKICAgICAgICAgRmlsZSBzID0gbnVsbDsKICAgICAgICAgZiA9IG5ldyBGaWxlKCIvYWJjIik7CiAgICAgICAgIGQgPSBuZXcgRmlsZShzLCAiL2FiYyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3QzOiBDcmVhdGVkIEluY29ycmVjdCBGaWxlICIgKyBkLmdldEFic29sdXRlUGF0aCgpLCBmCiAgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpLCBkLmdldEFic29sdXRlUGF0aCgpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNGaWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlKGphdmEubGFuZy5TdHJpbmcpCi0JCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBOb3QgVGhyb3duLiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI0ZpbGUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsZShqYXZhLmxhbmcuU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIE5vdCBUaHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCWZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQlpZiAoIWZpbGVOYW1lLnJlZ2lvbk1hdGNoZXMoKGZpbGVOYW1lLmxlbmd0aCgpIC0gMSksIHNsYXNoLCAwLCAxKSkKLQkJCWZpbGVOYW1lICs9IHNsYXNoOwotCQlmaWxlTmFtZSArPSAiaW5wdXQudHN0IjsKKyAgICAgICAgZmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgIGlmICghZmlsZU5hbWUucmVnaW9uTWF0Y2hlcygoZmlsZU5hbWUubGVuZ3RoKCkgLSAxKSwgc2xhc2gsIDAsIDEpKQorICAgICAgICAgICAgZmlsZU5hbWUgKz0gc2xhc2g7CisgICAgICAgIGZpbGVOYW1lICs9ICJpbnB1dC50c3QiOwogCi0JCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiQ3JlYXRlZCBpbmNvcnJlY3QgRmlsZSAiICsgZi5nZXRQYXRoKCksIGYuZ2V0UGF0aCgpLmVxdWFscygKLQkJCQlmaWxlTmFtZSkpOwotCX0KKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZU5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIGluY29ycmVjdCBGaWxlICIgKyBmLmdldFBhdGgoKSwgZi5nZXRQYXRoKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIGZpbGVOYW1lKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkJU3RyaW5nIGRpck5hbWUgPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWUgPSAiaW5wdXQudHN0IjsKLQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyTmFtZSwgZmlsZU5hbWUpOwotCQlTdHJpbmcgdXNlckRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQkJaWYgKCF1c2VyRGlyLnJlZ2lvbk1hdGNoZXMoKHVzZXJEaXIubGVuZ3RoKCkgLSAxKSwgc2xhc2gsIDAsIDEpKQotCQkJdXNlckRpciArPSBzbGFzaDsKLQkJdXNlckRpciArPSAiaW5wdXQudHN0IjsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCAxOiBDcmVhdGVkIEluY29ycmVjdCBGaWxlLiIsIGYuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkuZXF1YWxzKHVzZXJEaXIpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI0ZpbGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSBjb25zdHJ1Y3RvciAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIFN0cmluZyBkaXJOYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gImlucHV0LnRzdCI7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpck5hbWUsIGZpbGVOYW1lKTsKKyAgICAgICAgU3RyaW5nIHVzZXJEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgIGlmICghdXNlckRpci5yZWdpb25NYXRjaGVzKCh1c2VyRGlyLmxlbmd0aCgpIC0gMSksIHNsYXNoLCAwLCAxKSkKKyAgICAgICAgICAgIHVzZXJEaXIgKz0gc2xhc2g7CisgICAgICAgIHVzZXJEaXIgKz0gImlucHV0LnRzdCI7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMTogQ3JlYXRlZCBJbmNvcnJlY3QgRmlsZS4iLCBmLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgLmVxdWFscyh1c2VyRGlyKSk7CiAKLQkJZGlyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQkJZmlsZU5hbWUgPSBudWxsOwotCQl0cnkgewotCQkJZiA9IG5ldyBGaWxlKGRpck5hbWUsIGZpbGVOYW1lKTsKLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIE5vdCBUaHJvd24uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICBkaXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworICAgICAgICBmaWxlTmFtZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoZGlyTmFtZSwgZmlsZU5hbWUpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gTm90IFRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJZmlsZU5hbWUgPSAiaW5wdXQudHN0IjsKLQkJZiA9IG5ldyBGaWxlKGRpck5hbWUsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCAyOiBDcmVhdGVkIEluY29ycmVjdCBGaWxlIiwgZi5nZXRQYXRoKCkKLQkJCQkuZXF1YWxzKHVzZXJEaXIpKTsKKyAgICAgICAgZmlsZU5hbWUgPSAiaW5wdXQudHN0IjsKKyAgICAgICAgZiA9IG5ldyBGaWxlKGRpck5hbWUsIGZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAyOiBDcmVhdGVkIEluY29ycmVjdCBGaWxlIiwgZi5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICAuZXF1YWxzKHVzZXJEaXIpKTsKIAotCQkvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMzgyCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0zODIKICAgICAgICAgU3RyaW5nIHMgPSBudWxsOwogICAgICAgICBmID0gbmV3IEZpbGUoIi9hYmMiKTsKICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUocywgIi9hYmMiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0MzogQ3JlYXRlZCBJbmNvcnJlY3QgRmlsZSIsIGQuZ2V0QWJzb2x1dGVQYXRoKCksIGYKICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI0ZpbGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX1N0cmluZ19TdHJpbmdfMTEyMjcwKCkgewotCQlGaWxlIHJlZjEgPSBuZXcgRmlsZSgiL2RpcjEvZmlsZTEiKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI0ZpbGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3Rvcl9TdHJpbmdfU3RyaW5nXzExMjI3MCgpIHsKKyAgICAgICAgRmlsZSByZWYxID0gbmV3IEZpbGUoIi9kaXIxL2ZpbGUxIik7CiAKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKCIvIiwgIi9kaXIxL2ZpbGUxIik7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgcmVzdWx0IDE6ICIgKyBmaWxlMSwgcmVmMS5nZXRQYXRoKCksIGZpbGUxCi0JCQkJLmdldFBhdGgoKSk7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZSgiLyIsICIvL2RpcjEvZmlsZTEiKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgcmVzdWx0IDI6ICIgKyBmaWxlMiwgZmlsZTIuZ2V0UGF0aCgpLmVxdWFscygKLQkJCQlyZWYxLmdldFBhdGgoKSkpOwotCQlGaWxlIGZpbGUzID0gbmV3IEZpbGUoIlxcIiwgIlxcZGlyMVxcZmlsZTEiKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgcmVzdWx0IDM6ICIgKyBmaWxlMywgZmlsZTMuZ2V0UGF0aCgpLmVxdWFscygKLQkJCQlyZWYxLmdldFBhdGgoKSkpOwotCQlGaWxlIGZpbGU0ID0gbmV3IEZpbGUoIlxcIiwgIlxcXFxkaXIxXFxmaWxlMSIpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyByZXN1bHQgNDogIiArIGZpbGU0LCBmaWxlNC5nZXRQYXRoKCkuZXF1YWxzKAotCQkJCXJlZjEuZ2V0UGF0aCgpKSk7CisgICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZSgiLyIsICIvZGlyMS9maWxlMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIHJlc3VsdCAxOiAiICsgZmlsZTEsIHJlZjEuZ2V0UGF0aCgpLCBmaWxlMQorICAgICAgICAgICAgICAgIC5nZXRQYXRoKCkpOworICAgICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUoIi8iLCAiLy9kaXIxL2ZpbGUxIik7CisgICAgICAgIGFzc2VydFRydWUoIndyb25nIHJlc3VsdCAyOiAiICsgZmlsZTIsIGZpbGUyLmdldFBhdGgoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgcmVmMS5nZXRQYXRoKCkpKTsKKyAgICAgICAgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKCJcXCIsICJcXGRpcjFcXGZpbGUxIik7CisgICAgICAgIGFzc2VydFRydWUoIndyb25nIHJlc3VsdCAzOiAiICsgZmlsZTMsIGZpbGUzLmdldFBhdGgoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgcmVmMS5nZXRQYXRoKCkpKTsKKyAgICAgICAgRmlsZSBmaWxlNCA9IG5ldyBGaWxlKCJcXCIsICJcXFxcZGlyMVxcZmlsZTEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgid3JvbmcgcmVzdWx0IDQ6ICIgKyBmaWxlNCwgZmlsZTQuZ2V0UGF0aCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICByZWYxLmdldFBhdGgoKSkpOwogCi0JCUZpbGUgcmVmMiA9IG5ldyBGaWxlKCIvbGliL2NvbnRlbnQtdHlwZXMucHJvcGVydGllcyIpOwotCQlGaWxlIGZpbGU1ID0gbmV3IEZpbGUoIi8iLCAibGliL2NvbnRlbnQtdHlwZXMucHJvcGVydGllcyIpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyByZXN1bHQgNTogIiArIGZpbGU1LCBmaWxlNS5nZXRQYXRoKCkuZXF1YWxzKAotCQkJCXJlZjIuZ2V0UGF0aCgpKSk7CisgICAgICAgIEZpbGUgcmVmMiA9IG5ldyBGaWxlKCIvbGliL2NvbnRlbnQtdHlwZXMucHJvcGVydGllcyIpOworICAgICAgICBGaWxlIGZpbGU1ID0gbmV3IEZpbGUoIi8iLCAibGliL2NvbnRlbnQtdHlwZXMucHJvcGVydGllcyIpOworICAgICAgICBhc3NlcnRUcnVlKCJ3cm9uZyByZXN1bHQgNTogIiArIGZpbGU1LCBmaWxlNS5nZXRQYXRoKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIHJlZjIuZ2V0UGF0aCgpKSk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNGaWxlKGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX0ZpbGVfU3RyaW5nXzExMjI3MCgpIHsKLQkJRmlsZSByZWYxID0gbmV3IEZpbGUoIi9kaXIxL2ZpbGUxIik7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNGaWxlKGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX0ZpbGVfU3RyaW5nXzExMjI3MCgpIHsKKyAgICAgICAgRmlsZSByZWYxID0gbmV3IEZpbGUoIi9kaXIxL2ZpbGUxIik7CiAKLQkJRmlsZSByb290ID0gbmV3IEZpbGUoIi8iKTsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKHJvb3QsICIvZGlyMS9maWxlMSIpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyByZXN1bHQgMTogIiArIGZpbGUxLCBmaWxlMS5nZXRQYXRoKCkuZXF1YWxzKAotCQkJCXJlZjEuZ2V0UGF0aCgpKSk7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZShyb290LCAiLy9kaXIxL2ZpbGUxIik7Ci0JCWFzc2VydFRydWUoIndyb25nIHJlc3VsdCAyOiAiICsgZmlsZTIsIGZpbGUyLmdldFBhdGgoKS5lcXVhbHMoCi0JCQkJcmVmMS5nZXRQYXRoKCkpKTsKLQkJRmlsZSBmaWxlMyA9IG5ldyBGaWxlKHJvb3QsICJcXGRpcjFcXGZpbGUxIik7Ci0JCWFzc2VydFRydWUoIndyb25nIHJlc3VsdCAzOiAiICsgZmlsZTMsIGZpbGUzLmdldFBhdGgoKS5lcXVhbHMoCi0JCQkJcmVmMS5nZXRQYXRoKCkpKTsKLQkJRmlsZSBmaWxlNCA9IG5ldyBGaWxlKHJvb3QsICJcXFxcZGlyMVxcZmlsZTEiKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgcmVzdWx0IDQ6ICIgKyBmaWxlNCwgZmlsZTQuZ2V0UGF0aCgpLmVxdWFscygKLQkJCQlyZWYxLmdldFBhdGgoKSkpOworICAgICAgICBGaWxlIHJvb3QgPSBuZXcgRmlsZSgiLyIpOworICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUocm9vdCwgIi9kaXIxL2ZpbGUxIik7CisgICAgICAgIGFzc2VydFRydWUoIndyb25nIHJlc3VsdCAxOiAiICsgZmlsZTEsIGZpbGUxLmdldFBhdGgoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgcmVmMS5nZXRQYXRoKCkpKTsKKyAgICAgICAgRmlsZSBmaWxlMiA9IG5ldyBGaWxlKHJvb3QsICIvL2RpcjEvZmlsZTEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgid3JvbmcgcmVzdWx0IDI6ICIgKyBmaWxlMiwgZmlsZTIuZ2V0UGF0aCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICByZWYxLmdldFBhdGgoKSkpOworICAgICAgICBGaWxlIGZpbGUzID0gbmV3IEZpbGUocm9vdCwgIlxcZGlyMVxcZmlsZTEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgid3JvbmcgcmVzdWx0IDM6ICIgKyBmaWxlMywgZmlsZTMuZ2V0UGF0aCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICByZWYxLmdldFBhdGgoKSkpOworICAgICAgICBGaWxlIGZpbGU0ID0gbmV3IEZpbGUocm9vdCwgIlxcXFxkaXIxXFxmaWxlMSIpOworICAgICAgICBhc3NlcnRUcnVlKCJ3cm9uZyByZXN1bHQgNDogIiArIGZpbGU0LCBmaWxlNC5nZXRQYXRoKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIHJlZjEuZ2V0UGF0aCgpKSk7CiAKLQkJRmlsZSByZWYyID0gbmV3IEZpbGUoIi9saWIvY29udGVudC10eXBlcy5wcm9wZXJ0aWVzIik7Ci0JCUZpbGUgZmlsZTUgPSBuZXcgRmlsZShyb290LCAibGliL2NvbnRlbnQtdHlwZXMucHJvcGVydGllcyIpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyByZXN1bHQgNTogIiArIGZpbGU1LCBmaWxlNS5nZXRQYXRoKCkuZXF1YWxzKAotCQkJCXJlZjIuZ2V0UGF0aCgpKSk7Ci0JfQorICAgICAgICBGaWxlIHJlZjIgPSBuZXcgRmlsZSgiL2xpYi9jb250ZW50LXR5cGVzLnByb3BlcnRpZXMiKTsKKyAgICAgICAgRmlsZSBmaWxlNSA9IG5ldyBGaWxlKHJvb3QsICJsaWIvY29udGVudC10eXBlcy5wcm9wZXJ0aWVzIik7CisgICAgICAgIGFzc2VydFRydWUoIndyb25nIHJlc3VsdCA1OiAiICsgZmlsZTUsIGZpbGU1LmdldFBhdGgoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgcmVmMi5nZXRQYXRoKCkpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI0ZpbGUoamF2YS5uZXQuVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfVVJJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlKGphdmEubmV0LlVSSSkKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluZXcgRmlsZSh1cmkpOwotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gTm90IFRocm93bi4iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNGaWxlKGphdmEubmV0LlVSSSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsZShqYXZhLm5ldC5VUkkpIGNvbnN0cnVjdG9yICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBpbmNvcnJlY3QgcGFyYW1ldGVyLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkZpbGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuVVJJLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9VUkkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUoamF2YS5uZXQuVVJJKQorICAgICAgICBVUkkgdXJpID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBGaWxlKHVyaSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBOb3QgVGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQkvLyBpbnZhbGlkIGZpbGUgVVJJcwotCQlTdHJpbmdbXSB1cmlzID0gbmV3IFN0cmluZ1tdIHsgIm1haWx0bzp1c2VyQGRvbWFpbi5jb20iLCAvLyBub3QKLQkJCQkvLyBoaWVyYXJjaGljYWwKLQkJCQkiZnRwOi8vL3BhdGgiLCAvLyBub3QgZmlsZSBzY2hlbWUKLQkJCQkiLy9ob3N0L3BhdGgvIiwgLy8gbm90IGFic29sdXRlCi0JCQkJImZpbGU6Ly9ob3N0L3BhdGgiLCAvLyBub24gZW1wdHkgYXV0aG9yaXR5Ci0JCQkJImZpbGU6Ly8vcGF0aD9xdWVyeSIsIC8vIG5vbiBlbXB0eSBxdWVyeQotCQkJCSJmaWxlOi8vL3BhdGgjZnJhZ21lbnQiLCAvLyBub24gZW1wdHkgZnJhZ21lbnQKLQkJCQkiZmlsZTovLy9wYXRoPyIsICJmaWxlOi8vL3BhdGgjIiB9OworICAgICAgICAvLyBpbnZhbGlkIGZpbGUgVVJJcworICAgICAgICBTdHJpbmdbXSB1cmlzID0gbmV3IFN0cmluZ1tdIHsgIm1haWx0bzp1c2VyQGRvbWFpbi5jb20iLCAvLyBub3QKKyAgICAgICAgICAgICAgICAvLyBoaWVyYXJjaGljYWwKKyAgICAgICAgICAgICAgICAiZnRwOi8vL3BhdGgiLCAvLyBub3QgZmlsZSBzY2hlbWUKKyAgICAgICAgICAgICAgICAiLy9ob3N0L3BhdGgvIiwgLy8gbm90IGFic29sdXRlCisgICAgICAgICAgICAgICAgImZpbGU6Ly9ob3N0L3BhdGgiLCAvLyBub24gZW1wdHkgYXV0aG9yaXR5CisgICAgICAgICAgICAgICAgImZpbGU6Ly8vcGF0aD9xdWVyeSIsIC8vIG5vbiBlbXB0eSBxdWVyeQorICAgICAgICAgICAgICAgICJmaWxlOi8vL3BhdGgjZnJhZ21lbnQiLCAvLyBub24gZW1wdHkgZnJhZ21lbnQKKyAgICAgICAgICAgICAgICAiZmlsZTovLy9wYXRoPyIsICJmaWxlOi8vL3BhdGgjIiB9OwogCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQl1cmkgPSBuZXcgVVJJKHVyaXNbaV0pOwotCQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjoiICsgZSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBGaWxlKHVyaSk7Ci0JCQkJZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBuZXcgRmlsZSgiICsgdXJpCi0JCQkJCQkrICIpIik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cmkgPSBuZXcgVVJJKHVyaXNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjoiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5ldyBGaWxlKHVyaSk7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBuZXcgRmlsZSgiICsgdXJpCisgICAgICAgICAgICAgICAgICAgICAgICArICIpIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8gYSB2YWxpZCBGaWxlIFVSSQotCQl0cnkgewotCQkJRmlsZSBmID0gbmV3IEZpbGUobmV3IFVSSSgiZmlsZTovLy9wYSUyMHRoL2Fub3RoZXJcdTIwYWMvcGElMjV0aCIpKTsKLQkJCWFzc2VydFRydWUoIkNyZWF0ZWQgaW5jb3JyZWN0IEZpbGUgIiArIGYuZ2V0UGF0aCgpLCBmLmdldFBhdGgoKQotCQkJCQkuZXF1YWxzKAotCQkJCQkJCXNsYXNoICsgInBhIHRoIiArIHNsYXNoICsgImFub3RoZXJcdTIwYWMiICsgc2xhc2gKLQkJCQkJCQkJCSsgInBhJXRoIikpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246IiArIGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246IiArIGUpOwotCQl9Ci0JfQorICAgICAgICAvLyBhIHZhbGlkIEZpbGUgVVJJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShuZXcgVVJJKCJmaWxlOi8vL3BhJTIwdGgvYW5vdGhlclx1MjBhYy9wYSUyNXRoIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3JlYXRlZCBpbmNvcnJlY3QgRmlsZSAiICsgZi5nZXRQYXRoKCksIGYuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xhc2ggKyAicGEgdGgiICsgc2xhc2ggKyAiYW5vdGhlclx1MjBhYyIgKyBzbGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicGEldGgiKSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjoiICsgZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjoiICsgZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2NhblJlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY2FuUmVhZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWxlLmNhblJlYWQoKQotCQkvLyBjYW5SZWFkIG9ubHkgcmV0dXJucyBpZiB0aGUgZmlsZSBleGlzdHMgc28gY2Fubm90IGJlIGZ1bGx5IHRlc3RlZC4KLQkJRmlsZSBmID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLCBwbGF0Zm9ybUlkCi0JCQkJKyAiY2FuUmVhZC50c3QiKTsKLQkJdHJ5IHsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQlmb3MuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoImNhblJlYWQgcmV0dXJuZWQgZmFsc2UiLCBmLmNhblJlYWQoKSk7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0OiAiICsgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjY2FuUmVhZCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNhblJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jYW5SZWFkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuY2FuUmVhZCgpCisgICAgICAgIC8vIGNhblJlYWQgb25seSByZXR1cm5zIGlmIHRoZSBmaWxlIGV4aXN0cyBzbyBjYW5ub3QgYmUgZnVsbHkgdGVzdGVkLgorICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksIHBsYXRmb3JtSWQKKyAgICAgICAgICAgICAgICArICJjYW5SZWFkLnRzdCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY2FuUmVhZCByZXR1cm5lZCBmYWxzZSIsIGYuY2FuUmVhZCgpKTsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIFRlc3Q6ICIgKyBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2NhbldyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2NhbldyaXRlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuY2FuV3JpdGUoKQotCQkvLyBjYW5Xcml0ZSBvbmx5IHJldHVybnMgaWYgdGhlIGZpbGUgZXhpc3RzIHNvIGNhbm5vdCBiZSBmdWxseSB0ZXN0ZWQuCi0JCUZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwgcGxhdGZvcm1JZAotCQkJCSsgImNhbldyaXRlLnRzdCIpOwotCQl0cnkgewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiY2FuV3JpdGUgcmV0dXJuZWQgZmFsc2UiLCBmLmNhbldyaXRlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0OiAiICsgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjY2FuV3JpdGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjYW5Xcml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2NhbldyaXRlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuY2FuV3JpdGUoKQorICAgICAgICAvLyBjYW5Xcml0ZSBvbmx5IHJldHVybnMgaWYgdGhlIGZpbGUgZXhpc3RzIHNvIGNhbm5vdCBiZSBmdWxseSB0ZXN0ZWQuCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwgcGxhdGZvcm1JZAorICAgICAgICAgICAgICAgICsgImNhbldyaXRlLnRzdCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY2FuV3JpdGUgcmV0dXJuZWQgZmFsc2UiLCBmLmNhbldyaXRlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0OiAiICsgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNjb21wYXJlVG8oamF2YS5pby5GaWxlKQotCSAqLworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjY29tcGFyZVRvKGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29tcGFyZVRvKGphdmEuaW8uRmlsZSkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9pb19GaWxlKCkgewogICAgICAgICBGaWxlIGYxID0gbmV3IEZpbGUoInRoaXNGaWxlLmZpbGUiKTsKICAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKCJ0aGlzRmlsZS5maWxlIik7CkBAIC0zMzAsNyArNDA1LDE0IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNjcmVhdGVOZXdGaWxlKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU5ld0ZpbGVfRW1wdHlTdHJpbmcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjcmVhdGVOZXdGaWxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgX3Rlc3RfY3JlYXRlTmV3RmlsZV9FbXB0eVN0cmluZygpIHsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIiIpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZi5jcmVhdGVOZXdGaWxlKCk7CkBAIC0zNDAsMTAgKzQyMiwxNyBAQAogICAgICAgICB9CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNjcmVhdGVOZXdGaWxlKCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU5ld0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjY3JlYXRlTmV3RmlsZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNyZWF0ZU5ld0ZpbGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2NyZWF0ZU5ld0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlLmNyZWF0ZU5ld0ZpbGUoKQogICAgICAgICBTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKICAgICAgICAgYm9vbGVhbiBkaXJFeGlzdHMgPSB0cnVlOwpAQCAtNDIzLDIwNyArNTEyLDIzOCBAQAogICAgICAgICB9CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNjcmVhdGVUZW1wRmlsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVGVtcEZpbGVMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlLmNyZWF0ZVRlbXBGaWxlKFN0cmluZywgU3RyaW5nKQotCQkvLyBFcnJvciBwcm90ZWN0aW9uIGFnYWluc3QgdXNpbmcgYSBzdWZmaXggd2l0aG91dCBhICIuIj8KLQkJRmlsZSBmMSA9IG51bGw7Ci0JCUZpbGUgZjIgPSBudWxsOwotCQl0cnkgewotCQkJZjEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzX2FiYyIsICIudG1wIik7Ci0JCQlmMiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImh5dHNfdGYiLCBudWxsKTsKLQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSBmMS5nZXRQYXJlbnQoKTsKLQkJCWlmICghZmlsZUxvY2F0aW9uLmVuZHNXaXRoKHNsYXNoKSkKLQkJCQk7Ci0JCQlmaWxlTG9jYXRpb24gKz0gc2xhc2g7Ci0JCQlTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQkJCWlmICghdGVtcERpci5lbmRzV2l0aChzbGFzaCkpCi0JCQkJdGVtcERpciArPSBzbGFzaDsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJGaWxlIGRpZCBub3Qgc2F2ZSB0byB0aGUgZGVmYXVsdCB0ZW1wb3JhcnktZmlsZSBsb2NhdGlvbi4iLAotCQkJCQlmaWxlTG9jYXRpb24uZXF1YWxzKHRlbXBEaXIpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2NyZWF0ZVRlbXBGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gJiBTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY3JlYXRlVGVtcEZpbGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVUZW1wRmlsZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUuY3JlYXRlVGVtcEZpbGUoU3RyaW5nLCBTdHJpbmcpCisgICAgICAgIC8vIEVycm9yIHByb3RlY3Rpb24gYWdhaW5zdCB1c2luZyBhIHN1ZmZpeCB3aXRob3V0IGEgIi4iPworICAgICAgICBGaWxlIGYxID0gbnVsbDsKKyAgICAgICAgRmlsZSBmMiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmMSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImh5dHNfYWJjIiwgIi50bXAiKTsKKyAgICAgICAgICAgIGYyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c190ZiIsIG51bGwpOworICAgICAgICAgICAgU3RyaW5nIGZpbGVMb2NhdGlvbiA9IGYxLmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKCFmaWxlTG9jYXRpb24uZW5kc1dpdGgoc2xhc2gpKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGZpbGVMb2NhdGlvbiArPSBzbGFzaDsKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICAgICAgICAgICAgaWYgKCF0ZW1wRGlyLmVuZHNXaXRoKHNsYXNoKSkKKyAgICAgICAgICAgICAgICB0ZW1wRGlyICs9IHNsYXNoOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIkZpbGUgZGlkIG5vdCBzYXZlIHRvIHRoZSBkZWZhdWx0IHRlbXBvcmFyeS1maWxlIGxvY2F0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgIGZpbGVMb2NhdGlvbi5lcXVhbHModGVtcERpcikpOwogCi0JCQkvLyBUZXN0IHRvIHNlZSBpZiBjb3JyZWN0IHN1ZmZpeCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHRlbXBmaWxlLgotCQkJRmlsZSBjdXJyZW50RmlsZTsKLQkJCVN0cmluZyBmaWxlTmFtZTsKLQkJCS8vIFRlc3RpbmcgdHdvIGZpbGVzLCBvbmUgd2l0aCBzdWZmaXggIi50bXAiIGFuZCBvbmUgd2l0aCBudWxsCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJCWN1cnJlbnRGaWxlID0gaSA9PSAwID8gZjEgOiBmMjsKLQkJCQlmaWxlTmFtZSA9IGN1cnJlbnRGaWxlLmdldFBhdGgoKTsKLQkJCQlhc3NlcnRUcnVlKCJGaWxlIENyZWF0ZWQgV2l0aCBJbmNvcnJlY3QgU3VmZml4LiIsIGZpbGVOYW1lCi0JCQkJCQkuZW5kc1dpdGgoIi50bXAiKSk7Ci0JCQl9CisgICAgICAgICAgICAvLyBUZXN0IHRvIHNlZSBpZiBjb3JyZWN0IHN1ZmZpeCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHRlbXBmaWxlLgorICAgICAgICAgICAgRmlsZSBjdXJyZW50RmlsZTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZTsKKyAgICAgICAgICAgIC8vIFRlc3RpbmcgdHdvIGZpbGVzLCBvbmUgd2l0aCBzdWZmaXggIi50bXAiIGFuZCBvbmUgd2l0aCBudWxsCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWxlID0gaSA9PSAwID8gZjEgOiBmMjsKKyAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGN1cnJlbnRGaWxlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIENyZWF0ZWQgV2l0aCBJbmNvcnJlY3QgU3VmZml4LiIsIGZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAuZW5kc1dpdGgoIi50bXAiKSk7CisgICAgICAgICAgICB9CiAKLQkJCS8vIFRlc3RzIHRvIHNlZSBpZiB0aGUgY29ycmVjdCBwcmVmaXggd2FzIHVzZWQgdG8gY3JlYXRlIHRoZQotCQkJLy8gdGVtcGZpbGVzLgotCQkJZmlsZU5hbWUgPSBmMS5nZXROYW1lKCk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDE6IEZpbGUgQ3JlYXRlZCBXaXRoIEluY29ycmVjdCBQcmVmaXguIiwgZmlsZU5hbWUKLQkJCQkJLnN0YXJ0c1dpdGgoImh5dHNfYWJjIikpOwotCQkJZmlsZU5hbWUgPSBmMi5nZXROYW1lKCk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDI6IEZpbGUgQ3JlYXRlZCBXaXRoIEluY29ycmVjdCBQcmVmaXguIiwgZmlsZU5hbWUKLQkJCQkJLnN0YXJ0c1dpdGgoImh5dHNfdGYiKSk7CisgICAgICAgICAgICAvLyBUZXN0cyB0byBzZWUgaWYgdGhlIGNvcnJlY3QgcHJlZml4IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUKKyAgICAgICAgICAgIC8vIHRlbXBmaWxlcy4KKyAgICAgICAgICAgIGZpbGVOYW1lID0gZjEuZ2V0TmFtZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAxOiBGaWxlIENyZWF0ZWQgV2l0aCBJbmNvcnJlY3QgUHJlZml4LiIsIGZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKCJoeXRzX2FiYyIpKTsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gZjIuZ2V0TmFtZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAyOiBGaWxlIENyZWF0ZWQgV2l0aCBJbmNvcnJlY3QgUHJlZml4LiIsIGZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKCJoeXRzX3RmIikpOwogCi0JCQkvLyBUZXN0cyBmb3IgY3JlYXRpbmcgYSB0ZW1wZmlsZSB3aXRoIGEgZmlsZW5hbWUgc2hvcnRlciB0aGFuIDMKLQkJCS8vIGNoYXJhY3RlcnMuCi0JCQl0cnkgewotCQkJCUZpbGUgZjMgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJhYiIsICIudHN0Iik7Ci0JCQkJZjMuZGVsZXRlKCk7Ci0JCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE5vdCBUaHJvd24uIik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlGaWxlIGYzID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYSIsICIudHN0Iik7Ci0JCQkJZjMuZGVsZXRlKCk7Ci0JCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE5vdCBUaHJvd24uIik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlGaWxlIGYzID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiIiwgIi50c3QiKTsKLQkJCQlmMy5kZWxldGUoKTsKLQkJCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTm90IFRocm93bi4iKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9CisgICAgICAgICAgICAvLyBUZXN0cyBmb3IgY3JlYXRpbmcgYSB0ZW1wZmlsZSB3aXRoIGEgZmlsZW5hbWUgc2hvcnRlciB0aGFuIDMKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGUgZjMgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJhYiIsICIudHN0Iik7CisgICAgICAgICAgICAgICAgZjMuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE5vdCBUaHJvd24uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIGYzID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYSIsICIudHN0Iik7CisgICAgICAgICAgICAgICAgZjMuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE5vdCBUaHJvd24uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIGYzID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiIiwgIi50c3QiKTsKKyAgICAgICAgICAgICAgICBmMy5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTm90IFRocm93bi4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBEdXJpbmcgVGVzdDogIiArIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGYxICE9IG51bGwpCi0JCQkJZjEuZGVsZXRlKCk7Ci0JCQlpZiAoZjIgIT0gbnVsbCkKLQkJCQlmMi5kZWxldGUoKTsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBEdXJpbmcgVGVzdDogIiArIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGYxICE9IG51bGwpCisgICAgICAgICAgICAgICAgZjEuZGVsZXRlKCk7CisgICAgICAgICAgICBpZiAoZjIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmMi5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjY3JlYXRlVGVtcEZpbGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgICAgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVGVtcEZpbGVMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5jcmVhdGVUZW1wRmlsZShTdHJpbmcsIFN0cmluZywgRmlsZSkKLQkJRmlsZSBmMSA9IG51bGw7Ci0JCUZpbGUgZjIgPSBudWxsOwotCQlTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQkJdHJ5IHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2NyZWF0ZVRlbXBGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICAgIGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY3JlYXRlVGVtcEZpbGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby5GaWxlLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVUZW1wRmlsZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlLmNyZWF0ZVRlbXBGaWxlKFN0cmluZywgU3RyaW5nLCBGaWxlKQorICAgICAgICBGaWxlIGYxID0gbnVsbDsKKyAgICAgICAgRmlsZSBmMiA9IG51bGw7CisgICAgICAgIFN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICAgICAgICB0cnkgewogCi0JCQkvLyBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0ZW1wZmlsZSB3YXMgc2F2ZWQgaW4gdGhlIGNvcnJlY3QKLQkJCS8vIGxvY2F0aW9uCi0JCQkvLyBhbmQgd2l0aCB0aGUgY29ycmVjdCBwcmVmaXgvc3VmZml4LgotCQkJZjEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzX3RmIiwgbnVsbCwgbnVsbCk7Ci0JCQlGaWxlIGRpciA9IG5ldyBGaWxlKGJhc2UpOwotCQkJZjIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzX3RmIiwgIi50bXAiLCBkaXIpOwotCQkJRmlsZSBjdXJyZW50RmlsZTsKLQkJCVN0cmluZyBmaWxlTG9jYXRpb247Ci0JCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJCWN1cnJlbnRGaWxlID0gaSA9PSAwID8gZjEgOiBmMjsKLQkJCQlmaWxlTG9jYXRpb24gPSBjdXJyZW50RmlsZS5nZXRQYXJlbnQoKTsKLQkJCQlpZiAoIWZpbGVMb2NhdGlvbi5lbmRzV2l0aChzbGFzaCkpCi0JCQkJCWZpbGVMb2NhdGlvbiArPSBzbGFzaDsKLQkJCQlpZiAoIWJhc2UuZW5kc1dpdGgoc2xhc2gpKQotCQkJCQliYXNlICs9IHNsYXNoOwotCQkJCWFzc2VydFRydWUoCi0JCQkJCQkiRmlsZSBub3QgY3JlYXRlZCBpbiB0aGUgZGVmYXVsdCB0ZW1wb3JhcnktZmlsZSBsb2NhdGlvbi4iLAotCQkJCQkJZmlsZUxvY2F0aW9uLmVxdWFscyhiYXNlKSk7Ci0JCQkJZmlsZU5hbWUgPSBjdXJyZW50RmlsZS5nZXROYW1lKCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiRmlsZSBjcmVhdGVkIHdpdGggaW5jb3JyZWN0IHN1ZmZpeC4iLCBmaWxlTmFtZQotCQkJCQkJLmVuZHNXaXRoKCIudG1wIikpOwotCQkJCWFzc2VydFRydWUoIkZpbGUgY3JlYXRlZCB3aXRoIGluY29ycmVjdCBwcmVmaXguIiwgZmlsZU5hbWUKLQkJCQkJCS5zdGFydHNXaXRoKCJoeXRzX3RmIikpOwotCQkJCWN1cnJlbnRGaWxlLmRlbGV0ZSgpOwotCQkJfQorICAgICAgICAgICAgLy8gVGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdGVtcGZpbGUgd2FzIHNhdmVkIGluIHRoZSBjb3JyZWN0CisgICAgICAgICAgICAvLyBsb2NhdGlvbgorICAgICAgICAgICAgLy8gYW5kIHdpdGggdGhlIGNvcnJlY3QgcHJlZml4L3N1ZmZpeC4KKyAgICAgICAgICAgIGYxID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c190ZiIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShiYXNlKTsKKyAgICAgICAgICAgIGYyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c190ZiIsICIudG1wIiwgZGlyKTsKKyAgICAgICAgICAgIEZpbGUgY3VycmVudEZpbGU7CisgICAgICAgICAgICBTdHJpbmcgZmlsZUxvY2F0aW9uOworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmlsZSA9IGkgPT0gMCA/IGYxIDogZjI7CisgICAgICAgICAgICAgICAgZmlsZUxvY2F0aW9uID0gY3VycmVudEZpbGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlTG9jYXRpb24uZW5kc1dpdGgoc2xhc2gpKQorICAgICAgICAgICAgICAgICAgICBmaWxlTG9jYXRpb24gKz0gc2xhc2g7CisgICAgICAgICAgICAgICAgaWYgKCFiYXNlLmVuZHNXaXRoKHNsYXNoKSkKKyAgICAgICAgICAgICAgICAgICAgYmFzZSArPSBzbGFzaDsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgbm90IGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgdGVtcG9yYXJ5LWZpbGUgbG9jYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMb2NhdGlvbi5lcXVhbHMoYmFzZSkpOworICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gY3VycmVudEZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgY3JlYXRlZCB3aXRoIGluY29ycmVjdCBzdWZmaXguIiwgZmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lbmRzV2l0aCgiLnRtcCIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIGNyZWF0ZWQgd2l0aCBpbmNvcnJlY3QgcHJlZml4LiIsIGZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCgiaHl0c190ZiIpKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gVGVzdCBmb3IgY3JlYXRpbmcgYSB0ZW1wZmlsZSBpbiBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0LgotCQkJaW50IGRpck51bWJlciA9IDE7Ci0JCQlib29sZWFuIGRpckV4aXN0cyA9IHRydWU7Ci0JCQkvLyBTZXQgZGlyIHRvIGEgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeSBpbnNpZGUgdGhlIHRlbXBvcmFyeQotCQkJLy8gZGlyZWN0b3J5Ci0JCQlkaXIgPSBuZXcgRmlsZShiYXNlLCBTdHJpbmcudmFsdWVPZihkaXJOdW1iZXIpKTsKLQkJCS8vIE1ha2luZyBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KLQkJCXdoaWxlIChkaXJFeGlzdHMpIHsKLQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGV4aXN0cywgYWRkIG9uZSB0byB0aGUgZGlyZWN0b3J5IG51bWJlcgotCQkJCS8vIChtYWtpbmcgaXQKLQkJCQkvLyBhIG5ldyBkaXJlY3RvcnkgbmFtZS4pCi0JCQkJaWYgKGRpci5leGlzdHMoKSkgewotCQkJCQlkaXJOdW1iZXIrKzsKLQkJCQkJZGlyID0gbmV3IEZpbGUoYmFzZSwgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlyRXhpc3RzID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQkvLyBUcnkgdG8gY3JlYXRlIGEgZmlsZSBpbiBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0Ci0JCQkJRmlsZSBmMyA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImh5dHNfdGYiLCBudWxsLCBkaXIpOwotCQkJCWYzLmRlbGV0ZSgpOwotCQkJCWZhaWwoIklPRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWRpci5kZWxldGUoKTsKKyAgICAgICAgICAgIC8vIFRlc3QgZm9yIGNyZWF0aW5nIGEgdGVtcGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgIGludCBkaXJOdW1iZXIgPSAxOworICAgICAgICAgICAgYm9vbGVhbiBkaXJFeGlzdHMgPSB0cnVlOworICAgICAgICAgICAgLy8gU2V0IGRpciB0byBhIG5vbi1leGlzdGVudCBkaXJlY3RvcnkgaW5zaWRlIHRoZSB0ZW1wb3JhcnkKKyAgICAgICAgICAgIC8vIGRpcmVjdG9yeQorICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoYmFzZSwgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7CisgICAgICAgICAgICAvLyBNYWtpbmcgc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCisgICAgICAgICAgICB3aGlsZSAoZGlyRXhpc3RzKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRpcmVjdG9yeSBleGlzdHMsIGFkZCBvbmUgdG8gdGhlIGRpcmVjdG9yeSBudW1iZXIKKyAgICAgICAgICAgICAgICAvLyAobWFraW5nIGl0CisgICAgICAgICAgICAgICAgLy8gYSBuZXcgZGlyZWN0b3J5IG5hbWUuKQorICAgICAgICAgICAgICAgIGlmIChkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyTnVtYmVyKys7CisgICAgICAgICAgICAgICAgICAgIGRpciA9IG5ldyBGaWxlKGJhc2UsIFN0cmluZy52YWx1ZU9mKGRpck51bWJlcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpckV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgIEZpbGUgZjMgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzX3RmIiwgbnVsbCwgZGlyKTsKKyAgICAgICAgICAgICAgICBmMy5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBub3QgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXIuZGVsZXRlKCk7CiAKLQkJCS8vIFRlc3RzIGZvciBjcmVhdGluZyBhIHRlbXBmaWxlIHdpdGggYSBmaWxlbmFtZSBzaG9ydGVyIHRoYW4gMwotCQkJLy8gY2hhcmFjdGVycy4KLQkJCXRyeSB7Ci0JCQkJRmlsZSBmNCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFiIiwgbnVsbCwgbnVsbCk7Ci0JCQkJZjQuZGVsZXRlKCk7Ci0JCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24uIik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlGaWxlIGY0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYSIsIG51bGwsIG51bGwpOwotCQkJCWY0LmRlbGV0ZSgpOwotCQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duLiIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJRmlsZSBmNCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIiIsIG51bGwsIG51bGwpOwotCQkJCWY0LmRlbGV0ZSgpOwotCQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duLiIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0KKyAgICAgICAgICAgIC8vIFRlc3RzIGZvciBjcmVhdGluZyBhIHRlbXBmaWxlIHdpdGggYSBmaWxlbmFtZSBzaG9ydGVyIHRoYW4gMworICAgICAgICAgICAgLy8gY2hhcmFjdGVycy4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBmNCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFiIiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgZjQuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIGY0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYSIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIGY0LmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBmNCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIiIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIGY0LmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0OiAiICsgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZjEgIT0gbnVsbCkKLQkJCQlmMS5kZWxldGUoKTsKLQkJCWlmIChmMiAhPSBudWxsKQotCQkJCWYxLmRlbGV0ZSgpOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0OiAiICsgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZjEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmMS5kZWxldGUoKTsKKyAgICAgICAgICAgIGlmIChmMiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGYxLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNkZWxldGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuZGVsZXRlKCkKLQkJdHJ5IHsKLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLCBwbGF0Zm9ybUlkCi0JCQkJCSsgImZpbGVjaGsiKTsKLQkJCWRpci5ta2RpcigpOwotCQkJYXNzZXJ0VHJ1ZSgiRGlyZWN0b3J5IERvZXMgTm90IEV4aXN0IiwgZGlyLmV4aXN0cygpCi0JCQkJCSYmIGRpci5pc0RpcmVjdG9yeSgpKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGRpciwgImZpbGVjaGsudHN0Iik7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKCJFcnJvciBDcmVhdGluZyBGaWxlIEZvciBEZWxldGUgVGVzdCIsIGYuZXhpc3RzKCkpOwotCQkJZGlyLmRlbGV0ZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiRGlyZWN0b3J5IFNob3VsZCBOb3QgSGF2ZSBCZWVuIERlbGV0ZWQuIiwgZGlyLmV4aXN0cygpKTsKLQkJCWYuZGVsZXRlKCk7Ci0JCQlhc3NlcnRUcnVlKCJGaWxlIFdhcyBOb3QgRGVsZXRlZCIsICFmLmV4aXN0cygpKTsKLQkJCWRpci5kZWxldGUoKTsKLQkJCWFzc2VydFRydWUoIkRpcmVjdG9yeSBXYXMgTm90IERlbGV0ZWQiLCAhZGlyLmV4aXN0cygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBEdXJpbmcgRGVsZXRlIFRlc3QgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZGVsZXRlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZGVsZXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWxlLmRlbGV0ZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgcGxhdGZvcm1JZAorICAgICAgICAgICAgICAgICAgICArICJmaWxlY2hrIik7CisgICAgICAgICAgICBkaXIubWtkaXIoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRpcmVjdG9yeSBEb2VzIE5vdCBFeGlzdCIsIGRpci5leGlzdHMoKQorICAgICAgICAgICAgICAgICAgICAmJiBkaXIuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsICJmaWxlY2hrLnRzdCIpOworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXJyb3IgQ3JlYXRpbmcgRmlsZSBGb3IgRGVsZXRlIFRlc3QiLCBmLmV4aXN0cygpKTsKKyAgICAgICAgICAgIGRpci5kZWxldGUoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRpcmVjdG9yeSBTaG91bGQgTm90IEhhdmUgQmVlbiBEZWxldGVkLiIsIGRpci5leGlzdHMoKSk7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBXYXMgTm90IERlbGV0ZWQiLCAhZi5leGlzdHMoKSk7CisgICAgICAgICAgICBkaXIuZGVsZXRlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXJlY3RvcnkgV2FzIE5vdCBEZWxldGVkIiwgIWRpci5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIERlbGV0ZSBUZXN0IDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIEEgcGFydGlhbCB0ZXN0IGZvciBkZWxldGVPbkV4aXQuIFNpbmNlIHdlIG5lZWQgdG8gc2h1dGRvd24gdGhlIFZNIHRvCiAgICAgICogYWN0dWFsbHkgZGVsZXRlIHRoZSBmaWxlcywgd2UgY2FuIG5ldmVyIG9ic2VydmUgdGhlIHJlc3VsdHMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9EZWxldGVPbkV4aXQoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImRlbGV0ZU9uRXhpdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9EZWxldGVPbkV4aXQoKSB7CiAgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJEZWxldGVPbkV4aXRGMS0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICAgICAgICBGaWxlIGQxID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLCAiRGVsZXRlT25FeGl0RDEtIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKGQxLCAiRGVsZXRlT25FeGl0RjItIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKQEAgLTY0MCwyMjAgKzc2MCwyNjIgQEAKICAgICAgICAgZDEuZGVsZXRlT25FeGl0KCk7CiAgICAgICAgIGYyLmRlbGV0ZU9uRXhpdCgpOwogICAgIH0KLQkKKyAgICAKIC8vIEdDSCAgICAKIC8vIFRPRE8gOiBUaGlzIHRlc3QgcGFzc2VzIG9uIFdpbmRvd3MgYnV0IGZhaWxzIG9uIExpbnV4IHdpdGggYSAKIC8vIGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvci4gVGVtcG9yYXJpbHkgcmVtb3ZpbmcgZnJvbSB0aGUgdGVzdAogLy8gc3VpdGUgd2hpbGUgSSBpbnZlc3RpZ2F0ZSB0aGUgY2F1c2UuIAotLy8JLyoqCi0vLwkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2RlbGV0ZU9uRXhpdCgpCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlT25FeGl0KCkgewotLy8JCUZpbGUgZjEgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksIHBsYXRmb3JtSWQKLS8vCQkJCSsgImRlbGV0ZU9uRXhpdC50c3QiKTsKLS8vCQl0cnkgewotLy8JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYxKTsKLS8vCQkJZm9zLmNsb3NlKCk7Ci0vLwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotLy8JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLS8vCQl9Ci0vLwkJYXNzZXJ0VHJ1ZSgiRmlsZSBTaG91bGQgRXhpc3QuIiwgZjEuZXhpc3RzKCkpOworLy8gICAgLyoqCisvLyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2RlbGV0ZU9uRXhpdCgpCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlT25FeGl0KCkgeworLy8gICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksIHBsYXRmb3JtSWQKKy8vICAgICAgICAgICAgICAgICsgImRlbGV0ZU9uRXhpdC50c3QiKTsKKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYxKTsKKy8vICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisvLyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworLy8gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBTaG91bGQgRXhpc3QuIiwgZjEuZXhpc3RzKCkpOwogLy8KLS8vCQl0cnkgewotLy8JCQlTdXBwb3J0X0V4ZWMuZXhlY0phdmEobmV3IFN0cmluZ1tdIHsKLS8vCQkJCQkidGVzdHMuc3VwcG9ydC5TdXBwb3J0X0RlbGV0ZU9uRXhpdFRlc3QiLCBmMS5nZXRQYXRoKCkgfSwKLS8vCQkJCQludWxsLCB0cnVlKTsKLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJCWZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIFRlc3QgKyAiICsgZS5nZXRNZXNzYWdlKCkpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLS8vCQkJZmFpbCgiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBEdXJpbmcgVGVzdDogIiArIGUpOwotLy8JCX0KKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBTdXBwb3J0X0V4ZWMuZXhlY0phdmEobmV3IFN0cmluZ1tdIHsKKy8vICAgICAgICAgICAgICAgICAgICAidGVzdHMuc3VwcG9ydC5TdXBwb3J0X0RlbGV0ZU9uRXhpdFRlc3QiLCBmMS5nZXRQYXRoKCkgfSwKKy8vICAgICAgICAgICAgICAgICAgICBudWxsLCB0cnVlKTsKKy8vICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIFRlc3QgKyAiICsgZS5nZXRNZXNzYWdlKCkpOworLy8gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKy8vICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBEdXJpbmcgVGVzdDogIiArIGUpOworLy8gICAgICAgIH0KIC8vCi0vLwkJYm9vbGVhbiBnb25lID0gIWYxLmV4aXN0cygpOwotLy8JCWYxLmRlbGV0ZSgpOwotLy8JCWFzc2VydFRydWUoIkZpbGUgU2hvdWxkIEFscmVhZHkgQmUgRGVsZXRlZC4iLCBnb25lKTsKLS8vCX0KKy8vICAgICAgICBib29sZWFuIGdvbmUgPSAhZjEuZXhpc3RzKCk7CisvLyAgICAgICAgZjEuZGVsZXRlKCk7CisvLyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBTaG91bGQgQWxyZWFkeSBCZSBEZWxldGVkLiIsIGdvbmUpOworLy8gICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCUZpbGUgZjEgPSBuZXcgRmlsZSgiZmlsZWNoay50c3QiKTsKLQkJRmlsZSBmMiA9IG5ldyBGaWxlKCJmaWxlY2hrLnRzdCIpOwotCQlGaWxlIGYzID0gbmV3IEZpbGUoInh4eHgiKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBlcXVhbHMoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZSgiZmlsZWNoay50c3QiKTsKKyAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKCJmaWxlY2hrLnRzdCIpOworICAgICAgICBGaWxlIGYzID0gbmV3IEZpbGUoInh4eHgiKTsKIAotCQlhc3NlcnRUcnVlKCJFcXVhbGl0eSB0ZXN0IGZhaWxlZCIsIGYxLmVxdWFscyhmMikpOwotCQlhc3NlcnRUcnVlKCJGaWxlcyBTaG91bGQgTm90IFJldHVybiBFcXVhbC4iLCAhZjEuZXF1YWxzKGYzKSk7CisgICAgICAgIGFzc2VydFRydWUoIkVxdWFsaXR5IHRlc3QgZmFpbGVkIiwgZjEuZXF1YWxzKGYyKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGVzIFNob3VsZCBOb3QgUmV0dXJuIEVxdWFsLiIsICFmMS5lcXVhbHMoZjMpKTsKIAotCQlmMyA9IG5ldyBGaWxlKCJGaUxlQ2hLLnRzdCIpOwotCQlib29sZWFuIG9uV2luZG93cyA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnOwotCQlib29sZWFuIG9uVW5peCA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLyc7Ci0JCWlmIChvbldpbmRvd3MpCi0JCQlhc3NlcnRUcnVlKCJGaWxlcyBTaG91bGQgUmV0dXJuIEVxdWFsLiIsIGYxLmVxdWFscyhmMykpOwotCQllbHNlIGlmIChvblVuaXgpCi0JCQlhc3NlcnRUcnVlKCJGaWxlcyBTaG91bGQgTk9UIFJldHVybiBFcXVhbC4iLCAhZjEuZXF1YWxzKGYzKSk7CisgICAgICAgIGYzID0gbmV3IEZpbGUoIkZpTGVDaEsudHN0Iik7CisgICAgICAgIGJvb2xlYW4gb25XaW5kb3dzID0gRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCc7CisgICAgICAgIGJvb2xlYW4gb25Vbml4ID0gRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJzsKKyAgICAgICAgaWYgKG9uV2luZG93cykKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGVzIFNob3VsZCBSZXR1cm4gRXF1YWwuIiwgZjEuZXF1YWxzKGYzKSk7CisgICAgICAgIGVsc2UgaWYgKG9uVW5peCkKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGVzIFNob3VsZCBOT1QgUmV0dXJuIEVxdWFsLiIsICFmMS5lcXVhbHMoZjMpKTsKIAotCQl0cnkgewotCQkJZjEgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJjYXNldGVzdC50bXAiKTsKLQkJCWYyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLCAiQ2FzZVRlc3QudG1wIik7Ci0JCQluZXcgRmlsZU91dHB1dFN0cmVhbShmMSkuY2xvc2UoKTsgLy8gY3JlYXRlIHRoZSBmaWxlCi0JCQlpZiAoZjEuZXF1YWxzKGYyKSkgewotCQkJCXRyeSB7Ci0JCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oZjIpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZmFpbCgiRmlsZSBzeXN0ZW0gaXMgY2FzZSBzZW5zaXRpdmUiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShmMik7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlleGNlcHRpb24gPSB0cnVlOwotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKCJGaWxlIHN5c3RlbSBpcyBjYXNlIGluc2Vuc2l0aXZlIiwgZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWYxLmRlbGV0ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIHVzaW5nIGNhc2Ugc2Vuc2l0aXZlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZjEgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJjYXNldGVzdC50bXAiKTsKKyAgICAgICAgICAgIGYyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLCAiQ2FzZVRlc3QudG1wIik7CisgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShmMSkuY2xvc2UoKTsgLy8gY3JlYXRlIHRoZSBmaWxlCisgICAgICAgICAgICBpZiAoZjEuZXF1YWxzKGYyKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oZjIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmlsZSBzeXN0ZW0gaXMgY2FzZSBzZW5zaXRpdmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShmMik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHN5c3RlbSBpcyBjYXNlIGluc2Vuc2l0aXZlIiwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGYxLmRlbGV0ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIHVzaW5nIGNhc2Ugc2Vuc2l0aXZlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNleGlzdHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZXhpc3RzKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuZXhpc3RzKCkKLQkJdHJ5IHsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgcGxhdGZvcm1JZAotCQkJCQkrICJleGlzdHMudHN0Iik7Ci0JCQlhc3NlcnRUcnVlKCJFeGlzdHMgcmV0dXJuZWQgdHJ1ZSBmb3Igbm9uLWV4aXN0ZW50IGZpbGUiLCAhZgotCQkJCQkuZXhpc3RzKCkpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiRXhpc3RzIHJldHVybmVkIGZhbHNlIGZpbGUiLCBmLmV4aXN0cygpKTsKLQkJCWYuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIFRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZXhpc3RzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZXhpc3RzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfZXhpc3RzKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuZXhpc3RzKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgcGxhdGZvcm1JZAorICAgICAgICAgICAgICAgICAgICArICJleGlzdHMudHN0Iik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeGlzdHMgcmV0dXJuZWQgdHJ1ZSBmb3Igbm9uLWV4aXN0ZW50IGZpbGUiLCAhZgorICAgICAgICAgICAgICAgICAgICAuZXhpc3RzKCkpOworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhpc3RzIHJldHVybmVkIGZhbHNlIGZpbGUiLCBmLmV4aXN0cygpKTsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIFRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNnZXRBYnNvbHV0ZUZpbGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWJzb2x1dGVGaWxlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlIGdldEFic29sdXRlRmlsZSgpCi0JCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQlpZiAoIWJhc2UuZW5kc1dpdGgoc2xhc2gpKQotCQkJYmFzZSArPSBzbGFzaDsKLQkJRmlsZSBmID0gbmV3IEZpbGUoYmFzZSwgInRlbXAudHN0Iik7Ci0JCUZpbGUgZjIgPSBmLmdldEFic29sdXRlRmlsZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QgMTogSW5jb3JyZWN0IEZpbGUgUmV0dXJuZWQuIiwgMCwgZjIuY29tcGFyZVRvKGYKLQkJCQkuZ2V0QWJzb2x1dGVGaWxlKCkpKTsKLQkJZiA9IG5ldyBGaWxlKGJhc2UgKyAiVGVtcCIgKyBzbGFzaCArIHNsYXNoICsgInRlbXAudHN0Iik7Ci0JCWYyID0gZi5nZXRBYnNvbHV0ZUZpbGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IDI6IEluY29ycmVjdCBGaWxlIFJldHVybmVkLiIsIDAsIGYyLmNvbXBhcmVUbyhmCi0JCQkJLmdldEFic29sdXRlRmlsZSgpKSk7Ci0JCWYgPSBuZXcgRmlsZShiYXNlICsgc2xhc2ggKyAiLi4iICsgc2xhc2ggKyAidGVtcC50c3QiKTsKLQkJZjIgPSBmLmdldEFic29sdXRlRmlsZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QgMzogSW5jb3JyZWN0IEZpbGUgUmV0dXJuZWQuIiwgMCwgZjIuY29tcGFyZVRvKGYKLQkJCQkuZ2V0QWJzb2x1dGVGaWxlKCkpKTsKLQkJZi5kZWxldGUoKTsKLQkJZjIuZGVsZXRlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZ2V0QWJzb2x1dGVGaWxlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0QWJzb2x1dGVGaWxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFic29sdXRlRmlsZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZSBnZXRBYnNvbHV0ZUZpbGUoKQorICAgICAgICBTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgaWYgKCFiYXNlLmVuZHNXaXRoKHNsYXNoKSkKKyAgICAgICAgICAgIGJhc2UgKz0gc2xhc2g7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJhc2UsICJ0ZW1wLnRzdCIpOworICAgICAgICBGaWxlIGYyID0gZi5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IDE6IEluY29ycmVjdCBGaWxlIFJldHVybmVkLiIsIDAsIGYyLmNvbXBhcmVUbyhmCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlRmlsZSgpKSk7CisgICAgICAgIGYgPSBuZXcgRmlsZShiYXNlICsgIlRlbXAiICsgc2xhc2ggKyBzbGFzaCArICJ0ZW1wLnRzdCIpOworICAgICAgICBmMiA9IGYuZ2V0QWJzb2x1dGVGaWxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGVzdCAyOiBJbmNvcnJlY3QgRmlsZSBSZXR1cm5lZC4iLCAwLCBmMi5jb21wYXJlVG8oZgorICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZUZpbGUoKSkpOworICAgICAgICBmID0gbmV3IEZpbGUoYmFzZSArIHNsYXNoICsgIi4uIiArIHNsYXNoICsgInRlbXAudHN0Iik7CisgICAgICAgIGYyID0gZi5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IDM6IEluY29ycmVjdCBGaWxlIFJldHVybmVkLiIsIDAsIGYyLmNvbXBhcmVUbyhmCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlRmlsZSgpKSk7CisgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIGYyLmRlbGV0ZSgpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZ2V0QWJzb2x1dGVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEFic29sdXRlUGF0aCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpCi0JCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQlpZiAoIWJhc2UucmVnaW9uTWF0Y2hlcygoYmFzZS5sZW5ndGgoKSAtIDEpLCBzbGFzaCwgMCwgMSkpCi0JCQliYXNlICs9IHNsYXNoOwotCQlGaWxlIGYgPSBuZXcgRmlsZShiYXNlLCAidGVtcC50c3QiKTsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCAxOiBJbmNvcnJlY3QgUGF0aCBSZXR1cm5lZC4iLCBmLmdldEFic29sdXRlUGF0aCgpCi0JCQkJLmVxdWFscyhiYXNlICsgInRlbXAudHN0IikpOwotCQlmID0gbmV3IEZpbGUoYmFzZSArICJUZW1wIiArIHNsYXNoICsgc2xhc2ggKyBzbGFzaCArICJUZXN0aW5nIiArIHNsYXNoCi0JCQkJKyAidGVtcC50c3QiKTsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCAyOiBJbmNvcnJlY3QgUGF0aCBSZXR1cm5lZC4iLCBmLmdldEFic29sdXRlUGF0aCgpCi0JCQkJLmVxdWFscyhiYXNlICsgIlRlbXAiICsgc2xhc2ggKyAiVGVzdGluZyIgKyBzbGFzaCArICJ0ZW1wLnRzdCIpKTsKLQkJZiA9IG5ldyBGaWxlKGJhc2UgKyAiYSIgKyBzbGFzaCArIHNsYXNoICsgIi4uIiArIHNsYXNoICsgInRlbXAudHN0Iik7Ci0JCWFzc2VydFRydWUoIlRlc3QgMzogSW5jb3JyZWN0IFBhdGggUmV0dXJuZWQuIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCksIGYKLQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKAotCQkJCQkJYmFzZSArICJhIiArIHNsYXNoICsgIi4uIiArIHNsYXNoICsgInRlbXAudHN0IikpOwotCQlmLmRlbGV0ZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2dldEFic29sdXRlUGF0aCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldEFic29sdXRlUGF0aCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBYnNvbHV0ZVBhdGgoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICBTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgaWYgKCFiYXNlLnJlZ2lvbk1hdGNoZXMoKGJhc2UubGVuZ3RoKCkgLSAxKSwgc2xhc2gsIDAsIDEpKQorICAgICAgICAgICAgYmFzZSArPSBzbGFzaDsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYmFzZSwgInRlbXAudHN0Iik7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMTogSW5jb3JyZWN0IFBhdGggUmV0dXJuZWQuIiwgZi5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoYmFzZSArICJ0ZW1wLnRzdCIpKTsKKyAgICAgICAgZiA9IG5ldyBGaWxlKGJhc2UgKyAiVGVtcCIgKyBzbGFzaCArIHNsYXNoICsgc2xhc2ggKyAiVGVzdGluZyIgKyBzbGFzaAorICAgICAgICAgICAgICAgICsgInRlbXAudHN0Iik7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMjogSW5jb3JyZWN0IFBhdGggUmV0dXJuZWQuIiwgZi5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoYmFzZSArICJUZW1wIiArIHNsYXNoICsgIlRlc3RpbmciICsgc2xhc2ggKyAidGVtcC50c3QiKSk7CisgICAgICAgIGYgPSBuZXcgRmlsZShiYXNlICsgImEiICsgc2xhc2ggKyBzbGFzaCArICIuLiIgKyBzbGFzaCArICJ0ZW1wLnRzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDM6IEluY29ycmVjdCBQYXRoIFJldHVybmVkLiIgKyBmLmdldEFic29sdXRlUGF0aCgpLCBmCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyAiYSIgKyBzbGFzaCArICIuLiIgKyBzbGFzaCArICJ0ZW1wLnRzdCIpKTsKKyAgICAgICAgZi5kZWxldGUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2dldENhbm9uaWNhbEZpbGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2Fub25pY2FsRmlsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkKLQkJdHJ5IHsKLQkJCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQkJaWYgKCFiYXNlLmVuZHNXaXRoKHNsYXNoKSkKLQkJCQliYXNlICs9IHNsYXNoOwotCQkJRmlsZSBmID0gbmV3IEZpbGUoYmFzZSwgInRlbXAudHN0Iik7Ci0JCQlGaWxlIGYyID0gZi5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlRlc3QgMTogSW5jb3JyZWN0IEZpbGUgUmV0dXJuZWQuIiwgMCwgZjIKLQkJCQkJLmdldENhbm9uaWNhbEZpbGUoKS5jb21wYXJlVG8oZi5nZXRDYW5vbmljYWxGaWxlKCkpKTsKLQkJCWYgPSBuZXcgRmlsZShiYXNlICsgIlRlbXAiICsgc2xhc2ggKyBzbGFzaCArICJ0ZW1wLnRzdCIpOwotCQkJZjIgPSBmLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCWFzc2VydEVxdWFscygiVGVzdCAyOiBJbmNvcnJlY3QgRmlsZSBSZXR1cm5lZC4iLCAwLCBmMgotCQkJCQkuZ2V0Q2Fub25pY2FsRmlsZSgpLmNvbXBhcmVUbyhmLmdldENhbm9uaWNhbEZpbGUoKSkpOwotCQkJZiA9IG5ldyBGaWxlKGJhc2UgKyAiVGVtcCIgKyBzbGFzaCArIHNsYXNoICsgIi4uIiArIHNsYXNoCi0JCQkJCSsgInRlbXAudHN0Iik7Ci0JCQlmMiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJUZXN0IDM6IEluY29ycmVjdCBGaWxlIFJldHVybmVkLiIsIDAsIGYyCi0JCQkJCS5nZXRDYW5vbmljYWxGaWxlKCkuY29tcGFyZVRvKGYuZ2V0Q2Fub25pY2FsRmlsZSgpKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNnZXRDYW5vbmljYWxGaWxlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiAmIFNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRDYW5vbmljYWxGaWxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENhbm9uaWNhbEZpbGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgICAgIGlmICghYmFzZS5lbmRzV2l0aChzbGFzaCkpCisgICAgICAgICAgICAgICAgYmFzZSArPSBzbGFzaDsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJhc2UsICJ0ZW1wLnRzdCIpOworICAgICAgICAgICAgRmlsZSBmMiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IDE6IEluY29ycmVjdCBGaWxlIFJldHVybmVkLiIsIDAsIGYyCisgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxGaWxlKCkuY29tcGFyZVRvKGYuZ2V0Q2Fub25pY2FsRmlsZSgpKSk7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoYmFzZSArICJUZW1wIiArIHNsYXNoICsgc2xhc2ggKyAidGVtcC50c3QiKTsKKyAgICAgICAgICAgIGYyID0gZi5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3QgMjogSW5jb3JyZWN0IEZpbGUgUmV0dXJuZWQuIiwgMCwgZjIKKyAgICAgICAgICAgICAgICAgICAgLmdldENhbm9uaWNhbEZpbGUoKS5jb21wYXJlVG8oZi5nZXRDYW5vbmljYWxGaWxlKCkpKTsKKyAgICAgICAgICAgIGYgPSBuZXcgRmlsZShiYXNlICsgIlRlbXAiICsgc2xhc2ggKyBzbGFzaCArICIuLiIgKyBzbGFzaAorICAgICAgICAgICAgICAgICAgICArICJ0ZW1wLnRzdCIpOworICAgICAgICAgICAgZjIgPSBmLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGVzdCAzOiBJbmNvcnJlY3QgRmlsZSBSZXR1cm5lZC4iLCAwLCBmMgorICAgICAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsRmlsZSgpLmNvbXBhcmVUbyhmLmdldENhbm9uaWNhbEZpbGUoKSkpOwogCi0JCQkvLyBUZXN0IGZvciB3aGVuIGxvbmcgZGlyZWN0b3J5L2ZpbGUgbmFtZXMgaW4gV2luZG93cwkKLQkJCWJvb2xlYW4gb25XaW5kb3dzID0gRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCc7Ci0JCQkvLyBTdHJpbmcgdXNlckRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQkJCWlmIChvbldpbmRvd3MpIHsKLQkJCQlGaWxlIHRlc3RkaXIgPSBuZXcgRmlsZShiYXNlLCAibG9uZy0iICsgcGxhdGZvcm1JZCk7Ci0JCQkJdGVzdGRpci5ta2RpcigpOwotCQkJCUZpbGUgZGlyID0gbmV3IEZpbGUodGVzdGRpciwgImxvbmdkaXJlY3RvcnkiICsgcGxhdGZvcm1JZCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGlyLm1rZGlyKCk7Ci0JCQkJCWYgPSBuZXcgRmlsZShkaXIsICJsb25nZmlsZW5hbWUudHN0Iik7Ci0JCQkJCWYyID0gZi5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQkJCWFzc2VydEVxdWFscygiVGVzdCA0OiBJbmNvcnJlY3QgRmlsZSBSZXR1cm5lZC4iLAotCQkJCQkJCTAsIGYyLmdldENhbm9uaWNhbEZpbGUoKS5jb21wYXJlVG8oCi0JCQkJCQkJCQlmLmdldENhbm9uaWNhbEZpbGUoKSkpOwotCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQkJZjIgPSBuZXcgRmlsZSh0ZXN0ZGlyICsgc2xhc2ggKyAibG9uZ2RpfjEiICsgc2xhc2gKLQkJCQkJCQkrICJsb25nZml+MS50c3QiKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X2dldENhbm9uaWNhbEZpbGUiKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmOiAiICsgZi5nZXRDYW5vbmljYWxGaWxlKCkpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImYzOiAiICsgZjMuZ2V0Q2Fub25pY2FsRmlsZSgpKTsKLQkJCQkJRmlsZSBjYW5vbmljYWxmMiA9IGYyLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgIC8vIFRlc3QgZm9yIHdoZW4gbG9uZyBkaXJlY3RvcnkvZmlsZSBuYW1lcyBpbiBXaW5kb3dzICAgIAorICAgICAgICAgICAgYm9vbGVhbiBvbldpbmRvd3MgPSBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJzsKKyAgICAgICAgICAgIC8vIFN0cmluZyB1c2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworICAgICAgICAgICAgaWYgKG9uV2luZG93cykgeworICAgICAgICAgICAgICAgIEZpbGUgdGVzdGRpciA9IG5ldyBGaWxlKGJhc2UsICJsb25nLSIgKyBwbGF0Zm9ybUlkKTsKKyAgICAgICAgICAgICAgICB0ZXN0ZGlyLm1rZGlyKCk7CisgICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZSh0ZXN0ZGlyLCAibG9uZ2RpcmVjdG9yeSIgKyBwbGF0Zm9ybUlkKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGRpciwgImxvbmdmaWxlbmFtZS50c3QiKTsKKyAgICAgICAgICAgICAgICAgICAgZjIgPSBmLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IDQ6IEluY29ycmVjdCBGaWxlIFJldHVybmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZjIuZ2V0Q2Fub25pY2FsRmlsZSgpLmNvbXBhcmVUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2V0Q2Fub25pY2FsRmlsZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBmMiA9IG5ldyBGaWxlKHRlc3RkaXIgKyBzbGFzaCArICJsb25nZGl+MSIgKyBzbGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImxvbmdmaX4xLnRzdCIpOworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfZ2V0Q2Fub25pY2FsRmlsZSIpOworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImY6ICIgKyBmLmdldENhbm9uaWNhbEZpbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZjM6ICIgKyBmMy5nZXRDYW5vbmljYWxGaWxlKCkpOworICAgICAgICAgICAgICAgICAgICBGaWxlIGNhbm9uaWNhbGYyID0gZjIuZ2V0Q2Fub25pY2FsRmlsZSgpOwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGUgInNob3J0IGZpbGUgbmFtZSIgZG9lc24ndCBleGlzdCwgdGhlbiBhc3N1bWUgdGhhdAogICAgICAgICAgICAgICAgICAgICAgKiB0aGUgOC4zIGZpbGUgbmFtZSBjb21wYXRpYmlsaXR5IGlzIGRpc2FibGVkLgogICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbm9uaWNhbGYyLmV4aXN0cygpKSB7Ci0JCQkJCWFzc2VydFRydWUoIlRlc3QgNTogSW5jb3JyZWN0IEZpbGUgUmV0dXJuZWQ6ICIKLQkJCQkJCQkrIGNhbm9uaWNhbGYyLCBjYW5vbmljYWxmMi5jb21wYXJlVG8oZgotCQkJCQkJCS5nZXRDYW5vbmljYWxGaWxlKCkpID09IDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDU6IEluY29ycmVjdCBGaWxlIFJldHVybmVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYW5vbmljYWxmMiwgY2Fub25pY2FsZjIuY29tcGFyZVRvKGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsRmlsZSgpKSA9PSAwKTsKICAgICAgICAgICAgICAgICAgICAgfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWYuZGVsZXRlKCk7Ci0JCQkJCWYyLmRlbGV0ZSgpOwotCQkJCQlkaXIuZGVsZXRlKCk7Ci0JCQkJCXRlc3RkaXIuZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsICgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBkdXJpbmcgVGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZjIuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGRpci5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdGRpci5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwgKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyBUZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgorICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZ2V0Q2Fub25pY2FsUGF0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gJiBTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0Q2Fub25pY2FsUGF0aCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENhbm9uaWNhbFBhdGgoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkKICAgICAgICAgLy8gU2hvdWxkIHdvcmsgZm9yIFVuaXgvV2luZG93cy4KQEAgLTk0NywyNjQgKzExMDksMzM0IEBACiAgICAgICAgIH0KICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5GaWxlLmdldE5hbWUoKQotCQlGaWxlIGYgPSBuZXcgRmlsZSgibmFtZS50c3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IDE6IFJldHVybmVkIGluY29ycmVjdCBuYW1lIiwgCi0JCQkJIm5hbWUudHN0IiwgZi5nZXROYW1lKCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZ2V0TmFtZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldE5hbWUoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uRmlsZS5nZXROYW1lKCkKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIm5hbWUudHN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiVGVzdCAxOiBSZXR1cm5lZCBpbmNvcnJlY3QgbmFtZSIsIAorICAgICAgICAgICAgICAgICJuYW1lLnRzdCIsIGYuZ2V0TmFtZSgpKTsKIAotCQlmID0gbmV3IEZpbGUoIiIpOwotCQlhc3NlcnRUcnVlKCJUZXN0IDI6IFJldHVybmVkIGluY29ycmVjdCBuYW1lIiwgZi5nZXROYW1lKCkuZXF1YWxzKCIiKSk7CisgICAgICAgIGYgPSBuZXcgRmlsZSgiIik7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMjogUmV0dXJuZWQgaW5jb3JyZWN0IG5hbWUiLCBmLmdldE5hbWUoKS5lcXVhbHMoIiIpKTsKIAotCQlmLmRlbGV0ZSgpOwotCX0KKyAgICAgICAgZi5kZWxldGUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2dldFBhcmVudCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uRmlsZS5nZXRQYXJlbnQoKQotCQlGaWxlIGYgPSBuZXcgRmlsZSgicC50c3QiKTsKLQkJYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IHBhdGggcmV0dXJuZWQiLCBmLmdldFBhcmVudCgpKTsKLQkJZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIiksICJwLnRzdCIpOwotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgcGF0aCByZXR1cm5lZCIsIGYuZ2V0UGFyZW50KCkuZXF1YWxzKAotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikpKTsKLQkJdHJ5IHsKLQkJCWYuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBkdXJpbmcgdGVzdHMgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNnZXRQYXJlbnQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRQYXJlbnQoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0UGFyZW50IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5GaWxlLmdldFBhcmVudCgpCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCJwLnRzdCIpOworICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgcGF0aCByZXR1cm5lZCIsIGYuZ2V0UGFyZW50KCkpOworICAgICAgICBmID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSwgInAudHN0Iik7CisgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBwYXRoIHJldHVybmVkIiwgZi5nZXRQYXJlbnQoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyB0ZXN0cyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCQlGaWxlIGYxID0gbmV3IEZpbGUoIi9kaXJlY3RvcnkiKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgcGFyZW50IHRlc3QgMSIsIGYxLmdldFBhcmVudCgpLmVxdWFscyhzbGFzaCkpOwotCQlmMSA9IG5ldyBGaWxlKCIvZGlyZWN0b3J5L2ZpbGUiKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgcGFyZW50IHRlc3QgMiIsIGYxLmdldFBhcmVudCgpLmVxdWFscygKLQkJCQlzbGFzaCArICJkaXJlY3RvcnkiKSk7Ci0JCWYxID0gbmV3IEZpbGUoImRpcmVjdG9yeS9maWxlIik7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgcGFyZW50IHRlc3QgMyIsICJkaXJlY3RvcnkiLCBmMS5nZXRQYXJlbnQoKSk7Ci0JCWYxID0gbmV3IEZpbGUoIi8iKTsKLQkJYXNzZXJ0TnVsbCgiV3JvbmcgcGFyZW50IHRlc3QgNCIsIGYxLmdldFBhcmVudCgpKTsKLQkJZjEgPSBuZXcgRmlsZSgiZGlyZWN0b3J5Iik7Ci0JCWFzc2VydE51bGwoIldyb25nIHBhcmVudCB0ZXN0IDUiLCBmMS5nZXRQYXJlbnQoKSk7CisgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZSgiL2RpcmVjdG9yeSIpOworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBwYXJlbnQgdGVzdCAxIiwgZjEuZ2V0UGFyZW50KCkuZXF1YWxzKHNsYXNoKSk7CisgICAgICAgIGYxID0gbmV3IEZpbGUoIi9kaXJlY3RvcnkvZmlsZSIpOworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBwYXJlbnQgdGVzdCAyIiwgZjEuZ2V0UGFyZW50KCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIHNsYXNoICsgImRpcmVjdG9yeSIpKTsKKyAgICAgICAgZjEgPSBuZXcgRmlsZSgiZGlyZWN0b3J5L2ZpbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBwYXJlbnQgdGVzdCAzIiwgImRpcmVjdG9yeSIsIGYxLmdldFBhcmVudCgpKTsKKyAgICAgICAgZjEgPSBuZXcgRmlsZSgiLyIpOworICAgICAgICBhc3NlcnROdWxsKCJXcm9uZyBwYXJlbnQgdGVzdCA0IiwgZjEuZ2V0UGFyZW50KCkpOworICAgICAgICBmMSA9IG5ldyBGaWxlKCJkaXJlY3RvcnkiKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiV3JvbmcgcGFyZW50IHRlc3QgNSIsIGYxLmdldFBhcmVudCgpKTsKIAotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcgJiYgbmV3IEZpbGUoImQ6LyIpLmlzQWJzb2x1dGUoKSkgewotCQkJZjEgPSBuZXcgRmlsZSgiZDovZGlyZWN0b3J5Iik7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBwYXJlbnQgdGVzdCAxYSIsIGYxLmdldFBhcmVudCgpLmVxdWFscygKLQkJCQkJImQ6IiArIHNsYXNoKSk7Ci0JCQlmMSA9IG5ldyBGaWxlKCJkOi9kaXJlY3RvcnkvZmlsZSIpOwotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgcGFyZW50IHRlc3QgMmEiLCBmMS5nZXRQYXJlbnQoKS5lcXVhbHMoCi0JCQkJCSJkOiIgKyBzbGFzaCArICJkaXJlY3RvcnkiKSk7Ci0JCQlmMSA9IG5ldyBGaWxlKCJkOmRpcmVjdG9yeS9maWxlIik7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIHBhcmVudCB0ZXN0IDNhIiwgCi0JCQkJCSJkOmRpcmVjdG9yeSIsIGYxLmdldFBhcmVudCgpKTsKLQkJCWYxID0gbmV3IEZpbGUoImQ6LyIpOwotCQkJYXNzZXJ0TnVsbCgiV3JvbmcgcGFyZW50IHRlc3QgNGEiLCBmMS5nZXRQYXJlbnQoKSk7Ci0JCQlmMSA9IG5ldyBGaWxlKCJkOmRpcmVjdG9yeSIpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBwYXJlbnQgdGVzdCA1YSIsICJkOiIsIGYxLmdldFBhcmVudCgpKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnICYmIG5ldyBGaWxlKCJkOi8iKS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGYxID0gbmV3IEZpbGUoImQ6L2RpcmVjdG9yeSIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgcGFyZW50IHRlc3QgMWEiLCBmMS5nZXRQYXJlbnQoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJkOiIgKyBzbGFzaCkpOworICAgICAgICAgICAgZjEgPSBuZXcgRmlsZSgiZDovZGlyZWN0b3J5L2ZpbGUiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIHBhcmVudCB0ZXN0IDJhIiwgZjEuZ2V0UGFyZW50KCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiZDoiICsgc2xhc2ggKyAiZGlyZWN0b3J5IikpOworICAgICAgICAgICAgZjEgPSBuZXcgRmlsZSgiZDpkaXJlY3RvcnkvZmlsZSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBwYXJlbnQgdGVzdCAzYSIsIAorICAgICAgICAgICAgICAgICAgICAiZDpkaXJlY3RvcnkiLCBmMS5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICBmMSA9IG5ldyBGaWxlKCJkOi8iKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoIldyb25nIHBhcmVudCB0ZXN0IDRhIiwgZjEuZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgZjEgPSBuZXcgRmlsZSgiZDpkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgcGFyZW50IHRlc3QgNWEiLCAiZDoiLCBmMS5nZXRQYXJlbnQoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2dldFBhcmVudEZpbGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50RmlsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5nZXRQYXJlbnRGaWxlKCkKLQkJRmlsZSBmID0gbmV3IEZpbGUoInRlbXBmaWxlLnRzdCIpOwotCQlhc3NlcnROdWxsKCJJbmNvcnJlY3QgcGF0aCByZXR1cm5lZCIsIGYuZ2V0UGFyZW50RmlsZSgpKTsKLQkJZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgInRlbXBmaWxlMS50bXAiKTsKLQkJRmlsZSBmMiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgInRlbXBmaWxlMi50bXAiKTsKLQkJRmlsZSBmMyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgIi9hL3RlbXBmaWxlLnRtcCIpOwotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBGaWxlIFJldHVybmVkIiwgMCwgZi5nZXRQYXJlbnRGaWxlKCkuY29tcGFyZVRvKAotCQkJCWYyLmdldFBhcmVudEZpbGUoKSkpOwotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgRmlsZSBSZXR1cm5lZCIsIGYuZ2V0UGFyZW50RmlsZSgpLmNvbXBhcmVUbygKLQkJCQlmMy5nZXRQYXJlbnRGaWxlKCkpICE9IDApOwotCQlmLmRlbGV0ZSgpOwotCQlmMi5kZWxldGUoKTsKLQkJZjMuZGVsZXRlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZ2V0UGFyZW50RmlsZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldFBhcmVudEZpbGUoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0UGFyZW50RmlsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEZpbGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUuZ2V0UGFyZW50RmlsZSgpCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCJ0ZW1wZmlsZS50c3QiKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IHBhdGggcmV0dXJuZWQiLCBmLmdldFBhcmVudEZpbGUoKSk7CisgICAgICAgIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJ0ZW1wZmlsZTEudG1wIik7CisgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJ0ZW1wZmlsZTIudG1wIik7CisgICAgICAgIEZpbGUgZjMgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICIvYS90ZW1wZmlsZS50bXAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgRmlsZSBSZXR1cm5lZCIsIDAsIGYuZ2V0UGFyZW50RmlsZSgpLmNvbXBhcmVUbygKKyAgICAgICAgICAgICAgICBmMi5nZXRQYXJlbnRGaWxlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IEZpbGUgUmV0dXJuZWQiLCBmLmdldFBhcmVudEZpbGUoKS5jb21wYXJlVG8oCisgICAgICAgICAgICAgICAgZjMuZ2V0UGFyZW50RmlsZSgpKSAhPSAwKTsKKyAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgZjIuZGVsZXRlKCk7CisgICAgICAgIGYzLmRlbGV0ZSgpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZ2V0UGF0aCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRQYXRoKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLkZpbGUuZ2V0UGF0aCgpCi0JCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLQkJU3RyaW5nIGZuYW1lOwotCQlGaWxlIGYxOwotCQlpZiAoIWJhc2UucmVnaW9uTWF0Y2hlcygoYmFzZS5sZW5ndGgoKSAtIDEpLCBzbGFzaCwgMCwgMSkpCi0JCQliYXNlICs9IHNsYXNoOwotCQlmbmFtZSA9IGJhc2UgKyAiZmlsZWNoay50c3QiOwotCQlmMSA9IG5ldyBGaWxlKGJhc2UsICJmaWxlY2hrLnRzdCIpOwotCQlGaWxlIGYyID0gbmV3IEZpbGUoImZpbGVjaGsudHN0Iik7Ci0JCUZpbGUgZjMgPSBuZXcgRmlsZSgiYzoiKTsKLQkJRmlsZSBmNCA9IG5ldyBGaWxlKGJhc2UgKyAiYSIgKyBzbGFzaCArIHNsYXNoICsgIi4uIiArIHNsYXNoCi0JCQkJKyAiZmlsZWNoay50c3QiKTsKLQkJYXNzZXJ0VHJ1ZSgiZ2V0UGF0aCByZXR1cm5lZCBpbmNvcnJlY3QgcGF0aChmMSkgIiArIGYxLmdldFBhdGgoKSwgZjEKLQkJCQkuZ2V0UGF0aCgpLmVxdWFscyhmbmFtZSkpOwotCQlhc3NlcnRUcnVlKCJnZXRQYXRoIHJldHVybmVkIGluY29ycmVjdCBwYXRoKGYyKSAiICsgZjIuZ2V0UGF0aCgpLCBmMgotCQkJCS5nZXRQYXRoKCkuZXF1YWxzKCJmaWxlY2hrLnRzdCIpKTsKLQkJYXNzZXJ0VHJ1ZSgiZ2V0UGF0aCByZXR1cm5lZCBpbmNvcnJlY3QgcGF0aChmMykgIiArIGYzLmdldFBhdGgoKSwgZjMKLQkJCQkuZ2V0UGF0aCgpLmVxdWFscygiYzoiKSk7Ci0JCWFzc2VydFRydWUoImdldFBhdGggcmV0dXJuZWQgaW5jb3JyZWN0IHBhdGgoZjQpICIgKyBmNC5nZXRQYXRoKCksIGY0Ci0JCQkJLmdldFBhdGgoKS5lcXVhbHMoCi0JCQkJCQliYXNlICsgImEiICsgc2xhc2ggKyAiLi4iICsgc2xhc2ggKyAiZmlsZWNoay50c3QiKSk7Ci0JCWYxLmRlbGV0ZSgpOwotCQlmMi5kZWxldGUoKTsKLQkJZjMuZGVsZXRlKCk7Ci0JCWY0LmRlbGV0ZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2dldFBhdGgoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRQYXRoKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFBhdGgiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQYXRoKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLkZpbGUuZ2V0UGF0aCgpCisgICAgICAgIFN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKKyAgICAgICAgU3RyaW5nIGZuYW1lOworICAgICAgICBGaWxlIGYxOworICAgICAgICBpZiAoIWJhc2UucmVnaW9uTWF0Y2hlcygoYmFzZS5sZW5ndGgoKSAtIDEpLCBzbGFzaCwgMCwgMSkpCisgICAgICAgICAgICBiYXNlICs9IHNsYXNoOworICAgICAgICBmbmFtZSA9IGJhc2UgKyAiZmlsZWNoay50c3QiOworICAgICAgICBmMSA9IG5ldyBGaWxlKGJhc2UsICJmaWxlY2hrLnRzdCIpOworICAgICAgICBGaWxlIGYyID0gbmV3IEZpbGUoImZpbGVjaGsudHN0Iik7CisgICAgICAgIEZpbGUgZjMgPSBuZXcgRmlsZSgiYzoiKTsKKyAgICAgICAgRmlsZSBmNCA9IG5ldyBGaWxlKGJhc2UgKyAiYSIgKyBzbGFzaCArIHNsYXNoICsgIi4uIiArIHNsYXNoCisgICAgICAgICAgICAgICAgKyAiZmlsZWNoay50c3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0UGF0aCByZXR1cm5lZCBpbmNvcnJlY3QgcGF0aChmMSkgIiArIGYxLmdldFBhdGgoKSwgZjEKKyAgICAgICAgICAgICAgICAuZ2V0UGF0aCgpLmVxdWFscyhmbmFtZSkpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRQYXRoIHJldHVybmVkIGluY29ycmVjdCBwYXRoKGYyKSAiICsgZjIuZ2V0UGF0aCgpLCBmMgorICAgICAgICAgICAgICAgIC5nZXRQYXRoKCkuZXF1YWxzKCJmaWxlY2hrLnRzdCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0UGF0aCByZXR1cm5lZCBpbmNvcnJlY3QgcGF0aChmMykgIiArIGYzLmdldFBhdGgoKSwgZjMKKyAgICAgICAgICAgICAgICAuZ2V0UGF0aCgpLmVxdWFscygiYzoiKSk7CisgICAgICAgIGFzc2VydFRydWUoImdldFBhdGggcmV0dXJuZWQgaW5jb3JyZWN0IHBhdGgoZjQpICIgKyBmNC5nZXRQYXRoKCksIGY0CisgICAgICAgICAgICAgICAgLmdldFBhdGgoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgImEiICsgc2xhc2ggKyAiLi4iICsgc2xhc2ggKyAiZmlsZWNoay50c3QiKSk7CisgICAgICAgIGYxLmRlbGV0ZSgpOworICAgICAgICBmMi5kZWxldGUoKTsKKyAgICAgICAgZjMuZGVsZXRlKCk7CisgICAgICAgIGY0LmRlbGV0ZSgpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjaXNBYnNvbHV0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9pc0Fic29sdXRlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuaXNBYnNvbHV0ZSgpCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJykgewotCQkJRmlsZSBmID0gbmV3IEZpbGUoImM6XFx0ZXN0Iik7Ci0JCQlGaWxlIGYxID0gbmV3IEZpbGUoIlxcdGVzdCIpOwotCQkJLy8gT25lIG9yIHRoZSBvdGhlciBzaG91bGQgYmUgYWJzb2x1dGUgb24gV2luZG93cyBvciBDRQotCQkJYXNzZXJ0VHJ1ZSgiQWJzb2x1dGUgcmV0dXJuZWQgZmFsc2UiLCAoZi5pc0Fic29sdXRlKCkgJiYgIWYxCi0JCQkJCS5pc0Fic29sdXRlKCkpCi0JCQkJCXx8ICghZi5pc0Fic29sdXRlKCkgJiYgZjEuaXNBYnNvbHV0ZSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZSgiL3Rlc3QiKTsKLQkJCWFzc2VydFRydWUoIkFic29sdXRlIHJldHVybmVkIGZhbHNlIiwgZi5pc0Fic29sdXRlKCkpOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vbi1BYnNvbHV0ZSByZXR1cm5lZCB0cnVlIiwgIW5ldyBGaWxlKCIuLi90ZXN0IikKLQkJCQkuaXNBYnNvbHV0ZSgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNpc0Fic29sdXRlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNBYnNvbHV0ZSgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJpc0Fic29sdXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9pc0Fic29sdXRlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuaXNBYnNvbHV0ZSgpCisgICAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJykgeworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoImM6XFx0ZXN0Iik7CisgICAgICAgICAgICBGaWxlIGYxID0gbmV3IEZpbGUoIlxcdGVzdCIpOworICAgICAgICAgICAgLy8gT25lIG9yIHRoZSBvdGhlciBzaG91bGQgYmUgYWJzb2x1dGUgb24gV2luZG93cyBvciBDRQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWJzb2x1dGUgcmV0dXJuZWQgZmFsc2UiLCAoZi5pc0Fic29sdXRlKCkgJiYgIWYxCisgICAgICAgICAgICAgICAgICAgIC5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICghZi5pc0Fic29sdXRlKCkgJiYgZjEuaXNBYnNvbHV0ZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgiL3Rlc3QiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFic29sdXRlIHJldHVybmVkIGZhbHNlIiwgZi5pc0Fic29sdXRlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIk5vbi1BYnNvbHV0ZSByZXR1cm5lZCB0cnVlIiwgIW5ldyBGaWxlKCIuLi90ZXN0IikKKyAgICAgICAgICAgICAgICAuaXNBYnNvbHV0ZSgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2lzRGlyZWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2lzRGlyZWN0b3J5KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuaXNEaXJlY3RvcnkoKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjaXNEaXJlY3RvcnkoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJpc0RpcmVjdG9yeSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9pc0RpcmVjdG9yeSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWxlLmlzRGlyZWN0b3J5KCkKIAotCQlTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQkJaWYgKCFiYXNlLnJlZ2lvbk1hdGNoZXMoKGJhc2UubGVuZ3RoKCkgLSAxKSwgc2xhc2gsIDAsIDEpKQotCQkJYmFzZSArPSBzbGFzaDsKLQkJRmlsZSBmID0gbmV3IEZpbGUoYmFzZSk7Ci0JCWFzc2VydFRydWUoIlRlc3QgMTogRGlyZWN0b3J5IFJldHVybmVkIEZhbHNlIiwgZi5pc0RpcmVjdG9yeSgpKTsKLQkJZiA9IG5ldyBGaWxlKGJhc2UgKyAienh6eHp4eiIgKyBwbGF0Zm9ybUlkKTsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCAyOiAoTm90IENyZWF0ZWQpIERpcmVjdG9yeSBSZXR1cm5lZCBUcnVlLiIsICFmCi0JCQkJLmlzRGlyZWN0b3J5KCkpOwotCQlmLm1rZGlyKCk7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDM6IERpcmVjdG9yeSBSZXR1cm5lZCBGYWxzZS4iLCBmLmlzRGlyZWN0b3J5KCkpOwotCQl9IGZpbmFsbHkgewotCQkJZi5kZWxldGUoKTsKLQkJfQotCX0KKyAgICAgICAgU3RyaW5nIGJhc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgIGlmICghYmFzZS5yZWdpb25NYXRjaGVzKChiYXNlLmxlbmd0aCgpIC0gMSksIHNsYXNoLCAwLCAxKSkKKyAgICAgICAgICAgIGJhc2UgKz0gc2xhc2g7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJhc2UpOworICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDE6IERpcmVjdG9yeSBSZXR1cm5lZCBGYWxzZSIsIGYuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgIGYgPSBuZXcgRmlsZShiYXNlICsgInp4enh6eHoiICsgcGxhdGZvcm1JZCk7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMjogKE5vdCBDcmVhdGVkKSBEaXJlY3RvcnkgUmV0dXJuZWQgVHJ1ZS4iLCAhZgorICAgICAgICAgICAgICAgIC5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgZi5ta2RpcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAzOiBEaXJlY3RvcnkgUmV0dXJuZWQgRmFsc2UuIiwgZi5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2lzRmlsZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9pc0ZpbGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uRmlsZS5pc0ZpbGUoKQotCQl0cnkgewotCQkJU3RyaW5nIGJhc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShiYXNlKTsKLQkJCWFzc2VydFRydWUoIkRpcmVjdG9yeSBSZXR1cm5lZCBUcnVlIEFzIEJlaW5nIEEgRmlsZS4iLCAhZi5pc0ZpbGUoKSk7Ci0JCQlpZiAoIWJhc2UucmVnaW9uTWF0Y2hlcygoYmFzZS5sZW5ndGgoKSAtIDEpLCBzbGFzaCwgMCwgMSkpCi0JCQkJYmFzZSArPSBzbGFzaDsKLQkJCWYgPSBuZXcgRmlsZShiYXNlLCBwbGF0Zm9ybUlkICsgImFtaWFmaWxlIik7Ci0JCQlhc3NlcnRUcnVlKCJOb24tZXhpc3RlbnQgRmlsZSBSZXR1cm5lZCBUcnVlIiwgIWYuaXNGaWxlKCkpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmlsZSByZXR1cm5lZCBmYWxzZSIsIGYuaXNGaWxlKCkpOwotCQkJZi5kZWxldGUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIGlzRmlsZSAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjaXNGaWxlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiaXNGaWxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRmlsZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWxlLmlzRmlsZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJhc2UpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlyZWN0b3J5IFJldHVybmVkIFRydWUgQXMgQmVpbmcgQSBGaWxlLiIsICFmLmlzRmlsZSgpKTsKKyAgICAgICAgICAgIGlmICghYmFzZS5yZWdpb25NYXRjaGVzKChiYXNlLmxlbmd0aCgpIC0gMSksIHNsYXNoLCAwLCAxKSkKKyAgICAgICAgICAgICAgICBiYXNlICs9IHNsYXNoOworICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGJhc2UsIHBsYXRmb3JtSWQgKyAiYW1pYWZpbGUiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk5vbi1leGlzdGVudCBGaWxlIFJldHVybmVkIFRydWUiLCAhZi5pc0ZpbGUoKSk7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHJldHVybmVkIGZhbHNlIiwgZi5pc0ZpbGUoKSk7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgaXNGaWxlICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2lzSGlkZGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2lzSGlkZGVuKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuaXNIaWRkZW4oKQotCQlib29sZWFuIG9uVW5peCA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLyc7Ci0JCXRyeSB7Ci0JCQlGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzXyIsICIudG1wIik7Ci0JCQkvLyBPbiBVbml4IGhpZGRlbiBmaWxlcyBhcmUgbWFya2VkIHdpdGggYSAiLiIgYXQgdGhlIGJlZ2lubmluZwotCQkJLy8gb2YgdGhlIGZpbGUgbmFtZS4KLQkJCWlmIChvblVuaXgpIHsKLQkJCQlGaWxlIGYyID0gbmV3IEZpbGUoIi50ZXN0LnRzdCIgKyBwbGF0Zm9ybUlkKTsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvczIgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmMik7Ci0JCQkJZm9zMi5jbG9zZSgpOwotCQkJCWFzc2VydFRydWUoIkZpbGUgcmV0dXJuZWQgaGlkZGVuIG9uIFVuaXgiLCAhZi5pc0hpZGRlbigpKTsKLQkJCQlhc3NlcnRUcnVlKCJGaWxlIHJldHVybmVkIHZpc2libGUgb24gVW5peCIsIGYyLmlzSGlkZGVuKCkpOwotCQkJCWFzc2VydFRydWUoIkZpbGUgZGlkIG5vdCBkZWxldGUuIiwgZjIuZGVsZXRlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBGb3Igd2luZG93cywgdGhlIGZpbGUgaXMgYmVpbmcgc2V0IGhpZGRlbiBieSB0aGUgYXR0cmliCi0JCQkJLy8gY29tbWFuZC4KLQkJCQlSdW50aW1lIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJCQlhc3NlcnRUcnVlKCJGaWxlIHJldHVybmVkIGhpZGRlbiIsICFmLmlzSGlkZGVuKCkpOwotCQkJCVByb2Nlc3MgcCA9IHIuZXhlYygiYXR0cmliICtoIFwiIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsKLQkJCQlwLndhaXRGb3IoKTsKLQkJCQlhc3NlcnRUcnVlKCJGaWxlIHJldHVybmVkIHZpc2libGUiLCBmLmlzSGlkZGVuKCkpOwotCQkJCXAgPSByLmV4ZWMoImF0dHJpYiAtaCBcIiIgKyBmLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7Ci0JCQkJcC53YWl0Rm9yKCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiRmlsZSByZXR1cm5lZCBoaWRkZW4iLCAhZi5pc0hpZGRlbigpKTsKLQkJCX0KLQkJCWYuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEludGVycnVwdGVkRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2lzSGlkZGVuKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiaXNIaWRkZW4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSGlkZGVuKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUuaXNIaWRkZW4oKQorICAgICAgICBib29sZWFuIG9uVW5peCA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLyc7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzXyIsICIudG1wIik7CisgICAgICAgICAgICAvLyBPbiBVbml4IGhpZGRlbiBmaWxlcyBhcmUgbWFya2VkIHdpdGggYSAiLiIgYXQgdGhlIGJlZ2lubmluZworICAgICAgICAgICAgLy8gb2YgdGhlIGZpbGUgbmFtZS4KKyAgICAgICAgICAgIGlmIChvblVuaXgpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYyID0gbmV3IEZpbGUoIi50ZXN0LnRzdCIgKyBwbGF0Zm9ybUlkKTsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvczIgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmMik7CisgICAgICAgICAgICAgICAgZm9zMi5jbG9zZSgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgcmV0dXJuZWQgaGlkZGVuIG9uIFVuaXgiLCAhZi5pc0hpZGRlbigpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHJldHVybmVkIHZpc2libGUgb24gVW5peCIsIGYyLmlzSGlkZGVuKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgZGlkIG5vdCBkZWxldGUuIiwgZjIuZGVsZXRlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGb3Igd2luZG93cywgdGhlIGZpbGUgaXMgYmVpbmcgc2V0IGhpZGRlbiBieSB0aGUgYXR0cmliCisgICAgICAgICAgICAgICAgLy8gY29tbWFuZC4KKyAgICAgICAgICAgICAgICBSdW50aW1lIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHJldHVybmVkIGhpZGRlbiIsICFmLmlzSGlkZGVuKCkpOworICAgICAgICAgICAgICAgIFByb2Nlc3MgcCA9IHIuZXhlYygiYXR0cmliICtoIFwiIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICBwLndhaXRGb3IoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHJldHVybmVkIHZpc2libGUiLCBmLmlzSGlkZGVuKCkpOworICAgICAgICAgICAgICAgIHAgPSByLmV4ZWMoImF0dHJpYiAtaCBcIiIgKyBmLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7CisgICAgICAgICAgICAgICAgcC53YWl0Rm9yKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSByZXR1cm5lZCBoaWRkZW4iLCAhZi5pc0hpZGRlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEludGVycnVwdGVkRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbGFzdE1vZGlmaWVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2xhc3RNb2RpZmllZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5GaWxlLmxhc3RNb2RpZmllZCgpCi0JCXRyeSB7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksIHBsYXRmb3JtSWQKLQkJCQkJKyAibE1vZFRlc3QudHN0Iik7Ci0JCQlmLmRlbGV0ZSgpOwotCQkJbG9uZyBsYXN0TW9kaWZpZWRUaW1lID0gZi5sYXN0TW9kaWZpZWQoKTsKLQkJCWFzc2VydEVxdWFscygiTGFzdE1vZGlmaWVkIFRpbWUgU2hvdWxkIEhhdmUgUmV0dXJuZWQgMC4iLAotCQkJCQkwLCBsYXN0TW9kaWZpZWRUaW1lKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQlmb3MuY2xvc2UoKTsKLQkJCWYuc2V0TGFzdE1vZGlmaWVkKDMxNTU1MDgwMDAwMEwpOwotCQkJbGFzdE1vZGlmaWVkVGltZSA9IGYubGFzdE1vZGlmaWVkKCk7Ci0JCQlhc3NlcnRUcnVlKCJMYXN0TW9kaWZpZWQgVGltZSBJbmNvcnJlY3Q6ICIgKyBsYXN0TW9kaWZpZWRUaW1lLAotCQkJCQlsYXN0TW9kaWZpZWRUaW1lID09IDMxNTU1MDgwMDAwMEwpOwotCQkJZi5kZWxldGUoKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xhc3RNb2RpZmllZCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxhc3RNb2RpZmllZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbGFzdE1vZGlmaWVkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkZpbGUubGFzdE1vZGlmaWVkKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwgcGxhdGZvcm1JZAorICAgICAgICAgICAgICAgICAgICArICJsTW9kVGVzdC50c3QiKTsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZFRpbWUgPSBmLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXN0TW9kaWZpZWQgVGltZSBTaG91bGQgSGF2ZSBSZXR1cm5lZCAwLiIsCisgICAgICAgICAgICAgICAgICAgIDAsIGxhc3RNb2RpZmllZFRpbWUpOworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgZi5zZXRMYXN0TW9kaWZpZWQoMzE1NTUwODAwMDAwTCk7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWRUaW1lID0gZi5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkxhc3RNb2RpZmllZCBUaW1lIEluY29ycmVjdDogIiArIGxhc3RNb2RpZmllZFRpbWUsCisgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZFRpbWUgPT0gMzE1NTUwODAwMDAwTCk7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIYXJtb255LTIxNDYKICAgICAgICAgICAgIGYgPSBuZXcgRmlsZSgiLy4uLyIpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmLmxhc3RNb2RpZmllZCgpID4gMCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2xlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkZpbGUubGVuZ3RoKCkKLQkJdHJ5IHsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgcGxhdGZvcm1JZAotCQkJCQkrICJpbnB1dC50c3QiKTsKLQkJCWFzc2VydEVxdWFscygiRmlsZSBMZW5ndGggU2hvdWxkIEhhdmUgUmV0dXJuZWQgMC4iLCAwLCBmLmxlbmd0aCgpKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQlmb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGZpbGUgbGVuZ3RoIHJldHVybmVkOiAiICsgZi5sZW5ndGgoKSwgZgotCQkJCQkubGVuZ3RoKCkgPT0gZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbGVuZ3RoKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibGVuZ3RoIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9sZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5GaWxlLmxlbmd0aCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksIHBsYXRmb3JtSWQKKyAgICAgICAgICAgICAgICAgICAgKyAiaW5wdXQudHN0Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZpbGUgTGVuZ3RoIFNob3VsZCBIYXZlIFJldHVybmVkIDAuIiwgMCwgZi5sZW5ndGgoKSk7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgICAgICAgICAgZm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBmaWxlIGxlbmd0aCByZXR1cm5lZDogIiArIGYubGVuZ3RoKCksIGYKKyAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpID09IGZpbGVTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0xNDk3CiAgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCAidG1wIik7CkBAIC0xMjEyLDYwNSArMTQ0NCw2NTQgQEAKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmLCAicndkIik7CiAgICAgICAgIHJhZi53cml0ZSgweDQxKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGYubGVuZ3RoKCkpOwotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbGlzdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10gamF2YS5pby5GaWxlLmxpc3QoKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbGlzdCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxpc3QiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2xpc3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIFtdIGphdmEuaW8uRmlsZS5saXN0KCkKIAotCQlTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQkJLy8gT2xkIHRlc3QgbGVmdCBiZWhpbmQgImdhcmJhZ2UgZmlsZXMiIHNvIHRoaXMgdGltZSBpdCBjcmVhdGVzIGEKLQkJLy8gZGlyZWN0b3J5Ci0JCS8vIHRoYXQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYWxyZWFkeSBleGlzdCAoYW5kIGRlbGV0ZXMgaXQgYWZ0ZXJ3YXJkLikKLQkJaW50IGRpck51bWJlciA9IDE7Ci0JCWJvb2xlYW4gZGlyRXhpc3RzID0gdHJ1ZTsKLQkJRmlsZSBkaXIgPSBudWxsOwotCQlkaXIgPSBuZXcgRmlsZShiYXNlLCBwbGF0Zm9ybUlkICsgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7Ci0JCXdoaWxlIChkaXJFeGlzdHMpIHsKLQkJCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCQlkaXJOdW1iZXIrKzsKLQkJCQlkaXIgPSBuZXcgRmlsZShiYXNlLCBTdHJpbmcudmFsdWVPZihkaXJOdW1iZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlyRXhpc3RzID0gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgU3RyaW5nIGJhc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgIC8vIE9sZCB0ZXN0IGxlZnQgYmVoaW5kICJnYXJiYWdlIGZpbGVzIiBzbyB0aGlzIHRpbWUgaXQgY3JlYXRlcyBhCisgICAgICAgIC8vIGRpcmVjdG9yeQorICAgICAgICAvLyB0aGF0IGlzIGd1YXJhbnRlZWQgbm90IHRvIGFscmVhZHkgZXhpc3QgKGFuZCBkZWxldGVzIGl0IGFmdGVyd2FyZC4pCisgICAgICAgIGludCBkaXJOdW1iZXIgPSAxOworICAgICAgICBib29sZWFuIGRpckV4aXN0cyA9IHRydWU7CisgICAgICAgIEZpbGUgZGlyID0gbnVsbDsKKyAgICAgICAgZGlyID0gbmV3IEZpbGUoYmFzZSwgcGxhdGZvcm1JZCArIFN0cmluZy52YWx1ZU9mKGRpck51bWJlcikpOworICAgICAgICB3aGlsZSAoZGlyRXhpc3RzKSB7CisgICAgICAgICAgICBpZiAoZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZGlyTnVtYmVyKys7CisgICAgICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoYmFzZSwgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpckV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJU3RyaW5nW10gZmxpc3QgPSBkaXIubGlzdCgpOworICAgICAgICBTdHJpbmdbXSBmbGlzdCA9IGRpci5saXN0KCk7CiAKLQkJYXNzZXJ0TnVsbCgiTWV0aG9kIGxpc3QoKSBTaG91bGQgSGF2ZSBSZXR1cm5lZCBudWxsLiIsIGZsaXN0KTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTWV0aG9kIGxpc3QoKSBTaG91bGQgSGF2ZSBSZXR1cm5lZCBudWxsLiIsIGZsaXN0KTsKIAotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgY3JlYXRlIHBhcmVudCBkaXJlY3RvcnkgZm9yIGxpc3QgdGVzdCIsIGRpcgotCQkJCS5ta2RpcigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBsaXN0IHRlc3QiLCBkaXIKKyAgICAgICAgICAgICAgICAubWtkaXIoKSk7CiAKLQkJU3RyaW5nW10gZmlsZXMgPSB7ICJtdHp6MS54eCIsICJtdHp6Mi54eCIsICJtdHp6My55eSIsICJtdHp6NC55eSIgfTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiTWV0aG9kIGxpc3QoKSBTaG91bGQgSGF2ZSBSZXR1cm5lZCBBbiBBcnJheSBPZiBMZW5ndGggMC4iLAotCQkJCQkwLCBkaXIubGlzdCgpLmxlbmd0aCk7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0geyAibXR6ejEueHgiLCAibXR6ejIueHgiLCAibXR6ejMueXkiLCAibXR6ejQueXkiIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1ldGhvZCBsaXN0KCkgU2hvdWxkIEhhdmUgUmV0dXJuZWQgQW4gQXJyYXkgT2YgTGVuZ3RoIDAuIiwKKyAgICAgICAgICAgICAgICAgICAgMCwgZGlyLmxpc3QoKS5sZW5ndGgpOwogCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsICJub3RBRGlyLnRzdCIpOwotCQkJdHJ5IHsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJCWZvcy5jbG9zZSgpOwotCQkJCWFzc2VydE51bGwoCi0JCQkJCQkibGlzdEZpbGVzIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwgV2hlbiBVc2VkIE9uIEEgRmlsZSBJbnN0ZWFkIE9mIEEgRGlyZWN0b3J5LiIsCi0JCQkJCQlmaWxlLmxpc3QoKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZpbGUuZGVsZXRlKCk7Ci0JCQl9CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsICJub3RBRGlyLnRzdCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoCisgICAgICAgICAgICAgICAgICAgICAgICAibGlzdEZpbGVzIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwgV2hlbiBVc2VkIE9uIEEgRmlsZSBJbnN0ZWFkIE9mIEEgRGlyZWN0b3J5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmxpc3QoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CiAKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKLQkJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CiAKLQkJCWZsaXN0ID0gZGlyLmxpc3QoKTsKLQkJCWlmIChmbGlzdC5sZW5ndGggIT0gZmlsZXMubGVuZ3RoKSB7Ci0JCQkJZmFpbCgiSW5jb3JyZWN0IGxpc3QgcmV0dXJuZWQiKTsKLQkJCX0KKyAgICAgICAgICAgIGZsaXN0ID0gZGlyLmxpc3QoKTsKKyAgICAgICAgICAgIGlmIChmbGlzdC5sZW5ndGggIT0gZmlsZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiSW5jb3JyZWN0IGxpc3QgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gQ2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoZSBjb3JyZWN0IGZpbGVzIHdlcmUgYXJlIGxpc3RlZCBpbiB0aGUKLQkJCS8vIGFycmF5LgotCQkJYm9vbGVhbltdIGNoZWNrID0gbmV3IGJvb2xlYW5bZmxpc3QubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2subGVuZ3RoOyBpKyspCi0JCQkJY2hlY2tbaV0gPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZsaXN0Lmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChmbGlzdFtqXS5lcXVhbHMoZmlsZXNbaV0pKSB7Ci0JCQkJCQljaGVja1tpXSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBjaGVja0NvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2subGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2hlY2tbaV0gPT0gZmFsc2UpCi0JCQkJCWNoZWNrQ291bnQrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscygiSW52YWxpZCBmaWxlIHJldHVybmVkIGluIGxpc3RpbmciLCAwLCBjaGVja0NvdW50KTsKKyAgICAgICAgICAgIC8vIENoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmaWxlcyB3ZXJlIGFyZSBsaXN0ZWQgaW4gdGhlCisgICAgICAgICAgICAvLyBhcnJheS4KKyAgICAgICAgICAgIGJvb2xlYW5bXSBjaGVjayA9IG5ldyBib29sZWFuW2ZsaXN0Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNoZWNrW2ldID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmbGlzdC5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmxpc3Rbal0uZXF1YWxzKGZpbGVzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tbaV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY2hlY2tDb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrW2ldID09IGZhbHNlKQorICAgICAgICAgICAgICAgICAgICBjaGVja0NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgZmlsZSByZXR1cm5lZCBpbiBsaXN0aW5nIiwgMCwgY2hlY2tDb3VudCk7CiAKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKLQkJCQlmLmRlbGV0ZSgpOwotCQkJfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CiAKLQkJCWFzc2VydFRydWUoIkNvdWxkIG5vdCBkZWxldGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgbGlzdCB0ZXN0LiIsIGRpcgotCQkJCQkuZGVsZXRlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOwotCQkJCWYuZGVsZXRlKCk7Ci0JCQl9Ci0JCQlkaXIuZGVsZXRlKCk7Ci0JCX0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBkZWxldGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgbGlzdCB0ZXN0LiIsIGRpcgorICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXIuZGVsZXRlKCk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3RGaWxlcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9saXN0RmlsZXMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUubGlzdEZpbGVzKCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3RGaWxlcygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxpc3RGaWxlcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbGlzdEZpbGVzKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlLmxpc3RGaWxlcygpCiAKLQkJdHJ5IHsKLQkJCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQkJLy8gRmluZGluZyBhIG5vbi1leGlzdGVudCBkaXJlY3RvcnkgdG8gY3JlYXRlLgotCQkJaW50IGRpck51bWJlciA9IDE7Ci0JCQlib29sZWFuIGRpckV4aXN0cyA9IHRydWU7Ci0JCQlGaWxlIGRpciA9IG5ldyBGaWxlKGJhc2UsIHBsYXRmb3JtSWQgKyBTdHJpbmcudmFsdWVPZihkaXJOdW1iZXIpKTsKLQkJCS8vIE1ha2luZyBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KLQkJCXdoaWxlIChkaXJFeGlzdHMpIHsKLQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGV4aXN0cywgYWRkIG9uZSB0byB0aGUgZGlyZWN0b3J5IG51bWJlcgotCQkJCS8vIChtYWtpbmcKLQkJCQkvLyBpdCBhIG5ldyBkaXJlY3RvcnkgbmFtZS4pCi0JCQkJaWYgKGRpci5leGlzdHMoKSkgewotCQkJCQlkaXJOdW1iZXIrKzsKLQkJCQkJZGlyID0gbmV3IEZpbGUoYmFzZSwgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlyRXhpc3RzID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJLy8gVGVzdCBmb3IgYXR0ZW1wdGluZyB0byBjYWwgbGlzdEZpbGVzIG9uIGEgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeS4KLQkJCWFzc2VydE51bGwoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIE51bGwuIiwgZGlyLmxpc3RGaWxlcygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworICAgICAgICAgICAgLy8gRmluZGluZyBhIG5vbi1leGlzdGVudCBkaXJlY3RvcnkgdG8gY3JlYXRlLgorICAgICAgICAgICAgaW50IGRpck51bWJlciA9IDE7CisgICAgICAgICAgICBib29sZWFuIGRpckV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGJhc2UsIHBsYXRmb3JtSWQgKyBTdHJpbmcudmFsdWVPZihkaXJOdW1iZXIpKTsKKyAgICAgICAgICAgIC8vIE1ha2luZyBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgIHdoaWxlIChkaXJFeGlzdHMpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZGlyZWN0b3J5IGV4aXN0cywgYWRkIG9uZSB0byB0aGUgZGlyZWN0b3J5IG51bWJlcgorICAgICAgICAgICAgICAgIC8vIChtYWtpbmcKKyAgICAgICAgICAgICAgICAvLyBpdCBhIG5ldyBkaXJlY3RvcnkgbmFtZS4pCisgICAgICAgICAgICAgICAgaWYgKGRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBkaXJOdW1iZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoYmFzZSwgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyRXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGVzdCBmb3IgYXR0ZW1wdGluZyB0byBjYWwgbGlzdEZpbGVzIG9uIGEgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeS4KKyAgICAgICAgICAgIGFzc2VydE51bGwoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIE51bGwuIiwgZGlyLmxpc3RGaWxlcygpKTsKIAotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIFRvIENyZWF0ZSBQYXJlbnQgRGlyZWN0b3J5LiIsIGRpci5ta2RpcigpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCBUbyBDcmVhdGUgUGFyZW50IERpcmVjdG9yeS4iLCBkaXIubWtkaXIoKSk7CiAKLQkJCVN0cmluZ1tdIGZpbGVzID0geyAiMS50c3QiLCAiMi50c3QiLCAiMy50c3QiLCAiIiB9OwotCQkJdHJ5IHsKLQkJCQlhc3NlcnRFcXVhbHMoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIEFuIEFycmF5IE9mIExlbmd0aCAwLiIsIDAsIGRpcgotCQkJCQkJLmxpc3RGaWxlcygpLmxlbmd0aCk7CisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHsgIjEudHN0IiwgIjIudHN0IiwgIjMudHN0IiwgIiIgfTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaXN0RmlsZXMgU2hvdWxkIFJldHVybiBBbiBBcnJheSBPZiBMZW5ndGggMC4iLCAwLCBkaXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5saXN0RmlsZXMoKS5sZW5ndGgpOwogCi0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCAibm90QURpci50c3QiKTsKLQkJCQl0cnkgewotCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQkJYXNzZXJ0TnVsbCgKLQkJCQkJCQkibGlzdEZpbGVzIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwgV2hlbiBVc2VkIE9uIEEgRmlsZSBJbnN0ZWFkIE9mIEEgRGlyZWN0b3J5LiIsCi0JCQkJCQkJZmlsZS5saXN0RmlsZXMoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsICJub3RBRGlyLnRzdCIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0RmlsZXMgU2hvdWxkIEhhdmUgUmV0dXJuZWQgTnVsbCBXaGVuIFVzZWQgT24gQSBGaWxlIEluc3RlYWQgT2YgQSBEaXJlY3RvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmxpc3RGaWxlcygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAoZmlsZXMubGVuZ3RoIC0gMSk7IGkrKykgewotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKLQkJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGZpbGVzLmxlbmd0aCAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCW5ldyBGaWxlKGRpciwgImRvZXNOb3RFeGlzdC50c3QiKTsKLQkJCQlGaWxlW10gZmxpc3QgPSBkaXIubGlzdEZpbGVzKCk7CisgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGlyLCAiZG9lc05vdEV4aXN0LnRzdCIpOworICAgICAgICAgICAgICAgIEZpbGVbXSBmbGlzdCA9IGRpci5saXN0RmlsZXMoKTsKIAotCQkJCS8vIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgb25seSB0aGUgMyBmaWxlcyB0aGF0IHdlcmUgY3JlYXRlZCBhcmUKLQkJCQkvLyBsaXN0ZWQuCi0JCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTnVtYmVyIE9mIEZpbGVzIFJldHVybmVkLiIsCi0JCQkJCQkzLCBmbGlzdC5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgb25seSB0aGUgMyBmaWxlcyB0aGF0IHdlcmUgY3JlYXRlZCBhcmUKKyAgICAgICAgICAgICAgICAvLyBsaXN0ZWQuCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTnVtYmVyIE9mIEZpbGVzIFJldHVybmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAzLCBmbGlzdC5sZW5ndGgpOwogCi0JCQkJLy8gVGVzdCB0byBtYWtlIHN1cmUgdGhhdCBsaXN0RmlsZXMgY2FuIHJlYWQgaGlkZGVuIGZpbGVzLgotCQkJCWJvb2xlYW4gb25Vbml4ID0gRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJzsKLQkJCQlib29sZWFuIG9uV2luZG93cyA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnOwotCQkJCWlmIChvbldpbmRvd3MpIHsKLQkJCQkJZmlsZXNbM10gPSAiNC50c3QiOwotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsICI0LnRzdCIpOwotCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQkJUnVudGltZSByID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0JCQkJCVByb2Nlc3MgcCA9IHIuZXhlYygiYXR0cmliICtoIFwiIiArIGYuZ2V0UGF0aCgpICsgIlwiIik7Ci0JCQkJCXAud2FpdEZvcigpOwotCQkJCX0KLQkJCQlpZiAob25Vbml4KSB7Ci0JCQkJCWZpbGVzWzNdID0gIi40LnRzdCI7Ci0JCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGRpciwgIi40LnRzdCIpOwotCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJZmxpc3QgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTnVtYmVyIE9mIEZpbGVzIFJldHVybmVkLiIsCi0JCQkJCQk0LCBmbGlzdC5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgbGlzdEZpbGVzIGNhbiByZWFkIGhpZGRlbiBmaWxlcy4KKyAgICAgICAgICAgICAgICBib29sZWFuIG9uVW5peCA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLyc7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBvbldpbmRvd3MgPSBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJzsKKyAgICAgICAgICAgICAgICBpZiAob25XaW5kb3dzKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzWzNdID0gIjQudHN0IjsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCAiNC50c3QiKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWUgciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOworICAgICAgICAgICAgICAgICAgICBQcm9jZXNzIHAgPSByLmV4ZWMoImF0dHJpYiAraCBcIiIgKyBmLmdldFBhdGgoKSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBwLndhaXRGb3IoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9uVW5peCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlc1szXSA9ICIuNC50c3QiOworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsICIuNC50c3QiKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsaXN0ID0gZGlyLmxpc3RGaWxlcygpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IE51bWJlciBPZiBGaWxlcyBSZXR1cm5lZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgNCwgZmxpc3QubGVuZ3RoKTsKIAotCQkJCS8vIENoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmaWxlcyB3ZXJlIGFyZSBsaXN0ZWQgaW4KLQkJCQkvLyB0aGUgYXJyYXkuCi0JCQkJYm9vbGVhbltdIGNoZWNrID0gbmV3IGJvb2xlYW5bZmxpc3QubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKQotCQkJCQljaGVja1tpXSA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmbGlzdC5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGZsaXN0W2pdLmdldE5hbWUoKS5lcXVhbHMoZmlsZXNbaV0pKSB7Ci0JCQkJCQkJY2hlY2tbaV0gPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWludCBjaGVja0NvdW50ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjaGVja1tpXSA9PSBmYWxzZSkKLQkJCQkJCWNoZWNrQ291bnQrKzsKLQkJCQl9Ci0JCQkJYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpbGUgcmV0dXJuZWQgaW4gbGlzdGluZyIsIDAsIGNoZWNrQ291bnQpOworICAgICAgICAgICAgICAgIC8vIENoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmaWxlcyB3ZXJlIGFyZSBsaXN0ZWQgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgYXJyYXkuCisgICAgICAgICAgICAgICAgYm9vbGVhbltdIGNoZWNrID0gbmV3IGJvb2xlYW5bZmxpc3QubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjaGVja1tpXSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmbGlzdC5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsaXN0W2pdLmdldE5hbWUoKS5lcXVhbHMoZmlsZXNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tbaV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBjaGVja0NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja1tpXSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpbGUgcmV0dXJuZWQgaW4gbGlzdGluZyIsIDAsIGNoZWNrQ291bnQpOwogCi0JCQkJaWYgKG9uV2luZG93cykgewotCQkJCQlSdW50aW1lIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJCQkJUHJvY2VzcyBwID0gci5leGVjKCJhdHRyaWIgLWggXCIiCi0JCQkJCQkJKyBuZXcgRmlsZShkaXIsIGZpbGVzWzNdKS5nZXRQYXRoKCkgKyAiXCIiKTsKLQkJCQkJcC53YWl0Rm9yKCk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmIChvbldpbmRvd3MpIHsKKyAgICAgICAgICAgICAgICAgICAgUnVudGltZSByID0gUnVudGltZS5nZXRSdW50aW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MgcCA9IHIuZXhlYygiYXR0cmliIC1oIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3IEZpbGUoZGlyLCBmaWxlc1szXSkuZ2V0UGF0aCgpICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIHAud2FpdEZvcigpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0JCQkJCWYuZGVsZXRlKCk7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoIlBhcmVudCBEaXJlY3RvcnkgTm90IERlbGV0ZWQuIiwgZGlyLmRlbGV0ZSgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKLQkJCQkJZi5kZWxldGUoKTsKLQkJCQl9Ci0JCQkJZGlyLmRlbGV0ZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUGFyZW50IERpcmVjdG9yeSBOb3QgRGVsZXRlZC4iLCBkaXIuZGVsZXRlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXIuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEludGVycnVwdGVkRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbGlzdEZpbGVzKGphdmEuaW8uRmlsZUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2xpc3RGaWxlc0xqYXZhX2lvX0ZpbGVGaWx0ZXIoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUubGlzdEZpbGVzKEZpbGUgRmlsdGVyIGZpbHRlcikKLQkJCi0JCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQkvLyBGaW5kaW5nIGEgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeSB0byBjcmVhdGUuCi0JCWludCBkaXJOdW1iZXIgPSAxOwotCQlib29sZWFuIGRpckV4aXN0cyA9IHRydWU7Ci0JCUZpbGUgYmFzZURpciA9IG5ldyBGaWxlKGJhc2UsIHBsYXRmb3JtSWQgKyBTdHJpbmcudmFsdWVPZihkaXJOdW1iZXIpKTsKLQkJLy8gTWFraW5nIHN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgotCQl3aGlsZSAoZGlyRXhpc3RzKSB7Ci0JCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGV4aXN0cywgYWRkIG9uZSB0byB0aGUgZGlyZWN0b3J5IG51bWJlciAobWFraW5nCi0JCQkvLyBpdCBhIG5ldyBkaXJlY3RvcnkgbmFtZS4pCi0JCQlpZiAoYmFzZURpci5leGlzdHMoKSkgewotCQkJCWRpck51bWJlcisrOwotCQkJCWJhc2VEaXIgPSBuZXcgRmlsZShiYXNlLCBTdHJpbmcudmFsdWVPZihkaXJOdW1iZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlyRXhpc3RzID0gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3RGaWxlcyhqYXZhLmlvLkZpbGVGaWx0ZXIpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxpc3RGaWxlcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGVGaWx0ZXIuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbGlzdEZpbGVzTGphdmFfaW9fRmlsZUZpbHRlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5saXN0RmlsZXMoRmlsZSBGaWx0ZXIgZmlsdGVyKQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGJhc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisgICAgICAgIC8vIEZpbmRpbmcgYSBub24tZXhpc3RlbnQgZGlyZWN0b3J5IHRvIGNyZWF0ZS4KKyAgICAgICAgaW50IGRpck51bWJlciA9IDE7CisgICAgICAgIGJvb2xlYW4gZGlyRXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgRmlsZSBiYXNlRGlyID0gbmV3IEZpbGUoYmFzZSwgcGxhdGZvcm1JZCArIFN0cmluZy52YWx1ZU9mKGRpck51bWJlcikpOworICAgICAgICAvLyBNYWtpbmcgc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIHdoaWxlIChkaXJFeGlzdHMpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBkaXJlY3RvcnkgZXhpc3RzLCBhZGQgb25lIHRvIHRoZSBkaXJlY3RvcnkgbnVtYmVyIChtYWtpbmcKKyAgICAgICAgICAgIC8vIGl0IGEgbmV3IGRpcmVjdG9yeSBuYW1lLikKKyAgICAgICAgICAgIGlmIChiYXNlRGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZGlyTnVtYmVyKys7CisgICAgICAgICAgICAgICAgYmFzZURpciA9IG5ldyBGaWxlKGJhc2UsIFN0cmluZy52YWx1ZU9mKGRpck51bWJlcikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXJFeGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIENyZWF0aW5nIGEgZmlsdGVyIHRoYXQgY2F0Y2hlcyBkaXJlY3Rvcmllcy4KLQkJRmlsZUZpbHRlciBkaXJGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKLQkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKKyAgICAgICAgLy8gQ3JlYXRpbmcgYSBmaWx0ZXIgdGhhdCBjYXRjaGVzIGRpcmVjdG9yaWVzLgorICAgICAgICBGaWxlRmlsdGVyIGRpckZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworICAgICAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0JCWFzc2VydE51bGwoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIE51bGwuIiwgYmFzZURpcgotCQkJCS5saXN0RmlsZXMoZGlyRmlsdGVyKSk7CisgICAgICAgIGFzc2VydE51bGwoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIE51bGwuIiwgYmFzZURpcgorICAgICAgICAgICAgICAgIC5saXN0RmlsZXMoZGlyRmlsdGVyKSk7CiAKLQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIFRvIENyZWF0ZSBQYXJlbnQgRGlyZWN0b3J5LiIsIGJhc2VEaXIubWtkaXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCBUbyBDcmVhdGUgUGFyZW50IERpcmVjdG9yeS4iLCBiYXNlRGlyLm1rZGlyKCkpOwogCi0JCUZpbGUgZGlyMSA9IG51bGw7Ci0JCVN0cmluZ1tdIGZpbGVzID0geyAiMS50c3QiLCAiMi50c3QiLCAiMy50c3QiIH07Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIEFuIEFycmF5IE9mIExlbmd0aCAwLiIsIDAsIGJhc2VEaXIKLQkJCQkJLmxpc3RGaWxlcyhkaXJGaWx0ZXIpLmxlbmd0aCk7CisgICAgICAgIEZpbGUgZGlyMSA9IG51bGw7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0geyAiMS50c3QiLCAiMi50c3QiLCAiMy50c3QiIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIEFuIEFycmF5IE9mIExlbmd0aCAwLiIsIDAsIGJhc2VEaXIKKyAgICAgICAgICAgICAgICAgICAgLmxpc3RGaWxlcyhkaXJGaWx0ZXIpLmxlbmd0aCk7CiAKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsICJub3RBRGlyLnRzdCIpOwotCQkJdHJ5IHsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJCWZvcy5jbG9zZSgpOwotCQkJCWFzc2VydE51bGwoCi0JCQkJCQkibGlzdEZpbGVzIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwgV2hlbiBVc2VkIE9uIEEgRmlsZSBJbnN0ZWFkIE9mIEEgRGlyZWN0b3J5LiIsCi0JCQkJCQlmaWxlLmxpc3RGaWxlcyhkaXJGaWx0ZXIpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0LiIpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJfQorICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZURpciwgIm5vdEFEaXIudHN0Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0RmlsZXMgU2hvdWxkIEhhdmUgUmV0dXJuZWQgTnVsbCBXaGVuIFVzZWQgT24gQSBGaWxlIEluc3RlYWQgT2YgQSBEaXJlY3RvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUubGlzdEZpbGVzKGRpckZpbHRlcikpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIFRlc3QuIik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CiAKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShiYXNlRGlyLCBmaWxlc1tpXSk7Ci0JCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCWZvcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCWRpcjEgPSBuZXcgRmlsZShiYXNlRGlyLCAiVGVtcDEiKTsKLQkJCWRpcjEubWtkaXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShiYXNlRGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpcjEgPSBuZXcgRmlsZShiYXNlRGlyLCAiVGVtcDEiKTsKKyAgICAgICAgICAgIGRpcjEubWtkaXIoKTsKIAotCQkJLy8gQ3JlYXRpbmcgYSBmaWx0ZXIgdGhhdCBjYXRjaGVzIGZpbGVzLgotCQkJRmlsZUZpbHRlciBmaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgewotCQkJCQlpZiAoZi5pc0ZpbGUoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKKyAgICAgICAgICAgIC8vIENyZWF0aW5nIGEgZmlsdGVyIHRoYXQgY2F0Y2hlcyBmaWxlcy4KKyAgICAgICAgICAgIEZpbGVGaWx0ZXIgZmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAKLQkJCS8vIFRlc3QgdG8gc2VlIGlmIHRoZSBjb3JyZWN0IG51bWJlciBvZiBkaXJlY3RvcmllcyBhcmUgcmV0dXJuZWQuCi0JCQlGaWxlW10gZGlyZWN0b3JpZXMgPSBiYXNlRGlyLmxpc3RGaWxlcyhkaXJGaWx0ZXIpOwotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTnVtYmVyIE9mIERpcmVjdG9yaWVzIFJldHVybmVkLiIsCi0JCQkJCTEsIGRpcmVjdG9yaWVzLmxlbmd0aCk7CisgICAgICAgICAgICAvLyBUZXN0IHRvIHNlZSBpZiB0aGUgY29ycmVjdCBudW1iZXIgb2YgZGlyZWN0b3JpZXMgYXJlIHJldHVybmVkLgorICAgICAgICAgICAgRmlsZVtdIGRpcmVjdG9yaWVzID0gYmFzZURpci5saXN0RmlsZXMoZGlyRmlsdGVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IE51bWJlciBPZiBEaXJlY3RvcmllcyBSZXR1cm5lZC4iLAorICAgICAgICAgICAgICAgICAgICAxLCBkaXJlY3Rvcmllcy5sZW5ndGgpOwogCi0JCQkvLyBUZXN0IHRvIHNlZSBpZiB0aGUgZGlyZWN0b3J5IHdhcyBzYXZlZCB3aXRoIHRoZSBjb3JyZWN0IG5hbWUuCi0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBEaXJlY3RvcnkgUmV0dXJuZWQuIiwgMCwgZGlyZWN0b3JpZXNbMF0KLQkJCQkJLmNvbXBhcmVUbyhkaXIxKSk7CisgICAgICAgICAgICAvLyBUZXN0IHRvIHNlZSBpZiB0aGUgZGlyZWN0b3J5IHdhcyBzYXZlZCB3aXRoIHRoZSBjb3JyZWN0IG5hbWUuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBEaXJlY3RvcnkgUmV0dXJuZWQuIiwgMCwgZGlyZWN0b3JpZXNbMF0KKyAgICAgICAgICAgICAgICAgICAgLmNvbXBhcmVUbyhkaXIxKSk7CiAKLQkJCS8vIFRlc3QgdG8gc2VlIGlmIHRoZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlcyBhcmUgcmV0dXJuZWQuCi0JCQlGaWxlW10gZmxpc3QgPSBiYXNlRGlyLmxpc3RGaWxlcyhmaWxlRmlsdGVyKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBOdW1iZXIgT2YgRmlsZXMgUmV0dXJuZWQuIiwKLQkJCQkJZmxpc3QubGVuZ3RoID09IGZpbGVzLmxlbmd0aCk7CisgICAgICAgICAgICAvLyBUZXN0IHRvIHNlZSBpZiB0aGUgY29ycmVjdCBudW1iZXIgb2YgZmlsZXMgYXJlIHJldHVybmVkLgorICAgICAgICAgICAgRmlsZVtdIGZsaXN0ID0gYmFzZURpci5saXN0RmlsZXMoZmlsZUZpbHRlcik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgTnVtYmVyIE9mIEZpbGVzIFJldHVybmVkLiIsCisgICAgICAgICAgICAgICAgICAgIGZsaXN0Lmxlbmd0aCA9PSBmaWxlcy5sZW5ndGgpOwogCi0JCQkvLyBDaGVja2luZyB0byBtYWtlIHN1cmUgdGhlIGNvcnJlY3QgZmlsZXMgd2VyZSBhcmUgbGlzdGVkIGluIHRoZQotCQkJLy8gYXJyYXkuCi0JCQlib29sZWFuW10gY2hlY2sgPSBuZXcgYm9vbGVhbltmbGlzdC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVjay5sZW5ndGg7IGkrKykKLQkJCQljaGVja1tpXSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmxpc3QubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKGZsaXN0W2pdLmdldE5hbWUoKS5lcXVhbHMoZmlsZXNbaV0pKSB7Ci0JCQkJCQljaGVja1tpXSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBjaGVja0NvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2subGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2hlY2tbaV0gPT0gZmFsc2UpCi0JCQkJCWNoZWNrQ291bnQrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscygiSW52YWxpZCBmaWxlIHJldHVybmVkIGluIGxpc3RpbmciLCAwLCBjaGVja0NvdW50KTsKKyAgICAgICAgICAgIC8vIENoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmaWxlcyB3ZXJlIGFyZSBsaXN0ZWQgaW4gdGhlCisgICAgICAgICAgICAvLyBhcnJheS4KKyAgICAgICAgICAgIGJvb2xlYW5bXSBjaGVjayA9IG5ldyBib29sZWFuW2ZsaXN0Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNoZWNrW2ldID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmbGlzdC5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmxpc3Rbal0uZ2V0TmFtZSgpLmVxdWFscyhmaWxlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNoZWNrQ291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjaGVja1tpXSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpbGUgcmV0dXJuZWQgaW4gbGlzdGluZyIsIDAsIGNoZWNrQ291bnQpOwogCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoYmFzZURpciwgZmlsZXNbaV0pOwotCQkJCWYuZGVsZXRlKCk7Ci0JCQl9Ci0JCQlkaXIxLmRlbGV0ZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiUGFyZW50IERpcmVjdG9yeSBOb3QgRGVsZXRlZC4iLCBiYXNlRGlyLmRlbGV0ZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShiYXNlRGlyLCBmaWxlc1tpXSk7Ci0JCQkJZi5kZWxldGUoKTsKLQkJCX0KLQkJCWlmIChkaXIxICE9IG51bGwpCi0JCQkJZGlyMS5kZWxldGUoKTsKLQkJCWJhc2VEaXIuZGVsZXRlKCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYmFzZURpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXIxLmRlbGV0ZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUGFyZW50IERpcmVjdG9yeSBOb3QgRGVsZXRlZC4iLCBiYXNlRGlyLmRlbGV0ZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShiYXNlRGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkaXIxICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGlyMS5kZWxldGUoKTsKKyAgICAgICAgICAgIGJhc2VEaXIuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3RGaWxlcyhqYXZhLmlvLkZpbGVuYW1lRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbGlzdEZpbGVzTGphdmFfaW9fRmlsZW5hbWVGaWx0ZXIoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUubGlzdEZpbGVzKEZpbGVuYW1lRmlsdGVyIGZpbHRlcikKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3RGaWxlcyhqYXZhLmlvLkZpbGVuYW1lRmlsdGVyKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJsaXN0RmlsZXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlbmFtZUZpbHRlci5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9saXN0RmlsZXNMamF2YV9pb19GaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5saXN0RmlsZXMoRmlsZW5hbWVGaWx0ZXIgZmlsdGVyKQogCi0JCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQkvLyBGaW5kaW5nIGEgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeSB0byBjcmVhdGUuCi0JCWludCBkaXJOdW1iZXIgPSAxOwotCQlib29sZWFuIGRpckV4aXN0cyA9IHRydWU7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoYmFzZSwgcGxhdGZvcm1JZCArIFN0cmluZy52YWx1ZU9mKGRpck51bWJlcikpOwotCQkvLyBNYWtpbmcgc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCi0JCXdoaWxlIChkaXJFeGlzdHMpIHsKLQkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZXhpc3RzLCBhZGQgb25lIHRvIHRoZSBkaXJlY3RvcnkgbnVtYmVyIChtYWtpbmcKLQkJCS8vIGl0IGEgbmV3IGRpcmVjdG9yeSBuYW1lLikKLQkJCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCQlkaXJOdW1iZXIrKzsKLQkJCQlkaXIgPSBuZXcgRmlsZShiYXNlLCBwbGF0Zm9ybUlkICsgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7Ci0JCQl9IGVsc2UgewotCQkJCWRpckV4aXN0cyA9IGZhbHNlOwotCQkJfQotCQl9CisgICAgICAgIFN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICAgICAgICAvLyBGaW5kaW5nIGEgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeSB0byBjcmVhdGUuCisgICAgICAgIGludCBkaXJOdW1iZXIgPSAxOworICAgICAgICBib29sZWFuIGRpckV4aXN0cyA9IHRydWU7CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoYmFzZSwgcGxhdGZvcm1JZCArIFN0cmluZy52YWx1ZU9mKGRpck51bWJlcikpOworICAgICAgICAvLyBNYWtpbmcgc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIHdoaWxlIChkaXJFeGlzdHMpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBkaXJlY3RvcnkgZXhpc3RzLCBhZGQgb25lIHRvIHRoZSBkaXJlY3RvcnkgbnVtYmVyIChtYWtpbmcKKyAgICAgICAgICAgIC8vIGl0IGEgbmV3IGRpcmVjdG9yeSBuYW1lLikKKyAgICAgICAgICAgIGlmIChkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBkaXJOdW1iZXIrKzsKKyAgICAgICAgICAgICAgICBkaXIgPSBuZXcgRmlsZShiYXNlLCBwbGF0Zm9ybUlkICsgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpckV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8gQ3JlYXRpbmcgYSBmaWx0ZXIgdGhhdCBjYXRjaGVzICIqLnRzdCIgZmlsZXMuCi0JCUZpbGVuYW1lRmlsdGVyIHRzdEZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYsIFN0cmluZyBmaWxlTmFtZSkgewotCQkJCS8vIElmIHRoZSBzdWZmaXggaXMgIi50c3QiIHRoZW4gc2VuZCBpdCB0byB0aGUgYXJyYXkKLQkJCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi50c3QiKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07CisgICAgICAgIC8vIENyZWF0aW5nIGEgZmlsdGVyIHRoYXQgY2F0Y2hlcyAiKi50c3QiIGZpbGVzLgorICAgICAgICBGaWxlbmFtZUZpbHRlciB0c3RGaWx0ZXIgPSBuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmLCBTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3VmZml4IGlzICIudHN0IiB0aGVuIHNlbmQgaXQgdG8gdGhlIGFycmF5CisgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIudHN0IikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0JCWFzc2VydE51bGwoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIE51bGwuIiwKLQkJCQlkaXIubGlzdEZpbGVzKHRzdEZpbHRlcikpOworICAgICAgICBhc3NlcnROdWxsKCJsaXN0RmlsZXMgU2hvdWxkIFJldHVybiBOdWxsLiIsCisgICAgICAgICAgICAgICAgZGlyLmxpc3RGaWxlcyh0c3RGaWx0ZXIpKTsKIAotCQlhc3NlcnRUcnVlKCJGYWlsZWQgVG8gQ3JlYXRlIFBhcmVudCBEaXJlY3RvcnkuIiwgZGlyLm1rZGlyKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgVG8gQ3JlYXRlIFBhcmVudCBEaXJlY3RvcnkuIiwgZGlyLm1rZGlyKCkpOwogCi0JCVN0cmluZ1tdIGZpbGVzID0geyAiMS50c3QiLCAiMi50c3QiLCAiMy50bXAiIH07Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImxpc3RGaWxlcyBTaG91bGQgUmV0dXJuIEFuIEFycmF5IE9mIExlbmd0aCAwLiIsIDAsIGRpcgotCQkJCQkubGlzdEZpbGVzKHRzdEZpbHRlcikubGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSB7ICIxLnRzdCIsICIyLnRzdCIsICIzLnRtcCIgfTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibGlzdEZpbGVzIFNob3VsZCBSZXR1cm4gQW4gQXJyYXkgT2YgTGVuZ3RoIDAuIiwgMCwgZGlyCisgICAgICAgICAgICAgICAgICAgIC5saXN0RmlsZXModHN0RmlsdGVyKS5sZW5ndGgpOwogCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsICJub3RBRGlyLnRzdCIpOwotCQkJdHJ5IHsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJCWZvcy5jbG9zZSgpOwotCQkJCWFzc2VydE51bGwoCi0JCQkJCQkibGlzdEZpbGVzIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwgV2hlbiBVc2VkIE9uIEEgRmlsZSBJbnN0ZWFkIE9mIEEgRGlyZWN0b3J5LiIsCi0JCQkJCQlmaWxlLmxpc3RGaWxlcyh0c3RGaWx0ZXIpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZmlsZS5kZWxldGUoKTsKLQkJCX0KKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgIm5vdEFEaXIudHN0Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0RmlsZXMgU2hvdWxkIEhhdmUgUmV0dXJuZWQgTnVsbCBXaGVuIFVzZWQgT24gQSBGaWxlIEluc3RlYWQgT2YgQSBEaXJlY3RvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUubGlzdEZpbGVzKHRzdEZpbHRlcikpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQogCi0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0JCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCWZvcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIER1cmluZyBUZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gRHVyaW5nIFRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQogCi0JCQkvLyBDcmVhdGluZyBhIGZpbHRlciB0aGF0IGNhdGNoZXMgIioudG1wIiBmaWxlcy4KLQkJCUZpbGVuYW1lRmlsdGVyIHRtcEZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCQkJLy8gSWYgdGhlIHN1ZmZpeCBpcyAiLnRtcCIgdGhlbiBzZW5kIGl0IHRvIHRoZSBhcnJheQotCQkJCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi50bXAiKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKKyAgICAgICAgICAgIC8vIENyZWF0aW5nIGEgZmlsdGVyIHRoYXQgY2F0Y2hlcyAiKi50bXAiIGZpbGVzLgorICAgICAgICAgICAgRmlsZW5hbWVGaWx0ZXIgdG1wRmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYsIFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3VmZml4IGlzICIudG1wIiB0aGVuIHNlbmQgaXQgdG8gdGhlIGFycmF5CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aCgiLnRtcCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OwogCi0JCQkvLyBUZXN0cyB0byBzZWUgaWYgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGZpbGVzIHdlcmUgcmV0dXJuZWQuCi0JCQlGaWxlW10gZmxpc3QgPSBkaXIubGlzdEZpbGVzKHRzdEZpbHRlcik7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBOdW1iZXIgT2YgRmlsZXMgUGFzc2VkIFRocm91Z2ggdHN0RmlsdGVyLiIsCi0JCQkJCTIsIGZsaXN0Lmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgaSsrKQotCQkJCWFzc2VydFRydWUoIkZpbGUgU2hvdWxkIE5vdCBIYXZlIFBhc3NlZCBUaGUgdHN0RmlsdGVyLiIsCi0JCQkJCQlmbGlzdFtpXS5nZXRQYXRoKCkuZW5kc1dpdGgoIi50c3QiKSk7CisgICAgICAgICAgICAvLyBUZXN0cyB0byBzZWUgaWYgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGZpbGVzIHdlcmUgcmV0dXJuZWQuCisgICAgICAgICAgICBGaWxlW10gZmxpc3QgPSBkaXIubGlzdEZpbGVzKHRzdEZpbHRlcik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBOdW1iZXIgT2YgRmlsZXMgUGFzc2VkIFRocm91Z2ggdHN0RmlsdGVyLiIsCisgICAgICAgICAgICAgICAgICAgIDIsIGZsaXN0Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgU2hvdWxkIE5vdCBIYXZlIFBhc3NlZCBUaGUgdHN0RmlsdGVyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGlzdFtpXS5nZXRQYXRoKCkuZW5kc1dpdGgoIi50c3QiKSk7CiAKLQkJCWZsaXN0ID0gZGlyLmxpc3RGaWxlcyh0bXBGaWx0ZXIpOwotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTnVtYmVyIE9mIEZpbGVzIFBhc3NlZCBUaHJvdWdoIHRtcEZpbHRlci4iLAotCQkJCQkxLCBmbGlzdC5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmlsZSBTaG91bGQgTm90IEhhdmUgUGFzc2VkIFRoZSB0bXBGaWx0ZXIuIiwgZmxpc3RbMF0KLQkJCQkJLmdldFBhdGgoKS5lbmRzV2l0aCgiLnRtcCIpKTsKKyAgICAgICAgICAgIGZsaXN0ID0gZGlyLmxpc3RGaWxlcyh0bXBGaWx0ZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTnVtYmVyIE9mIEZpbGVzIFBhc3NlZCBUaHJvdWdoIHRtcEZpbHRlci4iLAorICAgICAgICAgICAgICAgICAgICAxLCBmbGlzdC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBTaG91bGQgTm90IEhhdmUgUGFzc2VkIFRoZSB0bXBGaWx0ZXIuIiwgZmxpc3RbMF0KKyAgICAgICAgICAgICAgICAgICAgLmdldFBhdGgoKS5lbmRzV2l0aCgiLnRtcCIpKTsKIAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOwotCQkJCWYuZGVsZXRlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJQYXJlbnQgRGlyZWN0b3J5IE5vdCBEZWxldGVkLiIsIGRpci5kZWxldGUoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0JCQkJZi5kZWxldGUoKTsKLQkJCX0KLQkJCWRpci5kZWxldGUoKTsKLQkJfQotCX0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUGFyZW50IERpcmVjdG9yeSBOb3QgRGVsZXRlZC4iLCBkaXIuZGVsZXRlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXIuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3QoamF2YS5pby5GaWxlbmFtZUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2xpc3RMamF2YV9pb19GaWxlbmFtZUZpbHRlcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10KLQkJLy8gamF2YS5pby5GaWxlLmxpc3QoamF2YS5pby5GaWxlbmFtZUZpbHRlcikKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI2xpc3QoamF2YS5pby5GaWxlbmFtZUZpbHRlcikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibGlzdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGVuYW1lRmlsdGVyLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2xpc3RMamF2YV9pb19GaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10KKyAgICAgICAgLy8gamF2YS5pby5GaWxlLmxpc3QoamF2YS5pby5GaWxlbmFtZUZpbHRlcikKIAotCQlTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQkJLy8gT2xkIHRlc3QgbGVmdCBiZWhpbmQgImdhcmJhZ2UgZmlsZXMiIHNvIHRoaXMgdGltZSBpdCBjcmVhdGVzIGEKLQkJLy8gZGlyZWN0b3J5Ci0JCS8vIHRoYXQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYWxyZWFkeSBleGlzdCAoYW5kIGRlbGV0ZXMgaXQgYWZ0ZXJ3YXJkLikKLQkJaW50IGRpck51bWJlciA9IDE7Ci0JCWJvb2xlYW4gZGlyRXhpc3RzID0gdHJ1ZTsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShiYXNlLCBwbGF0Zm9ybUlkICsgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7Ci0JCXdoaWxlIChkaXJFeGlzdHMpIHsKLQkJCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCQlkaXJOdW1iZXIrKzsKLQkJCQlkaXIgPSBuZXcgRmlsZShiYXNlLCBTdHJpbmcudmFsdWVPZihkaXJOdW1iZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlyRXhpc3RzID0gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgU3RyaW5nIGJhc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgIC8vIE9sZCB0ZXN0IGxlZnQgYmVoaW5kICJnYXJiYWdlIGZpbGVzIiBzbyB0aGlzIHRpbWUgaXQgY3JlYXRlcyBhCisgICAgICAgIC8vIGRpcmVjdG9yeQorICAgICAgICAvLyB0aGF0IGlzIGd1YXJhbnRlZWQgbm90IHRvIGFscmVhZHkgZXhpc3QgKGFuZCBkZWxldGVzIGl0IGFmdGVyd2FyZC4pCisgICAgICAgIGludCBkaXJOdW1iZXIgPSAxOworICAgICAgICBib29sZWFuIGRpckV4aXN0cyA9IHRydWU7CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoYmFzZSwgcGxhdGZvcm1JZCArIFN0cmluZy52YWx1ZU9mKGRpck51bWJlcikpOworICAgICAgICB3aGlsZSAoZGlyRXhpc3RzKSB7CisgICAgICAgICAgICBpZiAoZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZGlyTnVtYmVyKys7CisgICAgICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoYmFzZSwgU3RyaW5nLnZhbHVlT2YoZGlyTnVtYmVyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpckV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotCQkJCXJldHVybiAhbmFtZS5lcXVhbHMoIm10enoxLnh4Iik7Ci0JCQl9Ci0JCX07CisgICAgICAgIEZpbGVuYW1lRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIW5hbWUuZXF1YWxzKCJtdHp6MS54eCIpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0JCVN0cmluZ1tdIGZsaXN0ID0gZGlyLmxpc3QoZmlsdGVyKTsKLQkJYXNzZXJ0TnVsbCgiTWV0aG9kIGxpc3QoRmlsZW5hbWVGaWx0ZXIpIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwuIiwKLQkJCQlmbGlzdCk7CisgICAgICAgIFN0cmluZ1tdIGZsaXN0ID0gZGlyLmxpc3QoZmlsdGVyKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTWV0aG9kIGxpc3QoRmlsZW5hbWVGaWx0ZXIpIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwuIiwKKyAgICAgICAgICAgICAgICBmbGlzdCk7CiAKLQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3J5IGZvciB0ZXN0IiwgZGlyLm1rZGlyKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZCBub3QgY3JlYXRlIHBhcmVudCBkaXJlY3RvcnkgZm9yIHRlc3QiLCBkaXIubWtkaXIoKSk7CiAKLQkJU3RyaW5nW10gZmlsZXMgPSB7ICJtdHp6MS54eCIsICJtdHp6Mi54eCIsICJtdHp6My55eSIsICJtdHp6NC55eSIgfTsKLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBEbyBub3QgcmV0dXJuIG51bGwgd2hlbiB0cnlpbmcgdG8gdXNlIGxpc3QoRmlsZW5hbWUgRmlsdGVyKSBvbiBhCi0JCQkgKiBmaWxlIHJhdGhlciB0aGFuIGEgZGlyZWN0b3J5LiBBbGwgb3RoZXIgImxpc3QiIG1ldGhvZHMgcmV0dXJuCi0JCQkgKiBudWxsIGZvciB0aGlzIHRlc3QgY2FzZS4KLQkJCSAqLwotCQkJLyoKLQkJCSAqIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgIm5vdEFEaXIudHN0Iik7IHRyeSB7IEZpbGVPdXRwdXRTdHJlYW0KLQkJCSAqIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOyBmb3MuY2xvc2UoKTsgfSBjYXRjaAotCQkJICogKElPRXhjZXB0aW9uIGUpIHsgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBEdXJpbmcKLQkJCSAqIFRlc3QuIik7IH0gZmxpc3QgPSBkaXIubGlzdChmaWx0ZXIpOyBhc3NlcnROdWxsKCJsaXN0RmlsZXMKLQkJCSAqIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwgV2hlbiBVc2VkIE9uIEEgRmlsZSBJbnN0ZWFkIE9mIEEKLQkJCSAqIERpcmVjdG9yeS4iLCBmbGlzdCk7IGZpbGUuZGVsZXRlKCk7Ci0JCQkgKi8KKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSB7ICJtdHp6MS54eCIsICJtdHp6Mi54eCIsICJtdHp6My55eSIsICJtdHp6NC55eSIgfTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEbyBub3QgcmV0dXJuIG51bGwgd2hlbiB0cnlpbmcgdG8gdXNlIGxpc3QoRmlsZW5hbWUgRmlsdGVyKSBvbiBhCisgICAgICAgICAgICAgKiBmaWxlIHJhdGhlciB0aGFuIGEgZGlyZWN0b3J5LiBBbGwgb3RoZXIgImxpc3QiIG1ldGhvZHMgcmV0dXJuCisgICAgICAgICAgICAgKiBudWxsIGZvciB0aGlzIHRlc3QgY2FzZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgIm5vdEFEaXIudHN0Iik7IHRyeSB7IEZpbGVPdXRwdXRTdHJlYW0KKyAgICAgICAgICAgICAqIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOyBmb3MuY2xvc2UoKTsgfSBjYXRjaAorICAgICAgICAgICAgICogKElPRXhjZXB0aW9uIGUpIHsgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBEdXJpbmcKKyAgICAgICAgICAgICAqIFRlc3QuIik7IH0gZmxpc3QgPSBkaXIubGlzdChmaWx0ZXIpOyBhc3NlcnROdWxsKCJsaXN0RmlsZXMKKyAgICAgICAgICAgICAqIFNob3VsZCBIYXZlIFJldHVybmVkIE51bGwgV2hlbiBVc2VkIE9uIEEgRmlsZSBJbnN0ZWFkIE9mIEEKKyAgICAgICAgICAgICAqIERpcmVjdG9yeS4iLCBmbGlzdCk7IGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgKi8KIAotCQkJZmxpc3QgPSBkaXIubGlzdChmaWx0ZXIpOwotCQkJYXNzZXJ0RXF1YWxzKCJBcnJheSBPZiBMZW5ndGggMCBTaG91bGQgSGF2ZSBSZXR1cm5lZC4iLAotCQkJCQkwLCBmbGlzdC5sZW5ndGgpOworICAgICAgICAgICAgZmxpc3QgPSBkaXIubGlzdChmaWx0ZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcnJheSBPZiBMZW5ndGggMCBTaG91bGQgSGF2ZSBSZXR1cm5lZC4iLAorICAgICAgICAgICAgICAgICAgICAwLCBmbGlzdC5sZW5ndGgpOwogCi0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0JCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCWZvcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQogCi0JCQlmbGlzdCA9IGRpci5saXN0KGZpbHRlcik7CisgICAgICAgICAgICBmbGlzdCA9IGRpci5saXN0KGZpbHRlcik7CiAKLQkJCWlmIChmbGlzdC5sZW5ndGggIT0gZmlsZXMubGVuZ3RoIC0gMSkgewotCQkJCWZhaWwoIkluY29ycmVjdCBsaXN0IHJldHVybmVkIik7Ci0JCQl9CisgICAgICAgICAgICBpZiAoZmxpc3QubGVuZ3RoICE9IGZpbGVzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbmNvcnJlY3QgbGlzdCByZXR1cm5lZCIpOworICAgICAgICAgICAgfQogCi0JCQkvLyBDaGVja2luZyB0byBtYWtlIHN1cmUgdGhlIGNvcnJlY3QgZmlsZXMgd2VyZSBhcmUgbGlzdGVkIGluIHRoZQotCQkJLy8gYXJyYXkuCi0JCQlib29sZWFuW10gY2hlY2sgPSBuZXcgYm9vbGVhbltmbGlzdC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVjay5sZW5ndGg7IGkrKykKLQkJCQljaGVja1tpXSA9IGZhbHNlOwotCQkJU3RyaW5nW10gd2FudGVkRmlsZXMgPSB7ICJtdHp6Mi54eCIsICJtdHp6My55eSIsICJtdHp6NC55eSIgfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2FudGVkRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZsaXN0Lmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChmbGlzdFtqXS5lcXVhbHMod2FudGVkRmlsZXNbaV0pKSB7Ci0JCQkJCQljaGVja1tpXSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBjaGVja0NvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2subGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2hlY2tbaV0gPT0gZmFsc2UpCi0JCQkJCWNoZWNrQ291bnQrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscygiSW52YWxpZCBmaWxlIHJldHVybmVkIGluIGxpc3RpbmciLCAwLCBjaGVja0NvdW50KTsKKyAgICAgICAgICAgIC8vIENoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmaWxlcyB3ZXJlIGFyZSBsaXN0ZWQgaW4gdGhlCisgICAgICAgICAgICAvLyBhcnJheS4KKyAgICAgICAgICAgIGJvb2xlYW5bXSBjaGVjayA9IG5ldyBib29sZWFuW2ZsaXN0Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNoZWNrW2ldID0gZmFsc2U7CisgICAgICAgICAgICBTdHJpbmdbXSB3YW50ZWRGaWxlcyA9IHsgIm10enoyLnh4IiwgIm10enozLnl5IiwgIm10eno0Lnl5IiB9OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3YW50ZWRGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxpc3QubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsaXN0W2pdLmVxdWFscyh3YW50ZWRGaWxlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNoZWNrQ291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjaGVja1tpXSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpbGUgcmV0dXJuZWQgaW4gbGlzdGluZyIsIDAsIGNoZWNrQ291bnQpOwogCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0JCQkJZi5kZWxldGUoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoIkNvdWxkIG5vdCBkZWxldGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgdGVzdC4iLCBkaXIKLQkJCQkJLmRlbGV0ZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKLQkJCQlmLmRlbGV0ZSgpOwotCQkJfQotCQkJZGlyLmRlbGV0ZSgpOwotCQl9Ci0JfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZCBub3QgZGVsZXRlIHBhcmVudCBkaXJlY3RvcnkgZm9yIHRlc3QuIiwgZGlyCisgICAgICAgICAgICAgICAgICAgIC5kZWxldGUoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpci5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbGlzdFJvb3RzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2xpc3RSb290cygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5saXN0Um9vdHMoKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbGlzdFJvb3RzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbGlzdFJvb3RzKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxpc3RSb290cyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9saXN0Um9vdHMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUubGlzdFJvb3RzKCkKIAotCQlGaWxlW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cygpOwotCQlib29sZWFuIG9uVW5peCA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLyc7Ci0JCWJvb2xlYW4gb25XaW5kb3dzID0gRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCc7Ci0JCWlmIChvblVuaXgpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IE51bWJlciBPZiBSb290IERpcmVjdG9yaWVzLiIsCi0JCQkJCTEsIHJvb3RzLmxlbmd0aCk7Ci0JCQlTdHJpbmcgZmlsZUxvYyA9IHJvb3RzWzBdLmdldFBhdGgoKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBSb290IERpcmVjdG9yeSBSZXR1cm5lZC4iLCBmaWxlTG9jCi0JCQkJCS5zdGFydHNXaXRoKHNsYXNoKSk7Ci0JCX0gZWxzZSBpZiAob25XaW5kb3dzKSB7Ci0JCQkvLyBOZWVkIGJldHRlciB0ZXN0IGZvciBXaW5kb3dzCi0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgTnVtYmVyIE9mIFJvb3QgRGlyZWN0b3JpZXMuIiwKLQkJCQkJcm9vdHMubGVuZ3RoID4gMCk7Ci0JCX0KLQl9CisgICAgICAgIEZpbGVbXSByb290cyA9IEZpbGUubGlzdFJvb3RzKCk7CisgICAgICAgIGJvb2xlYW4gb25Vbml4ID0gRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJzsKKyAgICAgICAgYm9vbGVhbiBvbldpbmRvd3MgPSBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJzsKKyAgICAgICAgaWYgKG9uVW5peCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgTnVtYmVyIE9mIFJvb3QgRGlyZWN0b3JpZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgMSwgcm9vdHMubGVuZ3RoKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlTG9jID0gcm9vdHNbMF0uZ2V0UGF0aCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IFJvb3QgRGlyZWN0b3J5IFJldHVybmVkLiIsIGZpbGVMb2MKKyAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgoc2xhc2gpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvbldpbmRvd3MpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgYmV0dGVyIHRlc3QgZm9yIFdpbmRvd3MKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBOdW1iZXIgT2YgUm9vdCBEaXJlY3Rvcmllcy4iLAorICAgICAgICAgICAgICAgICAgICByb290cy5sZW5ndGggPiAwKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbWtkaXIoKQotCSAqLworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbWtkaXIoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJta2RpciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9ta2RpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uRmlsZS5ta2RpcigpCiAKQEAgLTE4NjMsMzg0ICsyMTQ0LDQ1NiBAQAogICAgICAgICB9ICAgICAKICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI21rZGlycygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9ta2RpcnMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uRmlsZS5ta2RpcnMoKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjbWtkaXJzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWtkaXJzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21rZGlycygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWxlLm1rZGlycygpCiAKLQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQlpZiAoIXVzZXJIb21lLmVuZHNXaXRoKHNsYXNoKSkKLQkJCXVzZXJIb21lICs9IHNsYXNoOwotCQlGaWxlIGYgPSBuZXcgRmlsZSh1c2VySG9tZSArICJtZHRlc3QiICsgcGxhdGZvcm1JZCArIHNsYXNoICsgIm1kdGVzdDIiLAotCQkJCSJwLnRzdCIpOwotCQlGaWxlIGcgPSBuZXcgRmlsZSh1c2VySG9tZSArICJtZHRlc3QiICsgcGxhdGZvcm1JZCArIHNsYXNoICsgIm1kdGVzdDIiKTsKLQkJRmlsZSBoID0gbmV3IEZpbGUodXNlckhvbWUgKyAibWR0ZXN0IiArIHBsYXRmb3JtSWQpOwotCQlmLm1rZGlycygpOwotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiQmFzZSBEaXJlY3Rvcnkgbm90IGNyZWF0ZWQiLCBoLmV4aXN0cygpKTsKLQkJCWFzc2VydFRydWUoIkRpcmVjdG9yaWVzIG5vdCBjcmVhdGVkIiwgZy5leGlzdHMoKSk7Ci0JCQlhc3NlcnRUcnVlKCJGaWxlIG5vdCBjcmVhdGVkIiwgZi5leGlzdHMoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmLmRlbGV0ZSgpOwotCQkJZy5kZWxldGUoKTsKLQkJCWguZGVsZXRlKCk7Ci0JCX0KLQl9CisgICAgICAgIFN0cmluZyB1c2VySG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgaWYgKCF1c2VySG9tZS5lbmRzV2l0aChzbGFzaCkpCisgICAgICAgICAgICB1c2VySG9tZSArPSBzbGFzaDsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodXNlckhvbWUgKyAibWR0ZXN0IiArIHBsYXRmb3JtSWQgKyBzbGFzaCArICJtZHRlc3QyIiwKKyAgICAgICAgICAgICAgICAicC50c3QiKTsKKyAgICAgICAgRmlsZSBnID0gbmV3IEZpbGUodXNlckhvbWUgKyAibWR0ZXN0IiArIHBsYXRmb3JtSWQgKyBzbGFzaCArICJtZHRlc3QyIik7CisgICAgICAgIEZpbGUgaCA9IG5ldyBGaWxlKHVzZXJIb21lICsgIm1kdGVzdCIgKyBwbGF0Zm9ybUlkKTsKKyAgICAgICAgZi5ta2RpcnMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkJhc2UgRGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgaC5leGlzdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXJlY3RvcmllcyBub3QgY3JlYXRlZCIsIGcuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBub3QgY3JlYXRlZCIsIGYuZXhpc3RzKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIGcuZGVsZXRlKCk7CisgICAgICAgICAgICBoLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSNyZW5hbWVUbyhqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZW5hbWVUb0xqYXZhX2lvX0ZpbGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uRmlsZS5yZW5hbWVUbyhqYXZhLmlvLkZpbGUpCi0JCVN0cmluZyBiYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGJhc2UsIHBsYXRmb3JtSWQpOwotCQlkaXIubWtkaXIoKTsKLQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyLCAieHh4Lnh4eCIpOwotCQlGaWxlIHJmaWxlID0gbmV3IEZpbGUoZGlyLCAieXl5Lnl5eSIpOwotCQlGaWxlIGYyID0gbmV3IEZpbGUoZGlyLCAienp6Lnp6eiIpOwotCQl0cnkgewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCWZvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlsb25nIGxlbmd0aE9mRmlsZSA9IGYubGVuZ3RoKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNyZW5hbWVUbyhqYXZhLmlvLkZpbGUpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gJiBTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVuYW1lVG8iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVuYW1lVG9MamF2YV9pb19GaWxlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLkZpbGUucmVuYW1lVG8oamF2YS5pby5GaWxlKQorICAgICAgICBTdHJpbmcgYmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShiYXNlLCBwbGF0Zm9ybUlkKTsKKyAgICAgICAgZGlyLm1rZGlyKCk7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgInh4eC54eHgiKTsKKyAgICAgICAgRmlsZSByZmlsZSA9IG5ldyBGaWxlKGRpciwgInl5eS55eXkiKTsKKyAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKGRpciwgInp6ei56enoiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgICAgICAgICBmb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgbG9uZyBsZW5ndGhPZkZpbGUgPSBmLmxlbmd0aCgpOwogCi0JCQlyZmlsZS5kZWxldGUoKTsgLy8gaW4gY2FzZSBpdCBhbHJlYWR5IGV4aXN0cworICAgICAgICAgICAgcmZpbGUuZGVsZXRlKCk7IC8vIGluIGNhc2UgaXQgYWxyZWFkeSBleGlzdHMKIAotCQkJYXNzZXJ0VHJ1ZSgiVGVzdCAxOiBGaWxlIFJlbmFtZSBGYWlsZWQiLCBmLnJlbmFtZVRvKHJmaWxlKSk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDI6IEZpbGUgUmVuYW1lIEZhaWxlZC4iLCByZmlsZS5leGlzdHMoKSk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDM6IFNpemUgT2YgRmlsZSBDaGFuZ2VkLiIsCi0JCQkJCXJmaWxlLmxlbmd0aCgpID09IGxlbmd0aE9mRmlsZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDE6IEZpbGUgUmVuYW1lIEZhaWxlZCIsIGYucmVuYW1lVG8ocmZpbGUpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMjogRmlsZSBSZW5hbWUgRmFpbGVkLiIsIHJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMzogU2l6ZSBPZiBGaWxlIENoYW5nZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgcmZpbGUubGVuZ3RoKCkgPT0gbGVuZ3RoT2ZGaWxlKTsKIAotCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocmZpbGUpOwotCQkJZm9zLmNsb3NlKCk7CisgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShyZmlsZSk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKIAotCQkJZjIuZGVsZXRlKCk7IC8vIGluIGNhc2UgaXQgYWxyZWFkeSBleGlzdHMKLQkJCWFzc2VydFRydWUoIlRlc3QgNDogRmlsZSBSZW5hbWUgRmFpbGVkIiwgcmZpbGUucmVuYW1lVG8oZjIpKTsKLQkJCWFzc2VydFRydWUoIlRlc3QgNTogRmlsZSBSZW5hbWUgRmFpbGVkLiIsIGYyLmV4aXN0cygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmLmRlbGV0ZSgpOwotCQkJcmZpbGUuZGVsZXRlKCk7Ci0JCQlmMi5kZWxldGUoKTsKLQkJCWRpci5kZWxldGUoKTsKLQkJfQotCX0KKyAgICAgICAgICAgIGYyLmRlbGV0ZSgpOyAvLyBpbiBjYXNlIGl0IGFscmVhZHkgZXhpc3RzCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDQ6IEZpbGUgUmVuYW1lIEZhaWxlZCIsIHJmaWxlLnJlbmFtZVRvKGYyKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDU6IEZpbGUgUmVuYW1lIEZhaWxlZC4iLCBmMi5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIHJmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgZjIuZGVsZXRlKCk7CisgICAgICAgICAgICBkaXIuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI3NldExhc3RNb2RpZmllZChsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGFzdE1vZGlmaWVkSigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5zZXRMYXN0TW9kaWZpZWQoKQotCQlGaWxlIGYxID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGYxID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c190ZiIgLCAiLnRtcCIpOwotCQkJLy8gamNsUk0gZG9lcyBub3QgaW5jbHVkZSBGaWxlLmNyZWF0ZVRlbXBGaWxlCi0JCQlmMSA9IG5ldyBGaWxlKFN1cHBvcnRfUGxhdGZvcm1GaWxlLmdldE5ld1BsYXRmb3JtRmlsZSgKLQkJCQkJImh5dHNfdGZfc2xtIiwgIi50bXAiKSk7Ci0JCQlmMS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQlsb25nIG9yZ1RpbWUgPSBmMS5sYXN0TW9kaWZpZWQoKTsKLQkJCS8vIFN1YnRyYWN0aW5nIDEwMCAwMDAgbWlsbGlzZWNvbmRzIGZyb20gdGhlIG9yZ1RpbWUgb2YgRmlsZSBmMQotCQkJZjEuc2V0TGFzdE1vZGlmaWVkKG9yZ1RpbWUgLSAxMDAwMDApOwotCQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKLQkJCWFzc2VydFRydWUoIlRlc3QgMTogTGFzdE1vZGlmZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBsYXN0TW9kaWZpZWQsCi0JCQkJCWxhc3RNb2RpZmllZCA9PSAob3JnVGltZSAtIDEwMDAwMCkpOwotCQkJLy8gU3VidHJhY3RpbmcgMTAgMDAwIDAwMCBtaWxsaXNlY29uZHMgZnJvbSB0aGUgb3JnVGltZSBvZiBGaWxlIGYxCi0JCQlmMS5zZXRMYXN0TW9kaWZpZWQob3JnVGltZSAtIDEwMDAwMDAwKTsKLQkJCWxhc3RNb2RpZmllZCA9IGYxLmxhc3RNb2RpZmllZCgpOwotCQkJYXNzZXJ0VHJ1ZSgiVGVzdCAyOiBMYXN0TW9kaWZlZCB0aW1lIGluY29ycmVjdDogIiArIGxhc3RNb2RpZmllZCwKLQkJCQkJbGFzdE1vZGlmaWVkID09IChvcmdUaW1lIC0gMTAwMDAwMDApKTsKLQkJCS8vIEFkZGluZyAxMDAgMDAwIG1pbGxpc2Vjb25kcyB0byB0aGUgb3JnVGltZSBvZiBGaWxlIGYxCi0JCQlmMS5zZXRMYXN0TW9kaWZpZWQob3JnVGltZSArIDEwMDAwMCk7Ci0JCQlsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKLQkJCWFzc2VydFRydWUoIlRlc3QgMzogTGFzdE1vZGlmZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBsYXN0TW9kaWZpZWQsCi0JCQkJCWxhc3RNb2RpZmllZCA9PSAob3JnVGltZSArIDEwMDAwMCkpOwotCQkJLy8gQWRkaW5nIDEwIDAwMCAwMDAgbWlsbGlzZWNvbmRzIGZyb20gdGhlIG9yZ1RpbWUgb2YgRmlsZSBmMQotCQkJZjEuc2V0TGFzdE1vZGlmaWVkKG9yZ1RpbWUgKyAxMDAwMDAwMCk7Ci0JCQlsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKLQkJCWFzc2VydFRydWUoIlRlc3QgNDogTGFzdE1vZGlmZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBsYXN0TW9kaWZpZWQsCi0JCQkJCWxhc3RNb2RpZmllZCA9PSAob3JnVGltZSArIDEwMDAwMDAwKSk7Ci0JCQkvLyBUcnlpbmcgdG8gc2V0IHRpbWUgdG8gYW4gZXhhY3QgbnVtYmVyCi0JCQlmMS5zZXRMYXN0TW9kaWZpZWQoMzE1NTUwODAwMDAwTCk7Ci0JCQlsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKLQkJCWFzc2VydFRydWUoIlRlc3QgNTogTGFzdE1vZGlmaWVkIHRpbWUgaW5jb3JyZWN0OiAiICsgbGFzdE1vZGlmaWVkLAotCQkJCQlsYXN0TW9kaWZpZWQgPT0gMzE1NTUwODAwMDAwTCk7Ci0JCQlTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIiwgInVua25vd24iKTsKLQkJCWlmIChvc05hbWUuZXF1YWxzKCJXaW5kb3dzIDIwMDAiKSB8fCBvc05hbWUuZXF1YWxzKCJXaW5kb3dzIE5UIikpIHsKLQkJCQkvLyBUcnlpbmcgdG8gc2V0IHRpbWUgdG8gYSBsYXJnZSBleGFjdCBudW1iZXIKLQkJCQlib29sZWFuIHJlc3VsdCA9IGYxLnNldExhc3RNb2RpZmllZCg0MzU0ODM3MTk5MDAwTCk7Ci0JCQkJbG9uZyBuZXh0ID0gZjEubGFzdE1vZGlmaWVkKCk7Ci0JCQkJLy8gRGVjIDMxIDIzOjU5OjU5IEVTVCAyMTA3IGlzIG92ZXJmbG93IG9uIEZBVCBmaWxlIHN5c3RlbXMsIGFuZAotCQkJCS8vIHRoZSBjYWxsIGZhaWxzCi0JCQkJYXNzZXJ0VHJ1ZSgiVGVzdCA2OiBMYXN0TW9kaWZpZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBuZXh0LAotCQkJCQkJIXJlc3VsdCB8fCBuZXh0ID09IDQzNTQ4MzcxOTkwMDBMKTsKLQkJCX0KLQkJCS8vIFRyeWluZyB0byBzZXQgdGltZSB0byBhIG5lZ2F0aXZlIG51bWJlcgotCQkJdHJ5IHsKLQkJCQlmMS5zZXRMYXN0TW9kaWZpZWQoLTI1KTsKLQkJCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTm90IFRocm93bi4iKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGYxICE9IG51bGwpCi0JCQkJZjEuZGVsZXRlKCk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSNzZXRMYXN0TW9kaWZpZWQobG9uZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0TGFzdE1vZGlmaWVkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGFzdE1vZGlmaWVkSigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5zZXRMYXN0TW9kaWZpZWQoKQorICAgICAgICBGaWxlIGYxID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGYxID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c190ZiIgLCAiLnRtcCIpOworICAgICAgICAgICAgLy8gamNsUk0gZG9lcyBub3QgaW5jbHVkZSBGaWxlLmNyZWF0ZVRlbXBGaWxlCisgICAgICAgICAgICBmMSA9IG5ldyBGaWxlKFN1cHBvcnRfUGxhdGZvcm1GaWxlLmdldE5ld1BsYXRmb3JtRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgImh5dHNfdGZfc2xtIiwgIi50bXAiKSk7CisgICAgICAgICAgICBmMS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICAgICAgICBsb25nIG9yZ1RpbWUgPSBmMS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIC8vIFN1YnRyYWN0aW5nIDEwMCAwMDAgbWlsbGlzZWNvbmRzIGZyb20gdGhlIG9yZ1RpbWUgb2YgRmlsZSBmMQorICAgICAgICAgICAgZjEuc2V0TGFzdE1vZGlmaWVkKG9yZ1RpbWUgLSAxMDAwMDApOworICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMTogTGFzdE1vZGlmZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBsYXN0TW9kaWZpZWQsCisgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9PSAob3JnVGltZSAtIDEwMDAwMCkpOworICAgICAgICAgICAgLy8gU3VidHJhY3RpbmcgMTAgMDAwIDAwMCBtaWxsaXNlY29uZHMgZnJvbSB0aGUgb3JnVGltZSBvZiBGaWxlIGYxCisgICAgICAgICAgICBmMS5zZXRMYXN0TW9kaWZpZWQob3JnVGltZSAtIDEwMDAwMDAwKTsKKyAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IGYxLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAyOiBMYXN0TW9kaWZlZCB0aW1lIGluY29ycmVjdDogIiArIGxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID09IChvcmdUaW1lIC0gMTAwMDAwMDApKTsKKyAgICAgICAgICAgIC8vIEFkZGluZyAxMDAgMDAwIG1pbGxpc2Vjb25kcyB0byB0aGUgb3JnVGltZSBvZiBGaWxlIGYxCisgICAgICAgICAgICBmMS5zZXRMYXN0TW9kaWZpZWQob3JnVGltZSArIDEwMDAwMCk7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgMzogTGFzdE1vZGlmZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBsYXN0TW9kaWZpZWQsCisgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9PSAob3JnVGltZSArIDEwMDAwMCkpOworICAgICAgICAgICAgLy8gQWRkaW5nIDEwIDAwMCAwMDAgbWlsbGlzZWNvbmRzIGZyb20gdGhlIG9yZ1RpbWUgb2YgRmlsZSBmMQorICAgICAgICAgICAgZjEuc2V0TGFzdE1vZGlmaWVkKG9yZ1RpbWUgKyAxMDAwMDAwMCk7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgNDogTGFzdE1vZGlmZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBsYXN0TW9kaWZpZWQsCisgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9PSAob3JnVGltZSArIDEwMDAwMDAwKSk7CisgICAgICAgICAgICAvLyBUcnlpbmcgdG8gc2V0IHRpbWUgdG8gYW4gZXhhY3QgbnVtYmVyCisgICAgICAgICAgICBmMS5zZXRMYXN0TW9kaWZpZWQoMzE1NTUwODAwMDAwTCk7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBmMS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgNTogTGFzdE1vZGlmaWVkIHRpbWUgaW5jb3JyZWN0OiAiICsgbGFzdE1vZGlmaWVkLAorICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPT0gMzE1NTUwODAwMDAwTCk7CisgICAgICAgICAgICBTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIiwgInVua25vd24iKTsKKyAgICAgICAgICAgIGlmIChvc05hbWUuZXF1YWxzKCJXaW5kb3dzIDIwMDAiKSB8fCBvc05hbWUuZXF1YWxzKCJXaW5kb3dzIE5UIikpIHsKKyAgICAgICAgICAgICAgICAvLyBUcnlpbmcgdG8gc2V0IHRpbWUgdG8gYSBsYXJnZSBleGFjdCBudW1iZXIKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGYxLnNldExhc3RNb2RpZmllZCg0MzU0ODM3MTk5MDAwTCk7CisgICAgICAgICAgICAgICAgbG9uZyBuZXh0ID0gZjEubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgLy8gRGVjIDMxIDIzOjU5OjU5IEVTVCAyMTA3IGlzIG92ZXJmbG93IG9uIEZBVCBmaWxlIHN5c3RlbXMsIGFuZAorICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsIGZhaWxzCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCA2OiBMYXN0TW9kaWZpZWQgdGltZSBpbmNvcnJlY3Q6ICIgKyBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIXJlc3VsdCB8fCBuZXh0ID09IDQzNTQ4MzcxOTkwMDBMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRyeWluZyB0byBzZXQgdGltZSB0byBhIG5lZ2F0aXZlIG51bWJlcgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmMS5zZXRMYXN0TW9kaWZpZWQoLTI1KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTm90IFRocm93bi4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGYxICE9IG51bGwpCisgICAgICAgICAgICAgICAgZjEuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI3NldFJlYWRPbmx5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldFJlYWRPbmx5KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlLnNldFJlYWRPbmx5KCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI3NldFJlYWRPbmx5KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0UmVhZE9ubHkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWFkT25seSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS5zZXRSZWFkT25seSgpCiAKLQkJRmlsZSBmMSA9IG51bGw7Ci0JCUZpbGUgZjIgPSBudWxsOwotCQl0cnkgewotCQkJZjEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzX3RmIiwgIi50bXAiKTsKLQkJCWYyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c190ZiIsICIudG1wIik7Ci0JCQkvLyBBc3NlcnQgaXMgZmxhd2VkIGJlY2F1c2UgY2FuV3JpdGUgZG9lcyBub3Qgd29yay4KLQkJCS8vIGFzc2VydFRydWUoIkZpbGUgZjEgSXMgU2V0IFRvIFJlYWRPbmx5LiIgLCBmMS5jYW5Xcml0ZSgpKTsKLQkJCWYxLnNldFJlYWRPbmx5KCk7Ci0JCQkvLyBBc3NlcnQgaXMgZmxhd2VkIGJlY2F1c2UgY2FuV3JpdGUgZG9lcyBub3Qgd29yay4KLQkJCS8vIGFzc2VydFRydWUoIkZpbGUgZjEgSXMgTm90IFNldCBUbyBSZWFkT25seS4iICwgIWYxLmNhbldyaXRlKCkpOwotCQkJdHJ5IHsKLQkJCQkvLyBBdHRlbXB0IHRvIHdyaXRlIHRvIGEgZmlsZSB0aGF0IGlzIHNldFJlYWRPbmx5LgotCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGYxKTsKLQkJCQlmYWlsKCJJT0V4Y2VwdGlvbiBub3QgdGhyb3duLiIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQkJUnVudGltZSByID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0JCQlQcm9jZXNzIHA7Ci0JCQlib29sZWFuIG9uVW5peCA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLyc7Ci0JCQlpZiAob25Vbml4KQotCQkJCXAgPSByLmV4ZWMoImNobW9kICt3ICIgKyBmMS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQllbHNlCi0JCQkJcCA9IHIuZXhlYygiYXR0cmliIC1yIFwiIiArIGYxLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7Ci0JCQlwLndhaXRGb3IoKTsKLQkJCS8vIEFzc2VydCBpcyBmbGF3ZWQgYmVjYXVzZSBjYW5Xcml0ZSBkb2VzIG5vdCB3b3JrLgotCQkJLy8gYXNzZXJ0VHJ1ZSgiRmlsZSBmMSBJcyBTZXQgVG8gUmVhZE9ubHkuIiAsIGYxLmNhbldyaXRlKCkpOwotCQkJdHJ5IHsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYxKTsKLQkJCQlmb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQlmb3MuY2xvc2UoKTsKLQkJCQlhc3NlcnRUcnVlKCJGaWxlIFdhcyBOb3QgQWJsZSBUbyBCZSBXcml0dGVuIFRvLiIsCi0JCQkJCQlmMS5sZW5ndGgoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKAotCQkJCQkJIlRlc3QgMTogVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBXaGlsZSBBdHRlbXB0aW5nIFRvIFdyaXRlIFRvIEZpbGUuIgotCQkJCQkJCQkrIGUpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiRmlsZSBmMSBEaWQgTm90IERlbGV0ZSIsIGYxLmRlbGV0ZSgpKTsKKyAgICAgICAgRmlsZSBmMSA9IG51bGw7CisgICAgICAgIEZpbGUgZjIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZjEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzX3RmIiwgIi50bXAiKTsKKyAgICAgICAgICAgIGYyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaHl0c190ZiIsICIudG1wIik7CisgICAgICAgICAgICAvLyBBc3NlcnQgaXMgZmxhd2VkIGJlY2F1c2UgY2FuV3JpdGUgZG9lcyBub3Qgd29yay4KKyAgICAgICAgICAgIC8vIGFzc2VydFRydWUoIkZpbGUgZjEgSXMgU2V0IFRvIFJlYWRPbmx5LiIgLCBmMS5jYW5Xcml0ZSgpKTsKKyAgICAgICAgICAgIGYxLnNldFJlYWRPbmx5KCk7CisgICAgICAgICAgICAvLyBBc3NlcnQgaXMgZmxhd2VkIGJlY2F1c2UgY2FuV3JpdGUgZG9lcyBub3Qgd29yay4KKyAgICAgICAgICAgIC8vIGFzc2VydFRydWUoIkZpbGUgZjEgSXMgTm90IFNldCBUbyBSZWFkT25seS4iICwgIWYxLmNhbldyaXRlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHdyaXRlIHRvIGEgZmlsZSB0aGF0IGlzIHNldFJlYWRPbmx5LgorICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYxKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBub3QgdGhyb3duLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgUnVudGltZSByID0gUnVudGltZS5nZXRSdW50aW1lKCk7CisgICAgICAgICAgICBQcm9jZXNzIHA7CisgICAgICAgICAgICBib29sZWFuIG9uVW5peCA9IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLyc7CisgICAgICAgICAgICBpZiAob25Vbml4KQorICAgICAgICAgICAgICAgIHAgPSByLmV4ZWMoImNobW9kICt3ICIgKyBmMS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcCA9IHIuZXhlYygiYXR0cmliIC1yIFwiIiArIGYxLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7CisgICAgICAgICAgICBwLndhaXRGb3IoKTsKKyAgICAgICAgICAgIC8vIEFzc2VydCBpcyBmbGF3ZWQgYmVjYXVzZSBjYW5Xcml0ZSBkb2VzIG5vdCB3b3JrLgorICAgICAgICAgICAgLy8gYXNzZXJ0VHJ1ZSgiRmlsZSBmMSBJcyBTZXQgVG8gUmVhZE9ubHkuIiAsIGYxLmNhbldyaXRlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYxKTsKKyAgICAgICAgICAgICAgICBmb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIFdhcyBOb3QgQWJsZSBUbyBCZSBXcml0dGVuIFRvLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmMS5sZW5ndGgoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QgMTogVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBXaGlsZSBBdHRlbXB0aW5nIFRvIFdyaXRlIFRvIEZpbGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBmMSBEaWQgTm90IERlbGV0ZSIsIGYxLmRlbGV0ZSgpKTsKIAotCQkJLy8gQXNzZXJ0IGlzIGZsYXdlZCBiZWNhdXNlIGNhbldyaXRlIGRvZXMgbm90IHdvcmsuCi0JCQkvLyBhc3NlcnRUcnVlKCJGaWxlIGYyIElzIFNldCBUbyBSZWFkT25seS4iICwgZjIuY2FuV3JpdGUoKSk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYyKTsKLQkJCS8vIFdyaXRlIHRvIGEgZmlsZS4KLQkJCWZvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlmMi5zZXRSZWFkT25seSgpOwotCQkJLy8gQXNzZXJ0IGlzIGZsYXdlZCBiZWNhdXNlIGNhbldyaXRlIGRvZXMgbm90IHdvcmsuCi0JCQkvLyBhc3NlcnRUcnVlKCJGaWxlIGYyIElzIE5vdCBTZXQgVG8gUmVhZE9ubHkuIiAsICFmMi5jYW5Xcml0ZSgpKTsKLQkJCXRyeSB7Ci0JCQkJLy8gQXR0ZW1wdCB0byB3cml0ZSB0byBhIGZpbGUgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIHdyaXR0ZW4KLQkJCQkvLyB0by4KLQkJCQkvLyBhbmQgaXMgbm93IHNldCB0byByZWFkIG9ubHkuCi0JCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZjIpOwotCQkJCWZhaWwoIklPRXhjZXB0aW9uIG5vdCB0aHJvd24uIik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0JCQlpZiAob25Vbml4KQotCQkJCXAgPSByLmV4ZWMoImNobW9kICt3ICIgKyBmMi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQllbHNlCi0JCQkJcCA9IHIuZXhlYygiYXR0cmliIC1yIFwiIiArIGYyLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7Ci0JCQlwLndhaXRGb3IoKTsKLQkJCWFzc2VydFRydWUoIkZpbGUgZjIgSXMgU2V0IFRvIFJlYWRPbmx5LiIsIGYyLmNhbldyaXRlKCkpOwotCQkJdHJ5IHsKLQkJCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmMik7Ci0JCQkJZm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJZm9zLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJUZXN0IDI6IFVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gV2hpbGUgQXR0ZW1wdGluZyBUbyBXcml0ZSBUbyBGaWxlLiIKLQkJCQkJCQkJKyBlKTsKLQkJCX0KLQkJCWYyLnNldFJlYWRPbmx5KCk7Ci0JCQlhc3NlcnRUcnVlKCJGaWxlIGYyIERpZCBOb3QgRGVsZXRlIiwgZjIuZGVsZXRlKCkpOwotCQkJLy8gU2ltaWxhcmx5LCB0cnlpbmcgdG8gZGVsZXRlIGEgcmVhZC1vbmx5IGRpcmVjdG9yeSBzaG91bGQgc3VjY2VlZAotCQkJZjIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJkZWx0ZXN0ZGlyIik7Ci0JCQlmMi5ta2RpcigpOwotCQkJZjIuc2V0UmVhZE9ubHkoKTsKLQkJCWFzc2VydFRydWUoIkRpcmVjdG9yeSBmMiBEaWQgTm90IERlbGV0ZSIsIGYyLmRlbGV0ZSgpKTsKLQkJCWFzc2VydFRydWUoIkRpcmVjdG9yeSBmMiBEaWQgTm90IERlbGV0ZSIsICFmMi5leGlzdHMoKSk7CisgICAgICAgICAgICAvLyBBc3NlcnQgaXMgZmxhd2VkIGJlY2F1c2UgY2FuV3JpdGUgZG9lcyBub3Qgd29yay4KKyAgICAgICAgICAgIC8vIGFzc2VydFRydWUoIkZpbGUgZjIgSXMgU2V0IFRvIFJlYWRPbmx5LiIgLCBmMi5jYW5Xcml0ZSgpKTsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZjIpOworICAgICAgICAgICAgLy8gV3JpdGUgdG8gYSBmaWxlLgorICAgICAgICAgICAgZm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGYyLnNldFJlYWRPbmx5KCk7CisgICAgICAgICAgICAvLyBBc3NlcnQgaXMgZmxhd2VkIGJlY2F1c2UgY2FuV3JpdGUgZG9lcyBub3Qgd29yay4KKyAgICAgICAgICAgIC8vIGFzc2VydFRydWUoIkZpbGUgZjIgSXMgTm90IFNldCBUbyBSZWFkT25seS4iICwgIWYyLmNhbldyaXRlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHdyaXRlIHRvIGEgZmlsZSB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gd3JpdHRlbgorICAgICAgICAgICAgICAgIC8vIHRvLgorICAgICAgICAgICAgICAgIC8vIGFuZCBpcyBub3cgc2V0IHRvIHJlYWQgb25seS4KKyAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmMik7CisgICAgICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gbm90IHRocm93bi4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKyAgICAgICAgICAgIGlmIChvblVuaXgpCisgICAgICAgICAgICAgICAgcCA9IHIuZXhlYygiY2htb2QgK3cgIiArIGYyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwID0gci5leGVjKCJhdHRyaWIgLXIgXCIiICsgZjIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsKKyAgICAgICAgICAgIHAud2FpdEZvcigpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBmMiBJcyBTZXQgVG8gUmVhZE9ubHkuIiwgZjIuY2FuV3JpdGUoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYyKTsKKyAgICAgICAgICAgICAgICBmb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QgMjogVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiBXaGlsZSBBdHRlbXB0aW5nIFRvIFdyaXRlIFRvIEZpbGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZjIuc2V0UmVhZE9ubHkoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgZjIgRGlkIE5vdCBEZWxldGUiLCBmMi5kZWxldGUoKSk7CisgICAgICAgICAgICAvLyBTaW1pbGFybHksIHRyeWluZyB0byBkZWxldGUgYSByZWFkLW9ubHkgZGlyZWN0b3J5IHNob3VsZCBzdWNjZWVkCisgICAgICAgICAgICBmMiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgImRlbHRlc3RkaXIiKTsKKyAgICAgICAgICAgIGYyLm1rZGlyKCk7CisgICAgICAgICAgICBmMi5zZXRSZWFkT25seSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlyZWN0b3J5IGYyIERpZCBOb3QgRGVsZXRlIiwgZjIuZGVsZXRlKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlyZWN0b3J5IGYyIERpZCBOb3QgRGVsZXRlIiwgIWYyLmV4aXN0cygpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBEdXJpbmcgVGVzdC4iICsgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZjEgIT0gbnVsbCkKLQkJCQlmMS5kZWxldGUoKTsKLQkJCWlmIChmMiAhPSBudWxsKQotCQkJCWYyLmRlbGV0ZSgpOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBEdXJpbmcgVGVzdC4iICsgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZjEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmMS5kZWxldGUoKTsKKyAgICAgICAgICAgIGlmIChmMiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGYyLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSN0b1N0cmluZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5GaWxlLnRvU3RyaW5nKCkKLQkJU3RyaW5nIGZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIHNsYXNoICsgImlucHV0LnRzdCI7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN0cmluZyByZXR1cm5lZCIsIGYudG9TdHJpbmcoKS5lcXVhbHMoZmlsZU5hbWUpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI3RvU3RyaW5nKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdG9TdHJpbmcoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLkZpbGUudG9TdHJpbmcoKQorICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgc2xhc2ggKyAiaW5wdXQudHN0IjsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZU5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHJldHVybmVkIiwgZi50b1N0cmluZygpLmVxdWFscyhmaWxlTmFtZSkpOwogCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJykgewotCQkJU3RyaW5nIHJlc3VsdCA9IG5ldyBGaWxlKCJjOlxcIikudG9TdHJpbmcoKTsKLQkJCWFzc2VydFRydWUoIlJlbW92ZWQgYmFja3NsYXNoOiAiICsgcmVzdWx0LCByZXN1bHQuZXF1YWxzKCJjOlxcIikpOwotCQl9Ci0JfQorICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBuZXcgRmlsZSgiYzpcXCIpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZW1vdmVkIGJhY2tzbGFzaDogIiArIHJlc3VsdCwgcmVzdWx0LmVxdWFscygiYzpcXCIpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjdG9VUkkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdG9VUkkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGUudG9VUkkoKQotCQl0cnkgewotCQkJLy8gTmVlZCBhIGRpcmVjdG9yeSB0aGF0IGV4aXN0cwotCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjdG9VUkkoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0b1VSSSgpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ0b1VSSSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvVVJJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlLnRvVVJJKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIE5lZWQgYSBkaXJlY3RvcnkgdGhhdCBleGlzdHMKKyAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKIAotCQkJLy8gVGVzdCBmb3IgdG9VUkkgd2hlbiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeS4KLQkJCVN0cmluZyBuZXdVUklQYXRoID0gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCQkJbmV3VVJJUGF0aCA9IG5ld1VSSVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlpZiAoIW5ld1VSSVBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJCW5ld1VSSVBhdGggPSAiLyIgKyBuZXdVUklQYXRoOwotCQkJaWYgKCFuZXdVUklQYXRoLmVuZHNXaXRoKCIvIikpCi0JCQkJbmV3VVJJUGF0aCArPSAnLyc7CisgICAgICAgICAgICAvLyBUZXN0IGZvciB0b1VSSSB3aGVuIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5LgorICAgICAgICAgICAgU3RyaW5nIG5ld1VSSVBhdGggPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBuZXdVUklQYXRoID0gbmV3VVJJUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgICAgIGlmICghbmV3VVJJUGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgbmV3VVJJUGF0aCA9ICIvIiArIG5ld1VSSVBhdGg7CisgICAgICAgICAgICBpZiAoIW5ld1VSSVBhdGguZW5kc1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICBuZXdVUklQYXRoICs9ICcvJzsKIAotCQkJVVJJIHVyaSA9IGRpci50b1VSSSgpOwotCQkJYXNzZXJ0VHJ1ZSgiVGVzdCAxQTogSW5jb3JyZWN0IFVSSSBSZXR1cm5lZC4iLCBuZXcgRmlsZSh1cmkpCi0JCQkJCS5lcXVhbHMoZGlyLmdldEFic29sdXRlRmlsZSgpKSk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDFCOiBJbmNvcnJlY3QgVVJJIFJldHVybmVkLiIsIHVyaS5lcXVhbHMobmV3IFVSSSgKLQkJCQkJImZpbGUiLCBudWxsLCBuZXdVUklQYXRoLCBudWxsLCBudWxsKSkpOworICAgICAgICAgICAgVVJJIHVyaSA9IGRpci50b1VSSSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAxQTogSW5jb3JyZWN0IFVSSSBSZXR1cm5lZC4iLCBuZXcgRmlsZSh1cmkpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZGlyLmdldEFic29sdXRlRmlsZSgpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDFCOiBJbmNvcnJlY3QgVVJJIFJldHVybmVkLiIsIHVyaS5lcXVhbHMobmV3IFVSSSgKKyAgICAgICAgICAgICAgICAgICAgImZpbGUiLCBudWxsLCBuZXdVUklQYXRoLCBudWxsLCBudWxsKSkpOwogCi0JCQkvLyBUZXN0IGZvciB0b1VSSSB3aXRoIGEgZmlsZSBuYW1lIHdpdGggaWxsZWdhbCBjaGFycy4KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGRpciwgInRlJSBcdTIwYWMgc3QudHN0Iik7Ci0JCQluZXdVUklQYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCW5ld1VSSVBhdGggPSBuZXdVUklQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJaWYgKCFuZXdVUklQYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQluZXdVUklQYXRoID0gIi8iICsgbmV3VVJJUGF0aDsKKyAgICAgICAgICAgIC8vIFRlc3QgZm9yIHRvVVJJIHdpdGggYSBmaWxlIG5hbWUgd2l0aCBpbGxlZ2FsIGNoYXJzLgorICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCAidGUlIFx1MjBhYyBzdC50c3QiKTsKKyAgICAgICAgICAgIG5ld1VSSVBhdGggPSBmLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgbmV3VVJJUGF0aCA9IG5ld1VSSVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgICAgICBpZiAoIW5ld1VSSVBhdGguc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgIG5ld1VSSVBhdGggPSAiLyIgKyBuZXdVUklQYXRoOwogCi0JCQl1cmkgPSBmLnRvVVJJKCk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDJBOiBJbmNvcnJlY3QgVVJJIFJldHVybmVkLiIsIG5ldyBGaWxlKHVyaSkKLQkJCQkJLmVxdWFscyhmLmdldEFic29sdXRlRmlsZSgpKSk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDJCOiBJbmNvcnJlY3QgVVJJIFJldHVybmVkLiIsIHVyaS5lcXVhbHMobmV3IFVSSSgKLQkJCQkJImZpbGUiLCBudWxsLCBuZXdVUklQYXRoLCBudWxsLCBudWxsKSkpOworICAgICAgICAgICAgdXJpID0gZi50b1VSSSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAyQTogSW5jb3JyZWN0IFVSSSBSZXR1cm5lZC4iLCBuZXcgRmlsZSh1cmkpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZi5nZXRBYnNvbHV0ZUZpbGUoKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAyQjogSW5jb3JyZWN0IFVSSSBSZXR1cm5lZC4iLCB1cmkuZXF1YWxzKG5ldyBVUkkoCisgICAgICAgICAgICAgICAgICAgICJmaWxlIiwgbnVsbCwgbmV3VVJJUGF0aCwgbnVsbCwgbnVsbCkpKTsKIAotCQkJLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTMyMDcKLQkJCWRpciA9IG5ldyBGaWxlKCIiKTsgLy8gY3VycmVudCBkaXJlY3RvcnkKLQkJCXVyaSA9IGRpci50b1VSSSgpOwotCQkJYXNzZXJ0VHJ1ZSgiVGVzdCBjdXJyZW50IGRpcjogVVJJIGRvZXMgbm90IGVuZCB3aXRoIHNsYXNoLiIsCi0JCQkJCXVyaS50b1N0cmluZygpLmVuZHNXaXRoKCIvIikpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZTEpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgVVJJU3ludGF4RXhjZXB0aW9uOiAiICsgZTEpOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTMyMDcKKyAgICAgICAgICAgIGRpciA9IG5ldyBGaWxlKCIiKTsgLy8gY3VycmVudCBkaXJlY3RvcnkKKyAgICAgICAgICAgIHVyaSA9IGRpci50b1VSSSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBjdXJyZW50IGRpcjogVVJJIGRvZXMgbm90IGVuZCB3aXRoIHNsYXNoLiIsCisgICAgICAgICAgICAgICAgICAgIHVyaS50b1N0cmluZygpLmVuZHNXaXRoKCIvIikpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgVVJJU3ludGF4RXhjZXB0aW9uOiAiICsgZTEpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSN0b1VSTCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF90b1VSTCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZS50b1VSTCgpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSN0b1VSTCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ0b1VSTCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvVVJMKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlLnRvVVJMKCkKIAotCQl0cnkgewotCQkJLy8gTmVlZCBhIGRpcmVjdG9yeSB0aGF0IGV4aXN0cwotCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gTmVlZCBhIGRpcmVjdG9yeSB0aGF0IGV4aXN0cworICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwogCi0JCQkvLyBUZXN0IGZvciB0b1VSTCB3aGVuIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5LgotCQkJU3RyaW5nIG5ld0RpclVSTCA9IGRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCW5ld0RpclVSTCA9IG5ld0RpclVSTC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCWlmIChuZXdEaXJVUkwuc3RhcnRzV2l0aCgiLyIpKQotCQkJCW5ld0RpclVSTCA9ICJmaWxlOiIgKyBuZXdEaXJVUkw7Ci0JCQllbHNlCi0JCQkJbmV3RGlyVVJMID0gImZpbGU6LyIgKyBuZXdEaXJVUkw7Ci0JCQlpZiAoIW5ld0RpclVSTC5lbmRzV2l0aCgiLyIpKQotCQkJCW5ld0RpclVSTCArPSAnLyc7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IDE6IEluY29ycmVjdCBVUkwgUmV0dXJuZWQuIiwgbmV3RGlyVVJMLmVxdWFscyhkaXIKLQkJCQkJLnRvVVJMKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgLy8gVGVzdCBmb3IgdG9VUkwgd2hlbiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIFN0cmluZyBuZXdEaXJVUkwgPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBuZXdEaXJVUkwgPSBuZXdEaXJVUkwucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgICAgICBpZiAobmV3RGlyVVJMLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICBuZXdEaXJVUkwgPSAiZmlsZToiICsgbmV3RGlyVVJMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5ld0RpclVSTCA9ICJmaWxlOi8iICsgbmV3RGlyVVJMOworICAgICAgICAgICAgaWYgKCFuZXdEaXJVUkwuZW5kc1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICBuZXdEaXJVUkwgKz0gJy8nOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCAxOiBJbmNvcnJlY3QgVVJMIFJldHVybmVkLiIsIG5ld0RpclVSTC5lcXVhbHMoZGlyCisgICAgICAgICAgICAgICAgICAgIC50b1VSTCgpLnRvU3RyaW5nKCkpKTsKIAotCQkJLy8gVGVzdCBmb3IgdG9VUkwgd2l0aCBhIGZpbGUuCi0JCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsICJ0ZXN0LnRzdCIpOwotCQkJU3RyaW5nIG5ld1VSTCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQluZXdVUkwgPSBuZXdVUkwucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlpZiAobmV3VVJMLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQluZXdVUkwgPSAiZmlsZToiICsgbmV3VVJMOwotCQkJZWxzZQotCQkJCW5ld1VSTCA9ICJmaWxlOi8iICsgbmV3VVJMOwotCQkJYXNzZXJ0VHJ1ZSgiVGVzdCAyOiBJbmNvcnJlY3QgVVJMIFJldHVybmVkLiIsIG5ld1VSTC5lcXVhbHMoZgotCQkJCQkudG9VUkwoKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAvLyBUZXN0IGZvciB0b1VSTCB3aXRoIGEgZmlsZS4KKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgInRlc3QudHN0Iik7CisgICAgICAgICAgICBTdHJpbmcgbmV3VVJMID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIG5ld1VSTCA9IG5ld1VSTC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgICAgIGlmIChuZXdVUkwuc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgIG5ld1VSTCA9ICJmaWxlOiIgKyBuZXdVUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV3VVJMID0gImZpbGU6LyIgKyBuZXdVUkw7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IDI6IEluY29ycmVjdCBVUkwgUmV0dXJuZWQuIiwgbmV3VVJMLmVxdWFscyhmCisgICAgICAgICAgICAgICAgICAgIC50b1VSTCgpLnRvU3RyaW5nKCkpKTsKIAotCQkJLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTMyMDcKLQkJCWRpciA9IG5ldyBGaWxlKCIiKTsgLy8gY3VycmVudCBkaXJlY3RvcnkKLQkJCW5ld0RpclVSTCA9IGRpci50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCQlhc3NlcnRUcnVlKCJUZXN0IGN1cnJlbnQgZGlyOiBVUkwgZG9lcyBub3QgZW5kIHdpdGggc2xhc2guIiwKLQkJCQkJbmV3RGlyVVJMLmVuZHNXaXRoKCIvIikpOwotCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgKLQkJCQkJIlVuZXhwZWN0ZWQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIER1cmluZyBUZXN0LiIpOwotCQl9CisgICAgICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMzIwNworICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoIiIpOyAvLyBjdXJyZW50IGRpcmVjdG9yeQorICAgICAgICAgICAgbmV3RGlyVVJMID0gZGlyLnRvVVJMKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgY3VycmVudCBkaXI6IFVSTCBkb2VzIG5vdCBlbmQgd2l0aCBzbGFzaC4iLAorICAgICAgICAgICAgICAgICAgICBuZXdEaXJVUkwuZW5kc1dpdGgoIi8iKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gRHVyaW5nIFRlc3QuIik7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlI3RvVVJJKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3RvVVJJMigpIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlI3RvVVJJKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHRvVVJJKCkgbWV0aG9kIHdvcmtzIHdpdGggVVJJcyAiICsKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWQgd2l0aCBudWxsIHBhcmFtZXRlcnMuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9VUkkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvVVJJMigpIHsKIAotCQlGaWxlIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJhL2IvYy8uLi9kL2UvLi9mIik7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgImEvYi9jLy4uL2QvZS8uL2YiKTsKIAotCQlTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCXBhdGggPSBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQlpZiAoIXBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJcGF0aCA9ICIvIiArIHBhdGg7CisgICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICBwYXRoID0gIi8iICsgcGF0aDsKIAotCQl0cnkgewotCQkJVVJJIHVyaTEgPSBuZXcgVVJJKCJmaWxlIiwgbnVsbCwgcGF0aCwgbnVsbCk7Ci0JCQlVUkkgdXJpMiA9IGYudG9VUkkoKTsKLQkJCWFzc2VydEVxdWFscygidXJpcyBub3QgZXF1YWwiLCB1cmkxLCB1cmkyKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUxKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIFVSSVN5bnRheEV4Y2VwdGlvbiwiICsgZTEpOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJJIHVyaTEgPSBuZXcgVVJJKCJmaWxlIiwgbnVsbCwgcGF0aCwgbnVsbCk7CisgICAgICAgICAgICBVUkkgdXJpMiA9IGYudG9VUkkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidXJpcyBub3QgZXF1YWwiLCB1cmkxLCB1cmkyKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIFVSSVN5bnRheEV4Y2VwdGlvbiwiICsgZTEpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZSN0b1VSTCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF90b1VSTDIoKSB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZSN0b1VSTCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ0b1VSTCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKIAotCQlGaWxlIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJhL2IvYy8uLi9kL2UvLi9mIik7CisgICAgcHVibGljIHZvaWQgdGVzdF90b1VSTDIoKSB7CiAKLQkJU3RyaW5nIHBhdGggPSBmLmdldEFic29sdXRlUGF0aCgpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCXBhdGggPSAiLyIgKyBwYXRoOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJhL2IvYy8uLi9kL2UvLi9mIik7CiAKLQkJdHJ5IHsKLQkJCVVSTCB1cmwxID0gbmV3IFVSTCgiZmlsZSIsICIiLCBwYXRoKTsKLQkJCVVSTCB1cmwyID0gZi50b1VSTCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ1cmxzIG5vdCBlcXVhbCIsIHVybDEsIHVybDIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIiArIGUpOwotCQl9Ci0JfQorICAgICAgICBTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgcGF0aCA9ICIvIiArIHBhdGg7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCgiZmlsZSIsICIiLCBwYXRoKTsKKyAgICAgICAgICAgIFVSTCB1cmwyID0gZi50b1VSTCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cmxzIG5vdCBlcXVhbCIsIHVybDEsIHVybDIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIiArIGUpOworICAgICAgICB9CisgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGUjZGVsZXRlT25FeGl0KCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZU9uRXhpdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJkZWxldGVPbkV4aXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZGVsZXRlT25FeGl0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoImRpcjRmaWxldGVzdCIpOwogICAgICAgICBkaXIubWtkaXIoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShkaXIuZXhpc3RzKCkpOwpAQCAtMjI1Nyw4ICsyNjEwLDE1IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEB0ZXN0cyBzZXJpbGl6YXRpb24KKyAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJyZWdyZXNzaW9uIHRlc3QiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9vYmplY3RTdHJlYW1DbGFzc19nZXRGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTI2NzQKICAgICAgICAgT2JqZWN0U3RyZWFtQ2xhc3Mgb2JqZWN0U3RyZWFtQ2xhc3MgPSBPYmplY3RTdHJlYW1DbGFzcwpAQCAtMjI3MCw0NCArMjYzMCw0NCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBvYmplY3RTdHJlYW1GaWVsZC5nZXRUeXBlKCkpOwogICAgIH0KICAgICAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJLyoqIFNldHVwIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ICovCi0JCVN0cmluZyB1c2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQlpZiAodXNlckRpciA9PSBudWxsKQotCQkJdXNlckRpciA9ICJqOlxcamNsLWJ1aWxkZGlyXFx0ZW1wXFxzb3VyY2UiOwotCQlpZiAoIXVzZXJEaXIucmVnaW9uTWF0Y2hlcygodXNlckRpci5sZW5ndGgoKSAtIDEpLCBzbGFzaCwgMCwgMSkpCi0JCQl1c2VyRGlyICs9IHNsYXNoOwotCQl0ZW1wRGlyZWN0b3J5ID0gbmV3IEZpbGUodXNlckRpciArICJ0ZW1wRGlyIgotCQkJCSsgU3RyaW5nLnZhbHVlT2YoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLQkJaWYgKCF0ZW1wRGlyZWN0b3J5Lm1rZGlyKCkpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNldHVwIGZvciBGaWxlVGVzdCBmYWlsZWQuIik7CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIC8qKiBTZXR1cCB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSAqLworICAgICAgICBTdHJpbmcgdXNlckRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgaWYgKHVzZXJEaXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHVzZXJEaXIgPSAiajpcXGpjbC1idWlsZGRpclxcdGVtcFxcc291cmNlIjsKKyAgICAgICAgaWYgKCF1c2VyRGlyLnJlZ2lvbk1hdGNoZXMoKHVzZXJEaXIubGVuZ3RoKCkgLSAxKSwgc2xhc2gsIDAsIDEpKQorICAgICAgICAgICAgdXNlckRpciArPSBzbGFzaDsKKyAgICAgICAgdGVtcERpcmVjdG9yeSA9IG5ldyBGaWxlKHVzZXJEaXIgKyAidGVtcERpciIKKyAgICAgICAgICAgICAgICArIFN0cmluZy52YWx1ZU9mKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgICAgIGlmICghdGVtcERpcmVjdG9yeS5ta2RpcigpKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXR1cCBmb3IgRmlsZVRlc3QgZmFpbGVkLiIpOwogCi0JCS8qKiBTZXR1cCB0aGUgdGVtcG9yYXJ5IGZpbGUgKi8KLQkJdGVtcEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAidGVtcGZpbGUiKTsKLQkJRmlsZU91dHB1dFN0cmVhbSB0ZW1wU3RyZWFtOwotCQl0cnkgewotCQkJdGVtcFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlLmdldFBhdGgoKSwgZmFsc2UpOwotCQkJdGVtcFN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNldHVwIGZvciBGaWxlVGVzdCBmYWlsZWQuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9CisgICAgICAgIC8qKiBTZXR1cCB0aGUgdGVtcG9yYXJ5IGZpbGUgKi8KKyAgICAgICAgdGVtcEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAidGVtcGZpbGUiKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSB0ZW1wU3RyZWFtOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVtcFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlLmdldFBhdGgoKSwgZmFsc2UpOworICAgICAgICAgICAgdGVtcFN0cmVhbS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHVwIGZvciBGaWxlVGVzdCBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHRlbXBGaWxlLmV4aXN0cygpICYmICF0ZW1wRmlsZS5kZWxldGUoKSkKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkZpbGVUZXN0LnRlYXJEb3duKCkgZmFpbGVkLCBjb3VsZCBub3QgZGVsZXRlIGZpbGUhIik7Ci0JCWlmICghdGVtcERpcmVjdG9yeS5kZWxldGUoKSkKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkZpbGVUZXN0LnRlYXJEb3duKCkgZmFpbGVkLCBjb3VsZCBub3QgZGVsZXRlIGRpcmVjdG9yeSEiKTsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGlmICh0ZW1wRmlsZS5leGlzdHMoKSAmJiAhdGVtcEZpbGUuZGVsZXRlKCkpCisgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJGaWxlVGVzdC50ZWFyRG93bigpIGZhaWxlZCwgY291bGQgbm90IGRlbGV0ZSBmaWxlISIpOworICAgICAgICBpZiAoIXRlbXBEaXJlY3RvcnkuZGVsZXRlKCkpCisgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJGaWxlVGVzdC50ZWFyRG93bigpIGZhaWxlZCwgY291bGQgbm90IGRlbGV0ZSBkaXJlY3RvcnkhIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbGVXcml0ZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZVdyaXRlclRlc3QuamF2YQppbmRleCA4NTNkM2ViLi5lYWZkMWI4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZVdyaXRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsZVdyaXRlclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjUsNDYgKzMwLDYyIEBACiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhGaWxlV3JpdGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGaWxlV3JpdGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlGaWxlV3JpdGVyIGZ3OworICAgIEZpbGVXcml0ZXIgZnc7CiAKLQlGaWxlSW5wdXRTdHJlYW0gZmlzOworICAgIEZpbGVJbnB1dFN0cmVhbSBmaXM7CiAKLQlCdWZmZXJlZFdyaXRlciBidzsKKyAgICBCdWZmZXJlZFdyaXRlciBidzsKIAotCUZpbGUgZjsKKyAgICBGaWxlIGY7CiAKLQlGaWxlT3V0cHV0U3RyZWFtIGZvczsKKyAgICBGaWxlT3V0cHV0U3RyZWFtIGZvczsKIAotCUJ1ZmZlcmVkUmVhZGVyIGJyOworICAgIEJ1ZmZlcmVkUmVhZGVyIGJyOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZVdyaXRlciNGaWxlV3JpdGVyKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVdyaXRlcihqYXZhLmlvLkZpbGUpCi0JCXRyeSB7Ci0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmLmdldFBhdGgoKSk7Ci0JCQlmb3Mud3JpdGUoIlRlc3QgU3RyaW5nIi5nZXRCeXRlcygpKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZikpOwotCQkJYncud3JpdGUoIiBBZnRlciB0ZXN0IHN0cmluZyIsIDAsIDE4KTsKLQkJCWJ3LmNsb3NlKCk7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmLmdldFBhdGgoKSkpOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwMF07Ci0JCQlpbnQgciA9IGJyLnJlYWQoYnVmKTsKLQkJCWJyLmNsb3NlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB3cml0ZSBjb3JyZWN0IGNoYXJzIiwgIiBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQotCQkJCQkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVXcml0ZXIjRmlsZVdyaXRlcihqYXZhLmlvLkZpbGUpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkZpbGVXcml0ZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVdyaXRlcihqYXZhLmlvLkZpbGUpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmLmdldFBhdGgoKSk7CisgICAgICAgICAgICBmb3Mud3JpdGUoIlRlc3QgU3RyaW5nIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZikpOworICAgICAgICAgICAgYncud3JpdGUoIiBBZnRlciB0ZXN0IHN0cmluZyIsIDAsIDE4KTsKKyAgICAgICAgICAgIGJ3LmNsb3NlKCk7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmLmdldFBhdGgoKSkpOworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwMF07CisgICAgICAgICAgICBpbnQgciA9IGJyLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB3cml0ZSBjb3JyZWN0IGNoYXJzIiwgIiBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZVdyaXRlciNGaWxlV3JpdGVyKGphdmEuaW8uRmlsZSwgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBGaWxlV3JpdGVyKGphdmEuaW8uRmlsZSwgYm9vbGVhbikgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiRmlsZVdyaXRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGVaKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVXcml0ZXIoamF2YS5pby5GaWxlKQogICAgICAgICAvL2FwcGVuZCA9IHRydWUKQEAgLTEwNiwxMTcgKzEyNywxMzkgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWxlV3JpdGVyI0ZpbGVXcml0ZXIoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZURlc2NyaXB0b3IoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVXcml0ZXIoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQkJdHJ5IHsKLQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYuZ2V0UGF0aCgpKTsKLQkJCWZvcy53cml0ZSgiVGVzdCBTdHJpbmciLmdldEJ5dGVzKCkpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYuZ2V0UGF0aCgpKTsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpcy5nZXRGRCgpKSk7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwXTsKLQkJCWludCByID0gYnIucmVhZChidWYpOwotCQkJYnIuY2xvc2UoKTsKLQkJCWZpcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHdyaXRlIGNvcnJlY3QgY2hhcnM6ICIKLQkJCQkJKyBuZXcgU3RyaW5nKGJ1ZiwgMCwgciksIG5ldyBTdHJpbmcoYnVmLCAwLCByKQotCQkJCQkuZXF1YWxzKCJUZXN0IFN0cmluZyIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdCAiICsgZS50b1N0cmluZygpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWxlV3JpdGVyI0ZpbGVXcml0ZXIoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsZVdyaXRlcihqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlV3JpdGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZURlc2NyaXB0b3IuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZURlc2NyaXB0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVXcml0ZXIoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGZvcy53cml0ZSgiVGVzdCBTdHJpbmciLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpcy5nZXRGRCgpKSk7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwXTsKKyAgICAgICAgICAgIGludCByID0gYnIucmVhZChidWYpOworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHdyaXRlIGNvcnJlY3QgY2hhcnM6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBuZXcgU3RyaW5nKGJ1ZiwgMCwgciksIG5ldyBTdHJpbmcoYnVmLCAwLCByKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKCJUZXN0IFN0cmluZyIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdCAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVXcml0ZXIjRmlsZVdyaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVdyaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZi5nZXRQYXRoKCkpOwotCQkJZm9zLndyaXRlKCJUZXN0IFN0cmluZyIuZ2V0Qnl0ZXMoKSk7Ci0JCQlmb3MuY2xvc2UoKTsKLQkJCWJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGYuZ2V0UGF0aCgpKSk7Ci0JCQlidy53cml0ZSgiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgMCwgMTgpOwotCQkJYncuY2xvc2UoKTsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGYuZ2V0UGF0aCgpKSk7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwXTsKLQkJCWludCByID0gYnIucmVhZChidWYpOwotCQkJYnIuY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHdyaXRlIGNvcnJlY3QgY2hhcnMiLCAiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgbmV3IFN0cmluZyhidWYsIDAsIHIpCi0JCQkJCSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3QgIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsZVdyaXRlciNGaWxlV3JpdGVyKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkZpbGVXcml0ZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkZpbGVXcml0ZXIoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGZvcy53cml0ZSgiVGVzdCBTdHJpbmciLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmLmdldFBhdGgoKSkpOworICAgICAgICAgICAgYncud3JpdGUoIiBBZnRlciB0ZXN0IHN0cmluZyIsIDAsIDE4KTsKKyAgICAgICAgICAgIGJ3LmNsb3NlKCk7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmLmdldFBhdGgoKSkpOworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwMF07CisgICAgICAgICAgICBpbnQgciA9IGJyLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB3cml0ZSBjb3JyZWN0IGNoYXJzIiwgIiBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsZVdyaXRlciNGaWxlV3JpdGVyKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nWigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZVdyaXRlcihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbGVXcml0ZXIjRmlsZVdyaXRlcihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWxlV3JpdGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdaKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5GaWxlV3JpdGVyKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCiAKLQkJdHJ5IHsKLQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYuZ2V0UGF0aCgpKTsKLQkJCWZvcy53cml0ZSgiVGVzdCBTdHJpbmciLmdldEJ5dGVzKCkpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmLmdldFBhdGgoKSwgdHJ1ZSkpOwotCQkJYncud3JpdGUoIiBBZnRlciB0ZXN0IHN0cmluZyIsIDAsIDE4KTsKLQkJCWJ3LmNsb3NlKCk7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmLmdldFBhdGgoKSkpOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwMF07Ci0JCQlpbnQgciA9IGJyLnJlYWQoYnVmKTsKLQkJCWJyLmNsb3NlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBhcHBlbmQgdG8gZmlsZSIsICJUZXN0IFN0cmluZyBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQotCQkJCQkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgZm9zLndyaXRlKCJUZXN0IFN0cmluZyIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGYuZ2V0UGF0aCgpLCB0cnVlKSk7CisgICAgICAgICAgICBidy53cml0ZSgiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgMCwgMTgpOworICAgICAgICAgICAgYncuY2xvc2UoKTsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGYuZ2V0UGF0aCgpKSk7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwXTsKKyAgICAgICAgICAgIGludCByID0gYnIucmVhZChidWYpOworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGFwcGVuZCB0byBmaWxlIiwgIlRlc3QgU3RyaW5nIEFmdGVyIHRlc3Qgc3RyaW5nIiwgbmV3IFN0cmluZyhidWYsIDAsIHIpCisgICAgICAgICAgICAgICAgICAgICk7CiAKLQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYuZ2V0UGF0aCgpKTsKLQkJCWZvcy53cml0ZSgiVGVzdCBTdHJpbmciLmdldEJ5dGVzKCkpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmLmdldFBhdGgoKSwgZmFsc2UpKTsKLQkJCWJ3LndyaXRlKCIgQWZ0ZXIgdGVzdCBzdHJpbmciLCAwLCAxOCk7Ci0JCQlidy5jbG9zZSgpOwotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZi5nZXRQYXRoKCkpKTsKLQkJCWJ1ZiA9IG5ldyBjaGFyWzEwMF07Ci0JCQlyID0gYnIucmVhZChidWYpOwotCQkJYnIuY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIG92ZXJ3cml0ZSBmaWxlIiwgIiBBZnRlciB0ZXN0IHN0cmluZyIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQotCQkJCQkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9CisgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmLmdldFBhdGgoKSk7CisgICAgICAgICAgICBmb3Mud3JpdGUoIlRlc3QgU3RyaW5nIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZi5nZXRQYXRoKCksIGZhbHNlKSk7CisgICAgICAgICAgICBidy53cml0ZSgiIEFmdGVyIHRlc3Qgc3RyaW5nIiwgMCwgMTgpOworICAgICAgICAgICAgYncuY2xvc2UoKTsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGYuZ2V0UGF0aCgpKSk7CisgICAgICAgICAgICBidWYgPSBuZXcgY2hhclsxMDBdOworICAgICAgICAgICAgciA9IGJyLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBvdmVyd3JpdGUgZmlsZSIsICIgQWZ0ZXIgdGVzdCBzdHJpbmciLCBuZXcgU3RyaW5nKGJ1ZiwgMCwgcikKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdCAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewogCi0JCWYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLCAid3JpdGVyLnRzdCIpOworICAgICAgICBmID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSwgIndyaXRlci50c3QiKTsKIAotCQlpZiAoZi5leGlzdHMoKSkKLQkJCWlmICghZi5kZWxldGUoKSkgewotCQkJCWZhaWwoIlVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlIik7Ci0JCQl9Ci0JfQorICAgICAgICBpZiAoZi5leGlzdHMoKSkKKyAgICAgICAgICAgIGlmICghZi5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlIik7CisgICAgICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlidy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlmaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlmLmRlbGV0ZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ3LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGYuZGVsZXRlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbHRlcklucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbHRlcklucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDkxNDdmZDkuLjEwY2Q2YjEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWx0ZXJJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsdGVySW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDE4MyArMTcsMjUzIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1BsYXRmb3JtRmlsZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhGaWx0ZXJJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsdGVySW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCXN0YXRpYyBjbGFzcyBNeUZpbHRlcklucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSB7Ci0JCXB1YmxpYyBNeUZpbHRlcklucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHsKLQkJCXN1cGVyKGlzKTsKLQkJfQotCX0KKyAgICBzdGF0aWMgY2xhc3MgTXlGaWx0ZXJJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0geworICAgICAgICBwdWJsaWMgTXlGaWx0ZXJJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB7CisgICAgICAgICAgICBzdXBlcihpcyk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKIAotCXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBpczsKKyAgICBwcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaXM7CiAKLQlieXRlW10gaWJ1ZiA9IG5ldyBieXRlWzQwOTZdOworICAgIGJ5dGVbXSBpYnVmID0gbmV3IGJ5dGVbNDA5Nl07CiAKLQlwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI2F2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9hdmFpbGFibGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKQotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMiLCBpcwotCQkJCQkuYXZhaWxhYmxlKCkgPT0gZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGF2YWlsYWJsZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNhdmFpbGFibGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJhdmFpbGFibGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfYXZhaWxhYmxlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBudW1iZXIgb2YgYXZhaWxhYmxlIGJ5dGVzIiwgaXMKKyAgICAgICAgICAgICAgICAgICAgLmF2YWlsYWJsZSgpID09IGZpbGVTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBhdmFpbGFibGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5jbG9zZSgpCi0JCXRyeSB7Ci0JCQlpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBhdHRlbXB0aW5nIHRvIGNsb3NlIHN0cmVhbSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNjbG9zZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtLmNsb3NlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGF0dGVtcHRpbmcgdG8gY2xvc2Ugc3RyZWFtIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlpcy5yZWFkKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkFibGUgdG8gcmVhZCBmcm9tIGNsb3NlZCBzdHJlYW0iKTsKLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcy5yZWFkKCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkFibGUgdG8gcmVhZCBmcm9tIGNsb3NlZCBzdHJlYW0iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtLm1hcmsoaW50KQotCQlhc3NlcnRUcnVlKCJNYXJrIG5vdCBzdXBwb3J0ZWQgYnkgcGFyZW50IElucHV0U3RyZWFtIiwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI21hcmsoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIkR1bW15IHRlc3QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWFyayIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5tYXJrKGludCkKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFyayBub3Qgc3VwcG9ydGVkIGJ5IHBhcmVudCBJbnB1dFN0cmVhbSIsIHRydWUpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkKLQkJYXNzZXJ0VHJ1ZSgibWFya1N1cHBvcnRlZCByZXR1cm5lZCB0cnVlIiwgIWlzLm1hcmtTdXBwb3J0ZWQoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtYXJrU3VwcG9ydGVkKCkgbWV0aG9kLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hcmtTdXBwb3J0ZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWFya1N1cHBvcnRlZCByZXR1cm5lZCB0cnVlIiwgIWlzLm1hcmtTdXBwb3J0ZWQoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0ucmVhZCgpCi0JCXRyeSB7Ci0JCQlpbnQgYyA9IGlzLnJlYWQoKTsKLQkJCWFzc2VydFRydWUoInJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXIiLCBjID09IGZpbGVTdHJpbmcKLQkJCQkJLmNoYXJBdCgwKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0ucmVhZCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgYyA9IGlzLnJlYWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXIiLCBjID09IGZpbGVTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLmNoYXJBdCgwKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSkKLQkJYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVsxMDBdOwotCQl0cnkgewotCQkJaXMucmVhZChidWYxKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgZGF0YSIsIG5ldyBTdHJpbmcoYnVmMSwgMCwKLQkJCQkJYnVmMS5sZW5ndGgpLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygwLCAxMDApKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10pCisgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLnJlYWQoYnVmMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGRhdGEiLCBuZXcgU3RyaW5nKGJ1ZjEsIDAsCisgICAgICAgICAgICAgICAgICAgIGJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgMTAwKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sIGludCwgaW50KQotCQlieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwMF07Ci0JCXRyeSB7Ci0JCQlpcy5za2lwKDMwMDApOwotCQkJaXMubWFyaygxMDAwKTsKLQkJCWlzLnJlYWQoYnVmMSwgMCwgYnVmMS5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBkYXRhIiwgbmV3IFN0cmluZyhidWYxLCAwLAotCQkJCQlidWYxLmxlbmd0aCkuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDMwMDAsIDMxMDApKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtLnJlYWQoYnl0ZSBbXSwgaW50LCBpbnQpCisgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLnNraXAoMzAwMCk7CisgICAgICAgICAgICBpcy5tYXJrKDEwMDApOworICAgICAgICAgICAgaXMucmVhZChidWYxLCAwLCBidWYxLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGRhdGEiLCBuZXcgU3RyaW5nKGJ1ZjEsIDAsCisgICAgICAgICAgICAgICAgICAgIGJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMzAwMCwgMzEwMCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtLnJlc2V0KCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNyZXNldCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRHVtbXkgdGVzdC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXNldCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtLnJlc2V0KCkKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlzLnJlc2V0KCk7CiAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9za2lwSigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbS5za2lwKGxvbmcpCi0JCWJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbMTBdOwotCQl0cnkgewotCQkJaXMuc2tpcCgxMDAwKTsKLQkJCWlzLnJlYWQoYnVmMSwgMCwgYnVmMS5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNraXAgdG8gY29ycmVjdCBwb3NpdGlvbiIsIG5ldyBTdHJpbmcoYnVmMSwKLQkJCQkJMCwgYnVmMS5sZW5ndGgpLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygxMDAwLCAxMDEwKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBza2lwIHRlc3QiKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNza2lwKGxvbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNraXAiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcEooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0uc2tpcChsb25nKQorICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLnNraXAoMTAwMCk7CisgICAgICAgICAgICBpcy5yZWFkKGJ1ZjEsIDAsIGJ1ZjEubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBza2lwIHRvIGNvcnJlY3QgcG9zaXRpb24iLCBuZXcgU3RyaW5nKGJ1ZjEsCisgICAgICAgICAgICAgICAgICAgIDAsIGJ1ZjEubGVuZ3RoKS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMTAwMCwgMTAxMCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2tpcCB0ZXN0Iik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJdHJ5IHsKLQkJCWZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCQkJU3RyaW5nIHNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQkJCWlmIChmaWxlTmFtZS5jaGFyQXQoZmlsZU5hbWUubGVuZ3RoKCkgLSAxKSA9PSBzZXBhcmF0b3IuY2hhckF0KDApKQotCQkJCWZpbGVOYW1lID0gU3VwcG9ydF9QbGF0Zm9ybUZpbGUuZ2V0TmV3UGxhdGZvcm1GaWxlKGZpbGVOYW1lLAotCQkJCQkJImlucHV0LnRzdCIpOwotCQkJZWxzZQotCQkJCWZpbGVOYW1lID0gU3VwcG9ydF9QbGF0Zm9ybUZpbGUuZ2V0TmV3UGxhdGZvcm1GaWxlKGZpbGVOYW1lCi0JCQkJCQkrIHNlcGFyYXRvciwgImlucHV0LnRzdCIpOwotCQkJamF2YS5pby5PdXRwdXRTdHJlYW0gZm9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlmb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJaXMgPSBuZXcgTXlGaWx0ZXJJbnB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgc2V0dXAiKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgICAgIFN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7CisgICAgICAgICAgICBpZiAoZmlsZU5hbWUuY2hhckF0KGZpbGVOYW1lLmxlbmd0aCgpIC0gMSkgPT0gc2VwYXJhdG9yLmNoYXJBdCgwKSkKKyAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IFN1cHBvcnRfUGxhdGZvcm1GaWxlLmdldE5ld1BsYXRmb3JtRmlsZShmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dC50c3QiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IFN1cHBvcnRfUGxhdGZvcm1GaWxlLmdldE5ld1BsYXRmb3JtRmlsZShmaWxlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXBhcmF0b3IsICJpbnB1dC50c3QiKTsKKyAgICAgICAgICAgIGphdmEuaW8uT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICAgICAgZm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGlzID0gbmV3IE15RmlsdGVySW5wdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIHNldHVwIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIEJJUyB0ZWFyRG93biIpOwotCQl9Ci0JCW5ldyBqYXZhLmlvLkZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgQklTIHRlYXJEb3duIik7CisgICAgICAgIH0KKyAgICAgICAgbmV3IGphdmEuaW8uRmlsZShmaWxlTmFtZSkuZGVsZXRlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbHRlck91dHB1dFN0cmVhbVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggZjNjMjM1MS4uNzYzNzcwYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ZpbHRlck91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vRmlsdGVyT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0xNywxNTEgKzE3LDIwMCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmlsdGVyT3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlwcml2YXRlIGphdmEuaW8uT3V0cHV0U3RyZWFtIG9zOworICAgIHByaXZhdGUgamF2YS5pby5PdXRwdXRTdHJlYW0gb3M7CiAKLQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3M7CisgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zOwogCi0JamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXM7CisgICAgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXM7CiAKLQlieXRlW10gaWJ1ZiA9IG5ldyBieXRlWzQwOTZdOworICAgIGJ5dGVbXSBpYnVmID0gbmV3IGJ5dGVbNDA5Nl07CiAKLQlwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJJbnB1dFN0cmVhbVxuVGVzdF9GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVcblRlc3RfamF2YV9pb19GaWxlRGVzY3JpcHRvclxuVGVzdF9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbGVOb3RGb3VuZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJJbnB1dFN0cmVhbVxuVGVzdF9GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSNGaWx0ZXJPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCQl0cnkgewotCQkJYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlvcyA9IG5ldyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbShib3MpOwotCQkJb3Mud3JpdGUoJ3QnKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDb25zdHJ1Y3RvciB0ZXN0IGZhaWxlZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtI0ZpbHRlck91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRmlsdGVyT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJGaWx0ZXJPdXRwdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvcyA9IG5ldyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbShib3MpOworICAgICAgICAgICAgb3Mud3JpdGUoJ3QnKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDb25zdHJ1Y3RvciB0ZXN0IGZhaWxlZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtLmNsb3NlKCkKLQkJdHJ5IHsKLQkJCWJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJb3MgPSBuZXcgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0oYm9zKTsKLQkJCW9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgNTAwKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJ5dGVzIG5vdCB3cml0dGVuIGFmdGVyIGZsdXNoIiwgNTAwLCBib3Muc2l6ZSgpKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xvc2UgdGVzdCBmYWlsZWQgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSNjbG9zZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbS5jbG9zZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9zID0gbmV3IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtKGJvcyk7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIDUwMCk7CisgICAgICAgICAgICBvcy5mbHVzaCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJCeXRlcyBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsIDUwMCwgYm9zLnNpemUoKSk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsb3NlIHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSNmbHVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9mbHVzaCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0uZmx1c2goKQotCQl0cnkgewotCQkJYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlvcyA9IG5ldyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbShib3MpOwotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCA1MDApOwotCQkJb3MuZmx1c2goKTsKLQkJCWFzc2VydEVxdWFscygiQnl0ZXMgbm90IHdyaXR0ZW4gYWZ0ZXIgZmx1c2giLCA1MDAsIGJvcy5zaXplKCkpOwotCQkJb3MuY2xvc2UoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGbHVzaCB0ZXN0IGZhaWxlZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtI2ZsdXNoKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZmx1c2giLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZsdXNoKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbS5mbHVzaCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9zID0gbmV3IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtKGJvcyk7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIDUwMCk7CisgICAgICAgICAgICBvcy5mbHVzaCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJCeXRlcyBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsIDUwMCwgYm9zLnNpemUoKSk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZsdXNoIHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSN3cml0ZShieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZSRCKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbS53cml0ZShieXRlIFtdKQotCQl0cnkgewotCQkJYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlvcyA9IG5ldyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbShib3MpOwotCQkJb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpKTsKLQkJCWJpcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlhc3NlcnRUcnVlKCJCeXRlcyBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsCi0JCQkJCWJpcy5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKLQkJCWJ5dGVbXSB3Ynl0ZXMgPSBuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXTsKLQkJCWJpcy5yZWFkKHdieXRlcywgMCwgZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZXMgd3JpdHRlbiIsIGZpbGVTdHJpbmcuZXF1YWxzKG5ldyBTdHJpbmcoCi0JCQkJCXdieXRlcywgMCwgd2J5dGVzLmxlbmd0aCkpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJXcml0ZSB0ZXN0IGZhaWxlZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9zID0gbmV3IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtKGJvcyk7CisgICAgICAgICAgICBvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgYmlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgb3MuZmx1c2goKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkJ5dGVzIG5vdCB3cml0dGVuIGFmdGVyIGZsdXNoIiwKKyAgICAgICAgICAgICAgICAgICAgYmlzLmF2YWlsYWJsZSgpID09IGZpbGVTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICAgICAgYnl0ZVtdIHdieXRlcyA9IG5ldyBieXRlW2ZpbGVTdHJpbmcubGVuZ3RoKCldOworICAgICAgICAgICAgYmlzLnJlYWQod2J5dGVzLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBieXRlcyB3cml0dGVuIiwgZmlsZVN0cmluZy5lcXVhbHMobmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgd2J5dGVzLCAwLCB3Ynl0ZXMubGVuZ3RoKSkpOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIldyaXRlIHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQklJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbS53cml0ZShieXRlIFtdLCBpbnQsCi0JCS8vIGludCkKLQkJdHJ5IHsKLQkJCWJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJb3MgPSBuZXcgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0oYm9zKTsKLQkJCW9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCQliaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShib3MudG9CeXRlQXJyYXkoKSk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJYXNzZXJ0VHJ1ZSgiQnl0ZXMgbm90IHdyaXR0ZW4gYWZ0ZXIgZmx1c2giLAotCQkJCQliaXMuYXZhaWxhYmxlKCkgPT0gZmlsZVN0cmluZy5sZW5ndGgoKSk7Ci0JCQlieXRlW10gd2J5dGVzID0gbmV3IGJ5dGVbZmlsZVN0cmluZy5sZW5ndGgoKV07Ci0JCQliaXMucmVhZCh3Ynl0ZXMsIDAsIGZpbGVTdHJpbmcubGVuZ3RoKCkpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGVzIHdyaXR0ZW4iLCBmaWxlU3RyaW5nLmVxdWFscyhuZXcgU3RyaW5nKAotCQkJCQl3Ynl0ZXMsIDAsIHdieXRlcy5sZW5ndGgpKSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiV3JpdGUgdGVzdCBmYWlsZWQgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9zID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvcyA9IG5ldyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbShib3MpOworICAgICAgICAgICAgb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGJpcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIG9zLmZsdXNoKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJCeXRlcyBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsCisgICAgICAgICAgICAgICAgICAgIGJpcy5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGJ5dGVbXSB3Ynl0ZXMgPSBuZXcgYnl0ZVtmaWxlU3RyaW5nLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIGJpcy5yZWFkKHdieXRlcywgMCwgZmlsZVN0cmluZy5sZW5ndGgoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZXMgd3JpdHRlbiIsIGZpbGVTdHJpbmcuZXF1YWxzKG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHdieXRlcywgMCwgd2J5dGVzLmxlbmd0aCkpKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJXcml0ZSB0ZXN0IGZhaWxlZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0jd3JpdGUoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbS53cml0ZShpbnQpCi0JCXRyeSB7Ci0JCQlib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCW9zID0gbmV3IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtKGJvcyk7Ci0JCQlvcy53cml0ZSgndCcpOwotCQkJYmlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOwotCQkJb3MuZmx1c2goKTsKLQkJCWFzc2VydEVxdWFscygiQnl0ZSBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsIDEsIGJpcy5hdmFpbGFibGUoKSk7Ci0JCQlieXRlW10gd2J5dGVzID0gbmV3IGJ5dGVbMV07Ci0JCQliaXMucmVhZCh3Ynl0ZXMsIDAsIDEpOwotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSB3cml0dGVuIiwgJ3QnLCB3Ynl0ZXNbMF0pOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIldyaXRlIHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0jd3JpdGUoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbS53cml0ZShpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9zID0gbmV3IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtKGJvcyk7CisgICAgICAgICAgICBvcy53cml0ZSgndCcpOworICAgICAgICAgICAgYmlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgb3MuZmx1c2goKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQnl0ZSBub3Qgd3JpdHRlbiBhZnRlciBmbHVzaCIsIDEsIGJpcy5hdmFpbGFibGUoKSk7CisgICAgICAgICAgICBieXRlW10gd2J5dGVzID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBiaXMucmVhZCh3Ynl0ZXMsIDAsIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSB3cml0dGVuIiwgJ3QnLCB3Ynl0ZXNbMF0pOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIldyaXRlIHRlc3QgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQkJdHJ5IHsKLQkJCWlmIChib3MgIT0gbnVsbCkKLQkJCQlib3MuY2xvc2UoKTsKLQkJCWlmIChiaXMgIT0gbnVsbCkKLQkJCQliaXMuY2xvc2UoKTsKLQkJCWlmIChvcyAhPSBudWxsKQotCQkJCW9zLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoYm9zICE9IG51bGwpCisgICAgICAgICAgICAgICAgYm9zLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoYmlzICE9IG51bGwpCisgICAgICAgICAgICAgICAgYmlzLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0lPRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0lPRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDEzNjUzYTguLjRhOTJhNTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9JT0V4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vSU9FeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDUxICsxNyw3MSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSU9FeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIElPRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5JT0V4Y2VwdGlvbiNJT0V4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uSU9FeGNlcHRpb24oKQotCQl0cnkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgSU9FeGNlcHRpb24gdGVzdCIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uSU9FeGNlcHRpb24jSU9FeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJJT0V4Y2VwdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLklPRXhjZXB0aW9uKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIElPRXhjZXB0aW9uIHRlc3QiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uSU9FeGNlcHRpb24jSU9FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLklPRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNvbWUgZXJyb3IgbWVzc2FnZSIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIElPRXhjZXB0aW9uIHRlc3QiICsgZS50b1N0cmluZygpKTsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhjZXB0aW9uIik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLklPRXhjZXB0aW9uI0lPRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIklPRXhjZXB0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5JT0V4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTb21lIGVycm9yIG1lc3NhZ2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBJT0V4Y2VwdGlvbiB0ZXN0IiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiIpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0lucHV0U3RyZWFtUmVhZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0lucHV0U3RyZWFtUmVhZGVyVGVzdC5qYXZhCmluZGV4IGNjYTI1ZTkuLmRjMGQ1ZDcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDEwIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtMzcsMTMwICs0MSwxNTIgQEAKIC8qKgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoSW5wdXRTdHJlYW1SZWFkZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIElucHV0U3RyZWFtUmVhZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNvdXJjZSA9ICJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIHdpdGggVW5pY29kZSBjaGFyYWN0ZXIuIFx1NGUyZFx1NTZmZCBpcyBDaGluYSdzIG5hbWUgaW4gQ2hpbmVzZSI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc291cmNlID0gIlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2Ugd2l0aCBVbmljb2RlIGNoYXJhY3Rlci4gXHU0ZTJkXHU1NmZkIGlzIENoaW5hJ3MgbmFtZSBpbiBDaGluZXNlIjsKIAotCXByaXZhdGUgSW5wdXRTdHJlYW0gaW47CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbjsKIAotCXByaXZhdGUgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyOworICAgIHByaXZhdGUgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyOwogCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbVJlYWRlciBpczsKKyAgICBwcml2YXRlIElucHV0U3RyZWFtUmVhZGVyIGlzOwogCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBmaXM7CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBmaXM7CiAKLQlwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuIjsKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGVTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuIjsKIAotCXN0YXRpYyBjbGFzcyBMaW1pdGVkQnl0ZUFycmF5SW5wdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlJbnB1dFN0cmVhbSB7CisgICAgc3RhdGljIGNsYXNzIExpbWl0ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheUlucHV0U3RyZWFtIHsKICAgICAgICAgCi0JCS8vIEEgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdGhhdCBvbmx5IHJldHVybnMgYSBzaW5nbGUgYnl0ZSBwZXIgcmVhZAotCQlieXRlW10gYnl0ZXM7CisgICAgICAgIC8vIEEgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdGhhdCBvbmx5IHJldHVybnMgYSBzaW5nbGUgYnl0ZSBwZXIgcmVhZAorICAgICAgICBieXRlW10gYnl0ZXM7CiAKLQkJaW50IGNvdW50OworICAgICAgICBpbnQgY291bnQ7CiAKLQkJcHVibGljIExpbWl0ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnQgdHlwZSkgewotCQkJc3VwZXIobmV3IGJ5dGVbMF0pOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIDA6Ci0JCQkJYnl0ZXMgPSBuZXcgYnl0ZVtdIHsgMHg2MSwgMHg3MiB9OwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCWJ5dGVzID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweGZmLCAoYnl0ZSkgMHhmZSwgMHg2MSwgMHg3MiB9OwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWJ5dGVzID0gbmV3IGJ5dGVbXSB7ICdcdTAwMWInLCAnJCcsICdCJywgJzYnLCAnZScsICdCJywgJ2gnLAotCQkJCQkJJ1x1MDAxYicsICcoJywgJ0InIH07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb3VudCA9IGJ5dGVzLmxlbmd0aDsKLQkJfQorICAgICAgICBwdWJsaWMgTGltaXRlZEJ5dGVBcnJheUlucHV0U3RyZWFtKGludCB0eXBlKSB7CisgICAgICAgICAgICBzdXBlcihuZXcgYnl0ZVswXSk7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBieXRlcyA9IG5ldyBieXRlW10geyAweDYxLCAweDcyIH07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4ZmYsIChieXRlKSAweGZlLCAweDYxLCAweDcyIH07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVtdIHsgJ1x1MDAxYicsICckJywgJ0InLCAnNicsICdlJywgJ0InLCAnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMDFiJywgJygnLCAnQicgfTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvdW50ID0gYnl0ZXMubGVuZ3RoOworICAgICAgICB9CiAKLQkJcHVibGljIGludCByZWFkKCkgewotCQkJaWYgKGNvdW50ID09IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJY291bnQtLTsKLQkJCXJldHVybiBieXRlc1tieXRlcy5sZW5ndGggLSBjb3VudF07Ci0JCX0KKyAgICAgICAgcHVibGljIGludCByZWFkKCkgeworICAgICAgICAgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgIHJldHVybiBieXRlc1tieXRlcy5sZW5ndGggLSBjb3VudF07CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJaWYgKGNvdW50ID09IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJCXJldHVybiAwOwotCQkJYnVmZmVyW29mZnNldF0gPSBieXRlc1tieXRlcy5sZW5ndGggLSBjb3VudF07Ci0JCQljb3VudC0tOwotCQkJcmV0dXJuIDE7Ci0JCX0KKyAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXRdID0gYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gY291bnRdOworICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAKLQkJcHVibGljIGludCBhdmFpbGFibGUoKSB7Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOworICAgIC8qCisgICAgICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKIAotCQl0cnkgewotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc291cmNlLmdldEJ5dGVzKCJVVEYtOCIpKTsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgIlVURi04Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzb3VyY2UuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAiVVRGLTgiKTsKIAotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJvcyk7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbZmlsZVN0cmluZy5sZW5ndGgoKV07Ci0JCQlmaWxlU3RyaW5nLmdldENoYXJzKDAsIGZpbGVTdHJpbmcubGVuZ3RoKCksIGJ1ZiwgMCk7Ci0JCQlvc3cud3JpdGUoYnVmKTsKLQkJCW9zdy5jbG9zZSgpOwotCQkJZmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKTsKLQkJCWlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNldFVwIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihib3MpOworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2ZpbGVTdHJpbmcubGVuZ3RoKCldOworICAgICAgICAgICAgZmlsZVN0cmluZy5nZXRDaGFycygwLCBmaWxlU3RyaW5nLmxlbmd0aCgpLCBidWYsIDApOworICAgICAgICAgICAgb3N3LndyaXRlKGJ1Zik7CisgICAgICAgICAgICBvc3cuY2xvc2UoKTsKKyAgICAgICAgICAgIGZpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICBpcyA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBzZXRVcCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpbi5jbG9zZSgpOwotCQkJaXMuY2xvc2UoKTsKLQkJCWZpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAvKgorICAgICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlzdXBlci50ZWFyRG93bigpOwotCX0KKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIucmVhZHkoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZWFkZXIucmVhZHkoKTsKLQkJCWZhaWwoIlNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmVhZGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgcmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoJ1QnLCAoY2hhcikgcmVhZGVyLnJlYWQoKSk7Ci0JCWFzc2VydEVxdWFscygnaCcsIChjaGFyKSByZWFkZXIucmVhZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCdpJywgKGNoYXIpIHJlYWRlci5yZWFkKCkpOwotCQlhc3NlcnRFcXVhbHMoJ3MnLCAoY2hhcikgcmVhZGVyLnJlYWQoKSk7Ci0JCWFzc2VydEVxdWFscygnICcsIChjaGFyKSByZWFkZXIucmVhZCgpKTsKLQkJcmVhZGVyLnJlYWQobmV3IGNoYXJbc291cmNlLmxlbmd0aCgpIC0gNV0sIDAsIHNvdXJjZS5sZW5ndGgoKSAtIDUpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHJlYWRlci5yZWFkKCkpOwotCX0KKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGludCByZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCdUJywgKGNoYXIpIHJlYWRlci5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ2gnLCAoY2hhcikgcmVhZGVyLnJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnaScsIChjaGFyKSByZWFkZXIucmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCdzJywgKGNoYXIpIHJlYWRlci5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoJyAnLCAoY2hhcikgcmVhZGVyLnJlYWQoKSk7CisgICAgICAgIHJlYWRlci5yZWFkKG5ldyBjaGFyW3NvdXJjZS5sZW5ndGgoKSAtIDVdLCAwLCBzb3VyY2UubGVuZ3RoKCkgLSA1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCByZWFkZXIucmVhZCgpKTsKKyAgICB9CiAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGludCByZWFkKCkKICAgICAgKiBSZWdyZXNzaW9uIGZvciBIYXJtb255LTQxMQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWQxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gaWYgdGhlIGRlY29kZXIgaXMgY29uc3RydWN0ZWQgYnkgSW5wdXRTdHJlYW1SZWFkZXIgaXRzZWxmLCB0aGUgZGVjb2RlcidzIAogICAgICAgICAvLyBkZWZhdWx0IGVycm9yIGFjdGlvbiBpcyBSRVBMQUNFCkBAIC0xOTcsMzA4ICsyMjMsNDIyIEBACiAgICAgICAgIGFzc2VydEVxdWFscygicmVhZCgpIHJldHVybiBpbmNvcnJlY3QgdmFsdWUiLCA2NTUzMywgaXNyNS5yZWFkKCkpOwogICAgIH0KIAotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgaW50IHJlYWQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZGNoYXJBcnJheWludGludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYmVmb3JlIE51bGxQb2ludGVyRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlyZWFkZXIucmVhZChudWxsLCAtMSwgMSk7Ci0JCQlmYWlsKCJTaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJLy90aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gYmVmb3JlIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCXJlYWRlci5yZWFkKG51bGwsIDAsIC0xKTsKLQkJCWZhaWwoIlNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZWFkZXIucmVhZChudWxsLCAwLCAxKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlyZWFkZXIucmVhZChuZXcgY2hhclszXSwgLTEsIDEpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcmVhZGVyLnJlYWQobmV3IGNoYXJbM10sIDAsIC0xKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlYWRlci5yZWFkKG5ldyBjaGFyWzNdLCAxLCAzKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5yZWFkKG5ldyBjaGFyWzNdLCAzLCAwKSk7Ci0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW3NvdXJjZS5sZW5ndGgoKV07Ci0JCWFzc2VydEVxdWFscygwLCByZWFkZXIucmVhZChjaGFycywgMCwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2hhcnNbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgcmVhZGVyLnJlYWQoY2hhcnMsIDAsIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHJlYWRlci5yZWFkKGNoYXJzLCAzLCA1KSk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UubGVuZ3RoKCkgLSA4LCByZWFkZXIucmVhZChjaGFycywgOCwKLQkJCQljaGFycy5sZW5ndGggLSA4KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjaGFycywgc291cmNlLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCByZWFkZXIucmVhZChjaGFycywgMCwgY2hhcnMubGVuZ3RoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjaGFycywgc291cmNlLnRvQ2hhckFycmF5KCkpKTsKLQl9CisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgcmVhZChjaGFyW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGNoYXJBcnJheWludGludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIucmVhZChuZXcgY2hhclszXSwgLTEsIDApOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5yZWFkKG5ldyBjaGFyWzNdLCAwLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLnJlYWQobmV3IGNoYXJbM10sIDQsIDApOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5yZWFkKG5ldyBjaGFyWzNdLCAzLCAxKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIucmVhZChuZXcgY2hhclszXSwgMSwgMyk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLnJlYWQobmV3IGNoYXJbM10sIDAsIDQpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIucmVhZChudWxsLCAwLCAwKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIucmVhZChuZXcgY2hhclszXSwgMywgMCkpOworICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltzb3VyY2UubGVuZ3RoKCldOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLnJlYWQoY2hhcnMsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNoYXJzWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlYWRlci5yZWFkKGNoYXJzLCAwLCAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCByZWFkZXIucmVhZChjaGFycywgMywgNSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmxlbmd0aCgpIC0gOCwgcmVhZGVyLnJlYWQoY2hhcnMsIDgsCisgICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoIC0gOCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY2hhcnMsIHNvdXJjZS50b0NoYXJBcnJheSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgcmVhZGVyLnJlYWQoY2hhcnMsIDAsIGNoYXJzLmxlbmd0aCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY2hhcnMsIHNvdXJjZS50b0NoYXJBcnJheSgpKSk7CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRjaGFyQXJyYXlpbnRpbnQyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbc291cmNlLmxlbmd0aCgpXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5sZW5ndGgoKSAtIDMsIHJlYWRlci5yZWFkKGNoYXJzLCAwLAorICAgICAgICAgICAgICAgIGNoYXJzLmxlbmd0aCAtIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlYWRlci5yZWFkKGNoYXJzLCAwLCAxMCkpOworICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZHkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUocmVhZGVyLnJlYWR5KCkpOworICAgICAgICByZWFkZXIucmVhZChuZXcgY2hhcltzb3VyY2UubGVuZ3RoKCldKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLnJlYWR5KCkpOworICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApCisgICAgcHVibGljIHZvaWQgX3Rlc3RTcGVjaWFsQ2hhcnNldFJlYWRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICJ0ZXN0cy9hcGkvamF2YS9pby90ZXN0ZmlsZS11dGY4LnR4dCIpOworICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJ1dGYtOCIpOworICAgICAgICBpbnQgYzsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB3aGlsZSAoKGMgPSByZWFkZXIucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBjKTsKKyAgICAgICAgfQorICAgICAgICAvLyBkZWxldGUgQk9NCisgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UsIHNiLmRlbGV0ZUNoYXJBdCgwKS50b1N0cmluZygpKTsKIAotCXB1YmxpYyB2b2lkIHRlc3RSZWFkY2hhckFycmF5aW50aW50MigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW3NvdXJjZS5sZW5ndGgoKV07Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UubGVuZ3RoKCkgLSAzLCByZWFkZXIucmVhZChjaGFycywgMCwKLQkJCQljaGFycy5sZW5ndGggLSAzKSk7Ci0JCWFzc2VydEVxdWFscygzLCByZWFkZXIucmVhZChjaGFycywgMCwgMTApKTsKLQl9CisgICAgICAgIHNiLnNldExlbmd0aCgwKTsKKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIGluID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAidGVzdHMvYXBpL2phdmEvaW8vdGVzdGZpbGUudHh0Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJnYjE4MDMwIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dAorICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiR0IxODAzMCBpcyBub3Qgc3VwcG9ydGVkLCBhYm9ydCB0ZXN0IElucHV0U3RyZWFtUmVhZGVyVGVzdC50ZXN0U3BlY2lhbENoYXJzZXRSZWFkaW5nKCkuIik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChjID0gcmVhZGVyLnJlYWQoKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgYyk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZSwgc2IudG9TdHJpbmcoKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShyZWFkZXIucmVhZHkoKSk7Ci0JCXJlYWRlci5yZWFkKG5ldyBjaGFyW3NvdXJjZS5sZW5ndGgoKV0pOwotCQlhc3NlcnRGYWxzZShyZWFkZXIucmVhZHkoKSk7Ci0JfQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSksCisgICAgICAgICAgICAgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWR5IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWZ0ZXJDbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpCisgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oInRlc3RzL2FwaS9qYXZhL2lvL3Rlc3RmaWxlLXV0ZjgudHh0IikpOworICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJ1dGYtOCIpOworICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZGVyLnJlYWQobmV3IGNoYXJbMV0pOworICAgICAgICAgICAgZmFpbCgiY291bnQ6IiArIGNvdW50KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWFsQ2hhcnNldFJlYWRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZWFkZXIuY2xvc2UoKTsKLQkJaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAotCQkJCSJ0ZXN0cy9hcGkvamF2YS9pby90ZXN0ZmlsZS11dGY4LnR4dCIpOwotCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJ1dGYtOCIpOwotCQlpbnQgYzsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoKGMgPSByZWFkZXIucmVhZCgpKSAhPSAtMSkgewotCQkJc2IuYXBwZW5kKChjaGFyKSBjKTsKLQkJfQotCQkvLyBkZWxldGUgQk9NCi0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHNiLmRlbGV0ZUNoYXJBdCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLnJlYWR5KCkpOworICAgICAgICBDaGFyc2V0IGNzID0gQ2hhcnNldC5mb3JOYW1lKCJ1dGYtOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY3MsIENoYXJzZXQuZm9yTmFtZShyZWFkZXIuZ2V0RW5jb2RpbmcoKSkpOworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICB9CiAKLQkJc2Iuc2V0TGVuZ3RoKDApOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAotCQkJCSJ0ZXN0cy9hcGkvamF2YS9pby90ZXN0ZmlsZS50eHQiKTsKLQkJdHJ5IHsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgImdiMTgwMzAiKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJHQjE4MDMwIGlzIG5vdCBzdXBwb3J0ZWQsIGFib3J0IHRlc3QgSW5wdXRTdHJlYW1SZWFkZXJUZXN0LnRlc3RTcGVjaWFsQ2hhcnNldFJlYWRpbmcoKS4iKTsKLQkJfQotCQl3aGlsZSAoKGMgPSByZWFkZXIucmVhZCgpKSAhPSAtMSkgewotCQkJc2IuYXBwZW5kKChjaGFyKSBjKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBzYi50b1N0cmluZygpKTsKLQl9CisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIElucHV0U3RyZWFtUmVhZGVyKElucHV0U3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJJbnB1dFN0cmVhbVJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN0cmVhbVJlYWRlcklucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlcjIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOworICAgICAgICByZWFkZXIyLmNsb3NlKCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEFmdGVyQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZWFkZXIuY2xvc2UoKTsKLQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQotCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXN0cy9hcGkvamF2YS9pby90ZXN0ZmlsZS11dGY4LnR4dCIpKTsKLQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAidXRmLTgiKTsKLQkJaW4uY2xvc2UoKTsKLQkJdHJ5IHsKLQkJCWludCBjb3VudCA9IHJlYWRlci5yZWFkKG5ldyBjaGFyWzFdKTsKLQkJCWZhaWwoImNvdW50OiIgKyBjb3VudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcmVhZGVyLnJlYWQoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9CisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIElucHV0U3RyZWFtUmVhZGVyKElucHV0U3RyZWFtLCBTdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIklucHV0U3RyZWFtUmVhZGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRTdHJlYW1SZWFkZXJJbnB1dFN0cmVhbVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobnVsbCwgInV0Zi04Iik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICIiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgImJhZG5hbWUiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyMiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgInV0Zi04Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhDaGFyc2V0LmZvck5hbWUocmVhZGVyMi5nZXRFbmNvZGluZygpKSwgQ2hhcnNldAorICAgICAgICAgICAgICAgIC5mb3JOYW1lKCJ1dGYtOCIpKTsKKyAgICAgICAgcmVhZGVyMi5jbG9zZSgpOworICAgICAgICByZWFkZXIyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAidXRmOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcnNldC5mb3JOYW1lKHJlYWRlcjIuZ2V0RW5jb2RpbmcoKSksIENoYXJzZXQKKyAgICAgICAgICAgICAgICAuZm9yTmFtZSgidXRmLTgiKSk7CisgICAgICAgIHJlYWRlcjIuY2xvc2UoKTsKKyAgICB9CiAKLQkJYXNzZXJ0RmFsc2UocmVhZGVyLnJlYWR5KCkpOwotCQlDaGFyc2V0IGNzID0gQ2hhcnNldC5mb3JOYW1lKCJ1dGYtOCIpOwotCQlhc3NlcnRFcXVhbHMoY3MsIENoYXJzZXQuZm9yTmFtZShyZWFkZXIuZ2V0RW5jb2RpbmcoKSkpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgSW5wdXRTdHJlYW1SZWFkZXIoSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdElucHV0U3RyZWFtUmVhZGVySW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyMiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7Ci0JCXJlYWRlcjIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgSW5wdXRTdHJlYW1SZWFkZXIoSW5wdXRTdHJlYW0sIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5wdXRTdHJlYW1SZWFkZXJJbnB1dFN0cmVhbVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobnVsbCwgInV0Zi04Iik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAoU3RyaW5nKSBudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICIiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgImJhZG5hbWUiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyMiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgInV0Zi04Iik7Ci0JCWFzc2VydEVxdWFscyhDaGFyc2V0LmZvck5hbWUocmVhZGVyMi5nZXRFbmNvZGluZygpKSwgQ2hhcnNldAotCQkJCS5mb3JOYW1lKCJ1dGYtOCIpKTsKLQkJcmVhZGVyMi5jbG9zZSgpOwotCQlyZWFkZXIyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAidXRmOCIpOwotCQlhc3NlcnRFcXVhbHMoQ2hhcnNldC5mb3JOYW1lKHJlYWRlcjIuZ2V0RW5jb2RpbmcoKSksIENoYXJzZXQKLQkJCQkuZm9yTmFtZSgidXRmLTgiKSk7Ci0JCXJlYWRlcjIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgSW5wdXRTdHJlYW1SZWFkZXIoSW5wdXRTdHJlYW0sIENoYXJzZXREZWNvZGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnB1dFN0cmVhbVJlYWRlcklucHV0U3RyZWFtQ2hhcnNldERlY29kZXIoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNoYXJzZXREZWNvZGVyIGRlY29kZXIgPSBDaGFyc2V0LmZvck5hbWUoInV0Zi04IikubmV3RGVjb2RlcigpOwotCQl0cnkgewotCQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG51bGwsIGRlY29kZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgKENoYXJzZXREZWNvZGVyKSBudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9CisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIElucHV0U3RyZWFtUmVhZGVyKElucHV0U3RyZWFtLCBDaGFyc2V0RGVjb2RlcikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiSW5wdXRTdHJlYW1SZWFkZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNldERlY29kZXIuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRTdHJlYW1SZWFkZXJJbnB1dFN0cmVhbUNoYXJzZXREZWNvZGVyKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDaGFyc2V0RGVjb2RlciBkZWNvZGVyID0gQ2hhcnNldC5mb3JOYW1lKCJ1dGYtOCIpLm5ld0RlY29kZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihudWxsLCBkZWNvZGVyKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIChDaGFyc2V0RGVjb2RlcikgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBkZWNvZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKENoYXJzZXQuZm9yTmFtZShyZWFkZXIyLmdldEVuY29kaW5nKCkpLCBkZWNvZGVyLmNoYXJzZXQoKSk7Ci0JCXJlYWRlcjIuY2xvc2UoKTsKLQl9CisgICAgICAgIGFzc2VydEVxdWFscyhDaGFyc2V0LmZvck5hbWUocmVhZGVyMi5nZXRFbmNvZGluZygpKSwgZGVjb2Rlci5jaGFyc2V0KCkpOworICAgICAgICByZWFkZXIyLmNsb3NlKCk7CisgICAgfQogCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIElucHV0U3RyZWFtUmVhZGVyKElucHV0U3RyZWFtLCBDaGFyc2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnB1dFN0cmVhbVJlYWRlcklucHV0U3RyZWFtQ2hhcnNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNoYXJzZXQgY3MgPSBDaGFyc2V0LmZvck5hbWUoInV0Zi04Iik7Ci0JCXRyeSB7Ci0JCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobnVsbCwgY3MpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgKENoYXJzZXQpIG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyMiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgY3MpOwotCQlhc3NlcnRFcXVhbHMoQ2hhcnNldC5mb3JOYW1lKHJlYWRlcjIuZ2V0RW5jb2RpbmcoKSksIGNzKTsKLQkJcmVhZGVyMi5jbG9zZSgpOwotCX0KKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgSW5wdXRTdHJlYW1SZWFkZXIoSW5wdXRTdHJlYW0sIENoYXJzZXQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIklucHV0U3RyZWFtUmVhZGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzZXQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN0cmVhbVJlYWRlcklucHV0U3RyZWFtQ2hhcnNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENoYXJzZXQgY3MgPSBDaGFyc2V0LmZvck5hbWUoInV0Zi04Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobnVsbCwgY3MpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgKENoYXJzZXQpIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyMiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgY3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcnNldC5mb3JOYW1lKHJlYWRlcjIuZ2V0RW5jb2RpbmcoKSksIGNzKTsKKyAgICAgICAgcmVhZGVyMi5jbG9zZSgpOworICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApCisgICAgcHVibGljIHZvaWQgdGVzdElucHV0U3RyZWFtUmVhZGVyU3VjY2Vzc2l2ZVJlYWRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs4MTkyICogMl07CisgICAgICAgIEFycmF5cy5maWxsKGRhdGEsIChieXRlKSAxMTYpOyAvLyAxMTYgPSBJU08tODg1OS0xIHZhbHVlIGZvciAndCcKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzLCAiSVNPLTg4NTktMSIpOwogCi0JcHVibGljIHZvaWQgdGVzdElucHV0U3RyZWFtUmVhZGVyU3VjY2Vzc2l2ZVJlYWRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs4MTkyICogMl07Ci0JCUFycmF5cy5maWxsKGRhdGEsIChieXRlKSAxMTYpOyAvLyAxMTYgPSBJU08tODg1OS0xIHZhbHVlIGZvciAndCcKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQlJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzLCAiSVNPLTg4NTktMSIpOworICAgICAgICAvLyBPbmUgbGVzcyB0aGFuIHRoZSBJbnB1dFN0cmVhbVJlYWRlci5CVUZGRVJfU0laRQorICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbODE5MV07CisgICAgICAgIGludCBieXRlc1JlYWQgPSBpc3IucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgICAgICBpZiAoYnl0ZXNSZWFkID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGJ5dGVzUmVhZCA9IGlzci5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgIGlmIChieXRlc1JlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJLy8gT25lIGxlc3MgdGhhbiB0aGUgSW5wdXRTdHJlYW1SZWFkZXIuQlVGRkVSX1NJWkUKLQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzgxOTFdOwotCQlpbnQgYnl0ZXNSZWFkID0gaXNyLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQkJaWYgKGJ5dGVzUmVhZCA9PSAtMSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJfQotCQlieXRlc1JlYWQgPSBpc3IucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCQlpZiAoYnl0ZXNSZWFkID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyI0lucHV0U3RyZWFtUmVhZGVyKGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlZSBzZXRVcC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJJbnB1dFN0cmVhbVJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihqYXZhLmlvLklucHV0U3RyZWFtKQorICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3Qgb3RoZXIgbWV0aG9kcyIsIHRydWUpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyI0lucHV0U3RyZWFtUmVhZGVyKGphdmEuaW8uSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihqYXZhLmlvLklucHV0U3RyZWFtKQotCQlhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3Qgb3RoZXIgbWV0aG9kcyIsIHRydWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlciNJbnB1dFN0cmVhbVJlYWRlcihqYXZhLmlvLklucHV0U3RyZWFtLAorICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbnB1dFN0cmVhbVJlYWRlcihqYXZhLmlvLklucHV0U3RyZWFtKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJJbnB1dFN0cmVhbVJlYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGphdmEuaW8uSW5wdXRTdHJlYW0sCisgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcyA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsICI4ODU5XzEiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gY3JlYXRlIGlucHV0IHN0cmVhbSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyI0lucHV0U3RyZWFtUmVhZGVyKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JCS8vIGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlpcyA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsICI4ODU5XzEiKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmFibGUgdG8gY3JlYXRlIGlucHV0IHN0cmVhbSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgIkJvZ3VzIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byB0aHJvdyBVbnN1cHBvcnRlZCBFbmNvZGluZyBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkJdHJ5IHsKLQkJCWlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgIkJvZ3VzIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBVbnN1cHBvcnRlZCBFbmNvZGluZyBleGNlcHRpb24iKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlci5jbG9zZSgpCi0JCXRyeSB7Ci0JCQlpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gY2xvc2UgcmVhZGVyIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQl0cnkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY2xvc2UiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlci5jbG9zZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gY2xvc2UgcmVhZGVyIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgewogICAgICAgICAgICAgaXMucmVhZCgpOwogICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiBtZWFucyByZWFkIGZhaWxlZCBkdWUgdG8gY2xvc2UKICAgICAgICAgfSAKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlciNnZXRFbmNvZGluZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRFbmNvZGluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKLQkJLy8gamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlci5nZXRFbmNvZGluZygpCi0JCXRyeSB7Ci0JCQlpcyA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsICI4ODU5XzEiKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBlbmNvZGluZyIsIAotCQkJCQkiODg1OV8xIiwgaXMuZ2V0RW5jb2RpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIjZ2V0RW5jb2RpbmcoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRFbmNvZGluZygpIG1ldGhvZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRFbmNvZGluZyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVuY29kaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZworICAgICAgICAvLyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyLmdldEVuY29kaW5nKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgIjg4NTlfMSIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGVuY29kaW5nIiwgCisgICAgICAgICAgICAgICAgICAgICI4ODU5XzEiLCBpcy5nZXRFbmNvZGluZygpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbnsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyLnJlYWQoKQotCQl0cnkgewotCQkJaW50IGMgPSBpcy5yZWFkKCk7Ci0JCQlhc3NlcnRUcnVlKCJyZXR1cm5lZCBpbmNvcnJlY3QgY2hhciIsIChjaGFyKSBjID09IGZpbGVTdHJpbmcKLQkJCQkJLmNoYXJBdCgwKSk7Ci0JCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4ZTgsCi0JCQkJCQkJKGJ5dGUpIDB4OWQsIChieXRlKSAweGE1IH0pLCAiVVRGOCIpOwotCQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZG91YmxlIGJ5dGUgY2hhciIsIHJlYWRlci5yZWFkKCkgPT0gJ1x1ODc2NScpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlciNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIucmVhZCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgYyA9IGlzLnJlYWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInJldHVybmVkIGluY29ycmVjdCBjaGFyIiwgKGNoYXIpIGMgPT0gZmlsZVN0cmluZworICAgICAgICAgICAgICAgICAgICAuY2hhckF0KDApKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAoYnl0ZSkgMHhlOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4YTUgfSksICJVVEY4Iik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJ3cm9uZyBkb3VibGUgYnl0ZSBjaGFyIiwgcmVhZGVyLnJlYWQoKSA9PSAnXHU4NzY1Jyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogICAgICAgICAKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xNjYKICAgICAgICAgSW5wdXRTdHJlYW0gaW47CkBAIC01MjAsMzggKzY2MCw1MiBAQAogICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJJU08yMDIySlAiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSBJU08yMDIySlAgMSIsICdcdTRlNWQnLCByZWFkZXIucmVhZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZSBJU08yMDIySlAgMiIsICdcdTdiMmMnLCByZWFkZXIucmVhZCgpKTsKLQl9CisgICAgfQogCi0JLyoqCisgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIjcmVhZChjaGFyW10sIGludCwgaW50KQogICAgICAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlci5yZWFkKGNoYXIgW10sIGludCwgaW50KQotCQl0cnkgewotCQkJY2hhcltdIHJidWYgPSBuZXcgY2hhclsxMDBdOwotCQkJY2hhcltdIHNidWYgPSBuZXcgY2hhclsxMDBdOwotCQkJZmlsZVN0cmluZy5nZXRDaGFycygwLCAxMDAsIHNidWYsIDApOwotCQkJaXMucmVhZChyYnVmLCAwLCAxMDApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYnVmLmxlbmd0aDsgaSsrKQotCQkJCWFzc2VydFRydWUoInJldHVybmVkIGluY29ycmVjdCBjaGFycyIsIHJidWZbaV0gPT0gc2J1ZltpXSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAorICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQ0lJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIucmVhZChjaGFyIFtdLCBpbnQsIGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYXJbXSByYnVmID0gbmV3IGNoYXJbMTAwXTsKKyAgICAgICAgICAgIGNoYXJbXSBzYnVmID0gbmV3IGNoYXJbMTAwXTsKKyAgICAgICAgICAgIGZpbGVTdHJpbmcuZ2V0Q2hhcnMoMCwgMTAwLCBzYnVmLCAwKTsKKyAgICAgICAgICAgIGlzLnJlYWQocmJ1ZiwgMCwgMTAwKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmJ1Zi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJyZXR1cm5lZCBpbmNvcnJlY3QgY2hhcnMiLCByYnVmW2ldID09IHNidWZbaV0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkeSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlci5yZWFkeSgpCi0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKCJSZWFkeSB0ZXN0IGZhaWxlZCIsIGlzLnJlYWR5KCkpOwotCQkJaXMucmVhZCgpOwotCQkJYXNzZXJ0VHJ1ZSgiTW9yZSBjaGFycywgYnV0IG5vdCByZWFkeSIsIGlzLnJlYWR5KCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWR5IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyI3JlYWR5KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJbTm8gdmVyaWZpY2F0aW9uIGZvciBlbXB0eSBidWZmZXJdIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZHkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWR5KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyLnJlYWR5KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlYWR5IHRlc3QgZmFpbGVkIiwgaXMucmVhZHkoKSk7CisgICAgICAgICAgICBpcy5yZWFkKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNb3JlIGNoYXJzLCBidXQgbm90IHJlYWR5IiwgaXMucmVhZHkoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZHkgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCiAgICAgCiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vSW50ZXJydXB0ZWRJT0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9JbnRlcnJ1cHRlZElPRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDdiNDljMjIuLjUwYjkzZDkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9JbnRlcnJ1cHRlZElPRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9JbnRlcnJ1cHRlZElPRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw1MyArMTcsNzIgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiBpbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEludGVycnVwdGVkSU9FeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEludGVycnVwdGVkSU9FeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24jSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpCi0JCXRyeSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0ZXN0IgotCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uI0ludGVycnVwdGVkSU9FeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0ZXN0IgorICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24jSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oIlNvbWUgZXJyb3IgbWVzc2FnZSIpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0ZXN0IgotCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uI0ludGVycnVwdGVkSU9FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCJTb21lIGVycm9yIG1lc3NhZ2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIEludGVycnVwdGVkSU9FeGNlcHRpb24gdGVzdCIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9JbnZhbGlkQ2xhc3NFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vSW52YWxpZENsYXNzRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDE0NDFlNmQuLjc4OGY3NGIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9JbnZhbGlkQ2xhc3NFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0ludmFsaWRDbGFzc0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNjkgKzE3LDk2IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAogaW1wb3J0IGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEludmFsaWRDbGFzc0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW52YWxpZENsYXNzRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb24jSW52YWxpZENsYXNzRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJBIG1lc3NhZ2UiOwotCQl0cnkgewotCQkJaWYgKHRydWUpCi0JCQkJdGhyb3cgbmV3IGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9IGNhdGNoIChJbnZhbGlkQ2xhc3NFeGNlcHRpb24gZSkgewotCQkJLy8gY29ycmVjdAotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lc3NhZ2UgcmVhZCIsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXNzYWdlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb24jSW52YWxpZENsYXNzRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkludmFsaWRDbGFzc0V4Y2VwdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkEgbWVzc2FnZSI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodHJ1ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRDbGFzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjb3JyZWN0CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWVzc2FnZSByZWFkIiwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKG1lc3NhZ2UpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uI0ludmFsaWRDbGFzc0V4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZywKLQkJLy8gamF2YS5sYW5nLlN0cmluZykKLQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiQSBtZXNzYWdlIjsKLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9ICJPYmplY3QiOwotCQl0cnkgewotCQkJaWYgKHRydWUpCi0JCQkJdGhyb3cgbmV3IGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uKGNsYXNzTmFtZSwgbWVzc2FnZSk7Ci0JCX0gY2F0Y2ggKEludmFsaWRDbGFzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3JyZWN0Ci0JCQlTdHJpbmcgcmV0dXJuZWRNZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWVzc2FnZSByZWFkOiAiICsgZS5nZXRNZXNzYWdlKCksCi0JCQkJCXJldHVybmVkTWVzc2FnZS5pbmRleE9mKGNsYXNzTmFtZSkgPj0gMAotCQkJCQkJCSYmIHJldHVybmVkTWVzc2FnZS5pbmRleE9mKG1lc3NhZ2UpID49IDApOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uI0ludmFsaWRDbGFzc0V4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJJbnZhbGlkQ2xhc3NFeGNlcHRpb24iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZywKKyAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiQSBtZXNzYWdlIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9ICJPYmplY3QiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uKGNsYXNzTmFtZSwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRDbGFzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjb3JyZWN0CisgICAgICAgICAgICBTdHJpbmcgcmV0dXJuZWRNZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWVzc2FnZSByZWFkOiAiICsgZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIHJldHVybmVkTWVzc2FnZS5pbmRleE9mKGNsYXNzTmFtZSkgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJldHVybmVkTWVzc2FnZS5pbmRleE9mKG1lc3NhZ2UpID49IDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb24jZ2V0TWVzc2FnZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwotCQkvLyBqYXZhLmlvLkludmFsaWRDbGFzc0V4Y2VwdGlvbi5nZXRNZXNzYWdlKCkKLQkJLy8gdXNlZCB0byB0ZXN0Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkludmFsaWRDbGFzc0V4Y2VwdGlvbiNnZXRNZXNzYWdlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGVtcHR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCisgICAgICAgIC8vIGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uLmdldE1lc3NhZ2UoKQorICAgICAgICAvLyB1c2VkIHRvIHRlc3QKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9MaW5lTnVtYmVySW5wdXRTdHJlYW1UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vTGluZU51bWJlcklucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDU4NmQ5NDEuLjViYzMxMzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9MaW5lTnVtYmVySW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL0xpbmVOdW1iZXJJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTYsMTkwICsxNiwyNTggQEAKICAqLwogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbTsKIAorQFRlc3RUYXJnZXRDbGFzcyhMaW5lTnVtYmVySW5wdXRTdHJlYW0uY2xhc3MpCiBwdWJsaWMgY2xhc3MgTGluZU51bWJlcklucHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlTdHJpbmcgdGV4dCA9ICIwXG4xXG4yXG4zXG40XG41XG42XG43XG44XG45XG4xMFxuMTFcbjEyXG4xM1xuMTRcbjE1XG4xNlxuMTdcbjE4XG4xOVxuMjBcbjIxXG4yMlxuMjNcbjI0XG4yNVxuMjZcbjI3XG4yOFxuMjlcbjMwXG4zMVxuMzJcbjMzXG4zNFxuMzVcbjM2XG4zN1xuMzhcbjM5XG40MFxuNDFcbjQyXG40M1xuNDRcbjQ1XG40NlxuNDdcbjQ4XG40OVxuNTBcbjUxXG41MlxuNTNcbjU0XG41NVxuNTZcbjU3XG41OFxuNTlcbjYwXG42MVxuNjJcbjYzXG42NFxuNjVcbjY2XG42N1xuNjhcbjY5XG43MFxuNzFcbjcyXG43M1xuNzRcbjc1XG43NlxuNzdcbjc4XG43OVxuODBcbjgxXG44MlxuODNcbjg0XG44NVxuODZcbjg3XG44OFxuODlcbjkwXG45MVxuOTJcbjkzXG45NFxuOTVcbjk2XG45N1xuOThcbjk5XG4xMDBcbjEwMVxuMTAyXG4xMDNcbjEwNFxuMTA1XG4xMDZcbjEwN1xuMTA4XG4xMDlcbjExMFxuMTExXG4xMTJcbjExM1xuMTE0XG4xMTVcbjExNlxuMTE3XG4xMThcbjExOVxuMTIwXG4xMjFcbjEyMlxuMTIzXG4xMjRcbjEyNVxuMTI2XG4xMjdcbjEyOFxuMTI5XG4xMzBcbjEzMVxuMTMyXG4xMzNcbjEzNFxuMTM1XG4xMzZcbjEzN1xuMTM4XG4xMzlcbjE0MFxuMTQxXG4xNDJcbjE0M1xuMTQ0XG4xNDVcbjE0NlxuMTQ3XG4xNDhcbjE0OVxuMTUwXG4xNTFcbjE1MlxuMTUzXG4xNTRcbjE1NVxuMTU2XG4xNTdcbjE1OFxuMTU5XG4xNjBcbjE2MVxuMTYyXG4xNjNcbjE2NFxuMTY1XG4xNjZcbjE2N1xuMTY4XG4xNjlcbjE3MFxuMTcxXG4xNzJcbjE3M1xuMTc0XG4xNzVcbjE3NlxuMTc3XG4xNzhcbjE3OVxuMTgwXG4xODFcbjE4MlxuMTgzXG4xODRcbjE4NVxuMTg2XG4xODdcbjE4OFxuMTg5XG4xOTBcbjE5MVxuMTkyXG4xOTNcbjE5NFxuMTk1XG4xOTZcbjE5N1xuMTk4XG4xOTlcbjIwMFxuMjAxXG4yMDJcbjIwM1xuMjA0XG4yMDVcbjIwNlxuMjA3XG4yMDhcbjIwOVxuMjEwXG4yMTFcbjIxMlxuMjEzXG4yMTRcbjIxNVxuMjE2XG4yMTdcbjIxOFxuMjE5XG4yMjBcbjIyMVxuMjIyXG4yMjNcbjIyNFxuMjI1XG4yMjZcbjIyN1xuMjI4XG4yMjlcbjIzMFxuMjMxXG4yMzJcbjIzM1xuMjM0XG4yMzVcbjIzNlxuMjM3XG4yMzhcbjIzOVxuMjQwXG4yNDFcbjI0MlxuMjQzXG4yNDRcbjI0NVxuMjQ2XG4yNDdcbjI0OFxuMjQ5XG4yNTBcbjI1MVxuMjUyXG4yNTNcbjI1NFxuMjU1XG4yNTZcbjI1N1xuMjU4XG4yNTlcbjI2MFxuMjYxXG4yNjJcbjI2M1xuMjY0XG4yNjVcbjI2NlxuMjY3XG4yNjhcbjI2OVxuMjcwXG4yNzFcbjI3MlxuMjczXG4yNzRcbjI3NVxuMjc2XG4yNzdcbjI3OFxuMjc5XG4yODBcbjI4MVxuMjgyXG4yODNcbjI4NFxuMjg1XG4yODZcbjI4N1xuMjg4XG4yODlcbjI5MFxuMjkxXG4yOTJcbjI5M1xuMjk0XG4yOTVcbjI5NlxuMjk3XG4yOThcbjI5OVxuMzAwXG4zMDFcbjMwMlxuMzAzXG4zMDRcbjMwNVxuMzA2XG4zMDdcbjMwOFxuMzA5XG4zMTBcbjMxMVxuMzEyXG4zMTNcbjMxNFxuMzE1XG4zMTZcbjMxN1xuMzE4XG4zMTlcbjMyMFxuMzIxXG4zMjJcbjMyM1xuMzI0XG4zMjVcbjMyNlxuMzI3XG4zMjhcbjMyOVxuMzMwXG4zMzFcbjMzMlxuMzMzXG4zMzRcbjMzNVxuMzM2XG4zMzdcbjMzOFxuMzM5XG4zNDBcbjM0MVxuMzQyXG4zNDNcbjM0NFxuMzQ1XG4zNDZcbjM0N1xuMzQ4XG4zNDlcbjM1MFxuMzUxXG4zNTJcbjM1M1xuMzU0XG4zNTVcbjM1NlxuMzU3XG4zNThcbjM1OVxuMzYwXG4zNjFcbjM2MlxuMzYzXG4zNjRcbjM2NVxuMzY2XG4zNjdcbjM2OFxuMzY5XG4zNzBcbjM3MVxuMzcyXG4zNzNcbjM3NFxuMzc1XG4zNzZcbjM3N1xuMzc4XG4zNzlcbjM4MFxuMzgxXG4zODJcbjM4M1xuMzg0XG4zODVcbjM4NlxuMzg3XG4zODhcbjM4OVxuMzkwXG4zOTFcbjM5MlxuMzkzXG4zOTRcbjM5NVxuMzk2XG4zOTdcbjM5OFxuMzk5XG40MDBcbjQwMVxuNDAyXG40MDNcbjQwNFxuNDA1XG40MDZcbjQwN1xuNDA4XG40MDlcbjQxMFxuNDExXG40MTJcbjQxM1xuNDE0XG40MTVcbjQxNlxuNDE3XG40MThcbjQxOVxuNDIwXG40MjFcbjQyMlxuNDIzXG40MjRcbjQyNVxuNDI2XG40MjdcbjQyOFxuNDI5XG40MzBcbjQzMVxuNDMyXG40MzNcbjQzNFxuNDM1XG40MzZcbjQzN1xuNDM4XG40MzlcbjQ0MFxuNDQxXG40NDJcbjQ0M1xuNDQ0XG40NDVcbjQ0NlxuNDQ3XG40NDhcbjQ0OVxuNDUwXG40NTFcbjQ1MlxuNDUzXG40NTRcbjQ1NVxuNDU2XG40NTdcbjQ1OFxuNDU5XG40NjBcbjQ2MVxuNDYyXG40NjNcbjQ2NFxuNDY1XG40NjZcbjQ2N1xuNDY4XG40NjlcbjQ3MFxuNDcxXG40NzJcbjQ3M1xuNDc0XG40NzVcbjQ3NlxuNDc3XG40NzhcbjQ3OVxuNDgwXG40ODFcbjQ4MlxuNDgzXG40ODRcbjQ4NVxuNDg2XG40ODdcbjQ4OFxuNDg5XG40OTBcbjQ5MVxuNDkyXG40OTNcbjQ5NFxuNDk1XG40OTZcbjQ5N1xuNDk4XG40OTlcbjUwMFxuNTAxIjsKKyAgICBTdHJpbmcgdGV4dCA9ICIwXG4xXG4yXG4zXG40XG41XG42XG43XG44XG45XG4xMFxuMTFcbjEyXG4xM1xuMTRcbjE1XG4xNlxuMTdcbjE4XG4xOVxuMjBcbjIxXG4yMlxuMjNcbjI0XG4yNVxuMjZcbjI3XG4yOFxuMjlcbjMwXG4zMVxuMzJcbjMzXG4zNFxuMzVcbjM2XG4zN1xuMzhcbjM5XG40MFxuNDFcbjQyXG40M1xuNDRcbjQ1XG40NlxuNDdcbjQ4XG40OVxuNTBcbjUxXG41MlxuNTNcbjU0XG41NVxuNTZcbjU3XG41OFxuNTlcbjYwXG42MVxuNjJcbjYzXG42NFxuNjVcbjY2XG42N1xuNjhcbjY5XG43MFxuNzFcbjcyXG43M1xuNzRcbjc1XG43NlxuNzdcbjc4XG43OVxuODBcbjgxXG44MlxuODNcbjg0XG44NVxuODZcbjg3XG44OFxuODlcbjkwXG45MVxuOTJcbjkzXG45NFxuOTVcbjk2XG45N1xuOThcbjk5XG4xMDBcbjEwMVxuMTAyXG4xMDNcbjEwNFxuMTA1XG4xMDZcbjEwN1xuMTA4XG4xMDlcbjExMFxuMTExXG4xMTJcbjExM1xuMTE0XG4xMTVcbjExNlxuMTE3XG4xMThcbjExOVxuMTIwXG4xMjFcbjEyMlxuMTIzXG4xMjRcbjEyNVxuMTI2XG4xMjdcbjEyOFxuMTI5XG4xMzBcbjEzMVxuMTMyXG4xMzNcbjEzNFxuMTM1XG4xMzZcbjEzN1xuMTM4XG4xMzlcbjE0MFxuMTQxXG4xNDJcbjE0M1xuMTQ0XG4xNDVcbjE0NlxuMTQ3XG4xNDhcbjE0OVxuMTUwXG4xNTFcbjE1MlxuMTUzXG4xNTRcbjE1NVxuMTU2XG4xNTdcbjE1OFxuMTU5XG4xNjBcbjE2MVxuMTYyXG4xNjNcbjE2NFxuMTY1XG4xNjZcbjE2N1xuMTY4XG4xNjlcbjE3MFxuMTcxXG4xNzJcbjE3M1xuMTc0XG4xNzVcbjE3NlxuMTc3XG4xNzhcbjE3OVxuMTgwXG4xODFcbjE4MlxuMTgzXG4xODRcbjE4NVxuMTg2XG4xODdcbjE4OFxuMTg5XG4xOTBcbjE5MVxuMTkyXG4xOTNcbjE5NFxuMTk1XG4xOTZcbjE5N1xuMTk4XG4xOTlcbjIwMFxuMjAxXG4yMDJcbjIwM1xuMjA0XG4yMDVcbjIwNlxuMjA3XG4yMDhcbjIwOVxuMjEwXG4yMTFcbjIxMlxuMjEzXG4yMTRcbjIxNVxuMjE2XG4yMTdcbjIxOFxuMjE5XG4yMjBcbjIyMVxuMjIyXG4yMjNcbjIyNFxuMjI1XG4yMjZcbjIyN1xuMjI4XG4yMjlcbjIzMFxuMjMxXG4yMzJcbjIzM1xuMjM0XG4yMzVcbjIzNlxuMjM3XG4yMzhcbjIzOVxuMjQwXG4yNDFcbjI0MlxuMjQzXG4yNDRcbjI0NVxuMjQ2XG4yNDdcbjI0OFxuMjQ5XG4yNTBcbjI1MVxuMjUyXG4yNTNcbjI1NFxuMjU1XG4yNTZcbjI1N1xuMjU4XG4yNTlcbjI2MFxuMjYxXG4yNjJcbjI2M1xuMjY0XG4yNjVcbjI2NlxuMjY3XG4yNjhcbjI2OVxuMjcwXG4yNzFcbjI3MlxuMjczXG4yNzRcbjI3NVxuMjc2XG4yNzdcbjI3OFxuMjc5XG4yODBcbjI4MVxuMjgyXG4yODNcbjI4NFxuMjg1XG4yODZcbjI4N1xuMjg4XG4yODlcbjI5MFxuMjkxXG4yOTJcbjI5M1xuMjk0XG4yOTVcbjI5NlxuMjk3XG4yOThcbjI5OVxuMzAwXG4zMDFcbjMwMlxuMzAzXG4zMDRcbjMwNVxuMzA2XG4zMDdcbjMwOFxuMzA5XG4zMTBcbjMxMVxuMzEyXG4zMTNcbjMxNFxuMzE1XG4zMTZcbjMxN1xuMzE4XG4zMTlcbjMyMFxuMzIxXG4zMjJcbjMyM1xuMzI0XG4zMjVcbjMyNlxuMzI3XG4zMjhcbjMyOVxuMzMwXG4zMzFcbjMzMlxuMzMzXG4zMzRcbjMzNVxuMzM2XG4zMzdcbjMzOFxuMzM5XG4zNDBcbjM0MVxuMzQyXG4zNDNcbjM0NFxuMzQ1XG4zNDZcbjM0N1xuMzQ4XG4zNDlcbjM1MFxuMzUxXG4zNTJcbjM1M1xuMzU0XG4zNTVcbjM1NlxuMzU3XG4zNThcbjM1OVxuMzYwXG4zNjFcbjM2MlxuMzYzXG4zNjRcbjM2NVxuMzY2XG4zNjdcbjM2OFxuMzY5XG4zNzBcbjM3MVxuMzcyXG4zNzNcbjM3NFxuMzc1XG4zNzZcbjM3N1xuMzc4XG4zNzlcbjM4MFxuMzgxXG4zODJcbjM4M1xuMzg0XG4zODVcbjM4NlxuMzg3XG4zODhcbjM4OVxuMzkwXG4zOTFcbjM5MlxuMzkzXG4zOTRcbjM5NVxuMzk2XG4zOTdcbjM5OFxuMzk5XG40MDBcbjQwMVxuNDAyXG40MDNcbjQwNFxuNDA1XG40MDZcbjQwN1xuNDA4XG40MDlcbjQxMFxuNDExXG40MTJcbjQxM1xuNDE0XG40MTVcbjQxNlxuNDE3XG40MThcbjQxOVxuNDIwXG40MjFcbjQyMlxuNDIzXG40MjRcbjQyNVxuNDI2XG40MjdcbjQyOFxuNDI5XG40MzBcbjQzMVxuNDMyXG40MzNcbjQzNFxuNDM1XG40MzZcbjQzN1xuNDM4XG40MzlcbjQ0MFxuNDQxXG40NDJcbjQ0M1xuNDQ0XG40NDVcbjQ0NlxuNDQ3XG40NDhcbjQ0OVxuNDUwXG40NTFcbjQ1MlxuNDUzXG40NTRcbjQ1NVxuNDU2XG40NTdcbjQ1OFxuNDU5XG40NjBcbjQ2MVxuNDYyXG40NjNcbjQ2NFxuNDY1XG40NjZcbjQ2N1xuNDY4XG40NjlcbjQ3MFxuNDcxXG40NzJcbjQ3M1xuNDc0XG40NzVcbjQ3NlxuNDc3XG40NzhcbjQ3OVxuNDgwXG40ODFcbjQ4MlxuNDgzXG40ODRcbjQ4NVxuNDg2XG40ODdcbjQ4OFxuNDg5XG40OTBcbjQ5MVxuNDkyXG40OTNcbjQ5NFxuNDk1XG40OTZcbjQ5N1xuNDk4XG40OTlcbjUwMFxuNTAxIjsKIAotCVN0cmluZyBkb3NUZXh0ID0gIjBcclxuMVxyXG4yIjsKKyAgICBTdHJpbmcgZG9zVGV4dCA9ICIwXHJcbjFcclxuMiI7CiAKLQlMaW5lTnVtYmVySW5wdXRTdHJlYW0gbG5pczsKKyAgICBMaW5lTnVtYmVySW5wdXRTdHJlYW0gbG5pczsKIAotCUxpbmVOdW1iZXJJbnB1dFN0cmVhbSBsbmlzMjsKKyAgICBMaW5lTnVtYmVySW5wdXRTdHJlYW0gbG5pczI7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jTGluZU51bWJlcklucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSkKLQkJLy8gVXNlZCBpbiBvdGhlciB0ZXN0cwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jTGluZU51bWJlcklucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlNlZSBzZXRVcCIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkxpbmVOdW1iZXJJbnB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtKQorICAgICAgICAvLyBVc2VkIGluIG90aGVyIHRlc3RzCisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtI2F2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9hdmFpbGFibGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBudW1iZXIgb2YgYXZhaWxhYmxlIGJ5dGVzIiwgbG5pcwotCQkJCQkuYXZhaWxhYmxlKCkgPT0gdGV4dC5sZW5ndGgoKSAvIDIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGF2YWlsYWJsZSB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiYXZhaWxhYmxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfYXZhaWxhYmxlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtLmF2YWlsYWJsZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGF2YWlsYWJsZSBieXRlcyIsIGxuaXMKKyAgICAgICAgICAgICAgICAgICAgLmF2YWlsYWJsZSgpID09IHRleHQubGVuZ3RoKCkgLyAyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBhdmFpbGFibGUgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jZ2V0TGluZU51bWJlcigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lTnVtYmVyKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtLmdldExpbmVOdW1iZXIoKQotCQlhc3NlcnRFcXVhbHMoIk5ldyBzdHJlYW0gcmV0dXJuZWQgbGluZSBudW1iZXIgb3RoZXIgdGhhbiB6ZXJvIiwgMCwgbG5pcwotCQkJCS5nZXRMaW5lTnVtYmVyKCkpOwotCQl0cnkgewotCQkJbG5pcy5yZWFkKCk7Ci0JCQlsbmlzLnJlYWQoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRMaW5lTnVtYmVyIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIHJldHVybmVkIGluY29ycmVjdCBsaW5lIG51bWJlciBhZnRlciByZWFkIiwgMSwgbG5pcwotCQkJCS5nZXRMaW5lTnVtYmVyKCkpOwotCQlsbmlzLnNldExpbmVOdW1iZXIoODkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSByZXR1cm5lZCBpbmNvcnJlY3QgbGluZSBudW1iZXIgYWZ0ZXIgc2V0IiwgODksIGxuaXMKLQkJCQkuZ2V0TGluZU51bWJlcigpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtI2dldExpbmVOdW1iZXIoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRMaW5lTnVtYmVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lTnVtYmVyKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtLmdldExpbmVOdW1iZXIoKQorICAgICAgICBhc3NlcnRFcXVhbHMoIk5ldyBzdHJlYW0gcmV0dXJuZWQgbGluZSBudW1iZXIgb3RoZXIgdGhhbiB6ZXJvIiwgMCwgbG5pcworICAgICAgICAgICAgICAgIC5nZXRMaW5lTnVtYmVyKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG5pcy5yZWFkKCk7CisgICAgICAgICAgICBsbmlzLnJlYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRMaW5lTnVtYmVyIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygic3RyZWFtIHJldHVybmVkIGluY29ycmVjdCBsaW5lIG51bWJlciBhZnRlciByZWFkIiwgMSwgbG5pcworICAgICAgICAgICAgICAgIC5nZXRMaW5lTnVtYmVyKCkpOworICAgICAgICBsbmlzLnNldExpbmVOdW1iZXIoODkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN0cmVhbSByZXR1cm5lZCBpbmNvcnJlY3QgbGluZSBudW1iZXIgYWZ0ZXIgc2V0IiwgODksIGxuaXMKKyAgICAgICAgICAgICAgICAuZ2V0TGluZU51bWJlcigpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jbWFyayhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0ubWFyayhpbnQpCi0JCXRyeSB7Ci0JCQlsbmlzLm1hcmsoNDApOwotCQkJbG5pcy5za2lwKDQpOwotCQkJbG5pcy5yZXNldCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gbWFyayIsIDAsIGxuaXMuZ2V0TGluZU51bWJlcigpKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIG1hcmsiLCAnMCcsIGxuaXMucmVhZCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbSNtYXJrKGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWFyayIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbS5tYXJrKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxuaXMubWFyayg0MCk7CisgICAgICAgICAgICBsbmlzLnNraXAoNCk7CisgICAgICAgICAgICBsbmlzLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBtYXJrIiwgMCwgbG5pcy5nZXRMaW5lTnVtYmVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gbWFyayIsICcwJywgbG5pcy5yZWFkKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtLnJlYWQoKQotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGJ5dGUiLCAnMCcsIGxuaXMucmVhZCgpKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBieXRlIG9uIGRvcyB0ZXh0IiwKLQkJCQkJJzAnLCBsbmlzMi5yZWFkKCkpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBieXRlIG9uIGRvcyB0ZXh0IiwKLQkJCQkJbG5pczIucmVhZCgpID09ICdcbicpOwotCQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGJ5dGUgb24gZG9zIHRleHQiLAotCQkJCQknMScsIGxuaXMyLnJlYWQoKSk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGJ5dGUgb24gZG9zIHRleHQiLAotCQkJCQlsbmlzMi5yZWFkKCkgPT0gJ1xuJyk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgYnl0ZSBvbiBkb3MgdGV4dCIsCi0JCQkJCScyJywgbG5pczIucmVhZCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbSNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0ucmVhZCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgYnl0ZSIsICcwJywgbG5pcy5yZWFkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGJ5dGUgb24gZG9zIHRleHQiLAorICAgICAgICAgICAgICAgICAgICAnMCcsIGxuaXMyLnJlYWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjb3JyZWN0IGJ5dGUgb24gZG9zIHRleHQiLAorICAgICAgICAgICAgICAgICAgICBsbmlzMi5yZWFkKCkgPT0gJ1xuJyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgYnl0ZSBvbiBkb3MgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICcxJywgbG5pczIucmVhZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgYnl0ZSBvbiBkb3MgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgIGxuaXMyLnJlYWQoKSA9PSAnXG4nKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBieXRlIG9uIGRvcyB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgJzInLCBsbmlzMi5yZWFkKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0ucmVhZChieXRlIFtdLCBpbnQsCi0JCS8vIGludCkKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDBdOwotCQkJbG5pcy5yZWFkKGJ1ZiwgMCwgMTAwKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNvcnJlY3QgYnl0ZXMgb24gbm9ybWFsIHRleHQiLAotCQkJCQluZXcgU3RyaW5nKGJ1ZiwgMCwgMTAwKS5lcXVhbHModGV4dC5zdWJzdHJpbmcoMCwgMTAwKSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMF07CisgICAgICAgICAgICBsbmlzLnJlYWQoYnVmLCAwLCAxMDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlYWQgY29ycmVjdCBieXRlcyBvbiBub3JtYWwgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoYnVmLCAwLCAxMDApLmVxdWFscyh0ZXh0LnN1YnN0cmluZygwLCAxMDApKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbWFyayB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0ucmVzZXQoKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbSNyZXNldCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlc2V0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbS5yZXNldCgpCiAKLQkJdHJ5IHsKLQkJCWxuaXMubWFyayg0MCk7Ci0JCQlsbmlzLnNraXAoNCk7Ci0JCQlsbmlzLnJlc2V0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZXNldCIsIDAsIGxuaXMuZ2V0TGluZU51bWJlcigpKTsKLQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHJlc2V0IiwgJzAnLCBsbmlzLnJlYWQoKSk7Ci0JCQlsbmlzLnJlc2V0KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbWFyayB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkvLyBzZWUgY29tbWVudCBmb3Igc2V0dXAKLQkJdHJ5IHsKLQkJCWxuaXMubWFyayg1KTsKLQkJCWxuaXMuc2tpcCgxMDApOwotCQkJbG5pcy5yZXNldCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDb3JyZWN0IG1hcmsgaGFzIGJlZW4gaW52YWxpZGF0ZWQKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gaW52YWxpZGF0ZSBtYXJrIik7Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG5pcy5tYXJrKDQwKTsKKyAgICAgICAgICAgIGxuaXMuc2tpcCg0KTsKKyAgICAgICAgICAgIGxuaXMucmVzZXQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHJlc2V0IiwgMCwgbG5pcy5nZXRMaW5lTnVtYmVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVzZXQiLCAnMCcsIGxuaXMucmVhZCgpKTsKKyAgICAgICAgICAgIGxuaXMucmVzZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIC8vIHNlZSBjb21tZW50IGZvciBzZXR1cAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG5pcy5tYXJrKDUpOworICAgICAgICAgICAgbG5pcy5za2lwKDEwMCk7CisgICAgICAgICAgICBsbmlzLnJlc2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENvcnJlY3QgbWFyayBoYXMgYmVlbiBpbnZhbGlkYXRlZAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBpbnZhbGlkYXRlIG1hcmsiKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0jc2V0TGluZU51bWJlcihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lTnVtYmVySSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0uc2V0TGluZU51bWJlcihpbnQpCi0JCWxuaXMuc2V0TGluZU51bWJlcig4OSk7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBsaW5lIG51bWJlciIsIDg5LCBsbmlzLmdldExpbmVOdW1iZXIoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbSNzZXRMaW5lTnVtYmVyKGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0TGluZU51bWJlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lTnVtYmVySSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW0uc2V0TGluZU51bWJlcihpbnQpCisgICAgICAgIGxuaXMuc2V0TGluZU51bWJlcig4OSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBsaW5lIG51bWJlciIsIDg5LCBsbmlzLmdldExpbmVOdW1iZXIoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbS5za2lwKGxvbmcpCi0JCXRyeSB7Ci0JCQlsbmlzLnNraXAoNCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlNraXAgZmFpbGVkIHRvIGluY3JlbWVudCBsaW5lTnVtYmVyIiwgMiwgbG5pcwotCQkJCQkuZ2V0TGluZU51bWJlcigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBza2lwIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbSNza2lwKGxvbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNraXAiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLkxpbmVOdW1iZXJJbnB1dFN0cmVhbS5za2lwKGxvbmcpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsbmlzLnNraXAoNCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNraXAgZmFpbGVkIHRvIGluY3JlbWVudCBsaW5lTnVtYmVyIiwgMiwgbG5pcworICAgICAgICAgICAgICAgICAgICAuZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBza2lwIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCS8qCi0JCSAqIEluIG9yZGVyIGZvciBJT0V4Y2VwdGlvbiB0byBiZSB0aHJvd24gaW4gcmVzZXQoKSx0aGUgaW5wdXRTdHJlYW0gdG8KLQkJICogdGhlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBhIGJ5dGVBcnJheUlucHV0c3RyZWFtIGJlY2F1c2UgdGhlIHJlc2V0KCkKLQkJICogaW4gYnl0ZUFycmF5SW5wdXRTdHJlYW0gZG9lcyBub3QgdGhyb3cgSU9FeGNlcHRpb24uIFdoZW4KLQkJICogQnVmZmVyZWRJbnB1dFN0cmVhbSBpcyB1c2VkLCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG11c3QgYmUgc21hbGxlcgotCQkgKiB0aGFuIHRoZSByZWFkbGltaXQgaW4gbWFyayBpbm9yZGVyIGZvciBJT0V4Y2VwdGlvbiB0byBiZSB0aHJvd24KLQkJICovCi0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYnVmdGVtcCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpLCA0KTsKLQkJbG5pcyA9IG5ldyBMaW5lTnVtYmVySW5wdXRTdHJlYW0oYnVmdGVtcCk7Ci0JCWxuaXMyID0gbmV3IExpbmVOdW1iZXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZG9zVGV4dAotCQkJCS5nZXRCeXRlcygpKSk7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAvKgorICAgICAgICAgKiBJbiBvcmRlciBmb3IgSU9FeGNlcHRpb24gdG8gYmUgdGhyb3duIGluIHJlc2V0KCksdGhlIGlucHV0U3RyZWFtIHRvCisgICAgICAgICAqIHRoZSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgYSBieXRlQXJyYXlJbnB1dHN0cmVhbSBiZWNhdXNlIHRoZSByZXNldCgpCisgICAgICAgICAqIGluIGJ5dGVBcnJheUlucHV0U3RyZWFtIGRvZXMgbm90IHRocm93IElPRXhjZXB0aW9uLiBXaGVuCisgICAgICAgICAqIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaXMgdXNlZCwgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHNtYWxsZXIKKyAgICAgICAgICogdGhhbiB0aGUgcmVhZGxpbWl0IGluIG1hcmsgaW5vcmRlciBmb3IgSU9FeGNlcHRpb24gdG8gYmUgdGhyb3duCisgICAgICAgICAqLworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJ1ZnRlbXAgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygpKSwgNCk7CisgICAgICAgIGxuaXMgPSBuZXcgTGluZU51bWJlcklucHV0U3RyZWFtKGJ1ZnRlbXApOworICAgICAgICBsbmlzMiA9IG5ldyBMaW5lTnVtYmVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRvc1RleHQKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSkpOworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vTGluZU51bWJlclJlYWRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9MaW5lTnVtYmVyUmVhZGVyVGVzdC5qYXZhCmluZGV4IDUyZjg2ZjguLjAxYzQ5Y2QgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9MaW5lTnVtYmVyUmVhZGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9MaW5lTnVtYmVyUmVhZGVyVGVzdC5qYXZhCkBAIC0xNywxODkgKzE3LDI2NSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogCitAVGVzdFRhcmdldENsYXNzKExpbmVOdW1iZXJSZWFkZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIExpbmVOdW1iZXJSZWFkZXJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCVN0cmluZyB0ZXh0ID0gIjBcbjFcbjJcbjNcbjRcbjVcbjZcbjdcbjhcbjlcbjEwXG4xMVxuMTJcbjEzXG4xNFxuMTVcbjE2XG4xN1xuMThcbjE5XG4yMFxuMjFcbjIyXG4yM1xuMjRcbjI1XG4yNlxuMjdcbjI4XG4yOVxuMzBcbjMxXG4zMlxuMzNcbjM0XG4zNVxuMzZcbjM3XG4zOFxuMzlcbjQwXG40MVxuNDJcbjQzXG40NFxuNDVcbjQ2XG40N1xuNDhcbjQ5XG41MFxuNTFcbjUyXG41M1xuNTRcbjU1XG41NlxuNTdcbjU4XG41OVxuNjBcbjYxXG42MlxuNjNcbjY0XG42NVxuNjZcbjY3XG42OFxuNjlcbjcwXG43MVxuNzJcbjczXG43NFxuNzVcbjc2XG43N1xuNzhcbjc5XG44MFxuODFcbjgyXG44M1xuODRcbjg1XG44NlxuODdcbjg4XG44OVxuOTBcbjkxXG45MlxuOTNcbjk0XG45NVxuOTZcbjk3XG45OFxuOTlcbjEwMFxuMTAxXG4xMDJcbjEwM1xuMTA0XG4xMDVcbjEwNlxuMTA3XG4xMDhcbjEwOVxuMTEwXG4xMTFcbjExMlxuMTEzXG4xMTRcbjExNVxuMTE2XG4xMTdcbjExOFxuMTE5XG4xMjBcbjEyMVxuMTIyXG4xMjNcbjEyNFxuMTI1XG4xMjZcbjEyN1xuMTI4XG4xMjlcbjEzMFxuMTMxXG4xMzJcbjEzM1xuMTM0XG4xMzVcbjEzNlxuMTM3XG4xMzhcbjEzOVxuMTQwXG4xNDFcbjE0MlxuMTQzXG4xNDRcbjE0NVxuMTQ2XG4xNDdcbjE0OFxuMTQ5XG4xNTBcbjE1MVxuMTUyXG4xNTNcbjE1NFxuMTU1XG4xNTZcbjE1N1xuMTU4XG4xNTlcbjE2MFxuMTYxXG4xNjJcbjE2M1xuMTY0XG4xNjVcbjE2NlxuMTY3XG4xNjhcbjE2OVxuMTcwXG4xNzFcbjE3MlxuMTczXG4xNzRcbjE3NVxuMTc2XG4xNzdcbjE3OFxuMTc5XG4xODBcbjE4MVxuMTgyXG4xODNcbjE4NFxuMTg1XG4xODZcbjE4N1xuMTg4XG4xODlcbjE5MFxuMTkxXG4xOTJcbjE5M1xuMTk0XG4xOTVcbjE5NlxuMTk3XG4xOThcbjE5OVxuMjAwXG4yMDFcbjIwMlxuMjAzXG4yMDRcbjIwNVxuMjA2XG4yMDdcbjIwOFxuMjA5XG4yMTBcbjIxMVxuMjEyXG4yMTNcbjIxNFxuMjE1XG4yMTZcbjIxN1xuMjE4XG4yMTlcbjIyMFxuMjIxXG4yMjJcbjIyM1xuMjI0XG4yMjVcbjIyNlxuMjI3XG4yMjhcbjIyOVxuMjMwXG4yMzFcbjIzMlxuMjMzXG4yMzRcbjIzNVxuMjM2XG4yMzdcbjIzOFxuMjM5XG4yNDBcbjI0MVxuMjQyXG4yNDNcbjI0NFxuMjQ1XG4yNDZcbjI0N1xuMjQ4XG4yNDlcbjI1MFxuMjUxXG4yNTJcbjI1M1xuMjU0XG4yNTVcbjI1NlxuMjU3XG4yNThcbjI1OVxuMjYwXG4yNjFcbjI2MlxuMjYzXG4yNjRcbjI2NVxuMjY2XG4yNjdcbjI2OFxuMjY5XG4yNzBcbjI3MVxuMjcyXG4yNzNcbjI3NFxuMjc1XG4yNzZcbjI3N1xuMjc4XG4yNzlcbjI4MFxuMjgxXG4yODJcbjI4M1xuMjg0XG4yODVcbjI4NlxuMjg3XG4yODhcbjI4OVxuMjkwXG4yOTFcbjI5MlxuMjkzXG4yOTRcbjI5NVxuMjk2XG4yOTdcbjI5OFxuMjk5XG4zMDBcbjMwMVxuMzAyXG4zMDNcbjMwNFxuMzA1XG4zMDZcbjMwN1xuMzA4XG4zMDlcbjMxMFxuMzExXG4zMTJcbjMxM1xuMzE0XG4zMTVcbjMxNlxuMzE3XG4zMThcbjMxOVxuMzIwXG4zMjFcbjMyMlxuMzIzXG4zMjRcbjMyNVxuMzI2XG4zMjdcbjMyOFxuMzI5XG4zMzBcbjMzMVxuMzMyXG4zMzNcbjMzNFxuMzM1XG4zMzZcbjMzN1xuMzM4XG4zMzlcbjM0MFxuMzQxXG4zNDJcbjM0M1xuMzQ0XG4zNDVcbjM0NlxuMzQ3XG4zNDhcbjM0OVxuMzUwXG4zNTFcbjM1MlxuMzUzXG4zNTRcbjM1NVxuMzU2XG4zNTdcbjM1OFxuMzU5XG4zNjBcbjM2MVxuMzYyXG4zNjNcbjM2NFxuMzY1XG4zNjZcbjM2N1xuMzY4XG4zNjlcbjM3MFxuMzcxXG4zNzJcbjM3M1xuMzc0XG4zNzVcbjM3NlxuMzc3XG4zNzhcbjM3OVxuMzgwXG4zODFcbjM4MlxuMzgzXG4zODRcbjM4NVxuMzg2XG4zODdcbjM4OFxuMzg5XG4zOTBcbjM5MVxuMzkyXG4zOTNcbjM5NFxuMzk1XG4zOTZcbjM5N1xuMzk4XG4zOTlcbjQwMFxuNDAxXG40MDJcbjQwM1xuNDA0XG40MDVcbjQwNlxuNDA3XG40MDhcbjQwOVxuNDEwXG40MTFcbjQxMlxuNDEzXG40MTRcbjQxNVxuNDE2XG40MTdcbjQxOFxuNDE5XG40MjBcbjQyMVxuNDIyXG40MjNcbjQyNFxuNDI1XG40MjZcbjQyN1xuNDI4XG40MjlcbjQzMFxuNDMxXG40MzJcbjQzM1xuNDM0XG40MzVcbjQzNlxuNDM3XG40MzhcbjQzOVxuNDQwXG40NDFcbjQ0MlxuNDQzXG40NDRcbjQ0NVxuNDQ2XG40NDdcbjQ0OFxuNDQ5XG40NTBcbjQ1MVxuNDUyXG40NTNcbjQ1NFxuNDU1XG40NTZcbjQ1N1xuNDU4XG40NTlcbjQ2MFxuNDYxXG40NjJcbjQ2M1xuNDY0XG40NjVcbjQ2NlxuNDY3XG40NjhcbjQ2OVxuNDcwXG40NzFcbjQ3MlxuNDczXG40NzRcbjQ3NVxuNDc2XG40NzdcbjQ3OFxuNDc5XG40ODBcbjQ4MVxuNDgyXG40ODNcbjQ4NFxuNDg1XG40ODZcbjQ4N1xuNDg4XG40ODlcbjQ5MFxuNDkxXG40OTJcbjQ5M1xuNDk0XG40OTVcbjQ5NlxuNDk3XG40OThcbjQ5OVxuNTAwXG4iOworICAgIFN0cmluZyB0ZXh0ID0gIjBcbjFcbjJcbjNcbjRcbjVcbjZcbjdcbjhcbjlcbjEwXG4xMVxuMTJcbjEzXG4xNFxuMTVcbjE2XG4xN1xuMThcbjE5XG4yMFxuMjFcbjIyXG4yM1xuMjRcbjI1XG4yNlxuMjdcbjI4XG4yOVxuMzBcbjMxXG4zMlxuMzNcbjM0XG4zNVxuMzZcbjM3XG4zOFxuMzlcbjQwXG40MVxuNDJcbjQzXG40NFxuNDVcbjQ2XG40N1xuNDhcbjQ5XG41MFxuNTFcbjUyXG41M1xuNTRcbjU1XG41NlxuNTdcbjU4XG41OVxuNjBcbjYxXG42MlxuNjNcbjY0XG42NVxuNjZcbjY3XG42OFxuNjlcbjcwXG43MVxuNzJcbjczXG43NFxuNzVcbjc2XG43N1xuNzhcbjc5XG44MFxuODFcbjgyXG44M1xuODRcbjg1XG44NlxuODdcbjg4XG44OVxuOTBcbjkxXG45MlxuOTNcbjk0XG45NVxuOTZcbjk3XG45OFxuOTlcbjEwMFxuMTAxXG4xMDJcbjEwM1xuMTA0XG4xMDVcbjEwNlxuMTA3XG4xMDhcbjEwOVxuMTEwXG4xMTFcbjExMlxuMTEzXG4xMTRcbjExNVxuMTE2XG4xMTdcbjExOFxuMTE5XG4xMjBcbjEyMVxuMTIyXG4xMjNcbjEyNFxuMTI1XG4xMjZcbjEyN1xuMTI4XG4xMjlcbjEzMFxuMTMxXG4xMzJcbjEzM1xuMTM0XG4xMzVcbjEzNlxuMTM3XG4xMzhcbjEzOVxuMTQwXG4xNDFcbjE0MlxuMTQzXG4xNDRcbjE0NVxuMTQ2XG4xNDdcbjE0OFxuMTQ5XG4xNTBcbjE1MVxuMTUyXG4xNTNcbjE1NFxuMTU1XG4xNTZcbjE1N1xuMTU4XG4xNTlcbjE2MFxuMTYxXG4xNjJcbjE2M1xuMTY0XG4xNjVcbjE2NlxuMTY3XG4xNjhcbjE2OVxuMTcwXG4xNzFcbjE3MlxuMTczXG4xNzRcbjE3NVxuMTc2XG4xNzdcbjE3OFxuMTc5XG4xODBcbjE4MVxuMTgyXG4xODNcbjE4NFxuMTg1XG4xODZcbjE4N1xuMTg4XG4xODlcbjE5MFxuMTkxXG4xOTJcbjE5M1xuMTk0XG4xOTVcbjE5NlxuMTk3XG4xOThcbjE5OVxuMjAwXG4yMDFcbjIwMlxuMjAzXG4yMDRcbjIwNVxuMjA2XG4yMDdcbjIwOFxuMjA5XG4yMTBcbjIxMVxuMjEyXG4yMTNcbjIxNFxuMjE1XG4yMTZcbjIxN1xuMjE4XG4yMTlcbjIyMFxuMjIxXG4yMjJcbjIyM1xuMjI0XG4yMjVcbjIyNlxuMjI3XG4yMjhcbjIyOVxuMjMwXG4yMzFcbjIzMlxuMjMzXG4yMzRcbjIzNVxuMjM2XG4yMzdcbjIzOFxuMjM5XG4yNDBcbjI0MVxuMjQyXG4yNDNcbjI0NFxuMjQ1XG4yNDZcbjI0N1xuMjQ4XG4yNDlcbjI1MFxuMjUxXG4yNTJcbjI1M1xuMjU0XG4yNTVcbjI1NlxuMjU3XG4yNThcbjI1OVxuMjYwXG4yNjFcbjI2MlxuMjYzXG4yNjRcbjI2NVxuMjY2XG4yNjdcbjI2OFxuMjY5XG4yNzBcbjI3MVxuMjcyXG4yNzNcbjI3NFxuMjc1XG4yNzZcbjI3N1xuMjc4XG4yNzlcbjI4MFxuMjgxXG4yODJcbjI4M1xuMjg0XG4yODVcbjI4NlxuMjg3XG4yODhcbjI4OVxuMjkwXG4yOTFcbjI5MlxuMjkzXG4yOTRcbjI5NVxuMjk2XG4yOTdcbjI5OFxuMjk5XG4zMDBcbjMwMVxuMzAyXG4zMDNcbjMwNFxuMzA1XG4zMDZcbjMwN1xuMzA4XG4zMDlcbjMxMFxuMzExXG4zMTJcbjMxM1xuMzE0XG4zMTVcbjMxNlxuMzE3XG4zMThcbjMxOVxuMzIwXG4zMjFcbjMyMlxuMzIzXG4zMjRcbjMyNVxuMzI2XG4zMjdcbjMyOFxuMzI5XG4zMzBcbjMzMVxuMzMyXG4zMzNcbjMzNFxuMzM1XG4zMzZcbjMzN1xuMzM4XG4zMzlcbjM0MFxuMzQxXG4zNDJcbjM0M1xuMzQ0XG4zNDVcbjM0NlxuMzQ3XG4zNDhcbjM0OVxuMzUwXG4zNTFcbjM1MlxuMzUzXG4zNTRcbjM1NVxuMzU2XG4zNTdcbjM1OFxuMzU5XG4zNjBcbjM2MVxuMzYyXG4zNjNcbjM2NFxuMzY1XG4zNjZcbjM2N1xuMzY4XG4zNjlcbjM3MFxuMzcxXG4zNzJcbjM3M1xuMzc0XG4zNzVcbjM3NlxuMzc3XG4zNzhcbjM3OVxuMzgwXG4zODFcbjM4MlxuMzgzXG4zODRcbjM4NVxuMzg2XG4zODdcbjM4OFxuMzg5XG4zOTBcbjM5MVxuMzkyXG4zOTNcbjM5NFxuMzk1XG4zOTZcbjM5N1xuMzk4XG4zOTlcbjQwMFxuNDAxXG40MDJcbjQwM1xuNDA0XG40MDVcbjQwNlxuNDA3XG40MDhcbjQwOVxuNDEwXG40MTFcbjQxMlxuNDEzXG40MTRcbjQxNVxuNDE2XG40MTdcbjQxOFxuNDE5XG40MjBcbjQyMVxuNDIyXG40MjNcbjQyNFxuNDI1XG40MjZcbjQyN1xuNDI4XG40MjlcbjQzMFxuNDMxXG40MzJcbjQzM1xuNDM0XG40MzVcbjQzNlxuNDM3XG40MzhcbjQzOVxuNDQwXG40NDFcbjQ0MlxuNDQzXG40NDRcbjQ0NVxuNDQ2XG40NDdcbjQ0OFxuNDQ5XG40NTBcbjQ1MVxuNDUyXG40NTNcbjQ1NFxuNDU1XG40NTZcbjQ1N1xuNDU4XG40NTlcbjQ2MFxuNDYxXG40NjJcbjQ2M1xuNDY0XG40NjVcbjQ2NlxuNDY3XG40NjhcbjQ2OVxuNDcwXG40NzFcbjQ3MlxuNDczXG40NzRcbjQ3NVxuNDc2XG40NzdcbjQ3OFxuNDc5XG40ODBcbjQ4MVxuNDgyXG40ODNcbjQ4NFxuNDg1XG40ODZcbjQ4N1xuNDg4XG40ODlcbjQ5MFxuNDkxXG40OTJcbjQ5M1xuNDk0XG40OTVcbjQ5NlxuNDk3XG40OThcbjQ5OVxuNTAwXG4iOwogCi0JTGluZU51bWJlclJlYWRlciBsbnI7CisgICAgTGluZU51bWJlclJlYWRlciBsbnI7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyI0xpbmVOdW1iZXJSZWFkZXIoamF2YS5pby5SZWFkZXIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uTGluZU51bWJlclJlYWRlcihqYXZhLmlvLlJlYWRlcikKLQkJbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSwgNDA5Mik7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIGNyZWF0ZSByZWFkZXIiLCAwLCBsbnIuZ2V0TGluZU51bWJlcigpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNMaW5lTnVtYmVyUmVhZGVyKGphdmEuaW8uUmVhZGVyKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJMaW5lTnVtYmVyUmVhZGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUmVhZGVyLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19SZWFkZXIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIoamF2YS5pby5SZWFkZXIpCisgICAgICAgIGxuciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGV4dCksIDQwOTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBjcmVhdGUgcmVhZGVyIiwgMCwgbG5yLmdldExpbmVOdW1iZXIoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNMaW5lTnVtYmVyUmVhZGVyKGphdmEuaW8uUmVhZGVyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlckkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIoamF2YS5pby5SZWFkZXIsIGludCkKLQkJbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIGNyZWF0ZSByZWFkZXIiLCAwLCBsbnIuZ2V0TGluZU51bWJlcigpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNMaW5lTnVtYmVyUmVhZGVyKGphdmEuaW8uUmVhZGVyLCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIkxpbmVOdW1iZXJSZWFkZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5SZWFkZXIuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fUmVhZGVySSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uTGluZU51bWJlclJlYWRlcihqYXZhLmlvLlJlYWRlciwgaW50KQorICAgICAgICBsbnIgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHRleHQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gY3JlYXRlIHJlYWRlciIsIDAsIGxuci5nZXRMaW5lTnVtYmVyKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIjZ2V0TGluZU51bWJlcigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lTnVtYmVyKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uTGluZU51bWJlclJlYWRlci5nZXRMaW5lTnVtYmVyKCkKLQkJbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7Ci0JCWFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyLS1leHBlY3RlZCAwLCBnb3QgIiwgMCwgbG5yCi0JCQkJLmdldExpbmVOdW1iZXIoKSk7Ci0JCXRyeSB7Ci0JCQlsbnIucmVhZExpbmUoKTsKLQkJCWxuci5yZWFkTGluZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGdldExpbmVOdW1iZXJUZXN0OiAiICsgZS50b1N0cmluZygpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbGluZSBudW1iZXItLWV4cGVjdGVkIDIsIGdvdDogIgotCQkJCSsgbG5yLmdldExpbmVOdW1iZXIoKSwgbG5yLmdldExpbmVOdW1iZXIoKSA9PSAyKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNnZXRMaW5lTnVtYmVyKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TGluZU51bWJlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lTnVtYmVyKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uTGluZU51bWJlclJlYWRlci5nZXRMaW5lTnVtYmVyKCkKKyAgICAgICAgbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyLS1leHBlY3RlZCAwLCBnb3QgIiwgMCwgbG5yCisgICAgICAgICAgICAgICAgLmdldExpbmVOdW1iZXIoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsbnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGxuci5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGdldExpbmVOdW1iZXJUZXN0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbGluZSBudW1iZXItLWV4cGVjdGVkIDIsIGdvdDogIgorICAgICAgICAgICAgICAgICsgbG5yLmdldExpbmVOdW1iZXIoKSwgbG5yLmdldExpbmVOdW1iZXIoKSA9PSAyKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyI21hcmsoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbWFya0koKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uTGluZU51bWJlclJlYWRlci5tYXJrKGludCkKLQkJbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7Ci0JCVN0cmluZyBsaW5lOwotCQl0cnkgewotCQkJbG5yLnNraXAoODApOwotCQkJbG5yLm1hcmsoMTAwKTsKLQkJCWxpbmUgPSBsbnIucmVhZExpbmUoKTsKLQkJCWxuci5yZXNldCgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJldHVybiB0byBtYXJrZWQgcG9zaXRpb24iLCBsaW5lLmVxdWFscyhsbnIKLQkJCQkJLnJlYWRMaW5lKCkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBtYXJrIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNtYXJrKGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWFyayIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyLm1hcmsoaW50KQorICAgICAgICBsbnIgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHRleHQpKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsbnIuc2tpcCg4MCk7CisgICAgICAgICAgICBsbnIubWFyaygxMDApOworICAgICAgICAgICAgbGluZSA9IGxuci5yZWFkTGluZSgpOworICAgICAgICAgICAgbG5yLnJlc2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmV0dXJuIHRvIG1hcmtlZCBwb3NpdGlvbiIsIGxpbmUuZXF1YWxzKGxucgorICAgICAgICAgICAgICAgICAgICAucmVhZExpbmUoKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCQkvLyBUaGUgc3BlYyBkb2VzIG5vdCBzYXkgdGhlIG1hcmsgaGFzIHRvIGJlIGludmFsaWRhdGVkCi0JfQorICAgICAgICAvLyBUaGUgc3BlYyBkb2VzIG5vdCBzYXkgdGhlIG1hcmsgaGFzIHRvIGJlIGludmFsaWRhdGVkCisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyLnJlYWQoKQotCQlsbnIgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHRleHQpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyI3JlYWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uTGluZU51bWJlclJlYWRlci5yZWFkKCkKKyAgICAgICAgbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7CiAKLQkJdHJ5IHsKLQkJCWludCBjID0gbG5yLnJlYWQoKTsKLQkJCWFzc2VydEVxdWFscygiUmVhZCByZXR1cm5lZCBpbmNvcnJlY3QgY2hhcmFjdGVyIiwgJzAnLCBjKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQlsbnIucmVhZCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJSZWFkIGZhaWxlZCB0byBpbmMgbGluZU51bWJlciIsCi0JCQkJCTEsIGxuci5nZXRMaW5lTnVtYmVyKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdDoiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgYyA9IGxuci5yZWFkKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXJhY3RlciIsICcwJywgYyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG5yLnJlYWQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVhZCBmYWlsZWQgdG8gaW5jIGxpbmVOdW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAxLCBsbnIuZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3Q6IiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIjcmVhZChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyLnJlYWQoY2hhciBbXSwgaW50LCBpbnQpCi0JCWxuciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGV4dCkpOwotCQljaGFyW10gYyA9IG5ldyBjaGFyWzEwMF07Ci0JCXRyeSB7Ci0JCQlsbnIucmVhZChjLCAwLCA0KTsKLQkJCWFzc2VydFRydWUoIlJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXJhY3RlcnMiLCAiMFxuMVxuIgotCQkJCQkuZXF1YWxzKG5ldyBTdHJpbmcoYywgMCwgNCkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiUmVhZCBmYWlsZWQgdG8gaW5jIGxpbmVOdW1iZXIiLCAyLCBsbnIuZ2V0TGluZU51bWJlcigpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIucmVhZChjaGFyIFtdLCBpbnQsIGludCkKKyAgICAgICAgbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7CisgICAgICAgIGNoYXJbXSBjID0gbmV3IGNoYXJbMTAwXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxuci5yZWFkKGMsIDAsIDQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVhZCByZXR1cm5lZCBpbmNvcnJlY3QgY2hhcmFjdGVycyIsICIwXG4xXG4iCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV3IFN0cmluZyhjLCAwLCA0KSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWFkIGZhaWxlZCB0byBpbmMgbGluZU51bWJlciIsIDIsIGxuci5nZXRMaW5lTnVtYmVyKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIjcmVhZExpbmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZExpbmUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uTGluZU51bWJlclJlYWRlci5yZWFkTGluZSgpCi0JCWxuciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGV4dCkpOwotCQlhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBsaW5lIG51bWJlciIsIDAsIGxuci5nZXRMaW5lTnVtYmVyKCkpOwotCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlsbnIucmVhZExpbmUoKTsKLQkJCWxpbmUgPSBsbnIucmVhZExpbmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRMaW5lTnVtYmVyVGVzdDogIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc3RyaW5nIiwgIjEiLCBsaW5lKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIDoiICsgbG5yLmdldExpbmVOdW1iZXIoKSwKLQkJCQlsbnIuZ2V0TGluZU51bWJlcigpID09IDIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyI3JlYWRMaW5lKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZExpbmUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTGluZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyLnJlYWRMaW5lKCkKKyAgICAgICAgbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIiwgMCwgbG5yLmdldExpbmVOdW1iZXIoKSk7CisgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxuci5yZWFkTGluZSgpOworICAgICAgICAgICAgbGluZSA9IGxuci5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGdldExpbmVOdW1iZXJUZXN0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBzdHJpbmciLCAiMSIsIGxpbmUpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbGluZSBudW1iZXIgOiIgKyBsbnIuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgIGxuci5nZXRMaW5lTnVtYmVyKCkgPT0gMik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyLnJlc2V0KCkKLQkJbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7Ci0JCWFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIiwgMCwgbG5yLmdldExpbmVOdW1iZXIoKSk7Ci0JCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxuci5tYXJrKDEwMCk7Ci0JCQlsbnIucmVhZExpbmUoKTsKLQkJCWxuci5yZXNldCgpOwotCQkJbGluZSA9IGxuci5yZWFkTGluZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGdldExpbmVOdW1iZXJUZXN0OiAiICsgZS50b1N0cmluZygpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZXNldCByZWFkZXIiLCAiMCIsIGxpbmUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyI3Jlc2V0KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVzZXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIucmVzZXQoKQorICAgICAgICBsbnIgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHRleHQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgbGluZSBudW1iZXIiLCAwLCBsbnIuZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG5yLm1hcmsoMTAwKTsKKyAgICAgICAgICAgIGxuci5yZWFkTGluZSgpOworICAgICAgICAgICAgbG5yLnJlc2V0KCk7CisgICAgICAgICAgICBsaW5lID0gbG5yLnJlYWRMaW5lKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0TGluZU51bWJlclRlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHJlc2V0IHJlYWRlciIsICIwIiwgbGluZSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNzZXRMaW5lTnVtYmVyKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldExpbmVOdW1iZXJJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIuc2V0TGluZU51bWJlcihpbnQpCi0JCWxuciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGV4dCkpOwotCQlsbnIuc2V0TGluZU51bWJlcigxMDAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIiwgMTAwMSwgbG5yLmdldExpbmVOdW1iZXIoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIjc2V0TGluZU51bWJlcihpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldExpbmVOdW1iZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExpbmVOdW1iZXJJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIuc2V0TGluZU51bWJlcihpbnQpCisgICAgICAgIGxuciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGV4dCkpOworICAgICAgICBsbnIuc2V0TGluZU51bWJlcigxMDAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIiwgMTAwMSwgbG5yLmdldExpbmVOdW1iZXIoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTGluZU51bWJlclJlYWRlciNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9za2lwSigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyLnNraXAobG9uZykKLQkJbG5yID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7Ci0JCWNoYXJbXSBjID0gbmV3IGNoYXJbMTAwXTsKLQkJdHJ5IHsKLQkJCWxuci5za2lwKDgwKTsKLQkJCWxuci5yZWFkKGMsIDAsIDEwMCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2tpcCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gc2tpcCB0byBjb3JyZWN0IHBvc2l0aW9uIiwgdGV4dAotCQkJCS5zdWJzdHJpbmcoODAsIDE4MCkuZXF1YWxzKG5ldyBTdHJpbmcoYywgMCwgYy5sZW5ndGgpKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXIjc2tpcChsb25nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJza2lwIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcEooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uTGluZU51bWJlclJlYWRlci5za2lwKGxvbmcpCisgICAgICAgIGxuciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGV4dCkpOworICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyWzEwMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsbnIuc2tpcCg4MCk7CisgICAgICAgICAgICBsbnIucmVhZChjLCAwLCAxMDApOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNraXAgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNraXAgdG8gY29ycmVjdCBwb3NpdGlvbiIsIHRleHQKKyAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDgwLCAxODApLmVxdWFscyhuZXcgU3RyaW5nKGMsIDAsIGMubGVuZ3RoKSkpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL05vdEFjdGl2ZUV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9Ob3RBY3RpdmVFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggYzcyMzdmMS4uNWU3OWY5YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL05vdEFjdGl2ZUV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vTm90QWN0aXZlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw0MiArMTcsNjIgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk5vdEFjdGl2ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKIAorQFRlc3RUYXJnZXRDbGFzcyhOb3RBY3RpdmVFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIE5vdEFjdGl2ZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTm90QWN0aXZlRXhjZXB0aW9uI05vdEFjdGl2ZUV4Y2VwdGlvbigpCi0JICovCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTm90QWN0aXZlRXhjZXB0aW9uI05vdEFjdGl2ZUV4Y2VwdGlvbigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIk5vdEFjdGl2ZUV4Y2VwdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5Ob3RBY3RpdmVFeGNlcHRpb24oKQogICAgICAgICBOb3RBY3RpdmVFeGNlcHRpb24gZSA9IG5ldyBOb3RBY3RpdmVFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChlLmdldE1lc3NhZ2UoKSk7CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTm90QWN0aXZlRXhjZXB0aW9uI05vdEFjdGl2ZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uTm90QWN0aXZlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTm90QWN0aXZlRXhjZXB0aW9uI05vdEFjdGl2ZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJOb3RBY3RpdmVFeGNlcHRpb24iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uTm90QWN0aXZlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkV4Y2VwdGlvbiBtZXNzYWdlIjsKICAgICAgICAgTm90QWN0aXZlRXhjZXB0aW9uIGUgPSBuZXcgTm90QWN0aXZlRXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICAgICBhc3NlcnRTYW1lKG1lc3NhZ2UsIGUuZ2V0TWVzc2FnZSgpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL05vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAyYWNkY2Y4Li4xZmQ4MDRhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9Ob3RTZXJpYWxpemFibGVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDM5ICsxNyw1OSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb24jTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiNOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJOb3RTZXJpYWxpemFibGVFeGNlcHRpb24iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIG5zZSA9IG5ldyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbChuc2UuZ2V0TWVzc2FnZSgpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uI05vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uI05vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJOb3RTZXJpYWxpemFibGVFeGNlcHRpb24iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlRlc3QgbWVzc2FnZSI7CiAgICAgICAgIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBuc2UgPSBuZXcgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICAgICBhc3NlcnRTYW1lKG1lc3NhZ2UsIG5zZS5nZXRNZXNzYWdlKCkpOwotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA0NGZlYjkxLi42YWUwNWEyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL09iamVjdElucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtNDEsNiArNDYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoT2JqZWN0SW5wdXRTdHJlYW0uY2xhc3MpIAogcHVibGljIGNsYXNzIE9iamVjdElucHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBpbXBsZW1lbnRzCiAgICAgICAgIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTExNyw2ICsxMjMsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkT2JqZWN0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZE9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRPYmplY3RNaXNzaW5nQ2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBBMSgpLCBuZXcgU2VyaWFsaXphYmxlQXNzZXJ0KCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgYXNzZXJ0RGVzZXJpYWxpemVkKFNlcmlhbGl6YWJsZSBpbml0aWFsLApAQCAtMTI5LDYgKzE0MiwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI09iamVjdElucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiT2JqZWN0SW5wdXRTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICAgIG9vcy53cml0ZURvdWJsZShEb3VibGUuTUFYX1ZBTFVFKTsKQEAgLTE0Niw2ICsxNjYsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNPYmplY3RJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkNoZWNrcyBTZWN1cml0eUV4Y2VwdGlvbiBhbmQgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJPYmplY3RJbnB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtX3N1YnRlc3QwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSB7CkBAIC0yMDEsNiArMjI4LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiYXZhaWxhYmxlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLmF2YWlsYWJsZSgpCiAgICAgICAgIG9vcy53cml0ZUJ5dGVzKCJIZWxsb1dvcmxkIik7CkBAIC0yMTMsNiArMjQ3LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jY2xvc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjbG9zZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5jbG9zZSgpCiAgICAgICAgIG9vcy53cml0ZUJ5dGVzKCJIZWxsb1dvcmxkIik7CkBAIC0yMjQsNiArMjY1LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jZGVmYXVsdFJlYWRPYmplY3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJkZWZhdWx0UmVhZE9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWZhdWx0UmVhZE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLmRlZmF1bHRSZWFkT2JqZWN0KCkKICAgICAgICAgLy8gU00uIFRoaXMgbWV0aG9kIG1heSBhcyB3ZWxsIGJlIHByaXZhdGUsIGFzIGlmIGNhbGxlZCBkaXJlY3RseSBpdApAQCAtMjQ1LDYgKzI5MywxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWQoKQogICAgICAgICBvb3Mud3JpdGUoJ1QnKTsKQEAgLTI1Nyw2ICszMTIsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sIGludCwgaW50KQogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTBdOwpAQCAtMjcyLDYgKzMzNCwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWRCb29sZWFuKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkQm9vbGVhbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkQm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0ucmVhZEJvb2xlYW4oKQogICAgICAgICBvb3Mud3JpdGVCb29sZWFuKHRydWUpOwpAQCAtMjg0LDYgKzM1MywxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWRCeXRlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkQnl0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJ5dGUgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5yZWFkQnl0ZSgpCiAgICAgICAgIG9vcy53cml0ZUJ5dGUoMTI3KTsKQEAgLTI5Niw2ICszNzIsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkQ2hhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZENoYXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgY2hhciBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWRDaGFyKCkKICAgICAgICAgb29zLndyaXRlQ2hhcignVCcpOwpAQCAtMzA4LDYgKzM5MSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWREb3VibGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWREb3VibGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0ucmVhZERvdWJsZSgpCiAgICAgICAgIG9vcy53cml0ZURvdWJsZShEb3VibGUuTUFYX1ZBTFVFKTsKQEAgLTMyMSw2ICs0MTEsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkRmllbGRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZEZpZWxkcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSRHZXRGaWVsZAogICAgICAgICAvLyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWRGaWVsZHMoKQpAQCAtMzQ4LDYgKzQ0NSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWRGbG9hdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZEZsb2F0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZmxvYXQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5yZWFkRmxvYXQoKQogICAgICAgICBvb3Mud3JpdGVGbG9hdChGbG9hdC5NQVhfVkFMVUUpOwpAQCAtMzYxLDYgKzQ2NSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZEZ1bGx5IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZEZ1bGx5JEIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWRGdWxseShieXRlIFtdKQogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTBdOwpAQCAtMzc2LDYgKzQ4NywxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWRGdWxseShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZEZ1bGx5IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkRnVsbHkkQklJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5yZWFkRnVsbHkoYnl0ZSBbXSwKICAgICAgICAgLy8gaW50LCBpbnQpCkBAIC0zOTIsNiArNTEwLDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jcmVhZEludCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkSW50IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWRJbnQoKQogICAgICAgICBvb3Mud3JpdGVJbnQoSW50ZWdlci5NQVhfVkFMVUUpOwpAQCAtNDA1LDYgKzUzMCwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWRMaW5lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZExpbmUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5yZWFkTGluZSgpCiAgICAgICAgIG9vcy53cml0ZUJ5dGVzKCJIZWxsb1dvcmxkXG5TZWNvbmRMaW5lIik7CkBAIC00MTksNiArNTUxLDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jcmVhZExvbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZExvbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5yZWFkTG9uZygpCiAgICAgICAgIG9vcy53cml0ZUxvbmcoTG9uZy5NQVhfVkFMVUUpOwpAQCAtNDMyLDYgKzU3MSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3JlYWRPYmplY3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkT2JqZWN0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWRPYmplY3QoKQpAQCAtNTE1LDEzICs2NjEsMjAgQEAKICAgICAgICAgT2JqZWN0IG8gPSBvaXMucmVhZE9iamVjdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQy5jbGFzcywgby5nZXRDbGFzcygpKTsKIAotCQkvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTg0NgorICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTg0NgogICAgICAgICBhc3NlcnROdWxsKG5ldyBPYmplY3RJbnB1dFN0cmVhbSgpIHt9LnJlYWRPYmplY3QoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jcmVhZE9iamVjdE92ZXJyaWRlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZE9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRPYmplY3RPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTg0NgogICAgICAgICBhc3NlcnROdWxsKG5ldyBPYmplY3RJbnB1dFN0cmVhbSgpIHsKQEAgLTU1MSw2ICs3MDQsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkT2JqZWN0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZE9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRPYmplY3RDb3JydXB0KCkgewogICAgICAgICBieXRlW10gYnl0ZXMgPSB7IDAwLCAwMCwgMDAsIDB4NjQsIDB4NDMsIDB4NDgsIChieXRlKSAweEZELCAweDcxLCAwMCwKICAgICAgICAgICAgICAgICAwMCwgMHgwQiwgKGJ5dGUpIDB4QjgsIDB4NEQsIDB4NjUgfTsKQEAgLTU3Myw2ICs3MzMsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkU2hvcnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZFNob3J0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHNob3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0ucmVhZFNob3J0KCkKICAgICAgICAgb29zLndyaXRlU2hvcnQoU2hvcnQuTUFYX1ZBTFVFKTsKQEAgLTU4Niw2ICs3NTMsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkVW5zaWduZWRCeXRlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRVbnNpZ25lZEJ5dGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkVW5zaWduZWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWRVbnNpZ25lZEJ5dGUoKQogICAgICAgICBvb3Mud3JpdGVCeXRlKC0xKTsKQEAgLTU5OSw2ICs3NzMsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNyZWFkVW5zaWduZWRTaG9ydCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkVW5zaWduZWRTaG9ydCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZFVuc2lnbmVkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKQogICAgICAgICBvb3Mud3JpdGVTaG9ydCgtMSk7CkBAIC02MTIsNiArNzkzLDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0jcmVhZFVURigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkVVRGIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRVVEYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnJlYWRVVEYoKQogICAgICAgICBvb3Mud3JpdGVVVEYoIkhlbGxvV29ybGQiKTsKQEAgLTYyNCw2ICs4MTIsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSNza2lwQnl0ZXMoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2tpcEJ5dGVzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9za2lwQnl0ZXNJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtLnNraXBCeXRlcyhpbnQpCiAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMF07CkBAIC02NDMsMjAgKzgzOCwyNyBAQAogICAgIH0KICAgICAKICAgICAvLyBSZWdyZXNzaW9uIFRlc3QgZm9yIEpJUkEgMjE5MgotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZE9iamVjdF93aXRoUHJpbWl0aXZlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoInRlc3Quc2VyIik7Ci0JCWZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCVRlc3QgdGVzdCA9IG5ldyBUZXN0KCk7Ci0JCU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCWZpbGUpKTsKLQkJb3V0LndyaXRlT2JqZWN0KHRlc3QpOwotCQlvdXQuY2xvc2UoKTsKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVhZE9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZE9iamVjdF93aXRoUHJpbWl0aXZlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoInRlc3Quc2VyIik7CisgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIFRlc3QgdGVzdCA9IG5ldyBUZXN0KCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIGZpbGUpKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KHRlc3QpOworICAgICAgICBvdXQuY2xvc2UoKTsKIAotCQlPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJVGVzdCBhbm90aGVyID0gKFRlc3QpIGluLnJlYWRPYmplY3QoKTsKLQkJaW4uY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlc3QsIGFub3RoZXIpOwotCX0KKyAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgIFRlc3QgYW5vdGhlciA9IChUZXN0KSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0LCBhbm90aGVyKTsKKyAgICB9CiAgICAgCiAgICAgLy9SZWdyZXNzaW9uIFRlc3QgZm9yIEpJUkEtMjI0OQogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFdyaXRlRGVzYyBleHRlbmRzCkBAIC02ODksNTQgKzg5MSw2NCBAQAogICAgIH0KICAgICAKICAgICBzdGF0aWMgY2xhc3MgVGVzdENsYXNzRm9yU2VyaWFsaXphdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCX0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgb2JqZWN0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQgY29ycmVjdGx5ICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCByZWFkaW5nIGRlc2NyaXB0b3IgZnJvbSBzZXJpYWxpemF0aW9uIHN0cmVhbS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkQ2xhc3NEZXNjcmlwdG9yIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pLAorICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWFkT2JqZWN0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ2xhc3NEZXNjcmlwdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKIAotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFdyaXRlRGVzYyBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFdyaXRlRGVzYygKLQkJCQliYW9zKTsKLQkJb29zLndyaXRlT2JqZWN0KFN0cmluZy5jbGFzcyk7Ci0JCW9vcy5jbG9zZSgpOwotCQlDbGFzcyBjbHMgPSBUZXN0Q2xhc3NGb3JTZXJpYWxpemF0aW9uLmNsYXNzOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0JCU9iamVjdEl1dHB1dFN0cmVhbVdpdGhSZWFkRGVzYyBvaXMgPSBuZXcgT2JqZWN0SXV0cHV0U3RyZWFtV2l0aFJlYWREZXNjKAotCQkJCWJhaXMsIGNscyk7Ci0JCU9iamVjdCBvYmogPSBvaXMucmVhZE9iamVjdCgpOwotCQlvaXMuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKGNscywgb2JqKTsKLQl9CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW1XaXRoV3JpdGVEZXNjIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW1XaXRoV3JpdGVEZXNjKAorICAgICAgICAgICAgICAgIGJhb3MpOworICAgICAgICBvb3Mud3JpdGVPYmplY3QoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgIENsYXNzIGNscyA9IFRlc3RDbGFzc0ZvclNlcmlhbGl6YXRpb24uY2xhc3M7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgT2JqZWN0SXV0cHV0U3RyZWFtV2l0aFJlYWREZXNjIG9pcyA9IG5ldyBPYmplY3RJdXRwdXRTdHJlYW1XaXRoUmVhZERlc2MoCisgICAgICAgICAgICAgICAgYmFpcywgY2xzKTsKKyAgICAgICAgT2JqZWN0IG9iaiA9IG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2xzLCBvYmopOworICAgIH0KICAgICAgICAgCiAKLQkvLyBSZWdyZXNzaW9uIFRlc3QgZm9yIEpJUkEtMjM0MAorICAgIC8vIFJlZ3Jlc3Npb24gVGVzdCBmb3IgSklSQS0yMzQwCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RPdXRwdXRTdHJlYW1XaXRoV3JpdGVEZXNjMSBleHRlbmRzCi0JCQlPYmplY3RPdXRwdXRTdHJlYW0gewotCQlwdWJsaWMgT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFdyaXRlRGVzYzEoT3V0cHV0U3RyZWFtIG9zKQotCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihvcyk7Ci0JCX0KKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSB7CisgICAgICAgIHB1YmxpYyBPYmplY3RPdXRwdXRTdHJlYW1XaXRoV3JpdGVEZXNjMShPdXRwdXRTdHJlYW0gb3MpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKG9zKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NEZXNjcmlwdG9yKE9iamVjdFN0cmVhbUNsYXNzIGRlc2MpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyLndyaXRlQ2xhc3NEZXNjcmlwdG9yKGRlc2MpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUNsYXNzRGVzY3JpcHRvcihPYmplY3RTdHJlYW1DbGFzcyBkZXNjKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci53cml0ZUNsYXNzRGVzY3JpcHRvcihkZXNjKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0SXV0cHV0U3RyZWFtV2l0aFJlYWREZXNjMSBleHRlbmRzCi0JCQlPYmplY3RJbnB1dFN0cmVhbSB7CQkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdEl1dHB1dFN0cmVhbVdpdGhSZWFkRGVzYzEgZXh0ZW5kcworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0geyAgICAgICAgCiAKLQkJcHVibGljIE9iamVjdEl1dHB1dFN0cmVhbVdpdGhSZWFkRGVzYzEoSW5wdXRTdHJlYW0gaXMpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyKGlzKTsJCQkKLQkJfQorICAgICAgICBwdWJsaWMgT2JqZWN0SXV0cHV0U3RyZWFtV2l0aFJlYWREZXNjMShJbnB1dFN0cmVhbSBpcykKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoaXMpOyAgICAgICAgICAgIAorICAgICAgICB9CiAKLQkJcHVibGljIE9iamVjdFN0cmVhbUNsYXNzIHJlYWRDbGFzc0Rlc2NyaXB0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQkJQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc3VwZXIucmVhZENsYXNzRGVzY3JpcHRvcigpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgT2JqZWN0U3RyZWFtQ2xhc3MgcmVhZENsYXNzRGVzY3JpcHRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5yZWFkQ2xhc3NEZXNjcmlwdG9yKCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCiAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTE5MjEKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdElucHV0U3RyZWFtV2l0aFJlc29sdmUgZXh0ZW5kcyBPYmplY3RJbnB1dFN0cmVhbSB7CkBAIC03NTMsNyArOTY1LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZUNsYXNzKGRlc2MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRPYmplY3QiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzb2x2ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLnBrZzEuVGVzdENsYXNzIHRvMSA9IG5ldyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5wa2cxLlRlc3RDbGFzcygpOwogICAgICAgICB0bzEuaSA9IDU1NTsKQEAgLTc3Miw3ICs5OTAsNyBAQAogICAgICAgICAgICAgICAgICAgICArIHRvMi5pKTsKICAgICAgICAgfQogICAgIH0KLQkKKyAgICAKICAgICBzdGF0aWMgY2xhc3MgT2JqZWN0SW5wdXRTdHJlYW1XaXRoUmVzb2x2ZU9iamVjdCBleHRlbmRzIE9iamVjdElucHV0U3RyZWFtIHsKICAgICAgICAgCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBpbnRPYmogPSBJbnRlZ2VyLnZhbHVlT2YoMTAwMCk7CkBAIC03OTMsNiArMTAxMSwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtI3Jlc29sdmVPYmplY3QoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXNvbHZlT2JqZWN0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc29sdmVPYmplY3RMamF2YV9sYW5nX09iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBXcml0ZSBhbiBJbnRlZ2VyIG9iamVjdCBpbnRvIG1lbW9yeQogICAgICAgICBJbnRlZ2VyIG9yaWdpbmFsID0gbmV3IEludGVnZXIoMTApOwpAQCAtODE0LDI0ICsxMDM5LDMxIEBACiAgICAgICAgIGFzc2VydEVxdWFscyhPYmplY3RJbnB1dFN0cmVhbVdpdGhSZXNvbHZlT2JqZWN0LmludE9iaiwgYWN0dWFsKTsKICAgICB9CiAgICAgCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkQ2xhc3NEZXNjcmlwdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlYWRDbGFzc0Rlc2NyaXB0b3IiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZENsYXNzRGVzY3JpcHRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlPYmplY3RPdXRwdXRTdHJlYW1XaXRoV3JpdGVEZXNjMSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFdyaXRlRGVzYzEoCi0JCQkJYmFvcyk7Ci0JCU9iamVjdFN0cmVhbUNsYXNzIGRlc2MgPSBPYmplY3RTdHJlYW1DbGFzcwotCQkubG9va3VwKFRlc3RDbGFzc0ZvclNlcmlhbGl6YXRpb24uY2xhc3MpOwotCQlvb3Mud3JpdGVDbGFzc0Rlc2NyaXB0b3IoZGVzYyk7Ci0JCW9vcy5jbG9zZSgpOwotCQkKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbVdpdGhXcml0ZURlc2MxIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW1XaXRoV3JpdGVEZXNjMSgKKyAgICAgICAgICAgICAgICBiYW9zKTsKKyAgICAgICAgT2JqZWN0U3RyZWFtQ2xhc3MgZGVzYyA9IE9iamVjdFN0cmVhbUNsYXNzCisgICAgICAgIC5sb29rdXAoVGVzdENsYXNzRm9yU2VyaWFsaXphdGlvbi5jbGFzcyk7CisgICAgICAgIG9vcy53cml0ZUNsYXNzRGVzY3JpcHRvcihkZXNjKTsKKyAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgIAogICAgICAgICBieXRlW10gYnl0ZXMgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQlPYmplY3RJdXRwdXRTdHJlYW1XaXRoUmVhZERlc2MxIG9pcyA9IG5ldyBPYmplY3RJdXRwdXRTdHJlYW1XaXRoUmVhZERlc2MxKAotCQkJCWJhaXMpOwotCQlPYmplY3Qgb2JqID0gb2lzLnJlYWRDbGFzc0Rlc2NyaXB0b3IoKTsKLQkJb2lzLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscyhkZXNjLmdldENsYXNzKCksIG9iai5nZXRDbGFzcygpKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7CisgICAgICAgIE9iamVjdEl1dHB1dFN0cmVhbVdpdGhSZWFkRGVzYzEgb2lzID0gbmV3IE9iamVjdEl1dHB1dFN0cmVhbVdpdGhSZWFkRGVzYzEoCisgICAgICAgICAgICAgICAgYmFpcyk7CisgICAgICAgIE9iamVjdCBvYmogPSBvaXMucmVhZENsYXNzRGVzY3JpcHRvcigpOworICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlc2MuZ2V0Q2xhc3MoKSwgb2JqLmdldENsYXNzKCkpOwogICAgICAgICAKICAgICAgICAgLy9lb2YKICAgICAgICAgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7CkBAIC04NzksNyArMTExMSw3IEBACiAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKICAgICAgICAgfQogCi0JfQorICAgIH0KICAgICAKICAgICBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uYWxCdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBlb2YgPSBmYWxzZTsKQEAgLTkxOSw2ICsxMTUxLDEzIEBACiAgICAgfQogCiAgICAgLy8gUmVncmVzc2lvbiBUZXN0IGZvciBIYXJtb255LTI0MDIKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVnaXN0ZXJWYWxpZGF0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT2JqZWN0SW5wdXRWYWxpZGF0aW9uLmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlZ2lzdGVyVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKQEAgLTk0NiwxNSArMTE4NSwxNSBAQAogCiAKIGNsYXNzIFRlc3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0JQ2xhc3MgY2xhc3Nlc1tdID0gbmV3IENsYXNzW10geyBieXRlLmNsYXNzLCBzaG9ydC5jbGFzcywgaW50LmNsYXNzLAotCQkJbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzcywgY2hhci5jbGFzcywgZmxvYXQuY2xhc3MsIGRvdWJsZS5jbGFzcyB9OworICAgIENsYXNzIGNsYXNzZXNbXSA9IG5ldyBDbGFzc1tdIHsgYnl0ZS5jbGFzcywgc2hvcnQuY2xhc3MsIGludC5jbGFzcywKKyAgICAgICAgICAgIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3MsIGNoYXIuY2xhc3MsIGZsb2F0LmNsYXNzLCBkb3VibGUuY2xhc3MgfTsKIAotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgVGVzdCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gQXJyYXlzLmVxdWFscyhjbGFzc2VzLCAoKFRlc3QpIG8pLmNsYXNzZXMpOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFRlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoY2xhc3NlcywgKChUZXN0KSBvKS5jbGFzc2VzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT2JqZWN0T3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL09iamVjdE91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA1NDg1ZjVkLi4yMjlkMWU4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT2JqZWN0T3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PYmplY3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwpAQCAtMzksNDI0ICs0NCw0MjUgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAorQFRlc3RUYXJnZXRDbGFzcyhPYmplY3RPdXRwdXRTdHJlYW0uY2xhc3MpIAogcHVibGljIGNsYXNzIE9iamVjdE91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgaW1wbGVtZW50cwotCQlTZXJpYWxpemFibGUgeworICAgICAgICBTZXJpYWxpemFibGUgewogCi0JamF2YS5pby5GaWxlIGY7CisgICAgamF2YS5pby5GaWxlIGY7CiAKLQlwdWJsaWMgY2xhc3MgU2VyaWFsaXphYmxlVGVzdEhlbHBlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBTdHJpbmcgYUZpZWxkMTsKKyAgICBwdWJsaWMgY2xhc3MgU2VyaWFsaXphYmxlVGVzdEhlbHBlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgYUZpZWxkMTsKIAotCQlwdWJsaWMgU3RyaW5nIGFGaWVsZDI7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgYUZpZWxkMjsKIAotCQlTZXJpYWxpemFibGVUZXN0SGVscGVyKCkgewotCQkJYUZpZWxkMSA9IG51bGw7Ci0JCQlhRmllbGQyID0gbnVsbDsKLQkJfQorICAgICAgICBTZXJpYWxpemFibGVUZXN0SGVscGVyKCkgeworICAgICAgICAgICAgYUZpZWxkMSA9IG51bGw7CisgICAgICAgICAgICBhRmllbGQyID0gbnVsbDsKKyAgICAgICAgfQogCi0JCVNlcmlhbGl6YWJsZVRlc3RIZWxwZXIoU3RyaW5nIHMsIFN0cmluZyB0KSB7Ci0JCQlhRmllbGQxID0gczsKLQkJCWFGaWVsZDIgPSB0OwotCQl9CisgICAgICAgIFNlcmlhbGl6YWJsZVRlc3RIZWxwZXIoU3RyaW5nIHMsIFN0cmluZyB0KSB7CisgICAgICAgICAgICBhRmllbGQxID0gczsKKyAgICAgICAgICAgIGFGaWVsZDIgPSB0OworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gb2lzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gbm90ZSBhRmllbGQyIGlzIG5vdCByZWFkCi0JCQl0cnkgewotCQkJCU9iamVjdElucHV0U3RyZWFtLkdldEZpZWxkIGZpZWxkcyA9IG9pcy5yZWFkRmllbGRzKCk7Ci0JCQkJYUZpZWxkMSA9IChTdHJpbmcpIGZpZWxkcy5nZXQoImFGaWVsZDEiLCAiWmFwIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIG9pcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIG5vdGUgYUZpZWxkMiBpcyBub3QgcmVhZAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbS5HZXRGaWVsZCBmaWVsZHMgPSBvaXMucmVhZEZpZWxkcygpOworICAgICAgICAgICAgICAgIGFGaWVsZDEgPSAoU3RyaW5nKSBmaWVsZHMuZ2V0KCJhRmllbGQxIiwgIlphcCIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb29zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gbm90ZSBhRmllbGQyIGlzIG5vdCB3cml0dGVuCi0JCQlPYmplY3RPdXRwdXRTdHJlYW0uUHV0RmllbGQgZmllbGRzID0gb29zLnB1dEZpZWxkcygpOwotCQkJZmllbGRzLnB1dCgiYUZpZWxkMSIsIGFGaWVsZDEpOwotCQkJb29zLndyaXRlRmllbGRzKCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBub3RlIGFGaWVsZDIgaXMgbm90IHdyaXR0ZW4KKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbS5QdXRGaWVsZCBmaWVsZHMgPSBvb3MucHV0RmllbGRzKCk7CisgICAgICAgICAgICBmaWVsZHMucHV0KCJhRmllbGQxIiwgYUZpZWxkMSk7CisgICAgICAgICAgICBvb3Mud3JpdGVGaWVsZHMoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dDEoKSB7Ci0JCQlyZXR1cm4gYUZpZWxkMTsKLQkJfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQxKCkgeworICAgICAgICAgICAgcmV0dXJuIGFGaWVsZDE7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBzZXRUZXh0MShTdHJpbmcgcykgewotCQkJYUZpZWxkMSA9IHM7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dDEoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGFGaWVsZDEgPSBzOworICAgICAgICB9CiAKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0MigpIHsKLQkJCXJldHVybiBhRmllbGQyOwotCQl9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dDIoKSB7CisgICAgICAgICAgICByZXR1cm4gYUZpZWxkMjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHNldFRleHQyKFN0cmluZyBzKSB7Ci0JCQlhRmllbGQyID0gczsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dDIoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGFGaWVsZDIgPSBzOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsaXphdGlvblRlc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCWludCBhbkludCA9IElOSVRfSU5UX1ZBTFVFOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbGl6YXRpb25UZXN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBpbnQgYW5JbnQgPSBJTklUX0lOVF9WQUxVRTsKIAotCQlwdWJsaWMgU2VyaWFsaXphdGlvblRlc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgU2VyaWFsaXphdGlvblRlc3QoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsaXphdGlvblRlc3RTdWJjbGFzczEgZXh0ZW5kcyBTZXJpYWxpemF0aW9uVGVzdAotCQkJaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlTdHJpbmcgYVN0cmluZyA9IElOSVRfU1RSX1ZBTFVFOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbGl6YXRpb25UZXN0U3ViY2xhc3MxIGV4dGVuZHMgU2VyaWFsaXphdGlvblRlc3QKKyAgICAgICAgICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgU3RyaW5nIGFTdHJpbmcgPSBJTklUX1NUUl9WQUxVRTsKIAotCQlwdWJsaWMgU2VyaWFsaXphdGlvblRlc3RTdWJjbGFzczEoKSB7Ci0JCQlzdXBlcigpOwotCQkJLy8gSnVzdCB0byBjaGFuZ2UgZGVmYXVsdCBzdXBlcmNsYXNzIGluaXQgdmFsdWUKLQkJCWFuSW50ID0gSU5JVF9JTlRfVkFMVUUgLyAyOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgU2VyaWFsaXphdGlvblRlc3RTdWJjbGFzczEoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgLy8gSnVzdCB0byBjaGFuZ2UgZGVmYXVsdCBzdXBlcmNsYXNzIGluaXQgdmFsdWUKKyAgICAgICAgICAgIGFuSW50ID0gSU5JVF9JTlRfVkFMVUUgLyAyOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BlY1Rlc3RTdXBlckNsYXNzIGltcGxlbWVudHMgUnVubmFibGUsIFNlcmlhbGl6YWJsZSB7Ci0JCXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGluc3RWYXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BlY1Rlc3RTdXBlckNsYXNzIGltcGxlbWVudHMgUnVubmFibGUsIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGluc3RWYXI7CiAKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGVjVGVzdCBleHRlbmRzIFNwZWNUZXN0U3VwZXJDbGFzcyBpbXBsZW1lbnRzCi0JCQlDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGluc3RWYXIxOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNwZWNUZXN0IGV4dGVuZHMgU3BlY1Rlc3RTdXBlckNsYXNzIGltcGxlbWVudHMKKyAgICAgICAgICAgIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgaW5zdFZhcjE7CiAKLQkJcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHN0YXRpY1ZhcjE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdGF0aWNWYXIxOwogCi0JCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdGF0aWNWYXIyOwotCQl7Ci0JCQlpbnN0VmFyMSA9ICJOb25TdGF0aWNJbml0aWFsVmFsdWUiOwotCQl9Ci0JCXN0YXRpYyB7Ci0JCQlzdGF0aWNWYXIxID0gIlN0YXRpY0luaXRpYWxWYWx1ZSI7Ci0JCQlzdGF0aWNWYXIxID0gbmV3IFN0cmluZyhzdGF0aWNWYXIxKTsKLQkJfQorICAgICAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc3RhdGljVmFyMjsKKyAgICAgICAgeworICAgICAgICAgICAgaW5zdFZhcjEgPSAiTm9uU3RhdGljSW5pdGlhbFZhbHVlIjsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgc3RhdGljVmFyMSA9ICJTdGF0aWNJbml0aWFsVmFsdWUiOworICAgICAgICAgICAgc3RhdGljVmFyMSA9IG5ldyBTdHJpbmcoc3RhdGljVmFyMSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgT2JqZWN0IG1ldGhvZChPYmplY3Qgb2JqUGFyYW0sIE9iamVjdCBvYmpQYXJhbTIpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIE9iamVjdCBtZXRob2QoT2JqZWN0IG9ialBhcmFtLCBPYmplY3Qgb2JqUGFyYW0yKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCgpOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gbWV0aG9kKGJvb2xlYW4gYlBhcmFtLCBPYmplY3Qgb2JqUGFyYW0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1ldGhvZChib29sZWFuIGJQYXJhbSwgT2JqZWN0IG9ialBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIG1ldGhvZChib29sZWFuIGJQYXJhbSwgT2JqZWN0IG9ialBhcmFtLCBPYmplY3Qgb2JqUGFyYW0yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBtZXRob2QoYm9vbGVhbiBiUGFyYW0sIE9iamVjdCBvYmpQYXJhbSwgT2JqZWN0IG9ialBhcmFtMikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGVjVGVzdFN1YmNsYXNzIGV4dGVuZHMgU3BlY1Rlc3QgaW1wbGVtZW50cwotCQkJU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zaWVudEluc3RWYXIgPSAidHJhbnNpZW50VmFsdWUiOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGVjVGVzdFN1YmNsYXNzIGV4dGVuZHMgU3BlY1Rlc3QgaW1wbGVtZW50cworICAgICAgICAgICAgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zaWVudEluc3RWYXIgPSAidHJhbnNpZW50VmFsdWUiOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlYWRXcml0ZU9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIGJvb2xlYW4gY2FsbGVkV3JpdGVPYmplY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWFkV3JpdGVPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbGxlZFdyaXRlT2JqZWN0ID0gZmFsc2U7CiAKLQkJcHVibGljIGJvb2xlYW4gY2FsbGVkUmVhZE9iamVjdCA9IGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYWxsZWRSZWFkT2JqZWN0ID0gZmFsc2U7CiAKLQkJcHVibGljIFJlYWRXcml0ZU9iamVjdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFJlYWRXcml0ZU9iamVjdCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWNhbGxlZFJlYWRPYmplY3QgPSB0cnVlOwotCQkJaW4ucmVhZE9iamVjdCgpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJCWNhbGxlZFdyaXRlT2JqZWN0ID0gdHJ1ZTsKLQkJCW91dC53cml0ZU9iamVjdChGT08pOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNhbGxlZFdyaXRlT2JqZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChGT08pOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHVibGljUmVhZFdyaXRlT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRXcml0ZU9iamVjdCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFB1YmxpY1JlYWRXcml0ZU9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FsbGVkV3JpdGVPYmplY3QgPSBmYWxzZTsKIAotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRSZWFkT2JqZWN0ID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbGxlZFJlYWRPYmplY3QgPSBmYWxzZTsKIAotCQlwdWJsaWMgUHVibGljUmVhZFdyaXRlT2JqZWN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgUHVibGljUmVhZFdyaXRlT2JqZWN0KCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQljYWxsZWRSZWFkT2JqZWN0ID0gdHJ1ZTsKLQkJCWluLnJlYWRPYmplY3QoKTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkJY2FsbGVkV3JpdGVPYmplY3QgPSB0cnVlOwotCQkJb3V0LndyaXRlT2JqZWN0KEZPTyk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjYWxsZWRXcml0ZU9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoRk9PKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpZWxkT3JkZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlTdHJpbmcgYWFhMU5vblByaW1pdGl2ZSA9ICJhYWExIjsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWVsZE9yZGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgU3RyaW5nIGFhYTFOb25QcmltaXRpdmUgPSAiYWFhMSI7CiAKLQkJaW50IGJiYjFQcmltaXRpdmVJbnQgPSA1OworICAgICAgICBpbnQgYmJiMVByaW1pdGl2ZUludCA9IDU7CiAKLQkJYm9vbGVhbiBhYWEyUHJpbWl0aXZlQm9vbGVhbiA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gYWFhMlByaW1pdGl2ZUJvb2xlYW4gPSB0cnVlOwogCi0JCVN0cmluZyBiYmIyTm9uUHJpbWl0aXZlID0gImJiYjIiOwotCX0KKyAgICAgICAgU3RyaW5nIGJiYjJOb25QcmltaXRpdmUgPSAiYmJiMiI7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSnVzdFJlYWRPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbGxlZFJlYWRPYmplY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKdXN0UmVhZE9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FsbGVkUmVhZE9iamVjdCA9IGZhbHNlOwogCi0JCXB1YmxpYyBKdXN0UmVhZE9iamVjdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIEp1c3RSZWFkT2JqZWN0KCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7Ci0JCQlpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNhbGxlZFJlYWRPYmplY3QgPSB0cnVlOworICAgICAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIEp1c3RXcml0ZU9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIGJvb2xlYW4gY2FsbGVkV3JpdGVPYmplY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKdXN0V3JpdGVPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbGxlZFdyaXRlT2JqZWN0ID0gZmFsc2U7CiAKLQkJcHVibGljIEp1c3RXcml0ZU9iamVjdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIEp1c3RXcml0ZU9iamVjdCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWNhbGxlZFdyaXRlT2JqZWN0ID0gdHJ1ZTsKLQkJCW91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjYWxsZWRXcml0ZU9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbGxlZFJlcGxhY2VtZW50ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYWxsZWRSZXBsYWNlbWVudCA9IGZhbHNlOwogCi0JCXB1YmxpYyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKLQkJCWNhbGxlZFJlcGxhY2VtZW50ID0gdHJ1ZTsKLQkJCXJldHVybiBGT087IC8vIFJlcGxhY2VtZW50IGlzIGEgU3RyaW5nCi0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKKyAgICAgICAgICAgIGNhbGxlZFJlcGxhY2VtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBGT087IC8vIFJlcGxhY2VtZW50IGlzIGEgU3RyaW5nCisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIGltcGxlbWVudHMKLQkJCWphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQzEgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCQlwcml2YXRlIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB7Ci0JCQkJcmV0dXJuIG5ldyBDMigpOwotCQkJfQotCQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXVsdGlwbGVDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEMxIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgc3RhdGljIGNsYXNzIEMyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQkJcHJpdmF0ZSBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgewotCQkJCXJldHVybiBuZXcgQzMoKTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDMiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgICAgIHByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEMzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDMyBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJCXByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKLQkJCQlyZXR1cm4gRk9POwotCQkJfQotCQl9CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEMzIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGT087CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgTXVsdGlwbGVDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIE11bHRpcGxlQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgewotCQkJcmV0dXJuIG5ldyBDMSgpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEMxKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZyBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZyBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZygpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCXJldHVybiBGT087IC8vIFJlcGxhY2VtZW50IGlzIGEgU3RyaW5nCi0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgeworICAgICAgICAgICAgcmV0dXJuIEZPTzsgLy8gUmVwbGFjZW1lbnQgaXMgYSBTdHJpbmcKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nVmlvbGF0ZXNGaWVsZFR5cGUKLQkJCWltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmcgY2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmcgPSBuZXcgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmcoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZ1Zpb2xhdGVzRmllbGRUeXBlCisgICAgICAgICAgICBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nID0gbmV3IENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nKCk7CiAKLQkJcHVibGljIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nVmlvbGF0ZXNGaWVsZFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmdWaW9sYXRlc0ZpZWxkVHlwZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbldoZW5EdW1waW5nIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl9OworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uV2hlbkR1bXBpbmcgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIH07CiAKLQkJcHVibGljIGJvb2xlYW4gYW5JbnN0YW5jZVZhciA9IGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbkluc3RhbmNlVmFyID0gZmFsc2U7CiAKLQkJcHVibGljIE15RXhjZXB0aW9uV2hlbkR1bXBpbmcoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBNeUV4Y2VwdGlvbldoZW5EdW1waW5nKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBNeUV4Y2VwdGlvbigpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgT2JqZWN0IGFuSW5zdGFuY2VWYXIgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgT2JqZWN0IGFuSW5zdGFuY2VWYXIgPSBuZXcgT2JqZWN0KCk7CiAKLQkJcHVibGljIE5vblNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIE5vblNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIE15VW5zZXJpYWxpemFibGVFeGNlcHRpb25XaGVuRHVtcGluZyBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCQlwcml2YXRlIE9iamVjdCBub3RTZXJpYWxpemFibGUgPSBuZXcgT2JqZWN0KCk7Ci0JCX07CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlVbnNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nIGltcGxlbWVudHMKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHByaXZhdGUgT2JqZWN0IG5vdFNlcmlhbGl6YWJsZSA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgfTsKIAotCQlwdWJsaWMgYm9vbGVhbiBhbkluc3RhbmNlVmFyID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGFuSW5zdGFuY2VWYXIgPSBmYWxzZTsKIAotCQlwdWJsaWMgTXlVbnNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgTXlVbnNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBNeUV4Y2VwdGlvbigpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2l0aFVubWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzIGltcGxlbWVudHMKLQkJCWphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCi0JCQkJInZhbHVlIiwgU3RyaW5nLmNsYXNzKSB9OworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdpdGhVbm1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcyBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsgbmV3IE9iamVjdFN0cmVhbUZpZWxkKAorICAgICAgICAgICAgICAgICJ2YWx1ZSIsIFN0cmluZy5jbGFzcykgfTsKIAotCQlwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OworICAgICAgICBwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OwogCi0JCXB1YmxpYyBXaXRoVW5tYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgV2l0aFVubWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIFdpdGhNYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7IG5ldyBPYmplY3RTdHJlYW1GaWVsZCgKLQkJCQkiYW5JbnN0YW5jZVZhciIsIFN0cmluZy5jbGFzcykgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXaXRoTWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzIGltcGxlbWVudHMKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCisgICAgICAgICAgICAgICAgImFuSW5zdGFuY2VWYXIiLCBTdHJpbmcuY2xhc3MpIH07CiAKLQkJcHVibGljIFN0cmluZyBhbkluc3RhbmNlVmFyID0gRk9PICsgRk9POworICAgICAgICBwdWJsaWMgU3RyaW5nIGFuSW5zdGFuY2VWYXIgPSBGT08gKyBGT087CiAKLQkJcHVibGljIFdpdGhNYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgV2l0aE1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcygpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNVUxBVEVEX0ZJRUxEX05BTUUgPSAidGV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsUGVyc2lzdGVudEZpZWxkcyBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVVMQVRFRF9GSUVMRF9OQU1FID0gInRleHQiOwogCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsgbmV3IE9iamVjdFN0cmVhbUZpZWxkKAotCQkJCVNJTVVMQVRFRF9GSUVMRF9OQU1FLCBTdHJpbmcuY2xhc3MpIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsgbmV3IE9iamVjdFN0cmVhbUZpZWxkKAorICAgICAgICAgICAgICAgIFNJTVVMQVRFRF9GSUVMRF9OQU1FLCBTdHJpbmcuY2xhc3MpIH07CiAKLQkJcHVibGljIGludCBhbkluc3RhbmNlVmFyID0gNTsKKyAgICAgICAgcHVibGljIGludCBhbkluc3RhbmNlVmFyID0gNTsKIAotCQlwdWJsaWMgU2VyaWFsUGVyc2lzdGVudEZpZWxkcygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFNlcmlhbFBlcnNpc3RlbnRGaWVsZHMoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlPYmplY3RJbnB1dFN0cmVhbS5HZXRGaWVsZCBmaWVsZHMgPSBpbi5yZWFkRmllbGRzKCk7Ci0JCQlhbkluc3RhbmNlVmFyID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBmaWVsZHMuZ2V0KAotCQkJCQlTSU1VTEFURURfRklFTERfTkFNRSwgIi01IikpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gaW4ucmVhZEZpZWxkcygpOworICAgICAgICAgICAgYW5JbnN0YW5jZVZhciA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgZmllbGRzLmdldCgKKyAgICAgICAgICAgICAgICAgICAgU0lNVUxBVEVEX0ZJRUxEX05BTUUsICItNSIpKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkIGZpZWxkcyA9IG91dC5wdXRGaWVsZHMoKTsKLQkJCWZpZWxkcy5wdXQoU0lNVUxBVEVEX0ZJRUxEX05BTUUsIEludGVnZXIudG9TdHJpbmcoYW5JbnN0YW5jZVZhcikpOwotCQkJb3V0LndyaXRlRmllbGRzKCk7Ci0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkIGZpZWxkcyA9IG91dC5wdXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZpZWxkcy5wdXQoU0lNVUxBVEVEX0ZJRUxEX05BTUUsIEludGVnZXIudG9TdHJpbmcoYW5JbnN0YW5jZVZhcikpOworICAgICAgICAgICAgb3V0LndyaXRlRmllbGRzKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXcml0ZUZpZWxkc1dpdGhvdXRGZXRjaGluZ1B1dEZpZWxkcyBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1VTEFURURfRklFTERfTkFNRSA9ICJ0ZXh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXcml0ZUZpZWxkc1dpdGhvdXRGZXRjaGluZ1B1dEZpZWxkcyBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1VTEFURURfRklFTERfTkFNRSA9ICJ0ZXh0IjsKIAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7IG5ldyBPYmplY3RTdHJlYW1GaWVsZCgKLQkJCQlTSU1VTEFURURfRklFTERfTkFNRSwgU3RyaW5nLmNsYXNzKSB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7IG5ldyBPYmplY3RTdHJlYW1GaWVsZCgKKyAgICAgICAgICAgICAgICBTSU1VTEFURURfRklFTERfTkFNRSwgU3RyaW5nLmNsYXNzKSB9OwogCi0JCXB1YmxpYyBpbnQgYW5JbnN0YW5jZVZhciA9IDU7CisgICAgICAgIHB1YmxpYyBpbnQgYW5JbnN0YW5jZVZhciA9IDU7CiAKLQkJcHVibGljIFdyaXRlRmllbGRzV2l0aG91dEZldGNoaW5nUHV0RmllbGRzKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgV3JpdGVGaWVsZHNXaXRob3V0RmV0Y2hpbmdQdXRGaWVsZHMoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlpbi5yZWFkRmllbGRzKCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbi5yZWFkRmllbGRzKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCW91dC53cml0ZUZpZWxkcygpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG91dC53cml0ZUZpZWxkcygpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsUGVyc2lzdGVudEZpZWxkc1dpdGhvdXRGaWVsZCBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBpbnQgYW5JbnN0YW5jZVZhciA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsUGVyc2lzdGVudEZpZWxkc1dpdGhvdXRGaWVsZCBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBpbnQgYW5JbnN0YW5jZVZhciA9IDU7CiAKLQkJcHVibGljIFNlcmlhbFBlcnNpc3RlbnRGaWVsZHNXaXRob3V0RmllbGQoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzV2l0aG91dEZpZWxkKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJaW4ucmVhZEZpZWxkcygpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgaW4ucmVhZEZpZWxkcygpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlvdXQucHV0RmllbGRzKCk7Ci0JCQlvdXQud3JpdGVGaWVsZHMoKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBvdXQucHV0RmllbGRzKCk7CisgICAgICAgICAgICBvdXQud3JpdGVGaWVsZHMoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vdFNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgaW50IGZvbzsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIGludCBmb287CiAKLQkJcHVibGljIE5vdFNlcmlhbGl6YWJsZSgpIHsKLQkJfQorICAgICAgICBwdWJsaWMgTm90U2VyaWFsaXphYmxlKCkgeworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcig0Mik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JpdGVSZXBsYWNlT2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcig0Mik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JpdGVSZXBsYWNlT2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKICAgICAgICAgcHJpdmF0ZSBPYmplY3QgcmVwbGFjZU9iamVjdDsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBlbnVtIENvbG9yIHsKQEAgLTQ3MiwyMiArNDc4LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHRlcm5hbGl6YWJsZVdpdGhSZXBsYWNlIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgewotCQlwcml2YXRlIGludCBmb287CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZXJuYWxpemFibGVXaXRoUmVwbGFjZSBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZm9vOwogCi0JCXB1YmxpYyBFeHRlcm5hbGl6YWJsZVdpdGhSZXBsYWNlKCkgewotCQl9CisgICAgICAgIHB1YmxpYyBFeHRlcm5hbGl6YWJsZVdpdGhSZXBsYWNlKCkgeworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcig0Mik7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcig0Mik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpIHsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbikgewotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pIHsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9iamVjdE91dHB1dFN0cmVhbVdpdGhSZXBsYWNlIGV4dGVuZHMgT2JqZWN0T3V0cHV0U3RyZWFtIHsKICAgICAgICAgcHVibGljIE9iamVjdE91dHB1dFN0cmVhbVdpdGhSZXBsYWNlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MTksMzUgKzUyNSw0MiBAQAogICAgICAgICB9CiAgICAgfQogCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9YTE9BRCA9ICJ4bG9hZCI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9YTE9BRCA9ICJ4bG9hZCI7CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFX1hEVU1QID0gInhkdW1wIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFX1hEVU1QID0gInhkdW1wIjsKIAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PID0gImZvbyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGT08gPSAiZm9vIjsKIAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1dJVEVfRkFJTEVEID0gIkZhaWxlZCB0byB3cml0ZTogIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19XSVRFX0ZBSUxFRCA9ICJGYWlsZWQgdG8gd3JpdGU6ICI7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHhsb2FkID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHhsb2FkID0gZmFsc2U7CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4geGR1bXAgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4geGR1bXAgPSBmYWxzZTsKIAotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHhGaWxlTmFtZSA9IG51bGw7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgeEZpbGVOYW1lID0gbnVsbDsKIAotCXByb3RlY3RlZCBPYmplY3RJbnB1dFN0cmVhbSBvaXM7CisgICAgcHJvdGVjdGVkIE9iamVjdElucHV0U3RyZWFtIG9pczsKIAotCXByb3RlY3RlZCBPYmplY3RPdXRwdXRTdHJlYW0gb29zOworICAgIHByb3RlY3RlZCBPYmplY3RPdXRwdXRTdHJlYW0gb29zOwogCi0JcHJvdGVjdGVkIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW87CisgICAgcHJvdGVjdGVkIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW87CiAKLQlzdGF0aWMgZmluYWwgaW50IElOSVRfSU5UX1ZBTFVFID0gNzsKKyAgICBzdGF0aWMgZmluYWwgaW50IElOSVRfSU5UX1ZBTFVFID0gNzsKIAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9TVFJfVkFMVUUgPSAiYSBzdHJpbmcgdGhhdCBpcyBibG9ydHoiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9TVFJfVkFMVUUgPSAiYSBzdHJpbmcgdGhhdCBpcyBibG9ydHoiOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI09iamVjdE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jT2JqZWN0T3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIk9iamVjdE91dHB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCiAgICAgICAgIG9vcy5jbG9zZSgpOwpAQCAtNTU1LDk3ICs1NjgsMTI1IEBACiAgICAgICAgIG9vcy5jbG9zZSgpOwogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSNPYmplY3RPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbV9zdWJ0ZXN0MCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI09iamVjdE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJDaGVja3MgU2VjdXJpdHlFeGNlcHRpb24uIElPRXhjZXB0aW9uICYgTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIk9iamVjdE91dHB1dFN0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbV9zdWJ0ZXN0MCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKLQkJLy8gY3VzdG9tIHNlY3VyaXR5IG1hbmFnZXIKLQkJU2VjdXJpdHlNYW5hZ2VyIHNtID0gbmV3IFNlY3VyaXR5TWFuYWdlcigpIHsKKyAgICAgICAgLy8gY3VzdG9tIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gbmV3IFNlY3VyaXR5TWFuYWdlcigpIHsKIAotCQkJZmluYWwgU2VyaWFsaXphYmxlUGVybWlzc2lvbiBmb3JiaWRlblBlcm1pc3Npb24gPQotCQkJCW5ldyBTZXJpYWxpemFibGVQZXJtaXNzaW9uKCJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIik7CisgICAgICAgICAgICBmaW5hbCBTZXJpYWxpemFibGVQZXJtaXNzaW9uIGZvcmJpZGVuUGVybWlzc2lvbiA9CisgICAgICAgICAgICAgICAgbmV3IFNlcmlhbGl6YWJsZVBlcm1pc3Npb24oImVuYWJsZVN1YmNsYXNzSW1wbGVtZW50YXRpb24iKTsKIAotCQkJcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFBlcm1pc3Npb24gcGVybSkgewotCQkJCWlmIChmb3JiaWRlblBlcm1pc3Npb24uZXF1YWxzKHBlcm0pKSB7Ci0JCQkJCXRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgICAgICAgICBpZiAoZm9yYmlkZW5QZXJtaXNzaW9uLmVxdWFscyhwZXJtKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQkJU2VjdXJpdHlNYW5hZ2VyIG9sZFNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotCQlTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKHNtKTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkvLyBzaG91bGQgbm90IGNhdXNlIFNlY3VyaXR5RXhjZXB0aW9uCi0JCQluZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7Ci0JCQkvLyBzaG91bGQgbm90IGNhdXNlIFNlY3VyaXR5RXhjZXB0aW9uCi0JCQljbGFzcyBTdWJUZXN0MSBleHRlbmRzIE9iamVjdE91dHB1dFN0cmVhbSB7Ci0JCQkJU3ViVGVzdDEoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQkJc3VwZXIob3V0KTsKLQkJCQl9Ci0JCQl9CisgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRTbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzbSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBjYXVzZSBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAgICAgICAgbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXQpOworICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBjYXVzZSBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAgICAgICAgY2xhc3MgU3ViVGVzdDEgZXh0ZW5kcyBPYmplY3RPdXRwdXRTdHJlYW0geworICAgICAgICAgICAgICAgIFN1YlRlc3QxKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKG91dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkvLyBzaG91bGQgbm90IGNhdXNlIFNlY3VyaXR5RXhjZXB0aW9uCi0JCQluZXcgU3ViVGVzdDEob3V0KTsKLQkJCWNsYXNzIFN1YlRlc3QyIGV4dGVuZHMgT2JqZWN0T3V0cHV0U3RyZWFtIHsKLQkJCQlTdWJUZXN0MihPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCQlzdXBlcihvdXQpOwotCQkJCX0KKyAgICAgICAgICAgIC8vIHNob3VsZCBub3QgY2F1c2UgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgICAgICAgIG5ldyBTdWJUZXN0MShvdXQpOworICAgICAgICAgICAgY2xhc3MgU3ViVGVzdDIgZXh0ZW5kcyBPYmplY3RPdXRwdXRTdHJlYW0geworICAgICAgICAgICAgICAgIFN1YlRlc3QyKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKG91dCk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcHVibGljIHZvaWQgd3JpdGVVbnNoYXJlZChPYmplY3Qgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVVuc2hhcmVkKE9iamVjdCBvYmopIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgewotCQkJCW5ldyBTdWJUZXN0MihvdXQpOwotCQkJCWZhaWwoInNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiAxIik7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQljbGFzcyBTdWJUZXN0MyBleHRlbmRzIE9iamVjdE91dHB1dFN0cmVhbSB7Ci0JCQkJU3ViVGVzdDMoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQkJc3VwZXIob3V0KTsKLQkJCQl9CisgICAgICAgICAgICAgICAgbmV3IFN1YlRlc3QyKG91dCk7CisgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIDEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXNzIFN1YlRlc3QzIGV4dGVuZHMgT2JqZWN0T3V0cHV0U3RyZWFtIHsKKyAgICAgICAgICAgICAgICBTdWJUZXN0MyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBzdXBlcihvdXQpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBQdXRGaWVsZCBwdXRGaWVsZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAgICAgcHVibGljIFB1dEZpZWxkIHB1dEZpZWxkcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJdHJ5IHsKLQkJCQluZXcgU3ViVGVzdDMob3V0KTsKLQkJCQlmYWlsKCJzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24gMiIpOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvbGRTbSk7Ci0JCX0KLQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5ldyBTdWJUZXN0MyhvdXQpOworICAgICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiAyIik7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZFNtKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0uY2xvc2UoKQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jY2xvc2UoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gU2VlIHRlYXJEb3duIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY2xvc2UiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS5jbG9zZSgpCisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI2RlZmF1bHRXcml0ZU9iamVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9kZWZhdWx0V3JpdGVPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS5kZWZhdWx0V3JpdGVPYmplY3QoKQotCQl0cnkgewotCQkJb29zLmRlZmF1bHRXcml0ZU9iamVjdCgpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSNkZWZhdWx0V3JpdGVPYmplY3QoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImRlZmF1bHRXcml0ZU9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVmYXVsdFdyaXRlT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0uZGVmYXVsdFdyaXRlT2JqZWN0KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byB0aHJvdyBOb3RBY3RpdmVFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTm90QWN0aXZlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvcnJlY3QKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoTm90QWN0aXZlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENvcnJlY3QKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSNmbHVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9mbHVzaCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSNmbHVzaCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImZsdXNoIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9mbHVzaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS5mbHVzaCgpCiAgICAgICAgIGludCBzaXplID0gYmFvLnNpemUoKTsKICAgICAgICAgb29zLndyaXRlQnl0ZSgxMjcpOwpAQCAtNjU4LDIxICs2OTksMjggQEAKICAgICAgICAgb29zID0gbnVsbDsKICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jcHV0RmllbGRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3B1dEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0kUHV0RmllbGQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ucHV0RmllbGRzKCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jcHV0RmllbGRzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicHV0RmllbGRzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0kUHV0RmllbGQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ucHV0RmllbGRzKCkKIAotCQlTZXJpYWxpemFibGVUZXN0SGVscGVyIHN0aDsKKyAgICAgICAgU2VyaWFsaXphYmxlVGVzdEhlbHBlciBzdGg7CiAKLQkJLyoKLQkJICogIlNlcmlhbGl6YWJsZVRlc3RIZWxwZXIiIGlzIGFuIG9iamVjdCBjcmVhdGVkIGZvciB0aGVzZSB0ZXN0cyB3aXRoCi0JCSAqIHR3byBmaWVsZHMgKFN0cmluZ3MpIGFuZCBzaW1wbGUgaW1wbGVtZW50YXRpb25zIG9mIHJlYWRPYmplY3QgYW5kCi0JCSAqIHdyaXRlT2JqZWN0IHdoaWNoIHNpbXBseSByZWFkIGFuZCB3cml0ZSB0aGUgZmlyc3QgZmllbGQgYnV0IG5vdCB0aGUKLQkJICogc2Vjb25kCi0JCSAqLworICAgICAgICAvKgorICAgICAgICAgKiAiU2VyaWFsaXphYmxlVGVzdEhlbHBlciIgaXMgYW4gb2JqZWN0IGNyZWF0ZWQgZm9yIHRoZXNlIHRlc3RzIHdpdGgKKyAgICAgICAgICogdHdvIGZpZWxkcyAoU3RyaW5ncykgYW5kIHNpbXBsZSBpbXBsZW1lbnRhdGlvbnMgb2YgcmVhZE9iamVjdCBhbmQKKyAgICAgICAgICogd3JpdGVPYmplY3Qgd2hpY2ggc2ltcGx5IHJlYWQgYW5kIHdyaXRlIHRoZSBmaXJzdCBmaWVsZCBidXQgbm90IHRoZQorICAgICAgICAgKiBzZWNvbmQKKyAgICAgICAgICovCiAKICAgICAgICAgb29zLndyaXRlT2JqZWN0KG5ldyBTZXJpYWxpemFibGVUZXN0SGVscGVyKCJHYWJiYSIsICJKYWJiYSIpKTsKICAgICAgICAgb29zLmZsdXNoKCk7CkBAIC02ODUsMTAgKzczMywxNyBAQAogICAgICAgICAgICAgICAgIHN0aC5nZXRUZXh0MigpKTsKICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jcmVzZXQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXNldCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ucmVzZXQoKQogICAgICAgICBTdHJpbmcgbyA9ICJIZWxsb1dvcmxkIjsKICAgICAgICAgb29zLndyaXRlT2JqZWN0KG8pOwpAQCAtNjk5LDQxICs3NTQsNDggQEAKICAgICAgICAgb2lzLmNsb3NlKCk7CiAgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZXJuYWxUZXN0IGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgewotCQlwdWJsaWMgU3RyaW5nIHZhbHVlOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVybmFsVGVzdCBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKIAotCQlwdWJsaWMgRXh0ZXJuYWxUZXN0KCkgewotCQl9CisgICAgICAgIHB1YmxpYyBFeHRlcm5hbFRlc3QoKSB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsKSB7Ci0JCQl2YWx1ZSA9IHZhbDsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dHB1dCkgewotCQkJdHJ5IHsKLQkJCQlvdXRwdXQud3JpdGVVVEYodmFsdWUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0cHV0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVVURih2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbnB1dCkgewotCQkJdHJ5IHsKLQkJCQl2YWx1ZSA9IGlucHV0LnJlYWRVVEYoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW5wdXQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBpbnB1dC5yZWFkVVRGKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSN1c2VQcm90b2NvbFZlcnNpb24oaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdXNlUHJvdG9jb2xWZXJzaW9uSSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSN1c2VQcm90b2NvbFZlcnNpb24oaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInVzZVByb3RvY29sVmVyc2lvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3VzZVByb3RvY29sVmVyc2lvbkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0udXNlUHJvdG9jb2xWZXJzaW9uKGludCkKICAgICAgICAgb29zLnVzZVByb3RvY29sVmVyc2lvbihPYmplY3RPdXRwdXRTdHJlYW0uUFJPVE9DT0xfVkVSU0lPTl8xKTsKQEAgLTc0OSwxMCArODExLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIHQyLmdldFZhbHVlKCksIHQxLmdldFZhbHVlKCkuZXF1YWxzKHQyLmdldFZhbHVlKCkpKTsKICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSN3cml0ZShieXRlW10pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZSBbXSkKICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwXTsKICAgICAgICAgb29zLndyaXRlKCJIZWxsb1dvcmxkIi5nZXRCeXRlcygpKTsKQEAgLTc2NCw5ICs4MzMsMTYgQEAKICAgICAgICAgICAgICAgICAxMCkpOwogICAgIH0KIAotCS8qKgorICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEJJSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZShieXRlIFtdLCBpbnQsCiAgICAgICAgIC8vIGludCkKQEAgLTc4Myw2ICs4NTksMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlKGludCkKICAgICAgICAgb29zLndyaXRlKCdUJyk7CkBAIC03OTUsNiArODc4LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI3dyaXRlQm9vbGVhbihib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUJvb2xlYW4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUJvb2xlYW5aKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQm9vbGVhbihib29sZWFuKQogICAgICAgICBvb3Mud3JpdGVCb29sZWFuKHRydWUpOwpAQCAtODA2LDYgKzg5NiwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSN3cml0ZUJ5dGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUJ5dGUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUJ5dGVJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQnl0ZShpbnQpCiAgICAgICAgIG9vcy53cml0ZUJ5dGUoMTI3KTsKQEAgLTgxNyw2ICs5MTQsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVCeXRlcyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUJ5dGVzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVCeXRlc0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQnl0ZXMoamF2YS5sYW5nLlN0cmluZykKQEAgLTgzMyw2ICs5MzcsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVDaGFyKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVDaGFyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUNoYXJJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQ2hhcihpbnQpCiAgICAgICAgIG9vcy53cml0ZUNoYXIoJ1QnKTsKQEAgLTg0NCw2ICs5NTUsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVDaGFycyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUNoYXJzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVDaGFyc0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQ2hhcnMoamF2YS5sYW5nLlN0cmluZykKQEAgLTg2NCw2ICs5ODIsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVEb3VibGUoZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZURvdWJsZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVEb3VibGVEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlRG91YmxlKGRvdWJsZSkKICAgICAgICAgb29zLndyaXRlRG91YmxlKERvdWJsZS5NQVhfVkFMVUUpOwpAQCAtODc2LDYgKzEwMDEsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVGaWVsZHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIkR1bW15IHRlc3QuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVGaWVsZHMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlRmllbGRzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZUZpZWxkcygpCiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwpAQCAtODg0LDYgKzEwMTYsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVGbG9hdChmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVGbG9hdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUZsb2F0RigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZUZsb2F0KGZsb2F0KQogICAgICAgICBvb3Mud3JpdGVGbG9hdChGbG9hdC5NQVhfVkFMVUUpOwpAQCAtODk4LDYgKzEwMzcsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVJbnQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUludCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJbnRJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlSW50KGludCkKICAgICAgICAgb29zLndyaXRlSW50KEludGVnZXIuTUFYX1ZBTFVFKTsKQEAgLTkxMSw2ICsxMDU3LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI3dyaXRlTG9uZyhsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZUxvbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMb25nSigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZUxvbmcobG9uZykKICAgICAgICAgb29zLndyaXRlTG9uZyhMb25nLk1BWF9WQUxVRSk7CkBAIC05MjMsNiArMTA3NiwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSN3cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZU9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RMamF2YV9sYW5nX09iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtOTQ2LDYgKzExMDYsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVPYmplY3QiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X05vdFNlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBPYmplY3RPdXRwdXQgb3V0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTk1OSw2ICsxMTI2LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI3dyaXRlU2hvcnQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZVNob3J0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlU2hvcnRJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlU2hvcnQoaW50KQogICAgICAgICBvb3Mud3JpdGVTaG9ydCgxMjcpOwpAQCAtOTcwLDYgKzExNDQsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVVVEYoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVVVEYiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZVVURkxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlVVRGKGphdmEubGFuZy5TdHJpbmcpCkBAIC05ODIsNiArMTE2MywxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSN3cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZU9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0V4Y2VwdGlvbigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KTsKICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CkBAIC0xMDc5LDcgKzEyNjcsMTcgQEAKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVVVEYoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIndyaXRlSW50IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pLAorICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZU9iamVjdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9KSwgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVVVEYiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhQcmltaXRpdmVzQW5kT2JqZWN0cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpbnQgaSA9IDc7CiAgICAgICAgIFN0cmluZyBzMSA9ICJzdHJpbmcgMSI7CkBAIC0xMTIwLDYgKzEzMTgsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jd3JpdGVVbnNoYXJlZChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ3cml0ZVVuc2hhcmVkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVVbnNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTg3CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwpAQCAtMTE1MCw2ICsxMzU1LDEzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI3dyaXRlVW5zaGFyZWQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAid3JpdGVVbnNoYXJlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlVW5zaGFyZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xODcKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CkBAIC0xMTg2LDYgKzEzOTgsMTMgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0jdXNlUHJvdG9jb2xWZXJzaW9uKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiAmIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidXNlUHJvdG9jb2xWZXJzaW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF91c2VQcm90b2NvbFZlcnNpb25JXzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oCiAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKQEAgLTEyMDUsNiArMTQyNCwxMyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSNyZXBsYWNlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlcGxhY2VPYmplY3QiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xNDI5CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwpAQCAtMTIxOCw0MyArMTQ0NCw0MyBAQAogICAgICAgICBvaXMuY2xvc2UoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgicmVwbGFjZU9iamVjdCBoYXMgbm90IGJlZW4gY2FsbGVkIiwgKG9iaiBpbnN0YW5jZW9mIExvbmcpKTsKIAotCQkvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjIzOQotCQlPYmplY3QgcmVwbGFjZU9iamVjdCA9IGludC5jbGFzczsKLQkJYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFJlcGxhY2UyIG9vczIgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFJlcGxhY2UyKAotCQkJCWJhb3MpOwotCQlvb3MyLndyaXRlT2JqZWN0KG5ldyBXcml0ZVJlcGxhY2VPYmplY3QocmVwbGFjZU9iamVjdCkpOwotCQlvb3MyLmZsdXNoKCk7Ci0JCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbSgKLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0JCW9iaiA9IG9pcy5yZWFkT2JqZWN0KCk7Ci0JCW9vcy5jbG9zZSgpOwotCQlvaXMuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgicmVwbGFjZU9iamVjdCBoYXMgbm90IGJlZW4gY2FsbGVkIiwgKG9iaiBpbnN0YW5jZW9mIExvbmcpKTsKKyAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTIyMzkKKyAgICAgICAgT2JqZWN0IHJlcGxhY2VPYmplY3QgPSBpbnQuY2xhc3M7CisgICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbVdpdGhSZXBsYWNlMiBvb3MyID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbVdpdGhSZXBsYWNlMigKKyAgICAgICAgICAgICAgICBiYW9zKTsKKyAgICAgICAgb29zMi53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlT2JqZWN0KHJlcGxhY2VPYmplY3QpKTsKKyAgICAgICAgb29zMi5mbHVzaCgpOworICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBvYmogPSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUoInJlcGxhY2VPYmplY3QgaGFzIG5vdCBiZWVuIGNhbGxlZCIsIChvYmogaW5zdGFuY2VvZiBMb25nKSk7CiAKLQkJcmVwbGFjZU9iamVjdCA9IE9iamVjdFN0cmVhbUNsYXNzLmxvb2t1cChJbnRlZ2VyLmNsYXNzKTsKLQkJYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJb29zMiA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW1XaXRoUmVwbGFjZTIoYmFvcyk7Ci0JCW9vczIud3JpdGVPYmplY3QobmV3IFdyaXRlUmVwbGFjZU9iamVjdChyZXBsYWNlT2JqZWN0KSk7Ci0JCW9vczIuZmx1c2goKTsKLQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKLQkJb2JqID0gb2lzLnJlYWRPYmplY3QoKTsKLQkJb29zLmNsb3NlKCk7Ci0JCW9pcy5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJyZXBsYWNlT2JqZWN0IGhhcyBub3QgYmVlbiBjYWxsZWQiLCAob2JqIGluc3RhbmNlb2YgTG9uZykpOworICAgICAgICByZXBsYWNlT2JqZWN0ID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKEludGVnZXIuY2xhc3MpOworICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvb3MyID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbVdpdGhSZXBsYWNlMihiYW9zKTsKKyAgICAgICAgb29zMi53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlT2JqZWN0KHJlcGxhY2VPYmplY3QpKTsKKyAgICAgICAgb29zMi5mbHVzaCgpOworICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBvYmogPSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUoInJlcGxhY2VPYmplY3QgaGFzIG5vdCBiZWVuIGNhbGxlZCIsIChvYmogaW5zdGFuY2VvZiBMb25nKSk7CiAKLQkJcmVwbGFjZU9iamVjdCA9IFdyaXRlUmVwbGFjZU9iamVjdC5Db2xvci5yZWQ7Ci0JCWJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCW9vczIgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFJlcGxhY2UyKGJhb3MpOwotCQlvb3MyLndyaXRlT2JqZWN0KG5ldyBXcml0ZVJlcGxhY2VPYmplY3QocmVwbGFjZU9iamVjdCkpOwotCQlvb3MyLmZsdXNoKCk7Ci0JCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbSgKLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0JCW9iaiA9IG9pcy5yZWFkT2JqZWN0KCk7Ci0JCW9vcy5jbG9zZSgpOwotCQlvaXMuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgicmVwbGFjZU9iamVjdCBoYXMgbm90IGJlZW4gY2FsbGVkIiwgKG9iaiBpbnN0YW5jZW9mIExvbmcpKTsKKyAgICAgICAgcmVwbGFjZU9iamVjdCA9IFdyaXRlUmVwbGFjZU9iamVjdC5Db2xvci5yZWQ7CisgICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG9vczIgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtV2l0aFJlcGxhY2UyKGJhb3MpOworICAgICAgICBvb3MyLndyaXRlT2JqZWN0KG5ldyBXcml0ZVJlcGxhY2VPYmplY3QocmVwbGFjZU9iamVjdCkpOworICAgICAgICBvb3MyLmZsdXNoKCk7CisgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIG9iaiA9IG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVwbGFjZU9iamVjdCBoYXMgbm90IGJlZW4gY2FsbGVkIiwgKG9iaiBpbnN0YW5jZW9mIExvbmcpKTsKIAogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTMxNTgKICAgICAgICAgT2JqZWN0IG9iajE7CkBAIC0xMjgyLDUgKzE1MDgsNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIjJuZCByZXBsYWNlT2JqZWN0IHdvcmtlZCBpbmNvcnJlY3RseSIsIEludGVnZXIuY2xhc3MsIG9iajIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjNyZCByZXBsYWNlT2JqZWN0IHdvcmtlZCBpbmNvcnJlY3RseSIsCiAgICAgICAgICAgICAgICAgT2JqZWN0U3RyZWFtQ2xhc3MuY2xhc3MsIG9iajMuZ2V0Q2xhc3MoKSk7Ci0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PYmplY3RTdHJlYW1DbGFzc1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PYmplY3RTdHJlYW1DbGFzc1Rlc3QuamF2YQppbmRleCAxZWZkYTNkLi44NzE3MjgyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT2JqZWN0U3RyZWFtQ2xhc3NUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL09iamVjdFN0cmVhbUNsYXNzVGVzdC5qYXZhCkBAIC0xNywxMzIgKzE3LDIwMiBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzczsKIGltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCitAVGVzdFRhcmdldENsYXNzKE9iamVjdFN0cmVhbUNsYXNzLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBPYmplY3RTdHJlYW1DbGFzc1Rlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0Jc3RhdGljIGNsYXNzIER1bW15Q2xhc3MgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5OTk5OTk5OTk5OTk5OTlMOworICAgIHN0YXRpYyBjbGFzcyBEdW1teUNsYXNzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTk5OTk5OTk5OTk5OTk5TDsKIAotCQlsb25nIGJhbSA9IDk5OUw7CisgICAgICAgIGxvbmcgYmFtID0gOTk5TDsKIAotCQlpbnQgaGFtID0gOTk5OTsKKyAgICAgICAgaW50IGhhbSA9IDk5OTk7CiAKLQkJcHVibGljIHN0YXRpYyBsb25nIGdldFVJRCgpIHsKLQkJCXJldHVybiBzZXJpYWxWZXJzaW9uVUlEOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VUlEKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbFZlcnNpb25VSUQ7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyNmb3JDbGFzcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9mb3JDbGFzcygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzcyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLmZvckNsYXNzKCkKLQkJLy8gTmVlZCB0byB0ZXN0IGR1cmluZyBzZXJpYWxpemF0aW9uIHRvIGJlIHN1cmUgYW4gaW5zdGFuY2UgaXMKLQkJLy8gcmV0dXJuZWQKLQkJT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOwotCQlhc3NlcnRUcnVlKCJmb3JDbGFzcyByZXR1cm5lZCBhbiBvYmplY3Q6ICIgKyBvc2MuZm9yQ2xhc3MoKSwgb3NjCi0JCQkJLmZvckNsYXNzKCkuZXF1YWxzKER1bW15Q2xhc3MuY2xhc3MpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MjZm9yQ2xhc3MoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmb3JDbGFzcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9mb3JDbGFzcygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzcyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLmZvckNsYXNzKCkKKyAgICAgICAgLy8gTmVlZCB0byB0ZXN0IGR1cmluZyBzZXJpYWxpemF0aW9uIHRvIGJlIHN1cmUgYW4gaW5zdGFuY2UgaXMKKyAgICAgICAgLy8gcmV0dXJuZWQKKyAgICAgICAgT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKCJmb3JDbGFzcyByZXR1cm5lZCBhbiBvYmplY3Q6ICIgKyBvc2MuZm9yQ2xhc3MoKSwgb3NjCisgICAgICAgICAgICAgICAgLmZvckNsYXNzKCkuZXF1YWxzKER1bW15Q2xhc3MuY2xhc3MpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyNnZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmllbGRMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQKLQkJLy8gamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcy5nZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQotCQlPYmplY3RTdHJlYW1DbGFzcyBvc2MgPSBPYmplY3RTdHJlYW1DbGFzcy5sb29rdXAoRHVtbXlDbGFzcy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiZ2V0RmllbGQgZGlkIG5vdCByZXR1cm4gY29ycmVjdCBmaWVsZCIsICdKJywgb3NjLmdldEZpZWxkKCJiYW0iKQotCQkJCS5nZXRUeXBlQ29kZSgpKTsKLQkJYXNzZXJ0TnVsbCgiZ2V0RmllbGQgZGlkIG5vdCBudWxsIGZvciBub24tZXhpc3RlbnQgZmllbGQiLCBvc2MKLQkJCQkuZ2V0RmllbGQoIndoYW0iKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzI2dldEZpZWxkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldEZpZWxkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEZpZWxkTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MuZ2V0RmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldEZpZWxkIGRpZCBub3QgcmV0dXJuIGNvcnJlY3QgZmllbGQiLCAnSicsIG9zYy5nZXRGaWVsZCgiYmFtIikKKyAgICAgICAgICAgICAgICAuZ2V0VHlwZUNvZGUoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldEZpZWxkIGRpZCBub3QgbnVsbCBmb3Igbm9uLWV4aXN0ZW50IGZpZWxkIiwgb3NjCisgICAgICAgICAgICAgICAgLmdldEZpZWxkKCJ3aGFtIikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzI2dldEZpZWxkcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRGaWVsZHMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkIFtdCi0JCS8vIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MuZ2V0RmllbGRzKCkKLQkJT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOwotCQlPYmplY3RTdHJlYW1GaWVsZFtdIG9zZkFycmF5ID0gb3NjLmdldEZpZWxkcygpOwotCQlhc3NlcnRUcnVlKAotCQkJCSJBcnJheSBvZiBmaWVsZHMgc2hvdWxkIGJlIG9mIGxlbmd0aCAyIGJ1dCBpcyBpbnN0ZWFkIG9mIGxlbmd0aDogIgotCQkJCQkJKyBvc2ZBcnJheS5sZW5ndGgsIG9zZkFycmF5Lmxlbmd0aCA9PSAyKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MjZ2V0RmllbGRzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0RmllbGRzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmllbGRzKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCBbXQorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLmdldEZpZWxkcygpCisgICAgICAgIE9iamVjdFN0cmVhbUNsYXNzIG9zYyA9IE9iamVjdFN0cmVhbUNsYXNzLmxvb2t1cChEdW1teUNsYXNzLmNsYXNzKTsKKyAgICAgICAgT2JqZWN0U3RyZWFtRmllbGRbXSBvc2ZBcnJheSA9IG9zYy5nZXRGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiQXJyYXkgb2YgZmllbGRzIHNob3VsZCBiZSBvZiBsZW5ndGggMiBidXQgaXMgaW5zdGVhZCBvZiBsZW5ndGg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3NmQXJyYXkubGVuZ3RoLCBvc2ZBcnJheS5sZW5ndGggPT0gMik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLmdldE5hbWUoKQotCQlPYmplY3RTdHJlYW1DbGFzcyBvc2MgPSBPYmplY3RTdHJlYW1DbGFzcy5sb29rdXAoRHVtbXlDbGFzcy5jbGFzcyk7Ci0JCWFzc2VydFRydWUoImdldE5hbWUgcmV0dXJuZWQgaW5jb3JyZWN0IG5hbWU6ICIgKyBvc2MuZ2V0TmFtZSgpLCBvc2MKLQkJCQkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCSJ0ZXN0cy5hcGkuamF2YS5pby5PYmplY3RTdHJlYW1DbGFzc1Rlc3QkRHVtbXlDbGFzcyIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MjZ2V0TmFtZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldE5hbWUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MuZ2V0TmFtZSgpCisgICAgICAgIE9iamVjdFN0cmVhbUNsYXNzIG9zYyA9IE9iamVjdFN0cmVhbUNsYXNzLmxvb2t1cChEdW1teUNsYXNzLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TmFtZSByZXR1cm5lZCBpbmNvcnJlY3QgbmFtZTogIiArIG9zYy5nZXROYW1lKCksIG9zYworICAgICAgICAgICAgICAgIC5nZXROYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RzLmFwaS5qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzVGVzdCREdW1teUNsYXNzIikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzI2dldFNlcmlhbFZlcnNpb25VSUQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VyaWFsVmVyc2lvblVJRCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcy5nZXRTZXJpYWxWZXJzaW9uVUlEKCkKLQkJT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOwotCQlhc3NlcnRUcnVlKCJnZXRTZXJpYWx2ZXJzaW9uVUlEIHJldHVybmVkIGluY29ycmVjdCB1aWQ6ICIKLQkJCQkrIG9zYy5nZXRTZXJpYWxWZXJzaW9uVUlEKCkgKyAiIGluc3RlYWQgb2YgIgotCQkJCSsgRHVtbXlDbGFzcy5nZXRVSUQoKSwgb3NjLmdldFNlcmlhbFZlcnNpb25VSUQoKSA9PSBEdW1teUNsYXNzCi0JCQkJLmdldFVJRCgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MjZ2V0U2VyaWFsVmVyc2lvblVJRCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldFNlcmlhbFZlcnNpb25VSUQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlcmlhbFZlcnNpb25VSUQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MuZ2V0U2VyaWFsVmVyc2lvblVJRCgpCisgICAgICAgIE9iamVjdFN0cmVhbUNsYXNzIG9zYyA9IE9iamVjdFN0cmVhbUNsYXNzLmxvb2t1cChEdW1teUNsYXNzLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0U2VyaWFsdmVyc2lvblVJRCByZXR1cm5lZCBpbmNvcnJlY3QgdWlkOiAiCisgICAgICAgICAgICAgICAgKyBvc2MuZ2V0U2VyaWFsVmVyc2lvblVJRCgpICsgIiBpbnN0ZWFkIG9mICIKKyAgICAgICAgICAgICAgICArIER1bW15Q2xhc3MuZ2V0VUlEKCksIG9zYy5nZXRTZXJpYWxWZXJzaW9uVUlEKCkgPT0gRHVtbXlDbGFzcworICAgICAgICAgICAgICAgIC5nZXRVSUQoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MjbG9va3VwKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2xvb2t1cExqYXZhX2xhbmdfQ2xhc3MoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzCi0JCS8vIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKGphdmEubGFuZy5DbGFzcykKLQkJT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOwotCQlhc3NlcnRUcnVlKCJsb29rdXAgcmV0dXJuZWQgd3JvbmcgY2xhc3M6ICIgKyBvc2MuZ2V0TmFtZSgpLCBvc2MKLQkJCQkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCSJ0ZXN0cy5hcGkuamF2YS5pby5PYmplY3RTdHJlYW1DbGFzc1Rlc3QkRHVtbXlDbGFzcyIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MjbG9va3VwKGphdmEubGFuZy5DbGFzcykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9va3VwIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9va3VwTGphdmFfbGFuZ19DbGFzcygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcy5sb29rdXAoamF2YS5sYW5nLkNsYXNzKQorICAgICAgICBPYmplY3RTdHJlYW1DbGFzcyBvc2MgPSBPYmplY3RTdHJlYW1DbGFzcy5sb29rdXAoRHVtbXlDbGFzcy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoImxvb2t1cCByZXR1cm5lZCB3cm9uZyBjbGFzczogIiArIG9zYy5nZXROYW1lKCksIG9zYworICAgICAgICAgICAgICAgIC5nZXROYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RzLmFwaS5qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzVGVzdCREdW1teUNsYXNzIikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLnRvU3RyaW5nKCkKLQkJT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOwotCQlTdHJpbmcgb3NjU3RyaW5nID0gb3NjLnRvU3RyaW5nKCk7Ci0JCS8vIFRoZSBwcmV2aW91cyB0ZXN0IHdhcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIHNwZWMgc28gaXQgd2FzIHJlcGxhY2VkCi0JCS8vIHdpdGggdGhlIHRlc3QgYmVsb3cKLQkJYXNzZXJ0VHJ1ZSgidG9TdHJpbmcgcmV0dXJuZWQgaW5jb3JyZWN0IHN0cmluZzogIiArIG9zYy50b1N0cmluZygpLAotCQkJCW9zY1N0cmluZy5pbmRleE9mKCJzZXJpYWxWZXJzaW9uVUlEIikgPj0gMAotCQkJCQkJJiYgb3NjU3RyaW5nLmluZGV4T2YoIjk5OTk5OTk5OTk5OTk5OUwiKSA+PSAwKTsKLQkJOwotCX0KLQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzI3RvU3RyaW5nKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLnRvU3RyaW5nKCkKKyAgICAgICAgT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOworICAgICAgICBTdHJpbmcgb3NjU3RyaW5nID0gb3NjLnRvU3RyaW5nKCk7CisgICAgICAgIC8vIFRoZSBwcmV2aW91cyB0ZXN0IHdhcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIHNwZWMgc28gaXQgd2FzIHJlcGxhY2VkCisgICAgICAgIC8vIHdpdGggdGhlIHRlc3QgYmVsb3cKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidG9TdHJpbmcgcmV0dXJuZWQgaW5jb3JyZWN0IHN0cmluZzogIiArIG9zYy50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIG9zY1N0cmluZy5pbmRleE9mKCJzZXJpYWxWZXJzaW9uVUlEIikgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3NjU3RyaW5nLmluZGV4T2YoIjk5OTk5OTk5OTk5OTk5OUwiKSA+PSAwKTsKKyAgICAgICAgOworICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9va3VwIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB7CiAgICAgICAgIE9iamVjdFN0cmVhbUNsYXNzIG9zYyA9IE9iamVjdFN0cmVhbUNsYXNzLmxvb2t1cChPYmplY3RTdHJlYW1DbGFzcy5jbGFzcyk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBvc2MuZ2V0RmllbGRzKCkubGVuZ3RoKTsKICAgICB9CiAgICAgCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiAKIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGb29TZXJpYWxWZXJzaW9uVWlkKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoLTU4ODc5NjQ2Nzc0NDMwMzA4NjdMLCBGb28uc2VyaWFsVmVyc2lvblVJRCgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT2JqZWN0U3RyZWFtRmllbGRUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT2JqZWN0U3RyZWFtRmllbGRUZXN0LmphdmEKaW5kZXggNTYxMjU4NS4uZjFlODVhNyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL09iamVjdFN0cmVhbUZpZWxkVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PYmplY3RTdHJlYW1GaWVsZFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwpAQCAtMzIsMTI4ICszNywxOTggQEAKIGltcG9ydCBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhPYmplY3RTdHJlYW1GaWVsZC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgT2JqZWN0U3RyZWFtRmllbGRUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCXN0YXRpYyBjbGFzcyBEdW1teUNsYXNzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTk5OTk5OTk5OTk5OTk4TDsKKyAgICBzdGF0aWMgY2xhc3MgRHVtbXlDbGFzcyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDk5OTk5OTk5OTk5OTk5OEw7CiAKLQkJbG9uZyBiYW0gPSA5OTlMOworICAgICAgICBsb25nIGJhbSA9IDk5OUw7CiAKLQkJaW50IGhhbSA9IDk5OTk7CisgICAgICAgIGludCBoYW0gPSA5OTk5OwogCi0JCWludCBzYW0gPSA4ODg4OworICAgICAgICBpbnQgc2FtID0gODg4ODsKIAotCQlPYmplY3QgaG9sYSA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgT2JqZWN0IGhvbGEgPSBuZXcgT2JqZWN0KCk7CiAKLQkJcHVibGljIHN0YXRpYyBsb25nIGdldFVJRCgpIHsKLQkJCXJldHVybiBzZXJpYWxWZXJzaW9uVUlEOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VUlEKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbFZlcnNpb25VSUQ7CisgICAgICAgIH0KKyAgICB9CiAKLQlPYmplY3RTdHJlYW1DbGFzcyBvc2M7CisgICAgT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjOwogCi0JT2JqZWN0U3RyZWFtRmllbGQgaGFtRmllbGQ7CisgICAgT2JqZWN0U3RyZWFtRmllbGQgaGFtRmllbGQ7CiAKLQlPYmplY3RTdHJlYW1GaWVsZCBzYW1GaWVsZDsKKyAgICBPYmplY3RTdHJlYW1GaWVsZCBzYW1GaWVsZDsKIAotCU9iamVjdFN0cmVhbUZpZWxkIGJhbUZpZWxkOworICAgIE9iamVjdFN0cmVhbUZpZWxkIGJhbUZpZWxkOwogCi0JT2JqZWN0U3RyZWFtRmllbGQgaG9sYUZpZWxkOworICAgIE9iamVjdFN0cmVhbUZpZWxkIGhvbGFGaWVsZDsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkI09iamVjdFN0cmVhbUZpZWxkKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICAgIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX0NsYXNzKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZChqYXZhLmxhbmcuU3RyaW5nLAotCQkvLyBqYXZhLmxhbmcuQ2xhc3MpCi0JCWFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNPYmplY3RTdHJlYW1GaWVsZChqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgICBqYXZhLmxhbmcuQ2xhc3MpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRHVtbXkgdGVzdC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJPYmplY3RTdHJlYW1GaWVsZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19DbGFzcygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQoamF2YS5sYW5nLlN0cmluZywKKyAgICAgICAgLy8gamF2YS5sYW5nLkNsYXNzKQorICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3QiLCB0cnVlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2NvbXBhcmVUb0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50Ci0JCS8vIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQuY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0JCWFzc2VydFRydWUoIk9iamVjdCBjb21wYXJlZCB0byBpbnQgZGlkIG5vdCByZXR1cm4gPiAwIiwgaG9sYUZpZWxkCi0JCQkJLmNvbXBhcmVUbyhoYW1GaWVsZCkgPiAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnQgY29tcGFyZWQgdG8gaXRzZWxmIGRpZCBub3QgcmV0dXJuIDAiLCAwLCBoYW1GaWVsZAotCQkJCS5jb21wYXJlVG8oaGFtRmllbGQpKTsKLQkJYXNzZXJ0VHJ1ZSgiKEludCloYW0gY29tcGFyZWQgdG8gKEludClzYW0gZGlkIG5vdCByZXR1cm4gPCAwIiwgaGFtRmllbGQKLQkJCQkuY29tcGFyZVRvKHNhbUZpZWxkKSA8IDApOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9sYW5nX09iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkLmNvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQorICAgICAgICBhc3NlcnRUcnVlKCJPYmplY3QgY29tcGFyZWQgdG8gaW50IGRpZCBub3QgcmV0dXJuID4gMCIsIGhvbGFGaWVsZAorICAgICAgICAgICAgICAgIC5jb21wYXJlVG8oaGFtRmllbGQpID4gMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW50IGNvbXBhcmVkIHRvIGl0c2VsZiBkaWQgbm90IHJldHVybiAwIiwgMCwgaGFtRmllbGQKKyAgICAgICAgICAgICAgICAuY29tcGFyZVRvKGhhbUZpZWxkKSk7CisgICAgICAgIGFzc2VydFRydWUoIihJbnQpaGFtIGNvbXBhcmVkIHRvIChJbnQpc2FtIGRpZCBub3QgcmV0dXJuIDwgMCIsIGhhbUZpZWxkCisgICAgICAgICAgICAgICAgLmNvbXBhcmVUbyhzYW1GaWVsZCkgPCAwKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQuZ2V0TmFtZSgpCi0JCWFzc2VydEVxdWFscygiRmllbGQgZGlkIG5vdCByZXR1cm4gY29ycmVjdCBuYW1lIiwgImhvbGEiLCBob2xhRmllbGQuZ2V0TmFtZSgpCi0JCQkJKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQjZ2V0TmFtZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldE5hbWUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQuZ2V0TmFtZSgpCisgICAgICAgIGFzc2VydEVxdWFscygiRmllbGQgZGlkIG5vdCByZXR1cm4gY29ycmVjdCBuYW1lIiwgImhvbGEiLCBob2xhRmllbGQuZ2V0TmFtZSgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNnZXRPZmZzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQuZ2V0T2Zmc2V0KCkKLQkJT2JqZWN0U3RyZWFtRmllbGRbXSBvc2ZBcnJheTsKLQkJb3NmQXJyYXkgPSBvc2MuZ2V0RmllbGRzKCk7Ci0JCWFzc2VydFRydWUoImdldE9mZnNldCBkaWQgbm90IHJldHVybiByZWFzb25hYmxlIHZhbHVlcyIsIG9zZkFycmF5WzBdCi0JCQkJLmdldE9mZnNldCgpICE9IG9zZkFycmF5WzFdLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRPZmZzZXQgZm9yIG9zZkFycmF5WzBdLmdldE9mZnNldCgpIGRpZCBub3QgcmV0dXJuIDAiLAotCQkJCTAsIG9zZkFycmF5WzBdLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvc2ZBcnJheVsxXS5nZXRPZmZzZXQoKSBkaWQgbm90IHJldHVybgk4IiwgOCwgb3NmQXJyYXlbMV0KLQkJCQkuZ2V0T2Zmc2V0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm9zZkFycmF5WzJdLmdldE9mZnNldCgpIGRpZCBub3QgcmV0dXJuIDEyIiwgMTIsIG9zZkFycmF5WzJdCi0JCQkJLmdldE9mZnNldCgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQjZ2V0T2Zmc2V0KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0T2Zmc2V0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRPZmZzZXQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZC5nZXRPZmZzZXQoKQorICAgICAgICBPYmplY3RTdHJlYW1GaWVsZFtdIG9zZkFycmF5OworICAgICAgICBvc2ZBcnJheSA9IG9zYy5nZXRGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0T2Zmc2V0IGRpZCBub3QgcmV0dXJuIHJlYXNvbmFibGUgdmFsdWVzIiwgb3NmQXJyYXlbMF0KKyAgICAgICAgICAgICAgICAuZ2V0T2Zmc2V0KCkgIT0gb3NmQXJyYXlbMV0uZ2V0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldE9mZnNldCBmb3Igb3NmQXJyYXlbMF0uZ2V0T2Zmc2V0KCkgZGlkIG5vdCByZXR1cm4gMCIsCisgICAgICAgICAgICAgICAgMCwgb3NmQXJyYXlbMF0uZ2V0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9zZkFycmF5WzFdLmdldE9mZnNldCgpIGRpZCBub3QgcmV0dXJuICAgIDgiLCA4LCBvc2ZBcnJheVsxXQorICAgICAgICAgICAgICAgIC5nZXRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib3NmQXJyYXlbMl0uZ2V0T2Zmc2V0KCkgZGlkIG5vdCByZXR1cm4gMTIiLCAxMiwgb3NmQXJyYXlbMl0KKyAgICAgICAgICAgICAgICAuZ2V0T2Zmc2V0KCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzcyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkLmdldFR5cGUoKQotCQlhc3NlcnRUcnVlKCJnZXRUeXBlIG9uIGFuIE9iamVjdCBmaWVsZCBkaWQgbm90IGFuc3dlciBPYmplY3QiLAotCQkJCWhvbGFGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKE9iamVjdC5jbGFzcykpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNnZXRUeXBlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0VHlwZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuQ2xhc3MgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZC5nZXRUeXBlKCkKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0VHlwZSBvbiBhbiBPYmplY3QgZmllbGQgZGlkIG5vdCBhbnN3ZXIgT2JqZWN0IiwKKyAgICAgICAgICAgICAgICBob2xhRmllbGQuZ2V0VHlwZSgpLmVxdWFscyhPYmplY3QuY2xhc3MpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNnZXRUeXBlQ29kZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlQ29kZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGNoYXIgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZC5nZXRUeXBlQ29kZSgpCi0JCWFzc2VydEVxdWFscygiZ2V0VHlwZUNvZGUgb24gYW4gT2JqZWN0IGZpZWxkIGRpZCBub3QgYW5zd2VyICdMJyIsCi0JCQkJJ0wnLCBob2xhRmllbGQuZ2V0VHlwZUNvZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0VHlwZUNvZGUgb24gYSBsb25nIGZpZWxkIGRpZCBub3QgYW5zd2VyICdKJyIsICdKJywgYmFtRmllbGQKLQkJCQkuZ2V0VHlwZUNvZGUoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkI2dldFR5cGVDb2RlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZUNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGVDb2RlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgY2hhciBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkLmdldFR5cGVDb2RlKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRUeXBlQ29kZSBvbiBhbiBPYmplY3QgZmllbGQgZGlkIG5vdCBhbnN3ZXIgJ0wnIiwKKyAgICAgICAgICAgICAgICAnTCcsIGhvbGFGaWVsZC5nZXRUeXBlQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRUeXBlQ29kZSBvbiBhIGxvbmcgZmllbGQgZGlkIG5vdCBhbnN3ZXIgJ0onIiwgJ0onLCBiYW1GaWVsZAorICAgICAgICAgICAgICAgIC5nZXRUeXBlQ29kZSgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCNnZXRUeXBlU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGVTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoImdldFR5cGVTdHJpbmcgcmV0dXJuZWQ6ICIgKyBob2xhRmllbGQuZ2V0VHlwZVN0cmluZygpLAotCQkJCWhvbGFGaWVsZC5nZXRUeXBlU3RyaW5nKCkuaW5kZXhPZigiT2JqZWN0IikgPj0gMCk7Ci0JCWFzc2VydE51bGwoIlByaW1pdGl2ZSB0eXBlcycgc3RyaW5ncyBzaG91bGQgYmUgbnVsbCIsIGhhbUZpZWxkLmdldFR5cGVTdHJpbmcoKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQjZ2V0VHlwZVN0cmluZygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGVTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGVTdHJpbmcoKSB7CisgICAgICAgIGFzc2VydFRydWUoImdldFR5cGVTdHJpbmcgcmV0dXJuZWQ6ICIgKyBob2xhRmllbGQuZ2V0VHlwZVN0cmluZygpLAorICAgICAgICAgICAgICAgIGhvbGFGaWVsZC5nZXRUeXBlU3RyaW5nKCkuaW5kZXhPZigiT2JqZWN0IikgPj0gMCk7CisgICAgICAgIGFzc2VydE51bGwoIlByaW1pdGl2ZSB0eXBlcycgc3RyaW5ncyBzaG91bGQgYmUgbnVsbCIsIGhhbUZpZWxkLmdldFR5cGVTdHJpbmcoKSk7CiAgICAgICAgIAogICAgICAgICBPYmplY3RTdHJlYW1GaWVsZCBvc2YgPSBuZXcgT2JqZWN0U3RyZWFtRmllbGQoInMiLCBTdHJpbmcuY2xhc3MsIHRydWUpOwogICAgICAgICBhc3NlcnRUcnVlKG9zZi5nZXRUeXBlU3RyaW5nKCkgPT0gIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZC50b1N0cmluZygpCi0JCWFzc2VydFRydWUoInRvU3RyaW5nIG9uIGEgbG9uZyByZXR1cm5lZDogIiArIGJhbUZpZWxkLnRvU3RyaW5nKCksCi0JCQkJYmFtRmllbGQudG9TdHJpbmcoKS5pbmRleE9mKCJiYW0iKSA+PSAwKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQjdG9TdHJpbmcoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQudG9TdHJpbmcoKQorICAgICAgICBhc3NlcnRUcnVlKCJ0b1N0cmluZyBvbiBhIGxvbmcgcmV0dXJuZWQ6ICIgKyBiYW1GaWVsZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIGJhbUZpZWxkLnRvU3RyaW5nKCkuaW5kZXhPZigiYmFtIikgPj0gMCk7CisgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkI2dldFR5cGUoKSAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0VHlwZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICApICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlX0Rlc2VyaWFsaXplZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAyNCk7CkBAIC0xNzUsNiArMjUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQjZ2V0VHlwZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGVfTW9ja09iamVjdElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMjQpOwogICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKQEAgLTE5MSw3ICsyNzUsMTUgQEAKICAgICAgICAgT2JqZWN0U3RyZWFtRmllbGQgZmllbGQgPSBvYy5nZXRGaWVsZCgiaSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLCBmaWVsZC5nZXRUeXBlKCkpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNVbnNoYXJlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNVbnNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemFibGVPYmplY3QyIG9iaiA9IG5ldyBTZXJpYWxpemFibGVPYmplY3QyKCk7CiAgICAgICAgIApAQCAtMjIzLDI0ICszMTUsMjQgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9iamVjdFN0cmVhbUNsYXNzLmdldEZpZWxkKCJzIikuZ2V0T2Zmc2V0KCkpOwogICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCQlvc2MgPSBPYmplY3RTdHJlYW1DbGFzcy5sb29rdXAoRHVtbXlDbGFzcy5jbGFzcyk7Ci0JCWJhbUZpZWxkID0gb3NjLmdldEZpZWxkKCJiYW0iKTsKLQkJc2FtRmllbGQgPSBvc2MuZ2V0RmllbGQoInNhbSIpOwotCQloYW1GaWVsZCA9IG9zYy5nZXRGaWVsZCgiaGFtIik7Ci0JCWhvbGFGaWVsZCA9IG9zYy5nZXRGaWVsZCgiaG9sYSIpOwotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKER1bW15Q2xhc3MuY2xhc3MpOworICAgICAgICBiYW1GaWVsZCA9IG9zYy5nZXRGaWVsZCgiYmFtIik7CisgICAgICAgIHNhbUZpZWxkID0gb3NjLmdldEZpZWxkKCJzYW0iKTsKKyAgICAgICAgaGFtRmllbGQgPSBvc2MuZ2V0RmllbGQoImhhbSIpOworICAgICAgICBob2xhRmllbGQgPSBvc2MuZ2V0RmllbGQoImhvbGEiKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogfQogCiBjbGFzcyBTZXJpYWxpemFibGVPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL09wZW5SYW5kb21GaWxlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL09wZW5SYW5kb21GaWxlVGVzdC5qYXZhCmluZGV4IDIxNDEzMjAuLjUxNzY2NjEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PcGVuUmFuZG9tRmlsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT3BlblJhbmRvbUZpbGVUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjYsNDQgKzMxLDYxIEBACiAvKioKICAqIFRPRE8gVHlwZSBkZXNjcmlwdGlvbgogICovCitAVGVzdFRhcmdldENsYXNzKFJhbmRvbUFjY2Vzc0ZpbGUuY2xhc3MpIAogcHVibGljIGNsYXNzIE9wZW5SYW5kb21GaWxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IE9wZW5SYW5kb21GaWxlVGVzdCgpLnRlc3RPcGVuRW1wdHlGaWxlKCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbmV3IE9wZW5SYW5kb21GaWxlVGVzdCgpLnRlc3RPcGVuRW1wdHlGaWxlKCk7CisgICAgfQogCi0JcHVibGljIE9wZW5SYW5kb21GaWxlVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9CisgICAgcHVibGljIE9wZW5SYW5kb21GaWxlVGVzdCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIlJhbmRvbUFjY2Vzc0ZpbGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5Ob25FbXB0eUZpbGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgInRtcCIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgZm9zLndyaXRlKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCB9KTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOwogCi0JcHVibGljIHZvaWQgdGVzdE9wZW5Ob25FbXB0eUZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgInRtcCIpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQkJCWZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJZm9zLndyaXRlKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCB9KTsKLQkJCWZvcy5jbG9zZSgpOworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKKyAgICAgICAgICAgIHJhZi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbChleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJhbmRvbUFjY2Vzc0ZpbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5FbXB0eUZpbGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgInRtcCIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CiAKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7Ci0JCQlyYWYuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCWZhaWwoZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGVuRW1wdHlGaWxlKCkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdCIsICJ0bXAiKTsKLQkJCWFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7Ci0JCQlmaWxlLmRlbGV0ZU9uRXhpdCgpOwotCi0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwotCQkJcmFmLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlmYWlsKGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOworICAgICAgICAgICAgcmFmLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT3V0cHV0U3RyZWFtV3JpdGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL091dHB1dFN0cmVhbVdyaXRlclRlc3QuamF2YQppbmRleCA0ZWUzNjI4Li5hMGJhNGI3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vT3V0cHV0U3RyZWFtV3JpdGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9PdXRwdXRTdHJlYW1Xcml0ZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0zNSw2ODIgKzQwLDg1NCBAQAogLyoqCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhPdXRwdXRTdHJlYW1Xcml0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIE91dHB1dFN0cmVhbVdyaXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVIgPSAweGQ4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQUEVSID0gMHhkODAwOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAwMDA7CiAKLQlwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0OwogCi0JcHJpdmF0ZSBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyOworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlcjsKIAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2UgPSAiVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSB3aXRoIFVuaWNvZGUgY2hhcmFjdGVyLiBcdTRlMmRcdTU2ZmQgaXMgQ2hpbmEncyBuYW1lIGluIENoaW5lc2UiOworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2UgPSAiVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSB3aXRoIFVuaWNvZGUgY2hhcmFjdGVyLiBcdTRlMmRcdTU2ZmQgaXMgQ2hpbmEncyBuYW1lIGluIENoaW5lc2UiOwogCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gTUlOSU1BTF9DSEFSU0VUUyA9IG5ldyBTdHJpbmdbXSB7ICJVUy1BU0NJSSIsCi0JCQkiSVNPLTg4NTktMSIsICJVVEYtMTZCRSIsICJVVEYtMTZMRSIsICJVVEYtMTYiLCAiVVRGLTgiIH07CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gTUlOSU1BTF9DSEFSU0VUUyA9IG5ldyBTdHJpbmdbXSB7ICJVUy1BU0NJSSIsCisgICAgICAgICAgICAiSVNPLTg4NTktMSIsICJVVEYtMTZCRSIsICJVVEYtMTZMRSIsICJVVEYtMTYiLCAiVVRGLTgiIH07CiAKLQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3OworICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3c7CiAKLQlJbnB1dFN0cmVhbVJlYWRlciBpc3I7CisgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyOwogCi0JcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZm9zOworICAgIHByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZvczsKIAotCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRlc3RfQWxsX1Rlc3RzXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5SW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19EYXRhSW5wdXRTdHJlYW1cbiI7CisgICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiVGVzdF9BbGxfVGVzdHNcblRlc3RfamF2YV9pb19CdWZmZXJlZElucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0RhdGFJbnB1dFN0cmVhbVxuIjsKIAotCS8qCi0JICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgInV0Zi04Iik7CisgICAgLyoKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAidXRmLTgiKTsKIAotCQlmb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCW9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zKTsKLQl9CisgICAgICAgIGZvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MpOworICAgIH0KIAotCS8qCi0JICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci5jbG9zZSgpOworICAgIC8qCisgICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwogCi0JCQlpZiAoaXNyICE9IG51bGwpCi0JCQkJaXNyLmNsb3NlKCk7Ci0JCQlvc3cuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICAgICAgaWYgKGlzciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGlzci5jbG9zZSgpOworICAgICAgICAgICAgb3N3LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlzdXBlci50ZWFyRG93bigpOwotCX0KKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsdXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEZsdXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZShzb3VyY2UpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG91dC50b1N0cmluZygidXRmLTgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZSwgcmVzdWx0KTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCXdyaXRlci5jbG9zZSgpOwotCQl0cnkgewotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbHVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQl3cml0ZXIud3JpdGUoc291cmNlKTsKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBvdXQudG9TdHJpbmcoInV0Zi04Iik7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHJlc3VsdCk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIHdyaXRlKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdyaXRlY2hhckFycmF5aW50aW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hhcltdIGNoYXJzID0gc291cmNlLnRvQ2hhckFycmF5KCk7Ci0JCQotCQkvL3Rocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIG9mZnNldCBpcyBuZWdhdGl2ZQotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKChjaGFyW10pIG51bGwsIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJLy90aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhvdWdoIGNvdW50IGlzIG5lZ2F0aXZlIAotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKChjaGFyW10pIG51bGwsIDEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgoY2hhcltdKSBudWxsLCAxLCAxKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUobmV3IGNoYXJbMF0sIDAsIDEpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKGNoYXJzLCAtMSwgMSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoY2hhcnMsIDAsIC0xKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShjaGFycywgMSwgY2hhcnMubGVuZ3RoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJd3JpdGVyLndyaXRlKGNoYXJzLCAxLCAyKTsKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCWFzc2VydEVxdWFscygiaGkiLCBvdXQudG9TdHJpbmcoInV0Zi04IikpOwotCQl3cml0ZXIud3JpdGUoY2hhcnMsIDAsIGNoYXJzLmxlbmd0aCk7Ci0JCXdyaXRlci5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoImhpIiArIHNvdXJjZSwgb3V0LnRvU3RyaW5nKCJ1dGYtOCIpKTsKLQkJCQotCQl3cml0ZXIuY2xvc2UoKTsKKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgd3JpdGUoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlY2hhckFycmF5aW50aW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcltdIGNoYXJzID0gc291cmNlLnRvQ2hhckFycmF5KCk7CisgICAgICAgIAorICAgICAgICAvL3Rocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aG91Z2ggY291bnQgaXMgbmVnYXRpdmUgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoKGNoYXJbXSkgbnVsbCwgMCwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUobmV3IGNoYXJbMF0sIDAsIDEpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNoYXJzLCAtMSwgMSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoY2hhcnMsIDAsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShjaGFycywgMSwgY2hhcnMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLndyaXRlKGNoYXJzLCAxLCAyKTsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGkiLCBvdXQudG9TdHJpbmcoInV0Zi04IikpOworICAgICAgICB3cml0ZXIud3JpdGUoY2hhcnMsIDAsIGNoYXJzLmxlbmd0aCk7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhpIiArIHNvdXJjZSwgb3V0LnRvU3RyaW5nKCJ1dGYtOCIpKTsKKyAgICAgICAgICAgIAorICAgICAgICB3cml0ZXIuY2xvc2UoKTsKICAgICAgICAgLy9hZnRlciB0aGUgc3RyZWFtIGlzIGNsb3NlZCAsc2hvdWxkIHRocm93IElPRXhjZXB0aW9uIGZpcnN0Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoKGNoYXJbXSkgbnVsbCwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCB3cml0ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdyaXRlaW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGVyLndyaXRlKDEpOwotCQl3cml0ZXIuZmx1c2goKTsKLQkJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksICJ1dGYtOCIpOwotCQlhc3NlcnRFcXVhbHMoIlx1MDAwMSIsIHN0cik7Ci0KLQkJd3JpdGVyLndyaXRlKDIpOwotCQl3cml0ZXIuZmx1c2goKTsKLQkJc3RyID0gbmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSwgInV0Zi04Iik7Ci0JCWFzc2VydEVxdWFscygiXHUwMDAxXHUwMDAyIiwgc3RyKTsKLQotCQl3cml0ZXIud3JpdGUoLTEpOwotCQl3cml0ZXIuZmx1c2goKTsKLQkJc3RyID0gbmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSwgInV0Zi04Iik7Ci0JCWFzc2VydEVxdWFscygiXHUwMDAxXHUwMDAyXHVmZmZmIiwgc3RyKTsKLQotCQl3cml0ZXIud3JpdGUoMHhmZWRjYik7Ci0JCXdyaXRlci5mbHVzaCgpOwotCQlzdHIgPSBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpLCAidXRmLTgiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcdTAwMDFcdTAwMDJcdWZmZmZcdWVkY2IiLCBzdHIpOwotCQkKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCSAvL2FmdGVyIHRoZSBzdHJlYW0gaXMgY2xvc2VkICxzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24KLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgxKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgoY2hhcltdKSBudWxsLCAtMSwgLTEpOwogICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJCi0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KIAotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCB3cml0ZShTdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXcml0ZVN0cmluZ2ludGludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCwgMSwgMSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKCIiLCAwLCAxKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgiYWJjIiwgLTEsIDEpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKCJhYmMiLCAwLCAtMSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoImFiYyIsIDEsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJLy90aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBiZWZvcmUgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgY291bnQgaXMgbmVnYXRpdmUKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgoU3RyaW5nKSBudWxsLCAtMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJCi0JCS8vdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGJlZm9yZSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIAotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKChTdHJpbmcpIG51bGwsIC0xLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJCi0JCXdyaXRlci53cml0ZSgiYWJjIiwgMSwgMik7Ci0JCXdyaXRlci5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoImJjIiwgb3V0LnRvU3RyaW5nKCJ1dGYtOCIpKTsKLQkJd3JpdGVyLndyaXRlKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpKTsKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCWFzc2VydEVxdWFscygiYmMiICsgc291cmNlLCBvdXQudG9TdHJpbmcoInV0Zi04IikpOwotCQkKLQkJd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIC8vdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZmlyc3QgaWYgY291bnQgaXMgbmVnYXRpdmUKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgoU3RyaW5nKSBudWxsLCAwLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgoU3RyaW5nKSBudWxsLCAtMSwgMCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKCJhYmMiLCAtMSwgMCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJLy90aHJvd3MgSU9FeGNlcHRpb24KLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgiYWJjIiwgMCwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9CisgICAgfQogCi0JfQorICAgIC8qCisgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCB3cml0ZShpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlaW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKDEpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksICJ1dGYtOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDAwMSIsIHN0cik7CiAKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgT3V0cHV0U3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0U3RyZWFtV3JpdGVyT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyMiA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0KTsKLQkJd3JpdGVyMi5jbG9zZSgpOwotCX0KKyAgICAgICAgd3JpdGVyLndyaXRlKDIpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgc3RyID0gbmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSwgInV0Zi04Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiXHUwMDAxXHUwMDAyIiwgc3RyKTsKIAotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBPdXRwdXRTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE91dHB1dFN0cmVhbVdyaXRlck91dHB1dFN0cmVhbVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG51bGwsICJ1dGYtOCIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgImJhZG5hbWUiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAoU3RyaW5nKSBudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCU91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJhc2NpaSIpOwotCQlhc3NlcnRFcXVhbHMoQ2hhcnNldC5mb3JOYW1lKCJhc2NpaSIpLCBDaGFyc2V0LmZvck5hbWUod3JpdGVyMgotCQkJCS5nZXRFbmNvZGluZygpKSk7Ci0JCXdyaXRlcjIuY2xvc2UoKTsKLQl9CisgICAgICAgIHdyaXRlci53cml0ZSgtMSk7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICBzdHIgPSBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpLCAidXRmLTgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdTAwMDFcdTAwMDJcdWZmZmYiLCBzdHIpOwogCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIE91dHB1dFN0cmVhbVdyaXRlcihPdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE91dHB1dFN0cmVhbVdyaXRlck91dHB1dFN0cmVhbUNoYXJzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDaGFyc2V0IGNzID0gQ2hhcnNldC5mb3JOYW1lKCJhc2NpaSIpOwotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihudWxsLCBjcyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIChDaGFyc2V0KSBudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCU91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIGNzKTsKLQkJYXNzZXJ0RXF1YWxzKGNzLCBDaGFyc2V0LmZvck5hbWUod3JpdGVyMi5nZXRFbmNvZGluZygpKSk7Ci0JCXdyaXRlcjIuY2xvc2UoKTsKLQl9CisgICAgICAgIHdyaXRlci53cml0ZSgweGZlZGNiKTsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIHN0ciA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksICJ1dGYtOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDAwMVx1MDAwMlx1ZmZmZlx1ZWRjYiIsIHN0cik7CisgICAgICAgIAorICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgIC8vYWZ0ZXIgdGhlIHN0cmVhbSBpcyBjbG9zZWQgLHNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKDEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgfQogCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIE91dHB1dFN0cmVhbVdyaXRlcihPdXRwdXRTdHJlYW0sIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0U3RyZWFtV3JpdGVyT3V0cHV0U3RyZWFtQ2hhcnNldEVuY29kZXIoKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ2hhcnNldCBjcyA9IENoYXJzZXQuZm9yTmFtZSgiYXNjaWkiKTsKLQkJQ2hhcnNldEVuY29kZXIgZW5jID0gY3MubmV3RW5jb2RlcigpOwotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihudWxsLCBlbmMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAoQ2hhcnNldEVuY29kZXIpIG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlcjIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgY3MpOwotCQlhc3NlcnRFcXVhbHMoY3MsIENoYXJzZXQuZm9yTmFtZSh3cml0ZXIyLmdldEVuY29kaW5nKCkpKTsKLQkJd3JpdGVyMi5jbG9zZSgpOwotCX0KKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgd3JpdGUoU3RyaW5nLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVN0cmluZ2ludGludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCwgMCwgMSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIiLCAwLCAxKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiYWJjIiwgLTEsIDEpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJhYmMiLCAwLCAtMSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoImFiYyIsIDEsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy90aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gYmVmb3JlIFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCwgLTEsIDApOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd3JpdGVyLndyaXRlKCJhYmMiLCAxLCAyKTsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmMiLCBvdXQudG9TdHJpbmcoInV0Zi04IikpOworICAgICAgICB3cml0ZXIud3JpdGUoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCkpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYyIgKyBzb3VyY2UsIG91dC50b1N0cmluZygidXRmLTgiKSk7CisgICAgICAgIAorICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoKFN0cmluZykgbnVsbCwgLTEsIDApOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiYWJjIiwgLTEsIDApOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoImFiYyIsIDAsIDEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEdldEVuY29kaW5nKCkgewotCQlDaGFyc2V0IGNzID0gQ2hhcnNldC5mb3JOYW1lKCJ1dGYtOCIpOwotCQlhc3NlcnRFcXVhbHMoY3MsIENoYXJzZXQuZm9yTmFtZSh3cml0ZXIuZ2V0RW5jb2RpbmcoKSkpOwotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRWFybHlFT0ZDaGFyXzEoKSB7Ci0JCVN0cmluZyBzdHIgPSAiQWxsIHdvcmsgYW5kIG5vIHBsYXkgbWFrZXMgSmFjayBhIGR1bGwgYm95XG4iOyAvLyROT04tTkxTLTEkCi0JCWludCBOVU1CRVIgPSAyMDQ4OwotCQlpbnQgaiA9IDA7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCkgKiBOVU1CRVI7Ci0JCS8qID09IDg4MDY0ICovLyogTlVNQkVSIGNvbXB1bHNpdmVseSB3cml0dGVuIGNvcGllcyBvZiB0aGUgc2FtZSBzdHJpbmcgKi8KLQkJY2hhcltdIHN0ckNoYXJzID0gbmV3IGNoYXJbbGVuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1CRVI7ICsraSkgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzdHIubGVuZ3RoKCk7ICsraykgewotCQkJCXN0ckNoYXJzW2orK10gPSBzdHIuY2hhckF0KGspOwotCQkJfQotCQl9Ci0JCUZpbGUgZiA9IG51bGw7Ci0JCUZpbGVXcml0ZXIgZncgPSBudWxsOwotCQl0cnkgewotCQkJZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm9ueSIsICJieV9vbmUiKTsKLQkJCWZ3ID0gbmV3IEZpbGVXcml0ZXIoZik7Ci0JCQlmdy53cml0ZShzdHJDaGFycyk7Ci0JCQlmdy5jbG9zZSgpOwotCQkJSW5wdXRTdHJlYW1SZWFkZXIgaW4gPSBudWxsOwotCQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0JCQlpbiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMpOwotCQkJaW50IGI7Ci0JCQlpbnQgZXJyb3JzID0gMDsKLQkJCWZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IHN0ckNoYXJzLmxlbmd0aDsgKytvZmZzZXQpIHsKLQkJCQliID0gaW4ucmVhZCgpOwotCQkJCWlmIChiID09IC0xKSB7Ci0JCQkJCWZhaWwoIkVhcmx5IEVPRiBhdCBvZmZzZXQgIiArIG9mZnNldCArICJcbiIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKDAsIGVycm9ycyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9CisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIE91dHB1dFN0cmVhbVdyaXRlcihPdXRwdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiW0NoZWNrIHNob3VsZCBpdCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbj9dIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiT3V0cHV0U3RyZWFtV3JpdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0U3RyZWFtV3JpdGVyT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyMiA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0KTsKKyAgICAgICAgd3JpdGVyMi5jbG9zZSgpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RIYW5kbGVFYXJseUVPRkNoYXJfMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjYXBhY2l0eSA9IDY1NTM2OwotCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtjYXBhY2l0eV07Ci0JCWJ5dGVbXSBicyA9IHsgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcgfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotCQkJYnl0ZXNbaV0gPSBic1tpIC8gODE5Ml07Ci0JCX0KLQkJU3RyaW5nIGlucHV0U3RyID0gbmV3IFN0cmluZyhieXRlcyk7Ci0JCWludCBsZW4gPSBpbnB1dFN0ci5sZW5ndGgoKTsKLQkJRmlsZSBmID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiRmlsZVdyaXRlckJ1Z1Rlc3QgIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZVdyaXRlciB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmKTsKLQkJd3JpdGVyLndyaXRlKGlucHV0U3RyKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCWxvbmcgZmxlbiA9IGYubGVuZ3RoKCk7CisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIE91dHB1dFN0cmVhbVdyaXRlcihPdXRwdXRTdHJlYW0sIFN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVjayBleGNlcHRpb24gdHlwZXMgd2hpY2ggY29uc3RydWN0b3IgY2FuIHRocm93IGV4Y2VwdCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiT3V0cHV0U3RyZWFtV3JpdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0U3RyZWFtV3JpdGVyT3V0cHV0U3RyZWFtU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobnVsbCwgInV0Zi04Iik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICIiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiYmFkbmFtZSIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIChTdHJpbmcpIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlcjIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgImFzY2lpIik7CisgICAgICAgIGFzc2VydEVxdWFscyhDaGFyc2V0LmZvck5hbWUoImFzY2lpIiksIENoYXJzZXQuZm9yTmFtZSh3cml0ZXIyCisgICAgICAgICAgICAgICAgLmdldEVuY29kaW5nKCkpKTsKKyAgICAgICAgd3JpdGVyMi5jbG9zZSgpOworICAgIH0KIAotCQlGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGYpOwotCQljaGFyW10gb3V0Q2hhcnMgPSBuZXcgY2hhcltjYXBhY2l0eV07Ci0JCWludCBvdXRDb3VudCA9IHJlYWRlci5yZWFkKG91dENoYXJzKTsKLQkJU3RyaW5nIG91dFN0ciA9IG5ldyBTdHJpbmcob3V0Q2hhcnMsIDAsIG91dENvdW50KTsKKyAgICAvKgorICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgT3V0cHV0U3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSwgQ2hhcnNldCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJDaGVjayBzaG91bGQgaXQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24/IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiT3V0cHV0U3RyZWFtV3JpdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRwdXRTdHJlYW1Xcml0ZXJPdXRwdXRTdHJlYW1DaGFyc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2hhcnNldCBjcyA9IENoYXJzZXQuZm9yTmFtZSgiYXNjaWkiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobnVsbCwgY3MpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAoQ2hhcnNldCkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyMiA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBjcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhjcywgQ2hhcnNldC5mb3JOYW1lKHdyaXRlcjIuZ2V0RW5jb2RpbmcoKSkpOworICAgICAgICB3cml0ZXIyLmNsb3NlKCk7CisgICAgfQogCi0JCWYuZGVsZXRlT25FeGl0KCk7Ci0JCWFzc2VydEVxdWFscyhsZW4sIGZsZW4pOwotCQlhc3NlcnRFcXVhbHMoaW5wdXRTdHIsIG91dFN0cik7CisgICAgLyoKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIE91dHB1dFN0cmVhbVdyaXRlcihPdXRwdXRTdHJlYW0sIENoYXJzZXRFbmNvZGVyKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgIHB1cnBvc2UgPSAiQ2hlY2sgc2hvdWxkIGl0IHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uPyIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIk91dHB1dFN0cmVhbVdyaXRlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3MsIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdE91dHB1dFN0cmVhbVdyaXRlck91dHB1dFN0cmVhbUNoYXJzZXRFbmNvZGVyKCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENoYXJzZXQgY3MgPSBDaGFyc2V0LmZvck5hbWUoImFzY2lpIik7CisgICAgICAgIENoYXJzZXRFbmNvZGVyIGVuYyA9IGNzLm5ld0VuY29kZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobnVsbCwgZW5jKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgKENoYXJzZXRFbmNvZGVyKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIGNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNzLCBDaGFyc2V0LmZvck5hbWUod3JpdGVyMi5nZXRFbmNvZGluZygpKSk7CisgICAgICAgIHdyaXRlcjIuY2xvc2UoKTsKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEVuY29kaW5nKCkgeworICAgICAgICBDaGFyc2V0IGNzID0gQ2hhcnNldC5mb3JOYW1lKCJ1dGYtOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY3MsIENoYXJzZXQuZm9yTmFtZSh3cml0ZXIuZ2V0RW5jb2RpbmcoKSkpOworICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUVhcmx5RU9GQ2hhcl8xKCkgeworICAgICAgICBTdHJpbmcgc3RyID0gIkFsbCB3b3JrIGFuZCBubyBwbGF5IG1ha2VzIEphY2sgYSBkdWxsIGJveVxuIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICBpbnQgTlVNQkVSID0gMjA0ODsKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICBpbnQgbGVuID0gc3RyLmxlbmd0aCgpICogTlVNQkVSOworICAgICAgICAvKiA9PSA4ODA2NCAqLy8qIE5VTUJFUiBjb21wdWxzaXZlbHkgd3JpdHRlbiBjb3BpZXMgb2YgdGhlIHNhbWUgc3RyaW5nICovCisgICAgICAgIGNoYXJbXSBzdHJDaGFycyA9IG5ldyBjaGFyW2xlbl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNQkVSOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc3RyLmxlbmd0aCgpOyArK2spIHsKKyAgICAgICAgICAgICAgICBzdHJDaGFyc1tqKytdID0gc3RyLmNoYXJBdChrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGaWxlIGYgPSBudWxsOworICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJvbnkiLCAiYnlfb25lIik7CisgICAgICAgICAgICBmdyA9IG5ldyBGaWxlV3JpdGVyKGYpOworICAgICAgICAgICAgZncud3JpdGUoc3RyQ2hhcnMpOworICAgICAgICAgICAgZncuY2xvc2UoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGluID0gbnVsbDsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOworICAgICAgICAgICAgaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzKTsKKyAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgaW50IGVycm9ycyA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBzdHJDaGFycy5sZW5ndGg7ICsrb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgYiA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJFYXJseSBFT0YgYXQgb2Zmc2V0ICIgKyBvZmZzZXQgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBlcnJvcnMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRWFybHlFT0ZDaGFyXzIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgY2FwYWNpdHkgPSA2NTUzNjsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbY2FwYWNpdHldOworICAgICAgICBieXRlW10gYnMgPSB7ICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVzW2ldID0gYnNbaSAvIDgxOTJdOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBpbnB1dFN0ciA9IG5ldyBTdHJpbmcoYnl0ZXMpOworICAgICAgICBpbnQgbGVuID0gaW5wdXRTdHIubGVuZ3RoKCk7CisgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIkZpbGVXcml0ZXJCdWdUZXN0ICIsIG51bGwpOyAvLyROT04tTkxTLTEkCisgICAgICAgIEZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZik7CisgICAgICAgIHdyaXRlci53cml0ZShpbnB1dFN0cik7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICBsb25nIGZsZW4gPSBmLmxlbmd0aCgpOwogCi0JfQorICAgICAgICBGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGYpOworICAgICAgICBjaGFyW10gb3V0Q2hhcnMgPSBuZXcgY2hhcltjYXBhY2l0eV07CisgICAgICAgIGludCBvdXRDb3VudCA9IHJlYWRlci5yZWFkKG91dENoYXJzKTsKKyAgICAgICAgU3RyaW5nIG91dFN0ciA9IG5ldyBTdHJpbmcob3V0Q2hhcnMsIDAsIG91dENvdW50KTsKIAotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVDaGFySU8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBNSU5JTUFMX0NIQVJTRVRTLmxlbmd0aDsgKytpKSB7Ci0JCQl0cnkgewotCQkJCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgTUlOSU1BTF9DSEFSU0VUU1tpXSk7CisgICAgICAgIGYuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhsZW4sIGZsZW4pOworICAgICAgICBhc3NlcnRFcXVhbHMoaW5wdXRTdHIsIG91dFN0cik7CiAKLQkJCQlpbnQgdXBwZXIgPSBVUFBFUjsKLQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXVwcGVyID0gMTI4OwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXVwcGVyID0gMjU2OwotCQkJCQlicmVhazsKLQkJCQl9CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApICAgICAgICAKKyAgICB9KSAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2hhcklPKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUlOSU1BTF9DSEFSU0VUUy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIE1JTklNQUxfQ0hBUlNFVFNbaV0pOwogCi0JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCB1cHBlcjsgKytjKSB7Ci0JCQkJCXdyaXRlci53cml0ZShjKTsKLQkJCQl9Ci0JCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQkJYnl0ZVtdIHJlc3VsdCA9IG91dC50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgICAgIGludCB1cHBlciA9IFVQUEVSOworICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSAxMjg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KSwKLQkJCQkJCU1JTklNQUxfQ0hBUlNFVFNbaV0pOwotCQkJCWZvciAoaW50IGV4cGVjdGVkID0gMDsgZXhwZWN0ZWQgPCB1cHBlcjsgKytleHBlY3RlZCkgewotCQkJCQlhc3NlcnRFcXVhbHMoIkVycm9yIHdoZW4gcmVhZGluZyBieXRlcyBpbiAiCi0JCQkJCQkJKyBNSU5JTUFMX0NIQVJTRVRTW2ldLCBleHBlY3RlZCwgaXNyLnJlYWQoKSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpc3IuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQl0cnkgewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHVwcGVyOyArK2MpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gb3V0LnRvQnl0ZUFycmF5KCk7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0QmxvY2tJTygpIHRocm93cyBFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBudWxsOwotCQljaGFyW10gbGFyZ2VCdWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgTUlOSU1BTF9DSEFSU0VUUy5sZW5ndGg7ICsraSkgewotCQkJdHJ5IHsKLQkJCQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIE1JTklNQUxfQ0hBUlNFVFNbaV0pOworICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JTklNQUxfQ0hBUlNFVFNbaV0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGV4cGVjdGVkID0gMDsgZXhwZWN0ZWQgPCB1cHBlcjsgKytleHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkVycm9yIHdoZW4gcmVhZGluZyBieXRlcyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNSU5JTUFMX0NIQVJTRVRTW2ldLCBleHBlY3RlZCwgaXNyLnJlYWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpc3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvY2tJTygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBudWxsOworICAgICAgICBjaGFyW10gbGFyZ2VCdWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUlOSU1BTF9DSEFSU0VUUy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIE1JTklNQUxfQ0hBUlNFVFNbaV0pOwogCi0JCQkJaW50IHVwcGVyID0gVVBQRVI7Ci0JCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQl1cHBlciA9IDEyODsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQl1cHBlciA9IDI1NjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGludCB1cHBlciA9IFVQUEVSOworICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSAxMjg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWludCBtID0gMDsKLQkJCQlmb3IgKGludCBjID0gMDsgYyA8IHVwcGVyOyArK2MpIHsKLQkJCQkJbGFyZ2VCdWZmZXJbbSsrXSA9IChjaGFyKSBjOwotCQkJCQlpZiAobSA9PSBCVUZGRVJfU0laRSkgewotCQkJCQkJd3JpdGVyLndyaXRlKGxhcmdlQnVmZmVyKTsKLQkJCQkJCW0gPSAwOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdyaXRlci53cml0ZShsYXJnZUJ1ZmZlciwgMCwgbSk7Ci0JCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQkJYnl0ZVtdIHJlc3VsdCA9IG91dC50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgICAgIGludCBtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHVwcGVyOyArK2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VCdWZmZXJbbSsrXSA9IChjaGFyKSBjOworICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSBCVUZGRVJfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGxhcmdlQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShsYXJnZUJ1ZmZlciwgMCwgbSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG91dC50b0J5dGVBcnJheSgpOwogCi0JCQkJaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHQpLAotCQkJCQkJTUlOSU1BTF9DSEFSU0VUU1tpXSk7Ci0JCQkJaW50IGV4cGVjdGVkID0gMCwgcmVhZCA9IDAsIGogPSAwOwotCQkJCXdoaWxlIChleHBlY3RlZCA8IHVwcGVyKSB7Ci0JCQkJCWlmIChqID09IHJlYWQpIHsKLQkJCQkJCXJlYWQgPSBpc3IucmVhZChsYXJnZUJ1ZmZlcik7Ci0JCQkJCQlqID0gMDsKLQkJCQkJfQotCQkJCQlhc3NlcnRFcXVhbHMoIkVycm9yIHdoZW4gcmVhZGluZyBieXRlcyBpbiAiCi0JCQkJCQkJKyBNSU5JTUFMX0NIQVJTRVRTW2ldLCBleHBlY3RlZCsrLCBsYXJnZUJ1ZmZlcltqKytdKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlzci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JTklNQUxfQ0hBUlNFVFNbaV0pOworICAgICAgICAgICAgICAgIGludCBleHBlY3RlZCA9IDAsIHJlYWQgPSAwLCBqID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZXhwZWN0ZWQgPCB1cHBlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSByZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkID0gaXNyLnJlYWQobGFyZ2VCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFcnJvciB3aGVuIHJlYWRpbmcgYnl0ZXMgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUlOSU1BTF9DSEFSU0VUU1tpXSwgZXhwZWN0ZWQrKywgbGFyZ2VCdWZmZXJbaisrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpc3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlciNPdXRwdXRTdHJlYW1Xcml0ZXIoamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyKGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCQlhc3NlcnRUcnVlKCJVc2VkIGluIHRlc3RzIiwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlciNPdXRwdXRTdHJlYW1Xcml0ZXIoamF2YS5pby5PdXRwdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlNlZSBzZXRVcC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJPdXRwdXRTdHJlYW1Xcml0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW0oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVXNlZCBpbiB0ZXN0cyIsIHRydWUpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlciNPdXRwdXRTdHJlYW1Xcml0ZXIoamF2YS5pby5PdXRwdXRTdHJlYW0sCi0JICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX091dHB1dFN0cmVhbUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIoamF2YS5pby5PdXRwdXRTdHJlYW0sCi0JCS8vIGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIjg4NTlfMSIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuYWJsZSB0byBjcmVhdGUgb3V0cHV0IHN0cmVhbSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCAiQm9ndXMiKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IFVuc3VwcG9ydGVkIEVuY29kaW5nIGV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIjT3V0cHV0U3RyZWFtV3JpdGVyKGphdmEuaW8uT3V0cHV0U3RyZWFtLAorICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiT3V0cHV0U3RyZWFtV3JpdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSwKKyAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCAiODg1OV8xIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5hYmxlIHRvIGNyZWF0ZSBvdXRwdXQgc3RyZWFtIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJCb2d1cyIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gdGhyb3cgVW5zdXBwb3J0ZWQgRW5jb2RpbmcgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlci5jbG9zZSgpCi0JCWJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlvc3cuY2xvc2UoKTsKLQkJCW9zdy53cml0ZSh0ZXN0U3RyaW5nLCAwLCB0ZXN0U3RyaW5nLmxlbmd0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJDaGFycyB3cml0dGVuIGFmdGVyIGNsb3NlIiwgZXhjZXB0aW9uKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIjY2xvc2UoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCkKKyAgICAgICAgYm9vbGVhbiBleGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zdy5jbG9zZSgpOworICAgICAgICAgICAgb3N3LndyaXRlKHRlc3RTdHJpbmcsIDAsIHRlc3RTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkNoYXJzIHdyaXR0ZW4gYWZ0ZXIgY2xvc2UiLCBleGNlcHRpb24pOwogCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYm91dCwKLQkJCQkJIklTTzIwMjJKUCIpOwotCQkJd3JpdGVyLndyaXRlKG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJCS8vIHRoZSBkZWZhdWx0IGlzIEFTQ0lJLCB0aGVyZSBzaG91bGQgbm90IGJlIGFueSBtb2RlIGNoYW5nZXMKLQkJCVN0cmluZyBjb252ZXJ0ZWQgPSBuZXcgU3RyaW5nKGJvdXQudG9CeXRlQXJyYXkoKSwgIklTTzg4NTlfMSIpOwotCQkJYXNzZXJ0VHJ1ZSgiaW52YWxpZCBjb252ZXJzaW9uIDE6ICIgKyBjb252ZXJ0ZWQsIGNvbnZlcnRlZAotCQkJCQkuZXF1YWxzKCJhIikpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJvdXQsCisgICAgICAgICAgICAgICAgICAgICJJU08yMDIySlAiKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShuZXcgY2hhcltdIHsgJ2EnIH0pOworICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBpcyBBU0NJSSwgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgbW9kZSBjaGFuZ2VzCisgICAgICAgICAgICBTdHJpbmcgY29udmVydGVkID0gbmV3IFN0cmluZyhib3V0LnRvQnl0ZUFycmF5KCksICJJU084ODU5XzEiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImludmFsaWQgY29udmVyc2lvbiAxOiAiICsgY29udmVydGVkLCBjb252ZXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiYSIpKTsKIAotCQkJYm91dC5yZXNldCgpOwotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihib3V0LCAiSVNPMjAyMkpQIik7Ci0JCQl3cml0ZXIud3JpdGUobmV3IGNoYXJbXSB7ICdcdTMwNDgnIH0pOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQkvLyB0aGUgYnl0ZSBzZXF1ZW5jZSBzaG91bGQgbm90IHN3aXRjaCB0byBBU0NJSSBtb2RlIHVudGlsIHRoZQotCQkJLy8gc3RyZWFtIGlzIGNsb3NlZAotCQkJY29udmVydGVkID0gbmV3IFN0cmluZyhib3V0LnRvQnl0ZUFycmF5KCksICJJU084ODU5XzEiKTsKLQkJCWFzc2VydFRydWUoImludmFsaWQgY29udmVyc2lvbiAyOiAiICsgY29udmVydGVkLCBjb252ZXJ0ZWQKLQkJCQkJLmVxdWFscygiXHUwMDFiJEIkKCIpKTsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQkJY29udmVydGVkID0gbmV3IFN0cmluZyhib3V0LnRvQnl0ZUFycmF5KCksICJJU084ODU5XzEiKTsKLQkJCWFzc2VydFRydWUoImludmFsaWQgY29udmVyc2lvbiAzOiAiICsgY29udmVydGVkLCBjb252ZXJ0ZWQKLQkJCQkJLmVxdWFscygiXHUwMDFiJEIkKFx1MDAxYihCIikpOworICAgICAgICAgICAgYm91dC5yZXNldCgpOworICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihib3V0LCAiSVNPMjAyMkpQIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUobmV3IGNoYXJbXSB7ICdcdTMwNDgnIH0pOworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAvLyB0aGUgYnl0ZSBzZXF1ZW5jZSBzaG91bGQgbm90IHN3aXRjaCB0byBBU0NJSSBtb2RlIHVudGlsIHRoZQorICAgICAgICAgICAgLy8gc3RyZWFtIGlzIGNsb3NlZAorICAgICAgICAgICAgY29udmVydGVkID0gbmV3IFN0cmluZyhib3V0LnRvQnl0ZUFycmF5KCksICJJU084ODU5XzEiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImludmFsaWQgY29udmVyc2lvbiAyOiAiICsgY29udmVydGVkLCBjb252ZXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiXHUwMDFiJEIkKCIpKTsKKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgY29udmVydGVkID0gbmV3IFN0cmluZyhib3V0LnRvQnl0ZUFycmF5KCksICJJU084ODU5XzEiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImludmFsaWQgY29udmVyc2lvbiAzOiAiICsgY29udmVydGVkLCBjb252ZXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiXHUwMDFiJEIkKFx1MDAxYihCIikpOwogCi0JCQlib3V0LnJlc2V0KCk7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJvdXQsICJJU08yMDIySlAiKTsKLQkJCXdyaXRlci53cml0ZShuZXcgY2hhcltdIHsgJ1x1MzA0OCcgfSk7Ci0JCQl3cml0ZXIud3JpdGUobmV3IGNoYXJbXSB7ICdcdTMwNDgnIH0pOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkvLyB0aGVyZSBzaG91bGQgbm90IGJlIGEgbW9kZSBzd2l0Y2ggYmV0d2VlbiB3cml0ZXMKLQkJCWFzc2VydEVxdWFscygiaW52YWxpZCBjb252ZXJzaW9uIDQiLCAiXHUwMDFiJEIkKCQoXHUwMDFiKEIiLCBuZXcgU3RyaW5nKGJvdXQudG9CeXRlQXJyYXkoKSwKLQkJCQkJIklTTzg4NTlfMSIpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDYW4ndCB0ZXN0IG1pc3NpbmcgY29udmVydGVyCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQ6ICIgKyBlKTsKLQkJfQotCX0KKyAgICAgICAgICAgIGJvdXQucmVzZXQoKTsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYm91dCwgIklTTzIwMjJKUCIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKG5ldyBjaGFyW10geyAnXHUzMDQ4JyB9KTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShuZXcgY2hhcltdIHsgJ1x1MzA0OCcgfSk7CisgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBub3QgYmUgYSBtb2RlIHN3aXRjaCBiZXR3ZWVuIHdyaXRlcworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGNvbnZlcnNpb24gNCIsICJcdTAwMWIkQiQoJChcdTAwMWIoQiIsIG5ldyBTdHJpbmcoYm91dC50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAiSVNPODg1OV8xIikpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENhbid0IHRlc3QgbWlzc2luZyBjb252ZXJ0ZXIKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZDogIiArIGUpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyI2ZsdXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2ZsdXNoKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpCi0JCXRyeSB7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbdGVzdFN0cmluZy5sZW5ndGgoKV07Ci0JCQlvc3cud3JpdGUodGVzdFN0cmluZywgMCwgdGVzdFN0cmluZy5sZW5ndGgoKSk7Ci0JCQlvc3cuZmx1c2goKTsKLQkJCW9wZW5JbnB1dFN0cmVhbSgpOwotCQkJaXNyLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoIkNoYXJzIG5vdCBmbHVzaGVkIiwgbmV3IFN0cmluZyhidWYsIDAsIGJ1Zi5sZW5ndGgpCi0JCQkJCS5lcXVhbHModGVzdFN0cmluZykpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIjZmx1c2goKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclt0ZXN0U3RyaW5nLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIG9zdy53cml0ZSh0ZXN0U3RyaW5nLCAwLCB0ZXN0U3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIG9zdy5mbHVzaCgpOworICAgICAgICAgICAgb3BlbklucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBpc3IucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2hhcnMgbm90IGZsdXNoZWQiLCBuZXcgU3RyaW5nKGJ1ZiwgMCwgYnVmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyh0ZXN0U3RyaW5nKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyI2dldEVuY29kaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEVuY29kaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwotCQkvLyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlci5nZXRFbmNvZGluZygpCi0JCXRyeSB7Ci0JCQlvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIjg4NTlfMSIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGVuY29kaW5nIiwgCi0JCQkJCSI4ODU5XzEiLCBvc3cuZ2V0RW5jb2RpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyI2dldEVuY29kaW5nKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVuY29kaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZworICAgICAgICAvLyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlci5nZXRFbmNvZGluZygpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIjg4NTlfMSIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGVuY29kaW5nIiwgCisgICAgICAgICAgICAgICAgICAgICI4ODU5XzEiLCBvc3cuZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUoY2hhciBbXSwgaW50LAotCQkvLyBpbnQpCi0JCXRyeSB7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbdGVzdFN0cmluZy5sZW5ndGgoKV07Ci0JCQlvc3cud3JpdGUodGVzdFN0cmluZywgMCwgdGVzdFN0cmluZy5sZW5ndGgoKSk7Ci0JCQlvc3cuY2xvc2UoKTsKLQkJCW9wZW5JbnB1dFN0cmVhbSgpOwotCQkJaXNyLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBjaGFycyByZXR1cm5lZCIsIG5ldyBTdHJpbmcoYnVmLCAwLAotCQkJCQlidWYubGVuZ3RoKS5lcXVhbHModGVzdFN0cmluZykpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRDSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKGNoYXIgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW3Rlc3RTdHJpbmcubGVuZ3RoKCldOworICAgICAgICAgICAgb3N3LndyaXRlKHRlc3RTdHJpbmcsIDAsIHRlc3RTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICAgICAgb3N3LmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGlzci5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgY2hhcnMgcmV0dXJuZWQiLCBuZXcgU3RyaW5nKGJ1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgYnVmLmxlbmd0aCkuZXF1YWxzKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIjd3JpdGUoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlci53cml0ZShpbnQpCi0JCXRyeSB7Ci0JCQlvc3cud3JpdGUoJ1QnKTsKLQkJCW9zdy5jbG9zZSgpOwotCQkJb3BlbklucHV0U3RyZWFtKCk7Ci0JCQlpbnQgYyA9IGlzci5yZWFkKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjaGFyIHJldHVybmVkIiwgJ1QnLCAoY2hhcikgYyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlciN3cml0ZShpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zdy53cml0ZSgnVCcpOworICAgICAgICAgICAgb3N3LmNsb3NlKCk7CisgICAgICAgICAgICBvcGVuSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGludCBjID0gaXNyLnJlYWQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNoYXIgcmV0dXJuZWQiLCAnVCcsIChjaGFyKSBjKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUxqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMamF2YV9sYW5nX1N0cmluZ0lJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlci53cml0ZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKIAotCQl0cnkgewotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW3Rlc3RTdHJpbmcubGVuZ3RoKCldOwotCQkJb3N3LndyaXRlKHRlc3RTdHJpbmcsIDAsIHRlc3RTdHJpbmcubGVuZ3RoKCkpOwotCQkJb3N3LmNsb3NlKCk7Ci0JCQlvcGVuSW5wdXRTdHJlYW0oKTsKLQkJCWlzci5yZWFkKGJ1Zik7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgY2hhcnMgcmV0dXJuZWQiLCBuZXcgU3RyaW5nKGJ1ZiwgMCwKLQkJCQkJYnVmLmxlbmd0aCkuZXF1YWxzKHRlc3RTdHJpbmcpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbdGVzdFN0cmluZy5sZW5ndGgoKV07CisgICAgICAgICAgICBvc3cud3JpdGUodGVzdFN0cmluZywgMCwgdGVzdFN0cmluZy5sZW5ndGgoKSk7CisgICAgICAgICAgICBvc3cuY2xvc2UoKTsKKyAgICAgICAgICAgIG9wZW5JbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgaXNyLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBjaGFycyByZXR1cm5lZCIsIG5ldyBTdHJpbmcoYnVmLCAwLAorICAgICAgICAgICAgICAgICAgICBidWYubGVuZ3RoKS5lcXVhbHModGVzdFN0cmluZykpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBvcGVuSW5wdXRTdHJlYW0oKSB7Ci0JCWlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZm9zLnRvQnl0ZUFycmF5KCkpKTsKLQl9CisgICAgcHJpdmF0ZSB2b2lkIG9wZW5JbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZm9zLnRvQnl0ZUFycmF5KCkpLCAiVVRGLTgiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVVEYtOCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QaXBlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggMmQwNDUyOS4uNGFmZjZlOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE2LDY2ICsxNiw5OSBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUGlwZWRJbnB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUGlwZWRJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0Jc3RhdGljIGNsYXNzIFBXcml0ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCVBpcGVkT3V0cHV0U3RyZWFtIHBvczsKKyAgICBzdGF0aWMgY2xhc3MgUFdyaXRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgUGlwZWRPdXRwdXRTdHJlYW0gcG9zOwogCi0JCXB1YmxpYyBieXRlIGJ5dGVzW107CisgICAgICAgIHB1YmxpYyBieXRlIGJ5dGVzW107CiAKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlwb3Mud3JpdGUoYnl0ZXMpOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlub3RpZnkoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3Qgd3JpdGUgYnl0ZXMiKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBvcy53cml0ZShieXRlcyk7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCB3cml0ZSBieXRlcyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIFBXcml0ZXIoUGlwZWRPdXRwdXRTdHJlYW0gcG91dCwgaW50IG5ieXRlcykgewotCQkJcG9zID0gcG91dDsKLQkJCWJ5dGVzID0gbmV3IGJ5dGVbbmJ5dGVzXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspCi0JCQkJYnl0ZXNbaV0gPSAoYnl0ZSkgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICUgOSk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBQV3JpdGVyKFBpcGVkT3V0cHV0U3RyZWFtIHBvdXQsIGludCBuYnl0ZXMpIHsKKyAgICAgICAgICAgIHBvcyA9IHBvdXQ7CisgICAgICAgICAgICBieXRlcyA9IG5ldyBieXRlW25ieXRlc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlIDkpOworICAgICAgICB9CisgICAgfQogCi0JVGhyZWFkIHQ7CisgICAgVGhyZWFkIHQ7CiAKLQlQV3JpdGVyIHB3OworICAgIFBXcml0ZXIgcHc7CiAKLQlQaXBlZElucHV0U3RyZWFtIHBpczsKKyAgICBQaXBlZElucHV0U3RyZWFtIHBpczsKIAotCVBpcGVkT3V0cHV0U3RyZWFtIHBvczsKKyAgICBQaXBlZE91dHB1dFN0cmVhbSBwb3M7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QaXBlZElucHV0U3RyZWFtI1BpcGVkSW5wdXRTdHJlYW0oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0oKQotCQkvLyBVc2VkIGluIHRlc3RzCi0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jUGlwZWRJbnB1dFN0cmVhbSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBlbXB0eSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBpcGVkSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QaXBlZElucHV0U3RyZWFtKCkKKyAgICAgICAgLy8gVXNlZCBpbiB0ZXN0cworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jUGlwZWRJbnB1dFN0cmVhbShqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19QaXBlZE91dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jUGlwZWRJbnB1dFN0cmVhbShqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQaXBlZElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19QaXBlZE91dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QaXBlZElucHV0U3RyZWFtKGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0pCiAgICAgICAgIHBpcyA9IG5ldyBQaXBlZElucHV0U3RyZWFtKG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpKTsKICAgICAgICAgcGlzLmF2YWlsYWJsZSgpOwogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZhaWxhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hdmFpbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKICAgICAgICAgcGlzID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKICAgICAgICAgcG9zID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CkBAIC0xMDAsMzEgKzEzMyw0OSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhdmFpbGFibGUgY291bnQiLCAxMDI0ICwgcGluLmF2YWlsYWJsZSgpKTsKICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QaXBlZElucHV0U3RyZWFtI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtLmNsb3NlKCkKLQkJcGlzID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLQkJcG9zID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSNjbG9zZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbS5jbG9zZSgpCisgICAgICAgIHBpcyA9IG5ldyBQaXBlZElucHV0U3RyZWFtKCk7CisgICAgICAgIHBvcyA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwogICAgICAgICBwaXMuY29ubmVjdChwb3MpOwogICAgICAgICBwaXMuY2xvc2UoKTsKLQkJdHJ5IHsKLQkJCXBvcy53cml0ZSgoYnl0ZSkgMTI3KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBvcy53cml0ZSgoYnl0ZSkgMTI3KTsKICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byB0aHJvdyBleHBlY3RlZCBleGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVGhlIHNwZWMgZm9yIFBpcGVkSW5wdXQgc2F5YSBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZgotCQkJLy8gYSB3cml0ZSBpcyBhdHRlbXB0ZWQgdG8gYSBjbG9zZWQgaW5wdXQuIFRoZSBQaXBlZE91cHV0IHNwZWMKLQkJCS8vIGluZGljYXRlcyB0aGF0IGFuIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIG9ubHkgd2hlbiB0aGUKLQkJCS8vIHBpcGVkIGlucHV0IHRocmVhZCBpcyB0ZXJtaW5hdGVkIHdpdGhvdXQgY2xvc2luZwotCQkJcmV0dXJuOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUaGUgc3BlYyBmb3IgUGlwZWRJbnB1dCBzYXlhIGFuIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGlmCisgICAgICAgICAgICAvLyBhIHdyaXRlIGlzIGF0dGVtcHRlZCB0byBhIGNsb3NlZCBpbnB1dC4gVGhlIFBpcGVkT3VwdXQgc3BlYworICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHRoYXQgYW4gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gb25seSB3aGVuIHRoZQorICAgICAgICAgICAgLy8gcGlwZWQgaW5wdXQgdGhyZWFkIGlzIHRlcm1pbmF0ZWQgd2l0aG91dCBjbG9zaW5nCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QaXBlZElucHV0U3RyZWFtI2Nvbm5lY3QoamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3RMamF2YV9pb19QaXBlZE91dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jY29ubmVjdChqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdExqYXZhX2lvX1BpcGVkT3V0cHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbS5jb25uZWN0KGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0pCiAgICAgICAgIHBpcyA9IG5ldyBQaXBlZElucHV0U3RyZWFtKCk7CkBAIC0xNDMsMTAgKzE5NCwxOSBAQAogICAgICAgICAgICAgICAgIC5hdmFpbGFibGUoKSk7CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZElucHV0U3RyZWFtI3JlYWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtLnJlYWQoKQogICAgICAgICBwaXMgPSBuZXcgUGlwZWRJbnB1dFN0cmVhbSgpOwogICAgICAgICBwb3MgPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsKQEAgLTE2NCwxMCArMjI0LDE5IEBACiAgICAgICAgICAgICAgICAgLnJlYWQoKSk7CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0ucmVhZChieXRlIFtdLCBpbnQsIGludCkKICAgICAgICAgcGlzID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKICAgICAgICAgcG9zID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CkBAIC0xOTIsNiArMjYxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICogUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0zODcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQklJXzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBQaXBlZElucHV0U3RyZWFtIG9iaiA9IG5ldyBQaXBlZElucHV0U3RyZWFtKCk7CiAgICAgICAgIHRyeSB7CkBAIC0yMDcsNiArMjg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSV8zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUGlwZWRJbnB1dFN0cmVhbSBvYmogPSBuZXcgUGlwZWRJbnB1dFN0cmVhbSgpOwogICAgICAgICB0cnkgewpAQCAtMjIxLDYgKzMwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUlfNCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFBpcGVkSW5wdXRTdHJlYW0gb2JqID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKICAgICAgICAgdHJ5IHsKQEAgLTIzNSw2ICszMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZElucHV0U3RyZWFtI3JlY2VpdmUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWNlaXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcGlzID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKICAgICAgICAgcG9zID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CkBAIC0zMzEsMTcgKzQzNiwxNyBAQAogICAgICAgICAgICAgICAgIG15UnVuLnBhc3MpOwogICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAodCAhPSBudWxsKSB7Ci0JCQkJdC5pbnRlcnJ1cHQoKTsKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CiAgICAgICAgICAgICB9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQl9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDE3NWQ1YjcuLmJhYjc3OTEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QaXBlZE91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUGlwZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDEwMyArMTcsMTQ1IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbTsKIAorQFRlc3RUYXJnZXRDbGFzcyhQaXBlZE91dHB1dFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUGlwZWRPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCXN0YXRpYyBjbGFzcyBQUmVhZGVyIGltcGxlbWVudHMgUnVubmFibGUgewotCQlQaXBlZElucHV0U3RyZWFtIHJlYWRlcjsKKyAgICBzdGF0aWMgY2xhc3MgUFJlYWRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgUGlwZWRJbnB1dFN0cmVhbSByZWFkZXI7CiAKLQkJcHVibGljIFBpcGVkSW5wdXRTdHJlYW0gZ2V0UmVhZGVyKCkgewotCQkJcmV0dXJuIHJlYWRlcjsKLQkJfQorICAgICAgICBwdWJsaWMgUGlwZWRJbnB1dFN0cmVhbSBnZXRSZWFkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyOworICAgICAgICB9CiAKLQkJcHVibGljIFBSZWFkZXIoUGlwZWRPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCQl0cnkgewotCQkJCXJlYWRlciA9IG5ldyBQaXBlZElucHV0U3RyZWFtKG91dCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGRuJ3Qgc3RhcnQgcmVhZGVyIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFBSZWFkZXIoUGlwZWRPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBQaXBlZElucHV0U3RyZWFtKG91dCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGRuJ3Qgc3RhcnQgcmVhZGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlYWRlci5hdmFpbGFibGUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyaW5nIHJlYWQoaW50IG5ieXRlcykgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW25ieXRlc107Ci0JCQl0cnkgewotCQkJCXJlYWRlci5yZWFkKGJ1ZiwgMCwgbmJ5dGVzKTsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZyhidWYpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHJlYWRpbmcgaW5mbyIpOwotCQkJCXJldHVybiAiRVJST1IiOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWQoaW50IG5ieXRlcykgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW25ieXRlc107CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkKGJ1ZiwgMCwgbmJ5dGVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHJlYWRpbmcgaW5mbyIpOworICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1IiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JVGhyZWFkIHJ0OworICAgIFRocmVhZCBydDsKIAotCVBSZWFkZXIgcmVhZGVyOworICAgIFBSZWFkZXIgcmVhZGVyOwogCi0JUGlwZWRPdXRwdXRTdHJlYW0gb3V0OworICAgIFBpcGVkT3V0cHV0U3RyZWFtIG91dDsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtI1BpcGVkT3V0cHV0U3RyZWFtKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSgpCi0JCS8vIFVzZWQgaW4gdGVzdHMKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0jUGlwZWRPdXRwdXRTdHJlYW0oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUGlwZWRPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSgpCisgICAgICAgIC8vIFVzZWQgaW4gdGVzdHMKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSNQaXBlZE91dHB1dFN0cmVhbShqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1BpcGVkSW5wdXRTdHJlYW0oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtKGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSNQaXBlZE91dHB1dFN0cmVhbShqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBpcGVkT3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUGlwZWRJbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1BpcGVkSW5wdXRTdHJlYW0oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtKGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSkKIAotCQl0cnkgewotCQkJb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKG5ldyBQaXBlZElucHV0U3RyZWFtKCkpOwotCQkJb3V0LndyaXRlKCdiJyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGNvbnN0cnVjdG9yIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKG5ldyBQaXBlZElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgb3V0LndyaXRlKCdiJyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGNvbnN0cnVjdG9yIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0uY2xvc2UoKQotCQl0cnkgewotCQkJb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7Ci0JCQlydCA9IG5ldyBUaHJlYWQocmVhZGVyID0gbmV3IFBSZWFkZXIob3V0KSk7Ci0JCQlydC5zdGFydCgpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgY2xvc2UgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtLmNsb3NlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcnQgPSBuZXcgVGhyZWFkKHJlYWRlciA9IG5ldyBQUmVhZGVyKG91dCkpOworICAgICAgICAgICAgcnQuc3RhcnQoKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGNsb3NlIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSNjb25uZWN0KGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdExqYXZhX2lvX1BpcGVkSW5wdXRTdHJlYW1fRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIG91dC5jb25uZWN0KG5ldyBQaXBlZElucHV0U3RyZWFtKCkpOwpAQCAtMTI1LDY4ICsxNjcsMTA0IEBACiAgICAgICAgIH0KICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSNjb25uZWN0KGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3RMamF2YV9pb19QaXBlZElucHV0U3RyZWFtKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtLmNvbm5lY3QoamF2YS5pby5QaXBlZElucHV0U3RyZWFtKQotCQl0cnkgewotCQkJb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7Ci0JCQlydCA9IG5ldyBUaHJlYWQocmVhZGVyID0gbmV3IFBSZWFkZXIob3V0KSk7Ci0JCQlydC5zdGFydCgpOwotCQkJb3V0LmNvbm5lY3QobmV3IFBpcGVkSW5wdXRTdHJlYW0oKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvcnJlY3QKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKAotCQkJCSJGYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIGF0dGVtcHRpbmcgY29ubmVjdCBvbiBhbHJlYWR5IGNvbm5lY3RlZCBzdHJlYW0iKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSNjb25uZWN0KGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUGlwZWRJbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9jb25uZWN0TGphdmFfaW9fUGlwZWRJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbS5jb25uZWN0KGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcnQgPSBuZXcgVGhyZWFkKHJlYWRlciA9IG5ldyBQUmVhZGVyKG91dCkpOworICAgICAgICAgICAgcnQuc3RhcnQoKTsKKyAgICAgICAgICAgIG91dC5jb25uZWN0KG5ldyBQaXBlZElucHV0U3RyZWFtKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBDb3JyZWN0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiBhdHRlbXB0aW5nIGNvbm5lY3Qgb24gYWxyZWFkeSBjb25uZWN0ZWQgc3RyZWFtIik7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0jZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0uZmx1c2goKQotCQl0cnkgewotCQkJb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7Ci0JCQlydCA9IG5ldyBUaHJlYWQocmVhZGVyID0gbmV3IFBSZWFkZXIob3V0KSk7Ci0JCQlydC5zdGFydCgpOwotCQkJb3V0LndyaXRlKCJIZWxsb1dvcmxkIi5nZXRCeXRlcygpLCAwLCAxMCk7Ci0JCQlhc3NlcnRUcnVlKCJCeXRlcyB3cml0dGVuIGJlZm9yZSBmbHVzaCIsIHJlYWRlci5hdmFpbGFibGUoKSAhPSAwKTsKLQkJCW91dC5mbHVzaCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZXMiLCAKLQkJCQkJIkhlbGxvV29ybGQiLCByZWFkZXIucmVhZCgxMCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0jZmx1c2goKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0uZmx1c2goKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBydCA9IG5ldyBUaHJlYWQocmVhZGVyID0gbmV3IFBSZWFkZXIob3V0KSk7CisgICAgICAgICAgICBydC5zdGFydCgpOworICAgICAgICAgICAgb3V0LndyaXRlKCJIZWxsb1dvcmxkIi5nZXRCeXRlcygpLCAwLCAxMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJCeXRlcyB3cml0dGVuIGJlZm9yZSBmbHVzaCIsIHJlYWRlci5hdmFpbGFibGUoKSAhPSAwKTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZXMiLCAKKyAgICAgICAgICAgICAgICAgICAgIkhlbGxvV29ybGQiLCByZWFkZXIucmVhZCgxMCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQklJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKLQkJLy8gaW50KQotCQl0cnkgewotCQkJb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7Ci0JCQlydCA9IG5ldyBUaHJlYWQocmVhZGVyID0gbmV3IFBSZWFkZXIob3V0KSk7Ci0JCQlydC5zdGFydCgpOwotCQkJb3V0LndyaXRlKCJIZWxsb1dvcmxkIi5nZXRCeXRlcygpLCAwLCAxMCk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJCWFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IGJ5dGVzIiwgCi0JCQkJCSJIZWxsb1dvcmxkIiwgcmVhZGVyLnJlYWQoMTApKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQklJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBydCA9IG5ldyBUaHJlYWQocmVhZGVyID0gbmV3IFBSZWFkZXIob3V0KSk7CisgICAgICAgICAgICBydC5zdGFydCgpOworICAgICAgICAgICAgb3V0LndyaXRlKCJIZWxsb1dvcmxkIi5nZXRCeXRlcygpLCAwLCAxMCk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IGJ5dGVzIiwgCisgICAgICAgICAgICAgICAgICAgICJIZWxsb1dvcmxkIiwgcmVhZGVyLnJlYWQoMTApKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHdyaXRlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKiBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTM4NwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEJJSV8yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUGlwZWRJbnB1dFN0cmVhbSBwaXMgPSBuZXcgUGlwZWRJbnB1dFN0cmVhbSgpOwogICAgICAgICBQaXBlZE91dHB1dFN0cmVhbSBwb3MgPSBudWxsOwpAQCAtMjAxLDM2ICsyNzksNDUgQEAKICAgICAgICAgfQogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtI3dyaXRlKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbS53cml0ZShpbnQpCi0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsKLQkJCXJ0ID0gbmV3IFRocmVhZChyZWFkZXIgPSBuZXcgUFJlYWRlcihvdXQpKTsKLQkJCXJ0LnN0YXJ0KCk7Ci0JCQlvdXQud3JpdGUoJ2MnKTsKLQkJCW91dC5mbHVzaCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZSIsICJjIiwgcmVhZGVyLnJlYWQoMSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgd3JpdGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0jd3JpdGUoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtLndyaXRlKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcnQgPSBuZXcgVGhyZWFkKHJlYWRlciA9IG5ldyBQUmVhZGVyKG91dCkpOworICAgICAgICAgICAgcnQuc3RhcnQoKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgnYycpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb3RlIGluY29ycmVjdCBieXRlIiwgImMiLCByZWFkZXIucmVhZCgxKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB3cml0ZSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHJ0ICE9IG51bGwpCi0JCQlydC5pbnRlcnJ1cHQoKTsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGlmIChydCAhPSBudWxsKQorICAgICAgICAgICAgcnQuaW50ZXJydXB0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkUmVhZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkUmVhZGVyVGVzdC5qYXZhCmluZGV4IGZhYjQ1ZTYuLjBmNDdjOGEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QaXBlZFJlYWRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUGlwZWRSZWFkZXJUZXN0LmphdmEKQEAgLTE3LDQ5ICsxNyw2NCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QaXBlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlBpcGVkV3JpdGVyOwogCitAVGVzdFRhcmdldENsYXNzKFBpcGVkUmVhZGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQaXBlZFJlYWRlclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0Jc3RhdGljIGNsYXNzIFBXcml0ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyBQaXBlZFdyaXRlciBwdzsKKyAgICBzdGF0aWMgY2xhc3MgUFdyaXRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHVibGljIFBpcGVkV3JpdGVyIHB3OwogCi0JCXB1YmxpYyBQV3JpdGVyKFBpcGVkUmVhZGVyIHJlYWRlcikgewotCQkJdHJ5IHsKLQkJCQlwdyA9IG5ldyBQaXBlZFdyaXRlcihyZWFkZXIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkbid0IGNyZWF0ZSB3cml0ZXIiKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgUFdyaXRlcihQaXBlZFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHcgPSBuZXcgUGlwZWRXcml0ZXIocmVhZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZG4ndCBjcmVhdGUgd3JpdGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgUFdyaXRlcigpIHsKLQkJCXB3ID0gbmV3IFBpcGVkV3JpdGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFBXcml0ZXIoKSB7CisgICAgICAgICAgICBwdyA9IG5ldyBQaXBlZFdyaXRlcigpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQljaGFyW10gYyA9IG5ldyBjaGFyWzExXTsKLQkJCQkiSGVsbG8gV29ybGQiLmdldENoYXJzKDAsIDExLCBjLCAwKTsKLQkJCQlwdy53cml0ZShjKTsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hhcltdIGMgPSBuZXcgY2hhclsxMV07CisgICAgICAgICAgICAgICAgIkhlbGxvIFdvcmxkIi5nZXRDaGFycygwLCAxMSwgYywgMCk7CisgICAgICAgICAgICAgICAgcHcud3JpdGUoYyk7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gb2NjdXJyZWQ6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JUGlwZWRSZWFkZXIgcHJlYWRlcjsKKyAgICBQaXBlZFJlYWRlciBwcmVhZGVyOwogCi0JUFdyaXRlciBwd3JpdGVyOworICAgIFBXcml0ZXIgcHdyaXRlcjsKIAotCVRocmVhZCB0OworICAgIFRocmVhZCB0OwogCi0JLyoqCisgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRSZWFkZXIjUGlwZWRSZWFkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQaXBlZFJlYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uUGlwZWRSZWFkZXIoKQogICAgIC8vIFVzZWQgaW4gdGVzdApAQCAtNjgsNiArODMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNQaXBlZFJlYWRlcihqYXZhLmlvLlBpcGVkV3JpdGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQaXBlZFJlYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlBpcGVkV3JpdGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fUGlwZWRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QaXBlZFJlYWRlcihqYXZhLmlvLlBpcGVkV3JpdGVyKQogICAgICAgICBwcmVhZGVyID0gbmV3IFBpcGVkUmVhZGVyKG5ldyBQaXBlZFdyaXRlcigpKTsKQEAgLTc2LDYgKzEwMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkUmVhZGVyI2Nsb3NlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUGlwZWRSZWFkZXIuY2xvc2UoKQogICAgICAgICBjaGFyW10gYyA9IG51bGw7CkBAIC05Miw2ICsxMjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNjb25uZWN0KGphdmEuaW8uUGlwZWRXcml0ZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5QaXBlZFdyaXRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25uZWN0TGphdmFfaW9fUGlwZWRXcml0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QaXBlZFJlYWRlci5jb25uZWN0KGphdmEuaW8uUGlwZWRXcml0ZXIpCiAgICAgICAgIGNoYXJbXSBjID0gbnVsbDsKQEAgLTExMywxMCArMTU1LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uUGlwZWRSZWFkZXIucmVhZCgpCiAgICAgICAgIGNoYXJbXSBjID0gbnVsbDsKICAgICAgICAgcHJlYWRlciA9IG5ldyBQaXBlZFJlYWRlcigpOwpAQCAtMTMwLDEwICsxODEsMTkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWFkIGluY29ycmVjdCBjaGFycyIsICJIZWxsbyBXb3JsZCIsIG5ldyBTdHJpbmcoYykpOwogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkUmVhZGVyI3JlYWQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQ0lJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRSZWFkZXIjcmVhZChjaGFyW10sIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlBpcGVkUmVhZGVyLnJlYWQoY2hhciBbXSwgaW50LCBpbnQpCiAgICAgICAgIGNoYXJbXSBjID0gbnVsbDsKICAgICAgICAgcHJlYWRlciA9IG5ldyBQaXBlZFJlYWRlcigpOwpAQCAtMTYxLDYgKzIyMSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkUmVhZGVyI3JlYWQoY2hhcltdLCBpbnQsIGludCkKICAgICAgKiBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTM4NwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUlfMigpIHRocm93cyBJT0V4Y2VwdGlvbnsKICAgICAgICAgUGlwZWRXcml0ZXIgcHcgPSBuZXcgUGlwZWRXcml0ZXIoKTsKICAgICAgICAgUGlwZWRSZWFkZXIgb2JqID0gbnVsbDsKQEAgLTE3OCw2ICsyNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSV8zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUGlwZWRXcml0ZXIgcHcgPSBuZXcgUGlwZWRXcml0ZXIoKTsKICAgICAgICAgUGlwZWRSZWFkZXIgb2JqID0gbnVsbDsKQEAgLTE5NCw2ICsyNzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSV80KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUGlwZWRXcml0ZXIgcHcgPSBuZXcgUGlwZWRXcml0ZXIoKTsKICAgICAgICAgUGlwZWRSZWFkZXIgb2JqID0gbnVsbDsKQEAgLTIxMCw2ICsyOTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJENJSV9JT0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFBpcGVkV3JpdGVyIHB3ID0gbmV3IFBpcGVkV3JpdGVyKCk7CiAgICAgICAgIFBpcGVkUmVhZGVyIHByID0gbmV3IFBpcGVkUmVhZGVyKHB3KTsKQEAgLTMwOCwxOCArNDA0LDYgQEAKICAgICAgICAgcHcgPSBuZXcgUGlwZWRXcml0ZXIoKTsKICAgICAgICAgcHIgPSBuZXcgUGlwZWRSZWFkZXIocHcpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcHIucmVhZChudWxsLCAtMSwgMSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHB3ID0gbnVsbDsKLSAgICAgICAgICAgIHByID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHcgPSBuZXcgUGlwZWRXcml0ZXIoKTsKLSAgICAgICAgcHIgPSBuZXcgUGlwZWRSZWFkZXIocHcpOwotICAgICAgICB0cnkgewogICAgICAgICAgICAgcHIucmVhZChudWxsLCAwLCAtMSk7CiAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CkBAIC0zNTUsOSArNDM5LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUGlwZWRSZWFkZXIjcmVhZHkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFJlYWRlciNyZWFkeSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLlBpcGVkUmVhZGVyLnJlYWR5KCkKICAgICAgICAgY2hhcltdIGMgPSBudWxsOwogICAgICAgICBwcmVhZGVyID0gbmV3IFBpcGVkUmVhZGVyKCk7CkBAIC0zNzIsMTQgKzQ2NSwxNCBAQAogICAgICAgICAgICAgICAgIHByZWFkZXIucmVhZHkoKSk7CiAgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHQgIT0gbnVsbCkgewotCQkJdC5pbnRlcnJ1cHQoKTsKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICB0LmludGVycnVwdCgpOwogICAgICAgICB9CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QaXBlZFdyaXRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QaXBlZFdyaXRlclRlc3QuamF2YQppbmRleCA2ODllNzhlLi4xZGQ2ZjhkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUGlwZWRXcml0ZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1BpcGVkV3JpdGVyVGVzdC5qYXZhCkBAIC0xNyw2NCArMTcsODggQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUGlwZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5QaXBlZFdyaXRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhQaXBlZFdyaXRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUGlwZWRXcml0ZXJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCXN0YXRpYyBjbGFzcyBQUmVhZGVyIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgUGlwZWRSZWFkZXIgcHI7CisgICAgc3RhdGljIGNsYXNzIFBSZWFkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyBQaXBlZFJlYWRlciBwcjsKIAotCQlwdWJsaWMgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwXTsKKyAgICAgICAgcHVibGljIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxMF07CiAKLQkJcHVibGljIFBSZWFkZXIoUGlwZWRXcml0ZXIgcHcpIHsKLQkJCXRyeSB7Ci0JCQkJcHIgPSBuZXcgUGlwZWRSZWFkZXIocHcpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHNldHRpbmcgdXAgcmVhZGVyOiAiCi0JCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFBSZWFkZXIoUGlwZWRXcml0ZXIgcHcpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHIgPSBuZXcgUGlwZWRSZWFkZXIocHcpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHNldHRpbmcgdXAgcmVhZGVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgUFJlYWRlcihQaXBlZFJlYWRlciBwcikgewotCQkJdGhpcy5wciA9IHByOwotCQl9CisgICAgICAgIHB1YmxpYyBQUmVhZGVyKFBpcGVkUmVhZGVyIHByKSB7CisgICAgICAgICAgICB0aGlzLnByID0gcHI7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWludCByID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgewotCQkJCQlyID0gcHIucmVhZCgpOwotCQkJCQlpZiAociA9PSAtMSkKLQkJCQkJCWJyZWFrOwotCQkJCQlidWZbaV0gPSAoY2hhcikgcjsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHJlYWRpbmcgKCIKLQkJCQkJCSsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiKTogIgotCQkJCQkJKyBlLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCByID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICByID0gcHIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAociA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAoY2hhcikgcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHJlYWRpbmcgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JVGhyZWFkIHJkclRocmVhZDsKKyAgICBUaHJlYWQgcmRyVGhyZWFkOwogCi0JUFJlYWRlciByZWFkZXI7CisgICAgUFJlYWRlciByZWFkZXI7CiAKLQlQaXBlZFdyaXRlciBwdzsKKyAgICBQaXBlZFdyaXRlciBwdzsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkV3JpdGVyI1BpcGVkV3JpdGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QaXBlZFdyaXRlcigpCi0JCS8vIFVzZWQgaW4gdGVzdHMKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRXcml0ZXIjUGlwZWRXcml0ZXIoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIlRlc3QgaXMgZW1wdHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQaXBlZFdyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlBpcGVkV3JpdGVyKCkKKyAgICAgICAgLy8gVXNlZCBpbiB0ZXN0cworICAgIH0KIAotCS8qKgorICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkV3JpdGVyI1BpcGVkV3JpdGVyKGphdmEuaW8uUGlwZWRSZWFkZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBpcGVkV3JpdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUGlwZWRSZWFkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19QaXBlZFJlYWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QaXBlZFdyaXRlcihqYXZhLmlvLlBpcGVkUmVhZGVyKQogICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTBdOwpAQCAtOTMsNiArMTE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRXcml0ZXIjY2xvc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QaXBlZFdyaXRlci5jbG9zZSgpCiAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxMF07CkBAIC0xMTIsNiArMTQ1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRXcml0ZXIjY29ubmVjdChqYXZhLmlvLlBpcGVkUmVhZGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUGlwZWRSZWFkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdExqYXZhX2lvX1BpcGVkUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUGlwZWRXcml0ZXIuY29ubmVjdChqYXZhLmlvLlBpcGVkUmVhZGVyKQogICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTBdOwpAQCAtMTMxLDYgKzE3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkV3JpdGVyI2ZsdXNoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZsdXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUGlwZWRXcml0ZXIuZmx1c2goKQogICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTBdOwpAQCAtMTQ4LDYgKzE5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkV3JpdGVyI3dyaXRlKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRDSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QaXBlZFdyaXRlci53cml0ZShjaGFyIFtdLCBpbnQsIGludCkKICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwXTsKQEAgLTE2Niw2ICsyMjYsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFdyaXRlciN3cml0ZShjaGFyW10sIGludCwgaW50KSBSZWdyZXNzaW9uIGZvcgogICAgICAqICAgICAgICBIQVJNT05ZLTM4NwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQ0lJXzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBQaXBlZFJlYWRlciBwciA9IG5ldyBQaXBlZFJlYWRlcigpOwogICAgICAgICBQaXBlZFdyaXRlciBvYmogPSBudWxsOwpAQCAtMTgzLDYgKzI1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkV3JpdGVyI3dyaXRlKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRDSUlfMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFBpcGVkUmVhZGVyIHByID0gbmV3IFBpcGVkUmVhZGVyKCk7CiAgICAgICAgIFBpcGVkV3JpdGVyIG9iaiA9IG51bGw7CkBAIC0xOTgsNiArMjc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSV80KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUGlwZWRSZWFkZXIgcHIgPSBuZXcgUGlwZWRSZWFkZXIoKTsKICAgICAgICAgUGlwZWRXcml0ZXIgb2JqID0gbnVsbDsKQEAgLTIxMyw2ICszMDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QaXBlZFdyaXRlciN3cml0ZShjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQ0lJXzUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBQaXBlZFJlYWRlciBwciA9IG5ldyBQaXBlZFJlYWRlcigpOwogICAgICAgICBQaXBlZFdyaXRlciBvYmogPSBudWxsOwpAQCAtMjI4LDYgKzMyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkV3JpdGVyI3dyaXRlKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRDSUlfNigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFBpcGVkUmVhZGVyIHByID0gbmV3IFBpcGVkUmVhZGVyKCk7CiAgICAgICAgIFBpcGVkV3JpdGVyIG9iaiA9IG51bGw7CkBAIC0yNDMsNiArMzQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSV9ub3RDb25uZWN0ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMjQwNAogICAgICAgICAvLyBjcmVhdGUgbm90IGNvbm5lY3RlZCBwaXBlCkBAIC0yOTIsNiArNDA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRXcml0ZXIjd3JpdGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfSV9NdWx0aVRocmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFBpcGVkUmVhZGVyIHByID0gbmV3IFBpcGVkUmVhZGVyKCk7CiAgICAgICAgIGZpbmFsIFBpcGVkV3JpdGVyIHB3ID0gbmV3IFBpcGVkV3JpdGVyKCk7CkBAIC0zNTEsNiArNDc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUGlwZWRXcml0ZXIjd3JpdGUoY2hhcltdLGludCxpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfJENJSV9NdWx0aVRocmVhZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBQaXBlZFJlYWRlciBwciA9IG5ldyBQaXBlZFJlYWRlcigpOwogICAgICAgICBmaW5hbCBQaXBlZFdyaXRlciBwdyA9IG5ldyBQaXBlZFdyaXRlcigpOwpAQCAtNDE1LDYgKzU0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlBpcGVkV3JpdGVyI3dyaXRlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlBpcGVkV3JpdGVyLndyaXRlKGludCkKIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1ByaW50U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1ByaW50U3RyZWFtVGVzdC5qYXZhCmluZGV4IDQ4MGMwZDIuLjE3YzkxZTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QcmludFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUHJpbnRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKQEAgLTI4LDYgKzMzLDcgQEAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhQcmludFN0cmVhbS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUHJpbnRTdHJlYW1UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CkBAIC00Miw0NSArNDgsNzIgQEAKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrUHJpbnRTdHJlYW0gZXh0ZW5kcyBQcmludFN0cmVhbSB7CiAKLQkJcHVibGljIE1vY2tQcmludFN0cmVhbShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQkJc3VwZXIoZmlsZU5hbWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgTW9ja1ByaW50U3RyZWFtKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGNzbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihmaWxlTmFtZSwgY3NuKTsKLQkJfQotCQkKLQkJcHVibGljIE1vY2tQcmludFN0cmVhbShPdXRwdXRTdHJlYW0gb3MpIHsKLQkJCXN1cGVyKG9zKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldEVycm9yKCkgewotCQkJc3VwZXIuc2V0RXJyb3IoKTsKLQkJfQorICAgICAgICBwdWJsaWMgTW9ja1ByaW50U3RyZWFtKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihmaWxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNb2NrUHJpbnRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY3NuKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKGZpbGVOYW1lLCBjc24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgTW9ja1ByaW50U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgeworICAgICAgICAgICAgc3VwZXIob3MpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXJyb3IoKSB7CisgICAgICAgICAgICBzdXBlci5zZXRFcnJvcigpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5pby5QcmludFN0cmVhbSNQcmludFN0cmVhbShTdHJpbmcpfQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW50U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JfTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIAlNb2NrUHJpbnRTdHJlYW0gb3MgPSBuZXcgTW9ja1ByaW50U3RyZWFtKHRlc3RGaWxlUGF0aCk7Ci0gICAgCWFzc2VydE5vdE51bGwob3MpOwotICAgIAlvcy5jbG9zZSgpOwotCX0KKyAgICAgICAgTW9ja1ByaW50U3RyZWFtIG9zID0gbmV3IE1vY2tQcmludFN0cmVhbSh0ZXN0RmlsZVBhdGgpOworICAgICAgICBhc3NlcnROb3ROdWxsKG9zKTsKKyAgICAgICAgb3MuY2xvc2UoKTsKKyAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLmlvLlByaW50U3RyZWFtI1ByaW50U3RyZWFtKFN0cmluZywgU3RyaW5nKX0KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcmludFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX0xqYXZhX2xhbmdfU3RyaW5nX0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCU1vY2tQcmludFN0cmVhbSBvcyA9IG5ldyBNb2NrUHJpbnRTdHJlYW0odGVzdEZpbGVQYXRoLCAidXRmLTgiKTsKLSAgICAJYXNzZXJ0Tm90TnVsbChvcyk7Ci0gICAgCW9zLmNsb3NlKCk7CisgICAgICAgIE1vY2tQcmludFN0cmVhbSBvcyA9IG5ldyBNb2NrUHJpbnRTdHJlYW0odGVzdEZpbGVQYXRoLCAidXRmLTgiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChvcyk7CisgICAgICAgIG9zLmNsb3NlKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jUHJpbnRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW50U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlByaW50U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQogICAgICAgICBQcmludFN0cmVhbSBvcyA9IG5ldyBQcmludFN0cmVhbShib3MpOwpAQCAtOTcsNiArMTMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jUHJpbnRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0sIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW50U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtWigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uUHJpbnRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0sIGJvb2xlYW4pCiAgICAgICAgIFByaW50U3RyZWFtIG9zID0gbmV3IFByaW50U3RyZWFtKGJvcyk7CkBAIC0xMDksNiArMTUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jY2hlY2tFcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5QcmludFN0cmVhbS5jaGVja0Vycm9yKCkKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0obmV3IE91dHB1dFN0cmVhbSgpIHsKQEAgLTEyOSw2ICsxODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNjbG9zZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50U3RyZWFtLmNsb3NlKCkKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0oYm9zKTsKQEAgLTEzOSw2ICsxOTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNmbHVzaCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsdXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mbHVzaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50U3RyZWFtLmZsdXNoKCkKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0oYm9zKTsKQEAgLTE1Miw2ICsyMjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNwcmludChjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludCRDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50KGNoYXIgW10pCiAgICAgICAgIFByaW50U3RyZWFtIG9zID0gbmV3IFByaW50U3RyZWFtKGJvcywgdHJ1ZSk7CkBAIC0xNzYsNiArMjU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnQoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludEMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnQoY2hhcikKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0oYm9zLCB0cnVlKTsKQEAgLTE4Nyw2ICsyNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNwcmludChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludEQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnQoZG91YmxlKQogICAgICAgICBieXRlW10gcmJ1ZiA9IG5ldyBieXRlWzEwMF07CkBAIC0yMDEsNiArMjk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnQoZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50RigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFN0cmVhbS5wcmludChmbG9hdCkKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0oYm9zLCB0cnVlKTsKQEAgLTIxNyw2ICszMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNwcmludChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnQoaW50KQogICAgICAgICBQcmludFN0cmVhbSBvcyA9IG5ldyBQcmludFN0cmVhbShib3MsIHRydWUpOwpAQCAtMjMxLDYgKzM0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50U3RyZWFtI3ByaW50KGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50KGxvbmcpCiAgICAgICAgIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbMTAwXTsKQEAgLTI0Niw2ICszNjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNwcmludChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50TGphdmFfbGFuZ19PYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFN0cmVhbS5wcmludChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBQcmludFN0cmVhbSBvcyA9IG5ldyBQcmludFN0cmVhbShib3MsIHRydWUpOwpAQCAtMjczLDYgKzQwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50U3RyZWFtI3ByaW50KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIFByaW50U3RyZWFtIG9zID0gbmV3IFByaW50U3RyZWFtKGJvcywgdHJ1ZSk7CkBAIC0zMDAsNiArNDQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnQoYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludFooKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFN0cmVhbS5wcmludChib29sZWFuKQogICAgICAgICBQcmludFN0cmVhbSBvcyA9IG5ldyBQcmludFN0cmVhbShib3MsIHRydWUpOwpAQCAtMzEzLDYgKzQ2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50U3RyZWFtI3ByaW50bG4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGxuKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50bG4oKQogICAgICAgICBjaGFyIGM7CkBAIC0zMjYsNiArNDg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnRsbihjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG4kQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFN0cmVhbS5wcmludGxuKGNoYXIgW10pCiAgICAgICAgIFByaW50U3RyZWFtIG9zID0gbmV3IFByaW50U3RyZWFtKGJvcywgdHJ1ZSk7CkBAIC0zNTUsNiArNTIzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnRsbihjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihjaGFyKQogICAgICAgICBpbnQgYzsKQEAgLTM2OCw2ICs1NDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNwcmludGxuKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRsbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihkb3VibGUpCiAgICAgICAgIGludCBjOwpAQCAtMzg0LDYgKzU3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50U3RyZWFtI3ByaW50bG4oZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihmbG9hdCkKICAgICAgICAgaW50IGM7CkBAIC00MDAsNiArNTk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnRsbihpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG5JKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50bG4oaW50KQogICAgICAgICBpbnQgYzsKQEAgLTQxNiw2ICs2MjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNwcmludGxuKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGxuSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFN0cmVhbS5wcmludGxuKGxvbmcpCiAgICAgICAgIGludCBjOwpAQCAtNDMyLDYgKzY0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50U3RyZWFtI3ByaW50bG4oamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRsbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG5MamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFN0cmVhbS5wcmludGxuKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIGNoYXIgYzsKQEAgLTQ0OCw2ICs2NzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNwcmludGxuKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGxuTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBjaGFyIGM7CkBAIC00NjUsNiArNjk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnRsbihib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsblooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihib29sZWFuKQogICAgICAgICBpbnQgYzsKQEAgLTQ4MSw2ICs3MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEJJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFN0cmVhbS53cml0ZShieXRlIFtdLCBpbnQsIGludCkKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0oYm9zLCB0cnVlKTsKQEAgLTQ5NSw2ICs3NDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSN3cml0ZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRTdHJlYW0ud3JpdGUoaW50KQogICAgICAgICBQcmludFN0cmVhbSBvcyA9IG5ldyBQcmludFN0cmVhbShib3MsIHRydWUpOwpAQCAtNTA2LDYgKzc2NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50U3RyZWFtI2FwcGVuZChjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hhciB0ZXN0Q2hhciA9ICcgJzsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKQEAgLTUxOSw2ICs3ODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNhcHBlbmQoQ2hhclNlcXVlbmNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIk15IFRlc3QgU3RyaW5nIjsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKQEAgLTUzMiw2ICs4MDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNhcHBlbmQoQ2hhclNlcXVlbmNlLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ2hhclNlcXVlbmNlSW50SW50KCkgewogICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBUZXN0IFN0cmluZyI7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CkBAIC01NDUsNiArODMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0oYm9zLCBmYWxzZSk7CiAgICAgICAgIG9zLmZvcm1hdCgiJXMgJXMiLCAiSGVsbG8iLCAiV29ybGQiKTsKQEAgLTU2MSw2ICs4NTUsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFN0cmVhbSNmb3JtYXQoamF2YS51dGlsLkxvY2FsZSwgamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLk9iamVjdC4uLikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX3V0aWxfTG9jYWxlX0xqYXZhX2xhbmdfU3RyaW5nXyRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgUHJpbnRTdHJlYW0gb3MgPSBuZXcgUHJpbnRTdHJlYW0oYm9zLCBmYWxzZSk7CiAgICAgICAgIG9zLmZvcm1hdChMb2NhbGUuVVMsICIlcyAlcyIsICJIZWxsbyIsICJXb3JsZCIpOwpAQCAtNTc1LDYgKzg3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50U3RyZWFtI3ByaW50ZihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50ZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRmTGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIFByaW50U3RyZWFtIG9zID0gbmV3IFByaW50U3RyZWFtKGJvcywgZmFsc2UpOwogICAgICAgICBvcy5wcmludGYoIiVzICVzIiwgIkhlbGxvIiwgIldvcmxkIik7CkBAIC01OTAsNiArOTAyLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnRmKGphdmEudXRpbC5Mb2NhbGUsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QuLi4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGZMamF2YV91dGlsX0xvY2FsZV9MamF2YV9sYW5nX1N0cmluZ18kTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIFByaW50U3RyZWFtIG9zID0gbmV3IFByaW50U3RyZWFtKGJvcywgZmFsc2UpOwogICAgICAgICBvcy5wcmludGYoTG9jYWxlLlVTLCAiJXMgJXMiLCAiSGVsbG8iLCAiV29ybGQiKTsKQEAgLTYwMSwyMCArOTIyLDIwIEBACiAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhyYnl0ZXMpKTsKICAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXN1cGVyLnNldFVwKCk7Ci0JCXRlc3RGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdCIsIG51bGwpOwotCQl0ZXN0RmlsZVBhdGggPSB0ZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAgIAorICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICB0ZXN0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCBudWxsKTsKKyAgICAgICAgdGVzdEZpbGVQYXRoID0gdGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGVzdEZpbGUuZGVsZXRlKCk7Ci0JCXRlc3RGaWxlID0gbnVsbDsKLQkJdGVzdEZpbGVQYXRoID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEZpbGUuZGVsZXRlKCk7CisgICAgICAgIHRlc3RGaWxlID0gbnVsbDsKKyAgICAgICAgdGVzdEZpbGVQYXRoID0gbnVsbDsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CiAgICAgCiAgICAgCiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUHJpbnRXcml0ZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUHJpbnRXcml0ZXJUZXN0LmphdmEKaW5kZXggNTcxMDJkNS4uMGI3Zjk2MyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1ByaW50V3JpdGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QcmludFdyaXRlclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTAgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtMjksMTAwICszMywxNDYgQEAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfU3RyaW5nUmVhZGVyOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9TdHJpbmdXcml0ZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJpbnRXcml0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFByaW50V3JpdGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlzdGF0aWMgY2xhc3MgQm9ndXMgewotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCb2d1cyI7Ci0JCX0KLQl9CisgICAgc3RhdGljIGNsYXNzIEJvZ3VzIHsKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQm9ndXMiOworICAgICAgICB9CisgICAgfQogCi0JUHJpbnRXcml0ZXIgcHc7CisgICAgUHJpbnRXcml0ZXIgcHc7CiAKLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvOworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW87CiAKLQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWk7CisgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpOwogCi0JQnVmZmVyZWRSZWFkZXIgYnI7CisgICAgQnVmZmVyZWRSZWFkZXIgYnI7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNQcmludFdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QcmludFdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSkKLQkJU3RyaW5nIHM7Ci0JCXB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOwotCQlwdy53cml0ZSgiSGVsbG8gV29ybGQiKTsKLQkJcHcuZmx1c2goKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKLQkJCQkJLmVxdWFscygiUmFuZG9tIENoYXJzIikpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKLQkJCQkJLmVxdWFscygiSGVsbG8gV29ybGQiKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNQcmludFdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGRvZXMgbm90IGNoZWNrcyBzcGVjaWZpZWQgY29uc3RydWN0b3IuIEluIHNldFVwIGNoZWNrZWQgUHJpbnRXcml0ZXIoT3V0cHV0U3RyZWFtLCBib29sZWFuKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW50V3JpdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QcmludFdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICAgICAgU3RyaW5nIHM7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy53cml0ZSgiSGVsbG8gV29ybGQiKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiUmFuZG9tIENoYXJzIikpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiSGVsbG8gV29ybGQiKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI1ByaW50V3JpdGVyKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW1aKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QcmludFdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSwgYm9vbGVhbikKLQkJU3RyaW5nIHM7Ci0JCXB3ID0gbmV3IFByaW50V3JpdGVyKGJhbywgdHJ1ZSk7Ci0JCXB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOwotCQlwdy53cml0ZSgiSGVsbG8gV29ybGQiKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKLQkJCQkJLmVxdWFscygiUmFuZG9tIENoYXJzIikpOwotCQkJcHcuZmx1c2goKTsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKLQkJCQkJLmVxdWFscygiUmFuZG9tIENoYXJzIikpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKLQkJCQkJLmVxdWFscygiSGVsbG8gV29ybGQiKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNQcmludFdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpbnRXcml0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW1aKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QcmludFdyaXRlcihqYXZhLmlvLk91dHB1dFN0cmVhbSwgYm9vbGVhbikKKyAgICAgICAgU3RyaW5nIHM7CisgICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKGJhbywgdHJ1ZSk7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy53cml0ZSgiSGVsbG8gV29ybGQiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiUmFuZG9tIENoYXJzIikpOworICAgICAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiUmFuZG9tIENoYXJzIikpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIHdyaXR0ZW4vcmVhZDogIiArIHMsIHMKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiSGVsbG8gV29ybGQiKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI1ByaW50V3JpdGVyKGphdmEuaW8uV3JpdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19Xcml0ZXIoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlByaW50V3JpdGVyKGphdmEuaW8uV3JpdGVyKQotCQlTdXBwb3J0X1N0cmluZ1dyaXRlciBzdzsKLQkJcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cgPSBuZXcgU3VwcG9ydF9TdHJpbmdXcml0ZXIoKSk7Ci0JCXB3LnByaW50KCJIZWxsbyIpOwotCQlwdy5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBjb25zdHJ1Y3QgcHJvcGVyIHdyaXRlciIsIAotCQkJCSJIZWxsbyIsIHN3LnRvU3RyaW5nKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNQcmludFdyaXRlcihqYXZhLmlvLldyaXRlcikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpbnRXcml0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5Xcml0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19Xcml0ZXIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlByaW50V3JpdGVyKGphdmEuaW8uV3JpdGVyKQorICAgICAgICBTdXBwb3J0X1N0cmluZ1dyaXRlciBzdzsKKyAgICAgICAgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cgPSBuZXcgU3VwcG9ydF9TdHJpbmdXcml0ZXIoKSk7CisgICAgICAgIHB3LnByaW50KCJIZWxsbyIpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBjb25zdHJ1Y3QgcHJvcGVyIHdyaXRlciIsIAorICAgICAgICAgICAgICAgICJIZWxsbyIsIHN3LnRvU3RyaW5nKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI1ByaW50V3JpdGVyKGphdmEuaW8uV3JpdGVyLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19Xcml0ZXJaKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QcmludFdyaXRlcihqYXZhLmlvLldyaXRlciwgYm9vbGVhbikKLQkJU3VwcG9ydF9TdHJpbmdXcml0ZXIgc3c7Ci0JCXB3ID0gbmV3IFByaW50V3JpdGVyKHN3ID0gbmV3IFN1cHBvcnRfU3RyaW5nV3JpdGVyKCksIHRydWUpOwotCQlwdy5wcmludCgiSGVsbG8iKTsKLQkJLy8gQXV0by1mbHVzaCBzaG91bGQgaGF2ZSBoYXBwZW5lZAotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBjb25zdHJ1Y3QgcHJvcGVyIHdyaXRlciIsIAotCQkJCSJIZWxsbyIsIHN3LnRvU3RyaW5nKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNQcmludFdyaXRlcihqYXZhLmlvLldyaXRlciwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpbnRXcml0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5Xcml0ZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19Xcml0ZXJaKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QcmludFdyaXRlcihqYXZhLmlvLldyaXRlciwgYm9vbGVhbikKKyAgICAgICAgU3VwcG9ydF9TdHJpbmdXcml0ZXIgc3c7CisgICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3ID0gbmV3IFN1cHBvcnRfU3RyaW5nV3JpdGVyKCksIHRydWUpOworICAgICAgICBwdy5wcmludCgiSGVsbG8iKTsKKyAgICAgICAgLy8gQXV0by1mbHVzaCBzaG91bGQgaGF2ZSBoYXBwZW5lZAorICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBjb25zdHJ1Y3QgcHJvcGVyIHdyaXRlciIsIAorICAgICAgICAgICAgICAgICJIZWxsbyIsIHN3LnRvU3RyaW5nKCkpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI1ByaW50V3JpdGVyKGphdmEuaW8uRmlsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcmludFdyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG51bGwpOwogICAgICAgICB0cnkgewpAQCAtMTM2LDYgKzE4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI1ByaW50V3JpdGVyKGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcmludFdyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlX0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG51bGwpOwogICAgICAgICB0cnkgewpAQCAtMTUwLDYgKzIwOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI1ByaW50V3JpdGVyKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpbnRXcml0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG51bGwpOwogICAgICAgICB0cnkgewpAQCAtMTYzLDYgKzIzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI1ByaW50V3JpdGVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpbnRXcml0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nX0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG51bGwpOwogICAgICAgICB0cnkgewpAQCAtMTc0LDUxOCArMjUxLDc5NCBAQAogICAgICAgICB9CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjY2hlY2tFcnJvcigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jaGVja0Vycm9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLlByaW50V3JpdGVyLmNoZWNrRXJyb3IoKQotCQlwdy5jbG9zZSgpOwotCQlwdy5wcmludCg0OTAwMDAwMDAwMDAuMDg3NjUpOwotCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmV0dXJuIGVycm9yIiwgcHcuY2hlY2tFcnJvcigpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjY2hlY2tFcnJvcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrRXJyb3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uUHJpbnRXcml0ZXIuY2hlY2tFcnJvcigpCisgICAgICAgIHB3LmNsb3NlKCk7CisgICAgICAgIHB3LnByaW50KDQ5MDAwMDAwMDAwMC4wODc2NSk7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byByZXR1cm4gZXJyb3IiLCBwdy5jaGVja0Vycm9yKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLmNsb3NlKCkKLQkJcHcuY2xvc2UoKTsKLQkJcHcucHJpbnRsbigibCIpOwotCQlhc3NlcnRUcnVlKCJXcml0ZSBvbiBjbG9zZWQgc3RyZWFtIGZhaWxlZCB0byBnZW5lcmF0ZSBlcnJvciIsIHB3Ci0JCQkJLmNoZWNrRXJyb3IoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLmNsb3NlKCkKKyAgICAgICAgcHcuY2xvc2UoKTsKKyAgICAgICAgcHcucHJpbnRsbigibCIpOworICAgICAgICBhc3NlcnRUcnVlKCJXcml0ZSBvbiBjbG9zZWQgc3RyZWFtIGZhaWxlZCB0byBnZW5lcmF0ZSBlcnJvciIsIHB3CisgICAgICAgICAgICAgICAgLmNoZWNrRXJyb3IoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIuZmx1c2goKQotCQlmaW5hbCBkb3VibGUgZHViID0gNDkwMDAwMDAwMDAwLjA4NzY1OwotCQlwdy5wcmludChkdWIpOwotCQlwdy5mbHVzaCgpOwotCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmx1c2giLCBuZXcgU3RyaW5nKGJhby50b0J5dGVBcnJheSgpKQotCQkJCS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoZHViKSkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNmbHVzaCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsdXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9mbHVzaCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5mbHVzaCgpCisgICAgICAgIGZpbmFsIGRvdWJsZSBkdWIgPSA0OTAwMDAwMDAwMDAuMDg3NjU7CisgICAgICAgIHB3LnByaW50KGR1Yik7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBmbHVzaCIsIG5ldyBTdHJpbmcoYmFvLnRvQnl0ZUFycmF5KCkpCisgICAgICAgICAgICAgICAgLmVxdWFscyhTdHJpbmcudmFsdWVPZihkdWIpKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnQoY2hhcltdKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcHJpbnQkQygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludChjaGFyIFtdKQotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCWNoYXJbXSBzY2hhcnMgPSBuZXcgY2hhclsxMV07Ci0JCSJIZWxsbyBXb3JsZCIuZ2V0Q2hhcnMoMCwgMTEsIHNjaGFycywgMCk7Ci0JCXB3LnByaW50KHNjaGFycyk7Ci0JCXB3LmZsdXNoKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKLQkJCXMgPSBici5yZWFkTGluZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGNoYXJbXSBzdHJpbmc6ICIgKyBzLCBzCi0JCQkJLmVxdWFscygiSGVsbG8gV29ybGQiKSk7Ci0JCWludCByID0gMDsKLQkJdHJ5IHsKLQkJCXB3LnByaW50KChjaGFyW10pIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyID0gMTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoIm51bGwgcG9pbnRlciBleGNlcHRpb24gZm9yIHByaW50aW5nIG51bGwgY2hhcltdIGlzIG5vdCBjYXVnaHQiLAotCQkJCTEsIHIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludChjaGFyW10pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wcmludCRDKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50KGNoYXIgW10pCisgICAgICAgIFN0cmluZyBzID0gbnVsbDsKKyAgICAgICAgY2hhcltdIHNjaGFycyA9IG5ldyBjaGFyWzExXTsKKyAgICAgICAgIkhlbGxvIFdvcmxkIi5nZXRDaGFycygwLCAxMSwgc2NoYXJzLCAwKTsKKyAgICAgICAgcHcucHJpbnQoc2NoYXJzKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgY2hhcltdIHN0cmluZzogIiArIHMsIHMKKyAgICAgICAgICAgICAgICAuZXF1YWxzKCJIZWxsbyBXb3JsZCIpKTsKKyAgICAgICAgaW50IHIgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHcucHJpbnQoKGNoYXJbXSkgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHIgPSAxOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygibnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBmb3IgcHJpbnRpbmcgbnVsbCBjaGFyW10gaXMgbm90IGNhdWdodCIsCisgICAgICAgICAgICAgICAgMSwgcik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnQoY2hhcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3ByaW50QygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludChjaGFyKQotCQlwdy5wcmludCgnYycpOwotCQlwdy5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoIldyb3RlIGluY29ycmVjdCBjaGFyIHN0cmluZyIsICJjIiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkKLQkJCQkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludChjaGFyKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50QygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludChjaGFyKQorICAgICAgICBwdy5wcmludCgnYycpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb3RlIGluY29ycmVjdCBjaGFyIHN0cmluZyIsICJjIiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkKKyAgICAgICAgICAgICAgICApOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3ByaW50RCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludChkb3VibGUpCi0JCWZpbmFsIGRvdWJsZSBkdWIgPSA0OTAwMDAwMDAwMDAuMDg3NjU7Ci0JCXB3LnByaW50KGR1Yik7Ci0JCXB3LmZsdXNoKCk7Ci0JCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBkb3VibGUgc3RyaW5nIiwgbmV3IFN0cmluZyhiYW8KLQkJCQkudG9CeXRlQXJyYXkoKSkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKGR1YikpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnQoZG91YmxlKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnREKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50KGRvdWJsZSkKKyAgICAgICAgZmluYWwgZG91YmxlIGR1YiA9IDQ5MDAwMDAwMDAwMC4wODc2NTsKKyAgICAgICAgcHcucHJpbnQoZHViKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGRvdWJsZSBzdHJpbmciLCBuZXcgU3RyaW5nKGJhbworICAgICAgICAgICAgICAgIC50b0J5dGVBcnJheSgpKS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoZHViKSkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGZsb2F0KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRGKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50KGZsb2F0KQotCQlmaW5hbCBmbG9hdCBmbG8gPSA0OS4wODc2NWY7Ci0JCXB3LnByaW50KGZsbyk7Ci0JCXB3LmZsdXNoKCk7Ci0JCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBmbG9hdCBzdHJpbmciLAotCQkJCW5ldyBTdHJpbmcoYmFvLnRvQnl0ZUFycmF5KCkpLmVxdWFscyhTdHJpbmcudmFsdWVPZihmbG8pKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGZsb2F0KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wcmludEYoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnQoZmxvYXQpCisgICAgICAgIGZpbmFsIGZsb2F0IGZsbyA9IDQ5LjA4NzY1ZjsKKyAgICAgICAgcHcucHJpbnQoZmxvKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGZsb2F0IHN0cmluZyIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKGZsbykpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wcmludEkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnQoaW50KQotCQlwdy5wcmludCg0OTA4NzY1KTsKLQkJcHcuZmx1c2goKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgaW50IHN0cmluZyIsICI0OTA4NzY1IiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkKLQkJCQkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludChpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wcmludEkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnQoaW50KQorICAgICAgICBwdy5wcmludCg0OTA4NzY1KTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgaW50IHN0cmluZyIsICI0OTA4NzY1IiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkKKyAgICAgICAgICAgICAgICApOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wcmludEooKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnQobG9uZykKLQkJcHcucHJpbnQoNDkwODc2NTAwMDBMKTsKLQkJcHcuZmx1c2goKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgbG9uZyBzdHJpbmciLCAiNDkwODc2NTAwMDAiLCBuZXcgU3RyaW5nKGJhby50b0J5dGVBcnJheSgpKQotCQkJCSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGxvbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRKKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50KGxvbmcpCisgICAgICAgIHB3LnByaW50KDQ5MDg3NjUwMDAwTCk7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IGxvbmcgc3RyaW5nIiwgIjQ5MDg3NjUwMDAwIiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkKKyAgICAgICAgICAgICAgICApOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wcmludExqYXZhX2xhbmdfT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50KGphdmEubGFuZy5PYmplY3QpCi0JCXB3LnByaW50KChPYmplY3QpIG51bGwpOwotCQlwdy5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoIkRpZCBub3Qgd3JpdGUgbnVsbCIsICJudWxsIiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkKLQkJCQkpOwotCQliYW8ucmVzZXQoKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludChqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50TGphdmFfbGFuZ19PYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnQoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgICAgcHcucHJpbnQoKE9iamVjdCkgbnVsbCk7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGlkIG5vdCB3cml0ZSBudWxsIiwgIm51bGwiLCBuZXcgU3RyaW5nKGJhby50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIGJhby5yZXNldCgpOwogCi0JCXB3LnByaW50KG5ldyBCb2d1cygpKTsKLQkJcHcuZmx1c2goKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbiBpbmNvcnJlY3QgT2JqZWN0IHN0cmluZyIsICJCb2d1cyIsIG5ldyBTdHJpbmcoYmFvCi0JCQkJLnRvQnl0ZUFycmF5KCkpKTsKLQl9CisgICAgICAgIHB3LnByaW50KG5ldyBCb2d1cygpKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbiBpbmNvcnJlY3QgT2JqZWN0IHN0cmluZyIsICJCb2d1cyIsIG5ldyBTdHJpbmcoYmFvCisgICAgICAgICAgICAgICAgLnRvQnl0ZUFycmF5KCkpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQotCQlwdy5wcmludCgoU3RyaW5nKSBudWxsKTsKLQkJcHcuZmx1c2goKTsKLQkJYXNzZXJ0RXF1YWxzKCJkaWQgbm90IHdyaXRlIG51bGwiLCAibnVsbCIsIG5ldyBTdHJpbmcoYmFvLnRvQnl0ZUFycmF5KCkpCi0JCQkJKTsKLQkJYmFvLnJlc2V0KCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wcmludExqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIHB3LnByaW50KChTdHJpbmcpIG51bGwpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpZCBub3Qgd3JpdGUgbnVsbCIsICJudWxsIiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkpOworICAgICAgICBiYW8ucmVzZXQoKTsKIAotCQlwdy5wcmludCgiSGVsbG8gV29ybGQiKTsKLQkJcHcuZmx1c2goKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgIHN0cmluZyIsICJIZWxsbyBXb3JsZCIsIG5ldyBTdHJpbmcoYmFvLnRvQnl0ZUFycmF5KCkpCi0JCQkJKTsKLQl9CisgICAgICAgIHB3LnByaW50KCJIZWxsbyBXb3JsZCIpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb3RlIGluY29ycmVjdCAgc3RyaW5nIiwgIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhiYW8udG9CeXRlQXJyYXkoKSkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wcmludFooKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnQoYm9vbGVhbikKLQkJcHcucHJpbnQodHJ1ZSk7Ci0JCXB3LmZsdXNoKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvdGUgaW4gaW5jb3JyZWN0IGJvb2xlYW4gc3RyaW5nIiwgInRydWUiLCBuZXcgU3RyaW5nKGJhbwotCQkJCS50b0J5dGVBcnJheSgpKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50KGJvb2xlYW4pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRaKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50KGJvb2xlYW4pCisgICAgICAgIHB3LnByaW50KHRydWUpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb3RlIGluIGluY29ycmVjdCBib29sZWFuIHN0cmluZyIsICJ0cnVlIiwgbmV3IFN0cmluZyhiYW8KKyAgICAgICAgICAgICAgICAudG9CeXRlQXJyYXkoKSkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50bG4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludGxuKCkKLQkJU3RyaW5nIHM7Ci0JCXB3LnByaW50bG4oIkJsYXJnIik7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigiQmxlZXAiKTsKLQkJcHcuZmx1c2goKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgbGluZTogIiArIHMsIHMuZXF1YWxzKCJCbGFyZyIpKTsKLQkJCXMgPSBici5yZWFkTGluZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGxpbmU6ICIgKyBzLCBzLmVxdWFscygiIikpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgbGluZTogIiArIHMsIHMuZXF1YWxzKCJCbGVlcCIpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50bG4oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGxuKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oKQorICAgICAgICBTdHJpbmcgczsKKyAgICAgICAgcHcucHJpbnRsbigiQmxhcmciKTsKKyAgICAgICAgcHcucHJpbnRsbigpOworICAgICAgICBwdy5wcmludGxuKCJCbGVlcCIpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKGJhby50b1N0cmluZygpKSk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBsaW5lOiAiICsgcywgcy5lcXVhbHMoIkJsYXJnIikpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgbGluZTogIiArIHMsIHMuZXF1YWxzKCIiKSk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBsaW5lOiAiICsgcywgcy5lcXVhbHMoIkJsZWVwIikpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGxuKGNoYXJbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG4kQygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludGxuKGNoYXIgW10pCi0JCVN0cmluZyBzID0gbnVsbDsKLQkJY2hhcltdIHNjaGFycyA9IG5ldyBjaGFyWzExXTsKLQkJIkhlbGxvIFdvcmxkIi5nZXRDaGFycygwLCAxMSwgc2NoYXJzLCAwKTsKLQkJcHcucHJpbnRsbigiUmFuZG9tIENoYXJzIik7Ci0JCXB3LnByaW50bG4oc2NoYXJzKTsKLQkJcHcuZmx1c2goKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQlzID0gYnIucmVhZExpbmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBjaGFyW10gc3RyaW5nOiAiICsgcywgcwotCQkJCS5lcXVhbHMoIkhlbGxvIFdvcmxkIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGxuKGNoYXJbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRsbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbiRDKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oY2hhciBbXSkKKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOworICAgICAgICBjaGFyW10gc2NoYXJzID0gbmV3IGNoYXJbMTFdOworICAgICAgICAiSGVsbG8gV29ybGQiLmdldENoYXJzKDAsIDExLCBzY2hhcnMsIDApOworICAgICAgICBwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKKyAgICAgICAgcHcucHJpbnRsbihzY2hhcnMpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKGJhby50b1N0cmluZygpKSk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHMgPSBici5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGNoYXJbXSBzdHJpbmc6ICIgKyBzLCBzCisgICAgICAgICAgICAgICAgLmVxdWFscygiSGVsbG8gV29ybGQiKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRsbihjaGFyKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnRsbihjaGFyKQotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCXB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOwotCQlwdy5wcmludGxuKCdjJyk7Ci0JCXB3LmZsdXNoKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKLQkJCXMgPSBici5yZWFkTGluZSgpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgY2hhciBzdHJpbmc6ICIgKyBzLCBzLmVxdWFscygiYyIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRsbihjaGFyKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnRsbihjaGFyKQorICAgICAgICBTdHJpbmcgcyA9IG51bGw7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy5wcmludGxuKCdjJyk7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHMgPSBici5yZWFkTGluZSgpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgY2hhciBzdHJpbmc6ICIgKyBzLCBzLmVxdWFscygiYyIpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGxuKGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG5EKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oZG91YmxlKQotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCWZpbmFsIGRvdWJsZSBkdWIgPSA0MDAwMDAwMDAwMDAwMDAwLjY1NzQ4MzsKLQkJcHcucHJpbnRsbigiUmFuZG9tIENoYXJzIik7Ci0JCXB3LnByaW50bG4oZHViKTsKLQkJcHcuZmx1c2goKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJYnIucmVhZExpbmUoKTsKLQkJCXMgPSBici5yZWFkTGluZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGRvdWJsZSBzdHJpbmc6ICIgKyBzLCBzLmVxdWFscyhTdHJpbmcKLQkJCQkudmFsdWVPZihkdWIpKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50bG4oZG91YmxlKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGxuRCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludGxuKGRvdWJsZSkKKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOworICAgICAgICBmaW5hbCBkb3VibGUgZHViID0gNDAwMDAwMDAwMDAwMDAwMC42NTc0ODM7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy5wcmludGxuKGR1Yik7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBkb3VibGUgc3RyaW5nOiAiICsgcywgcy5lcXVhbHMoU3RyaW5nCisgICAgICAgICAgICAgICAgLnZhbHVlT2YoZHViKSkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50bG4oZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wcmludGxuRigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludGxuKGZsb2F0KQotCQlTdHJpbmcgczsKLQkJZmluYWwgZmxvYXQgZmxvID0gNDAuNDY0NjQ2NGY7Ci0JCXB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOwotCQlwdy5wcmludGxuKGZsbyk7Ci0JCXB3LmZsdXNoKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKLQkJCWJyLnJlYWRMaW5lKCk7Ci0JCQlzID0gYnIucmVhZExpbmUoKTsKLQkJCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBmbG9hdCBzdHJpbmc6ICIgKyBzICsgIiB3YW50ZWQ6ICIKLQkJCQkJKyBTdHJpbmcudmFsdWVPZihmbG8pLCBzLmVxdWFscyhTdHJpbmcudmFsdWVPZihmbG8pKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50bG4oZmxvYXQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkYoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnRsbihmbG9hdCkKKyAgICAgICAgU3RyaW5nIHM7CisgICAgICAgIGZpbmFsIGZsb2F0IGZsbyA9IDQwLjQ2NDY0NjRmOworICAgICAgICBwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKKyAgICAgICAgcHcucHJpbnRsbihmbG8pOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKGJhby50b1N0cmluZygpKSk7CisgICAgICAgICAgICBici5yZWFkTGluZSgpOworICAgICAgICAgICAgcyA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgZmxvYXQgc3RyaW5nOiAiICsgcyArICIgd2FudGVkOiAiCisgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nLnZhbHVlT2YoZmxvKSwgcy5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoZmxvKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGxuKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG5JKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oaW50KQotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCXB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOwotCQlwdy5wcmludGxuKDQwMDAwMCk7Ci0JCXB3LmZsdXNoKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKLQkJCWJyLnJlYWRMaW5lKCk7Ci0JCQlzID0gYnIucmVhZExpbmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBpbnQgc3RyaW5nOiAiICsgcywgcy5lcXVhbHMoIjQwMDAwMCIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRsbihpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG5JKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oaW50KQorICAgICAgICBTdHJpbmcgcyA9IG51bGw7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy5wcmludGxuKDQwMDAwMCk7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBpbnQgc3RyaW5nOiAiICsgcywgcy5lcXVhbHMoIjQwMDAwMCIpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGxuKGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wcmludGxuSigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludGxuKGxvbmcpCi0JCVN0cmluZyBzID0gbnVsbDsKLQkJcHcucHJpbnRsbigiUmFuZG9tIENoYXJzIik7Ci0JCXB3LnByaW50bG4oNDAwMDAwMDAwMDAwMEwpOwotCQlwdy5mbHVzaCgpOwotCQl0cnkgewotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKGJhby50b1N0cmluZygpKSk7Ci0JCQlici5yZWFkTGluZSgpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgbG9uZyBzdHJpbmc6ICIgKyBzLCBzCi0JCQkJLmVxdWFscygiNDAwMDAwMDAwMDAwMCIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRsbihsb25nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnRsbihsb25nKQorICAgICAgICBTdHJpbmcgcyA9IG51bGw7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy5wcmludGxuKDQwMDAwMDAwMDAwMDBMKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHMgPSBici5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGxvbmcgc3RyaW5nOiAiICsgcywgcworICAgICAgICAgICAgICAgIC5lcXVhbHMoIjQwMDAwMDAwMDAwMDAiKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRsbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkxqYXZhX2xhbmdfT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oamF2YS5sYW5nLk9iamVjdCkKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKLQkJcHcucHJpbnRsbihuZXcgQm9ndXMoKSk7Ci0JCXB3LmZsdXNoKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKLQkJCWJyLnJlYWRMaW5lKCk7Ci0JCQlzID0gYnIucmVhZExpbmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBPYmplY3Qgc3RyaW5nOiAiICsgcywgcy5lcXVhbHMoIkJvZ3VzIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGxuKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50bG4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGxuTGphdmFfbGFuZ19PYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIucHJpbnRsbihqYXZhLmxhbmcuT2JqZWN0KQorICAgICAgICBTdHJpbmcgcyA9IG51bGw7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy5wcmludGxuKG5ldyBCb2d1cygpKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHMgPSBici5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IE9iamVjdCBzdHJpbmc6ICIgKyBzLCBzLmVxdWFscygiQm9ndXMiKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oamF2YS5sYW5nLlN0cmluZykKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKLQkJcHcucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKLQkJcHcuZmx1c2goKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJYnIucmVhZExpbmUoKTsKLQkJCXMgPSBici5yZWFkTGluZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IHN0cmluZzogIiArIHMsIHMuZXF1YWxzKCJIZWxsbyBXb3JsZCIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRsbkxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOworICAgICAgICBwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKKyAgICAgICAgcHcucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHMgPSBici5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IHN0cmluZzogIiArIHMsIHMuZXF1YWxzKCJIZWxsbyBXb3JsZCIpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGxuKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wcmludGxuWigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci5wcmludGxuKGJvb2xlYW4pCi0JCVN0cmluZyBzID0gbnVsbDsKLQkJcHcucHJpbnRsbigiUmFuZG9tIENoYXJzIik7Ci0JCXB3LnByaW50bG4oZmFsc2UpOwotCQlwdy5mbHVzaCgpOwotCQl0cnkgewotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKGJhby50b1N0cmluZygpKSk7Ci0JCQlici5yZWFkTGluZSgpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgYm9vbGVhbiBzdHJpbmc6ICIgKyBzLCBzLmVxdWFscygiZmFsc2UiKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3ByaW50bG4oYm9vbGVhbikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRsbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50bG5aKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLnByaW50bG4oYm9vbGVhbikKKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOworICAgICAgICBwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKKyAgICAgICAgcHcucHJpbnRsbihmYWxzZSk7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBib29sZWFuIHN0cmluZzogIiArIHMsIHMuZXF1YWxzKCJmYWxzZSIpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciN3cml0ZShjaGFyW10pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZSRDKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLndyaXRlKGNoYXIgW10pCi0JCVN0cmluZyBzID0gbnVsbDsKLQkJY2hhcltdIHNjaGFycyA9IG5ldyBjaGFyWzExXTsKLQkJIkhlbGxvIFdvcmxkIi5nZXRDaGFycygwLCAxMSwgc2NoYXJzLCAwKTsKLQkJcHcucHJpbnRsbigiUmFuZG9tIENoYXJzIik7Ci0JCXB3LndyaXRlKHNjaGFycyk7Ci0JCXB3LmZsdXNoKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKLQkJCWJyLnJlYWRMaW5lKCk7Ci0JCQlzID0gYnIucmVhZExpbmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGNoYXJbXSBzdHJpbmc6ICIgKyBzLCBzCi0JCQkJLmVxdWFscygiSGVsbG8gV29ybGQiKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3dyaXRlKGNoYXJbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJEMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIud3JpdGUoY2hhciBbXSkKKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOworICAgICAgICBjaGFyW10gc2NoYXJzID0gbmV3IGNoYXJbMTFdOworICAgICAgICAiSGVsbG8gV29ybGQiLmdldENoYXJzKDAsIDExLCBzY2hhcnMsIDApOworICAgICAgICBwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKKyAgICAgICAgcHcud3JpdGUoc2NoYXJzKTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHMgPSBici5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgY2hhcltdIHN0cmluZzogIiArIHMsIHMKKyAgICAgICAgICAgICAgICAuZXF1YWxzKCJIZWxsbyBXb3JsZCIpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciN3cml0ZShjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQ0lJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLndyaXRlKGNoYXIgW10sIGludCwgaW50KQotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCWNoYXJbXSBzY2hhcnMgPSBuZXcgY2hhclsxMV07Ci0JCSJIZWxsbyBXb3JsZCIuZ2V0Q2hhcnMoMCwgMTEsIHNjaGFycywgMCk7Ci0JCXB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOwotCQlwdy53cml0ZShzY2hhcnMsIDYsIDUpOwotCQlwdy5mbHVzaCgpOwotCQl0cnkgewotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN1cHBvcnRfU3RyaW5nUmVhZGVyKGJhby50b1N0cmluZygpKSk7Ci0JCQlici5yZWFkTGluZSgpOwotCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgY2hhcltdIHN0cmluZzogIiArIHMsIHMuZXF1YWxzKCJXb3JsZCIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRDSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIud3JpdGUoY2hhciBbXSwgaW50LCBpbnQpCisgICAgICAgIFN0cmluZyBzID0gbnVsbDsKKyAgICAgICAgY2hhcltdIHNjaGFycyA9IG5ldyBjaGFyWzExXTsKKyAgICAgICAgIkhlbGxvIFdvcmxkIi5nZXRDaGFycygwLCAxMSwgc2NoYXJzLCAwKTsKKyAgICAgICAgcHcucHJpbnRsbigiUmFuZG9tIENoYXJzIik7CisgICAgICAgIHB3LndyaXRlKHNjaGFycywgNiwgNSk7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBjaGFyW10gc3RyaW5nOiAiICsgcywgcy5lcXVhbHMoIldvcmxkIikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3dyaXRlKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QcmludFdyaXRlci53cml0ZShpbnQpCi0JCWNoYXJbXSBjYWIgPSBuZXcgY2hhclszXTsKLQkJcHcud3JpdGUoJ2EnKTsKLQkJcHcud3JpdGUoJ2InKTsKLQkJcHcud3JpdGUoJ2MnKTsKLQkJcHcuZmx1c2goKTsKLQkJYmFpID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhby50b0J5dGVBcnJheSgpKTsKLQkJY2FiWzBdID0gKGNoYXIpIGJhaS5yZWFkKCk7Ci0JCWNhYlsxXSA9IChjaGFyKSBiYWkucmVhZCgpOwotCQljYWJbMl0gPSAoY2hhcikgYmFpLnJlYWQoKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGludHMiLCBjYWJbMF0gPT0gJ2EnICYmIGNhYlsxXSA9PSAnYicKLQkJCQkmJiBjYWJbMl0gPT0gJ2MnKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciN3cml0ZShpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIud3JpdGUoaW50KQorICAgICAgICBjaGFyW10gY2FiID0gbmV3IGNoYXJbM107CisgICAgICAgIHB3LndyaXRlKCdhJyk7CisgICAgICAgIHB3LndyaXRlKCdiJyk7CisgICAgICAgIHB3LndyaXRlKCdjJyk7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIGJhaSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW8udG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGNhYlswXSA9IChjaGFyKSBiYWkucmVhZCgpOworICAgICAgICBjYWJbMV0gPSAoY2hhcikgYmFpLnJlYWQoKTsKKyAgICAgICAgY2FiWzJdID0gKGNoYXIpIGJhaS5yZWFkKCk7CisgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBpbnRzIiwgY2FiWzBdID09ICdhJyAmJiBjYWJbMV0gPT0gJ2InCisgICAgICAgICAgICAgICAgJiYgY2FiWzJdID09ICdjJyk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIud3JpdGUoamF2YS5sYW5nLlN0cmluZykKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKLQkJcHcud3JpdGUoIkhlbGxvIFdvcmxkIik7Ci0JCXB3LmZsdXNoKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKLQkJCWJyLnJlYWRMaW5lKCk7Ci0JCQlzID0gYnIucmVhZExpbmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBjaGFyW10gc3RyaW5nOiAiICsgcywgcwotCQkJCS5lcXVhbHMoIkhlbGxvIFdvcmxkIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHJpbnRXcml0ZXIud3JpdGUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOworICAgICAgICBwdy5wcmludGxuKCJSYW5kb20gQ2hhcnMiKTsKKyAgICAgICAgcHcud3JpdGUoIkhlbGxvIFdvcmxkIik7CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIoYmFvLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBzID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBjaGFyW10gc3RyaW5nOiAiICsgcywgcworICAgICAgICAgICAgICAgIC5lcXVhbHMoIkhlbGxvIFdvcmxkIikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLndyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwKLQkJLy8gaW50KQotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCXB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOwotCQlwdy53cml0ZSgiSGVsbG8gV29ybGQiLCA2LCA1KTsKLQkJcHcuZmx1c2goKTsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOwotCQkJYnIucmVhZExpbmUoKTsKLQkJCXMgPSBici5yZWFkTGluZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGNoYXJbXSBzdHJpbmc6ICIgKyBzLCBzLmVxdWFscygiV29ybGQiKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2FwcGVuZChjaGFyKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ2hhcigpIHsKLQljaGFyIHRlc3RDaGFyID0gJyAnOwotCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0KTsKLQlwcmludFdyaXRlci5hcHBlbmQodGVzdENoYXIpOwotCXByaW50V3JpdGVyLmZsdXNoKCk7Ci0JYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKHRlc3RDaGFyKSxvdXQudG9TdHJpbmcoKSk7Ci0JcHJpbnRXcml0ZXIuY2xvc2UoKTsKLQl9Ci0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjYXBwZW5kKENoYXJTZXF1ZW5jZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZENoYXJTZXF1ZW5jZSgpIHsKLQkJCi0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIk15IFRlc3QgU3RyaW5nIjsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0KTsKLQkJcHJpbnRXcml0ZXIuYXBwZW5kKHRlc3RTdHJpbmcpOwotCQlwcmludFdyaXRlci5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHModGVzdFN0cmluZywgb3V0LnRvU3RyaW5nKCkpOwotCQlwcmludFdyaXRlci5jbG9zZSgpOwkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMamF2YV9sYW5nX1N0cmluZ0lJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlByaW50V3JpdGVyLndyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICBTdHJpbmcgcyA9IG51bGw7CisgICAgICAgIHB3LnByaW50bG4oIlJhbmRvbSBDaGFycyIpOworICAgICAgICBwdy53cml0ZSgiSGVsbG8gV29ybGQiLCA2LCA1KTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcihiYW8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHMgPSBici5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGNoYXJbXSBzdHJpbmc6ICIgKyBzLCBzLmVxdWFscygiV29ybGQiKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2FwcGVuZChjaGFyKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyKCkgeworICAgIGNoYXIgdGVzdENoYXIgPSAnICc7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXQpOworICAgIHByaW50V3JpdGVyLmFwcGVuZCh0ZXN0Q2hhcik7CisgICAgcHJpbnRXcml0ZXIuZmx1c2goKTsKKyAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YodGVzdENoYXIpLG91dC50b1N0cmluZygpKTsKKyAgICBwcmludFdyaXRlci5jbG9zZSgpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNhcHBlbmQoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyU2VxdWVuY2UoKSB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBUZXN0IFN0cmluZyI7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dCk7CisgICAgICAgIHByaW50V3JpdGVyLmFwcGVuZCh0ZXN0U3RyaW5nKTsKKyAgICAgICAgcHJpbnRXcml0ZXIuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RTdHJpbmcsIG91dC50b1N0cmluZygpKTsKKyAgICAgICAgcHJpbnRXcml0ZXIuY2xvc2UoKTsgICAgCiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2FwcGVuZChDaGFyU2VxdWVuY2UsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ2hhclNlcXVlbmNlSW50SW50KCkgewotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBUZXN0IFN0cmluZyI7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dCk7Ci0JCXByaW50V3JpdGVyLmFwcGVuZCh0ZXN0U3RyaW5nLCAxLCAzKTsKLQkJcHJpbnRXcml0ZXIuZmx1c2goKTsKLQkJYXNzZXJ0RXF1YWxzKHRlc3RTdHJpbmcuc3Vic3RyaW5nKDEsIDMpLCBvdXQudG9TdHJpbmcoKSk7Ci0JCXByaW50V3JpdGVyLmNsb3NlKCk7CisgICAgLyoqCisgICAgICogIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2FwcGVuZChDaGFyU2VxdWVuY2UsIGludCwgaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyU2VxdWVuY2VJbnRJbnQoKSB7CisgICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIk15IFRlc3QgU3RyaW5nIjsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0KTsKKyAgICAgICAgcHJpbnRXcml0ZXIuYXBwZW5kKHRlc3RTdHJpbmcsIDEsIDMpOworICAgICAgICBwcmludFdyaXRlci5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdFN0cmluZy5zdWJzdHJpbmcoMSwgMyksIG91dC50b1N0cmluZygpKTsKKyAgICAgICAgcHJpbnRXcml0ZXIuY2xvc2UoKTsKIAotCX0KKyAgICB9CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBwdy5mb3JtYXQoIiVzICVzIiwgIkhlbGxvIiwgIldvcmxkIik7CiAgICAgICAgIHB3LmZsdXNoKCk7CkBAIC02OTYsNiArMTA0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2Zvcm1hdChqYXZhLnV0aWwuTG9jYWxlLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfdXRpbF9Mb2NhbGVfTGphdmFfbGFuZ19TdHJpbmdfJExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBwdy5mb3JtYXQoTG9jYWxlLlVTLCAiJXMgJXMiLCAiSGVsbG8iLCAiV29ybGQiKTsKICAgICAgICAgcHcuZmx1c2goKTsKQEAgLTcwNiw2ICsxMDY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjcHJpbnRmKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbnRmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmludGZMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgcHcucHJpbnRmKCIlcyAlcyIsICJIZWxsbyIsICJXb3JsZCIpOwogICAgICAgICBwdy5mbHVzaCgpOwpAQCAtNzE2LDYgKzEwODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNwcmludGYoamF2YS51dGlsLkxvY2FsZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50ZkxqYXZhX3V0aWxfTG9jYWxlX0xqYXZhX2xhbmdfU3RyaW5nXyRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgcHcucHJpbnRmKExvY2FsZS5VUywgIiVzICVzIiwgIkhlbGxvIiwgIldvcmxkIik7CiAgICAgICAgIHB3LmZsdXNoKCk7CkBAIC03MjMsMjQgKzExMDMsMjQgQEAKICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKGJhby50b0J5dGVBcnJheSgpKSk7CiAgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCWJhbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJcHcgPSBuZXcgUHJpbnRXcml0ZXIoYmFvLCBmYWxzZSk7CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGJhbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgcHcgPSBuZXcgUHJpbnRXcml0ZXIoYmFvLCBmYWxzZSk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlwdy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHcuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QdXNoYmFja0lucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1B1c2hiYWNrSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNWNlZjlmMi4uOWJiNDljYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1B1c2hiYWNrSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1B1c2hiYWNrSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDE5OSArMTcsMjk1IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKIAorQFRlc3RUYXJnZXRDbGFzcyhQdXNoYmFja0lucHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQdXNoYmFja0lucHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlQdXNoYmFja0lucHV0U3RyZWFtIHBpczsKKyAgICBQdXNoYmFja0lucHV0U3RyZWFtIHBpczsKIAotCXB1YmxpYyBTdHJpbmcgZmlsZVN0cmluZyA9ICJUZXN0X0FsbF9UZXN0c1xuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CdWZmZXJlZE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J5dGVBcnJheUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRGF0YUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsZVxuVGVzdF9qYXZhX2lvX0ZpbGVEZXNjcmlwdG9yXG5UZXN0X2phdmFfaW9fRmlsZUlucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsZU5vdEZvdW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fRmlsZU91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0ZpbHRlcklucHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVyT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19JT0V4Y2VwdGlvblxuVGVzdF9qYXZhX2lvX091dHB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX1ByaW50U3RyZWFtXG5UZXN0X2phdmFfaW9fUmFuZG9tQWNjZXNzRmlsZVxuVGVzdF9qYXZhX2lvX1N5bmNGYWlsZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Fic3RyYWN0TWV0aG9kRXJyb3JcblRlc3RfamF2YV9sYW5nX0FyaXRobWV0aWNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlTdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQm9vbGVhblxuVGVzdF9qYXZhX2xhbmdfQnl0ZVxuVGVzdF9qYXZhX2xhbmdfQ2hhcmFjdGVyXG5UZXN0X2phdmFfbGFuZ19DbGFzc1xuVGVzdF9qYXZhX2xhbmdfQ2xhc3NDYXN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19DbGFzc0NpcmN1bGFyaXR5RXJyb3JcblRlc3RfamF2YV9sYW5nX0NsYXNzRm9ybWF0RXJyb3JcblRlc3RfamF2YV9sYW5nX0NsYXNzTG9hZGVyXG5UZXN0X2phdmFfbGFuZ19DbGFzc05vdEZvdW5kRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfRG91YmxlXG5UZXN0X2phdmFfbGFuZ19FcnJvclxuVGVzdF9qYXZhX2xhbmdfRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3JcblRlc3RfamF2YV9sYW5nX0Zsb2F0XG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsQWNjZXNzRXJyb3JcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yXG5UZXN0X2phdmFfbGFuZ19JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbnN0YW50aWF0aW9uRXJyb3JcblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0ludGVnZXJcblRlc3RfamF2YV9sYW5nX0ludGVybmFsRXJyb3JcblRlc3RfamF2YV9sYW5nX0ludGVycnVwdGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19MaW5rYWdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0xvbmdcblRlc3RfamF2YV9sYW5nX01hdGhcblRlc3RfamF2YV9sYW5nX05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Ob0NsYXNzRGVmRm91bmRFcnJvclxuVGVzdF9qYXZhX2xhbmdfTm9TdWNoRmllbGRFcnJvclxuVGVzdF9qYXZhX2xhbmdfTm9TdWNoTWV0aG9kRXJyb3JcblRlc3RfamF2YV9sYW5nX051bGxQb2ludGVyRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19OdW1iZXJcblRlc3RfamF2YV9sYW5nX051bWJlckZvcm1hdEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfT2JqZWN0XG5UZXN0X2phdmFfbGFuZ19PdXRPZk1lbW9yeUVycm9yXG5UZXN0X2phdmFfbGFuZ19SdW50aW1lRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19TZWN1cml0eU1hbmFnZXJcblRlc3RfamF2YV9sYW5nX1Nob3J0XG5UZXN0X2phdmFfbGFuZ19TdGFja092ZXJmbG93RXJyb3JcblRlc3RfamF2YV9sYW5nX1N0cmluZ1xuVGVzdF9qYXZhX2xhbmdfU3RyaW5nQnVmZmVyXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19TeXN0ZW1cblRlc3RfamF2YV9sYW5nX1RocmVhZFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkRGVhdGhcblRlc3RfamF2YV9sYW5nX1RocmVhZEdyb3VwXG5UZXN0X2phdmFfbGFuZ19UaHJvd2FibGVcblRlc3RfamF2YV9sYW5nX1Vua25vd25FcnJvclxuVGVzdF9qYXZhX2xhbmdfVW5zYXRpc2ZpZWRMaW5rRXJyb3JcblRlc3RfamF2YV9sYW5nX1ZlcmlmeUVycm9yXG5UZXN0X2phdmFfbGFuZ19WaXJ0dWFsTWFjaGluZUVycm9yXG5UZXN0X2phdmFfbGFuZ192bV9JbWFnZVxuVGVzdF9qYXZhX2xhbmdfdm1fTWVtb3J5U2VnbWVudFxuVGVzdF9qYXZhX2xhbmdfdm1fUk9NU3RvcmVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX3ZtX1ZNXG5UZXN0X2phdmFfbGFuZ19Wb2lkXG5UZXN0X2phdmFfbmV0X0JpbmRFeGNlcHRpb25cblRlc3RfamF2YV9uZXRfQ29ubmVjdEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVBhY2tldFxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVNvY2tldFxuVGVzdF9qYXZhX25ldF9EYXRhZ3JhbVNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfSW5ldEFkZHJlc3NcblRlc3RfamF2YV9uZXRfTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9QbGFpbkRhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9QbGFpblNvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0XG5UZXN0X2phdmFfbmV0X1NvY2tldEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1NvY2tldElucHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1NvY2tldE91dHB1dFN0cmVhbVxuVGVzdF9qYXZhX25ldF9Vbmtub3duSG9zdEV4Y2VwdGlvblxuVGVzdF9qYXZhX3V0aWxfQXJyYXlFbnVtZXJhdG9yXG5UZXN0X2phdmFfdXRpbF9EYXRlXG5UZXN0X2phdmFfdXRpbF9FdmVudE9iamVjdFxuVGVzdF9qYXZhX3V0aWxfSGFzaEVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0hhc2h0YWJsZVxuVGVzdF9qYXZhX3V0aWxfUHJvcGVydGllc1xuVGVzdF9qYXZhX3V0aWxfUmVzb3VyY2VCdW5kbGVcblRlc3RfamF2YV91dGlsX3RtXG5UZXN0X2phdmFfdXRpbF9WZWN0b3JcbiI7CisgICAgcHVibGljIFN0cmluZyBmaWxlU3RyaW5nID0gIlRlc3RfQWxsX1Rlc3RzXG5UZXN0X2phdmFfaW9fQnVmZmVyZWRJbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0J1ZmZlcmVkT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fQnl0ZUFycmF5SW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19CeXRlQXJyYXlPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19EYXRhSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlXG5UZXN0X2phdmFfaW9fRmlsZURlc2NyaXB0b3JcblRlc3RfamF2YV9pb19GaWxlSW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWxlTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9pb19GaWxlT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fRmlsdGVySW5wdXRTdHJlYW1cblRlc3RfamF2YV9pb19GaWx0ZXJPdXRwdXRTdHJlYW1cblRlc3RfamF2YV9pb19JbnB1dFN0cmVhbVxuVGVzdF9qYXZhX2lvX0lPRXhjZXB0aW9uXG5UZXN0X2phdmFfaW9fT3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfaW9fUHJpbnRTdHJlYW1cblRlc3RfamF2YV9pb19SYW5kb21BY2Nlc3NGaWxlXG5UZXN0X2phdmFfaW9fU3luY0ZhaWxlZEV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQWJzdHJhY3RNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfQXJpdGhtZXRpY0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19BcnJheVN0b3JlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Cb29sZWFuXG5UZXN0X2phdmFfbGFuZ19CeXRlXG5UZXN0X2phdmFfbGFuZ19DaGFyYWN0ZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzXG5UZXN0X2phdmFfbGFuZ19DbGFzc0Nhc3RFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0NsYXNzQ2lyY3VsYXJpdHlFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NGb3JtYXRFcnJvclxuVGVzdF9qYXZhX2xhbmdfQ2xhc3NMb2FkZXJcblRlc3RfamF2YV9sYW5nX0NsYXNzTm90Rm91bmRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19Eb3VibGVcblRlc3RfamF2YV9sYW5nX0Vycm9yXG5UZXN0X2phdmFfbGFuZ19FeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvclxuVGVzdF9qYXZhX2xhbmdfRmxvYXRcblRlc3RfamF2YV9sYW5nX0lsbGVnYWxBY2Nlc3NFcnJvclxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JcblRlc3RfamF2YV9sYW5nX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0luc3RhbnRpYXRpb25FcnJvclxuVGVzdF9qYXZhX2xhbmdfSW5zdGFudGlhdGlvbkV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfSW50ZWdlclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJuYWxFcnJvclxuVGVzdF9qYXZhX2xhbmdfSW50ZXJydXB0ZWRFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX0xpbmthZ2VFcnJvclxuVGVzdF9qYXZhX2xhbmdfTG9uZ1xuVGVzdF9qYXZhX2xhbmdfTWF0aFxuVGVzdF9qYXZhX2xhbmdfTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX05vQ2xhc3NEZWZGb3VuZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hGaWVsZEVycm9yXG5UZXN0X2phdmFfbGFuZ19Ob1N1Y2hNZXRob2RFcnJvclxuVGVzdF9qYXZhX2xhbmdfTnVsbFBvaW50ZXJFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX051bWJlclxuVGVzdF9qYXZhX2xhbmdfTnVtYmVyRm9ybWF0RXhjZXB0aW9uXG5UZXN0X2phdmFfbGFuZ19PYmplY3RcblRlc3RfamF2YV9sYW5nX091dE9mTWVtb3J5RXJyb3JcblRlc3RfamF2YV9sYW5nX1J1bnRpbWVFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1NlY3VyaXR5TWFuYWdlclxuVGVzdF9qYXZhX2xhbmdfU2hvcnRcblRlc3RfamF2YV9sYW5nX1N0YWNrT3ZlcmZsb3dFcnJvclxuVGVzdF9qYXZhX2xhbmdfU3RyaW5nXG5UZXN0X2phdmFfbGFuZ19TdHJpbmdCdWZmZXJcblRlc3RfamF2YV9sYW5nX1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25cblRlc3RfamF2YV9sYW5nX1N5c3RlbVxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkXG5UZXN0X2phdmFfbGFuZ19UaHJlYWREZWF0aFxuVGVzdF9qYXZhX2xhbmdfVGhyZWFkR3JvdXBcblRlc3RfamF2YV9sYW5nX1Rocm93YWJsZVxuVGVzdF9qYXZhX2xhbmdfVW5rbm93bkVycm9yXG5UZXN0X2phdmFfbGFuZ19VbnNhdGlzZmllZExpbmtFcnJvclxuVGVzdF9qYXZhX2xhbmdfVmVyaWZ5RXJyb3JcblRlc3RfamF2YV9sYW5nX1ZpcnR1YWxNYWNoaW5lRXJyb3JcblRlc3RfamF2YV9sYW5nX3ZtX0ltYWdlXG5UZXN0X2phdmFfbGFuZ192bV9NZW1vcnlTZWdtZW50XG5UZXN0X2phdmFfbGFuZ192bV9ST01TdG9yZUV4Y2VwdGlvblxuVGVzdF9qYXZhX2xhbmdfdm1fVk1cblRlc3RfamF2YV9sYW5nX1ZvaWRcblRlc3RfamF2YV9uZXRfQmluZEV4Y2VwdGlvblxuVGVzdF9qYXZhX25ldF9Db25uZWN0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X0RhdGFncmFtUGFja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0XG5UZXN0X2phdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9JbmV0QWRkcmVzc1xuVGVzdF9qYXZhX25ldF9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsXG5UZXN0X2phdmFfbmV0X1BsYWluU29ja2V0SW1wbFxuVGVzdF9qYXZhX25ldF9Tb2NrZXRcblRlc3RfamF2YV9uZXRfU29ja2V0RXhjZXB0aW9uXG5UZXN0X2phdmFfbmV0X1NvY2tldEltcGxcblRlc3RfamF2YV9uZXRfU29ja2V0SW5wdXRTdHJlYW1cblRlc3RfamF2YV9uZXRfU29ja2V0T3V0cHV0U3RyZWFtXG5UZXN0X2phdmFfbmV0X1Vua25vd25Ib3N0RXhjZXB0aW9uXG5UZXN0X2phdmFfdXRpbF9BcnJheUVudW1lcmF0b3JcblRlc3RfamF2YV91dGlsX0RhdGVcblRlc3RfamF2YV91dGlsX0V2ZW50T2JqZWN0XG5UZXN0X2phdmFfdXRpbF9IYXNoRW51bWVyYXRvclxuVGVzdF9qYXZhX3V0aWxfSGFzaHRhYmxlXG5UZXN0X2phdmFfdXRpbF9Qcm9wZXJ0aWVzXG5UZXN0X2phdmFfdXRpbF9SZXNvdXJjZUJ1bmRsZVxuVGVzdF9qYXZhX3V0aWxfdG1cblRlc3RfamF2YV91dGlsX1ZlY3RvclxuIjsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jUHVzaGJhY2tJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtKQotCQl0cnkgewotCQkJcGlzID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJIZWxsbyIKLQkJCQkJLmdldEJ5dGVzKCkpKTsKLQkJCXBpcy51bnJlYWQoIkhlIi5nZXRCeXRlcygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQ29ycmVjdAotCQkJLy8gUHVzaGJhY2sgYnVmZmVyIHNob3VsZCBiZSBmdWxsCi0JCQlyZXR1cm47CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSNQdXNoYmFja0lucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlB1c2hiYWNrSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwaXMgPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIkhlbGxvIgorICAgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgcGlzLnVucmVhZCgiSGUiLmdldEJ5dGVzKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBDb3JyZWN0CisgICAgICAgICAgICAvLyBQdXNoYmFjayBidWZmZXIgc2hvdWxkIGJlIGZ1bGwKKyAgICAgICAgICAgIHJldHVybjsKIAotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24gb24gdW5yZWFkIHdoZW4gYnVmZmVyIGZ1bGwiKTsKLQl9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiBvbiB1bnJlYWQgd2hlbiBidWZmZXIgZnVsbCIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jUHVzaGJhY2tJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtLCBpbnQpCi0JCXRyeSB7Ci0JCQlwaXMgPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIkhlbGxvIgotCQkJCQkuZ2V0Qnl0ZXMoKSksIDUpOwotCQkJcGlzLnVucmVhZCgiSGVsbG9zIi5nZXRCeXRlcygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQ29ycmVjdAotCQkJLy8gUHVzaGJhY2sgYnVmZmVyIHNob3VsZCBiZSBmdWxsCi0JCQlyZXR1cm47CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSNQdXNoYmFja0lucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0sCisgICAgICogICAgICAgIGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlB1c2hiYWNrSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW1JKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0sIGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBpcyA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiSGVsbG8iCisgICAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKSwgNSk7CisgICAgICAgICAgICBwaXMudW5yZWFkKCJIZWxsb3MiLmdldEJ5dGVzKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBDb3JyZWN0CisgICAgICAgICAgICAvLyBQdXNoYmFjayBidWZmZXIgc2hvdWxkIGJlIGZ1bGwKKyAgICAgICAgICAgIHJldHVybjsKIAotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24gb24gdW5yZWFkIHdoZW4gYnVmZmVyIGZ1bGwiKTsKLQl9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiBvbiB1bnJlYWQgd2hlbiBidWZmZXIgZnVsbCIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIkF2YWlsYWJsZSByZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIiwgcGlzCi0JCQkJCS5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmdldEJ5dGVzKCkubGVuZ3RoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBhdmFpbGFibGUgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSNhdmFpbGFibGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdmFpbGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkF2YWlsYWJsZSByZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIiwgcGlzCisgICAgICAgICAgICAgICAgICAgIC5hdmFpbGFibGUoKSA9PSBmaWxlU3RyaW5nLmdldEJ5dGVzKCkubGVuZ3RoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBhdmFpbGFibGUgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKQotCQlhc3NlcnRUcnVlKCJtYXJrU3VwcG9ydGVkIHJldHVybmVkIHRydWUiLCAhcGlzLm1hcmtTdXBwb3J0ZWQoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jbWFya1N1cHBvcnRlZCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcmtTdXBwb3J0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWFya1N1cHBvcnRlZCByZXR1cm5lZCB0cnVlIiwgIXBpcy5tYXJrU3VwcG9ydGVkKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbS5yZWFkKCkKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBieXRlIHJlYWQiLCBwaXMucmVhZCgpID09IGZpbGVTdHJpbmcKLQkJCQkJLmdldEJ5dGVzKClbMF0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSNyZWFkKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0ucmVhZCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZSByZWFkIiwgcGlzLnJlYWQoKSA9PSBmaWxlU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpWzBdKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0ucmVhZChieXRlIFtdLCBpbnQsCi0JCS8vIGludCkKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDBdOwotCQkJcGlzLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBieXRlcyByZWFkIiwgbmV3IFN0cmluZyhidWYpCi0JCQkJCS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgMTAwKSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0ucmVhZChieXRlIFtdLCBpbnQsCisgICAgICAgIC8vIGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICAgICAgcGlzLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBieXRlcyByZWFkIiwgbmV3IFN0cmluZyhidWYpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgMTAwKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0uc2tpcChsb25nKQotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzUwXTsKLQkJCXBpcy5za2lwKDUwKTsKLQkJCXBpcy5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJhKSBJbmNvcnJlY3QgYnl0ZXMgcmVhZCIsIG5ldyBTdHJpbmcoYnVmKQotCQkJCQkuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDUwLCAxMDApKSk7Ci0JCQlwaXMudW5yZWFkKGJ1Zik7Ci0JCQlwaXMuc2tpcCgyNSk7Ci0JCQlieXRlW10gYnVmMiA9IG5ldyBieXRlWzI1XTsKLQkJCXBpcy5yZWFkKGJ1ZjIsIDAsIGJ1ZjIubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoImIpIEluY29ycmVjdCBieXRlcyByZWFkIiwgbmV3IFN0cmluZyhidWYyKQotCQkJCQkuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDc1LCAxMDApKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jc2tpcChsb25nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJza2lwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcEooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbS5za2lwKGxvbmcpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNTBdOworICAgICAgICAgICAgcGlzLnNraXAoNTApOworICAgICAgICAgICAgcGlzLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImEpIEluY29ycmVjdCBieXRlcyByZWFkIiwgbmV3IFN0cmluZyhidWYpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoNTAsIDEwMCkpKTsKKyAgICAgICAgICAgIHBpcy51bnJlYWQoYnVmKTsKKyAgICAgICAgICAgIHBpcy5za2lwKDI1KTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbMjVdOworICAgICAgICAgICAgcGlzLnJlYWQoYnVmMiwgMCwgYnVmMi5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiYikgSW5jb3JyZWN0IGJ5dGVzIHJlYWQiLCBuZXcgU3RyaW5nKGJ1ZjIpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoNzUsIDEwMCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtI3VucmVhZChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF91bnJlYWQkQigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtLnVucmVhZChieXRlIFtdKQotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMF07Ci0JCQlwaXMucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGVzIHJlYWQiLCBuZXcgU3RyaW5nKGJ1ZikKLQkJCQkJLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygwLCAxMDApKSk7Ci0JCQlwaXMudW5yZWFkKGJ1Zik7Ci0JCQlwaXMucmVhZChidWYsIDAsIDUwKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byB1bnJlYWQgYnl0ZXMiLCBuZXcgU3RyaW5nKGJ1ZiwgMCwgNTApCi0JCQkJCS5lcXVhbHMoZmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgNTApKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB1bnJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbSN1bnJlYWQoYnl0ZVtdKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bnJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3VucmVhZCRCKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0udW5yZWFkKGJ5dGUgW10pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgICAgIHBpcy5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZXMgcmVhZCIsIG5ldyBTdHJpbmcoYnVmKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDEwMCkpKTsKKyAgICAgICAgICAgIHBpcy51bnJlYWQoYnVmKTsKKyAgICAgICAgICAgIHBpcy5yZWFkKGJ1ZiwgMCwgNTApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHVucmVhZCBieXRlcyIsIG5ldyBTdHJpbmcoYnVmLCAwLCA1MCkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygwLCA1MCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHVucmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jdW5yZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF91bnJlYWQkQklJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0udW5yZWFkKGJ5dGUgW10sIGludCwKLQkJLy8gaW50KQotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMF07Ci0JCQlwaXMucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGVzIHJlYWQiLCBuZXcgU3RyaW5nKGJ1ZikKLQkJCQkJLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZygwLCAxMDApKSk7Ci0JCQlwaXMudW5yZWFkKGJ1ZiwgNTAsIDUwKTsKLQkJCXBpcy5yZWFkKGJ1ZiwgMCwgNTApOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHVucmVhZCBieXRlcyIsIG5ldyBTdHJpbmcoYnVmLCAwLCA1MCkKLQkJCQkJLmVxdWFscyhmaWxlU3RyaW5nLnN1YnN0cmluZyg1MCwgMTAwKSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdW5yZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jdW5yZWFkKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVucmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3VucmVhZCRCSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbS51bnJlYWQoYnl0ZSBbXSwgaW50LAorICAgICAgICAvLyBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgICAgIHBpcy5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnl0ZXMgcmVhZCIsIG5ldyBTdHJpbmcoYnVmKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDEwMCkpKTsKKyAgICAgICAgICAgIHBpcy51bnJlYWQoYnVmLCA1MCwgNTApOworICAgICAgICAgICAgcGlzLnJlYWQoYnVmLCAwLCA1MCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gdW5yZWFkIGJ5dGVzIiwgbmV3IFN0cmluZyhidWYsIDAsIDUwKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGZpbGVTdHJpbmcuc3Vic3RyaW5nKDUwLCAxMDApKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyB1bnJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtI3VucmVhZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF91bnJlYWRJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0udW5yZWFkKGludCkKLQkJdHJ5IHsKLQkJCWludCB4OwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGUgcmVhZCIsICh4ID0gcGlzLnJlYWQoKSkgPT0gZmlsZVN0cmluZwotCQkJCQkuZ2V0Qnl0ZXMoKVswXSk7Ci0JCQlwaXMudW5yZWFkKHgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHVucmVhZCIsIHBpcy5yZWFkKCkgPT0geCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0jdW5yZWFkKGludCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5yZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF91bnJlYWRJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW0udW5yZWFkKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ5dGUgcmVhZCIsICh4ID0gcGlzLnJlYWQoKSkgPT0gZmlsZVN0cmluZworICAgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKVswXSk7CisgICAgICAgICAgICBwaXMudW5yZWFkKHgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHVucmVhZCIsIHBpcy5yZWFkKCkgPT0geCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CiAKLQkJcGlzID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZpbGVTdHJpbmcKLQkJCQkuZ2V0Qnl0ZXMoKSksIDY1NTM1KTsKLQl9CisgICAgICAgIHBpcyA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmaWxlU3RyaW5nCisgICAgICAgICAgICAgICAgLmdldEJ5dGVzKCkpLCA2NTUzNSk7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlwaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHRlYXJEb3duIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdGVhckRvd24gOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1B1c2hiYWNrUmVhZGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1B1c2hiYWNrUmVhZGVyVGVzdC5qYXZhCmluZGV4IDJjZTZkZWQuLjhkMWM1NjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9QdXNoYmFja1JlYWRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUHVzaGJhY2tSZWFkZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWx0ZXJSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI0LDM3OCArMjksNTQ0IEBACiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHVzaGJhY2tSZWFkZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFB1c2hiYWNrUmVhZGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlQdXNoYmFja1JlYWRlciBwYnI7CisgICAgUHVzaGJhY2tSZWFkZXIgcGJyOwogCi0JU3RyaW5nIHBiU3RyaW5nID0gIkhlbGxvIFdvcmxkIjsKKyAgICBTdHJpbmcgcGJTdHJpbmcgPSAiSGVsbG8gV29ybGQiOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjUHVzaGJhY2tSZWFkZXIoamF2YS5pby5SZWFkZXIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIoamF2YS5pby5SZWFkZXIpCi0JCXRyeSB7Ci0JCQlwYnIuY2xvc2UoKTsKLQkJCXBiciA9IG5ldyBQdXNoYmFja1JlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHBiU3RyaW5nKSk7Ci0JCQljaGFyIGJ1ZltdID0gbmV3IGNoYXJbNV07Ci0JCQlwYnIucmVhZChidWYsIDAsIDUpOwotCQkJcGJyLnVucmVhZChidWYpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDb3JyZWN0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiQ3JlYXRlZCByZWFkZXIgd2l0aCBidWZmZXIgbGFyZ2VyIHRoYW4gMSIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNQdXNoYmFja1JlYWRlcihqYXZhLmlvLlJlYWRlcikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQdXNoYmFja1JlYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlJlYWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIoamF2YS5pby5SZWFkZXIpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYnIuY2xvc2UoKTsKKyAgICAgICAgICAgIHBiciA9IG5ldyBQdXNoYmFja1JlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHBiU3RyaW5nKSk7CisgICAgICAgICAgICBjaGFyIGJ1ZltdID0gbmV3IGNoYXJbNV07CisgICAgICAgICAgICBwYnIucmVhZChidWYsIDAsIDUpOworICAgICAgICAgICAgcGJyLnVucmVhZChidWYpOworICAgICAgICAgICAgZmFpbCgiQ3JlYXRlZCByZWFkZXIgd2l0aCBidWZmZXIgbGFyZ2VyIHRoYW4gMSIpOzsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBiciA9IG5ldyBQdXNoYmFja1JlYWRlcihudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRVhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI1B1c2hiYWNrUmVhZGVyKGphdmEuaW8uUmVhZGVyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlckkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyKGphdmEuaW8uUmVhZGVyLCBpbnQpCi0JCWFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNQdXNoYmFja1JlYWRlcihqYXZhLmlvLlJlYWRlciwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VlIHNldFVwLiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlB1c2hiYWNrUmVhZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUmVhZGVyLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19SZWFkZXJJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5QdXNoYmFja1JlYWRlcihqYXZhLmlvLlJlYWRlciwgaW50KQorICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3QiLCB0cnVlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QdXNoYmFja1JlYWRlci5jbG9zZSgpCi0JCXRyeSB7Ci0JCQlwYnIuY2xvc2UoKTsKLQkJCXBici5yZWFkKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiByZWFkaW5nIGZyb20gY2xvc2VkIHJlYWRlciIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNjbG9zZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLmNsb3NlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBici5jbG9zZSgpOworICAgICAgICAgICAgcGJyLnJlYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIHJlYWRpbmcgZnJvbSBjbG9zZWQgcmVhZGVyIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjbWFyayhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKLQkJdHJ5IHsKLQkJCXBici5tYXJrKDMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3JyZWN0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgibWFyayBmYWlsZWQgdG8gdGhyb3cgZXhwZWN0ZWQgSU9FeGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjbWFyayhpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXJrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBici5tYXJrKDMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjb3JyZWN0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgibWFyayBmYWlsZWQgdG8gdGhyb3cgZXhwZWN0ZWQgSU9FeGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNtYXJrU3VwcG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X21hcmtTdXBwb3J0ZWQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIubWFya1N1cHBvcnRlZCgpCi0JCWFzc2VydFRydWUoIm1hcmtTdXBwb3J0ZWQgcmV0dXJuZWQgdHJ1ZSIsICFwYnIubWFya1N1cHBvcnRlZCgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjbWFya1N1cHBvcnRlZCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFya1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5QdXNoYmFja1JlYWRlci5tYXJrU3VwcG9ydGVkKCkKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWFya1N1cHBvcnRlZCByZXR1cm5lZCB0cnVlIiwgIXBici5tYXJrU3VwcG9ydGVkKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLnJlYWQoKQotCQl0cnkgewotCQkJY2hhciBjOwotCQkJcGJyLnJlYWQoKTsKLQkJCWMgPSAoY2hhcikgcGJyLnJlYWQoKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNoYXI6ICIgKyBjLCBjID09IHBiU3RyaW5nLmNoYXJBdCgxKSk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IFB1c2hiYWNrUmVhZGVyKG5ldyBDaGFyQXJyYXlSZWFkZXIoCi0JCQkJCW5ldyBjaGFyW10geyAnXHU4NzY1JyB9KSk7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBkb3VibGUgYnl0ZSBjaGFyYWN0ZXIiLCByZWFkZXIucmVhZCgpID09ICdcdTg3NjUnKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjcmVhZCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLnJlYWQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhciBjOworICAgICAgICAgICAgcGJyLnJlYWQoKTsKKyAgICAgICAgICAgIGMgPSAoY2hhcikgcGJyLnJlYWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNoYXI6ICIgKyBjLCBjID09IHBiU3RyaW5nLmNoYXJBdCgxKSk7CisgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IFB1c2hiYWNrUmVhZGVyKG5ldyBDaGFyQXJyYXlSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBjaGFyW10geyAnXHU4NzY1JyB9KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBkb3VibGUgYnl0ZSBjaGFyYWN0ZXIiLCByZWFkZXIucmVhZCgpID09ICdcdTg3NjUnKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLnJlYWQoY2hhciBbXSwgaW50LCBpbnQpCi0JCXRyeSB7Ci0JCQljaGFyW10gYyA9IG5ldyBjaGFyWzVdOwotCQkJcGJyLnJlYWQoYywgMCwgNSk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjaGFycyIsIG5ldyBTdHJpbmcoYykuZXF1YWxzKHBiU3RyaW5nCi0JCQkJCS5zdWJzdHJpbmcoMCwgNSkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjcmVhZChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kQ0lJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXBiciA9IG5ldyBQdXNoYmFja1JlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHBiU3RyaW5nKSwgMTApOwotCQkKLQkJY2hhcltdIG51bGxDaGFyQXJyYXkgPSBudWxsOwotCQljaGFyW10gY2hhckFycmF5ID0gbmV3IGNoYXJbMTBdOwotCQkKLQkJdHJ5IHsKLQkJCXBici5yZWFkKG51bGxDaGFyQXJyYXksIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlwYnIucmVhZChudWxsQ2hhckFycmF5LCAxLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJcGJyLnJlYWQoY2hhckFycmF5LCAtMSwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjcmVhZChjaGFyW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJENJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLnJlYWQoY2hhciBbXSwgaW50LCBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyWzVdOworICAgICAgICAgICAgcGJyLnJlYWQoYywgMCwgNSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVhZCBjaGFycyIsIG5ldyBTdHJpbmcoYykuZXF1YWxzKHBiU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgNSkpKTsKIAotCQlwYnIucmVhZChjaGFyQXJyYXksIDAsIDApOwotICAgICAgICBwYnIucmVhZChjaGFyQXJyYXksIDAsIGNoYXJBcnJheS5sZW5ndGgpOwotCQlwYnIucmVhZChjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGgsIDApOwotCQkKLQkJdHJ5IHsKLQkJCXBici5yZWFkKGNoYXJBcnJheSwgY2hhckFycmF5Lmxlbmd0aCArIDEsIDApOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlwYnIucmVhZChjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggKyAxLCAxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcGJyLnJlYWQoYywgMCwgMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGMubGVuZ3RoLCBwYnIucmVhZChjLCAwLCBjLmxlbmd0aCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBici5yZWFkKGMsIGMubGVuZ3RoLCAwKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3JlYWQoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkXyRDSUlfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcGJyID0gbmV3IFB1c2hiYWNrUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIocGJTdHJpbmcpLCAxMCk7CisgICAgICAgIAorICAgICAgICBjaGFyW10gbnVsbENoYXJBcnJheSA9IG51bGw7CisgICAgICAgIGNoYXJbXSBjaGFyQXJyYXkgPSBuZXcgY2hhclsxMF07CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGJyLnJlYWQobnVsbENoYXJBcnJheSwgMCwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBici5yZWFkKGNoYXJBcnJheSwgMCwgLTEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGJyLnJlYWQoY2hhckFycmF5LCAtMSwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYnIucmVhZChjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggKyAxLCAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBici5yZWFkKGNoYXJBcnJheSwgY2hhckFycmF5Lmxlbmd0aCwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYnIucmVhZChjaGFyQXJyYXksIDEsIGNoYXJBcnJheS5sZW5ndGgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGJyLnJlYWQoY2hhckFycmF5LCAwLCBjaGFyQXJyYXkubGVuZ3RoICsgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQlwYnIuY2xvc2UoKTsKKyAgICAgICAgcGJyLmNsb3NlKCk7CiAKLQkJdHJ5IHsKLQkJCXBici5yZWFkKG51bGxDaGFyQXJyYXksIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGJyLnJlYWQoY2hhckFycmF5LCAwLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQogCi0JCXRyeSB7Ci0JCQlwYnIucmVhZChjaGFyQXJyYXksIC0xLCAtMSk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNyZWFkeSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWR5KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLnJlYWR5KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYXJbXSBjID0gbmV3IGNoYXJbMTFdOworICAgICAgICAgICAgaWYgKGMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICA7Ly8gdXNlIGMgdG8gYXZvaWQgd2FybmluZyBtc2cKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlYWR5IHN0cmVhbSByZXR1cm5lZCBmYWxzZSB0byByZWFkeSgpIiwgcGJyLnJlYWR5KCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZHkoKSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWR5KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLnJlYWR5KCkKLQkJdHJ5IHsKLQkJCWNoYXJbXSBjID0gbmV3IGNoYXJbMTFdOwotCQkJaWYgKGMubGVuZ3RoID4gMCkKLQkJCQk7Ly8gdXNlIGMgdG8gYXZvaWQgd2FybmluZyBtc2cKLQkJCWFzc2VydFRydWUoIlJlYWR5IHN0cmVhbSByZXR1cm5lZCBmYWxzZSB0byByZWFkeSgpIiwgcGJyLnJlYWR5KCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZHkoKSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciNyZXNldCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGJyLnJlc2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGNvcnJlY3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJtYXJrIGZhaWxlZCB0byB0aHJvdyBleHBlY3RlZCBJT0V4Y2VwdGlvbiIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewotCQl0cnkgewotCQkJcGJyLnJlc2V0KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvcnJlY3QKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJtYXJrIGZhaWxlZCB0byB0aHJvdyBleHBlY3RlZCBJT0V4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciN1bnJlYWQoY2hhcltdKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVucmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5yZWFkJEMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIudW5yZWFkKGNoYXIgW10pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyWzVdOworICAgICAgICAgICAgcGJyLnJlYWQoYywgMCwgNSk7CisgICAgICAgICAgICBwYnIudW5yZWFkKGMpOworICAgICAgICAgICAgcGJyLnJlYWQoYywgMCwgNSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gdW5yZWFkIGNoYXJzIiwgbmV3IFN0cmluZyhjKS5lcXVhbHMocGJTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCA1KSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChjaGFyW10pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF91bnJlYWQkQygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QdXNoYmFja1JlYWRlci51bnJlYWQoY2hhciBbXSkKLQkJdHJ5IHsKLQkJCWNoYXJbXSBjID0gbmV3IGNoYXJbNV07Ci0JCQlwYnIucmVhZChjLCAwLCA1KTsKLQkJCXBici51bnJlYWQoYyk7Ci0JCQlwYnIucmVhZChjLCAwLCA1KTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byB1bnJlYWQgY2hhcnMiLCBuZXcgU3RyaW5nKGMpLmVxdWFscyhwYlN0cmluZwotCQkJCQkuc3Vic3RyaW5nKDAsIDUpKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3NraXAobG9uZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJza2lwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcCRKKCkgeworICAgICAgICBjaGFyIGNoYXJzW10gPSBuZXcgY2hhcltdIHsgJ2gnLCAnZScsICdsJywgJ2wnLCAnbycgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIFJlYWRlciByZWFkZXIsIHJlYWRlcjI7CisgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoY2hhcnMpKTsKKyAgICAgICAgICAgICAgICByZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihuZXcgU3RyaW5nKGNoYXJzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEZpbHRlclJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoY2hhcnMpKSkgeworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVhZGVyMiA9IG5ldyBGaWx0ZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihuZXcgU3RyaW5nKGNoYXJzKSkpIHsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJzKTsKKyAgICAgICAgICAgICAgICByZWFkZXIyID0gbmV3IENoYXJBcnJheVJlYWRlcihjaGFycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQdXNoYmFja1JlYWRlciBwUmVhZGVyID0gbmV3IFB1c2hiYWNrUmVhZGVyKHJlYWRlciwgMik7CisgICAgICAgICAgICBQdXNoYmFja1JlYWRlciBwUmVhZGVyMiA9IG5ldyBQdXNoYmFja1JlYWRlcihyZWFkZXIyLCAyKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2tpcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgbG9uZyBudW1Ta2lwcGVkID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbnVtU2tpcHBlZCA9IHBSZWFkZXIyLnNraXAoMyk7CisgICAgICAgICAgICAgICAgcFJlYWRlcjIudW5yZWFkKCdhJyk7CisgICAgICAgICAgICAgICAgcFJlYWRlcjIudW5yZWFkKCdiJyk7CisgICAgICAgICAgICAgICAgbnVtU2tpcHBlZCArPSBwUmVhZGVyMi5za2lwKDEwKTsKKyAgICAgICAgICAgICAgICBudW1Ta2lwcGVkICs9IHBSZWFkZXIyLnNraXAoMTApOworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlcjIuc2tpcCgxMCk7CisgICAgICAgICAgICAgICAgbnVtU2tpcHBlZCArPSBwUmVhZGVyMi5za2lwKDEwKTsKKyAgICAgICAgICAgICAgICBudW1Ta2lwcGVkICs9IHBSZWFkZXIyLnNraXAoMTApOworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlcjIuc2tpcCgxMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEaWQgbm90IHNraXAgY29ycmVjdCBudW1iZXIgb2YgY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICA3LCBudW1Ta2lwcGVkKTsKKyAgICAgICAgICAgICAgICBudW1Ta2lwcGVkID0gMDsKKyAgICAgICAgICAgICAgICBudW1Ta2lwcGVkICs9IHBSZWFkZXIuc2tpcCgyKTsKKyAgICAgICAgICAgICAgICBwUmVhZGVyLnVucmVhZCgnaScpOworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDIpOworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDApOworICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKC0xKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gdGhyb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gc2tpcCBjaGFyYWN0ZXJzIiArIGUsIHNraXBwZWQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBza2lwIGNoYXJhY3RlcnMiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDEpOworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDEpOworICAgICAgICAgICAgICAgIG51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDEpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNraXAgYWxsIGNoYXJhY3RlcnMiLCA2LCBudW1Ta2lwcGVkKTsKKyAgICAgICAgICAgICAgICBsb25nIG5leHRTa2lwcGVkID0gcFJlYWRlci5za2lwKDEpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygic2tpcHBlZCBlbXB0eSByZWFkZXIiLCAwLCBuZXh0U2tpcHBlZCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIHNraXAgbW9yZSBjaGFyYWN0ZXJzIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIjc2tpcChsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2tpcCRKKCkgewotCQljaGFyIGNoYXJzW10gPSBuZXcgY2hhcltdIHsgJ2gnLCAnZScsICdsJywgJ2wnLCAnbycgfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCVJlYWRlciByZWFkZXIsIHJlYWRlcjI7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoY2hhcnMpKTsKLQkJCQlyZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihuZXcgU3RyaW5nKGNoYXJzKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJcmVhZGVyID0gbmV3IEZpbHRlclJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoY2hhcnMpKSkgewotCQkJCX07Ci0JCQkJcmVhZGVyMiA9IG5ldyBGaWx0ZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihuZXcgU3RyaW5nKGNoYXJzKSkpIHsKLQkJCQl9OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJzKTsKLQkJCQlyZWFkZXIyID0gbmV3IENoYXJBcnJheVJlYWRlcihjaGFycyk7Ci0JCQl9Ci0JCQlQdXNoYmFja1JlYWRlciBwUmVhZGVyID0gbmV3IFB1c2hiYWNrUmVhZGVyKHJlYWRlciwgMik7Ci0JCQlQdXNoYmFja1JlYWRlciBwUmVhZGVyMiA9IG5ldyBQdXNoYmFja1JlYWRlcihyZWFkZXIyLCAyKTsKLQkJCWJvb2xlYW4gc2tpcHBlZCA9IGZhbHNlOwotCQkJbG9uZyBudW1Ta2lwcGVkID0gMDsKLQkJCXRyeSB7Ci0JCQkJbnVtU2tpcHBlZCA9IHBSZWFkZXIyLnNraXAoMyk7Ci0JCQkJcFJlYWRlcjIudW5yZWFkKCdhJyk7Ci0JCQkJcFJlYWRlcjIudW5yZWFkKCdiJyk7Ci0JCQkJbnVtU2tpcHBlZCArPSBwUmVhZGVyMi5za2lwKDEwKTsKLQkJCQludW1Ta2lwcGVkICs9IHBSZWFkZXIyLnNraXAoMTApOwotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlcjIuc2tpcCgxMCk7Ci0JCQkJbnVtU2tpcHBlZCArPSBwUmVhZGVyMi5za2lwKDEwKTsKLQkJCQludW1Ta2lwcGVkICs9IHBSZWFkZXIyLnNraXAoMTApOwotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlcjIuc2tpcCgxMCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJEaWQgbm90IHNraXAgY29ycmVjdCBudW1iZXIgb2YgY2hhcmFjdGVycyIsCi0JCQkJCQk3LCBudW1Ta2lwcGVkKTsKLQkJCQludW1Ta2lwcGVkID0gMDsKLQkJCQludW1Ta2lwcGVkICs9IHBSZWFkZXIuc2tpcCgyKTsKLQkJCQlwUmVhZGVyLnVucmVhZCgnaScpOwotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDIpOwotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDApOwotCQkJCXNraXBwZWQgPSB0cnVlOwotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKC0xKTsKLQkJCQlmYWlsKCJGYWlsZWQgdG8gdGhyb3cgIgotCQkJCQkJKyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gc2tpcCBjaGFyYWN0ZXJzIiArIGUsIHNraXBwZWQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byBza2lwIGNoYXJhY3RlcnMiICsgZSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDEpOwotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDEpOwotCQkJCW51bVNraXBwZWQgKz0gcFJlYWRlci5za2lwKDEpOwotCQkJCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNraXAgYWxsIGNoYXJhY3RlcnMiLCA2LCBudW1Ta2lwcGVkKTsKLQkJCQlsb25nIG5leHRTa2lwcGVkID0gcFJlYWRlci5za2lwKDEpOwotCQkJCWFzc2VydEVxdWFscygic2tpcHBlZCBlbXB0eSByZWFkZXIiLCAwLCBuZXh0U2tpcHBlZCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRmFpbGVkIHRvIHNraXAgbW9yZSBjaGFyYWN0ZXJzIiArIGUpOwotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChjaGFyW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVucmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3VucmVhZCRDSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIudW5yZWFkKGNoYXIgW10sIGludCwgaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhcltdIGMgPSBuZXcgY2hhcls1XTsKKyAgICAgICAgICAgIHBici5yZWFkKGMsIDAsIDUpOworICAgICAgICAgICAgcGJyLnVucmVhZChjLCAwLCAyKTsKKyAgICAgICAgICAgIHBici5yZWFkKGMsIDAsIDUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHVucmVhZCBjaGFycyIsIG5ldyBTdHJpbmcoYykuZXF1YWxzKHBiU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMikKKyAgICAgICAgICAgICAgICAgICAgKyBwYlN0cmluZy5zdWJzdHJpbmcoNSwgOCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHVucmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdW5yZWFkJENJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QdXNoYmFja1JlYWRlci51bnJlYWQoY2hhciBbXSwgaW50LCBpbnQpCi0JCXRyeSB7Ci0JCQljaGFyW10gYyA9IG5ldyBjaGFyWzVdOwotCQkJcGJyLnJlYWQoYywgMCwgNSk7Ci0JCQlwYnIudW5yZWFkKGMsIDAsIDIpOwotCQkJcGJyLnJlYWQoYywgMCwgNSk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gdW5yZWFkIGNoYXJzIiwgbmV3IFN0cmluZyhjKS5lcXVhbHMocGJTdHJpbmcKLQkJCQkJLnN1YnN0cmluZygwLCAyKQotCQkJCQkrIHBiU3RyaW5nLnN1YnN0cmluZyg1LCA4KSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgdW5yZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChjaGFyW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bnJlYWQiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF91bnJlYWRfJENJSV9OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vYSBwdXNoYmFjayByZWFkZXIgd2l0aCBvbmUgY2hhcmFjdGVyIGJ1ZmZlcgorICAgICAgICBwYnIgPSBuZXcgUHVzaGJhY2tSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihwYlN0cmluZykpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBici51bnJlYWQobnVsbCwgMCwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciN1bnJlYWQoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5yZWFkIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICApCisgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5yZWFkXyRDSUlfRXhjZXB0aW9uX0luc3VmZmljaWVudEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vYSBwdXNoYmFjayByZWFkZXIgd2l0aCBvbmUgY2hhcmFjdGVyIGJ1ZmZlcgorICAgICAgICBwYnIgPSBuZXcgUHVzaGJhY2tSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihwYlN0cmluZykpOworICAgICAgICAKKyAgICAgICAgLy9pZiBjb3VudCA+IGJ1ZmZlcidzIHNpemUgLCBzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBici51bnJlYWQobmV3IGNoYXJbcGJTdHJpbmcubGVuZ3RoKCldLCAwLCAyKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChjaGFyW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bnJlYWQiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF91bnJlYWRfJENJSV9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL2EgcHVzaGJhY2sgcmVhZGVyIHdpdGggb25lIGNoYXJhY3RlciBidWZmZXIKKyAgICAgICAgcGJyID0gbmV3IFB1c2hiYWNrUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIocGJTdHJpbmcpKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYnIudW5yZWFkKG5ldyBjaGFyW3BiU3RyaW5nLmxlbmd0aCgpXSwgLTEgLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5yZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF91bnJlYWRJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyLnVucmVhZChpbnQpCiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciN1bnJlYWQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3VucmVhZF8kQ0lJX051bGxQb2ludGVyRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy9hIHB1c2hiYWNrIHJlYWRlciB3aXRoIG9uZSBjaGFyYWN0ZXIgYnVmZmVyCi0JCXBiciA9IG5ldyBQdXNoYmFja1JlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHBiU3RyaW5nKSk7Ci0JCQotCQl0cnkgewotCQkJcGJyLnVucmVhZChudWxsLCAwLCAxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdW5yZWFkXyRDSUlfRXhjZXB0aW9uX0luc3VmZmljaWVudEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vYSBwdXNoYmFjayByZWFkZXIgd2l0aCBvbmUgY2hhcmFjdGVyIGJ1ZmZlcgotCQlwYnIgPSBuZXcgUHVzaGJhY2tSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihwYlN0cmluZykpOwotCQkKLQkJLy9pZiBjb3VudCA+IGJ1ZmZlcidzIHNpemUgLCBzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24KLQkJdHJ5IHsKLQkJCXBici51bnJlYWQobmV3IGNoYXJbcGJTdHJpbmcubGVuZ3RoKCldLCAwLCAyKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyI3VucmVhZChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdW5yZWFkXyRDSUlfQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy9hIHB1c2hiYWNrIHJlYWRlciB3aXRoIG9uZSBjaGFyYWN0ZXIgYnVmZmVyCi0JCXBiciA9IG5ldyBQdXNoYmFja1JlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHBiU3RyaW5nKSk7Ci0JCQotCQl0cnkgewotCQkJcGJyLnVucmVhZChuZXcgY2hhcltwYlN0cmluZy5sZW5ndGgoKV0sIC0xICwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QdXNoYmFja1JlYWRlciN1bnJlYWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdW5yZWFkSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5QdXNoYmFja1JlYWRlci51bnJlYWQoaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICBwYnIucmVhZCgpOworICAgICAgICAgICAgYyA9IHBici5yZWFkKCk7CisgICAgICAgICAgICBwYnIudW5yZWFkKGMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHVucmVhZCBjaGFyIiwgcGJyLnJlYWQoKSA9PSBjKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHVucmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCQl0cnkgewotCQkJaW50IGM7Ci0JCQlwYnIucmVhZCgpOwotCQkJYyA9IHBici5yZWFkKCk7Ci0JCQlwYnIudW5yZWFkKGMpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHVucmVhZCBjaGFyIiwgcGJyLnJlYWQoKSA9PSBjKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHVucmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcGJyID0gbmV3IFB1c2hiYWNrUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIocGJTdHJpbmcpLCAxMCk7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCXBiciA9IG5ldyBQdXNoYmFja1JlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHBiU3RyaW5nKSwgMTApOwotCX0KLQotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCQl0cnkgewotCQkJcGJyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBici5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vUmFuZG9tQWNjZXNzRmlsZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhCmluZGV4IDc5Mzc4MTkuLjY0OWE5MzEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKQEAgLTI3LDYgKzMyLDcgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Ob25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUmFuZG9tQWNjZXNzRmlsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUmFuZG9tQWNjZXNzRmlsZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHVibGljIFN0cmluZyBmaWxlTmFtZTsKQEAgLTQ3LDYgKzUzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNSYW5kb21BY2Nlc3NGaWxlKGphdmEuaW8uRmlsZSwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJhbmRvbUFjY2Vzc0ZpbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZUxqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGphdmEuaW8uRmlsZSwKQEAgLTYyLDYgKzc3LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNSYW5kb21BY2Nlc3NGaWxlKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSYW5kb21BY2Nlc3NGaWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoamF2YS5sYW5nLlN0cmluZywKQEAgLTc0LDYgKzk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNjbG9zZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUuY2xvc2UoKQogICAgICAgICB0cnkgewpAQCAtODcsNiArMTIwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNnZXRGRCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RkQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEZEKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uRmlsZURlc2NyaXB0b3IKICAgICAgICAgLy8gamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLmdldEZEKCkKQEAgLTEwMSw2ICsxNDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI2dldEZpbGVQb2ludGVyKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaWxlUG9pbnRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZVBvaW50ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUuZ2V0RmlsZVBvaW50ZXIoKQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtMTEyLDYgKzE2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjbGVuZ3RoKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xlbmd0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS5sZW5ndGgoKQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtMTIzLDYgKzE4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLnJlYWQoKQogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwpAQCAtMTM3LDYgKzIwNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZChieXRlW10pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUucmVhZChieXRlIFtdKQogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwpAQCAtMTU0LDYgKzIzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZChieXRlW10sIGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLnJlYWQoYnl0ZSBbXSwgaW50LCBpbnQpCiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CkBAIC0xNjksNiArMjU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNyZWFkQm9vbGVhbigpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFT0ZFeGNlcHRpb24gJiBJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZEJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLnJlYWRCb29sZWFuKCkKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKQEAgLTE4MSw2ICsyNzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3JlYWRCeXRlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkVPRkV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkQnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUucmVhZEJ5dGUoKQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtMTkzLDYgKzI5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZENoYXIoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRU9GRXhjZXB0aW9uICYgSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBjaGFyIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS5yZWFkQ2hhcigpCiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CkBAIC0yMDUsNiArMzE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNyZWFkRG91YmxlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkVPRkV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkRG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUucmVhZERvdWJsZSgpCiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CkBAIC0yMTgsNiArMzQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNyZWFkRmxvYXQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRU9GRXhjZXB0aW9uICYgSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS5yZWFkRmxvYXQoKQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtMjMxLDYgKzM2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZEZ1bGx5KGJ5dGVbXSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkVPRkV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkRnVsbHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRGdWxseSRCKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLnJlYWRGdWxseShieXRlIFtdKQogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTBdOwpAQCAtMjQ2LDYgKzM4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZEZ1bGx5KGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFT0ZFeGNlcHRpb24gJiBJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZEZ1bGx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZEZ1bGx5JEJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS5yZWFkRnVsbHkoYnl0ZSBbXSwgaW50LAogICAgICAgICAvLyBpbnQpCkBAIC0yNjUsNiArNDE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNyZWFkSW50KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkVPRkV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkSW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUucmVhZEludCgpCiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CkBAIC0yNzgsNiArNDM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNyZWFkTGluZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZExpbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLnJlYWRMaW5lKCkKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKQEAgLTI5Myw2ICs0NjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3JlYWRMb25nKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkVPRkV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkTG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUucmVhZExvbmcoKQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtMzA2LDYgKzQ4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZFNob3J0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkVPRkV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkU2hvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBzaG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUucmVhZFNob3J0KCkKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKQEAgLTMxOSw2ICs1MDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3JlYWRVbnNpZ25lZEJ5dGUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRU9GRXhjZXB0aW9uICYgSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRVbnNpZ25lZEJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS5yZWFkVW5zaWduZWRCeXRlKCkKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKQEAgLTMzMSw2ICs1MjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3JlYWRVbnNpZ25lZFNob3J0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkVPRkV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkVW5zaWduZWRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZFVuc2lnbmVkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS5yZWFkVW5zaWduZWRTaG9ydCgpCiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CkBAIC0zNDQsNiArNTQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNyZWFkVVRGKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRVVEYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRVVEYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUucmVhZFVURigpCiAKQEAgLTM1Nyw2ICs1NzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3NlZWsobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZWVrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2Vla0ooKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUuc2Vlayhsb25nKQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtMzY4LDYgKzU5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjc2tpcEJ5dGVzKGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJza2lwQnl0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBCeXRlc0koKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS5za2lwQnl0ZXMoaW50KQogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNV07CkBAIC0zODMsMTYgKzYxNCwyNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjd3JpdGUoYnl0ZVtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlKGJ5dGUgW10pCiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CiAgICAgICAgIAogICAgICAgICBieXRlW10gbnVsbEJ5dGVBcnJheSA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgIAlyYWYud3JpdGUobnVsbEJ5dGVBcnJheSk7Ci0gICAgICAgIAlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIHJhZi53cml0ZShudWxsQnl0ZUFycmF5KTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkvL2V4cGVjdGVkCisgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0gICAKICAgICAgICAgCiAgICAgICAgIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNDAwMF07CkBAIC00MDAsMjAgKzY0MCwyMCBAQAogICAgICAgICByYWYuY2xvc2UoKTsKICAgICAgICAgCiAgICAgICAgIHRyeSB7Ci0gICAgICAgIAlyYWYud3JpdGUobnVsbEJ5dGVBcnJheSk7Ci0gICAgICAgIAlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIHJhZi53cml0ZShudWxsQnl0ZUFycmF5KTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkvL2V4cGVjdGVkCisgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0gIAogICAgICAgICAKICAgICAgICAgLy93aWxsIG5vdCB0aHJvdyBJT0V4Y2VwdGlvbiBpZiBhcnJheSdzIGxlbmd0aCBpcyAwCiAgICAgICAgIHJhZi53cml0ZShuZXcgYnl0ZVswXSk7CiAgICAgICAgIAogICAgICAgICB0cnkgewotICAgICAgICAJcmFmLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIAlmYWlsKCJzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24iKTsKKyAgICAgICAgICAgIHJhZi53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCS8vZXhwZWN0ZWQKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKICAgICAgICAgfSAgCiAgICAgICAgIAogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKQEAgLTQyNSw2ICs2NjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUud3JpdGUoYnl0ZSBbXSwgaW50LAogICAgICAgICAvLyBpbnQpCkBAIC00NDEsMTQ2ICs2OTAsMTY0IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSN3cml0ZShieXRlW10sIGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZV8kQklJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgCXJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZiwgInJ3Iik7Ci0JCWJ5dGVbXSBudWxsQnl0ZUFycmF5ID0gbnVsbDsKLQkJYnl0ZVtdIGJ5dGVBcnJheSA9IG5ldyBieXRlWzEwXTsKLQkJCi0JCXRyeSB7Ci0JCQlyYWYud3JpdGUobnVsbEJ5dGVBcnJheSwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZiwgInJ3Iik7CisgICAgICAgIGJ5dGVbXSBudWxsQnl0ZUFycmF5ID0gbnVsbDsKKyAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUobnVsbEJ5dGVBcnJheSwgLTEsIC0xKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCXJhZi53cml0ZShudWxsQnl0ZUFycmF5LCAwLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJcmFmLndyaXRlKG51bGxCeXRlQXJyYXksIDEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUobnVsbEJ5dGVBcnJheSwgMCwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhZi53cml0ZShudWxsQnl0ZUFycmF5LCAxLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlyYWYud3JpdGUobnVsbEJ5dGVBcnJheSwgMSwgMCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJhZi53cml0ZShudWxsQnl0ZUFycmF5LCAxLCAxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJcmFmLndyaXRlKGJ5dGVBcnJheSwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmFmLndyaXRlKG51bGxCeXRlQXJyYXksIDEsIDApOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUobnVsbEJ5dGVBcnJheSwgMSwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIC0xLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJcmFmLndyaXRlKGJ5dGVBcnJheSwgLTEsIDApOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJcmFmLndyaXRlKGJ5dGVBcnJheSwgLTEsIDEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCAtMSwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCAtMSwgMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJcmFmLndyaXRlKGJ5dGVBcnJheSwgMCwgLTEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCAwLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCQlyYWYud3JpdGUoYnl0ZUFycmF5LCAwLCAwKTsKKyAgICAgICAgcmFmLndyaXRlKGJ5dGVBcnJheSwgMCwgMCk7CiAgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5sZW5ndGgpOwotCQlyYWYud3JpdGUoYnl0ZUFycmF5LCAxLCAwKTsKKyAgICAgICAgcmFmLndyaXRlKGJ5dGVBcnJheSwgMSwgMCk7CiAgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIGJ5dGVBcnJheS5sZW5ndGgsIDApOwotCQkKLQkJdHJ5IHsKLQkJCXJhZi53cml0ZShieXRlQXJyYXksIGJ5dGVBcnJheS5sZW5ndGggKyAxLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJcmFmLndyaXRlKGJ5dGVBcnJheSwgYnl0ZUFycmF5Lmxlbmd0aCArIDEsIDEpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCBieXRlQXJyYXkubGVuZ3RoICsgMSwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIGJ5dGVBcnJheS5sZW5ndGggKyAxLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CiAKLQkJcmFmLmNsb3NlKCk7CisgICAgICAgIHJhZi5jbG9zZSgpOwogCi0JCXRyeSB7Ci0JCQlyYWYud3JpdGUobnVsbEJ5dGVBcnJheSwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQl0cnkgewotCQkJcmFmLndyaXRlKGJ5dGVBcnJheSwgLTEsIC0xKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIDAsIDEpOwotCSAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5sZW5ndGgpOwotCSAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJhZi53cml0ZShieXRlQXJyYXksIDEsIDEpOwotCSAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElPRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJhZi53cml0ZShieXRlQXJyYXksIGJ5dGVBcnJheS5sZW5ndGggKyAxLCAwKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCQotCQkvLyB3aWxsIG5vdCB0aHJvdyBJT0V4Y2VwdGlvbiBpZiBjb3VudCA9IDAKLQkJcmFmLndyaXRlKGJ5dGVBcnJheSwgMCwgMCk7Ci0JCXJhZi53cml0ZShieXRlQXJyYXksIGJ5dGVBcnJheS5sZW5ndGgsIDApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmFmLndyaXRlKG51bGxCeXRlQXJyYXksIC0xLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIC0xLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCAwLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCAwLCBieXRlQXJyYXkubGVuZ3RoKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCAxLCAxKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCBieXRlQXJyYXkubGVuZ3RoICsgMSwgMCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gd2lsbCBub3QgdGhyb3cgSU9FeGNlcHRpb24gaWYgY291bnQgPSAwCisgICAgICAgIHJhZi53cml0ZShieXRlQXJyYXksIDAsIDApOworICAgICAgICByYWYud3JpdGUoYnl0ZUFycmF5LCBieXRlQXJyYXkubGVuZ3RoLCAwKTsKICAgICB9CiAgICAgCiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlKGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlKGludCkKICAgICAgICAgYnl0ZVtdIHJidWYgPSBuZXcgYnl0ZVs0MDAwXTsKQEAgLTU5NSw2ICs4NjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlQm9vbGVhbihib29sZWFuKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlQm9vbGVhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlQm9vbGVhblooKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUud3JpdGVCb29sZWFuKGJvb2xlYW4pCiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CkBAIC02MDcsNiArODgzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSN3cml0ZUJ5dGUoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlQnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVCeXRlSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS53cml0ZUJ5dGUoaW50KQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtNjE5LDYgKzkwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjd3JpdGVCeXRlcyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlQnl0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUJ5dGVzTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUud3JpdGVCeXRlcyhqYXZhLmxhbmcuU3RyaW5nKQpAQCAtNjM2LDYgKzkzMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjd3JpdGVDaGFyKGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZUNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlQ2hhckkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUud3JpdGVDaGFyKGludCkKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKQEAgLTY0OCw2ICs5NTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlQ2hhcnMoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZUNoYXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVDaGFyc0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlQ2hhcnMoamF2YS5sYW5nLlN0cmluZykKQEAgLTY2NCw2ICs5NzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlRG91YmxlKGRvdWJsZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZURvdWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVEb3VibGVEKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlRG91YmxlKGRvdWJsZSkKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKQEAgLTY3Nyw2ICs5OTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlRmxvYXQoZmxvYXQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGVGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUZsb2F0RigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZS53cml0ZUZsb2F0KGZsb2F0KQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtNjkwLDYgKzEwMjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlSW50KGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZUludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJbnRJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlSW50KGludCkKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKQEAgLTcwMyw2ICsxMDQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSN3cml0ZUxvbmcobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZUxvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUxvbmdKKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlTG9uZyhsb25nKQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtNzE2LDYgKzEwNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlU2hvcnQoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlU2hvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlU2hvcnRJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlU2hvcnQoaW50KQogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwpAQCAtNzI5LDYgKzEwODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3dyaXRlVVRGKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGVVVEYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZVVURkxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlLndyaXRlVVRGKGphdmEubGFuZy5TdHJpbmcpCkBAIC03NDQsNiArMTExMCwxNSBAQAogICAgICAqIAogICAgICAqIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzc0CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgZXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VlayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlZWtJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAicnciKTsKICAgICAgICAgdHJ5IHsKQEAgLTc1OCw2ICsxMTMzLDE1IEBACiAgICAgICogCiAgICAgICogUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0zNzcKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24uIENoZWNrcyBleGNlcHRpb25zLCBJT0V4Y2VwdGlvbiBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRCSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUoZmlsZU5hbWUsICJydyIpOwogICAgICAgICB0cnkgewpAQCAtNzk2LDYgKzExODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3JlYWQoYnl0ZVtdLGludCxpbnQpIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kQklJX0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwogICAgICAgICBmb3Mud3JpdGUoZmlsZVN0cmluZy5nZXRCeXRlcygpLCAwLCBmaWxlU3RyaW5nLmxlbmd0aCgpKTsKQEAgLTgxNSw2ICsxMjA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSNyZWFkKGJ5dGVbXSxpbnQsaW50KSAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4gUHJvYmFibHkgcGxhbm5lZCBmb3IgSU9FeGNlcHRpb24gdGVzdGluZy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kQklJX0lPRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKICAgICAgICAgZm9zLndyaXRlKGZpbGVTdHJpbmcuZ2V0Qnl0ZXMoKSwgMCwgZmlsZVN0cmluZy5sZW5ndGgoKSk7CkBAIC04MzAsNiArMTIzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUjcmVhZChieXRlW10pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIFByb2JhYmx5IHBsYW5uZWQgZm9yIElPRXhjZXB0aW9uIHRlc3RpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kQl9JT0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7CiAgICAgICAgIGZvcy53cml0ZShmaWxlU3RyaW5nLmdldEJ5dGVzKCksIDAsIGZpbGVTdHJpbmcubGVuZ3RoKCkpOwpAQCAtODQ1LDYgKzEyNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlI3JlYWQoYnl0ZVtdLGludCxpbnQpIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIE51bGxQb2ludGVyRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJEJJSV9OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwKICAgICAgICAgICAgICAgICAidG1wIiksICJyIik7CkBAIC04NjIsNiArMTI4MiwxNSBAQAogICAgICAqIAogICAgICAqIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzc3CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZShmaWxlTmFtZSwgInJ3Iik7CiAgICAgICAgIHRyeSB7CkBAIC04OTksNiArMTMyOCwxNSBAQAogICAgIC8qKgogICAgICAqIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNjkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gQ2hlY2tzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSYW5kb21BY2Nlc3NGaWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5kb21BY2Nlc3NGaWxlX1N0cmluZ19TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmLmNyZWF0ZU5ld0ZpbGUoKTsKICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAiciIpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcXVlbmNlSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VxdWVuY2VJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA5Yzc5NjUzLi5mM2NmYmE3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VxdWVuY2VJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VxdWVuY2VJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTcsMTc1ICsxNywyNDUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAorCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhTZXF1ZW5jZUlucHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTZXF1ZW5jZUlucHV0U3RyZWFtVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlTZXF1ZW5jZUlucHV0U3RyZWFtIHNpOworICAgIFNlcXVlbmNlSW5wdXRTdHJlYW0gc2k7CiAKLQlTdHJpbmcgczEgPSAiSGVsbG8iOworICAgIFN0cmluZyBzMSA9ICJIZWxsbyI7CiAKLQlTdHJpbmcgczIgPSAiV29ybGQiOworICAgIFN0cmluZyBzMiA9ICJXb3JsZCI7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtI1NlcXVlbmNlSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW1MamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtLAotCQkvLyBqYXZhLmlvLklucHV0U3RyZWFtKQotCQkvLyBVc2VkIGluIHRlc3RzCi0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBTZXF1ZW5jZUlucHV0U3RyZWFtI1NlcXVlbmNlSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX0xJbnB1dFN0cmVhbUxJbnB1dFN0cmVhbV9OdWxsKCkgewkJCi0JCXRyeSB7Ci0JCQlzaSA9IG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG51bGwgLCBudWxsKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJCi0JCS8vd2lsbCBub3QgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGZpcnN0IElucHV0U3RyZWFtIGlzIG5vdCBudWxsCi0JCUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMxLmdldEJ5dGVzKCkpOyAKLQkJc2kgPSBuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShpcyAsIG51bGwpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtI1NlcXVlbmNlSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKKyAgICAgKiAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJTZWUgc2V0VXAuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VxdWVuY2VJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW1MamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtLAorICAgICAgICAvLyBqYXZhLmlvLklucHV0U3RyZWFtKQorICAgICAgICAvLyBVc2VkIGluIHRlc3RzCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBTZXF1ZW5jZUlucHV0U3RyZWFtI1NlcXVlbmNlSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSwKKyAgICAgKiAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlcXVlbmNlSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgamF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3Rvcl9MSW5wdXRTdHJlYW1MSW5wdXRTdHJlYW1fTnVsbCgpIHsgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2kgPSBuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShudWxsICwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL3dpbGwgbm90IHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBmaXJzdCBJbnB1dFN0cmVhbSBpcyBub3QgbnVsbAorICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzMS5nZXRCeXRlcygpKTsgCisgICAgICAgIHNpID0gbmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0oaXMgLCBudWxsKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtI1NlcXVlbmNlSW5wdXRTdHJlYW0oamF2YS51dGlsLkVudW1lcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0VudW1lcmF0aW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtKGphdmEudXRpbC5FbnVtZXJhdGlvbikKLQkJY2xhc3MgU3RyZWFtRW51bWVyYXRvciBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbXNbXSA9IG5ldyBJbnB1dFN0cmVhbVsyXTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtI1NlcXVlbmNlSW5wdXRTdHJlYW0oamF2YS51dGlsLkVudW1lcmF0aW9uKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlcXVlbmNlSW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkVudW1lcmF0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9FbnVtZXJhdGlvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbShqYXZhLnV0aWwuRW51bWVyYXRpb24pCisgICAgICAgIGNsYXNzIFN0cmVhbUVudW1lcmF0b3IgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW1zW10gPSBuZXcgSW5wdXRTdHJlYW1bMl07CiAKLQkJCWludCBjb3VudCA9IDA7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOwogCi0JCQlwdWJsaWMgU3RyZWFtRW51bWVyYXRvcigpIHsKLQkJCQlzdHJlYW1zWzBdID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMxLmdldEJ5dGVzKCkpOwotCQkJCXN0cmVhbXNbMV0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oczIuZ2V0Qnl0ZXMoKSk7Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgU3RyZWFtRW51bWVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1zWzBdID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMxLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIHN0cmVhbXNbMV0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oczIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCQlyZXR1cm4gY291bnQgPCBzdHJlYW1zLmxlbmd0aDsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY291bnQgPCBzdHJlYW1zLmxlbmd0aDsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQlyZXR1cm4gc3RyZWFtc1tjb3VudCsrXTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtc1tjb3VudCsrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlzaSA9IG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG5ldyBTdHJlYW1FbnVtZXJhdG9yKCkpOwotCQkJYnl0ZSBidWZbXSA9IG5ldyBieXRlW3MxLmxlbmd0aCgpICsgczIubGVuZ3RoKCldOwotCQkJc2kucmVhZChidWYsIDAsIHMxLmxlbmd0aCgpKTsKLQkJCXNpLnJlYWQoYnVmLCBzMS5sZW5ndGgoKSwgczIubGVuZ3RoKCkpOwotCQkJYXNzZXJ0VHJ1ZSgiUmVhZCBpbmNvcnJlY3QgYnl0ZXM6ICIgKyBuZXcgU3RyaW5nKGJ1ZiksIG5ldyBTdHJpbmcoCi0JCQkJCWJ1ZikuZXF1YWxzKHMxICsgczIpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNpID0gbmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0obmV3IFN0cmVhbUVudW1lcmF0b3IoKSk7CisgICAgICAgICAgICBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbczEubGVuZ3RoKCkgKyBzMi5sZW5ndGgoKV07CisgICAgICAgICAgICBzaS5yZWFkKGJ1ZiwgMCwgczEubGVuZ3RoKCkpOworICAgICAgICAgICAgc2kucmVhZChidWYsIHMxLmxlbmd0aCgpLCBzMi5sZW5ndGgoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZWFkIGluY29ycmVjdCBieXRlczogIiArIG5ldyBTdHJpbmcoYnVmKSwgbmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgYnVmKS5lcXVhbHMoczEgKyBzMikpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKLQkJdHJ5IHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtI2F2YWlsYWJsZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZhaWxhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hdmFpbGFibGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtLmF2YWlsYWJsZSgpCisgICAgICAgIHRyeSB7CiAKLQkJCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBudW1iZXIgb2YgYnl0ZXM6ICIgKyBzaS5hdmFpbGFibGUoKSwKLQkJCQkJc2kuYXZhaWxhYmxlKCkgPT0gczEubGVuZ3RoKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgYXZhaWxhYmxlIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBieXRlczogIiArIHNpLmF2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICBzaS5hdmFpbGFibGUoKSA9PSBzMS5sZW5ndGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGR1cmluZyBhdmFpbGFibGUgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc2kuY2xvc2UoKTsJCQotCQkvL3dpbGwgbm90IHRocm93IElPRXhjZXB0aW9uIHRvIGNsb3NlIGEgc3RyZWFtIHdoaWNoIGlzIGNsb3NlZCBhbHJlYWR5Ci0JCXNpLmNsb3NlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0jY2xvc2UoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNpLmNsb3NlKCk7ICAgICAgICAKKyAgICAgICAgLy93aWxsIG5vdCB0aHJvdyBJT0V4Y2VwdGlvbiB0byBjbG9zZSBhIHN0cmVhbSB3aGljaCBpcyBjbG9zZWQgYWxyZWFkeQorICAgICAgICBzaS5jbG9zZSgpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0ucmVhZCgpCi0JCXRyeSB7Ci0JCQlzaS5yZWFkKCk7Ci0JCQlhc3NlcnRUcnVlKCJSZWFkIGluY29ycmVjdCBjaGFyIiwgKGNoYXIpIHNpLnJlYWQoKSA9PSBzMS5jaGFyQXQoMSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0OiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCQkvL3JldHVybnMgLTEgaWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQgLCBkbyBub3QgdGhyb3cgSU9FeGNlcHRpb24KLQkJc2kuY2xvc2UoKTsKLQkJaW50IHJlc3VsdCA9IHNpLnJlYWQoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xICwgcmVzdWx0KTsJCQotCX0KLQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sIGludCwKLQkJLy8gaW50KQotCQl0cnkgewotCQkJYnl0ZSBidWZbXSA9IG5ldyBieXRlW3MxLmxlbmd0aCgpICsgczIubGVuZ3RoKCldOwotCQkJc2kucmVhZChidWYsIDAsIHMxLmxlbmd0aCgpKTsKLQkJCXNpLnJlYWQoYnVmLCBzMS5sZW5ndGgoKSwgczIubGVuZ3RoKCkpOwotCQkJYXNzZXJ0VHJ1ZSgiUmVhZCBpbmNvcnJlY3QgYnl0ZXM6ICIgKyBuZXcgU3RyaW5nKGJ1ZiksIG5ldyBTdHJpbmcoCi0JCQkJCWJ1ZikuZXF1YWxzKHMxICsgczIpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJpczEgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQgfSk7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJbmV3IGJ5dGVbXSB7IDUsIDYsIDcsIDggfSk7Ci0JCVNlcXVlbmNlSW5wdXRTdHJlYW0gc2lzID0gbmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0oYmlzMSwgYmlzMik7Ci0KLQkJdHJ5IHsKLQkJCXNpcy5yZWFkKG51bGwsIDAsIC0xKTsKLQkJCWZhaWwoIkV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIGV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0jcmVhZCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtLnJlYWQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2kucmVhZCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVhZCBpbmNvcnJlY3QgY2hhciIsIChjaGFyKSBzaS5yZWFkKCkgPT0gczEuY2hhckF0KDEpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgLy9yZXR1cm5zIC0xIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkICwgZG8gbm90IHRocm93IElPRXhjZXB0aW9uCi0JCWJ5dGVbXSBhcnJheSA9IG5ldyBieXRlW10geyAxICwgMiAsIDMgLDQgfTsKLQkJc2lzLmNsb3NlKCk7Ci0JCWludCByZXN1bHQgPSBzaXMucmVhZChhcnJheSAsIDAgLCA1KTsKLQkJYXNzZXJ0RXF1YWxzKC0xICwgcmVzdWx0KTsJCi0JCQotCX0KKyAgICAgICAgc2kuY2xvc2UoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHNpLnJlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xICwgcmVzdWx0KTsgICAgICAgIAorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCQlzaSA9IG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzMS5nZXRCeXRlcygpKSwKLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oczIuZ2V0Qnl0ZXMoKSkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZSBidWZbXSA9IG5ldyBieXRlW3MxLmxlbmd0aCgpICsgczIubGVuZ3RoKCldOworICAgICAgICAgICAgc2kucmVhZChidWYsIDAsIHMxLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHNpLnJlYWQoYnVmLCBzMS5sZW5ndGgoKSwgczIubGVuZ3RoKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVhZCBpbmNvcnJlY3QgYnl0ZXM6ICIgKyBuZXcgU3RyaW5nKGJ1ZiksIG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGJ1ZikuZXF1YWxzKHMxICsgczIpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpczEgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQgfSk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDUsIDYsIDcsIDggfSk7CisgICAgICAgIFNlcXVlbmNlSW5wdXRTdHJlYW0gc2lzID0gbmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0oYmlzMSwgYmlzMik7CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaXMucmVhZChudWxsLCAwLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9yZXR1cm5zIC0xIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkICwgZG8gbm90IHRocm93IElPRXhjZXB0aW9uCisgICAgICAgIGJ5dGVbXSBhcnJheSA9IG5ldyBieXRlW10geyAxICwgMiAsIDMgLDQgfTsKKyAgICAgICAgc2lzLmNsb3NlKCk7CisgICAgICAgIGludCByZXN1bHQgPSBzaXMucmVhZChhcnJheSAsIDAgLCA1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xICwgcmVzdWx0KTsgICAgCisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICBzaSA9IG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzMS5nZXRCeXRlcygpKSwKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oczIuZ2V0Qnl0ZXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TZXJpYWxpemFibGVQZXJtaXNzaW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YWJsZVBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggNGRhMjJkNS4uNWVlZGM4NiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YWJsZVBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YWJsZVBlcm1pc3Npb25UZXN0LmphdmEKQEAgLTE3LDQzICsxNyw2NyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhTZXJpYWxpemFibGVQZXJtaXNzaW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTZXJpYWxpemFibGVQZXJtaXNzaW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TZXJpYWxpemFibGVQZXJtaXNzaW9uI1NlcmlhbGl6YWJsZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlNlcmlhbGl6YWJsZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKLQkJYXNzZXJ0RXF1YWxzKCJwZXJtaXNzaW9uIGlsbC1mb3JtZWQiLCAKLQkJCQkiZW5hYmxlU3ViY2xhc3NJbXBsZW1lbnRhdGlvbiIsIG5ldyBTZXJpYWxpemFibGVQZXJtaXNzaW9uKAotCQkJCSJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIikuZ2V0TmFtZSgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbiNTZXJpYWxpemFibGVQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VyaWFsaXphYmxlUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlNlcmlhbGl6YWJsZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwZXJtaXNzaW9uIGlsbC1mb3JtZWQiLCAKKyAgICAgICAgICAgICAgICAiZW5hYmxlU3ViY2xhc3NJbXBsZW1lbnRhdGlvbiIsIG5ldyBTZXJpYWxpemFibGVQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIikuZ2V0TmFtZSgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TZXJpYWxpemFibGVQZXJtaXNzaW9uI1NlcmlhbGl6YWJsZVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAotCQkvLyBqYXZhLmxhbmcuU3RyaW5nKQotCQlhc3NlcnRFcXVhbHMoInBlcm1pc3Npb24gaWxsLWZvcm1lZCIsIAotCQkJCSJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIiwgbmV3IFNlcmlhbGl6YWJsZVBlcm1pc3Npb24oCi0JCQkJImVuYWJsZVN1YmNsYXNzSW1wbGVtZW50YXRpb24iLCAiIikuZ2V0TmFtZSgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbiNTZXJpYWxpemFibGVQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VyaWFsaXphYmxlUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICBhc3NlcnRFcXVhbHMoInBlcm1pc3Npb24gaWxsLWZvcm1lZCIsIAorICAgICAgICAgICAgICAgICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIiwgbmV3IFNlcmlhbGl6YWJsZVBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgImVuYWJsZVN1YmNsYXNzSW1wbGVtZW50YXRpb24iLCAiIikuZ2V0TmFtZSgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TZXJpYWxpemF0aW9uU3RyZXNzVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0LmphdmEKaW5kZXggOWZjYzM0Mi4uMDRmZWE0NiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKQEAgLTYyLDk5MiArNjcsMTI4MSBAQAogICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhTZXJpYWxpemFibGUuY2xhc3MpIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIGltcGxlbWVudHMKLQkJU2VyaWFsaXphYmxlIHsKKyAgICAgICAgU2VyaWFsaXphYmxlIHsKIAotCS8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfWExPQUQgPSAieGxvYWQiOworICAgIC8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfWExPQUQgPSAieGxvYWQiOwogCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9YRFVNUCA9ICJ4ZHVtcCI7CisgICAgLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9YRFVNUCA9ICJ4ZHVtcCI7CiAKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEZPTyA9ICJmb28iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PID0gImZvbyI7CiAKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19URVNUX0ZBSUxFRCA9ICJGYWlsZWQgdG8gd3JpdGUvcmVhZC9hc3NlcnRpb24gY2hlY2tpbmc6ICI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVEVTVF9GQUlMRUQgPSAiRmFpbGVkIHRvIHdyaXRlL3JlYWQvYXNzZXJ0aW9uIGNoZWNraW5nOiAiOwogCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4geGxvYWQgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4geGxvYWQgPSBmYWxzZTsKIAotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB4ZHVtcCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB4ZHVtcCA9IGZhbHNlOwogCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgeEZpbGVOYW1lID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB4RmlsZU5hbWUgPSBudWxsOwogCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBpbnQgZHVtcENvdW50ID0gMDsKKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBkdW1wQ291bnQgPSAwOwogCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBPYmplY3RJbnB1dFN0cmVhbSBvaXM7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBPYmplY3RJbnB1dFN0cmVhbSBvaXM7CiAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IE9iamVjdE91dHB1dFN0cmVhbSBvb3M7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBPYmplY3RPdXRwdXRTdHJlYW0gb29zOwogCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvOworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhbzsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIE9iamVjdElucHV0U3RyZWFtU3ViY2xhc3MgZXh0ZW5kcyBPYmplY3RJbnB1dFN0cmVhbSB7Ci0JCXByaXZhdGUgVmVjdG9yIHJlc29sdmVkQ2xhc3NlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPYmplY3RJbnB1dFN0cmVhbVN1YmNsYXNzIGV4dGVuZHMgT2JqZWN0SW5wdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIFZlY3RvciByZXNvbHZlZENsYXNzZXMgPSBuZXcgVmVjdG9yKCk7CiAKLQkJcHVibGljIE9iamVjdElucHV0U3RyZWFtU3ViY2xhc3MoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCQlTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gewotCQkJc3VwZXIoaW4pOwotCQl9CisgICAgICAgIHB1YmxpYyBPYmplY3RJbnB1dFN0cmVhbVN1YmNsYXNzKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKGluKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBDbGFzcyByZXNvbHZlQ2xhc3MoT2JqZWN0U3RyZWFtQ2xhc3Mgb3NDbGFzcykKLQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJQ2xhc3MgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZUNsYXNzKG9zQ2xhc3MpOwotCQkJcmVzb2x2ZWRDbGFzc2VzLmFkZEVsZW1lbnQocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KKyAgICAgICAgcHVibGljIENsYXNzIHJlc29sdmVDbGFzcyhPYmplY3RTdHJlYW1DbGFzcyBvc0NsYXNzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBDbGFzcyByZXN1bHQgPSBzdXBlci5yZXNvbHZlQ2xhc3Mob3NDbGFzcyk7CisgICAgICAgICAgICByZXNvbHZlZENsYXNzZXMuYWRkRWxlbWVudChyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBDbGFzc1tdIHJlc29sdmVkQ2xhc3NlcygpIHsKLQkJCXJldHVybiAoQ2xhc3NbXSkgcmVzb2x2ZWRDbGFzc2VzLnRvQXJyYXkobmV3IENsYXNzW3Jlc29sdmVkQ2xhc3NlcwotCQkJCQkuc2l6ZSgpXSk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBDbGFzc1tdIHJlc29sdmVkQ2xhc3NlcygpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3NbXSkgcmVzb2x2ZWRDbGFzc2VzLnRvQXJyYXkobmV3IENsYXNzW3Jlc29sdmVkQ2xhc3NlcworICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlzdGF0aWMgZmluYWwgTWFwIFRBQkxFID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHN0YXRpYyBmaW5hbCBNYXAgVEFCTEUgPSBuZXcgSGFzaHRhYmxlKCk7CiAKLQlzdGF0aWMgZmluYWwgTWFwIE1BUCA9IG5ldyBIYXNoTWFwKCk7CisgICAgc3RhdGljIGZpbmFsIE1hcCBNQVAgPSBuZXcgSGFzaE1hcCgpOwogCi0Jc3RhdGljIGZpbmFsIFNvcnRlZE1hcCBUUkVFID0gbmV3IFRyZWVNYXAoKTsKKyAgICBzdGF0aWMgZmluYWwgU29ydGVkTWFwIFRSRUUgPSBuZXcgVHJlZU1hcCgpOwogCi0Jc3RhdGljIGZpbmFsIExpbmtlZEhhc2hNYXAgTElOS0VETUFQID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICBzdGF0aWMgZmluYWwgTGlua2VkSGFzaE1hcCBMSU5LRURNQVAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwogCi0Jc3RhdGljIGZpbmFsIExpbmtlZEhhc2hTZXQgTElOS0VEU0VUID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICBzdGF0aWMgZmluYWwgTGlua2VkSGFzaFNldCBMSU5LRURTRVQgPSBuZXcgTGlua2VkSGFzaFNldCgpOwogCi0Jc3RhdGljIGZpbmFsIElkZW50aXR5SGFzaE1hcCBJREVOVElUWU1BUCA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKKyAgICBzdGF0aWMgZmluYWwgSWRlbnRpdHlIYXNoTWFwIElERU5USVRZTUFQID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwogCi0Jc3RhdGljIGZpbmFsIExpc3QgQUxJU1QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJhIiwgImxpc3QiLCAib2YiLAotCQkJInN0cmluZ3MiIH0pOworICAgIHN0YXRpYyBmaW5hbCBMaXN0IEFMSVNUID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYSIsICJsaXN0IiwgIm9mIiwKKyAgICAgICAgICAgICJzdHJpbmdzIiB9KTsKIAotCXN0YXRpYyBmaW5hbCBMaXN0IExJU1QgPSBuZXcgQXJyYXlMaXN0KEFMSVNUKTsKKyAgICBzdGF0aWMgZmluYWwgTGlzdCBMSVNUID0gbmV3IEFycmF5TGlzdChBTElTVCk7CiAKLQlzdGF0aWMgZmluYWwgU2V0IFNFVCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIm9uZSIsCi0JCQkidHdvIiwgInRocmVlIiB9KSk7CisgICAgc3RhdGljIGZpbmFsIFNldCBTRVQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJvbmUiLAorICAgICAgICAgICAgInR3byIsICJ0aHJlZSIgfSkpOwogCi0Jc3RhdGljIGZpbmFsIFBlcm1pc3Npb24gUEVSTSA9IG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oImZpbGUuZW5jb2RpbmciLAotCQkJIndyaXRlIik7CisgICAgc3RhdGljIGZpbmFsIFBlcm1pc3Npb24gUEVSTSA9IG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oImZpbGUuZW5jb2RpbmciLAorICAgICAgICAgICAgIndyaXRlIik7CiAKLQlzdGF0aWMgZmluYWwgUGVybWlzc2lvbkNvbGxlY3Rpb24gUEVSTUNPTCA9IFBFUk0ubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKKyAgICBzdGF0aWMgZmluYWwgUGVybWlzc2lvbkNvbGxlY3Rpb24gUEVSTUNPTCA9IFBFUk0ubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKIAotCXN0YXRpYyBmaW5hbCBTb3J0ZWRTZXQgU09SVFNFVCA9IG5ldyBUcmVlU2V0KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKLQkJCSJvbmUiLCAidHdvIiwgInRocmVlIiB9KSk7CisgICAgc3RhdGljIGZpbmFsIFNvcnRlZFNldCBTT1JUU0VUID0gbmV3IFRyZWVTZXQoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIm9uZSIsICJ0d28iLCAidGhyZWUiIH0pKTsKIAotCXN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCBEQVRFRk9STSA9IGphdmEudGV4dC5EYXRlRm9ybWF0Ci0JCQkuZ2V0SW5zdGFuY2UoKTsKKyAgICBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQgREFURUZPUk0gPSBqYXZhLnRleHQuRGF0ZUZvcm1hdAorICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7CiAKLQlzdGF0aWMgZmluYWwgamF2YS50ZXh0LkNob2ljZUZvcm1hdCBDSE9JQ0UgPSBuZXcgamF2YS50ZXh0LkNob2ljZUZvcm1hdCgKLQkJCSIxI29uZXwyI3R3b3wzI3RocmVlIik7CisgICAgc3RhdGljIGZpbmFsIGphdmEudGV4dC5DaG9pY2VGb3JtYXQgQ0hPSUNFID0gbmV3IGphdmEudGV4dC5DaG9pY2VGb3JtYXQoCisgICAgICAgICAgICAiMSNvbmV8MiN0d298MyN0aHJlZSIpOwogCi0Jc3RhdGljIGZpbmFsIGphdmEudGV4dC5OdW1iZXJGb3JtYXQgTlVNQkVSRk9STSA9IGphdmEudGV4dC5OdW1iZXJGb3JtYXQKLQkJCS5nZXRJbnN0YW5jZSgpOworICAgIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IE5VTUJFUkZPUk0gPSBqYXZhLnRleHQuTnVtYmVyRm9ybWF0CisgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKIAotCXN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBNRVNTQUdFID0gbmV3IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0KAotCQkJInRoZSB0aW1lOiB7MCx0aW1lfSBhbmQgZGF0ZSB7MCxkYXRlfSIpOworICAgIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBNRVNTQUdFID0gbmV3IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0KAorICAgICAgICAgICAgInRoZSB0aW1lOiB7MCx0aW1lfSBhbmQgZGF0ZSB7MCxkYXRlfSIpOwogCi0Jc3RhdGljIGZpbmFsIExpbmtlZExpc3QgTElOS0VETElTVCA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cwotCQkJLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYSIsICJsaW5rZWQiLCAibGlzdCIsICJvZiIsICJzdHJpbmdzIiB9KSk7CisgICAgc3RhdGljIGZpbmFsIExpbmtlZExpc3QgTElOS0VETElTVCA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cworICAgICAgICAgICAgLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYSIsICJsaW5rZWQiLCAibGlzdCIsICJvZiIsICJzdHJpbmdzIiB9KSk7CiAKLQlzdGF0aWMgZmluYWwgU2ltcGxlVGltZVpvbmUgVElNRV9aT05FID0gbmV3IFNpbXBsZVRpbWVab25lKDM2MDAwMDAsCi0JCQkiUy1URVNUIik7CisgICAgc3RhdGljIGZpbmFsIFNpbXBsZVRpbWVab25lIFRJTUVfWk9ORSA9IG5ldyBTaW1wbGVUaW1lWm9uZSgzNjAwMDAwLAorICAgICAgICAgICAgIlMtVEVTVCIpOwogCi0Jc3RhdGljIGZpbmFsIENhbGVuZGFyIENBTEVOREFSID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRJTUVfWk9ORSk7CisgICAgc3RhdGljIGZpbmFsIENhbGVuZGFyIENBTEVOREFSID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRJTUVfWk9ORSk7CiAKLQlzdGF0aWMgewotCQlUQUJMRS5wdXQoIm9uZSIsICIxIik7Ci0JCVRBQkxFLnB1dCgidHdvIiwgIjIiKTsKLQkJVEFCTEUucHV0KCJ0aHJlZSIsICIzIik7Ci0JCU1BUC5wdXQoIm9uZSIsICIxIik7Ci0JCU1BUC5wdXQoInR3byIsICIyIik7Ci0JCU1BUC5wdXQoInRocmVlIiwgIjMiKTsKLQkJTElOS0VETUFQLnB1dCgib25lIiwgIjEiKTsKLQkJTElOS0VETUFQLnB1dCgidHdvIiwgIjIiKTsKLQkJTElOS0VETUFQLnB1dCgidGhyZWUiLCAiMyIpOwotCQlJREVOVElUWU1BUC5wdXQoIm9uZSIsICIxIik7Ci0JCUlERU5USVRZTUFQLnB1dCgidHdvIiwgIjIiKTsKLQkJSURFTlRJVFlNQVAucHV0KCJ0aHJlZSIsICIzIik7Ci0JCUxJTktFRFNFVC5hZGQoIm9uZSIpOwotCQlMSU5LRURTRVQuYWRkKCJ0d28iKTsKLQkJTElOS0VEU0VULmFkZCgidGhyZWUiKTsKLQkJVFJFRS5wdXQoIm9uZSIsICIxIik7Ci0JCVRSRUUucHV0KCJ0d28iLCAiMiIpOwotCQlUUkVFLnB1dCgidGhyZWUiLCAiMyIpOwotCQlQRVJNQ09MLmFkZChQRVJNKTsKLQkJLy8gVG8gbWFrZSBzdXJlIHRoZXkgYWxsIHVzZSB0aGUgc2FtZSBDYWxlbmRhcgotCQlDQUxFTkRBUi5zZXRUaW1lWm9uZShuZXcgU2ltcGxlVGltZVpvbmUoMCwgIkdNVCIpKTsKLQkJQ0FMRU5EQVIuc2V0KDE5OTksIENhbGVuZGFyLkpVTkUsIDIzLCAxNSwgNDcsIDEzKTsKLQkJQ0FMRU5EQVIuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCA1NTMpOwotCQlEQVRFRk9STS5zZXRDYWxlbmRhcihDQUxFTkRBUik7Ci0JCWphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyBzeW1ib2xzID0gbmV3IGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scygpOwotCQlzeW1ib2xzLnNldFpvbmVTdHJpbmdzKG5ldyBTdHJpbmdbXVtdIHsgeyAiYSIsICJiIiwgImMiLCAiZCIgfSwKLQkJCQl7ICJlIiwgImYiLCAiZyIsICJoIiB9IH0pOwotCQkoKGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0KSBEQVRFRk9STSkuc2V0RGF0ZUZvcm1hdFN5bWJvbHMoc3ltYm9scyk7Ci0JCURBVEVGT1JNLnNldE51bWJlckZvcm1hdChuZXcgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQoIiMuIzsnLScjLiMiKSk7Ci0JCURBVEVGT1JNLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJFU1QiKSk7Ci0JCSgoamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQpIE5VTUJFUkZPUk0pLmFwcGx5UGF0dGVybigiIy4jOyctJyMuIyIpOwotCQlNRVNTQUdFLnNldEZvcm1hdCgwLCBEQVRFRk9STSk7Ci0JCU1FU1NBR0Uuc2V0Rm9ybWF0KDEsIERBVEVGT1JNKTsKLQl9CisgICAgc3RhdGljIHsKKyAgICAgICAgVEFCTEUucHV0KCJvbmUiLCAiMSIpOworICAgICAgICBUQUJMRS5wdXQoInR3byIsICIyIik7CisgICAgICAgIFRBQkxFLnB1dCgidGhyZWUiLCAiMyIpOworICAgICAgICBNQVAucHV0KCJvbmUiLCAiMSIpOworICAgICAgICBNQVAucHV0KCJ0d28iLCAiMiIpOworICAgICAgICBNQVAucHV0KCJ0aHJlZSIsICIzIik7CisgICAgICAgIExJTktFRE1BUC5wdXQoIm9uZSIsICIxIik7CisgICAgICAgIExJTktFRE1BUC5wdXQoInR3byIsICIyIik7CisgICAgICAgIExJTktFRE1BUC5wdXQoInRocmVlIiwgIjMiKTsKKyAgICAgICAgSURFTlRJVFlNQVAucHV0KCJvbmUiLCAiMSIpOworICAgICAgICBJREVOVElUWU1BUC5wdXQoInR3byIsICIyIik7CisgICAgICAgIElERU5USVRZTUFQLnB1dCgidGhyZWUiLCAiMyIpOworICAgICAgICBMSU5LRURTRVQuYWRkKCJvbmUiKTsKKyAgICAgICAgTElOS0VEU0VULmFkZCgidHdvIik7CisgICAgICAgIExJTktFRFNFVC5hZGQoInRocmVlIik7CisgICAgICAgIFRSRUUucHV0KCJvbmUiLCAiMSIpOworICAgICAgICBUUkVFLnB1dCgidHdvIiwgIjIiKTsKKyAgICAgICAgVFJFRS5wdXQoInRocmVlIiwgIjMiKTsKKyAgICAgICAgUEVSTUNPTC5hZGQoUEVSTSk7CisgICAgICAgIC8vIFRvIG1ha2Ugc3VyZSB0aGV5IGFsbCB1c2UgdGhlIHNhbWUgQ2FsZW5kYXIKKyAgICAgICAgQ0FMRU5EQVIuc2V0VGltZVpvbmUobmV3IFNpbXBsZVRpbWVab25lKDAsICJHTVQiKSk7CisgICAgICAgIENBTEVOREFSLnNldCgxOTk5LCBDYWxlbmRhci5KVU5FLCAyMywgMTUsIDQ3LCAxMyk7CisgICAgICAgIENBTEVOREFSLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgNTUzKTsKKyAgICAgICAgREFURUZPUk0uc2V0Q2FsZW5kYXIoQ0FMRU5EQVIpOworICAgICAgICBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMgc3ltYm9scyA9IG5ldyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMoKTsKKyAgICAgICAgc3ltYm9scy5zZXRab25lU3RyaW5ncyhuZXcgU3RyaW5nW11bXSB7IHsgImEiLCAiYiIsICJjIiwgImQiIH0sCisgICAgICAgICAgICAgICAgeyAiZSIsICJmIiwgImciLCAiaCIgfSB9KTsKKyAgICAgICAgKChqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCkgREFURUZPUk0pLnNldERhdGVGb3JtYXRTeW1ib2xzKHN5bWJvbHMpOworICAgICAgICBEQVRFRk9STS5zZXROdW1iZXJGb3JtYXQobmV3IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0KCIjLiM7Jy0nIy4jIikpOworICAgICAgICBEQVRFRk9STS5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRVNUIikpOworICAgICAgICAoKGphdmEudGV4dC5EZWNpbWFsRm9ybWF0KSBOVU1CRVJGT1JNKS5hcHBseVBhdHRlcm4oIiMuIzsnLScjLiMiKTsKKyAgICAgICAgTUVTU0FHRS5zZXRGb3JtYXQoMCwgREFURUZPUk0pOworICAgICAgICBNRVNTQUdFLnNldEZvcm1hdCgxLCBEQVRFRk9STSk7CisgICAgfQogCi0JcHVibGljIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0KCkgewotCX0KKyAgICBwdWJsaWMgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QoKSB7CisgICAgfQogCi0JcHVibGljIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KKyAgICBwdWJsaWMgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXREdW1wTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKSArIGR1bXBDb3VudDsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXREdW1wTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKSArIGR1bXBDb3VudDsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBkdW1wKE9iamVjdCBvKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoZHVtcENvdW50ID4gMCkKLQkJCXNldFVwKCk7Ci0JCS8vIER1bXAgdGhlIG9iamVjdAotCQl0cnkgewotCQkJb29zLndyaXRlT2JqZWN0KG8pOwotCQl9IGZpbmFsbHkgewotCQkJb29zLmNsb3NlKCk7Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChPYmplY3QgbykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGR1bXBDb3VudCA+IDApCisgICAgICAgICAgICBzZXRVcCgpOworICAgICAgICAvLyBEdW1wIHRoZSBvYmplY3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChvKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIE9iamVjdCBkdW1wQW5kUmVsb2FkKE9iamVjdCBvKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQlDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJZHVtcChvKTsKLQkJcmV0dXJuIHJlbG9hZCgpOwotCX0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGR1bXBBbmRSZWxvYWQoT2JqZWN0IG8pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBkdW1wKG8pOworICAgICAgICByZXR1cm4gcmVsb2FkKCk7CisgICAgfQogCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGxvYWRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBDaG9vc2UgdGhlIGxvYWQgc3RyZWFtCi0JCWlmICh4bG9hZCB8fCB4ZHVtcCkgewotCQkJLy8gTG9hZCBmcm9tIHByZS1leGlzdGluZyBmaWxlCi0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbSh4RmlsZU5hbWUgKyAiLSIgKyBnZXREdW1wTmFtZSgpICsgIi5zZXIiKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEp1c3QgbG9hZCBmcm9tIG1lbW9yeSwgd2UgZHVtcGVkIHRvIG1lbW9yeQotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW8udG9CeXRlQXJyYXkoKSk7Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGxvYWRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBDaG9vc2UgdGhlIGxvYWQgc3RyZWFtCisgICAgICAgIGlmICh4bG9hZCB8fCB4ZHVtcCkgeworICAgICAgICAgICAgLy8gTG9hZCBmcm9tIHByZS1leGlzdGluZyBmaWxlCisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbSh4RmlsZU5hbWUgKyAiLSIgKyBnZXREdW1wTmFtZSgpICsgIi5zZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEp1c3QgbG9hZCBmcm9tIG1lbW9yeSwgd2UgZHVtcGVkIHRvIG1lbW9yeQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW8udG9CeXRlQXJyYXkoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOwotCQlkdW1wQ291bnQrKzsKLQkJdHJ5IHsKLQkJCXJldHVybiBvaXMucmVhZE9iamVjdCgpOwotCQl9IGZpbmFsbHkgewotCQkJb2lzLmNsb3NlKCk7Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIE9iamVjdCByZWxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgZHVtcENvdW50Kys7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoeGR1bXApIHsKLQkJCQlvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHhGaWxlTmFtZQotCQkJCQkJKyAiLSIgKyBnZXREdW1wTmFtZSgpICsgIi5zZXIiKSk7Ci0JCQl9IGVsc2UgewotCQkJCW9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIHNldHVwIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh4ZHVtcCkgeworICAgICAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oeEZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICItIiArIGdldER1bXBOYW1lKCkgKyAiLnNlciIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHRocm93biBkdXJpbmcgc2V0dXAgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChvb3MgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlvb3MuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzFfQ29uc3RydWN0b3IoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMV9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQogCi0JCXRyeSB7Ci0JCQlvb3MuY2xvc2UoKTsKLQkJCW9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKLQkJCW9vcy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBPYmplY3RPdXRwdXRTdHJlYW0gOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBjcmVhdGUgT2JqZWN0T3V0cHV0U3RyZWFtIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMl9jbG9zZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0uY2xvc2UoKQotCQl0cnkgewotCQkJb29zLmNsb3NlKCk7Ci0JCQlvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7Ci0JCQlvb3MuY2xvc2UoKTsKLQkJCW9vcy53cml0ZUNoYXIoJ1QnKTsKLQkJCW9vcy53cml0ZU9iamVjdChGT08pOwotCQkJLy8gV3JpdGluZyB0byBhIGNsb3NlZCBzdHJlYW0gZG9lcyBub3QgY2F1c2UgcHJvYmxlbXMuIFRoaXMgaXMKLQkJCS8vIHRoZSBleHBlY3RlZCBiZWhhdmlvcgotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJPcGVyYXRpb24gb24gY2xvc2VkIHN0cmVhbSB0aHJldyBJT0V4Y2VwdGlvbiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzJfY2xvc2UoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLmNsb3NlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBvb3Mud3JpdGVDaGFyKCdUJyk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QoRk9PKTsKKyAgICAgICAgICAgIC8vIFdyaXRpbmcgdG8gYSBjbG9zZWQgc3RyZWFtIGRvZXMgbm90IGNhdXNlIHByb2JsZW1zLiBUaGlzIGlzCisgICAgICAgICAgICAvLyB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiT3BlcmF0aW9uIG9uIGNsb3NlZCBzdHJlYW0gdGhyZXcgSU9FeGNlcHRpb24gOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8zX2RlZmF1bHRXcml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0uZGVmYXVsdFdyaXRlT2JqZWN0KCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfM19kZWZhdWx0V3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLmRlZmF1bHRXcml0ZU9iamVjdCgpCiAKLQkJdHJ5IHsKLQkJCW9vcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfSBjYXRjaCAoTm90QWN0aXZlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvcnJlY3QKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWZhaWwoCi0JCQkJIkZhaWxlZCB0byB0aHJvdyBOb3RBY3RpdmVFeGNlcHRpb24gd2hlbiBpbnZva2VkIG91dHNpZGUgcmVhZE9iamVjdCIpOwotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoTm90QWN0aXZlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENvcnJlY3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB0aHJvdyBOb3RBY3RpdmVFeGNlcHRpb24gd2hlbiBpbnZva2VkIG91dHNpZGUgcmVhZE9iamVjdCIpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfNF9mbHVzaCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0uZmx1c2goKQotCQl0cnkgewotCQkJb29zLmNsb3NlKCk7Ci0JCQlvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7Ci0JCQlpbnQgc2l6ZSA9IGJhby5zaXplKCk7Ci0JCQlvb3Mud3JpdGVCeXRlKDEyNyk7Ci0JCQlhc3NlcnRUcnVlKCJEYXRhIGZsdXNoZWQgYWxyZWFkeSIsIGJhby5zaXplKCkgPT0gc2l6ZSk7Ci0JCQlvb3MuZmx1c2goKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBmbHVzaCBkYXRhIiwgYmFvLnNpemUoKSA+IHNpemUpOwotCQkJLy8gd2UgZG9uJ3Qga25vdyBob3cgbWFueSBieXRlcyBhcmUgYWN0dWFsbHkgd3JpdHRlbiBmb3IgMSBieXRlLAotCQkJLy8gc28gd2UgdGVzdCA+IDxiZWZvcmU+Ci0JCQlvb3MuY2xvc2UoKTsKLQkJCW9vcyA9IG51bGw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF80X2ZsdXNoKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS5mbHVzaCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGludCBzaXplID0gYmFvLnNpemUoKTsKKyAgICAgICAgICAgIG9vcy53cml0ZUJ5dGUoMTI3KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRhdGEgZmx1c2hlZCBhbHJlYWR5IiwgYmFvLnNpemUoKSA9PSBzaXplKTsKKyAgICAgICAgICAgIG9vcy5mbHVzaCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGZsdXNoIGRhdGEiLCBiYW8uc2l6ZSgpID4gc2l6ZSk7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGJ5dGVzIGFyZSBhY3R1YWxseSB3cml0dGVuIGZvciAxIGJ5dGUsCisgICAgICAgICAgICAvLyBzbyB3ZSB0ZXN0ID4gPGJlZm9yZT4KKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzVfcmVzZXQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLnJlc2V0KCkKLQkJdHJ5IHsKLQkJCVN0cmluZyBvID0gIkhlbGxvV29ybGQiOwotCQkJb29zLndyaXRlT2JqZWN0KG8pOwotCQkJb29zLndyaXRlT2JqZWN0KG8pOwotCQkJb29zLnJlc2V0KCk7Ci0JCQlvb3Mud3JpdGVPYmplY3Qobyk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCW9pcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfNV9yZXNldCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ucmVzZXQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIG8gPSAiSGVsbG9Xb3JsZCI7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3Qobyk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3Qobyk7CisgICAgICAgICAgICBvb3MucmVzZXQoKTsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChvKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF82X3dyaXRlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZShieXRlIFtdLCBpbnQsCi0JCS8vIGludCkKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTVdOwotCQkJYnl0ZVtdIG91dHB1dCA9IG5ldyBieXRlWzI1NV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykKLQkJCQlvdXRwdXRbaV0gPSAoYnl0ZSkgaTsKLQkJCW9vcy53cml0ZShvdXRwdXQsIDAsIG91dHB1dC5sZW5ndGgpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCW9pcy5yZWFkRnVsbHkoYnVmKTsKLQkJCW9pcy5jbG9zZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGJ1ZltpXSAhPSBvdXRwdXRbaV0pCi0JCQkJCWZhaWwoIlJlYWQgaW5jb3JyZWN0IGJ5dGU6ICIgKyBpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzZfd3JpdGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzI1NV07CisgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gbmV3IGJ5dGVbMjU1XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IChieXRlKSBpOworICAgICAgICAgICAgb29zLndyaXRlKG91dHB1dCwgMCwgb3V0cHV0Lmxlbmd0aCk7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgb2lzLnJlYWRGdWxseShidWYpOworICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG91dHB1dFtpXSkKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiUmVhZCBpbmNvcnJlY3QgYnl0ZTogIiArIGkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfNmFfd3JpdGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKLQkJLy8gaW50KQotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzI1Nl07Ci0JCQlieXRlW10gb3V0cHV0ID0gbmV3IGJ5dGVbMjU2XTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0Lmxlbmd0aDsgaSsrKQotCQkJCW91dHB1dFtpXSA9IChieXRlKSAoaSAmIDB4ZmYpOwotCQkJb29zLndyaXRlKG91dHB1dCwgMCwgb3V0cHV0Lmxlbmd0aCk7Ci0JCQlvb3MuY2xvc2UoKTsKLQkJCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOwotCQkJb2lzLnJlYWRGdWxseShidWYpOwotCQkJb2lzLmNsb3NlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykKLQkJCQlpZiAoYnVmW2ldICE9IG91dHB1dFtpXSkKLQkJCQkJZmFpbCgiUmVhZCBpbmNvcnJlY3QgYnl0ZTogIiArIGkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfNmFfd3JpdGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzI1Nl07CisgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gbmV3IGJ5dGVbMjU2XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IChieXRlKSAoaSAmIDB4ZmYpOworICAgICAgICAgICAgb29zLndyaXRlKG91dHB1dCwgMCwgb3V0cHV0Lmxlbmd0aCk7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgb2lzLnJlYWRGdWxseShidWYpOworICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG91dHB1dFtpXSkKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiUmVhZCBpbmNvcnJlY3QgYnl0ZTogIiArIGkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfN193cml0ZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGUoaW50KQotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwXTsKLQkJCW9vcy53cml0ZSgnVCcpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCWFzc2VydEVxdWFscygiUmVhZCBpbmNvcnJlY3QgYnl0ZSIsICdUJywgb2lzLnJlYWQoKSk7Ci0JCQlvaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Xzdfd3JpdGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgICAgICBvb3Mud3JpdGUoJ1QnKTsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlYWQgaW5jb3JyZWN0IGJ5dGUiLCAnVCcsIG9pcy5yZWFkKCkpOworICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF84X3dyaXRlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZShieXRlIFtdKQotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwXTsKLQkJCW9vcy53cml0ZSgiSGVsbG9Xb3JsZCIuZ2V0Qnl0ZXMoKSk7Ci0JCQlvb3MuY2xvc2UoKTsKLQkJCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOwotCQkJb2lzLnJlYWQoYnVmLCAwLCAxMCk7Ci0JCQlvaXMuY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiUmVhZCBpbmNvcnJlY3QgYnl0ZXMiLCAiSGVsbG9Xb3JsZCIsIG5ldyBTdHJpbmcoYnVmLCAwLCAxMCkKLQkJCQkJKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Xzhfd3JpdGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlKGJ5dGUgW10pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgb29zLndyaXRlKCJIZWxsb1dvcmxkIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7CisgICAgICAgICAgICBvaXMucmVhZChidWYsIDAsIDEwKTsKKyAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWFkIGluY29ycmVjdCBieXRlcyIsICJIZWxsb1dvcmxkIiwgbmV3IFN0cmluZyhidWYsIDAsIDEwKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfOV93cml0ZUJvb2xlYW4oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQm9vbGVhbihib29sZWFuKQotCQl0cnkgewotCQkJb29zLndyaXRlQm9vbGVhbih0cnVlKTsKLQkJCW9vcy5jbG9zZSgpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQlhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZSB2YWx1ZSIsIG9pcy5yZWFkQm9vbGVhbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Xzlfd3JpdGVCb29sZWFuKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZUJvb2xlYW4oYm9vbGVhbikKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy53cml0ZUJvb2xlYW4odHJ1ZSk7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGJ5dGUgdmFsdWUiLCBvaXMucmVhZEJvb2xlYW4oKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xMF93cml0ZUJ5dGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQnl0ZShpbnQpCi0JCXRyeSB7Ci0JCQlvb3Mud3JpdGVCeXRlKDEyNyk7Ci0JCQlvb3MuY2xvc2UoKTsKLQkJCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZSB2YWx1ZSIsIDEyNywgb2lzLnJlYWRCeXRlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMTBfd3JpdGVCeXRlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZUJ5dGUoaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb29zLndyaXRlQnl0ZSgxMjcpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IGJ5dGUgdmFsdWUiLCAxMjcsIG9pcy5yZWFkQnl0ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzExX3dyaXRlQnl0ZXMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQnl0ZXMoamF2YS5sYW5nLlN0cmluZykKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMF07Ci0JCQlvb3Mud3JpdGVCeXRlcygiSGVsbG9Xb3JsZCIpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCW9pcy5yZWFkRnVsbHkoYnVmKTsKLQkJCW9pcy5jbG9zZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZXMgdmFsdWUiLCAiSGVsbG9Xb3JsZCIsIG5ldyBTdHJpbmcoYnVmLCAwLCAxMCkKLQkJCQkJKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzExX3dyaXRlQnl0ZXMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQnl0ZXMoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgICAgICBvb3Mud3JpdGVCeXRlcygiSGVsbG9Xb3JsZCIpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgIG9pcy5yZWFkRnVsbHkoYnVmKTsKKyAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgYnl0ZXMgdmFsdWUiLCAiSGVsbG9Xb3JsZCIsIG5ldyBTdHJpbmcoYnVmLCAwLCAxMCkKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzEyX3dyaXRlQ2hhcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVDaGFyKGludCkKLQkJdHJ5IHsKLQkJCW9vcy53cml0ZUNoYXIoJ1QnKTsKLQkJCW9vcy5jbG9zZSgpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb3RlIGluY29ycmVjdCBjaGFyIHZhbHVlIiwgJ1QnLCBvaXMucmVhZENoYXIoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xMl93cml0ZUNoYXIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQ2hhcihpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvb3Mud3JpdGVDaGFyKCdUJyk7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgY2hhciB2YWx1ZSIsICdUJywgb2lzLnJlYWRDaGFyKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMTNfd3JpdGVDaGFycygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVDaGFycyhqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJaW50IGF2YWlsID0gMDsKLQkJCWNoYXJbXSBidWYgPSBuZXcgY2hhclsxMF07Ci0JCQlvb3Mud3JpdGVDaGFycygiSGVsbG9Xb3JsZCIpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCS8vIE51bWJlciBvZiBwcmltIGRhdGEgYnl0ZXMgaW4gc3RyZWFtIC8gMiB0byBnaXZlIGNoYXIgaW5kZXgKLQkJCWF2YWlsID0gb2lzLmF2YWlsYWJsZSgpIC8gMjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWw7ICsraSkKLQkJCQlidWZbaV0gPSBvaXMucmVhZENoYXIoKTsKLQkJCW9pcy5jbG9zZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgY2hhcnMiLCAiSGVsbG9Xb3JsZCIsIG5ldyBTdHJpbmcoYnVmLCAwLCAxMCkKLQkJCQkJKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzEzX3dyaXRlQ2hhcnMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlQ2hhcnMoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBhdmFpbCA9IDA7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTBdOworICAgICAgICAgICAgb29zLndyaXRlQ2hhcnMoIkhlbGxvV29ybGQiKTsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7CisgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcHJpbSBkYXRhIGJ5dGVzIGluIHN0cmVhbSAvIDIgdG8gZ2l2ZSBjaGFyIGluZGV4CisgICAgICAgICAgICBhdmFpbCA9IG9pcy5hdmFpbGFibGUoKSAvIDI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsOyArK2kpCisgICAgICAgICAgICAgICAgYnVmW2ldID0gb2lzLnJlYWRDaGFyKCk7CisgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IGNoYXJzIiwgIkhlbGxvV29ybGQiLCBuZXcgU3RyaW5nKGJ1ZiwgMCwgMTApCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xNF93cml0ZURvdWJsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVEb3VibGUoZG91YmxlKQotCQl0cnkgewotCQkJb29zLndyaXRlRG91YmxlKERvdWJsZS5NQVhfVkFMVUUpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBkb3VibGUgdmFsdWUiLAotCQkJCQlvaXMucmVhZERvdWJsZSgpID09IERvdWJsZS5NQVhfVkFMVUUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMTRfd3JpdGVEb3VibGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlRG91YmxlKGRvdWJsZSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy53cml0ZURvdWJsZShEb3VibGUuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgZG91YmxlIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgb2lzLnJlYWREb3VibGUoKSA9PSBEb3VibGUuTUFYX1ZBTFVFKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE1X3dyaXRlRmxvYXQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlRmxvYXQoZmxvYXQpCi0JCXRyeSB7Ci0JCQlvb3Mud3JpdGVGbG9hdChGbG9hdC5NQVhfVkFMVUUpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBkb3VibGUgdmFsdWUiLAotCQkJCQlvaXMucmVhZEZsb2F0KCkgPT0gRmxvYXQuTUFYX1ZBTFVFKTsKLQkJCW9pcy5jbG9zZSgpOwotCQkJb2lzID0gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE1X3dyaXRlRmxvYXQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlRmxvYXQoZmxvYXQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvb3Mud3JpdGVGbG9hdChGbG9hdC5NQVhfVkFMVUUpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBkb3VibGUgdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICBvaXMucmVhZEZsb2F0KCkgPT0gRmxvYXQuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgb2lzID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE2X3dyaXRlSW50KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZUludChpbnQpCi0JCXRyeSB7Ci0JCQlvb3Mud3JpdGVJbnQoSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCWFzc2VydFRydWUoIldyb3RlIGluY29ycmVjdCBkb3VibGUgdmFsdWUiLAotCQkJCQlvaXMucmVhZEludCgpID09IEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCW9pcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMTZfd3JpdGVJbnQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlSW50KGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy53cml0ZUludChJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGRvdWJsZSB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIG9pcy5yZWFkSW50KCkgPT0gSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xN193cml0ZUxvbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlTG9uZyhsb25nKQotCQl0cnkgewotCQkJb29zLndyaXRlTG9uZyhMb25nLk1BWF9WQUxVRSk7Ci0JCQlvb3MuY2xvc2UoKTsKLQkJCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOwotCQkJYXNzZXJ0VHJ1ZSgiV3JvdGUgaW5jb3JyZWN0IGRvdWJsZSB2YWx1ZSIsCi0JCQkJCW9pcy5yZWFkTG9uZygpID09IExvbmcuTUFYX1ZBTFVFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE3X3dyaXRlTG9uZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVMb25nKGxvbmcpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvb3Mud3JpdGVMb25nKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm90ZSBpbmNvcnJlY3QgZG91YmxlIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgb2lzLnJlYWRMb25nKCkgPT0gTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMTlfd3JpdGVTaG9ydCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVTaG9ydChpbnQpCi0JCXRyeSB7Ci0JCQlvb3Mud3JpdGVTaG9ydCgxMjcpOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IHNob3J0IHZhbHVlIiwgMTI3LCBvaXMucmVhZFNob3J0KCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMTlfd3JpdGVTaG9ydCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVTaG9ydChpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvb3Mud3JpdGVTaG9ydCgxMjcpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvdGUgaW5jb3JyZWN0IHNob3J0IHZhbHVlIiwgMTI3LCBvaXMucmVhZFNob3J0KCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMjBfd3JpdGVVVEYoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlVVRGKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlvb3Mud3JpdGVVVEYoIkhlbGxvV29ybGQiKTsKLQkJCW9vcy5jbG9zZSgpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb3RlIGluY29ycmVjdCBVVEYgdmFsdWUiLCAKLQkJCQkJIkhlbGxvV29ybGQiLCBvaXMucmVhZFVURigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzIwX3dyaXRlVVRGKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZVVURihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb29zLndyaXRlVVRGKCJIZWxsb1dvcmxkIik7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm90ZSBpbmNvcnJlY3QgVVRGIHZhbHVlIiwgCisgICAgICAgICAgICAgICAgICAgICJIZWxsb1dvcmxkIiwgb2lzLnJlYWRVVEYoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8yNV9hdmFpbGFibGUoKSB7Ci0JCXRyeSB7Ci0JCQlvb3Mud3JpdGVPYmplY3QoRk9PKTsKLQkJCW9vcy53cml0ZU9iamVjdChGT08pOwotCQkJb29zLmZsdXNoKCk7Ci0JCQlpbnQgYXZhaWxhYmxlMSA9IDA7Ci0JCQlpbnQgYXZhaWxhYmxlMiA9IDA7Ci0JCQlPYmplY3Qgb2JqMSA9IG51bGw7Ci0JCQlPYmplY3Qgb2JqMiA9IG51bGw7Ci0JCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKLQkJCWF2YWlsYWJsZTEgPSBvaXMuYXZhaWxhYmxlKCk7Ci0JCQlvYmoxID0gb2lzLnJlYWRPYmplY3QoKTsKLQkJCWF2YWlsYWJsZTIgPSBvaXMuYXZhaWxhYmxlKCk7Ci0JCQlvYmoyID0gb2lzLnJlYWRPYmplY3QoKTsKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMjVfYXZhaWxhYmxlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KEZPTyk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QoRk9PKTsKKyAgICAgICAgICAgIG9vcy5mbHVzaCgpOworICAgICAgICAgICAgaW50IGF2YWlsYWJsZTEgPSAwOworICAgICAgICAgICAgaW50IGF2YWlsYWJsZTIgPSAwOworICAgICAgICAgICAgT2JqZWN0IG9iajEgPSBudWxsOworICAgICAgICAgICAgT2JqZWN0IG9iajIgPSBudWxsOworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7CisgICAgICAgICAgICBhdmFpbGFibGUxID0gb2lzLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgb2JqMSA9IG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhdmFpbGFibGUyID0gb2lzLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgb2JqMiA9IG9pcy5yZWFkT2JqZWN0KCk7CiAKLQkJCWFzc2VydEVxdWFscygiYXZhaWxhYmxlIHJldHVybmVkIGluY29ycmVjdCB2YWx1ZSIsIDAsIGF2YWlsYWJsZTEpOwotCQkJYXNzZXJ0RXF1YWxzKCJhdmFpbGFibGUgcmV0dXJuZWQgaW5jb3JyZWN0IHZhbHVlIiwgMCwgYXZhaWxhYmxlMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImF2YWlsYWJsZSByZXR1cm5lZCBpbmNvcnJlY3QgdmFsdWUiLCAwLCBhdmFpbGFibGUxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYXZhaWxhYmxlIHJldHVybmVkIGluY29ycmVjdCB2YWx1ZSIsIDAsIGF2YWlsYWJsZTIpOwogCi0JCQlhc3NlcnRUcnVlKCJhdmFpbGFibGUgY2F1c2VkIGluY29ycmVjdCByZWFkaW5nIiwgRk9PLmVxdWFscyhvYmoxKSk7Ci0JCQlhc3NlcnRUcnVlKCJhdmFpbGFibGUgcmV0dXJuZWQgaW5jb3JyZWN0IHZhbHVlIiwgRk9PLmVxdWFscyhvYmoyKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJhdmFpbGFibGUgY2F1c2VkIGluY29ycmVjdCByZWFkaW5nIiwgRk9PLmVxdWFscyhvYmoxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJhdmFpbGFibGUgcmV0dXJuZWQgaW5jb3JyZWN0IHZhbHVlIiwgRk9PLmVxdWFscyhvYmoyKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgb2JqZWN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmFibGUgdG8gcmVhZCBPYmplY3QgdHlwZSA6ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVycik7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgb2JqZWN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gcmVhZCBPYmplY3QgdHlwZSA6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVycik7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCB0X01peFByaW1pdGl2ZXNBbmRPYmplY3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWludCBpID0gNzsKLQkJU3RyaW5nIHMxID0gInN0cmluZyAxIjsKLQkJU3RyaW5nIHMyID0gInN0cmluZyAyIjsKLQkJYnl0ZVtdIGJ5dGVzID0geyAxLCAyLCAzIH07CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwcm90ZWN0ZWQgdm9pZCB0X01peFByaW1pdGl2ZXNBbmRPYmplY3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpID0gNzsKKyAgICAgICAgU3RyaW5nIHMxID0gInN0cmluZyAxIjsKKyAgICAgICAgU3RyaW5nIHMyID0gInN0cmluZyAyIjsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0geyAxLCAyLCAzIH07CiAKLQkJb29zLndyaXRlSW50KGkpOwotCQlvb3Mud3JpdGVPYmplY3QoczEpOwotCQlvb3Mud3JpdGVVVEYoczIpOwotCQlvb3Mud3JpdGVPYmplY3QoYnl0ZXMpOwotCQlvb3MuY2xvc2UoKTsKLQkJdHJ5IHsKLQkJCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICBvb3Mud3JpdGVJbnQoaSk7CisgICAgICAgIG9vcy53cml0ZU9iamVjdChzMSk7CisgICAgICAgIG9vcy53cml0ZVVURihzMik7CisgICAgICAgIG9vcy53cml0ZU9iamVjdChieXRlcyk7CisgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7CiAKLQkJCWludCBqID0gb2lzLnJlYWRJbnQoKTsKLQkJCWFzc2VydFRydWUoIldyb25nIGludCA6IiArIGosIGkgPT0gaik7CisgICAgICAgICAgICBpbnQgaiA9IG9pcy5yZWFkSW50KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBpbnQgOiIgKyBqLCBpID09IGopOwogCi0JCQlTdHJpbmcgbDEgPSAoU3RyaW5nKSBvaXMucmVhZE9iamVjdCgpOwotCQkJYXNzZXJ0VHJ1ZSgiV3Jvbmcgb2JqIFN0cmluZyA6IiArIGwxLCBzMS5lcXVhbHMobDEpKTsKKyAgICAgICAgICAgIFN0cmluZyBsMSA9IChTdHJpbmcpIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBvYmogU3RyaW5nIDoiICsgbDEsIHMxLmVxdWFscyhsMSkpOwogCi0JCQlTdHJpbmcgbDIgPSAoU3RyaW5nKSBvaXMucmVhZFVURigpOwotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgVVRGIFN0cmluZyA6IiArIGwyLCBzMi5lcXVhbHMobDIpKTsKKyAgICAgICAgICAgIFN0cmluZyBsMiA9IChTdHJpbmcpIG9pcy5yZWFkVVRGKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBVVEYgU3RyaW5nIDoiICsgbDIsIHMyLmVxdWFscyhsMikpOwogCi0JCQlieXRlW10gYnl0ZXMyID0gKGJ5dGVbXSkgb2lzLnJlYWRPYmplY3QoKTsKLQkJCWFzc2VydFRydWUoIldyb25nIGJ5dGVbXSIsIEFycmF5cy5lcXVhbHMoYnl0ZXMsIGJ5dGVzMikpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzMiA9IChieXRlW10pIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBieXRlW10iLCBBcnJheXMuZXF1YWxzKGJ5dGVzLCBieXRlczIpKTsKIAotCQl9IGZpbmFsbHkgewotCQkJb2lzLmNsb3NlKCk7Ci0JCX0KLQl9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfcmVzb2x2ZUNsYXNzKCkgewotCQl0cnkgewotCQkJb29zLndyaXRlT2JqZWN0KG5ldyBPYmplY3RbXSB7IEludGVnZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKDEpIH0pOwotCQkJb29zLmNsb3NlKCk7CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc29sdmVDbGFzcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChuZXcgT2JqZWN0W10geyBJbnRlZ2VyLmNsYXNzLCBuZXcgSW50ZWdlcigxKSB9KTsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOwogCi0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW1TdWJjbGFzcyhsb2FkU3RyZWFtKCkpOwotCQkJb2lzLnJlYWRPYmplY3QoKTsKLQkJCW9pcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gOiAiICsgZTEuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiA6ICIgKyBlMi5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW1TdWJjbGFzcyhsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gOiAiICsgZTEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiA6ICIgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CiAKLQkJQ2xhc3NbXSByZXNvbHZlZENsYXNzZXMgPSAoKE9iamVjdElucHV0U3RyZWFtU3ViY2xhc3MpIG9pcykKLQkJCQkucmVzb2x2ZWRDbGFzc2VzKCk7Ci0JCWFzc2VydEVxdWFscygibWlzc2luZyByZXNvbHZlZCIsIDMsIHJlc29sdmVkQ2xhc3Nlcy5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJyZXNvbHZlZCBjbGFzcyAxIiwgcmVzb2x2ZWRDbGFzc2VzWzBdID09IE9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZSgicmVzb2x2ZWQgY2xhc3MgMiIsIHJlc29sdmVkQ2xhc3Nlc1sxXSA9PSBJbnRlZ2VyLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZSgicmVzb2x2ZWQgY2xhc3MgMyIsIHJlc29sdmVkQ2xhc3Nlc1syXSA9PSBOdW1iZXIuY2xhc3MpOwotCX0KKyAgICAgICAgQ2xhc3NbXSByZXNvbHZlZENsYXNzZXMgPSAoKE9iamVjdElucHV0U3RyZWFtU3ViY2xhc3MpIG9pcykKKyAgICAgICAgICAgICAgICAucmVzb2x2ZWRDbGFzc2VzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygibWlzc2luZyByZXNvbHZlZCIsIDMsIHJlc29sdmVkQ2xhc3Nlcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRUcnVlKCJyZXNvbHZlZCBjbGFzcyAxIiwgcmVzb2x2ZWRDbGFzc2VzWzBdID09IE9iamVjdFtdLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVzb2x2ZWQgY2xhc3MgMiIsIHJlc29sdmVkQ2xhc3Nlc1sxXSA9PSBJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVzb2x2ZWQgY2xhc3MgMyIsIHJlc29sdmVkQ2xhc3Nlc1syXSA9PSBOdW1iZXIuY2xhc3MpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB7Ci0JCXRyeSB7Ci0JCQlvb3MucmVzZXQoKTsKLQkJCW9vcy53cml0ZU9iamVjdCgiUiIpOwotCQkJb29zLnJlc2V0KCk7Ci0JCQlvb3Mud3JpdGVCeXRlKDI0KTsKLQkJCW9vcy5jbG9zZSgpOworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy5yZXNldCgpOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KCJSIik7CisgICAgICAgICAgICBvb3MucmVzZXQoKTsKKyAgICAgICAgICAgIG9vcy53cml0ZUJ5dGUoMjQpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CiAKLQkJCURhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQlieXRlW10gaW5wdXQgPSBuZXcgYnl0ZVtkaXMuYXZhaWxhYmxlKCldOwotCQkJZGlzLnJlYWRGdWxseShpbnB1dCk7Ci0JCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweGFjLCAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDAsCi0JCQkJCShieXRlKSA1LCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4NzQsIChieXRlKSAwLCAoYnl0ZSkgMSwKLQkJCQkJKGJ5dGUpICdSJywgKGJ5dGUpIDB4NzksIChieXRlKSAweDc3LCAoYnl0ZSkgMSwgKGJ5dGUpIDI0IH07Ci0JCQlhc3NlcnRUcnVlKCJpbmNvcnJlY3Qgb3V0cHV0IiwgQXJyYXlzLmVxdWFscyhpbnB1dCwgcmVzdWx0KSk7CisgICAgICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgYnl0ZVtdIGlucHV0ID0gbmV3IGJ5dGVbZGlzLmF2YWlsYWJsZSgpXTsKKyAgICAgICAgICAgIGRpcy5yZWFkRnVsbHkoaW5wdXQpOworICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4ZWQsIChieXRlKSAwLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgNSwgKGJ5dGUpIDB4NzksIChieXRlKSAweDc0LCAoYnl0ZSkgMCwgKGJ5dGUpIDEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAnUicsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDEsIChieXRlKSAyNCB9OworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IG91dHB1dCIsIEFycmF5cy5lcXVhbHMoaW5wdXQsIHJlc3VsdCkpOwogCi0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW1TdWJjbGFzcyhsb2FkU3RyZWFtKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyByZXN1bHQgZnJvbSByZWFkT2JqZWN0KCkiLCAiUiIsIG9pcy5yZWFkT2JqZWN0KCkKLQkJCQkJKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgcmVzdWx0IGZyb20gcmVhZEJ5dGUoKSIsIDI0LCBvaXMucmVhZEJ5dGUoKSk7Ci0JCQlvaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTIpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gOiAiICsgZTIuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbVN1YmNsYXNzKGxvYWRTdHJlYW0oKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHJlc3VsdCBmcm9tIHJlYWRPYmplY3QoKSIsICJSIiwgb2lzLnJlYWRPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyByZXN1bHQgZnJvbSByZWFkQnl0ZSgpIiwgMjQsIG9pcy5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gOiAiICsgZTEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiA6ICIgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF9zZXJpYWxWZXJzaW9uVUlEKENsYXNzIGNsYXp6LCBsb25nIHN2VUlEKSB7Ci0JCWZpbmFsIFN0cmluZyBpZFdyb25nID0gInNlcmlhbFZlcnNpb25VSUQgaXMgd3JvbmcgZm9yOiAiOwotCQlsb25nIHJlZmxlY3RlZFN2VUlEID0gMEw7Ci0JCXRyeSB7Ci0JCQlyZWZsZWN0ZWRTdlVJRCA9IGNsYXp6LmdldEZpZWxkKCJzZXJpYWxWZXJzaW9uVUlEIikuZ2V0TG9uZyhudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuYWJsZSB0byBkZXRlcm1pbmUgc2VyaWFsVmVyc2lvblVJRCBvZiAiICsgY2xhenopOwotCQl9Ci0JCWFzc2VydFRydWUoaWRXcm9uZyArIGNsYXp6ICsgIjogIiArIHJlZmxlY3RlZFN2VUlEICsgIiBkb2VzIG5vdCBlcXVhbCAiCi0JCQkJKyBzdlVJRCwgcmVmbGVjdGVkU3ZVSUQgPT0gc3ZVSUQpOwotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VyaWFsVmVyc2lvblVJRChDbGFzcyBjbGF6eiwgbG9uZyBzdlVJRCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaWRXcm9uZyA9ICJzZXJpYWxWZXJzaW9uVUlEIGlzIHdyb25nIGZvcjogIjsKKyAgICAgICAgbG9uZyByZWZsZWN0ZWRTdlVJRCA9IDBMOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVmbGVjdGVkU3ZVSUQgPSBjbGF6ei5nZXRGaWVsZCgic2VyaWFsVmVyc2lvblVJRCIpLmdldExvbmcobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHNlcmlhbFZlcnNpb25VSUQgb2YgIiArIGNsYXp6KTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGlkV3JvbmcgKyBjbGF6eiArICI6ICIgKyByZWZsZWN0ZWRTdlVJRCArICIgZG9lcyBub3QgZXF1YWwgIgorICAgICAgICAgICAgICAgICsgc3ZVSUQsIHJlZmxlY3RlZFN2VUlEID09IHN2VUlEKTsKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNvbHZlT2JqZWN0VGVzdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCU9iamVjdCBmaWVsZDEsIGZpZWxkMjsKLQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb2x2ZU9iamVjdFRlc3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBPYmplY3QgZmllbGQxLCBmaWVsZDI7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtIGV4dGVuZHMgT2JqZWN0SW5wdXRTdHJlYW0gewotCQlSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJc3VwZXIoaW4pOwotCQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtIGV4dGVuZHMgT2JqZWN0SW5wdXRTdHJlYW0geworICAgICAgICBSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoaW4pOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgZW5hYmxlUmVzb2x2ZSgpIHsKLQkJCWVuYWJsZVJlc29sdmVPYmplY3QodHJ1ZSk7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgZW5hYmxlUmVzb2x2ZSgpIHsKKyAgICAgICAgICAgIGVuYWJsZVJlc29sdmVPYmplY3QodHJ1ZSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgT2JqZWN0IHJlc29sdmVPYmplY3QoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZlY3RvcikgLy8gdGVzdF8xX3Jlc29sdmVPYmplY3QoKQotCQkJCXJldHVybiBuZXcgSGFzaHRhYmxlKCk7Ci0JCQllbHNlIGlmICgiYWJjIi5lcXVhbHMob2JqKSkgLy8gdGVzdF8yX3Jlc29sdmVPYmplY3QoKQotCQkJCXJldHVybiAiQUJDIjsKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgLy8gdGVzdF8zX3Jlc29sdmVPYmplY3QoKQotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoKFN0cmluZykgb2JqKS5sZW5ndGgoKSk7Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBpbnRbXSkgLy8gdGVzdF80X3Jlc29sdmVPYmplY3QoKQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzFdOwotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0W10gJiYgKChPYmplY3RbXSkgb2JqKS5sZW5ndGggPT0gMikgLy8gdGVzdF81X3Jlc29sdmVPYmplY3QoKQotCQkJCXJldHVybiBuZXcgY2hhclsxXTsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBPYmplY3QgcmVzb2x2ZU9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVmVjdG9yKSAvLyB0ZXN0XzFfcmVzb2x2ZU9iamVjdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJhYmMiLmVxdWFscyhvYmopKSAvLyB0ZXN0XzJfcmVzb2x2ZU9iamVjdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuICJBQkMiOworICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSAvLyB0ZXN0XzNfcmVzb2x2ZU9iamVjdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKCgoU3RyaW5nKSBvYmopLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIGludFtdKSAvLyB0ZXN0XzRfcmVzb2x2ZU9iamVjdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3RbXSAmJiAoKE9iamVjdFtdKSBvYmopLmxlbmd0aCA9PSAyKSAvLyB0ZXN0XzVfcmVzb2x2ZU9iamVjdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjaGFyWzFdOworICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMV9yZXNvbHZlT2JqZWN0KCkgewotCQl0cnkgewotCQkJUmVzb2x2ZU9iamVjdFRlc3Qgb2JqID0gbmV3IFJlc29sdmVPYmplY3RUZXN0KCk7Ci0JCQlvYmouZmllbGQxID0gbmV3IFZlY3RvcigpOwotCQkJb2JqLmZpZWxkMiA9IG9iai5maWVsZDE7Ci0JCQlvb3Mud3JpdGVPYmplY3Qob2JqKTsKLQkJCW9vcy5jbG9zZSgpOwotCQkJb2lzID0gbmV3IFJlc29sdmVPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOwotCQkJKChSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0pIG9pcykuZW5hYmxlUmVzb2x2ZSgpOwotCQkJUmVzb2x2ZU9iamVjdFRlc3QgcmVzdWx0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gKFJlc29sdmVPYmplY3RUZXN0KSBvaXMucmVhZE9iamVjdCgpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiT2JqZWN0IG5vdCByZXNvbHZlZCIsCi0JCQkJCXJlc3VsdC5maWVsZDEgaW5zdGFuY2VvZiBIYXNodGFibGUpOwotCQkJYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQiLAotCQkJCQlyZXN1bHQuZmllbGQxID09IHJlc3VsdC5maWVsZDIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMV9yZXNvbHZlT2JqZWN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzb2x2ZU9iamVjdFRlc3Qgb2JqID0gbmV3IFJlc29sdmVPYmplY3RUZXN0KCk7CisgICAgICAgICAgICBvYmouZmllbGQxID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgb2JqLmZpZWxkMiA9IG9iai5maWVsZDE7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3Qob2JqKTsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgb2lzID0gbmV3IFJlc29sdmVPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgKChSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0pIG9pcykuZW5hYmxlUmVzb2x2ZSgpOworICAgICAgICAgICAgUmVzb2x2ZU9iamVjdFRlc3QgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFJlc29sdmVPYmplY3RUZXN0KSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0IG5vdCByZXNvbHZlZCIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDEgaW5zdGFuY2VvZiBIYXNodGFibGUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZmllbGQxID09IHJlc3VsdC5maWVsZDIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMl9yZXNvbHZlT2JqZWN0KCkgewotCQl0cnkgewotCQkJUmVzb2x2ZU9iamVjdFRlc3Qgb2JqID0gbmV3IFJlc29sdmVPYmplY3RUZXN0KCk7Ci0JCQlvYmouZmllbGQxID0gImFiYyI7Ci0JCQlvYmouZmllbGQyID0gb2JqLmZpZWxkMTsKLQkJCW9vcy53cml0ZU9iamVjdChvYmopOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQkoKFJlc29sdmVPYmplY3RJbnB1dFN0cmVhbSkgb2lzKS5lbmFibGVSZXNvbHZlKCk7Ci0JCQlSZXNvbHZlT2JqZWN0VGVzdCByZXN1bHQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSAoUmVzb2x2ZU9iamVjdFRlc3QpIG9pcy5yZWFkT2JqZWN0KCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoIlN0cmluZyBub3QgcmVzb2x2ZWQiLCAiQUJDIiwgcmVzdWx0LmZpZWxkMSk7Ci0JCQlhc3NlcnRUcnVlKCJTZWNvbmQgcmVmZXJlbmNlIG5vdCByZXNvbHZlZCIsCi0JCQkJCXJlc3VsdC5maWVsZDEgPT0gcmVzdWx0LmZpZWxkMik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8yX3Jlc29sdmVPYmplY3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNvbHZlT2JqZWN0VGVzdCBvYmogPSBuZXcgUmVzb2x2ZU9iamVjdFRlc3QoKTsKKyAgICAgICAgICAgIG9iai5maWVsZDEgPSAiYWJjIjsKKyAgICAgICAgICAgIG9iai5maWVsZDIgPSBvYmouZmllbGQxOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG9iaik7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgICgoUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtKSBvaXMpLmVuYWJsZVJlc29sdmUoKTsKKyAgICAgICAgICAgIFJlc29sdmVPYmplY3RUZXN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChSZXNvbHZlT2JqZWN0VGVzdCkgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU3RyaW5nIG5vdCByZXNvbHZlZCIsICJBQkMiLCByZXN1bHQuZmllbGQxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCByZWZlcmVuY2Ugbm90IHJlc29sdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpZWxkMSA9PSByZXN1bHQuZmllbGQyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzNfcmVzb2x2ZU9iamVjdCgpIHsKLQkJdHJ5IHsKLQkJCVJlc29sdmVPYmplY3RUZXN0IG9iaiA9IG5ldyBSZXNvbHZlT2JqZWN0VGVzdCgpOwotCQkJY2hhcltdIGxjaGFycyA9IG5ldyBjaGFyWzcwMDAwXTsKLQkJCW9iai5maWVsZDEgPSBuZXcgU3RyaW5nKGxjaGFycyk7Ci0JCQlvYmouZmllbGQyID0gb2JqLmZpZWxkMTsKLQkJCW9vcy53cml0ZU9iamVjdChvYmopOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQkoKFJlc29sdmVPYmplY3RJbnB1dFN0cmVhbSkgb2lzKS5lbmFibGVSZXNvbHZlKCk7Ci0JCQlSZXNvbHZlT2JqZWN0VGVzdCByZXN1bHQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSAoUmVzb2x2ZU9iamVjdFRlc3QpIG9pcy5yZWFkT2JqZWN0KCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJMb25nIFN0cmluZyBub3QgcmVzb2x2ZWQiLCAiNzAwMDAiCi0JCQkJCS5lcXVhbHMocmVzdWx0LmZpZWxkMSkpOwotCQkJYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQiLAotCQkJCQlyZXN1bHQuZmllbGQxID09IHJlc3VsdC5maWVsZDIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfM19yZXNvbHZlT2JqZWN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzb2x2ZU9iamVjdFRlc3Qgb2JqID0gbmV3IFJlc29sdmVPYmplY3RUZXN0KCk7CisgICAgICAgICAgICBjaGFyW10gbGNoYXJzID0gbmV3IGNoYXJbNzAwMDBdOworICAgICAgICAgICAgb2JqLmZpZWxkMSA9IG5ldyBTdHJpbmcobGNoYXJzKTsKKyAgICAgICAgICAgIG9iai5maWVsZDIgPSBvYmouZmllbGQxOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG9iaik7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgICgoUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtKSBvaXMpLmVuYWJsZVJlc29sdmUoKTsKKyAgICAgICAgICAgIFJlc29sdmVPYmplY3RUZXN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChSZXNvbHZlT2JqZWN0VGVzdCkgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkxvbmcgU3RyaW5nIG5vdCByZXNvbHZlZCIsICI3MDAwMCIKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhyZXN1bHQuZmllbGQxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgcmVmZXJlbmNlIG5vdCByZXNvbHZlZCIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDEgPT0gcmVzdWx0LmZpZWxkMik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF80X3Jlc29sdmVPYmplY3QoKSB7Ci0JCXRyeSB7Ci0JCQlSZXNvbHZlT2JqZWN0VGVzdCBvYmogPSBuZXcgUmVzb2x2ZU9iamVjdFRlc3QoKTsKLQkJCW9iai5maWVsZDEgPSBuZXcgaW50WzVdOwotCQkJb2JqLmZpZWxkMiA9IG9iai5maWVsZDE7Ci0JCQlvb3Mud3JpdGVPYmplY3Qob2JqKTsKLQkJCW9vcy5jbG9zZSgpOwotCQkJb2lzID0gbmV3IFJlc29sdmVPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOwotCQkJKChSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0pIG9pcykuZW5hYmxlUmVzb2x2ZSgpOwotCQkJUmVzb2x2ZU9iamVjdFRlc3QgcmVzdWx0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gKFJlc29sdmVPYmplY3RUZXN0KSBvaXMucmVhZE9iamVjdCgpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJQ2xhc3MgY2wgPSBuZXcgT2JqZWN0WzBdLmdldENsYXNzKCk7Ci0JCQlhc3NlcnRUcnVlKCJpbnRbXSBub3QgcmVzb2x2ZWQiLCByZXN1bHQuZmllbGQxLmdldENsYXNzKCkgPT0gY2wpOwotCQkJYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQiLAotCQkJCQlyZXN1bHQuZmllbGQxID09IHJlc3VsdC5maWVsZDIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfNF9yZXNvbHZlT2JqZWN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzb2x2ZU9iamVjdFRlc3Qgb2JqID0gbmV3IFJlc29sdmVPYmplY3RUZXN0KCk7CisgICAgICAgICAgICBvYmouZmllbGQxID0gbmV3IGludFs1XTsKKyAgICAgICAgICAgIG9iai5maWVsZDIgPSBvYmouZmllbGQxOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG9iaik7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgICgoUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtKSBvaXMpLmVuYWJsZVJlc29sdmUoKTsKKyAgICAgICAgICAgIFJlc29sdmVPYmplY3RUZXN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChSZXNvbHZlT2JqZWN0VGVzdCkgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzIGNsID0gbmV3IE9iamVjdFswXS5nZXRDbGFzcygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW50W10gbm90IHJlc29sdmVkIiwgcmVzdWx0LmZpZWxkMS5nZXRDbGFzcygpID09IGNsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCByZWZlcmVuY2Ugbm90IHJlc29sdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpZWxkMSA9PSByZXN1bHQuZmllbGQyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzVfcmVzb2x2ZU9iamVjdCgpIHsKLQkJdHJ5IHsKLQkJCVJlc29sdmVPYmplY3RUZXN0IG9iaiA9IG5ldyBSZXNvbHZlT2JqZWN0VGVzdCgpOwotCQkJb2JqLmZpZWxkMSA9IG5ldyBPYmplY3RbMl07Ci0JCQlvYmouZmllbGQyID0gb2JqLmZpZWxkMTsKLQkJCW9vcy53cml0ZU9iamVjdChvYmopOwotCQkJb29zLmNsb3NlKCk7Ci0JCQlvaXMgPSBuZXcgUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQkoKFJlc29sdmVPYmplY3RJbnB1dFN0cmVhbSkgb2lzKS5lbmFibGVSZXNvbHZlKCk7Ci0JCQlSZXNvbHZlT2JqZWN0VGVzdCByZXN1bHQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSAoUmVzb2x2ZU9iamVjdFRlc3QpIG9pcy5yZWFkT2JqZWN0KCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlDbGFzcyBjbCA9IG5ldyBjaGFyWzBdLmdldENsYXNzKCk7Ci0JCQlhc3NlcnRUcnVlKCJpbnRbXSBub3QgcmVzb2x2ZWQiLCByZXN1bHQuZmllbGQxLmdldENsYXNzKCkgPT0gY2wpOwotCQkJYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQiLAotCQkJCQlyZXN1bHQuZmllbGQxID09IHJlc3VsdC5maWVsZDIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfNV9yZXNvbHZlT2JqZWN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzb2x2ZU9iamVjdFRlc3Qgb2JqID0gbmV3IFJlc29sdmVPYmplY3RUZXN0KCk7CisgICAgICAgICAgICBvYmouZmllbGQxID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgICAgIG9iai5maWVsZDIgPSBvYmouZmllbGQxOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG9iaik7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBSZXNvbHZlT2JqZWN0SW5wdXRTdHJlYW0obG9hZFN0cmVhbSgpKTsKKyAgICAgICAgICAgICgoUmVzb2x2ZU9iamVjdElucHV0U3RyZWFtKSBvaXMpLmVuYWJsZVJlc29sdmUoKTsKKyAgICAgICAgICAgIFJlc29sdmVPYmplY3RUZXN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChSZXNvbHZlT2JqZWN0VGVzdCkgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzIGNsID0gbmV3IGNoYXJbMF0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImludFtdIG5vdCByZXNvbHZlZCIsIHJlc3VsdC5maWVsZDEuZ2V0Q2xhc3MoKSA9PSBjbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgcmVmZXJlbmNlIG5vdCByZXNvbHZlZCIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDEgPT0gcmVzdWx0LmZpZWxkMik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0Jc3RhdGljIGNsYXNzIFdyaXRlUmVwbGFjZVRlc3RBIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgUmVhZFJlc29sdmVUZXN0QigpOwotCQl9Ci0JfQorICAgIHN0YXRpYyBjbGFzcyBXcml0ZVJlcGxhY2VUZXN0QSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlYWRSZXNvbHZlVGVzdEIoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBXcml0ZVJlcGxhY2VUZXN0QiBleHRlbmRzIFdyaXRlUmVwbGFjZVRlc3RBIHsKLQl9CisgICAgc3RhdGljIGNsYXNzIFdyaXRlUmVwbGFjZVRlc3RCIGV4dGVuZHMgV3JpdGVSZXBsYWNlVGVzdEEgeworICAgIH0KIAotCXN0YXRpYyBjbGFzcyBXcml0ZVJlcGxhY2VUZXN0QyBleHRlbmRzIFdyaXRlUmVwbGFjZVRlc3RBIHsKLQkJcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgUmVhZFJlc29sdmVUZXN0QygpOwotCQl9Ci0JfQorICAgIHN0YXRpYyBjbGFzcyBXcml0ZVJlcGxhY2VUZXN0QyBleHRlbmRzIFdyaXRlUmVwbGFjZVRlc3RBIHsKKyAgICAgICAgcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVhZFJlc29sdmVUZXN0QygpOworICAgICAgICB9CisgICAgfQogCi0Jc3RhdGljIGNsYXNzIFdyaXRlUmVwbGFjZVRlc3REIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRSZXNvbHZlVGVzdEQoKTsKLQkJfQotCX0KKyAgICBzdGF0aWMgY2xhc3MgV3JpdGVSZXBsYWNlVGVzdEQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVhZFJlc29sdmVUZXN0RCgpOworICAgICAgICB9CisgICAgfQogCi0Jc3RhdGljIGNsYXNzIFdyaXRlUmVwbGFjZVRlc3RFIGV4dGVuZHMgV3JpdGVSZXBsYWNlVGVzdEQgewotCX0KKyAgICBzdGF0aWMgY2xhc3MgV3JpdGVSZXBsYWNlVGVzdEUgZXh0ZW5kcyBXcml0ZVJlcGxhY2VUZXN0RCB7CisgICAgfQogCi0Jc3RhdGljIGNsYXNzIFdyaXRlUmVwbGFjZVRlc3RGIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJaW50IHR5cGUsIHJlYWRUeXBlOworICAgIHN0YXRpYyBjbGFzcyBXcml0ZVJlcGxhY2VUZXN0RiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIGludCB0eXBlLCByZWFkVHlwZTsKIAotCQlwdWJsaWMgV3JpdGVSZXBsYWNlVGVzdEYoaW50IHR5cGUsIGludCByZWFkVHlwZSkgewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMucmVhZFR5cGUgPSByZWFkVHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgV3JpdGVSZXBsYWNlVGVzdEYoaW50IHR5cGUsIGludCByZWFkVHlwZSkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMucmVhZFR5cGUgPSByZWFkVHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgMDoKLQkJCQl0aHJvdyBuZXcgSW52YWxpZE9iamVjdEV4Y2VwdGlvbigiaW52YWxpZCIpOwotCQkJY2FzZSAxOgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJydW50aW1lIik7Ci0JCQljYXNlIDI6Ci0JCQkJdGhyb3cgbmV3IEVycm9yKCJlcnJvciIpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbmV3IFJlYWRSZXNvbHZlVGVzdEUocmVhZFR5cGUpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPYmplY3RFeGNlcHRpb24oImludmFsaWQiKTsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicnVudGltZSIpOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiZXJyb3IiKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWFkUmVzb2x2ZVRlc3RFKHJlYWRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBSZWFkUmVzb2x2ZVRlc3RBIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBSZWFkUmVzb2x2ZVRlc3RBKCk7Ci0JCX0KLQl9CisgICAgc3RhdGljIGNsYXNzIFJlYWRSZXNvbHZlVGVzdEEgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlYWRSZXNvbHZlVGVzdEEoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBSZWFkUmVzb2x2ZVRlc3RCIGV4dGVuZHMgUmVhZFJlc29sdmVUZXN0QSB7Ci0JfQorICAgIHN0YXRpYyBjbGFzcyBSZWFkUmVzb2x2ZVRlc3RCIGV4dGVuZHMgUmVhZFJlc29sdmVUZXN0QSB7CisgICAgfQogCi0Jc3RhdGljIGNsYXNzIFJlYWRSZXNvbHZlVGVzdEMgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBSZWFkUmVzb2x2ZVRlc3RCKCk7Ci0JCX0KLQl9CisgICAgc3RhdGljIGNsYXNzIFJlYWRSZXNvbHZlVGVzdEMgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWFkUmVzb2x2ZVRlc3RCKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlzdGF0aWMgY2xhc3MgUmVhZFJlc29sdmVUZXN0RCBleHRlbmRzIFJlYWRSZXNvbHZlVGVzdEMgewotCX0KKyAgICBzdGF0aWMgY2xhc3MgUmVhZFJlc29sdmVUZXN0RCBleHRlbmRzIFJlYWRSZXNvbHZlVGVzdEMgeworICAgIH0KIAotCXN0YXRpYyBjbGFzcyBSZWFkUmVzb2x2ZVRlc3RFIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJaW50IHR5cGU7CisgICAgc3RhdGljIGNsYXNzIFJlYWRSZXNvbHZlVGVzdEUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBpbnQgdHlwZTsKIAotCQlwdWJsaWMgUmVhZFJlc29sdmVUZXN0RShpbnQgdHlwZSkgewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgUmVhZFJlc29sdmVUZXN0RShpbnQgdHlwZSkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSAwOgotCQkJCXRocm93IG5ldyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uKCJpbnZhbGlkIik7Ci0JCQljYXNlIDE6Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInJ1bnRpbWUiKTsKLQkJCWNhc2UgMjoKLQkJCQl0aHJvdyBuZXcgRXJyb3IoImVycm9yIik7Ci0JCQljYXNlIDM6Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBuZXcgUmVhZFJlc29sdmVUZXN0RigpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9iamVjdEV4Y2VwdGlvbigiaW52YWxpZCIpOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJydW50aW1lIik7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJlcnJvciIpOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlYWRSZXNvbHZlVGVzdEYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBSZWFkUmVzb2x2ZVRlc3RGIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQl9CisgICAgc3RhdGljIGNsYXNzIFJlYWRSZXNvbHZlVGVzdEYgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMV93cml0ZVJlcGxhY2UoKSB7Ci0JCXRyeSB7Ci0JCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJCXYuYWRkRWxlbWVudChuZXcgV3JpdGVSZXBsYWNlVGVzdEEoKSk7Ci0JCQl2LmFkZEVsZW1lbnQobmV3IFdyaXRlUmVwbGFjZVRlc3RCKCkpOwotCQkJdi5hZGRFbGVtZW50KG5ldyBXcml0ZVJlcGxhY2VUZXN0QigpKTsKLQkJCXYuYWRkRWxlbWVudChuZXcgV3JpdGVSZXBsYWNlVGVzdEMoKSk7Ci0JCQl2LmFkZEVsZW1lbnQobmV3IFdyaXRlUmVwbGFjZVRlc3REKCkpOwotCQkJdi5hZGRFbGVtZW50KG5ldyBXcml0ZVJlcGxhY2VUZXN0RSgpKTsKLQkJCW9vcy53cml0ZU9iamVjdCh2KTsKLQkJCW9vcy5jbG9zZSgpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQlWZWN0b3IgcmVzdWx0ID0gKFZlY3Rvcikgb2lzLnJlYWRPYmplY3QoKTsKLQkJCWFzc2VydFRydWUoImludmFsaWQgMCA6ICIgKyByZXN1bHQuZWxlbWVudEF0KDApLCByZXN1bHQKLQkJCQkJLmVsZW1lbnRBdCgwKS5nZXRDbGFzcygpID09IFJlYWRSZXNvbHZlVGVzdEEuY2xhc3MpOwotCQkJYXNzZXJ0VHJ1ZSgiaW52YWxpZCAxIDogIiArIHJlc3VsdC5lbGVtZW50QXQoMSksIHJlc3VsdAotCQkJCQkuZWxlbWVudEF0KDEpLmdldENsYXNzKCkgPT0gUmVhZFJlc29sdmVUZXN0QS5jbGFzcyk7Ci0JCQlhc3NlcnRUcnVlKCJpbnZhbGlkIDIgOiAiICsgcmVzdWx0LmVsZW1lbnRBdCgyKSwgcmVzdWx0Ci0JCQkJCS5lbGVtZW50QXQoMikuZ2V0Q2xhc3MoKSA9PSBSZWFkUmVzb2x2ZVRlc3RBLmNsYXNzKTsKLQkJCWFzc2VydFRydWUoImludmFsaWQgMyA6ICIgKyByZXN1bHQuZWxlbWVudEF0KDMpLCByZXN1bHQKLQkJCQkJLmVsZW1lbnRBdCgzKS5nZXRDbGFzcygpID09IFJlYWRSZXNvbHZlVGVzdEIuY2xhc3MpOwotCQkJYXNzZXJ0VHJ1ZSgiaW52YWxpZCA0IDogIiArIHJlc3VsdC5lbGVtZW50QXQoNCksIHJlc3VsdAotCQkJCQkuZWxlbWVudEF0KDQpLmdldENsYXNzKCkgPT0gUmVhZFJlc29sdmVUZXN0RC5jbGFzcyk7Ci0JCQlhc3NlcnRUcnVlKCJpbnZhbGlkIDUgOiAiICsgcmVzdWx0LmVsZW1lbnRBdCg1KSwgcmVzdWx0Ci0JCQkJCS5lbGVtZW50QXQoNSkuZ2V0Q2xhc3MoKSA9PSBXcml0ZVJlcGxhY2VUZXN0RS5jbGFzcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzFfd3JpdGVSZXBsYWNlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQobmV3IFdyaXRlUmVwbGFjZVRlc3RBKCkpOworICAgICAgICAgICAgdi5hZGRFbGVtZW50KG5ldyBXcml0ZVJlcGxhY2VUZXN0QigpKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChuZXcgV3JpdGVSZXBsYWNlVGVzdEIoKSk7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQobmV3IFdyaXRlUmVwbGFjZVRlc3RDKCkpOworICAgICAgICAgICAgdi5hZGRFbGVtZW50KG5ldyBXcml0ZVJlcGxhY2VUZXN0RCgpKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChuZXcgV3JpdGVSZXBsYWNlVGVzdEUoKSk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3Qodik7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgVmVjdG9yIHJlc3VsdCA9IChWZWN0b3IpIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJpbnZhbGlkIDAgOiAiICsgcmVzdWx0LmVsZW1lbnRBdCgwKSwgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgIC5lbGVtZW50QXQoMCkuZ2V0Q2xhc3MoKSA9PSBSZWFkUmVzb2x2ZVRlc3RBLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImludmFsaWQgMSA6ICIgKyByZXN1bHQuZWxlbWVudEF0KDEpLCByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgLmVsZW1lbnRBdCgxKS5nZXRDbGFzcygpID09IFJlYWRSZXNvbHZlVGVzdEEuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW52YWxpZCAyIDogIiArIHJlc3VsdC5lbGVtZW50QXQoMiksIHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudEF0KDIpLmdldENsYXNzKCkgPT0gUmVhZFJlc29sdmVUZXN0QS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJpbnZhbGlkIDMgOiAiICsgcmVzdWx0LmVsZW1lbnRBdCgzKSwgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgIC5lbGVtZW50QXQoMykuZ2V0Q2xhc3MoKSA9PSBSZWFkUmVzb2x2ZVRlc3RCLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImludmFsaWQgNCA6ICIgKyByZXN1bHQuZWxlbWVudEF0KDQpLCByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgLmVsZW1lbnRBdCg0KS5nZXRDbGFzcygpID09IFJlYWRSZXNvbHZlVGVzdEQuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW52YWxpZCA1IDogIiArIHJlc3VsdC5lbGVtZW50QXQoNSksIHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudEF0KDUpLmdldENsYXNzKCkgPT0gV3JpdGVSZXBsYWNlVGVzdEUuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8yX3dyaXRlUmVwbGFjZSgpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCW9vcy53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlVGVzdEYoMCwgLTEpKTsKLQkJCX0gY2F0Y2ggKE9iamVjdFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJCWFzc2VydFRydWUoIlNob3VsZCB0aHJvdyBPYmplY3RTdHJlYW1FeGNlcHRpb24iLCBleGNlcHRpb24pOwotCQkJZXhjZXB0aW9uID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCW9vcy53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlVGVzdEYoMSwgLTEpKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJTaG91bGQgdGhyb3cgUnVudGltZUV4Y2VwdGlvbiIsIGV4Y2VwdGlvbik7Ci0JCQlleGNlcHRpb24gPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJb29zLndyaXRlT2JqZWN0KG5ldyBXcml0ZVJlcGxhY2VUZXN0RigyLCAtMSkpOwotCQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJTaG91bGQgdGhyb3cgRXJyb3IiLCBleGNlcHRpb24pOworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8yX3dyaXRlUmVwbGFjZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlVGVzdEYoMCwgLTEpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9iamVjdFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCB0aHJvdyBPYmplY3RTdHJlYW1FeGNlcHRpb24iLCBleGNlcHRpb24pOworICAgICAgICAgICAgZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlVGVzdEYoMSwgLTEpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgdGhyb3cgUnVudGltZUV4Y2VwdGlvbiIsIGV4Y2VwdGlvbik7CisgICAgICAgICAgICBleGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG5ldyBXcml0ZVJlcGxhY2VUZXN0RigyLCAtMSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgdGhyb3cgRXJyb3IiLCBleGNlcHRpb24pOwogCi0JCQlvb3Mud3JpdGVPYmplY3QobmV3IFdyaXRlUmVwbGFjZVRlc3RGKDMsIDApKTsKLQkJCW9vcy53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlVGVzdEYoMywgMSkpOwotCQkJb29zLndyaXRlT2JqZWN0KG5ldyBXcml0ZVJlcGxhY2VUZXN0RigzLCAyKSk7Ci0JCQlXcml0ZVJlcGxhY2VUZXN0RiB0ZXN0ID0gbmV3IFdyaXRlUmVwbGFjZVRlc3RGKDMsIDMpOwotCQkJb29zLndyaXRlT2JqZWN0KHRlc3QpOwotCQkJb29zLndyaXRlT2JqZWN0KHRlc3QpOwotCQkJV3JpdGVSZXBsYWNlVGVzdEYgdGVzdDIgPSBuZXcgV3JpdGVSZXBsYWNlVGVzdEYoMywgNCk7Ci0JCQlvb3Mud3JpdGVPYmplY3QodGVzdDIpOwotCQkJb29zLndyaXRlT2JqZWN0KHRlc3QyKTsKLQkJCW9vcy5jbG9zZSgpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGxvYWRTdHJlYW0oKSk7Ci0JCQl0cnkgewotCQkJCW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQl9IGNhdGNoIChXcml0ZUFib3J0ZWRFeGNlcHRpb24gZSkgewotCQkJfQorICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG5ldyBXcml0ZVJlcGxhY2VUZXN0RigzLCAwKSk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QobmV3IFdyaXRlUmVwbGFjZVRlc3RGKDMsIDEpKTsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChuZXcgV3JpdGVSZXBsYWNlVGVzdEYoMywgMikpOworICAgICAgICAgICAgV3JpdGVSZXBsYWNlVGVzdEYgdGVzdCA9IG5ldyBXcml0ZVJlcGxhY2VUZXN0RigzLCAzKTsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdCh0ZXN0KTsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdCh0ZXN0KTsKKyAgICAgICAgICAgIFdyaXRlUmVwbGFjZVRlc3RGIHRlc3QyID0gbmV3IFdyaXRlUmVwbGFjZVRlc3RGKDMsIDQpOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KHRlc3QyKTsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdCh0ZXN0Mik7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShsb2FkU3RyZWFtKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoV3JpdGVBYm9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KIAotCQkJZXhjZXB0aW9uID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQl9IGNhdGNoIChPYmplY3RTdHJlYW1FeGNlcHRpb24gZSkgewotCQkJCWV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBPYmplY3RTdHJlYW1FeGNlcHRpb24iLCBleGNlcHRpb24pOwotCQkJZXhjZXB0aW9uID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlleGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiIsIGV4Y2VwdGlvbik7Ci0JCQlleGNlcHRpb24gPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJb2lzLnJlYWRPYmplY3QoKTsKLQkJCX0gY2F0Y2ggKEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgRXJyb3IiLCBleGNlcHRpb24pOworICAgICAgICAgICAgZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChPYmplY3RTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBPYmplY3RTdHJlYW1FeGNlcHRpb24iLCBleGNlcHRpb24pOworICAgICAgICAgICAgZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiIsIGV4Y2VwdGlvbik7CisgICAgICAgICAgICBleGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgRXJyb3IiLCBleGNlcHRpb24pOwogCi0JCQlPYmplY3QgcmVhZEUxID0gb2lzLnJlYWRPYmplY3QoKTsKLQkJCU9iamVjdCByZWFkRTIgPSBvaXMucmVhZE9iamVjdCgpOwotCQkJYXNzZXJ0VHJ1ZSgiUmVwbGFjZWQgb2JqZWN0cyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgcmVhZEUxID09IHJlYWRFMik7Ci0JCQlPYmplY3QgcmVhZEYxID0gb2lzLnJlYWRPYmplY3QoKTsKLQkJCU9iamVjdCByZWFkRjIgPSBvaXMucmVhZE9iamVjdCgpOwotCQkJYXNzZXJ0VHJ1ZSgiUmVwbGFjZWQgcmVzb2x2ZWQgb2JqZWN0cyBzaG91bGQgYmUgaWRlbnRpY2FsOiAiCi0JCQkJCSsgcmVhZEYxICsgIiAiICsgcmVhZEYyLCByZWFkRjEgPT0gcmVhZEYyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAgICAgICAgIE9iamVjdCByZWFkRTEgPSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgT2JqZWN0IHJlYWRFMiA9IG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXBsYWNlZCBvYmplY3RzIHNob3VsZCBiZSBpZGVudGljYWwiLCByZWFkRTEgPT0gcmVhZEUyKTsKKyAgICAgICAgICAgIE9iamVjdCByZWFkRjEgPSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgT2JqZWN0IHJlYWRGMiA9IG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXBsYWNlZCByZXNvbHZlZCBvYmplY3RzIHNob3VsZCBiZSBpZGVudGljYWw6ICIKKyAgICAgICAgICAgICAgICAgICAgKyByZWFkRjEgKyAiICIgKyByZWFkRjIsIHJlYWRGMSA9PSByZWFkRjIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0MS5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0MS5qYXZhCmluZGV4IDIyYzg4MWMuLmRhZmRmOGQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TZXJpYWxpemF0aW9uU3RyZXNzVGVzdDEuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QxLmphdmEKQEAgLTE2LDE2MzEgKzE2LDIwMDYgQEAKICAqLwogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU2VyaWFsaXphYmxlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDEgZXh0ZW5kcyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdCB7CiAKLQkvLyBUaGUgcHVycG9zZSBvZiB0aGVzZSB0d28gY2xhc3NlcyBpcyB0byB0ZXN0IGlmIHNlcmlhbGl6YXRpb24sIHdoZW4KLQkvLyBsb2FkaW5nLCBydW5zIHRoZSBvYmplY3QncyBjb25zdHJ1Y3RvciAod3JvbmcpIG9yIHRoZSBjb25zdHJ1Y3RvciBkZWZpbmVkCi0JLy8gYXQgdGhlIHRvcG1vc3QgU2VyaWFsaXphYmxlIHN1cGVyY2xhc3MoY29ycmVjdCkuCi0Jc3RhdGljIGZpbmFsIGludCBJTklUX0lOVF9WQUxVRSA9IDc7CisgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhlc2UgdHdvIGNsYXNzZXMgaXMgdG8gdGVzdCBpZiBzZXJpYWxpemF0aW9uLCB3aGVuCisgICAgLy8gbG9hZGluZywgcnVucyB0aGUgb2JqZWN0J3MgY29uc3RydWN0b3IgKHdyb25nKSBvciB0aGUgY29uc3RydWN0b3IgZGVmaW5lZAorICAgIC8vIGF0IHRoZSB0b3Btb3N0IFNlcmlhbGl6YWJsZSBzdXBlcmNsYXNzKGNvcnJlY3QpLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5JVF9JTlRfVkFMVUUgPSA3OwogCi0JLy8gSEFTIHRvIGJlIHN0YXRpYyBjbGFzcyBzbyB0aGF0IG91ciBjb25zdHJ1Y3RvciBzaWduYXR1cmUgd2lsbCByZW1haW4KLQkvLyB1bnRvdWNoZWQgKG5vIHN5bnRoZXRpYyBwYXJhbSkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxpemF0aW9uVGVzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJaW50IGFuSW50ID0gSU5JVF9JTlRfVkFMVUU7CisgICAgLy8gSEFTIHRvIGJlIHN0YXRpYyBjbGFzcyBzbyB0aGF0IG91ciBjb25zdHJ1Y3RvciBzaWduYXR1cmUgd2lsbCByZW1haW4KKyAgICAvLyB1bnRvdWNoZWQgKG5vIHN5bnRoZXRpYyBwYXJhbSkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxpemF0aW9uVGVzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgaW50IGFuSW50ID0gSU5JVF9JTlRfVkFMVUU7CiAKLQkJcHVibGljIFNlcmlhbGl6YXRpb25UZXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIFNlcmlhbGl6YXRpb25UZXN0KCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9TVFJfVkFMVUUgPSAiYSBzdHJpbmcgdGhhdCBpcyBibG9ydHoiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9TVFJfVkFMVUUgPSAiYSBzdHJpbmcgdGhhdCBpcyBibG9ydHoiOwogCi0JLy8gSEFTIHRvIGJlIHN0YXRpYyBjbGFzcyBzbyB0aGF0IG91ciBjb25zdHJ1Y3RvciBzaWduYXR1cmUgd2lsbCByZW1haW4KLQkvLyB1bnRvdWNoZWQgKG5vIHN5bnRoZXRpYyBwYXJhbSkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxpemF0aW9uVGVzdFN1YmNsYXNzMSBleHRlbmRzIFNlcmlhbGl6YXRpb25UZXN0IHsKLQkJU3RyaW5nIGFTdHJpbmcgPSBJTklUX1NUUl9WQUxVRTsKKyAgICAvLyBIQVMgdG8gYmUgc3RhdGljIGNsYXNzIHNvIHRoYXQgb3VyIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSB3aWxsIHJlbWFpbgorICAgIC8vIHVudG91Y2hlZCAobm8gc3ludGhldGljIHBhcmFtKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbGl6YXRpb25UZXN0U3ViY2xhc3MxIGV4dGVuZHMgU2VyaWFsaXphdGlvblRlc3QgeworICAgICAgICBTdHJpbmcgYVN0cmluZyA9IElOSVRfU1RSX1ZBTFVFOwogCi0JCXB1YmxpYyBTZXJpYWxpemF0aW9uVGVzdFN1YmNsYXNzMSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQkvLyBKdXN0IHRvIGNoYW5nZSBkZWZhdWx0IHN1cGVyY2xhc3MgaW5pdCB2YWx1ZQotCQkJYW5JbnQgPSBJTklUX0lOVF9WQUxVRSAvIDI7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uVGVzdFN1YmNsYXNzMSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICAvLyBKdXN0IHRvIGNoYW5nZSBkZWZhdWx0IHN1cGVyY2xhc3MgaW5pdCB2YWx1ZQorICAgICAgICAgICAgYW5JbnQgPSBJTklUX0lOVF9WQUxVRSAvIDI7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGVjVGVzdFN1cGVyQ2xhc3MgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGluc3RWYXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BlY1Rlc3RTdXBlckNsYXNzIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpbnN0VmFyOwogCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BlY1Rlc3QgZXh0ZW5kcyBTcGVjVGVzdFN1cGVyQ2xhc3MgaW1wbGVtZW50cwotCQkJQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBpbnN0VmFyMTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGVjVGVzdCBleHRlbmRzIFNwZWNUZXN0U3VwZXJDbGFzcyBpbXBsZW1lbnRzCisgICAgICAgICAgICBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGluc3RWYXIxOwogCi0JCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdGF0aWNWYXIxOworICAgICAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc3RhdGljVmFyMTsKIAotCQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc3RhdGljVmFyMjsKLQkJewotCQkJaW5zdFZhcjEgPSAiTm9uU3RhdGljSW5pdGlhbFZhbHVlIjsKLQkJfQotCQlzdGF0aWMgewotCQkJc3RhdGljVmFyMSA9ICJTdGF0aWNJbml0aWFsVmFsdWUiOwotCQkJc3RhdGljVmFyMSA9IG5ldyBTdHJpbmcoc3RhdGljVmFyMSk7Ci0JCX0KKyAgICAgICAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHN0YXRpY1ZhcjI7CisgICAgICAgIHsKKyAgICAgICAgICAgIGluc3RWYXIxID0gIk5vblN0YXRpY0luaXRpYWxWYWx1ZSI7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIHN0YXRpY1ZhcjEgPSAiU3RhdGljSW5pdGlhbFZhbHVlIjsKKyAgICAgICAgICAgIHN0YXRpY1ZhcjEgPSBuZXcgU3RyaW5nKHN0YXRpY1ZhcjEpOworICAgICAgICB9CiAKLQkJcHVibGljIE9iamVjdCBtZXRob2QoT2JqZWN0IG9ialBhcmFtLCBPYmplY3Qgb2JqUGFyYW0yKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kKE9iamVjdCBvYmpQYXJhbSwgT2JqZWN0IG9ialBhcmFtMikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIG1ldGhvZChib29sZWFuIGJQYXJhbSwgT2JqZWN0IG9ialBhcmFtKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBtZXRob2QoYm9vbGVhbiBiUGFyYW0sIE9iamVjdCBvYmpQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBtZXRob2QoYm9vbGVhbiBiUGFyYW0sIE9iamVjdCBvYmpQYXJhbSwgT2JqZWN0IG9ialBhcmFtMikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWV0aG9kKGJvb2xlYW4gYlBhcmFtLCBPYmplY3Qgb2JqUGFyYW0sIE9iamVjdCBvYmpQYXJhbTIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BlY1Rlc3RTdWJjbGFzcyBleHRlbmRzIFNwZWNUZXN0IHsKLQkJcHVibGljIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zaWVudEluc3RWYXIgPSAidHJhbnNpZW50VmFsdWUiOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGVjVGVzdFN1YmNsYXNzIGV4dGVuZHMgU3BlY1Rlc3QgeworICAgICAgICBwdWJsaWMgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgdHJhbnNpZW50SW5zdFZhciA9ICJ0cmFuc2llbnRWYWx1ZSI7CisgICAgfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JLy8gVGhpcyBvbmUgdGVzdHMgd2hhdCBoYXBwZW5zIGlmIHRoZSByZWFkL3dyaXRlT2JqZWN0IG1ldGhvZHMgYXJlIGRlZmluZWQKLQkvLyBTZXJpYWxpemF0aW9uIHNob3VsZCB3b3JrIGZpbmUuCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVhZFdyaXRlT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRXcml0ZU9iamVjdCA9IGZhbHNlOworICAgIC8vIFRoaXMgb25lIHRlc3RzIHdoYXQgaGFwcGVucyBpZiB0aGUgcmVhZC93cml0ZU9iamVjdCBtZXRob2RzIGFyZSBkZWZpbmVkCisgICAgLy8gU2VyaWFsaXphdGlvbiBzaG91bGQgd29yayBmaW5lLgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlYWRXcml0ZU9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FsbGVkV3JpdGVPYmplY3QgPSBmYWxzZTsKIAotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRSZWFkT2JqZWN0ID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbGxlZFJlYWRPYmplY3QgPSBmYWxzZTsKIAotCQlwdWJsaWMgUmVhZFdyaXRlT2JqZWN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgUmVhZFdyaXRlT2JqZWN0KCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7Ci0JCQlTdHJpbmcgcyA9ICgoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCkpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBTdHJpbmcgcyA9ICgoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCQljYWxsZWRXcml0ZU9iamVjdCA9IHRydWU7Ci0JCQlvdXQud3JpdGVPYmplY3QoRk9PKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjYWxsZWRXcml0ZU9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoRk9PKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIFRoaXMgb25lIHRlc3RzIHdoYXQgaGFwcGVucyBpZiB0aGUgcmVhZC93cml0ZU9iamVjdCBtZXRob2RzIGFyZSBub3QKLQkvLyBwcml2YXRlLgotCS8vIFNlcmlhbGl6YXRpb24gc2hvdWxkIGZhaWwuCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHVibGljUmVhZFdyaXRlT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRXcml0ZU9iamVjdCA9IGZhbHNlOworICAgIC8vIFRoaXMgb25lIHRlc3RzIHdoYXQgaGFwcGVucyBpZiB0aGUgcmVhZC93cml0ZU9iamVjdCBtZXRob2RzIGFyZSBub3QKKyAgICAvLyBwcml2YXRlLgorICAgIC8vIFNlcmlhbGl6YXRpb24gc2hvdWxkIGZhaWwuCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHVibGljUmVhZFdyaXRlT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYWxsZWRXcml0ZU9iamVjdCA9IGZhbHNlOwogCi0JCXB1YmxpYyBib29sZWFuIGNhbGxlZFJlYWRPYmplY3QgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FsbGVkUmVhZE9iamVjdCA9IGZhbHNlOwogCi0JCXB1YmxpYyBQdWJsaWNSZWFkV3JpdGVPYmplY3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBQdWJsaWNSZWFkV3JpdGVPYmplY3QoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWNhbGxlZFJlYWRPYmplY3QgPSB0cnVlOwotCQkJU3RyaW5nIHMgPSAoKFN0cmluZykgaW4ucmVhZE9iamVjdCgpKTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBTdHJpbmcgcyA9ICgoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCkpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJCWNhbGxlZFdyaXRlT2JqZWN0ID0gdHJ1ZTsKLQkJCW91dC53cml0ZU9iamVjdChGT08pOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgICAgY2FsbGVkV3JpdGVPYmplY3QgPSB0cnVlOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KEZPTyk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyBUaGlzIG9uZSB0ZXN0cyBpZiBmaWVsZCBuYW1lcyBhcmUgc2VyaWFsaXplZCBpbiB0aGUgc2FtZSB3YXkgKHNvcnRpbmcpCi0JLy8gYWNyb3NzIGRpZmZlcmVudCBWTXMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWVsZE9yZGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJU3RyaW5nIGFhYTFOb25QcmltaXRpdmUgPSAiYWFhMSI7CisgICAgLy8gVGhpcyBvbmUgdGVzdHMgaWYgZmllbGQgbmFtZXMgYXJlIHNlcmlhbGl6ZWQgaW4gdGhlIHNhbWUgd2F5IChzb3J0aW5nKQorICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgVk1zCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmllbGRPcmRlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIFN0cmluZyBhYWExTm9uUHJpbWl0aXZlID0gImFhYTEiOwogCi0JCWludCBiYmIxUHJpbWl0aXZlSW50ID0gNTsKKyAgICAgICAgaW50IGJiYjFQcmltaXRpdmVJbnQgPSA1OwogCi0JCWJvb2xlYW4gYWFhMlByaW1pdGl2ZUJvb2xlYW4gPSB0cnVlOworICAgICAgICBib29sZWFuIGFhYTJQcmltaXRpdmVCb29sZWFuID0gdHJ1ZTsKIAotCQlTdHJpbmcgYmJiMk5vblByaW1pdGl2ZSA9ICJiYmIyIjsKLQl9CisgICAgICAgIFN0cmluZyBiYmIyTm9uUHJpbWl0aXZlID0gImJiYjIiOworICAgIH0KIAotCS8vIFRoaXMgb25lIHRlc3RzIHdoYXQgaGFwcGVucyBpZiB5b3UgZGVmaW5lIGp1c3QgcmVhZE9iamVjdCwgYnV0IG5vdAotCS8vIHdyaXRlT2JqZWN0LgotCS8vIERvZXMgaXQgcnVuIG9yIG5vdCA/Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSnVzdFJlYWRPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbGxlZFJlYWRPYmplY3QgPSBmYWxzZTsKKyAgICAvLyBUaGlzIG9uZSB0ZXN0cyB3aGF0IGhhcHBlbnMgaWYgeW91IGRlZmluZSBqdXN0IHJlYWRPYmplY3QsIGJ1dCBub3QKKyAgICAvLyB3cml0ZU9iamVjdC4KKyAgICAvLyBEb2VzIGl0IHJ1biBvciBub3QgPworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEp1c3RSZWFkT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYWxsZWRSZWFkT2JqZWN0ID0gZmFsc2U7CiAKLQkJcHVibGljIEp1c3RSZWFkT2JqZWN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgSnVzdFJlYWRPYmplY3QoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQljYWxsZWRSZWFkT2JqZWN0ID0gdHJ1ZTsKLQkJCWluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOworICAgICAgICB9CisgICAgfQogCi0JLy8gVGhpcyBvbmUgdGVzdHMgd2hhdCBoYXBwZW5zIGlmIHlvdSBkZWZpbmUganVzdCB3cml0ZU9iamVjdCwgYnV0IG5vdAotCS8vIHJlYWRPYmplY3QuCi0JLy8gRG9lcyBpdCBydW4gb3Igbm90ID8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBKdXN0V3JpdGVPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbGxlZFdyaXRlT2JqZWN0ID0gZmFsc2U7CisgICAgLy8gVGhpcyBvbmUgdGVzdHMgd2hhdCBoYXBwZW5zIGlmIHlvdSBkZWZpbmUganVzdCB3cml0ZU9iamVjdCwgYnV0IG5vdAorICAgIC8vIHJlYWRPYmplY3QuCisgICAgLy8gRG9lcyBpdCBydW4gb3Igbm90ID8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKdXN0V3JpdGVPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbGxlZFdyaXRlT2JqZWN0ID0gZmFsc2U7CiAKLQkJcHVibGljIEp1c3RXcml0ZU9iamVjdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIEp1c3RXcml0ZU9iamVjdCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWNhbGxlZFdyaXRlT2JqZWN0ID0gdHJ1ZTsKLQkJCW91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjYWxsZWRXcml0ZU9iamVjdCA9IHRydWU7CisgICAgICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyBUaGlzIG9uZSB0ZXN0cyBjbGFzcy1iYXNlZCByZXBsYWNlbWVudCB3aGVuIGR1bXBpbmcKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbGxlZFJlcGxhY2VtZW50ID0gZmFsc2U7CisgICAgLy8gVGhpcyBvbmUgdGVzdHMgY2xhc3MtYmFzZWQgcmVwbGFjZW1lbnQgd2hlbiBkdW1waW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYWxsZWRSZXBsYWNlbWVudCA9IGZhbHNlOwogCi0JCXB1YmxpYyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKLQkJCWNhbGxlZFJlcGxhY2VtZW50ID0gdHJ1ZTsKLQkJCXJldHVybiBGT087IC8vIFJlcGxhY2VtZW50IGlzIGEgU3RyaW5nCi0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKKyAgICAgICAgICAgIGNhbGxlZFJlcGxhY2VtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBGT087IC8vIFJlcGxhY2VtZW50IGlzIGEgU3RyaW5nCisgICAgICAgIH0KKyAgICB9CiAKLQkvLyBUaGlzIG9uZSB0ZXN0cyB3aGV0aGVyIGNsYXNzLWJhc2VkIHJlcGxhY2VtZW50IHN1cHBvcnRzIG11bHRpcGxlIGxldmVscy4KLQkvLyBNdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIC0+IEMxIC0+IEMyIC0+IEMzIC0+IEZPTwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE11bHRpcGxlQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDMSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJCXByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKLQkJCQlyZXR1cm4gbmV3IEMyKCk7Ci0JCQl9Ci0JCX0KKyAgICAvLyBUaGlzIG9uZSB0ZXN0cyB3aGV0aGVyIGNsYXNzLWJhc2VkIHJlcGxhY2VtZW50IHN1cHBvcnRzIG11bHRpcGxlIGxldmVscy4KKyAgICAvLyBNdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIC0+IEMxIC0+IEMyIC0+IEMzIC0+IEZPTworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE11bHRpcGxlQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDMSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgICAgIHByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDMiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJCXByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKLQkJCQlyZXR1cm4gbmV3IEMzKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQzIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgICAgICBwcml2YXRlIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDMygpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQzMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCQlwcml2YXRlIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB7Ci0JCQkJcmV0dXJuIEZPTzsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDMyBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgICAgIHByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRk9POworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIE11bHRpcGxlQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBNdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKLQkJCXJldHVybiBuZXcgQzEoKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDMSgpOworICAgICAgICB9CisgICAgfQogCi0JLy8gVGhpcyBvbmUgdGVzdHMgY2xhc3MtYmFzZWQgcmVwbGFjZW1lbnQgd2hlbiBsb2FkaW5nCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmcgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmcoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgLy8gVGhpcyBvbmUgdGVzdHMgY2xhc3MtYmFzZWQgcmVwbGFjZW1lbnQgd2hlbiBsb2FkaW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmcgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmcoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQlyZXR1cm4gRk9POyAvLyBSZXBsYWNlbWVudCBpcyBhIFN0cmluZwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBGT087IC8vIFJlcGxhY2VtZW50IGlzIGEgU3RyaW5nCisgICAgICAgIH0KKyAgICB9CiAKLQkvLyBUaGlzIG9uZSB0ZXN0cyB3aGF0IGhhcHBlbnMgaWYgYSBsb2FkaW5nLXJlcGxhY2VtZW50IGlzIG5vdAotCS8vIHR5cGUtY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbCBvYmplY3QKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZ1Zpb2xhdGVzRmllbGRUeXBlCi0JCQlpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nID0gbmV3IENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nKCk7CisgICAgLy8gVGhpcyBvbmUgdGVzdHMgd2hhdCBoYXBwZW5zIGlmIGEgbG9hZGluZy1yZXBsYWNlbWVudCBpcyBub3QKKyAgICAvLyB0eXBlLWNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwgb2JqZWN0CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmdWaW9sYXRlc0ZpZWxkVHlwZQorICAgICAgICAgICAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZyBjbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZyA9IG5ldyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZygpOwogCi0JCXB1YmxpYyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZ1Zpb2xhdGVzRmllbGRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nVmlvbGF0ZXNGaWVsZFR5cGUoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisgICAgfQogCi0JLy8gV2hhdCBoYXBwZW5zIGlmIGR1bXBpbmcgY2F1c2VzIGFuIGVycm9yIGFuZCB5b3UgdHJ5IHRvIHJlbG9hZCA/Ci0JLy8gU2hvdWxkIHRoZSBsb2FkIHRocm93IHRoZSBzYW1lIGV4Y2VwdGlvbiA/Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb25XaGVuRHVtcGluZzEgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl9OworICAgIC8vIFdoYXQgaGFwcGVucyBpZiBkdW1waW5nIGNhdXNlcyBhbiBlcnJvciBhbmQgeW91IHRyeSB0byByZWxvYWQgPworICAgIC8vIFNob3VsZCB0aGUgbG9hZCB0aHJvdyB0aGUgc2FtZSBleGNlcHRpb24gPworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uV2hlbkR1bXBpbmcxIGltcGxlbWVudHMKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgfTsKIAotCQkvLyBBIHByaW1pdGl2ZSBpbnN0YW5jZSB2YXJpYWJsZSBleHBvc2VzIGEgYnVnIGluIHRoZSBzZXJpYWxpemF0aW9uCi0JCS8vIHNwZWMuCi0JCS8vIFByaW1pdGl2ZSBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHdyaXR0ZW4gd2l0aG91dCBwcmltaXRpdmUgZGF0YSB0YWdzCi0JCS8vIGFuZCBzbyBhcmUgcmVhZCB3aXRob3V0IGNoZWNraW5nIGZvciB0YWdzLiBJZiBhbiBleGNlcHRpb24gaXMKLQkJLy8gd3JpdHRlbiwgcmVhZGluZyBwcmltaXRpdmUgZGF0YSB3aWxsIGp1c3QgcmVhZCBieXRlcyBmcm9tIHRoZSBzdHJlYW0KLQkJLy8gd2hpY2ggbWF5IGJlIHRhZ3MKLQkJcHVibGljIGJvb2xlYW4gYW5JbnN0YW5jZVZhciA9IGZhbHNlOworICAgICAgICAvLyBBIHByaW1pdGl2ZSBpbnN0YW5jZSB2YXJpYWJsZSBleHBvc2VzIGEgYnVnIGluIHRoZSBzZXJpYWxpemF0aW9uCisgICAgICAgIC8vIHNwZWMuCisgICAgICAgIC8vIFByaW1pdGl2ZSBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHdyaXR0ZW4gd2l0aG91dCBwcmltaXRpdmUgZGF0YSB0YWdzCisgICAgICAgIC8vIGFuZCBzbyBhcmUgcmVhZCB3aXRob3V0IGNoZWNraW5nIGZvciB0YWdzLiBJZiBhbiBleGNlcHRpb24gaXMKKyAgICAgICAgLy8gd3JpdHRlbiwgcmVhZGluZyBwcmltaXRpdmUgZGF0YSB3aWxsIGp1c3QgcmVhZCBieXRlcyBmcm9tIHRoZSBzdHJlYW0KKyAgICAgICAgLy8gd2hpY2ggbWF5IGJlIHRhZ3MKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYW5JbnN0YW5jZVZhciA9IGZhbHNlOwogCi0JCXB1YmxpYyBNeUV4Y2VwdGlvbldoZW5EdW1waW5nMSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIE15RXhjZXB0aW9uV2hlbkR1bXBpbmcxKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBNeUV4Y2VwdGlvbigpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQogCi0JLy8gV2hhdCBoYXBwZW5zIGlmIGR1bXBpbmcgY2F1c2VzIGFuIGVycm9yIGFuZCB5b3UgdHJ5IHRvIHJlbG9hZCA/Ci0JLy8gU2hvdWxkIHRoZSBsb2FkIHRocm93IHRoZSBzYW1lIGV4Y2VwdGlvbiA/Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb25XaGVuRHVtcGluZzIgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl9OworICAgIC8vIFdoYXQgaGFwcGVucyBpZiBkdW1waW5nIGNhdXNlcyBhbiBlcnJvciBhbmQgeW91IHRyeSB0byByZWxvYWQgPworICAgIC8vIFNob3VsZCB0aGUgbG9hZCB0aHJvdyB0aGUgc2FtZSBleGNlcHRpb24gPworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uV2hlbkR1bXBpbmcyIGltcGxlbWVudHMKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgfTsKIAotCQlwdWJsaWMgSW50ZWdlciBhbkluc3RhbmNlVmFyID0gbmV3IEludGVnZXIoMHhBMSk7CisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGFuSW5zdGFuY2VWYXIgPSBuZXcgSW50ZWdlcigweEExKTsKIAotCQlwdWJsaWMgTXlFeGNlcHRpb25XaGVuRHVtcGluZzIoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBNeUV4Y2VwdGlvbldoZW5EdW1waW5nMigpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQl0aHJvdyBuZXcgTXlFeGNlcHRpb24oKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIFdoYXQgaGFwcGVucyBpZiBkdW1waW5nIGNhdXNlcyBhbiBlcnJvciAoTm9uU2VyaWFsaXphYmxlIGluc3QgdmFyKSBhbmQKLQkvLyB5b3UgdHJ5IHRvIHJlbG9hZCA/Ci0JLy8gU2hvdWxkIHRoZSBsb2FkIHRocm93IHRoZSBzYW1lIGV4Y2VwdGlvbiA/Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgT2JqZWN0IGFuSW5zdGFuY2VWYXIgPSBuZXcgT2JqZWN0KCk7CisgICAgLy8gV2hhdCBoYXBwZW5zIGlmIGR1bXBpbmcgY2F1c2VzIGFuIGVycm9yIChOb25TZXJpYWxpemFibGUgaW5zdCB2YXIpIGFuZAorICAgIC8vIHlvdSB0cnkgdG8gcmVsb2FkID8KKyAgICAvLyBTaG91bGQgdGhlIGxvYWQgdGhyb3cgdGhlIHNhbWUgZXhjZXB0aW9uID8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25TZXJpYWxpemFibGVFeGNlcHRpb25XaGVuRHVtcGluZyBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBPYmplY3QgYW5JbnN0YW5jZVZhciA9IG5ldyBPYmplY3QoKTsKIAotCQlwdWJsaWMgTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisgICAgfQogCi0JLy8gV2hhdCBoYXBwZW5zIGlmIGR1bXBpbmcgY2F1c2VzIGFuIGVycm9yICh3aGljaCBpcyBub3Qgc2VyaWFsaXphYmxlKSBhbmQKLQkvLyB5b3UgdHJ5IHRvIHJlbG9hZCA/Ci0JLy8gU2hvdWxkIHRoZSBsb2FkIHRocm93IHRoZSBzYW1lIGV4Y2VwdGlvbiA/Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlVbnNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nIGltcGxlbWVudHMKLQkJCWphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJCXByaXZhdGUgT2JqZWN0IG5vdFNlcmlhbGl6YWJsZSA9IG5ldyBPYmplY3QoKTsKLQkJfTsKKyAgICAvLyBXaGF0IGhhcHBlbnMgaWYgZHVtcGluZyBjYXVzZXMgYW4gZXJyb3IgKHdoaWNoIGlzIG5vdCBzZXJpYWxpemFibGUpIGFuZAorICAgIC8vIHlvdSB0cnkgdG8gcmVsb2FkID8KKyAgICAvLyBTaG91bGQgdGhlIGxvYWQgdGhyb3cgdGhlIHNhbWUgZXhjZXB0aW9uID8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVVuc2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3Qgbm90U2VyaWFsaXphYmxlID0gbmV3IE9iamVjdCgpOworICAgICAgICB9OwogCi0JCXB1YmxpYyBib29sZWFuIGFuSW5zdGFuY2VWYXIgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYW5JbnN0YW5jZVZhciA9IGZhbHNlOwogCi0JCXB1YmxpYyBNeVVuc2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBNeVVuc2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJdGhyb3cgbmV3IE15RXhjZXB0aW9uKCk7Ci0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IE15RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QxKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KKyAgICBwdWJsaWMgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QxKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9ICJIZWxsb1dvcmxkIjsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsICgoKFN0cmluZykgb2JqTG9hZGVkKQotCQkJCQkuZXF1YWxzKChTdHJpbmcpIG9ialRvU2F2ZSkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9ICJIZWxsb1dvcmxkIjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsICgoKFN0cmluZykgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKChTdHJpbmcpIG9ialRvU2F2ZSkpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8yX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8yX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbnVsbDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9iakxvYWRlZCA9PSBvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9iakxvYWRlZCA9PSBvYmpUb1NhdmUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfM193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfM193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBieXRlcyA9IHsgMCwgMSwgMiwgMyB9OwotCQkJb2JqVG9TYXZlID0gYnl0ZXM7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBcnJheXMuZXF1YWxzKAotCQkJCQkoYnl0ZVtdKSBvYmpMb2FkZWQsIChieXRlW10pIG9ialRvU2F2ZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0geyAwLCAxLCAyLCAzIH07CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBieXRlczsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIChieXRlW10pIG9iakxvYWRlZCwgKGJ5dGVbXSkgb2JqVG9TYXZlKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF80X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF80X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJaW50W10gaW50cyA9IHsgMCwgMSwgMiwgMyB9OwotCQkJb2JqVG9TYXZlID0gaW50czsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHMoCi0JCQkJCShpbnRbXSkgb2JqTG9hZGVkLCAoaW50W10pIG9ialRvU2F2ZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50W10gaW50cyA9IHsgMCwgMSwgMiwgMyB9OworICAgICAgICAgICAgb2JqVG9TYXZlID0gaW50czsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIChpbnRbXSkgb2JqTG9hZGVkLCAoaW50W10pIG9ialRvU2F2ZSkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKKyAgICAgICAgdHJ5IHsKIAotCQkJc2hvcnRbXSBzaG9ydHMgPSB7IDAsIDEsIDIsIDMgfTsKLQkJCW9ialRvU2F2ZSA9IHNob3J0czsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHMoCi0JCQkJCShzaG9ydFtdKSBvYmpMb2FkZWQsIChzaG9ydFtdKSBvYmpUb1NhdmUpKTsKKyAgICAgICAgICAgIHNob3J0W10gc2hvcnRzID0geyAwLCAxLCAyLCAzIH07CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBzaG9ydHM7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBcnJheXMuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAoc2hvcnRbXSkgb2JqTG9hZGVkLCAoc2hvcnRbXSkgb2JqVG9TYXZlKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF82X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF82X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJbG9uZ1tdIGxvbmdzID0geyAwLCAxLCAyLCAzIH07Ci0JCQlvYmpUb1NhdmUgPSBsb25nczsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHMoCi0JCQkJCShsb25nW10pIG9iakxvYWRlZCwgKGxvbmdbXSkgb2JqVG9TYXZlKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nW10gbG9uZ3MgPSB7IDAsIDEsIDIsIDMgfTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGxvbmdzOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQXJyYXlzLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgKGxvbmdbXSkgb2JqTG9hZGVkLCAobG9uZ1tdKSBvYmpUb1NhdmUpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4Xzdfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzdfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlmbG9hdFtdIGZsb2F0cyA9IHsgMC4wZiwgMS4xZiwgMi4yZiwgMy4zZiB9OwotCQkJb2JqVG9TYXZlID0gZmxvYXRzOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQXJyYXlzLmVxdWFscygKLQkJCQkJKGZsb2F0W10pIG9iakxvYWRlZCwgKGZsb2F0W10pIG9ialRvU2F2ZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxvYXRbXSBmbG9hdHMgPSB7IDAuMGYsIDEuMWYsIDIuMmYsIDMuM2YgfTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGZsb2F0czsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIChmbG9hdFtdKSBvYmpMb2FkZWQsIChmbG9hdFtdKSBvYmpUb1NhdmUpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF84X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF84X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJZG91YmxlW10gZG91YmxlcyA9IHsgMC4wLCAxLjEsIDIuMiwgMy4zIH07Ci0JCQlvYmpUb1NhdmUgPSBkb3VibGVzOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQXJyYXlzLmVxdWFscygKLQkJCQkJKGRvdWJsZVtdKSBvYmpMb2FkZWQsIChkb3VibGVbXSkgb2JqVG9TYXZlKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb3VibGVbXSBkb3VibGVzID0geyAwLjAsIDEuMSwgMi4yLCAzLjMgfTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGRvdWJsZXM7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBcnJheXMuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlW10pIG9iakxvYWRlZCwgKGRvdWJsZVtdKSBvYmpUb1NhdmUpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4Xzlfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzlfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlib29sZWFuW10gYm9vbGVhbnMgPSB7IHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSB9OwotCQkJb2JqVG9TYXZlID0gYm9vbGVhbnM7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBcnJheXMuZXF1YWxzKAotCQkJCQkoYm9vbGVhbltdKSBvYmpMb2FkZWQsIChib29sZWFuW10pIG9ialRvU2F2ZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbltdIGJvb2xlYW5zID0geyB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUgfTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGJvb2xlYW5zOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQXJyYXlzLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgKGJvb2xlYW5bXSkgb2JqTG9hZGVkLCAoYm9vbGVhbltdKSBvYmpUb1NhdmUpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8xMF93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKKyAgICAgICAgdHJ5IHsKIAotCQkJU3RyaW5nW10gc3RyaW5ncyA9IHsgImZvbyIsICJiYXIiLCAiamF2YSIgfTsKLQkJCW9ialRvU2F2ZSA9IHN0cmluZ3M7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBcnJheXMuZXF1YWxzKAotCQkJCQkoT2JqZWN0W10pIG9iakxvYWRlZCwgKE9iamVjdFtdKSBvYmpUb1NhdmUpKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSB7ICJmb28iLCAiYmFyIiwgImphdmEiIH07CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBzdHJpbmdzOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQXJyYXlzLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgKE9iamVjdFtdKSBvYmpMb2FkZWQsIChPYmplY3RbXSkgb2JqVG9TYXZlKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuYWJsZSB0byByZWFkIE9iamVjdCB0eXBlOiAiICsgZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gcmVhZCBPYmplY3QgdHlwZTogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTFfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCW9ialRvU2F2ZSA9IG5ldyBPYmplY3QoKTsgLy8gTm90IHNlcmlhbGl6YWJsZQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotCQkJVGhyb3dhYmxlIHQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQl9IGNhdGNoIChOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gbnMpIHsKLQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCXQgPSBuczsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB3cm9uZ0V4YykgewotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCXQgPSB3cm9uZ0V4YzsKLQkJCX0KLQkJCWFzc2VydFRydWUoCi0JCQkJCSJGYWlsZWQgdG8gdGhyb3cgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIHdoZW4gc2VyaWFsaXppbmcgIgotCQkJCQkJCSsgb2JqVG9TYXZlICsgIiBUaHJldyhpZiBub24tbnVsbCkgdGhpczogIiArIHQsCi0JCQkJCXBhc3NlZCk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IE9iamVjdCgpOyAvLyBOb3Qgc2VyaWFsaXphYmxlCisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBucykgeworICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdCA9IG5zOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHdyb25nRXhjKSB7CisgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdCA9IHdyb25nRXhjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB0aHJvdyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gd2hlbiBzZXJpYWxpemluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmpUb1NhdmUgKyAiIFRocmV3KGlmIG5vbi1udWxsKSB0aGlzOiAiICsgdCwKKyAgICAgICAgICAgICAgICAgICAgcGFzc2VkKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8xMl93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQl0cnkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gPG1peGVkPiIpOwotCQkJdF9NaXhQcmltaXRpdmVzQW5kT2JqZWN0cygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyBkYXRhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBkdW1waW5nIG1peGVkIHR5cGVzIik7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSA8bWl4ZWQ+Iik7CisgICAgICAgICAgICB0X01peFByaW1pdGl2ZXNBbmRPYmplY3RzKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nIGRhdGEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIGR1bXBpbmcgbWl4ZWQgdHlwZXMiKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMTNfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzEzX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJU2VyaWFsaXphdGlvblRlc3RTdWJjbGFzczEgc3QgPSBuZXcgU2VyaWFsaXphdGlvblRlc3RTdWJjbGFzczEoKTsKLQkJCS8vIEp1c3QgY2hhbmdlIHRoZSBkZWZhdWx0IGl2YXIgdmFsdWVzCi0JCQlzdC5hbkludCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJc3QuYVN0cmluZyA9IEZPTzsKLQkJCW9ialRvU2F2ZSA9IHN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBub24tc2VyaWFsaXphYmxlIGluc3QgdmFyIGhhcyB0byBiZSBpbml0aWFsaXplZCBmcm9tIHRvcAotCQkJLy8gY29uc3RydWN0b3IKLQkJCWFzc2VydFRydWUoCi0JCQkJCU1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJKChTZXJpYWxpemF0aW9uVGVzdFN1YmNsYXNzMSkgb2JqTG9hZGVkKS5hbkludCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQkvLyBidXQgc2VyaWFsaXplZCB2YXIgaGFzIHRvIGJlIHJlc3RvcmVkIGFzIGl0IHdhcyBpbiB0aGUgb2JqZWN0Ci0JCQkvLyB3aGVuIGR1bXBlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCi0JCQkJCSgoU2VyaWFsaXphdGlvblRlc3RTdWJjbGFzczEpIG9iakxvYWRlZCkuYVN0cmluZwotCQkJCQkJCS5lcXVhbHMoRk9PKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCi0JCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCWVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0U3ViY2xhc3MxIHN0ID0gbmV3IFNlcmlhbGl6YXRpb25UZXN0U3ViY2xhc3MxKCk7CisgICAgICAgICAgICAvLyBKdXN0IGNoYW5nZSB0aGUgZGVmYXVsdCBpdmFyIHZhbHVlcworICAgICAgICAgICAgc3QuYW5JbnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIHN0LmFTdHJpbmcgPSBGT087CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBzdDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gbm9uLXNlcmlhbGl6YWJsZSBpbnN0IHZhciBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0b3AKKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yCisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICBNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgICgoU2VyaWFsaXphdGlvblRlc3RTdWJjbGFzczEpIG9iakxvYWRlZCkuYW5JbnQgPT0gSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgLy8gYnV0IHNlcmlhbGl6ZWQgdmFyIGhhcyB0byBiZSByZXN0b3JlZCBhcyBpdCB3YXMgaW4gdGhlIG9iamVjdAorICAgICAgICAgICAgLy8gd2hlbiBkdW1wZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAorICAgICAgICAgICAgICAgICAgICAoKFNlcmlhbGl6YXRpb25UZXN0U3ViY2xhc3MxKSBvYmpMb2FkZWQpLmFTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEZPTykpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICJcdC0+IgorICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzE0X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfMThfMTRfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlTcGVjVGVzdCBzcGVjVGVzdCA9IG5ldyBTcGVjVGVzdCgpOwotCQkJLy8gSnVzdCBjaGFuZ2UgdGhlIGRlZmF1bHQgaXZhciB2YWx1ZXMKLQkJCXNwZWNUZXN0Lmluc3RWYXIgPSBGT087Ci0JCQlzcGVjVGVzdC5pbnN0VmFyMSA9IHNwZWNUZXN0Lmluc3RWYXI7Ci0JCQlvYmpUb1NhdmUgPSBzcGVjVGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gbm9uLXNlcmlhbGl6YWJsZSBpbnN0IHZhciBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0b3AKLQkJCS8vIGNvbnN0cnVjdG9yCi0JCQlhc3NlcnROdWxsKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJKChTcGVjVGVzdCkgb2JqTG9hZGVkKS5pbnN0VmFyKTsgCi0JCQkvLyBpbnN0VmFyIGZyb20gbm9uLXNlcmlhbGl6ZWQgY2xhc3MsIGNhbnQgIGJlICBzYXZlZC9yZXN0b3JlZAotCQkJLy8gYnkgc2VyaWFsaXphdGlvbiBidXQgc2VyaWFsaXplZCBpdmFyIGhhcyB0byBiZSByZXN0b3JlZCBhcyBpdAotCQkJLy8gd2FzIGluIHRoZSBvYmplY3Qgd2hlbiBkdW1wZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkoKFNwZWNUZXN0KSBvYmpMb2FkZWQpLmluc3RWYXIxLmVxdWFscyhGT08pKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNwZWNUZXN0IHNwZWNUZXN0ID0gbmV3IFNwZWNUZXN0KCk7CisgICAgICAgICAgICAvLyBKdXN0IGNoYW5nZSB0aGUgZGVmYXVsdCBpdmFyIHZhbHVlcworICAgICAgICAgICAgc3BlY1Rlc3QuaW5zdFZhciA9IEZPTzsKKyAgICAgICAgICAgIHNwZWNUZXN0Lmluc3RWYXIxID0gc3BlY1Rlc3QuaW5zdFZhcjsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHNwZWNUZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBub24tc2VyaWFsaXphYmxlIGluc3QgdmFyIGhhcyB0byBiZSBpbml0aWFsaXplZCBmcm9tIHRvcAorICAgICAgICAgICAgLy8gY29uc3RydWN0b3IKKyAgICAgICAgICAgIGFzc2VydE51bGwoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAorICAgICAgICAgICAgICAgICAgICAoKFNwZWNUZXN0KSBvYmpMb2FkZWQpLmluc3RWYXIpOyAKKyAgICAgICAgICAgIC8vIGluc3RWYXIgZnJvbSBub24tc2VyaWFsaXplZCBjbGFzcywgY2FudCAgYmUgIHNhdmVkL3Jlc3RvcmVkCisgICAgICAgICAgICAvLyBieSBzZXJpYWxpemF0aW9uIGJ1dCBzZXJpYWxpemVkIGl2YXIgaGFzIHRvIGJlIHJlc3RvcmVkIGFzIGl0CisgICAgICAgICAgICAvLyB3YXMgaW4gdGhlIG9iamVjdCB3aGVuIGR1bXBlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgICgoU3BlY1Rlc3QpIG9iakxvYWRlZCkuaW5zdFZhcjEuZXF1YWxzKEZPTykpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCi0JCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiXHQtPiIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xNV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0XzE4XzE1X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJU3BlY1Rlc3RTdWJjbGFzcyBzcGVjVGVzdFN1YmNsYXNzID0gbmV3IFNwZWNUZXN0U3ViY2xhc3MoKTsKLQkJCS8vIEp1c3QgY2hhbmdlIHRoZSBkZWZhdWx0IGl2YXIgdmFsdWVzCi0JCQlzcGVjVGVzdFN1YmNsYXNzLnRyYW5zaWVudEluc3RWYXIgPSBGT087Ci0JCQlvYmpUb1NhdmUgPSBzcGVjVGVzdFN1YmNsYXNzOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBub24tc2VyaWFsaXphYmxlIGluc3QgdmFyIGNhbnQgYmUgc2F2ZWQsIGFuZCBpdCBpcyBub3QgaW5pdCdlZAotCQkJLy8gZnJvbSB0b3AgY29uc3RydWN0b3IgaW4gdGhpcyBjYXNlCi0JCQlhc3NlcnROdWxsKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJKChTcGVjVGVzdFN1YmNsYXNzKSBvYmpMb2FkZWQpLnRyYW5zaWVudEluc3RWYXIpOwotCQkJLy8gdHJhbnNpZW50IHNsb3QsIGNhbnQgYmUgc2F2ZWQvcmVzdG9yZWQgYnkgc2VyaWFsaXphdGlvbiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiXHQtPiIKLQkJCQkJKyBlLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3BlY1Rlc3RTdWJjbGFzcyBzcGVjVGVzdFN1YmNsYXNzID0gbmV3IFNwZWNUZXN0U3ViY2xhc3MoKTsKKyAgICAgICAgICAgIC8vIEp1c3QgY2hhbmdlIHRoZSBkZWZhdWx0IGl2YXIgdmFsdWVzCisgICAgICAgICAgICBzcGVjVGVzdFN1YmNsYXNzLnRyYW5zaWVudEluc3RWYXIgPSBGT087CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBzcGVjVGVzdFN1YmNsYXNzOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBub24tc2VyaWFsaXphYmxlIGluc3QgdmFyIGNhbnQgYmUgc2F2ZWQsIGFuZCBpdCBpcyBub3QgaW5pdCdlZAorICAgICAgICAgICAgLy8gZnJvbSB0b3AgY29uc3RydWN0b3IgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICBhc3NlcnROdWxsKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgKChTcGVjVGVzdFN1YmNsYXNzKSBvYmpMb2FkZWQpLnRyYW5zaWVudEluc3RWYXIpOworICAgICAgICAgICAgLy8gdHJhbnNpZW50IHNsb3QsIGNhbnQgYmUgc2F2ZWQvcmVzdG9yZWQgYnkgc2VyaWFsaXphdGlvbiAKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiXHQtPiIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xNl93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTZfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nWzJdOwotCQkJc3RyaW5nc1swXSA9IEZPTzsKLQkJCXN0cmluZ3NbMV0gPSAoIiAiICsgRk9PICsgIiAiKS50cmltKCk7IC8vIFNhZmUgd2F5IHRvIGdldCBhIGNvcHkKLQkJCS8vIHRoYXQgaXMgbm90ID09Ci0JCQlvYmpUb1NhdmUgPSBzdHJpbmdzOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQlTdHJpbmdbXSBzdHJpbmdzTG9hZGVkID0gKFN0cmluZ1tdKSBvYmpMb2FkZWQ7Ci0JCQkvLyBTZXJpYWxpemF0aW9uIGhhcyB0byB1c2UgaWRlbnRpdHktYmFzZWQgdGFibGUgZm9yIGFzc2lnbmluZyBJRHMKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkhKHN0cmluZ3NMb2FkZWRbMF0gPT0gc3RyaW5nc0xvYWRlZFsxXSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICJcdC0+IgotCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgICAgIHN0cmluZ3NbMF0gPSBGT087CisgICAgICAgICAgICBzdHJpbmdzWzFdID0gKCIgIiArIEZPTyArICIgIikudHJpbSgpOyAvLyBTYWZlIHdheSB0byBnZXQgYSBjb3B5CisgICAgICAgICAgICAvLyB0aGF0IGlzIG5vdCA9PQorICAgICAgICAgICAgb2JqVG9TYXZlID0gc3RyaW5nczsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5nc0xvYWRlZCA9IChTdHJpbmdbXSkgb2JqTG9hZGVkOworICAgICAgICAgICAgLy8gU2VyaWFsaXphdGlvbiBoYXMgdG8gdXNlIGlkZW50aXR5LWJhc2VkIHRhYmxlIGZvciBhc3NpZ25pbmcgSURzCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgIShzdHJpbmdzTG9hZGVkWzBdID09IHN0cmluZ3NMb2FkZWRbMV0pKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiXHQtPiIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xN193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTdfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCVJlYWRXcml0ZU9iamVjdCByZWFkV3JpdGUgPSBuZXcgUmVhZFdyaXRlT2JqZWN0KCk7Ci0JCQlvYmpUb1NhdmUgPSByZWFkV3JpdGU7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIGhhcyB0byBoYXZlIGNhbGxlZCB0aGUgd3JpdGVPYmplY3Qgb24gdGhlIGluc3RhbmNlIHRvIGR1bXAKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCByZWFkV3JpdGUuY2FsbGVkV3JpdGVPYmplY3QpOwotCQkJLy8gaGFzIHRvIGhhdmUgY2FsbGVkIHRoZSByZWFkT2JqZWN0IG9uIHRoZSBpbnN0YW5jZSBsb2FkZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkoKFJlYWRXcml0ZU9iamVjdCkgb2JqTG9hZGVkKS5jYWxsZWRSZWFkT2JqZWN0KTsKKyAgICAgICAgICAgIFJlYWRXcml0ZU9iamVjdCByZWFkV3JpdGUgPSBuZXcgUmVhZFdyaXRlT2JqZWN0KCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSByZWFkV3JpdGU7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGhhcyB0byBoYXZlIGNhbGxlZCB0aGUgd3JpdGVPYmplY3Qgb24gdGhlIGluc3RhbmNlIHRvIGR1bXAKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCByZWFkV3JpdGUuY2FsbGVkV3JpdGVPYmplY3QpOworICAgICAgICAgICAgLy8gaGFzIHRvIGhhdmUgY2FsbGVkIHRoZSByZWFkT2JqZWN0IG9uIHRoZSBpbnN0YW5jZSBsb2FkZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAorICAgICAgICAgICAgICAgICAgICAoKFJlYWRXcml0ZU9iamVjdCkgb2JqTG9hZGVkKS5jYWxsZWRSZWFkT2JqZWN0KTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICJcdC0+IgotCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMThfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzE4X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJUHVibGljUmVhZFdyaXRlT2JqZWN0IHB1YmxpY1JlYWRXcml0ZSA9IG5ldyBQdWJsaWNSZWFkV3JpdGVPYmplY3QoKTsKLQkJCW9ialRvU2F2ZSA9IHB1YmxpY1JlYWRXcml0ZTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gQ2FuJ3QgaGF2ZSBjYWxsZWQgdGhlIHdyaXRlT2JqZWN0IG9uIHRoZSBpbnN0YW5jZSB0byBkdW1wCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJIXB1YmxpY1JlYWRXcml0ZS5jYWxsZWRXcml0ZU9iamVjdCk7Ci0JCQkvLyBDYW4ndCBoYXZlIGNhbGxlZCB0aGUgcmVhZE9iamVjdCBvbiB0aGUgaW5zdGFuY2UgbG9hZGVkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJISgoUHVibGljUmVhZFdyaXRlT2JqZWN0KSBvYmpMb2FkZWQpLmNhbGxlZFJlYWRPYmplY3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHVibGljUmVhZFdyaXRlT2JqZWN0IHB1YmxpY1JlYWRXcml0ZSA9IG5ldyBQdWJsaWNSZWFkV3JpdGVPYmplY3QoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHB1YmxpY1JlYWRXcml0ZTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gQ2FuJ3QgaGF2ZSBjYWxsZWQgdGhlIHdyaXRlT2JqZWN0IG9uIHRoZSBpbnN0YW5jZSB0byBkdW1wCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgIXB1YmxpY1JlYWRXcml0ZS5jYWxsZWRXcml0ZU9iamVjdCk7CisgICAgICAgICAgICAvLyBDYW4ndCBoYXZlIGNhbGxlZCB0aGUgcmVhZE9iamVjdCBvbiB0aGUgaW5zdGFuY2UgbG9hZGVkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgISgoUHVibGljUmVhZFdyaXRlT2JqZWN0KSBvYmpMb2FkZWQpLmNhbGxlZFJlYWRPYmplY3QpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCi0JCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiXHQtPiIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xOV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTlfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlGaWVsZE9yZGVyIGZpZWxkT3JkZXIgPSBuZXcgRmllbGRPcmRlcigpOwotCQkJb2JqVG9TYXZlID0gZmllbGRPcmRlcjsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gVGhpcyB0ZXN0IGlzIG9ubHkgdXNlZnVsIGZvciBYLWxvYWRpbmcsIHNvIGlmIGl0IG1hbmFnZWQgdG8KLQkJCS8vIGR1bXAmbG9hZCwgd2UgcGFzc2VkIHRoZSB0ZXN0Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWVsZE9yZGVyIGZpZWxkT3JkZXIgPSBuZXcgRmllbGRPcmRlcigpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gZmllbGRPcmRlcjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGlzIG9ubHkgdXNlZnVsIGZvciBYLWxvYWRpbmcsIHNvIGlmIGl0IG1hbmFnZWQgdG8KKyAgICAgICAgICAgIC8vIGR1bXAmbG9hZCwgd2UgcGFzc2VkIHRoZSB0ZXN0CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzIwX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8yMF93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5JbnRlZ2VyIik7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIENsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSB1bmlxdWUsIHNvIHRlc3QgZm9yID09Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqTG9hZGVkID09IG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuSW50ZWdlciIpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBDbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgdW5pcXVlLCBzbyB0ZXN0IGZvciA9PQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9iakxvYWRlZCA9PSBvYmpUb1NhdmUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8yMV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMjFfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQkvLyBFdmVuIHRob3VnaCBpbnN0YW5jZXMgb2YgamF2YS5sYW5nLk9iamVjdCBhcmUgbm90IFNlcmlhbGl6YWJsZSwKLQkJCS8vIGluc3RhbmNlcyBvZiBqYXZhLmxhbmcuQ2xhc3MgYXJlLiBTbywgdGhlIG9iamVjdAotCQkJLy8gamF2YS5sYW5nLk9iamVjdC5jbGFzcwotCQkJLy8gc2hvdWxkIGJlIHNlcmlhbGl6YWJsZQotCQkJb2JqVG9TYXZlID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBDbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgdW5pcXVlLCBzbyB0ZXN0IGZvciA9PQotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9iakxvYWRlZCA9PSBvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggaW5zdGFuY2VzIG9mIGphdmEubGFuZy5PYmplY3QgYXJlIG5vdCBTZXJpYWxpemFibGUsCisgICAgICAgICAgICAvLyBpbnN0YW5jZXMgb2YgamF2YS5sYW5nLkNsYXNzIGFyZS4gU28sIHRoZSBvYmplY3QKKyAgICAgICAgICAgIC8vIGphdmEubGFuZy5PYmplY3QuY2xhc3MKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSBzZXJpYWxpemFibGUKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5PYmplY3QiKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gQ2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIHVuaXF1ZSwgc28gdGVzdCBmb3IgPT0KKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpMb2FkZWQgPT0gb2JqVG9TYXZlKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMjJfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzIyX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJamF2YS5uZXQuVVJMIHVybCA9IG5ldyBqYXZhLm5ldC5VUkwoImh0dHA6Ly9sb2NhbGhvc3QvYS50eHQiKTsKLQkJCW9ialRvU2F2ZSA9IHVybDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZSgiVVJMcyBhcmUgbm90IHRoZSBzYW1lOiAiICsgdXJsICsgIlx0LFx0IiArIG9iakxvYWRlZCwKLQkJCQkJdXJsLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEubmV0LlVSTCB1cmwgPSBuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vbG9jYWxob3N0L2EudHh0Iik7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB1cmw7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlVSTHMgYXJlIG5vdCB0aGUgc2FtZTogIiArIHVybCArICJcdCxcdCIgKyBvYmpMb2FkZWQsCisgICAgICAgICAgICAgICAgICAgIHVybC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzIzX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8yM193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKKyAgICAgICAgdHJ5IHsKIAotCQkJSnVzdFJlYWRPYmplY3QganVzdFJlYWRPYmplY3QgPSBuZXcgSnVzdFJlYWRPYmplY3QoKTsKLQkJCW9ialRvU2F2ZSA9IGp1c3RSZWFkT2JqZWN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBPbmx5IGNhbGxzIHJlYWRPYmplY3Qgb24gdGhlIGluc3RhbmNlIGxvYWRlZCBpZiB3cml0ZU9iamVjdCB3YXMKLQkJCS8vIGFsc28gZGVmaW5lZAotCQkJYXNzZXJ0VHJ1ZSgiQ2FsbGVkIHJlYWRPYmplY3Qgb24gYW4gb2JqZWN0IHdpdGhvdXQgYSB3cml0ZU9iamVjdCIsCi0JCQkJCSEoKEp1c3RSZWFkT2JqZWN0KSBvYmpMb2FkZWQpLmNhbGxlZFJlYWRPYmplY3QpOworICAgICAgICAgICAgSnVzdFJlYWRPYmplY3QganVzdFJlYWRPYmplY3QgPSBuZXcgSnVzdFJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGp1c3RSZWFkT2JqZWN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBPbmx5IGNhbGxzIHJlYWRPYmplY3Qgb24gdGhlIGluc3RhbmNlIGxvYWRlZCBpZiB3cml0ZU9iamVjdCB3YXMKKyAgICAgICAgICAgIC8vIGFsc28gZGVmaW5lZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FsbGVkIHJlYWRPYmplY3Qgb24gYW4gb2JqZWN0IHdpdGhvdXQgYSB3cml0ZU9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICEoKEp1c3RSZWFkT2JqZWN0KSBvYmpMb2FkZWQpLmNhbGxlZFJlYWRPYmplY3QpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8yNF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMjRfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCUp1c3RXcml0ZU9iamVjdCBqdXN0V3JpdGVPYmplY3QgPSBuZXcgSnVzdFdyaXRlT2JqZWN0KCk7Ci0JCQlvYmpUb1NhdmUgPSBqdXN0V3JpdGVPYmplY3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIENhbGwgd3JpdGVPYmplY3Qgb24gdGhlIGluc3RhbmNlIGV2ZW4gaWYgaXQgZG9lcyBub3QgZGVmaW5lCi0JCQkvLyByZWFkT2JqZWN0Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJanVzdFdyaXRlT2JqZWN0LmNhbGxlZFdyaXRlT2JqZWN0KTsKKyAgICAgICAgICAgIEp1c3RXcml0ZU9iamVjdCBqdXN0V3JpdGVPYmplY3QgPSBuZXcgSnVzdFdyaXRlT2JqZWN0KCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBqdXN0V3JpdGVPYmplY3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIENhbGwgd3JpdGVPYmplY3Qgb24gdGhlIGluc3RhbmNlIGV2ZW4gaWYgaXQgZG9lcyBub3QgZGVmaW5lCisgICAgICAgICAgICAvLyByZWFkT2JqZWN0CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAganVzdFdyaXRlT2JqZWN0LmNhbGxlZFdyaXRlT2JqZWN0KTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzI1X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8yNV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCWphdmEudXRpbC5WZWN0b3IgdmVjdG9yID0gbmV3IGphdmEudXRpbC5WZWN0b3IoMSk7Ci0JCQl2ZWN0b3IuYWRkKEZPTyk7Ci0JCQlvYmpUb1NhdmUgPSB2ZWN0b3I7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHRoZSBzdHJpbmcgdGhlcmUKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBGT08KLQkJCQkJLmVxdWFscygoKGphdmEudXRpbC5WZWN0b3IpIG9iakxvYWRlZCkuZWxlbWVudEF0KDApKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIHZlY3RvciA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKDEpOworICAgICAgICAgICAgdmVjdG9yLmFkZChGT08pOworICAgICAgICAgICAgb2JqVG9TYXZlID0gdmVjdG9yOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB0aGUgc3RyaW5nIHRoZXJlCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgRk9PCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoKChqYXZhLnV0aWwuVmVjdG9yKSBvYmpMb2FkZWQpLmVsZW1lbnRBdCgwKSkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8yNl93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMjZfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlqYXZhLnV0aWwuSGFzaHRhYmxlIGhhc2hUYWJsZSA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKDUpOwotCQkJaGFzaFRhYmxlLnB1dChGT08sIEZPTyk7Ci0JCQlvYmpUb1NhdmUgPSBoYXNoVGFibGU7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWphdmEudXRpbC5IYXNodGFibGUgbG9hZGVkSGFzaFRhYmxlID0gKGphdmEudXRpbC5IYXNodGFibGUpIG9iakxvYWRlZDsKLQkJCS8vIEhhcyB0byBoYXZlIHRoZSBrZXkvdmFsdWUgdGhlcmUgKEZPTyAtPiBGT08pCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgRk9PLmVxdWFscyhsb2FkZWRIYXNoVGFibGUKLQkJCQkJLmdldChGT08pKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLnV0aWwuSGFzaHRhYmxlIGhhc2hUYWJsZSA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKDUpOworICAgICAgICAgICAgaGFzaFRhYmxlLnB1dChGT08sIEZPTyk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBoYXNoVGFibGU7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGphdmEudXRpbC5IYXNodGFibGUgbG9hZGVkSGFzaFRhYmxlID0gKGphdmEudXRpbC5IYXNodGFibGUpIG9iakxvYWRlZDsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHRoZSBrZXkvdmFsdWUgdGhlcmUgKEZPTyAtPiBGT08pCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgRk9PLmVxdWFscyhsb2FkZWRIYXNoVGFibGUKKyAgICAgICAgICAgICAgICAgICAgLmdldChGT08pKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzI3X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8yN193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nID0gbmV3IENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKCk7Ci0JCQlvYmpUb1NhdmUgPSBjbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZzsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgcnVuIHRoZSByZXBsYWNlbWVudCBtZXRob2QKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgcnVuIHdyaXRlUmVwbGFjZSIsCi0JCQkJCWNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nLmNhbGxlZFJlcGxhY2VtZW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nID0gbmV3IENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZzsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgcnVuIHRoZSByZXBsYWNlbWVudCBtZXRob2QKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRpZCBub3QgcnVuIHdyaXRlUmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nLmNhbGxlZFJlcGxhY2VtZW50KTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgbG9hZGVkIGEgU3RyaW5nIChyZXBsYWNlbWVudCBvYmplY3QpCi0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IHJlcGxhY2UgcHJvcGVybHkiLCBGT08uZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgbG9hZGVkIGEgU3RyaW5nIChyZXBsYWNlbWVudCBvYmplY3QpCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IHJlcGxhY2UgcHJvcGVybHkiLCBGT08uZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8yOF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMjhfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlNdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIG11bHRpcGxlQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgPSBuZXcgTXVsdGlwbGVDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZygpOwotCQkJb2JqVG9TYXZlID0gbXVsdGlwbGVDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZzsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgbG9hZGVkIGEgU3RyaW5nIChyZXBsYWNlbWVudCBvYmplY3QpCi0JCQlhc3NlcnRUcnVlKAotCQkJCQkiRXhlY3V0ZWQgbXVsdGlwbGUgbGV2ZWxzIG9mIHJlcGxhY2VtZW50IChzZWUgUFIgMUY5Uk5UMSksIGxvYWRlZD0gIgotCQkJCQkJCSsgb2JqTG9hZGVkLAotCQkJCQlvYmpMb2FkZWQgaW5zdGFuY2VvZiBNdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nLkMxKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE11bHRpcGxlQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgbXVsdGlwbGVDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyA9IG5ldyBNdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBtdWx0aXBsZUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSBsb2FkZWQgYSBTdHJpbmcgKHJlcGxhY2VtZW50IG9iamVjdCkKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJFeGVjdXRlZCBtdWx0aXBsZSBsZXZlbHMgb2YgcmVwbGFjZW1lbnQgKHNlZSBQUiAxRjlSTlQxKSwgbG9hZGVkPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmpMb2FkZWQsCisgICAgICAgICAgICAgICAgICAgIG9iakxvYWRlZCBpbnN0YW5jZW9mIE11bHRpcGxlQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcuQzEpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzI5X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8yOV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCUNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nID0gbmV3IENsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nKCk7Ci0JCQlvYmpUb1NhdmUgPSBjbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZzsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgbG9hZGVkIGEgU3RyaW5nIChyZXBsYWNlbWVudCBvYmplY3QpCi0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IHJ1biByZWFkUmVzb2x2ZSIsIEZPTy5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZyBjbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZyA9IG5ldyBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZygpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gY2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmc7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIGxvYWRlZCBhIFN0cmluZyAocmVwbGFjZW1lbnQgb2JqZWN0KQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBydW4gcmVhZFJlc29sdmUiLCBGT08uZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8zMF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMzBfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZ1Zpb2xhdGVzRmllbGRUeXBlIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nVmlvbGF0ZXNGaWVsZFR5cGUgPSBuZXcgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmdWaW9sYXRlc0ZpZWxkVHlwZSgpOwotCQkJb2JqVG9TYXZlID0gY2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmdWaW9sYXRlc0ZpZWxkVHlwZTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gV2UgY2Fubm90IGdlcmUgaGVyZSwgdGhlIGxvYWQgcmVwbGFjZW1lbnQgbXVzdCBoYXZlIGNhdXNlZCBhCi0JCQkvLyBmaWVsZCB0eXBlIHZpb2xhdGlvbgotCQkJZmFpbCgKLQkJCQkJIkxvYWRpbmcgcmVwbGFjZW1lbnRzIGNhbiBjYXVzZSBmaWVsZCB0eXBlIHZpb2xhdGlvbiBpbiB0aGlzIGltcGxlbWVudGF0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc0Jhc2VkUmVwbGFjZW1lbnRXaGVuTG9hZGluZ1Zpb2xhdGVzRmllbGRUeXBlIGNsYXNzQmFzZWRSZXBsYWNlbWVudFdoZW5Mb2FkaW5nVmlvbGF0ZXNGaWVsZFR5cGUgPSBuZXcgQ2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmdWaW9sYXRlc0ZpZWxkVHlwZSgpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gY2xhc3NCYXNlZFJlcGxhY2VtZW50V2hlbkxvYWRpbmdWaW9sYXRlc0ZpZWxkVHlwZTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gV2UgY2Fubm90IGdlcmUgaGVyZSwgdGhlIGxvYWQgcmVwbGFjZW1lbnQgbXVzdCBoYXZlIGNhdXNlZCBhCisgICAgICAgICAgICAvLyBmaWVsZCB0eXBlIHZpb2xhdGlvbgorICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgIkxvYWRpbmcgcmVwbGFjZW1lbnRzIGNhbiBjYXVzZSBmaWVsZCB0eXBlIHZpb2xhdGlvbiBpbiB0aGlzIGltcGxlbWVudGF0aW9uIik7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkiTG9hZGluZyByZXBsYWNlbWVudHMgY2FuIE5PVCBjYXVzZSBmaWVsZCB0eXBlIHZpb2xhdGlvbiBpbiB0aGlzIGltcGxlbWVudGF0aW9uIiwKLQkJCQkJdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJMb2FkaW5nIHJlcGxhY2VtZW50cyBjYW4gTk9UIGNhdXNlIGZpZWxkIHR5cGUgdmlvbGF0aW9uIGluIHRoaXMgaW1wbGVtZW50YXRpb24iLAorICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzMxX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8zMV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCU15RXhjZXB0aW9uV2hlbkR1bXBpbmcxIGV4Y2VwdGlvbldoZW5EdW1waW5nID0gbmV3IE15RXhjZXB0aW9uV2hlbkR1bXBpbmcxKCk7Ci0JCQlvYmpUb1NhdmUgPSBleGNlcHRpb25XaGVuRHVtcGluZzsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJYm9vbGVhbiBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZHVtcChvYmpUb1NhdmUpOwotCQkJfSBjYXRjaCAoTXlFeGNlcHRpb25XaGVuRHVtcGluZzEuTXlFeGNlcHRpb24gZSkgewotCQkJCWNhdXNlZEV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCQk7Ci0JCQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBjYXVzZWQgYW4gZXhjZXB0aW9uIHdoZW4gZHVtcGluZyIsCi0JCQkJCWNhdXNlZEV4Y2VwdGlvbik7Ci0JCQljYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJb2JqTG9hZGVkID0gcmVsb2FkKCk7Ci0JCQkJLy8gQWx0aG91Z2ggdGhlIHNwZWMgc2F5cyB3ZSBzaG91bGQgZ2V0IGEgV3JpdGVBYm9ydGVkRXhjZXB0aW9uLAotCQkJCS8vIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCBoYW5kbGUgYW4gRXhjZXB0aW9uIHdoZW4gcmVhZGluZwotCQkJCS8vIHByaW1pdGl2ZSBkYXRhIHNvIHdlIGdldCBDbGFzc0Nhc3RFeGNlcHRpb24gaW5zdGVhZAotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQljYXVzZWRFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQkJOwotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgY2F1c2VkIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gbG9hZGluZyIsCi0JCQkJCWNhdXNlZEV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE15RXhjZXB0aW9uV2hlbkR1bXBpbmcxIGV4Y2VwdGlvbldoZW5EdW1waW5nID0gbmV3IE15RXhjZXB0aW9uV2hlbkR1bXBpbmcxKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBleGNlcHRpb25XaGVuRHVtcGluZzsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgYm9vbGVhbiBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZHVtcChvYmpUb1NhdmUpOworICAgICAgICAgICAgfSBjYXRjaCAoTXlFeGNlcHRpb25XaGVuRHVtcGluZzEuTXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBjYXVzZWQgYW4gZXhjZXB0aW9uIHdoZW4gZHVtcGluZyIsCisgICAgICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbik7CisgICAgICAgICAgICBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2JqTG9hZGVkID0gcmVsb2FkKCk7CisgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggdGhlIHNwZWMgc2F5cyB3ZSBzaG91bGQgZ2V0IGEgV3JpdGVBYm9ydGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCBoYW5kbGUgYW4gRXhjZXB0aW9uIHdoZW4gcmVhZGluZworICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSBkYXRhIHNvIHdlIGdldCBDbGFzc0Nhc3RFeGNlcHRpb24gaW5zdGVhZAorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjYXVzZWRFeGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgY2F1c2VkIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gbG9hZGluZyIsCisgICAgICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMzJfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzMyX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJTXlFeGNlcHRpb25XaGVuRHVtcGluZzIgZXhjZXB0aW9uV2hlbkR1bXBpbmcgPSBuZXcgTXlFeGNlcHRpb25XaGVuRHVtcGluZzIoKTsKLQkJCW9ialRvU2F2ZSA9IGV4Y2VwdGlvbldoZW5EdW1waW5nOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlib29sZWFuIGNhdXNlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlkdW1wKG9ialRvU2F2ZSk7Ci0JCQl9IGNhdGNoIChNeUV4Y2VwdGlvbldoZW5EdW1waW5nMi5NeUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2F1c2VkRXhjZXB0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJCTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGNhdXNlZCBhbiBleGNlcHRpb24gd2hlbiBkdW1waW5nIiwKLQkJCQkJY2F1c2VkRXhjZXB0aW9uKTsKLQkJCWNhdXNlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlvYmpMb2FkZWQgPSByZWxvYWQoKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCQljYXVzZWRFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQkJOwotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIlNob3VsZCBoYXZlIGNhdXNlZCBhIGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uIHdoZW4gbG9hZGluZyIsCi0JCQkJCWNhdXNlZEV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NDYXN0RXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNeUV4Y2VwdGlvbldoZW5EdW1waW5nMiBleGNlcHRpb25XaGVuRHVtcGluZyA9IG5ldyBNeUV4Y2VwdGlvbldoZW5EdW1waW5nMigpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gZXhjZXB0aW9uV2hlbkR1bXBpbmc7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY2F1c2VkRXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGR1bXAob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE15RXhjZXB0aW9uV2hlbkR1bXBpbmcyLk15RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjYXVzZWRFeGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgY2F1c2VkIGFuIGV4Y2VwdGlvbiB3aGVuIGR1bXBpbmciLAorICAgICAgICAgICAgICAgICAgICBjYXVzZWRFeGNlcHRpb24pOworICAgICAgICAgICAgY2F1c2VkRXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9iakxvYWRlZCA9IHJlbG9hZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5Xcml0ZUFib3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiU2hvdWxkIGhhdmUgY2F1c2VkIGEgamF2YS5pby5Xcml0ZUFib3J0ZWRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgY2F1c2VkRXhjZXB0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc0Nhc3RFeGNlcHRpb24gOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X05vblNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcgbm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcgPSBuZXcgTm9uU2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcoKTsKLQkJCW9ialRvU2F2ZSA9IG5vblNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlib29sZWFuIGNhdXNlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlkdW1wKG9ialRvU2F2ZSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2F1c2VkRXhjZXB0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJCTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGNhdXNlZCBhbiBleGNlcHRpb24gd2hlbiBkdW1waW5nIiwKLQkJCQkJY2F1c2VkRXhjZXB0aW9uKTsKLQkJCWNhdXNlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlvYmpMb2FkZWQgPSByZWxvYWQoKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCQljYXVzZWRFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQkJOwotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIlNob3VsZCBoYXZlIGNhdXNlZCBhIGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uIHdoZW4gbG9hZGluZyIsCi0JCQkJCWNhdXNlZEV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5vblNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nIG5vblNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nID0gbmV3IE5vblNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBub25TZXJpYWxpemFibGVFeGNlcHRpb25XaGVuRHVtcGluZzsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgYm9vbGVhbiBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZHVtcChvYmpUb1NhdmUpOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBjYXVzZWQgYW4gZXhjZXB0aW9uIHdoZW4gZHVtcGluZyIsCisgICAgICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbik7CisgICAgICAgICAgICBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2JqTG9hZGVkID0gcmVsb2FkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLldyaXRlQWJvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2F1c2VkRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJTaG91bGQgaGF2ZSBjYXVzZWQgYSBqYXZhLmlvLldyaXRlQWJvcnRlZEV4Y2VwdGlvbiB3aGVuIGxvYWRpbmciLAorICAgICAgICAgICAgICAgICAgICBjYXVzZWRFeGNlcHRpb24pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzMzX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8zM193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCU15VW5zZXJpYWxpemFibGVFeGNlcHRpb25XaGVuRHVtcGluZyBleGNlcHRpb25XaGVuRHVtcGluZyA9IG5ldyBNeVVuc2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcoKTsKLQkJCW9ialRvU2F2ZSA9IGV4Y2VwdGlvbldoZW5EdW1waW5nOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlib29sZWFuIGNhdXNlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlkdW1wKG9ialRvU2F2ZSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2F1c2VkRXhjZXB0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJCTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGNhdXNlZCBhbiBleGNlcHRpb24gd2hlbiBkdW1waW5nIiwKLQkJCQkJY2F1c2VkRXhjZXB0aW9uKTsKLQkJCS8vIEFzIHRoZSBzdHJlYW0gaXMgY29ycnVwdGVkLCByZWFkaW5nIHRoZSBzdHJlYW0gd2lsbCBoYXZlCi0JCQkvLyB1bmRlZmluZWQgcmVzdWx0cwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNeVVuc2VyaWFsaXphYmxlRXhjZXB0aW9uV2hlbkR1bXBpbmcgZXhjZXB0aW9uV2hlbkR1bXBpbmcgPSBuZXcgTXlVbnNlcmlhbGl6YWJsZUV4Y2VwdGlvbldoZW5EdW1waW5nKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBleGNlcHRpb25XaGVuRHVtcGluZzsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgYm9vbGVhbiBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZHVtcChvYmpUb1NhdmUpOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBjYXVzZWQgYW4gZXhjZXB0aW9uIHdoZW4gZHVtcGluZyIsCisgICAgICAgICAgICAgICAgICAgIGNhdXNlZEV4Y2VwdGlvbik7CisgICAgICAgICAgICAvLyBBcyB0aGUgc3RyZWFtIGlzIGNvcnJ1cHRlZCwgcmVhZGluZyB0aGUgc3RyZWFtIHdpbGwgaGF2ZQorICAgICAgICAgICAgLy8gdW5kZWZpbmVkIHJlc3VsdHMKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8zNF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMzRfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlqYXZhLmlvLklPRXhjZXB0aW9uIGlvZSA9IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7Ci0JCQlvYmpUb1NhdmUgPSBpb2U7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBiZSBhYmxlIHRvIHNhdmUvbG9hZCBhbiBleGNlcHRpb24KLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEuaW8uSU9FeGNlcHRpb24gaW9lID0gbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGlvZTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8zNV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMzVfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuSGFzaHRhYmxlIik7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIENsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSB1bmlxdWUsIHNvIHRlc3QgZm9yID09Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqTG9hZGVkID09IG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuSGFzaHRhYmxlIik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIENsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSB1bmlxdWUsIHNvIHRlc3QgZm9yID09CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqTG9hZGVkID09IG9ialRvU2F2ZSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzM2X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8zNl93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCWphdmEuaW8uSU9FeGNlcHRpb24gZXggPSBuZXcgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb24oRk9PKTsKLQkJCW9ialRvU2F2ZSA9IGV4OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gYmUgYWJsZSB0byBzYXZlL2xvYWQgYW4gZXhjZXB0aW9uCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLmlvLklPRXhjZXB0aW9uIGV4ID0gbmV3IGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uKEZPTyk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBleDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8zN193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMzdfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlqYXZhLmlvLklPRXhjZXB0aW9uIGV4ID0gbmV3IGphdmEuaW8uSW52YWxpZE9iamVjdEV4Y2VwdGlvbihGT08pOwotCQkJb2JqVG9TYXZlID0gZXg7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBiZSBhYmxlIHRvIHNhdmUvbG9hZCBhbiBleGNlcHRpb24KLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEuaW8uSU9FeGNlcHRpb24gZXggPSBuZXcgamF2YS5pby5JbnZhbGlkT2JqZWN0RXhjZXB0aW9uKEZPTyk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBleDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8zOF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMzhfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlqYXZhLmlvLklPRXhjZXB0aW9uIGV4ID0gbmV3IGphdmEuaW8uTm90QWN0aXZlRXhjZXB0aW9uKEZPTyk7Ci0JCQlvYmpUb1NhdmUgPSBleDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgamF2YS5pby5JT0V4Y2VwdGlvbiBleCA9IG5ldyBqYXZhLmlvLk5vdEFjdGl2ZUV4Y2VwdGlvbihGT08pOworICAgICAgICAgICAgb2JqVG9TYXZlID0gZXg7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBiZSBhYmxlIHRvIHNhdmUvbG9hZCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0cnVlKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMzlfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzM5X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJamF2YS5pby5JT0V4Y2VwdGlvbiBleCA9IG5ldyBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbihGT08pOwotCQkJb2JqVG9TYXZlID0gZXg7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBiZSBhYmxlIHRvIHNhdmUvbG9hZCBhbiBleGNlcHRpb24KLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEuaW8uSU9FeGNlcHRpb24gZXggPSBuZXcgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb24oRk9PKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGV4OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gYmUgYWJsZSB0byBzYXZlL2xvYWQgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzQwX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF80MF93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCWphdmEuaW8uSU9FeGNlcHRpb24gZXggPSBuZXcgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oRk9PKTsKLQkJCW9ialRvU2F2ZSA9IGV4OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gYmUgYWJsZSB0byBzYXZlL2xvYWQgYW4gZXhjZXB0aW9uCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLmlvLklPRXhjZXB0aW9uIGV4ID0gbmV3IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKEZPTyk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBleDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0Mi5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0Mi5qYXZhCmluZGV4IDFhYjU1OWUuLjhjOTAwOGQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TZXJpYWxpemF0aW9uU3RyZXNzVGVzdDIuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QyLmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CkBAIC0zNSwyMTMwICs0MCwyNTAwIEBACiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhTZXJpYWxpemFibGUuY2xhc3MpIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0MiBleHRlbmRzIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0IHsKIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlYWRXcml0ZU9iamVjdEFuZFByaW1pdGl2ZURhdGEgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQl0cmFuc2llbnQgbG9uZyBtaWxsaXNlY29uZHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVhZFdyaXRlT2JqZWN0QW5kUHJpbWl0aXZlRGF0YSBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHRyYW5zaWVudCBsb25nIG1pbGxpc2Vjb25kczsKIAotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRXcml0ZU9iamVjdCA9IGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYWxsZWRXcml0ZU9iamVjdCA9IGZhbHNlOwogCi0JCXB1YmxpYyBib29sZWFuIGNhbGxlZFJlYWRPYmplY3QgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FsbGVkUmVhZE9iamVjdCA9IGZhbHNlOwogCi0JCXB1YmxpYyBSZWFkV3JpdGVPYmplY3RBbmRQcmltaXRpdmVEYXRhKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgUmVhZFdyaXRlT2JqZWN0QW5kUHJpbWl0aXZlRGF0YSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQkvLyBUaGlzICpoYXMqIHRvIGNvbWUgYWZ0ZXIgdGhlIGNhbGwgdG8gZGVmYXVsdFJlYWRPYmplY3Qgb3IgdGhlCi0JCQkvLyB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0gd2lsbCBvdmVycmlkZQotCQkJY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7IAotCQkJbWlsbGlzZWNvbmRzID0gaW4ucmVhZExvbmcoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAvLyBUaGlzICpoYXMqIHRvIGNvbWUgYWZ0ZXIgdGhlIGNhbGwgdG8gZGVmYXVsdFJlYWRPYmplY3Qgb3IgdGhlCisgICAgICAgICAgICAvLyB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0gd2lsbCBvdmVycmlkZQorICAgICAgICAgICAgY2FsbGVkUmVhZE9iamVjdCA9IHRydWU7IAorICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkJY2FsbGVkV3JpdGVPYmplY3QgPSB0cnVlOwotCQkJb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQkJb3V0LndyaXRlTG9uZyhtaWxsaXNlY29uZHMpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNhbGxlZFdyaXRlT2JqZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKyAgICAgICAgICAgIG91dC53cml0ZUxvbmcobWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIFdoYXQgaGFwcGVucyBpZiBhIGNsYXNzIGRlZmluZXMgc2VyaWFsUGVyc2lzdGVudEZpZWxkcyB0aGF0IGRvIG5vdCBtYXRjaAotCS8vIHJlYWwgZmllbGRzIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSByZWFkL3dyaXRlT2JqZWN0Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2l0aFVubWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzIGltcGxlbWVudHMKLQkJCWphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCi0JCQkJInZhbHVlIiwgU3RyaW5nLmNsYXNzKSB9OworICAgIC8vIFdoYXQgaGFwcGVucyBpZiBhIGNsYXNzIGRlZmluZXMgc2VyaWFsUGVyc2lzdGVudEZpZWxkcyB0aGF0IGRvIG5vdCBtYXRjaAorICAgIC8vIHJlYWwgZmllbGRzIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSByZWFkL3dyaXRlT2JqZWN0CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2l0aFVubWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzIGltcGxlbWVudHMKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCisgICAgICAgICAgICAgICAgInZhbHVlIiwgU3RyaW5nLmNsYXNzKSB9OwogCi0JCXB1YmxpYyBpbnQgYW5JbnN0YW5jZVZhciA9IDU7CisgICAgICAgIHB1YmxpYyBpbnQgYW5JbnN0YW5jZVZhciA9IDU7CiAKLQkJcHVibGljIFdpdGhVbm1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBXaXRoVW5tYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisgICAgfQogCi0JLy8gV2hhdCBoYXBwZW5zIGlmIGEgY2xhc3MgZGVmaW5lcyBzZXJpYWxQZXJzaXN0ZW50RmllbGRzIHdoaWNoIG1hdGNoIGFjdHVhbAotCS8vIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFdpdGhNYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7IG5ldyBPYmplY3RTdHJlYW1GaWVsZCgKLQkJCQkiYW5JbnN0YW5jZVZhciIsIFN0cmluZy5jbGFzcykgfTsKKyAgICAvLyBXaGF0IGhhcHBlbnMgaWYgYSBjbGFzcyBkZWZpbmVzIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgd2hpY2ggbWF0Y2ggYWN0dWFsCisgICAgLy8gZmllbGRzCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2l0aE1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcyBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsgbmV3IE9iamVjdFN0cmVhbUZpZWxkKAorICAgICAgICAgICAgICAgICJhbkluc3RhbmNlVmFyIiwgU3RyaW5nLmNsYXNzKSB9OwogCi0JCXB1YmxpYyBTdHJpbmcgYW5JbnN0YW5jZVZhciA9IEZPTyArIEZPTzsKKyAgICAgICAgcHVibGljIFN0cmluZyBhbkluc3RhbmNlVmFyID0gRk9PICsgRk9POwogCi0JCXB1YmxpYyBXaXRoTWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIFdpdGhNYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisgICAgfQogCi0JLy8gVGVzdHMgdGhlIG9maWNpYWwgYmVoYXZpb3IgZm9yIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNVUxBVEVEX0ZJRUxEX05BTUUgPSAidGV4dCI7CisgICAgLy8gVGVzdHMgdGhlIG9maWNpYWwgYmVoYXZpb3IgZm9yIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNVUxBVEVEX0ZJRUxEX05BTUUgPSAidGV4dCI7CiAKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCi0JCQkJU0lNVUxBVEVEX0ZJRUxEX05BTUUsIFN0cmluZy5jbGFzcykgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCisgICAgICAgICAgICAgICAgU0lNVUxBVEVEX0ZJRUxEX05BTUUsIFN0cmluZy5jbGFzcykgfTsKIAotCQlwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OworICAgICAgICBwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OwogCi0JCXB1YmxpYyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgU2VyaWFsUGVyc2lzdGVudEZpZWxkcygpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCU9iamVjdElucHV0U3RyZWFtLkdldEZpZWxkIGZpZWxkcyA9IGluLnJlYWRGaWVsZHMoKTsKLQkJCWFuSW5zdGFuY2VWYXIgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIGZpZWxkcy5nZXQoCi0JCQkJCVNJTVVMQVRFRF9GSUVMRF9OQU1FLCAiLTUiKSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbS5HZXRGaWVsZCBmaWVsZHMgPSBpbi5yZWFkRmllbGRzKCk7CisgICAgICAgICAgICBhbkluc3RhbmNlVmFyID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBmaWVsZHMuZ2V0KAorICAgICAgICAgICAgICAgICAgICBTSU1VTEFURURfRklFTERfTkFNRSwgIi01IikpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlPYmplY3RPdXRwdXRTdHJlYW0uUHV0RmllbGQgZmllbGRzID0gb3V0LnB1dEZpZWxkcygpOwotCQkJZmllbGRzLnB1dChTSU1VTEFURURfRklFTERfTkFNRSwgSW50ZWdlci50b1N0cmluZyhhbkluc3RhbmNlVmFyKSk7Ci0JCQlvdXQud3JpdGVGaWVsZHMoKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0uUHV0RmllbGQgZmllbGRzID0gb3V0LnB1dEZpZWxkcygpOworICAgICAgICAgICAgZmllbGRzLnB1dChTSU1VTEFURURfRklFTERfTkFNRSwgSW50ZWdlci50b1N0cmluZyhhbkluc3RhbmNlVmFyKSk7CisgICAgICAgICAgICBvdXQud3JpdGVGaWVsZHMoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIFRlc3RzIHRoZSBiZWhhdmlvciBmb3Igc2VyaWFsUGVyc2lzdGVudEZpZWxkcyB3aGVuIG5vIGZpZWxkcyBhcmUgYWN0dWFsbHkKLQkvLyBzZXQKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXcml0ZUZpZWxkc1dpdGhvdXRGZXRjaGluZ1B1dEZpZWxkcyBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1VTEFURURfRklFTERfTkFNRSA9ICJ0ZXh0IjsKKyAgICAvLyBUZXN0cyB0aGUgYmVoYXZpb3IgZm9yIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgd2hlbiBubyBmaWVsZHMgYXJlIGFjdHVhbGx5CisgICAgLy8gc2V0CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JpdGVGaWVsZHNXaXRob3V0RmV0Y2hpbmdQdXRGaWVsZHMgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNVUxBVEVEX0ZJRUxEX05BTUUgPSAidGV4dCI7CiAKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCi0JCQkJU0lNVUxBVEVEX0ZJRUxEX05BTUUsIFN0cmluZy5jbGFzcykgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geyBuZXcgT2JqZWN0U3RyZWFtRmllbGQoCisgICAgICAgICAgICAgICAgU0lNVUxBVEVEX0ZJRUxEX05BTUUsIFN0cmluZy5jbGFzcykgfTsKIAotCQlwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OworICAgICAgICBwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OwogCi0JCXB1YmxpYyBXcml0ZUZpZWxkc1dpdGhvdXRGZXRjaGluZ1B1dEZpZWxkcygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFdyaXRlRmllbGRzV2l0aG91dEZldGNoaW5nUHV0RmllbGRzKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gaW4ucmVhZEZpZWxkcygpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gaW4ucmVhZEZpZWxkcygpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlvdXQud3JpdGVGaWVsZHMoKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBvdXQud3JpdGVGaWVsZHMoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIFRlc3RzIHdoYXQgaGFwcGVucyBpZiBvbmUgYXNrcyBmb3IgUHV0RmllbGQvZ2V0RmllbGQgd2hlbiB0aGUgY2xhc3MgZG9lcwotCS8vIG5vdCBkZWNsYXJlIG9uZQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbFBlcnNpc3RlbnRGaWVsZHNXaXRob3V0RmllbGQgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OworICAgIC8vIFRlc3RzIHdoYXQgaGFwcGVucyBpZiBvbmUgYXNrcyBmb3IgUHV0RmllbGQvZ2V0RmllbGQgd2hlbiB0aGUgY2xhc3MgZG9lcworICAgIC8vIG5vdCBkZWNsYXJlIG9uZQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbFBlcnNpc3RlbnRGaWVsZHNXaXRob3V0RmllbGQgaW1wbGVtZW50cworICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgaW50IGFuSW5zdGFuY2VWYXIgPSA1OwogCi0JCXB1YmxpYyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzV2l0aG91dEZpZWxkKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgU2VyaWFsUGVyc2lzdGVudEZpZWxkc1dpdGhvdXRGaWVsZCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCU9iamVjdElucHV0U3RyZWFtLkdldEZpZWxkIGZpZWxkcyA9IGluLnJlYWRGaWVsZHMoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtLkdldEZpZWxkIGZpZWxkcyA9IGluLnJlYWRGaWVsZHMoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkIGZpZWxkcyA9IG91dC5wdXRGaWVsZHMoKTsKLQkJCW91dC53cml0ZUZpZWxkcygpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbS5QdXRGaWVsZCBmaWVsZHMgPSBvdXQucHV0RmllbGRzKCk7CisgICAgICAgICAgICBvdXQud3JpdGVGaWVsZHMoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCS8vIHdyaXRlT2JqZWN0IHdyaXRlcyBleHRyYSBwcmltaXRpdmUgdHlwZXMgYW5kIG9iamVjdHMgd2hpY2ggcmVhZE9iamVjdAotCS8vIGRvZXMgbm90IGNvbnN1bWUuIEhhdmUgdG8gbWFrZSBzdXJlIHdlIGNhbiBsb2FkIG9iamVjdCBwcm9wZXJseSBBTkQKLQkvLyBvYmplY3QgYWZ0ZXIgaXQgKHRvIHNob3cgdGhlIGV4dHJhIGJ5dGVbXSBpcyBjb25zdW1lZCkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPcHRpb25hbERhdGFOb3RSZWFkIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwcml2YXRlIGludCBmaWVsZDEsIGZpZWxkMjsKKyAgICAvLyB3cml0ZU9iamVjdCB3cml0ZXMgZXh0cmEgcHJpbWl0aXZlIHR5cGVzIGFuZCBvYmplY3RzIHdoaWNoIHJlYWRPYmplY3QKKyAgICAvLyBkb2VzIG5vdCBjb25zdW1lLiBIYXZlIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gbG9hZCBvYmplY3QgcHJvcGVybHkgQU5ECisgICAgLy8gb2JqZWN0IGFmdGVyIGl0ICh0byBzaG93IHRoZSBleHRyYSBieXRlW10gaXMgY29uc3VtZWQpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3B0aW9uYWxEYXRhTm90UmVhZCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZmllbGQxLCBmaWVsZDI7CiAKLQkJcHVibGljIE9wdGlvbmFsRGF0YU5vdFJlYWQoKSB7Ci0JCX0KKyAgICAgICAgcHVibGljIE9wdGlvbmFsRGF0YU5vdFJlYWQoKSB7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7Ci0JCQkJbmV3IE9iamVjdFN0cmVhbUZpZWxkKCJmaWVsZDEiLCBJbnRlZ2VyLlRZUEUpLAotCQkJCW5ldyBPYmplY3RTdHJlYW1GaWVsZCgiZmllbGQyIiwgSW50ZWdlci5UWVBFKSwKLQkJCQluZXcgT2JqZWN0U3RyZWFtRmllbGQoIm1vbnRoTGVuZ3RoIiwgYnl0ZVtdLmNsYXNzKSwgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0geworICAgICAgICAgICAgICAgIG5ldyBPYmplY3RTdHJlYW1GaWVsZCgiZmllbGQxIiwgSW50ZWdlci5UWVBFKSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0U3RyZWFtRmllbGQoImZpZWxkMiIsIEludGVnZXIuVFlQRSksCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFN0cmVhbUZpZWxkKCJtb250aExlbmd0aCIsIGJ5dGVbXS5jbGFzcyksIH07CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlPYmplY3RPdXRwdXRTdHJlYW0uUHV0RmllbGQgZmllbGRzID0gc3RyZWFtLnB1dEZpZWxkcygpOwotCQkJZmllbGRzLnB1dCgiZmllbGQxIiwgMSk7Ci0JCQlmaWVsZHMucHV0KCJmaWVsZDIiLCAyKTsKLQkJCWZpZWxkcy5wdXQoIm1vbnRoTGVuZ3RoIiwgbmV3IGJ5dGVbXSB7IDcsIDgsIDkgfSk7Ci0JCQlzdHJlYW0ud3JpdGVGaWVsZHMoKTsKLQkJCXN0cmVhbS53cml0ZUludCg0KTsKLQkJCWJ5dGVbXSB2YWx1ZXMgPSBuZXcgYnl0ZVs0XTsKLQkJCXZhbHVlc1swXSA9IChieXRlKSAxNjsKLQkJCXZhbHVlc1sxXSA9IChieXRlKSAxNzsKLQkJCXZhbHVlc1syXSA9IChieXRlKSAxODsKLQkJCXZhbHVlc1szXSA9IChieXRlKSAxOTsKLQkJCXN0cmVhbS53cml0ZU9iamVjdCh2YWx1ZXMpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkIGZpZWxkcyA9IHN0cmVhbS5wdXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZpZWxkcy5wdXQoImZpZWxkMSIsIDEpOworICAgICAgICAgICAgZmllbGRzLnB1dCgiZmllbGQyIiwgMik7CisgICAgICAgICAgICBmaWVsZHMucHV0KCJtb250aExlbmd0aCIsIG5ldyBieXRlW10geyA3LCA4LCA5IH0pOworICAgICAgICAgICAgc3RyZWFtLndyaXRlRmllbGRzKCk7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGVJbnQoNCk7CisgICAgICAgICAgICBieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbNF07CisgICAgICAgICAgICB2YWx1ZXNbMF0gPSAoYnl0ZSkgMTY7CisgICAgICAgICAgICB2YWx1ZXNbMV0gPSAoYnl0ZSkgMTc7CisgICAgICAgICAgICB2YWx1ZXNbMl0gPSAoYnl0ZSkgMTg7CisgICAgICAgICAgICB2YWx1ZXNbM10gPSAoYnl0ZSkgMTk7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QodmFsdWVzKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJCUNsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gc3RyZWFtLnJlYWRGaWVsZHMoKTsKLQkJCWZpZWxkMSA9IGZpZWxkcy5nZXQoImZpZWxkMSIsIDApOwotCQkJZmllbGQyID0gZmllbGRzLmdldCgiZmllbGQxIiwgMCk7Ci0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gc3RyZWFtLnJlYWRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZpZWxkMSA9IGZpZWxkcy5nZXQoImZpZWxkMSIsIDApOworICAgICAgICAgICAgZmllbGQyID0gZmllbGRzLmdldCgiZmllbGQxIiwgMCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZFB1dEZpZWxkIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgT3B0aW9uYWxEYXRhTm90UmVhZCBmaWVsZDE7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXN0ZWRQdXRGaWVsZCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIE9wdGlvbmFsRGF0YU5vdFJlYWQgZmllbGQxOwogCi0JCXB1YmxpYyBOZXN0ZWRQdXRGaWVsZCgpIHsKLQkJfQorICAgICAgICBwdWJsaWMgTmVzdGVkUHV0RmllbGQoKSB7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7IG5ldyBPYmplY3RTdHJlYW1GaWVsZCgKLQkJCQkiZmllbGQxIiwgT3B0aW9uYWxEYXRhTm90UmVhZC5jbGFzcyksIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsgbmV3IE9iamVjdFN0cmVhbUZpZWxkKAorICAgICAgICAgICAgICAgICJmaWVsZDEiLCBPcHRpb25hbERhdGFOb3RSZWFkLmNsYXNzKSwgfTsKIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCU9iamVjdE91dHB1dFN0cmVhbS5QdXRGaWVsZCBmaWVsZHMgPSBzdHJlYW0ucHV0RmllbGRzKCk7Ci0JCQlmaWVsZHMucHV0KCJmaWVsZDEiLCBuZXcgT3B0aW9uYWxEYXRhTm90UmVhZCgpKTsKLQkJCXN0cmVhbS53cml0ZUZpZWxkcygpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkIGZpZWxkcyA9IHN0cmVhbS5wdXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZpZWxkcy5wdXQoImZpZWxkMSIsIG5ldyBPcHRpb25hbERhdGFOb3RSZWFkKCkpOworICAgICAgICAgICAgc3RyZWFtLndyaXRlRmllbGRzKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCQlDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCU9iamVjdElucHV0U3RyZWFtLkdldEZpZWxkIGZpZWxkcyA9IHN0cmVhbS5yZWFkRmllbGRzKCk7Ci0JCQlmaWVsZDEgPSAoT3B0aW9uYWxEYXRhTm90UmVhZCkgZmllbGRzLmdldCgiZmllbGQxIiwgbnVsbCk7Ci0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gc3RyZWFtLnJlYWRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZpZWxkMSA9IChPcHRpb25hbERhdGFOb3RSZWFkKSBmaWVsZHMuZ2V0KCJmaWVsZDEiLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCS8vIFRoaXMgb25lIHRlc3RzIHN0cmVhbS1iYXNlZCByZXBsYWNlbWVudCB3aGVuIGR1bXBpbmcKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgZXh0ZW5kcwotCQkJamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gewotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRBcnJheVJlcGxhY2VtZW50ID0gZmFsc2U7CisgICAgLy8gVGhpcyBvbmUgdGVzdHMgc3RyZWFtLWJhc2VkIHJlcGxhY2VtZW50IHdoZW4gZHVtcGluZworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyBleHRlbmRzCisgICAgICAgICAgICBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbGxlZEFycmF5UmVwbGFjZW1lbnQgPSBmYWxzZTsKIAotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWRTdHJpbmdSZXBsYWNlbWVudCA9IGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYWxsZWRTdHJpbmdSZXBsYWNlbWVudCA9IGZhbHNlOwogCi0JCXB1YmxpYyBib29sZWFuIGNhbGxlZENsYXNzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FsbGVkQ2xhc3NSZXBsYWNlbWVudCA9IGZhbHNlOwogCi0JCXB1YmxpYyBib29sZWFuIGNhbGxlZE9iamVjdFN0cmVhbUNsYXNzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FsbGVkT2JqZWN0U3RyZWFtQ2xhc3NSZXBsYWNlbWVudCA9IGZhbHNlOwogCi0JCXB1YmxpYyBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0cHV0KQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJCXN1cGVyKG91dHB1dCk7Ci0JCQllbmFibGVSZXBsYWNlT2JqZWN0KHRydWUpOwotCQl9CisgICAgICAgIHB1YmxpYyBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKG91dHB1dCk7CisgICAgICAgICAgICBlbmFibGVSZXBsYWNlT2JqZWN0KHRydWUpOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIE9iamVjdCByZXBsYWNlT2JqZWN0KE9iamVjdCBvYmopIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlDbGFzcyBvYmpDbGFzcyA9IG9iai5nZXRDbGFzcygpOwotCQkJaWYgKG9iakNsYXNzID09IFN0cmluZy5jbGFzcykKLQkJCQljYWxsZWRTdHJpbmdSZXBsYWNlbWVudCA9IHRydWU7CisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVwbGFjZU9iamVjdChPYmplY3Qgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgQ2xhc3Mgb2JqQ2xhc3MgPSBvYmouZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChvYmpDbGFzcyA9PSBTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgY2FsbGVkU3RyaW5nUmVwbGFjZW1lbnQgPSB0cnVlOwogCi0JCQlpZiAob2JqQ2xhc3MgPT0gQ2xhc3MuY2xhc3MpCi0JCQkJY2FsbGVkQ2xhc3NSZXBsYWNlbWVudCA9IHRydWU7CisgICAgICAgICAgICBpZiAob2JqQ2xhc3MgPT0gQ2xhc3MuY2xhc3MpCisgICAgICAgICAgICAgICAgY2FsbGVkQ2xhc3NSZXBsYWNlbWVudCA9IHRydWU7CiAKLQkJCWlmIChvYmpDbGFzcyA9PSBPYmplY3RTdHJlYW1DbGFzcy5jbGFzcykKLQkJCQljYWxsZWRPYmplY3RTdHJlYW1DbGFzc1JlcGxhY2VtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvYmpDbGFzcyA9PSBPYmplY3RTdHJlYW1DbGFzcy5jbGFzcykKKyAgICAgICAgICAgICAgICBjYWxsZWRPYmplY3RTdHJlYW1DbGFzc1JlcGxhY2VtZW50ID0gdHJ1ZTsKIAotCQkJaWYgKG9iakNsYXNzLmlzQXJyYXkoKSkKLQkJCQljYWxsZWRBcnJheVJlcGxhY2VtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvYmpDbGFzcy5pc0FycmF5KCkpCisgICAgICAgICAgICAgICAgY2FsbGVkQXJyYXlSZXBsYWNlbWVudCA9IHRydWU7CiAKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQl9CisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB9CisgICAgfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJyYXlPZlNlcmlhbGl6YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgU2VyaWFsaXphYmxlW10gdGVzdEZpZWxkID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcnJheU9mU2VyaWFsaXphYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemFibGVbXSB0ZXN0RmllbGQgPSBudWxsOwogCi0JCXB1YmxpYyBBcnJheU9mU2VyaWFsaXphYmxlKCkgewotCQkJdGVzdEZpZWxkID0gbmV3IFNlcmlhbGl6YWJsZVsyXTsKLQkJCXRlc3RGaWVsZFswXSA9ICJIaSI7Ci0JCQl0ZXN0RmllbGRbMV0gPSAidGhlcmUhIjsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIEFycmF5T2ZTZXJpYWxpemFibGUoKSB7CisgICAgICAgICAgICB0ZXN0RmllbGQgPSBuZXcgU2VyaWFsaXphYmxlWzJdOworICAgICAgICAgICAgdGVzdEZpZWxkWzBdID0gIkhpIjsKKyAgICAgICAgICAgIHRlc3RGaWVsZFsxXSA9ICJ0aGVyZSEiOworICAgICAgICB9CisgICAgfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NTdWJDbGFzc1Rlc3QwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCVN0cmluZyBzdHJpbmdWYXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NTdWJDbGFzc1Rlc3QwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYXI7CiAKLQkJcHVibGljIENsYXNzU3ViQ2xhc3NUZXN0MChTdHJpbmcgaW5pdCkgewotCQkJc3RyaW5nVmFyID0gaW5pdDsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIENsYXNzU3ViQ2xhc3NUZXN0MChTdHJpbmcgaW5pdCkgeworICAgICAgICAgICAgc3RyaW5nVmFyID0gaW5pdDsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIENsYXNzU3ViQ2xhc3NUZXN0MSBleHRlbmRzIENsYXNzU3ViQ2xhc3NUZXN0MCB7Ci0JCVN0cmluZyBzdWJTdHJpbmdWYXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NTdWJDbGFzc1Rlc3QxIGV4dGVuZHMgQ2xhc3NTdWJDbGFzc1Rlc3QwIHsKKyAgICAgICAgU3RyaW5nIHN1YlN0cmluZ1ZhcjsKIAotCQlwdWJsaWMgQ2xhc3NTdWJDbGFzc1Rlc3QxKFN0cmluZyBzdXBlclN0cmluZywgU3RyaW5nIHN1YlN0cmluZykgewotCQkJc3VwZXIoc3VwZXJTdHJpbmcpOwotCQkJc3ViU3RyaW5nVmFyID0gc3ViU3RyaW5nOwotCQl9CisgICAgICAgIHB1YmxpYyBDbGFzc1N1YkNsYXNzVGVzdDEoU3RyaW5nIHN1cGVyU3RyaW5nLCBTdHJpbmcgc3ViU3RyaW5nKSB7CisgICAgICAgICAgICBzdXBlcihzdXBlclN0cmluZyk7CisgICAgICAgICAgICBzdWJTdHJpbmdWYXIgPSBzdWJTdHJpbmc7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIENsYXNzU3ViQ2xhc3NUZXN0MSkpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENsYXNzU3ViQ2xhc3NUZXN0MSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0JCQlDbGFzc1N1YkNsYXNzVGVzdDEgaW5zdCA9IChDbGFzc1N1YkNsYXNzVGVzdDEpIG9iajsKLQkJCXJldHVybiBpbnN0LnN1YlN0cmluZ1Zhci5lcXVhbHModGhpcy5zdWJTdHJpbmdWYXIpCi0JCQkJCSYmIGluc3Quc3RyaW5nVmFyLmVxdWFscyh0aGlzLnN0cmluZ1Zhcik7Ci0JCX0KLQl9CisgICAgICAgICAgICBDbGFzc1N1YkNsYXNzVGVzdDEgaW5zdCA9IChDbGFzc1N1YkNsYXNzVGVzdDEpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LnN1YlN0cmluZ1Zhci5lcXVhbHModGhpcy5zdWJTdHJpbmdWYXIpCisgICAgICAgICAgICAgICAgICAgICYmIGluc3Quc3RyaW5nVmFyLmVxdWFscyh0aGlzLnN0cmluZ1Zhcik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnN0cnVjdG9yVGVzdEEgewotCQlwdWJsaWMgU3RyaW5nIGluc3RWYXJfY2xhc3NBOworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uc3RydWN0b3JUZXN0QSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgaW5zdFZhcl9jbGFzc0E7CiAKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29uc3RyQSA9ICJJbml0IGluIENvbnN0cnVjdG9yIENsYXNzIEEiOworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb25zdHJBID0gIkluaXQgaW4gQ29uc3RydWN0b3IgQ2xhc3MgQSI7CiAKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29uc3RyQiA9ICJJbml0IGluIENvbnN0cnVjdG9yIENsYXNzIEIiOworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb25zdHJCID0gIkluaXQgaW4gQ29uc3RydWN0b3IgQ2xhc3MgQiI7CiAKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29uc3RyQyA9ICJJbml0IGluIENvbnN0cnVjdG9yIENsYXNzIEMiOworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb25zdHJDID0gIkluaXQgaW4gQ29uc3RydWN0b3IgQ2xhc3MgQyI7CiAKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ2hhbmdlZEMgPSAiQ2hhbmdlZCBiZWZvcmUgU2VyaWFsaXplIC0gQ2xhc3MgQyI7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENoYW5nZWRDID0gIkNoYW5nZWQgYmVmb3JlIFNlcmlhbGl6ZSAtIENsYXNzIEMiOwogCi0JCXB1YmxpYyBDb25zdHJ1Y3RvclRlc3RBKCkgewotCQkJaW5zdFZhcl9jbGFzc0EgPSBDb25zdHJBOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgQ29uc3RydWN0b3JUZXN0QSgpIHsKKyAgICAgICAgICAgIGluc3RWYXJfY2xhc3NBID0gQ29uc3RyQTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnN0cnVjdG9yVGVzdEIgZXh0ZW5kcyBDb25zdHJ1Y3RvclRlc3RBIGltcGxlbWVudHMKLQkJCWphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIFN0cmluZyBpbnN0VmFyX2NsYXNzQjsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25zdHJ1Y3RvclRlc3RCIGV4dGVuZHMgQ29uc3RydWN0b3JUZXN0QSBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgaW5zdFZhcl9jbGFzc0I7CiAKLQkJcHVibGljIENvbnN0cnVjdG9yVGVzdEIoKSB7Ci0JCQlpbnN0VmFyX2NsYXNzQSA9IENvbnN0ckI7Ci0JCQlpbnN0VmFyX2NsYXNzQiA9IENvbnN0ckI7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBDb25zdHJ1Y3RvclRlc3RCKCkgeworICAgICAgICAgICAgaW5zdFZhcl9jbGFzc0EgPSBDb25zdHJCOworICAgICAgICAgICAgaW5zdFZhcl9jbGFzc0IgPSBDb25zdHJCOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uc3RydWN0b3JUZXN0QyBleHRlbmRzIENvbnN0cnVjdG9yVGVzdEIgewotCQlwdWJsaWMgU3RyaW5nIGluc3RWYXJfY2xhc3NDOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnN0cnVjdG9yVGVzdEMgZXh0ZW5kcyBDb25zdHJ1Y3RvclRlc3RCIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBpbnN0VmFyX2NsYXNzQzsKIAotCQlwdWJsaWMgQ29uc3RydWN0b3JUZXN0QygpIHsKLQkJCWluc3RWYXJfY2xhc3NBID0gQ29uc3RyQzsKLQkJCWluc3RWYXJfY2xhc3NCID0gQ29uc3RyQzsKLQkJCWluc3RWYXJfY2xhc3NDID0gQ29uc3RyQzsKLQkJfQorICAgICAgICBwdWJsaWMgQ29uc3RydWN0b3JUZXN0QygpIHsKKyAgICAgICAgICAgIGluc3RWYXJfY2xhc3NBID0gQ29uc3RyQzsKKyAgICAgICAgICAgIGluc3RWYXJfY2xhc3NCID0gQ29uc3RyQzsKKyAgICAgICAgICAgIGluc3RWYXJfY2xhc3NDID0gQ29uc3RyQzsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIHZlcmlmeShPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgQ29uc3RydWN0b3JUZXN0QykpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnN0cnVjdG9yVGVzdEMpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQkJQ29uc3RydWN0b3JUZXN0QyBpbnN0ID0gKENvbnN0cnVjdG9yVGVzdEMpIG9iajsKLQkJCXJldHVybiBpbnN0Lmluc3RWYXJfY2xhc3NDLmVxdWFscyh0aGlzLmluc3RWYXJfY2xhc3NDKQotCQkJCQkmJiBpbnN0Lmluc3RWYXJfY2xhc3NCLmVxdWFscyh0aGlzLmluc3RWYXJfY2xhc3NCKQotCQkJCQkmJiBpbnN0Lmluc3RWYXJfY2xhc3NBLmVxdWFscyhDb25zdHJBKTsKLQkJfQotCX0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yVGVzdEMgaW5zdCA9IChDb25zdHJ1Y3RvclRlc3RDKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gaW5zdC5pbnN0VmFyX2NsYXNzQy5lcXVhbHModGhpcy5pbnN0VmFyX2NsYXNzQykKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5pbnN0VmFyX2NsYXNzQi5lcXVhbHModGhpcy5pbnN0VmFyX2NsYXNzQikKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5pbnN0VmFyX2NsYXNzQS5lcXVhbHMoQ29uc3RyQSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEhhc2hDb2RlVGVzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBib29sZWFuIHNlcmlhbGl6YXRpb25Vc2VzSGFzaENvZGUgPSBmYWxzZTsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhhc2hDb2RlVGVzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNlcmlhbGl6YXRpb25Vc2VzSGFzaENvZGUgPSBmYWxzZTsKIAotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJc2VyaWFsaXphdGlvblVzZXNIYXNoQ29kZSA9IHRydWU7Ci0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6YXRpb25Vc2VzSGFzaENvZGUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEluaXRpYWxpemVyRmllbGRzVGVzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9CZVNlcmlhbGl6ZWQ7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbml0aWFsaXplckZpZWxkc1Rlc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvQmVTZXJpYWxpemVkOwogCi0JCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0JlTm90U2VyaWFsaXplZDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvQmVOb3RTZXJpYWxpemVkOwogCi0JCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0JlTm90U2VyaWFsaXplZDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0JlTm90U2VyaWFsaXplZDI7CiAKLQkJewotCQkJdG9CZVNlcmlhbGl6ZWQgPSAiTm9uU3RhdGljSW5pdGlhbFZhbHVlIjsKLQkJfQorICAgICAgICB7CisgICAgICAgICAgICB0b0JlU2VyaWFsaXplZCA9ICJOb25TdGF0aWNJbml0aWFsVmFsdWUiOworICAgICAgICB9CiAKLQkJc3RhdGljIHsKLQkJCXRvQmVOb3RTZXJpYWxpemVkID0gIlN0YXRpY0luaXRpYWxWYWx1ZSI7Ci0JCQl0b0JlTm90U2VyaWFsaXplZDIgPSBuZXcgU3RyaW5nKHRvQmVOb3RTZXJpYWxpemVkKTsKLQkJfQorICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgdG9CZU5vdFNlcmlhbGl6ZWQgPSAiU3RhdGljSW5pdGlhbFZhbHVlIjsKKyAgICAgICAgICAgIHRvQmVOb3RTZXJpYWxpemVkMiA9IG5ldyBTdHJpbmcodG9CZU5vdFNlcmlhbGl6ZWQpOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCS8qCi0JCQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgYW5zd2VyaW5nIGl0IHRoZSBvYmpzIGlzIGVxdWFsLiBJdCBpcwotCQkJICogYW5zd2VyaW5nIGlmIHRoZSB2YXJzIGhhdmUgdGhlIHZhbHVlIHRoYXQgaXQgaGF2ZSB0byBoYXZlIGFmdGVyCi0JCQkgKiBkdW1waW5nIGFuZCBsb2FkaW5nCi0JCQkgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgYW5zd2VyaW5nIGl0IHRoZSBvYmpzIGlzIGVxdWFsLiBJdCBpcworICAgICAgICAgICAgICogYW5zd2VyaW5nIGlmIHRoZSB2YXJzIGhhdmUgdGhlIHZhbHVlIHRoYXQgaXQgaGF2ZSB0byBoYXZlIGFmdGVyCisgICAgICAgICAgICAgKiBkdW1waW5nIGFuZCBsb2FkaW5nCisgICAgICAgICAgICAgKi8KIAotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIEluaXRpYWxpemVyRmllbGRzVGVzdCkpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEluaXRpYWxpemVyRmllbGRzVGVzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0JCQlJbml0aWFsaXplckZpZWxkc1Rlc3QgaW5zdCA9IChJbml0aWFsaXplckZpZWxkc1Rlc3QpIG9iajsKLQkJCXJldHVybiBpbnN0LnRvQmVTZXJpYWxpemVkLmVxdWFscyh0aGlzLnRvQmVTZXJpYWxpemVkKQotCQkJCQkmJiBpbnN0LnRvQmVOb3RTZXJpYWxpemVkLmVxdWFscyh0aGlzLnRvQmVOb3RTZXJpYWxpemVkMik7Ci0JCX0KLQl9CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QgaW5zdCA9IChJbml0aWFsaXplckZpZWxkc1Rlc3QpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LnRvQmVTZXJpYWxpemVkLmVxdWFscyh0aGlzLnRvQmVTZXJpYWxpemVkKQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LnRvQmVOb3RTZXJpYWxpemVkLmVxdWFscyh0aGlzLnRvQmVOb3RTZXJpYWxpemVkMik7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbml0aWFsaXplckZpZWxkc1Rlc3QyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0JlU2VyaWFsaXplZDsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbml0aWFsaXplckZpZWxkc1Rlc3QyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0JlU2VyaWFsaXplZDsKIAotCQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9CZU5vdFNlcmlhbGl6ZWQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0JlTm90U2VyaWFsaXplZDsKIAotCQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9CZU5vdFNlcmlhbGl6ZWQyOworICAgICAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9CZU5vdFNlcmlhbGl6ZWQyOwogCi0JCXsKLQkJCXRvQmVTZXJpYWxpemVkID0gIk5vblN0YXRpY0luaXRpYWxWYWx1ZSI7Ci0JCX0KKyAgICAgICAgeworICAgICAgICAgICAgdG9CZVNlcmlhbGl6ZWQgPSAiTm9uU3RhdGljSW5pdGlhbFZhbHVlIjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvQmVTZXJpYWxpemVkMzsKKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9CZVNlcmlhbGl6ZWQzOwogCi0JCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvQmVTZXJpYWxpemVkNDsKLQkJc3RhdGljIHsKLQkJCXRvQmVOb3RTZXJpYWxpemVkID0gIlN0YXRpY0luaXRpYWxWYWx1ZSI7Ci0JCQl0b0JlTm90U2VyaWFsaXplZDIgPSBuZXcgU3RyaW5nKHRvQmVOb3RTZXJpYWxpemVkKTsKLQkJfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0JlU2VyaWFsaXplZDQ7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICB0b0JlTm90U2VyaWFsaXplZCA9ICJTdGF0aWNJbml0aWFsVmFsdWUiOworICAgICAgICAgICAgdG9CZU5vdFNlcmlhbGl6ZWQyID0gbmV3IFN0cmluZyh0b0JlTm90U2VyaWFsaXplZCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0JlU2VyaWFsaXplZDU7CisgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvQmVTZXJpYWxpemVkNTsKIAotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJLyoKLQkJCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhbnN3ZXJpbmcgaXQgdGhlIG9ianMgaXMgZXF1YWwuIEl0IGlzCi0JCQkgKiBhbnN3ZXJpbmcgaWYgdGhlIHZhcnMgaGF2ZSB0aGUgdmFsdWUgdGhhdCBpdCBoYXZlIHRvIGhhdmUgYWZ0ZXIKLQkJCSAqIGR1bXBpbmcgYW5kIGxvYWRpbmcKLQkJCSAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhbnN3ZXJpbmcgaXQgdGhlIG9ianMgaXMgZXF1YWwuIEl0IGlzCisgICAgICAgICAgICAgKiBhbnN3ZXJpbmcgaWYgdGhlIHZhcnMgaGF2ZSB0aGUgdmFsdWUgdGhhdCBpdCBoYXZlIHRvIGhhdmUgYWZ0ZXIKKyAgICAgICAgICAgICAqIGR1bXBpbmcgYW5kIGxvYWRpbmcKKyAgICAgICAgICAgICAqLwogCi0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0MikpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEluaXRpYWxpemVyRmllbGRzVGVzdDIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQkJSW5pdGlhbGl6ZXJGaWVsZHNUZXN0MiBpbnN0ID0gKEluaXRpYWxpemVyRmllbGRzVGVzdDIpIG9iajsKLQkJCXJldHVybiBpbnN0LnRvQmVTZXJpYWxpemVkLmVxdWFscyh0aGlzLnRvQmVTZXJpYWxpemVkKQotCQkJCQkmJiBpbnN0LnRvQmVTZXJpYWxpemVkMy5lcXVhbHModGhpcy50b0JlU2VyaWFsaXplZDMpCi0JCQkJCSYmIGluc3QudG9CZVNlcmlhbGl6ZWQ0LmVxdWFscyh0aGlzLnRvQmVTZXJpYWxpemVkNCkKLQkJCQkJJiYgaW5zdC50b0JlU2VyaWFsaXplZDUuZXF1YWxzKHRoaXMudG9CZVNlcmlhbGl6ZWQ1KQotCQkJCQkmJiBpbnN0LnRvQmVOb3RTZXJpYWxpemVkLmVxdWFscyh0aGlzLnRvQmVOb3RTZXJpYWxpemVkMik7Ci0JCX0KLQl9CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QyIGluc3QgPSAoSW5pdGlhbGl6ZXJGaWVsZHNUZXN0Mikgb2JqOworICAgICAgICAgICAgcmV0dXJuIGluc3QudG9CZVNlcmlhbGl6ZWQuZXF1YWxzKHRoaXMudG9CZVNlcmlhbGl6ZWQpCisgICAgICAgICAgICAgICAgICAgICYmIGluc3QudG9CZVNlcmlhbGl6ZWQzLmVxdWFscyh0aGlzLnRvQmVTZXJpYWxpemVkMykKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC50b0JlU2VyaWFsaXplZDQuZXF1YWxzKHRoaXMudG9CZVNlcmlhbGl6ZWQ0KQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LnRvQmVTZXJpYWxpemVkNS5lcXVhbHModGhpcy50b0JlU2VyaWFsaXplZDUpCisgICAgICAgICAgICAgICAgICAgICYmIGluc3QudG9CZU5vdFNlcmlhbGl6ZWQuZXF1YWxzKHRoaXMudG9CZU5vdFNlcmlhbGl6ZWQyKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGNsYXNzIEluaXRpYWxpemVyRmllbGRzVGVzdDMgZXh0ZW5kcyBJbml0aWFsaXplckZpZWxkc1Rlc3QyCi0JCQlpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIGphdmEubGFuZy5TdHJpbmcgc3ViX3RvQmVTZXJpYWxpemVkOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluaXRpYWxpemVyRmllbGRzVGVzdDMgZXh0ZW5kcyBJbml0aWFsaXplckZpZWxkc1Rlc3QyCisgICAgICAgICAgICBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgc3ViX3RvQmVTZXJpYWxpemVkOwogCi0JCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdWJfdG9CZU5vdFNlcmlhbGl6ZWQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdWJfdG9CZU5vdFNlcmlhbGl6ZWQ7CiAKLQkJcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHN1Yl90b0JlTm90U2VyaWFsaXplZDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdWJfdG9CZU5vdFNlcmlhbGl6ZWQyOwogCi0JCXsKLQkJCXN1Yl90b0JlU2VyaWFsaXplZCA9ICJOb25TdGF0aWNJbml0aWFsVmFsdWUiOwotCQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl90b0JlU2VyaWFsaXplZCA9ICJOb25TdGF0aWNJbml0aWFsVmFsdWUiOworICAgICAgICB9CiAKLQkJcHVibGljIGphdmEubGFuZy5TdHJpbmcgc3ViX3RvQmVTZXJpYWxpemVkMzsKKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgc3ViX3RvQmVTZXJpYWxpemVkMzsKIAotCQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzdWJfdG9CZVNlcmlhbGl6ZWQ0OwotCQlzdGF0aWMgewotCQkJc3ViX3RvQmVOb3RTZXJpYWxpemVkID0gIlN0YXRpY0luaXRpYWxWYWx1ZSI7Ci0JCQlzdWJfdG9CZU5vdFNlcmlhbGl6ZWQyID0gbmV3IFN0cmluZyhzdWJfdG9CZU5vdFNlcmlhbGl6ZWQpOwotCQl9CisgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHN1Yl90b0JlU2VyaWFsaXplZDQ7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBzdWJfdG9CZU5vdFNlcmlhbGl6ZWQgPSAiU3RhdGljSW5pdGlhbFZhbHVlIjsKKyAgICAgICAgICAgIHN1Yl90b0JlTm90U2VyaWFsaXplZDIgPSBuZXcgU3RyaW5nKHN1Yl90b0JlTm90U2VyaWFsaXplZCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzdWJfdG9CZVNlcmlhbGl6ZWQ1OworICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzdWJfdG9CZVNlcmlhbGl6ZWQ1OwogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkvKgotCQkJICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXQgaXMKLQkJCSAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgotCQkJICogZHVtcGluZyBhbmQgbG9hZGluZwotCQkJICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXQgaXMKKyAgICAgICAgICAgICAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgorICAgICAgICAgICAgICogZHVtcGluZyBhbmQgbG9hZGluZworICAgICAgICAgICAgICovCiAKLQkJCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0MykpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCFzdXBlci5lcXVhbHMob2JqKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbml0aWFsaXplckZpZWxkc1Rlc3QzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDMgaW5zdCA9IChJbml0aWFsaXplckZpZWxkc1Rlc3QzKSBvYmo7Ci0JCQlyZXR1cm4gaW5zdC5zdWJfdG9CZVNlcmlhbGl6ZWQuZXF1YWxzKHRoaXMuc3ViX3RvQmVTZXJpYWxpemVkKQotCQkJCQkmJiBpbnN0LnN1Yl90b0JlU2VyaWFsaXplZDMKLQkJCQkJCQkuZXF1YWxzKHRoaXMuc3ViX3RvQmVTZXJpYWxpemVkMykKLQkJCQkJJiYgaW5zdC5zdWJfdG9CZVNlcmlhbGl6ZWQ0Ci0JCQkJCQkJLmVxdWFscyh0aGlzLnN1Yl90b0JlU2VyaWFsaXplZDQpCi0JCQkJCSYmIGluc3Quc3ViX3RvQmVTZXJpYWxpemVkNQotCQkJCQkJCS5lcXVhbHModGhpcy5zdWJfdG9CZVNlcmlhbGl6ZWQ1KQotCQkJCQkmJiBpbnN0LnN1Yl90b0JlTm90U2VyaWFsaXplZAotCQkJCQkJCS5lcXVhbHModGhpcy5zdWJfdG9CZU5vdFNlcmlhbGl6ZWQyKTsKLQkJfQotCX0KKyAgICAgICAgICAgIEluaXRpYWxpemVyRmllbGRzVGVzdDMgaW5zdCA9IChJbml0aWFsaXplckZpZWxkc1Rlc3QzKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gaW5zdC5zdWJfdG9CZVNlcmlhbGl6ZWQuZXF1YWxzKHRoaXMuc3ViX3RvQmVTZXJpYWxpemVkKQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LnN1Yl90b0JlU2VyaWFsaXplZDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRoaXMuc3ViX3RvQmVTZXJpYWxpemVkMykKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5zdWJfdG9CZVNlcmlhbGl6ZWQ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyh0aGlzLnN1Yl90b0JlU2VyaWFsaXplZDQpCisgICAgICAgICAgICAgICAgICAgICYmIGluc3Quc3ViX3RvQmVTZXJpYWxpemVkNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModGhpcy5zdWJfdG9CZVNlcmlhbGl6ZWQ1KQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LnN1Yl90b0JlTm90U2VyaWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModGhpcy5zdWJfdG9CZU5vdFNlcmlhbGl6ZWQyKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVlcE5lc3RpbmcgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBmbG9hdCBpZDsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlZXBOZXN0aW5nIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgZmxvYXQgaWQ7CiAKLQkJcHVibGljIERlZXBOZXN0aW5nIG5leHQ7CisgICAgICAgIHB1YmxpYyBEZWVwTmVzdGluZyBuZXh0OwogCi0JCXB1YmxpYyBib29sZWFuIGR1bXA7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGR1bXA7CiAKLQkJcHVibGljIGJvb2xlYW4gbG9hZDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbG9hZDsKIAotCQlwdWJsaWMgRGVlcE5lc3RpbmcoZmxvYXQgaWQpIHsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCW5leHQgPSBudWxsOwotCQkJZHVtcCA9IGZhbHNlOwotCQkJbG9hZCA9IGZhbHNlOwotCQl9CisgICAgICAgIHB1YmxpYyBEZWVwTmVzdGluZyhmbG9hdCBpZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICBkdW1wID0gZmFsc2U7CisgICAgICAgICAgICBsb2FkID0gZmFsc2U7CisgICAgICAgIH0KIAotCQlwdWJsaWMgRGVlcE5lc3RpbmcoaW50IGhvd01hbnkpIHsKLQkJCURlZXBOZXN0aW5nIHByZXYgPSBuZXcgRGVlcE5lc3RpbmcoMC4wRik7Ci0JCQluZXh0KHByZXYpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBob3dNYW55OyBpKyspIHsKLQkJCQlwcmV2ID0gcHJldi5uZXh0KG5ldyBEZWVwTmVzdGluZyhpICogMS4wRikpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBEZWVwTmVzdGluZyhpbnQgaG93TWFueSkgeworICAgICAgICAgICAgRGVlcE5lc3RpbmcgcHJldiA9IG5ldyBEZWVwTmVzdGluZygwLjBGKTsKKyAgICAgICAgICAgIG5leHQocHJldik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGhvd01hbnk7IGkrKykgeworICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2Lm5leHQobmV3IERlZXBOZXN0aW5nKGkgKiAxLjBGKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIERlZXBOZXN0aW5nKSkKLQkJCQlyZXR1cm4gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGVlcE5lc3RpbmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQkJRGVlcE5lc3RpbmcgaW5zdCA9IChEZWVwTmVzdGluZykgb2JqOwotCQkJaWYgKGluc3QuZHVtcCAhPSB0aGlzLmR1bXAgfHwgaW5zdC5sb2FkICE9IHRoaXMubG9hZCkKLQkJCQlyZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBEZWVwTmVzdGluZyBpbnN0ID0gKERlZXBOZXN0aW5nKSBvYmo7CisgICAgICAgICAgICBpZiAoaW5zdC5kdW1wICE9IHRoaXMuZHVtcCB8fCBpbnN0LmxvYWQgIT0gdGhpcy5sb2FkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQkJaWYgKGluc3QubmV4dCA9PSBudWxsIHx8IHRoaXMubmV4dCA9PSBudWxsKQotCQkJCXJldHVybiBpbnN0Lm5leHQgPT0gdGhpcy5uZXh0OyAvLyBib3RoIG51bGwKLQkJCXJldHVybiB0aGlzLm5leHQuZXF1YWxzKGluc3QubmV4dCk7Ci0JCX0KKyAgICAgICAgICAgIGlmIChpbnN0Lm5leHQgPT0gbnVsbCB8fCB0aGlzLm5leHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdC5uZXh0ID09IHRoaXMubmV4dDsgLy8gYm90aCBudWxsCisgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0LmVxdWFscyhpbnN0Lm5leHQpOworICAgICAgICB9CiAKLQkJcHVibGljIERlZXBOZXN0aW5nIG5leHQoRGVlcE5lc3RpbmcgaXZ0KSB7Ci0JCQluZXh0ID0gaXZ0OwotCQkJcmV0dXJuIGl2dDsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIERlZXBOZXN0aW5nIG5leHQoRGVlcE5lc3RpbmcgaXZ0KSB7CisgICAgICAgICAgICBuZXh0ID0gaXZ0OworICAgICAgICAgICAgcmV0dXJuIGl2dDsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgaW1wbGVtZW50cwotCQkJamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgZmxvYXQgaWQ7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBmbG9hdCBpZDsKIAotCQlwdWJsaWMgRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgbmV4dDsKKyAgICAgICAgcHVibGljIERlZXBOZXN0aW5nV2l0aFdyaXRlT2JqZWN0IG5leHQ7CiAKLQkJcHVibGljIGJvb2xlYW4gZHVtcDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZHVtcDsKIAotCQlwdWJsaWMgYm9vbGVhbiBsb2FkOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2FkOwogCi0JCXB1YmxpYyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdChmbG9hdCBpZCkgewotCQkJdGhpcy5pZCA9IGlkOwotCQkJbmV4dCA9IG51bGw7Ci0JCQlkdW1wID0gZmFsc2U7Ci0JCQlsb2FkID0gZmFsc2U7Ci0JCX0KKyAgICAgICAgcHVibGljIERlZXBOZXN0aW5nV2l0aFdyaXRlT2JqZWN0KGZsb2F0IGlkKSB7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIGR1bXAgPSBmYWxzZTsKKyAgICAgICAgICAgIGxvYWQgPSBmYWxzZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdChpbnQgaG93TWFueSkgewotCQkJRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgcHJldiA9IG5ldyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCgKLQkJCQkJMC4wRik7Ci0JCQluZXh0KHByZXYpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBob3dNYW55OyBpKyspIHsKLQkJCQlwcmV2ID0gcHJldi5uZXh0KG5ldyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdChpICogMS4wRikpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdChpbnQgaG93TWFueSkgeworICAgICAgICAgICAgRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgcHJldiA9IG5ldyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgMC4wRik7CisgICAgICAgICAgICBuZXh0KHByZXYpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBob3dNYW55OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcmV2ID0gcHJldi5uZXh0KG5ldyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdChpICogMS4wRikpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERlZXBOZXN0aW5nV2l0aFdyaXRlT2JqZWN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJCURlZXBOZXN0aW5nV2l0aFdyaXRlT2JqZWN0IGluc3QgPSAoRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QpIG9iajsKLQkJCWlmIChpbnN0LmR1bXAgIT0gdGhpcy5kdW1wIHx8IGluc3QubG9hZCAhPSB0aGlzLmxvYWQpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgaW5zdCA9IChEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCkgb2JqOworICAgICAgICAgICAgaWYgKGluc3QuZHVtcCAhPSB0aGlzLmR1bXAgfHwgaW5zdC5sb2FkICE9IHRoaXMubG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJCWlmIChpbnN0Lm5leHQgPT0gbnVsbCB8fCB0aGlzLm5leHQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gaW5zdC5uZXh0ID09IHRoaXMubmV4dDsgLy8gYm90aCBudWxsOwotCQkJcmV0dXJuIHRoaXMubmV4dC5lcXVhbHMoaW5zdC5uZXh0KTsKLQkJfQorICAgICAgICAgICAgaWYgKGluc3QubmV4dCA9PSBudWxsIHx8IHRoaXMubmV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBpbnN0Lm5leHQgPT0gdGhpcy5uZXh0OyAvLyBib3RoIG51bGw7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0LmVxdWFscyhpbnN0Lm5leHQpOworICAgICAgICB9CiAKLQkJcHVibGljIERlZXBOZXN0aW5nV2l0aFdyaXRlT2JqZWN0IG5leHQoRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgaXZ0KSB7Ci0JCQluZXh0ID0gaXZ0OwotCQkJcmV0dXJuIGl2dDsKLQkJfQorICAgICAgICBwdWJsaWMgRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgbmV4dChEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCBpdnQpIHsKKyAgICAgICAgICAgIG5leHQgPSBpdnQ7CisgICAgICAgICAgICByZXR1cm4gaXZ0OworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXN0YXRpYyBjbGFzcyBOb25QdWJsaWNDbGFzc1Rlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMKLQkJCWphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJaW50IGZpZWxkID0gMTsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNDbGFzc1Rlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgaW50IGZpZWxkID0gMTsKIAotCQlwdWJsaWMgTm9uUHVibGljQ2xhc3NUZXN0KCkgewotCQkJZmllbGQgPSAxMDsKLQkJfQorICAgICAgICBwdWJsaWMgTm9uUHVibGljQ2xhc3NUZXN0KCkgeworICAgICAgICAgICAgZmllbGQgPSAxMDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBOb25QdWJsaWNDbGFzc1Rlc3QpCi0JCQkJcmV0dXJuIGZpZWxkID09ICgoTm9uUHVibGljQ2xhc3NUZXN0KSBvKS5maWVsZDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTm9uUHVibGljQ2xhc3NUZXN0KQorICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZCA9PSAoKE5vblB1YmxpY0NsYXNzVGVzdCkgbykuZmllbGQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCB4MTAoKSB7Ci0JCQlmaWVsZCAqPSAxMDsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIHZvaWQgeDEwKCkgeworICAgICAgICAgICAgZmllbGQgKj0gMTA7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNhbWVJbnN0VmFyTmFtZVN1cGVyQ2xhc3MgewotCQlwcml2YXRlIGludCBmb287CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYW1lSW5zdFZhck5hbWVTdXBlckNsYXNzIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZm9vOwogCi0JCXB1YmxpYyBTYW1lSW5zdFZhck5hbWVTdXBlckNsYXNzKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgU2FtZUluc3RWYXJOYW1lU3VwZXJDbGFzcygpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgU2FtZUluc3RWYXJOYW1lU3VwZXJDbGFzcyhpbnQgZm9vVmFsdWUpIHsKLQkJCWZvbyA9IGZvb1ZhbHVlOwotCQl9CisgICAgICAgIHB1YmxpYyBTYW1lSW5zdFZhck5hbWVTdXBlckNsYXNzKGludCBmb29WYWx1ZSkgeworICAgICAgICAgICAgZm9vID0gZm9vVmFsdWU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJmb28gPSAiICsgZm9vOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJmb28gPSAiICsgZm9vOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2FtZUluc3RWYXJOYW1lU3ViQ2xhc3MgZXh0ZW5kcwotCQkJU2FtZUluc3RWYXJOYW1lU3VwZXJDbGFzcyBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHJvdGVjdGVkIGludCBmb287CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2FtZUluc3RWYXJOYW1lU3ViQ2xhc3MgZXh0ZW5kcworICAgICAgICAgICAgU2FtZUluc3RWYXJOYW1lU3VwZXJDbGFzcyBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJvdGVjdGVkIGludCBmb287CiAKLQkJcHVibGljIFNhbWVJbnN0VmFyTmFtZVN1YkNsYXNzKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgU2FtZUluc3RWYXJOYW1lU3ViQ2xhc3MoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJcHVibGljIFNhbWVJbnN0VmFyTmFtZVN1YkNsYXNzKGludCBmb29WYWx1ZSkgewotCQkJc3VwZXIoLWZvb1ZhbHVlKTsKLQkJCWZvbyA9IGZvb1ZhbHVlOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgU2FtZUluc3RWYXJOYW1lU3ViQ2xhc3MoaW50IGZvb1ZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcigtZm9vVmFsdWUpOworICAgICAgICAgICAgZm9vID0gZm9vVmFsdWU7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNJbnRlcmZhY2VUZXN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGludCBzdGF0aWNWYXIgPSA1OworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU0ludGVyZmFjZVRlc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHN0YXRpY1ZhciA9IDU7CiAKLQkJcHVibGljIHRyYW5zaWVudCBpbnRbXSB0cmFuc1ZhciA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCB9OworICAgICAgICBwdWJsaWMgdHJhbnNpZW50IGludFtdIHRyYW5zVmFyID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwIH07CiAKLQkJcHVibGljIGludCBpbnN0YW5jZVZhciA9IDc7CisgICAgICAgIHB1YmxpYyBpbnQgaW5zdGFuY2VWYXIgPSA3OwogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgU0ludGVyZmFjZVRlc3QpKQotCQkJCXJldHVybiBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBTSW50ZXJmYWNlVGVzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0JCQlTSW50ZXJmYWNlVGVzdCBpbnN0ID0gKFNJbnRlcmZhY2VUZXN0KSBvYmo7Ci0JCQlpZiAodGhpcy5pbnN0YW5jZVZhciAhPSBpbnN0Lmluc3RhbmNlVmFyKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChpbnN0LnRyYW5zVmFyID09IG51bGwgfHwgdGhpcy50cmFuc1ZhciA9PSBudWxsKQotCQkJCXJldHVybiBpbnN0LnRyYW5zVmFyID09IHRoaXMudHJhbnNWYXI7IC8vIGJvdGggbnVsbAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc1Zhci5sZW5ndGg7IGkrKykKLQkJCQlpZiAoaW5zdC50cmFuc1ZhcltpXSAhPSB0aGlzLnRyYW5zVmFyW2ldKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQorICAgICAgICAgICAgU0ludGVyZmFjZVRlc3QgaW5zdCA9IChTSW50ZXJmYWNlVGVzdCkgb2JqOworICAgICAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VWYXIgIT0gaW5zdC5pbnN0YW5jZVZhcikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoaW5zdC50cmFuc1ZhciA9PSBudWxsIHx8IHRoaXMudHJhbnNWYXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdC50cmFuc1ZhciA9PSB0aGlzLnRyYW5zVmFyOyAvLyBib3RoIG51bGwKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNWYXIubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGluc3QudHJhbnNWYXJbaV0gIT0gdGhpcy50cmFuc1ZhcltpXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCU9iamVjdCBhcnI7Ci0JCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQlhcnIgPSBzLnJlYWRPYmplY3QoKTsKLQkJCXRyYW5zVmFyID0gKGludFtdKSBhcnI7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3QgYXJyOworICAgICAgICAgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOworICAgICAgICAgICAgYXJyID0gcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICB0cmFuc1ZhciA9IChpbnRbXSkgYXJyOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCQlzLndyaXRlT2JqZWN0KHRyYW5zVmFyKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKyAgICAgICAgICAgIHMud3JpdGVPYmplY3QodHJhbnNWYXIpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgeDEwKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc1Zhci5sZW5ndGg7IGkrKykKLQkJCQl0cmFuc1ZhcltpXSA9IHRyYW5zVmFyW2ldICogMTA7Ci0JCQlpbnN0YW5jZVZhciA9IGluc3RhbmNlVmFyICogMTA7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHgxMCgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNWYXIubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgdHJhbnNWYXJbaV0gPSB0cmFuc1ZhcltpXSAqIDEwOworICAgICAgICAgICAgaW5zdGFuY2VWYXIgPSBpbnN0YW5jZVZhciAqIDEwOworICAgICAgICB9CisgICAgfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTSW50ZXJmYWNlVGVzdDIgZXh0ZW5kcyBTSW50ZXJmYWNlVGVzdCB7Ci0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJT2JqZWN0IGFycjsKLQkJCWluc3RhbmNlVmFyID0gcy5yZWFkSW50KCk7Ci0JCQlhcnIgPSBzLnJlYWRPYmplY3QoKTsKLQkJCXRyYW5zVmFyID0gKGludFtdKSBhcnI7Ci0JCX0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNJbnRlcmZhY2VUZXN0MiBleHRlbmRzIFNJbnRlcmZhY2VUZXN0IHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3QgYXJyOworICAgICAgICAgICAgaW5zdGFuY2VWYXIgPSBzLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGFyciA9IHMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgdHJhbnNWYXIgPSAoaW50W10pIGFycjsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzLndyaXRlSW50KGluc3RhbmNlVmFyKTsKLQkJCXMud3JpdGVPYmplY3QodHJhbnNWYXIpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcy53cml0ZUludChpbnN0YW5jZVZhcik7CisgICAgICAgICAgICBzLndyaXRlT2JqZWN0KHRyYW5zVmFyKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3VwZXJjbGFzc1Rlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMKLQkJCWphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJaW50IHN1cGVyZmllbGQgPSAxOworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3VwZXJjbGFzc1Rlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgaW50IHN1cGVyZmllbGQgPSAxOwogCi0JCXB1YmxpYyBTdXBlcmNsYXNzVGVzdCgpIHsKLQkJCXN1cGVyZmllbGQgPSAxMDsKLQkJfQorICAgICAgICBwdWJsaWMgU3VwZXJjbGFzc1Rlc3QoKSB7CisgICAgICAgICAgICBzdXBlcmZpZWxkID0gMTA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvLmdldENsYXNzKCkgPT0gdGhpcy5nZXRDbGFzcygpKQotCQkJCXJldHVybiBzdXBlcmZpZWxkID09ICgoU3VwZXJjbGFzc1Rlc3QpIG8pLnN1cGVyZmllbGQ7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoby5nZXRDbGFzcygpID09IHRoaXMuZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXJmaWVsZCA9PSAoKFN1cGVyY2xhc3NUZXN0KSBvKS5zdXBlcmZpZWxkOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlzdXBlcmZpZWxkID0gcy5yZWFkSW50KCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcmZpZWxkID0gcy5yZWFkSW50KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJcy53cml0ZUludChzdXBlcmZpZWxkKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcy53cml0ZUludChzdXBlcmZpZWxkKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHgxMCgpIHsKLQkJCXN1cGVyZmllbGQgKj0gMTA7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHgxMCgpIHsKKyAgICAgICAgICAgIHN1cGVyZmllbGQgKj0gMTA7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1cGVyY2xhc3NUZXN0MiBleHRlbmRzIFN1cGVyY2xhc3NUZXN0IHsKLQkJaW50IHN1YmZpZWxkID0gNTsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1cGVyY2xhc3NUZXN0MiBleHRlbmRzIFN1cGVyY2xhc3NUZXN0IHsKKyAgICAgICAgaW50IHN1YmZpZWxkID0gNTsKIAotCQlwdWJsaWMgU3VwZXJjbGFzc1Rlc3QyKCkgewotCQkJc3ViZmllbGQgPSA1MDsKLQkJfQorICAgICAgICBwdWJsaWMgU3VwZXJjbGFzc1Rlc3QyKCkgeworICAgICAgICAgICAgc3ViZmllbGQgPSA1MDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBTdXBlcmNsYXNzVGVzdDIpCi0JCQkJaWYgKHN1YmZpZWxkID09ICgoU3VwZXJjbGFzc1Rlc3QyKSBvKS5zdWJmaWVsZCkKLQkJCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3VwZXJjbGFzc1Rlc3QyKQorICAgICAgICAgICAgICAgIGlmIChzdWJmaWVsZCA9PSAoKFN1cGVyY2xhc3NUZXN0Mikgbykuc3ViZmllbGQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXN1YmZpZWxkID0gcy5yZWFkSW50KCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdWJmaWVsZCA9IHMucmVhZEludCgpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXMud3JpdGVJbnQoc3ViZmllbGQpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzLndyaXRlSW50KHN1YmZpZWxkKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHgxMCgpIHsKLQkJCXN1YmZpZWxkICo9IDEwOwotCQkJc3VwZXIueDEwKCk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHgxMCgpIHsKKyAgICAgICAgICAgIHN1YmZpZWxkICo9IDEwOworICAgICAgICAgICAgc3VwZXIueDEwKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN5bnRoZXRpY0ZpZWxkVGVzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCS8qCi0JCQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgYW5zd2VyaW5nIGl0IHRoZSBvYmpzIGlzIGVxdWFsLiBJdCBpcwotCQkJICogYW5zd2VyaW5nIGlmIHRoZSB2YXJzIGhhdmUgdGhlIHZhbHVlIHRoYXQgaXQgaGF2ZSB0byBoYXZlIGFmdGVyCi0JCQkgKiBkdW1waW5nIGFuZCBsb2FkaW5nCi0JCQkgKi8KLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgU3ludGhldGljRmllbGRUZXN0OwotCQl9CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTeW50aGV0aWNGaWVsZFRlc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXQgaXMKKyAgICAgICAgICAgICAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgorICAgICAgICAgICAgICogZHVtcGluZyBhbmQgbG9hZGluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFN5bnRoZXRpY0ZpZWxkVGVzdDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQkvLyBJbnNlcnQgY29kZSB0byBnZW5lcmF0ZSBhIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyIGhlcmUuCi0JCQkvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvcndhcmRzIHRoZSBtZXNzYWdlIHRvIHN1cGVyLiBZb3UgbWF5Ci0JCQkvLyByZXBsYWNlIG9yIHN1cHBsZW1lbnQgdGhpcy4KLQkJCS8vIE5PVEU6IGlmIHR3byBvYmplY3RzIGFyZSBlcXVhbCAoZXF1YWxzIE9iamVjdCkgcmV0dXJucyB0cnVlKSB0aGV5Ci0JCQkvLyBtdXN0IGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlCi0JCQlDbGFzc1tdIGMgPSB7IFN0cmluZy5jbGFzcyB9OyAvLyAqKiogc3ludGhldGljIGZpZWxkCi0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIC8vIEluc2VydCBjb2RlIHRvIGdlbmVyYXRlIGEgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIgaGVyZS4KKyAgICAgICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gZm9yd2FyZHMgdGhlIG1lc3NhZ2UgdG8gc3VwZXIuIFlvdSBtYXkKKyAgICAgICAgICAgIC8vIHJlcGxhY2Ugb3Igc3VwcGxlbWVudCB0aGlzLgorICAgICAgICAgICAgLy8gTk9URTogaWYgdHdvIG9iamVjdHMgYXJlIGVxdWFsIChlcXVhbHMgT2JqZWN0KSByZXR1cm5zIHRydWUpIHRoZXkKKyAgICAgICAgICAgIC8vIG11c3QgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUKKyAgICAgICAgICAgIENsYXNzW10gYyA9IHsgU3RyaW5nLmNsYXNzIH07IC8vICoqKiBzeW50aGV0aWMgZmllbGQKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0MihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CisgICAgcHVibGljIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0MihTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzQxX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF80MV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCWphdmEuaW8uSU9FeGNlcHRpb24gZXggPSBuZXcgamF2YS5pby5Xcml0ZUFib3J0ZWRFeGNlcHRpb24oRk9PLAotCQkJCQludWxsKTsKLQkJCW9ialRvU2F2ZSA9IGV4OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gYmUgYWJsZSB0byBzYXZlL2xvYWQgYW4gZXhjZXB0aW9uCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLmlvLklPRXhjZXB0aW9uIGV4ID0gbmV3IGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uKEZPTywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBleDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF80Ml93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNDJfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlXaXRoVW5tYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMgc3BmID0gbmV3IFdpdGhVbm1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcygpOwotCQkJb2JqVG9TYXZlID0gc3BmOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlib29sZWFuIGNhdXNlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQl9IGNhdGNoIChJbnZhbGlkQ2xhc3NFeGNlcHRpb24gY2UpIHsKLQkJCQljYXVzZWRFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgic2VyaWFsUGVyc2lzdGVudEZpZWxkcyBkbyBub3QgbWF0Y2ggcmVhbCBmaWVsZHMiLAotCQkJCQljYXVzZWRFeGNlcHRpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgV2l0aFVubWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzIHNwZiA9IG5ldyBXaXRoVW5tYXRjaGluZ1NlcmlhbFBlcnNpc3RlbnRGaWVsZHMoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHNwZjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgYm9vbGVhbiBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZENsYXNzRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICAgICAgY2F1c2VkRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoInNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgZG8gbm90IG1hdGNoIHJlYWwgZmllbGRzIiwKKyAgICAgICAgICAgICAgICAgICAgY2F1c2VkRXhjZXB0aW9uKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNDNfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzQzX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJV2l0aE1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcyBzcGYgPSBuZXcgV2l0aE1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcygpOwotCQkJc3BmLmFuSW5zdGFuY2VWYXIgPSBGT087Ci0JCQlvYmpUb1NhdmUgPSBzcGY7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJzZXJpYWxQZXJzaXN0ZW50RmllbGRzIGRvIG5vdCB3b3JrIHByb3Blcmx5IGluIHRoaXMgaW1wbGVtZW50YXRpb24iLAotCQkJCQlGT08KLQkJCQkJCQkuZXF1YWxzKCgoV2l0aE1hdGNoaW5nU2VyaWFsUGVyc2lzdGVudEZpZWxkcykgb2JqTG9hZGVkKS5hbkluc3RhbmNlVmFyKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBXaXRoTWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzIHNwZiA9IG5ldyBXaXRoTWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzKCk7CisgICAgICAgICAgICBzcGYuYW5JbnN0YW5jZVZhciA9IEZPTzsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHNwZjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgInNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgZG8gbm90IHdvcmsgcHJvcGVybHkgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIEZPTworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoKChXaXRoTWF0Y2hpbmdTZXJpYWxQZXJzaXN0ZW50RmllbGRzKSBvYmpMb2FkZWQpLmFuSW5zdGFuY2VWYXIpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNDRfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzQ0X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJU2VyaWFsUGVyc2lzdGVudEZpZWxkcyBzcGYgPSBuZXcgU2VyaWFsUGVyc2lzdGVudEZpZWxkcygpOwotCQkJZmluYWwgaW50IENPTlNUID0gLTUwMDsKLQkJCXNwZi5hbkluc3RhbmNlVmFyID0gQ09OU1Q7Ci0JCQlvYmpUb1NhdmUgPSBzcGY7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJzZXJpYWxQZXJzaXN0ZW50RmllbGRzIGRvIG5vdCB3b3JrIHByb3Blcmx5IGluIHRoaXMgaW1wbGVtZW50YXRpb24iLAotCQkJCQkoKFNlcmlhbFBlcnNpc3RlbnRGaWVsZHMpIG9iakxvYWRlZCkuYW5JbnN0YW5jZVZhciA9PSBDT05TVCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXJpYWxQZXJzaXN0ZW50RmllbGRzIHNwZiA9IG5ldyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgQ09OU1QgPSAtNTAwOworICAgICAgICAgICAgc3BmLmFuSW5zdGFuY2VWYXIgPSBDT05TVDsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHNwZjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgInNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgZG8gbm90IHdvcmsgcHJvcGVybHkgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICgoU2VyaWFsUGVyc2lzdGVudEZpZWxkcykgb2JqTG9hZGVkKS5hbkluc3RhbmNlVmFyID09IENPTlNUKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNDVfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzQ1X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJV3JpdGVGaWVsZHNXaXRob3V0RmV0Y2hpbmdQdXRGaWVsZHMgc3BmID0gbmV3IFdyaXRlRmllbGRzV2l0aG91dEZldGNoaW5nUHV0RmllbGRzKCk7Ci0JCQlvYmpUb1NhdmUgPSBzcGY7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCWJvb2xlYW4gY2F1c2VkRXhjZXB0aW9uID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCX0gY2F0Y2ggKE5vdEFjdGl2ZUV4Y2VwdGlvbiBjZSkgewotCQkJCWNhdXNlZEV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJXcml0ZUZpZWxkc1dpdGhvdXRGZXRjaGluZ1B1dEZpZWxkcyIsIGNhdXNlZEV4Y2VwdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBXcml0ZUZpZWxkc1dpdGhvdXRGZXRjaGluZ1B1dEZpZWxkcyBzcGYgPSBuZXcgV3JpdGVGaWVsZHNXaXRob3V0RmV0Y2hpbmdQdXRGaWVsZHMoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHNwZjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgYm9vbGVhbiBjYXVzZWRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm90QWN0aXZlRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICAgICAgY2F1c2VkRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyaXRlRmllbGRzV2l0aG91dEZldGNoaW5nUHV0RmllbGRzIiwgY2F1c2VkRXhjZXB0aW9uKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNDZfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzQ2X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gU2VyaWFsUGVyc2lzdGVudEZpZWxkcy5jbGFzczsgLy8gVGVzdCBmb3IgMUZBN1RBNgotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gYmUgYWJsZSB0byBzYXZlL2xvYWQgYW4gZXhjZXB0aW9uCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBTZXJpYWxQZXJzaXN0ZW50RmllbGRzLmNsYXNzOyAvLyBUZXN0IGZvciAxRkE3VEE2CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBiZSBhYmxlIHRvIHNhdmUvbG9hZCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0cnVlKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNDdfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzQ3X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKFNlcmlhbFBlcnNpc3RlbnRGaWVsZHMuY2xhc3MpOyAvLyBUZXN0Ci0JCQkvLyBmb3IKLQkJCS8vIDFGQTdUQTYKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKFNlcmlhbFBlcnNpc3RlbnRGaWVsZHMuY2xhc3MpOyAvLyBUZXN0CisgICAgICAgICAgICAvLyBmb3IKKyAgICAgICAgICAgIC8vIDFGQTdUQTYKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGFibGUgdG8gc2F2ZS9sb2FkIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF80OF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNDhfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlTZXJpYWxQZXJzaXN0ZW50RmllbGRzV2l0aG91dEZpZWxkIHNwZiA9IG5ldyBTZXJpYWxQZXJzaXN0ZW50RmllbGRzV2l0aG91dEZpZWxkKCk7Ci0JCQlmaW5hbCBpbnQgQ09OU1QgPSAtNTAwOwotCQkJc3BmLmFuSW5zdGFuY2VWYXIgPSBDT05TVDsKLQkJCW9ialRvU2F2ZSA9IHNwZjsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJInNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgZG8gbm90IHdvcmsgcHJvcGVybHkgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiIsCi0JCQkJCSgoU2VyaWFsUGVyc2lzdGVudEZpZWxkc1dpdGhvdXRGaWVsZCkgb2JqTG9hZGVkKS5hbkluc3RhbmNlVmFyICE9IENPTlNUKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcmlhbFBlcnNpc3RlbnRGaWVsZHNXaXRob3V0RmllbGQgc3BmID0gbmV3IFNlcmlhbFBlcnNpc3RlbnRGaWVsZHNXaXRob3V0RmllbGQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBDT05TVCA9IC01MDA7CisgICAgICAgICAgICBzcGYuYW5JbnN0YW5jZVZhciA9IENPTlNUOworICAgICAgICAgICAgb2JqVG9TYXZlID0gc3BmOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAic2VyaWFsUGVyc2lzdGVudEZpZWxkcyBkbyBub3Qgd29yayBwcm9wZXJseSBpbiB0aGlzIGltcGxlbWVudGF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgKChTZXJpYWxQZXJzaXN0ZW50RmllbGRzV2l0aG91dEZpZWxkKSBvYmpMb2FkZWQpLmFuSW5zdGFuY2VWYXIgIT0gQ09OU1QpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF80OV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNDlfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uIHAgPSBuZXcgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbigKLQkJCQkJInd3dy55YWhvby5jb20iLCAiY29ubmVjdCIpOwotCQkJb2JqVG9TYXZlID0gcDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZSgiU29ja2V0UGVybWlzc2lvbnMgYXJlIG5vdCB0aGUgc2FtZTogIiArIHAgKyAiXHQsXHQiCi0JCQkJCSsgb2JqTG9hZGVkLCBwLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gcCA9IG5ldyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAid3d3LnlhaG9vLmNvbSIsICJjb25uZWN0Iik7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBwOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXRQZXJtaXNzaW9ucyBhcmUgbm90IHRoZSBzYW1lOiAiICsgcCArICJcdCxcdCIKKyAgICAgICAgICAgICAgICAgICAgKyBvYmpMb2FkZWQsIHAuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF81MF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNTBfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uIHAgPSBuZXcgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbigKLQkJCQkJInd3dy55YWhvby5jb20iLCAiUmVTb0xWZSwgIAkJQ29uTmVjVCIpOwotCQkJb2JqVG9TYXZlID0gcDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYXNzZXJ0VHJ1ZSgiU29ja2V0UGVybWlzc2lvbnMgYXJlIG5vdCB0aGUgc2FtZTogIiArIHAgKyAiXHQsXHQiCi0JCQkJCSsgb2JqTG9hZGVkLCBwLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gcCA9IG5ldyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAid3d3LnlhaG9vLmNvbSIsICJSZVNvTFZlLCAgICAgICAgICBDb25OZWNUIik7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBwOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXRQZXJtaXNzaW9ucyBhcmUgbm90IHRoZSBzYW1lOiAiICsgcCArICJcdCxcdCIKKyAgICAgICAgICAgICAgICAgICAgKyBvYmpMb2FkZWQsIHAuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF81MV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNTFfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCVJlYWRXcml0ZU9iamVjdEFuZFByaW1pdGl2ZURhdGEgcmVhZFdyaXRlID0gbmV3IFJlYWRXcml0ZU9iamVjdEFuZFByaW1pdGl2ZURhdGEoKTsKLQkJCW9ialRvU2F2ZSA9IHJlYWRXcml0ZTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gaGFzIHRvIGhhdmUgY2FsbGVkIHRoZSB3cml0ZU9iamVjdCBvbiB0aGUgaW5zdGFuY2UgdG8gZHVtcAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHJlYWRXcml0ZS5jYWxsZWRXcml0ZU9iamVjdCk7Ci0JCQkvLyBoYXMgdG8gaGF2ZSBjYWxsZWQgdGhlIHJlYWRPYmplY3Qgb24gdGhlIGluc3RhbmNlIGxvYWRlZAotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkoKFJlYWRXcml0ZU9iamVjdEFuZFByaW1pdGl2ZURhdGEpIG9iakxvYWRlZCkuY2FsbGVkUmVhZE9iamVjdCk7CisgICAgICAgICAgICBSZWFkV3JpdGVPYmplY3RBbmRQcmltaXRpdmVEYXRhIHJlYWRXcml0ZSA9IG5ldyBSZWFkV3JpdGVPYmplY3RBbmRQcmltaXRpdmVEYXRhKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSByZWFkV3JpdGU7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGhhcyB0byBoYXZlIGNhbGxlZCB0aGUgd3JpdGVPYmplY3Qgb24gdGhlIGluc3RhbmNlIHRvIGR1bXAKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCByZWFkV3JpdGUuY2FsbGVkV3JpdGVPYmplY3QpOworICAgICAgICAgICAgLy8gaGFzIHRvIGhhdmUgY2FsbGVkIHRoZSByZWFkT2JqZWN0IG9uIHRoZSBpbnN0YW5jZSBsb2FkZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgKChSZWFkV3JpdGVPYmplY3RBbmRQcmltaXRpdmVEYXRhKSBvYmpMb2FkZWQpLmNhbGxlZFJlYWRPYmplY3QpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF81Ml93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNTJfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJhIiwKLQkJCQkJImxpc3QiLCAib2YiLCAic3RyaW5ncyIgfSkpOwotCQkJb2JqVG9TYXZlID0gbGlzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHJ1ZSk7CisgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYSIsCisgICAgICAgICAgICAgICAgICAgICJsaXN0IiwgIm9mIiwgInN0cmluZ3MiIH0pKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGxpc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF81M193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNTNfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7CisgICAgICAgIHRyeSB7CiAKLQkJCW9ialRvU2F2ZSA9IExvY2FsZS5DSElORVNFOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0cnVlKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IExvY2FsZS5DSElORVNFOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0cnVlKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfT3B0aW9uYWxEYXRhTm90UmVhZCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfT3B0aW9uYWxEYXRhTm90UmVhZCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCU9wdGlvbmFsRGF0YU5vdFJlYWQgdGVzdCA9IG5ldyBPcHRpb25hbERhdGFOb3RSZWFkKCk7Ci0JCQkvLyBIYXZlIHRvIHNhdmUgYW4gb2JqZWN0IGFmdGVyIHRoZSBvbmUgYWJvdmUsIGFuZCB3aGVuIHdlIHJlYWQgaXQsCi0JCQkvLyBpdCBjYW5ub3QgYmUgYSBieXRlW10KLQkJCURhdGUgbm93ID0gbmV3IERhdGUoKTsKLQkJCU9iamVjdFtdIHR3b09iamVjdHMgPSBuZXcgT2JqZWN0WzJdOwotCQkJdHdvT2JqZWN0c1swXSA9IHRlc3Q7Ci0JCQl0d29PYmplY3RzWzFdID0gbm93OwotCQkJb2JqVG9TYXZlID0gdHdvT2JqZWN0czsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlPYmplY3RbXSB0d29Mb2FkZWRPYmplY3RzID0gKE9iamVjdFtdKSBvYmpMb2FkZWQ7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdHdvTG9hZGVkT2JqZWN0c1swXQotCQkJCQkuZ2V0Q2xhc3MoKSA9PSBPcHRpb25hbERhdGFOb3RSZWFkLmNsYXNzKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0d29Mb2FkZWRPYmplY3RzWzFdCi0JCQkJCS5nZXRDbGFzcygpID09IERhdGUuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3B0aW9uYWxEYXRhTm90UmVhZCB0ZXN0ID0gbmV3IE9wdGlvbmFsRGF0YU5vdFJlYWQoKTsKKyAgICAgICAgICAgIC8vIEhhdmUgdG8gc2F2ZSBhbiBvYmplY3QgYWZ0ZXIgdGhlIG9uZSBhYm92ZSwgYW5kIHdoZW4gd2UgcmVhZCBpdCwKKyAgICAgICAgICAgIC8vIGl0IGNhbm5vdCBiZSBhIGJ5dGVbXQorICAgICAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgT2JqZWN0W10gdHdvT2JqZWN0cyA9IG5ldyBPYmplY3RbMl07CisgICAgICAgICAgICB0d29PYmplY3RzWzBdID0gdGVzdDsKKyAgICAgICAgICAgIHR3b09iamVjdHNbMV0gPSBub3c7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0d29PYmplY3RzOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIE9iamVjdFtdIHR3b0xvYWRlZE9iamVjdHMgPSAoT2JqZWN0W10pIG9iakxvYWRlZDsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0d29Mb2FkZWRPYmplY3RzWzBdCisgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpID09IE9wdGlvbmFsRGF0YU5vdFJlYWQuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHR3b0xvYWRlZE9iamVjdHNbMV0KKyAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkgPT0gRGF0ZS5jbGFzcyk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzU1X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF81NV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCU9iamVjdFtdIHRocmVlT2JqZWN0cyA9IG5ldyBPYmplY3RbM107Ci0JCQl0aHJlZU9iamVjdHNbMF0gPSBuZXcgSW50ZWdlcigyKTsKLQkJCXRocmVlT2JqZWN0c1sxXSA9IERhdGUuY2xhc3M7Ci0JCQl0aHJlZU9iamVjdHNbMl0gPSB0aHJlZU9iamVjdHNbMF07IC8vIGhhcyB0byBiZSB0aGUgc2FtZQotCQkJb2JqVG9TYXZlID0gdGhyZWVPYmplY3RzOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCU9iamVjdFtdIHRocmVlTG9hZGVkT2JqZWN0cyA9IChPYmplY3RbXSkgb2JqTG9hZGVkOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRocmVlTG9hZGVkT2JqZWN0c1swXQotCQkJCQkuZ2V0Q2xhc3MoKSA9PSBJbnRlZ2VyLmNsYXNzKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQl0aHJlZUxvYWRlZE9iamVjdHNbMV0gPT0gRGF0ZS5jbGFzcyk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJdGhyZWVMb2FkZWRPYmplY3RzWzBdID09IHRocmVlTG9hZGVkT2JqZWN0c1syXSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3RbXSB0aHJlZU9iamVjdHMgPSBuZXcgT2JqZWN0WzNdOworICAgICAgICAgICAgdGhyZWVPYmplY3RzWzBdID0gbmV3IEludGVnZXIoMik7CisgICAgICAgICAgICB0aHJlZU9iamVjdHNbMV0gPSBEYXRlLmNsYXNzOworICAgICAgICAgICAgdGhyZWVPYmplY3RzWzJdID0gdGhyZWVPYmplY3RzWzBdOyAvLyBoYXMgdG8gYmUgdGhlIHNhbWUKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRocmVlT2JqZWN0czsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBPYmplY3RbXSB0aHJlZUxvYWRlZE9iamVjdHMgPSAoT2JqZWN0W10pIG9iakxvYWRlZDsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0aHJlZUxvYWRlZE9iamVjdHNbMF0KKyAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkgPT0gSW50ZWdlci5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWVMb2FkZWRPYmplY3RzWzFdID09IERhdGUuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgIHRocmVlTG9hZGVkT2JqZWN0c1swXSA9PSB0aHJlZUxvYWRlZE9iamVjdHNbMl0pOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF81Nl93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNTZfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQkvLyBUZXN0IGZvciAxRkQyNEJZCi0JCQlOZXN0ZWRQdXRGaWVsZCB0ZXN0ID0gbmV3IE5lc3RlZFB1dEZpZWxkKCk7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydE5vdE51bGwoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkoKE5lc3RlZFB1dEZpZWxkKSBvYmpMb2FkZWQpLmZpZWxkMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUZXN0IGZvciAxRkQyNEJZCisgICAgICAgICAgICBOZXN0ZWRQdXRGaWVsZCB0ZXN0ID0gbmV3IE5lc3RlZFB1dEZpZWxkKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAorICAgICAgICAgICAgICAgICAgICAoKE5lc3RlZFB1dEZpZWxkKSBvYmpMb2FkZWQpLmZpZWxkMSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzU3X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfMThfNTdfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0OwotCQkJU3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7CisgICAgICAgICAgICBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nOwogCi0JCQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgPSBuZXcgU3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKAotCQkJCQlvdXQpOwotCQkJOwotCQkJb2JqVG9TYXZlID0gRk9PLmdldENsYXNzKCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCXN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZy53cml0ZU9iamVjdChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgcnVuIHRoZSByZXBsYWNlbWVudCBtZXRob2QKLQkJCWFzc2VydFRydWUoIkV4ZWN1dGVkIHJlcGxhY2VtZW50IHdoZW4gaXQgc2hvdWxkIG5vdDogIiArIG9ialRvU2F2ZSwKLQkJCQkJIXN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZy5jYWxsZWRDbGFzc1JlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyA9IG5ldyBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoCisgICAgICAgICAgICAgICAgICAgIG91dCk7CisgICAgICAgICAgICA7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBGT08uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nLndyaXRlT2JqZWN0KG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSBydW4gdGhlIHJlcGxhY2VtZW50IG1ldGhvZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhlY3V0ZWQgcmVwbGFjZW1lbnQgd2hlbiBpdCBzaG91bGQgbm90OiAiICsgb2JqVG9TYXZlLAorICAgICAgICAgICAgICAgICAgICAhc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nLmNhbGxlZENsYXNzUmVwbGFjZW1lbnQpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCi0JCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yICIgKyBlcnIgKyAiIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yICIgKyBlcnIgKyAiIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzU4X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfMThfNThfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0OwotCQkJU3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7CisgICAgICAgICAgICBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nOwogCi0JCQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgPSBuZXcgU3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKAotCQkJCQlvdXQpOwotCQkJOwotCQkJb2JqVG9TYXZlID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKEZPTy5nZXRDbGFzcygpKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nLndyaXRlT2JqZWN0KG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSBydW4gdGhlIHJlcGxhY2VtZW50IG1ldGhvZAotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIkV4ZWN1dGVkIHJlcGxhY2VtZW50IHdoZW4gaXQgc2hvdWxkIG5vdDogIiArIG9ialRvU2F2ZSwKLQkJCQkJIXN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZy5jYWxsZWRPYmplY3RTdHJlYW1DbGFzc1JlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyA9IG5ldyBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoCisgICAgICAgICAgICAgICAgICAgIG91dCk7CisgICAgICAgICAgICA7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBPYmplY3RTdHJlYW1DbGFzcy5sb29rdXAoRk9PLmdldENsYXNzKCkpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcud3JpdGVPYmplY3Qob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHJ1biB0aGUgcmVwbGFjZW1lbnQgbWV0aG9kCisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiRXhlY3V0ZWQgcmVwbGFjZW1lbnQgd2hlbiBpdCBzaG91bGQgbm90OiAiICsgb2JqVG9TYXZlLAorICAgICAgICAgICAgICAgICAgICAhc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nLmNhbGxlZE9iamVjdFN0cmVhbUNsYXNzUmVwbGFjZW1lbnQpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCi0JCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yICIgKyBlcnIgKyAiIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIlx0LT4iCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yICIgKyBlcnIgKyAiIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzU5X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF81OV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0JCQlTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKKyAgICAgICAgICAgIFN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyBzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmc7CiAKLQkJCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCXN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyA9IG5ldyBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoCi0JCQkJCW91dCk7Ci0JCQk7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgaW50WzNdOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcud3JpdGVPYmplY3Qob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHJ1biB0aGUgcmVwbGFjZW1lbnQgbWV0aG9kCi0JCQlhc3NlcnRUcnVlKCJESWQgbm90IGV4ZWN1dGUgcmVwbGFjZW1lbnQgd2hlbiBpdCBzaG91bGQ6ICIKLQkJCQkJKyBvYmpUb1NhdmUsCi0JCQkJCXN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZy5jYWxsZWRBcnJheVJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZyA9IG5ldyBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcoCisgICAgICAgICAgICAgICAgICAgIG91dCk7CisgICAgICAgICAgICA7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgaW50WzNdOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcud3JpdGVPYmplY3Qob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHJ1biB0aGUgcmVwbGFjZW1lbnQgbWV0aG9kCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJESWQgbm90IGV4ZWN1dGUgcmVwbGFjZW1lbnQgd2hlbiBpdCBzaG91bGQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZy5jYWxsZWRBcnJheVJlcGxhY2VtZW50KTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICJcdC0+IgotCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciAiICsgZXJyICsgIiB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICJcdC0+IgorICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciAiICsgZXJyICsgIiB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF82MF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNjBfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0OwotCQkJU3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7CisgICAgICAgICAgICBTdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgc3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nOwogCi0JCQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgPSBuZXcgU3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKAotCQkJCQlvdXQpOwotCQkJOwotCQkJb2JqVG9TYXZlID0gRk9POwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcud3JpdGVPYmplY3Qob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHJ1biB0aGUgcmVwbGFjZW1lbnQgbWV0aG9kCi0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IGV4ZWN1dGUgcmVwbGFjZW1lbnQgd2hlbiBpdCBzaG91bGQ6ICIKLQkJCQkJKyBvYmpUb1NhdmUsCi0JCQkJCXN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZy5jYWxsZWRTdHJpbmdSZXBsYWNlbWVudCk7CisgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcgPSBuZXcgU3RyZWFtQmFzZWRSZXBsYWNlbWVudFdoZW5EdW1waW5nKAorICAgICAgICAgICAgICAgICAgICBvdXQpOworICAgICAgICAgICAgOworICAgICAgICAgICAgb2JqVG9TYXZlID0gRk9POworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBzdHJlYW1CYXNlZFJlcGxhY2VtZW50V2hlbkR1bXBpbmcud3JpdGVPYmplY3Qob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHJ1biB0aGUgcmVwbGFjZW1lbnQgbWV0aG9kCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGV4ZWN1dGUgcmVwbGFjZW1lbnQgd2hlbiBpdCBzaG91bGQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUJhc2VkUmVwbGFjZW1lbnRXaGVuRHVtcGluZy5jYWxsZWRTdHJpbmdSZXBsYWNlbWVudCk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiXHQtPiIKLQkJCQkJKyBlLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVyciArICIgd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiXHQtPiIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVyciArICIgd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNjFfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzYxX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJQXJyYXlPZlNlcmlhbGl6YWJsZSB0ZXN0ID0gbmV3IEFycmF5T2ZTZXJpYWxpemFibGUoKTsKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXJyYXlPZlNlcmlhbGl6YWJsZSB0ZXN0ID0gbmV3IEFycmF5T2ZTZXJpYWxpemFibGUoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRydWUpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF82Ml93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNjJfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlDbGFzc1N1YkNsYXNzVGVzdDEgdGVzdCA9IG5ldyBDbGFzc1N1YkNsYXNzVGVzdDEoCi0JCQkJCSJTdXBlckluaXRpYWxTdHJpbmciLCAiU3ViSW5pdGlhbFN0cmluZyIpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc1N1YkNsYXNzVGVzdDEgdGVzdCA9IG5ldyBDbGFzc1N1YkNsYXNzVGVzdDEoCisgICAgICAgICAgICAgICAgICAgICJTdXBlckluaXRpYWxTdHJpbmciLCAiU3ViSW5pdGlhbFN0cmluZyIpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gdGVzdDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzYzX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF82M193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCUNvbnN0cnVjdG9yVGVzdEMgdGVzdCA9IG5ldyBDb25zdHJ1Y3RvclRlc3RDKCk7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LnZlcmlmeShvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yVGVzdEMgdGVzdCA9IG5ldyBDb25zdHJ1Y3RvclRlc3RDKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LnZlcmlmeShvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNjRfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzY0X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJSGFzaENvZGVUZXN0IHRlc3QgPSBuZXcgSGFzaENvZGVUZXN0KCk7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkhKChIYXNoQ29kZVRlc3QpIG9iakxvYWRlZCkuc2VyaWFsaXphdGlvblVzZXNIYXNoQ29kZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIYXNoQ29kZVRlc3QgdGVzdCA9IG5ldyBIYXNoQ29kZVRlc3QoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgICEoKEhhc2hDb2RlVGVzdCkgb2JqTG9hZGVkKS5zZXJpYWxpemF0aW9uVXNlc0hhc2hDb2RlKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNjVfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzY1X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJSW5pdGlhbGl6ZXJGaWVsZHNUZXN0IHRlc3QgPSBuZXcgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0KCk7Ci0JCQl0ZXN0LnRvQmVTZXJpYWxpemVkID0gInNlcmlhbGl6aW5nIjsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdC50b0JlTm90U2VyaWFsaXplZCA9ICJJdCBzaG91bGQgbm90IGhhdmUgdGhpcyB2YWx1ZSBhZnRlciBsb2FkZWQgZnJvbSBhIEZpbGUiOwotCQkJSW5pdGlhbGl6ZXJGaWVsZHNUZXN0LnRvQmVOb3RTZXJpYWxpemVkMiA9ICJHb29kLVRoaXMgaXMgdGhlIHJpZ3RoIHZhbHVlLiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QgdGVzdCA9IG5ldyBJbml0aWFsaXplckZpZWxkc1Rlc3QoKTsKKyAgICAgICAgICAgIHRlc3QudG9CZVNlcmlhbGl6ZWQgPSAic2VyaWFsaXppbmciOworICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0LnRvQmVOb3RTZXJpYWxpemVkID0gIkl0IHNob3VsZCBub3QgaGF2ZSB0aGlzIHZhbHVlIGFmdGVyIGxvYWRlZCBmcm9tIGEgRmlsZSI7CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QudG9CZU5vdFNlcmlhbGl6ZWQyID0gIkdvb2QtVGhpcyBpcyB0aGUgcmlndGggdmFsdWUuIjsKIAotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJZHVtcChvYmpUb1NhdmUpOwotCQkJSW5pdGlhbGl6ZXJGaWVsZHNUZXN0LnRvQmVOb3RTZXJpYWxpemVkID0gbmV3IFN0cmluZygKLQkJCQkJSW5pdGlhbGl6ZXJGaWVsZHNUZXN0LnRvQmVOb3RTZXJpYWxpemVkMik7Ci0JCQlvYmpMb2FkZWQgPSByZWxvYWQoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGR1bXAob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIEluaXRpYWxpemVyRmllbGRzVGVzdC50b0JlTm90U2VyaWFsaXplZCA9IG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemVyRmllbGRzVGVzdC50b0JlTm90U2VyaWFsaXplZDIpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gcmVsb2FkKCk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsICh0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCAodGVzdC5lcXVhbHMob2JqTG9hZGVkKSkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF82Nl93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNjZfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlJbml0aWFsaXplckZpZWxkc1Rlc3QyIHRlc3QgPSBuZXcgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0MigpOwotCQkJdGVzdC50b0JlU2VyaWFsaXplZCA9ICJzZXJpYWxpemluZyI7Ci0JCQl0ZXN0LnRvQmVTZXJpYWxpemVkMyA9ICJzZXJpYWxpemluZzMiOwotCQkJdGVzdC50b0JlU2VyaWFsaXplZDQgPSAic2VyaWFsaXppbmc0IjsKLQkJCXRlc3QudG9CZVNlcmlhbGl6ZWQ1ID0gInNlcmlhbGl6aW5nNSI7Ci0JCQlJbml0aWFsaXplckZpZWxkc1Rlc3QyLnRvQmVOb3RTZXJpYWxpemVkID0gIkl0IHNob3VsZCBub3QgaGF2ZSB0aGlzIHZhbHVlIGFmdGVyIGxvYWRlZCBmcm9tIGEgRmlsZSI7Ci0JCQlJbml0aWFsaXplckZpZWxkc1Rlc3QyLnRvQmVOb3RTZXJpYWxpemVkMiA9ICJHb29kLVRoaXMgaXMgdGhlIHJpZ3RoIHZhbHVlLiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QyIHRlc3QgPSBuZXcgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0MigpOworICAgICAgICAgICAgdGVzdC50b0JlU2VyaWFsaXplZCA9ICJzZXJpYWxpemluZyI7CisgICAgICAgICAgICB0ZXN0LnRvQmVTZXJpYWxpemVkMyA9ICJzZXJpYWxpemluZzMiOworICAgICAgICAgICAgdGVzdC50b0JlU2VyaWFsaXplZDQgPSAic2VyaWFsaXppbmc0IjsKKyAgICAgICAgICAgIHRlc3QudG9CZVNlcmlhbGl6ZWQ1ID0gInNlcmlhbGl6aW5nNSI7CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QyLnRvQmVOb3RTZXJpYWxpemVkID0gIkl0IHNob3VsZCBub3QgaGF2ZSB0aGlzIHZhbHVlIGFmdGVyIGxvYWRlZCBmcm9tIGEgRmlsZSI7CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QyLnRvQmVOb3RTZXJpYWxpemVkMiA9ICJHb29kLVRoaXMgaXMgdGhlIHJpZ3RoIHZhbHVlLiI7CiAKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCWR1bXAob2JqVG9TYXZlKTsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDIudG9CZU5vdFNlcmlhbGl6ZWQgPSBuZXcgU3RyaW5nKAotCQkJCQlJbml0aWFsaXplckZpZWxkc1Rlc3QyLnRvQmVOb3RTZXJpYWxpemVkMik7Ci0JCQlvYmpMb2FkZWQgPSByZWxvYWQoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGR1bXAob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIEluaXRpYWxpemVyRmllbGRzVGVzdDIudG9CZU5vdFNlcmlhbGl6ZWQgPSBuZXcgU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QyLnRvQmVOb3RTZXJpYWxpemVkMik7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSByZWxvYWQoKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgKHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsICh0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzY3X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF82N193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDMgdGVzdCA9IG5ldyBJbml0aWFsaXplckZpZWxkc1Rlc3QzKCk7Ci0JCQl0ZXN0LnRvQmVTZXJpYWxpemVkID0gInNlcmlhbGl6aW5nIjsKLQkJCXRlc3QudG9CZVNlcmlhbGl6ZWQzID0gInNlcmlhbGl6aW5nMyI7Ci0JCQl0ZXN0LnRvQmVTZXJpYWxpemVkNCA9ICJzZXJpYWxpemluZzQiOwotCQkJdGVzdC50b0JlU2VyaWFsaXplZDUgPSAic2VyaWFsaXppbmc1IjsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDIudG9CZU5vdFNlcmlhbGl6ZWQgPSAiSXQgc2hvdWxkIG5vdCBoYXZlIHRoaXMgdmFsdWUgYWZ0ZXIgbG9hZGVkIGZyb20gYSBGaWxlIjsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDIudG9CZU5vdFNlcmlhbGl6ZWQyID0gIkdvb2QtVGhpcyBpcyB0aGUgcmlndGggdmFsdWUuIjsKLQkJCXRlc3Quc3ViX3RvQmVTZXJpYWxpemVkID0gInNlcmlhbGl6aW5nU3ViIjsKLQkJCXRlc3Quc3ViX3RvQmVTZXJpYWxpemVkMyA9ICJzZXJpYWxpemluZzNzdWIiOwotCQkJdGVzdC5zdWJfdG9CZVNlcmlhbGl6ZWQ0ID0gInNlcmlhbGl6aW5nNHN1YiI7Ci0JCQl0ZXN0LnN1Yl90b0JlU2VyaWFsaXplZDUgPSAic2VyaWFsaXppbmc1c3ViIjsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDMuc3ViX3RvQmVOb3RTZXJpYWxpemVkID0gIihTdWJjbGFzcykgSXQgc2hvdWxkIG5vdCBoYXZlIHRoaXMgdmFsdWUgYWZ0ZXIgbG9hZGVkIGZyb20gYSBGaWxlIjsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDMuc3ViX3RvQmVOb3RTZXJpYWxpemVkMiA9ICIoU3ViY2xhc3MpIEdvb2QtVGhpcyBpcyB0aGUgcmlndGggdmFsdWUuIjsKLQkJCS8vIEJlZm9yZSBkdW1waW5nIHRoZSB0d28gc3RhdGljIHZhcnMgYXJlIGRpZmZlcmVudHMuCi0JCQkvLyBBZnRlciBkdW1waW5nIHRoZSB2YWx1ZSBvZiB0b0JlTm90U2VyaWFsaXplZDIgaXMgcHV0IGluCi0JCQkvLyB0b0JlTm90U2VyaWFsaXplZAotCQkJLy8gQWZ0ZXIgbG9hZGluZyBpdCBtdXN0IGJlIHRoZSBzYW1lLgotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJZHVtcChvYmpUb1NhdmUpOwotCQkJSW5pdGlhbGl6ZXJGaWVsZHNUZXN0Mi50b0JlTm90U2VyaWFsaXplZCA9IG5ldyBTdHJpbmcoCi0JCQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDIudG9CZU5vdFNlcmlhbGl6ZWQyKTsKLQkJCUluaXRpYWxpemVyRmllbGRzVGVzdDMuc3ViX3RvQmVOb3RTZXJpYWxpemVkID0gbmV3IFN0cmluZygKLQkJCQkJSW5pdGlhbGl6ZXJGaWVsZHNUZXN0My5zdWJfdG9CZU5vdFNlcmlhbGl6ZWQyKTsKLQkJCW9iakxvYWRlZCA9IHJlbG9hZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0MyB0ZXN0ID0gbmV3IEluaXRpYWxpemVyRmllbGRzVGVzdDMoKTsKKyAgICAgICAgICAgIHRlc3QudG9CZVNlcmlhbGl6ZWQgPSAic2VyaWFsaXppbmciOworICAgICAgICAgICAgdGVzdC50b0JlU2VyaWFsaXplZDMgPSAic2VyaWFsaXppbmczIjsKKyAgICAgICAgICAgIHRlc3QudG9CZVNlcmlhbGl6ZWQ0ID0gInNlcmlhbGl6aW5nNCI7CisgICAgICAgICAgICB0ZXN0LnRvQmVTZXJpYWxpemVkNSA9ICJzZXJpYWxpemluZzUiOworICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0Mi50b0JlTm90U2VyaWFsaXplZCA9ICJJdCBzaG91bGQgbm90IGhhdmUgdGhpcyB2YWx1ZSBhZnRlciBsb2FkZWQgZnJvbSBhIEZpbGUiOworICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0Mi50b0JlTm90U2VyaWFsaXplZDIgPSAiR29vZC1UaGlzIGlzIHRoZSByaWd0aCB2YWx1ZS4iOworICAgICAgICAgICAgdGVzdC5zdWJfdG9CZVNlcmlhbGl6ZWQgPSAic2VyaWFsaXppbmdTdWIiOworICAgICAgICAgICAgdGVzdC5zdWJfdG9CZVNlcmlhbGl6ZWQzID0gInNlcmlhbGl6aW5nM3N1YiI7CisgICAgICAgICAgICB0ZXN0LnN1Yl90b0JlU2VyaWFsaXplZDQgPSAic2VyaWFsaXppbmc0c3ViIjsKKyAgICAgICAgICAgIHRlc3Quc3ViX3RvQmVTZXJpYWxpemVkNSA9ICJzZXJpYWxpemluZzVzdWIiOworICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0My5zdWJfdG9CZU5vdFNlcmlhbGl6ZWQgPSAiKFN1YmNsYXNzKSBJdCBzaG91bGQgbm90IGhhdmUgdGhpcyB2YWx1ZSBhZnRlciBsb2FkZWQgZnJvbSBhIEZpbGUiOworICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0My5zdWJfdG9CZU5vdFNlcmlhbGl6ZWQyID0gIihTdWJjbGFzcykgR29vZC1UaGlzIGlzIHRoZSByaWd0aCB2YWx1ZS4iOworICAgICAgICAgICAgLy8gQmVmb3JlIGR1bXBpbmcgdGhlIHR3byBzdGF0aWMgdmFycyBhcmUgZGlmZmVyZW50cy4KKyAgICAgICAgICAgIC8vIEFmdGVyIGR1bXBpbmcgdGhlIHZhbHVlIG9mIHRvQmVOb3RTZXJpYWxpemVkMiBpcyBwdXQgaW4KKyAgICAgICAgICAgIC8vIHRvQmVOb3RTZXJpYWxpemVkCisgICAgICAgICAgICAvLyBBZnRlciBsb2FkaW5nIGl0IG11c3QgYmUgdGhlIHNhbWUuCisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBkdW1wKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QyLnRvQmVOb3RTZXJpYWxpemVkID0gbmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0Mi50b0JlTm90U2VyaWFsaXplZDIpOworICAgICAgICAgICAgSW5pdGlhbGl6ZXJGaWVsZHNUZXN0My5zdWJfdG9CZU5vdFNlcmlhbGl6ZWQgPSBuZXcgU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplckZpZWxkc1Rlc3QzLnN1Yl90b0JlTm90U2VyaWFsaXplZDIpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gcmVsb2FkKCk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsICh0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCAodGVzdC5lcXVhbHMob2JqTG9hZGVkKSkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF9EZWVwTmVzdGluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfRGVlcE5lc3RpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlEZWVwTmVzdGluZyB0ZXN0ID0gbmV3IERlZXBOZXN0aW5nKDUwKTsKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERlZXBOZXN0aW5nIHRlc3QgPSBuZXcgRGVlcE5lc3RpbmcoNTApOworICAgICAgICAgICAgb2JqVG9TYXZlID0gdGVzdDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCAodGVzdC5lcXVhbHMob2JqTG9hZGVkKSkpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgKHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yICIgKyBlcnIgKyAiIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVyciArICIgd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9EZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCURlZXBOZXN0aW5nV2l0aFdyaXRlT2JqZWN0IHRlc3QgPSBuZXcgRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QoNTApOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVlcE5lc3RpbmdXaXRoV3JpdGVPYmplY3QgdGVzdCA9IG5ldyBEZWVwTmVzdGluZ1dpdGhXcml0ZU9iamVjdCg1MCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsICh0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCAodGVzdC5lcXVhbHMob2JqTG9hZGVkKSkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVyciArICIgd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciAiICsgZXJyICsgIiB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF82OV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNjlfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlOb25QdWJsaWNDbGFzc1Rlc3QgdGVzdCA9IG5ldyBOb25QdWJsaWNDbGFzc1Rlc3QoKTsKLQkJCXRlc3QueDEwKCk7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOb25QdWJsaWNDbGFzc1Rlc3QgdGVzdCA9IG5ldyBOb25QdWJsaWNDbGFzc1Rlc3QoKTsKKyAgICAgICAgICAgIHRlc3QueDEwKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsICh0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCAodGVzdC5lcXVhbHMob2JqTG9hZGVkKSkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF83MF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNzBfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlpbnRbXSB0ZXN0ID0gbmV3IGludFsxXTsKLQkJCWludCBpbnRWYWx1ZSA9IDA7Ci0JCQl0ZXN0WzBdID0gaW50VmFsdWU7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnRbXSB0ZXN0ID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGludCBpbnRWYWx1ZSA9IDA7CisgICAgICAgICAgICB0ZXN0WzBdID0gaW50VmFsdWU7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHModGVzdCwKLQkJCQkJKGludFtdKSBvYmpMb2FkZWQpKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHModGVzdCwKKyAgICAgICAgICAgICAgICAgICAgKGludFtdKSBvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNzFfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzcxX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJaW50IGksIGosIG1heEogPSAzLCBtYXhJID0gMjAwOwotCQkJYnl0ZVtdW10gb2JqID0gbmV3IGJ5dGVbbWF4Sl1bbWF4SV07Ci0JCQlmb3IgKGogPSAwOyBqIDwgbWF4SjsgaisrKSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IG1heEk7IGkrKykKLQkJCQkJb2JqW2pdW2ldID0gKGJ5dGUpIChpIC0gMTAwKTsKLQkJCX0KLQkJCW9ialRvU2F2ZSA9IG9iajsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJYnl0ZVtdW10gdG9Db21wYXJlID0gKGJ5dGVbXVtdKSBvYmpMb2FkZWQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaSwgaiwgbWF4SiA9IDMsIG1heEkgPSAyMDA7CisgICAgICAgICAgICBieXRlW11bXSBvYmogPSBuZXcgYnl0ZVttYXhKXVttYXhJXTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYXhKOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4STsgaSsrKQorICAgICAgICAgICAgICAgICAgICBvYmpbal1baV0gPSAoYnl0ZSkgKGkgLSAxMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqVG9TYXZlID0gb2JqOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBieXRlW11bXSB0b0NvbXBhcmUgPSAoYnl0ZVtdW10pIG9iakxvYWRlZDsKIAotCQkJYm9vbGVhbiBvayA9IHRydWU7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWZvciAoaiA9IDA7IGogPCBtYXhKOyBqKyspIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4STsgaSsrKQotCQkJCQlpZiAob2JqW2pdW2ldICE9IHRvQ29tcGFyZVtqXVtpXSkgewotCQkJCQkJb2sgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heEo7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhJOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpbal1baV0gIT0gdG9Db21wYXJlW2pdW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9rKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvayk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzcyX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF83Ml93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCWludCBpLCBqLCBtYXhKID0gMywgbWF4SSA9IDIwMDsKLQkJCWludFtdW10gb2JqID0gbmV3IGludFttYXhKXVttYXhJXTsKLQkJCWZvciAoaiA9IDA7IGogPCBtYXhKOyBqKyspIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4STsgaSsrKQotCQkJCQlvYmpbal1baV0gPSAoaSAtIDEwMCk7Ci0JCQl9Ci0JCQlvYmpUb1NhdmUgPSBvYmo7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWludFtdW10gdG9Db21wYXJlID0gKGludFtdW10pIG9iakxvYWRlZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBpLCBqLCBtYXhKID0gMywgbWF4SSA9IDIwMDsKKyAgICAgICAgICAgIGludFtdW10gb2JqID0gbmV3IGludFttYXhKXVttYXhJXTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYXhKOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4STsgaSsrKQorICAgICAgICAgICAgICAgICAgICBvYmpbal1baV0gPSAoaSAtIDEwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBvYmo7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGludFtdW10gdG9Db21wYXJlID0gKGludFtdW10pIG9iakxvYWRlZDsKIAotCQkJYm9vbGVhbiBvayA9IHRydWU7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWZvciAoaiA9IDA7IGogPCBtYXhKOyBqKyspIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4STsgaSsrKQotCQkJCQlpZiAob2JqW2pdW2ldICE9IHRvQ29tcGFyZVtqXVtpXSkgewotCQkJCQkJb2sgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heEo7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhJOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpbal1baV0gIT0gdG9Db21wYXJlW2pdW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9rKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvayk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzczX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF83M193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCVN0cmluZyBvcmcgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5ejEyMzQ1Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2eHl6MTIzNDU2Nzg5MCI7Ci0JCQlpbnQgaSwgaiwgbWF4SiA9IDMsIG1heEkgPSA3MDsKLQkJCVN0cmluZ1tdW10gb2JqID0gbmV3IFN0cmluZ1ttYXhKXVttYXhJXTsKLQkJCWZvciAoaiA9IDA7IGogPCBtYXhKOyBqKyspIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4STsgaSsrKQotCQkJCQlvYmpbal1baV0gPSBvcmcuc3Vic3RyaW5nKDAsIGkpOwotCQkJfQotCQkJb2JqVG9TYXZlID0gb2JqOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQlTdHJpbmdbXVtdIHRvQ29tcGFyZSA9IChTdHJpbmdbXVtdKSBvYmpMb2FkZWQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgb3JnID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ4eXoxMjM0NTY3ODkwYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5ejEyMzQ1Njc4OTAiOworICAgICAgICAgICAgaW50IGksIGosIG1heEogPSAzLCBtYXhJID0gNzA7CisgICAgICAgICAgICBTdHJpbmdbXVtdIG9iaiA9IG5ldyBTdHJpbmdbbWF4Sl1bbWF4SV07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF4SjsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heEk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgb2JqW2pdW2ldID0gb3JnLnN1YnN0cmluZygwLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG9iajsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgU3RyaW5nW11bXSB0b0NvbXBhcmUgPSAoU3RyaW5nW11bXSkgb2JqTG9hZGVkOwogCi0JCQlib29sZWFuIG9rID0gdHJ1ZTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJZm9yIChqID0gMDsgaiA8IG1heEo7IGorKykgewotCQkJCWZvciAoaSA9IDA7IGkgPCBtYXhJOyBpKyspCi0JCQkJCWlmICghb2JqW2pdW2ldLmVxdWFscyh0b0NvbXBhcmVbal1baV0pKSB7Ci0JCQkJCQlvayA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF4SjsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heEk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpbal1baV0uZXF1YWxzKHRvQ29tcGFyZVtqXVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2spOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9rKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNzRfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzc0X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJU2FtZUluc3RWYXJOYW1lU3ViQ2xhc3MgdGVzdCA9IG5ldyBTYW1lSW5zdFZhck5hbWVTdWJDbGFzcygxMDApOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJKChTYW1lSW5zdFZhck5hbWVTdWJDbGFzcykgb2JqTG9hZGVkKS5mb28gPT0gMTAwKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNhbWVJbnN0VmFyTmFtZVN1YkNsYXNzIHRlc3QgPSBuZXcgU2FtZUluc3RWYXJOYW1lU3ViQ2xhc3MoMTAwKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgICgoU2FtZUluc3RWYXJOYW1lU3ViQ2xhc3MpIG9iakxvYWRlZCkuZm9vID09IDEwMCk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4Xzc1X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF83NV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCVNJbnRlcmZhY2VUZXN0IHRlc3QgPSBuZXcgU0ludGVyZmFjZVRlc3QoKTsKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU0ludGVyZmFjZVRlc3QgdGVzdCA9IG5ldyBTSW50ZXJmYWNlVGVzdCgpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gdGVzdDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4Xzc2X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF83Nl93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCVNJbnRlcmZhY2VUZXN0MiB0ZXN0ID0gbmV3IFNJbnRlcmZhY2VUZXN0MigpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTSW50ZXJmYWNlVGVzdDIgdGVzdCA9IG5ldyBTSW50ZXJmYWNlVGVzdDIoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF83N193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNzdfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlTdXBlcmNsYXNzVGVzdCB0ZXN0ID0gbmV3IFN1cGVyY2xhc3NUZXN0KCk7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN1cGVyY2xhc3NUZXN0IHRlc3QgPSBuZXcgU3VwZXJjbGFzc1Rlc3QoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF83OF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfNzhfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlTdXBlcmNsYXNzVGVzdDIgdGVzdCA9IG5ldyBTdXBlcmNsYXNzVGVzdDIoKTsKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3VwZXJjbGFzc1Rlc3QyIHRlc3QgPSBuZXcgU3VwZXJjbGFzc1Rlc3QyKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfNzlfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzc5X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJU3ludGhldGljRmllbGRUZXN0IHRlc3QgPSBuZXcgU3ludGhldGljRmllbGRUZXN0KCk7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5bnRoZXRpY0ZpZWxkVGVzdCB0ZXN0ID0gbmV3IFN5bnRoZXRpY0ZpZWxkVGVzdCgpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gdGVzdDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzgwX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF84MF93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCURhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJCW5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZG9zKTsgLy8ganVzdCB0byBtYWtlIHN1cmUgd2UgZ2V0IGEgaGVhZGVyCi0JCQlkb3Mud3JpdGVCeXRlKE9iamVjdFN0cmVhbUNvbnN0YW50cy5UQ19CTE9DS0RBVEEpOwotCQkJaW50IGxlbmd0aCA9IDk5OwotCQkJZG9zLndyaXRlQnl0ZShsZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCWRvcy53cml0ZUJ5dGUoMCk7IC8vIGFjdHVhbCB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIKLQkJCX0KLQkJCWRvcy5mbHVzaCgpOwotCQkJaW50IGxlbmd0aFJlYWQgPSAwOwotCQkJdHJ5IHsKLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCi0JCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpKTsKLQkJCQlPYmplY3Qgb2JqID0gb2lzLnJlYWRPYmplY3QoKTsKLQkJCX0gY2F0Y2ggKE9wdGlvbmFsRGF0YUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbGVuZ3RoUmVhZCA9IGUubGVuZ3RoOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCB0aHJvdyBleGNlcHRpb24gd2l0aCBvcHRpb25hbCBkYXRhIHNpemUgIiwKLQkJCQkJbGVuZ3RoID09IGxlbmd0aFJlYWQpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuYWJsZSB0byByZWFkIEJMT0NLREFUQTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gdGVzdGluZyBCTE9DS0RBVEEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVyciArICIgd2hlbiB0ZXN0aW5nIEJMT0NLREFUQSIpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKKyAgICAgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZG9zKTsgLy8ganVzdCB0byBtYWtlIHN1cmUgd2UgZ2V0IGEgaGVhZGVyCisgICAgICAgICAgICBkb3Mud3JpdGVCeXRlKE9iamVjdFN0cmVhbUNvbnN0YW50cy5UQ19CTE9DS0RBVEEpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDk5OworICAgICAgICAgICAgZG9zLndyaXRlQnl0ZShsZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGRvcy53cml0ZUJ5dGUoMCk7IC8vIGFjdHVhbCB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvcy5mbHVzaCgpOworICAgICAgICAgICAgaW50IGxlbmd0aFJlYWQgPSAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wdGlvbmFsRGF0YUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoUmVhZCA9IGUubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCB0aHJvdyBleGNlcHRpb24gd2l0aCBvcHRpb25hbCBkYXRhIHNpemUgIiwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID09IGxlbmd0aFJlYWQpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byByZWFkIEJMT0NLREFUQTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gdGVzdGluZyBCTE9DS0RBVEEgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgIiArIGVyciArICIgd2hlbiB0ZXN0aW5nIEJMT0NLREFUQSIpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0My5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0My5qYXZhCmluZGV4IGVhNjhiZmMuLjE1MjMzYjYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TZXJpYWxpemF0aW9uU3RyZXNzVGVzdDMuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QzLmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CkBAIC0zNiwxNzQwICs0MSwyMTczIEBACiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5pby5TZXJpYWxpemFibGUuY2xhc3MpIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0MyBleHRlbmRzIFNlcmlhbGl6YXRpb25TdHJlc3NUZXN0IHsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdENvbnN0cnVjdG9yIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlpbnQgZjE7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0Q29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIGludCBmMTsKIAotCQlzdGF0aWMgaW50IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDU7CisgICAgICAgIHN0YXRpYyBpbnQgdmFsdWVBZnRlckNvbnN0cnVjdG9yID0gNTsKIAotCQlEZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0JCQlmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQorICAgICAgICBEZWZhdWx0Q29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICBmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkvKgotCQkJICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXQgaXMKLQkJCSAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgotCQkJICogZHVtcGluZyBhbmQgbG9hZGluZwotCQkJICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXQgaXMKKyAgICAgICAgICAgICAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgorICAgICAgICAgICAgICogZHVtcGluZyBhbmQgbG9hZGluZworICAgICAgICAgICAgICovCiAKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBEZWZhdWx0Q29uc3RydWN0b3IpKQotCQkJCXJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEZWZhdWx0Q29uc3RydWN0b3IpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQkJRGVmYXVsdENvbnN0cnVjdG9yIGluc3QgPSAoRGVmYXVsdENvbnN0cnVjdG9yKSBvYmo7Ci0JCQlyZXR1cm4gaW5zdC5mMSA9PSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KLQl9CisgICAgICAgICAgICBEZWZhdWx0Q29uc3RydWN0b3IgaW5zdCA9IChEZWZhdWx0Q29uc3RydWN0b3IpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LmYxID09IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uU2VyRGVmYXVsdENvbnN0cnVjdG9yIHsKLQkJcHVibGljIGludCBmMTsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vblNlckRlZmF1bHRDb25zdHJ1Y3RvciB7CisgICAgICAgIHB1YmxpYyBpbnQgZjE7CiAKLQkJcHVibGljIHN0YXRpYyBpbnQgdmFsdWVBZnRlckNvbnN0cnVjdG9yID0gNTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgdmFsdWVBZnRlckNvbnN0cnVjdG9yID0gNTsKIAotCQlOb25TZXJEZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0JCQlmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQorICAgICAgICBOb25TZXJEZWZhdWx0Q29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICBmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBOb25TZXJEZWZhdWx0Q29uc3RydWN0b3IoU3RyaW5nIG5vdFVzZWQpIHsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIE5vblNlckRlZmF1bHRDb25zdHJ1Y3RvcihTdHJpbmcgbm90VXNlZCkgeworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uU2VyUHJpdmF0ZUNvbnN0cnVjdG9yIHsKLQkJcHVibGljIGludCBmMTsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25TZXJQcml2YXRlQ29uc3RydWN0b3IgeworICAgICAgICBwdWJsaWMgaW50IGYxOwogCi0JCXB1YmxpYyBzdGF0aWMgaW50IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDU7CiAKLQkJcHJpdmF0ZSBOb25TZXJQcml2YXRlQ29uc3RydWN0b3IoKSB7Ci0JCQlmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQorICAgICAgICBwcml2YXRlIE5vblNlclByaXZhdGVDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgICAgIGYxID0gdmFsdWVBZnRlckNvbnN0cnVjdG9yOworICAgICAgICB9CiAKLQkJcHVibGljIE5vblNlclByaXZhdGVDb25zdHJ1Y3RvcihTdHJpbmcgbm90VXNlZCkgewotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgTm9uU2VyUHJpdmF0ZUNvbnN0cnVjdG9yKFN0cmluZyBub3RVc2VkKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25TZXJQcm90ZWN0ZWRDb25zdHJ1Y3RvciB7Ci0JCXB1YmxpYyBpbnQgZjE7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uU2VyUHJvdGVjdGVkQ29uc3RydWN0b3IgeworICAgICAgICBwdWJsaWMgaW50IGYxOwogCi0JCXB1YmxpYyBzdGF0aWMgaW50IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDU7CiAKLQkJcHJvdGVjdGVkIE5vblNlclByb3RlY3RlZENvbnN0cnVjdG9yKCkgewotCQkJZjEgPSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KLQl9CisgICAgICAgIHByb3RlY3RlZCBOb25TZXJQcm90ZWN0ZWRDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgICAgIGYxID0gdmFsdWVBZnRlckNvbnN0cnVjdG9yOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uU2VyUHVibGljQ29uc3RydWN0b3IgewotCQlwdWJsaWMgaW50IGYxOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vblNlclB1YmxpY0NvbnN0cnVjdG9yIHsKKyAgICAgICAgcHVibGljIGludCBmMTsKIAotCQlwdWJsaWMgc3RhdGljIGludCB2YWx1ZUFmdGVyQ29uc3RydWN0b3IgPSA1OworICAgICAgICBwdWJsaWMgc3RhdGljIGludCB2YWx1ZUFmdGVyQ29uc3RydWN0b3IgPSA1OwogCi0JCXB1YmxpYyBOb25TZXJQdWJsaWNDb25zdHJ1Y3RvcigpIHsKLQkJCWYxID0gdmFsdWVBZnRlckNvbnN0cnVjdG9yOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgTm9uU2VyUHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICBmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdENvbnN0cnVjdG9yU3ViIGV4dGVuZHMgTm9uU2VyRGVmYXVsdENvbnN0cnVjdG9yCi0JCQlpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJaW50IGZzdWI7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0Q29uc3RydWN0b3JTdWIgZXh0ZW5kcyBOb25TZXJEZWZhdWx0Q29uc3RydWN0b3IKKyAgICAgICAgICAgIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBpbnQgZnN1YjsKIAotCQlzdGF0aWMgaW50IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDExOworICAgICAgICBzdGF0aWMgaW50IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDExOwogCi0JCXB1YmxpYyBEZWZhdWx0Q29uc3RydWN0b3JTdWIoKSB7Ci0JCQlmMSA9IDc7Ci0JCQlmc3ViID0gc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yOwotCQl9CisgICAgICAgIHB1YmxpYyBEZWZhdWx0Q29uc3RydWN0b3JTdWIoKSB7CisgICAgICAgICAgICBmMSA9IDc7CisgICAgICAgICAgICBmc3ViID0gc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCS8qCi0JCQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgYW5zd2VyaW5nIGl0IHRoZSBvYmpzIGlzIGVxdWFsLiBJdCBpcwotCQkJICogYW5zd2VyaW5nIGlmIHRoZSB2YXJzIGhhdmUgdGhlIHZhbHVlIHRoYXQgaXQgaGF2ZSB0byBoYXZlIGFmdGVyCi0JCQkgKiBkdW1waW5nIGFuZCBsb2FkaW5nCi0JCQkgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgYW5zd2VyaW5nIGl0IHRoZSBvYmpzIGlzIGVxdWFsLiBJdCBpcworICAgICAgICAgICAgICogYW5zd2VyaW5nIGlmIHRoZSB2YXJzIGhhdmUgdGhlIHZhbHVlIHRoYXQgaXQgaGF2ZSB0byBoYXZlIGFmdGVyCisgICAgICAgICAgICAgKiBkdW1waW5nIGFuZCBsb2FkaW5nCisgICAgICAgICAgICAgKi8KIAotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIERlZmF1bHRDb25zdHJ1Y3RvclN1YikpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERlZmF1bHRDb25zdHJ1Y3RvclN1YikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0JCQlEZWZhdWx0Q29uc3RydWN0b3JTdWIgaW5zdCA9IChEZWZhdWx0Q29uc3RydWN0b3JTdWIpIG9iajsKLQkJCWlmIChpbnN0LmYxICE9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gaW5zdC5mc3ViID09IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQotCX0KKyAgICAgICAgICAgIERlZmF1bHRDb25zdHJ1Y3RvclN1YiBpbnN0ID0gKERlZmF1bHRDb25zdHJ1Y3RvclN1Yikgb2JqOworICAgICAgICAgICAgaWYgKGluc3QuZjEgIT0gdmFsdWVBZnRlckNvbnN0cnVjdG9yKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LmZzdWIgPT0gc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yOworICAgICAgICB9CisgICAgfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcml2YXRlQ29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCWludCBmMTsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByaXZhdGVDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgaW50IGYxOwogCi0JCXN0YXRpYyBpbnQgdmFsdWVBZnRlckNvbnN0cnVjdG9yID0gNTsKKyAgICAgICAgc3RhdGljIGludCB2YWx1ZUFmdGVyQ29uc3RydWN0b3IgPSA1OwogCi0JCXByaXZhdGUgUHJpdmF0ZUNvbnN0cnVjdG9yKCkgewotCQkJZjEgPSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBQcml2YXRlQ29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICBmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkvKgotCQkJICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXMgaXMKLQkJCSAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgotCQkJICogZHVtcGluZyBhbmQgbG9hZGluZwotCQkJICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXMgaXMKKyAgICAgICAgICAgICAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgorICAgICAgICAgICAgICogZHVtcGluZyBhbmQgbG9hZGluZworICAgICAgICAgICAgICovCiAKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcml2YXRlQ29uc3RydWN0b3IpKQotCQkJCXJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQcml2YXRlQ29uc3RydWN0b3IpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQkJUHJpdmF0ZUNvbnN0cnVjdG9yIGluc3QgPSAoUHJpdmF0ZUNvbnN0cnVjdG9yKSBvYmo7Ci0JCQlyZXR1cm4gaW5zdC5mMSA9PSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KLQl9CisgICAgICAgICAgICBQcml2YXRlQ29uc3RydWN0b3IgaW5zdCA9IChQcml2YXRlQ29uc3RydWN0b3IpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LmYxID09IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJpdmF0ZUNvbnN0cnVjdG9yU3ViIGV4dGVuZHMgTm9uU2VyUHJpdmF0ZUNvbnN0cnVjdG9yCi0JCQlpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJaW50IGZzdWI7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcml2YXRlQ29uc3RydWN0b3JTdWIgZXh0ZW5kcyBOb25TZXJQcml2YXRlQ29uc3RydWN0b3IKKyAgICAgICAgICAgIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBpbnQgZnN1YjsKIAotCQlzdGF0aWMgaW50IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDExOworICAgICAgICBzdGF0aWMgaW50IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDExOwogCi0JCXB1YmxpYyBQcml2YXRlQ29uc3RydWN0b3JTdWIoKSB7Ci0JCQlzdXBlcigibm90VXNlZCIpOwotCQkJZjEgPSA3OwotCQkJZnN1YiA9IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQorICAgICAgICBwdWJsaWMgUHJpdmF0ZUNvbnN0cnVjdG9yU3ViKCkgeworICAgICAgICAgICAgc3VwZXIoIm5vdFVzZWQiKTsKKyAgICAgICAgICAgIGYxID0gNzsKKyAgICAgICAgICAgIGZzdWIgPSBzdWJWYWx1ZUFmdGVyQ29uc3RydWN0b3I7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJLyoKLQkJCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhbnN3ZXJpbmcgaXQgdGhlIG9ianMgaXMgZXF1YWwuIElzIGlzCi0JCQkgKiBhbnN3ZXJpbmcgaWYgdGhlIHZhcnMgaGF2ZSB0aGUgdmFsdWUgdGhhdCBpdCBoYXZlIHRvIGhhdmUgYWZ0ZXIKLQkJCSAqIGR1bXBpbmcgYW5kIGxvYWRpbmcKLQkJCSAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhbnN3ZXJpbmcgaXQgdGhlIG9ianMgaXMgZXF1YWwuIElzIGlzCisgICAgICAgICAgICAgKiBhbnN3ZXJpbmcgaWYgdGhlIHZhcnMgaGF2ZSB0aGUgdmFsdWUgdGhhdCBpdCBoYXZlIHRvIGhhdmUgYWZ0ZXIKKyAgICAgICAgICAgICAqIGR1bXBpbmcgYW5kIGxvYWRpbmcKKyAgICAgICAgICAgICAqLwogCi0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHJpdmF0ZUNvbnN0cnVjdG9yU3ViKSkKLQkJCQlyZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUHJpdmF0ZUNvbnN0cnVjdG9yU3ViKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJCVByaXZhdGVDb25zdHJ1Y3RvclN1YiBpbnN0ID0gKFByaXZhdGVDb25zdHJ1Y3RvclN1Yikgb2JqOwotCQkJcmV0dXJuIGluc3QuZjEgPT0gdmFsdWVBZnRlckNvbnN0cnVjdG9yCi0JCQkJCSYmIGluc3QuZnN1YiA9PSBzdWJWYWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KLQl9CisgICAgICAgICAgICBQcml2YXRlQ29uc3RydWN0b3JTdWIgaW5zdCA9IChQcml2YXRlQ29uc3RydWN0b3JTdWIpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LmYxID09IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LmZzdWIgPT0gc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yOworICAgICAgICB9CisgICAgfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm90ZWN0ZWRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkJaW50IGYxOworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvdGVjdGVkQ29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIGludCBmMTsKIAotCQlzdGF0aWMgaW50IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDU7CisgICAgICAgIHN0YXRpYyBpbnQgdmFsdWVBZnRlckNvbnN0cnVjdG9yID0gNTsKIAotCQlwcm90ZWN0ZWQgUHJvdGVjdGVkQ29uc3RydWN0b3IoKSB7Ci0JCQlmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgUHJvdGVjdGVkQ29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICBmMSA9IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkvKgotCQkJICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXMgaXMKLQkJCSAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgotCQkJICogZHVtcGluZyBhbmQgbG9hZGluZwotCQkJICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXMgaXMKKyAgICAgICAgICAgICAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgorICAgICAgICAgICAgICogZHVtcGluZyBhbmQgbG9hZGluZworICAgICAgICAgICAgICovCiAKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcm90ZWN0ZWRDb25zdHJ1Y3RvcikpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFByb3RlY3RlZENvbnN0cnVjdG9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJCVByb3RlY3RlZENvbnN0cnVjdG9yIGluc3QgPSAoUHJvdGVjdGVkQ29uc3RydWN0b3IpIG9iajsKLQkJCXJldHVybiBpbnN0LmYxID09IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQotCX0KKyAgICAgICAgICAgIFByb3RlY3RlZENvbnN0cnVjdG9yIGluc3QgPSAoUHJvdGVjdGVkQ29uc3RydWN0b3IpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LmYxID09IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvdGVjdGVkQ29uc3RydWN0b3JTdWIgZXh0ZW5kcwotCQkJTm9uU2VyUHJvdGVjdGVkQ29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCWludCBmc3ViOworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvdGVjdGVkQ29uc3RydWN0b3JTdWIgZXh0ZW5kcworICAgICAgICAgICAgTm9uU2VyUHJvdGVjdGVkQ29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIGludCBmc3ViOwogCi0JCXN0YXRpYyBpbnQgc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yID0gMTE7CisgICAgICAgIHN0YXRpYyBpbnQgc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yID0gMTE7CiAKLQkJcHVibGljIFByb3RlY3RlZENvbnN0cnVjdG9yU3ViKCkgewotCQkJZjEgPSA3OwotCQkJZnN1YiA9IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKLQkJfQorICAgICAgICBwdWJsaWMgUHJvdGVjdGVkQ29uc3RydWN0b3JTdWIoKSB7CisgICAgICAgICAgICBmMSA9IDc7CisgICAgICAgICAgICBmc3ViID0gc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCS8qCi0JCQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgYW5zd2VyaW5nIGl0IHRoZSBvYmpzIGlzIGVxdWFsLiBJcyBpcwotCQkJICogYW5zd2VyaW5nIGlmIHRoZSB2YXJzIGhhdmUgdGhlIHZhbHVlIHRoYXQgaXQgaGF2ZSB0byBoYXZlIGFmdGVyCi0JCQkgKiBkdW1waW5nIGFuZCBsb2FkaW5nCi0JCQkgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgYW5zd2VyaW5nIGl0IHRoZSBvYmpzIGlzIGVxdWFsLiBJcyBpcworICAgICAgICAgICAgICogYW5zd2VyaW5nIGlmIHRoZSB2YXJzIGhhdmUgdGhlIHZhbHVlIHRoYXQgaXQgaGF2ZSB0byBoYXZlIGFmdGVyCisgICAgICAgICAgICAgKiBkdW1waW5nIGFuZCBsb2FkaW5nCisgICAgICAgICAgICAgKi8KIAotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByb3RlY3RlZENvbnN0cnVjdG9yU3ViKSkKLQkJCQlyZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUHJvdGVjdGVkQ29uc3RydWN0b3JTdWIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQkJUHJvdGVjdGVkQ29uc3RydWN0b3JTdWIgaW5zdCA9IChQcm90ZWN0ZWRDb25zdHJ1Y3RvclN1Yikgb2JqOwotCQkJcmV0dXJuIGluc3QuZjEgPT0gdmFsdWVBZnRlckNvbnN0cnVjdG9yCi0JCQkJCSYmIGluc3QuZnN1YiA9PSBzdWJWYWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KLQl9CisgICAgICAgICAgICBQcm90ZWN0ZWRDb25zdHJ1Y3RvclN1YiBpbnN0ID0gKFByb3RlY3RlZENvbnN0cnVjdG9yU3ViKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gaW5zdC5mMSA9PSB2YWx1ZUFmdGVyQ29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5mc3ViID09IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHVibGljQ29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCWludCBmMTsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFB1YmxpY0NvbnN0cnVjdG9yIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBpbnQgZjE7CiAKLQkJc3RhdGljIGludCB2YWx1ZUFmdGVyQ29uc3RydWN0b3IgPSA1OworICAgICAgICBzdGF0aWMgaW50IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDU7CiAKLQkJcHVibGljIFB1YmxpY0NvbnN0cnVjdG9yKCkgewotCQkJZjEgPSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KKyAgICAgICAgcHVibGljIFB1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgZjEgPSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJLyoKLQkJCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhbnN3ZXJpbmcgaXQgdGhlIG9ianMgaXMgZXF1YWwuIElzIGlzCi0JCQkgKiBhbnN3ZXJpbmcgaWYgdGhlIHZhcnMgaGF2ZSB0aGUgdmFsdWUgdGhhdCBpdCBoYXZlIHRvIGhhdmUgYWZ0ZXIKLQkJCSAqIGR1bXBpbmcgYW5kIGxvYWRpbmcKLQkJCSAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhbnN3ZXJpbmcgaXQgdGhlIG9ianMgaXMgZXF1YWwuIElzIGlzCisgICAgICAgICAgICAgKiBhbnN3ZXJpbmcgaWYgdGhlIHZhcnMgaGF2ZSB0aGUgdmFsdWUgdGhhdCBpdCBoYXZlIHRvIGhhdmUgYWZ0ZXIKKyAgICAgICAgICAgICAqIGR1bXBpbmcgYW5kIGxvYWRpbmcKKyAgICAgICAgICAgICAqLwogCi0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHVibGljQ29uc3RydWN0b3IpKQotCQkJCXJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQdWJsaWNDb25zdHJ1Y3RvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0JCQlQdWJsaWNDb25zdHJ1Y3RvciBpbnN0ID0gKFB1YmxpY0NvbnN0cnVjdG9yKSBvYmo7Ci0JCQlyZXR1cm4gaW5zdC5mMSA9PSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KLQl9CisgICAgICAgICAgICBQdWJsaWNDb25zdHJ1Y3RvciBpbnN0ID0gKFB1YmxpY0NvbnN0cnVjdG9yKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gaW5zdC5mMSA9PSB2YWx1ZUFmdGVyQ29uc3RydWN0b3I7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFB1YmxpY0NvbnN0cnVjdG9yU3ViIGV4dGVuZHMgTm9uU2VyUHVibGljQ29uc3RydWN0b3IKLQkJCWltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCQlpbnQgZnN1YjsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFB1YmxpY0NvbnN0cnVjdG9yU3ViIGV4dGVuZHMgTm9uU2VyUHVibGljQ29uc3RydWN0b3IKKyAgICAgICAgICAgIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBpbnQgZnN1YjsKIAotCQlzdGF0aWMgZmluYWwgaW50IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDExOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvciA9IDExOwogCi0JCXB1YmxpYyBQdWJsaWNDb25zdHJ1Y3RvclN1YigpIHsKLQkJCWYxID0gNzsKLQkJCWZzdWIgPSBzdWJWYWx1ZUFmdGVyQ29uc3RydWN0b3I7Ci0JCX0KKyAgICAgICAgcHVibGljIFB1YmxpY0NvbnN0cnVjdG9yU3ViKCkgeworICAgICAgICAgICAgZjEgPSA3OworICAgICAgICAgICAgZnN1YiA9IHN1YlZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkvKgotCQkJICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXQgaXMKLQkJCSAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgotCQkJICogZHVtcGluZyBhbmQgbG9hZGluZwotCQkJICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbm90IGFuc3dlcmluZyBpdCB0aGUgb2JqcyBpcyBlcXVhbC4gSXQgaXMKKyAgICAgICAgICAgICAqIGFuc3dlcmluZyBpZiB0aGUgdmFycyBoYXZlIHRoZSB2YWx1ZSB0aGF0IGl0IGhhdmUgdG8gaGF2ZSBhZnRlcgorICAgICAgICAgICAgICogZHVtcGluZyBhbmQgbG9hZGluZworICAgICAgICAgICAgICovCiAKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQdWJsaWNDb25zdHJ1Y3RvclN1YikpCi0JCQkJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFB1YmxpY0NvbnN0cnVjdG9yU3ViKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJCVB1YmxpY0NvbnN0cnVjdG9yU3ViIGluc3QgPSAoUHVibGljQ29uc3RydWN0b3JTdWIpIG9iajsKLQkJCXJldHVybiBpbnN0LmYxID09IHZhbHVlQWZ0ZXJDb25zdHJ1Y3RvcgotCQkJCQkmJiBpbnN0LmZzdWIgPT0gc3ViVmFsdWVBZnRlckNvbnN0cnVjdG9yOwotCQl9Ci0JfQorICAgICAgICAgICAgUHVibGljQ29uc3RydWN0b3JTdWIgaW5zdCA9IChQdWJsaWNDb25zdHJ1Y3RvclN1Yikgb2JqOworICAgICAgICAgICAgcmV0dXJuIGluc3QuZjEgPT0gdmFsdWVBZnRlckNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICYmIGluc3QuZnN1YiA9PSBzdWJWYWx1ZUFmdGVyQ29uc3RydWN0b3I7CisgICAgICAgIH0KKyAgICB9CiAKLQkvLyBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkLndyaXRlKCkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXcml0ZUZpZWxkc1VzaW5nUHV0RmllbGRXcml0ZSBpbXBsZW1lbnRzCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsKLQkJCQluZXcgT2JqZWN0U3RyZWFtRmllbGQoIm9iamVjdDEiLCBWZWN0b3IuY2xhc3MpLAotCQkJCW5ldyBPYmplY3RTdHJlYW1GaWVsZCgiaW50MSIsIEludGVnZXIuVFlQRSkgfTsKKyAgICAvLyBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkLndyaXRlKCkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXcml0ZUZpZWxkc1VzaW5nUHV0RmllbGRXcml0ZSBpbXBsZW1lbnRzCisgICAgICAgICAgICBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0U3RyZWFtRmllbGQoIm9iamVjdDEiLCBWZWN0b3IuY2xhc3MpLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RTdHJlYW1GaWVsZCgiaW50MSIsIEludGVnZXIuVFlQRSkgfTsKIAotCQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgdjEgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKLQkJCQkiMXN0IiwgIjJuZCIgfSkpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgdjEgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAiMXN0IiwgIjJuZCIgfSkpOwogCi0JCXByaXZhdGUgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwogCi0JCXB1YmxpYyBXcml0ZUZpZWxkc1VzaW5nUHV0RmllbGRXcml0ZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFdyaXRlRmllbGRzVXNpbmdQdXRGaWVsZFdyaXRlKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIHBhc3NlZCgpIHsKLQkJCXJldHVybiBwYXNzZWQ7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGFzc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhc3NlZDsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJaW50IGludDEgPSBpbi5yZWFkSW50KCk7Ci0JCQlWZWN0b3Igb2JqZWN0MSA9IChWZWN0b3IpIGluLnJlYWRPYmplY3QoKTsKLQkJCXBhc3NlZCA9IGludDEgPT0gMHhBOSAmJiBvYmplY3QxLmVxdWFscyh2MSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgaW50MSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIFZlY3RvciBvYmplY3QxID0gKFZlY3RvcikgaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgcGFzc2VkID0gaW50MSA9PSAweEE5ICYmIG9iamVjdDEuZXF1YWxzKHYxKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJT2JqZWN0T3V0cHV0U3RyZWFtLlB1dEZpZWxkIGZpZWxkcyA9IG91dC5wdXRGaWVsZHMoKTsKLQkJCWZpZWxkcy5wdXQoIm9iamVjdDEiLCB2MSk7Ci0JCQlmaWVsZHMucHV0KCJpbnQxIiwgMHhBOSk7Ci0JCQkvLyBVc2UgZmllbGRzLndyaXRlKCkgaW5zdGVhZCBvZiBvdXQud3JpdGVGaWVsZHMoKTsKLQkJCWZpZWxkcy53cml0ZShvdXQpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbS5QdXRGaWVsZCBmaWVsZHMgPSBvdXQucHV0RmllbGRzKCk7CisgICAgICAgICAgICBmaWVsZHMucHV0KCJvYmplY3QxIiwgdjEpOworICAgICAgICAgICAgZmllbGRzLnB1dCgiaW50MSIsIDB4QTkpOworICAgICAgICAgICAgLy8gVXNlIGZpZWxkcy53cml0ZSgpIGluc3RlYWQgb2Ygb3V0LndyaXRlRmllbGRzKCk7CisgICAgICAgICAgICBmaWVsZHMud3JpdGUob3V0KTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQorICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF84MV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfODFfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCQluZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGRvcyk7IC8vIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGdldCBhIGhlYWRlcgotCQkJZG9zLndyaXRlQnl0ZShPYmplY3RTdHJlYW1Db25zdGFudHMuVENfQkxPQ0tEQVRBTE9ORyk7Ci0JCQlpbnQgbGVuZ3RoID0gMzMzOyAvLyBCaWdnZXIgdGhhbiAxIGJ5dGUKLQkJCWRvcy53cml0ZUludChsZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCWRvcy53cml0ZUJ5dGUoMCk7IC8vIGFjdHVhbCB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIKLQkJCX0KLQkJCWRvcy5mbHVzaCgpOwotCQkJaW50IGxlbmd0aFJlYWQgPSAwOwotCQkJdHJ5IHsKLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCi0JCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpKTsKLQkJCQlPYmplY3Qgb2JqID0gb2lzLnJlYWRPYmplY3QoKTsKLQkJCX0gY2F0Y2ggKE9wdGlvbmFsRGF0YUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbGVuZ3RoUmVhZCA9IGUubGVuZ3RoOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCB0aHJvdyBleGNlcHRpb24gd2l0aCBvcHRpb25hbCBkYXRhIHNpemUgIiwKLQkJCQkJbGVuZ3RoID09IGxlbmd0aFJlYWQpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuYWJsZSB0byByZWFkIEJMT0NLREFUQSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHRlc3RpbmcgQkxPQ0tEQVRBTE9ORyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciAiICsgZXJyICsgIiB3aGVuIHRlc3RpbmcgQkxPQ0tEQVRBTE9ORyIpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKKyAgICAgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZG9zKTsgLy8ganVzdCB0byBtYWtlIHN1cmUgd2UgZ2V0IGEgaGVhZGVyCisgICAgICAgICAgICBkb3Mud3JpdGVCeXRlKE9iamVjdFN0cmVhbUNvbnN0YW50cy5UQ19CTE9DS0RBVEFMT05HKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAzMzM7IC8vIEJpZ2dlciB0aGFuIDEgYnl0ZQorICAgICAgICAgICAgZG9zLndyaXRlSW50KGxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZG9zLndyaXRlQnl0ZSgwKTsgLy8gYWN0dWFsIHZhbHVlIGRvZXMgbm90IG1hdHRlcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZG9zLmZsdXNoKCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoUmVhZCA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoT3B0aW9uYWxEYXRhRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGhSZWFkID0gZS5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IHRocm93IGV4Y2VwdGlvbiB3aXRoIG9wdGlvbmFsIGRhdGEgc2l6ZSAiLAorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPT0gbGVuZ3RoUmVhZCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5hYmxlIHRvIHJlYWQgQkxPQ0tEQVRBIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gdGVzdGluZyBCTE9DS0RBVEFMT05HIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yICIgKyBlcnIgKyAiIHdoZW4gdGVzdGluZyBCTE9DS0RBVEFMT05HIik7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzgyX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF84Ml93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCURlZmF1bHRDb25zdHJ1Y3RvciB0ZXN0ID0gbmV3IERlZmF1bHRDb25zdHJ1Y3RvcigpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEZWZhdWx0Q29uc3RydWN0b3IgdGVzdCA9IG5ldyBEZWZhdWx0Q29uc3RydWN0b3IoKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF84M193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfODNfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlEZWZhdWx0Q29uc3RydWN0b3JTdWIgdGVzdCA9IG5ldyBEZWZhdWx0Q29uc3RydWN0b3JTdWIoKTsKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVmYXVsdENvbnN0cnVjdG9yU3ViIHRlc3QgPSBuZXcgRGVmYXVsdENvbnN0cnVjdG9yU3ViKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfODRfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzg0X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJUHJpdmF0ZUNvbnN0cnVjdG9yIHRlc3QgPSBuZXcgUHJpdmF0ZUNvbnN0cnVjdG9yKCk7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaXZhdGVDb25zdHJ1Y3RvciB0ZXN0ID0gbmV3IFByaXZhdGVDb25zdHJ1Y3RvcigpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gdGVzdDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4Xzg1X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfMThfODVfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlQcml2YXRlQ29uc3RydWN0b3JTdWIgdGVzdCA9IG5ldyBQcml2YXRlQ29uc3RydWN0b3JTdWIoKTsKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpdmF0ZUNvbnN0cnVjdG9yU3ViIHRlc3QgPSBuZXcgUHJpdmF0ZUNvbnN0cnVjdG9yU3ViKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfODZfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzg2X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJUHJvdGVjdGVkQ29uc3RydWN0b3IgdGVzdCA9IG5ldyBQcm90ZWN0ZWRDb25zdHJ1Y3RvcigpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm90ZWN0ZWRDb25zdHJ1Y3RvciB0ZXN0ID0gbmV3IFByb3RlY3RlZENvbnN0cnVjdG9yKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfODdfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzg3X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJUHJvdGVjdGVkQ29uc3RydWN0b3JTdWIgdGVzdCA9IG5ldyBQcm90ZWN0ZWRDb25zdHJ1Y3RvclN1YigpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm90ZWN0ZWRDb25zdHJ1Y3RvclN1YiB0ZXN0ID0gbmV3IFByb3RlY3RlZENvbnN0cnVjdG9yU3ViKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfODhfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzg4X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJUHVibGljQ29uc3RydWN0b3IgdGVzdCA9IG5ldyBQdWJsaWNDb25zdHJ1Y3RvcigpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQdWJsaWNDb25zdHJ1Y3RvciB0ZXN0ID0gbmV3IFB1YmxpY0NvbnN0cnVjdG9yKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfODlfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzg5X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJUHVibGljQ29uc3RydWN0b3JTdWIgdGVzdCA9IG5ldyBQdWJsaWNDb25zdHJ1Y3RvclN1YigpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQdWJsaWNDb25zdHJ1Y3RvclN1YiB0ZXN0ID0gbmV3IFB1YmxpY0NvbnN0cnVjdG9yU3ViKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfOTBfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzkwX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gVEFCTEU7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIFRBQkxFLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IFRBQkxFOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBUQUJMRS5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzkxX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF85MV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCU9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoVEFCTEUpOwotCQkJb2JqVG9TYXZlID0gY29sOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChUQUJMRSk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzkyX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF85Ml93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCU9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoVEFCTEUpOwotCQkJb2JqVG9TYXZlID0gY29sOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChUQUJMRSk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzkzX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF85M193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IE1BUDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTUFQLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IE1BUDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTUFQLmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfOTRfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4Xzk0X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChNQVApOwotCQkJb2JqVG9TYXZlID0gY29sOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChNQVApOworICAgICAgICAgICAgb2JqVG9TYXZlID0gY29sOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF85NV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfOTVfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlPYmplY3QgY29sID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKE1BUCk7Ci0JCQlvYmpUb1NhdmUgPSBjb2w7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgY29sID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKE1BUCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4Xzk2X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF85Nl93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IEFMSVNUOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBTElTVC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBBTElTVDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQUxJU1QuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF85N193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfOTdfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBMSVNUOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBMSVNULmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IExJU1Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIExJU1QuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF85OF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfOThfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlPYmplY3QgY29sID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChMSVNUKTsKLQkJCW9ialRvU2F2ZSA9IGNvbDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgY29sLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KExJU1QpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gY29sOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF85OV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfOTlfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlPYmplY3QgY29sID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChMSVNUKTsKLQkJCW9ialRvU2F2ZSA9IGNvbDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgY29sLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KExJU1QpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gY29sOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMDBfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwMF93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IFNFVDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgU0VULmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IFNFVDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgU0VULmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMTAxX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8xMDFfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlPYmplY3QgY29sID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KFNFVCk7Ci0JCQlvYmpUb1NhdmUgPSBjb2w7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgY29sID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KFNFVCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwMl93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTAyX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChTRVQpOwotCQkJb2JqVG9TYXZlID0gY29sOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChTRVQpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gY29sOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBjb2wuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMDNfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwM193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IFRSRUU7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIFRSRUUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gVFJFRTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgVFJFRS5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwNF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTA0X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNvcnRlZE1hcChUUkVFKTsKLQkJCW9ialRvU2F2ZSA9IGNvbDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgY29sLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTb3J0ZWRNYXAoVFJFRSk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwNV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTA1X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZE1hcChUUkVFKTsKLQkJCW9ialRvU2F2ZSA9IGNvbDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgY29sLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRNYXAoVFJFRSk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwNl93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTA2X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gU09SVFNFVDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgU0VULmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IFNPUlRTRVQ7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIFNFVC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwN193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTA3X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNvcnRlZFNldChTT1JUU0VUKTsKLQkJCW9ialRvU2F2ZSA9IGNvbDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgY29sLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTb3J0ZWRTZXQoU09SVFNFVCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwOF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTA4X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJT2JqZWN0IGNvbCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChTT1JUU0VUKTsKLQkJCW9ialRvU2F2ZSA9IGNvbDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgY29sLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBjb2wgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQoU09SVFNFVCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBjb2w7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGNvbC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEwOV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0XzE4XzEwOV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IENBTEVOREFSOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBDQUxFTkRBUi5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBDQUxFTkRBUjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQ0FMRU5EQVIuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMTBfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF8xOF8xMTBfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlUaW1lWm9uZSB0ZXN0ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkVTVCIpOwotCQkJb2JqVG9TYXZlID0gdGVzdDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaW1lWm9uZSB0ZXN0ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkVTVCIpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gdGVzdDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgdGVzdC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzExMV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0XzE4XzExMV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCVRpbWVab25lIHRlc3QgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRVNUIik7Ci0JCQlvYmpUb1NhdmUgPSB0ZXN0OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRpbWVab25lIHRlc3QgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRVNUIik7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSB0ZXN0OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCB0ZXN0LmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMTEyX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfMThfMTEyX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJVGltZVpvbmUgdGVzdCA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKLQkJCW9ialRvU2F2ZSA9IHRlc3Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGltZVpvbmUgdGVzdCA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IHRlc3Q7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIHRlc3QuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMTNfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF8xOF8xMTNfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBEQVRFRk9STTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgREFURUZPUk0uZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gREFURUZPUk07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIERBVEVGT1JNLmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMTE0X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8xMTRfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBDSE9JQ0U7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIENIT0lDRS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBDSE9JQ0U7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIENIT0lDRS5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzExNV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0XzE4XzExNV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IE5VTUJFUkZPUk07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIE5VTUJFUkZPUk0KLQkJCQkJLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IE5VTUJFUkZPUk07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIE5VTUJFUkZPUk0KKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMTE2X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8xMTZfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBNRVNTQUdFOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBNRVNTQUdFLnRvUGF0dGVybigpLmVxdWFscygKLQkJCQkJKChqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCkgb2JqTG9hZGVkKS50b1BhdHRlcm4oKSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gTUVTU0FHRTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTUVTU0FHRS50b1BhdHRlcm4oKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICgoamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQpIG9iakxvYWRlZCkudG9QYXR0ZXJuKCkpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMTE3X3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8xMTdfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBQRVJNOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBQRVJNLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IFBFUk07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIFBFUk0uZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMThfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzExOF93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IFBFUk1DT0w7Ci0JCQlFbnVtZXJhdGlvbiBlbGVtZW50c0JlZm9yZSA9IFBFUk1DT0wuZWxlbWVudHMoKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlFbnVtZXJhdGlvbiBlbGVtZW50c0FmdGVyID0gKChQZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqTG9hZGVkKQotCQkJCQkuZWxlbWVudHMoKTsKLQkJCWJvb2xlYW4gZXF1YWxzID0gdHJ1ZTsKLQkJCXdoaWxlIChlbGVtZW50c0JlZm9yZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCS8vIFRvIG1ha2Ugc3VyZSBlbGVtZW50cyBhcmUgdGhlIHNhbWUKLQkJCQlPYmplY3Qgb0JlZm9yZSA9IGVsZW1lbnRzQmVmb3JlLm5leHRFbGVtZW50KCk7Ci0JCQkJT2JqZWN0IG9BZnRlciA9IGVsZW1lbnRzQWZ0ZXIubmV4dEVsZW1lbnQoKTsKLQkJCQllcXVhbHMgJj0gb0JlZm9yZS5lcXVhbHMob0FmdGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IFBFUk1DT0w7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbGVtZW50c0JlZm9yZSA9IFBFUk1DT0wuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbGVtZW50c0FmdGVyID0gKChQZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlIChlbGVtZW50c0JlZm9yZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIC8vIFRvIG1ha2Ugc3VyZSBlbGVtZW50cyBhcmUgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICBPYmplY3Qgb0JlZm9yZSA9IGVsZW1lbnRzQmVmb3JlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9BZnRlciA9IGVsZW1lbnRzQWZ0ZXIubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBlcXVhbHMgJj0gb0JlZm9yZS5lcXVhbHMob0FmdGVyKTsKIAotCQkJfQotCQkJLy8gVG8gbWFrZSBzdXJlIHNpemVzIGFyZSB0aGUgc2FtZQotCQkJZXF1YWxzICY9IGVsZW1lbnRzQmVmb3JlLmhhc01vcmVFbGVtZW50cygpID09IGVsZW1lbnRzQWZ0ZXIKLQkJCQkJLmhhc01vcmVFbGVtZW50cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVG8gbWFrZSBzdXJlIHNpemVzIGFyZSB0aGUgc2FtZQorICAgICAgICAgICAgZXF1YWxzICY9IGVsZW1lbnRzQmVmb3JlLmhhc01vcmVFbGVtZW50cygpID09IGVsZW1lbnRzQWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgLmhhc01vcmVFbGVtZW50cygpOwogCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMTlfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzExOV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IExvY2FsZS5DSElORVNFOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBMb2NhbGUuQ0hJTkVTRQotCQkJCQkuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gTG9jYWxlLkNISU5FU0U7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIExvY2FsZS5DSElORVNFCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob2JqTG9hZGVkKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyMF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTIwX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gTElOS0VETElTVDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTElOS0VETElTVAotCQkJCQkuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gTElOS0VETElTVDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTElOS0VETElTVAorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMjFfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyMV93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLklOUFVUX01FVEhPRF9TRUdNRU5UOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoCi0JCQkJCU1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUuSU5QVVRfTUVUSE9EX1NFR01FTlQgPT0gb2JqTG9hZGVkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLklOUFVUX01FVEhPRF9TRUdNRU5UOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUuSU5QVVRfTUVUSE9EX1NFR01FTlQgPT0gb2JqTG9hZGVkKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RfMThfMTIyX3dyaXRlT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF8xOF8xMjJfd3JpdGVPYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQ7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZS5MQU5HVUFHRTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKAotCQkJCQlNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCi0JCQkJCWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLkxBTkdVQUdFID09IG9iakxvYWRlZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZS5MQU5HVUFHRTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICBNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLkxBTkdVQUdFID09IG9iakxvYWRlZCk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyM193cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTIzX3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUuUkVBRElORzsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKAotCQkJCQlNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCi0JCQkJCWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLlJFQURJTkcgPT0gb2JqTG9hZGVkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLlJFQURJTkc7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAorICAgICAgICAgICAgICAgICAgICBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZS5SRUFESU5HID09IG9iakxvYWRlZCk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyNF93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTI0X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IE9iamVjdFtdIHsgSW50ZWdlci5jbGFzcywgbmV3IEludGVnZXIoMSkgfTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gQ2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIHVuaXF1ZSwgc28gdGVzdCBmb3IgPT0KLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkoKE9iamVjdFtdKSBvYmpMb2FkZWQpWzBdID09ICgoT2JqZWN0W10pIG9ialRvU2F2ZSlbMF0KLQkJCQkJCQkmJiAoKE9iamVjdFtdKSBvYmpMb2FkZWQpWzFdCi0JCQkJCQkJCQkuZXF1YWxzKCgoT2JqZWN0W10pIG9ialRvU2F2ZSlbMV0pKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBPYmplY3RbXSB7IEludGVnZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKDEpIH07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIENsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSB1bmlxdWUsIHNvIHRlc3QgZm9yID09CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgKChPYmplY3RbXSkgb2JqTG9hZGVkKVswXSA9PSAoKE9iamVjdFtdKSBvYmpUb1NhdmUpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChPYmplY3RbXSkgb2JqTG9hZGVkKVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygoKE9iamVjdFtdKSBvYmpUb1NhdmUpWzFdKSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyNV93cml0ZU9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfMThfMTI1X3dyaXRlT2JqZWN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IEJpZ0ludGVnZXJbXSB7IEJpZ0ludGVnZXIuWkVSTywgQmlnSW50ZWdlci5PTkUsCi0JCQkJCUJpZ0ludGVnZXIudmFsdWVPZigtMSksIEJpZ0ludGVnZXIudmFsdWVPZigyNTUpLAotCQkJCQlCaWdJbnRlZ2VyLnZhbHVlT2YoLTI1NSksCi0JCQkJCW5ldyBCaWdJbnRlZ2VyKCI3NTg4MTY0NDg0MzMwNzg1MDc5MzQ2NjA3MCIpLAotCQkJCQluZXcgQmlnSW50ZWdlcigiLTYzNjEwNDQ4NzE0MjczMjUyNzMyNjIwMjQ2MiIpIH07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBcnJheXMuZXF1YWxzKAotCQkJCQkoQmlnSW50ZWdlcltdKSBvYmpMb2FkZWQsIChCaWdJbnRlZ2VyW10pIG9ialRvU2F2ZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IEJpZ0ludGVnZXJbXSB7IEJpZ0ludGVnZXIuWkVSTywgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigtMSksIEJpZ0ludGVnZXIudmFsdWVPZigyNTUpLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTI1NSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCI3NTg4MTY0NDg0MzMwNzg1MDc5MzQ2NjA3MCIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiLTYzNjEwNDQ4NzE0MjczMjUyNzMyNjIwMjQ2MiIpIH07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBBcnJheXMuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAoQmlnSW50ZWdlcltdKSBvYmpMb2FkZWQsIChCaWdJbnRlZ2VyW10pIG9ialRvU2F2ZSkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMjZfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyNl93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IG5ldyBXcml0ZUZpZWxkc1VzaW5nUHV0RmllbGRXcml0ZSgpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKLQkJCQkJKChXcml0ZUZpZWxkc1VzaW5nUHV0RmllbGRXcml0ZSkgb2JqTG9hZGVkKS5wYXNzZWQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgV3JpdGVGaWVsZHNVc2luZ1B1dEZpZWxkV3JpdGUoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgICgoV3JpdGVGaWVsZHNVc2luZ1B1dEZpZWxkV3JpdGUpIG9iakxvYWRlZCkucGFzc2VkKCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMjdfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyN193cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCUJpdFNldCBicyA9IG5ldyBCaXRTZXQoNjQpOwotCQkJYnMuc2V0KDEpOwotCQkJYnMuc2V0KDEwKTsKLQkJCWJzLnNldCgxMDApOwotCQkJYnMuc2V0KDEwMDApOwotCQkJb2JqVG9TYXZlID0gYnM7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBicy5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCaXRTZXQgYnMgPSBuZXcgQml0U2V0KDY0KTsKKyAgICAgICAgICAgIGJzLnNldCgxKTsKKyAgICAgICAgICAgIGJzLnNldCgxMCk7CisgICAgICAgICAgICBicy5zZXQoMTAwKTsKKyAgICAgICAgICAgIGJzLnNldCgxMDAwKTsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGJzOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgYnMuZXF1YWxzKG9iakxvYWRlZCkpOwogCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF8xOF8xMjhfd3JpdGVPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0XzE4XzEyOF93cml0ZU9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCVByb3BlcnR5UGVybWlzc2lvbiB0ZXN0ID0gbmV3IFByb3BlcnR5UGVybWlzc2lvbigiamF2YS4qIiwKLQkJCQkJInJlYWQsd3JpdGUiKTsKLQkJCVBlcm1pc3Npb25Db2xsZWN0aW9uIHAgPSB0ZXN0Lm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0JCQlwLmFkZChuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLioiLCAicmVhZCIpKTsKLQkJCXAuYWRkKG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oImphdmEuKiIsICJ3cml0ZSIpKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9lcyBpbXBsaWVzIHdvcms/ICIgKyBwLmltcGxpZXModGVzdCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJvcGVydHlQZXJtaXNzaW9uIHRlc3QgPSBuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLioiLAorICAgICAgICAgICAgICAgICAgICAicmVhZCx3cml0ZSIpOworICAgICAgICAgICAgUGVybWlzc2lvbkNvbGxlY3Rpb24gcCA9IHRlc3QubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgIHAuYWRkKG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oImphdmEuKiIsICJyZWFkIikpOworICAgICAgICAgICAgcC5hZGQobmV3IFByb3BlcnR5UGVybWlzc2lvbigiamF2YS4qIiwgIndyaXRlIikpOworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb2VzIGltcGxpZXMgd29yaz8gIiArIHAuaW1wbGllcyh0ZXN0KSk7CiAKLQkJCW9ialRvU2F2ZSA9IHA7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLAotCQkJCQkoKFBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpMb2FkZWQpLmltcGxpZXModGVzdCkpOworICAgICAgICAgICAgb2JqVG9TYXZlID0gcDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgICgoUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9iakxvYWRlZCkuaW1wbGllcyh0ZXN0KSk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VyaWFsaXphdGlvblN0cmVzc1Rlc3Q0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VyaWFsaXphdGlvblN0cmVzc1Rlc3Q0LmphdmEKaW5kZXggODNhM2E4Yy4uZGUxM2VlMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0NC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TZXJpYWxpemF0aW9uU3RyZXNzVGVzdDQuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDgsMjY2NyArNTMsMzI4OSBAQAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Db25maWd1cmF0aW9uOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Qcm94eV9JMTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLmlvLlNlcmlhbGl6YWJsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3Q0IGV4dGVuZHMgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QgewotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3VhcmRJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuR3VhcmQsCi0JCQlqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBHdWFyZEltcGxlbWVudGF0aW9uKCkgewotCQl9CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHdWFyZEltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5HdWFyZCwKKyAgICAgICAgICAgIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIEd1YXJkSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBjaGVja0d1YXJkKE9iamVjdCBvKSB7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrR3VhcmQoT2JqZWN0IG8pIHsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQorICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9FdmVudE9iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkV2ZW50T2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9FdmVudE9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkV2ZW50T2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS51dGlsLkV2ZW50T2JqZWN0KCJTb3VyY2UiKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEudXRpbC5FdmVudE9iamVjdCgiU291cmNlIik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCWVxdWFscyA9IHRydWU7IAotCQkJLy8gVGhlIHRoZSBvbmx5IGRhdGEgaW4gRXZlbnRPYmplY3QgdGhhdAotCQkJLy8gZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBpbnN0YW50aWF0aW9ucyBpcyB0cmFuc2llbnQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgZXF1YWxzID0gdHJ1ZTsgCisgICAgICAgICAgICAvLyBUaGUgdGhlIG9ubHkgZGF0YSBpbiBFdmVudE9iamVjdCB0aGF0CisgICAgICAgICAgICAvLyBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGluc3RhbnRpYXRpb25zIGlzIHRyYW5zaWVudAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfUGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBudWxsOwotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7Ci0JCQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKIAotCQkJCXB1YmxpYyB2b2lkIGFkZChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gcDEpIHsKLQkJCQkJYWRkZWQgPSB0cnVlOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGQoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHAxKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQkJCQlyZXR1cm4gKG5ldyBqYXZhLnV0aWwuVmVjdG9yKCkpLmVsZW1lbnRzKCk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IGphdmEudXRpbC5WZWN0b3IoKSkuZWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBwMSkgewotCQkJCQlyZXR1cm4gYWRkZWQ7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJcmV0dXJuIGltcGxpZXMobnVsbCkgPT0gKChQZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqKQotCQkJCQkJCS5pbXBsaWVzKG51bGwpOwotCQkJCX0KLQkJCX07CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbXBsaWVzKG51bGwpID09ICgoUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW1wbGllcyhudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OwogCi0JCQkoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkuYWRkKG51bGwpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkuYWRkKG51bGwpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2xsZWN0aW9uc19FbXB0eVNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLkVtcHR5U2V0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2xsZWN0aW9uc19FbXB0eVNldCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLkVtcHR5U2V0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuRU1QVFlfU0VUOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCk7Ci0JCQlpZiAoZXF1YWxzKQotCQkJCWVxdWFscyA9ICgoU2V0KSBvYmpMb2FkZWQpLnNpemUoKSA9PSAwOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIGVxdWFscyA9IG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKTsKKyAgICAgICAgICAgIGlmIChlcXVhbHMpCisgICAgICAgICAgICAgICAgZXF1YWxzID0gKChTZXQpIG9iakxvYWRlZCkuc2l6ZSgpID09IDA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2xsZWN0aW9uc19FbXB0eU1hcCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLkVtcHR5U2V0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2xsZWN0aW9uc19FbXB0eU1hcCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLkVtcHR5U2V0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCk7Ci0JCQlpZiAoZXF1YWxzKQotCQkJCWVxdWFscyA9ICgoTWFwKSBvYmpMb2FkZWQpLnNpemUoKSA9PSAwOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIGVxdWFscyA9IG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKTsKKyAgICAgICAgICAgIGlmIChlcXVhbHMpCisgICAgICAgICAgICAgICAgZXF1YWxzID0gKChNYXApIG9iakxvYWRlZCkuc2l6ZSgpID09IDA7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9CYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbkNvbGxlY3Rpb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0Jhc2ljUGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uQ29sbGVjdGlvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gKG5ldyBSdW50aW1lUGVybWlzc2lvbigidGVzdCIpKQotCQkJCQkubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQkJCSgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQotCQkJCQkuYWRkKG5ldyBSdW50aW1lUGVybWlzc2lvbigidGVzdCIpKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gKG5ldyBSdW50aW1lUGVybWlzc2lvbigidGVzdCIpKQorICAgICAgICAgICAgICAgICAgICAubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQorICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBSdW50aW1lUGVybWlzc2lvbigidGVzdCIpKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWJvb2xlYW4gZXF1YWxzOwotCQkJRW51bWVyYXRpb24gZW51bTEgPSAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKLQkJCQkJLmVsZW1lbnRzKCksIGVudW0yID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCi0JCQkJCS5lbGVtZW50cygpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0xID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCisgICAgICAgICAgICAgICAgICAgIC5lbGVtZW50cygpLCBlbnVtMiA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudHMoKTsKIAotCQkJZXF1YWxzID0gdHJ1ZTsKLQkJCXdoaWxlIChlbnVtMS5oYXNNb3JlRWxlbWVudHMoKSAmJiBlcXVhbHMpIHsKLQkJCQlpZiAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJCWVxdWFscyA9IGVudW0xLm5leHRFbGVtZW50KCkuZXF1YWxzKGVudW0yLm5leHRFbGVtZW50KCkpOwotCQkJCWVsc2UKLQkJCQkJZXF1YWxzID0gZmFsc2U7Ci0JCQl9CisgICAgICAgICAgICBlcXVhbHMgPSB0cnVlOworICAgICAgICAgICAgd2hpbGUgKGVudW0xLmhhc01vcmVFbGVtZW50cygpICYmIGVxdWFscykgeworICAgICAgICAgICAgICAgIGlmIChlbnVtMi5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gZW51bTEubmV4dEVsZW1lbnQoKS5lcXVhbHMoZW51bTIubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKGVxdWFscykKLQkJCQllcXVhbHMgPSAhZW51bTIuaGFzTW9yZUVsZW1lbnRzKCk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICBpZiAoZXF1YWxzKQorICAgICAgICAgICAgICAgIGVxdWFscyA9ICFlbnVtMi5oYXNNb3JlRWxlbWVudHMoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1VucmVzb2x2ZWRQZXJtaXNzaW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LlVucmVzb2x2ZWRQZXJtaXNzaW9uKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9VbnJlc29sdmVkUGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5VbnJlc29sdmVkUGVybWlzc2lvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuVW5yZXNvbHZlZFBlcm1pc3Npb24oInR5cGUiLCAibmFtZSIsCi0JCQkJCSJhY3Rpb25zIiwgbnVsbCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLnNlY3VyaXR5LlVucmVzb2x2ZWRQZXJtaXNzaW9uKCJ0eXBlIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyIsIG51bGwpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSBvYmpUb1NhdmUudG9TdHJpbmcoKS5lcXVhbHMob2JqTG9hZGVkLnRvU3RyaW5nKCkpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIGVxdWFscyA9IG9ialRvU2F2ZS50b1N0cmluZygpLmVxdWFscyhvYmpMb2FkZWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9DaGFyYWN0ZXIoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5DaGFyYWN0ZXIpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NoYXJhY3RlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLkNoYXJhY3RlcikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5DaGFyYWN0ZXIoJ2MnKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5DaGFyYWN0ZXIoJ2MnKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQ29sbGVjdGlvbnNfVW5tb2RpZmlhYmxlQ29sbGVjdGlvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLlVubW9kaWZpYWJsZUNvbGxlY3Rpb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1VubW9kaWZpYWJsZUNvbGxlY3Rpb24oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5Db2xsZWN0aW9ucy5Vbm1vZGlmaWFibGVDb2xsZWN0aW9uKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihTRVQpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihTRVQpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpUb1NhdmUpLnNpemUoKSA9PSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCi0JCQkJCS5zaXplKCk7Ci0JCQlpZiAoZXF1YWxzKSB7Ci0JCQkJamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXIxID0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqVG9TYXZlKQotCQkJCQkJLml0ZXJhdG9yKCksIGl0ZXIyID0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqTG9hZGVkKQotCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIxLmhhc05leHQoKSkKLQkJCQkJZXF1YWxzID0gZXF1YWxzICYmIGl0ZXIxLm5leHQoKS5lcXVhbHMoaXRlcjIubmV4dCgpKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYm9vbGVhbiBlcXVhbHM7CisgICAgICAgICAgICBlcXVhbHMgPSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpUb1NhdmUpLnNpemUoKSA9PSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCisgICAgICAgICAgICAgICAgICAgIC5zaXplKCk7CisgICAgICAgICAgICBpZiAoZXF1YWxzKSB7CisgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXIxID0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqVG9TYXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCksIGl0ZXIyID0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIxLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gZXF1YWxzICYmIGl0ZXIxLm5leHQoKS5lcXVhbHMoaXRlcjIubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0Zvcm1hdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS50ZXh0LkZvcm1hdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfRm9ybWF0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuRm9ybWF0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBudWxsOwotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEudGV4dC5Gb3JtYXQoKSB7Ci0JCQkJU3RyaW5nIHNhdmUgPSAiZGVmYXVsdCI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEudGV4dC5Gb3JtYXQoKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNhdmUgPSAiZGVmYXVsdCI7CiAKLQkJCQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChPYmplY3QgcDEsIFN0cmluZ0J1ZmZlciBwMiwKLQkJCQkJCWphdmEudGV4dC5GaWVsZFBvc2l0aW9uIHAzKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0KE9iamVjdCBwMSwgU3RyaW5nQnVmZmVyIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24gcDMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgT2JqZWN0IHBhcnNlT2JqZWN0KFN0cmluZyBwMSwgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24gcDIpIHsKLQkJCQkJaWYgKHAxICE9IG51bGwpCi0JCQkJCQlzYXZlID0gcDE7Ci0JCQkJCXJldHVybiBzYXZlOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHBhcnNlT2JqZWN0KFN0cmluZyBwMSwgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24gcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAxICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlID0gcDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIGphdmEudGV4dC5Gb3JtYXQpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlyZXR1cm4gc2F2ZS5lcXVhbHMoKChqYXZhLnRleHQuRm9ybWF0KSBvYmopLnBhcnNlT2JqZWN0KAotCQkJCQkJCW51bGwsIG51bGwpKTsKLQkJCQl9Ci0JCQl9OworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIGphdmEudGV4dC5Gb3JtYXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2F2ZS5lcXVhbHMoKChqYXZhLnRleHQuRm9ybWF0KSBvYmopLnBhcnNlT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OwogCi0JCQkoKGphdmEudGV4dC5Gb3JtYXQpIG9ialRvU2F2ZSkucGFyc2VPYmplY3QoIlRlc3QiLCBudWxsKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgKChqYXZhLnRleHQuRm9ybWF0KSBvYmpUb1NhdmUpLnBhcnNlT2JqZWN0KCJUZXN0IiwgbnVsbCk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9CaWdEZWNpbWFsKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLm1hdGguQmlnRGVjaW1hbCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQmlnRGVjaW1hbCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5tYXRoLkJpZ0RlY2ltYWwpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLm1hdGguQmlnRGVjaW1hbCgiMS4yMzQ1Iik7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLm1hdGguQmlnRGVjaW1hbCgiMS4yMzQ1Iik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1VucmVzb2x2ZWRQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5VbnJlc29sdmVkUGVybWlzc2lvbkNvbGxlY3Rpb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1VucmVzb2x2ZWRQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5VbnJlc29sdmVkUGVybWlzc2lvbkNvbGxlY3Rpb24pCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IChuZXcgamF2YS5zZWN1cml0eS5VbnJlc29sdmVkUGVybWlzc2lvbigidHlwZSIsICJuYW1lIiwKLQkJCQkJImFjdGlvbnMiLCBudWxsKSkubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQkJCSgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQotCQkJCQkuYWRkKG5ldyBqYXZhLnNlY3VyaXR5LlVucmVzb2x2ZWRQZXJtaXNzaW9uKCJ0eXBlIiwgIm5hbWUiLAotCQkJCQkJCSJhY3Rpb25zIiwgbnVsbCkpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSAobmV3IGphdmEuc2VjdXJpdHkuVW5yZXNvbHZlZFBlcm1pc3Npb24oInR5cGUiLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIiwgbnVsbCkpLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7CisgICAgICAgICAgICAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgamF2YS5zZWN1cml0eS5VbnJlc29sdmVkUGVybWlzc2lvbigidHlwZSIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyIsIG51bGwpKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWJvb2xlYW4gZXF1YWxzOwotCQkJRW51bWVyYXRpb24gZW51bTEgPSAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKLQkJCQkJLmVsZW1lbnRzKCksIGVudW0yID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCi0JCQkJCS5lbGVtZW50cygpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0xID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCisgICAgICAgICAgICAgICAgICAgIC5lbGVtZW50cygpLCBlbnVtMiA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudHMoKTsKIAotCQkJZXF1YWxzID0gdHJ1ZTsKLQkJCXdoaWxlIChlbnVtMS5oYXNNb3JlRWxlbWVudHMoKSAmJiBlcXVhbHMpIHsKLQkJCQlpZiAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJCWVxdWFscyA9IGVudW0xLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKS5lcXVhbHMoCi0JCQkJCQkJZW51bTIubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKLQkJCQllbHNlCi0JCQkJCWVxdWFscyA9IGZhbHNlOwotCQkJfQorICAgICAgICAgICAgZXF1YWxzID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtMS5oYXNNb3JlRWxlbWVudHMoKSAmJiBlcXVhbHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IGVudW0xLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bTIubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IGZhbHNlOworICAgICAgICAgICAgfQogCi0JCQlpZiAoZXF1YWxzKQotCQkJCWVxdWFscyA9ICFlbnVtMi5oYXNNb3JlRWxlbWVudHMoKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIGlmIChlcXVhbHMpCisgICAgICAgICAgICAgICAgZXF1YWxzID0gIWVudW0yLmhhc01vcmVFbGVtZW50cygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfU2VjdXJlUmFuZG9tU3BpKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbVNwaSkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfU2VjdXJlUmFuZG9tU3BpKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbVNwaSkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbnVsbDsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbVNwaSgpIHsKLQkJCQlwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdlbmVyYXRlU2VlZChpbnQgcDEpIHsKLQkJCQkJcmV0dXJuIG5ldyBieXRlWzBdOwotCQkJCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb21TcGkoKSB7CisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZW5lcmF0ZVNlZWQoaW50IHAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwcm90ZWN0ZWQgdm9pZCBlbmdpbmVOZXh0Qnl0ZXMoYnl0ZVtdIHAxKSB7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZU5leHRCeXRlcyhieXRlW10gcDEpIHsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRTZWVkKGJ5dGVbXSBwMSkgewotCQkJCX0KKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRTZWVkKGJ5dGVbXSBwMSkgeworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfU2hvcnQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5TaG9ydCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfU2hvcnQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5TaG9ydCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5TaG9ydCgoc2hvcnQpIDEwNyk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLmxhbmcuU2hvcnQoKHNob3J0KSAxMDcpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9CeXRlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuQnl0ZSkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQnl0ZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLkJ5dGUpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLmxhbmcuQnl0ZSgoYnl0ZSkgMTA3KTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5CeXRlKChieXRlKSAxMDcpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9TdHJpbmdfQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLlN0cmluZy5DYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9TdHJpbmdfQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLlN0cmluZy5DYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLmxhbmcuU3RyaW5nLkNBU0VfSU5TRU5TSVRJVkVfT1JERVI7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGphdmEubGFuZy5TdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUjsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWJvb2xlYW4gZXF1YWxzOwotCQkJZXF1YWxzID0gKChDb21wYXJhdG9yKSBvYmpUb1NhdmUpLmNvbXBhcmUoImFwcGxlIiwgIkJhbmFuYSIpID09ICgoQ29tcGFyYXRvcikgb2JqTG9hZGVkKQotCQkJCQkuY29tcGFyZSgiYXBwbGUiLCAiQmFuYW5hIik7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgZXF1YWxzID0gKChDb21wYXJhdG9yKSBvYmpUb1NhdmUpLmNvbXBhcmUoImFwcGxlIiwgIkJhbmFuYSIpID09ICgoQ29tcGFyYXRvcikgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuY29tcGFyZSgiYXBwbGUiLCAiQmFuYW5hIik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9DYWxlbmRhcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNhbGVuZGFyKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3Rfd3JpdGVPYmplY3RfQ2FsZW5kYXIoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5DYWxlbmRhcikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEudXRpbC5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRVNUIiksCi0JCQkJCUxvY2FsZS5DQU5BREEpIHsKLQkJCQlwdWJsaWMgdm9pZCBhZGQoaW50IHAxLCBpbnQgcDIpIHsKLQkJCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS51dGlsLkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJFU1QiKSwKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxlLkNBTkFEQSkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgcDEsIGludCBwMikgeworICAgICAgICAgICAgICAgIH0KIAotCQkJCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVGaWVsZHMoKSB7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVGaWVsZHMoKSB7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVRpbWUoKSB7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVUaW1lKCkgeworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBpbnQgZ2V0R3JlYXRlc3RNaW5pbXVtKGludCBwMSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRHcmVhdGVzdE1pbmltdW0oaW50IHAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBpbnQgZ2V0TGVhc3RNYXhpbXVtKGludCBwMSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRMZWFzdE1heGltdW0oaW50IHAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBpbnQgZ2V0TWF4aW11bShpbnQgcDEpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bShpbnQgcDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcHVibGljIGludCBnZXRNaW5pbXVtKGludCBwMSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRNaW5pbXVtKGludCBwMSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgdm9pZCByb2xsKGludCBwMSwgYm9vbGVhbiBwMikgewotCQkJCX0KLQkJCX07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByb2xsKGludCBwMSwgYm9vbGVhbiBwMikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArICJDYWxlbmRhciIsIG9ialRvU2F2ZQotCQkJCQkuZXF1YWxzKG9iakxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyAiQ2FsZW5kYXIiLCBvYmpUb1NhdmUKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9SZWZsZWN0UGVybWlzc2lvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1JlZmxlY3RQZXJtaXNzaW9uKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uKAotCQkJCQkiVGVzdFNlcmlhbGl6YXRpb24iLCAidGVzdCIpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgICJUZXN0U2VyaWFsaXphdGlvbiIsICJ0ZXN0Iik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1N0cmluZ0J1ZmZlcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfU3RyaW5nQnVmZmVyKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigiVGhpcyBpcyBhIHRlc3QuIik7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCJUaGlzIGlzIGEgdGVzdC4iKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWJvb2xlYW4gZXF1YWxzOwotCQkJZXF1YWxzID0gKChqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKSBvYmpUb1NhdmUpLnRvU3RyaW5nKCkuZXF1YWxzKAotCQkJCQkoKGphdmEubGFuZy5TdHJpbmdCdWZmZXIpIG9iakxvYWRlZCkudG9TdHJpbmcoKSk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgZXF1YWxzID0gKChqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKSBvYmpUb1NhdmUpLnRvU3RyaW5nKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAoKGphdmEubGFuZy5TdHJpbmdCdWZmZXIpIG9iakxvYWRlZCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9GaWxlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmlvLkZpbGUpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0ZpbGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuaW8uRmlsZSkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IEZpbGUoImFmaWxlLnR4dCIpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgRmlsZSgiYWZpbGUudHh0Iik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0FsbFBlcm1pc3Npb25Db2xsZWN0aW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb25Db2xsZWN0aW9uKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9BbGxQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uQ29sbGVjdGlvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gKG5ldyBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24oKSkKLQkJCQkJLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0JCQkoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKLQkJCQkJLmFkZChuZXcgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKCkpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSAobmV3IGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbigpKQorICAgICAgICAgICAgICAgICAgICAubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQorICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24oKSk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCUVudW1lcmF0aW9uIGVudW0xID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCi0JCQkJCS5lbGVtZW50cygpLCBlbnVtMiA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqTG9hZGVkKQotCQkJCQkuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYm9vbGVhbiBlcXVhbHM7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtMSA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudHMoKSwgZW51bTIgPSAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9iakxvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgLmVsZW1lbnRzKCk7CiAKLQkJCWVxdWFscyA9IHRydWU7Ci0JCQl3aGlsZSAoZW51bTEuaGFzTW9yZUVsZW1lbnRzKCkgJiYgZXF1YWxzKSB7Ci0JCQkJaWYgKGVudW0yLmhhc01vcmVFbGVtZW50cygpKQotCQkJCQllcXVhbHMgPSBlbnVtMS5uZXh0RWxlbWVudCgpLmVxdWFscyhlbnVtMi5uZXh0RWxlbWVudCgpKTsKLQkJCQllbHNlCi0JCQkJCWVxdWFscyA9IGZhbHNlOwotCQkJfQorICAgICAgICAgICAgZXF1YWxzID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtMS5oYXNNb3JlRWxlbWVudHMoKSAmJiBlcXVhbHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IGVudW0xLm5leHRFbGVtZW50KCkuZXF1YWxzKGVudW0yLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gZmFsc2U7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChlcXVhbHMpCi0JCQkJZXF1YWxzID0gIWVudW0yLmhhc01vcmVFbGVtZW50cygpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgaWYgKGVxdWFscykKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSAhZW51bTIuaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9CaXRTZXQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5CaXRTZXQpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0JpdFNldCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkJpdFNldCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEudXRpbC5CaXRTZXQoKTsKLQkJCSgoamF2YS51dGlsLkJpdFNldCkgb2JqVG9TYXZlKS5zZXQoMyk7Ci0JCQkoKGphdmEudXRpbC5CaXRTZXQpIG9ialRvU2F2ZSkuc2V0KDUpOwotCQkJKChqYXZhLnV0aWwuQml0U2V0KSBvYmpUb1NhdmUpLnNldCg2MSwgODkpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS51dGlsLkJpdFNldCgpOworICAgICAgICAgICAgKChqYXZhLnV0aWwuQml0U2V0KSBvYmpUb1NhdmUpLnNldCgzKTsKKyAgICAgICAgICAgICgoamF2YS51dGlsLkJpdFNldCkgb2JqVG9TYXZlKS5zZXQoNSk7CisgICAgICAgICAgICAoKGphdmEudXRpbC5CaXRTZXQpIG9ialRvU2F2ZSkuc2V0KDYxLCA4OSk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0RhdGVGb3JtYXQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5EYXRlRm9ybWF0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9EYXRlRm9ybWF0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuRGF0ZUZvcm1hdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbnVsbDsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLnRleHQuRGF0ZUZvcm1hdCgpIHsKLQkJCQkvLyBUaHUgRmViIDAxIDAxOjAxOjAxIEVTVCAyMDAxCi0JCQkJamF2YS51dGlsLkRhdGUgc2F2ZSA9IG5ldyBqYXZhLnV0aWwuRGF0ZSg5ODEwMDcyNjEwMDBMKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS50ZXh0LkRhdGVGb3JtYXQoKSB7CisgICAgICAgICAgICAgICAgLy8gVGh1IEZlYiAwMSAwMTowMTowMSBFU1QgMjAwMQorICAgICAgICAgICAgICAgIGphdmEudXRpbC5EYXRlIHNhdmUgPSBuZXcgamF2YS51dGlsLkRhdGUoOTgxMDA3MjYxMDAwTCk7CiAKLQkJCQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChEYXRlIHAxLCBTdHJpbmdCdWZmZXIgcDIsCi0JCQkJCQlqYXZhLnRleHQuRmllbGRQb3NpdGlvbiBwMykgewotCQkJCQlpZiAocDEgIT0gbnVsbCkKLQkJCQkJCXNhdmUgPSBwMTsKLQkJCQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoTG9uZy50b1N0cmluZyhzYXZlLmdldFRpbWUoKSkpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChEYXRlIHAxLCBTdHJpbmdCdWZmZXIgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnRleHQuRmllbGRQb3NpdGlvbiBwMykgeworICAgICAgICAgICAgICAgICAgICBpZiAocDEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmUgPSBwMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoTG9uZy50b1N0cmluZyhzYXZlLmdldFRpbWUoKSkpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBEYXRlIHBhcnNlKFN0cmluZyBwMSwgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24gcDIpIHsKLQkJCQkJcmV0dXJuIHNhdmU7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBEYXRlIHBhcnNlKFN0cmluZyBwMSwgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24gcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmU7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuIHNhdmUudG9TdHJpbmcoKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBqYXZhLnRleHQuRGF0ZUZvcm1hdCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCXJldHVybiBzYXZlLmVxdWFscygoKGphdmEudGV4dC5EYXRlRm9ybWF0KSBvYmopLnBhcnNlKG51bGwsCi0JCQkJCQkJbnVsbCkpOwotCQkJCX0KLQkJCX07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBqYXZhLnRleHQuRGF0ZUZvcm1hdCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlLmVxdWFscygoKGphdmEudGV4dC5EYXRlRm9ybWF0KSBvYmopLnBhcnNlKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX0NvcGllc0xpc3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5Db2xsZWN0aW9ucy5Db3BpZXNMaXN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2xsZWN0aW9uc19Db3BpZXNMaXN0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuQ29waWVzTGlzdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLm5Db3BpZXMoMiwgbmV3IEludGVnZXIoMikpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMubkNvcGllcygyLCBuZXcgSW50ZWdlcigyKSk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCWVxdWFscyA9ICgoTGlzdCkgb2JqVG9TYXZlKS5nZXQoMCkKLQkJCQkJLmVxdWFscygoKExpc3QpIG9iakxvYWRlZCkuZ2V0KDApKTsKLQkJCWlmIChlcXVhbHMpCi0JCQkJZXF1YWxzID0gKChMaXN0KSBvYmpUb1NhdmUpLmdldCgxKS5lcXVhbHMoCi0JCQkJCQkoKExpc3QpIG9iakxvYWRlZCkuZ2V0KDEpKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYm9vbGVhbiBlcXVhbHM7CisgICAgICAgICAgICBlcXVhbHMgPSAoKExpc3QpIG9ialRvU2F2ZSkuZ2V0KDApCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoKChMaXN0KSBvYmpMb2FkZWQpLmdldCgwKSk7CisgICAgICAgICAgICBpZiAoZXF1YWxzKQorICAgICAgICAgICAgICAgIGVxdWFscyA9ICgoTGlzdCkgb2JqVG9TYXZlKS5nZXQoMSkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgKChMaXN0KSBvYmpMb2FkZWQpLmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9TZXJpYWxpemFibGVQZXJtaXNzaW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmlvLlNlcmlhbGl6YWJsZVBlcm1pc3Npb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1NlcmlhbGl6YWJsZVBlcm1pc3Npb24oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbigiVGVzdFNlcmlhbGl6YXRpb24iLAotCQkJCQkiVGVzdCIpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS5pby5TZXJpYWxpemFibGVQZXJtaXNzaW9uKCJUZXN0U2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJUZXN0Iik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1Byb3BlcnRpZXMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5Qcm9wZXJ0aWVzKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Qcm9wZXJ0aWVzKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuUHJvcGVydGllcykKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCQkoKGphdmEudXRpbC5Qcm9wZXJ0aWVzKSBvYmpUb1NhdmUpLnB1dCgia2V5MSIsICJ2YWx1ZTEiKTsKLQkJCSgoamF2YS51dGlsLlByb3BlcnRpZXMpIG9ialRvU2F2ZSkucHV0KCJrZXkyIiwgInZhbHVlMiIpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICgoamF2YS51dGlsLlByb3BlcnRpZXMpIG9ialRvU2F2ZSkucHV0KCJrZXkxIiwgInZhbHVlMSIpOworICAgICAgICAgICAgKChqYXZhLnV0aWwuUHJvcGVydGllcykgb2JqVG9TYXZlKS5wdXQoImtleTIiLCAidmFsdWUyIik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCUVudW1lcmF0aW9uIGVudW0xID0gKChqYXZhLnV0aWwuUHJvcGVydGllcykgb2JqVG9TYXZlKS5lbGVtZW50cygpLCBlbnVtMiA9ICgoamF2YS51dGlsLlByb3BlcnRpZXMpIG9iakxvYWRlZCkKLQkJCQkJLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bTEgPSAoKGphdmEudXRpbC5Qcm9wZXJ0aWVzKSBvYmpUb1NhdmUpLmVsZW1lbnRzKCksIGVudW0yID0gKChqYXZhLnV0aWwuUHJvcGVydGllcykgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudHMoKTsKIAotCQkJZXF1YWxzID0gdHJ1ZTsKLQkJCXdoaWxlIChlbnVtMS5oYXNNb3JlRWxlbWVudHMoKSAmJiBlcXVhbHMpIHsKLQkJCQlpZiAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJCWVxdWFscyA9IGVudW0xLm5leHRFbGVtZW50KCkuZXF1YWxzKGVudW0yLm5leHRFbGVtZW50KCkpOwotCQkJCWVsc2UKLQkJCQkJZXF1YWxzID0gZmFsc2U7Ci0JCQl9CisgICAgICAgICAgICBlcXVhbHMgPSB0cnVlOworICAgICAgICAgICAgd2hpbGUgKGVudW0xLmhhc01vcmVFbGVtZW50cygpICYmIGVxdWFscykgeworICAgICAgICAgICAgICAgIGlmIChlbnVtMi5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gZW51bTEubmV4dEVsZW1lbnQoKS5lcXVhbHMoZW51bTIubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKGVxdWFscykKLQkJCQllcXVhbHMgPSAhZW51bTIuaGFzTW9yZUVsZW1lbnRzKCk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICBpZiAoZXF1YWxzKQorICAgICAgICAgICAgICAgIGVxdWFscyA9ICFlbnVtMi5oYXNNb3JlRWxlbWVudHMoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvLyBUT0RPIDogcmVxdWlyZXMgd29ya2luZyBzZWN1cml0eSBpbXBsZW1lbnRhdGlvbgotCS8vIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQmFzaWNQZXJtaXNzaW9uKCkgewotCS8vIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JLy8gLy8KLQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdCh0ZXN0cy5qYXZhLnNlY3VyaXR5LlRlc3RfQmFzaWNQZXJtaXNzaW9uLkJhc2ljUGVybWlzc2lvblN1YmNsYXNzKQotCS8vCi0JLy8gT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JLy8gT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7Ci0JLy8KLQkvLyB0cnkgewotCS8vIG9ialRvU2F2ZSA9IG5ldwotCS8vIHRlc3RzLmphdmEuc2VjdXJpdHkuVGVzdF9CYXNpY1Blcm1pc3Npb24uQmFzaWNQZXJtaXNzaW9uU3ViY2xhc3MoCi0JLy8gIlRlc3RTZXJpYWxpemF0aW9uIik7Ci0JLy8gaWYgKERFQlVHKQotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JLy8gb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCS8vCi0JLy8gLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JLy8gYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCS8vIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkvLyArIGUuZ2V0TWVzc2FnZSgpKTsKLQkvLyB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkvLyBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCS8vIH0gY2F0Y2ggKEVycm9yIGVycikgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkvLyAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gdGhyb3cgZXJyOwotCS8vIH0KLQkvLwotCS8vIH0KKyAgICAvLyBUT0RPIDogcmVxdWlyZXMgd29ya2luZyBzZWN1cml0eSBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQmFzaWNQZXJtaXNzaW9uKCkgeworICAgIC8vIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgLy8gLy8KKyAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdCh0ZXN0cy5qYXZhLnNlY3VyaXR5LlRlc3RfQmFzaWNQZXJtaXNzaW9uLkJhc2ljUGVybWlzc2lvblN1YmNsYXNzKQorICAgIC8vCisgICAgLy8gT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgLy8gT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgLy8KKyAgICAvLyB0cnkgeworICAgIC8vIG9ialRvU2F2ZSA9IG5ldworICAgIC8vIHRlc3RzLmphdmEuc2VjdXJpdHkuVGVzdF9CYXNpY1Blcm1pc3Npb24uQmFzaWNQZXJtaXNzaW9uU3ViY2xhc3MoCisgICAgLy8gIlRlc3RTZXJpYWxpemF0aW9uIik7CisgICAgLy8gaWYgKERFQlVHKQorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgLy8gb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgIC8vCisgICAgLy8gLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgLy8gYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgIC8vIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAvLyArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAvLyB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAvLyBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIC8vIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAvLyAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgLy8gdGhyb3cgZXJyOworICAgIC8vIH0KKyAgICAvLworICAgIC8vIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQ29sbGVjdGlvbnNfVW5tb2RpZmlhYmxlTWFwX1VubW9kaWZpYWJsZUVudHJ5U2V0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlTWFwLlVubW9kaWZpYWJsZUVudHJ5U2V0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3Rfd3JpdGVPYmplY3RfQ29sbGVjdGlvbnNfVW5tb2RpZmlhYmxlTWFwX1VubW9kaWZpYWJsZUVudHJ5U2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlTWFwLlVubW9kaWZpYWJsZUVudHJ5U2V0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKE1BUCkuZW50cnlTZXQoKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChNQVApLmVudHJ5U2V0KCk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCWVxdWFscyA9ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkuc2l6ZSgpID09ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9iakxvYWRlZCkKLQkJCQkJLnNpemUoKTsKLQkJCWlmIChlcXVhbHMpIHsKLQkJCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcjEgPSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCi0JCQkJCQkuaXRlcmF0b3IoKSwgaXRlcjIgPSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCi0JCQkJCQkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcjEuaGFzTmV4dCgpKQotCQkJCQllcXVhbHMgPSBlcXVhbHMgJiYgaXRlcjEubmV4dCgpLmVxdWFscyhpdGVyMi5uZXh0KCkpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIGVxdWFscyA9ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkuc2l6ZSgpID09ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9iakxvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChlcXVhbHMpIHsKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcjEgPSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKSwgaXRlcjIgPSAoKGphdmEudXRpbC5Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcjEuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBlcXVhbHMgJiYgaXRlcjEubmV4dCgpLmVxdWFscyhpdGVyMi5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTnVtYmVyRm9ybWF0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuTnVtYmVyRm9ybWF0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9OdW1iZXJGb3JtYXQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5OdW1iZXJGb3JtYXQpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IG51bGw7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS50ZXh0Lk51bWJlckZvcm1hdCgpIHsKLQkJCQlsb25nIHNhdmUgPSAxMDc7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEudGV4dC5OdW1iZXJGb3JtYXQoKSB7CisgICAgICAgICAgICAgICAgbG9uZyBzYXZlID0gMTA3OwogCi0JCQkJcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoZG91YmxlIHAxLCBTdHJpbmdCdWZmZXIgcDIsCi0JCQkJCQlqYXZhLnRleHQuRmllbGRQb3NpdGlvbiBwMykgewotCQkJCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChkb3VibGUgcDEsIFN0cmluZ0J1ZmZlciBwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uIHAzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQobG9uZyBwMSwgU3RyaW5nQnVmZmVyIHAyLAotCQkJCQkJamF2YS50ZXh0LkZpZWxkUG9zaXRpb24gcDMpIHsKLQkJCQkJaWYgKHAxICE9IDApCi0JCQkJCQlzYXZlID0gcDE7Ci0JCQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKExvbmcudG9TdHJpbmcoc2F2ZSkpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChsb25nIHAxLCBTdHJpbmdCdWZmZXIgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnRleHQuRmllbGRQb3NpdGlvbiBwMykgeworICAgICAgICAgICAgICAgICAgICBpZiAocDEgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmUgPSBwMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoTG9uZy50b1N0cmluZyhzYXZlKSk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcHVibGljIE51bWJlciBwYXJzZShTdHJpbmcgcDEsIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uIHAyKSB7Ci0JCQkJCXJldHVybiBuZXcgTG9uZyhzYXZlKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIE51bWJlciBwYXJzZShTdHJpbmcgcDEsIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uIHAyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhzYXZlKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBqYXZhLnRleHQuTnVtYmVyRm9ybWF0KSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJcmV0dXJuIHNhdmUgPT0gKChMb25nKSAoKGphdmEudGV4dC5OdW1iZXJGb3JtYXQpIG9iaikKLQkJCQkJCQkucGFyc2UobnVsbCwgbnVsbCkpLmxvbmdWYWx1ZSgpOwotCQkJCX0KLQkJCX07CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgamF2YS50ZXh0Lk51bWJlckZvcm1hdCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlID09ICgoTG9uZykgKChqYXZhLnRleHQuTnVtYmVyRm9ybWF0KSBvYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlKG51bGwsIG51bGwpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OwogCi0JCQkoKGphdmEudGV4dC5OdW1iZXJGb3JtYXQpIG9ialRvU2F2ZSkuZm9ybWF0KDYzTCwgbnVsbCwgbnVsbCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgICgoamF2YS50ZXh0Lk51bWJlckZvcm1hdCkgb2JqVG9TYXZlKS5mb3JtYXQoNjNMLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfVGltZVpvbmUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5UaW1lWm9uZSkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfVGltZVpvbmUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5UaW1lWm9uZSkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbnVsbDsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLnV0aWwuVGltZVpvbmUoKSB7Ci0JCQkJaW50IHNhdmUgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLnV0aWwuVGltZVpvbmUoKSB7CisgICAgICAgICAgICAgICAgaW50IHNhdmUgPSAwOwogCi0JCQkJcHVibGljIGludCBnZXRPZmZzZXQoaW50IHAxLCBpbnQgcDIsIGludCBwMywgaW50IHA0LCBpbnQgcDUsCi0JCQkJCQlpbnQgcDYpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGludCBwMSwgaW50IHAyLCBpbnQgcDMsIGludCBwNCwgaW50IHA1LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHA2KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBpbnQgZ2V0UmF3T2Zmc2V0KCkgewotCQkJCQlyZXR1cm4gc2F2ZTsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRSYXdPZmZzZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBib29sZWFuIGluRGF5bGlnaHRUaW1lKGphdmEudXRpbC5EYXRlIHAxKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaW5EYXlsaWdodFRpbWUoamF2YS51dGlsLkRhdGUgcDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyB2b2lkIHNldFJhd09mZnNldChpbnQgcDEpIHsKLQkJCQkJc2F2ZSA9IHAxOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRSYXdPZmZzZXQoaW50IHAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNhdmUgPSBwMTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgYm9vbGVhbiB1c2VEYXlsaWdodFRpbWUoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlRGF5bGlnaHRUaW1lKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRpbWVab25lKQotCQkJCQkJcmV0dXJuIHNhdmUgPT0gKChUaW1lWm9uZSkgb2JqKS5nZXRSYXdPZmZzZXQoKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRpbWVab25lKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmUgPT0gKChUaW1lWm9uZSkgb2JqKS5nZXRSYXdPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAKLQkJCSgoamF2YS51dGlsLlRpbWVab25lKSBvYmpUb1NhdmUpLnNldFJhd09mZnNldCg0OCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgICgoamF2YS51dGlsLlRpbWVab25lKSBvYmpUb1NhdmUpLnNldFJhd09mZnNldCg0OCk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0RvdWJsZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLkRvdWJsZSkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfRG91YmxlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuRG91YmxlKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5sYW5nLkRvdWJsZSgxLjIzKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5Eb3VibGUoMS4yMyk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X051bWJlcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk51bWJlcikKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTnVtYmVyKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuTnVtYmVyKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBudWxsOwotCQkJb2JqVG9TYXZlID0gbmV3IE51bWJlcigpIHsKLQkJCQlpbnQgbnVtQ2FsbHMgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBOdW1iZXIoKSB7CisgICAgICAgICAgICAgICAgaW50IG51bUNhbGxzID0gMDsKIAotCQkJCXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JCQkJCXJldHVybiArK251bUNhbGxzOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKytudW1DYWxsczsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQkJCQkJcmV0dXJuICsrbnVtQ2FsbHM7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKytudW1DYWxsczsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgaW50IGludFZhbHVlKCkgewotCQkJCQlyZXR1cm4gbnVtQ2FsbHM7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1DYWxsczsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JCQkJCXJldHVybiArK251bUNhbGxzOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiArK251bUNhbGxzOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIGphdmEubGFuZy5OdW1iZXIpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlyZXR1cm4gaW50VmFsdWUoKSA9PSAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpOwotCQkJCX0KLQkJCX07Ci0JCQkoKGphdmEubGFuZy5OdW1iZXIpIG9ialRvU2F2ZSkuZG91YmxlVmFsdWUoKTsKLQkJCSgoamF2YS5sYW5nLk51bWJlcikgb2JqVG9TYXZlKS5mbG9hdFZhbHVlKCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBqYXZhLmxhbmcuTnVtYmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludFZhbHVlKCkgPT0gKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgKChqYXZhLmxhbmcuTnVtYmVyKSBvYmpUb1NhdmUpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAoKGphdmEubGFuZy5OdW1iZXIpIG9ialRvU2F2ZSkuZmxvYXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9BbGxQZXJtaXNzaW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0FsbFBlcm1pc3Npb24oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbigpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKCk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1JldmVyc2VDb21wYXJhdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuUmV2ZXJzZUNvbXBhcmF0b3IpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1JldmVyc2VDb21wYXJhdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuUmV2ZXJzZUNvbXBhcmF0b3IpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5yZXZlcnNlT3JkZXIoKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnJldmVyc2VPcmRlcigpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSAoKENvbXBhcmF0b3IpIG9ialRvU2F2ZSkuY29tcGFyZSgiSGVsbG8iLCAiSmVsbG8iKSA9PSAoKENvbXBhcmF0b3IpIG9iakxvYWRlZCkKLQkJCQkJLmNvbXBhcmUoIkhlbGxvIiwgIkplbGxvIik7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSU9FeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZSA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgZXF1YWxzID0gKChDb21wYXJhdG9yKSBvYmpUb1NhdmUpLmNvbXBhcmUoIkhlbGxvIiwgIkplbGxvIikgPT0gKChDb21wYXJhdG9yKSBvYmpMb2FkZWQpCisgICAgICAgICAgICAgICAgICAgIC5jb21wYXJlKCJIZWxsbyIsICJKZWxsbyIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfRGF0ZUZvcm1hdFN5bWJvbHMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scykKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfRGF0ZUZvcm1hdFN5bWJvbHMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scykKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyhMb2NhbGUuQ0hJTkVTRSk7Ci0JCQkoKGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scykgb2JqVG9TYXZlKQotCQkJCQkuc2V0Wm9uZVN0cmluZ3MobmV3IFN0cmluZ1tdW10geyB7ICJhIiwgImIiLCAiYyIsICJkIiB9LAotCQkJCQkJCXsgImUiLCAiZiIsICJnIiwgImgiIH0gfSk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMoTG9jYWxlLkNISU5FU0UpOworICAgICAgICAgICAgKChqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMpIG9ialRvU2F2ZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFpvbmVTdHJpbmdzKG5ldyBTdHJpbmdbXVtdIHsgeyAiYSIsICJiIiwgImMiLCAiZCIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJlIiwgImYiLCAiZyIsICJoIiB9IH0pOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2xsZWN0aW9uc19FbXB0eUxpc3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5Db2xsZWN0aW9ucy5FbXB0eUxpc3QpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX0VtcHR5TGlzdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLkVtcHR5TGlzdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCk7Ci0JCQlpZiAoZXF1YWxzKQotCQkJCWVxdWFscyA9ICgoTGlzdCkgb2JqTG9hZGVkKS5zaXplKCkgPT0gMDsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYm9vbGVhbiBlcXVhbHM7CisgICAgICAgICAgICBlcXVhbHMgPSBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCk7CisgICAgICAgICAgICBpZiAoZXF1YWxzKQorICAgICAgICAgICAgICAgIGVxdWFscyA9ICgoTGlzdCkgb2JqTG9hZGVkKS5zaXplKCkgPT0gMDsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0Jvb2xlYW4oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5Cb29sZWFuKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Cb29sZWFuKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuQm9vbGVhbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5Cb29sZWFuKHRydWUpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS5sYW5nLkJvb2xlYW4odHJ1ZSk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1NpbmdsZXRvblNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLlNpbmdsZXRvblNldCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQ29sbGVjdGlvbnNfU2luZ2xldG9uU2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuU2luZ2xldG9uU2V0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBCeXRlKChieXRlKSAxMDcpKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgQnl0ZSgoYnl0ZSkgMTA3KSk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCWphdmEudXRpbC5JdGVyYXRvciBpdGVyID0gKChTZXQpIG9iakxvYWRlZCkuaXRlcmF0b3IoKTsKLQkJCWVxdWFscyA9IGl0ZXIuaGFzTmV4dCgpOwotCQkJaWYgKGVxdWFscykKLQkJCQllcXVhbHMgPSBpdGVyLm5leHQoKS5lcXVhbHMobmV3IEJ5dGUoKGJ5dGUpIDEwNykpOwotCQkJaWYgKGVxdWFscykKLQkJCQllcXVhbHMgPSAhaXRlci5oYXNOZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXIgPSAoKFNldCkgb2JqTG9hZGVkKS5pdGVyYXRvcigpOworICAgICAgICAgICAgZXF1YWxzID0gaXRlci5oYXNOZXh0KCk7CisgICAgICAgICAgICBpZiAoZXF1YWxzKQorICAgICAgICAgICAgICAgIGVxdWFscyA9IGl0ZXIubmV4dCgpLmVxdWFscyhuZXcgQnl0ZSgoYnl0ZSkgMTA3KSk7CisgICAgICAgICAgICBpZiAoZXF1YWxzKQorICAgICAgICAgICAgICAgIGVxdWFscyA9ICFpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1NpbmdsZXRvbkxpc3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5Db2xsZWN0aW9ucy5TaW5nbGV0b25TZXQpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1NpbmdsZXRvbkxpc3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5Db2xsZWN0aW9ucy5TaW5nbGV0b25TZXQpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IGphdmEudXRpbC5Db2xsZWN0aW9ucwotCQkJCQkuc2luZ2xldG9uTGlzdChuZXcgQnl0ZSgoYnl0ZSkgMTA3KSk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGphdmEudXRpbC5Db2xsZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAuc2luZ2xldG9uTGlzdChuZXcgQnl0ZSgoYnl0ZSkgMTA3KSk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCWphdmEudXRpbC5JdGVyYXRvciBpdGVyID0gKChMaXN0KSBvYmpMb2FkZWQpLml0ZXJhdG9yKCk7Ci0JCQllcXVhbHMgPSBvYmpMb2FkZWQuZXF1YWxzKG9ialRvU2F2ZSkgJiYgaXRlci5oYXNOZXh0KCkKLQkJCQkJJiYgaXRlci5uZXh0KCkuZXF1YWxzKG5ldyBCeXRlKChieXRlKSAxMDcpKQotCQkJCQkmJiAhaXRlci5oYXNOZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXIgPSAoKExpc3QpIG9iakxvYWRlZCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGVxdWFscyA9IG9iakxvYWRlZC5lcXVhbHMob2JqVG9TYXZlKSAmJiBpdGVyLmhhc05leHQoKQorICAgICAgICAgICAgICAgICAgICAmJiBpdGVyLm5leHQoKS5lcXVhbHMobmV3IEJ5dGUoKGJ5dGUpIDEwNykpCisgICAgICAgICAgICAgICAgICAgICYmICFpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1NpbmdsZXRvbk1hcCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkNvbGxlY3Rpb25zLlNpbmdsZXRvblNldCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQ29sbGVjdGlvbnNfU2luZ2xldG9uTWFwKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuU2luZ2xldG9uU2V0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKCJrZXkiLCBuZXcgQnl0ZSgKLQkJCQkJKGJ5dGUpIDEwNykpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKCJrZXkiLCBuZXcgQnl0ZSgKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDEwNykpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXRlciA9ICgoTWFwKSBvYmpMb2FkZWQpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCWVxdWFscyA9IG9iakxvYWRlZC5lcXVhbHMob2JqVG9TYXZlKSAmJiBpdGVyLmhhc05leHQoKTsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJZXF1YWxzID0gZXF1YWxzICYmIGVudHJ5LmdldEtleSgpLmVxdWFscygia2V5IikKLQkJCQkJJiYgZW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMobmV3IEJ5dGUoKGJ5dGUpIDEwNykpCi0JCQkJCSYmICFpdGVyLmhhc05leHQoKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYm9vbGVhbiBlcXVhbHM7CisgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlciA9ICgoTWFwKSBvYmpMb2FkZWQpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGVxdWFscyA9IG9iakxvYWRlZC5lcXVhbHMob2JqVG9TYXZlKSAmJiBpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgZXF1YWxzID0gZXF1YWxzICYmIGVudHJ5LmdldEtleSgpLmVxdWFscygia2V5IikKKyAgICAgICAgICAgICAgICAgICAgJiYgZW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMobmV3IEJ5dGUoKGJ5dGUpIDEwNykpCisgICAgICAgICAgICAgICAgICAgICYmICFpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0ZpbGVQZXJtaXNzaW9uX0ZpbGVQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5pby5GaWxlUGVybWlzc2lvbi5GaWxlUGVybWlzc2lvbkNvbGxlY3Rpb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0ZpbGVQZXJtaXNzaW9uX0ZpbGVQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5pby5GaWxlUGVybWlzc2lvbi5GaWxlUGVybWlzc2lvbkNvbGxlY3Rpb24pCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IChuZXcgamF2YS5pby5GaWxlUGVybWlzc2lvbigiPDxBTEwgRklMRVM+PiIsICJyZWFkIikpCi0JCQkJCS5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotCQkJKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCi0JCQkJCS5hZGQobmV3IEZpbGVQZXJtaXNzaW9uKCI8PEFMTCBGSUxFUz4+IiwgInJlYWQiKSk7Ci0JCQkoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKLQkJCQkJLmFkZChuZXcgRmlsZVBlcm1pc3Npb24oImQ6XFwiLCAicmVhZCIpKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gKG5ldyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uKCI8PEFMTCBGSUxFUz4+IiwgInJlYWQiKSkKKyAgICAgICAgICAgICAgICAgICAgLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7CisgICAgICAgICAgICAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgRmlsZVBlcm1pc3Npb24oIjw8QUxMIEZJTEVTPj4iLCAicmVhZCIpKTsKKyAgICAgICAgICAgICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQorICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBGaWxlUGVybWlzc2lvbigiZDpcXCIsICJyZWFkIikpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZW51bTEgPSAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKLQkJCQkJLmVsZW1lbnRzKCksIGVudW0yID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCi0JCQkJCS5lbGVtZW50cygpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiBlbnVtMSA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudHMoKSwgZW51bTIgPSAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9iakxvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgLmVsZW1lbnRzKCk7CiAKLQkJCWVxdWFscyA9IHRydWU7Ci0JCQl3aGlsZSAoZW51bTEuaGFzTW9yZUVsZW1lbnRzKCkgJiYgZXF1YWxzKSB7Ci0JCQkJaWYgKGVudW0yLmhhc01vcmVFbGVtZW50cygpKQotCQkJCQllcXVhbHMgPSBlbnVtMS5uZXh0RWxlbWVudCgpLmVxdWFscyhlbnVtMi5uZXh0RWxlbWVudCgpKTsKLQkJCQllbHNlCi0JCQkJCWVxdWFscyA9IGZhbHNlOwotCQkJfQorICAgICAgICAgICAgZXF1YWxzID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtMS5oYXNNb3JlRWxlbWVudHMoKSAmJiBlcXVhbHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IGVudW0xLm5leHRFbGVtZW50KCkuZXF1YWxzKGVudW0yLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gZmFsc2U7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChlcXVhbHMpCi0JCQkJZXF1YWxzID0gIWVudW0yLmhhc01vcmVFbGVtZW50cygpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgaWYgKGVxdWFscykKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSAhZW51bTIuaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9TZWN1cmVSYW5kb20oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9TZWN1cmVSYW5kb20oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20oKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKCk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCWVxdWFscyA9IHRydWU7IC8vIGFzc3VtZSBmaW5lIGJlY2F1c2Ugb2YgdGhlIG5hdHVyZSBvZiB0aGUgY2xhc3MsCi0JCQkvLyBpdCBpcyBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHRoZSBzYW1lCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgZXF1YWxzID0gdHJ1ZTsgLy8gYXNzdW1lIGZpbmUgYmVjYXVzZSBvZiB0aGUgbmF0dXJlIG9mIHRoZSBjbGFzcywKKyAgICAgICAgICAgIC8vIGl0IGlzIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgdGhlIHNhbWUKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0ZpbGVQZXJtaXNzaW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmlvLkZpbGVQZXJtaXNzaW9uKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9GaWxlUGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5pby5GaWxlUGVybWlzc2lvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEuaW8uRmlsZVBlcm1pc3Npb24oIjw8QUxMIEZJTEVTPj4iLCAicmVhZCIpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS5pby5GaWxlUGVybWlzc2lvbigiPDxBTEwgRklMRVM+PiIsICJyZWFkIik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0luZXRBZGRyZXNzKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLm5ldC5JbmV0QWRkcmVzcykKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfSW5ldEFkZHJlc3MoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubmV0LkluZXRBZGRyZXNzKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBqYXZhLm5ldC5JbmV0QWRkcmVzcwotCQkJCQkuZ2V0QnlOYW1lKFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JbmV0VGVzdElQKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gamF2YS5uZXQuSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLmdldEJ5TmFtZShTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSW5ldFRlc3RJUCk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0luZXQ2QWRkcmVzcygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5uZXQuSW5ldDZBZGRyZXNzKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9JbmV0NkFkZHJlc3MoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubmV0LkluZXQ2QWRkcmVzcykKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gamF2YS5uZXQuSW5ldDZBZGRyZXNzCi0JCQkJCS5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLkluZXRUZXN0SVA2KTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gamF2YS5uZXQuSW5ldDZBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLkluZXRUZXN0SVA2KTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9SdW50aW1lUGVybWlzc2lvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9SdW50aW1lUGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uKCJUZXN0U2VyaWFsaXphdGlvbiIsCi0JCQkJCSJUZXN0Iik7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24oIlRlc3RTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIlRlc3QiKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfUGVybWlzc2lvbnMoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnMpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1Blcm1pc3Npb25zKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucygpOwotCQkJKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zKSBvYmpUb1NhdmUpLmFkZChuZXcgQWxsUGVybWlzc2lvbigpKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnMoKTsKKyAgICAgICAgICAgICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucykgb2JqVG9TYXZlKS5hZGQobmV3IEFsbFBlcm1pc3Npb24oKSk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCUVudW1lcmF0aW9uIGVudW0xID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCi0JCQkJCS5lbGVtZW50cygpLCBlbnVtMiA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqTG9hZGVkKQotCQkJCQkuZWxlbWVudHMoKTsKLQkJCWphdmEudXRpbC5WZWN0b3IgdmVjMSA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCksIHZlYzIgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0xID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCisgICAgICAgICAgICAgICAgICAgIC5lbGVtZW50cygpLCBlbnVtMiA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgdmVjMSA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCksIHZlYzIgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwogCi0JCQl3aGlsZSAoZW51bTEuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJdmVjMS5hZGQoZW51bTEubmV4dEVsZW1lbnQoKSk7Ci0JCQl3aGlsZSAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJdmVjMi5hZGQoZW51bTIubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICB3aGlsZSAoZW51bTEuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICAgICAgICAgICAgdmVjMS5hZGQoZW51bTEubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICB3aGlsZSAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICAgICAgICAgICAgdmVjMi5hZGQoZW51bTIubmV4dEVsZW1lbnQoKSk7CiAKLQkJCWVxdWFscyA9IHZlYzEuc2l6ZSgpID09IHZlYzIuc2l6ZSgpOwotCQkJaWYgKGVxdWFscykgewotCQkJCWludCBsZW5ndGggPSB2ZWMxLnNpemUoKTsKLQkJCQlPYmplY3RbXSBwZXJtczEgPSBuZXcgT2JqZWN0W2xlbmd0aF0sIHBlcm1zMiA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0JCQkJCXBlcm1zMVtpXSA9IHZlYzEuZWxlbWVudEF0KGkpOwotCQkJCQlwZXJtczJbaV0gPSB2ZWMyLmVsZW1lbnRBdChpKTsKLQkJCQl9CisgICAgICAgICAgICBlcXVhbHMgPSB2ZWMxLnNpemUoKSA9PSB2ZWMyLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChlcXVhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmVjMS5zaXplKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gcGVybXMxID0gbmV3IE9iamVjdFtsZW5ndGhdLCBwZXJtczIgPSBuZXcgT2JqZWN0W2xlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBwZXJtczFbaV0gPSB2ZWMxLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgcGVybXMyW2ldID0gdmVjMi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQkJcmV0dXJuIG8xLnRvU3RyaW5nKCkuY29tcGFyZVRvKG8yLnRvU3RyaW5nKCkpOwotCQkJCQl9CisgICAgICAgICAgICAgICAgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xLnRvU3RyaW5nKCkuY29tcGFyZVRvKG8yLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCQlyZXR1cm4gbzEudG9TdHJpbmcoKS5lcXVhbHMobzIudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9OworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvMS50b1N0cmluZygpLmVxdWFscyhvMi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CiAKLQkJCQlqYXZhLnV0aWwuQXJyYXlzLnNvcnQocGVybXMxLCBjb21wYXJhdG9yKTsKLQkJCQlqYXZhLnV0aWwuQXJyYXlzLnNvcnQocGVybXMyLCBjb21wYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQocGVybXMxLCBjb21wYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQocGVybXMyLCBjb21wYXJhdG9yKTsKIAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoICYmIGVxdWFsczsgKytpKQotCQkJCQllcXVhbHMgPSBwZXJtczFbaV0uZXF1YWxzKHBlcm1zMltpXSk7Ci0JCQl9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggJiYgZXF1YWxzOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IHBlcm1zMVtpXS5lcXVhbHMocGVybXMyW2ldKTsKKyAgICAgICAgICAgIH0KIAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfRGF0ZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLkRhdGUpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0RhdGUoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5EYXRlKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQkvLyBUaHUgRmViIDAxIDAxOjAxOjAxIEVTVCAyMDAxCi0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS51dGlsLkRhdGUoOTgxMDA3MjYxMDAwTCk7IAotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUaHUgRmViIDAxIDAxOjAxOjAxIEVTVCAyMDAxCisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS51dGlsLkRhdGUoOTgxMDA3MjYxMDAwTCk7IAorICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9GbG9hdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLkZsb2F0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9GbG9hdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLkZsb2F0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5sYW5nLkZsb2F0KDEuMjNmKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEubGFuZy5GbG9hdCgxLjIzZik7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1NlY3VyaXR5UGVybWlzc2lvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1NlY3VyaXR5UGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24pCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbigKLQkJCQkJIlRlc3RTZXJpYWxpemF0aW9uIiwgIlRlc3QiKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAiVGVzdFNlcmlhbGl6YXRpb24iLCAiVGVzdCIpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Tb2NrZXRQZXJtaXNzaW9uX1NvY2tldFBlcm1pc3Npb25Db2xsZWN0aW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uLlNvY2tldFBlcm1pc3Npb25Db2xsZWN0aW9uKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Tb2NrZXRQZXJtaXNzaW9uX1NvY2tldFBlcm1pc3Npb25Db2xsZWN0aW9uKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uLlNvY2tldFBlcm1pc3Npb25Db2xsZWN0aW9uKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSAobmV3IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24oInd3dy55YWhvby5jb20iLAotCQkJCQkiY29ubmVjdCIpKS5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotCQkJKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCi0JCQkJCS5hZGQobmV3IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24oInd3dy55YWhvby5jb20iLAotCQkJCQkJCSJjb25uZWN0IikpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSAobmV3IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24oInd3dy55YWhvby5jb20iLAorICAgICAgICAgICAgICAgICAgICAiY29ubmVjdCIpKS5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOworICAgICAgICAgICAgKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpUb1NhdmUpCisgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24oInd3dy55YWhvby5jb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0IikpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQlFbnVtZXJhdGlvbiBlbnVtMSA9ICgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikgb2JqVG9TYXZlKQotCQkJCQkuZWxlbWVudHMoKSwgZW51bTIgPSAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9iakxvYWRlZCkKLQkJCQkJLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bTEgPSAoKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKKyAgICAgICAgICAgICAgICAgICAgLmVsZW1lbnRzKCksIGVudW0yID0gKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uKSBvYmpMb2FkZWQpCisgICAgICAgICAgICAgICAgICAgIC5lbGVtZW50cygpOwogCi0JCQllcXVhbHMgPSB0cnVlOwotCQkJd2hpbGUgKGVudW0xLmhhc01vcmVFbGVtZW50cygpICYmIGVxdWFscykgewotCQkJCWlmIChlbnVtMi5oYXNNb3JlRWxlbWVudHMoKSkKLQkJCQkJZXF1YWxzID0gZW51bTEubmV4dEVsZW1lbnQoKS5lcXVhbHMoZW51bTIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJZWxzZQotCQkJCQllcXVhbHMgPSBmYWxzZTsKLQkJCX0KKyAgICAgICAgICAgIGVxdWFscyA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAoZW51bTEuaGFzTW9yZUVsZW1lbnRzKCkgJiYgZXF1YWxzKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudW0yLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBlbnVtMS5uZXh0RWxlbWVudCgpLmVxdWFscyhlbnVtMi5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IGZhbHNlOworICAgICAgICAgICAgfQogCi0JCQlpZiAoZXF1YWxzKQotCQkJCWVxdWFscyA9ICFlbnVtMi5oYXNNb3JlRWxlbWVudHMoKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIGlmIChlcXVhbHMpCisgICAgICAgICAgICAgICAgZXF1YWxzID0gIWVudW0yLmhhc01vcmVFbGVtZW50cygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfU3RhY2soKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5TdGFjaykKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfU3RhY2soKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5TdGFjaykKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEudXRpbC5TdGFjaygpOwotCQkJKChqYXZhLnV0aWwuU3RhY2spIG9ialRvU2F2ZSkucHVzaCgiU3RyaW5nIDEiKTsKLQkJCSgoamF2YS51dGlsLlN0YWNrKSBvYmpUb1NhdmUpLnB1c2goIlN0cmluZyAyIik7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLnV0aWwuU3RhY2soKTsKKyAgICAgICAgICAgICgoamF2YS51dGlsLlN0YWNrKSBvYmpUb1NhdmUpLnB1c2goIlN0cmluZyAxIik7CisgICAgICAgICAgICAoKGphdmEudXRpbC5TdGFjaykgb2JqVG9TYXZlKS5wdXNoKCJTdHJpbmcgMiIpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSB0cnVlOwotCQkJd2hpbGUgKCEoKGphdmEudXRpbC5TdGFjaykgb2JqVG9TYXZlKS5lbXB0eSgpICYmIGVxdWFscykgewotCQkJCWlmICghKChqYXZhLnV0aWwuU3RhY2spIG9iakxvYWRlZCkuZW1wdHkoKSkKLQkJCQkJZXF1YWxzID0gKChqYXZhLnV0aWwuU3RhY2spIG9ialRvU2F2ZSkucG9wKCkuZXF1YWxzKAotCQkJCQkJCSgoamF2YS51dGlsLlN0YWNrKSBvYmpMb2FkZWQpLnBvcCgpKTsKLQkJCQllbHNlCi0JCQkJCWVxdWFscyA9IGZhbHNlOwotCQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIGVxdWFscyA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAoISgoamF2YS51dGlsLlN0YWNrKSBvYmpUb1NhdmUpLmVtcHR5KCkgJiYgZXF1YWxzKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoKGphdmEudXRpbC5TdGFjaykgb2JqTG9hZGVkKS5lbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSAoKGphdmEudXRpbC5TdGFjaykgb2JqVG9TYXZlKS5wb3AoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChqYXZhLnV0aWwuU3RhY2spIG9iakxvYWRlZCkucG9wKCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gZmFsc2U7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChlcXVhbHMpCi0JCQkJZXF1YWxzID0gKChqYXZhLnV0aWwuU3RhY2spIG9iakxvYWRlZCkuZW1wdHkoKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIGlmIChlcXVhbHMpCisgICAgICAgICAgICAgICAgZXF1YWxzID0gKChqYXZhLnV0aWwuU3RhY2spIG9iakxvYWRlZCkuZW1wdHkoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0RlY2ltYWxGb3JtYXRTeW1ib2xzKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0RlY2ltYWxGb3JtYXRTeW1ib2xzKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMoTG9jYWxlLkNISU5FU0UpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzKExvY2FsZS5DSElORVNFKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTmV0UGVybWlzc2lvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5uZXQuTmV0UGVybWlzc2lvbikKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTmV0UGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5uZXQuTmV0UGVybWlzc2lvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IGphdmEubmV0Lk5ldFBlcm1pc3Npb24oIlRlc3RTZXJpYWxpemF0aW9uIiwgIlRlc3QiKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEubmV0Lk5ldFBlcm1pc3Npb24oIlRlc3RTZXJpYWxpemF0aW9uIiwgIlRlc3QiKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcl9BdHRyaWJ1dGUoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JfQXR0cmlidXRlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZSkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUuTEFOR1VBR0U7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLkxBTkdVQUdFOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTG9uZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLkxvbmcpCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0xvbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5Mb25nKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5sYW5nLkxvbmcoMTA3TCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLmxhbmcuTG9uZygxMDdMKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZS5lcXVhbHMob2JqTG9hZGVkKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQ29kZVNvdXJjZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5Db2RlU291cmNlKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2RlU291cmNlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UpCiAKLQkJT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7Ci0JCU9iamVjdCBvYmpMb2FkZWQgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UobmV3IGphdmEubmV0LlVSTCgKLQkJCQkJCSJodHRwOi8vbG9jYWxob3N0L2EudHh0IiksCi0JCQkJCQkoQ2VydGlmaWNhdGVbXSludWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRXhjZXB0aW9uIGNyZWF0aW5nIG9iamVjdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UobmV3IGphdmEubmV0LlVSTCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2EudHh0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAoQ2VydGlmaWNhdGVbXSludWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGNyZWF0aW5nIG9iamVjdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0NvbGxlY3Rpb25zX1N5bmNocm9uaXplZENvbGxlY3Rpb24oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5Db2xsZWN0aW9ucy5TeW5jaHJvbml6ZWRDb2xsZWN0aW9uKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Db2xsZWN0aW9uc19TeW5jaHJvbml6ZWRDb2xsZWN0aW9uKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuQ29sbGVjdGlvbnMuU3luY2hyb25pemVkQ29sbGVjdGlvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24oU0VUKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24oU0VUKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWJvb2xlYW4gZXF1YWxzOwotCQkJZXF1YWxzID0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqVG9TYXZlKS5zaXplKCkgPT0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqTG9hZGVkKQotCQkJCQkuc2l6ZSgpOwotCQkJaWYgKGVxdWFscykgewotCQkJCWphdmEudXRpbC5JdGVyYXRvciBpdGVyMSA9ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKLQkJCQkJCS5pdGVyYXRvcigpLCBpdGVyMiA9ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9iakxvYWRlZCkKLQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyMS5oYXNOZXh0KCkpCi0JCQkJCWVxdWFscyA9IGVxdWFscyAmJiBpdGVyMS5uZXh0KCkuZXF1YWxzKGl0ZXIyLm5leHQoKSk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgZXF1YWxzID0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqVG9TYXZlKS5zaXplKCkgPT0gKChqYXZhLnV0aWwuQ29sbGVjdGlvbikgb2JqTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpOworICAgICAgICAgICAgaWYgKGVxdWFscykgeworICAgICAgICAgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpdGVyMSA9ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9ialRvU2F2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLCBpdGVyMiA9ICgoamF2YS51dGlsLkNvbGxlY3Rpb24pIG9iakxvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyMS5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IGVxdWFscyAmJiBpdGVyMS5uZXh0KCkuZXF1YWxzKGl0ZXIyLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9QZXJtaXNzaW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1Blcm1pc3Npb24oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbnVsbDsKLQkJCW9ialRvU2F2ZSA9IG5ldyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24oInRlc3QiKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBwMSkgewotCQkJCQlpZiAoIShwMSBpbnN0YW5jZW9mIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCXJldHVybiBnZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCSgoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKSBwMSkuZ2V0TmFtZSgpKTsKLQkJCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbigidGVzdCIpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHAxIGluc3RhbmNlb2YgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pIHAxKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbnMoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbnMoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXB1YmxpYyBib29sZWFuIGltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHAxKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gcDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlLmVxdWFscyhvYmpMb2FkZWQpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBvYmpUb1NhdmUuZXF1YWxzKG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1JhbmRvbSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS51dGlsLlJhbmRvbSkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfUmFuZG9tKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnV0aWwuUmFuZG9tKQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS51dGlsLlJhbmRvbSgxMDdMKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IGphdmEudXRpbC5SYW5kb20oMTA3TCk7CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlib29sZWFuIGVxdWFsczsKLQkJCWVxdWFscyA9ICgoamF2YS51dGlsLlJhbmRvbSkgb2JqVG9TYXZlKS5uZXh0SW50KCkgPT0gKChqYXZhLnV0aWwuUmFuZG9tKSBvYmpMb2FkZWQpCi0JCQkJCS5uZXh0SW50KCk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzOworICAgICAgICAgICAgZXF1YWxzID0gKChqYXZhLnV0aWwuUmFuZG9tKSBvYmpUb1NhdmUpLm5leHRJbnQoKSA9PSAoKGphdmEudXRpbC5SYW5kb20pIG9iakxvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0d1YXJkZWRPYmplY3QoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuR3VhcmRlZE9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfR3VhcmRlZE9iamVjdCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5HdWFyZGVkT2JqZWN0KQogCi0JCU9iamVjdCBvYmpUb1NhdmUgPSBudWxsOwotCQlPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQgPSBudWxsOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBuZXcgamF2YS5zZWN1cml0eS5HdWFyZGVkT2JqZWN0KCJUZXN0IE9iamVjdCIsCi0JCQkJCW5ldyBHdWFyZEltcGxlbWVudGF0aW9uKCkpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBuZXcgamF2YS5zZWN1cml0eS5HdWFyZGVkT2JqZWN0KCJUZXN0IE9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBHdWFyZEltcGxlbWVudGF0aW9uKCkpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJYm9vbGVhbiBlcXVhbHM7Ci0JCQllcXVhbHMgPSAoKGphdmEuc2VjdXJpdHkuR3VhcmRlZE9iamVjdCkgb2JqVG9TYXZlKS5nZXRPYmplY3QoKQotCQkJCQkuZXF1YWxzKAotCQkJCQkJCSgoamF2YS5zZWN1cml0eS5HdWFyZGVkT2JqZWN0KSBvYmpMb2FkZWQpCi0JCQkJCQkJCQkuZ2V0T2JqZWN0KCkpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBib29sZWFuIGVxdWFsczsKKyAgICAgICAgICAgIGVxdWFscyA9ICgoamF2YS5zZWN1cml0eS5HdWFyZGVkT2JqZWN0KSBvYmpUb1NhdmUpLmdldE9iamVjdCgpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChqYXZhLnNlY3VyaXR5Lkd1YXJkZWRPYmplY3QpIG9iakxvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPYmplY3QoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgZXF1YWxzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JLy8gVE9ETyA6IFJlaW50cm9kdWNlIHdoZW4gd2UgaGF2ZSBhIHdvcmtpbmcgc2VjdXJpdHkgaW1wbGVtZW50YXRpb24KLQkvLyBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0tleVBhaXIoKSB7Ci0JLy8gLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkvLyAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5Lkd1YXJkZWRPYmplY3QpCi0JLy8KLQkvLyBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkvLyBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKLQkvLwotCS8vIHRyeSB7Ci0JLy8gb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuS2V5UGFpcihudWxsLCBudWxsKTsKLQkvLyBpZiAoREVCVUcpCi0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkvLyBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7Ci0JLy8KLQkvLyAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkvLyBib29sZWFuIGVxdWFsczsKLQkvLyBlcXVhbHMgPSB0cnVlOwotCS8vIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCS8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkvLyBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKLQkvLyArIGUuZ2V0TWVzc2FnZSgpKTsKLQkvLyB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkvLyBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCS8vIH0gY2F0Y2ggKEVycm9yIGVycikgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkvLyAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gdGhyb3cgZXJyOwotCS8vIH0KLQkvLyB9CisgICAgLy8gVE9ETyA6IFJlaW50cm9kdWNlIHdoZW4gd2UgaGF2ZSBhIHdvcmtpbmcgc2VjdXJpdHkgaW1wbGVtZW50YXRpb24KKyAgICAvLyBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0tleVBhaXIoKSB7CisgICAgLy8gLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAvLyAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnNlY3VyaXR5Lkd1YXJkZWRPYmplY3QpCisgICAgLy8KKyAgICAvLyBPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKKyAgICAvLyBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAvLworICAgIC8vIHRyeSB7CisgICAgLy8gb2JqVG9TYXZlID0gbmV3IGphdmEuc2VjdXJpdHkuS2V5UGFpcihudWxsLCBudWxsKTsKKyAgICAvLyBpZiAoREVCVUcpCisgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAvLyBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgLy8KKyAgICAvLyAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAvLyBib29sZWFuIGVxdWFsczsKKyAgICAvLyBlcXVhbHMgPSB0cnVlOworICAgIC8vIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOworICAgIC8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAvLyBmYWlsKCJJT0V4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIKKyAgICAvLyArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAvLyB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAvLyBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIC8vIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAvLyAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgLy8gdGhyb3cgZXJyOworICAgIC8vIH0KKyAgICAvLyB9CiAKLQlzdGF0aWMgY2xhc3MgTXlJbnZvY2F0aW9uSGFuZGxlciBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0JCQkJdGhyb3dzIFRocm93YWJsZSB7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVxdWFscyIpKQotCQkJCXJldHVybiBuZXcgQm9vbGVhbihwcm94eSA9PSBhcmdzWzBdKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYXJyYXkiKSkKLQkJCQlyZXR1cm4gbmV3IGludFtdIHsgKGludCkgKChsb25nW10pIGFyZ3NbMF0pWzFdLCAtMSB9OwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJzdHJpbmciKSkgewotCQkJCWlmICgiZXJyb3IiLmVxdWFscyhhcmdzWzBdKSkKLQkJCQkJdGhyb3cgbmV3IEFycmF5U3RvcmVFeGNlcHRpb24oKTsKLQkJCQlpZiAoImFueSIuZXF1YWxzKGFyZ3NbMF0pKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9CisgICAgc3RhdGljIGNsYXNzIE15SW52b2NhdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJbnZvY2F0aW9uSGFuZGxlciwgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQorICAgICAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlcXVhbHMiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4ocHJveHkgPT0gYXJnc1swXSk7CisgICAgICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImFycmF5IikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7IChpbnQpICgobG9uZ1tdKSBhcmdzWzBdKVsxXSwgLTEgfTsKKyAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygic3RyaW5nIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoImVycm9yIi5lcXVhbHMoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheVN0b3JlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKCJhbnkiLmVxdWFscyhhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9Qcm94eSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5zZWN1cml0eS5HdWFyZGVkT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3Rfd3JpdGVPYmplY3RfUHJveHkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEuc2VjdXJpdHkuR3VhcmRlZE9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gUHJveHkuZ2V0UHJveHlDbGFzcyhTdXBwb3J0X1Byb3h5X0kxLmNsYXNzCi0JCQkJCS5nZXRDbGFzc0xvYWRlcigpLCBuZXcgQ2xhc3NbXSB7IFN1cHBvcnRfUHJveHlfSTEuY2xhc3MgfSk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCW9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IFByb3h5LmdldFByb3h5Q2xhc3MoU3VwcG9ydF9Qcm94eV9JMS5jbGFzcworICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSwgbmV3IENsYXNzW10geyBTdXBwb3J0X1Byb3h5X0kxLmNsYXNzIH0pOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgIm5vdCBhIHByb3h5IGNsYXNzIiwgUHJveHkKLQkJCQkJLmlzUHJveHlDbGFzcygoQ2xhc3MpIG9iakxvYWRlZCkpOwotCQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gKChDbGFzcykgb2JqTG9hZGVkKS5nZXRJbnRlcmZhY2VzKCk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArICJ3cm9uZyBpbnRlcmZhY2VzIGxlbmd0aCIsCi0JCQkJCWludGVyZmFjZXMubGVuZ3RoID09IDEpOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyAid3JvbmcgaW50ZXJmYWNlIiwKLQkJCQkJaW50ZXJmYWNlc1swXSA9PSBTdXBwb3J0X1Byb3h5X0kxLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgIm5vdCBhIHByb3h5IGNsYXNzIiwgUHJveHkKKyAgICAgICAgICAgICAgICAgICAgLmlzUHJveHlDbGFzcygoQ2xhc3MpIG9iakxvYWRlZCkpOworICAgICAgICAgICAgQ2xhc3NbXSBpbnRlcmZhY2VzID0gKChDbGFzcykgb2JqTG9hZGVkKS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArICJ3cm9uZyBpbnRlcmZhY2VzIGxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMubGVuZ3RoID09IDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyAid3JvbmcgaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlc1swXSA9PSBTdXBwb3J0X1Byb3h5X0kxLmNsYXNzKTsKIAotCQkJSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBNeUludm9jYXRpb25IYW5kbGVyKCk7Ci0JCQlvYmpUb1NhdmUgPSBQcm94eS5uZXdQcm94eUluc3RhbmNlKFN1cHBvcnRfUHJveHlfSTEuY2xhc3MKLQkJCQkJLmdldENsYXNzTG9hZGVyKCksIG5ldyBDbGFzc1tdIHsgU3VwcG9ydF9Qcm94eV9JMS5jbGFzcyB9LAotCQkJCQloYW5kbGVyKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBNeUludm9jYXRpb25IYW5kbGVyKCk7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBQcm94eS5uZXdQcm94eUluc3RhbmNlKFN1cHBvcnRfUHJveHlfSTEuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCksIG5ldyBDbGFzc1tdIHsgU3VwcG9ydF9Qcm94eV9JMS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQlib29sZWFuIGVxdWFscyA9IFByb3h5LmdldEludm9jYXRpb25IYW5kbGVyKG9iakxvYWRlZCkuZ2V0Q2xhc3MoKSA9PSBNeUludm9jYXRpb25IYW5kbGVyLmNsYXNzOwotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgICAgICBib29sZWFuIGVxdWFscyA9IFByb3h5LmdldEludm9jYXRpb25IYW5kbGVyKG9iakxvYWRlZCkuZ2V0Q2xhc3MoKSA9PSBNeUludm9jYXRpb25IYW5kbGVyLmNsYXNzOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CiAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1VSSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5uZXQuVVJJKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9VUkkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubmV0LlVSSSkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlvYmpUb1NhdmUgPSBuZXcgVVJJW10gewotCQkJCQkJLy8gc2luZ2xlIGFyZyBjb25zdHJ1Y3RvcgotCQkJCQkJbmV3IFVSSSgKLQkJCQkJCQkJImh0dHA6Ly91c2VyJTYwJTIwaW5mb0Bob3N0L2ElMjBwYXRoP3F1JTYwJTIwZXJ5I2ZyJTVFJTIwYWciKSwgCi0JCQkJCQkvLyBlc2NhcGVkIG9jdGV0cyBmb3IgaWxsZWdhbCBjaGFycwotCQkJCQkJbmV3IFVSSSgKLQkJCQkJCQkJImh0dHA6Ly91c2VyJUMzJTlGJUMyJUEzaW5mb0Bob3N0OjgwL2ElRTIlODIlQUNwYXRoP3F1JUMyJUE5JUMyJUFFZXJ5I2ZyJUMzJUE0JUMzJUE4ZyIpLAotCQkJCQkJLy8gZXNjYXBlZCBvY3RldHMgZm9yIHVuaWNvZGUgY2hhcnMKLQkJCQkJCW5ldyBVUkkoCi0JCQkJCQkJCSJhc2NoZW1lOi8vdXNlclx1MDBERlx1MDBBM2luZm9AaG9zdDowL2FcdTIwQUNwYXRoP3F1XHUwMEE5XHUwMEFFZXJ5I2ZyXHUwMEU0XHUwMEU4ZyIpLAotCQkJCQkJLy8gbXVsdGlwbGUgYXJnIGNvbnN0cnVjdG9ycwotCQkJCQkJbmV3IFVSSSgiaHR0cCIsICJ1c2VyJTYwJTIwaW5mbyIsICJob3N0IiwgODAsCi0JCQkJCQkJCSIvYSUyMHBhdGgiLCAicXUlNjAlMjBlcnkiLCAiZnIlNUUlMjBhZyIpLAotCQkJCQkJLy8gZXNjYXBlZCBvY3RldHMgZm9yIGlsbGVnYWwKLQkJCQkJCW5ldyBVUkkoImh0dHAiLCAidXNlciVDMyU5RiVDMiVBM2luZm8iLCAiaG9zdCIsIC0xLAotCQkJCQkJCQkiL2ElRTIlODIlQUNwYXRoIiwgInF1JUMyJUE5JUMyJUFFZXJ5IiwKLQkJCQkJCQkJImZyJUMzJUE0JUMzJUE4ZyIpLAotCQkJCQkJLy8gZXNjYXBlZCBvY3RldHMgZm9yIHVuaWNvZGUKLQkJCQkJCW5ldyBVUkkoImFzY2hlbWUiLCAidXNlclx1MDBERlx1MDBBM2luZm8iLCAiaG9zdCIsIDgwLAotCQkJCQkJCQkiL2FcdTIwQUNwYXRoIiwgInF1XHUwMEE5XHUwMEFFZXJ5IiwKLQkJCQkJCQkJImZyXHUwMEU0XHUwMEU4ZyIpLAotCQkJCQkJbmV3IFVSSSgiaHR0cCIsICJ1c2VyYCBpbmZvIiwgImhvc3QiLCA4MSwgIi9hIHBhdGgiLAotCQkJCQkJCQkicXVgIGVyeSIsICJmcl4gYWciKSwgLy8gaWxsZWdhbCBjaGFycwotCQkJCQkJbmV3IFVSSSgiaHR0cCIsICJ1c2VyJWluZm8iLCAiaG9zdCIsIDAsICIvYSVwYXRoIiwKLQkJCQkJCQkJInF1ZSVyeSIsICJmJXJhZyIpLAotCQkJCQkJLy8gJSBhcyBpbGxlZ2FsIGNoYXIsIG5vdCBlc2NhcGVkIG9jdGV0IHVybHMgd2l0aAotCQkJCQkJLy8gdW5kZWZpbmVkIGNvbXBvbmVudHMKLQkJCQkJCW5ldyBVUkkoIm1haWx0byIsICJ1c2VyQGRvbWFpbi5jb20iLCBudWxsKSwKLQkJCQkJCS8vIG5vIGhvc3QsIHBhdGgsIHF1ZXJ5IG9yIGZyYWdtZW50Ci0JCQkJCQluZXcgVVJJKCIuLi9hZGlyZWN0b3J5L2ZpbGUuaHRtbCMiKSwKLQkJCQkJCS8vIHJlbGF0aXZlIHBhdGggd2l0aCBlbXB0eSBmcmFnbWVudDsKLQkJCQkJCW5ldyBVUkkoIm5ld3MiLCAiY29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4IiwKLQkJCQkJCQkJbnVsbCksCi0JCQkJCQluZXcgVVJJKG51bGwsIG51bGwsIG51bGwsICJmcmFnbWVudCIpLAotCQkJCQkJLy8gb25seSBmcmFnbWVudCAKLQkJCQkJCW5ldyBVUkkoInRlbG5ldDovL3NlcnZlci5vcmciKSwgLy8gb25seSBob3N0Ci0JCQkJCQluZXcgVVJJKCJodHRwOi8vcmVnOmlzdHJ5P3F1ZXJ5IiksCi0JCQkJCQkvLyBtYWxmb3JtZWQgaG9zdG5hbWUsIHRoZXJlZm9yZSByZWdpc3RyeS1iYXNlZCwKLQkJCQkJCS8vIHdpdGggcXVlcnkKLQkJCQkJCW5ldyBVUkkoImZpbGU6Ly8vYzovdGVtcC9jYWxjdWxhdGUucGw/IikKLQkJCQkJCS8vIGVtcHR5IGF1dGhvcml0eSwgbm9uIGVtcHR5IHBhdGgsIGVtcHR5IHF1ZXJ5Ci0JCQkJfTsKLQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb246IiArIGUpOwotCQkJfQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBVUklbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgYXJnIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJJKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3VzZXIlNjAlMjBpbmZvQGhvc3QvYSUyMHBhdGg/cXUlNjAlMjBlcnkjZnIlNUUlMjBhZyIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZWQgb2N0ZXRzIGZvciBpbGxlZ2FsIGNoYXJzCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJJKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3VzZXIlQzMlOUYlQzIlQTNpbmZvQGhvc3Q6ODAvYSVFMiU4MiVBQ3BhdGg/cXUlQzIlQTklQzIlQUVlcnkjZnIlQzMlQTQlQzMlQThnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIG9jdGV0cyBmb3IgdW5pY29kZSBjaGFycworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzY2hlbWU6Ly91c2VyXHUwMERGXHUwMEEzaW5mb0Bob3N0OjAvYVx1MjBBQ3BhdGg/cXVcdTAwQTlcdTAwQUVlcnkjZnJcdTAwRTRcdTAwRThnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBhcmcgY29uc3RydWN0b3JzCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJJKCJodHRwIiwgInVzZXIlNjAlMjBpbmZvIiwgImhvc3QiLCA4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9hJTIwcGF0aCIsICJxdSU2MCUyMGVyeSIsICJmciU1RSUyMGFnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIG9jdGV0cyBmb3IgaWxsZWdhbAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgiaHR0cCIsICJ1c2VyJUMzJTlGJUMyJUEzaW5mbyIsICJob3N0IiwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvYSVFMiU4MiVBQ3BhdGgiLCAicXUlQzIlQTklQzIlQUVlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnIlQzMlQTQlQzMlQThnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIG9jdGV0cyBmb3IgdW5pY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgiYXNjaGVtZSIsICJ1c2VyXHUwMERGXHUwMEEzaW5mbyIsICJob3N0IiwgODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvYVx1MjBBQ3BhdGgiLCAicXVcdTAwQTlcdTAwQUVlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJcdTAwRTRcdTAwRThnIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJJKCJodHRwIiwgInVzZXJgIGluZm8iLCAiaG9zdCIsIDgxLCAiL2EgcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWAgZXJ5IiwgImZyXiBhZyIpLCAvLyBpbGxlZ2FsIGNoYXJzCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJJKCJodHRwIiwgInVzZXIlaW5mbyIsICJob3N0IiwgMCwgIi9hJXBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVlJXJ5IiwgImYlcmFnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAlIGFzIGlsbGVnYWwgY2hhciwgbm90IGVzY2FwZWQgb2N0ZXQgdXJscyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgibWFpbHRvIiwgInVzZXJAZG9tYWluLmNvbSIsIG51bGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gaG9zdCwgcGF0aCwgcXVlcnkgb3IgZnJhZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoIi4uL2FkaXJlY3RvcnkvZmlsZS5odG1sIyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgcGF0aCB3aXRoIGVtcHR5IGZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgibmV3cyIsICJjb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLnVuaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkobnVsbCwgbnVsbCwgbnVsbCwgImZyYWdtZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGZyYWdtZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgidGVsbmV0Oi8vc2VydmVyLm9yZyIpLCAvLyBvbmx5IGhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoImh0dHA6Ly9yZWc6aXN0cnk/cXVlcnkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbGZvcm1lZCBob3N0bmFtZSwgdGhlcmVmb3JlIHJlZ2lzdHJ5LWJhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBxdWVyeQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgiZmlsZTovLy9jOi90ZW1wL2NhbGN1bGF0ZS5wbD8iKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgYXV0aG9yaXR5LCBub24gZW1wdHkgcGF0aCwgZW1wdHkgcXVlcnkKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbjoiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgQXJyYXlzLmVxdWFscygKLQkJCQkJKFVSSVtdKSBvYmpUb1NhdmUsIChVUklbXSkgb2JqTG9hZGVkKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIEFycmF5cy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIChVUklbXSkgb2JqVG9TYXZlLCAoVVJJW10pIG9iakxvYWRlZCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X1VSSVN5bnRheEV4Y2VwdGlvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9VUklTeW50YXhFeGNlcHRpb24oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbikKIAotCQlVUklTeW50YXhFeGNlcHRpb24gb2JqVG9TYXZlID0gbnVsbDsKLQkJVVJJU3ludGF4RXhjZXB0aW9uIG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIFVSSVN5bnRheEV4Y2VwdGlvbiBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBVUklTeW50YXhFeGNlcHRpb24gb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IFVSSVN5bnRheEV4Y2VwdGlvbigic3RyIiwgInByb2JsZW0iLCA0KTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gKFVSSVN5bnRheEV4Y2VwdGlvbikgZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gbmV3IFVSSVN5bnRheEV4Y2VwdGlvbigic3RyIiwgInByb2JsZW0iLCA0KTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gKFVSSVN5bnRheEV4Y2VwdGlvbikgZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQlib29sZWFuIGVxdWFscyA9IG9ialRvU2F2ZS5nZXRNZXNzYWdlKCkuZXF1YWxzKAotCQkJCQlvYmpMb2FkZWQuZ2V0TWVzc2FnZSgpKQotCQkJCQkmJiBvYmpUb1NhdmUuZ2V0SW5wdXQoKS5lcXVhbHMob2JqTG9hZGVkLmdldElucHV0KCkpCi0JCQkJCSYmIG9ialRvU2F2ZS5nZXRJbmRleCgpID09IG9iakxvYWRlZC5nZXRJbmRleCgpCi0JCQkJCSYmIG9ialRvU2F2ZS5nZXRSZWFzb24oKS5lcXVhbHMob2JqTG9hZGVkLmdldFJlYXNvbigpKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZXF1YWxzID0gb2JqVG9TYXZlLmdldE1lc3NhZ2UoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIG9iakxvYWRlZC5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAgICAgICAgICYmIG9ialRvU2F2ZS5nZXRJbnB1dCgpLmVxdWFscyhvYmpMb2FkZWQuZ2V0SW5wdXQoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgb2JqVG9TYXZlLmdldEluZGV4KCkgPT0gb2JqTG9hZGVkLmdldEluZGV4KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb2JqVG9TYXZlLmdldFJlYXNvbigpLmVxdWFscyhvYmpMb2FkZWQuZ2V0UmVhc29uKCkpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQ3VycmVuY3koKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5DdXJyZW5jeSkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfQ3VycmVuY3koKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudXRpbC5DdXJyZW5jeSkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gamF2YS51dGlsLkN1cnJlbmN5LmdldEluc3RhbmNlKCJBTUQiKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gamF2YS51dGlsLkN1cnJlbmN5LmdldEluc3RhbmNlKCJBTUQiKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCS8vIHdlIG5lZWQgc2FtZSBpbnN0YW5jZSBmb3IgdGhlIHNhbWUgY3VycmVuY3kgY29kZQotCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZSA9PSBvYmpUb1NhdmUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgc2FtZSBpbnN0YW5jZSBmb3IgdGhlIHNhbWUgY3VycmVuY3kgY29kZQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIG9ialRvU2F2ZSA9PSBvYmpUb1NhdmUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X0RhdGVGb3JtYXRfRmllbGQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5EYXRlRm9ybWF0LkZpZWxkKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9EYXRlRm9ybWF0X0ZpZWxkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuRGF0ZUZvcm1hdC5GaWVsZCkKIAotCQlEYXRlRm9ybWF0LkZpZWxkW10gb2JqVG9TYXZlID0gbnVsbDsKLQkJRGF0ZUZvcm1hdC5GaWVsZFtdIG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIERhdGVGb3JtYXQuRmllbGRbXSBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBEYXRlRm9ybWF0LkZpZWxkW10gb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IERhdGVGb3JtYXQuRmllbGRbXSB7IERhdGVGb3JtYXQuRmllbGQuQU1fUE0sCi0JCQkJCURhdGVGb3JtYXQuRmllbGQuREFZX09GX01PTlRILCBEYXRlRm9ybWF0LkZpZWxkLkVSQSwKLQkJCQkJRGF0ZUZvcm1hdC5GaWVsZC5IT1VSMCwgRGF0ZUZvcm1hdC5GaWVsZC5IT1VSMSwKLQkJCQkJRGF0ZUZvcm1hdC5GaWVsZC5IT1VSX09GX0RBWTAsCi0JCQkJCURhdGVGb3JtYXQuRmllbGQuSE9VUl9PRl9EQVkxLCBEYXRlRm9ybWF0LkZpZWxkLlRJTUVfWk9ORSwKLQkJCQkJRGF0ZUZvcm1hdC5GaWVsZC5ZRUFSLAotCQkJCQlEYXRlRm9ybWF0LkZpZWxkLkRBWV9PRl9XRUVLX0lOX01PTlRIIH07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBEYXRlRm9ybWF0LkZpZWxkW10geyBEYXRlRm9ybWF0LkZpZWxkLkFNX1BNLAorICAgICAgICAgICAgICAgICAgICBEYXRlRm9ybWF0LkZpZWxkLkRBWV9PRl9NT05USCwgRGF0ZUZvcm1hdC5GaWVsZC5FUkEsCisgICAgICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuRmllbGQuSE9VUjAsIERhdGVGb3JtYXQuRmllbGQuSE9VUjEsCisgICAgICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuRmllbGQuSE9VUl9PRl9EQVkwLAorICAgICAgICAgICAgICAgICAgICBEYXRlRm9ybWF0LkZpZWxkLkhPVVJfT0ZfREFZMSwgRGF0ZUZvcm1hdC5GaWVsZC5USU1FX1pPTkUsCisgICAgICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuRmllbGQuWUVBUiwKKyAgICAgICAgICAgICAgICAgICAgRGF0ZUZvcm1hdC5GaWVsZC5EQVlfT0ZfV0VFS19JTl9NT05USCB9OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CiAKLQkJCW9iakxvYWRlZCA9IChEYXRlRm9ybWF0LkZpZWxkW10pIGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKKyAgICAgICAgICAgIG9iakxvYWRlZCA9IChEYXRlRm9ybWF0LkZpZWxkW10pIGR1bXBBbmRSZWxvYWQob2JqVG9TYXZlKTsKIAotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQkvLyB3ZSBuZWVkIHNhbWUgaW5zdGFuY2VzIGZvciB0aGUgc2FtZSBmaWVsZCBuYW1lcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpUb1NhdmUubGVuZ3RoOyBpKyspIHsKLQkJCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZVtpXSwKLQkJCQkJCW9ialRvU2F2ZVtpXSA9PSBvYmpMb2FkZWRbaV0pOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgICAgICAvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgc2FtZSBpbnN0YW5jZXMgZm9yIHRoZSBzYW1lIGZpZWxkIG5hbWVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9ialRvU2F2ZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqVG9TYXZlW2ldID09IG9iakxvYWRlZFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTnVtYmVyRm9ybWF0X0ZpZWxkKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuTnVtYmVyRm9ybWF0LkZpZWxkKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9OdW1iZXJGb3JtYXRfRmllbGQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5OdW1iZXJGb3JtYXQuRmllbGQpCiAKLQkJTnVtYmVyRm9ybWF0LkZpZWxkW10gb2JqVG9TYXZlID0gbnVsbDsKLQkJTnVtYmVyRm9ybWF0LkZpZWxkW10gb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgTnVtYmVyRm9ybWF0LkZpZWxkW10gb2JqVG9TYXZlID0gbnVsbDsKKyAgICAgICAgTnVtYmVyRm9ybWF0LkZpZWxkW10gb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gbmV3IE51bWJlckZvcm1hdC5GaWVsZFtdIHsgTnVtYmVyRm9ybWF0LkZpZWxkLkNVUlJFTkNZLAotCQkJCQlOdW1iZXJGb3JtYXQuRmllbGQuREVDSU1BTF9TRVBBUkFUT1IsCi0JCQkJCU51bWJlckZvcm1hdC5GaWVsZC5FWFBPTkVOVCwKLQkJCQkJTnVtYmVyRm9ybWF0LkZpZWxkLkVYUE9ORU5UX1NJR04sCi0JCQkJCU51bWJlckZvcm1hdC5GaWVsZC5FWFBPTkVOVF9TWU1CT0wsCi0JCQkJCU51bWJlckZvcm1hdC5GaWVsZC5GUkFDVElPTiwKLQkJCQkJTnVtYmVyRm9ybWF0LkZpZWxkLkdST1VQSU5HX1NFUEFSQVRPUiwKLQkJCQkJTnVtYmVyRm9ybWF0LkZpZWxkLklOVEVHRVIsIE51bWJlckZvcm1hdC5GaWVsZC5QRVJDRU5ULAotCQkJCQlOdW1iZXJGb3JtYXQuRmllbGQuUEVSTUlMTEUsIE51bWJlckZvcm1hdC5GaWVsZC5TSUdOIH07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IG5ldyBOdW1iZXJGb3JtYXQuRmllbGRbXSB7IE51bWJlckZvcm1hdC5GaWVsZC5DVVJSRU5DWSwKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyRm9ybWF0LkZpZWxkLkRFQ0lNQUxfU0VQQVJBVE9SLAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXQuRmllbGQuRVhQT05FTlQsCisgICAgICAgICAgICAgICAgICAgIE51bWJlckZvcm1hdC5GaWVsZC5FWFBPTkVOVF9TSUdOLAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXQuRmllbGQuRVhQT05FTlRfU1lNQk9MLAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXQuRmllbGQuRlJBQ1RJT04sCisgICAgICAgICAgICAgICAgICAgIE51bWJlckZvcm1hdC5GaWVsZC5HUk9VUElOR19TRVBBUkFUT1IsCisgICAgICAgICAgICAgICAgICAgIE51bWJlckZvcm1hdC5GaWVsZC5JTlRFR0VSLCBOdW1iZXJGb3JtYXQuRmllbGQuUEVSQ0VOVCwKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyRm9ybWF0LkZpZWxkLlBFUk1JTExFLCBOdW1iZXJGb3JtYXQuRmllbGQuU0lHTiB9OworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqID0gIiArIG9ialRvU2F2ZSk7CiAKLQkJCW9iakxvYWRlZCA9IChOdW1iZXJGb3JtYXQuRmllbGRbXSkgZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gKE51bWJlckZvcm1hdC5GaWVsZFtdKSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJLy8gd2UgbmVlZCBzYW1lIGluc3RhbmNlcyBmb3IgdGhlIHNhbWUgZmllbGQgbmFtZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqVG9TYXZlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmVbaV0sCi0JCQkJCQlvYmpUb1NhdmVbaV0gPT0gb2JqTG9hZGVkW2ldKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEVycm9yIGVycikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXJyOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHNhbWUgaW5zdGFuY2VzIGZvciB0aGUgc2FtZSBmaWVsZCBuYW1lcworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpUb1NhdmUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ialRvU2F2ZVtpXSA9PSBvYmpMb2FkZWRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7CisgICAgICAgICAgICAvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlT2JqZWN0X01lc3NhZ2VGb3JtYXRfRmllbGQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LkZpZWxkKQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9NZXNzYWdlRm9ybWF0X0ZpZWxkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5GaWVsZCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKIAotCQl0cnkgewotCQkJb2JqVG9TYXZlID0gTWVzc2FnZUZvcm1hdC5GaWVsZC5BUkdVTUVOVDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqVG9TYXZlID0gTWVzc2FnZUZvcm1hdC5GaWVsZC5BUkdVTUVOVDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwogCi0JCQlvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CiAKLQkJCS8vIEhhcyB0byBoYXZlIHdvcmtlZAotCQkJLy8gd2UgbmVlZCBzYW1lIGluc3RhbmNlIGZvciB0aGUgc2FtZSBmaWVsZCBuYW1lCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlID09IG9iakxvYWRlZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCS8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGVycjsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgLy8gd2UgbmVlZCBzYW1lIGluc3RhbmNlIGZvciB0aGUgc2FtZSBmaWVsZCBuYW1lCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgb2JqVG9TYXZlID09IG9iakxvYWRlZCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTGlua2VkSGFzaE1hcCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTGlua2VkSGFzaE1hcCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IExJTktFRE1BUDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTElOS0VETUFQLmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IExJTktFRE1BUDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTElOS0VETUFQLmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQkJTWFwIG1hcExvYWRlZCA9IChNYXApIG9iakxvYWRlZDsKLQkJCUl0ZXJhdG9yIGxvYWRlZEl0ZXJhdG9yID0gbWFwTG9hZGVkLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IExJTktFRE1BUC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGxvYWRlZEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWFzc2VydFRydWUoImludmFsaWQgaXRlcmF0b3Igb3JkZXIiLCBsb2FkZWRJdGVyYXRvci5uZXh0KCkKLQkJCQkJCS5lcXVhbHMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJpbnZhbGlkIGl0ZXJhdG9yIHNpemUiLCAhaXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICAgICAgICAgIE1hcCBtYXBMb2FkZWQgPSAoTWFwKSBvYmpMb2FkZWQ7CisgICAgICAgICAgICBJdGVyYXRvciBsb2FkZWRJdGVyYXRvciA9IG1hcExvYWRlZC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBMSU5LRURNQVAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChsb2FkZWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJpbnZhbGlkIGl0ZXJhdG9yIG9yZGVyIiwgbG9hZGVkSXRlcmF0b3IubmV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGl0ZXJhdG9yLm5leHQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW52YWxpZCBpdGVyYXRvciBzaXplIiwgIWl0ZXJhdG9yLmhhc05leHQoKSk7CiAKLQkJCWxvYWRlZEl0ZXJhdG9yID0gbWFwTG9hZGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCWl0ZXJhdG9yID0gTElOS0VETUFQLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChsb2FkZWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlhc3NlcnRUcnVlKCJpbnZhbGlkIGVudHJ5IHNldCBpdGVyYXRvciBvcmRlciIsIGxvYWRlZEl0ZXJhdG9yCi0JCQkJCQkubmV4dCgpLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoImludmFsaWQgZW50cnkgc2V0IGl0ZXJhdG9yIHNpemUiLCAhaXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICAgICAgICAgIGxvYWRlZEl0ZXJhdG9yID0gbWFwTG9hZGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gTElOS0VETUFQLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChsb2FkZWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJpbnZhbGlkIGVudHJ5IHNldCBpdGVyYXRvciBvcmRlciIsIGxvYWRlZEl0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoImludmFsaWQgZW50cnkgc2V0IGl0ZXJhdG9yIHNpemUiLCAhaXRlcmF0b3IuaGFzTmV4dCgpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTGlua2VkSGFzaFNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfTGlua2VkSGFzaFNldCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKIAotCQlPYmplY3Qgb2JqVG9TYXZlID0gbnVsbDsKLQkJT2JqZWN0IG9iakxvYWRlZDsKKyAgICAgICAgT2JqZWN0IG9ialRvU2F2ZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBvYmpMb2FkZWQ7CiAKLQkJdHJ5IHsKLQkJCW9ialRvU2F2ZSA9IExJTktFRFNFVDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCi0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTElOS0VEU0VULmVxdWFscyhvYmpMb2FkZWQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9ialRvU2F2ZSA9IExJTktFRFNFVDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwgTElOS0VEU0VULmVxdWFscyhvYmpMb2FkZWQpKTsKIAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzZXJpYWxpemluZyAiICsgb2JqVG9TYXZlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiByZWFkaW5nIE9iamVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFcnJvciBlcnIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hlbiBvYmogPSAiICsgb2JqVG9TYXZlKTsKKyAgICAgICAgICAgIC8vIGVyci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVPYmplY3RfSWRlbnRpdHlIYXNoTWFwKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbS53cml0ZU9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9JZGVudGl0eUhhc2hNYXAoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAKLQkJSWRlbnRpdHlIYXNoTWFwIG9ialRvU2F2ZSA9IG51bGw7Ci0JCUlkZW50aXR5SGFzaE1hcCBvYmpMb2FkZWQ7CisgICAgICAgIElkZW50aXR5SGFzaE1hcCBvYmpUb1NhdmUgPSBudWxsOworICAgICAgICBJZGVudGl0eUhhc2hNYXAgb2JqTG9hZGVkOwogCi0JCXRyeSB7Ci0JCQlvYmpUb1NhdmUgPSBJREVOVElUWU1BUDsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOwotCQkJb2JqTG9hZGVkID0gKElkZW50aXR5SGFzaE1hcCkgZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJLy8gSGFzIHRvIGhhdmUgd29ya2VkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmpUb1NhdmUgPSBJREVOVElUWU1BUDsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgb2JqTG9hZGVkID0gKElkZW50aXR5SGFzaE1hcCkgZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gSGFzIHRvIGhhdmUgd29ya2VkCiAKLQkJCS8vIGEgc2VyaWFsaXplZCBpZGVudGl0eSBoYXNoIG1hcCB3aWxsIG5vdCBiZSBlcXVhbCB0byBpdHMgb3JpZ2luYWwKLQkJCS8vIGJlY2F1c2UgaXQgaXMgYW4gImlkZW50aXR5IiBtYXBwaW5nLAotCQkJLy8gc28gd2Ugc2ltcGx5IGNoZWNrIGZvciB0aGUgdXN1YWwgbWVhbmluZyBvZiBlcXVhbGl0eQorICAgICAgICAgICAgLy8gYSBzZXJpYWxpemVkIGlkZW50aXR5IGhhc2ggbWFwIHdpbGwgbm90IGJlIGVxdWFsIHRvIGl0cyBvcmlnaW5hbAorICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCBpcyBhbiAiaWRlbnRpdHkiIG1hcHBpbmcsCisgICAgICAgICAgICAvLyBzbyB3ZSBzaW1wbHkgY2hlY2sgZm9yIHRoZSB1c3VhbCBtZWFuaW5nIG9mIGVxdWFsaXR5CiAKLQkJCWFzc2VydEVxdWFscygKLQkJCQkJIkxvYWRlZCBJZGVudGl0eUhhc2hNYXAgaXMgbm90IG9mIHRoZSBzYW1lIHNpemUgYXMgdGhlIHNhdmVkIG9uZS4iLAotCQkJCQlvYmpUb1NhdmUuc2l6ZSgpLCBvYmpMb2FkZWQuc2l6ZSgpKTsKLQkJCUhhc2hNYXAgZHVwbGljYXRlU2F2ZWQgPSBuZXcgSGFzaE1hcCgpOwotCQkJZHVwbGljYXRlU2F2ZWQucHV0QWxsKG9ialRvU2F2ZSk7Ci0JCQlIYXNoTWFwIGR1cGxpY2F0ZUxvYWRlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkdXBsaWNhdGVMb2FkZWQucHV0QWxsKG9iakxvYWRlZCk7Ci0JCQlhc3NlcnRUcnVlKE1TR19URVNUX0ZBSUxFRCArIGR1cGxpY2F0ZVNhdmVkLCBkdXBsaWNhdGVTYXZlZAotCQkJCQkuZXF1YWxzKGR1cGxpY2F0ZUxvYWRlZCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2VyaWFsaXppbmcgIiArIG9ialRvU2F2ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gcmVhZGluZyBPYmplY3QgdHlwZTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoZW4gb2JqID0gIiArIG9ialRvU2F2ZSk7Ci0JCQkvLyBlcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlcnI7Ci0JCX0KLQl9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJMb2FkZWQgSWRlbnRpdHlIYXNoTWFwIGlzIG5vdCBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBzYXZlZCBvbmUuIiwKKyAgICAgICAgICAgICAgICAgICAgb2JqVG9TYXZlLnNpemUoKSwgb2JqTG9hZGVkLnNpemUoKSk7CisgICAgICAgICAgICBIYXNoTWFwIGR1cGxpY2F0ZVNhdmVkID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIGR1cGxpY2F0ZVNhdmVkLnB1dEFsbChvYmpUb1NhdmUpOworICAgICAgICAgICAgSGFzaE1hcCBkdXBsaWNhdGVMb2FkZWQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgZHVwbGljYXRlTG9hZGVkLnB1dEFsbChvYmpMb2FkZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBkdXBsaWNhdGVTYXZlZCwgZHVwbGljYXRlU2F2ZWQKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhkdXBsaWNhdGVMb2FkZWQpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNlcmlhbGl6aW5nICIgKyBvYmpUb1NhdmUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHJlYWRpbmcgT2JqZWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGVycikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGVuIG9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgLy8gZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0NS5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1NlcmlhbGl6YXRpb25TdHJlc3NUZXN0NS5qYXZhCmluZGV4IDljMDhkYzkuLjM5ZjllYTcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TZXJpYWxpemF0aW9uU3RyZXNzVGVzdDUuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU2VyaWFsaXphdGlvblN0cmVzc1Rlc3Q1LmphdmEKQEAgLTE3LDYgKzE3LDggQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0yNywzNTYgKzI5LDM1NyBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLmlvLlNlcmlhbGl6YWJsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3Q1IGV4dGVuZHMgU2VyaWFsaXphdGlvblN0cmVzc1Rlc3QgewogCi0JdHJhbnNpZW50IFRocm93YWJsZSBjdXJyZW50OworICAgIHRyYW5zaWVudCBUaHJvd2FibGUgY3VycmVudDsKIAotCS8vIFVzZSB0aGlzIGZvciByZXRyaWV2aW5nIGEgbGlzdCBvZiBhbnkgVGhyb3dhYmxlIENsYXNzZXMgdGhhdCBkaWQgbm90IGdldAotCS8vIHRlc3RlZC4KLQl0cmFuc2llbnQgVmVjdG9yIG1pc3NlZFYgPSBuZXcgVmVjdG9yKCk7CisgICAgLy8gVXNlIHRoaXMgZm9yIHJldHJpZXZpbmcgYSBsaXN0IG9mIGFueSBUaHJvd2FibGUgQ2xhc3NlcyB0aGF0IGRpZCBub3QgZ2V0CisgICAgLy8gdGVzdGVkLgorICAgIHRyYW5zaWVudCBWZWN0b3IgbWlzc2VkViA9IG5ldyBWZWN0b3IoKTsKIAotCXRyYW5zaWVudCBDbGFzc1tdW10gcGFyYW1zID0gbmV3IENsYXNzW11bXSB7IHsgU3RyaW5nLmNsYXNzIH0sCi0JCQl7IFRocm93YWJsZS5jbGFzcyB9LCB7IEV4Y2VwdGlvbi5jbGFzcyB9LAotCQkJeyBTdHJpbmcuY2xhc3MsIEV4Y2VwdGlvbi5jbGFzcyB9LCB7IFN0cmluZy5jbGFzcywgaW50LmNsYXNzIH0sCi0JCQl7IFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MgfSwKLQkJCXsgU3RyaW5nLmNsYXNzLCBFcnJvci5jbGFzcyB9LAotCQkJeyBpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3MsIGJvb2xlYW4uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzIH0sCi0JCQl7fSB9OworICAgIHRyYW5zaWVudCBDbGFzc1tdW10gcGFyYW1zID0gbmV3IENsYXNzW11bXSB7IHsgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICB7IFRocm93YWJsZS5jbGFzcyB9LCB7IEV4Y2VwdGlvbi5jbGFzcyB9LAorICAgICAgICAgICAgeyBTdHJpbmcuY2xhc3MsIEV4Y2VwdGlvbi5jbGFzcyB9LCB7IFN0cmluZy5jbGFzcywgaW50LmNsYXNzIH0sCisgICAgICAgICAgICB7IFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MgfSwKKyAgICAgICAgICAgIHsgU3RyaW5nLmNsYXNzLCBFcnJvci5jbGFzcyB9LAorICAgICAgICAgICAgeyBpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3MsIGJvb2xlYW4uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzIH0sCisgICAgICAgICAgICB7fSB9OwogCi0JdHJhbnNpZW50IE9iamVjdFtdW10gYXJncyA9IG5ldyBPYmplY3RbXVtdIHsKLQkJCXsgIm1lc3NhZ2UiIH0sCi0JCQl7IG5ldyBUaHJvd2FibGUoKSB9LAotCQkJeyBuZXcgRXhjZXB0aW9uKCJleGNlcHRpb24iKSB9LAotCQkJeyAibWVzc2FnZSIsIG5ldyBFeGNlcHRpb24oImV4Y2VwdGlvbiIpIH0sCi0JCQl7ICJtZXNzYWdlIiwgbmV3IEludGVnZXIoNSkgfSwKLQkJCXsgIm1lc3NhZ2UiLCAibWVzc2FnZSIsICJtZXNzYWdlIiB9LAotCQkJeyAibWVzc2FnZSIsIG5ldyBFcnJvcigiZXJyb3IiKSB9LAotCQkJeyBuZXcgSW50ZWdlcig1KSwgbmV3IEJvb2xlYW4oZmFsc2UpLCBuZXcgQm9vbGVhbihmYWxzZSksCi0JCQkJCW5ldyBJbnRlZ2VyKDUpLCBuZXcgSW50ZWdlcig1KSB9LCB7fSB9OworICAgIHRyYW5zaWVudCBPYmplY3RbXVtdIGFyZ3MgPSBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICB7ICJtZXNzYWdlIiB9LAorICAgICAgICAgICAgeyBuZXcgVGhyb3dhYmxlKCkgfSwKKyAgICAgICAgICAgIHsgbmV3IEV4Y2VwdGlvbigiZXhjZXB0aW9uIikgfSwKKyAgICAgICAgICAgIHsgIm1lc3NhZ2UiLCBuZXcgRXhjZXB0aW9uKCJleGNlcHRpb24iKSB9LAorICAgICAgICAgICAgeyAibWVzc2FnZSIsIG5ldyBJbnRlZ2VyKDUpIH0sCisgICAgICAgICAgICB7ICJtZXNzYWdlIiwgIm1lc3NhZ2UiLCAibWVzc2FnZSIgfSwKKyAgICAgICAgICAgIHsgIm1lc3NhZ2UiLCBuZXcgRXJyb3IoImVycm9yIikgfSwKKyAgICAgICAgICAgIHsgbmV3IEludGVnZXIoNSksIG5ldyBCb29sZWFuKGZhbHNlKSwgbmV3IEJvb2xlYW4oZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcig1KSwgbmV3IEludGVnZXIoNSkgfSwge30gfTsKIAotCXB1YmxpYyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQorICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uU3RyZXNzVGVzdDUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZU9iamVjdF9UaHJvd2FibGVzKCkgewotCQl0cnkgewotCQkJb29zLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3dyaXRlT2JqZWN0X1Rocm93YWJsZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJRmlsZSBqYXZhRGlyID0gZmluZEphdmFEaXIoKTsKKyAgICAgICAgRmlsZSBqYXZhRGlyID0gZmluZEphdmFEaXIoKTsKIAotCQlWZWN0b3IgY2xhc3NGaWxlc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKGphdmFEaXIgIT0gbnVsbCkKLQkJCWZpbmRDbGFzc0ZpbGVzKGphdmFEaXIsIGNsYXNzRmlsZXNWZWN0b3IpOwotCQllbHNlCi0JCQlmaW5kQ2xhc3NGaWxlc0Zyb21aaXAoY2xhc3NGaWxlc1ZlY3Rvcik7CisgICAgICAgIFZlY3RvciBjbGFzc0ZpbGVzVmVjdG9yID0gbmV3IFZlY3RvcigpOworICAgICAgICBpZiAoamF2YURpciAhPSBudWxsKQorICAgICAgICAgICAgZmluZENsYXNzRmlsZXMoamF2YURpciwgY2xhc3NGaWxlc1ZlY3Rvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbmRDbGFzc0ZpbGVzRnJvbVppcChjbGFzc0ZpbGVzVmVjdG9yKTsKIAotCQlpZiAoY2xhc3NGaWxlc1ZlY3Rvci5zaXplKCkgPT0gMCkgewotCQkJZmFpbCgiTm8gQ2xhc3MgRmlsZXMgRm91bmQuIik7Ci0JCX0KKyAgICAgICAgaWYgKGNsYXNzRmlsZXNWZWN0b3Iuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGZhaWwoIk5vIENsYXNzIEZpbGVzIEZvdW5kLiIpOworICAgICAgICB9CiAKLQkJRmlsZVtdIGNsYXNzRmlsZXNBcnJheSA9IG5ldyBGaWxlW2NsYXNzRmlsZXNWZWN0b3Iuc2l6ZSgpXTsKLQkJY2xhc3NGaWxlc1ZlY3Rvci5jb3B5SW50byhjbGFzc0ZpbGVzQXJyYXkpOworICAgICAgICBGaWxlW10gY2xhc3NGaWxlc0FycmF5ID0gbmV3IEZpbGVbY2xhc3NGaWxlc1ZlY3Rvci5zaXplKCldOworICAgICAgICBjbGFzc0ZpbGVzVmVjdG9yLmNvcHlJbnRvKGNsYXNzRmlsZXNBcnJheSk7CiAKLQkJQ2xhc3NbXSB0aHJvd2FibGVDbGFzc2VzID0gZmluZFRocm93YWJsZUNsYXNzZXMoY2xhc3NGaWxlc0FycmF5KTsKLQkJZmluZFBhcmFtKHRocm93YWJsZUNsYXNzZXMpOworICAgICAgICBDbGFzc1tdIHRocm93YWJsZUNsYXNzZXMgPSBmaW5kVGhyb3dhYmxlQ2xhc3NlcyhjbGFzc0ZpbGVzQXJyYXkpOworICAgICAgICBmaW5kUGFyYW0odGhyb3dhYmxlQ2xhc3Nlcyk7CiAKLQkJLy8gVXNlIHRoaXMgdG8gcHJpbnQgb3V0IHRoZSBsaXN0IG9mIFRocm93YWJsZSBjbGFzc2VzIHRoYXQgd2VyZW4ndAotCQkvLyB0ZXN0ZWQuCi0JCS8qCi0JCSAqIFN5c3RlbS5vdXQucHJpbnRsbigpOyBDbGFzc1tdIHRlbXAgPSBuZXcgQ2xhc3NbbWlzc2VkVi5zaXplKCldOwotCQkgKiBtaXNzZWRWLmNvcHlJbnRvKHRlbXApOyBmb3IgKGludCBpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspCi0JCSAqIFN5c3RlbS5vdXQucHJpbnRsbihpKzEgKyAiOiAiICsgdGVtcFtpXS5nZXROYW1lKCkpOwotCQkgKi8KLQl9CisgICAgICAgIC8vIFVzZSB0aGlzIHRvIHByaW50IG91dCB0aGUgbGlzdCBvZiBUaHJvd2FibGUgY2xhc3NlcyB0aGF0IHdlcmVuJ3QKKyAgICAgICAgLy8gdGVzdGVkLgorICAgICAgICAvKgorICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4oKTsgQ2xhc3NbXSB0ZW1wID0gbmV3IENsYXNzW21pc3NlZFYuc2l6ZSgpXTsKKyAgICAgICAgICogbWlzc2VkVi5jb3B5SW50byh0ZW1wKTsgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKQorICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4oaSsxICsgIjogIiArIHRlbXBbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICovCisgICAgfQogCi0JcHJpdmF0ZSBGaWxlW10gbWFrZUNsYXNzUGF0aEFycmF5KCkgewotCQlTdHJpbmcgY2xhc3NQYXRoOwotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlbmRvciIpLnN0YXJ0c1dpdGgoIklCTSIpKQotCQkJY2xhc3NQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLmhhcm1vbnkuYm9vdC5jbGFzcy5wYXRoIik7Ci0JCWVsc2UKLQkJCWNsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic3VuLmJvb3QuY2xhc3MucGF0aCIpOwotCQlpbnQgaW5zdGFuY2VPZlNlcCA9IC0xOwotCQlpbnQgbmV4dEluc3RhbmNlID0gY2xhc3NQYXRoLmluZGV4T2YoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwKLQkJCQlpbnN0YW5jZU9mU2VwICsgMSk7Ci0JCVZlY3RvciBlbG1zID0gbmV3IFZlY3RvcigpOwotCQl3aGlsZSAobmV4dEluc3RhbmNlICE9IC0xKSB7Ci0JCQllbG1zLmFkZChuZXcgRmlsZShjbGFzc1BhdGguc3Vic3RyaW5nKGluc3RhbmNlT2ZTZXAgKyAxLAotCQkJCQluZXh0SW5zdGFuY2UpKSk7Ci0JCQlpbnN0YW5jZU9mU2VwID0gbmV4dEluc3RhbmNlOwotCQkJbmV4dEluc3RhbmNlID0gY2xhc3NQYXRoLmluZGV4T2YoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwKLQkJCQkJaW5zdGFuY2VPZlNlcCArIDEpOwotCQl9Ci0JCWVsbXMuYWRkKG5ldyBGaWxlKGNsYXNzUGF0aC5zdWJzdHJpbmcoaW5zdGFuY2VPZlNlcCArIDEpKSk7Ci0JCUZpbGVbXSByZXN1bHQgPSBuZXcgRmlsZVtlbG1zLnNpemUoKV07Ci0JCWVsbXMuY29weUludG8ocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgcHJpdmF0ZSBGaWxlW10gbWFrZUNsYXNzUGF0aEFycmF5KCkgeworICAgICAgICBTdHJpbmcgY2xhc3NQYXRoOworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlbmRvciIpLnN0YXJ0c1dpdGgoIklCTSIpKQorICAgICAgICAgICAgY2xhc3NQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLmhhcm1vbnkuYm9vdC5jbGFzcy5wYXRoIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic3VuLmJvb3QuY2xhc3MucGF0aCIpOworICAgICAgICBpbnQgaW5zdGFuY2VPZlNlcCA9IC0xOworICAgICAgICBpbnQgbmV4dEluc3RhbmNlID0gY2xhc3NQYXRoLmluZGV4T2YoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwKKyAgICAgICAgICAgICAgICBpbnN0YW5jZU9mU2VwICsgMSk7CisgICAgICAgIFZlY3RvciBlbG1zID0gbmV3IFZlY3RvcigpOworICAgICAgICB3aGlsZSAobmV4dEluc3RhbmNlICE9IC0xKSB7CisgICAgICAgICAgICBlbG1zLmFkZChuZXcgRmlsZShjbGFzc1BhdGguc3Vic3RyaW5nKGluc3RhbmNlT2ZTZXAgKyAxLAorICAgICAgICAgICAgICAgICAgICBuZXh0SW5zdGFuY2UpKSk7CisgICAgICAgICAgICBpbnN0YW5jZU9mU2VwID0gbmV4dEluc3RhbmNlOworICAgICAgICAgICAgbmV4dEluc3RhbmNlID0gY2xhc3NQYXRoLmluZGV4T2YoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZlNlcCArIDEpOworICAgICAgICB9CisgICAgICAgIGVsbXMuYWRkKG5ldyBGaWxlKGNsYXNzUGF0aC5zdWJzdHJpbmcoaW5zdGFuY2VPZlNlcCArIDEpKSk7CisgICAgICAgIEZpbGVbXSByZXN1bHQgPSBuZXcgRmlsZVtlbG1zLnNpemUoKV07CisgICAgICAgIGVsbXMuY29weUludG8ocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlwcml2YXRlIEZpbGUgZmluZEphdmFEaXIoKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG1ha2VDbGFzc1BhdGhBcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCVN0cmluZ1tdIHRlbXBGaWxlTmFtZXMgPSBmaWxlc1tpXS5saXN0KCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZW1wRmlsZU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUZpbGUgdGVtcGZpbGUgPSBuZXcgRmlsZShmaWxlc1tpXSwgdGVtcEZpbGVOYW1lc1tqXSk7Ci0JCQkJCWlmICh0ZW1wZmlsZS5pc0RpcmVjdG9yeSgpCi0JCQkJCQkJJiYgdGVtcEZpbGVOYW1lc1tqXS5lcXVhbHMoImphdmEiKSkgewotCQkJCQkJU3RyaW5nW10gc3ViZGlyTmFtZXMgPSB0ZW1wZmlsZS5saXN0KCk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHN1YmRpck5hbWVzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJRmlsZSBzdWJkaXIgPSBuZXcgRmlsZSh0ZW1wZmlsZSwgc3ViZGlyTmFtZXNba10pOwotCQkJCQkJCWlmIChzdWJkaXIuaXNEaXJlY3RvcnkoKQotCQkJCQkJCQkJJiYgc3ViZGlyTmFtZXNba10uZXF1YWxzKCJsYW5nIikpIHsKLQkJCQkJCQkJcmV0dXJuIHRlbXBmaWxlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJpdmF0ZSBGaWxlIGZpbmRKYXZhRGlyKCkgeworICAgICAgICBGaWxlW10gZmlsZXMgPSBtYWtlQ2xhc3NQYXRoQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB0ZW1wRmlsZU5hbWVzID0gZmlsZXNbaV0ubGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVtcEZpbGVOYW1lcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHRlbXBmaWxlID0gbmV3IEZpbGUoZmlsZXNbaV0sIHRlbXBGaWxlTmFtZXNbal0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGZpbGUuaXNEaXJlY3RvcnkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRlbXBGaWxlTmFtZXNbal0uZXF1YWxzKCJqYXZhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN1YmRpck5hbWVzID0gdGVtcGZpbGUubGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzdWJkaXJOYW1lcy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgc3ViZGlyID0gbmV3IEZpbGUodGVtcGZpbGUsIHN1YmRpck5hbWVzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViZGlyLmlzRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHN1YmRpck5hbWVzW2tdLmVxdWFscygibGFuZyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGZpbmRDbGFzc0ZpbGVzKEZpbGUgZGlyLCBWZWN0b3IgdikgewotCQlTdHJpbmdbXSBjbGFzc0ZpbGVOYW1lcyA9IGRpci5saXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NGaWxlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgY2xhc3NGaWxlTmFtZXNbaV0pOwotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQlmaW5kQ2xhc3NGaWxlcyhmaWxlLCB2KTsKLQkJCWVsc2UgaWYgKGNsYXNzRmlsZU5hbWVzW2ldLmVuZHNXaXRoKCIuY2xhc3MiKSkKLQkJCQl2LmFkZChmaWxlKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgZmluZENsYXNzRmlsZXMoRmlsZSBkaXIsIFZlY3RvciB2KSB7CisgICAgICAgIFN0cmluZ1tdIGNsYXNzRmlsZU5hbWVzID0gZGlyLmxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0ZpbGVOYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBjbGFzc0ZpbGVOYW1lc1tpXSk7CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgICAgIGZpbmRDbGFzc0ZpbGVzKGZpbGUsIHYpOworICAgICAgICAgICAgZWxzZSBpZiAoY2xhc3NGaWxlTmFtZXNbaV0uZW5kc1dpdGgoIi5jbGFzcyIpKQorICAgICAgICAgICAgICAgIHYuYWRkKGZpbGUpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBDbGFzc1tdIGZpbmRUaHJvd2FibGVDbGFzc2VzKEZpbGVbXSBmaWxlcykgewotCQlDbGFzcyB0aHJDbGFzcyA9IFRocm93YWJsZS5jbGFzczsKLQkJVmVjdG9yIHJlc3VsdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJU3RyaW5nIHNsYXNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCQlTdHJpbmcgYmVnVGFyZ2V0ID0gc2xhc2ggKyAiamF2YSIgKyBzbGFzaDsKLQkJU3RyaW5nIGVuZFRhcmdldCA9ICIuY2xhc3MiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlc1tpXS5nZXRQYXRoKCk7Ci0JCQlpbnQgaW5zdE9mQmVnVGFyZ2V0ID0gZmlsZU5hbWUuaW5kZXhPZihiZWdUYXJnZXQpOwotCQkJaW50IGluc3RPZkVuZFRhcmdldCA9IGZpbGVOYW1lLmluZGV4T2YoZW5kVGFyZ2V0KTsKLQkJCWZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKGluc3RPZkJlZ1RhcmdldCArIDEsIGluc3RPZkVuZFRhcmdldCk7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2Uoc2xhc2guY2hhckF0KDApLCAnLicpOwotCQkJdHJ5IHsKLQkJCQlDbGFzcyB0aGVDbGFzcyA9IENsYXNzLmZvck5hbWUoZmlsZU5hbWUsIGZhbHNlLCBDbGFzc0xvYWRlcgotCQkJCQkJLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotCQkJCWlmICh0aHJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRoZUNsYXNzKSkgewotCQkJCQkvLyBqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciBpcyBhYnN0cmFjdC4KLQkJCQkJLy8gamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24gaXMgYWJzdHJhY3QKLQkJCQkJLy8gamF2YS5iZWFucy5Qcm9wZXJ0eVZldG9FeGNlcHRpb24gbmVlZHMgYQotCQkJCQkvLyBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQgYXMgYSBwYXJhbWV0ZXIKLQkJCQkJaWYgKCFmaWxlTmFtZS5lcXVhbHMoImphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yIikKLQkJCQkJCQkmJiAhZmlsZU5hbWUKLQkJCQkJCQkJCS5lcXVhbHMoImphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uIikKLQkJCQkJCQkmJiAhZmlsZU5hbWUKLQkJCQkJCQkJCS5lcXVhbHMoImphdmEuYmVhbnMuUHJvcGVydHlWZXRvRXhjZXB0aW9uIikpCi0JCQkJCQlyZXN1bHRWZWN0b3IuYWRkKHRoZUNsYXNzKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIDogIiArIGZpbGVOYW1lKTsKLQkJCX0KLQkJfQotCQlDbGFzc1tdIHJlc3VsdCA9IG5ldyBDbGFzc1tyZXN1bHRWZWN0b3Iuc2l6ZSgpXTsKLQkJcmVzdWx0VmVjdG9yLmNvcHlJbnRvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIHByaXZhdGUgQ2xhc3NbXSBmaW5kVGhyb3dhYmxlQ2xhc3NlcyhGaWxlW10gZmlsZXMpIHsKKyAgICAgICAgQ2xhc3MgdGhyQ2xhc3MgPSBUaHJvd2FibGUuY2xhc3M7CisgICAgICAgIFZlY3RvciByZXN1bHRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFN0cmluZyBzbGFzaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIGJlZ1RhcmdldCA9IHNsYXNoICsgImphdmEiICsgc2xhc2g7CisgICAgICAgIFN0cmluZyBlbmRUYXJnZXQgPSAiLmNsYXNzIjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZXNbaV0uZ2V0UGF0aCgpOworICAgICAgICAgICAgaW50IGluc3RPZkJlZ1RhcmdldCA9IGZpbGVOYW1lLmluZGV4T2YoYmVnVGFyZ2V0KTsKKyAgICAgICAgICAgIGludCBpbnN0T2ZFbmRUYXJnZXQgPSBmaWxlTmFtZS5pbmRleE9mKGVuZFRhcmdldCk7CisgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbnN0T2ZCZWdUYXJnZXQgKyAxLCBpbnN0T2ZFbmRUYXJnZXQpOworICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKHNsYXNoLmNoYXJBdCgwKSwgJy4nKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGZpbGVOYW1lLCBmYWxzZSwgQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0aGVDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IgaXMgYWJzdHJhY3QuCisgICAgICAgICAgICAgICAgICAgIC8vIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uIGlzIGFic3RyYWN0CisgICAgICAgICAgICAgICAgICAgIC8vIGphdmEuYmVhbnMuUHJvcGVydHlWZXRvRXhjZXB0aW9uIG5lZWRzIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGFzIGEgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZU5hbWUuZXF1YWxzKCJqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKCJqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKCJqYXZhLmJlYW5zLlByb3BlcnR5VmV0b0V4Y2VwdGlvbiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0VmVjdG9yLmFkZCh0aGVDbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiA6ICIgKyBmaWxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3NbXSByZXN1bHQgPSBuZXcgQ2xhc3NbcmVzdWx0VmVjdG9yLnNpemUoKV07CisgICAgICAgIHJlc3VsdFZlY3Rvci5jb3B5SW50byhyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotCXByaXZhdGUgdm9pZCBpbml0Q2xhc3MoQ2xhc3MgdGhyQywgaW50IG51bSkgewotCQlDb25zdHJ1Y3RvcltdIGNvbnMgPSB0aHJDLmdldENvbnN0cnVjdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJVGhyb3dhYmxlIG9iaiA9IChUaHJvd2FibGUpIGNvbnNbaV0ubmV3SW5zdGFuY2UoYXJnc1tudW1dKTsKLQkJCQl0X0NsYXNzKG9iaiwgbnVtKTsKLQkJCQlicmVhazsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVGhpcyBlcnJvciBzaG91bGQgYmUgY2F1Z2h0IHVudGlsIHRoZSBjb3JyZWN0IGFyZ3MgaXMgaGl0LgotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGluc3RhbmNlIG9mOiAiCi0JCQkJCQkJCSsgdGhyQy5nZXROYW1lKCkpOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGluc3RhbmNlIG9mOiAiCi0JCQkJCQkJCSsgdGhyQy5nZXROYW1lKCkpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGluc3RhbmNlIG9mOiAiCi0JCQkJCQkJCSsgdGhyQy5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGkgPT0gY29ucy5sZW5ndGggLSAxKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJGYWlsZWQgdG8gY3JlYXRlIG5ld0luc3RhbmNlIG9mOiAiICsgdGhyQy5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBpbml0Q2xhc3MoQ2xhc3MgdGhyQywgaW50IG51bSkgeworICAgICAgICBDb25zdHJ1Y3RvcltdIGNvbnMgPSB0aHJDLmdldENvbnN0cnVjdG9ycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlIG9iaiA9IChUaHJvd2FibGUpIGNvbnNbaV0ubmV3SW5zdGFuY2UoYXJnc1tudW1dKTsKKyAgICAgICAgICAgICAgICB0X0NsYXNzKG9iaiwgbnVtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBlcnJvciBzaG91bGQgYmUgY2F1Z2h0IHVudGlsIHRoZSBjb3JyZWN0IGFyZ3MgaXMgaGl0LgorICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGluc3RhbmNlIG9mOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyQy5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGluc3RhbmNlIG9mOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyQy5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGluc3RhbmNlIG9mOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyQy5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gY29ucy5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIG5ld0luc3RhbmNlIG9mOiAiICsgdGhyQy5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXREdW1wTmFtZSgpIHsKLQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkgewotCQkJZHVtcENvdW50Kys7Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBnZXROYW1lKCkgKyAiXyIgKyBjdXJyZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldER1bXBOYW1lKCkgeworICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBkdW1wQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKSArICJfIiArIGN1cnJlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHRfQ2xhc3MoVGhyb3dhYmxlIG9ialRvU2F2ZSwgaW50IGFyZ3NOdW0pIHsKLQkJY3VycmVudCA9IG9ialRvU2F2ZTsKLQkJT2JqZWN0IG9iakxvYWRlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmogPSAiICsgb2JqVG9TYXZlKTsKLQkJCXRyeSB7Ci0JCQkJb2JqTG9hZGVkID0gZHVtcEFuZFJlbG9hZChvYmpUb1NhdmUpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBNdXN0IGJlIHVzaW5nIHhsb2FkLCBpZ25vcmUgbWlzc2luZyBUaHJvd2FibGVzCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJZ25vcmluZzogIgotCQkJCQkJKyBvYmpUb1NhdmUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICBwcml2YXRlIHZvaWQgdF9DbGFzcyhUaHJvd2FibGUgb2JqVG9TYXZlLCBpbnQgYXJnc051bSkgeworICAgICAgICBjdXJyZW50ID0gb2JqVG9TYXZlOworICAgICAgICBPYmplY3Qgb2JqTG9hZGVkID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiA9ICIgKyBvYmpUb1NhdmUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvYmpMb2FkZWQgPSBkdW1wQW5kUmVsb2FkKG9ialRvU2F2ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgdXNpbmcgeGxvYWQsIGlnbm9yZSBtaXNzaW5nIFRocm93YWJsZXMKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklnbm9yaW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG9ialRvU2F2ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQkvLyBIYXMgdG8gaGF2ZSB3b3JrZWQKLQkJCWJvb2xlYW4gZXF1YWxzOwotCQkJZXF1YWxzID0gb2JqVG9TYXZlLmdldENsYXNzKCkuZXF1YWxzKG9iakxvYWRlZC5nZXRDbGFzcygpKTsKLQkJCWFzc2VydFRydWUoTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQkJaWYgKGFyZ3NOdW0gPT0gMCB8fCAoYXJnc051bSA+PSAzICYmIGFyZ3NOdW0gPD0gNykpIHsKLQkJCQllcXVhbHMgPSAoKFRocm93YWJsZSkgb2JqVG9TYXZlKS5nZXRNZXNzYWdlKCkuZXF1YWxzKAotCQkJCQkJKChUaHJvd2FibGUpIG9iakxvYWRlZCkuZ2V0TWVzc2FnZSgpKTsKLQkJCQlhc3NlcnRUcnVlKCJNZXNzYWdlIFRlc3Q6ICIgKyBNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsCi0JCQkJCQllcXVhbHMpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKChUaHJvd2FibGUpb2JqVG9TYXZlKS5nZXRNZXNzYWdlKCkpOwotCQkJCWVxdWFscyA9ICgoVGhyb3dhYmxlKSBvYmpUb1NhdmUpLmdldE1lc3NhZ2UoKSA9PSBudWxsOwotCQkJCWFzc2VydFRydWUoIk51bGwgVGVzdCAxOiAoYXJncz0iICsgYXJnc051bSArICIpICIKLQkJCQkJCSsgTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQkJCWVxdWFscyA9ICgoVGhyb3dhYmxlKSBvYmpMb2FkZWQpLmdldE1lc3NhZ2UoKSA9PSBudWxsOwotCQkJCWFzc2VydFRydWUoIk51bGwgVGVzdCAyOiAoYXJncz0iICsgYXJnc051bSArICIpICIKLQkJCQkJCSsgTVNHX1RFU1RfRkFJTEVEICsgb2JqVG9TYXZlLCBlcXVhbHMpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIGluIGNoZWNrSXQoKSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkgKyAiIC0gdGVzdGluZyAiICsgb2JqVG9TYXZlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIEhhcyB0byBoYXZlIHdvcmtlZAorICAgICAgICAgICAgYm9vbGVhbiBlcXVhbHM7CisgICAgICAgICAgICBlcXVhbHMgPSBvYmpUb1NhdmUuZ2V0Q2xhc3MoKS5lcXVhbHMob2JqTG9hZGVkLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgICAgICBpZiAoYXJnc051bSA9PSAwIHx8IChhcmdzTnVtID49IDMgJiYgYXJnc051bSA8PSA3KSkgeworICAgICAgICAgICAgICAgIGVxdWFscyA9ICgoVGhyb3dhYmxlKSBvYmpUb1NhdmUpLmdldE1lc3NhZ2UoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAoKFRocm93YWJsZSkgb2JqTG9hZGVkKS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk1lc3NhZ2UgVGVzdDogIiArIE1TR19URVNUX0ZBSUxFRCArIG9ialRvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigoKFRocm93YWJsZSlvYmpUb1NhdmUpLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgZXF1YWxzID0gKChUaHJvd2FibGUpIG9ialRvU2F2ZSkuZ2V0TWVzc2FnZSgpID09IG51bGw7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTnVsbCBUZXN0IDE6IChhcmdzPSIgKyBhcmdzTnVtICsgIikgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgICAgICAgICAgZXF1YWxzID0gKChUaHJvd2FibGUpIG9iakxvYWRlZCkuZ2V0TWVzc2FnZSgpID09IG51bGw7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTnVsbCBUZXN0IDI6IChhcmdzPSIgKyBhcmdzTnVtICsgIikgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBNU0dfVEVTVF9GQUlMRUQgKyBvYmpUb1NhdmUsIGVxdWFscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gaW4gY2hlY2tJdCgpIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSArICIgLSB0ZXN0aW5nICIgKyBvYmpUb1NhdmUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGZpbmRQYXJhbShDbGFzc1tdIHRockMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJDLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb25zdHJ1Y3RvciBjb24gPSBudWxsOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMubGVuZ3RoOyBqKyspIHsKLQkJCQl0cnkgewotCQkJCQljb24gPSB0aHJDW2ldLmdldENvbnN0cnVjdG9yKHBhcmFtc1tqXSk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVGhpcyBFcnJvciB3aWxsIGJlIGNhdWdodCB1bnRpbCB0aGUgcmlnaHQgcGFyYW0gaXMgZm91bmQuCi0JCQkJfQorICAgIHByaXZhdGUgdm9pZCBmaW5kUGFyYW0oQ2xhc3NbXSB0aHJDKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyQy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29uID0gdGhyQ1tpXS5nZXRDb25zdHJ1Y3RvcihwYXJhbXNbal0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgRXJyb3Igd2lsbCBiZSBjYXVnaHQgdW50aWwgdGhlIHJpZ2h0IHBhcmFtIGlzIGZvdW5kLgorICAgICAgICAgICAgICAgIH0KIAotCQkJCWlmIChjb24gIT0gbnVsbCkgewotCQkJCQkvLyBJZiB0aGUgcGFyYW0gd2FzIGZvdW5kLCBpbml0aWFsaXplIHRoZSBDbGFzcwotCQkJCQlpbml0Q2xhc3ModGhyQ1tpXSwgaik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBJZiB0aGUgcGFyYW0gbm90IGZvdW5kIHRoZW4gYWRkIHRvIG1pc3NlZCBWZWN0b3IuCi0JCQkJaWYgKGogPT0gcGFyYW1zLmxlbmd0aCAtIDEpCi0JCQkJCW1pc3NlZFYuYWRkKHRockNbaV0pOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICAgIGlmIChjb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFyYW0gd2FzIGZvdW5kLCBpbml0aWFsaXplIHRoZSBDbGFzcworICAgICAgICAgICAgICAgICAgICBpbml0Q2xhc3ModGhyQ1tpXSwgaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFyYW0gbm90IGZvdW5kIHRoZW4gYWRkIHRvIG1pc3NlZCBWZWN0b3IuCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcGFyYW1zLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgICAgIG1pc3NlZFYuYWRkKHRockNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGZpbmRDbGFzc0ZpbGVzRnJvbVppcChWZWN0b3IgdikgewotCQlTdHJpbmcgc2xhc2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JCVN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0JCWlmICghamF2YUhvbWUuZW5kc1dpdGgoc2xhc2gpKQotCQkJamF2YUhvbWUgKz0gc2xhc2g7CisgICAgcHJpdmF0ZSB2b2lkIGZpbmRDbGFzc0ZpbGVzRnJvbVppcChWZWN0b3IgdikgeworICAgICAgICBTdHJpbmcgc2xhc2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7CisgICAgICAgIFN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7CisgICAgICAgIGlmICghamF2YUhvbWUuZW5kc1dpdGgoc2xhc2gpKQorICAgICAgICAgICAgamF2YUhvbWUgKz0gc2xhc2g7CiAKLQkJU3RyaW5nW10gd2FudGVkID0geyAiamF2YSIgKyBzbGFzaCArICJpbyIsICJqYXZhIiArIHNsYXNoICsgImxhbmciLAotCQkJCSJqYXZhIiArIHNsYXNoICsgIm1hdGgiLCAiamF2YSIgKyBzbGFzaCArICJuZXQiLAotCQkJCSJqYXZhIiArIHNsYXNoICsgInNlY3VyaXR5IiwgImphdmEiICsgc2xhc2ggKyAidGV4dCIsCi0JCQkJImphdmEiICsgc2xhc2ggKyAidXRpbCIsICJqYXZhIiArIHNsYXNoICsgImJlYW5zIiwKLQkJCQkiamF2YSIgKyBzbGFzaCArICJybWkiLAotCQkJCS8vIE9uZSBvciBtb3JlIGNsYXNzIGZpbGVzIGluIGF3dCBtYWtlIHRoZSBWTSBoYW5nIGFmdGVyIGJlaW5nCi0JCQkJLy8gbG9hZGVkLgotCQkJCS8vICJqYXZhIiArIHNsYXNoICsgImF3dCIsCi0JCQkJImphdmEiICsgc2xhc2ggKyAic3FsIiwKLQkJLy8gVGhlc2UgYXJlIChwb3NzaWJseSkgYWxsIG9mIHRoZSB0aHJvd2FibGUgY2xhc3NlcyBpbiBhd3QKLQkJLyoKLQkJICogImphdmFcXGF3dFxcQVdURXJyb3IiLCAiamF2YVxcYXd0XFxBV1RFeGNlcHRpb24iLAotCQkgKiAiamF2YVxcYXd0XFxjb2xvclxcQ01NRXhjZXB0aW9uIiwKLQkJICogImphdmFcXGF3dFxcY29sb3JcXFByb2ZpbGVEYXRhRXhjZXB0aW9uIiwKLQkJICogImphdmFcXGF3dFxcZGF0YXRyYW5zZmVyXFxNaW1lVHlwZVBhcnNlRXhjZXB0aW9uIiwKLQkJICogImphdmFcXGF3dFxcZGF0YXRyYW5zZmVyXFxVbnN1cHBvcnRlZEZsYXZvckV4Y2VwdGlvbiIsCi0JCSAqICJqYXZhXFxhd3RcXGRuZFxcSW52YWxpZERuRE9wZXJhdGlvbkV4Y2VwdGlvbiIsCi0JCSAqICJqYXZhXFxhd3RcXEZvbnRGb3JtYXRFeGNlcHRpb24iLAotCQkgKiAiamF2YVxcYXd0XFxnZW9tXFxJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uIiwKLQkJICogImphdmFcXGF3dFxcZ2VvbVxcTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiIsCi0JCSAqICJqYXZhXFxhd3RcXElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiIsCi0JCSAqICJqYXZhXFxhd3RcXGltYWdlXFxJbWFnaW5nT3BFeGNlcHRpb24iLAotCQkgKiAiamF2YVxcYXd0XFxpbWFnZVxcUmFzdGVyRm9ybWF0RXhjZXB0aW9uIiwKLQkJICogImphdmFcXGF3dFxccHJpbnRcXFByaW50ZXJBYm9ydEV4Y2VwdGlvbiIsCi0JCSAqICJqYXZhXFxhd3RcXHByaW50XFxQcmludGVyRXhjZXB0aW9uIiwKLQkJICogImphdmFcXGF3dFxccHJpbnRcXFByaW50ZXJJT0V4Y2VwdGlvbiIKLQkJICovCi0JCX07CisgICAgICAgIFN0cmluZ1tdIHdhbnRlZCA9IHsgImphdmEiICsgc2xhc2ggKyAiaW8iLCAiamF2YSIgKyBzbGFzaCArICJsYW5nIiwKKyAgICAgICAgICAgICAgICAiamF2YSIgKyBzbGFzaCArICJtYXRoIiwgImphdmEiICsgc2xhc2ggKyAibmV0IiwKKyAgICAgICAgICAgICAgICAiamF2YSIgKyBzbGFzaCArICJzZWN1cml0eSIsICJqYXZhIiArIHNsYXNoICsgInRleHQiLAorICAgICAgICAgICAgICAgICJqYXZhIiArIHNsYXNoICsgInV0aWwiLCAiamF2YSIgKyBzbGFzaCArICJiZWFucyIsCisgICAgICAgICAgICAgICAgImphdmEiICsgc2xhc2ggKyAicm1pIiwKKyAgICAgICAgICAgICAgICAvLyBPbmUgb3IgbW9yZSBjbGFzcyBmaWxlcyBpbiBhd3QgbWFrZSB0aGUgVk0gaGFuZyBhZnRlciBiZWluZworICAgICAgICAgICAgICAgIC8vIGxvYWRlZC4KKyAgICAgICAgICAgICAgICAvLyAiamF2YSIgKyBzbGFzaCArICJhd3QiLAorICAgICAgICAgICAgICAgICJqYXZhIiArIHNsYXNoICsgInNxbCIsCisgICAgICAgIC8vIFRoZXNlIGFyZSAocG9zc2libHkpIGFsbCBvZiB0aGUgdGhyb3dhYmxlIGNsYXNzZXMgaW4gYXd0CisgICAgICAgIC8qCisgICAgICAgICAqICJqYXZhXFxhd3RcXEFXVEVycm9yIiwgImphdmFcXGF3dFxcQVdURXhjZXB0aW9uIiwKKyAgICAgICAgICogImphdmFcXGF3dFxcY29sb3JcXENNTUV4Y2VwdGlvbiIsCisgICAgICAgICAqICJqYXZhXFxhd3RcXGNvbG9yXFxQcm9maWxlRGF0YUV4Y2VwdGlvbiIsCisgICAgICAgICAqICJqYXZhXFxhd3RcXGRhdGF0cmFuc2ZlclxcTWltZVR5cGVQYXJzZUV4Y2VwdGlvbiIsCisgICAgICAgICAqICJqYXZhXFxhd3RcXGRhdGF0cmFuc2ZlclxcVW5zdXBwb3J0ZWRGbGF2b3JFeGNlcHRpb24iLAorICAgICAgICAgKiAiamF2YVxcYXd0XFxkbmRcXEludmFsaWREbkRPcGVyYXRpb25FeGNlcHRpb24iLAorICAgICAgICAgKiAiamF2YVxcYXd0XFxGb250Rm9ybWF0RXhjZXB0aW9uIiwKKyAgICAgICAgICogImphdmFcXGF3dFxcZ2VvbVxcSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAqICJqYXZhXFxhd3RcXGdlb21cXE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24iLAorICAgICAgICAgKiAiamF2YVxcYXd0XFxJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24iLAorICAgICAgICAgKiAiamF2YVxcYXd0XFxpbWFnZVxcSW1hZ2luZ09wRXhjZXB0aW9uIiwKKyAgICAgICAgICogImphdmFcXGF3dFxcaW1hZ2VcXFJhc3RlckZvcm1hdEV4Y2VwdGlvbiIsCisgICAgICAgICAqICJqYXZhXFxhd3RcXHByaW50XFxQcmludGVyQWJvcnRFeGNlcHRpb24iLAorICAgICAgICAgKiAiamF2YVxcYXd0XFxwcmludFxcUHJpbnRlckV4Y2VwdGlvbiIsCisgICAgICAgICAqICJqYXZhXFxhd3RcXHByaW50XFxQcmludGVySU9FeGNlcHRpb24iCisgICAgICAgICAqLworICAgICAgICB9OwogCi0JCUZpbGVbXSBmaWxlcyA9IG1ha2VDbGFzc1BhdGhBcnJheSgpOwotCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKLQkJWmlwRW50cnkgemUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlc1tpXS5nZXRQYXRoKCk7Ci0JCQlpZiAoZmlsZXNbaV0uZXhpc3RzKCkgJiYgZmlsZXNbaV0uaXNGaWxlKCkKLQkJCQkJJiYgZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLnppcCIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlc1tpXS5nZXRQYXRoKCkpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWZhaWwoIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB0cnlpbmcgdG8gb3BlbiAiCi0JCQkJCQkJKyBmaWxlc1tpXS5nZXRQYXRoKCkpOwotCQkJCX0KLQkJCQl6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0oZmlzKTsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQl0cnkgewotCQkJCQkJemUgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZhaWwoIklPRXhjZXB0aW9uIHdoaWxlIGdldHRpbmcgbmV4dCB6aXAgZW50cnk6ICIKLQkJCQkJCQkJKyBlKTsKLQkJCQkJfQotCQkJCQlpZiAoemUgPT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCQlTdHJpbmcgemVOYW1lID0gemUuZ2V0TmFtZSgpOwotCQkJCQlpZiAoemVOYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCQkJCQkJemVOYW1lID0gemVOYW1lLnJlcGxhY2UoJy8nLCBzbGFzaC5jaGFyQXQoMCkpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3YW50ZWQubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQlpZiAoemVOYW1lLnN0YXJ0c1dpdGgod2FudGVkW2pdKSkgewotCQkJCQkJCQkvLyBXaGVuIGZpbmRpbmcgY2xhc3MgZmlsZXMgZnJvbSBkaXJlY3RvcmllcyB0aGUKLQkJCQkJCQkJLy8gcHJvZ3JhbSBzYXZlcyB0aGVtIGFzIGZpbGVzLgotCQkJCQkJCQkvLyBUbyBzdGF5IGNvbnNpc3RlbnQgd2Ugd2lsbCB0dXJuIHRoZSBaaXBFbnRyeQotCQkJCQkJCQkvLyBjbGFzc2VzIGludG8gaW5zdGFuY2VzIG9mIGZpbGVzLgotCQkJCQkJCQlGaWxlIHRlbXBGID0gbmV3IEZpbGUoamF2YUhvbWUgKyB6ZU5hbWUpOwotCQkJCQkJCQkvLyBNYWtpbmcgc3VyZSB0aGF0IHRoZSBzYW1lIGNsYXNzIGlzIG5vdCBhZGRlZAotCQkJCQkJCQkvLyB0d2ljZS4KLQkJCQkJCQkJYm9vbGVhbiBkdXBsaWNhdGUgPSBmYWxzZTsKLQkJCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB2LnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCQlpZiAodi5nZXQoaykuZXF1YWxzKHRlbXBGKSkKLQkJCQkJCQkJCQlkdXBsaWNhdGUgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghZHVwbGljYXRlKQotCQkJCQkJCQkJdi5hZGQodGVtcEYpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJOwotCQkJCXRyeSB7Ci0JCQkJCXppcy5jbG9zZSgpOwotCQkJCQlmaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWZhaWwoCi0JCQkJCQkJIklPRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBjbG9zZSBJbnB1dFN0cmVhbXM6ICIKLQkJCQkJCQkJCSsgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICBGaWxlW10gZmlsZXMgPSBtYWtlQ2xhc3NQYXRoQXJyYXkoKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIFppcElucHV0U3RyZWFtIHppcyA9IG51bGw7CisgICAgICAgIFppcEVudHJ5IHplID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZXNbaV0uZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmV4aXN0cygpICYmIGZpbGVzW2ldLmlzRmlsZSgpCisgICAgICAgICAgICAgICAgICAgICYmIGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi56aXAiKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZXNbaV0uZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJGaWxlTm90Rm91bmRFeGNlcHRpb24gdHJ5aW5nIHRvIG9wZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZXNbaV0uZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgemlzID0gbmV3IFppcElucHV0U3RyZWFtKGZpcyk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHplID0gemlzLmdldE5leHRFbnRyeSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiB3aGlsZSBnZXR0aW5nIG5leHQgemlwIGVudHJ5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHplID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHplTmFtZSA9IHplLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHplTmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHplTmFtZSA9IHplTmFtZS5yZXBsYWNlKCcvJywgc2xhc2guY2hhckF0KDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd2FudGVkLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHplTmFtZS5zdGFydHNXaXRoKHdhbnRlZFtqXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBmaW5kaW5nIGNsYXNzIGZpbGVzIGZyb20gZGlyZWN0b3JpZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2dyYW0gc2F2ZXMgdGhlbSBhcyBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gc3RheSBjb25zaXN0ZW50IHdlIHdpbGwgdHVybiB0aGUgWmlwRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NlcyBpbnRvIGluc3RhbmNlcyBvZiBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB0ZW1wRiA9IG5ldyBGaWxlKGphdmFIb21lICsgemVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFraW5nIHN1cmUgdGhhdCB0aGUgc2FtZSBjbGFzcyBpcyBub3QgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHdpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZHVwbGljYXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdi5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuZ2V0KGspLmVxdWFscyh0ZW1wRikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuYWRkKHRlbXBGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB6aXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGlsZSB0cnlpbmcgdG8gY2xvc2UgSW5wdXRTdHJlYW1zOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IGZmZDhiNGYuLjUwNzc2NTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNjQgKzE3LDg4IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24jU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiNTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBkb2VzIG5vdCBjaGVja3MgY29uc3RydWN0b3IgZnVuY3Rpb25hbGl0eSAoZG9pbmcgdGhpcyBpbmRpcmVjdGx5IGFuZCB3aGljaCBjb25zdHJ1Y3RvciB1c2VkIG5vbiBvYnZpb3VzKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbigpCiAKLQkJdHJ5IHsKLQkJCU9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbSgKLQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCQkJCSJrTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMbCIKLQkJCQkJCQkJCS5nZXRCeXRlcygpKSk7Ci0JCQlvaXMucmVhZE9iamVjdCgpOwotCQl9IGNhdGNoIChTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gQ29ycmVjdAotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIGZvciBub24gc2VyaWFsaXplZCBzdHJlYW0iKTsKLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTGwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENvcnJlY3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiBmb3Igbm9uIHNlcmlhbGl6ZWQgc3RyZWFtIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uI1N0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCi0JCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQkJCQkia0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTGwiCi0JCQkJCQkJCQkuZ2V0Qnl0ZXMoKSkpOwotCQkJb2lzLnJlYWRPYmplY3QoKTsKLQkJfSBjYXRjaCAoU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvcnJlY3QKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiBmb3Igbm9uIHNlcmlhbGl6ZWQgc3RyZWFtIik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiNTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsIAorICAgICAgcHVycG9zZSA9ICJUZXN0IGRvZXMgbm90IGNoZWNrcyBjb25zdHJ1Y3RvciBmdW5jdGlvbmFsaXR5IChkb2luZyB0aGlzIGluZGlyZWN0bHkgYW5kIHdoaWNoIGNvbnN0cnVjdG9yIHVzZWQgbm9uIG9idmlvdXMpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTGwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENvcnJlY3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiBmb3Igbm9uIHNlcmlhbGl6ZWQgc3RyZWFtIik7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3RyZWFtVG9rZW5pemVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmVhbVRva2VuaXplclRlc3QuamF2YQppbmRleCAxNTdmZjk5Li42ODBlZGE2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3RyZWFtVG9rZW5pemVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TdHJlYW1Ub2tlbml6ZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC0zNSwyNzQgKzQwLDQxMCBAQAogLy8gdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtIGZvciBleGFtcGxlLgogLy8gVGhpcyBnaXZlcyBtdWNoIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlcy4KIAorQFRlc3RUYXJnZXRDbGFzcyhTdHJlYW1Ub2tlbml6ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFN0cmVhbVRva2VuaXplclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewotCVN1cHBvcnRfU3RyaW5nUmVhZGVyIHI7CisgICAgU3VwcG9ydF9TdHJpbmdSZWFkZXIgcjsKIAotCVN0cmVhbVRva2VuaXplciBzdDsKKyAgICBTdHJlYW1Ub2tlbml6ZXIgc3Q7CiAKLQlTdHJpbmcgdGVzdFN0cmluZzsKKyAgICBTdHJpbmcgdGVzdFN0cmluZzsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNTdHJlYW1Ub2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdCA9IG5ldyBTdHJlYW1Ub2tlbml6ZXIobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKAotCQkJCSIvY29tbWVudHNcbiBkIDggJ2gnIikpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNTdHJlYW1Ub2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1Ub2tlbml6ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3QgPSBuZXcgU3RyZWFtVG9rZW5pemVyKG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAiL2NvbW1lbnRzXG4gZCA4ICdoJyIpKTsKIAotCQlhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgbGV0dGVyIGQiLAotCQkJICAgICBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRCwgc3QubmV4dFRva2VuKCkpOwotCQlhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgbGV0dGVyIGQiLAotCQkJICAgICAiZCIsIHN0LnN2YWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgbGV0dGVyIGQiLAorICAgICAgICAgICAgICAgICBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRCwgc3QubmV4dFRva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgbGV0dGVyIGQiLAorICAgICAgICAgICAgICAgICAiZCIsIHN0LnN2YWwpOwogCi0JCWFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBkaWdpdCA4IiwKLQkJCSAgICAgU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUiwgc3QubmV4dFRva2VuKCkpOwotCQlhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgZGlnaXQgOCIsCi0JCQkgICAgIDguMCwgc3QubnZhbCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBkaWdpdCA4IiwKKyAgICAgICAgICAgICAgICAgU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUiwgc3QubmV4dFRva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgZGlnaXQgOCIsCisgICAgICAgICAgICAgICAgIDguMCwgc3QubnZhbCk7CiAKLQkJYXNzZXJ0RXF1YWxzKCJ0aGUgbmV4dCB0b2tlbiByZXR1cm5lZCBzaG91bGQgYmUgdGhlIHF1b3RlIGNoYXJhY3RlciIsCi0JCQkgICAgIDM5LCBzdC5uZXh0VG9rZW4oKSk7Ci0JCWFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBxdW90ZSBjaGFyYWN0ZXIiLAotCQkJICAgICAiaCIsIHN0LnN2YWwpOwotCX0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgbmV4dCB0b2tlbiByZXR1cm5lZCBzaG91bGQgYmUgdGhlIHF1b3RlIGNoYXJhY3RlciIsCisgICAgICAgICAgICAgICAgIDM5LCBzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBxdW90ZSBjaGFyYWN0ZXIiLAorICAgICAgICAgICAgICAgICAiaCIsIHN0LnN2YWwpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNTdHJlYW1Ub2tlbml6ZXIoamF2YS5pby5SZWFkZXIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX1JlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNldFRlc3QoIi90ZXN0aW5nXG4gZCA4ICdoJyAiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aGUgbmV4dCB0b2tlbiByZXR1cm5lZCBzaG91bGQgYmUgdGhlIGxldHRlciBkIHNraXBwaW5nIHRoZSBjb21tZW50cyIsCi0JCQkgICAgIFN0cmVhbVRva2VuaXplci5UVF9XT1JELCBzdC5uZXh0VG9rZW4oKSk7Ci0JCWFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBsZXR0ZXIgZCIsCi0JCQkgICAgICJkIiwgc3Quc3ZhbCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI1N0cmVhbVRva2VuaXplcihqYXZhLmlvLlJlYWRlcikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJlYW1Ub2tlbml6ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5SZWFkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19SZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRUZXN0KCIvdGVzdGluZ1xuIGQgOCAnaCcgIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBsZXR0ZXIgZCBza2lwcGluZyB0aGUgY29tbWVudHMiLAorICAgICAgICAgICAgICAgICBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRCwgc3QubmV4dFRva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgbGV0dGVyIGQiLAorICAgICAgICAgICAgICAgICAiZCIsIHN0LnN2YWwpOwogCi0JCWFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBkaWdpdCA4IiwKLQkJCSAgICAgU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUiwgc3QubmV4dFRva2VuKCkpOwotCQlhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgZGlnaXQgOCIsCi0JCQkgICAgIDguMCwgc3QubnZhbCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBkaWdpdCA4IiwKKyAgICAgICAgICAgICAgICAgU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUiwgc3QubmV4dFRva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgZGlnaXQgOCIsCisgICAgICAgICAgICAgICAgIDguMCwgc3QubnZhbCk7CiAKLQkJYXNzZXJ0RXF1YWxzKCJ0aGUgbmV4dCB0b2tlbiByZXR1cm5lZCBzaG91bGQgYmUgdGhlIHF1b3RlIGNoYXJhY3RlciIsCi0JCQkgICAgIDM5LCBzdC5uZXh0VG9rZW4oKSk7Ci0JCWFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBxdW90ZSBjaGFyYWN0ZXIiLAotCQkJICAgICAiaCIsIHN0LnN2YWwpOwotCX0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgbmV4dCB0b2tlbiByZXR1cm5lZCBzaG91bGQgYmUgdGhlIHF1b3RlIGNoYXJhY3RlciIsCisgICAgICAgICAgICAgICAgIDM5LCBzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBxdW90ZSBjaGFyYWN0ZXIiLAorICAgICAgICAgICAgICAgICAiaCIsIHN0LnN2YWwpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNjb21tZW50Q2hhcihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jb21tZW50Q2hhckkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzZXRUZXN0KCIqY29tbWVudCBcbiAvIDggJ2gnICIpOwotCQlzdC5vcmRpbmFyeUNoYXIoJy8nKTsKLQkJc3QuY29tbWVudENoYXIoJyonKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXh0VG9rZW4oKSBkaWQgbm90IHJldHVybiB0aGUgY2hhcmFjdGVyIC8gc2tpcGluZyB0aGUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCAqIiwKLQkJCSAgICAgNDcsIHN0Lm5leHRUb2tlbigpKTsKLQkJYXNzZXJ0VHJ1ZSgidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBkaWdpdCA4Iiwgc3QKLQkJCSAgIC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSCi0JCQkgICAmJiBzdC5udmFsID09IDguMCk7Ci0JCWFzc2VydFRydWUoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgcXVvdGUgY2hhcmFjdGVyIiwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09IDM5ICYmIHN0LnN2YWwuZXF1YWxzKCJoIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjY29tbWVudENoYXIoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbW1lbnRDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9jb21tZW50Q2hhckkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRUZXN0KCIqY29tbWVudCBcbiAvIDggJ2gnICIpOworICAgICAgICBzdC5vcmRpbmFyeUNoYXIoJy8nKTsKKyAgICAgICAgc3QuY29tbWVudENoYXIoJyonKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuZXh0VG9rZW4oKSBkaWQgbm90IHJldHVybiB0aGUgY2hhcmFjdGVyIC8gc2tpcGluZyB0aGUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCAqIiwKKyAgICAgICAgICAgICAgICAgNDcsIHN0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidGhlIG5leHQgdG9rZW4gcmV0dXJuZWQgc2hvdWxkIGJlIHRoZSBkaWdpdCA4Iiwgc3QKKyAgICAgICAgICAgICAgIC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSCisgICAgICAgICAgICAgICAmJiBzdC5udmFsID09IDguMCk7CisgICAgICAgIGFzc2VydFRydWUoInRoZSBuZXh0IHRva2VuIHJldHVybmVkIHNob3VsZCBiZSB0aGUgcXVvdGUgY2hhcmFjdGVyIiwKKyAgICAgICAgICAgICAgIHN0Lm5leHRUb2tlbigpID09IDM5ICYmIHN0LnN2YWwuZXF1YWxzKCJoIikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNlb2xJc1NpZ25pZmljYW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9lb2xJc1NpZ25pZmljYW50WigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNldFRlc3QoImQgOFxuIik7Ci0JCS8vIGJ5IGRlZmF1bHQgZW5kIG9mIGxpbmUgY2hhcmFjdGVycyBhcmUgbm90IHNpZ25pZmljYW50Ci0JCWFzc2VydFRydWUoIm5leHRUb2tlbiBkaWQgbm90IHJldHVybiBkIiwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JECi0JCQkgICAmJiBzdC5zdmFsLmVxdWFscygiZCIpKTsKLQkJYXNzZXJ0VHJ1ZSgibmV4dFRva2VuIGRpZCBub3QgcmV0dXJuIDgiLAotCQkJICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUgotCQkJICAgJiYgc3QubnZhbCA9PSA4LjApOwotCQlhc3NlcnRUcnVlKCJuZXh0VG9rZW4gc2hvdWxkIGJlIHRoZSBlbmQgb2YgZmlsZSIsCi0JCQkgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GKTsKLQkJc2V0VGVzdCgiZFxuIik7Ci0JCXN0LmVvbElzU2lnbmlmaWNhbnQodHJ1ZSk7Ci0JCS8vIGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMgYXJlIHNpZ25pZmljYW50Ci0JCWFzc2VydFRydWUoIm5leHRUb2tlbiBkaWQgbm90IHJldHVybiBkIiwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JECi0JCQkgICAmJiBzdC5zdmFsLmVxdWFscygiZCIpKTsKLQkJYXNzZXJ0VHJ1ZSgibmV4dFRva2VuIGlzIHRoZSBlbmQgb2YgbGluZSIsCi0JCQkgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9MKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI2VvbElzU2lnbmlmaWNhbnQoYm9vbGVhbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlb2xJc1NpZ25pZmljYW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZW9sSXNTaWduaWZpY2FudFooKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRUZXN0KCJkIDhcbiIpOworICAgICAgICAvLyBieSBkZWZhdWx0IGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMgYXJlIG5vdCBzaWduaWZpY2FudAorICAgICAgICBhc3NlcnRUcnVlKCJuZXh0VG9rZW4gZGlkIG5vdCByZXR1cm4gZCIsCisgICAgICAgICAgICAgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRAorICAgICAgICAgICAgICAgJiYgc3Quc3ZhbC5lcXVhbHMoImQiKSk7CisgICAgICAgIGFzc2VydFRydWUoIm5leHRUb2tlbiBkaWQgbm90IHJldHVybiA4IiwKKyAgICAgICAgICAgICAgIHN0Lm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIKKyAgICAgICAgICAgICAgICYmIHN0Lm52YWwgPT0gOC4wKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibmV4dFRva2VuIHNob3VsZCBiZSB0aGUgZW5kIG9mIGZpbGUiLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX0VPRik7CisgICAgICAgIHNldFRlc3QoImRcbiIpOworICAgICAgICBzdC5lb2xJc1NpZ25pZmljYW50KHRydWUpOworICAgICAgICAvLyBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzIGFyZSBzaWduaWZpY2FudAorICAgICAgICBhc3NlcnRUcnVlKCJuZXh0VG9rZW4gZGlkIG5vdCByZXR1cm4gZCIsCisgICAgICAgICAgICAgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRAorICAgICAgICAgICAgICAgJiYgc3Quc3ZhbC5lcXVhbHMoImQiKSk7CisgICAgICAgIGFzc2VydFRydWUoIm5leHRUb2tlbiBpcyB0aGUgZW5kIG9mIGxpbmUiLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX0VPTCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI2xpbmVubygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9saW5lbm8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzZXRUZXN0KCJkXG4gOFxuIik7Ci0JCWFzc2VydEVxdWFscygidGhlIGxpbmVubyBzaG91bGQgYmUgMSIsIDEsIHN0LmxpbmVubygpKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCXN0Lm5leHRUb2tlbigpOwotCQlhc3NlcnRFcXVhbHMoInRoZSBsaW5lbm8gc2hvdWxkIGJlIDIiLCAyLCBzdC5saW5lbm8oKSk7Ci0JCXN0Lm5leHRUb2tlbigpOwotCQlhc3NlcnRFcXVhbHMoInRoZSBuZXh0IGxpbmUgbm8gc2hvdWxkIGJlIDMiLCAzLCBzdC5saW5lbm8oKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNsaW5lbm8oKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxpbmVubyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfbGluZW5vKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0VGVzdCgiZFxuIDhcbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSBsaW5lbm8gc2hvdWxkIGJlIDEiLCAxLCBzdC5saW5lbm8oKSk7CisgICAgICAgIHN0Lm5leHRUb2tlbigpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgbGluZW5vIHNob3VsZCBiZSAyIiwgMiwgc3QubGluZW5vKCkpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgbmV4dCBsaW5lIG5vIHNob3VsZCBiZSAzIiwgMywgc3QubGluZW5vKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNsb3dlckNhc2VNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9sb3dlckNhc2VNb2RlWigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTTS4KLQkJc2V0VGVzdCgiSEVMTE9XT1JMRCIpOwotCQlzdC5sb3dlckNhc2VNb2RlKHRydWUpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNsb3dlckNhc2VNb2RlKGJvb2xlYW4pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG93ZXJDYXNlTW9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvd2VyQ2FzZU1vZGVaKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNNLgorICAgICAgICBzZXRUZXN0KCJIRUxMT1dPUkxEIik7CisgICAgICAgIHN0Lmxvd2VyQ2FzZU1vZGUodHJ1ZSk7CiAKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydEVxdWFscygic3ZhbCBub3QgY29udmVydGVkIHRvIGxvd2VyY2FzZS4iLCAiaGVsbG93b3JsZCIsIHN0LnN2YWwKLQkJCSAgICAgKTsKLQl9CisgICAgICAgIHN0Lm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN2YWwgbm90IGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuIiwgImhlbGxvd29ybGQiLCBzdC5zdmFsCisgICAgICAgICAgICAgICAgICk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI25leHRUb2tlbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9uZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTTS4KLQkJc2V0VGVzdCgiXHJcbi8qIGZqZSBmamUgNDMuNCBmIFxyXG4gZiBnICovICA0NTYuNDU5IFxyXG4iCi0JCQkJKyAiSGVsbG8gIC8gCVxyXG4gXHJcbiBcbiBcciBcMjU3IEhpIFwnSGVsbG8gV29ybGRcJyIpOwotCQlzdC5vcmRpbmFyeUNoYXIoJy8nKTsKLQkJc3Quc2xhc2hTdGFyQ29tbWVudHModHJ1ZSk7Ci0JCXN0Lm5leHRUb2tlbigpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBUb2tlbiB0eXBlMTogIiArIChjaGFyKSBzdC50dHlwZSwKLQkJCSAgIHN0LnR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIpOwotCQlzdC5uZXh0VG9rZW4oKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgVG9rZW4gdHlwZTI6ICIgKyBzdC50dHlwZSwKLQkJCSAgIHN0LnR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JEKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydFRydWUoIldyb25nIFRva2VuIHR5cGUzOiAiICsgc3QudHR5cGUsIHN0LnR0eXBlID09ICcvJyk7Ci0JCXN0Lm5leHRUb2tlbigpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBUb2tlbiB0eXBlNDogIiArIHN0LnR0eXBlLAotCQkJICAgc3QudHR5cGUgPT0gU3RyZWFtVG9rZW5pemVyLlRUX1dPUkQpOwotCQlzdC5uZXh0VG9rZW4oKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgVG9rZW4gdHlwZTU6ICIgKyBzdC50dHlwZSwKLQkJCSAgIHN0LnR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JEKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydFRydWUoIldyb25nIFRva2VuIHR5cGU2OiAiICsgc3QudHR5cGUsIHN0LnR0eXBlID09ICdcJycpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBUb2tlbiB0eXBlNzogIiArIHN0LnR0eXBlLCBzdC5zdmFsCi0JCQkgICAuZXF1YWxzKCJIZWxsbyBXb3JsZCIpKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydFRydWUoIldyb25nIFRva2VuIHR5cGU4OiAiICsgc3QudHR5cGUsIHN0LnR0eXBlID09IC0xKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjbmV4dFRva2VuKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0VG9rZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNNLgorICAgICAgICBzZXRUZXN0KCJcclxuLyogZmplIGZqZSA0My40IGYgXHJcbiBmIGcgKi8gIDQ1Ni40NTkgXHJcbiIKKyAgICAgICAgICAgICAgICArICJIZWxsbyAgLyAgICAgXHJcbiBcclxuIFxuIFxyIFwyNTcgSGkgXCdIZWxsbyBXb3JsZFwnIik7CisgICAgICAgIHN0Lm9yZGluYXJ5Q2hhcignLycpOworICAgICAgICBzdC5zbGFzaFN0YXJDb21tZW50cyh0cnVlKTsKKyAgICAgICAgc3QubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIFRva2VuIHR5cGUxOiAiICsgKGNoYXIpIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QudHR5cGUgPT0gU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUik7CisgICAgICAgIHN0Lm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBUb2tlbiB0eXBlMjogIiArIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QudHR5cGUgPT0gU3RyZWFtVG9rZW5pemVyLlRUX1dPUkQpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgVG9rZW4gdHlwZTM6ICIgKyBzdC50dHlwZSwgc3QudHR5cGUgPT0gJy8nKTsKKyAgICAgICAgc3QubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIFRva2VuIHR5cGU0OiAiICsgc3QudHR5cGUsCisgICAgICAgICAgICAgICBzdC50dHlwZSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRCk7CisgICAgICAgIHN0Lm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBUb2tlbiB0eXBlNTogIiArIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QudHR5cGUgPT0gU3RyZWFtVG9rZW5pemVyLlRUX1dPUkQpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgVG9rZW4gdHlwZTY6ICIgKyBzdC50dHlwZSwgc3QudHR5cGUgPT0gJ1wnJyk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIFRva2VuIHR5cGU3OiAiICsgc3QudHR5cGUsIHN0LnN2YWwKKyAgICAgICAgICAgICAgIC5lcXVhbHMoIkhlbGxvIFdvcmxkIikpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgVG9rZW4gdHlwZTg6ICIgKyBzdC50dHlwZSwgc3QudHR5cGUgPT0gLTEpOwogCi0JCWZpbmFsIFBpcGVkSW5wdXRTdHJlYW0gcGluID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLQkJUGlwZWRPdXRwdXRTdHJlYW0gcG91dCA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbShwaW4pOwotCQlwb3V0LndyaXRlKCJoZWxsb1xuXHJcciIuZ2V0Qnl0ZXMoKSk7Ci0JCVN0cmVhbVRva2VuaXplciBzID0gbmV3IFN0cmVhbVRva2VuaXplcihwaW4pOwotCQlzLmVvbElzU2lnbmlmaWNhbnQodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIldyb25nIHRva2VuIDEsMSIsCi0JCQkgICBzLm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JECi0JCQkgICAmJiBzLnN2YWwuZXF1YWxzKCJoZWxsbyIpKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMSwyIiwgcy5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMSwzIiwgcy5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMSw0Iiwgcy5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKLQkJcG91dC5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyB0b2tlbiAxLDUiLAotCQkJICAgcy5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GKTsKLQkJU3RyZWFtVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJlYW1Ub2tlbml6ZXIoCi0JCQkJCQkJCW5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcigiXG4gXHJcbiMiKSk7Ci0JCXRva2VuaXplci5vcmRpbmFyeUNoYXIoJ1xuJyk7IC8vIG1ha2UgXG4gb3JkaW5hcnkKLQkJdG9rZW5pemVyLmVvbElzU2lnbmlmaWNhbnQodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIldyb25nIHRva2VuIDIsMSIsIHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMiwyIiwgdG9rZW5pemVyLm5leHRUb2tlbigpID09ICdcbicpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHRva2VuIDIsMyIsICcjJywgdG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQl9CisgICAgICAgIGZpbmFsIFBpcGVkSW5wdXRTdHJlYW0gcGluID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgUGlwZWRPdXRwdXRTdHJlYW0gcG91dCA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbShwaW4pOworICAgICAgICBwb3V0LndyaXRlKCJoZWxsb1xuXHJcciIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIFN0cmVhbVRva2VuaXplciBzID0gbmV3IFN0cmVhbVRva2VuaXplcihwaW4pOworICAgICAgICBzLmVvbElzU2lnbmlmaWNhbnQodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIHRva2VuIDEsMSIsCisgICAgICAgICAgICAgICBzLm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JECisgICAgICAgICAgICAgICAmJiBzLnN2YWwuZXF1YWxzKCJoZWxsbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMSwyIiwgcy5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMSwzIiwgcy5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMSw0Iiwgcy5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKKyAgICAgICAgcG91dC5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyB0b2tlbiAxLDUiLAorICAgICAgICAgICAgICAgcy5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GKTsKKyAgICAgICAgU3RyZWFtVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJlYW1Ub2tlbml6ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdXBwb3J0X1N0cmluZ1JlYWRlcigiXG4gXHJcbiMiKSk7CisgICAgICAgIHRva2VuaXplci5vcmRpbmFyeUNoYXIoJ1xuJyk7IC8vIG1ha2UgXG4gb3JkaW5hcnkKKyAgICAgICAgdG9rZW5pemVyLmVvbElzU2lnbmlmaWNhbnQodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIHRva2VuIDIsMSIsIHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnXG4nKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgdG9rZW4gMiwyIiwgdG9rZW5pemVyLm5leHRUb2tlbigpID09ICdcbicpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHRva2VuIDIsMyIsICcjJywgdG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjb3JkaW5hcnlDaGFyKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X29yZGluYXJ5Q2hhckkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTTS4KLQkJc2V0VGVzdCgiRmZqZWluIDg5MyIpOwotCQlzdC5vcmRpbmFyeUNoYXIoJ0YnKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydFRydWUoIk9yZGluYXJ5Q2hhciBmYWlsZWQuIiArIChjaGFyKSBzdC50dHlwZSwKLQkJCSAgIHN0LnR0eXBlID09ICdGJyk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNvcmRpbmFyeUNoYXIoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGluYXJ5Q2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3JkaW5hcnlDaGFySSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNNLgorICAgICAgICBzZXRUZXN0KCJGZmplaW4gODkzIik7CisgICAgICAgIHN0Lm9yZGluYXJ5Q2hhcignRicpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT3JkaW5hcnlDaGFyIGZhaWxlZC4iICsgKGNoYXIpIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QudHR5cGUgPT0gJ0YnKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjb3JkaW5hcnlDaGFycyhpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X29yZGluYXJ5Q2hhcnNJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNNLgotCQlzZXRUZXN0KCJhemJjIGlvZiB6IDg5MyIpOwotCQlzdC5vcmRpbmFyeUNoYXJzKCdhJywgJ3onKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmRpbmFyeUNoYXJzIGZhaWxlZC4iLCAnYScsIHN0Lm5leHRUb2tlbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmRpbmFyeUNoYXJzIGZhaWxlZC4iLCAneicsIHN0Lm5leHRUb2tlbigpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI29yZGluYXJ5Q2hhcnMoaW50LCBpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3JkaW5hcnlDaGFycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9vcmRpbmFyeUNoYXJzSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBTTS4KKyAgICAgICAgc2V0VGVzdCgiYXpiYyBpb2YgeiA4OTMiKTsKKyAgICAgICAgc3Qub3JkaW5hcnlDaGFycygnYScsICd6Jyk7CisgICAgICAgIGFzc2VydEVxdWFscygiT3JkaW5hcnlDaGFycyBmYWlsZWQuIiwgJ2EnLCBzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT3JkaW5hcnlDaGFycyBmYWlsZWQuIiwgJ3onLCBzdC5uZXh0VG9rZW4oKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3BhcnNlTnVtYmVycygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wYXJzZU51bWJlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTTQotCQlzZXRUZXN0KCI5LjkgNjc4Iik7Ci0JCWFzc2VydFRydWUoIkJhc2UgYmVoYXZpb3IgZmFpbGVkLiIsCi0JCQkgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKTsKLQkJc3Qub3JkaW5hcnlDaGFycygnMCcsICc5Jyk7Ci0JCWFzc2VydEVxdWFscygic2V0T3JkaW5hcnkgZmFpbGVkLiIsICc2Jywgc3QubmV4dFRva2VuKCkpOwotCQlzdC5wYXJzZU51bWJlcnMoKTsKLQkJYXNzZXJ0VHJ1ZSgicGFyc2VOdW1iZXJzIGZhaWxlZC4iLAotCQkJICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNwYXJzZU51bWJlcnMoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlTnVtYmVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VOdW1iZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU00KKyAgICAgICAgc2V0VGVzdCgiOS45IDY3OCIpOworICAgICAgICBhc3NlcnRUcnVlKCJCYXNlIGJlaGF2aW9yIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUik7CisgICAgICAgIHN0Lm9yZGluYXJ5Q2hhcnMoJzAnLCAnOScpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNldE9yZGluYXJ5IGZhaWxlZC4iLCAnNicsIHN0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgc3QucGFyc2VOdW1iZXJzKCk7CisgICAgICAgIGFzc2VydFRydWUoInBhcnNlTnVtYmVycyBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgIHN0Lm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNwdXNoQmFjaygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9wdXNoQmFjaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNNLgotCQlzZXRUZXN0KCJIZWxsbyA4OTciKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCXN0LnB1c2hCYWNrKCk7Ci0JCWFzc2VydFRydWUoIlB1c2hCYWNrIGZhaWxlZC4iLAotCQkJICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX1dPUkQpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjcHVzaEJhY2soKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1c2hCYWNrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9wdXNoQmFjaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNNLgorICAgICAgICBzZXRUZXN0KCJIZWxsbyA4OTciKTsKKyAgICAgICAgc3QubmV4dFRva2VuKCk7CisgICAgICAgIHN0LnB1c2hCYWNrKCk7CisgICAgICAgIGFzc2VydFRydWUoIlB1c2hCYWNrIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX1dPUkQpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNxdW90ZUNoYXIoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcXVvdGVDaGFySSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNNCi0JCXNldFRlc3QoIjxIZWxsbyBXb3JsZDwgICAgSGVsbG9Xb3JsZEgiKTsKLQkJc3QucXVvdGVDaGFyKCc8Jyk7Ci0JCWFzc2VydEVxdWFscygiUXVvdGVDaGFyIGZhaWxlZC4iLCAnPCcsIHN0Lm5leHRUb2tlbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJRdW90ZUNoYXIgZmFpbGVkLiIsICJIZWxsbyBXb3JsZCIsIHN0LnN2YWwpOwotCQlzdC5xdW90ZUNoYXIoJ0gnKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydEVxdWFscygiUXVvdGVDaGFyIGZhaWxlZCBmb3Igd29yZC4iLCAiZWxsb1dvcmxkIiwgc3Quc3ZhbAotCQkJICAgICApOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjcXVvdGVDaGFyKGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJxdW90ZUNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3F1b3RlQ2hhckkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBTTQorICAgICAgICBzZXRUZXN0KCI8SGVsbG8gV29ybGQ8ICAgIEhlbGxvV29ybGRIIik7CisgICAgICAgIHN0LnF1b3RlQ2hhcignPCcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlF1b3RlQ2hhciBmYWlsZWQuIiwgJzwnLCBzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUXVvdGVDaGFyIGZhaWxlZC4iLCAiSGVsbG8gV29ybGQiLCBzdC5zdmFsKTsKKyAgICAgICAgc3QucXVvdGVDaGFyKCdIJyk7CisgICAgICAgIHN0Lm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlF1b3RlQ2hhciBmYWlsZWQgZm9yIHdvcmQuIiwgImVsbG9Xb3JsZCIsIHN0LnN2YWwKKyAgICAgICAgICAgICAgICAgKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjcmVzZXRTeW50YXgoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVzZXRTeW50YXgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTTQotCQlzZXRUZXN0KCJIIDlcJyBlbGxvIFdvcmxkIik7Ci0JCXN0LnJlc2V0U3ludGF4KCk7Ci0JCWFzc2VydFRydWUoInJlc2V0U3ludGF4IGZhaWxlZDEuIiArIChjaGFyKSBzdC50dHlwZSwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09ICdIJyk7Ci0JCWFzc2VydFRydWUoInJlc2V0U3ludGF4IGZhaWxlZDEuIiArIChjaGFyKSBzdC50dHlwZSwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09ICcgJyk7Ci0JCWFzc2VydFRydWUoInJlc2V0U3ludGF4IGZhaWxlZDIuIiArIChjaGFyKSBzdC50dHlwZSwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09ICc5Jyk7Ci0JCWFzc2VydFRydWUoInJlc2V0U3ludGF4IGZhaWxlZDMuIiArIChjaGFyKSBzdC50dHlwZSwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09ICdcJycpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjcmVzZXRTeW50YXgoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0U3ludGF4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZXNldFN5bnRheCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNNCisgICAgICAgIHNldFRlc3QoIkggOVwnIGVsbG8gV29ybGQiKTsKKyAgICAgICAgc3QucmVzZXRTeW50YXgoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVzZXRTeW50YXggZmFpbGVkMS4iICsgKGNoYXIpIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gJ0gnKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVzZXRTeW50YXggZmFpbGVkMS4iICsgKGNoYXIpIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gJyAnKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVzZXRTeW50YXggZmFpbGVkMi4iICsgKGNoYXIpIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gJzknKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVzZXRTeW50YXggZmFpbGVkMy4iICsgKGNoYXIpIHN0LnR0eXBlLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gJ1wnJyk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3NsYXNoU2xhc2hDb21tZW50cyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2xhc2hTbGFzaENvbW1lbnRzWigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNNLgotCQlzZXRUZXN0KCIvLyBmb28gXHJcbiAvZmlqaSBcclxuIC00NTYiKTsKLQkJc3Qub3JkaW5hcnlDaGFyKCcvJyk7Ci0JCXN0LnNsYXNoU2xhc2hDb21tZW50cyh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IGZhaWxlZC4iLCAnLycsIHN0Lm5leHRUb2tlbigpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCBmYWlsZWQuIiwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JEKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3NsYXNoU2xhc2hDb21tZW50cyhib29sZWFuKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNsYXNoU2xhc2hDb21tZW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NsYXNoU2xhc2hDb21tZW50c1ooKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBTTS4KKyAgICAgICAgc2V0VGVzdCgiLy8gZm9vIFxyXG4gL2ZpamkgXHJcbiAtNDU2Iik7CisgICAgICAgIHN0Lm9yZGluYXJ5Q2hhcignLycpOworICAgICAgICBzdC5zbGFzaFNsYXNoQ29tbWVudHModHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGVzdCBmYWlsZWQuIiwgJy8nLCBzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgZmFpbGVkLiIsCisgICAgICAgICAgICAgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRCk7CisgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNzbGFzaFNsYXNoQ29tbWVudHMoYm9vbGVhbikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNsYXNoU2xhc2hDb21tZW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NsYXNoU2xhc2hDb21tZW50c193aXRoU1NPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoICJ0IC8vIHQgdCB0Ii50b0NoYXJBcnJheSgpKTsKIApAQCAtMzE2LDYgKzQ1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmVhbVRva2VuaXplciNzbGFzaFNsYXNoQ29tbWVudHMoYm9vbGVhbikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNsYXNoU2xhc2hDb21tZW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NsYXNoU2xhc2hDb21tZW50c193aXRoU1NPcGVuX05vQ29tbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKCAiLy8gdCIudG9DaGFyQXJyYXkoKSk7CiAKQEAgLTMyOSw2ICs0NzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjc2xhc2hTbGFzaENvbW1lbnRzKGJvb2xlYW4pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzbGFzaFNsYXNoQ29tbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zbGFzaFNsYXNoQ29tbWVudHNfd2l0aFNTQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoICIvLyB0Ii50b0NoYXJBcnJheSgpKTsKIApAQCAtMzQxLDIwICs1MDAsMzggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmVhbVRva2VuaXplci5UVF9XT1JELHN0Lm5leHRUb2tlbigpKTsKICAgICB9CiAgICAgCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3NsYXNoU3RhckNvbW1lbnRzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zbGFzaFN0YXJDb21tZW50c1ooKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzZXRUZXN0KCIvKiBmb28gXHJcbiAvZmlqaSBcclxuKi8gLTQ1NiIpOwotCQlzdC5vcmRpbmFyeUNoYXIoJy8nKTsKLQkJc3Quc2xhc2hTdGFyQ29tbWVudHModHJ1ZSk7Ci0JCWFzc2VydFRydWUoIlRlc3QgZmFpbGVkLiIsCi0JCQkgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3NsYXNoU3RhckNvbW1lbnRzKGJvb2xlYW4pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2xhc2hTdGFyQ29tbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zbGFzaFN0YXJDb21tZW50c1ooKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRUZXN0KCIvKiBmb28gXHJcbiAvZmlqaSBcclxuKi8gLTQ1NiIpOworICAgICAgICBzdC5vcmRpbmFyeUNoYXIoJy8nKTsKKyAgICAgICAgc3Quc2xhc2hTdGFyQ29tbWVudHModHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIlRlc3QgZmFpbGVkLiIsCisgICAgICAgICAgICAgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjc2xhc2hTdGFyQ29tbWVudHMoYm9vbGVhbikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNsYXNoU3RhckNvbW1lbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2xhc2hTdGFyQ29tbWVudHNfd2l0aFNUT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKCAidCAvKiB0ICovIHQiLnRvQ2hhckFycmF5KCkpOwogCkBAIC0zNjksNiArNTQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3NsYXNoU3RhckNvbW1lbnRzKGJvb2xlYW4pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzbGFzaFN0YXJDb21tZW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NsYXNoU3RhckNvbW1lbnRzX3dpdGhTVENsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKCAidCAvKiB0ICovIHQiLnRvQ2hhckFycmF5KCkpOwogCkBAIC0zNzksNzAgKzU2NSwxMjcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmVhbVRva2VuaXplci5UVF9FT0Ysc3QubmV4dFRva2VuKCkpOwogICAgIH0KICAgICAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzZXRUZXN0KCJBQkMgSGVsbG8gV29ybGQiKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydFRydWUoInRvU3RyaW5nIGZhaWxlZC4iICsgc3QudG9TdHJpbmcoKSwKLQkJCSAgIHN0LnRvU3RyaW5nKCkuZXF1YWxzKAotCQkJCQkJIlRva2VuW0FCQ10sIGxpbmUgMSIpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3RvU3RyaW5nKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRUZXN0KCJBQkMgSGVsbG8gV29ybGQiKTsKKyAgICAgICAgc3QubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydFRydWUoInRvU3RyaW5nIGZhaWxlZC4iICsgc3QudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgIHN0LnRvU3RyaW5nKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRva2VuW0FCQ10sIGxpbmUgMSIpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjd2hpdGVzcGFjZUNoYXJzKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd2hpdGVzcGFjZUNoYXJzSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzZXRUZXN0KCJhemJjIGlvZiB6IDg5MyIpOwotCQlzdC53aGl0ZXNwYWNlQ2hhcnMoJ2EnLCAneicpOwotCQlhc3NlcnRUcnVlKCJPcmRpbmFyeUNoYXIgZmFpbGVkLiIsCi0JCQkgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyI3doaXRlc3BhY2VDaGFycyhpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3aGl0ZXNwYWNlQ2hhcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd2hpdGVzcGFjZUNoYXJzSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRUZXN0KCJhemJjIGlvZiB6IDg5MyIpOworICAgICAgICBzdC53aGl0ZXNwYWNlQ2hhcnMoJ2EnLCAneicpOworICAgICAgICBhc3NlcnRUcnVlKCJPcmRpbmFyeUNoYXIgZmFpbGVkLiIsCisgICAgICAgICAgICAgICBzdC5uZXh0VG9rZW4oKSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjd29yZENoYXJzKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd29yZENoYXJzSUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzZXRUZXN0KCJBODkzIC05Qjg3Iik7Ci0JCXN0LndvcmRDaGFycygnMCcsICc5Jyk7Ci0JCWFzc2VydFRydWUoIldvcmRDaGFyIGZhaWxlZDEuIiwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JEKTsKLQkJYXNzZXJ0RXF1YWxzKCJXb3JkQ2hhciBmYWlsZWQyLiIsICJBODkzIiwgc3Quc3ZhbCk7Ci0JCWFzc2VydFRydWUoIldvcmRDaGFyIGZhaWxlZDMuIiwKLQkJCSAgIHN0Lm5leHRUb2tlbigpID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIpOwotCQlzdC5uZXh0VG9rZW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJXb3JkQ2hhciBmYWlsZWQ0LiIsICJCODciLCBzdC5zdmFsKTsKLQkJCi0JCXNldFRlc3QoIiAgICBIZWxsbyBXb3JsZCIpOwotCQlzdC53b3JkQ2hhcnMoJyAnLCAnICcpOwotCQlzdC5uZXh0VG9rZW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJXb3JkQ2hhcnMgZmFpbGVkIGZvciB3aGl0ZXNwYWNlLiIsICJIZWxsbyBXb3JsZCIsIHN0LnN2YWwKLQkJCSAgICAgKTsKLQkJCi0JCXNldFRlc3QoIiAgICBIZWxsbyBXb3JsZFxyXG4gIFwnSGVsbG8gV29ybGRcJyBIZWxsb1wnIFdvcmxkIik7Ci0JCXN0LndvcmRDaGFycygnICcsICcgJyk7Ci0JCXN0LndvcmRDaGFycygnXCcnLCAnXCcnKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydFRydWUoIldvcmRDaGFycyBmYWlsZWQgZm9yIHdoaXRlc3BhY2U6ICIgKyBzdC5zdmFsLCBzdC5zdmFsCi0JCQkgICAuZXF1YWxzKCJIZWxsbyBXb3JsZCIpKTsKLQkJc3QubmV4dFRva2VuKCk7Ci0JCWFzc2VydFRydWUoIldvcmRDaGFycyBmYWlsZWQgZm9yIHF1b3RlMTogIiArIHN0LnN2YWwsIHN0LnN2YWwKLQkJCSAgIC5lcXVhbHMoIlwnSGVsbG8gV29ybGRcJyBIZWxsb1wnIFdvcmxkIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIjd29yZENoYXJzKGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndvcmRDaGFycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF93b3JkQ2hhcnNJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNldFRlc3QoIkE4OTMgLTlCODciKTsKKyAgICAgICAgc3Qud29yZENoYXJzKCcwJywgJzknKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV29yZENoYXIgZmFpbGVkMS4iLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX1dPUkQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldvcmRDaGFyIGZhaWxlZDIuIiwgIkE4OTMiLCBzdC5zdmFsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV29yZENoYXIgZmFpbGVkMy4iLAorICAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCkgPT0gU3RyZWFtVG9rZW5pemVyLlRUX05VTUJFUik7CisgICAgICAgIHN0Lm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldvcmRDaGFyIGZhaWxlZDQuIiwgIkI4NyIsIHN0LnN2YWwpOworICAgICAgICAKKyAgICAgICAgc2V0VGVzdCgiICAgIEhlbGxvIFdvcmxkIik7CisgICAgICAgIHN0LndvcmRDaGFycygnICcsICcgJyk7CisgICAgICAgIHN0Lm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldvcmRDaGFycyBmYWlsZWQgZm9yIHdoaXRlc3BhY2UuIiwgIkhlbGxvIFdvcmxkIiwgc3Quc3ZhbAorICAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgc2V0VGVzdCgiICAgIEhlbGxvIFdvcmxkXHJcbiAgXCdIZWxsbyBXb3JsZFwnIEhlbGxvXCcgV29ybGQiKTsKKyAgICAgICAgc3Qud29yZENoYXJzKCcgJywgJyAnKTsKKyAgICAgICAgc3Qud29yZENoYXJzKCdcJycsICdcJycpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV29yZENoYXJzIGZhaWxlZCBmb3Igd2hpdGVzcGFjZTogIiArIHN0LnN2YWwsIHN0LnN2YWwKKyAgICAgICAgICAgICAgIC5lcXVhbHMoIkhlbGxvIFdvcmxkIikpOworICAgICAgICBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV29yZENoYXJzIGZhaWxlZCBmb3IgcXVvdGUxOiAiICsgc3Quc3ZhbCwgc3Quc3ZhbAorICAgICAgICAgICAgICAgLmVxdWFscygiXCdIZWxsbyBXb3JsZFwnIEhlbGxvXCcgV29ybGQiKSk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHNldFRlc3QoU3RyaW5nIHMpIHsKLQkJdGVzdFN0cmluZyA9IHM7Ci0JCXIgPSBuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7Ci0JCXN0ID0gbmV3IFN0cmVhbVRva2VuaXplcihyKTsKLQl9CisgICAgcHJpdmF0ZSB2b2lkIHNldFRlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgdGVzdFN0cmluZyA9IHM7CisgICAgICAgIHIgPSBuZXcgU3VwcG9ydF9TdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7CisgICAgICAgIHN0ID0gbmV3IFN0cmVhbVRva2VuaXplcihyKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQotCQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KKyAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkdlbmVyYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGVzZSBtZXRob2RzIHRlc3RlZCBpbiBzZXBhcmF0ZSB0ZXN0cy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaW5lbm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dFRva2VuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbW1lbnRDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVvbElzU2lnbmlmaWNhbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvd2VyQ2FzZU1vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGluYXJ5Q2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzbGFzaFN0YXJDb21tZW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Jhc2ljU3RyaW5nVG9rZW5pemVyTWV0aG9kcygpCiAgICAgewogICAgICAgICBTdHJpbmcgc3RyID0gIlRlc3RpbmcgMTIzNDUgXG4gYWxwaGEgXHJcbiBvbWVnYSI7CkBAIC00OTYsNiArNzM5LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0VG9rZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFybW9ueVJlZ3Jlc3Npb25UZXN0KCkgewogICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyhieXRlKSAnLSd9OwogICAgICAgICBTdHJlYW1Ub2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmVhbVRva2VuaXplcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSkpOwpAQCAtNTA4LDYgKzc2NCwxOSBAQAogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUb2tlblsnLSddLCBsaW5lIDEiLCByZXN1bHQpOwogICAgIH0KICAgICAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dFRva2VuIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhcm1vbnlSZWdyZXNzaW9uVGVzdDIoKSB7CiAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7KGJ5dGUpICciJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgJ0gnLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmluZ0J1ZmZlcklucHV0U3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmluZ0J1ZmZlcklucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IGEwMDNiYjQuLjJkYWI0NGUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3RyaW5nQnVmZmVySW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDgxICsxNywxNDYgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtOwogCitAVGVzdFRhcmdldENsYXNzKFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0gc2JpczsKKyAgICBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSBzYmlzOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0jU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCi0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtI1N0cmluZ0J1ZmZlcklucHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKCIiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gIiArIGVlLmdldE1lc3NhZ2UoKSArICIgZG9lcyBub3QgZXhwZWN0ZWQgaW4gdGhpcyBjYXNlIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfYXZhaWxhYmxlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKLQkJYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGF2YWlsYWJsZSBieXRlcyIsIDExLCBzYmlzCi0JCQkJLmF2YWlsYWJsZSgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdmFpbGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtLmF2YWlsYWJsZSgpCisgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMiLCAxMSwgc2JpcworICAgICAgICAgICAgICAgIC5hdmFpbGFibGUoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0ucmVhZCgpCi0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1XTsKLQkJc2Jpcy5za2lwKDYpOwotCQlzYmlzLnJlYWQoYnVmLCAwLCA1KTsKLQkJYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgY2hhcnMiLCAiV29ybGQiLCBuZXcgU3RyaW5nKGJ1ZikpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSNyZWFkKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5yZWFkKCkKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzVdOworICAgICAgICBzYmlzLnNraXAoNik7CisgICAgICAgIHNiaXMucmVhZChidWYsIDAsIDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBjaGFycyIsICJXb3JsZCIsIG5ldyBTdHJpbmcoYnVmKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfcmVhZCRCSUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sCi0JCS8vIGludCwgaW50KQotCQlhc3NlcnRFcXVhbHMoIlJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXIiLCAnSCcsIHNiaXMucmVhZCgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sCisgICAgICAgIC8vIGludCwgaW50KQorICAgICAgICBhc3NlcnRFcXVhbHMoIlJlYWQgcmV0dXJuZWQgaW5jb3JyZWN0IGNoYXIiLCAnSCcsIHNiaXMucmVhZCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5yZXNldCgpCi0JCWxvbmcgcyA9IHNiaXMuc2tpcCg2KTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmFibGUgdG8gc2tpcCBjb3JyZWN0IHVtYmVyIG9mIGNoYXJzIiwgNiwgcyk7Ci0JCXNiaXMucmVzZXQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVzZXQiLCAnSCcsIHNiaXMucmVhZCgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0jcmVzZXQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZXNldCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5yZXNldCgpCisgICAgICAgIGxvbmcgcyA9IHNiaXMuc2tpcCg2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmFibGUgdG8gc2tpcCBjb3JyZWN0IHVtYmVyIG9mIGNoYXJzIiwgNiwgcyk7CisgICAgICAgIHNiaXMucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gcmVzZXQiLCAnSCcsIHNiaXMucmVhZCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9za2lwSigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5za2lwKGxvbmcpCi0JCWxvbmcgcyA9IHNiaXMuc2tpcCg2KTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmFibGUgdG8gc2tpcCBjb3JyZWN0IHVtYmVyIG9mIGNoYXJzIiwgNiwgcyk7Ci0JCWFzc2VydEVxdWFscygiU2tpcCBwb3NpdGlvbmVkIGF0IGluY29ycmVjdCBjaGFyIiwgJ1cnLCBzYmlzLnJlYWQoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtI3NraXAobG9uZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJza2lwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcEooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0uc2tpcChsb25nKQorICAgICAgICBsb25nIHMgPSBzYmlzLnNraXAoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5hYmxlIHRvIHNraXAgY29ycmVjdCB1bWJlciBvZiBjaGFycyIsIDYsIHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNraXAgcG9zaXRpb25lZCBhdCBpbmNvcnJlY3QgY2hhciIsICdXJywgc2Jpcy5yZWFkKCkpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCQlzYmlzID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKCJIZWxsbyBXb3JsZCIpOwotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSgiSGVsbG8gV29ybGQiKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmluZ1JlYWRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TdHJpbmdSZWFkZXJUZXN0LmphdmEKaW5kZXggZTAwMTBkNy4uZmRiNDFjOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmluZ1JlYWRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3RyaW5nUmVhZGVyVGVzdC5qYXZhCkBAIC0xNywxNzYgKzE3LDI2NyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaW5nUmVhZGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTdHJpbmdSZWFkZXJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoaXMgaXMgYSB0ZXN0IHN0cmluZyI7CisgICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIjsKIAotCVN0cmluZ1JlYWRlciBzcjsKKyAgICBTdHJpbmdSZWFkZXIgc3I7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdSZWFkZXIjU3RyaW5nUmVhZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5TdHJpbmdSZWFkZXIoamF2YS5sYW5nLlN0cmluZykKLQkJYXNzZXJ0VHJ1ZSgiVXNlZCBpbiB0ZXN0cyIsIHRydWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdSZWFkZXIjU3RyaW5nUmVhZGVyKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nUmVhZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlN0cmluZ1JlYWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcigiVGVzdCBzdHJpbmciKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICAgICBmYWlsICgiRXhjZXB0aW9uICIgKyBlZS5nZXRNZXNzYWdlKCkgKyAiIGRvZXMgbm90IGV4cGVjdGVkIGluIHRoaXMgY2FzZSIpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1JlYWRlci5jbG9zZSgpCi0JCXRyeSB7Ci0JCQlzciA9IG5ldyBTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7Ci0JCQlzci5jbG9zZSgpOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwXTsKLQkJCXNyLnJlYWQoYnVmLCAwLCAyKTsKLQkJCWZhaWwoIkNsb3NlIGZhaWxlZCIpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdSZWFkZXIjY2xvc2UoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5TdHJpbmdSZWFkZXIuY2xvc2UoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpOworICAgICAgICAgICAgc3IuY2xvc2UoKTsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxMF07CisgICAgICAgICAgICBzci5yZWFkKGJ1ZiwgMCwgMik7CisgICAgICAgICAgICBmYWlsKCJDbG9zZSBmYWlsZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdSZWFkZXIjbWFyayhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9tYXJrSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5TdHJpbmdSZWFkZXIubWFyayhpbnQpCi0JCXRyeSB7Ci0JCQlzciA9IG5ldyBTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7Ci0JCQlzci5za2lwKDUpOwotCQkJc3IubWFyaygwKTsKLQkJCXNyLnNraXAoNSk7Ci0JCQlzci5yZXNldCgpOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwXTsKLQkJCXNyLnJlYWQoYnVmLCAwLCAyKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZXR1cm4gdG8gbWFyayIsIG5ldyBTdHJpbmcoYnVmLCAwLCAyKQotCQkJCQkuZXF1YWxzKHRlc3RTdHJpbmcuc3Vic3RyaW5nKDUsIDcpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIG1hcmsgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nUmVhZGVyI21hcmsoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICYgSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcmsiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcmtJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1JlYWRlci5tYXJrKGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNyID0gbmV3IFN0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKTsKKyAgICAgICAgICAgIHNyLnNraXAoNSk7CisgICAgICAgICAgICBzci5tYXJrKDApOworICAgICAgICAgICAgc3Iuc2tpcCg1KTsKKyAgICAgICAgICAgIHNyLnJlc2V0KCk7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTBdOworICAgICAgICAgICAgc3IucmVhZChidWYsIDAsIDIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJldHVybiB0byBtYXJrIiwgbmV3IFN0cmluZyhidWYsIDAsIDIpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModGVzdFN0cmluZy5zdWJzdHJpbmcoNSwgNykpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbWFyayB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1JlYWRlciNtYXJrU3VwcG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X21hcmtTdXBwb3J0ZWQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uU3RyaW5nUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1JlYWRlciNtYXJrU3VwcG9ydGVkKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXJrU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9tYXJrU3VwcG9ydGVkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmlvLlN0cmluZ1JlYWRlci5tYXJrU3VwcG9ydGVkKCkKIAotCQlzciA9IG5ldyBTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7Ci0JCWFzc2VydFRydWUoIm1hcmtTdXBwb3J0ZWQgcmV0dXJuZWQgZmFsc2UiLCBzci5tYXJrU3VwcG9ydGVkKCkpOwotCX0KKyAgICAgICAgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpOworICAgICAgICBhc3NlcnRUcnVlKCJtYXJrU3VwcG9ydGVkIHJldHVybmVkIGZhbHNlIiwgc3IubWFya1N1cHBvcnRlZCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uU3RyaW5nUmVhZGVyLnJlYWQoKQotCQl0cnkgewotCQkJc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpOwotCQkJaW50IHIgPSBzci5yZWFkKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZWFkIGNoYXIiLCAnVCcsIHIpOwotCQkJc3IgPSBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7ICdcdTg3NjUnIH0pKTsKLQkJCWFzc2VydFRydWUoIldyb25nIGRvdWJsZSBieXRlIGNoYXIiLCBzci5yZWFkKCkgPT0gJ1x1ODc2NScpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1JlYWRlciNyZWFkKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uU3RyaW5nUmVhZGVyLnJlYWQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpOworICAgICAgICAgICAgaW50IHIgPSBzci5yZWFkKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byByZWFkIGNoYXIiLCAnVCcsIHIpOworICAgICAgICAgICAgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7ICdcdTg3NjUnIH0pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGRvdWJsZSBieXRlIGNoYXIiLCBzci5yZWFkKCkgPT0gJ1x1ODc2NScpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyByZWFkIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nUmVhZGVyI3JlYWQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkQ0lJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEuaW8uU3RyaW5nUmVhZGVyLnJlYWQoY2hhciBbXSwgaW50LCBpbnQpCi0JCXRyeSB7Ci0JCQlzciA9IG5ldyBTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbdGVzdFN0cmluZy5sZW5ndGgoKV07Ci0JCQlpbnQgciA9IHNyLnJlYWQoYnVmLCAwLCB0ZXN0U3RyaW5nLmxlbmd0aCgpKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZWFkIGNoYXJzIiwgciA9PSB0ZXN0U3RyaW5nLmxlbmd0aCgpKTsKLQkJCWFzc2VydFRydWUoIlJlYWQgY2hhcnMgaW5jb3JyZWN0bHkiLCBuZXcgU3RyaW5nKGJ1ZiwgMCwgcikKLQkJCQkJLmVxdWFscyh0ZXN0U3RyaW5nKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlYWQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nUmVhZGVyI3JlYWQoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRDSUkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5pby5TdHJpbmdSZWFkZXIucmVhZChjaGFyIFtdLCBpbnQsIGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNyID0gbmV3IFN0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKTsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclt0ZXN0U3RyaW5nLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIGludCByID0gc3IucmVhZChidWYsIDAsIHRlc3RTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHJlYWQgY2hhcnMiLCByID09IHRlc3RTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVhZCBjaGFycyBpbmNvcnJlY3RseSIsIG5ldyBTdHJpbmcoYnVmLCAwLCByKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRlc3RTdHJpbmcpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgcmVhZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1JlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9yZWFkeSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5pby5TdHJpbmdSZWFkZXIucmVhZHkoKQotCQl0cnkgewotCQkJc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpOwotCQkJYXNzZXJ0VHJ1ZSgiU3RlYW0gbm90IHJlYWR5Iiwgc3IucmVhZHkoKSk7Ci0JCQlzci5jbG9zZSgpOwotCQkJaW50IHIgPSAwOwotCQkJdHJ5IHsKLQkJCQlzci5yZWFkeSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXIgPSAxOwotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBJT0V4Y2VwdGlvbiBub3QgdGhyb3duIGluIHJlYWQoKSIsIDEsIHIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZHkgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nUmVhZGVyI3JlYWR5KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZHkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEuaW8uU3RyaW5nUmVhZGVyLnJlYWR5KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNyID0gbmV3IFN0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlN0ZWFtIG5vdCByZWFkeSIsIHNyLnJlYWR5KCkpOworICAgICAgICAgICAgc3IuY2xvc2UoKTsKKyAgICAgICAgICAgIGludCByID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3IucmVhZHkoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgSU9FeGNlcHRpb24gbm90IHRocm93biBpbiByZWFkKCkiLCAxLCByKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZHVyaW5nIHJlYWR5IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1JlYWRlci5yZXNldCgpCi0JCXRyeSB7Ci0JCQlzciA9IG5ldyBTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7Ci0JCQlzci5za2lwKDUpOwotCQkJc3IubWFyaygwKTsKLQkJCXNyLnNraXAoNSk7Ci0JCQlzci5yZXNldCgpOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwXTsKLQkJCXNyLnJlYWQoYnVmLCAwLCAyKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZXNldCBwcm9wZXJseSIsIG5ldyBTdHJpbmcoYnVmLCAwLCAyKQotCQkJCQkuZXF1YWxzKHRlc3RTdHJpbmcuc3Vic3RyaW5nKDUsIDcpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlc2V0IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1JlYWRlciNyZXNldCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1JlYWRlci5yZXNldCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzciA9IG5ldyBTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7CisgICAgICAgICAgICBzci5za2lwKDUpOworICAgICAgICAgICAgc3IubWFyaygwKTsKKyAgICAgICAgICAgIHNyLnNraXAoNSk7CisgICAgICAgICAgICBzci5yZXNldCgpOworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwXTsKKyAgICAgICAgICAgIHNyLnJlYWQoYnVmLCAwLCAyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byByZXNldCBwcm9wZXJseSIsIG5ldyBTdHJpbmcoYnVmLCAwLCAyKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRlc3RTdHJpbmcuc3Vic3RyaW5nKDUsIDcpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHJlc2V0IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nUmVhZGVyI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NraXBKKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLmlvLlN0cmluZ1JlYWRlci5za2lwKGxvbmcpCi0JCXRyeSB7Ci0JCQlzciA9IG5ldyBTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7Ci0JCQlzci5za2lwKDUpOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwXTsKLQkJCXNyLnJlYWQoYnVmLCAwLCAyKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBza2lwIHByb3Blcmx5IiwgbmV3IFN0cmluZyhidWYsIDAsIDIpCi0JCQkJCS5lcXVhbHModGVzdFN0cmluZy5zdWJzdHJpbmcoNSwgNykpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2tpcCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdSZWFkZXIjc2tpcChsb25nKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNraXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9za2lwSigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS5pby5TdHJpbmdSZWFkZXIuc2tpcChsb25nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpOworICAgICAgICAgICAgc3Iuc2tpcCg1KTsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxMF07CisgICAgICAgICAgICBzci5yZWFkKGJ1ZiwgMCwgMik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gc2tpcCBwcm9wZXJseSIsIG5ldyBTdHJpbmcoYnVmLCAwLCAyKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRlc3RTdHJpbmcuc3Vic3RyaW5nKDUsIDcpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNraXAgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CiAKLQkJdHJ5IHsKLQkJCXNyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmluZ1dyaXRlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9TdHJpbmdXcml0ZXJUZXN0LmphdmEKaW5kZXggYTYyM2MwMC4uMDBiYTllMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N0cmluZ1dyaXRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3RyaW5nV3JpdGVyVGVzdC5qYXZhCkBAIC0xNyw4MiArMTcsMTU1IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhTdHJpbmdXcml0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFN0cmluZ1dyaXRlclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JU3RyaW5nV3JpdGVyIHN3OworICAgIFN0cmluZ1dyaXRlciBzdzsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1dyaXRlciNTdHJpbmdXcml0ZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlN0cmluZ1dyaXRlcigpCi0JCWFzc2VydFRydWUoIlVzZWQgaW4gdGVzdHMiLCB0cnVlKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI1N0cmluZ1dyaXRlcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmdXcml0ZXIiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgIGZhaWwgKCJFeGNlcHRpb24gIiArIGVlLmdldE1lc3NhZ2UoKSArICJub3QgZXhwZWN0ZWQgaW4gdGhpcyBjYXNlIik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uU3RyaW5nV3JpdGVyLmNsb3NlKCkKLQkJdHJ5IHsKLQkJCXN3LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGNsb3NpbmcgU3RyaW5nV3JpdGVyIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjY2xvc2UoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1dyaXRlci5jbG9zZSgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBjbG9zaW5nIFN0cmluZ1dyaXRlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uU3RyaW5nV3JpdGVyLmZsdXNoKCkKLQkJc3cuZmx1c2goKTsKLQkJc3cud3JpdGUoJ2MnKTsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gZmx1c2ggY2hhciIsICJjIiwgc3cudG9TdHJpbmcoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1dyaXRlciNmbHVzaCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZmx1c2goKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uU3RyaW5nV3JpdGVyLmZsdXNoKCkKKyAgICAgICAgc3cuZmx1c2goKTsKKyAgICAgICAgc3cud3JpdGUoJ2MnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gZmx1c2ggY2hhciIsICJjIiwgc3cudG9TdHJpbmcoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI2dldEJ1ZmZlcigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRCdWZmZXIoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JCS8vIGphdmEuaW8uU3RyaW5nV3JpdGVyLmdldEJ1ZmZlcigpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI2dldEJ1ZmZlcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCdWZmZXIiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ1ZmZlcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgICAgICAgLy8gamF2YS5pby5TdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCkKIAotCQlzdy53cml0ZSgiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIik7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IHN3LmdldEJ1ZmZlcigpOwotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBidWZmZXIgcmV0dXJuZWQiLCAKLQkJCQkiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIiwgc2IudG9TdHJpbmcoKSk7Ci0JfQorICAgICAgICBzdy53cml0ZSgiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHN3LmdldEJ1ZmZlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBidWZmZXIgcmV0dXJuZWQiLCAKKyAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIiwgc2IudG9TdHJpbmcoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLmlvLlN0cmluZ1dyaXRlci50b1N0cmluZygpCi0JCXN3LndyaXRlKCJUaGlzIGlzIGEgdGVzdCBzdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc3RyaW5nIHJldHVybmVkIiwgCi0JCQkJIlRoaXMgaXMgYSB0ZXN0IHN0cmluZyIsIHN3LnRvU3RyaW5nKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjdG9TdHJpbmcoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5pby5TdHJpbmdXcml0ZXIudG9TdHJpbmcoKQorICAgICAgICBzdy53cml0ZSgiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIik7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHN0cmluZyByZXR1cm5lZCIsIAorICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgdGVzdCBzdHJpbmciLCBzdy50b1N0cmluZygpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5TdHJpbmdXcml0ZXIud3JpdGUoY2hhciBbXSwgaW50LCBpbnQpCi0JCWNoYXJbXSBjID0gbmV3IGNoYXJbMTAwMF07Ci0JCSJUaGlzIGlzIGEgdGVzdCBzdHJpbmciLmdldENoYXJzKDAsIDIxLCBjLCAwKTsKLQkJc3cud3JpdGUoYywgMCwgMjEpOwotCQlhc3NlcnRFcXVhbHMoIkNoYXJzIG5vdCB3cml0dGVuIHByb3Blcmx5IiwgCi0JCQkJIlRoaXMgaXMgYSB0ZXN0IHN0cmluZyIsIHN3LnRvU3RyaW5nKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5pby5TdHJpbmdXcml0ZXIud3JpdGUoY2hhciBbXSwgaW50LCBpbnQpCisgICAgICAgIGNoYXJbXSBjID0gbmV3IGNoYXJbMTAwMF07CisgICAgICAgICJUaGlzIGlzIGEgdGVzdCBzdHJpbmciLmdldENoYXJzKDAsIDIxLCBjLCAwKTsKKyAgICAgICAgc3cud3JpdGUoYywgNCwgMTQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3cpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNoYXJzIG5vdCB3cml0dGVuIHByb3Blcmx5IiwgCisgICAgICAgICAgICAgICAgIiBpcyBhIHRlc3Qgc3RyIiwgc3cudG9TdHJpbmcoKSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI3dyaXRlKGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICogUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0zODcKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkQ0lJXzIoKSB7CiAgICAgICAgIFN0cmluZ1dyaXRlciBvYmogPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTA5LDYgKzE4MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1dyaXRlciN3cml0ZShjaGFyW10sIGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJENJSV8zKCkgewogICAgICAgICBTdHJpbmdXcml0ZXIgb2JqID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTEyNCw2ICsyMDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRDSUlfNCgpIHsKICAgICAgICAgU3RyaW5nV3JpdGVyIG9iaiA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xMzYsODMgKzIyNywxMzcgQEAKICAgICAgICAgfQogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlN0cmluZ1dyaXRlciN3cml0ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uU3RyaW5nV3JpdGVyLndyaXRlKGludCkKLQkJc3cud3JpdGUoJ2MnKTsKLQkJYXNzZXJ0RXF1YWxzKCJDaGFyIG5vdCB3cml0dGVuIHByb3Blcmx5IiwgImMiLCBzdy50b1N0cmluZygpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI3dyaXRlKGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1dyaXRlci53cml0ZShpbnQpCisgICAgICAgIHN3LndyaXRlKCdjJyk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2hhciBub3Qgd3JpdHRlbiBwcm9wZXJseSIsICJjIiwgc3cudG9TdHJpbmcoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93cml0ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1dyaXRlci53cml0ZShqYXZhLmxhbmcuU3RyaW5nKQotCQlzdy53cml0ZSgiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIG5vdCB3cml0dGVuIHByb3Blcmx5IiwgCi0JCQkJIlRoaXMgaXMgYSB0ZXN0IHN0cmluZyIsIHN3LnRvU3RyaW5nKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuaW8uU3RyaW5nV3JpdGVyLndyaXRlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIHN3LndyaXRlKCJUaGlzIGlzIGEgdGVzdCBzdHJpbmciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdHJpbmcgbm90IHdyaXR0ZW4gcHJvcGVybHkiLCAKKyAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nIiwgc3cudG9TdHJpbmcoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1dyaXRlci53cml0ZShqYXZhLmxhbmcuU3RyaW5nLAotCQkvLyBpbnQsIGludCkKLQkJc3cud3JpdGUoIlRoaXMgaXMgYSB0ZXN0IHN0cmluZyIsIDIsIDIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyBub3Qgd3JpdHRlbiBwcm9wZXJseSIsICJpcyIsIHN3LnRvU3RyaW5nKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMamF2YV9sYW5nX1N0cmluZ0lJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmlvLlN0cmluZ1dyaXRlci53cml0ZShqYXZhLmxhbmcuU3RyaW5nLAorICAgICAgICAvLyBpbnQsIGludCkKKyAgICAgICAgc3cud3JpdGUoIlRoaXMgaXMgYSB0ZXN0IHN0cmluZyIsIDIsIDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN0cmluZyBub3Qgd3JpdHRlbiBwcm9wZXJseSIsICJpcyIsIHN3LnRvU3RyaW5nKCkpOworICAgIH0KICAgICAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TdHJpbmdXcml0ZXIjYXBwZW5kKGNoYXIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkgICAgY2hhciB0ZXN0Q2hhciA9ICcgJzsKLQkgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoMjApOwotCSAgICBzdHJpbmdXcml0ZXIuYXBwZW5kKHRlc3RDaGFyKTsKLQkgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKHRlc3RDaGFyKSwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOwotCSAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uU3RyaW5nV3JpdGVyI2FwcGVuZChjaGFyKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGFyIHRlc3RDaGFyID0gJyAnOworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigyMCk7CisgICAgICAgIHN0cmluZ1dyaXRlci5hcHBlbmQodGVzdENoYXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YodGVzdENoYXIpLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgICAgIHN0cmluZ1dyaXRlci5jbG9zZSgpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2FwcGVuZChDaGFyU2VxdWVuY2UpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyU2VxdWVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLlByaW50V3JpdGVyI2FwcGVuZChDaGFyU2VxdWVuY2UpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ2hhclNlcXVlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAotCSAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBUZXN0IFN0cmluZyI7Ci0JICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKDIwKTsKLQkgICAgc3RyaW5nV3JpdGVyLmFwcGVuZCh0ZXN0U3RyaW5nKTsKLQkgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKHRlc3RTdHJpbmcpLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7Ci0JICAgIHN0cmluZ1dyaXRlci5jbG9zZSgpOwotCX0KKyAgICAgICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiTXkgVGVzdCBTdHJpbmciOworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigyMCk7CisgICAgICAgIHN0cmluZ1dyaXRlci5hcHBlbmQodGVzdFN0cmluZyk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZih0ZXN0U3RyaW5nKSwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgICAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5QcmludFdyaXRlciNhcHBlbmQoQ2hhclNlcXVlbmNlLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZENoYXJTZXF1ZW5jZUludEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIk15IFRlc3QgU3RyaW5nIjsKLQkgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoMjApOwotCSAgICBzdHJpbmdXcml0ZXIuYXBwZW5kKHRlc3RTdHJpbmcsIDEsIDMpOwotCSAgICBhc3NlcnRFcXVhbHModGVzdFN0cmluZy5zdWJzdHJpbmcoMSwgMyksIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKLQkgICAgc3RyaW5nV3JpdGVyLmNsb3NlKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uUHJpbnRXcml0ZXIjYXBwZW5kKENoYXJTZXF1ZW5jZSwgaW50LCBpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ2hhclNlcXVlbmNlSW50SW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiTXkgVGVzdCBTdHJpbmciOworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigyMCk7CisgICAgICAgIHN0cmluZ1dyaXRlci5hcHBlbmQodGVzdFN0cmluZywgMSwgMyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0U3RyaW5nLnN1YnN0cmluZygxLCAzKSwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgICAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKIAotCX0KKyAgICB9CiAgICAgCi0JLyoqCisgICAgLyoqCiAgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCiAgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCiAgICAgICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CiAKLQkJc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JfQorICAgICAgICBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1N5bmNGYWlsZWRFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3luY0ZhaWxlZEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmZDI1ZjY2Li5mNzczZjBkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3luY0ZhaWxlZEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vU3luY0ZhaWxlZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNDUgKzE3LDYwIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU3luY0ZhaWxlZEV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhTeW5jRmFpbGVkRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTeW5jRmFpbGVkRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5TeW5jRmFpbGVkRXhjZXB0aW9uI1N5bmNGYWlsZWRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlN5bmNGYWlsZWRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkJRmlsZSBmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksICJzeW5mYWlsLnRzdCIpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmLmdldFBhdGgoKSk7Ci0JCQlGaWxlRGVzY3JpcHRvciBmZCA9IGZvcy5nZXRGRCgpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCQlmZC5zeW5jKCk7Ci0JCX0gY2F0Y2ggKFN5bmNGYWlsZWRFeGNlcHRpb24gZSkgewotCQkJZi5kZWxldGUoKTsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4cGVjdGVkIEV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5TeW5jRmFpbGVkRXhjZXB0aW9uI1N5bmNGYWlsZWRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIlN5bmNGYWlsZWRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5TeW5jRmFpbGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIEZpbGUgZiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLCAic3luZmFpbC50c3QiKTsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBmb3MuZ2V0RkQoKTsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgZmQuc3luYygpOworICAgICAgICB9IGNhdGNoIChTeW5jRmFpbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBFeGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9VVEZEYXRhRm9ybWF0RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1VURkRhdGFGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMjZmZTQzYi4uOWNjY2M4MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1VURkRhdGFGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1VURkRhdGFGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDY3ICsxNyw5MSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiNVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5VVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCkKLQkJdHJ5IHsKLQkJCWludCBzdHJpbmdCdWZmZXJTaXplID0gNzAwMDA7Ci0JCQlpbnQgbG9vcENvdW50ID0gNjY7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cmluZ0J1ZmZlclNpemUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAobG9vcENvdW50KTsgaSsrKQotCQkJCXNiCi0JCQkJCQkuYXBwZW5kKCJxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubWxramhnZmRzYXF3ZXJ0eXVpb3Bsa2poZ3F3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tbGtqaGdmZHNhcXdlcnR5dWlvcGxramhnIik7Ci0JCQlEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKAotCQkJCQluZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOwotCQkJZG9zLndyaXRlVVRGKHNiLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4ZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5VVEZEYXRhRm9ybWF0RXhjZXB0aW9uI1VURkRhdGFGb3JtYXRFeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUZXN0IGRvZXMgbm90IGNoZWNrcyBjb25zdHJ1Y3RvciBmdW5jdGlvbmFsaXR5IChkb2luZyB0aGlzIGluZGlyZWN0bHkgYW5kIHdoaWNoIGNvbnN0cnVjdG9yIHVzZWQgbm9uIG9idmlvdXMpIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb24oKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHN0cmluZ0J1ZmZlclNpemUgPSA3MDAwMDsKKyAgICAgICAgICAgIGludCBsb29wQ291bnQgPSA2NjsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyaW5nQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChsb29wQ291bnQpOyBpKyspCisgICAgICAgICAgICAgICAgc2IKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoInF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tbGtqaGdmZHNhcXdlcnR5dWlvcGxramhncXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1sa2poZ2Zkc2Fxd2VydHl1aW9wbGtqaGciKTsKKyAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBkb3Mud3JpdGVVVEYoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKFVURkRhdGFGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiNVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5VVEZEYXRhRm9ybWF0RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQlpbnQgc3RyaW5nQnVmZmVyU2l6ZSA9IDcwMDAwOwotCQkJaW50IGxvb3BDb3VudCA9IDY2OwotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmdCdWZmZXJTaXplKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgKGxvb3BDb3VudCk7IGkrKykKLQkJCQlzYgotCQkJCQkJLmFwcGVuZCgicXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1sa2poZ2Zkc2Fxd2VydHl1aW9wbGtqaGdxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubWxramhnZmRzYXF3ZXJ0eXVpb3Bsa2poZyIpOwotCQkJRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbSgKLQkJCQkJbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKLQkJCWRvcy53cml0ZVVURihzYi50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGVwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiNVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRlc3QgZG9lcyBub3QgY2hlY2tzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uYWxpdHkgKGRvaW5nIHRoaXMgaW5kaXJlY3RseSBhbmQgd2hpY2ggY29uc3RydWN0b3IgdXNlZCBub24gb2J2aW91cykiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHN0cmluZ0J1ZmZlclNpemUgPSA3MDAwMDsKKyAgICAgICAgICAgIGludCBsb29wQ291bnQgPSA2NjsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyaW5nQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChsb29wQ291bnQpOyBpKyspCisgICAgICAgICAgICAgICAgc2IKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoInF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tbGtqaGdmZHNhcXdlcnR5dWlvcGxramhncXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1sa2poZ2Zkc2Fxd2VydHl1aW9wbGtqaGciKTsKKyAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBkb3Mud3JpdGVVVEYoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKFVURkRhdGFGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDkyYTU3OTEuLjlkNDhiMzkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw1NiArMTcsODAgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiNVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKCkKLQkJdHJ5IHsKLQkJCW5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLCAiQm9ndXNFbmNvZGluZyIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB0ZXN0IgotCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4cGVjdGVkIGV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uI1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUZXN0IGRvZXMgbm90IGNoZWNrcyBjb25zdHJ1Y3RvciBmdW5jdGlvbmFsaXR5IChkb2luZyB0aGlzIGluZGlyZWN0bHkgYW5kIHdoaWNoIGNvbnN0cnVjdG9yIHVzZWQgbm9uIG9idmlvdXMpIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24oKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksICJCb2d1c0VuY29kaW5nIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHRlc3QiCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiNVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QKLQkJLy8gamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQluZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSwgIkJvZ3VzRW5jb2RpbmciKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdGVzdCIKLQkJCQkJKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBleGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiNVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRlc3QgZG9lcyBub3QgY2hlY2tzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uYWxpdHkgKGRvaW5nIHRoaXMgaW5kaXJlY3RseSBhbmQgd2hpY2ggY29uc3RydWN0b3IgdXNlZCBub24gb2J2aW91cykiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kCisgICAgICAgIC8vIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCksICJCb2d1c0VuY29kaW5nIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHRlc3QiCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vV3JpdGVBYm9ydGVkRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1dyaXRlQWJvcnRlZEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA2YjhmY2U0Li40ZjNlMjY2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vV3JpdGVBYm9ydGVkRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9Xcml0ZUFib3J0ZWRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDU3ICsxNyw4MSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFdyaXRlQWJvcnRlZEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgV3JpdGVBYm9ydGVkRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5Xcml0ZUFib3J0ZWRFeGNlcHRpb24jV3JpdGVBYm9ydGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19FeGNlcHRpb24oKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLldyaXRlQWJvcnRlZEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCQkvLyBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCQl0cnkgewotCQkJaWYgKHRydWUpCi0JCQkJdGhyb3cgbmV3IFdyaXRlQWJvcnRlZEV4Y2VwdGlvbigiSGVsbG9Xb3JsZCIsCi0JCQkJCQluZXcgV3JpdGVBYm9ydGVkRXhjZXB0aW9uKCJCeWVXb3JsZCIsIG51bGwpKTsKLQkJfSBjYXRjaCAoV3JpdGVBYm9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgRXhjZXB0aW9uIik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLldyaXRlQWJvcnRlZEV4Y2VwdGlvbiNXcml0ZUFib3J0ZWRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIldyaXRlQWJvcnRlZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5FeGNlcHRpb24uY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX0V4Y2VwdGlvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsCisgICAgICAgIC8vIGphdmEubGFuZy5FeGNlcHRpb24pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodHJ1ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV3JpdGVBYm9ydGVkRXhjZXB0aW9uKCJIZWxsb1dvcmxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXcml0ZUFib3J0ZWRFeGNlcHRpb24oIkJ5ZVdvcmxkIiwgbnVsbCkpOworICAgICAgICB9IGNhdGNoIChXcml0ZUFib3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBFeGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5pby5Xcml0ZUFib3J0ZWRFeGNlcHRpb24jZ2V0TWVzc2FnZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwotCQkvLyBqYXZhLmlvLldyaXRlQWJvcnRlZEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkKLQkJdHJ5IHsKLQkJCWlmICh0cnVlKQotCQkJCXRocm93IG5ldyBXcml0ZUFib3J0ZWRFeGNlcHRpb24oIkhlbGxvV29ybGQiLAotCQkJCQkJbmV3IFdyaXRlQWJvcnRlZEV4Y2VwdGlvbigiQnllV29ybGQiLCBudWxsKSk7Ci0JCX0gY2F0Y2ggKFdyaXRlQWJvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJXcml0ZUFib3J0ZWRFeGNlcHRpb246OmdldE1lc3NhZ2UoKSBmYWlsZWQiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCksIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygKLQkJCQkJIkhlbGxvV29ybGQ7IGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uOiBCeWVXb3JsZCIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgRXhjZXB0aW9uIik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmlvLldyaXRlQWJvcnRlZEV4Y2VwdGlvbiNnZXRNZXNzYWdlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCisgICAgICAgIC8vIGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uLmdldE1lc3NhZ2UoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyaXRlQWJvcnRlZEV4Y2VwdGlvbigiSGVsbG9Xb3JsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV3JpdGVBYm9ydGVkRXhjZXB0aW9uKCJCeWVXb3JsZCIsIG51bGwpKTsKKyAgICAgICAgfSBjYXRjaCAoV3JpdGVBYm9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyaXRlQWJvcnRlZEV4Y2VwdGlvbjo6Z2V0TWVzc2FnZSgpIGZhaWxlZCIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiSGVsbG9Xb3JsZDsgamF2YS5pby5Xcml0ZUFib3J0ZWRFeGNlcHRpb246IEJ5ZVdvcmxkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBFeGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9Xcml0ZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvaW8vV3JpdGVyVGVzdC5qYXZhCmluZGV4IDdjNmFmN2MuLjJlNDhjZGMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9pby9Xcml0ZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2lvL1dyaXRlclRlc3QuamF2YQpAQCAtMTUsMTYgKzE1LDMxIEBACiAgKi8KIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhXcml0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFdyaXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5pby5Xcml0ZXIjYXBwZW5kKGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hhciB0ZXN0Q2hhciA9ICcgJzsKICAgICAgICAgTW9ja1dyaXRlciB3cml0ZXIgPSBuZXcgTW9ja1dyaXRlcigyMCk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmlvLldyaXRlciNhcHBlbmQoQ2hhclNlcXVlbmNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kQ2hhclNlcXVlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiTXkgVGVzdCBTdHJpbmciOwogICAgICAgICBNb2NrV3JpdGVyIHdyaXRlciA9IG5ldyBNb2NrV3JpdGVyKDIwKTsKQEAgLTQ5LDYgKzczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuaW8uV3JpdGVyI2FwcGVuZChDaGFyU2VxdWVuY2UsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICYgSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBlbmRDaGFyU2VxdWVuY2VJbnRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBUZXN0IFN0cmluZyI7CiAgICAgICAgIE1vY2tXcml0ZXIgd3JpdGVyID0gbmV3IE1vY2tXcml0ZXIoMjApOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvQm9vbGVhblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL0Jvb2xlYW5UZXN0LmphdmEKaW5kZXggMDFkZmNlYi4uNTlkMzU0YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvQm9vbGVhblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9Cb29sZWFuVGVzdC5qYXZhCkBAIC0xNiwxOCArMTYsNDEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiAvKioKICAqIFRlc3RzIGZvciB0aGUgY2xhc3Mge0BsaW5rIEJvb2xlYW59LgogICovCitAVGVzdFRhcmdldENsYXNzKEJvb2xlYW4uY2xhc3MpIAogcHVibGljIGNsYXNzIEJvb2xlYW5UZXN0CiAgICAgZXh0ZW5kcyBUZXN0Q2FzZQogeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyB0aGF0IGJvb2xlYW5WYWx1ZSgpIHJldHVybnMgdHJ1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJib29sZWFuVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1RSVUUoKSB7CiAgICAgICAgIGFzc2VydFRydWUoQm9vbGVhbi5UUlVFLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyB0aGF0IGJvb2xlYW5WYWx1ZSgpIHJldHVybnMgZmFsc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYm9vbGVhblZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9GQUxTRSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShCb29sZWFuLkZBTFNFLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9Qcm9jZXNzMlRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3MyVGVzdC5qYXZhCmluZGV4IDQwY2Q0NWEuLmQyZTYxNmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3MyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3MyVGVzdC5qYXZhCkBAIC0xNywyNyArMTcsNDkgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0V4ZWM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvY2Vzcy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUHJvY2VzczJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5sYW5nLlByb2Nlc3MjZ2V0SW5wdXRTdHJlYW0oKSwgCi0JICogICAgICAgIGphdmEubGFuZy5Qcm9jZXNzI2dldEVycm9yU3RyZWFtKCkKLQkgKiAgICAgICAgamF2YS5sYW5nLlByb2Nlc3MjZ2V0T3V0cHV0U3RyZWFtKCkKLQkgKiBUZXN0cyBpZiB0aGVzZSBtZXRob2RzIHJldHVybiBidWZmZXJlZCBzdHJlYW1zLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfaXNCdWZmZXJlZFN0cmVhbXMoKSB7Ci0JCS8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0yNzM1LgotCQl0cnkgewotCQkJT2JqZWN0W10gZXhlY0FyZ3MgPSBTdXBwb3J0X0V4ZWMuZXhlY0phdmEyKG5ldyBTdHJpbmdbMF0sIG51bGwsIHRydWUpOwotCQkJUHJvY2VzcyBwID0gKFByb2Nlc3MpIGV4ZWNBcmdzWzBdOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBwLmdldElucHV0U3RyZWFtKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubGFuZy5Qcm9jZXNzI2dldElucHV0U3RyZWFtKCksIAorICAgICAqICAgICAgICBqYXZhLmxhbmcuUHJvY2VzcyNnZXRFcnJvclN0cmVhbSgpCisgICAgICogICAgICAgIGphdmEubGFuZy5Qcm9jZXNzI2dldE91dHB1dFN0cmVhbSgpCisgICAgICogVGVzdHMgaWYgdGhlc2UgbWV0aG9kcyByZXR1cm4gYnVmZmVyZWQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RXJyb3JTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQnVmZmVyZWRTdHJlYW1zKCkgeworICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMjczNS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdFtdIGV4ZWNBcmdzID0gU3VwcG9ydF9FeGVjLmV4ZWNKYXZhMihuZXcgU3RyaW5nWzBdLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIFByb2Nlc3MgcCA9IChQcm9jZXNzKSBleGVjQXJnc1swXTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gcC5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0SW5wdXRTdHJlYW0oKSByZXR1cm5lZCBub24tYnVmZmVyZWQgc3RyZWFtOiAiICsgaW4sIChpbiBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW5wdXRTdHJlYW0pKTsKICAgICAgICAgICAgICAgICAgIGluID0gcC5nZXRFcnJvclN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0RXJyb3JTdHJlYW0oKSByZXR1cm5lZCBub24tYnVmZmVyZWQgc3RyZWFtOiAiICsgaW4sIChpbiBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW5wdXRTdHJlYW0pKTsKQEAgLTQ2LDggKzY4LDggQEAKICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgIHAuZGVzdHJveSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGdvdDogIiArIGV4KTsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBnb3Q6ICIgKyBleCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9Qcm9jZXNzTWFuYWdlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3NNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGRkOTRmMmEuLmVlZDA1NDMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3NNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3NNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmc7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwpAQCAtMjUsOCArMzAsMTggQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCitAVGVzdFRhcmdldENsYXNzKFByb2Nlc3MuY2xhc3MpIAogcHVibGljIGNsYXNzIFByb2Nlc3NNYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmRzID0geyAiY2F0IiB9OwogICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmRzLCBudWxsLCBudWxsKTsKQEAgLTM5LDEzICs1NCwyOSBAQAogCiAgICAgICAgIGFzc2VydEVxdWFscyhncmVldGluZywgcmVhZExpbmUocHJvY2VzcykpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVycnVwdGVkRXhjZXB0aW9uICBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid2FpdEZvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTbGVlcCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICBTdHJpbmdbXSBjb21tYW5kcyA9IHsgInNsZWVwIiwgIjEiIH07CiAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZHMsIG51bGwsIG51bGwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcHJvY2Vzcy53YWl0Rm9yKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQd2QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nW10gY29tbWFuZHMgPSB7ICJzaCIsICItYyIsICJwd2QiIH07CiAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoCkBAIC01Myw3ICs4NCwxNSBAQAogICAgICAgICBsb2dFcnJvcnMocHJvY2Vzcyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiLyIsIHJlYWRMaW5lKHByb2Nlc3MpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW52aXJvbm1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nW10gY29tbWFuZHMgPSB7ICJzaCIsICItYyIsICJlY2hvICRGT08iIH07CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3NUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9Qcm9jZXNzVGVzdC5qYXZhCmluZGV4IDQ0NmZiMWMuLmE0YzE5YjEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1Byb2Nlc3NUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvUHJvY2Vzc1Rlc3QuamF2YQpAQCAtMTcsMTI2ICsxNywxNTAgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0V4ZWM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvY2Vzcy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUHJvY2Vzc1Rlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubGFuZy5Qcm9jZXNzI2dldElucHV0U3RyZWFtKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldElucHV0U3RyZWFtKCkgewotCQl0cnkgewotCQkJLy8gVGVzdCBmb3I6Ci0JCQlPYmplY3RbXSBleGVjQXJncyA9IFN1cHBvcnRfRXhlYy5leGVjSmF2YTIoCi0JCQkJCW5ldyBTdHJpbmdbXSB7ICJ0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfQXZhaWxUZXN0IiB9LCBudWxsLAotCQkJCQl0cnVlKTsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBleGVjQXJnc1swXTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5sYW5nLlByb2Nlc3MjZ2V0SW5wdXRTdHJlYW0oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUZXN0IGZvcjoKKyAgICAgICAgICAgIE9iamVjdFtdIGV4ZWNBcmdzID0gU3VwcG9ydF9FeGVjLmV4ZWNKYXZhMigKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgInRlc3RzLnN1cHBvcnQuU3VwcG9ydF9BdmFpbFRlc3QiIH0sIG51bGwsCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIGV4ZWNBcmdzWzBdOwogCi0JCQlPdXRwdXRTdHJlYW0gb3MgPSBwcm9jLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gcHJvYy5nZXRPdXRwdXRTdHJlYW0oKTsKIAotCQkJLy8gZmlyc3QgbnVtYmVyIGluZGljYXRlcyB0b3RhbCBzdHJlYW0gbGVuZ3RoCi0JCQkvLyBzZWNvbmQgbnVtYmVyIGluZGljYXRlcyBsZW5ndGggb2YgZGF0YSBhZnRlciBzZWNvbmQgc3BhY2UKLQkJCS8vIHRoaXMgd2lsbCBhbGxvdyB1cyB0byB2ZXJpZnkgbGVuZ3RoIGF0IHN0YXJ0LCBtaWRkbGUsIGFuZCBlbmQKLQkJCW9zLndyaXRlKCIxMCA1IGFiY2RlIi5nZXRCeXRlcygpKTsKLQkJCW9zLmNsb3NlKCk7CisgICAgICAgICAgICAvLyBmaXJzdCBudW1iZXIgaW5kaWNhdGVzIHRvdGFsIHN0cmVhbSBsZW5ndGgKKyAgICAgICAgICAgIC8vIHNlY29uZCBudW1iZXIgaW5kaWNhdGVzIGxlbmd0aCBvZiBkYXRhIGFmdGVyIHNlY29uZCBzcGFjZQorICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGFsbG93IHVzIHRvIHZlcmlmeSBsZW5ndGggYXQgc3RhcnQsIG1pZGRsZSwgYW5kIGVuZAorICAgICAgICAgICAgb3Mud3JpdGUoIjEwIDUgYWJjZGUiLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKIAotCQkJSW5wdXRTdHJlYW0gaXMgPSBwcm9jLmdldElucHV0U3RyZWFtKCk7Ci0JCQlTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBjID0gaXMucmVhZCgpOwotCQkJCWlmIChjID09IC0xKQotCQkJCQlicmVhazsKLQkJCQltc2cuYXBwZW5kKChjaGFyKSBjKTsKLQkJCX0KLQkJCWlzLmNsb3NlKCk7Ci0JCQlwcm9jLndhaXRGb3IoKTsKLQkJCVN1cHBvcnRfRXhlYy5jaGVja1N0ZGVycihleGVjQXJncyk7Ci0JCQlwcm9jLmRlc3Ryb3koKTsKLQkJCWFzc2VydEVxdWFscygidHJ1ZSIsIG1zZy50b1N0cmluZygpLCBtc2cudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGV4ZWN1dGluZyBhdmFpbCB0ZXN0OiAiICsgZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkludGVycnVwdGVkRXhjZXB0aW9uIGV4ZWN1dGluZyBhdmFpbCB0ZXN0OiAiICsgZSk7Ci0JCX0KLQl9CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHByb2MuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBpcy5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHByb2Mud2FpdEZvcigpOworICAgICAgICAgICAgU3VwcG9ydF9FeGVjLmNoZWNrU3RkZXJyKGV4ZWNBcmdzKTsKKyAgICAgICAgICAgIHByb2MuZGVzdHJveSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgbXNnLnRvU3RyaW5nKCksIG1zZy50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZXhlY3V0aW5nIGF2YWlsIHRlc3Q6ICIgKyBlKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhlY3V0aW5nIGF2YWlsIHRlc3Q6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLmxhbmcuUHJvY2VzcyNnZXRPdXRwdXRTdHJlYW0oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3V0cHV0U3RyZWFtKCkgewotCQl0cnkgewotCQkJT2JqZWN0W10gZXhlY0FyZ3MgPSBTdXBwb3J0X0V4ZWMKLQkJCQkJLmV4ZWNKYXZhMigKLQkJCQkJCQluZXcgU3RyaW5nW10geyAidGVzdHMuc3VwcG9ydC5TdXBwb3J0X1Byb2Nlc3NSZWFkV3JpdGVUZXN0IiB9LAotCQkJCQkJCW51bGwsIHRydWUpOwotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIGV4ZWNBcmdzWzBdOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUHJvY2VzcyNnZXRPdXRwdXRTdHJlYW0oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdFtdIGV4ZWNBcmdzID0gU3VwcG9ydF9FeGVjCisgICAgICAgICAgICAgICAgICAgIC5leGVjSmF2YTIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgInRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Qcm9jZXNzUmVhZFdyaXRlVGVzdCIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIFByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBleGVjQXJnc1swXTsKIAotCQkJT3V0cHV0U3RyZWFtIG9zID0gcHJvYy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IHByb2MuZ2V0T3V0cHV0U3RyZWFtKCk7CiAKLQkJCS8vIHNlbmQgZGF0YSwgYW5kIGNoZWNrIGlmIGl0IGlzIGVjaG9lZCBiYWNrIGNvcnJlY3RseQotCQkJU3RyaW5nIHN0cjEgPSAiU29tZSBkYXRhIGZvciB0ZXN0aW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXNcbiI7Ci0JCQlTdHJpbmcgc3RyMiA9ICJNb3JlIGRhdGEgdGhhdCBzZXJ2ZXMgdGhlIHNhbWUgcHVycG9zZS5cbiI7Ci0JCQlTdHJpbmcgc3RyMyA9ICJIZXJlIGlzIHNvbWUgbW9yZSBkYXRhLlxuIjsKLQkJCW9zLndyaXRlKHN0cjEuZ2V0Qnl0ZXMoKSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJb3Mud3JpdGUoc3RyMi5nZXRCeXRlcygpKTsKLQkJCW9zLndyaXRlKHN0cjMuZ2V0Qnl0ZXMoKSk7Ci0JCQlvcy5jbG9zZSgpOworICAgICAgICAgICAgLy8gc2VuZCBkYXRhLCBhbmQgY2hlY2sgaWYgaXQgaXMgZWNob2VkIGJhY2sgY29ycmVjdGx5CisgICAgICAgICAgICBTdHJpbmcgc3RyMSA9ICJTb21lIGRhdGEgZm9yIHRlc3RpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHByb2Nlc3Nlc1xuIjsKKyAgICAgICAgICAgIFN0cmluZyBzdHIyID0gIk1vcmUgZGF0YSB0aGF0IHNlcnZlcyB0aGUgc2FtZSBwdXJwb3NlLlxuIjsKKyAgICAgICAgICAgIFN0cmluZyBzdHIzID0gIkhlcmUgaXMgc29tZSBtb3JlIGRhdGEuXG4iOworICAgICAgICAgICAgb3Mud3JpdGUoc3RyMS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcy53cml0ZShzdHIyLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3Mud3JpdGUoc3RyMy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CiAKLQkJCUlucHV0U3RyZWFtIGlzID0gcHJvYy5nZXRJbnB1dFN0cmVhbSgpOwotCQkJU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYyA9IGlzLnJlYWQoKTsKLQkJCQlpZiAoYyA9PSAtMSkKLQkJCQkJYnJlYWs7Ci0JCQkJbXNnLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQl9Ci0JCQlpcy5jbG9zZSgpOwotCQkJcHJvYy53YWl0Rm9yKCk7Ci0JCQlTdXBwb3J0X0V4ZWMuY2hlY2tTdGRlcnIoZXhlY0FyZ3MpOwotCQkJcHJvYy5kZXN0cm95KCk7Ci0JCQlTdHJpbmcgb3JnID0gc3RyMSArIHN0cjIgKyBzdHIzOwotCQkJU3RyaW5nIHJlY3ZkID0gbXNnLnRvU3RyaW5nKCk7Ci0JCQlpZiAoIXJlY3ZkLmVxdWFscyhvcmcpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZW50OiIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JnLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCAmJiBpICUgMTYgPT0gMCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcob3JnLmNoYXJBdChpKSkgKyAiICIpOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkOiIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjdmQubGVuZ3RoKCk7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwICYmIGkgJSAxNiA9PSAwKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhyZWN2ZC5jaGFyQXQoaSkpICsgIiAiKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJEYXRhIHJldHVybmVkIGRpZCBub3QgbWF0Y2ggZGF0YSBzZW50LiBSZWNlaXZlZDogJyIKLQkJCQkJKyByZWN2ZCArICInIHNlbnQ6ICciICsgb3JnICsgIiciLCByZWN2ZC5lcXVhbHMob3JnKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIklPRXhjZXB0aW9uIGV4ZWN1dGluZyBhdmFpbCB0ZXN0OiAiICsgZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkludGVycnVwdGVkRXhjZXB0aW9uIGV4ZWN1dGluZyBhdmFpbCB0ZXN0OiAiICsgZSk7Ci0JCX0KLQl9CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHByb2MuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBpcy5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHByb2Mud2FpdEZvcigpOworICAgICAgICAgICAgU3VwcG9ydF9FeGVjLmNoZWNrU3RkZXJyKGV4ZWNBcmdzKTsKKyAgICAgICAgICAgIHByb2MuZGVzdHJveSgpOworICAgICAgICAgICAgU3RyaW5nIG9yZyA9IHN0cjEgKyBzdHIyICsgc3RyMzsKKyAgICAgICAgICAgIFN0cmluZyByZWN2ZCA9IG1zZy50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKCFyZWN2ZC5lcXVhbHMob3JnKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VudDoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDAgJiYgaSAlIDE2ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKG9yZy5jaGFyQXQoaSkpICsgIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZDoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY3ZkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCAmJiBpICUgMTYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50KEludGVnZXIudG9IZXhTdHJpbmcocmVjdmQuY2hhckF0KGkpKSArICIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGF0YSByZXR1cm5lZCBkaWQgbm90IG1hdGNoIGRhdGEgc2VudC4gUmVjZWl2ZWQ6ICciCisgICAgICAgICAgICAgICAgICAgICsgcmVjdmQgKyAiJyBzZW50OiAnIiArIG9yZyArICInIiwgcmVjdmQuZXF1YWxzKG9yZykpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBleGVjdXRpbmcgYXZhaWwgdGVzdDogIiArIGUpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGVjdXRpbmcgYXZhaWwgdGVzdDogIiArIGUpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBkb25lU3VpdGUoKSB7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGRvbmVTdWl0ZSgpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9TdHJpbmdUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9TdHJpbmdUZXN0LmphdmEKaW5kZXggZjUzZTJiMS4uZGY3NGUxNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvU3RyaW5nVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL1N0cmluZ1Rlc3QuamF2YQpAQCAtMTYsMzMgKzE2LDgxIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubGFuZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogLyoqCiAgKiBUZXN0cyBmb3IgdGhlIGNsYXNzIHtAbGluayBTdHJpbmd9LgogICovCitAVGVzdFRhcmdldENsYXNzKFN0cmluZy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RyaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWlucygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYWFiYyIuY29udGFpbnMoImFiYyIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYWJjZCIuY29udGFpbnMoImFiYyIpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoImFiY2QiLmNvbnRhaW5zKCJjYmEiKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hhckF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGFyQXQoKSB7CiAgICAgICAgIGFzc2VydFRydWUoImFiY2QiLmNoYXJBdCgwKSA9PSAnYScpOwogICAgICAgICBhc3NlcnRUcnVlKCJhYmNkIi5jaGFyQXQoMykgPT0gJ2QnKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBlbXB0eSBzdHJpbmcsIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3RhcnRzV2l0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1N0YXJ0c1dpdGgoKSB7CiAgICAgICAgIGFzc2VydFRydWUoImFiY2QiLnN0YXJ0c1dpdGgoImFiYyIpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoImFiY2QiLnN0YXJ0c1dpdGgoImFhYmMiKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgZW1wdHkgc3RyaW5nLCBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZHNXaXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRW5kc1dpdGgoKSB7CiAgICAgICAgIGFzc2VydFRydWUoImFiY2QiLmVuZHNXaXRoKCJiY2QiKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJhYmNkIi5lbmRzV2l0aCgiYmNkZSIpKTsKICAgICB9CiAgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NBU0VfSU5TRU5TSVRJVkVfT1JERVIoKSB7CiAgICAgICAgIFN0cmluZyAgczEgPSAiQUJDREVGRyI7CiAgICAgICAgIFN0cmluZyAgczIgPSAiYWJjZGVmZyI7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvUGhhbnRvbVJlZmVyZW5jZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9QaGFudG9tUmVmZXJlbmNlVGVzdC5qYXZhCmluZGV4IGU0NDc4MDIuLjMzNjJiY2MgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9QaGFudG9tUmVmZXJlbmNlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9QaGFudG9tUmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMTkgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZjsKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlOwogCiAvL1RPRE86IHdyaXRlIGEgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgcmVmZXJlbnQncyBmaW5hbGl6ZSgpIGhhcHBlbnMKIC8vICAgICAgYmVmb3JlIHRoZSBQaGFudG9tUmVmZXJlbmNlIGlzIGVucXVldWVkLgogCitAVGVzdFRhcmdldENsYXNzKFBoYW50b21SZWZlcmVuY2UuY2xhc3MpIAogcHVibGljIGNsYXNzIFBoYW50b21SZWZlcmVuY2VUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBzdGF0aWMgQm9vbGVhbiBib29sOwogCkBAIC0zNCw2ICs0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlBoYW50b21SZWZlcmVuY2UjZ2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXQoKSB7CiAgICAgICAgIFJlZmVyZW5jZVF1ZXVlIHJxID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7CiAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbihmYWxzZSk7CkBAIC00NCw2ICs1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcuUnVudGltZSNnYygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW50ZXJhY3Rpb24gdGVzdCB3aXRoIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nY0ludGVyYWN0aW9uKCkgewogICAgICAgICBjbGFzcyBUZXN0UGhhbnRvbVJlZmVyZW5jZTxUPiBleHRlbmRzIFBoYW50b21SZWZlcmVuY2U8VD4gewogICAgICAgICAgICAgcHVibGljIFRlc3RQaGFudG9tUmVmZXJlbmNlKFQgcmVmZXJlbnQsCkBAIC0xMDAsNiArMTI0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZSNQaGFudG9tUmVmZXJlbmNlKGphdmEubGFuZy5PYmplY3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBoYW50b21SZWZlcmVuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzLCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX3JlZl9SZWZlcmVuY2VRdWV1ZSgpIHsKICAgICAgICAgUmVmZXJlbmNlUXVldWUgcnEgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKICAgICAgICAgYm9vbCA9IG5ldyBCb29sZWFuKHRydWUpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVF1ZXVlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVF1ZXVlVGVzdC5qYXZhCmluZGV4IGQ5OGQ3NDguLjIwNDUxYjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWVUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxNiBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUmVmZXJlbmNlUXVldWUuY2xhc3MpIAogcHVibGljIGNsYXNzIFJlZmVyZW5jZVF1ZXVlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAgICAgc3RhdGljIEJvb2xlYW4gYjsKIApAQCAtNTYsNiArNjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSNwb2xsKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIHRoYXQgcG9sbCgpIGNhbiByZXR1cm4gbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb2xsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb2xsKCkgewogICAgICAgICAvLyBzdG9yZSBpbiBhIHN0YXRpYyBzbyBpdCB3b24ndCBiZSBnYydlZCBiZWNhdXNlIHRoZSBqaXQKICAgICAgICAgLy8gb3B0aW1pemVkIGl0IG91dApAQCAtNzMsNiArODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSNyZW1vdmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVycnVwdGVkRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSgpIHsKICAgICAgICAgLy8gc3RvcmUgaW4gYSBzdGF0aWMgc28gaXQgd29uJ3QgYmUgZ2MnZWQgYmVjYXVzZSB0aGUgaml0CiAgICAgICAgIC8vIG9wdGltaXplZCBpdCBvdXQKQEAgLTkwLDYgKzExNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlI3JlbW92ZShsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVKKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0TnVsbCgiUXVldWUgc2hvdWxkIGJlIGVtcHR5LiAocG9sbCkiLCBycS5wb2xsKCkpOwpAQCAtMTEwLDYgKzE0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlI1JlZmVyZW5jZVF1ZXVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJlZmVyZW5jZVF1ZXVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVXNlZCBmb3IgdGVzdGluZy4iLCB0cnVlKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVRlc3QuamF2YQppbmRleCA2OGIwZDg4Li5lNGQ1NWIwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VUZXN0LmphdmEKQEAgLTE2LDE4ICsxNiw3MiBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhSZWZlcmVuY2UuY2xhc3MpIAogcHVibGljIGNsYXNzIFJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIE9iamVjdCB0bXBBLCB0bXBCLCBvYmo7CiAKICAgICB2b2xhdGlsZSBXZWFrUmVmZXJlbmNlIHdyOworCisgICAgLyogCisgICAgICogRm9yIHRlc3Rfc3ViY2xhc3MoKS4KKyAgICAgKi8KKyAgICBzdGF0aWMgVGVzdFdlYWtSZWZlcmVuY2UgdHdyOwogICAgIHN0YXRpYyBBc3NlcnRpb25GYWlsZWRFcnJvciBlcnJvcjsKICAgICBzdGF0aWMgYm9vbGVhbiB0ZXN0T2JqZWN0RmluYWxpemVkOworICAgIHN0YXRpYyBjbGFzcyBUZXN0V2Vha1JlZmVyZW5jZTxUPiBleHRlbmRzIFdlYWtSZWZlcmVuY2U8VD4geworICAgICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBjbGVhclNlZW4gPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gZW5xdWV1ZVNlZW4gPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgVGVzdFdlYWtSZWZlcmVuY2UoVCByZWZlcmVudCkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RXZWFrUmVmZXJlbmNlKFQgcmVmZXJlbnQsIFJlZmVyZW5jZVF1ZXVlPD8gc3VwZXIgVD4gcSkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbnQsIHEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBzdXBlci5jbGVhcigpOworICAgICAgICAgICAgY2xlYXJTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICh0ZXN0T2JqZWN0RmluYWxpemVkKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIkNsZWFyIHNob3VsZCBoYXBwZW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIGZpbmFsaXphdGlvbi4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbnF1ZXVlU2VlbikgeworICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJDbGVhciBzaG91bGQgaGFwcGVuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZSBlbnF1ZXVlLiIpOworICAgICAgICAgICAgICAgIHRocm93IGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZW5xdWV1ZSgpIHsKKyAgICAgICAgICAgIGVucXVldWVTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghY2xlYXJTZWVuKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIkNsZWFyIHNob3VsZCBoYXBwZW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIGVucXVldWUuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERvIHRoaXMgbGFzdDsgIGl0IG1heSBub3RpZnkgdGhlIG1haW4gdGVzdCB0aHJlYWQsCisgICAgICAgICAgICAgKiBhbmQgYW55dGhpbmcgd2UnZCBkbyBhZnRlciBpdCAoZS5nLiwgc2V0dGluZyBjbGVhclNlZW4pCisgICAgICAgICAgICAgKiB3b3VsZG4ndCBiZSBzZWVuLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5xdWV1ZSgpOworICAgICAgICB9CisgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZVN1aXRlKCkgewogICAgICAgICB0bXBBID0gdG1wQiA9IG9iaiA9IG51bGw7CkBAIC0zNiw2ICs5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgdG1wQSA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgdG1wQiA9IG5ldyBPYmplY3QoKTsKQEAgLTU0LDYgKzExNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSNlbnF1ZXVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5xdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW5xdWV1ZSgpIHsKICAgICAgICAgUmVmZXJlbmNlUXVldWUgcnEgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKICAgICAgICAgb2JqID0gbmV3IE9iamVjdCgpOwpAQCAtODEsNiArMTUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlI2VucXVldWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmFsKCkgewogICAgICAgICAvLyBUZXN0IHRoZSBnZW5lcmFsL292ZXJhbGwgZnVuY3Rpb25hbGl0eSBvZiBSZWZlcmVuY2UuCiAKQEAgLTE0Miw4ICsyMjMsMTAyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogTWFrZXMgc3VyZSB0aGF0IG92ZXJyaWRkZW4gdmVyc2lvbnMgb2YgY2xlYXIoKSBhbmQgZW5xdWV1ZSgpCisgICAgICogZ2V0IGNhbGxlZCwgYW5kIHRoYXQgY2xlYXIvZW5xdWV1ZS9maW5hbGl6ZSBoYXBwZW4gaW4gdGhlCisgICAgICogcmlnaHQgb3JkZXIgZm9yIFdlYWtSZWZlcmVuY2VzLgorICAgICAqCisgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlI2NsZWFyKCkKKyAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UjZW5xdWV1ZSgpCisgICAgICogQHRlc3RzIGphdmEubGFuZy5PYmplY3QjZmluYWxpemUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk1ha2VzIHN1cmUgdGhhdCBvdmVycmlkZGVuIHZlcnNpb25zIG9mIGNsZWFyKCkgYW5kIGVucXVldWUoKSAiICsgCisgICAgICAgICAgICAiIGdldCBjYWxsZWQsIGFuZCB0aGF0IGNsZWFyL2VucXVldWUvZmluYWxpemUgaGFwcGVuIGluIHRoZSAiICsgCisgICAgICAgICAgICAiIHJpZ2h0IG9yZGVyIGZvciBXZWFrUmVmZXJlbmNlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5xdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKworICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3Rfc3ViY2xhc3MoKSB7CisgICAgICAgIGVycm9yID0gbnVsbDsKKyAgICAgICAgdGVzdE9iamVjdEZpbmFsaXplZCA9IGZhbHNlOworICAgICAgICB0d3IgPSBudWxsOworCisgICAgICAgIGNsYXNzIFRlc3RPYmplY3QgeworICAgICAgICAgICAgcHVibGljIFRlc3RXZWFrUmVmZXJlbmNlIHRlc3RXZWFrUmVmZXJlbmNlID0gbnVsbDsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VGVzdFdlYWtSZWZlcmVuY2UoVGVzdFdlYWtSZWZlcmVuY2UgdHdyKSB7CisgICAgICAgICAgICAgICAgdGVzdFdlYWtSZWZlcmVuY2UgPSB0d3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICAgICAgICAgIHRlc3RPYmplY3RGaW5hbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICghdGVzdFdlYWtSZWZlcmVuY2UuY2xlYXJTZWVuKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJDbGVhciBzaG91bGQgaGFwcGVuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmUgZmluYWxpemUuIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlZmVyZW5jZVF1ZXVlIHJxID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7CisKKyAgICAgICAgY2xhc3MgVGVzdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBvYmplY3QgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gZW5zdXJlIGl0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAvLyBnYydlZAorICAgICAgICAgICAgICAgIFRlc3RPYmplY3QgdGVzdE9iaiA9IG5ldyBUZXN0T2JqZWN0KCk7CisgICAgICAgICAgICAgICAgdHdyID0gbmV3IFRlc3RXZWFrUmVmZXJlbmNlKHRlc3RPYmosIHJxKTsKKyAgICAgICAgICAgICAgICB0ZXN0T2JqLnNldFRlc3RXZWFrUmVmZXJlbmNlKHR3cik7CisgICAgICAgICAgICAgICAgdGVzdE9iaiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBSZWZlcmVuY2UgcmVmOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUZXN0VGhyZWFkKCk7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICAgICAgU3lzdGVtLnJ1bkZpbmFsaXphdGlvbigpOworICAgICAgICAgICAgcmVmID0gcnEucmVtb3ZlKDUwMDBMKTsgICAgLy8gR2l2ZSB1cCBhZnRlciBmaXZlIHNlY29uZHMuCisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk9iamVjdCBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQuIiwgcmVmKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgcmVmZXJlbmNlLiIsIHJlZiA9PSB0d3IpOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiT2JqZWN0IGNvdWxkIG5vdCBiZSByZWNsYWltZWQuIiwgdHdyLmdldCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk92ZXJyaWRkZW4gY2xlYXIoKSBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZC4iLAorICAgICAgICAgICAgICAgICAgICB0d3IuY2xlYXJTZWVuKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk92ZXJyaWRkZW4gZW5xdWV1ZSgpIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkLiIsCisgICAgICAgICAgICAgICAgICAgIHR3ci5lbnF1ZXVlU2Vlbik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJmaW5hbGl6ZSgpIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkLiIsCisgICAgICAgICAgICAgICAgICAgIHRlc3RPYmplY3RGaW5hbGl6ZWQpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSNnZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgdGhhdCBnZXQoKSBjYW4gcmV0dXJuIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXQoKSB7CiAgICAgICAgIC8vIFNNLgogICAgICAgICBvYmogPSBuZXcgT2JqZWN0KCk7CkBAIC0xNTQsNiArMzI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlI2lzRW5xdWV1ZWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VucXVldWVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0VucXVldWVkKCkgewogICAgICAgICBSZWZlcmVuY2VRdWV1ZSBycSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwogICAgICAgICBvYmogPSBuZXcgT2JqZWN0KCk7CkBAIC0xNjgsNjMgKzM1Miw3NSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgbm93IGJlIG5vdCBlbnF1ZXVlZC4iLCAhcmVmLmlzRW5xdWV1ZWQoKSk7CiAgICAgfQogCi0JLyogQ29udHJpdmVzIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvbmx5IHJlZmVyZW5jZSB0byBhIHN0cmluZwotCSAqIGlzIGEgV2Vha1JlZmVyZW5jZSBmcm9tIGFuIG9iamVjdCB0aGF0IGlzIGJlaW5nIGZpbmFsaXplZC4KLQkgKiBDaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlZmVyZW50IG9mIHRoZSBXZWFrUmVmZXJlbmNlCi0JICogaXMgc3RpbGwgcG9pbnRpbmcgdG8gYSB2YWxpZCBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9maW5hbGl6ZVJlZmVyZW5jZUludGVyYWN0aW9uKCkgewotCQllcnJvciA9IG51bGw7Ci0JCXRlc3RPYmplY3RGaW5hbGl6ZWQgPSBmYWxzZTsKKyAgICAvKiBDb250cml2ZXMgYSBzaXR1YXRpb24gd2hlcmUgdGhlIG9ubHkgcmVmZXJlbmNlIHRvIGEgc3RyaW5nCisgICAgICogaXMgYSBXZWFrUmVmZXJlbmNlIGZyb20gYW4gb2JqZWN0IHRoYXQgaXMgYmVpbmcgZmluYWxpemVkLgorICAgICAqIENoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVmZXJlbnQgb2YgdGhlIFdlYWtSZWZlcmVuY2UKKyAgICAgKiBpcyBzdGlsbCBwb2ludGluZyB0byBhIHZhbGlkIG9iamVjdC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDb250cml2ZXMgYSBzaXR1YXRpb24gd2hlcmUgdGhlIG9ubHkgcmVmZXJlbmNlIHRvIGEgc3RyaW5nICIgKyAKKyAgICAgICAgICAgICIgaXMgYSBXZWFrUmVmZXJlbmNlIGZyb20gYW4gb2JqZWN0IHRoYXQgaXMgYmVpbmcgZmluYWxpemVkLiAiICsgCisgICAgICAgICAgICAiIENoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVmZXJlbnQgb2YgdGhlIFdlYWtSZWZlcmVuY2UgIiArIAorICAgICAgICAgICAgIiBpcyBzdGlsbCBwb2ludGluZyB0byBhIHZhbGlkIG9iamVjdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbmFsaXplUmVmZXJlbmNlSW50ZXJhY3Rpb24oKSB7CisgICAgICAgIGVycm9yID0gbnVsbDsKKyAgICAgICAgdGVzdE9iamVjdEZpbmFsaXplZCA9IGZhbHNlOwogICAgIAotCQljbGFzcyBUZXN0T2JqZWN0IHsKLQkJCVdlYWtSZWZlcmVuY2U8U3RyaW5nPiBzdHJpbmdSZWY7CisgICAgICAgIGNsYXNzIFRlc3RPYmplY3QgeworICAgICAgICAgICAgV2Vha1JlZmVyZW5jZTxTdHJpbmc+IHN0cmluZ1JlZjsKIAotCQkJcHVibGljIFRlc3RPYmplY3QoU3RyaW5nIHJlZmVyZW50KSB7Ci0JCQkJc3RyaW5nUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8U3RyaW5nPihyZWZlcmVudCk7Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgVGVzdE9iamVjdChTdHJpbmcgcmVmZXJlbnQpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmdSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxTdHJpbmc+KHJlZmVyZW50KTsKKyAgICAgICAgICAgIH0KIAotCQkJcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLyogSWYgYSBWTSBidWcgaGFzIGNhdXNlZCB0aGUgcmVmZXJlbnQgdG8gZ2V0Ci0JCQkJCSAqIGZyZWVkIHdpdGhvdXQgdGhlIHJlZmVyZW5jZSBnZXR0aW5nIGNsZWFyZWQsCi0JCQkJCSAqIGxvb2tpbmcgaXQgdXAsIGFzc2lnbmluZyBpdCB0byBhIGxvY2FsIGFuZAotCQkJCQkgKiBkb2luZyBhIEdDIHNob3VsZCBjYXVzZSBzb21lIHNvcnQgb2YgZXhjZXB0aW9uLgotCQkJCQkgKi8KLQkJCQkJU3RyaW5nIHMgPSBzdHJpbmdSZWYuZ2V0KCk7Ci0JCQkJCVN5c3RlbS5nYygpOwotCQkJCQl0ZXN0T2JqZWN0RmluYWxpemVkID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQllcnJvciA9IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigic29tZXRoaW5nIHRocmV3ICciICsgdCArCi0JCQkJCQkJIicgaW4gZmluYWxpemUoKSIpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgYSBWTSBidWcgaGFzIGNhdXNlZCB0aGUgcmVmZXJlbnQgdG8gZ2V0CisgICAgICAgICAgICAgICAgICAgICAqIGZyZWVkIHdpdGhvdXQgdGhlIHJlZmVyZW5jZSBnZXR0aW5nIGNsZWFyZWQsCisgICAgICAgICAgICAgICAgICAgICAqIGxvb2tpbmcgaXQgdXAsIGFzc2lnbmluZyBpdCB0byBhIGxvY2FsIGFuZAorICAgICAgICAgICAgICAgICAgICAgKiBkb2luZyBhIEdDIHNob3VsZCBjYXVzZSBzb21lIHNvcnQgb2YgZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBzdHJpbmdSZWYuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICAgICAgICAgICAgICB0ZXN0T2JqZWN0RmluYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigic29tZXRoaW5nIHRocmV3ICciICsgdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW4gZmluYWxpemUoKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWNsYXNzIFRlc3RUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIENyZWF0ZSB0aGUgb2JqZWN0IGluIGEgc2VwYXJhdGUgdGhyZWFkIHRvIGVuc3VyZSBpdCB3aWxsIGJlCi0JCQkJLy8gZ2MnZWQKLQkJCQlUZXN0T2JqZWN0IHRlc3RPYmogPSBuZXcgVGVzdE9iamVjdChuZXcgU3RyaW5nKCJzdXAgL2IvIikpOwotCQkJfQotCQl9CisgICAgICAgIGNsYXNzIFRlc3RUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgb2JqZWN0IGluIGEgc2VwYXJhdGUgdGhyZWFkIHRvIGVuc3VyZSBpdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgLy8gZ2MnZWQKKyAgICAgICAgICAgICAgICBUZXN0T2JqZWN0IHRlc3RPYmogPSBuZXcgVGVzdE9iamVjdChuZXcgU3RyaW5nKCJzdXAgL2IvIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCVRocmVhZCB0ID0gbmV3IFRlc3RUaHJlYWQoKTsKLQkJCXQuc3RhcnQoKTsKLQkJCXQuam9pbigpOwotCQkJU3lzdGVtLmdjKCk7Ci0JCQlTeXN0ZW0ucnVuRmluYWxpemF0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUZXN0VGhyZWFkKCk7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICAgICAgU3lzdGVtLnJ1bkZpbmFsaXphdGlvbigpOwogCi0JCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCXRocm93IGVycm9yOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiZmluYWxpemUoKSBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZC4iLAotCQkJCQl0ZXN0T2JqZWN0RmluYWxpemVkKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiSW50ZXJydXB0ZWRFeGNlcHRpb24gOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoImZpbmFsaXplKCkgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdE9iamVjdEZpbmFsaXplZCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkludGVycnVwdGVkRXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvU29mdFJlZmVyZW5jZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9Tb2Z0UmVmZXJlbmNlVGVzdC5qYXZhCmluZGV4IGZlNWUyMzAuLjVkYTZhZTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9Tb2Z0UmVmZXJlbmNlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZi9Tb2Z0UmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0xNiw5ICsxNiwxNSBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU29mdFJlZmVyZW5jZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU29mdFJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIHN0YXRpYyBCb29sZWFuIGJvb2w7CiAKQEAgLTMwLDYgKzM2LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZSNTb2Z0UmVmZXJlbmNlKGphdmEubGFuZy5PYmplY3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvZnRSZWZlcmVuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzLCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX3JlZl9SZWZlcmVuY2VRdWV1ZSgpIHsKICAgICAgICAgUmVmZXJlbmNlUXVldWUgcnEgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKICAgICAgICAgYm9vbCA9IG5ldyBCb29sZWFuKHRydWUpOwpAQCAtNTMsNiArNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlI1NvZnRSZWZlcmVuY2UoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29mdFJlZmVyZW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgYm9vbCA9IG5ldyBCb29sZWFuKHRydWUpOwogICAgICAgICB0cnkgewpAQCAtNjcsNiArOTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlI2dldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZmllZCB0aGF0IGdldCgpIGNhbiByZXR1cm4gbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldCgpIHsKICAgICAgICAgYm9vbCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKICAgICAgICAgU29mdFJlZmVyZW5jZSBzciA9IG5ldyBTb2Z0UmVmZXJlbmNlKGJvb2wpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2VUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZVRlc3QuamF2YQppbmRleCBkMDBhOTFlLi5kZGY2ZWEzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZVRlc3QuamF2YQpAQCAtMTcsOSArMTcsMTUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCitAVGVzdFRhcmdldENsYXNzKFdlYWtSZWZlcmVuY2UuY2xhc3MpIAogcHVibGljIGNsYXNzIFdlYWtSZWZlcmVuY2VUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBzdGF0aWMgQm9vbGVhbiBib29sOwogCkBAIC0zMSw2ICszNywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UjV2Vha1JlZmVyZW5jZShqYXZhLmxhbmcuT2JqZWN0LAogICAgICAqICAgICAgICBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJXZWFrUmVmZXJlbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19yZWZfUmVmZXJlbmNlUXVldWUoKSB7CiAgICAgICAgIFJlZmVyZW5jZVF1ZXVlIHJxID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7CiAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbih0cnVlKTsKQEAgLTU3LDYgKzcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSNXZWFrUmVmZXJlbmNlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIldlYWtSZWZlcmVuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbih0cnVlKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQWNjZXNzaWJsZU9iamVjdFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQWNjZXNzaWJsZU9iamVjdFRlc3QuamF2YQppbmRleCAyNGI0MjU1Li4xYmEyYTI3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3RUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9BY2Nlc3NpYmxlT2JqZWN0VGVzdC5qYXZhCkBAIC0xNyw4ICsxNywxNCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmbGVjdDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQWNjZXNzaWJsZU9iamVjdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQWNjZXNzaWJsZU9iamVjdFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHVibGljIGNsYXNzIFRlc3RDbGFzcyB7CkBAIC0yOCw2ICszNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0I2lzQWNjZXNzaWJsZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQWNjZXNzaWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNBY2Nlc3NpYmxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0LmlzQWNjZXNzaWJsZSgpCkBAIC00Niw2ICs2MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0I3NldEFjY2Vzc2libGUoamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdFtdLAogICAgICAqICAgICAgICBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFNlY3VyaXR5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEFjY2Vzc2libGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdFtdLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEFjY2Vzc2libGUkTGphdmFfbGFuZ19yZWZsZWN0X0FjY2Vzc2libGVPYmplY3RaKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdApAQCAtNjUsNiArODksMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdCNzZXRBY2Nlc3NpYmxlKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCwgc2V0QWNjZXNzaWJsZShib29sZWFuKSBtZXRob2QgaXMgbm90ICIgKworICAgICAgICAgICAgInZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEFjY2Vzc2libGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRBY2Nlc3NpYmxlWigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdC5zZXRBY2Nlc3NpYmxlKGJvb2xlYW4pCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0FycmF5VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9BcnJheVRlc3QuamF2YQppbmRleCAxMWZlOWFlLi40OTVkMDQwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0FycmF5VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQXJyYXlUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmbGVjdDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogCitAVGVzdFRhcmdldENsYXNzKEFycmF5LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBBcnJheVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I2dldChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgb25seSBpbnQgYXJyYXkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMamF2YV9sYW5nX09iamVjdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCkBAIC02Miw2ICs3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSNnZXRCb29sZWFuKGphdmEubGFuZy5PYmplY3QsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCb29sZWFuTGphdmFfbGFuZ19PYmplY3RJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXRCb29sZWFuKGphdmEubGFuZy5PYmplY3QsIGludCkKQEAgLTk4LDYgKzEyMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSNnZXRCeXRlKGphdmEubGFuZy5PYmplY3QsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCeXRlTGphdmFfbGFuZ19PYmplY3RJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZQogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXRCeXRlKGphdmEubGFuZy5PYmplY3QsIGludCkKQEAgLTEzNCw2ICsxNjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkjZ2V0Q2hhcihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckxqYXZhX2xhbmdfT2JqZWN0SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGNoYXIKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0Q2hhcihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCkBAIC0xNzAsNiArMjEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I2dldERvdWJsZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREb3VibGVMamF2YV9sYW5nX09iamVjdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0RG91YmxlKGphdmEubGFuZy5PYmplY3QsIGludCkKQEAgLTIwNyw2ICsyNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkjZ2V0RmxvYXQoamF2YS5sYW5nLk9iamVjdCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGbG9hdExqYXZhX2xhbmdfT2JqZWN0SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0CiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldEZsb2F0KGphdmEubGFuZy5PYmplY3QsIGludCkKQEAgLTI0Myw2ICszMDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkjZ2V0SW50KGphdmEubGFuZy5PYmplY3QsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGFueSBib3VuZGFyeSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludExqYXZhX2xhbmdfT2JqZWN0SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXRJbnQoamF2YS5sYW5nLk9iamVjdCwKICAgICAgICAgLy8gaW50KQpAQCAtMjc5LDYgKzM0OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSNnZXRMZW5ndGgoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGVuZ3RoTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0TGVuZ3RoKGphdmEubGFuZy5PYmplY3QpCkBAIC0yOTksNiArMzc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I2dldExvbmcoamF2YS5sYW5nLk9iamVjdCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb25nTGphdmFfbGFuZ19PYmplY3RJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZwogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXRMb25nKGphdmEubGFuZy5PYmplY3QsIGludCkKQEAgLTMzNSw2ICs0MjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkjZ2V0U2hvcnQoamF2YS5sYW5nLk9iamVjdCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hvcnRMamF2YV9sYW5nX09iamVjdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBzaG9ydAogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXRTaG9ydChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCkBAIC0zNzEsNiArNDY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I25ld0luc3RhbmNlKGphdmEubGFuZy5DbGFzcywgaW50W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBhcmUgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld0luc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzcywgaW50W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3SW5zdGFuY2VMamF2YV9sYW5nX0NsYXNzJEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGphdmEubGFuZy5DbGFzcywgaW50IFtdKQpAQCAtMzg1LDYgKzQ5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSNuZXdJbnN0YW5jZShqYXZhLmxhbmcuQ2xhc3MsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGFyZSBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3SW5zdGFuY2VMamF2YV9sYW5nX0NsYXNzSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoamF2YS5sYW5nLkNsYXNzLCBpbnQpCkBAIC0zOTgsNiArNTEyLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I3NldChqYXZhLmxhbmcuT2JqZWN0LCBpbnQsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGphdmFfbGFuZ19PYmplY3RJTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5yZWZsZWN0LkFycmF5LnNldChqYXZhLmxhbmcuT2JqZWN0LAogICAgICAgICAvLyBpbnQsIGphdmEubGFuZy5PYmplY3QpCkBAIC00NDQsNiArNTY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I3NldEJvb2xlYW4oamF2YS5sYW5nLk9iamVjdCwgaW50LCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRCb29sZWFuTGphdmFfbGFuZ19PYmplY3RJWigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0Qm9vbGVhbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGJvb2xlYW4pCkBAIC00NzksNiArNjExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I3NldEJ5dGUoamF2YS5sYW5nLk9iamVjdCwgaW50LCBieXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzcywgYnl0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRCeXRlTGphdmFfbGFuZ19PYmplY3RJQigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0Qnl0ZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGJ5dGUpCkBAIC01MTQsNiArNjU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I3NldENoYXIoamF2YS5sYW5nLk9iamVjdCwgaW50LCBjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRDaGFyTGphdmFfbGFuZ19PYmplY3RJQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0Q2hhcihqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGNoYXIpCkBAIC01NDksNiArNjk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I3NldERvdWJsZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERvdWJsZUxqYXZhX2xhbmdfT2JqZWN0SUQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkFycmF5LnNldERvdWJsZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGRvdWJsZSkKQEAgLTU4NCw2ICs3NDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkjc2V0RmxvYXQoamF2YS5sYW5nLk9iamVjdCwgaW50LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgaW50LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRGbG9hdExqYXZhX2xhbmdfT2JqZWN0SUYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkFycmF5LnNldEZsb2F0KGphdmEubGFuZy5PYmplY3QsIGludCwgZmxvYXQpCkBAIC02MTksNiArNzg3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkFycmF5I3NldEludChqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEludExqYXZhX2xhbmdfT2JqZWN0SUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubGFuZy5yZWZsZWN0LkFycmF5LnNldEludChqYXZhLmxhbmcuT2JqZWN0LAogICAgICAgICAvLyBpbnQsIGludCkKQEAgLTY1NCw2ICs4MzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkjc2V0TG9uZyhqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXNub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9uZ0xqYXZhX2xhbmdfT2JqZWN0SUooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkFycmF5LnNldExvbmcoamF2YS5sYW5nLk9iamVjdCwgaW50LCBsb25nKQpAQCAtNjg5LDYgKzg3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSNzZXRTaG9ydChqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIHNob3J0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3MsIHNob3J0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNob3J0TGphdmFfbGFuZ19PYmplY3RJUygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0U2hvcnQoamF2YS5sYW5nLk9iamVjdCwgaW50LCBzaG9ydCkKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQm91bmRlZEdlbmVyaWNNZXRob2RzVGVzdHMuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQm91bmRlZEdlbmVyaWNNZXRob2RzVGVzdHMuamF2YQppbmRleCA5OGZjMDM5Li4xYTE3YzM3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0JvdW5kZWRHZW5lcmljTWV0aG9kc1Rlc3RzLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9Cb3VuZGVkR2VuZXJpY01ldGhvZHNUZXN0cy5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmbGVjdDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZTsKQEAgLTIzLDYgKzI4LDcgQEAKIC8qKgogICogVGVzdHMgYm91bmRlZCB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgb24gbWV0aG9kcy4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhNZXRob2QuY2xhc3MpIAogcHVibGljIGNsYXNzIEJvdW5kZWRHZW5lcmljTWV0aG9kc1Rlc3RzIGV4dGVuZHMgR2VuZXJpY1JlZmxlY3Rpb25UZXN0c0Jhc2UgewogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHN0YXRpYyBjbGFzcyBCb3VuZGVkR2VuZXJpY01ldGhvZHM8Uz4gewpAQCAtMTAxLDI4ICsxMDcsNjkgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IHRoZXJlIGFyZSBpcyBvbmUgVHlwZSBQYXJhbWV0ZXIgb24gdGhlIENsYXNzIGl0c2VsZi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCb3VuZGVkR2VuZXJpY01ldGhvZHMoKSB7CiAgICAgICAgIGFzc2VydExlbmdodE9uZShjbGF6ei5nZXRUeXBlUGFyYW1ldGVycygpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1BhcmFtTm9SZXR1cm4oKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoIm5vUGFyYW1Ob1JldHVybiIpOwogICAgICAgICBjaGVja0JvdW5kZWRUeXBlUGFyYW1ldGVyKG1ldGhvZCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5ib3VuZGVkUGFyYW1Ob1JldHVybigpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgicGFyYW1Ob1JldHVybiIsIEJvdW5kZWRHZW5lcmljTWV0aG9kcy5jbGFzcyk7CiAgICAgICAgIGNoZWNrQm91bmRlZFR5cGVQYXJhbWV0ZXIobWV0aG9kKTsKICAgICAgICAgcGFyYW1ldGVyVHlwZShtZXRob2QpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgR2VuZXJpY1NpZ25hdHVyZUZvcm1hdEVycm9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vUGFyYW1SZXR1cm4oKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoIm5vUGFyYW1SZXR1cm4iKTsKICAgICAgICAgY2hlY2tCb3VuZGVkVHlwZVBhcmFtZXRlcihtZXRob2QpOwogICAgICAgICBhc3NlcnRMZW5naHRaZXJvKG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSk7CiAgICAgICAgIGNoZWNrUmV0dXJuVHlwZShtZXRob2QpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgR2VuZXJpY1NpZ25hdHVyZUZvcm1hdEVycm9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVuYm91bmRlZFBhcmFtUmV0dXJuKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJwYXJhbVJldHVybiIsIEJvdW5kZWRHZW5lcmljTWV0aG9kcy5jbGFzcyk7CiAgICAgICAgIGNoZWNrQm91bmRlZFR5cGVQYXJhbWV0ZXIobWV0aG9kKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQm91bmRlZFdpbGRjYXJkc0dlbmVyaWNNZXRob2RzVGVzdHMuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQm91bmRlZFdpbGRjYXJkc0dlbmVyaWNNZXRob2RzVGVzdHMuamF2YQppbmRleCA2NGY5YjBlLi5jMWM3OWE1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0JvdW5kZWRXaWxkY2FyZHNHZW5lcmljTWV0aG9kc1Rlc3RzLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9Cb3VuZGVkV2lsZGNhcmRzR2VuZXJpY01ldGhvZHNUZXN0cy5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwpAQCAtMjYsNiArMzEsNyBAQAogLyoqCiAgKiBUZXN0cyBib3VuZGVkIHR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBvbiBtZXRob2RzIGFuZCBib3VuZGVkIHdpbGRjYXJkcy4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhNZXRob2QuY2xhc3MpIAogcHVibGljIGNsYXNzIEJvdW5kZWRXaWxkY2FyZHNHZW5lcmljTWV0aG9kc1Rlc3RzIGV4dGVuZHMgR2VuZXJpY1JlZmxlY3Rpb25UZXN0c0Jhc2UgewogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIiwgImhpZGluZyJ9KQogICAgIHN0YXRpYyBjbGFzcyBCb3VuZGVkV2lsZGNhcmRzR2VuZXJpY01ldGhvZHM8VD4gewpAQCAtNDUsNiArNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IHRoZXJlIGFyZSBpcyBvbmUgVHlwZSBQYXJhbWV0ZXIgb24gdGhlIENsYXNzIGl0c2VsZi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCb3VuZGVkR2VuZXJpY01ldGhvZHMoKSB7CiAgICAgICAgIGFzc2VydExlbmdodE9uZShjbGF6ei5nZXRUeXBlUGFyYW1ldGVycygpKTsKICAgICB9CkBAIC0xMjEsMjcgKzEzNiw1OSBAQAogCiAgICAgICAgIGFzc2VydEVxdWFscyhCb3VuZGVkV2lsZGNhcmRzR2VuZXJpY01ldGhvZHMuY2xhc3MsIGJvdW5kKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBHZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBwZXJCb3VuZGVkUGFyYW1Ob1JldHVybigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJ1cHBlckJvdW5kZWRQYXJhbU5vUmV0dXJuIiwgQm91bmRlZFdpbGRjYXJkc0dlbmVyaWNNZXRob2RzLmNsYXNzKTsKICAgICAgICAgY2hlY2tCb3VuZGVkVHlwZVBhcmFtZXRlcihtZXRob2QpOwogICAgICAgICBjaGVja1VwcGVyQm91bmRlZFBhcmFtZXRlcihtZXRob2QpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgR2VuZXJpY1NpZ25hdHVyZUZvcm1hdEVycm9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvd2VyQm91bmRlZFBhcmFtUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoImxvd2VyQm91bmRlZFBhcmFtUmV0dXJuIiwgQm91bmRlZFdpbGRjYXJkc0dlbmVyaWNNZXRob2RzLmNsYXNzKTsKICAgICAgICAgY2hlY2tCb3VuZGVkVHlwZVBhcmFtZXRlcihtZXRob2QpOwogICAgICAgICBjaGVja0xvd2VyQm91bmRlZFBhcmFtZXRlcihtZXRob2QpOwogICAgICAgICBjaGVja1JldHVyblR5cGUobWV0aG9kKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIEdlbmVyaWNTaWduYXR1cmVGb3JtYXRFcnJvci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVcHBlckJvdW5kZWRQYXJhbVJldHVybigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJ1cHBlckJvdW5kZWRQYXJhbVJldHVybiIsIEJvdW5kZWRXaWxkY2FyZHNHZW5lcmljTWV0aG9kcy5jbGFzcyk7CiAgICAgICAgIGNoZWNrQm91bmRlZFR5cGVQYXJhbWV0ZXIobWV0aG9kKTsKICAgICAgICAgY2hlY2tVcHBlckJvdW5kZWRQYXJhbWV0ZXIobWV0aG9kKTsKICAgICAgICAgY2hlY2tSZXR1cm5UeXBlKG1ldGhvZCk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG93ZXJCb3VuZGVkUGFyYW1Ob1JldHVybigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJsb3dlckJvdW5kZWRQYXJhbU5vUmV0dXJuIiwgQm91bmRlZFdpbGRjYXJkc0dlbmVyaWNNZXRob2RzLmNsYXNzKTsKICAgICAgICAgY2hlY2tCb3VuZGVkVHlwZVBhcmFtZXRlcihtZXRob2QpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3JUZXN0LmphdmEKaW5kZXggYzE4ZWMxOS4uYzRlZWYyOGEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMTcsOSArMTcsMTUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhDb25zdHJ1Y3Rvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIHN0YXRpYyBjbGFzcyBDb25zdHJ1Y3RvclRlc3RIZWxwZXIgZXh0ZW5kcyBPYmplY3QgewpAQCAtNDYsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKQEAgLTY5LDYgKzg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yI2dldERlY2xhcmluZ0NsYXNzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVjbGFyaW5nQ2xhc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlY2xhcmluZ0NsYXNzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkNsYXNzCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkKQEAgLTg2LDYgKzExMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciNnZXRFeGNlcHRpb25UeXBlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEV4Y2VwdGlvblR5cGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFeGNlcHRpb25UeXBlcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzcyBbXQogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5nZXRFeGNlcHRpb25UeXBlcygpCkBAIC0xMDcsNiArMTQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yI2dldE1vZGlmaWVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1vZGlmaWVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kaWZpZXJzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpCiAgICAgICAgIGludCBtb2QgPSAwOwpAQCAtMTQ3LDYgKzE4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciNnZXROYW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuZ2V0TmFtZSgpCkBAIC0xNjcsNiArMjE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yI2dldFBhcmFtZXRlclR5cGVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmFtZXRlclR5cGVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkNsYXNzIFtdCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCkKQEAgLTE5OCw2ICsyNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IjbmV3SW5zdGFuY2UoamF2YS5sYW5nLk9iamVjdFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3SW5zdGFuY2UkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGphdmEubGFuZy5PYmplY3QgW10pCkBAIC0yMTYsNiArMjg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci50b1N0cmluZygpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9GaWVsZFRlc3QuamF2YQppbmRleCA2ZjJmYzJiLi4xNjE5NjBkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvRmllbGRUZXN0LmphdmEKQEAgLTE3LDExICsxNywxNyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmbGVjdDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0ZpZWxkOwogCitAVGVzdFRhcmdldENsYXNzKEZpZWxkLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGaWVsZFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCkBAIC05MCw2ICs5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTE0LDYgKzEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCNnZXQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJuZWVkIHRvIGltcHJvdmUgdHJ5L2NhdGNoIGNvZGUuIERvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGphdmFfbGFuZ19PYmplY3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuZ2V0KGphdmEubGFuZy5PYmplY3QpCkBAIC0yNzEsNiArMjk1LDc5IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI3NldERvdWJsZShqYXZhLmxhbmcuT2JqZWN0LCBkb3VibGUpCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI3NldENoYXIoamF2YS5sYW5nLk9iamVjdCwgY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdHJlc3MgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qm9vbGVhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Qm9vbGVhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgYnl0ZS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBzaG9ydC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3RlY3RlZEZpZWxkQWNjZXNzKCkgewogICAgICAgICBDbGFzcyBmaWVsZENsYXNzID0gbmV3IFN1cHBvcnRfRmllbGQoKS5nZXRDbGFzcygpOwogICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gbnVsbDsKQEAgLTQ3Myw2ICs1NzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjZ2V0Qm9vbGVhbihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIm5lZWQgdG8gaW1wcm92ZSB0cnkvY2F0Y2ggY29kZS4gRG9lc24ndCBjaGVjayBhbGwgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm9vbGVhbkxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5nZXRCb29sZWFuKGphdmEubGFuZy5PYmplY3QpCkBAIC01MDYsNiArNjEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI2dldEJ5dGUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJuZWVkIHRvIGltcHJvdmUgdHJ5L2NhdGNoIGNvZGUuIERvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ5dGVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJ5dGUKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuZ2V0Qnl0ZShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNTM3LDYgKzY1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCNnZXRDaGFyKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAibmVlZCB0byBpbXByb3ZlIHRyeS9jYXRjaCBjb2RlLiBEb2Vzbid0IGNoZWNrIGFsbCBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBjaGFyCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldENoYXIoamF2YS5sYW5nLk9iamVjdCkKQEAgLTU2OCw2ICs2OTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjZ2V0RGVjbGFyaW5nQ2xhc3MoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNsYXJpbmdDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuQ2xhc3MKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKQpAQCAtNTkxLDYgKzcyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCNnZXREb3VibGUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJuZWVkIHRvIGltcHJvdmUgdHJ5L2NhdGNoIGNvZGUuIERvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RG91YmxlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuZ2V0RG91YmxlKGphdmEubGFuZy5PYmplY3QpCkBAIC02MjMsNiArNzY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI2dldEZsb2F0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAibmVlZCB0byBpbXByb3ZlIHRyeS9jYXRjaCBjb2RlLiBEb2Vzbid0IGNoZWNrIGFsbCBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmxvYXRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0CiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldEZsb2F0KGphdmEubGFuZy5PYmplY3QpCkBAIC02NTUsNiArODA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI2dldEludChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIm5lZWQgdG8gaW1wcm92ZSB0cnkvY2F0Y2ggY29kZS4gRG9lc24ndCBjaGVjayBhbGwgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5nZXRJbnQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgVGVzdEZpZWxkIHggPSBuZXcgVGVzdEZpZWxkKCk7CkBAIC02ODYsNiArODQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI2dldExvbmcoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJuZWVkIHRvIGltcHJvdmUgdHJ5L2NhdGNoIGNvZGUuIERvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExvbmdMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuZ2V0TG9uZyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNzE3LDYgKzg4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCNnZXRNb2RpZmllcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNb2RpZmllcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZGlmaWVycygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5nZXRNb2RpZmllcnMoKQogICAgICAgICBUZXN0RmllbGQgeCA9IG5ldyBUZXN0RmllbGQoKTsKQEAgLTczNyw2ICs5MTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjZ2V0TmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldE5hbWUoKQogICAgICAgICBUZXN0RmllbGQgeCA9IG5ldyBUZXN0RmllbGQoKTsKQEAgLTc1Myw2ICs5NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjZ2V0U2hvcnQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJuZWVkIHRvIGltcHJvdmUgdHJ5L2NhdGNoIGNvZGUuIERvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2hvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgc2hvcnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hvcnRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHNob3J0CiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldFNob3J0KGphdmEubGFuZy5PYmplY3QpCkBAIC03ODYsNiArOTgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI2dldFR5cGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkNsYXNzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldFR5cGUoKQogICAgICAgICBUZXN0RmllbGQgeCA9IG5ldyBUZXN0RmllbGQoKTsKQEAgLTgwMiw2ICsxMDA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI3NldChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuc2V0KGphdmEubGFuZy5PYmplY3QsCiAgICAgICAgIC8vIGphdmEubGFuZy5PYmplY3QpCkBAIC04NDYsNiArMTA2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCNzZXRCb29sZWFuKGphdmEubGFuZy5PYmplY3QsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBhbGwgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm9vbGVhbkxqYXZhX2xhbmdfT2JqZWN0WigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuc2V0Qm9vbGVhbihqYXZhLmxhbmcuT2JqZWN0LCBib29sZWFuKQpAQCAtODg2LDYgKzExMDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjc2V0Qnl0ZShqYXZhLmxhbmcuT2JqZWN0LCBieXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Qnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEJ5dGVMamF2YV9sYW5nX09iamVjdEIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLnNldEJ5dGUoamF2YS5sYW5nLk9iamVjdCwgYnl0ZSkKQEAgLTkyNiw2ICsxMTU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI3NldENoYXIoamF2YS5sYW5nLk9iamVjdCwgY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGFsbCBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRDaGFyTGphdmFfbGFuZ19PYmplY3RDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5zZXRDaGFyKGphdmEubGFuZy5PYmplY3QsIGNoYXIpCkBAIC05NjYsNiArMTIwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCNzZXREb3VibGUoamF2YS5sYW5nLk9iamVjdCwgZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYWxsIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXREb3VibGVMamF2YV9sYW5nX09iamVjdEQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLnNldERvdWJsZShqYXZhLmxhbmcuT2JqZWN0LCBkb3VibGUpCkBAIC0xMDA2LDYgKzEyNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjc2V0RmxvYXQoamF2YS5sYW5nLk9iamVjdCwgZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBhbGwgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRGbG9hdExqYXZhX2xhbmdfT2JqZWN0RigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuc2V0RmxvYXQoamF2YS5sYW5nLk9iamVjdCwgZmxvYXQpCkBAIC0xMDQ1LDYgKzEzMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjc2V0SW50KGphdmEubGFuZy5PYmplY3QsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGFsbCBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SW50TGphdmFfbGFuZ19PYmplY3RJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5zZXRJbnQoamF2YS5sYW5nLk9iamVjdCwKICAgICAgICAgLy8gaW50KQpAQCAtMTA4NCw2ICsxMzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkI3NldExvbmcoamF2YS5sYW5nLk9iamVjdCwgbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGFsbCBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRMb25nTGphdmFfbGFuZ19PYmplY3RKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5zZXRMb25nKGphdmEubGFuZy5PYmplY3QsIGxvbmcpCkBAIC0xMTIzLDYgKzE0MDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjc2V0U2hvcnQoamF2YS5sYW5nLk9iamVjdCwgc2hvcnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBhbGwgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBzaG9ydC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTaG9ydExqYXZhX2xhbmdfT2JqZWN0UygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuc2V0U2hvcnQoamF2YS5sYW5nLk9iamVjdCwgc2hvcnQpCkBAIC0xMTYyLDYgKzE0NDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLnRvU3RyaW5nKCkKICAgICAgICAgRmllbGQgZiA9IG51bGw7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNBcnJheVR5cGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNBcnJheVR5cGVUZXN0LmphdmEKaW5kZXggYjAxOGQ5NC4uMmEzZDkzMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljQXJyYXlUeXBlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY0FycmF5VHlwZVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwpAQCAtMjUsMTIgKzMwLDIxIEBACiAvKioKICAqIFRlc3RzIGdlbmVyaWMgcmVmbGVjdGlvbiBvbiBhcnJheXMgd2l0aCBnZW5lcmljIG9yIHBhcmFtZXRlcml6ZWQgY29tcG9uZW50IHR5cGVzLgogICovCitAVGVzdFRhcmdldENsYXNzKEZpZWxkLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBHZW5lcmljQXJyYXlUeXBlVGVzdCBleHRlbmRzIEdlbmVyaWNSZWZsZWN0aW9uVGVzdHNCYXNlIHsKIAogICAgIHN0YXRpYyBjbGFzcyBBPFQ+IHsKICAgICAgICAgVFtdIGFycmF5OwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdCB3aXRoIFR5cGUgYW5kIFR5cGVWYXJpYWJsZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljVHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgQT4gY2xhenogPSBHZW5lcmljQXJyYXlUeXBlVGVzdC5BLmNsYXNzOwogICAgICAgICBGaWVsZCBmaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoImFycmF5Iik7CkBAIC00Nyw3ICs2MSwxNSBAQAogICAgIHN0YXRpYyBjbGFzcyBCPFQ+IHsKICAgICAgICAgQjxUPltdIGFycmF5OwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdCB3aXRoIFR5cGUgYW5kIFR5cGVWYXJpYWJsZS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljVHlwZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJpemVkQ29tcG9uZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgQj4gY2xhenogPSBHZW5lcmljQXJyYXlUeXBlVGVzdC5CLmNsYXNzOwogICAgICAgICBGaWVsZCBmaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoImFycmF5Iik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNNZXRob2RzVGVzdHMuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY01ldGhvZHNUZXN0cy5qYXZhCmluZGV4IDhhYTMxOGQuLmEwMDhlZGIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY01ldGhvZHNUZXN0cy5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY01ldGhvZHNUZXN0cy5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZTsKQEAgLTI1LDYgKzMwLDcgQEAKIC8qKgogICogVGVzdHMgdW5ib3VuZGVkIHR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBvbiBtZXRob2RzLgogICovCitAVGVzdFRhcmdldENsYXNzKE1ldGhvZC5jbGFzcykKIHB1YmxpYyBjbGFzcyBHZW5lcmljTWV0aG9kc1Rlc3RzIGV4dGVuZHMgR2VuZXJpY1JlZmxlY3Rpb25UZXN0c0Jhc2V7CiAKICAgICBzdGF0aWMgY2xhc3MgR2VuZXJpY01ldGhvZHMgewpAQCAtNDQsNiArNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IHRoZXJlIGFyZSBubyBUeXBlIFBhcmFtZXRlcnMgb24gdGhlIENsYXNzIGl0c2VsZi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljTWV0aG9kcygpIHsKICAgICAgICAgYXNzZXJ0TGVuZ2h0WmVybyhjbGF6ei5nZXRUeXBlUGFyYW1ldGVycygpKTsKICAgICB9CkBAIC04MywzMiArOTgsODQgQEAKICAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihUeXBlVmFyaWFibGUuY2xhc3MsIGdlbmVyaWNSZXR1cm5UeXBlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZCwgKChUeXBlVmFyaWFibGU8Pz4pIGdlbmVyaWNSZXR1cm5UeXBlKS5nZXRHZW5lcmljRGVjbGFyYXRpb24oKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vUGFyYW1Ob1JldHVybigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJub1BhcmFtTm9SZXR1cm4iKTsKICAgICAgICAgY2hlY2tUeXBlUGFyYW1ldGVyKG1ldGhvZCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1Ob1JldHVybigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJwYXJhbU5vUmV0dXJuIiwgT2JqZWN0LmNsYXNzKTsKICAgICAgICAgY2hlY2tUeXBlUGFyYW1ldGVyKG1ldGhvZCk7CiAgICAgICAgIGNoZWNrUGFyYW1ldGVyVHlwZShtZXRob2QpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1BhcmFtUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoIm5vUGFyYW1SZXR1cm4iKTsKICAgICAgICAgY2hlY2tUeXBlUGFyYW1ldGVyKG1ldGhvZCk7CiAgICAgICAgIGFzc2VydExlbmdodFplcm8obWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpKTsKICAgICAgICAgY2hlY2tSZXR1cm5UeXBlKG1ldGhvZCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhcmFtZXRlclR5cGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoInBhcmFtUmV0dXJuIiwgT2JqZWN0LmNsYXNzKTsKICAgICAgICAgY2hlY2tUeXBlUGFyYW1ldGVyKG1ldGhvZCk7CiAgICAgICAgIGNoZWNrUGFyYW1ldGVyVHlwZShtZXRob2QpOwogICAgICAgICBjaGVja1JldHVyblR5cGUobWV0aG9kKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRlcGVuZGVuY3lPZk1ldGhvZFR5cGVQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZCBtZXRob2QwID0gY2xhenouZ2V0TWV0aG9kKCJwYXJhbU5vUmV0dXJuIiwgT2JqZWN0LmNsYXNzKTsKICAgICAgICAgVHlwZVZhcmlhYmxlPE1ldGhvZD4gdHlwZVBhcmFtZXRlcjAgPSBtZXRob2QwLmdldFR5cGVQYXJhbWV0ZXJzKClbMF07CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNSZWZsZWN0aW9uQ29ybmVyQ2FzZXMuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY1JlZmxlY3Rpb25Db3JuZXJDYXNlcy5qYXZhCmluZGV4IDFhZjZmMjMuLmYzMGRlZjAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY1JlZmxlY3Rpb25Db3JuZXJDYXNlcy5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY1JlZmxlY3Rpb25Db3JuZXJDYXNlcy5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmbGVjdDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwpAQCAtMjcsNiArMzIsNyBAQAogICogdHlwZSBwYXJhbWV0ZXJzLCBlcXVhbGl0eSBvZiB0eXBlIHBhcmFtZXRlcnMsIHdpbGRjYXJkIHR5cGVzLCBwYXJhbWV0ZXJpemVkCiAgKiB0eXBlcyBhbmQgbXVsdGlwbGUgYm91bmRzLgogICovCitAVGVzdFRhcmdldENsYXNzKE1ldGhvZC5jbGFzcykKIHB1YmxpYyBjbGFzcyBHZW5lcmljUmVmbGVjdGlvbkNvcm5lckNhc2VzIGV4dGVuZHMgR2VuZXJpY1JlZmxlY3Rpb25UZXN0c0Jhc2UgewogCiAgICAgc3RhdGljIGNsYXNzIFBhaXI8VCwgUz4ge30KQEAgLTM0LDcgKzQwLDE5IEBACiAgICAgc3RhdGljIGNsYXNzIFdpbGRjYXJkRXF1YWxpdHk8VD4gewogICAgICAgICB2b2lkIHdpbGRjYXJkRXF1YWxpdHkoUGFpcjw/IGV4dGVuZHMgVCwgPyBleHRlbmRzIFQ+IHBhcmFtKSB7fQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlN0cmVzcyB0ZXN0LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRFcXVhbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgV2lsZGNhcmRFcXVhbGl0eT4gY2xhenogPSBXaWxkY2FyZEVxdWFsaXR5LmNsYXNzOwpAQCAtNzgsNyArOTYsMTkgQEAKICAgICBzdGF0aWMgY2xhc3MgV2lsZGNhcmRVbkVxdWFsaXR5PFQ+IHsKICAgICAgICAgdm9pZCB3aWxkY2FyZFVuRXF1YWxpdHkoUGFpcjw/IGV4dGVuZHMgVCwgPyBzdXBlciBUPiBwYXJhbSkge30KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTdHJlc3MgdGVzdC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkVW5FcXVhbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgV2lsZGNhcmRVbkVxdWFsaXR5PiBjbGF6eiA9IFdpbGRjYXJkVW5FcXVhbGl0eS5jbGFzczsKQEAgLTEyMSw3ICsxNTEsMTkgQEAKICAgICBzdGF0aWMgY2xhc3MgTXVsdGlwbGVCb3VuZGVkV2lsZGNhcmRVbkVxdWFsaXR5PFQgZXh0ZW5kcyBPYmplY3QgJiBDb21wYXJhYmxlPE11bHRpcGxlQm91bmRlZFdpbGRjYXJkVW5FcXVhbGl0eTxUPj4+IHsKICAgICAgICAgdm9pZCBtdWx0aXBsZUJvdW5kZWRXaWxkY2FyZFVuRXF1YWxpdHkoUGFpcjw/IGV4dGVuZHMgVCwgPyBzdXBlciBUPiBwYXJhbSkge30KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTdHJlc3MgdGVzdC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQm91bmRlZFdpbGRjYXJkVW5FcXVhbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgTXVsdGlwbGVCb3VuZGVkV2lsZGNhcmRVbkVxdWFsaXR5PiBjbGF6eiA9IE11bHRpcGxlQm91bmRlZFdpbGRjYXJkVW5FcXVhbGl0eS5jbGFzczsKQEAgLTE3Nyw3ICsyMTksMTkgQEAKICAgICBzdGF0aWMgY2xhc3MgTXVsdGlwbGVCb3VuZGVkV2lsZGNhcmRFcXVhbGl0eTxUIGV4dGVuZHMgT2JqZWN0ICYgQ29tcGFyYWJsZTxNdWx0aXBsZUJvdW5kZWRXaWxkY2FyZEVxdWFsaXR5PFQ+Pj4gewogICAgICAgICB2b2lkIG11bHRpcGxlQm91bmRlZFdpbGRjYXJkRXF1YWxpdHkoUGFpcjw/IGV4dGVuZHMgVCwgPyBleHRlbmRzIFQ+IHBhcmFtKSB7fQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlN0cmVzcyB0ZXN0LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVCb3VuZGVkV2lsZGNhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE11bHRpcGxlQm91bmRlZFdpbGRjYXJkRXF1YWxpdHk+IGNsYXp6ID0gTXVsdGlwbGVCb3VuZGVkV2lsZGNhcmRFcXVhbGl0eS5jbGFzczsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY1R5cGVzVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljVHlwZXNUZXN0LmphdmEKaW5kZXggNGY4YjY5Ny4uOTUwN2ZmZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljVHlwZXNUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9HZW5lcmljVHlwZXNUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubGFuZy5yZWZsZWN0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwpAQCAtMjYsNiArMzEsNyBAQAogLyoqCiAgKiBUZXN0cyB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgb24gY2xhc3Nlcy4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhDb25zdHJ1Y3Rvci5jbGFzcykKIHB1YmxpYyBjbGFzcyBHZW5lcmljVHlwZXNUZXN0IGV4dGVuZHMgR2VuZXJpY1JlZmxlY3Rpb25UZXN0c0Jhc2UgewogICAgIAogICAgIHN0YXRpYyBjbGFzcyBHZW5lcmljVHlwZTxUPnsKQEAgLTYwLDcgKzY2LDE1IEBACiAgICAgfQogICAgIAogICAgIHN0YXRpYyBpbnRlcmZhY2UgSW50ZXJmYWNlVGVzdDxUPnt9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2sgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JHZW5lcmljVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ29uc3RydWN0b3JHZW5lcmljVHlwZT4gY2xhenogPSBDb25zdHJ1Y3RvckdlbmVyaWNUeXBlLmNsYXNzOwpAQCAtNzIsNyArODYsMTUgQEAKICAgICAgICAgCiAgICAgICAgIGFzc2VydEVxdWFscyh0eXBlVmFyaWFibGUsIHBhcmFtZXRlclR5cGUpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljTWV0aG9kR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEdlbmVyaWNUeXBlPiBjbGF6eiA9IEdlbmVyaWNUeXBlLmNsYXNzOwpAQCAtODYsNyArMTA4LDE1IEBACiAgICAgICAgIGFzc2VydEluc3RhbmNlT2YoVHlwZVZhcmlhYmxlLmNsYXNzLCBwYXJhbWV0ZXJUeXBlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZCwgKChUeXBlVmFyaWFibGUpcGFyYW1ldGVyVHlwZSkuZ2V0R2VuZXJpY0RlY2xhcmF0aW9uKCkpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGlkaW5nTWV0aG9kR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEdlbmVyaWNUeXBlPiBjbGF6eiA9IEdlbmVyaWNUeXBlLmNsYXNzOwpAQCAtMTA2LDcgKzEzNiwxNSBAQAogICAgICAgICB2b2lkIG11bHRpcGxlR2VuZXJpY1R5cGVzUyhTIHMpe307CiAgICAgICAgIHZvaWQgbXVsdGlwbGVHZW5lcmljVHlwZXNUUyhUIHQsIFMgcyl7fTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlR2VuZXJpY1R5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vVHlwZSBwYXJhbWV0ZXJzCkBAIC0xNDQsNiArMTgyLDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyh0eXBlVmFyaWFibGVTLCBtdWx0aXBsZUdlbmVyaWNUeXBlc1RTVHlwZVMpOwogICAgIH0KICAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVCb3VuZGVkR2VuZXJpY1R5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vVHlwZSBwYXJhbWV0ZXJzCkBAIC0xNjEsNyArMjA4LDE1IEBACiAgICAgICAgIFR5cGUgYm91bmRTID0gYm91bmRzU1swXTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGVWYXJpYWJsZVQsIGJvdW5kUyk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgU2ltcGxlSW5oZXJpdGFuY2U+IGNsYXp6ID0gU2ltcGxlSW5oZXJpdGFuY2UuY2xhc3M7CkBAIC0xODMsNyArMjM4LDE1IEBACiAgICAgICAgIFR5cGVWYXJpYWJsZSBhY3R1YWxTdXBlclR5cGVWYXJpYWJsZSA9IChUeXBlVmFyaWFibGUpIGFjdHVhbFR5cGVBcmd1bWVudHNbMF07CiAgICAgICAgIGFzc2VydEVxdWFscyhzdWJUeXBlVmFyaWFibGUsIGFjdHVhbFN1cGVyVHlwZVZhcmlhYmxlKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lckNsYXNzVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgSW5uZXJDbGFzc1Rlc3Q+IGNsYXp6ID1Jbm5lckNsYXNzVGVzdC5jbGFzczsKQEAgLTIxNCw3ICsyNzcsMTUgQEAKICAgICAgICAgVHlwZVZhcmlhYmxlPD8+IG1ldGhvZFR5cGVWYXJpYWJsZSA9IChUeXBlVmFyaWFibGU8Pz4pIG1ldGhvZFBhcmFtZXRlclR5cGVzWzBdOwogICAgICAgICBhc3NlcnRFcXVhbHMoY2xhenosIG1ldGhvZFR5cGVWYXJpYWJsZS5nZXRHZW5lcmljRGVjbGFyYXRpb24oKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljRXhjZXB0aW9uVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBFeGNlcHRpb25UZXN0PiBjbGF6eiA9IEV4Y2VwdGlvblRlc3QuY2xhc3M7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggYTMxNTE4ZS4uNTIwMmQ0YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwpAQCAtMjQsNiArMjksNyBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCitAVGVzdFRhcmdldENsYXNzKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIHN0YXRpYyBjbGFzcyBUZXN0TWV0aG9kIHsKQEAgLTExMCw2ICsxMTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiNJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGphdmEubGFuZy5UaHJvd2FibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfVGhyb3dhYmxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihqYXZhLmxhbmcuVGhyb3dhYmxlKQpAQCAtMTMxLDYgKzE0NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uI0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oamF2YS5sYW5nLlRocm93YWJsZSwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19UaHJvd2FibGVMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oamF2YS5sYW5nLlRocm93YWJsZSwKQEAgLTE1Myw2ICsxNzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiNnZXRUYXJnZXRFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUYXJnZXRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRhcmdldEV4Y2VwdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5UaHJvd2FibGUKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbi5nZXRUYXJnZXRFeGNlcHRpb24oKQpAQCAtMTc1LDYgKzIwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uI3ByaW50U3RhY2tUcmFjZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50U3RhY2tUcmFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpCkBAIC0xOTksNiArMjQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24jcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByaW50U3RhY2tUcmFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlByaW50U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByaW50U3RhY2tUcmFjZUxqYXZhX2lvX1ByaW50U3RyZWFtKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtKQpAQCAtMjE2LDYgKzI2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uI3ByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludFN0YWNrVHJhY2UiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5QcmludFdyaXRlci5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlTGphdmFfaW9fUHJpbnRXcml0ZXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L01ldGhvZFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kVGVzdC5qYXZhCmluZGV4IDkyZWJjZTMuLjdmMDhhNDggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kVGVzdC5qYXZhCkBAIC0xNywxMCArMTcsMTYgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhNZXRob2QuY2xhc3MpIAogcHVibGljIGNsYXNzIE1ldGhvZFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgc3RhdGljIGNsYXNzIFRlc3RNZXRob2QgewpAQCAtMTM2LDYgKzE0MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCkBAIC0xNjMsNiArMTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCNnZXREZWNsYXJpbmdDbGFzcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlY2xhcmluZ0NsYXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREZWNsYXJpbmdDbGFzcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzcwogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKQpAQCAtMTgzLDYgKzIwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QjZ2V0RXhjZXB0aW9uVHlwZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFeGNlcHRpb25UeXBlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhjZXB0aW9uVHlwZXMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuQ2xhc3MgW10KICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCkKQEAgLTIwNyw2ICsyNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kI2dldE1vZGlmaWVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1vZGlmaWVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kaWZpZXJzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXRNb2RpZmllcnMoKQogCkBAIC0yNjEsNiArMzAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCNnZXROYW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldE5hbWUoKQogICAgICAgICBNZXRob2QgbXRoID0gbnVsbDsKQEAgLTI3Niw2ICszMjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kI2dldFBhcmFtZXRlclR5cGVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFyYW1ldGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmFtZXRlclR5cGVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLkNsYXNzIFtdCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpCkBAIC0zMzAsNiArMzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCNnZXRSZXR1cm5UeXBlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmV0dXJuVHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmV0dXJuVHlwZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5DbGFzcwogICAgICAgICAvLyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpCkBAIC00MDUsNiArNDc0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCNpbnZva2UoamF2YS5sYW5nLk9iamVjdCwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLk9iamVjdFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vdCBhbGwgZXhjZXB0aW9ucyBhcmUgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW52b2tlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnZva2VMamF2YV9sYW5nX09iamVjdCRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0CkBAIC02NDYsNiArNzI0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkKICAgICAgICAgTWV0aG9kIG10aCA9IG51bGw7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L01vZGlmaWVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9Nb2RpZmllclRlc3QuamF2YQppbmRleCAwYTM0MGQwLi5lOGMxMjg5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L01vZGlmaWVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvTW9kaWZpZXJUZXN0LmphdmEKQEAgLTE3LDggKzE3LDE0IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubGFuZy5yZWZsZWN0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTW9kaWZpZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIE1vZGlmaWVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxMX0ZMQUdTID0gMHg3RkY7CkBAIC0yNiw2ICszMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllciNNb2RpZmllcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNb2RpZmllciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcigpCiAgICAgICAgIC8vIERvZXMgbm90aGluZwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIjaXNBYnN0cmFjdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQWJzdHJhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQWJzdHJhY3RJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0Fic3RyYWN0KGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQUJTVFJBQ1QgcmV0dXJuZWQgZmFsc2UiLCBNb2RpZmllci5pc0Fic3RyYWN0KEFMTF9GTEFHUykpOwpAQCAtNDYsNiArNzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIjaXNGaW5hbChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRmluYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRmluYWxJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0ZpbmFsKGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRklOQUwgcmV0dXJuZWQgZmFsc2UiLCBNb2RpZmllci5pc0ZpbmFsKEFMTF9GTEFHUykpOwpAQCAtNTcsNiArOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIjaXNJbnRlcmZhY2UoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0ludGVyZmFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNJbnRlcmZhY2VJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0ludGVyZmFjZShpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIklOVEVSRkFDRSByZXR1cm5lZCBmYWxzZSIsIE1vZGlmaWVyLmlzSW50ZXJmYWNlKEFMTF9GTEFHUykpOwpAQCAtNjksNiArMTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyI2lzTmF0aXZlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNOYXRpdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTmF0aXZlSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNOYXRpdmUoaW50KQogICAgICAgICBhc3NlcnRUcnVlKCJOQVRJVkUgcmV0dXJuZWQgZmFsc2UiLCBNb2RpZmllci5pc05hdGl2ZShBTExfRkxBR1MpKTsKQEAgLTgwLDYgKzEzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllciNpc1ByaXZhdGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1ByaXZhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUHJpdmF0ZUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJpdmF0ZShpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIlBSSVZBVEUgcmV0dXJuZWQgZmFsc2UiLCBNb2RpZmllci5pc1ByaXZhdGUoQUxMX0ZMQUdTKSk7CkBAIC05Miw2ICsxNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIjaXNQcm90ZWN0ZWQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1Byb3RlY3RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNQcm90ZWN0ZWRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1Byb3RlY3RlZChpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIlBST1RFQ1RFRCByZXR1cm5lZCBmYWxzZSIsIE1vZGlmaWVyLmlzUHJvdGVjdGVkKEFMTF9GTEFHUykpOwpAQCAtMTA0LDYgKzE3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllciNpc1B1YmxpYyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUHVibGljIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1B1YmxpY0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUFVCTElDIHJldHVybmVkIGZhbHNlIiwgTW9kaWZpZXIuaXNQdWJsaWMoQUxMX0ZMQUdTKSk7CkBAIC0xMTUsNiArMTkzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyI2lzU3RhdGljKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdGF0aWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU3RhdGljSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMoaW50KQogICAgICAgICBhc3NlcnRUcnVlKCJTVEFUSUMgcmV0dXJuZWQgZmFsc2UiLCBNb2RpZmllci5pc1N0YXRpYyhBTExfRkxBR1MpKTsKQEAgLTEyNiw2ICsyMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIjaXNTdHJpY3QoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N0cmljdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTdHJpY3RJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0cmljdChpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIlNUUklDVCByZXR1cm5lZCBmYWxzZSIsIE1vZGlmaWVyLmlzU3RyaWN0KE1vZGlmaWVyLlNUUklDVCkpOwpAQCAtMTM2LDYgKzIzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllciNpc1N5bmNocm9uaXplZChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3luY2hyb25pemVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1N5bmNocm9uaXplZEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzU3luY2hyb25pemVkKGludCkKQEAgLTE0OCw2ICsyNTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIjaXNUcmFuc2llbnQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1RyYW5zaWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNUcmFuc2llbnRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1RyYW5zaWVudChpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIlRyYW5zaWVudCByZXR1cm5lZCBmYWxzZSIsIE1vZGlmaWVyLmlzVHJhbnNpZW50KEFMTF9GTEFHUykpOwpAQCAtMTYwLDYgKzI3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllciNpc1ZvbGF0aWxlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNWb2xhdGlsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWb2xhdGlsZUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzVm9sYXRpbGUoaW50KQogICAgICAgICBhc3NlcnRUcnVlKCJWb2xhdGlsZSByZXR1cm5lZCBmYWxzZSIsIE1vZGlmaWVyLmlzVm9sYXRpbGUoQUxMX0ZMQUdTKSk7CkBAIC0xNzIsNiArMjk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyI3RvU3RyaW5nKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIudG9TdHJpbmcoaW50KQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9QYXJhbWV0ZXJpemVkVHlwZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvUGFyYW1ldGVyaXplZFR5cGVUZXN0LmphdmEKaW5kZXggNTE5N2U2MC4uNzdlMmYzNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9QYXJhbWV0ZXJpemVkVHlwZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L1BhcmFtZXRlcml6ZWRUeXBlVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmbGVjdDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CkBAIC0yMywxMSArMjgsMjkgQEAKIC8qKgogICogVGVzdHMgcGFyYW1ldGVyaXplZCB0eXBlcyBhbmQgdGhlaXIgcHJvcGVydGllcy4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhQYXJhbWV0ZXJpemVkVHlwZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUGFyYW1ldGVyaXplZFR5cGVUZXN0IGV4dGVuZHMgR2VuZXJpY1JlZmxlY3Rpb25UZXN0c0Jhc2UgewogICAgIAogICAgIHN0YXRpYyBjbGFzcyBBPFQ+e30KICAgICBzdGF0aWMgY2xhc3MgQiBleHRlbmRzIEE8U3RyaW5nPnt9CiAgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBleGNlcHRpb25zLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFjdHVhbFR5cGVBcmd1bWVudHMiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldE93bmVyVHlwZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmF3VHlwZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQYXJhbWV0ZXJpemVkU3VwZXJDbGFzcygpIHsKICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEI+IGNsYXp6ID0gQi5jbGFzczsKICAgICAgICAgVHlwZSBnZW5lcmljU3VwZXJjbGFzcyA9IGNsYXp6LmdldEdlbmVyaWNTdXBlcmNsYXNzKCk7CkBAIC00NCw2ICs2NywyMyBAQAogICAgIHN0YXRpYyBjbGFzcyBDPFQ+e30KICAgICBzdGF0aWMgY2xhc3MgRDxUPiBleHRlbmRzIEM8VD57fQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgZXhjZXB0aW9ucy4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3R1YWxUeXBlQXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPd25lclR5cGUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJhd1R5cGUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZVBhcmFtZXRlcml6ZWRTdXBlckNsYXNzKCkgewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgRD4gY2xhenogPSBELmNsYXNzOwogICAgICAgICBUeXBlIGdlbmVyaWNTdXBlcmNsYXNzID0gY2xhenouZ2V0R2VuZXJpY1N1cGVyY2xhc3MoKTsKQEAgLTYyLDYgKzEwMiwyMyBAQAogICAgICAgICBFPFQ+IGU7CiAgICAgfQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3R1YWxUeXBlQXJndW1lbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPd25lclR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJhd1R5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyaXplZE1lbWViZXIoKSB0aHJvd3MgRXhjZXB0aW9uewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgRj4gY2xhenogPSBGLmNsYXNzOwogICAgICAgICBGaWVsZCBmaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoImUiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvUHJveHlUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L1Byb3h5VGVzdC5qYXZhCmluZGV4IDBhMjliMjEuLjQ0YzNlYjkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvUHJveHlUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9Qcm94eVRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CkBAIC0yNyw2ICszMiw3IEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1Byb3h5X1BhcmVudEV4Y2VwdGlvbjsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfUHJveHlfU3ViRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFByb3h5LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQcm94eVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoKQEAgLTU5LDcgKzY1LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LlByb3h5I2dldFByb3h5Q2xhc3MoamF2YS5sYW5nLkNsYXNzTG9hZGVyLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuQ2xhc3NbXSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3h5Q2xhc3NMamF2YV9sYW5nX0NsYXNzTG9hZGVyJExqYXZhX2xhbmdfQ2xhc3MoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3h5Q2xhc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLCBqYXZhLmxhbmcuQ2xhc3NbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0UHJveHlDbGFzc0xqYXZhX2xhbmdfQ2xhc3NMb2FkZXIkTGphdmFfbGFuZ19DbGFzcygpIHsKICAgICAgICAgQ2xhc3MgcHJveHkgPSBQcm94eS5nZXRQcm94eUNsYXNzKFN1cHBvcnRfUHJveHlfSTEuY2xhc3MKICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSwgbmV3IENsYXNzW10geyBTdXBwb3J0X1Byb3h5X0kxLmNsYXNzIH0pOwogCkBAIC04Niw3ICsxMDEsMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuUHJveHkjbmV3UHJveHlJbnN0YW5jZShqYXZhLmxhbmcuQ2xhc3NMb2FkZXIsCiAgICAgICogICAgICAgIGphdmEubGFuZy5DbGFzc1tdLCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X25ld1Byb3h5SW5zdGFuY2VMamF2YV9sYW5nX0NsYXNzTG9hZGVyJExqYXZhX2xhbmdfQ2xhc3NMamF2YV9sYW5nX3JlZmxlY3RfSW52b2NhdGlvbkhhbmRsZXIoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1Byb3h5SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLCBqYXZhLmxhbmcuQ2xhc3NbXS5jbGFzcywgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X25ld1Byb3h5SW5zdGFuY2VMamF2YV9sYW5nX0NsYXNzTG9hZGVyJExqYXZhX2xhbmdfQ2xhc3NMamF2YV9sYW5nX3JlZmxlY3RfSW52b2NhdGlvbkhhbmRsZXIoKSB7CiAgICAgICAgIE9iamVjdCBwID0gUHJveHkubmV3UHJveHlJbnN0YW5jZShTdXBwb3J0X1Byb3h5X0kxLmNsYXNzCiAgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCksIG5ldyBDbGFzc1tdIHsgU3VwcG9ydF9Qcm94eV9JMS5jbGFzcywKICAgICAgICAgICAgICAgICBTdXBwb3J0X1Byb3h5X0kyLmNsYXNzIH0sIG5ldyBJbnZvY2F0aW9uSGFuZGxlcigpIHsKQEAgLTExNCw3ICsxMzgsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgaWRlbnRpdHkgdGVzdCAiLCBwcm94eS5lcXVhbHMocHJveHkpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIG5vdCBlcXVhbHMgdGVzdCAiLCAhcHJveHkuZXF1YWxzKCIiKSk7CiAgICAgICAgIGludFtdIHJlc3VsdCA9IChpbnRbXSkgcHJveHkuYXJyYXkobmV3IGxvbmdbXSB7IDEwMEwsIC0yMDBMIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCBiYXNlIHR5cGUgY29udmVyc2lvbiB0ZXN0ICIsIC0yMDAsIHJlc3VsdFswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHByaW1pdGl2ZSB0eXBlIGNvbnZlcnNpb24gdGVzdCAiLCAtMjAwLCByZXN1bHRbMF0pOwogCiAgICAgICAgIGJvb2xlYW4gd29ya2VkID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CkBAIC0xNjksNiArMTkzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubGFuZy5yZWZsZWN0LlByb3h5I2lzUHJveHlDbGFzcyhqYXZhLmxhbmcuQ2xhc3MpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUHJveHlDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2xhc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNQcm94eUNsYXNzTGphdmFfbGFuZ19DbGFzcygpIHsKICAgICAgICAgQ2xhc3MgcHJveHkgPSBQcm94eS5nZXRQcm94eUNsYXNzKFN1cHBvcnRfUHJveHlfSTEuY2xhc3MKICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSwgbmV3IENsYXNzW10geyBTdXBwb3J0X1Byb3h5X0kxLmNsYXNzIH0pOwpAQCAtMTk4LDcgKzIzMSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eSNnZXRJbnZvY2F0aW9uSGFuZGxlcihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW52b2NhdGlvbkhhbmRsZXJMamF2YV9sYW5nX09iamVjdCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW52b2NhdGlvbkhhbmRsZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0SW52b2NhdGlvbkhhbmRsZXJMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBJbnZvY2F0aW9uSGFuZGxlcigpIHsKICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CkBAIC0yMjIsNyArMjY0LDE2IEBACiAgICAgfQogICAgICAgICAKICAgICAvL1JlZ3Jlc3Npb24gVGVzdCBmb3IgSEFSTU9OWS0yMzU1Ci0gICAgcHVibGljIHZvaWQgdGVzdF9uZXdQcm94eUluc3RhbmNlX3dpdGhDb21wYXRpYmxlUmV0dXJuVHlwZXMoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiBFeGNlcHRpb25zIGFyZSBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3UHJveHlJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3MsIGphdmEubGFuZy5DbGFzc1tdLmNsYXNzLCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfbmV3UHJveHlJbnN0YW5jZV93aXRoQ29tcGF0aWJsZVJldHVyblR5cGVzKCkgewogICAgICAgICBPYmplY3QgbyA9IFByb3h5CiAgICAgICAgICAgICAgICAgLm5ld1Byb3h5SW5zdGFuY2UodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IElUZXN0UmV0dXJuT2JqZWN0LmNsYXNzLApAQCAtMjMwLDggKzI4MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RQcm94eUhhbmRsZXIobmV3IFRlc3RQcm94eUltcGwoKSkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG8pOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3UHJveHlJbnN0YW5jZV93aXRoTm9uQ29tcGF0aWJsZVJldHVyblR5cGVzKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdQcm94eUluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzc0xvYWRlci5jbGFzcywgamF2YS5sYW5nLkNsYXNzW10uY2xhc3MsIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9uZXdQcm94eUluc3RhbmNlX3dpdGhOb25Db21wYXRpYmxlUmV0dXJuVHlwZXMoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQcm94eS5uZXdQcm94eUluc3RhbmNlKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLAogICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IElUZXN0UmV0dXJuSW50ZWdlci5jbGFzcywKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvUmVmbGVjdFBlcm1pc3Npb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L1JlZmxlY3RQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IDRiOGUxYzcuLjYyZDViMGMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9sYW5nL3JlZmxlY3QvUmVmbGVjdFBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9SZWZsZWN0UGVybWlzc2lvblRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubGFuZy5yZWZsZWN0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUmVmbGVjdFBlcm1pc3Npb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFJlZmxlY3RQZXJtaXNzaW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24jUmVmbGVjdFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUmVmbGVjdFBlcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgU3RyaW5nIHBlcm1TdHJpbmcgPSBuZXcgUmVmbGVjdFBlcm1pc3Npb24oIkJsYWgiKS50b1N0cmluZygpOwpAQCAtMzUsNiArNTAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24jUmVmbGVjdFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUmVmbGVjdFBlcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL2xhbmcvcmVmbGVjdC9UeXBlVmFyaWFibGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZVRlc3QuamF2YQppbmRleCBhMmI5ZTc3Li5mYjVlNzk5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZmxlY3Q7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CkBAIC0yNSwxMCArMzAsMTkgQEAKIC8qKgogICogVGVzdHMgdHlwZSB2YXJpYWJsZXMgYW5kIHRoZWlyIHByb3BlcnRpZXMuCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoVHlwZVZhcmlhYmxlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBUeXBlVmFyaWFibGVUZXN0IGV4dGVuZHMgR2VuZXJpY1JlZmxlY3Rpb25UZXN0c0Jhc2UgewogICAgIAogICAgIHN0YXRpYyBjbGFzcyBBPFQ+e30KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnRlcmFjdGlvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdlbmVyaWNEZWNsYXJhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlVmFyaWFibGVPbkNsYXNzKCl7CiAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBPiBjbGF6eiA9IEEuY2xhc3M7CiAgICAgICAgIFR5cGVWYXJpYWJsZVtdIHR5cGVQYXJhbWV0ZXJzID0gY2xhenouZ2V0VHlwZVBhcmFtZXRlcnMoKTsKQEAgLTQ0LDcgKzU4LDE1IEBACiAgICAgc3RhdGljIGNsYXNzIEJ7CiAgICAgICAgIDxUPiB2b2lkIGIoKXt9OwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnRlcmFjdGlvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdlbmVyaWNEZWNsYXJhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlVmFyaWFibGVPbk1ldGhvZCgpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBCPiBjbGF6eiA9IEIuY2xhc3M7CiAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgiYiIpOwpAQCAtNjEsNyArODMsMjMgQEAKICAgICBzdGF0aWMgY2xhc3MgQyB7CiAgICAgICAgIDxUPkMoKXt9CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVyYWN0aW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0R2VuZXJpY0RlY2xhcmF0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCb3VuZHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZVZhcmlhYmxlT25Db25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBDPiBjbGF6eiA9IEMuY2xhc3M7CiAgICAgICAgIENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yID0gY2xhenouZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpOwpAQCAtNzYsNyArMTE0LDE1IEBACiAgICAgfQogICAgIAogICAgIHN0YXRpYyBjbGFzcyBEPFEsUixTPnt9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW50ZXJhY3Rpb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmljRGVjbGFyYXRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUeXBlVmFyaWFibGVzT25DbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgRD4gY2xhenogPSBELmNsYXNzOwogICAgICAgICBUeXBlVmFyaWFibGU8Pz5bXSB0eXBlUGFyYW1ldGVycyA9IGNsYXp6LmdldFR5cGVQYXJhbWV0ZXJzKCk7CkBAIC05NSw3ICsxNDEsMTUgQEAKICAgICBzdGF0aWMgY2xhc3MgRSB7CiAgICAgICAgIDxRLFIsUz4gdm9pZCBlKCl7fQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVR5cGVWYXJpYWJsZXNPbk1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgRT4gY2xhenogPSBFLmNsYXNzOwogICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QoImUiKTsKQEAgLTExNSw3ICsxNjksMTUgQEAKICAgICBzdGF0aWMgY2xhc3MgRiB7CiAgICAgICAgIDxRLFIsUz4gRigpe30KICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUeXBlVmFyaWFibGVzT25Db25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/IGV4dGVuZHMgRj4gY2xhenogPSBGLmNsYXNzOwogICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldERlY2xhcmVkQ29uc3RydWN0b3IoKTsKQEAgLTEzNCw2ICsxOTYsMTUgQEAKICAgICAKICAgICBzdGF0aWMgY2xhc3MgRyA8VCBleHRlbmRzIE51bWJlcj57fQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludGVyYWN0aW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qm91bmRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUJvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBHPiBjbGF6eiA9IEcuY2xhc3M7CiAgICAgICAgIFR5cGVWYXJpYWJsZVtdIHR5cGVQYXJhbWV0ZXJzID0gY2xhenouZ2V0VHlwZVBhcmFtZXRlcnMoKTsKQEAgLTE0NCw3ICsyMTUsMTUgQEAKICAgICB9CiAgICAgCiAgICAgc3RhdGljIGNsYXNzIEggPFQgZXh0ZW5kcyBOdW1iZXIgJiBTZXJpYWxpemFibGUgPnt9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW50ZXJhY3Rpb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCb3VuZHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVlQm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEg+IGNsYXp6ID0gSC5jbGFzczsKICAgICAgICAgVHlwZVZhcmlhYmxlW10gdHlwZVBhcmFtZXRlcnMgPSBjbGF6ei5nZXRUeXBlUGFyYW1ldGVycygpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9BbGxUZXN0cy5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9BbGxUZXN0cy5qYXZhCmluZGV4IGQ3NTQ4NzIuLjg4NzA4NjIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvQWxsVGVzdHMuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0FsbFRlc3RzLmphdmEKQEAgLTE4LDIxICsxOCwyMSBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKIAogLyoqCi0gKiBMaXN0aW5nIG9mIGFsbCB0aGUgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLgorICogVGhpcyBpcyBhdXRvZ2VuZXJhdGVkIHNvdXJjZSBmaWxlLiBJbmNsdWRlcyB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAgKi8KKwogcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkgfSk7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oQWxsVGVzdHMuc3VpdGUoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0cyBmb3IgamF2YS5uZXQiKTsKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKIAotICAgICAgICAvLyBhZGQgbmV0IHRlc3RzdWl0ZXMgaGVyZQogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQXV0aGVudGljYXRvclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmluZEV4Y2VwdGlvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29ubmVjdEV4Y2VwdGlvblRlc3QuY2xhc3MpOwpAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0YWdyYW1QYWNrZXRUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERhdGFncmFtU29ja2V0SW1wbFRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0YWdyYW1Tb2NrZXRUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEV4Y2x1ZGVkUHJveHlUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRXhjbHVkZWRQcm94eVRlc3QuY2xhc3MpOyBDb25zdHJ1Y3RvciB0aHJvd3MgZXhjZXB0aW9uLgogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSmFyVVJMQ29ubmVjdGlvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWFsZm9ybWVkVVJMRXhjZXB0aW9uVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNdWx0aWNhc3RTb2NrZXRUZXN0LmNsYXNzKTsKQEAgLTU3LDE0ICs1NywxNSBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU29ja2V0SW1wbFRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU29ja2V0UGVybWlzc2lvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU29ja2V0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVbmtub3duSG9zdEV4Y2VwdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVW5rbm93blNlcnZpY2VFeGNlcHRpb25UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVSSVN5bnRheEV4Y2VwdGlvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVJJVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVUkxDbGFzc0xvYWRlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVJMRGVjb2RlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVJMRW5jb2RlclRlc3QuY2xhc3MpOwotICAgICAgICAKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVua25vd25Ib3N0RXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVbmtub3duU2VydmljZUV4Y2VwdGlvblRlc3QuY2xhc3MpOworCisgICAgICAgIC8vICRKVW5pdC1FTkQkCiAgICAgICAgIHJldHVybiBzdWl0ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0F1dGhlbnRpY2F0b3JUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0F1dGhlbnRpY2F0b3JUZXN0LmphdmEKaW5kZXggN2VhZDIwNy4uYTA4Y2QwYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9BdXRoZW50aWNhdG9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvQXV0aGVudGljYXRvclRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuQXV0aGVudGljYXRvcjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CkBAIC0yNSwxMSArMzAsMjEgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhBdXRoZW50aWNhdG9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBBdXRoZW50aWNhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUjdmFsdWVPZihTdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGZvciBjaGVja2luZyBSZXF1ZXN0b3JUeXBlIHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9SZXF1ZXN0b3JUeXBlX3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRFcXVhbHMoUmVxdWVzdG9yVHlwZS5QUk9YWSwgQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlCiAgICAgICAgICAgICAgICAgLnZhbHVlT2YoIlBST1hZIikpOwpAQCAtNDIsNyArNTcsNyBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgICAgIC8vIFNvbWUgb2xkIFJJcyB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gCi0JCS8vIExhdGVzdCBSSXMgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24uCisgICAgICAgIC8vIExhdGVzdCBSSXMgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24uCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBBdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUudmFsdWVPZihudWxsKTsKICAgICAgICAgICAgIGZhaWwoIk11c3QgdGhyb3cgYW4gZXhjZXB0aW9uIik7CkBAIC01Niw2ICs3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUjdmFsdWVzKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGVzdCBmb3IgY2hlY2tpbmcgUmVxdWVzdG9yVHlwZSB2YWx1ZXMuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIUNvbnN0YW50cyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfUmVxdWVzdG9yVHlwZV92YWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAgIAogICAgICAgICBSZXF1ZXN0b3JUeXBlW10gcnQgPSBSZXF1ZXN0b3JUeXBlLnZhbHVlcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoUmVxdWVzdG9yVHlwZS5QUk9YWSwgcnRbMF0pOwpAQCAtNjUsNiArODksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuQXV0aGVudGljYXRvciNyZXF1ZXN0UGFzc3dvcmRBdXRoZW50aWNhdGlvbihqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50LCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0luZXRBZGRyZXNzLmNsYXNzLCBpbnQuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb25fSW5ldEFkZHJlc3NfaW50X1N0cmluZ19TdHJpbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0yNDEzCiAgICAgICAgIE1vY2tBdXRoZW50aWNhdG9yIG1vY2sgPSBuZXcgTW9ja0F1dGhlbnRpY2F0b3IoKTsKQEAgLTc3LDYgKzExMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yI3JlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uKFN0cmluZywgamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXF1ZXN0UGFzc3dvcmRBdXRoZW50aWNhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIEluZXRBZGRyZXNzLmNsYXNzLCBpbnQuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb25fU3RyaW5nX0luZXRBZGRyZXNzX2ludF9TdHJpbmdfU3RyaW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMjQxMwogICAgICAgICBNb2NrQXV0aGVudGljYXRvciBtb2NrID0gbmV3IE1vY2tBdXRoZW50aWNhdG9yKCk7CkBAIC04OSw4ICsxMzEsMTcgQEAKICAgICAvKioKICAgICAgKiAKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuQXV0aGVudGljYXRvciMKLSAgICAgKiAJCXJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uX1N0cmluZ19JbmV0QWRkcmVzc19pbnRfU3RyaW5nX1N0cmluZ19TdHJpbmdfVVJMX0F1dGhlbnRpY2F0b3JfUmVxdWVzdG9yVHlwZSgpCisgICAgICogICAgICAgICByZXF1ZXN0UGFzc3dvcmRBdXRoZW50aWNhdGlvbl9TdHJpbmdfSW5ldEFkZHJlc3NfaW50X1N0cmluZ19TdHJpbmdfU3RyaW5nX1VSTF9BdXRoZW50aWNhdG9yX1JlcXVlc3RvclR5cGUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgSW5ldEFkZHJlc3MuY2xhc3MsIGludC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgVVJMLmNsYXNzLCBBdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb25fU3RyaW5nX0luZXRBZGRyZXNzX2ludF9TdHJpbmdfU3RyaW5nX1N0cmluZ19VUkxfQXV0aGVudGljYXRvcl9SZXF1ZXN0b3JUeXBlKCkKICAgICAgICAgICAgIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0F1dGhlbnRpY2F0b3IgbW9jayA9IG5ldyBNb2NrQXV0aGVudGljYXRvcigpOwpAQCAtMTA2LDcgKzE1NywxNiBAQAogICAgICAqIAogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yI2dldFJlcXVlc3RpbmdVUkwoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVxdWVzdGluZ1VSTCgpIHRocm93cyBFeGNlcHRpb24geworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlcXVlc3RpbmdVUkwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZXF1ZXN0aW5nVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tBdXRoZW50aWNhdG9yIG1vY2sgPSBuZXcgTW9ja0F1dGhlbnRpY2F0b3IoKTsKICAgICAgICAgYXNzZXJ0TnVsbChtb2NrLmdldFJlcXVlc3RpbmdVUkwoKSk7CiAgICAgfQpAQCAtMTE1LDYgKzE3NSwxNSBAQAogICAgICAqIAogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yI2dldFJlcXVlc3RvclR5cGUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlcXVlc3RvclR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlcXVlc3RvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0F1dGhlbnRpY2F0b3IgbW9jayA9IG5ldyBNb2NrQXV0aGVudGljYXRvcigpOwogICAgICAgICBhc3NlcnROdWxsKG1vY2suZ2V0UmVxdWVzdG9yVHlwZSgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvQmluZEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvQmluZEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA3ZDZlMjA0Li5jZDBmYzA3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0JpbmRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9CaW5kRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw1MSArMTcsNzUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuQmluZEV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhCaW5kRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBCaW5kRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuQmluZEV4Y2VwdGlvbiNCaW5kRXhjZXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuQmluZEV4Y2VwdGlvbigpCi0JCXRyeSB7Ci0JCQl0aHJvdyBuZXcgQmluZEV4Y2VwdGlvbigpOwotCQl9IGNhdGNoIChCaW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQmluZEV4Y2VwdGlvbiB0ZXN0IiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuQmluZEV4Y2VwdGlvbiNCaW5kRXhjZXB0aW9uKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaW5kRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkJpbmRFeGNlcHRpb24oKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoQmluZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIEJpbmRFeGNlcHRpb24gdGVzdCIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuQmluZEV4Y2VwdGlvbiNCaW5kRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuQmluZEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJdGhyb3cgbmV3IEJpbmRFeGNlcHRpb24oIlNvbWUgZXJyb3IgbWVzc2FnZSIpOwotCQl9IGNhdGNoIChCaW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQmluZEV4Y2VwdGlvbiB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhjZXB0aW9uIik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5CaW5kRXhjZXB0aW9uI0JpbmRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaW5kRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuQmluZEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFeGNlcHRpb24oIlNvbWUgZXJyb3IgbWVzc2FnZSIpOworICAgICAgICB9IGNhdGNoIChCaW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQmluZEV4Y2VwdGlvbiB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0Nvbm5lY3RFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0Nvbm5lY3RFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggNzBhZTkyNi4uZjIwZGE4YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Db25uZWN0RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvQ29ubmVjdEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsMjAgKzE3LDM4IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1BvcnRNYW5hZ2VyOwogCitAVGVzdFRhcmdldENsYXNzKENvbm5lY3RFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIENvbm5lY3RFeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uI0Nvbm5lY3RFeGNlcHRpb24oKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uI0Nvbm5lY3RFeGNlcHRpb24oKQogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uI0Nvbm5lY3RFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvbm5lY3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvbm5lY3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBhc3NlcnROdWxsKCJXcm9uZyBtZXNzYWdlIiwgbmV3IENvbm5lY3RFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOwotCSAgICBhc3NlcnRFcXVhbHMoIldyb25nIG1lc3NhZ2UiLCAibWVzc2FnZSIsIG5ldyBDb25uZWN0RXhjZXB0aW9uKCJtZXNzYWdlIikuZ2V0TWVzc2FnZSgpKTsKLQl9CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbWVzc2FnZSIsICJtZXNzYWdlIiwgbmV3IENvbm5lY3RFeGNlcHRpb24oIm1lc3NhZ2UiKS5nZXRNZXNzYWdlKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvQ29va2llSGFuZGxlclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvQ29va2llSGFuZGxlclRlc3QuamF2YQppbmRleCA0MjliNTdkLi41Y2U0MjVjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0Nvb2tpZUhhbmRsZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Db29raWVIYW5kbGVyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkNvb2tpZUhhbmRsZXI7CiBpbXBvcnQgamF2YS5uZXQuTmV0UGVybWlzc2lvbjsKQEAgLTI1LDExICszMCwyMSBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKENvb2tpZUhhbmRsZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIENvb2tpZUhhbmRsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkNvb2tpZUhhbmRsZXIjZ2V0RGVmYXVsdCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXREZWZhdWx0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWZhdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9HZXREZWZhdWx0KCkgewogICAgICAgICBhc3NlcnROdWxsKENvb2tpZUhhbmRsZXIuZ2V0RGVmYXVsdCgpKTsKICAgICB9CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Db29raWVIYW5kbGVyI3NldERlZmF1bHQoQ29va2llSGFuZGxlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNldERlZmF1bHQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERlZmF1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Q29va2llSGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TZXREZWZhdWx0X2phdmFfbmV0X2Nvb2tpZUhhbmRsZXIoKSB7CiAgICAgICAgIE1vY2tDb29raWVIYW5kbGVyIHJjMSA9IG5ldyBNb2NrQ29va2llSGFuZGxlcigpOwogICAgICAgICBNb2NrQ29va2llSGFuZGxlciByYzIgPSBuZXcgTW9ja0Nvb2tpZUhhbmRsZXIoKTsKQEAgLTUxLDYgKzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkNvb2tpZUhhbmRsZXIjZ2V0RGVmYXVsdCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnZXREZWZhdWx0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWZhdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRfU2VjdXJpdHkoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGQgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CiAgICAgICAgIHRyeSB7CkBAIC03Miw3ICsxMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuQ29va2llSGFuZGxlciNzZXREZWZhdWx0KENvb2tpZUhhbmRsZXIpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRfU2VjdXJpdHkoKSB7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXREZWZhdWx0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREZWZhdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0Nvb2tpZUhhbmRsZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdF9TZWN1cml0eSgpIHsKICAgICAgICAgQ29va2llSGFuZGxlciByYyA9IG5ldyBNb2NrQ29va2llSGFuZGxlcigpOwogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9EYXRhZ3JhbVBhY2tldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvRGF0YWdyYW1QYWNrZXRUZXN0LmphdmEKaW5kZXggYzU3NzJiYy4uNDY2ZGQyOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9EYXRhZ3JhbVBhY2tldFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0RhdGFncmFtUGFja2V0VGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OwogaW1wb3J0IGphdmEubmV0LkRhdGFncmFtU29ja2V0OwpAQCAtMjgsMjUgKzMzLDM1IEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1BvcnRNYW5hZ2VyOwogCitAVGVzdFRhcmdldENsYXNzKERhdGFncmFtUGFja2V0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBEYXRhZ3JhbVBhY2tldFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JRGF0YWdyYW1QYWNrZXQgZHA7CisgICAgRGF0YWdyYW1QYWNrZXQgZHA7CiAKLQl2b2xhdGlsZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEJJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQoYnl0ZSBbXSwgaW50KQotCQl0cnkgewotCQkJZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCA1KTsKLQkJCWFzc2VydEVxdWFscygiQ3JlYXRlZCBpbmNvcnJlY3QgcGFja2V0IiwgIkhlbGxvIiwgbmV3IFN0cmluZyhkcC5nZXREYXRhKCksIDAsCi0JCQkJCWRwLmdldERhdGEoKS5sZW5ndGgpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGVuZ3RoIiwgNSwgZHAuZ2V0TGVuZ3RoKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEYXRhZ3JhbVBhY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkRhdGFncmFtUGFja2V0KGJ5dGUgW10sIGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNyZWF0ZWQgaW5jb3JyZWN0IHBhY2tldCIsICJIZWxsbyIsIG5ldyBTdHJpbmcoZHAuZ2V0RGF0YSgpLCAwLAorICAgICAgICAgICAgICAgICAgICBkcC5nZXREYXRhKCkubGVuZ3RoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGxlbmd0aCIsIDUsIGRwLmdldExlbmd0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KICAgICAgICAgLy9yZWdyZXNzaW9uIGZvciBIYXJtb255LTg5MAogICAgICAgICBkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVs5NDJdLDQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGRwLmdldFBvcnQoKSk7CkBAIC01Niw0MTUgKzcxLDU2OCBAQAogICAgICAgICB9Y2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewogICAgICAgICAgICAgLy9leHBlY3RlZAogICAgICAgICB9Ci0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJKCkgewotCQl0cnkgewotCQkJZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCAyLCAzKTsKLQkJCWFzc2VydEVxdWFscygiQ3JlYXRlZCBpbmNvcnJlY3QgcGFja2V0IiwgIkhlbGxvIiwgbmV3IFN0cmluZyhkcC5nZXREYXRhKCksIDAsCi0JCQkJCWRwLmdldERhdGEoKS5sZW5ndGgpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGVuZ3RoIiwgMywgZHAuZ2V0TGVuZ3RoKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBvZmZzZXQiLCAyLCBkcC5nZXRPZmZzZXQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtUGFja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCAyLCAzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ3JlYXRlZCBpbmNvcnJlY3QgcGFja2V0IiwgIkhlbGxvIiwgbmV3IFN0cmluZyhkcC5nZXREYXRhKCksIDAsCisgICAgICAgICAgICAgICAgICAgIGRwLmdldERhdGEoKS5sZW5ndGgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbGVuZ3RoIiwgMywgZHAuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBvZmZzZXQiLCAyLCBkcC5nZXRPZmZzZXQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I0RhdGFncmFtUGFja2V0KGJ5dGVbXSwgaW50LCBpbnQsCi0JICogICAgICAgIGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCSUlMamF2YV9uZXRfSW5ldEFkZHJlc3NJKCkgewotCQl0cnkgewotCQkJZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCAyLCAzLCBJbmV0QWRkcmVzcwotCQkJCQkuZ2V0TG9jYWxIb3N0KCksIDApOwotCQkJYXNzZXJ0VHJ1ZSgiQ3JlYXRlZCBpbmNvcnJlY3QgcGFja2V0IiwgZHAuZ2V0QWRkcmVzcygpLmVxdWFscygKLQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpCi0JCQkJCSYmIGRwLmdldFBvcnQoKSA9PSAwKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGVuZ3RoIiwgMywgZHAuZ2V0TGVuZ3RoKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBvZmZzZXQiLCAyLCBkcC5nZXRPZmZzZXQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIENvbnN0cnVjdG9yIHRlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCwgaW50LAorICAgICAqICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtUGFja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIEluZXRBZGRyZXNzLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJTGphdmFfbmV0X0luZXRBZGRyZXNzSSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgMiwgMywgSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNyZWF0ZWQgaW5jb3JyZWN0IHBhY2tldCIsIGRwLmdldEFkZHJlc3MoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKQorICAgICAgICAgICAgICAgICAgICAmJiBkcC5nZXRQb3J0KCkgPT0gMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGxlbmd0aCIsIDMsIGRwLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3Jvbmcgb2Zmc2V0IiwgMiwgZHAuZ2V0T2Zmc2V0KCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBDb25zdHJ1Y3RvciB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCwKLQkgKiAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEJJTGphdmFfbmV0X0luZXRBZGRyZXNzSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkRhdGFncmFtUGFja2V0KGJ5dGUgW10sIGludCwKLQkJLy8gamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCkKLQkJdHJ5IHsKLQkJCWRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSwgSW5ldEFkZHJlc3MKLQkJCQkJLmdldExvY2FsSG9zdCgpLCAwKTsKLQkJCWFzc2VydFRydWUoIkNyZWF0ZWQgaW5jb3JyZWN0IHBhY2tldCIsIGRwLmdldEFkZHJlc3MoKS5lcXVhbHMoCi0JCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKQotCQkJCQkmJiBkcC5nZXRQb3J0KCkgPT0gMCk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIGxlbmd0aCIsIDUsIGRwLmdldExlbmd0aCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I0RhdGFncmFtUGFja2V0KGJ5dGVbXSwgaW50LAorICAgICAqICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtUGFja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBJbmV0QWRkcmVzcy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEJJTGphdmFfbmV0X0luZXRBZGRyZXNzSSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkRhdGFncmFtUGFja2V0KGJ5dGUgW10sIGludCwKKyAgICAgICAgLy8gamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSwgSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNyZWF0ZWQgaW5jb3JyZWN0IHBhY2tldCIsIGRwLmdldEFkZHJlc3MoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKQorICAgICAgICAgICAgICAgICAgICAmJiBkcC5nZXRQb3J0KCkgPT0gMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGxlbmd0aCIsIDUsIGRwLmdldExlbmd0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgQ29uc3RydWN0b3IgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0QWRkcmVzcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRBZGRyZXNzKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuSW5ldEFkZHJlc3MKLQkJLy8gamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQuZ2V0QWRkcmVzcygpCi0JCXRyeSB7Ci0JCQlkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiSGVsbG8iLmdldEJ5dGVzKCksIDUsIEluZXRBZGRyZXNzCi0JCQkJCS5nZXRMb2NhbEhvc3QoKSwgMCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYWRkcmVzcyByZXR1cm5lZCIsIGRwLmdldEFkZHJlc3MoKS5lcXVhbHMoCi0JCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGdldEFkZHJlc3MgdGVzdDoiICsgZS50b1N0cmluZygpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0QWRkcmVzcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkluZXRBZGRyZXNzCisgICAgICAgIC8vIGphdmEubmV0LkRhdGFncmFtUGFja2V0LmdldEFkZHJlc3MoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCA1LCBJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGFkZHJlc3MgcmV0dXJuZWQiLCBkcC5nZXRBZGRyZXNzKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRBZGRyZXNzIHRlc3Q6IiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0RGF0YSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXREYXRhKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBbXSBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldC5nZXREYXRhKCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0RGF0YSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGF0YSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJ5dGUgW10gamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQuZ2V0RGF0YSgpCiAKLQkJZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCA1KTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbGVuZ3RoIHJldHVybmVkIiwgIkhlbGxvIiwgbmV3IFN0cmluZyhkcC5nZXREYXRhKCksIDAsIGRwCi0JCQkJLmdldERhdGEoKS5sZW5ndGgpKTsKLQl9CisgICAgICAgIGRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxlbmd0aCByZXR1cm5lZCIsICJIZWxsbyIsIG5ldyBTdHJpbmcoZHAuZ2V0RGF0YSgpLCAwLCBkcAorICAgICAgICAgICAgICAgIC5nZXREYXRhKCkubGVuZ3RoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRMZW5ndGgoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQuZ2V0TGVuZ3RoKCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0TGVuZ3RoKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExlbmd0aCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldC5nZXRMZW5ndGgoKQogCi0JCWRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSk7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxlbmd0aCByZXR1cm5lZCIsIDUsIGRwLmdldExlbmd0aCgpKTsKLQl9CisgICAgICAgIGRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxlbmd0aCByZXR1cm5lZCIsIDUsIGRwLmdldExlbmd0aCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0T2Zmc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE9mZnNldCgpIHsKLQkJZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCAzLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbGVuZ3RoIHJldHVybmVkIiwgMywgZHAuZ2V0T2Zmc2V0KCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0T2Zmc2V0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE9mZnNldCgpIHsKKyAgICAgICAgZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCAzLCAyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbGVuZ3RoIHJldHVybmVkIiwgMywgZHAuZ2V0T2Zmc2V0KCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNnZXRQb3J0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFBvcnQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQuZ2V0UG9ydCgpCi0JCXRyeSB7Ci0JCQlkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiSGVsbG8iLmdldEJ5dGVzKCksIDUsIEluZXRBZGRyZXNzCi0JCQkJCS5nZXRMb2NhbEhvc3QoKSwgMTAwMCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwb3J0IHJldHVybmVkIiwgMTAwMCwgZHAuZ2V0UG9ydCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0UG9ydCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNnZXRQb3J0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQb3J0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubmV0LkRhdGFncmFtUGFja2V0LmdldFBvcnQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCA1LCBJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIDEwMDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcG9ydCByZXR1cm5lZCIsIDEwMDAsIGRwLmdldFBvcnQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGdldFBvcnQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCQlJbmV0QWRkcmVzcyBsb2NhbGhvc3QgPSBudWxsOwotCQl0cnkgewotCQkJbG9jYWxob3N0ID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJsb2NhbGhvc3QiKTsKLQkJfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBVbmtub3duSG9zdEV4Y2VwdGlvbiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgyKTsKLQkJZmluYWwgaW50IHBvcnQgPSBwb3J0c1swXTsKLQkJZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsaG9zdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NhbGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoImxvY2FsaG9zdCIpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIFVua25vd25Ib3N0RXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDIpOworICAgICAgICBmaW5hbCBpbnQgcG9ydCA9IHBvcnRzWzBdOworICAgICAgICBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKIAotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGF0YWdyYW1Tb2NrZXQgc29ja2V0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydCk7Ci0JCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQkJc3RhcnRlZCA9IHRydWU7Ci0JCQkJCQlsb2NrLm5vdGlmeUFsbCgpOwotCQkJCQl9Ci0JCQkJCXNvY2tldC5zZXRTb1RpbWVvdXQoMzAwMCk7Ci0JCQkJCURhdGFncmFtUGFja2V0IHBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyNTZdLAotCQkJCQkJCTI1Nik7Ci0JCQkJCXNvY2tldC5yZWNlaXZlKHBhY2tldCk7Ci0JCQkJCXNvY2tldC5zZW5kKHBhY2tldCk7Ci0JCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0aHJlYWQgZXhjZXB0aW9uOiAiICsgZSk7Ci0JCQkJCWlmIChzb2NrZXQgIT0gbnVsbCkKLQkJCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRocmVhZC5zdGFydCgpOworICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQoMzAwMCk7CisgICAgICAgICAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Nik7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5yZWNlaXZlKHBhY2tldCk7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5zZW5kKHBhY2tldCk7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0aHJlYWQgZXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRocmVhZC5zdGFydCgpOwogCi0JCURhdGFncmFtU29ja2V0IHNvY2tldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOwotCQkJc29ja2V0LnNldFNvVGltZW91dCgzMDAwKTsKLQkJCURhdGFncmFtUGFja2V0IHBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVtdIHsgMSwgMiwgMywgNCwKLQkJCQkJNSwgNiB9LCA2LCBsb2NhbGhvc3QsIHBvcnQpOwotCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKCFzdGFydGVkKQotCQkJCQkJbG9jay53YWl0KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJc29ja2V0LnNlbmQocGFja2V0KTsKLQkJCXNvY2tldC5yZWNlaXZlKHBhY2tldCk7Ci0JCQlzb2NrZXQuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoImRhdGFncmFtIHJlY2VpdmVkIHdyb25nIHBvcnQ6ICIgKyBwYWNrZXQuZ2V0UG9ydCgpLAotCQkJCQlwYWNrZXQuZ2V0UG9ydCgpID09IHBvcnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoc29ja2V0ICE9IG51bGwpCi0JCQkJc29ja2V0LmNsb3NlKCk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oInBvcnQ6ICIgKyBwb3J0ICsgIiBkYXRhZ3JhbSBzZXJ2ZXIgZXJyb3I6ICIpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoInBvcnQgOiAiICsgcG9ydCArICIgZGF0YWdyYW0gc2VydmVyIGVycm9yIDogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAgICAgRGF0YWdyYW1Tb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7CisgICAgICAgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KDMwMDApOworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlW10geyAxLCAyLCAzLCA0LAorICAgICAgICAgICAgICAgICAgICA1LCA2IH0sIDYsIGxvY2FsaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLndhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzb2NrZXQuc2VuZChwYWNrZXQpOworICAgICAgICAgICAgc29ja2V0LnJlY2VpdmUocGFja2V0KTsKKyAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZGF0YWdyYW0gcmVjZWl2ZWQgd3JvbmcgcG9ydDogIiArIHBhY2tldC5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgIHBhY2tldC5nZXRQb3J0KCkgPT0gcG9ydCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicG9ydDogIiArIHBvcnQgKyAiIGRhdGFncmFtIHNlcnZlciBlcnJvcjogIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgicG9ydCA6ICIgKyBwb3J0ICsgIiBkYXRhZ3JhbSBzZXJ2ZXIgZXJyb3IgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I3NldEFkZHJlc3MoamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRBZGRyZXNzTGphdmFfbmV0X0luZXRBZGRyZXNzKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldC5zZXRBZGRyZXNzKGphdmEubmV0LkluZXRBZGRyZXNzKQotCQl0cnkgewotCQkJSW5ldEFkZHJlc3MgaWEgPSBJbmV0QWRkcmVzcwotCQkJCQkuZ2V0QnlOYW1lKFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JbmV0VGVzdElQKTsKLQkJCWRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSwgSW5ldEFkZHJlc3MKLQkJCQkJLmdldExvY2FsSG9zdCgpLCAwKTsKLQkJCWRwLnNldEFkZHJlc3MoaWEpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGFkZHJlc3MgcmV0dXJuZWQiLCBkcC5nZXRBZGRyZXNzKCkuZXF1YWxzKGlhKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGdldEFkZHJlc3MgdGVzdDoiICsgZS50b1N0cmluZygpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjc2V0QWRkcmVzcyhqYXZhLm5ldC5JbmV0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0luZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEFkZHJlc3NMamF2YV9uZXRfSW5ldEFkZHJlc3MoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEubmV0LkRhdGFncmFtUGFja2V0LnNldEFkZHJlc3MoamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBpYSA9IEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLkluZXRUZXN0SVApOworICAgICAgICAgICAgZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCA1LCBJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIDApOworICAgICAgICAgICAgZHAuc2V0QWRkcmVzcyhpYSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYWRkcmVzcyByZXR1cm5lZCIsIGRwLmdldEFkZHJlc3MoKS5lcXVhbHMoaWEpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0QWRkcmVzcyB0ZXN0OiIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I3NldERhdGEoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldERhdGEkQklJKCkgewotCQlkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiSGVsbG8iLmdldEJ5dGVzKCksIDUpOwotCQlkcC5zZXREYXRhKCJXYWdnYSBXYWdnYSIuZ2V0Qnl0ZXMoKSwgMiwgMyk7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRhdGEgc2V0IiwgIldhZ2dhIFdhZ2dhIiwgbmV3IFN0cmluZyhkcC5nZXREYXRhKCkpCi0JCQkJKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I3NldERhdGEoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYXRhIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF0YSRCSUkoKSB7CisgICAgICAgIGRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSk7CisgICAgICAgIGRwLnNldERhdGEoIldhZ2dhIFdhZ2dhIi5nZXRCeXRlcygpLCAyLCAzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZGF0YSBzZXQiLCAiV2FnZ2EgV2FnZ2EiLCBuZXcgU3RyaW5nKGRwLmdldERhdGEoKSkKKyAgICAgICAgICAgICAgICApOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNzZXREYXRhKGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldERhdGEkQigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQuc2V0RGF0YShieXRlIFtdKQotCQlkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiSGVsbG8iLmdldEJ5dGVzKCksIDUpOwotCQlkcC5zZXREYXRhKCJSYWxwaCIuZ2V0Qnl0ZXMoKSk7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRhdGEgc2V0IiwgIlJhbHBoIiwgbmV3IFN0cmluZyhkcC5nZXREYXRhKCksIDAsIGRwCi0JCQkJLmdldERhdGEoKS5sZW5ndGgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I3NldERhdGEoYnl0ZVtdKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERhdGEiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERhdGEkQigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQuc2V0RGF0YShieXRlIFtdKQorICAgICAgICBkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiSGVsbG8iLmdldEJ5dGVzKCksIDUpOworICAgICAgICBkcC5zZXREYXRhKCJSYWxwaCIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRhdGEgc2V0IiwgIlJhbHBoIiwgbmV3IFN0cmluZyhkcC5nZXREYXRhKCksIDAsIGRwCisgICAgICAgICAgICAgICAgLmdldERhdGEoKS5sZW5ndGgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjc2V0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldExlbmd0aEkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LkRhdGFncmFtUGFja2V0LnNldExlbmd0aChpbnQpCi0JCWRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSk7Ci0JCWRwLnNldExlbmd0aCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHBhY2tldCBsZW5ndGgiLCAxLCBkcC5nZXRMZW5ndGgoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNzZXRMZW5ndGgoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExlbmd0aEkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LkRhdGFncmFtUGFja2V0LnNldExlbmd0aChpbnQpCisgICAgICAgIGRwID0gbmV3IERhdGFncmFtUGFja2V0KCJIZWxsbyIuZ2V0Qnl0ZXMoKSwgNSk7CisgICAgICAgIGRwLnNldExlbmd0aCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHBhY2tldCBsZW5ndGgiLCAxLCBkcC5nZXRMZW5ndGgoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I3NldFBvcnQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0UG9ydEkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LkRhdGFncmFtUGFja2V0LnNldFBvcnQoaW50KQotCQl0cnkgewotCQkJZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCA1LCBJbmV0QWRkcmVzcwotCQkJCQkuZ2V0TG9jYWxIb3N0KCksIDEwMDApOwotCQkJZHAuc2V0UG9ydCgyMDAwKTsKLQkJCWFzc2VydEVxdWFscygiUG9ydCBub3Qgc2V0IiwgMjAwMCwgZHAuZ2V0UG9ydCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2V0UG9ydCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjc2V0UG9ydChpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UG9ydEkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LkRhdGFncmFtUGFja2V0LnNldFBvcnQoaW50KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIkhlbGxvIi5nZXRCeXRlcygpLCA1LCBJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIDEwMDApOworICAgICAgICAgICAgZHAuc2V0UG9ydCgyMDAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUG9ydCBub3Qgc2V0IiwgMjAwMCwgZHAuZ2V0UG9ydCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgc2V0UG9ydCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCwKLQkgKiAgICAgICAgamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEJJTGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB7Ci0JCWNsYXNzIG15U29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNEYXRhZ3JhbVBhY2tldChieXRlW10sIGludCwKKyAgICAgKiAgICAgICAgamF2YS5uZXQuU29ja2V0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGF0YWdyYW1QYWNrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIFNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklMamF2YV9uZXRfU29ja2V0QWRkcmVzcygpIHsKKyAgICAgICAgY2xhc3MgbXlTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAKLQkJCXB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJLy8gdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcwotCQkJYnl0ZSBidWZbXSA9IG5ldyBieXRlWzFdOwotCQkJdHJ5IHsKLQkJCQlEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxLAotCQkJCQkJbmV3IG15U29ja2V0QWRkcmVzcygpKTsKLQkJCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBjb25zdHJ1Y3RpbmcgdXNpbmcgdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcyIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzCisgICAgICAgICAgICBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgbXlTb2NrZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbnN0cnVjdGluZyB1c2luZyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gY2FzZSB3ZXJlIHdlIHRyeSB0byBwYXNzIGluIG51bGwKLQkJCS8vIHVuc3VwcG9ydGVkIFNvY2tldEFkZHJlc3Mgc3ViY2xhc3MKKyAgICAgICAgICAgIC8vIGNhc2Ugd2VyZSB3ZSB0cnkgdG8gcGFzcyBpbiBudWxsCisgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzCiAKLQkJCXRyeSB7Ci0JCQkJRGF0YWdyYW1QYWNrZXQgdGhlUGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KGJ1ZiwgMSwgbnVsbCk7Ci0JCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gY29uc3RydWN0aW5nIGFkZHJlc3MgdXNpbmcgbnVsbCIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEsIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbnN0cnVjdGluZyBhZGRyZXNzIHVzaW5nIG51bGwiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQogCi0JCQkvLyBub3cgdmFsaWRhdGUgd2UgY2FuIGNvbnN0cnVjdAotCQkJSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7Ci0JCQlEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxLCB0aGVBZGRyZXNzKTsKLQkJCWFzc2VydFRydWUoIlNvY2tldCBhZGRyZXNzIG5vdCBzZXQgY29ycmVjdGx5ICgxKSIsIHRoZUFkZHJlc3MKLQkJCQkJLmVxdWFscyh0aGVQYWNrZXQuZ2V0U29ja2V0QWRkcmVzcygpKSk7Ci0JCQlhc3NlcnRUcnVlKCJTb2NrZXQgYWRkcmVzcyBub3Qgc2V0IGNvcnJlY3RseSAoMikiLCB0aGVBZGRyZXNzCi0JCQkJCS5lcXVhbHMobmV3IEluZXRTb2NrZXRBZGRyZXNzKHRoZVBhY2tldC5nZXRBZGRyZXNzKCksCi0JCQkJCQkJdGhlUGFja2V0LmdldFBvcnQoKSkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgY29uc3RydWN0b3IgdGVzdCgxKToiICsgZS50b1N0cmluZygpKTsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB3ZSBjYW4gY29uc3RydWN0CisgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEsIHRoZUFkZHJlc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IGFkZHJlc3Mgbm90IHNldCBjb3JyZWN0bHkgKDEpIiwgdGhlQWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRoZVBhY2tldC5nZXRTb2NrZXRBZGRyZXNzKCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBhZGRyZXNzIG5vdCBzZXQgY29ycmVjdGx5ICgyKSIsIHRoZUFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgSW5ldFNvY2tldEFkZHJlc3ModGhlUGFja2V0LmdldEFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQYWNrZXQuZ2V0UG9ydCgpKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBjb25zdHJ1Y3RvciB0ZXN0KDEpOiIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I0RhdGFncmFtUGFja2V0KGJ5dGVbXSwgaW50LCBpbnQsCi0JICogICAgICAgIGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCSUlMamF2YV9uZXRfU29ja2V0QWRkcmVzcygpIHsKLQkJY2xhc3MgbXlTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I0RhdGFncmFtUGFja2V0KGJ5dGVbXSwgaW50LCBpbnQsCisgICAgICogICAgICAgIGphdmEubmV0LlNvY2tldEFkZHJlc3MpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtUGFja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIFNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQklJTGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB7CisgICAgICAgIGNsYXNzIG15U29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgewogCi0JCQlwdWJsaWMgbXlTb2NrZXRBZGRyZXNzKCkgewotCQkJfQotCQl9CisgICAgICAgICAgICBwdWJsaWMgbXlTb2NrZXRBZGRyZXNzKCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCS8vIHVuc3VwcG9ydGVkIFNvY2tldEFkZHJlc3Mgc3ViY2xhc3MKLQkJCWJ5dGUgYnVmW10gPSBuZXcgYnl0ZVsyXTsKLQkJCXRyeSB7Ci0JCQkJRGF0YWdyYW1QYWNrZXQgdGhlUGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KGJ1ZiwgMSwgMSwKLQkJCQkJCW5ldyBteVNvY2tldEFkZHJlc3MoKSk7Ci0JCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gY29uc3RydWN0aW5nIHVzaW5nIHVuc3VwcG9ydGVkIFNvY2tldEFkZHJlc3Mgc3ViY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcworICAgICAgICAgICAgYnl0ZSBidWZbXSA9IG5ldyBieXRlWzJdOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG15U29ja2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gd2hlbiBjb25zdHJ1Y3RpbmcgdXNpbmcgdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcyIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CiAKLQkJCS8vIGNhc2Ugd2VyZSB3ZSB0cnkgdG8gcGFzcyBpbiBudWxsCi0JCQkvLyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzCisgICAgICAgICAgICAvLyBjYXNlIHdlcmUgd2UgdHJ5IHRvIHBhc3MgaW4gbnVsbAorICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcwogCi0JCQl0cnkgewotCQkJCURhdGFncmFtUGFja2V0IHRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEsIDEsIG51bGwpOwotCQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbnN0cnVjdGluZyBhZGRyZXNzIHVzaW5nIG51bGwiKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxLCAxLCBudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gd2hlbiBjb25zdHJ1Y3RpbmcgYWRkcmVzcyB1c2luZyBudWxsIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gbm93IHZhbGlkYXRlIHdlIGNhbiBjb25zdHJ1Y3QKLQkJCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkJLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCkpOwotCQkJRGF0YWdyYW1QYWNrZXQgdGhlUGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KGJ1ZiwgMSwgMSwgdGhlQWRkcmVzcyk7Ci0JCQlhc3NlcnRUcnVlKCJTb2NrZXQgYWRkcmVzcyBub3Qgc2V0IGNvcnJlY3RseSAoMSkiLCB0aGVBZGRyZXNzCi0JCQkJCS5lcXVhbHModGhlUGFja2V0LmdldFNvY2tldEFkZHJlc3MoKSkpOwotCQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IGFkZHJlc3Mgbm90IHNldCBjb3JyZWN0bHkgKDIpIiwgdGhlQWRkcmVzcwotCQkJCQkuZXF1YWxzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyh0aGVQYWNrZXQuZ2V0QWRkcmVzcygpLAotCQkJCQkJCXRoZVBhY2tldC5nZXRQb3J0KCkpKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIk9mZnNldCBub3Qgc2V0IGNvcnJlY3RseSIsIDEsIHRoZVBhY2tldC5nZXRPZmZzZXQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGNvbnN0cnVjdG9yIHRlc3QoMik6IiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgICAgICAgICAvLyBub3cgdmFsaWRhdGUgd2UgY2FuIGNvbnN0cnVjdAorICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxLCAxLCB0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBhZGRyZXNzIG5vdCBzZXQgY29ycmVjdGx5ICgxKSIsIHRoZUFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyh0aGVQYWNrZXQuZ2V0U29ja2V0QWRkcmVzcygpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgYWRkcmVzcyBub3Qgc2V0IGNvcnJlY3RseSAoMikiLCB0aGVBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV3IEluZXRTb2NrZXRBZGRyZXNzKHRoZVBhY2tldC5nZXRBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUGFja2V0LmdldFBvcnQoKSkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiT2Zmc2V0IG5vdCBzZXQgY29ycmVjdGx5IiwgMSwgdGhlUGFja2V0LmdldE9mZnNldCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgY29uc3RydWN0b3IgdGVzdCgyKToiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNnZXRTb2NrZXRBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFNvY2tldEFkZHJlc3MoKSB7Ci0JCXRyeSB7Ci0JCQlieXRlIGJ1ZltdID0gbmV3IGJ5dGVbMV07Ci0JCQlEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQjZ2V0U29ja2V0QWRkcmVzcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U29ja2V0QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U29ja2V0QWRkcmVzcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGUgYnVmW10gPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEpOwogCi0JCQkvLyB2YWxpZGF0ZSBnZXQgcmV0dXJucyB0aGUgdmFsdWUgd2Ugc2V0Ci0JCQlJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCi0JCQkJCS5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpKTsKLQkJCXRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEpOwotCQkJdGhlUGFja2V0LnNldFNvY2tldEFkZHJlc3ModGhlQWRkcmVzcyk7Ci0JCQlhc3NlcnRUcnVlKCJTb2NrZXQgYWRkcmVzcyBub3Qgc2V0IGNvcnJlY3RseSAoMSkiLCB0aGVBZGRyZXNzCi0JCQkJCS5lcXVhbHModGhlUGFja2V0LmdldFNvY2tldEFkZHJlc3MoKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgKLQkJCQkJIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0U29ja2V0QWRkcmVzcyB0ZXN0OiIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gdmFsaWRhdGUgZ2V0IHJldHVybnMgdGhlIHZhbHVlIHdlIHNldAorICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7CisgICAgICAgICAgICB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxKTsKKyAgICAgICAgICAgIHRoZVBhY2tldC5zZXRTb2NrZXRBZGRyZXNzKHRoZUFkZHJlc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IGFkZHJlc3Mgbm90IHNldCBjb3JyZWN0bHkgKDEpIiwgdGhlQWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRoZVBhY2tldC5nZXRTb2NrZXRBZGRyZXNzKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gZHVyaW5nIGdldFNvY2tldEFkZHJlc3MgdGVzdDoiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCNzZXRTb2NrZXRBZGRyZXNzKGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRTb2NrZXRBZGRyZXNzTGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtUGFja2V0I3NldFNvY2tldEFkZHJlc3MoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTb2NrZXRBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U29ja2V0QWRkcmVzc0xqYXZhX25ldF9Tb2NrZXRBZGRyZXNzKCkgewogCi0JCWNsYXNzIG15U29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgeworICAgICAgICBjbGFzcyBteVNvY2tldEFkZHJlc3MgZXh0ZW5kcyBTb2NrZXRBZGRyZXNzIHsKIAotCQkJcHVibGljIG15U29ja2V0QWRkcmVzcygpIHsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIG15U29ja2V0QWRkcmVzcygpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQkvLyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzCi0JCQlieXRlIGJ1ZltdID0gbmV3IGJ5dGVbMV07Ci0JCQlEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxKTsKLQkJCXRyeSB7Ci0JCQkJdGhlUGFja2V0LnNldFNvY2tldEFkZHJlc3MobmV3IG15U29ja2V0QWRkcmVzcygpKTsKLQkJCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBzZXR0aW5nIGFkZHJlc3MgdXNpbmcgdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcyIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzCisgICAgICAgICAgICBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCB0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhlUGFja2V0LnNldFNvY2tldEFkZHJlc3MobmV3IG15U29ja2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gd2hlbiBzZXR0aW5nIGFkZHJlc3MgdXNpbmcgdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcyIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CiAKLQkJCS8vIGNhc2Ugd2VyZSB3ZSB0cnkgdG8gcGFzcyBpbiBudWxsCi0JCQkvLyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzCi0JCQl0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxKTsKLQkJCXRyeSB7Ci0JCQkJdGhlUGFja2V0LnNldFNvY2tldEFkZHJlc3MobnVsbCk7Ci0JCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gc2V0dGluZyBhZGRyZXNzIHVzaW5nIG51bGwiKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJfQorICAgICAgICAgICAgLy8gY2FzZSB3ZXJlIHdlIHRyeSB0byBwYXNzIGluIG51bGwKKyAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIFNvY2tldEFkZHJlc3Mgc3ViY2xhc3MKKyAgICAgICAgICAgIHRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGVQYWNrZXQuc2V0U29ja2V0QWRkcmVzcyhudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gd2hlbiBzZXR0aW5nIGFkZHJlc3MgdXNpbmcgbnVsbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CiAKLQkJCS8vIG5vdyB2YWxpZGF0ZSB3ZSBjYW4gc2V0IGl0IGNvcnJlY3RseQotCQkJSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7Ci0JCQl0aGVQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCAxKTsKLQkJCXRoZVBhY2tldC5zZXRTb2NrZXRBZGRyZXNzKHRoZUFkZHJlc3MpOwotCQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IGFkZHJlc3Mgbm90IHNldCBjb3JyZWN0bHkgKDEpIiwgdGhlQWRkcmVzcwotCQkJCQkuZXF1YWxzKHRoZVBhY2tldC5nZXRTb2NrZXRBZGRyZXNzKCkpKTsKLQkJCWFzc2VydFRydWUoIlNvY2tldCBhZGRyZXNzIG5vdCBzZXQgY29ycmVjdGx5ICgyKSIsIHRoZUFkZHJlc3MKLQkJCQkJLmVxdWFscyhuZXcgSW5ldFNvY2tldEFkZHJlc3ModGhlUGFja2V0LmdldEFkZHJlc3MoKSwKLQkJCQkJCQl0aGVQYWNrZXQuZ2V0UG9ydCgpKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgKLQkJCQkJIkV4Y2VwdGlvbiBkdXJpbmcgc2V0U29ja2V0QWRkcmVzcyB0ZXN0OiIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gbm93IHZhbGlkYXRlIHdlIGNhbiBzZXQgaXQgY29ycmVjdGx5CisgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpKTsKKyAgICAgICAgICAgIHRoZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIDEpOworICAgICAgICAgICAgdGhlUGFja2V0LnNldFNvY2tldEFkZHJlc3ModGhlQWRkcmVzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgYWRkcmVzcyBub3Qgc2V0IGNvcnJlY3RseSAoMSkiLCB0aGVBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModGhlUGFja2V0LmdldFNvY2tldEFkZHJlc3MoKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IGFkZHJlc3Mgbm90IHNldCBjb3JyZWN0bHkgKDIpIiwgdGhlQWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyh0aGVQYWNrZXQuZ2V0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVBhY2tldC5nZXRQb3J0KCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGR1cmluZyBzZXRTb2NrZXRBZGRyZXNzIHRlc3Q6IiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGRvbmVTdWl0ZSgpIHsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgZG9uZVN1aXRlKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXRJbXBsVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldEltcGxUZXN0LmphdmEKaW5kZXggYmQ2YWQxNC4uMDcxNjA1OSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldEltcGxUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldEltcGxUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKQEAgLTI2LDEwICszMSwyMCBAQAogaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKERhdGFncmFtU29ja2V0SW1wbC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRGF0YWdyYW1Tb2NrZXRJbXBsVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0SW1wbCNEYXRhZ3JhbVNvY2tldEltcGwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtU29ja2V0SW1wbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTExMTcKICAgICAgICAgTW9ja0RhdGFncmFtU29ja2V0SW1wbCBpbXBsID0gbmV3IE1vY2tEYXRhZ3JhbVNvY2tldEltcGwoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXRUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0RhdGFncmFtU29ja2V0VGVzdC5qYXZhCmluZGV4IDU0NTg4MTQuLjA4N2QzMDUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuQmluZEV4Y2VwdGlvbjsKQEAgLTM2LDkzMiArNDEsMTA2OCBAQAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Db25maWd1cmF0aW9uOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Qb3J0TWFuYWdlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhEYXRhZ3JhbVNvY2tldC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRGF0YWdyYW1Tb2NrZXRUZXN0IGV4dGVuZHMgU29ja2V0VGVzdENhc2UgewogCi0JamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQgZHM7CisgICAgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQgZHM7CiAKLQlqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCBkcDsKKyAgICBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCBkcDsKIAotCURhdGFncmFtU29ja2V0IHNkcyA9IG51bGw7CisgICAgRGF0YWdyYW1Tb2NrZXQgc2RzID0gbnVsbDsKIAotCVN0cmluZyByZXR2YWw7CisgICAgU3RyaW5nIHJldHZhbDsKIAotCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRlc3QgU3RyaW5nIjsKKyAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJUZXN0IFN0cmluZyI7CiAKLQlib29sZWFuIGludGVycnVwdGVkOworICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQ7CiAKLQljbGFzcyBEYXRhZ3JhbVNlcnZlciBleHRlbmRzIFRocmVhZCB7CisgICAgY2xhc3MgRGF0YWdyYW1TZXJ2ZXIgZXh0ZW5kcyBUaHJlYWQgewogCi0JCXB1YmxpYyBEYXRhZ3JhbVNvY2tldCBtczsKKyAgICAgICAgcHVibGljIERhdGFncmFtU29ja2V0IG1zOwogCi0JCWJvb2xlYW4gcnVubmluZyA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IHRydWU7CiAKLQkJcHVibGljIHZvbGF0aWxlIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgcHVibGljIHZvbGF0aWxlIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNTEyXTsKIAotCQl2b2xhdGlsZSBEYXRhZ3JhbVBhY2tldCByZHAgPSBudWxsOworICAgICAgICB2b2xhdGlsZSBEYXRhZ3JhbVBhY2tldCByZHAgPSBudWxsOwogCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKHJ1bm5pbmcpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1zLnJlY2VpdmUocmRwKTsKLQkJCQkJCS8vIGVjaG8gdGhlIHBhY2tldCBiYWNrCi0JCQkJCQltcy5zZW5kKHJkcCk7Ci0JCQkJCX0gY2F0Y2ggKGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUaHJlYWQueWllbGQoKTsKLQkJCQkJfQotCQkJCQk7Ci0JCQkJfQotCQkJCTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGF0YWdyYW1TZXJ2ZXIgc2VydmVyIGZhaWxlZDogIiArIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltcy5jbG9zZSgpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zLnJlY2VpdmUocmRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVjaG8gdGhlIHBhY2tldCBiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICBtcy5zZW5kKHJkcCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGF0YWdyYW1TZXJ2ZXIgc2VydmVyIGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKLQkJCXJ1bm5pbmcgPSBmYWxzZTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgeworICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlOworICAgICAgICB9CiAKLQkJcHVibGljIERhdGFncmFtU2VydmVyKGludCBhUG9ydCwgSW5ldEFkZHJlc3MgYWRkcmVzcykKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCQlyYnVmID0gbmV3IGJ5dGVbNTEyXTsKLQkJCXJidWZbMF0gPSAtMTsKLQkJCXJkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChyYnVmLCByYnVmLmxlbmd0aCk7Ci0JCQltcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChhUG9ydCwgYWRkcmVzcyk7Ci0JCQltcy5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBEYXRhZ3JhbVNlcnZlcihpbnQgYVBvcnQsIEluZXRBZGRyZXNzIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmJ1ZiA9IG5ldyBieXRlWzUxMl07CisgICAgICAgICAgICByYnVmWzBdID0gLTE7CisgICAgICAgICAgICByZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQocmJ1ZiwgcmJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgbXMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoYVBvcnQsIGFkZHJlc3MpOworICAgICAgICAgICAgbXMuc2V0U29UaW1lb3V0KDIwMDApOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I0RhdGFncmFtU29ja2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQoKQotCQl0cnkgewotCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNvdWxkIG5vdCBjcmVhdGUgRGF0YWdyYW1Tb2NrZXQgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I0RhdGFncmFtU29ja2V0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkRhdGFncmFtU29ja2V0KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDb3VsZCBub3QgY3JlYXRlIERhdGFncmFtU29ja2V0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNEYXRhZ3JhbVNvY2tldChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChpbnQpCi0JCXRyeSB7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOwotCQkJYXNzZXJ0VHJ1ZSgiQ3JlYXRlZCBzb2NrZXQgd2l0aCBpbmNvcnJlY3QgcG9ydCIsCi0JCQkJCWRzLmdldExvY2FsUG9ydCgpID09IHBvcnROdW1iZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBEYXRhZ3JhbVNvY2tldCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I0RhdGFncmFtU29ja2V0KGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3JlYXRlZCBzb2NrZXQgd2l0aCBpbmNvcnJlY3QgcG9ydCIsCisgICAgICAgICAgICAgICAgICAgIGRzLmdldExvY2FsUG9ydCgpID09IHBvcnROdW1iZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBEYXRhZ3JhbVNvY2tldCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjRGF0YWdyYW1Tb2NrZXQoaW50LCBqYXZhLm5ldC5JbmV0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX25ldF9JbmV0QWRkcmVzcygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkRhdGFncmFtU29ja2V0KGludCwgamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0JCXRyeSB7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIsIEluZXRBZGRyZXNzCi0JCQkJCS5nZXRMb2NhbEhvc3QoKSk7Ci0JCQlhc3NlcnRUcnVlKCJDcmVhdGVkIHNvY2tldCB3aXRoIGluY29ycmVjdCBwb3J0IiwKLQkJCQkJZHMuZ2V0TG9jYWxQb3J0KCkgPT0gcG9ydE51bWJlcik7Ci0JCQlhc3NlcnRUcnVlKCJDcmVhdGVkIHNvY2tldCB3aXRoIGluY29ycmVjdCBhZGRyZXNzIiwgZHMKLQkJCQkJLmdldExvY2FsQWRkcmVzcygpLmVxdWFscyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBEYXRhZ3JhbVNvY2tldCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I0RhdGFncmFtU29ja2V0KGludCwgamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEYXRhZ3JhbVNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIEluZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX25ldF9JbmV0QWRkcmVzcygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkRhdGFncmFtU29ja2V0KGludCwgamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIsIEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIHNvY2tldCB3aXRoIGluY29ycmVjdCBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgZHMuZ2V0TG9jYWxQb3J0KCkgPT0gcG9ydE51bWJlcik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIHNvY2tldCB3aXRoIGluY29ycmVjdCBhZGRyZXNzIiwgZHMKKyAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsQWRkcmVzcygpLmVxdWFscyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBEYXRhZ3JhbVNvY2tldCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LkRhdGFncmFtU29ja2V0LmNsb3NlKCkKLQkJdHJ5IHsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7Ci0JCQlkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiVGVzdCBTdHJpbmciLmdldEJ5dGVzKCksIDExLCBJbmV0QWRkcmVzcwotCQkJCQkuZ2V0TG9jYWxIb3N0KCksIDApOwotCQkJZHMuY2xvc2UoKTsKLQkJCWRzLnNlbmQoZHApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkRhdGEgc2VudCBhZnRlciBjbG9zZSIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjY2xvc2UoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LkRhdGFncmFtU29ja2V0LmNsb3NlKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7CisgICAgICAgICAgICBkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiVGVzdCBTdHJpbmciLmdldEJ5dGVzKCksIDExLCBJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIDApOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGRzLnNlbmQoZHApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkRhdGEgc2VudCBhZnRlciBjbG9zZSIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNjb25uZWN0KGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jb25uZWN0TGphdmFfbmV0X0luZXRBZGRyZXNzSSgpIHsKLQkJdHJ5IHsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KCk7Ci0JCQlJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQlkcy5jb25uZWN0KGluZXRBZGRyZXNzLCBwb3J0TnVtYmVyKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBJbmV0QWRkcmVzcyIsIGRzLmdldEluZXRBZGRyZXNzKCkuZXF1YWxzKAotCQkJCQlpbmV0QWRkcmVzcykpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IFBvcnQiLCBkcy5nZXRQb3J0KCkgPT0gcG9ydE51bWJlcik7Ci0JCQlkcy5kaXNjb25uZWN0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2Nvbm5lY3QoamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0luZXRBZGRyZXNzLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdExqYXZhX25ldF9JbmV0QWRkcmVzc0koKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgSW5ldEFkZHJlc3MiLCBkcy5nZXRJbmV0QWRkcmVzcygpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgaW5ldEFkZHJlc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBQb3J0IiwgZHMuZ2V0UG9ydCgpID09IHBvcnROdW1iZXIpOworICAgICAgICAgICAgZHMuZGlzY29ubmVjdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogCi0JCWlmICgidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgicnVuLmlwdjZ0ZXN0cyIpKSkgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiUnVubmluZyB0ZXN0X2Nvbm5lY3RMamF2YV9uZXRfSW5ldEFkZHJlc3NJKERhdGFncmFtU29ja2V0VGVzdCkgd2l0aCBJUHY2R2xvYmFsQWRkcmVzc0pjbDQ6ICIKLQkJCQkJCQkrIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQpOwotCQkJdHJ5IHsKLQkJCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOwotCQkJCUluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MKLQkJCQkJCS5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLklQdjZHbG9iYWxBZGRyZXNzSmNsNCk7Ci0JCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQkJZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7Ci0JCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IEluZXRBZGRyZXNzIiwgZHMuZ2V0SW5ldEFkZHJlc3MoKS5lcXVhbHMoCi0JCQkJCQlpbmV0QWRkcmVzcykpOwotCQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBQb3J0IiwgZHMuZ2V0UG9ydCgpID09IHBvcnROdW1iZXIpOwotCQkJCWRzLmRpc2Nvbm5lY3QoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInJ1bi5pcHY2dGVzdHMiKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIlJ1bm5pbmcgdGVzdF9jb25uZWN0TGphdmFfbmV0X0luZXRBZGRyZXNzSShEYXRhZ3JhbVNvY2tldFRlc3QpIHdpdGggSVB2Nkdsb2JhbEFkZHJlc3NKY2w0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSVB2Nkdsb2JhbEFkZHJlc3NKY2w0KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QnlOYW1lKFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQpOworICAgICAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgICAgIGRzLmNvbm5lY3QoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBJbmV0QWRkcmVzcyIsIGRzLmdldEluZXRBZGRyZXNzKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5ldEFkZHJlc3MpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgUG9ydCIsIGRzLmdldFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgICAgICBkcy5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJLy8gQ3JlYXRlIGEgY29ubmVjdGVkIGRhdGFncmFtIHNvY2tldCB0byB0ZXN0Ci0JCQkvLyBQbGFpbkRhdGFncmFtU29ja2V0SW1wbC5wZWVrKCkKLQkJCUluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKLQkJCWludCBwb3J0ID0gZHMuZ2V0TG9jYWxQb3J0KCk7Ci0JCQlkcy5jb25uZWN0KGxvY2FsSG9zdCwgcG9ydCk7Ci0JCQlEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwXSwgMTAsCi0JCQkJCWxvY2FsSG9zdCwgcG9ydCk7Ci0JCQlkcy5zZW5kKHNlbmQpOwotCQkJRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKLQkJCWRzLnNldFNvVGltZW91dCgyMDAwKTsKLQkJCWRzLnJlY2VpdmUocmVjZWl2ZSk7Ci0JCQlkcy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiV3Jvbmcgc2l6ZTogIiArIHJlY2VpdmUuZ2V0TGVuZ3RoKCksIHJlY2VpdmUKLQkJCQkJLmdldExlbmd0aCgpID09IDEwKTsKLQkJCWFzc2VydFRydWUoIldyb25nIHJlY2VpdmVyIiwgcmVjZWl2ZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGxvY2FsSG9zdCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29ubmVjdGVkIGRhdGFncmFtIHNvY2tldCB0byB0ZXN0CisgICAgICAgICAgICAvLyBQbGFpbkRhdGFncmFtU29ja2V0SW1wbC5wZWVrKCkKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgICAgICAgIGludCBwb3J0ID0gZHMuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgICAgICBkcy5jb25uZWN0KGxvY2FsSG9zdCwgcG9ydCk7CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwXSwgMTAsCisgICAgICAgICAgICAgICAgICAgIGxvY2FsSG9zdCwgcG9ydCk7CisgICAgICAgICAgICBkcy5zZW5kKHNlbmQpOworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKKyAgICAgICAgICAgIGRzLnNldFNvVGltZW91dCgyMDAwKTsKKyAgICAgICAgICAgIGRzLnJlY2VpdmUocmVjZWl2ZSk7CisgICAgICAgICAgICBkcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3Jvbmcgc2l6ZTogIiArIHJlY2VpdmUuZ2V0TGVuZ3RoKCksIHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgICAgLmdldExlbmd0aCgpID09IDEwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIHJlY2VpdmVyIiwgcmVjZWl2ZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGxvY2FsSG9zdCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogCi0JCWNsYXNzIERhdGFncmFtU2VydmVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgY2xhc3MgRGF0YWdyYW1TZXJ2ZXIgZXh0ZW5kcyBUaHJlYWQgewogCi0JCQlwdWJsaWMgRGF0YWdyYW1Tb2NrZXQgbXM7CisgICAgICAgICAgICBwdWJsaWMgRGF0YWdyYW1Tb2NrZXQgbXM7CiAKLQkJCWJvb2xlYW4gcnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIHJ1bm5pbmcgPSB0cnVlOwogCi0JCQlwdWJsaWMgYnl0ZVtdIHJidWYgPSBuZXcgYnl0ZVs1MTJdOworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNTEyXTsKIAotCQkJRGF0YWdyYW1QYWNrZXQgcmRwID0gbnVsbDsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHJkcCA9IG51bGw7CiAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQl3aGlsZSAocnVubmluZykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltcy5yZWNlaXZlKHJkcCk7Ci0JCQkJCQkJLy8gZWNobyB0aGUgcGFja2V0IGJhY2sKLQkJCQkJCQltcy5zZW5kKHJkcCk7Ci0JCQkJCQl9IGNhdGNoIChqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCVRocmVhZC55aWVsZCgpOwotCQkJCQkJfQotCQkJCQkJOwotCQkJCQl9Ci0JCQkJCTsKLQkJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aWNhc3Qgc2VydmVyIGZhaWxlZDogIiArIGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1zLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLnJlY2VpdmUocmRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlY2hvIHRoZSBwYWNrZXQgYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLnNlbmQocmRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpY2FzdCBzZXJ2ZXIgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoKSB7Ci0JCQkJcnVubmluZyA9IGZhbHNlOwotCQkJfQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKKyAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBEYXRhZ3JhbVNlcnZlcihpbnQgYVBvcnQsIEluZXRBZGRyZXNzIGFkZHJlc3MpCi0JCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJCQlyYnVmID0gbmV3IGJ5dGVbNTEyXTsKLQkJCQlyYnVmWzBdID0gLTE7Ci0JCQkJcmRwID0gbmV3IERhdGFncmFtUGFja2V0KHJidWYsIHJidWYubGVuZ3RoKTsKLQkJCQltcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChhUG9ydCwgYWRkcmVzcyk7Ci0JCQkJbXMuc2V0U29UaW1lb3V0KDIwMDApOwotCQkJfQotCQl9CisgICAgICAgICAgICBwdWJsaWMgRGF0YWdyYW1TZXJ2ZXIoaW50IGFQb3J0LCBJbmV0QWRkcmVzcyBhZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmJ1ZiA9IG5ldyBieXRlWzUxMl07CisgICAgICAgICAgICAgICAgcmJ1ZlswXSA9IC0xOworICAgICAgICAgICAgICAgIHJkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChyYnVmLCByYnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbXMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoYVBvcnQsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgIG1zLnNldFNvVGltZW91dCgyMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSBQb3J0VW5yZWFjaGFibGUgZXhjZXB0aW9uIGlmIHdlIHRyeSB0bwotCQkvLyBzZW5kIGEgZGdyYW0gdG8gYSBzZXJ2ZXIgdGhhdCBpcyBub3QgcnVubmluZyBhbmQgdGhlbiBkbyBhIHJlY3YKLQkJdHJ5IHsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KCk7Ci0JCQlJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQlkcy5jb25uZWN0KGluZXRBZGRyZXNzLCBwb3J0TnVtYmVyKTsKLQkJCURhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMTBdLCAxMCk7Ci0JCQlkcy5zZW5kKHNlbmQpOwotCQkJRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKLQkJCWRzLnNldFNvVGltZW91dCgxMDAwMCk7Ci0JCQlkcy5yZWNlaXZlKHJlY2VpdmUpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWZhaWwoCi0JCQkJCSJObyBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24gd2hlbiBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIG9uIHJlY3YgIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkiV3JvbmcgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgYXQgbmF0aXZlIGxldmVsIG9uIHJlY3Y6ICIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwKLQkJCQkJKGUgaW5zdGFuY2VvZiBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24pKTsKLQkJfQorICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgUG9ydFVucmVhY2hhYmxlIGV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8KKyAgICAgICAgLy8gc2VuZCBhIGRncmFtIHRvIGEgc2VydmVyIHRoYXQgaXMgbm90IHJ1bm5pbmcgYW5kIHRoZW4gZG8gYSByZWN2CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwXSwgMTApOworICAgICAgICAgICAgZHMuc2VuZChzZW5kKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7CisgICAgICAgICAgICBkcy5zZXRTb1RpbWVvdXQoMTAwMDApOworICAgICAgICAgICAgZHMucmVjZWl2ZShyZWNlaXZlKTsKKyAgICAgICAgICAgIGRzLmNsb3NlKCk7CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiTm8gUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uIHdoZW4gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbCBvbiByZWN2ICIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIldyb25nIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IGF0IG5hdGl2ZSBsZXZlbCBvbiByZWN2OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uKSk7CisgICAgICAgIH0KIAotCQkvLyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBzZW5kL3JlY2VpdmUgd2l0aCBkYXRhZ3JhbSBzb2NrZXRzIGNvbm5lY3RlZCBhdAotCQkvLyB0aGUgbmF0aXZlIGxldmVsCi0JCURhdGFncmFtU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7Ci0JCWludCBzZXJ2ZXJQb3J0TnVtYmVyID0gcG9ydHNbMF07Ci0JCXRyeSB7Ci0JCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCURhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKLQkJCURhdGFncmFtU29ja2V0IGRzMiA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1syXSk7CisgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIHNlbmQvcmVjZWl2ZSB3aXRoIGRhdGFncmFtIHNvY2tldHMgY29ubmVjdGVkIGF0CisgICAgICAgIC8vIHRoZSBuYXRpdmUgbGV2ZWwKKyAgICAgICAgRGF0YWdyYW1TZXJ2ZXIgc2VydmVyID0gbnVsbDsKKyAgICAgICAgaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgzKTsKKyAgICAgICAgaW50IHNlcnZlclBvcnROdW1iZXIgPSBwb3J0c1swXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzJdKTsKIAotCQkJdHJ5IHsKLQkJCQlzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKLQkJCQlzZXJ2ZXIuc3RhcnQoKTsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoCi0JCQkJCQkiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIG5hdGl2ZSBjb25uZWN0ZWQgRGdyYW0gc29ja2V0IHRlc3QgIik7Ci0JCQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBEYXRhZ3JhbVNlcnZlcihzZXJ2ZXJQb3J0TnVtYmVyLCBsb2NhbEhvc3QpOworICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHVwIGRhdGFncmFtIHNlcnZlciBmb3IgbmF0aXZlIGNvbm5lY3RlZCBEZ3JhbSBzb2NrZXQgdGVzdCAiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKLQkJCWRzLmNvbm5lY3QobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIGludCBwb3J0ID0gZHMuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgICAgICBkcy5jb25uZWN0KGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlcik7CiAKLQkJCWJ5dGVbXSBzZW5kQnl0ZXMgPSB7ICdUJywgJ2UnLCAncycsICd0JywgMCB9OwotCQkJRGF0YWdyYW1QYWNrZXQgc2VuZCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzZW5kQnl0ZXMsCi0JCQkJCXNlbmRCeXRlcy5sZW5ndGgpOwotCQkJZHMuc2VuZChzZW5kKTsKLQkJCURhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7Ci0JCQlkcy5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCQlkcy5yZWNlaXZlKHJlY2VpdmUpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIldyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIiArIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCi0JCQkJCXJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBkYXRhIHJlY2VpdmVkIgotCQkJCQkrIG5ldyBTdHJpbmcocmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCi0JCQkJCSsgIjoiICsgbmV3IFN0cmluZyhzZW5kQnl0ZXMpLCBuZXcgU3RyaW5nKAotCQkJCQlyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKLQkJCQkJLmVxdWFscyhuZXcgU3RyaW5nKHNlbmRCeXRlcykpKTsKLQkJCWFzc2VydFRydWUoIldyb25nIHJlY2VpdmVyOiIgKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IgotCQkJCQkrIGxvY2FsSG9zdCwgcmVjZWl2ZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGxvY2FsSG9zdCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgKLQkJCQkJIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gc2VuZGluZyBkYXRhIG9uIGRncmFtIGNvbm5lY3RlZCBhdCBuYXRpdmUgbGV2ZWw6IgotCQkJCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfQorICAgICAgICAgICAgYnl0ZVtdIHNlbmRCeXRlcyA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAwIH07CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KHNlbmRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgc2VuZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBkcy5zZW5kKHNlbmQpOworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKKyAgICAgICAgICAgIGRzLnNldFNvVGltZW91dCgyMDAwKTsKKyAgICAgICAgICAgIGRzLnJlY2VpdmUocmVjZWl2ZSk7CisgICAgICAgICAgICBkcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3Jvbmcgc2l6ZSBkYXRhIHJlY2VpdmVkOiAiICsgcmVjZWl2ZS5nZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZS5nZXRMZW5ndGgoKSA9PSBzZW5kQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGRhdGEgcmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiIgKyBuZXcgU3RyaW5nKHNlbmRCeXRlcyksIG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgcmVjZWl2ZXI6IiArIHJlY2VpdmUuZ2V0QWRkcmVzcygpICsgIjoiCisgICAgICAgICAgICAgICAgICAgICsgbG9jYWxIb3N0LCByZWNlaXZlLmdldEFkZHJlc3MoKS5lcXVhbHMobG9jYWxIb3N0KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBzZW5kaW5nIGRhdGEgb24gZGdyYW0gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CiAKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIuc3RvcFNlcnZlcigpOwotCQl9CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLnN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQogCi0JCS8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGRpc2Nvbm5lY3QKLQkJdHJ5IHsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KCk7Ci0JCQlJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQlkcy5jb25uZWN0KGluZXRBZGRyZXNzLCBwb3J0TnVtYmVyKTsKLQkJCWRzLmRpc2Nvbm5lY3QoKTsKLQkJCWRzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IGF0IG5hdGl2ZSIKLQkJCQkJKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uKSk7Ci0JCX0KKyAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3ZSBjYW4gZGlzY29ubmVjdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgZHMuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgYXQgbmF0aXZlIgorICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSwgKGUgaW5zdGFuY2VvZiBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIHZhbGlkYXRlIHRoYXQgb25jZSBjb25uZWN0ZWQgd2UgY2Fubm90IHNlbmQgdG8gYW5vdGhlciBhZGRyZXNzCi0JCXRyeSB7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOwotCQkJSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7Ci0JCQlEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwXSwgMTAsCi0JCQkJCWluZXRBZGRyZXNzLCBwb3J0TnVtYmVyICsgMSk7Ci0JCQlkcy5zZW5kKHNlbmQpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWZhaWwoCi0JCQkJCSJObyBFeGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gc2VuZCB0byBhIGRpZmZlcmVudCBhZGRyZXNzIG9uIGEgY29ubmVjdGVkIHNvY2tldCAiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJXcm9uZyBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gc2VuZCB0byBhIGRpZmZlcmVudCBhZGRyZXNzIG9uIGEgY29ubmVjdGVkIHNvY2tldDogIgotCQkJCQkJCSsgZS50b1N0cmluZygpLAotCQkJCQkoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOwotCQl9CisgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgb25jZSBjb25uZWN0ZWQgd2UgY2Fubm90IHNlbmQgdG8gYW5vdGhlciBhZGRyZXNzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwXSwgMTAsCisgICAgICAgICAgICAgICAgICAgIGluZXRBZGRyZXNzLCBwb3J0TnVtYmVyICsgMSk7CisgICAgICAgICAgICBkcy5zZW5kKHNlbmQpOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICJObyBFeGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gc2VuZCB0byBhIGRpZmZlcmVudCBhZGRyZXNzIG9uIGEgY29ubmVjdGVkIHNvY2tldCAiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJXcm9uZyBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gc2VuZCB0byBhIGRpZmZlcmVudCBhZGRyZXNzIG9uIGEgY29ubmVjdGVkIHNvY2tldDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOworICAgICAgICB9CiAKLQkJLy8gdmFsaWRhdGUgdGhhdCB3ZSBjYW4gY29ubmVjdCwgdGhlbiBkaXNjb25uZWN0LCB0aGVuIGNvbm5lY3QgdGhlbgotCQkvLyBzZW5kL3JlY3YKLQkJc2VydmVyID0gbnVsbDsKLQkJcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgzKTsKLQkJc2VydmVyUG9ydE51bWJlciA9IHBvcnRzWzBdOwotCQl0cnkgewotCQkJSW5ldEFkZHJlc3MgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlEYXRhZ3JhbVNvY2tldCBkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7Ci0JCQlEYXRhZ3JhbVNvY2tldCBkczIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMl0pOworICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBjb25uZWN0LCB0aGVuIGRpc2Nvbm5lY3QsIHRoZW4gY29ubmVjdCB0aGVuCisgICAgICAgIC8vIHNlbmQvcmVjdgorICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOworICAgICAgICBzZXJ2ZXJQb3J0TnVtYmVyID0gcG9ydHNbMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IGRzMiA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1syXSk7CiAKLQkJCXRyeSB7Ci0JCQkJc2VydmVyID0gbmV3IERhdGFncmFtU2VydmVyKHNlcnZlclBvcnROdW1iZXIsIGxvY2FsSG9zdCk7Ci0JCQkJc2VydmVyLnN0YXJ0KCk7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKAotCQkJCQkJIkZhaWxlZCB0byBzZXQgdXAgZGF0YWdyYW0gc2VydmVyIGZvciBuYXRpdmUgY29ubmVjdGVkIERncmFtIHNvY2tldCB0ZXN0ICIpOwotCQkJfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIG5hdGl2ZSBjb25uZWN0ZWQgRGdyYW0gc29ja2V0IHRlc3QgIik7CisgICAgICAgICAgICB9CiAKLQkJCWludCBwb3J0ID0gZHMuZ2V0TG9jYWxQb3J0KCk7Ci0JCQlkcy5jb25uZWN0KGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlciArIDEpOwotCQkJZHMuZGlzY29ubmVjdCgpOwotCQkJZHMuY29ubmVjdChsb2NhbEhvc3QsIHNlcnZlclBvcnROdW1iZXIpOworICAgICAgICAgICAgaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyICsgMSk7CisgICAgICAgICAgICBkcy5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBkcy5jb25uZWN0KGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlcik7CiAKLQkJCWJ5dGVbXSBzZW5kQnl0ZXMgPSB7ICdUJywgJ2UnLCAncycsICd0JywgMCB9OwotCQkJRGF0YWdyYW1QYWNrZXQgc2VuZCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzZW5kQnl0ZXMsCi0JCQkJCXNlbmRCeXRlcy5sZW5ndGgpOwotCQkJZHMuc2VuZChzZW5kKTsKLQkJCURhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7Ci0JCQlkcy5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCQlkcy5yZWNlaXZlKHJlY2VpdmUpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdCAtIFdyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIgotCQkJCQkJCSsgcmVjZWl2ZS5nZXRMZW5ndGgoKSwKLQkJCQkJcmVjZWl2ZS5nZXRMZW5ndGgoKSA9PSBzZW5kQnl0ZXMubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoImNvbm5lY3QvZGlzY29ubmVjdC9jb25uZWN0IC0gV3JvbmcgZGF0YSByZWNlaXZlZCIKLQkJCQkJKyBuZXcgU3RyaW5nKHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQotCQkJCQkrICI6IiArIG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSwgbmV3IFN0cmluZygKLQkJCQkJcmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCi0JCQkJCS5lcXVhbHMobmV3IFN0cmluZyhzZW5kQnl0ZXMpKSk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdCAtIFdyb25nIHJlY2VpdmVyOiIKLQkJCQkJKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IiArIGxvY2FsSG9zdCwgcmVjZWl2ZQotCQkJCQkuZ2V0QWRkcmVzcygpLmVxdWFscyhsb2NhbEhvc3QpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoCi0JCQkJCSJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHNlbmRpbmcgZGF0YSBvbiBkZ3JhbSBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIGFmdGVyIGNvbm5lY3QvZGlzY29ubmVjdC9jb25uZWN0OiIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0KKyAgICAgICAgICAgIGJ5dGVbXSBzZW5kQnl0ZXMgPSB7ICdUJywgJ2UnLCAncycsICd0JywgMCB9OworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgc2VuZCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzZW5kQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHNlbmRCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgZHMuc2VuZChzZW5kKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7CisgICAgICAgICAgICBkcy5zZXRTb1RpbWVvdXQoMjAwMCk7CisgICAgICAgICAgICBkcy5yZWNlaXZlKHJlY2VpdmUpOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdCAtIFdyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVjZWl2ZS5nZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZS5nZXRMZW5ndGgoKSA9PSBzZW5kQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImNvbm5lY3QvZGlzY29ubmVjdC9jb25uZWN0IC0gV3JvbmcgZGF0YSByZWNlaXZlZCIKKyAgICAgICAgICAgICAgICAgICAgKyBuZXcgU3RyaW5nKHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICArICI6IiArIG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSwgbmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV3IFN0cmluZyhzZW5kQnl0ZXMpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdCAtIFdyb25nIHJlY2VpdmVyOiIKKyAgICAgICAgICAgICAgICAgICAgKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IiArIGxvY2FsSG9zdCwgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAgICAuZ2V0QWRkcmVzcygpLmVxdWFscyhsb2NhbEhvc3QpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHNlbmRpbmcgZGF0YSBvbiBkZ3JhbSBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIGFmdGVyIGNvbm5lY3QvZGlzY29ubmVjdC9jb25uZWN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KIAotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5zdG9wU2VydmVyKCk7Ci0JCX0KKyAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcFNlcnZlcigpOworICAgICAgICB9CiAKLQkJLy8gdmFsaWRhdGUgdGhhdCB3ZSBjYW4gY29ubmVjdC9kaXNjb25uZWN0IHRoZW4gc2VuZC9yZWN2IHRvIGFueSBhZGRyZXNzCi0JCXNlcnZlciA9IG51bGw7Ci0JCXBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7Ci0JCXNlcnZlclBvcnROdW1iZXIgPSBwb3J0c1swXTsKLQkJdHJ5IHsKLQkJCUluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOwotCQkJRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzJdKTsKKyAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3ZSBjYW4gY29ubmVjdC9kaXNjb25uZWN0IHRoZW4gc2VuZC9yZWN2IHRvIGFueSBhZGRyZXNzCisgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7CisgICAgICAgIHNlcnZlclBvcnROdW1iZXIgPSBwb3J0c1swXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzJdKTsKIAotCQkJdHJ5IHsKLQkJCQlzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKLQkJCQlzZXJ2ZXIuc3RhcnQoKTsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoCi0JCQkJCQkiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIG5hdGl2ZSBjb25uZWN0ZWQgRGdyYW0gc29ja2V0IHRlc3QgIik7Ci0JCQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBEYXRhZ3JhbVNlcnZlcihzZXJ2ZXJQb3J0TnVtYmVyLCBsb2NhbEhvc3QpOworICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHVwIGRhdGFncmFtIHNlcnZlciBmb3IgbmF0aXZlIGNvbm5lY3RlZCBEZ3JhbSBzb2NrZXQgdGVzdCAiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKLQkJCWRzLmNvbm5lY3QobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyICsgMSk7Ci0JCQlkcy5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBpbnQgcG9ydCA9IGRzLmdldExvY2FsUG9ydCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChsb2NhbEhvc3QsIHNlcnZlclBvcnROdW1iZXIgKyAxKTsKKyAgICAgICAgICAgIGRzLmRpc2Nvbm5lY3QoKTsKIAotCQkJYnl0ZVtdIHNlbmRCeXRlcyA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAwIH07Ci0JCQlEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KHNlbmRCeXRlcywKLQkJCQkJc2VuZEJ5dGVzLmxlbmd0aCwgbG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyKTsKLQkJCWRzLnNlbmQoc2VuZCk7Ci0JCQlEYXRhZ3JhbVBhY2tldCByZWNlaXZlID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzIwXSwgMjApOwotCQkJZHMuc2V0U29UaW1lb3V0KDIwMDApOwotCQkJZHMucmVjZWl2ZShyZWNlaXZlKTsKLQkJCWRzLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QgLSBXcm9uZyBzaXplIGRhdGEgcmVjZWl2ZWQ6ICIKLQkJCQkJKyByZWNlaXZlLmdldExlbmd0aCgpLAotCQkJCQlyZWNlaXZlLmdldExlbmd0aCgpID09IHNlbmRCeXRlcy5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgiY29ubmVjdC9kaXNjb25uZWN0IC0gV3JvbmcgZGF0YSByZWNlaXZlZCIKLQkJCQkJKyBuZXcgU3RyaW5nKHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQotCQkJCQkrICI6IiArIG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSwgbmV3IFN0cmluZygKLQkJCQkJcmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCi0JCQkJCS5lcXVhbHMobmV3IFN0cmluZyhzZW5kQnl0ZXMpKSk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QgLSBXcm9uZyByZWNlaXZlcjoiCi0JCQkJCSsgcmVjZWl2ZS5nZXRBZGRyZXNzKCkgKyAiOiIgKyBsb2NhbEhvc3QsIHJlY2VpdmUKLQkJCQkJLmdldEFkZHJlc3MoKS5lcXVhbHMobG9jYWxIb3N0KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKAotCQkJCQkiVW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBzZW5kaW5nIGRhdGEgb24gZGdyYW0gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbCBhZnRlciBjb25uZWN0L2Rpc2Nvbm5lY3Q6IgotCQkJCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfQorICAgICAgICAgICAgYnl0ZVtdIHNlbmRCeXRlcyA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAwIH07CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KHNlbmRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgc2VuZEJ5dGVzLmxlbmd0aCwgbG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIGRzLnNlbmQoc2VuZCk7CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCByZWNlaXZlID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzIwXSwgMjApOworICAgICAgICAgICAgZHMuc2V0U29UaW1lb3V0KDIwMDApOworICAgICAgICAgICAgZHMucmVjZWl2ZShyZWNlaXZlKTsKKyAgICAgICAgICAgIGRzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QgLSBXcm9uZyBzaXplIGRhdGEgcmVjZWl2ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyByZWNlaXZlLmdldExlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlLmdldExlbmd0aCgpID09IHNlbmRCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY29ubmVjdC9kaXNjb25uZWN0IC0gV3JvbmcgZGF0YSByZWNlaXZlZCIKKyAgICAgICAgICAgICAgICAgICAgKyBuZXcgU3RyaW5nKHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICArICI6IiArIG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSwgbmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV3IFN0cmluZyhzZW5kQnl0ZXMpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QgLSBXcm9uZyByZWNlaXZlcjoiCisgICAgICAgICAgICAgICAgICAgICsgcmVjZWl2ZS5nZXRBZGRyZXNzKCkgKyAiOiIgKyBsb2NhbEhvc3QsIHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKS5lcXVhbHMobG9jYWxIb3N0KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBzZW5kaW5nIGRhdGEgb24gZGdyYW0gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbCBhZnRlciBjb25uZWN0L2Rpc2Nvbm5lY3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQogCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc2VydmVyLnN0b3BTZXJ2ZXIoKTsKLQkJfQorICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZlci5zdG9wU2VydmVyKCk7CisgICAgICAgIH0KIAotCQkvLyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBjb25uZWN0IG9uIGFuIGFsbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQgYW5kIHRoZW4KLQkJLy8gc2VuZC9yZWN2Ci0JCXNlcnZlciA9IG51bGw7Ci0JCXBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7Ci0JCXNlcnZlclBvcnROdW1iZXIgPSBwb3J0c1swXTsKLQkJdHJ5IHsKLQkJCUluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOwotCQkJRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzJdKTsKKyAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3ZSBjYW4gY29ubmVjdCBvbiBhbiBhbGxyZWFkeSBjb25uZWN0ZWQgc29ja2V0IGFuZCB0aGVuCisgICAgICAgIC8vIHNlbmQvcmVjdgorICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOworICAgICAgICBzZXJ2ZXJQb3J0TnVtYmVyID0gcG9ydHNbMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IGRzMiA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1syXSk7CiAKLQkJCXRyeSB7Ci0JCQkJc2VydmVyID0gbmV3IERhdGFncmFtU2VydmVyKHNlcnZlclBvcnROdW1iZXIsIGxvY2FsSG9zdCk7Ci0JCQkJc2VydmVyLnN0YXJ0KCk7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKAotCQkJCQkJIkZhaWxlZCB0byBzZXQgdXAgZGF0YWdyYW0gc2VydmVyIGZvciBuYXRpdmUgY29ubmVjdGVkIERncmFtIHNvY2tldCB0ZXN0ICIpOwotCQkJfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIG5hdGl2ZSBjb25uZWN0ZWQgRGdyYW0gc29ja2V0IHRlc3QgIik7CisgICAgICAgICAgICB9CiAKLQkJCWludCBwb3J0ID0gZHMuZ2V0TG9jYWxQb3J0KCk7Ci0JCQlkcy5jb25uZWN0KGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlciArIDEpOwotCQkJZHMuY29ubmVjdChsb2NhbEhvc3QsIHNlcnZlclBvcnROdW1iZXIpOworICAgICAgICAgICAgaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyICsgMSk7CisgICAgICAgICAgICBkcy5jb25uZWN0KGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlcik7CiAKLQkJCWJ5dGVbXSBzZW5kQnl0ZXMgPSB7ICdUJywgJ2UnLCAncycsICd0JywgMCB9OwotCQkJRGF0YWdyYW1QYWNrZXQgc2VuZCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzZW5kQnl0ZXMsCi0JCQkJCXNlbmRCeXRlcy5sZW5ndGgpOwotCQkJZHMuc2VuZChzZW5kKTsKLQkJCURhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7Ci0JCQlkcy5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCQlkcy5yZWNlaXZlKHJlY2VpdmUpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoImNvbm5lY3QvY29ubmVjdCAtIFdyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIgotCQkJCQkrIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCi0JCQkJCXJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyBkYXRhIHJlY2VpdmVkIgotCQkJCQkrIG5ldyBTdHJpbmcocmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCi0JCQkJCSsgIjoiICsgbmV3IFN0cmluZyhzZW5kQnl0ZXMpLCBuZXcgU3RyaW5nKAotCQkJCQlyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKLQkJCQkJLmVxdWFscyhuZXcgU3RyaW5nKHNlbmRCeXRlcykpKTsKLQkJCWFzc2VydFRydWUoImNvbm5lY3QvY29ubmVjdCAtIFdyb25nIHJlY2VpdmVyOiIKLQkJCQkJKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IiArIGxvY2FsSG9zdCwgcmVjZWl2ZQotCQkJCQkuZ2V0QWRkcmVzcygpLmVxdWFscyhsb2NhbEhvc3QpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoCi0JCQkJCSJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHNlbmRpbmcgZGF0YSBvbiBkZ3JhbSBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIGFmdGVyIGNvbm5lY3QvY29ubmVjdDogIgotCQkJCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfQorICAgICAgICAgICAgYnl0ZVtdIHNlbmRCeXRlcyA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAwIH07CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KHNlbmRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgc2VuZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBkcy5zZW5kKHNlbmQpOworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKKyAgICAgICAgICAgIGRzLnNldFNvVGltZW91dCgyMDAwKTsKKyAgICAgICAgICAgIGRzLnJlY2VpdmUocmVjZWl2ZSk7CisgICAgICAgICAgICBkcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY29ubmVjdC9jb25uZWN0IC0gV3Jvbmcgc2l6ZSBkYXRhIHJlY2VpdmVkOiAiCisgICAgICAgICAgICAgICAgICAgICsgcmVjZWl2ZS5nZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZS5nZXRMZW5ndGgoKSA9PSBzZW5kQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImNvbm5lY3QvY29ubmVjdCAtIFdyb25nIGRhdGEgcmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiIgKyBuZXcgU3RyaW5nKHNlbmRCeXRlcyksIG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY29ubmVjdC9jb25uZWN0IC0gV3JvbmcgcmVjZWl2ZXI6IgorICAgICAgICAgICAgICAgICAgICArIHJlY2VpdmUuZ2V0QWRkcmVzcygpICsgIjoiICsgbG9jYWxIb3N0LCByZWNlaXZlCisgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkuZXF1YWxzKGxvY2FsSG9zdCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gc2VuZGluZyBkYXRhIG9uIGRncmFtIGNvbm5lY3RlZCBhdCBuYXRpdmUgbGV2ZWwgYWZ0ZXIgY29ubmVjdC9jb25uZWN0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CiAKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIuc3RvcFNlcnZlcigpOwotCQl9CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLnN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQogCi0JCS8vIHRlc3QgZm9yIHdoZW4gd2UgZmFpbCB0byBjb25uZWN0IGF0IHRoZSBuYXRpdmUgbGV2ZWwuIEV2ZW4gdGhvdWdoIHdlCi0JCS8vIGZhaWwgYXQgdGhlIG5hdGl2ZSBsZXZlbCB0aGVyZSBpcyBubyB3YXkgdG8gcmV0dXJuIGFuIGV4Y2VwdGlvbiBzbwotCQkvLyB0aGVyZSBzaG91bGQgYmUgbm8gZXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOwotCQkJYnl0ZVtdIGFkZHJlc3NCeXRlcyA9IHsgMCwgMCwgMCwgMCB9OwotCQkJSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoYWRkcmVzc0J5dGVzKTsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKAotCQkJCQkiVW5leGNwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgYXQgbmF0aXZlIGxldmVsIHdpdGggYmFkIGFkZHJlc3MgZm9yIHNpZ25hdHVyZSB3aXRoIG5vIGV4Y2VwdGlvbiB0byBiZSByZXR1cm5lZDogIgotCQkJCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfQorICAgICAgICAvLyB0ZXN0IGZvciB3aGVuIHdlIGZhaWwgdG8gY29ubmVjdCBhdCB0aGUgbmF0aXZlIGxldmVsLiBFdmVuIHRob3VnaCB3ZQorICAgICAgICAvLyBmYWlsIGF0IHRoZSBuYXRpdmUgbGV2ZWwgdGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiBhbiBleGNlcHRpb24gc28KKyAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIG5vIGV4Y2VwdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBhZGRyZXNzQnl0ZXMgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlcyk7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgIlVuZXhjcGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IGF0IG5hdGl2ZSBsZXZlbCB3aXRoIGJhZCBhZGRyZXNzIGZvciBzaWduYXR1cmUgd2l0aCBubyBleGNlcHRpb24gdG8gYmUgcmV0dXJuZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KIAotCQlpZiAoInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInJ1bi5pcHY2dGVzdHMiKSkpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlJ1bm5pbmcgdGVzdF9jb25uZWN0TGphdmFfbmV0X0luZXRBZGRyZXNzSShEYXRhZ3JhbVNvY2tldFRlc3QpIHdpdGggSVB2NiBhZGRyZXNzIik7Ci0JCQl0cnkgewotCQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KCk7Ci0JCQkJYnl0ZVtdIGFkZHJlc3NCeXRlcyA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkJCQkJCTAsIDAsIDAgfTsKLQkJCQlJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzCi0JCQkJCQkuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlcyk7Ci0JCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQkJZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoCi0JCQkJCQkiVW5leGNwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgYXQgbmF0aXZlIGxldmVsIHdpdGggYmFkIElQdjYgYWRkcmVzcyBmb3Igc2lnbmF0dXJlIHdpdGggbm8gZXhjZXB0aW9uIHRvIGJlIHJldHVybmVkOiAiCi0JCQkJCQkJCSsgZS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJydW4uaXB2NnRlc3RzIikpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJSdW5uaW5nIHRlc3RfY29ubmVjdExqYXZhX25ldF9JbmV0QWRkcmVzc0koRGF0YWdyYW1Tb2NrZXRUZXN0KSB3aXRoIElQdjYgYWRkcmVzcyIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBhZGRyZXNzQnl0ZXMgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwIH07CisgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJ5QWRkcmVzcyhhZGRyZXNzQnl0ZXMpOworICAgICAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgICAgIGRzLmNvbm5lY3QoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhjcGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IGF0IG5hdGl2ZSBsZXZlbCB3aXRoIGJhZCBJUHY2IGFkZHJlc3MgZm9yIHNpZ25hdHVyZSB3aXRoIG5vIGV4Y2VwdGlvbiB0byBiZSByZXR1cm5lZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZGlzY29ubmVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9kaXNjb25uZWN0KCkgewotCQl0cnkgewotCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQoKTsKLQkJCUluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCWRzLmNvbm5lY3QoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpOwotCQkJZHMuZGlzY29ubmVjdCgpOwotCQkJYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IEluZXRBZGRyZXNzIiwgZHMuZ2V0SW5ldEFkZHJlc3MoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBQb3J0IiwgLTEsIGRzLmdldFBvcnQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2Rpc2Nvbm5lY3QoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpc2Nvbm5lY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Rpc2Nvbm5lY3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7CisgICAgICAgICAgICBkcy5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgSW5ldEFkZHJlc3MiLCBkcy5nZXRJbmV0QWRkcmVzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IFBvcnQiLCAtMSwgZHMuZ2V0UG9ydCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCQlpZiAoInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInJ1bi5pcHY2dGVzdHMiKSkpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlJ1bm5pbmcgdGVzdF9kaXNjb25uZWN0KERhdGFncmFtU29ja2V0VGVzdCkgd2l0aCBJUHY2R2xvYmFsQWRkcmVzc0pjbDQ6ICIKLQkJCQkJCQkrIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQpOwotCQkJdHJ5IHsKLQkJCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOwotCQkJCUluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MKLQkJCQkJCS5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLklQdjZHbG9iYWxBZGRyZXNzSmNsNCk7Ci0JCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQkJZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7Ci0JCQkJZHMuZGlzY29ubmVjdCgpOwotCQkJCWFzc2VydE51bGwoIkluY29ycmVjdCBJbmV0QWRkcmVzcyIsIGRzLmdldEluZXRBZGRyZXNzKCkpOwotCQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IFBvcnQiLCAtMSwgZHMuZ2V0UG9ydCgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInJ1bi5pcHY2dGVzdHMiKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIlJ1bm5pbmcgdGVzdF9kaXNjb25uZWN0KERhdGFncmFtU29ja2V0VGVzdCkgd2l0aCBJUHY2R2xvYmFsQWRkcmVzc0pjbDQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLklQdjZHbG9iYWxBZGRyZXNzSmNsNCk7CisgICAgICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7CisgICAgICAgICAgICAgICAgZHMuY29ubmVjdChpbmV0QWRkcmVzcywgcG9ydE51bWJlcik7CisgICAgICAgICAgICAgICAgZHMuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCBJbmV0QWRkcmVzcyIsIGRzLmdldEluZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IFBvcnQiLCAtMSwgZHMuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRJbmV0QWRkcmVzcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRJbmV0QWRkcmVzcygpIHsKLQkJYXNzZXJ0VHJ1ZSgiVXNlZCB0byB0ZXN0IiwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRJbmV0QWRkcmVzcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJEdW1teSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluZXRBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbmV0QWRkcmVzcygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVXNlZCB0byB0ZXN0IiwgdHJ1ZSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2dldExvY2FsQWRkcmVzcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbEFkZHJlc3MoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5JbmV0QWRkcmVzcwotCQkvLyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldC5nZXRMb2NhbEFkZHJlc3MoKQotCQlJbmV0QWRkcmVzcyBsb2NhbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCWxvY2FsID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyLCBsb2NhbCk7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgYWRkcmVzcy4gR290OiIKLQkJCQkJKyBkcy5nZXRMb2NhbEFkZHJlc3MoKQotCQkJCQkrICIgd2FudGVkOiAiCi0JCQkJCSsgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpCi0JCQkJCQkJLmdldEhvc3ROYW1lKCkpLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoCi0JCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCkpLmVxdWFscygKLQkJCQkJZHMuZ2V0TG9jYWxBZGRyZXNzKCkpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0TG9jYWxBZGRyZXNzKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExvY2FsQWRkcmVzcygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkluZXRBZGRyZXNzCisgICAgICAgIC8vIGphdmEubmV0LkRhdGFncmFtU29ja2V0LmdldExvY2FsQWRkcmVzcygpCisgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgbG9jYWwgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIsIGxvY2FsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBhZGRyZXNzLiBHb3Q6IgorICAgICAgICAgICAgICAgICAgICArIGRzLmdldExvY2FsQWRkcmVzcygpCisgICAgICAgICAgICAgICAgICAgICsgIiB3YW50ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SG9zdE5hbWUoKSksIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICBkcy5nZXRMb2NhbEFkZHJlc3MoKSkpOwogCi0JCQkvLyBub3cgdmFsaWRhdGUgdGhldCBiZWhhdmlvdXIgd2hlbiB0aGUgYW55IGFkZHJlc3MgaXMgcmV0dXJuZWQKLQkJCVN0cmluZyBwcmVmZXJJUHY0U3RhY2tWYWx1ZSA9IFN5c3RlbQotCQkJCQkuZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjRTdGFjayIpOwotCQkJU3RyaW5nIHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZSA9IFN5c3RlbQotCQkJCQkuZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjZBZGRyZXNzZXMiKTsKLQkJCURhdGFncmFtU29ja2V0IHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoMCk7Ci0JCQlpZiAoKChwcmVmZXJJUHY0U3RhY2tWYWx1ZSA9PSBudWxsKSB8fCBwcmVmZXJJUHY0U3RhY2tWYWx1ZQotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKLQkJCQkJJiYgKHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZSAhPSBudWxsKQotCQkJCQkmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlLmVxdWFscygidHJ1ZSIpKSkgewotCQkJCWFzc2VydFRydWUoCi0JCQkJCQkiQU5ZIGFkZHJlc3Mgbm90IHJldHVybmVkIGNvcnJlY3RseSAoZ2V0TG9jYWxBZGRyZXNzKSB3aXRoIHByZWZlcklQdjZBZGRyZXNzZXM9dHJ1ZSwgcHJlZmVySVB2NFN0YWNrPWZhbHNlICIKLQkJCQkJCQkJKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLCBzCi0JCQkJCQkJCS5nZXRMb2NhbEFkZHJlc3MoKSBpbnN0YW5jZW9mIEluZXQ2QWRkcmVzcyk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUoCi0JCQkJCQkiQU5ZIGFkZHJlc3Mgbm90IHJldHVybmVkIGNvcnJlY3RseSAoZ2V0TG9jYWxBZGRyZXNzKSB3aXRoIHByZWZlcklQdjZBZGRyZXNzZXM9dHJ1ZSwgcHJlZmVySVB2NFN0YWNrPXRydWUgIgotCQkJCQkJCQkrIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCksIHMKLQkJCQkJCQkJLmdldExvY2FsQWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKTsKLQkJCX0KLQkJCXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoCi0JCQkJCSJFeGNlcHRpb24gZHVyaW5nIGdldExvY2FsQWRkcmVzczogIiArIGxvY2FsICsgIiAtICIgKyBlKTsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGV0IGJlaGF2aW91ciB3aGVuIHRoZSBhbnkgYWRkcmVzcyBpcyByZXR1cm5lZAorICAgICAgICAgICAgU3RyaW5nIHByZWZlcklQdjRTdGFja1ZhbHVlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NFN0YWNrIik7CisgICAgICAgICAgICBTdHJpbmcgcHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NkFkZHJlc3NlcyIpOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgcyA9IG5ldyBEYXRhZ3JhbVNvY2tldCgwKTsKKyAgICAgICAgICAgIGlmICgoKHByZWZlcklQdjRTdGFja1ZhbHVlID09IG51bGwpIHx8IHByZWZlcklQdjRTdGFja1ZhbHVlCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKQorICAgICAgICAgICAgICAgICAgICAmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIChwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUuZXF1YWxzKCJ0cnVlIikpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IChnZXRMb2NhbEFkZHJlc3MpIHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9ZmFsc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCksIHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsQWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IChnZXRMb2NhbEFkZHJlc3MpIHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9dHJ1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwgcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxBZGRyZXNzKCkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0TG9jYWxBZGRyZXNzOiAiICsgbG9jYWwgKyAiIC0gIiArIGUpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2dldExvY2FsUG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbFBvcnQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQuZ2V0TG9jYWxQb3J0KCkKLQkJdHJ5IHsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgcG9ydCIsCi0JCQkJCWRzLmdldExvY2FsUG9ydCgpID09IHBvcnROdW1iZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRMb2NhbEFkZHJlc3MgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRMb2NhbFBvcnQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsUG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxQb3J0KCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubmV0LkRhdGFncmFtU29ja2V0LmdldExvY2FsUG9ydCgpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IHBvcnQiLAorICAgICAgICAgICAgICAgICAgICBkcy5nZXRMb2NhbFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0TG9jYWxBZGRyZXNzIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRQb3J0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFBvcnQoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCURhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKLQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgLTEgZm9yIHJlbW90ZSBwb3J0IGFzIG5vdCBjb25uZWN0ZWQiLAotCQkJCQktMSwgdGhlU29ja2V0LmdldFBvcnQoKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2dldFBvcnQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBvcnQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgLTEgZm9yIHJlbW90ZSBwb3J0IGFzIG5vdCBjb25uZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAtMSwgdGhlU29ja2V0LmdldFBvcnQoKSk7CiAKLQkJCS8vIG5vdyBjb25uZWN0IHRoZSBzb2NrZXQgYW5kIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSByaWdodCBwb3J0Ci0JCQl0aGVTb2NrZXQuY29ubmVjdChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcik7Ci0JCQlhc3NlcnRUcnVlKCJnZXRQb3J0IHJldHVybmVkIHdyb25nIHZhbHVlOiIgKyB0aGVTb2NrZXQuZ2V0UG9ydCgpCi0JCQkJCSsgIjpFeHBlY3RlZDoiICsgcG9ydE51bWJlciwKLQkJCQkJdGhlU29ja2V0LmdldFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyBnZXRQb3J0IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gbm93IGNvbm5lY3QgdGhlIHNvY2tldCBhbmQgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0IHBvcnQKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldFBvcnQgcmV0dXJuZWQgd3JvbmcgdmFsdWU6IiArIHRoZVNvY2tldC5nZXRQb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOkV4cGVjdGVkOiIgKyBwb3J0TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuZ2V0UG9ydCgpID09IHBvcnROdW1iZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gZHVyaW5nIGdldFBvcnQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOwotCQkJZHMuc2V0UmVjZWl2ZUJ1ZmZlclNpemUoMTMwKTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBidWZmZXIgc2l6ZSIsCi0JCQkJCWRzLmdldFJlY2VpdmVCdWZmZXJTaXplKCkgPj0gMTMwKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkNWQlVGKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19SQ1ZCVUYpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlY2VpdmVCdWZmZXJTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZWNlaXZlQnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7CisgICAgICAgICAgICBkcy5zZXRSZWNlaXZlQnVmZmVyU2l6ZSgxMzApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgZHMuZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSA+PSAxMzApOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19SQ1ZCVUYpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1JDVkJVRik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0U2VuZEJ1ZmZlclNpemUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VuZEJ1ZmZlclNpemUoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOwotCQkJZHMuc2V0U2VuZEJ1ZmZlclNpemUoMTM0KTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBidWZmZXIgc2l6ZSIsIGRzLmdldFNlbmRCdWZmZXJTaXplKCkgPj0gMTM0KTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fU05EQlVGKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19TTkRCVUYpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRTZW5kQnVmZmVyU2l6ZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlbmRCdWZmZXJTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZW5kQnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7CisgICAgICAgICAgICBkcy5zZXRTZW5kQnVmZmVyU2l6ZSgxMzQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ1ZmZlciBzaXplIiwgZHMuZ2V0U2VuZEJ1ZmZlclNpemUoKSA+PSAxMzQpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19TTkRCVUYpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1NOREJVRik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0U29UaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFNvVGltZW91dCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldC5nZXRTb1RpbWVvdXQoKQotCQl0cnkgewotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKLQkJCWRzLnNldFNvVGltZW91dCgxMDApOwotCQkJYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgdGltZW91dCIsIDEwMCwgZHMuZ2V0U29UaW1lb3V0KCkpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19USU1FT1VUKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19USU1FT1VUKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0U29UaW1lb3V0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U29UaW1lb3V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTb1RpbWVvdXQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQuZ2V0U29UaW1lb3V0KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7CisgICAgICAgICAgICBkcy5zZXRTb1RpbWVvdXQoMTAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IHRpbWVvdXQiLCAxMDAsIGRzLmdldFNvVGltZW91dCgpKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fVElNRU9VVCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fVElNRU9VVCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjcmVjZWl2ZShqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlY2VpdmVMamF2YV9uZXRfRGF0YWdyYW1QYWNrZXQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEubmV0LkRhdGFncmFtU29ja2V0LnJlY2VpdmUoamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3JlY2VpdmUoamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0RhdGFncmFtUGFja2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlY2VpdmVMamF2YV9uZXRfRGF0YWdyYW1QYWNrZXQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEubmV0LkRhdGFncmFtU29ja2V0LnJlY2VpdmUoamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCiAKLQkJcmVjZWl2ZV9vdmVyc2l6ZV9qYXZhX25ldF9EYXRhZ3JhbVBhY2tldCgpOwotCQlmaW5hbCBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDIpOwotCQlmaW5hbCBpbnQgcG9ydE51bWJlciA9IHBvcnRzWzBdOworICAgICAgICByZWNlaXZlX292ZXJzaXplX2phdmFfbmV0X0RhdGFncmFtUGFja2V0KCk7CisgICAgICAgIGZpbmFsIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgICAgIGZpbmFsIGludCBwb3J0TnVtYmVyID0gcG9ydHNbMF07CiAKLQkJY2xhc3MgVGVzdERHUmN2IGltcGxlbWVudHMgUnVubmFibGUgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJRGF0YWdyYW1Tb2NrZXQgc2RzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKLQkJCQkJRGF0YWdyYW1QYWNrZXQgcmRwID0gbmV3IERhdGFncmFtUGFja2V0KCJUZXN0IFN0cmluZyIKLQkJCQkJCQkuZ2V0Qnl0ZXMoKSwgMTEsIGxvY2FsSG9zdCwgcG9ydE51bWJlcik7Ci0JCQkJCXNkcy5zZW5kKHJkcCk7Ci0JCQkJCXNkcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiaG9zdCAiICsgbG9jYWxIb3N0ICsgIiBwb3J0ICIKLQkJCQkJCQkrIHBvcnROdW1iZXIgKyAiIGZhaWxlZCB0byBzZW5kIGRhdGE6ICIgKyBlKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgY2xhc3MgVGVzdERHUmN2IGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgc2RzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcmRwID0gbmV3IERhdGFncmFtUGFja2V0KCJUZXN0IFN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSwgMTEsIGxvY2FsSG9zdCwgcG9ydE51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHNkcy5zZW5kKHJkcCk7CisgICAgICAgICAgICAgICAgICAgIHNkcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaG9zdCAiICsgbG9jYWxIb3N0ICsgIiBwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBvcnROdW1iZXIgKyAiIGZhaWxlZCB0byBzZW5kIGRhdGE6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJbmV3IFRocmVhZChuZXcgVGVzdERHUmN2KCksICJER1NlbmRlciIpLnN0YXJ0KCk7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKLQkJCWRzLnNldFNvVGltZW91dCg2MDAwKTsKLQkJCWJ5dGUgcmJ1ZltdID0gbmV3IGJ5dGVbMTAwMF07Ci0JCQlEYXRhZ3JhbVBhY2tldCByZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQocmJ1ZiwgcmJ1Zi5sZW5ndGgpOwotCQkJOwotCQkJZHMucmVjZWl2ZShyZHApOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIlNlbmQvUmVjZWl2ZSBmYWlsZWQgdG8gcmV0dXJuIGNvcnJlY3QgZGF0YTogIgotCQkJCQkrIG5ldyBTdHJpbmcocmJ1ZiwgMCwgMTEpLCBuZXcgU3RyaW5nKHJidWYsIDAsIDExKQotCQkJCQkuZXF1YWxzKCJUZXN0IFN0cmluZyIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyBzZW5kIHRlc3Q6ICIgKyBlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlmYWlsKCJwb3J0ICIgKyBwb3J0TnVtYmVyICsgIiBFeGNlcHRpb24gZHVyaW5nIHNlbmQgdGVzdDogIgotCQkJCQkrIGUpOwotCQl9IGZpbmFsbHkgewotCQkJZHMuY2xvc2UoKTsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgVGVzdERHUmN2KCksICJER1NlbmRlciIpLnN0YXJ0KCk7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIGRzLnNldFNvVGltZW91dCg2MDAwKTsKKyAgICAgICAgICAgIGJ5dGUgcmJ1ZltdID0gbmV3IGJ5dGVbMTAwMF07CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCByZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQocmJ1ZiwgcmJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgOworICAgICAgICAgICAgZHMucmVjZWl2ZShyZHApOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNlbmQvUmVjZWl2ZSBmYWlsZWQgdG8gcmV0dXJuIGNvcnJlY3QgZGF0YTogIgorICAgICAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcocmJ1ZiwgMCwgMTEpLCBuZXcgU3RyaW5nKHJidWYsIDAsIDExKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKCJUZXN0IFN0cmluZyIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyBzZW5kIHRlc3Q6ICIgKyBlKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCJwb3J0ICIgKyBwb3J0TnVtYmVyICsgIiBFeGNlcHRpb24gZHVyaW5nIHNlbmQgdGVzdDogIgorICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlpbnRlcnJ1cHRlZCA9IGZhbHNlOwotCQkJZmluYWwgRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKLQkJCWRzLnNldFNvVGltZW91dCgxMjAwMCk7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlkcy5yZWNlaXZlKG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsxXSwgMSkpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWludGVycnVwdGVkID0gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlLCAiRGF0YWdyYW1Tb2NrZXQucmVjZWl2ZTEiKTsKLQkJCXRocmVhZC5zdGFydCgpOwotCQkJdHJ5IHsKLQkJCQlkbyB7Ci0JCQkJCVRocmVhZC5zbGVlcCg1MDApOwotCQkJCX0gd2hpbGUgKCF0aHJlYWQuaXNBbGl2ZSgpKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWRzLmNsb3NlKCk7Ci0JCQlpbnQgYyA9IDA7Ci0JCQlkbyB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlpZiAoaW50ZXJydXB0ZWQpIHsKLQkJCQkJZmFpbCgicmVjZWl2ZWQgaW50ZXJydXB0Iik7Ci0JCQkJfQotCQkJCWlmICgrK2MgPiA0KSB7Ci0JCQkJCWZhaWwoInJlYWQgY2FsbCBkaWQgbm90IGV4aXQiKTsKLQkJCQl9Ci0JCQl9IHdoaWxlICh0aHJlYWQuaXNBbGl2ZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludGVycnVwdGVkID0gZmFsc2U7CisgICAgICAgICAgICBmaW5hbCBEYXRhZ3JhbVNvY2tldCBkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgZHMuc2V0U29UaW1lb3V0KDEyMDAwKTsKKyAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzLnJlY2VpdmUobmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzFdLCAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQocnVubmFibGUsICJEYXRhZ3JhbVNvY2tldC5yZWNlaXZlMSIpOworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoIXRocmVhZC5pc0FsaXZlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGludCBjID0gMDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRlZCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJyZWNlaXZlZCBpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCsrYyA+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgicmVhZCBjYWxsIGRpZCBub3QgZXhpdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRocmVhZC5pc0FsaXZlKCkpOwogCi0JCQlpbnRlcnJ1cHRlZCA9IGZhbHNlOwotCQkJaW50W10gcG9ydHMxID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7Ci0JCQlmaW5hbCBpbnQgcG9ydE51bSA9IHBvcnRzWzBdOwotCQkJZmluYWwgRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKLQkJCWRzMi5zZXRTb1RpbWVvdXQoMTIwMDApOwotCQkJUnVubmFibGUgcnVubmFibGUyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRzMi5yZWNlaXZlKG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsxXSwgMSwKLQkJCQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW0pKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpbnRlcnJ1cHRlZCA9IHRydWU7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlUaHJlYWQgdGhyZWFkMiA9IG5ldyBUaHJlYWQocnVubmFibGUyLCAiRGF0YWdyYW1Tb2NrZXQucmVjZWl2ZTIiKTsKLQkJCXRocmVhZDIuc3RhcnQoKTsKLQkJCXRyeSB7Ci0JCQkJZG8gewotCQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCQl9IHdoaWxlICghdGhyZWFkMi5pc0FsaXZlKCkpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJZHMyLmNsb3NlKCk7Ci0JCQlpbnQgYzIgPSAwOwotCQkJZG8gewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCg1MDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJaWYgKGludGVycnVwdGVkKSB7Ci0JCQkJCWZhaWwoInJlY2VpdmUyIHdhcyBpbnRlcnJ1cHRlZCIpOwotCQkJCX0KLQkJCQlpZiAoKytjMiA+IDQpIHsKLQkJCQkJZmFpbCgicmVhZDIgY2FsbCBkaWQgbm90IGV4aXQiKTsKLQkJCQl9Ci0JCQl9IHdoaWxlICh0aHJlYWQyLmlzQWxpdmUoKSk7CisgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IGZhbHNlOworICAgICAgICAgICAgaW50W10gcG9ydHMxID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgICAgICAgICBmaW5hbCBpbnQgcG9ydE51bSA9IHBvcnRzWzBdOworICAgICAgICAgICAgZmluYWwgRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIGRzMi5zZXRTb1RpbWVvdXQoMTIwMDApOworICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUyID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzMi5yZWNlaXZlKG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsxXSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW0pKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBUaHJlYWQgdGhyZWFkMiA9IG5ldyBUaHJlYWQocnVubmFibGUyLCAiRGF0YWdyYW1Tb2NrZXQucmVjZWl2ZTIiKTsKKyAgICAgICAgICAgIHRocmVhZDIuc3RhcnQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICghdGhyZWFkMi5pc0FsaXZlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHMyLmNsb3NlKCk7CisgICAgICAgICAgICBpbnQgYzIgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoInJlY2VpdmUyIHdhcyBpbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKytjMiA+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgicmVhZDIgY2FsbCBkaWQgbm90IGV4aXQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0aHJlYWQyLmlzQWxpdmUoKSk7CiAKLQkJCWludGVycnVwdGVkID0gZmFsc2U7Ci0JCQlEYXRhZ3JhbVNvY2tldCBkczMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKLQkJCWRzMy5zZXRTb1RpbWVvdXQoNTAwKTsKLQkJCURhdGUgc3RhcnQgPSBuZXcgRGF0ZSgpOwotCQkJdHJ5IHsKLQkJCQlkczMucmVjZWl2ZShuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMV0sIDEpKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgewotCQkJCWludGVycnVwdGVkID0gdHJ1ZTsKLQkJCX0KLQkJCWRzMy5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgicmVjZWl2ZSBub3QgaW50ZXJydXB0ZWQiLCBpbnRlcnJ1cHRlZCk7Ci0JCQlpbnQgZGVsYXkgPSAoaW50KSAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydC5nZXRUaW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZSgidGltZW91dCB0b28gc29vbjogIiArIGRlbGF5LCBkZWxheSA+PSA0OTApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAgICAgICAgIGludGVycnVwdGVkID0gZmFsc2U7CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCBkczMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgICAgICAgIGRzMy5zZXRTb1RpbWVvdXQoNTAwKTsKKyAgICAgICAgICAgIERhdGUgc3RhcnQgPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkczMucmVjZWl2ZShuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMV0sIDEpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzMy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgicmVjZWl2ZSBub3QgaW50ZXJydXB0ZWQiLCBpbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICBpbnQgZGVsYXkgPSAoaW50KSAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydC5nZXRUaW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGltZW91dCB0b28gc29vbjogIiArIGRlbGF5LCBkZWxheSA+PSA0OTApOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNzZW5kKGphdmEubmV0LkRhdGFncmFtUGFja2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2VuZExqYXZhX25ldF9EYXRhZ3JhbVBhY2tldCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldC5zZW5kKGphdmEubmV0LkRhdGFncmFtUGFja2V0KQotCQlpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDIpOwotCQlmaW5hbCBpbnQgcG9ydE51bWJlciA9IHBvcnRzWzBdOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNzZW5kKGphdmEubmV0LkRhdGFncmFtUGFja2V0KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtEYXRhZ3JhbVBhY2tldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZW5kTGphdmFfbmV0X0RhdGFncmFtUGFja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEubmV0LkRhdGFncmFtU29ja2V0LnNlbmQoamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCisgICAgICAgIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgICAgIGZpbmFsIGludCBwb3J0TnVtYmVyID0gcG9ydHNbMF07CiAKLQkJY2xhc3MgVGVzdERHU2VuZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCVRocmVhZCBwVGhyZWFkOworICAgICAgICBjbGFzcyBUZXN0REdTZW5kIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICAgICAgVGhyZWFkIHBUaHJlYWQ7CiAKLQkJCXB1YmxpYyBUZXN0REdTZW5kKFRocmVhZCB0KSB7Ci0JCQkJcFRocmVhZCA9IHQ7Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgVGVzdERHU2VuZChUaHJlYWQgdCkgeworICAgICAgICAgICAgICAgIHBUaHJlYWQgPSB0OworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZVtdIHJidWYgPSBuZXcgYnl0ZVsxMDAwXTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gcmJ1ZiA9IG5ldyBieXRlWzEwMDBdOwogCi0JCQkJCXNkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKLQkJCQkJRGF0YWdyYW1QYWNrZXQgc2RwID0gbmV3IERhdGFncmFtUGFja2V0KHJidWYsIHJidWYubGVuZ3RoKTsKLQkJCQkJc2RzLnNldFNvVGltZW91dCg2MDAwKTsKLQkJCQkJc2RzLnJlY2VpdmUoc2RwKTsKLQkJCQkJcmV0dmFsID0gbmV3IFN0cmluZyhyYnVmLCAwLCB0ZXN0U3RyaW5nLmxlbmd0aCgpKTsKLQkJCQkJcFRocmVhZC5pbnRlcnJ1cHQoKTsKLQkJCQl9IGNhdGNoIChqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlY3Ygb3BlcmF0aW9uIHRpbWVkIG91dCIpOwotCQkJCQlwVGhyZWFkLmludGVycnVwdCgpOwotCQkJCQlkcy5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJGYWlsZWQgdG8gZXN0YWJsaXNoIERncmFtIHNlcnZlcjogIiArIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnkgewotCQkJbmV3IFRocmVhZChuZXcgVGVzdERHU2VuZChUaHJlYWQuY3VycmVudFRocmVhZCgpKSwgIkRHU2VydmVyIikKLQkJCQkJLnN0YXJ0KCk7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7Ci0JCQlkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIHRlc3RTdHJpbmcubGVuZ3RoKCksCi0JCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKTsKLQkJCS8vIFdhaXQgdG8gYWxsb3cgc2VuZCB0byBvY2N1cgotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCQlkcy5zZW5kKGRwKTsKLQkJCQlUaHJlYWQuc2xlZXAoNTAwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZHMuY2xvc2UoKTsKLQkJCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSBzZW50OiAiICsgcmV0dmFsLCByZXR2YWwKLQkJCQkJCS5lcXVhbHModGVzdFN0cmluZykpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBzZW5kIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJZHMuY2xvc2UoKTsKLQkJfQotCQkvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTExOAotCQljbGFzcyB0ZXN0RGF0YWdyYW1Tb2NrZXQgZXh0ZW5kcyBEYXRhZ3JhbVNvY2tldCB7Ci0JCSAgICBwdWJsaWMgdGVzdERhdGFncmFtU29ja2V0KERhdGFncmFtU29ja2V0SW1wbCBpbXBsKXsKLQkJICAgICAgIHN1cGVyKGltcGwpOwotCQkgICAgfQotCQl9Ci0JCWNsYXNzIHRlc3REYXRhZ3JhbVNvY2tldEltcGwgZXh0ZW5kcyBEYXRhZ3JhbVNvY2tldEltcGwgeyAKLQkJICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24ge30gCi0JCSAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kKGludCBhcmcwLCBJbmV0QWRkcmVzcyBhcmcxKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHt9IAotCQkgICAgcHJvdGVjdGVkIHZvaWQgc2VuZChEYXRhZ3JhbVBhY2tldCBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24ge30gCi0JCSAgICBwcm90ZWN0ZWQgaW50IHBlZWsoSW5ldEFkZHJlc3MgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCi0JCSAgICAgICAgcmV0dXJuIDA7IAotCQkgICAgfSAKLQkJICAgIHByb3RlY3RlZCBpbnQgcGVla0RhdGEoRGF0YWdyYW1QYWNrZXQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCi0JCSAgICAgICAgcmV0dXJuIDA7IAotCQkgICAgfSAKLQkJICAgIHByb3RlY3RlZCB2b2lkIHJlY2VpdmUoRGF0YWdyYW1QYWNrZXQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAotCQkgICAgcHJvdGVjdGVkIHZvaWQgc2V0VFRMKGJ5dGUgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAotCQkgICAgcHJvdGVjdGVkIGJ5dGUgZ2V0VFRMKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCi0JCSAgICAgICAgcmV0dXJuIDA7IAotCQkgICAgfSAKLQkJICAgIHByb3RlY3RlZCB2b2lkIHNldFRpbWVUb0xpdmUoaW50IGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7fSAKLQkJICAgIHByb3RlY3RlZCBpbnQgZ2V0VGltZVRvTGl2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IAotCQkgICAgICAgIHJldHVybiAwOyAKLQkJICAgIH0gCi0JCSAgICBwcm90ZWN0ZWQgdm9pZCBqb2luKEluZXRBZGRyZXNzIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7fSAKLQkJICAgIHByb3RlY3RlZCB2b2lkIGxlYXZlKEluZXRBZGRyZXNzIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7fSAKLQkJICAgIHByb3RlY3RlZCB2b2lkIGpvaW5Hcm91cChTb2NrZXRBZGRyZXNzIGFyZzAsIE5ldHdvcmtJbnRlcmZhY2UgYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAotCQkgICAgcHJvdGVjdGVkIHZvaWQgbGVhdmVHcm91cChTb2NrZXRBZGRyZXNzIGFyZzAsIE5ldHdvcmtJbnRlcmZhY2UgYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAotCQkgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7fSAKLQkJICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbihpbnQgYXJnMCwgT2JqZWN0IGFyZzEpIHRocm93cyBTb2NrZXRFeGNlcHRpb24ge30gCi0JCSAgICBwdWJsaWMgT2JqZWN0IGdldE9wdGlvbihpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7IAotCQkgICAgICAgIHJldHVybiBudWxsOyAKLQkJICAgIH0gCi0JCX0gCisgICAgICAgICAgICAgICAgICAgIHNkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgc2RwID0gbmV3IERhdGFncmFtUGFja2V0KHJidWYsIHJidWYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgc2RzLnNldFNvVGltZW91dCg2MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgc2RzLnJlY2VpdmUoc2RwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gbmV3IFN0cmluZyhyYnVmLCAwLCB0ZXN0U3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcFRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY3Ygb3BlcmF0aW9uIHRpbWVkIG91dCIpOworICAgICAgICAgICAgICAgICAgICBwVGhyZWFkLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICBkcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJGYWlsZWQgdG8gZXN0YWJsaXNoIERncmFtIHNlcnZlcjogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgVGVzdERHU2VuZChUaHJlYWQuY3VycmVudFRocmVhZCgpKSwgIkRHU2VydmVyIikKKyAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCk7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7CisgICAgICAgICAgICBkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIHRlc3RTdHJpbmcubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIC8vIFdhaXQgdG8gYWxsb3cgc2VuZCB0byBvY2N1cgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgICAgICBkcy5zZW5kKGRwKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGF0YSBzZW50OiAiICsgcmV0dmFsLCByZXR2YWwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModGVzdFN0cmluZykpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBzZW5kIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTExOAorICAgICAgICBjbGFzcyB0ZXN0RGF0YWdyYW1Tb2NrZXQgZXh0ZW5kcyBEYXRhZ3JhbVNvY2tldCB7CisgICAgICAgICAgICBwdWJsaWMgdGVzdERhdGFncmFtU29ja2V0KERhdGFncmFtU29ja2V0SW1wbCBpbXBsKXsKKyAgICAgICAgICAgICAgIHN1cGVyKGltcGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsYXNzIHRlc3REYXRhZ3JhbVNvY2tldEltcGwgZXh0ZW5kcyBEYXRhZ3JhbVNvY2tldEltcGwgeyAKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24ge30gCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kKGludCBhcmcwLCBJbmV0QWRkcmVzcyBhcmcxKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHt9IAorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZChEYXRhZ3JhbVBhY2tldCBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24ge30gCisgICAgICAgICAgICBwcm90ZWN0ZWQgaW50IHBlZWsoSW5ldEFkZHJlc3MgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IAorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIHByb3RlY3RlZCBpbnQgcGVla0RhdGEoRGF0YWdyYW1QYWNrZXQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IAorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJlY2VpdmUoRGF0YWdyYW1QYWNrZXQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VFRMKGJ5dGUgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAorICAgICAgICAgICAgcHJvdGVjdGVkIGJ5dGUgZ2V0VFRMKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IAorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFRpbWVUb0xpdmUoaW50IGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7fSAKKyAgICAgICAgICAgIHByb3RlY3RlZCBpbnQgZ2V0VGltZVRvTGl2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IAorICAgICAgICAgICAgICAgIHJldHVybiAwOyAKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBqb2luKEluZXRBZGRyZXNzIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7fSAKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGxlYXZlKEluZXRBZGRyZXNzIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7fSAKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGpvaW5Hcm91cChTb2NrZXRBZGRyZXNzIGFyZzAsIE5ldHdvcmtJbnRlcmZhY2UgYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgbGVhdmVHcm91cChTb2NrZXRBZGRyZXNzIGFyZzAsIE5ldHdvcmtJbnRlcmZhY2UgYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7fSAKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbihpbnQgYXJnMCwgT2JqZWN0IGFyZzEpIHRocm93cyBTb2NrZXRFeGNlcHRpb24ge30gCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE9wdGlvbihpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7IAorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0gCiAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gSW5ldFNvY2tldEFkZHJlc3MuY3JlYXRlVW5yZXNvbHZlZCgibG9jYWxob3N0IiwgMCk7IAogICAgICAgICAvL25vIGV4Y2VwdGlvbiBleHBlY3RlZCBmb3IgbmV4dCBsaW5lCiAgICAgICAgIG5ldyB0ZXN0RGF0YWdyYW1Tb2NrZXQobmV3IHRlc3REYXRhZ3JhbVNvY2tldEltcGwoKSkuc2VuZChuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjcyXSwgMywgc2EpKTsgCkBAIC05NzcsMTAzMSArMTExOCwxMjAyIEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBkLmNsb3NlKCk7CiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFNlbmRCdWZmZXJTaXplKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldFNlbmRCdWZmZXJTaXplSSgpIHsKLQkJdHJ5IHsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7Ci0JCQlkcy5zZXRTZW5kQnVmZmVyU2l6ZSgxMzQpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ1ZmZlciBzaXplIiwgZHMuZ2V0U2VuZEJ1ZmZlclNpemUoKSA+PSAxMzQpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19TTkRCVUYpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1NOREJVRik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFNlbmRCdWZmZXJTaXplKGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNlbmRCdWZmZXJTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTZW5kQnVmZmVyU2l6ZUkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOworICAgICAgICAgICAgZHMuc2V0U2VuZEJ1ZmZlclNpemUoMTM0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBidWZmZXIgc2l6ZSIsIGRzLmdldFNlbmRCdWZmZXJTaXplKCkgPj0gMTM0KTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fU05EQlVGKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19TTkRCVUYpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFJlY2VpdmVCdWZmZXJTaXplKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldFJlY2VpdmVCdWZmZXJTaXplSSgpIHsKLQkJdHJ5IHsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQocG9ydE51bWJlcik7Ci0JCQlkcy5zZXRSZWNlaXZlQnVmZmVyU2l6ZSgxMzApOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ1ZmZlciBzaXplIiwKLQkJCQkJZHMuZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSA+PSAxMzApOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19SQ1ZCVUYpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1JDVkJVRik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFJlY2VpdmVCdWZmZXJTaXplKGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFJlY2VpdmVCdWZmZXJTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWNlaXZlQnVmZmVyU2l6ZUkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOworICAgICAgICAgICAgZHMuc2V0UmVjZWl2ZUJ1ZmZlclNpemUoMTMwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgIGRzLmdldFJlY2VpdmVCdWZmZXJTaXplKCkgPj0gMTMwKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkNWQlVGKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19SQ1ZCVUYpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFNvVGltZW91dChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRTb1RpbWVvdXRJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldC5zZXRTb1RpbWVvdXQoaW50KQotCQl0cnkgewotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKLQkJCWRzLnNldFNvVGltZW91dCgxMDApOwotCQkJYXNzZXJ0VHJ1ZSgiU2V0IGluY29ycmVjdCB0aW1lb3V0IiwgZHMuZ2V0U29UaW1lb3V0KCkgPj0gMTAwKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fVElNRU9VVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fVElNRU9VVCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I0RhdGFncmFtU29ja2V0KGphdmEubmV0LkRhdGFncmFtU29ja2V0SW1wbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X0RhdGFncmFtU29ja2V0SW1wbCgpIHsKLQkJY2xhc3MgdGVzdERhdGFncmFtU29ja2V0IGV4dGVuZHMgRGF0YWdyYW1Tb2NrZXQgewotCQkgICAgcHVibGljIHRlc3REYXRhZ3JhbVNvY2tldChEYXRhZ3JhbVNvY2tldEltcGwgaW1wbCl7Ci0JCSAgICAgICBzdXBlcihpbXBsKTsKLQkJICAgIH0KLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNzZXRTb1RpbWVvdXQoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTb1RpbWVvdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNvVGltZW91dEkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LkRhdGFncmFtU29ja2V0LnNldFNvVGltZW91dChpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIGRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KHBvcnROdW1iZXIpOworICAgICAgICAgICAgZHMuc2V0U29UaW1lb3V0KDEwMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTZXQgaW5jb3JyZWN0IHRpbWVvdXQiLCBkcy5nZXRTb1RpbWVvdXQoKSA+PSAxMDApOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19USU1FT1VUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19USU1FT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjRGF0YWdyYW1Tb2NrZXQoamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXRJbXBsKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0RhdGFncmFtU29ja2V0SW1wbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9EYXRhZ3JhbVNvY2tldEltcGwoKSB7CisgICAgICAgIGNsYXNzIHRlc3REYXRhZ3JhbVNvY2tldCBleHRlbmRzIERhdGFncmFtU29ja2V0IHsKKyAgICAgICAgICAgIHB1YmxpYyB0ZXN0RGF0YWdyYW1Tb2NrZXQoRGF0YWdyYW1Tb2NrZXRJbXBsIGltcGwpeworICAgICAgICAgICAgICAgc3VwZXIoaW1wbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJbmV3IHRlc3REYXRhZ3JhbVNvY2tldCgoRGF0YWdyYW1Tb2NrZXRJbXBsKSBudWxsKTsKLQkJCWZhaWwoImV4Y2VwdGlvbiBleHBlY3RlZCIpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IHRlc3REYXRhZ3JhbVNvY2tldCgoRGF0YWdyYW1Tb2NrZXRJbXBsKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoImV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I0RhdGFncmFtU29ja2V0KGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9Tb2NrZXRBZGRyZXNzKCkgewotCQljbGFzcyBteVNvY2tldEFkZHJlc3MgZXh0ZW5kcyBTb2NrZXRBZGRyZXNzIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjRGF0YWdyYW1Tb2NrZXQoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGFncmFtU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfU29ja2V0QWRkcmVzcygpIHsKKyAgICAgICAgY2xhc3MgbXlTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAKLQkJCXB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcikpOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZHMuZ2V0QnJvYWRjYXN0KCkpOwotCQkJCWFzc2VydFRydWUoIkNyZWF0ZWQgc29ja2V0IHdpdGggaW5jb3JyZWN0IHBvcnQiLCBkcwotCQkJCQkJLmdldExvY2FsUG9ydCgpID09IHBvcnROdW1iZXIpOwotCQkJCWFzc2VydFRydWUoIkNyZWF0ZWQgc29ja2V0IHdpdGggaW5jb3JyZWN0IGFkZHJlc3MiLCBkcwotCQkJCQkJLmdldExvY2FsQWRkcmVzcygpLmVxdWFscyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJDb3VsZCBub3QgY3JlYXRlIERhdGFncmFtU29ja2V0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIHNvY2tldCB3aXRoIGluY29ycmVjdCBwb3J0IiwgZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIHNvY2tldCB3aXRoIGluY29ycmVjdCBhZGRyZXNzIiwgZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEFkZHJlc3MoKS5lcXVhbHMoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBEYXRhZ3JhbVNvY2tldCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CiAKLQkJCXRyeSB7Ci0JCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQobmV3IG15U29ja2V0QWRkcmVzcygpKTsKLQkJCQlmYWlsKAotCQkJCQkJIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbnN0dWN0aW5nIGRhdGFncmFtU29ja2V0IHdpdGggdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyB0eXBlIik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChuZXcgbXlTb2NrZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZXhjZXB0aW9uIHdoZW4gY29uc3R1Y3RpbmcgZGF0YWdyYW1Tb2NrZXQgd2l0aCB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHR5cGUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAKLQkJCX0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vcmVncmVzc2lvbiBmb3IgSGFybW9ueS04OTQKICAgICAgICAgICAgIGRzID0gbmV3IERhdGFncmFtU29ja2V0KChTb2NrZXRBZGRyZXNzKW51bGwpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkcy5nZXRCcm9hZGNhc3QoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZmFpbCgKLQkJCQkJInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gZGF0YWdyYW1Tb2NrZXQgU29ja2V0QWRkcmVzcyBjb25zdHJ1Y3RvciB0ZXN0Iik7Ci0JCX0KLQl9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gZGF0YWdyYW1Tb2NrZXQgU29ja2V0QWRkcmVzcyBjb25zdHJ1Y3RvciB0ZXN0Iik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjYmluZChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfYmluZExqYXZhX25ldF9Tb2NrZXRBZGRyZXNzKCkgewotCQljbGFzcyBteVNvY2tldEFkZHJlc3MgZXh0ZW5kcyBTb2NrZXRBZGRyZXNzIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjYmluZChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9iaW5kTGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB7CisgICAgICAgIGNsYXNzIG15U29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgewogCi0JCQlwdWJsaWMgbXlTb2NrZXRBZGRyZXNzKCkgewotCQkJfQotCQl9CisgICAgICAgICAgICBwdWJsaWMgbXlTb2NrZXRBZGRyZXNzKCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJRGF0YWdyYW1TZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIG5vdyBjcmVhdGUgYSBzb2NrZXQgdGhhdCBpcyBub3QgYm91bmQgYW5kIHRoZW4gYmluZCBpdAotCQkJaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgzKTsKLQkJCWludCBwb3J0TnVtYmVyID0gcG9ydHNbMF07Ci0JCQlpbnQgc2VydmVyUG9ydE51bWJlciA9IHBvcnRzWzFdOwotCQkJRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KAotCQkJCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQkJcG9ydE51bWJlcikpOworICAgICAgICBEYXRhZ3JhbVNlcnZlciBzZXJ2ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gbm93IGNyZWF0ZSBhIHNvY2tldCB0aGF0IGlzIG5vdCBib3VuZCBhbmQgdGhlbiBiaW5kIGl0CisgICAgICAgICAgICBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBwb3J0c1swXTsKKyAgICAgICAgICAgIGludCBzZXJ2ZXJQb3J0TnVtYmVyID0gcG9ydHNbMV07CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TnVtYmVyKSk7CiAKLQkJCS8vIHZhbGlkYXRlIHRoYXQgdGhlIGxvY2FsU29ja2V0QWRkcmVzcyByZWZsZWN0cyB0aGUgYWRkcmVzcyB3ZQotCQkJLy8gYm91bmQgdG8KLQkJCWFzc2VydFRydWUoIkxvY2FsIGFkZHJlc3Mgbm90IGNvcnJlY3QgYWZ0ZXIgYmluZDoiCi0JCQkJCSsgdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCkKLQkJCQkJKyAiRXhwZWN0ZWQ6ICIKLQkJCQkJKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCQkJCXBvcnROdW1iZXIpKS50b1N0cmluZygpLCB0aGVTb2NrZXQKLQkJCQkJLmdldExvY2FsU29ja2V0QWRkcmVzcygpLmVxdWFscygKLQkJCQkJCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQkJCQlwb3J0TnVtYmVyKSkpOworICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB0aGUgbG9jYWxTb2NrZXRBZGRyZXNzIHJlZmxlY3RzIHRoZSBhZGRyZXNzIHdlCisgICAgICAgICAgICAvLyBib3VuZCB0bworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9jYWwgYWRkcmVzcyBub3QgY29ycmVjdCBhZnRlciBiaW5kOiIKKyAgICAgICAgICAgICAgICAgICAgKyB0aGVTb2NrZXQuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICArICJFeHBlY3RlZDogIgorICAgICAgICAgICAgICAgICAgICArIChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE51bWJlcikpLnRvU3RyaW5nKCksIHRoZVNvY2tldAorICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKSk7CiAKLQkJCS8vIG5vdyBtYWtlIHN1cmUgdGhhdCBkYXRhZ3JhbXMgc2VudCBmcm9tIHRoaXMgc29ja2V0IGFwcGVhciB0byBjb21lCi0JCQkvLyBmcm9tIHRoZSBhZGRyZXNzIHdlIGJvdW5kIHRvCi0JCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCXBvcnROdW1iZXIgPSBwb3J0c1syXTsKLQkJCURhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOwotCQkJZHMuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MobG9jYWxIb3N0LCBwb3J0TnVtYmVyKSk7CisgICAgICAgICAgICAvLyBub3cgbWFrZSBzdXJlIHRoYXQgZGF0YWdyYW1zIHNlbnQgZnJvbSB0aGlzIHNvY2tldCBhcHBlYXIgdG8gY29tZQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgYWRkcmVzcyB3ZSBib3VuZCB0bworICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICBwb3J0TnVtYmVyID0gcG9ydHNbMl07CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCBkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKKyAgICAgICAgICAgIGRzLmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgcG9ydE51bWJlcikpOwogCi0JCQl0cnkgewotCQkJCXNlcnZlciA9IG5ldyBEYXRhZ3JhbVNlcnZlcihzZXJ2ZXJQb3J0TnVtYmVyLCBsb2NhbEhvc3QpOwotCQkJCXNlcnZlci5zdGFydCgpOwotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJGYWlsZWQgdG8gc2V0IHVwIGRhdGFncmFtIHNlcnZlciBmb3IgYmluIGRhdGFncmFtIHNvY2tldCB0ZXN0ICIpOwotCQkJfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIGJpbiBkYXRhZ3JhbSBzb2NrZXQgdGVzdCAiKTsKKyAgICAgICAgICAgIH0KIAotCQkJZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyKSk7CisgICAgICAgICAgICBkcy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhsb2NhbEhvc3QsIHNlcnZlclBvcnROdW1iZXIpKTsKIAotCQkJYnl0ZVtdIHNlbmRCeXRlcyA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAwIH07Ci0JCQlEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KHNlbmRCeXRlcywKLQkJCQkJc2VuZEJ5dGVzLmxlbmd0aCk7Ci0JCQlkcy5zZW5kKHNlbmQpOwotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJBZGRyZXNzIGluIHBhY2tldCBzZW50IGRvZXMgbm90IG1hdGNoIGFkZHJlc3MgYm91bmQgdG86IgotCQkJCQkJCSsgc2VydmVyLnJkcC5nZXRBZGRyZXNzKCkgKyAiOiIKLQkJCQkJCQkrIHNlcnZlci5yZHAuZ2V0UG9ydCgpICsgIjoiICsgbG9jYWxIb3N0ICsgIjoiCi0JCQkJCQkJKyBwb3J0TnVtYmVyLCAoc2VydmVyLnJkcC5nZXRBZGRyZXNzKCkKLQkJCQkJCQkuZXF1YWxzKGxvY2FsSG9zdCkpCi0JCQkJCQkJJiYgKHNlcnZlci5yZHAuZ2V0UG9ydCgpID09IHBvcnROdW1iZXIpKTsKKyAgICAgICAgICAgIGJ5dGVbXSBzZW5kQnl0ZXMgPSB7ICdUJywgJ2UnLCAncycsICd0JywgMCB9OworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgc2VuZCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzZW5kQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHNlbmRCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgZHMuc2VuZChzZW5kKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIGRzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiQWRkcmVzcyBpbiBwYWNrZXQgc2VudCBkb2VzIG5vdCBtYXRjaCBhZGRyZXNzIGJvdW5kIHRvOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZlci5yZHAuZ2V0QWRkcmVzcygpICsgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2ZXIucmRwLmdldFBvcnQoKSArICI6IiArIGxvY2FsSG9zdCArICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcG9ydE51bWJlciwgKHNlcnZlci5yZHAuZ2V0QWRkcmVzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhsb2NhbEhvc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChzZXJ2ZXIucmRwLmdldFBvcnQoKSA9PSBwb3J0TnVtYmVyKSk7CiAKLQkJCS8vIHZhbGlkYXRlIGlmIHdlIHBhc3MgaW4gbnVsbCB0aGF0IGl0IHBpY2tzIGFuIGFkZHJlc3MgZm9yIHVzIGFuZAotCQkJLy8gYWxsIGlzIG9rCi0JCQl0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7Ci0JCQl0aGVTb2NrZXQuYmluZChudWxsKTsKLQkJCWFzc2VydE5vdE51bGwoIkJpbmQgd2l0aCBudWxsIGRpZCBub3Qgd29yayIsIHRoZVNvY2tldAotCQkJCQkuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkpOwotCQkJdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAvLyB2YWxpZGF0ZSBpZiB3ZSBwYXNzIGluIG51bGwgdGhhdCBpdCBwaWNrcyBhbiBhZGRyZXNzIGZvciB1cyBhbmQKKyAgICAgICAgICAgIC8vIGFsbCBpcyBvaworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOworICAgICAgICAgICAgdGhlU29ja2V0LmJpbmQobnVsbCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJCaW5kIHdpdGggbnVsbCBkaWQgbm90IHdvcmsiLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsU29ja2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOwogCi0JCQkvLyBub3cgY2hlY2sgdGhlIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgICAgICAgIC8vIG5vdyBjaGVjayB0aGUgZXJyb3IgY29uZGl0aW9ucwogCi0JCQkvLyBBZGRyZXNzIHdlIGNhbm5vdCBiaW5kIHRvCi0JCQl0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7Ci0JCQl0cnkgewotCQkJCXRoZVNvY2tldAotCQkJCQkJLmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJCQlJbmV0QWRkcmVzcwotCQkJCQkJCQkJCS5nZXRCeUFkZHJlc3MoU3VwcG9ydF9Db25maWd1cmF0aW9uLm5vbkxvY2FsQWRkcmVzc0J5dGVzKSwKLQkJCQkJCQkJU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpKSk7Ci0JCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gYmluZGluZyB0byBiYWQgYWRkcmVzcyIpOwotCQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIC8vIEFkZHJlc3Mgd2UgY2Fubm90IGJpbmQgdG8KKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJ5QWRkcmVzcyhTdXBwb3J0X0NvbmZpZ3VyYXRpb24ubm9uTG9jYWxBZGRyZXNzQnl0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCkpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gd2hlbiBiaW5kaW5nIHRvIGJhZCBhZGRyZXNzIik7CisgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOwogCi0JCQkvLyBBZGRyZXNzIHRoYXQgd2UgaGF2ZSBhbGxyZWFkeSBib3VuZCB0bwotCQkJcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgyKTsKLQkJCXRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKLQkJCURhdGFncmFtU29ja2V0IHRoZVNvY2tldDIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMF0pOwotCQkJdHJ5IHsKLQkJCQlJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnRzWzFdKTsKLQkJCQl0aGVTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKLQkJCQl0aGVTb2NrZXQyLmJpbmQodGhlQWRkcmVzcyk7Ci0JCQkJZmFpbCgiTm8gZXhjZXB0aW9uIGJpbmRpbmcgdG8gYWRkcmVzcyB0aGF0IGlzIG5vdCBhdmFpbGFibGUiKTsKLQkJCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBleCkgewotCQkJfQotCQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCQl0aGVTb2NrZXQyLmNsb3NlKCk7CisgICAgICAgICAgICAvLyBBZGRyZXNzIHRoYXQgd2UgaGF2ZSBhbGxyZWFkeSBib3VuZCB0bworICAgICAgICAgICAgcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgyKTsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IHRoZVNvY2tldDIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMF0pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnRzWzFdKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIGJpbmRpbmcgdG8gYWRkcmVzcyB0aGF0IGlzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB0aGVTb2NrZXQyLmNsb3NlKCk7CiAKLQkJCS8vIHVuc3VwcG9ydGVkIFNvY2tldEFkZHJlc3Mgc3ViY2xhc3MKLQkJCXRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKLQkJCXRyeSB7Ci0JCQkJdGhlU29ja2V0LmJpbmQobmV3IG15U29ja2V0QWRkcmVzcygpKTsKLQkJCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBiaW5kaW5nIHVzaW5nIHVuc3VwcG9ydGVkIFNvY2tldEFkZHJlc3Mgc3ViY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJfQotCQkJdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzCisgICAgICAgICAgICB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoZVNvY2tldC5iaW5kKG5ldyBteVNvY2tldEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gYmluZGluZyB1c2luZyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOwogCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBkdXJpbmcgYmluZCB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gZHVyaW5nIGJpbmQgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KIAotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5zdG9wU2VydmVyKCk7Ci0JCX0KLQl9CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLnN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNjb25uZWN0KGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jb25uZWN0TGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2Nvbm5lY3QoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3RMamF2YV9uZXRfU29ja2V0QWRkcmVzcygpIHsKIAotCQkvLyB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgUG9ydFVucmVhY2hhYmxlIGV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8KLQkJLy8gc2VuZCBhIGRncmFtIHRvIGEgc2VydmVyIHRoYXQgaXMgbm90IHJ1bm5pbmcgYW5kIHRoZW4gZG8gYSByZWN2Ci0JCXRyeSB7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOwotCQkJSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpKTsKLQkJCURhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMTBdLCAxMCk7Ci0JCQlkcy5zZW5kKHNlbmQpOwotCQkJRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKLQkJCWRzLnNldFNvVGltZW91dCgxMDAwMCk7Ci0JCQlkcy5yZWNlaXZlKHJlY2VpdmUpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWZhaWwoCi0JCQkJCSJObyBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24gd2hlbiBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIG9uIHJlY3YgIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkiV3JvbmcgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgYXQgbmF0aXZlIGxldmVsIG9uIHJlY3Y6ICIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwKLQkJCQkJKGUgaW5zdGFuY2VvZiBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24pKTsKLQkJfQorICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgUG9ydFVucmVhY2hhYmxlIGV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8KKyAgICAgICAgLy8gc2VuZCBhIGRncmFtIHRvIGEgc2VydmVyIHRoYXQgaXMgbm90IHJ1bm5pbmcgYW5kIHRoZW4gZG8gYSByZWN2CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMTBdLCAxMCk7CisgICAgICAgICAgICBkcy5zZW5kKHNlbmQpOworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKKyAgICAgICAgICAgIGRzLnNldFNvVGltZW91dCgxMDAwMCk7CisgICAgICAgICAgICBkcy5yZWNlaXZlKHJlY2VpdmUpOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICJObyBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24gd2hlbiBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIG9uIHJlY3YgIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgYXQgbmF0aXZlIGxldmVsIG9uIHJlY3Y6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIHNlbmQvcmVjZWl2ZSB3aXRoIGRhdGFncmFtIHNvY2tldHMgY29ubmVjdGVkIGF0Ci0JCS8vIHRoZSBuYXRpdmUgbGV2ZWwKLQkJRGF0YWdyYW1TZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgzKTsKLQkJaW50IHNlcnZlclBvcnROdW1iZXIgPSBwb3J0c1swXTsKLQkJdHJ5IHsKLQkJCUluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOwotCQkJRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzJdKTsKKyAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3ZSBjYW4gc2VuZC9yZWNlaXZlIHdpdGggZGF0YWdyYW0gc29ja2V0cyBjb25uZWN0ZWQgYXQKKyAgICAgICAgLy8gdGhlIG5hdGl2ZSBsZXZlbAorICAgICAgICBEYXRhZ3JhbVNlcnZlciBzZXJ2ZXIgPSBudWxsOworICAgICAgICBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOworICAgICAgICBpbnQgc2VydmVyUG9ydE51bWJlciA9IHBvcnRzWzBdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCBkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCBkczIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMl0pOwogCi0JCQl0cnkgewotCQkJCXNlcnZlciA9IG5ldyBEYXRhZ3JhbVNlcnZlcihzZXJ2ZXJQb3J0TnVtYmVyLCBsb2NhbEhvc3QpOwotCQkJCXNlcnZlci5zdGFydCgpOwotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJGYWlsZWQgdG8gc2V0IHVwIGRhdGFncmFtIHNlcnZlciBmb3IgbmF0aXZlIGNvbm5lY3RlZCBEZ3JhbSBzb2NrZXQgdGVzdCAiKTsKLQkJCX0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmVyID0gbmV3IERhdGFncmFtU2VydmVyKHNlcnZlclBvcnROdW1iZXIsIGxvY2FsSG9zdCk7CisgICAgICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgdXAgZGF0YWdyYW0gc2VydmVyIGZvciBuYXRpdmUgY29ubmVjdGVkIERncmFtIHNvY2tldCB0ZXN0ICIpOworICAgICAgICAgICAgfQogCi0JCQlpbnQgcG9ydCA9IGRzLmdldExvY2FsUG9ydCgpOwotCQkJZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyKSk7CisgICAgICAgICAgICBpbnQgcG9ydCA9IGRzLmdldExvY2FsUG9ydCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyKSk7CiAKLQkJCWJ5dGVbXSBzZW5kQnl0ZXMgPSB7ICdUJywgJ2UnLCAncycsICd0JywgMCB9OwotCQkJRGF0YWdyYW1QYWNrZXQgc2VuZCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzZW5kQnl0ZXMsCi0JCQkJCXNlbmRCeXRlcy5sZW5ndGgpOwotCQkJZHMuc2VuZChzZW5kKTsKLQkJCURhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7Ci0JCQlkcy5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCQlkcy5yZWNlaXZlKHJlY2VpdmUpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIldyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIiArIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCi0JCQkJCXJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBkYXRhIHJlY2VpdmVkIgotCQkJCQkrIG5ldyBTdHJpbmcocmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCi0JCQkJCSsgIjoiICsgbmV3IFN0cmluZyhzZW5kQnl0ZXMpLCBuZXcgU3RyaW5nKAotCQkJCQlyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKLQkJCQkJLmVxdWFscyhuZXcgU3RyaW5nKHNlbmRCeXRlcykpKTsKLQkJCWFzc2VydFRydWUoIldyb25nIHJlY2VpdmVyOiIgKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IgotCQkJCQkrIGxvY2FsSG9zdCwgcmVjZWl2ZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGxvY2FsSG9zdCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgKLQkJCQkJIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gc2VuZGluZyBkYXRhIG9uIGRncmFtIGNvbm5lY3RlZCBhdCBuYXRpdmUgbGV2ZWw6IgotCQkJCQkJCSsgZS50b1N0cmluZygpKTsKLQkJfQorICAgICAgICAgICAgYnl0ZVtdIHNlbmRCeXRlcyA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAwIH07CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KHNlbmRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgc2VuZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBkcy5zZW5kKHNlbmQpOworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsyMF0sIDIwKTsKKyAgICAgICAgICAgIGRzLnNldFNvVGltZW91dCgyMDAwKTsKKyAgICAgICAgICAgIGRzLnJlY2VpdmUocmVjZWl2ZSk7CisgICAgICAgICAgICBkcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3Jvbmcgc2l6ZSBkYXRhIHJlY2VpdmVkOiAiICsgcmVjZWl2ZS5nZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZS5nZXRMZW5ndGgoKSA9PSBzZW5kQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGRhdGEgcmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiIgKyBuZXcgU3RyaW5nKHNlbmRCeXRlcyksIG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgcmVjZWl2ZXI6IiArIHJlY2VpdmUuZ2V0QWRkcmVzcygpICsgIjoiCisgICAgICAgICAgICAgICAgICAgICsgbG9jYWxIb3N0LCByZWNlaXZlLmdldEFkZHJlc3MoKS5lcXVhbHMobG9jYWxIb3N0KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBzZW5kaW5nIGRhdGEgb24gZGdyYW0gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CiAKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIuc3RvcFNlcnZlcigpOwotCQl9CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLnN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQogCi0JCS8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGRpc2Nvbm5lY3QKLQkJdHJ5IHsKLQkJCWRzID0gbmV3IGphdmEubmV0LkRhdGFncmFtU29ja2V0KCk7Ci0JCQlJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQlkcy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpbmV0QWRkcmVzcywgcG9ydE51bWJlcikpOwotCQkJZHMuZGlzY29ubmVjdCgpOwotCQkJZHMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgYXQgbmF0aXZlIgotCQkJCQkrIGUudG9TdHJpbmcoKSwgKGUgaW5zdGFuY2VvZiBQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24pKTsKLQkJfQorICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBkaXNjb25uZWN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpKTsKKyAgICAgICAgICAgIGRzLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGRzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IGF0IG5hdGl2ZSIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uKSk7CisgICAgICAgIH0KIAotCQkvLyB2YWxpZGF0ZSB0aGF0IG9uY2UgY29ubmVjdGVkIHdlIGNhbm5vdCBzZW5kIHRvIGFub3RoZXIgYWRkcmVzcwotCQl0cnkgewotCQkJZHMgPSBuZXcgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQoKTsKLQkJCUluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJCWRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGluZXRBZGRyZXNzLCBwb3J0TnVtYmVyKSk7Ci0JCQlEYXRhZ3JhbVBhY2tldCBzZW5kID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwXSwgMTAsCi0JCQkJCWluZXRBZGRyZXNzLCBwb3J0TnVtYmVyICsgMSk7Ci0JCQlkcy5zZW5kKHNlbmQpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWZhaWwoCi0JCQkJCSJObyBFeGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gc2VuZCB0byBhIGRpZmZlcmVudCBhZGRyZXNzIG9uIGEgY29ubmVjdGVkIHNvY2tldCAiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJXcm9uZyBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gc2VuZCB0byBhIGRpZmZlcmVudCBhZGRyZXNzIG9uIGEgY29ubmVjdGVkIHNvY2tldDogIgotCQkJCQkJCSsgZS50b1N0cmluZygpLAotCQkJCQkoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOwotCQl9CisgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgb25jZSBjb25uZWN0ZWQgd2UgY2Fubm90IHNlbmQgdG8gYW5vdGhlciBhZGRyZXNzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIpKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMTBdLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgaW5ldEFkZHJlc3MsIHBvcnROdW1iZXIgKyAxKTsKKyAgICAgICAgICAgIGRzLnNlbmQoc2VuZCk7CisgICAgICAgICAgICBkcy5jbG9zZSgpOworICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgIk5vIEV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBzZW5kIHRvIGEgZGlmZmVyZW50IGFkZHJlc3Mgb24gYSBjb25uZWN0ZWQgc29ja2V0ICIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIldyb25nIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBzZW5kIHRvIGEgZGlmZmVyZW50IGFkZHJlc3Mgb24gYSBjb25uZWN0ZWQgc29ja2V0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSk7CisgICAgICAgIH0KIAotCQkvLyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBjb25uZWN0LCB0aGVuIGRpc2Nvbm5lY3QsIHRoZW4gY29ubmVjdCB0aGVuCi0JCS8vIHNlbmQvcmVjdgotCQlzZXJ2ZXIgPSBudWxsOwotCQlwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOwotCQlzZXJ2ZXJQb3J0TnVtYmVyID0gcG9ydHNbMF07Ci0JCXRyeSB7Ci0JCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCURhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKLQkJCURhdGFncmFtU29ja2V0IGRzMiA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1syXSk7CisgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGNvbm5lY3QsIHRoZW4gZGlzY29ubmVjdCwgdGhlbiBjb25uZWN0IHRoZW4KKyAgICAgICAgLy8gc2VuZC9yZWN2CisgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7CisgICAgICAgIHNlcnZlclBvcnROdW1iZXIgPSBwb3J0c1swXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzJdKTsKIAotCQkJdHJ5IHsKLQkJCQlzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKLQkJCQlzZXJ2ZXIuc3RhcnQoKTsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoCi0JCQkJCQkiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIG5hdGl2ZSBjb25uZWN0ZWQgRGdyYW0gc29ja2V0IHRlc3QgIik7Ci0JCQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBEYXRhZ3JhbVNlcnZlcihzZXJ2ZXJQb3J0TnVtYmVyLCBsb2NhbEhvc3QpOworICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHVwIGRhdGFncmFtIHNlcnZlciBmb3IgbmF0aXZlIGNvbm5lY3RlZCBEZ3JhbSBzb2NrZXQgdGVzdCAiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKLQkJCWRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlciArIDEpKTsKLQkJCWRzLmRpc2Nvbm5lY3QoKTsKLQkJCWRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlcikpOworICAgICAgICAgICAgaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlciArIDEpKTsKKyAgICAgICAgICAgIGRzLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlcikpOwogCi0JCQlieXRlW10gc2VuZEJ5dGVzID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDAgfTsKLQkJCURhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoc2VuZEJ5dGVzLAotCQkJCQlzZW5kQnl0ZXMubGVuZ3RoKTsKLQkJCWRzLnNlbmQoc2VuZCk7Ci0JCQlEYXRhZ3JhbVBhY2tldCByZWNlaXZlID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzIwXSwgMjApOwotCQkJZHMuc2V0U29UaW1lb3V0KDIwMDApOwotCQkJZHMucmVjZWl2ZShyZWNlaXZlKTsKLQkJCWRzLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkiY29ubmVjdC9kaXNjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyBzaXplIGRhdGEgcmVjZWl2ZWQ6ICIKLQkJCQkJCQkrIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCi0JCQkJCXJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdCAtIFdyb25nIGRhdGEgcmVjZWl2ZWQiCi0JCQkJCSsgbmV3IFN0cmluZyhyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKLQkJCQkJKyAiOiIgKyBuZXcgU3RyaW5nKHNlbmRCeXRlcyksIG5ldyBTdHJpbmcoCi0JCQkJCXJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQotCQkJCQkuZXF1YWxzKG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSkpOwotCQkJYXNzZXJ0VHJ1ZSgiY29ubmVjdC9kaXNjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyByZWNlaXZlcjoiCi0JCQkJCSsgcmVjZWl2ZS5nZXRBZGRyZXNzKCkgKyAiOiIgKyBsb2NhbEhvc3QsIHJlY2VpdmUKLQkJCQkJLmdldEFkZHJlc3MoKS5lcXVhbHMobG9jYWxIb3N0KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKAotCQkJCQkiVW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBzZW5kaW5nIGRhdGEgb24gZGdyYW0gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbCBhZnRlciBjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdDoiCi0JCQkJCQkJKyBlLnRvU3RyaW5nKCkpOwotCQl9CisgICAgICAgICAgICBieXRlW10gc2VuZEJ5dGVzID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDAgfTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoc2VuZEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBzZW5kQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGRzLnNlbmQoc2VuZCk7CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCByZWNlaXZlID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzIwXSwgMjApOworICAgICAgICAgICAgZHMuc2V0U29UaW1lb3V0KDIwMDApOworICAgICAgICAgICAgZHMucmVjZWl2ZShyZWNlaXZlKTsKKyAgICAgICAgICAgIGRzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiY29ubmVjdC9kaXNjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyBzaXplIGRhdGEgcmVjZWl2ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdCAtIFdyb25nIGRhdGEgcmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiIgKyBuZXcgU3RyaW5nKHNlbmRCeXRlcyksIG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY29ubmVjdC9kaXNjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyByZWNlaXZlcjoiCisgICAgICAgICAgICAgICAgICAgICsgcmVjZWl2ZS5nZXRBZGRyZXNzKCkgKyAiOiIgKyBsb2NhbEhvc3QsIHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKS5lcXVhbHMobG9jYWxIb3N0KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBzZW5kaW5nIGRhdGEgb24gZGdyYW0gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbCBhZnRlciBjb25uZWN0L2Rpc2Nvbm5lY3QvY29ubmVjdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CiAKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIuc3RvcFNlcnZlcigpOwotCQl9CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLnN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQogCi0JCS8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGNvbm5lY3QvZGlzY29ubmVjdCB0aGVuIHNlbmQvcmVjdiB0byBhbnkgYWRkcmVzcwotCQlzZXJ2ZXIgPSBudWxsOwotCQlwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOwotCQlzZXJ2ZXJQb3J0TnVtYmVyID0gcG9ydHNbMF07Ci0JCXRyeSB7Ci0JCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCURhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKLQkJCURhdGFncmFtU29ja2V0IGRzMiA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1syXSk7CisgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGNvbm5lY3QvZGlzY29ubmVjdCB0aGVuIHNlbmQvcmVjdiB0byBhbnkgYWRkcmVzcworICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOworICAgICAgICBzZXJ2ZXJQb3J0TnVtYmVyID0gcG9ydHNbMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IGRzMiA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1syXSk7CiAKLQkJCXRyeSB7Ci0JCQkJc2VydmVyID0gbmV3IERhdGFncmFtU2VydmVyKHNlcnZlclBvcnROdW1iZXIsIGxvY2FsSG9zdCk7Ci0JCQkJc2VydmVyLnN0YXJ0KCk7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKAotCQkJCQkJIkZhaWxlZCB0byBzZXQgdXAgZGF0YWdyYW0gc2VydmVyIGZvciBuYXRpdmUgY29ubmVjdGVkIERncmFtIHNvY2tldCB0ZXN0ICIpOwotCQkJfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIG5hdGl2ZSBjb25uZWN0ZWQgRGdyYW0gc29ja2V0IHRlc3QgIik7CisgICAgICAgICAgICB9CiAKLQkJCWludCBwb3J0ID0gZHMuZ2V0TG9jYWxQb3J0KCk7Ci0JCQlkcy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhsb2NhbEhvc3QsIHNlcnZlclBvcnROdW1iZXIgKyAxKSk7Ci0JCQlkcy5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBpbnQgcG9ydCA9IGRzLmdldExvY2FsUG9ydCgpOworICAgICAgICAgICAgZHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MobG9jYWxIb3N0LCBzZXJ2ZXJQb3J0TnVtYmVyICsgMSkpOworICAgICAgICAgICAgZHMuZGlzY29ubmVjdCgpOwogCi0JCQlieXRlW10gc2VuZEJ5dGVzID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDAgfTsKLQkJCURhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoc2VuZEJ5dGVzLAotCQkJCQlzZW5kQnl0ZXMubGVuZ3RoLCBsb2NhbEhvc3QsIHNlcnZlclBvcnROdW1iZXIpOwotCQkJZHMuc2VuZChzZW5kKTsKLQkJCURhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7Ci0JCQlkcy5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCQlkcy5yZWNlaXZlKHJlY2VpdmUpOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoImNvbm5lY3QvZGlzY29ubmVjdCAtIFdyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIgotCQkJCQkrIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCi0JCQkJCXJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QgLSBXcm9uZyBkYXRhIHJlY2VpdmVkIgotCQkJCQkrIG5ldyBTdHJpbmcocmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCi0JCQkJCSsgIjoiICsgbmV3IFN0cmluZyhzZW5kQnl0ZXMpLCBuZXcgU3RyaW5nKAotCQkJCQlyZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKLQkJCQkJLmVxdWFscyhuZXcgU3RyaW5nKHNlbmRCeXRlcykpKTsKLQkJCWFzc2VydFRydWUoImNvbm5lY3QvZGlzY29ubmVjdCAtIFdyb25nIHJlY2VpdmVyOiIKLQkJCQkJKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IiArIGxvY2FsSG9zdCwgcmVjZWl2ZQotCQkJCQkuZ2V0QWRkcmVzcygpLmVxdWFscyhsb2NhbEhvc3QpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoCi0JCQkJCSJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHNlbmRpbmcgZGF0YSBvbiBkZ3JhbSBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIGFmdGVyIGNvbm5lY3QvZGlzY29ubmVjdDoiCi0JCQkJCQkJKyBlLnRvU3RyaW5nKCkpOwotCQl9CisgICAgICAgICAgICBieXRlW10gc2VuZEJ5dGVzID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDAgfTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoc2VuZEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBzZW5kQnl0ZXMubGVuZ3RoLCBsb2NhbEhvc3QsIHNlcnZlclBvcnROdW1iZXIpOworICAgICAgICAgICAgZHMuc2VuZChzZW5kKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7CisgICAgICAgICAgICBkcy5zZXRTb1RpbWVvdXQoMjAwMCk7CisgICAgICAgICAgICBkcy5yZWNlaXZlKHJlY2VpdmUpOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImNvbm5lY3QvZGlzY29ubmVjdCAtIFdyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIgorICAgICAgICAgICAgICAgICAgICArIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjb25uZWN0L2Rpc2Nvbm5lY3QgLSBXcm9uZyBkYXRhIHJlY2VpdmVkIgorICAgICAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcocmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICsgIjoiICsgbmV3IFN0cmluZyhzZW5kQnl0ZXMpLCBuZXcgU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgU3RyaW5nKHNlbmRCeXRlcykpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImNvbm5lY3QvZGlzY29ubmVjdCAtIFdyb25nIHJlY2VpdmVyOiIKKyAgICAgICAgICAgICAgICAgICAgKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IiArIGxvY2FsSG9zdCwgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAgICAuZ2V0QWRkcmVzcygpLmVxdWFscyhsb2NhbEhvc3QpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHNlbmRpbmcgZGF0YSBvbiBkZ3JhbSBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIGFmdGVyIGNvbm5lY3QvZGlzY29ubmVjdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CiAKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIuc3RvcFNlcnZlcigpOwotCQl9CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLnN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQogCi0JCS8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGNvbm5lY3Qgb24gYW4gYWxscmVhZHkgY29ubmVjdGVkIHNvY2tldCBhbmQgdGhlbgotCQkvLyBzZW5kL3JlY3YKLQkJc2VydmVyID0gbnVsbDsKLQkJcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgzKTsKLQkJc2VydmVyUG9ydE51bWJlciA9IHBvcnRzWzBdOwotCQl0cnkgewotCQkJSW5ldEFkZHJlc3MgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlEYXRhZ3JhbVNvY2tldCBkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7Ci0JCQlEYXRhZ3JhbVNvY2tldCBkczIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMl0pOworICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBjb25uZWN0IG9uIGFuIGFsbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQgYW5kIHRoZW4KKyAgICAgICAgLy8gc2VuZC9yZWN2CisgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7CisgICAgICAgIHNlcnZlclBvcnROdW1iZXIgPSBwb3J0c1swXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgZHMyID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzJdKTsKIAotCQkJdHJ5IHsKLQkJCQlzZXJ2ZXIgPSBuZXcgRGF0YWdyYW1TZXJ2ZXIoc2VydmVyUG9ydE51bWJlciwgbG9jYWxIb3N0KTsKLQkJCQlzZXJ2ZXIuc3RhcnQoKTsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoCi0JCQkJCQkiRmFpbGVkIHRvIHNldCB1cCBkYXRhZ3JhbSBzZXJ2ZXIgZm9yIG5hdGl2ZSBjb25uZWN0ZWQgRGdyYW0gc29ja2V0IHRlc3QgIik7Ci0JCQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBEYXRhZ3JhbVNlcnZlcihzZXJ2ZXJQb3J0TnVtYmVyLCBsb2NhbEhvc3QpOworICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHVwIGRhdGFncmFtIHNlcnZlciBmb3IgbmF0aXZlIGNvbm5lY3RlZCBEZ3JhbSBzb2NrZXQgdGVzdCAiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKLQkJCWRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlciArIDEpKTsKLQkJCWRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlcikpOworICAgICAgICAgICAgaW50IHBvcnQgPSBkcy5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlciArIDEpKTsKKyAgICAgICAgICAgIGRzLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsSG9zdCwgc2VydmVyUG9ydE51bWJlcikpOwogCi0JCQlieXRlW10gc2VuZEJ5dGVzID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDAgfTsKLQkJCURhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoc2VuZEJ5dGVzLAotCQkJCQlzZW5kQnl0ZXMubGVuZ3RoKTsKLQkJCWRzLnNlbmQoc2VuZCk7Ci0JCQlEYXRhZ3JhbVBhY2tldCByZWNlaXZlID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzIwXSwgMjApOwotCQkJZHMuc2V0U29UaW1lb3V0KDIwMDApOwotCQkJZHMucmVjZWl2ZShyZWNlaXZlKTsKLQkJCWRzLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyBzaXplIGRhdGEgcmVjZWl2ZWQ6ICIKLQkJCQkJKyByZWNlaXZlLmdldExlbmd0aCgpLAotCQkJCQlyZWNlaXZlLmdldExlbmd0aCgpID09IHNlbmRCeXRlcy5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgiY29ubmVjdC9jb25uZWN0IC0gV3JvbmcgZGF0YSByZWNlaXZlZCIKLQkJCQkJKyBuZXcgU3RyaW5nKHJlY2VpdmUuZ2V0RGF0YSgpLCAwLCByZWNlaXZlLmdldExlbmd0aCgpKQotCQkJCQkrICI6IiArIG5ldyBTdHJpbmcoc2VuZEJ5dGVzKSwgbmV3IFN0cmluZygKLQkJCQkJcmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCi0JCQkJCS5lcXVhbHMobmV3IFN0cmluZyhzZW5kQnl0ZXMpKSk7Ci0JCQlhc3NlcnRUcnVlKCJjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyByZWNlaXZlcjoiCi0JCQkJCSsgcmVjZWl2ZS5nZXRBZGRyZXNzKCkgKyAiOiIgKyBsb2NhbEhvc3QsIHJlY2VpdmUKLQkJCQkJLmdldEFkZHJlc3MoKS5lcXVhbHMobG9jYWxIb3N0KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKAotCQkJCQkiVW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBzZW5kaW5nIGRhdGEgb24gZGdyYW0gY29ubmVjdGVkIGF0IG5hdGl2ZSBsZXZlbCBhZnRlciBjb25uZWN0L2Nvbm5lY3Q6ICIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCX0KKyAgICAgICAgICAgIGJ5dGVbXSBzZW5kQnl0ZXMgPSB7ICdUJywgJ2UnLCAncycsICd0JywgMCB9OworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgc2VuZCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzZW5kQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHNlbmRCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgZHMuc2VuZChzZW5kKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHJlY2VpdmUgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMjBdLCAyMCk7CisgICAgICAgICAgICBkcy5zZXRTb1RpbWVvdXQoMjAwMCk7CisgICAgICAgICAgICBkcy5yZWNlaXZlKHJlY2VpdmUpOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImNvbm5lY3QvY29ubmVjdCAtIFdyb25nIHNpemUgZGF0YSByZWNlaXZlZDogIgorICAgICAgICAgICAgICAgICAgICArIHJlY2VpdmUuZ2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUuZ2V0TGVuZ3RoKCkgPT0gc2VuZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjb25uZWN0L2Nvbm5lY3QgLSBXcm9uZyBkYXRhIHJlY2VpdmVkIgorICAgICAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcocmVjZWl2ZS5nZXREYXRhKCksIDAsIHJlY2VpdmUuZ2V0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICsgIjoiICsgbmV3IFN0cmluZyhzZW5kQnl0ZXMpLCBuZXcgU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlLmdldERhdGEoKSwgMCwgcmVjZWl2ZS5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgU3RyaW5nKHNlbmRCeXRlcykpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImNvbm5lY3QvY29ubmVjdCAtIFdyb25nIHJlY2VpdmVyOiIKKyAgICAgICAgICAgICAgICAgICAgKyByZWNlaXZlLmdldEFkZHJlc3MoKSArICI6IiArIGxvY2FsSG9zdCwgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAgICAuZ2V0QWRkcmVzcygpLmVxdWFscyhsb2NhbEhvc3QpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHNlbmRpbmcgZGF0YSBvbiBkZ3JhbSBjb25uZWN0ZWQgYXQgbmF0aXZlIGxldmVsIGFmdGVyIGNvbm5lY3QvY29ubmVjdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQogCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc2VydmVyLnN0b3BTZXJ2ZXIoKTsKLQkJfQorICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZlci5zdG9wU2VydmVyKCk7CisgICAgICAgIH0KIAotCQkvLyB0ZXN0IGZvciB3aGVuIHdlIGZhaWwgdG8gY29ubmVjdCBhdCB0aGUgbmF0aXZlIGxldmVsLiBJdCBzZWVtcyB0bwotCQkvLyBmYWlsIGZvciB0aGUgYW55IGFkZHJlc3Mgc28gd2UgdXNlIHRoaXMuIE5vdyB0byBiZSBjb21wYXRpYmxlIHdlCi0JCS8vIGRvbid0IHRocm93IHRoZSBleGNlcHRpb24gYnV0IGVhdCBpdCBhbmQgdGhlbiBhY3QgYXMgaWYgd2Ugd2VyZQotCQkvLyBjb25uZWN0ZWQgYXQgdGhlIEphdmEgbGV2ZWwuCi0JCXRyeSB7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOwotCQkJYnl0ZVtdIGFkZHJlc3NCeXRlcyA9IHsgMCwgMCwgMCwgMCB9OwotCQkJSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoYWRkcmVzc0J5dGVzKTsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOwotCQkJSW5ldEFkZHJlc3MgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlkcy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpbmV0QWRkcmVzcywgcG9ydE51bWJlcikpOwotCQkJYXNzZXJ0VHJ1ZSgiSXMgbm90IGNvbm5lY3RlZCBhZnRlciBjb25uZWN0IHRvIGluYWRkciBhbnkiLCBkcwotCQkJCQkuaXNDb25uZWN0ZWQoKSk7Ci0JCQlieXRlW10gc2VuZEJ5dGVzID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDAgfTsKLQkJCURhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoc2VuZEJ5dGVzLAotCQkJCQlzZW5kQnl0ZXMubGVuZ3RoLCBsb2NhbEhvc3QsIHBvcnROdW1iZXIpOwotCQkJZHMuc2VuZChzZW5kKTsKLQkJCWZhaWwoCi0JCQkJCSJObyBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gY29ubmVjdCBhdCBuYXRpdmUgbGV2ZWwgd2l0aCBiYWQgYWRkcmVzcyAoZXhjZXB0aW9uIGZyb20gc2VuZCkgICIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIldyb25nIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IGF0IG5hdGl2ZSBsZXZlbCB3aXRoIGJhZCBhZGRyZXNzIChleGNlcHRpb24gZnJvbSBzZW5kKTogIgotCQkJCQkJCSsgZS50b1N0cmluZygpLAotCQkJCQkoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOwotCQl9Ci0JfQorICAgICAgICAvLyB0ZXN0IGZvciB3aGVuIHdlIGZhaWwgdG8gY29ubmVjdCBhdCB0aGUgbmF0aXZlIGxldmVsLiBJdCBzZWVtcyB0bworICAgICAgICAvLyBmYWlsIGZvciB0aGUgYW55IGFkZHJlc3Mgc28gd2UgdXNlIHRoaXMuIE5vdyB0byBiZSBjb21wYXRpYmxlIHdlCisgICAgICAgIC8vIGRvbid0IHRocm93IHRoZSBleGNlcHRpb24gYnV0IGVhdCBpdCBhbmQgdGhlbiBhY3QgYXMgaWYgd2Ugd2VyZQorICAgICAgICAvLyBjb25uZWN0ZWQgYXQgdGhlIEphdmEgbGV2ZWwuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgYnl0ZVtdIGFkZHJlc3NCeXRlcyA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoYWRkcmVzc0J5dGVzKTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICBkcy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpbmV0QWRkcmVzcywgcG9ydE51bWJlcikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSXMgbm90IGNvbm5lY3RlZCBhZnRlciBjb25uZWN0IHRvIGluYWRkciBhbnkiLCBkcworICAgICAgICAgICAgICAgICAgICAuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgICAgICBieXRlW10gc2VuZEJ5dGVzID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDAgfTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHNlbmQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoc2VuZEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBzZW5kQnl0ZXMubGVuZ3RoLCBsb2NhbEhvc3QsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgZHMuc2VuZChzZW5kKTsKKyAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICJObyBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gY29ubmVjdCBhdCBuYXRpdmUgbGV2ZWwgd2l0aCBiYWQgYWRkcmVzcyAoZXhjZXB0aW9uIGZyb20gc2VuZCkgICIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIldyb25nIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IGF0IG5hdGl2ZSBsZXZlbCB3aXRoIGJhZCBhZGRyZXNzIChleGNlcHRpb24gZnJvbSBzZW5kKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2lzQm91bmQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfaXNCb3VuZCgpIHsKLQkJdHJ5IHsKLQkJCUluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7Ci0JCQlpbnQgcG9ydCA9IHBvcnRzWzBdOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNpc0JvdW5kKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0JvdW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9pc0JvdW5kKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICAgICAgaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgzKTsKKyAgICAgICAgICAgIGludCBwb3J0ID0gcG9ydHNbMF07CiAKLQkJCURhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7Ci0JCQlhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkICBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmUgKDEpIiwKLQkJCQkJdGhlU29ja2V0LmlzQm91bmQoKSk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkICBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmUgKDEpIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQm91bmQoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKIAotCQkJdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhhZGRyLCBwb3J0KSk7Ci0JCQlhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkICBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmUgKDIpIiwKLQkJCQkJdGhlU29ja2V0LmlzQm91bmQoKSk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwgcG9ydCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCAgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICgyKSIsCisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc0JvdW5kKCkpOworICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CiAKLQkJCXRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKLQkJCWFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkICBib3VuZCB3aGVuIGl0IHNob3VsZCBub3QgYmUgKDEpIiwKLQkJCQkJdGhlU29ja2V0LmlzQm91bmQoKSk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkICBib3VuZCB3aGVuIGl0IHNob3VsZCBub3QgYmUgKDEpIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQm91bmQoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKIAotCQkJLy8gY29ubmVjdCBjYXVzZXMgaW1wbGljaXQgYmluZAotCQkJdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOwotCQkJdGhlU29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGFkZHIsIHBvcnQpKTsKLQkJCWFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICgzKSIsCi0JCQkJCXRoZVNvY2tldC5pc0JvdW5kKCkpOwotCQkJdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAvLyBjb25uZWN0IGNhdXNlcyBpbXBsaWNpdCBiaW5kCisgICAgICAgICAgICB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwgcG9ydCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmUgKDMpIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQm91bmQoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKIAotCQkJLy8gbm93IHRlc3Qgd2hlbiB3ZSBiaW5kIGV4cGxpY2l0ZWx5Ci0JCQlJbmV0U29ja2V0QWRkcmVzcyB0aGVMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0c1syXSk7Ci0JCQl0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7Ci0JCQlhc3NlcnRGYWxzZSgiU29ja2V0IGluZGljYXRlZCBib3VuZCB3aGVuIGl0IHNob3VsZCBub3QgYmUgKDIpIiwKLQkJCQkJdGhlU29ja2V0LmlzQm91bmQoKSk7Ci0JCQl0aGVTb2NrZXQuYmluZCh0aGVMb2NhbEFkZHJlc3MpOwotCQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmUgKDQpIiwKLQkJCQkJdGhlU29ja2V0LmlzQm91bmQoKSk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICg1KSIsCi0JCQkJCXRoZVNvY2tldC5pc0JvdW5kKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiR290IGV4Y2VwdGlvbiBkdXJpbmcgaXNCb3VuZCB0ZXN0cyIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gbm93IHRlc3Qgd2hlbiB3ZSBiaW5kIGV4cGxpY2l0ZWx5CisgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0c1syXSk7CisgICAgICAgICAgICB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiU29ja2V0IGluZGljYXRlZCBib3VuZCB3aGVuIGl0IHNob3VsZCBub3QgYmUgKDIpIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQm91bmQoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuYmluZCh0aGVMb2NhbEFkZHJlc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmUgKDQpIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQm91bmQoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICg1KSIsCisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc0JvdW5kKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiR290IGV4Y2VwdGlvbiBkdXJpbmcgaXNCb3VuZCB0ZXN0cyIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2lzQ29ubmVjdGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2lzQ29ubmVjdGVkKCkgewotCQl0cnkgewotCQkJSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCg0KTsKLQkJCWludCBwb3J0ID0gcG9ydHNbMF07CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2lzQ29ubmVjdGVkKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0Nvbm5lY3RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNDb25uZWN0ZWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDQpOworICAgICAgICAgICAgaW50IHBvcnQgPSBwb3J0c1swXTsKIAotCQkJLy8gYmFzZSB0ZXN0Ci0JCQlEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOwotCQkJYXNzZXJ0RmFsc2UoIlNvY2tldCBpbmRpY2F0ZWQgY29ubmVjdGVkIHdoZW4gaXQgc2hvdWxkIG5vdCBiZSIsCi0JCQkJCXRoZVNvY2tldC5pc0Nvbm5lY3RlZCgpKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhhZGRyLCBwb3J0KSk7Ci0JCQlhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkICBub3QgY29ubmVjdGVkIHdoZW4gaXQgc2hvdWxkIGJlIiwKLQkJCQkJdGhlU29ja2V0LmlzQ29ubmVjdGVkKCkpOworICAgICAgICAgICAgLy8gYmFzZSB0ZXN0CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMV0pOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlNvY2tldCBpbmRpY2F0ZWQgY29ubmVjdGVkIHdoZW4gaXQgc2hvdWxkIG5vdCBiZSIsCisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhhZGRyLCBwb3J0KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkICBub3QgY29ubmVjdGVkIHdoZW4gaXQgc2hvdWxkIGJlIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQ29ubmVjdGVkKCkpOwogCi0JCQkvLyByZWNvbm5lY3QgdGhlIHNvY2tldCBhbmQgbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyCi0JCQl0aGVTb2NrZXQuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwgcG9ydHNbMl0pKTsKLQkJCWFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgIG5vdCBjb25uZWN0ZWQgd2hlbiBpdCBzaG91bGQgYmUiLAotCQkJCQl0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgICAgICAvLyByZWNvbm5lY3QgdGhlIHNvY2tldCBhbmQgbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyCisgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwgcG9ydHNbMl0pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgIG5vdCBjb25uZWN0ZWQgd2hlbiBpdCBzaG91bGQgYmUiLAorICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7CiAKLQkJCS8vIG5vdyBkaXNjb25uZWN0IHRoZSBzb2NrZXQgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlcgotCQkJdGhlU29ja2V0LmRpc2Nvbm5lY3QoKTsKLQkJCWFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkIGNvbm5lY3RlZCB3aGVuIGl0IHNob3VsZCBub3QgYmUiLAotCQkJCQl0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIC8vIG5vdyBkaXNjb25uZWN0IHRoZSBzb2NrZXQgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlcgorICAgICAgICAgICAgdGhlU29ja2V0LmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkIGNvbm5lY3RlZCB3aGVuIGl0IHNob3VsZCBub3QgYmUiLAorICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKIAotCQkJLy8gbm93IGNoZWNrIGJlaGF2aW9yIHdoZW4gc29ja2V0IGlzIGNsb3NlZCB3aGVuIGNvbm5lY3RlZAotCQkJdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzNdKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhhZGRyLCBwb3J0KSk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgIG5vdCBjb25uZWN0ZWQgd2hlbiBpdCBzaG91bGQgYmUiLAotCQkJCQl0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJHb3QgZXhjZXB0aW9uIGR1cmluZyBpc0Nvbm5lY3RlZCB0ZXN0cyIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gbm93IGNoZWNrIGJlaGF2aW9yIHdoZW4gc29ja2V0IGlzIGNsb3NlZCB3aGVuIGNvbm5lY3RlZAorICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzNdKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhhZGRyLCBwb3J0KSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgIG5vdCBjb25uZWN0ZWQgd2hlbiBpdCBzaG91bGQgYmUiLAorICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJHb3QgZXhjZXB0aW9uIGR1cmluZyBpc0Nvbm5lY3RlZCB0ZXN0cyIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2dldFJlbW90ZVNvY2tldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpIHsKLQkJdHJ5IHsKLQkJCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7Ci0JCQlpbnQgc3BvcnQgPSBwb3J0c1swXTsKLQkJCWludCBwb3J0TnVtYmVyID0gcG9ydHNbMV07Ci0JCQlEYXRhZ3JhbVNvY2tldCBzID0gbmV3IERhdGFncmFtU29ja2V0KG5ldyBJbmV0U29ja2V0QWRkcmVzcygKLQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW1iZXIpKTsKLQkJCXMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0KSk7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MoMSk6IgotCQkJCQkrIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkudG9TdHJpbmcoKSwgcwotCQkJCQkuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpLmVxdWFscygKLQkJCQkJCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQkJCQlzcG9ydCkpKTsKLQkJCXMuY2xvc2UoKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmVtb3RlU29ja2V0QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7CisgICAgICAgICAgICBpbnQgc3BvcnQgPSBwb3J0c1swXTsKKyAgICAgICAgICAgIGludCBwb3J0TnVtYmVyID0gcG9ydHNbMV07CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCBzID0gbmV3IERhdGFncmFtU29ja2V0KG5ldyBJbmV0U29ja2V0QWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW1iZXIpKTsKKyAgICAgICAgICAgIHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MoMSk6IgorICAgICAgICAgICAgICAgICAgICArIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkudG9TdHJpbmcoKSwgcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG9ydCkpKTsKKyAgICAgICAgICAgIHMuY2xvc2UoKTsKIAotCQkJLy8gbm93IGNyZWF0ZSBvbmUgdGhhdCBpcyBub3QgY29ubmVjdGVkIGFuZCB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUKLQkJCS8vIHJpZ2h0IGFuc3dlcgotCQkJRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOwotCQkJcG9ydE51bWJlciA9IHBvcnRzWzJdOwotCQkJdGhlU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCQlwb3J0TnVtYmVyKSk7Ci0JCQlhc3NlcnROdWxsKAotCQkJCQkiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzIC11bmNvbm5lY3RlZCBzb2NrZXQ6IgotCQkJCQkJCSsgIkV4cGVjdGVkOiBOVUxMIiwgdGhlU29ja2V0Ci0JCQkJCQkJLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSk7CisgICAgICAgICAgICAvLyBub3cgY3JlYXRlIG9uZSB0aGF0IGlzIG5vdCBjb25uZWN0ZWQgYW5kIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZQorICAgICAgICAgICAgLy8gcmlnaHQgYW5zd2VyCisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7CisgICAgICAgICAgICBwb3J0TnVtYmVyID0gcG9ydHNbMl07CisgICAgICAgICAgICB0aGVTb2NrZXQuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoCisgICAgICAgICAgICAgICAgICAgICJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MgLXVuY29ubmVjdGVkIHNvY2tldDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRXhwZWN0ZWQ6IE5VTEwiLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpKTsKIAotCQkJLy8gbm93IGNvbm5lY3QgYW5kIHZhbGlkYXRlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyCi0JCQl0aGVTb2NrZXQuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCXNwb3J0KSk7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MoMik6IgotCQkJCQkrIHRoZVNvY2tldC5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkudG9TdHJpbmcoKSwgdGhlU29ja2V0Ci0JCQkJCS5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkuZXF1YWxzKAotCQkJCQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQkJCQkJCXNwb3J0KSkpOwotCQkJdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAvLyBub3cgY29ubmVjdCBhbmQgdmFsaWRhdGUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgc3BvcnQpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJbmV0U29ja2V0QWRkcmVzcygyKToiCisgICAgICAgICAgICAgICAgICAgICsgdGhlU29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BvcnQpKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKIAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRSZW1vdGVTb2NrZXRBZGRyZXNzIHRlc3Q6ICIgKyBlKTsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0UmVtb3RlU29ja2V0QWRkcmVzcyB0ZXN0OiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldExvY2FsU29ja2V0QWRkcmVzcygpIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbFNvY2tldEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExvY2FsU29ja2V0QWRkcmVzcygpIHsKIAotCQl0cnkgewotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQlEYXRhZ3JhbVNvY2tldCBzID0gbmV3IERhdGFncmFtU29ja2V0KG5ldyBJbmV0U29ja2V0QWRkcmVzcygKLQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW1iZXIpKTsKLQkJCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJbmV0U29ja2V0QWRkcmVzcygxKToiCi0JCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpCi0JCQkJCSsgIkV4cGVjdGVkOiAiCi0JCQkJCSsgKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQkJCQlwb3J0TnVtYmVyKSkudG9TdHJpbmcoKSwgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKQotCQkJCQkuZXF1YWxzKAotCQkJCQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQkJCQkJCXBvcnROdW1iZXIpKSk7Ci0JCQlzLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzKDEpOiIKKyAgICAgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiRXhwZWN0ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKS50b1N0cmluZygpLCBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE51bWJlcikpKTsKKyAgICAgICAgICAgIHMuY2xvc2UoKTsKIAotCQkJSW5ldFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcmVzcyA9IChJbmV0U29ja2V0QWRkcmVzcykgcwotCQkJCQkuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpOworICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcmVzcyA9IChJbmV0U29ja2V0QWRkcmVzcykgcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpOwogCi0JCQkvLyBub3cgY3JlYXRlIGEgc29ja2V0IHRoYXQgaXMgbm90IGJvdW5kIGFuZCB2YWxpZGF0ZSB3ZSBnZXQgdGhlCi0JCQkvLyByaWdodCBhbnN3ZXIKLQkJCURhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKLQkJCWFzc2VydE51bGwoCi0JCQkJCSJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MgLXVuYm91bmQgc29ja2V0LSBFeHBlY3RlZCBudWxsIiwKLQkJCQkJdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgIC8vIG5vdyBjcmVhdGUgYSBzb2NrZXQgdGhhdCBpcyBub3QgYm91bmQgYW5kIHZhbGlkYXRlIHdlIGdldCB0aGUKKyAgICAgICAgICAgIC8vIHJpZ2h0IGFuc3dlcgorICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgKKyAgICAgICAgICAgICAgICAgICAgIlJldHVybmVkIGluY29ycmVjdCBJbmV0U29ja2V0QWRkcmVzcyAtdW5ib3VuZCBzb2NrZXQtIEV4cGVjdGVkIG51bGwiLAorICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkpOwogCi0JCQkvLyBub3cgYmluZCB0aGUgc29ja2V0IGFuZCBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIKLQkJCXBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQl0aGVTb2NrZXQuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCXBvcnROdW1iZXIpKTsKLQkJCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJbmV0U29ja2V0QWRkcmVzcygyKToiCi0JCQkJCSsgdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCkKLQkJCQkJKyAiRXhwZWN0ZWQ6ICIKLQkJCQkJKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCQkJCXBvcnROdW1iZXIpKS50b1N0cmluZygpLCB0aGVTb2NrZXQKLQkJCQkJLmdldExvY2FsU29ja2V0QWRkcmVzcygpLmVxdWFscygKLQkJCQkJCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQkJCQlwb3J0TnVtYmVyKSkpOwotCQkJdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAvLyBub3cgYmluZCB0aGUgc29ja2V0IGFuZCBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIKKyAgICAgICAgICAgIHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7CisgICAgICAgICAgICB0aGVTb2NrZXQuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJbmV0U29ja2V0QWRkcmVzcygyKToiCisgICAgICAgICAgICAgICAgICAgICsgdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiRXhwZWN0ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKS50b1N0cmluZygpLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsU29ja2V0QWRkcmVzcygpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TnVtYmVyKSkpOworICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CiAKLQkJCS8vIG5vdyB2YWxpZGF0ZSB0aGV0IGJlaGF2aW91ciB3aGVuIHRoZSBhbnkgYWRkcmVzcyBpcyByZXR1cm5lZAotCQkJcyA9IG5ldyBEYXRhZ3JhbVNvY2tldCgwKTsKKyAgICAgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGV0IGJlaGF2aW91ciB3aGVuIHRoZSBhbnkgYWRkcmVzcyBpcyByZXR1cm5lZAorICAgICAgICAgICAgcyA9IG5ldyBEYXRhZ3JhbVNvY2tldCgwKTsKIAotCQkJU3RyaW5nIHByZWZlcklQdjRTdGFja1ZhbHVlID0gU3lzdGVtCi0JCQkJCS5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NFN0YWNrIik7Ci0JCQlTdHJpbmcgcHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlID0gU3lzdGVtCi0JCQkJCS5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NkFkZHJlc3NlcyIpOwotCQkJaWYgKCgocHJlZmVySVB2NFN0YWNrVmFsdWUgPT0gbnVsbCkgfHwgcHJlZmVySVB2NFN0YWNrVmFsdWUKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpCi0JCQkJCSYmIChwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUgIT0gbnVsbCkKLQkJCQkJJiYgKHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZS5lcXVhbHMoInRydWUiKSkpIHsKLQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJIkFOWSBhZGRyZXNzIG5vdCByZXR1cm5lZCBjb3JyZWN0bHkgd2l0aCBwcmVmZXJJUHY2QWRkcmVzc2VzPXRydWUsIHByZWZlcklQdjRTdGFjaz1mYWxzZSAiCi0JCQkJCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKLQkJCQkJCSgoSW5ldFNvY2tldEFkZHJlc3MpIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkpCi0JCQkJCQkJCS5nZXRBZGRyZXNzKCkgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJIkFOWSBhZGRyZXNzIG5vdCByZXR1cm5lZCBjb3JyZWN0bHkgd2l0aCBwcmVmZXJJUHY2QWRkcmVzc2VzPXRydWUsIHByZWZlcklQdjRTdGFjaz10cnVlICIKLQkJCQkJCQkJKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAotCQkJCQkJKChJbmV0U29ja2V0QWRkcmVzcykgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSkKLQkJCQkJCQkJLmdldEFkZHJlc3MoKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcyk7Ci0JCQl9Ci0JCQlzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRMb2NhbFNvY2tldEFkZHJlc3MgdGVzdDogIiArIGUpOwotCQl9Ci0JfQorICAgICAgICAgICAgU3RyaW5nIHByZWZlcklQdjRTdGFja1ZhbHVlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NFN0YWNrIik7CisgICAgICAgICAgICBTdHJpbmcgcHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NkFkZHJlc3NlcyIpOworICAgICAgICAgICAgaWYgKCgocHJlZmVySVB2NFN0YWNrVmFsdWUgPT0gbnVsbCkgfHwgcHJlZmVySVB2NFN0YWNrVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpCisgICAgICAgICAgICAgICAgICAgICYmIChwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZS5lcXVhbHMoInRydWUiKSkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgIkFOWSBhZGRyZXNzIG5vdCByZXR1cm5lZCBjb3JyZWN0bHkgd2l0aCBwcmVmZXJJUHY2QWRkcmVzc2VzPXRydWUsIHByZWZlcklQdjRTdGFjaz1mYWxzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSW5ldFNvY2tldEFkZHJlc3MpIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgIkFOWSBhZGRyZXNzIG5vdCByZXR1cm5lZCBjb3JyZWN0bHkgd2l0aCBwcmVmZXJJUHY2QWRkcmVzc2VzPXRydWUsIHByZWZlcklQdjRTdGFjaz10cnVlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgKChJbmV0U29ja2V0QWRkcmVzcykgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRMb2NhbFNvY2tldEFkZHJlc3MgdGVzdDogIiArIGUpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFJldXNlQWRkcmVzcyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmV1c2VBZGRyZXNzWigpIHsKLQkJdHJ5IHsKLQkJCS8vIHRlc3QgY2FzZSB3ZXJlIHdlIHNldCBpdCB0byBmYWxzZQotCQkJRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0MSA9IG51bGw7Ci0JCQlEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygKLQkJCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyCi0JCQkJCQkJCS5nZXROZXh0UG9ydEZvclVEUCgpKTsKLQkJCQl0aGVTb2NrZXQxID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOwotCQkJCXRoZVNvY2tldDIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MS5zZXRSZXVzZUFkZHJlc3MoZmFsc2UpOwotCQkJCXRoZVNvY2tldDIuc2V0UmV1c2VBZGRyZXNzKGZhbHNlKTsKLQkJCQl0aGVTb2NrZXQxLmJpbmQodGhlQWRkcmVzcyk7Ci0JCQkJdGhlU29ja2V0Mi5iaW5kKHRoZUFkZHJlc3MpOwotCQkJCWZhaWwoCi0JCQkJCQkiTm8gZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZG8gZHVwbGljYXRlIHNvY2tldCBiaW5kIHdpdGggcmUtdXNlYWRkciBzZXQgdG8gZmFsc2UiKTsKLQkJCX0gY2F0Y2ggKEJpbmRFeGNlcHRpb24gZSkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmV1c2VBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmV1c2VBZGRyZXNzWigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRlc3QgY2FzZSB3ZXJlIHdlIHNldCBpdCB0byBmYWxzZQorICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0MSA9IG51bGw7CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQyID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROZXh0UG9ydEZvclVEUCgpKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQxID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0MS5zZXRSZXVzZUFkZHJlc3MoZmFsc2UpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIuc2V0UmV1c2VBZGRyZXNzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQxLmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZG8gZHVwbGljYXRlIHNvY2tldCBiaW5kIHdpdGggcmUtdXNlYWRkciBzZXQgdG8gZmFsc2UiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJpbmRFeGNlcHRpb24gZSkgewogCi0JCQl9Ci0JCQlpZiAodGhlU29ja2V0MSAhPSBudWxsKQotCQkJCXRoZVNvY2tldDEuY2xvc2UoKTsKLQkJCWlmICh0aGVTb2NrZXQyICE9IG51bGwpCi0JCQkJdGhlU29ja2V0Mi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoZVNvY2tldDEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQxLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAodGhlU29ja2V0MiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoZVNvY2tldDIuY2xvc2UoKTsKIAotCQkJLy8gdGVzdCBjYXNlIHdlcmUgd2Ugc2V0IGl0IHRvIHRydWUKLQkJCXRyeSB7Ci0JCQkJSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygKLQkJCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyCi0JCQkJCQkJCS5nZXROZXh0UG9ydEZvclVEUCgpKTsKLQkJCQl0aGVTb2NrZXQxID0gbmV3IERhdGFncmFtU29ja2V0KG51bGwpOwotCQkJCXRoZVNvY2tldDIgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MS5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0JCQkJdGhlU29ja2V0Mi5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0JCQkJdGhlU29ja2V0MS5iaW5kKHRoZUFkZHJlc3MpOwotCQkJCXRoZVNvY2tldDIuYmluZCh0aGVBZGRyZXNzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIGRvIGR1cGxpY2F0ZSBzb2NrZXQgYmluZCB3aXRoIHJlLXVzZWFkZHIgc2V0IHRvIHRydWUiKTsKLQkJCX0KLQkJCWlmICh0aGVTb2NrZXQxICE9IG51bGwpCi0JCQkJdGhlU29ja2V0MS5jbG9zZSgpOwotCQkJaWYgKHRoZVNvY2tldDIgIT0gbnVsbCkKLQkJCQl0aGVTb2NrZXQyLmNsb3NlKCk7CisgICAgICAgICAgICAvLyB0ZXN0IGNhc2Ugd2VyZSB3ZSBzZXQgaXQgdG8gdHJ1ZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5leHRQb3J0Rm9yVURQKCkpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0MiA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQxLnNldFJldXNlQWRkcmVzcyh0cnVlKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLnNldFJldXNlQWRkcmVzcyh0cnVlKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQxLmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZG8gZHVwbGljYXRlIHNvY2tldCBiaW5kIHdpdGggcmUtdXNlYWRkciBzZXQgdG8gdHJ1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoZVNvY2tldDEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQxLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAodGhlU29ja2V0MiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoZVNvY2tldDIuY2xvc2UoKTsKIAotCQkJLy8gdGVzdCB0aGUgZGVmYXVsdCBjYXNlIHdoaWNoIHdlIGV4cGVjdCB0byBiZSB0aGUgc2FtZSBvbiBhbGwKLQkJCS8vIHBsYXRmb3JtcwotCQkJdHJ5IHsKLQkJCQlJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKLQkJCQkJCQkJLmdldE5leHRQb3J0Rm9yVURQKCkpOwotCQkJCXRoZVNvY2tldDEgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MiA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKLQkJCQl0aGVTb2NrZXQxLmJpbmQodGhlQWRkcmVzcyk7Ci0JCQkJdGhlU29ja2V0Mi5iaW5kKHRoZUFkZHJlc3MpOwotCQkJCWZhaWwoCi0JCQkJCQkiTm8gZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZG8gZHVwbGljYXRlIHNvY2tldCBiaW5kIHdpdGggcmUtdXNlYWRkciBsZWZ0IGFzIGRlZmF1bHQiKTsKLQkJCX0gY2F0Y2ggKEJpbmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdGVzdCB0aGUgZGVmYXVsdCBjYXNlIHdoaWNoIHdlIGV4cGVjdCB0byBiZSB0aGUgc2FtZSBvbiBhbGwKKyAgICAgICAgICAgIC8vIHBsYXRmb3JtcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5leHRQb3J0Rm9yVURQKCkpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobnVsbCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0MiA9IG5ldyBEYXRhZ3JhbVNvY2tldChudWxsKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQxLmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZG8gZHVwbGljYXRlIHNvY2tldCBiaW5kIHdpdGggcmUtdXNlYWRkciBsZWZ0IGFzIGRlZmF1bHQiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJpbmRFeGNlcHRpb24gZSkgewogCi0JCQl9Ci0JCQlpZiAodGhlU29ja2V0MSAhPSBudWxsKQotCQkJCXRoZVNvY2tldDEuY2xvc2UoKTsKLQkJCWlmICh0aGVTb2NrZXQyICE9IG51bGwpCi0JCQkJdGhlU29ja2V0Mi5jbG9zZSgpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19SRVVTRUFERFIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1JFVVNFQUREUik7Ci0JCX0KLQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhlU29ja2V0MSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoZVNvY2tldDEuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmICh0aGVTb2NrZXQyICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5jbG9zZSgpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19SRVVTRUFERFIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1JFVVNFQUREUik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0UmV1c2VBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFJldXNlQWRkcmVzcygpIHsKLQkJdHJ5IHsKLQkJCURhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOwotCQkJdGhlU29ja2V0LnNldFJldXNlQWRkcmVzcyh0cnVlKTsKLQkJCWFzc2VydFRydWUoImdldFJldXNlQWRkcmVzcyBmYWxzZSB3aGVuIGl0IHNob3VsZCBiZSB0cnVlIiwKLQkJCQkJdGhlU29ja2V0LmdldFJldXNlQWRkcmVzcygpKTsKLQkJCXRoZVNvY2tldC5zZXRSZXVzZUFkZHJlc3MoZmFsc2UpOwotCQkJYXNzZXJ0RmFsc2UoImdldFJldXNlQWRkcmVzcyB0cnVlIHdoZW4gaXQgc2hvdWxkIGJlIEZhbHNlIiwKLQkJCQkJdGhlU29ja2V0LmdldFJldXNlQWRkcmVzcygpKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkVVU0VBRERSKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19SRVVTRUFERFIpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRSZXVzZUFkZHJlc3MoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZXVzZUFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJldXNlQWRkcmVzcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOworICAgICAgICAgICAgdGhlU29ja2V0LnNldFJldXNlQWRkcmVzcyh0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldFJldXNlQWRkcmVzcyBmYWxzZSB3aGVuIGl0IHNob3VsZCBiZSB0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmdldFJldXNlQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5zZXRSZXVzZUFkZHJlc3MoZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoImdldFJldXNlQWRkcmVzcyB0cnVlIHdoZW4gaXQgc2hvdWxkIGJlIEZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmdldFJldXNlQWRkcmVzcygpKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkVVU0VBRERSKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19SRVVTRUFERFIpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldEJyb2FkY2FzdChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnJvYWRjYXN0WigpIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjc2V0QnJvYWRjYXN0KGJvb2xlYW4pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJyb2FkY2FzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEJyb2FkY2FzdFooKSB7CiAKLQkJdHJ5IHsKLQkJCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMyk7Ci0JCQlEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQocG9ydHNbMF0pOwotCQkJdGhlU29ja2V0LnNldEJyb2FkY2FzdChmYWxzZSk7Ci0JCQlieXRlIHRoZUJ5dGVzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDMpOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzBdKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5zZXRCcm9hZGNhc3QoZmFsc2UpOworICAgICAgICAgICAgYnl0ZSB0aGVCeXRlc1tdID0geyAtMSwgLTEsIC0xLCAtMSB9OwogCi0JCQkvLyB2YWxpZGF0ZSB3ZSBjYW5ub3QgY29ubmVjdCB0byB0aGUgYnJvYWRjYXN0IGFkZHJlc3Mgd2hlbgotCQkJLy8gc2V0QnJvYWRjYXN0IGlzIGZhbHNlCi0JCQl0cnkgewotCQkJCXRoZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkJLmdldEJ5QWRkcmVzcyh0aGVCeXRlcyksIHBvcnRzWzFdKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoCi0JCQkJCQkiTm8gZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBicm9hZGNhc3QgYWRkcmVzcyB3aXRoIHNldEJyb2FkY2FzdChmYWxzZSkiLAotCQkJCQkJdGhlU29ja2V0LmdldEJyb2FkY2FzdCgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJfQorICAgICAgICAgICAgLy8gdmFsaWRhdGUgd2UgY2Fubm90IGNvbm5lY3QgdG8gdGhlIGJyb2FkY2FzdCBhZGRyZXNzIHdoZW4KKyAgICAgICAgICAgIC8vIHNldEJyb2FkY2FzdCBpcyBmYWxzZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeUFkZHJlc3ModGhlQnl0ZXMpLCBwb3J0c1sxXSkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYnJvYWRjYXN0IGFkZHJlc3Mgd2l0aCBzZXRCcm9hZGNhc3QoZmFsc2UpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5nZXRCcm9hZGNhc3QoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gbm93IHZhbGlkYXRlIHRoYXQgd2UgY2FuIGNvbm5lY3QgdG8gdGhlIGJyb2FkY2FzdCBhZGRyZXNzIHdoZW4KLQkJCS8vIHNldEJyb2FkY2FzdCBpcyB0cnVlCi0JCQl0aGVTb2NrZXQuc2V0QnJvYWRjYXN0KHRydWUpOwotCQkJdGhlU29ja2V0Ci0JCQkJCS5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkJCS5nZXRCeUFkZHJlc3ModGhlQnl0ZXMpLCBwb3J0c1syXSkpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19CUk9BRENBU1QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX0JST0FEQ0FTVCk7Ci0JCX0KLQl9CisgICAgICAgICAgICAvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBjYW4gY29ubmVjdCB0byB0aGUgYnJvYWRjYXN0IGFkZHJlc3Mgd2hlbgorICAgICAgICAgICAgLy8gc2V0QnJvYWRjYXN0IGlzIHRydWUKKyAgICAgICAgICAgIHRoZVNvY2tldC5zZXRCcm9hZGNhc3QodHJ1ZSk7CisgICAgICAgICAgICB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJ5QWRkcmVzcyh0aGVCeXRlcyksIHBvcnRzWzJdKSk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX0JST0FEQ0FTVCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fQlJPQURDQVNUKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRCcm9hZGNhc3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0QnJvYWRjYXN0KCkgewotCQl0cnkgewotCQkJRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KCk7Ci0JCQl0aGVTb2NrZXQuc2V0QnJvYWRjYXN0KHRydWUpOwotCQkJYXNzZXJ0VHJ1ZSgiZ2V0QnJvYWRjYXN0IGZhbHNlIHdoZW4gaXQgc2hvdWxkIGJlIHRydWUiLCB0aGVTb2NrZXQKLQkJCQkJLmdldEJyb2FkY2FzdCgpKTsKLQkJCXRoZVNvY2tldC5zZXRCcm9hZGNhc3QoZmFsc2UpOwotCQkJYXNzZXJ0RmFsc2UoImdldEJyb2FkY2FzdCB0cnVlIHdoZW4gaXQgc2hvdWxkIGJlIEZhbHNlIiwgdGhlU29ja2V0Ci0JCQkJCS5nZXRCcm9hZGNhc3QoKSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX0JST0FEQ0FTVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fQlJPQURDQVNUKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0QnJvYWRjYXN0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QnJvYWRjYXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCcm9hZGNhc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5zZXRCcm9hZGNhc3QodHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRCcm9hZGNhc3QgZmFsc2Ugd2hlbiBpdCBzaG91bGQgYmUgdHJ1ZSIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgICAgICAuZ2V0QnJvYWRjYXN0KCkpOworICAgICAgICAgICAgdGhlU29ja2V0LnNldEJyb2FkY2FzdChmYWxzZSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiZ2V0QnJvYWRjYXN0IHRydWUgd2hlbiBpdCBzaG91bGQgYmUgRmFsc2UiLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgLmdldEJyb2FkY2FzdCgpKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fQlJPQURDQVNUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19CUk9BRENBU1QpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFRyYWZmaWNDbGFzcyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRUcmFmZmljQ2xhc3NJKCkgewotCQl0cnkgewotCQkJaW50IElQVE9TX0xPV0NPU1QgPSAweDI7Ci0JCQlpbnQgSVBUT1NfUkVMSUFCSUxUWSA9IDB4NDsKLQkJCWludCBJUFRPU19USFJPVUdIUFVUID0gMHg4OwotCQkJaW50IElQVE9TX0xPV0RFTEFZID0gMHgxMDsKLQkJCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I3NldFRyYWZmaWNDbGFzcyhpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRyYWZmaWNDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VHJhZmZpY0NsYXNzSSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBJUFRPU19MT1dDT1NUID0gMHgyOworICAgICAgICAgICAgaW50IElQVE9TX1JFTElBQklMVFkgPSAweDQ7CisgICAgICAgICAgICBpbnQgSVBUT1NfVEhST1VHSFBVVCA9IDB4ODsKKyAgICAgICAgICAgIGludCBJUFRPU19MT1dERUxBWSA9IDB4MTA7CisgICAgICAgICAgICBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDIpOwogCi0JCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCXBvcnRzWzBdKTsKLQkJCURhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7CisgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgIHBvcnRzWzBdKTsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7CiAKLQkJCS8vIHZhbGlkYXRlIHRoYXQgdmFsdWUgc2V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUKLQkJCXRyeSB7Ci0JCQkJdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcygyNTYpOwotCQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIHRyYWZmaWMgY2xhc3Mgc2V0IHRvIDI1NiIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0KKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgdmFsdWUgc2V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcygyNTYpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIHRyYWZmaWMgY2xhc3Mgc2V0IHRvIDI1NiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KIAotCQkJdHJ5IHsKLQkJCQl0aGVTb2NrZXQuc2V0VHJhZmZpY0NsYXNzKC0xKTsKLQkJCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiB0cmFmZmljIGNsYXNzIHNldCB0byAtMSIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcygtMSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gdHJhZmZpYyBjbGFzcyBzZXQgdG8gLTEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CiAKLQkJCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBzZXQgaXQgdG8gc29tZSBnb29kIHZhbHVlcwotCQkJdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcyhJUFRPU19MT1dDT1NUKTsKLQkJCXRoZVNvY2tldC5zZXRUcmFmZmljQ2xhc3MoSVBUT1NfVEhST1VHSFBVVCk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKElQX1RPUyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgSVBfVE9TKTsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBzZXQgaXQgdG8gc29tZSBnb29kIHZhbHVlcworICAgICAgICAgICAgdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcyhJUFRPU19MT1dDT1NUKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5zZXRUcmFmZmljQ2xhc3MoSVBUT1NfVEhST1VHSFBVVCk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKElQX1RPUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgSVBfVE9TKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRUcmFmZmljQ2xhc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhZmZpY0NsYXNzKCkgewotCQl0cnkgewotCQkJaW50IElQVE9TX0xPV0NPU1QgPSAweDI7Ci0JCQlpbnQgSVBUT1NfUkVMSUFCSUxUWSA9IDB4NDsKLQkJCWludCBJUFRPU19USFJPVUdIUFVUID0gMHg4OwotCQkJaW50IElQVE9TX0xPV0RFTEFZID0gMHgxMDsKLQkJCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LkRhdGFncmFtU29ja2V0I2dldFRyYWZmaWNDbGFzcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRyYWZmaWNDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhZmZpY0NsYXNzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IElQVE9TX0xPV0NPU1QgPSAweDI7CisgICAgICAgICAgICBpbnQgSVBUT1NfUkVMSUFCSUxUWSA9IDB4NDsKKyAgICAgICAgICAgIGludCBJUFRPU19USFJPVUdIUFVUID0gMHg4OworICAgICAgICAgICAgaW50IElQVE9TX0xPV0RFTEFZID0gMHgxMDsKKyAgICAgICAgICAgIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CiAKLQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQkJcG9ydHNbMF0pOwotCQkJRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgcG9ydHNbMF0pOworICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKIAotCQkJLyoKLQkJCSAqIHdlIGNhbm5vdCBhY3R1YWxseSBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgYXJlIHNldCBhcyBpZiBhIHBsYXRmb3JtCi0JCQkgKiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcHRpb24gdGhlbiBpdCBtYXkgY29tZSBiYWNrIHVuc2V0IGV2ZW4KLQkJCSAqIHRob3VnaCB3ZSBzZXQgaXQgc28ganVzdCBnZXQgdGhlIHZhbHVlIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZ2V0IGl0Ci0JCQkgKi8KLQkJCWludCB0cmFmZmljQ2xhc3MgPSB0aGVTb2NrZXQuZ2V0VHJhZmZpY0NsYXNzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgSVBfVE9TKTsKLQkJfQotCX0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiB3ZSBjYW5ub3QgYWN0dWFsbHkgY2hlY2sgdGhhdCB0aGUgdmFsdWVzIGFyZSBzZXQgYXMgaWYgYSBwbGF0Zm9ybQorICAgICAgICAgICAgICogZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3B0aW9uIHRoZW4gaXQgbWF5IGNvbWUgYmFjayB1bnNldCBldmVuCisgICAgICAgICAgICAgKiB0aG91Z2ggd2Ugc2V0IGl0IHNvIGp1c3QgZ2V0IHRoZSB2YWx1ZSB0byBtYWtlIHN1cmUgd2UgY2FuIGdldCBpdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgdHJhZmZpY0NsYXNzID0gdGhlU29ja2V0LmdldFRyYWZmaWNDbGFzcygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIElQX1RPUyk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjaXNDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfaXNDbG9zZWQoKSB7Ci0JCXRyeSB7Ci0JCQlEYXRhZ3JhbVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjaXNDbG9zZWQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQ2xvc2VkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9pc0Nsb3NlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERhdGFncmFtU29ja2V0IHRoZVNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOwogCi0JCQkvLyB2YWxpZGF0ZSBpc0Nsb3NlZCByZXR1cm5zIGV4cGVjdGVkIHZhbHVlcwotCQkJYXNzZXJ0RmFsc2UoIlNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgbm90IGNsb3NlZCgxKToiLAotCQkJCQl0aGVTb2NrZXQuaXNDbG9zZWQoKSk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIlNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgbm90IGNsb3NlZCgxKToiLCB0aGVTb2NrZXQKLQkJCQkJLmlzQ2xvc2VkKCkpOworICAgICAgICAgICAgLy8gdmFsaWRhdGUgaXNDbG9zZWQgcmV0dXJucyBleHBlY3RlZCB2YWx1ZXMKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJTb2NrZXQgc2hvdWxkIGluZGljYXRlIGl0IGlzIG5vdCBjbG9zZWQoMSk6IiwKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQ2xvc2VkKCkpOworICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgc2hvdWxkIGluZGljYXRlIGl0IGlzIG5vdCBjbG9zZWQoMSk6IiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgICAgIC5pc0Nsb3NlZCgpKTsKIAotCQkJSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7Ci0JCQl0aGVTb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQodGhlQWRkcmVzcyk7Ci0JCQlhc3NlcnRGYWxzZSgiU29ja2V0IHNob3VsZCBpbmRpY2F0ZSBpdCBpcyBub3QgY2xvc2VkKDIpOiIsCi0JCQkJCXRoZVNvY2tldC5pc0Nsb3NlZCgpKTsKLQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IHNob3VsZCBpbmRpY2F0ZSBpdCBpcyBub3QgY2xvc2VkKDIpOiIsIHRoZVNvY2tldAotCQkJCQkuaXNDbG9zZWQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJHb3QgZXhjZXB0aW9uIGR1cmluZyBpc0Nsb3NlZCB0ZXN0cyIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCNnZXRDaGFubmVsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldENoYW5uZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChuZXcgRGF0YWdyYW1Tb2NrZXQoKS5nZXRDaGFubmVsKCkpOwotCX0KKyAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCkpOworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KHRoZUFkZHJlc3MpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgbm90IGNsb3NlZCgyKToiLAorICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNDbG9zZWQoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgbm90IGNsb3NlZCgyKToiLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgLmlzQ2xvc2VkKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiR290IGV4Y2VwdGlvbiBkdXJpbmcgaXNDbG9zZWQgdGVzdHMiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQjZ2V0Q2hhbm5lbCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUZXN0IHRvbyBzaW1wbGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2hhbm5lbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhbm5lbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKG5ldyBEYXRhZ3JhbVNvY2tldCgpLmdldENoYW5uZWwoKSk7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCXJldHZhbCA9ICJCb2d1cyByZXR2YWwiOwotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcmV0dmFsID0gIkJvZ3VzIHJldHZhbCI7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlkcy5jbG9zZSgpOwotCQkJc2RzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcy5jbG9zZSgpOworICAgICAgICAgICAgc2RzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZWNlaXZlX292ZXJzaXplX2phdmFfbmV0X0RhdGFncmFtUGFja2V0KCkgewotCQlmaW5hbCBpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDIpOwotCQlmaW5hbCBpbnQgcG9ydE51bWJlciA9IHBvcnRzWzBdOworICAgIHByb3RlY3RlZCB2b2lkIHJlY2VpdmVfb3ZlcnNpemVfamF2YV9uZXRfRGF0YWdyYW1QYWNrZXQoKSB7CisgICAgICAgIGZpbmFsIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgICAgIGZpbmFsIGludCBwb3J0TnVtYmVyID0gcG9ydHNbMF07CiAKLQkJY2xhc3MgVGVzdERHUmN2T3ZlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3QgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWxvY2FsSG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCURhdGFncmFtU29ja2V0IHNkcyA9IG5ldyBEYXRhZ3JhbVNvY2tldChwb3J0c1sxXSk7Ci0JCQkJCURhdGFncmFtUGFja2V0IHJkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgiMDEyMzQ1Njc4OSIKLQkJCQkJCQkuZ2V0Qnl0ZXMoKSwgMTAsIGxvY2FsSG9zdCwgcG9ydE51bWJlcik7Ci0JCQkJCXNkcy5zZW5kKHJkcCk7Ci0JCQkJCXNkcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiaG9zdCAiICsgbG9jYWxIb3N0ICsgIiBwb3J0ICIKLQkJCQkJCQkrIHBvcnROdW1iZXIgKyAiIGZhaWxlZCB0byBzZW5kIG92ZXJzaXplIGRhdGE6ICIKLQkJCQkJCQkrIGUpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBjbGFzcyBUZXN0REdSY3ZPdmVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsSG9zdCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgc2RzID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcmRwID0gbmV3IERhdGFncmFtUGFja2V0KCIwMTIzNDU2Nzg5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpLCAxMCwgbG9jYWxIb3N0LCBwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgc2RzLnNlbmQocmRwKTsKKyAgICAgICAgICAgICAgICAgICAgc2RzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJob3N0ICIgKyBsb2NhbEhvc3QgKyAiIHBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcG9ydE51bWJlciArICIgZmFpbGVkIHRvIHNlbmQgb3ZlcnNpemUgZGF0YTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZSk7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCW5ldyBUaHJlYWQobmV3IFRlc3RER1Jjdk92ZXIoKSwgIkRHU2VuZGVyT3ZlciIpLnN0YXJ0KCk7Ci0JCQlkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKLQkJCWRzLnNldFNvVGltZW91dCg2MDAwKTsKLQkJCWJ5dGUgcmJ1ZltdID0gbmV3IGJ5dGVbNV07Ci0JCQlEYXRhZ3JhbVBhY2tldCByZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQocmJ1ZiwgcmJ1Zi5sZW5ndGgpOwotCQkJOwotCQkJZHMucmVjZWl2ZShyZHApOwotCQkJZHMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoIlNlbmQvUmVjZWl2ZSBvdmVyc2l6ZSBmYWlsZWQgdG8gcmV0dXJuIGNvcnJlY3QgZGF0YTogIgotCQkJCQkrIG5ldyBTdHJpbmcocmJ1ZiwgMCwgNSksIG5ldyBTdHJpbmcocmJ1ZiwgMCwgNSkKLQkJCQkJLmVxdWFscygiMDEyMzQiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgc2VuZCB0ZXN0OiAiICsgZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZmFpbCgicG9ydCAiICsgcG9ydE51bWJlciArICIgRXhjZXB0aW9uOiAiICsgZQotCQkJCQkrICIgZHVyaW5nIG92ZXJzaXplIHNlbmQgdGVzdCIpOwotCQl9IGZpbmFsbHkgewotCQkJZHMuY2xvc2UoKTsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFRlc3RER1Jjdk92ZXIoKSwgIkRHU2VuZGVyT3ZlciIpLnN0YXJ0KCk7CisgICAgICAgICAgICBkcyA9IG5ldyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldChwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIGRzLnNldFNvVGltZW91dCg2MDAwKTsKKyAgICAgICAgICAgIGJ5dGUgcmJ1ZltdID0gbmV3IGJ5dGVbNV07CisgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCByZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQocmJ1ZiwgcmJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgOworICAgICAgICAgICAgZHMucmVjZWl2ZShyZHApOworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNlbmQvUmVjZWl2ZSBvdmVyc2l6ZSBmYWlsZWQgdG8gcmV0dXJuIGNvcnJlY3QgZGF0YTogIgorICAgICAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcocmJ1ZiwgMCwgNSksIG5ldyBTdHJpbmcocmJ1ZiwgMCwgNSkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiMDEyMzQiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgc2VuZCB0ZXN0OiAiICsgZSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgicG9ydCAiICsgcG9ydE51bWJlciArICIgRXhjZXB0aW9uOiAiICsgZQorICAgICAgICAgICAgICAgICAgICArICIgZHVyaW5nIG92ZXJzaXplIHNlbmQgdGVzdCIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZHMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvRXhjbHVkZWRQcm94eVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvRXhjbHVkZWRQcm94eVRlc3QuamF2YQppbmRleCA1NTRjNDIyLi40MzI1MGExIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0V4Y2x1ZGVkUHJveHlUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9FeGNsdWRlZFByb3h5VGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CkBAIC0zOCwxMCArNDMsMjAgQEAKICAqIAogICovCiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJveHkuY2xhc3MpIAogcHVibGljIGNsYXNzIEV4Y2x1ZGVkUHJveHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbiN1c2luZ1Byb3h5KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRlc3RzIFByb3h5IGZ1bmN0aW9uYWxpdHkuIEluZGlyZWN0IHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJveHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuUHJveHkuVHlwZS5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91c2luZ1Byb3h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwKQEAgLTExNiw2ICsxMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0SW1wbCNTb2NrZXRJbXBsKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgcHVycG9zZSA9ICJUZXN0cyBQcm94eSBmdW5jdGlvbmFsaXR5LiBJbmRpcmVjdCB0ZXN0LiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3h5IiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuUHJveHkuVHlwZS5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICApCisgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTU2LDYgKzE4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkwjb3BlbkNvbm5lY3Rpb24oUHJveHkpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgIHB1cnBvc2UgPSAiVGVzdHMgUHJveHkgZnVuY3Rpb25hbGl0eS4gSW5kaXJlY3QgdGVzdC4iLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcm94eSIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlByb3h5LlR5cGUuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29wZW5Db25uZWN0aW9uTGphdmFfbmV0X1Byb3h5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU29ja2V0QWRkcmVzcyBhZGRyMSA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygKICAgICAgICAgICAgICAgICBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uUHJveHlTZXJ2ZXJUZXN0SG9zdCwgODA4KTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvSmFyVVJMQ29ubmVjdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvSmFyVVJMQ29ubmVjdGlvblRlc3QuamF2YQppbmRleCA3ZDFlYmRhLi5mOTI4NzRjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L0phclVSTENvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9KYXJVUkxDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC0zNCwxMSArMzksMTIgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSmFyVVJMQ29ubmVjdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSmFyVVJMQ29ubmVjdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JSmFyVVJMQ29ubmVjdGlvbiBqdWM7CisgICAgSmFyVVJMQ29ubmVjdGlvbiBqdWM7CiAKLQlVUkxDb25uZWN0aW9uIHVjOworICAgIFVSTENvbm5lY3Rpb24gdWM7CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJMIEJBU0UgPSBnZXRCYXNlVVJMKCk7CiAgICAgCkBAIC00OSwyMyArNTUsNDEgQEAKICAgICAgICAgcmV0dXJuIEphclVSTENvbm5lY3Rpb25UZXN0LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UocGFjayk7CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkphclVSTENvbm5lY3Rpb24jZ2V0QXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJVVJMIHUgPSBuZXcgVVJMKCJqYXI6IgorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uI2dldEF0dHJpYnV0ZXMoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEF0dHJpYnV0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgVVJMIHUgPSBuZXcgVVJMKCJqYXI6IgogICAgICAgICAgICAgICAgICsgQkFTRS50b1N0cmluZygpKyIvbGYuamFyIS9zd3QuZGxsIik7CiAgICAgICAgIGp1YyA9IChKYXJVUkxDb25uZWN0aW9uKSB1Lm9wZW5Db25uZWN0aW9uKCk7CiAgICAgICAgIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBhID0ganVjLmdldEphckVudHJ5KCkuZ2V0QXR0cmlidXRlcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBBdHRyaWJ1dGVzIiwgIlNIQSBNRDUiLCBhCiAgICAgICAgICAgICAgICAgLmdldChuZXcgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzLk5hbWUoIkRpZ2VzdC1BbGdvcml0aG1zIikpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRocm93cyBFeGNlcHRpb24gCi0JICogQHRlc3RzIGphdmEubmV0LkphclVSTENvbm5lY3Rpb24jZ2V0RW50cnlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEVudHJ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIAorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uI2dldEVudHJ5TmFtZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW50cnlOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0RW50cnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSTCB1ID0gbmV3IFVSTCgiamFyOiIKICAgICAgICAgICAgICAgICArIEJBU0UudG9TdHJpbmcoKSsiL2xmLmphciEvcGx1cy5ibXAiKTsKICAgICAgICAganVjID0gKEphclVSTENvbm5lY3Rpb24pIHUub3BlbkNvbm5lY3Rpb24oKTsKQEAgLTc2LDEzICsxMDAsMjIgQEAKICAgICAgICAgYXNzZXJ0TnVsbCgiUmV0dXJuZWQgaW5jb3JyZWN0IGVudHJ5TmFtZSIsIGp1Yy5nZXRFbnRyeU5hbWUoKSk7CiAvLyAgICAgIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaGFybW9ueS0zMDUzCiAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJqYXI6ZmlsZTovLy9iYXIuamFyIS9mb28uamFyIS9CdWdzL0hlbGxvV29ybGQuY2xhc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28uamFyIS9CdWdzL0hlbGxvV29ybGQuY2xhc3MiLCgoSmFyVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKSkuZ2V0RW50cnlOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvby5qYXIhL0J1Z3MvSGVsbG9Xb3JsZC5jbGFzcyIsKChKYXJVUkxDb25uZWN0aW9uKXVybC5vcGVuQ29ubmVjdGlvbigpKS5nZXRFbnRyeU5hbWUoKSk7CiAgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LkphclVSTENvbm5lY3Rpb24jZ2V0SmFyRW50cnkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0SmFyRW50cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbiNnZXRKYXJFbnRyeSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SmFyRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRKYXJFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUkwgdSA9IG5ldyBVUkwoImphcjoiCiAgICAgICAgICAgICAgICAgKyBCQVNFLnRvU3RyaW5nKCkrIi9sZi5qYXIhL3BsdXMuYm1wIik7CiAgICAgICAgIGp1YyA9IChKYXJVUkxDb25uZWN0aW9uKSB1Lm9wZW5Db25uZWN0aW9uKCk7CkBAIC05MSwxMiArMTI0LDIxIEBACiAgICAgICAgIHUgPSBuZXcgVVJMKCJqYXI6IiArIEJBU0UudG9TdHJpbmcoKSsiL2xmLmphciEvIik7CiAgICAgICAgIGp1YyA9IChKYXJVUkxDb25uZWN0aW9uKSB1Lm9wZW5Db25uZWN0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoIlJldHVybmVkIGluY29ycmVjdCBKYXJFbnRyeSIsIGp1Yy5nZXRKYXJFbnRyeSgpKTsKLQl9CisgICAgfQogCi0JLyoqCisgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkphclVSTENvbm5lY3Rpb24jZ2V0SmFyRmlsZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRKYXJGaWxlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEphckZpbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRKYXJGaWxlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBVUkwgdXJsID0gbnVsbDsKICAgICAgICAgdXJsID0gbmV3IFVSTCgiamFyOiIKICAgICAgICAgICAgICAgICArIEJBU0UudG9TdHJpbmcoKSsiL2xmLmphciEvbWlzc2luZyIpOwpAQCAtMTM4LDEyICsxODAsMjEgQEAKICAgICAgICAgamYxLmNsb3NlKCk7CiAgICAgfQogCi0JLyoqCisgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkphclVSTENvbm5lY3Rpb24uZ2V0SmFyRmlsZSgpCiAgICAgICogCiAgICAgICogUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTI5CiAgICAgICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRKYXJGaWxlMjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRKYXJGaWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRKYXJGaWxlMjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBqYXJGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiMSsyIDMiLCAidGVzdC5qYXIiKTsKICAgICAgICAgamFyRmlsZS5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgSmFyT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oamFyRmlsZSkpOwpAQCAtMTU4LDYgKzIwOSwxNSBAQAogICAgIH0KICAgICAKICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzQzNgorQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldFVzZUNhY2hlcyIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFVzZUNhY2hlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIHJlc291cmNlcyA9IFN1cHBvcnRfUmVzb3VyY2VzLmNyZWF0ZVRlbXBGb2xkZXIoKTsKICAgICAgICAgU3VwcG9ydF9SZXNvdXJjZXMuY29weUZpbGUocmVzb3VyY2VzLCBudWxsLCAiaHl0c19hdHQuamFyIik7CkBAIC0xODYsMTAgKzI0NiwxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0JLyoqCisgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LkphclVSTENvbm5lY3Rpb24jZ2V0SmFyRmlsZVVSTCgpCiAgICAgICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRKYXJGaWxlVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SmFyRmlsZVVSTCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEphckZpbGVVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVVJMIGZpbGVVUkwgPSBuZXcgVVJMKEJBU0UudG9TdHJpbmcoKSsiL2xmLmphciIpOwogICAgICAgICBVUkwgdSA9IG5ldyBVUkwoImphcjoiCiAgICAgICAgICAgICAgICAgKyBCQVNFLnRvU3RyaW5nKCkrIi9sZi5qYXIhL3BsdXMuYm1wIik7CkBAIC0yMDEsMTAgKzI3MCwxOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6L2Jhci5qYXIiLCgoSmFyVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKSkuZ2V0SmFyRmlsZVVSTCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uI2dldE1haW5BdHRyaWJ1dGVzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE1haW5BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbiNnZXRNYWluQXR0cmlidXRlcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWFpbkF0dHJpYnV0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRNYWluQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgIFVSTCB1ID0gbmV3IFVSTCgiamFyOiIKICAgICAgICAgICAgICAgICArIEJBU0UudG9TdHJpbmcoKSsiL2xmLmphciEvc3d0LmRsbCIpOwogICAgICAgICBqdWMgPSAoSmFyVVJMQ29ubmVjdGlvbikgdS5vcGVuQ29ubmVjdGlvbigpOwpAQCAtMjE2LDYgKzI5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uI2dldElucHV0U3RyZWFtKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnB1dFN0cmVhbV9EZWxldGVKYXJGaWxlVXNpbmdVUkxDb25uZWN0aW9uKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgamFyRmlsZU5hbWUgPSAiZmlsZS5qYXIiOwpAQCAtMjM4LDkgKzMyNSw5IEBACiAgICAgfQogCiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTWFsZm9ybWVkVVJMRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMWM0YWU2ZS4uZmMwZjY1ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDU3ICsxNyw4MSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogCitAVGVzdFRhcmdldENsYXNzKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uI01hbGZvcm1lZFVSTEV4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbigpCi0JCWJvb2xlYW4gcGFzc2VkOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCW5ldyBVUkwoIm5vdEFQcm90b2NvbDovL3d3dy5pYm0uY29tIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3JyZWN0Ci0JCQlwYXNzZWQgPSB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiV3JvbmcgZXhjZXB0aW9uIHRocm93biA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHRocm93IGNvcnJlY3QgZXhjZXB0aW9uIiwgcGFzc2VkKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiNNYWxmb3JtZWRVUkxFeGNlcHRpb24oKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24oKQorICAgICAgICBib29sZWFuIHBhc3NlZDsKKyAgICAgICAgcGFzc2VkID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVVJMKCJub3RBUHJvdG9jb2w6Ly93d3cuaWJtLmNvbSIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gY29ycmVjdAorICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIldyb25nIGV4Y2VwdGlvbiB0aHJvd24gOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byB0aHJvdyBjb3JyZWN0IGV4Y2VwdGlvbiIsIHBhc3NlZCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiNNYWxmb3JtZWRVUkxFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkJZmluYWwgU3RyaW5nIG15U3RyaW5nID0gIkdhd3NoISI7Ci0JCXRyeSB7Ci0JCQlpZiAodHJ1ZSkKLQkJCQl0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKG15U3RyaW5nKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBleGNlcHRpb24gdGV4dCIsIGUudG9TdHJpbmcoKS5pbmRleE9mKAotCQkJCQlteVN0cmluZykgPj0gMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiNNYWxmb3JtZWRVUkxFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNYWxmb3JtZWRVUkxFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgZmluYWwgU3RyaW5nIG15U3RyaW5nID0gIkdhd3NoISI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodHJ1ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKG15U3RyaW5nKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBleGNlcHRpb24gdGV4dCIsIGUudG9TdHJpbmcoKS5pbmRleE9mKAorICAgICAgICAgICAgICAgICAgICBteVN0cmluZykgPj0gMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTXVsdGljYXN0U29ja2V0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9NdWx0aWNhc3RTb2NrZXRUZXN0LmphdmEKaW5kZXggZWMyYjAwNS4uM2RmYjA5NyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9NdWx0aWNhc3RTb2NrZXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9NdWx0aWNhc3RTb2NrZXRUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuQmluZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKQEAgLTM0LDE4MyArMzksMjIwIEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X05ldHdvcmtJbnRlcmZhY2U7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1BvcnRNYW5hZ2VyOwogCitAVGVzdFRhcmdldENsYXNzKE11bHRpY2FzdFNvY2tldC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTXVsdGljYXN0U29ja2V0VGVzdCBleHRlbmRzIFNvY2tldFRlc3RDYXNlIHsKIAotCVRocmVhZCB0OworICAgIFRocmVhZCB0OwogCi0JTXVsdGljYXN0U29ja2V0IG1zczsKKyAgICBNdWx0aWNhc3RTb2NrZXQgbXNzOwogCi0JTXVsdGljYXN0U2VydmVyIHNlcnZlcjsKKyAgICBNdWx0aWNhc3RTZXJ2ZXIgc2VydmVyOwogCi0JLy8gcHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVzIHVzZWQgZm9yIHRlc3RzCi0JYm9vbGVhbiBhdExlYXN0T25lSW50ZXJmYWNlID0gZmFsc2U7CisgICAgLy8gcHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVzIHVzZWQgZm9yIHRlc3RzCisgICAgYm9vbGVhbiBhdExlYXN0T25lSW50ZXJmYWNlID0gZmFsc2U7CiAKLQlib29sZWFuIGF0TGVhc3RUd29JbnRlcmZhY2VzID0gZmFsc2U7CisgICAgYm9vbGVhbiBhdExlYXN0VHdvSW50ZXJmYWNlcyA9IGZhbHNlOwogCi0JcHJpdmF0ZSBOZXR3b3JrSW50ZXJmYWNlIG5ldHdvcmtJbnRlcmZhY2UxID0gbnVsbDsKKyAgICBwcml2YXRlIE5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZTEgPSBudWxsOwogCi0JcHJpdmF0ZSBOZXR3b3JrSW50ZXJmYWNlIG5ldHdvcmtJbnRlcmZhY2UyID0gbnVsbDsKKyAgICBwcml2YXRlIE5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZTIgPSBudWxsOwogCi0JcHJpdmF0ZSBOZXR3b3JrSW50ZXJmYWNlIElQVjZuZXR3b3JrSW50ZXJmYWNlMSA9IG51bGw7CisgICAgcHJpdmF0ZSBOZXR3b3JrSW50ZXJmYWNlIElQVjZuZXR3b3JrSW50ZXJmYWNlMSA9IG51bGw7CiAKLQlzdGF0aWMgY2xhc3MgTXVsdGljYXN0U2VydmVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICBzdGF0aWMgY2xhc3MgTXVsdGljYXN0U2VydmVyIGV4dGVuZHMgVGhyZWFkIHsKIAotCQlwdWJsaWMgTXVsdGljYXN0U29ja2V0IG1zOworICAgICAgICBwdWJsaWMgTXVsdGljYXN0U29ja2V0IG1zOwogCi0JCWJvb2xlYW4gcnVubmluZyA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IHRydWU7CiAKLQkJdm9sYXRpbGUgcHVibGljIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgdm9sYXRpbGUgcHVibGljIGJ5dGVbXSByYnVmID0gbmV3IGJ5dGVbNTEyXTsKIAotCQl2b2xhdGlsZSBEYXRhZ3JhbVBhY2tldCByZHAgPSBudWxsOworICAgICAgICB2b2xhdGlsZSBEYXRhZ3JhbVBhY2tldCByZHAgPSBudWxsOwogCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKHJ1bm5pbmcpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1zLnJlY2VpdmUocmRwKTsKLQkJCQkJfSBjYXRjaCAoamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRocmVhZC55aWVsZCgpOwotCQkJCQl9Ci0JCQkJCTsKLQkJCQl9Ci0JCQkJOwotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aWNhc3Qgc2VydmVyIGZhaWxlZDogIiArIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltcy5jbG9zZSgpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zLnJlY2VpdmUocmRwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aWNhc3Qgc2VydmVyIGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGxlYXZlR3JvdXAoSW5ldEFkZHJlc3MgYUdyb3VwKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJCW1zLmxlYXZlR3JvdXAoYUdyb3VwKTsKLQkJfQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbGVhdmVHcm91cChJbmV0QWRkcmVzcyBhR3JvdXApCisgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgICAgbXMubGVhdmVHcm91cChhR3JvdXApOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKLQkJCXJ1bm5pbmcgPSBmYWxzZTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgeworICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlOworICAgICAgICB9CiAKLQkJcHVibGljIE11bHRpY2FzdFNlcnZlcihJbmV0QWRkcmVzcyBhbkFkZHJlc3MsIGludCBhUG9ydCkKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCQlyYnVmID0gbmV3IGJ5dGVbNTEyXTsKLQkJCXJidWZbMF0gPSAtMTsKLQkJCXJkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChyYnVmLCByYnVmLmxlbmd0aCk7Ci0JCQltcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoYVBvcnQpOwotCQkJbXMuc2V0U29UaW1lb3V0KDIwMDApOwotCQkJbXMuam9pbkdyb3VwKGFuQWRkcmVzcyk7Ci0JCX0KKyAgICAgICAgcHVibGljIE11bHRpY2FzdFNlcnZlcihJbmV0QWRkcmVzcyBhbkFkZHJlc3MsIGludCBhUG9ydCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByYnVmID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgICAgIHJidWZbMF0gPSAtMTsKKyAgICAgICAgICAgIHJkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChyYnVmLCByYnVmLmxlbmd0aCk7CisgICAgICAgICAgICBtcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoYVBvcnQpOworICAgICAgICAgICAgbXMuc2V0U29UaW1lb3V0KDIwMDApOworICAgICAgICAgICAgbXMuam9pbkdyb3VwKGFuQWRkcmVzcyk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgTXVsdGljYXN0U2VydmVyKFNvY2tldEFkZHJlc3MgYW5BZGRyZXNzLCBpbnQgYVBvcnQsCi0JCQkJTmV0d29ya0ludGVyZmFjZSBuZXRJbnRlcmZhY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJCXJidWYgPSBuZXcgYnl0ZVs1MTJdOwotCQkJcmJ1ZlswXSA9IC0xOwotCQkJcmRwID0gbmV3IERhdGFncmFtUGFja2V0KHJidWYsIHJidWYubGVuZ3RoKTsKLQkJCW1zID0gbmV3IE11bHRpY2FzdFNvY2tldChhUG9ydCk7Ci0JCQltcy5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCQltcy5qb2luR3JvdXAoYW5BZGRyZXNzLCBuZXRJbnRlcmZhY2UpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgTXVsdGljYXN0U2VydmVyKFNvY2tldEFkZHJlc3MgYW5BZGRyZXNzLCBpbnQgYVBvcnQsCisgICAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXRJbnRlcmZhY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJidWYgPSBuZXcgYnl0ZVs1MTJdOworICAgICAgICAgICAgcmJ1ZlswXSA9IC0xOworICAgICAgICAgICAgcmRwID0gbmV3IERhdGFncmFtUGFja2V0KHJidWYsIHJidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIG1zID0gbmV3IE11bHRpY2FzdFNvY2tldChhUG9ydCk7CisgICAgICAgICAgICBtcy5zZXRTb1RpbWVvdXQoMjAwMCk7CisgICAgICAgICAgICBtcy5qb2luR3JvdXAoYW5BZGRyZXNzLCBuZXRJbnRlcmZhY2UpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNNdWx0aWNhc3RTb2NrZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyByZWdyZXNzaW9uIHRlc3QgZm9yIDQ5NworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjTXVsdGljYXN0U29ja2V0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk11bHRpY2FzdFNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIDQ5NwogICAgICAgICBNdWx0aWNhc3RTb2NrZXQgcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTExNjIKICAgICAgICAgYXNzZXJ0VHJ1ZShzLmdldFJldXNlQWRkcmVzcygpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNNdWx0aWNhc3RTb2NrZXQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0KGludCkKLQkJLy8gVXNlZCBpbiB0ZXN0cwotCQlNdWx0aWNhc3RTb2NrZXQgZHVwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKLQkJCWludCBwb3J0ID0gbXNzLmdldExvY2FsUG9ydCgpOwotCQkJZHVwID0gbmV3IE11bHRpY2FzdFNvY2tldChwb3J0KTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I011bHRpY2FzdFNvY2tldChpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNdWx0aWNhc3RTb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldChpbnQpCisgICAgICAgIC8vIFVzZWQgaW4gdGVzdHMKKyAgICAgICAgTXVsdGljYXN0U29ja2V0IGR1cCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KCk7CisgICAgICAgICAgICBpbnQgcG9ydCA9IG1zcy5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgICAgIGR1cCA9IG5ldyBNdWx0aWNhc3RTb2NrZXQocG9ydCk7CiAgICAgICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMTE2MgogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkdXAuZ2V0UmV1c2VBZGRyZXNzKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJkdXBsaWNhdGUgYmluZGluZyBub3QgYWxsb3dlZDogIiArIGUpOwotCQl9Ci0JCWlmIChkdXAgIT0gbnVsbCkKLQkJCWR1cC5jbG9zZSgpOwotCX0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiZHVwbGljYXRlIGJpbmRpbmcgbm90IGFsbG93ZWQ6ICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHVwICE9IG51bGwpCisgICAgICAgICAgICBkdXAuY2xvc2UoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I2dldEludGVyZmFjZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRJbnRlcmZhY2UoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5JbmV0QWRkcmVzcwotCQkvLyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQuZ2V0SW50ZXJmYWNlKCkKLQkJYXNzZXJ0VHJ1ZSgiVXNlZCBmb3IgdGVzdGluZy4iLCB0cnVlKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I2dldEludGVyZmFjZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludGVyZmFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEludGVyZmFjZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkluZXRBZGRyZXNzCisgICAgICAgIC8vIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldC5nZXRJbnRlcmZhY2UoKQorICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIGZvciB0ZXN0aW5nLiIsIHRydWUpOwogCi0JCWludCBncm91cFBvcnQgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgewotCQkJCS8vIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSBleHBlY3RlZCByZXNwb25zZSB3aGVuIG9uZSB3YXMgbm90Ci0JCQkJLy8gc2V0Ci0JCQkJbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldChncm91cFBvcnQpOwotCQkJCVN0cmluZyBwcmVmZXJJUHY0U3RhY2tWYWx1ZSA9IFN5c3RlbQotCQkJCQkJLmdldFByb3BlcnR5KCJqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2siKTsKLQkJCQlTdHJpbmcgcHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlID0gU3lzdGVtCi0JCQkJCQkuZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjZBZGRyZXNzZXMiKTsKLQkJCQlpZiAoKChwcmVmZXJJUHY0U3RhY2tWYWx1ZSA9PSBudWxsKSB8fCBwcmVmZXJJUHY0U3RhY2tWYWx1ZQotCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpCi0JCQkJCQkmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlICE9IG51bGwpCi0JCQkJCQkmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlLmVxdWFscygidHJ1ZSIpKSkgewotCQkJCQkvLyB3ZSBleHBlY3QgYW4gSVB2NiBBTlkgaW4gdGhpcyBjYXNlCi0JCQkJCWFzc2VydFRydWUoImluZXQgQWRkcmVzcyByZXR1cm5lZCB3aGVuIG5vdCBzZXQ6IgotCQkJCQkJCSsgbXNzLmdldEludGVyZmFjZSgpLnRvU3RyaW5nKCksIEluZXRBZGRyZXNzCi0JCQkJCQkJLmdldEJ5TmFtZSgiOjowIikuZXF1YWxzKG1zcy5nZXRJbnRlcmZhY2UoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIGV4cGVjdCBhbiBJUHY0IEFOWSBpbiB0aGlzIGNhc2UKLQkJCQkJYXNzZXJ0VHJ1ZSgiaW5ldCBBZGRyZXNzIHJldHVybmVkIHdoZW4gbm90IHNldDoiCi0JCQkJCQkJKyBtc3MuZ2V0SW50ZXJmYWNlKCkudG9TdHJpbmcoKSwgSW5ldEFkZHJlc3MKLQkJCQkJCQkuZ2V0QnlOYW1lKCIwLjAuMC4wIikuZXF1YWxzKG1zcy5nZXRJbnRlcmZhY2UoKSkpOwotCQkJCX0KKyAgICAgICAgaW50IGdyb3VwUG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIGV4cGVjdGVkIHJlc3BvbnNlIHdoZW4gb25lIHdhcyBub3QKKyAgICAgICAgICAgICAgICAvLyBzZXQKKyAgICAgICAgICAgICAgICBtc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KGdyb3VwUG9ydCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZlcklQdjRTdGFja1ZhbHVlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjRTdGFjayIpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NkFkZHJlc3NlcyIpOworICAgICAgICAgICAgICAgIGlmICgoKHByZWZlcklQdjRTdGFja1ZhbHVlID09IG51bGwpIHx8IHByZWZlcklQdjRTdGFja1ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUuZXF1YWxzKCJ0cnVlIikpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCBhbiBJUHY2IEFOWSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW5ldCBBZGRyZXNzIHJldHVybmVkIHdoZW4gbm90IHNldDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc3MuZ2V0SW50ZXJmYWNlKCkudG9TdHJpbmcoKSwgSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QnlOYW1lKCI6OjAiKS5lcXVhbHMobXNzLmdldEludGVyZmFjZSgpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZXhwZWN0IGFuIElQdjQgQU5ZIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJpbmV0IEFkZHJlc3MgcmV0dXJuZWQgd2hlbiBub3Qgc2V0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zcy5nZXRJbnRlcmZhY2UoKS50b1N0cmluZygpLCBJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeU5hbWUoIjAuMC4wLjAiKS5lcXVhbHMobXNzLmdldEludGVyZmFjZSgpKSk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJLy8gdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIGV4cGVjdGVkIHJlc3BvbnNlIHdoZW4gd2Ugc2V0IHZpYQotCQkJCS8vIHNldEludGVyZmFjZQotCQkJCUVudW1lcmF0aW9uIGFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UxLmdldEluZXRBZGRyZXNzZXMoKTsKLQkJCQlpZiAoYWRkcmVzc2VzICE9IG51bGwpIHsKLQkJCQkJSW5ldEFkZHJlc3MgZmlyc3RBZGRyZXNzID0gKEluZXRBZGRyZXNzKSBhZGRyZXNzZXMKLQkJCQkJCQkubmV4dEVsZW1lbnQoKTsKLQkJCQkJbXNzLnNldEludGVyZmFjZShmaXJzdEFkZHJlc3MpOwotCQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJCSJnZXROZXR3b3JrSW50ZXJmYWNlIGRpZCBub3QgcmV0dXJuIGludGVyZmFjZSBzZXQgYnkgc2V0SW50ZXJmYWNlLiAgRXhwZWN0ZWQ6IgotCQkJCQkJCQkJKyBmaXJzdEFkZHJlc3MgKyAiIEdvdDoiCi0JCQkJCQkJCQkrIG1zcy5nZXRJbnRlcmZhY2UoKSwgZmlyc3RBZGRyZXNzCi0JCQkJCQkJCQkuZXF1YWxzKG1zcy5nZXRJbnRlcmZhY2UoKSkpOworICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSBleHBlY3RlZCByZXNwb25zZSB3aGVuIHdlIHNldCB2aWEKKyAgICAgICAgICAgICAgICAvLyBzZXRJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBhZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGZpcnN0QWRkcmVzcyA9IChJbmV0QWRkcmVzcykgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG1zcy5zZXRJbnRlcmZhY2UoZmlyc3RBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0TmV0d29ya0ludGVyZmFjZSBkaWQgbm90IHJldHVybiBpbnRlcmZhY2Ugc2V0IGJ5IHNldEludGVyZmFjZS4gIEV4cGVjdGVkOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlyc3RBZGRyZXNzICsgIiBHb3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc3MuZ2V0SW50ZXJmYWNlKCksIGZpcnN0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhtc3MuZ2V0SW50ZXJmYWNlKCkpKTsKIAotCQkJCQlncm91cFBvcnQgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQkJCW1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoZ3JvdXBQb3J0KTsKLQkJCQkJbXNzLnNldE5ldHdvcmtJbnRlcmZhY2UobmV0d29ya0ludGVyZmFjZTEpOwotCQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJCSJnZXRJbnRlcmZhY2UgZGlkIG5vdCByZXR1cm4gaW50ZXJmYWNlIHNldCBieSBzZXROZXdvcmtJbnRlcmZhY2UgRXhwZWN0ZWQ6ICIKLQkJCQkJCQkJCSsgZmlyc3RBZGRyZXNzICsgIkdvdDoiCi0JCQkJCQkJCQkrIG1zcy5nZXRJbnRlcmZhY2UoKSwgTmV0d29ya0ludGVyZmFjZQotCQkJCQkJCQkJLmdldEJ5SW5ldEFkZHJlc3MobXNzLmdldEludGVyZmFjZSgpKQotCQkJCQkJCQkJLmVxdWFscyhuZXR3b3JrSW50ZXJmYWNlMSkpOwotCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBQb3J0ID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgICAgICAgICBtc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KGdyb3VwUG9ydCk7CisgICAgICAgICAgICAgICAgICAgIG1zcy5zZXROZXR3b3JrSW50ZXJmYWNlKG5ldHdvcmtJbnRlcmZhY2UxKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0SW50ZXJmYWNlIGRpZCBub3QgcmV0dXJuIGludGVyZmFjZSBzZXQgYnkgc2V0TmV3b3JrSW50ZXJmYWNlIEV4cGVjdGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpcnN0QWRkcmVzcyArICJHb3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc3MuZ2V0SW50ZXJmYWNlKCksIE5ldHdvcmtJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeUluZXRBZGRyZXNzKG1zcy5nZXRJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV0d29ya0ludGVyZmFjZTEpKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgZ2V0SW50ZXJmYWNlIHRlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBnZXRJbnRlcmZhY2UgdGVzdDogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjZ2V0TmV0d29ya0ludGVyZmFjZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXROZXR3b3JrSW50ZXJmYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGdyb3VwUG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKLQkJaWYgKGF0TGVhc3RPbmVJbnRlcmZhY2UpIHsKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjZ2V0TmV0d29ya0ludGVyZmFjZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5ldHdvcmtJbnRlcmZhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXROZXR3b3JrSW50ZXJmYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGdyb3VwUG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKKyAgICAgICAgaWYgKGF0TGVhc3RPbmVJbnRlcmZhY2UpIHsKICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSBleHBlY3RlZCByZXNwb25zZSB3aGVuIG9uZSB3YXMgbm90CiAgICAgICAgICAgICAvLyBzZXQKICAgICAgICAgICAgIG1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoZ3JvdXBQb3J0KTsKQEAgLTI3Niw5NSArMzE4LDEzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEuZXF1YWxzKG1zcy5nZXROZXR3b3JrSW50ZXJmYWNlKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I2dldFRpbWVUb0xpdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGltZVRvTGl2ZSgpIHsKLQkJdHJ5IHsKLQkJCW1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKLQkJCW1zcy5zZXRUaW1lVG9MaXZlKDEyMCk7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgMXN0IFRUTDogIiArIG1zcy5nZXRUaW1lVG9MaXZlKCksCi0JCQkJCW1zcy5nZXRUaW1lVG9MaXZlKCkgPT0gMTIwKTsKLQkJCW1zcy5zZXRUaW1lVG9MaXZlKDIyMCk7Ci0JCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgMm5kIFRUTDogIiArIG1zcy5nZXRUaW1lVG9MaXZlKCksCi0JCQkJCW1zcy5nZXRUaW1lVG9MaXZlKCkgPT0gMjIwKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjZ2V0VGltZVRvTGl2ZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGltZVRvTGl2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VGltZVRvTGl2ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKKyAgICAgICAgICAgIG1zcy5zZXRUaW1lVG9MaXZlKDEyMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgMXN0IFRUTDogIiArIG1zcy5nZXRUaW1lVG9MaXZlKCksCisgICAgICAgICAgICAgICAgICAgIG1zcy5nZXRUaW1lVG9MaXZlKCkgPT0gMTIwKTsKKyAgICAgICAgICAgIG1zcy5zZXRUaW1lVG9MaXZlKDIyMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgMm5kIFRUTDogIiArIG1zcy5nZXRUaW1lVG9MaXZlKCksCisgICAgICAgICAgICAgICAgICAgIG1zcy5nZXRUaW1lVG9MaXZlKCkgPT0gMjIwKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNnZXRUVEwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0VFRMKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQuZ2V0VFRMKCkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I2dldFRUTCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VFRMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUVEwoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBieXRlIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldC5nZXRUVEwoKQogCi0JCXRyeSB7Ci0JCQltc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KCk7Ci0JCQltc3Muc2V0VFRMKChieXRlKSAxMjApOwotCQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IFRUTDogIiArIG1zcy5nZXRUVEwoKSwKLQkJCQkJbXNzLmdldFRUTCgpID09IDEyMCk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX01VTFRJQ0FTVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fTVVMVElDQVNUKTsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKKyAgICAgICAgICAgIG1zcy5zZXRUVEwoKGJ5dGUpIDEyMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgVFRMOiAiICsgbXNzLmdldFRUTCgpLAorICAgICAgICAgICAgICAgICAgICBtc3MuZ2V0VFRMKCkgPT0gMTIwKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNqb2luR3JvdXAoamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9qb2luR3JvdXBMamF2YV9uZXRfSW5ldEFkZHJlc3MoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldC5qb2luR3JvdXAoamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0JCVN0cmluZyBtc2cgPSBudWxsOwotCQlJbmV0QWRkcmVzcyBncm91cCA9IG51bGw7Ci0JCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7Ci0JCWludCBncm91cFBvcnQgPSBwb3J0c1swXTsKLQkJdHJ5IHsKLQkJCWdyb3VwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyMjQuMC4wLjMiKTsKLQkJCXNlcnZlciA9IG5ldyBNdWx0aWNhc3RTZXJ2ZXIoZ3JvdXAsIGdyb3VwUG9ydCk7Ci0JCQlzZXJ2ZXIuc3RhcnQoKTsKLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCW1zZyA9ICJIZWxsbyBXb3JsZCI7Ci0JCQltc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KHBvcnRzWzFdKTsKLQkJCURhdGFncmFtUGFja2V0IHNkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChtc2cuZ2V0Qnl0ZXMoKSwgbXNnCi0JCQkJCS5sZW5ndGgoKSwgZ3JvdXAsIGdyb3VwUG9ydCk7Ci0JCQltc3Muc2VuZChzZHAsIChieXRlKSAxMCk7Ci0JCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGpvaW5Hcm91cCB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJHcm91cCBtZW1iZXIgZGlkIG5vdCByZWN2IGRhdGE6ICIsIG5ldyBTdHJpbmcoc2VydmVyLnJkcAotCQkJCS5nZXREYXRhKCksIDAsIHNlcnZlci5yZHAuZ2V0TGVuZ3RoKCkpLmVxdWFscyhtc2cpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I2pvaW5Hcm91cChqYXZhLm5ldC5JbmV0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImpvaW5Hcm91cCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtJbmV0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9qb2luR3JvdXBMamF2YV9uZXRfSW5ldEFkZHJlc3MoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldC5qb2luR3JvdXAoamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBJbmV0QWRkcmVzcyBncm91cCA9IG51bGw7CisgICAgICAgIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgICAgIGludCBncm91cFBvcnQgPSBwb3J0c1swXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdyb3VwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyMjQuMC4wLjMiKTsKKyAgICAgICAgICAgIHNlcnZlciA9IG5ldyBNdWx0aWNhc3RTZXJ2ZXIoZ3JvdXAsIGdyb3VwUG9ydCk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIG1zZyA9ICJIZWxsbyBXb3JsZCI7CisgICAgICAgICAgICBtc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHNkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChtc2cuZ2V0Qnl0ZXMoKSwgbXNnCisgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSwgZ3JvdXAsIGdyb3VwUG9ydCk7CisgICAgICAgICAgICBtc3Muc2VuZChzZHAsIChieXRlKSAxMCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIGpvaW5Hcm91cCB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBtZW1iZXIgZGlkIG5vdCByZWN2IGRhdGE6ICIsIG5ldyBTdHJpbmcoc2VydmVyLnJkcAorICAgICAgICAgICAgICAgIC5nZXREYXRhKCksIDAsIHNlcnZlci5yZHAuZ2V0TGVuZ3RoKCkpLmVxdWFscyhtc2cpKTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNqb2luR3JvdXAoamF2YS5uZXQuU29ja2V0QWRkcmVzcyxqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfam9pbkdyb3VwTGphdmFfbmV0X1NvY2tldEFkZHJlc3NMamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkvLyBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWxsb3dzIHVzIHRvIGNoZWNrIHRoYXQgd2Ugb25seSByZXR1cm4gdGhlCi0JCS8vIGFkZHJlc3NlcyB0aGF0IHdlIHNob3VsZAotCQljbGFzcyBteVNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CisgICAgLyoqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIAorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjam9pbkdyb3VwKGphdmEubmV0LlNvY2tldEFkZHJlc3MsamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJqb2luR3JvdXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U29ja2V0QWRkcmVzcy5jbGFzcywgTmV0d29ya0ludGVyZmFjZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3Rfam9pbkdyb3VwTGphdmFfbmV0X1NvY2tldEFkZHJlc3NMamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAvLyBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWxsb3dzIHVzIHRvIGNoZWNrIHRoYXQgd2Ugb25seSByZXR1cm4gdGhlCisgICAgICAgIC8vIGFkZHJlc3NlcyB0aGF0IHdlIHNob3VsZAorICAgICAgICBjbGFzcyBteVNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAKLQkJCXB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KEluZXRBZGRyZXNzIGFkZHJlc3MpIHsKLQkJCQl0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIm5vdCBhbGxvd2VkIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KEluZXRBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIm5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJSW5ldEFkZHJlc3MgZ3JvdXAgPSBudWxsOwotCQlTb2NrZXRBZGRyZXNzIGdyb3VwU29ja0FkZHIgPSBudWxsOwotCQlpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDIpOwotCQlpbnQgZ3JvdXBQb3J0ID0gcG9ydHNbMF07Ci0JCWludCBzZXJ2ZXJQb3J0ID0gcG9ydHNbMV07CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBJbmV0QWRkcmVzcyBncm91cCA9IG51bGw7CisgICAgICAgIFNvY2tldEFkZHJlc3MgZ3JvdXBTb2NrQWRkciA9IG51bGw7CisgICAgICAgIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgICAgIGludCBncm91cFBvcnQgPSBwb3J0c1swXTsKKyAgICAgICAgaW50IHNlcnZlclBvcnQgPSBwb3J0c1sxXTsKIAotCQkJRW51bWVyYXRpb24gdGhlSW50ZXJmYWNlcyA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CiAKICAgICAgICAgLy8gZmlyc3QgdmFsaWRhdGUgdGhhdCB3ZSBoYW5kbGUgYSBudWxsIGdyb3VwIG9rCiAgICAgICAgIG1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoZ3JvdXBQb3J0KTsKQEAgLTU1OSwyNDcgKzYzNywyOTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKLQl9CisgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNsZWF2ZUdyb3VwKGphdmEubmV0LkluZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfbGVhdmVHcm91cExqYXZhX25ldF9JbmV0QWRkcmVzcygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKLQkJLy8gamF2YS5uZXQuTXVsdGljYXN0U29ja2V0LmxlYXZlR3JvdXAoamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0JCVN0cmluZyBtc2cgPSBudWxsOwotCQlib29sZWFuIGV4Y2VwdCA9IGZhbHNlOwotCQlJbmV0QWRkcmVzcyBncm91cCA9IG51bGw7Ci0JCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7Ci0JCWludCBncm91cFBvcnQgPSBwb3J0c1swXTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I2xlYXZlR3JvdXAoamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGVhdmVHcm91cCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtJbmV0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9sZWF2ZUdyb3VwTGphdmFfbmV0X0luZXRBZGRyZXNzKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQubGVhdmVHcm91cChqYXZhLm5ldC5JbmV0QWRkcmVzcykKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gZXhjZXB0ID0gZmFsc2U7CisgICAgICAgIEluZXRBZGRyZXNzIGdyb3VwID0gbnVsbDsKKyAgICAgICAgaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgyKTsKKyAgICAgICAgaW50IGdyb3VwUG9ydCA9IHBvcnRzWzBdOwogCi0JCXRyeSB7Ci0JCQlncm91cCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMjI0LjAuMC4zIik7Ci0JCQltc2cgPSAiSGVsbG8gV29ybGQiOwotCQkJbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldChwb3J0c1sxXSk7Ci0JCQlEYXRhZ3JhbVBhY2tldCBzZHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQobXNnLmdldEJ5dGVzKCksIG1zZwotCQkJCQkubGVuZ3RoKCksIGdyb3VwLCBncm91cFBvcnQpOwotCQkJbXNzLnNlbmQoc2RwLCAoYnl0ZSkgMTApOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19NVUxUSUNBU1QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX01VTFRJQ0FTVCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIFRyeSB0byBsZWF2ZSBzIGdyb3VwIHRoYXQgbXNzIGlzIG5vdCBhIG1lbWJlciBvZgotCQkJbXNzLmxlYXZlR3JvdXAoZ3JvdXApOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvcnJlY3QKLQkJCWV4Y2VwdCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiBsZWF2aW5nIG5vbi1tZW1iZXIgZ3JvdXAiLCBleGNlcHQpOwotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdyb3VwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyMjQuMC4wLjMiKTsKKyAgICAgICAgICAgIG1zZyA9ICJIZWxsbyBXb3JsZCI7CisgICAgICAgICAgICBtc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHNkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChtc2cuZ2V0Qnl0ZXMoKSwgbXNnCisgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSwgZ3JvdXAsIGdyb3VwUG9ydCk7CisgICAgICAgICAgICBtc3Muc2VuZChzZHAsIChieXRlKSAxMCk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX01VTFRJQ0FTVCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fTVVMVElDQVNUKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVHJ5IHRvIGxlYXZlIHMgZ3JvdXAgdGhhdCBtc3MgaXMgbm90IGEgbWVtYmVyIG9mCisgICAgICAgICAgICBtc3MubGVhdmVHcm91cChncm91cCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gQ29ycmVjdAorICAgICAgICAgICAgZXhjZXB0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIGxlYXZpbmcgbm9uLW1lbWJlciBncm91cCIsIGV4Y2VwdCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNsZWF2ZUdyb3VwKGphdmEubmV0LlNvY2tldEFkZHJlc3MsamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2xlYXZlR3JvdXBMamF2YV9uZXRfU29ja2V0QWRkcmVzc0xqYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlKCkgewotCQkvLyBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWxsb3dzIHVzIHRvIGNoZWNrIHRoYXQgd2Ugb25seSByZXR1cm4gdGhlCi0JCS8vIGFkZHJlc3NlcyB0aGF0IHdlIHNob3VsZAotCQljbGFzcyBteVNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNsZWF2ZUdyb3VwKGphdmEubmV0LlNvY2tldEFkZHJlc3MsamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsZWF2ZUdyb3VwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NvY2tldEFkZHJlc3MuY2xhc3MsIE5ldHdvcmtJbnRlcmZhY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfbGVhdmVHcm91cExqYXZhX25ldF9Tb2NrZXRBZGRyZXNzTGphdmFfbmV0X05ldHdvcmtJbnRlcmZhY2UoKSB7CisgICAgICAgIC8vIHNlY3VyaXR5IG1hbmFnZXIgdGhhdCBhbGxvd3MgdXMgdG8gY2hlY2sgdGhhdCB3ZSBvbmx5IHJldHVybiB0aGUKKyAgICAgICAgLy8gYWRkcmVzc2VzIHRoYXQgd2Ugc2hvdWxkCisgICAgICAgIGNsYXNzIG15U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKIAotCQkJcHVibGljIHZvaWQgY2hlY2tNdWx0aWNhc3QoSW5ldEFkZHJlc3MgYWRkcmVzcykgewotCQkJCXRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigibm90IGFsbG93ZWQiKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tNdWx0aWNhc3QoSW5ldEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigibm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCVN0cmluZyBtc2cgPSBudWxsOwotCQlJbmV0QWRkcmVzcyBncm91cCA9IG51bGw7Ci0JCWludCBncm91cFBvcnQgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCVNvY2tldEFkZHJlc3MgZ3JvdXBTb2NrQWRkciA9IG51bGw7Ci0JCVNvY2tldEFkZHJlc3MgZ3JvdXBTb2NrQWRkcjIgPSBudWxsOworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgSW5ldEFkZHJlc3MgZ3JvdXAgPSBudWxsOworICAgICAgICBpbnQgZ3JvdXBQb3J0ID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICBTb2NrZXRBZGRyZXNzIGdyb3VwU29ja0FkZHIgPSBudWxsOworICAgICAgICBTb2NrZXRBZGRyZXNzIGdyb3VwU29ja0FkZHIyID0gbnVsbDsKIAotCQl0cnkgewotCQkJRW51bWVyYXRpb24gdGhlSW50ZXJmYWNlcyA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CiAKLQkJCS8vIGZpcnN0IHZhbGlkYXRlIHRoYXQgd2UgaGFuZGxlIGEgbnVsbCBncm91cCBvawotCQkJbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldChncm91cFBvcnQpOwotCQkJdHJ5IHsKLQkJCQltc3MubGVhdmVHcm91cChudWxsLCBudWxsKTsKLQkJCQlmYWlsKCJEaWQgbm90IGdldCBleGNlcHRpb24gd2hlbiBncm91cCB3YXMgbnVsbCIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0KKyAgICAgICAgICAgIC8vIGZpcnN0IHZhbGlkYXRlIHRoYXQgd2UgaGFuZGxlIGEgbnVsbCBncm91cCBvaworICAgICAgICAgICAgbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldChncm91cFBvcnQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtc3MubGVhdmVHcm91cChudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBleGNlcHRpb24gd2hlbiBncm91cCB3YXMgbnVsbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gbm93IHZhbGlkYXRlIHdlIGdldCB0aGUgZXhwZWN0ZWQgZXJyb3IgaWYgdGhlIGFkZHJlc3Mgc3BlY2lmaWVkCi0JCQkvLyBpcyBub3QgYSBtdWx0aWNhc3QgZ3JvdXAKLQkJCXRyeSB7Ci0JCQkJZ3JvdXAgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjI1NS4yNTUuMjU1LjI1NSIpOwotCQkJCWdyb3VwU29ja0FkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoZ3JvdXAsIGdyb3VwUG9ydCk7Ci0JCQkJbXNzLmxlYXZlR3JvdXAoZ3JvdXBTb2NrQWRkciwgbnVsbCk7Ci0JCQkJZmFpbCgiRGlkIG5vdCBnZXQgZXhjZXB0aW9uIHdoZW4gZ3JvdXAgaXMgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MiKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KKyAgICAgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB3ZSBnZXQgdGhlIGV4cGVjdGVkIGVycm9yIGlmIHRoZSBhZGRyZXNzIHNwZWNpZmllZAorICAgICAgICAgICAgLy8gaXMgbm90IGEgbXVsdGljYXN0IGdyb3VwCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGdyb3VwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyNTUuMjU1LjI1NS4yNTUiKTsKKyAgICAgICAgICAgICAgICBncm91cFNvY2tBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGdyb3VwLCBncm91cFBvcnQpOworICAgICAgICAgICAgICAgIG1zcy5sZWF2ZUdyb3VwKGdyb3VwU29ja0FkZHIsIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGV4Y2VwdGlvbiB3aGVuIGdyb3VwIGlzIG5vdCBhIG11bHRpY2FzdCBhZGRyZXNzIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CiAKLQkJCS8vIG5vdyB0cnkgdG8gbGVhdmUgYSBncm91cCBpZiB3ZSBhcmUgbm90IGF1dGhvcml6ZWQKLQkJCS8vIHNldCB0aGUgc2VjdXJpdHkgbWFuYWdlciB0aGF0IHdpbGwgbWFrZSB0aGUgZmlyc3QgYWRkcmVzcyBub3QKLQkJCS8vIHZpc2libGUKLQkJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IG15U2VjdXJpdHlNYW5hZ2VyKCkpOwotCQkJdHJ5IHsKLQkJCQlncm91cCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMjI0LjAuMC4zIik7Ci0JCQkJZ3JvdXBTb2NrQWRkciA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhncm91cCwgZ3JvdXBQb3J0KTsKLQkJCQltc3MubGVhdmVHcm91cChncm91cFNvY2tBZGRyLCBudWxsKTsKLQkJCQlmYWlsKCJEaWQgbm90IGdldCBleGNlcHRpb24gd2hlbiBqb2luaW5nIGdyb3VwIGlzIG5vdCBhbGxvd2VkIik7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOworICAgICAgICAgICAgLy8gbm93IHRyeSB0byBsZWF2ZSBhIGdyb3VwIGlmIHdlIGFyZSBub3QgYXV0aG9yaXplZAorICAgICAgICAgICAgLy8gc2V0IHRoZSBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgd2lsbCBtYWtlIHRoZSBmaXJzdCBhZGRyZXNzIG5vdAorICAgICAgICAgICAgLy8gdmlzaWJsZQorICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgbXlTZWN1cml0eU1hbmFnZXIoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGdyb3VwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyMjQuMC4wLjMiKTsKKyAgICAgICAgICAgICAgICBncm91cFNvY2tBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGdyb3VwLCBncm91cFBvcnQpOworICAgICAgICAgICAgICAgIG1zcy5sZWF2ZUdyb3VwKGdyb3VwU29ja0FkZHIsIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGV4Y2VwdGlvbiB3aGVuIGpvaW5pbmcgZ3JvdXAgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7CiAKLQkJCWlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7CisgICAgICAgICAgICBpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgewogCi0JCQkJLy8gbm93IHRlc3QgdGhhdCB3ZSBjYW4gam9pbiBhbmQgbGVhdmUgYSBncm91cCBzdWNjZXNzZnVsbHkKLQkJCQlncm91cFBvcnQgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0Rm9yVURQKCk7Ci0JCQkJbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldChncm91cFBvcnQpOwotCQkJCWdyb3VwU29ja0FkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoZ3JvdXAsIGdyb3VwUG9ydCk7Ci0JCQkJbXNzLmpvaW5Hcm91cChncm91cFNvY2tBZGRyLCBudWxsKTsKLQkJCQltc3MubGVhdmVHcm91cChncm91cFNvY2tBZGRyLCBudWxsKTsKLQkJCQl0cnkgewotCQkJCQltc3MubGVhdmVHcm91cChncm91cFNvY2tBZGRyLCBudWxsKTsKLQkJCQkJZmFpbCgKLQkJCQkJCQkiRGlkIG5vdCBnZXQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGxlYXZlIGdyb3VwIHRoYXQgd2FzIGFsbHJlYWR5IGxlZnQiKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQorICAgICAgICAgICAgICAgIC8vIG5vdyB0ZXN0IHRoYXQgd2UgY2FuIGpvaW4gYW5kIGxlYXZlIGEgZ3JvdXAgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgICAgICAgZ3JvdXBQb3J0ID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpOworICAgICAgICAgICAgICAgIG1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoZ3JvdXBQb3J0KTsKKyAgICAgICAgICAgICAgICBncm91cFNvY2tBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGdyb3VwLCBncm91cFBvcnQpOworICAgICAgICAgICAgICAgIG1zcy5qb2luR3JvdXAoZ3JvdXBTb2NrQWRkciwgbnVsbCk7CisgICAgICAgICAgICAgICAgbXNzLmxlYXZlR3JvdXAoZ3JvdXBTb2NrQWRkciwgbnVsbCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbXNzLmxlYXZlR3JvdXAoZ3JvdXBTb2NrQWRkciwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBsZWF2ZSBncm91cCB0aGF0IHdhcyBhbGxyZWFkeSBsZWZ0Iik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KIAotCQkJCUluZXRBZGRyZXNzIGdyb3VwMiA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMjI0LjAuMC40Iik7Ci0JCQkJZ3JvdXBTb2NrQWRkcjIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoZ3JvdXAyLCBncm91cFBvcnQpOwotCQkJCW1zcy5qb2luR3JvdXAoZ3JvdXBTb2NrQWRkciwgbmV0d29ya0ludGVyZmFjZTEpOwotCQkJCXRyeSB7Ci0JCQkJCW1zcy5sZWF2ZUdyb3VwKGdyb3VwU29ja0FkZHIyLCBuZXR3b3JrSW50ZXJmYWNlMSk7Ci0JCQkJCWZhaWwoCi0JCQkJCQkJIkRpZCBub3QgZ2V0IGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBsZWF2ZSBncm91cCB0aGF0IHdhcyBuZXZlciBqb2luZWQiKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQorICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGdyb3VwMiA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMjI0LjAuMC40Iik7CisgICAgICAgICAgICAgICAgZ3JvdXBTb2NrQWRkcjIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoZ3JvdXAyLCBncm91cFBvcnQpOworICAgICAgICAgICAgICAgIG1zcy5qb2luR3JvdXAoZ3JvdXBTb2NrQWRkciwgbmV0d29ya0ludGVyZmFjZTEpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1zcy5sZWF2ZUdyb3VwKGdyb3VwU29ja0FkZHIyLCBuZXR3b3JrSW50ZXJmYWNlMSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBsZWF2ZSBncm91cCB0aGF0IHdhcyBuZXZlciBqb2luZWQiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJbXNzLmxlYXZlR3JvdXAoZ3JvdXBTb2NrQWRkciwgbmV0d29ya0ludGVyZmFjZTEpOwotCQkJCWlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgewotCQkJCQltc3Muam9pbkdyb3VwKGdyb3VwU29ja0FkZHIsIG5ldHdvcmtJbnRlcmZhY2UxKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1zcy5sZWF2ZUdyb3VwKGdyb3VwU29ja0FkZHIsIG5ldHdvcmtJbnRlcmZhY2UyKTsKLQkJCQkJCWZhaWwoCi0JCQkJCQkJCSJEaWQgbm90IGdldCBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gbGVhdmUgZ3JvdXAgb24gd3JvbmcgaW50ZXJmYWNlIGpvaW5lZCBvbiBbIgotCQkJCQkJCQkJCSsgbmV0d29ya0ludGVyZmFjZTEKLQkJCQkJCQkJCQkrICJdIGxlZnQgb24gWyIKLQkJCQkJCQkJCQkrIG5ldHdvcmtJbnRlcmZhY2UyICsgIl0iKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBsZWF2ZUdyb3VwIHRlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0JfQorICAgICAgICAgICAgICAgIG1zcy5sZWF2ZUdyb3VwKGdyb3VwU29ja0FkZHIsIG5ldHdvcmtJbnRlcmZhY2UxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNzLmpvaW5Hcm91cChncm91cFNvY2tBZGRyLCBuZXR3b3JrSW50ZXJmYWNlMSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtc3MubGVhdmVHcm91cChncm91cFNvY2tBZGRyLCBuZXR3b3JrSW50ZXJmYWNlMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGxlYXZlIGdyb3VwIG9uIHdyb25nIGludGVyZmFjZSBqb2luZWQgb24gWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5ldHdvcmtJbnRlcmZhY2UxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBsZWZ0IG9uIFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXR3b3JrSW50ZXJmYWNlMiArICJdIik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgbGVhdmVHcm91cCB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjc2VuZChqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NlbmRMamF2YV9uZXRfRGF0YWdyYW1QYWNrZXRCKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQuc2VuZChqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCwgYnl0ZSkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I3NlbmQoamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQsIGJ5dGUpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0RhdGFncmFtUGFja2V0LmNsYXNzLCBieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlbmRMamF2YV9uZXRfRGF0YWdyYW1QYWNrZXRCKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAorICAgICAgICAvLyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQuc2VuZChqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCwgYnl0ZSkKIAotCQlTdHJpbmcgbXNnID0gIkhlbGxvIFdvcmxkIjsKLQkJSW5ldEFkZHJlc3MgZ3JvdXAgPSBudWxsOwotCQlpbnRbXSBwb3J0cyA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRzRm9yVURQKDIpOwotCQlpbnQgZ3JvdXBQb3J0ID0gcG9ydHNbMF07CisgICAgICAgIFN0cmluZyBtc2cgPSAiSGVsbG8gV29ybGQiOworICAgICAgICBJbmV0QWRkcmVzcyBncm91cCA9IG51bGw7CisgICAgICAgIGludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7CisgICAgICAgIGludCBncm91cFBvcnQgPSBwb3J0c1swXTsKIAotCQl0cnkgewotCQkJZ3JvdXAgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjIyNC4wLjAuMyIpOwotCQkJbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldChwb3J0c1sxXSk7Ci0JCQlzZXJ2ZXIgPSBuZXcgTXVsdGljYXN0U2VydmVyKGdyb3VwLCBncm91cFBvcnQpOwotCQkJc2VydmVyLnN0YXJ0KCk7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCURhdGFncmFtUGFja2V0IHNkcCA9IG5ldyBEYXRhZ3JhbVBhY2tldChtc2cuZ2V0Qnl0ZXMoKSwgbXNnCi0JCQkJCS5sZW5ndGgoKSwgZ3JvdXAsIGdyb3VwUG9ydCk7Ci0JCQltc3Muc2VuZChzZHAsIChieXRlKSAxMCk7Ci0JCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX01VTFRJQ0FTVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fTVVMVElDQVNUKTsKLQkJCXRyeSB7Ci0JCQkJbXNzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCX0KLQkJCTsKLQkJCXJldHVybjsKLQkJfQotCQltc3MuY2xvc2UoKTsKLQkJYnl0ZVtdIGRhdGEgPSBzZXJ2ZXIucmRwLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9IHNlcnZlci5yZHAuZ2V0TGVuZ3RoKCk7Ci0JCWFzc2VydFRydWUoIkZhaWxlZCB0byBzZW5kIGRhdGEuIFJlY2VpdmVkICIgKyBsZW5ndGgsIG5ldyBTdHJpbmcoZGF0YSwKLQkJCQkwLCBsZW5ndGgpLmVxdWFscyhtc2cpKTsKLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBncm91cCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMjI0LjAuMC4zIik7CisgICAgICAgICAgICBtc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KHBvcnRzWzFdKTsKKyAgICAgICAgICAgIHNlcnZlciA9IG5ldyBNdWx0aWNhc3RTZXJ2ZXIoZ3JvdXAsIGdyb3VwUG9ydCk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgc2RwID0gbmV3IERhdGFncmFtUGFja2V0KG1zZy5nZXRCeXRlcygpLCBtc2cKKyAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpLCBncm91cCwgZ3JvdXBQb3J0KTsKKyAgICAgICAgICAgIG1zcy5zZW5kKHNkcCwgKGJ5dGUpIDEwKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtc3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1zcy5jbG9zZSgpOworICAgICAgICBieXRlW10gZGF0YSA9IHNlcnZlci5yZHAuZ2V0RGF0YSgpOworICAgICAgICBpbnQgbGVuZ3RoID0gc2VydmVyLnJkcC5nZXRMZW5ndGgoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNlbmQgZGF0YS4gUmVjZWl2ZWQgIiArIGxlbmd0aCwgbmV3IFN0cmluZyhkYXRhLAorICAgICAgICAgICAgICAgIDAsIGxlbmd0aCkuZXF1YWxzKG1zZykpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjc2V0SW50ZXJmYWNlKGphdmEubmV0LkluZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW50ZXJmYWNlTGphdmFfbmV0X0luZXRBZGRyZXNzKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAotCQkvLyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQuc2V0SW50ZXJmYWNlKGphdmEubmV0LkluZXRBZGRyZXNzKQotCQkvLyBOb3RlIHRoYXQgdGhlIG1hY2hpbmUgaXMgbm90IG11bHRpLWhvbWVkCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNzZXRJbnRlcmZhY2UoamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW50ZXJmYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0luZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zZXRJbnRlcmZhY2VMamF2YV9uZXRfSW5ldEFkZHJlc3MoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCisgICAgICAgIC8vIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldC5zZXRJbnRlcmZhY2UoamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbWFjaGluZSBpcyBub3QgbXVsdGktaG9tZWQKIAotCQl0cnkgewotCQkJbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldCgpOwotCQkJbXNzLnNldEludGVyZmFjZShJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX01VTFRJQ0FTVF9JTlRFUkZBQ0UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX01VTFRJQ0FTVF9JTlRFUkZBQ0UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJbmV0QWRkcmVzcyB0aGVJbnRlcmZhY2UgPSBtc3MuZ2V0SW50ZXJmYWNlKCk7Ci0JCQkvLyB1bmRlciBJUFY2IHdlIGFyZSBub3QgZ3VhcnJlbnRlZWQgdG8gZ2V0IHRoZSBzYW1lIGFkZHJlc3MgYmFjayBhcwotCQkJLy8gdGhlIGFkZHJlc3MsIGFsbCB3ZSBzaG91bGQgYmUgZ3VhcmFudGVlZCBpcyB0aGF0IHdlIGdldCBhbgotCQkJLy8gYWRkcmVzcyBvbiB0aGUgc2FtZSBpbnRlcmZhY2UKLQkJCWlmICh0aGVJbnRlcmZhY2UgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpIHsKLQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJIkZhaWxlZCB0byByZXR1cm4gY29ycmVjdCBpbnRlcmZhY2UgSVBWNiIsCi0JCQkJCQlOZXR3b3JrSW50ZXJmYWNlCi0JCQkJCQkJCS5nZXRCeUluZXRBZGRyZXNzKG1zcy5nZXRJbnRlcmZhY2UoKSkKLQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQlOZXR3b3JrSW50ZXJmYWNlCi0JCQkJCQkJCQkJCQkuZ2V0QnlJbmV0QWRkcmVzcyh0aGVJbnRlcmZhY2UpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byByZXR1cm4gY29ycmVjdCBpbnRlcmZhY2UgSVBWNCBnb3Q6IgotCQkJCQkJKyBtc3MuZ2V0SW50ZXJmYWNlKCkgKyAiIGV4Y3BldGVkOiAiCi0JCQkJCQkrIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBtc3MuZ2V0SW50ZXJmYWNlKCkKLQkJCQkJCS5lcXVhbHMoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpKTsKLQkJCX0KLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOwotCQl9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNldEludGVyZmFjZSB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldCgpOworICAgICAgICAgICAgbXNzLnNldEludGVyZmFjZShJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX01VTFRJQ0FTVF9JTlRFUkZBQ0UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX01VTFRJQ0FTVF9JTlRFUkZBQ0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyB0aGVJbnRlcmZhY2UgPSBtc3MuZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICAvLyB1bmRlciBJUFY2IHdlIGFyZSBub3QgZ3VhcnJlbnRlZWQgdG8gZ2V0IHRoZSBzYW1lIGFkZHJlc3MgYmFjayBhcworICAgICAgICAgICAgLy8gdGhlIGFkZHJlc3MsIGFsbCB3ZSBzaG91bGQgYmUgZ3VhcmFudGVlZCBpcyB0aGF0IHdlIGdldCBhbgorICAgICAgICAgICAgLy8gYWRkcmVzcyBvbiB0aGUgc2FtZSBpbnRlcmZhY2UKKyAgICAgICAgICAgIGlmICh0aGVJbnRlcmZhY2UgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXR1cm4gY29ycmVjdCBpbnRlcmZhY2UgSVBWNiIsCisgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeUluZXRBZGRyZXNzKG1zcy5nZXRJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QnlJbmV0QWRkcmVzcyh0aGVJbnRlcmZhY2UpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byByZXR1cm4gY29ycmVjdCBpbnRlcmZhY2UgSVBWNCBnb3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtc3MuZ2V0SW50ZXJmYWNlKCkgKyAiIGV4Y3BldGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBtc3MuZ2V0SW50ZXJmYWNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKKyAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHNldEludGVyZmFjZSB0ZXN0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQogCi0JCS8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0yNDEwCi0JCXRyeSB7Ci0JCQltc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KCk7Ci0JCQltc3Muc2V0SW50ZXJmYWNlKEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMjI0LjAuMC41IikpOwotCQl9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiB1aGUpIHsKLQkJCWZhaWwoIlVuYWJsZSB0byBnZXQgSW5ldEFkZHJlc3MgYnkgbmFtZSBmcm9tICcyMjQuMC4wLjUnIGFkZHI6ICIgKyB1aGUudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oaW9lLCBTT19NVUxUSUNBU1RfSU5URVJGQUNFKTsKLQkJCXJldHVybjsKLQkJfQotCX0KKyAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTI0MTAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1zcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKKyAgICAgICAgICAgIG1zcy5zZXRJbnRlcmZhY2UoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyMjQuMC4wLjUiKSk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgeworICAgICAgICAgICAgZmFpbCgiVW5hYmxlIHRvIGdldCBJbmV0QWRkcmVzcyBieSBuYW1lIGZyb20gJzIyNC4wLjAuNScgYWRkcjogIiArIHVoZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihpb2UsIFNPX01VTFRJQ0FTVF9JTlRFUkZBQ0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIAotCSAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjc2V0TmV0d29ya0ludGVyZmFjZShqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0TmV0d29ya0ludGVyZmFjZUxqYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBtc2cgPSBudWxsOwotCQlJbmV0QWRkcmVzcyBncm91cCA9IG51bGw7Ci0JCWludFtdIHBvcnRzID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydHNGb3JVRFAoMik7Ci0JCWludCBncm91cFBvcnQgPSBwb3J0c1swXTsKLQkJaW50IHNlcnZlclBvcnQgPSBwb3J0c1sxXTsKLQkJaWYgKGF0TGVhc3RPbmVJbnRlcmZhY2UpIHsKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gCisgICAgICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNzZXROZXR3b3JrSW50ZXJmYWNlKGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmV0d29ya0ludGVyZmFjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtOZXR3b3JrSW50ZXJmYWNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zZXROZXR3b3JrSW50ZXJmYWNlTGphdmFfbmV0X05ldHdvcmtJbnRlcmZhY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIEluZXRBZGRyZXNzIGdyb3VwID0gbnVsbDsKKyAgICAgICAgaW50W10gcG9ydHMgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0c0ZvclVEUCgyKTsKKyAgICAgICAgaW50IGdyb3VwUG9ydCA9IHBvcnRzWzBdOworICAgICAgICBpbnQgc2VydmVyUG9ydCA9IHBvcnRzWzFdOworICAgICAgICBpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgewogICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCBudWxsIGludGVyZmFjZSBpcyBoYW5kbGVkIG9rCiAgICAgICAgICAgICBtc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KGdyb3VwUG9ydCk7CiAKQEAgLTg3OCw0NyArMTAwMSw3NCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I3NldFRpbWVUb0xpdmUoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGltZVRvTGl2ZUkoKSB7Ci0JCXRyeSB7Ci0JCQltc3MgPSBuZXcgTXVsdGljYXN0U29ja2V0KCk7Ci0JCQltc3Muc2V0VGltZVRvTGl2ZSgxMjApOwotCQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IDFzdCBUVEw6ICIgKyBtc3MuZ2V0VGltZVRvTGl2ZSgpLAotCQkJCQltc3MuZ2V0VGltZVRvTGl2ZSgpID09IDEyMCk7Ci0JCQltc3Muc2V0VGltZVRvTGl2ZSgyMjApOwotCQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IDJuZCBUVEw6ICIgKyBtc3MuZ2V0VGltZVRvTGl2ZSgpLAotCQkJCQltc3MuZ2V0VGltZVRvTGl2ZSgpID09IDIyMCk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX01VTFRJQ0FTVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fTVVMVElDQVNUKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I3NldFRpbWVUb0xpdmUoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRpbWVUb0xpdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFRpbWVUb0xpdmVJKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldCgpOworICAgICAgICAgICAgbXNzLnNldFRpbWVUb0xpdmUoMTIwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCAxc3QgVFRMOiAiICsgbXNzLmdldFRpbWVUb0xpdmUoKSwKKyAgICAgICAgICAgICAgICAgICAgbXNzLmdldFRpbWVUb0xpdmUoKSA9PSAxMjApOworICAgICAgICAgICAgbXNzLnNldFRpbWVUb0xpdmUoMjIwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCAybmQgVFRMOiAiICsgbXNzLmdldFRpbWVUb0xpdmUoKSwKKyAgICAgICAgICAgICAgICAgICAgbXNzLmdldFRpbWVUb0xpdmUoKSA9PSAyMjApOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19NVUxUSUNBU1QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX01VTFRJQ0FTVCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I3NldFRUTChieXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0VFRMQigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0LnNldFRUTChieXRlKQotCQl0cnkgewotCQkJbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldCgpOwotCQkJbXNzLnNldFRUTCgoYnl0ZSkgMTIwKTsKLQkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBzZXQgVFRMOiAiICsgbXNzLmdldFRUTCgpLAotCQkJCQltc3MuZ2V0VFRMKCkgPT0gMTIwKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjc2V0VFRMKGJ5dGUpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VFRMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VFRMQigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0LnNldFRUTChieXRlKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbXNzID0gbmV3IE11bHRpY2FzdFNvY2tldCgpOworICAgICAgICAgICAgbXNzLnNldFRUTCgoYnl0ZSkgMTIwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBzZXQgVFRMOiAiICsgbXNzLmdldFRUTCgpLAorICAgICAgICAgICAgICAgICAgICBtc3MuZ2V0VFRMKCkgPT0gMTIwKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fTVVMVElDQVNUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19NVUxUSUNBU1QpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNNdWx0aWNhc3RTb2NrZXQoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCU11bHRpY2FzdFNvY2tldCBtcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKFNvY2tldEFkZHJlc3MpIG51bGwpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjTXVsdGljYXN0U29ja2V0KGphdmEubmV0LlNvY2tldEFkZHJlc3MpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNdWx0aWNhc3RTb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9Tb2NrZXRBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7ICAgIAorICAgICAgICBNdWx0aWNhc3RTb2NrZXQgbXMgPSBuZXcgTXVsdGljYXN0U29ja2V0KChTb2NrZXRBZGRyZXNzKSBudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIG5vdCBiZSBib3VuZCIsICFtcy5pc0JvdW5kKCkgJiYgIW1zLmlzQ2xvc2VkKCkKICAgICAgICAgICAgICAgICAmJiAhbXMuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIG1zLmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLApAQCAtOTUyLDQ4ICsxMTAyLDc1IEBACiAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjAuMC4wLjAiLCAwKTsKICAgICAgICAgTXVsdGljYXN0U29ja2V0IHMgPSBuZXcgTXVsdGljYXN0U29ja2V0KGFkZHIpOwogICAgICAgICBhc3NlcnRUcnVlKHMuZ2V0UmV1c2VBZGRyZXNzKCkpOyAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNnZXRMb29wYmFja01vZGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9vcGJhY2tNb2RlKCkgewotCQl0cnkgewotCQkJTXVsdGljYXN0U29ja2V0IG1zID0gbmV3IE11bHRpY2FzdFNvY2tldCgoU29ja2V0QWRkcmVzcykgbnVsbCk7Ci0JCQlhc3NlcnRUcnVlKCJzaG91bGQgbm90IGJlIGJvdW5kIiwgIW1zLmlzQm91bmQoKSAmJiAhbXMuaXNDbG9zZWQoKQotCQkJCQkmJiAhbXMuaXNDb25uZWN0ZWQoKSk7Ci0JCQltcy5nZXRMb29wYmFja01vZGUoKTsKLQkJCWFzc2VydFRydWUoInNob3VsZCBub3QgYmUgYm91bmQiLCAhbXMuaXNCb3VuZCgpICYmICFtcy5pc0Nsb3NlZCgpCi0JCQkJCSYmICFtcy5pc0Nvbm5lY3RlZCgpKTsKLQkJCW1zLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgY2xvc2VkIiwgbXMuaXNDbG9zZWQoKSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1VTRUxPT1BCQUNLKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1VTRUxPT1BCQUNLKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0I2dldExvb3BiYWNrTW9kZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9vcGJhY2tNb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb29wYmFja01vZGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNdWx0aWNhc3RTb2NrZXQgbXMgPSBuZXcgTXVsdGljYXN0U29ja2V0KChTb2NrZXRBZGRyZXNzKSBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInNob3VsZCBub3QgYmUgYm91bmQiLCAhbXMuaXNCb3VuZCgpICYmICFtcy5pc0Nsb3NlZCgpCisgICAgICAgICAgICAgICAgICAgICYmICFtcy5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgICAgIG1zLmdldExvb3BiYWNrTW9kZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIG5vdCBiZSBib3VuZCIsICFtcy5pc0JvdW5kKCkgJiYgIW1zLmlzQ2xvc2VkKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1zLmlzQ29ubmVjdGVkKCkpOworICAgICAgICAgICAgbXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInNob3VsZCBiZSBjbG9zZWQiLCBtcy5pc0Nsb3NlZCgpKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fVVNFTE9PUEJBQ0spOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fVVNFTE9PUEJBQ0spOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNzZXRMb29wYmFja01vZGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldExvb3BiYWNrTW9kZVooKSB7Ci0JCXRyeSB7Ci0JCQlNdWx0aWNhc3RTb2NrZXQgbXMgPSBuZXcgTXVsdGljYXN0U29ja2V0KCk7Ci0JCQltcy5zZXRMb29wYmFja01vZGUodHJ1ZSk7Ci0JCQlhc3NlcnRUcnVlKCJsb29wYmFjayBzaG91bGQgYmUgdHJ1ZSIsIG1zLmdldExvb3BiYWNrTW9kZSgpKTsKLQkJCW1zLnNldExvb3BiYWNrTW9kZShmYWxzZSk7Ci0JCQlhc3NlcnRUcnVlKCJsb29wYmFjayBzaG91bGQgYmUgZmFsc2UiLCAhbXMuZ2V0TG9vcGJhY2tNb2RlKCkpOwotCQkJbXMuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoInNob3VsZCBiZSBjbG9zZWQiLCBtcy5pc0Nsb3NlZCgpKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fVVNFTE9PUEJBQ0spOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fVVNFTE9PUEJBQ0spOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjc2V0TG9vcGJhY2tNb2RlKGJvb2xlYW4pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TG9vcGJhY2tNb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9vcGJhY2tNb2RlWigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE11bHRpY2FzdFNvY2tldCBtcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKKyAgICAgICAgICAgIG1zLnNldExvb3BiYWNrTW9kZSh0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImxvb3BiYWNrIHNob3VsZCBiZSB0cnVlIiwgbXMuZ2V0TG9vcGJhY2tNb2RlKCkpOworICAgICAgICAgICAgbXMuc2V0TG9vcGJhY2tNb2RlKGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImxvb3BiYWNrIHNob3VsZCBiZSBmYWxzZSIsICFtcy5nZXRMb29wYmFja01vZGUoKSk7CisgICAgICAgICAgICBtcy5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGJlIGNsb3NlZCIsIG1zLmlzQ2xvc2VkKCkpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19VU0VMT09QQkFDSyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19VU0VMT09QQkFDSyk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0Lk11bHRpY2FzdFNvY2tldCNzZXRMb29wYmFja01vZGUoYm9vbGVhbikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldExvb3BiYWNrTW9kZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExvb3BiYWNrTW9kZVNlbmRSZWNlaXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uewogICAgICAgICBmaW5hbCBTdHJpbmcgQUREUkVTUyA9ICIyMjQuMS4yLjMiOwogICAgICAgICBmaW5hbCBpbnQgUE9SVCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKTsKQEAgLTEwMzEsOTYgKzEyMDgsMTA1IEBACiAgICAgfQogICAgIAogICAgIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjc2V0UmV1c2VBZGRyZXNzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRSZXVzZUFkZHJlc3NaKCkgewotCQl0cnkgewotCQkJLy8gdGVzdCBjYXNlIHdlcmUgd2Ugc2V0IGl0IHRvIGZhbHNlCi0JCQlNdWx0aWNhc3RTb2NrZXQgdGhlU29ja2V0MSA9IG51bGw7Ci0JCQlNdWx0aWNhc3RTb2NrZXQgdGhlU29ja2V0MiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgotCQkJCQkJCQkuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7Ci0JCQkJdGhlU29ja2V0MSA9IG5ldyBNdWx0aWNhc3RTb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MiA9IG5ldyBNdWx0aWNhc3RTb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MS5zZXRSZXVzZUFkZHJlc3MoZmFsc2UpOwotCQkJCXRoZVNvY2tldDIuc2V0UmV1c2VBZGRyZXNzKGZhbHNlKTsKLQkJCQl0aGVTb2NrZXQxLmJpbmQodGhlQWRkcmVzcyk7Ci0JCQkJdGhlU29ja2V0Mi5iaW5kKHRoZUFkZHJlc3MpOwotCQkJCWZhaWwoCi0JCQkJCQkiTm8gZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZG8gZHVwbGljYXRlIHNvY2tldCBiaW5kIHdpdGggcmUtdXNlYWRkciBzZXQgdG8gZmFsc2UiKTsKLQkJCX0gY2F0Y2ggKEJpbmRFeGNlcHRpb24gZSkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQjc2V0UmV1c2VBZGRyZXNzKGJvb2xlYW4pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VzZC4gTWV0aG9kIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubmV0LkRhdGFncmFtU29ja2V0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmV1c2VBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmV1c2VBZGRyZXNzWigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRlc3QgY2FzZSB3ZXJlIHdlIHNldCBpdCB0byBmYWxzZQorICAgICAgICAgICAgTXVsdGljYXN0U29ja2V0IHRoZVNvY2tldDEgPSBudWxsOworICAgICAgICAgICAgTXVsdGljYXN0U29ja2V0IHRoZVNvY2tldDIgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5leHRQb3J0Rm9yVURQKCkpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEgPSBuZXcgTXVsdGljYXN0U29ja2V0KG51bGwpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIgPSBuZXcgTXVsdGljYXN0U29ja2V0KG51bGwpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEuc2V0UmV1c2VBZGRyZXNzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLnNldFJldXNlQWRkcmVzcyhmYWxzZSk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0MS5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIGRvIGR1cGxpY2F0ZSBzb2NrZXQgYmluZCB3aXRoIHJlLXVzZWFkZHIgc2V0IHRvIGZhbHNlIik7CisgICAgICAgICAgICB9IGNhdGNoIChCaW5kRXhjZXB0aW9uIGUpIHsKIAotCQkJfQotCQkJaWYgKHRoZVNvY2tldDEgIT0gbnVsbCkKLQkJCQl0aGVTb2NrZXQxLmNsb3NlKCk7Ci0JCQlpZiAodGhlU29ja2V0MiAhPSBudWxsKQotCQkJCXRoZVNvY2tldDIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGVTb2NrZXQxICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhlU29ja2V0MS5jbG9zZSgpOworICAgICAgICAgICAgaWYgKHRoZVNvY2tldDIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmNsb3NlKCk7CiAKLQkJCS8vIHRlc3QgY2FzZSB3ZXJlIHdlIHNldCBpdCB0byB0cnVlCi0JCQl0cnkgewotCQkJCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgotCQkJCQkJCQkuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7Ci0JCQkJdGhlU29ja2V0MSA9IG5ldyBNdWx0aWNhc3RTb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MiA9IG5ldyBNdWx0aWNhc3RTb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MS5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0JCQkJdGhlU29ja2V0Mi5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0JCQkJdGhlU29ja2V0MS5iaW5kKHRoZUFkZHJlc3MpOwotCQkJCXRoZVNvY2tldDIuYmluZCh0aGVBZGRyZXNzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgKLQkJCQkJCSJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIGRvIGR1cGxpY2F0ZSBzb2NrZXQgYmluZCB3aXRoIHJlLXVzZWFkZHIgc2V0IHRvIHRydWUiKTsKLQkJCX0KLQkJCWlmICh0aGVTb2NrZXQxICE9IG51bGwpCi0JCQkJdGhlU29ja2V0MS5jbG9zZSgpOwotCQkJaWYgKHRoZVNvY2tldDIgIT0gbnVsbCkKLQkJCQl0aGVTb2NrZXQyLmNsb3NlKCk7CisgICAgICAgICAgICAvLyB0ZXN0IGNhc2Ugd2VyZSB3ZSBzZXQgaXQgdG8gdHJ1ZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5leHRQb3J0Rm9yVURQKCkpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEgPSBuZXcgTXVsdGljYXN0U29ja2V0KG51bGwpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIgPSBuZXcgTXVsdGljYXN0U29ja2V0KG51bGwpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEuc2V0UmV1c2VBZGRyZXNzKHRydWUpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIuc2V0UmV1c2VBZGRyZXNzKHRydWUpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBkbyBkdXBsaWNhdGUgc29ja2V0IGJpbmQgd2l0aCByZS11c2VhZGRyIHNldCB0byB0cnVlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhlU29ja2V0MSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoZVNvY2tldDEuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmICh0aGVTb2NrZXQyICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5jbG9zZSgpOwogCi0JCQkvLyB0ZXN0IHRoZSBkZWZhdWx0IGNhc2Ugd2hpY2ggd2UgZXhwZWN0IHRvIGJlIHRoZSBzYW1lIG9uIGFsbAotCQkJLy8gcGxhdGZvcm1zCi0JCQl0cnkgewotCQkJCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgotCQkJCQkJCQkuZ2V0TmV4dFBvcnRGb3JVRFAoKSk7Ci0JCQkJdGhlU29ja2V0MSA9IG5ldyBNdWx0aWNhc3RTb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MiA9IG5ldyBNdWx0aWNhc3RTb2NrZXQobnVsbCk7Ci0JCQkJdGhlU29ja2V0MS5iaW5kKHRoZUFkZHJlc3MpOwotCQkJCXRoZVNvY2tldDIuYmluZCh0aGVBZGRyZXNzKTsKLQkJCX0gY2F0Y2ggKEJpbmRFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoCi0JCQkJCQkidW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBkbyBkdXBsaWNhdGUgc29ja2V0IGJpbmQgd2l0aCByZS11c2VhZGRyIGxlZnQgYXMgZGVmYXVsdCIpOwotCQkJfQotCQkJaWYgKHRoZVNvY2tldDEgIT0gbnVsbCkKLQkJCQl0aGVTb2NrZXQxLmNsb3NlKCk7Ci0JCQlpZiAodGhlU29ja2V0MiAhPSBudWxsKQotCQkJCXRoZVNvY2tldDIuY2xvc2UoKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkVVU0VBRERSKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19SRVVTRUFERFIpOwotCQl9Ci0JfQorICAgICAgICAgICAgLy8gdGVzdCB0aGUgZGVmYXVsdCBjYXNlIHdoaWNoIHdlIGV4cGVjdCB0byBiZSB0aGUgc2FtZSBvbiBhbGwKKyAgICAgICAgICAgIC8vIHBsYXRmb3JtcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5leHRQb3J0Rm9yVURQKCkpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEgPSBuZXcgTXVsdGljYXN0U29ja2V0KG51bGwpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIgPSBuZXcgTXVsdGljYXN0U29ja2V0KG51bGwpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDEuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChCaW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZG8gZHVwbGljYXRlIHNvY2tldCBiaW5kIHdpdGggcmUtdXNlYWRkciBsZWZ0IGFzIGRlZmF1bHQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGVTb2NrZXQxICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhlU29ja2V0MS5jbG9zZSgpOworICAgICAgICAgICAgaWYgKHRoZVNvY2tldDIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmNsb3NlKCk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1JFVVNFQUREUik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fUkVVU0VBRERSKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewogCi0JCUVudW1lcmF0aW9uIHRoZUludGVyZmFjZXMgPSBudWxsOwotCQl0cnkgewotCQkJdGhlSW50ZXJmYWNlcyA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICBFbnVtZXJhdGlvbiB0aGVJbnRlcmZhY2VzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQkvLyBvbmx5IGNvbnNpZGVyIGludGVyZmFjZXMgdGhhdCBoYXZlIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLQkJLy8gT3RoZXJ3aXNlIHRlc3RzIGRvbid0IHdvcmsgc28gd2VsbAotCQlpZiAodGhlSW50ZXJmYWNlcyAhPSBudWxsKSB7CisgICAgICAgIC8vIG9ubHkgY29uc2lkZXIgaW50ZXJmYWNlcyB0aGF0IGhhdmUgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICAgICAgICAvLyBPdGhlcndpc2UgdGVzdHMgZG9uJ3Qgd29yayBzbyB3ZWxsCisgICAgICAgIGlmICh0aGVJbnRlcmZhY2VzICE9IG51bGwpIHsKIAotCQkJYXRMZWFzdE9uZUludGVyZmFjZSA9IGZhbHNlOwotCQkJd2hpbGUgKHRoZUludGVyZmFjZXMuaGFzTW9yZUVsZW1lbnRzKCkKKyAgICAgICAgICAgIGF0TGVhc3RPbmVJbnRlcmZhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlICh0aGVJbnRlcmZhY2VzLmhhc01vcmVFbGVtZW50cygpCiAgICAgICAgICAgICAgICAgICAgICYmIChhdExlYXN0T25lSW50ZXJmYWNlID09IGZhbHNlKSkgewogICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UxID0gKE5ldHdvcmtJbnRlcmZhY2UpIHRoZUludGVyZmFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0RWxlbWVudCgpOwpAQCAtMTEzNCw4ICsxMzIwLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLQkJCWF0TGVhc3RUd29JbnRlcmZhY2VzID0gZmFsc2U7Ci0JCQlpZiAodGhlSW50ZXJmYWNlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgYXRMZWFzdFR3b0ludGVyZmFjZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0aGVJbnRlcmZhY2VzLmhhc01vcmVFbGVtZW50cygpKSB7CiAgICAgICAgICAgICAgICAgd2hpbGUgKHRoZUludGVyZmFjZXMuaGFzTW9yZUVsZW1lbnRzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChhdExlYXN0VHdvSW50ZXJmYWNlcyA9PSBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTIgPSAoTmV0d29ya0ludGVyZmFjZSkgdGhlSW50ZXJmYWNlcwpAQCAtMTE1MSw0NCArMTMzNyw0NCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotCQkJRW51bWVyYXRpb24gYWRkcmVzc2VzOworICAgICAgICAgICAgRW51bWVyYXRpb24gYWRkcmVzc2VzOwogCi0JCQkvLyBmaXJzdCB0aGUgZmlyc3QgaW50ZXJmYWNlIHRoYXQgc3VwcG9ydHMgSVBWNiBpZiBvbmUgZXhpc3RzCi0JCQl0cnkgewotCQkJCXRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJd2hpbGUgKHRoZUludGVyZmFjZXMuaGFzTW9yZUVsZW1lbnRzKCkgJiYgIWZvdW5kKSB7Ci0JCQkJTmV0d29ya0ludGVyZmFjZSBuZXh0SW50ZXJmYWNlID0gKE5ldHdvcmtJbnRlcmZhY2UpIHRoZUludGVyZmFjZXMKLQkJCQkJCS5uZXh0RWxlbWVudCgpOwotCQkJCWFkZHJlc3NlcyA9IG5leHRJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpOwotCQkJCWlmIChhZGRyZXNzZXMgIT0gbnVsbCkgewotCQkJCQl3aGlsZSAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCQlJbmV0QWRkcmVzcyBuZXh0QWRkcmVzcyA9IChJbmV0QWRkcmVzcykgYWRkcmVzc2VzCi0JCQkJCQkJCS5uZXh0RWxlbWVudCgpOwotCQkJCQkJaWYgKG5leHRBZGRyZXNzIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKSB7Ci0JCQkJCQkJSVBWNm5ldHdvcmtJbnRlcmZhY2UxID0gbmV4dEludGVyZmFjZTsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICAvLyBmaXJzdCB0aGUgZmlyc3QgaW50ZXJmYWNlIHRoYXQgc3VwcG9ydHMgSVBWNiBpZiBvbmUgZXhpc3RzCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKHRoZUludGVyZmFjZXMuaGFzTW9yZUVsZW1lbnRzKCkgJiYgIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXh0SW50ZXJmYWNlID0gKE5ldHdvcmtJbnRlcmZhY2UpIHRoZUludGVyZmFjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGFkZHJlc3NlcyA9IG5leHRJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBuZXh0QWRkcmVzcyA9IChJbmV0QWRkcmVzcykgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRBZGRyZXNzIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBWNm5ldHdvcmtJbnRlcmZhY2UxID0gbmV4dEludGVyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKIAotCQlpZiAodCAhPSBudWxsKQotCQkJdC5pbnRlcnJ1cHQoKTsKLQkJaWYgKG1zcyAhPSBudWxsKQotCQkJbXNzLmNsb3NlKCk7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zdG9wU2VydmVyKCk7Ci0JfQorICAgICAgICBpZiAodCAhPSBudWxsKQorICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgaWYgKG1zcyAhPSBudWxsKQorICAgICAgICAgICAgbXNzLmNsb3NlKCk7CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZlci5zdG9wU2VydmVyKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9OZXRQZXJtaXNzaW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9OZXRQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IGFlYTMxMGEuLjhmMmMzZDkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTmV0UGVybWlzc2lvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L05ldFBlcm1pc3Npb25UZXN0LmphdmEKQEAgLTE3LDQ0ICsxNyw2OCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uOwogCitAVGVzdFRhcmdldENsYXNzKE5ldFBlcm1pc3Npb24uY2xhc3MpIAogcHVibGljIGNsYXNzIE5ldFBlcm1pc3Npb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uI05ldFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCi0JCU5ldFBlcm1pc3Npb24gbiA9IG5ldyBOZXRQZXJtaXNzaW9uKCJyZXF1ZXN0UGFzc3dvcmRBdXRoZW50aWNhdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBuYW1lIiwgCi0JCQkJInJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uIiwgbi5nZXROYW1lKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTmV0UGVybWlzc2lvbiNOZXRQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTmV0UGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0Lk5ldFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgTmV0UGVybWlzc2lvbiBuID0gbmV3IE5ldFBlcm1pc3Npb24oInJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG5hbWUiLCAKKyAgICAgICAgICAgICAgICAicmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb24iLCBuLmdldE5hbWUoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk5ldFBlcm1pc3Npb24jTmV0UGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuTmV0UGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAotCQkvLyBqYXZhLmxhbmcuU3RyaW5nKQotCQlOZXRQZXJtaXNzaW9uIG4gPSBuZXcgTmV0UGVybWlzc2lvbigicmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb24iLAotCQkJCW51bGwpOwotCQlhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBuYW1lIiwgCi0JCQkJInJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uIiwgbi5nZXROYW1lKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTmV0UGVybWlzc2lvbiNOZXRQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOZXRQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0Lk5ldFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKKyAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgTmV0UGVybWlzc2lvbiBuID0gbmV3IE5ldFBlcm1pc3Npb24oInJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uIiwKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgbmFtZSIsIAorICAgICAgICAgICAgICAgICJyZXF1ZXN0UGFzc3dvcmRBdXRoZW50aWNhdGlvbiIsIG4uZ2V0TmFtZSgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZVRlc3QuamF2YQppbmRleCAwNGI1OGE5Li40YmE3OTQyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L05ldHdvcmtJbnRlcmZhY2VUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNlVGVzdC5qYXZhCkBAIC0xNyw1MTYgKzE3LDYwMyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOwogaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhOZXR3b3JrSW50ZXJmYWNlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBOZXR3b3JrSW50ZXJmYWNlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvLyBwcml2YXRlIG1lbWJlciB2YXJpYWJsZXMgdXNlZCBmb3IgdGVzdHMKLQlib29sZWFuIGF0TGVhc3RPbmVJbnRlcmZhY2UgPSBmYWxzZTsKKyAgICAvLyBwcml2YXRlIG1lbWJlciB2YXJpYWJsZXMgdXNlZCBmb3IgdGVzdHMKKyAgICBib29sZWFuIGF0TGVhc3RPbmVJbnRlcmZhY2UgPSBmYWxzZTsKIAotCWJvb2xlYW4gYXRMZWFzdFR3b0ludGVyZmFjZXMgPSBmYWxzZTsKKyAgICBib29sZWFuIGF0TGVhc3RUd29JbnRlcmZhY2VzID0gZmFsc2U7CiAKLQlwcml2YXRlIE5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZTEgPSBudWxsOworICAgIHByaXZhdGUgTmV0d29ya0ludGVyZmFjZSBuZXR3b3JrSW50ZXJmYWNlMSA9IG51bGw7CiAKLQlwcml2YXRlIE5ldHdvcmtJbnRlcmZhY2Ugc2FtZUFzTmV0d29ya0ludGVyZmFjZTEgPSBudWxsOworICAgIHByaXZhdGUgTmV0d29ya0ludGVyZmFjZSBzYW1lQXNOZXR3b3JrSW50ZXJmYWNlMSA9IG51bGw7CiAKLQlwcml2YXRlIE5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZTIgPSBudWxsOworICAgIHByaXZhdGUgTmV0d29ya0ludGVyZmFjZSBuZXR3b3JrSW50ZXJmYWNlMiA9IG51bGw7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0JCWlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7Ci0JCQlhc3NlcnROb3ROdWxsKCJ2YWxpZGF0ZSB0aGF0IG5vbiBudWxsIG5hbWUgaXMgcmV0dXJuZWQiLAotCQkJCQluZXR3b3JrSW50ZXJmYWNlMS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RmFsc2UoInZhbGlkYXRlIHRoYXQgbm9uLXplcm8gbGVuZ3RoIG5hbWUgaXMgZ2VuZXJhdGVkIiwKLQkJCQkJbmV0d29ya0ludGVyZmFjZTEuZ2V0TmFtZSgpLmVxdWFscygiIikpOwotCQl9Ci0JCWlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgewotCQkJYXNzZXJ0RmFsc2UoCi0JCQkJCSJWYWxpZGF0ZSBzdHJpbmdzIGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VzIiwKLQkJCQkJbmV0d29ya0ludGVyZmFjZTEuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQluZXR3b3JrSW50ZXJmYWNlMi5nZXROYW1lKCkpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSNnZXROYW1lKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgeworICAgICAgICBpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgidmFsaWRhdGUgdGhhdCBub24gbnVsbCBuYW1lIGlzIHJldHVybmVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJ2YWxpZGF0ZSB0aGF0IG5vbi16ZXJvIGxlbmd0aCBuYW1lIGlzIGdlbmVyYXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UxLmdldE5hbWUoKS5lcXVhbHMoIiIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgICAgICAiVmFsaWRhdGUgc3RyaW5ncyBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgaW50ZXJmYWNlcyIsCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UxLmdldE5hbWUoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTIuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSNnZXRJbmV0QWRkcmVzc2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEluZXRBZGRyZXNzZXMoKSB7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UjZ2V0SW5ldEFkZHJlc3NlcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5ldEFkZHJlc3NlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5ldEFkZHJlc3NlcygpIHsKIAotCQkvLyBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWxsb3dzIHVzIHRvIGNoZWNrIHRoYXQgd2Ugb25seSByZXR1cm4gdGhlCi0JCS8vIGFkZHJlc3NlcyB0aGF0IHdlIHNob3VsZAotCQljbGFzcyBteVNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CisgICAgICAgIC8vIHNlY3VyaXR5IG1hbmFnZXIgdGhhdCBhbGxvd3MgdXMgdG8gY2hlY2sgdGhhdCB3ZSBvbmx5IHJldHVybiB0aGUKKyAgICAgICAgLy8gYWRkcmVzc2VzIHRoYXQgd2Ugc2hvdWxkCisgICAgICAgIGNsYXNzIG15U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKIAotCQkJQXJyYXlMaXN0IGRpc2FsbG93ZWROYW1lcyA9IG51bGw7CisgICAgICAgICAgICBBcnJheUxpc3QgZGlzYWxsb3dlZE5hbWVzID0gbnVsbDsKIAotCQkJcHVibGljIG15U2VjdXJpdHlNYW5hZ2VyKEFycmF5TGlzdCBhZGRyZXNzZXMpIHsKLQkJCQlkaXNhbGxvd2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRyZXNzZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJZGlzYWxsb3dlZE5hbWVzLmFkZCgoKEluZXRBZGRyZXNzKSBhZGRyZXNzZXMuZ2V0KGkpKQotCQkJCQkJCS5nZXRIb3N0TmFtZSgpKTsKLQkJCQkJZGlzYWxsb3dlZE5hbWVzLmFkZCgoKEluZXRBZGRyZXNzKSBhZGRyZXNzZXMuZ2V0KGkpKQotCQkJCQkJCS5nZXRIb3N0QWRkcmVzcygpKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgbXlTZWN1cml0eU1hbmFnZXIoQXJyYXlMaXN0IGFkZHJlc3NlcykgeworICAgICAgICAgICAgICAgIGRpc2FsbG93ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHJlc3Nlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkTmFtZXMuYWRkKCgoSW5ldEFkZHJlc3MpIGFkZHJlc3Nlcy5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEhvc3ROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkTmFtZXMuYWRkKCgoSW5ldEFkZHJlc3MpIGFkZHJlc3Nlcy5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEhvc3RBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIHZvaWQgY2hlY2tDb25uZWN0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tDb25uZWN0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewogCi0JCQkJaWYgKGhvc3QgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImhvc3Qgd2FzIG51bGwpIik7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJob3N0IHdhcyBudWxsKSIpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlzYWxsb3dlZE5hbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmICgoKFN0cmluZykgZGlzYWxsb3dlZE5hbWVzLmdldChpKSkuZXF1YWxzKGhvc3QpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIm5vdCBhbGxvd2VkIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNhbGxvd2VkTmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSBkaXNhbGxvd2VkTmFtZXMuZ2V0KGkpKS5lcXVhbHMoaG9zdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigibm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQl9CisgICAgICAgIH0KIAotCQlpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgewotCQkJRW51bWVyYXRpb24gdGhlQWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTEuZ2V0SW5ldEFkZHJlc3NlcygpOwotCQkJaWYgKHRoZUFkZHJlc3NlcyAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKHRoZUFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlJbmV0QWRkcmVzcyB0aGVBZGRyZXNzID0gKEluZXRBZGRyZXNzKSB0aGVBZGRyZXNzZXMKLQkJCQkJCQkubmV4dEVsZW1lbnQoKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgidmFsaWRhdGUgdGhhdCBhZGRyZXNzIGlzIG5vdCBudWxsIiwKLQkJCQkJCQludWxsICE9IHRoZUFkZHJlc3MpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgeworICAgICAgICAgICAgRW51bWVyYXRpb24gdGhlQWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTEuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgICAgICAgaWYgKHRoZUFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRoZUFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyB0aGVBZGRyZXNzID0gKEluZXRBZGRyZXNzKSB0aGVBZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidmFsaWRhdGUgdGhhdCBhZGRyZXNzIGlzIG5vdCBudWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRoZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgewotCQkJRW51bWVyYXRpb24gdGhlQWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTIuZ2V0SW5ldEFkZHJlc3NlcygpOwotCQkJaWYgKHRoZUFkZHJlc3NlcyAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKHRoZUFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlJbmV0QWRkcmVzcyB0aGVBZGRyZXNzID0gKEluZXRBZGRyZXNzKSB0aGVBZGRyZXNzZXMKLQkJCQkJCQkubmV4dEVsZW1lbnQoKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgidmFsaWRhdGUgdGhhdCBhZGRyZXNzIGlzIG5vdCBudWxsIiwKLQkJCQkJCQludWxsICE9IHRoZUFkZHJlc3MpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHRoZUFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UyLmdldEluZXRBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgIGlmICh0aGVBZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdoaWxlICh0aGVBZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgdGhlQWRkcmVzcyA9IChJbmV0QWRkcmVzcykgdGhlQWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoInZhbGlkYXRlIHRoYXQgYWRkcmVzcyBpcyBub3QgbnVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyBjcmVhdGUgdGhlIGxpc3Qgb2Ygb2sgYW5kIG5vdCBvayBhZGRyZXNzZXMgdG8gcmV0dXJuCi0JCWlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7Ci0JCQlBcnJheUxpc3Qgb2tBZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlFbnVtZXJhdGlvbiBhZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMS5nZXRJbmV0QWRkcmVzc2VzKCk7Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJQXJyYXlMaXN0IG5vdE9rQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGFkZHJlc3NlcyAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlJbmV0QWRkcmVzcyB0aGVBZGRyZXNzID0gKEluZXRBZGRyZXNzKSBhZGRyZXNzZXMKLQkJCQkJCQkubmV4dEVsZW1lbnQoKTsKLQkJCQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCQkJCW9rQWRkcmVzc2VzLmFkZCh0aGVBZGRyZXNzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5vdE9rQWRkcmVzc2VzLmFkZCh0aGVBZGRyZXNzKTsKLQkJCQkJfQotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KKyAgICAgICAgLy8gY3JlYXRlIHRoZSBsaXN0IG9mIG9rIGFuZCBub3Qgb2sgYWRkcmVzc2VzIHRvIHJldHVybgorICAgICAgICBpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgeworICAgICAgICAgICAgQXJyYXlMaXN0IG9rQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgRW51bWVyYXRpb24gYWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTEuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIEFycmF5TGlzdCBub3RPa0FkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdoaWxlIChhZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgdGhlQWRkcmVzcyA9IChJbmV0QWRkcmVzcykgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBva0FkZHJlc3Nlcy5hZGQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RPa0FkZHJlc3Nlcy5hZGQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCS8vIGRvIHRoZSBzYW1lIGZvciBuZXR3b3JrIGludGVyZmFjZSAyIGl0IGl0IGV4aXN0cwotCQkJaWYgKGF0TGVhc3RUd29JbnRlcmZhY2VzKSB7Ci0JCQkJYWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTIuZ2V0SW5ldEFkZHJlc3NlcygpOwotCQkJCWluZGV4ID0gMDsKLQkJCQlpZiAoYWRkcmVzc2VzICE9IG51bGwpIHsKLQkJCQkJd2hpbGUgKGFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQkJSW5ldEFkZHJlc3MgdGhlQWRkcmVzcyA9IChJbmV0QWRkcmVzcykgYWRkcmVzc2VzCi0JCQkJCQkJCS5uZXh0RWxlbWVudCgpOwotCQkJCQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCQkJCQlva0FkZHJlc3Nlcy5hZGQodGhlQWRkcmVzcyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW5vdE9rQWRkcmVzc2VzLmFkZCh0aGVBZGRyZXNzKTsKLQkJCQkJCX0KLQkJCQkJCWluZGV4Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAvLyBkbyB0aGUgc2FtZSBmb3IgbmV0d29yayBpbnRlcmZhY2UgMiBpdCBpdCBleGlzdHMKKyAgICAgICAgICAgIGlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgeworICAgICAgICAgICAgICAgIGFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UyLmdldEluZXRBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChhZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSAoSW5ldEFkZHJlc3MpIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2tBZGRyZXNzZXMuYWRkKHRoZUFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RPa0FkZHJlc3Nlcy5hZGQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkvLyBzZXQgdGhlIHNlY3VyaXR5IG1hbmFnZXIgdGhhdCB3aWxsIG1ha2UgdGhlIGZpcnN0IGFkZHJlc3Mgbm90Ci0JCQkvLyB2aXNpYmxlCi0JCQlTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBteVNlY3VyaXR5TWFuYWdlcihub3RPa0FkZHJlc3NlcykpOworICAgICAgICAgICAgLy8gc2V0IHRoZSBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgd2lsbCBtYWtlIHRoZSBmaXJzdCBhZGRyZXNzIG5vdAorICAgICAgICAgICAgLy8gdmlzaWJsZQorICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgbXlTZWN1cml0eU1hbmFnZXIobm90T2tBZGRyZXNzZXMpKTsKIAotCQkJLy8gdmFsaWRhdGUgbm90IG9rIGFkZHJlc3NlcyBhcmUgbm90IHJldHVybmVkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdE9rQWRkcmVzc2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRW51bWVyYXRpb24gcmVkdWNlZEFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UxCi0JCQkJCQkuZ2V0SW5ldEFkZHJlc3NlcygpOwotCQkJCWlmIChyZWR1Y2VkQWRkcmVzc2VzICE9IG51bGwpIHsKLQkJCQkJd2hpbGUgKHJlZHVjZWRBZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJCUluZXRBZGRyZXNzIG5leHRBZGRyZXNzID0gKEluZXRBZGRyZXNzKSByZWR1Y2VkQWRkcmVzc2VzCi0JCQkJCQkJCS5uZXh0RWxlbWVudCgpOwotCQkJCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJCQkJInZhbGlkYXRlIHRoYXQgYWRkcmVzcyB3aXRob3V0IHBlcm1pc3Npb24gaXMgbm90IHJldHVybmVkIiwKLQkJCQkJCQkJIW5leHRBZGRyZXNzLmVxdWFscyhub3RPa0FkZHJlc3Nlcy5nZXQoaSkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKLQkJCQkJcmVkdWNlZEFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UyLmdldEluZXRBZGRyZXNzZXMoKTsKLQkJCQkJaWYgKHJlZHVjZWRBZGRyZXNzZXMgIT0gbnVsbCkgewotCQkJCQkJd2hpbGUgKHJlZHVjZWRBZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJCQlJbmV0QWRkcmVzcyBuZXh0QWRkcmVzcyA9IChJbmV0QWRkcmVzcykgcmVkdWNlZEFkZHJlc3NlcwotCQkJCQkJCQkJLm5leHRFbGVtZW50KCk7Ci0JCQkJCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJCQkJCSJ2YWxpZGF0ZSB0aGF0IGFkZHJlc3Mgd2l0aG91dCBwZXJtaXNzaW9uIGlzIG5vdCByZXR1cm5lZCIsCi0JCQkJCQkJCQkhbmV4dEFkZHJlc3MuZXF1YWxzKG5vdE9rQWRkcmVzc2VzLmdldChpKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgLy8gdmFsaWRhdGUgbm90IG9rIGFkZHJlc3NlcyBhcmUgbm90IHJldHVybmVkCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vdE9rQWRkcmVzc2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gcmVkdWNlZEFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UxCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgICAgICAgICAgIGlmIChyZWR1Y2VkQWRkcmVzc2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZHVjZWRBZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIG5leHRBZGRyZXNzID0gKEluZXRBZGRyZXNzKSByZWR1Y2VkQWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIHRoYXQgYWRkcmVzcyB3aXRob3V0IHBlcm1pc3Npb24gaXMgbm90IHJldHVybmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5leHRBZGRyZXNzLmVxdWFscyhub3RPa0FkZHJlc3Nlcy5nZXQoaSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVkdWNlZEFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UyLmdldEluZXRBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZHVjZWRBZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZHVjZWRBZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBuZXh0QWRkcmVzcyA9IChJbmV0QWRkcmVzcykgcmVkdWNlZEFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSB0aGF0IGFkZHJlc3Mgd2l0aG91dCBwZXJtaXNzaW9uIGlzIG5vdCByZXR1cm5lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV4dEFkZHJlc3MuZXF1YWxzKG5vdE9rQWRkcmVzc2VzLmdldChpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkvLyB2YWxpZGF0ZSB0aGF0IG9rIGFkZHJlc3NlcyBhcmUgcmV0dXJuZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2tBZGRyZXNzZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlib29sZWFuIGFkZHJlc3NSZXR1cm5lZCA9IGZhbHNlOwotCQkJCUVudW1lcmF0aW9uIHJlZHVjZWRBZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMQotCQkJCQkJLmdldEluZXRBZGRyZXNzZXMoKTsKLQkJCQlpZiAocmVkdWNlZEFkZHJlc3NlcyAhPSBudWxsKSB7Ci0JCQkJCXdoaWxlIChyZWR1Y2VkQWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCQlJbmV0QWRkcmVzcyBuZXh0QWRkcmVzcyA9IChJbmV0QWRkcmVzcykgcmVkdWNlZEFkZHJlc3NlcwotCQkJCQkJCQkubmV4dEVsZW1lbnQoKTsKLQkJCQkJCWlmIChuZXh0QWRkcmVzcy5lcXVhbHMob2tBZGRyZXNzZXMuZ2V0KGkpKSkgewotCQkJCQkJCWFkZHJlc3NSZXR1cm5lZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGF0TGVhc3RUd29JbnRlcmZhY2VzKSB7Ci0JCQkJCXJlZHVjZWRBZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMi5nZXRJbmV0QWRkcmVzc2VzKCk7Ci0JCQkJCWlmIChyZWR1Y2VkQWRkcmVzc2VzICE9IG51bGwpIHsKLQkJCQkJCXdoaWxlIChyZWR1Y2VkQWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCQkJSW5ldEFkZHJlc3MgbmV4dEFkZHJlc3MgPSAoSW5ldEFkZHJlc3MpIHJlZHVjZWRBZGRyZXNzZXMKLQkJCQkJCQkJCS5uZXh0RWxlbWVudCgpOwotCQkJCQkJCWlmIChuZXh0QWRkcmVzcy5lcXVhbHMob2tBZGRyZXNzZXMuZ2V0KGkpKSkgewotCQkJCQkJCQlhZGRyZXNzUmV0dXJuZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKCJ2YWxpZGF0ZSB0aGF0IGFkZHJlc3Mgd2l0aCBwZXJtaXNzaW9uIGlzIHJldHVybmVkIiwKLQkJCQkJCWFkZHJlc3NSZXR1cm5lZCk7Ci0JCQl9CisgICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IG9rIGFkZHJlc3NlcyBhcmUgcmV0dXJuZWQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2tBZGRyZXNzZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGFkZHJlc3NSZXR1cm5lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIHJlZHVjZWRBZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluZXRBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVkdWNlZEFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWR1Y2VkQWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBuZXh0QWRkcmVzcyA9IChJbmV0QWRkcmVzcykgcmVkdWNlZEFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0QWRkcmVzcy5lcXVhbHMob2tBZGRyZXNzZXMuZ2V0KGkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NSZXR1cm5lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF0TGVhc3RUd29JbnRlcmZhY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZHVjZWRBZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMi5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2VkQWRkcmVzc2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWR1Y2VkQWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgbmV4dEFkZHJlc3MgPSAoSW5ldEFkZHJlc3MpIHJlZHVjZWRBZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0QWRkcmVzcy5lcXVhbHMob2tBZGRyZXNzZXMuZ2V0KGkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzUmV0dXJuZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ2YWxpZGF0ZSB0aGF0IGFkZHJlc3Mgd2l0aCBwZXJtaXNzaW9uIGlzIHJldHVybmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NSZXR1cm5lZCk7CisgICAgICAgICAgICB9CiAKLQkJCS8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGdldCB0aGUgaW50ZXJmYWNlIGJ5IHNwZWNpZnlpbmcgdGhlIGFkZHJlc3MuCi0JCQkvLyBUaGlzIGlzIHRvIGJlIGNvbXBhdGlibGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm90T2tBZGRyZXNzZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlhc3NlcnROb3ROdWxsKAotCQkJCQkJCSJ2YWxpZGF0ZSB3ZSBjYW5ub3QgZ2V0IHRoZSBOZXR3b3JrSW50ZXJmYWNlIHdpdGggYW4gYWRkcmVzcyBmb3Igd2hpY2ggd2UgaGF2ZSBubyBwcml2cyIsCi0JCQkJCQkJTmV0d29ya0ludGVyZmFjZQotCQkJCQkJCQkJLmdldEJ5SW5ldEFkZHJlc3MoKEluZXRBZGRyZXNzKSBub3RPa0FkZHJlc3NlcwotCQkJCQkJCQkJCQkuZ2V0KGkpKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZmFpbCgiZ2V0IE5ldHdvcmtJbnRlcmZhY2UgZm9yIGFkZHJlc3Mgd2l0aCBubyBwZXJtIC0gZXhjZXB0aW9uIik7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3ZSBjYW4gZ2V0IHRoZSBpbnRlcmZhY2UgYnkgc3BlY2lmeWluZyB0aGUgYWRkcmVzcy4KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYmUgY29tcGF0aWJsZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub3RPa0FkZHJlc3Nlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIHdlIGNhbm5vdCBnZXQgdGhlIE5ldHdvcmtJbnRlcmZhY2Ugd2l0aCBhbiBhZGRyZXNzIGZvciB3aGljaCB3ZSBoYXZlIG5vIHByaXZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QnlJbmV0QWRkcmVzcygoSW5ldEFkZHJlc3MpIG5vdE9rQWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoaSkpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJnZXQgTmV0d29ya0ludGVyZmFjZSBmb3IgYWRkcmVzcyB3aXRoIG5vIHBlcm0gLSBleGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCS8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGdldCB0aGUgbmV0d29yayBpbnRlcmZhY2UgZm9yIHRoZSBnb29kCi0JCQkvLyBhZGRyZXNzZXMKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBva0FkZHJlc3Nlcy5zaXplKCk7IGkrKykgewotCQkJCQlhc3NlcnROb3ROdWxsKAotCQkJCQkJCSJ2YWxpZGF0ZSB3ZSBjYW5ub3QgZ2V0IHRoZSBOZXR3b3JrSW50ZXJmYWNlIHdpdGggYW4gYWRkcmVzcyBmcm8gd2hpY2ggd2UgaGF2ZSBubyBwcml2cyIsCi0JCQkJCQkJTmV0d29ya0ludGVyZmFjZQotCQkJCQkJCQkJLmdldEJ5SW5ldEFkZHJlc3MoKEluZXRBZGRyZXNzKSBva0FkZHJlc3NlcwotCQkJCQkJCQkJCQkuZ2V0KGkpKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJnZXQgTmV0d29ya0ludGVyZmFjZSBmb3IgYWRkcmVzcyB3aXRoIHBlcm0gLSBleGNlcHRpb24iKTsKLQkJCX0KKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGdldCB0aGUgbmV0d29yayBpbnRlcmZhY2UgZm9yIHRoZSBnb29kCisgICAgICAgICAgICAvLyBhZGRyZXNzZXMKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBva0FkZHJlc3Nlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSB3ZSBjYW5ub3QgZ2V0IHRoZSBOZXR3b3JrSW50ZXJmYWNlIHdpdGggYW4gYWRkcmVzcyBmcm8gd2hpY2ggd2UgaGF2ZSBubyBwcml2cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJ5SW5ldEFkZHJlc3MoKEluZXRBZGRyZXNzKSBva0FkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJnZXQgTmV0d29ya0ludGVyZmFjZSBmb3IgYWRkcmVzcyB3aXRoIHBlcm0gLSBleGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0KIAotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKLQkJfQotCX0KKyAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSNnZXREaXNwbGF5TmFtZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5TmFtZSgpIHsKLQkJaWYgKGF0TGVhc3RPbmVJbnRlcmZhY2UpIHsKLQkJCWFzc2VydE5vdE51bGwoInZhbGlkYXRlIHRoYXQgbm9uIG51bGwgZGlzcGxheSBuYW1lIGlzIHJldHVybmVkIiwKLQkJCQkJbmV0d29ya0ludGVyZmFjZTEuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQlhc3NlcnRGYWxzZSgKLQkJCQkJInZhbGlkYXRlIHRoYXQgbm9uLXplcm8gbGVuZ3RqIGRpc3BsYXkgbmFtZSBpcyBnZW5lcmF0ZWQiLAotCQkJCQluZXR3b3JrSW50ZXJmYWNlMS5nZXREaXNwbGF5TmFtZSgpLmVxdWFscygiIikpOwotCQl9Ci0JCWlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgewotCQkJYXNzZXJ0RmFsc2UoCi0JCQkJCSJWYWxpZGF0ZSBzdHJpbmdzIGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VzIiwKLQkJCQkJbmV0d29ya0ludGVyZmFjZTEuZ2V0RGlzcGxheU5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJbmV0d29ya0ludGVyZmFjZTIuZ2V0RGlzcGxheU5hbWUoKSkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2dldERpc3BsYXlOYW1lKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREaXNwbGF5TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheU5hbWUoKSB7CisgICAgICAgIGlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJ2YWxpZGF0ZSB0aGF0IG5vbiBudWxsIGRpc3BsYXkgbmFtZSBpcyByZXR1cm5lZCIsCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UxLmdldERpc3BsYXlOYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSB0aGF0IG5vbi16ZXJvIGxlbmd0aiBkaXNwbGF5IG5hbWUgaXMgZ2VuZXJhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEuZ2V0RGlzcGxheU5hbWUoKS5lcXVhbHMoIiIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgICAgICAiVmFsaWRhdGUgc3RyaW5ncyBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgaW50ZXJmYWNlcyIsCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UxLmdldERpc3BsYXlOYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UyLmdldERpc3BsYXlOYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2dldEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0QnlOYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCXRyeSB7Ci0JCQlhc3NlcnROdWxsKCJ2YWxpZGF0ZSBudWxsIGhhbmRsZWQgb2siLAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2dldEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ5TmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbCgidmFsaWRhdGUgbnVsbCBoYW5kbGVkIG9rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUobnVsbCkpOwotCQkJZmFpbCgiZ2V0QnlOYW1lIGRpZCBub3QgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZ2V0QnlOYW1lLCBudWxsIGluZXRBZGRyZXNzIC0gcmFpc2VkIGV4Y2VwdGlvbiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KKyAgICAgICAgICAgIGZhaWwoImdldEJ5TmFtZSBkaWQgbm90IHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uIGZvciBudWxsIGFyZ3VtZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoImdldEJ5TmFtZSwgbnVsbCBpbmV0QWRkcmVzcyAtIHJhaXNlZCBleGNlcHRpb24gOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCWFzc2VydE51bGwoInZhbGlkYXRlIGhhbmRsZWQgb2sgaWYgd2UgYXNrIGZvciBuYW1lIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IGludGVyZmFjZSIsCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJ2YWxpZGF0ZSBoYW5kbGVkIG9rIGlmIHdlIGFzayBmb3IgbmFtZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBpbnRlcmZhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZSgiOG5vdCBhIG5hbWU0IikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZ2V0QnlOYW1lLCB1bmtub3duIGluZXRBZGRyZXNzIC0gcmFpc2VkIGV4Y2VwdGlvbiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoImdldEJ5TmFtZSwgdW5rbm93biBpbmV0QWRkcmVzcyAtIHJhaXNlZCBleGNlcHRpb24gOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CiAKLQkJLy8gZm9yIGVhY2ggYWRkcmVzcyBpbiBhbiBpbnRlcmZhY2UgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0Ci0JCS8vIGludGVyZmFjZSBmb3IgdGhhdCBuYW1lCi0JCWlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7Ci0JCQlTdHJpbmcgdGhlTmFtZSA9IG5ldHdvcmtJbnRlcmZhY2UxLmdldE5hbWUoKTsKLQkJCWlmICh0aGVOYW1lICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJCSJ2YWxpZGF0ZSB0aGF0IEludGVyZmFjZSBjYW4gYmUgb2J0YWluZWQgd2l0aCBpdHMgbmFtZSIsCi0JCQkJCQkJTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUodGhlTmFtZSkuZXF1YWxzKAotCQkJCQkJCQkJbmV0d29ya0ludGVyZmFjZTEpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlmYWlsKCJ2YWxpZGF0ZSB0byBnZXQgbmV0d29yayBpbnRlcmZhY2UgdXNpbmcgbmFtZSAtIHNvY2tldCBleGNlcHRpb24iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8gZm9yIGVhY2ggYWRkcmVzcyBpbiBhbiBpbnRlcmZhY2UgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0CisgICAgICAgIC8vIGludGVyZmFjZSBmb3IgdGhhdCBuYW1lCisgICAgICAgIGlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7CisgICAgICAgICAgICBTdHJpbmcgdGhlTmFtZSA9IG5ldHdvcmtJbnRlcmZhY2UxLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICh0aGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSB0aGF0IEludGVyZmFjZSBjYW4gYmUgb2J0YWluZWQgd2l0aCBpdHMgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUodGhlTmFtZSkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJ2YWxpZGF0ZSB0byBnZXQgbmV0d29yayBpbnRlcmZhY2UgdXNpbmcgbmFtZSAtIHNvY2tldCBleGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgcmlnaHQgaW50ZXJmYWNlIHdpdGggdGhlIHNlY29uZCBpbnRlcmZhY2UgYXMKLQkJLy8gd2VsbCAoaWUgd2UganVzdCBkb24ndCBhbHdheXMgZ2V0IHRoZSBmaXJzdCBpbnRlcmZhY2UKLQkJaWYgKGF0TGVhc3RUd29JbnRlcmZhY2VzKSB7Ci0JCQlTdHJpbmcgdGhlTmFtZSA9IG5ldHdvcmtJbnRlcmZhY2UyLmdldE5hbWUoKTsKLQkJCWlmICh0aGVOYW1lICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJCSJ2YWxpZGF0ZSB0aGF0IEludGVyZmFjZSBjYW4gYmUgb2J0YWluZWQgd2l0aCBpdHMgbmFtZSIsCi0JCQkJCQkJTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUodGhlTmFtZSkuZXF1YWxzKAotCQkJCQkJCQkJbmV0d29ya0ludGVyZmFjZTIpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlmYWlsKCJ2YWxpZGF0ZSB0byBnZXQgbmV0d29yayBpbnRlcmZhY2UgdXNpbmcgbmFtZSAtIHNvY2tldCBleGNlcHRpb24iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSByaWdodCBpbnRlcmZhY2Ugd2l0aCB0aGUgc2Vjb25kIGludGVyZmFjZSBhcworICAgICAgICAvLyB3ZWxsIChpZSB3ZSBqdXN0IGRvbid0IGFsd2F5cyBnZXQgdGhlIGZpcnN0IGludGVyZmFjZQorICAgICAgICBpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyB0aGVOYW1lID0gbmV0d29ya0ludGVyZmFjZTIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKHRoZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIHRoYXQgSW50ZXJmYWNlIGNhbiBiZSBvYnRhaW5lZCB3aXRoIGl0cyBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZSh0aGVOYW1lKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlMikpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoInZhbGlkYXRlIHRvIGdldCBuZXR3b3JrIGludGVyZmFjZSB1c2luZyBuYW1lIC0gc29ja2V0IGV4Y2VwdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2dldEJ5SW5ldEFkZHJlc3MoamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRCeUluZXRBZGRyZXNzTGphdmFfbmV0X0luZXRBZGRyZXNzKCkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2dldEJ5SW5ldEFkZHJlc3MoamF2YS5uZXQuSW5ldEFkZHJlc3MpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5SW5ldEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7SW5ldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QnlJbmV0QWRkcmVzc0xqYXZhX25ldF9JbmV0QWRkcmVzcygpIHsKIAotCQlieXRlIGFkZHJlc3NCeXRlc1tdID0gbmV3IGJ5dGVbNF07Ci0JCWFkZHJlc3NCeXRlc1swXSA9IDA7Ci0JCWFkZHJlc3NCeXRlc1sxXSA9IDA7Ci0JCWFkZHJlc3NCeXRlc1syXSA9IDA7Ci0JCWFkZHJlc3NCeXRlc1szXSA9IDA7CisgICAgICAgIGJ5dGUgYWRkcmVzc0J5dGVzW10gPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgYWRkcmVzc0J5dGVzWzBdID0gMDsKKyAgICAgICAgYWRkcmVzc0J5dGVzWzFdID0gMDsKKyAgICAgICAgYWRkcmVzc0J5dGVzWzJdID0gMDsKKyAgICAgICAgYWRkcmVzc0J5dGVzWzNdID0gMDsKIAotCQl0cnkgewotCQkJYXNzZXJ0TnVsbCgidmFsaWRhdGUgbnVsbCBoYW5kbGVkIG9rIiwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE51bGwoInZhbGlkYXRlIG51bGwgaGFuZGxlZCBvayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlJbmV0QWRkcmVzcyhudWxsKSk7Ci0JCQlmYWlsKCJzaG91bGQgbm90IGdldCBoZXJlIGlmIGdldEJ5SW5ldEFkZHJlc3MgdGhyb3dzICIKLQkJCQkJKyAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbnVsbCBwYXNzZWQgaW4iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZ2V0QnlJbmV0QWRkcmVzcywgbnVsbCBpbmV0QWRkcmVzcyBzaG91bGQgaGF2ZSByYWlzZWQgTlBFIgotCQkJCQkrICIgYnV0IGluc3RlYWQgdGhyZXcgYSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUgaWYgZ2V0QnlJbmV0QWRkcmVzcyB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAgICArICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBudWxsIHBhc3NlZCBpbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJnZXRCeUluZXRBZGRyZXNzLCBudWxsIGluZXRBZGRyZXNzIHNob3VsZCBoYXZlIHJhaXNlZCBOUEUiCisgICAgICAgICAgICAgICAgICAgICsgIiBidXQgaW5zdGVhZCB0aHJldyBhIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlhc3NlcnROdWxsKCJ2YWxpZGF0ZSBoYW5kbGVkIG9rIGlmIHdlIGFzayBmb3IgYWRkcmVzcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBpbnRlcmZhY2UiLAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbCgidmFsaWRhdGUgaGFuZGxlZCBvayBpZiB3ZSBhc2sgZm9yIGFkZHJlc3Mgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgaW50ZXJmYWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZS5nZXRCeUluZXRBZGRyZXNzKEluZXRBZGRyZXNzCi0JCQkJCQkJLmdldEJ5QWRkcmVzcyhhZGRyZXNzQnl0ZXMpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJnZXRCeUluZXRBZGRyZXNzLCB1bmtub3duIGluZXRBZGRyZXNzIHRocmV3IGV4Y2VwdGlvbiA6ICIgKyBlKTsKLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeUFkZHJlc3MoYWRkcmVzc0J5dGVzKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiZ2V0QnlJbmV0QWRkcmVzcywgdW5rbm93biBpbmV0QWRkcmVzcyB0aHJldyBleGNlcHRpb24gOiAiICsgZSk7CisgICAgICAgIH0KIAotCQkvLyBmb3IgZWFjaCBhZGRyZXNzIGluIGFuIGludGVyZmFjZSB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgcmlnaHQKLQkJLy8gaW50ZXJmYWNlIGZvciB0aGF0IGFkZHJlc3MKLQkJaWYgKGF0TGVhc3RPbmVJbnRlcmZhY2UpIHsKLQkJCUVudW1lcmF0aW9uIGFkZHJlc3NlcyA9IG5ldHdvcmtJbnRlcmZhY2UxLmdldEluZXRBZGRyZXNzZXMoKTsKLQkJCWlmIChhZGRyZXNzZXMgIT0gbnVsbCkgewotCQkJCXdoaWxlIChhZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJSW5ldEFkZHJlc3MgdGhlQWRkcmVzcyA9IChJbmV0QWRkcmVzcykgYWRkcmVzc2VzCi0JCQkJCQkJLm5leHRFbGVtZW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJCQkidmFsaWRhdGUgdGhhdCBJbnRlcmZhY2UgY2FuIGJlIG9idGFpbmVkIHdpdGggYW55IG9uZSBvZiBpdHMgYWRkcmVzc2VzIiwKLQkJCQkJCQkJTmV0d29ya0ludGVyZmFjZS5nZXRCeUluZXRBZGRyZXNzKHRoZUFkZHJlc3MpCi0JCQkJCQkJCQkJLmVxdWFscyhuZXR3b3JrSW50ZXJmYWNlMSkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZmFpbCgidmFsaWRhdGUgdG8gZ2V0IGFkZHJlc3MgdXNpbmcgaW5ldEFkZHJlc3MgIiArCi0JCQkJCQkJCSJ0aHJldyBleGNlcHRpb24gOiAiICsgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8gZm9yIGVhY2ggYWRkcmVzcyBpbiBhbiBpbnRlcmZhY2UgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0CisgICAgICAgIC8vIGludGVyZmFjZSBmb3IgdGhhdCBhZGRyZXNzCisgICAgICAgIGlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBhZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgICAgICBpZiAoYWRkcmVzc2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSAoSW5ldEFkZHJlc3MpIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIHRoYXQgSW50ZXJmYWNlIGNhbiBiZSBvYnRhaW5lZCB3aXRoIGFueSBvbmUgb2YgaXRzIGFkZHJlc3NlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlJbmV0QWRkcmVzcyh0aGVBZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobmV0d29ya0ludGVyZmFjZTEpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoInZhbGlkYXRlIHRvIGdldCBhZGRyZXNzIHVzaW5nIGluZXRBZGRyZXNzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZXcgZXhjZXB0aW9uIDogIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8gdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0IGludGVyZmFjZSB3aXRoIHRoZSBzZWNvbmQgaW50ZXJmYWNlIGFzCi0JCS8vIHdlbGwgKGllIHdlIGp1c3QgZG9uJ3QgYWx3YXlzIGdldCB0aGUgZmlyc3QgaW50ZXJmYWNlCi0JCWlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgewotCQkJRW51bWVyYXRpb24gYWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTIuZ2V0SW5ldEFkZHJlc3NlcygpOwotCQkJaWYgKGFkZHJlc3NlcyAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlJbmV0QWRkcmVzcyB0aGVBZGRyZXNzID0gKEluZXRBZGRyZXNzKSBhZGRyZXNzZXMKLQkJCQkJCQkubmV4dEVsZW1lbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFzc2VydFRydWUoCi0JCQkJCQkJCSJ2YWxpZGF0ZSB0aGF0IEludGVyZmFjZSBjYW4gYmUgb2J0YWluZWQgd2l0aCBhbnkgb25lIG9mIGl0cyBhZGRyZXNzZXMiLAotCQkJCQkJCQlOZXR3b3JrSW50ZXJmYWNlLmdldEJ5SW5ldEFkZHJlc3ModGhlQWRkcmVzcykKLQkJCQkJCQkJCQkuZXF1YWxzKG5ldHdvcmtJbnRlcmZhY2UyKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmYWlsKCJ2YWxpZGF0ZSB0byBnZXQgYWRkcmVzcyB1c2luZyBpbmV0QWRkcmVzcyAiCi0JCQkJCQkJCSsgInRocmV3IGV4Y2VwdGlvbiA6ICIgKyBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0IGludGVyZmFjZSB3aXRoIHRoZSBzZWNvbmQgaW50ZXJmYWNlIGFzCisgICAgICAgIC8vIHdlbGwgKGllIHdlIGp1c3QgZG9uJ3QgYWx3YXlzIGdldCB0aGUgZmlyc3QgaW50ZXJmYWNlCisgICAgICAgIGlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgeworICAgICAgICAgICAgRW51bWVyYXRpb24gYWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTIuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgICAgICAgaWYgKGFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyB0aGVBZGRyZXNzID0gKEluZXRBZGRyZXNzKSBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSB0aGF0IEludGVyZmFjZSBjYW4gYmUgb2J0YWluZWQgd2l0aCBhbnkgb25lIG9mIGl0cyBhZGRyZXNzZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlLmdldEJ5SW5ldEFkZHJlc3ModGhlQWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG5ldHdvcmtJbnRlcmZhY2UyKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJ2YWxpZGF0ZSB0byBnZXQgYWRkcmVzcyB1c2luZyBpbmV0QWRkcmVzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRocmV3IGV4Y2VwdGlvbiA6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2dldE5ldHdvcmtJbnRlcmZhY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE5ldHdvcmtJbnRlcmZhY2VzKCkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2dldE5ldHdvcmtJbnRlcmZhY2VzKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmV0d29ya0ludGVyZmFjZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5ldHdvcmtJbnRlcmZhY2VzKCkgewogCi0JCS8vIHJlYWxseSB0aGlzIGlzIHRlc3RlZCBieSBhbGwgb2YgdGhlIG90aGVyIGNhbGxzIGJ1dCBqdXN0IG1ha2Ugc3VyZSB3ZQotCQkvLyBjYW4gY2FsbCBpdCBhbmQgZ2V0IGEgbGlzdCBvZiBpbnRlcmZhY2VzIGlmIHRoZXkgZXhpc3QKLQkJdHJ5IHsKLQkJCUVudW1lcmF0aW9uIHRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJnZXQgTmV0d29yayBJbnRlcmZhY2VzIC0gcmFpc2VkIGV4Y2VwdGlvbiA6ICIKLQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgICAgIC8vIHJlYWxseSB0aGlzIGlzIHRlc3RlZCBieSBhbGwgb2YgdGhlIG90aGVyIGNhbGxzIGJ1dCBqdXN0IG1ha2Ugc3VyZSB3ZQorICAgICAgICAvLyBjYW4gY2FsbCBpdCBhbmQgZ2V0IGEgbGlzdCBvZiBpbnRlcmZhY2VzIGlmIHRoZXkgZXhpc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJnZXQgTmV0d29yayBJbnRlcmZhY2VzIC0gcmFpc2VkIGV4Y2VwdGlvbiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgotCQkvLyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQlpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiSWYgb2JqZWN0cyBhcmUgdGhlIHNhbWUgdHJ1ZSBpcyByZXR1cm5lZCIsCi0JCQkJCW5ldHdvcmtJbnRlcmZhY2UxLmVxdWFscyhzYW1lQXNOZXR3b3JrSW50ZXJmYWNlMSkpOwotCQkJYXNzZXJ0RmFsc2UoIlZhbGlkYXRlIE51bGwgaGFuZGxlZCBvayIsIG5ldHdvcmtJbnRlcmZhY2UxCi0JCQkJCS5lcXVhbHMobnVsbCkpOwotCQl9Ci0JCWlmIChhdExlYXN0VHdvSW50ZXJmYWNlcykgewotCQkJYXNzZXJ0RmFsc2UoIklmIG9iamVjdHMgYXJlIGRpZmZlcmVudCBmYWxzZSBpcyByZXR1cm5lZCIsCi0JCQkJCW5ldHdvcmtJbnRlcmZhY2UxLmVxdWFscyhuZXR3b3JrSW50ZXJmYWNlMikpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCisgICAgICAgIC8vIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24uZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICAgIGlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJZiBvYmplY3RzIGFyZSB0aGUgc2FtZSB0cnVlIGlzIHJldHVybmVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEuZXF1YWxzKHNhbWVBc05ldHdvcmtJbnRlcmZhY2UxKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiVmFsaWRhdGUgTnVsbCBoYW5kbGVkIG9rIiwgbmV0d29ya0ludGVyZmFjZTEKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0TGVhc3RUd29JbnRlcmZhY2VzKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiSWYgb2JqZWN0cyBhcmUgZGlmZmVyZW50IGZhbHNlIGlzIHJldHVybmVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEuZXF1YWxzKG5ldHdvcmtJbnRlcmZhY2UyKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSNoYXNoQ29kZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogCi0JCWlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkidmFsaWRhdGUgdGhhdCBoYXNoIGNvZGVzIGFyZSB0aGUgc2FtZSBmb3IgdHdvIGNhbGxzIG9uIHRoZSBzYW1lIG9iamVjdCIsCi0JCQkJCW5ldHdvcmtJbnRlcmZhY2UxLmhhc2hDb2RlKCkgPT0gbmV0d29ya0ludGVyZmFjZTEKLQkJCQkJCQkuaGFzaENvZGUoKSk7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkidmFsaWRhdGUgdGhhdCBoYXNoIGNvZGVzIGFyZSB0aGUgc2FtZSBmb3IgdHdvIG9iamVjdHMgZm9yIHdoaWNoIGVxdWFscyBpcyB0cnVlIiwKLQkJCQkJbmV0d29ya0ludGVyZmFjZTEuaGFzaENvZGUoKSA9PSBzYW1lQXNOZXR3b3JrSW50ZXJmYWNlMQotCQkJCQkJCS5oYXNoQ29kZSgpKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKGF0TGVhc3RPbmVJbnRlcmZhY2UpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSB0aGF0IGhhc2ggY29kZXMgYXJlIHRoZSBzYW1lIGZvciB0d28gY2FsbHMgb24gdGhlIHNhbWUgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEuaGFzaENvZGUoKSA9PSBuZXR3b3JrSW50ZXJmYWNlMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSB0aGF0IGhhc2ggY29kZXMgYXJlIHRoZSBzYW1lIGZvciB0d28gb2JqZWN0cyBmb3Igd2hpY2ggZXF1YWxzIGlzIHRydWUiLAorICAgICAgICAgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlMS5oYXNoQ29kZSgpID09IHNhbWVBc05ldHdvcmtJbnRlcmZhY2UxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc2hDb2RlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JCWlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7Ci0JCQlhc3NlcnROb3ROdWxsKCJ2YWxpZGF0ZSB0aGF0IG5vbiBudWxsIHN0cmluZyBpcyBnZW5lcmF0ZWQiLAotCQkJCQluZXR3b3JrSW50ZXJmYWNlMS50b1N0cmluZygpKTsKLQkJCWFzc2VydEZhbHNlKCJ2YWxpZGF0ZSB0aGF0IG5vbi16ZXJvIGxlbmd0aCBzdHJpbmcgaXMgZ2VuZXJhdGVkIiwKLQkJCQkJbmV0d29ya0ludGVyZmFjZTEudG9TdHJpbmcoKS5lcXVhbHMoIiIpKTsKLQkJfQotCQlpZiAoYXRMZWFzdFR3b0ludGVyZmFjZXMpIHsKLQkJCWFzc2VydEZhbHNlKAotCQkJCQkiVmFsaWRhdGUgc3RyaW5ncyBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgaW50ZXJmYWNlcyIsCi0JCQkJCW5ldHdvcmtJbnRlcmZhY2UxLnRvU3RyaW5nKCkuZXF1YWxzKAotCQkJCQkJCW5ldHdvcmtJbnRlcmZhY2UyLnRvU3RyaW5nKCkpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSN0b1N0cmluZygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgeworICAgICAgICBpZiAoYXRMZWFzdE9uZUludGVyZmFjZSkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgidmFsaWRhdGUgdGhhdCBub24gbnVsbCBzdHJpbmcgaXMgZ2VuZXJhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTEudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgidmFsaWRhdGUgdGhhdCBub24temVybyBsZW5ndGggc3RyaW5nIGlzIGdlbmVyYXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UxLnRvU3RyaW5nKCkuZXF1YWxzKCIiKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0TGVhc3RUd29JbnRlcmZhY2VzKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICAgICAgIlZhbGlkYXRlIHN0cmluZ3MgYXJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGludGVyZmFjZXMiLAorICAgICAgICAgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlMS50b1N0cmluZygpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlMi50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKIAotCQlFbnVtZXJhdGlvbiB0aGVJbnRlcmZhY2VzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRoZUludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gb2NjdXJyZWQgZ2V0dGluZyBuZXR3b3JrIGludGVyZmFjZXMgOiAiICsgZSk7Ci0JCX0KLQkJCi0JCS8vIFNldCB1cCBOZXR3b3JrSW50ZXJmYWNlIGluc3RhbmNlIG1lbWJlcnMuIE5vdGUgdGhhdCBiZWNhdXNlIHRoZSBjYWxsCi0JCS8vIHRvIE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKSByZXR1cm5zICphbGwqIG9mIHRoZSAKLQkJLy8gaW50ZXJmYWNlcyBvbiB0aGUgdGVzdCBtYWNoaW5lIGl0IGlzIHBvc3NpYmxlIHRoYXQgb25lIG9yIG1vcmUgb2YgCi0JCS8vIHRoZW0gd2lsbCBub3QgY3VycmVudGx5IGJlIGJvdW5kIHRvIGFuIEluZXRBZGRyZXNzLiBlLmcuIGEgbGFwdG9wCi0JCS8vIHJ1bm5pbmcgY29ubmVjdGVkIGJ5IGEgd2lyZSB0byB0aGUgbG9jYWwgbmV0d29yayBtYXkgYWxzbyBoYXZlIGEgCi0JCS8vIHdpcmVsZXNzIGludGVyZmFjZSB0aGF0IGlzIG5vdCBhY3RpdmUgYW5kIHNvIGhhcyBubyBJbmV0QWRkcmVzcyAKLQkJLy8gYm91bmQgdG8gaXQuIEZvciB0aGVzZSB0ZXN0cyBvbmx5IHdvcmsgd2l0aCBOZXR3b3JrSW50ZXJmYWNlIG9iamVjdHMgCi0JCS8vIHRoYXQgYXJlIGJvdW5kIHRvIGFuIEluZXRBZGRyZXNzLiAgIAotCQlpZiAoKHRoZUludGVyZmFjZXMgIT0gbnVsbCkgJiYgKHRoZUludGVyZmFjZXMuaGFzTW9yZUVsZW1lbnRzKCkpKSB7Ci0JCQl3aGlsZSAoKHRoZUludGVyZmFjZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJCSYmIChhdExlYXN0T25lSW50ZXJmYWNlID09IGZhbHNlKSkgewotCQkJCU5ldHdvcmtJbnRlcmZhY2UgdGhlSW50ZXJmYWNlID0gKE5ldHdvcmtJbnRlcmZhY2UpIHRoZUludGVyZmFjZXMKLQkJCQkJCS5uZXh0RWxlbWVudCgpOwotCQkJCWlmICh0aGVJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpICE9IG51bGwpIHsKLQkJCQkJLy8gRW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgTmV0d29ya0ludGVyZmFjZSBoYXMgYXQgbGVhc3QKLQkJCQkJLy8gb25lIEluZXRBZGRyZXNzIGJvdW5kIHRvIGl0LiAgCi0JCQkJCUVudW1lcmF0aW9uIGFkZHJzID0gdGhlSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKTsKLQkJCQkJaWYgKChhZGRycyAhPSBudWxsKSAmJiAoYWRkcnMuaGFzTW9yZUVsZW1lbnRzKCkpKSB7Ci0JCQkJCQlhdExlYXN0T25lSW50ZXJmYWNlID0gdHJ1ZTsKLQkJCQkJCW5ldHdvcmtJbnRlcmZhY2UxID0gdGhlSW50ZXJmYWNlOwotCQkJCQl9Ly8gZW5kIGlmIAotCQkJCX0KLQkJCX0KKyAgICAgICAgRW51bWVyYXRpb24gdGhlSW50ZXJmYWNlcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGVJbnRlcmZhY2VzID0gTmV0d29ya0ludGVyZmFjZS5nZXROZXR3b3JrSW50ZXJmYWNlcygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIG9jY3VycmVkIGdldHRpbmcgbmV0d29yayBpbnRlcmZhY2VzIDogIiArIGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgTmV0d29ya0ludGVyZmFjZSBpbnN0YW5jZSBtZW1iZXJzLiBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgY2FsbAorICAgICAgICAvLyB0byBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCkgcmV0dXJucyAqYWxsKiBvZiB0aGUgCisgICAgICAgIC8vIGludGVyZmFjZXMgb24gdGhlIHRlc3QgbWFjaGluZSBpdCBpcyBwb3NzaWJsZSB0aGF0IG9uZSBvciBtb3JlIG9mIAorICAgICAgICAvLyB0aGVtIHdpbGwgbm90IGN1cnJlbnRseSBiZSBib3VuZCB0byBhbiBJbmV0QWRkcmVzcy4gZS5nLiBhIGxhcHRvcAorICAgICAgICAvLyBydW5uaW5nIGNvbm5lY3RlZCBieSBhIHdpcmUgdG8gdGhlIGxvY2FsIG5ldHdvcmsgbWF5IGFsc28gaGF2ZSBhIAorICAgICAgICAvLyB3aXJlbGVzcyBpbnRlcmZhY2UgdGhhdCBpcyBub3QgYWN0aXZlIGFuZCBzbyBoYXMgbm8gSW5ldEFkZHJlc3MgCisgICAgICAgIC8vIGJvdW5kIHRvIGl0LiBGb3IgdGhlc2UgdGVzdHMgb25seSB3b3JrIHdpdGggTmV0d29ya0ludGVyZmFjZSBvYmplY3RzIAorICAgICAgICAvLyB0aGF0IGFyZSBib3VuZCB0byBhbiBJbmV0QWRkcmVzcy4gICAKKyAgICAgICAgaWYgKCh0aGVJbnRlcmZhY2VzICE9IG51bGwpICYmICh0aGVJbnRlcmZhY2VzLmhhc01vcmVFbGVtZW50cygpKSkgeworICAgICAgICAgICAgd2hpbGUgKCh0aGVJbnRlcmZhY2VzLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgICAgICAgICAgICAgICAmJiAoYXRMZWFzdE9uZUludGVyZmFjZSA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIHRoZUludGVyZmFjZSA9IChOZXR3b3JrSW50ZXJmYWNlKSB0aGVJbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhlSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IE5ldHdvcmtJbnRlcmZhY2UgaGFzIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBJbmV0QWRkcmVzcyBib3VuZCB0byBpdC4gIAorICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBhZGRycyA9IHRoZUludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYWRkcnMgIT0gbnVsbCkgJiYgKGFkZHJzLmhhc01vcmVFbGVtZW50cygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXRMZWFzdE9uZUludGVyZmFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlMSA9IHRoZUludGVyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgfS8vIGVuZCBpZiAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCXdoaWxlICgodGhlSW50ZXJmYWNlcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkJCQkJJiYgKGF0TGVhc3RUd29JbnRlcmZhY2VzID09IGZhbHNlKSkgewotCQkJCU5ldHdvcmtJbnRlcmZhY2UgdGhlSW50ZXJmYWNlID0gKE5ldHdvcmtJbnRlcmZhY2UpIHRoZUludGVyZmFjZXMKLQkJCQkJCS5uZXh0RWxlbWVudCgpOwotCQkJCWlmICh0aGVJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpICE9IG51bGwpIHsKLQkJCQkJLy8gRW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgTmV0d29ya0ludGVyZmFjZSBoYXMgYXQgbGVhc3QKLQkJCQkJLy8gb25lIEluZXRBZGRyZXNzIGJvdW5kIHRvIGl0LiAgCi0JCQkJCUVudW1lcmF0aW9uIGFkZHJzID0gdGhlSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKTsKLQkJCQkJaWYgKChhZGRycyAhPSBudWxsKSAmJiAoYWRkcnMuaGFzTW9yZUVsZW1lbnRzKCkpKSB7Ci0JCQkJCQlhdExlYXN0VHdvSW50ZXJmYWNlcyA9IHRydWU7Ci0JCQkJCQluZXR3b3JrSW50ZXJmYWNlMiA9IHRoZUludGVyZmFjZTsKLQkJCQkJfS8vIGVuZCBpZiAKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICB3aGlsZSAoKHRoZUludGVyZmFjZXMuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICAgICAgICAgICAgICAgICYmIChhdExlYXN0VHdvSW50ZXJmYWNlcyA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIHRoZUludGVyZmFjZSA9IChOZXR3b3JrSW50ZXJmYWNlKSB0aGVJbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhlSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IE5ldHdvcmtJbnRlcmZhY2UgaGFzIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBJbmV0QWRkcmVzcyBib3VuZCB0byBpdC4gIAorICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBhZGRycyA9IHRoZUludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYWRkcnMgIT0gbnVsbCkgJiYgKGFkZHJzLmhhc01vcmVFbGVtZW50cygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXRMZWFzdFR3b0ludGVyZmFjZXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZTIgPSB0aGVJbnRlcmZhY2U7CisgICAgICAgICAgICAgICAgICAgIH0vLyBlbmQgaWYgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkvLyBPbmx5IHNldCBzYW1lQXNOZXR3b3JrSW50ZXJmYWNlMSBpZiB3ZSBzdWNjZWVkZWQgaW4gZmluZGluZyAKLQkJCS8vIGF0IGxlYXN0IG9uZSBnb29kIE5ldHdvcmtJbnRlcmZhY2UKLQkJCWlmIChhdExlYXN0T25lSW50ZXJmYWNlKSB7Ci0JCQkJRW51bWVyYXRpb24gYWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZTEuZ2V0SW5ldEFkZHJlc3NlcygpOwotCQkJCWlmIChhZGRyZXNzZXMgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQkJCXNhbWVBc05ldHdvcmtJbnRlcmZhY2UxID0gTmV0d29ya0ludGVyZmFjZQotCQkJCQkJCS5nZXRCeUluZXRBZGRyZXNzKChJbmV0QWRkcmVzcykgYWRkcmVzc2VzCi0JCQkJCQkJCQkubmV4dEVsZW1lbnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmYWlsKCJTb2NrZXRFeGNlcHRpb24gb2NjdXJyZWQgOiAiICsgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ly8gZW5kIGlmIGF0TGVhc3RPbmVJbnRlcmZhY2UKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIE9ubHkgc2V0IHNhbWVBc05ldHdvcmtJbnRlcmZhY2UxIGlmIHdlIHN1Y2NlZWRlZCBpbiBmaW5kaW5nIAorICAgICAgICAgICAgLy8gYXQgbGVhc3Qgb25lIGdvb2QgTmV0d29ya0ludGVyZmFjZQorICAgICAgICAgICAgaWYgKGF0TGVhc3RPbmVJbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBhZGRyZXNzZXMgPSBuZXR3b3JrSW50ZXJmYWNlMS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZUFzTmV0d29ya0ludGVyZmFjZTEgPSBOZXR3b3JrSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJ5SW5ldEFkZHJlc3MoKEluZXRBZGRyZXNzKSBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlNvY2tldEV4Y2VwdGlvbiBvY2N1cnJlZCA6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0vLyBlbmQgaWYgYXRMZWFzdE9uZUludGVyZmFjZQorICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAyNzkxYjA2Yy4uMzE4OWFlYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNTQgKzE3LDc4IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmV0Lk5vUm91dGVUb0hvc3RFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk5vUm91dGVUb0hvc3RFeGNlcHRpb24jTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0Lk5vUm91dGVUb0hvc3RFeGNlcHRpb24oKQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uI05vUm91dGVUb0hvc3RFeGNlcHRpb24oKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vUm91dGVUb0hvc3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbigpCiAKLQkJdHJ5IHsKLQkJCWlmICh0cnVlKQotCQkJCXRocm93IG5ldyBOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKE5vUm91dGVUb0hvc3RFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBleGNlcHRpb24iKTsKLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodHJ1ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoIChOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0Lk5vUm91dGVUb0hvc3RFeGNlcHRpb24jTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0Lk5vUm91dGVUb0hvc3RFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkJLy8gQ2Fubm90IHRlc3QgY29ycmVjdGx5IHdpdGhvdXQgY2hhbmdpbmcgc29tZSByb3V0aW5nIHRhYmxlcyAhIQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uI05vUm91dGVUb0hvc3RFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICAvLyBDYW5ub3QgdGVzdCBjb3JyZWN0bHkgd2l0aG91dCBjaGFuZ2luZyBzb21lIHJvdXRpbmcgdGFibGVzICEhCiAKLQkJdHJ5IHsKLQkJCWlmICh0cnVlKQotCQkJCXRocm93IG5ldyBOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uKCJ0ZXN0Iik7Ci0JCX0gY2F0Y2ggKE5vUm91dGVUb0hvc3RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJUaHJldyBleGNlcHRpb24gd2l0aCBpbmNvcnJlY3QgbWVzc2FnZSIsICJ0ZXN0IiwgZS5nZXRNZXNzYWdlKCkKLQkJCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vUm91dGVUb0hvc3RFeGNlcHRpb24oInRlc3QiKTsKKyAgICAgICAgfSBjYXRjaCAoTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRocmV3IGV4Y2VwdGlvbiB3aXRoIGluY29ycmVjdCBtZXNzYWdlIiwgInRlc3QiLCBlLmdldE1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvUGFzc3dvcmRBdXRoZW50aWNhdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvUGFzc3dvcmRBdXRoZW50aWNhdGlvblRlc3QuamF2YQppbmRleCAwYjVmYmY2Li45MmM3OGI4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Bhc3N3b3JkQXV0aGVudGljYXRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9QYXNzd29yZEF1dGhlbnRpY2F0aW9uVGVzdC5qYXZhCkBAIC0xNyw1OCArMTcsOTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhQYXNzd29yZEF1dGhlbnRpY2F0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbiNQYXNzd29yZEF1dGhlbnRpY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICAgIGNoYXJbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmckQygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24oamF2YS5sYW5nLlN0cmluZywKLQkJLy8gY2hhciBbXSkKLQkJY2hhcltdIHBhc3N3b3JkID0gbmV3IGNoYXJbXSB7ICdkJywgJ3InLCAnbycsICd3JywgJ3MnLCAncycsICdhJywgJ3AnIH07Ci0JCWZpbmFsIFN0cmluZyBuYW1lID0gIkpvZSBCbG93IjsKLQkJUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBwYSA9IG5ldyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uKG5hbWUsIHBhc3N3b3JkKTsKLQkJY2hhcltdIHJldHVybmVkUGFzc3dvcmQgPSBwYS5nZXRQYXNzd29yZCgpOwotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbmFtZSIsIHBhLmdldFVzZXJOYW1lKCkuZXF1YWxzKG5hbWUpKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFzc3dvcmQgd2FzIG5vdCBjbG9uZWQiLCByZXR1cm5lZFBhc3N3b3JkICE9IHBhc3N3b3JkKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFzc3dvcmRzIG5vdCBlcXVhbCBsZW5ndGgiLAotCQkJCXJldHVybmVkUGFzc3dvcmQubGVuZ3RoID09IHBhc3N3b3JkLmxlbmd0aCk7Ci0JCWZvciAoaW50IGNvdW50ZXIgPSBwYXNzd29yZC5sZW5ndGggLSAxOyBjb3VudGVyID49IDA7IGNvdW50ZXItLSkKLQkJCWFzc2VydFRydWUoIlBhc3N3b3JkcyBub3QgZXF1YWwiLAotCQkJCQlyZXR1cm5lZFBhc3N3b3JkW2NvdW50ZXJdID09IHBhc3N3b3JkW2NvdW50ZXJdKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24jUGFzc3dvcmRBdXRoZW50aWNhdGlvbihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgICBjaGFyW10pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUGFzc3dvcmRBdXRoZW50aWNhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGNoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nJEMoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsCisgICAgICAgIC8vIGNoYXIgW10pCisgICAgICAgIGNoYXJbXSBwYXNzd29yZCA9IG5ldyBjaGFyW10geyAnZCcsICdyJywgJ28nLCAndycsICdzJywgJ3MnLCAnYScsICdwJyB9OworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJKb2UgQmxvdyI7CisgICAgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24gcGEgPSBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvbihuYW1lLCBwYXNzd29yZCk7CisgICAgICAgIGNoYXJbXSByZXR1cm5lZFBhc3N3b3JkID0gcGEuZ2V0UGFzc3dvcmQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG5hbWUiLCBwYS5nZXRVc2VyTmFtZSgpLmVxdWFscyhuYW1lKSk7CisgICAgICAgIGFzc2VydFRydWUoIlBhc3N3b3JkIHdhcyBub3QgY2xvbmVkIiwgcmV0dXJuZWRQYXNzd29yZCAhPSBwYXNzd29yZCk7CisgICAgICAgIGFzc2VydFRydWUoIlBhc3N3b3JkcyBub3QgZXF1YWwgbGVuZ3RoIiwKKyAgICAgICAgICAgICAgICByZXR1cm5lZFBhc3N3b3JkLmxlbmd0aCA9PSBwYXNzd29yZC5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBjb3VudGVyID0gcGFzc3dvcmQubGVuZ3RoIC0gMTsgY291bnRlciA+PSAwOyBjb3VudGVyLS0pCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJQYXNzd29yZHMgbm90IGVxdWFsIiwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWRQYXNzd29yZFtjb3VudGVyXSA9PSBwYXNzd29yZFtjb3VudGVyXSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24jZ2V0UGFzc3dvcmQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFzc3dvcmQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBjaGFyIFtdIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24uZ2V0UGFzc3dvcmQoKQotCQlhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3QiLCB0cnVlKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24jZ2V0UGFzc3dvcmQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXNzd29yZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBjaGFyIFtdIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24uZ2V0UGFzc3dvcmQoKQorICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3QiLCB0cnVlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbiNnZXRVc2VyTmFtZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRVc2VyTmFtZSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKLQkJLy8gamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbi5nZXRVc2VyTmFtZSgpCi0JCWFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbiNnZXRVc2VyTmFtZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFVzZXJOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRVc2VyTmFtZSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKKyAgICAgICAgLy8gamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbi5nZXRVc2VyTmFtZSgpCisgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Qcm90b2NvbEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvUHJvdG9jb2xFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMTgwNTQzNS4uOWI5NTVlMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Qcm90b2NvbEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Byb3RvY29sRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw1MSArMTcsNzUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvdG9jb2xFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFByb3RvY29sRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb24jUHJvdG9jb2xFeGNlcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbigpCi0JCXRyeSB7Ci0JCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBQcm90b2NvbEV4Y2VwdGlvbiB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbiNQcm90b2NvbEV4Y2VwdGlvbigpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvdG9jb2xFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb24oKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgUHJvdG9jb2xFeGNlcHRpb24gdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGdlbmVyYXRlIGV4cGVjdGVkIGV4Y2VwdGlvbiIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbiNQcm90b2NvbEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlByb3RvY29sRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JCXRyeSB7Ci0JCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIlNvbWUgZXJyb3IgbWVzc2FnZSIpOwotCQl9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIFByb3RvY29sRXhjZXB0aW9uIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBleGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlByb3RvY29sRXhjZXB0aW9uI1Byb3RvY29sRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvdG9jb2xFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJTb21lIGVycm9yIG1lc3NhZ2UiKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBQcm90b2NvbEV4Y2VwdGlvbiB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Byb3h5U2VsZWN0b3JUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Byb3h5U2VsZWN0b3JUZXN0LmphdmEKaW5kZXggMDYwZTc2Zi4uYjA3ZWFjZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Qcm94eVNlbGVjdG9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvUHJveHlTZWxlY3RvclRlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uOwpAQCAtMzAsMTY2ICszNSwyMjEgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhQcm94eVNlbGVjdG9yLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQcm94eVNlbGVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZX0hPU1QgPSAiMTI3LjAuMC4xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9IT1NUID0gIjEyNy4wLjAuMSI7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QUk9YWV9QT1JUID0gODA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBfUFJPWFlfUE9SVCA9IDgwOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1BST1hZX0hPU1QgPSAiMTI3LjAuMC4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfUFJPWFlfSE9TVCA9ICIxMjcuMC4wLjIiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBTX1BST1hZX1BPUlQgPSA0NDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBTX1BST1hZX1BPUlQgPSA0NDM7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlRQX1BST1hZX0hPU1QgPSAiMTI3LjAuMC4zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlRQX1BST1hZX0hPU1QgPSAiMTI3LjAuMC4zIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVFBfUFJPWFlfUE9SVCA9IDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVFBfUFJPWFlfUE9SVCA9IDgwOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQ0tTX1BST1hZX0hPU1QgPSAiMTI3LjAuMC40IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09DS1NfUFJPWFlfSE9TVCA9ICIxMjcuMC4wLjQiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNPQ0tTX1BST1hZX1BPUlQgPSAxMDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTT0NLU19QUk9YWV9QT1JUID0gMTA4MDsKIAotCXByaXZhdGUgc3RhdGljIFVSSSBodHRwVXJpOworICAgIHByaXZhdGUgc3RhdGljIFVSSSBodHRwVXJpOwogCi0JcHJpdmF0ZSBzdGF0aWMgVVJJIGZ0cFVyaTsKKyAgICBwcml2YXRlIHN0YXRpYyBVUkkgZnRwVXJpOwogCi0JcHJpdmF0ZSBzdGF0aWMgVVJJIGh0dHBzVXJpOworICAgIHByaXZhdGUgc3RhdGljIFVSSSBodHRwc1VyaTsKIAotCXByaXZhdGUgc3RhdGljIFVSSSB0Y3BVcmk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHByb3h5TGlzdDsKLQkKLQlwcml2YXRlIFByb3h5U2VsZWN0b3Igc2VsZWN0b3IgPSBQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKTsKLQkKLQlzdGF0aWMgewotCQl0cnkgewotCQkJaHR0cFVyaSA9IG5ldyBVUkkoImh0dHA6Ly90ZXN0LmNvbSIpOwotCQkJZnRwVXJpID0gbmV3IFVSSSgiZnRwOi8vdGVzdC5jb20iKTsKLQkJCWh0dHBzVXJpID0gbmV3IFVSSSgiaHR0cHM6Ly90ZXN0LmNvbSIpOwotCQkJdGNwVXJpID0gbmV3IFVSSSgic29ja2V0Oi8vaG9zdC5jb20iKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBVUkkgdGNwVXJpOworICAgIAorICAgIHByaXZhdGUgTGlzdCBwcm94eUxpc3Q7CisgICAgCisgICAgcHJpdmF0ZSBQcm94eVNlbGVjdG9yIHNlbGVjdG9yID0gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7CisgICAgCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGh0dHBVcmkgPSBuZXcgVVJJKCJodHRwOi8vdGVzdC5jb20iKTsKKyAgICAgICAgICAgIGZ0cFVyaSA9IG5ldyBVUkkoImZ0cDovL3Rlc3QuY29tIik7CisgICAgICAgICAgICBodHRwc1VyaSA9IG5ldyBVUkkoImh0dHBzOi8vdGVzdC5jb20iKTsKKyAgICAgICAgICAgIHRjcFVyaSA9IG5ldyBVUkkoInNvY2tldDovL2hvc3QuY29tIik7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CiAKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIAotCS8qCi0JICogT3JpZ2luYWwgc3lzdGVtIHByb3BlcnRpZXMgbXVzdCBiZSByZXN0b3JlZCBhZnRlciBydW5uaW5nIGVhY2ggdGVzdCBjYXNlLgotCSAqLwotCXByaXZhdGUgUHJvcGVydGllcyBvcmlnbmFsU3lzdGVtUHJvcGVydGllczsKKyAgICAvKgorICAgICAqIE9yaWdpbmFsIHN5c3RlbSBwcm9wZXJ0aWVzIG11c3QgYmUgcmVzdG9yZWQgYWZ0ZXIgcnVubmluZyBlYWNoIHRlc3QgY2FzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3BlcnRpZXMgb3JpZ25hbFN5c3RlbVByb3BlcnRpZXM7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNnZXREZWZhdWx0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHQoKSB7Ci0JCVByb3h5U2VsZWN0b3Igc2VsZWN0b3IxID0gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7Ci0JCWFzc2VydE5vdE51bGwoc2VsZWN0b3IxKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNnZXREZWZhdWx0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldERlZmF1bHQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHQoKSB7CisgICAgICAgIFByb3h5U2VsZWN0b3Igc2VsZWN0b3IxID0gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2VsZWN0b3IxKTsKIAotCQlQcm94eVNlbGVjdG9yIHNlbGVjdG9yMiA9IFByb3h5U2VsZWN0b3IuZ2V0RGVmYXVsdCgpOwotCQlhc3NlcnRTYW1lKHNlbGVjdG9yMSwgc2VsZWN0b3IyKTsKLQl9CisgICAgICAgIFByb3h5U2VsZWN0b3Igc2VsZWN0b3IyID0gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7CisgICAgICAgIGFzc2VydFNhbWUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI2dldERlZmF1bHQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdF9TZWN1cml0eSgpIHsKLQkJU2VjdXJpdHlNYW5hZ2VyIG9yaWduYWxTZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyKCkpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHNldFNlY3VyaXR5TWFuYWdlciBwZXJtaXNzaW9uLiIpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJ0ZXN0X2dldERlZmF1bHRfU2VjdXJpdHkgaXMgbm90IHRlc3RlZCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9IGZpbmFsbHkgewotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvcmlnbmFsU2VjdXJpdHlNYW5hZ2VyKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNnZXREZWZhdWx0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0RGVmYXVsdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdF9TZWN1cml0eSgpIHsKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9yaWduYWxTZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyKCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHNldFNlY3VyaXR5TWFuYWdlciBwZXJtaXNzaW9uLiIpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJ0ZXN0X2dldERlZmF1bHRfU2VjdXJpdHkgaXMgbm90IHRlc3RlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvcmlnbmFsU2VjdXJpdHlNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NldERlZmF1bHQoUHJveHlTZWxlY3Rvcil9Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXREZWZhdWx0TGphdmFfbmV0X1Byb3h5U2VsZWN0b3IoKSB7Ci0JCVByb3h5U2VsZWN0b3Igb3JpZ2luYWxTZWxlY3RvciA9IFByb3h5U2VsZWN0b3IuZ2V0RGVmYXVsdCgpOwotCQl0cnkgewotCQkJUHJveHlTZWxlY3RvciBuZXdTZWxlY3RvciA9IG5ldyBNb2NrUHJveHlTZWxlY3RvcigpOwotCQkJUHJveHlTZWxlY3Rvci5zZXREZWZhdWx0KG5ld1NlbGVjdG9yKTsKLQkJCWFzc2VydFNhbWUobmV3U2VsZWN0b3IsIFByb3h5U2VsZWN0b3IuZ2V0RGVmYXVsdCgpKTsKLQkJCS8vIHVzZSBudWxsIHRvIHVuc2V0Ci0JCQlQcm94eVNlbGVjdG9yLnNldERlZmF1bHQobnVsbCk7Ci0JCQlhc3NlcnRTYW1lKG51bGwsIFByb3h5U2VsZWN0b3IuZ2V0RGVmYXVsdCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVByb3h5U2VsZWN0b3Iuc2V0RGVmYXVsdChvcmlnaW5hbFNlbGVjdG9yKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZXREZWZhdWx0KFByb3h5U2VsZWN0b3IpfQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2V0RGVmYXVsdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVmYXVsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm94eVNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlZmF1bHRMamF2YV9uZXRfUHJveHlTZWxlY3RvcigpIHsKKyAgICAgICAgUHJveHlTZWxlY3RvciBvcmlnaW5hbFNlbGVjdG9yID0gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm94eVNlbGVjdG9yIG5ld1NlbGVjdG9yID0gbmV3IE1vY2tQcm94eVNlbGVjdG9yKCk7CisgICAgICAgICAgICBQcm94eVNlbGVjdG9yLnNldERlZmF1bHQobmV3U2VsZWN0b3IpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShuZXdTZWxlY3RvciwgUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCkpOworICAgICAgICAgICAgLy8gdXNlIG51bGwgdG8gdW5zZXQKKyAgICAgICAgICAgIFByb3h5U2VsZWN0b3Iuc2V0RGVmYXVsdChudWxsKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUobnVsbCwgUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgUHJveHlTZWxlY3Rvci5zZXREZWZhdWx0KG9yaWdpbmFsU2VsZWN0b3IpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2V0RGVmYXVsdChQcm94eVNlbGVjdG9yKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldERlZmF1bHRMamF2YV9uZXRfUHJveHlTZWxlY3Rvcl9TZWN1cml0eSgpIHsKLQkJUHJveHlTZWxlY3RvciBvcmlnaW5hbFNlbGVjdG9yID0gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7Ci0JCVNlY3VyaXR5TWFuYWdlciBvcmlnbmFsU2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotCQl0cnkgewotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgTW9ja1NlY3VyaXR5TWFuYWdlcigpKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBzZXRTZWN1cml0eU1hbmFnZXIgcGVybWlzc2lvbi4iKTsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oInRlc3Rfc2V0RGVmYXVsdExqYXZhX25ldF9Qcm94eVNlbGVjdG9yX1NlY3VyaXR5IGlzIG5vdCB0ZXN0ZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJUHJveHlTZWxlY3Rvci5zZXREZWZhdWx0KG5ldyBNb2NrUHJveHlTZWxlY3RvcigpKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9IGZpbmFsbHkgewotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvcmlnbmFsU2VjdXJpdHlNYW5hZ2VyKTsKLQkJCVByb3h5U2VsZWN0b3Iuc2V0RGVmYXVsdChvcmlnaW5hbFNlbGVjdG9yKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZXREZWZhdWx0KFByb3h5U2VsZWN0b3IpfQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXREZWZhdWx0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREZWZhdWx0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm94eVNlbGVjdG9yLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdExqYXZhX25ldF9Qcm94eVNlbGVjdG9yX1NlY3VyaXR5KCkgeworICAgICAgICBQcm94eVNlbGVjdG9yIG9yaWdpbmFsU2VsZWN0b3IgPSBQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKTsKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9yaWduYWxTZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyKCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHNldFNlY3VyaXR5TWFuYWdlciBwZXJtaXNzaW9uLiIpOworICAgICAgICAgICAgU3lzdGVtLmVycgorICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigidGVzdF9zZXREZWZhdWx0TGphdmFfbmV0X1Byb3h5U2VsZWN0b3JfU2VjdXJpdHkgaXMgbm90IHRlc3RlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm94eVNlbGVjdG9yLnNldERlZmF1bHQobmV3IE1vY2tQcm94eVNlbGVjdG9yKCkpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9yaWduYWxTZWN1cml0eU1hbmFnZXIpOworICAgICAgICAgICAgUHJveHlTZWxlY3Rvci5zZXREZWZhdWx0KG9yaWdpbmFsU2VsZWN0b3IpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdExqYXZhX25ldF9VUklfU2VsZWN0RXhhY3QoKQotCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCS8vIG5vIHByb3h5LCByZXR1cm4gYSBwcm94eUxpc3Qgb25seSBjb250YWlucyBOT19QUk9YWQotCQlwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNlbGVjdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VsZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1VSSS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdEV4YWN0KCkKKyAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICAvLyBubyBwcm94eSwgcmV0dXJuIGEgcHJveHlMaXN0IG9ubHkgY29udGFpbnMgTk9fUFJPWFkKKyAgICAgICAgcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuTk9fUFJPWFkpOwogCi0JCS8vIHNldCBodHRwIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBIVFRQX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUF9QUk9YWV9QT1JUKSk7Ci0JCS8vIHNldCBodHRwcyBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5SG9zdCIsIEhUVFBTX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBTX1BST1hZX1BPUlQpKTsKLQkJLy8gc2V0IGZ0cCBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eUhvc3QiLCBGVFBfUFJPWFlfSE9TVCk7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEZUUF9QUk9YWV9QT1JUKSk7Ci0JCS8vIHNldCBzb2NrcyBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzUHJveHlIb3N0IiwgU09DS1NfUFJPWFlfSE9TVCk7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgic29ja3NQcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihTT0NLU19QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBodHRwIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBIVFRQX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUF9QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBodHRwcyBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5SG9zdCIsIEhUVFBTX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBTX1BST1hZX1BPUlQpKTsKKyAgICAgICAgLy8gc2V0IGZ0cCBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eUhvc3QiLCBGVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEZUUF9QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBzb2NrcyBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzUHJveHlIb3N0IiwgU09DS1NfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29ja3NQcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihTT0NLU19QUk9YWV9QT1JUKSk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBVcmkpOwotCQlhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5IVFRQLEhUVFBfUFJPWFlfSE9TVCxIVFRQX1BST1hZX1BPUlQpOworICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsSFRUUF9QUk9YWV9IT1NULEhUVFBfUFJPWFlfUE9SVCk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBzVXJpKTsKLQkJYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5LlR5cGUuSFRUUCxIVFRQU19QUk9YWV9IT1NULEhUVFBTX1BST1hZX1BPUlQpOwotCQkKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGZ0cFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsRlRQX1BST1hZX0hPU1QsRlRQX1BST1hZX1BPUlQpOwotCQkKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KHRjcFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLlNPQ0tTLFNPQ0tTX1BST1hZX0hPU1QsU09DS1NfUFJPWFlfUE9SVCk7CisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChodHRwc1VyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsSFRUUFNfUFJPWFlfSE9TVCxIVFRQU19QUk9YWV9QT1JUKTsKKyAgICAgICAgCisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChmdHBVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5IVFRQLEZUUF9QUk9YWV9IT1NULEZUUF9QUk9YWV9QT1JUKTsKKyAgICAgICAgCisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdCh0Y3BVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5TT0NLUyxTT0NLU19QUk9YWV9IT1NULFNPQ0tTX1BST1hZX1BPUlQpOwogCi0JfQorICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3RFeGFjdF9OdWxsSG9zdCgpCiAgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTEwNjMKQEAgLTIzMiwzODQgKzI5Miw0OTIgQEAKIAogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdEV4YWN0X0RlZmF1bHRQb3J0KCkKLQkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQkvLyBzZXQgaHR0cCBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3RFeGFjdF9EZWZhdWx0UG9ydCgpCisgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IGh0dHAgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsIEhUVFBfUFJPWFlfSE9TVCk7CiAKLQkJLy8gc2V0IGh0dHBzIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlIb3N0IiwgSFRUUFNfUFJPWFlfSE9TVCk7Ci0JCS8vIHNldCBmdHAgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlIb3N0IiwgRlRQX1BST1hZX0hPU1QpOwotCQkvLyBzZXQgc29ja3MgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5SG9zdCIsIFNPQ0tTX1BST1hZX0hPU1QpOworICAgICAgICAvLyBzZXQgaHR0cHMgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCBIVFRQU19QUk9YWV9IT1NUKTsKKyAgICAgICAgLy8gc2V0IGZ0cCBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eUhvc3QiLCBGVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIC8vIHNldCBzb2NrcyBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzUHJveHlIb3N0IiwgU09DS1NfUFJPWFlfSE9TVCk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBVcmkpOwotCQlhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5IVFRQLEhUVFBfUFJPWFlfSE9TVCxIVFRQX1BST1hZX1BPUlQpOworICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsSFRUUF9QUk9YWV9IT1NULEhUVFBfUFJPWFlfUE9SVCk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBzVXJpKTsKLQkJYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5LlR5cGUuSFRUUCxIVFRQU19QUk9YWV9IT1NULEhUVFBTX1BST1hZX1BPUlQpOwotCQkKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGZ0cFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsRlRQX1BST1hZX0hPU1QsRlRQX1BST1hZX1BPUlQpOwotCQkKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KHRjcFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLlNPQ0tTLFNPQ0tTX1BST1hZX0hPU1QsU09DS1NfUFJPWFlfUE9SVCk7CisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChodHRwc1VyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsSFRUUFNfUFJPWFlfSE9TVCxIVFRQU19QUk9YWV9QT1JUKTsKKyAgICAgICAgCisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChmdHBVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5IVFRQLEZUUF9QUk9YWV9IT1NULEZUUF9QUk9YWV9QT1JUKTsKKyAgICAgICAgCisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdCh0Y3BVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5TT0NLUyxTT0NLU19QUk9YWV9IT1NULFNPQ0tTX1BST1hZX1BPUlQpOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdEV4YWN0X0ludmFsaWRQb3J0KCkKLQkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcgSU5WQUxJRF9QT1JUID0gImFiYyI7Ci0JCQotCQkvLyBzZXQgaHR0cCBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIElOVkFMSURfUE9SVCk7Ci0JCS8vIHNldCBodHRwcyBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5SG9zdCIsIEhUVFBTX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5UG9ydCIsIElOVkFMSURfUE9SVCk7Ci0JCS8vIHNldCBmdHAgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlIb3N0IiwgRlRQX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eVBvcnQiLCBJTlZBTElEX1BPUlQpOwotCQkvLyBzZXQgc29ja3MgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5SG9zdCIsIFNPQ0tTX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzcHJveHlQb3J0IiwgSU5WQUxJRF9QT1JUKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3RFeGFjdF9JbnZhbGlkUG9ydCgpCisgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIElOVkFMSURfUE9SVCA9ICJhYmMiOworICAgICAgICAKKyAgICAgICAgLy8gc2V0IGh0dHAgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsIEhUVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBvcnQiLCBJTlZBTElEX1BPUlQpOworICAgICAgICAvLyBzZXQgaHR0cHMgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCBIVFRQU19QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eVBvcnQiLCBJTlZBTElEX1BPUlQpOworICAgICAgICAvLyBzZXQgZnRwIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlQb3J0IiwgSU5WQUxJRF9QT1JUKTsKKyAgICAgICAgLy8gc2V0IHNvY2tzIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29ja3NQcm94eUhvc3QiLCBTT0NLU19QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc3Byb3h5UG9ydCIsIElOVkFMSURfUE9SVCk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBVcmkpOwotCQlhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5IVFRQLEhUVFBfUFJPWFlfSE9TVCxIVFRQX1BST1hZX1BPUlQpOworICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsSFRUUF9QUk9YWV9IT1NULEhUVFBfUFJPWFlfUE9SVCk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBzVXJpKTsKLQkJYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5LlR5cGUuSFRUUCxIVFRQU19QUk9YWV9IT1NULEhUVFBTX1BST1hZX1BPUlQpOworICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cHNVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5IVFRQLEhUVFBTX1BST1hZX0hPU1QsSFRUUFNfUFJPWFlfUE9SVCk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGZ0cFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLkhUVFAsRlRQX1BST1hZX0hPU1QsRlRQX1BST1hZX1BPUlQpOworICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoZnRwVXJpKTsKKyAgICAgICAgYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5LlR5cGUuSFRUUCxGVFBfUFJPWFlfSE9TVCxGVFBfUFJPWFlfUE9SVCk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KHRjcFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLlNPQ0tTLFNPQ0tTX1BST1hZX0hPU1QsU09DS1NfUFJPWFlfUE9SVCk7Ci0JfQorICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QodGNwVXJpKTsKKyAgICAgICAgYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5LlR5cGUuU09DS1MsU09DS1NfUFJPWFlfSE9TVCxTT0NLU19QUk9YWV9QT1JUKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQotCSAqLwotCS8vIFJJIG1heSBmYWlsIHRoaXMgdGVzdCBjYXNlLiAKLQkvLyBVbmNvbW1lbnQgdGhpcyB0ZXN0IGNhc2Ugd2hlbiByZWdleC5qYXIgaXMgcmVhZHkuCi0JLyoKLQlwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdExqYXZhX25ldF9VUklfU2VsZWN0X05vblByb3h5SG9zdHMoKQotCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCS8vIFJJJ3MgYnVnLiBTb21lIFJJcyBtYXkgZmFpbCB0aGlzIHRlc3QgY2FzZS4gCi0JCVVSSVtdIGh0dHBVcmlzID0geyBuZXcgVVJJKCJodHRwOi8vdGVzdC5jb20iKSwKLQkJCQluZXcgVVJJKCJodHRwOi8vMTAuMTAuMS4yIiksIG5ldyBVUkkoImh0dHA6Ly9hIiksCi0JCQkJbmV3IFVSSSgiaHR0cDovL2RlZi5hYmMuY29tIikgfTsKLQkJVVJJW10gZnRwVXJpcyA9IHsgbmV3IFVSSSgiZnRwOi8vdGVzdC5jb20iKSwKLQkJCQluZXcgVVJJKCJmdHA6Ly8xMC4xMC4xLjIiKSwgbmV3IFVSSSgiZnRwOi8vYSIpLAotCQkJCW5ldyBVUkkoImZ0cDovL2RlZi5hYmMuY29tIikgfTsKLQkJCi0JCS8vIHNldCBodHRwIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBIVFRQX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAubm9uUHJveHlIb3N0cyIsICJhfGJ8dGVzKnwxMC4xMC4qfCouYWJjLmNvbSIpOwotCQkvLyBzZXQgZnRwIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAubm9uUHJveHlIb3N0cyIsICJhfGJ8dGVzKnwxMC4xMC4qfCouYWJjLmNvbSIpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCisgICAgICovCisgICAgLy8gUkkgbWF5IGZhaWwgdGhpcyB0ZXN0IGNhc2UuIAorICAgIC8vIFVuY29tbWVudCB0aGlzIHRlc3QgY2FzZSB3aGVuIHJlZ2V4LmphciBpcyByZWFkeS4KKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3RfTm9uUHJveHlIb3N0cygpCisgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUkkncyBidWcuIFNvbWUgUklzIG1heSBmYWlsIHRoaXMgdGVzdCBjYXNlLiAKKyAgICAgICAgVVJJW10gaHR0cFVyaXMgPSB7IG5ldyBVUkkoImh0dHA6Ly90ZXN0LmNvbSIpLAorICAgICAgICAgICAgICAgIG5ldyBVUkkoImh0dHA6Ly8xMC4xMC4xLjIiKSwgbmV3IFVSSSgiaHR0cDovL2EiKSwKKyAgICAgICAgICAgICAgICBuZXcgVVJJKCJodHRwOi8vZGVmLmFiYy5jb20iKSB9OworICAgICAgICBVUklbXSBmdHBVcmlzID0geyBuZXcgVVJJKCJmdHA6Ly90ZXN0LmNvbSIpLAorICAgICAgICAgICAgICAgIG5ldyBVUkkoImZ0cDovLzEwLjEwLjEuMiIpLCBuZXcgVVJJKCJmdHA6Ly9hIiksCisgICAgICAgICAgICAgICAgbmV3IFVSSSgiZnRwOi8vZGVmLmFiYy5jb20iKSB9OworICAgICAgICAKKyAgICAgICAgLy8gc2V0IGh0dHAgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsIEhUVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5ub25Qcm94eUhvc3RzIiwgImF8Ynx0ZXMqfDEwLjEwLip8Ki5hYmMuY29tIik7CisgICAgICAgIC8vIHNldCBmdHAgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlIb3N0IiwgRlRQX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5ub25Qcm94eUhvc3RzIiwgImF8Ynx0ZXMqfDEwLjEwLip8Ki5hYmMuY29tIik7CiAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBodHRwVXJpcy5sZW5ndGg7IGkrKykgewotCQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBVcmlzW2ldKTsKLQkJCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7Ci0JCX0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBodHRwVXJpcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBVcmlzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7CisgICAgICAgIH0KIAotCQlmb3IgKGludCBpID0gMDsgaSA8IGZ0cFVyaXMubGVuZ3RoOyBpKyspIHsKLQkJCXByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChmdHBVcmlzW2ldKTsKLQkJCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7Ci0JCX0KLQl9Ki8KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdHBVcmlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoZnRwVXJpc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuTk9fUFJPWFkpOworICAgICAgICB9CisgICAgfSovCiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3RMaWtlSFRUUCgpCi0JCQl0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsICIiKTsKLQkJLy8gc2V0IGh0dHBzIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlIb3N0IiwgSFRUUFNfUFJPWFlfSE9TVCk7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUFNfUFJPWFlfUE9SVCkpOwotCQkvLyBzZXQgZnRwIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoRlRQX1BST1hZX1BPUlQpKTsKLQkJLy8gc2V0IHNvY2tzIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgic29ja3NQcm94eUhvc3QiLCBTT0NLU19QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKFNPQ0tTX1BST1hZX1BPUlQpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3RMaWtlSFRUUCgpCisgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsICIiKTsKKyAgICAgICAgLy8gc2V0IGh0dHBzIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlIb3N0IiwgSFRUUFNfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUFNfUFJPWFlfUE9SVCkpOworICAgICAgICAvLyBzZXQgZnRwIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoRlRQX1BST1hZX1BPUlQpKTsKKyAgICAgICAgLy8gc2V0IHNvY2tzIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29ja3NQcm94eUhvc3QiLCBTT0NLU19QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKFNPQ0tTX1BST1hZX1BPUlQpKTsKIAotCQlwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLlNPQ0tTLFNPQ0tTX1BST1hZX0hPU1QsU09DS1NfUFJPWFlfUE9SVCk7Ci0JfQorICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLlNPQ0tTLFNPQ0tTX1BST1hZX0hPU1QsU09DS1NfUFJPWFlfUE9SVCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdExqYXZhX25ldF9VUklfU2VsZWN0Tm9IVFRQKCkKLQkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQkvLyBzZXQgaHR0cHMgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCBIVFRQU19QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihIVFRQU19QUk9YWV9QT1JUKSk7Ci0JCS8vIHNldCBmdHAgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlIb3N0IiwgRlRQX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihGVFBfUFJPWFlfUE9SVCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNlbGVjdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VsZWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtVUkkuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdE5vSFRUUCgpCisgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IGh0dHBzIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlIb3N0IiwgSFRUUFNfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUFNfUFJPWFlfUE9SVCkpOworICAgICAgICAvLyBzZXQgZnRwIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoRlRQX1BST1hZX1BPUlQpKTsKIAotCQlwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7Ci0JfQorICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdExqYXZhX25ldF9VUklfU2VsZWN0TGlrZUhUVFBTKCkKLQkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQkvLyBzZXQgaHR0cCBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBfUFJPWFlfUE9SVCkpOwotCQkvLyBzZXQgaHR0cHMgcHJveHkgaG9zdCBlbXB0eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgIiIpOwotCQkvLyBzZXQgZnRwIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoRlRQX1BST1hZX1BPUlQpKTsKLQkJLy8gc2V0IHNvY2tzIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgic29ja3NQcm94eUhvc3QiLCBTT0NLU19QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKFNPQ0tTX1BST1hZX1BPUlQpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3RMaWtlSFRUUFMoKQorICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCBodHRwIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBIVFRQX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUF9QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBodHRwcyBwcm94eSBob3N0IGVtcHR5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCAiIik7CisgICAgICAgIC8vIHNldCBmdHAgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlIb3N0IiwgRlRQX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihGVFBfUFJPWFlfUE9SVCkpOworICAgICAgICAvLyBzZXQgc29ja3MgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5SG9zdCIsIFNPQ0tTX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzUHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoU09DS1NfUFJPWFlfUE9SVCkpOwogCi0JCXByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChodHRwc1VyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5UeXBlLlNPQ0tTLFNPQ0tTX1BST1hZX0hPU1QsU09DS1NfUFJPWFlfUE9SVCk7Ci0JfQorICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cHNVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5TT0NLUyxTT0NLU19QUk9YWV9IT1NULFNPQ0tTX1BST1hZX1BPUlQpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdE5vSFRUUFMoKQotCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCS8vIHNldCBodHRwcyBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBfUFJPWFlfUE9SVCkpOwotCQkvLyBzZXQgZnRwIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoRlRQX1BST1hZX1BPUlQpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3ROb0hUVFBTKCkKKyAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgaHR0cHMgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsIEhUVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihIVFRQX1BST1hZX1BPUlQpKTsKKyAgICAgICAgLy8gc2V0IGZ0cCBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eUhvc3QiLCBGVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEZUUF9QUk9YWV9QT1JUKSk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGh0dHBzVXJpKTsKLQkJYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5Lk5PX1BST1hZKTsKLQl9CisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChodHRwc1VyaSk7CisgICAgICAgIGFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdExqYXZhX25ldF9VUklfU2VsZWN0TGlrZUZUUCgpCi0JCQl0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJLy8gc2V0IGh0dHAgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsIEhUVFBfUFJPWFlfSE9TVCk7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihIVFRQX1BST1hZX1BPUlQpKTsKLQkJLy8gc2V0IGZ0cCBob3N0IGVtcHR5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsICIiKTsKLQkJLy8gc2V0IGh0dHBzIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlIb3N0IiwgSFRUUFNfUFJPWFlfSE9TVCk7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cHMucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUFNfUFJPWFlfUE9SVCkpOwotCQkvLyBzZXQgc29ja3MgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5SG9zdCIsIFNPQ0tTX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzUHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoU09DS1NfUFJPWFlfUE9SVCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNlbGVjdCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VsZWN0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdExpa2VGVFAoKQorICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCBodHRwIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBIVFRQX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUF9QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBmdHAgaG9zdCBlbXB0eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eUhvc3QiLCAiIik7CisgICAgICAgIC8vIHNldCBodHRwcyBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5SG9zdCIsIEhUVFBTX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBTX1BST1hZX1BPUlQpKTsKKyAgICAgICAgLy8gc2V0IHNvY2tzIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29ja3NQcm94eUhvc3QiLCBTT0NLU19QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKFNPQ0tTX1BST1hZX1BPUlQpKTsKIAotCQlwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoZnRwVXJpKTsKLQkJYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5LlR5cGUuU09DS1MsU09DS1NfUFJPWFlfSE9TVCxTT0NLU19QUk9YWV9QT1JUKTsKLQl9CisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChmdHBVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuVHlwZS5TT0NLUyxTT0NLU19QUk9YWV9IT1NULFNPQ0tTX1BST1hZX1BPUlQpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdE5vRlRQKCkKLQkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQkvLyBzZXQgaHR0cCBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBfUFJPWFlfUE9SVCkpOwotCQkvLyBzZXQgaHR0cHMgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCBIVFRQU19QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihIVFRQU19QUk9YWV9QT1JUKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2VsZWN0IG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZWxlY3QiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtVUkkuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdExqYXZhX25ldF9VUklfU2VsZWN0Tm9GVFAoKQorICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCBodHRwIHByb3h5CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBIVFRQX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUF9QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBodHRwcyBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5SG9zdCIsIEhUVFBTX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBTX1BST1hZX1BPUlQpKTsKIAotCQlwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QoZnRwVXJpKTsKLQkJYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5Lk5PX1BST1hZKTsKLQl9CisgICAgICAgIHByb3h5TGlzdCA9IHNlbGVjdG9yLnNlbGVjdChmdHBVcmkpOworICAgICAgICBhc3NlcnRQcm94eUVxdWFscyhwcm94eUxpc3QsUHJveHkuTk9fUFJPWFkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX1NlbGVjdE5vU09DS1MoKQotCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCS8vIHNldCBodHRwIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBIVFRQX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoSFRUUF9QUk9YWV9QT1JUKSk7Ci0JCS8vIHNldCBodHRwcyBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5SG9zdCIsIEhUVFBTX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBTX1BST1hZX1BPUlQpKTsKLQkJLy8gc2V0IHNvY2tzIHByb3h5Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5SG9zdCIsIEZUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoRlRQX1BST1hZX1BPUlQpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1VSSS5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9TZWxlY3ROb1NPQ0tTKCkKKyAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgaHR0cCBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBfUFJPWFlfUE9SVCkpOworICAgICAgICAvLyBzZXQgaHR0cHMgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCBIVFRQU19QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihIVFRQU19QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBzb2NrcyBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eUhvc3QiLCBGVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZnRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEZUUF9QUk9YWV9QT1JUKSk7CiAKLQkJcHJveHlMaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KHRjcFVyaSk7Ci0JCWFzc2VydFByb3h5RXF1YWxzKHByb3h5TGlzdCxQcm94eS5OT19QUk9YWSk7Ci0JfQorICAgICAgICBwcm94eUxpc3QgPSBzZWxlY3Rvci5zZWxlY3QodGNwVXJpKTsKKyAgICAgICAgYXNzZXJ0UHJveHlFcXVhbHMocHJveHlMaXN0LFByb3h5Lk5PX1BST1hZKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdGlvbkZhaWxlZExqYXZhX25ldF9VUklMamF2YV9uZXRfU29ja2V0QWRkcmVzc0xqYXZhX2lvX0lPRXhjZXB0aW9uKCkKLQkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQkvLyBzZXQgaHR0cCBwcm94eQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBfUFJPWFlfUE9SVCkpOwotCQkvLyBzZXQgaHR0cHMgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCBIVFRQU19QUk9YWV9IT1NUKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihIVFRQU19QUk9YWV9QT1JUKSk7Ci0JCS8vIHNldCBmdHAgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlIb3N0IiwgRlRQX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihGVFBfUFJPWFlfUE9SVCkpOwotCQkvLyBzZXQgc29ja3MgcHJveHkKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5SG9zdCIsIFNPQ0tTX1BST1hZX0hPU1QpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzUHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoU09DS1NfUFJPWFlfUE9SVCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb25uZWN0RmFpbGVkIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0RmFpbGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1VSSS5jbGFzcywgU29ja2V0QWRkcmVzcy5jbGFzcywgSU9FeGNlcHRpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdGlvbkZhaWxlZExqYXZhX25ldF9VUklMamF2YV9uZXRfU29ja2V0QWRkcmVzc0xqYXZhX2lvX0lPRXhjZXB0aW9uKCkKKyAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgaHR0cCBwcm94eQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0IiwgSFRUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKEhUVFBfUFJPWFlfUE9SVCkpOworICAgICAgICAvLyBzZXQgaHR0cHMgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCBIVFRQU19QUk9YWV9IT1NUKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihIVFRQU19QUk9YWV9QT1JUKSk7CisgICAgICAgIC8vIHNldCBmdHAgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJmdHAucHJveHlIb3N0IiwgRlRQX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZ0cC5wcm94eVBvcnQiLCBTdHJpbmcudmFsdWVPZihGVFBfUFJPWFlfUE9SVCkpOworICAgICAgICAvLyBzZXQgc29ja3MgcHJveHkKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2Nrc1Byb3h5SG9zdCIsIFNPQ0tTX1BST1hZX0hPU1QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvY2tzUHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoU09DS1NfUFJPWFlfUE9SVCkpOwogCi0JCUxpc3QgcHJveHlMaXN0MSA9IHNlbGVjdG9yLnNlbGVjdChodHRwVXJpKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm94eUxpc3QxKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3h5TGlzdDEuc2l6ZSgpKTsKLQkJUHJveHkgcHJveHkxID0gKFByb3h5KSBwcm94eUxpc3QxLmdldCgwKTsKLQkJc2VsZWN0b3IKLQkJCQkuY29ubmVjdEZhaWxlZChodHRwVXJpLCBwcm94eTEuYWRkcmVzcygpLCBuZXcgU29ja2V0RXhjZXB0aW9uKCkpOworICAgICAgICBMaXN0IHByb3h5TGlzdDEgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJveHlMaXN0MSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwcm94eUxpc3QxLnNpemUoKSk7CisgICAgICAgIFByb3h5IHByb3h5MSA9IChQcm94eSkgcHJveHlMaXN0MS5nZXQoMCk7CisgICAgICAgIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLmNvbm5lY3RGYWlsZWQoaHR0cFVyaSwgcHJveHkxLmFkZHJlc3MoKSwgbmV3IFNvY2tldEV4Y2VwdGlvbigpKTsKIAotCQlMaXN0IHByb3h5TGlzdDIgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7Ci0JCWFzc2VydE5vdE51bGwocHJveHlMaXN0Mik7Ci0JCWFzc2VydEVxdWFscygxLCBwcm94eUxpc3QyLnNpemUoKSk7Ci0JCVByb3h5IHByb3h5MiA9IChQcm94eSkgcHJveHlMaXN0Mi5nZXQoMCk7Ci0JCS8vIERlZmF1bHQgaW1wbGVtZW50aW9uIGRvZXNuJ3QgY2hhbmdlIHRoZSBwcm94eSBsaXN0Ci0JCWFzc2VydEVxdWFscyhwcm94eTEsIHByb3h5Mik7Ci0JfQorICAgICAgICBMaXN0IHByb3h5TGlzdDIgPSBzZWxlY3Rvci5zZWxlY3QoaHR0cFVyaSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJveHlMaXN0Mik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwcm94eUxpc3QyLnNpemUoKSk7CisgICAgICAgIFByb3h5IHByb3h5MiA9IChQcm94eSkgcHJveHlMaXN0Mi5nZXQoMCk7CisgICAgICAgIC8vIERlZmF1bHQgaW1wbGVtZW50aW9uIGRvZXNuJ3QgY2hhbmdlIHRoZSBwcm94eSBsaXN0CisgICAgICAgIGFzc2VydEVxdWFscyhwcm94eTEsIHByb3h5Mik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3Rpb25GYWlsZWRMamF2YV9uZXRfVVJJTGphdmFfbmV0X1NvY2tldEFkZHJlc3NMamF2YV9pb19JT0V4Y2VwdGlvbl9JbGxlZ2FsQXJndWVtZW50KCkKLQkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlTb2NrZXRBZGRyZXNzIHNhID0gSW5ldFNvY2tldEFkZHJlc3MuY3JlYXRlVW5yZXNvbHZlZCgiMTI3LjAuMC4xIiwgMCk7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rvci5jb25uZWN0RmFpbGVkKG51bGwsIHNhLCBuZXcgU29ja2V0RXhjZXB0aW9uKCkpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgYXJndW1lbnQgaXMgbnVsbC4iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCXNlbGVjdG9yLmNvbm5lY3RGYWlsZWQoaHR0cFVyaSwgbnVsbCwgbmV3IFNvY2tldEV4Y2VwdGlvbigpKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGFyZ3VtZW50IGlzIG51bGwuIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rvci5jb25uZWN0RmFpbGVkKGh0dHBVcmksIHNhLCBudWxsKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGFyZ3VtZW50IGlzIG51bGwuIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlByb3h5U2VsZWN0b3Ijc2VsZWN0KFVSSSkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNvbm5lY3RGYWlsZWQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3RGYWlsZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJJLmNsYXNzLCBTb2NrZXRBZGRyZXNzLmNsYXNzLCBJT0V4Y2VwdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9jb25uZWN0aW9uRmFpbGVkTGphdmFfbmV0X1VSSUxqYXZhX25ldF9Tb2NrZXRBZGRyZXNzTGphdmFfaW9fSU9FeGNlcHRpb25fSWxsZWdhbEFyZ3VlbWVudCgpCisgICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBzYSA9IEluZXRTb2NrZXRBZGRyZXNzLmNyZWF0ZVVucmVzb2x2ZWQoIjEyNy4wLjAuMSIsIDApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3IuY29ubmVjdEZhaWxlZChudWxsLCBzYSwgbmV3IFNvY2tldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGFyZ3VtZW50IGlzIG51bGwuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5jb25uZWN0RmFpbGVkKGh0dHBVcmksIG51bGwsIG5ldyBTb2NrZXRFeGNlcHRpb24oKSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBhcmd1bWVudCBpcyBudWxsLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3IuY29ubmVjdEZhaWxlZChodHRwVXJpLCBzYSwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBhcmd1bWVudCBpcyBudWxsLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yI3NlbGVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZWxlY3RMamF2YV9uZXRfVVJJX0lsbGVnYWxBcmd1bWVudCgpCi0JCQl0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJVVJJW10gaWxsZWdhbFVyaXMgPSB7IG5ldyBVUkkoImFiYyIpLCBuZXcgVVJJKCJodHRwIiksIG51bGwgfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbGxlZ2FsVXJpcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlzZWxlY3Rvci5zZWxlY3QoaWxsZWdhbFVyaXNbaV0pOwotCQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZXhwZWN0ZWQKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHlTZWxlY3RvciNzZWxlY3QoVVJJKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZWxlY3QgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1VSSS5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbmV0X1VSSV9JbGxlZ2FsQXJndW1lbnQoKQorICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIFVSSVtdIGlsbGVnYWxVcmlzID0geyBuZXcgVVJJKCJhYmMiKSwgbmV3IFVSSSgiaHR0cCIpLCBudWxsIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWxsZWdhbFVyaXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KGlsbGVnYWxVcmlzW2ldKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIGFzc2VydHMgd2hldGhlciBzZWxlY3RlZFByb3h5TGlzdCBjb250YWlucyBvbmUgYW5kIG9ubHkgb25lIGVsZW1lbnQsCi0JICogYW5kIHRoZSBlbGVtZW50IGVxdWFscyBwcm94eS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXNzZXJ0UHJveHlFcXVhbHMoTGlzdCBzZWxlY3RlZFByb3h5TGlzdCwgUHJveHkgcHJveHkpIHsKLQkJYXNzZXJ0Tm90TnVsbChzZWxlY3RlZFByb3h5TGlzdCk7Ci0JCWFzc2VydEVxdWFscygxLCBzZWxlY3RlZFByb3h5TGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoKFByb3h5KSBzZWxlY3RlZFByb3h5TGlzdC5nZXQoMCksIHByb3h5KTsKLQl9Ci0JCi0JLyoKLQkgKiBhc3NlcnRzIHdoZXRoZXIgc2VsZWN0ZWRQcm94eUxpc3QgY29udGFpbnMgb25lIGFuZCBvbmx5IG9uZSBlbGVtZW50LAotCSAqIGFuZCB0aGUgZWxlbWVudCBlcXVhbHMgcHJveHkgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYXJndW1lbnRzICJ0eXBlIiwKLQkgKiAiaG9zdCIsInBvcnQiLgotCSAqLwotCXByaXZhdGUgdm9pZCBhc3NlcnRQcm94eUVxdWFscyhMaXN0IHNlbGVjdGVkUHJveHlMaXN0LCBQcm94eS5UeXBlIHR5cGUsCi0JCQlTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKLQkJU29ja2V0QWRkcmVzcyBzYSA9IEluZXRTb2NrZXRBZGRyZXNzLmNyZWF0ZVVucmVzb2x2ZWQoaG9zdCwgcG9ydCk7Ci0JCVByb3h5IHByb3h5ID0gbmV3IFByb3h5KHR5cGUsIHNhKTsKLQkJYXNzZXJ0UHJveHlFcXVhbHMoc2VsZWN0ZWRQcm94eUxpc3QsIHByb3h5KTsKLQl9Ci0JCi0JLyoKLQkgKiBNb2NrIHNlbGVjdG9yIGZvciBzZXREZWZhdWx0IHRlc3QKLQkgKi8KLQlzdGF0aWMgY2xhc3MgTW9ja1Byb3h5U2VsZWN0b3IgZXh0ZW5kcyBQcm94eVNlbGVjdG9yIHsKKyAgICAvKgorICAgICAqIGFzc2VydHMgd2hldGhlciBzZWxlY3RlZFByb3h5TGlzdCBjb250YWlucyBvbmUgYW5kIG9ubHkgb25lIGVsZW1lbnQsCisgICAgICogYW5kIHRoZSBlbGVtZW50IGVxdWFscyBwcm94eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UHJveHlFcXVhbHMoTGlzdCBzZWxlY3RlZFByb3h5TGlzdCwgUHJveHkgcHJveHkpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWxlY3RlZFByb3h5TGlzdCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzZWxlY3RlZFByb3h5TGlzdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKFByb3h5KSBzZWxlY3RlZFByb3h5TGlzdC5nZXQoMCksIHByb3h5KTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBhc3NlcnRzIHdoZXRoZXIgc2VsZWN0ZWRQcm94eUxpc3QgY29udGFpbnMgb25lIGFuZCBvbmx5IG9uZSBlbGVtZW50LAorICAgICAqIGFuZCB0aGUgZWxlbWVudCBlcXVhbHMgcHJveHkgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYXJndW1lbnRzICJ0eXBlIiwKKyAgICAgKiAiaG9zdCIsInBvcnQiLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQcm94eUVxdWFscyhMaXN0IHNlbGVjdGVkUHJveHlMaXN0LCBQcm94eS5UeXBlIHR5cGUsCisgICAgICAgICAgICBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBzYSA9IEluZXRTb2NrZXRBZGRyZXNzLmNyZWF0ZVVucmVzb2x2ZWQoaG9zdCwgcG9ydCk7CisgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KHR5cGUsIHNhKTsKKyAgICAgICAgYXNzZXJ0UHJveHlFcXVhbHMoc2VsZWN0ZWRQcm94eUxpc3QsIHByb3h5KTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBNb2NrIHNlbGVjdG9yIGZvciBzZXREZWZhdWx0IHRlc3QKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgTW9ja1Byb3h5U2VsZWN0b3IgZXh0ZW5kcyBQcm94eVNlbGVjdG9yIHsKIAotCQlwdWJsaWMgdm9pZCBjb25uZWN0RmFpbGVkKFVSSSB1cmksIFNvY2tldEFkZHJlc3Mgc2EsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICBwdWJsaWMgdm9pZCBjb25uZWN0RmFpbGVkKFVSSSB1cmksIFNvY2tldEFkZHJlc3Mgc2EsIElPRXhjZXB0aW9uIGlvZSkgewogCi0JCX0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBMaXN0IDxQcm94eT4gc2VsZWN0KFVSSSB1cmkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgTGlzdCA8UHJveHk+IHNlbGVjdChVUkkgdXJpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qCi0JICogTW9ja1NlY3VyaXR5TWFhbmdlci4gSXQgZGVuaWVzIE5ldFBlcm1pc3Npb24oImdldFByb3h5U2VsZWN0b3IiKSBhbmQKLQkgKiBOZXRQZXJtaXNzaW9uKCJzZXRQcm94eVNlbGVjdG9yIikuCi0JICovCi0JY2xhc3MgTW9ja1NlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7Ci0JCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKLQkJCWlmIChwZXJtaXNzaW9uIGluc3RhbmNlb2YgTmV0UGVybWlzc2lvbikgewotCQkJCWlmICgiZ2V0UHJveHlTZWxlY3RvciIuZXF1YWxzKHBlcm1pc3Npb24uZ2V0TmFtZSgpKSkgewotCQkJCQl0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9CisgICAgLyoKKyAgICAgKiBNb2NrU2VjdXJpdHlNYWFuZ2VyLiBJdCBkZW5pZXMgTmV0UGVybWlzc2lvbigiZ2V0UHJveHlTZWxlY3RvciIpIGFuZAorICAgICAqIE5ldFBlcm1pc3Npb24oInNldFByb3h5U2VsZWN0b3IiKS4KKyAgICAgKi8KKyAgICBjbGFzcyBNb2NrU2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKKyAgICAgICAgcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFBlcm1pc3Npb24gcGVybWlzc2lvbikgeworICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBOZXRQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKCJnZXRQcm94eVNlbGVjdG9yIi5lcXVhbHMocGVybWlzc2lvbi5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJaWYgKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBOZXRQZXJtaXNzaW9uKSB7Ci0JCQkJaWYgKCJzZXRQcm94eVNlbGVjdG9yIi5lcXVhbHMocGVybWlzc2lvbi5nZXROYW1lKCkpKSB7Ci0JCQkJCXRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uIGluc3RhbmNlb2YgTmV0UGVybWlzc2lvbikgeworICAgICAgICAgICAgICAgIGlmICgic2V0UHJveHlTZWxlY3RvciIuZXF1YWxzKHBlcm1pc3Npb24uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCWlmIChwZXJtaXNzaW9uIGluc3RhbmNlb2YgUnVudGltZVBlcm1pc3Npb24pIHsKLQkJCQlpZiAoInNldFNlY3VyaXR5TWFuYWdlciIuZXF1YWxzKHBlcm1pc3Npb24uZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBSdW50aW1lUGVybWlzc2lvbikgeworICAgICAgICAgICAgICAgIGlmICgic2V0U2VjdXJpdHlNYW5hZ2VyIi5lcXVhbHMocGVybWlzc2lvbi5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBzYXZlIG9yaWdpbmFsIHN5c3RlbSBwcm9wZXJ0aWVzCi0JCW9yaWduYWxTeXN0ZW1Qcm9wZXJ0aWVzID0gKFByb3BlcnRpZXMpIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuY2xvbmUoKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBzeXN0ZW0gcHJvcGVydGllcworICAgICAgICBvcmlnbmFsU3lzdGVtUHJvcGVydGllcyA9IChQcm9wZXJ0aWVzKSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmNsb25lKCk7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gcmVzdG9yZSBvcmlnbmFsIHN5c3RlbSBwcm9wZXJ0aWVzCi0JCVN5c3RlbS5zZXRQcm9wZXJ0aWVzKG9yaWduYWxTeXN0ZW1Qcm9wZXJ0aWVzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcmVzdG9yZSBvcmlnbmFsIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKG9yaWduYWxTeXN0ZW1Qcm9wZXJ0aWVzKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Byb3h5VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Qcm94eVRlc3QuamF2YQppbmRleCA5MGMzYzlkLi5lYTgzMWRjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Byb3h5VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvUHJveHlUZXN0LmphdmEKQEAgLTE1LDIxOSArMTUsMzMzIEBACiAgKi8KIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlByb3h5OwogaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJveHkuY2xhc3MpIAogcHVibGljIGNsYXNzIFByb3h5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCXByaXZhdGUgU29ja2V0QWRkcmVzcyBhZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCAxMjM0KTsKKyAgICBwcml2YXRlIFNvY2tldEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgMTIzNCk7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjUHJveHkoamF2YS5uZXQuUHJveHkuVHlwZSwgU29ja2V0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X1Byb3h5TGphdmFfbmV0X1NvY2tldEFkZHJlc3NfTm9ybWFsKCkgewotCQkvLyB0ZXN0IEhUVFAgdHlwZSBwcm94eQotCQlQcm94eSBwcm94eSA9IG5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsIGFkZHJlc3MpOwotCQlhc3NlcnRFcXVhbHMoUHJveHkuVHlwZS5IVFRQLCBwcm94eS50eXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzcywgcHJveHkuYWRkcmVzcygpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjUHJveHkoamF2YS5uZXQuUHJveHkuVHlwZSwgU29ja2V0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIFByb3h5IGNvbnN0cnVjdG9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3h5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Byb3h5LlR5cGUuY2xhc3MsIFNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfUHJveHlMamF2YV9uZXRfU29ja2V0QWRkcmVzc19Ob3JtYWwoKSB7CisgICAgICAgIC8vIHRlc3QgSFRUUCB0eXBlIHByb3h5CisgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgYWRkcmVzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhQcm94eS5UeXBlLkhUVFAsIHByb3h5LnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRyZXNzLCBwcm94eS5hZGRyZXNzKCkpOwogCi0JCS8vIHRlc3QgU09DS1MgdHlwZSBwcm94eQotCQlwcm94eSA9IG5ldyBQcm94eShQcm94eS5UeXBlLlNPQ0tTLCBhZGRyZXNzKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3h5LlR5cGUuU09DS1MsIHByb3h5LnR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzLCBwcm94eS5hZGRyZXNzKCkpOworICAgICAgICAvLyB0ZXN0IFNPQ0tTIHR5cGUgcHJveHkKKyAgICAgICAgcHJveHkgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5TT0NLUywgYWRkcmVzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhQcm94eS5UeXBlLlNPQ0tTLCBwcm94eS50eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWRkcmVzcywgcHJveHkuYWRkcmVzcygpKTsKIAotCQkvLyB0ZXN0IERJUkVDVCB0eXBlIHByb3h5Ci0JCXByb3h5ID0gUHJveHkuTk9fUFJPWFk7Ci0JCWFzc2VydEVxdWFscyhQcm94eS5UeXBlLkRJUkVDVCwgcHJveHkudHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChwcm94eS5hZGRyZXNzKCkpOwotCX0KKyAgICAgICAgLy8gdGVzdCBESVJFQ1QgdHlwZSBwcm94eQorICAgICAgICBwcm94eSA9IFByb3h5Lk5PX1BST1hZOworICAgICAgICBhc3NlcnRFcXVhbHMoUHJveHkuVHlwZS5ESVJFQ1QsIHByb3h5LnR5cGUoKSk7CisgICAgICAgIGFzc2VydE51bGwocHJveHkuYWRkcmVzcygpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjUHJveHkoamF2YS5uZXQuUHJveHkuVHlwZSwgU29ja2V0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X1Byb3h5TGphdmFfbmV0X1NvY2tldEFkZHJlc3NfSWxsZWdhbEFkZHJlc3MoKSB7Ci0JCVByb3h5IHByb3h5ID0gbnVsbDsKLQkJLy8gdGVzdCBIVFRQIHR5cGUgcHJveHkKLQkJdHJ5IHsKLQkJCXByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgbnVsbCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCS8vIHRlc3QgU09DS1MgdHlwZSBwcm94eQotCQl0cnkgewotCQkJcHJveHkgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5TT0NLUywgbnVsbCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCS8vIHRlc3QgRElSRUNUIHR5cGUgcHJveHkKLQkJdHJ5IHsKLQkJCXByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuRElSRUNULCBudWxsKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJLy8gdGVzdCBESVJFQ1QgdHlwZSBwcm94eSwgYW55IGFkZHJlc3MgaXMgaWxsZWdhbAotCQl0cnkgewotCQkJcHJveHkgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5ESVJFQ1QsIGFkZHJlc3MpOwotCQkJZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eSNQcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLCBTb2NrZXRBZGRyZXNzKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgUHJveHkgY29uc3RydWN0b3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJveHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJveHkuVHlwZS5jbGFzcywgU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9Qcm94eUxqYXZhX25ldF9Tb2NrZXRBZGRyZXNzX0lsbGVnYWxBZGRyZXNzKCkgeworICAgICAgICBQcm94eSBwcm94eSA9IG51bGw7CisgICAgICAgIC8vIHRlc3QgSFRUUCB0eXBlIHByb3h5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm94eSA9IG5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsIG51bGwpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IFNPQ0tTIHR5cGUgcHJveHkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIG51bGwpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IERJUkVDVCB0eXBlIHByb3h5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm94eSA9IG5ldyBQcm94eShQcm94eS5UeXBlLkRJUkVDVCwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIC8vIHRlc3QgRElSRUNUIHR5cGUgcHJveHksIGFueSBhZGRyZXNzIGlzIGlsbGVnYWwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuRElSRUNULCBhZGRyZXNzKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjaGFzaENvZGUoKQotCSAqIEBzZWUgYWxzbyBzZWUgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdF9FcXVhbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCQkvLyBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgaW4gdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdF9FcXVhbHMuCi0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eSNoYXNoQ29kZSgpCisgICAgICogQHNlZSBhbHNvIHNlZSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0X0VxdWFscworICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CisgICAgICAgIC8vIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBpbiB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0X0VxdWFscy4KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjdHlwZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF90eXBlKCkgewotCQkvLyBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgaW4gdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9Qcm94eUxqYXZhX25ldF9Tb2NrZXRBZGRyZXNzX05vcm1hbC4gCi0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eSN0eXBlKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfdHlwZSgpIHsKKyAgICAgICAgLy8gVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIGluIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfUHJveHlMamF2YV9uZXRfU29ja2V0QWRkcmVzc19Ob3JtYWwuIAorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eSNhZGRyZXNzKCkgVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIGluCi0JICogICAgICAgIENvbnN0cnVjdG9yIHRlc3QgY2FzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2FkZHJlc3MoKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBpbiB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X1Byb3h5TGphdmFfbmV0X1NvY2tldEFkZHJlc3NfTm9ybWFsLgotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjYWRkcmVzcygpIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBpbgorICAgICAqICAgICAgICBDb25zdHJ1Y3RvciB0ZXN0IGNhc2UuCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZHJlc3MoKSB7CisgICAgICAgIC8vIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBpbiB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X1Byb3h5TGphdmFfbmV0X1NvY2tldEFkZHJlc3NfTm9ybWFsLgorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eSN0b1N0cmluZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQkJUHJveHkgcHJveHkgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5IVFRQLCBhZGRyZXNzKTsKLQkJLy8gaW5jbHVkZSB0eXBlIFN0cmluZwotCQlhc3NlcnRUcnVlKHByb3h5LnRvU3RyaW5nKCkuaW5kZXhPZihwcm94eS50eXBlKCkudG9TdHJpbmcoKSkgIT0gLTEpOwotCQkvLyBpbmNsdWRlIGFkZHJlc3MgU3RyaW5nCi0JCWFzc2VydFRydWUocHJveHkudG9TdHJpbmcoKS5pbmRleE9mKHByb3h5LmFkZHJlc3MoKS50b1N0cmluZygpKSAhPSAtMSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlByb3h5I3RvU3RyaW5nKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CisgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgYWRkcmVzcyk7CisgICAgICAgIC8vIGluY2x1ZGUgdHlwZSBTdHJpbmcKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eS50b1N0cmluZygpLmluZGV4T2YocHJveHkudHlwZSgpLnRvU3RyaW5nKCkpICE9IC0xKTsKKyAgICAgICAgLy8gaW5jbHVkZSBhZGRyZXNzIFN0cmluZworICAgICAgICBhc3NlcnRUcnVlKHByb3h5LnRvU3RyaW5nKCkuaW5kZXhPZihwcm94eS5hZGRyZXNzKCkudG9TdHJpbmcoKSkgIT0gLTEpOwogCi0JCXByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHJlc3MpOwotCQkvLyBpbmNsdWRlIHR5cGUgU3RyaW5nCi0JCWFzc2VydFRydWUocHJveHkudG9TdHJpbmcoKS5pbmRleE9mKHByb3h5LnR5cGUoKS50b1N0cmluZygpKSAhPSAtMSk7Ci0JCS8vIGluY2x1ZGUgYWRkcmVzcyBTdHJpbmcKLQkJYXNzZXJ0VHJ1ZShwcm94eS50b1N0cmluZygpLmluZGV4T2YocHJveHkuYWRkcmVzcygpLnRvU3RyaW5nKCkpICE9IC0xKTsKKyAgICAgICAgcHJveHkgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5TT0NLUywgYWRkcmVzcyk7CisgICAgICAgIC8vIGluY2x1ZGUgdHlwZSBTdHJpbmcKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eS50b1N0cmluZygpLmluZGV4T2YocHJveHkudHlwZSgpLnRvU3RyaW5nKCkpICE9IC0xKTsKKyAgICAgICAgLy8gaW5jbHVkZSBhZGRyZXNzIFN0cmluZworICAgICAgICBhc3NlcnRUcnVlKHByb3h5LnRvU3RyaW5nKCkuaW5kZXhPZihwcm94eS5hZGRyZXNzKCkudG9TdHJpbmcoKSkgIT0gLTEpOwogCi0JCXByb3h5ID0gUHJveHkuTk9fUFJPWFk7Ci0JCS8vIGluY2x1ZGUgdHlwZSBTdHJpbmcKLQkJYXNzZXJ0VHJ1ZShwcm94eS50b1N0cmluZygpLmluZGV4T2YocHJveHkudHlwZSgpLnRvU3RyaW5nKCkpICE9IC0xKTsKKyAgICAgICAgcHJveHkgPSBQcm94eS5OT19QUk9YWTsKKyAgICAgICAgLy8gaW5jbHVkZSB0eXBlIFN0cmluZworICAgICAgICBhc3NlcnRUcnVlKHByb3h5LnRvU3RyaW5nKCkuaW5kZXhPZihwcm94eS50eXBlKCkudG9TdHJpbmcoKSkgIT0gLTEpOwogCi0JCXByb3h5ID0gbmV3IFByb3h5KG51bGwsIGFkZHJlc3MpOwotCQkvLyBlbnN1cmUgbm8gTlBFIGlzIHRocm93bgotCQlwcm94eS50b1N0cmluZygpOworICAgICAgICBwcm94eSA9IG5ldyBQcm94eShudWxsLCBhZGRyZXNzKTsKKyAgICAgICAgLy8gZW5zdXJlIG5vIE5QRSBpcyB0aHJvd24KKyAgICAgICAgcHJveHkudG9TdHJpbmcoKTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0X0VxdWFscygpIHsKLQkJU29ja2V0QWRkcmVzcyBhZGRyZXNzMSA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgMTIzNCk7Ci0JCVNvY2tldEFkZHJlc3MgYWRkcmVzczIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIDEyMzQpOwotCQkvLyBIVFRQIHR5cGUKLQkJUHJveHkgcHJveHkxID0gbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgYWRkcmVzczEpOwotCQlQcm94eSBwcm94eTIgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5IVFRQLCBhZGRyZXNzMik7Ci0JCWFzc2VydFRydWUocHJveHkxLmVxdWFscyhwcm94eTIpKTsKLQkJLy8gYXNzZXJ0IGhhc2hDb2RlCi0JCWFzc2VydFRydWUocHJveHkxLmhhc2hDb2RlKCkgPT0gcHJveHkyLmhhc2hDb2RlKCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eSNlcXVhbHMoT2JqZWN0KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZXF1YWxzIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0X0VxdWFscygpIHsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBhZGRyZXNzMSA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgMTIzNCk7CisgICAgICAgIFNvY2tldEFkZHJlc3MgYWRkcmVzczIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIDEyMzQpOworICAgICAgICAvLyBIVFRQIHR5cGUKKyAgICAgICAgUHJveHkgcHJveHkxID0gbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgYWRkcmVzczEpOworICAgICAgICBQcm94eSBwcm94eTIgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5IVFRQLCBhZGRyZXNzMik7CisgICAgICAgIGFzc2VydFRydWUocHJveHkxLmVxdWFscyhwcm94eTIpKTsKKyAgICAgICAgLy8gYXNzZXJ0IGhhc2hDb2RlCisgICAgICAgIGFzc2VydFRydWUocHJveHkxLmhhc2hDb2RlKCkgPT0gcHJveHkyLmhhc2hDb2RlKCkpOwogCi0JCS8vIFNPQ0tTIHR5cGUKLQkJUHJveHkgcHJveHkzID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHJlc3MxKTsKLQkJUHJveHkgcHJveHk0ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHJlc3MyKTsKLQkJYXNzZXJ0VHJ1ZShwcm94eTMuZXF1YWxzKHByb3h5NCkpOwotCQkvLyBhc3NlcnQgaGFzaENvZGUKLQkJYXNzZXJ0VHJ1ZShwcm94eTMuaGFzaENvZGUoKSA9PSBwcm94eTQuaGFzaENvZGUoKSk7CisgICAgICAgIC8vIFNPQ0tTIHR5cGUKKyAgICAgICAgUHJveHkgcHJveHkzID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHJlc3MxKTsKKyAgICAgICAgUHJveHkgcHJveHk0ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHJlc3MyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eTMuZXF1YWxzKHByb3h5NCkpOworICAgICAgICAvLyBhc3NlcnQgaGFzaENvZGUKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eTMuaGFzaENvZGUoKSA9PSBwcm94eTQuaGFzaENvZGUoKSk7CiAKLQkJLy8gbnVsbCB0eXBlCi0JCVByb3h5IHByb3h5NSA9IG5ldyBQcm94eShudWxsLCBhZGRyZXNzMSk7Ci0JCVByb3h5IHByb3h5NiA9IG5ldyBQcm94eShudWxsLCBhZGRyZXNzMik7Ci0JCWFzc2VydFRydWUocHJveHk1LmVxdWFscyhwcm94eTYpKTsKLQl9CisgICAgICAgIC8vIG51bGwgdHlwZQorICAgICAgICBQcm94eSBwcm94eTUgPSBuZXcgUHJveHkobnVsbCwgYWRkcmVzczEpOworICAgICAgICBQcm94eSBwcm94eTYgPSBuZXcgUHJveHkobnVsbCwgYWRkcmVzczIpOworICAgICAgICBhc3NlcnRUcnVlKHByb3h5NS5lcXVhbHMocHJveHk2KSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdF9Ob3RFcXVhbHMoKSB7Ci0JCVNvY2tldEFkZHJlc3MgYWRkcmVzczEgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIDEyMzQpOwotCQlTb2NrZXRBZGRyZXNzIGFkZHJlc3MyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCAxMjM1KTsKLQkJUHJveHkgcHJveHlbXSA9IHsgbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgYWRkcmVzczEpLAotCQkJCW5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsIGFkZHJlc3MyKSwKLQkJCQluZXcgUHJveHkoUHJveHkuVHlwZS5TT0NLUywgYWRkcmVzczEpLAotCQkJCW5ldyBQcm94eShQcm94eS5UeXBlLlNPQ0tTLCBhZGRyZXNzMiksIFByb3h5Lk5PX1BST1hZLAotCQkJCW5ldyBQcm94eShudWxsLCBhZGRyZXNzMSksIG5ldyBQcm94eShudWxsLCBhZGRyZXNzMikgfTsKLQkJLy8gQWxsIG9mIHRoZW0gYXJlIG5vdCBlcXVhbHMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm94eS5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgcHJveHkubGVuZ3RoOyBqKyspIHsKLQkJCQlhc3NlcnRGYWxzZShwcm94eVtpXS5lcXVhbHMocHJveHlbal0pKTsKLQkJCX0KLQkJfQotCQkvLyBOb3QgZXF1YWxzIHRvIGFuIE9iamVjdCB0eXBlIGluc3RhbmNlLiBFbnN1cmUgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KLQkJYXNzZXJ0RmFsc2UocHJveHlbMF0uZXF1YWxzKG5ldyBPYmplY3QoKSkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkjZXF1YWxzKE9iamVjdCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGVxdWFscyBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdF9Ob3RFcXVhbHMoKSB7CisgICAgICAgIFNvY2tldEFkZHJlc3MgYWRkcmVzczEgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIDEyMzQpOworICAgICAgICBTb2NrZXRBZGRyZXNzIGFkZHJlc3MyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCAxMjM1KTsKKyAgICAgICAgUHJveHkgcHJveHlbXSA9IHsgbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgYWRkcmVzczEpLAorICAgICAgICAgICAgICAgIG5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsIGFkZHJlc3MyKSwKKyAgICAgICAgICAgICAgICBuZXcgUHJveHkoUHJveHkuVHlwZS5TT0NLUywgYWRkcmVzczEpLAorICAgICAgICAgICAgICAgIG5ldyBQcm94eShQcm94eS5UeXBlLlNPQ0tTLCBhZGRyZXNzMiksIFByb3h5Lk5PX1BST1hZLAorICAgICAgICAgICAgICAgIG5ldyBQcm94eShudWxsLCBhZGRyZXNzMSksIG5ldyBQcm94eShudWxsLCBhZGRyZXNzMikgfTsKKyAgICAgICAgLy8gQWxsIG9mIHRoZW0gYXJlIG5vdCBlcXVhbHMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm94eS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgcHJveHkubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShwcm94eVtpXS5lcXVhbHMocHJveHlbal0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBOb3QgZXF1YWxzIHRvIGFuIE9iamVjdCB0eXBlIGluc3RhbmNlLiBFbnN1cmUgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgYXNzZXJ0RmFsc2UocHJveHlbMF0uZXF1YWxzKG5ldyBPYmplY3QoKSkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eS5UeXBlI3ZhbHVlT2YoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfVHlwZV92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmdfTm9ybWFsKCkgewotCQlhc3NlcnRFcXVhbHMoUHJveHkuVHlwZS5ESVJFQ1QsIFByb3h5LlR5cGUudmFsdWVPZigiRElSRUNUIikpOwotCQlhc3NlcnRFcXVhbHMoUHJveHkuVHlwZS5IVFRQLCBQcm94eS5UeXBlLnZhbHVlT2YoIkhUVFAiKSk7Ci0JCWFzc2VydEVxdWFscyhQcm94eS5UeXBlLlNPQ0tTLCBQcm94eS5UeXBlLnZhbHVlT2YoIlNPQ0tTIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkuVHlwZSN2YWx1ZU9mKFN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9UeXBlX3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZ19Ob3JtYWwoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhQcm94eS5UeXBlLkRJUkVDVCwgUHJveHkuVHlwZS52YWx1ZU9mKCJESVJFQ1QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQcm94eS5UeXBlLkhUVFAsIFByb3h5LlR5cGUudmFsdWVPZigiSFRUUCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFByb3h5LlR5cGUuU09DS1MsIFByb3h5LlR5cGUudmFsdWVPZigiU09DS1MiKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5LlR5cGUjdmFsdWVPZihTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9UeXBlX3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZ19JbGxlZ2FsTmFtZSgpIHsKLQkJU3RyaW5nW10gaWxsZWdhbE5hbWUgPSB7ICJEaXJlY3QiLCAiZGlyZWN0IiwgImh0dHAiLCAic29ja3MiLAotCQkJCSJpbGxlZ2FsTmFtZSIsICIiIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWxsZWdhbE5hbWUubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJUHJveHkuVHlwZS52YWx1ZU9mKGlsbGVnYWxOYW1lW2ldKTsKLQkJCQlmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBpbGxlZ2FsTmFtZToiCi0JCQkJCQkrIGlsbGVnYWxOYW1lKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZXhwZWN0ZWQKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkuVHlwZSN2YWx1ZU9mKFN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIUNvbnN0YW50cyIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICApCisgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfVHlwZV92YWx1ZU9mTGphdmFfbGFuZ19TdHJpbmdfSWxsZWdhbE5hbWUoKSB7CisgICAgICAgIFN0cmluZ1tdIGlsbGVnYWxOYW1lID0geyAiRGlyZWN0IiwgImRpcmVjdCIsICJodHRwIiwgInNvY2tzIiwKKyAgICAgICAgICAgICAgICAiaWxsZWdhbE5hbWUiLCAiIiB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlsbGVnYWxOYW1lLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByb3h5LlR5cGUudmFsdWVPZihpbGxlZ2FsTmFtZVtpXSk7CisgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgaWxsZWdhbE5hbWU6IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBpbGxlZ2FsTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUHJveHkuVHlwZSN2YWx1ZU9mKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1R5cGVfdmFsdWVPZkxqYXZhX2xhbmdfU3RyaW5nX051bGxQb2ludGVyRXhjZXB0aW9uKCkgewotCQkvLyBTb21lIG9sZCBSSXMsd2hpY2ggdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Qcm94eS5UeXBlI3ZhbHVlT2YoU3RyaW5nKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICkKKyAgICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9UeXBlX3ZhbHVlT2ZMamF2YV9sYW5nX1N0cmluZ19OdWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgLy8gU29tZSBvbGQgUklzLHdoaWNoIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KICAgICAgICAgLy8gTGF0ZXN0IFJJcyB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4KLQkJdHJ5IHsKLQkJCVByb3h5LlR5cGUudmFsdWVPZihudWxsKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm94eS5UeXBlLnZhbHVlT2YobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uLiIpOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBNYXkgYmUgY2F1c2VkIGJ5IHNvbWUgY29tcGlsZXJzJyBjb2RlCiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBvdGhlciBjb21waWxlcnMgd2lsbCB0aHJvdyB0aGlzCiAgICAgICAgIH0KLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlByb3h5LlR5cGUjdmFsdWVzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1R5cGVfdmFsdWVzKCkgewotCQlQcm94eS5UeXBlIHR5cGVzW10gPSBQcm94eS5UeXBlLnZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoMywgdHlwZXMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3h5LlR5cGUuRElSRUNULCB0eXBlc1swXSk7Ci0JCWFzc2VydEVxdWFscyhQcm94eS5UeXBlLkhUVFAsIHR5cGVzWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3h5LlR5cGUuU09DS1MsIHR5cGVzWzJdKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlByb3h5LlR5cGUjdmFsdWVzKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIUNvbnN0YW50cyIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICApCisgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfVHlwZV92YWx1ZXMoKSB7CisgICAgICAgIFByb3h5LlR5cGUgdHlwZXNbXSA9IFByb3h5LlR5cGUudmFsdWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCB0eXBlcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoUHJveHkuVHlwZS5ESVJFQ1QsIHR5cGVzWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFByb3h5LlR5cGUuSFRUUCwgdHlwZXNbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoUHJveHkuVHlwZS5TT0NLUywgdHlwZXNbMl0pOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9SZXNwb25zZUNhY2hlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9SZXNwb25zZUNhY2hlVGVzdC5qYXZhCmluZGV4IDIwYTlkYTYuLmMwNWFmOTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvUmVzcG9uc2VDYWNoZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Jlc3BvbnNlQ2FjaGVUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuQ2FjaGVSZXF1ZXN0OwogaW1wb3J0IGphdmEubmV0LkNhY2hlUmVzcG9uc2U7CkBAIC0yOCwxMTQgKzMzLDE1MSBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFJlc3BvbnNlQ2FjaGUuY2xhc3MpIAogcHVibGljIGNsYXNzIFJlc3BvbnNlQ2FjaGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlJlc3BvbnNlQ2FjaGUjZ2V0RGVmYXVsdCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9HZXREZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoUmVzcG9uc2VDYWNoZS5nZXREZWZhdWx0KCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUmVzcG9uc2VDYWNoZSNnZXREZWZhdWx0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldERlZmF1bHQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0dldERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChSZXNwb25zZUNhY2hlLmdldERlZmF1bHQoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlJlc3BvbnNlQ2FjaGUjc2V0RGVmYXVsdChSZXNwb25zZUNhY2hlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfU2V0RGVmYXVsdExqYXZhX25ldF9SZXNwb25zZUNhY2hlX05vcm1hbCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzcG9uc2VDYWNoZSByYzEgPSBuZXcgTW9ja1Jlc3BvbnNlQ2FjaGUoKTsKLQkJUmVzcG9uc2VDYWNoZSByYzIgPSBuZXcgTW9ja1Jlc3BvbnNlQ2FjaGUoKTsKLQkJUmVzcG9uc2VDYWNoZS5zZXREZWZhdWx0KHJjMSk7Ci0JCWFzc2VydFNhbWUoUmVzcG9uc2VDYWNoZS5nZXREZWZhdWx0KCksIHJjMSk7Ci0JCVJlc3BvbnNlQ2FjaGUuc2V0RGVmYXVsdChyYzIpOwotCQlhc3NlcnRTYW1lKFJlc3BvbnNlQ2FjaGUuZ2V0RGVmYXVsdCgpLCByYzIpOwotCQlSZXNwb25zZUNhY2hlLnNldERlZmF1bHQobnVsbCk7Ci0JCWFzc2VydE51bGwoUmVzcG9uc2VDYWNoZS5nZXREZWZhdWx0KCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUmVzcG9uc2VDYWNoZSNzZXREZWZhdWx0KFJlc3BvbnNlQ2FjaGUpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXREZWZhdWx0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREZWZhdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Jlc3BvbnNlQ2FjaGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfU2V0RGVmYXVsdExqYXZhX25ldF9SZXNwb25zZUNhY2hlX05vcm1hbCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2VDYWNoZSByYzEgPSBuZXcgTW9ja1Jlc3BvbnNlQ2FjaGUoKTsKKyAgICAgICAgUmVzcG9uc2VDYWNoZSByYzIgPSBuZXcgTW9ja1Jlc3BvbnNlQ2FjaGUoKTsKKyAgICAgICAgUmVzcG9uc2VDYWNoZS5zZXREZWZhdWx0KHJjMSk7CisgICAgICAgIGFzc2VydFNhbWUoUmVzcG9uc2VDYWNoZS5nZXREZWZhdWx0KCksIHJjMSk7CisgICAgICAgIFJlc3BvbnNlQ2FjaGUuc2V0RGVmYXVsdChyYzIpOworICAgICAgICBhc3NlcnRTYW1lKFJlc3BvbnNlQ2FjaGUuZ2V0RGVmYXVsdCgpLCByYzIpOworICAgICAgICBSZXNwb25zZUNhY2hlLnNldERlZmF1bHQobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoUmVzcG9uc2VDYWNoZS5nZXREZWZhdWx0KCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5SZXNwb25zZUNhY2hlI2dldERlZmF1bHQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfR2V0RGVmYXVsdF9TZWN1cml0eSgpIHsKLQkJU2VjdXJpdHlNYW5hZ2VyIG9sZCA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IE1vY2tTTSgpKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBzZXRTZWN1cml0eU1hbmFnZXIgcGVybWlzc2lvbi4iKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigidGVzdF9zZXREZWZhdWx0TGphdmFfbmV0X1Jlc3BvbnNlQ2FjaGVfTm9QZXJtaXNzaW9uIGlzIG5vdCB0ZXN0ZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJUmVzcG9uc2VDYWNoZS5nZXREZWZhdWx0KCk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob2xkKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUmVzcG9uc2VDYWNoZSNnZXREZWZhdWx0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldERlZmF1bHQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0dldERlZmF1bHRfU2VjdXJpdHkoKSB7CisgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGQgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU00oKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTm8gc2V0U2VjdXJpdHlNYW5hZ2VyIHBlcm1pc3Npb24uIik7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInRlc3Rfc2V0RGVmYXVsdExqYXZhX25ldF9SZXNwb25zZUNhY2hlX05vUGVybWlzc2lvbiBpcyBub3QgdGVzdGVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc3BvbnNlQ2FjaGUuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuUmVzcG9uc2VDYWNoZSNzZXREZWZhdWx0KFJlc3BvbnNlQ2FjaGUpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXREZWZhdWx0TGphdmFfbmV0X1Jlc3BvbnNlQ2FjaGVfTm9QZXJtaXNzaW9uKCkgewotCQlSZXNwb25zZUNhY2hlIHJjID0gbmV3IE1vY2tSZXNwb25zZUNhY2hlKCk7Ci0JCVNlY3VyaXR5TWFuYWdlciBvbGQgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU00oKSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gc2V0U2VjdXJpdHlNYW5hZ2VyIHBlcm1pc3Npb24uIik7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oInRlc3Rfc2V0RGVmYXVsdExqYXZhX25ldF9SZXNwb25zZUNhY2hlX05vUGVybWlzc2lvbiBpcyBub3QgdGVzdGVkIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCVJlc3BvbnNlQ2FjaGUuc2V0RGVmYXVsdChyYyk7Ci0JCQlmYWlsKCJzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob2xkKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuUmVzcG9uc2VDYWNoZSNzZXREZWZhdWx0KFJlc3BvbnNlQ2FjaGUpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXREZWZhdWx0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREZWZhdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Jlc3BvbnNlQ2FjaGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdExqYXZhX25ldF9SZXNwb25zZUNhY2hlX05vUGVybWlzc2lvbigpIHsKKyAgICAgICAgUmVzcG9uc2VDYWNoZSByYyA9IG5ldyBNb2NrUmVzcG9uc2VDYWNoZSgpOworICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgTW9ja1NNKCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHNldFNlY3VyaXR5TWFuYWdlciBwZXJtaXNzaW9uLiIpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJ0ZXN0X3NldERlZmF1bHRMamF2YV9uZXRfUmVzcG9uc2VDYWNoZV9Ob1Blcm1pc3Npb24gaXMgbm90IHRlc3RlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNwb25zZUNhY2hlLnNldERlZmF1bHQocmMpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIE1vY2tSZXNwb25zZUNhY2hlIGZvciB0ZXN0U2V0RGVmYXVsdChSZXNwb25zZUNhY2hlKQotCSAqLwotCWNsYXNzIE1vY2tSZXNwb25zZUNhY2hlIGV4dGVuZHMgUmVzcG9uc2VDYWNoZSB7CisgICAgLyoKKyAgICAgKiBNb2NrUmVzcG9uc2VDYWNoZSBmb3IgdGVzdFNldERlZmF1bHQoUmVzcG9uc2VDYWNoZSkKKyAgICAgKi8KKyAgICBjbGFzcyBNb2NrUmVzcG9uc2VDYWNoZSBleHRlbmRzIFJlc3BvbnNlQ2FjaGUgewogCi0JCXB1YmxpYyBDYWNoZVJlc3BvbnNlIGdldChVUkkgYXJnMCwgU3RyaW5nIGFyZzEsIE1hcCBhcmcyKQotCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgQ2FjaGVSZXNwb25zZSBnZXQoVVJJIGFyZzAsIFN0cmluZyBhcmcxLCBNYXAgYXJnMikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlwdWJsaWMgQ2FjaGVSZXF1ZXN0IHB1dChVUkkgYXJnMCwgVVJMQ29ubmVjdGlvbiBhcmcxKQotCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIENhY2hlUmVxdWVzdCBwdXQoVVJJIGFyZzAsIFVSTENvbm5lY3Rpb24gYXJnMSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIE1vY2tTZWN1cml0eU1hYW5nZXIuIEl0IGRlbmllcyBOZXRQZXJtaXNzaW9uKCJnZXRSZXNwb25zZUNhY2hlIikgYW5kCi0JICogTmV0UGVybWlzc2lvbigic2V0UmVzcG9uc2VDYWNoZSIpLgotCSAqLwotCWNsYXNzIE1vY2tTTSBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7Ci0JCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKLQkJCWlmIChwZXJtaXNzaW9uIGluc3RhbmNlb2YgTmV0UGVybWlzc2lvbikgewotCQkJCWlmICgic2V0UmVzcG9uc2VDYWNoZSIuZXF1YWxzKHBlcm1pc3Npb24uZ2V0TmFtZSgpKSkgewotCQkJCQl0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9CisgICAgLyoKKyAgICAgKiBNb2NrU2VjdXJpdHlNYWFuZ2VyLiBJdCBkZW5pZXMgTmV0UGVybWlzc2lvbigiZ2V0UmVzcG9uc2VDYWNoZSIpIGFuZAorICAgICAqIE5ldFBlcm1pc3Npb24oInNldFJlc3BvbnNlQ2FjaGUiKS4KKyAgICAgKi8KKyAgICBjbGFzcyBNb2NrU00gZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CisgICAgICAgICAgICBpZiAocGVybWlzc2lvbiBpbnN0YW5jZW9mIE5ldFBlcm1pc3Npb24pIHsKKyAgICAgICAgICAgICAgICBpZiAoInNldFJlc3BvbnNlQ2FjaGUiLmVxdWFscyhwZXJtaXNzaW9uLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlpZiAocGVybWlzc2lvbiBpbnN0YW5jZW9mIE5ldFBlcm1pc3Npb24pIHsKLQkJCQlpZiAoImdldFJlc3BvbnNlQ2FjaGUiLmVxdWFscyhwZXJtaXNzaW9uLmdldE5hbWUoKSkpIHsKLQkJCQkJdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBOZXRQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKCJnZXRSZXNwb25zZUNhY2hlIi5lcXVhbHMocGVybWlzc2lvbi5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJaWYgKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBSdW50aW1lUGVybWlzc2lvbikgewotCQkJCWlmICgic2V0U2VjdXJpdHlNYW5hZ2VyIi5lcXVhbHMocGVybWlzc2lvbi5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAocGVybWlzc2lvbiBpbnN0YW5jZW9mIFJ1bnRpbWVQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKCJzZXRTZWN1cml0eU1hbmFnZXIiLmVxdWFscyhwZXJtaXNzaW9uLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU2VydmVyU29ja2V0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9TZXJ2ZXJTb2NrZXRUZXN0LmphdmEKaW5kZXggM2FmNGM2My4uNDg2NzEwNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9TZXJ2ZXJTb2NrZXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9TZXJ2ZXJTb2NrZXRUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CkBAIC0zNyw2ICs0Miw3IEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0V4ZWM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU2VydmVyU29ja2V0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTZXJ2ZXJTb2NrZXRUZXN0IGV4dGVuZHMgU29ja2V0VGVzdENhc2UgewogCiAgICAgYm9vbGVhbiBpbnRlcnJ1cHRlZDsKQEAgLTgyLDYgKzg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlNlcnZlclNvY2tldCNTZXJ2ZXJTb2NrZXQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRHVtbXkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlcnZlclNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQoaW50KQogICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIGR1cmluZyB0ZXN0cyIsIHRydWUpOwpAQCAtOTAsNiArMTA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlNlcnZlclNvY2tldCNTZXJ2ZXJTb2NrZXQoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRHVtbXkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlcnZlclNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuU2VydmVyU29ja2V0KGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVXNlZCBkdXJpbmcgdGVzdHMiLCB0cnVlKTsKQEAgLTk4LDYgKzEyMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjU2VydmVyU29ja2V0KGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZXJ2ZXJTb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySV9Tb2Nrc1NldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEhhcm1vbnktNjIzIHJlZ3Jlc3Npb24gdGVzdAogICAgICAgICBTZXJ2ZXJTb2NrZXQgc3MgPSBudWxsOwpAQCAtMTE3LDYgKzE1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjU2VydmVyU29ja2V0KGludCwgaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBsb2dpYyBzaG91bGQgYmUgaW1wcm92ZWQuIE5vdyBpdCBpcyBzdWNjZWVkIGluIGNhc2Ugb2YgZXhjZXB0aW9uIGFuZCBwYXJ0IG9mIGl0IG5vdCB1c2VkIGluIHRoaXMgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZXJ2ZXJTb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzID0gbmV3IFNlcnZlclNvY2tldCgwLCAxMCk7CkBAIC0xNTAsNiArMTkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlNlcnZlclNvY2tldCNTZXJ2ZXJTb2NrZXQoaW50LCBpbnQsIGphdmEubmV0LkluZXRBZGRyZXNzKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VydmVyU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBqYXZhLm5ldC5JbmV0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJTGphdmFfbmV0X0luZXRBZGRyZXNzKCkKICAgICAgICAgICAgIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNlcnZlclNvY2tldCgwLCAxMCwgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOwpAQCAtMTY3LDYgKzIxOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjYWNjZXB0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdGVkLiBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGNoZWNrZWQgb25seS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY2NlcHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FjY2VwdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHMgPSBuZXcgU2VydmVyU29ja2V0KDApOwogICAgICAgICB0cnkgewpAQCAtMjQxLDYgKzMwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjY2xvc2UoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzID0gbmV3IFNlcnZlclNvY2tldCgwKTsKQEAgLTI1OSw2ICszMjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I2dldEluZXRBZGRyZXNzKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbmV0QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5ldEFkZHJlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CiAgICAgICAgIHMgPSBuZXcgU2VydmVyU29ja2V0KDAsIDEwLCBhZGRyKTsKQEAgLTI3Myw2ICszNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I2dldExvY2FsUG9ydCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9jYWxQb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbFBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBUcnkgYSBzcGVjaWZpYyBwb3J0IG51bWJlciwgYnV0IGRvbid0IGNvbXBsYWluIGlmIHdlIGRvbid0IGdldCBpdAogICAgICAgICBpbnQgcG9ydE51bWJlciA9IDYzMDI0OyAvLyBJIG1hZGUgdGhpcyB1cApAQCAtMjkzLDYgKzM4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjZ2V0U29UaW1lb3V0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTb1RpbWVvdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNvVGltZW91dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHMgPSBuZXcgU2VydmVyU29ja2V0KDApOwogICAgICAgICB0cnkgewpAQCAtMzA2LDYgKzQwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjc2V0U29ja2V0RmFjdG9yeShqYXZhLm5ldC5Tb2NrZXRJbXBsRmFjdG9yeSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U29ja2V0RmFjdG9yeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRJbXBsRmFjdG9yeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTb2NrZXRGYWN0b3J5TGphdmFfbmV0X1NvY2tldEltcGxGYWN0b3J5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQuc2V0U29ja2V0RmFjdG9yeShqYXZhLm5ldC5Tb2NrZXRJbXBsRmFjdG9yeSkKQEAgLTMxNiw2ICs0MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I3NldFNvVGltZW91dChpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U29UaW1lb3V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTb1RpbWVvdXRJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGltZW91dCBzaG91bGQgdHJpZ2dlciBhbmQgdGhyb3cgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbgogICAgICAgICB0cnkgewpAQCAtMzQzLDYgKzQ1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjdG9TdHJpbmcoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNlcnZlclNvY2tldCgwKTsKICAgICAgICAgdHJ5IHsKQEAgLTM1Nyw2ICs0ODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I2JpbmQoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluZExqYXZhX25ldF9Tb2NrZXRBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3MgbXlTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAgICAgICAgICAgICBwdWJsaWMgbXlTb2NrZXRBZGRyZXNzKCkgewpAQCAtNDM5LDYgKzU3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjYmluZChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5kTGphdmFfbmV0X1NvY2tldEFkZHJlc3NJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3MgbXlTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAKQEAgLTU1MSw2ICs2OTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I2dldExvY2FsU29ja2V0QWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9jYWxTb2NrZXRBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSB7CiAgICAgICAgIC8vIHNldCB1cCBzZXJ2ZXIgY29ubmVjdCBhbmQgdGhlbiB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgcmlnaHQKICAgICAgICAgLy8gcmVzcG9uc2UgZm9yIHRoZSBsb2NhbCBhZGRyZXNzCkBAIC01OTEsNiArNzQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlNlcnZlclNvY2tldCNpc0JvdW5kKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0JvdW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0JvdW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwogICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwpAQCAtNjIzLDYgKzc4MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjaXNDbG9zZWQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQ2xvc2VkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0Nsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKICAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCwgNSwgYWRkcik7CkBAIC02NjAsNiArODI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlNlcnZlclNvY2tldCNzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmV1c2VBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmV1c2VBZGRyZXNzWigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIHNldCB1cCBzZXJ2ZXIgYW5kIGNvbm5lY3QKQEAgLTc1OCw2ICs5MzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I2dldFJldXNlQWRkcmVzcygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJldXNlQWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmV1c2VBZGRyZXNzKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU2VydmVyU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKQEAgLTc3Niw2ICs5NjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I3NldFJlY2VpdmVCdWZmZXJTaXplKGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmVjZWl2ZUJ1ZmZlclNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlY2VpdmVCdWZmZXJTaXplSSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSBjYXNlIHdoZXJlIHdlIHRyeSB0byBzZXQgdG8gMApAQCAtODExLDYgKzEwMDYsMTUgQEAKICAgICAvKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQjZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZWNlaXZlQnVmZmVyU2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTZXJ2ZXJTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwpAQCAtODMxLDYgKzEwMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuU2VydmVyU29ja2V0I2dldENoYW5uZWwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYW5uZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENoYW5uZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0TnVsbChuZXcgU2VydmVyU29ja2V0KCkuZ2V0Q2hhbm5lbCgpKTsKICAgICB9CkBAIC04MzgsNiArMTA1MSwxNSBAQAogICAgIC8qCiAgICAgICogQHRlc3RzIGphdmEubmV0LlNlcnZlclNvY2tldCNzZXRQZXJmb3JtYW5jZVByZWZlcmVuY2UoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFBlcmZvcm1hbmNlUHJlZmVyZW5jZV9JbnRfSW50X0ludCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJ2ZXJTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwogICAgICAgICB0aGVTb2NrZXQuc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlcygxLCAxLCAxKTsKQEAgLTg4NCw2ICsxMTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlNlcnZlclNvY2tldCNpbXBsQWNjZXB0CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbEFjY2VwdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW1wbEFjY2VwdExqYXZhX25ldF9Tb2NrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTEyMzUKICAgICAgICAgdHJ5IHsKQEAgLTg5OCw3ICsxMTI5LDcgQEAKICAgICAgKiBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTMyNjUKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VydmVyU29ja2V0X2luaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9TZXJ2ZXJTb2NrZXRfaW5pdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tdeyJ0ZXN0cy5hcGkuamF2YS5uZXQuVGVzdFNlcnZlclNvY2tldEluaXQifTsKICAgICAgICAgU3VwcG9ydF9FeGVjLmV4ZWNKYXZhKGFyZ3MsIG51bGwsIHRydWUpOwogICAgIH0KQEAgLTk3Nyw2ICsxMjA4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9jYWxQb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Mb2NhbFBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTZXJ2ZXJTb2NrZXQgc3MxID0gbmV3IFNlcnZlclNvY2tldCg0MjQyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHNzMS5nZXRMb2NhbFBvcnQoKSwgNDI0Mik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1NvY2tldEV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IGQ5MzBiNTcuLjJlNTlkNjUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw0OSArMTcsNzMgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFNvY2tldEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU29ja2V0RXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uI1NvY2tldEV4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkJdHJ5IHsKLQkJCXRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgU29ja2V0RXhjZXB0aW9uIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBleGNlcHRpb24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiNTb2NrZXRFeGNlcHRpb24oKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIFNvY2tldEV4Y2VwdGlvbiB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiNTb2NrZXRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCXRyeSB7Ci0JCQl0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJTb21lIGVycm9yIG1lc3NhZ2UiKTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgU29ja2V0RXhjZXB0aW9uIHRlc3QiICsgZS50b1N0cmluZygpKTsKLQkJfQotCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgZXhjZXB0aW9uIik7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24jU29ja2V0RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oIlNvbWUgZXJyb3IgbWVzc2FnZSIpOworICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGR1cmluZyBTb2NrZXRFeGNlcHRpb24gdGVzdCIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBleHBlY3RlZCBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0SW1wbFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0SW1wbFRlc3QuamF2YQppbmRleCBhZmU5ODBlNC4uYWI0ZjU3YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Tb2NrZXRJbXBsVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0SW1wbFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0yNiwyNiArMzEsNTQgQEAKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0SW1wbDsKIAorQFRlc3RUYXJnZXRDbGFzcyhTb2NrZXRJbXBsLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTb2NrZXRJbXBsVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkKKyAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0SW1wbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JfZmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTExMTcKICAgICAgICAgTW9ja1NvY2tldEltcGwgbW9ja1NvY2tldEltcGwgPSBuZXcgTW9ja1NvY2tldEltcGwoKTsKICAgICAgICAgYXNzZXJ0TnVsbChtb2NrU29ja2V0SW1wbC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKICAgICB9CiAgICAgCi0JLyoKLQkqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXRJbXBsI3NldFBlcmZvcm1hbmNlUHJlZmVyZW5jZSgpCi0JKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldFBlcmZvcm1hbmNlUHJlZmVyZW5jZV9JbnRfSW50X0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlNb2NrU29ja2V0SW1wbCB0aGVTb2NrZXQgPSBuZXcgTW9ja1NvY2tldEltcGwoKTsKLQkJdGhlU29ja2V0LnNldFBlcmZvcm1hbmNlUHJlZmVyZW5jZSgxLDEsMSk7Ci0JfQorICAgIC8qCisgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0SW1wbCNzZXRQZXJmb3JtYW5jZVByZWZlcmVuY2UoKQorICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlX0ludF9JbnRfSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1vY2tTb2NrZXRJbXBsIHRoZVNvY2tldCA9IG5ldyBNb2NrU29ja2V0SW1wbCgpOworICAgICAgICB0aGVTb2NrZXQuc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlKDEsMSwxKTsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXRJbXBsI3NodXRkb3duT3V0cHV0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNrZWQgb25seS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaHV0ZG93bk91dHB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2h1dGRvd25PdXRwdXQoKSB7CiAgICAgICAgIE1vY2tTb2NrZXRJbXBsIHMgPSBuZXcgTW9ja1NvY2tldEltcGwoKTsKICAgICAgICAgdHJ5IHsKQEAgLTU2LDYwICs4OSw2MCBAQAogICAgICAgICB9CiAgICAgfQogCi0JLy8gdGhlIG1vY2sgY2xhc3MgZm9yIHRlc3QsIGxlYXZlIGFsbCBtZXRob2QgZW1wdHkKLQljbGFzcyBNb2NrU29ja2V0SW1wbCBleHRlbmRzIFNvY2tldEltcGx7Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQoU29ja2V0SW1wbCBuZXdTb2NrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCX0KKyAgICAvLyB0aGUgbW9jayBjbGFzcyBmb3IgdGVzdCwgbGVhdmUgYWxsIG1ldGhvZCBlbXB0eQorICAgIGNsYXNzIE1vY2tTb2NrZXRJbXBsIGV4dGVuZHMgU29ja2V0SW1wbHsKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdChTb2NrZXRJbXBsIG5ld1NvY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXJldHVybiAwOwotCQl9CisgICAgICAgIHByb3RlY3RlZCBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgYmluZChJbmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCB2b2lkIGNvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgY29ubmVjdChJbmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25uZWN0KEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlKGJvb2xlYW4gaXNTdHJlYW1pbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlKGJvb2xlYW4gaXNTdHJlYW1pbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIH0KIAotCQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIE9iamVjdCBnZXRPcHRpb24oaW50IG9wdElEKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0T3B0aW9uKGludCBvcHRJRCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgbGlzdGVuKGludCBiYWNrbG9nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGxpc3RlbihpbnQgYmFja2xvZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHNldE9wdGlvbihpbnQgb3B0SUQsIE9iamVjdCB2YWwpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbihpbnQgb3B0SUQsIE9iamVjdCB2YWwpIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIHJlbW90ZUFkZHIsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbm5lY3QoU29ja2V0QWRkcmVzcyByZW1vdGVBZGRyLCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCB2b2lkIHNlbmRVcmdlbnREYXRhKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlKGludCBjb25uZWN0aW9uVGltZSwKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFVyZ2VudERhdGEoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQZXJmb3JtYW5jZVByZWZlcmVuY2UoaW50IGNvbm5lY3Rpb25UaW1lLAogICAgICAgICAgICAgICAgIGludCBsYXRlbmN5LAogICAgICAgICAgICAgICAgIGludCBiYW5kd2lkdGgpewotCQkJc3VwZXIuc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlcyhjb25uZWN0aW9uVGltZSwgbGF0ZW5jeSwgYmFuZHdpZHRoKTsKLQkJfQorICAgICAgICAgICAgc3VwZXIuc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlcyhjb25uZWN0aW9uVGltZSwgbGF0ZW5jeSwgYmFuZHdpZHRoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlRGVzY3JpcHRvcigpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRGaWxlRGVzY3JpcHRvcigpOwpAQCAtMTE4LDE0ICsxNTEsMTQgQEAKICAgICAgICAgcHVibGljIHZvaWQgc2h1dGRvd25PdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgc3VwZXIuc2h1dGRvd25PdXRwdXQoKTsKICAgICAgICAgfQotCX0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGRvbmVTdWl0ZSgpIHsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgZG9uZVN1aXRlKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0UGVybWlzc2lvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0UGVybWlzc2lvblRlc3QuamF2YQppbmRleCBhZjkxMmRiLi40YmRkOTRmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1NvY2tldFBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Tb2NrZXRQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uOwogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwpAQCAtMjQsNDAgKzI5LDUwIEBACiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfQ29uZmlndXJhdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhTb2NrZXRQZXJtaXNzaW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTb2NrZXRQZXJtaXNzaW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlTdHJpbmcgc3Rhck5hbWUgPSAiKi4iICsgU3VwcG9ydF9Db25maWd1cmF0aW9uLkRvbWFpbkFkZHJlc3M7CisgICAgU3RyaW5nIHN0YXJOYW1lID0gIiouIiArIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5Eb21haW5BZGRyZXNzOwogCi0JU3RyaW5nIHd3d05hbWUgPSBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSG9tZUFkZHJlc3M7CisgICAgU3RyaW5nIHd3d05hbWUgPSBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSG9tZUFkZHJlc3M7CiAKLQlTb2NrZXRQZXJtaXNzaW9uIHN0YXJfUmVzb2x2ZSA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKHN0YXJOYW1lLCAicmVzb2x2ZSIpOworICAgIFNvY2tldFBlcm1pc3Npb24gc3Rhcl9SZXNvbHZlID0gbmV3IFNvY2tldFBlcm1pc3Npb24oc3Rhck5hbWUsICJyZXNvbHZlIik7CiAKLQlTb2NrZXRQZXJtaXNzaW9uIHN0YXJfQWxsID0gbmV3IFNvY2tldFBlcm1pc3Npb24oc3Rhck5hbWUsCi0JCQkibGlzdGVuLGFjY2VwdCxjb25uZWN0Iik7CisgICAgU29ja2V0UGVybWlzc2lvbiBzdGFyX0FsbCA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKHN0YXJOYW1lLAorICAgICAgICAgICAgImxpc3RlbixhY2NlcHQsY29ubmVjdCIpOwogCi0JU29ja2V0UGVybWlzc2lvbiB3d3dfQWxsID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSwKLQkJCSJjb25uZWN0LGxpc3RlbixhY2NlcHQiKTsKKyAgICBTb2NrZXRQZXJtaXNzaW9uIHd3d19BbGwgPSBuZXcgU29ja2V0UGVybWlzc2lvbih3d3dOYW1lLAorICAgICAgICAgICAgImNvbm5lY3QsbGlzdGVuLGFjY2VwdCIpOwogCi0JU29ja2V0UGVybWlzc2lvbiBjb3B5T2ZXd3dfQWxsID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSwKLQkJCSJjb25uZWN0LGxpc3RlbixhY2NlcHQiKTsKKyAgICBTb2NrZXRQZXJtaXNzaW9uIGNvcHlPZld3d19BbGwgPSBuZXcgU29ja2V0UGVybWlzc2lvbih3d3dOYW1lLAorICAgICAgICAgICAgImNvbm5lY3QsbGlzdGVuLGFjY2VwdCIpOwogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24jU29ja2V0UGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAotCQkvLyBqYXZhLmxhbmcuU3RyaW5nKQotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbmFtZSIsIHN0YXJfUmVzb2x2ZS5nZXROYW1lKCkuZXF1YWxzKHN0YXJOYW1lKSk7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFjdGlvbnMiLCAKLQkJCQkicmVzb2x2ZSIsIHN0YXJfUmVzb2x2ZS5nZXRBY3Rpb25zKCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uI1NvY2tldFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTb2NrZXRQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbmFtZSIsIHN0YXJfUmVzb2x2ZS5nZXROYW1lKCkuZXF1YWxzKHN0YXJOYW1lKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFjdGlvbnMiLCAKKyAgICAgICAgICAgICAgICAicmVzb2x2ZSIsIHN0YXJfUmVzb2x2ZS5nZXRBY3Rpb25zKCkpOwogCi0JCVNvY2tldFBlcm1pc3Npb24gc3AxID0gbmV3IFNvY2tldFBlcm1pc3Npb24oIiIsICJjb25uZWN0Iik7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZTEiLCAibG9jYWxob3N0Iiwgc3AxLmdldE5hbWUoKSk7Ci0JCVNvY2tldFBlcm1pc3Npb24gc3AyID0gbmV3IFNvY2tldFBlcm1pc3Npb24oIjo4MCIsICJjb25uZWN0Iik7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZTIiLCAiOjgwIiwgc3AyLmdldE5hbWUoKSk7CisgICAgICAgIFNvY2tldFBlcm1pc3Npb24gc3AxID0gbmV3IFNvY2tldFBlcm1pc3Npb24oIiIsICJjb25uZWN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbmFtZTEiLCAibG9jYWxob3N0Iiwgc3AxLmdldE5hbWUoKSk7CisgICAgICAgIFNvY2tldFBlcm1pc3Npb24gc3AyID0gbmV3IFNvY2tldFBlcm1pc3Npb24oIjo4MCIsICJjb25uZWN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbmFtZTIiLCAiOjgwIiwgc3AyLmdldE5hbWUoKSk7CiAgICAgICAgIAotCQkvLyByZWdyZXNzaW9uIGZvciBIQVJNT05ZLTE0NjIKKyAgICAgICAgLy8gcmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xNDYyCiAgICAgICAgIFNvY2tldFBlcm1pc3Npb24gc3AzID0gbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdDoqIiwgImxpc3RlbiIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUzIiwgImxvY2FsaG9zdDoqIiwgc3AzLmdldE5hbWUoKSk7CiAgICAgICAgIC8vIGZvciBhbGwgcG9ydHMKQEAgLTY1LDI3ICs4MCwzNiBAQAogICAgICAgICAgICAgICAgICJsaXN0ZW4iKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUG9ydCByYW5nZSBlcnJvciIsIHNwMy5pbXBsaWVzKHNwQWxsUG9ydHMpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUG9ydCByYW5nZSBlcnJvciIsIHNwQWxsUG9ydHMuaW1wbGllcyhzcDMpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24jZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KLQkJLy8gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbi5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IG5hbWVzIGJ1dCByZXR1cm5lZCBlcXVhbCIsICFzdGFyX0FsbAotCQkJCS5lcXVhbHMod3d3X0FsbCkpOwotCQlhc3NlcnRUcnVlKCJEaWZmZXJlbnQgYWN0aW9ucyBidXQgcmV0dXJuZWQgZXF1YWwiLCAhc3Rhcl9SZXNvbHZlCi0JCQkJLmVxdWFscyhzdGFyX0FsbCkpOwotCQlhc3NlcnRUcnVlKCJTYW1lIGJ1dCByZXR1cm5lZCB1bmVxdWFsIiwgd3d3X0FsbC5lcXVhbHMoY29weU9mV3d3X0FsbCkpOwotCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCB0cnVlIHdoZW4gY29tcGFyZWQgdG8gYSBTdHJpbmciLCAhd3d3X0FsbAotCQkJCS5lcXVhbHMod3d3X0FsbC50b1N0cmluZygpKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24jZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCisgICAgICAgIC8vIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24uZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICAgIGFzc2VydFRydWUoIkRpZmZlcmVudCBuYW1lcyBidXQgcmV0dXJuZWQgZXF1YWwiLCAhc3Rhcl9BbGwKKyAgICAgICAgICAgICAgICAuZXF1YWxzKHd3d19BbGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IGFjdGlvbnMgYnV0IHJldHVybmVkIGVxdWFsIiwgIXN0YXJfUmVzb2x2ZQorICAgICAgICAgICAgICAgIC5lcXVhbHMoc3Rhcl9BbGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2FtZSBidXQgcmV0dXJuZWQgdW5lcXVhbCIsIHd3d19BbGwuZXF1YWxzKGNvcHlPZld3d19BbGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgdHJ1ZSB3aGVuIGNvbXBhcmVkIHRvIGEgU3RyaW5nIiwgIXd3d19BbGwKKyAgICAgICAgICAgICAgICAuZXF1YWxzKHd3d19BbGwudG9TdHJpbmcoKSkpOwogCi0JCVNvY2tldFBlcm1pc3Npb24gc3AxID0gbmV3IFNvY2tldFBlcm1pc3Npb24oIlRFU1QxLmNvbSIsCi0JCQkJInJlc29sdmUsY29ubmVjdCIpOwotCQlTb2NrZXRQZXJtaXNzaW9uIHNwMiA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJ0ZXN0MS5jb20iLAotCQkJCSJyZXNvbHZlLGNvbm5lY3QiKTsKLQkJYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IGNhc2VzIHNob3VsZCBiZSBlcXVhbCIsIHNwMS5lcXVhbHMoc3AyKSk7CisgICAgICAgIFNvY2tldFBlcm1pc3Npb24gc3AxID0gbmV3IFNvY2tldFBlcm1pc3Npb24oIlRFU1QxLmNvbSIsCisgICAgICAgICAgICAgICAgInJlc29sdmUsY29ubmVjdCIpOworICAgICAgICBTb2NrZXRQZXJtaXNzaW9uIHNwMiA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJ0ZXN0MS5jb20iLAorICAgICAgICAgICAgICAgICJyZXNvbHZlLGNvbm5lY3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IGNhc2VzIHNob3VsZCBiZSBlcXVhbCIsIHNwMS5lcXVhbHMoc3AyKSk7CiAKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xNTI0CiAgICAgICAgIGFzc2VydEZhbHNlKHNwMS5lcXVhbHMobnVsbCkpOwpAQCAtOTQsMTM1ICsxMTgsMTcxIEBACiAgICAgICAgIHNwMSA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJURVNUMS5jb206MzMzIiwgInJlc29sdmUiKTsKICAgICAgICAgc3AyID0gbmV3IFNvY2tldFBlcm1pc3Npb24oInRlc3QxLmNvbTo0NDQiLCAicmVzb2x2ZSIpOwogICAgICAgICBhc3NlcnRUcnVlKCJEaWZmZXJlbnQgY2FzZXMgc2hvdWxkIGJlIGVxdWFsIiwgc3AxLmVxdWFscyhzcDIpKTsKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24jZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdF9zdWJ0ZXN0MCgpIHsKLQkJU29ja2V0UGVybWlzc2lvbiBzcDEgPSBuZXcgU29ja2V0UGVybWlzc2lvbigKLQkJCQlTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSW5ldFRlc3RBZGRyZXNzLCAicmVzb2x2ZSxjb25uZWN0Iik7Ci0JCVNvY2tldFBlcm1pc3Npb24gc3AyID0gbmV3IFNvY2tldFBlcm1pc3Npb24oCi0JCQkJU3VwcG9ydF9Db25maWd1cmF0aW9uLkluZXRUZXN0SVAsICJyZXNvbHZlLGNvbm5lY3QiKTsKLQkJYXNzZXJ0VHJ1ZSgiU2FtZSBJUCBhZGRyZXNzIHNob3VsZCBiZSBlcXVhbCIsIHNwMS5lcXVhbHMoc3AyKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24jZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3Rfc3VidGVzdDAoKSB7CisgICAgICAgIFNvY2tldFBlcm1pc3Npb24gc3AxID0gbmV3IFNvY2tldFBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU3VwcG9ydF9Db25maWd1cmF0aW9uLkluZXRUZXN0QWRkcmVzcywgInJlc29sdmUsY29ubmVjdCIpOworICAgICAgICBTb2NrZXRQZXJtaXNzaW9uIHNwMiA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JbmV0VGVzdElQLCAicmVzb2x2ZSxjb25uZWN0Iik7CisgICAgICAgIGFzc2VydFRydWUoIlNhbWUgSVAgYWRkcmVzcyBzaG91bGQgYmUgZXF1YWwiLCBzcDEuZXF1YWxzKHNwMikpOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uI2dldEFjdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWN0aW9ucygpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKLQkJLy8gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbi5nZXRBY3Rpb25zKCkKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWN0aW9ucyIsIAotCQkJCSJyZXNvbHZlIiwgc3Rhcl9SZXNvbHZlLmdldEFjdGlvbnMoKSk7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFjdGlvbnMvbm90IGluIGNhbm9uaWNhbCBmb3JtIiwgImNvbm5lY3QsbGlzdGVuLGFjY2VwdCxyZXNvbHZlIiwgc3Rhcl9BbGwKLQkJCQkuZ2V0QWN0aW9ucygpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24jZ2V0QWN0aW9ucygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWN0aW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWN0aW9ucygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKKyAgICAgICAgLy8gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbi5nZXRBY3Rpb25zKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWN0aW9ucyIsIAorICAgICAgICAgICAgICAgICJyZXNvbHZlIiwgc3Rhcl9SZXNvbHZlLmdldEFjdGlvbnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFjdGlvbnMvbm90IGluIGNhbm9uaWNhbCBmb3JtIiwgImNvbm5lY3QsbGlzdGVuLGFjY2VwdCxyZXNvbHZlIiwgc3Rhcl9BbGwKKyAgICAgICAgICAgICAgICAuZ2V0QWN0aW9ucygpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2ltcGxpZXNMamF2YV9zZWN1cml0eV9QZXJtaXNzaW9uKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgotCQkvLyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uLmltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCQlhc3NlcnRUcnVlKCJBbGwgc2hvdWxkIGltcGx5IHJlc29sdmUiLCBzdGFyX0FsbC5pbXBsaWVzKHN0YXJfUmVzb2x2ZSkpOwotCQkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9pbXBsaWVzTGphdmFfc2VjdXJpdHlfUGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KKyAgICAgICAgLy8gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbi5pbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxsIHNob3VsZCBpbXBseSByZXNvbHZlIiwgc3Rhcl9BbGwuaW1wbGllcyhzdGFyX1Jlc29sdmUpKTsKKyAgICAgICAgCiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTIwMAogICAgICAgICBhc3NlcnRGYWxzZSgiTnVsbCBzaG91bGQgbm90IGJlIGltcGxpZWQiLCBzdGFyX0FsbC5pbXBsaWVzKChTb2NrZXRQZXJtaXNzaW9uKW51bGwpKTsKICAgICAgICAgCi0JCWFzc2VydFRydWUoIkVxdWFscyBzaG91bGQgaW1wbHkgZWFjaG90aGVyIiwgd3d3X0FsbAotCQkJCS5pbXBsaWVzKGNvcHlPZld3d19BbGwpKTsKLQkJYXNzZXJ0VHJ1ZSgiV2lsZCBzaG91bGQgaW1wbHkgbm9ybWFsIiwgc3Rhcl9BbGwuaW1wbGllcyh3d3dfQWxsKSk7Ci0JCWFzc2VydFRydWUoIk5vcm1hbCBzaG91bGRuJ3QgaW1wbHkgd2lsZGNhcmQiLCAhd3d3X0FsbAotCQkJCS5pbXBsaWVzKHN0YXJfUmVzb2x2ZSkpOwotCQlhc3NlcnRUcnVlKCJSZXNvbHZlIHNob3VsZG4ndCBpbXBseSBhbGwiLCAhc3Rhcl9SZXNvbHZlCi0JCQkJLmltcGxpZXMoc3Rhcl9BbGwpKTsKLQkJU29ja2V0UGVybWlzc2lvbiBwMSA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKHd3d05hbWUgKyAiOjgwLTgxIiwKLQkJCQkiY29ubmVjdCIpOwotCQlTb2NrZXRQZXJtaXNzaW9uIHAyID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6ODAiLCAiY29ubmVjdCIpOwotCQlhc3NlcnRUcnVlKCJQb3J0IDgwIGlzIGltcGxpZWQgYnkgODAtODEiLCBwMS5pbXBsaWVzKHAyKSk7Ci0JCXAxID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6NzktODAiLCAiY29ubmVjdCIpOwotCQlhc3NlcnRUcnVlKCJQb3J0IDgwIGlzIGltcGxpZWQgYnkgNzktODAiLCBwMS5pbXBsaWVzKHAyKSk7Ci0JCXAxID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6NzktODEiLCAiY29ubmVjdCIpOwotCQlhc3NlcnRUcnVlKCJQb3J0IDgwIGlzIGltcGxpZWQgYnkgNzktODEiLCBwMS5pbXBsaWVzKHAyKSk7Ci0JCXAyID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6NzktODAiLCAiY29ubmVjdCIpOwotCQlhc3NlcnRUcnVlKCJQb3J0IDc5LTgwIGlzIGltcGxpZWQgYnkgNzktODEiLCBwMS5pbXBsaWVzKHAyKSk7Ci0JCXAyID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSwgInJlc29sdmUiKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiQW55IGlkZW50aWNhbCBob3N0IHNob3VsZCBpbXBseSByZXNvbHZlIHJlZ2FyZGxlc3Mgb2YgdGhlIHBvcnRzIiwKLQkJCQlwMS5pbXBsaWVzKHAyKSk7CisgICAgICAgIGFzc2VydFRydWUoIkVxdWFscyBzaG91bGQgaW1wbHkgZWFjaG90aGVyIiwgd3d3X0FsbAorICAgICAgICAgICAgICAgIC5pbXBsaWVzKGNvcHlPZld3d19BbGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV2lsZCBzaG91bGQgaW1wbHkgbm9ybWFsIiwgc3Rhcl9BbGwuaW1wbGllcyh3d3dfQWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoIk5vcm1hbCBzaG91bGRuJ3QgaW1wbHkgd2lsZGNhcmQiLCAhd3d3X0FsbAorICAgICAgICAgICAgICAgIC5pbXBsaWVzKHN0YXJfUmVzb2x2ZSkpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXNvbHZlIHNob3VsZG4ndCBpbXBseSBhbGwiLCAhc3Rhcl9SZXNvbHZlCisgICAgICAgICAgICAgICAgLmltcGxpZXMoc3Rhcl9BbGwpKTsKKyAgICAgICAgU29ja2V0UGVybWlzc2lvbiBwMSA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKHd3d05hbWUgKyAiOjgwLTgxIiwKKyAgICAgICAgICAgICAgICAiY29ubmVjdCIpOworICAgICAgICBTb2NrZXRQZXJtaXNzaW9uIHAyID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6ODAiLCAiY29ubmVjdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJQb3J0IDgwIGlzIGltcGxpZWQgYnkgODAtODEiLCBwMS5pbXBsaWVzKHAyKSk7CisgICAgICAgIHAxID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6NzktODAiLCAiY29ubmVjdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJQb3J0IDgwIGlzIGltcGxpZWQgYnkgNzktODAiLCBwMS5pbXBsaWVzKHAyKSk7CisgICAgICAgIHAxID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6NzktODEiLCAiY29ubmVjdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJQb3J0IDgwIGlzIGltcGxpZWQgYnkgNzktODEiLCBwMS5pbXBsaWVzKHAyKSk7CisgICAgICAgIHAyID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSArICI6NzktODAiLCAiY29ubmVjdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJQb3J0IDc5LTgwIGlzIGltcGxpZWQgYnkgNzktODEiLCBwMS5pbXBsaWVzKHAyKSk7CisgICAgICAgIHAyID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSwgInJlc29sdmUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiQW55IGlkZW50aWNhbCBob3N0IHNob3VsZCBpbXBseSByZXNvbHZlIHJlZ2FyZGxlc3Mgb2YgdGhlIHBvcnRzIiwKKyAgICAgICAgICAgICAgICBwMS5pbXBsaWVzKHAyKSk7CiAKLQkJU29ja2V0UGVybWlzc2lvbiBzcDEgPSBuZXcgU29ja2V0UGVybWlzc2lvbigid3d3LklibS5jb20iLCAicmVzb2x2ZSIpOwotCQlTb2NrZXRQZXJtaXNzaW9uIHNwMiA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJ3d3cuSUJNLmNvbSIsICJyZXNvbHZlIik7Ci0JCWFzc2VydFRydWUoIlNvY2tldFBlcm1pc3Npb24gaXMgY2FzZSBzZW5zaXRpdmUiLCBzcDEuaW1wbGllcyhzcDIpKTsKKyAgICAgICAgU29ja2V0UGVybWlzc2lvbiBzcDEgPSBuZXcgU29ja2V0UGVybWlzc2lvbigid3d3LklibS5jb20iLCAicmVzb2x2ZSIpOworICAgICAgICBTb2NrZXRQZXJtaXNzaW9uIHNwMiA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJ3d3cuSUJNLmNvbSIsICJyZXNvbHZlIik7CisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldFBlcm1pc3Npb24gaXMgY2FzZSBzZW5zaXRpdmUiLCBzcDEuaW1wbGllcyhzcDIpKTsKIAotCQlTb2NrZXRQZXJtaXNzaW9uIHNwMyA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCIqLmlibS5jb20iLCAicmVzb2x2ZSIpOwotCQlhc3NlcnRUcnVlKCJTb2NrZXRQZXJtaXNzaW9uIHdpbGRjYXJkIGlzIGNhc2Ugc2Vuc2l0aXZlIiwgc3AzCi0JCQkJLmltcGxpZXMoc3AyKSk7CisgICAgICAgIFNvY2tldFBlcm1pc3Npb24gc3AzID0gbmV3IFNvY2tldFBlcm1pc3Npb24oIiouaWJtLmNvbSIsICJyZXNvbHZlIik7CisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldFBlcm1pc3Npb24gd2lsZGNhcmQgaXMgY2FzZSBzZW5zaXRpdmUiLCBzcDMKKyAgICAgICAgICAgICAgICAuaW1wbGllcyhzcDIpKTsKIAotCQlJbmV0QWRkcmVzcyBob3N0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLlVucmVzb2x2ZWRJUCk7Ci0JCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJU29ja2V0UGVybWlzc2lvbiBwZXJtMSA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKAotCQkJCVN1cHBvcnRfQ29uZmlndXJhdGlvbi5VbnJlc29sdmVkSVAsICJjb25uZWN0Iik7Ci0JCVNvY2tldFBlcm1pc3Npb24gcGVybTIgPSBuZXcgU29ja2V0UGVybWlzc2lvbigKLQkJCQlTdXBwb3J0X0NvbmZpZ3VyYXRpb24uVW5yZXNvbHZlZElQICsgIjo4MCIsICJjb25uZWN0Iik7Ci0JCWFzc2VydFRydWUoInNob3VsZCBpbXBseSBwb3J0IDgwIiwgcGVybTEuaW1wbGllcyhwZXJtMikpOwotCQlQZXJtaXNzaW9uQ29sbGVjdGlvbiBjb2wgPSBwZXJtMS5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotCQljb2wuYWRkKHBlcm0xKTsKLQkJYXNzZXJ0VHJ1ZSgiY29sbGVjdGlvbiBzaG91bGQgaW1wbHkgcG9ydCA4MCIsIGNvbC5pbXBsaWVzKHBlcm0yKSk7CisgICAgICAgIEluZXRBZGRyZXNzIGhvc3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaG9zdCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShTdXBwb3J0X0NvbmZpZ3VyYXRpb24uVW5yZXNvbHZlZElQKTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTb2NrZXRQZXJtaXNzaW9uIHBlcm0xID0gbmV3IFNvY2tldFBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU3VwcG9ydF9Db25maWd1cmF0aW9uLlVucmVzb2x2ZWRJUCwgImNvbm5lY3QiKTsKKyAgICAgICAgU29ja2V0UGVybWlzc2lvbiBwZXJtMiA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5VbnJlc29sdmVkSVAgKyAiOjgwIiwgImNvbm5lY3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGltcGx5IHBvcnQgODAiLCBwZXJtMS5pbXBsaWVzKHBlcm0yKSk7CisgICAgICAgIFBlcm1pc3Npb25Db2xsZWN0aW9uIGNvbCA9IHBlcm0xLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7CisgICAgICAgIGNvbC5hZGQocGVybTEpOworICAgICAgICBhc3NlcnRUcnVlKCJjb2xsZWN0aW9uIHNob3VsZCBpbXBseSBwb3J0IDgwIiwgY29sLmltcGxpZXMocGVybTIpKTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiNuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24KLQkJLy8gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbi5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpCi0JCWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gcGMgPSBzdGFyX1Jlc29sdmUKLQkJCQkubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQkJcGMuYWRkKHN0YXJfUmVzb2x2ZSk7Ci0JCXBjLmFkZCh3d3dfQWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGltcGx5IGFsbCBvbiAiICsgd3d3TmFtZSwgcGMuaW1wbGllcyh3d3dfQWxsKSk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBpbXBseSByZXNvbHZlIG9uICIgKyBzdGFyTmFtZSwgcGMKLQkJCQkuaW1wbGllcyhzdGFyX1Jlc29sdmUpKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBpbXBseSBhbGwgb24gIiArIHN0YXJOYW1lLCAhcGMuaW1wbGllcyhzdGFyX0FsbCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uI25ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uCisgICAgICAgIC8vIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24ubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQorICAgICAgICBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uIHBjID0gc3Rhcl9SZXNvbHZlCisgICAgICAgICAgICAgICAgLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7CisgICAgICAgIHBjLmFkZChzdGFyX1Jlc29sdmUpOworICAgICAgICBwYy5hZGQod3d3X0FsbCk7CisgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBpbXBseSBhbGwgb24gIiArIHd3d05hbWUsIHBjLmltcGxpZXMod3d3X0FsbCkpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaW1wbHkgcmVzb2x2ZSBvbiAiICsgc3Rhck5hbWUsIHBjCisgICAgICAgICAgICAgICAgLmltcGxpZXMoc3Rhcl9SZXNvbHZlKSk7CisgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBub3QgaW1wbHkgYWxsIG9uICIgKyBzdGFyTmFtZSwgIXBjLmltcGxpZXMoc3Rhcl9BbGwpKTsKIAotCQkvLyB3aXBlIG91dCBwYwotCQlwYyA9IHN0YXJfUmVzb2x2ZS5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotCQlwYy5hZGQoc3Rhcl9BbGwpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgaW1wbHkgcmVzb2x2ZSBvbiAiICsgc3Rhck5hbWUsIHBjCi0JCQkJLmltcGxpZXMoc3Rhcl9SZXNvbHZlKSk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBpbXBseSBhbGwgb24gIiArIHd3d05hbWUsIHBjLmltcGxpZXMod3d3X0FsbCkpOworICAgICAgICAvLyB3aXBlIG91dCBwYworICAgICAgICBwYyA9IHN0YXJfUmVzb2x2ZS5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOworICAgICAgICBwYy5hZGQoc3Rhcl9BbGwpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaW1wbHkgcmVzb2x2ZSBvbiAiICsgc3Rhck5hbWUsIHBjCisgICAgICAgICAgICAgICAgLmltcGxpZXMoc3Rhcl9SZXNvbHZlKSk7CisgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBpbXBseSBhbGwgb24gIiArIHd3d05hbWUsIHBjLmltcGxpZXMod3d3X0FsbCkpOwogCi0JCXBjID0gc3Rhcl9SZXNvbHZlLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0JCVNvY2tldFBlcm1pc3Npb24gcDEgPSBuZXcgU29ja2V0UGVybWlzc2lvbih3d3dOYW1lICsgIjo3OS04MCIsCi0JCQkJImNvbm5lY3QiKTsKLQkJcGMuYWRkKHAxKTsKLQkJU29ja2V0UGVybWlzc2lvbiBwMiA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKHd3d05hbWUsICJyZXNvbHZlIik7Ci0JCWFzc2VydFRydWUoCi0JCQkJIkFueSBpZGVudGljYWwgaG9zdCBzaG91bGQgaW1wbHkgcmVzb2x2ZSByZWdhcmRsZXNzIG9mIHRoZSBwb3J0cyIsCi0JCQkJcGMuaW1wbGllcyhwMikpOwotCQlhc3NlcnRUcnVlKCJBIGRpZmZlcmVudCBob3N0IHNob3VsZCBub3QgaW1wbHkgcmVzb2x2ZSIsICFwYwotCQkJCS5pbXBsaWVzKHN0YXJfUmVzb2x2ZSkpOwotCX0KKyAgICAgICAgcGMgPSBzdGFyX1Jlc29sdmUubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKKyAgICAgICAgU29ja2V0UGVybWlzc2lvbiBwMSA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKHd3d05hbWUgKyAiOjc5LTgwIiwKKyAgICAgICAgICAgICAgICAiY29ubmVjdCIpOworICAgICAgICBwYy5hZGQocDEpOworICAgICAgICBTb2NrZXRQZXJtaXNzaW9uIHAyID0gbmV3IFNvY2tldFBlcm1pc3Npb24od3d3TmFtZSwgInJlc29sdmUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiQW55IGlkZW50aWNhbCBob3N0IHNob3VsZCBpbXBseSByZXNvbHZlIHJlZ2FyZGxlc3Mgb2YgdGhlIHBvcnRzIiwKKyAgICAgICAgICAgICAgICBwYy5pbXBsaWVzKHAyKSk7CisgICAgICAgIGFzc2VydFRydWUoIkEgZGlmZmVyZW50IGhvc3Qgc2hvdWxkIG5vdCBpbXBseSByZXNvbHZlIiwgIXBjCisgICAgICAgICAgICAgICAgLmltcGxpZXMoc3Rhcl9SZXNvbHZlKSk7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1NvY2tldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0VGVzdC5qYXZhCmluZGV4IGYyMWM1M2MuLjg1ZjkzYTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0VGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOwpAQCAtMzksNjcgKzQ0LDg2IEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1BvcnRNYW5hZ2VyOwogCitAVGVzdFRhcmdldENsYXNzKFNvY2tldC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU29ja2V0VGVzdCBleHRlbmRzIFNvY2tldFRlc3RDYXNlIHsKIAotCVNlcnZlclNvY2tldCBzczsKKyAgICBTZXJ2ZXJTb2NrZXQgc3M7CiAKLQlTb2NrZXQgczsKKyAgICBTb2NrZXQgczsKIAotCVRocmVhZCB0OworICAgIFRocmVhZCB0OwogCi0JYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IGZhbHNlOworICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSBmYWxzZTsKIAotCWNsYXNzIFNTZXJ2ZXIgZXh0ZW5kcyBUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCVNvY2tldCBzMSA9IG51bGw7CisgICAgY2xhc3MgU1NlcnZlciBleHRlbmRzIFRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgU29ja2V0IHMxID0gbnVsbDsKIAotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXNzLnNldFNvVGltZW91dCg1MDAwKTsKLQkJCQlzMSA9IHNzLmFjY2VwdCgpOwotCQkJCXNzLmNsb3NlKCk7Ci0JCQkJVGhyZWFkLnNsZWVwKDQwMDApOwotCQkJfSBjYXRjaCAoamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHgpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKQotCQkJCQkJKyAiLCBhY2NlcHQoKSB0aW1lb3V0IGZpcmVkOiAiICsgeCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGFjY2VwdDogIiArIGUudG9TdHJpbmcoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChzMSAhPSBudWxsKQotCQkJCQkJczEuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3Muc2V0U29UaW1lb3V0KDUwMDApOworICAgICAgICAgICAgICAgIHMxID0gc3MuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgc3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNDAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIGFjY2VwdCgpIHRpbWVvdXQgZmlyZWQ6ICIgKyB4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gYWNjZXB0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMxICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjU29ja2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQkvLyBjcmVhdGUgdGhlIHNvY2tldCBhbmQgdGhlbiB2YWxpZGF0ZSBzb21lIGJhc2ljIHN0YXRlCi0JCXMgPSBuZXcgU29ja2V0KCk7Ci0JCWFzc2VydEZhbHNlKCJuZXcgc29ja2V0IHNob3VsZCBub3QgYmUgY29ubmVjdGVkIiwgcy5pc0Nvbm5lY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoIm5ldyBzb2NrZXQgc2hvdWxkIG5vdCBiZSBib3VuZCIsIHMuaXNCb3VuZCgpKTsKLQkJYXNzZXJ0RmFsc2UoIm5ldyBzb2NrZXQgc2hvdWxkIG5vdCBiZSBjbG9zZWQiLCBzLmlzQ2xvc2VkKCkpOwotCQlhc3NlcnRGYWxzZSgibmV3IHNvY2tldCBzaG91bGQgbm90IGJlIGluIElucHV0U2h1dGRvd24iLCBzCi0JCQkJLmlzSW5wdXRTaHV0ZG93bigpKTsKLQkJYXNzZXJ0RmFsc2UoIm5ldyBzb2NrZXQgc2hvdWxkIG5vdCBiZSBpbiBPdXRwdXRTaHV0ZG93biIsIHMKLQkJCQkuaXNPdXRwdXRTaHV0ZG93bigpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I1NvY2tldCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBzb2NrZXQgYW5kIHRoZW4gdmFsaWRhdGUgc29tZSBiYXNpYyBzdGF0ZQorICAgICAgICBzID0gbmV3IFNvY2tldCgpOworICAgICAgICBhc3NlcnRGYWxzZSgibmV3IHNvY2tldCBzaG91bGQgbm90IGJlIGNvbm5lY3RlZCIsIHMuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJuZXcgc29ja2V0IHNob3VsZCBub3QgYmUgYm91bmQiLCBzLmlzQm91bmQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJuZXcgc29ja2V0IHNob3VsZCBub3QgYmUgY2xvc2VkIiwgcy5pc0Nsb3NlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIm5ldyBzb2NrZXQgc2hvdWxkIG5vdCBiZSBpbiBJbnB1dFNodXRkb3duIiwgcworICAgICAgICAgICAgICAgIC5pc0lucHV0U2h1dGRvd24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJuZXcgc29ja2V0IHNob3VsZCBub3QgYmUgaW4gT3V0cHV0U2h1dGRvd24iLCBzCisgICAgICAgICAgICAgICAgLmlzT3V0cHV0U2h1dGRvd24oKSk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNTb2NrZXQoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0koKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuU29ja2V0KGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIkNvbnMgU3RyaW5nLEkiKTsKLQkJcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSwgc3BvcnQpOwotCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIHNvY2tldCIsIHMuZ2V0UG9ydCgpID09IHNwb3J0KTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I1NvY2tldChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Tb2NrZXQoamF2YS5sYW5nLlN0cmluZywgaW50KQorICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiQ29ucyBTdHJpbmcsSSIpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCk7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iiwgcy5nZXRQb3J0KCkgPT0gc3BvcnQpOwogICAgICAgICAKLQkJLy9yZWdyZXNzaW9uIGZvciBIQVJNT05ZLTk0NgorICAgICAgICAvL3JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktOTQ2CiAgICAgICAgIFNlcnZlclNvY2tldCBzcyA9IG51bGw7CiAgICAgICAgIFNvY2tldCBzID0gbnVsbDsKICAgICAgICAgdHJ5ewpAQCAtMTE3LDEwNTcgKzE0MSwxMzcyIEBACiAgICAgICAgICAgICAgICAgLy9pZ25vcmUKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I1NvY2tldChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsCi0JICogICAgICAgIGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUxqYXZhX25ldF9JbmV0QWRkcmVzc0koKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlNvY2tldChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsCi0JCS8vIGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQpCi0JCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJDb25zIFN0cmluZyxJLEluZXRBZGRyZXNzLEkiKTsKLQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCksIHNwb3J0LAotCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKTsKLQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQiLCBzLmdldFBvcnQoKSA9PSBzcG9ydCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNTb2NrZXQoamF2YS5sYW5nLlN0cmluZywgaW50LAorICAgICAqICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubmV0LkluZXRBZGRyZXNzLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lMamF2YV9uZXRfSW5ldEFkZHJlc3NJKCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Tb2NrZXQoamF2YS5sYW5nLlN0cmluZywgaW50LAorICAgICAgICAvLyBqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQorICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiQ29ucyBTdHJpbmcsSSxJbmV0QWRkcmVzcyxJIik7CisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcik7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iiwgcy5nZXRQb3J0KCkgPT0gc3BvcnQpOwogCi0JCWlmICgoInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjZBZGRyZXNzZXMiKSkpCi0JCQkJJiYgISgidHJ1ZSIuZXF1YWxzKFN5c3RlbQotCQkJCQkJLmdldFByb3BlcnR5KCJqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2siKSkpKSB7CisgICAgICAgIGlmICgoInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjZBZGRyZXNzZXMiKSkpCisgICAgICAgICAgICAgICAgJiYgISgidHJ1ZSIuZXF1YWxzKFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2siKSkpKSB7CiAKLQkJCS8vIEFMVEVSTkFURSBJUHY2IFRFU1QKLQkJCWlmICgidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgicnVuLmlwdjZ0ZXN0cyIpKSkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJSdW5uaW5nIHRlc3RDb25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUxqYXZhX25ldF9JbmV0QWRkcmVzc0koU29ja2V0VGVzdCkgd2l0aCBJUHY2R2xvYmFsQWRkcmVzc0pjbDQ6ICIKLQkJCQkJCQkJKyBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSVB2Nkdsb2JhbEFkZHJlc3NKY2w0KTsKLQkJCQlpbnQgdGVzdFBvcnQgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCQkJU29ja2V0IHMxID0gbnVsbCwgczIgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXMxID0gbmV3IFNvY2tldCgKLQkJCQkJCQlTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSVB2Nkdsb2JhbEFkZHJlc3NKY2w0LCA4MCwKLQkJCQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgdGVzdFBvcnQpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY2hlY2sgaGVyZSBpZiBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSBpcyByZXR1cm5pbmcgdGhlCi0JCQkJCS8vIGxvb3BiYWNrIGFkZHJlc3MuCi0JCQkJCS8vIGlmIHNvIHRoYXQgaXMgbGlrZWx5IHRoZSBjYXVzZSBvZiB0aGUgZmFpbHVyZQotCQkJCQlTdHJpbmcgd2FybmluZyA9ICIiOwotCQkJCQl0cnkgewotCQkJCQkJSW5ldEFkZHJlc3MgcmV0dXJuZWRMb2NhbEhvc3QgPSBJbmV0QWRkcmVzcwotCQkJCQkJCQkuZ2V0TG9jYWxIb3N0KCk7Ci0JCQkJCQkvLyBkb24ndCB1c2UgaXNMb29wYmFja0FkZHJlc3MgZm9yIHNvbWUgY29uZmlndXJhdGlvbnMKLQkJCQkJCS8vIGFzIHRoZXkgZG8gbm90IGhhdmUgaXQKLQkJCQkJCWlmIChyZXR1cm5lZExvY2FsSG9zdC5pc0xvb3BiYWNrQWRkcmVzcygpKSB7Ci0JCQkJCQkJd2FybmluZyA9ICIgLSBXQVJOSU5HIFJFVFVSTkVEIExPQ0FMIEhPU1QgSVMgVEhFIExPT1BCQUNLIEFERFJFU1MgLSBNQUNISU5FIElTIExJS0VMWSBOT1QgQ09ORklHVVJFRCBDT1JSRUNUTFkgLSBUSElTIExJS0VMWSBDQVVTRUQgVEhFIEZBSUxVUkUiOworICAgICAgICAgICAgLy8gQUxURVJOQVRFIElQdjYgVEVTVAorICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJydW4uaXB2NnRlc3RzIikpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dAorICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIlJ1bm5pbmcgdGVzdENvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdJTGphdmFfbmV0X0luZXRBZGRyZXNzSShTb2NrZXRUZXN0KSB3aXRoIElQdjZHbG9iYWxBZGRyZXNzSmNsNDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQpOworICAgICAgICAgICAgICAgIGludCB0ZXN0UG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgICAgICAgICBTb2NrZXQgczEgPSBudWxsLCBzMiA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgczEgPSBuZXcgU29ja2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQsIDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCB0ZXN0UG9ydCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBoZXJlIGlmIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpIGlzIHJldHVybmluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9vcGJhY2sgYWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgc28gdGhhdCBpcyBsaWtlbHkgdGhlIGNhdXNlIG9mIHRoZSBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3YXJuaW5nID0gIiI7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyByZXR1cm5lZExvY2FsSG9zdCA9IEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSBpc0xvb3BiYWNrQWRkcmVzcyBmb3Igc29tZSBjb25maWd1cmF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgdGhleSBkbyBub3QgaGF2ZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybmVkTG9jYWxIb3N0LmlzTG9vcGJhY2tBZGRyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gIiAtIFdBUk5JTkcgUkVUVVJORUQgTE9DQUwgSE9TVCBJUyBUSEUgTE9PUEJBQ0sgQUREUkVTUyAtIE1BQ0hJTkUgSVMgTElLRUxZIE5PVCBDT05GSUdVUkVEIENPUlJFQ1RMWSAtIFRISVMgTElLRUxZIENBVVNFRCBUSEUgRkFJTFVSRSI7CiAKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQl3YXJuaW5nID0gIiAtIFdBUk5JTkcgQ09VTEQgTk9UIEdFVCBMT0NBTCBIT1NUIC0gIiArIGV4OwotCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9ICIgLSBXQVJOSU5HIENPVUxEIE5PVCBHRVQgTE9DQUwgSE9TVCAtICIgKyBleDsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCWZhaWwoIkV4Y2VwdGlvbiBjcmVhdGluZyAxc3Qgc29ja2V0IiArIHdhcm5pbmcgKyAiOiAiICsgZSk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJczIgPSBuZXcgU29ja2V0KAotCQkJCQkJCVN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQsIDgwLAotCQkJCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCB0ZXN0UG9ydCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlleGNlcHRpb24gPSB0cnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlzMS5jbG9zZSgpOwotCQkJCQlpZiAoIWV4Y2VwdGlvbikKLQkJCQkJCXMyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKCJXYXMgYWJsZSB0byBjcmVhdGUgdHdvIHNvY2tldHMgb24gc2FtZSBwb3J0IiwKLQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQl9CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBjcmVhdGluZyAxc3Qgc29ja2V0IiArIHdhcm5pbmcgKyAiOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgczIgPSBuZXcgU29ja2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5JUHY2R2xvYmFsQWRkcmVzc0pjbDQsIDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCB0ZXN0UG9ydCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHMyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYXMgYWJsZSB0byBjcmVhdGUgdHdvIHNvY2tldHMgb24gc2FtZSBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CiAKLQkJfSBlbHNlIHsKLQkJCWludCB0ZXN0UG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJCVNvY2tldCBzMSA9IG51bGwsIHMyID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0ZXN0UG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgICAgIFNvY2tldCBzMSA9IG51bGwsIHMyID0gbnVsbDsKICAgICAgICAgICAgIGludCBzZXJ2ZXJQb3J0ID0gc3MuZ2V0TG9jYWxQb3J0KCk7Ci0JCQl0cnkgewotCQkJCXMxID0gbmV3IFNvY2tldCgiMTI3LjAuMC4xIiwgc2VydmVyUG9ydCwgSW5ldEFkZHJlc3MKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgczEgPSBuZXcgU29ja2V0KCIxMjcuMC4wLjEiLCBzZXJ2ZXJQb3J0LCBJbmV0QWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLCB0ZXN0UG9ydCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogCi0JCQkJLy8gY2hlY2sgaGVyZSBpZiBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSBpcyByZXR1cm5pbmcgdGhlCi0JCQkJLy8gbG9vcGJhY2sgYWRkcmVzcy4KLQkJCQkvLyBpZiBzbyB0aGF0IGlzIGxpa2VseSB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUKLQkJCQlTdHJpbmcgd2FybmluZyA9ICIiOwotCQkJCXRyeSB7Ci0JCQkJCUluZXRBZGRyZXNzIHJldHVybmVkTG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQkJCS8vIGRvbid0IHVzZSBpc0xvb3BiYWNrQWRkcmVzcyBmb3Igc29tZSBjb25maWd1cmF0aW9ucyBhcwotCQkJCQkvLyB0aGV5IGRvIG5vdCBoYXZlIGl0Ci0JCQkJCWlmIChyZXR1cm5lZExvY2FsSG9zdC5pc0xvb3BiYWNrQWRkcmVzcygpKSB7Ci0JCQkJCQl3YXJuaW5nID0gIiAtIFdBUk5JTkcgUkVUVVJORUQgTE9DQUwgSE9TVCBJUyBUSEUgTE9PUEJBQ0sgQUREUkVTUyAtIE1BQ0hJTkUgSVMgTElLRUxZIE5PVCBDT05GSUdVUkVEIENPUlJFQ1RMWSAtIFRISVMgTElLRUxZIENBVVNFRCBUSEUgRkFJTFVSRSI7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaGVyZSBpZiBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSBpcyByZXR1cm5pbmcgdGhlCisgICAgICAgICAgICAgICAgLy8gbG9vcGJhY2sgYWRkcmVzcy4KKyAgICAgICAgICAgICAgICAvLyBpZiBzbyB0aGF0IGlzIGxpa2VseSB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBTdHJpbmcgd2FybmluZyA9ICIiOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIHJldHVybmVkTG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSBpc0xvb3BiYWNrQWRkcmVzcyBmb3Igc29tZSBjb25maWd1cmF0aW9ucyBhcworICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IGRvIG5vdCBoYXZlIGl0CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZExvY2FsSG9zdC5pc0xvb3BiYWNrQWRkcmVzcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gIiAtIFdBUk5JTkcgUkVUVVJORUQgTE9DQUwgSE9TVCBJUyBUSEUgTE9PUEJBQ0sgQUREUkVTUyAtIE1BQ0hJTkUgSVMgTElLRUxZIE5PVCBDT05GSUdVUkVEIENPUlJFQ1RMWSAtIFRISVMgTElLRUxZIENBVVNFRCBUSEUgRkFJTFVSRSI7CiAKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQl3YXJuaW5nID0gIiAtIFdBUk5JTkcgQ09VTEQgTk9UIEdFVCBMT0NBTCBIT1NUIC0gIiArIGV4OwotCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gIiAtIFdBUk5JTkcgQ09VTEQgTk9UIEdFVCBMT0NBTCBIT1NUIC0gIiArIGV4OworICAgICAgICAgICAgICAgIH0KIAotCQkJCWZhaWwoIkV4Y2VwdGlvbiBjcmVhdGluZyAxc3Qgc29ja2V0IiArIHdhcm5pbmcgKyAiOiAiICsgZSk7Ci0JCQl9Ci0JCQlib29sZWFuIGV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlzMiA9IG5ldyBTb2NrZXQoIjEyNy4wLjAuMSIsIHNlcnZlclBvcnQsIEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGNyZWF0aW5nIDFzdCBzb2NrZXQiICsgd2FybmluZyArICI6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHMyID0gbmV3IFNvY2tldCgiMTI3LjAuMC4xIiwgc2VydmVyUG9ydCwgSW5ldEFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSwgdGVzdFBvcnQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXMxLmNsb3NlKCk7Ci0JCQkJaWYgKCFleGNlcHRpb24pCi0JCQkJCXMyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJXYXMgYWJsZSB0byBjcmVhdGUgdHdvIHNvY2tldHMgb24gc2FtZSBwb3J0IiwgZXhjZXB0aW9uKTsKLQkJfQotCX0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGlmICghZXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICBzMi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FzIGFibGUgdG8gY3JlYXRlIHR3byBzb2NrZXRzIG9uIHNhbWUgcG9ydCIsIGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I1NvY2tldChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSVooKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuU29ja2V0KGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbikKLQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIkNvbnMgU3RyaW5nLEksWiIpOwotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iiwgcy5nZXRQb3J0KCkgPT0gc3BvcnQpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjU29ja2V0KGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0laKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlNvY2tldChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4pCisgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJDb25zIFN0cmluZyxJLFoiKTsKKyAgICAgICAgcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSwgc3BvcnQsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIHNvY2tldCIsIHMuZ2V0UG9ydCgpID09IHNwb3J0KTsKIAotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwgZmFsc2UpOwotCX0KKyAgICAgICAgcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSwgc3BvcnQsIGZhbHNlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I1NvY2tldChqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfSW5ldEFkZHJlc3NJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlNvY2tldChqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQotCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiQ29ucyBJbmV0QWRkcmVzcyxJIik7Ci0JCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCk7Ci0JCWFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iiwgcy5nZXRQb3J0KCkgPT0gc3BvcnQpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I1NvY2tldChqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LkluZXRBZGRyZXNzLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfSW5ldEFkZHJlc3NJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlNvY2tldChqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQorICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiQ29ucyBJbmV0QWRkcmVzcyxJIik7CisgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCk7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iiwgcy5nZXRQb3J0KCkgPT0gc3BvcnQpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjU29ja2V0KGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQsCi0JICogICAgICAgIGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9JbmV0QWRkcmVzc0lMamF2YV9uZXRfSW5ldEFkZHJlc3NJKCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Tb2NrZXQoamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCwKLQkJLy8gamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCkKLQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIkNvbnMgSW5ldEFkZHJlc3MsSSxJbmV0QWRkcmVzcyxJIik7Ci0JCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKLQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcik7Ci0JCWFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iiwgcy5nZXRMb2NhbFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNTb2NrZXQoamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCwKKyAgICAgKiAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5JbmV0QWRkcmVzcy5jbGFzcywgaW50LmNsYXNzLCBqYXZhLm5ldC5JbmV0QWRkcmVzcy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X0luZXRBZGRyZXNzSUxqYXZhX25ldF9JbmV0QWRkcmVzc0koKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlNvY2tldChqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50LAorICAgICAgICAvLyBqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50KQorICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiQ29ucyBJbmV0QWRkcmVzcyxJLEluZXRBZGRyZXNzLEkiKTsKKyAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCksIHNwb3J0LAorICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQiLCBzLmdldExvY2FsUG9ydCgpID09IHBvcnROdW1iZXIpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjU29ja2V0KGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9JbmV0QWRkcmVzc0laKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlNvY2tldChqYXZhLm5ldC5JbmV0QWRkcmVzcywgaW50LCBib29sZWFuKQotCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiQ29ucyBJbmV0QWRkcmVzcyxJLFoiKTsKLQkJcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQiLCBzLmdldFBvcnQoKSA9PSBzcG9ydCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNTb2NrZXQoamF2YS5uZXQuSW5ldEFkZHJlc3MsIGludCwgYm9vbGVhbikKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5JbmV0QWRkcmVzcy5jbGFzcywgaW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmV0X0luZXRBZGRyZXNzSVooKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuU29ja2V0KGphdmEubmV0LkluZXRBZGRyZXNzLCBpbnQsIGJvb2xlYW4pCisgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJDb25zIEluZXRBZGRyZXNzLEksWiIpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIHNvY2tldCIsIHMuZ2V0UG9ydCgpID09IHNwb3J0KTsKIAotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIGZhbHNlKTsKKyAgICAgICAgcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0LCBmYWxzZSk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LlNvY2tldC5jbG9zZSgpCi0JCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGNsb3NlIik7Ci0JCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOwotCQl0cnkgewotCQkJcy5zZXRTb0xpbmdlcihmYWxzZSwgMTAwKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX0xJTkdFUik7Ci0JCX0KLQkJdHJ5IHsKLQkJCXMuY2xvc2UoKTsKLQkJCXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyAvLyBDYXVnaHQgRXhjZXB0aW9uIGFmdGVyIGNsb3NlLgotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7IC8vIENhdWdodCBFeGNlcHRpb24gYWZ0ZXIgY2xvc2UuCi0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiRmFpbGVkIHRvIGNsb3NlIHNvY2tldCIpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjY2xvc2UoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQsIG5vbiBvYnZpb3VzIGZ1bmN0aW9uYWxpdHkgY2hlY2tpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5uZXQuU29ja2V0LmNsb3NlKCkKKyAgICAgICAgaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgY2xvc2UiKTsKKyAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLnNldFNvTGluZ2VyKGZhbHNlLCAxMDApOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fTElOR0VSKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICAgICAgcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IC8vIENhdWdodCBFeGNlcHRpb24gYWZ0ZXIgY2xvc2UuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsgLy8gQ2F1Z2h0IEV4Y2VwdGlvbiBhZnRlciBjbG9zZS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJGYWlsZWQgdG8gY2xvc2Ugc29ja2V0Iik7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRJbmV0QWRkcmVzcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRJbmV0QWRkcmVzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5JbmV0QWRkcmVzcyBqYXZhLm5ldC5Tb2NrZXQuZ2V0SW5ldEFkZHJlc3MoKQotCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRJbmV0QWRkcmVzcyIpOwotCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0LCBudWxsLCBwb3J0TnVtYmVyKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRBZHJlZXMiLCBzLmdldEluZXRBZGRyZXNzKCkuZXF1YWxzKAotCQkJCUluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRJbmV0QWRkcmVzcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5ldEFkZHJlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluZXRBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkluZXRBZGRyZXNzIGphdmEubmV0LlNvY2tldC5nZXRJbmV0QWRkcmVzcygpCisgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldEluZXRBZGRyZXNzIik7CisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldEFkcmVlcyIsIHMuZ2V0SW5ldEFkZHJlc3MoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpKTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldElucHV0U3RyZWFtKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uSW5wdXRTdHJlYW0gamF2YS5uZXQuU29ja2V0LmdldElucHV0U3RyZWFtKCkKLQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0SW5wdXRTdHJlYW0iKTsKLQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7Ci0JCSh0ID0gbmV3IFNTZXJ2ZXIoKSkuc3RhcnQoKTsKLQkJamF2YS5pby5JbnB1dFN0cmVhbSBpcyA9IHMuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGdldCBzdHJlYW0iLCBpcyk7Ci0JCXMuc2V0U29UaW1lb3V0KDYwMDApOwotCQlpcy5yZWFkKCk7Ci0JCXMuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGFmdGVyIGNsb3NlIiwgLTEsIGlzLnJlYWQoKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRJbnB1dFN0cmVhbSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuaW8uSW5wdXRTdHJlYW0gamF2YS5uZXQuU29ja2V0LmdldElucHV0U3RyZWFtKCkKKyAgICAgICAgaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0SW5wdXRTdHJlYW0iKTsKKyAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7CisgICAgICAgICh0ID0gbmV3IFNTZXJ2ZXIoKSkuc3RhcnQoKTsKKyAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpcyA9IHMuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGdldCBzdHJlYW0iLCBpcyk7CisgICAgICAgIHMuc2V0U29UaW1lb3V0KDYwMDApOworICAgICAgICBpcy5yZWFkKCk7CisgICAgICAgIHMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGFmdGVyIGNsb3NlIiwgLTEsIGlzLnJlYWQoKSk7CiAKLQkJaW50ZXJydXB0ZWQgPSBmYWxzZTsKLQkJaW50IHBvcnROdW0gPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCWZpbmFsIFNlcnZlclNvY2tldCBzcyA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydE51bSk7Ci0JCVNvY2tldCBzb2NrID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bSk7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVNvY2tldCBhcyA9IHNzLmFjY2VwdCgpOwotCQkJCQlzcy5jbG9zZSgpOwotCQkJCQlhcy5zZXRTb1RpbWVvdXQoMTIwMDApOwotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IGFzLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCWluLnJlYWQoKTsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJaW50ZXJydXB0ZWQgPSB0cnVlOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlLCAiU29ja2V0LmdldElucHV0U3RyZWFtIik7Ci0JCXRocmVhZC5zdGFydCgpOwotCQl0cnkgewotCQkJZG8gewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSB3aGlsZSAoIXRocmVhZC5pc0FsaXZlKCkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJc29jay5jbG9zZSgpOwotCQlpbnQgYyA9IDA7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlpZiAoaW50ZXJydXB0ZWQpIHsKLQkJCQlmYWlsKCJyZWFkIGludGVycnVwdGVkIik7Ci0JCQl9Ci0JCQlpZiAoKytjID4gNCkgewotCQkJCWZhaWwoInJlYWQgY2FsbCBkaWQgbm90IGV4aXQiKTsKLQkJCX0KLQkJfSB3aGlsZSAodGhyZWFkLmlzQWxpdmUoKSk7CisgICAgICAgIGludGVycnVwdGVkID0gZmFsc2U7CisgICAgICAgIGludCBwb3J0TnVtID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgc3MgPSBuZXcgU2VydmVyU29ja2V0KHBvcnROdW0pOworICAgICAgICBTb2NrZXQgc29jayA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW0pOworICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTb2NrZXQgYXMgPSBzcy5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYXMuc2V0U29UaW1lb3V0KDEyMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBhcy5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBpbi5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChydW5uYWJsZSwgIlNvY2tldC5nZXRJbnB1dFN0cmVhbSIpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCF0aHJlYWQuaXNBbGl2ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHNvY2suY2xvc2UoKTsKKyAgICAgICAgaW50IGMgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludGVycnVwdGVkKSB7CisgICAgICAgICAgICAgICAgZmFpbCgicmVhZCBpbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCsrYyA+IDQpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJyZWFkIGNhbGwgZGlkIG5vdCBleGl0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHRocmVhZC5pc0FsaXZlKCkpOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0S2VlcEFsaXZlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEtlZXBBbGl2ZSgpIHsKLQkJdHJ5IHsKLQkJCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldEtlZXBBbGl2ZSIpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCQlTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsCi0JCQkJCW51bGwsIHBvcnROdW1iZXIpOwotCQkJdGhlU29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlKTsKLQkJCWFzc2VydFRydWUoImdldEtlZXBBbGl2ZSBmYWxzZSB3aGVuIGl0IHNob3VsZCBiZSB0cnVlIiwgdGhlU29ja2V0Ci0JCQkJCS5nZXRLZWVwQWxpdmUoKSk7Ci0JCQl0aGVTb2NrZXQuc2V0S2VlcEFsaXZlKGZhbHNlKTsKLQkJCWFzc2VydEZhbHNlKCJnZXRLZWVwQWxpdmUgdHJ1ZSB3aGVuIGl0IHNob3VsZCBiZSBGYWxzZSIsIHRoZVNvY2tldAotCQkJCQkuZ2V0S2VlcEFsaXZlKCkpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19LRUVQQUxJVkUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX0tFRVBBTElWRSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRLZWVwQWxpdmUoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRLZWVwQWxpdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEtlZXBBbGl2ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldEtlZXBBbGl2ZSIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgdGhlU29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldEtlZXBBbGl2ZSBmYWxzZSB3aGVuIGl0IHNob3VsZCBiZSB0cnVlIiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgICAgIC5nZXRLZWVwQWxpdmUoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuc2V0S2VlcEFsaXZlKGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJnZXRLZWVwQWxpdmUgdHJ1ZSB3aGVuIGl0IHNob3VsZCBiZSBGYWxzZSIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgICAgICAuZ2V0S2VlcEFsaXZlKCkpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19LRUVQQUxJVkUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX0tFRVBBTElWRSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldExvY2FsQWRkcmVzcygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbEFkZHJlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuSW5ldEFkZHJlc3MKLQkJLy8gamF2YS5uZXQuU29ja2V0LmdldExvY2FsQWRkcmVzcygpCi0JCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldExvY0FkZHJlc3MiKTsKLQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7Ci0JCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJbmV0QWRkcmVzcyIsIHMuZ2V0TG9jYWxBZGRyZXNzKCkKLQkJCQkuZXF1YWxzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKSk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbEFkZHJlc3MoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsQWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LkluZXRBZGRyZXNzCisgICAgICAgIC8vIGphdmEubmV0LlNvY2tldC5nZXRMb2NhbEFkZHJlc3MoKQorICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRMb2NBZGRyZXNzIik7CisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldEFkZHJlc3MiLCBzLmdldExvY2FsQWRkcmVzcygpCisgICAgICAgICAgICAgICAgLmVxdWFscyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSkpOwogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGV0IGJlaGF2aW91ciB3aGVuIHRoZSBhbnkgYWRkcmVzcyBpcyByZXR1cm5lZAotCQlTdHJpbmcgcHJlZmVySVB2NFN0YWNrVmFsdWUgPSBTeXN0ZW0KLQkJCQkuZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjRTdGFjayIpOwotCQlTdHJpbmcgcHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlID0gU3lzdGVtCi0JCQkJLmdldFByb3BlcnR5KCJqYXZhLm5ldC5wcmVmZXJJUHY2QWRkcmVzc2VzIik7CisgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGV0IGJlaGF2aW91ciB3aGVuIHRoZSBhbnkgYWRkcmVzcyBpcyByZXR1cm5lZAorICAgICAgICBTdHJpbmcgcHJlZmVySVB2NFN0YWNrVmFsdWUgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjRTdGFjayIpOworICAgICAgICBTdHJpbmcgcHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJqYXZhLm5ldC5wcmVmZXJJUHY2QWRkcmVzc2VzIik7CiAKLQkJcyA9IG5ldyBTb2NrZXQoKTsKLQkJcy5iaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjAuMC4wLjAiKSwgMCkpOworICAgICAgICBzID0gbmV3IFNvY2tldCgpOworICAgICAgICBzLmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMC4wLjAuMCIpLCAwKSk7CiAKLQkJaWYgKCgocHJlZmVySVB2NFN0YWNrVmFsdWUgPT0gbnVsbCkgfHwgcHJlZmVySVB2NFN0YWNrVmFsdWUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKLQkJCQkmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlICE9IG51bGwpCi0JCQkJJiYgKHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZS5lcXVhbHMoInRydWUiKSkpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IChnZXRMb2NhbEFkZHJlc3MpIHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9ZmFsc2UgIgotCQkJCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKLQkJCQkJcy5nZXRMb2NhbEFkZHJlc3MoKSBpbnN0YW5jZW9mIEluZXQ2QWRkcmVzcyk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkiQU5ZIGFkZHJlc3Mgbm90IHJldHVybmVkIGNvcnJlY3RseSAoZ2V0TG9jYWxBZGRyZXNzKSB3aXRoIHByZWZlcklQdjZBZGRyZXNzZXM9dHJ1ZSwgcHJlZmVySVB2NFN0YWNrPXRydWUgIgotCQkJCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKLQkJCQkJcy5nZXRMb2NhbEFkZHJlc3MoKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcyk7Ci0JCX0KLQkJcy5jbG9zZSgpOworICAgICAgICBpZiAoKChwcmVmZXJJUHY0U3RhY2tWYWx1ZSA9PSBudWxsKSB8fCBwcmVmZXJJUHY0U3RhY2tWYWx1ZQorICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKQorICAgICAgICAgICAgICAgICYmIChwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlLmVxdWFscygidHJ1ZSIpKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIkFOWSBhZGRyZXNzIG5vdCByZXR1cm5lZCBjb3JyZWN0bHkgKGdldExvY2FsQWRkcmVzcykgd2l0aCBwcmVmZXJJUHY2QWRkcmVzc2VzPXRydWUsIHByZWZlcklQdjRTdGFjaz1mYWxzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsQWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IChnZXRMb2NhbEFkZHJlc3MpIHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9dHJ1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsQWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKTsKKyAgICAgICAgfQorICAgICAgICBzLmNsb3NlKCk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxQb3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5Tb2NrZXQuZ2V0TG9jYWxQb3J0KCkKLQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0TG9jYWxQb3J0Iik7Ci0JCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKLQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcik7Ci0JCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBwb3J0Iiwgcy5nZXRMb2NhbFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFBvcnQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsUG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxQb3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5Tb2NrZXQuZ2V0TG9jYWxQb3J0KCkKKyAgICAgICAgaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0TG9jYWxQb3J0Iik7CisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcik7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBwb3J0Iiwgcy5nZXRMb2NhbFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldE91dHB1dFN0cmVhbSgpCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk91dHB1dFN0cmVhbQotCQkvLyBqYXZhLm5ldC5Tb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkKLQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0T3V0cHV0U3RyZWFtIik7Ci0JCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOwotCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBvcyA9IHMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBnZXQgc3RyZWFtIiwgb3MpOwotCQl0ZWFyRG93bigpOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0T3V0cHV0U3RyZWFtKCkKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE91dHB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmlvLk91dHB1dFN0cmVhbQorICAgICAgICAvLyBqYXZhLm5ldC5Tb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkKKyAgICAgICAgaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0T3V0cHV0U3RyZWFtIik7CisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICBqYXZhLmlvLk91dHB1dFN0cmVhbSBvcyA9IHMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBnZXQgc3RyZWFtIiwgb3MpOworICAgICAgICB0ZWFyRG93bigpOwogCi0JCWludCBwb3J0TnVtID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlmaW5hbCBTZXJ2ZXJTb2NrZXQgc3MgPSBuZXcgU2VydmVyU29ja2V0KHBvcnROdW0pOwotCQlTb2NrZXQgc29jayA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW0pOwotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlTb2NrZXQgYXMgPSBzcy5hY2NlcHQoKTsKLQkJCQkJc3MuY2xvc2UoKTsKLQkJCQkJSW5wdXRTdHJlYW0gaW4gPSBhcy5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQlpbi5yZWFkKCk7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICI6ICIgKyBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlLCAiU29ja2V0LmdldE91dHB1dFN0cmVhbSIpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJaW50IGMgPSAwOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJaWYgKCsrYyA+IDQpCi0JCQkJZmFpbCgidGhyZWFkIGlzIG5vdCBhbGl2ZSIpOwotCQl9IHdoaWxlICghdGhyZWFkLmlzQWxpdmUoKSk7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBzb2NrLmdldE91dHB1dFN0cmVhbSgpOwotCQlieXRlW10gZGF0YSA9IG5ldyBieXRlWzI1Nl07Ci0JCW91dC53cml0ZShkYXRhKTsKLQkJYyA9IDA7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlpZiAoKytjID4gNCkgewotCQkJCWZhaWwoInJlYWQgY2FsbCBkaWQgbm90IGV4aXQiKTsKLQkJCX0KLQkJfSB3aGlsZSAodGhyZWFkLmlzQWxpdmUoKSk7CisgICAgICAgIGludCBwb3J0TnVtID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgc3MgPSBuZXcgU2VydmVyU29ja2V0KHBvcnROdW0pOworICAgICAgICBTb2NrZXQgc29jayA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW0pOworICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTb2NrZXQgYXMgPSBzcy5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBhcy5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBpbi5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICI6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlLCAiU29ja2V0LmdldE91dHB1dFN0cmVhbSIpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgaW50IGMgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCsrYyA+IDQpCisgICAgICAgICAgICAgICAgZmFpbCgidGhyZWFkIGlzIG5vdCBhbGl2ZSIpOworICAgICAgICB9IHdoaWxlICghdGhyZWFkLmlzQWxpdmUoKSk7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBzb2NrLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzI1Nl07CisgICAgICAgIG91dC53cml0ZShkYXRhKTsKKyAgICAgICAgYyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKytjID4gNCkgeworICAgICAgICAgICAgICAgIGZhaWwoInJlYWQgY2FsbCBkaWQgbm90IGV4aXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAodGhyZWFkLmlzQWxpdmUoKSk7CiAKLQkJYm9vbGVhbiBleGNlcHRpb24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNDAwOyBpKyspCi0JCQkJb3V0LndyaXRlKGRhdGEpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSB0cnVlOwotCQl9Ci0JCW91dC5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJ3cml0ZSB0byBjbG9zZWQgc29ja2V0IGRpZCBub3QgY2F1c2UgZXhjZXB0aW9uIiwgZXhjZXB0aW9uKTsKKyAgICAgICAgYm9vbGVhbiBleGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDAwOyBpKyspCisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGRhdGEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJ3cml0ZSB0byBjbG9zZWQgc29ja2V0IGRpZCBub3QgY2F1c2UgZXhjZXB0aW9uIiwgZXhjZXB0aW9uKTsKIAotCQkvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGhhcm1vbnktMjkzNAorICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGhhcm1vbnktMjkzNAogICAgICAgICBzID0gbmV3IFNvY2tldCgiMTI3LjAuMC4xIiwgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpLAotCQkJCWZhbHNlKTsKLQkJT3V0cHV0U3RyZWFtIG8gPSBzLmdldE91dHB1dFN0cmVhbSgpOwotCQlvLndyaXRlKDEpOworICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIG8gPSBzLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBvLndyaXRlKDEpOwogCi0JCS8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaGFybW9ueS0yOTQyCi0JCXMgPSBuZXcgU29ja2V0KCIwLjAuMC4wIiwgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydEZvclVEUCgpLAotCQkJCWZhbHNlKTsKLQkJbyA9IHMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCW8ud3JpdGUoMSk7Ci0JfQorICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGhhcm1vbnktMjk0MgorICAgICAgICBzID0gbmV3IFNvY2tldCgiMC4wLjAuMCIsIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnRGb3JVRFAoKSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIG8gPSBzLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBvLndyaXRlKDEpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0UG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRQb3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5Tb2NrZXQuZ2V0UG9ydCgpCi0JCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldFBvcnQiKTsKLQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7Ci0JCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBwb3J0IiArIHMuZ2V0UG9ydCgpLAotCQkJCXMuZ2V0UG9ydCgpID09IHNwb3J0KTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRQb3J0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQb3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5Tb2NrZXQuZ2V0UG9ydCgpCisgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldFBvcnQiKTsKKyAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBwb3J0IiArIHMuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICAgIHMuZ2V0UG9ydCgpID09IHNwb3J0KTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldFNvTGluZ2VyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFNvTGluZ2VyKCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubmV0LlNvY2tldC5nZXRTb0xpbmdlcigpCi0JCXRyeSB7Ci0JCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRTb0xpbmdlciIpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOwotCQkJcy5zZXRTb0xpbmdlcih0cnVlLCAyMDApOwotCQkJYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgbGluZ2VyIiwgMjAwLCBzLmdldFNvTGluZ2VyKCkpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19MSU5HRVIpOwotCQkJcy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fTElOR0VSKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldFNvTGluZ2VyKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U29MaW5nZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNvTGluZ2VyKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEubmV0LlNvY2tldC5nZXRTb0xpbmdlcigpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRTb0xpbmdlciIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgcy5zZXRTb0xpbmdlcih0cnVlLCAyMDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgbGluZ2VyIiwgMjAwLCBzLmdldFNvTGluZ2VyKCkpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19MSU5HRVIpOworICAgICAgICAgICAgcy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fTElOR0VSKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRSZWNlaXZlQnVmZmVyU2l6ZSIpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKLQkJCQkJbnVsbCwgcG9ydE51bWJlcik7Ci0JCQlzLnNldFJlY2VpdmVCdWZmZXJTaXplKDEzMCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnVmZmVyIHNpemUiLCBzLmdldFJlY2VpdmVCdWZmZXJTaXplKCkgPj0gMTMwKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkNWQlVGKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19SQ1ZCVUYpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZWNlaXZlQnVmZmVyU2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRSZWNlaXZlQnVmZmVyU2l6ZSIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgcG9ydE51bWJlcik7CisgICAgICAgICAgICBzLnNldFJlY2VpdmVCdWZmZXJTaXplKDEzMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnVmZmVyIHNpemUiLCBzLmdldFJlY2VpdmVCdWZmZXJTaXplKCkgPj0gMTMwKTsKKyAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkNWQlVGKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19SQ1ZCVUYpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRTZW5kQnVmZmVyU2l6ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRTZW5kQnVmZmVyU2l6ZSgpIHsKLQkJdHJ5IHsKLQkJCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHNldFNlbmRCdWZmZXJTaXplIik7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCksIHNwb3J0LAotCQkJCQludWxsLCBwb3J0TnVtYmVyKTsKLQkJCXMuc2V0U2VuZEJ1ZmZlclNpemUoMTM0KTsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBidWZmZXIgc2l6ZSIsIHMuZ2V0U2VuZEJ1ZmZlclNpemUoKSA+PSAxMzQpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19TTkRCVUYpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1NOREJVRik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRTZW5kQnVmZmVyU2l6ZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlbmRCdWZmZXJTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZW5kQnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHNldFNlbmRCdWZmZXJTaXplIik7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCksIHNwb3J0LAorICAgICAgICAgICAgICAgICAgICBudWxsLCBwb3J0TnVtYmVyKTsKKyAgICAgICAgICAgIHMuc2V0U2VuZEJ1ZmZlclNpemUoMTM0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBidWZmZXIgc2l6ZSIsIHMuZ2V0U2VuZEJ1ZmZlclNpemUoKSA+PSAxMzQpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19TTkRCVUYpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1NOREJVRik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldFNvVGltZW91dCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRTb1RpbWVvdXQoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5uZXQuU29ja2V0LmdldFNvVGltZW91dCgpCi0JCXRyeSB7Ci0JCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRTb1RpbWVvdXQiKTsKLQkJCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCk7Ci0JCQlzLnNldFNvVGltZW91dCgxMDApOwotCQkJYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc290aW1lb3V0IiwgMTAwLCBzLmdldFNvVGltZW91dCgpKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fVElNRU9VVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fVElNRU9VVCk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRTb1RpbWVvdXQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTb1RpbWVvdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNvVGltZW91dCgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLm5ldC5Tb2NrZXQuZ2V0U29UaW1lb3V0KCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldFNvVGltZW91dCIpOworICAgICAgICAgICAgcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0KTsKKyAgICAgICAgICAgIHMuc2V0U29UaW1lb3V0KDEwMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBzb3RpbWVvdXQiLCAxMDAsIHMuZ2V0U29UaW1lb3V0KCkpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19USU1FT1VUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19USU1FT1VUKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0VGNwTm9EZWxheSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRUY3BOb0RlbGF5KCkgewotCQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLm5ldC5Tb2NrZXQuZ2V0VGNwTm9EZWxheSgpCi0JCXRyeSB7Ci0JCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRUY3BOb0RlbGF5Iik7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7Ci0JCQlib29sZWFuIGJvb2wgPSAhcy5nZXRUY3BOb0RlbGF5KCk7Ci0JCQlzLnNldFRjcE5vRGVsYXkoYm9vbCk7Ci0JCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZ2V0IG5vIGRlbGF5IHNldHRpbmc6ICIgKyBzLmdldFRjcE5vRGVsYXkoKSwKLQkJCQkJcy5nZXRUY3BOb0RlbGF5KCkgPT0gYm9vbCk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFRDUF9OT0RFTEFZKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBUQ1BfTk9ERUxBWSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRUY3BOb0RlbGF5KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGNwTm9EZWxheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VGNwTm9EZWxheSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS5uZXQuU29ja2V0LmdldFRjcE5vRGVsYXkoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0VGNwTm9EZWxheSIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgYm9vbGVhbiBib29sID0gIXMuZ2V0VGNwTm9EZWxheSgpOworICAgICAgICAgICAgcy5zZXRUY3BOb0RlbGF5KGJvb2wpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGdldCBubyBkZWxheSBzZXR0aW5nOiAiICsgcy5nZXRUY3BOb0RlbGF5KCksCisgICAgICAgICAgICAgICAgICAgIHMuZ2V0VGNwTm9EZWxheSgpID09IGJvb2wpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhUQ1BfTk9ERUxBWSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgVENQX05PREVMQVkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNzZXRLZWVwQWxpdmUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldEtlZXBBbGl2ZVooKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVGhlcmUgaXMgbm90IHJlYWxseSBhIGdvb2QgdGVzdCBmb3IgdGhpcyBhcyBpdCBpcyB0aGVyZSB0byBkZXRlY3QKLQkJLy8gY3Jhc2hlZCBtYWNoaW5lcy4gSnVzdCBtYWtlIHN1cmUgd2UgY2FuIHNldCBpdAotCQl0cnkgewotCQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgc2V0S2VlcEFsaXZlIik7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwKLQkJCQkJbnVsbCwgcG9ydE51bWJlcik7Ci0JCQl0aGVTb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUpOwotCQkJdGhlU29ja2V0LnNldEtlZXBBbGl2ZShmYWxzZSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX0tFRVBBTElWRSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fS0VFUEFMSVZFKTsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0S2VlcEFsaXZlKGJvb2xlYW4pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEtlZXBBbGl2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEtlZXBBbGl2ZVooKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgbm90IHJlYWxseSBhIGdvb2QgdGVzdCBmb3IgdGhpcyBhcyBpdCBpcyB0aGVyZSB0byBkZXRlY3QKKyAgICAgICAgLy8gY3Jhc2hlZCBtYWNoaW5lcy4gSnVzdCBtYWtlIHN1cmUgd2UgY2FuIHNldCBpdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgc2V0S2VlcEFsaXZlIik7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgcG9ydE51bWJlcik7CisgICAgICAgICAgICB0aGVTb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUpOworICAgICAgICAgICAgdGhlU29ja2V0LnNldEtlZXBBbGl2ZShmYWxzZSk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX0tFRVBBTElWRSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fS0VFUEFMSVZFKTsKKyAgICAgICAgfQogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTEzNgotCQluZXcgdGVzdFNvY2tldCgoU29ja2V0SW1wbCkgbnVsbCkuc2V0S2VlcEFsaXZlKHRydWUpOwotCX0KLQljbGFzcyB0ZXN0U29ja2V0IGV4dGVuZHMgU29ja2V0IHsKLQkJcHVibGljIHRlc3RTb2NrZXQoU29ja2V0SW1wbCBpbXBsKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJCXN1cGVyKGltcGwpOwotCQl9Ci0JfSAKKyAgICAgICAgbmV3IHRlc3RTb2NrZXQoKFNvY2tldEltcGwpIG51bGwpLnNldEtlZXBBbGl2ZSh0cnVlKTsKKyAgICB9CisgICAgY2xhc3MgdGVzdFNvY2tldCBleHRlbmRzIFNvY2tldCB7CisgICAgICAgIHB1YmxpYyB0ZXN0U29ja2V0KFNvY2tldEltcGwgaW1wbCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihpbXBsKTsKKyAgICAgICAgfQorICAgIH0gCiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NldFNvY2tldEltcGxGYWN0b3J5KGphdmEubmV0LlNvY2tldEltcGxGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0U29ja2V0SW1wbEZhY3RvcnlMamF2YV9uZXRfU29ja2V0SW1wbEZhY3RvcnkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCi0JCS8vIGphdmEubmV0LlNvY2tldC5zZXRTb2NrZXRJbXBsRmFjdG9yeShqYXZhLm5ldC5Tb2NrZXRJbXBsRmFjdG9yeSkKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NldFNvY2tldEltcGxGYWN0b3J5KGphdmEubmV0LlNvY2tldEltcGxGYWN0b3J5KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBlbXB0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTb2NrZXRJbXBsRmFjdG9yeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRJbXBsRmFjdG9yeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTb2NrZXRJbXBsRmFjdG9yeUxqYXZhX25ldF9Tb2NrZXRJbXBsRmFjdG9yeSgpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKKyAgICAgICAgLy8gamF2YS5uZXQuU29ja2V0LnNldFNvY2tldEltcGxGYWN0b3J5KGphdmEubmV0LlNvY2tldEltcGxGYWN0b3J5KQogCi0JCS8vIENhbm5vdCB0ZXN0IGFzIHNldHRpbmcgd2lsbCBjYXVzZSB0aGUgZmFjdG9yeSB0byBiZSBjaGFuZ2VkIGZvcgotCQkvLyBhbGwgc3Vic2VxdWVudCBzb2NrZXRzCi0JfQorICAgICAgICAvLyBDYW5ub3QgdGVzdCBhcyBzZXR0aW5nIHdpbGwgY2F1c2UgdGhlIGZhY3RvcnkgdG8gYmUgY2hhbmdlZCBmb3IKKyAgICAgICAgLy8gYWxsIHN1YnNlcXVlbnQgc29ja2V0cworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0U2VuZEJ1ZmZlclNpemUoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VuZEJ1ZmZlclNpemVJKCkgewotCQl0cnkgewotCQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgc2V0U2VuZEJ1ZmZlclNpemVJIik7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7Ci0JCQlzLnNldFNlbmRCdWZmZXJTaXplKDEzNCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnVmZmVyIHNpemUiLCBzLmdldFNlbmRCdWZmZXJTaXplKCkgPj0gMTM0KTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fU05EQlVGKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19TTkRCVUYpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0U2VuZEJ1ZmZlclNpemUoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2VuZEJ1ZmZlclNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlbmRCdWZmZXJTaXplSSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHNldFNlbmRCdWZmZXJTaXplSSIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgcy5zZXRTZW5kQnVmZmVyU2l6ZSgxMzQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ1ZmZlciBzaXplIiwgcy5nZXRTZW5kQnVmZmVyU2l6ZSgpID49IDEzNCk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1NOREJVRik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fU05EQlVGKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0UmVjZWl2ZUJ1ZmZlclNpemUoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVjZWl2ZUJ1ZmZlclNpemVJKCkgewotCQl0cnkgewotCQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgc2V0UmVjZWl2ZUJ1ZmZlclNpemVJIik7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7Ci0JCQlzLnNldFJlY2VpdmVCdWZmZXJTaXplKDEzMCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgYnVmZmVyIHNpemUiLCBzLmdldFJlY2VpdmVCdWZmZXJTaXplKCkgPj0gMTMwKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkNWQlVGKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19SQ1ZCVUYpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0UmVjZWl2ZUJ1ZmZlclNpemUoaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmVjZWl2ZUJ1ZmZlclNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlY2VpdmVCdWZmZXJTaXplSSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHNldFJlY2VpdmVCdWZmZXJTaXplSSIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgcy5zZXRSZWNlaXZlQnVmZmVyU2l6ZSgxMzApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJ1ZmZlciBzaXplIiwgcy5nZXRSZWNlaXZlQnVmZmVyU2l6ZSgpID49IDEzMCk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1JDVkJVRik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fUkNWQlVGKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0U29MaW5nZXIoYm9vbGVhbiwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0U29MaW5nZXJaSSgpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5uZXQuU29ja2V0LnNldFNvTGluZ2VyKGJvb2xlYW4sIGludCkKLQkJdHJ5IHsKLQkJCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHNldFNvTGluZ2VyWkkiKTsKLQkJCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQkJcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0LCBudWxsLCBwb3J0TnVtYmVyKTsKLQkJCXMuc2V0U29MaW5nZXIodHJ1ZSwgNTAwKTsKLQkJCWFzc2VydEVxdWFscygiU2V0IGluY29ycmVjdCBsaW5nZXIiLCA1MDAsIHMuZ2V0U29MaW5nZXIoKSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX0xJTkdFUik7Ci0JCQlzLnNldFNvTGluZ2VyKGZhbHNlLCAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19MSU5HRVIpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0U29MaW5nZXIoYm9vbGVhbiwgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U29MaW5nZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNvTGluZ2VyWkkoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LlNvY2tldC5zZXRTb0xpbmdlcihib29sZWFuLCBpbnQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBzZXRTb0xpbmdlclpJIik7CisgICAgICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7CisgICAgICAgICAgICBzLnNldFNvTGluZ2VyKHRydWUsIDUwMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNldCBpbmNvcnJlY3QgbGluZ2VyIiwgNTAwLCBzLmdldFNvTGluZ2VyKCkpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19MSU5HRVIpOworICAgICAgICAgICAgcy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fTElOR0VSKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0U29UaW1lb3V0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NldFNvVGltZW91dEkoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LlNvY2tldC5zZXRTb1RpbWVvdXQoaW50KQotCQl0cnkgewotCQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgc2VTb1RpbWVvdXRJIik7Ci0JCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJCXMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7Ci0JCQlzLnNldFNvVGltZW91dCgxMDApOwotCQkJYXNzZXJ0RXF1YWxzKCJTZXQgaW5jb3JyZWN0IHNvdGltZW91dCIsIDEwMCwgcy5nZXRTb1RpbWVvdXQoKSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1RJTUVPVVQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUsIFNPX1RJTUVPVVQpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0U29UaW1lb3V0KGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNvY2tldEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U29UaW1lb3V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTb1RpbWVvdXRJKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLm5ldC5Tb2NrZXQuc2V0U29UaW1lb3V0KGludCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHNlU29UaW1lb3V0SSIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgcy5zZXRTb1RpbWVvdXQoMTAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU2V0IGluY29ycmVjdCBzb3RpbWVvdXQiLCAxMDAsIHMuZ2V0U29UaW1lb3V0KCkpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhTT19USU1FT1VUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19USU1FT1VUKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0VGNwTm9EZWxheShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGNwTm9EZWxheVooKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LlNvY2tldC5zZXRUY3BOb0RlbGF5KGJvb2xlYW4pCi0JCXRyeSB7Ci0JCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBzZXRUY3BOb0RlbGF5WiIpOwotCQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOwotCQkJYm9vbGVhbiBib29sOwotCQkJcy5zZXRUY3BOb0RlbGF5KGJvb2wgPSAhcy5nZXRUY3BOb0RlbGF5KCkpOwotCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNldCBubyBkZWxheSBzZXR0aW5nOiAiICsgcy5nZXRUY3BOb0RlbGF5KCksCi0JCQkJCXMuZ2V0VGNwTm9EZWxheSgpID09IGJvb2wpOwotCQkJZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhUQ1BfTk9ERUxBWSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgVENQX05PREVMQVkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0VGNwTm9EZWxheShib29sZWFuKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUY3BOb0RlbGF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VGNwTm9EZWxheVooKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEubmV0LlNvY2tldC5zZXRUY3BOb0RlbGF5KGJvb2xlYW4pCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBzZXRUY3BOb0RlbGF5WiIpOworICAgICAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOworICAgICAgICAgICAgYm9vbGVhbiBib29sOworICAgICAgICAgICAgcy5zZXRUY3BOb0RlbGF5KGJvb2wgPSAhcy5nZXRUY3BOb0RlbGF5KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNldCBubyBkZWxheSBzZXR0aW5nOiAiICsgcy5nZXRUY3BOb0RlbGF5KCksCisgICAgICAgICAgICAgICAgICAgIHMuZ2V0VGNwTm9EZWxheSgpID09IGJvb2wpOworICAgICAgICAgICAgZW5zdXJlRXhjZXB0aW9uVGhyb3duSWZPcHRpb25Jc1Vuc3VwcG9ydGVkT25PUyhUQ1BfTk9ERUxBWSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgVENQX05PREVMQVkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubmV0LlNvY2tldC50b1N0cmluZygpCi0JCWludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHRvU3RyaW5nIik7Ci0JCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKLQkJCQlJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcik7Ci0JCWFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBzdHJpbmc6ICIgKyBzLnRvU3RyaW5nKCkKLQkJCQkrICIgbG9jYWxIb3N0OiAiICsgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHMudG9TdHJpbmcoKQotCQkJCS5lcXVhbHMoCi0JCQkJCQkiU29ja2V0W2FkZHI9IiArIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpICsgIixwb3J0PSIKLQkJCQkJCQkJKyBzLmdldFBvcnQoKSArICIsbG9jYWxwb3J0PSIKLQkJCQkJCQkJKyBzLmdldExvY2FsUG9ydCgpICsgIl0iKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjdG9TdHJpbmcoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEubmV0LlNvY2tldC50b1N0cmluZygpCisgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIHRvU3RyaW5nIik7CisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpLCBzcG9ydCwKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcik7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBzdHJpbmc6ICIgKyBzLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICArICIgbG9jYWxIb3N0OiAiICsgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHMudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAiU29ja2V0W2FkZHI9IiArIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpICsgIixwb3J0PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLmdldFBvcnQoKSArICIsbG9jYWxwb3J0PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsUG9ydCgpICsgIl0iKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNzaHV0ZG93bklucHV0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NodXRkb3duSW5wdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQlpbnQgcG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCwgNSwgYWRkcik7Ci0JCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOwotCQlTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNzaHV0ZG93bklucHV0KCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaHV0ZG93bklucHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zaHV0ZG93bklucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgaW50IHBvcnQgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KHBvcnQsIDUsIGFkZHIpOworICAgICAgICBTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldChhZGRyLCBwb3J0KTsKKyAgICAgICAgU29ja2V0IHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwogCi0JCUlucHV0U3RyZWFtIHRoZUlucHV0ID0gdGhlU29ja2V0LmdldElucHV0U3RyZWFtKCk7Ci0JCU91dHB1dFN0cmVhbSB0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gdGhlSW5wdXQgPSB0aGVTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHRoZU91dHB1dCA9IHNlcnZTb2NrLmdldE91dHB1dFN0cmVhbSgpOwogCi0JCS8vIHNodXRkb3duIHRoZSBpbnB1dAotCQl0aGVTb2NrZXQuc2h1dGRvd25JbnB1dCgpOworICAgICAgICAvLyBzaHV0ZG93biB0aGUgaW5wdXQKKyAgICAgICAgdGhlU29ja2V0LnNodXRkb3duSW5wdXQoKTsKIAotCQkvLyBzZW5kIHRoZSByZWd1bGFyIGRhdGEKLQkJU3RyaW5nIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJUZXN0Iik7Ci0JCXRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQl0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgLy8gc2VuZCB0aGUgcmVndWxhciBkYXRhCisgICAgICAgIFN0cmluZyBzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCIpOworICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgdGhlT3V0cHV0LmZsdXNoKCk7CiAKLQkJLy8gZ2l2ZSB0aGluZ3Mgc29tZSB0aW1lIHRvIHNldHRsZQotCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIC8vIGdpdmUgdGhpbmdzIHNvbWUgdGltZSB0byBzZXR0bGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwogCi0JCS8vIFJJIGZhaWxzIGhlcmUuIEl0IGlzIGEgUkkgYnVnIG5vdCB0byByZXR1cm4gMCB0byBpbmRpY2F0ZSBFT0YKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoZUlucHV0LmF2YWlsYWJsZSgpKTsKLQkJCi0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLQl9CisgICAgICAgIC8vIFJJIGZhaWxzIGhlcmUuIEl0IGlzIGEgUkkgYnVnIG5vdCB0byByZXR1cm4gMCB0byBpbmRpY2F0ZSBFT0YKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRoZUlucHV0LmF2YWlsYWJsZSgpKTsKKyAgICAgICAgCisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NodXRkb3duT3V0cHV0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NodXRkb3duT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQlpbnQgcG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCwgNSwgYWRkcik7Ci0JCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOwotCQlTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNzaHV0ZG93bk91dHB1dCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2h1dGRvd25PdXRwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NodXRkb3duT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICBpbnQgcG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCwgNSwgYWRkcik7CisgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOworICAgICAgICBTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CiAKLQkJSW5wdXRTdHJlYW0gdGhlSW5wdXQgPSB0aGVTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJT3V0cHV0U3RyZWFtIHRoZU91dHB1dCA9IHNlcnZTb2NrLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBJbnB1dFN0cmVhbSB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7CiAKLQkJLy8gc2h1dGRvd24gdGhlIG91dHB1dAotCQlzZXJ2U29jay5zaHV0ZG93bk91dHB1dCgpOworICAgICAgICAvLyBzaHV0ZG93biB0aGUgb3V0cHV0CisgICAgICAgIHNlcnZTb2NrLnNodXRkb3duT3V0cHV0KCk7CiAKLQkJLy8gc2VuZCB0aGUgcmVndWxhciBkYXRhCi0JCVN0cmluZyBzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCIpOwotCQl0cnkgewotCQkJdGhlT3V0cHV0LndyaXRlKHNlbmRTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQl0aGVPdXRwdXQuZmx1c2goKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIHdyaXRpbmcgb24gc29ja2V0IHdpdGggb3V0cHV0IHNodXRkb3duIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAgICAgLy8gc2VuZCB0aGUgcmVndWxhciBkYXRhCisgICAgICAgIFN0cmluZyBzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlT3V0cHV0LndyaXRlKHNlbmRTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIHdyaXRpbmcgb24gc29ja2V0IHdpdGggb3V0cHV0IHNodXRkb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJc2VydmVyU29ja2V0LmNsb3NlKCk7Ci0JfQorICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFNvY2tldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gc2V0IHVwIHNlcnZlciBjb25uZWN0IGFuZCB0aGVuIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSByaWdodAotCQkvLyByZXNwb25zZSBmb3IgdGhlIGxvY2FsIGFkZHJlc3MKLQkJaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0TG9jU29ja2V0QWRkcmVzcyIpOwotCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0LCBudWxsLCBwb3J0TnVtYmVyKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzKDEpOiIKLQkJCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpCi0JCQkJCQkrICJFeHBlY3RlZDogIgotCQkJCQkJKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCQkJCQlwb3J0TnVtYmVyKSkudG9TdHJpbmcoKSwgcwotCQkJCQkJLmdldExvY2FsU29ja2V0QWRkcmVzcygpLmVxdWFscygKLQkJCQkJCQkJbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCi0JCQkJCQkJCQkJLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKSkpOwotCQlzLmNsb3NlKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFNvY2tldEFkZHJlc3MoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsU29ja2V0QWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHVwIHNlcnZlciBjb25uZWN0IGFuZCB0aGVuIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSByaWdodAorICAgICAgICAvLyByZXNwb25zZSBmb3IgdGhlIGxvY2FsIGFkZHJlc3MKKyAgICAgICAgaW50IHNwb3J0ID0gc3RhcnRTZXJ2ZXIoIlNTZXJ2ZXIgZ2V0TG9jU29ja2V0QWRkcmVzcyIpOworICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgcyA9IG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNwb3J0LCBudWxsLCBwb3J0TnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzKDEpOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICArICJFeHBlY3RlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TnVtYmVyKSkudG9TdHJpbmcoKSwgcworICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsU29ja2V0QWRkcmVzcygpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKSkpOworICAgICAgICBzLmNsb3NlKCk7CiAKLQkJLy8gbm93IGNyZWF0ZSBhIHNvY2tldCB0aGF0IGlzIG5vdCBib3VuZCBhbmQgdmFsaWRhdGUgd2UgZ2V0IHRoZQotCQkvLyByaWdodCBhbnN3ZXIKLQkJU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJYXNzZXJ0TnVsbCgKLQkJCQkiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzIC11bmJvdW5kIHNvY2tldC0gRXhwZWN0ZWQgbnVsbCIsCi0JCQkJdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpKTsKKyAgICAgICAgLy8gbm93IGNyZWF0ZSBhIHNvY2tldCB0aGF0IGlzIG5vdCBib3VuZCBhbmQgdmFsaWRhdGUgd2UgZ2V0IHRoZQorICAgICAgICAvLyByaWdodCBhbnN3ZXIKKyAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgKKyAgICAgICAgICAgICAgICAiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzIC11bmJvdW5kIHNvY2tldC0gRXhwZWN0ZWQgbnVsbCIsCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpKTsKIAotCQkvLyBub3cgYmluZCB0aGUgc29ja2V0IGFuZCBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIKLQkJcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJdGhlU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCXBvcnROdW1iZXIpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzKDIpOiIKLQkJCQkJCSsgdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCkKLQkJCQkJCSsgIkV4cGVjdGVkOiAiCi0JCQkJCQkrIChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQkJCXBvcnROdW1iZXIpKS50b1N0cmluZygpLCB0aGVTb2NrZXQKLQkJCQkJCS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS5lcXVhbHMoCi0JCQkJCQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkJCQkJCS5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcikpKTsKLQkJdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgIC8vIG5vdyBiaW5kIHRoZSBzb2NrZXQgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlcgorICAgICAgICBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICB0aGVTb2NrZXQuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgcG9ydE51bWJlcikpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MoMik6IgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVTb2NrZXQuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiRXhwZWN0ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE51bWJlcikpLnRvU3RyaW5nKCksIHRoZVNvY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsU29ja2V0QWRkcmVzcygpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLCBwb3J0TnVtYmVyKSkpOworICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKIAotCQkvLyBub3cgdmFsaWRhdGUgdGhldCBiZWhhdmlvdXIgd2hlbiB0aGUgYW55IGFkZHJlc3MgaXMgcmV0dXJuZWQKLQkJcyA9IG5ldyBTb2NrZXQoKTsKLQkJcy5iaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjAuMC4wLjAiKSwgMCkpOworICAgICAgICAvLyBub3cgdmFsaWRhdGUgdGhldCBiZWhhdmlvdXIgd2hlbiB0aGUgYW55IGFkZHJlc3MgaXMgcmV0dXJuZWQKKyAgICAgICAgcyA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgcy5iaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjAuMC4wLjAiKSwgMCkpOwogCi0JCVN0cmluZyBwcmVmZXJJUHY0U3RhY2tWYWx1ZSA9IFN5c3RlbQotCQkJCS5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NFN0YWNrIik7Ci0JCVN0cmluZyBwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUgPSBTeXN0ZW0KLQkJCQkuZ2V0UHJvcGVydHkoImphdmEubmV0LnByZWZlcklQdjZBZGRyZXNzZXMiKTsKLQkJaWYgKCgocHJlZmVySVB2NFN0YWNrVmFsdWUgPT0gbnVsbCkgfHwgcHJlZmVySVB2NFN0YWNrVmFsdWUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKLQkJCQkmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlICE9IG51bGwpCi0JCQkJJiYgKHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZS5lcXVhbHMoInRydWUiKSkpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9ZmFsc2UgIgotCQkJCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKLQkJCQkJKChJbmV0U29ja2V0QWRkcmVzcykgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSkKLQkJCQkJCQkuZ2V0QWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9dHJ1ZSAiCi0JCQkJCQkJKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAotCQkJCQkoKEluZXRTb2NrZXRBZGRyZXNzKSBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpKQotCQkJCQkJCS5nZXRBZGRyZXNzKCkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpOwotCQl9Ci0JCXMuY2xvc2UoKTsKKyAgICAgICAgU3RyaW5nIHByZWZlcklQdjRTdGFja1ZhbHVlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2siKTsKKyAgICAgICAgU3RyaW5nIHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZSA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5uZXQucHJlZmVySVB2NkFkZHJlc3NlcyIpOworICAgICAgICBpZiAoKChwcmVmZXJJUHY0U3RhY2tWYWx1ZSA9PSBudWxsKSB8fCBwcmVmZXJJUHY0U3RhY2tWYWx1ZQorICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKQorICAgICAgICAgICAgICAgICYmIChwcmVmZXJJUHY2QWRkcmVzc2VzVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlLmVxdWFscygidHJ1ZSIpKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIkFOWSBhZGRyZXNzIG5vdCByZXR1cm5lZCBjb3JyZWN0bHkgd2l0aCBwcmVmZXJJUHY2QWRkcmVzc2VzPXRydWUsIHByZWZlcklQdjRTdGFjaz1mYWxzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAoKEluZXRTb2NrZXRBZGRyZXNzKSBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIkFOWSBhZGRyZXNzIG5vdCByZXR1cm5lZCBjb3JyZWN0bHkgd2l0aCBwcmVmZXJJUHY2QWRkcmVzc2VzPXRydWUsIHByZWZlcklQdjRTdGFjaz10cnVlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICgoSW5ldFNvY2tldEFkZHJlc3MpIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgcy5jbG9zZSgpOwogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGUgc2FtZSBmb3IgZ2V0TG9jYWxBZGRyZXNzCi0JCXMgPSBuZXcgU29ja2V0KCk7Ci0JCXMuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIwLjAuMC4wIiksIDApKTsKLQkJaWYgKCgocHJlZmVySVB2NFN0YWNrVmFsdWUgPT0gbnVsbCkgfHwgcHJlZmVySVB2NFN0YWNrVmFsdWUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKLQkJCQkmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlICE9IG51bGwpCi0JCQkJJiYgKHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZS5lcXVhbHMoInRydWUiKSkpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9ZmFsc2UgIgotCQkJCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKLQkJCQkJKChJbmV0U29ja2V0QWRkcmVzcykgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSkKLQkJCQkJCQkuZ2V0QWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9dHJ1ZSAiCi0JCQkJCQkJKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAotCQkJCQkoKEluZXRTb2NrZXRBZGRyZXNzKSBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpKQotCQkJCQkJCS5nZXRBZGRyZXNzKCkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpOwotCQl9Ci0JCXMuY2xvc2UoKTsKLQl9CisgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGUgc2FtZSBmb3IgZ2V0TG9jYWxBZGRyZXNzCisgICAgICAgIHMgPSBuZXcgU29ja2V0KCk7CisgICAgICAgIHMuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIwLjAuMC4wIiksIDApKTsKKyAgICAgICAgaWYgKCgocHJlZmVySVB2NFN0YWNrVmFsdWUgPT0gbnVsbCkgfHwgcHJlZmVySVB2NFN0YWNrVmFsdWUKKyAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKKyAgICAgICAgICAgICAgICAmJiAocHJlZmVySVB2NkFkZHJlc3Nlc1ZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgJiYgKHByZWZlcklQdjZBZGRyZXNzZXNWYWx1ZS5lcXVhbHMoInRydWUiKSkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9ZmFsc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgKChJbmV0U29ja2V0QWRkcmVzcykgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJBTlkgYWRkcmVzcyBub3QgcmV0dXJuZWQgY29ycmVjdGx5IHdpdGggcHJlZmVySVB2NkFkZHJlc3Nlcz10cnVlLCBwcmVmZXJJUHY0U3RhY2s9dHJ1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAoKEluZXRTb2NrZXRBZGRyZXNzKSBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpOworICAgICAgICB9CisgICAgICAgIHMuY2xvc2UoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldFJlbW90ZVNvY2tldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHNldCB1cCBzZXJ2ZXIgY29ubmVjdCBhbmQgdGhlbiB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgcmlnaHQKLQkJLy8gcmVzcG9uc2UgZm9yIHRoZSByZW1vdGUgYWRkcmVzcwotCQlpbnQgc3BvcnQgPSBzdGFydFNlcnZlcigiU1NlcnZlciBnZXRMb2NSZW1vdGVBZGRyZXNzIik7Ci0JCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlzID0gbmV3IFNvY2tldChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc3BvcnQsIG51bGwsIHBvcnROdW1iZXIpOwotCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MoMSk6IgotCQkJCSsgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpLAotCQkJCXMuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpCi0JCQkJCQkuZXF1YWxzKAotCQkJCQkJCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkJCQkJCQkuZ2V0TG9jYWxIb3N0KCksIHNwb3J0KSkpOwotCQlzLmNsb3NlKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSZW1vdGVTb2NrZXRBZGRyZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHVwIHNlcnZlciBjb25uZWN0IGFuZCB0aGVuIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZSByaWdodAorICAgICAgICAvLyByZXNwb25zZSBmb3IgdGhlIHJlbW90ZSBhZGRyZXNzCisgICAgICAgIGludCBzcG9ydCA9IHN0YXJ0U2VydmVyKCJTU2VydmVyIGdldExvY1JlbW90ZUFkZHJlc3MiKTsKKyAgICAgICAgaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7CisgICAgICAgIHMgPSBuZXcgU29ja2V0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzcG9ydCwgbnVsbCwgcG9ydE51bWJlcik7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJbmV0U29ja2V0QWRkcmVzcygxKToiCisgICAgICAgICAgICAgICAgKyBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgcy5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSwgc3BvcnQpKSk7CisgICAgICAgIHMuY2xvc2UoKTsKIAotCQkvLyBub3cgY3JlYXRlIG9uZSB0aGF0IGlzIG5vdCBjb25uZWN0IGFuZCB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUKLQkJLy8gcmlnaHQgYW5zd2VyCi0JCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCXBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCXRoZVNvY2tldC5iaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQlwb3J0TnVtYmVyKSk7CisgICAgICAgIC8vIG5vdyBjcmVhdGUgb25lIHRoYXQgaXMgbm90IGNvbm5lY3QgYW5kIHZhbGlkYXRlIHRoYXQgd2UgZ2V0IHRoZQorICAgICAgICAvLyByaWdodCBhbnN3ZXIKKyAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgdGhlU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKTsKIAotCQlhc3NlcnROdWxsKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MgLXVuY29ubmVjdGVkIHNvY2tldDoiCi0JCQkJKyAiRXhwZWN0ZWQ6IE5VTEwiLCB0aGVTb2NrZXQuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiUmV0dXJuZWQgaW5jb3JyZWN0IEluZXRTb2NrZXRBZGRyZXNzIC11bmNvbm5lY3RlZCBzb2NrZXQ6IgorICAgICAgICAgICAgICAgICsgIkV4cGVjdGVkOiBOVUxMIiwgdGhlU29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSk7CiAKLQkJLy8gbm93IGNvbm5lY3QgYW5kIHZhbGlkYXRlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyCi0JCXRoZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQlzcG9ydCkpOwotCQlhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5ldFNvY2tldEFkZHJlc3MoMik6IgotCQkJCSsgdGhlU29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpLAotCQkJCXRoZVNvY2tldC5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkKLQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkJCQkJCS5nZXRMb2NhbEhvc3QoKSwgc3BvcnQpKSk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICAvLyBub3cgY29ubmVjdCBhbmQgdmFsaWRhdGUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIKKyAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgIHNwb3J0KSk7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJbmV0U29ja2V0QWRkcmVzcygyKToiCisgICAgICAgICAgICAgICAgKyB0aGVTb2NrZXQuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLCBzcG9ydCkpKTsKKyAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNpc0JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2lzQm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCWludCBwb3J0ID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChwb3J0LCA1LCBhZGRyKTsKLQkJU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoYWRkciwgcG9ydCk7Ci0JCVNvY2tldCBzZXJ2U29jayA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKLQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCAgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICgxKSIsCi0JCQkJdGhlU29ja2V0LmlzQm91bmQoKSk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2lzQm91bmQoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQm91bmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgIGludCBwb3J0ID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChwb3J0LCA1LCBhZGRyKTsKKyAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoYWRkciwgcG9ydCk7CisgICAgICAgIFNvY2tldCBzZXJ2U29jayA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCAgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICgxKSIsCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQm91bmQoKSk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKIAotCQkvLyBub3cgZG8gaXQgd2l0aCB0aGUgbmV3IGNvbnN0cnVjdG9ycyBhbmQgcmV2YWxpZGF0ZS4gQ29ubmVjdCBjYXVzZXMKLQkJLy8gdGhlIHNvY2tldCB0byBiZSBib3VuZAotCQlJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCi0JCQkJLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOwotCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCWFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkIGJvdW5kIHdoZW4gaXQgd2FzIG5vdCAoMikiLCB0aGVTb2NrZXQKLQkJCQkuaXNCb3VuZCgpKTsKLQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwotCQlzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKLQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7Ci0JCXNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQlhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkIG5vdCBib3VuZCB3aGVuIGl0IHNob3VsZCBiZSAoMikiLAotCQkJCXRoZVNvY2tldC5pc0JvdW5kKCkpOwotCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIC8vIG5vdyBkbyBpdCB3aXRoIHRoZSBuZXcgY29uc3RydWN0b3JzIGFuZCByZXZhbGlkYXRlLiBDb25uZWN0IGNhdXNlcworICAgICAgICAvLyB0aGUgc29ja2V0IHRvIGJlIGJvdW5kCisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNvY2tldCBpbmRpY2F0ZWQgYm91bmQgd2hlbiBpdCB3YXMgbm90ICgyKSIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5pc0JvdW5kKCkpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKKyAgICAgICAgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICgyKSIsCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzQm91bmQoKSk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKIAotCQkvLyBub3cgdGVzdCB3aGVuIHdlIGJpbmQgZXhwbGljaXRlbHkKLQkJSW5ldFNvY2tldEFkZHJlc3MgdGhlTG9jYWxBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCi0JCQkJLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOwotCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCWFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkIGJvdW5kIHdoZW4gaXQgd2FzIG5vdCAoMykiLCB0aGVTb2NrZXQKLQkJCQkuaXNCb3VuZCgpKTsKLQkJdGhlU29ja2V0LmJpbmQodGhlTG9jYWxBZGRyZXNzKTsKLQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmUgKDNhKSIsCi0JCQkJdGhlU29ja2V0LmlzQm91bmQoKSk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkIG5vdCBib3VuZCB3aGVuIGl0IHNob3VsZCBiZSAoM2IpIiwKLQkJCQl0aGVTb2NrZXQuaXNCb3VuZCgpKTsKLQl9CisgICAgICAgIC8vIG5vdyB0ZXN0IHdoZW4gd2UgYmluZCBleHBsaWNpdGVseQorICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNvY2tldCBpbmRpY2F0ZWQgYm91bmQgd2hlbiBpdCB3YXMgbm90ICgzKSIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5pc0JvdW5kKCkpOworICAgICAgICB0aGVTb2NrZXQuYmluZCh0aGVMb2NhbEFkZHJlc3MpOworICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkIG5vdCBib3VuZCB3aGVuIGl0IHNob3VsZCBiZSAoM2EpIiwKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNCb3VuZCgpKTsKKyAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgbm90IGJvdW5kIHdoZW4gaXQgc2hvdWxkIGJlICgzYikiLAorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc0JvdW5kKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjaXNDb25uZWN0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfaXNDb25uZWN0ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCWludCBwb3J0ID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQlTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChwb3J0LCA1LCBhZGRyKTsKLQkJU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoYWRkciwgcG9ydCk7Ci0JCVNvY2tldCBzZXJ2U29jayA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKLQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IGluZGljYXRlZCAgbm90IGNvbm5lY3RlZCB3aGVuIGl0IHNob3VsZCBiZSIsCi0JCQkJdGhlU29ja2V0LmlzQ29ubmVjdGVkKCkpOwotCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNpc0Nvbm5lY3RlZCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNDb25uZWN0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQ29ubmVjdGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICBpbnQgcG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCwgNSwgYWRkcik7CisgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOworICAgICAgICBTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBpbmRpY2F0ZWQgIG5vdCBjb25uZWN0ZWQgd2hlbiBpdCBzaG91bGQgYmUiLAorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwogCi0JCS8vIG5vdyBkbyBpdCB3aXRoIHRoZSBuZXcgY29uc3RydWN0b3JzIGFuZCByZXZhbGlkYXRlCi0JCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJYXNzZXJ0RmFsc2UoIlNvY2tldCBpbmRpY2F0ZWQgY29ubmVjdGVkIHdoZW4gaXQgd2FzIG5vdCIsIHRoZVNvY2tldAotCQkJCS5pc0Nvbm5lY3RlZCgpKTsKLQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwotCQlzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKLQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7Ci0JCXNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQlhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkICBub3QgY29ubmVjdGVkIHdoZW4gaXQgc2hvdWxkIGJlIiwKLQkJCQl0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLQl9CisgICAgICAgIC8vIG5vdyBkbyBpdCB3aXRoIHRoZSBuZXcgY29uc3RydWN0b3JzIGFuZCByZXZhbGlkYXRlCisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNvY2tldCBpbmRpY2F0ZWQgY29ubmVjdGVkIHdoZW4gaXQgd2FzIG5vdCIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7CisgICAgICAgIHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgaW5kaWNhdGVkICBub3QgY29ubmVjdGVkIHdoZW4gaXQgc2hvdWxkIGJlIiwKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2lzQ2xvc2VkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2lzQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQlpbnQgcG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCwgNSwgYWRkcik7Ci0JCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOwotCQlTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNpc0Nsb3NlZCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNDbG9zZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICBpbnQgcG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCwgNSwgYWRkcik7CisgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOworICAgICAgICBTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CiAKLQkJLy8gdmFsaWRhdGUgaXNDbG9zZWQgcmV0dXJucyBleHBlY3RlZCB2YWx1ZXMKLQkJYXNzZXJ0RmFsc2UoIlNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgbm90IGNsb3NlZCgxKToiLCB0aGVTb2NrZXQKLQkJCQkuaXNDbG9zZWQoKSk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJTb2NrZXQgc2hvdWxkIGluZGljYXRlIGl0IGlzIGNsb3NlZCgxKToiLCB0aGVTb2NrZXQKLQkJCQkuaXNDbG9zZWQoKSk7CisgICAgICAgIC8vIHZhbGlkYXRlIGlzQ2xvc2VkIHJldHVybnMgZXhwZWN0ZWQgdmFsdWVzCisgICAgICAgIGFzc2VydEZhbHNlKCJTb2NrZXQgc2hvdWxkIGluZGljYXRlIGl0IGlzIG5vdCBjbG9zZWQoMSk6IiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgLmlzQ2xvc2VkKCkpOworICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IHNob3VsZCBpbmRpY2F0ZSBpdCBpcyBjbG9zZWQoMSk6IiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgLmlzQ2xvc2VkKCkpOwogCi0JCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoYWRkciwgcG9ydCk7Ci0JCWFzc2VydEZhbHNlKCJTb2NrZXQgc2hvdWxkIGluZGljYXRlIGl0IGlzIG5vdCBjbG9zZWQoMik6IiwgdGhlU29ja2V0Ci0JCQkJLmlzQ2xvc2VkKCkpOwotCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IHNob3VsZCBpbmRpY2F0ZSBpdCBpcyBjbG9zZWQoMik6IiwgdGhlU29ja2V0Ci0JCQkJLmlzQ2xvc2VkKCkpOworICAgICAgICB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOworICAgICAgICBhc3NlcnRGYWxzZSgiU29ja2V0IHNob3VsZCBpbmRpY2F0ZSBpdCBpcyBub3QgY2xvc2VkKDIpOiIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5pc0Nsb3NlZCgpKTsKKyAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgY2xvc2VkKDIpOiIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5pc0Nsb3NlZCgpKTsKIAotCQkvLyB2YWxpZGF0ZSB0aGF0IGlzQ2xvc2VkIHdvcmtzIG9rIGZvciBzb2NrZXRzIHJldHVybmVkIGZyb20KLQkJLy8gU2VydmVyU29ja2V0LmFjY2VwdCgpCi0JCWFzc2VydEZhbHNlKCJTZXJ2ZXIgU29ja2V0IHNob3VsZCBpbmRpY2F0ZSBpdCBpcyBub3QgY2xvc2VkOiIsIHNlcnZTb2NrCi0JCQkJLmlzQ2xvc2VkKCkpOwotCQlzZXJ2U29jay5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJTZXJ2ZXIgU29ja2V0IHNob3VsZCBpbmRpY2F0ZSBpdCBpcyBjbG9zZWQ6Iiwgc2VydlNvY2sKLQkJCQkuaXNDbG9zZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNiaW5kKGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9iaW5kTGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWNsYXNzIG15U29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgewotCi0JCQlwdWJsaWMgbXlTb2NrZXRBZGRyZXNzKCkgewotCQkJfQotCQl9Ci0KLQkJLy8gQWRkcmVzcyB3ZSBjYW5ub3QgYmluZCB0bwotCQlTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQl0cnkgewotCQkJdGhlU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCi0JCQkJCS5nZXRCeUFkZHJlc3MoU3VwcG9ydF9Db25maWd1cmF0aW9uLm5vbkxvY2FsQWRkcmVzc0J5dGVzKSwKLQkJCQkJU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKSk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBiaW5kaW5nIHRvIGJhZCBhZGRyZXNzOiIKLQkJICAJICAgICArIHRoZVNvY2tldC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgc29ja2V0IHRoYXQgaXMgbm90IGJvdW5kIGFuZCB0aGVuIGJpbmQgaXQKLQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJdGhlU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCXBvcnROdW1iZXIpKTsKLQotCQkvLyB2YWxpZGF0ZSB0aGF0IHRoZSBsb2NhbFNvY2tldEFkZHJlc3MgcmVmbGVjdHMgdGhlIGFkZHJlc3Mgd2UKLQkJLy8gYm91bmQgdG8KLQkJYXNzZXJ0VHJ1ZSgKLQkJCQkiTG9jYWwgYWRkcmVzcyBub3QgY29ycmVjdCBhZnRlciBiaW5kOiIKLQkJCQkJCSsgdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCkKLQkJCQkJCSsgIkV4cGVjdGVkOiAiCi0JCQkJCQkrIChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQkJCXBvcnROdW1iZXIpKS50b1N0cmluZygpLCB0aGVTb2NrZXQKLQkJCQkJCS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS5lcXVhbHMoCi0JCQkJCQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCQkJCQkJCS5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcikpKTsKLQotCQkvLyBtYWtlIHN1cmUgd2UgY2FuIG5vdyBjb25uZWN0IGFuZCB0aGF0IGNvbm5lY3Rpb25zIGFwcGVhciB0byBjb21lCi0JCS8vIGZyb20gdGhlIGFkZHJlc3Mgd2UgYm91bmQgdG8uCi0JCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCVNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJU29ja2V0IHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQlhc3NlcnRUcnVlKAotCQkJCSJSZXR1cm5lZCBSZW1vdGUgYWRkcmVzcyBmcm9tIHNlcnZlciBjb25uZWN0ZWQgdG8gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgbG9jYWwgYWRkcmVzczoiCi0JCQkJCQkrIHNlcnZTb2NrLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpCi0JCQkJCQkrICJFeHBlY3RlZDogIgotCQkJCQkJKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCQkJCQlwb3J0TnVtYmVyKSkudG9TdHJpbmcoKSwgc2VydlNvY2sKLQkJCQkJCS5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkuZXF1YWxzKAotCQkJCQkJCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkJCQkJCQkuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW1iZXIpKSk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlzZXJ2U29jay5jbG9zZSgpOwotCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLQotCQkvLyB2YWxpZGF0ZSBpZiB3ZSBwYXNzIGluIG51bGwgdGhhdCBpdCBwaWNrcyBhbiBhZGRyZXNzIGZvciB1cyBhbmQKLQkJLy8gYWxsIGlzIG9rCi0JCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJdGhlU29ja2V0LmJpbmQobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoIkJpbmQgd2l0aCBudWxsIGRpZCBub3Qgd29yayIsIHRoZVNvY2tldAotCQkJCS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCi0JCS8vIG5vdyBjaGVjayB0aGUgZXJyb3IgY29uZGl0aW9ucwotCi0JCS8vIEFkZHJlc3MgdGhhdCB3ZSBoYXZlIGFsbHJlYWR5IGJvdW5kIHRvCi0JCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJU29ja2V0IHRoZVNvY2tldDIgPSBuZXcgU29ja2V0KCk7Ci0JCXRyeSB7Ci0JCQl0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCQlTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOwotCQkJdGhlU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7Ci0JCQl0aGVTb2NrZXQyLmJpbmQodGhlQWRkcmVzcyk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gYmluZGluZyB0byBhZGRyZXNzIHRoYXQgaXMgbm90IGF2YWlsYWJsZSIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQl0aGVTb2NrZXQyLmNsb3NlKCk7Ci0KLQkJLy8gdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcwotCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCXRyeSB7Ci0JCQl0aGVTb2NrZXQuYmluZChuZXcgbXlTb2NrZXRBZGRyZXNzKCkpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gYmluZGluZyB1c2luZyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCX0KKyAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCBpc0Nsb3NlZCB3b3JrcyBvayBmb3Igc29ja2V0cyByZXR1cm5lZCBmcm9tCisgICAgICAgIC8vIFNlcnZlclNvY2tldC5hY2NlcHQoKQorICAgICAgICBhc3NlcnRGYWxzZSgiU2VydmVyIFNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgbm90IGNsb3NlZDoiLCBzZXJ2U29jaworICAgICAgICAgICAgICAgIC5pc0Nsb3NlZCgpKTsKKyAgICAgICAgc2VydlNvY2suY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VydmVyIFNvY2tldCBzaG91bGQgaW5kaWNhdGUgaXQgaXMgY2xvc2VkOiIsIHNlcnZTb2NrCisgICAgICAgICAgICAgICAgLmlzQ2xvc2VkKCkpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjYmluZChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9iaW5kTGphdmFfbmV0X1NvY2tldEFkZHJlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGNsYXNzIG15U29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgeworCisgICAgICAgICAgICBwdWJsaWMgbXlTb2NrZXRBZGRyZXNzKCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkcmVzcyB3ZSBjYW5ub3QgYmluZCB0bworICAgICAgICBTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRCeUFkZHJlc3MoU3VwcG9ydF9Db25maWd1cmF0aW9uLm5vbkxvY2FsQWRkcmVzc0J5dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKSk7CisgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gd2hlbiBiaW5kaW5nIHRvIGJhZCBhZGRyZXNzOiIKKyAgICAgICAgICAgICAgICAgICArIHRoZVNvY2tldC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKworICAgICAgICAvLyBub3cgY3JlYXRlIGEgc29ja2V0IHRoYXQgaXMgbm90IGJvdW5kIGFuZCB0aGVuIGJpbmQgaXQKKyAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKKyAgICAgICAgdGhlU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKTsKKworICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHRoZSBsb2NhbFNvY2tldEFkZHJlc3MgcmVmbGVjdHMgdGhlIGFkZHJlc3Mgd2UKKyAgICAgICAgLy8gYm91bmQgdG8KKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiTG9jYWwgYWRkcmVzcyBub3QgY29ycmVjdCBhZnRlciBiaW5kOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkV4cGVjdGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpKS50b1N0cmluZygpLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSwgcG9ydE51bWJlcikpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY2FuIG5vdyBjb25uZWN0IGFuZCB0aGF0IGNvbm5lY3Rpb25zIGFwcGVhciB0byBjb21lCisgICAgICAgIC8vIGZyb20gdGhlIGFkZHJlc3Mgd2UgYm91bmQgdG8uCisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKKyAgICAgICAgU29ja2V0IHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJSZXR1cm5lZCBSZW1vdGUgYWRkcmVzcyBmcm9tIHNlcnZlciBjb25uZWN0ZWQgdG8gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgbG9jYWwgYWRkcmVzczoiCisgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZTb2NrLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICArICJFeHBlY3RlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TnVtYmVyKSkudG9TdHJpbmcoKSwgc2VydlNvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIHBvcnROdW1iZXIpKSk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2U29jay5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKworICAgICAgICAvLyB2YWxpZGF0ZSBpZiB3ZSBwYXNzIGluIG51bGwgdGhhdCBpdCBwaWNrcyBhbiBhZGRyZXNzIGZvciB1cyBhbmQKKyAgICAgICAgLy8gYWxsIGlzIG9rCisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgdGhlU29ja2V0LmJpbmQobnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkJpbmQgd2l0aCBudWxsIGRpZCBub3Qgd29yayIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworCisgICAgICAgIC8vIG5vdyBjaGVjayB0aGUgZXJyb3IgY29uZGl0aW9ucworCisgICAgICAgIC8vIEFkZHJlc3MgdGhhdCB3ZSBoYXZlIGFsbHJlYWR5IGJvdW5kIHRvCisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgU29ja2V0IHRoZVNvY2tldDIgPSBuZXcgU29ja2V0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOworICAgICAgICAgICAgdGhlU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICB0aGVTb2NrZXQyLmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gYmluZGluZyB0byBhZGRyZXNzIHRoYXQgaXMgbm90IGF2YWlsYWJsZSIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICB0aGVTb2NrZXQyLmNsb3NlKCk7CisKKyAgICAgICAgLy8gdW5zdXBwb3J0ZWQgU29ja2V0QWRkcmVzcyBzdWJjbGFzcworICAgICAgICB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGVTb2NrZXQuYmluZChuZXcgbXlTb2NrZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gYmluZGluZyB1c2luZyB1bnN1cHBvcnRlZCBTb2NrZXRBZGRyZXNzIHN1YmNsYXNzIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjYmluZChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGJpbmQgb24gcHJveHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmluZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2JpbmRMamF2YV9uZXRfU29ja2V0QWRkcmVzc19Qcm94eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vVGhlIFByb3h5IHdpbGwgbm90IGltcGFjdCBvbiB0aGUgYmluZCBvcGVyYXRpb24uSXQgY2FuIGJlIGFzc2lnbmVkIHdpdGggYW55IGFkZHJlc3MuCiAgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgMCkpOwpAQCAtMTE4NiwxMjI4ICsxNTI1LDEzNjMgQEAKICAgICAgICAgfQogICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjY29ubmVjdChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdExqYXZhX25ldF9Tb2NrZXRBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5lZWRlZCBmb3Igc29tZSB0ZXN0cwotCQljbGFzcyBteVNvY2tldEFkZHJlc3MgZXh0ZW5kcyBTb2NrZXRBZGRyZXNzIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2Nvbm5lY3QoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBhbmQgZnVuY3Rpb25hbGl0eSB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3RMamF2YV9uZXRfU29ja2V0QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBuZWVkZWQgZm9yIHNvbWUgdGVzdHMKKyAgICAgICAgY2xhc3MgbXlTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAKLQkJCXB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQljbGFzcyBTb2NrZXRDbG9zZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBjbGFzcyBTb2NrZXRDbG9zZXIgZXh0ZW5kcyBUaHJlYWQgewogCi0JCQlpbnQgdGltZW91dCA9IDA7CisgICAgICAgICAgICBpbnQgdGltZW91dCA9IDA7CiAKLQkJCVNvY2tldCB0aGVTb2NrZXQgPSBudWxsOworICAgICAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG51bGw7CiAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAodGltZW91dCk7Ci0JCQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgU29ja2V0Q2xvc2VyKGludCB0aW1lb3V0LCBTb2NrZXQgdGhlU29ja2V0KSB7Ci0JCQkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQkJCQl0aGlzLnRoZVNvY2tldCA9IHRoZVNvY2tldDsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIFNvY2tldENsb3NlcihpbnQgdGltZW91dCwgU29ja2V0IHRoZVNvY2tldCkgeworICAgICAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICAgICAgdGhpcy50aGVTb2NrZXQgPSB0aGVTb2NrZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyBzdGFydCBieSB2YWxpZGF0aW5nIHRoZSBlcnJvciBjaGVja3MKLQkJaW50IHBvcnROdW1iZXIgPSBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCk7Ci0JCVNvY2tldCB0aGVTb2NrZXQgPSBudWxsOwotCQlTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbnVsbDsKLQkJU29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbnVsbDsKLQkJU29ja2V0QWRkcmVzcyBub25Db25uZWN0YWJsZUFkZHJlc3MgPSBudWxsOwotCQlTb2NrZXRBZGRyZXNzIG5vblJlYWNoYWJsZUFkZHJlc3MgPSBudWxsOwotCQlTb2NrZXRBZGRyZXNzIGludmFsaWRUeXBlID0gbnVsbDsKLQkJLy8gYnl0ZVtdIHRoZUJ5dGVzID0gey0xLC0xLC0xLC0xfTsKLQkJYnl0ZVtdIHRoZUJ5dGVzID0geyAwLCAwLCAwLCAwIH07Ci0JCXRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJcG9ydE51bWJlcik7Ci0JCW5vbkNvbm5lY3RhYmxlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCS5nZXRCeUFkZHJlc3ModGhlQnl0ZXMpLCBwb3J0TnVtYmVyKTsKLQkJbm9uUmVhY2hhYmxlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCS5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLlJlc29sdmVkTm90RXhpc3RpbmdIb3N0KSwKLQkJCQlwb3J0TnVtYmVyKTsKKyAgICAgICAgLy8gc3RhcnQgYnkgdmFsaWRhdGluZyB0aGUgZXJyb3IgY2hlY2tzCisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBTb2NrZXQgdGhlU29ja2V0ID0gbnVsbDsKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG51bGw7CisgICAgICAgIFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG51bGw7CisgICAgICAgIFNvY2tldEFkZHJlc3Mgbm9uQ29ubmVjdGFibGVBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBub25SZWFjaGFibGVBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBpbnZhbGlkVHlwZSA9IG51bGw7CisgICAgICAgIC8vIGJ5dGVbXSB0aGVCeXRlcyA9IHstMSwtMSwtMSwtMX07CisgICAgICAgIGJ5dGVbXSB0aGVCeXRlcyA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgICB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpOworICAgICAgICBub25Db25uZWN0YWJsZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0QnlBZGRyZXNzKHRoZUJ5dGVzKSwgcG9ydE51bWJlcik7CisgICAgICAgIG5vblJlYWNoYWJsZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0QnlOYW1lKFN1cHBvcnRfQ29uZmlndXJhdGlvbi5SZXNvbHZlZE5vdEV4aXN0aW5nSG9zdCksCisgICAgICAgICAgICAgICAgcG9ydE51bWJlcik7CiAKLQkJaW52YWxpZFR5cGUgPSBuZXcgbXlTb2NrZXRBZGRyZXNzKCk7CisgICAgICAgIGludmFsaWRUeXBlID0gbmV3IG15U29ja2V0QWRkcmVzcygpOwogCi0JCXRyeSB7Ci0JCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQl0aGVTb2NrZXQuY29ubmVjdChudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiBhZnRlciBudWxsIGFkZHJlc3MgcGFzc2VkIGluIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJXcm9uZyBleGNlcHRpb24gbnVsbCBhZGRyZXNzIHBhc3NlZCBpbjogIgotCQkJCQkrIGUudG9TdHJpbmcoKSwgKGUgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pKTsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gYWZ0ZXIgbnVsbCBhZGRyZXNzIHBhc3NlZCBpbiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZXhjZXB0aW9uIG51bGwgYWRkcmVzcyBwYXNzZWQgaW46ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSk7CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJdGhlU29ja2V0LmNvbm5lY3QoaW52YWxpZFR5cGUpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gaW52YWxpZCBzb2NrZXQgYWRkcmVzcyB0eXBlIHBhc3NlZCBpbjogIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkiV3JvbmcgZXhjZXB0aW9uIHdoZW4gd2hlbiBpbnZhbGlkIHNvY2tldCBhZGRyZXNzIHR5cGUgcGFzc2VkIGluOiAiCi0JCQkJCQkJKyBlLnRvU3RyaW5nKCksCi0JCQkJCShlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSk7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KGludmFsaWRUeXBlKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGludmFsaWQgc29ja2V0IGFkZHJlc3MgdHlwZSBwYXNzZWQgaW46ICIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIldyb25nIGV4Y2VwdGlvbiB3aGVuIHdoZW4gaW52YWxpZCBzb2NrZXQgYWRkcmVzcyB0eXBlIHBhc3NlZCBpbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KG5vbkNvbm5lY3RhYmxlQWRkcmVzcyk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBub24gQ29ubmVjdGFibGUgQWRkcmVzcyBwYXNzZWQgaW46ICIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIldyb25nIGV4Y2VwdGlvbiB3aGVuIG5vbiBDb25uZWN0YWJsZSBBZGRyZXNzIHBhc3NlZCBpbjogIgotCQkJCQkJCSsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIENvbm5lY3RFeGNlcHRpb24pKTsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3Qobm9uQ29ubmVjdGFibGVBZGRyZXNzKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIG5vbiBDb25uZWN0YWJsZSBBZGRyZXNzIHBhc3NlZCBpbjogIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZXhjZXB0aW9uIHdoZW4gbm9uIENvbm5lY3RhYmxlIEFkZHJlc3MgcGFzc2VkIGluOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikpOworICAgICAgICB9CiAKLQkJLy8gbm93IHZhbGlkYXRlIHRoYXQgd2UgZ2V0IGEgY29ubmVjdCBleGNlcHRpb24gaWYgd2UgdHJ5IHRvIGNvbm5lY3QgdG8KLQkJLy8gYW4gYWRkcmVzcyBvbiB3aGljaCBub2JvZHkgaXMgbGlzdGVuaW5nCi0JCXRyeSB7Ci0JCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBhZGRyZXNzIG5vYm9keSBsaXN0ZW5pbmcgb246ICIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIldyb25nIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYWRkcmVzcyBub2JvZHkgbGlzdGVuaW5nIG9uOiAiCi0JCQkJCQkJKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikpOwotCQl9CisgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGdldCBhIGNvbm5lY3QgZXhjZXB0aW9uIGlmIHdlIHRyeSB0byBjb25uZWN0IHRvCisgICAgICAgIC8vIGFuIGFkZHJlc3Mgb24gd2hpY2ggbm9ib2R5IGlzIGxpc3RlbmluZworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYWRkcmVzcyBub2JvZHkgbGlzdGVuaW5nIG9uOiAiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJXcm9uZyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGFkZHJlc3Mgbm9ib2R5IGxpc3RlbmluZyBvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIENvbm5lY3RFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBhY3V0YWxseSBjb25uZWN0IHdoZW4gc29tYm9keSBpcyBsaXN0ZW5pbmcKLQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCXNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBjYW4gYWN1dGFsbHkgY29ubmVjdCB3aGVuIHNvbWJvZHkgaXMgbGlzdGVuaW5nCisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKIAotCQkvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBjYW4gYWN1dGFsbHkgY29ubmVjdCB3aGVuIHNvbWJvZHkgaXMgbGlzdGVuaW5nCi0JCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwotCQlzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKLQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7CisgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBhY3V0YWxseSBjb25uZWN0IHdoZW4gc29tYm9keSBpcyBsaXN0ZW5pbmcKKyAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKIAotCQkvLyB2YWxpZGF0ZSB0aGF0IHdoZW4gYSBzb2NrZXQgaXMgY29ubmVjdGVkIHRoYXQgaXQgYW5zd2VycwotCQkvLyBjb3JyZWN0bHkgdG8gcmVsYXRlZCBxdWVyaWVzCi0JCWFzc2VydFRydWUoIlNvY2tldCBkaWQgbm90IHJldHVybmVkIGNvbm5lY3RlZCB3aGVuIGl0IGlzOiAiLCB0aGVTb2NrZXQKLQkJCQkuaXNDb25uZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKCJTb2NrZXQgcmV0dXJuZWQgY2xvc2VkIHdoZW4gaXQgc2hvdWxkIGJlIGNvbm5lY3RlZCAiLAotCQkJCXRoZVNvY2tldC5pc0Nsb3NlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiU29ja2V0IHJldHVybmVkIG5vdCBib3VuZCB3aGVuIGl0IHNob3VsZCBiZTogIiwgdGhlU29ja2V0Ci0JCQkJLmlzQm91bmQoKSk7Ci0JCWFzc2VydEZhbHNlKAotCQkJCSJTb2NrZXQgcmV0dXJuZWQgaW5wdXQgU2h1dGRvd24gd2hlbiBpdCBzaG91bGQgYmUgY29ubmVjdGVkICIsCi0JCQkJdGhlU29ja2V0LmlzSW5wdXRTaHV0ZG93bigpKTsKLQkJYXNzZXJ0RmFsc2UoCi0JCQkJIlNvY2tldCByZXR1cm5lZCBvdXRwdXQgU2h1dGRvd24gd2hlbiBpdCBzaG91bGQgYmUgY29ubmVjdGVkICIsCi0JCQkJdGhlU29ja2V0LmlzT3V0cHV0U2h1dGRvd24oKSk7Ci0JCWFzc2VydFRydWUoIkxvY2FsIHBvcnQgb24gY29ubmVjdGVkIHNvY2tldCB3YXMgMCIsIHRoZVNvY2tldAotCQkJCS5nZXRMb2NhbFBvcnQoKSAhPSAwKTsKLQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCXNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHdoZW4gYSBzb2NrZXQgaXMgY29ubmVjdGVkIHRoYXQgaXQgYW5zd2VycworICAgICAgICAvLyBjb3JyZWN0bHkgdG8gcmVsYXRlZCBxdWVyaWVzCisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBkaWQgbm90IHJldHVybmVkIGNvbm5lY3RlZCB3aGVuIGl0IGlzOiAiLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJTb2NrZXQgcmV0dXJuZWQgY2xvc2VkIHdoZW4gaXQgc2hvdWxkIGJlIGNvbm5lY3RlZCAiLAorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc0Nsb3NlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU29ja2V0IHJldHVybmVkIG5vdCBib3VuZCB3aGVuIGl0IHNob3VsZCBiZTogIiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgLmlzQm91bmQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgICJTb2NrZXQgcmV0dXJuZWQgaW5wdXQgU2h1dGRvd24gd2hlbiBpdCBzaG91bGQgYmUgY29ubmVjdGVkICIsCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzSW5wdXRTaHV0ZG93bigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAgICAgIlNvY2tldCByZXR1cm5lZCBvdXRwdXQgU2h1dGRvd24gd2hlbiBpdCBzaG91bGQgYmUgY29ubmVjdGVkICIsCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzT3V0cHV0U2h1dGRvd24oKSk7CisgICAgICAgIGFzc2VydFRydWUoIkxvY2FsIHBvcnQgb24gY29ubmVjdGVkIHNvY2tldCB3YXMgMCIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5nZXRMb2NhbFBvcnQoKSAhPSAwKTsKKyAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgcmlnaHQgZXhjZXB0aW9uIGlmIHdlIGNvbm5lY3Qgd2hlbiB3ZQotCQkvLyBhcmUgYWxyZWFkeSBjb25uZWN0ZWQKLQkJdHJ5IHsKLQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCXNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKLQkJCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7Ci0JCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJc2VydmVyU29ja2V0LmNsb3NlKCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiB3ZSB0cnkgdG8gY29ubmVjdCBvbiBhIGNvbm5lY3RlZCBzb2NrZXQ6ICIpOworICAgICAgICAvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0IGV4Y2VwdGlvbiBpZiB3ZSBjb25uZWN0IHdoZW4gd2UKKyAgICAgICAgLy8gYXJlIGFscmVhZHkgY29ubmVjdGVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gd2UgdHJ5IHRvIGNvbm5lY3Qgb24gYSBjb25uZWN0ZWQgc29ja2V0OiAiKTsKIAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIldyb25nIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3Rpbmcgb24gc29ja2V0IHRoYXQgaXMgYWxscmVhZHkgY29ubmVjdGVkIgotCQkJCQkJCSsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIFNvY2tldEV4Y2VwdGlvbikpOwotCQkJYXNzZXJ0RmFsc2UoCi0JCQkJCSJXcm9uZyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIG9uIHNvY2tldCB0aGF0IGlzIGFsbHJlYWR5IGNvbm5lY3RlZCIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwKLQkJCQkJKGUgaW5zdGFuY2VvZiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSk7Ci0JCQl0cnkgewotCQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJCXNlcnZlclNvY2tldC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQl9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyBvbiBzb2NrZXQgdGhhdCBpcyBhbGxyZWFkeSBjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgU29ja2V0RXhjZXB0aW9uKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICAgICAgIldyb25nIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3Rpbmcgb24gc29ja2V0IHRoYXQgaXMgYWxscmVhZHkgY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgIH0KIAotCQl9CisgICAgICAgIH0KIAotCQkvLyBub3cgdmFsaWRhdGUgdGhhdCBjb25uZWN0ZWQgc29ja2V0IGNhbiBiZSB1c2VkIHRvIHJlYWQvd3JpdGUKLQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJU29ja2V0IHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQlJbnB1dFN0cmVhbSB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotCQlPdXRwdXRTdHJlYW0gdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCUlucHV0U3RyZWFtIHRoZUlucHV0MiA9IHNlcnZTb2NrLmdldElucHV0U3RyZWFtKCk7Ci0JCU91dHB1dFN0cmVhbSB0aGVPdXRwdXQyID0gdGhlU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAvLyBub3cgdmFsaWRhdGUgdGhhdCBjb25uZWN0ZWQgc29ja2V0IGNhbiBiZSB1c2VkIHRvIHJlYWQvd3JpdGUKKyAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKKyAgICAgICAgU29ja2V0IHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICBJbnB1dFN0cmVhbSB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIElucHV0U3RyZWFtIHRoZUlucHV0MiA9IHNlcnZTb2NrLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSB0aGVPdXRwdXQyID0gdGhlU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOwogCi0JCVN0cmluZyBzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCIpOwotCQl0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKLQkJdGhlT3V0cHV0LmZsdXNoKCk7CisgICAgICAgIFN0cmluZyBzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCIpOworICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgdGhlT3V0cHV0LmZsdXNoKCk7CiAKLQkJVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CiAKLQkJaW50IHRvdGFsQnl0ZXNSZWFkID0gMDsKLQkJYnl0ZVtdIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOwotCQl3aGlsZSAodGhlSW5wdXQuYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQlpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKLQkJCQkJbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7Ci0JCQl0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkOwotCQl9CisgICAgICAgIGludCB0b3RhbEJ5dGVzUmVhZCA9IDA7CisgICAgICAgIGJ5dGVbXSBteUJ5dGVzID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgd2hpbGUgKHRoZUlucHV0LmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHRoZUlucHV0LnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgIG15Qnl0ZXMubGVuZ3RoIC0gdG90YWxCeXRlc1JlYWQpOworICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKKyAgICAgICAgfQogCi0JCVN0cmluZyByZWNlaXZlZFN0cmluZyA9IG5ldyBTdHJpbmcobXlCeXRlcywgMCwgdG90YWxCeXRlc1JlYWQpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgcmVjdiBvbiBzb2NrZXQgY29ubmVjdGVkIHdpdGggdGltZW91dDoiCi0JCQkJKyByZWNlaXZlZFN0cmluZyArICI6IiArIHNlbmRTdHJpbmcsIHJlY2VpdmVkU3RyaW5nCi0JCQkJLmVxdWFscyhzZW5kU3RyaW5nKSk7CisgICAgICAgIFN0cmluZyByZWNlaXZlZFN0cmluZyA9IG5ldyBTdHJpbmcobXlCeXRlcywgMCwgdG90YWxCeXRlc1JlYWQpOworICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZCBub3QgcmVjdiBvbiBzb2NrZXQgY29ubmVjdGVkIHdpdGggdGltZW91dDoiCisgICAgICAgICAgICAgICAgKyByZWNlaXZlZFN0cmluZyArICI6IiArIHNlbmRTdHJpbmcsIHJlY2VpdmVkU3RyaW5nCisgICAgICAgICAgICAgICAgLmVxdWFscyhzZW5kU3RyaW5nKSk7CiAKLQkJc2VuZFN0cmluZyA9IG5ldyBTdHJpbmcoIlNFTkQgLSBUZXN0Iik7Ci0JCXRoZU91dHB1dDIud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKLQkJdGhlT3V0cHV0Mi5mbHVzaCgpOwotCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJTRU5EIC0gVGVzdCIpOworICAgICAgICB0aGVPdXRwdXQyLndyaXRlKHNlbmRTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIHRoZU91dHB1dDIuZmx1c2goKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwogCi0JCXRvdGFsQnl0ZXNSZWFkID0gMDsKLQkJbXlCeXRlcyA9IG5ldyBieXRlWzEwMF07Ci0JCXdoaWxlICh0aGVJbnB1dDIuYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQlpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQyLnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCi0JCQkJCW15Qnl0ZXMubGVuZ3RoIC0gdG90YWxCeXRlc1JlYWQpOwotCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJfQorICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IDA7CisgICAgICAgIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICB3aGlsZSAodGhlSW5wdXQyLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHRoZUlucHV0Mi5yZWFkKG15Qnl0ZXMsIHRvdGFsQnl0ZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICBteUJ5dGVzLmxlbmd0aCAtIHRvdGFsQnl0ZXNSZWFkKTsKKyAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkID0gdG90YWxCeXRlc1JlYWQgKyBieXRlc1JlYWQ7CisgICAgICAgIH0KIAotCQlyZWNlaXZlZFN0cmluZyA9IG5ldyBTdHJpbmcobXlCeXRlcywgMCwgdG90YWxCeXRlc1JlYWQpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3Qgc2VuZCBvbiBzb2NrZXQgY29ubmVjdGVkIHdpdGggdGltZW91dDoiCi0JCQkJKyByZWNlaXZlZFN0cmluZyArICI6IiArIHNlbmRTdHJpbmcsIHJlY2VpdmVkU3RyaW5nCi0JCQkJLmVxdWFscyhzZW5kU3RyaW5nKSk7CisgICAgICAgIHJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBzZW5kIG9uIHNvY2tldCBjb25uZWN0ZWQgd2l0aCB0aW1lb3V0OiIKKyAgICAgICAgICAgICAgICArIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZywgcmVjZWl2ZWRTdHJpbmcKKyAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbmRTdHJpbmcpKTsKIAotCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJc2VydmVyU29ja2V0LmNsb3NlKCk7Ci0JfQorICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNjb25uZWN0KGphdmEubmV0LlNvY2tldEFkZHJlc3MsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3RMamF2YV9uZXRfU29ja2V0QWRkcmVzc0koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2Nvbm5lY3QoamF2YS5uZXQuU29ja2V0QWRkcmVzcywgaW50KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGFuZCBmdW5jdGlvbmFsaXR5IHRlc3RlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9jb25uZWN0TGphdmFfbmV0X1NvY2tldEFkZHJlc3NJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLQkJLy8gbmVlZGVkIGZvciBzb21lIHRlc3RzCi0JCWNsYXNzIG15U29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgeworICAgICAgICAvLyBuZWVkZWQgZm9yIHNvbWUgdGVzdHMKKyAgICAgICAgY2xhc3MgbXlTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAKLQkJCXB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBteVNvY2tldEFkZHJlc3MoKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQljbGFzcyBTb2NrZXRDbG9zZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBjbGFzcyBTb2NrZXRDbG9zZXIgZXh0ZW5kcyBUaHJlYWQgewogCi0JCQlpbnQgdGltZW91dCA9IDA7CisgICAgICAgICAgICBpbnQgdGltZW91dCA9IDA7CiAKLQkJCVNvY2tldCB0aGVTb2NrZXQgPSBudWxsOworICAgICAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG51bGw7CiAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAodGltZW91dCk7Ci0JCQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgU29ja2V0Q2xvc2VyKGludCB0aW1lb3V0LCBTb2NrZXQgdGhlU29ja2V0KSB7Ci0JCQkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQkJCQl0aGlzLnRoZVNvY2tldCA9IHRoZVNvY2tldDsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIFNvY2tldENsb3NlcihpbnQgdGltZW91dCwgU29ja2V0IHRoZVNvY2tldCkgeworICAgICAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICAgICAgdGhpcy50aGVTb2NrZXQgPSB0aGVTb2NrZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQljbGFzcyBTb2NrZXRDb25uZWN0b3IgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBjbGFzcyBTb2NrZXRDb25uZWN0b3IgZXh0ZW5kcyBUaHJlYWQgewogCi0JCQlpbnQgdGltZW91dCA9IDA7CisgICAgICAgICAgICBpbnQgdGltZW91dCA9IDA7CiAKLQkJCVNvY2tldCB0aGVTb2NrZXQgPSBudWxsOworICAgICAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG51bGw7CiAKLQkJCVNvY2tldEFkZHJlc3MgYWRkcmVzcyA9IG51bGw7CisgICAgICAgICAgICBTb2NrZXRBZGRyZXNzIGFkZHJlc3MgPSBudWxsOwogCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhlU29ja2V0LmNvbm5lY3QoYWRkcmVzcywgdGltZW91dCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdChhZGRyZXNzLCB0aW1lb3V0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgU29ja2V0Q29ubmVjdG9yKGludCB0aW1lb3V0LCBTb2NrZXQgdGhlU29ja2V0LAotCQkJCQlTb2NrZXRBZGRyZXNzIGFkZHJlc3MpIHsKLQkJCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQkJCXRoaXMudGhlU29ja2V0ID0gdGhlU29ja2V0OwotCQkJCXRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBTb2NrZXRDb25uZWN0b3IoaW50IHRpbWVvdXQsIFNvY2tldCB0aGVTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgIFNvY2tldEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICAgICAgdGhpcy50aGVTb2NrZXQgPSB0aGVTb2NrZXQ7CisgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIHN0YXJ0IGJ5IHZhbGlkYXRpbmcgdGhlIGVycm9yIGNoZWNrcwotCQlpbnQgcG9ydE51bWJlciA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKLQkJU29ja2V0IHRoZVNvY2tldCA9IG51bGw7Ci0JCVNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBudWxsOwotCQlTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBudWxsOwotCQlTb2NrZXRBZGRyZXNzIG5vbkNvbm5lY3RhYmxlQWRkcmVzcyA9IG51bGw7Ci0JCVNvY2tldEFkZHJlc3Mgbm9uUmVhY2hhYmxlQWRkcmVzcyA9IG51bGw7Ci0JCVNvY2tldEFkZHJlc3Mgbm9uTGlzdGVuaW5nQWRkcmVzcyA9IG51bGw7Ci0JCVNvY2tldEFkZHJlc3MgaW52YWxpZFR5cGUgPSBudWxsOwotCQlieXRlW10gdGhlQnl0ZXMgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgICAgLy8gc3RhcnQgYnkgdmFsaWRhdGluZyB0aGUgZXJyb3IgY2hlY2tzCisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICBTb2NrZXQgdGhlU29ja2V0ID0gbnVsbDsKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG51bGw7CisgICAgICAgIFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG51bGw7CisgICAgICAgIFNvY2tldEFkZHJlc3Mgbm9uQ29ubmVjdGFibGVBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBub25SZWFjaGFibGVBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBub25MaXN0ZW5pbmdBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBpbnZhbGlkVHlwZSA9IG51bGw7CisgICAgICAgIGJ5dGVbXSB0aGVCeXRlcyA9IHsgMCwgMCwgMCwgMCB9OwogCi0JCXRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJcG9ydE51bWJlcik7Ci0JCW5vbkNvbm5lY3RhYmxlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCS5nZXRCeUFkZHJlc3ModGhlQnl0ZXMpLCBwb3J0TnVtYmVyKTsKLQkJbm9uUmVhY2hhYmxlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcwotCQkJCS5nZXRCeU5hbWUoU3VwcG9ydF9Db25maWd1cmF0aW9uLlJlc29sdmVkTm90RXhpc3RpbmdIb3N0KSwKLQkJCQlwb3J0TnVtYmVyKTsKLQkJLy8gbWFrZSBzdXJlIHdlIGdldCBhbm90aGVyIHBvcnQKLQkJVGhyZWFkLnNsZWVwKDcwMDApOwotCQlub25MaXN0ZW5pbmdBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCVN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCWludmFsaWRUeXBlID0gbmV3IG15U29ja2V0QWRkcmVzcygpOworICAgICAgICB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgIHBvcnROdW1iZXIpOworICAgICAgICBub25Db25uZWN0YWJsZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0QnlBZGRyZXNzKHRoZUJ5dGVzKSwgcG9ydE51bWJlcik7CisgICAgICAgIG5vblJlYWNoYWJsZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAuZ2V0QnlOYW1lKFN1cHBvcnRfQ29uZmlndXJhdGlvbi5SZXNvbHZlZE5vdEV4aXN0aW5nSG9zdCksCisgICAgICAgICAgICAgICAgcG9ydE51bWJlcik7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBnZXQgYW5vdGhlciBwb3J0CisgICAgICAgIFRocmVhZC5zbGVlcCg3MDAwKTsKKyAgICAgICAgbm9uTGlzdGVuaW5nQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOworICAgICAgICBpbnZhbGlkVHlwZSA9IG5ldyBteVNvY2tldEFkZHJlc3MoKTsKIAotCQl0cnkgewotCQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcywgLTEwMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gYWZ0ZXIgbmVnYXRpdmUgdGltZW91dCBwYXNzZWQgaW4iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIldyb25nIGV4Y2VwdGlvbiB3aGVuIG5lZ2F0aXZlIHRpbWVvdXQgcGFzc2VkIGluOiAiCi0JCQkJCSsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOwotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzLCAtMTAwKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiBhZnRlciBuZWdhdGl2ZSB0aW1lb3V0IHBhc3NlZCBpbiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZXhjZXB0aW9uIHdoZW4gbmVnYXRpdmUgdGltZW91dCBwYXNzZWQgaW46ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSk7CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJdGhlU29ja2V0LmNvbm5lY3QobnVsbCwgMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gYWZ0ZXIgbnVsbCBhZGRyZXNzIHBhc3NlZCBpbiIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgZXhjZXB0aW9uIG51bGwgYWRkcmVzcyBwYXNzZWQgaW46ICIKLQkJCQkJKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSk7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KG51bGwsIDApOworICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIGFmdGVyIG51bGwgYWRkcmVzcyBwYXNzZWQgaW4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGV4Y2VwdGlvbiBudWxsIGFkZHJlc3MgcGFzc2VkIGluOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpOworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KGludmFsaWRUeXBlLCAxMDAwMDApOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gaW52YWxpZCBzb2NrZXQgYWRkcmVzcyB0eXBlIHBhc3NlZCBpbjogIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKAotCQkJCQkiV3JvbmcgZXhjZXB0aW9uIHdoZW4gd2hlbiBpbnZhbGlkIHNvY2tldCBhZGRyZXNzIHR5cGUgcGFzc2VkIGluOiAiCi0JCQkJCQkJKyBlLnRvU3RyaW5nKCksCi0JCQkJCShlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSk7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KGludmFsaWRUeXBlLCAxMDAwMDApOworICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gaW52YWxpZCBzb2NrZXQgYWRkcmVzcyB0eXBlIHBhc3NlZCBpbjogIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZXhjZXB0aW9uIHdoZW4gd2hlbiBpbnZhbGlkIHNvY2tldCBhZGRyZXNzIHR5cGUgcGFzc2VkIGluOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSk7CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJdGhlU29ja2V0LmNvbm5lY3Qobm9uQ29ubmVjdGFibGVBZGRyZXNzLCAxMDAwMDApOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gbm9uIENvbm5lY3RhYmxlIEFkZHJlc3MgcGFzc2VkIGluOiAiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJXcm9uZyBleGNlcHRpb24gd2hlbiBub24gQ29ubmVjdGFibGUgQWRkcmVzcyBwYXNzZWQgaW46ICIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwgKGUgaW5zdGFuY2VvZiBTb2NrZXRFeGNlcHRpb24pKTsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3Qobm9uQ29ubmVjdGFibGVBZGRyZXNzLCAxMDAwMDApOworICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gbm9uIENvbm5lY3RhYmxlIEFkZHJlc3MgcGFzc2VkIGluOiAiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJXcm9uZyBleGNlcHRpb24gd2hlbiBub24gQ29ubmVjdGFibGUgQWRkcmVzcyBwYXNzZWQgaW46ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSwgKGUgaW5zdGFuY2VvZiBTb2NrZXRFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGdldCBhIGNvbm5lY3QgZXhjZXB0aW9uIGlmIHdlIHRyeSB0byBjb25uZWN0IHRvCi0JCS8vIGFuIGFkZHJlc3Mgb24gd2hpY2ggbm9ib2R5IGlzIGxpc3RlbmluZwotCQl0cnkgewotCQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcywgMCk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCWZhaWwoIk5vIHRpbWVvdXQ6Tm8gZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBhZGRyZXNzIG5vYm9keSBsaXN0ZW5pbmcgb246ICIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIk5vIHRpbWVvdXQ6V3JvbmcgZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBhZGRyZXNzIG5vYm9keSBsaXN0ZW5pbmcgb246ICIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwgKGUgaW5zdGFuY2VvZiBDb25uZWN0RXhjZXB0aW9uKSk7Ci0JCX0KKyAgICAgICAgLy8gbm93IHZhbGlkYXRlIHRoYXQgd2UgZ2V0IGEgY29ubmVjdCBleGNlcHRpb24gaWYgd2UgdHJ5IHRvIGNvbm5lY3QgdG8KKyAgICAgICAgLy8gYW4gYWRkcmVzcyBvbiB3aGljaCBub2JvZHkgaXMgbGlzdGVuaW5nCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzLCAwKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgZmFpbCgiTm8gdGltZW91dDpObyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGFkZHJlc3Mgbm9ib2R5IGxpc3RlbmluZyBvbjogIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiTm8gdGltZW91dDpXcm9uZyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGFkZHJlc3Mgbm9ib2R5IGxpc3RlbmluZyBvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIENvbm5lY3RFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBhY3V0YWxseSBjb25uZWN0IHdoZW4gc29tYm9keSBpcyBsaXN0ZW5pbmcKLQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzLCAwKTsKLQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCXNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBjYW4gYWN1dGFsbHkgY29ubmVjdCB3aGVuIHNvbWJvZHkgaXMgbGlzdGVuaW5nCisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcywgMCk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKIAotCQkvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgYSBjb25uZWN0IGV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8gY29ubmVjdCB0bwotCQkvLyBhbiBhZGRyZXNzIG9uIHdoaWNoIG5vYm9keSBpcyBsaXN0ZW5pbmcKLQkJdHJ5IHsKLQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KG5vbkxpc3RlbmluZ0FkZHJlc3MsIDEwMDAwMCk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYWRkcmVzcyBub2JvZHkgbGlzdGVuaW5nIG9uOiAiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJXcm9uZyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGFkZHJlc3Mgbm9ib2R5IGxpc3RlbmluZyBvbjogIgotCQkJCQkJCSsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIENvbm5lY3RFeGNlcHRpb24pKTsKLQkJfQorICAgICAgICAvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgYSBjb25uZWN0IGV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8gY29ubmVjdCB0bworICAgICAgICAvLyBhbiBhZGRyZXNzIG9uIHdoaWNoIG5vYm9keSBpcyBsaXN0ZW5pbmcKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KG5vbkxpc3RlbmluZ0FkZHJlc3MsIDEwMDAwMCk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYWRkcmVzcyBub2JvZHkgbGlzdGVuaW5nIG9uOiAiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICJXcm9uZyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGFkZHJlc3Mgbm9ib2R5IGxpc3RlbmluZyBvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIENvbm5lY3RFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGdldCBhIGludGVycnVwdGVkIGV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8gY29ubmVjdAotCQkvLyB0byBhbiBhZGRyZXNzIG9uIHdoaWNoIG5vYm9keSBpcyBhY2NlcHRpbmcgY29ubmVjdGlvbnMgYW5kIHRoZQotCQkvLyB0aW1lb3V0IGV4cGlyZWQKLQkJdHJ5IHsKLQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KG5vblJlYWNoYWJsZUFkZHJlc3MsIDIwMCk7Ci0JCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCWZhaWwoIk5vIGludGVycnVwdGVkIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYWRkcmVzcyBub2JvZHkgbGlzdGVuaW5nIG9uIHdpdGggc2hvcnQgdGltZW91dCAyMDA6ICIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIldyb25nIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYWRkcmVzcyBub2JvZHkgbGlzdGVuaW5nIG9uIHdpdGggc2hvcnQgdGltZW91dCAyMDA6ICIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwKLQkJCQkJKGUgaW5zdGFuY2VvZiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSk7Ci0JCX0KKyAgICAgICAgLy8gbm93IHZhbGlkYXRlIHRoYXQgd2UgZ2V0IGEgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIGlmIHdlIHRyeSB0byBjb25uZWN0CisgICAgICAgIC8vIHRvIGFuIGFkZHJlc3Mgb24gd2hpY2ggbm9ib2R5IGlzIGFjY2VwdGluZyBjb25uZWN0aW9ucyBhbmQgdGhlCisgICAgICAgIC8vIHRpbWVvdXQgZXhwaXJlZAorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3Qobm9uUmVhY2hhYmxlQWRkcmVzcywgMjAwKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgZmFpbCgiTm8gaW50ZXJydXB0ZWQgZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBhZGRyZXNzIG5vYm9keSBsaXN0ZW5pbmcgb24gd2l0aCBzaG9ydCB0aW1lb3V0IDIwMDogIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBhZGRyZXNzIG5vYm9keSBsaXN0ZW5pbmcgb24gd2l0aCBzaG9ydCB0aW1lb3V0IDIwMDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGdldCBhIGludGVycnVwdGVkIGV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8gY29ubmVjdAotCQkvLyB0byBhbiBhZGRyZXNzIG9uIHdoaWNoIG5vYm9keSBpcyBhY2NlcHRpbmcgY29ubmVjdGlvbnMgYW5kIHRoZQotCQkvLyB0aW1lb3V0IGV4cGlyZWQKLQkJdHJ5IHsKLQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KG5vblJlYWNoYWJsZUFkZHJlc3MsIDQwKTsKLQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJZmFpbCgiTm8gaW50ZXJydXB0ZWQgZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBhZGRyZXNzIG5vYm9keSBsaXN0ZW5pbmcgb24gd2l0aCBzaG9ydCB0aW1lb3V0IDQwOiAiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoCi0JCQkJCSJXcm9uZyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGFkZHJlc3Mgbm9ib2R5IGxpc3RlbmluZyBvbiB3aXRoIHNob3J0IHRpbWVvdXQgNDA6ICIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwKLQkJCQkJKGUgaW5zdGFuY2VvZiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSk7Ci0JCX0KKyAgICAgICAgLy8gbm93IHZhbGlkYXRlIHRoYXQgd2UgZ2V0IGEgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIGlmIHdlIHRyeSB0byBjb25uZWN0CisgICAgICAgIC8vIHRvIGFuIGFkZHJlc3Mgb24gd2hpY2ggbm9ib2R5IGlzIGFjY2VwdGluZyBjb25uZWN0aW9ucyBhbmQgdGhlCisgICAgICAgIC8vIHRpbWVvdXQgZXhwaXJlZAorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3Qobm9uUmVhY2hhYmxlQWRkcmVzcywgNDApOworICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICBmYWlsKCJObyBpbnRlcnJ1cHRlZCBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGFkZHJlc3Mgbm9ib2R5IGxpc3RlbmluZyBvbiB3aXRoIHNob3J0IHRpbWVvdXQgNDA6ICIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgIldyb25nIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gYWRkcmVzcyBub2JvZHkgbGlzdGVuaW5nIG9uIHdpdGggc2hvcnQgdGltZW91dCA0MDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pKTsKKyAgICAgICAgfQogCi0JCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBhY3V0YWxseSBjb25uZWN0IHdoZW4gc29tYm9keSBpcyBsaXN0ZW5pbmcKLQkJbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyCi0JCQkJLmdldE5leHRQb3J0KCkpOwotCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKLQkJc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7Ci0JCXRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MsIDEwMDAwMCk7CisgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBhY3V0YWxseSBjb25uZWN0IHdoZW4gc29tYm9keSBpcyBsaXN0ZW5pbmcKKyAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyCisgICAgICAgICAgICAgICAgLmdldE5leHRQb3J0KCkpOworICAgICAgICB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MsIDEwMDAwMCk7CiAKLQkJLy8gdmFsaWRhdGUgdGhhdCB3aGVuIGEgc29ja2V0IGlzIGNvbm5lY3RlZCB0aGF0IGl0IGFuc3dlcnMKLQkJLy8gY29ycmVjdGx5IHRvIHJlbGF0ZWQgcXVlcmllcwotCQlhc3NlcnRUcnVlKCJTb2NrZXQgZGlkIG5vdCByZXR1cm5lZCBjb25uZWN0ZWQgd2hlbiBpdCBpczogIiwgdGhlU29ja2V0Ci0JCQkJLmlzQ29ubmVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSgiU29ja2V0IHJldHVybmVkIGNsb3NlZCB3aGVuIGl0IHNob3VsZCBiZSBjb25uZWN0ZWQgIiwKLQkJCQl0aGVTb2NrZXQuaXNDbG9zZWQoKSk7Ci0JCWFzc2VydFRydWUoIlNvY2tldCByZXR1cm5lZCBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmU6ICIsIHRoZVNvY2tldAotCQkJCS5pc0JvdW5kKCkpOwotCQlhc3NlcnRGYWxzZSgKLQkJCQkiU29ja2V0IHJldHVybmVkIGlucHV0IFNodXRkb3duIHdoZW4gaXQgc2hvdWxkIGJlIGNvbm5lY3RlZCAiLAotCQkJCXRoZVNvY2tldC5pc0lucHV0U2h1dGRvd24oKSk7Ci0JCWFzc2VydEZhbHNlKAotCQkJCSJTb2NrZXQgcmV0dXJuZWQgb3V0cHV0IFNodXRkb3duIHdoZW4gaXQgc2hvdWxkIGJlIGNvbm5lY3RlZCAiLAotCQkJCXRoZVNvY2tldC5pc091dHB1dFNodXRkb3duKCkpOwotCQlhc3NlcnRUcnVlKCJMb2NhbCBwb3J0IG9uIGNvbm5lY3RlZCBzb2NrZXQgd2FzIDAiLCB0aGVTb2NrZXQKLQkJCQkuZ2V0TG9jYWxQb3J0KCkgIT0gMCk7Ci0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB3aGVuIGEgc29ja2V0IGlzIGNvbm5lY3RlZCB0aGF0IGl0IGFuc3dlcnMKKyAgICAgICAgLy8gY29ycmVjdGx5IHRvIHJlbGF0ZWQgcXVlcmllcworICAgICAgICBhc3NlcnRUcnVlKCJTb2NrZXQgZGlkIG5vdCByZXR1cm5lZCBjb25uZWN0ZWQgd2hlbiBpdCBpczogIiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgLmlzQ29ubmVjdGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiU29ja2V0IHJldHVybmVkIGNsb3NlZCB3aGVuIGl0IHNob3VsZCBiZSBjb25uZWN0ZWQgIiwKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNDbG9zZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCByZXR1cm5lZCBub3QgYm91bmQgd2hlbiBpdCBzaG91bGQgYmU6ICIsIHRoZVNvY2tldAorICAgICAgICAgICAgICAgIC5pc0JvdW5kKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICAiU29ja2V0IHJldHVybmVkIGlucHV0IFNodXRkb3duIHdoZW4gaXQgc2hvdWxkIGJlIGNvbm5lY3RlZCAiLAorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc0lucHV0U2h1dGRvd24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgICJTb2NrZXQgcmV0dXJuZWQgb3V0cHV0IFNodXRkb3duIHdoZW4gaXQgc2hvdWxkIGJlIGNvbm5lY3RlZCAiLAorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc091dHB1dFNodXRkb3duKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJMb2NhbCBwb3J0IG9uIGNvbm5lY3RlZCBzb2NrZXQgd2FzIDAiLCB0aGVTb2NrZXQKKyAgICAgICAgICAgICAgICAuZ2V0TG9jYWxQb3J0KCkgIT0gMCk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKIAotCQkvLyBub3cgdmFsaWRhdGUgdGhhdCB3ZSBnZXQgdGhlIHJpZ2h0IGV4Y2VwdGlvbiBpZiB3ZSBjb25uZWN0IHdoZW4gd2UKLQkJLy8gYXJlIGFscmVhZHkgY29ubmVjdGVkCi0JCXRyeSB7Ci0JCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCVN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCQlzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKLQkJCXRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MsIDEwMDAwMCk7Ci0JCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzLCAxMDAwMDApOwotCQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIHdlIHRyeSB0byBjb25uZWN0IG9uIGEgY29ubmVjdGVkIHNvY2tldDogIik7CisgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGdldCB0aGUgcmlnaHQgZXhjZXB0aW9uIGlmIHdlIGNvbm5lY3Qgd2hlbiB3ZQorICAgICAgICAvLyBhcmUgYWxyZWFkeSBjb25uZWN0ZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKKyAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcywgMTAwMDAwKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MsIDEwMDAwMCk7CisgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gd2UgdHJ5IHRvIGNvbm5lY3Qgb24gYSBjb25uZWN0ZWQgc29ja2V0OiAiKTsKIAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJIldyb25nIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3Rpbmcgb24gc29ja2V0IHRoYXQgaXMgYWxscmVhZHkgY29ubmVjdGVkIgotCQkJCQkJCSsgZS50b1N0cmluZygpLCAoZSBpbnN0YW5jZW9mIFNvY2tldEV4Y2VwdGlvbikpOwotCQkJYXNzZXJ0RmFsc2UoCi0JCQkJCSJXcm9uZyBleGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIG9uIHNvY2tldCB0aGF0IGlzIGFsbHJlYWR5IGNvbm5lY3RlZCIKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwKLQkJCQkJKGUgaW5zdGFuY2VvZiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSk7Ci0JCQl0cnkgewotCQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJCXNlcnZlclNvY2tldC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQl9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyBvbiBzb2NrZXQgdGhhdCBpcyBhbGxyZWFkeSBjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksIChlIGluc3RhbmNlb2YgU29ja2V0RXhjZXB0aW9uKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICAgICAgIldyb25nIGV4Y2VwdGlvbiB3aGVuIGNvbm5lY3Rpbmcgb24gc29ja2V0IHRoYXQgaXMgYWxscmVhZHkgY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgIH0KIAotCQl9CisgICAgICAgIH0KIAotCQkvLyBub3cgdmFsaWRhdGUgdGhhdCBjb25uZWN0ZWQgc29ja2V0IGNhbiBiZSB1c2VkIHRvIHJlYWQvd3JpdGUKLQkJbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyCi0JCQkJLmdldE5leHRQb3J0KCkpOwotCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKLQkJc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7Ci0JCXRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MsIDEwMDAwMCk7Ci0JCVNvY2tldCBzZXJ2U29jayA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKLQkJSW5wdXRTdHJlYW0gdGhlSW5wdXQgPSB0aGVTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJT3V0cHV0U3RyZWFtIHRoZU91dHB1dCA9IHNlcnZTb2NrLmdldE91dHB1dFN0cmVhbSgpOwotCQlJbnB1dFN0cmVhbSB0aGVJbnB1dDIgPSBzZXJ2U29jay5nZXRJbnB1dFN0cmVhbSgpOwotCQlPdXRwdXRTdHJlYW0gdGhlT3V0cHV0MiA9IHRoZVNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgLy8gbm93IHZhbGlkYXRlIHRoYXQgY29ubmVjdGVkIHNvY2tldCBjYW4gYmUgdXNlZCB0byByZWFkL3dyaXRlCisgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgorICAgICAgICAgICAgICAgIC5nZXROZXh0UG9ydCgpKTsKKyAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOworICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzLCAxMDAwMDApOworICAgICAgICBTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIElucHV0U3RyZWFtIHRoZUlucHV0ID0gdGhlU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSB0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gdGhlSW5wdXQyID0gc2VydlNvY2suZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHRoZU91dHB1dDIgPSB0aGVTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CiAKLQkJU3RyaW5nIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJUZXN0Iik7Ci0JCXRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQl0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgU3RyaW5nIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJUZXN0Iik7CisgICAgICAgIHRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKIAotCQlpbnQgdG90YWxCeXRlc1JlYWQgPSAwOwotCQlieXRlW10gbXlCeXRlcyA9IG5ldyBieXRlWzEwMF07Ci0JCXdoaWxlICh0aGVJbnB1dC5hdmFpbGFibGUoKSA+IDApIHsKLQkJCWludCBieXRlc1JlYWQgPSB0aGVJbnB1dC5yZWFkKG15Qnl0ZXMsIHRvdGFsQnl0ZXNSZWFkLAotCQkJCQlteUJ5dGVzLmxlbmd0aCAtIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCXRvdGFsQnl0ZXNSZWFkID0gdG90YWxCeXRlc1JlYWQgKyBieXRlc1JlYWQ7Ci0JCX0KKyAgICAgICAgaW50IHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgYnl0ZVtdIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICB3aGlsZSAodGhlSW5wdXQuYXZhaWxhYmxlKCkgPiAwKSB7CisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkOworICAgICAgICB9CiAKLQkJU3RyaW5nIHJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCByZWN2IG9uIHNvY2tldCBjb25uZWN0ZWQgd2l0aCB0aW1lb3V0OiIKLQkJCQkrIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZywgcmVjZWl2ZWRTdHJpbmcKLQkJCQkuZXF1YWxzKHNlbmRTdHJpbmcpKTsKKyAgICAgICAgU3RyaW5nIHJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCByZWN2IG9uIHNvY2tldCBjb25uZWN0ZWQgd2l0aCB0aW1lb3V0OiIKKyAgICAgICAgICAgICAgICArIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZywgcmVjZWl2ZWRTdHJpbmcKKyAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbmRTdHJpbmcpKTsKIAotCQlzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiU0VORCAtIFRlc3QiKTsKLQkJdGhlT3V0cHV0Mi53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQl0aGVPdXRwdXQyLmZsdXNoKCk7CisgICAgICAgIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJTRU5EIC0gVGVzdCIpOworICAgICAgICB0aGVPdXRwdXQyLndyaXRlKHNlbmRTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIHRoZU91dHB1dDIuZmx1c2goKTsKIAotCQl0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0JCW15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOwotCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCXdoaWxlICh0aGVJbnB1dDIuYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQlpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQyLnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCi0JCQkJCW15Qnl0ZXMubGVuZ3RoIC0gdG90YWxCeXRlc1JlYWQpOwotCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJfQorICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IDA7CisgICAgICAgIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIHdoaWxlICh0aGVJbnB1dDIuYXZhaWxhYmxlKCkgPiAwKSB7CisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQyLnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgIG15Qnl0ZXMubGVuZ3RoIC0gdG90YWxCeXRlc1JlYWQpOworICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKKyAgICAgICAgfQogCi0JCXJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBzZW5kIG9uIHNvY2tldCBjb25uZWN0ZWQgd2l0aCB0aW1lb3V0OiIKLQkJCQkrIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZywgcmVjZWl2ZWRTdHJpbmcKLQkJCQkuZXF1YWxzKHNlbmRTdHJpbmcpKTsKKyAgICAgICAgcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IHNlbmQgb24gc29ja2V0IGNvbm5lY3RlZCB3aXRoIHRpbWVvdXQ6IgorICAgICAgICAgICAgICAgICsgcmVjZWl2ZWRTdHJpbmcgKyAiOiIgKyBzZW5kU3RyaW5nLCByZWNlaXZlZFN0cmluZworICAgICAgICAgICAgICAgIC5lcXVhbHMoc2VuZFN0cmluZykpOwogCi0JCXRoZVNvY2tldC5jbG9zZSgpOwotCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwogCi0JCS8vIG5vdyB0cnkgdG8gc2V0IG9wdGlvbnMgd2hpbGUgd2UgYXJlIGNvbm5lY3RpbmcKLQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQlTb2NrZXRDb25uZWN0b3IgY29ubmVjdG9yID0gbmV3IFNvY2tldENvbm5lY3Rvcig1MDAwLCB0aGVTb2NrZXQsCi0JCQkJbm9uUmVhY2hhYmxlQWRkcmVzcyk7Ci0JCWNvbm5lY3Rvci5zdGFydCgpOwotCQl0aGVTb2NrZXQuc2V0U29UaW1lb3V0KDEwMCk7Ci0JCVRocmVhZC5zbGVlcCgxMCk7Ci0JCWFzc2VydEVxdWFscygiU29ja2V0IG9wdGlvbiBub3Qgc2V0IGR1cmluZyBjb25uZWN0OiAxMCAiLCAxMDAsCi0JCQkJdGhlU29ja2V0LmdldFNvVGltZW91dCgpKTsKLQkJVGhyZWFkLnNsZWVwKDUwKTsKLQkJdGhlU29ja2V0LnNldFNvVGltZW91dCgyMDApOwotCQlhc3NlcnRFcXVhbHMoIlNvY2tldCBvcHRpb24gbm90IHNldCBkdXJpbmcgY29ubmVjdDogNTAgIiwgMjAwLAotCQkJCXRoZVNvY2tldC5nZXRTb1RpbWVvdXQoKSk7Ci0JCVRocmVhZC5zbGVlcCg1MDAwKTsKLQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JfQorICAgICAgICAvLyBub3cgdHJ5IHRvIHNldCBvcHRpb25zIHdoaWxlIHdlIGFyZSBjb25uZWN0aW5nCisgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgU29ja2V0Q29ubmVjdG9yIGNvbm5lY3RvciA9IG5ldyBTb2NrZXRDb25uZWN0b3IoNTAwMCwgdGhlU29ja2V0LAorICAgICAgICAgICAgICAgIG5vblJlYWNoYWJsZUFkZHJlc3MpOworICAgICAgICBjb25uZWN0b3Iuc3RhcnQoKTsKKyAgICAgICAgdGhlU29ja2V0LnNldFNvVGltZW91dCgxMDApOworICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNvY2tldCBvcHRpb24gbm90IHNldCBkdXJpbmcgY29ubmVjdDogMTAgIiwgMTAwLAorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5nZXRTb1RpbWVvdXQoKSk7CisgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7CisgICAgICAgIHRoZVNvY2tldC5zZXRTb1RpbWVvdXQoMjAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTb2NrZXQgb3B0aW9uIG5vdCBzZXQgZHVyaW5nIGNvbm5lY3Q6IDUwICIsIDIwMCwKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuZ2V0U29UaW1lb3V0KCkpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjaXNJbnB1dFNodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2lzSW5wdXRTaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCVNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJU29ja2V0IHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQlJbnB1dFN0cmVhbSB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotCQlPdXRwdXRTdHJlYW0gdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNpc0lucHV0U2h1dGRvd24oKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzSW5wdXRTaHV0ZG93biIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNJbnB1dFNodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKKyAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MpOworICAgICAgICBTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIElucHV0U3RyZWFtIHRoZUlucHV0ID0gdGhlU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSB0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKIAotCQkvLyBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIgd2l0aCBuZXdseSBjb25uZWN0ZWQgc29ja2V0Ci0JCWFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkIGlucHV0IHNodXRkb3duIHdoZW4gaXQgc2hvdWxkIG5vdCBoYXZlIiwKLQkJCQl0aGVTb2NrZXQuaXNJbnB1dFNodXRkb3duKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIgd2l0aCBuZXdseSBjb25uZWN0ZWQgc29ja2V0CisgICAgICAgIGFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkIGlucHV0IHNodXRkb3duIHdoZW4gaXQgc2hvdWxkIG5vdCBoYXZlIiwKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuaXNJbnB1dFNodXRkb3duKCkpOwogCi0JCS8vIHNodXRkb3duIHRoZSBvdXRwdXQKLQkJdGhlU29ja2V0LnNodXRkb3duSW5wdXQoKTsKKyAgICAgICAgLy8gc2h1dGRvd24gdGhlIG91dHB1dAorICAgICAgICB0aGVTb2NrZXQuc2h1dGRvd25JbnB1dCgpOwogCi0JCS8vIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlciBvbmNlIGl0IGlzIHNodXQgZG93bgotCQlhc3NlcnRUcnVlKAotCQkJCSJTb2NrZXQgaW5kaWNhdGVkIGlucHV0IHdhcyBOT1Qgc2h1dGRvd24gd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIiwKLQkJCQl0aGVTb2NrZXQuaXNJbnB1dFNodXRkb3duKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIgb25jZSBpdCBpcyBzaHV0IGRvd24KKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiU29ja2V0IGluZGljYXRlZCBpbnB1dCB3YXMgTk9UIHNodXRkb3duIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbiIsCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmlzSW5wdXRTaHV0ZG93bigpKTsKIAotCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKIAotCQkvLyBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIgZm9yIGNsb3NlZCBzb2NrZXRzCi0JCWFzc2VydEZhbHNlKAotCQkJCSJTb2NrZXQgaW5kaWNhdGVkIGlucHV0IHdhcyBzaHV0ZG93biB3aGVuIHNvY2tldCB3YXMgY2xvc2VkIiwKLQkJCQlzZXJ2U29jay5pc0lucHV0U2h1dGRvd24oKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlciBmb3IgY2xvc2VkIHNvY2tldHMKKyAgICAgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAgICAgIlNvY2tldCBpbmRpY2F0ZWQgaW5wdXQgd2FzIHNodXRkb3duIHdoZW4gc29ja2V0IHdhcyBjbG9zZWQiLAorICAgICAgICAgICAgICAgIHNlcnZTb2NrLmlzSW5wdXRTaHV0ZG93bigpKTsKIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2lzT3V0cHV0U2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfaXNPdXRwdXRTaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUluZXRTb2NrZXRBZGRyZXNzIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCVNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJU29ja2V0IHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQlJbnB1dFN0cmVhbSB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotCQlPdXRwdXRTdHJlYW0gdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNpc091dHB1dFNodXRkb3duKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc091dHB1dFNodXRkb3duIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9pc091dHB1dFNodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcworICAgICAgICAgICAgICAgIC5nZXRMb2NhbEhvc3QoKSwgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKKyAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgIHRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MpOworICAgICAgICBTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIElucHV0U3RyZWFtIHRoZUlucHV0ID0gdGhlU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSB0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKIAotCQkvLyBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIgd2l0aCBuZXdseSBjb25uZWN0ZWQgc29ja2V0Ci0JCWFzc2VydEZhbHNlKCJTb2NrZXQgaW5kaWNhdGVkIG91dHB1dCBzaHV0ZG93biB3aGVuIGl0IHNob3VsZCBub3QgaGF2ZSIsCi0JCQkJc2VydlNvY2suaXNPdXRwdXRTaHV0ZG93bigpKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyIHdpdGggbmV3bHkgY29ubmVjdGVkIHNvY2tldAorICAgICAgICBhc3NlcnRGYWxzZSgiU29ja2V0IGluZGljYXRlZCBvdXRwdXQgc2h1dGRvd24gd2hlbiBpdCBzaG91bGQgbm90IGhhdmUiLAorICAgICAgICAgICAgICAgIHNlcnZTb2NrLmlzT3V0cHV0U2h1dGRvd24oKSk7CiAKLQkJLy8gc2h1dGRvd24gdGhlIG91dHB1dAotCQlzZXJ2U29jay5zaHV0ZG93bk91dHB1dCgpOworICAgICAgICAvLyBzaHV0ZG93biB0aGUgb3V0cHV0CisgICAgICAgIHNlcnZTb2NrLnNodXRkb3duT3V0cHV0KCk7CiAKLQkJLy8gbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyIG9uY2UgaXQgaXMgc2h1dCBkb3duCi0JCWFzc2VydFRydWUoCi0JCQkJIlNvY2tldCBpbmRpY2F0ZWQgb3V0cHV0IHdhcyBOT1Qgc2h1dGRvd24gd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIiwKLQkJCQlzZXJ2U29jay5pc091dHB1dFNodXRkb3duKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZ2V0IHRoZSByaWdodCBhbnN3ZXIgb25jZSBpdCBpcyBzaHV0IGRvd24KKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiU29ja2V0IGluZGljYXRlZCBvdXRwdXQgd2FzIE5PVCBzaHV0ZG93biB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4iLAorICAgICAgICAgICAgICAgIHNlcnZTb2NrLmlzT3V0cHV0U2h1dGRvd24oKSk7CiAKLQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCXNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CiAKLQkJLy8gbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyIGZvciBjbG9zZWQgc29ja2V0cwotCQlhc3NlcnRGYWxzZSgKLQkJCQkiU29ja2V0IGluZGljYXRlZCBvdXRwdXQgd2FzIG91dHB1dCBzaHV0ZG93biB3aGVuIHRoZSBzb2NrZXQgd2FzIGNsb3NlZCIsCi0JCQkJdGhlU29ja2V0LmlzT3V0cHV0U2h1dGRvd24oKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlciBmb3IgY2xvc2VkIHNvY2tldHMKKyAgICAgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAgICAgIlNvY2tldCBpbmRpY2F0ZWQgb3V0cHV0IHdhcyBvdXRwdXQgc2h1dGRvd24gd2hlbiB0aGUgc29ja2V0IHdhcyBjbG9zZWQiLAorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5pc091dHB1dFNodXRkb3duKCkpOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0UmV1c2VBZGRyZXNzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRSZXVzZUFkZHJlc3NaKCkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0UmV1c2VBZGRyZXNzKGJvb2xlYW4pCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFJldXNlQWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJldXNlQWRkcmVzc1ooKSB7CiAKLQkJdHJ5IHsKLQkJCUluZXRBZGRyZXNzIGFsbEFkZHJlc3Nlc1tdID0gSW5ldEFkZHJlc3MuZ2V0QWxsQnlOYW1lKEluZXRBZGRyZXNzCi0JCQkJCS5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpKTsKLQkJCWlmIChhbGxBZGRyZXNzZXMubGVuZ3RoID4gMSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWxsQWRkcmVzc2VzW10gPSBJbmV0QWRkcmVzcy5nZXRBbGxCeU5hbWUoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCkpOworICAgICAgICAgICAgaWYgKGFsbEFkZHJlc3Nlcy5sZW5ndGggPiAxKSB7CiAKLQkJCQlJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKLQkJCQkJCQkJLmdldE5leHRQb3J0KCkpOwotCQkJCVNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCQkJc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBTdXBwb3J0X1BvcnRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROZXh0UG9ydCgpKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwogCi0JCQkJLy8gdHJ5IHRvIGJpbmQgdG8gcG9ydCBhZGRyZXNzIHRoYXQgaXMgYWxyZWFkeSBpbiB1c2Ugd2l0aAotCQkJCS8vIHJldXNlQWRkcmVzcyA9IGZhbHNlLgotCQkJCS8vIE9uIHdpbmRvd3MgcGxhdGZvcm1zIHRoZSBiaW5kIGlzIGFsbG93ZWQgZXZlbiB0aGVuCi0JCQkJLy8gcmVVc2VBZGRyZXNzIGlzIGZhbHNlIChPTkxZIElGIEJPVEggU09DS0VUUwotCQkJCS8vIEFSRSBJUFY0IFNvY2tldHMpIHNvIG91ciB0ZXN0IHVzZXMgdGhlIHBsYXRmb3JtIHRvIGRldGVybWluZQotCQkJCS8vIHdoYXQgdGhlIGV4cGVjdGVkIHJlc3VsdCBpcy4gSXQgc2VlbXMgdGhhdCBvbiBsaW51eAotCQkJCS8vIHBsYXRmb3JtcyB3ZSBhbHNvIGRvbid0IGdldCBhbiBleGNlcHRpb24uCi0JCQkJSW5ldFNvY2tldEFkZHJlc3MgdGhlTG9jYWxBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMV0sIFN1cHBvcnRfUG9ydE1hbmFnZXIKLQkJCQkJCQkJLmdldE5leHRQb3J0KCkpOwotCQkJCUluZXRTb2NrZXRBZGRyZXNzIHRoZU90aGVyTG9jYWxBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMF0sIHRoZUxvY2FsQWRkcmVzcwotCQkJCQkJCQkuZ2V0UG9ydCgpKTsKLQkJCQlTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJCXRoZVNvY2tldC5zZXRSZXVzZUFkZHJlc3MoZmFsc2UpOwotCQkJCXRoZVNvY2tldC5iaW5kKHRoZUxvY2FsQWRkcmVzcyk7Ci0JCQkJU29ja2V0IHRoZVNvY2tldDIgPSBudWxsOwotCQkJCVN0cmluZyBwbGF0Zm9ybSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotCQkJCXRyeSB7Ci0JCQkJCXRoZVNvY2tldDIgPSBuZXcgU29ja2V0KCk7Ci0JCQkJCXRoZVNvY2tldDIuc2V0UmV1c2VBZGRyZXNzKGZhbHNlKTsKLQkJCQkJdGhlU29ja2V0Mi5iaW5kKHRoZU90aGVyTG9jYWxBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8gYmluZCB0byBwb3J0IGFkZHJlc3MgdGhhdCBpcyBhbHJlYWR5IGluIHVzZSB3aXRoCisgICAgICAgICAgICAgICAgLy8gcmV1c2VBZGRyZXNzID0gZmFsc2UuCisgICAgICAgICAgICAgICAgLy8gT24gd2luZG93cyBwbGF0Zm9ybXMgdGhlIGJpbmQgaXMgYWxsb3dlZCBldmVuIHRoZW4KKyAgICAgICAgICAgICAgICAvLyByZVVzZUFkZHJlc3MgaXMgZmFsc2UgKE9OTFkgSUYgQk9USCBTT0NLRVRTCisgICAgICAgICAgICAgICAgLy8gQVJFIElQVjQgU29ja2V0cykgc28gb3VyIHRlc3QgdXNlcyB0aGUgcGxhdGZvcm0gdG8gZGV0ZXJtaW5lCisgICAgICAgICAgICAgICAgLy8gd2hhdCB0aGUgZXhwZWN0ZWQgcmVzdWx0IGlzLiBJdCBzZWVtcyB0aGF0IG9uIGxpbnV4CisgICAgICAgICAgICAgICAgLy8gcGxhdGZvcm1zIHdlIGFsc28gZG9uJ3QgZ2V0IGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1sxXSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdGhlT3RoZXJMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSwgdGhlTG9jYWxBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LnNldFJldXNlQWRkcmVzcyhmYWxzZSk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmJpbmQodGhlTG9jYWxBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBTb2NrZXQgdGhlU29ja2V0MiA9IG51bGw7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBsYXRmb3JtID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0MiA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5zZXRSZXVzZUFkZHJlc3MoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmJpbmQodGhlT3RoZXJMb2NhbEFkZHJlc3MpOwogCi0JCQkJCWlmICgoIXBsYXRmb3JtLnN0YXJ0c1dpdGgoIkxpbnV4IikpCi0JCQkJCQkJJiYgKCghcGxhdGZvcm0uc3RhcnRzV2l0aCgiV2luZG93cyIpKSB8fAotCQkJCQkJCS8vIGZvciB3aW5kb3dzIHdlIGRvbid0IGdldCBhbiBleGNlcHRpb24gd2l0aAotCQkJCQkJCS8vIHNldHJldXNlIHNldCB0byBmYWxzZSB1bmxlc3Mgb25lIG9mIHRoZQotCQkJCQkJCS8vIGFkZHJlc3NlcyB3ZSBiaW5kIHRvIGlzIGFuIElQdjYgYWRkcmVzcyBhbmQgd2UKLQkJCQkJCQkvLyBhcmUgdGhlcmVmb3JlIHVzaW5nIHRoZSBJUHY2IHN0YWNrLgotCQkJCQkJCSEoKCgoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpICYmICgoKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMV0pIGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKSkpKSB7Ci0JCQkJCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBzZXRSZXVzZUFkZHJlc3MgaXMgZmFsc2UgYW5kIHdlIGJpbmQ6IgotCQkJCQkJCQkrIHRoZUxvY2FsQWRkcmVzcy50b1N0cmluZygpCi0JCQkJCQkJCSsgIjoiCi0JCQkJCQkJCSsgdGhlT3RoZXJMb2NhbEFkZHJlc3MudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQlpZiAoKHBsYXRmb3JtLnN0YXJ0c1dpdGgoIkxpbnV4IikpCi0JCQkJCQkJfHwgKChwbGF0Zm9ybS5zdGFydHNXaXRoKCJXaW5kb3dzIikpICYmICgoKChJbmV0QWRkcmVzcykgYWxsQWRkcmVzc2VzWzBdKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykgJiYgKCgoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1sxXSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpKSkpIHsKLQkJCQkJCWZhaWwoIkdvdCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIGJpbmRpbmcgd2l0aCBzZXRSZXVzZUFkZHJlc3MgZmFsc2Ugb24gd2luZG93cyBwbGF0Zm9ybToiCi0JCQkJCQkJCSsgdGhlQWRkcmVzcy50b1N0cmluZygpICsgIjoiICsgZXgudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCQkJdGhlU29ja2V0Mi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKCFwbGF0Zm9ybS5zdGFydHNXaXRoKCJMaW51eCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIXBsYXRmb3JtLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igd2luZG93cyB3ZSBkb24ndCBnZXQgYW4gZXhjZXB0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRyZXVzZSBzZXQgdG8gZmFsc2UgdW5sZXNzIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRyZXNzZXMgd2UgYmluZCB0byBpcyBhbiBJUHY2IGFkZHJlc3MgYW5kIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHRoZXJlZm9yZSB1c2luZyB0aGUgSVB2NiBzdGFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKCgoKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMF0pIGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKSAmJiAoKChJbmV0QWRkcmVzcykgYWxsQWRkcmVzc2VzWzFdKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gc2V0UmV1c2VBZGRyZXNzIGlzIGZhbHNlIGFuZCB3ZSBiaW5kOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVMb2NhbEFkZHJlc3MudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoZU90aGVyTG9jYWxBZGRyZXNzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwbGF0Zm9ybS5zdGFydHNXaXRoKCJMaW51eCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgocGxhdGZvcm0uc3RhcnRzV2l0aCgiV2luZG93cyIpKSAmJiAoKCgoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpICYmICgoKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMV0pIGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJHb3QgdW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBiaW5kaW5nIHdpdGggc2V0UmV1c2VBZGRyZXNzIGZhbHNlIG9uIHdpbmRvd3MgcGxhdGZvcm06IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoZUFkZHJlc3MudG9TdHJpbmcoKSArICI6IiArIGV4LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldDIuY2xvc2UoKTsKIAotCQkJCS8vIHRyeSB0byBiaW5kIHRvIHBvcnQgdGhhdCBpcyBhbGxyZWFkeSBpbiB1c2Ugd2l0aCByZXVzZUFkZHJlc3MKLQkJCQkvLyA9IHRydWUKLQkJCQl0aGVMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCQkoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgotCQkJCQkJCQkuZ2V0TmV4dFBvcnQoKSk7Ci0JCQkJdGhlT3RoZXJMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCQkoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1sxXSwgdGhlTG9jYWxBZGRyZXNzCi0JCQkJCQkJCS5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgIC8vIHRyeSB0byBiaW5kIHRvIHBvcnQgdGhhdCBpcyBhbGxyZWFkeSBpbiB1c2Ugd2l0aCByZXVzZUFkZHJlc3MKKyAgICAgICAgICAgICAgICAvLyA9IHRydWUKKyAgICAgICAgICAgICAgICB0aGVMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICAgICAgdGhlT3RoZXJMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1sxXSwgdGhlTG9jYWxBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQb3J0KCkpOwogCi0JCQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJCXRoZVNvY2tldC5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0JCQkJdGhlU29ja2V0LmJpbmQodGhlTG9jYWxBZGRyZXNzKTsKLQkJCQl0cnkgewotCQkJCQl0aGVTb2NrZXQyID0gbmV3IFNvY2tldCgpOwotCQkJCQl0aGVTb2NrZXQyLnNldFJldXNlQWRkcmVzcyh0cnVlKTsKLQkJCQkJdGhlU29ja2V0Mi5iaW5kKHRoZU90aGVyTG9jYWxBZGRyZXNzKTsKLQkJCQkJdGhlU29ja2V0Mi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWZhaWwoIklPRXhjZXB0aW9uIHdoZW4gc2V0UmV1c2VBZGRyZXNzIGlzIHRydWUgYW5kIHdlIGJpbmQgOiIKLQkJCQkJCQkrIGV4LnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LnNldFJldXNlQWRkcmVzcyh0cnVlKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuYmluZCh0aGVMb2NhbEFkZHJlc3MpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldDIgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldDIuc2V0UmV1c2VBZGRyZXNzKHRydWUpOworICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmJpbmQodGhlT3RoZXJMb2NhbEFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gd2hlbiBzZXRSZXVzZUFkZHJlc3MgaXMgdHJ1ZSBhbmQgd2UgYmluZCA6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwogCi0JCQkJLy8gdHJ5IHdpdGggZGVmYXVsdCBiZWhhdmlvciB3aGljaCBzaG91bGQgYmUgdGhlIHNhbWUgb24gYWxsCi0JCQkJLy8gcGxhdGZvcm1zCi0JCQkJdGhlTG9jYWxBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMF0sIFN1cHBvcnRfUG9ydE1hbmFnZXIKLQkJCQkJCQkJLmdldE5leHRQb3J0KCkpOwotCQkJCXRoZU90aGVyTG9jYWxBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMV0sIHRoZUxvY2FsQWRkcmVzcwotCQkJCQkJCQkuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgICAgICAvLyB0cnkgd2l0aCBkZWZhdWx0IGJlaGF2aW9yIHdoaWNoIHNob3VsZCBiZSB0aGUgc2FtZSBvbiBhbGwKKyAgICAgICAgICAgICAgICAvLyBwbGF0Zm9ybXMKKyAgICAgICAgICAgICAgICB0aGVMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSwgU3VwcG9ydF9Qb3J0TWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICAgICAgdGhlT3RoZXJMb2NhbEFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1sxXSwgdGhlTG9jYWxBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQb3J0KCkpOwogCi0JCQkJdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJCXRoZVNvY2tldC5iaW5kKHRoZUxvY2FsQWRkcmVzcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhlU29ja2V0MiA9IG5ldyBTb2NrZXQoKTsKLQkJCQkJdGhlU29ja2V0Mi5iaW5kKHRoZU90aGVyTG9jYWxBZGRyZXNzKTsKLQkJCQkJdGhlU29ja2V0Mi5jbG9zZSgpOwotCQkJCQlpZiAoKCFwbGF0Zm9ybS5zdGFydHNXaXRoKCJMaW51eCIpKQotCQkJCQkJCSYmICgoIXBsYXRmb3JtLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkgfHwgISgoKChJbmV0QWRkcmVzcykgYWxsQWRkcmVzc2VzWzBdKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykgJiYgKCgoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1sxXSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpKSkpIHsKLQkJCQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIHNldFJldXNlQWRkcmVzcyBpcyBkZWZhdWx0IGFuZCB3ZSBiaW5kOiIKLQkJCQkJCQkJKyB0aGVMb2NhbEFkZHJlc3MudG9TdHJpbmcoKQotCQkJCQkJCQkrICI6IgotCQkJCQkJCQkrIHRoZU90aGVyTG9jYWxBZGRyZXNzLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJaWYgKChwbGF0Zm9ybS5zdGFydHNXaXRoKCJMaW51eCIpKQotCQkJCQkJCXx8ICgocGxhdGZvcm0uc3RhcnRzV2l0aCgiV2luZG93cyIpKSAmJiAoKCgoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpICYmICgoKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMV0pIGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKSkpKSB7Ci0JCQkJCQlmYWlsKCJHb3QgdW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBiaW5kaW5nIHdpdGggc2V0UmV1c2VBZGRyZXNzIGRlZmF1bHQgb24gd2luZG93cyBwbGF0Zm9ybToiCi0JCQkJCQkJCSsgdGhlQWRkcmVzcy50b1N0cmluZygpICsgIjoiICsgZXgudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCQkJc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldC5iaW5kKHRoZUxvY2FsQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0MiA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5iaW5kKHRoZU90aGVyTG9jYWxBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0Mi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKCFwbGF0Zm9ybS5zdGFydHNXaXRoKCJMaW51eCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIXBsYXRmb3JtLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkgfHwgISgoKChJbmV0QWRkcmVzcykgYWxsQWRkcmVzc2VzWzBdKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykgJiYgKCgoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1sxXSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIHNldFJldXNlQWRkcmVzcyBpcyBkZWZhdWx0IGFuZCB3ZSBiaW5kOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVMb2NhbEFkZHJlc3MudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoZU90aGVyTG9jYWxBZGRyZXNzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwbGF0Zm9ybS5zdGFydHNXaXRoKCJMaW51eCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgocGxhdGZvcm0uc3RhcnRzV2l0aCgiV2luZG93cyIpKSAmJiAoKCgoSW5ldEFkZHJlc3MpIGFsbEFkZHJlc3Nlc1swXSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpICYmICgoKEluZXRBZGRyZXNzKSBhbGxBZGRyZXNzZXNbMV0pIGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJHb3QgdW5leHBlY3RlZCBleGNlcHRpb24gd2hlbiBiaW5kaW5nIHdpdGggc2V0UmV1c2VBZGRyZXNzIGRlZmF1bHQgb24gd2luZG93cyBwbGF0Zm9ybToiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlQWRkcmVzcy50b1N0cmluZygpICsgIjoiICsgZXgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CiAKLQkJCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1JFVVNFQUREUik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fUkVVU0VBRERSKTsKLQkJfQorICAgICAgICAgICAgICAgIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fUkVVU0VBRERSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCBTT19SRVVTRUFERFIpOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRSZXVzZUFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmV1c2VBZGRyZXNzKCkgewotCQl0cnkgewotCQkJU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCXRoZVNvY2tldC5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0JCQlhc3NlcnRUcnVlKCJnZXRSZXVzZUFkZHJlc3MgZmFsc2Ugd2hlbiBpdCBzaG91bGQgYmUgdHJ1ZSIsCi0JCQkJCXRoZVNvY2tldC5nZXRSZXVzZUFkZHJlc3MoKSk7Ci0JCQl0aGVTb2NrZXQuc2V0UmV1c2VBZGRyZXNzKGZhbHNlKTsKLQkJCWFzc2VydEZhbHNlKCJnZXRSZXVzZUFkZHJlc3MgdHJ1ZSB3aGVuIGl0IHNob3VsZCBiZSBGYWxzZSIsCi0JCQkJCXRoZVNvY2tldC5nZXRSZXVzZUFkZHJlc3MoKSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1JFVVNFQUREUik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fUkVVU0VBRERSKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldFJldXNlQWRkcmVzcygpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJldXNlQWRkcmVzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmV1c2VBZGRyZXNzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRSZXVzZUFkZHJlc3MgZmFsc2Ugd2hlbiBpdCBzaG91bGQgYmUgdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5nZXRSZXVzZUFkZHJlc3MoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuc2V0UmV1c2VBZGRyZXNzKGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJnZXRSZXVzZUFkZHJlc3MgdHJ1ZSB3aGVuIGl0IHNob3VsZCBiZSBGYWxzZSIsCisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5nZXRSZXVzZUFkZHJlc3MoKSk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX1JFVVNFQUREUik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fUkVVU0VBRERSKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0T09CSW5saW5lKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRPT0JJbmxpbmVaKCkgewotCQkvLyBtb3N0bHkgdGVzdGVkIGluIGdldE9PQklubGluZS4gSnVzdCBzZXQgdG8gbWFrZSBzdXJlIGNhbGwgd29ya3Mgb2sKLQkJdHJ5IHsKLQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQkJU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKLQkJCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQl0aGVTb2NrZXQuc2V0T09CSW5saW5lKHRydWUpOwotCQkJYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgT09CSWxpbmUgdG8gYmUgdHJ1ZSIsIHRoZVNvY2tldC5nZXRPT0JJbmxpbmUoKSk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX09PQklOTElORSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgU09fT09CSU5MSU5FKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NldE9PQklubGluZShib29sZWFuKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRPT0JJbmxpbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRPT0JJbmxpbmVaKCkgeworICAgICAgICAvLyBtb3N0bHkgdGVzdGVkIGluIGdldE9PQklubGluZS4gSnVzdCBzZXQgdG8gbWFrZSBzdXJlIGNhbGwgd29ya3Mgb2sKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKKyAgICAgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICB0aGVTb2NrZXQuc2V0T09CSW5saW5lKHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgT09CSWxpbmUgdG8gYmUgdHJ1ZSIsIHRoZVNvY2tldC5nZXRPT0JJbmxpbmUoKSk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX09PQklOTElORSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgU09fT09CSU5MSU5FKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0T09CSW5saW5lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE9PQklubGluZSgpIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I2dldE9PQklubGluZSgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE9PQklubGluZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0T09CSW5saW5lKCkgewogCi0JCXRyeSB7Ci0JCQluZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCVN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCQlTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAorICAgICAgICAgICAgICAgICAgICBTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOworICAgICAgICAgICAgU29ja2V0IHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKIAotCQkJLy8gdmFsaWRhdGUgdGhhdCB2YWx1ZSByZWZsZWN0cyB3aGF0IHdlIHNldCBpdCB0byB0cnVlIGFmdGVyIHRydWUsCi0JCQkvLyBmYWxzZSBhZnRlciBmYWxzZSBhbmQgZmFsc2UgYWZ0ZXIgZmFsc2UgZmFsc2UKLQkJCXRoZVNvY2tldC5zZXRPT0JJbmxpbmUodHJ1ZSk7Ci0JCQlhc3NlcnRUcnVlKCJleHBlY3RlZCBPT0JJbGluZSB0byBiZSB0cnVlIiwgdGhlU29ja2V0LmdldE9PQklubGluZSgpKTsKLQkJCXRoZVNvY2tldC5zZXRPT0JJbmxpbmUoZmFsc2UpOwotCQkJYXNzZXJ0RmFsc2UoImV4cGVjdGVkIE9PQklsaW5lIHRvIGJlIHRydWUiLCB0aGVTb2NrZXQKLQkJCQkJLmdldE9PQklubGluZSgpKTsKLQkJCXRoZVNvY2tldC5zZXRPT0JJbmxpbmUoZmFsc2UpOwotCQkJYXNzZXJ0RmFsc2UoImV4cGVjdGVkIE9PQklsaW5lIHRvIGJlIHRydWUiLCB0aGVTb2NrZXQKLQkJCQkJLmdldE9PQklubGluZSgpKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoU09fT09CSU5MSU5FKTsKKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgdmFsdWUgcmVmbGVjdHMgd2hhdCB3ZSBzZXQgaXQgdG8gdHJ1ZSBhZnRlciB0cnVlLAorICAgICAgICAgICAgLy8gZmFsc2UgYWZ0ZXIgZmFsc2UgYW5kIGZhbHNlIGFmdGVyIGZhbHNlIGZhbHNlCisgICAgICAgICAgICB0aGVTb2NrZXQuc2V0T09CSW5saW5lKHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgT09CSWxpbmUgdG8gYmUgdHJ1ZSIsIHRoZVNvY2tldC5nZXRPT0JJbmxpbmUoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuc2V0T09CSW5saW5lKGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJleHBlY3RlZCBPT0JJbGluZSB0byBiZSB0cnVlIiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgICAgIC5nZXRPT0JJbmxpbmUoKSk7CisgICAgICAgICAgICB0aGVTb2NrZXQuc2V0T09CSW5saW5lKGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJleHBlY3RlZCBPT0JJbGluZSB0byBiZSB0cnVlIiwgdGhlU29ja2V0CisgICAgICAgICAgICAgICAgICAgIC5nZXRPT0JJbmxpbmUoKSk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKFNPX09PQklOTElORSk7CiAKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBTT19PT0JJTkxJTkUpOwotCQl9Ci0JfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUsIFNPX09PQklOTElORSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NldFRyYWZmaWNDbGFzcyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9zZXRUcmFmZmljQ2xhc3NJKCkgewotCQl0cnkgewotCQkJaW50IElQVE9TX0xPV0NPU1QgPSAweDI7Ci0JCQlpbnQgSVBUT1NfUkVMSUFCSUxUWSA9IDB4NDsKLQkJCWludCBJUFRPU19USFJPVUdIUFVUID0gMHg4OwotCQkJaW50IElQVE9TX0xPV0RFTEFZID0gMHgxMDsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NldFRyYWZmaWNDbGFzcyhpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTb2NrZXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRyYWZmaWNDbGFzcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VHJhZmZpY0NsYXNzSSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBJUFRPU19MT1dDT1NUID0gMHgyOworICAgICAgICAgICAgaW50IElQVE9TX1JFTElBQklMVFkgPSAweDQ7CisgICAgICAgICAgICBpbnQgSVBUT1NfVEhST1VHSFBVVCA9IDB4ODsKKyAgICAgICAgICAgIGludCBJUFRPU19MT1dERUxBWSA9IDB4MTA7CiAKLQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQkJU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKLQkJCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICBTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwogCi0JCQkvLyB2YWxpZGF0ZSB0aGF0IHZhbHVlIHNldCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1Ci0JCQl0cnkgewotCQkJCXRoZVNvY2tldC5zZXRUcmFmZmljQ2xhc3MoMjU2KTsKLQkJCQlmYWlsKCJObyBleGNlcHRpb24gd2FzIHRocm93biB3aGVuIHRyYWZmaWMgY2xhc3Mgc2V0IHRvIDI1NiIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0KKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgdmFsdWUgc2V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcygyNTYpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoZW4gdHJhZmZpYyBjbGFzcyBzZXQgdG8gMjU2Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQogCi0JCQl0cnkgewotCQkJCXRoZVNvY2tldC5zZXRUcmFmZmljQ2xhc3MoLTEpOwotCQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoZW4gdHJhZmZpYyBjbGFzcyBzZXQgdG8gLTEiKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoZVNvY2tldC5zZXRUcmFmZmljQ2xhc3MoLTEpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoZW4gdHJhZmZpYyBjbGFzcyBzZXQgdG8gLTEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CiAKLQkJCS8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBzZXQgaXQgdG8gc29tZSBnb29kIHZhbHVlcwotCQkJdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcyhJUFRPU19MT1dDT1NUKTsKLQkJCXRoZVNvY2tldC5zZXRUcmFmZmljQ2xhc3MoSVBUT1NfVEhST1VHSFBVVCk7Ci0JCQllbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKElQX1RPUyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSwgSVBfVE9TKTsKLQkJfQotCX0KKyAgICAgICAgICAgIC8vIG5vdyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBzZXQgaXQgdG8gc29tZSBnb29kIHZhbHVlcworICAgICAgICAgICAgdGhlU29ja2V0LnNldFRyYWZmaWNDbGFzcyhJUFRPU19MT1dDT1NUKTsKKyAgICAgICAgICAgIHRoZVNvY2tldC5zZXRUcmFmZmljQ2xhc3MoSVBUT1NfVEhST1VHSFBVVCk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKElQX1RPUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgSVBfVE9TKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0VHJhZmZpY0NsYXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFRyYWZmaWNDbGFzcygpIHsKLQkJdHJ5IHsKLQkJCWludCBJUFRPU19MT1dDT1NUID0gMHgyOwotCQkJaW50IElQVE9TX1JFTElBQklMVFkgPSAweDQ7Ci0JCQlpbnQgSVBUT1NfVEhST1VHSFBVVCA9IDB4ODsKLQkJCWludCBJUFRPU19MT1dERUxBWSA9IDB4MTA7CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNnZXRUcmFmZmljQ2xhc3MoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUcmFmZmljQ2xhc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRyYWZmaWNDbGFzcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBJUFRPU19MT1dDT1NUID0gMHgyOworICAgICAgICAgICAgaW50IElQVE9TX1JFTElBQklMVFkgPSAweDQ7CisgICAgICAgICAgICBpbnQgSVBUT1NfVEhST1VHSFBVVCA9IDB4ODsKKyAgICAgICAgICAgIGludCBJUFRPU19MT1dERUxBWSA9IDB4MTA7CiAKLQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKLQkJCQkJU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKLQkJCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICBTb2NrZXQgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOwogCi0JCQkvKgotCQkJICogd2UgY2Fubm90IGFjdHVhbGx5IGNoZWNrIHRoYXQgdGhlIHZhbHVlcyBhcmUgc2V0IGFzIGlmIGEgcGxhdGZvcm0KLQkJCSAqIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wdGlvbiB0aGVuIGl0IG1heSBjb21lIGJhY2sgdW5zZXQgZXZlbgotCQkJICogdGhvdWdoIHdlIHNldCBpdCBzbyBqdXN0IGdldCB0aGUgdmFsdWUgdG8gbWFrZSBzdXJlIHdlIGNhbiBnZXQgaXQKLQkJCSAqLwotCQkJaW50IHRyYWZmaWNDbGFzcyA9IHRoZVNvY2tldC5nZXRUcmFmZmljQ2xhc3MoKTsKLQkJCWVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoSVBfVE9TKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlLCBJUF9UT1MpOwotCQl9Ci0JfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHdlIGNhbm5vdCBhY3R1YWxseSBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgYXJlIHNldCBhcyBpZiBhIHBsYXRmb3JtCisgICAgICAgICAgICAgKiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcHRpb24gdGhlbiBpdCBtYXkgY29tZSBiYWNrIHVuc2V0IGV2ZW4KKyAgICAgICAgICAgICAqIHRob3VnaCB3ZSBzZXQgaXQgc28ganVzdCBnZXQgdGhlIHZhbHVlIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZ2V0IGl0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCB0cmFmZmljQ2xhc3MgPSB0aGVTb2NrZXQuZ2V0VHJhZmZpY0NsYXNzKCk7CisgICAgICAgICAgICBlbnN1cmVFeGNlcHRpb25UaHJvd25JZk9wdGlvbklzVW5zdXBwb3J0ZWRPbk9TKElQX1RPUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgSVBfVE9TKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0Q2hhbm5lbCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRDaGFubmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwobmV3IFNvY2tldCgpLmdldENoYW5uZWwoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjZ2V0Q2hhbm5lbCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJEdW1teSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYW5uZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENoYW5uZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChuZXcgU29ja2V0KCkuZ2V0Q2hhbm5lbCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NlbmRVcmdlbnREYXRhKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3NlbmRVcmdlbnREYXRhSSgpIHsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuU29ja2V0I3NlbmRVcmdlbnREYXRhKGludCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kVXJnZW50RGF0YSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VuZFVyZ2VudERhdGFJKCkgewogCi0JCS8vIFNvbWUgcGxhdGZvcm1zIG1heSBub3Qgc3VwcG9ydCB1cmdlbnQgZGF0YSBpbiB0aGlzIGNhc2Ugd2Ugd2lsbCBub3QKLQkJLy8gcnVuIHRoZXNlIHRlc3RzLiBGb3Igbm93IHJ1biBvbiBhbGwgcGxhdGZvcm1zIHVudGlsIHdlIGZpbmQgdGhvc2UKLQkJLy8gdGhhdCBkbyBub3Qgc3VwcG9ydCB1cmdlbnQgZGF0YQotCQlTdHJpbmcgcGxhdGZvcm0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQkJaWYgKCFwbGF0Zm9ybS5lcXVhbHMoIkR1bW15IikpIHsKLQkJCS8vIHZhbGlkYXRlIHRoYXQgd2hlbiBPT0JJbmxpbmUgaXMgZmFsc2UgdGhhdCBhbnkgdXJnZW50IGRhdGEKLQkJCS8vIGlzIHNpbGVudGx5IGlnbm9yZWQKLQkJCVN0cmluZyB1cmdlbnREYXRhID0gIlUiOwotCQkJdHJ5IHsKLQkJCQlJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotCQkJCQkJSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKLQkJCQkJCQkJLmdldE5leHRQb3J0KCkpOwotCQkJCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQkJU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKLQkJCQlzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKLQkJCQl0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKLQkJCQlTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7Ci0JCQkJSW5wdXRTdHJlYW0gdGhlSW5wdXQgPSB0aGVTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQlPdXRwdXRTdHJlYW0gdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIC8vIFNvbWUgcGxhdGZvcm1zIG1heSBub3Qgc3VwcG9ydCB1cmdlbnQgZGF0YSBpbiB0aGlzIGNhc2Ugd2Ugd2lsbCBub3QKKyAgICAgICAgLy8gcnVuIHRoZXNlIHRlc3RzLiBGb3Igbm93IHJ1biBvbiBhbGwgcGxhdGZvcm1zIHVudGlsIHdlIGZpbmQgdGhvc2UKKyAgICAgICAgLy8gdGhhdCBkbyBub3Qgc3VwcG9ydCB1cmdlbnQgZGF0YQorICAgICAgICBTdHJpbmcgcGxhdGZvcm0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKKyAgICAgICAgaWYgKCFwbGF0Zm9ybS5lcXVhbHMoIkR1bW15IikpIHsKKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2hlbiBPT0JJbmxpbmUgaXMgZmFsc2UgdGhhdCBhbnkgdXJnZW50IGRhdGEKKyAgICAgICAgICAgIC8vIGlzIHNpbGVudGx5IGlnbm9yZWQKKyAgICAgICAgICAgIFN0cmluZyB1cmdlbnREYXRhID0gIlUiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5leHRQb3J0KCkpOworICAgICAgICAgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBTb2NrZXQgc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gdGhlSW5wdXQgPSB0aGVTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7CiAKLQkJCQkvLyBzZW5kIHRoZSByZWd1bGFyIGRhdGEKLQkJCQlTdHJpbmcgc2VuZFN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QiKTsKLQkJCQl0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQl0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSByZWd1bGFyIGRhdGEKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VuZFN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCS8vIHNlbmQgdGhlIHVyZ2VudCBkYXRhIHdoaWNoIHNob3VsZCBub3QgYmUgcmVjZWl2ZWQKLQkJCQl0aGVTb2NrZXQuc2V0T09CSW5saW5lKGZhbHNlKTsKLQkJCQlzZXJ2U29jay5zZW5kVXJnZW50RGF0YSh1cmdlbnREYXRhLmdldEJ5dGVzKClbMF0pOwotCQkJCXRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCXRoZU91dHB1dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHVyZ2VudCBkYXRhIHdoaWNoIHNob3VsZCBub3QgYmUgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuc2V0T09CSW5saW5lKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzZXJ2U29jay5zZW5kVXJnZW50RGF0YSh1cmdlbnREYXRhLmdldEJ5dGVzKClbMF0pOworICAgICAgICAgICAgICAgIHRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIHRoZU91dHB1dC5mbHVzaCgpOwogCi0JCQkJLy8gZ2l2ZSB0aGluZ3Mgc29tZSB0aW1lIHRvIHNldHRsZQotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIHRoaW5ncyBzb21lIHRpbWUgdG8gc2V0dGxlCisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwogCi0JCQkJaW50IHRvdGFsQnl0ZXNSZWFkID0gMDsKLQkJCQlieXRlW10gbXlCeXRlcyA9IG5ldyBieXRlWzEwMF07Ci0JCQkJd2hpbGUgKHRoZUlucHV0LmF2YWlsYWJsZSgpID4gMCkgewotCQkJCQlpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKLQkJCQkJCQlteUJ5dGVzLmxlbmd0aCAtIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJCQl9CisgICAgICAgICAgICAgICAgaW50IHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgICAgICAgICBieXRlW10gbXlCeXRlcyA9IG5ldyBieXRlWzEwMF07CisgICAgICAgICAgICAgICAgd2hpbGUgKHRoZUlucHV0LmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUJ5dGVzLmxlbmd0aCAtIHRvdGFsQnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlTdHJpbmcgcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQlhc3NlcnRUcnVlKCJVcmdlbnQgRGF0YSBzZWVtcyB0byBoYXZlIGJlZW4gcmVjZWl2ZWQ6IgotCQkJCQkJKyByZWNlaXZlZFN0cmluZyArICI6IiArIHNlbmRTdHJpbmcsIHJlY2VpdmVkU3RyaW5nCi0JCQkJCQkuZXF1YWxzKHNlbmRTdHJpbmcgKyBzZW5kU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVXJnZW50IERhdGEgc2VlbXMgdG8gaGF2ZSBiZWVuIHJlY2VpdmVkOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVjZWl2ZWRTdHJpbmcgKyAiOiIgKyBzZW5kU3RyaW5nLCByZWNlaXZlZFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhzZW5kU3RyaW5nICsgc2VuZFN0cmluZykpOwogCi0JCQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCQkJc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CiAKLQkJCQkvLyBub3cgdmFsaWRhdGUgdGhhdCB1cmdlbnQgZGF0YSBpcyByZWNlaXZlZCBhcyBleHBlY3RlZC4gRXhwZWN0Ci0JCQkJLy8gdGhhdCBpdCBzaG91bGQgYmUgYmV0d2VlbiB0aGUgdHdvIHdyaXRlcy4KLQkJCQl0aGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLAotCQkJCQkJU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpKTsKLQkJCQl0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwotCQkJCXNlcnZlclNvY2tldC5iaW5kKHRoZUFkZHJlc3MpOwotCQkJCXRoZVNvY2tldC5jb25uZWN0KHRoZUFkZHJlc3MpOwotCQkJCXNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQkJCXRoZUlucHV0ID0gdGhlU29ja2V0LmdldElucHV0U3RyZWFtKCk7Ci0JCQkJdGhlT3V0cHV0ID0gc2VydlNvY2suZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgLy8gbm93IHZhbGlkYXRlIHRoYXQgdXJnZW50IGRhdGEgaXMgcmVjZWl2ZWQgYXMgZXhwZWN0ZWQuIEV4cGVjdAorICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgc2hvdWxkIGJlIGJldHdlZW4gdGhlIHR3byB3cml0ZXMuCisgICAgICAgICAgICAgICAgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBzZXJ2U29jayA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIHRoZU91dHB1dCA9IHNlcnZTb2NrLmdldE91dHB1dFN0cmVhbSgpOwogCi0JCQkJLy8gc2VuZCB0aGUgcmVndWxhciBkYXRhCi0JCQkJc2VuZFN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgLSBVcmdlbnQgRGF0YSIpOwotCQkJCXRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCXRoZU91dHB1dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHJlZ3VsYXIgZGF0YQorICAgICAgICAgICAgICAgIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJUZXN0IC0gVXJnZW50IERhdGEiKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCS8vIHNlbmQgdGhlIHVyZ2VudCBkYXRhIHdoaWNoIHNob3VsZCBiZSByZWNlaXZlZAotCQkJCXRoZVNvY2tldC5zZXRPT0JJbmxpbmUodHJ1ZSk7Ci0JCQkJc2VydlNvY2suc2VuZFVyZ2VudERhdGEodXJnZW50RGF0YS5nZXRCeXRlcygpWzBdKTsKKyAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSB1cmdlbnQgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuc2V0T09CSW5saW5lKHRydWUpOworICAgICAgICAgICAgICAgIHNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CiAKLQkJCQl0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQl0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CiAKLQkJCQl0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0JCQkJbXlCeXRlcyA9IG5ldyBieXRlWzEwMF07Ci0JCQkJd2hpbGUgKHRoZUlucHV0LmF2YWlsYWJsZSgpID4gMCkgewotCQkJCQlpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKLQkJCQkJCQlteUJ5dGVzLmxlbmd0aCAtIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJCQl9CisgICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgPSAwOworICAgICAgICAgICAgICAgIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICAgICAgICAgIHdoaWxlICh0aGVJbnB1dC5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHRoZUlucHV0LnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkID0gdG90YWxCeXRlc1JlYWQgKyBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQlhc3NlcnRUcnVlKCJVcmdlbnQgRGF0YSB3YXMgbm90IHJlY2VpdmVkIHdpdGggb25lIHVyZ2VudCBieXRlOiIKLQkJCQkJCSsgcmVjZWl2ZWRTdHJpbmcgKyAiOiIgKyBzZW5kU3RyaW5nICsgdXJnZW50RGF0YQotCQkJCQkJKyBzZW5kU3RyaW5nLCByZWNlaXZlZFN0cmluZy5lcXVhbHMoc2VuZFN0cmluZwotCQkJCQkJKyB1cmdlbnREYXRhICsgc2VuZFN0cmluZykpOworICAgICAgICAgICAgICAgIHJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVXJnZW50IERhdGEgd2FzIG5vdCByZWNlaXZlZCB3aXRoIG9uZSB1cmdlbnQgYnl0ZToiCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZyArIHVyZ2VudERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2VuZFN0cmluZywgcmVjZWl2ZWRTdHJpbmcuZXF1YWxzKHNlbmRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdXJnZW50RGF0YSArIHNlbmRTdHJpbmcpKTsKIAotCQkJCXRoZVNvY2tldC5jbG9zZSgpOwotCQkJCXNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIHRoZVNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwogCi0JCQkJLy8gbm93IHRlc3QgY2FzZSB3aGVyZSB3ZSB0cnkgdG8gc2VuZCB0d28gdXJnZW50IGJ5dGVzLgotCQkJCXRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQlTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOwotCQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCQkJc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7Ci0JCQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7Ci0JCQkJc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7Ci0JCQkJdGhlSW5wdXQgPSB0aGVTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQl0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAvLyBub3cgdGVzdCBjYXNlIHdoZXJlIHdlIHRyeSB0byBzZW5kIHR3byB1cmdlbnQgYnl0ZXMuCisgICAgICAgICAgICAgICAgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBzZXJ2U29jayA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIHRoZU91dHB1dCA9IHNlcnZTb2NrLmdldE91dHB1dFN0cmVhbSgpOwogCi0JCQkJLy8gc2VuZCB0aGUgcmVndWxhciBkYXRhCi0JCQkJc2VuZFN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgLSBVcmdlbnQgRGF0YSIpOwotCQkJCXRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCXRoZU91dHB1dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHJlZ3VsYXIgZGF0YQorICAgICAgICAgICAgICAgIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJUZXN0IC0gVXJnZW50IERhdGEiKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCS8vIHNlbmQgdGhlIHVyZ2VudCBkYXRhIHdoaWNoIHNob3VsZCBub3QgYmUgcmVjZWl2ZWQKLQkJCQl0aGVTb2NrZXQuc2V0T09CSW5saW5lKHRydWUpOwotCQkJCXNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7Ci0JCQkJc2VydlNvY2suc2VuZFVyZ2VudERhdGEodXJnZW50RGF0YS5nZXRCeXRlcygpWzBdKTsKKyAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSB1cmdlbnQgZGF0YSB3aGljaCBzaG91bGQgbm90IGJlIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgdGhlU29ja2V0LnNldE9PQklubGluZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBzZXJ2U29jay5zZW5kVXJnZW50RGF0YSh1cmdlbnREYXRhLmdldEJ5dGVzKClbMF0pOworICAgICAgICAgICAgICAgIHNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CiAKLQkJCQl0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQl0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CiAKLQkJCQl0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0JCQkJbXlCeXRlcyA9IG5ldyBieXRlWzEwMF07Ci0JCQkJd2hpbGUgKHRoZUlucHV0LmF2YWlsYWJsZSgpID4gMCkgewotCQkJCQlpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKLQkJCQkJCQlteUJ5dGVzLmxlbmd0aCAtIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJCQl9CisgICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgPSAwOworICAgICAgICAgICAgICAgIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICAgICAgICAgIHdoaWxlICh0aGVJbnB1dC5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHRoZUlucHV0LnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkID0gdG90YWxCeXRlc1JlYWQgKyBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJIkRpZCBub3QgZ2V0IHJpZ2h0IGJ5dGUgb2YgdXJnZW50IGRhdGEgd2hlbiB0d28gc2VudDoiCi0JCQkJCQkJCSsgcmVjZWl2ZWRTdHJpbmcgKyAiOiIgKyBzZW5kU3RyaW5nCi0JCQkJCQkJCSsgdXJnZW50RGF0YSArIHVyZ2VudERhdGEgKyBzZW5kU3RyaW5nLAotCQkJCQkJcmVjZWl2ZWRTdHJpbmcuZXF1YWxzKHNlbmRTdHJpbmcgKyB1cmdlbnREYXRhCi0JCQkJCQkJCSsgdXJnZW50RGF0YSArIHNlbmRTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICByZWNlaXZlZFN0cmluZyA9IG5ldyBTdHJpbmcobXlCeXRlcywgMCwgdG90YWxCeXRlc1JlYWQpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgcmlnaHQgYnl0ZSBvZiB1cmdlbnQgZGF0YSB3aGVuIHR3byBzZW50OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZWNlaXZlZFN0cmluZyArICI6IiArIHNlbmRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1cmdlbnREYXRhICsgdXJnZW50RGF0YSArIHNlbmRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFN0cmluZy5lcXVhbHMoc2VuZFN0cmluZyArIHVyZ2VudERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1cmdlbnREYXRhICsgc2VuZFN0cmluZykpOwogCi0JCQkJdGhlU29ja2V0LmNsb3NlKCk7Ci0JCQkJc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CiAKLQkJCQkvKgotCQkJCSAqIFRPRE8gOiBUaGVzZSBkbyBub3QgY3VycmVudGx5IHBhc3Mgb24gWFAgU1AyIGFuZCBTZXJ2ZXIgMjAwMwotCQkJCSAqLwotCQkJCWlmICghcGxhdGZvcm0uc3RhcnRzV2l0aCgiV2luZG93cyIpKSB7Ci0JCQkJCS8vIG5vdyB0ZXN0IHRoZSBjYXNlIHdlcmUgd2Ugc2VuZCB0dXJuIHRoZSBPT0JJbmxpbmUgb24vb2ZmCi0JCQkJCXRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKLQkJCQkJCQkuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7Ci0JCQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwotCQkJCQlzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKLQkJCQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7Ci0JCQkJCXNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQkJCQl0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQl0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFRPRE8gOiBUaGVzZSBkbyBub3QgY3VycmVudGx5IHBhc3Mgb24gWFAgU1AyIGFuZCBTZXJ2ZXIgMjAwMworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghcGxhdGZvcm0uc3RhcnRzV2l0aCgiV2luZG93cyIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB0ZXN0IHRoZSBjYXNlIHdlcmUgd2Ugc2VuZCB0dXJuIHRoZSBPT0JJbmxpbmUgb24vb2ZmCisgICAgICAgICAgICAgICAgICAgIHRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxIb3N0KCksIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZTb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICB0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKIAotCQkJCQkvLyBzZW5kIHRoZSByZWd1bGFyIGRhdGEKLQkJCQkJc2VuZFN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgLSBVcmdlbnQgRGF0YSIpOwotCQkJCQl0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQkJdGhlT3V0cHV0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHJlZ3VsYXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCAtIFVyZ2VudCBEYXRhIik7CisgICAgICAgICAgICAgICAgICAgIHRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCQkvLyBzZW5kIHRoZSB1cmdlbnQgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVjZWl2ZWQKLQkJCQkJdGhlU29ja2V0LnNldE9PQklubGluZSh0cnVlKTsKLQkJCQkJc2VydlNvY2suc2VuZFVyZ2VudERhdGEodXJnZW50RGF0YS5nZXRCeXRlcygpWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgdXJnZW50IGRhdGEgd2hpY2ggc2hvdWxkIGJlIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5zZXRPT0JJbmxpbmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CiAKLQkJCQkJdGhlT3V0cHV0LndyaXRlKHNlbmRTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXRoZU91dHB1dC5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhlT3V0cHV0LmZsdXNoKCk7CiAKLQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CiAKLQkJCQkJdG90YWxCeXRlc1JlYWQgPSAwOwotCQkJCQlteUJ5dGVzID0gbmV3IGJ5dGVbMTAwXTsKLQkJCQkJd2hpbGUgKHRoZUlucHV0LmF2YWlsYWJsZSgpID4gMCkgewotCQkJCQkJaW50IGJ5dGVzUmVhZCA9IHRoZUlucHV0LnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCi0JCQkJCQkJCW15Qnl0ZXMubGVuZ3RoIC0gdG90YWxCeXRlc1JlYWQpOwotCQkJCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJCQkJfQorICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhlSW5wdXQuYXZhaWxhYmxlKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJCQkiRGlkIG5vdCBnZXQgdXJnZW50IGRhdGEgd2hlbiB0dXJuaW5nIG9uL29mZigxKToiCi0JCQkJCQkJCQkrIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZwotCQkJCQkJCQkJKyB1cmdlbnREYXRhICsgc2VuZFN0cmluZywgcmVjZWl2ZWRTdHJpbmcKLQkJCQkJCQkJCS5lcXVhbHMoc2VuZFN0cmluZyArIHVyZ2VudERhdGEKLQkJCQkJCQkJCQkJKyBzZW5kU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IHVyZ2VudCBkYXRhIHdoZW4gdHVybmluZyBvbi9vZmYoMSk6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZWNlaXZlZFN0cmluZyArICI6IiArIHNlbmRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdXJnZW50RGF0YSArIHNlbmRTdHJpbmcsIHJlY2VpdmVkU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbmRTdHJpbmcgKyB1cmdlbnREYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VuZFN0cmluZykpOwogCi0JCQkJCS8vIHNlbmQgdGhlIHJlZ3VsYXIgZGF0YQotCQkJCQlzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCAtIFVyZ2VudCBEYXRhIik7Ci0JCQkJCXRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCQl0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgcmVndWxhciBkYXRhCisgICAgICAgICAgICAgICAgICAgIHNlbmRTdHJpbmcgPSBuZXcgU3RyaW5nKCJUZXN0IC0gVXJnZW50IERhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhlT3V0cHV0LndyaXRlKHNlbmRTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIHRoZU91dHB1dC5mbHVzaCgpOwogCi0JCQkJCS8vIHNlbmQgdGhlIHVyZ2VudCBkYXRhIHdoaWNoIHNob3VsZCBub3QgYmUgcmVjZWl2ZWQKLQkJCQkJdGhlU29ja2V0LnNldE9PQklubGluZShmYWxzZSk7Ci0JCQkJCXNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHVyZ2VudCBkYXRhIHdoaWNoIHNob3VsZCBub3QgYmUgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgdGhlU29ja2V0LnNldE9PQklubGluZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CiAKLQkJCQkJLy8gc2VuZCB0cmFpbGluZyBkYXRhCi0JCQkJCXRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCQl0aGVPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0cmFpbGluZyBkYXRhCisgICAgICAgICAgICAgICAgICAgIHRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKIAotCQkJCQl0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0JCQkJCW15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOwotCQkJCQl3aGlsZSAodGhlSW5wdXQuYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJCQlpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKLQkJCQkJCQkJbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7Ci0JCQkJCQl0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkOwotCQkJCQl9CisgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbXlCeXRlcyA9IG5ldyBieXRlWzEwMF07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aGVJbnB1dC5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSB0aGVJbnB1dC5yZWFkKG15Qnl0ZXMsIHRvdGFsQnl0ZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUJ5dGVzLmxlbmd0aCAtIHRvdGFsQnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkID0gdG90YWxCeXRlc1JlYWQgKyBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQlyZWNlaXZlZFN0cmluZyA9IG5ldyBTdHJpbmcobXlCeXRlcywgMCwgdG90YWxCeXRlc1JlYWQpOwotCQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJCSJHb3QgdW5leHBlY3RlZCBkYXRhIGRhdGEgd2hlbiB0dXJuaW5nIG9uL29mZigyKToiCi0JCQkJCQkJCQkrIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZwotCQkJCQkJCQkJKyBzZW5kU3RyaW5nLCByZWNlaXZlZFN0cmluZwotCQkJCQkJCQkJLmVxdWFscyhzZW5kU3RyaW5nICsgc2VuZFN0cmluZykpOworICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFN0cmluZyA9IG5ldyBTdHJpbmcobXlCeXRlcywgMCwgdG90YWxCeXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgdW5leHBlY3RlZCBkYXRhIGRhdGEgd2hlbiB0dXJuaW5nIG9uL29mZigyKToiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlY2VpdmVkU3RyaW5nICsgIjoiICsgc2VuZFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZW5kU3RyaW5nLCByZWNlaXZlZFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhzZW5kU3RyaW5nICsgc2VuZFN0cmluZykpOwogCi0JCQkJCS8vIG5vdyB0dXJuIGJhY2sgb24gYW5kIGdldCBkYXRhLiBIZXJlIHdlIGFsc28KLQkJCQkJLy8gZ2V0IHRoZSBwcmV2aW91c2x5IHNlbnQgYnl0ZSBvZiB1cmdlbnQgZGF0YSBhcyBpdCBpcwotCQkJCQkvLyBzdGlsbCBpbiB0aGUgdXJnZW50IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAvLyBub3cgdHVybiBiYWNrIG9uIGFuZCBnZXQgZGF0YS4gSGVyZSB3ZSBhbHNvCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJldmlvdXNseSBzZW50IGJ5dGUgb2YgdXJnZW50IGRhdGEgYXMgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgaW4gdGhlIHVyZ2VudCBidWZmZXIKIAotCQkJCQkvLyBzZW5kIHRoZSByZWd1bGFyIGRhdGEKLQkJCQkJc2VuZFN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgLSBVcmdlbnQgRGF0YSIpOwotCQkJCQl0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQkJdGhlT3V0cHV0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHJlZ3VsYXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBzZW5kU3RyaW5nID0gbmV3IFN0cmluZygiVGVzdCAtIFVyZ2VudCBEYXRhIik7CisgICAgICAgICAgICAgICAgICAgIHRoZU91dHB1dC53cml0ZShzZW5kU3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgICAgICB0aGVPdXRwdXQuZmx1c2goKTsKIAotCQkJCQkvLyBzZW5kIHRoZSB1cmdlbnQgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVjZWl2ZWQgYWdhaW4KLQkJCQkJdGhlU29ja2V0LnNldE9PQklubGluZSh0cnVlKTsKLQkJCQkJc2VydlNvY2suc2VuZFVyZ2VudERhdGEodXJnZW50RGF0YS5nZXRCeXRlcygpWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgdXJnZW50IGRhdGEgd2hpY2ggc2hvdWxkIGJlIHJlY2VpdmVkIGFnYWluCisgICAgICAgICAgICAgICAgICAgIHRoZVNvY2tldC5zZXRPT0JJbmxpbmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CiAKLQkJCQkJdGhlT3V0cHV0LndyaXRlKHNlbmRTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXRoZU91dHB1dC5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICB0aGVPdXRwdXQud3JpdGUoc2VuZFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhlT3V0cHV0LmZsdXNoKCk7CiAKLQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CiAKLQkJCQkJdG90YWxCeXRlc1JlYWQgPSAwOwotCQkJCQlteUJ5dGVzID0gbmV3IGJ5dGVbMTAwXTsKLQkJCQkJd2hpbGUgKHRoZUlucHV0LmF2YWlsYWJsZSgpID4gMCkgewotCQkJCQkJaW50IGJ5dGVzUmVhZCA9IHRoZUlucHV0LnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCi0JCQkJCQkJCW15Qnl0ZXMubGVuZ3RoIC0gdG90YWxCeXRlc1JlYWQpOwotCQkJCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJCQkJfQorICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhlSW5wdXQuYXZhaWxhYmxlKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gdGhlSW5wdXQucmVhZChteUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKLQkJCQkJLy8gZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB3ZSBtYXkgZ2V0IHRoZSBwcmV2aW91c2x5IHNlbnQKLQkJCQkJLy8gdXJnZW50IGRhdGEgb3Igbm90IChleGFtcGxlcyB3aW5kb3dzLXllcywgTGludXgtbm8pLgotCQkJCQkvLyBTbyBhY2NlcHQgZWl0aGVyIHNvIGxvbmcgYXMgd2UgZ2V0IHRoZSB1cmdlbnQgZGF0YSBmcm9tCi0JCQkJCS8vIHdoZW4gaXQgd2FzIG9uLgotCQkJCQlhc3NlcnRUcnVlKAotCQkJCQkJCSJEaWQgbm90IGdldCB1cmdlbnQgZGF0YSB3aGVuIHR1cm5pbmcgb24vb2ZmKDMpIEdPVDoiCi0JCQkJCQkJCQkrIHJlY2VpdmVkU3RyaW5nICsgIjpFeHBlY3RlZCIgKyB1cmdlbnREYXRhCi0JCQkJCQkJCQkrIHNlbmRTdHJpbmcgKyB1cmdlbnREYXRhICsgc2VuZFN0cmluZwotCQkJCQkJCQkJKyAiOk9SOiIgKyBzZW5kU3RyaW5nICsgdXJnZW50RGF0YQotCQkJCQkJCQkJKyBzZW5kU3RyaW5nLAotCQkJCQkJCShyZWNlaXZlZFN0cmluZy5lcXVhbHModXJnZW50RGF0YSArIHNlbmRTdHJpbmcKLQkJCQkJCQkJCSsgdXJnZW50RGF0YSArIHNlbmRTdHJpbmcpIHx8IHJlY2VpdmVkU3RyaW5nCi0JCQkJCQkJCQkuZXF1YWxzKHNlbmRTdHJpbmcgKyB1cmdlbnREYXRhCi0JCQkJCQkJCQkJCSsgc2VuZFN0cmluZykpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB3ZSBtYXkgZ2V0IHRoZSBwcmV2aW91c2x5IHNlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gdXJnZW50IGRhdGEgb3Igbm90IChleGFtcGxlcyB3aW5kb3dzLXllcywgTGludXgtbm8pLgorICAgICAgICAgICAgICAgICAgICAvLyBTbyBhY2NlcHQgZWl0aGVyIHNvIGxvbmcgYXMgd2UgZ2V0IHRoZSB1cmdlbnQgZGF0YSBmcm9tCisgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gaXQgd2FzIG9uLgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgbm90IGdldCB1cmdlbnQgZGF0YSB3aGVuIHR1cm5pbmcgb24vb2ZmKDMpIEdPVDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlY2VpdmVkU3RyaW5nICsgIjpFeHBlY3RlZCIgKyB1cmdlbnREYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlbmRTdHJpbmcgKyB1cmdlbnREYXRhICsgc2VuZFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOk9SOiIgKyBzZW5kU3RyaW5nICsgdXJnZW50RGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZW5kU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlZFN0cmluZy5lcXVhbHModXJnZW50RGF0YSArIHNlbmRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdXJnZW50RGF0YSArIHNlbmRTdHJpbmcpIHx8IHJlY2VpdmVkU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbmRTdHJpbmcgKyB1cmdlbnREYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VuZFN0cmluZykpKTsKIAotCQkJCQl0aGVTb2NrZXQuY2xvc2UoKTsKLQkJCQkJc2VydmVyU29ja2V0LmNsb3NlKCk7Ci0JCQkJfQorICAgICAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJLy8gbm93IHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25seSB1cmdlbnQgZGF0YQotCQkJCXRoZUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCi0JCQkJCQlTdXBwb3J0X1BvcnRNYW5hZ2VyLmdldE5leHRQb3J0KCkpOwotCQkJCXRoZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCQkJc2VydmVyU29ja2V0LmJpbmQodGhlQWRkcmVzcyk7Ci0JCQkJdGhlU29ja2V0LmNvbm5lY3QodGhlQWRkcmVzcyk7Ci0JCQkJc2VydlNvY2sgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7Ci0JCQkJdGhlSW5wdXQgPSB0aGVTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQl0aGVPdXRwdXQgPSBzZXJ2U29jay5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAvLyBub3cgdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBvbmx5IHVyZ2VudCBkYXRhCisgICAgICAgICAgICAgICAgdGhlQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKSk7CisgICAgICAgICAgICAgICAgdGhlU29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuY29ubmVjdCh0aGVBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBzZXJ2U29jayA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICB0aGVJbnB1dCA9IHRoZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIHRoZU91dHB1dCA9IHNlcnZTb2NrLmdldE91dHB1dFN0cmVhbSgpOwogCi0JCQkJLy8gc2VuZCB0aGUgdXJnZW50IGRhdGEgd2hpY2ggc2hvdWxkIG5vdCBiZSByZWNlaXZlZC4KLQkJCQl0aGVTb2NrZXQuc2V0T09CSW5saW5lKHRydWUpOwotCQkJCXNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CisgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgdXJnZW50IGRhdGEgd2hpY2ggc2hvdWxkIG5vdCBiZSByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICB0aGVTb2NrZXQuc2V0T09CSW5saW5lKHRydWUpOworICAgICAgICAgICAgICAgIHNlcnZTb2NrLnNlbmRVcmdlbnREYXRhKHVyZ2VudERhdGEuZ2V0Qnl0ZXMoKVswXSk7CiAKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwogCi0JCQkJdG90YWxCeXRlc1JlYWQgPSAwOwotCQkJCW15Qnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOwotCQkJCXdoaWxlICh0aGVJbnB1dC5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQkJaW50IGJ5dGVzUmVhZCA9IHRoZUlucHV0LnJlYWQobXlCeXRlcywgdG90YWxCeXRlc1JlYWQsCi0JCQkJCQkJbXlCeXRlcy5sZW5ndGggLSB0b3RhbEJ5dGVzUmVhZCk7Ci0JCQkJCXRvdGFsQnl0ZXNSZWFkID0gdG90YWxCeXRlc1JlYWQgKyBieXRlc1JlYWQ7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgICAgICAgICBteUJ5dGVzID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodGhlSW5wdXQuYXZhaWxhYmxlKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSB0aGVJbnB1dC5yZWFkKG15Qnl0ZXMsIHRvdGFsQnl0ZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15Qnl0ZXMubGVuZ3RoIC0gdG90YWxCeXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXJlY2VpdmVkU3RyaW5nID0gbmV3IFN0cmluZyhteUJ5dGVzLCAwLCB0b3RhbEJ5dGVzUmVhZCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBnZXQgdXJnZW50IGRhdGEgb25seSB1cmdlbnQgZGF0YSBzZW50OiIKLQkJCQkJCSsgcmVjZWl2ZWRTdHJpbmcgKyAiOiIgKyB1cmdlbnREYXRhLCByZWNlaXZlZFN0cmluZwotCQkJCQkJLmVxdWFscyh1cmdlbnREYXRhKSk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKG15Qnl0ZXMsIDAsIHRvdGFsQnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGdldCB1cmdlbnQgZGF0YSBvbmx5IHVyZ2VudCBkYXRhIHNlbnQ6IgorICAgICAgICAgICAgICAgICAgICAgICAgKyByZWNlaXZlZFN0cmluZyArICI6IiArIHVyZ2VudERhdGEsIHJlY2VpdmVkU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHVyZ2VudERhdGEpKTsKIAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBmb3IgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgdXJnZW50IGRhdGEgd2UgZXhwZWN0IGFuCi0JCQkJLy8gZXhjZXB0aW9uLiBGb3IgdGhlIG90aGVycyByZXBvcnQgYW4gZXJyb3IuCi0JCQkJLy8gVE9ETyA6IE5lZWQgdG8gaW50cm9kdWNlIGEgYmV0dGVyIHRlc3QgZm9yIHRoZSBleGNlcHRpb24KLQkJCQkvLyBzbyB0aGF0IHRoZSBmYWlsdXJlIG9ubHkgb2NjdXJzIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLQkJCQkvLyB1cmdlbnQgZGF0YQotCQkJCWZhaWwoIlBsYXRmb3JtOiIgKyBwbGF0Zm9ybQotCQkJCQkJKyAiOiBHb3QgZXhjZXB0aW9uIGR1cmluZyBzZW5kVXJnZW50IGRhdGEgdGVzdHMiCi0JCQkJCQkrIGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGZvciBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB1cmdlbnQgZGF0YSB3ZSBleHBlY3QgYW4KKyAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24uIEZvciB0aGUgb3RoZXJzIHJlcG9ydCBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICAvLyBUT0RPIDogTmVlZCB0byBpbnRyb2R1Y2UgYSBiZXR0ZXIgdGVzdCBmb3IgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGZhaWx1cmUgb25seSBvY2N1cnMgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorICAgICAgICAgICAgICAgIC8vIHVyZ2VudCBkYXRhCisgICAgICAgICAgICAgICAgZmFpbCgiUGxhdGZvcm06IiArIHBsYXRmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICArICI6IEdvdCBleGNlcHRpb24gZHVyaW5nIHNlbmRVcmdlbnQgZGF0YSB0ZXN0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qCi0JICogQHRlc3RzIGphdmEubmV0LlNvY2tldCNzZXRQZXJmb3JtYW5jZVByZWZlcmVuY2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlX0ludF9JbnRfSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCXRoZVNvY2tldC5zZXRQZXJmb3JtYW5jZVByZWZlcmVuY2VzKDEsIDEsIDEpOwotCX0KKyAgICAvKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQZXJmb3JtYW5jZVByZWZlcmVuY2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlX0ludF9JbnRfSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNvY2tldCB0aGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgIHRoZVNvY2tldC5zZXRQZXJmb3JtYW5jZVByZWZlcmVuY2VzKDEsIDEsIDEpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjU29ja2V0KFByb3h5KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfUHJveHlfRXhjZXB0aW9uKCkgeworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Tb2NrZXQjU29ja2V0KFByb3h5KQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Qcm94eS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9Qcm94eV9FeGNlcHRpb24oKSB7CiAKLQkJU29ja2V0QWRkcmVzcyBhZGRyMSA9IEluZXRTb2NrZXRBZGRyZXNzLmNyZWF0ZVVucmVzb2x2ZWQoIjEyNy4wLjAuMSIsCi0JCQkJODApOwotCQlTb2NrZXRBZGRyZXNzIGFkZHIyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCJsb2NhbGhvc3QiLCA4MCk7CisgICAgICAgIFNvY2tldEFkZHJlc3MgYWRkcjEgPSBJbmV0U29ja2V0QWRkcmVzcy5jcmVhdGVVbnJlc29sdmVkKCIxMjcuMC4wLjEiLAorICAgICAgICAgICAgICAgIDgwKTsKKyAgICAgICAgU29ja2V0QWRkcmVzcyBhZGRyMiA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygibG9jYWxob3N0IiwgODApOwogCi0JCVByb3h5IHByb3h5MSA9IG5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsIGFkZHIxKTsKLQkJLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHRlc3QKLQkJdHJ5IHsKLQkJCW5ldyBTb2NrZXQocHJveHkxKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KKyAgICAgICAgUHJveHkgcHJveHkxID0gbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwgYWRkcjEpOworICAgICAgICAvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdGVzdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFNvY2tldChwcm94eTEpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCVByb3h5IHByb3h5MiA9IG5ldyBQcm94eShQcm94eS5UeXBlLlNPQ0tTLCBhZGRyMSk7Ci0JCS8vIHNob3VsZCBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbgotCQluZXcgU29ja2V0KHByb3h5Mik7Ci0JCW5ldyBTb2NrZXQoUHJveHkuTk9fUFJPWFkpOworICAgICAgICBQcm94eSBwcm94eTIgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5TT0NLUywgYWRkcjEpOworICAgICAgICAvLyBzaG91bGQgbm90IHRocm93IGFueSBleGNlcHRpb24KKyAgICAgICAgbmV3IFNvY2tldChwcm94eTIpOworICAgICAgICBuZXcgU29ja2V0KFByb3h5Lk5PX1BST1hZKTsKIAotCQkvLyBTZWN1cml0eUV4Y2VwdGlvbiB0ZXN0Ci0JCVNlY3VyaXR5TWFuYWdlciBvcmlnaW5hbFNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IE1vY2tTZWN1cml0eU1hbmFnZXIoKSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oIk5vIHBlcm1pc3Npb24gdG8gc2V0U2VjdXJpdHlNYW5hZ2VyLCBzZWN1cml0eSByZWxhdGVkIHRlc3QgaW4gdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9Qcm94eV9TZWN1cml0eSBpcyBpZ25vcmVkIik7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAgICAgLy8gU2VjdXJpdHlFeGNlcHRpb24gdGVzdAorICAgICAgICBTZWN1cml0eU1hbmFnZXIgb3JpZ2luYWxTZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyKCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyCisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJObyBwZXJtaXNzaW9uIHRvIHNldFNlY3VyaXR5TWFuYWdlciwgc2VjdXJpdHkgcmVsYXRlZCB0ZXN0IGluIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfUHJveHlfU2VjdXJpdHkgaXMgaWdub3JlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJUHJveHkgcHJveHkzID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHIxKTsKLQkJUHJveHkgcHJveHk0ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHIyKTsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJbmV3IFNvY2tldChwcm94eTMpOwotCQkJCWZhaWwoInNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiIpOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCS8vIGV4cGVjdGVkCi0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBTb2NrZXQocHJveHk0KTsKLQkJCQlmYWlsKCJzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24iKTsKLQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBleHBlY3RlZAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvcmlnaW5hbFNlY3VyaXR5TWFuYWdlcik7Ci0JCX0KKyAgICAgICAgUHJveHkgcHJveHkzID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHIxKTsKKyAgICAgICAgUHJveHkgcHJveHk0ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuU09DS1MsIGFkZHIyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmV3IFNvY2tldChwcm94eTMpOworICAgICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5ldyBTb2NrZXQocHJveHk0KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvcmlnaW5hbFNlY3VyaXR5TWFuYWdlcik7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNvY2tldCNjb25uZWN0KFNvY2tldEFkZHJlc3MpIHRyeSBhbiB1bmtub3duaG9zdAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVW5rbm93bkhvc3RFeGNlcHRpb24gY2hlY2tpbmcgb25seS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25uZWN0X3Vua25vd25ob3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CiAgICAgICAgIHRyeSB7CkBAIC0yNDIyLDYgKzI4OTYsMTUgQEAKICAgICAgKiBAdGVzdHMgU29ja2V0I2Nvbm5lY3QoU29ja2V0QWRkcmVzcykgdHJ5IGFuIHVua25vd25ob3N0IGNyZWF0ZWQgYnkKICAgICAgKiAgICAgICAgY3JlYXRlVW5yZXNvbHZlZCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJVbmtub3duSG9zdEV4Y2VwdGlvbiBjaGVja2luZyBvbmx5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3RfdW5yZXNvbHZlZF91bmtub3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CiAgICAgICAgIHRyeSB7CkBAIC0yNDM3LDYgKzI5MjAsMTUgQEAKICAgICAgKiBAdGVzdHMgU29ja2V0I2Nvbm5lY3QoU29ja2V0QWRkcmVzcykgdHJ5IGEga25vd24gaG9zdCBjcmVhdGVkIGJ5CiAgICAgICogICAgICAgIGNyZWF0ZVVucmVzb2x2ZWQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJVbmtub3duSG9zdEV4Y2VwdGlvbiBjaGVja2luZyBvbmx5LiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3RfdW5yZXNvbHZlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTb2NrZXQgc29ja2V0ID0gbmV3IFNvY2tldCgpOwogICAgICAgICB0cnkgewpAQCAtMjQ1Miw2ICsyOTQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNvY2tldCNnZXRPdXRwdXRTdHJlYW0oKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU29ja2V0RXhjZXB0aW9uIGNoZWNraW5nIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE91dHB1dFN0cmVhbV9zaHV0ZG93bk91dHB1dCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktODczCiAgICAgICAgIFNlcnZlclNvY2tldCBzcyA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7CkBAIC0yNDcwLDYgKzI5NzEsMTUgQEAKICAgICAgKiBAdGVzdHMgU29ja2V0I3NodXRkb3duSW5wdXQoKQogICAgICAqIEB0ZXN0cyBTb2NrZXQjc2h1dGRvd25PdXRwdXQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNodXRkb3duSW5wdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NodXRkb3duSW5wdXRPdXRwdXRfdHdpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTI5NDQKICAgICAgICAgU29ja2V0IHMgPSBuZXcgU29ja2V0KCIwLjAuMC4wIiwgMCwgZmFsc2UpOwpAQCAtMjQ5MSw2MiArMzAwMSw2MiBAQAogICAgICAgICB9CiAgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICogCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocyAhPSBudWxsKQotCQkJCXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJaWYgKHNzICE9IG51bGwpCi0JCQkJc3MuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJaWYgKHQgIT0gbnVsbCkKLQkJCQl0LmludGVycnVwdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBNb2NrU2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKKyAgICBzdGF0aWMgY2xhc3MgTW9ja1NlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAKLQkJcHVibGljIHZvaWQgY2hlY2tDb25uZWN0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewotCQkJaWYgKCIxMjcuMC4wLjEiLmVxdWFscyhob3N0KSkgewotCQkJCXRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigicGVybWlzc2lvbiBpcyBub3QgYWxsb3dlZCIpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrQ29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKyAgICAgICAgICAgIGlmICgiMTI3LjAuMC4xIi5lcXVhbHMoaG9zdCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oInBlcm1pc3Npb24gaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKLQkJCXJldHVybjsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHN0YXJ0U2VydmVyKFN0cmluZyBuYW1lKSB7Ci0JCWludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOwotCQl0cnkgewotCQkJc3MgPSBuZXcgU2VydmVyU29ja2V0KHBvcnROdW1iZXIsIDUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKG5hbWUgKyAiOiAiICsgZSk7Ci0JCX0KLQkJcmV0dXJuIHNzLmdldExvY2FsUG9ydCgpOwotCX0KKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHN0YXJ0U2VydmVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGludCBwb3J0TnVtYmVyID0gU3VwcG9ydF9Qb3J0TWFuYWdlci5nZXROZXh0UG9ydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3MgPSBuZXcgU2VydmVyU29ja2V0KHBvcnROdW1iZXIsIDUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKG5hbWUgKyAiOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNzLmdldExvY2FsUG9ydCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0VGVzdENhc2UuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvU29ja2V0VGVzdENhc2UuamF2YQppbmRleCBmZTVhNjk1Li40YmM0NTliIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1NvY2tldFRlc3RDYXNlLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Tb2NrZXRUZXN0Q2FzZS5qYXZhCkBAIC0xNywxNTMgKzE3LDE1NiBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uZXQuU29ja2V0LmNsYXNzKSAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb2NrZXRUZXN0Q2FzZSBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19NVUxUSUNBU1QgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX01VTFRJQ0FTVCA9IDA7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19NVUxUSUNBU1RfSU5URVJGQUNFID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19NVUxUSUNBU1RfSU5URVJGQUNFID0gMTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX0xJTkdFUiA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fTElOR0VSID0gMjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1JDVkJVRiA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fUkNWQlVGID0gMzsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1RJTUVPVVQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1RJTUVPVVQgPSA0OwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fU05EQlVGID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19TTkRCVUYgPSA1OwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVENQX05PREVMQVkgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRDUF9OT0RFTEFZID0gNjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX0tFRVBBTElWRSA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fS0VFUEFMSVZFID0gNzsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1JFVVNFQUREUiA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fUkVVU0VBRERSID0gODsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX09PQklOTElORSA9IDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fT09CSU5MSU5FID0gOTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQX1RPUyA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQX1RPUyA9IDEwOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fQlJPQURDQVNUID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fQlJPQURDQVNUID0gMTE7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19VU0VMT09QQkFDSyA9IDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1VTRUxPT1BCQUNLID0gMTI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5VWCA9ICJMaW51eCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOVVggPSAiTGludXgiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG9zRG9lc05vdFN1cHBvcnRPcGVyYXRpb25TdHJpbmcgPSAiVGhlIHNvY2tldCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBvc0RvZXNOb3RTdXBwb3J0T3BlcmF0aW9uU3RyaW5nID0gIlRoZSBzb2NrZXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBvc0RvZXNOb3RTdXBwb3J0T3B0aW9uU3RyaW5nID0gIlRoZSBzb2NrZXQgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBvc0RvZXNOb3RTdXBwb3J0T3B0aW9uU3RyaW5nID0gIlRoZSBzb2NrZXQgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG9zRG9lc05vdFN1cHBvcnRPcHRpb25Bcmd1bWVudFN0cmluZyA9ICJUaGUgc29ja2V0IG9wdGlvbiBhcmd1bWVudHMgYXJlIGludmFsaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBvc0RvZXNOb3RTdXBwb3J0T3B0aW9uQXJndW1lbnRTdHJpbmcgPSAiVGhlIHNvY2tldCBvcHRpb24gYXJndW1lbnRzIGFyZSBpbnZhbGlkIjsKIAotCXB1YmxpYyBTb2NrZXRUZXN0Q2FzZSgpIHsKLQl9CisgICAgcHVibGljIFNvY2tldFRlc3RDYXNlKCkgeworICAgIH0KIAotCXB1YmxpYyBTb2NrZXRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CisgICAgcHVibGljIFNvY2tldFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KIAotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBPUyBzdXBwb3J0cyB0aGUgZ2l2ZW4gc29ja2V0IG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRPcHRpb25Jc1N1cHBvcnRlZChpbnQgb3B0aW9uKSB7Ci0JCXN3aXRjaCAob3B0aW9uKSB7Ci0JCWNhc2UgU09fUkNWQlVGOgotCQljYXNlIFNPX1NOREJVRjoKLQkJCXJldHVybiB0cnVlOwotCQljYXNlIFNPX01VTFRJQ0FTVDoKLQkJY2FzZSBTT19NVUxUSUNBU1RfSU5URVJGQUNFOgotCQljYXNlIFNPX0xJTkdFUjoKLQkJCXJldHVybiB0cnVlOwotCQljYXNlIFRDUF9OT0RFTEFZOgotCQljYXNlIFNPX1RJTUVPVVQ6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJY2FzZSBTT19LRUVQQUxJVkU6Ci0JCWNhc2UgU09fUkVVU0VBRERSOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgU09fT09CSU5MSU5FOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgSVBfVE9TOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgU09fQlJPQURDQVNUOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgU09fVVNFTE9PUEJBQ0s6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIEFuc3dlciB3aGV0aGVyIHRoZSBPUyBzdXBwb3J0cyB0aGUgZ2l2ZW4gc29ja2V0IG9wdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcHRpb25Jc1N1cHBvcnRlZChpbnQgb3B0aW9uKSB7CisgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgIGNhc2UgU09fUkNWQlVGOgorICAgICAgICBjYXNlIFNPX1NOREJVRjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFNPX01VTFRJQ0FTVDoKKyAgICAgICAgY2FzZSBTT19NVUxUSUNBU1RfSU5URVJGQUNFOgorICAgICAgICBjYXNlIFNPX0xJTkdFUjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFRDUF9OT0RFTEFZOgorICAgICAgICBjYXNlIFNPX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBTT19LRUVQQUxJVkU6CisgICAgICAgIGNhc2UgU09fUkVVU0VBRERSOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgU09fT09CSU5MSU5FOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgSVBfVE9TOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgU09fQlJPQURDQVNUOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgU09fVVNFTE9PUEJBQ0s6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0JLyoqCi0JICogSWYgdGhlIGV4Y2VwdGlvbiBpcyAic29ja2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiIgZXhjZXB0aW9uIGFuZAotCSAqIGl0IGlzIGV4cGVjdGVkIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLCBkbyBub3RoaW5nLiBPdGhlcndpc2UsIGZhaWwgdGhlCi0JICogdGVzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oRXhjZXB0aW9uIGUsIGludCBvcHRpb24pIHsKLQkJaWYgKCFnZXRPcHRpb25Jc1N1cHBvcnRlZChvcHRpb24pKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbAotCQkJCQkmJiAobWVzc2FnZS5lcXVhbHMob3NEb2VzTm90U3VwcG9ydE9wZXJhdGlvblN0cmluZykKLQkJCQkJCQl8fCBtZXNzYWdlLmVxdWFscyhvc0RvZXNOb3RTdXBwb3J0T3B0aW9uU3RyaW5nKSB8fCBtZXNzYWdlCi0JCQkJCQkJLmVxdWFscyhvc0RvZXNOb3RTdXBwb3J0T3B0aW9uQXJndW1lbnRTdHJpbmcpKSkgewotCQkJCS8qCi0JCQkJICogVGhpcyBleGNlcHRpb24gaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IgZm9yIHBsYXRmb3JtcyB3aGljaCBkbwotCQkJCSAqIG5vdCBzdXBwb3J0IHRoZSBvcHRpb24KLQkJCQkgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJZmFpbCgiVGhyZXcgXCIiCi0JCQkJCQkrIGUKLQkJCQkJCSsgIlwiIGluc3RlYWQgb2YgY29ycmVjdCBleGNlcHRpb24gZm9yIHVuc3VwcG9ydGVkIHNvY2tldCBvcHRpb246ICIKLQkJCQkJCSsgZ2V0U29ja2V0T3B0aW9uU3RyaW5nKG9wdGlvbikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmFpbCgiRXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZXhjZXB0aW9uIGlzICJzb2NrZXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIiBleGNlcHRpb24gYW5kCisgICAgICogaXQgaXMgZXhwZWN0ZWQgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0sIGRvIG5vdGhpbmcuIE90aGVyd2lzZSwgZmFpbCB0aGUKKyAgICAgKiB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihFeGNlcHRpb24gZSwgaW50IG9wdGlvbikgeworICAgICAgICBpZiAoIWdldE9wdGlvbklzU3VwcG9ydGVkKG9wdGlvbikpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIChtZXNzYWdlLmVxdWFscyhvc0RvZXNOb3RTdXBwb3J0T3BlcmF0aW9uU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1lc3NhZ2UuZXF1YWxzKG9zRG9lc05vdFN1cHBvcnRPcHRpb25TdHJpbmcpIHx8IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9zRG9lc05vdFN1cHBvcnRPcHRpb25Bcmd1bWVudFN0cmluZykpKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciBmb3IgcGxhdGZvcm1zIHdoaWNoIGRvCisgICAgICAgICAgICAgICAgICogbm90IHN1cHBvcnQgdGhlIG9wdGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaHJldyBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgaW5zdGVhZCBvZiBjb3JyZWN0IGV4Y2VwdGlvbiBmb3IgdW5zdXBwb3J0ZWQgc29ja2V0IG9wdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRTb2NrZXRPcHRpb25TdHJpbmcob3B0aW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgc29ja2V0IG9wdGlvbiB0ZXN0J3MgY29kZQotCSAqIGJ1dCBiZWZvcmUgdGhlIGV4Y2VwdGlvbiBjYXRjaCBzdGF0ZW1lbnRzLiBJdCB0aHJvd3MgYSBmYWlsdXJlIGlmIHRoZQotCSAqIG9wdGlvbiBnaXZlbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtIGJ1dCB0aGUgVk0gZmFpbGVkCi0JICogdG8gdGhyb3cgYW4gZXhjZXB0aW9uLiBTbywgb24gcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZSBvcHRpb24sCi0JICogdGhlIGV4ZWN1dGlvbiBzaG91bGQgbmV2ZXIgZ2V0IHRvIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoaW50IG9wdGlvbikgewotCQlpZiAoIWdldE9wdGlvbklzU3VwcG9ydGVkKG9wdGlvbikpIHsKLQkJCVN0cmluZyBwbGF0Zm9ybSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotCQkJU3RyaW5nIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsKLQkJCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24gZm9yIHVuc3VwcG9ydGVkIHNvY2tldCBvcHRpb246ICIKLQkJCQkJKyBnZXRTb2NrZXRPcHRpb25TdHJpbmcob3B0aW9uKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgc29ja2V0IG9wdGlvbiB0ZXN0J3MgY29kZQorICAgICAqIGJ1dCBiZWZvcmUgdGhlIGV4Y2VwdGlvbiBjYXRjaCBzdGF0ZW1lbnRzLiBJdCB0aHJvd3MgYSBmYWlsdXJlIGlmIHRoZQorICAgICAqIG9wdGlvbiBnaXZlbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtIGJ1dCB0aGUgVk0gZmFpbGVkCisgICAgICogdG8gdGhyb3cgYW4gZXhjZXB0aW9uLiBTbywgb24gcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZSBvcHRpb24sCisgICAgICogdGhlIGV4ZWN1dGlvbiBzaG91bGQgbmV2ZXIgZ2V0IHRvIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuc3VyZUV4Y2VwdGlvblRocm93bklmT3B0aW9uSXNVbnN1cHBvcnRlZE9uT1MoaW50IG9wdGlvbikgeworICAgICAgICBpZiAoIWdldE9wdGlvbklzU3VwcG9ydGVkKG9wdGlvbikpIHsKKyAgICAgICAgICAgIFN0cmluZyBwbGF0Zm9ybSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOworICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24gZm9yIHVuc3VwcG9ydGVkIHNvY2tldCBvcHRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRTb2NrZXRPcHRpb25TdHJpbmcob3B0aW9uKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBBbnN3ZXIgYSBzdHJpbmcgZm9yIHRoZSBzb2NrZXQgb3B0aW9uIGdpdmVuLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNvY2tldE9wdGlvblN0cmluZyhpbnQgb3B0aW9uKSB7Ci0JCXN3aXRjaCAob3B0aW9uKSB7Ci0JCWNhc2UgU09fTVVMVElDQVNUOgotCQkJcmV0dXJuICJNdWx0aWNhc3QiOwotCQljYXNlIFNPX0xJTkdFUjoKLQkJCXJldHVybiAiTGluZ2VyIjsKLQkJY2FzZSBTT19SQ1ZCVUY6Ci0JCQlyZXR1cm4gIlJlY2VpdmUgYnVmZmVyIHNpemUiOwotCQljYXNlIFNPX1RJTUVPVVQ6Ci0JCQlyZXR1cm4gIlNvY2tldCB0aW1lb3V0IjsKLQkJY2FzZSBTT19TTkRCVUY6Ci0JCQlyZXR1cm4gIlNlbmQgYnVmZmVyIHNpemUiOwotCQljYXNlIFRDUF9OT0RFTEFZOgotCQkJcmV0dXJuICJUQ1Agbm8gZGVsYXkiOwotCQljYXNlIFNPX0tFRVBBTElWRToKLQkJCXJldHVybiAiS2VlcGFsaXZlIjsKLQkJY2FzZSBTT19SRVVTRUFERFI6Ci0JCQlyZXR1cm4gIlJldXNlIGFkZHJlc3MiOwotCQljYXNlIFNPX09PQklOTElORToKLQkJCXJldHVybiAib3V0IG9mIGJhbmQgZGF0YSBpbmxpbmUiOwotCQljYXNlIElQX1RPUzoKLQkJCXJldHVybiAiVHJhZmZpYyBjbGFzcyI7Ci0JCWNhc2UgU09fQlJPQURDQVNUOgotCQkJcmV0dXJuICJicm9hZGNhc3QiOwotCQljYXNlIFNPX1VTRUxPT1BCQUNLOgotCQkJcmV0dXJuICJsb29wYmFjayI7Ci0JCX0KLQkJcmV0dXJuICJVbmtub3duIHNvY2tldCBvcHRpb24iOwotCX0KKyAgICAvKioKKyAgICAgKiBBbnN3ZXIgYSBzdHJpbmcgZm9yIHRoZSBzb2NrZXQgb3B0aW9uIGdpdmVuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFNvY2tldE9wdGlvblN0cmluZyhpbnQgb3B0aW9uKSB7CisgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgIGNhc2UgU09fTVVMVElDQVNUOgorICAgICAgICAgICAgcmV0dXJuICJNdWx0aWNhc3QiOworICAgICAgICBjYXNlIFNPX0xJTkdFUjoKKyAgICAgICAgICAgIHJldHVybiAiTGluZ2VyIjsKKyAgICAgICAgY2FzZSBTT19SQ1ZCVUY6CisgICAgICAgICAgICByZXR1cm4gIlJlY2VpdmUgYnVmZmVyIHNpemUiOworICAgICAgICBjYXNlIFNPX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlNvY2tldCB0aW1lb3V0IjsKKyAgICAgICAgY2FzZSBTT19TTkRCVUY6CisgICAgICAgICAgICByZXR1cm4gIlNlbmQgYnVmZmVyIHNpemUiOworICAgICAgICBjYXNlIFRDUF9OT0RFTEFZOgorICAgICAgICAgICAgcmV0dXJuICJUQ1Agbm8gZGVsYXkiOworICAgICAgICBjYXNlIFNPX0tFRVBBTElWRToKKyAgICAgICAgICAgIHJldHVybiAiS2VlcGFsaXZlIjsKKyAgICAgICAgY2FzZSBTT19SRVVTRUFERFI6CisgICAgICAgICAgICByZXR1cm4gIlJldXNlIGFkZHJlc3MiOworICAgICAgICBjYXNlIFNPX09PQklOTElORToKKyAgICAgICAgICAgIHJldHVybiAib3V0IG9mIGJhbmQgZGF0YSBpbmxpbmUiOworICAgICAgICBjYXNlIElQX1RPUzoKKyAgICAgICAgICAgIHJldHVybiAiVHJhZmZpYyBjbGFzcyI7CisgICAgICAgIGNhc2UgU09fQlJPQURDQVNUOgorICAgICAgICAgICAgcmV0dXJuICJicm9hZGNhc3QiOworICAgICAgICBjYXNlIFNPX1VTRUxPT1BCQUNLOgorICAgICAgICAgICAgcmV0dXJuICJsb29wYmFjayI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJVbmtub3duIHNvY2tldCBvcHRpb24iOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA4MzU5NTM0Li4zZWI3ZTY2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTYsMTA3ICsxNiwxNjggQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVVJJU3ludGF4RXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBVUklTeW50YXhFeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24jVVJJU3ludGF4RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JCS8vIHRlc3QgZm9yIENvbnN0cnVjdG9yKFN0cmluZyBzdHIsIFN0cmluZyBwcm9ibGVtLCBpbnQgaW5kZXgpOwotCQl0cnkgewotCQkJbmV3IFVSSVN5bnRheEV4Y2VwdGlvbihudWxsLCAicHJvYmxlbSIsIDIpOwotCQkJZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uI1VSSVN5bnRheEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVVJJU3ludGF4RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJKCkgeworICAgICAgICAvLyB0ZXN0IGZvciBDb25zdHJ1Y3RvcihTdHJpbmcgc3RyLCBTdHJpbmcgcHJvYmxlbSwgaW50IGluZGV4KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBVUklTeW50YXhFeGNlcHRpb24obnVsbCwgInByb2JsZW0iLCAyKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCW5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsIG51bGwsIDIpOwotCQkJZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsIG51bGwsIDIpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJbmV3IFVSSVN5bnRheEV4Y2VwdGlvbigic3RyIiwgInByb2JsZW0iLCAtMik7Ci0JCQlmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVVJJU3ludGF4RXhjZXB0aW9uKCJzdHIiLCAicHJvYmxlbSIsIC0yKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgIH0KIAotCQlVUklTeW50YXhFeGNlcHRpb24gZSA9IG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsICJwcm9ibGVtIiwgMik7Ci0JCWFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IHJlYXNvbiIsICJwcm9ibGVtIiwgZS5nZXRSZWFzb24oKSk7Ci0JCWFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IGlucHV0IiwgInN0ciIsIGUuZ2V0SW5wdXQoKSk7Ci0JCWFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IGluZGV4IiwgMiwgZS5nZXRJbmRleCgpKTsKLQl9CisgICAgICAgIFVSSVN5bnRheEV4Y2VwdGlvbiBlID0gbmV3IFVSSVN5bnRheEV4Y2VwdGlvbigic3RyIiwgInByb2JsZW0iLCAyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm5lZCBpbmNvcnJlY3QgcmVhc29uIiwgInByb2JsZW0iLCBlLmdldFJlYXNvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm5lZCBpbmNvcnJlY3QgaW5wdXQiLCAic3RyIiwgZS5nZXRJbnB1dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm5lZCBpbmNvcnJlY3QgaW5kZXgiLCAyLCBlLmdldEluZGV4KCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24jVVJJU3ludGF4RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIHRlc3QgZm9yIENvbnN0cnVjdG9yKFN0cmluZyBzdHIsIFN0cmluZyBwcm9ibGVtKTsKLQkJdHJ5IHsKLQkJCW5ldyBVUklTeW50YXhFeGNlcHRpb24obnVsbCwgInByb2JsZW0iKTsKLQkJCWZhaWwoIkV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbiNVUklTeW50YXhFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVUklTeW50YXhFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIHRlc3QgZm9yIENvbnN0cnVjdG9yKFN0cmluZyBzdHIsIFN0cmluZyBwcm9ibGVtKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBVUklTeW50YXhFeGNlcHRpb24obnVsbCwgInByb2JsZW0iKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCW5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsIG51bGwpOwotCQkJZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgIH0KIAotCQlVUklTeW50YXhFeGNlcHRpb24gZSA9IG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsICJwcm9ibGVtIik7Ci0JCWFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IHJlYXNvbiIsICJwcm9ibGVtIiwgZS5nZXRSZWFzb24oKSk7Ci0JCWFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IGlucHV0IiwgInN0ciIsIGUuZ2V0SW5wdXQoKSk7Ci0JCWFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IGluZGV4IiwgLTEsIGUuZ2V0SW5kZXgoKSk7Ci0JfQorICAgICAgICBVUklTeW50YXhFeGNlcHRpb24gZSA9IG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsICJwcm9ibGVtIik7CisgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IHJlYXNvbiIsICJwcm9ibGVtIiwgZS5nZXRSZWFzb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IGlucHV0IiwgInN0ciIsIGUuZ2V0SW5wdXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuZWQgaW5jb3JyZWN0IGluZGV4IiwgLTEsIGUuZ2V0SW5kZXgoKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbiNnZXRJbmRleCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRJbmRleCgpIHsKLQkJLy8gc2VlIGNvbnN0cnVjdG9yIHRlc3RzCi0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24jZ2V0SW5kZXgoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBlbXB0eSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbmRleCgpIHsKKyAgICAgICAgLy8gc2VlIGNvbnN0cnVjdG9yIHRlc3RzCisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbiNnZXRSZWFzb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVhc29uKCkgewotCQkvLyBzZWUgY29uc3RydWN0b3IgdGVzdHMKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbiNnZXRSZWFzb24oKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBlbXB0eSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlYXNvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVhc29uKCkgeworICAgICAgICAvLyBzZWUgY29uc3RydWN0b3IgdGVzdHMKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uI2dldElucHV0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldElucHV0KCkgewotCQkvLyBzZWUgY29uc3RydWN0b3IgdGVzdHMKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbiNnZXRJbnB1dCgpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGVtcHR5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5wdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldElucHV0KCkgeworICAgICAgICAvLyBzZWUgY29uc3RydWN0b3IgdGVzdHMKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uI2dldE1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKLQkJLy8gdGVzdHMgZm9yIGphdmEubGFuZy5TdHJpbmcgZ2V0TWVzc2FnZSgpCi0JCUxvY2FsZS5zZXREZWZhdWx0KExvY2FsZS5VUyk7Ci0JCVVSSVN5bnRheEV4Y2VwdGlvbiBlID0gbmV3IFVSSVN5bnRheEV4Y2VwdGlvbigic3RyIiwgInByb2JsZW0iLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgbWVzc2FnZSIsICJwcm9ibGVtIGF0IGluZGV4IDM6IHN0ciIsIGUKLQkJCQkuZ2V0TWVzc2FnZSgpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uI2dldE1lc3NhZ2UoKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CisgICAgCisgICAgICAgIC8vIHRlc3RzIGZvciBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQorICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuVVMpOworICAgICAgICBVUklTeW50YXhFeGNlcHRpb24gZSA9IG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsICJwcm9ibGVtIiwgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG1lc3NhZ2UiLCAicHJvYmxlbSBhdCBpbmRleCAzOiBzdHIiLCBlCisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7CiAKLQkJZSA9IG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsICJwcm9ibGVtIik7Ci0JCWFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG1lc3NhZ2UiLCAicHJvYmxlbTogc3RyIiwgZQotCQkJCS5nZXRNZXNzYWdlKCkpOwotCX0KKyAgICAgICAgZSA9IG5ldyBVUklTeW50YXhFeGNlcHRpb24oInN0ciIsICJwcm9ibGVtIik7CisgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG1lc3NhZ2UiLCAicHJvYmxlbTogc3RyIiwgZQorICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCkpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgZG9uZVN1aXRlKCkgewotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb25lU3VpdGUoKSB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9VUklUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSSVRlc3QuamF2YQppbmRleCAzNWFiMzYwLi44ZDEyZGFlYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9VUklUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9VUklUZXN0LmphdmEKQEAgLTE3LDEyICsxNywxOCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJJOwogaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhVUkkuY2xhc3MpIAogcHVibGljIGNsYXNzIFVSSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIFVSSVtdIHVyaXM7CkBAIC04NCw2ICs5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjVVJJKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVVJJIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gdGVzdHMgZm9yIHB1YmxpYyBVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbgogCkBAIC0yMTksNiArMjM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNVUkkoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlVSSVN5bnRheEV4Y2VwdGlvbiBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSSSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1VSSV9TdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBVUkkgbXlVcmkgPSBuZXcgVVJJKCI6YWJjQG15bWFpbC5jb20iKTsKQEAgLTI0OSw2ICsyNzMsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI1VSSShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSSSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyB0ZXN0cyBmb3IgcHVibGljIFVSSShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgc3NwLCBTdHJpbmcgZnJhZykgdGhyb3dzCiAgICAgICAgIC8vIFVSSVN5bnRheEV4Y2VwdGlvbgpAQCAtMjk2LDYgKzMyOSwxNSBAQAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJVUklTeW50YXhFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSSSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyB0ZXN0cyBmb3IgcHVibGljIFVSSShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgdXNlcmluZm8sIFN0cmluZyBob3N0LCBpbnQKICAgICAgICAgLy8gcG9ydCwgU3RyaW5nIHBhdGgsCkBAIC0zOTEsNiArNDMzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNVUkkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVUkkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogICAgICAgICAvLyByZWxhdGl2ZSBwYXRoCkBAIC00MzcsNiArNDg4LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNVUkkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVUkkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFVSSVN5bnRheEV4Y2VwdGlvbiBvbiByZWxhdGl2ZSBwYXRoCkBAIC00ODQsNiArNTQ0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNVUkkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVUkkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maXZlQXJnQ29uc3RydWN0b3IoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgLy8gYWNjZXB0IFtdIGFzIHBhcnQgb2YgdmFsaWQgaXB2NiBob3N0IG5hbWUKICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoImZ0cCIsICJbMDAwMToxMjM0OjowMDAxXSIsICIvZGlyMS9kaXIyIiwgInF1ZXJ5IiwKQEAgLTUxMSw2ICs1ODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2xhc3NDYXN0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuVVJJLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBhcmVUb0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBjb21wYXJlVG8gdGVzdHMKIApAQCAtNTkzLDYgKzY3MSwxNSBAQAogICAgICAqIEB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNsYXNzQ2FzdEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlVSSS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG8yKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSSB1cmksIHVyaTI7CiAKQEAgLTYxOCw2ICs3MDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBVUkkgbXlVcmkgPSBVUkkuY3JlYXRlKCJhIHNjaGVtZTovL3JlZy8iKTsKQEAgLTYzMCw2ICs3MjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBTdHJpbmdbXVtdIGVxdWFsc0RhdGEgPSBuZXcgU3RyaW5nW11bXSB7CiAgICAgICAgICAgICAgICAgeyAiIiwgIiIgfSwgLy8gbnVsbCBmcmFncwpAQCAtNzA5LDYgKzgxNCwxNSBAQAogICAgICAqIEB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHMyKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHRlc3QgVVJJcyB3aXRoIGVtcHR5IHN0cmluZyBhdXRob3JpdHkKICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoImh0dHA6Ly8vfi9kaWN0aW9uYXJ5Iik7CkBAIC03MzIsNiArODQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRBdXRob3JpdHkoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEF1dGhvcml0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXV0aG9yaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTc2NSw2ICs4ODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2dldEF1dGhvcml0eSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXV0aG9yaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdXRob3JpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHRlc3RzIGZvciBVUklzIHdpdGggZW1wdHkgc3RyaW5nIGF1dGhvcml0eSBjb21wb25lbnQKIApAQCAtODEwLDYgKzk0MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjZ2V0RnJhZ21lbnQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZyYWdtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGcmFnbWVudCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUklbXSB1cmlzID0gZ2V0VXJpcygpOwogCkBAIC04MzQsNiArOTc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRIb3N0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRIb3N0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRIb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTg1NSw2ICsxMDA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRQYXRoKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTg4MCw2ICsxMDM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRQb3J0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTg5Nyw2ICsxMDY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRQb3J0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQb3J0MigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBpZiBwb3J0IHZhbHVlIGlzIG5lZ2F0aXZlLCB0aGUgYXV0aG9yaXR5IHNob3VsZCBiZQogICAgICAgICAvLyBjb25zaWRlciByZWdpc3RyeSBiYXNlZC4KQEAgLTkyNSw2ICsxMTAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRRdWVyeSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTk0OSw2ICsxMTM1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRSYXdBdXRob3JpdHkoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJhd0F1dGhvcml0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmF3QXV0aG9yaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTk3OCw2ICsxMTczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRSYXdGcmFnbWVudCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmF3RnJhZ21lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJhd0ZyYWdtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTEwMDQsNiArMTIwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjZ2V0UmF3UGF0aCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmF3UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmF3UGF0aCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUklbXSB1cmlzID0gZ2V0VXJpcygpOwogCkBAIC0xMDMwLDYgKzEyNDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2dldFJhd1F1ZXJ5KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSYXdRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmF3UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVVJJW10gdXJpcyA9IGdldFVyaXMoKTsKIApAQCAtMTA1OCw2ICsxMjgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRSYXdTY2hlbWVTcGVjaWZpY1BhcnQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJhd1NjaGVtZVNwZWNpZmljUGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmF3U2NoZW1lU3BlY2lmaWNQYXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTEwODksNiArMTMyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjZ2V0UmF3VXNlckluZm8oKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJhd1VzZXJJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSYXdVc2VySW5mbygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogICAgICAgICBVUklbXSB1cmlzID0gZ2V0VXJpcygpOwogCkBAIC0xMTE2LDYgKzEzNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2dldFNjaGVtZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2NoZW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTY2hlbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVVJJW10gdXJpcyA9IGdldFVyaXMoKTsKIApAQCAtMTEzNyw2ICsxMzg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNnZXRTY2hlbWVTcGVjaWZpY1BhcnQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNjaGVtZVNwZWNpZmljUGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTExNzAsNiArMTQyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjZ2V0VXNlckluZm8oKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFVzZXJJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRVc2VySW5mbygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUklbXSB1cmlzID0gZ2V0VXJpcygpOwogCkBAIC0xMTk4LDYgKzE0NjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2hhc2hDb2RlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nW11bXSBoYXNoQ29kZURhdGEgPSBuZXcgU3RyaW5nW11bXSB7CiAgICAgICAgICAgICAgICAgeyAiIiwgIiIgfSwgLy8gbnVsbCBmcmFncwpAQCAtMTI2OCw2ICsxNTQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNpc0Fic29sdXRlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0Fic29sdXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0Fic29sdXRlKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZ1tdIGlzQWJzb2x1dGVEYXRhID0gbmV3IFN0cmluZ1tdIHsgIm1haWx0bzp1c2VyQGNhLmlibS5jb20iLAogICAgICAgICAgICAgICAgICJ1cm46aXNibjoxMjM0OTg5ODloIiwgIm5ld3M6c29mdHdhcmUuaWJtLmNvbSIsCkBAIC0xMjg5LDYgKzE1NzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI2lzT3BhcXVlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc09wYXF1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNPcGFxdWUoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nW10gaXNPcGFxdWVEYXRhID0gbmV3IFN0cmluZ1tdIHsgIm1haWx0bzp1c2VyQGNhLmlibS5jb20iLAogICAgICAgICAgICAgICAgICJ1cm46aXNibjoxMjM0OTg5ODloIiwgIm5ld3M6c29mdHdhcmUuaWJtLmNvbSIsCkBAIC0xMzEwLDYgKzE2MDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI25vcm1hbGl6ZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibm9ybWFsaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ub3JtYWxpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTdHJpbmdbXSBub3JtYWxpemVEYXRhID0gbmV3IFN0cmluZ1tdIHsKQEAgLTEzNzEsNiArMTY3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjbm9ybWFsaXplKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub3JtYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25vcm1hbGl6ZTIoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgVVJJIHVyaTEgPSBudWxsLCB1cmkyID0gbnVsbDsKICAgICAgICAgdXJpMSA9IG5ldyBVUkkoImZpbGU6L0Q6L29uZS90d28vLi4vLi4vdGhyZWUiKTsKQEAgLTEzODcsNiArMTY5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjbm9ybWFsaXplKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub3JtYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25vcm1hbGl6ZTMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmV0dXJuIHNhbWUgVVJJIGlmIGl0IGhhcyBhIG5vcm1hbGl6ZWQgcGF0aCBhbHJlYWR5CiAgICAgICAgIFVSSSB1cmkxID0gbnVsbCwgdXJpMiA9IG51bGw7CkBAIC0xNDAzLDYgKzE3MjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI3BhcnNlU2VydmVyQXV0aG9yaXR5KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZVNlcnZlckF1dGhvcml0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VTZXJ2ZXJBdXRob3JpdHkoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVnaXN0cnkgYmFzZWQgdXJpcwogICAgICAgICBVUklbXSB1cmlzID0gbnVsbDsKQEAgLTE1MjUsNiArMTg1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjcmVsYXRpdml6ZShqYXZhLm5ldC5VUkkpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVsYXRpdml6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5VUkkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVsYXRpdml6ZUxqYXZhX25ldF9VUkkoKSB7CiAgICAgICAgIC8vIHJlbGF0aXZpemF0aW9uIHRlc3RzCiAgICAgICAgIFN0cmluZ1tdW10gcmVsYXRpdml6ZURhdGEgPSBuZXcgU3RyaW5nW11bXSB7CkBAIC0xNTgwLDYgKzE5MTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI3JlbGF0aXZpemUoamF2YS5uZXQuVVJJKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbGF0aXZpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuVVJJLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbGF0aXZpemUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSSBhID0gbmV3IFVSSSgiaHR0cDovL2hvc3QvZGlyIik7CiAgICAgICAgIFVSSSBiID0gbmV3IFVSSSgiaHR0cDovL2hvc3QvZGlyL2ZpbGU/cXVlcnkiKTsKQEAgLTE2MDUsNiArMTk1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjcmVzb2x2ZShqYXZhLm5ldC5VUkkpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzb2x2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5VUkkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzb2x2ZSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogICAgICAgICBVUkkgdXJpMSA9IG51bGwsIHVyaTIgPSBudWxsOwogICAgICAgICB1cmkxID0gbmV3IFVSSSgiZmlsZTovRDovb25lL3R3by90aHJlZSIpOwpAQCAtMTYyMSw2ICsxOTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSNyZXNvbHZlKGphdmEubmV0LlVSSSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlc29sdmUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlVSSS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc29sdmVMamF2YV9uZXRfVVJJKCkgewogICAgICAgICAvLyByZXNvbHV0aW9uIHRlc3RzCiAgICAgICAgIFN0cmluZ1tdW10gcmVzb2x2ZURhdGEgPSBuZXcgU3RyaW5nW11bXSB7CkBAIC0xNjc3LDYgKzIwNDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJJI3RvQVNDSUlTdHJpbmcoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvQVNDSUlTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvQVNDSUlTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVVJJW10gdXJpcyA9IGdldFVyaXMoKTsKIApAQCAtMTcyOCw2ICsyMTAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSSSN0b1N0cmluZygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSSVtdIHVyaXMgPSBnZXRVcmlzKCk7CiAKQEAgLTE3NjAsNiArMjE0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkkjdG9VUkwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvVVJMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1VSTCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgYWJzb2x1dGV1cmlzW10gPSBuZXcgU3RyaW5nW10geyAibWFpbHRvOnVzZXJAY2EuaWJtLmNvbSIsCiAgICAgICAgICAgICAgICAgInVybjppc2JuOjEyMzQ5ODk4OWgiLCAibmV3czpzb2Z0d2FyZS5pYm0uY29tIiwKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSTENsYXNzTG9hZGVyVGVzdC5qYXZhCmluZGV4IDVkMDdmZGUuLjFlYmY1NTEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9VUkxDbGFzc0xvYWRlclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTM2LDYgKzQxLDcgQEAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfQ29uZmlndXJhdGlvbjsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LnJlc291cmNlLlN1cHBvcnRfUmVzb3VyY2VzOwogCitAVGVzdFRhcmdldENsYXNzKFVSTENsYXNzTG9hZGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBVUkxDbGFzc0xvYWRlclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgY2xhc3MgQm9ndXNDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKQEAgLTY0LDYgKzcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSTENsYXNzTG9hZGVyI1VSTENsYXNzTG9hZGVyKGphdmEubmV0LlVSTFtdKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSTENsYXNzTG9hZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlVSTFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJExqYXZhX25ldF9VUkwoKSB7CiAgICAgICAgIFVSTFtdIHUgPSBuZXcgVVJMWzBdOwogICAgICAgICB1Y2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodSk7CkBAIC04NCw2ICs5OSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciNVUkxDbGFzc0xvYWRlcihqYXZhLm5ldC5VUkxbXSwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVSTENsYXNzTG9hZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlVSTFtdLmNsYXNzLCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkTGphdmFfbmV0X1VSTExqYXZhX2xhbmdfQ2xhc3NMb2FkZXIoKSB7CiAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gbmV3IEJvZ3VzQ2xhc3NMb2FkZXIoKTsKICAgICAgICAgVVJMW10gdSA9IG5ldyBVUkxbMF07CkBAIC05Niw3ICsxMjAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIjZmluZFJlc291cmNlcyhqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZmluZFJlc291cmNlc0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5kUmVzb3VyY2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2ZpbmRSZXNvdXJjZXNMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEVudW1lcmF0aW9uIHJlcyA9IG51bGw7CiAgICAgICAgIFN0cmluZ1tdIHJlc1ZhbHVlcyA9IHsgIlRoaXMgaXMgYSB0ZXN0IHJlc291cmNlIGZpbGUuIiwKICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIHJlc291cmNlIGZyb20gYSBzdWJkaXIiIH07CkBAIC0xMjUsNiArMTU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSTENsYXNzTG9hZGVyI2dldFVSTHMoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFVSTHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFVSTHMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKICAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbNF07CiAgICAgICAgIHVybHNbMF0gPSBuZXcgVVJMKCJodHRwOi8vIiArIFN1cHBvcnRfQ29uZmlndXJhdGlvbi5Ib21lQWRkcmVzcyk7CkBAIC0xNDIsNyArMTg0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmV0LlVSTENsYXNzTG9hZGVyI25ld0luc3RhbmNlKGphdmEubmV0LlVSTFtdKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3SW5zdGFuY2UkTGphdmFfbmV0X1VSTCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuVVJMW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X25ld0luc3RhbmNlJExqYXZhX25ldF9VUkwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGxvYWRlZCBjbGFzcycgaGF2ZSBjb3JyZWN0IHBlcm1pc3Npb25zCiAgICAgICAgIENsYXNzIGNsID0gbnVsbDsKQEAgLTE3MCw2ICsyMjEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIjbmV3SW5zdGFuY2UoamF2YS5uZXQuVVJMW10sCiAgICAgICogICAgICAgIGphdmEubGFuZy5DbGFzc0xvYWRlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5VUkxbXS5jbGFzcywgamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25ld0luc3RhbmNlJExqYXZhX25ldF9VUkxMamF2YV9sYW5nX0NsYXNzTG9hZGVyKCkgewogICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG5ldyBCb2d1c0NsYXNzTG9hZGVyKCk7CiAgICAgICAgIFVSTFtdIHUgPSBuZXcgVVJMWzBdOwpAQCAtMTgzLDYgKzI0MywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciNVUkxDbGFzc0xvYWRlcihqYXZhLm5ldC5VUkxbXSwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyLCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVUkxDbGFzc0xvYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5VUkxbXS5jbGFzcywgamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRMamF2YV9uZXRfVVJMTGphdmFfbGFuZ19DbGFzc0xvYWRlckxqYXZhX25ldF9VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSgpIHsKICAgICAgICAgY2xhc3MgVGVzdEZhY3RvcnkgaW1wbGVtZW50cyBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSB7CiAgICAgICAgICAgICBwdWJsaWMgVVJMU3RyZWFtSGFuZGxlciBjcmVhdGVVUkxTdHJlYW1IYW5kbGVyKFN0cmluZyBwcm90b2NvbCkgewpAQCAtMjAyLDcgKzI3MSwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIjZmluZENsYXNzKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9maW5kQ2xhc3NMamF2YV9sYW5nX1N0cmluZygpCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluZENsYXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2ZpbmRDbGFzc0xqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgcmVzb3VyY2VzID0gU3VwcG9ydF9SZXNvdXJjZXMuY3JlYXRlVGVtcEZvbGRlcigpOwogICAgICAgICBTdHJpbmcgcmVzUGF0aCA9IHJlc291cmNlcy50b1N0cmluZygpOwpAQCAtMzM1LDcgKzQxMywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciNmaW5kUmVzb3VyY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRSZXNvdXJjZUxqYXZhX2xhbmdfU3RyaW5nKCkKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5kUmVzb3VyY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZmluZFJlc291cmNlTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSTCByZXMgPSBudWxsOwogCkBAIC0zNjEsNiArNDQ4LDE5IEBACiAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSB0ZXN0IHJlc291cmNlIGZpbGUiKSk7CiAgICAgfQogICAgIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBnZXRSZXNvdXJjZSwgaW5kaXJlY3RseSBjaGVja3MgZmluZFJlc291cmNlIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmVzb3VyY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5kUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZV9IMzQ2MSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIHVzZXJEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwogICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKHVzZXJEaXIsICJlbmNvZGUjbWUiKTsKQEAgLTQxMywxNSArNTEzLDI0IEBACiAgICAgfQogICAgIAogICAgIC8qKgotCSAqIFJlZ3Jlc3Npb24gZm9yIEhhcm1vbnktMjIzNyAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJVVJMQ2xhc3NMb2FkZXIgdXJsTG9hZGVyID0gZ2V0VVJMQ2xhc3NMb2FkZXIoKTsKLQkJYXNzZXJ0TnVsbCh1cmxMb2FkZXIuZmluZFJlc291cmNlKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9CisgICAgICogUmVncmVzc2lvbiBmb3IgSGFybW9ueS0yMjM3IAorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluZFJlc291cmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAgIAorICAgICAgICBVUkxDbGFzc0xvYWRlciB1cmxMb2FkZXIgPSBnZXRVUkxDbGFzc0xvYWRlcigpOworICAgICAgICBhc3NlcnROdWxsKHVybExvYWRlci5maW5kUmVzb3VyY2UoIlhYWCIpKTsgLy8kTk9OLU5MUy0xJAorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIFVSTENsYXNzTG9hZGVyIGdldFVSTENsYXNzTG9hZGVyKCkgewotCQlTdHJpbmcgY2xhc3NQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBVUkxDbGFzc0xvYWRlciBnZXRVUkxDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7CiAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzUGF0aCwgRmlsZS5wYXRoU2VwYXJhdG9yKTsKICAgICAgICAgVmVjdG9yPFVSTD4gdXJsVmVjID0gbmV3IFZlY3RvcjxVUkw+KCk7CiAgICAgICAgIFN0cmluZyByZXNQYWNrYWdlID0gU3VwcG9ydF9SZXNvdXJjZXMuUkVTT1VSQ0VfUEFDS0FHRTsKQEAgLTQzNiwxMyArNTQ1LDEzIEBACiAgICAgICAgICAgICAgICAgdXJsVmVjLmFkZEVsZW1lbnQobmV3IFVSTCh1cmwpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCS8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgfQogICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFt1cmxWZWMuc2l6ZSgpXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxWZWMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgCXVybHNbaV0gPSB1cmxWZWMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgdXJsc1tpXSA9IHVybFZlYy5lbGVtZW50QXQoaSk7CiAgICAgICAgIH0gICAgICAgICAgICAKICAgICAgICAgVVJMQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMsIG51bGwpOwotCQlyZXR1cm4gbG9hZGVyOwotCX0KKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSTERlY29kZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSTERlY29kZXJUZXN0LmphdmEKaW5kZXggYzMzYThjOS4uZjlhNzZkMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9VUkxEZWNvZGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvVVJMRGVjb2RlclRlc3QuamF2YQpAQCAtMTcsMzAgKzE3LDU0IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwogaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfQ29uZmlndXJhdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhVUkxEZWNvZGVyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBVUkxEZWNvZGVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKKyAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uZXQuVVJMRGVjb2RlciNVUkxEZWNvZGVyKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVUkxEZWNvZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUkxEZWNvZGVyIHVkID0gbmV3IFVSTERlY29kZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ29uc3RydWN0b3IgZmFpbGVkLiIsIHVkKTsKICAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuVVJMRGVjb2RlciNkZWNvZGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2RlY29kZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCi0JCS8vIGphdmEubmV0LlVSTERlY29kZXIuZGVjb2RlKGphdmEubGFuZy5TdHJpbmcpCi0JCWZpbmFsIFN0cmluZyBVUkwgPSAiaHR0cDovLyIgKyBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSG9tZUFkZHJlc3M7Ci0JCWZpbmFsIFN0cmluZyBVUkwyID0gInRlbG5ldDovL2p1c3RXYW50VG9IYXZlRnVuLmNvbTo0MDAiOworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkxEZWNvZGVyI2RlY29kZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2RlY29kZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCisgICAgICAgIC8vIGphdmEubmV0LlVSTERlY29kZXIuZGVjb2RlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIGZpbmFsIFN0cmluZyBVUkwgPSAiaHR0cDovLyIgKyBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSG9tZUFkZHJlc3M7CisgICAgICAgIGZpbmFsIFN0cmluZyBVUkwyID0gInRlbG5ldDovL2p1c3RXYW50VG9IYXZlRnVuLmNvbTo0MDAiOwogICAgICAgICBmaW5hbCBTdHJpbmcgVVJMMyA9ICJmaWxlOi8vbXlTZXJ2ZXIub3JnL2EgZmlsZSB3aXRoIHNwYWNlcy5qcGciOwogICAgICAgICBhc3NlcnRUcnVlKCIxLiBJbmNvcnJlY3QgZW5jb2RpbmcvZGVjb2RpbmciLCBVUkxEZWNvZGVyLmRlY29kZSgKICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShVUkwpKS5lcXVhbHMoVVJMKSk7CkBAIC00OCwxMSArNzIsMjAgQEAKICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShVUkwyKSkuZXF1YWxzKFVSTDIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiMy4gSW5jb3JyZWN0IGVuY29kaW5nL2RlY29kaW5nIiwgVVJMRGVjb2Rlci5kZWNvZGUoCiAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoVVJMMykpLmVxdWFscyhVUkwzKSk7Ci0JfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5VUkxEZWNvZGVyI2RlY29kZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVjb2RlTGphdmFfbGFuZ19TdHJpbmdfTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDY3CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSTEVuY29kZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1VSTEVuY29kZXJUZXN0LmphdmEKaW5kZXggMWRiMzc2ZS4uOTQxMTg1NiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9VUkxFbmNvZGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvVVJMRW5jb2RlclRlc3QuamF2YQpAQCAtMTcsNDUgKzE3LDYwIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Db25maWd1cmF0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFVSTEVuY29kZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFVSTEVuY29kZXJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5VUkxFbmNvZGVyI2VuY29kZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfZW5jb2RlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCi0JCS8vIGphdmEubmV0LlVSTEVuY29kZXIuZW5jb2RlKGphdmEubGFuZy5TdHJpbmcpCi0JCWZpbmFsIFN0cmluZyBVUkwgPSAiaHR0cDovLyIgKyBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSG9tZUFkZHJlc3M7Ci0JCWZpbmFsIFN0cmluZyBVUkwyID0gInRlbG5ldDovL2p1c3RXYW50VG9IYXZlRnVuLmNvbTo0MDAiOwotCQlmaW5hbCBTdHJpbmcgVVJMMyA9ICJmaWxlOi8vbXlTZXJ2ZXIub3JnL2EgZmlsZSB3aXRoIHNwYWNlcy5qcGciOwotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiMS4gSW5jb3JyZWN0IGVuY29kaW5nL2RlY29kaW5nIiwgVVJMRGVjb2Rlci5kZWNvZGUoCi0JCQkJCVVSTEVuY29kZXIuZW5jb2RlKFVSTCkpLmVxdWFscyhVUkwpKTsKLQkJCWFzc2VydFRydWUoIjIuIEluY29ycmVjdCBlbmNvZGluZy9kZWNvZGluZyIsIFVSTERlY29kZXIuZGVjb2RlKAotCQkJCQlVUkxFbmNvZGVyLmVuY29kZShVUkwyKSkuZXF1YWxzKFVSTDIpKTsKLQkJCWFzc2VydFRydWUoIjMuIEluY29ycmVjdCBlbmNvZGluZy9kZWNvZGluZyIsIFVSTERlY29kZXIuZGVjb2RlKAotCQkJCQlVUkxFbmNvZGVyLmVuY29kZShVUkwzKSkuZXF1YWxzKFVSTDMpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlVSTEVuY29kZXIjZW5jb2RlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZW5jb2RlTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCisgICAgICAgIC8vIGphdmEubmV0LlVSTEVuY29kZXIuZW5jb2RlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIGZpbmFsIFN0cmluZyBVUkwgPSAiaHR0cDovLyIgKyBTdXBwb3J0X0NvbmZpZ3VyYXRpb24uSG9tZUFkZHJlc3M7CisgICAgICAgIGZpbmFsIFN0cmluZyBVUkwyID0gInRlbG5ldDovL2p1c3RXYW50VG9IYXZlRnVuLmNvbTo0MDAiOworICAgICAgICBmaW5hbCBTdHJpbmcgVVJMMyA9ICJmaWxlOi8vbXlTZXJ2ZXIub3JnL2EgZmlsZSB3aXRoIHNwYWNlcy5qcGciOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiMS4gSW5jb3JyZWN0IGVuY29kaW5nL2RlY29kaW5nIiwgVVJMRGVjb2Rlci5kZWNvZGUoCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKFVSTCkpLmVxdWFscyhVUkwpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIjIuIEluY29ycmVjdCBlbmNvZGluZy9kZWNvZGluZyIsIFVSTERlY29kZXIuZGVjb2RlKAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShVUkwyKSkuZXF1YWxzKFVSTDIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIjMuIEluY29ycmVjdCBlbmNvZGluZy9kZWNvZGluZyIsIFVSTERlY29kZXIuZGVjb2RlKAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShVUkwzKSkuZXF1YWxzKFVSTDMpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IGRhMGM0OTMuLmNkYjY5YTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTcsNTMgKzE3LDc3IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmV0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVW5rbm93bkhvc3RFeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbiNVbmtub3duSG9zdEV4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkJLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uKCkKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJhLmIuYy54Lnkuei5jb20iKTsKLQkJCX0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbiNVbmtub3duSG9zdEV4Y2VwdGlvbigpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5rbm93bkhvc3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24oKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUoImEuYi5jLngueS56LmNvbSIpOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24jVW5rbm93bkhvc3RFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUoImEuYi5jLngueS56LmNvbSIpOwotCQkJfSBjYXRjaCAoamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZhaWwoIkZhaWxlZCB0byBnZW5lcmF0ZSBFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uI1Vua25vd25Ib3N0RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5rbm93bkhvc3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJhLmIuYy54Lnkuei5jb20iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZ2VuZXJhdGUgRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIH0KIAotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Vua25vd25TZXJ2aWNlRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25ldC9Vbmtub3duU2VydmljZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBhY2IyZWVhLi40ZmUzZjAzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmV0L1Vua25vd25TZXJ2aWNlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uZXQvVW5rbm93blNlcnZpY2VFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDU0ICsxNyw3OCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93blNlcnZpY2VFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVW5rbm93blNlcnZpY2VFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFVua25vd25TZXJ2aWNlRXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuVW5rbm93blNlcnZpY2VFeGNlcHRpb24jVW5rbm93blNlcnZpY2VFeGNlcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbigpCi0JCXRyeSB7Ci0JCQluZXcgVVJMKCJmaWxlOi8vbW9vLnR4dCIpLm9wZW5Db25uZWN0aW9uKCkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCX0gY2F0Y2ggKFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvcnJlY3QKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIldyb25nIGV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEubmV0LlVua25vd25TZXJ2aWNlRXhjZXB0aW9uI1Vua25vd25TZXJ2aWNlRXhjZXB0aW9uKCkKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbmtub3duU2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbigpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVVJMKCJmaWxlOi8vbW9vLnR4dCIpLm9wZW5Db25uZWN0aW9uKCkuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGNvcnJlY3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIldyb25nIGV4Y2VwdGlvbiBkdXJpbmcgdGVzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5uZXQuVW5rbm93blNlcnZpY2VFeGNlcHRpb24jVW5rbm93blNlcnZpY2VFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCS8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCQl0cnkgewotCQkJaWYgKHRydWUpCi0JCQkJdGhyb3cgbmV3IFVua25vd25TZXJ2aWNlRXhjZXB0aW9uKCJIZWxsb1dvcmxkIik7Ci0JCX0gY2F0Y2ggKFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIldyb25nIGV4Y2VwdGlvbiBtZXNzYWdlOiAiICsgZS50b1N0cmluZygpLCBlCi0JCQkJCS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJIZWxsb1dvcmxkIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkNvbnN0cnVjdG9yIGZhaWxlZCIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5uZXQuVW5rbm93blNlcnZpY2VFeGNlcHRpb24jVW5rbm93blNlcnZpY2VFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbmtub3duU2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25TZXJ2aWNlRXhjZXB0aW9uKCJIZWxsb1dvcmxkIik7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGV4Y2VwdGlvbiBtZXNzYWdlOiAiICsgZS50b1N0cmluZygpLCBlCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJIZWxsb1dvcmxkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkNvbnN0cnVjdG9yIGZhaWxlZCIpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQWJzdHJhY3RMaXN0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQWJzdHJhY3RMaXN0VGVzdC5qYXZhCmluZGV4IDk0NWU0MmQuLmQxZGVlZjkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Fic3RyYWN0TGlzdFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9BYnN0cmFjdExpc3RUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTI2LDYgKzMxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQWJzdHJhY3RMaXN0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBBYnN0cmFjdExpc3RUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIHN0YXRpYyBjbGFzcyBTaW1wbGVMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0IHsKQEAgLTU1LDcgKzYxLDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdExpc3QjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CisgICAgICAgIAogICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIGxpc3QuYWRkKG5ldyBJbnRlZ2VyKDMpKTsKICAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMTUpKTsKQEAgLTc1LDYgKzkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdExpc3QjaXRlcmF0b3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXRlcmF0b3IoKSB7CiAgICAgICAgIFNpbXBsZUxpc3QgbGlzdCA9IG5ldyBTaW1wbGVMaXN0KCk7CiAgICAgICAgIGxpc3QuYWRkKG5ldyBPYmplY3QoKSk7CkBAIC04OCw2ICsxMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0TGlzdCNsaXN0SXRlcmF0b3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaXN0SXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xpc3RJdGVyYXRvcigpIHsKICAgICAgICAgSW50ZWdlciB0ZW1wVmFsdWU7CiAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTExNCw2ICsxNDgsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0TGlzdCNzdWJMaXN0KGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGVhY2ggb2YgdGhlIFN1Ykxpc3Qgb3BlcmF0aW9ucyB0byBlbnN1cmUgYSAiICsgCisgICAgICAgICAgICAiQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBkb2VzIG5vdCBvY2N1ciBvbiBhbiAiICsKKyAgICAgICAgICAgICJBYnN0cmFjdExpc3Qgd2hpY2ggZG9lcyBub3QgdXBkYXRlIG1vZENvdW50LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1Ykxpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3ViTGlzdElJKCkgewogICAgICAgICAvLyBUZXN0IGVhY2ggb2YgdGhlIFN1Ykxpc3Qgb3BlcmF0aW9ucyB0byBlbnN1cmUgYQogICAgICAgICAvLyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGRvZXMgbm90IG9jY3VyIG9uIGFuIEFic3RyYWN0TGlzdApAQCAtMTY4LDYgKzIxMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0I3N1Ykxpc3QoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJMaXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1Ykxpc3RfZW1wdHkoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzg5CiAgICAgICAgIExpc3QgYWwgPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC0xOTksNiArMjUzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdExpc3Qjc3ViTGlzdChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1Ykxpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3ViTGlzdF9hZGRBbGwoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzkwCiAgICAgICAgIExpc3QgbWFpbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9BYnN0cmFjdE1hcFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Fic3RyYWN0TWFwVGVzdC5qYXZhCmluZGV4IDRhYWVmOTIuLjcxY2Y2OTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Fic3RyYWN0TWFwVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Fic3RyYWN0TWFwVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0zMyw2ICszOCw3IEBACiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIGltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQWJzdHJhY3RNYXAuY2xhc3MpIAogcHVibGljIGNsYXNzIEFic3RyYWN0TWFwVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNwZWNpYWxLZXkgPSAic3BlY2lhbEtleSIuaW50ZXJuKCk7CkBAIC03Miw2ICs3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAja2V5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSByZXR1cm5lZCBzZXQgb2Yga2V5cy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2tleVNldCgpIHsKICAgICAgICAgQWJzdHJhY3RNYXAgbWFwMSA9IG5ldyBIYXNoTWFwKDApOwogICAgICAgICBhc3NlcnRTYW1lKCJIYXNoTWFwKDApIiwgbWFwMS5rZXlTZXQoKSwgbWFwMS5rZXlTZXQoKSk7CkBAIC05OCw2ICsxMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0TWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBPYmplY3Qga2V5ID0gbmV3IE9iamVjdCgpOwogICAgICAgICBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7CkBAIC0xMzYsNiArMTYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdE1hcCN2YWx1ZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IHJldHVybmVkIENvbGxlY3Rpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZXMoKSB7CiAgICAgICAgIEFic3RyYWN0TWFwIG1hcDEgPSBuZXcgSGFzaE1hcCgwKTsKICAgICAgICAgYXNzZXJ0U2FtZSgiSGFzaE1hcCgwKSIsIG1hcDEudmFsdWVzKCksIG1hcDEudmFsdWVzKCkpOwpAQCAtMTYyLDYgKzE5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgY2xhc3MgTXlNYXAgZXh0ZW5kcyBBYnN0cmFjdE1hcCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CiAgICAgICAgICAgICBwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwpAQCAtMjU4LDcgKzMwMCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS51dGlsLkFic3RyYWN0TWFwI3B1dEFsbChNYXApfQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsTE1hcCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9wdXRBbGxMTWFwKCkgewogICAgICAgICBIYXNodGFibGUgaHQgID0gbmV3IEhhc2h0YWJsZSgpOwogICAgICAgICBBTVQgICAgICAgYW10ID0gbmV3IEFNVCgpOwogICAgICAgICBodC5wdXQoInRoaXMiLCAidGhhdCIpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Fic3RyYWN0UXVldWVUZXN0LmphdmEKaW5kZXggMWY2NTEyNS4uM2ZhNDA0MyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9BYnN0cmFjdFF1ZXVlVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0UXVldWU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMjQsNiArMjksNyBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEFic3RyYWN0UXVldWUuY2xhc3MpIAogcHVibGljIGNsYXNzIEFic3RyYWN0UXVldWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBNb2NrQWJzdHJhY3RRdWV1ZTxPYmplY3Q+IHF1ZXVlOwpAQCAtMTA2LDYgKzExMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZS5hZGQoRSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZExFX251bGwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBxdWV1ZS5hZGQobnVsbCk7CkBAIC0xMTgsNiArMTMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlLmFkZChFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZExFX0Z1bGwoKSB7CiAgICAgICAgIE9iamVjdCBvID0gbmV3IE9iamVjdCgpOwogCkBAIC0xMzYsNiArMTYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI2FkZChFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRMRSgpIHsKICAgICAgICAgT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgIGZpbmFsIGludCBMQVNUX0lOREVYID0gNDsKQEAgLTE1NSw2ICsxODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFic3RyYWN0UXVldWUjYWRkQWxsKEUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEFsbExFX251bGwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBxdWV1ZS5hZGRBbGwobnVsbCk7CkBAIC0xNjcsNiArMjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI2FkZEFsbChFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRBbGxMRV93aXRoX251bGwoKSB7CiAgICAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3QoIk1ZVEVTVFNUUklORyIsIG51bGwsIG5ldyBGbG9hdCgxMjMuNDU2KSk7CiAgICAgICAgIHRyeSB7CkBAIC0xODAsNiArMjMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI2FkZEFsbChFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsTEVfZnVsbCgpIHsKICAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEpOwogICAgICAgICB0cnkgewpAQCAtMTkzLDYgKzI1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZSNhZGRBbGwoRSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIERvZXNuJ3QgdmVyaWZ5IHJldHVybmVkIHRydWUgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEFsbExFX2VtcHR5KCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTE3OAogICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oMCk7CkBAIC0yMDIsNiArMjcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI2FkZEFsbChFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsTEVfdGhpcygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHF1ZXVlLmFkZEFsbChxdWV1ZSk7CkBAIC0yMTQsNiArMjkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjbGVhciBtZXRob2QgZm9yIGVtcHR5IHF1ZXVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcl9lbXB0eSgpIHsKICAgICAgICAgcXVldWUuY2xlYXIoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShxdWV1ZS5pc0VtcHR5KCkpOwpAQCAtMjIzLDYgKzMxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZSNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdCgxMjMuNDU2LCAiTVlURVNUU1RSSU5HIiwgbmV3IE9iamVjdCgpLCAnYycpOwogICAgICAgICBxdWV1ZS5hZGRBbGwobGlzdCk7CkBAIC0yMzQsNiArMzMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI0Fic3RyYWN0UXVldWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBYnN0cmFjdFF1ZXVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgTW9ja0Fic3RyYWN0UXVldWUgcXVldWUgPSBuZXcgTW9ja0Fic3RyYWN0UXVldWUoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWV1ZSk7CkBAIC0yNDIsNiArMzQ3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI3JlbW92ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZV9udWxsKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcXVldWUucmVtb3ZlKCk7CkBAIC0yNTUsNiArMzY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI3JlbW92ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHksIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmUoKSB7CiAgICAgICAgIGNoYXIgYyA9ICdhJzsKICAgICAgICAgcXVldWUuYWRkKGMpOwpAQCAtMjczLDYgKzM5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZSNlbGVtZW50KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVsZW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VsZW1lbnRfZW1wdHkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBxdWV1ZS5lbGVtZW50KCk7CkBAIC0yODUsNiArNDE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlI2VsZW1lbnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZWxlbWVudCgpIHsKICAgICAgICAgU3RyaW5nIHMgPSAiTVlURVNUU1RSSU5HX09ORSI7CiAgICAgICAgIHF1ZXVlLmFkZChzKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Fic3RyYWN0U2VxdWVudGlhbExpc3RUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9BYnN0cmFjdFNlcXVlbnRpYWxMaXN0VGVzdC5qYXZhCmluZGV4IGQ1YWFmY2EuLmRjNzEzNTQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Fic3RyYWN0U2VxdWVudGlhbExpc3RUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQWJzdHJhY3RTZXF1ZW50aWFsTGlzdFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNlcXVlbnRpYWxMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0yNCw2ICsyOSw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQWJzdHJhY3RTZXF1ZW50aWFsTGlzdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQWJzdHJhY3RTZXF1ZW50aWFsTGlzdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBAT3ZlcnJpZGUKQEAgLTU0LDYgKzYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLnV0aWwuQWJzdHJhY3RTZXF1ZW50aWFsTGlzdCNhZGRBbGwoaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbil9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEFsbF9JTENvbGxlY3Rpb24oKSB7CiAgICAgICAgIEFic3RyYWN0U2VxdWVudGlhbExpc3Q8U3RyaW5nPiBhbCA9IG5ldyBBU0xUPFN0cmluZz4oKTsKICAgICAgICAgU3RyaW5nW10gc29tZUxpc3QgPSB7ICJBYXJkdmFyayIgICwgIC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0FycmF5TGlzdFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0FycmF5TGlzdFRlc3QuamF2YQppbmRleCA1YTI2ZjYwLi5jYTBjMjM3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9BcnJheUxpc3RUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQXJyYXlMaXN0VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMjgsNiArMzMsNyBAQAogCiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0xpc3RUZXN0OwogCitAVGVzdFRhcmdldENsYXNzKEFycmF5TGlzdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQXJyYXlMaXN0VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBMaXN0IGFsaXN0OwpAQCAtNDIsNiArNDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCNBcnJheUxpc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBcnJheUxpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkFycmF5TGlzdCgpCiAgICAgICAgIG5ldyBTdXBwb3J0X0xpc3RUZXN0KCIiLCBhbGlzdCkucnVuVGVzdCgpOwpAQCAtNTUsNiArNzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCNBcnJheUxpc3QoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkFycmF5TGlzdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkFycmF5TGlzdChpbnQpCiAgICAgICAgIEFycmF5TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoNSk7CkBAIC02NCw2ICs4OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlMaXN0I0FycmF5TGlzdChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBcnJheUxpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuQXJyYXlMaXN0KGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAgICBBcnJheUxpc3QgYWwgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3Qob2JqQXJyYXkpKTsKQEAgLTc5LDYgKzExMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlMaXN0I2FkZChpbnQsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkSUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZChpbnQsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIE9iamVjdCBvOwpAQCAtOTcsNiArMTM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjYWRkKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5BcnJheUxpc3QuYWRkKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIE9iamVjdCBvID0gbmV3IE9iamVjdCgpOwpAQCAtMTA5LDYgKzE2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlMaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEFsbElMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5BcnJheUxpc3QuYWRkQWxsKGludCwKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC0xNDYsNiArMjA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRBbGxJTGphdmFfdXRpbF9Db2xsZWN0aW9uXzIoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDY3CiAgICAgICAgIEFycmF5TGlzdCBvYmogPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC0xNTksNiArMjI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRBbGxMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5BcnJheUxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQpAQCAtMjEzLDYgKzI5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlMaXN0I2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlMaXN0LmNsZWFyKCkKICAgICAgICAgYWxpc3QuY2xlYXIoKTsKQEAgLTIzMyw2ICszMjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLkFycmF5TGlzdC5jbG9uZSgpCiAgICAgICAgIEFycmF5TGlzdCB4ID0gKEFycmF5TGlzdCkgKCgoQXJyYXlMaXN0KSAoYWxpc3QpKS5jbG9uZSgpKTsKQEAgLTI1NSw2ICszNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCNjb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWlucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5BcnJheUxpc3QuY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKQEAgLTI3NCw2ICszNzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCNlbnN1cmVDYXBhY2l0eShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuc3VyZUNhcGFjaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbnN1cmVDYXBhY2l0eUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheUxpc3QuZW5zdXJlQ2FwYWNpdHkoaW50KQogICAgICAgICAvLyBUT0RPIDogVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gdGVzdCB0aGlzIGFzIGl0IG9ubHkgcmVhbGx5IGltcGFjdHMgb24KQEAgLTMwNyw2ICs0MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCNnZXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5BcnJheUxpc3QuZ2V0KGludCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGVsZW1lbnQiLCBhbGlzdC5nZXQoMjIpID09IG9iakFycmF5WzIyXSk7CkBAIC0zMjAsNiArNDQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbmRleE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5BcnJheUxpc3QuaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBpbmRleCIsCkBAIC0zMzUsNiArNDY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjaXNFbXB0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRW1wdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRW1wdHkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5BcnJheUxpc3QuaXNFbXB0eSgpCiAgICAgICAgIGFzc2VydFRydWUoImlzRW1wdHkgcmV0dXJuZWQgZmFsc2UgZm9yIG5ldyBsaXN0IiwgbmV3IEFycmF5TGlzdCgpCkBAIC0zNDYsNiArNDg3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjbGFzdEluZGV4T2YoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGFzdEluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sYXN0SW5kZXhPZkxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5BcnJheUxpc3QubGFzdEluZGV4T2YoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgYWxpc3QuYWRkKG5ldyBJbnRlZ2VyKDk5KSk7CkBAIC0zNjIsNiArNTEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjcmVtb3ZlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLkFycmF5TGlzdC5yZW1vdmUoaW50KQogICAgICAgICBhbGlzdC5yZW1vdmUoMTApOwpAQCAtNDA5LDYgKzU2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlMaXN0I3NldChpbnQsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuQXJyYXlMaXN0LnNldChpbnQsCiAgICAgICAgIC8vIGphdmEubGFuZy5PYmplY3QpCkBAIC00MjQsNiArNTkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3Qjc2l6ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpemUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkFycmF5TGlzdC5zaXplKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc2l6ZSBmb3IgZXhpdGluZyBsaXN0IiwKQEAgLTQzNSw2ICs2MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCN0b0FycmF5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9BcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9BcnJheSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgW10gamF2YS51dGlsLkFycmF5TGlzdC50b0FycmF5KCkKICAgICAgICAgYWxpc3Quc2V0KDI1LCBudWxsKTsKQEAgLTQ1Nyw2ICs2NDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5TGlzdCN0b0FycmF5KGphdmEubGFuZy5PYmplY3RbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBcnJheVN0b3JlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9BcnJheSRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgW10KICAgICAgICAgLy8gamF2YS51dGlsLkFycmF5TGlzdC50b0FycmF5KGphdmEubGFuZy5PYmplY3QgW10pCkBAIC00ODIsNyArNjc3LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheUxpc3QjdHJpbVRvU2l6ZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF90cmltVG9TaXplKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmltVG9TaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfdHJpbVRvU2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5TGlzdC50cmltVG9TaXplKCkKICAgICAgICAgZm9yIChpbnQgaSA9IDk5OyBpID4gMjQ7IGktLSkKICAgICAgICAgICAgIGFsaXN0LnJlbW92ZShpKTsKQEAgLTUwNyw2ICs3MTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnV0aWwuQXJyYXlMaXN0I2FkZEFsbChpbnQsIENvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsKCkgewogICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgbGlzdC5hZGQoIm9uZSIpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQXJyYXlzVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQXJyYXlzVGVzdC5qYXZhCmluZGV4IDc0NGQyZTIuLjA2MDM3ZTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0FycmF5c1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9BcnJheXNUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKQEAgLTI0LDYgKzI5LDcgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Vbm1vZGlmaWFibGVDb2xsZWN0aW9uVGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhBcnJheXMuY2xhc3MpIAogcHVibGljIGNsYXNzIEFycmF5c1Rlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXZlcnNlZEludGVnZXJDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CkBAIC02Niw2ICs3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2FzTGlzdChqYXZhLmxhbmcuT2JqZWN0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFzTGlzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hc0xpc3QkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlzdAogICAgICAgICAvLyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChqYXZhLmxhbmcuT2JqZWN0IFtdKQpAQCAtMTAyLDYgKzExNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2JpbmFyeVNlYXJjaChieXRlW10sIGJ5dGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmFyeVNlYXJjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGJ5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluYXJ5U2VhcmNoJEJCKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGJ5dGUgW10sIGJ5dGUpCiAgICAgICAgIGZvciAoYnl0ZSBjb3VudGVyID0gMDsgY291bnRlciA8IGFycmF5U2l6ZTsgY291bnRlcisrKQpAQCAtMTIzLDYgKzE0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2JpbmFyeVNlYXJjaChjaGFyW10sIGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmFyeVNlYXJjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGNoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluYXJ5U2VhcmNoJENDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGNoYXIgW10sIGNoYXIpCiAgICAgICAgIGZvciAoY2hhciBjb3VudGVyID0gMDsgY291bnRlciA8IGFycmF5U2l6ZTsgY291bnRlcisrKQpAQCAtMTM5LDYgKzE3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2JpbmFyeVNlYXJjaChkb3VibGVbXSwgZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5hcnlTZWFyY2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5hcnlTZWFyY2gkREQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkFycmF5cy5iaW5hcnlTZWFyY2goZG91YmxlIFtdLCBkb3VibGUpCiAgICAgICAgIGZvciAoaW50IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgYXJyYXlTaXplOyBjb3VudGVyKyspCkBAIC0xNzMsNiArMjE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjYmluYXJ5U2VhcmNoKGZsb2F0W10sIGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5hcnlTZWFyY2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluYXJ5U2VhcmNoJEZGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGZsb2F0IFtdLCBmbG9hdCkKICAgICAgICAgZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBhcnJheVNpemU7IGNvdW50ZXIrKykKQEAgLTIwNiw2ICsyNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNiaW5hcnlTZWFyY2goaW50W10sIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmluYXJ5U2VhcmNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludFtdLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluYXJ5U2VhcmNoJElJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGludCBbXSwgaW50KQogICAgICAgICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IGFycmF5U2l6ZTsgY291bnRlcisrKQpAQCAtMjI2LDYgKzI4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2JpbmFyeVNlYXJjaChsb25nW10sIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmFyeVNlYXJjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nW10uY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluYXJ5U2VhcmNoJEpKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGxvbmcgW10sIGxvbmcpCiAgICAgICAgIGZvciAobG9uZyBjb3VudGVyID0gMDsgY291bnRlciA8IGFycmF5U2l6ZTsgY291bnRlcisrKQpAQCAtMjQ4LDYgKzMxNywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2JpbmFyeVNlYXJjaChqYXZhLmxhbmcuT2JqZWN0W10sCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmFyeVNlYXJjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluYXJ5U2VhcmNoJExqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkFycmF5cy5iaW5hcnlTZWFyY2goamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBbXSwgamF2YS5sYW5nLk9iamVjdCkKQEAgLTI3Miw2ICszNTAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNiaW5hcnlTZWFyY2goamF2YS5sYW5nLk9iamVjdFtdLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmluYXJ5U2VhcmNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdFtdLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBqYXZhLnV0aWwuQ29tcGFyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5hcnlTZWFyY2gkTGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX09iamVjdExqYXZhX3V0aWxfQ29tcGFyYXRvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuQXJyYXlzLmJpbmFyeVNlYXJjaChqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIFtdLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKQEAgLTI5Myw2ICszODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNiaW5hcnlTZWFyY2goc2hvcnRbXSwgc2hvcnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJpbmFyeVNlYXJjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBzaG9ydC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iaW5hcnlTZWFyY2gkU1MoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkFycmF5cy5iaW5hcnlTZWFyY2goc2hvcnQgW10sIHNob3J0KQogICAgICAgICBmb3IgKHNob3J0IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgYXJyYXlTaXplOyBjb3VudGVyKyspCkBAIC0zMTQsNiArNDEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChieXRlW10sIGJ5dGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbGwkQkIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuZmlsbChieXRlIFtdLCBieXRlKQogCkBAIC0zMjcsNiArNDMyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChieXRlW10sIGludCwgaW50LCBieXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlsbCRCSUlCKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYnl0ZSBbXSwgaW50LCBpbnQsIGJ5dGUpCiAgICAgICAgIGJ5dGUgdmFsID0gQnl0ZS5NQVhfVkFMVUU7CkBAIC0zNzAsNiArNDg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChzaG9ydFtdLCBzaG9ydCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBzaG9ydC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsJFNTKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoc2hvcnQgW10sIHNob3J0KQogCkBAIC0zODMsNiArNTA2LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChzaG9ydFtdLCBpbnQsIGludCwgc2hvcnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICJBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgc2hvcnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlsbCRTSUlTKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoc2hvcnQgW10sIGludCwgaW50LCBzaG9ydCkKICAgICAgICAgc2hvcnQgdmFsID0gU2hvcnQuTUFYX1ZBTFVFOwpAQCAtMzk3LDYgKzUzMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoY2hhcltdLCBjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsJENDKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoY2hhciBbXSwgY2hhcikKIApAQCAtNDA5LDYgKzU1MSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoY2hhcltdLCBpbnQsIGludCwgY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIiArICAKKyAgICAgICAgICAgICJBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbGwkQ0lJQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5maWxsKGNoYXIgW10sIGludCwgaW50LCBjaGFyKQogICAgICAgICBjaGFyIHZhbCA9ICdUJzsKQEAgLTQyMyw2ICs1NzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGludFtdLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsJElJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoaW50IFtdLCBpbnQpCiAKQEAgLTQzNiw2ICs1OTcsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGludFtdLCBpbnQsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwiICsgIAorICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlsbCRJSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoaW50IFtdLCBpbnQsIGludCwgaW50KQogICAgICAgICBpbnQgdmFsID0gSW50ZWdlci5NQVhfVkFMVUU7CkBAIC00NTAsNiArNjIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChsb25nW10sIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZ1tdLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbGwkSkooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuZmlsbChsb25nIFtdLCBsb25nKQogCkBAIC00NjMsNiArNjQzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChsb25nW10sIGludCwgaW50LCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwiICsgIAorICAgICAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlsbCRKSUlKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwobG9uZyBbXSwgaW50LCBpbnQsIGxvbmcpCiAgICAgICAgIGxvbmcgZFtdID0gbmV3IGxvbmdbMTAwMF07CkBAIC00NzcsNiArNjY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChmbG9hdFtdLCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsJEZGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoZmxvYXQgW10sIGZsb2F0KQogICAgICAgICBmbG9hdCBkW10gPSBuZXcgZmxvYXRbMTAwMF07CkBAIC00ODksNiArNjg4LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZmlsbChmbG9hdFtdLCBpbnQsIGludCwgZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCIgKyAgCisgICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbGwkRklJRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5maWxsKGZsb2F0IFtdLCBpbnQsIGludCwgZmxvYXQpCiAgICAgICAgIGZsb2F0IHZhbCA9IEZsb2F0Lk1BWF9WQUxVRTsKQEAgLTUwMyw2ICs3MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGRvdWJsZVtdLCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsJEREKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoZG91YmxlIFtdLCBkb3VibGUpCiAKQEAgLTUxNiw2ICs3MzQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGRvdWJsZVtdLCBpbnQsIGludCwgZG91YmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwiICsgIAorICAgICAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbGwkRElJRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5maWxsKGRvdWJsZSBbXSwgaW50LCBpbnQsCiAgICAgICAgIC8vIGRvdWJsZSkKQEAgLTUzMSw2ICs3NTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGJvb2xlYW5bXSwgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuW10uY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlsbCRaWigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5maWxsKGJvb2xlYW4gW10sIGJvb2xlYW4pCiAKQEAgLTU0Myw2ICs3ODAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGJvb2xlYW5bXSwgaW50LCBpbnQsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsJFpJSVooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuZmlsbChib29sZWFuIFtdLCBpbnQsIGludCwKICAgICAgICAgLy8gYm9vbGVhbikKQEAgLTU1OCw2ICs4MDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlsbCRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoamF2YS5sYW5nLk9iamVjdCBbXSwKICAgICAgICAgLy8gamF2YS5sYW5nLk9iamVjdCkKQEAgLTU3Miw2ICs4MjgsMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNmaWxsKGphdmEubGFuZy5PYmplY3RbXSwgaW50LCBpbnQsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCIgKyAgCisgICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsJExqYXZhX2xhbmdfT2JqZWN0SUlMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5maWxsKGphdmEubGFuZy5PYmplY3QgW10sIGludCwKICAgICAgICAgLy8gaW50LCBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNTkyLDYgKzg1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2VxdWFscyhieXRlW10sIGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFscyRCJEIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5BcnJheXMuZXF1YWxzKGJ5dGUgW10sIGJ5dGUgW10pCiAgICAgICAgIGJ5dGUgZFtdID0gbmV3IGJ5dGVbMTAwMF07CkBAIC02MDYsNiArODgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZXF1YWxzKHNob3J0W10sIHNob3J0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBzaG9ydFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFscyRTJFMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5BcnJheXMuZXF1YWxzKHNob3J0IFtdLCBzaG9ydCBbXSkKICAgICAgICAgc2hvcnQgZFtdID0gbmV3IHNob3J0WzEwMDBdOwpAQCAtNjIwLDYgKzkwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2VxdWFscyhjaGFyW10sIGNoYXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgY2hhcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFscyRDJEMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5BcnJheXMuZXF1YWxzKGNoYXIgW10sIGNoYXIgW10pCiAgICAgICAgIGNoYXIgZFtdID0gbmV3IGNoYXJbMTAwMF07CkBAIC02MzUsNiArOTI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZXF1YWxzKGludFtdLCBpbnRbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludFtdLmNsYXNzLCBpbnRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHMkSSRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhpbnQgW10sIGludCBbXSkKICAgICAgICAgaW50IGRbXSA9IG5ldyBpbnRbMTAwMF07CkBAIC02NTQsNiArOTU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZXF1YWxzKGxvbmdbXSwgbG9uZ1tdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZ1tdLmNsYXNzLCBsb25nW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzJEokSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkFycmF5cy5lcXVhbHMobG9uZyBbXSwgbG9uZyBbXSkKICAgICAgICAgbG9uZyBkW10gPSBuZXcgbG9uZ1sxMDAwXTsKQEAgLTY3Miw2ICs5ODMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNlcXVhbHMoZmxvYXRbXSwgZmxvYXRbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0W10uY2xhc3MsIGZsb2F0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzJEYkRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkFycmF5cy5lcXVhbHMoZmxvYXQgW10sIGZsb2F0IFtdKQogICAgICAgICBmbG9hdCBkW10gPSBuZXcgZmxvYXRbMTAwMF07CkBAIC02OTEsNiArMTAxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2VxdWFscyhkb3VibGVbXSwgZG91YmxlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGVbXS5jbGFzcywgZG91YmxlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzJEQkRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkFycmF5cy5lcXVhbHMoZG91YmxlIFtdLCBkb3VibGUgW10pCiAgICAgICAgIGRvdWJsZSBkW10gPSBuZXcgZG91YmxlWzEwMDBdOwpAQCAtNzEzLDYgKzEwNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNlcXVhbHMoYm9vbGVhbltdLCBib29sZWFuW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuW10uY2xhc3MsIGJvb2xlYW5bXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHMkWiRaKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhib29sZWFuIFtdLCBib29sZWFuCiAgICAgICAgIC8vIFtdKQpAQCAtNzI4LDYgKzEwNjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNlcXVhbHMoamF2YS5sYW5nLk9iamVjdFtdLCBqYXZhLmxhbmcuT2JqZWN0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHMkTGphdmFfbGFuZ19PYmplY3QkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5BcnJheXMuZXF1YWxzKGphdmEubGFuZy5PYmplY3QgW10sCiAgICAgICAgIC8vIGphdmEubGFuZy5PYmplY3QgW10pCkBAIC03NDYsNiArMTA5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JEIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChieXRlIFtdKQogICAgICAgICBieXRlW10gcmV2ZXJzZWRBcnJheSA9IG5ldyBieXRlW2FycmF5U2l6ZV07CkBAIC03NjAsNiArMTExNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkQklJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYnl0ZSBbXSwgaW50LCBpbnQpCiAgICAgICAgIGludCBzdGFydEluZGV4ID0gYXJyYXlTaXplIC8gNDsKQEAgLTgxMSw2ICsxMTc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjc29ydChjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkQygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5zb3J0KGNoYXIgW10pCiAgICAgICAgIGNoYXJbXSByZXZlcnNlZEFycmF5ID0gbmV3IGNoYXJbYXJyYXlTaXplXTsKQEAgLTgyNiw2ICsxMjAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjc29ydChjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc29ydCRDSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChjaGFyIFtdLCBpbnQsIGludCkKICAgICAgICAgaW50IHN0YXJ0SW5kZXggPSBhcnJheVNpemUgLyA0OwpAQCAtODc3LDYgKzEyNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGRvdWJsZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5zb3J0KGRvdWJsZSBbXSkKICAgICAgICAgZG91YmxlW10gcmV2ZXJzZWRBcnJheSA9IG5ldyBkb3VibGVbYXJyYXlTaXplXTsKQEAgLTkxNSw2ICsxMzA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjc29ydChkb3VibGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkRElJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoZG91YmxlIFtdLCBpbnQsIGludCkKICAgICAgICAgaW50IHN0YXJ0SW5kZXggPSBhcnJheVNpemUgLyA0OwpAQCAtOTY2LDYgKzEzNjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGZsb2F0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JEYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChmbG9hdCBbXSkKICAgICAgICAgZmxvYXRbXSByZXZlcnNlZEFycmF5ID0gbmV3IGZsb2F0W2FycmF5U2l6ZV07CkBAIC0xMDA0LDYgKzE0MTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGZsb2F0W10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkRklJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoZmxvYXQgW10sIGludCwgaW50KQogICAgICAgICBpbnQgc3RhcnRJbmRleCA9IGFycmF5U2l6ZSAvIDQ7CkBAIC0xMDU1LDYgKzE0NzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGludFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5zb3J0KGludCBbXSkKICAgICAgICAgaW50W10gcmV2ZXJzZWRBcnJheSA9IG5ldyBpbnRbYXJyYXlTaXplXTsKQEAgLTEwNjksNiArMTQ5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoaW50W10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JElJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5zb3J0KGludCBbXSwgaW50LCBpbnQpCiAgICAgICAgIGludCBzdGFydEluZGV4ID0gYXJyYXlTaXplIC8gNDsKQEAgLTExMjAsNiArMTU1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQobG9uZ1tdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JEooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChsb25nIFtdKQogICAgICAgICBsb25nW10gcmV2ZXJzZWRBcnJheSA9IG5ldyBsb25nW2FycmF5U2l6ZV07CkBAIC0xMTM1LDYgKzE1ODEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGxvbmdbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZ1tdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JEpJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5zb3J0KGxvbmcgW10sIGludCwgaW50KQogICAgICAgICBpbnQgc3RhcnRJbmRleCA9IGFycmF5U2l6ZSAvIDQ7CkBAIC0xMTg2LDYgKzE2NDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGphdmEubGFuZy5PYmplY3RbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc29ydCRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5zb3J0KGphdmEubGFuZy5PYmplY3QgW10pCiAgICAgICAgIE9iamVjdFtdIHJldmVyc2VkQXJyYXkgPSBuZXcgT2JqZWN0W2FycmF5U2l6ZV07CkBAIC0xMjAwLDYgKzE2NjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGphdmEubGFuZy5PYmplY3RbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JExqYXZhX2xhbmdfT2JqZWN0SUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChqYXZhLmxhbmcuT2JqZWN0IFtdLCBpbnQsCiAgICAgICAgIC8vIGludCkKQEAgLTEyNTQsNiArMTcyNywxNiBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoamF2YS5sYW5nLk9iamVjdFtdLCBpbnQsIGludCwKICAgICAgKiAgICAgICAgamF2YS51dGlsLkNvbXBhcmF0b3IpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIiArCisgICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBqYXZhLnV0aWwuQ29tcGFyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0JExqYXZhX2xhbmdfT2JqZWN0SUlMamF2YV91dGlsX0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChqYXZhLmxhbmcuT2JqZWN0IFtdLCBpbnQsCiAgICAgICAgIC8vIGludCwgamF2YS51dGlsLkNvbXBhcmF0b3IpCkBAIC0xMjc4LDYgKzE3NjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGphdmEubGFuZy5PYmplY3RbXSwgamF2YS51dGlsLkNvbXBhcmF0b3IpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0W10uY2xhc3MsIGphdmEudXRpbC5Db21wYXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkTGphdmFfbGFuZ19PYmplY3RMamF2YV91dGlsX0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChqYXZhLmxhbmcuT2JqZWN0IFtdLAogICAgICAgICAvLyBqYXZhLnV0aWwuQ29tcGFyYXRvcikKQEAgLTEyOTMsNiArMTc4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoc2hvcnRbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnQkUygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkFycmF5cy5zb3J0KHNob3J0IFtdKQogICAgICAgICBzaG9ydFtdIHJldmVyc2VkQXJyYXkgPSBuZXcgc2hvcnRbYXJyYXlTaXplXTsKQEAgLTEzMDcsNiArMTgwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoc2hvcnRbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7c2hvcnRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc29ydCRTSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5BcnJheXMuc29ydChzaG9ydCBbXSwgaW50LCBpbnQpCiAgICAgICAgIGludCBzdGFydEluZGV4ID0gYXJyYXlTaXplIC8gNDsKQEAgLTEzNTgsNiArMTg2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfamF2YV91dGlsX0FycmF5c19zb3J0X2J5dGVfYXJyYXlfTlBFKCkgewogICAgICAgICBieXRlW10gYnl0ZV9hcnJheV9udWxsID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTEzNzgsNiArMTg5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoY2hhcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfamF2YV91dGlsX0FycmF5c19zb3J0X2NoYXJfYXJyYXlfTlBFKCkgewogICAgICAgICBjaGFyW10gY2hhcl9hcnJheV9udWxsID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTEzOTgsNiArMTkyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoZG91YmxlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2phdmFfdXRpbF9BcnJheXNfc29ydF9kb3VibGVfYXJyYXlfTlBFKCkgewogICAgICAgICBkb3VibGVbXSBkb3VibGVfYXJyYXlfbnVsbCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xNDE4LDYgKzE5NTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KGZsb2F0W10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfamF2YV91dGlsX0FycmF5c19zb3J0X2Zsb2F0X2FycmF5X05QRSgpIHsKICAgICAgICAgZmxvYXRbXSBmbG9hdF9hcnJheV9udWxsID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTE0MzgsNiArMTk4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoaW50W10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2phdmFfdXRpbF9BcnJheXNfc29ydF9pbnRfYXJyYXlfTlBFKCkgewogICAgICAgICBpbnRbXSBpbnRfYXJyYXlfbnVsbCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xNDU4LDYgKzIwMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzb3J0KE9iamVjdFtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3RbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfamF2YV91dGlsX0FycmF5c19zb3J0X29iamVjdF9hcnJheV9OUEUoKSB7CiAgICAgICAgIE9iamVjdFtdIG9iamVjdF9hcnJheV9udWxsID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTE0ODUsNiArMjA0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQobG9uZ1tdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfamF2YV91dGlsX0FycmF5c19zb3J0X2xvbmdfYXJyYXlfTlBFKCkgewogICAgICAgICBsb25nW10gbG9uZ19hcnJheV9udWxsID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTE1MDUsNiArMjA3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoc2hvcnRbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9qYXZhX3V0aWxfQXJyYXlzX3NvcnRfc2hvcnRfYXJyYXlfTlBFKCkgewogICAgICAgICBzaG9ydFtdIHNob3J0X2FycmF5X251bGwgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTUyNSw2ICsyMTA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjZGVlcEVxdWFscyhPYmplY3RbXSwgT2JqZWN0W10pICAgICAgCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlZXBFcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVlcEVxdWFscyRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgIGludCBbXSBhMSA9IHsxLCAyLCAzfTsKICAgICAgICBzaG9ydCBbXSBhMiA9IHswLCAxfTsKQEAgLTE1NDksNiArMjE0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2RlZXBIYXNoQ29kZShPYmplY3RbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVlcEhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWVwSGFzaENvZGUkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIGludCBbXSBhMSA9IHsxLCAyLCAzfTsKICAgICAgICAgc2hvcnQgW10gYTIgPSB7MCwgMX07CkBAIC0xNTcwLDYgKzIxNzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNoYXNoQ29kZShib29sZWFuW10gYSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlJExaKCkgewogICAgICAgICBpbnQgbGlzdEhhc2hDb2RlOwogICAgICAgICBpbnQgYXJyYXlIYXNoQ29kZTsKQEAgLTE1ODcsNiArMjE5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2hhc2hDb2RlKGludFtdIGEpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlJExJKCkgewogICAgICAgICBpbnQgbGlzdEhhc2hDb2RlOwogICAgICAgICBpbnQgYXJyYXlIYXNoQ29kZTsKQEAgLTE2MDgsNiArMjIyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2hhc2hDb2RlKGNoYXJbXSBhKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUkTEMoKSB7CiAgICAgICAgIGludCBsaXN0SGFzaENvZGU7CiAgICAgICAgIGludCBhcnJheUhhc2hDb2RlOwpAQCAtMTYyNSw2ICsyMjUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjaGFzaENvZGUoYnl0ZVtdIGEpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSRMQigpIHsKICAgICAgICAgaW50IGxpc3RIYXNoQ29kZTsKICAgICAgICAgaW50IGFycmF5SGFzaENvZGU7CkBAIC0xNjQyLDYgKzIyNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNoYXNoQ29kZShsb25nW10gYSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZ1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlJExKKCkgewogICAgICAgICBpbnQgbGlzdEhhc2hDb2RlOwogICAgICAgICBpbnQgYXJyYXlIYXNoQ29kZTsKQEAgLTE2NjAsNiArMjMwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQXJyYXlzI2hhc2hDb2RlKGZsb2F0W10gYSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSRMRigpIHsKICAgICAgICAgaW50IGxpc3RIYXNoQ29kZTsKICAgICAgICAgaW50IGFycmF5SGFzaENvZGU7CkBAIC0xNjgwLDYgKzIzMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNoYXNoQ29kZShkb3VibGVbXSBhKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSRMRCgpIHsKICAgICAgICAgaW50IGxpc3RIYXNoQ29kZTsKICAgICAgICAgaW50IGFycmF5SGFzaENvZGU7CkBAIC0xNjk3LDYgKzIzNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNoYXNoQ29kZShzaG9ydFtdIGEpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUkTFMoKSB7CiAgICAgICAgIGludCBsaXN0SGFzaENvZGU7CiAgICAgICAgIGludCBhcnJheUhhc2hDb2RlOwpAQCAtMTcxNCw2ICsyMzg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5BcnJheXMjaGFzaENvZGUoT2JqZWN0W10gYSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlJExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBpbnQgbGlzdEhhc2hDb2RlOwogICAgICAgICBpbnQgYXJyYXlIYXNoQ29kZTsKQEAgLTE3NjAsMTggKzI0NDEsNiBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBAdGVzdHMgamF2YS51dGlsLkFycmF5cyNzd2FwKGludCwgaW50LCBPYmplY3RbXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3N3YXBfSV9JXyRMamF2YV9sYW5nX09iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbSA9IEFycmF5cy5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgic3dhcCIsIGludC5jbGFzcywgaW50LmNsYXNzLCBPYmplY3RbXS5jbGFzcyk7Ci0gICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgSW50ZWdlcltdIGFyciA9IHtuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDIpfTsKLSAgICAgICAgbS5pbnZva2UobnVsbCwwLCAxLCBhcnIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNob3VsZCBiZSBlcXVhbCB0byAxIiwxLCBhcnJbMF0uaW50VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2hvdWxkIGJlIGVxdWFsIHRvIDAiLDAsIGFyclsxXS5pbnRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoaXMKICAgICAgKiBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0JpdFNldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0JpdFNldFRlc3QuamF2YQppbmRleCBkODU1ZjE3Li45ZDRkNTIwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9CaXRTZXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQml0U2V0VGVzdC5qYXZhCkBAIC0xNyw4ICsxNywxNCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKIAorQFRlc3RUYXJnZXRDbGFzcyhCaXRTZXQuY2xhc3MpIAogcHVibGljIGNsYXNzIEJpdFNldFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgQml0U2V0IGVpZ2h0YnM7CkBAIC0yNiw2ICszMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I0JpdFNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpdFNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuQml0U2V0KCkKICAgICAgICAgQml0U2V0IGJzID0gbmV3IEJpdFNldCgpOwpAQCAtMzksNiArNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNCaXRTZXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaXRTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5CaXRTZXQoaW50KQogICAgICAgICBCaXRTZXQgYnMgPSBuZXcgQml0U2V0KDEyOCk7CkBAIC02NSw2ICs4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuQml0U2V0LmNsb25lKCkKICAgICAgICAgQml0U2V0IGJzOwpAQCAtNzYsNiArMTA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuQml0U2V0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBCaXRTZXQgYnM7CkBAIC05OSw2ICsxNDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuQml0U2V0Lmhhc2hDb2RlKCkKICAgICAgICAgQml0U2V0IGJzID0gKEJpdFNldCkgZWlnaHRicy5jbG9uZSgpOwpAQCAtMTE1LDYgKzE2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICBlaWdodGJzLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQpAQCAtMTM1LDYgKzE5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I2NsZWFyKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkJpdFNldC5jbGVhcihpbnQpCiAKQEAgLTE2NCw2ICsyMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNjbGVhcihpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xlYXJJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkJpdFNldC5jbGVhcihpbnQsIGludCkKICAgICAgICAgLy8gcG9zMSBhbmQgcG9zMiBhcmUgaW4gdGhlIHNhbWUgYml0c2V0IGVsZW1lbnQKQEAgLTMwMSw2ICszNzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNnZXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5CaXRTZXQuZ2V0KGludCkKIApAQCAtMzI5LDYgKzQxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I2dldChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkJpdFNldC5nZXQoaW50LCBpbnQpCiAgICAgICAgIEJpdFNldCBicywgcmVzdWx0YnMsIGNvcnJlY3RiczsKQEAgLTQzNCw2ICs1MzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNzZXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5CaXRTZXQuc2V0KGludCkKIApAQCAtNDc1LDYgKzU4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I3NldChpbnQsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElaKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQml0U2V0LnNldChpbnQsIGJvb2xlYW4pCiAgICAgICAgIGVpZ2h0YnMuc2V0KDUsIGZhbHNlKTsKQEAgLTQ4Nyw2ICs2MDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNzZXQoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkJpdFNldC5zZXQoaW50LCBpbnQpCiAgICAgICAgIC8vIHBvczEgYW5kIHBvczIgYXJlIGluIHRoZSBzYW1lIGJpdHNldCBlbGVtZW50CkBAIC01OTksNiArNzIyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjc2V0KGludCwgaW50LCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElJWigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkJpdFNldC5zZXQoaW50LCBpbnQsIGJvb2xlYW4pCiAgICAgICAgIGVpZ2h0YnMuc2V0KDMsIDYsIGZhbHNlKTsKQEAgLTYxNCw2ICs3NDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNmbGlwKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxpcEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5CaXRTZXQuZmxpcChpbnQpCiAgICAgICAgIEJpdFNldCBicyA9IG5ldyBCaXRTZXQoKTsKQEAgLTY4Nyw2ICs4MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNmbGlwKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbGlwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZsaXBJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkJpdFNldC5mbGlwKGludCwgaW50KQogICAgICAgICAvLyBwb3MxIGFuZCBwb3MyIGFyZSBpbiB0aGUgc2FtZSBiaXRzZXQgZWxlbWVudApAQCAtODE3LDcgKzk2NywyNyBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I2ZsaXAoaW50LCBpbnQpCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjY2xlYXIoaW50LGludCkKICAgICAgKi8KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsaXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF8xMTE0NzgoKSB7CiAgICAgICAgIC8vIEJpdFNldCBzaG91bGRuJ3QgYmUgbW9kaWZpZWQgYnkgYW55IG9mIHRoZSBvcGVyYXRpb25zIGJlbG93LAogICAgICAgICAvLyBzaW5jZSB0aGUgYWZmZWN0ZWQgYml0cyBmb3IgdGhlc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBhcyBpbmNsdXNpdmUgb2YKQEAgLTg0Myw2ICsxMDEzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjaW50ZXJzZWN0cyhqYXZhLnV0aWwuQml0U2V0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRlcnNlY3RzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5CaXRTZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0c0xqYXZhX3V0aWxfQml0U2V0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuQml0U2V0LmludGVyc2VjdHMoamF2YS51dGlsLkJpdFNldCkKICAgICAgICAgQml0U2V0IGJzID0gbmV3IEJpdFNldCg1MDApOwpAQCAtOTE5LDYgKzEwOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNhbmQoamF2YS51dGlsLkJpdFNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5CaXRTZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYW5kTGphdmFfdXRpbF9CaXRTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5CaXRTZXQuYW5kKGphdmEudXRpbC5CaXRTZXQpCiAgICAgICAgIEJpdFNldCBicyA9IG5ldyBCaXRTZXQoMTI4KTsKQEAgLTk0MSw2ICsxMTI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjYW5kTm90KGphdmEudXRpbC5CaXRTZXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFuZE5vdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQml0U2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FuZE5vdExqYXZhX3V0aWxfQml0U2V0KCkgewogICAgICAgICBCaXRTZXQgYnMgPSAoQml0U2V0KSBlaWdodGJzLmNsb25lKCk7CiAgICAgICAgIGJzLmNsZWFyKDUpOwpAQCAtOTU5LDYgKzExNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNvcihqYXZhLnV0aWwuQml0U2V0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQml0U2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29yTGphdmFfdXRpbF9CaXRTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5CaXRTZXQub3IoamF2YS51dGlsLkJpdFNldCkKICAgICAgICAgQml0U2V0IGJzID0gbmV3IEJpdFNldCgxMjgpOwpAQCAtOTgwLDYgKzExODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCN4b3IoamF2YS51dGlsLkJpdFNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAieG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5CaXRTZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfeG9yTGphdmFfdXRpbF9CaXRTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5CaXRTZXQueG9yKGphdmEudXRpbC5CaXRTZXQpCiAKQEAgLTEwMDUsNiArMTIyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5CaXRTZXQuc2l6ZSgpCiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IHNpemUiLCA2NCwgZWlnaHRicy5zaXplKCkpOwpAQCAtMTAxNiw2ICsxMjQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudXRpbC5CaXRTZXQudG9TdHJpbmcoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iLCAiezAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9IiwgZWlnaHRicwpAQCAtMTAyOCw2ICsxMjYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjbGVuZ3RoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sZW5ndGgoKSB7CiAgICAgICAgIEJpdFNldCBicyA9IG5ldyBCaXRTZXQoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQml0U2V0IHJldHVybmVkIHdyb25nIGxlbmd0aC0td2FudGVkIDAsIGdvdDogIgpAQCAtMTA0OSw2ICsxMjkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjbmV4dFNldEJpdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRTZXRCaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRTZXRCaXRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5CaXRTZXQubmV4dFNldEJpdCgpCiAgICAgICAgIEJpdFNldCBicyA9IG5ldyBCaXRTZXQoNTAwKTsKQEAgLTExMzAsNiArMTM4MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQml0U2V0I25leHRDbGVhckJpdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRDbGVhckJpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dENsZWFyQml0SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuQml0U2V0Lm5leHRTZXRCaXQoKQogICAgICAgICBCaXRTZXQgYnMgPSBuZXcgQml0U2V0KDUwMCk7CkBAIC0xMjIxLDYgKzE0ODEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkJpdFNldCNpc0VtcHR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFbXB0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKICAgICAgICAgQml0U2V0IGJzID0gbmV3IEJpdFNldCg1MDApOwogICAgICAgICBhc3NlcnRUcnVlKCJUZXN0OiBpc0VtcHR5KCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUiLCBicy5pc0VtcHR5KCkpOwpAQCAtMTI1Nyw2ICsxNTI2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5CaXRTZXQjY2FyZGluYWxpdHkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYXJkaW5hbGl0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2FyZGluYWxpdHkoKSB7CiAgICAgICAgIC8vIHRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkJpdFNldC5jYXJkaW5hbGl0eSgpCiAgICAgICAgIEJpdFNldCBicyA9IG5ldyBCaXRTZXQoNTAwKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0NhbGVuZGFyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXJUZXN0LmphdmEKaW5kZXggY2YxYmI0OS4uYjc3ZTFlNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXJUZXN0LmphdmEKQEAgLTE3LDExICsxNywxNyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCitAVGVzdFRhcmdldENsYXNzKENhbGVuZGFyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDYWxlbmRhclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIAogICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlOwpAQCAtMjksNiArMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNhbGVuZGFyI3NldChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBjb3JyZWN0IHJlc3VsdCBkZWZpbmVkIGJ5IHRoZSBsYXN0IHNldCBmaWVsZAogICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRVNUIikpOwpAQCAtMzgwLDYgKzM5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ2FsZW5kYXIjc2V0VGltZShqYXZhLnV0aWwuRGF0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGltZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuRGF0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRUaW1lTGphdmFfdXRpbF9EYXRlKCkgewogICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwogICAgICAgICAvLyBVc2UgbWlsbGlzZWNvbmQgdGltZSBmb3IgdGVzdGluZyBpbiBDb3JlCkBAIC0zOTUsNiArNDE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5DYWxlbmRhciNjb21wYXJlVG8oQ2FsZW5kYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5DYWxlbmRhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV91dGlsX0NhbGVuZGFyX251bGwoKSB7CiAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CiAgICAgICAgIHRyeSB7CkBAIC00MDgsNiArNDQxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5DYWxlbmRhciNjb21wYXJlVG8oQ2FsZW5kYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24sICIgKyAKKyAgICAgICAgICAgICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5DYWxlbmRhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV91dGlsX0NhbGVuZGFyKCkgewogICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwogICAgICAgICBjYWwuY2xlYXIoKTsKQEAgLTQzMiw2ICs0NzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNhbGVuZGFyI2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ3NQogICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwpAQCAtNDQ1LDYgKzQ5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ2FsZW5kYXIjZ2V0VGltZUluTWlsbGlzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGltZUluTWlsbGlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUaW1lSW5NaWxsaXMoKSB7CiAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CiAKQEAgLTQ2NCw2ICs1MjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhciNnZXRBY3R1YWxNYXhpbXVtKGludCl9CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFjdHVhbE1heGltdW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFjdHVhbE1heGltdW1fSSgpIHsKICAgICAgICAgQ2FsZW5kYXIgYyA9IG5ldyBNb2NrQ2FsZW5kYXIoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG91bGQgYmUgZXF1YWwgdG8gMCIsIDAsIGMuZ2V0QWN0dWFsTWF4aW11bSgwKSk7CkBAIC00NzIsNiArNTQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXIjZ2V0QWN0dWFsTWluaW11bShpbnQpfQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3R1YWxNaW5pbXVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBY3R1YWxNaW5pbXVtX0koKSB7CiAgICAgICAgIENhbGVuZGFyIGMgPSBuZXcgTW9ja0NhbGVuZGFyKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygic2hvdWxkIGJlIGVxdWFsIHRvIDAiLCAwLCBjLmdldEFjdHVhbE1pbmltdW0oMCkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ29sbGVjdGlvbnNUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Db2xsZWN0aW9uc1Rlc3QuamF2YQppbmRleCAxODA4NDhlLi4zNmRhNTEzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Db2xsZWN0aW9uc1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Db2xsZWN0aW9uc1Rlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC00Niw2ICs1MSw3IEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1VubW9kaWZpYWJsZUNvbGxlY3Rpb25UZXN0OwogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Vbm1vZGlmaWFibGVNYXBUZXN0OwogCitAVGVzdFRhcmdldENsYXNzKENvbGxlY3Rpb25zLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uc1Rlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgTGlua2VkTGlzdCBsbDsKQEAgLTI3NSw2ICsyODEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2JpbmFyeVNlYXJjaChqYXZhLnV0aWwuTGlzdCwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmluYXJ5U2VhcmNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2JpbmFyeVNlYXJjaExqYXZhX3V0aWxfTGlzdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50CiAgICAgICAgIC8vIGphdmEudXRpbC5Db2xsZWN0aW9ucy5iaW5hcnlTZWFyY2goamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QpCkBAIC0yOTcsNiArMzEyLDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNiaW5hcnlTZWFyY2goamF2YS51dGlsLkxpc3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db21wYXJhdG9yKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsYXNzQ2FzdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaW5hcnlTZWFyY2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkNvbXBhcmF0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYmluYXJ5U2VhcmNoTGphdmFfdXRpbF9MaXN0TGphdmFfbGFuZ19PYmplY3RMamF2YV91dGlsX0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLk9iamVjdCwKQEAgLTMyNCw2ICszNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2NvcHkoamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5MaXN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZ1bmN0aW9uYWxpdHkgYW5kIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvcHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3MsIGphdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvcHlMamF2YV91dGlsX0xpc3RMamF2YV91dGlsX0xpc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5Db2xsZWN0aW9ucy5jb3B5KGphdmEudXRpbC5MaXN0LAogICAgICAgICAvLyBqYXZhLnV0aWwuTGlzdCkKQEAgLTM1OSw2ICszOTMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2NvcHkoamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5MaXN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIERvZXNuJ3QgdmVyaWZ5ICIgKworICAgICAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvcHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3MsIGphdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvcHlfY2hlY2tfaW5kZXgoKSB7CiAgICAgICAgIEFycmF5TGlzdCBhMSA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgYTEuYWRkKCJvbmUiKTsKQEAgLTM3OSw2ICs0MjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2VudW1lcmF0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnVtZXJhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbnVtZXJhdGlvbkxqYXZhX3V0aWxfQ29sbGVjdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5FbnVtZXJhdGlvbgogICAgICAgICAvLyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC0zOTYsNiArNDQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNmaWxsKGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZpZXMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9maWxsTGphdmFfdXRpbF9MaXN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5Db2xsZWN0aW9ucy5maWxsKGphdmEudXRpbC5MaXN0LAogICAgICAgICAvLyBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNDIxLDYgKzQ4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjbWF4KGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsYXNzQ2FzdEV4Y2VwdGlvbiwgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWF4TGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMubWF4KGphdmEudXRpbC5Db2xsZWN0aW9uKQpAQCAtNDMzLDYgKzUwNCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjbWF4KGphdmEudXRpbC5Db2xsZWN0aW9uLAogICAgICAqICAgICAgICBqYXZhLnV0aWwuQ29tcGFyYXRvcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzLCBqYXZhLnV0aWwuQ29tcGFyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXhMamF2YV91dGlsX0NvbGxlY3Rpb25MamF2YV91dGlsX0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5Db2xsZWN0aW9ucy5tYXgoamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEudXRpbC5Db21wYXJhdG9yKQpAQCAtNDQ4LDYgKzUyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjbWluKGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsYXNzQ2FzdEV4Y2VwdGlvbiwgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtaW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWluTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMubWluKGphdmEudXRpbC5Db2xsZWN0aW9uKQpAQCAtNDYwLDYgKzU0OSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjbWluKGphdmEudXRpbC5Db2xsZWN0aW9uLAogICAgICAqICAgICAgICBqYXZhLnV0aWwuQ29tcGFyYXRvcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzLCBqYXZhLnV0aWwuQ29tcGFyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9taW5MamF2YV91dGlsX0NvbGxlY3Rpb25MamF2YV91dGlsX0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5Db2xsZWN0aW9ucy5taW4oamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEudXRpbC5Db21wYXJhdG9yKQpAQCAtNDc1LDYgKzU3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjbkNvcGllcyhpbnQsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5Db3BpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25Db3BpZXNJTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlzdCBqYXZhLnV0aWwuQ29sbGVjdGlvbnMubkNvcGllcyhpbnQsCiAgICAgICAgIC8vIGphdmEubGFuZy5PYmplY3QpCkBAIC01MTQsNiArNjIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNyZXZlcnNlKGphdmEudXRpbC5MaXN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJldmVyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmV2ZXJzZUxqYXZhX3V0aWxfTGlzdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkNvbGxlY3Rpb25zLnJldmVyc2UoamF2YS51dGlsLkxpc3QpCiAgICAgICAgIHRyeSB7CkBAIC01NDIsNiArNjU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNyZXZlcnNlT3JkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXZlcnNlT3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JldmVyc2VPcmRlcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Db21wYXJhdG9yCiAgICAgICAgIC8vIGphdmEudXRpbC5Db2xsZWN0aW9ucy5yZXZlcnNlT3JkZXIoKQpAQCAtNTU4LDYgKzY4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc2h1ZmZsZShqYXZhLnV0aWwuTGlzdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmdW5jdGlvbmFsaXR5LCBhbmQgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2h1ZmZsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaHVmZmxlTGphdmFfdXRpbF9MaXN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2h1ZmZsZShqYXZhLnV0aWwuTGlzdCkKICAgICAgICAgLy8gQXNzdW1lcyBsbCBpcyBzb3J0ZWQgYW5kIGhhcyBubyBkdXBsaWNhdGUga2V5cyBhbmQgaXMgbGFyZ2UgKCA+IDIwCkBAIC02MDksNiArNzQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaHVmZmxlKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuUmFuZG9tKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNodWZmbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3MsIGphdmEudXRpbC5SYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2h1ZmZsZUxqYXZhX3V0aWxfTGlzdExqYXZhX3V0aWxfUmFuZG9tKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2h1ZmZsZShqYXZhLnV0aWwuTGlzdCwKICAgICAgICAgLy8gamF2YS51dGlsLlJhbmRvbSkKQEAgLTYzNCw2ICs3NzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaW5nbGV0b24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaW5nbGV0b25MamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TZXQKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbihqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNjU4LDYgKzgxMCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc29ydChqYXZhLnV0aWwuTGlzdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sICIgKyAKKyAgICAgICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvcnRMamF2YV91dGlsX0xpc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zb3J0KGphdmEudXRpbC5MaXN0KQogICAgICAgICAvLyBhc3N1bWVzIG5vIGR1cGxpY2F0ZSBrZXlzIGluIGxsCkBAIC02ODcsNiArODQ5LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzb3J0KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sICIgKyAKKyAgICAgICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzLCBqYXZhLnV0aWwuQ29tcGFyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb3J0TGphdmFfdXRpbF9MaXN0TGphdmFfdXRpbF9Db21wYXJhdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc29ydChqYXZhLnV0aWwuTGlzdCwKICAgICAgICAgLy8gamF2YS51dGlsLkNvbXBhcmF0b3IpCkBAIC03MTEsNiArODgzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzd2FwKGphdmEudXRpbC5MaXN0LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3dhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3dhcExqYXZhX3V0aWxfTGlzdElJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgc3dhcChqYXZhLnV0aWwuTGlzdCwgaW50LCBpbnQpCiAKQEAgLTc3MCw2ICs5NTEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JlcGxhY2VBbGwoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVwbGFjZUFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlQWxsTGphdmFfdXRpbF9MaXN0TGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHJlcGxhY2VBbGwoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QsCiAgICAgICAgIC8vIGphdmEubGFuZy5PYmplY3QpCkBAIC04NTcsNiArMTA0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjcm90YXRlKGphdmEudXRpbC5MaXN0LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZnVuY3Rpb25hbGl0eSwgYW5kIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJvdGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JvdGF0ZUxqYXZhX3V0aWxfTGlzdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCByb3RhdGUoamF2YS51dGlsLkxpc3QsIGludCkKIApAQCAtOTM5LDYgKzExMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JvdGF0ZShqYXZhLnV0aWwuTGlzdCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb3RhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yb3RhdGUyKCkgewogICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIHRyeSB7CkBAIC05NzEsNiArMTE3OSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjaW5kZXhPZlN1Ykxpc3QoamF2YS51dGlsLkxpc3QsCiAgICAgICogICAgICAgIGphdmEudXRpbC5MaXN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIGFuZCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbmRleE9mU3ViTGlzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgamF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZlN1Ykxpc3RMamF2YV91dGlsX0xpc3RMamF2YV91dGlsX0xpc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgaW5kZXhPZlN1Ykxpc3QoamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5MaXN0KQogICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC0xMDAzLDYgKzEyMjAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2luZGV4T2ZTdWJMaXN0KGphdmEudXRpbC5MaXN0LAogICAgICAqICAgICAgICBqYXZhLnV0aWwuTGlzdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5kZXhPZlN1Ykxpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3MsIGphdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZTdWJMaXN0MigpIHsKICAgICAgICAgQXJyYXlMaXN0IHN1YiA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgc3ViLmFkZChuZXcgSW50ZWdlcigxKSk7CkBAIC0xMDkwLDYgKzEzMTYsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2xhc3RJbmRleE9mU3ViTGlzdChqYXZhLnV0aWwuTGlzdCwKICAgICAgKiAgICAgICAgamF2YS51dGlsLkxpc3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24sIGFuZCBib3VuZGFyeSBjb25kaXRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3RJbmRleE9mU3ViTGlzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgamF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGFzdEluZGV4T2ZTdWJMaXN0TGphdmFfdXRpbF9MaXN0TGphdmFfdXRpbF9MaXN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGxhc3RJbmRleE9mU3ViTGlzdChqYXZhLnV0aWwuTGlzdCwKICAgICAgICAgLy8gamF2YS51dGlsLkxpc3QpCkBAIC0xMTIzLDYgKzEzNTgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2xhc3RJbmRleE9mU3ViTGlzdChqYXZhLnV0aWwuTGlzdCwKICAgICAgKiAgICAgICAgamF2YS51dGlsLkxpc3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3RJbmRleE9mU3ViTGlzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzcywgamF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGFzdEluZGV4T2ZTdWJMaXN0MigpIHsKICAgICAgICAgQXJyYXlMaXN0IHN1YiA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgc3ViLmFkZChuZXcgSW50ZWdlcigxKSk7CkBAIC0xMTk1LDYgKzE0MzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2xpc3QoamF2YS51dGlsLkVudW1lcmF0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5FbnVtZXJhdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9saXN0TGphdmFfdXRpbF9FbnVtZXJhdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5BcnJheUxpc3QgbGlzdChqYXZhLnV0aWwuRW51bWVyYXRpb24pCiAKQEAgLTEyMTMsNiArMTQ2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkQ29sbGVjdGlvbihqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3luY2hyb25pemVkQ29sbGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zeW5jaHJvbml6ZWRDb2xsZWN0aW9uTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkNvbGxlY3Rpb24KICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24oamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC0xMjY4LDYgKzE1MzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZExpc3QoamF2YS51dGlsLkxpc3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmNocm9uaXplZExpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3luY2hyb25pemVkTGlzdExqYXZhX3V0aWxfTGlzdCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobnVsbCk7CkBAIC0xMzUxLDYgKzE2MjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeW5jaHJvbml6ZWRNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zeW5jaHJvbml6ZWRNYXBMamF2YV91dGlsX01hcCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5NYXAKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChqYXZhLnV0aWwuTWFwKQpAQCAtMTQxNiw2ICsxNjk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRTZXQoamF2YS51dGlsLlNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3luY2hyb25pemVkU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3luY2hyb25pemVkU2V0TGphdmFfdXRpbF9TZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0CiAgICAgICAgIC8vIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQoamF2YS51dGlsLlNldCkKQEAgLTE0NzAsNiArMTc1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkU29ydGVkTWFwKGphdmEudXRpbC5Tb3J0ZWRNYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmNocm9uaXplZFNvcnRlZE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU29ydGVkTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N5bmNocm9uaXplZFNvcnRlZE1hcExqYXZhX3V0aWxfU29ydGVkTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNvcnRlZE1hcAogICAgICAgICAvLyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU29ydGVkTWFwKGphdmEudXRpbC5Tb3J0ZWRNYXApCkBAIC0xNTI3LDYgKzE4MjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZFNvcnRlZFNldChqYXZhLnV0aWwuU29ydGVkU2V0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeW5jaHJvbml6ZWRTb3J0ZWRTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNvcnRlZFNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zeW5jaHJvbml6ZWRTb3J0ZWRTZXRMamF2YV91dGlsX1NvcnRlZFNldCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Tb3J0ZWRTZXQKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNvcnRlZFNldChqYXZhLnV0aWwuU29ydGVkU2V0KQpAQCAtMTU3MCw2ICsxODc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyN1bm1vZGlmaWFibGVDb2xsZWN0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1vZGlmaWFibGVDb2xsZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VubW9kaWZpYWJsZUNvbGxlY3Rpb25MamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuQ29sbGVjdGlvbgogICAgICAgICAvLyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihqYXZhLnV0aWwuQ29sbGVjdGlvbikKQEAgLTE2MTYsNiArMTkzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlTGlzdChqYXZhLnV0aWwuTGlzdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tb2RpZmlhYmxlTGlzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bm1vZGlmaWFibGVMaXN0TGphdmFfdXRpbF9MaXN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkxpc3QKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoamF2YS51dGlsLkxpc3QpCkBAIC0xNjg5LDYgKzIwMTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3VubW9kaWZpYWJsZU1hcChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1vZGlmaWFibGVNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bm1vZGlmaWFibGVNYXBMamF2YV91dGlsX01hcCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5NYXAKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChqYXZhLnV0aWwuTWFwKQpAQCAtMTc3Miw2ICsyMTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9ucyN1bm1vZGlmaWFibGVTZXQoamF2YS51dGlsLlNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tb2RpZmlhYmxlU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5tb2RpZmlhYmxlU2V0TGphdmFfdXRpbF9TZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0CiAgICAgICAgIC8vIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoamF2YS51dGlsLlNldCkKQEAgLTE4MTMsNiArMjE1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlU29ydGVkTWFwKGphdmEudXRpbC5Tb3J0ZWRNYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVubW9kaWZpYWJsZVNvcnRlZE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU29ydGVkTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VubW9kaWZpYWJsZVNvcnRlZE1hcExqYXZhX3V0aWxfU29ydGVkTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNvcnRlZE1hcAogICAgICAgICAvLyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkTWFwKGphdmEudXRpbC5Tb3J0ZWRNYXApCkBAIC0xODQ4LDYgKzIyMDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI3VubW9kaWZpYWJsZVNvcnRlZFNldChqYXZhLnV0aWwuU29ydGVkU2V0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1vZGlmaWFibGVTb3J0ZWRTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNvcnRlZFNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bm1vZGlmaWFibGVTb3J0ZWRTZXRMamF2YV91dGlsX1NvcnRlZFNldCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Tb3J0ZWRTZXQKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChqYXZhLnV0aWwuU29ydGVkU2V0KQpAQCAtMTg4MCw2ICsyMjQxLDIzIEBACiAgICAgLyoqCiAgICAgICogVGVzdCB1bm1vZGlmaWFibGUgb2JqZWN0cyB0b1N0cmluZyBtZXRob2RzCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVubW9kaWZpYWJsZUNvbGxlY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tb2RpZmlhYmxlTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5tb2RpZmlhYmxlX3RvU3RyaW5nX21ldGhvZHMoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNTUyCiAgICAgICAgIEFycmF5TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTE4OTUsMjUgKzIyNzMsNiBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbGxlY3Rpb25zI2NoZWNrVHlwZShPYmplY3QsIENsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hlY2tUeXBlX0xqYXZhX2xhbmdfT2JqZWN0X0xqYXZhX2xhbmdfQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG0gPSBDb2xsZWN0aW9ucy5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiY2hlY2tUeXBlIiwgT2JqZWN0LmNsYXNzLCBDbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgbS5pbnZva2UobnVsbCwgbmV3IE9iamVjdCgpLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICBtLmludm9rZShudWxsLCBuZXcgT2JqZWN0KCksIGludC5jbGFzcyk7Ci0gICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiIpOwotICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSBNZXNzYWdlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICJsdW5pLjA1IiwgT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3MpOwotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGVyck1zZywgZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgogICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiBUaGlzIG1ldGhvZAogICAgICAqIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ29uY3VycmVudE1vZFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0NvbmN1cnJlbnRNb2RUZXN0LmphdmEKaW5kZXggYjlkOWNlZi4uZTNhZjUyNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ29uY3VycmVudE1vZFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Db25jdXJyZW50TW9kVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMjYsMTEgKzMxLDIxIEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQWJzdHJhY3RMaXN0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDb25jdXJyZW50TW9kVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLnV0aWwuQWJzdHJhY3RMaXN0LnN1Ykxpc3QoaW50LCBpbnQpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKICAgICAgICAgQWJzdHJhY3RMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBEb3VibGUgb25lID0gbmV3IERvdWJsZSgxLjApOwpAQCAtNjEsNiArNzYsMTcgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIGZvciAnamF2YS51dGlsLkFic3RyYWN0TGlzdC5zdWJMaXN0KGludCwgaW50KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgIiArIAorICAgICAgICAgICAgIkNsYXNzQ2FzdEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7CiAgICAgICAgIEFic3RyYWN0TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgRG91YmxlIG9uZSA9IG5ldyBEb3VibGUoMS4wKTsKQEAgLTkxLDYgKzExNywxOCBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLnV0aWwuQWJzdHJhY3RMaXN0LnN1Ykxpc3QoaW50LCBpbnQpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiQ2xhc3NDYXN0RXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7CiAgICAgICAgIEFic3RyYWN0TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgRG91YmxlIG9uZSA9IG5ldyBEb3VibGUoMS4wKTsKQEAgLTEyMSw2ICsxNTksMTYgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIGZvciAnamF2YS51dGlsLkFic3RyYWN0TGlzdC5zdWJMaXN0KGludCwgaW50KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgIiArIAorICAgICAgICAgICAgIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKICAgICAgICAgQWJzdHJhY3RMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBEb3VibGUgb25lID0gbmV3IERvdWJsZSgxLjApOwpAQCAtMTUxLDYgKzE5OSwxNyBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLnV0aWwuQWJzdHJhY3RMaXN0LnN1Ykxpc3QoaW50LCBpbnQpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sICIgKyAKKyAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKICAgICAgICAgQWJzdHJhY3RMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBEb3VibGUgb25lID0gbmV3IERvdWJsZSgxLjApOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0NvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMjNmYjE5NS4uYmE1MDYxOSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMTcgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uVGVzdCBleHRlbmRzCiAgICAgICAgIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKQEAgLTUwLDYgKzU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uI0NvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCkKICAgICAgICAgQ29sbGVjdGlvbiBteUNvbGxlY3Rpb24gPSBuZXcgTGlua2VkTGlzdCgpOwpAQCAtNzUsNiArOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24jQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kCiAgICAgICAgIC8vIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9DdXJyZW5jeVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0N1cnJlbmN5VGVzdC5qYXZhCmluZGV4IGUyZWIzMWUuLjI5YjljMGEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0N1cnJlbmN5VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0N1cnJlbmN5VGVzdC5qYXZhCkBAIC0xNyw5ICsxNywxNSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkN1cnJlbmN5OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ3VycmVuY3kuY2xhc3MpIAogcHVibGljIGNsYXNzIEN1cnJlbmN5VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGUgZGVmYXVsdExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CkBAIC0yNyw2ICszMywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ3VycmVuY3kjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiZ2V0SW5zdGFuY2UoU3RyaW5nKSBtZXRob2QgaXMgdGVzdGVkIGluICIgKworICAgICAgICAgICAgInRlc3RfZ2V0SW5zdGFuY2VMamF2YV91dGlsX0xvY2FsZSgpIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBzZWUgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX3V0aWxfTG9jYWxlKCkgdGVzdHMKICAgICB9CkBAIC0zNCw3ICs1MCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ3VycmVuY3kjZ2V0SW5zdGFuY2UoamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfdXRpbF9Mb2NhbGUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEluc3RhbmNlTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIHRoZSBiZWhhdmlvdXIgaW4gYWxsIHRoZXNlIHRocmVlIGNhc2VzIHNob3VsZCBiZSB0aGUgc2FtZSBzaW5jZSB0aGlzCiAgICAgICAgICAqIG1ldGhvZCBpZ25vcmVzIGxhbmd1YWdlIGFuZCB2YXJpYW50IGNvbXBvbmVudCBvZiB0aGUgbG9jYWxlLgpAQCAtMTE5LDcgKzE0NCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ3VycmVuY3kjZ2V0U3ltYm9sKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN5bWJvbCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3ltYm9sIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0U3ltYm9sKCkgewogCiAgICAgICAgIEN1cnJlbmN5IGN1cnJLID0gQ3VycmVuY3kuZ2V0SW5zdGFuY2UoIktSVyIpOwogICAgICAgICBDdXJyZW5jeSBjdXJySSA9IEN1cnJlbmN5LmdldEluc3RhbmNlKCJJTlIiKTsKQEAgLTE0Nyw3ICsxODEsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkN1cnJlbmN5I2dldFN5bWJvbChqYXZhLnV0aWwuTG9jYWxlKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3ltYm9sTGphdmFfdXRpbF9Mb2NhbGUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN5bWJvbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRTeW1ib2xMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgTG9jYWxlLnNldERlZmF1bHQoTG9jYWxlLlVTKTsKICAgICAgICAgQ3VycmVuY3kgY3VyckUgPSBDdXJyZW5jeS5nZXRJbnN0YW5jZSgiRVVSIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiRVVSIiwgY3VyckUuZ2V0U3ltYm9sKExvY2FsZS5KQVBBTikpOwpAQCAtMzAxLDcgKzM0NCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuQ3VycmVuY3kjZ2V0RGVmYXVsdEZyYWN0aW9uRGlnaXRzKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRGcmFjdGlvbkRpZ2l0cygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdEZyYWN0aW9uRGlnaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0RGVmYXVsdEZyYWN0aW9uRGlnaXRzKCkgewogICAgICAgICBDdXJyZW5jeSBjMSA9IEN1cnJlbmN5LmdldEluc3RhbmNlKCJFVVIiKTsKICAgICAgICAgYzEuZ2V0RGVmYXVsdEZyYWN0aW9uRGlnaXRzKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIEN1cnJlbmN5LmdldEluc3RhbmNlKFwiIiArIGMxCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9EYXRlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRGF0ZVRlc3QuamF2YQppbmRleCBlODQzMzNjLi4zYzJjNjkzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9EYXRlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0RhdGVUZXN0LmphdmEKQEAgLTE3LDE2ICsxNywzMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRGF0ZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRGF0ZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI0RhdGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5EYXRlKCkKICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk5OCwgQ2FsZW5kYXIuT0NUT0JFUiwKQEAgLTQwLDYgKzU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI0RhdGUoaW50LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkRhdGUoaW50LCBpbnQsIGludCkKICAgICAgICAgRGF0ZSBkMSA9IG5ldyBEYXRlKDcwLCAwLCAxKTsgLy8gdGhlIGVwb2NoICsgbG9jYWwgdGltZQpAQCAtNTcsNiArODEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjRGF0ZShpbnQsIGludCwgaW50LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkRhdGUoaW50LCBpbnQsIGludCwgaW50LCBpbnQpCiAgICAgICAgIApAQCAtNzMsNiArMTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI0RhdGUoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkRhdGUoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkKICAgICAgICAgCkBAIC04OSw2ICsxMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjRGF0ZShsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JKKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkRhdGUobG9uZykKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVXNlZCB0byB0ZXN0IiwgdHJ1ZSk7CkBAIC05Nyw2ICsxNDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjRGF0ZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5EYXRlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIERhdGUgZDEgPSBuZXcgRGF0ZSgiSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCBHTVQiKTsgLy8gdGhlIGVwb2NoCkBAIC0xMTYsNiArMTc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2FmdGVyKGphdmEudXRpbC5EYXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFmdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5EYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FmdGVyTGphdmFfdXRpbF9EYXRlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuRGF0ZS5hZnRlcihqYXZhLnV0aWwuRGF0ZSkKICAgICAgICAgRGF0ZSBkMSA9IG5ldyBEYXRlKDApOwpAQCAtMTI3LDYgKzE5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRGF0ZSNiZWZvcmUoamF2YS51dGlsLkRhdGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmVmb3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5EYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2JlZm9yZUxqYXZhX3V0aWxfRGF0ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkRhdGUuYmVmb3JlKGphdmEudXRpbC5EYXRlKQogICAgICAgICBEYXRlIGQxID0gbmV3IERhdGUoMCk7CkBAIC0xMzgsNiArMjE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuRGF0ZS5jbG9uZSgpCiAgICAgICAgIERhdGUgZDEgPSBuZXcgRGF0ZSgxMDAwMDApOwpAQCAtMTUxLDYgKzIzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRGF0ZSNjb21wYXJlVG8oamF2YS51dGlsLkRhdGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5EYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBhcmVUb0xqYXZhX3V0aWxfRGF0ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuRGF0ZS5jb21wYXJlVG8oamF2YS51dGlsLkRhdGUpCiAgICAgICAgIGZpbmFsIGludCBzb21lTnVtYmVyID0gMTAwMDA7CkBAIC0xNzIsNiArMjY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkRhdGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIERhdGUgZDEgPSBuZXcgRGF0ZSgwKTsKQEAgLTE4NCw2ICsyODksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjZ2V0RGF0ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERhdGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkRhdGUuZ2V0RGF0ZSgpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC0xOTQsNiArMzA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2dldERheSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5EYXRlLmdldERheSgpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC0yMDQsNiArMzI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2dldEhvdXJzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SG91cnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEhvdXJzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5EYXRlLmdldEhvdXJzKCkKICAgICAgICAgRGF0ZSBkID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5OTgsIENhbGVuZGFyLk9DVE9CRVIsIDEzLCAxOSwgOSkKQEAgLTIxNCw2ICszNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjZ2V0TWludXRlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1pbnV0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1pbnV0ZXMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkRhdGUuZ2V0TWludXRlcygpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC0yMjQsNiArMzY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2dldE1vbnRoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TW9udGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vbnRoKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5EYXRlLmdldE1vbnRoKCkKICAgICAgICAgRGF0ZSBkID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5OTgsIENhbGVuZGFyLk9DVE9CRVIsIDEzLCAxOSwgOSkKQEAgLTIzNCw2ICszODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjZ2V0U2Vjb25kcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlY29uZHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY29uZHMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkRhdGUuZ2V0U2Vjb25kcygpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC0yNDQsNiArNDAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2dldFRpbWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUaW1lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgbG9uZyBqYXZhLnV0aWwuRGF0ZS5nZXRUaW1lKCkKICAgICAgICAgRGF0ZSBkMSA9IG5ldyBEYXRlKDApOwpAQCAtMjU1LDYgKzQyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRGF0ZSNnZXRUaW1lem9uZU9mZnNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUaW1lem9uZU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VGltZXpvbmVPZmZzZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKQogICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3QiLCB0cnVlKTsKQEAgLTI2Myw2ICs0NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjZ2V0WWVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFllYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFllYXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkRhdGUuZ2V0WWVhcigpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC0yNzMsNiArNDU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5EYXRlLmhhc2hDb2RlKCkKICAgICAgICAgRGF0ZSBkMSA9IG5ldyBEYXRlKDApOwpAQCAtMjg0LDYgKzQ3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRGF0ZSNwYXJzZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEudXRpbC5EYXRlLnBhcnNlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIERhdGUgZCA9IG5ldyBEYXRlKERhdGUucGFyc2UoIjEzIE9jdG9iZXIgMTk5OCIpKTsKQEAgLTMyNyw2ICs1MzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjc2V0RGF0ZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERhdGVJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuRGF0ZS5zZXREYXRlKGludCkKICAgICAgICAgRGF0ZSBkID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5OTgsIENhbGVuZGFyLk9DVE9CRVIsIDEzLCAxOSwgOSkKQEAgLTMzOCw2ICs1NTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjc2V0SG91cnMoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRIb3VycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SG91cnNJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuRGF0ZS5zZXRIb3VycyhpbnQpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC0zNDksNiArNTcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI3NldE1pbnV0ZXMoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNaW51dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNaW51dGVzSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkRhdGUuc2V0TWludXRlcyhpbnQpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC0zNjAsNiArNTkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI3NldE1vbnRoKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TW9udGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1vbnRoSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkRhdGUuc2V0TW9udGgoaW50KQogICAgICAgICBEYXRlIGQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk5OCwgQ2FsZW5kYXIuT0NUT0JFUiwgMTMsIDE5LCA5KQpAQCAtMzcxLDYgKzYxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRGF0ZSNzZXRTZWNvbmRzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2Vjb25kcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2Vjb25kc0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5EYXRlLnNldFNlY29uZHMoaW50KQogICAgICAgICBEYXRlIGQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk5OCwgQ2FsZW5kYXIuT0NUT0JFUiwgMTMsIDE5LCA5KQpAQCAtMzgyLDYgKzYzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRGF0ZSNzZXRUaW1lKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRpbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRUaW1lSigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkRhdGUuc2V0VGltZShsb25nKQogICAgICAgICBEYXRlIGQxID0gbmV3IERhdGUoMCk7CkBAIC0zOTUsNiArNjUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI3NldFllYXIoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRZZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRZZWFySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkRhdGUuc2V0WWVhcihpbnQpCiAgICAgICAgIERhdGUgZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCBDYWxlbmRhci5PQ1RPQkVSLCAxMywgMTksIDkpCkBAIC00MDYsNiArNjczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5EYXRlI3RvR01UU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9HTVRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvR01UU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuRGF0ZS50b0dNVFN0cmluZygpCiAgICAgICAgIGFzc2VydEVxdWFscygiRGlkIG5vdCBjb252ZXJ0IGVwb2NoIHRvIEdNVCBzdHJpbmcgY29ycmVjdGx5IiwgIjEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIiwgbmV3IERhdGUoMCkKQEAgLTQxOCw3ICs2OTQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjdG9TdHJpbmcoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudXRpbC5EYXRlLnRvU3RyaW5nKCkKICAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgY2FsLnNldChDYWxlbmRhci5EQVRFLCAxKTsKQEAgLTQ0Nyw2ICs3MzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkRhdGUjVVRDKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVUQyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1VUQ0lJSUlJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGxvbmcgamF2YS51dGlsLkRhdGUuVVRDKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBVVEMgdmFsdWUgZm9yIGVwb2NoIiwgRGF0ZS5VVEMoNzAsIDAsIDEsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FbXB0eVN0YWNrRXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRW1wdHlTdGFja0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCA4YzMzMjUwLi45NzFiNjc1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FbXB0eVN0YWNrRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0VtcHR5U3RhY2tFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDkgKzE3LDE1IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRW1wdHlTdGFja0V4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRW1wdHlTdGFja0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgc3RhdGljIE9iamVjdFtdIG9iakFycmF5ID0gbmV3IE9iamVjdFsxMF07CkBAIC0zMyw2ICszOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbiNFbXB0eVN0YWNrRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW1wdHlTdGFja0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbigpCiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FbnVtTWFwVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRW51bU1hcFRlc3QuamF2YQppbmRleCBkMmExZTljLi44NTgwZDE3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FbnVtTWFwVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0VudW1NYXBUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwpAQCAtMjksNiArMzQsNyBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEVudW1NYXAuY2xhc3MpIAogcHVibGljIGNsYXNzIEVudW1NYXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIGVudW0gU2l6ZSB7CiAgICAgICAgIFNtYWxsLCBNaWRkbGUsIEJpZyB7fTsKQEAgLTc2LDYgKzgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtTWFwI0VudW1NYXAoQ2xhc3MpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVudW1NYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX0NsYXNzKCkgewogICAgICAgICB0cnkgewpAQCAtMTQyLDYgKzE1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bU1hcCNFbnVtTWFwKEVudW1NYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVudW1NYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkVudW1NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJib3hpbmciIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfRW51bU1hcCgpIHsKICAgICAgICAgRW51bU1hcCBlbnVtTWFwOwpAQCAtMTc2LDYgKzIwMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bU1hcCNFbnVtTWFwKE1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRW51bU1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX01hcCgpIHsKICAgICAgICAgRW51bU1hcCBlbnVtTWFwOwpAQCAtMjM0LDYgKzI2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bU1hcCNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgImJveGluZyIgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICBFbnVtTWFwIGVudW1TaXplTWFwID0gbmV3IEVudW1NYXAoU2l6ZS5jbGFzcyk7CkBAIC0yNDUsNiArMjg3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtTWFwI2NvbnRhaW5zS2V5KE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIHsgInVuY2hlY2tlZCIsICJib3hpbmciIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc0tleUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBFbnVtTWFwIGVudW1TaXplTWFwID0gbmV3IEVudW1NYXAoU2l6ZS5jbGFzcyk7CkBAIC0yNjksNiArMzIwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtTWFwI2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyggeyAidW5jaGVja2VkIiwgImJveGluZyIgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICBFbnVtTWFwIGVudW1TaXplTWFwID0gbmV3IEVudW1NYXAoU2l6ZS5jbGFzcyk7CkBAIC0yOTEsNiArMzUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtTWFwI2NvbnRhaW5zVmFsdWUoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWluc1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNWYWx1ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBFbnVtTWFwIGVudW1TaXplTWFwID0gbmV3IEVudW1NYXAoU2l6ZS5jbGFzcyk7CkBAIC0zMjAsNiArMzg5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtTWFwI2VudHJ5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cnlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cnlTZXQoKSB7CiAgICAgICAgIEVudW1NYXAgZW51bVNpemVNYXAgPSBuZXcgRW51bU1hcChTaXplLmNsYXNzKTsKQEAgLTU1MCw2ICs2MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1NYXAjZXF1YWxzKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIEVudW1NYXAgZW51bU1hcCA9IG5ldyBFbnVtTWFwKFNpemUuY2xhc3MpOwpAQCAtNTkwLDYgKzY3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bU1hcCNrZXlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyggeyAidW5jaGVja2VkIiwgImJveGluZyIgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2tleVNldCgpIHsKICAgICAgICAgRW51bU1hcCBlbnVtU2l6ZU1hcCA9IG5ldyBFbnVtTWFwKFNpemUuY2xhc3MpOwpAQCAtNzQ3LDYgKzg0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bU1hcCNnZXQoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgImJveGluZyIgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBFbnVtTWFwIGVudW1TaXplTWFwID0gbmV3IEVudW1NYXAoU2l6ZS5jbGFzcyk7CkBAIC03OTEsNiArODk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtTWFwI3B1dChPYmplY3QsT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgamF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIHsgInVuY2hlY2tlZCIsICJib3hpbmciIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBFbnVtTWFwIGVudW1TaXplTWFwID0gbmV3IEVudW1NYXAoU2l6ZS5jbGFzcyk7CkBAIC04MzYsNiArOTUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtTWFwI3B1dEFsbChNYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIEVudW1NYXAgZW51bUNvbG9yTWFwID0gbmV3IEVudW1NYXA8Q29sb3IsIERvdWJsZT4oQ29sb3IuY2xhc3MpOwpAQCAtOTAzLDYgKzEwMjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1NYXAjcmVtb3ZlKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJib3hpbmciIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgRW51bU1hcCBlbnVtU2l6ZU1hcCA9IG5ldyBFbnVtTWFwKFNpemUuY2xhc3MpOwpAQCAtOTQ0LDYgKzEwNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1NYXAjc2l6ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgRW51bU1hcCBlbnVtU2l6ZU1hcCA9IG5ldyBFbnVtTWFwKFNpemUuY2xhc3MpOwpAQCAtOTgyLDYgKzExMjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1NYXAjdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIHsgInVuY2hlY2tlZCIsICJib3hpbmciIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZXMoKSB7CiAgICAgICAgIEVudW1NYXAgZW51bUNvbG9yTWFwID0gbmV3IEVudW1NYXA8Q29sb3IsIERvdWJsZT4oQ29sb3IuY2xhc3MpOwpAQCAtMTEzOCw2ICsxMjg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgImJveGluZyIgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRW51bU1hcCBlbnVtQ29sb3JNYXAgPSBuZXcgRW51bU1hcDxDb2xvciwgRG91YmxlPihDb2xvci5jbGFzcyk7CkBAIC0xMTQ4LDYgKzEzMDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgImJveGluZyIgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRW51bU1hcCBlbnVtQ29sb3JNYXAgPSBuZXcgRW51bU1hcDxDb2xvciwgRG91YmxlPihDb2xvci5jbGFzcyk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FbnVtU2V0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRW51bVNldFRlc3QuamF2YQppbmRleCA0NzljOGE0Li5iYzQ5MzQ4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FbnVtU2V0VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0VudW1TZXRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwpAQCAtMjcsNiArMzIsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhFbnVtU2V0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBFbnVtU2V0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBzdGF0aWMgZW51bSBFbnVtV2l0aElubmVyQ2xhc3MgewpAQCAtNTgsNiArNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjbm9uZU9mKGphdmEubGFuZy5DbGFzcykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibm9uZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9Ob25lT2ZfTENsYXNzKCkgewogICAgICAgICB0cnkgewpAQCAtMTA1LDYgKzEyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNhbGxPZihqYXZhLmxhbmcuQ2xhc3MpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFsbE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9BbGxPZl9MQ2xhc3MoKSB7CiAgICAgICAgIHRyeSB7CkBAIC0xNTgsNiArMTgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I2FkZChFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZF9FKCkgewogICAgICAgICBTZXQ8RW51bUZvbz4gc2V0ID0gRW51bVNldC5ub25lT2YoRW51bUZvby5jbGFzcyk7CkBAIC0yNjIsNiArMjk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I2FkZEFsbChDb2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Q29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIHsgInVuY2hlY2tlZCIsICJib3hpbmciIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRBbGxfTENvbGxlY3Rpb24oKSB7CiAKQEAgLTQyMCw2ICs0NjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjcmVtb3ZlKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlX0xPamVjdCgpIHsKICAgICAgICAgU2V0PEVudW1Gb28+IHNldCA9IEVudW1TZXQubm9uZU9mKEVudW1Gb28uY2xhc3MpOwogICAgICAgICBFbnVtW10gZWxlbWVudHMgPSBFbnVtRm9vLmNsYXNzLmdldEVudW1Db25zdGFudHMoKTsKQEAgLTQ2NCw2ICs1MTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjZXF1YWxzKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNfTE9iamVjdCgpIHsKICAgICAgICAgU2V0PEVudW1Gb28+IHNldCA9IEVudW1TZXQubm9uZU9mKEVudW1Gb28uY2xhc3MpOwogICAgICAgICBFbnVtW10gZWxlbWVudHMgPSBFbnVtRm9vLmNsYXNzLmdldEVudW1Db25zdGFudHMoKTsKQEAgLTUyMyw2ICs1ODMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjY2xlYXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xlYXIoKSB7CiAgICAgICAgIFNldDxFbnVtRm9vPiBzZXQgPSBFbnVtU2V0Lm5vbmVPZihFbnVtRm9vLmNsYXNzKTsKICAgICAgICAgc2V0LmFkZChFbnVtRm9vLmEpOwpAQCAtNTQ5LDYgKzYxOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgU2V0PEVudW1Gb28+IHNldCA9IEVudW1TZXQubm9uZU9mKEVudW1Gb28uY2xhc3MpOwogICAgICAgICBzZXQuYWRkKEVudW1Gb28uYSk7CkBAIC01NjUsNiArNjQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I2NvbXBsZW1lbnRPZihqYXZhLnV0aWwuRW51bVNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGxlbWVudE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5FbnVtU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbXBsZW1lbnRPZl9MRW51bVNldCgpIHsKIAogICAgICAgICB0cnkgewpAQCAtNjE1LDYgKzcwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNjb250YWlucyhPYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLCBhbmQgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zX0xPYmplY3QoKSB7CiAgICAgICAgIFNldDxFbnVtRm9vPiBzZXQgPSBFbnVtU2V0Lm5vbmVPZihFbnVtRm9vLmNsYXNzKTsKICAgICAgICAgRW51bVtdIGVsZW1lbnRzID0gRW51bUZvby5jbGFzcy5nZXRFbnVtQ29uc3RhbnRzKCk7CkBAIC02ODYsNiArNzgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I2NvbnRhaW5zQWxsKENvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7ICJ1bmNoZWNrZWQiLCAiYm94aW5nIiB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNBbGxfTENvbGxlY3Rpb24oKSB7CiAgICAgICAgIEVudW1TZXQ8RW51bUZvbz4gc2V0ID0gRW51bVNldC5ub25lT2YoRW51bUZvby5jbGFzcyk7CkBAIC04MzcsNiArOTQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I2NvcHlPZihqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29weU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvcHlPZl9MQ29sbGVjdGlvbigpIHsKICAgICAgICAgdHJ5IHsKQEAgLTkyNCw2ICsxMDM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I2NvcHlPZihqYXZhLnV0aWwuRW51bVNldCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29weU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5FbnVtU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvcHlPZl9MRW51bVNldCgpIHsKICAgICAgICAgRW51bVNldDxFbnVtV2l0aElubmVyQ2xhc3M+IGVudW1TZXQgPSBFbnVtU2V0CkBAIC05NzEsNiArMTA5NCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNyZW1vdmVBbGwoQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgIiArICAKKyAgICAgICAgICAgICJDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsX0xDb2xsZWN0aW9uKCkgewogICAgICAgICBTZXQ8RW51bUZvbz4gc2V0ID0gRW51bVNldC5ub25lT2YoRW51bUZvby5jbGFzcyk7CkBAIC0xMTQ1LDYgKzEyNzgsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjcmV0YWluQWxsKENvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24sICIgKyAgCisgICAgICAgICAgICJDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmV0YWluQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmV0YWluQWxsX0xDb2xsZWN0aW9uKCkgewogICAgICAgICBTZXQ8RW51bUZvbz4gc2V0ID0gRW51bVNldC5hbGxPZihFbnVtRm9vLmNsYXNzKTsKQEAgLTEzMzQsNiArMTQ3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNpdGVyYXRvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIml0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pdGVyYXRvcigpIHsKICAgICAgICAgU2V0PEVudW1Gb28+IHNldCA9IEVudW1TZXQubm9uZU9mKEVudW1Gb28uY2xhc3MpOwogICAgICAgICBzZXQuYWRkKEVudW1Gb28uYSk7CkBAIC0xNTUxLDYgKzE3MDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjb2YoRSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkVudW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfT2ZfRSgpIHsKICAgICAgICAgRW51bVNldDxFbnVtV2l0aElubmVyQ2xhc3M+IGVudW1TZXQgPSBFbnVtU2V0Lm9mKEVudW1XaXRoSW5uZXJDbGFzcy5hKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbnVtU2V0IHNob3VsZCBoYXZlIGxlbmd0aCAxOiIsIDEsIGVudW1TZXQuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJApAQCAtMTU3NSw2ICsxNzM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I29mKEUsIEUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5FbnVtLmNsYXNzLCBqYXZhLmxhbmcuRW51bS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9PZl9FRSgpIHsKICAgICAgICAgRW51bVNldDxFbnVtV2l0aElubmVyQ2xhc3M+IGVudW1TZXQgPSBFbnVtU2V0Lm9mKEVudW1XaXRoSW5uZXJDbGFzcy5hLAogICAgICAgICAgICAgICAgIEVudW1XaXRoSW5uZXJDbGFzcy5iKTsKQEAgLTE2NDYsNiArMTgxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNvZihFLCBFLCBFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuRW51bS5jbGFzcywgamF2YS5sYW5nLkVudW0uY2xhc3MsIGphdmEubGFuZy5FbnVtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X09mX0VFRSgpIHsKICAgICAgICAgRW51bVNldDxFbnVtV2l0aElubmVyQ2xhc3M+IGVudW1TZXQgPSBFbnVtU2V0Lm9mKEVudW1XaXRoSW5uZXJDbGFzcy5hLAogICAgICAgICAgICAgICAgIEVudW1XaXRoSW5uZXJDbGFzcy5iLCBFbnVtV2l0aElubmVyQ2xhc3MuYyk7CkBAIC0xNjg5LDYgKzE4NjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjb2YoRSwgRSwgRSwgRSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkVudW0uY2xhc3MsIGphdmEubGFuZy5FbnVtLmNsYXNzLCBqYXZhLmxhbmcuRW51bS5jbGFzcywgamF2YS5sYW5nLkVudW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfT2ZfRUVFRSgpIHsKICAgICAgICAgRW51bVNldDxFbnVtV2l0aElubmVyQ2xhc3M+IGVudW1TZXQgPSBFbnVtU2V0Lm9mKEVudW1XaXRoSW5uZXJDbGFzcy5hLAogICAgICAgICAgICAgICAgIEVudW1XaXRoSW5uZXJDbGFzcy5iLCBFbnVtV2l0aElubmVyQ2xhc3MuYywKQEAgLTE3MjcsNiArMTkxNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNvZihFLCBFLCBFLCBFLCBFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuRW51bS5jbGFzcywgamF2YS5sYW5nLkVudW0uY2xhc3MsIGphdmEubGFuZy5FbnVtLmNsYXNzLCBqYXZhLmxhbmcuRW51bS5jbGFzcywgamF2YS5sYW5nLkVudW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfT2ZfRUVFRUUoKSB7CiAgICAgICAgIEVudW1TZXQ8RW51bVdpdGhJbm5lckNsYXNzPiBlbnVtU2V0ID0gRW51bVNldC5vZihFbnVtV2l0aElubmVyQ2xhc3MuYSwKICAgICAgICAgICAgICAgICBFbnVtV2l0aElubmVyQ2xhc3MuYiwgRW51bVdpdGhJbm5lckNsYXNzLmMsCkBAIC0xNzYzLDYgKzE5NjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkVudW1TZXQjb2YoRSwgRS4uLikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkVudW0uY2xhc3MsIGphdmEubGFuZy5FbnVtW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfT2ZfRUVBcnJheSgpIHsKICAgICAgICAgRW51bVdpdGhJbm5lckNsYXNzW10gZW51bUFycmF5ID0gbmV3IEVudW1XaXRoSW5uZXJDbGFzc1tdIHsKICAgICAgICAgICAgICAgICBFbnVtV2l0aElubmVyQ2xhc3MuYiwgRW51bVdpdGhJbm5lckNsYXNzLmMgfTsKQEAgLTE4MTUsNiArMjAyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNyYW5nZShFLCBFKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyYW5nZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuRW51bS5jbGFzcywgamF2YS5sYW5nLkVudW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfUmFuZ2VfRUUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBFbnVtU2V0LnJhbmdlKEVudW1XaXRoSW5uZXJDbGFzcy5jLCBudWxsKTsKQEAgLTE5MDEsNiArMjExNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRW51bVNldCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9DbG9uZSgpIHsKICAgICAgICAgRW51bVNldDxFbnVtRm9vPiBlbnVtU2V0ID0gRW51bVNldC5hbGxPZihFbnVtRm9vLmNsYXNzKTsKICAgICAgICAgRW51bVNldDxFbnVtRm9vPiBjbG9uZWRFbnVtU2V0ID0gZW51bVNldC5jbG9uZSgpOwpAQCAtMTkyOSw2ICsyMTUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FbnVtU2V0I1NlcmlhbGl6YXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBFbnVtU2V0PEVudW1Gb28+IHNldCA9IEVudW1TZXQuYWxsT2YoRW51bUZvby5jbGFzcyk7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYoc2V0KTsKQEAgLTE5MzcsNiArMjE3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncyggeyAidW5jaGVja2VkIiwgImJveGluZyIgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRW51bVNldDxFbnVtRm9vPiBzZXQgPSBFbnVtU2V0LmFsbE9mKEVudW1Gb28uY2xhc3MpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRXZlbnRPYmplY3RUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FdmVudE9iamVjdFRlc3QuamF2YQppbmRleCA4M2M5YWM1Li5kNzMyZGVjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FdmVudE9iamVjdFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9FdmVudE9iamVjdFRlc3QuamF2YQpAQCAtMTcsOCArMTcsMTQgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhFdmVudE9iamVjdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRXZlbnRPYmplY3RUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIE9iamVjdCBteU9iamVjdDsKQEAgLTI4LDYgKzM0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FdmVudE9iamVjdCNFdmVudE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QuIFNldFVwIG1ldGhvZCBkb2Vzbid0IHZlcmlmeSAiICsKKyAgICAgICAgICAgICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRXZlbnRPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkV2ZW50T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwpAQCAtMzYsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkV2ZW50T2JqZWN0I2dldFNvdXJjZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNvdXJjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U291cmNlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuRXZlbnRPYmplY3QuZ2V0U291cmNlKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3Jvbmcgc291cmNlIHJldHVybmVkIiwKQEAgLTQ1LDYgKzcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5FdmVudE9iamVjdCN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS51dGlsLkV2ZW50T2JqZWN0LnRvU3RyaW5nKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHRvU3RyaW5nIHJldHVybmVkOiAiICsgbXlFdmVudE9iamVjdC50b1N0cmluZygpLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRm9ybWF0dGFibGVGbGFnc1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Zvcm1hdHRhYmxlRmxhZ3NUZXN0LmphdmEKaW5kZXggZTVkODUxNC4uNDBkZDU2MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRm9ybWF0dGFibGVGbGFnc1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Gb3JtYXR0YWJsZUZsYWdzVGVzdC5qYXZhCkBAIC0xNSwxNCArMTUsMjkgQEAKICAqLwogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0YWJsZUZsYWdzOwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhGb3JtYXR0YWJsZUZsYWdzLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBGb3JtYXR0YWJsZUZsYWdzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEudXRpbC5Gb3JtYXR0YWJsZUZsYWdzIENvbnN0YW50RmllbGRWYWx1ZXMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZpZWxkcy4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdGFudEZpZWxkVmFsdWVzKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgRm9ybWF0dGFibGVGbGFncy5MRUZUX0pVU1RJRlkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRm9ybWF0dGFibGVGbGFncy5VUFBFUkNBU0UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRm9ybWF0dGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvRm9ybWF0dGVyVGVzdC5qYXZhCmluZGV4IDQ2NGQ0ZDMuLjNmMThmNGMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0Zvcm1hdHRlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Gb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTE1LDYgKzE1LDExIEBACiAgKi8KIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTU0LDYgKzU5LDcgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhGb3JtYXR0ZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIEZvcm1hdHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBjbGFzcyBNb2NrQXBwZW5kYWJsZSBpbXBsZW1lbnRzIEFwcGVuZGFibGUgewpAQCAtMTYzLDYgKzE2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI0Zvcm1hdHRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcigpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGYpOwpAQCAtMTc0LDYgKzE4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI0Zvcm1hdHRlcihBcHBlbmRhYmxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkFwcGVuZGFibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX0FwcGVuZGFibGUoKSB7CiAgICAgICAgIE1vY2tBcHBlbmRhYmxlIG1hID0gbmV3IE1vY2tBcHBlbmRhYmxlKCk7CiAgICAgICAgIEZvcm1hdHRlciBmMSA9IG5ldyBGb3JtYXR0ZXIobWEpOwpAQCAtMTk2LDYgKzIyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI0Zvcm1hdHRlcihMb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmMSA9IG5ldyBGb3JtYXR0ZXIoTG9jYWxlLkZSQU5DRSk7CiAgICAgICAgIGFzc2VydFRydWUoZjEub3V0KCkgaW5zdGFuY2VvZiBTdHJpbmdCdWlsZGVyKTsKQEAgLTIxMSw2ICsyNDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNGb3JtYXR0ZXIoQXBwZW5kYWJsZSwgTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkFwcGVuZGFibGUuY2xhc3MsIGphdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX0FwcGVuZGFibGVMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgTW9ja0FwcGVuZGFibGUgbWEgPSBuZXcgTW9ja0FwcGVuZGFibGUoKTsKICAgICAgICAgRm9ybWF0dGVyIGYxID0gbmV3IEZvcm1hdHRlcihtYSwgTG9jYWxlLkNBTkFEQSk7CkBAIC0yMjksNiArMjcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjRm9ybWF0dGVyKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRm9ybWF0dGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTI2OSw2ICszMjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNGb3JtYXR0ZXIoU3RyaW5nLCBTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CkBAIC0zMjQsNiArMzg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjRm9ybWF0dGVyKFN0cmluZywgU3RyaW5nLCBMb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3V0aWxfTG9jYWxlKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKQEAgLTM4OCw2ICs0NTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNGb3JtYXR0ZXIoRmlsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRm9ybWF0dGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC00MjgsNiArNTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjRm9ybWF0dGVyKEZpbGUsIFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRm9ybWF0dGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0ZpbGVMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CkBAIC00OTUsNiArNTgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjRm9ybWF0dGVyKEZpbGUsIFN0cmluZywgTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fRmlsZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfdXRpbF9Mb2NhbGUoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwpAQCAtNTU4LDYgKzY1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI0Zvcm1hdHRlcihQcmludFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRm9ybWF0dGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uUHJpbnRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19QcmludFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTU3Niw2ICs2ODEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNGb3JtYXR0ZXIoT3V0cHV0U3RyZWFtKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC01OTQsNiArNzA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjRm9ybWF0dGVyKE91dHB1dFN0cmVhbSwgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGb3JtYXR0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19PdXRwdXRTdHJlYW1MamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CkBAIC02MzYsNiArNzU5LDE2IEBACiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLnV0aWwuRm9ybWF0dGVyLkZvcm1hdHRlcihPdXRwdXRTdHJlYW0sIFN0cmluZywKICAgICAgKiBMb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdHRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fT3V0cHV0U3RyZWFtTGphdmFfbGFuZ19TdHJpbmdMamF2YV91dGlsX0xvY2FsZSgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CkBAIC02NzksNiArODEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjbG9jYWxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBub3QgbnVsbCB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2NhbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2FsZSgpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogICAgICAgICBmID0gbmV3IEZvcm1hdHRlcigoTG9jYWxlKSBudWxsKTsKQEAgLTY5Niw2ICs4MzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNvdXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X291dCgpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogICAgICAgICBmID0gbmV3IEZvcm1hdHRlcigpOwpAQCAtNzE0LDYgKzg2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2ZsdXNoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogICAgICAgICBmID0gbmV3IEZvcm1hdHRlcihub3RFeGlzdCk7CkBAIC03MzUsNiArODk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjY2xvc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIobm90RXhpc3QpOwogICAgICAgICBhc3NlcnRUcnVlKGYgaW5zdGFuY2VvZiBDbG9zZWFibGUpOwpAQCAtNzQ3LDYgKzkxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChmLnRvU3RyaW5nKCkpOwpAQCAtNzYzLDYgKzk0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2lvRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW9FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lvRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogICAgICAgICBmID0gbmV3IEZvcm1hdHRlcihuZXcgTW9ja0Rlc3RpbmF0aW9uKCkpOwpAQCAtNzgyLDYgKzk2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIG51bGwgcGFyYW1ldGVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X251bGwoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcigpOwogICAgICAgICB0cnkgewpAQCAtNzk5LDYgKzk5NSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIGFyZ3VtZW50IGluZGV4CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfQXJnSW5kZXgoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKExvY2FsZS5VUyk7CiAgICAgICAgIGZvcm1hdHRlci5mb3JtYXQoIiUxJHMlMiRzJTMkcyU0JHMlNSRzJTYkcyU3JHMlOCRzJTkkcyUxMSRzJTEwJHMiLCAiMSIsCkBAIC04OTYsNiArMTEwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIHdpZHRoCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9XaWR0aCgpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKExvY2FsZS5VUyk7CiAgICAgICAgIGYuZm9ybWF0KCIlMSQ4cyIsICIxIik7CkBAIC05MTgsNiArMTEzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIHByZWNpc2lvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfUHJlY2lzaW9uKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoTG9jYWxlLlVTKTsKICAgICAgICAgZi5mb3JtYXQoIiUuNXMiLCAiMTIzNDU2Iik7CkBAIC05NzYsNiArMTIwMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIGxpbmUgc3BlcmF0b3IKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9MaW5lU2VwYXJhdG9yKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CiAKQEAgLTEwNzgsNiArMTMxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIHBlcmNlbnQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfUGVyY2VudCgpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogCkBAIC0xMTUzLDYgKzEzOTUsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBmbGFnCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5rbm93bkZvcm1hdENvbnZlcnNpb25FeGNlcHRpb24sICIgKworICAgICAgICAgICAgIkR1cGxpY2F0ZUZvcm1hdEZsYWdzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfRmxhZygpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKExvY2FsZS5VUyk7CiAgICAgICAgIHRyeSB7CkBAIC0xMTg2LDYgKzE0MzgsMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBnZW5lcmFsCiAgICAgICogICAgICAgIGNvbnZlcnNpb24gYi9CCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0X0xTdHJpbmckTE9iamVjdF9HZW5lcmFsQ29udmVyc2lvbkIoKSB7CiAgICAgICAgIGZpbmFsIE9iamVjdFtdW10gdHJpcGxlID0geyAKICAgICAgICAgICAgICAgICB7IEJvb2xlYW4uRkFMU0UsICAgICAgICAgICAgICAgICIlMy4yYiIsICAiIGZhIiwgfSwKQEAgLTEyNDksNiArMTUxMSwxNiBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIGdlbmVyYWwKICAgICAgKiAgICAgICAgY29udmVyc2lvbiB0eXBlICdzJyBhbmQgJ1MnCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0X0xTdHJpbmckTE9iamVjdF9HZW5lcmFsQ29udmVyc2lvblMoKSB7CiAKICAgICAgICAgZmluYWwgT2JqZWN0W11bXSB0cmlwbGUgPSB7IApAQCAtMTMxMyw2ICsxNTg1LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgZ2VuZXJhbAogICAgICAqICAgICAgICBjb252ZXJzaW9uIHR5cGUgJ2gnIGFuZCAnSCcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICJGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRfTFN0cmluZyRMT2JqZWN0X0dlbmVyYWxDb252ZXJzaW9uSCgpIHsKIAogICAgICAgICBmaW5hbCBPYmplY3RbXSBpbnB1dCA9IHsgCkBAIC0xMzQ4LDYgKzE2MzAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBnZW5lcmFsCiAgICAgICogICAgICAgIGNvbnZlcnNpb24gb3RoZXIgY2FzZXMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBGb3JtYXRGbGFnc0NvbnZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0dlbmVyYWxDb252ZXJzaW9uT3RoZXIoKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEluIFR1cmtpc2ggbG9jYWxlLCB0aGUgdXBwZXIgY2FzZSBvZiAnXHUwMDY5JyBpcyAnXHUwMTMwJy4gVGhlCkBAIC0xMzk5LDYgKzE2OTAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBnZW5lcmFsCiAgICAgICogICAgICAgIGNvbnZlcnNpb24gZXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0dlbmVyYWxDb252ZXJzaW9uRXhjZXB0aW9uKCkgewogICAgICAgICBmaW5hbCBTdHJpbmdbXSBmbGFnTWlzbWF0Y2ggPSB7ICIlI2IiLCAiJStiIiwgIiUgYiIsICIlMGIiLCAiJSxiIiwKICAgICAgICAgICAgICAgICAiJShiIiwgIiUjQiIsICIlK0IiLCAiJSBCIiwgIiUwQiIsICIlLEIiLCAiJShCIiwgIiUjaCIsICIlK2giLApAQCAtMTQ1OCw2ICsxNzU4LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgQ2hhcmFjdGVyCiAgICAgICogICAgICAgIGNvbnZlcnNpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24sIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9DaGFyYWN0ZXJDb252ZXJzaW9uKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoTG9jYWxlLlVTKTsKICAgICAgICAgZmluYWwgT2JqZWN0W10gaWxsQXJncyA9IHsgQm9vbGVhbi5UUlVFLCBuZXcgRmxvYXQoMS4xZiksCkBAIC0xNTM3LDYgKzE4NDcsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBsZWdhbAogICAgICAqICAgICAgICBCeXRlL1Nob3J0L0ludGVnZXIvTG9uZyBjb252ZXJzaW9uIHR5cGUgJ2QnCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0J5dGVTaG9ydEludGVnZXJMb25nQ29udmVyc2lvbkQoKSB7CiAgICAgICAgIGZpbmFsIE9iamVjdFtdW10gdHJpcGxlID0geyAKICAgICAgICAgICAgICAgICB7IDAsICAgICAgICAgICAgICAgICIlZCIsICAgICAgICAgICAgICAgICAgIjAiIH0sIApAQCAtMTYzNSw2ICsxOTU0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgbGVnYWwKICAgICAgKiAgICAgICAgQnl0ZS9TaG9ydC9JbnRlZ2VyL0xvbmcgY29udmVyc2lvbiB0eXBlICdvJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9CeXRlU2hvcnRJbnRlZ2VyTG9uZ0NvbnZlcnNpb25PKCkgewogICAgICAgICBmaW5hbCBPYmplY3RbXVtdIHRyaXBsZSA9IHsgCiAgICAgICAgICAgICAgICAgeyAwLCAgICAgICAgICAgICAgICAiJW8iLCAgICAgICAgICAgICAgICAgIjAiIH0sIApAQCAtMTcwNSw2ICsyMDMzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgbGVnYWwKICAgICAgKiAgICAgICAgQnl0ZS9TaG9ydC9JbnRlZ2VyL0xvbmcgY29udmVyc2lvbiB0eXBlICd4JyBhbmQgJ1gnCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0J5dGVTaG9ydEludGVnZXJMb25nQ29udmVyc2lvblgoKSB7CiAgICAgICAgIGZpbmFsIE9iamVjdFtdW10gdHJpcGxlID0geyAKICAgICAgICAgICAgICAgICB7IDAsICAgICAgICAgICAgICAgICIleCIsICAgICAgICAgICAgICAgICAiMCIgfSwgCkBAIC0xNzgyLDcgKzIxMTksMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBEYXRlL1RpbWUKICAgICAgKiAgICAgICAgY29udmVyc2lvbgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfRGF0ZVRpbWVDb252ZXJzaW9uKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0RhdGVUaW1lQ29udmVyc2lvbigpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogICAgICAgICBEYXRlIG5vdyA9IG5ldyBEYXRlKDExNDczMjcxNDc1NzhMKTsKIApAQCAtMjQ4Nyw2ICsyODMzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgbnVsbCBhcmdtZW50IGZvcgogICAgICAqICAgICAgICBCeXRlL1Nob3J0L0ludGVnZXIvTG9uZy9CaWdJbnRlZ2VyIGNvbnZlcnNpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfQnl0ZVNob3J0SW50ZWdlckxvbmdOdWxsQ29udmVyc2lvbigpIHsKIAogICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoTG9jYWxlLkZSQU5DRSk7CkBAIC0yNTE0LDYgKzI4NjksMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBsZWdhbAogICAgICAqICAgICAgICBCaWdJbnRlZ2VyIGNvbnZlcnNpb24gdHlwZSAnZCcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICJGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMQmlnSW50ZWdlcigpIHsKICAgICAgICAgZmluYWwgT2JqZWN0W11bXSB0cmlwbGVEID0gewogICAgICAgICAgICAgICAgIHtuZXcgQmlnSW50ZWdlcigiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiksICAgICAgICAgICIlZCIsICAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAifSwgLy8kTk9OLU5MUy0yJApAQCAtMjYxMCw2ICsyOTc1LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgcGFkZGluZyBvZgogICAgICAqICAgICAgICBCaWdJbnRlZ2VyIGNvbnZlcnNpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBib3VuZGFyeSBjb25kaXRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfQmlnSW50ZWdlclBhZGRpbmdDb252ZXJzaW9uKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CiAKQEAgLTI2NDgsNiArMzAyMiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIEJpZ0ludGVnZXIKICAgICAgKiAgICAgICAgY29udmVyc2lvbiBleGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfQmlnSW50ZWdlckNvbnZlcnNpb25FeGNlcHRpb24oKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKIApAQCAtMjcyOCw2ICszMTExLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgQmlnSW50ZWdlcgogICAgICAqICAgICAgICBleGNlcHRpb24gdGhyb3dpbmcgb3JkZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfQmlnSW50ZWdlckV4Y2VwdGlvbk9yZGVyKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CiAgICAgICAgIEJpZ0ludGVnZXIgYmlnID0gbmV3IEJpZ0ludGVnZXIoIjEwMCIpOwpAQCAtMjc5MCw3ICszMTgyLDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgRmxvYXQvRG91YmxlCiAgICAgICogICAgICAgIGNvbnZlcnNpb24gdHlwZSAnZScgYW5kICdFJwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfRmxvYXRDb252ZXJzaW9uRSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0Zsb2F0Q29udmVyc2lvbkUoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKICAgICAgICAgZmluYWwgT2JqZWN0W11bXSB0cmlwbGVFID0gewogICAgICAgICAgICAgICAgIHswZiwgIiVlIiwgICAgICAgICAgIjAuMDAwMDAwZSswMCJ9LApAQCAtMzAxNyw3ICszNDE4LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgRmxvYXQvRG91YmxlCiAgICAgICogICAgICAgIGNvbnZlcnNpb24gdHlwZSAnZycgYW5kICdHJwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfRmxvYXRDb252ZXJzaW9uRygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0Zsb2F0Q29udmVyc2lvbkcoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKICAgICAgICAgZmluYWwgT2JqZWN0W11bXSB0cmlwbGVHID0gewogICAgICAgICAgICAgICAgIHsxMDAxZiwgIiVnIiwgICAgICAgICAgICIxMDAxLjAwIn0sCkBAIC0zMjE3LDYgKzM2MjcsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBGbG9hdC9Eb3VibGUKICAgICAgKiAgICAgICAgY29udmVyc2lvbiB0eXBlICdnJyBhbmQgJ0cnIG92ZXJmbG93CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0Zsb2F0Q29udmVyc2lvbkdfT3ZlcmZsb3coKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcigpOwogICAgICAgICBmLmZvcm1hdCgiJWciLCA5OTk5OTkuNSk7CkBAIC0zMjU1LDcgKzM2NzQsMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBGbG9hdC9Eb3VibGUKICAgICAgKiAgICAgICAgY29udmVyc2lvbiB0eXBlICdmJwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfRmxvYXRDb252ZXJzaW9uRigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0Zsb2F0Q29udmVyc2lvbkYoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKIAogICAgICAgICBmaW5hbCBPYmplY3RbXVtdIHRyaXBsZUYgPSB7CkBAIC0zNDkyLDYgKzM5MjAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBGbG9hdC9Eb3VibGUKICAgICAgKiAgICAgICAgY29udmVyc2lvbiB0eXBlICdhJyBhbmQgJ0EnCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0Zsb2F0Q29udmVyc2lvbkEoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKICAgICAgICAgZmluYWwgT2JqZWN0W11bXSB0cmlwbGVBID0gewpAQCAtMzY3Myw3ICs0MTEwLDE3IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgQmlnRGVjaW1hbAogICAgICAqICAgICAgICBjb252ZXJzaW9uIHR5cGUgJ2UnIGFuZCAnRScKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0JpZ0RlY2ltYWxDb252ZXJzaW9uRSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICJGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfQmlnRGVjaW1hbENvbnZlcnNpb25FKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CiAgICAgICAgIGZpbmFsIE9iamVjdFtdW10gdHJpcGxlRSA9IHsKICAgICAgICAgICAgICAgICB7QmlnRGVjaW1hbC5aRVJPLCAiJWUiLCAgICAgICAgICIwLjAwMDAwMGUrMDAifSwKQEAgLTM3NDEsNyArNDE4OCwxNyBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIEJpZ0RlY2ltYWwKICAgICAgKiAgICAgICAgY29udmVyc2lvbiB0eXBlICdnJyBhbmQgJ0cnCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9CaWdEZWNpbWFsQ29udmVyc2lvbkcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Zvcm1hdExqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfT2JqZWN0X0JpZ0RlY2ltYWxDb252ZXJzaW9uRygpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogICAgICAgICBmaW5hbCBPYmplY3RbXVtdIHRyaXBsZUcgPSB7CiAgICAgICAgICAgICAgICAge0JpZ0RlY2ltYWwuWkVSTywgIiVnIiwgICAgICAgICAiMC4wMDAwMCJ9LApAQCAtMzgzMiw2ICs0Mjg5LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKSBmb3IgQmlnRGVjaW1hbAogICAgICAqICAgICAgICBjb252ZXJzaW9uIHR5cGUgJ2YnCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19TdHJpbmckTGphdmFfbGFuZ19PYmplY3RfQmlnRGVjaW1hbENvbnZlcnNpb25GKCkgewogCiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKQEAgLTM5MDAsNiArNDM2NywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIGV4Y2VwdGlvbnMgaW4KICAgICAgKiAgICAgICAgRmxvYXQvRG91YmxlL0JpZ0RlY2ltYWwgY29udmVyc2lvbiB0eXBlICdlJywgJ0UnLCAnZycsICdHJywgJ2YnLCAnYScsICdBJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9GbG9hdERvdWJsZUJpZ0RlY2ltYWxDb252ZXJzaW9uRXhjZXB0aW9uKCkgewogICAgICAgICBGb3JtYXR0ZXIgZiA9IG51bGw7CiAKQEAgLTQwMTAsNiArNDQ4NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yCiAgICAgICogICAgICAgIEZsb2F0L0RvdWJsZS9CaWdEZWNpbWFsIGV4Y2VwdGlvbiB0aHJvd2luZyBvcmRlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9GbG9hdERvdWJsZUJpZ0RlY2ltYWxFeGNlcHRpb25PcmRlcigpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogCkBAIC00MDY1LDYgKzQ1NTAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pIGZvciBCaWdEZWNpbWFsCiAgICAgICogICAgICAgIGV4Y2VwdGlvbiB0aHJvd2luZyBvcmRlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9CaWdEZWNpbWFsRXhjZXB0aW9uT3JkZXIoKSB7CiAgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKICAgICAgICAgQmlnRGVjaW1hbCBiZCA9IG5ldyBCaWdEZWNpbWFsKCIxLjAiKTsKQEAgLTQxMjEsNiArNDYxNSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikgZm9yIG51bGwgYXJnbWVudCBmb3IKICAgICAgKiAgICAgICAgRmxvYXQvRG91YmxlL0JpZ0RlY2ltYWwgY29udmVyc2lvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZyRMamF2YV9sYW5nX09iamVjdF9GbG9hdERvdWJsZUJpZ0RlY2ltYWxOdWxsQ29udmVyc2lvbigpIHsKICAgICAgICAgRm9ybWF0dGVyIGYgPSBudWxsOwogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9HcmVnb3JpYW5DYWxlbmRhclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0dyZWdvcmlhbkNhbGVuZGFyVGVzdC5qYXZhCmluZGV4IDg0NjA3NDcuLjc2YTRlYWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0dyZWdvcmlhbkNhbGVuZGFyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0dyZWdvcmlhbkNhbGVuZGFyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CkBAIC0yNiwxMSArMzEsMjIgQEAKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAorCitAVGVzdFRhcmdldENsYXNzKEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBHcmVnb3JpYW5DYWxlbmRhclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNHcmVnb3JpYW5DYWxlbmRhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkdyZWdvcmlhbkNhbGVuZGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcigpCiAgICAgICAgIGFzc2VydFRydWUoIkNvbnN0cnVjdGVkIGluY29ycmVjdCBjYWxlbmRhciIsIChuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKQpAQCAtNDAsNiArNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI0dyZWdvcmlhbkNhbGVuZGFyKGludCwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkdyZWdvcmlhbkNhbGVuZGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIoaW50LCBpbnQsIGludCkKICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk3MiwgQ2FsZW5kYXIuT0NUT0JFUiwgMTMpOwpAQCAtNTcsNiArODIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI0dyZWdvcmlhbkNhbGVuZGFyKGludCwgaW50LCBpbnQsIGludCwKICAgICAgKiAgICAgICAgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHcmVnb3JpYW5DYWxlbmRhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKGludCwgaW50LCBpbnQsIGludCwgaW50KQogICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTcyLCBDYWxlbmRhci5PQ1RPQkVSLApAQCAtODUsNiArMTE5LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNHcmVnb3JpYW5DYWxlbmRhcihpbnQsIGludCwgaW50LCBpbnQsCiAgICAgICogICAgICAgIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHcmVnb3JpYW5DYWxlbmRhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKGludCwgaW50LCBpbnQsIGludCwgaW50LAogICAgICAgICAvLyBpbnQpCkBAIC0xMTAsNyArMTUzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNHcmVnb3JpYW5DYWxlbmRhcihqYXZhLnV0aWwuTG9jYWxlKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0xvY2FsZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR3JlZ29yaWFuQ2FsZW5kYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcihqYXZhLnV0aWwuTG9jYWxlKQogICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnY0phcGFuID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKExvY2FsZS5KQVBBTik7CkBAIC0xMjYsNyArMTc4LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNHcmVnb3JpYW5DYWxlbmRhcihqYXZhLnV0aWwuVGltZVpvbmUpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfVGltZVpvbmUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkdyZWdvcmlhbkNhbGVuZGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5UaW1lWm9uZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX1RpbWVab25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKGphdmEudXRpbC5UaW1lWm9uZSkKICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKICAgICAgICAgVGltZVpvbmUuZ2V0RGVmYXVsdCgpOwpAQCAtMTUxLDcgKzIxMiwxNiBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIjR3JlZ29yaWFuQ2FsZW5kYXIoamF2YS51dGlsLlRpbWVab25lLAogICAgICAqICAgICAgICBqYXZhLnV0aWwuTG9jYWxlKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX1RpbWVab25lTGphdmFfdXRpbF9Mb2NhbGUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkdyZWdvcmlhbkNhbGVuZGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5UaW1lWm9uZS5jbGFzcywgamF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX1RpbWVab25lTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIoamF2YS51dGlsLlRpbWVab25lLAogICAgICAgICAvLyBqYXZhLnV0aWwuTG9jYWxlKQogICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwpAQCAtMTc2LDcgKzI0NiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIjYWRkKGludCwgaW50KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkSUkoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfYWRkSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhci5hZGQoaW50LCBpbnQpCiAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjMSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCAxMSwgNik7CiAgICAgICAgIGdjMS5hZGQoR3JlZ29yaWFuQ2FsZW5kYXIuWUVBUiwgMSk7CkBAIC0yNTksNiArMzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhci5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKQEAgLTI3NCw2ICszNjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI2dldEFjdHVhbE1heGltdW0oaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3R1YWxNYXhpbXVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBY3R1YWxNYXhpbXVtSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIuZ2V0QWN0dWFsTWF4aW11bShpbnQpCiAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjMSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTAwLCAxLCAxKTsKQEAgLTMyOSw2ICs0MjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI2dldEFjdHVhbE1pbmltdW0oaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3R1YWxNaW5pbXVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBY3R1YWxNaW5pbXVtSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIuZ2V0QWN0dWFsTWluaW11bShpbnQpCiAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjMSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTAwLCAxLCAxKTsKQEAgLTM1Miw2ICs0NTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI2dldEdyZWF0ZXN0TWluaW11bShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdyZWF0ZXN0TWluaW11bSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JlYXRlc3RNaW5pbXVtSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludAogICAgICAgICAvLyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIuZ2V0R3JlYXRlc3RNaW5pbXVtKGludCkKQEAgLTM3OCw2ICs0OTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI2dldEdyZWdvcmlhbkNoYW5nZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEdyZWdvcmlhbkNoYW5nZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JlZ29yaWFuQ2hhbmdlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkRhdGUKICAgICAgICAgLy8gamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyLmdldEdyZWdvcmlhbkNoYW5nZSgpCkBAIC0zOTYsNiArNTIwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNnZXRMZWFzdE1heGltdW0oaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZWFzdE1heGltdW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExlYXN0TWF4aW11bUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyLmdldExlYXN0TWF4aW11bShpbnQpCiAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CkBAIC00MzMsNiArNTY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNnZXRNYXhpbXVtKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4aW11bSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyLmdldE1heGltdW0oaW50KQogICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwpAQCAtNDYyLDYgKzYwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIjZ2V0TWluaW11bShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1pbmltdW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW1JKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhci5nZXRNaW5pbXVtKGludCkKICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKQEAgLTQ4Nyw2ICs2MzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI2lzTGVhcFllYXIoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xlYXBZZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0xlYXBZZWFySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyLmlzTGVhcFllYXIoaW50KQogICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk4LCAxMSwgNik7CkBAIC01MDAsNiArNjYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNyb2xsKGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb2xsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JvbGxJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyLnJvbGwoaW50LCBpbnQpCiAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5NzIsIENhbGVuZGFyLk9DVE9CRVIsIDgsCkBAIC01MjMsNiArNjkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNyb2xsKGludCwgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicm9sbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfcm9sbElaKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIucm9sbChpbnQsIGJvb2xlYW4pCiAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5NzIsIENhbGVuZGFyLk9DVE9CRVIsCkBAIC01NzEsNiArNzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNzZXRHcmVnb3JpYW5DaGFuZ2UoamF2YS51dGlsLkRhdGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEdyZWdvcmlhbkNoYW5nZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuRGF0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRHcmVnb3JpYW5DaGFuZ2VMamF2YV91dGlsX0RhdGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhci5zZXRHcmVnb3JpYW5DaGFuZ2UoamF2YS51dGlsLkRhdGUpCkBAIC01ODYsNiArNzczLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgCiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDk4CkBAIC02MDYsNyArODAyLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciNnZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIYXJtb255LTEwMzcKICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZQogICAgICAgICAgICAgICAgIC5nZXRUaW1lWm9uZSgiRXVyb3BlL0xvbmRvbiIpLCBuZXcgTG9jYWxlKCJlbiIsICJHQiIpKTsKQEAgLTYyOCw2ICs4MzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyI2NvbXB1dGVUaW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcHV0ZVRpbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUaW1lKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIYXJtb255LTQ5MwogICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKApAQCAtNjU1LDYgKzg2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIjZ2V0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEkoKSB7IAogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMjk1OQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSGFzaE1hcFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0hhc2hNYXBUZXN0LmphdmEKaW5kZXggNTU1YjUwNC4uNjdmYTExYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSGFzaE1hcFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9IYXNoTWFwVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTMwLDYgKzM1LDcgQEAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfTWFwVGVzdDI7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1VubW9kaWZpYWJsZUNvbGxlY3Rpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKEhhc2hNYXAuY2xhc3MpIAogcHVibGljIGNsYXNzIEhhc2hNYXBUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBjbGFzcyBNb2NrTWFwIGV4dGVuZHMgQWJzdHJhY3RNYXAgewogICAgICAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewpAQCAtNjksNiArNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hNYXAjSGFzaE1hcCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkhhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkhhc2hNYXAoKQogICAgICAgICBuZXcgU3VwcG9ydF9NYXBUZXN0MihuZXcgSGFzaE1hcCgpKS5ydW5UZXN0KCk7CkBAIC04MCw2ICs5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaE1hcCNIYXNoTWFwKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJOZWVkIHRvIGltcHJvdmUgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYXNoTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuSGFzaE1hcChpbnQpCiAgICAgICAgIEhhc2hNYXAgaG0yID0gbmV3IEhhc2hNYXAoNSk7CkBAIC0xMDEsNiArMTI1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoTWFwI0hhc2hNYXAoaW50LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJOZWVkIHRvIGltcHJvdmUgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYXNoTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5IYXNoTWFwKGludCwgZmxvYXQpCiAgICAgICAgIEhhc2hNYXAgaG0yID0gbmV3IEhhc2hNYXAoNSwgKGZsb2F0KSAwLjUpOwpAQCAtMTIyLDYgKzE1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaE1hcCNIYXNoTWFwKGphdmEudXRpbC5NYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkhhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkhhc2hNYXAoamF2YS51dGlsLk1hcCkKICAgICAgICAgTWFwIG15TWFwID0gbmV3IFRyZWVNYXAoKTsKQEAgLTE0NCw2ICsxODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hNYXAjY2xlYXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xlYXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5IYXNoTWFwLmNsZWFyKCkKICAgICAgICAgaG0uY2xlYXIoKTsKQEAgLTE1Nyw2ICsyMDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hNYXAjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5IYXNoTWFwLmNsb25lKCkKICAgICAgICAgSGFzaE1hcCBobTIgPSAoSGFzaE1hcCkgaG0uY2xvbmUoKTsKQEAgLTIwMyw2ICsyNjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hNYXAjY29udGFpbnNLZXkoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc0tleUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuSGFzaE1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjIwLDYgKzI4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaE1hcCNjb250YWluc1ZhbHVlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc1ZhbHVlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5IYXNoTWFwLmNvbnRhaW5zVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKQEAgLTIzMiw2ICszMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hNYXAjZW50cnlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cnlTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0IGphdmEudXRpbC5IYXNoTWFwLmVudHJ5U2V0KCkKICAgICAgICAgU2V0IHMgPSBobS5lbnRyeVNldCgpOwpAQCAtMjQ4LDYgKzMzNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaE1hcCNnZXQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5IYXNoTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjc5LDYgKzM3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaE1hcCNpc0VtcHR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFbXB0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkhhc2hNYXAuaXNFbXB0eSgpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGZhbHNlIGZvciBuZXcgbWFwIiwgbmV3IEhhc2hNYXAoKS5pc0VtcHR5KCkpOwpAQCAtMjg4LDYgKzM5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaE1hcCNrZXlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2tleVNldCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TZXQgamF2YS51dGlsLkhhc2hNYXAua2V5U2V0KCkKICAgICAgICAgU2V0IHMgPSBobS5rZXlTZXQoKTsKQEAgLTM0MSw2ICs0NTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hNYXAjcHV0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuSGFzaE1hcC5wdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKQEAgLTM2MSw2ICs0ODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hNYXAjcHV0QWxsKGphdmEudXRpbC5NYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0QWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5IYXNoTWFwLnB1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAgICBIYXNoTWFwIGhtMiA9IG5ldyBIYXNoTWFwKCk7CkBAIC0zNzgsNiArNTEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoTWFwI3B1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dEFsbExqYXZhX3V0aWxfTWFwX051bGwoKSB7CiAgICAgICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgIHRyeSB7CkBAIC0zOTgsNiArNTM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoTWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS51dGlsLkhhc2hNYXAucmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCkBAIC00MjAsNiArNTcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoTWFwI3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5IYXNoTWFwLnNpemUoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc2l6ZSIsCkBAIC00MjksNiArNTg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoTWFwI3ZhbHVlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkNvbGxlY3Rpb24gamF2YS51dGlsLkhhc2hNYXAudmFsdWVzKCkKICAgICAgICAgQ29sbGVjdGlvbiBjID0gaG0udmFsdWVzKCk7CkBAIC00NzMsNyArNjQxLDE1IEBACiAgICAgICAgICAgICByZXR1cm4ga2V5ID09ICgoUmV1c2FibGVLZXkpIG8pLmtleTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X01hcF9FbnRyeV9oYXNoQ29kZSgpIHsKICAgICAgICAgLy9SZWxhdGVkIHRvIEhBUk1PTlktNDAzCiAgICAgICAgIEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oMTApOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSGFzaFNldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0hhc2hTZXRUZXN0LmphdmEKaW5kZXggYjVlOGQ5NS4uZjZjY2FhYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSGFzaFNldFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9IYXNoU2V0VGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0zMCw2ICszNSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKEhhc2hTZXQuY2xhc3MpIAogcHVibGljIGNsYXNzIEhhc2hTZXRUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIEhhc2hTZXQgaHM7CkBAIC00NCw2ICs1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaFNldCNIYXNoU2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSGFzaFNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuSGFzaFNldCgpCiAgICAgICAgIEhhc2hTZXQgaHMyID0gbmV3IEhhc2hTZXQoKTsKQEAgLTUzLDYgKzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoU2V0I0hhc2hTZXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYXNoU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuSGFzaFNldChpbnQpCiAgICAgICAgIEhhc2hTZXQgaHMyID0gbmV3IEhhc2hTZXQoNSk7CkBAIC02OSw2ICs5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaFNldCNIYXNoU2V0KGludCwgZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkhhc2hTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkhhc2hTZXQoaW50LCBmbG9hdCkKICAgICAgICAgSGFzaFNldCBoczIgPSBuZXcgSGFzaFNldCg1LCAoZmxvYXQpIDAuNSk7CkBAIC04NSw2ICsxMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hTZXQjSGFzaFNldChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYXNoU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkhhc2hTZXQoamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICAgIEhhc2hTZXQgaHMyID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChvYmpBcnJheSkpOwpAQCAtOTgsNiArMTQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoU2V0I2FkZChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuSGFzaFNldC5hZGQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgaW50IHNpemUgPSBocy5zaXplKCk7CkBAIC0xMTIsNiArMTYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoU2V0I2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuSGFzaFNldC5jbGVhcigpCiAgICAgICAgIFNldCBvcmdTZXQgPSAoU2V0KSBocy5jbG9uZSgpOwpAQCAtMTI1LDYgKzE4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaFNldCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLkhhc2hTZXQuY2xvbmUoKQogICAgICAgICBIYXNoU2V0IGhzMiA9IChIYXNoU2V0KSBocy5jbG9uZSgpOwpAQCAtMTM1LDYgKzIwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaFNldCNjb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWlucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5IYXNoU2V0LmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGZhbHNlIGZvciB2YWxpZCBvYmplY3QiLCBocy5jb250YWlucyhvYmpBcnJheVs5MF0pKTsKQEAgLTE0OSw2ICsyMjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hTZXQjaXNFbXB0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRW1wdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRW1wdHkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5IYXNoU2V0LmlzRW1wdHkoKQogICAgICAgICBhc3NlcnRUcnVlKCJFbXB0eSBzZXQgcmV0dXJuZWQgZmFsc2UiLCBuZXcgSGFzaFNldCgpLmlzRW1wdHkoKSk7CkBAIC0xNTgsNiArMjQ1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoU2V0I2l0ZXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2l0ZXJhdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkl0ZXJhdG9yIGphdmEudXRpbC5IYXNoU2V0Lml0ZXJhdG9yKCkKICAgICAgICAgSXRlcmF0b3IgaSA9IGhzLml0ZXJhdG9yKCk7CkBAIC0xNzcsNiArMjczLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNoU2V0I3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IHJlbW92ZSBtZXRob2QgZm9yIG5vdCBwcmVzZW50IGVsZW1lbnQgaW4gIiArCisgICAgICAgICAgICAiSGFzaFNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkhhc2hTZXQucmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIGludCBzaXplID0gaHMuc2l6ZSgpOwpAQCAtMTkyLDYgKzI5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaFNldCNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuSGFzaFNldC5zaXplKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IHNpemUiLCBocy5zaXplKCkgPT0gKG9iakFycmF5Lmxlbmd0aCArIDEpKTsKQEAgLTIwMiw2ICszMTcsMTkgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2hTZXQjU2VyaWFsaXphdGlvblRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKICAgICAgICAgSGFzaFNldDxTdHJpbmc+IGhzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgICAgICBocy5hZGQoImhlbGxvIik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9IYXNodGFibGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9IYXNodGFibGVUZXN0LmphdmEKaW5kZXggNjU3MTZiZi4uYjRmYmU3ZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSGFzaHRhYmxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0hhc2h0YWJsZVRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTM1LDYgKzQwLDcgQEAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfTWFwVGVzdDI7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X1VubW9kaWZpYWJsZUNvbGxlY3Rpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKEhhc2h0YWJsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSGFzaHRhYmxlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIEhhc2h0YWJsZSBodDEwOwpAQCAtNTIsNiArNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNIYXNodGFibGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYXNodGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkhhc2h0YWJsZSgpCiAgICAgICAgIG5ldyBTdXBwb3J0X01hcFRlc3QyKG5ldyBIYXNodGFibGUoKSkucnVuVGVzdCgpOwpAQCAtNjQsNiArNzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNIYXNodGFibGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYXNodGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5IYXNodGFibGUoaW50KQogICAgICAgICBIYXNodGFibGUgaCA9IG5ldyBIYXNodGFibGUoOSk7CkBAIC03OSw2ICsxMDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNIYXNodGFibGUoaW50LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSGFzaHRhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJRigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5IYXNodGFibGUoaW50LCBmbG9hdCkKICAgICAgICAgSGFzaHRhYmxlIGggPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgxMCwgMC41Zik7CkBAIC05Myw2ICsxMjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNIYXNodGFibGUoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJIYXNodGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkhhc2h0YWJsZShqYXZhLnV0aWwuTWFwKQogICAgICAgICBNYXAgbWFwID0gbmV3IFRyZWVNYXAoKTsKQEAgLTExMCw2ICsxNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkhhc2h0YWJsZS5jbGVhcigpCiAgICAgICAgIEhhc2h0YWJsZSBoID0gaGFzaHRhYmxlQ2xvbmUoaHRmdWxsKTsKQEAgLTEyNCw2ICsxNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLkhhc2h0YWJsZS5jbG9uZSgpCiAKQEAgLTE0Nyw2ICsyMDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNjb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLkhhc2h0YWJsZS5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTU3LDYgKzIyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2NvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc0tleUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuSGFzaHRhYmxlLmNvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCkBAIC0xNjgsNiArMjQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNodGFibGUjY29udGFpbnNWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc1ZhbHVlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5IYXNodGFibGUuY29udGFpbnNWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTgyLDYgKzI2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2VsZW1lbnRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZWxlbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VsZW1lbnRzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkVudW1lcmF0aW9uIGphdmEudXRpbC5IYXNodGFibGUuZWxlbWVudHMoKQogICAgICAgICBFbnVtZXJhdGlvbiBlbG1zID0gaHQxMC5lbGVtZW50cygpOwpAQCAtMTk4LDYgKzI5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2VsZW1lbnRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZWxlbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VsZW1lbnRzX3N1YnRlc3QwKCkgewogICAgICAgICAvLyB0aGlzIGlzIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYmVoYXZpb3IKICAgICAgICAgZmluYWwgSGFzaHRhYmxlIGh0ID0gbmV3IEhhc2h0YWJsZSg3KTsKQEAgLTIzMyw2ICszMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNlbnRyeVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudHJ5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbnRyeVNldCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TZXQgamF2YS51dGlsLkhhc2h0YWJsZS5lbnRyeVNldCgpCiAgICAgICAgIFNldCBzID0gaHQxMC5lbnRyeVNldCgpOwpAQCAtMjYyLDYgKzM3NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkhhc2h0YWJsZS5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgSGFzaHRhYmxlIGggPSBoYXNodGFibGVDbG9uZShodDEwKTsKQEAgLTI3Miw2ICszOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNnZXQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS51dGlsLkhhc2h0YWJsZS5nZXQoamF2YS5sYW5nLk9iamVjdCkKQEAgLTI5Niw2ICs0MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuSGFzaHRhYmxlLmhhc2hDb2RlKCkKICAgICAgICAgU2V0IGVudHJ5U2V0ID0gaHQxMC5lbnRyeVNldCgpOwpAQCAtMzExLDYgKzQ1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2lzRW1wdHkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VtcHR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuSGFzaHRhYmxlLmlzRW1wdHkoKQogCkBAIC0zNDgsNiArNDk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNodGFibGUja2V5cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2tleXMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuRW51bWVyYXRpb24gamF2YS51dGlsLkhhc2h0YWJsZS5rZXlzKCkKIApAQCAtMzY1LDYgKzUyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2tleXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2tleXNfc3VidGVzdDAoKSB7CiAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvcgogICAgICAgICBmaW5hbCBIYXNodGFibGUgaHQgPSBuZXcgSGFzaHRhYmxlKDMpOwpAQCAtMzg1LDYgKzU1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfa2V5U2V0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNldCBqYXZhLnV0aWwuSGFzaHRhYmxlLmtleVNldCgpCiAgICAgICAgIFNldCBzID0gaHQxMC5rZXlTZXQoKTsKQEAgLTQzNSw2ICs2MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNrZXlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfa2V5U2V0X3N1YnRlc3QwKCkgewogICAgICAgICBTZXQgczEgPSBodDEwLmtleVNldCgpOwogICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgY29udGFpbiBrZXkiLCBzMS5yZW1vdmUoIktleSAwIikpOwpAQCAtNDcyLDYgKzY1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXRfc3VidGVzdDEoKSB7CiAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvcgogICAgICAgICBmaW5hbCBIYXNodGFibGUgaHQgPSBuZXcgSGFzaHRhYmxlKDcpOwpAQCAtNTE1LDYgKzcxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuSGFzaHRhYmxlLnB1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNTMzLDYgKzczNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI3B1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dEFsbExqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuSGFzaHRhYmxlLnB1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAgICBIYXNodGFibGUgaCA9IG5ldyBIYXNodGFibGUoKTsKQEAgLTU0OCw2ICs3NjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSByZW1vdmUgbWV0aG9kIGZvciBub24gZXhpc3RlbnQgZWxlbWVudC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS51dGlsLkhhc2h0YWJsZS5yZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKQEAgLTU1OSw2ICs3ODEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkhhc2h0YWJsZSNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuSGFzaHRhYmxlLnNpemUoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbnZhbGlkIHNpemUiLCBodDEwLnNpemUoKSA9PSAxMApAQCAtNTk0LDYgKzgyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSGFzaHRhYmxlI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuSGFzaHRhYmxlLnRvU3RyaW5nKCkKICAgICAgICAgSGFzaHRhYmxlIGggPSBuZXcgSGFzaHRhYmxlKCk7CkBAIC02MTEsNiArODUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5IYXNodGFibGUjdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZXMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBqYXZhLnV0aWwuSGFzaHRhYmxlLnZhbHVlcygpCiAgICAgICAgIENvbGxlY3Rpb24gYyA9IGh0MTAudmFsdWVzKCk7CkBAIC02MzcsNiArODg2LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVncmVzc2lvbiBUZXN0IGZvciBKSVJBIDIxODEKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cnlTZXRfcmVtb3ZlKCkKICAgICB7CiAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsU3RyaW5nPiBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxTdHJpbmc+KCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9JZGVudGl0eUhhc2hNYXBUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9JZGVudGl0eUhhc2hNYXBUZXN0LmphdmEKaW5kZXggYWYzYjU3Ni4uYjU2ODllYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0lkZW50aXR5SGFzaE1hcFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzMsNiArMzgsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhJZGVudGl0eUhhc2hNYXAuY2xhc3MpIAogcHVibGljIGNsYXNzIElkZW50aXR5SGFzaE1hcFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJoZWxsbyI7CiAKQEAgLTY4LDYgKzc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjSWRlbnRpdHlIYXNoTWFwKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWRlbnRpdHlIYXNoTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAoKQogICAgICAgICBuZXcgU3VwcG9ydF9NYXBUZXN0MihuZXcgSWRlbnRpdHlIYXNoTWFwKCkpLnJ1blRlc3QoKTsKQEAgLTc5LDYgKzk0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjSWRlbnRpdHlIYXNoTWFwKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJOZWVkIHRvIGltcHJvdmUgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJZGVudGl0eUhhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAoaW50KQogICAgICAgICBJZGVudGl0eUhhc2hNYXAgaG0yID0gbmV3IElkZW50aXR5SGFzaE1hcCg1KTsKQEAgLTEwMCw2ICsxMjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCNJZGVudGl0eUhhc2hNYXAoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJZGVudGl0eUhhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcChqYXZhLnV0aWwuTWFwKQogICAgICAgICBNYXAgbXlNYXAgPSBuZXcgVHJlZU1hcCgpOwpAQCAtMTE4LDYgKzE1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLmNsZWFyKCkKICAgICAgICAgaG0uY2xlYXIoKTsKQEAgLTEzMSw2ICsxNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcC5jbG9uZSgpCiAgICAgICAgIElkZW50aXR5SGFzaE1hcCBobTIgPSAoSWRlbnRpdHlIYXNoTWFwKSBobS5jbG9uZSgpOwpAQCAtMTY2LDYgKzIxNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2NvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zS2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNLZXlMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLklkZW50aXR5SGFzaE1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTg1LDYgKzI0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2NvbnRhaW5zVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zVmFsdWVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLklkZW50aXR5SGFzaE1hcC5jb250YWluc1ZhbHVlKGphdmEubGFuZy5PYmplY3QpCkBAIC0xOTcsNiArMjY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjZW50cnlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cnlTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAuZW50cnlTZXQoKQogICAgICAgICBTZXQgcyA9IGhtLmVudHJ5U2V0KCk7CkBAIC0yMTMsNiArMjkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjZ2V0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjMyLDYgKzMxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2lzRW1wdHkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VtcHR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLmlzRW1wdHkoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBmYWxzZSBmb3IgbmV3IG1hcCIsIG5ldyBJZGVudGl0eUhhc2hNYXAoKQpAQCAtMjQyLDYgKzMzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfa2V5U2V0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNldCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLmtleVNldCgpCiAgICAgICAgIFNldCBzID0gaG0ua2V5U2V0KCk7CkBAIC0yOTYsNiArNDAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjcHV0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLnB1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMzE4LDYgKzQzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI3B1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dEFsbExqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLnB1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAgICBJZGVudGl0eUhhc2hNYXAgaG0yID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwpAQCAtMzM1LDYgKzQ1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS51dGlsLklkZW50aXR5SGFzaE1hcC5yZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKQEAgLTM1Niw2ICs0ODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLnNpemUoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBzaXplLCAiLCAob2JqQXJyYXkubGVuZ3RoICsgMiksIGhtCkBAIC0zNjUsNiArNTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwT25lID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwogICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwVHdvID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwpAQCAtNDA5LDYgKzU1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI3ZhbHVlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkNvbGxlY3Rpb24KICAgICAgICAgLy8gamF2YS51dGlsLklkZW50aXR5SGFzaE1hcC52YWx1ZXMoKQpAQCAtNDMzLDYgKzU5MiwxOSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwI1NlcmlhbGl6YXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSWRlbnRpdHlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgICBtYXAucHV0KElELCAid29ybGQiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0ludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggOWNjOGFlYS4uNzZlMjNkMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE1LDE3ICsxNSwzMiBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkUHJvcGVydGllc0Zvcm1hdEV4Y2VwdGlvbi5jbGFzcykgCiBwdWJsaWMgY2xhc3MgSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb25UZXN0IGV4dGVuZHMKICAgICAgICAganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb24jU2VyaWFsaXphdGlvblRlc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJbnZhbGlkUHJvcGVydGllc0Zvcm1hdEV4Y2VwdGlvbiBpcGZlID0gbmV3IEludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJIZXksIHRoaXMgaXMgSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb24iKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0xpbmtlZEhhc2hNYXBUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9MaW5rZWRIYXNoTWFwVGVzdC5qYXZhCmluZGV4IGY3MGYyZmUuLjk1Y2IzZTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0xpbmtlZEhhc2hNYXBUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0zMyw2ICszOCw3IEBACiAvKioKICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcAogICovCitAVGVzdFRhcmdldENsYXNzKExpbmtlZEhhc2hNYXAuY2xhc3MpIAogcHVibGljIGNsYXNzIExpbmtlZEhhc2hNYXBUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIExpbmtlZEhhc2hNYXAgaG07CkBAIC03Miw2ICs3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNMaW5rZWRIYXNoTWFwKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGlua2VkSGFzaE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCgpCiAgICAgICAgIG5ldyBTdXBwb3J0X01hcFRlc3QyKG5ldyBMaW5rZWRIYXNoTWFwKCkpLnJ1blRlc3QoKTsKQEAgLTgzLDYgKzk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI0xpbmtlZEhhc2hNYXAoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIk5lZWQgdG8gaW1wcm92ZSBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxpbmtlZEhhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKGludCkKICAgICAgICAgTGlua2VkSGFzaE1hcCBobTIgPSBuZXcgTGlua2VkSGFzaE1hcCg1KTsKQEAgLTEwNCw2ICsxMjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAjTGlua2VkSGFzaE1hcChpbnQsIGZsb2F0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIk5lZWQgdG8gaW1wcm92ZSBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxpbmtlZEhhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAoaW50LCBmbG9hdCkKICAgICAgICAgTGlua2VkSGFzaE1hcCBobTIgPSBuZXcgTGlua2VkSGFzaE1hcCg1LCAoZmxvYXQpIDAuNSk7CkBAIC0xMjQsNiArMTU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI0xpbmtlZEhhc2hNYXAoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGlua2VkSGFzaE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcChqYXZhLnV0aWwuTWFwKQogICAgICAgICBNYXAgbXlNYXAgPSBuZXcgVHJlZU1hcCgpOwpAQCAtMTM4LDYgKzE4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNnZXQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5nZXQoamF2YS5sYW5nLk9iamVjdCkKQEAgLTE1Nyw2ICsyMDgsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAjcHV0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgdGhhdCBwdXQgcmV0dXJucyBudWxsIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nICIgKworICAgICAgICAgICAgImZvciBrZXksIG9yIGFzc29jaWF0ZWQgbnVsbCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dExqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLnB1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTc3LDYgKzIzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNwdXRBbGwoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0QWxsIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TWFwLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLnB1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAgICBMaW5rZWRIYXNoTWFwIGhtMiA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CkBAIC0xODksNiArMjU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3B1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtNYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsX0xqYXZhX3V0aWxfTWFwX051bGwoKSB7CiAgICAgICAgIExpbmtlZEhhc2hNYXAgbGlua2VkSGFzaE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CiAgICAgICAgIHRyeSB7CkBAIC0yMDksNiArMjg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI2VudHJ5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cnlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VudHJ5U2V0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNldCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5lbnRyeVNldCgpCiAgICAgICAgIFNldCBzID0gaG0uZW50cnlTZXQoKTsKQEAgLTIyNSw2ICszMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAja2V5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLmtleVNldCgpCiAgICAgICAgIFNldCBzID0gaG0ua2V5U2V0KCk7CkBAIC0yNzgsNiArMzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3ZhbHVlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkNvbGxlY3Rpb24gamF2YS51dGlsLkxpbmtlZEhhc2hNYXAudmFsdWVzKCkKICAgICAgICAgQ29sbGVjdGlvbiBjID0gaG0udmFsdWVzKCk7CkBAIC0zMDQsNiArNDEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5yZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKQEAgLTMyNiw2ICs0NDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAjY2xlYXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xlYXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLmNsZWFyKCkKICAgICAgICAgaG0uY2xlYXIoKTsKQEAgLTMzOSw2ICs0NjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLmNsb25lKCkKICAgICAgICAgTGlua2VkSGFzaE1hcCBobTIgPSAoTGlua2VkSGFzaE1hcCkgaG0uY2xvbmUoKTsKQEAgLTM3MSw3ICs1MDQsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXlTZXQoKSB3YXMgbm90IGNsb25lZCIsIAogICAgICAgICAgICAgICAgICJrZXkyIiwga2V5Mi5pdGVyYXRvcigpLm5leHQoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgfSkgICAKICAgICAvLyByZWdyZXNpb24gdGVzdCBmb3IgSEFSTU9OWS00NjAzCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZV9Nb2NrKCkgewogICAgICAgICBMaW5rZWRIYXNoTWFwIGhhc2hNYXAgPSBuZXcgTW9ja01hcCgpOwpAQCAtNDAyLDYgKzU0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNjb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsYXNzQ2FzdEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc0tleUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNDE5LDYgKzU2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCNjb250YWluc1ZhbHVlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWluc1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNWYWx1ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5jb250YWluc1ZhbHVlKGphdmEubGFuZy5PYmplY3QpCkBAIC00MzEsNiArNTkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI2lzRW1wdHkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VtcHR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcC5pc0VtcHR5KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgZmFsc2UgZm9yIG5ldyBtYXAiLCBuZXcgTGlua2VkSGFzaE1hcCgpLmlzRW1wdHkoKSk7CkBAIC00NDAsNiArNjA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwLnNpemUoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc2l6ZSIsCkBAIC00NDksNiArNjI2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI2VudHJ5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW50cnlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29yZGVyZWRfZW50cnlTZXQoKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBpbnQgc3ogPSAxMDA7CkBAIC01MTEsNiArNjk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI2tleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3JkZXJlZF9rZXlTZXQoKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBpbnQgc3ogPSAxMDA7CkBAIC01NjcsNiArNzYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3ZhbHVlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3JkZXJlZF92YWx1ZXMoKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBpbnQgc3ogPSAxMDA7CkBAIC02MjMsNiArODI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwI3JlbW92ZUVsZGVzdEVudHJ5KGphdmEudXRpbC5NYXAkRW50cnkpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZUVsZGVzdEVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuRW50cnkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlX2VsZGVzdCgpIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGludCBzeiA9IDEwOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTGlua2VkSGFzaFNldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0xpbmtlZEhhc2hTZXRUZXN0LmphdmEKaW5kZXggNTIwMTUwNC4uOTQzZjAwOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTGlua2VkSGFzaFNldFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9MaW5rZWRIYXNoU2V0VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CkBAIC0yNCw2ICsyOSw4IEBACiAvKioKICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaFNldAogICovCisKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS51dGlsLkxpbmtlZEhhc2hTZXQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgTGlua2VkSGFzaFNldFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgTGlua2VkSGFzaFNldCBoczsKQEAgLTM4LDYgKzQ1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0I0xpbmtlZEhhc2hTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMaW5rZWRIYXNoU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0KCkKICAgICAgICAgTGlua2VkSGFzaFNldCBoczIgPSBuZXcgTGlua2VkSGFzaFNldCgpOwpAQCAtNDcsNiArNjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQjTGlua2VkSGFzaFNldChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxpbmtlZEhhc2hTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0KGludCkKICAgICAgICAgTGlua2VkSGFzaFNldCBoczIgPSBuZXcgTGlua2VkSGFzaFNldCg1KTsKQEAgLTYzLDYgKzg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0I0xpbmtlZEhhc2hTZXQoaW50LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGlua2VkSGFzaFNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUYoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldChpbnQsIGZsb2F0KQogICAgICAgICBMaW5rZWRIYXNoU2V0IGhzMiA9IG5ldyBMaW5rZWRIYXNoU2V0KDUsIChmbG9hdCkgMC41KTsKQEAgLTc5LDYgKzExMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaFNldCNMaW5rZWRIYXNoU2V0KGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxpbmtlZEhhc2hTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgICAgTGlua2VkSGFzaFNldCBoczIgPSBuZXcgTGlua2VkSGFzaFNldChBcnJheXMuYXNMaXN0KG9iakFycmF5KSk7CkBAIC05Miw2ICsxMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQjYWRkKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0LmFkZChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBpbnQgc2l6ZSA9IGhzLnNpemUoKTsKQEAgLTEwNiw2ICsxNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQjY2xlYXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xlYXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0LmNsZWFyKCkKICAgICAgICAgU2V0IG9yZ1NldCA9IChTZXQpIGhzLmNsb25lKCk7CkBAIC0xMTksNiArMTgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0I2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldC5jbG9uZSgpCiAgICAgICAgIExpbmtlZEhhc2hTZXQgaHMyID0gKExpbmtlZEhhc2hTZXQpIGhzLmNsb25lKCk7CkBAIC0xMzAsNiArMjAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0I2NvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWlucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLkxpbmtlZEhhc2hTZXQuY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKQEAgLTE0NSw2ICsyMjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQjaXNFbXB0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRW1wdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRW1wdHkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0LmlzRW1wdHkoKQogICAgICAgICBhc3NlcnRUcnVlKCJFbXB0eSBzZXQgcmV0dXJuZWQgZmFsc2UiLCBuZXcgTGlua2VkSGFzaFNldCgpLmlzRW1wdHkoKSk7CkBAIC0xNTQsNiArMjQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0I2l0ZXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2l0ZXJhdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkl0ZXJhdG9yIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0Lml0ZXJhdG9yKCkKICAgICAgICAgSXRlcmF0b3IgaSA9IGhzLml0ZXJhdG9yKCk7CkBAIC0xNzksNiArMjc2LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0I3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsYXNzQ2FzdEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24sICIgKworICAgICAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5MaW5rZWRIYXNoU2V0LnJlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMTk1LDYgKzMwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkSGFzaFNldCNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldC5zaXplKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IHNpemUiLCBocy5zaXplKCkgPT0gKG9iakFycmF5Lmxlbmd0aCArIDEpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0xpbmtlZExpc3RUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9MaW5rZWRMaXN0VGVzdC5qYXZhCmluZGV4IGEzNDMyZWMuLjNjNjYzZjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0xpbmtlZExpc3RUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTGlua2VkTGlzdFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTI5LDYgKzM0LDcgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9MaXN0VGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhMaW5rZWRMaXN0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBMaW5rZWRMaXN0VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBMaW5rZWRMaXN0IGxsOwpAQCAtNDMsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjTGlua2VkTGlzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxpbmtlZExpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkxpbmtlZExpc3QoKQogICAgICAgICBuZXcgU3VwcG9ydF9MaXN0VGVzdCgiIiwgbGwpLnJ1blRlc3QoKTsKQEAgLTU2LDYgKzcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I0xpbmtlZExpc3QoamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGlua2VkTGlzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfQ29sbGVjdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5MaW5rZWRMaXN0KGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgTGlua2VkTGlzdCBjb25zdHJ1Y3RlZCIsIG5ldyBMaW5rZWRMaXN0KGxsKQpAQCAtNjUsNiArODksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjYWRkKGludCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZElMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkxpbmtlZExpc3QuYWRkKGludCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgT2JqZWN0IG87CkBAIC04MCw2ICsxMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjYWRkKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5MaW5rZWRMaXN0LmFkZChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBPYmplY3QgbzsKQEAgLTkyLDYgKzEzNCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkTGlzdCNhZGRBbGwoaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiICsgCisgICAgICAgICAgICAiTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsSUxqYXZhX3V0aWxfQ29sbGVjdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkxpbmtlZExpc3QuYWRkQWxsKGludCwKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC0xMjUsNiArMTc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsSUxqYXZhX3V0aWxfQ29sbGVjdGlvbl8yKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ2NwogICAgICAgICBMaW5rZWRMaXN0IG9iaiA9IG5ldyBMaW5rZWRMaXN0KCk7CkBAIC0xMzgsNiArMTk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuTGlua2VkTGlzdC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC0xNzQsNiArMjQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I2FkZEZpcnN0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEZpcnN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRGaXJzdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuTGlua2VkTGlzdC5hZGRGaXJzdChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBPYmplY3QgbzsKQEAgLTE4Niw2ICsyNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjYWRkTGFzdChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRMYXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRMYXN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5MaW5rZWRMaXN0LmFkZExhc3QoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgT2JqZWN0IG87CkBAIC0xOTgsNiArMjg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuTGlua2VkTGlzdC5jbGVhcigpCiAgICAgICAgIGxsLmNsZWFyKCk7CkBAIC0yMDgsNiArMzA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuTGlua2VkTGlzdC5jbG9uZSgpCiAgICAgICAgIE9iamVjdCB4ID0gbGwuY2xvbmUoKTsKQEAgLTIyMyw2ICszMjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuTGlua2VkTGlzdC5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjQwLDYgKzM1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkTGlzdCNnZXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5MaW5rZWRMaXN0LmdldChpbnQpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBlbGVtZW50IiwgbGwuZ2V0KDIyKSA9PSBvYmpBcnJheVsyMl0pOwpAQCAtMjUzLDYgKzM3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkTGlzdCNnZXRGaXJzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaXJzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Rmlyc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5MaW5rZWRMaXN0LmdldEZpcnN0KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGZpcnN0IGVsZW1lbnQiLCBsbC5nZXRGaXJzdCgpLmVxdWFscygKQEAgLTI2Miw2ICszOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjZ2V0TGFzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMYXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMYXN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuTGlua2VkTGlzdC5nZXRMYXN0KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGZpcnN0IGVsZW1lbnQiLCBsbC5nZXRMYXN0KCkuZXF1YWxzKApAQCAtMjcxLDYgKzQxMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkTGlzdCNpbmRleE9mKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLkxpbmtlZExpc3QuaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBpbmRleCIsIDg3LCBsbC5pbmRleE9mKG9iakFycmF5Wzg3XSkpOwpAQCAtMjg1LDYgKzQzNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkTGlzdCNsYXN0SW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsYXN0SW5kZXhPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xhc3RJbmRleE9mTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQKICAgICAgICAgLy8gamF2YS51dGlsLkxpbmtlZExpc3QubGFzdEluZGV4T2YoamF2YS5sYW5nLk9iamVjdCkKQEAgLTMwMiw2ICs0NjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjbGlzdEl0ZXJhdG9yKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxpc3RJdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbGlzdEl0ZXJhdG9ySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5MaXN0SXRlcmF0b3IKICAgICAgICAgLy8gamF2YS51dGlsLkxpbmtlZExpc3QubGlzdEl0ZXJhdG9yKGludCkKQEAgLTM1Miw2ICs1MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjcmVtb3ZlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuTGlua2VkTGlzdC5yZW1vdmUoaW50KQogICAgICAgICBsbC5yZW1vdmUoMTApOwpAQCAtMzcxLDYgKzU0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkTGlzdCNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5MaW5rZWRMaXN0LnJlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gcmVtb3ZlIHZhbGlkIE9iamVjdCIsIGxsLnJlbW92ZShvYmpBcnJheVs4N10pKTsKQEAgLTM4NCw2ICs1NzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjcmVtb3ZlRmlyc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlRmlyc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUZpcnN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuTGlua2VkTGlzdC5yZW1vdmVGaXJzdCgpCiAgICAgICAgIGxsLnJlbW92ZUZpcnN0KCk7CkBAIC0zOTQsNiArNTkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I3JlbW92ZUxhc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlTGFzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGFzdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLkxpbmtlZExpc3QucmVtb3ZlTGFzdCgpCiAgICAgICAgIGxsLnJlbW92ZUxhc3QoKTsKQEAgLTQwNCw2ICs2MDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3Qjc2V0KGludCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5MaW5rZWRMaXN0LnNldChpbnQsCiAgICAgICAgIC8vIGphdmEubGFuZy5PYmplY3QpCkBAIC00MTUsNiArNjI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5MaW5rZWRMaXN0I3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5MaW5rZWRMaXN0LnNpemUoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc2l6ZSIsIGxsLnNpemUoKSA9PSBvYmpBcnJheS5sZW5ndGgpOwpAQCAtNDI1LDYgKzY0OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlua2VkTGlzdCN0b0FycmF5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9BcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9BcnJheSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgW10gamF2YS51dGlsLkxpbmtlZExpc3QudG9BcnJheSgpCiAgICAgICAgIGxsLmFkZChudWxsKTsKQEAgLTQ0MCw2ICs2NzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxpbmtlZExpc3QjdG9BcnJheShqYXZhLmxhbmcuT2JqZWN0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQXJyYXlTdG9yZUV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9BcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0FycmF5JExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBbXQogICAgICAgICAvLyBqYXZhLnV0aWwuTGlua2VkTGlzdC50b0FycmF5KGphdmEubGFuZy5PYmplY3QgW10pCkBAIC00NzEsMTkgKzcxMiw0NCBAQAogICAgICAgICB3aGlsZSAobGkuaGFzTmV4dCgpKQogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGlzdHMgYXJlIG5vdCBlcXVhbCIsIGxpLm5leHQoKSA9PSByaS5uZXh0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb2ZmZXIoKSB7CiAgICAgICAgIGludCBvcmlnU2l6ZSA9IGxsLnNpemUoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgib2ZmZXIoKSBzaG91bGQgcmV0dXJuIHRydWUnIiwgbGwub2ZmZXIob2JqQXJyYXlbMF0pKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvZmZlcigpIHNob3VsZCBhZGQgYW4gZWxlbWVudCBhcyB0aGUgbGFzdCBvbmUiLCBvcmlnU2l6ZSwgbGwubGFzdEluZGV4T2Yob2JqQXJyYXlbMF0pKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0aGF0IHBvbGwgbWV0aG9kIHJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgIiArCisgICAgICAgICAgICAib2YgdGhlIGxpc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG9sbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9sbCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG91bGQgcmV0dXJuIHRoZSBoZWFkIiwgb2JqQXJyYXlbMF0sIGxsLnBvbGwoKSk7CiAgICAgICAgIExpbmtlZExpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7CiAgICAgICAgIGFzc2VydE51bGwoInNob3VsZCByZXR1cm4gJ251bGwnIGlmIGxpc3QgaXMgZW1wdHkiLCBsaXN0LnBvbGwoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iakFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNob3VsZCByZW1vdmUgdGhlIGhlYWQiLCBvYmpBcnJheVtpXSwgbGwucmVtb3ZlKCkpOwpAQCAtNDk2LDcgKzc2MiwxNSBAQAogICAgICAgICAgICAgLy8tLSBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVsZW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VsZW1lbnQoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygic2hvdWxkIHJldHVybiB0aGUgaGVhZCIsIG9iakFycmF5WzBdLCBsbC5lbGVtZW50KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImVsZW1lbnQoKSBzaG91bGQgcmVtb3ZlIG5vdGhpbmciLCBvYmpBcnJheS5sZW5ndGgsIGxsLnNpemUoKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9MaXN0UmVzb3VyY2VCdW5kbGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9MaXN0UmVzb3VyY2VCdW5kbGVUZXN0LmphdmEKaW5kZXggMzUwNmEyNS4uOWFkZmNjMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTGlzdFJlc291cmNlQnVuZGxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0xpc3RSZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQpAQCAtMTcsMTYgKzE3LDMxIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBMaXN0UmVzb3VyY2VCdW5kbGVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlI2dldEtleXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRLZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRLZXlzKCkgewogICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CiAgICAgICAgIFN0cmluZyBuYW1lID0gInRlc3RzLnN1cHBvcnQuU3VwcG9ydF9UZXN0UmVzb3VyY2UiOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTG9jYWxlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTG9jYWxlVGVzdC5qYXZhCmluZGV4IGEwYzRiYjIuLjhiNGM5NTMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL0xvY2FsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Mb2NhbGVUZXN0LmphdmEKQEAgLTE3LDEyICsxNywxOCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTG9jYWxlLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBMb2NhbGVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIExvY2FsZSB0ZXN0TG9jYWxlOwpAQCAtMzQsNiArNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxvY2FsZSNMb2NhbGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMb2NhbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTG9jYWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIExvY2FsZSB4ID0gbmV3IExvY2FsZSgieHgiLCAiQ1YiKTsKQEAgLTQ1LDYgKzYwLDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjTG9jYWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTG9jYWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Mb2NhbGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKQEAgLTczLDYgKzk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5Mb2NhbGUuY2xvbmUoKQogICAgICAgICBhc3NlcnRUcnVlKCJDbG9uZSBmYWlsZWQiLCBsLmNsb25lKCkuZXF1YWxzKGwpKTsKQEAgLTgxLDYgKzExNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLkxvY2FsZS5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgTG9jYWxlIGwyID0gbmV3IExvY2FsZSgiZW4iLCAiQ0EiLCAiV0lOMzIiKTsKQEAgLTkzLDYgKzEzNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldEF2YWlsYWJsZUxvY2FsZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdmFpbGFibGVMb2NhbGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVMb2NhbGVzKCkgewogLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTG9jYWxlIFtdCkBAIC0xMTUsNiArMTY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjZ2V0Q291bnRyeSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvdW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvdW50cnkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudXRpbC5Mb2NhbGUuZ2V0Q291bnRyeSgpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBjb3VudHJ5OiAiICsgdGVzdExvY2FsZS5nZXRDb3VudHJ5KCksCkBAIC0xMjQsNiArMTg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjZ2V0RGVmYXVsdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTG9jYWxlIGphdmEudXRpbC5Mb2NhbGUuZ2V0RGVmYXVsdCgpCiAgICAgICAgIGFzc2VydFRydWUoInJldHVybnMgY29weSIsIExvY2FsZS5nZXREZWZhdWx0KCkgPT0gTG9jYWxlLmdldERlZmF1bHQoKSk7CkBAIC0xMzcsNiArMjA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjZ2V0RGlzcGxheUNvdW50cnkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREaXNwbGF5Q291bnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheUNvdW50cnkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudXRpbC5Mb2NhbGUuZ2V0RGlzcGxheUNvdW50cnkoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgY291bnRyeTogIgpAQCAtMTU3LDYgKzIzNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldERpc3BsYXlDb3VudHJ5KGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERpc3BsYXlDb3VudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheUNvdW50cnlMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS51dGlsLkxvY2FsZS5nZXREaXNwbGF5Q291bnRyeShqYXZhLnV0aWwuTG9jYWxlKQpAQCAtMTY3LDYgKzI1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldERpc3BsYXlMYW5ndWFnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERpc3BsYXlMYW5ndWFnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheUxhbmd1YWdlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnV0aWwuTG9jYWxlLmdldERpc3BsYXlMYW5ndWFnZSgpCkBAIC0xODIsNiArMjc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjZ2V0RGlzcGxheUxhbmd1YWdlKGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERpc3BsYXlMYW5ndWFnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BsYXlMYW5ndWFnZUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnV0aWwuTG9jYWxlLmdldERpc3BsYXlMYW5ndWFnZShqYXZhLnV0aWwuTG9jYWxlKQpAQCAtMTkzLDYgKzI5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldERpc3BsYXlOYW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGlzcGxheU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BsYXlOYW1lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuTG9jYWxlLmdldERpc3BsYXlOYW1lKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IG5hbWU6ICIgKyB0ZXN0TG9jYWxlLmdldERpc3BsYXlOYW1lKCksCkBAIC0yMDIsNiArMzE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjZ2V0RGlzcGxheU5hbWUoamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGlzcGxheU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5TmFtZUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnV0aWwuTG9jYWxlLmdldERpc3BsYXlOYW1lKGphdmEudXRpbC5Mb2NhbGUpCkBAIC0yMTIsNiArMzM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjZ2V0RGlzcGxheVZhcmlhbnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREaXNwbGF5VmFyaWFudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheVZhcmlhbnQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudXRpbC5Mb2NhbGUuZ2V0RGlzcGxheVZhcmlhbnQoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgdmFyaWFudDogIgpAQCAtMjIyLDYgKzM1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldERpc3BsYXlWYXJpYW50KGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERpc3BsYXlWYXJpYW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheVZhcmlhbnRMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS51dGlsLkxvY2FsZS5nZXREaXNwbGF5VmFyaWFudChqYXZhLnV0aWwuTG9jYWxlKQpAQCAtMjMzLDYgKzM3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldElTTzNDb3VudHJ5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SVNPM0NvdW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldElTTzNDb3VudHJ5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuTG9jYWxlLmdldElTTzNDb3VudHJ5KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IElTTzMgY291bnRyeTogIgpAQCAtMjQ2LDYgKzM5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldElTTzNMYW5ndWFnZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElTTzNMYW5ndWFnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SVNPM0xhbmd1YWdlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuTG9jYWxlLmdldElTTzNMYW5ndWFnZSgpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBJU08zIGxhbmd1YWdlOiAiCkBAIC0yNjcsNiArNDI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Mb2NhbGUjZ2V0SVNPQ291bnRyaWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SVNPQ291bnRyaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJU09Db3VudHJpZXMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIFtdCiAgICAgICAgIC8vIGphdmEudXRpbC5Mb2NhbGUuZ2V0SVNPQ291bnRyaWVzKCkKQEAgLTI5MCw2ICs0NTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxvY2FsZSNnZXRJU09MYW5ndWFnZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJU09MYW5ndWFnZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldElTT0xhbmd1YWdlcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10KICAgICAgICAgLy8gamF2YS51dGlsLkxvY2FsZS5nZXRJU09MYW5ndWFnZXMoKQpAQCAtMzA2LDYgKzQ4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldExhbmd1YWdlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGFuZ3VhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExhbmd1YWdlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuTG9jYWxlLmdldExhbmd1YWdlKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGxhbmd1YWdlOiAiICsgdGVzdExvY2FsZS5nZXRMYW5ndWFnZSgpLApAQCAtMzE1LDYgKzUwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI2dldFZhcmlhbnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRWYXJpYW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRWYXJpYW50KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnV0aWwuTG9jYWxlLmdldFZhcmlhbnQoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgdmFyaWFudDogIiArIHRlc3RMb2NhbGUuZ2V0VmFyaWFudCgpLApAQCAtMzI0LDYgKzUyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTG9jYWxlI3NldERlZmF1bHQoamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBTZWN1cml0eUV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVmYXVsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlZmF1bHRMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLkxvY2FsZS5zZXREZWZhdWx0KGphdmEudXRpbC5Mb2NhbGUpCiAKQEAgLTM0NCw2ICs1NDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLkxvY2FsZSN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS51dGlsLkxvY2FsZS50b1N0cmluZygpCiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IHN0cmluZyByZXByZXNlbnRhdGlvbiIsICJlbl9DQV9XSU4zMiIsIHRlc3RMb2NhbGUKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAxMWEzYTk2Li42YWQyMDI0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxNiArMTcsMzIgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uI01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2FsbCBjb25zdHJ1Y3RvciB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCkBAIC00MSw2ICs1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uI2dldENsYXNzTmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENsYXNzTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xhc3NOYW1lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmdldENsYXNzTmFtZSgpCkBAIC01NSw2ICs4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uI2dldEtleSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmdldEtleSgpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvTm9TdWNoRWxlbWVudEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBlOTMzMjI5Li43NTJiOGRlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL05vU3VjaEVsZW1lbnRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE3LDE0ICsxNywyOSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24jTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTmVlZCB0byBjYWxsIGNvbnN0cnVjdG9yIGRpcmVjdGx5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKQogCkBAIC00MSw2ICs1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiNOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjYWxsIGNvbnN0cnVjdG9yIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9PYnNlcnZhYmxlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvT2JzZXJ2YWJsZVRlc3QuamF2YQppbmRleCA2MmExZjBhLi45NTk0NGJiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9PYnNlcnZhYmxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL09ic2VydmFibGVUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxNiBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLk9ic2VydmFibGU7CiBpbXBvcnQgamF2YS51dGlsLk9ic2VydmVyOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoT2JzZXJ2YWJsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgT2JzZXJ2YWJsZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgc3RhdGljIGNsYXNzIFRlc3RPYnNlcnZlciBpbXBsZW1lbnRzIE9ic2VydmVyIHsKQEAgLTc1LDYgKzgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5PYnNlcnZhYmxlI09ic2VydmFibGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJPYnNlcnZhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5PYnNlcnZhYmxlKCkKICAgICAgICAgdHJ5IHsKQEAgLTg5LDYgKzEwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuT2JzZXJ2YWJsZSNhZGRPYnNlcnZlcihqYXZhLnV0aWwuT2JzZXJ2ZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZE9ic2VydmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5PYnNlcnZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRPYnNlcnZlckxqYXZhX3V0aWxfT2JzZXJ2ZXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEudXRpbC5PYnNlcnZhYmxlLmFkZE9ic2VydmVyKGphdmEudXRpbC5PYnNlcnZlcikKQEAgLTExMyw2ICsxMzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLk9ic2VydmFibGUjY291bnRPYnNlcnZlcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb3VudE9ic2VydmVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY291bnRPYnNlcnZlcnMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLk9ic2VydmFibGUuY291bnRPYnNlcnZlcnMoKQogICAgICAgICBhc3NlcnRFcXVhbHMoIk5ldyBvYnNlcnZhYmxlIGhhZCA+IDAgb2JzZXJ2ZXJzIiwgMCwgb2JzZXJ2YWJsZQpAQCAtMTI1LDYgKzE1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuT2JzZXJ2YWJsZSNkZWxldGVPYnNlcnZlcihqYXZhLnV0aWwuT2JzZXJ2ZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgbmVnYXRpdmUgY2FzZTogZGVsZXRlIG5vbi1leGlzdGVudCBvYnNlcnZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWxldGVPYnNlcnZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuT2JzZXJ2ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlT2JzZXJ2ZXJMamF2YV91dGlsX09ic2VydmVyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnV0aWwuT2JzZXJ2YWJsZS5kZWxldGVPYnNlcnZlcihqYXZhLnV0aWwuT2JzZXJ2ZXIpCkBAIC0xMzgsNiArMTgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5PYnNlcnZhYmxlI2RlbGV0ZU9ic2VydmVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlbGV0ZU9ic2VydmVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlT2JzZXJ2ZXJzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuT2JzZXJ2YWJsZS5kZWxldGVPYnNlcnZlcnMoKQogICAgICAgICBvYnNlcnZhYmxlLmFkZE9ic2VydmVyKG5ldyBUZXN0T2JzZXJ2ZXIoKSk7CkBAIC0xNTYsNiArMjA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5PYnNlcnZhYmxlI2hhc0NoYW5nZWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQ2hhbmdlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzQ2hhbmdlZCgpIHsKICAgICAgICAgLy8gVE9ETyA6IEltcGxlbWVudCB0ZXN0CiAgICAgfQpAQCAtMTYzLDYgKzIyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuT2JzZXJ2YWJsZSNub3RpZnlPYnNlcnZlcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub3RpZnlPYnNlcnZlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25vdGlmeU9ic2VydmVycygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLk9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKCkKICAgICAgICAgb2JzZXJ2YWJsZS5hZGRPYnNlcnZlcihvYnNlcnZlciA9IG5ldyBUZXN0T2JzZXJ2ZXIoKSk7CkBAIC0xOTYsNiArMjY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5PYnNlcnZhYmxlI25vdGlmeU9ic2VydmVycyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub3RpZnlPYnNlcnZlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ub3RpZnlPYnNlcnZlcnNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS51dGlsLk9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKGphdmEubGFuZy5PYmplY3QpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Qcmlvcml0eVF1ZXVlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZVRlc3QuamF2YQppbmRleCA2NDdlOGE0Li42ZjM3MjFkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Qcmlvcml0eVF1ZXVlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1ByaW9yaXR5UXVldWVUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0zMSw2ICszNiw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJpb3JpdHlRdWV1ZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUHJpb3JpdHlRdWV1ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSSUFMSVpBVElPTl9GSUxFX05BTUUgPSAiL3NlcmlhbGl6YXRpb24vdGVzdHMvYXBpL2phdmEvdXRpbC9Qcmlvcml0eVF1ZXVlLmdvbGRlbi5zZXIiOyAvLyROT04tTkxTLTEkICAgIApAQCAtMzgsNiArNDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjaXRlcmF0b3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXRlcmF0b3IoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8SW50ZWdlcj4gaW50ZWdlclF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8SW50ZWdlcj4oKTsKICAgICAgICAgSW50ZWdlcltdIGFycmF5ID0geyAyLCA0NSwgNywgLTEyLCA5IH07CkBAIC01OSw2ICs3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNpdGVyYXRvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIml0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pdGVyYXRvcl9lbXB0eSgpIHsKICAgICAgICAgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPiBpbnRlZ2VyUXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPigpOwogICAgICAgICBJdGVyYXRvcjxJbnRlZ2VyPiBpdGVyID0gaW50ZWdlclF1ZXVlLml0ZXJhdG9yKCk7CkBAIC04MSw2ICsxMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjaXRlcmF0b3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2l0ZXJhdG9yX291dG9mYm91bmQoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8SW50ZWdlcj4gaW50ZWdlclF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8SW50ZWdlcj4oKTsKICAgICAgICAgaW50ZWdlclF1ZXVlLm9mZmVyKDApOwpAQCAtMTA3LDYgKzE0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNpdGVyYXRvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIml0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pdGVyYXRvcl9yZW1vdmUoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8SW50ZWdlcj4gaW50ZWdlclF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8SW50ZWdlcj4oKTsKICAgICAgICAgSW50ZWdlcltdIGFycmF5ID0geyAyLCA0NSwgNywgLTEyLCA5IH07CkBAIC0xMzksNiArMTgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI2l0ZXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2l0ZXJhdG9yX3JlbW92ZV9pbGxlZ2FsU3RhdGUoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8SW50ZWdlcj4gaW50ZWdlclF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8SW50ZWdlcj4oKTsKICAgICAgICAgSW50ZWdlcltdIGFycmF5ID0geyAyLCA0NSwgNywgLTEyLCA5IH07CkBAIC0xNjcsNiArMjE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlLnNpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPEludGVnZXI+IGludGVnZXJRdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlPEludGVnZXI+KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBpbnRlZ2VyUXVldWUuc2l6ZSgpKTsKQEAgLTE4MCw2ICsyNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjUHJpb3JpdHlRdWV1ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW9yaXR5UXVldWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPE9iamVjdD4gcXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+KCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwocXVldWUpOwpAQCAtMTkwLDYgKzI1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNQcmlvcml0eVF1ZXVlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpb3JpdHlRdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPE9iamVjdD4gcXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+KDEwMCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwocXVldWUpOwpAQCAtMjAwLDYgKzI3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNQcmlvcml0eVF1ZXVlKGludCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcmlvcml0eVF1ZXVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS51dGlsLkNvbXBhcmF0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfdXRpbF9Db21wYXJhdG9yKCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPE9iamVjdD4gcXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+KDEwMCwKICAgICAgICAgICAgICAgICAoQ29tcGFyYXRvcjxPYmplY3Q+KSBudWxsKTsKQEAgLTIxNyw2ICszMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjUHJpb3JpdHlRdWV1ZShpbnQsIENvbXBhcmF0b3I8PyBzdXBlciBFPikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpb3JpdHlRdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEudXRpbC5Db21wYXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX3V0aWxfQ29tcGFyYXRvcl9pbGxlZ2FsQ2FwYWNpdHkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+KDAsIG5ldyBNb2NrQ29tcGFyYXRvcjxPYmplY3Q+KCkpOwpAQCAtMjM2LDYgKzMzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNQcmlvcml0eVF1ZXVlKGludCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcmlvcml0eVF1ZXVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS51dGlsLkNvbXBhcmF0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfdXRpbF9Db21wYXJhdG9yX2Nhc3QoKSB7CiAgICAgICAgIE1vY2tDb21wYXJhdG9yQ2FzdDxPYmplY3Q+IG9iamVjdENvbXBhcmF0b3IgPSBuZXcgTW9ja0NvbXBhcmF0b3JDYXN0PE9iamVjdD4oKTsKICAgICAgICAgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPiBpbnRlZ2VyUXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPigxMDAsCkBAIC0yNTMsNiArMzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI1ByaW9yaXR5UXVldWUoQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW9yaXR5UXVldWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0NvbGxlY2l0b24oKSB7CiAgICAgICAgIEludGVnZXJbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSB9OwogICAgICAgICBMaXN0PEludGVnZXI+IGxpc3QgPSBBcnJheXMuYXNMaXN0KGFycmF5KTsKQEAgLTI2OCw2ICszODIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjUHJpb3JpdHlRdWV1ZShDb2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW9yaXR5UXVldWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0NvbGxlY2l0b25fbnVsbCgpIHsKICAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwogICAgICAgICBsaXN0LmFkZChuZXcgRmxvYXQoMTEpKTsKQEAgLTI4NCw2ICs0MDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjUHJpb3JpdHlRdWV1ZShDb2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsYXNzQ2FzdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcmlvcml0eVF1ZXVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Db2xsZWNpdG9uX25vbl9jb21wYXJhYmxlKCkgewogICAgICAgICBBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CiAgICAgICAgIGxpc3QuYWRkKG5ldyBGbG9hdCgxMSkpOwpAQCAtMjk5LDYgKzQzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNQcmlvcml0eVF1ZXVlKENvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcmlvcml0eVF1ZXVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Db2xsZWNpdG9uX2Zyb21fcHJpb3JpdHlxdWV1ZSgpIHsKICAgICAgICAgU3RyaW5nW10gYXJyYXkgPSB7ICJBQUFBQSIsICJBQSIsICJBQUFBIiwgIkFBQUFBQUFBIiB9OwogICAgICAgICBQcmlvcml0eVF1ZXVlPFN0cmluZz4gcXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxTdHJpbmc+KDQsCkBAIC0zMTgsNiArNDU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI1ByaW9yaXR5UXVldWUoQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW9yaXR5UXVldWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0NvbGxlY2l0b25fZnJvbV9zb3J0ZWRzZXQoKSB7CiAgICAgICAgIGludFtdIGFycmF5ID0geyAzLCA1LCA3OSwgLTE3LCA1IH07CiAgICAgICAgIFRyZWVTZXQ8SW50ZWdlcj4gdHJlZVNldCA9IG5ldyBUcmVlU2V0PEludGVnZXI+KG5ldyBNb2NrQ29tcGFyYXRvcjxJbnRlZ2VyPigpKTsKQEAgLTMzOCw2ICs0ODgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjUHJpb3JpdHlRdWV1ZShQcmlvcml0eVF1ZXVlPD8gKiBleHRlbmRzCiAgICAgICogICAgICAgIEU+KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsYXNzQ2FzdEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpb3JpdHlRdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfUHJpb3JpdHlRdWV1ZSgpIHsKICAgICAgICAgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPiBpbnRlZ2VyUXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPigpOwogICAgICAgICBpbnRbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSB9OwpAQCAtMzU4LDYgKzUxNywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNQcmlvcml0eVF1ZXVlKFByaW9yaXR5UXVldWU8PyAqIGV4dGVuZHMKICAgICAgKiAgICAgICAgRT4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpb3JpdHlRdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfUHJpb3JpdHlRdWV1ZV9udWxsKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IFByaW9yaXR5UXVldWU8T2JqZWN0PigoUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPikgbnVsbCk7CkBAIC0zNzAsNiArNTM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI1ByaW9yaXR5UXVldWUoU29ydGVkU2V0PD8gZXh0ZW5kcyBFPikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24sIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaW9yaXR5UXVldWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNvcnRlZFNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfU29ydGVkU2V0KCkgewogICAgICAgICBpbnRbXSBhcnJheSA9IHsgMywgNSwgNzksIC0xNywgNSB9OwogICAgICAgICBUcmVlU2V0PEludGVnZXI+IHRyZWVTZXQgPSBuZXcgVHJlZVNldDxJbnRlZ2VyPigpOwpAQCAtMzg2LDYgKzU2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNQcmlvcml0eVF1ZXVlKFNvcnRlZFNldDw/IGV4dGVuZHMgRT4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpb3JpdHlRdWV1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU29ydGVkU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Tb3J0ZWRTZXRfbnVsbCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBQcmlvcml0eVF1ZXVlPEludGVnZXI+KChTb3J0ZWRTZXQ8PyBleHRlbmRzIEludGVnZXI+KSBudWxsKTsKQEAgLTM5OCw2ICs1ODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjb2ZmZXIoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2ZmZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29mZmVyTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8U3RyaW5nPiBxdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlPFN0cmluZz4oMTAsCiAgICAgICAgICAgICAgICAgbmV3IE1vY2tDb21wYXJhdG9yU3RyaW5nQnlMZW5ndGgoKSk7CkBAIC00MTYsNiArNjExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI29mZmVyKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb2ZmZXJMamF2YV9sYW5nX09iamVjdF9udWxsKCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPE9iamVjdD4gcXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+KCk7CiAgICAgICAgIHRyeSB7CkBAIC00MjksNiArNjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI29mZmVyKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2ZmZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29mZmVyX0xqYXZhX2xhbmdfT2JqZWN0X25vbl9Db21wYXJhYmxlKCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPE9iamVjdD4gcXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+KCk7CiAgICAgICAgIHF1ZXVlLm9mZmVyKG5ldyBJbnRlZ2VyKDEwKSk7CkBAIC00NTIsNiArNjY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI3BvbGwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BvbGwoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8U3RyaW5nPiBzdHJpbmdRdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlPFN0cmluZz4oKTsKICAgICAgICAgU3RyaW5nW10gYXJyYXkgPSB7ICJNWVRFU1RTVFJJTkciLCAiQUFBQUEiLCAiQkNERUYiLCAia3NUUkQiLCAiQUFBQUEiIH07CkBAIC00NjksNiArNjkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI3BvbGwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvbGwgbWV0aG9kIGZvciBlbXB0eSBxdWV1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb2xsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb2xsX2VtcHR5KCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPE9iamVjdD4gcXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBxdWV1ZS5zaXplKCkpOwpAQCAtNDc4LDYgKzcwOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNwZWVrKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGVlayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGVlaygpIHsKICAgICAgICAgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPiBpbnRlZ2VyUXVldWUgPSBuZXcgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPigpOwogICAgICAgICBpbnRbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSB9OwpAQCAtNDkyLDYgKzczMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNwZWVrKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwZWVrIG1ldGhvZCBmb3IgZW1wdHkgcXVldWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGVlayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGVla19lbXB0eSgpIHsKICAgICAgICAgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+IHF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8T2JqZWN0PigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcXVldWUuc2l6ZSgpKTsKQEAgLTUwMiw2ICs3NTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjQ2xlYXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xlYXIoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8SW50ZWdlcj4gaW50ZWdlclF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8SW50ZWdlcj4oKTsKICAgICAgICAgaW50W10gYXJyYXkgPSB7IDIsIDQ1LCA3LCAtMTIsIDkgfTsKQEAgLTUxNSw2ICs3NzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjYWRkKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbiwgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkX0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBQcmlvcml0eVF1ZXVlPEludGVnZXI+IGludGVnZXJRdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlPEludGVnZXI+KCk7CiAgICAgICAgIEludGVnZXJbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSB9OwpAQCAtNTMyLDYgKzc5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNhZGQoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkX0xqYXZhX2xhbmdfT2JqZWN0X251bGwoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8T2JqZWN0PiBxdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlPE9iamVjdD4oKTsKICAgICAgICAgdHJ5IHsKQEAgLTU0NSw2ICs4MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjYWRkKE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRfTGphdmFfbGFuZ19PYmplY3Rfbm9uX0NvbXBhcmFibGUoKSB7CiAgICAgICAgIFByaW9yaXR5UXVldWU8T2JqZWN0PiBxdWV1ZSA9IG5ldyBQcmlvcml0eVF1ZXVlPE9iamVjdD4oKTsKICAgICAgICAgcXVldWUuYWRkKG5ldyBJbnRlZ2VyKDEwKSk7CkBAIC01NjksNiArODU0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlI3JlbW92ZShPYmplY3QpCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlX0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBJbnRlZ2VyW10gYXJyYXkgPSB7IDIsIDQ1LCA3LCAtMTIsIDksIDIzLCAxNywgMTExOCwgMTAsIDE2LCAzOSB9OwogICAgICAgICBMaXN0PEludGVnZXI+IGxpc3QgPSBBcnJheXMuYXNMaXN0KGFycmF5KTsKQEAgLTU4Niw2ICs4ODAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjcmVtb3ZlKE9iamVjdCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVfTGphdmFfbGFuZ19PYmplY3RfdXNpbmdfY29tcGFyYXRvcigpIHsKICAgICAgICAgUHJpb3JpdHlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8U3RyaW5nPigxMCwKICAgICAgICAgICAgICAgICBuZXcgTW9ja0NvbXBhcmF0b3JTdHJpbmdCeUxlbmd0aCgpKTsKQEAgLTYwMSw2ICs5MDQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByaW9yaXR5UXVldWUjcmVtb3ZlKE9iamVjdCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlX0xqYXZhX2xhbmdfT2JqZWN0X25vdF9leGlzdHMoKSB7CiAgICAgICAgIEludGVnZXJbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSwgMjMsIDE3LCAxMTE4LCAxMCwgMTYsIDM5IH07CiAgICAgICAgIExpc3Q8SW50ZWdlcj4gbGlzdCA9IEFycmF5cy5hc0xpc3QoYXJyYXkpOwpAQCAtNjE5LDYgKzkzMSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNyZW1vdmUoT2JqZWN0KQogICAgICAqIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlX0xqYXZhX2xhbmdfT2JqZWN0X251bGwoKSB7CiAgICAgICAgIEludGVnZXJbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSwgMjMsIDE3LCAxMTE4LCAxMCwgMTYsIDM5IH07CiAgICAgICAgIExpc3Q8SW50ZWdlcj4gbGlzdCA9IEFycmF5cy5hc0xpc3QoYXJyYXkpOwpAQCAtNjMwLDYgKzk1MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNyZW1vdmUoT2JqZWN0KQogICAgICAqIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsYXNzQ2FzdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVfTGphdmFfbGFuZ19PYmplY3Rfbm90X0NvbXBhdGlibGUoKSB7CiAgICAgICAgIEludGVnZXJbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSwgMjMsIDE3LCAxMTE4LCAxMCwgMTYsIDM5IH07CiAgICAgICAgIExpc3Q8SW50ZWdlcj4gbGlzdCA9IEFycmF5cy5hc0xpc3QoYXJyYXkpOwpAQCAtNjYzLDYgKzk5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSNjb21wYXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyYXRvcigpIHsKICAgICAgICAgUHJpb3JpdHlRdWV1ZTxPYmplY3Q+IHF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8T2JqZWN0PigpOwogICAgICAgICBhc3NlcnROdWxsKHF1ZXVlLmNvbXBhcmF0b3IoKSk7CkBAIC02NzUsNiArMTAxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEludGVnZXJbXSBhcnJheSA9IHsgMiwgNDUsIDcsIC0xMiwgOSwgMjMsIDE3LCAxMTE4LCAxMCwgMTYsIDM5IH07CiAgICAgICAgIExpc3Q8SW50ZWdlcj4gbGlzdCA9IEFycmF5cy5hc0xpc3QoYXJyYXkpOwpAQCAtNjkyLDYgKzEwNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9TZXJpYWxpemF0aW9uX2Nhc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSW50ZWdlcltdIGFycmF5ID0geyAyLCA0NSwgNywgLTEyLCA5LCAyMywgMTcsIDExMTgsIDEwLCAxNiwgMzkgfTsKICAgICAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0ID0gQXJyYXlzLmFzTGlzdChhcnJheSk7CkBAIC03MDksNiArMTA2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHlfY2FzdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJbnRlZ2VyW10gYXJyYXkgPSB7IDIsIDQ1LCA3LCAtMTIsIDksIDIzLCAxNywgMTExOCwgMTAsIDE2LCAzOSB9OwogICAgICAgICBMaXN0PEludGVnZXI+IGxpc3QgPSBBcnJheXMuYXNMaXN0KGFycmF5KTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1Byb3BlcnRpZXNUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzVGVzdC5qYXZhCmluZGV4IDNjN2QzZDEuLjQ5N2VjNzYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1Byb3BlcnRpZXNUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUHJvcGVydGllc1Rlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI4LDYgKzMzLDcgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvcGVydGllcy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUHJvcGVydGllc1Rlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgUHJvcGVydGllcyB0UHJvcHM7CkBAIC0zNyw2ICs0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJvcGVydGllcyNQcm9wZXJ0aWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvcGVydGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB0byBhdm9pZCBnZXR0aW5nIGEgdmFyaWFibGUgdW51c2VkIHdhcm5pbmcKQEAgLTQ2LDYgKzYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI1Byb3BlcnRpZXMoamF2YS51dGlsLlByb3BlcnRpZXMpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3BlcnRpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlByb3BlcnRpZXMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX1Byb3BlcnRpZXMoKSB7CiAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVuZG9yIikgIT0gbnVsbCkgewogICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CkBAIC01Nyw2ICs4MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJvcGVydGllcyNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3BlcnR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEaWQgbm90IHJldHJpZXZlIHByb3BlcnR5IiwgInRoaXMgaXMgYSB0ZXN0IHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICB0UHJvcHMuZ2V0UHJvcGVydHkoInRlc3QucHJvcCIpKTsKQEAgLTY2LDYgKzk5LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm9wZXJ0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEaWQgbm90IHJldHJpZXZlIHByb3BlcnR5IiwgInRoaXMgaXMgYSB0ZXN0IHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICB0UHJvcHMuZ2V0UHJvcGVydHkoInRlc3QucHJvcCIsICJCbGFyZyIpKTsKQEAgLTc2LDYgKzExOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJvcGVydGllcyNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm9wZXJ0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmcyKCkgewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMzUxOAogICAgICAgICBNeVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgTXlQcm9wZXJ0aWVzKCk7CkBAIC04Niw2ICsxMzcsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByb3BlcnRpZXMjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvcGVydHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcyKCkgewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMzUxOAogICAgICAgICBNeVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgTXlQcm9wZXJ0aWVzKCk7CkBAIC0xMDIsNiArMTYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI2xpc3QoamF2YS5pby5QcmludFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGlzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlByaW50U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xpc3RMamF2YV9pb19QcmludFN0cmVhbSgpIHsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MpOwpAQCAtMTIwLDYgKzE4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJvcGVydGllcyNsaXN0KGphdmEuaW8uUHJpbnRXcml0ZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5QcmludFdyaXRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9saXN0TGphdmFfaW9fUHJpbnRXcml0ZXIoKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihiYW9zKTsKQEAgLTEzOSw2ICsyMTcsMTYgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI2xvYWQoamF2YS5pby5JbnB1dFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiAiICsKKyAgICAgICAgICAgICAgIkFsc28gZG9lc24ndCB0ZXN0IG1hbnkgY2FzZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9hZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgcHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHdyaXRlUHJvcGVydGllcygpKTsKQEAgLTE4Myw2ICsyNzEsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI2xvYWQoamF2YS5pby5JbnB1dFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb2FkTGphdmFfaW9fSW5wdXRTdHJlYW1fc3VidGVzdDAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFN1cHBvcnRfUmVzb3VyY2VzCiAgICAgICAgICAgICAgICAgLmdldFN0cmVhbSgiaHl0c19Qcm9wZXJ0aWVzVGVzdC5wcm9wZXJ0aWVzIik7CkBAIC0yMDcsNyArMzA0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI3Byb3BlcnR5TmFtZXMoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJvcGVydHlOYW1lcygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcm9wZXJ0eU5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgZygpIHsKICAgICAgICAgRW51bWVyYXRpb24gbmFtZXMgPSB0UHJvcHMucHJvcGVydHlOYW1lcygpOwogICAgICAgICB3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgIFN0cmluZyBwID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKQEAgLTIyMCw2ICszMjYsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI3NhdmUoamF2YS5pby5PdXRwdXRTdHJlYW0sIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNhdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUxqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnRpZXMgbXlQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0yNDgsNiArMzYzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFByb3BlcnR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJvcGVydHlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBQcm9wZXJ0aWVzIG15UHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBteVByb3BzLnNldFByb3BlcnR5KCJZb2luayIsICJZYWJiYSIpOwpAQCAtMjYyLDYgKzM4NiwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByb3BlcnRpZXMjc3RvcmUoamF2YS5pby5PdXRwdXRTdHJlYW0sIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSU9FeGNlcHRpb24sIENsYXNzQ2FzdEV4Y2VwdGlvbiwgIiArIAorICAgICAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0b3JlTGphdmFfaW9fT3V0cHV0U3RyZWFtTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBteVByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKQEAgLTI5MCw2ICs0MjQsMTcgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0aWVzI2xvYWRGcm9tWE1MKGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSU9FeGNlcHRpb24sICIgKworICAgICAgICAgICAgIkludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uICIgKyAKKyAgICAgICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2FkRnJvbVhNTCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvYWRGcm9tWE1MTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHByb3AgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh3cml0ZVByb3BlcnRpZXNYTUwoIlVURi04IikpOwpAQCAtMzE3LDYgKzQ2MiwxNiBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJvcGVydGllcyNzdG9yZVRvWE1MKGphdmEuaW8uT3V0cHV0U3RyZWFtLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElPRXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdG9yZVRvWE1MIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RvcmVUb1hNTExqYXZhX2lvX091dHB1dFN0cmVhbUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBteVByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1Byb3BlcnR5UGVybWlzc2lvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1Byb3BlcnR5UGVybWlzc2lvblRlc3QuamF2YQppbmRleCA1MWU3Yjc5Li4wNTA0YjY1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0eVBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUHJvcGVydHlQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247CkBAIC0yNCw2ICsyOSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhQcm9wZXJ0eVBlcm1pc3Npb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFByb3BlcnR5UGVybWlzc2lvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgc3RhdGljIFByb3BlcnR5UGVybWlzc2lvbiBqYXZhUFAgPSBuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLioiLCAicmVhZCIpOwpAQCAtMzUsNiArNDEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiNQcm9wZXJ0eVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvcGVydHlQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQpAQCAtNDQsNiArNTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24uZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCkBAIC02Niw2ICs5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uI2dldEFjdGlvbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3Rpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBY3Rpb25zKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uLmdldEFjdGlvbnMoKQpAQCAtNzgsNiArMTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24jaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbi5oYXNoQ29kZSgpCiAgICAgICAgIGFzc2VydFRydWUoImphdmFQUCByZXR1cm5lZCB3cm9uZyBoYXNoQ29kZSIsCkBAIC04OSw2ICsxMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW1wbGllc0xqYXZhX3NlY3VyaXR5X1Blcm1pc3Npb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24uaW1wbGllcyhqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCkBAIC0xMTMsNiArMTY0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24jbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uCiAgICAgICAgIC8vIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24ubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQpAQCAtMTI4LDYgKzE4OCwxOSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uI3JlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0pCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24jd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKICAgICAgICAgUHJvcGVydHlQZXJtaXNzaW9uIHBwID0gbmV3IFByb3BlcnR5UGVybWlzc2lvbigidGVzdCIsICJyZWFkIik7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYocHAsIGNvbXBhcmF0b3IpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUHJvcGVydHlSZXNvdXJjZUJ1bmRsZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1Byb3BlcnR5UmVzb3VyY2VCdW5kbGVUZXN0LmphdmEKaW5kZXggN2FiM2M1YS4uZTA4NDZiNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUHJvcGVydHlSZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0eVJlc291cmNlQnVuZGxlVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMTcgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvcGVydHlSZXNvdXJjZUJ1bmRsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgc3RhdGljIFByb3BlcnR5UmVzb3VyY2VCdW5kbGUgcHJiOwpAQCAtMjksNiArMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGUjUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShqYXZhLmlvLklucHV0U3RyZWFtKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBpbiBzZXRVcCBtZXRob2QgZG9lc24ndCBjaGVjayBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcm9wZXJ0eVJlc291cmNlQnVuZGxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlKGphdmEuaW8uSW5wdXRTdHJlYW0pCiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGUjZ2V0S2V5cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEtleXMoKSB7CiAgICAgICAgIEVudW1lcmF0aW9uIGtleUVudW0gPSBwcmIuZ2V0S2V5cygpOwogICAgICAgICBWZWN0b3IgdGVzdCA9IG5ldyBWZWN0b3IoKTsKQEAgLTU0LDYgKzc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlI2hhbmRsZUdldE9iamVjdChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYW5kbGVHZXRPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYW5kbGVHZXRPYmplY3RMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGUuaGFuZGxlR2V0T2JqZWN0KGphdmEubGFuZy5TdHJpbmcpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SYW5kb21UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SYW5kb21UZXN0LmphdmEKaW5kZXggMTRiYzI4YS4uNjJmMDNjMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUmFuZG9tVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1JhbmRvbVRlc3QuamF2YQpAQCAtMTcsOCArMTcsMTQgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUmFuZG9tLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBSYW5kb21UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIFJhbmRvbSByOwpAQCAtMjYsNiArMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlJhbmRvbSNSYW5kb20oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSYW5kb20iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlJhbmRvbSgpCiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlJhbmRvbSNSYW5kb20obG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUmFuZG9tIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JKKCkgewogICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oODQwOTIzOEwpOwogICAgICAgICBSYW5kb20gcjIgPSBuZXcgUmFuZG9tKDg0MDkyMzhMKTsKQEAgLTQ1LDYgKzY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5SYW5kb20jbmV4dEJvb2xlYW4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0Qm9vbGVhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dEJvb2xlYW4oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5SYW5kb20ubmV4dEJvb2xlYW4oKQogICAgICAgICBib29sZWFuIGZhbHNlQXBwZWFyZWQgPSBmYWxzZSwgdHJ1ZUFwcGVhcmVkID0gZmFsc2U7CkBAIC02Miw2ICs5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUmFuZG9tI25leHRCeXRlcyhieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRCeXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dEJ5dGVzJEIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5SYW5kb20ubmV4dEJ5dGVzKGJ5dGUgW10pCiAgICAgICAgIGJvb2xlYW4gc29tZURpZmZlcmVudCA9IGZhbHNlOwpAQCAtNzksNiArMTIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5SYW5kb20jbmV4dERvdWJsZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHREb3VibGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS51dGlsLlJhbmRvbS5uZXh0RG91YmxlKCkKICAgICAgICAgZG91YmxlIGxhc3ROdW0gPSByLm5leHREb3VibGUoKTsKQEAgLTEwMyw2ICsxNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlJhbmRvbSNuZXh0RmxvYXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRGbG9hdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGZsb2F0IGphdmEudXRpbC5SYW5kb20ubmV4dEZsb2F0KCkKICAgICAgICAgZmxvYXQgbGFzdE51bSA9IHIubmV4dEZsb2F0KCk7CkBAIC0xMjYsNiArMTg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5SYW5kb20jbmV4dEdhdXNzaWFuKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dEdhdXNzaWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0R2F1c3NpYW4oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS51dGlsLlJhbmRvbS5uZXh0R2F1c3NpYW4oKQogICAgICAgICBkb3VibGUgbGFzdE51bSA9IHIubmV4dEdhdXNzaWFuKCk7CkBAIC0xNTAsNiArMjE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5SYW5kb20jbmV4dEludCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRJbnQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLlJhbmRvbS5uZXh0SW50KCkKICAgICAgICAgaW50IGxhc3ROdW0gPSByLm5leHRJbnQoKTsKQEAgLTE2OCw2ICsyNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlJhbmRvbSNuZXh0SW50KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dEludEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLlJhbmRvbS5uZXh0SW50KGludCkKICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gMTA7CkBAIC0xOTQsNiArMjgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5SYW5kb20jbmV4dExvbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dExvbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBsb25nIGphdmEudXRpbC5SYW5kb20ubmV4dExvbmcoKQogICAgICAgICBsb25nIGxhc3ROdW0gPSByLm5leHRMb25nKCk7CkBAIC0yMTIsNiArMzA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5SYW5kb20jc2V0U2VlZChsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTZWVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VlZEooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5SYW5kb20uc2V0U2VlZChsb25nKQogICAgICAgICBsb25nW10gcmFuZG9tQXJyYXkgPSBuZXcgbG9uZ1sxMDBdOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUmVzb3VyY2VCdW5kbGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQppbmRleCA2OWU5ZWRlLi5mODg5MTk3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwpAQCAtMzAsMTIgKzM1LDIyIEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKIGltcG9ydCB0ZXN0cy5hcGkuamF2YS51dGlsLnN1cHBvcnQuQjsKIAorQFRlc3RUYXJnZXRDbGFzcyhSZXNvdXJjZUJ1bmRsZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUjZ2V0QnVuZGxlKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCdW5kbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCdW5kbGVMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CiAgICAgICAgIFN0cmluZyBuYW1lID0gInRlc3RzLnN1cHBvcnQuU3VwcG9ydF9UZXN0UmVzb3VyY2UiOwpAQCAtOTcsNyArMTEyLDE3IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSNnZXRCdW5kbGUoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS51dGlsLkxvY2FsZSwgamF2YS5sYW5nLkNsYXNzTG9hZGVyKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QnVuZGxlTGphdmFfbGFuZ19TdHJpbmdMamF2YV91dGlsX0xvY2FsZUxqYXZhX2xhbmdfQ2xhc3NMb2FkZXIoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24sIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCdW5kbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS51dGlsLkxvY2FsZS5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEJ1bmRsZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfdXRpbF9Mb2NhbGVMamF2YV9sYW5nX0NsYXNzTG9hZGVyKCkgewogICAgICAgICBTdHJpbmcgY2xhc3NQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOwogICAgICAgICBWZWN0b3IgdXJsVmVjID0gbmV3IFZlY3RvcigpOwpAQCAtMTM4LDYgKzE2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUjZ2V0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCdW5kbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlOwogICAgICAgICBTdHJpbmcgbmFtZSA9ICJ0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfVGVzdFJlc291cmNlIjsKQEAgLTE1OCw3ICsxOTIsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyB2YWx1ZSBjaGlsZDEiLCAKICAgICAgICAgICAgICAgICAiZnJGUlZBUkNoaWxkVmFsdWUxIiwgYnVuZGxlLmdldFN0cmluZygiY2hpbGQxIikpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QnVuZGxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QnVuZGxlX2dldENsYXNzTmFtZSgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTE3NTkKICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5HRVJNQU47CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TY2FubmVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvU2Nhbm5lclRlc3QuamF2YQppbmRleCBkOTMzNTYxLi40MWE4M2FlIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TY2FubmVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1NjYW5uZXJUZXN0LmphdmEKQEAgLTE1LDYgKzE1LDExIEBACiAgKi8KIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC00OSw2ICs1NCw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU2Nhbm5lci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU2Nhbm5lclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIFNjYW5uZXIgczsKQEAgLTc4LDYgKzg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI1NjYW5uZXIoRmlsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2Nhbm5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiVGVzdEZpbGVGb3JTY2FubmVyIiwgIi50bXAiKTsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKHRtcEZpbGUpOwpAQCAtMTEzLDYgKzEyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNTY2FubmVyKEZpbGUsIFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2Nhbm5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19GaWxlTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiVGVzdEZpbGVGb3JTY2FubmVyIiwgIi50bXAiKTsKQEAgLTE4Niw2ICsyMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjU2Nhbm5lcihJbnB1dFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2Nhbm5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcihuZXcgUGlwZWRJbnB1dFN0cmVhbSgpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsKQEAgLTIwNSw2ICsyMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjU2Nhbm5lcihJbnB1dFN0cmVhbSwgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTY2FubmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBzID0gbmV3IFNjYW5uZXIobmV3IFBpcGVkSW5wdXRTdHJlYW0oKSwgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpLm5hbWUoKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwocyk7CkBAIC0yMzcsNiArMjc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI1NjYW5uZXIoUmVhZGFibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNjYW5uZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlJlYWRhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19SZWFkYWJsZSgpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKG5ldyBTdHJpbmdSZWFkZXIoInRlc3Qgc3RyaW5nIikpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHMpOwpAQCAtMjU0LDYgKzMwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNTY2FubmVyKFJlYWRhYmxlQnl0ZUNoYW5uZWwpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNjYW5uZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25pb19jaGFubmVsc19SZWFkYWJsZUJ5dGVDaGFubmVsKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIlRlc3RGaWxlRm9yU2Nhbm5lciIsICIudG1wIik7CkBAIC0yNzcsNiArMzM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI1NjYW5uZXIoUmVhZGFibGVCeXRlQ2hhbm5lbCwgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTY2FubmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uaW9fY2hhbm5lbHNfUmVhZGFibGVCeXRlQ2hhbm5lbExqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIlRlc3RGaWxlRm9yU2Nhbm5lciIsICIudG1wIik7CkBAIC0zMjQsNiArMzkzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI1NjYW5uZXIoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTY2FubmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJ0ZXN0IHN0cmluZyIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHMpOwpAQCAtMzQxLDYgKzQxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNjbG9zZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIlRlc3RGaWxlRm9yU2Nhbm5lciIsICIudG1wIik7CiAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wRmlsZSk7CkBAIC0zNjksNiArNDU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2lvRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW9FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lvRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0Nsb3NlYWJsZSBtYyA9IG5ldyBNb2NrQ2xvc2VhYmxlKCk7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcihtYyk7CkBAIC0zODIsNiArNDc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2RlbGltaXRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlbGltaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVsaW1pdGVyKCkgewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoInRlc3QiKTsKICAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gcy5kZWxpbWl0ZXIoKTsKQEAgLTM5MSw2ICs0OTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjdXNlRGVsaW1pdGVyKFBhdHRlcm4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVzZURlbGltaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91c2VEZWxpbWl0ZXJfTFBhdHRlcm4oKSB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigidGVzdCIpOwogICAgICAgICBzLnVzZURlbGltaXRlcihQYXR0ZXJuLmNvbXBpbGUoIlxcdysiKSk7CkBAIC00MDQsNiArNTE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI3VzZURlbGltaXRlcihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVzZURlbGltaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VzZURlbGltaXRlcl9TdHJpbmcoKSB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigidGVzdCIpOwogICAgICAgICB0cnkgewpAQCAtNDIxLDYgKzU0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNsb2NhbGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2NhbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2FsZSgpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJ0ZXN0Iik7CiAgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGUuZ2V0RGVmYXVsdCgpLCBzLmxvY2FsZSgpKTsKQEAgLTQyOSw2ICs1NjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjdXNlTG9jYWxlKExvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXNlTG9jYWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdXNlTG9jYWxlX0xMb2NhbGUoKSB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigidGVzdCIpOwogICAgICAgICB0cnkgewpAQCAtNDQ1LDYgKzU4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNyYWRpeCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJhZGl4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yYWRpeCgpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJ0ZXN0Iik7CiAgICAgICAgIGFzc2VydEVxdWFscygxMCwgcy5yYWRpeCgpKTsKQEAgLTQ1Myw2ICs2MDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjdXNlUmFkaXgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1c2VSYWRpeCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdXNlUmFkaXhfSSgpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJ0ZXN0Iik7CiAgICAgICAgIHRyeSB7CkBAIC00NzQsNiArNjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI3JlbW92ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlKCkgewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoImFhYipiKiIpLnVzZURlbGltaXRlcigiXFwqIik7CiAgICAgICAgIHRyeSB7CkBAIC00ODcsNiArNjU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI21hdGNoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF0Y2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21hdGNoKCkgewogICAgICAgICBNYXRjaFJlc3VsdCByZXN1bHQgOwogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEgMiAiKTsKQEAgLTYxNiw2ICs3OTMsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI25leHQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHVzZSBzcGVjaWFsIGRlbGltaXRlcgogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEqKjIiKS51c2VEZWxpbWl0ZXIoIlxcKiIpOwpAQCAtNzc4LDYgKzk2NCwxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dChQYXR0ZXJuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0TFBhdHRlcm4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBQYXR0ZXJuIHBhdHRlcm47CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigiYWFiKjIqIikudXNlRGVsaW1pdGVyKCJcXCoiKTsKQEAgLTgzMiw2ICsxMDI3LDE1IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNuZXh0KFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0TFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigiYiphKiIpLnVzZURlbGltaXRlcigiXFwqIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHMubmV4dCgiYSpiIikpOwpAQCAtODgwLDYgKzEwODQsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI25leHRCb29sZWFuKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0Qm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGNhc2UgaW5zZW5zaXRpdmUKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJUUnVlIik7CkBAIC05MzgsNyArMTE1MSwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dEludChpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9uZXh0SW50SSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfbmV4dEludEkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0SW50KDEwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyg0NTYsIHMubmV4dEludCgxMCkpOwpAQCAtMTEzMiw3ICsxMzU0LDE2IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNuZXh0SW50KCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X25leHRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0SW50KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoNDU2LCBzLm5leHRJbnQoKSk7CkBAIC0xMzE3LDYgKzE1NDgsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI25leHRCeXRlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0Qnl0ZUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyAxMjYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0Qnl0ZSgxMCkpOwpAQCAtMTM5Niw2ICsxNjM2LDE1IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNuZXh0Qnl0ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0Qnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyAxMjYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0Qnl0ZSgpKTsKQEAgLTE0NzgsNyArMTcyNywxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dEZsb2F0KCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9uZXh0RmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NVx1MDY2Ni4gMTIzLjQgLjEyMyAiKTsKICAgICAgICAgcy51c2VMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwogICAgICAgICBhc3NlcnRFcXVhbHMoKGZsb2F0KTEyMy4wLCBzLm5leHRGbG9hdCgpKTsKQEAgLTE1NzMsNyArMTgzMSwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dEJpZ0ludGVnZXIoaW50KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dEJpZ0ludGVnZXJJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRCaWdJbnRlZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfbmV4dEJpZ0ludGVnZXJJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMTIzIiksIHMubmV4dEJpZ0ludGVnZXIoMTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCI0NTYiKSwgcy5uZXh0QmlnSW50ZWdlcigxMCkpOwpAQCAtMTcwNyw3ICsxOTc0LDE2IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNuZXh0QmlnSW50ZWdlcigpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9uZXh0QmlnSW50ZWdlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0QmlnSW50ZWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X25leHRCaWdJbnRlZ2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMTIzIiksIHMubmV4dEJpZ0ludGVnZXIoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiNDU2IiksIHMubmV4dEJpZ0ludGVnZXIoKSk7CkBAIC0xODQ0LDcgKzIxMjAsMTYgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI25leHRTaG9ydChpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9uZXh0U2hvcnRJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X25leHRTaG9ydEkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0U2hvcnQoMTApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQ1Niwgcy5uZXh0U2hvcnQoMTApKTsKQEAgLTE5ODcsNyArMjI3MiwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dFNob3J0KCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0U2hvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9uZXh0U2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0U2hvcnQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyg0NTYsIHMubmV4dFNob3J0KCkpOwpAQCAtMjEzMyw3ICsyNDI3LDE2IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNuZXh0TG9uZyhpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9uZXh0TG9uZ0koKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9uZXh0TG9uZ0koKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0TG9uZygxMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoNDU2LCBzLm5leHRMb25nKDEwKSk7CkBAIC0yMjc2LDcgKzI1NzksMTYgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI25leHRMb25nKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfbmV4dExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0TG9uZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQ1Niwgcy5uZXh0TG9uZygpKTsKQEAgLTI0MjIsNiArMjczNCwxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEjIzIiKS51c2VEZWxpbWl0ZXIoIlxcIyIpOwogICAgICAgICBhc3NlcnRUcnVlKHMuaGFzTmV4dCgpKTsKQEAgLTI1MDAsNiArMjgyMSwxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dChQYXR0ZXJuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNOZXh0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRMUGF0dGVybigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFBhdHRlcm4gcGF0dGVybjsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJhYWJAMkBhYmJAIikudXNlRGVsaW1pdGVyKCJcXEAiKTsKQEAgLTI1NzcsNiArMjkwNywxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dChTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNOZXh0TFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigiYWFiQDJAYWJiQCIpLnVzZURlbGltaXRlcigiXFxAIik7CiAgICAgICAgIHRyeSB7CkBAIC0yNjQ3LDYgKzI5ODYsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRCb29sZWFuKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNOZXh0Qm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJUUnVlIik7CkBAIC0yNjk0LDYgKzMwNDIsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRCeXRlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHRCeXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNOZXh0Qnl0ZUkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyAxMjYiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzLmhhc05leHRCeXRlKDEwKSk7CkBAIC0yNzg5LDYgKzMxNDYsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRCeXRlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dEJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRCeXRlSV9jYWNoZSgpIHRocm93cyBJT0V4Y2VwdGlvbnsKICAgICAgICAgLy9yZWdyZXNzaW9uIGZvciBIQVJNT05ZLTIwNjMKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDUiKTsKQEAgLTI4MjEsNiArMzE4NywxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dEJ5dGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dEJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgMTI2Iik7CiAgICAgICAgIGFzc2VydFRydWUocy5oYXNOZXh0Qnl0ZSgpKTsKQEAgLTI5MTgsNyArMzI5MywxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dEJpZ0ludGVnZXIoaW50KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzTmV4dEJpZ0ludGVnZXJJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHRCaWdJbnRlZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzTmV4dEJpZ0ludGVnZXJJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CiAgICAgICAgIGFzc2VydFRydWUocy5oYXNOZXh0QmlnSW50ZWdlcigxMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjEyMyIpLCBzLm5leHRCaWdJbnRlZ2VyKDEwKSk7CkBAIC0zMDc4LDYgKzM0NjIsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRCaWdJbnRlZ2VyKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dEJpZ0ludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRCaWdJbnRlZ2VySV9jYWNoZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vcmVncmVzc2lvbiBmb3IgSEFSTU9OWS0yMDYzCiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigiMTIzIDEyMzQ1Njc4OTEyMzQ1Njc4OSIpOwpAQCAtMzExMSw3ICszNTA0LDE2IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNoYXNOZXh0QmlnSW50ZWdlcigpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNOZXh0QmlnSW50ZWdlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNOZXh0QmlnSW50ZWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2hhc05leHRCaWdJbnRlZ2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CiAgICAgICAgIGFzc2VydFRydWUocy5oYXNOZXh0QmlnSW50ZWdlcigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIxMjMiKSwgcy5uZXh0QmlnSW50ZWdlcigpKTsKQEAgLTMyNzMsNyArMzY3NSwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dEludChpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNOZXh0SW50SSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNOZXh0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzTmV4dEludEkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0SW50KDEwKSk7CiAgICAgICAgIGFzc2VydFRydWUocy5oYXNOZXh0SW50KDEwKSk7CkBAIC0zNDUzLDYgKzM4NjQsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRJbnQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRJbnRJX2NhY2hlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy9yZWdyZXNzaW9uIGZvciBIQVJNT05ZLTIwNjMKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CkBAIC0zNDg3LDcgKzM5MDcsMTYgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRJbnQoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzTmV4dEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNOZXh0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzTmV4dEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigiMTIzIDQ1NiIpOwogICAgICAgICBhc3NlcnRUcnVlKHMuaGFzTmV4dEludCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0SW50KCkpOwpAQCAtMzY1NCw3ICs0MDgzLDE2IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNoYXNOZXh0RmxvYXQoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzTmV4dEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzTmV4dEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDVcdTA2NjYuIDEyMy40IC4xMjMgIik7CiAgICAgICAgIHMudXNlTG9jYWxlKExvY2FsZS5FTkdMSVNIKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzLmhhc05leHRGbG9hdCgpKTsKQEAgLTM3ODcsNyArNDIyNSwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dFNob3J0KGludCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRTaG9ydEkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dFNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzTmV4dFNob3J0SSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigiMTIzIDQ1NiIpOwogICAgICAgICBhc3NlcnRUcnVlKHMuaGFzTmV4dFNob3J0KDEwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxMjMsIHMubmV4dFNob3J0KDEwKSk7CkBAIC0zOTU3LDcgKzQ0MDQsMTYgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRTaG9ydCgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNOZXh0U2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dFNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzTmV4dFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CiAgICAgICAgIGFzc2VydFRydWUocy5oYXNOZXh0U2hvcnQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxMjMsIHMubmV4dFNob3J0KCkpOwpAQCAtNDEyOSw2ICs0NTg1LDE1IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNoYXNOZXh0U2hvcnQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNOZXh0U2hvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRTaG9ydElfY2FjaGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvL3JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjA2MwogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NTYiKTsKQEAgLTQxNjQsNyArNDYyOSwxNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjaGFzTmV4dExvbmcoaW50KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzTmV4dExvbmdJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzTmV4dExvbmdJKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CiAgICAgICAgIGFzc2VydFRydWUocy5oYXNOZXh0TG9uZygxMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMTIzLCBzLm5leHRMb25nKDEwKSk7CkBAIC00MzM0LDYgKzQ4MDgsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRMb25nKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRMb25nSV9jYWNoZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vcmVncmVzc2lvbiBmb3IgSEFSTU9OWS0yMDYzCiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigiMTIzIDQ1NiIpOwpAQCAtNDM2OSw3ICs0ODUyLDE2IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNoYXNOZXh0TG9uZygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNOZXh0TG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNOZXh0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2hhc05leHRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDU2Iik7CiAgICAgICAgIGFzc2VydFRydWUocy5oYXNOZXh0TG9uZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcy5uZXh0TG9uZygpKTsKQEAgLTQ1NDEsNiArNTAzMywxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dERvdWJsZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc05leHREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NVx1MDY2Ni4gMTIzLjQgLjEyMyAiKTsKICAgICAgICAgcy51c2VMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwpAQCAtNDY0OCw2ICs1MTQ5LDE1IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNoYXNOZXh0QmlnRGVjaW1hbCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNOZXh0QmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzTmV4dEJpZ0RlY2ltYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoIjEyMyA0NVx1MDY2Ni4gMTIzLjQgLjEyMyAiKTsKICAgICAgICAgcy51c2VMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwpAQCAtNDc3Nyw3ICs1Mjg3LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2ZpbmRXaXRoaW5Ib3Jpem9uKFBhdHRlcm4sIGludCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRXaXRoaW5Ib3Jpem9uX0xQYXR0ZXJuSSgpeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5kV2l0aGluSG9yaXpvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9maW5kV2l0aGluSG9yaXpvbl9MUGF0dGVybkkoKXsKIAogICAgICAgICAvLyBUaGlzIG1ldGhvZCBzZWFyY2hlcyB0aHJvdWdoIHRoZSBpbnB1dCB1cCB0byB0aGUgc3BlY2lmaWVkIHNlYXJjaAogICAgICAgICAvLyBob3Jpem9uKGV4Y2x1c2l2ZSkuCkBAIC01MDE1LDYgKzU1MzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjZmluZEluTGluZShQYXR0ZXJuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5kSW5MaW5lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRJbkxpbmVfTFBhdHRlcm4oKSB7CiAKICAgICAgICAgU2Nhbm5lciBzID0gbmV3IFNjYW5uZXIoIiIpOwpAQCAtNTE0MSw2ICs1NjY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2ZpbmRJbkxpbmUoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBleGNlcHRpb25zIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluZEluTGluZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRJbkxpbmVfTFN0cmluZygpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJ0ZXN0Iik7CiAgICAgICAgIHRyeSB7CkBAIC01MTY4LDYgKzU3MDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjc2tpcChQYXR0ZXJuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJza2lwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NraXBfTFBhdHRlcm4oKSB7CiAgICAgICAgIHMgPSBuZXcgU2Nhbm5lcigidGVzdCIpOwogICAgICAgICB0cnkgewpAQCAtNTI3MCw2ICs1ODE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI3NraXAoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJza2lwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2tpcF9MU3RyaW5nKCkgewogICAgICAgICBzID0gbmV3IFNjYW5uZXIoInRlc3QiKTsKICAgICAgICAgdHJ5IHsKQEAgLTUyODQsNiArNTgzOSwxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dERvdWJsZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0RG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDVcdTA2NjYuIDEyMy40IC4xMjMgIik7CiAgICAgICAgIHMudXNlTG9jYWxlKExvY2FsZS5FTkdMSVNIKTsKQEAgLTUzNjIsNiArNTkyNiwxNSBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNjYW5uZXIjbmV4dEJpZ0RlY2ltYWwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dEJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRCaWdEZWNpbWFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIxMjMgNDVcdTA2NjYuIDEyMy40IC4xMjMgIik7CiAgICAgICAgIHMudXNlTG9jYWxlKExvY2FsZS5FTkdMSVNIKTsKQEAgLTU0MzEsNiArNjAwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCJ0ZXN0Iik7CiAgICAgICAgIGFzc2VydE5vdE51bGwocy50b1N0cmluZygpKTsKQEAgLTU0MzksNiArNjAyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNuZXh0TGluZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHRMaW5lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0TGluZSgpIHsKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIiKTsKICAgICAgICAgcy5jbG9zZSgpOwpAQCAtNTU3NCw2ICs2MTY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TY2FubmVyI2hhc05leHRMaW5lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTmV4dExpbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc05leHRMaW5lKCkgewogICAgICAgICAKICAgICAgICAgcyA9IG5ldyBTY2FubmVyKCIiKTsKQEAgLTU2ODAsNiArNjI4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2Nhbm5lciNTY2FubmVyKFJlYWRhYmxlQnl0ZUNoYW5uZWwpCiAgICAgICovICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNjYW5uZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3Rvcl9MUmVhZGFibGVCeXRlQ2hhbm5lbCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBsb2NhbEFkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TaW1wbGVUaW1lWm9uZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1NpbXBsZVRpbWVab25lVGVzdC5qYXZhCmluZGV4IDI3MTc0NGQuLjQ2M2U2ZTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1NpbXBsZVRpbWVab25lVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1NpbXBsZVRpbWVab25lVGVzdC5qYXZhCkBAIC0xNywxMiArMTcsMTggQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlNpbXBsZVRpbWVab25lOwogaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhTaW1wbGVUaW1lWm9uZS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU2ltcGxlVGltZVpvbmVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIFNpbXBsZVRpbWVab25lIHN0MTsKQEAgLTMyLDYgKzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSNTaW1wbGVUaW1lWm9uZShpbnQsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpbXBsZVRpbWVab25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZShpbnQsIGphdmEubGFuZy5TdHJpbmcpCiAKQEAgLTQ3LDYgKzYyLDE3IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSNTaW1wbGVUaW1lWm9uZShpbnQsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2ltcGxlVGltZVpvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmdJSUlJSUlJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZShpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwKICAgICAgICAgLy8gaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQpAQCAtNjgsNiArOTQsMTcgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI1NpbXBsZVRpbWVab25lKGludCwgamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpbXBsZVRpbWVab25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmdJSUlJSUlJSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsCiAgICAgICAgIC8vIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQpAQCAtOTEsNiArMTI4LDE4IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSNTaW1wbGVUaW1lWm9uZShpbnQsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2ltcGxlVGltZVpvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZ0lJSUlJSUlJSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNpbXBsZVRpbWVab25lKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LAogICAgICAgICAvLyBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCkBAIC0xMzEsNiArMTgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLlNpbXBsZVRpbWVab25lLmNsb25lKCkKICAgICAgICAgU2ltcGxlVGltZVpvbmUgc3QxID0gbmV3IFNpbXBsZVRpbWVab25lKDEwMDAsICJURVNUIiwKQEAgLTE0OCw3ICsyMDYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLlNpbXBsZVRpbWVab25lLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogCkBAIC0xNjQsNiArMjMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSNnZXREU1RTYXZpbmdzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RFNUU2F2aW5ncyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RFNUU2F2aW5ncygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuZ2V0RFNUU2F2aW5ncygpCiAgICAgICAgIHN0MSA9IG5ldyBTaW1wbGVUaW1lWm9uZSgwLCAiVEVTVCIpOwpAQCAtMTg2LDcgKzI2MiwxNyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUjZ2V0T2Zmc2V0KGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRPZmZzZXRJSUlJSUkoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRPZmZzZXRJSUlJSUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLlNpbXBsZVRpbWVab25lLmdldE9mZnNldChpbnQsIGludCwgaW50LAogICAgICAgICAvLyBpbnQsIGludCwgaW50KQogICAgICAgICBzdDEgPSAoU2ltcGxlVGltZVpvbmUpIFRpbWVab25lLmdldFRpbWVab25lKCJFU1QiKTsKQEAgLTIwMyw3ICsyODksMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI2dldFJhd09mZnNldCgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSYXdPZmZzZXQoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJhd09mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFJhd09mZnNldCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuZ2V0UmF3T2Zmc2V0KCkKICAgICAgICAgc3QxID0gKFNpbXBsZVRpbWVab25lKSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRVNUIik7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBvZmZzZXQgcmV0dXJuZWQiLApAQCAtMjE0LDcgKzMwOSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUjaGFzaENvZGUoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLlNpbXBsZVRpbWVab25lLmhhc2hDb2RlKCkKICAgICAgICAgLy8gRm9yIGxhY2sgb2YgYSBiZXR0ZXIgdGVzdC4KICAgICAgICAgc3QxID0gbmV3IFNpbXBsZVRpbWVab25lKC01ICogMzYwMDAwMCwgIkVTVCIsIENhbGVuZGFyLkFQUklMLCAxLApAQCAtMjI3LDYgKzMzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUjaGFzU2FtZVJ1bGVzKGphdmEudXRpbC5UaW1lWm9uZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzU2FtZVJ1bGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5UaW1lWm9uZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNTYW1lUnVsZXNMamF2YV91dGlsX1RpbWVab25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuaGFzU2FtZVJ1bGVzKGphdmEudXRpbC5UaW1lWm9uZSkKQEAgLTI0OCw3ICszNjEsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI2luRGF5bGlnaHRUaW1lKGphdmEudXRpbC5EYXRlKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5EYXlsaWdodFRpbWVMamF2YV91dGlsX0RhdGUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluRGF5bGlnaHRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5EYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9pbkRheWxpZ2h0VGltZUxqYXZhX3V0aWxfRGF0ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLlNpbXBsZVRpbWVab25lLmluRGF5bGlnaHRUaW1lKGphdmEudXRpbC5EYXRlKQogICAgICAgICBTaW1wbGVUaW1lWm9uZSB6b25lID0gKFNpbXBsZVRpbWVab25lKSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRVNUIik7CkBAIC0yODUsNiArNDA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSNzZXREU1RTYXZpbmdzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RFNUU2F2aW5ncyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RFNUU2F2aW5nc0koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZS5zZXREU1RTYXZpbmdzKGludCkKICAgICAgICAgU2ltcGxlVGltZVpvbmUgc3QgPSBuZXcgU2ltcGxlVGltZVpvbmUoMTAwMCwgIlRlc3RfVFoiKTsKQEAgLTI5Nyw2ICs0MjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI3NldEVuZFJ1bGUoaW50LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEVuZFJ1bGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRFbmRSdWxlSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuc2V0RW5kUnVsZShpbnQsIGludCwKICAgICAgICAgLy8gaW50KQpAQCAtMzA2LDYgKzQ0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUjc2V0RW5kUnVsZShpbnQsIGludCwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRFbmRSdWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRFbmRSdWxlSUlJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLlNpbXBsZVRpbWVab25lLnNldEVuZFJ1bGUoaW50LCBpbnQsCiAgICAgICAgIC8vIGludCwgaW50KQpAQCAtMzI2LDYgKzQ3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUjc2V0RW5kUnVsZShpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRFbmRSdWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRFbmRSdWxlSUlJSVooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZS5zZXRFbmRSdWxlKGludCwgaW50LAogICAgICAgICAvLyBpbnQsIGludCwgYm9vbGVhbikKQEAgLTM1Miw3ICs1MTAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI3NldFJhd09mZnNldChpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSYXdPZmZzZXRJKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRSYXdPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zZXRSYXdPZmZzZXRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuc2V0UmF3T2Zmc2V0KGludCkKIAogICAgICAgICBzdDEgPSAoU2ltcGxlVGltZVpvbmUpIFRpbWVab25lLmdldFRpbWVab25lKCJFU1QiKTsKQEAgLTM2Niw2ICs1MzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI3NldFN0YXJ0UnVsZShpbnQsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3RhcnRSdWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3RhcnRSdWxlSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuc2V0U3RhcnRSdWxlKGludCwgaW50LAogICAgICAgICAvLyBpbnQpCkBAIC0zODcsNiArNTYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSNzZXRTdGFydFJ1bGUoaW50LCBpbnQsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3RhcnRSdWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTdGFydFJ1bGVJSUlJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuc2V0U3RhcnRSdWxlKGludCwgaW50LAogICAgICAgICAvLyBpbnQsIGludCkKQEAgLTQwNyw2ICs1OTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI3NldFN0YXJ0UnVsZShpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTdGFydFJ1bGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN0YXJ0UnVsZUlJSUlaKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUuc2V0U3RhcnRSdWxlKGludCwgaW50LAogICAgICAgICAvLyBpbnQsIGludCwgYm9vbGVhbikKQEAgLTQzMyw2ICs2MjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlNpbXBsZVRpbWVab25lI3NldFN0YXJ0WWVhcihpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFN0YXJ0WWVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3RhcnRZZWFySSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLlNpbXBsZVRpbWVab25lLnNldFN0YXJ0WWVhcihpbnQpCiAgICAgICAgIFNpbXBsZVRpbWVab25lIHN0ID0gbmV3IFNpbXBsZVRpbWVab25lKDEwMDAsICJUZXN0X1RaIik7CkBAIC00NTMsNiArNjU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS51dGlsLlNpbXBsZVRpbWVab25lLnRvU3RyaW5nKCkKICAgICAgICAgU3RyaW5nIHN0cmluZyA9IFRpbWVab25lLmdldFRpbWVab25lKCJFU1QiKS50b1N0cmluZygpOwpAQCAtNDYzLDYgKzY3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmUjdXNlRGF5bGlnaHRUaW1lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXNlRGF5bGlnaHRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91c2VEYXlsaWdodFRpbWUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZS51c2VEYXlsaWdodFRpbWUoKQogICAgICAgICBTaW1wbGVUaW1lWm9uZSBzdCA9IG5ldyBTaW1wbGVUaW1lWm9uZSgxMDAwLCAiVGVzdF9UWiIpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvU3RhY2tUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TdGFja1Rlc3QuamF2YQppbmRleCA4OTRmMTJiLi44NjFlNmVmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TdGFja1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TdGFja1Rlc3QuamF2YQpAQCAtMTcsOSArMTcsMTUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAorQFRlc3RUYXJnZXRDbGFzcyhTdGFjay5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RhY2tUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIFN0YWNrIHM7CkBAIC0yNyw2ICszMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU3RhY2sjU3RhY2soKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdGFjayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU3RhY2soKQogICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YWNrIGNyZWF0aW9uIGZhaWxlZCIsIDAsIHMuc2l6ZSgpKTsKQEAgLTM1LDYgKzUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TdGFjayNlbXB0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVtcHR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbXB0eSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLlN0YWNrLmVtcHR5KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTmV3IHN0YWNrIGFuc3dlcnMgbm9uLWVtcHR5Iiwgcy5lbXB0eSgpKTsKQEAgLTUwLDYgKzc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TdGFjayNwZWVrKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFbXB0eVN0YWNrRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwZWVrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wZWVrKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuU3RhY2sucGVlaygpCiAgICAgICAgIFN0cmluZyBpdGVtMSA9ICJJY2hpIjsKQEAgLTcyLDYgKzEwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU3RhY2sjcG9wKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG9wIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb3AoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5TdGFjay5wb3AoKQogICAgICAgICBTdHJpbmcgaXRlbTEgPSAiSWNoaSI7CkBAIC0xMTgsNiArMTYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TdGFjayNwdXNoKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wdXNoTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5TdGFjay5wdXNoKGphdmEubGFuZy5PYmplY3QpCkBAIC0xMjcsNiArMTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TdGFjayNzZWFyY2goamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VhcmNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VhcmNoTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLlN0YWNrLnNlYXJjaChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBTdHJpbmcgaXRlbTEgPSAiSWNoaSI7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TdHJpbmdUb2tlbml6ZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9TdHJpbmdUb2tlbml6ZXJUZXN0LmphdmEKaW5kZXggMDc3MWU0My4uZjljNWY0YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1N0cmluZ1Rva2VuaXplclRlc3QuamF2YQpAQCAtMTcsMTQgKzE3LDI5IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCitAVGVzdFRhcmdldENsYXNzKFN0cmluZ1Rva2VuaXplci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RyaW5nVG9rZW5pemVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciNTdHJpbmdUb2tlbml6ZXIoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiBPdGhlciB0ZXN0cyBkb24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nVG9rZW5pemVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIoamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVXNlZCBpbiB0ZXN0cyIsIHRydWUpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciNTdHJpbmdUb2tlbml6ZXIoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nVG9rZW5pemVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaW5nKQpAQCAtNDYsNiArNzAsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciNTdHJpbmdUb2tlbml6ZXIoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nVG9rZW5pemVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nWigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIoamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKQEAgLTU5LDYgKzkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIjY291bnRUb2tlbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb3VudFRva2VucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY291bnRUb2tlbnMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplci5jb3VudFRva2VucygpCiAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIlRoaXMgaXMgYSB0ZXN0IFN0cmluZyIpOwpAQCAtNjksNiArMTExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIjaGFzTW9yZUVsZW1lbnRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzTW9yZUVsZW1lbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNNb3JlRWxlbWVudHMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCkKIApAQCAtODcsNiArMTM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIjaGFzTW9yZVRva2VucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc01vcmVUb2tlbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc01vcmVUb2tlbnMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpCiAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIlRoaXMgaXMgYSB0ZXN0IFN0cmluZyIpOwpAQCAtMTAzLDYgKzE2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyI25leHRFbGVtZW50KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dEVsZW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRFbGVtZW50KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyLm5leHRFbGVtZW50KCkKQEAgLTEyOSw2ICsxOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciNuZXh0VG9rZW4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0VG9rZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHRUb2tlbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKICAgICAgICAgLy8gamF2YS51dGlsLlN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKQpAQCAtMTU1LDYgKzIzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyI25leHRUb2tlbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gJiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dFRva2VuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dFRva2VuTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKGphdmEubGFuZy5TdHJpbmcpCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9UaW1lWm9uZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RpbWVab25lVGVzdC5qYXZhCmluZGV4IDljODM1OTcuLjI3YWQ1ZjUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RpbWVab25lVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RpbWVab25lVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmU7CkBAIC0yNCw2ICsyOSw3IEBACiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfVGltZVpvbmU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVGltZVpvbmUuY2xhc3MpIAogcHVibGljIGNsYXNzIFRpbWVab25lVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT05FX0hPVVIgPSAzNjAwMDAwOwpAQCAtMzEsNiArMzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRpbWVab25lI2dldERlZmF1bHQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWZhdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0KCkgewogICAgICAgICBhc3NlcnROb3RTYW1lKCJyZXR1cm5zIGlkZW50aWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXREZWZhdWx0KCksIFRpbWVab25lLmdldERlZmF1bHQoKSk7CkBAIC0zOSw3ICs1NCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVGltZVpvbmUjZ2V0RFNUU2F2aW5ncygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREU1RTYXZpbmdzKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREU1RTYXZpbmdzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0RFNUU2F2aW5ncygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuVGltZVpvbmUuZ2V0RFNUU2F2aW5ncygpCiAKICAgICAgICAgLy8gdGVzdCBvbiBzdWJjbGFzcyBTaW1wbGVUaW1lWm9uZQpAQCAtNjYsNyArOTAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRpbWVab25lI2dldE9mZnNldChsb25nKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0X2xvbmcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRPZmZzZXRfbG9uZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuVGltZVpvbmUuZ2V0T2Zmc2V0KGxvbmcgdGltZSkKIAogICAgICAgICAvLyB0ZXN0IG9uIHN1YmNsYXNzIFNpbXBsZVRpbWVab25lCkBAIC0xMDAsNiArMTMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lWm9uZSNnZXRUaW1lWm9uZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUaW1lWm9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRpbWVab25lTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiTXVzdCByZXR1cm4gR01UIHdoZW4gZ2l2ZW4gYW4gaW52YWxpZCBUaW1lWm9uZSBpZCBTTVQtOC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR01UIiwgVGltZVpvbmUuZ2V0VGltZVpvbmUoIlNNVC04IikuZ2V0SUQoKSk7CkBAIC0xNTIsNiArMTk0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lWm9uZSNzZXREZWZhdWx0KGphdmEudXRpbC5UaW1lWm9uZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVmYXVsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuVGltZVpvbmUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdExqYXZhX3V0aWxfVGltZVpvbmUoKSB7CiAgICAgICAgIFRpbWVab25lIG9sZERlZmF1bHQgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7CiAgICAgICAgIFRpbWVab25lIHpvbmUgPSBuZXcgU2ltcGxlVGltZVpvbmUoNDUsICJURVNUIik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9UaW1lclRhc2tUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9UaW1lclRhc2tUZXN0LmphdmEKaW5kZXggZTg0NDRmNi4uYWY4YTBkNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVGltZXJUYXNrVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RpbWVyVGFza1Rlc3QuamF2YQpAQCAtMTcsOSArMTcsMTUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKIGltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwogCitAVGVzdFRhcmdldENsYXNzKFRpbWVyVGFzay5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVGltZXJUYXNrVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAgICAgT2JqZWN0IHN5bmMgPSBuZXcgT2JqZWN0KCksIHN0YXJ0ID0gbmV3IE9iamVjdCgpOwogCkBAIC02NSw2ICs3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVGltZXJUYXNrI1RpbWVyVGFzaygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRpbWVyVGFzayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIEVuc3VyZSB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgZmFpbAogICAgICAgICBuZXcgVGltZXJUZXN0VGFzaygpOwpAQCAtNzMsNiArODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRpbWVyVGFzayNjYW5jZWwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5jZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NhbmNlbCgpIHsKICAgICAgICAgVGltZXIgdCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xNjgsNiArMTkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lclRhc2sjc2NoZWR1bGVkRXhlY3V0aW9uVGltZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNjaGVkdWxlZEV4ZWN1dGlvblRpbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NjaGVkdWxlZEV4ZWN1dGlvblRpbWUoKSB7CiAgICAgICAgIFRpbWVyIHQgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMjEzLDYgKzI0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVGltZXJUYXNrI3J1bigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJ1biIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcnVuKCkgewogICAgICAgICBUaW1lciB0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RpbWVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVGltZXJUZXN0LmphdmEKaW5kZXggYzVmNjM2MC4uMWYwZTI3NCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVGltZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVGltZXJUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxNiBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVyOwogaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVGltZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFRpbWVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBpbnQgdGltZXJDb3VudGVyID0gMDsKQEAgLTkyLDYgKzk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lciNUaW1lcihib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUaW1lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yWigpIHsKICAgICAgICAgVGltZXIgdCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xMTgsNiArMTMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lciNUaW1lcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRpbWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgVGltZXIgdCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xNDQsNiArMTY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lciNUaW1lcihTdHJpbmcsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRpbWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JTWigpIHsKICAgICAgICAgVGltZXIgdCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xNjgsNiArMjAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lciNUaW1lcihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRpbWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JTKCkgewogICAgICAgICBUaW1lciB0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTE5Miw2ICsyMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRpbWVyI2NhbmNlbCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbmNlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2FuY2VsKCkgewogICAgICAgICBUaW1lciB0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTI5MCw2ICszNDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRpbWVyI3B1cmdlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHVyZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1cmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFRpbWVyIHQgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMzI0LDYgKzM4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVGltZXIjc2NoZWR1bGUoamF2YS51dGlsLlRpbWVyVGFzaywgamF2YS51dGlsLkRhdGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNjaGVkdWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5UaW1lclRhc2suY2xhc3MsIGphdmEudXRpbC5EYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NjaGVkdWxlTGphdmFfdXRpbF9UaW1lclRhc2tMamF2YV91dGlsX0RhdGUoKSB7CiAgICAgICAgIFRpbWVyIHQgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtNDY2LDYgKzUzNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVGltZXIjc2NoZWR1bGUoamF2YS51dGlsLlRpbWVyVGFzaywgbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2NoZWR1bGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlRpbWVyVGFzay5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zY2hlZHVsZUxqYXZhX3V0aWxfVGltZXJUYXNrSigpIHsKICAgICAgICAgVGltZXIgdCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC01ODQsNiArNjYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lciNzY2hlZHVsZShqYXZhLnV0aWwuVGltZXJUYXNrLCBsb25nLCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzY2hlZHVsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuVGltZXJUYXNrLmNsYXNzLCBsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NjaGVkdWxlTGphdmFfdXRpbF9UaW1lclRhc2tKSigpIHsKICAgICAgICAgVGltZXIgdCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC03MzQsNiArODIxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lciNzY2hlZHVsZShqYXZhLnV0aWwuVGltZXJUYXNrLCBqYXZhLnV0aWwuRGF0ZSwKICAgICAgKiAgICAgICAgbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2NoZWR1bGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlRpbWVyVGFzay5jbGFzcywgamF2YS51dGlsLkRhdGUuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2NoZWR1bGVMamF2YV91dGlsX1RpbWVyVGFza0xqYXZhX3V0aWxfRGF0ZUooKSB7CiAgICAgICAgIFRpbWVyIHQgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtODk0LDYgKzk5MCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVGltZXIjc2NoZWR1bGVBdEZpeGVkUmF0ZShqYXZhLnV0aWwuVGltZXJUYXNrLCBsb25nLAogICAgICAqICAgICAgICBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzY2hlZHVsZUF0Rml4ZWRSYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5UaW1lclRhc2suY2xhc3MsIGxvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2NoZWR1bGVBdEZpeGVkUmF0ZUxqYXZhX3V0aWxfVGltZXJUYXNrSkooKSB7CiAgICAgICAgIFRpbWVyIHQgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTAwOCw2ICsxMTEzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UaW1lciNzY2hlZHVsZUF0Rml4ZWRSYXRlKGphdmEudXRpbC5UaW1lclRhc2ssCiAgICAgICogICAgICAgIGphdmEudXRpbC5EYXRlLCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzY2hlZHVsZUF0Rml4ZWRSYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5UaW1lclRhc2suY2xhc3MsIGphdmEudXRpbC5EYXRlLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NjaGVkdWxlQXRGaXhlZFJhdGVMamF2YV91dGlsX1RpbWVyVGFza0xqYXZhX3V0aWxfRGF0ZUooKSB7CiAgICAgICAgIFRpbWVyIHQgPSBudWxsOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1Rvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggNzBhM2E4NS4uZDBmOWQyZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiNUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbigpCiAgICAgICAgIHRyeSB7CkBAIC0zOCw2ICs1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiNUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RyZWVNYXBUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9UcmVlTWFwVGVzdC5qYXZhCmluZGV4IDA3NmI0NjcuLjgyYjRlOWQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RyZWVNYXBUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVHJlZU1hcFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS51dGlsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudGV4dC5Db2xsYXRpb25LZXk7CiBpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwpAQCAtMzUsNiArNDAsNyBAQAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9NYXBUZXN0MjsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfVW5tb2RpZmlhYmxlQ29sbGVjdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVHJlZU1hcC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVHJlZU1hcFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXZlcnNlZENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKQEAgLTg1LDYgKzkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlTWFwI1RyZWVNYXAoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcmVlTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5UcmVlTWFwKCkKICAgICAgICAgbmV3IFN1cHBvcnRfTWFwVGVzdDIobmV3IFRyZWVNYXAoKSkucnVuVGVzdCgpOwpAQCAtOTUsNiArMTEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlTWFwI1RyZWVNYXAoamF2YS51dGlsLkNvbXBhcmF0b3IpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRyZWVNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbXBhcmF0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuVHJlZU1hcChqYXZhLnV0aWwuQ29tcGFyYXRvcikKICAgICAgICAgQ29tcGFyYXRvciBjb21wID0gbmV3IFJldmVyc2VkQ29tcGFyYXRvcigpOwpAQCAtMTEzLDYgKzEzNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNUcmVlTWFwKGphdmEudXRpbC5NYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRyZWVNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlRyZWVNYXAoamF2YS51dGlsLk1hcCkKICAgICAgICAgVHJlZU1hcCBteVRyZWVNYXAgPSBuZXcgVHJlZU1hcChuZXcgSGFzaE1hcCh0bSkpOwpAQCAtMTI2LDYgKzE1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNUcmVlTWFwKGphdmEudXRpbC5Tb3J0ZWRNYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRyZWVNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNvcnRlZE1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfU29ydGVkTWFwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlRyZWVNYXAoamF2YS51dGlsLlNvcnRlZE1hcCkKICAgICAgICAgQ29tcGFyYXRvciBjb21wID0gbmV3IFJldmVyc2VkQ29tcGFyYXRvcigpOwpAQCAtMTQ1LDYgKzE4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLlRyZWVNYXAuY2xlYXIoKQogICAgICAgICB0bS5jbGVhcigpOwpAQCAtMTU0LDYgKzIwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLlRyZWVNYXAuY2xvbmUoKQogICAgICAgICBUcmVlTWFwIGNsb25lZE1hcCA9IChUcmVlTWFwKSB0bS5jbG9uZSgpOwpAQCAtMTkxLDYgKzI1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNjb21wYXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyYXRvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Db21wYXJhdG9yIGphdmEudXRpbC5UcmVlTWFwLmNvbXBhcmF0b3IoKVwKICAgICAgICAgQ29tcGFyYXRvciBjb21wID0gbmV3IFJldmVyc2VkQ29tcGFyYXRvcigpOwpAQCAtMjA4LDYgKzI3NywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNjb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIltEb2Vzbid0IGNoZWNrIGV4Y2VwdGlvbnMgYW5kIE9iamVjdHMgKG5vdCBvbmx5IFN0cmluZykgYXMgIiArCisgICAgICAgICAgICAgICJhIHBhcmFtZXRlci5dIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc0tleUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuVHJlZU1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjE4LDYgKzI5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNjb250YWluc1ZhbHVlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc1ZhbHVlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5UcmVlTWFwLmNvbnRhaW5zVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKQEAgLTIzMCw2ICszMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRyZWVNYXAjZW50cnlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cnlTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0IGphdmEudXRpbC5UcmVlTWFwLmVudHJ5U2V0KCkKICAgICAgICAgU2V0IGFuRW50cnlTZXQgPSB0bS5lbnRyeVNldCgpOwpAQCAtMjQ3LDYgKzM0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNmaXJzdEtleSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlyc3RLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpcnN0S2V5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVHJlZU1hcC5maXJzdEtleSgpCiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGZpcnN0IGtleSIsICIwIiwgdG0uZmlyc3RLZXkoKSk7CkBAIC0yNTUsNiArMzYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlTWFwI2dldChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuVHJlZU1hcC5nZXQoamF2YS5sYW5nLk9iamVjdCkKQEAgLTI2Nyw2ICszODIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRyZWVNYXAjaGVhZE1hcChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhlYWRNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hlYWRNYXBMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Tb3J0ZWRNYXAKICAgICAgICAgLy8gamF2YS51dGlsLlRyZWVNYXAuaGVhZE1hcChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMzMyLDYgKzQ1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNrZXlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2tleVNldCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5TZXQgamF2YS51dGlsLlRyZWVNYXAua2V5U2V0KCkKICAgICAgICAgU2V0IGtzID0gdG0ua2V5U2V0KCk7CkBAIC0zNDYsNiArNDc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlTWFwI2xhc3RLZXkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3RLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xhc3RLZXkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5UcmVlTWFwLmxhc3RLZXkoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgbGFzdCBrZXkiLCB0bS5sYXN0S2V5KCkuZXF1YWxzKApAQCAtMzU1LDYgKzQ5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNwdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dExqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5UcmVlTWFwLnB1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMzgzLDYgKzUzNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNwdXRBbGwoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDbGFzc0Nhc3RFeGNlcHRpb24gJiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0QWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5UcmVlTWFwLnB1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAgICBUcmVlTWFwIHggPSBuZXcgVHJlZU1hcCgpOwpAQCAtMzk3LDYgKzU1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDbGFzc0Nhc3RFeGNlcHRpb24gJiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5UcmVlTWFwLnJlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNDA4LDYgKzU3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuVHJlZU1hcC5zaXplKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc2l6ZSIsIDEwMDAsIHRtLnNpemUoKSk7CkBAIC00MTYsNiArNTk0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlTWFwI3N1Yk1hcChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNsYXNzQ2FzdEV4Y2VwdGlvbiBhbmQgTnVsbFBvaW50ZXJFeGNlcHRpb24gYXJlIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3ViTWFwTGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Tb3J0ZWRNYXAKICAgICAgICAgLy8gamF2YS51dGlsLlRyZWVNYXAuc3ViTWFwKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCkBAIC00NTYsNiArNjQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlTWFwI3RhaWxNYXAoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGFyZSBub3QgdGVzdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRhaWxNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RhaWxNYXBMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Tb3J0ZWRNYXAKICAgICAgICAgLy8gamF2YS51dGlsLlRyZWVNYXAudGFpbE1hcChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNDc0LDYgKzY3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCN2YWx1ZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Db2xsZWN0aW9uIGphdmEudXRpbC5UcmVlTWFwLnZhbHVlcygpCiAgICAgICAgIENvbGxlY3Rpb24gdmFscyA9IHRtLnZhbHVlcygpOwpAQCAtNTAyLDYgKzcwNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZU1hcCNTZXJpYWxpemF0aW9uVGVzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhhcm1vbnktMTA2NgogICAgIHB1YmxpYyB2b2lkIHRlc3RfU3ViTWFwX1NlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBUcmVlTWFwPEludGVnZXIsIERvdWJsZT4gbWFwID0gbmV3IFRyZWVNYXA8SW50ZWdlciwgRG91YmxlPigpOwpAQCAtNTI3LDcgKzc0MSwxNiBAQAogICAgICAqIFRlc3RzIHRoYXQgbm8gQ2xhc3NDYXN0RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGluIGFsbCBjYXNlcy4KICAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTYzOS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFscygpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9lcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY29tcGFyaW5nIFRyZWVNYXBzIHdpdGggZGlmZmVyZW50IG9iamVjdCB0eXBlcwogICAgICAgICBNYXAgbTEgPSBuZXcgVHJlZU1hcCgpOwogICAgICAgICBNYXAgbTIgPSBuZXcgVHJlZU1hcCgpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVHJlZVNldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RyZWVTZXRUZXN0LmphdmEKaW5kZXggMzA1ZTZhMi4uMjBmZDYwYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVHJlZVNldFRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9UcmVlU2V0VGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnV0aWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAorCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTI1LDYgKzMwLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCitAVGVzdFRhcmdldENsYXNzKFRyZWVTZXQuY2xhc3MpIAogcHVibGljIGNsYXNzIFRyZWVTZXRUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV2ZXJzZWRJbnRlZ2VyQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewpAQCAtNDQsNiArNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRyZWVTZXQjVHJlZVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRyZWVTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlRyZWVTZXQoKQogICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGNvbnN0cnVjdCBjb3JyZWN0IFRyZWVTZXQiLCBuZXcgVHJlZVNldCgpLmlzRW1wdHkoKSk7CkBAIC01Miw2ICs2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNUcmVlU2V0KGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIltFeGNlcHRpb25zIGFyZSBub3QgdmVyaWZpZWQuXSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRyZWVTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuVHJlZVNldChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgICAgVHJlZVNldCBteVRyZWVTZXQgPSBuZXcgVHJlZVNldChBcnJheXMuYXNMaXN0KG9iakFycmF5KSk7CkBAIC02NSw2ICs4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNUcmVlU2V0KGphdmEudXRpbC5Db21wYXJhdG9yKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcmVlU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db21wYXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Db21wYXJhdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlRyZWVTZXQoamF2YS51dGlsLkNvbXBhcmF0b3IpCiAgICAgICAgIFRyZWVTZXQgbXlUcmVlU2V0ID0gbmV3IFRyZWVTZXQobmV3IFJldmVyc2VkSW50ZWdlckNvbXBhcmF0b3IoKSk7CkBAIC04Miw2ICsxMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRyZWVTZXQjVHJlZVNldChqYXZhLnV0aWwuU29ydGVkU2V0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRyZWVTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNvcnRlZFNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3V0aWxfU29ydGVkU2V0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlRyZWVTZXQoamF2YS51dGlsLlNvcnRlZFNldCkKICAgICAgICAgUmV2ZXJzZWRJbnRlZ2VyQ29tcGFyYXRvciBjb21wID0gbmV3IFJldmVyc2VkSW50ZWdlckNvbXBhcmF0b3IoKTsKQEAgLTEwMyw2ICsxNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRyZWVTZXQjYWRkKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLlRyZWVTZXQuYWRkKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIHRzLmFkZChuZXcgSW50ZWdlcigtOCkpOwpAQCAtMTE1LDYgKzE2NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBhcmUgbm90IHRlc3RlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuVHJlZVNldC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC0xMzAsNiArMTkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlU2V0I2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuVHJlZVNldC5jbGVhcigpCiAgICAgICAgIHRzLmNsZWFyKCk7CkBAIC0xNDAsNiArMjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlU2V0I2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVHJlZVNldC5jbG9uZSgpCiAgICAgICAgIFRyZWVTZXQgcyA9IChUcmVlU2V0KSB0cy5jbG9uZSgpOwpAQCAtMTUyLDYgKzIzMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNjb21wYXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyYXRvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Db21wYXJhdG9yIGphdmEudXRpbC5UcmVlU2V0LmNvbXBhcmF0b3IoKQogICAgICAgICBSZXZlcnNlZEludGVnZXJDb21wYXJhdG9yIGNvbXAgPSBuZXcgUmV2ZXJzZWRJbnRlZ2VyQ29tcGFyYXRvcigpOwpAQCAtMTYzLDYgKzI1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNjb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWlucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5UcmVlU2V0LmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGZhbHNlIGZvciB2YWxpZCBPYmplY3QiLCB0cwpAQCAtMTgyLDYgKzI3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNmaXJzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmlyc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZpcnN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVHJlZVNldC5maXJzdCgpCiAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGluY29ycmVjdCBmaXJzdCBlbGVtZW50IiwKQEAgLTE5MSw2ICsyOTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRyZWVTZXQjaGVhZFNldChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIltFeGNlcHRpb25zIGFuZCBvdGhlciBvYmplY3RzIGFyZSBub3QgdmVyaWZpZWQuXSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhlYWRTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hlYWRTZXRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Tb3J0ZWRTZXQKICAgICAgICAgLy8gamF2YS51dGlsLlRyZWVTZXQuaGVhZFNldChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjAzLDYgKzMxNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNpc0VtcHR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFbXB0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLlRyZWVTZXQuaXNFbXB0eSgpCiAgICAgICAgIGFzc2VydFRydWUoIkVtcHR5IHNldCByZXR1cm5lZCBmYWxzZSIsIG5ldyBUcmVlU2V0KCkuaXNFbXB0eSgpKTsKQEAgLTIxMiw2ICszMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlRyZWVTZXQjaXRlcmF0b3IoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXRlcmF0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuSXRlcmF0b3IgamF2YS51dGlsLlRyZWVTZXQuaXRlcmF0b3IoKQogICAgICAgICBUcmVlU2V0IHMgPSBuZXcgVHJlZVNldCgpOwpAQCAtMjI3LDYgKzM1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNsYXN0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsYXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sYXN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVHJlZVNldC5sYXN0KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGxhc3QgZWxlbWVudCIsCkBAIC0yMzYsNiArMzc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlU2V0I3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLlRyZWVTZXQucmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIHRzLnJlbW92ZShvYmpBcnJheVswXSk7CkBAIC0yNTQsNiArNDA0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5UcmVlU2V0I3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5UcmVlU2V0LnNpemUoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3Qgc2l6ZSIsIHRzLnNpemUoKSA9PSBvYmpBcnJheS5sZW5ndGgpOwpAQCAtMjYyLDYgKzQyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCNzdWJTZXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIE51bGxQb2ludGVyRXhjZXB0aW9uLCBDbGFzc0NBc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3ViU2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1YlNldExqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU29ydGVkU2V0CiAgICAgICAgIC8vIGphdmEudXRpbC5UcmVlU2V0LnN1YlNldChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjg3LDYgKzQ1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVHJlZVNldCN0YWlsU2V0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRhaWxTZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RhaWxTZXRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5Tb3J0ZWRTZXQKICAgICAgICAgLy8gamF2YS51dGlsLlRyZWVTZXQudGFpbFNldChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMzAxLDYgKzQ3OCwxNSBAQAogICAgICAqIFRlc3RzIHRoYXQgbm8gQ2xhc3NDYXN0RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGluIGFsbCBjYXNlcy4KICAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTYzOS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY29tcGFyaW5nIFRyZWVTZXRzIHdpdGggZGlmZmVyZW50IG9iamVjdCB0eXBlcwogICAgICAgICBTZXQgczEgPSBuZXcgVHJlZVNldCgpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVmVjdG9yVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVmVjdG9yVGVzdC5qYXZhCmluZGV4IDY2ZTY4YmEuLjU0MmFiM2MgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1ZlY3RvclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9WZWN0b3JUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKQEAgLTI4LDYgKzMzLDcgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9MaXN0VGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhWZWN0b3IuY2xhc3MpIAogcHVibGljIGNsYXNzIFZlY3RvclRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBWZWN0b3IgdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKQEAgLTM5LDYgKzQ1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjVmVjdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVmVjdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuVmVjdG9yKCkKIApAQCAtNjAsNiArNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNWZWN0b3IoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVmVjdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuVmVjdG9yKGludCkKIApAQCAtNzEsNiArOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNWZWN0b3IoaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJWZWN0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5WZWN0b3IoaW50LCBpbnQpCiAKQEAgLTk0LDYgKzEyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI1ZlY3RvcihqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVmVjdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlZlY3RvcihqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgICAgQ29sbGVjdGlvbiBsID0gbmV3IExpbmtlZExpc3QoKTsKQEAgLTExMCw2ICsxNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNhZGQoaW50LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZElMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLlZlY3Rvci5hZGQoaW50LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBPYmplY3QgbyA9IG5ldyBPYmplY3QoKTsKQEAgLTEzMCw2ICsxODEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNhZGQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLlZlY3Rvci5hZGQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCk7CkBAIC0xNDUsNiArMjA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gJiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEFsbElMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5WZWN0b3IuYWRkQWxsKGludCwKICAgICAgICAgLy8gamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC0xODMsNiArMjUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkQWxsTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuVmVjdG9yLmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CkBAIC0yMTQsNiArMjkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjYWRkRWxlbWVudChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRFbGVtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRFbGVtZW50TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5WZWN0b3IuYWRkRWxlbWVudChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBWZWN0b3IgdiA9IHZlY3RvckNsb25lKHRWZWN0b3IpOwpAQCAtMjI5LDYgKzMxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2FkZEVsZW1lbnQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkRWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkRWxlbWVudExqYXZhX2xhbmdfT2JqZWN0X3N1YnRlc3QwKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuVmVjdG9yLmFkZEVsZW1lbnQoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgVmVjdG9yIHYgPSB2ZWN0b3JDbG9uZSh0VmVjdG9yKTsKQEAgLTI0NCw2ICszNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNjYXBhY2l0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhcGFjaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jYXBhY2l0eSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuVmVjdG9yLmNhcGFjaXR5KCkKIApAQCAtMjU0LDYgKzM1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2NsZWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuVmVjdG9yLmNsZWFyKCkKICAgICAgICAgVmVjdG9yIG9yZ1ZlY3RvciA9IHZlY3RvckNsb25lKHRWZWN0b3IpOwpAQCAtMjc2LDYgKzM5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVmVjdG9yLmNsb25lKCkKICAgICAgICAgdFZlY3Rvci5hZGQoMjUsIG51bGwpOwpAQCAtMjk2LDYgKzQxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2NvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLlZlY3Rvci5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGZpbmQgZWxlbWVudCIsIHRWZWN0b3IuY29udGFpbnMoIlRlc3QgNDIiKSk7CkBAIC0zMTIsNiArNDQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbnRhaW5zQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zQWxsTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnV0aWwuVmVjdG9yLmNvbnRhaW5zQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQpAQCAtMzM2LDYgKzQ3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2NvcHlJbnRvKGphdmEubGFuZy5PYmplY3RbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29weUludG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvcHlJbnRvJExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuVmVjdG9yLmNvcHlJbnRvKGphdmEubGFuZy5PYmplY3QgW10pCiAKQEAgLTM1MCw2ICs1MDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNlbGVtZW50QXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgaXMgbm90IHRlc3RlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbGVtZW50QXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VsZW1lbnRBdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudXRpbC5WZWN0b3IuZWxlbWVudEF0KGludCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZWxlbWVudCByZXR1cm5lZCIsICJUZXN0IDE4IiwgKChTdHJpbmcpIHRWZWN0b3IKQEAgLTM2Myw2ICs1MjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNlbGVtZW50cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVsZW1lbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbGVtZW50cygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5FbnVtZXJhdGlvbiBqYXZhLnV0aWwuVmVjdG9yLmVsZW1lbnRzKCkKICAgICAgICAgdFZlY3Rvci5pbnNlcnRFbGVtZW50QXQobnVsbCwgMjApOwpAQCAtMzc5LDYgKzU0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2VsZW1lbnRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZWxlbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VsZW1lbnRzX3N1YnRlc3QwKCkgewogICAgICAgICBmaW5hbCBpbnQgaXRlcmF0aW9ucyA9IDEwMDAwOwogICAgICAgICBmaW5hbCBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKQEAgLTQxMCw2ICs1ODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNlbnN1cmVDYXBhY2l0eShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuc3VyZUNhcGFjaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbnN1cmVDYXBhY2l0eUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5WZWN0b3IuZW5zdXJlQ2FwYWNpdHkoaW50KQogCkBAIC00MjQsNiArNjEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuVmVjdG9yLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKQEAgLTQ0MSw2ICs2MzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNmaXJzdEVsZW1lbnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpcnN0RWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlyc3RFbGVtZW50KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVmVjdG9yLmZpcnN0RWxlbWVudCgpCiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IGZpcnN0RWxlbWVudCIsICJUZXN0IDAiLCB0VmVjdG9yLmZpcnN0RWxlbWVudCgpCkBAIC00NTMsNiArNjU3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjZ2V0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVmVjdG9yLmdldChpbnQpCiAgICAgICAgIGFzc2VydEVxdWFscygiR2V0IHJldHVybmVkIGluY29ycmVjdCBvYmplY3QiLCAKQEAgLTQ2NSw2ICs2NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuVmVjdG9yLmhhc2hDb2RlKCkKICAgICAgICAgaW50IGhhc2hDb2RlID0gMTsgLy8gb25lCkBAIC00ODAsNiArNzAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbmRleE9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5WZWN0b3IuaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBpbmRleCByZXR1cm5lZCIsIDEwLCB0VmVjdG9yLmluZGV4T2YoIlRlc3QgMTAiKSk7CkBAIC00OTQsNiArNzI1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5kZXhPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfT2JqZWN0SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuVmVjdG9yLmluZGV4T2YoamF2YS5sYW5nLk9iamVjdCwgaW50KQogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmluZCBjb3JyZWN0IGluZGV4IiwgKHRWZWN0b3IuaW5kZXhPZigiVGVzdCA5OCIsCkBAIC01MTIsNiArNzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjaW5zZXJ0RWxlbWVudEF0KGphdmEubGFuZy5PYmplY3QsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydEVsZW1lbnRBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbnNlcnRFbGVtZW50QXRMamF2YV9sYW5nX09iamVjdEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEudXRpbC5WZWN0b3IuaW5zZXJ0RWxlbWVudEF0KGphdmEubGFuZy5PYmplY3QsIGludCkKQEAgLTUyOSw2ICs3NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNpc0VtcHR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFbXB0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLlZlY3Rvci5pc0VtcHR5KClWZWN0b3IKICAgICAgICAgVmVjdG9yIHYgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwpAQCAtNTQwLDYgKzc5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2lzRW1wdHkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VtcHR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5X3N1YnRlc3QwKCkgewogICAgICAgICBmaW5hbCBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKICAgICAgICAgdi5hZGRFbGVtZW50KCJpbml0aWFsIik7CkBAIC01NzEsNiArODM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjbGFzdEVsZW1lbnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3RFbGVtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sYXN0RWxlbWVudCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLlZlY3Rvci5sYXN0RWxlbWVudCgpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxhc3QgZWxlbWVudCByZXR1cm5lZCIsICJUZXN0IDk5IiwgdFZlY3Rvci5sYXN0RWxlbWVudCgpCkBAIC01ODMsNiArODU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjbGFzdEluZGV4T2YoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGFzdEluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sYXN0SW5kZXhPZkxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5WZWN0b3IubGFzdEluZGV4T2YoamF2YS5sYW5nLk9iamVjdCkKICAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKDkpOwpAQCAtNTk5LDYgKzg4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI2xhc3RJbmRleE9mKGphdmEubGFuZy5PYmplY3QsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGFzdEluZGV4T2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xhc3RJbmRleE9mTGphdmFfbGFuZ19PYmplY3RJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5WZWN0b3IubGFzdEluZGV4T2YoamF2YS5sYW5nLk9iamVjdCwKICAgICAgICAgLy8gaW50KQpAQCAtNjIwLDYgKzkxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI3JlbW92ZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnV0aWwuVmVjdG9yLnJlbW92ZShpbnQpCiAgICAgICAgIHRWZWN0b3IucmVtb3ZlKDM2KTsKQEAgLTYzOSw2ICs5NDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5WZWN0b3IucmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICAgIHRWZWN0b3IucmVtb3ZlKCJUZXN0IDAiKTsKQEAgLTY1Niw2ICs5NjgsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiW051bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQsIHJlbW92ZUFsbCBmb3IgZW1wdHkgbWV0aG9kICIgKworICAgICAgICAgICAgICAiaXMgbm90IHRlc3RlZC5dIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbExqYXZhX3V0aWxfQ29sbGVjdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLlZlY3Rvci5yZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCkBAIC02ODgsNiArMTAxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI3JlbW92ZUFsbEVsZW1lbnRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlQWxsRWxlbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbEVsZW1lbnRzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuVmVjdG9yLnJlbW92ZUFsbEVsZW1lbnRzKCkKICAgICAgICAgVmVjdG9yIHYgPSB2ZWN0b3JDbG9uZSh0VmVjdG9yKTsKQEAgLTY5OCw2ICsxMDI5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3IjcmVtb3ZlRWxlbWVudChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIG5lZ2F0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlRWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUVsZW1lbnRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS51dGlsLlZlY3Rvci5yZW1vdmVFbGVtZW50KGphdmEubGFuZy5PYmplY3QpCkBAIC03MTYsNiArMTA1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI3JlbW92ZUVsZW1lbnRBdChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlRWxlbWVudEF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVFbGVtZW50QXRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnV0aWwuVmVjdG9yLnJlbW92ZUVsZW1lbnRBdChpbnQpCiAgICAgICAgIFZlY3RvciB2ID0gdmVjdG9yQ2xvbmUodFZlY3Rvcik7CkBAIC03MzAsNiArMTA3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBhbmQgcmV0dXJuZWQgdmFsdWUgYXJlIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJldGFpbkFsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZXRhaW5BbGxMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudXRpbC5WZWN0b3IucmV0YWluQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQpAQCAtNzQ2LDYgKzExMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNzZXQoaW50LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS51dGlsLlZlY3Rvci5zZXQoaW50LAogICAgICAgICAvLyBqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNzU3LDYgKzExMjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNzZXRFbGVtZW50QXQoamF2YS5sYW5nLk9iamVjdCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RWxlbWVudEF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVsZW1lbnRBdExqYXZhX2xhbmdfT2JqZWN0SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLlZlY3Rvci5zZXRFbGVtZW50QXQoamF2YS5sYW5nLk9iamVjdCwKICAgICAgICAgLy8gaW50KQpAQCAtNzY5LDYgKzExNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciNzZXRTaXplKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudXRpbC5WZWN0b3Iuc2V0U2l6ZShpbnQpCiAgICAgICAgIFZlY3RvciB2ID0gdmVjdG9yQ2xvbmUodFZlY3Rvcik7CkBAIC03NzksNiArMTE2NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudXRpbC5WZWN0b3Iuc2l6ZSgpCiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IHNpemUiLCAxMDAsIHRWZWN0b3Iuc2l6ZSgpKTsKQEAgLTgxMyw2ICsxMjA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5WZWN0b3Ijc3ViTGlzdChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGFyZSBub3QgdGVzdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1Ykxpc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3ViTGlzdElJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkxpc3QgamF2YS51dGlsLlZlY3Rvci5zdWJMaXN0KGludCwgaW50KQogICAgICAgICBMaXN0IHNsID0gdFZlY3Rvci5zdWJMaXN0KDEwLCAyNSk7CkBAIC04MjksNiArMTIzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI3RvQXJyYXkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b0FycmF5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBbXSBqYXZhLnV0aWwuVmVjdG9yLnRvQXJyYXkoKQogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgYXJyYXkiLCBBcnJheXMuZXF1YWxzKG9iakFycmF5LCB0VmVjdG9yCkBAIC04MzgsNiArMTI1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuVmVjdG9yI3RvQXJyYXkoamF2YS5sYW5nLk9iamVjdFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvQXJyYXkkTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IFtdCiAgICAgICAgIC8vIGphdmEudXRpbC5WZWN0b3IudG9BcnJheShqYXZhLmxhbmcuT2JqZWN0IFtdKQpAQCAtODU0LDYgKzEyNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS51dGlsLlZlY3Rvci50b1N0cmluZygpCiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBTdHJpbmcgcmV0dXJuZWQiLCB0VmVjdG9yLnRvU3RyaW5nKCkuZXF1YWxzKApAQCAtODcyLDYgKzEzMDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLlZlY3RvciN0cmltVG9TaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJpbVRvU2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJpbVRvU2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS51dGlsLlZlY3Rvci50cmltVG9TaXplKCkKICAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKDEwKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1dlYWtIYXNoTWFwVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvV2Vha0hhc2hNYXBUZXN0LmphdmEKaW5kZXggOTI5MDk1MC4uNmQ5Mzg5NiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvV2Vha0hhc2hNYXBUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvV2Vha0hhc2hNYXBUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEudXRpbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTI4LDYgKzMzLDcgQEAKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9NYXBUZXN0MjsKIAorQFRlc3RUYXJnZXRDbGFzcyhXZWFrSGFzaE1hcC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgV2Vha0hhc2hNYXBUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBjbGFzcyBNb2NrTWFwIGV4dGVuZHMgQWJzdHJhY3RNYXAgewogICAgICAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewpAQCAtNDcsNiArNTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLldlYWtIYXNoTWFwI1dlYWtIYXNoTWFwKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiV2Vha0hhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLldlYWtIYXNoTWFwKCkKICAgICAgICAgbmV3IFN1cHBvcnRfTWFwVGVzdDIobmV3IFdlYWtIYXNoTWFwKCkpLnJ1blRlc3QoKTsKQEAgLTYzLDYgKzc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5XZWFrSGFzaE1hcCNXZWFrSGFzaE1hcChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJXZWFrSGFzaE1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLldlYWtIYXNoTWFwKGludCkKICAgICAgICAgd2htID0gbmV3IFdlYWtIYXNoTWFwKDUwKTsKQEAgLTgxLDYgKzEwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAjV2Vha0hhc2hNYXAoaW50LCBmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgbm90IGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiV2Vha0hhc2hNYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklGKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLldlYWtIYXNoTWFwKGludCwgZmxvYXQpCiAgICAgICAgIHdobSA9IG5ldyBXZWFrSGFzaE1hcCg1MCwgMC41Zik7CkBAIC05OSw2ICsxMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLldlYWtIYXNoTWFwI1dlYWtIYXNoTWFwKGphdmEudXRpbC5NYXApCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIldlYWtIYXNoTWFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX01hcCgpIHsKICAgICAgICAgTWFwIG1vY2tNYXAgPSBuZXcgTW9ja01hcCgpOwogICAgICAgICBXZWFrSGFzaE1hcCBtYXAgPSBuZXcgV2Vha0hhc2hNYXAobW9ja01hcCk7CkBAIC0xMDgsNiArMTUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5XZWFrSGFzaE1hcCNjbGVhcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbGVhcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gamF2YS51dGlsLldlYWtIYXNoTWFwLmNsZWFyKCkKICAgICAgICAgd2htID0gbmV3IFdlYWtIYXNoTWFwKCk7CkBAIC0xMjQsNiArMTc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5XZWFrSGFzaE1hcCNjb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWluc0tleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zS2V5TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5XZWFrSGFzaE1hcC5jb250YWluc0tleSgpCiAgICAgICAgIHdobSA9IG5ldyBXZWFrSGFzaE1hcCgpOwpAQCAtMTM5LDYgKzE5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAjY29udGFpbnNWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWluc1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNWYWx1ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBqYXZhLnV0aWwuV2Vha0hhc2hNYXAuY29udGFpbnNWYWx1ZSgpCiAgICAgICAgIHdobSA9IG5ldyBXZWFrSGFzaE1hcCgpOwpAQCAtMTU0LDYgKzIyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAjZW50cnlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW50cnlTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0IGphdmEudXRpbC5XZWFrSGFzaE1hcC5lbnRyeVNldCgpCiAgICAgICAgIHdobSA9IG5ldyBXZWFrSGFzaE1hcCgpOwpAQCAtMTkyLDYgKzI3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAjZ2V0KGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QKICAgICAgICAgLy8gamF2YS51dGlsLldlYWtIYXNoTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMjAxLDYgKzI4OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAjaXNFbXB0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRW1wdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRW1wdHkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIGphdmEudXRpbC5XZWFrSGFzaE1hcC5pc0VtcHR5KCkKICAgICAgICAgd2htID0gbmV3IFdlYWtIYXNoTWFwKCk7CkBAIC0yMTUsNiArMzExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5XZWFrSGFzaE1hcCNwdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3B1dExqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0CiAgICAgICAgIC8vIGphdmEudXRpbC5XZWFrSGFzaE1hcC5wdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKQEAgLTIyOSw2ICszMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLldlYWtIYXNoTWFwI3B1dEFsbChqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0QWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHV0QWxsTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIE1hcCBtb2NrTWFwPW5ldyBNb2NrTWFwKCk7CiAgICAgICAgIFdlYWtIYXNoTWFwIG1hcCA9IG5ldyBXZWFrSGFzaE1hcCgpOwpAQCAtMjM5LDYgKzM1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdAogICAgICAgICAvLyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAucmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCkBAIC0yNTYsNiArMzc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudXRpbC5XZWFrSGFzaE1hcCNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAuc2l6ZSgpCiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwpAQCAtMjY0LDYgKzM5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAja2V5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlTZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuU2V0IGphdmEudXRpbC5XZWFrSGFzaE1hcC5rZXlTZXQoKQogICAgICAgICB3aG0gPSBuZXcgV2Vha0hhc2hNYXAoKTsKQEAgLTMwMCw2ICs0NDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS51dGlsLldlYWtIYXNoTWFwI3ZhbHVlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLlNldCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAudmFsdWVzKCkKICAgICAgICAgd2htID0gbmV3IFdlYWtIYXNoTWFwKCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9sYW5nL1N0cmljdE1hdGgvRmRsaWJtNTNUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9sYW5nL1N0cmljdE1hdGgvRmRsaWJtNTNUZXN0LmphdmEKaW5kZXggZjQxZjUzYi4uN2NmZmE2YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvbGFuZy9TdHJpY3RNYXRoL0ZkbGlibTUzVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL2xhbmcvU3RyaWN0TWF0aC9GZGxpYm01M1Rlc3QuamF2YQpAQCAtMTYsMTQgKzE2LDM3IEBACiAKIHBhY2thZ2UgdGVzdHMuamF2YS5sYW5nLlN0cmljdE1hdGg7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RyaWN0TWF0aC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRmRsaWJtNTNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlN0cmVzcyB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvdyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb3coKSB7CiAgICAgICAgIGFzc2VydFRydWUoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoLTQ2MTAwNjg1OTE1Mzk4OTAzMjZMKSA9PSBTdHJpY3RNYXRoLnBvdygtMS4wMDAwMDAwMDAwMDAwMDAyZSswMCw0LjUwMzU5OTYyNzM3MDQ5NzBlKzE1KSk7CiAgICAgICAgIGFzc2VydFRydWUoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoNDYwMTAyMzgyNDEwMTk1MDE2M0wpID09IFN0cmljdE1hdGgucG93KC05Ljk5OTk5OTk5OTk5OTk5NzhlLTAxLDQuMDM1OTk2MjczNzA0OTcwZSsxNSkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlN0cmVzcyB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdGFuKCl7CiAgICAgICAgIGFzc2VydFRydWUoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoNDg1MDIzNjU0MTY1NDU4ODY3OEwpID09IFN0cmljdE1hdGgudGFuKCAxLjc3NjUyNDE5MDc1NDgwMjRFKzI2OSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nL1Rlc3RzLmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9sYW5nL1N0cmluZy9UZXN0cy5qYXZhCmluZGV4IGE4ODA3YzUuLmNmNWU4ZTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL2xhbmcvU3RyaW5nL1Rlc3RzLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvbGFuZy9TdHJpbmcvVGVzdHMuamF2YQpAQCAtMTYsMzggKzE2LDg0IEBACiAKIHBhY2thZ2UgdGVzdHMuamF2YS5sYW5nLlN0cmluZzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogLyoqCiAgKiBUZXN0cyBmb3IgdGhlIGNsYXNzIHtAbGluayBTdHJpbmd9LgogICovCitAVGVzdFRhcmdldENsYXNzKFN0cmluZy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb250YWlucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJhYWJjIi5jb250YWlucygiYWJjIikpOwogICAgICAgICBhc3NlcnRUcnVlKCJhYmNkIi5jb250YWlucygiYWJjIikpOwogICAgICAgICBhc3NlcnRGYWxzZSgiYWJjZCIuY29udGFpbnMoImNiYSIpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoYXJBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2hhckF0KCkgewogICAgICAgICBhc3NlcnRUcnVlKCJhYmNkIi5jaGFyQXQoMCkgPT0gJ2EnKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYWJjZCIuY2hhckF0KDMpID09ICdkJyk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgc3BlY2lmaWMgY2FzZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3RhcnRzV2l0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1N0YXJ0c1dpdGgoKSB7CiAgICAgICAgIGFzc2VydFRydWUoImFiY2QiLnN0YXJ0c1dpdGgoImFiYyIpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoImFiY2QiLnN0YXJ0c1dpdGgoImFhYmMiKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgc3BlY2lmaWMgY2FzZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5kc1dpdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9FbmRzV2l0aCgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYWJjZCIuZW5kc1dpdGgoImJjZCIpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoImFiY2QiLmVuZHNXaXRoKCJiY2RlIikpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBub3RoaW5nLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NBU0VfSU5TRU5TSVRJVkVfT1JERVIoKSB7CiAgICAgICAgIFN0cmluZyAgczEgPSAiQUJDREVGRyI7CiAgICAgICAgIFN0cmluZyAgczIgPSAiYWJjZGVmZyI7CiAgICAgICAgIAotICAgICAgICAvLz8/P05JTyBkb2Vzbid0IGNvbXBpbGUKLSAgICAgICAgLy9hc3NlcnRUcnVlKFN0cmluZy5DQVNFX0lOU0VOU0lUSVZFX09SREVSLmNvbXBhcmUoczEsIHMyKSA9PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUi5jb21wYXJlKHMxLCBzMikgPT0gMCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2x1bmkvQWxsVGVzdHMuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9sdW5pL0FsbFRlc3RzLmphdmEKaW5kZXggN2NiMWNiMS4uYmE5NjA1NCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2x1bmkvQWxsVGVzdHMuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvbHVuaS9BbGxUZXN0cy5qYXZhCkBAIC0zNiwyMCArMzYsOSBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUodGVzdHMuYXBpLmphdmEubGFuZy5Cb29sZWFuVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5hcGkuamF2YS5sYW5nLlN0cmluZ1Rlc3QuY2xhc3MpOwogCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5hcGkuamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2VUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2VUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmLlBoYW50b21SZWZlcmVuY2VUZXN0LmNsYXNzKTsKLSAgICAgICAgLy8gc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLmFwaS5qYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlVGVzdC5jbGFzcyk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLmFwaS5qYXZhLnV0aWwuQWJzdHJhY3RNYXBUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLmFwaS5qYXZhLnV0aWwuSGFzaE1hcFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUodGVzdHMuYXBpLmphdmEudXRpbC5MaW5rZWRIYXNoTWFwVGVzdC5jbGFzcyk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmphdmEubGFuZy5NYXRoVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLmxhbmcuU3RyaWN0TWF0aFRlc3QuY2xhc3MpOwotCiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5qYXZhLmxhbmcuU3RyaWN0TWF0aC5GZGxpYm01M1Rlc3QuY2xhc3MpOworICAgICAgICAKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLmFwaS5vcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLmRhbHZpay5UaHJlYWRzVGVzdC5jbGFzcyk7CiAgICAgICAgIHJldHVybiBzdWl0ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvbHVuaS9BbGxUZXN0c05ldC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2x1bmkvQWxsVGVzdHNOZXQuamF2YQppbmRleCA1YWM0ZTkwLi40NDM0N2E1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvbHVuaS9BbGxUZXN0c05ldC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9sdW5pL0FsbFRlc3RzTmV0LmphdmEKQEAgLTM2LDYgKzM2LDkgQEAKICAgICAgICAgc3VpdGUuYWRkVGVzdChvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS50ZXN0cy5qYXZhLm5ldC5BbGxUZXN0cy5zdWl0ZSgpKTsKICAgICAgICAgCiAgICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMuYXBpLmphdmEubmV0LkFsbFRlc3RzLnN1aXRlKCkpOworCisgICAgICAgIHN1aXRlLmFkZFRlc3Qob3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudGVzdHMuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkFsbFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnRlc3RzLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cHMuQWxsVGVzdHMuc3VpdGUoKSk7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gc3VpdGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9CaWdEZWNpbWFsLmphdmEgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0JpZ0RlY2ltYWwuamF2YQppbmRleCAwOTg5ZjhhLi45M2MwOTVjIDEwMDY0NAotLS0gYS9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0JpZ0RlY2ltYWwuamF2YQorKysgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0JpZ0RlY2ltYWwuamF2YQpAQCAtMSwyMCArMSw0IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKICAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKICAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCkBAIC0zMSwxMiArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qCi0gKiBTaW5jZSB0aGUgb3JpZ2luYWwgSGFybW9ueSBDb2RlIG9mIHRoZSBCaWdJbnRlZ2VyIGNsYXNzIHdhcyBzdHJvbmdseSBtb2RpZmllZCwKLSAqIGluIG9yZGVyIHRvIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgT3BlblNTTCBCSUdOVU0gaW1wbGVtZW50YXRpb24sCi0gKiBubyBhbmRyb2lkLW1vZGlmaWNhdGlvbi10YWdzIHdlcmUgcGxhY2VkLCBhdCBhbGwuCi0gKi8KLQogcGFja2FnZSBqYXZhLm1hdGg7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDcsMzUgKzI1LDM3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1hdGguaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIENsYXNzIHdoaWNoIHJlcHJlc2VudHMgaW1tdXRhYmxlIGFyYnJpdGFyeSBwcmVjaXNpb24gZGVjaW1hbCBudW1iZXJzLiBFYWNoCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgaW1tdXRhYmxlIGFyYml0cmFyeSBwcmVjaXNpb24gZGVjaW1hbCBudW1iZXJzLiBFYWNoCiAgKiB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgaXMgcmVwcmVzZW50ZWQgd2l0aCBhIHVuc2NhbGVkIGFyYml0cmFyeQotICogcHJlY2lzaW9uIG1hbnRpc3NhICh0aGUgdW5zY2FsZWQgdmFsdWUpIGFuZCBhIHNjYWxlLiBUaGUgdmFsdWUgb2YgdGhlCi0gKiB7QGNvZGUgQmlnRGVjaW1hbH0gaXMge0Bjb2RlIHVuc2NhbGVkVmFsdWV9ICogMTBeey17QGNvZGUgc2NhbGV9fS4KKyAqIHByZWNpc2lvbiBtYW50aXNzYSAodGhlIHVuc2NhbGVkIHZhbHVlKSBhbmQgYSBzY2FsZS4gVGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUKKyAqIEJpZ0RlY2ltYWx9IGlzIHtAY29kZSB1bnNjYWxlZFZhbHVlfSAxMF4oLXtAY29kZSBzY2FsZX0pLgogICogCi0gKiBAYXV0aG9yIEludGVsIE1pZGRsZXdhcmUgUHJvZHVjdCBEaXZpc2lvbgotICogQGF1dGhvciBJbnN0aXR1dG8gVGVjbm9sb2dpY28gZGUgQ29yZG9iYQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCaWdEZWNpbWFsIGV4dGVuZHMgTnVtYmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxCaWdEZWNpbWFsPiwgU2VyaWFsaXphYmxlIHsKICAgICAvKiBTdGF0aWMgRmllbGRzICovCiAKICAgICAvKioKLSAgICAgKiBUaGUgY29uc3RhbnQgemVybyBhcyBhIEJpZ0RlY2ltYWwuCisgICAgICogVGhlIGNvbnN0YW50IHplcm8gYXMgYSB7QGNvZGUgQmlnRGVjaW1hbH0uCiAgICAgICogCiAgICAgICogQHNpbmNlIDEuMgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBaRVJPID0gbmV3IEJpZ0RlY2ltYWwoMCwgMCk7CiAKICAgICAvKioKLSAgICAgKiBUaGUgY29uc3RhbnQgb25lIGFzIGEgQmlnRGVjaW1hbC4KKyAgICAgKiBUaGUgY29uc3RhbnQgb25lIGFzIGEge0Bjb2RlIEJpZ0RlY2ltYWx9LgogICAgICAqIAogICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgT05FID0gbmV3IEJpZ0RlY2ltYWwoMSwgMCk7CiAKICAgICAvKioKLSAgICAgKiBUaGUgY29uc3RhbnQgdGVuIGFzIGEgQmlnRGVjaW1hbC4KKyAgICAgKiBUaGUgY29uc3RhbnQgdGVuIGFzIGEge0Bjb2RlIEJpZ0RlY2ltYWx9LgogICAgICAqIAogICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgVEVOID0gbmV3IEJpZ0RlY2ltYWwoMTAsIDApOwogCkBAIC04NCw2ICs2NCw3IEBACiAgICAgICogYW5kIG5lZ2F0aXZlIHZhbHVlcyB0b3dhcmRzIG5lZ2F0aXZlIGluZmluaXR5LgogICAgICAqIAogICAgICAqIEBzZWUgUm91bmRpbmdNb2RlI1VQCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VTkRfVVAgPSAwOwogCkBAIC05MSw2MSArNzIsNzAgQEAKICAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHRoZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyB6ZXJvLgogICAgICAqIAogICAgICAqIEBzZWUgUm91bmRpbmdNb2RlI0RPV04KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9ET1dOID0gMTsKIAogICAgIC8qKgogICAgICAqIFJvdW5kaW5nIG1vZGUgdG8gcm91bmQgdG93YXJkcyBwb3NpdGl2ZSBpbmZpbml0eS4gRm9yIHBvc2l0aXZlIHZhbHVlcwotICAgICAqIHRoaXMgcm91bmRpbmcgbW9kZSBiZWhhdmVzIGFzIFVQLCBmb3IgbmVnYXRpdmUgdmFsdWVzIGFzIERPV04uCisgICAgICogdGhpcyByb3VuZGluZyBtb2RlIGJlaGF2ZXMgYXMge0BsaW5rICNST1VORF9VUH0sIGZvciBuZWdhdGl2ZSB2YWx1ZXMgYXMKKyAgICAgKiB7QGxpbmsgI1JPVU5EX0RPV059LgogICAgICAqIAogICAgICAqIEBzZWUgUm91bmRpbmdNb2RlI0NFSUxJTkcKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9DRUlMSU5HID0gMjsKIAogICAgIC8qKgogICAgICAqIFJvdW5kaW5nIG1vZGUgdG8gcm91bmQgdG93YXJkcyBuZWdhdGl2ZSBpbmZpbml0eS4gRm9yIHBvc2l0aXZlIHZhbHVlcwotICAgICAqIHRoaXMgcm91bmRpbmcgbW9kZSBiZWhhdmVzIGFzIERPV04sIGZvciBuZWdhdGl2ZSB2YWx1ZXMgYXMgVVAuCisgICAgICogdGhpcyByb3VuZGluZyBtb2RlIGJlaGF2ZXMgYXMge0BsaW5rICNST1VORF9ET1dOfSwgZm9yIG5lZ2F0aXZlIHZhbHVlcyBhcworICAgICAqIHtAbGluayAjUk9VTkRfVVB9LgogICAgICAqIAogICAgICAqIEBzZWUgUm91bmRpbmdNb2RlI0ZMT09SCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VTkRfRkxPT1IgPSAzOwogCiAgICAgLyoqCi0gICAgICogUm91bmRpbmcgbW9kZSB3aGVyZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyB0aGUgbmVhcmVzdCBuZWlnaGJvdXIuCisgICAgICogUm91bmRpbmcgbW9kZSB3aGVyZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyB0aGUgbmVhcmVzdCBuZWlnaGJvci4KICAgICAgKiBUaWVzIGFyZSBicm9rZW4gYnkgcm91bmRpbmcgdXAuCiAgICAgICogCiAgICAgICogQHNlZSBSb3VuZGluZ01vZGUjSEFMRl9VUAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVU5EX0hBTEZfVVAgPSA0OwogCiAgICAgLyoqCi0gICAgICogUm91bmRpbmcgbW9kZSB3aGVyZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyB0aGUgbmVhcmVzdCBuZWlnaGJvdXIuCisgICAgICogUm91bmRpbmcgbW9kZSB3aGVyZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyB0aGUgbmVhcmVzdCBuZWlnaGJvci4KICAgICAgKiBUaWVzIGFyZSBicm9rZW4gYnkgcm91bmRpbmcgZG93bi4KICAgICAgKiAKICAgICAgKiBAc2VlIFJvdW5kaW5nTW9kZSNIQUxGX0RPV04KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9IQUxGX0RPV04gPSA1OwogCiAgICAgLyoqCi0gICAgICogUm91bmRpbmcgbW9kZSB3aGVyZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyB0aGUgbmVhcmVzdCBuZWlnaGJvdXIuCi0gICAgICogVGllcyBhcmUgYnJva2VuIGJ5IHJvdW5kaW5nIHRvIHRoZSBldmVuIG5laWdoYm91ci4KKyAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHZhbHVlcyBhcmUgcm91bmRlZCB0b3dhcmRzIHRoZSBuZWFyZXN0IG5laWdoYm9yLgorICAgICAqIFRpZXMgYXJlIGJyb2tlbiBieSByb3VuZGluZyB0byB0aGUgZXZlbiBuZWlnaGJvci4KICAgICAgKiAKICAgICAgKiBAc2VlIFJvdW5kaW5nTW9kZSNIQUxGX0VWRU4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9IQUxGX0VWRU4gPSA2OwogCiAgICAgLyoqCi0gICAgICogUm91bmRpbmcgbW9kZSB3aGVyZSB0aGUgcm91bmRpbmcgb3BlcmF0aW9ucyB0aHJvd3MgYW4gQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqIGZvciB0aGUgY2FzZSB0aGF0IHJvdW5kaW5nIGlzIG5lY2Vzc2FyeSwgaS5lLiBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgdmFsdWUKLSAgICAgKiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseS4KKyAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHRoZSByb3VuZGluZyBvcGVyYXRpb25zIHRocm93cyBhbiB7QGNvZGUKKyAgICAgKiBBcml0aG1ldGljRXhjZXB0aW9ufSBmb3IgdGhlIGNhc2UgdGhhdCByb3VuZGluZyBpcyBuZWNlc3NhcnksIGkuZS4gZm9yCisgICAgICogdGhlIGNhc2UgdGhhdCB0aGUgdmFsdWUgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuCiAgICAgICogCiAgICAgICogQHNlZSBSb3VuZGluZ01vZGUjVU5ORUNFU1NBUlkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9VTk5FQ0VTU0FSWSA9IDc7CiAKICAgICAvKiBQcml2YXRlIEZpZWxkcyAqLwogCi0gICAgLyoqIFRoaXMgaXMgdGhlIHNlcmlhbFZlcnNpb25VSUQgdXNlZCBieSB0aGUgc3VuIGltcGxlbWVudGF0aW9uICovCisgICAgLyoqIFRoaXMgaXMgdGhlIHNlcmlhbFZlcnNpb25VSUQgdXNlZCBieSB0aGUgc3VuIGltcGxlbWVudGF0aW9uLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYxMDg4NzQ4ODcxNDM2OTY0NjNMOwogCiAgICAgLyoqIFRoZSBkb3VibGUgY2xvc2VyIHRvIDxjb2RlPkxvZzEwKDIpPC9jb2RlPi4gKi8KQEAgLTE1OSwxOSArMTQ5LDE5IEBACiAKICAgICAvKioKICAgICAgKiBBbiBhcnJheSB3aXRoIHBvd2VycyBvZiBmaXZlIHRoYXQgZml0IGluIHRoZSB0eXBlIDxjb2RlPmxvbmc8L2NvZGU+Ci0gICAgICogKDxjb2RlPjVeMCw1XjEsLi4uLDVeMjc8L2NvZGU+KQorICAgICAqICg8Y29kZT41XjAsNV4xLC4uLiw1XjI3PC9jb2RlPikuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGSVZFX1BPV1tdOwogCiAgICAgLyoqCiAgICAgICogQW4gYXJyYXkgd2l0aCBwb3dlcnMgb2YgdGVuIHRoYXQgZml0IGluIHRoZSB0eXBlIDxjb2RlPmxvbmc8L2NvZGU+Ci0gICAgICogKDxjb2RlPjEwXjAsMTBeMSwuLi4sMTBeMTg8L2NvZGU+KQorICAgICAqICg8Y29kZT4xMF4wLDEwXjEsLi4uLDEwXjE4PC9jb2RlPikuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBURU5fUE9XW107CiAKICAgICAvKioKICAgICAgKiBBbiBhcnJheSB3aXRoIHBvd2VycyBvZiB0ZW4gdGhhdCBmaXQgaW4gdGhlIHR5cGUgPGNvZGU+bG9uZzwvY29kZT4KLSAgICAgKiAoPGNvZGU+MTBeMCwxMF4xLC4uLiwxMF4xODwvY29kZT4pCisgICAgICogKDxjb2RlPjEwXjAsMTBeMSwuLi4sMTBeMTg8L2NvZGU+KS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTE9OR19URU5fUE9XID0gbmV3IGxvbmdbXQogICAgIHsgICAxTCwKQEAgLTIyOSwxNSArMjE5LDE2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTE9OR19URU5fUE9XX0JJVF9MRU5HVEggPSBuZXcgaW50W0xPTkdfVEVOX1BPVy5sZW5ndGhdOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSV9TQ0FMRURfQllfWkVST19MRU5HVEggPSAxMTsKKwogICAgIC8qKgogICAgICAqIEFuIGFycmF5IHdpdGggdGhlIGZpcnN0IDxjb2RlPkJpZ0ludGVnZXI8L2NvZGU+IHNjYWxlZCBieSB6ZXJvLgotICAgICAqICg8Y29kZT5bMCwwXSxbMSwwXSwuLi4sWzEwLDBdPC9jb2RlPikKKyAgICAgKiAoPGNvZGU+WzAsMF0sWzEsMF0sLi4uLFsxMCwwXTwvY29kZT4pLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQklfU0NBTEVEX0JZX1pFUk9bXSA9IG5ldyBCaWdEZWNpbWFsW0JJX1NDQUxFRF9CWV9aRVJPX0xFTkdUSF07CiAKICAgICAvKioKICAgICAgKiBBbiBhcnJheSB3aXRoIHRoZSB6ZXJvIG51bWJlciBzY2FsZWQgYnkgdGhlIGZpcnN0IHBvc2l0aXZlIHNjYWxlcy4KLSAgICAgKiAoPGNvZGU+MCoxMF4wLCAwKjEwXjEsIC4uLiwgMCoxMF4xMDwvY29kZT4pCisgICAgICogKDxjb2RlPjAqMTBeMCwgMCoxMF4xLCAuLi4sIDAqMTBeMTA8L2NvZGU+KS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFpFUk9fU0NBTEVEX0JZW10gPSBuZXcgQmlnRGVjaW1hbFsxMV07CiAKQEAgLTI3MSw3ICsyNjIsNyBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIGFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdlciAodW5zY2FsZWQgdmFsdWUpIGluIHRoZSBpbnRlcm5hbAotICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIDxjb2RlPkJpZ0RlY2ltYWw8L2NvZGU+LgorICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBCaWdEZWNpbWFsfS4KICAgICAgKi8KICAgICBwcml2YXRlIEJpZ0ludGVnZXIgaW50VmFsOwogICAgIApAQCAtMjgwLDcgKzI3MSw3IEBACiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBzbWFsbFZhbHVlOwogCiAgICAgLyoqIAotICAgICAqIFRoZSAzMi1iaXQgaW50ZWdlciBzY2FsZSBpbiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgPGNvZGU+QmlnRGVjaW1hbDwvY29kZT4uIAorICAgICAqIFRoZSAzMi1iaXQgaW50ZWdlciBzY2FsZSBpbiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIEJpZ0RlY2ltYWx9LiAKICAgICAgKi8KICAgICBwcml2YXRlIGludCBzY2FsZTsKIApAQCAtMzE1LDIxICszMDYsMjAgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KICAgICAgKiAgICAgICAgICAgIGFycmF5IG9mIGNoYXJhY3RlcnMgY29udGFpbmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfQorICAgICAqICAgICAgICAgICAgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0uCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgZmlyc3QgaW5kZXggdG8gYmUgY29waWVkCisgICAgICogICAgICAgICAgICBmaXJzdCBpbmRleCB0byBiZSBjb3BpZWQuCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZAorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBpZiBpbiA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBpZiBvZmZzZXQgPCAwIG9yIGxlbiA8PSAwIG9yIG9mZnNldCtsZW4tMSA8IDAgb3Igb2Zmc2V0K2xlbi0xID49Ci0gICAgICogICAgICAgICAgICBpbi5sZW5ndGgKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGxlbiA8PSAwfSBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXQrbGVuLTEgPCAwfSBvciB7QGNvZGUgb2Zmc2V0K2xlbi0xID49IGluLmxlbmd0aH0uCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgIGlmIHNjYWxlIGlzIG91dCBvZiByYW5nZQotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBpZiBpbiBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYmlnCi0gICAgICogICAgICAgICAgICBkZWNpbWFsLgorICAgICAqICAgICAgICAgICAgIGlmIGluIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBiaWcKKyAgICAgKiAgICAgICAgICAgICBkZWNpbWFsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsKGNoYXJbXSBpbiwgaW50IG9mZnNldCwgaW50IGxlbikgewogICAgICAgICBpbnQgYmVnaW4gPSBvZmZzZXQ7IC8vIGZpcnN0IGluZGV4IHRvIGJlIGNvcGllZApAQCAtMzYwLDggKzM1MCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGluW29mZnNldF0gPT0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3YXNOb25aZXJvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdhc05vblplcm8gPSB0cnVlOyAgICAKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfTsKIAogICAgICAgICB9CkBAIC0zNzgsOCArMzY4LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGluW29mZnNldF0gPT0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YXNOb25aZXJvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2FzTm9uWmVybyA9IHRydWU7ICAgIAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzY2FsZSA9IG9mZnNldCAtIGJlZ2luOwpAQCAtNDE1LDcgKzQwNSw3IEBACiAgICAgICAgICAgICBiaXRMZW5ndGggPSBiaXRMZW5ndGgoc21hbGxWYWx1ZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzZXRVbnNjYWxlZFZhbHVlKG5ldyBCaWdJbnRlZ2VyKHVuc2NhbGVkQnVmZmVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKICAgICAgICAgcHJlY2lzaW9uID0gdW5zY2FsZWRCdWZmZXIubGVuZ3RoKCkgLSBjb3VudGVyOwogICAgICAgICBpZiAodW5zY2FsZWRCdWZmZXIuY2hhckF0KDApID09ICctJykgewogICAgICAgICAgICAgcHJlY2lzaW9uIC0tOwpAQCAtNDI4LDI3ICs0MTgsMjYgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KICAgICAgKiAgICAgICAgICAgIGFycmF5IG9mIGNoYXJhY3RlcnMgY29udGFpbmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfQorICAgICAqICAgICAgICAgICAgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0uCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgZmlyc3QgaW5kZXggdG8gYmUgY29waWVkCisgICAgICogICAgICAgICAgICBmaXJzdCBpbmRleCB0byBiZSBjb3BpZWQuCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZAorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZC4KICAgICAgKiBAcGFyYW0gbWMKICAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgYW5kIHByZWNpc2lvbiBmb3IgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgaW4gPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbiA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG9mZnNldCA8IDAgb3IgbGVuIDw9IDAgb3Igb2Zmc2V0K2xlbi0xIDwgMCBvciBvZmZzZXQrbGVuLTEgPj0KLSAgICAgKiAgICAgICAgICAgICBpbi5sZW5ndGgKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGxlbiA8PSAwfSBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBvZmZzZXQrbGVuLTEgPCAwfSBvciB7QGNvZGUgb2Zmc2V0K2xlbi0xID49IGluLmxlbmd0aH0uCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzY2FsZSBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGluIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBiaWcKLSAgICAgKiAgICAgICAgICAgICBkZWNpbWFsLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbn0gZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAqICAgICAgICAgICAgIG9mIGEgYmlnIGRlY2ltYWwuCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbWMucHJlY2lzaW9uID4gMCBhbmQgbWMucm91bmRpbmdNb2RlID09IFVOTkVDRVNTQVJZIGFuZAotICAgICAqICAgICAgICAgICAgIHRoZSBuZXcgYmlnIGRlY2ltYWwgY2Fubm90IGJlIHJlcHJlc2VudGVkIHdpdGhpbiB0aGUgZ2l2ZW4KLSAgICAgKiAgICAgICAgICAgICBwcmVjaXNpb24gd2l0aG91dCByb3VuZGluZy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbWMucHJlY2lzaW9uID4gMH0gYW5kIHtAY29kZSBtYy5yb3VuZGluZ01vZGUgPT0KKyAgICAgKiAgICAgICAgICAgICBVTk5FQ0VTU0FSWX0gYW5kIHRoZSBuZXcgYmlnIGRlY2ltYWwgY2Fubm90IGJlIHJlcHJlc2VudGVkCisgICAgICogICAgICAgICAgICAgd2l0aGluIHRoZSBnaXZlbiBwcmVjaXNpb24gd2l0aG91dCByb3VuZGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbChjaGFyW10gaW4sIGludCBvZmZzZXQsIGludCBsZW4sIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIHRoaXMoaW4sIG9mZnNldCwgbGVuKTsKQEAgLTQ2MywxMiArNDUyLDExIEBACiAgICAgICogICAgICAgICAgICBhcnJheSBvZiBjaGFyYWN0ZXJzIGNvbnRhaW5pbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZgogICAgICAqICAgICAgICAgICAgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGluID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW4gPT0gbnVsbH0uCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzY2FsZSBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGluIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBiaWcKLSAgICAgKiAgICAgICAgICAgICBkZWNpbWFsLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbn0gZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAqICAgICAgICAgICAgIG9mIGEgYmlnIGRlY2ltYWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwoY2hhcltdIGluKSB7CiAgICAgICAgIHRoaXMoaW4sIDAsIGluLmxlbmd0aCk7CkBAIC00ODUsMTYgKzQ3MywxNSBAQAogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbiA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGluID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc2NhbGUgaXMgb3V0IG9mIHJhbmdlCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbiBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYmlnCi0gICAgICogICAgICAgICAgICAgZGVjaW1hbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaW59IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgKiAgICAgICAgICAgICBvZiBhIGJpZyBkZWNpbWFsLgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1jLnByZWNpc2lvbiA+IDAgYW5kIG1jLnJvdW5kaW5nTW9kZSA9PSBVTk5FQ0VTU0FSWSBhbmQKLSAgICAgKiAgICAgICAgICAgICB0aGUgbmV3IGJpZyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoaW4gdGhlIGdpdmVuCi0gICAgICogICAgICAgICAgICAgcHJlY2lzaW9uIHdpdGhvdXQgcm91bmRpbmcuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG1jLnByZWNpc2lvbiA+IDB9IGFuZCB7QGNvZGUgbWMucm91bmRpbmdNb2RlID09CisgICAgICogICAgICAgICAgICAgVU5ORUNFU1NBUll9IGFuZCB0aGUgbmV3IGJpZyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZAorICAgICAqICAgICAgICAgICAgIHdpdGhpbiB0aGUgZ2l2ZW4gcHJlY2lzaW9uIHdpdGhvdXQgcm91bmRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwoY2hhcltdIGluLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICB0aGlzKGluLCAwLCBpbi5sZW5ndGgpOwpAQCAtNTA2LDE0ICs0OTMsMTIgQEAKICAgICAgKiByZXByZXNlbnRhdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaWdEZWNpbWFsfS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIEJpZ0RlY2ltYWx9LgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc2NhbGUgaXMgb3V0IG9mIHJhbmdlCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGJpZwotICAgICAqICAgICAgICAgICAgIGRlY2ltYWwuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbH0gZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAqICAgICAgICAgICAgIG9mIGEgYmlnIGRlY2ltYWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwoU3RyaW5nIHZhbCkgewogICAgICAgICB0aGlzKHZhbC50b0NoYXJBcnJheSgpLCAwLCB2YWwubGVuZ3RoKCkpOwpAQCAtNTI1LDIwICs1MTAsMTggQEAKICAgICAgKiBjb250ZXh0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcwotICAgICAqICAgICAgICAgICAge0Bjb2RlIEJpZ0RlY2ltYWx9LgorICAgICAqICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgICAgQmlnRGVjaW1hbH0uCiAgICAgICogQHBhcmFtIG1jCiAgICAgICogICAgICAgICAgICByb3VuZGluZyBtb2RlIGFuZCBwcmVjaXNpb24gZm9yIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24uCi0gICAgICogCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzY2FsZSBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYmlnCi0gICAgICogICAgICAgICAgICAgZGVjaW1hbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsfSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogICAgICAgICAgICAgb2YgYSBiaWcgZGVjaW1hbC4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBtYy5wcmVjaXNpb24gPiAwIGFuZCBtYy5yb3VuZGluZ01vZGUgPT0gVU5ORUNFU1NBUlkgYW5kCi0gICAgICogICAgICAgICAgICAgdGhlIG5ldyBiaWcgZGVjaW1hbCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgd2l0aGluIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgICAgIHByZWNpc2lvbiB3aXRob3V0IHJvdW5kaW5nLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBtYy5wcmVjaXNpb24gPiAwfSBhbmQge0Bjb2RlIG1jLnJvdW5kaW5nTW9kZSA9PQorICAgICAqICAgICAgICAgICAgIFVOTkVDRVNTQVJZfSBhbmQgdGhlIG5ldyBiaWcgZGVjaW1hbCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKKyAgICAgKiAgICAgICAgICAgICB3aXRoaW4gdGhlIGdpdmVuIHByZWNpc2lvbiB3aXRob3V0IHJvdW5kaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsKFN0cmluZyB2YWwsIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIHRoaXModmFsLnRvQ2hhckFycmF5KCksIDAsIHZhbC5sZW5ndGgoKSk7CkBAIC01NDcsMTggKzUzMCwxOSBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgZnJvbSB0aGUgNjRiaXQgZG91YmxlCi0gICAgICoge0Bjb2RlIHZhbH0uIFRoZSBjb25zdHJ1Y3RlZCBiaWcgZGVjaW1hbCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkb3VibGUuCi0gICAgICogRm9yIGV4YW1wbGUsIG5ldyBCaWdEZWNpbWFsKDAuMSkgaXMgZXF1YWwgdG8KLSAgICAgKiAwLjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjUuIFRoaXMgaGFwcGVucwotICAgICAqIGFzIDAuMSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBpbiBiaW5hcnkuCi0gICAgICogCi0gICAgICogVG8gZ2VuZXJhdGUgYSBiaWcgZGVjaW1hbCBpbnN0YW5jZSB3aGljaCBpcyBlcXVpdmFsZW50IHRvIDAuMSB1c2UgdGhlCi0gICAgICogQmlnRGVjaW1hbChTdHJpbmcpIGNvbnN0cnVjdG9yLgorICAgICAqIHtAY29kZSB2YWx9LiBUaGUgY29uc3RydWN0ZWQgYmlnIGRlY2ltYWwgaXMgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4KKyAgICAgKiBkb3VibGUuIEZvciBleGFtcGxlLCB7QGNvZGUgbmV3IEJpZ0RlY2ltYWwoMC4xKX0gaXMgZXF1YWwgdG8ge0Bjb2RlCisgICAgICogMC4xMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjU3ODI3MDIxMTgxNTgzNDA0NTQxMDE1NjI1fS4gVGhpcyBoYXBwZW5zCisgICAgICogYXMge0Bjb2RlIDAuMX0gY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgaW4gYmluYXJ5LgorICAgICAqIDxwPgorICAgICAqIFRvIGdlbmVyYXRlIGEgYmlnIGRlY2ltYWwgaW5zdGFuY2Ugd2hpY2ggaXMgZXF1aXZhbGVudCB0byB7QGNvZGUgMC4xfSB1c2UKKyAgICAgKiB0aGUge0Bjb2RlIEJpZ0RlY2ltYWwoU3RyaW5nKX0gY29uc3RydWN0b3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAogICAgICAqICAgICAgICAgICAgZG91YmxlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZS4KICAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCBpcyBpbmZpbml0eSBvciBub3QgYSBudW1iZXIuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbH0gaXMgaW5maW5pdHkgb3Igbm90IGEgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsKGRvdWJsZSB2YWwpIHsKICAgICAgICAgaWYgKERvdWJsZS5pc0luZmluaXRlKHZhbCkgfHwgRG91YmxlLmlzTmFOKHZhbCkpIHsKQEAgLTU3Nyw3ICs1NjEsNyBAQAogICAgICAgICAgICAgc2NhbGUgPSAwOwogICAgICAgICAgICAgcHJlY2lzaW9uID0gMTsKICAgICAgICAgfQotICAgICAgICAvLyBUbyBzaW1wbGlmeSBhbGwgZmFjdG9ycyAnMicgaW4gdGhlIG1hbnRpc2EKKyAgICAgICAgLy8gVG8gc2ltcGxpZnkgYWxsIGZhY3RvcnMgJzInIGluIHRoZSBtYW50aXNhIAogICAgICAgICBpZiAoc2NhbGUgPiAwKSB7CiAgICAgICAgICAgICB0cmFpbGluZ1plcm9zID0gTWF0aC5taW4oc2NhbGUsIExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zKG1hbnRpc2EpKTsKICAgICAgICAgICAgIG1hbnRpc2EgPj4+PSB0cmFpbGluZ1plcm9zOwpAQCAtNTkzLDEwICs1NzcsMTIgQEAKICAgICAgICAgICAgIGlmKGJpdExlbmd0aCA8IDY0KSB7CiAgICAgICAgICAgICAgICAgc21hbGxWYWx1ZSA9IG1hbnRpc2EgPDwgKC1zY2FsZSk7CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIEJpZ0ludCBiaSA9IG5ldyBCaWdJbnQoKTsKICAgICAgICAgICAgICAgICBiaS5wdXRMb25nSW50KG1hbnRpc2EpOwogICAgICAgICAgICAgICAgIGJpLnNoaWZ0KC1zY2FsZSk7CiAgICAgICAgICAgICAgICAgaW50VmFsID0gbmV3IEJpZ0ludGVnZXIoYmkpOworICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNjYWxlID0gMDsKICAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IDApIHsKQEAgLTYxNiwyNCArNjAyLDI1IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSBmcm9tIHRoZSA2NGJpdCBkb3VibGUKLSAgICAgKiB7QGNvZGUgdmFsfS4gVGhlIGNvbnN0cnVjdGVkIGJpZyBkZWNpbWFsIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRvdWJsZS4KLSAgICAgKiBGb3IgZXhhbXBsZSwgbmV3IEJpZ0RlY2ltYWwoMC4xKSBpcyBlcXVhbCB0bwotICAgICAqIDAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNS4gVGhpcyBoYXBwZW5zCi0gICAgICogYXMgMC4xIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIGJpbmFyeS4KLSAgICAgKiAKLSAgICAgKiBUbyBnZW5lcmF0ZSBhIGJpZyBkZWNpbWFsIGluc3RhbmNlIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gMC4xIHVzZSB0aGUKLSAgICAgKiBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuCisgICAgICoge0Bjb2RlIHZhbH0uIFRoZSBjb25zdHJ1Y3RlZCBiaWcgZGVjaW1hbCBpcyBlcXVpdmFsZW50IHRvIHRoZSBnaXZlbgorICAgICAqIGRvdWJsZS4gRm9yIGV4YW1wbGUsIHtAY29kZSBuZXcgQmlnRGVjaW1hbCgwLjEpfSBpcyBlcXVhbCB0byB7QGNvZGUKKyAgICAgKiAwLjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjV9LiBUaGlzIGhhcHBlbnMKKyAgICAgKiBhcyB7QGNvZGUgMC4xfSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBpbiBiaW5hcnkuCisgICAgICogPHA+CisgICAgICogVG8gZ2VuZXJhdGUgYSBiaWcgZGVjaW1hbCBpbnN0YW5jZSB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHtAY29kZSAwLjF9IHVzZQorICAgICAqIHRoZSB7QGNvZGUgQmlnRGVjaW1hbChTdHJpbmcpfSBjb25zdHJ1Y3Rvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCiAgICAgICogICAgICAgICAgICBkb3VibGUgdmFsdWUgdG8gYmUgY29udmVydGVkIHRvIGEge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlLgogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdmFsIGlzIGluZmluaXR5IG9yIG5vdCBhIG51bWJlci4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsfSBpcyBpbmZpbml0eSBvciBub3QgYSBudW1iZXIuCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbWMucHJlY2lzaW9uID4gMCBhbmQgbWMucm91bmRpbmdNb2RlID09IFVOTkVDRVNTQVJZIGFuZAotICAgICAqICAgICAgICAgICAgIHRoZSBuZXcgYmlnIGRlY2ltYWwgY2Fubm90IGJlIHJlcHJlc2VudGVkIHdpdGhpbiB0aGUgZ2l2ZW4KLSAgICAgKiAgICAgICAgICAgICBwcmVjaXNpb24gd2l0aG91dCByb3VuZGluZy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbWMucHJlY2lzaW9uID4gMH0gYW5kIHtAY29kZSBtYy5yb3VuZGluZ01vZGUgPT0KKyAgICAgKiAgICAgICAgICAgICBVTk5FQ0VTU0FSWX0gYW5kIHRoZSBuZXcgYmlnIGRlY2ltYWwgY2Fubm90IGJlIHJlcHJlc2VudGVkCisgICAgICogICAgICAgICAgICAgd2l0aGluIHRoZSBnaXZlbiBwcmVjaXNpb24gd2l0aG91dCByb3VuZGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbChkb3VibGUgdmFsLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICB0aGlzKHZhbCk7CkBAIC02NDIsMTEgKzYyOSwxMiBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gYmlnIGludGVnZXIKLSAgICAgKiB7QGNvZGUgdmFsfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgMC4KKyAgICAgKiB7QGNvZGUgdmFsfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMge0Bjb2RlIDB9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaWdJbnRlZ2VyfSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgdG8gYQotICAgICAqICAgICAgICAgICAge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIEJpZ0ludGVnZXJ9IHZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHtAY29kZQorICAgICAqICAgICAgICAgICAgQmlnRGVjaW1hbH0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwoQmlnSW50ZWdlciB2YWwpIHsKICAgICAgICAgdGhpcyh2YWwsIDApOwpAQCAtNjU0LDE4ICs2NDIsMTggQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGJpZyBpbnRlZ2VyCi0gICAgICoge0Bjb2RlIHZhbH0uIFRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIDAuCisgICAgICoge0Bjb2RlIHZhbH0uIFRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIHtAY29kZSAwfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB7QGNvZGUgQmlnSW50ZWdlcn0gdmFsdWUgdG8gYmUgY29udmVydGVkIHRvIGEKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaWdJbnRlZ2VyfSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIEJpZ0RlY2ltYWx9IGluc3RhbmNlLgogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1jLnByZWNpc2lvbiA+IDAgYW5kIG1jLnJvdW5kaW5nTW9kZSA9PSBVTk5FQ0VTU0FSWSBhbmQKLSAgICAgKiAgICAgICAgICAgICB0aGUgbmV3IGJpZyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoaW4gdGhlIGdpdmVuCi0gICAgICogICAgICAgICAgICAgcHJlY2lzaW9uIHdpdGhvdXQgcm91bmRpbmcuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG1jLnByZWNpc2lvbiA+IDB9IGFuZCB7QGNvZGUgbWMucm91bmRpbmdNb2RlID09CisgICAgICogICAgICAgICAgICAgVU5ORUNFU1NBUll9IGFuZCB0aGUgbmV3IGJpZyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZAorICAgICAqICAgICAgICAgICAgIHdpdGhpbiB0aGUgZ2l2ZW4gcHJlY2lzaW9uIHdpdGhvdXQgcm91bmRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwoQmlnSW50ZWdlciB2YWwsIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIHRoaXModmFsKTsKQEAgLTY3NSwxMyArNjYzLDE2IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgZnJvbSBhIGdpdmVuIHVuc2NhbGVkIHZhbHVlCiAgICAgICoge0Bjb2RlIHVuc2NhbGVkVmFsfSBhbmQgYSBnaXZlbiBzY2FsZS4gVGhlIHZhbHVlIG9mIHRoaXMgaW5zdGFuY2UgaXMKLSAgICAgKiB7QGNvZGUgdW5zY2FsZWRWYWx9ICogMTBeey17QGNvZGUgc2NhbGV9fS4KKyAgICAgKiB7QGNvZGUgdW5zY2FsZWRWYWx9IDEwXigte0Bjb2RlIHNjYWxlfSkuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVuc2NhbGVkVmFsCiAgICAgICogICAgICAgICAgICB7QGNvZGUgQmlnSW50ZWdlcn0gcmVwcmVzZW50aW5nIHRoZSB1bnNjYWxlZCB2YWx1ZSBvZiB0aGlzCiAgICAgICogICAgICAgICAgICB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UuCiAgICAgICogQHBhcmFtIHNjYWxlCiAgICAgICogICAgICAgICAgICBzY2FsZSBvZiB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHVuc2NhbGVkVmFsID09IG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsKEJpZ0ludGVnZXIgdW5zY2FsZWRWYWwsIGludCBzY2FsZSkgewogICAgICAgICBpZiAodW5zY2FsZWRWYWwgPT0gbnVsbCkgewpAQCAtNjk0LDggKzY4NSw4IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgZnJvbSBhIGdpdmVuIHVuc2NhbGVkIHZhbHVlCiAgICAgICoge0Bjb2RlIHVuc2NhbGVkVmFsfSBhbmQgYSBnaXZlbiBzY2FsZS4gVGhlIHZhbHVlIG9mIHRoaXMgaW5zdGFuY2UgaXMKLSAgICAgKiB7QGNvZGUgdW5zY2FsZWRWYWx9ICogMTBeey17QGNvZGUgc2NhbGV9fS4gVGhlIHJlc3VsdCBpcyByb3VuZGVkCi0gICAgICogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF0aCBjb250ZXh0LgorICAgICAqIHtAY29kZSB1bnNjYWxlZFZhbH0gMTBeKC17QGNvZGUgc2NhbGV9KS4gVGhlIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZworICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgbWF0aCBjb250ZXh0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB1bnNjYWxlZFZhbAogICAgICAqICAgICAgICAgICAge0Bjb2RlIEJpZ0ludGVnZXJ9IHJlcHJlc2VudGluZyB0aGUgdW5zY2FsZWQgdmFsdWUgb2YgdGhpcwpAQCAtNzA0LDExICs2OTUsMTMgQEAKICAgICAgKiAgICAgICAgICAgIHNjYWxlIG9mIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlLgogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1jLnByZWNpc2lvbiA+IDAgYW5kIG1jLnJvdW5kaW5nTW9kZSA9PSBVTk5FQ0VTU0FSWSBhbmQKLSAgICAgKiAgICAgICAgICAgICB0aGUgbmV3IGJpZyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoaW4gdGhlIGdpdmVuCi0gICAgICogICAgICAgICAgICAgcHJlY2lzaW9uIHdpdGhvdXQgcm91bmRpbmcuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG1jLnByZWNpc2lvbiA+IDB9IGFuZCB7QGNvZGUgbWMucm91bmRpbmdNb2RlID09CisgICAgICogICAgICAgICAgICAgVU5ORUNFU1NBUll9IGFuZCB0aGUgbmV3IGJpZyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZAorICAgICAqICAgICAgICAgICAgIHdpdGhpbiB0aGUgZ2l2ZW4gcHJlY2lzaW9uIHdpdGhvdXQgcm91bmRpbmcuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB1bnNjYWxlZFZhbCA9PSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbChCaWdJbnRlZ2VyIHVuc2NhbGVkVmFsLCBpbnQgc2NhbGUsIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIHRoaXModW5zY2FsZWRWYWwsIHNjYWxlKTsKQEAgLTcyMSwxNCArNzE0LDE1IEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAogICAgICAqICAgICAgICAgICAgaW50IHZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbChpbnQgdmFsKSB7CiAgICAgICAgIHRoaXModmFsLDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGludAotICAgICAqIHtAY29kZSB2YWx9LiBUaGUgc2NhbGUgb2YgdGhlIHJlc3VsdCBpcyAwLiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBpbnQge0Bjb2RlCisgICAgICogdmFsfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMge0Bjb2RlIDB9LiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQKICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXRoIGNvbnRleHQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbApAQCAtNzM2LDkgKzczMCwxMCBAQAogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1jLnByZWNpc2lvbiA+IDAgYW5kIG1jLnJvdW5kaW5nTW9kZSA9PSBVTk5FQ0VTU0FSWSBhbmQKLSAgICAgKiAgICAgICAgICAgICB0aGUgbmV3IGJpZyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoaW4gdGhlIGdpdmVuCi0gICAgICogICAgICAgICAgICAgcHJlY2lzaW9uIHdpdGhvdXQgcm91bmRpbmcuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG1jLnByZWNpc2lvbiA+IDB9IGFuZCB7QGNvZGUgYy5yb3VuZGluZ01vZGUgPT0KKyAgICAgKiAgICAgICAgICAgICBVTk5FQ0VTU0FSWX0gYW5kIHRoZSBuZXcgYmlnIGRlY2ltYWwgY2Fubm90IGJlIHJlcHJlc2VudGVkCisgICAgICogICAgICAgICAgICAgd2l0aGluIHRoZSBnaXZlbiBwcmVjaXNpb24gd2l0aG91dCByb3VuZGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbChpbnQgdmFsLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICB0aGlzKHZhbCwwKTsKQEAgLTc0NiwzMCArNzQxLDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gbG9uZwotICAgICAqIHtAY29kZSB2YWx9LiBUaGUgc2NhbGUgb2YgdGhlIHJlc3VsdCBpcyAwLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGxvbmcge0Bjb2RlCisgICAgICogdmFsfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMge0Bjb2RlIDB9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKICAgICAgKiAgICAgICAgICAgIGxvbmcgdmFsdWUgdG8gYmUgY29udmVydGVkIHRvIGEge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsKGxvbmcgdmFsKSB7CiAgICAgICAgIHRoaXModmFsLDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGxvbmcKLSAgICAgKiB7QGNvZGUgdmFsfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgMC4gVGhlIHJlc3VsdCBpcyByb3VuZGVkCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gbG9uZyB7QGNvZGUKKyAgICAgKiB2YWx9LiBUaGUgc2NhbGUgb2YgdGhlIHJlc3VsdCBpcyB7QGNvZGUgMH0uIFRoZSByZXN1bHQgaXMgcm91bmRlZAogICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIG1hdGggY29udGV4dC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCiAgICAgICogICAgICAgICAgICBsb25nIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZS4KICAgICAgKiBAcGFyYW0gbWMKICAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgYW5kIHByZWNpc2lvbiBmb3IgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBtYy5wcmVjaXNpb24gPiAwIGFuZCBtYy5yb3VuZGluZ01vZGUgPT0gVU5ORUNFU1NBUlkgYW5kCi0gICAgICogICAgICAgICAgICAgdGhlIG5ldyBiaWcgZGVjaW1hbCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgd2l0aGluIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgICAgIHByZWNpc2lvbiB3aXRob3V0IHJvdW5kaW5nLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBtYy5wcmVjaXNpb24gPiAwfSBhbmQge0Bjb2RlIG1jLnJvdW5kaW5nTW9kZSA9PQorICAgICAqICAgICAgICAgICAgIFVOTkVDRVNTQVJZfSBhbmQgdGhlIG5ldyBiaWcgZGVjaW1hbCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKKyAgICAgKiAgICAgICAgICAgICB3aXRoaW4gdGhlIGdpdmVuIHByZWNpc2lvbiB3aXRob3V0IHJvdW5kaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsKGxvbmcgdmFsLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICB0aGlzKHZhbCk7CkBAIC03NzksMTYgKzc3NSwxOCBAQAogICAgIC8qIFB1YmxpYyBNZXRob2RzICovCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0bwotICAgICAqIHtAY29kZSB1bnNjYWxlZFZhbH0gKiAxMF57LXtAY29kZSBzY2FsZX19LiBUaGUgc2NhbGUgb2YgdGhlIHJlc3VsdCBpcwotICAgICAqIHtAY29kZSBzY2FsZX0sIGFuZCBpdHMgdW5zY2FsZWQgdmFsdWUgaXMge0Bjb2RlIHVuc2NhbGVkVmFsfS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byB7QGNvZGUKKyAgICAgKiB1bnNjYWxlZFZhbH0gMTBeKC17QGNvZGUgc2NhbGV9KS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMge0Bjb2RlCisgICAgICogc2NhbGV9LCBhbmQgaXRzIHVuc2NhbGVkIHZhbHVlIGlzIHtAY29kZSB1bnNjYWxlZFZhbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHVuc2NhbGVkVmFsCi0gICAgICogICAgICAgICAgICB1bnNjYWxlZCB2YWx1ZSB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbmV3Ci0gICAgICogICAgICAgICAgICB7QGNvZGUgQmlnRGVjaW1hbH0uCisgICAgICogICAgICAgICAgICB1bnNjYWxlZCB2YWx1ZSB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbmV3IHtAY29kZQorICAgICAqICAgICAgICAgICAgQmlnRGVjaW1hbH0uCiAgICAgICogQHBhcmFtIHNjYWxlCiAgICAgICogICAgICAgICAgICBzY2FsZSB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbmV3IHtAY29kZSBCaWdEZWNpbWFsfS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aXRoIHRoZSB2YWx1ZSB7QGNvZGUgdW5zY2FsZWRWYWx9KjEwXnste0Bjb2RlIHVuc2NhbGVkVmFsfX0uCisgICAgICogQHJldHVybiB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2Ugd2l0aCB0aGUgdmFsdWUge0Bjb2RlIHVuc2NhbGVkVmFsfSoKKyAgICAgKiAgICAgICAgIDEwXigte0Bjb2RlIHVuc2NhbGVkVmFsfSkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCaWdEZWNpbWFsIHZhbHVlT2YobG9uZyB1bnNjYWxlZFZhbCwgaW50IHNjYWxlKSB7CiAgICAgICAgIGlmIChzY2FsZSA9PSAwKSB7CkBAIC04MDIsMTMgKzgwMCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvCi0gICAgICoge0Bjb2RlIHVuc2NhbGVkVmFsfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgMCwgYW5kIGl0cyB1bnNjYWxlZAorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvIHtAY29kZQorICAgICAqIHVuc2NhbGVkVmFsfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMge0Bjb2RlIDB9LCBhbmQgaXRzIHVuc2NhbGVkCiAgICAgICogdmFsdWUgaXMge0Bjb2RlIHVuc2NhbGVkVmFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdW5zY2FsZWRWYWwKICAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHtAY29kZSBCaWdEZWNpbWFsfS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aXRoIHRoZSB2YWx1ZSB7QGNvZGUgdW5zY2FsZWRWYWx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCB2YWx1ZU9mKGxvbmcgdW5zY2FsZWRWYWwpIHsKICAgICAgICAgaWYgKCh1bnNjYWxlZFZhbCA+PSAwKSAmJiAodW5zY2FsZWRWYWwgPCBCSV9TQ0FMRURfQllfWkVST19MRU5HVEgpKSB7CkBAIC04MTgsMjUgKzgxNywyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvCi0gICAgICoge0Bjb2RlIHVuc2NhbGVkVmFsfS4KLSAgICAgKiAKLSAgICAgKiBUaGUgbmV3IGRlY2ltYWwgaXMgY29uc3RydWN0ZWQgYXMgaWYgdGhlIHtAY29kZSBCaWdEZWNpbWFsKFN0cmluZyl9Ci0gICAgICogY29uc3RydWN0b3IgaXMgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgd2hpY2ggaXMgZXF1YWwgdG8KLSAgICAgKiB7QGNvZGUgRG91YmxlLnRvU3RyaW5nKHZhbCl9LgotICAgICAqIAotICAgICAqIEZvciBleGFtcGxlLCB2YWx1ZU9mKDAuMSkgaXMgY29udmVydGVkIHRvICh1bnNjYWxlZD0xLCBzY2FsZT0xKSwgYWx0aG91Z2gKLSAgICAgKiB0aGUgZG91YmxlIDAuMSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGRvdWJsZSB2YWx1ZS4gSW4KLSAgICAgKiBjb250cmFzdCB0byB0aGF0LCBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbCgwLjEpfSBpbnN0YW5jZSBoYXMgdGhlIHZhbHVlCi0gICAgICogMC4xMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjU3ODI3MDIxMTgxNTgzNDA0NTQxMDE1NjI1IHdpdGggYW4KLSAgICAgKiB1bnNjYWxlZCB2YWx1ZSAxMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjU3ODI3MDIxMTgxNTgzNDA0NTQxMDE1NjI1Ci0gICAgICogYW5kIHRoZSBzY2FsZSA1NS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byB7QGNvZGUKKyAgICAgKiB1bnNjYWxlZFZhbH0uIFRoZSBuZXcgZGVjaW1hbCBpcyBjb25zdHJ1Y3RlZCBhcyBpZiB0aGUge0Bjb2RlCisgICAgICogQmlnRGVjaW1hbChTdHJpbmcpfSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCB3aGljaCBpcyBlcXVhbAorICAgICAqIHRvIHtAY29kZSBEb3VibGUudG9TdHJpbmcodmFsKX0uIEZvciBleGFtcGxlLCB7QGNvZGUgdmFsdWVPZigwLjEpfSBpcworICAgICAqIGNvbnZlcnRlZCB0byAodW5zY2FsZWQ9MSwgc2NhbGU9MSksIGFsdGhvdWdoIHRoZSBkb3VibGUge0Bjb2RlIDAuMX0KKyAgICAgKiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGRvdWJsZSB2YWx1ZS4gSW4gY29udHJhc3QgdG8gdGhhdCwgYQorICAgICAqIG5ldyB7QGNvZGUgQmlnRGVjaW1hbCgwLjEpfSBpbnN0YW5jZSBoYXMgdGhlIHZhbHVlIHtAY29kZQorICAgICAqIDAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNX0gd2l0aCBhbgorICAgICAqIHVuc2NhbGVkIHZhbHVlIHtAY29kZQorICAgICAqIDEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjV9IGFuZCB0aGUgc2NhbGUKKyAgICAgKiB7QGNvZGUgNTV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKICAgICAgKiAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgQmlnRGVjaW1hbH0uCiAgICAgICogQHJldHVybiB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2Ugd2l0aCB0aGUgdmFsdWUge0Bjb2RlIHZhbH0uCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgaXMgaW5maW5pdGUgb3IgdmFsIGlzIG5vdCBhIG51bWJlci4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsfSBpcyBpbmZpbml0ZSBvciB7QGNvZGUgdmFsfSBpcyBub3QgYSBudW1iZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgdmFsdWVPZihkb3VibGUgdmFsKSB7CiAgICAgICAgIGlmIChEb3VibGUuaXNJbmZpbml0ZSh2YWwpIHx8IERvdWJsZS5pc05hTih2YWwpKSB7CkBAIC04NTUsNyArODUzLDggQEAKICAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFkZGVkIHRvIHtAY29kZSB0aGlzfS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzICsgYXVnZW5kfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYXVnZW5kID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYXVnZW5kID09IG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGFkZChCaWdEZWNpbWFsIGF1Z2VuZCkgewogICAgICAgICBpbnQgZGlmZlNjYWxlID0gdGhpcy5zY2FsZSAtIGF1Z2VuZC5zY2FsZTsKQEAgLTg3Miw3ICs4NzEsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIExldCBiZTogdGhpcyA9IFt1MSxzMV0gYW5kIGF1Z2VuZCA9IFt1MixzMl0KKyAgICAgICAgLy8gTGV0IGJlOiAgdGhpcyA9IFt1MSxzMV0gIGFuZCAgYXVnZW5kID0gW3UyLHMyXQogICAgICAgICBpZiAoZGlmZlNjYWxlID09IDApIHsKICAgICAgICAgICAgIC8vIGNhc2UgczEgPT0gczI6IFt1MSArIHUyICwgczFdCiAgICAgICAgICAgICBpZiAoTWF0aC5tYXgodGhpcy5iaXRMZW5ndGgsIGF1Z2VuZC5iaXRMZW5ndGgpICsgMSA8IDY0KSB7CkBAIC04ODgsMTcgKzg4NywxOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIEJpZ0RlY2ltYWwgYWRkQW5kTXVsdDEwKEJpZ0RlY2ltYWwgdGhpc1ZhbHVlLEJpZ0RlY2ltYWwgYXVnZW5kLCBpbnQgZGlmZlNjYWxlKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZihkaWZmU2NhbGUgPCBMT05HX1RFTl9QT1cubGVuZ3RoICYmCiAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpc1ZhbHVlLmJpdExlbmd0aCxhdWdlbmQuYml0TGVuZ3RoK0xPTkdfVEVOX1BPV19CSVRfTEVOR1RIW2RpZmZTY2FsZV0pKzE8NjQpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZU9mKHRoaXNWYWx1ZS5zbWFsbFZhbHVlK2F1Z2VuZC5zbWFsbFZhbHVlKkxPTkdfVEVOX1BPV1tkaWZmU2NhbGVdLHRoaXNWYWx1ZS5zY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBCaWdJbnQgYmkgPSBNdWx0aXBsaWNhdGlvbi5tdWx0aXBseUJ5VGVuUG93KGF1Z2VuZC5nZXRVbnNjYWxlZFZhbHVlKCksZGlmZlNjYWxlKS5iaWdJbnQ7CiAgICAgICAgICAgICBiaS5hZGQodGhpc1ZhbHVlLmdldFVuc2NhbGVkVmFsdWUoKS5iaWdJbnQpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKG5ldyBCaWdJbnRlZ2VyKGJpKSwgdGhpc1ZhbHVlLnNjYWxlKTsKICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQotCisgICAgCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXMgKyBhdWdlbmR9LgogICAgICAqIFRoZSByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIHBhc3NlZCBjb250ZXh0IHtAY29kZSBtY30uCkBAIC05MDksNyArOTA5LDggQEAKICAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgYW5kIHByZWNpc2lvbiBmb3IgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzICsgYXVnZW5kfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYXVnZW5kID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYXVnZW5kID09IG51bGx9IG9yIHtAY29kZSBtYyA9PSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBhZGQoQmlnRGVjaW1hbCBhdWdlbmQsIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgbGFyZ2VyOyAvLyBvcGVyYW5kIHdpdGggdGhlIGxhcmdlc3QgdW5zY2FsZWQgdmFsdWUKQEAgLTkxNyw3ICs5MTgsNyBAQAogICAgICAgICBCaWdJbnRlZ2VyIHRlbXBCSTsKICAgICAgICAgbG9uZyBkaWZmU2NhbGUgPSAobG9uZyl0aGlzLnNjYWxlIC0gYXVnZW5kLnNjYWxlOwogICAgICAgICBpbnQgbGFyZ2VyU2lnbnVtOwotICAgICAgICAvLyBTb21lIG9wZXJhbmQgaXMgemVybyBvciB0aGUgcHJlY2lzaW9uIGlzIGluZmluaXR5CisgICAgICAgIC8vIFNvbWUgb3BlcmFuZCBpcyB6ZXJvIG9yIHRoZSBwcmVjaXNpb24gaXMgaW5maW5pdHkgIAogICAgICAgICBpZiAoKGF1Z2VuZC5pc1plcm8oKSkgfHwgKHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICAgICAgICAgfHwgKG1jLmdldFByZWNpc2lvbigpID09IDApKSB7CiAgICAgICAgICAgICByZXR1cm4gYWRkKGF1Z2VuZCkucm91bmQobWMpOwpAQCAtOTI5LDE1ICs5MzAsMTQgQEAKICAgICAgICAgfSBlbHNlIGlmIChhdWdlbmQuYXByb3hQcmVjaXNpb24oKSA8IC1kaWZmU2NhbGUgLSAxKSB7CiAgICAgICAgICAgICBsYXJnZXIgPSB0aGlzOwogICAgICAgICAgICAgc21hbGxlciA9IGF1Z2VuZDsKLSAgICAgICAgfSBlbHNlIHsvLyBObyBvcHRpbWl6YXRpb24gaXMgZG9uZQorICAgICAgICB9IGVsc2Ugey8vIE5vIG9wdGltaXphdGlvbiBpcyBkb25lIAogICAgICAgICAgICAgcmV0dXJuIGFkZChhdWdlbmQpLnJvdW5kKG1jKTsKICAgICAgICAgfQogICAgICAgICBpZiAobWMuZ2V0UHJlY2lzaW9uKCkgPj0gbGFyZ2VyLmFwcm94UHJlY2lzaW9uKCkpIHsKICAgICAgICAgICAgIC8vIE5vIG9wdGltaXphdGlvbiBpcyBkb25lCiAgICAgICAgICAgICByZXR1cm4gYWRkKGF1Z2VuZCkucm91bmQobWMpOwogICAgICAgICB9Ci0gICAgICAgIC8vIENhc2VzIHdoZXJlIGl0J3MgdW5uZWNlc3NhcnkgdG8gYWRkIHR3byBudW1iZXJzIHdpdGggdmVyeSBkaWZmZXJlbnQKLSAgICAgICAgLy8gc2NhbGVzCisgICAgICAgIC8vIENhc2VzIHdoZXJlIGl0J3MgdW5uZWNlc3NhcnkgdG8gYWRkIHR3byBudW1iZXJzIHdpdGggdmVyeSBkaWZmZXJlbnQgc2NhbGVzIAogICAgICAgICBsYXJnZXJTaWdudW0gPSBsYXJnZXIuc2lnbnVtKCk7CiAgICAgICAgIGlmIChsYXJnZXJTaWdudW0gPT0gc21hbGxlci5zaWdudW0oKSkgewogICAgICAgICAgICAgdGVtcEJJID0gTXVsdGlwbGljYXRpb24ubXVsdGlwbHlCeVBvc2l0aXZlSW50KGxhcmdlci5nZXRVbnNjYWxlZFZhbHVlKCksMTApCkBAIC05NDgsMjEgKzk0OCwyMiBAQAogICAgICAgICAgICAgdGVtcEJJID0gTXVsdGlwbGljYXRpb24ubXVsdGlwbHlCeVBvc2l0aXZlSW50KHRlbXBCSSwxMCkKICAgICAgICAgICAgIC5hZGQoQmlnSW50ZWdlci52YWx1ZU9mKGxhcmdlclNpZ251bSAqIDkpKTsKICAgICAgICAgfQotICAgICAgICAvLyBSb3VuZGluZyB0aGUgaW1wcm92ZWQgYWRkaW5nCisgICAgICAgIC8vIFJvdW5kaW5nIHRoZSBpbXByb3ZlZCBhZGRpbmcgCiAgICAgICAgIGxhcmdlciA9IG5ldyBCaWdEZWNpbWFsKHRlbXBCSSwgbGFyZ2VyLnNjYWxlICsgMSk7CiAgICAgICAgIHJldHVybiBsYXJnZXIucm91bmQobWMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzIC0gc3VidHJhaGVuZH0uCi0gICAgICogVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgdGhlIG1heGltdW0gb2YgdGhlIHNjYWxlcyBvZiB0aGUgdHdvCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXMgLSBzdWJ0cmFoZW5kfQorICAgICAqIC4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgdGhlIG1heGltdW0gb2YgdGhlIHNjYWxlcyBvZiB0aGUgdHdvCiAgICAgICogYXJndW1lbnRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdWJ0cmFoZW5kCiAgICAgICogICAgICAgICAgICB2YWx1ZSB0byBiZSBzdWJ0cmFjdGVkIGZyb20ge0Bjb2RlIHRoaXN9LgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgLSBzdWJ0cmFoZW5kfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc3VidHJhaGVuZCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN1YnRyYWhlbmQgPT0gbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgc3VidHJhY3QoQmlnRGVjaW1hbCBzdWJ0cmFoZW5kKSB7CiAgICAgICAgIGludCBkaWZmU2NhbGUgPSB0aGlzLnNjYWxlIC0gc3VidHJhaGVuZC5zY2FsZTsKQEAgLTEwMTUsNyArMTAxNiw4IEBACiAgICAgICogICAgICAgICAgICByb3VuZGluZyBtb2RlIGFuZCBwcmVjaXNpb24gZm9yIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24uCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyAtIHN1YnRyYWhlbmR9LgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzdWJ0cmFoZW5kID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3VidHJhaGVuZCA9PSBudWxsfSBvciB7QGNvZGUgbWMgPT0gbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgc3VidHJhY3QoQmlnRGVjaW1hbCBzdWJ0cmFoZW5kLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICBsb25nIGRpZmZTY2FsZSA9IHN1YnRyYWhlbmQuc2NhbGUgLSAobG9uZyl0aGlzLnNjYWxlOwpAQCAtMTA1MCwxNSArMTA1MiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzCi0gICAgICoge0Bjb2RlIHRoaXMgKiBtdWx0aXBsaWNhbmR9LiBUaGUgc2NhbGUgb2YgdGhlIHJlc3VsdCBpcyB0aGUgc3VtIG9mIHRoZQotICAgICAqIHNjYWxlcyBvZiB0aGUgdHdvIGFyZ3VtZW50cy4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSB3aG9zZSB2YWx1ZSBpcyB7QGNvZGUgdGhpcyAqCisgICAgICogbXVsdGlwbGljYW5kfS4gVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgdGhlIHN1bSBvZiB0aGUgc2NhbGVzIG9mIHRoZQorICAgICAqIHR3byBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG11bHRpcGxpY2FuZAogICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgbXVsdGlwbGllZCB3aXRoIHtAY29kZSB0aGlzfS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzICogbXVsdGlwbGljYW5kfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbXVsdGlwbGljYW5kID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbXVsdGlwbGljYW5kID09IG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIG11bHRpcGx5KEJpZ0RlY2ltYWwgbXVsdGlwbGljYW5kKSB7CiAgICAgICAgIGxvbmcgbmV3U2NhbGUgPSAobG9uZyl0aGlzLnNjYWxlICsgbXVsdGlwbGljYW5kLnNjYWxlOwpAQCAtMTA3Niw5ICsxMDc5LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSB3aG9zZSB2YWx1ZSBpcwotICAgICAqIHtAY29kZSB0aGlzICogbXVsdGlwbGljYW5kfS4gVGhlIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byB0aGUKLSAgICAgKiBwYXNzZWQgY29udGV4dCB7QGNvZGUgbWN9LgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzICoKKyAgICAgKiBtdWx0aXBsaWNhbmR9LiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBwYXNzZWQgY29udGV4dAorICAgICAqIHtAY29kZSBtY30uCiAgICAgICogCiAgICAgICogQHBhcmFtIG11bHRpcGxpY2FuZAogICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgbXVsdGlwbGllZCB3aXRoIHtAY29kZSB0aGlzfS4KQEAgLTEwODYsNyArMTA4OSw4IEBACiAgICAgICogICAgICAgICAgICByb3VuZGluZyBtb2RlIGFuZCBwcmVjaXNpb24gZm9yIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24uCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyAqIG11bHRpcGxpY2FuZH0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG11bHRpcGxpY2FuZCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG11bHRpcGxpY2FuZCA9PSBudWxsfSBvciB7QGNvZGUgbWMgPT0gbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgbXVsdGlwbHkoQmlnRGVjaW1hbCBtdWx0aXBsaWNhbmQsIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgcmVzdWx0ID0gbXVsdGlwbHkobXVsdGlwbGljYW5kKTsKQEAgLTExMTAsMTQgKzExMTQsMTUgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0gcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHJvdW5kaW5nCiAgICAgICogICAgICAgICBtb2RlLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nTW9kZSBpcyBub3QgYSB2YWxpZCByb3VuZGluZyBtb2RlCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZX0gaXMgbm90IGEgdmFsaWQgcm91bmRpbmcgbW9kZS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSAwfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiByb3VuZGluZ01vZGUgPT0gUk9VTkRfVU5ORUNFU1NBUlkgYW5kIHJvdW5kaW5nIGlzCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZSA9PSBST1VORF9VTk5FQ0VTU0FSWX0gYW5kIHJvdW5kaW5nIGlzCiAgICAgICogICAgICAgICAgICAgbmVjZXNzYXJ5IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgZGl2aWRlKEJpZ0RlY2ltYWwgZGl2aXNvciwgaW50IHNjYWxlLCBpbnQgcm91bmRpbmdNb2RlKSB7CiAgICAgICAgIHJldHVybiBkaXZpZGUoZGl2aXNvciwgc2NhbGUsIFJvdW5kaW5nTW9kZS52YWx1ZU9mKHJvdW5kaW5nTW9kZSkpOwpAQCAtMTEzOCwxNiArMTE0MywxNyBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgLyBkaXZpc29yfSByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcm91bmRpbmcKICAgICAgKiAgICAgICAgIG1vZGUuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gbnVsbCBvciByb3VuZGluZ01vZGUgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IG51bGx9IG9yIHtAY29kZSByb3VuZGluZ01vZGUgPT0gbnVsbH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZGl2aXNvciA9PSAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRpdmlzb3IgPT0gMH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgcm91bmRpbmdNb2RlID09IFJvdW5kaW5nTW9kZS5VTk5FQ0VTU0FSWSBhbmQgcm91bmRpbmcgaXMKLSAgICAgKiAgICAgICAgICAgICBuZWNlc3NhcnkgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzY2FsZSBhbmQgZ2l2ZW4gcHJlY2lzaW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSByb3VuZGluZ01vZGUgPT0gUm91bmRpbmdNb2RlLlVOTkVDRVNTQVJ9WSBhbmQKKyAgICAgKiAgICAgICAgICAgICByb3VuZGluZyBpcyBuZWNlc3NhcnkgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzY2FsZSBhbmQgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgICBwcmVjaXNpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgZGl2aWRlKEJpZ0RlY2ltYWwgZGl2aXNvciwgaW50IHNjYWxlLAotICAgICAgICAgICAgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkgewotICAgICAgICAvLyBMZXQgYmU6IHRoaXMgPSBbdTEsczFdIGFuZCBkaXZpc29yID0gW3UyLHMyXQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGRpdmlkZShCaWdEZWNpbWFsIGRpdmlzb3IsIGludCBzY2FsZSwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkgeworICAgICAgICAvLyBMZXQgYmU6IHRoaXMgPSBbdTEsczFdICBhbmQgIGRpdmlzb3IgPSBbdTIsczJdCiAgICAgICAgIGlmIChyb3VuZGluZ01vZGUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KQEAgLTExNzksNyArMTE4NSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlKTsKICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTI1MSw4ICsxMjU2LDggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0uCi0gICAgICogVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgdGhlIHNjYWxlIG9mIHRoaXMuIElmIHJvdW5kaW5nIGlzIHJlcXVpcmVkIHRvCi0gICAgICogbWVldCB0aGUgc3BlY2lmaWVkIHNjYWxlLCB0aGVuIHRoZSBzcGVjaWZpZWQgcm91bmRpbmcgbW9kZQorICAgICAqIFRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIHRoZSBzY2FsZSBvZiB7QGNvZGUgdGhpc30uIElmIHJvdW5kaW5nIGlzCisgICAgICogcmVxdWlyZWQgdG8gbWVldCB0aGUgc3BlY2lmaWVkIHNjYWxlLCB0aGVuIHRoZSBzcGVjaWZpZWQgcm91bmRpbmcgbW9kZQogICAgICAqIHtAY29kZSByb3VuZGluZ01vZGV9IGlzIGFwcGxpZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpdmlzb3IKQEAgLTEyNjIsMTQgKzEyNjcsMTUgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0gcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHJvdW5kaW5nCiAgICAgICogICAgICAgICBtb2RlLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nTW9kZSBpcyBub3QgYSB2YWxpZCByb3VuZGluZyBtb2RlCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZX0gaXMgbm90IGEgdmFsaWQgcm91bmRpbmcgbW9kZS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSAwfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiByb3VuZGluZ01vZGUgPT0gUk9VTkRfVU5ORUNFU1NBUlkgYW5kIHJvdW5kaW5nIGlzCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZSA9PSBST1VORF9VTk5FQ0VTU0FSWX0gYW5kIHJvdW5kaW5nIGlzCiAgICAgICogICAgICAgICAgICAgbmVjZXNzYXJ5IGFjY29yZGluZyB0byB0aGUgc2NhbGUgb2YgdGhpcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBkaXZpZGUoQmlnRGVjaW1hbCBkaXZpc29yLCBpbnQgcm91bmRpbmdNb2RlKSB7CiAgICAgICAgIHJldHVybiBkaXZpZGUoZGl2aXNvciwgc2NhbGUsIFJvdW5kaW5nTW9kZS52YWx1ZU9mKHJvdW5kaW5nTW9kZSkpOwpAQCAtMTI3Nyw4ICsxMjgzLDggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0uCi0gICAgICogVGhlIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgdGhlIHNjYWxlIG9mIHRoaXMuIElmIHJvdW5kaW5nIGlzIHJlcXVpcmVkIHRvCi0gICAgICogbWVldCB0aGUgc3BlY2lmaWVkIHNjYWxlLCB0aGVuIHRoZSBzcGVjaWZpZWQgcm91bmRpbmcgbW9kZQorICAgICAqIFRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIHRoZSBzY2FsZSBvZiB7QGNvZGUgdGhpc30uIElmIHJvdW5kaW5nIGlzCisgICAgICogcmVxdWlyZWQgdG8gbWVldCB0aGUgc3BlY2lmaWVkIHNjYWxlLCB0aGVuIHRoZSBzcGVjaWZpZWQgcm91bmRpbmcgbW9kZQogICAgICAqIHtAY29kZSByb3VuZGluZ01vZGV9IGlzIGFwcGxpZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpdmlzb3IKQEAgLTEyODgsMTIgKzEyOTQsMTMgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0gcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHJvdW5kaW5nCiAgICAgICogICAgICAgICBtb2RlLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwgb3Igcm91bmRpbmdNb2RlID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfSBvciB7QGNvZGUgcm91bmRpbmdNb2RlID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IDB9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nTW9kZSA9PSBSb3VuZGluZ01vZGUuVU5ORUNFU1NBUlkgYW5kIHJvdW5kaW5nIGlzCi0gICAgICogICAgICAgICAgICAgbmVjZXNzYXJ5IGFjY29yZGluZyB0byB0aGUgc2NhbGUgb2YgdGhpcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcm91bmRpbmdNb2RlID09IFJvdW5kaW5nTW9kZS5VTk5FQ0VTU0FSWX0gYW5kCisgICAgICogICAgICAgICAgICAgcm91bmRpbmcgaXMgbmVjZXNzYXJ5IGFjY29yZGluZyB0byB0aGUgc2NhbGUgb2YgdGhpcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBkaXZpZGUoQmlnRGVjaW1hbCBkaXZpc29yLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKSB7CiAgICAgICAgIHJldHVybiBkaXZpZGUoZGl2aXNvciwgc2NhbGUsIHJvdW5kaW5nTW9kZSk7CkBAIC0xMzAxLDIwICsxMzA4LDIxIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSB3aG9zZSB2YWx1ZSBpcyB7QGNvZGUgdGhpcyAvIGRpdmlzb3J9LgotICAgICAqIFRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSBzY2FsZXMgb2YgdGhpcyBhbmQKLSAgICAgKiBkaXZpc29yLiBJZiB0aGUgZXhhY3QgcmVzdWx0IHJlcXVpcmVzIG1vcmUgZGlnaXRzLCB0aGVuIHRoZSBzY2FsZSBpcwotICAgICAqIGFkanVzdGVkIGFjY29yZGluZ2x5LiBGb3IgZXhhbXBsZSwgMS8xMjggPSAwLjAwNzgxMjUgd2hpY2ggaGFzIGEgc2NhbGUgb2YKLSAgICAgKiA3IGFuZCBwcmVjaXNpb24gNS4KKyAgICAgKiBUaGUgc2NhbGUgb2YgdGhlIHJlc3VsdCBpcyB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgc2NhbGVzIG9mIHtAY29kZSB0aGlzfQorICAgICAqIGFuZCB7QGNvZGUgZGl2aXNvcn0uIElmIHRoZSBleGFjdCByZXN1bHQgcmVxdWlyZXMgbW9yZSBkaWdpdHMsIHRoZW4gdGhlCisgICAgICogc2NhbGUgaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuIEZvciBleGFtcGxlLCB7QGNvZGUgMS8xMjggPSAwLjAwNzgxMjV9CisgICAgICogd2hpY2ggaGFzIGEgc2NhbGUgb2Yge0Bjb2RlIDd9IGFuZCBwcmVjaXNpb24ge0Bjb2RlIDV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkaXZpc29yCiAgICAgICogICAgICAgICAgICB2YWx1ZSBieSB3aGljaCB7QGNvZGUgdGhpc30gaXMgZGl2aWRlZC4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IDB9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXN1bHQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVzdWx0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGRpdmlkZShCaWdEZWNpbWFsIGRpdmlzb3IpIHsKICAgICAgICAgQmlnSW50ZWdlciBwID0gdGhpcy5nZXRVbnNjYWxlZFZhbHVlKCk7CkBAIC0xMzgwLDggKzEzODgsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0uCiAgICAgICogVGhlIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgcGFzc2VkIGNvbnRleHQge0Bjb2RlIG1jfS4gSWYgdGhlCi0gICAgICogcGFzc2VkIG1hdGggY29udGV4dCBzcGVjaWZpZXMgcHJlY2lzaW9uIDAsIHRoZW4gdGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQKLSAgICAgKiB0byB7QGNvZGUgdGhpcy5kaXZpZGUoZGl2aXNvcil9LgorICAgICAqIHBhc3NlZCBtYXRoIGNvbnRleHQgc3BlY2lmaWVzIHByZWNpc2lvbiB7QGNvZGUgMH0sIHRoZW4gdGhpcyBjYWxsIGlzCisgICAgICogZXF1aXZhbGVudCB0byB7QGNvZGUgdGhpcy5kaXZpZGUoZGl2aXNvcil9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkaXZpc29yCiAgICAgICogICAgICAgICAgICB2YWx1ZSBieSB3aGljaCB7QGNvZGUgdGhpc30gaXMgZGl2aWRlZC4KQEAgLTEzODksMTIgKzEzOTcsMTMgQEAKICAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgYW5kIHByZWNpc2lvbiBmb3IgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gbnVsbCBvciBtYyA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRpdmlzb3IgPT0gbnVsbH0gb3Ige0Bjb2RlIG1jID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IDB9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1jLmdldFJvdW5kaW5nTW9kZSgpID09IFVOTkVDRVNTQVJZIGFuZCByb3VuZGluZyBpcwotICAgICAqICAgICAgICAgICAgIG5lY2Vzc2FyeSBhY2NvcmRpbmcgdG8gbWMuZ2V0UHJlY2lzaW9uKCkKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbWMuZ2V0Um91bmRpbmdNb2RlKCkgPT0gVU5ORUNFU1NBUll9IGFuZCByb3VuZGluZworICAgICAqICAgICAgICAgICAgIGlzIG5lY2Vzc2FyeSBhY2NvcmRpbmcge0Bjb2RlIG1jLmdldFByZWNpc2lvbigpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBkaXZpZGUoQmlnRGVjaW1hbCBkaXZpc29yLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICAvKiBDYWxjdWxhdGluZyBob3cgbWFueSB6ZXJvcyBtdXN0IGJlIGFwcGVuZCB0byAnZGl2aWRlbmQnCkBAIC0xNDU0LDE3ICsxNDYzLDE2IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMgdGhlIGludGVncmFsIHBhcnQgb2YKICAgICAgKiB7QGNvZGUgdGhpcyAvIGRpdmlzb3J9LiBUaGUgcXVvdGllbnQgaXMgcm91bmRlZCBkb3duIHRvd2FyZHMgemVybyB0byB0aGUKLSAgICAgKiBuZXh0IGludGVnZXIuIEZvciBleGFtcGxlLCAwLjUvMC4yID0gMi4KKyAgICAgKiBuZXh0IGludGVnZXIuIEZvciBleGFtcGxlLCB7QGNvZGUgMC41LzAuMiA9IDJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkaXZpc29yCiAgICAgICogICAgICAgICAgICB2YWx1ZSBieSB3aGljaCB7QGNvZGUgdGhpc30gaXMgZGl2aWRlZC4KLSAgICAgKiAKICAgICAgKiBAcmV0dXJuIGludGVncmFsIHBhcnQgb2Yge0Bjb2RlIHRoaXMgLyBkaXZpc29yfS4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZGl2aXNvciA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRpdmlzb3IgPT0gbnVsbH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZGl2aXNvciA9PSAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRpdmlzb3IgPT0gMH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKEJpZ0RlY2ltYWwgZGl2aXNvcikgewogICAgICAgICBCaWdJbnRlZ2VyIGludGVncmFsVmFsdWU7IC8vIHRoZSBpbnRlZ2VyIG9mIHJlc3VsdApAQCAtMTUyMSwyNCArMTUyOSwyMyBAQAogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHRoZSBpbnRlZ3JhbCBwYXJ0IG9mCiAgICAgICoge0Bjb2RlIHRoaXMgLyBkaXZpc29yfS4gVGhlIHF1b3RpZW50IGlzIHJvdW5kZWQgZG93biB0b3dhcmRzIHplcm8gdG8gdGhlCiAgICAgICogbmV4dCBpbnRlZ2VyLiBUaGUgcm91bmRpbmcgbW9kZSBwYXNzZWQgd2l0aCB0aGUgcGFyYW1ldGVyIHtAY29kZSBtY30gaXMKLSAgICAgKiBub3QgY29uc2lkZXJlZC4gQnV0IGlmIHRoZSBwcmVjaXNpb24gb2Yge0Bjb2RlIG1jfSA+IDAgYW5kIHRoZSBpbnRlZ3JhbAotICAgICAqIHBhcnQgcmVxdWlyZXMgbW9yZSBkaWdpdHMsIHRoZW4gYW4gQXJpdGhtZXRpY0V4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogbm90IGNvbnNpZGVyZWQuIEJ1dCBpZiB0aGUgcHJlY2lzaW9uIG9mIHtAY29kZSBtYyA+IDB9IGFuZCB0aGUgaW50ZWdyYWwKKyAgICAgKiBwYXJ0IHJlcXVpcmVzIG1vcmUgZGlnaXRzLCB0aGVuIGFuIHtAY29kZSBBcml0aG1ldGljRXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpdmlzb3IKICAgICAgKiAgICAgICAgICAgIHZhbHVlIGJ5IHdoaWNoIHtAY29kZSB0aGlzfSBpcyBkaXZpZGVkLgogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgbWF0aCBjb250ZXh0IHdoaWNoIGRldGVybWluZXMgdGhlIG1heGltYWwgcHJlY2lzaW9uIG9mIHRoZQogICAgICAqICAgICAgICAgICAgcmVzdWx0LgotICAgICAqIAogICAgICAqIEByZXR1cm4gaW50ZWdyYWwgcGFydCBvZiB7QGNvZGUgdGhpcyAvIGRpdmlzb3J9LgotICAgICAqIAogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwgb3IgbWMgPT0gbnVsbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfSBvciB7QGNvZGUgbWMgPT0gbnVsbH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZGl2aXNvciA9PSAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRpdmlzb3IgPT0gMH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbWMuZ2V0UHJlY2lzaW9uKCkgPiAwIGFuZCB0aGUgcmVzdWx0IHJlcXVpcmVzIG1vcmUgZGlnaXRzCi0gICAgICogICAgICAgICAgICAgdG8gYmUgcmVwcmVzZW50ZWQuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG1jLmdldFByZWNpc2lvbigpID4gMH0gYW5kIHRoZSByZXN1bHQgcmVxdWlyZXMgbW9yZQorICAgICAqICAgICAgICAgICAgIGRpZ2l0cyB0byBiZSByZXByZXNlbnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBkaXZpZGVUb0ludGVncmFsVmFsdWUoQmlnRGVjaW1hbCBkaXZpc29yLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICBpbnQgbWNQcmVjaXNpb24gPSBtYy5nZXRQcmVjaXNpb24oKTsKQEAgLTE1NTIsNyArMTU1OSw3IEBACiAgICAgICAgIGlmICgobWNQcmVjaXNpb24gPT0gMCkgfHwgKHRoaXMuaXNaZXJvKCkpIHx8IChkaXZpc29yLmlzWmVybygpKSkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKGRpdmlzb3IpOwogICAgICAgICB9Ci0gICAgICAgIC8vIExldCBiZTogdGhpcyA9IFt1MSxzMV0gYW5kIGRpdmlzb3IgPSBbdTIsczJdCisgICAgICAgIC8vIExldCBiZTogICB0aGlzID0gW3UxLHMxXSAgIGFuZCAgIGRpdmlzb3IgPSBbdTIsczJdCiAgICAgICAgIGlmIChxdW90UHJlY2lzaW9uIDw9IDApIHsKICAgICAgICAgICAgIHF1b3RBbmRSZW1bMF0gPSBCaWdJbnRlZ2VyLlpFUk87CiAgICAgICAgIH0gZWxzZSBpZiAoZGlmZlNjYWxlID09IDApIHsKQEAgLTE2MzMsMTkgKzE2NDAsMTggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzICUgZGl2aXNvcn0uCi0gICAgICogCi0gICAgICogVGhlIHJlbWFpbmRlciBpcyBkZWZpbmVkIGFzCi0gICAgICoge0Bjb2RlIHRoaXMgLSB0aGlzLmRpdmlkZVRvSW50ZWdyYWxWYWx1ZShkaXZpc29yKSAqIGRpdmlzb3J9LgorICAgICAqIDxwPgorICAgICAqIFRoZSByZW1haW5kZXIgaXMgZGVmaW5lZCBhcyB7QGNvZGUgdGhpcyAtCisgICAgICogdGhpcy5kaXZpZGVUb0ludGVncmFsVmFsdWUoZGl2aXNvcikgKiBkaXZpc29yfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGl2aXNvcgogICAgICAqICAgICAgICAgICAgdmFsdWUgYnkgd2hpY2gge0Bjb2RlIHRoaXN9IGlzIGRpdmlkZWQuCi0gICAgICogCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyAlIGRpdmlzb3J9LgotICAgICAqIAogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCByZW1haW5kZXIoQmlnRGVjaW1hbCBkaXZpc29yKSB7CiAgICAgICAgIHJldHVybiBkaXZpZGVBbmRSZW1haW5kZXIoZGl2aXNvcilbMV07CkBAIC0xNjUzLDI3ICsxNjU5LDI2IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSB3aG9zZSB2YWx1ZSBpcyB7QGNvZGUgdGhpcyAlIGRpdmlzb3J9LgotICAgICAqIAotICAgICAqIFRoZSByZW1haW5kZXIgaXMgZGVmaW5lZCBhcwotICAgICAqIHtAY29kZSB0aGlzIC0gdGhpcy5kaXZpZGVUb0ludGVncmFsVmFsdWUoZGl2aXNvcikgKiBkaXZpc29yfS4KLSAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVtYWluZGVyIGlzIGRlZmluZWQgYXMge0Bjb2RlIHRoaXMgLQorICAgICAqIHRoaXMuZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKGRpdmlzb3IpICogZGl2aXNvcn0uCisgICAgICogPHA+CiAgICAgICogVGhlIHNwZWNpZmllZCByb3VuZGluZyBtb2RlIHtAY29kZSBtY30gaXMgdXNlZCBmb3IgdGhlIGRpdmlzaW9uIG9ubHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpdmlzb3IKICAgICAgKiAgICAgICAgICAgIHZhbHVlIGJ5IHdoaWNoIHtAY29kZSB0aGlzfSBpcyBkaXZpZGVkLgogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIHRvIGJlIHVzZWQuCi0gICAgICogCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyAlIGRpdmlzb3J9LgotICAgICAqIAogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSAwfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBtYy5nZXRQcmVjaXNpb24oKSA+IDAgYW5kIHRoZSByZXN1bHQgb2YKLSAgICAgKiAgICAgICAgICAgICB7QGNvZGUgdGhpcy5kaXZpZGVUb0ludGVncmFsVmFsdWUoZGl2aXNvciwgbWMpfSByZXF1aXJlcyBtb3JlCi0gICAgICogICAgICAgICAgICAgZGlnaXRzIHRvIGJlIHJlcHJlc2VudGVkLgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBtYy5nZXRQcmVjaXNpb24oKSA+IDB9IGFuZCB0aGUgcmVzdWx0IG9mIHtAY29kZQorICAgICAqICAgICAgICAgICAgIHRoaXMuZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKGRpdmlzb3IsIG1jKX0gcmVxdWlyZXMgbW9yZSBkaWdpdHMKKyAgICAgKiAgICAgICAgICAgICB0byBiZSByZXByZXNlbnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCByZW1haW5kZXIoQmlnRGVjaW1hbCBkaXZpc29yLCBNYXRoQ29udGV4dCBtYykgewogICAgICAgICByZXR1cm4gZGl2aWRlQW5kUmVtYWluZGVyKGRpdmlzb3IsIG1jKVsxXTsKQEAgLTE2ODEsMjEgKzE2ODYsMjEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB7QGNvZGUgQmlnRGVjaW1hbH0gYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGludGVncmFsIHBhcnQgb2YKLSAgICAgKiB7QGNvZGUgdGhpcyAvIGRpdmlzb3J9IGF0IGluZGV4IDAgYW5kIHRoZSByZW1haW5kZXIKLSAgICAgKiB7QGNvZGUgdGhpcyAlIGRpdmlzb3J9IGF0IGluZGV4IDEuIFRoZSBxdW90aWVudCBpcyByb3VuZGVkIGRvd24gdG93YXJkcwotICAgICAqIHplcm8gdG8gdGhlIG5leHQgaW50ZWdlci4KKyAgICAgKiB7QGNvZGUgdGhpcyAvIGRpdmlzb3J9IGF0IGluZGV4IDAgYW5kIHRoZSByZW1haW5kZXIge0Bjb2RlIHRoaXMgJQorICAgICAqIGRpdmlzb3J9IGF0IGluZGV4IDEuIFRoZSBxdW90aWVudCBpcyByb3VuZGVkIGRvd24gdG93YXJkcyB6ZXJvIHRvIHRoZQorICAgICAqIG5leHQgaW50ZWdlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGl2aXNvcgogICAgICAqICAgICAgICAgICAgdmFsdWUgYnkgd2hpY2gge0Bjb2RlIHRoaXN9IGlzIGRpdmlkZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgW3RoaXMuZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKGRpdmlzb3IpLCB0aGlzLnJlbWFpbmRlcihkaXZpc29yKV19LgotICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIFt0aGlzLmRpdmlkZVRvSW50ZWdyYWxWYWx1ZShkaXZpc29yKSwKKyAgICAgKiAgICAgICAgIHRoaXMucmVtYWluZGVyKGRpdmlzb3IpXX0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IDB9LgogICAgICAqIEBzZWUgI2RpdmlkZVRvSW50ZWdyYWxWYWx1ZQogICAgICAqIEBzZWUgI3JlbWFpbmRlcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsW10gZGl2aWRlQW5kUmVtYWluZGVyKEJpZ0RlY2ltYWwgZGl2aXNvcikgewogICAgICAgICBCaWdEZWNpbWFsIHF1b3RBbmRSZW1bXSA9IG5ldyBCaWdEZWNpbWFsWzJdOwpAQCAtMTcwNywyNyArMTcxMiwyNiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHtAY29kZSBCaWdEZWNpbWFsfSBhcnJheSB3aGljaCBjb250YWlucyB0aGUgaW50ZWdyYWwgcGFydCBvZgotICAgICAqIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0gYXQgaW5kZXggMCBhbmQgdGhlIHJlbWFpbmRlcgotICAgICAqIHtAY29kZSB0aGlzICUgZGl2aXNvcn0gYXQgaW5kZXggMS4gVGhlIHF1b3RpZW50IGlzIHJvdW5kZWQgZG93biB0b3dhcmRzCi0gICAgICogemVybyB0byB0aGUgbmV4dCBpbnRlZ2VyLiBUaGUgcm91bmRpbmcgbW9kZSBwYXNzZWQgd2l0aCB0aGUgcGFyYW1ldGVyCi0gICAgICoge0Bjb2RlIG1jfSBpcyBub3QgY29uc2lkZXJlZC4gQnV0IGlmIHRoZSBwcmVjaXNpb24gb2Yge0Bjb2RlIG1jfSA+IDAgYW5kCi0gICAgICogdGhlIGludGVncmFsIHBhcnQgcmVxdWlyZXMgbW9yZSBkaWdpdHMsIHRoZW4gYW4gQXJpdGhtZXRpY0V4Y2VwdGlvbiBpcwotICAgICAqIHRocm93bi4KKyAgICAgKiB7QGNvZGUgdGhpcyAvIGRpdmlzb3J9IGF0IGluZGV4IDAgYW5kIHRoZSByZW1haW5kZXIge0Bjb2RlIHRoaXMgJQorICAgICAqIGRpdmlzb3J9IGF0IGluZGV4IDEuIFRoZSBxdW90aWVudCBpcyByb3VuZGVkIGRvd24gdG93YXJkcyB6ZXJvIHRvIHRoZQorICAgICAqIG5leHQgaW50ZWdlci4gVGhlIHJvdW5kaW5nIG1vZGUgcGFzc2VkIHdpdGggdGhlIHBhcmFtZXRlciB7QGNvZGUgbWN9IGlzCisgICAgICogbm90IGNvbnNpZGVyZWQuIEJ1dCBpZiB0aGUgcHJlY2lzaW9uIG9mIHtAY29kZSBtYyA+IDB9IGFuZCB0aGUgaW50ZWdyYWwKKyAgICAgKiBwYXJ0IHJlcXVpcmVzIG1vcmUgZGlnaXRzLCB0aGVuIGFuIHtAY29kZSBBcml0aG1ldGljRXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpdmlzb3IKICAgICAgKiAgICAgICAgICAgIHZhbHVlIGJ5IHdoaWNoIHtAY29kZSB0aGlzfSBpcyBkaXZpZGVkLgogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgbWF0aCBjb250ZXh0IHdoaWNoIGRldGVybWluZXMgdGhlIG1heGltYWwgcHJlY2lzaW9uIG9mIHRoZQogICAgICAqICAgICAgICAgICAgcmVzdWx0LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIFt0aGlzLmRpdmlkZVRvSW50ZWdyYWxWYWx1ZShkaXZpc29yKSwgdGhpcy5yZW1haW5kZXIoZGl2aXNvcildfS4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBbdGhpcy5kaXZpZGVUb0ludGVncmFsVmFsdWUoZGl2aXNvciksCisgICAgICogICAgICAgICB0aGlzLnJlbWFpbmRlcihkaXZpc29yKV19LgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSAwfS4KICAgICAgKiBAc2VlICNkaXZpZGVUb0ludGVncmFsVmFsdWUKICAgICAgKiBAc2VlICNyZW1haW5kZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbFtdIGRpdmlkZUFuZFJlbWFpbmRlcihCaWdEZWNpbWFsIGRpdmlzb3IsIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgcXVvdEFuZFJlbVtdID0gbmV3IEJpZ0RlY2ltYWxbMl07CkBAIC0xNzM5LDE2ICsxNzQzLDE5IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSB3aG9zZSB2YWx1ZSBpcyB7QGNvZGUgdGhpcyBeIG59LiBUaGUKLSAgICAgKiBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIG4gdGltZXMgdGhlIHNjYWxlcyBvZiB0aGlzLiB4LnBvdygwKSByZXR1cm5zIDEsCi0gICAgICogZXZlbiBpZiB4ID09IDAuCisgICAgICogc2NhbGUgb2YgdGhlIHJlc3VsdCBpcyB7QGNvZGUgbn0gdGltZXMgdGhlIHNjYWxlcyBvZiB7QGNvZGUgdGhpc30uCisgICAgICogPHA+CisgICAgICoge0Bjb2RlIHgucG93KDApfSByZXR1cm5zIHtAY29kZSAxfSwgZXZlbiBpZiB7QGNvZGUgeCA9PSAwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBOb3RlOiBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIEFOU0kgc3RhbmRhcmQKKyAgICAgKiBYMy4yNzQtMTk5NiBhbGdvcml0aG0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG4KICAgICAgKiAgICAgICAgICAgIGV4cG9uZW50IHRvIHdoaWNoIHtAY29kZSB0aGlzfSBpcyByYWlzZWQuCi0gICAgICogCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyBeIG59LgotICAgICAqIAogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG4gPCAwIG9yIG4gPiA5OTk5OTk5OTkKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbiA8IDB9IG9yIHtAY29kZSBuID4gOTk5OTk5OTk5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBwb3coaW50IG4pIHsKICAgICAgICAgaWYgKG4gPT0gMCkgewpAQCAtMTc2NywxOCArMTc3NCwxOSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXMgXiBufS4gVGhlCi0gICAgICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBwYXNzZWQgY29udGV4dCB7QGNvZGUgbWN9LiBUT0RPIGFkZAotICAgICAqIGFsZ29yaXRobSBkZXNjcmlwdGlvbgorICAgICAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgcGFzc2VkIGNvbnRleHQge0Bjb2RlIG1jfS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBOb3RlOiBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIEFOU0kgc3RhbmRhcmQKKyAgICAgKiBYMy4yNzQtMTk5NiBhbGdvcml0aG0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG4KICAgICAgKiAgICAgICAgICAgIGV4cG9uZW50IHRvIHdoaWNoIHtAY29kZSB0aGlzfSBpcyByYWlzZWQuCiAgICAgICogQHBhcmFtIG1jCiAgICAgICogICAgICAgICAgICByb3VuZGluZyBtb2RlIGFuZCBwcmVjaXNpb24gZm9yIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24uCi0gICAgICogCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyBeIG59LgotICAgICAqIAogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG4gPCAwIG9yIG4gPiA5OTk5OTk5OTkKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbiA8IDB9IG9yIHtAY29kZSBuID4gOTk5OTk5OTk5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBwb3coaW50IG4sIE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIC8vIFRoZSBBTlNJIHN0YW5kYXJkIFgzLjI3NC0xOTk2IGFsZ29yaXRobQpAQCAtMTgyNyw2ICsxODM1LDcgQEAKICAgICAgKiB7QGNvZGUgdGhpc30uIFRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIHRoZSBzY2FsZSBvZiB0aGlzLgogICAgICAqIAogICAgICAqIEByZXR1cm4ge0Bjb2RlIGFicyh0aGlzKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBhYnMoKSB7CiAgICAgICAgIHJldHVybiAoKHNpZ251bSgpIDwgMCkgPyBuZWdhdGUoKSA6IHRoaXMpOwpAQCAtMTgzOSwxOCArMTg0OCwyMyBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgotICAgICAqIAogICAgICAqIEByZXR1cm4ge0Bjb2RlIGFicyh0aGlzKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBhYnMoTWF0aENvbnRleHQgbWMpIHsKLSAgICAgICAgcmV0dXJuIHJvdW5kKG1jKS5hYnMoKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIEJpZ0RlY2ltYWwgcmVzdWx0ID0gYWJzKCk7CisgICAgICAgIHJlc3VsdC5pbnBsYWNlUm91bmQobWMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMgdGhlIHtAY29kZSAtdGhpc30uIFRoZQogICAgICAqIHNjYWxlIG9mIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIHNjYWxlIG9mIHRoaXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgLXRoaXN9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIC10aGlzfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIG5lZ2F0ZSgpIHsKICAgICAgICAgaWYoYml0TGVuZ3RoIDwgNjMgfHwgKGJpdExlbmd0aCA9PSA2MyAmJiBzbWFsbFZhbHVlIT1Mb25nLk1JTl9WQUxVRSkpIHsKQEAgLTE4NjUsMzAgKzE4NzksMzYgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWMKICAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgYW5kIHByZWNpc2lvbiBmb3IgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSAtdGhpc30uCisgICAgICogQHJldHVybiB7QGNvZGUgLXRoaXN9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgbmVnYXRlKE1hdGhDb250ZXh0IG1jKSB7Ci0gICAgICAgIHJldHVybiByb3VuZChtYykubmVnYXRlKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBCaWdEZWNpbWFsIHJlc3VsdCA9IG5lZ2F0ZSgpOworICAgICAgICByZXN1bHQuaW5wbGFjZVJvdW5kKG1jKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSArdGhpc30uIFRoZSBzY2FsZQogICAgICAqIG9mIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIHNjYWxlIG9mIHRoaXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGlzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgcGx1cygpIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlICt0aGlzfS4gVGhlCi0gICAgICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBwYXNzZWQgY29udGV4dCB7QGNvZGUgbWN9LgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IHdob3NlIHZhbHVlIGlzIHtAY29kZSArdGhpc30uIFRoZSByZXN1bHQKKyAgICAgKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgcGFzc2VkIGNvbnRleHQge0Bjb2RlIG1jfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWMKICAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgYW5kIHByZWNpc2lvbiBmb3IgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoaXMuCisgICAgICogQHJldHVybiB7QGNvZGUgdGhpc30KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBwbHVzKE1hdGhDb250ZXh0IG1jKSB7CiAgICAgICAgIHJldHVybiByb3VuZChtYyk7CkBAIC0xODk3LDggKzE5MTcsMTAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gLTEgaWYge0Bjb2RlIHRoaXMgPCAwfSwgMCBpZiB7QGNvZGUgdGhpcyA9PSAwfSwgMSBpZgotICAgICAqICAgICAgICAge0Bjb2RlIHRoaXMgPiAwfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSAtMX0gaWYge0Bjb2RlIHRoaXMgPCAwfSwgCisgICAgICogICAgICAgICB7QGNvZGUgMH0gaWYge0Bjb2RlIHRoaXMgPT0gMH0sCisgICAgICogICAgICAgICB7QGNvZGUgMX0gaWYge0Bjb2RlIHRoaXMgPiAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHNpZ251bSgpIHsKICAgICAgICAgaWYoIGJpdExlbmd0aCA8IDY0KSB7CkBAIC0xOTE1LDEwICsxOTM3LDExIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc2NhbGUgb2YgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0uIFRoZSBzY2FsZSBpcyB0aGUgbnVtYmVyIG9mCiAgICAgICogZGlnaXRzIGJlaGluZCB0aGUgZGVjaW1hbCBwb2ludC4gVGhlIHZhbHVlIG9mIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9IGlzCi0gICAgICogdGhlIHVuc2lnbmVkVmFsdWUgKiAxMF57LXNjYWxlfS4gSWYgdGhlIHNjYWxlIGlzIG5lZ2F0aXZlLCB0aGVuIHRoaXMKKyAgICAgKiB0aGUgdW5zaWduZWRWYWx1ZSAqIDEwXigtc2NhbGUpLiBJZiB0aGUgc2NhbGUgaXMgbmVnYXRpdmUsIHRoZW4gdGhpcwogICAgICAqIHtAY29kZSBCaWdEZWNpbWFsfSByZXByZXNlbnRzIGEgYmlnIGludGVnZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc2NhbGUgb2YgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzY2FsZSgpIHsKICAgICAgICAgcmV0dXJuIHNjYWxlOwpAQCAtMTkyNywxMCArMTk1MCwxMSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHByZWNpc2lvbiBvZiB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfS4gVGhlIHByZWNpc2lvbiBpcyB0aGUKICAgICAgKiBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgdXNlZCB0byByZXByZXNlbnQgdGhpcyBkZWNpbWFsLiBJdCBpcyBlcXVpdmFsZW50Ci0gICAgICogdG8gdGhlIG51bWJlciBvZiBkaWdpdHMgb2YgdHVlIHVuc2NhbGVkIHZhbHVlLiBUaGUgcHJlY2lzaW9uIG9mIDAgaXMgMQotICAgICAqIChpbmRlcGVuZGVudCBvZiB0aGUgc2NhbGUpLgorICAgICAqIHRvIHRoZSBudW1iZXIgb2YgZGlnaXRzIG9mIHRoZSB1bnNjYWxlZCB2YWx1ZS4gVGhlIHByZWNpc2lvbiBvZiB7QGNvZGUgMH0KKyAgICAgKiBpcyB7QGNvZGUgMX0gKGluZGVwZW5kZW50IG9mIHRoZSBzY2FsZSkuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcHJlY2lzaW9uIG9mIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcHJlY2lzaW9uKCkgewogICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgcHJlY2lzaW9uIGFscmVhZHkgd2FzIGNhbGN1bGF0ZWQKQEAgLTE5NjQsMTAgKzE5ODgsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHVuc2NhbGVkIHZhbHVlIChtYW50aXNzYSkgb2YgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UKLSAgICAgKiBhcyBhIHtAY29kZSBCaWdJbnRlZ2VyfS4gVGhlIHVuc2NhbGVkIHZhbHVlIGNhbiBiZSBjb21wdXRlZCBhcyB0aGlzICoKLSAgICAgKiAxMF57c2NhbGV9LgorICAgICAqIGFzIGEge0Bjb2RlIEJpZ0ludGVnZXJ9LiBUaGUgdW5zY2FsZWQgdmFsdWUgY2FuIGJlIGNvbXB1dGVkIGFzIHtAY29kZQorICAgICAqIHRoaXN9IDEwXihzY2FsZSkuCiAgICAgICogCiAgICAgICogQHJldHVybiB1bnNjYWxlZCB2YWx1ZSAodGhpcyAqIDEwXihzY2FsZSkpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHVuc2NhbGVkVmFsdWUoKSB7CiAgICAgICAgIHJldHVybiBnZXRVbnNjYWxlZFZhbHVlKCk7CkBAIC0xOTc2LDIxICsyMDAxLDIxIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXN9LCByb3VuZGVkCiAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwYXNzZWQgY29udGV4dCB7QGNvZGUgbWN9LgotICAgICAqIAotICAgICAqIElmIG1jLnByZWNpc2lvbiA9IDAsIHRoZW4gbm8gcm91bmRpbmcuCi0gICAgICogCi0gICAgICogSWYgbWMucHJlY2lzaW9uID4gMCBhbmQgbWMucm91bmRpbmdNb2RlID09IFVOTkVDRVNTQVJZLCB0aGVuIGFuCi0gICAgICogQXJpdGhtZXRpY0V4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHJlc3VsdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseQotICAgICAqIHdpdGhpbiB0aGUgZ2l2ZW4gcHJlY2lzaW9uLgorICAgICAqIDxwPgorICAgICAqIElmIHtAY29kZSBtYy5wcmVjaXNpb24gPSAwfSwgdGhlbiBubyByb3VuZGluZyBpcyBwZXJmb3JtZWQuCisgICAgICogPHA+CisgICAgICogSWYge0Bjb2RlIG1jLnByZWNpc2lvbiA+IDB9IGFuZCB7QGNvZGUgbWMucm91bmRpbmdNb2RlID09IFVOTkVDRVNTQVJZfSwKKyAgICAgKiB0aGVuIGFuIHtAY29kZSBBcml0aG1ldGljRXhjZXB0aW9ufSBpcyB0aHJvd24gaWYgdGhlIHJlc3VsdCBjYW5ub3QgYmUKKyAgICAgKiByZXByZXNlbnRlZCBleGFjdGx5IHdpdGhpbiB0aGUgZ2l2ZW4gcHJlY2lzaW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYwogICAgICAqICAgICAgICAgICAgcm91bmRpbmcgbW9kZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgcGFzc2VkIGNvbnRleHQuCi0gICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdGhpc30gcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIHBhc3NlZCBjb250ZXh0LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG1jLnByZWNpc2lvbiA+IDAgYW5kIG1jLnJvdW5kaW5nTW9kZSA9PSBVTk5FQ0VTU0FSWSBhbmQKLSAgICAgKiAgICAgICAgICAgICB0aGlzIGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoaW4gdGhlIGdpdmVuIHByZWNpc2lvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbWMucHJlY2lzaW9uID4gMH0gYW5kIHtAY29kZSBtYy5yb3VuZGluZ01vZGUgPT0KKyAgICAgKiAgICAgICAgICAgICBVTk5FQ0VTU0FSWX0gYW5kIHRoaXMgY2Fubm90IGJlIHJlcHJlc2VudGVkIHdpdGhpbiB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgICBwcmVjaXNpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgcm91bmQoTWF0aENvbnRleHQgbWMpIHsKICAgICAgICAgQmlnRGVjaW1hbCB0aGlzQkQgPSBuZXcgQmlnRGVjaW1hbChnZXRVbnNjYWxlZFZhbHVlKCksIHNjYWxlKTsKQEAgLTIwMDEsMTAgKzIwMjYsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBzY2FsZS4KLSAgICAgKiAKLSAgICAgKiBJZiBuZXcgbmV3IHNjYWxlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb2xkIHNjYWxlLCB0aGVuIGFkZGl0aW9uYWwgemVyb3MgYXJlCisgICAgICogPHA+CisgICAgICogSWYgdGhlIG5ldyBzY2FsZSBpcyBncmVhdGVyIHRoYW4gdGhlIG9sZCBzY2FsZSwgdGhlbiBhZGRpdGlvbmFsIHplcm9zIGFyZQogICAgICAqIGFkZGVkIHRvIHRoZSB1bnNjYWxlZCB2YWx1ZS4gSW4gdGhpcyBjYXNlIG5vIHJvdW5kaW5nIGlzIG5lY2Vzc2FyeS4KLSAgICAgKiAKKyAgICAgKiA8cD4KICAgICAgKiBJZiB0aGUgbmV3IHNjYWxlIGlzIHNtYWxsZXIgdGhhbiB0aGUgb2xkIHNjYWxlLCB0aGVuIHRyYWlsaW5nIGRpZ2l0cyBhcmUKICAgICAgKiByZW1vdmVkLiBJZiB0aGVzZSB0cmFpbGluZyBkaWdpdHMgYXJlIG5vdCB6ZXJvLCB0aGVuIHRoZSByZW1haW5pbmcKICAgICAgKiB1bnNjYWxlZCB2YWx1ZSBoYXMgdG8gYmUgcm91bmRlZC4gRm9yIHRoaXMgcm91bmRpbmcgb3BlcmF0aW9uIHRoZQpAQCAtMjAxNCwxNCArMjAzOSwxMyBAQAogICAgICAqICAgICAgICAgICAgc2NhbGUgb2YgdGhlIHJlc3VsdCByZXR1cm5lZC4KICAgICAgKiBAcGFyYW0gcm91bmRpbmdNb2RlCiAgICAgICogICAgICAgICAgICByb3VuZGluZyBtb2RlIHRvIGJlIHVzZWQgdG8gcm91bmQgdGhlIHJlc3VsdC4KLSAgICAgKiAKICAgICAgKiBAcmV0dXJuIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgc2NhbGUuCi0gICAgICogCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nTW9kZSA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZSA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiByb3VuZGluZ01vZGUgPT0gUk9VTkRfVU5ORUNFU1NBUlkgYW5kIHJvdW5kaW5nIGlzCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZSA9PSBST1VORF9VTk5FQ0VTU0FSWX0gYW5kIHJvdW5kaW5nIGlzCiAgICAgICogICAgICAgICAgICAgbmVjZXNzYXJ5IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgc2V0U2NhbGUoaW50IG5ld1NjYWxlLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKSB7CiAgICAgICAgIGlmIChyb3VuZGluZ01vZGUgPT0gbnVsbCkgewpAQCAtMjA1MCwxMCArMjA3NCwxMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHNjYWxlLgotICAgICAqIAotICAgICAqIElmIG5ldyBuZXcgc2NhbGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBvbGQgc2NhbGUsIHRoZW4gYWRkaXRpb25hbCB6ZXJvcyBhcmUKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgbmV3IHNjYWxlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb2xkIHNjYWxlLCB0aGVuIGFkZGl0aW9uYWwgemVyb3MgYXJlCiAgICAgICogYWRkZWQgdG8gdGhlIHVuc2NhbGVkIHZhbHVlLiBJbiB0aGlzIGNhc2Ugbm8gcm91bmRpbmcgaXMgbmVjZXNzYXJ5LgotICAgICAqIAorICAgICAqIDxwPgogICAgICAqIElmIHRoZSBuZXcgc2NhbGUgaXMgc21hbGxlciB0aGFuIHRoZSBvbGQgc2NhbGUsIHRoZW4gdHJhaWxpbmcgZGlnaXRzIGFyZQogICAgICAqIHJlbW92ZWQuIElmIHRoZXNlIHRyYWlsaW5nIGRpZ2l0cyBhcmUgbm90IHplcm8sIHRoZW4gdGhlIHJlbWFpbmluZwogICAgICAqIHVuc2NhbGVkIHZhbHVlIGhhcyB0byBiZSByb3VuZGVkLiBGb3IgdGhpcyByb3VuZGluZyBvcGVyYXRpb24gdGhlCkBAIC0yMDYzLDE0ICsyMDg3LDEzIEBACiAgICAgICogICAgICAgICAgICBzY2FsZSBvZiB0aGUgcmVzdWx0IHJldHVybmVkLgogICAgICAqIEBwYXJhbSByb3VuZGluZ01vZGUKICAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgdG8gYmUgdXNlZCB0byByb3VuZCB0aGUgcmVzdWx0LgotICAgICAqIAogICAgICAqIEByZXR1cm4gYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBzY2FsZS4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nTW9kZSBpcyBub3QgYSB2YWxpZCByb3VuZGluZyBtb2RlCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZX0gaXMgbm90IGEgdmFsaWQgcm91bmRpbmcgbW9kZS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiByb3VuZGluZ01vZGUgPT0gUk9VTkRfVU5ORUNFU1NBUlkgYW5kIHJvdW5kaW5nIGlzCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJvdW5kaW5nTW9kZSA9PSBST1VORF9VTk5FQ0VTU0FSWX0gYW5kIHJvdW5kaW5nIGlzCiAgICAgICogICAgICAgICAgICAgbmVjZXNzYXJ5IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgc2V0U2NhbGUoaW50IG5ld1NjYWxlLCBpbnQgcm91bmRpbmdNb2RlKSB7CiAgICAgICAgIHJldHVybiBzZXRTY2FsZShuZXdTY2FsZSwgUm91bmRpbmdNb2RlLnZhbHVlT2Yocm91bmRpbmdNb2RlKSk7CkBAIC0yMDc4LDIxICsyMTAxLDIwIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgc2NhbGUuIElmCi0gICAgICogbmV3IG5ldyBzY2FsZSBpcyBncmVhdGVyIHRoYW4gdGhlIG9sZCBzY2FsZSwgdGhlbiBhZGRpdGlvbmFsIHplcm9zIGFyZQorICAgICAqIHRoZSBuZXcgc2NhbGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBvbGQgc2NhbGUsIHRoZW4gYWRkaXRpb25hbCB6ZXJvcyBhcmUKICAgICAgKiBhZGRlZCB0byB0aGUgdW5zY2FsZWQgdmFsdWUuIElmIHRoZSBuZXcgc2NhbGUgaXMgc21hbGxlciB0aGFuIHRoZSBvbGQKICAgICAgKiBzY2FsZSwgdGhlbiB0cmFpbGluZyB6ZXJvcyBhcmUgcmVtb3ZlZC4gSWYgdGhlIHRyYWlsaW5nIGRpZ2l0cyBhcmUgbm90CiAgICAgICogemVyb3MgdGhlbiBhbiBBcml0aG1ldGljRXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiAKLSAgICAgKiBJZiBubyBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gaG9sZHM6Ci0gICAgICogeC5zZXRTY2FsZShzKS5jb21wYXJlVG8oeCkgPT0gMAorICAgICAqIDxwPgorICAgICAqIElmIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gdGhlIGZvbGxvd2luZyBlcXVhdGlvbiBob2xkczoge0Bjb2RlCisgICAgICogeC5zZXRTY2FsZShzKS5jb21wYXJlVG8oeCkgPT0gMH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld1NjYWxlCiAgICAgICogICAgICAgICAgICBzY2FsZSBvZiB0aGUgcmVzdWx0IHJldHVybmVkLgotICAgICAqIAogICAgICAqIEByZXR1cm4gYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBzY2FsZS4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiByb3VuZGluZyB3b3VsZCBiZSBuZWNlc3NhcnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgc2V0U2NhbGUoaW50IG5ld1NjYWxlKSB7CiAgICAgICAgIHJldHVybiBzZXRTY2FsZShuZXdTY2FsZSwgUm91bmRpbmdNb2RlLlVOTkVDRVNTQVJZKTsKQEAgLTIxMDAsMjMgKzIxMjIsMjMgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdoZXJlIHRoZSBkZWNpbWFsIHBvaW50IGhhcwotICAgICAqIGJlZW4gbW92ZWQge0Bjb2RlIG59IHBsYWNlcyB0byB0aGUgbGVmdC4gSWYgbiA8IDAgdGhlbiB0aGUgZGVjaW1hbCBwb2ludAotICAgICAqIGlzIG1vdmVkIC1uIHBsYWNlcyB0byB0aGUgcmlnaHQuCi0gICAgICogCisgICAgICogYmVlbiBtb3ZlZCB7QGNvZGUgbn0gcGxhY2VzIHRvIHRoZSBsZWZ0LiBJZiB7QGNvZGUgbiA8IDB9IHRoZW4gdGhlCisgICAgICogZGVjaW1hbCBwb2ludCBpcyBtb3ZlZCB7QGNvZGUgLW59IHBsYWNlcyB0byB0aGUgcmlnaHQuCisgICAgICogPHA+CiAgICAgICogVGhlIHJlc3VsdCBpcyBvYnRhaW5lZCBieSBjaGFuZ2luZyBpdHMgc2NhbGUuIElmIHRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0CiAgICAgICogYmVjb21lcyBuZWdhdGl2ZSwgdGhlbiBpdHMgcHJlY2lzaW9uIGlzIGluY3JlYXNlZCBzdWNoIHRoYXQgdGhlIHNjYWxlIGlzCiAgICAgICogemVyby4KLSAgICAgKiAKKyAgICAgKiA8cD4KICAgICAgKiBOb3RlLCB0aGF0IHtAY29kZSBtb3ZlUG9pbnRMZWZ0KDApfSByZXR1cm5zIGEgcmVzdWx0IHdoaWNoIGlzCi0gICAgICogbWF0aGVtYXRpY2FsbHkgZXF1aXZhbGVudCwgYnV0IHdoaWNoIGhhcyBzY2FsZSA+PSAwLgorICAgICAqIG1hdGhlbWF0aWNhbGx5IGVxdWl2YWxlbnQsIGJ1dCB3aGljaCBoYXMge0Bjb2RlIHNjYWxlID49IDB9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuCiAgICAgICogICAgICAgICAgICBudW1iZXIgb2YgcGxhY2VkIHRoZSBkZWNpbWFsIHBvaW50IGhhcyB0byBiZSBtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgKiAxMF57LW59LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9IDEwXih7QGNvZGUgLW59KS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBtb3ZlUG9pbnRMZWZ0KGludCBuKSB7Ci0gICAgICAgIHJldHVybiBtb3ZlUG9pbnQoc2NhbGUgKyAobG9uZykgbik7CisgICAgICAgIHJldHVybiBtb3ZlUG9pbnQoc2NhbGUgKyAobG9uZyluKTsKICAgICB9CiAKICAgICBwcml2YXRlIEJpZ0RlY2ltYWwgbW92ZVBvaW50KGxvbmcgbmV3U2NhbGUpIHsKQEAgLTIxNDIsMzcgKzIxNjQsMzcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIHdoZXJlIHRoZSBkZWNpbWFsIHBvaW50IGhhcwotICAgICAqIGJlZW4gbW92ZWQge0Bjb2RlIG59IHBsYWNlcyB0byB0aGUgcmlnaHQuIElmIG4gPCAwIHRoZW4gdGhlIGRlY2ltYWwgcG9pbnQKLSAgICAgKiBpcyBtb3ZlZCAtbiBwbGFjZXMgdG8gdGhlIGxlZnQuCi0gICAgICogCisgICAgICogYmVlbiBtb3ZlZCB7QGNvZGUgbn0gcGxhY2VzIHRvIHRoZSByaWdodC4gSWYge0Bjb2RlIG4gPCAwfSB0aGVuIHRoZQorICAgICAqIGRlY2ltYWwgcG9pbnQgaXMgbW92ZWQge0Bjb2RlIC1ufSBwbGFjZXMgdG8gdGhlIGxlZnQuCisgICAgICogPHA+CiAgICAgICogVGhlIHJlc3VsdCBpcyBvYnRhaW5lZCBieSBjaGFuZ2luZyBpdHMgc2NhbGUuIElmIHRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0CiAgICAgICogYmVjb21lcyBuZWdhdGl2ZSwgdGhlbiBpdHMgcHJlY2lzaW9uIGlzIGluY3JlYXNlZCBzdWNoIHRoYXQgdGhlIHNjYWxlIGlzCiAgICAgICogemVyby4KLSAgICAgKiAKKyAgICAgKiA8cD4KICAgICAgKiBOb3RlLCB0aGF0IHtAY29kZSBtb3ZlUG9pbnRSaWdodCgwKX0gcmV0dXJucyBhIHJlc3VsdCB3aGljaCBpcwogICAgICAqIG1hdGhlbWF0aWNhbGx5IGVxdWl2YWxlbnQsIGJ1dCB3aGljaCBoYXMgc2NhbGUgPj0gMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbgogICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIHBsYWNlZCB0aGUgZGVjaW1hbCBwb2ludCBoYXMgdG8gYmUgbW92ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzICogMTBee259LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9IDEwXntAY29kZSBufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBtb3ZlUG9pbnRSaWdodChpbnQgbikgewogICAgICAgICByZXR1cm4gbW92ZVBvaW50KHNjYWxlIC0gKGxvbmcpbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXN9ICogMTBee0Bjb2RlIG59LgotICAgICAqIFRoZSBzY2FsZSBvZiB0aGUgcmVzdWx0IGlzIHtAY29kZSB0aGlzLnNjYWxlKCl9IC0gbi4gVGhlIHByZWNpc2lvbiBvZiB0aGUKLSAgICAgKiByZXN1bHQgaXMgdGhlIHByZWNpc2lvbiBvZiB7QGNvZGUgdGhpc30uCi0gICAgICogCi0gICAgICogVGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBtb3ZlUG9pbnRMZWZ0LCBleGNlcHQgdGhhdCB0aGUKLSAgICAgKiBwcmVjaXNpb24gaXMgbm90IGNoYW5nZWQuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXN9IDEwXntAY29kZSBufS4KKyAgICAgKiBUaGUgc2NhbGUgb2YgdGhlIHJlc3VsdCBpcyB7QGNvZGUgdGhpcy5zY2FsZSgpfSAtIHtAY29kZSBufS4gCisgICAgICogVGhlIHByZWNpc2lvbiBvZiB0aGUgcmVzdWx0IGlzIHRoZSBwcmVjaXNpb24gb2Yge0Bjb2RlIHRoaXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMge0BsaW5rICNtb3ZlUG9pbnRSaWdodH0sIGV4Y2VwdCB0aGF0CisgICAgICogdGhlIHByZWNpc2lvbiBpcyBub3QgY2hhbmdlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbgotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIHBsYWNlZCB0aGUgZGVjaW1hbCBwb2ludCBoYXMgdG8gYmUgbW92ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzICogMTBeey1ufS4KKyAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBwbGFjZXMgdGhlIGRlY2ltYWwgcG9pbnQgaGFzIHRvIGJlIG1vdmVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9IDEwXntAY29kZSBufQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIHNjYWxlQnlQb3dlck9mVGVuKGludCBuKSB7CiAgICAgICAgIGxvbmcgbmV3U2NhbGUgPSBzY2FsZSAtIChsb25nKW47CkBAIC0yMTg3LDEzICsyMjA5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGlzIGJ1dAotICAgICAqIHdpdGggYSB1bnNjYWxlZCB2YWx1ZSB3aGVyZSB0aGUgdHJhaWxpbmcgemVyb3MgaGF2ZSBiZWVuIHJlbW92ZWQuIElmIHRoZQotICAgICAqIHVuc2NhbGVkIHZhbHVlIG9mIHtAY29kZSB0aGlzfSBoYXMgbiB0cmFpbGluZyB6ZXJvcywgdGhlbiB0aGUgc2NhbGUgYW5kCi0gICAgICogdGhlIHByZWNpc2lvbiBvZiB0aGUgcmVzdWx0IGhhcyBiZWVuIHJlZHVjZWQgYnkgbi4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdEZWNpbWFsfSBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHtAY29kZQorICAgICAqIHRoaXN9IGJ1dCB3aXRoIGEgdW5zY2FsZWQgdmFsdWUgd2hlcmUgdGhlIHRyYWlsaW5nIHplcm9zIGhhdmUgYmVlbgorICAgICAqIHJlbW92ZWQuIElmIHRoZSB1bnNjYWxlZCB2YWx1ZSBvZiB7QGNvZGUgdGhpc30gaGFzIG4gdHJhaWxpbmcgemVyb3MsIHRoZW4KKyAgICAgKiB0aGUgc2NhbGUgYW5kIHRoZSBwcmVjaXNpb24gb2YgdGhlIHJlc3VsdCBoYXMgYmVlbiByZWR1Y2VkIGJ5IG4uCiAgICAgICogCiAgICAgICogQHJldHVybiBhIG5ldyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UgZXF1aXZhbGVudCB0byB0aGlzIHdoZXJlIHRoZQogICAgICAqICAgICAgICAgdHJhaWxpbmcgemVyb3Mgb2YgdGhlIHVuc2NhbGVkIHZhbHVlIGhhdmUgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIHN0cmlwVHJhaWxpbmdaZXJvcygpIHsKICAgICAgICAgaW50IGkgPSAxOyAvLyAxIDw9IGkgPD0gMTgKQEAgLTIyMDEsNyArMjIyNCw5IEBACiAgICAgICAgIGxvbmcgbmV3U2NhbGUgPSBzY2FsZTsKIAogICAgICAgICBpZiAoaXNaZXJvKCkpIHsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKCIwIik7CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KICAgICAgICAgQmlnSW50ZWdlciBzdHJpcHBlZEJJID0gZ2V0VW5zY2FsZWRWYWx1ZSgpOwogICAgICAgICBCaWdJbnRlZ2VyW10gcXVvdEFuZFJlbTsKQEAgLTIyMzMsMjAgKzIyNTgsMjAgQEAKIAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9IHdpdGgge0Bjb2RlIHZhbH0uIFJldHVybnMgb25lIG9mIHRoZQotICAgICAqIHRocmVlIHZhbHVlcyAxLCAwLCBvciAtMS4gVGhlIG1ldGhvZCBiZWhhdmVzIGFzIGlmIHRoaXMuc3VidHJhY3QodmFsKSBpcwotICAgICAqIGNvbXB1dGVkLiBJZiB0aGlzIGRpZmZlcmVuY2UgaXMgPiAwIHRoZW4gMSBpcyByZXR1cm5lZCwgaWYgdGhlIGRpZmZlcmVuY2UKLSAgICAgKiBpcyA8IDAgdGhlbiAtMSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBkaWZmZXJlbmNlIGlzIDAgdGhlbiAwIGlzCi0gICAgICogcmV0dXJuZWQuIFRoaXMgbWVhbnMsIHRoYXQgaWYgdHdvIGRlY2ltYWwgaW5zdGFuY2VzIGFyZSBjb21wYXJlZCB3aGljaAotICAgICAqIGFyZSBlcXVhbCBpbiB2YWx1ZSBidXQgZGlmZmVyIGluIHNjYWxlLCB0aGVuIHRoZXNlIHR3byBpbnN0YW5jZXMgYXJlCi0gICAgICogY29uc2lkZXJlZCBhcyBlcXVhbC4KKyAgICAgKiB0aHJlZSB2YWx1ZXMge0Bjb2RlIDF9LCB7QGNvZGUgMH0sIG9yIHtAY29kZSAtMX0uIFRoZSBtZXRob2QgYmVoYXZlcyBhcworICAgICAqIGlmIHtAY29kZSB0aGlzLnN1YnRyYWN0KHZhbCl9IGlzIGNvbXB1dGVkLiBJZiB0aGlzIGRpZmZlcmVuY2UgaXMgPiAwIHRoZW4KKyAgICAgKiAxIGlzIHJldHVybmVkLCBpZiB0aGUgZGlmZmVyZW5jZSBpcyA8IDAgdGhlbiAtMSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZQorICAgICAqIGRpZmZlcmVuY2UgaXMgMCB0aGVuIDAgaXMgcmV0dXJuZWQuIFRoaXMgbWVhbnMsIHRoYXQgaWYgdHdvIGRlY2ltYWwKKyAgICAgKiBpbnN0YW5jZXMgYXJlIGNvbXBhcmVkIHdoaWNoIGFyZSBlcXVhbCBpbiB2YWx1ZSBidXQgZGlmZmVyIGluIHNjYWxlLCB0aGVuCisgICAgICogdGhlc2UgdHdvIGluc3RhbmNlcyBhcmUgY29uc2lkZXJlZCBhcyBlcXVhbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCiAgICAgICogICAgICAgICAgICB2YWx1ZSB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSB0aGlzfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDEgaWYgdGhpcyA+IHZhbCwgLTEgaWYgdGhpcyA8IHZhbCwgMCBpZiB0aGlzID09IHZhbC4KLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSAxfSBpZiB7QGNvZGUgdGhpcyA+IHZhbH0sIHtAY29kZSAtMX0gaWYge0Bjb2RlIHRoaXMgPCB2YWx9LAorICAgICAqICAgICAgICAge0Bjb2RlIDB9IGlmIHtAY29kZSB0aGlzID09IHZhbH0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbCA9PSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhCaWdEZWNpbWFsIHZhbCkgewogICAgICAgICBpbnQgdGhpc1NpZ24gPSBzaWdudW0oKTsKQEAgLTIyODEsMTYgKzIzMDYsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgeH0gaXMgYSBCaWdEZWNpbWFsIGluc3RhbmNlIGFuZCBpZiB0aGlzCi0gICAgICogaW5zdGFuY2UgaXMgZXF1YWwgdG8gdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0uIFR3byBiaWcgZGVjaW1hbHMgYXJlIGVxdWFsCi0gICAgICogaWYgdGhlaXIgdW5zY2FsZWQgdmFsdWUgYW5kIHRoZWlyIHNjYWxlIGlzIGVxdWFsLiBGb3IgZXhhbXBsZSwgMS4wCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIHh9IGlzIGEge0Bjb2RlIEJpZ0RlY2ltYWx9IGluc3RhbmNlIGFuZCBpZgorICAgICAqIHRoaXMgaW5zdGFuY2UgaXMgZXF1YWwgdG8gdGhpcyBiaWcgZGVjaW1hbC4gVHdvIGJpZyBkZWNpbWFscyBhcmUgZXF1YWwgaWYKKyAgICAgKiB0aGVpciB1bnNjYWxlZCB2YWx1ZSBhbmQgdGhlaXIgc2NhbGUgaXMgZXF1YWwuIEZvciBleGFtcGxlLCAxLjAKICAgICAgKiAoMTAqMTBeKC0xKSkgaXMgbm90IGVxdWFsIHRvIDEuMDAgKDEwMCoxMF4oLTIpKS4gU2ltaWxhcmx5LCB6ZXJvCiAgICAgICogaW5zdGFuY2VzIGFyZSBub3QgZXF1YWwgaWYgdGhlaXIgc2NhbGUgZGlmZmVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0geAogICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIHRoaXN9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB4IGlzIGEgQmlnRGVjaW1hbCBhbmQgdGhpcyA9PSB4LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB7QGNvZGUgeH0gaXMgYSB7QGNvZGUgQmlnRGVjaW1hbH0gYW5kIHtAY29kZSB0aGlzID09IHh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgeCkgeyAgICAgICAgCkBAIC0yMjk4LDE0ICsyMzIzLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgeDEgPSAoQmlnRGVjaW1hbCkgeDsKLSAgICAgICAgICAgIHJldHVybiB4MS5zY2FsZSA9PSBzY2FsZQotICAgICAgICAgICAgICAgICAgICAmJiAoYml0TGVuZ3RoIDwgNjQgPyAoeDEuc21hbGxWYWx1ZSA9PSBzbWFsbFZhbHVlKSA6IGludFZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoeDEuaW50VmFsKSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgICAgICAgICAgQmlnRGVjaW1hbCB4MSA9IChCaWdEZWNpbWFsKSB4OyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHgxLnNjYWxlID09IHNjYWxlICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICYmIChiaXRMZW5ndGggPCA2NCA/ICh4MS5zbWFsbFZhbHVlID09IHNtYWxsVmFsdWUpCisgICAgICAgICAgICAgICAgICAgIDogaW50VmFsLmVxdWFscyh4MS5pbnRWYWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICB9IAorICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgIAorICAgIH0gICAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0gYW5kIHtAY29kZSB2YWx9LgpAQCAtMjMxMyw5ICsyMzM5LDkgQEAKICAgICAgKiBAcGFyYW0gdmFsCiAgICAgICogICAgICAgICAgICB2YWx1ZSB0byBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIG1pbmltdW0gd2l0aCB0aGlzLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIG1pbih0aGlzLCB2YWx9LgotICAgICAqIAogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB2YWwgPT0gbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgbWluKEJpZ0RlY2ltYWwgdmFsKSB7CiAgICAgICAgIHJldHVybiAoKGNvbXBhcmVUbyh2YWwpIDw9IDApID8gdGhpcyA6IHZhbCk7CkBAIC0yMzI3LDkgKzIzNTMsOSBAQAogICAgICAqIEBwYXJhbSB2YWwKICAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSB3aXRoIHRoaXMuCiAgICAgICogQHJldHVybiB7QGNvZGUgbWF4KHRoaXMsIHZhbH0uCi0gICAgICogCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbCA9PSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBtYXgoQmlnRGVjaW1hbCB2YWwpIHsKICAgICAgICAgcmV0dXJuICgoY29tcGFyZVRvKHZhbCkgPj0gMCkgPyB0aGlzIDogdmFsKTsKQEAgLTIzMzgsMTAgKzIzNjQsMTEgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGhhc2ggY29kZSBmb3IgdGhpcy4KKyAgICAgKiBAcmV0dXJuIGhhc2ggY29kZSBmb3Ige0Bjb2RlIHRoaXN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsgICAgICAgIAogICAgICAgICBpZiAoaGFzaENvZGUgIT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGhhc2hDb2RlOwogICAgICAgICB9CkBAIC0yMzUxLDIwICsyMzc4LDIxIEBACiAgICAgICAgICAgICBoYXNoQ29kZSA9IDE3ICogaGFzaENvZGUgKyBzY2FsZTsgICAgICAgICAgIAogICAgICAgICAgICAgcmV0dXJuIGhhc2hDb2RlOwogICAgICAgICB9Ci0gICAgICAgIGhhc2hDb2RlID0gMTcgKiBpbnRWYWwuaGFzaENvZGUoKSArIHNjYWxlOwotICAgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgICAgIGhhc2hDb2RlID0gMTcgKiBpbnRWYWwuaGFzaENvZGUoKSArIHNjYWxlOyAgICAgICAgCisgICAgICAgIHJldHVybiBoYXNoQ29kZTsgICAgICAgIAogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9LiBJZgogICAgICAqIG5lY2Vzc2FyeSwgc2NpZW50aWZpYyBub3RhdGlvbiBpcyB1c2VkLiBUaGlzIHJlcHJlc2VudGF0aW9uIGFsd2F5cyBwcmludHMKICAgICAgKiBhbGwgc2lnbmlmaWNhbnQgZGlnaXRzIG9mIHRoaXMgdmFsdWUuCi0gICAgICogCi0gICAgICogSWYgdGhlIHNjYWxlIGlzIG5lZ2F0aXZlIG9yIGlmIHNjYWxlIC0gcHJlY2lzaW9uID49IDYgdGhlbiBzY2llbnRpZmljCi0gICAgICogbm90YXRpb24gaXMgdXNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc2NhbGUgaXMgbmVnYXRpdmUgb3IgaWYge0Bjb2RlIHNjYWxlIC0gcHJlY2lzaW9uID49IDZ9IHRoZW4KKyAgICAgKiBzY2llbnRpZmljIG5vdGF0aW9uIGlzIHVzZWQuCiAgICAgICogCiAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdGhpc30gaW4gc2NpZW50aWZpYyBub3RhdGlvbiBpZgogICAgICAqICAgICAgICAgbmVjZXNzYXJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0yNDEwLDE0ICsyNDM4LDE1IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfS4gVGhpcwogICAgICAqIHJlcHJlc2VudGF0aW9uIGFsd2F5cyBwcmludHMgYWxsIHNpZ25pZmljYW50IGRpZ2l0cyBvZiB0aGlzIHZhbHVlLgotICAgICAqIAotICAgICAqIElmIHRoZSBzY2FsZSBpcyBuZWdhdGl2ZSBvciBpZiBzY2FsZSAtIHByZWNpc2lvbiA+PSA2IHRoZW4gZW5naW5lZXJpbmcKLSAgICAgKiBub3RhdGlvbiBpcyB1c2VkLiBFbmdpbmVlcmluZyBub3RhdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBzY2llbnRpZmljCi0gICAgICogbm90YXRpb24gZXhjZXB0IHRoYXQgdGhlIGV4cG9uZW50IGlzIG1hZGUgdG8gYmUgYSBtdWx0aXBsZSBvZiAzIHN1Y2ggdGhhdAotICAgICAqIHRoZSBpbnRlZ2VyIHBhcnQgaXMgPj0gMSBhbmQgPCAxMDAwLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzY2FsZSBpcyBuZWdhdGl2ZSBvciBpZiB7QGNvZGUgc2NhbGUgLSBwcmVjaXNpb24gPj0gNn0gdGhlbgorICAgICAqIGVuZ2luZWVyaW5nIG5vdGF0aW9uIGlzIHVzZWQuIEVuZ2luZWVyaW5nIG5vdGF0aW9uIGlzIHNpbWlsYXIgdG8gdGhlCisgICAgICogc2NpZW50aWZpYyBub3RhdGlvbiBleGNlcHQgdGhhdCB0aGUgZXhwb25lbnQgaXMgbWFkZSB0byBiZSBhIG11bHRpcGxlIG9mCisgICAgICogMyBzdWNoIHRoYXQgdGhlIGludGVnZXIgcGFydCBpcyA+PSAxIGFuZCA8IDEwMDAuCiAgICAgICogCiAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdGhpc30gaW4gZW5naW5lZXJpbmcgbm90YXRpb24KICAgICAgKiAgICAgICAgIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvRW5naW5lZXJpbmdTdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZyBpbnRTdHJpbmcgPSBnZXRVbnNjYWxlZFZhbHVlKCkudG9TdHJpbmcoKTsKQEAgLTI0NzQsMTggKzI1MDMsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9LiBObwotICAgICAqIHNjaWVudGlmaWMgbm90YXRpb24gaXMgdXNlZC4gVGhpcyBtZXRob2RzIGFkZHMgemVyb3Mgd2hlcmUgbmVjZXNzYXJ5LgotICAgICAqIAorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0uIE5vIHNjaWVudGlmaWMKKyAgICAgKiBub3RhdGlvbiBpcyB1c2VkLiBUaGlzIG1ldGhvZHMgYWRkcyB6ZXJvcyB3aGVyZSBuZWNlc3NhcnkuCisgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UsIHRoaXMKICAgICAgKiBpbnN0YW5jZSBpcyBnZW5lcmFsbHkgbm90IGlkZW50aWNhbCB0byB7QGNvZGUgdGhpc30gYXMgdGhlIHByZWNpc2lvbgogICAgICAqIGNoYW5nZXMuCi0gICAgICogCi0gICAgICogeC5lcXVhbHMobmV3IEJpZ0RlY2ltYWwoeC50b1BsYWluU3RyaW5nKCkpIHVzdWFsbHkgcmV0dXJucyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiB4LmNvbXBhcmVUbyhuZXcgQmlnRGVjaW1hbCh4LnRvUGxhaW5TdHJpbmcoKSkgcmV0dXJucyAwLgorICAgICAqIDxwPgorICAgICAqIHtAY29kZSB4LmVxdWFscyhuZXcgQmlnRGVjaW1hbCh4LnRvUGxhaW5TdHJpbmcoKSl9IHVzdWFsbHkgcmV0dXJucworICAgICAqIHtAY29kZSBmYWxzZX0uCisgICAgICogPHA+CisgICAgICoge0Bjb2RlIHguY29tcGFyZVRvKG5ldyBCaWdEZWNpbWFsKHgudG9QbGFpblN0cmluZygpKX0gcmV0dXJucyB7QGNvZGUgMH0uCiAgICAgICogCiAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdGhpc30gd2l0aG91dCBleHBvbmVudCBwYXJ0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9QbGFpblN0cmluZygpIHsKICAgICAgICAgU3RyaW5nIGludFN0ciA9IGdldFVuc2NhbGVkVmFsdWUoKS50b1N0cmluZygpOwpAQCAtMjQ5OCw3ICsyNTI5LDcgQEAKICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoaW50U3RyLmxlbmd0aCgpICsgMSArIE1hdGguYWJzKHNjYWxlKSk7CiAKICAgICAgICAgaWYgKGJlZ2luID09IDEpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUsIHdlIGluc2VydCBhICctJyBjaGFyYWN0ZXIgYXQgZnJvbnQKKyAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUsIHdlIGluc2VydCBhICctJyBjaGFyYWN0ZXIgYXQgZnJvbnQgCiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCctJyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNjYWxlID4gMCkgewpAQCAtMjUzMyw2ICsyNTY0LDcgQEAKICAgICAgKiBwYXJ0IGlzIGRpc2NhcmRlZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9IGFzIGEgYmlnIGludGVnZXIgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgdG9CaWdJbnRlZ2VyKCkgewogICAgICAgICBpZiAoKHNjYWxlID09IDApIHx8IChpc1plcm8oKSkpIHsKQEAgLTI1NTIsNiArMjU4NCw3IEBACiAgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfSBhcyBhIGJpZyBpbnRlZ2VyIHZhbHVlLgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nIGlzIG5lY2Vzc2FyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciB0b0JpZ0ludGVnZXJFeGFjdCgpIHsKICAgICAgICAgaWYgKChzY2FsZSA9PSAwKSB8fCAoaXNaZXJvKCkpKSB7CkBAIC0yNTgxLDYgKzI2MTQsNyBAQAogICAgICAqIHJlcHJlc2VudGVkIGFzIGFuIGxvbmcsIHRoZW4ge0Bjb2RlIHRoaXN9ICUgMl42NCBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9IGFzIGEgbG9uZyB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CkBAIC0yNjAxLDYgKzI2MzUsNyBAQAogICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0gYXMgYSBsb25nIHZhbHVlLgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nIGlzIG5lY2Vzc2FyeSBvciB0aGUgbnVtYmVyIGRvZXNuJ3QgZml0IGluIGEgbG9uZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWVFeGFjdCgpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlRXhhY3QoNjQpOwpAQCAtMjYxMiw2ICsyNjQ3LDcgQEAKICAgICAgKiByZXByZXNlbnRlZCBhcyBhbiBpbnQsIHRoZW4ge0Bjb2RlIHRoaXN9ICUgMl4zMiBpcyByZXR1cm5lZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9IGFzIGEgaW50IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CkBAIC0yNjIwLDcgKzI2NTYsOCBAQAogICAgICAgICAgKiAxMF4oLXNjYWxlKS4gSWYgdGhlIHNjYWxlIGlzIHBvc2l0aXZlIGFuZCB2ZXJ5IGxhcmdlIHRoZSBsb25nIHZhbHVlCiAgICAgICAgICAqIGNvdWxkIGJlIHplcm8uCiAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gKChzY2FsZSA8PSAtMzIpIHx8IChzY2FsZSA+IGFwcm94UHJlY2lzaW9uKCkpID8gMAorICAgICAgICByZXR1cm4gKChzY2FsZSA8PSAtMzIpIHx8IChzY2FsZSA+IGFwcm94UHJlY2lzaW9uKCkpCisgICAgICAgID8gMAogICAgICAgICAgICAgICAgIDogdG9CaWdJbnRlZ2VyKCkuaW50VmFsdWUoKSk7CiAgICAgfQogCkBAIC0yNjMwLDkgKzI2NjcsOSBAQAogICAgICAqIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIGFuIHtAY29kZSBBcml0aG1ldGljRXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfSBhcyBhIGludCB2YWx1ZS4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiByb3VuZGluZyBpcyBuZWNlc3Nhcnkgb3IgdGhlIG51bWJlciBkb2Vzbid0IGZpdCBpbiBhIGludC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGludFZhbHVlRXhhY3QoKSB7CiAgICAgICAgIHJldHVybiAoaW50KXZhbHVlRXhhY3QoMzIpOwpAQCAtMjY0NCwxMCArMjY4MSwxMCBAQAogICAgICAqIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIGFuIHtAY29kZSBBcml0aG1ldGljRXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfSBhcyBhIHNob3J0IHZhbHVlLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nIGlzIG5lY2Vzc2FyeSBvZiB0aGUgbnVtYmVyIGRvZXNuJ3QgZml0IGluIGEKICAgICAgKiAgICAgICAgICAgICBzaG9ydC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZUV4YWN0KCkgewogICAgICAgICByZXR1cm4gKHNob3J0KXZhbHVlRXhhY3QoMTYpOwpAQCAtMjY1OSw5ICsyNjk2LDkgQEAKICAgICAgKiBjb25kaXRpb25zIGFyZSBub3QgbWV0LCBhbiB7QGNvZGUgQXJpdGhtZXRpY0V4Y2VwdGlvbn0gaXMgdGhyb3duLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0gYXMgYSBieXRlIHZhbHVlLgotICAgICAqIAogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHJvdW5kaW5nIGlzIG5lY2Vzc2FyeSBvciB0aGUgbnVtYmVyIGRvZXNuJ3QgZml0IGluIGEgYnl0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWVFeGFjdCgpIHsKICAgICAgICAgcmV0dXJuIChieXRlKXZhbHVlRXhhY3QoOCk7CkBAIC0yNjcxLDE5ICsyNzA4LDIwIEBACiAgICAgICogUmV0dXJucyB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfSBhcyBhIGZsb2F0IHZhbHVlLiBJZiB7QGNvZGUgdGhpc30gaXMgdG9vCiAgICAgICogYmlnIHRvIGJlIHJlcHJlc2VudGVkIGFzIGFuIGZsb2F0LCB0aGVuIHtAY29kZSBGbG9hdC5QT1NJVElWRV9JTkZJTklUWX0KICAgICAgKiBvciB7QGNvZGUgRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFl9IGlzIHJldHVybmVkLgotICAgICAqIAorICAgICAqIDxwPgogICAgICAqIE5vdGUsIHRoYXQgaWYgdGhlIHVuc2NhbGVkIHZhbHVlIGhhcyBtb3JlIHRoYW4gMjQgc2lnbmlmaWNhbnQgZGlnaXRzLAogICAgICAqIHRoZW4gdGhpcyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIGEgZmxvYXQgdmFyaWFibGUuIEluCiAgICAgICogdGhpcyBjYXNlIHRoZSByZXN1bHQgaXMgcm91bmRlZC4KLSAgICAgKiAKKyAgICAgKiA8cD4KICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGluc3RhbmNlIHtAY29kZSB4MSA9IG5ldyBCaWdEZWNpbWFsKCIwLjEiKX0gY2Fubm90IGJlCi0gICAgICogcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGZsb2F0LCBhbmQgdGh1cyB4MS5lcXVhbHMobmV3Ci0gICAgICogQmlnRGVjaW1hbCh4MS5mb2xhdFZhbHVlKCkpIHJldHVybnMgZmFsc2UgZm9yIHRoaXMgY2FzZS4KLSAgICAgKiAKKyAgICAgKiByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZmxvYXQsIGFuZCB0aHVzIHtAY29kZSB4MS5lcXVhbHMobmV3CisgICAgICogQmlnRGVjaW1hbCh4MS5mb2xhdFZhbHVlKCkpfSByZXR1cm5zIHtAY29kZSBmYWxzZX0gZm9yIHRoaXMgY2FzZS4KKyAgICAgKiA8cD4KICAgICAgKiBTaW1pbGFybHksIGlmIHRoZSBpbnN0YW5jZSB7QGNvZGUgbmV3IEJpZ0RlY2ltYWwoMTY3NzcyMTcpfSBpcyBjb252ZXJ0ZWQKLSAgICAgKiB0byBhIGZsb2F0LCB0aGUgcmVzdWx0IGlzIDEuNjc3NzIxNkU3LgorICAgICAqIHRvIGEgZmxvYXQsIHRoZSByZXN1bHQgaXMge0Bjb2RlIDEuNjc3NzIxNkV9Ny4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9IGFzIGEgZmxvYXQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CkBAIC0yNzA3LDE5ICsyNzQ1LDIxIEBACiAgICAgICogUmV0dXJucyB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfSBhcyBhIGRvdWJsZSB2YWx1ZS4gSWYge0Bjb2RlIHRoaXN9IGlzIHRvbwogICAgICAqIGJpZyB0byBiZSByZXByZXNlbnRlZCBhcyBhbiBmbG9hdCwgdGhlbiB7QGNvZGUgRG91YmxlLlBPU0lUSVZFX0lORklOSVRZfQogICAgICAqIG9yIHtAY29kZSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFl9IGlzIHJldHVybmVkLgotICAgICAqIAorICAgICAqIDxwPgogICAgICAqIE5vdGUsIHRoYXQgaWYgdGhlIHVuc2NhbGVkIHZhbHVlIGhhcyBtb3JlIHRoYW4gNTMgc2lnbmlmaWNhbnQgZGlnaXRzLAogICAgICAqIHRoZW4gdGhpcyBkZWNpbWFsIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIGEgZG91YmxlIHZhcmlhYmxlLiBJbgogICAgICAqIHRoaXMgY2FzZSB0aGUgcmVzdWx0IGlzIHJvdW5kZWQuCi0gICAgICogCisgICAgICogPHA+CiAgICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnN0YW5jZSB7QGNvZGUgeDEgPSBuZXcgQmlnRGVjaW1hbCgiMC4xIil9IGNhbm5vdCBiZQotICAgICAqIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBkb3VibGUsIGFuZCB0aHVzIHgxLmVxdWFscyhuZXcKLSAgICAgKiBCaWdEZWNpbWFsKHgxLmRvdWJsZVZhbHVlKCkpIHJldHVybnMgZmFsc2UgZm9yIHRoaXMgY2FzZS4KLSAgICAgKiAKKyAgICAgKiByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZG91YmxlLCBhbmQgdGh1cyB7QGNvZGUgeDEuZXF1YWxzKG5ldworICAgICAqIEJpZ0RlY2ltYWwoeDEuZG91YmxlVmFsdWUoKSl9IHJldHVybnMge0Bjb2RlIGZhbHNlfSBmb3IgdGhpcyBjYXNlLgorICAgICAqIDxwPgogICAgICAqIFNpbWlsYXJseSwgaWYgdGhlIGluc3RhbmNlIHtAY29kZSBuZXcgQmlnRGVjaW1hbCg5MDA3MTk5MjU0NzQwOTkzTCl9IGlzCi0gICAgICogY29udmVydGVkIHRvIGEgZG91YmxlLCB0aGUgcmVzdWx0IGlzIDkuMDA3MTk5MjU0NzQwOTkyRTE1LgorICAgICAqIGNvbnZlcnRlZCB0byBhIGRvdWJsZSwgdGhlIHJlc3VsdCBpcyB7QGNvZGUgOS4wMDcxOTkyNTQ3NDA5OTJFMTV9LgorICAgICAqIDxwPgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0gYXMgYSBkb3VibGUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKQEAgLTI3NzEsMTMgKzI4MTEsMTMgQEAKICAgICAgICAgICAgIC8vIG1hbnRpc2EgPSAoYWJzKHUpICogMTBecykgPj4gKG4gLSA1NCkKICAgICAgICAgICAgIGJpdHMgPSBtYW50aXNhLnNoaWZ0UmlnaHQoZGlzY2FyZGVkU2l6ZSkubG9uZ1ZhbHVlKCk7CiAgICAgICAgICAgICB0ZW1wQml0cyA9IGJpdHM7Ci0gICAgICAgICAgICAvLyAjYml0cyA9IDU0LCB0byBjaGVjayBpZiB0aGUgZGlzY2FyZGVkIGZyYWN0aW9uIHByb2R1Y2VzIGEgY2FycnkKKyAgICAgICAgICAgIC8vICNiaXRzID0gNTQsIHRvIGNoZWNrIGlmIHRoZSBkaXNjYXJkZWQgZnJhY3Rpb24gcHJvZHVjZXMgYSBjYXJyeSAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmICgoKChiaXRzICYgMSkgPT0gMSkgJiYgKGxvd2VzdFNldEJpdCA8IGRpc2NhcmRlZFNpemUpKQogICAgICAgICAgICAgICAgICAgICB8fCAoKGJpdHMgJiAzKSA9PSAzKSkgewogICAgICAgICAgICAgICAgIGJpdHMgKz0gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsvLyAobiA8PSA1NCkKLSAgICAgICAgICAgIC8vIG1hbnRpc2EgPSAoYWJzKHUpICogMTBecykgPDwgKDU0IC0gbikKKyAgICAgICAgICAgIC8vIG1hbnRpc2EgPSAoYWJzKHUpICogMTBecykgPDwgKDU0IC0gbikgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBiaXRzID0gbWFudGlzYS5sb25nVmFsdWUoKSA8PCAtZGlzY2FyZGVkU2l6ZTsKICAgICAgICAgICAgIHRlbXBCaXRzID0gYml0czsKICAgICAgICAgICAgIC8vICNiaXRzID0gNTQsIHRvIGNoZWNrIGlmIHRoZSBkaXNjYXJkZWQgZnJhY3Rpb24gcHJvZHVjZXMgYSBjYXJyeToKQEAgLTI3OTUsNyArMjgzNSw3IEBACiAgICAgICAgICAgICBiaXRzID4+PSAyOwogICAgICAgICAgICAgZXhwb25lbnQgKz0gZGlzY2FyZGVkU2l6ZSArIDE7CiAgICAgICAgIH0KLSAgICAgICAgLy8gVG8gdGVzdCBpZiB0aGUgNTMtYml0cyBudW1iZXIgZml0cyBpbiAnZG91YmxlJworICAgICAgICAvLyBUbyB0ZXN0IGlmIHRoZSA1My1iaXRzIG51bWJlciBmaXRzIGluICdkb3VibGUnICAgICAgICAgICAgCiAgICAgICAgIGlmIChleHBvbmVudCA+IDIwNDYpIHsvLyAoZXhwb25lbnQgLSBiaWFzID4gMTAyMykKICAgICAgICAgICAgIHJldHVybiAoc2lnbiAqIERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPD0gMCkgey8vIChleHBvbmVudCAtIGJpYXMgPD0gLTEwMjMpCkBAIC0yODAzLDcgKzI4NDMsNyBAQAogICAgICAgICAgICAgaWYgKGV4cG9uZW50IDwgLTUzKSB7Ly8gZXhwb25lbnQgLSBiaWFzIDwgLTEwNzYKICAgICAgICAgICAgICAgICByZXR1cm4gKHNpZ24gKiAwLjBkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIC0xMDc2IDw9IGV4cG9uZW50IC0gYmlhcyA8PSAtMTAyMworICAgICAgICAgICAgLy8gLTEwNzYgPD0gZXhwb25lbnQgLSBiaWFzIDw9IC0xMDIzIAogICAgICAgICAgICAgLy8gVG8gZGlzY2FyZCAnLSBleHBvbmVudCArIDEnIGJpdHMKICAgICAgICAgICAgIGJpdHMgPSB0ZW1wQml0cyA+PiAxOwogICAgICAgICAgICAgdGVtcEJpdHMgPSBiaXRzICYgKC0xTCA+Pj4gKDYzICsgZXhwb25lbnQpKTsKQEAgLTI4MjYsMTYgKzI4NjYsMTcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSB1bml0IGluIHRoZSBsYXN0IHBsYWNlIChVTFApIG9mIHRoaXMge0Bjb2RlIEJpZ0RlY2ltYWx9CiAgICAgICogaW5zdGFuY2UuIEFuIFVMUCBpcyB0aGUgZGlzdGFuY2UgdG8gdGhlIG5lYXJlc3QgYmlnIGRlY2ltYWwgd2l0aCB0aGUgc2FtZQogICAgICAqIHByZWNpc2lvbi4KLSAgICAgKiAKKyAgICAgKiA8cD4KICAgICAgKiBUaGUgYW1vdW50IG9mIGEgcm91bmRpbmcgZXJyb3IgaW4gdGhlIGV2YWx1YXRpb24gb2YgYSBmbG9hdGluZy1wb2ludAogICAgICAqIG9wZXJhdGlvbiBpcyBvZnRlbiBleHByZXNzZWQgaW4gVUxQcy4gQW4gZXJyb3Igb2YgMSBVTFAgaXMgb2Z0ZW4gc2VlbiBhcwogICAgICAqIGEgdG9sZXJhYmxlIGVycm9yLgotICAgICAqIAotICAgICAqIEZvciBjbGFzcyBCaWdEZWNpbWFsLCB0aGUgVUxQIG9mIGEgbnVtYmVyIGlzIHNpbXBseSAxMF57LXNjYWxlfS4KLSAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgY2xhc3Mge0Bjb2RlIEJpZ0RlY2ltYWx9LCB0aGUgVUxQIG9mIGEgbnVtYmVyIGlzIHNpbXBseSAxMF4oLXNjYWxlKS4KKyAgICAgKiA8cD4KICAgICAgKiBGb3IgZXhhbXBsZSwge0Bjb2RlIG5ldyBCaWdEZWNpbWFsKDAuMSkudWxwKCl9IHJldHVybnMge0Bjb2RlIDFFLTU1fS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UgKFVMUCkgb2YgdGhpcyB7QGNvZGUgQmlnRGVjaW1hbH0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgdWxwKCkgewogICAgICAgICByZXR1cm4gdmFsdWVPZigxLCBzY2FsZSk7CkBAIC0yODQ1LDE4ICsyODg2LDIwIEBACiAKICAgICAvKioKICAgICAgKiBJdCBkb2VzIGFsbCByb3VuZGluZyB3b3JrIG9mIHRoZSBwdWJsaWMgbWV0aG9kCi0gICAgICogPGNvZGU+cm91bmQoTWF0aENvbnRleHQpPC9jb2RlPiwgcGVyZm9ybWluZyBhbiBpbnBsYWNlIHJvdW5kaW5nCisgICAgICoge0Bjb2RlIHJvdW5kKE1hdGhDb250ZXh0KX0sIHBlcmZvcm1pbmcgYW4gaW5wbGFjZSByb3VuZGluZwogICAgICAqIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYwotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPk1hdGhDb250ZXh0PC9jb2RlPiBmb3IgcGVyZm9ybSB0aGUgcm91bmRpbmcuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE1hdGhDb250ZXh0fSBmb3IgcGVyZm9ybSB0aGUgcm91bmRpbmcuCiAgICAgICogQHNlZSAjcm91bmQoTWF0aENvbnRleHQpCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGlucGxhY2VSb3VuZChNYXRoQ29udGV4dCBtYykgewogICAgICAgICBpbnQgbWNQcmVjaXNpb24gPSBtYy5nZXRQcmVjaXNpb24oKTsKLSAgICAgICAgaWYgKGFwcm94UHJlY2lzaW9uKCkgLSBtY1ByZWNpc2lvbiA8PSAwIHx8IG1jUHJlY2lzaW9uID09IDApIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIGlmIChhcHJveFByZWNpc2lvbigpIDwgbWNQcmVjaXNpb24gfHwgbWNQcmVjaXNpb24gPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaW50IGRpc2NhcmRlZFByZWNpc2lvbiA9IHByZWNpc2lvbigpIC0gbWNQcmVjaXNpb247CiAgICAgICAgIC8vIElmIG5vIHJvdW5kaW5nIGlzIG5lY2Vzc2FyeSBpdCByZXR1cm5zIGltbWVkaWF0ZWx5CiAgICAgICAgIGlmICgoZGlzY2FyZGVkUHJlY2lzaW9uIDw9IDApKSB7CkBAIC0yOTAwLDE1ICsyOTQzLDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGxvbmdDb21wYXJlVG8obG9uZyB2YWx1ZTEsIGxvbmcgdmFsdWUyKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTEgPiB2YWx1ZTIgPyAxIDogKHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMCk7CiAgICAgfQotCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyBhbiBlZmZpY2llbnQgcm91bmRpbmcgZm9yIG51bWJlcnMgd2hpY2ggdW5zY2FsZWQKLSAgICAgKiB2YWx1ZSBmaXRzIGluIHRoZSB0eXBlIDxjb2RlPmxvbmc8L2NvZGU+LgorICAgICAqIHZhbHVlIGZpdHMgaW4gdGhlIHR5cGUge0Bjb2RlIGxvbmd9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBtYwotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdG8gdXNlLgorICAgICAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdG8gdXNlCiAgICAgICogQHBhcmFtIGRpc2NhcmRlZFByZWNpc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyB0aGF0IGFyZSBkaXNjYXJkZWQuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIHRoYXQgYXJlIGRpc2NhcmRlZAogICAgICAqIEBzZWUgI3JvdW5kKE1hdGhDb250ZXh0KQogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzbWFsbFJvdW5kKE1hdGhDb250ZXh0IG1jLCBpbnQgZGlzY2FyZGVkUHJlY2lzaW9uKSB7CkBAIC0yOTQzLDE2ICsyOTg1LDE2IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYW4gaW5jcmVtZW50IHRoYXQgY2FuIGJlIC0xLDAgb3IgMSwgZGVwZW5kaW5nIG9mCi0gICAgICogPGNvZGU+cm91bmRpbmdNb2RlPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgcm91bmRpbmdNb2RlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyaXR5Qml0CiAgICAgICogICAgICAgICAgICBjYW4gYmUgMCBvciAxLCBpdCdzIG9ubHkgdXNlZCBpbiB0aGUgY2FzZQotICAgICAqICAgICAgICAgICAgPGNvZGU+SEFMRl9FVkVOPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBIQUxGX0VWRU59CiAgICAgICogQHBhcmFtIGZyYWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgbWFudGlzYSB0byBiZSBhbmFseXplZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtYW50aXNhIHRvIGJlIGFuYWx5emVkCiAgICAgICogQHBhcmFtIHJvdW5kaW5nTW9kZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2Ygcm91bmRpbmcuCi0gICAgICogQHJldHVybiB0aGUgY2FycnkgcHJvcGFnYXRlZCBhZnRlciByb3VuZGluZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHJvdW5kaW5nCisgICAgICogQHJldHVybiB0aGUgY2FycnkgcHJvcGFnYXRlZCBhZnRlciByb3VuZGluZwogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludCByb3VuZGluZ0JlaGF2aW9yKGludCBwYXJpdHlCaXQsIGludCBmcmFjdGlvbiwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkgewogICAgICAgICBpbnQgaW5jcmVtZW50ID0gMDsgLy8gdGhlIGNhcnJ5IGFmdGVyIHJvdW5kaW5nCkBAIC0yOTk1LDE5ICszMDM3LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgPGNvZGU+aW50VmFsPC9jb2RlPiBoYXMgYSBmcmFjdGlvbmFsIHBhcnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwKKyAgICAgKiBJZiB7QGNvZGUgaW50VmFsfSBoYXMgYSBmcmFjdGlvbmFsIHBhcnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwKICAgICAgKiBvdGhlcndpc2UgaXQgY291bnRzIHRoZSBudW1iZXIgb2YgYml0cyBvZiB2YWx1ZSBhbmQgY2hlY2tzIGlmIGl0J3Mgb3V0IG9mCiAgICAgICogdGhlIHJhbmdlIG9mIHRoZSBwcmltaXRpdmUgdHlwZS4gSWYgdGhlIG51bWJlciBmaXRzIGluIHRoZSBwcmltaXRpdmUgdHlwZQotICAgICAqIHJldHVybnMgdGhpcyBudW1iZXIgYXMgPGNvZGU+bG9uZzwvY29kZT4sIG90aGVyd2lzZSB0aHJvd3MgYW4KKyAgICAgKiByZXR1cm5zIHRoaXMgbnVtYmVyIGFzIHtAY29kZSBsb25nfSwgb3RoZXJ3aXNlIHRocm93cyBhbgogICAgICAqIGV4Y2VwdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYml0TGVuZ3RoT2ZUeXBlCiAgICAgICogICAgICAgICAgICBudW1iZXIgb2YgYml0cyBvZiB0aGUgdHlwZSB3aG9zZSB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQKLSAgICAgKiAgICAgICAgICAgIGV4YWN0bHkuCi0gICAgICogQHJldHVybiB0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIGludGVnZXIgcGFydCBvZiA8Y29kZT5CaWdEZWNpbWFsPC9jb2RlPgotICAgICAqICAgICAgICAgd2hlbiBpcyBwb3NzaWJsZS4KLSAgICAgKiBAdGhyb3dzIDxjb2RlPkFyaXRobWV0aWNFeGNlcHRpb248L2NvZGU+IHdoZW4gcm91bmRpbmcgaXMgbmVjZXNzYXJ5IG9yIHRoZQotICAgICAqICAgICAgICAgICAgIG51bWJlciBkb24ndCBmaXQgaW4gdGhlIHByaW1pdGl2ZSB0eXBlLgorICAgICAqICAgICAgICAgICAgZXhhY3RseQorICAgICAqIEByZXR1cm4gdGhlIGV4YWN0IHZhbHVlIG9mIHRoZSBpbnRlZ2VyIHBhcnQgb2Yge0Bjb2RlIEJpZ0RlY2ltYWx9CisgICAgICogICAgICAgICB3aGVuIGlzIHBvc3NpYmxlCisgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uIHdoZW4gcm91bmRpbmcgaXMgbmVjZXNzYXJ5IG9yIHRoZQorICAgICAqICAgICAgICAgICAgIG51bWJlciBkb24ndCBmaXQgaW4gdGhlIHByaW1pdGl2ZSB0eXBlCiAgICAgICovCiAgICAgcHJpdmF0ZSBsb25nIHZhbHVlRXhhY3QoaW50IGJpdExlbmd0aE9mVHlwZSkgewogICAgICAgICBCaWdJbnRlZ2VyIGJpZ0ludGVnZXIgPSB0b0JpZ0ludGVnZXJFeGFjdCgpOwpAQCAtMzAyMywzMCArMzA2NSwyOSBAQAogICAgIC8qKgogICAgICAqIElmIHRoZSBwcmVjaXNpb24gYWxyZWFkeSB3YXMgY2FsY3VsYXRlZCBpdCByZXR1cm5zIHRoYXQgdmFsdWUsIG90aGVyd2lzZQogICAgICAqIGl0IGNhbGN1bGF0ZXMgYSB2ZXJ5IGdvb2QgYXBwcm94aW1hdGlvbiBlZmZpY2llbnRseSAuIE5vdGUgdGhhdCB0aGlzCi0gICAgICogdmFsdWUgd2lsbCBiZSA8Y29kZT5wcmVjaXNpb24oKTwvY29kZT4gb3IgPGNvZGU+cHJlY2lzaW9uKCktMTwvY29kZT4KKyAgICAgKiB2YWx1ZSB3aWxsIGJlIHtAY29kZSBwcmVjaXNpb24oKX0gb3Ige0Bjb2RlIHByZWNpc2lvbigpLTF9CiAgICAgICogaW4gdGhlIHdvcnN0IGNhc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcHByb3hpbWF0aW9uIG9mIDxjb2RlPnByZWNpc2lvbigpPC9jb2RlPiB2YWx1ZQorICAgICAqIEByZXR1cm4gYW4gYXBwcm94aW1hdGlvbiBvZiB7QGNvZGUgcHJlY2lzaW9uKCl9IHZhbHVlCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgYXByb3hQcmVjaXNpb24oKSB7Ci0gICAgICAgIC8vIHJldHVybiAoKHByZWNpc2lvbiA+IDApCi0gICAgICAgIC8vID8gcHJlY2lzaW9uCi0gICAgICAgIC8vIDogKGludCkoKHRoaXMuYml0TGVuZ3RoIC0gMSkgKiBMT0cxMF8yKSkgKyAxOwotICAgICAgICByZXR1cm4gcHJlY2lzaW9uID4gMCAKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHJldHVybiBwcmVjaXNpb24gPiAwCiAgICAgICAgICAgICAgICAgPyBwcmVjaXNpb24KICAgICAgICAgICAgICAgICA6IChpbnQpICgodGhpcy5iaXRMZW5ndGggLSAxKSAqIExPRzEwXzIpICsgMTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEl0IHRlc3RzIGlmIGEgc2NhbGUgb2YgdHlwZSA8Y29kZT5sb25nPC9jb2RlPiBmaXRzIGluIDMyIGJpdHMuIEl0Ci0gICAgICogcmV0dXJucyB0aGUgc2FtZSBzY2FsZSBiZWluZyBjYXN0ZWQgdG8gPGNvZGU+aW50PC9jb2RlPiB0eXBlIHdoZW4gaXMKKyAgICAgKiBJdCB0ZXN0cyBpZiBhIHNjYWxlIG9mIHR5cGUge0Bjb2RlIGxvbmd9IGZpdHMgaW4gMzIgYml0cy4gSXQKKyAgICAgKiByZXR1cm5zIHRoZSBzYW1lIHNjYWxlIGJlaW5nIGNhc3RlZCB0byB7QGNvZGUgaW50fSB0eXBlIHdoZW4gaXMKICAgICAgKiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRocm93cyBhbiBleGNlcHRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvbmdTY2FsZQotICAgICAqICAgICAgICAgICAgYSA2NCBiaXQgc2NhbGUuCi0gICAgICogQHJldHVybiBhIDMyIGJpdCBzY2FsZSB3aGVuIGlzIHBvc3NpYmxlLgotICAgICAqIEB0aHJvd3MgPGNvZGU+QXJpdGhtZXRpY0V4Y2VwdGlvbjwvY29kZT4gd2hlbiA8Y29kZT5zY2FsZTwvY29kZT4gZG9lc24ndAotICAgICAqICAgICAgICAgICAgIGZpdCBpbiA8Y29kZT5pbnQ8L2NvZGU+IHR5cGUuCisgICAgICogICAgICAgICAgICBhIDY0IGJpdCBzY2FsZQorICAgICAqIEByZXR1cm4gYSAzMiBiaXQgc2NhbGUgd2hlbiBpcyBwb3NzaWJsZQorICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbiB3aGVuIHtAY29kZSBzY2FsZX0gZG9lc24ndAorICAgICAqICAgICAgICAgICAgIGZpdCBpbiB7QGNvZGUgaW50fSB0eXBlCiAgICAgICogQHNlZSAjc2NhbGUKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgdG9JbnRTY2FsZShsb25nIGxvbmdTY2FsZSkgewpAQCAtMzA2MywxNSArMzEwNCwxNSBAQAogCiAgICAgLyoqCiAgICAgICogSXQgcmV0dXJucyB0aGUgdmFsdWUgMCB3aXRoIHRoZSBtb3N0IGFwcHJveGltYXRlZCBzY2FsZSBvZiB0eXBlCi0gICAgICogPGNvZGU+aW50PC9jb2RlPi4gaWYgPGNvZGU+bG9uZ1NjYWxlID4gSW50ZWdlci5NQVhfVkFMVUU8L2NvZGU+IHRoZQotICAgICAqIHNjYWxlIHdpbGwgYmUgPGNvZGU+SW50ZWdlci5NQVhfVkFMVUU8L2NvZGU+OyBpZgotICAgICAqIDxjb2RlPmxvbmdTY2FsZSA8IEludGVnZXIuTUlOX1ZBTFVFPC9jb2RlPiB0aGUgc2NhbGUgd2lsbCBiZQotICAgICAqIDxjb2RlPkludGVnZXIuTUlOX1ZBTFVFPC9jb2RlPjsgb3RoZXJ3aXNlIDxjb2RlPmxvbmdTY2FsZTwvY29kZT4gaXMKLSAgICAgKiBjYXN0ZWQgdG8gdGhlIHR5cGUgPGNvZGU+aW50PC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgaW50fS4gaWYge0Bjb2RlIGxvbmdTY2FsZSA+IEludGVnZXIuTUFYX1ZBTFVFfSB0aGUKKyAgICAgKiBzY2FsZSB3aWxsIGJlIHtAY29kZSBJbnRlZ2VyLk1BWF9WQUxVRX07IGlmCisgICAgICoge0Bjb2RlIGxvbmdTY2FsZSA8IEludGVnZXIuTUlOX1ZBTFVFfSB0aGUgc2NhbGUgd2lsbCBiZQorICAgICAqIHtAY29kZSBJbnRlZ2VyLk1JTl9WQUxVRX07IG90aGVyd2lzZSB7QGNvZGUgbG9uZ1NjYWxlfSBpcworICAgICAqIGNhc3RlZCB0byB0aGUgdHlwZSB7QGNvZGUgaW50fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9uZ1NjYWxlCiAgICAgICogICAgICAgICAgICB0aGUgc2NhbGUgdG8gd2hpY2ggdGhlIHZhbHVlIDAgd2lsbCBiZSBzY2FsZWQuCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgMCBzY2FsZWQgYnkgdGhlIGNsb3NlciBzY2FsZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgMCBzY2FsZWQgYnkgdGhlIGNsb3NlciBzY2FsZSBvZiB0eXBlIHtAY29kZSBpbnR9LgogICAgICAqIEBzZWUgI3NjYWxlCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgQmlnRGVjaW1hbCB6ZXJvU2NhbGVkQnkobG9uZyBsb25nU2NhbGUpIHsKZGlmZiAtLWdpdCBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvQmlnSW50LmphdmEgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0JpZ0ludC5qYXZhCmluZGV4IDQ1ODJlMTMuLmNiNzk5MGEgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvQmlnSW50LmphdmEKKysrIGIvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9CaWdJbnQuamF2YQpAQCAtMjEsMTEgKzIxLDExIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCi0vKioKKy8qCiAgKiBJbiBjb250cmFzdCB0byBCaWdJbnRlZ2VycyB0aGlzIGNsYXNzIGRvZXNuJ3QgZmFrZSB0d28ncyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uLgogICogQW55IEJpdC1PcGVyYXRpb25zLCBpbmNsdWRpbmcgU2hpZnRpbmcsIHNvbGVseSByZWdhcmQgdGhlIHVuc2lnbmVkIG1hZ25pdHVkZS4KICAqIE1vcmVvdmVyIEJpZ0ludCBvYmplY3RzIGFyZSBtdXRhYmxlIGFuZCBvZmZlciBlZmZpY2llbnQgaW4tcGxhY2Utb3BlcmF0aW9ucy4KLSAqKi8KKyAqLwogCiBjbGFzcyBCaWdJbnQKIC8vIGV4dGVuZHMgTnVtYmVyCkBAIC0zOTEsNiArMzkxLDEyIEBACiAgICAgICAgIHJldHVybiByOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50IGdlbmVyYXRlUHJpbWVTYWZlKGludCBiaXRMZW5ndGgsIFJhbmRvbSBybmQsIENvbnRleHQgdCkgeworICAgICAgICBCaWdJbnQgciA9IG5ld0JpZ0ludCgpOworICAgICAgICBDaGVjayhOYXRpdmVCTi5CTl9nZW5lcmF0ZV9wcmltZV9leChyLmJpZ251bSwgYml0TGVuZ3RoLCB0cnVlLCAwLCAwLCAwKSk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWUoaW50IGNlcnRhaW50eSwgUmFuZG9tIHJuZCwgQ29udGV4dCB0KSB7CiAgICAgICAgIHJldHVybiBOYXRpdmVCTi5CTl9pc19wcmltZV9leChiaWdudW0sIGNlcnRhaW50eSwgZ2V0Q3R4KHQpLCAwKTsKICAgICB9CmRpZmYgLS1naXQgYS9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0JpZ0ludGVnZXIuamF2YSBiL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvQmlnSW50ZWdlci5qYXZhCmluZGV4IGM2NmRmZjguLmNmZTk4MTggMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvQmlnSW50ZWdlci5qYXZhCisrKyBiL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvQmlnSW50ZWdlci5qYXZhCkBAIC0xLDIwICsxLDQgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgogICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KQEAgLTMwLDEzICsxNCwyOCBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAvKgotICogU2luY2UgdGhlIG9yaWdpbmFsIEhhcm1vbnkgQ29kZSBvZiB0aGUgQmlnSW50ZWdlciBjbGFzcyB3YXMgc3Ryb25nbHkgbW9kaWZpZWQsCi0gKiBpbiBvcmRlciB0byB1c2UgdGhlIG1vcmUgZWZmaWNpZW50IE9wZW5TU0wgQklHTlVNIGltcGxlbWVudGF0aW9uLAotICogbm8gYW5kcm9pZC1tb2RpZmljYXRpb24tdGFncyB3ZXJlIHBsYWNlZCwgYXQgYWxsLgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBTaW5jZSB0aGUgb3JpZ2luYWwgSGFybW9ueSBDb2RlIG9mIHRoZSBCaWdJbnRlZ2VyIGNsYXNzIHdhcyBzdHJvbmdseSBtb2RpZmllZCwKKy8vIGluIG9yZGVyIHRvIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgT3BlblNTTCBCSUdOVU0gaW1wbGVtZW50YXRpb24sCisvLyBubyBhbmRyb2lkLW1vZGlmaWNhdGlvbi10YWdzIHdlcmUgcGxhY2VkLCBhdCBhbGwuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS5tYXRoOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTQ4LDE0ICs0NywyOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5tYXRoLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBDbGFzcyB3aGljaCByZXByZXNlbnRzIGltbXV0YWJsZSBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXIgbnVtYmVycy4gCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBhbmQgbWV0aG9kcwotICogZm9yIHRoZSBjb21wYXJpc29uIG9mIHR3byBpbnN0YW5jZXMuIAorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGltbXV0YWJsZSBpbnRlZ2VyIG51bWJlcnMgb2YgYXJiaXRyYXJ5IGxlbmd0aC4gTGFyZ2UKKyAqIG51bWJlcnMgYXJlIHR5cGljYWxseSB1c2VkIGluIHNlY3VyaXR5IGFwcGxpY2F0aW9ucyBhbmQgdGhlcmVmb3JlIEJpZ0ludGVnZXJzCisgKiBvZmZlciBkZWRpY2F0ZWQgZnVuY3Rpb25hbGl0eSBsaWtlIHRoZSBnZW5lcmF0aW9uIG9mIGxhcmdlIHByaW1lIG51bWJlcnMgb3IKKyAqIHRoZSBjb21wdXRhdGlvbiBvZiBtb2R1bGFyIGludmVyc2UuCisgKiA8cD4KKyAqIFNpbmNlIHRoZSBjbGFzcyB3YXMgbW9kZWxlZCB0byBvZmZlciBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgYXMgdGhlIHtAbGluayBJbnRlZ2VyfQorICogY2xhc3MgZG9lcywgaXQgcHJvdmlkZXMgZXZlbiBtZXRob2RzIHRoYXQgb3BlcmF0ZSBiaXR3aXNlIG9uIGEgdHdvJ3MKKyAqIGNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgbGFyZ2UgaW50ZWdlcnMuIE5vdGUgaG93ZXZlciB0aGF0IHRoZQorICogaW1wbGVtZW50YXRpb25zIGZhdm9ycyBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB3aGVyZSBtYWduaXR1ZGUgYW5kIHNpZ24KKyAqIGFyZSB0cmVhdGVkIHNlcGFyYXRlbHkuIEhlbmNlIHN1Y2ggb3BlcmF0aW9ucyBhcmUgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZQorICogZGlzY291cmFnZWQuIEluIHNpbXBsZSB3b3JkczogRG8gTk9UIGltcGxlbWVudCBhbnkgYml0IGZpZWxkcyBiYXNlZCBvbgorICogQmlnSW50ZWdlci4KKyAqIDxwPgorICogPGI+SW1wbGVtZW50YXRpb24gTm90ZTo8L2I+IDxicj4KKyAqIFRoZSBuYXRpdmUgT3BlblNTTCBsaWJyYXJ5IHdpdGggaXRzIEJJR05VTSBvcGVyYXRpb25zIGNvdmVycyBhbGwgdGhlCisgKiBtZWFuaW5nZnVsIGZ1bmN0aW9uYWxpdHkgKGV2ZXJ5dGhpbmcgYnV0IGJpdCBsZXZlbCBvcGVyYXRpb25zKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCaWdJbnRlZ2VyIGV4dGVuZHMgTnVtYmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxCaWdJbnRlZ2VyPiwKICAgICAgICAgU2VyaWFsaXphYmxlIHsKIAotICAgIC8qKiBUaGlzIGlzIHRoZSBzZXJpYWxWZXJzaW9uVUlEIHVzZWQgYnkgdGhlIHN1biBpbXBsZW1lbnRhdGlvbiAqLworICAgIC8qKiBUaGlzIGlzIHRoZSBzZXJpYWxWZXJzaW9uVUlEIHVzZWQgYnkgdGhlIHN1biBpbXBsZW1lbnRhdGlvbi4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODI4NzU3NDI1NTkzNjQ3MjI5MUw7CiAKICAgICB0cmFuc2llbnQgQmlnSW50IGJpZ0ludDsKQEAgLTY0LDggKzc4LDYgQEAKIAogICAgIHZvaWQgZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oU3RyaW5nIGNhbGxlcikgewogICAgICAgICBpZiAoIW9sZFJlcHJJc1ZhbGlkKSB7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiBlc3RhYmxpc2hpbmcgT0xEIFJlcHIgTk9XIGZvciAiKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNhbGxlcik7CiAgICAgICAgICAgICBzaWduID0gYmlnSW50LnNpZ24oKTsKICAgICAgICAgICAgIGlmIChzaWduICE9IDApIGRpZ2l0cyA9IGJpZ0ludC5saXR0bGVFbmRpYW5JbnRzTWFnbml0dWRlKCk7CiAgICAgICAgICAgICBlbHNlIGRpZ2l0cyA9IG5ldyBpbnRbXSB7IDAgfTsKQEAgLTc5LDggKzkxLDYgQEAKICAgICAvLyBJdCBlbnN1cmVzIHRoYXQgdGhlIG5ldyByZXByZXNlbnRhdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkIG9uIGRlbWFuZC4KICAgICAvLwogICAgIEJpZ0ludGVnZXIgd2l0aE5ld1JlcHJlc2VudGF0aW9uKFN0cmluZyBjYWxsZXIpIHsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJCaWdJbnRlZ2VyLndpdGhOZXdSZXByZXNlbnRhdGlvbiBjYWxsZWQgYnkgIik7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNhbGxlcik7CiAgICAgICAgIGJpZ0ludElzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQpAQCAtOTMsNTUgKzEwMywzMyBAQAogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkNsYWltaW5nIGJpZ0ludElzVmFsaWQgQlVUIGJpZ0ludC5iaWdudW0gPT0gMCwgIik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlZhbGlkYXRpbmcgZm9yICIpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGNhbGxlcik7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiBAICIpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHBhcmFtKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiOiAiKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiYmlnSW50IGlzIE5PVCB2YWxpZCwgIik7Ci0vLyAgICAgICAgICAgIGlmIChiaWdJbnQgPT0gbnVsbCkgU3lzdGVtLm91dC5wcmludCgiYmlnSW50ID09IG51bGwsICIpOwotLy8gICAgICAgICAgICBlbHNlIGlmIChiaWdJbnQuZ2V0TmF0aXZlQklHTlVNKCkgPT0gMCkgU3lzdGVtLm91dC5wcmludCgiYmlnSW50LmJpZ251bSA9PSAwLCAiKTsKLSAgICAgICAgICAgIGlmIChvbGRSZXBySXNWYWxpZCkgewotICAgICAgICAgICAgICAgIC8vIGVzdGFibGlzaE5ld1JlcHJlc2VudGF0aW9uKCk7Ci0vLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBlc3RhYmxpc2hpbmcgTkVXIFJlcHIgRlJPTSBPTEQgTk9XISIpOwotLy8gICAgICAgICAgICAgICAgaWYgKGJpZ0ludCAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgRVZFTlRIT1VHSCBBIE5FVyBSRVBSIEFMUkVBRFkgRVhJU1RTISEhIik7Ci0vLyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2xkUmVwcklzVmFsaWQpIHsgLy8gZXN0YWJsaXNoIG5ldyByZXByZXNlbnRhdGlvbgogICAgICAgICAgICAgICAgIGlmIChiaWdJbnQgPT0gbnVsbCkgYmlnSW50ID0gbmV3IEJpZ0ludCgpOwogICAgICAgICAgICAgICAgIGJpZ0ludC5wdXRMaXR0bGVFbmRpYW5JbnRzKGRpZ2l0cywgKHNpZ24gPCAwKSk7CiAgICAgICAgICAgICAgICAgYmlnSW50SXNWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQU5EIG9sZFJlcHIgaXMgTk9UIHZhbGlkLCBlaXRoZXIhIik7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjYWxsZXIgKyAiOiIgKyBwYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCB2YWxpZGF0ZTEoU3RyaW5nIGNhbGxlciwgQmlnSW50ZWdlciBhKSB7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiVmFsaWRhdGluZyBmb3IgIik7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNhbGxlcik7CiAgICAgICAgIGEudmFsaWRhdGUoY2FsbGVyLCAiMSIpOwogICAgIH0KIAogICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlMihTdHJpbmcgY2FsbGVyLCBCaWdJbnRlZ2VyIGEsIEJpZ0ludGVnZXIgYikgewotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlZhbGlkYXRpbmcgZm9yICIpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjYWxsZXIpOwogICAgICAgICBhLnZhbGlkYXRlKGNhbGxlciwgIjEiKTsKICAgICAgICAgYi52YWxpZGF0ZShjYWxsZXIsICIyIik7CiAgICAgfQogCiAgICAgc3RhdGljIHZvaWQgdmFsaWRhdGUzKFN0cmluZyBjYWxsZXIsIEJpZ0ludGVnZXIgYSwgQmlnSW50ZWdlciBiLCBCaWdJbnRlZ2VyIGMpIHsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJWYWxpZGF0aW5nIGZvciAiKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2FsbGVyKTsKICAgICAgICAgYS52YWxpZGF0ZShjYWxsZXIsICIxIik7CiAgICAgICAgIGIudmFsaWRhdGUoY2FsbGVyLCAiMiIpOwogICAgICAgICBjLnZhbGlkYXRlKGNhbGxlciwgIjMiKTsKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCB2YWxpZGF0ZTQoU3RyaW5nIGNhbGxlciwgQmlnSW50ZWdlciBhLCBCaWdJbnRlZ2VyIGIsIEJpZ0ludGVnZXIgYywgQmlnSW50ZWdlciBkKSB7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiVmFsaWRhdGluZyBmb3IgIik7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNhbGxlcik7CiAgICAgICAgIGEudmFsaWRhdGUoY2FsbGVyLCAiMSIpOwogICAgICAgICBiLnZhbGlkYXRlKGNhbGxlciwgIjIiKTsKICAgICAgICAgYy52YWxpZGF0ZShjYWxsZXIsICIzIik7CkBAIC0xNTEsMjYgKzEzOSwyOSBAQAogICAgIC8qKiBUaGUgbWFnbml0dWRlIG9mIHRoaXMgaW4gdGhlIGxpdHRsZS1lbmRpYW4gcmVwcmVzZW50YXRpb24uICovCiAgICAgdHJhbnNpZW50IGludCBkaWdpdHNbXTsKIAotICAgIC8qKiBUaGUgbGVuZ3RoIG9mIHRoaXMgaW4gbWVhc3VyZWQgaW4gaW50cy4gQ2FuIGJlIGxlc3MgdGhhbiBkaWdpdHMubGVuZ3RoKCkuICovCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGlzIGluIG1lYXN1cmVkIGluIGludHMuIENhbiBiZSBsZXNzIHRoYW4gZGlnaXRzLmxlbmd0aCgpLgorICAgICAqLwogICAgIHRyYW5zaWVudCBpbnQgbnVtYmVyTGVuZ3RoOwogCiAgICAgLyoqIFRoZSBzaWduIG9mIHRoaXMuICovCiAgICAgdHJhbnNpZW50IGludCBzaWduOwogCi0KICAgICAvKiBTdGF0aWMgRmllbGRzICovCiAKICAgICAvKioKICAgICAgKiBUaGUge0Bjb2RlIEJpZ0ludGVnZXJ9IGNvbnN0YW50IDAuCiAgICAgICogCiAgICAgICogQHNpbmNlIDEuMgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBaRVJPID0gbmV3IEJpZ0ludGVnZXIoMCwgMCk7CiAKICAgICAvKioKLSAgICAgKiBUaGUge0Bjb2RlIEJpZ0ludGVnZXJ9IGNvbnN0YXRuIDEuCisgICAgICogVGhlIHtAY29kZSBCaWdJbnRlZ2VyfSBjb25zdGFudCAxLgogICAgICAqIAogICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgT05FID0gbmV3IEJpZ0ludGVnZXIoMSwgMSk7CiAKQEAgLTE3OCw2ICsxNjksNyBAQAogICAgICAqIFRoZSB7QGNvZGUgQmlnSW50ZWdlcn0gY29uc3RhbnQgMTAuCiAgICAgICogCiAgICAgICogQHNpbmNlIDEuNQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBURU4gPSBuZXcgQmlnSW50ZWdlcigxLCAxMCk7CiAKQEAgLTIwMiwxNSArMTk0LDE0IEBACiAgICAgLyoqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBmaXJzdE5vbnplcm9EaWdpdCA9IC0yOwogICAgIAotCiAgICAgLyogU2VyaWFsaXplZCBGaWVsZHMgKi8KIAotICAgIC8qKiBzaWduIGZpZWxkLCB1c2VkIGZvciBzZXJpYWxpemF0aW9uICovCisgICAgLyoqIHNpZ24gZmllbGQsIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24uICovCiAgICAgcHJpdmF0ZSBpbnQgc2lnbnVtOwogCiAgICAgLyoqIGFic29sdXRlIHZhbHVlIGZpZWxkLCB1c2VkIGZvciBzZXJpYWxpemF0aW9uICovCiAgICAgcHJpdmF0ZSBieXRlW10gbWFnbml0dWRlOwotCisgICAgCiAgICAgLyoqIENhY2hlIGZvciB0aGUgaGFzaCBjb2RlLiAqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoQ29kZSA9IDA7CiAKQEAgLTIzMywxNSArMjI0LDE1IEBACiAKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBudW1iZXIgd2l0aG91dCB0byBjcmVhdGUgbmV3IHNwYWNlLiBUaGlzIGNvbnN0cnVjdCBzaG91bGQgYmUKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbnVtYmVyIHdpdGhvdXQgY3JlYXRpbmcgbmV3IHNwYWNlLiBUaGlzIGNvbnN0cnVjdCBzaG91bGQgYmUKICAgICAgKiB1c2VkIG9ubHkgaWYgdGhlIHRocmVlIGZpZWxkcyBvZiByZXByZXNlbnRhdGlvbiBhcmUga25vd24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNpZ24KLSAgICAgKiAgICAgICAgICAgIHRoZSBzaWduIG9mIHRoZSBudW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaWduIG9mIHRoZSBudW1iZXIuCiAgICAgICogQHBhcmFtIG51bWJlckxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW50ZXJuYWwgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGludGVybmFsIGFycmF5LgogICAgICAqIEBwYXJhbSBkaWdpdHMKLSAgICAgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIG9mIHNvbWUgYXJyYXkgY3JlYXRlZCBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIG9mIHNvbWUgYXJyYXkgY3JlYXRlZCBiZWZvcmUuCiAgICAgICovCiAgICAgQmlnSW50ZWdlcihpbnQgc2lnbiwgaW50IG51bWJlckxlbmd0aCwgaW50W10gZGlnaXRzKSB7CiAgICAgICAgIHRoaXMuc2lnbiA9IHNpZ247CkBAIC0yNTksMTEgKzI1MCwxMyBAQAogICAgICAqIFswLCAyXihudW1CaXRzKS0xXS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbnVtQml0cwotICAgICAqICAgICAgICAgICAgbWF4aW11bSBsZW5naHQgb2YgdGhlIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gaW4gYml0cy4KKyAgICAgKiAgICAgICAgICAgIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IGluIGJpdHMuCiAgICAgICogQHBhcmFtIHJuZAotICAgICAqICAgICAgICAgICAgcmFuZG9tIGdlbmVyYXRvciB1c2VkIHRvIGdlbmVyYXRlIHRoZSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9LgorICAgICAqICAgICAgICAgICAgaXMgYW4gb3B0aW9uYWwgcmFuZG9tIGdlbmVyYXRvciB0byBiZSB1c2VkLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbnVtQml0cyA8IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbnVtQml0c30gPCAwLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyKGludCBudW1CaXRzLCBSYW5kb20gcm5kKSB7CiAgICAgICAgIGlmIChudW1CaXRzIDwgMCkgewpAQCAtMjkwLDE4ICsyODMsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZG9tIHBvc2l0aXZlIHtAY29kZSBCaWdJbnRlZ2VyfSBpbnN0YW5jZSBpbiB0aGUgcmFuZ2UgWzAsCisgICAgICogQ29uc3RydWN0cyBhIHJhbmRvbSB7QGNvZGUgQmlnSW50ZWdlcn0gaW5zdGFuY2UgaW4gdGhlIHJhbmdlIFswLAogICAgICAqIDJeKGJpdExlbmd0aCktMV0gd2hpY2ggaXMgcHJvYmFibHkgcHJpbWUuIFRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZQogICAgICAqIHJldHVybmVkIHtAY29kZSBCaWdJbnRlZ2VyfSBpcyBwcmltZSBpcyBiZXlvbmQgKDEtMS8yXmNlcnRhaW50eSkuCisgICAgICogPHA+CisgICAgICogPGI+SW1wbGVtZW50YXRpb24gTm90ZTo8L2I+CisgICAgICogQ3VycmVudGx5IHtAY29kZSBybmR9IGlzIGlnbm9yZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdXNlcworICAgICAqIG1ldGhvZCB7QGNvZGUgYm5fcmFuZH0gZnJvbSB0aGUgT3BlblNTTCBsaWJyYXJ5LiB7QGNvZGUgYm5fcmFuZH0gCisgICAgICogZ2VuZXJhdGVzIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZyBwc2V1ZG8tcmFuZG9tIG51bWJlcnMuCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvY3J5cHRvL0JOX3JhbmQuaHRtbCI+CisgICAgICogU3BlY2lmaWNhdGlvbiBvZiByYW5kb20gZ2VuZXJhdG9yIHVzZWQgZnJvbSBPcGVuU1NMIGxpYnJhcnk8L2E+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJpdExlbmd0aAotICAgICAqICAgICAgICAgICAgbGVuZ2h0IG9mIHRoZSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IGluIGJpdHMuCisgICAgICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gaW4gYml0cy4KICAgICAgKiBAcGFyYW0gY2VydGFpbnR5CiAgICAgICogICAgICAgICAgICB0b2xlcmF0ZWQgcHJpbWFsaXR5IHVuY2VydGFpbnR5LgogICAgICAqIEBwYXJhbSBybmQKLSAgICAgKiAgICAgICAgICAgIHJhbmRvbSBnZW5lcmF0b3IgdXNlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGJpdExlbmd0aCA8IDIKKyAgICAgKiAgICAgICAgICAgIGlzIGFuIG9wdGlvbmFsIHJhbmRvbSBnZW5lcmF0b3IgdG8gYmUgdXNlZC4KKyAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYml0TGVuZ3RofSA8IDIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIoaW50IGJpdExlbmd0aCwgaW50IGNlcnRhaW50eSwgUmFuZG9tIHJuZCkgewogICAgICAgICBpZiAoYml0TGVuZ3RoIDwgMikgewpAQCAtMzIxLDkgKzMyMywxMiBAQAogICAgICAqIEBwYXJhbSB2YWwKICAgICAgKiAgICAgICAgICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdmFsID09IG51bGwuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbCA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIHtAY29kZSBCaWdJbnRlZ2VyfS4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsfSBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIHtAY29kZQorICAgICAqICAgICAgICAgICAgIEJpZ0ludGVnZXJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyKFN0cmluZyB2YWwpIHsKICAgICAgICAgYmlnSW50ID0gbmV3IEJpZ0ludCgpOwpAQCAtMzQ0LDExICszNDksMTMgQEAKICAgICAgKiBAcGFyYW0gcmFkaXgKICAgICAgKiAgICAgICAgICAgIHRoZSBiYXNlIHRvIGJlIHVzZWQgZm9yIHRoZSBjb252ZXJzaW9uLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB2YWwgPT0gbnVsbH0uCiAgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgaXMgbm90IGEgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSB7QGNvZGUgQmlnSW50ZWdlcn0KLSAgICAgKiAgICAgICAgICAgICBvciBpZiByYWRpeCA8IENoYXJhY3Rlci5NSU5fUkFESVggb3IgcmFkaXggPgotICAgICAqICAgICAgICAgICAgIENoYXJhY3Rlci5NQVhfUkFESVguCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbH0gaXMgbm90IGEgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBCaWdJbnRlZ2VyfSBvciBpZiB7QGNvZGUgcmFkaXggPCBDaGFyYWN0ZXIuTUlOX1JBRElYfSBvcgorICAgICAqICAgICAgICAgICAgIHtAY29kZSByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVh9LgorICAgICAqICAgICAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyKFN0cmluZyB2YWwsIGludCByYWRpeCkgewogICAgICAgICBpZiAodmFsID09IG51bGwpIHsKQEAgLTM3Myw3ICszODAsNyBAQAogICAgICAgICAgICAgICAgIC8vIG1hdGguMTI9WmVybyBsZW5ndGggQmlnSW50ZWdlcgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJtYXRoLjEyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnNldEZyb21TdHJpbmcodGhpcywgdmFsLCByYWRpeCk7CisgICAgICAgICAgICBCaWdJbnRlZ2VyLnNldEZyb21TdHJpbmcodGhpcywgdmFsLCByYWRpeCk7CiAgICAgICAgICAgICAvLyBvbGRSZXBySXNWYWxpZCA9PSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzkwLDEyICszOTcsMTMgQEAKICAgICAgKiBAcGFyYW0gbWFnbml0dWRlCiAgICAgICogICAgICAgICAgICBtYWduaXR1ZGUgb2YgdGhlIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gd2l0aCB0aGUgbW9zdAogICAgICAqICAgICAgICAgICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbWFnbml0dWRlID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbWFnbml0dWRlID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpZ24gaXMgbm90IG9uZSBvZiAtMSwgMCwgMSBvciBpZiB0aGUgc2lnbiBpcyB6ZXJvIGFuZAotICAgICAqICAgICAgICAgICAgIHRoZSBtYWduaXR1dGUgY29udGFpbnMgbm9uLXplcm8gZW50cmllcy4KKyAgICAgKiAgICAgICAgICAgICB0aGUgbWFnbml0dWRlIGNvbnRhaW5zIG5vbi16ZXJvIGVudHJpZXMuCisgICAgICogICAgICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIoaW50IHNpZ251bSwgYnl0ZVtdIG1hZ25pdHVkZSkgewogICAgICAgICBpZiAobWFnbml0dWRlID09IG51bGwpIHsKQEAgLTQyMSwxNiArNDI5LDE3IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gZnJvbSB0aGUgZ2l2ZW4gdHdvJ3MgY29tcGxlbWVudAogICAgICAqIHJlcHJlc2VudGF0aW9uLiBUaGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIHRoZSBlbnRyeSBhdCBpbmRleCAwLiBUaGUKLSAgICAgKiBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGlzIGVudHJ5IGRldGVybWluZXMgdGhlIHNpZ24gb2YgdGhlIG5ldwotICAgICAqIHtAY29kZSBCaWdJbnRlZ2VyfSBpbnN0YW5jZS4gVGhlIGdpdmVuIGFycmF5IG11c3Qgbm90IGJlIGVtcHR5LgorICAgICAqIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoaXMgZW50cnkgZGV0ZXJtaW5lcyB0aGUgc2lnbiBvZiB0aGUgbmV3IHtAY29kZQorICAgICAqIEJpZ0ludGVnZXJ9IGluc3RhbmNlLiBUaGUgZ2l2ZW4gYXJyYXkgbXVzdCBub3QgYmUgZW1wdHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAogICAgICAqICAgICAgICAgICAgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfS4KLSAgICAgKiAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdmFsID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGxlbmdodCBvZiB2YWwgPT0gMC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHtAY29kZSB2YWx9IGlzIHplcm8uCisgICAgICogICAgICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIoYnl0ZVtdIHZhbCkgewogICAgICAgICBpZiAodmFsLmxlbmd0aCA9PSAwKSB7CkBAIC00NTIsNiArNDYxLDggQEAKICAgICAgKiBAcGFyYW0gdmFsCiAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0uCiAgICAgICogQHJldHVybiB7QGNvZGUgQmlnSW50ZWdlcn0gaW5zdGFuY2Ugd2l0aCB0aGUgdmFsdWUge0Bjb2RlIHZhbH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIHZhbHVlT2YobG9uZyB2YWwpIHsKICAgICAgICAgaWYgKHZhbCA8IDApIHsKQEAgLTQ3MSwxMCArNDgyLDEwIEBACiAgICAgICogYXJyYXkuCiAgICAgICogCiAgICAgICogQHJldHVybiB0d28ncyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSB0aGlzfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgewotLy8gICAgICAgIHZhbGlkYXRlMSgidG9CeXRlQXJyYXkoKSIsIHRoaXMpOwotLy8gICAgICAgIHJldHVybiBiaWdJbnQuYmlnRW5kaWFuVHdvc0NvbXBsZW1lbnQoKTsKICAgICAgICAgcmV0dXJuIHR3b3NDb21wbGVtZW50KCk7CiAgICAgfQogCkBAIC00ODIsNyArNDkzLDkgQEAKICAgICAgKiBSZXR1cm5zIGEgKG5ldykge0Bjb2RlIEJpZ0ludGVnZXJ9IHdob3NlIHZhbHVlIGlzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZgogICAgICAqIHtAY29kZSB0aGlzfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSBhYnModGhpcyl9CisgICAgICogQHJldHVybiB7QGNvZGUgYWJzKHRoaXMpfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBhYnMoKSB7CiAgICAgICAgIHZhbGlkYXRlMSgiYWJzKCkiLCB0aGlzKTsKQEAgLTQ5OCw2ICs1MTEsOCBAQAogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdob3NlIHZhbHVlIGlzIHRoZSB7QGNvZGUgLXRoaXN9LgogICAgICAqIAogICAgICAqIEByZXR1cm4ge0Bjb2RlIC10aGlzfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBuZWdhdGUoKSB7CiAgICAgICAgIHZhbGlkYXRlMSgibmVnYXRlKCkiLCB0aGlzKTsKQEAgLTUxNyw3ICs1MzIsOSBAQAogICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYWRkZWQgdG8ge0Bjb2RlIHRoaXN9LgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgKyB2YWx9LgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB2YWwgPT0gbnVsbH0uCisgICAgICogICAgICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgYWRkKEJpZ0ludGVnZXIgdmFsKSB7CiAgICAgICAgIHZhbGlkYXRlMigiYWRkIiwgdGhpcywgdmFsKTsKQEAgLTUzMyw3ICs1NTAsOSBAQAogICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgc3VidHJhY3RlZCBmcm9tIHtAY29kZSB0aGlzfS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIC0gdmFsfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdmFsID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsID09IG51bGx9LgorICAgICAqICAgICAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHN1YnRyYWN0KEJpZ0ludGVnZXIgdmFsKSB7CiAgICAgICAgIHZhbGlkYXRlMigic3VidHJhY3QiLCB0aGlzLCB2YWwpOwpAQCAtNTQ0LDggKzU2MywxMSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhpcyB7QGNvZGUgQmlnSW50ZWdlcn0uCiAgICAgICogCi0gICAgICogQHJldHVybiAtMSBpZiB7QGNvZGUgdGhpcyA8IDB9LCAwIGlmIHtAY29kZSB0aGlzID09IDB9LCAxIGlmCi0gICAgICogICAgICAgICB7QGNvZGUgdGhpcyA+IDB9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIC0xfSBpZiB7QGNvZGUgdGhpcyA8IDB9LCAKKyAgICAgKiAgICAgICAgIHtAY29kZSAwfSBpZiB7QGNvZGUgdGhpcyA9PSAwfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSAxfSBpZiB7QGNvZGUgdGhpcyA+IDB9LgorICAgICAqICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzaWdudW0oKSB7CiAgICAgIC8vIE9wdGltaXphdGlvbiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBkdXBsaWNhdGUgcmVwcmVzZW50YXRpb246CkBAIC01NTksMTAgKzU4MSwxNiBAQAogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzID4+IG59LiBGb3IKICAgICAgKiBuZWdhdGl2ZSBhcmd1bWVudHMsIHRoZSByZXN1bHQgaXMgYWxzbyBuZWdhdGl2ZS4gVGhlIHNoaWZ0IGRpc3RhbmNlIG1heQogICAgICAqIGJlIG5lZ2F0aXZlIHdoaWNoIG1lYW5zIHRoYXQge0Bjb2RlIHRoaXN9IGlzIHNoaWZ0ZWQgbGVmdC4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBOb3RlOjwvYj4gVXNhZ2Ugb2YgdGhpcyBtZXRob2Qgb24gbmVnYXRpdmUgdmFsdWVzIGlzCisgICAgICogbm90IHJlY29tbWVuZGVkIGFzIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBlZmZpY2llbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG4KLSAgICAgKiAgICAgICAgICAgIHNoaWZ0IGRpc3RhbmNlLgotICAgICAqIEByZXR1cm4gdGhpcyA+PiBuIGlmIG4gPj0gMDsgdGhpcyA8PCAoLW4pIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgICAgIHNoaWZ0IGRpc3RhbmNlCisgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyA+PiBufSBpZiB7QGNvZGUgbiA+PSAwfTsge0Bjb2RlIHRoaXMgPDwgKC1uKX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgc2hpZnRSaWdodChpbnQgbikgewogICAgICAgICByZXR1cm4gc2hpZnRMZWZ0KC1uKTsKQEAgLTU3MCwxMyArNTk4LDE5IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfSB3aG9zZSB2YWx1ZSBpcyB7QGNvZGUgdGhpcyA8PCBufS4gVGhlCi0gICAgICogcmVzdWx0IGlzIGVxdXZhbGVudCB0byB7QGNvZGUgdGhpcyAqIDJebn0gaWYgbiAmZ2VxOyAwLiBUaGUgc2hpZnQKLSAgICAgKiBkaXN0YW5jZSBtYXkgYmUgbmVnYXRpdmUgd2hpY2ggbWVhbnMgdGhhdCB7QGNvZGUgdGhpc30gaXMgc2hpZnRlZCByaWdodC4KLSAgICAgKiBUaGUgcmVzdWx0IHRoZW4gY29ycmVzcG9uZHMgdG8ge0Bjb2RlIGZsb29yKHRoaXMgLyAyXigtbikpfS4KKyAgICAgKiByZXN1bHQgaXMgZXF1aXZhbGVudCB0byB7QGNvZGUgdGhpcyAqIDJebn0gaWYgbiA+PSAwLiBUaGUgc2hpZnQgZGlzdGFuY2UKKyAgICAgKiBtYXkgYmUgbmVnYXRpdmUgd2hpY2ggbWVhbnMgdGhhdCB7QGNvZGUgdGhpc30gaXMgc2hpZnRlZCByaWdodC4gVGhlCisgICAgICogcmVzdWx0IHRoZW4gY29ycmVzcG9uZHMgdG8ge0Bjb2RlIGZsb29yKHRoaXMgLyAyXigtbikpfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBOb3RlOjwvYj4gVXNhZ2Ugb2YgdGhpcyBtZXRob2Qgb24gbmVnYXRpdmUgdmFsdWVzIGlzCisgICAgICogbm90IHJlY29tbWVuZGVkIGFzIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBlZmZpY2llbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG4KICAgICAgKiAgICAgICAgICAgIHNoaWZ0IGRpc3RhbmNlLgotICAgICAqIEByZXR1cm4gdGhpcyA8PCBuIGlmIG4gPj0gMDsgdGhpcyA+PiAoLW4pIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIDw8IG59IGlmIHtAY29kZSBuID49IDB9OyB7QGNvZGUgdGhpcyA+PiAoLW4pfS4KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHNoaWZ0TGVmdChpbnQgbikgewogICAgICAgICBpZiAobiA9PSAwKSByZXR1cm4gdGhpczsKQEAgLTU5NiwxNyArNjMwLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdGhpc30KLSAgICAgKiB3aXRob3V0IHRoZSBzaWduIGJpdC4gRm9yIHBvc2l0aXZlIHZhbHVlcyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gICAgICogbnVtYmVyIG9mIGJpdHMsIGFuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyCi0gICAgICogb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCAtdmFsdWUtMS4KLSAgICAgKiBtYzogSW4gb3RoZXIgd29yZHM6IHRoZSBudW1iZXIgYSBjYW4gYmUgY29kZWQgaW4KLSAgICAgKiAgICAgYS5iaXRMZW5ndGgoKSArIDEgYml0cyB0d28ncyBjb21wbGVtZW50LgotICAgICAqICAgICBFLmcuIGZvciBhLmJpdExlbmd0aCgpID09IDMxLCBhbiBpbnQgd2lsbCBob2xkIGEgY29ycmVjdGx5IGFuZAotICAgICAqICAgICBmb3IgYS5iaXRMZW5ndGgoKSA9PSAzMiBhbiBpbnQgd2lsbCBOT1QgaG9sZCBhIGNvcnJlY3RseS4KKyAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHZhbHVlJ3MgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbiB3aXRob3V0CisgICAgICogbGVhZGluZyB6ZXJvcyBmb3IgcG9zaXRpdmUgbnVtYmVycyAvIHdpdGhvdXQgbGVhZGluZyBvbmVzIGZvciBuZWdhdGl2ZQorICAgICAqIHZhbHVlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdGhpc30gd2lsbCBiZSBhdCBsZWFzdAorICAgICAqIHtAY29kZSBiaXRMZW5ndGgoKSArIDF9IGJpdHMgbG9uZy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgd2lsbCBmaXQgaW50byBhbiB7QGNvZGUgaW50fSBpZiB7QGNvZGUgYml0TGVuZ3RoKCkgPCAzMn0gb3IKKyAgICAgKiBpbnRvIGEge0Bjb2RlIGxvbmd9IGlmIHtAY29kZSBiaXRMZW5ndGgoKSA8IDY0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBiaXRzIG9mIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIHRoaXN9Ci0gICAgICogICAgICAgICB3aXRob3V0IHRoZSBzaWduIGJpdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIG1pbmltYWwgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbiBmb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSB0aGlzfSB3aXRob3V0IHRoZSBzaWduIGJpdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGJpdExlbmd0aCgpIHsKICAgICAgLy8gT3B0aW1pemF0aW9uIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGR1cGxpY2F0ZSByZXByZXNlbnRhdGlvbjoKQEAgLTYxOSwxMiArNjU2LDE3IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgd2hldGhlciB0aGUgYml0IGF0IHBvc2l0aW9uIG4gaW4ge0Bjb2RlIHRoaXN9IGlzIHNldC4gVGhlIHJlc3VsdCBpcwogICAgICAqIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIHRoaXMgJiAoMl5uKSAhPSAwfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBOb3RlOjwvYj4gVXNhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgbm90IHJlY29tbWVuZGVkIGFzCisgICAgICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IGVmZmljaWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbgogICAgICAqICAgICAgICAgICAgcG9zaXRpb24gd2hlcmUgdGhlIGJpdCBpbiB7QGNvZGUgdGhpc30gaGFzIHRvIGJlIGluc3BlY3RlZC4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzICYgKDJebikgIT0gMH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbiA8IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbiA8IDB9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHRlc3RCaXQoaW50IG4pIHsKICAgICAgICAgaWYgKG4gPCAwKSB7CkBAIC02NTAsNyArNjkyLDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gKHNpZ24gPCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBkaWdpdCA9IGRpZ2l0c1tpbnRDb3VudF07Ci0gICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgIG4gPSAoMSA8PCAobiAmIDMxKSk7IC8vIGludCB3aXRoIDEgc2V0IHRvIHRoZSBuZWVkZWQgcG9zaXRpb24KICAgICAgICAgICAgIGlmIChzaWduIDwgMCkgewogICAgICAgICAgICAgICAgIGludCBmaXJzdE5vblplcm9EaWdpdCA9IGdldEZpcnN0Tm9uemVyb0RpZ2l0KCk7CkBAIC02NzAsMTkgKzcxMSwxOSBAQAogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdoaWNoIGhhcyB0aGUgc2FtZSBiaW5hcnkgcmVwcmVzZW50YXRpb24KICAgICAgKiBhcyB7QGNvZGUgdGhpc30gYnV0IHdpdGggdGhlIGJpdCBhdCBwb3NpdGlvbiBuIHNldC4gVGhlIHJlc3VsdCBpcwogICAgICAqIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIHRoaXMgfCAyXm59LgorICAgICAqIDxwPgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIE5vdGU6PC9iPiBVc2FnZSBvZiB0aGlzIG1ldGhvZCBpcyBub3QgcmVjb21tZW5kZWQgYXMKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZWZmaWNpZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuCiAgICAgICogICAgICAgICAgICBwb3NpdGlvbiB3aGVyZSB0aGUgYml0IGluIHtAY29kZSB0aGlzfSBoYXMgdG8gYmUgc2V0LgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgfCAyXm59LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG4gPCAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG4gPCAwfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBzZXRCaXQoaW50IG4pIHsKLS8vICAgICAgICB2YWxpZGF0ZTEoInNldEJpdCIsIHRoaXMpOwotLy8gICAgICAgIEJpZ0ludCBhID0gYmlnSW50LmNvcHkoKTsKLS8vICAgICAgICBhLm1vZGlmeUJpdChuLCAxKTsKLS8vICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoYSk7Ci0KICAgICAgICAgZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oInNldEJpdCIpOwogICAgICAgICBpZiggIXRlc3RCaXQoIG4gKSApewogICAgICAgICAgICAgcmV0dXJuIEJpdExldmVsLmZsaXBCaXQodGhpcywgbik7CkBAIC02OTUsMjMgKzczNiwyMyBAQAogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdoaWNoIGhhcyB0aGUgc2FtZSBiaW5hcnkgcmVwcmVzZW50YXRpb24KICAgICAgKiBhcyB7QGNvZGUgdGhpc30gYnV0IHdpdGggdGhlIGJpdCBhdCBwb3NpdGlvbiBuIGNsZWFyZWQuIFRoZSByZXN1bHQgaXMKICAgICAgKiBlcXVpdmFsZW50IHRvIHtAY29kZSB0aGlzICYgfigyXm4pfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBOb3RlOjwvYj4gVXNhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgbm90IHJlY29tbWVuZGVkIGFzCisgICAgICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IGVmZmljaWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbgogICAgICAqICAgICAgICAgICAgcG9zaXRpb24gd2hlcmUgdGhlIGJpdCBpbiB7QGNvZGUgdGhpc30gaGFzIHRvIGJlIGNsZWFyZWQuCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyAmIH4oMl5uKX0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbiA8IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbiA8IDB9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGNsZWFyQml0KGludCBuKSB7Ci0vLyAgICAgICAgdmFsaWRhdGUxKCJjbGVhckJpdCIsIHRoaXMpOwotLy8gICAgICAgIEJpZ0ludCBhID0gYmlnSW50LmNvcHkoKTsKLS8vICAgICAgICBhLm1vZGlmeUJpdChuLCAwKTsKLS8vICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoYSk7Ci0KICAgICAgICAgZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oImNsZWFyQml0Iik7Ci0gICAgICAgIGlmKCB0ZXN0Qml0KCBuICkgKXsKKyAgICAgICAgaWYgKHRlc3RCaXQobikpIHsKICAgICAgICAgICAgIHJldHVybiBCaXRMZXZlbC5mbGlwQml0KHRoaXMsIG4pOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAgICAgfQpAQCAtNzIwLDE5ICs3NjEsMTkgQEAKICAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfSB3aGljaCBoYXMgdGhlIHNhbWUgYmluYXJ5IHJlcHJlc2VudGF0aW9uCiAgICAgICogYXMge0Bjb2RlIHRoaXN9IGJ1dCB3aXRoIHRoZSBiaXQgYXQgcG9zaXRpb24gbiBmbGlwcGVkLiBUaGUgcmVzdWx0IGlzCiAgICAgICogZXF1aXZhbGVudCB0byB7QGNvZGUgdGhpcyBeIDJebn0uCisgICAgICogPHA+CisgICAgICogPGI+SW1wbGVtZW50YXRpb24gTm90ZTo8L2I+IFVzYWdlIG9mIHRoaXMgbWV0aG9kIGlzIG5vdCByZWNvbW1lbmRlZCBhcworICAgICAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBlZmZpY2llbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG4KICAgICAgKiAgICAgICAgICAgIHBvc2l0aW9uIHdoZXJlIHRoZSBiaXQgaW4ge0Bjb2RlIHRoaXN9IGhhcyB0byBiZSBmbGlwcGVkLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgXiAyXm59LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG4gPCAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG4gPCAwfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBmbGlwQml0KGludCBuKSB7Ci0vLyAgICAgICAgdmFsaWRhdGUxKCJmbGlwQml0IiwgdGhpcyk7Ci0vLyAgICAgICAgQmlnSW50IGEgPSBiaWdJbnQuY29weSgpOwotLy8gICAgICAgIGEubW9kaWZ5Qml0KG4sIC0xKTsKLS8vICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoYSk7Ci0KICAgICAgICAgZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oImZsaXBCaXQiKTsKICAgICAgICAgaWYgKG4gPCAwKSB7CiAgICAgICAgICAgICAvLyBtYXRoLjE1PU5lZ2F0aXZlIGJpdCBhZGRyZXNzCkBAIC03NDUsOCArNzg2LDEzIEBACiAgICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxvd2VzdCBzZXQgYml0IGluIHRoZSB0d28ncyBjb21wbGVtZW50CiAgICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgQmlnSW50ZWdlcn0uIElmIGFsbCBiaXRzIGFyZSB6ZXJvICh0aGlzPTApCiAgICAgICogdGhlbiAtMSBpcyByZXR1cm5lZCBhcyByZXN1bHQuCisgICAgICogPHA+CisgICAgICogPGI+SW1wbGVtZW50YXRpb24gTm90ZTo8L2I+IFVzYWdlIG9mIHRoaXMgbWV0aG9kIGlzIG5vdCByZWNvbW1lbmRlZCBhcworICAgICAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBlZmZpY2llbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBwb3NpdGlvbiBvZiBsb3dlc3QgYml0IGlmIHRoaXMgIT0gMCwgLTEgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gcG9zaXRpb24gb2YgbG93ZXN0IGJpdCBpZiB7QGNvZGUgdGhpcyAhPSAwfSwge0Bjb2RlIC0xfSBvdGhlcndpc2UKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExvd2VzdFNldEJpdCgpIHsKICAgICAgICAgZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oImdldExvd2VzdFNldEJpdCIpOwpAQCAtNzU5LDE0ICs4MDUsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBVc2Uge0Bjb2RlIGJpdExlbmd0aCgwKX0gaWYgeW91IHdhbnQgdG8ga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBiaW5hcnkKKyAgICAgKiB2YWx1ZSBpbiBiaXRzLgorICAgICAqIDxwPgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIHRoaXN9Ci0gICAgICogd2ljaCBkaWZmZXIgZnJvbSB0aGUgc2lnbiBiaXQuIElmIHtAY29kZSB0aGlzfSBpcyBwb3NpdGl2ZSB0aGUgcmVzdWx0IGlzCisgICAgICogd2hpY2ggZGlmZmVyIGZyb20gdGhlIHNpZ24gYml0LiBJZiB7QGNvZGUgdGhpc30gaXMgcG9zaXRpdmUgdGhlIHJlc3VsdCBpcwogICAgICAqIGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICoge0Bjb2RlIHRoaXN9LiBJZiB7QGNvZGUgdGhpc30gaXMgbmV0YXRpdmUgdGhlIHJlc3VsdCBpcyBlcXVpdmFsZW50IHRvCi0gICAgICogdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSAtdGhpcy0xfS4KKyAgICAgKiB7QGNvZGUgdGhpc30uIElmIHtAY29kZSB0aGlzfSBpcyBuZWdhdGl2ZSB0aGUgcmVzdWx0IGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICogbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIC10aGlzLTF9LgorICAgICAqIDxwPgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIE5vdGU6PC9iPiBVc2FnZSBvZiB0aGlzIG1ldGhvZCBpcyBub3QgcmVjb21tZW5kZWQgYXMKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZWZmaWNpZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdGhpc30gd2ljaAotICAgICAqICAgICAgICAgZGlmZmVyIGZyb20gdGhlIHNpZ24gYml0LgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgdGhpc30gd2hpY2gKKyAgICAgKiAgICAgICAgIGRpZmZlciBmcm9tIHRoZSBzaWduIGJpdAorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgYml0Q291bnQoKSB7CiAgICAgICAgIGVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJiaXRDb3VudCIpOwpAQCAtNzc0LDEwICs4MjgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfSB3aG9zZSB2YWx1ZSBpcyB7QGNvZGUgfnRoaXN9LiBUaGUKLSAgICAgKiByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gaXMge0Bjb2RlIC10aGlzLTF9LgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB+dGhpc30uIFRoZSByZXN1bHQKKyAgICAgKiBvZiB0aGlzIG9wZXJhdGlvbiBpcyB7QGNvZGUgLXRoaXMtMX0uCisgICAgICogPHA+CisgICAgICogPGI+SW1wbGVtZW50YXRpb24gTm90ZTo8L2I+IFVzYWdlIG9mIHRoaXMgbWV0aG9kIGlzIG5vdCByZWNvbW1lbmRlZCBhcworICAgICAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBlZmZpY2llbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiB7QGNvZGUgfnRoaXN9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIG5vdCgpIHsKICAgICAgICAgdGhpcy5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigibm90Iik7CkBAIC03ODYsMTIgKzg0NSwxNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXMgJiB2YWx9LgorICAgICAqIDxwPgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIE5vdGU6PC9iPiBVc2FnZSBvZiB0aGlzIG1ldGhvZCBpcyBub3QgcmVjb21tZW5kZWQgYXMKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZWZmaWNpZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKICAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFuZCdlZCB3aXRoIHtAY29kZSB0aGlzfS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzICYgdmFsfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdmFsID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsID09IG51bGx9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGFuZChCaWdJbnRlZ2VyIHZhbCkgewogICAgICAgICB0aGlzLmVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJhbmQxIik7CkBAIC04MDEsMTIgKzg2NSwxNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXMgfCB2YWx9LgorICAgICAqIDxwPgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIE5vdGU6PC9iPiBVc2FnZSBvZiB0aGlzIG1ldGhvZCBpcyBub3QgcmVjb21tZW5kZWQgYXMKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZWZmaWNpZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKICAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIG9yJ2VkIHdpdGgge0Bjb2RlIHRoaXN9LgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgfCB2YWx9LgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB2YWwgPT0gbnVsbH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgb3IoQmlnSW50ZWdlciB2YWwpIHsKICAgICAgICAgdGhpcy5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigib3IxIik7CkBAIC04MTYsMTIgKzg4NSwxNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXMgXiB2YWx9LgorICAgICAqIDxwPgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIE5vdGU6PC9iPiBVc2FnZSBvZiB0aGlzIG1ldGhvZCBpcyBub3QgcmVjb21tZW5kZWQgYXMKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZWZmaWNpZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKLSAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIHhvcidlZCB3aXRoIHtAY29kZSB0aGlzfS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIF4gdmFsfS4KKyAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIHhvcidlZCB3aXRoIHtAY29kZSB0aGlzfQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgXiB2YWx9CiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbCA9PSBudWxsfQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHhvcihCaWdJbnRlZ2VyIHZhbCkgewogICAgICAgICB0aGlzLmVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJ4b3IxIik7CkBAIC04MzEsMTQgKzkwNSwxOSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIHRoaXMgJiB+dmFsfS4KLSAgICAgKiBFdmFsdWF0aW5nIHtAY29kZSB4LmFuZE5vdCh2YWwpfSByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdCBhcwotICAgICAqIHtAY29kZSB4LmFuZCh2YWwubm90KCkpfS4KKyAgICAgKiBFdmFsdWF0aW5nIHtAY29kZSB4LmFuZE5vdCh2YWwpfSByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdCBhcyB7QGNvZGUKKyAgICAgKiB4LmFuZCh2YWwubm90KCkpfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBOb3RlOjwvYj4gVXNhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgbm90IHJlY29tbWVuZGVkIGFzCisgICAgICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IGVmZmljaWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCiAgICAgICogICAgICAgICAgICB2YWx1ZSB0byBiZSBub3QnZWQgYW5kIHRoZW4gYW5kJ2VkIHdpdGgge0Bjb2RlIHRoaXN9LgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgJiB+dmFsfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdmFsID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsID09IG51bGx9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGFuZE5vdChCaWdJbnRlZ2VyIHZhbCkgewogICAgICAgICB0aGlzLmVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJhbmROb3QxIik7CkBAIC04NTEsNiArOTMwLDggQEAKICAgICAgKiBiaWcgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYW4gaW50LCB0aGVuIHtAY29kZSB0aGlzfSAlIDJeMzIgaXMgcmV0dXJuZWQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBCaWdJbnRlZ2VyfSBhcyBhbiBpbnQgdmFsdWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBpbnRWYWx1ZSgpIHsKQEAgLTg2OCw2ICs5NDksOCBAQAogICAgICAqIGJpZyB0byBiZSByZXByZXNlbnRlZCBhcyBhbiBsb25nLCB0aGVuIHtAY29kZSB0aGlzfSAlIDJeNjQgaXMgcmV0dXJuZWQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBCaWdJbnRlZ2VyfSBhcyBhIGxvbmcgdmFsdWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewpAQCAtODkyLDYgKzk3NSw4IEBACiAgICAgICogMjQuIEZvciBleGFtcGxlLCAyXjI0KzEgPSAxNjc3NzIxNyBpcyByZXR1cm5lZCBhcyBmbG9hdCAxNjc3NzIxNi4wLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgQmlnSW50ZWdlcn0gYXMgYSBmbG9hdCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewpAQCAtOTAxLDE0ICs5ODYsMTYgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhpcyB7QGNvZGUgQmlnSW50ZWdlcn0gYXMgYW4gZG91YmxlIHZhbHVlLiBJZiB7QGNvZGUgdGhpc30gaXMKLSAgICAgKiB0b28gYmlnIHRvIGJlIHJlcHJlc2VudGVkIGFzIGFuIGRvdWJsZSwgdGhlbgotICAgICAqIHtAY29kZSBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFl9IG9yIHtAY29kZSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFl9IGlzCi0gICAgICogcmV0dXJuZWQuIE5vdGUsIHRoYXQgbm90IGFsbCBpbnRlZ2VycyB4IGluIHRoZSByYW5nZSBbLURvYnVsZS5NQVhfVkFMVUUsCi0gICAgICogRG9idWxlLk1BWF9WQUxVRV0gY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgZG91YmxlLiBUaGUgZG91YmxlCisgICAgICogdG9vIGJpZyB0byBiZSByZXByZXNlbnRlZCBhcyBhbiBkb3VibGUsIHRoZW4ge0Bjb2RlCisgICAgICogRG91YmxlLlBPU0lUSVZFX0lORklOSVRZfSBvciB7QGNvZGUgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZfSBpcworICAgICAqIHJldHVybmVkLiBOb3RlLCB0aGF0IG5vdCBhbGwgaW50ZWdlcnMgeCBpbiB0aGUgcmFuZ2UgWy1Eb3VibGUuTUFYX1ZBTFVFLAorICAgICAqIERvdWJsZS5NQVhfVkFMVUVdIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIGRvdWJsZS4gVGhlIGRvdWJsZQogICAgICAqIHJlcHJlc2VudGF0aW9uIGhhcyBhIG1hbnRpc3NhIG9mIGxlbmd0aCA1My4gRm9yIGV4YW1wbGUsIDJeNTMrMSA9CiAgICAgICogOTAwNzE5OTI1NDc0MDk5MyBpcyByZXR1cm5lZCBhcyBkb3VibGUgOTAwNzE5OTI1NDc0MDk5Mi4wLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgQmlnSW50ZWdlcn0gYXMgYSBkb3VibGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGlzIHtAY29kZSBCaWdJbnRlZ2VyfSBhcyBhIGRvdWJsZSB2YWx1ZQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CkBAIC05MjIsOSArMTAwOSwxMiBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWwKICAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIHRoaXN9LgotICAgICAqIEByZXR1cm4gMSBpZiB0aGlzID4gdmFsLCAtMSBpZiB0aGlzIDwgdmFsLCAwIGlmIHRoaXMgPT0gdmFsLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIDF9IGlmIHtAY29kZSB0aGlzID4gdmFsfSwge0Bjb2RlIC0xfSBpZiB7QGNvZGUgdGhpcyA8IHZhbH0KKyAgICAgKiAgICAgICAgICwge0Bjb2RlIDB9IGlmIHtAY29kZSB0aGlzID09IHZhbH0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbCA9PSBudWxsfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhCaWdJbnRlZ2VyIHZhbCkgewogICAgICAgICB2YWxpZGF0ZTIoImNvbXBhcmVUbyIsIHRoaXMsIHZhbCk7CkBAIC05MzUsMTAgKzEwMjUsMTIgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHRoaXMge0Bjb2RlIEJpZ0ludGVnZXJ9IGFuZCB7QGNvZGUgdmFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICB2YWx1ZSB0byBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIG1pbmltdW0gd2l0aCB0aGlzLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIG1pbih0aGlzLCB2YWx9LgorICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBtaW5pbXVtIHdpdGgge0Bjb2RlIHRoaXN9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIG1pbih0aGlzLCB2YWwpfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdmFsID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsID09IG51bGx9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIG1pbihCaWdJbnRlZ2VyIHZhbCkgewogICAgICAgICByZXR1cm4gKCh0aGlzLmNvbXBhcmVUbyh2YWwpID09IC0xKSA/IHRoaXMgOiB2YWwpOwpAQCAtOTQ4LDEwICsxMDQwLDEyIEBACiAgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0aGlzIHtAY29kZSBCaWdJbnRlZ2VyfSBhbmQge0Bjb2RlIHZhbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbAotICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtIHdpdGggdGhpcy4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSBtYXgodGhpcywgdmFsfS4KKyAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSB3aXRoIHtAY29kZSB0aGlzfQorICAgICAqIEByZXR1cm4ge0Bjb2RlIG1heCh0aGlzLCB2YWwpfQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWwgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB2YWwgPT0gbnVsbH0KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBtYXgoQmlnSW50ZWdlciB2YWwpIHsKICAgICAgICAgcmV0dXJuICgodGhpcy5jb21wYXJlVG8odmFsKSA9PSAxKSA/IHRoaXMgOiB2YWwpOwpAQCAtOTYwLDcgKzEwNTQsOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIHRoaXMge0Bjb2RlIEJpZ0ludGVnZXJ9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gaGFzaCBjb2RlIGZvciB0aGlzLgorICAgICAqIEByZXR1cm4gaGFzaCBjb2RlIGZvciB7QGNvZGUgdGhpc30uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTk4Miw3ICsxMDc4LDEwIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHgKICAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSB0aGlzfS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgeCBpcyBhIEJpZ0ludGVnZXIgYW5kIHRoaXMgPT0geC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYge0Bjb2RlIHh9IGlzIGEgQmlnSW50ZWdlciBhbmQge0Bjb2RlIHRoaXMgPT0geH0sIAorICAgICAqICAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgeCkgewpAQCAtMTAwMCw2ICsxMDk5LDggQEAKICAgICAgKiBmb3JtLgogICAgICAqIAogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIHRoaXN9IGluIGRlY2ltYWwgZm9ybS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMTAwOCwxNSArMTEwOSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzCi0gICAgICoge0Bjb2RlIEJpZ0ludGVnZXJ9IHdpdGggYmFzZSByYWRpeC4gSWYgcmFkaXggPCBDaGFyYWN0ZXIuTUlOX1JBRElYIG9yCi0gICAgICogcmFkaXggPiBDaGFyYWN0ZXIuTUFYX1JBRElYIHRoZW4gYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGlzIHJldHVybmVkLgotICAgICAqIFRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXJlIGdlbmVyYXRlZCB3aXRoIG1ldGhvZAotICAgICAqIHtAY29kZSBDaGFyYWN0ZXIuZm9yRGlnaXR9LgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZQorICAgICAqIEJpZ0ludGVnZXJ9IHdpdGggYmFzZSByYWRpeC4gSWYge0Bjb2RlIHJhZGl4IDwgQ2hhcmFjdGVyLk1JTl9SQURJWH0gb3IKKyAgICAgKiB7QGNvZGUgcmFkaXggPiBDaGFyYWN0ZXIuTUFYX1JBRElYfSB0aGVuIGEgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBpcworICAgICAqIHJldHVybmVkLiBUaGUgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFyZSBnZW5lcmF0ZWQgd2l0aAorICAgICAqIG1ldGhvZCB7QGNvZGUgQ2hhcmFjdGVyLmZvckRpZ2l0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmFkaXgKICAgICAgKiAgICAgICAgICAgIGJhc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgd2l0aCByYWRpeCAxMC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCByYWRpeCkgewogICAgICAgICB2YWxpZGF0ZTEoInRvU3RyaW5nKGludCByYWRpeCkiLCB0aGlzKTsKQEAgLTEwMzIsMTQgKzExMzUsMTYgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdob3NlIHZhbHVlIGlzIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yCi0gICAgICogb2Yge0Bjb2RlIHRoaXN9IGFuZCB7QGNvZGUgdmFsfS4gSWYgdGhpcz09MCBhbmQgdmFsPT0wIHRoZW4gemVybyBpcwotICAgICAqIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBwb3NpdGl2ZS4KKyAgICAgKiBvZiB7QGNvZGUgdGhpc30gYW5kIHtAY29kZSB2YWx9LiBJZiB7QGNvZGUgdGhpcz09MH0gYW5kIHtAY29kZSB2YWw9PTB9CisgICAgICogdGhlbiB6ZXJvIGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBwb3NpdGl2ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsCiAgICAgICogICAgICAgICAgICB2YWx1ZSB3aXRoIHdoaWNoIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBpcyBjb21wdXRlZC4KICAgICAgKiBAcmV0dXJuIHtAY29kZSBnY2QodGhpcywgdmFsKX0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbCA9PSBudWxsfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnY2QoQmlnSW50ZWdlciB2YWwpIHsKICAgICAgICAgdmFsaWRhdGUyKCJnY2QiLCB0aGlzLCB2YWwpOwpAQCAtMTA1Myw3ICsxMTU4LDkgQEAKICAgICAgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIG11bHRpcGxpZWQgd2l0aCB7QGNvZGUgdGhpc30uCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyAqIHZhbH0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHZhbCA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbCA9PSBudWxsfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBtdWx0aXBseShCaWdJbnRlZ2VyIHZhbCkgewogICAgICAgICB2YWxpZGF0ZTIoIm11bHRpcGx5IiwgdGhpcywgdmFsKTsKQEAgLTEwNjcsNyArMTE3NCw5IEBACiAgICAgICogICAgICAgICAgICBleHBvbmVudCB0byB3aGljaCB7QGNvZGUgdGhpc30gaXMgcmFpc2VkLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXMgXiBleHB9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGV4cCA8IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZXhwIDwgMH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgcG93KGludCBleHApIHsKICAgICAgICAgaWYgKGV4cCA8IDApIHsKQEAgLTEwODYsMTEgKzExOTUsMTMgQEAKICAgICAgKiAgICAgICAgICAgIHZhbHVlIGJ5IHdoaWNoIHtAY29kZSB0aGlzfSBpcyBkaXZpZGVkLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIFt0aGlzIC8gZGl2aXNvciwgdGhpcyAlIGRpdmlzb3JdfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZGl2aXNvciA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRpdmlzb3IgPT0gbnVsbH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZGl2aXNvciA9PSAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGRpdmlzb3IgPT0gMH0uCiAgICAgICogQHNlZSAjZGl2aWRlCiAgICAgICogQHNlZSAjcmVtYWluZGVyCisgICAgICoKK0BzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyW10gZGl2aWRlQW5kUmVtYWluZGVyKEJpZ0ludGVnZXIgZGl2aXNvcikgewogICAgICAgICB2YWxpZGF0ZTIoImRpdmlkZUFuZFJlbWFpbmRlciIsIHRoaXMsIGRpdmlzb3IpOwpAQCAtMTExMiw5ICsxMjIzLDExIEBACiAgICAgICogICAgICAgICAgICB2YWx1ZSBieSB3aGljaCB7QGNvZGUgdGhpc30gaXMgZGl2aWRlZC4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzIC8gZGl2aXNvcn0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGRpdmlzb3IgPT0gMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkaXZpc29yID09IDB9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGRpdmlkZShCaWdJbnRlZ2VyIGRpdmlzb3IpIHsKICAgICAgICAgdmFsaWRhdGUyKCJkaXZpZGUiLCB0aGlzLCBkaXZpc29yKTsKQEAgLTExMzIsOSArMTI0NSwxMSBAQAogICAgICAqICAgICAgICAgICAgdmFsdWUgYnkgd2hpY2gge0Bjb2RlIHRoaXN9IGlzIGRpdmlkZWQuCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyAlIGRpdmlzb3J9LgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSBudWxsfS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkaXZpc29yID09IDAKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGl2aXNvciA9PSAwfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciByZW1haW5kZXIoQmlnSW50ZWdlciBkaXZpc29yKSB7CiAgICAgICAgIHZhbGlkYXRlMigicmVtYWluZGVyIiwgdGhpcywgZGl2aXNvcik7CkBAIC0xMTQ0LDE4ICsxMjU5LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQmlnSW50ZWdlcn0gd2hvc2UgdmFsdWUgaXMge0Bjb2RlIDEvdGhpcyBtb2QgbX0uCi0gICAgICogVGhlIG1vZHVsdXMge0Bjb2RlIG19IG11c3QgYmUgcG9zaXRpdmUuIFRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBpbgotICAgICAqIHRoZSBpbnRlcnZhbCB7QGNvZGUgWzAsIG0pfSAoMCBpbmNsdXNpdmUsIG0gZXhjbHVzaXZlKS4gSWYge0Bjb2RlIHRoaXN9Ci0gICAgICogaXMgbm90IHJlbGF0aXZlbHkgcHJpbWUgdG8gbSwgdGhlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdob3NlIHZhbHVlIGlzIHtAY29kZSAxL3RoaXMgbW9kIG19LiBUaGUKKyAgICAgKiBtb2R1bHVzIHtAY29kZSBtfSBtdXN0IGJlIHBvc2l0aXZlLiBUaGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gdGhlCisgICAgICogaW50ZXJ2YWwge0Bjb2RlIFswLCBtKX0gKDAgaW5jbHVzaXZlLCBtIGV4Y2x1c2l2ZSkuIElmIHtAY29kZSB0aGlzfSBpcworICAgICAqIG5vdCByZWxhdGl2ZWx5IHByaW1lIHRvIG0sIHRoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbQogICAgICAqICAgICAgICAgICAgdGhlIG1vZHVsdXMuCi0gICAgICogQHJldHVybiB7QGNvZGUgdGhpcyBtb2QgbX0uCisgICAgICogQHJldHVybiB7QGNvZGUgMS90aGlzIG1vZCBtfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbSA9PSBudWxsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG0gPT0gbnVsbH0KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBtIDwgMCBvciBpZiB0aGlzIGlzIG5vdCByZWxhdGl2ZWx5IHByaW1lIHRvIG0KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbSA8IDAgb3J9IGlmIHtAY29kZSB0aGlzfSBpcyBub3QgcmVsYXRpdmVseSBwcmltZQorICAgICAqICAgICAgICAgICAgIHRvIHtAY29kZSBtfQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIG1vZEludmVyc2UoQmlnSW50ZWdlciBtKSB7CiAgICAgICAgIGlmIChtLnNpZ251bSgpIDw9IDApIHsKQEAgLTExNjcsMTMgKzEyODUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfSB3aG9zZSB2YWx1ZSBpcwotICAgICAqIHtAY29kZSB0aGlzXmV4cG9uZW50IG1vZCBtfS4gVGhlIG1vZHVsdXMge0Bjb2RlIG19IG11c3QgYmUgcG9zaXRpdmUuIFRoZQotICAgICAqIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGluIHRoZSBpbnRlcnZhbCB7QGNvZGUgWzAsIG0pfSAoMCBpbmNsdXNpdmUsIG0KLSAgICAgKiBleGNsdXNpdmUpLiBJZiB0aGUgZXhwb25lbnQgaXMgbmVnYXRpdmUsIHRoZW4KLSAgICAgKiB7QGNvZGUgdGhpcy5tb2RJbnZlcnNlKG0pXigtZXhwb25lbnQpIG1vZCBtKX0gaXMgY29tcHV0ZWQuIFRoZSBpbnZlcnNlIG9mCi0gICAgICogdGhpcyBvbmx5IGV4aXN0cyBpZiB7QGNvZGUgdGhpc30gaXMgcmVsYXRpdmVseSBwcmltZSB0byBtLCBvdGhlcndpc2UgYW4KLSAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IHdob3NlIHZhbHVlIGlzIHtAY29kZSB0aGlzXmV4cG9uZW50IG1vZAorICAgICAqIG19LiBUaGUgbW9kdWx1cyB7QGNvZGUgbX0gbXVzdCBiZSBwb3NpdGl2ZS4gVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvCisgICAgICogYmUgaW4gdGhlIGludGVydmFsIHtAY29kZSBbMCwgbSl9ICgwIGluY2x1c2l2ZSwgbSBleGNsdXNpdmUpLiBJZiB0aGUKKyAgICAgKiBleHBvbmVudCBpcyBuZWdhdGl2ZSwgdGhlbiB7QGNvZGUgdGhpcy5tb2RJbnZlcnNlKG0pXigtZXhwb25lbnQpIG1vZCBtKX0KKyAgICAgKiBpcyBjb21wdXRlZC4gVGhlIGludmVyc2Ugb2YgdGhpcyBvbmx5IGV4aXN0cyBpZiB7QGNvZGUgdGhpc30gaXMKKyAgICAgKiByZWxhdGl2ZWx5IHByaW1lIHRvIG0sIG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSBleHBvbmVudAogICAgICAqICAgICAgICAgICAgdGhlIGV4cG9uZW50LgpAQCAtMTE4MSwxMCArMTI5OCwxMiBAQAogICAgICAqICAgICAgICAgICAgdGhlIG1vZHVsdXMuCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpc15leHBvbmVudCBtb2QgdmFsfS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbSA9PSBudWxsIG9yIGV4cG9uZW50ID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbSA9PSBudWxsfSBvciB7QGNvZGUgZXhwb25lbnQgPT0gbnVsbH0uCiAgICAgICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbSA8IDAgb3IgaWYgZXhwb25lbnQ8MCBhbmQgdGhpcyBpcyBub3QgcmVsYXRpdmVseSBwcmltZQotICAgICAqICAgICAgICAgICAgIHRvIG0KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbSA8IDB9IG9yIGlmIHtAY29kZSBleHBvbmVudDwwfSBhbmQgdGhpcyBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICByZWxhdGl2ZWx5IHByaW1lIHRvIHtAY29kZSBtfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBtb2RQb3coQmlnSW50ZWdlciBleHBvbmVudCwgQmlnSW50ZWdlciBtKSB7CiAgICAgICAgIGlmIChtLnNpZ251bSgpIDw9IDApIHsKQEAgLTEyMTMsOSArMTMzMiwxMSBAQAogICAgICAqICAgICAgICAgICAgdGhlIG1vZHVsdXMuCiAgICAgICogQHJldHVybiB7QGNvZGUgdGhpcyBtb2QgbX0uCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG0gPT0gbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBtID09IG51bGx9LgogICAgICAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIG0gPCAwCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG0gPCAwfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBtb2QoQmlnSW50ZWdlciBtKSB7CiAgICAgICAgIGlmIChtLnNpZ251bSgpIDw9IDApIHsKQEAgLTEyMzAsMTMgKzEzNTEsMTUgQEAKICAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMge0Bjb2RlIEJpZ0ludGVnZXJ9IGlzIHByb2JhYmx5IHByaW1lLiBJZiB7QGNvZGUgdHJ1ZX0KICAgICAgKiBpcyByZXR1cm5lZCwgdGhlbiB0aGlzIGlzIHByaW1lIHdpdGggYSBwcm9iYWJpbGl0eSBiZXlvbmQKICAgICAgKiAoMS0xLzJeY2VydGFpbnR5KS4gSWYge0Bjb2RlIGZhbHNlfSBpcyByZXR1cm5lZCwgdGhlbiB0aGlzIGlzIGRlZmluaXRlbHkKLSAgICAgKiBjb21wb3NpdGUuIElmIHRoZSBhcmd1bWVudCB7QGNvZGUgY2VydGFpbnR5fSAmbGVxOyAwLCB0aGVuIHRoaXMgbWV0aG9kCisgICAgICogY29tcG9zaXRlLiBJZiB0aGUgYXJndW1lbnQge0Bjb2RlIGNlcnRhaW50eX0gPD0gMCwgdGhlbiB0aGlzIG1ldGhvZAogICAgICAqIHJldHVybnMgdHJ1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2VydGFpbnR5CiAgICAgICogICAgICAgICAgICB0b2xlcmF0ZWQgcHJpbWFsaXR5IHVuY2VydGFpbnR5LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHR1cmV9LCBpZiB7QGNvZGUgdGhpc30gaXMgcHJvYmFibHkgcHJpbWUsIGZhbHNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0sIGlmIHtAY29kZSB0aGlzfSBpcyBwcm9iYWJseSBwcmltZSwge0Bjb2RlIGZhbHNlfQogICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUHJvYmFibGVQcmltZShpbnQgY2VydGFpbnR5KSB7CiAgICAgICAgIHZhbGlkYXRlMSgiaXNQcm9iYWJsZVByaW1lIiwgdGhpcyk7CkBAIC0xMjQ1LDEyICsxMzY4LDE0IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHggPiB7QGNvZGUgdGhpc30gd2hpY2ggaXMgcHJvYmFibHkgcHJpbWUgYXMKLSAgICAgKiBhIHtAY29kZSBCaWdJbnRlZ2VyfSBpbnN0YW5jZS4gVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHJldHVybmVkCi0gICAgICoge0Bjb2RlIEJpZ0ludGVnZXJ9IGlzIHByaW1lIGlzIGJleW9uZCAoMS0xLzJeMTAwKS4KKyAgICAgKiBhIHtAY29kZSBCaWdJbnRlZ2VyfSBpbnN0YW5jZS4gVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHJldHVybmVkIHtAY29kZQorICAgICAqIEJpZ0ludGVnZXJ9IGlzIHByaW1lIGlzIGJleW9uZCAoMS0xLzJeODApLgogICAgICAqIAotICAgICAqIEByZXR1cm4gc21hbGxlc3QgaW50ZWdlciA+IHtAY29kZSB0aGlzfSBwd2hpY2ggaXMgcm9iYWJseSBwcmltZS4KKyAgICAgKiBAcmV0dXJuIHNtYWxsZXN0IGludGVnZXIgPiB7QGNvZGUgdGhpc30gd2hpY2ggaXMgcm9iYWJseSBwcmltZS4KICAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIDwgMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0aGlzIDwgMH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgbmV4dFByb2JhYmxlUHJpbWUoKSB7CiAgICAgICAgIGlmIChzaWduIDwgMCkgewpAQCAtMTI2MywzMSArMTM4OCwzMiBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSByYW5kb20gcG9zaXRpdmUge0Bjb2RlIEJpZ0ludGVnZXJ9IGluc3RhbmNlIGluIHRoZSByYW5nZSBbMCwKICAgICAgKiAyXihiaXRMZW5ndGgpLTFdIHdoaWNoIGlzIHByb2JhYmx5IHByaW1lLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUKLSAgICAgKiByZXR1cm5lZCB7QGNvZGUgQmlnSW50ZWdlcn0gaXMgcHJpbWUgaXMgYmV5b25kICgxLTEvMl4xMDApLgorICAgICAqIHJldHVybmVkIHtAY29kZSBCaWdJbnRlZ2VyfSBpcyBwcmltZSBpcyBiZXlvbmQgKDEtMS8yXjgwKS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBOb3RlOjwvYj4gQ3VycmVudGx5IHtAY29kZSBybmR9IGlzIGlnbm9yZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJpdExlbmd0aAotICAgICAqICAgICAgICAgICAgbGVuZ2h0IG9mIHRoZSBuZXcge0Bjb2RlIEJpZ0ludGVnZXJ9IGluIGJpdHMKKyAgICAgKiAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfSBpbiBiaXRzLgogICAgICAqIEBwYXJhbSBybmQKICAgICAgKiAgICAgICAgICAgIHJhbmRvbSBnZW5lcmF0b3IgdXNlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IHtAY29kZSBCaWdJbnRlZ2VyfS4KLSAgICAgKiBAcmV0dXJuIHByb2JhYmx5IHByaW1lIHJhbmRvbSB7QGNvZGUgQmlnSW50ZWdlcn0gaW5zdGFuY2UKKyAgICAgKiBAcmV0dXJuIHByb2JhYmx5IHByaW1lIHJhbmRvbSB7QGNvZGUgQmlnSW50ZWdlcn0gaW5zdGFuY2UuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBiaXRMZW5ndGggPCAyCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGJpdExlbmd0aCA8IDJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBwcm9iYWJsZVByaW1lKGludCBiaXRMZW5ndGgsIFJhbmRvbSBybmQpIHsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByb2JhYmxlUHJpbWUiKTsKICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGJpdExlbmd0aCwgMTAwLCBybmQpOwogICAgIH0KIAogCi0KLQogICAgIC8qIFByaXZhdGUgTWV0aG9kcyAqLwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEJpZ0ludGVnZXIgaW4gYSBieXRlCiAgICAgICogYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0d28ncyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSB0aGlzfS4KKyAgICAgKiBAcmV0dXJuIHR3bydzIGNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIHRoaXN9CiAgICAgICovCiAgICAgcHJpdmF0ZSBieXRlW10gdHdvc0NvbXBsZW1lbnQoKSB7CiAgICAgICAgIGVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJ0d29zQ29tcGxlbWVudCgpIik7CkBAIC0xNDcwLDcgKzE1OTYsNyBAQAogICAgIC8qCiAgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UgdG8gYWNoaWV2ZSBpbW11dGFiaWxpdHkKICAgICAgKi8KLS8vIG1jOiBPbmx5IHVzZWQgYnkgUHJpbWFsaXR5Lm5leHRQcm9iYWJsZVByaW1lKCkKKy8vIE9ubHkgdXNlZCBieSBQcmltYWxpdHkubmV4dFByb2JhYmxlUHJpbWUoKQogICAgIEJpZ0ludGVnZXIgY29weSgpIHsKICAgICAgICAgZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oImNvcHkoKSIpOwogICAgICAgICBpbnRbXSBjb3B5RGlnaXRzID0gbmV3IGludFtudW1iZXJMZW5ndGhdOwpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9CaXRMZXZlbC5qYXZhIGIvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9CaXRMZXZlbC5qYXZhCmluZGV4IDFiYTAxOWUuLmFiNGY5Y2MgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvQml0TGV2ZWwuamF2YQorKysgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0JpdExldmVsLmphdmEKQEAgLTEsMjAgKzEsNCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCiAgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCiAgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgpAQCAtMzEsMTIgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKgotICogU2luY2UgdGhlIG9yaWdpbmFsIEhhcm1vbnkgQ29kZSBvZiB0aGUgQmlnSW50ZWdlciBjbGFzcyB3YXMgc3Ryb25nbHkgbW9kaWZpZWQsCi0gKiBpbiBvcmRlciB0byB1c2UgdGhlIG1vcmUgZWZmaWNpZW50IE9wZW5TU0wgQklHTlVNIGltcGxlbWVudGF0aW9uLAotICogbm8gYW5kcm9pZC1tb2RpZmljYXRpb24tdGFncyB3ZXJlIHBsYWNlZCwgYXQgYWxsLgotICovCi0KIHBhY2thZ2UgamF2YS5tYXRoOwogCiAvKioKQEAgLTY1LDcgKzQzLDkgQEAKIAogICAgIC8qKiBAc2VlIEJpZ0ludGVnZXIjYml0TGVuZ3RoKCkgKi8KICAgICBzdGF0aWMgaW50IGJpdExlbmd0aChCaWdJbnRlZ2VyIHZhbCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIHZhbC5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigiQml0TGV2ZWwuYml0TGVuZ3RoIik7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGlmICh2YWwuc2lnbiA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtODYsNyArNjYsOSBAQAogCiAgICAgLyoqIEBzZWUgQmlnSW50ZWdlciNiaXRDb3VudCgpICovCiAgICAgc3RhdGljIGludCBiaXRDb3VudChCaWdJbnRlZ2VyIHZhbCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIHZhbC5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigiQml0TGV2ZWwuYml0Q291bnQiKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgaW50IGJDb3VudCA9IDA7CiAKICAgICAgICAgaWYgKHZhbC5zaWduID09IDApIHsKQEAgLTExNSw3ICs5Nyw5IEBACiAgICAgICogbXVzdCBiZSBpbiB0aGUgcmFuZ2Uge0Bjb2RlIFswLCB2YWwuYml0TGVuZ3RoKCktMV19CiAgICAgICovCiAgICAgc3RhdGljIGJvb2xlYW4gdGVzdEJpdChCaWdJbnRlZ2VyIHZhbCwgaW50IG4pIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICB2YWwuZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oIkJpdExldmVsLnRlc3RCaXQiKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgLy8gUFJFOiAwIDw9IG4gPCB2YWwuYml0TGVuZ3RoKCkKICAgICAgICAgcmV0dXJuICgodmFsLmRpZ2l0c1tuID4+IDVdICYgKDEgPDwgKG4gJiAzMSkpKSAhPSAwKTsKICAgICB9CkBAIC0xMzcsMTAgKzEyMSw3MCBAQAogICAgICAgICByZXR1cm4gKChpICE9IGludENvdW50KSB8fCAoZGlnaXRzW2ldIDw8ICgzMiAtIGJpdENvdW50KSAhPSAwKSk7CiAgICAgfQogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgLy8gIC8qKiBAc2VlIEJpZ0ludGVnZXIjc2hpZnRMZWZ0KGludCkgKi8KKyAgICAvLyAgc3RhdGljIEJpZ0ludGVnZXIgc2hpZnRMZWZ0KEJpZ0ludGVnZXIgc291cmNlLCBpbnQgY291bnQpIHsKKyAgICAvLyAgICAgIGludCBpbnRDb3VudCA9IGNvdW50ID4+IDU7CisgICAgLy8gICAgICBjb3VudCAmPSAzMTsgLy8gJT0gMzIKKyAgICAvLyAgICAgIGludCByZXNMZW5ndGggPSBzb3VyY2UubnVtYmVyTGVuZ3RoICsgaW50Q291bnQKKyAgICAvLyAgICAgICAgICAgICAgKyAoICggY291bnQgPT0gMCApID8gMCA6IDEgKTsKKyAgICAvLyAgICAgIGludCByZXNEaWdpdHNbXSA9IG5ldyBpbnRbcmVzTGVuZ3RoXTsKKyAgICAvLyAKKyAgICAvLyAgICAgIHNoaWZ0TGVmdChyZXNEaWdpdHMsIHNvdXJjZS5kaWdpdHMsIGludENvdW50LCBjb3VudCk7CisgICAgLy8gICAgICAgICBCaWdJbnRlZ2VyIHJlc3VsdCA9IG5ldyBCaWdJbnRlZ2VyKHNvdXJjZS5zaWduLCByZXNMZW5ndGgsIHJlc0RpZ2l0cyk7CisgICAgLy8gICAgICAgICByZXN1bHQuY3V0T2ZmTGVhZGluZ1plcm9lcygpOworICAgIC8vICAgICByZXR1cm4gcmVzdWx0OworICAgIC8vIH0KKyAgICAvLyAKKyAgICAvLyAvKioKKyAgICAvLyAgKiBQZXJmb3JtcyB7QGNvZGUgdmFsIDw8PSBjb3VudH0uCisgICAgLy8gICovCisgICAgLy8gLy8gdmFsIHNob3VsZCBoYXZlIGVub3VnaCBwbGFjZSAoYW5kIG9uZSBkaWdpdCBtb3JlKQorICAgIC8vIHN0YXRpYyB2b2lkIGlucGxhY2VTaGlmdExlZnQoQmlnSW50ZWdlciB2YWwsIGludCBjb3VudCkgeworICAgIC8vICAgICBpbnQgaW50Q291bnQgPSBjb3VudCA+PiA1OyAvLyBjb3VudCBvZiBpbnRlZ2VycworICAgIC8vICAgICB2YWwubnVtYmVyTGVuZ3RoICs9IGludENvdW50CisgICAgLy8gICAgICAgICAgICAgKyAoIEludGVnZXIKKyAgICAvLyAgICAgICAgICAgICAubnVtYmVyT2ZMZWFkaW5nWmVyb3ModmFsLmRpZ2l0c1t2YWwubnVtYmVyTGVuZ3RoIC0gMV0pCisgICAgLy8gICAgICAgICAgICAgLSAoIGNvdW50ICYgMzEgKSA+PSAwID8gMCA6IDEgKTsKKyAgICAvLyAgICAgc2hpZnRMZWZ0KHZhbC5kaWdpdHMsIHZhbC5kaWdpdHMsIGludENvdW50LCBjb3VudCAmIDMxKTsKKyAgICAvLyAgICAgdmFsLmN1dE9mZkxlYWRpbmdaZXJvZXMoKTsKKyAgICAvLyAgICAgdmFsLnVuQ2FjaGUoKTsKKyAgICAvLyB9CisgICAgLy8gCisgICAgLy8gLyoqCisgICAgLy8gICogQWJzdHJhY3RseSBzaGlmdHMgbGVmdCBhbiBhcnJheSBvZiBpbnRlZ2VycyBpbiBsaXR0bGUgZW5kaWFuIChpLmUuIHNoaWZ0CisgICAgLy8gICogaXQgcmlnaHQpLiBUb3RhbCBzaGlmdCBkaXN0YW5jZSBpbiBiaXRzIGlzIGludENvdW50ICogMzIgKyBjb3VudAorICAgIC8vICAqIAorICAgIC8vICAqIEBwYXJhbSByZXN1bHQgdGhlIGRlc3RpbmF0aW9uIGFycmF5CisgICAgLy8gICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGFycmF5CisgICAgLy8gICogQHBhcmFtIGludENvdW50IHRoZSBzaGlmdCBkaXN0YW5jZSBpbiBpbnRlZ2VycworICAgIC8vICAqIEBwYXJhbSBjb3VudCBhbiBhZGRpdGlvbmFsIHNoaWZ0IGRpc3RhbmNlIGluIGJpdHMKKyAgICAvLyAgKi8KKyAgICAvLyBzdGF0aWMgdm9pZCBzaGlmdExlZnQoaW50IHJlc3VsdFtdLCBpbnQgc291cmNlW10sIGludCBpbnRDb3VudCwgaW50IGNvdW50KSB7CisgICAgLy8gICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgLy8gICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgMCwgcmVzdWx0LCBpbnRDb3VudCwgcmVzdWx0Lmxlbmd0aAorICAgIC8vICAgICAgICAgICAgICAgICAtIGludENvdW50KTsKKyAgICAvLyAgICAgfSBlbHNlIHsKKyAgICAvLyAgICAgICAgIGludCByaWdodFNoaWZ0Q291bnQgPSAzMiAtIGNvdW50OworICAgIC8vIAorICAgIC8vICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IDA7CisgICAgLy8gICAgICAgICBmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aCAtIDE7IGkgPiBpbnRDb3VudDsgaS0tKSB7CisgICAgLy8gICAgICAgICAgICAgcmVzdWx0W2ldIHw9IHNvdXJjZVtpIC0gaW50Q291bnQgLSAxXSA+Pj4gcmlnaHRTaGlmdENvdW50OworICAgIC8vICAgICAgICAgICAgIHJlc3VsdFtpIC0gMV0gPSBzb3VyY2VbaSAtIGludENvdW50IC0gMV0gPDwgY291bnQ7CisgICAgLy8gICAgICAgICB9CisgICAgLy8gICAgIH0KKyAgICAvLyAgICAgCisgICAgLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50Q291bnQ7IGkrKykgeworICAgIC8vICAgICAgICAgcmVzdWx0W2ldID0gMDsKKyAgICAvLyAgICAgfQorICAgIC8vIH0KKyAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAKICAgICAvKiogQHNlZSBCaWdJbnRlZ2VyI3NoaWZ0UmlnaHQoaW50KSAqLwogICAgIHN0YXRpYyBCaWdJbnRlZ2VyIHNoaWZ0UmlnaHQoQmlnSW50ZWdlciBzb3VyY2UsIGludCBjb3VudCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIHNvdXJjZS5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigiQml0TGV2ZWwuc2hpZnRSaWdodCIpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICBpbnQgaW50Q291bnQgPSBjb3VudCA+PiA1OyAvLyBjb3VudCBvZiBpbnRlZ2VycwogICAgICAgICBjb3VudCAmPSAzMTsgLy8gY291bnQgb2YgcmVtYWluaW5nIGJpdHMKICAgICAgICAgaWYgKGludENvdW50ID49IHNvdXJjZS5udW1iZXJMZW5ndGgpIHsKQEAgLTE3OCw3ICsyMjIsOSBAQAogICAgICAqIFBlcmZvcm1zIHtAY29kZSB2YWwgPj49IGNvdW50fSB3aGVyZSB7QGNvZGUgdmFsfSBpcyBhIHBvc2l0aXZlIG51bWJlci4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBpbnBsYWNlU2hpZnRSaWdodChCaWdJbnRlZ2VyIHZhbCwgaW50IGNvdW50KSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgdmFsLmVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJCaXRMZXZlbC5pbnBsYWNlU2hpZnRSaWdodCIpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICBpbnQgc2lnbiA9IHZhbC5zaWdudW0oKTsKICAgICAgICAgaWYgKGNvdW50ID09IDAgfHwgdmFsLnNpZ251bSgpID09IDApCiAgICAgICAgICAgICByZXR1cm47CkBAIC0yNDksNyArMjk1LDkgQEAKICAgICAgKiBAcGFyYW0gYml0TnVtYmVyOiB0aGUgYml0J3MgcG9zaXRpb24gaW4gdGhlIGludENvdW50IGVsZW1lbnQKICAgICAgKi8KICAgICBzdGF0aWMgQmlnSW50ZWdlciBmbGlwQml0KEJpZ0ludGVnZXIgdmFsLCBpbnQgbil7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgdmFsLmVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJCaXRMZXZlbC5mbGlwQml0Iik7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGludCByZXNTaWduID0gKHZhbC5zaWduID09IDApID8gMSA6IHZhbC5zaWduOwogICAgICAgICBpbnQgaW50Q291bnQgPSBuID4+IDU7CiAgICAgICAgIGludCBiaXROID0gbiAmIDMxOwpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9Db252ZXJzaW9uLmphdmEgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0NvbnZlcnNpb24uamF2YQppbmRleCA5NDVhZjhmLi42NWZjODk2IDEwMDY0NAotLS0gYS9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0NvbnZlcnNpb24uamF2YQorKysgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0NvbnZlcnNpb24uamF2YQpAQCAtMSwyMCArMSw0IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKICAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKICAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCkBAIC03MCw3ICs1NCw5IEBACiAgICAgCiAgICAgLyoqIEBzZWUgQmlnSW50ZWdlciN0b1N0cmluZyhpbnQpICovCiAgICAgc3RhdGljIFN0cmluZyBiaWdJbnRlZ2VyMlN0cmluZyhCaWdJbnRlZ2VyIHZhbCwgaW50IHJhZGl4KSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgdmFsLmVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJDb252ZXJzaW9uLmJpZ0ludGVnZXIyU3RyaW5nIik7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGludCBzaWduID0gdmFsLnNpZ247CiAgICAgICAgIGludCBudW1iZXJMZW5ndGggPSB2YWwubnVtYmVyTGVuZ3RoOwogICAgICAgICBpbnQgZGlnaXRzW10gPSB2YWwuZGlnaXRzOwpAQCAtMTU0LDcgKzE0MCw5IEBACiAgICAgICogQHNlZSBCaWdEZWNpbWFsI3RvU3RyaW5nKCkKICAgICAgKi8KICAgICBzdGF0aWMgU3RyaW5nIHRvRGVjaW1hbFNjYWxlZFN0cmluZyhCaWdJbnRlZ2VyIHZhbCwgaW50IHNjYWxlKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgdmFsLmVzdGFibGlzaE9sZFJlcHJlc2VudGF0aW9uKCJDb252ZXJzaW9uLnRvRGVjaW1hbFNjYWxlZFN0cmluZyIpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICBpbnQgc2lnbiA9IHZhbC5zaWduOwogICAgICAgICBpbnQgbnVtYmVyTGVuZ3RoID0gdmFsLm51bWJlckxlbmd0aDsKICAgICAgICAgaW50IGRpZ2l0c1tdID0gdmFsLmRpZ2l0czsKQEAgLTQzNSw3ICs0MjMsOSBAQAogCiAgICAgLyoqIEBzZWUgQmlnSW50ZWdlciNkb3VibGVWYWx1ZSgpICovCiAgICAgc3RhdGljIGRvdWJsZSBiaWdJbnRlZ2VyMkRvdWJsZShCaWdJbnRlZ2VyIHZhbCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIHZhbC5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigiQ29udmVyc2lvbi5iaWdJbnRlZ2VyMkRvdWJsZSIpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICAvLyB2YWwuYml0TGVuZ3RoKCkgPCA2NAogICAgICAgICBpZiAoKHZhbC5udW1iZXJMZW5ndGggPCAyKQogICAgICAgICAgICAgICAgIHx8ICgodmFsLm51bWJlckxlbmd0aCA9PSAyKSAmJiAodmFsLmRpZ2l0c1sxXSA+IDApKSkgewpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9EaXZpc2lvbi5qYXZhIGIvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9EaXZpc2lvbi5qYXZhCmluZGV4IDM2YzdjNzkuLjM1ZTM2NTAgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvRGl2aXNpb24uamF2YQorKysgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL0RpdmlzaW9uLmphdmEKQEAgLTEsMjAgKzEsNCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCiAgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCiAgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgpAQCAtMzEsMTQgKzE1LDExIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoKLSAqIFNpbmNlIHRoZSBvcmlnaW5hbCBIYXJtb255IENvZGUgb2YgdGhlIEJpZ0ludGVnZXIgY2xhc3Mgd2FzIHN0cm9uZ2x5IG1vZGlmaWVkLAotICogaW4gb3JkZXIgdG8gdXNlIHRoZSBtb3JlIGVmZmljaWVudCBPcGVuU1NMIEJJR05VTSBpbXBsZW1lbnRhdGlvbiwKLSAqIG5vIGFuZHJvaWQtbW9kaWZpY2F0aW9uLXRhZ3Mgd2VyZSBwbGFjZWQsIGF0IGFsbC4KLSAqLwotCiBwYWNrYWdlIGphdmEubWF0aDsKIAorLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisvLyBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1hdGguaW50ZXJuYWwubmxzLk1lc3NhZ2VzOworLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogCiAvKioKICAqIFN0YXRpYyBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgYWxsIG9wZXJhdGlvbnMgcmVsYXRlZCB3aXRoIGRpdmlzaW9uIGFuZCBtb2R1bGFyCkBAIC02Niw2ICs0NywxMSBAQAogICovCiBjbGFzcyBEaXZpc2lvbiB7CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBUaGUgZGl2aWRlIG1ldGhvZCBoYXMgYmVlbiBkcm9wcGVkIHNpbmNlIHRoaXMgZnVuY3Rpb25hbGl0eQorICAgIC8vIGlzIG5vdyBhdmFpbGFibGUgZnJvbSBPcGVuU1NMIEJJR05VTS4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCisKICAgICAvKioKICAgICAgKiBEaXZpZGVzIGFuIGFycmF5IGJ5IGFuIGludGVnZXIgdmFsdWUuIEltcGxlbWVudHMgdGhlIEtudXRoJ3MgZGl2aXNpb24KICAgICAgKiBhbGdvcml0aG0uIFNlZSBELiBLbnV0aCwgVGhlIEFydCBvZiBDb21wdXRlciBQcm9ncmFtbWluZywgdm9sLiAyLgpAQCAtMTUwLDcgKzEzNiw5IEBACiAgICAgICogQHJldHVybiBkaXZpZGUgJSBkaXZpc29yCiAgICAgICovCiAgICAgc3RhdGljIGludCByZW1haW5kZXIoQmlnSW50ZWdlciBkaXZpZGVuZCwgaW50IGRpdmlzb3IpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICBkaXZpZGVuZC5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigiRGl2aXNpb24ucmVtYWluZGVyIik7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIHJldHVybiByZW1haW5kZXJBcnJheUJ5SW50KGRpdmlkZW5kLmRpZ2l0cywgZGl2aWRlbmQubnVtYmVyTGVuZ3RoLAogICAgICAgICAgICAgICAgIGRpdmlzb3IpOwogICAgIH0KQEAgLTIwOCw3ICsxOTYsOSBAQAogICAgICAqLwogICAgIHN0YXRpYyBCaWdJbnRlZ2VyW10gZGl2aWRlQW5kUmVtYWluZGVyQnlJbnRlZ2VyKEJpZ0ludGVnZXIgdmFsLAogICAgICAgICAgICAgaW50IGRpdmlzb3IsIGludCBkaXZpc29yU2lnbikgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIHZhbC5lc3RhYmxpc2hPbGRSZXByZXNlbnRhdGlvbigiRGl2aXNpb24uZGl2aWRlQW5kUmVtYWluZGVyQnlJbnRlZ2VyIik7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIC8vIHJlc1swXSBpcyBhIHF1b3RpZW50IGFuZCByZXNbMV0gaXMgYSByZW1haW5kZXI6CiAgICAgICAgIGludFtdIHZhbERpZ2l0cyA9IHZhbC5kaWdpdHM7CiAgICAgICAgIGludCB2YWxMZW4gPSB2YWwubnVtYmVyTGVuZ3RoOwpAQCAtMjQxLDQgKzIzMSw4IEBACiAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcltdIHsgcmVzdWx0MCwgcmVzdWx0MSB9OwogICAgIH0KIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIEEgYmlnIHBhcnQgb2YgdGhpcyBjbGFzcyB0aGF0IG9ubHkgaGFzIGJlZW4gdXNlZCBieSB0aGUgZGl2aWRlIG1ldGhvZAorICAgIC8vIGhhcyBiZWVuIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIEJJR05VTSBpbXBsLgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIH0KZGlmZiAtLWdpdCBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvTG9naWNhbC5qYXZhIGIvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9Mb2dpY2FsLmphdmEKaW5kZXggMzg1NWFlYi4uYTRjNjFlNSAxMDA2NDQKLS0tIGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9Mb2dpY2FsLmphdmEKKysrIGIvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9Mb2dpY2FsLmphdmEKQEAgLTIyNCw2ICsyMjQsOCBAQAogICAgIAogICAgIC8qKiBAc2VlIEJpZ0ludGVnZXIjYW5kTm90KEJpZ0ludGVnZXIpICovCiAgICAgc3RhdGljIEJpZ0ludGVnZXIgYW5kTm90KEJpZ0ludGVnZXIgdmFsLCBCaWdJbnRlZ2VyIHRoYXQpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIGNvcGllZCBmcm9tIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQogICAgICAgICBpZiAodGhhdC5zaWduID09IDAgKSB7CiAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICB9CkBAIC0yNTIsNiArMjU0LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gYW5kTm90TmVnYXRpdmUodmFsLCB0aGF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogICAgIAogICAgIC8qKiBAcmV0dXJuIHNpZ24gPSAxLCBtYWduaXR1ZGUgPSB2YWwubWFnbml0dWRlICYgfnRoYXQubWFnbml0dWRlKi8KZGlmZiAtLWdpdCBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvTWF0aENvbnRleHQuamF2YSBiL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvTWF0aENvbnRleHQuamF2YQppbmRleCA1YTQ4M2YxLi45ZTEzMTRmIDEwMDY0NAotLS0gYS9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL01hdGhDb250ZXh0LmphdmEKKysrIGIvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9NYXRoQ29udGV4dC5qYXZhCkBAIC0yNSwzOSArMjUsNTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubWF0aC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogSW1tdXRhYmxlIG9iamVjdHMgZGVzY3JpYmluZyBzZXR0aW5ncyBhcyByb3VuZGluZyBtb2RlIGFuZCBkaWdpdCBwcmVjaXNpb24KLSAqIGZvciB0aGUgbnVtZXJpY2FsIG9wZXJhdGlvbnMgcHJvdmlkZWQgYnkgY2xhc3Mge0Bjb2RlIEJpZ0RlY2ltYWx9LiAKKyAqIEltbXV0YWJsZSBvYmplY3RzIGRlc2NyaWJpbmcgc2V0dGluZ3Mgc3VjaCBhcyByb3VuZGluZyBtb2RlIGFuZCBkaWdpdAorICogcHJlY2lzaW9uIGZvciB0aGUgbnVtZXJpY2FsIG9wZXJhdGlvbnMgcHJvdmlkZWQgYnkgY2xhc3Mge0BsaW5rIEJpZ0RlY2ltYWx9LgogICogCi0gKiBAYXV0aG9yIEludGVsIE1pZGRsZXdhcmUgUHJvZHVjdCBEaXZpc2lvbgotICogQGF1dGhvciBJbnN0aXR1dG8gVGVjbm9sb2dpY28gZGUgQ29yZG9iYQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBNYXRoQ29udGV4dCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisgICAgLy8gYWRkZWQgZmluYWwgbW9kaWZpZXIKKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKICAgICAvKiBGaWVsZHMgKi8KIAogICAgIC8qKgotICAgICAqIEEgTWF0aENvbnRleHQgd2ljaCBjb3JyZXNwb25kcyB0byB0aGUgSUVFRSA3NTRyIHNpbmdsZSBkZWNpbWFsIHByZWNpc2lvbiBmb3JtYXQ6Ci0gICAgICogNyBkaWdpdCBwcmVpY2lzaW9uIGFuZCBIQUxGX0VWRU4gcm91bmRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXRoQ29udGV4dCBERUNJTUFMMzIgPSBuZXcgTWF0aENvbnRleHQoNywKLSAgICAgICAgICAgIFJvdW5kaW5nTW9kZS5IQUxGX0VWRU4pOwotCi0gICAgLyoqCi0gICAgICogQSBNYXRoQ29udGV4dCB3aWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBJRUVFIDc1NHIgZG91YmxlIGRlY2ltYWwgcHJlY2lzaW9uIGZvcm1hdDoKLSAgICAgKiAxNiBkaWdpdCBwcmVpY2lzaW9uIGFuZCBIQUxGX0VWRU4gcm91bmRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXRoQ29udGV4dCBERUNJTUFMNjQgPSBuZXcgTWF0aENvbnRleHQoMTYsCi0gICAgICAgICAgICBSb3VuZGluZ01vZGUuSEFMRl9FVkVOKTsKLQotICAgIC8qKgotICAgICAqIEEgTWF0aENvbnRleHQgd2ljaCBjb3JyZXNwb25kcyB0byB0aGUgSUVFRSA3NTRyIHF1YWRydXBsZSBkZWNpbWFsIHByZWNpc2lvbiBmb3JtYXQ6Ci0gICAgICogMzQgZGlnaXQgcHJlaWNpc2lvbiBhbmQgSEFMRl9FVkVOIHJvdW5kaW5nLgorICAgICAqIEEge0Bjb2RlIE1hdGhDb250ZXh0fSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgSUVFRSA3NTRyIHF1YWRydXBsZQorICAgICAqIGRlY2ltYWwgcHJlY2lzaW9uIGZvcm1hdDogMzQgZGlnaXQgcHJlY2lzaW9uIGFuZAorICAgICAqIHtAbGluayBSb3VuZGluZ01vZGUjSEFMRl9FVkVOfSByb3VuZGluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hdGhDb250ZXh0IERFQ0lNQUwxMjggPSBuZXcgTWF0aENvbnRleHQoMzQsCiAgICAgICAgICAgICBSb3VuZGluZ01vZGUuSEFMRl9FVkVOKTsKIAogICAgIC8qKgotICAgICAqIEEgTWF0aENvbnRleHQgZm9yIHVubGltaXRlZCBwcmVjaXNpb24gd2l0aCBIQUxGX1VQIHJvdW5kaW5nLgorICAgICAqIEEge0Bjb2RlIE1hdGhDb250ZXh0fSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgSUVFRSA3NTRyIHNpbmdsZSBkZWNpbWFsCisgICAgICogcHJlY2lzaW9uIGZvcm1hdDogNyBkaWdpdCBwcmVjaXNpb24gYW5kIHtAbGluayBSb3VuZGluZ01vZGUjSEFMRl9FVkVOfQorICAgICAqIHJvdW5kaW5nLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF0aENvbnRleHQgREVDSU1BTDMyID0gbmV3IE1hdGhDb250ZXh0KDcsCisgICAgICAgICAgICBSb3VuZGluZ01vZGUuSEFMRl9FVkVOKTsKKworICAgIC8qKgorICAgICAqIEEge0Bjb2RlIE1hdGhDb250ZXh0fSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgSUVFRSA3NTRyIGRvdWJsZSBkZWNpbWFsCisgICAgICogcHJlY2lzaW9uIGZvcm1hdDogMTYgZGlnaXQgcHJlY2lzaW9uIGFuZCB7QGxpbmsgUm91bmRpbmdNb2RlI0hBTEZfRVZFTn0KKyAgICAgKiByb3VuZGluZy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hdGhDb250ZXh0IERFQ0lNQUw2NCA9IG5ldyBNYXRoQ29udGV4dCgxNiwKKyAgICAgICAgICAgIFJvdW5kaW5nTW9kZS5IQUxGX0VWRU4pOworCisgICAgLyoqCisgICAgICogQSB7QGNvZGUgTWF0aENvbnRleHR9IGZvciB1bmxpbWl0ZWQgcHJlY2lzaW9uIHdpdGgKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI0hBTEZfVVB9IHJvdW5kaW5nLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF0aENvbnRleHQgVU5MSU1JVEVEID0gbmV3IE1hdGhDb250ZXh0KDAsCiAgICAgICAgICAgICBSb3VuZGluZ01vZGUuSEFMRl9VUCk7CkBAIC02NiwzMyArODEsMzUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NTc5NzIwMDA0Nzg2ODQ4MjU1TDsKIAogICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIGJlIHVzZWQgZm9yIGFuIG9wZXJhdGlvbjsgCi0gICAgICogcmVzdWx0cyBhcmUgcm91bmRlZCB0byB0aGlzIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIGRpZ2l0cyB0byBiZSB1c2VkIGZvciBhbiBvcGVyYXRpb247IHJlc3VsdHMgYXJlIHJvdW5kZWQgdG8KKyAgICAgKiB0aGlzIHByZWNpc2lvbi4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBwcmVjaXNpb247CiAKICAgICAvKioKLSAgICAgKiBBIHtAY29kZSBSb3VuZGluZ01vZGV9IG9iamVjdCB3aGljaCBzcGVjaWZpZXMgCi0gICAgICogdGhlIGFsZ29yaXRobSB0byBiZSB1c2VkIGZvciByb3VuZGluZy4KKyAgICAgKiBBIHtAY29kZSBSb3VuZGluZ01vZGV9IG9iamVjdCB3aGljaCBzcGVjaWZpZXMgdGhlIGFsZ29yaXRobSB0byBiZSB1c2VkCisgICAgICogZm9yIHJvdW5kaW5nLgogICAgICAqLwogICAgIHByaXZhdGUgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZTsKIAotICAgIC8qKiAKLSAgICAgKiBBbiBhcnJheSBvZiB7QGNvZGUgY2hhcn0gY29udGFpbmluZzogCi0gICAgICoge0Bjb2RlICdwJywncicsJ2UnLCdjJywnaScsJ3MnLCdpJywnbycsJ24nLCc9J30uCi0gICAgICogSXQncyB1c2VkIHRvIGltcHJvdmUgdGhlIG1ldGhvZHMgcmVsYXRlZCB0byB7QGNvZGUgU3RyaW5nfSBjb252ZXJzaW9uLgorICAgIC8qKgorICAgICAqIEFuIGFycmF5IG9mIHtAY29kZSBjaGFyfSBjb250YWluaW5nOiB7QGNvZGUKKyAgICAgKiAncCcsJ3InLCdlJywnYycsJ2knLCdzJywnaScsJ28nLCduJywnPSd9LiBJdCdzIHVzZWQgdG8gaW1wcm92ZSB0aGUKKyAgICAgKiBtZXRob2RzIHJlbGF0ZWQgdG8ge0Bjb2RlIFN0cmluZ30gY29udmVyc2lvbi4KKyAgICAgKiAKICAgICAgKiBAc2VlICNNYXRoQ29udGV4dChTdHJpbmcpCi0gICAgICogQHNlZSAjdG9TdHJpbmcoKSAKKyAgICAgKiBAc2VlICN0b1N0cmluZygpCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIGNoUHJlY2lzaW9uID0geyAncCcsICdyJywgJ2UnLCAnYycsICdpJywgJ3MnLAogICAgICAgICAgICAgJ2knLCAnbycsICduJywgJz0nIH07CiAKLSAgICAvKiogCi0gICAgICogQW4gYXJyYXkgb2Yge0Bjb2RlIGNoYXJ9IGNvbnRhaW5pbmc6IAotICAgICAqIHtAY29kZSAncicsJ28nLCd1JywnbicsJ2QnLCdpJywnbicsJ2cnLCdNJywnbycsJ2QnLCdlJywnPSd9LgotICAgICAqIEl0J3MgdXNlZCB0byBpbXByb3ZlIHRoZSBtZXRob2RzIHJlbGF0ZWQgdG8ge0Bjb2RlIFN0cmluZ30gY29udmVyc2lvbi4KKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSBvZiB7QGNvZGUgY2hhcn0gY29udGFpbmluZzoge0Bjb2RlCisgICAgICogJ3InLCdvJywndScsJ24nLCdkJywnaScsJ24nLCdnJywnTScsJ28nLCdkJywnZScsJz0nfS4gSXQncyB1c2VkIHRvCisgICAgICogaW1wcm92ZSB0aGUgbWV0aG9kcyByZWxhdGVkIHRvIHtAY29kZSBTdHJpbmd9IGNvbnZlcnNpb24uCisgICAgICogCiAgICAgICogQHNlZSAjTWF0aENvbnRleHQoU3RyaW5nKQotICAgICAqIEBzZWUgI3RvU3RyaW5nKCkgCisgICAgICogQHNlZSAjdG9TdHJpbmcoKQogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBjaFJvdW5kaW5nTW9kZSA9IHsgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsCiAgICAgICAgICAgICAnaScsICduJywgJ2cnLCAnTScsICdvJywgJ2QnLCAnZScsICc9JyB9OwpAQCAtMTAwLDMwICsxMTcsNDYgQEAKICAgICAvKiBDb25zdHJ1Y3RvcnMgKi8KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgTWF0aENvbnRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiBhbmQgd2l0aCAKLSAgICAgKiB0aGUgcm91bmRpbmcgbW9kZSBIQUxGX1VQLiBJZiB0aGUgcHJlY2lzaW9uIHBhc3NlZCBpcyB6ZXJvLCB0aGVuCi0gICAgICogdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGNvbXB1dGF0aW9ucyBoYXZlIHRvIGJlIHBlcmZvcm1lZCBleGFjdCwKLSAgICAgKiB0aGUgcm91bmRpbmcgbW9kZSBpbiB0aGlzIGNhc2UgaXMgaXJyZWxldmFudC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBNYXRoQ29udGV4dH0gd2l0aCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiBhbmQKKyAgICAgKiB3aXRoIHRoZSByb3VuZGluZyBtb2RlIHtAbGluayBSb3VuZGluZ01vZGUjSEFMRl9VUCBIQUxGX1VQfS4gSWYgdGhlCisgICAgICogcHJlY2lzaW9uIHBhc3NlZCBpcyB6ZXJvLCB0aGVuIHRoaXMgaW1wbGllcyB0aGF0IHRoZSBjb21wdXRhdGlvbnMgaGF2ZSB0bworICAgICAqIGJlIHBlcmZvcm1lZCBleGFjdCwgdGhlIHJvdW5kaW5nIG1vZGUgaW4gdGhpcyBjYXNlIGlzIGlycmVsZXZhbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByZWNpc2lvbiB0aGUgcHJlY2lzaW9uIGZvciB0aGUgbmV3IE1hdGhDb250ZXh0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcHJlY2lzaW9uIDwgMC4KKyAgICAgKiBAcGFyYW0gcHJlY2lzaW9uCisgICAgICogICAgICAgICAgICB0aGUgcHJlY2lzaW9uIGZvciB0aGUgbmV3IHtAY29kZSBNYXRoQ29udGV4dH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcHJlY2lzaW9uIDwgMH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE1hdGhDb250ZXh0KGludCBwcmVjaXNpb24pIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIHBhcmFtZXRlciBuYW1lcyBjaGFuZ2VkLgorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIHRoaXMocHJlY2lzaW9uLCBSb3VuZGluZ01vZGUuSEFMRl9VUCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBNYXRoQ29udGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIGFuZCB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgcm91bmRpbmcgbW9kZS4gSWYgdGhlIHByZWNpc2lvbiBwYXNzZWQgaXMgemVybywgdGhlbgotICAgICAqIHRoaXMgaW1wbGllcyB0aGF0IHRoZSBjb21wdXRhdGlvbnMgaGF2ZSB0byBiZSBwZXJmb3JtZWQgZXhhY3QsCi0gICAgICogdGhlIHJvdW5kaW5nIG1vZGUgaW4gdGhpcyBjYXNlIGlzIGlycmVsZXZhbnQuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTWF0aENvbnRleHR9IHdpdGggdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gYW5kCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvdW5kaW5nIG1vZGUuIElmIHRoZSBwcmVjaXNpb24gcGFzc2VkIGlzIHplcm8sIHRoZW4KKyAgICAgKiB0aGlzIGltcGxpZXMgdGhhdCB0aGUgY29tcHV0YXRpb25zIGhhdmUgdG8gYmUgcGVyZm9ybWVkIGV4YWN0LCB0aGUKKyAgICAgKiByb3VuZGluZyBtb2RlIGluIHRoaXMgY2FzZSBpcyBpcnJlbGV2YW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVjaXNpb24gdGhlIHByZWNpc2lvbiBmb3IgdGhlIG5ldyBNYXRoQ29udGV4dAotICAgICAqIEBwYXJhbSByb3VuZGluZ01vZGUgdGhlIHJvdW5kaW5nIG1vZGUgZm9yIHRoZSBuZXcgTWF0aENvbnRleHQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBwcmVjaXNpb24gPCAwLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcm91bmRpbmdNb2RlIGlzIG51bGwuCisgICAgICogQHBhcmFtIHByZWNpc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHByZWNpc2lvbiBmb3IgdGhlIG5ldyB7QGNvZGUgTWF0aENvbnRleHR9LgorICAgICAqIEBwYXJhbSByb3VuZGluZ01vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSByb3VuZGluZyBtb2RlIGZvciB0aGUgbmV3IHtAY29kZSBNYXRoQ29udGV4dH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcHJlY2lzaW9uIDwgMH0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSByb3VuZGluZ01vZGV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWF0aENvbnRleHQoaW50IHByZWNpc2lvbiwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gcGFyYW1ldGVyIG5hbWVzIGNoYW5nZWQuCisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAgICAgaWYgKHByZWNpc2lvbiA8IDApIHsKICAgICAgICAgICAgIC8vIG1hdGguMEM9RGlnaXRzIDwgMAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIm1hdGguMEMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTEzNywxNSArMTcwLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBNYXRoQ29udGV4dCBmcm9tIGEgc3RyaW5nLiBUaGUgc3RyaW5nIGhhcyB0byAKLSAgICAgKiBzcGVjaWZ5IHRoZSBwcmVjaXNpb24gYW5kIHRoZSByb3VuZGluZyBtb2RlIHRvIGJlIHVzZWQgYW5kIGhhcwotICAgICAqIHRvIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN5bnRheDoKLSAgICAgKiAgICAicHJlY2lzaW9uPTxwcmVjaXNpb24+IHJvdW5kaW5nTW9kZT08cm91bmRpbmdNb2RlPiIKLSAgICAgKiBUaGlzIGlzIHRoZSBzYW1lIGZvcm0gYXMgdGhlIG9uZSByZXR1cm5lZCBieSB0aGUgdG9TdHJpbmcoKSBtZXRob2QuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTWF0aENvbnRleHR9IGZyb20gYSBzdHJpbmcuIFRoZSBzdHJpbmcgaGFzIHRvCisgICAgICogc3BlY2lmeSB0aGUgcHJlY2lzaW9uIGFuZCB0aGUgcm91bmRpbmcgbW9kZSB0byBiZSB1c2VkIGFuZCBoYXMgdG8gZm9sbG93CisgICAgICogdGhlIGZvbGxvd2luZyBzeW50YXg6ICJwcmVjaXNpb249Jmx0O3ByZWNpc2lvbiZndDsgcm91bmRpbmdNb2RlPSZsdDtyb3VuZGluZ01vZGUmZ3Q7IgorICAgICAqIFRoaXMgaXMgdGhlIHNhbWUgZm9ybSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IHRoZSB7QGxpbmsgI3RvU3RyaW5nfQorICAgICAqIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByZWNpc2lvbiBhbmQgcm91bmRpbmcgbW9kZSBmb3IgdGhlIG5ldyBNYXRoQ29udGV4dC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgU3RyaW5nIGlzIG5vdCBpbiB0aGUgY29ycmVjdAotICAgICAqIGZvcm1hdCBvciBpZiB0aGUgcHJlY2lzaW9uIHNwZWNpZmllZCBpcyA8IDAuCisgICAgICogQHBhcmFtIHZhbAorICAgICAqICAgICAgICAgICAgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJlY2lzaW9uIGFuZCByb3VuZGluZyBtb2RlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIG5ldyB7QGNvZGUgTWF0aENvbnRleHR9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0cmluZyBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IG9yIGlmIHRoZQorICAgICAqICAgICAgICAgICAgIHByZWNpc2lvbiBzcGVjaWZpZWQgaXMgPCAwLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBNYXRoQ29udGV4dChTdHJpbmcgdmFsKSB7CiAgICAgICAgIGNoYXJbXSBjaGFyVmFsID0gdmFsLnRvQ2hhckFycmF5KCk7CkBAIC0xNzIsNyArMjEwLDkgQEAKICAgICAgICAgICAgIC8vIG1hdGguMEU9YmFkIHN0cmluZyBmb3JtYXQKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJtYXRoLjBFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gZGlnaXQ7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaSsrOwogCiAgICAgICAgIGRvIHsKQEAgLTIxMywzNyArMjUzLDUyIEBACiAgICAgLyogUHVibGljIE1ldGhvZHMgKi8KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWNpc2lvbi4gVGhlIHByZWNpc2lvbiBpcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB1c2VkCi0gICAgICogZm9yIGFuIG9wZXJhdGlvbi4gUmVzdWx0cyBhcmUgcm91bmRlZCB0byB0aGlzIHByZWNpc2lvbi4gVGhlIHByZWNpc2lvbgotICAgICAqIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uIG5lZ2F0aXZlLiBJZiB0aGUgcHJlY2lzaW9uIGlzIHplcm8sIHRoZW4KLSAgICAgKiB0aGUgY29tcHV0YXRpb25zIGhhdmUgdG8gYmUgcGVyZm9ybWVkIGV4YWN0LCByZXN1bHRzIGFyZSBub3Qgcm91bmRlZAotICAgICAqIGluIHRoaXMgY2FzZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBwcmVjaXNpb24uIFRoZSBwcmVjaXNpb24gaXMgdGhlIG51bWJlciBvZiBkaWdpdHMgdXNlZCBmb3IgYW4KKyAgICAgKiBvcGVyYXRpb24uIFJlc3VsdHMgYXJlIHJvdW5kZWQgdG8gdGhpcyBwcmVjaXNpb24uIFRoZSBwcmVjaXNpb24gaXMKKyAgICAgKiBndWFyYW50ZWVkIHRvIGJlIG5vbiBuZWdhdGl2ZS4gSWYgdGhlIHByZWNpc2lvbiBpcyB6ZXJvLCB0aGVuIHRoZQorICAgICAqIGNvbXB1dGF0aW9ucyBoYXZlIHRvIGJlIHBlcmZvcm1lZCBleGFjdCwgcmVzdWx0cyBhcmUgbm90IHJvdW5kZWQgaW4gdGhpcworICAgICAqIGNhc2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UHJlY2lzaW9uKCkgewogICAgICAgICByZXR1cm4gcHJlY2lzaW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvdW5kaW5nIG1vZGUuIFRoZSByb3VuZGluZyBtb2RlIGlzIHRoZSBzdHJhdGVneSB0byBiZQotICAgICAqIHVzZWQgdG8gcm91bmQgcmVzdWx0cy4gVGhlIHJvdW5kaW5nIG1vZGUgaXMgb25lIG9mIFJvdW5kaW5nTW9kZS5VUCwKLSAgICAgKiBSb3VuZGluZ01vZGUuRE9XTiwgUm91bmRpbmdNb2RlLkNFSUxJTkcsIFJvdW5kaW5nTW9kZS5GTE9PUiwKLSAgICAgKiBSb3VuZGluZ01vZGUuSEFMRl9VUCwgUm91bmRpbmdNb2RlLkhBTEZfRE9XTiwgUm91bmRpbmdNb2RlLkhBTEZfRVZFTiwKLSAgICAgKiBvciBvdW5kaW5nTW9kZS5VTk5FQ0VTU0FSWS4KKyAgICAgKiBSZXR1cm5zIHRoZSByb3VuZGluZyBtb2RlLiBUaGUgcm91bmRpbmcgbW9kZSBpcyB0aGUgc3RyYXRlZ3kgdG8gYmUgdXNlZAorICAgICAqIHRvIHJvdW5kIHJlc3VsdHMuCisgICAgICogPHA+IAorICAgICAqIFRoZSByb3VuZGluZyBtb2RlIGlzIG9uZSBvZiAKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI1VQfSwKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI0RPV059LCAKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI0NFSUxJTkd9LCAKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI0ZMT09SfSwKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI0hBTEZfVVB9LCAKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI0hBTEZfRE9XTn0sIAorICAgICAqIHtAbGluayBSb3VuZGluZ01vZGUjSEFMRl9FVkVOfSwgb3IKKyAgICAgKiB7QGxpbmsgUm91bmRpbmdNb2RlI1VOTkVDRVNTQVJZfS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSByb3VuZGluZyBtb2RlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSb3VuZGluZ01vZGUgZ2V0Um91bmRpbmdNb2RlKCkgewogICAgICAgICByZXR1cm4gcm91bmRpbmdNb2RlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB4IGlzIGEgTWF0aENvbnRleHQgd2l0aCB0aGUgc2FtZSBwcmVjaXNpb24gc2V0dGluZwotICAgICAqIGFuZCB0aGUgc2FtZSByb3VuZGluZyBtb2RlIGFzIHRoaXMgTWF0aENvbnRleHQgaW5zdGFuY2UuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHggaXMgYSB7QGNvZGUgTWF0aENvbnRleHR9IHdpdGggdGhlIHNhbWUgcHJlY2lzaW9uCisgICAgICogc2V0dGluZyBhbmQgdGhlIHNhbWUgcm91bmRpbmcgbW9kZSBhcyB0aGlzIHtAY29kZSBNYXRoQ29udGV4dH0gaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggb2JqZWN0IHRvIGJlIGNvbXBhcmVkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgTWF0aENvbnRleHQgaW5zdGFuY2UgaXMgZXF1YWwgdG8gdGhlIHggYXJndW1lbnQ7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIE1hdGhDb250ZXh0fSBpbnN0YW5jZSBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiAgICAgICAgIHtAY29kZSB4fSBhcmd1bWVudDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB4KSB7CkBAIC0yNTMsOSArMzA4LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIE1hdGhDb250ZXh0IGluc3RhbmNlLgorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyB7QGNvZGUgTWF0aENvbnRleHR9IGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBNYXRoQ29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBmb3IgdGhpcyB7QGNvZGUgTWF0aENvbnRleHR9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC0yNjQsMTYgKzMyMSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBNYXRoQ29udGV4dCBpbnN0YW5jZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMge0Bjb2RlIE1hdGhDb250ZXh0fSBpbnN0YW5jZS4KICAgICAgKiBUaGUgc3RyaW5nIGhhcyB0aGUgZm9ybSAKKyAgICAgKiB7QGNvZGUKKyAgICAgKiAicHJlY2lzaW9uPSZsdDtwcmVjaXNpb24mZ3Q7IHJvdW5kaW5nTW9kZT0mbHQ7cm91bmRpbmdNb2RlJmd0OyIKKyAgICAgKiB9IHdoZXJlIHtAY29kZSAmbHQ7cHJlY2lzaW9uJmd0O30gaXMgYW4gaW50ZWdlciBkZXNjcmliaW5nIHRoZSBudW1iZXIgCisgICAgICogb2YgZGlnaXRzIHVzZWQgZm9yIG9wZXJhdGlvbnMgYW5kIHtAY29kZSAmbHQ7cm91bmRpbmdNb2RlJmd0O30gaXMgdGhlCisgICAgICogc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByb3VuZGluZyBtb2RlLgogICAgICAqIAotICAgICAqICAgICJwcmVjaXNpb249PHByZWNpc2lvbj4gcm91bmRpbmdNb2RlPTxyb3VuZGluZ01vZGU+IgotICAgICAqIAotICAgICAqIHdoZXJlIDxwcmVjaXNpb24+IGlzIGFuIGludCBkZXNjcmliaW5nIHRoZSBudW1iZXIgb2YgZGlnaXRzIHVzZWQgZm9yIAotICAgICAqIG9wZXJhdGlvbnMgYW5kIDxyb3VuZGluZ01vZGU+IGlzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAgICogcm91bmRpbmcgbW9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIE1hdGhDb250ZXh0IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMge0Bjb2RlIE1hdGhDb250ZXh0fSBpbnN0YW5jZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0yODksMTIgKzM0NiwxMiBAQAogCiAgICAgLyoqCiAgICAgICogTWFrZXMgY2hlY2tzIHVwb24gZGVzZXJpYWxpemF0aW9uIG9mIGEge0Bjb2RlIE1hdGhDb250ZXh0fSBpbnN0YW5jZS4KLSAgICAgKiBDaGVja3Mgd2hldGhlciBwcmVjaXNpb24gPj0gMCBhbmQgdGhlIHJvdW5kaW5nTW9kZSAhPSBudWxsCisgICAgICogQ2hlY2tzIHdoZXRoZXIge0Bjb2RlIHByZWNpc2lvbiA+PSAwfSBhbmQge0Bjb2RlIHJvdW5kaW5nTW9kZSAhPSBudWxsfQogICAgICAqIAogICAgICAqIEB0aHJvd3MgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgcHJlY2lzaW9uIDwgMAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwcmVjaXNpb24gPCAwfQogICAgICAqIEB0aHJvd3MgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgcm91bmRpbmdNb2RlID09IG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcm91bmRpbmdNb2RlID09IG51bGx9CiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL011bHRpcGxpY2F0aW9uLmphdmEgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL011bHRpcGxpY2F0aW9uLmphdmEKaW5kZXggMmViMzIyOS4uZWMyMjIwNyAxMDA2NDQKLS0tIGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9NdWx0aXBsaWNhdGlvbi5qYXZhCisrKyBiL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvTXVsdGlwbGljYXRpb24uamF2YQpAQCAtMSwyMCArMSw0IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKICAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKICAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCkBAIC0zMSwxMiArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qCi0gKiBTaW5jZSB0aGUgb3JpZ2luYWwgSGFybW9ueSBDb2RlIG9mIHRoZSBCaWdJbnRlZ2VyIGNsYXNzIHdhcyBzdHJvbmdseSBtb2RpZmllZCwKLSAqIGluIG9yZGVyIHRvIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgT3BlblNTTCBCSUdOVU0gaW1wbGVtZW50YXRpb24sCi0gKiBubyBhbmRyb2lkLW1vZGlmaWNhdGlvbi10YWdzIHdlcmUgcGxhY2VkLCBhdCBhbGwuCi0gKi8KLQogcGFja2FnZSBqYXZhLm1hdGg7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubWF0aC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CkBAIC01Miw2ICszMCwxNCBAQAogICAgIC8qKiBKdXN0IHRvIGRlbm90ZSB0aGF0IHRoaXMgY2xhc3MgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLiAqLwogICAgIHByaXZhdGUgTXVsdGlwbGljYXRpb24oKSB7fQogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgLy8gLyoqCisgICAgLy8gICogQnJlYWsgcG9pbnQgaW4gZGlnaXRzIChudW1iZXIgb2Yge0Bjb2RlIGludH0gZWxlbWVudHMpCisgICAgLy8gICogYmV0d2VlbiBLYXJhdHN1YmEgYW5kIFBlbmNpbCBhbmQgUGFwZXIgbXVsdGlwbHkuCisgICAgLy8gICovCisgICAgLy8gc3RhdGljIGZpbmFsIGludCB3aGVuVXNlS2FyYXRzdWJhID0gNjM7IC8vIGFuIGhldXJpc3RpYyB2YWx1ZQorICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKKwogICAgIC8qKgogICAgICAqIEFuIGFycmF5IHdpdGggcG93ZXJzIG9mIHRlbiB0aGF0IGZpdCBpbiB0aGUgdHlwZSB7QGNvZGUgaW50fS4KICAgICAgKiAoe0Bjb2RlIDEwXjAsMTBeMSwuLi4sMTBeOX0pCkBAIC04MSwxMCArNjcsMTIgQEAKICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBiaWdGaXZlUG93c1tdID0gbmV3IEJpZ0ludGVnZXJbMzJdOwogICAgIAorICAgIAogCiAgICAgc3RhdGljIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGxvbmcgZml2ZVBvdyA9IDFMOworICAgICAgICAKICAgICAgICAgZm9yIChpID0gMDsgaSA8PSAxODsgaSsrKSB7CiAgICAgICAgICAgICBiaWdGaXZlUG93c1tpXSA9IEJpZ0ludGVnZXIudmFsdWVPZihmaXZlUG93KTsKICAgICAgICAgICAgIGJpZ1RlblBvd3NbaV0gPSBCaWdJbnRlZ2VyLnZhbHVlT2YoZml2ZVBvdyA8PCBpKTsKQEAgLTk2LDYgKzg0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBUaGUgbWV0aG9kIG11bHRpcGx5IGhhcyBiZWVuIHJlbW92ZWQgaW4gZmF2b3Igb2YgdXNpbmcgT3BlblNTTCBCSUdOVU0KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCisKICAgICAvKioKICAgICAgKiBNdWx0aXBsaWVzIGEgbnVtYmVyIGJ5IGEgcG9zaXRpdmUgaW50ZWdlci4KICAgICAgKiBAcGFyYW0gdmFsIGFuIGFyYml0cmFyeSB7QGNvZGUgQmlnSW50ZWdlcn0KQEAgLTEwMyw5ICs5NSwxMSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHZhbCAqIGZhY3Rvcn0KICAgICAgKi8KICAgICBzdGF0aWMgQmlnSW50ZWdlciBtdWx0aXBseUJ5UG9zaXRpdmVJbnQoQmlnSW50ZWdlciB2YWwsIGludCBmYWN0b3IpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIEJpZ0ludCBiaSA9IHZhbC5iaWdJbnQuY29weSgpOwogICAgICAgICBiaS5tdWx0aXBseUJ5UG9zaXRpdmVJbnQoZmFjdG9yKTsKICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGJpKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9QcmltYWxpdHkuamF2YSBiL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvUHJpbWFsaXR5LmphdmEKaW5kZXggZTE3YWFmZC4uZmQwNmIzYiAxMDA2NDQKLS0tIGEvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9QcmltYWxpdHkuamF2YQorKysgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL1ByaW1hbGl0eS5qYXZhCkBAIC0xLDIwICsxLDQgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgogICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KQEAgLTMwLDE3ICsxNCwzMSBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAvKgotICogU2luY2UgdGhlIG9yaWdpbmFsIEhhcm1vbnkgQ29kZSBvZiB0aGUgQmlnSW50ZWdlciBjbGFzcyB3YXMgc3Ryb25nbHkgbW9kaWZpZWQsCi0gKiBpbiBvcmRlciB0byB1c2UgdGhlIG1vcmUgZWZmaWNpZW50IE9wZW5TU0wgQklHTlVNIGltcGxlbWVudGF0aW9uLAotICogbm8gYW5kcm9pZC1tb2RpZmljYXRpb24tdGFncyB3ZXJlIHBsYWNlZCwgYXQgYWxsLgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBTaW5jZSB0aGUgb3JpZ2luYWwgSGFybW9ueSBDb2RlIG9mIHRoZSBCaWdJbnRlZ2VyIGNsYXNzIHdhcyBzdHJvbmdseSBtb2RpZmllZCwKKy8vIGluIG9yZGVyIHRvIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgT3BlblNTTCBCSUdOVU0gaW1wbGVtZW50YXRpb24sCisvLyBubyBhbmRyb2lkLW1vZGlmaWNhdGlvbi10YWdzIHdlcmUgcGxhY2VkLCBhdCBhbGwuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS5tYXRoOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCiBjbGFzcyBQcmltYWxpdHkgewogCkBAIC05Niw3ICs5NCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qIFBhY2thZ2UgTWV0aG9kcyAqLwogCiAgICAgLyoqCkBAIC0xMTUsOCArMTEyLDYgQEAKICAgICAgICAgaW50IGdhcFNpemUgPSAxMDI0OyAvLyBmb3Igc2VhcmNoaW5nIG9mIHRoZSBuZXh0IHByb2JhYmxlIHByaW1lIG51bWJlcgogICAgICAgICBpbnQgbW9kdWxlc1tdID0gbmV3IGludFtwcmltZXMubGVuZ3RoXTsKICAgICAgICAgYm9vbGVhbiBpc0RpdmlzaWJsZVtdID0gbmV3IGJvb2xlYW5bZ2FwU2l6ZV07Ci0gICAgICAgIEJpZ0ludCBzdGFydFBvaW50OwotICAgICAgICBCaWdJbnQgcHJvYlByaW1lOwogICAgICAgICBCaWdJbnQgbmkgPSBuLmJpZ0ludDsKICAgICAgICAgLy8gSWYgbiA8ICJsYXN0IHByaW1lIG9mIHRhYmxlIiBzZWFyY2hlcyBuZXh0IHByaW1lIGluIHRoZSB0YWJsZQogICAgICAgICBpZiAobmkuYml0TGVuZ3RoKCkgPD0gMTApIHsKQEAgLTEyNiwxNSArMTIxLDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJJcHJpbWVzW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZXMgYSAiTiIgZW5vdWdoIGJpZyB0byBob2xkIHRoZSBuZXh0IHByb2JhYmxlIHByaW1lIE5vdGUgdGhhdDogTiA8Ci0gICAgICAgICAqICJuZXh0IHByaW1lIiA8IDIqTgotICAgICAgICAgKi8KLSAgICAgICAgc3RhcnRQb2ludCA9IG5pLmNvcHkoKTsKLSAgICAgICAgcHJvYlByaW1lID0gbmV3IEJpZ0ludCgpOwogCi0gICAgICAgIC8vIFRvIGZpeCBOIHRvIHRoZSAibmV4dCBvZGQgbnVtYmVyIgotICAgICAgICBuaS5hZGRQb3NpdGl2ZUludChCaWdJbnQucmVtYWluZGVyQnlQb3NpdGl2ZUludChuaSwgMikgKyAxKTsKKyAgICAgICAgQmlnSW50IHN0YXJ0UG9pbnQgPSBuaS5jb3B5KCk7CisgICAgICAgIEJpZ0ludCBwcm9iUHJpbWUgPSBuZXcgQmlnSW50KCk7CisKKyAgICAgICAgLy8gRml4IHN0YXJ0UG9pbnQgdG8gIm5leHQgb2RkIG51bWJlciI6CisgICAgICAgIHN0YXJ0UG9pbnQuYWRkUG9zaXRpdmVJbnQoQmlnSW50LnJlbWFpbmRlckJ5UG9zaXRpdmVJbnQobmksIDIpICsgMSk7CiAKIC8vICAgICAgICAvLyBUbyBzZXQgdGhlIGltcHJvdmVkIGNlcnRhaW50eSBvZiBNaWxsZXItUmFiaW4KIC8vICAgICAgICBqID0gc3RhcnRQb2ludC5iaXRMZW5ndGgoKTsKZGlmZiAtLWdpdCBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvUm91bmRpbmdNb2RlLmphdmEgYi9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL1JvdW5kaW5nTW9kZS5qYXZhCmluZGV4IDhhYWMwMTIuLjg0ZGNjNTIgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvUm91bmRpbmdNb2RlLmphdmEKKysrIGIvbWF0aC9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9Sb3VuZGluZ01vZGUuamF2YQpAQCAtMjAsNjEgKzIwLDc1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1hdGguaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEFuIGVudW0gdG8gc3BlY2lmeSB0aGUgcm91bmRpbmcgYmVoYXZpb3VyIGZvciBvcGVyYXRpb25zIHdob3NlIHJlc3VsdHMKLSAqIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5LgorICogU3BlY2lmaWVzIHRoZSByb3VuZGluZyBiZWhhdmlvciBmb3Igb3BlcmF0aW9ucyB3aG9zZSByZXN1bHRzIGNhbm5vdCBiZQorICogcmVwcmVzZW50ZWQgZXhhY3RseS4KICAqIAotICogQGF1dGhvciBJbnRlbCBNaWRkbGV3YXJlIFByb2R1Y3QgRGl2aXNpb24KLSAqIEBhdXRob3IgSW5zdGl0dXRvIFRlY25vbG9naWNvIGRlIENvcmRvYmEKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZW51bSBSb3VuZGluZ01vZGUgewogCiAgICAgLyoqCiAgICAgICogUm91bmRpbmcgbW9kZSB3aGVyZSBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyBwb3NpdGl2ZSBpbmZpbml0eQogICAgICAqIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgdG93YXJkcyBuZWdhdGl2ZSBpbmZpbml0eS4KKyAgICAgKiA8YnI+CisgICAgICogUnVsZToge0Bjb2RlIHgucm91bmQoKS5hYnMoKSA+PSB4LmFicygpfQogICAgICAqIAotICAgICAqIFJ1bGU6IHgucm91bmQoKS5hYnMoKSA+PSB4LmFicygpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgVVAoQmlnRGVjaW1hbC5ST1VORF9VUCksCiAKICAgICAvKioKICAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHRoZSB2YWx1ZXMgYXJlIHJvdW5kZWQgdG93YXJkcyB6ZXJvLgorICAgICAqIDxicj4KKyAgICAgKiBSdWxlOiB7QGNvZGUgeC5yb3VuZCgpLmFicygpIDw9IHguYWJzKCl9CiAgICAgICogCi0gICAgICogUnVsZTogeC5yb3VuZCgpLmFicygpIDw9IHguYWJzKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBET1dOKEJpZ0RlY2ltYWwuUk9VTkRfRE9XTiksCiAKICAgICAvKioKICAgICAgKiBSb3VuZGluZyBtb2RlIHRvIHJvdW5kIHRvd2FyZHMgcG9zaXRpdmUgaW5maW5pdHkuIEZvciBwb3NpdGl2ZSB2YWx1ZXMKLSAgICAgKiB0aGlzIHJvdW5kaW5nIG1vZGUgYmVoYXZlcyBhcyBVUCwgZm9yIG5lZ2F0aXZlIHZhbHVlcyBhcyAKLSAgICAgKiBET1dOLgorICAgICAqIHRoaXMgcm91bmRpbmcgbW9kZSBiZWhhdmVzIGFzIHtAbGluayAjVVB9LCBmb3IgbmVnYXRpdmUgdmFsdWVzIGFzCisgICAgICoge0BsaW5rICNET1dOfS4KKyAgICAgKiA8YnI+CisgICAgICogUnVsZToge0Bjb2RlIHgucm91bmQoKSA+PSB4fQogICAgICAqIAotICAgICAqIFJ1bGU6IHgucm91bmQoKSA+PSB4CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQ0VJTElORyhCaWdEZWNpbWFsLlJPVU5EX0NFSUxJTkcpLAogCiAgICAgLyoqCiAgICAgICogUm91bmRpbmcgbW9kZSB0byByb3VuZCB0b3dhcmRzIG5lZ2F0aXZlIGluZmluaXR5LiBGb3IgcG9zaXRpdmUgdmFsdWVzCi0gICAgICogdGhpcyByb3VuZGluZyBtb2RlIGJlaGF2ZXMgYXMgRE9XTiwgZm9yIG5lZ2F0aXZlIHZhbHVlcyBhcyBVUC4KKyAgICAgKiB0aGlzIHJvdW5kaW5nIG1vZGUgYmVoYXZlcyBhcyB7QGxpbmsgI0RPV059LCBmb3IgbmVnYXRpdmUgdmFsdWVzIGFzCisgICAgICoge0BsaW5rICNVUH0uCisgICAgICogPGJyPgorICAgICAqIFJ1bGU6IHtAY29kZSB4LnJvdW5kKCkgPD0geH0KICAgICAgKiAKLSAgICAgKiBSdWxlOiB4LnJvdW5kKCkgPD0geCAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBGTE9PUihCaWdEZWNpbWFsLlJPVU5EX0ZMT09SKSwKIAogICAgIC8qKgotICAgICAqIFJvdW5kaW5nIG1vZGUgd2hlcmUgdmFsdWVzIGFyZSByb3VuZGVkIHRvd2FyZHMgdGhlIG5lYXJlc3QgbmVpZ2hib3VyLgotICAgICAqIFRpZXMgYXJlIGJyb2tlbiBieSByb3VuZGluZyB1cC4KKyAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHZhbHVlcyBhcmUgcm91bmRlZCB0b3dhcmRzIHRoZSBuZWFyZXN0IG5laWdoYm9yLiBUaWVzCisgICAgICogYXJlIGJyb2tlbiBieSByb3VuZGluZyB1cC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBIQUxGX1VQKEJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9VUCksCiAKICAgICAvKioKLSAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHZhbHVlcyBhcmUgcm91bmRlZCB0b3dhcmRzIHRoZSBuZWFyZXN0IG5laWdoYm91ci4KLSAgICAgKiBUaWVzIGFyZSBicm9rZW4gYnkgcm91bmRpbmcgZG93bi4KKyAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHZhbHVlcyBhcmUgcm91bmRlZCB0b3dhcmRzIHRoZSBuZWFyZXN0IG5laWdoYm9yLiBUaWVzCisgICAgICogYXJlIGJyb2tlbiBieSByb3VuZGluZyBkb3duLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEhBTEZfRE9XTihCaWdEZWNpbWFsLlJPVU5EX0hBTEZfRE9XTiksCiAKICAgICAvKioKLSAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHZhbHVlcyBhcmUgcm91bmRlZCB0b3dhcmRzIHRoZSBuZWFyZXN0IG5laWdoYm91ci4KLSAgICAgKiBUaWVzIGFyZSBicm9rZW4gYnkgcm91bmRpbmcgdG8gdGhlIGV2ZW4gbmVpZ2hib3VyLgorICAgICAqIFJvdW5kaW5nIG1vZGUgd2hlcmUgdmFsdWVzIGFyZSByb3VuZGVkIHRvd2FyZHMgdGhlIG5lYXJlc3QgbmVpZ2hib3IuIFRpZXMKKyAgICAgKiBhcmUgYnJva2VuIGJ5IHJvdW5kaW5nIHRvIHRoZSBldmVuIG5laWdoYm9yLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEhBTEZfRVZFTihCaWdEZWNpbWFsLlJPVU5EX0hBTEZfRVZFTiksCiAKQEAgLTgyLDYgKzk2LDggQEAKICAgICAgKiBSb3VuZGluZyBtb2RlIHdoZXJlIHRoZSByb3VuZGluZyBvcGVyYXRpb25zIHRocm93cyBhbiBBcml0aG1ldGljRXhjZXB0aW9uCiAgICAgICogZm9yIHRoZSBjYXNlIHRoYXQgcm91bmRpbmcgaXMgbmVjZXNzYXJ5LCBpLmUuIGZvciB0aGUgY2FzZSB0aGF0IHRoZSB2YWx1ZQogICAgICAqIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFVOTkVDRVNTQVJZKEJpZ0RlY2ltYWwuUk9VTkRfVU5ORUNFU1NBUlkpOwogCkBAIC05NCwxNCArMTEwLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udmVydHMgcm91bmRpbmcgbW9kZSBjb25zdGFudHMgZnJvbSBjbGFzcyBCaWdEZWNpbWFsIGludG8KLSAgICAgKiBSb3VuZGluZ01vZGUgdmFsdWVzLgorICAgICAqIENvbnZlcnRzIHJvdW5kaW5nIG1vZGUgY29uc3RhbnRzIGZyb20gY2xhc3Mge0Bjb2RlIEJpZ0RlY2ltYWx9IGludG8KKyAgICAgKiB7QGNvZGUgUm91bmRpbmdNb2RlfSB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJNIHJvdW5kaW5nIG1vZGUgY29uc3RhbnQgYXMgZGVmaW5lZCBpbiBjbGFzcyBCaWdEZWNpbWFsCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgICAgICAgIHJvdW5kaW5nIG1vZGUgY29uc3RhbnQgYXMgZGVmaW5lZCBpbiBjbGFzcyB7QGNvZGUgQmlnRGVjaW1hbH0KICAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgcm91bmRpbmcgbW9kZSBvYmplY3QKKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJvdW5kaW5nTW9kZSB2YWx1ZU9mKGludCByTSkgewotICAgICAgICBzd2l0Y2ggKHJNKSB7CisgICAgcHVibGljIHN0YXRpYyBSb3VuZGluZ01vZGUgdmFsdWVPZihpbnQgbW9kZSkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gcGFyYW1ldGVyIG5hbWUgY2hhbmdlZC4KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQorICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgQmlnRGVjaW1hbC5ST1VORF9DRUlMSU5HOgogICAgICAgICAgICAgICAgIHJldHVybiBDRUlMSU5HOwogICAgICAgICAgICAgY2FzZSBCaWdEZWNpbWFsLlJPVU5EX0RPV046CmRpZmYgLS1naXQgYS9tYXRoL3NyYy9tYWluL2phdmEvamF2YS9tYXRoL3BhY2thZ2UuaHRtbCBiL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvcGFja2FnZS5odG1sCmluZGV4IDJkMjVlZDAuLmY2NDUwZDAgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvcGFja2FnZS5odG1sCisrKyBiL21hdGgvc3JjL21haW4vamF2YS9qYXZhL21hdGgvcGFja2FnZS5odG1sCkBAIC0xLDE1ICsxLDEzIEBACiA8aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiPgotPC9oZWFkPgotPGh0bWw+Ci08Ym9keT4KLTxwPgotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlcnMgYW5kIGRlY2ltYWxzLgotQ2xhc3Mge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfSBwcm92aWRlcyBpbnRlZ2VycyB3aGljaCBhcmUgbGltaXRlZCBieSB0aGUgYXZhaWxhYmxlIG1lbW9yeSBvbmx5LgotQ2xhc3Mge0BsaW5rIGphdmEubWF0aC5CaWdEZWNpbWFsfSBwcm92aWRlcyBhcmJpdHJhcnktcHJlY2lzaW9uIHNpZ25lZCBkZWNpbWFsIG51bWJlcnMuIFRoZXNlIG51bWJlcnMKLWFyZSBzdWl0YWJsZSBmb3IgY3VycmVuY3kgY2FsY3VsYXRpb25zLiBUaGUgdXNlciBoYXMgZnVsbCBjb250cm9sIG92ZXIgdGhlIHJvdW5kaW5nIGJlaGF2aW9yIChjb21wYXJhYmxlCi13aXRoIHRoZSBJRUVFNzU0UiByb3VuZGluZyBtb2Rlcy4KLTwvcD4KLTwvYm9keT4KKyAgPGJvZHk+CisgICAgUHJvdmlkZXMgYXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VycyBhbmQgZGVjaW1hbHMuCisgICAgQ2xhc3Mge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfSBwcm92aWRlcyBpbnRlZ2VycyB3aGljaCBhcmUgbGltaXRlZAorICAgIGJ5IHRoZSBhdmFpbGFibGUgbWVtb3J5IG9ubHkuCisgICAgQ2xhc3Mge0BsaW5rIGphdmEubWF0aC5CaWdEZWNpbWFsfSBwcm92aWRlcyBhcmJpdHJhcnktcHJlY2lzaW9uIHNpZ25lZAorICAgIGRlY2ltYWwgbnVtYmVycy4gVGhlc2UgbnVtYmVycyBhcmUgc3VpdGFibGUgZm9yIGN1cnJlbmN5IGNhbGN1bGF0aW9ucy4KKyAgICBUaGUgdXNlciBoYXMgZnVsbCBjb250cm9sIG92ZXIgdGhlIHJvdW5kaW5nIGJlaGF2aW9yIChjb21wYXJhYmxlIHdpdGgKKyAgICB0aGUgSUVFRTc1NFIgcm91bmRpbmcgbW9kZXMpLgorICAgIDxwPgorICAgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYXRoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L21hdGgvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEgYi9tYXRoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L21hdGgvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKaW5kZXggYjE2ODJhOS4uNGIwMDc1YSAxMDA2NDQKLS0tIGEvbWF0aC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9tYXRoL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCisrKyBiL21hdGgvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbWF0aC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQpAQCAtMjEsNiArMjEsMTAgQEAKICAqIGlmIHRoaXMgdG9vbCBydW5zIGFnYWluLiBCZXR0ZXIgbWFrZSBjaGFuZ2VzIGluIHRoZSB0ZW1wbGF0ZSBmaWxlLgogICovCiAKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gUmVkdW5kYW50IGNvZGUgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm93IGNhbGxlZCBmcm9tIE1zZ0hlbHAuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm1hdGguaW50ZXJuYWwubmxzOwogCiAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCkBAIC0xMjksNCArMTMzLDggQEAKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnLCBhcmdzKTsKICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KKworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIER1cGxpY2F0ZSBjb2RlIHdhcyBkcm9wcGVkIGluIGZhdm9yIG9mIHVzaW5nIE1zZ0hlbHAuCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogfQpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQWxsVGVzdHMuamF2YSBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxYjhmMAotLS0gL2Rldi9udWxsCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CisgKi8KKworcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKEFsbFRlc3RzLnN1aXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIHRlc3RzIGZvciBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnRGVjaW1hbEFyaXRobWV0aWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpZ0RlY2ltYWxDb21wYXJlVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCaWdEZWNpbWFsQ29uc3RydWN0b3JzVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCaWdEZWNpbWFsQ29udmVydFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnRGVjaW1hbFNjYWxlT3BlcmF0aW9uc1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnSW50ZWdlckFkZFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnSW50ZWdlckFuZFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnSW50ZWdlckNvbXBhcmVUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpZ0ludGVnZXJDb25zdHJ1Y3RvcnNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpZ0ludGVnZXJDb252ZXJ0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCaWdJbnRlZ2VyRGl2aWRlVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCaWdJbnRlZ2VySGFzaENvZGVUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpZ0ludGVnZXJNb2RQb3dUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpZ0ludGVnZXJNdWx0aXBseVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnSW50ZWdlck5vdFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnSW50ZWdlck9wZXJhdGVCaXRzVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCaWdJbnRlZ2VyT3JUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpZ0ludGVnZXJTdWJ0cmFjdFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmlnSW50ZWdlclRvU3RyaW5nVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCaWdJbnRlZ2VyWG9yVGVzdC5jbGFzcyk7CisKKyAgICAgICAgLy8gJEpVbml0LUVORCQKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxBcml0aG1ldGljVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnRGVjaW1hbEFyaXRobWV0aWNUZXN0LmphdmEKaW5kZXggYWEwYmFjMS4uOTI5YTg1ZiAxMDA2NDQKLS0tIGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnRGVjaW1hbEFyaXRobWV0aWNUZXN0LmphdmEKKysrIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnRGVjaW1hbEFyaXRobWV0aWNUZXN0LmphdmEKQEAgLTE3LDEzICsxNywxOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEubWF0aC5NYXRoQ29udGV4dDsKIGltcG9ydCBqYXZhLm1hdGguUm91bmRpbmdNb2RlOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEJpZ0RlY2ltYWwuY2xhc3MpCiAvKioKICAqIENsYXNzOiAgamF2YS5tYXRoLkJpZ0RlY2ltYWwKICAqIE1ldGhvZHM6IGFkZCwgc3VidHJhY3QsIG11bHRpcGx5LCBkaXZpZGUgCkBAIC0zMyw2ICszOSwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCB0d28gbnVtYmVycyBvZiBlcXVhbCBwb3NpdGl2ZSBzY2FsZXMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFkZCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRXF1YWxTY2FsZVBvc1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDsKQEAgLTUwLDYgKzY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQWRkIHR3byBudW1iZXJzIG9mIGVxdWFsIHBvc2l0aXZlIHNjYWxlcyB1c2luZyBNYXRoQ29udGV4dAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRNYXRoQ29udGV4dEVxdWFsU2NhbGVQb3NQb3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTA7CkBAIC02OCw2ICs5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCB0d28gbnVtYmVycyBvZiBlcXVhbCBuZWdhdGl2ZSBzY2FsZXMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRFcXVhbFNjYWxlTmVnTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0xMDsKQEAgLTg1LDYgKzExOCwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCB0d28gbnVtYmVycyBvZiBlcXVhbCBuZWdhdGl2ZSBzY2FsZXMgdXNpbmcgTWF0aENvbnRleHQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRNYXRoQ29udGV4dEVxdWFsU2NhbGVOZWdOZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTEwOwpAQCAtMTAzLDYgKzE0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCB0d28gbnVtYmVycyBvZiBkaWZmZXJlbnQgc2NhbGVzOyB0aGUgZmlyc3QgaXMgcG9zaXRpdmUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREaWZmU2NhbGVQb3NOZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTU7CkBAIC0xMjAsNiArMTcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQWRkIHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzY2FsZXMgdXNpbmcgTWF0aENvbnRleHQ7IHRoZSBmaXJzdCBpcyBwb3NpdGl2ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZE1hdGhDb250ZXh0RGlmZlNjYWxlUG9zTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDE1OwpAQCAtMTM4LDYgKzE5OCwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCB0d28gbnVtYmVycyBvZiBkaWZmZXJlbnQgc2NhbGVzOyB0aGUgZmlyc3QgaXMgbmVnYXRpdmUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREaWZmU2NhbGVOZWdQb3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTE1OwpAQCAtMTU1LDYgKzIyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCB0d28gemVyb2VzIG9mIGRpZmZlcmVudCBzY2FsZXM7IHRoZSBmaXJzdCBpcyBuZWdhdGl2ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZERpZmZTY2FsZVplcm9aZXJvKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIwIjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0xNTsKQEAgLTE3Miw2ICsyNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycyBvZiBlcXVhbCBwb3NpdGl2ZSBzY2FsZXMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFN1YnRyYWN0RXF1YWxTY2FsZVBvc1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDsKQEAgLTE4OSw2ICsyNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycyBvZiBlcXVhbCBwb3NpdGl2ZSBzY2FsZXMgdXNpbmcgTWF0aENvbnRleHQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdE1hdGhDb250ZXh0RXF1YWxTY2FsZVBvc1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDsKQEAgLTIwNyw2ICszMDMsMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycyBvZiBlcXVhbCBuZWdhdGl2ZSBzY2FsZXMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3RFcXVhbFNjYWxlTmVnTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0xMDsKQEAgLTIyNCw2ICszMjksMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycyBvZiBkaWZmZXJlbnQgc2NhbGVzOyB0aGUgZmlyc3QgaXMgcG9zaXRpdmUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3REaWZmU2NhbGVQb3NOZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTU7CkBAIC0yNDIsNiArMzU2LDE1IEBACiAgICAgICogU3VidHJhY3QgdHdvIG51bWJlcnMgb2YgZGlmZmVyZW50IHNjYWxlcyB1c2luZyBNYXRoQ29udGV4dDsKICAgICAgKiAgdGhlIGZpcnN0IGlzIHBvc2l0aXZlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdE1hdGhDb250ZXh0RGlmZlNjYWxlUG9zTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDE1OwpAQCAtMjYwLDYgKzM4MywxNSBAQAogICAgIC8qKgogICAgICAqIFN1YnRyYWN0IHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzY2FsZXM7IHRoZSBmaXJzdCBpcyBuZWdhdGl2ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VidHJhY3QiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdERpZmZTY2FsZU5lZ1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMTU7CkBAIC0yNzgsNiArNDEwLDE1IEBACiAgICAgICogU3VidHJhY3QgdHdvIG51bWJlcnMgb2YgZGlmZmVyZW50IHNjYWxlcyB1c2luZyBNYXRoQ29udGV4dDsKICAgICAgKiAgdGhlIGZpcnN0IGlzIG5lZ2F0aXZlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdE1hdGhDb250ZXh0RGlmZlNjYWxlTmVnUG9zKCkgewogICAgICAgICBTdHJpbmcgYSA9ICI5ODY3OTg2NTY2NzY3ODk3NjY2Nzg3Njc4NzYwNzg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTE1OwpAQCAtMjk2LDYgKzQzNywxNSBAQAogICAgIC8qKgogICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzIG9mIHBvc2l0aXZlIHNjYWxlcwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm11bHRpcGx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbHlTY2FsZVBvc1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxNTsKQEAgLTMxMyw2ICs0NjMsMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycyBvZiBwb3NpdGl2ZSBzY2FsZXMgdXNpbmcgTWF0aENvbnRleHQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm11bHRpcGx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseU1hdGhDb250ZXh0U2NhbGVQb3NQb3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjk3NjY1Njk2NzU2NTc4NzU1NDIzMzI1NDc2NTQ1NDI4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yNTsKQEAgLTMzMSw2ICs0OTAsMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycyBvZiBuZWdhdGl2ZSBzY2FsZXMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm11bHRpcGx5IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbHlFcXVhbFNjYWxlTmVnTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0xNTsKQEAgLTM0OCw2ICs1MTYsMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycyBvZiBkaWZmZXJlbnQgc2NhbGVzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtdWx0aXBseSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGx5RGlmZlNjYWxlUG9zTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDEwOwpAQCAtMzY1LDYgKzU0MiwxNSBAQAogICAgIC8qKgogICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzY2FsZXMgdXNpbmcgTWF0aENvbnRleHQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibXVsdGlwbHkiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGx5TWF0aENvbnRleHREaWZmU2NhbGVQb3NOZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjk4NzY2Nzc5NjU5Nzk3NTc2NTc2ODc2ODc2Nzg2Njc1NjgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDA7CkBAIC0zODMsNiArNTY5LDE1IEBACiAgICAgLyoqCiAgICAgICogTXVsdGlwbHkgdHdvIG51bWJlcnMgb2YgZGlmZmVyZW50IHNjYWxlcwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibXVsdGlwbHkiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseURpZmZTY2FsZU5lZ1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMTU7CkBAIC00MDAsNiArNTk1LDE1IEBACiAgICAgLyoqCiAgICAgICogTXVsdGlwbHkgdHdvIG51bWJlcnMgb2YgZGlmZmVyZW50IHNjYWxlcyB1c2luZyBNYXRoQ29udGV4dAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtdWx0aXBseSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbHlNYXRoQ29udGV4dERpZmZTY2FsZU5lZ1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiNDg4NzU3NDU4Njc2Nzk2NTU4NjY4ODc2NTc2NTc2NTc5MDk3MDI5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC02MzsKQEAgLTQxOCw2ICs2MjIsMTUgQEAKICAgICAvKioKICAgICAgKiBwb3coaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG93IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvdygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwIjsKICAgICAgICAgaW50IGFTY2FsZSA9IDEwOwpAQCAtNDM2LDYgKzY0OSwxNSBAQAogICAgIC8qKgogICAgICAqIHBvdygwKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3ciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG93MCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwIjsKICAgICAgICAgaW50IGFTY2FsZSA9IDEwOwpAQCAtNDUxLDYgKzY3MywxNSBAQAogICAgIC8qKgogICAgICAqIFpFUk8ucG93KDApCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvdyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RaZXJvUG93MCgpIHsKICAgICAgICAgU3RyaW5nIGMgPSAiMSI7CiAgICAgICAgIGludCBjU2NhbGUgPSAwOwpAQCAtNDYyLDYgKzY5MywxNSBAQAogICAgIC8qKgogICAgICAqIHBvdyhpbnQsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG93IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG93TWF0aENvbnRleHQoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MCI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDsKQEAgLTQ3OCw2ICs3MTgsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgYnkgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUJ5WmVybygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxNTsKQEAgLTQ5NCw2ICs3NDMsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgd2l0aCBST1VORF9VTk5FQ0VTU0FSWQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBvbmx5IGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVFeGNlcHRpb25STSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxNTsKQEAgLTUxMiw2ICs3NzAsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgd2l0aCBpbnZhbGlkIHJvdW5kaW5nIG1vZGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9ubHkgY2hlY2tlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUV4Y2VwdGlvbkludmFsaWRSTSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxNTsKQEAgLTUzMCw2ICs3OTcsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IGxvY2FsIHZhcmlhYmxlIGV4cG9uZW50IGlzIGxlc3MgdGhhbiB6ZXJvCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUV4cExlc3NaZXJvKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDE1OwpAQCAtNTQ3LDYgKzgyMywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogbG9jYWwgdmFyaWFibGUgZXhwb25lbnQgaXMgZXF1YWwgdG8gemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIFNob3VsZCBiZSBhZGRlZCBjaGVja2luZyBmb3IgQXJpdGhtZXRpY0V4Y2VwdGlvbiB0byBjb21wbGV0ZSBmdW5jdGlvbmFsIHRlc3RpbmcuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUV4cEVxdWFsc1plcm8oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTE1OwpAQCAtNTY0LDYgKzg0OSwxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogbG9jYWwgdmFyaWFibGUgZXhwb25lbnQgaXMgZ3JlYXRlciB0aGFuIHplcm8KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVFeHBHcmVhdGVyWmVybygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMTU7CkBAIC01ODEsNiArODc1LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByZW1haW5kZXIgaXMgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVJlbWFpbmRlcklzWmVybygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiODMxMTM4OTU3ODkwNDU1MzIwOTg3NDczNTQzMTExMCI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMTU7CkBAIC01OTgsNiArOTAxLDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByb3VuZGluZyBtb2RlIGlzIFJPVU5EX1VQLCByZXN1bHQgaXMgbmVnYXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZFVwTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtNjE1LDYgKzkyNywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9VUCwgcmVzdWx0IGlzIHBvc2l0aXZlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRVcFBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtNjMyLDYgKzk1MywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9ET1dOLCByZXN1bHQgaXMgbmVnYXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZERvd25OZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi05Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC02NDksNiArOTc5LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByb3VuZGluZyBtb2RlIGlzIFJPVU5EX0RPV04sIHJlc3VsdCBpcyBwb3NpdGl2ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVJvdW5kRG93blBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtNjY2LDYgKzEwMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IHJvdW5kaW5nIG1vZGUgaXMgUk9VTkRfRkxPT1IsIHJlc3VsdCBpcyBwb3NpdGl2ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVJvdW5kRmxvb3JQb3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yNDsKQEAgLTY4Myw2ICsxMDMxLDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByb3VuZGluZyBtb2RlIGlzIFJPVU5EX0ZMT09SLCByZXN1bHQgaXMgbmVnYXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZEZsb29yTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtNzAwLDYgKzEwNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IHJvdW5kaW5nIG1vZGUgaXMgUk9VTkRfQ0VJTElORywgcmVzdWx0IGlzIHBvc2l0aXZlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRDZWlsaW5nUG9zKCkgewogICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC03MTcsNiArMTA4MywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9DRUlMSU5HLCByZXN1bHQgaXMgbmVnYXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZENlaWxpbmdOZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi05Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC03MzQsNiArMTEwOSwxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9IQUxGX1VQLCByZXN1bHQgaXMgcG9zaXRpdmU7IGRpc3RhbmNlID0gLTEKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZEhhbGZVcFBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtNzUxLDcgKzExMzUsMTYgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IHJvdW5kaW5nIG1vZGUgaXMgUk9VTkRfSEFMRl9VUCwgcmVzdWx0IGlzIG5lZ2F0aXZlOyBkaXN0YW5jZSA9IC0xCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVJvdW5kSGFsZlVwTmVnKCkgeworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgcHVibGljIHZvaWQgdGVzdERpdmlkZVJvdW5kSGFsZlVwTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwogICAgICAgICBTdHJpbmcgYiA9ICI3NDcyMzM0MjIzODQ3NjIzNzgyMzc1NDY5MjkzMDE4Nzg3OTE4MzQ3OTg3MjM0NTY0NTY4IjsKQEAgLTc2OCw2ICsxMTYxLDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByb3VuZGluZyBtb2RlIGlzIFJPVU5EX0hBTEZfVVAsIHJlc3VsdCBpcyBwb3NpdGl2ZTsgZGlzdGFuY2UgPSAxCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRIYWxmVXBQb3MxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg1NTQ2NDUzNTYzNDUzNDU2MzQ1NiI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC03ODUsNiArMTE4NywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9IQUxGX1VQLCByZXN1bHQgaXMgbmVnYXRpdmU7IGRpc3RhbmNlID0gMQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVJvdW5kSGFsZlVwTmVnMSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODU1NDY0NTM1NjM0NTM0NTYzNDU2IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yNDsKQEAgLTgwMiw2ICsxMjEzLDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByb3VuZGluZyBtb2RlIGlzIFJPVU5EX0hBTEZfVVAsIHJlc3VsdCBpcyBuZWdhdGl2ZTsgZXF1aWRpc3RhbnQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZEhhbGZVcE5lZzIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0zNzM2MTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDsKQEAgLTgxOSw2ICsxMjM5LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByb3VuZGluZyBtb2RlIGlzIFJPVU5EX0hBTEZfRE9XTiwgcmVzdWx0IGlzIHBvc2l0aXZlOyBkaXN0YW5jZSA9IC0xCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRIYWxmRG93blBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtODM2LDYgKzEyNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IHJvdW5kaW5nIG1vZGUgaXMgUk9VTkRfSEFMRl9ET1dOLCByZXN1bHQgaXMgbmVnYXRpdmU7IGRpc3RhbmNlID0gLTEKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZEhhbGZEb3duTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtODUzLDYgKzEyOTEsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IHJvdW5kaW5nIG1vZGUgaXMgUk9VTkRfSEFMRl9ET1dOLCByZXN1bHQgaXMgcG9zaXRpdmU7IGRpc3RhbmNlID0gMQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVJvdW5kSGFsZkRvd25Qb3MxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg1NTQ2NDUzNTYzNDUzNDU2MzQ1NiI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC04NzAsNiArMTMxNywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9IQUxGX0RPV04sIHJlc3VsdCBpcyBuZWdhdGl2ZTsgZGlzdGFuY2UgPSAxCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRIYWxmRG93bk5lZzEoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi05Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg1NTQ2NDUzNTYzNDUzNDU2MzQ1NiI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC04ODcsNiArMTM0MywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9IQUxGX1VQLCByZXN1bHQgaXMgbmVnYXRpdmU7IGVxdWlkaXN0YW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRIYWxmRG93bk5lZzIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0zNzM2MTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDsKQEAgLTkwNCw2ICsxMzY5LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlOiByb3VuZGluZyBtb2RlIGlzIFJPVU5EX0hBTEZfRVZFTiwgcmVzdWx0IGlzIHBvc2l0aXZlOyBkaXN0YW5jZSA9IC0xCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRIYWxmRXZlblBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtOTIxLDYgKzEzOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IHJvdW5kaW5nIG1vZGUgaXMgUk9VTkRfSEFMRl9FVkVOLCByZXN1bHQgaXMgbmVnYXRpdmU7IGRpc3RhbmNlID0gLTEKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZEhhbGZFdmVuTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtOTM4LDYgKzE0MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGU6IHJvdW5kaW5nIG1vZGUgaXMgUk9VTkRfSEFMRl9FVkVOLCByZXN1bHQgaXMgcG9zaXRpdmU7IGRpc3RhbmNlID0gMQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJST1VORF9VTk5FQ0VTU0FSWSBhbmQgZXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVJvdW5kSGFsZkV2ZW5Qb3MxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg1NTQ2NDUzNTYzNDUzNDU2MzQ1NiI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC05NTUsNiArMTQ0NywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9IQUxGX0VWRU4sIHJlc3VsdCBpcyBuZWdhdGl2ZTsgZGlzdGFuY2UgPSAxCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJPVU5EX1VOTkVDRVNTQVJZIGFuZCBleGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlUm91bmRIYWxmRXZlbk5lZzEoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi05Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg1NTQ2NDUzNTYzNDUzNDU2MzQ1NiI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC05NzIsNiArMTQ3MywxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZTogcm91bmRpbmcgbW9kZSBpcyBST1VORF9IQUxGX0VWRU4sIHJlc3VsdCBpcyBuZWdhdGl2ZTsgZXF1aWRpc3RhbnQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiUk9VTkRfVU5ORUNFU1NBUlkgYW5kIGV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVSb3VuZEhhbGZFdmVuTmVnMigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTM3MzYxNjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDEwOwpAQCAtOTg5LDYgKzE0OTksMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgdG8gQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiQ29tbW9uIGZ1bmN0aW9uYWxpdHkgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUJpZ0RlY2ltYWwxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMzczNjE2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBpbnQgYVNjYWxlID0gMTA7CkBAIC0xMDA2LDYgKzE1MjUsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgdG8gQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJDb21tb24gZnVuY3Rpb25hbGl0eSBjaGVja2VkIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlQmlnRGVjaW1hbDIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0zNzM2MTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDsKQEAgLTEwMjMsNiArMTU1MSwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZShCaWdEZWNpbWFsLCBzY2FsZSwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBhbmQgVU5ORUNFU1NBUlkgcm91bmQgbW9kZSBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVCaWdEZWNpbWFsU2NhbGVSb3VuZGluZ01vZGVVUCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTM3MzYxNjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDEwOwpAQCAtMTA0MSw2ICsxNTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlKEJpZ0RlY2ltYWwsIHNjYWxlLCBSb3VuZGluZ01vZGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gYW5kIFVOTkVDRVNTQVJZIHJvdW5kIG1vZGUgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgamF2YS5tYXRoLlJvdW5kaW5nTW9kZS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlQmlnRGVjaW1hbFNjYWxlUm91bmRpbmdNb2RlRE9XTigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTM3MzYxNjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDEwOwpAQCAtMTA1OSw2ICsxNjA1LDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlKEJpZ0RlY2ltYWwsIHNjYWxlLCBSb3VuZGluZ01vZGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gYW5kIFVOTkVDRVNTQVJZIHJvdW5kIG1vZGUgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgamF2YS5tYXRoLlJvdW5kaW5nTW9kZS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlQmlnRGVjaW1hbFNjYWxlUm91bmRpbmdNb2RlQ0VJTElORygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDA7CkBAIC0xMDc3LDYgKzE2MzIsMTUgQEAKICAgICAvKioKICAgICAgKiBkaXZpZGUoQmlnRGVjaW1hbCwgc2NhbGUsIFJvdW5kaW5nTW9kZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBhbmQgVU5ORUNFU1NBUlkgcm91bmQgbW9kZSBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBqYXZhLm1hdGguUm91bmRpbmdNb2RlLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVCaWdEZWNpbWFsU2NhbGVSb3VuZGluZ01vZGVGTE9PUigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDA7CkBAIC0xMDk1LDYgKzE2NTksMTUgQEAKICAgICAvKioKICAgICAgKiBkaXZpZGUoQmlnRGVjaW1hbCwgc2NhbGUsIFJvdW5kaW5nTW9kZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBhbmQgVU5ORUNFU1NBUlkgcm91bmQgbW9kZSBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzLCBqYXZhLm1hdGguUm91bmRpbmdNb2RlLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVCaWdEZWNpbWFsU2NhbGVSb3VuZGluZ01vZGVIQUxGX1VQKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC01MTsKQEAgLTExMTUsNiArMTY4OCwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZShCaWdEZWNpbWFsLCBzY2FsZSwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGFuZCBVTk5FQ0VTU0FSWSByb3VuZCBtb2RlIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUJpZ0RlY2ltYWxTY2FsZVJvdW5kaW5nTW9kZUhBTEZfRE9XTigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA1OwpAQCAtMTEzMyw2ICsxNzE1LDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlKEJpZ0RlY2ltYWwsIHNjYWxlLCBSb3VuZGluZ01vZGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gYW5kIFVOTkVDRVNTQVJZIHJvdW5kIG1vZGUgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGludC5jbGFzcywgamF2YS5tYXRoLlJvdW5kaW5nTW9kZS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlQmlnRGVjaW1hbFNjYWxlUm91bmRpbmdNb2RlSEFMRl9FVkVOKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDU7CkBAIC0xMTUxLDYgKzE3NDIsMTUgQEAKICAgICAvKioKICAgICAgKiBkaXZpZGUoQmlnRGVjaW1hbCwgTWF0aENvbnRleHQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUJpZ0RlY2ltYWxTY2FsZU1hdGhDb250ZXh0VVAoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBpbnQgYVNjYWxlID0gMTU7CkBAIC0xMTcxLDYgKzE3NzEsMTUgQEAKICAgICAvKioKICAgICAgKiBkaXZpZGUoQmlnRGVjaW1hbCwgTWF0aENvbnRleHQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlQmlnRGVjaW1hbFNjYWxlTWF0aENvbnRleHRET1dOKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDE1OwpAQCAtMTE5MSw2ICsxODAwLDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlKEJpZ0RlY2ltYWwsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUJpZ0RlY2ltYWxTY2FsZU1hdGhDb250ZXh0Q0VJTElORygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxNTsKQEAgLTEyMTEsNiArMTgyOSwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZShCaWdEZWNpbWFsLCBNYXRoQ29udGV4dCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVCaWdEZWNpbWFsU2NhbGVNYXRoQ29udGV4dEZMT09SKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDE1OwpAQCAtMTIzMSw2ICsxODU4LDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlKEJpZ0RlY2ltYWwsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUJpZ0RlY2ltYWxTY2FsZU1hdGhDb250ZXh0SEFMRl9VUCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTEyNTEsNiArMTg4NywxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZShCaWdEZWNpbWFsLCBNYXRoQ29udGV4dCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVCaWdEZWNpbWFsU2NhbGVNYXRoQ29udGV4dEhBTEZfRE9XTigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTEyNzEsNiArMTkxNiwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZShCaWdEZWNpbWFsLCBNYXRoQ29udGV4dCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVCaWdEZWNpbWFsU2NhbGVNYXRoQ29udGV4dEhBTEZfRVZFTigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTEyOTEsNiArMTk0NSwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZVRvSW50ZWdyYWxWYWx1ZShCaWdEZWNpbWFsKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlVG9JbnRlZ3JhbFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlVG9JbnRlZ3JhbFZhbHVlKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDQ1OwpAQCAtMTMwOCw2ICsxOTcxLDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKEJpZ0RlY2ltYWwsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlVG9JbnRlZ3JhbFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVUb0ludGVncmFsVmFsdWVNYXRoQ29udGV4dFVQKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDQ1OwpAQCAtMTMyOCw2ICsyMDAwLDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKEJpZ0RlY2ltYWwsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGVUb0ludGVncmFsVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZVRvSW50ZWdyYWxWYWx1ZU1hdGhDb250ZXh0RE9XTigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2OTY3NTc4NTQzNTY3MzQ1MzQ1MzY1MzU0MzY1NDM1NDM2NTQzNTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTEzNDgsNiArMjAyOSwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZUFuZFJlbWFpbmRlcihCaWdEZWNpbWFsKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlQW5kUmVtYWluZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlQW5kUmVtYWluZGVyMSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTEzNjksNiArMjA1OSwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZUFuZFJlbWFpbmRlcihCaWdEZWNpbWFsKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGVBbmRSZW1haW5kZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVBbmRSZW1haW5kZXIyKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC00NTsKQEAgLTEzOTIsNiArMjA5MSwxNSBAQAogICAgIC8qKgogICAgICAqIGRpdmlkZUFuZFJlbWFpbmRlcihCaWdEZWNpbWFsLCBNYXRoQ29udGV4dCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlQW5kUmVtYWluZGVyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVBbmRSZW1haW5kZXJNYXRoQ29udGV4dFVQKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDQ1OwpAQCAtMTQxNiw2ICsyMTI0LDE1IEBACiAgICAgLyoqCiAgICAgICogZGl2aWRlQW5kUmVtYWluZGVyKEJpZ0RlY2ltYWwsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGVBbmRSZW1haW5kZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUFuZFJlbWFpbmRlck1hdGhDb250ZXh0RE9XTigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTE0NDAsNiArMjE1NywxNSBAQAogICAgIC8qKgogICAgICAqIHJlbWFpbmRlcihCaWdEZWNpbWFsKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVyMSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTE0NTcsNiArMjE4MywxNSBAQAogICAgIC8qKgogICAgICAqIHJlbWFpbmRlcihCaWdEZWNpbWFsKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1haW5kZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1haW5kZXIyKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC00NTsKQEAgLTE0NzQsNiArMjIwOSwxNSBAQAogICAgIC8qKgogICAgICAqIHJlbWFpbmRlcihCaWdEZWNpbWFsLCBNYXRoQ29udGV4dCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluZGVyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1haW5kZXJNYXRoQ29udGV4dEhBTEZfVVAoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBpbnQgYVNjYWxlID0gNDU7CkBAIC0xNDk0LDYgKzIyMzgsMTUgQEAKICAgICAvKioKICAgICAgKiByZW1haW5kZXIoQmlnRGVjaW1hbCwgTWF0aENvbnRleHQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlbWFpbmRlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVyTWF0aENvbnRleHRIQUxGX0RPV04oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBpbnQgYVNjYWxlID0gLTQ1OwpAQCAtMTUxNCw2ICsyMjY3LDE1IEBACiAgICAgLyoqCiAgICAgICogcm91bmQoQmlnRGVjaW1hbCwgTWF0aENvbnRleHQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb3VuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZE1hdGhDb250ZXh0SEFMRl9ET1dOKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIzNzM2MTg2NTY3ODc2ODc2NTc4OTU2OTU4NzY1Njc1NjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC00NTsKQEAgLTE1MzEsNiArMjI5MywxNSBAQAogICAgIC8qKgogICAgICAqIHJvdW5kKEJpZ0RlY2ltYWwsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb3VuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZE1hdGhDb250ZXh0SEFMRl9VUCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTE1NDgsNiArMjMxOSwxNSBAQAogICAgIC8qKgogICAgICAqIHJvdW5kKEJpZ0RlY2ltYWwsIE1hdGhDb250ZXh0KSB3aGVuIHByZWNpc2lvbiA9IDAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicm91bmQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmRNYXRoQ29udGV4dFByZWNpc2lvbjAoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBpbnQgYVNjYWxlID0gNDU7CkBAIC0xNTY0LDYgKzIzNDQsMTUgQEAKICAgICAvKioKICAgICAgKiB1bHAoKSBvZiBhIHBvc2l0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHVscCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidWxwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVscFBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtNDU7CkBAIC0xNTc4LDYgKzIzNjcsMTUgQEAKICAgICAvKioKICAgICAgKiB1bHAoKSBvZiBhIG5lZ2F0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdWxwIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bHAiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VWxwTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0NTsKQEAgLTE1OTIsNiArMjM5MCwxNSBAQAogICAgIC8qKgogICAgICAqIHVscCgpIG9mIGEgbmVnYXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB1bHAgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInVscCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVbHBaZXJvKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIwIjsKICAgICAgICAgaW50IGFTY2FsZSA9IDI7CkBAIC0xNjA4LDYgKzI0MTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjYWRkKGphdmEubWF0aC5CaWdEZWNpbWFsKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRCaWdEZWNpbWFsKCkgewogICAgICAgICBCaWdEZWNpbWFsIGFkZDEgPSBuZXcgQmlnRGVjaW1hbCgiMjMuNDU2Iik7CiAgICAgICAgIEJpZ0RlY2ltYWwgYWRkMiA9IG5ldyBCaWdEZWNpbWFsKCIzODQ5LjIzNSIpOwpAQCAtMTYyNiw2ICsyNDQyLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2RpdmlkZShqYXZhLm1hdGguQmlnRGVjaW1hbCwKICAgICAgKiAgICAgICAgamF2YS5tYXRoLk1hdGhDb250ZXh0KSBkaXZpZGUoQmlnRGVjaW1hbCwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRGl2aWRlQmlnRGVjaW1hbFJvdW5kaW5nTW9kZVVQKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMzczNjE2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBTdHJpbmcgYiA9ICI3NDcyMzM0MjIzODQ3NjIzNzgyMzc4Nzg3OTE4MzQ3MCI7CkBAIC0xNjQxLDYgKzI0NjYsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjZGl2aWRlKGphdmEubWF0aC5CaWdEZWNpbWFsLAogICAgICAqICAgICAgICBqYXZhLm1hdGguUm91bmRpbmdNb2RlKSBkaXZpZGUoQmlnRGVjaW1hbCwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9EaXZpZGVCaWdEZWNpbWFsUm91bmRpbmdNb2RlRE9XTigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTM3MzYxNjcxMTE5MjM4MTE4OTExODkzOTM5NTkxNzM1IjsKICAgICAgICAgU3RyaW5nIGIgPSAiNzQ3MjMzNDIyMzg0NzYyMzc4MjM3ODc4NzkxODM0NzAiOwpAQCAtMTY1Niw2ICsyNDkwLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2RpdmlkZShqYXZhLm1hdGguQmlnRGVjaW1hbCwKICAgICAgKiAgICAgICAgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSkgZGl2aWRlKEJpZ0RlY2ltYWwsIFJvdW5kaW5nTW9kZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBqYXZhLm1hdGguUm91bmRpbmdNb2RlLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRGl2aWRlQmlnRGVjaW1hbFJvdW5kaW5nTW9kZUNFSUxJTkcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBTdHJpbmcgYiA9ICI3NDcyMzM0MjIzODQ3NjIzNzgyMzc4Nzg3OTE4MzQ3MCI7CkBAIC0xNjcxLDYgKzI1MTQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjZGl2aWRlKGphdmEubWF0aC5CaWdEZWNpbWFsLAogICAgICAqICAgICAgICBqYXZhLm1hdGguUm91bmRpbmdNb2RlKSBkaXZpZGUoQmlnRGVjaW1hbCwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9EaXZpZGVCaWdEZWNpbWFsUm91bmRpbmdNb2RlRkxPT1IoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBTdHJpbmcgYiA9ICI3NDcyMzM0MjIzODQ3NjIzNzgyMzc4Nzg3OTE4MzQ3MCI7CkBAIC0xNjg2LDYgKzI1MzgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjZGl2aWRlKGphdmEubWF0aC5CaWdEZWNpbWFsLAogICAgICAqICAgICAgICBqYXZhLm1hdGguUm91bmRpbmdNb2RlKSBkaXZpZGUoQmlnRGVjaW1hbCwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9EaXZpZGVCaWdEZWNpbWFsUm91bmRpbmdNb2RlSEFMRl9VUCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMzczNjE4NjU2Nzg3Njg3NjU3ODk1Njk1ODc2NTY3NTY3MTExOTIzODExODkxMTg5MzkzOTU5MTczNSI7CiAgICAgICAgIFN0cmluZyBiID0gIjc0NzIzMzQyMjM4NDc2MjM3ODIzNzg3ODc5MTgzNDcwIjsKQEAgLTE3MDEsNiArMjU2MiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNkaXZpZGUoamF2YS5tYXRoLkJpZ0RlY2ltYWwsCiAgICAgICogICAgICAgIGphdmEubWF0aC5Sb3VuZGluZ01vZGUpIGRpdmlkZShCaWdEZWNpbWFsLCBSb3VuZGluZ01vZGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLlJvdW5kaW5nTW9kZS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0RpdmlkZUJpZ0RlY2ltYWxSb3VuZGluZ01vZGVIQUxGX0RPV04oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBpbnQgYVNjYWxlID0gNTsKQEAgLTE3MjAsNiArMjU5MCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNkaXZpZGUoamF2YS5tYXRoLkJpZ0RlY2ltYWwsCiAgICAgICogICAgICAgIGphdmEubWF0aC5Sb3VuZGluZ01vZGUpIGRpdmlkZShCaWdEZWNpbWFsLCBSb3VuZGluZ01vZGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgamF2YS5tYXRoLlJvdW5kaW5nTW9kZS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0RpdmlkZUJpZ0RlY2ltYWxSb3VuZGluZ01vZGVIQUxGX0VWRU4oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBTdHJpbmcgYiA9ICI3NDcyMzM0MjIzODQ3NjIzNzgyMzc4Nzg3OTE4MzQ3MCI7CkBAIC0xNzM1LDYgKzI2MTQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjZGl2aWRlKGphdmEubWF0aC5CaWdEZWNpbWFsLAogICAgICAqICAgICAgICBqYXZhLm1hdGguUm91bmRpbmdNb2RlKSBkaXZpZGUoQmlnRGVjaW1hbCwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9EaXZpZGVCaWdEZWNpbWFsUm91bmRpbmdFeGMoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjM3MzYxODY1Njc4NzY4NzY1Nzg5NTY5NTg3NjU2NzU2NzExMTkyMzgxMTg5MTE4OTM5Mzk1OTE3MzUiOwogICAgICAgICBTdHJpbmcgYiA9ICI3NDcyMzM0MjIzODQ3NjIzNzgyMzc4Nzg3OTE4MzQ3MCI7CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdEZWNpbWFsQ29tcGFyZVRlc3QuamF2YSBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxDb21wYXJlVGVzdC5qYXZhCmluZGV4IGIwYjVlMjIuLmZlMTlhOTMgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxDb21wYXJlVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxDb21wYXJlVGVzdC5qYXZhCkBAIC0yMSwxMyArMjEsMTggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5tYXRoLk1hdGhDb250ZXh0OwogaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGU7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnRGVjaW1hbC5jbGFzcykKIC8qKgogICogQ2xhc3M6ICBqYXZhLm1hdGguQmlnRGVjaW1hbAogICogTWV0aG9kczogYWJzLCBjb21wYXJlVG8sIGVxdWFscywgaGFzaENvZGUsIApAQCAtMzcsNiArNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBBYnMoKSBvZiBhIG5lZ2F0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFicyBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFic05lZygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMjEiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTQ3LDYgKzYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQWJzKCkgb2YgYSBwb3NpdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFicyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFic1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNTcsNiArODAsMTUgQEAKICAgICAvKioKICAgICAgKiBBYnMoTWF0aENvbnRleHQpIG9mIGEgbmVnYXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFic01hdGhDb250ZXh0TmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNzMsNiArMTA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQWJzKE1hdGhDb250ZXh0KSBvZiBhIHBvc2l0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFic01hdGhDb250ZXh0UG9zKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFKzIxIjsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoYSk7CkBAIC04OSw2ICsxMzAsMTUgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlIHRvIGEgbnVtYmVyIG9mIGFuIGVxdWFsIHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVFcXVhbFNjYWxlMSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTg7CkBAIC0xMDMsNiArMTUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZSB0byBhIG51bWJlciBvZiBhbiBlcXVhbCBzY2FsZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVFcXVhbFNjYWxlMigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTg7CkBAIC0xMTcsNiArMTc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZSB0byBhIG51bWJlciBvZiBhbiBncmVhdGVyIHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNvbXBhcmVUbyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUdyZWF0ZXJTY2FsZTEoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNTYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDI4OwpAQCAtMTMxLDYgKzE5OSwxNSBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmUgdG8gYSBudW1iZXIgb2YgYW4gZ3JlYXRlciBzY2FsZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVHcmVhdGVyU2NhbGUyKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzU2MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSA0ODsKQEAgLTE0NSw2ICsyMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlIHRvIGEgbnVtYmVyIG9mIGFuIGxlc3Mgc2NhbGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY29tcGFyZVRvIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTGVzc1NjYWxlMSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTg7CkBAIC0xNTksNiArMjQ1LDE1IEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZSB0byBhIG51bWJlciBvZiBhbiBsZXNzIHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNvbXBhcmVUbyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUxlc3NTY2FsZTIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczIjsKICAgICAgICAgaW50IGFTY2FsZSA9IDM2OwpAQCAtMTczLDYgKzI2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEVxdWFscygpIGZvciB1bmVxdWFsIEJpZ0RlY2ltYWxzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBlcXVhbHMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzVW5lcXVhbDEoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC0xODYsNiArMjkwLDE1IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxzKCkgZm9yIHVuZXF1YWwgQmlnRGVjaW1hbHMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZXF1YWxzIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc1VuZXF1YWwyKCkgewogICAgICAgIFN0cmluZyBhID0gIjkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtMTk5LDYgKzMxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEVxdWFscygpIGZvciB1bmVxdWFsIEJpZ0RlY2ltYWxzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGVxdWFscyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNVbmVxdWFsMygpIHsKICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IC0yNDsKQEAgLTIxMCw2ICszMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBlcXVhbHMoKSBmb3IgZXF1YWwgQmlnRGVjaW1hbHMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZXF1YWxzIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0VxdWFsKCkgewogICAgICAgIFN0cmluZyBhID0gIjkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICBpbnQgYVNjYWxlID0gLTI0OwpAQCAtMjIzLDYgKzM1NCwxNSBAQAogICAgIC8qKgogICAgICAqIGVxdWFscygpIGZvciBlcXVhbCBCaWdEZWNpbWFscwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBlcXVhbHMgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzTnVsbCgpIHsKICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IC0yNDsKQEAgLTIzMyw2ICszNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBoYXNoQ29kZSgpIGZvciBlcXVhbCBCaWdEZWNpbWFscwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgaGFzaENvZGUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlRXF1YWwoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSAtMjQ7CkBAIC0yNDYsNiArMzk1LDE1IEBACiAgICAgLyoqCiAgICAgICogaGFzaENvZGUoKSBmb3IgdW5lcXVhbCBCaWdEZWNpbWFscwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBoYXNoQ29kZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVVbmVxdWFsKCkgewogICAgICAgIFN0cmluZyBhID0gIjg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSA0MTsKQEAgLTI1OSw2ICs0MTcsMTUgQEAKICAgICAvKioKICAgICAgKiBtYXgoKSBmb3IgZXF1YWwgQmlnRGVjaW1hbHMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1heCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4RXF1YWwoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IDQxOwpAQCAtMjc1LDYgKzQ0MiwxNSBAQAogICAgIC8qKgogICAgICAqIG1heCgpIGZvciB1bmVxdWFsIEJpZ0RlY2ltYWxzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1heCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4VW5lcXVhbDEoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSAyNDsKQEAgLTI5MSw2ICs0NjcsMTUgQEAKICAgICAvKioKICAgICAgKiBtYXgoKSBmb3IgdW5lcXVhbCBCaWdEZWNpbWFscwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtYXggbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1heCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1heFVuZXF1YWwyKCkgewogICAgICAgIFN0cmluZyBhID0gIjkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICBpbnQgYVNjYWxlID0gNDE7CkBAIC0zMDcsNiArNDkyLDE1IEBACiAgICAgLyoqCiAgICAgICogbWluKCkgZm9yIGVxdWFsIEJpZ0RlY2ltYWxzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1pbiBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluRXF1YWwoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IDQxOwpAQCAtMzIzLDYgKzUxNywxNSBAQAogICAgIC8qKgogICAgICAqIG1pbigpIGZvciB1bmVxdWFsIEJpZ0RlY2ltYWxzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1pbiBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluVW5lcXVhbDEoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSAyNDsKQEAgLTMzOSw2ICs1NDIsMTUgQEAKICAgICAvKioKICAgICAgKiBtaW4oKSBmb3IgdW5lcXVhbCBCaWdEZWNpbWFscwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtaW4gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1pbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1pblVuZXF1YWwyKCkgewogICAgICAgIFN0cmluZyBhID0gIjkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICBpbnQgYVNjYWxlID0gNDE7CkBAIC0zNTUsNiArNTY3LDE1IEBACiAgICAgLyoqCiAgICAgICogcGx1cygpIGZvciBhIHBvc2l0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHBsdXMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBsdXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1c1Bvc2l0aXZlKCkgewogICAgICAgIFN0cmluZyBhID0gIjkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICBpbnQgYVNjYWxlID0gNDE7CkBAIC0zNjgsNiArNTg5LDE1IEBACiAgICAgLyoqCiAgICAgICogcGx1cyhNYXRoQ29udGV4dCkgZm9yIGEgcG9zaXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGx1cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzTWF0aENvbnRleHRQb3NpdGl2ZSgpIHsKICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IDQxOwpAQCAtMzg1LDYgKzYxNSwxNSBAQAogICAgIC8qKgogICAgICAqIHBsdXMoKSBmb3IgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHBsdXMgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBsdXMiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1c05lZ2F0aXZlKCkgewogICAgICAgIFN0cmluZyBhID0gIi05Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IDQxOwpAQCAtMzk4LDYgKzYzNywxNSBAQAogICAgIC8qKgogICAgICAqIHBsdXMoTWF0aENvbnRleHQpIGZvciBhIG5lZ2F0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGx1cyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzTWF0aENvbnRleHROZWdhdGl2ZSgpIHsKICAgICAgICBTdHJpbmcgYSA9ICItOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSA0OTsKQEAgLTQxNSw2ICs2NjMsMTUgQEAKICAgICAvKioKICAgICAgKiBuZWdhdGUoKSBmb3IgYSBwb3NpdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBuZWdhdGUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5lZ2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGVQb3NpdGl2ZSgpIHsKICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IDQxOwpAQCAtNDI4LDYgKzY4NSwxNSBAQAogICAgIC8qKgogICAgICAqIG5lZ2F0ZShNYXRoQ29udGV4dCkgZm9yIGEgcG9zaXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmVnYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0ZU1hdGhDb250ZXh0UG9zaXRpdmUoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSA0MTsKQEAgLTQ0NSw2ICs3MTEsMTUgQEAKICAgICAvKioKICAgICAgKiBuZWdhdGUoKSBmb3IgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG5lZ2F0ZSBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmVnYXRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0ZU5lZ2F0aXZlKCkgewogICAgICAgIFN0cmluZyBhID0gIi05Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IDQxOwpAQCAtNDU4LDYgKzczMywxNSBAQAogICAgIC8qKgogICAgICAqIG5lZ2F0ZShNYXRoQ29udGV4dCkgZm9yIGEgbmVnYXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZWdhdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRlTWF0aENvbnRleHROZWdhdGl2ZSgpIHsKICAgICAgICBTdHJpbmcgYSA9ICItOTI5NDg3ODIwOTQ0ODg0NzgyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgIGludCBhU2NhbGUgPSA0OTsKQEAgLTQ3NSw2ICs3NTksMTUgQEAKICAgICAvKioKICAgICAgKiBzaWdudW0oKSBmb3IgYSBwb3NpdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaWdudW0gbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpZ251bSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWdudW1Qb3NpdGl2ZSgpIHsKICAgICAgICBTdHJpbmcgYSA9ICI5Mjk0ODc4MjA5NDQ4ODQ3ODIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgaW50IGFTY2FsZSA9IDQxOwpAQCAtNDg1LDYgKzc3OCwxNSBAQAogICAgIC8qKgogICAgICAqIHNpZ251bSgpIGZvciBhIG5lZ2F0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2lnbnVtIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaWdudW0iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbnVtTmVnYXRpdmUoKSB7CiAgICAgICAgU3RyaW5nIGEgPSAiLTkyOTQ4NzgyMDk0NDg4NDc4MjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICBpbnQgYVNjYWxlID0gNDE7CkBAIC00OTUsNiArNzk3LDE1IEBACiAgICAgLyoqCiAgICAgICogc2lnbnVtKCkgZm9yIHplcm8KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2lnbnVtIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaWdudW0iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbnVtWmVybygpIHsKICAgICAgICBTdHJpbmcgYSA9ICIwIjsKICAgICAgICBpbnQgYVNjYWxlID0gNDE7CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdEZWNpbWFsQ29uc3RydWN0b3JzVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnRGVjaW1hbENvbnN0cnVjdG9yc1Rlc3QuamF2YQppbmRleCBjMGUzMGEyLi40NDk2NmUzIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdEZWNpbWFsQ29uc3RydWN0b3JzVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxDb25zdHJ1Y3RvcnNUZXN0LmphdmEKQEAgLTIxLDEzICsyMSwxOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLm1hdGguTWF0aENvbnRleHQ7CiBpbXBvcnQgamF2YS5tYXRoLlJvdW5kaW5nTW9kZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhCaWdEZWNpbWFsLmNsYXNzKQogLyoqCiAgKiBDbGFzczogIGphdmEubWF0aC5CaWdEZWNpbWFsCiAgKiBNZXRob2RzOiBjb25zdHJ1Y3RvcnMgYW5kIGZpZWxkcwpAQCAtNjYsNiArNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyIHZhbHVlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJCSSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIEJpZ0ludGVnZXIgYkEgPSBuZXcgQmlnSW50ZWdlcihhKTsKQEAgLTg0LDYgKzk4LDE1IEBACiAgICAgLyoqCiAgICAgICogbmV3IEJpZ0RlY2ltYWwoQmlnSW50ZWdlciB2YWx1ZSwgaW50IHNjYWxlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckJJU2NhbGUoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBCaWdJbnRlZ2VyIGJBID0gbmV3IEJpZ0ludGVnZXIoYSk7CkBAIC05Niw2ICsxMTksMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyIHZhbHVlLCBNYXRoQ29udGV4dCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckJpZ0ludGVnZXJNYXRoQ29udGV4dCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIEJpZ0ludGVnZXIgYkEgPSBuZXcgQmlnSW50ZWdlcihhKTsKQEAgLTExMiw2ICsxNDQsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyIHZhbHVlLCBpbnQgc2NhbGUsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgaW50LmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJCaWdJbnRlZ2VyU2NhbGVNYXRoQ29udGV4dCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIEJpZ0ludGVnZXIgYkEgPSBuZXcgQmlnSW50ZWdlcihhKTsKQEAgLTEyOSw2ICsxNzAsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChjaGFyW10gdmFsdWUpOyAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckNoYXIoKSB7CiAgICAgICAgIGNoYXIgdmFsdWVbXSA9IHsnLScsICcxJywgJzInLCAnMycsICc4JywgJzAnLCAnLicsICc0JywgJzcnLCAnMycsICc4JywgJ0UnLCAnLScsICc0JywgJzInLCAnMyd9OwogICAgICAgICBCaWdEZWNpbWFsIHJlc3VsdCA9IG5ldyBCaWdEZWNpbWFsKHZhbHVlKTsKQEAgLTE0OCw2ICsxOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChjaGFyW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW4pOyAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJDaGFySW50SW50KCkgewogICAgICAgICBjaGFyIHZhbHVlW10gPSB7Jy0nLCAnMScsICcyJywgJzMnLCAnOCcsICcwJywgJy4nLCAnNCcsICc3JywgJzMnLCAnOCcsICdFJywgJy0nLCAnNCcsICcyJywgJzMnfTsKICAgICAgICAgaW50IG9mZnNldCA9IDM7CkBAIC0xNjksNiArMjI4LDE1IEBACiAgICAgLyoqCiAgICAgICogbmV3IEJpZ0RlY2ltYWwoY2hhcltdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBNYXRoQ29udGV4dCBtYyk7IAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJDaGFySW50SW50TWF0aENvbnRleHQoKSB7CiAgICAgICAgIGNoYXIgdmFsdWVbXSA9IHsnLScsICcxJywgJzInLCAnMycsICc4JywgJzAnLCAnLicsICc0JywgJzcnLCAnMycsICc4JywgJ0UnLCAnLScsICc0JywgJzInLCAnMyd9OwogICAgICAgICBpbnQgb2Zmc2V0ID0gMzsKQEAgLTE5Myw2ICsyNjEsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChjaGFyW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW4sIE1hdGhDb250ZXh0IG1jKTsgCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckNoYXJJbnRJbnRNYXRoQ29udGV4dEV4Y2VwdGlvbjEoKSB7CiAgICAgICAgIGNoYXIgdmFsdWVbXSA9IHsnLScsICcxJywgJzInLCAnMycsICc4JywgJzAnLCAnLicsICc0JywgJzcnLCAnMycsICc4JywgJ0UnLCAnLScsICc0JywgJzInLCAnMyd9OwogICAgICAgICBpbnQgb2Zmc2V0ID0gMzsKQEAgLTIxMCw2ICsyODcsMTYgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChjaGFyW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW4sIE1hdGhDb250ZXh0IG1jKTsgCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2FtZSBhcyB0ZXN0Q29uc3RyQ2hhckludEludE1hdGhDb250ZXh0RXhjZXB0aW9uMS4iICsKKyAgICAgICAgICAgICAgIlByb2JhYmx5IHRoaXMgaXMgYW4gaW5pdGlhbCBzdGFnZSBmb3IgdGVzdGluZyBBcml0aG1ldGljRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJDaGFySW50SW50TWF0aENvbnRleHRFeGNlcHRpb24yKCkgewogICAgICAgICBjaGFyIHZhbHVlW10gPSB7Jy0nLCAnMScsICcyJywgJzMnLCAnOCcsICcwJywgJywnLCAnNCcsICc3JywgJzMnLCAnOCcsICdFJywgJy0nLCAnNCcsICcyJywgJzMnfTsKICAgICAgICAgaW50IG9mZnNldCA9IDM7CkBAIC0yMjcsNiArMzE0LDE1IEBACiAgICAgLyoqCiAgICAgICogbmV3IEJpZ0RlY2ltYWwoY2hhcltdIHZhbHVlLCBNYXRoQ29udGV4dCBtYyk7CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uLiBDaGVja3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJDaGFyTWF0aENvbnRleHQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTc4MwpAQCAtMjM5LDYgKzMzNSwxNSBAQAogICAgIC8qKgogICAgICAqIG5ldyBCaWdEZWNpbWFsKGRvdWJsZSB2YWx1ZSkgd2hlbiB2YWx1ZSBpcyBOYU4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChkb3VibGUpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyRG91YmxlTmFOKCkgewogICAgICAgICBkb3VibGUgYSA9IERvdWJsZS5OYU47CiAgICAgICAgIHRyeSB7CkBAIC0yNTMsNiArMzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogbmV3IEJpZ0RlY2ltYWwoZG91YmxlIHZhbHVlKSB3aGVuIHZhbHVlIGlzIHBvc2l0aXZlIGluZmluaXR5CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKGRvdWJsZSkgY29uc3RydWN0b3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJEb3VibGVQb3NJbmZpbml0eSgpIHsKICAgICAgICAgZG91YmxlIGEgPSBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgIHRyeSB7CkBAIC0yNjcsNiArMzgxLDE1IEBACiAgICAgLyoqCiAgICAgICogbmV3IEJpZ0RlY2ltYWwoZG91YmxlIHZhbHVlKSB3aGVuIHZhbHVlIGlzIHBvc2l0aXZlIGluZmluaXR5CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoZG91YmxlKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckRvdWJsZU5lZ0luZmluaXR5KCkgewogICAgICAgICBkb3VibGUgYSA9IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICAgdHJ5IHsKQEAgLTI4MSw2ICs0MDQsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChkb3VibGUgdmFsdWUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoZG91YmxlKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckRvdWJsZSgpIHsKICAgICAgICAgZG91YmxlIGEgPSA3MzI1NDY5ODIzNzQ5ODIzNDc4OTIzNzkyODM1NzEwOTQ3OTcuMjg3MzQ2NzgyMzU5Mjg0NzU2OwogICAgICAgICBpbnQgYVNjYWxlID0gMDsKQEAgLTI5Myw2ICs0MjUsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChkb3VibGUsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgamF2YS5tYXRoLk1hdGhDb250ZXh0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyRG91YmxlTWF0aENvbnRleHQoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gNzMyNTQ2OTgyMzc0OTgyMzQ3ODkyMzc5MjgzNTcxMDk0Nzk3LjI4NzM0Njc4MjM1OTI4NDc1NjsKICAgICAgICAgaW50IHByZWNpc2lvbiA9IDIxOwpAQCAtMzA4LDYgKzQ0OSwxNSBAQAogICAgIC8qKgogICAgICAqIG5ldyBCaWdEZWNpbWFsKDAuMSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChkb3VibGUpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyRG91YmxlMDEoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gMS5FLTE7CiAgICAgICAgIGludCBhU2NhbGUgPSA1NTsKQEAgLTMyMCw2ICs0NzAsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbCgwLjU1NSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChkb3VibGUpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyRG91YmxlMDIoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gMC41NTU7CiAgICAgICAgIGludCBhU2NhbGUgPSA1MzsKQEAgLTMzMiw2ICs0OTEsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbCgtMC4xKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKGRvdWJsZSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJEb3VibGVNaW51czAxKCkgewogICAgICAgICBkb3VibGUgYSA9IC0xLkUtMTsKICAgICAgICAgaW50IGFTY2FsZSA9IDU1OwpAQCAtMzQ0LDYgKzUxMiwxNSBAQAogICAgIC8qKgogICAgICAqIG5ldyBCaWdEZWNpbWFsKGludCB2YWx1ZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckludCgpIHsKICAgICAgICAgaW50IGEgPSA3MzI1NDY5ODI7CiAgICAgICAgIFN0cmluZyByZXMgPSAiNzMyNTQ2OTgyIjsKQEAgLTM1Niw2ICs1MzMsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChpbnQsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckludE1hdGhDb250ZXh0KCkgewogICAgICAgICBpbnQgYSA9IDczMjU0Njk4MjsKICAgICAgICAgaW50IHByZWNpc2lvbiA9IDIxOwpAQCAtMzcxLDYgKzU1NywxNSBAQAogICAgIC8qKgogICAgICAqIG5ldyBCaWdEZWNpbWFsKGxvbmcgdmFsdWUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyTG9uZygpIHsKICAgICAgICAgbG9uZyBhID0gNDU3NjU3ODY3NzczMjU0Njk4Mkw7CiAgICAgICAgIFN0cmluZyByZXMgPSAiNDU3NjU3ODY3NzczMjU0Njk4MiI7CkBAIC0zODMsNiArNTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogbmV3IEJpZ0RlY2ltYWwobG9uZywgTWF0aENvbnRleHQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGphdmEubWF0aC5NYXRoQ29udGV4dC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0ckxvbmdNYXRoQ29udGV4dCgpIHsKICAgICAgICAgbG9uZyBhID0gNDU3NjU3ODY3NzczMjU0Njk4Mkw7CiAgICAgICAgIGludCBwcmVjaXNpb24gPSA1OwpAQCAtMzk4LDYgKzYwMiwxNSBAQAogICAgIC8qKgogICAgICAqIG5ldyBCaWdEZWNpbWFsKGRvdWJsZSB2YWx1ZSkgd2hlbiB2YWx1ZSBpcyBkZW5vcm1hbGl6ZWQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChkb3VibGUpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyRG91YmxlRGVub3JtYWxpemVkKCkgewogICAgICAgICBkb3VibGUgYSA9IDIuMjc0MzQxMzIyNjU4OTc2RS0zMDk7CiAgICAgICAgIGludCBhU2NhbGUgPSAxMDczOwpAQCAtNDExLDYgKzYyNCwxNSBAQAogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSkKICAgICAgKiB3aGVuIHZhbHVlIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIEJpZ0RlY2ltYWwuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nRXhjZXB0aW9uKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjM4NzY4Ljc4NzY3ODI4N2ErMTAiOwogICAgICAgICB0cnkgewpAQCAtNDI0LDYgKzY0NiwxNSBAQAogICAgIC8qKgogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSkgd2hlbiBleHBvbmVudCBpcyBlbXB0eS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0clN0cmluZ0V4Y2VwdGlvbkVtcHR5RXhwb25lbnQxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjM4NzY4Ljc4NzY3ODI4N2UiOwogICAgICAgICB0cnkgewpAQCAtNDM2LDYgKzY2NywxNSBAQAogICAgIC8qKgogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSkgd2hlbiBleHBvbmVudCBpcyBlbXB0eS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0clN0cmluZ0V4Y2VwdGlvbkVtcHR5RXhwb25lbnQyKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjM4NzY4Ljc4NzY3ODI4N2UtIjsKICAgICAgICAgdHJ5IHsKQEAgLTQ0OSw2ICs2ODksMTUgQEAKICAgICAgKiBuZXcgQmlnRGVjaW1hbChTdHJpbmcgdmFsdWUpIHdoZW4gZXhwb25lbnQgaXMgZ3JlYXRlciB0aGFuCiAgICAgICogSW50ZWdlci5NQVhfVkFMVUUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdFeGNlcHRpb25FeHBvbmVudEdyZWF0ZXJJbnRlZ2VyTWF4KCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjM4NzY4Ljc4NzY3ODI4N2UyMTQ3NDgzNjQ3Njc4NzYiOwogICAgICAgICB0cnkgewpAQCAtNDYyLDYgKzcxMSwxNSBAQAogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSkgd2hlbiBleHBvbmVudCBpcyBsZXNzIHRoYW4KICAgICAgKiBJbnRlZ2VyLk1JTl9WQUxVRS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0clN0cmluZ0V4Y2VwdGlvbkV4cG9uZW50TGVzc0ludGVnZXJNaW4oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0yMzg3NjguNzg3Njc4Mjg3ZS0yMTQ3NDgzNjQ3Njc4NzYiOwogICAgICAgICB0cnkgewpAQCAtNDc1LDYgKzczMywxNSBAQAogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSkKICAgICAgKiB3aGVuIGV4cG9uZW50IGlzIEludGVnZXIuTUFYX1ZBTFVFLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nRXhwb25lbnRJbnRlZ2VyTWF4KCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjM4NzY4Ljc4NzY3ODI4N2UyMTQ3NDgzNjQ3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yMTQ3NDgzNjM4OwpAQCAtNDg4LDYgKzc1NSwxNSBAQAogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSkKICAgICAgKiB3aGVuIGV4cG9uZW50IGlzIEludGVnZXIuTUlOX1ZBTFVFLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nRXhwb25lbnRJbnRlZ2VyTWluKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIuMjM4NzY4ZS0yMTQ3NDgzNjQ4IjsKICAgICAgICAgdHJ5IHsKQEAgLTUwMiw2ICs3NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChTdHJpbmcgdmFsdWUpOyB2YWx1ZSBkb2VzIG5vdCBjb250YWluIGV4cG9uZW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdXaXRob3V0RXhwUG9zMSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiNzMyNTQ2OTgyMzc0OTgyMzQ3ODkyMzc5MjgzNTcxMDk0Nzk3LjI4NzM0Njc4MjM1OTI4NDc1NiI7CiAgICAgICAgIGludCBhU2NhbGUgPSAxODsKQEAgLTUxNCw2ICs3OTksMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChTdHJpbmcgdmFsdWUpOyB2YWx1ZSBkb2VzIG5vdCBjb250YWluIGV4cG9uZW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdXaXRob3V0RXhwUG9zMigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiKzczMjU0Njk4MjM3NDk4MjM0Nzg5MjM3OTI4MzU3MTA5NDc5Ny4yODczNDY3ODIzNTkyODQ3NTYiOwogICAgICAgICBpbnQgYVNjYWxlID0gMTg7CkBAIC01MjYsNiArODIwLDE1IEBACiAgICAgLyoqCiAgICAgICogbmV3IEJpZ0RlY2ltYWwoU3RyaW5nIHZhbHVlKTsgdmFsdWUgZG9lcyBub3QgY29udGFpbiBleHBvbmVudAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nV2l0aG91dEV4cE5lZygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTczMjU0Njk4MjM3NDk4MjM0Nzg5MjM3OTI4MzU3MTA5NDc5Ny4yODczNDY3ODIzNTkyODQ3NTYiOwogICAgICAgICBpbnQgYVNjYWxlID0gMTg7CkBAIC01MzksNiArODQyLDE1IEBACiAgICAgICogbmV3IEJpZ0RlY2ltYWwoU3RyaW5nIHZhbHVlKTsgdmFsdWUgZG9lcyBub3QgY29udGFpbiBleHBvbmVudAogICAgICAqIGFuZCBkZWNpbWFsIHBvaW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdXaXRob3V0RXhwV2l0aG91dFBvaW50KCkgewogICAgICAgICBTdHJpbmcgYSA9ICItNzMyNTQ2OTgyMzc0OTgyMzQ3ODkyMzc5MjgzNTcxMDk0Nzk3Mjg3MzQ2NzgyMzU5Mjg0NzU2IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDA7CkBAIC01NTIsNiArODY0LDE1IEBACiAgICAgICogbmV3IEJpZ0RlY2ltYWwoU3RyaW5nIHZhbHVlKTsgdmFsdWUgY29udGFpbnMgZXhwb25lbnQKICAgICAgKiBhbmQgZG9lcyBub3QgY29udGFpbiBkZWNpbWFsIHBvaW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdXaXRoRXhwb25lbnRXaXRob3V0UG9pbnQxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjM4NzY4Nzg3Njc4Mjg3ZTIxNCI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMjE0OwpAQCAtNTY1LDYgKzg4NiwxNSBAQAogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSk7IHZhbHVlIGNvbnRhaW5zIGV4cG9uZW50CiAgICAgICogYW5kIGRvZXMgbm90IGNvbnRhaW4gZGVjaW1hbCBwb2ludAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nV2l0aEV4cG9uZW50V2l0aG91dFBvaW50MigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTIzODc2ODc4NzY3ODI4N2UtMjE0IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDIxNDsKQEAgLTU3OCw2ICs5MDgsMTUgQEAKICAgICAgKiBuZXcgQmlnRGVjaW1hbChTdHJpbmcgdmFsdWUpOyB2YWx1ZSBjb250YWlucyBleHBvbmVudAogICAgICAqIGFuZCBkb2VzIG5vdCBjb250YWluIGRlY2ltYWwgcG9pbnQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0clN0cmluZ1dpdGhFeHBvbmVudFdpdGhvdXRQb2ludDMoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjIzODc2ODc4NzY3ODI4N2UtMjE0IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDIxNDsKQEAgLTU5MSw2ICs5MzAsMTUgQEAKICAgICAgKiBuZXcgQmlnRGVjaW1hbChTdHJpbmcgdmFsdWUpOyB2YWx1ZSBjb250YWlucyBleHBvbmVudAogICAgICAqIGFuZCBkb2VzIG5vdCBjb250YWluIGRlY2ltYWwgcG9pbnQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0clN0cmluZ1dpdGhFeHBvbmVudFdpdGhvdXRQb2ludDQoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjIzODc2ODc4NzY3ODI4N2UrMjE0IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yMTQ7CkBAIC02MDQsNiArOTUyLDE1IEBACiAgICAgICogbmV3IEJpZ0RlY2ltYWwoU3RyaW5nIHZhbHVlKTsgdmFsdWUgY29udGFpbnMgZXhwb25lbnQKICAgICAgKiBhbmQgZG9lcyBub3QgY29udGFpbiBkZWNpbWFsIHBvaW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdXaXRoRXhwb25lbnRXaXRob3V0UG9pbnQ1KCkgewogICAgICAgICBTdHJpbmcgYSA9ICIyMzg3Njg3ODc2NzgyODdFMjE0IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yMTQ7CkBAIC02MTcsNiArOTc0LDE1IEBACiAgICAgICogbmV3IEJpZ0RlY2ltYWwoU3RyaW5nIHZhbHVlKTsgCiAgICAgICogdmFsdWUgY29udGFpbnMgYm90aCBleHBvbmVudCBhbmQgZGVjaW1hbCBwb2ludAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nV2l0aEV4cG9uZW50V2l0aFBvaW50MSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMjM5ODU0Mzk4Mzc5ODQ3ODI0MzU2NTI0MjQ1MjM4NzY4NzguNzY3ODI4N2UrMjE0IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yMDc7CkBAIC02MzAsNiArOTk2LDE1IEBACiAgICAgICogbmV3IEJpZ0RlY2ltYWwoU3RyaW5nIHZhbHVlKTsgCiAgICAgICogdmFsdWUgY29udGFpbnMgYm90aCBleHBvbmVudCBhbmQgZGVjaW1hbCBwb2ludAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nV2l0aEV4cG9uZW50V2l0aFBvaW50MigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzU2MzU2Nzg5MDI5NTc4NDkwMjc2ODc4Ljc2NzgyODdlLTIxNCI7CiAgICAgICAgIGludCBhU2NhbGUgPSAyMjE7CkBAIC02NDMsNiArMTAxOCwxNSBAQAogICAgICAqIG5ldyBCaWdEZWNpbWFsKFN0cmluZyB2YWx1ZSk7IAogICAgICAqIHZhbHVlIGNvbnRhaW5zIGJvdGggZXhwb25lbnQgYW5kIGRlY2ltYWwgcG9pbnQKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnRGVjaW1hbChTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0clN0cmluZ1dpdGhFeHBvbmVudFdpdGhQb2ludDMoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAuMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIGludCBhU2NhbGUgPSAwOwpAQCAtNjU2LDYgKzEwNDAsMTUgQEAKICAgICAgKiBuZXcgQmlnRGVjaW1hbChTdHJpbmcgdmFsdWUpOyAKICAgICAgKiB2YWx1ZSBjb250YWlucyBib3RoIGV4cG9uZW50IGFuZCBkZWNpbWFsIHBvaW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0RlY2ltYWwoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdXaXRoRXhwb25lbnRXaXRoUG9pbnQ0KCkgewogICAgICAgICBTdHJpbmcgYSA9ICIyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNTYzNTY3OC45MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMjEiOwogICAgICAgICBpbnQgYVNjYWxlID0gMjsKQEAgLTY2OSw2ICsxMDYyLDE1IEBACiAgICAgICogbmV3IEJpZ0RlY2ltYWwoU3RyaW5nIHZhbHVlKTsgCiAgICAgICogdmFsdWUgY29udGFpbnMgYm90aCBleHBvbmVudCBhbmQgZGVjaW1hbCBwb2ludAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdEZWNpbWFsKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyU3RyaW5nV2l0aEV4cG9uZW50V2l0aFBvaW50NSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzU2MzU2Nzg5MDI5LjU3ODQ5MDI3Njg3ODc2NzgyODdFKzIxIjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0yOwpAQCAtNjgxLDYgKzEwODMsMTUgQEAKICAgICAvKioKICAgICAgKiBuZXcgQmlnRGVjaW1hbChTdHJpbmcgdmFsdWUsIE1hdGhDb250ZXh0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLm1hdGguTWF0aENvbnRleHQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJTdHJpbmdNYXRoQ29udGV4dCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTIzODc2ODc4NzY3ODI4N2UyMTQiOwogICAgICAgICBpbnQgcHJlY2lzaW9uID0gNTsKQEAgLTY5OCw2ICsxMTA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI0JpZ0RlY2ltYWwoamF2YS5tYXRoLkJpZ0ludGVnZXIsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JfamF2YV9tYXRoX0JpZ0ludGVnZXJfaW50KCkgewogICAgICAgICBCaWdJbnRlZ2VyIHZhbHVlID0gbmV3IEJpZ0ludGVnZXIoIjEyMzQ1OTA4Iik7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmlnID0gbmV3IEJpZ0RlY2ltYWwodmFsdWUpOwpAQCAtNzE3LDYgKzExMzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjQmlnRGVjaW1hbChkb3VibGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdW1iZXJGb3JtYXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX0RvdWJsZSgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBiaWcgPSBuZXcgQmlnRGVjaW1hbCgxMjNFMDQpOwogICAgICAgICBhc3NlcnRUcnVlKCJ0aGUgQmlnRGVjaW1hbCB2YWx1ZSB0YWtpbmcgYSBkb3VibGUgYXJndW1lbnQgaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5IiwgYmlnCkBAIC03NDUsNiArMTE3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNCaWdEZWNpbWFsKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yX2phdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgQmlnRGVjaW1hbCBiaWcgPSBuZXcgQmlnRGVjaW1hbCgiMzQ1LjIzNDk5NjAwMjkzODUwIik7CiAgICAgICAgIGFzc2VydFRydWUoInRoZSBCaWdEZWNpbWFsIHZhbHVlIGlzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIsIGJpZy50b1N0cmluZygpLmVxdWFscygKZGlmZiAtLWdpdCBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxDb252ZXJ0VGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnRGVjaW1hbENvbnZlcnRUZXN0LmphdmEKaW5kZXggZWNjMWRmYTQuLjlmYjM1M2YgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxDb252ZXJ0VGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxDb252ZXJ0VGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsMTggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGU7CiBpbXBvcnQgamF2YS5tYXRoLk1hdGhDb250ZXh0OwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworQFRlc3RUYXJnZXRDbGFzcyhCaWdEZWNpbWFsLmNsYXNzKQogLyoqCiAgKiBDbGFzczogIGphdmEubWF0aC5CaWdEZWNpbWFsCiAgKiBNZXRob2RzOiBkb3VibGVWYWx1ZSwgZmxvYXRWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgIApAQCAtMzYsNiArNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBEb3VibGUgdmFsdWUgb2YgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVOZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFKzIxIjsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoYSk7CkBAIC00Niw2ICs2MSwxNSBAQAogICAgIC8qKgogICAgICAqIERvdWJsZSB2YWx1ZSBvZiBhIHBvc2l0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlUG9zKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFKzIxIjsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoYSk7CkBAIC01Niw2ICs4MCwxNSBAQAogICAgIC8qKgogICAgICAqIERvdWJsZSB2YWx1ZSBvZiBhIGxhcmdlIHBvc2l0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlUG9zSW5maW5pdHkoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrNDAwIjsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoYSk7CkBAIC02Niw2ICs5OSwxNSBAQAogICAgIC8qKgogICAgICAqIERvdWJsZSB2YWx1ZSBvZiBhIGxhcmdlIG5lZ2F0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlTmVnSW5maW5pdHkoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFKzQwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNzYsNiArMTE4LDE1IEBACiAgICAgLyoqCiAgICAgICogRG91YmxlIHZhbHVlIG9mIGEgc21hbGwgbmVnYXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVNaW51c1plcm8oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFLTQwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtODcsNiArMTM4LDE1IEBACiAgICAgLyoqCiAgICAgICogRG91YmxlIHZhbHVlIG9mIGEgc21hbGwgcG9zaXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVQbHVzWmVybygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RS00MDAiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTk4LDYgKzE1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEZsb2F0IHZhbHVlIG9mIGEgbmVnYXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0Ny42MzU2Nzg5MDI5NTc4RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTA4LDYgKzE3NywxNSBAQAogICAgIC8qKgogICAgICAqIEZsb2F0IHZhbHVlIG9mIGEgcG9zaXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVQb3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDcuNjM1Njc4OTAyOTU3OEUrMjEiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTExOCw2ICsxOTYsMTUgQEAKICAgICAvKioKICAgICAgKiBGbG9hdCB2YWx1ZSBvZiBhIGxhcmdlIHBvc2l0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlUG9zSW5maW5pdHkoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM3MzU2NzM1Njc0NTczNS42MzU2Nzg5Nzg3Njc4Mjg3RSsyMDAiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTEyOCw2ICsyMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBGbG9hdCB2YWx1ZSBvZiBhIGxhcmdlIG5lZ2F0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlTmVnSW5maW5pdHkoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTU3MzUuNjM1Njc4ODc2NzgyODdFKzIwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTM4LDYgKzIzNCwxNSBAQAogICAgIC8qKgogICAgICAqIEZsb2F0IHZhbHVlIG9mIGEgc21hbGwgbmVnYXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVNaW51c1plcm8oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFLTQwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTQ5LDYgKzI1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEZsb2F0IHZhbHVlIG9mIGEgc21hbGwgcG9zaXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVQbHVzWmVybygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RS00MDAiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTE2MCw2ICsyNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBJbnRlZ2VyIHZhbHVlIG9mIGEgbmVnYXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgaW50VmFsdWUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludFZhbHVlTmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTcwLDYgKzI5MywxNSBAQAogICAgIC8qKgogICAgICAqIEludGVnZXIgdmFsdWUgb2YgYSBwb3NpdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGludFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRWYWx1ZVBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTgwLDYgKzMxMiwxNSBAQAogICAgIC8qKgogICAgICAqIExvbmcgdmFsdWUgb2YgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBsb25nVmFsdWUgbWV0aG9kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvbmdWYWx1ZU5lZygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMjEiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTE5MCw2ICszMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBMb25nIHZhbHVlIG9mIGEgcG9zaXRpdmUgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBsb25nVmFsdWUgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvbmdWYWx1ZVBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMjAwLDYgKzM1MCwxNSBAQAogICAgIC8qKgogICAgICAqIHNjYWxlQnlQb3dlck9mVGVuKGludCBuKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzY2FsZUJ5UG93ZXJPZlRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FsZUJ5UG93ZXJPZlRlbjEoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTM7CkBAIC0yMTQsNiArMzczLDE1IEBACiAgICAgLyoqCiAgICAgICogc2NhbGVCeVBvd2VyT2ZUZW4oaW50IG4pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2NhbGVCeVBvd2VyT2ZUZW4iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NhbGVCeVBvd2VyT2ZUZW4yKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IC0xMzsKQEAgLTIyOCw2ICszOTYsMTUgQEAKICAgICAvKioKICAgICAgKiBDb252ZXJ0IGEgcG9zaXRpdmUgQmlnRGVjaW1hbCB0byBCaWdJbnRlZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0JpZ0ludGVnZXIgbWV0aG9kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9CaWdJbnRlZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvQmlnSW50ZWdlclBvczEoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMjEiOwogICAgICAgICBCaWdJbnRlZ2VyIGJOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAyOTU3ODQ5MDI3Njg3Iik7CkBAIC0yMzksNiArNDE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIEJpZ0RlY2ltYWwgdG8gQmlnSW50ZWdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0JpZ0ludGVnZXIgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9CaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvQmlnSW50ZWdlclBvczIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMTUiOwogICAgICAgICBCaWdJbnRlZ2VyIGJOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAyOTU3ODQ5Iik7CkBAIC0yNTAsNiArNDM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIEJpZ0RlY2ltYWwgdG8gQmlnSW50ZWdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0JpZ0ludGVnZXIgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9CaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvQmlnSW50ZWdlclBvczMoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrNDUiOwogICAgICAgICBCaWdJbnRlZ2VyIGJOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODcwMDAwMDAwMDAwMDAwMDAwIik7CkBAIC0yNjEsNiArNDU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQ29udmVydCBhIG5lZ2F0aXZlIEJpZ0RlY2ltYWwgdG8gQmlnSW50ZWdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0JpZ0ludGVnZXIgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9CaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvQmlnSW50ZWdlck5lZzEoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFKzIxIjsKICAgICAgICAgQmlnSW50ZWdlciBiTnVtYmVyID0gbmV3IEJpZ0ludGVnZXIoIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzU2MzU2Nzg5MDI5NTc4NDkwMjc2ODciKTsKQEAgLTI3Miw2ICs0NzYsMTUgQEAKICAgICAvKioKICAgICAgKiBDb252ZXJ0IGEgbmVnYXRpdmUgQmlnRGVjaW1hbCB0byBCaWdJbnRlZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvQmlnSW50ZWdlciBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0JpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9CaWdJbnRlZ2VyTmVnMigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMTUiOwogICAgICAgICBCaWdJbnRlZ2VyIGJOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiLTEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNTYzNTY3ODkwMjk1Nzg0OSIpOwpAQCAtMjgzLDYgKzQ5NiwxNSBAQAogICAgIC8qKgogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsIHRvIEJpZ0ludGVnZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9CaWdJbnRlZ2VyIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvQmlnSW50ZWdlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb0JpZ0ludGVnZXJOZWczKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSs0NSI7CiAgICAgICAgIEJpZ0ludGVnZXIgYk51bWJlciA9IG5ldyBCaWdJbnRlZ2VyKCItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1NjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODcwMDAwMDAwMDAwMDAwMDAwIik7CkBAIC0yOTQsNiArNTE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQ29udmVydCBhIHNtYWxsIEJpZ0RlY2ltYWwgdG8gQmlnSW50ZWdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0JpZ0ludGVnZXIgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9CaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvQmlnSW50ZWdlclplcm8oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFLTUwMCI7CiAgICAgICAgIEJpZ0ludGVnZXIgYk51bWJlciA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7CkBAIC0zMDUsNiArNTM2LDE1IEBACiAgICAgLyoqCiAgICAgICogdG9CaWdJbnRlZ2VyRXhhY3QoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9CaWdJbnRlZ2VyRXhhY3QgbWV0aG9kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9CaWdJbnRlZ2VyRXhhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9CaWdJbnRlZ2VyRXhhY3QxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSs0NSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMzE2LDYgKzU1NiwxNSBAQAogICAgIC8qKgogICAgICAqIHRvQmlnSW50ZWdlckV4YWN0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9CaWdJbnRlZ2VyRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9CaWdJbnRlZ2VyRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9CaWdJbnRlZ2VyRXhhY3RFeGNlcHRpb24oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFLTEwIjsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoYSk7CkBAIC0zMzAsNiArNTc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIEJpZ0RlY2ltYWwgdG8gYW4gZW5naW5lZXJpbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0VuZ2luZWVyaW5nU3RyaW5nIG1ldGhvZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvRW5naW5lZXJpbmdTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9FbmdpbmVlcmluZ1N0cmluZ1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RS01MDEiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTM0MCw2ICs1OTgsMTUgQEAKICAgICAvKioKICAgICAgKiBDb252ZXJ0IGEgbmVnYXRpdmUgQmlnRGVjaW1hbCB0byBhbiBlbmdpbmVlcmluZyBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9FbmdpbmVlcmluZ1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0VuZ2luZWVyaW5nU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvRW5naW5lZXJpbmdTdHJpbmdOZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFLTUwMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMzUwLDYgKzYxNywxNSBAQAogICAgIC8qKgogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsIHRvIGFuIGVuZ2luZWVyaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0VuZ2luZWVyaW5nU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvRW5naW5lZXJpbmdTdHJpbmciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9FbmdpbmVlcmluZ1N0cmluZ1plcm9Qb3NFeHBvbmVudCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMC4wRSsxNiI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMzYwLDYgKzYzNiwxNSBAQAogICAgIC8qKgogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsIHRvIGFuIGVuZ2luZWVyaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b0VuZ2luZWVyaW5nU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvRW5naW5lZXJpbmdTdHJpbmciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9FbmdpbmVlcmluZ1N0cmluZ1plcm9OZWdFeHBvbmVudCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMC4wRS0xNiI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMzcxLDYgKzY1NiwxNSBAQAogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBCaWdEZWNpbWFsIHdpdGggYSBuZWdhdGl2ZSBleHBvbmVudCB0byBhIHBsYWluIHN0cmluZwogICAgICAqIHJlcHJlc2VudGF0aW9uOyBzY2FsZSA9PSAwLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9QbGFpblN0cmluZyBtZXRob2QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1BsYWluU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvUGxhaW5TdHJpbmdOZWdOZWdFeHAoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0xMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFLTEwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMzgzLDYgKzY3NywxNSBAQAogICAgICAqIHRvIGEgcGxhaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOwogICAgICAqIHNjYWxlID09IDAuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvUGxhaW5TdHJpbmcgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9QbGFpblN0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1BsYWluU3RyaW5nTmVnUG9zRXhwKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RTEwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMzk1LDYgKzY5OCwxNSBAQAogICAgICAqIHRvIGEgcGxhaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOwogICAgICAqIHNjYWxlID09IDAuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvUGxhaW5TdHJpbmcgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9QbGFpblN0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1BsYWluU3RyaW5nUG9zTmVnRXhwKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFLTEwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNDA3LDYgKzcxOSwxNSBAQAogICAgICAqIHRvIGEgcGxhaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOwogICAgICAqIHNjYWxlID09IDAuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvUGxhaW5TdHJpbmcgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9QbGFpblN0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1BsYWluU3RyaW5nUG9zUG9zRXhwKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFKzEwMCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNDE4LDYgKzczOSwxNSBAQAogICAgICAqIENvbnZlcnQgYSBCaWdEZWNpbWFsIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uOwogICAgICAqIHNjYWxlID09IDAuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ1plcm9TY2FsZSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNTYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3MCI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKG5ldyBCaWdJbnRlZ2VyKGEpKTsKQEAgLTQyOCw2ICs3NTgsMTUgQEAKICAgICAvKioKICAgICAgKiBDb252ZXJ0IGEgcG9zaXRpdmUgQmlnRGVjaW1hbCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ1BvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RS01MDAiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTQzOCw2ICs3NzcsMTUgQEAKICAgICAvKioKICAgICAgKiBDb252ZXJ0IGEgbmVnYXRpdmUgQmlnRGVjaW1hbCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ05lZygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTEyMy40NTY0NTYzNjczNTY3MzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNTYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RS01IjsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoYSk7CkBAIC00NDgsNiArNzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgQmlnRGVjaW1hbCBmcm9tIGEgcG9zaXRpdmUgbG9uZyB2YWx1ZTsgc2NhbGUgPT0gMAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mUG9zWmVyb1NjYWxlKCkgewogICAgICAgICBsb25nIGEgPSA5ODM3NDgyMzk0NzgyMzU3OEw7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IEJpZ0RlY2ltYWwudmFsdWVPZihhKTsKQEAgLTQ1OCw2ICs4MTUsMTUgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBCaWdEZWNpbWFsIGZyb20gYSBuZWdhdGl2ZSBsb25nIHZhbHVlOyBzY2FsZSBpcyAwCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZOZWdaZXJvU2NhbGUoKSB7CiAgICAgICAgIGxvbmcgYSA9IC05ODM3NDgyMzk0NzgyMzU3OEw7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IEJpZ0RlY2ltYWwudmFsdWVPZihhKTsKQEAgLTQ2OCw2ICs4MzQsMTUgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBCaWdEZWNpbWFsIGZyb20gYSBuZWdhdGl2ZSBsb25nIHZhbHVlOyBzY2FsZSBpcyBwb3NpdGl2ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mTmVnU2NhbGVQb3MoKSB7CiAgICAgICAgIGxvbmcgYSA9IC05ODM3NDgyMzk0NzgyMzU3OEw7CiAgICAgICAgIGludCBzY2FsZSA9IDEyOwpAQCAtNDc5LDYgKzg1NCwxNSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIEJpZ0RlY2ltYWwgZnJvbSBhIG5lZ2F0aXZlIGxvbmcgdmFsdWU7IHNjYWxlIGlzIG5lZ2F0aXZlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZOZWdTY2FsZU5lZygpIHsKICAgICAgICAgbG9uZyBhID0gLTk4Mzc0ODIzOTQ3ODIzNTc4TDsKICAgICAgICAgaW50IHNjYWxlID0gLTEyOwpAQCAtNDkwLDYgKzg3NCwxNSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIEJpZ0RlY2ltYWwgZnJvbSBhIG5lZ2F0aXZlIGxvbmcgdmFsdWU7IHNjYWxlIGlzIHBvc2l0aXZlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZQb3NTY2FsZVBvcygpIHsKICAgICAgICAgbG9uZyBhID0gOTgzNzQ4MjM5NDc4MjM1NzhMOwogICAgICAgICBpbnQgc2NhbGUgPSAxMjsKQEAgLTUwMSw2ICs4OTQsMTUgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBCaWdEZWNpbWFsIGZyb20gYSBuZWdhdGl2ZSBsb25nIHZhbHVlOyBzY2FsZSBpcyBuZWdhdGl2ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mUG9zU2NhbGVOZWcoKSB7CiAgICAgICAgIGxvbmcgYSA9IDk4Mzc0ODIzOTQ3ODIzNTc4TDsKICAgICAgICAgaW50IHNjYWxlID0gLTEyOwpAQCAtNTEyLDYgKzkxNCwxNSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIEJpZ0RlY2ltYWwgZnJvbSBhIG5lZ2F0aXZlIGRvdWJsZSB2YWx1ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mRG91YmxlTmVnKCkgewogICAgICAgICBkb3VibGUgYSA9IC02NTY3ODc2NTg3NjU2NzU3Ni45ODc4ODc2NzsKICAgICAgICAgQmlnRGVjaW1hbCByZXN1bHQgPSBCaWdEZWNpbWFsLnZhbHVlT2YoYSk7CkBAIC01MjQsNiArOTM1LDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgQmlnRGVjaW1hbCBmcm9tIGEgcG9zaXRpdmUgZG91YmxlIHZhbHVlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZEb3VibGVQb3MxKCkgewogICAgICAgICBkb3VibGUgYSA9IDY1Njc4NzY1ODc2NTY3NTc2Ljk4Nzg4NzY3OwogICAgICAgICBCaWdEZWNpbWFsIHJlc3VsdCA9IEJpZ0RlY2ltYWwudmFsdWVPZihhKTsKQEAgLTUzNiw2ICs5NTYsMTUgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBCaWdEZWNpbWFsIGZyb20gYSBwb3NpdGl2ZSBkb3VibGUgdmFsdWUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9TdHJpbmcgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZkRvdWJsZVBvczIoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gMTIzMjEyMzc1NzYuOTg3ODg3Njc7CiAgICAgICAgIEJpZ0RlY2ltYWwgcmVzdWx0ID0gQmlnRGVjaW1hbC52YWx1ZU9mKGEpOwpAQCAtNTQ4LDYgKzk3NywxNSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIEJpZ0RlY2ltYWwgZnJvbSBhIHBvc2l0aXZlIGRvdWJsZSB2YWx1ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mRG91YmxlUG9zMygpIHsKICAgICAgICAgZG91YmxlIGEgPSAxMjMyMTIzNzU3Ni45ODc4ODM4OwogICAgICAgICBCaWdEZWNpbWFsIHJlc3VsdCA9IEJpZ0RlY2ltYWwudmFsdWVPZihhKTsKQEAgLTU2MCw2ICs5OTgsMTUgQEAKICAgICAvKioKICAgICAgKiB2YWx1ZU9mKERvdWJsZS5OYU4pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mRG91YmxlTmFOKCkgewogICAgICAgICBkb3VibGUgYSA9IERvdWJsZS5OYU47CiAgICAgICAgIHRyeSB7CkBAIC01NzYsNiArMTAyMywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNpbnRWYWx1ZUV4YWN0KCkgSW50ZWdlciB2YWx1ZSBvZiBhIG5lZ2F0aXZlCiAgICAgICogICAgICAgIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGludFZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWVFeGFjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSW50VmFsdWVFeGFjdE5lZygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMjEiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTU5MSw2ICsxMDQ3LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2ludFZhbHVlRXhhY3QoKSBJbnRlZ2VyIHZhbHVlIG9mIGEgcG9zaXRpdmUKICAgICAgKiAgICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBpbnRWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0ludFZhbHVlRXhhY3RQb3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMjEiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTYwNiw2ICsxMDcxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2ludFZhbHVlRXhhY3QoKSBJbnRlZ2VyIHZhbHVlIG9mIGEgbmVnYXRpdmUKICAgICAgKiAgICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBpbnRWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0ludFZhbHVlRXhhY3RGbG9hdE5lZygpIHsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoIi0yMTQ3NDgzNjQ3Ljk5OSIpOwogICAgICAgICB0cnkgewpAQCAtNjIwLDYgKzEwOTQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjaW50VmFsdWVFeGFjdCgpIEludGVnZXIgdmFsdWUgb2YgYSBwb3NpdGl2ZQogICAgICAqICAgICAgICBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGludFZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSW50VmFsdWVFeGFjdEZsb2F0UG9zKCkgewogICAgICAgICBmbG9hdCBhID0gMjE0NzQ4MzY0Ni45OTk5OUY7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNjM1LDYgKzExMTgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjaW50VmFsdWVFeGFjdCgpIEludGVnZXIgdmFsdWUgb2YgYSBwb3NpdGl2ZQogICAgICAqICAgICAgICBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGludFZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfSW50VmFsdWVFeGFjdExvbmdQb3MoKSB7CiAgICAgICAgIGxvbmcgYSA9IDIxNDc0ODM2NDdMOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTY0Niw2ICsxMTM4LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2ludFZhbHVlRXhhY3QoKSBJbnRlZ2VyIHZhbHVlIG9mIGEgcG9zaXRpdmUKICAgICAgKiAgICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBpbnRWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0ludFZhbHVlRXhhY3RMb25nTmVnKCkgewogICAgICAgICBsb25nIGEgPSAtMjE0NzQ4MzY0OEw7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNjU3LDYgKzExNTgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjbG9uZ1ZhbHVlRXhhY3QoKSBMb25nIHZhbHVlIG9mIGEgbmVnYXRpdmUKICAgICAgKiAgICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlRXhhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0xvbmdWYWx1ZUV4YWN0TmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtNjcyLDYgKzExODIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjbG9uZ1ZhbHVlRXhhY3QoKSBMb25nIHZhbHVlIG9mIGEgcG9zaXRpdmUKICAgICAgKiAgICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNrZWQiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfTG9uZ1ZhbHVlRXhhY3RQb3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzgwOTY0ODM5MjM4NDc1NDU3MzU2NzM1Njc0NTczNS42MzU2Nzg5MDI5NTc4NDkwMjc2ODc4NzY3ODI4N0UrMjEiOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTY4Nyw2ICsxMjA2LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2xvbmdWYWx1ZUV4YWN0KCkgTG9uZyB2YWx1ZSBvZiBhIG5lZ2F0aXZlCiAgICAgICogICAgICAgIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2VkIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0xvbmdWYWx1ZUV4YWN0RmxvYXROZWcoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKCItOTIyMzM3MjAzNjg1NDc3NTgwNy45OTk5OSIpOwogICAgICAgICB0cnkgewpAQCAtNzAxLDYgKzEyMjksMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjbG9uZ1ZhbHVlRXhhY3QoKSBMb25nIHZhbHVlIG9mIGEgcG9zaXRpdmUKICAgICAgKiAgICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNrZWQiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfTG9uZ1ZhbHVlRXhhY3RGbG9hdFBvcygpIHsKICAgICAgICAgZmxvYXQgYSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDYuOTk5OTlGOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTcxNiw2ICsxMjUzLDE1IEBACiAgICAgICogQHRlc3QgamF2YS5tYXRoLkJpZ0RlY2ltYWwjYnl0ZVZhbHVlRXhhY3QoKSBDb252ZXJ0IHBpc2l0aXZlIEJpZ0Rlc2ltYWwKICAgICAgKiAgICAgICB0byBieXRlIHR5cGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGJ5dGVWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImJ5dGVWYWx1ZUV4YWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9CeXRlVmFsdWVFeGFjdFBvcygpIHsKICAgICAgICAgaW50IGkgPSAxMjc7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmROdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChpKTsKQEAgLTcyNyw2ICsxMjczLDE1IEBACiAgICAgICogQHRlc3QgamF2YS5tYXRoLkJpZ0RlY2ltYWwjYnl0ZVZhbHVlRXhhY3QoKSBDb252ZXJ0IG5lZ2F0aXZlIEJpZ0Rlc2ltYWwKICAgICAgKiAgICAgICB0byBieXRlIHR5cGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYnl0ZVZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0J5dGVWYWx1ZUV4YWN0TmVnKCkgewogICAgICAgICBTdHJpbmcgc051bWJlciA9ICItMTI3LjU2Nzg5IjsKICAgICAgICAgaW50IGlOdW1iZXIgPSAtMTI4OwpAQCAtNzQyLDYgKzEyOTcsMTUgQEAKICAgICAgKiAgICAgICBmcm9tIGNoYXIgYXJyYXkgdG8gYnl0ZSB0eXBlCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYnl0ZVZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0J5dGVWYWx1ZUV4YWN0Q2hhclplcm8oKSB7CiAgICAgICAgIGNoYXJbXSBjTnVtYmVyID0gewogICAgICAgICAgICAgICAgICctJywgJzAnLCAnLicsICcwJwpAQCAtNzU5LDYgKzEzMjMsMTUgQEAKICAgICAgKiAgICAgICBmcm9tIFN0cmluZyB0byBieXRlIHR5cGUKICAgICAgKi8KIAorQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBieXRlVmFsdWVFeGFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJieXRlVmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQnl0ZVZhbHVlRXhhY3RTdHJpbmdaZXJvKCkgewogICAgICAgICBTdHJpbmcgc051bWJlciA9ICIwMDAwMDAwMDAwMDAwMCI7CiAgICAgICAgIGludCBpTnVtYmVyID0gMDsKQEAgLTc3NCw2ICsxMzQ3LDE1IEBACiAgICAgICogICAgICAgZnJvbSBkb3VibGUgdG8gYnl0ZSB0eXBlCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYnl0ZVZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0J5dGVWYWx1ZUV4YWN0RG91YmxlTWF4KCkgewogICAgICAgICBkb3VibGUgZE51bWJlciA9IERvdWJsZS5NQVhfVkFMVUU7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmROdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChkTnVtYmVyKTsKQEAgLTc5MCw2ICsxMzcyLDE1IEBACiAgICAgICogICAgICAgZnJvbSBkb3VibGUgdG8gYnl0ZSB0eXBlCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYnl0ZVZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0J5dGVWYWx1ZUV4YWN0RG91YmxlTWluKCkgewogICAgICAgICBkb3VibGUgZE51bWJlciA9IERvdWJsZS5NSU5fVkFMVUU7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmROdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChkTnVtYmVyKTsKQEAgLTgwNiw2ICsxMzk3LDE1IEBACiAgICAgICogICAgICAgZnJvbSBmbG9hdCB0byBieXRlIHR5cGUKICAgICAgKi8KIAorQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBieXRlVmFsdWVFeGFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJieXRlVmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQnl0ZVZhbHVlRXhhY3RGbG9hdFBvcygpIHsKICAgICAgICAgZmxvYXQgZk51bWJlciA9IDEyMy41NDQ1RjsKICAgICAgICAgQmlnRGVjaW1hbCBiZE51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGZOdW1iZXIpOwpAQCAtODIyLDYgKzE0MjIsMTUgQEAKICAgICAgKiAgICAgICBmcm9tIGZsb2F0IHRvIGJ5dGUgdHlwZQogICAgICAqLwogCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGJ5dGVWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJ5dGVWYWx1ZUV4YWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9CeXRlVmFsdWVFeGFjdEZsb2F0TmVnKCkgewogICAgICAgICBmbG9hdCBmTnVtYmVyID0gLTEyLjk4NzY1NDMyMUY7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmROdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChmTnVtYmVyKTsKQEAgLTgzOCw2ICsxNDQ3LDE1IEBACiAgICAgICogICAgICAgZnJvbSBkb3VibGUgdG8gYnl0ZSB0eXBlCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYnl0ZVZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0J5dGVWYWx1ZUV4YWN0RG91YmxlKCkgewogICAgICAgICBkb3VibGUgZE51bWJlciA9IDEyMy4wMDAwRDsKICAgICAgICAgQmlnRGVjaW1hbCBiZE51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGROdW1iZXIpOwpAQCAtODUwLDYgKzE0NjgsMTUgQEAKICAgICAgKiAgICAgICBmcm9tIGxvbmcgdG8gYnl0ZSB0eXBlCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYnl0ZVZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0J5dGVWYWx1ZUV4YWN0TG9uZ01pbigpIHsKICAgICAgICAgbG9uZyBsTnVtYmVyID0gTG9uZy5NSU5fVkFMVUU7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmROdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChsTnVtYmVyKTsKQEAgLTg2Niw2ICsxNDkzLDE1IEBACiAgICAgICogICAgICAgZnJvbSBpbnQgdG8gYnl0ZSB0eXBlCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYnl0ZVZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZVZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0J5dGVWYWx1ZUV4YWN0SW50TWF4KCkgewogICAgICAgICBpbnQgaU51bWJlciA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgICBCaWdEZWNpbWFsIGJkTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoaU51bWJlcik7CkBAIC0xMDUwLDYgKzE2ODYsMTUgQEAKICAgICAgKiBAdGVzdCBqYXZhLm1hdGguQmlnRGVjaW1hbCNzaG9ydFZhbHVlRXhhY3QoKSBTaG9ydCB2YWx1ZSBvZiBhIG5lZ2F0aXZlCiAgICAgICogICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hvcnRWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWVFeGFjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2hvcnRWYWx1ZUV4YWN0TmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMTIzODA5NjQ4MzkyMzg0NzU0NTczNTY3MzU2NzQ1NzM1LjYzNTY3ODkwMjk1Nzg0OTAyNzY4Nzg3Njc4Mjg3RSsyMSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTA2NSw2ICsxNzEwLDE1IEBACiAgICAgICogQHRlc3QgamF2YS5tYXRoLkJpZ0RlY2ltYWwjc2hvcnRWYWx1ZUV4YWN0KCkgU2hvcnQgdmFsdWUgb2YgYSBwb3NpdGl2ZQogICAgICAqICAgICAgIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hvcnRWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2hvcnRWYWx1ZUV4YWN0UG9zKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjM4MDk2NDgzOTIzODQ3NTQ1NzM1NjczNTY3NDU3MzUuNjM1Njc4OTAyOTU3ODQ5MDI3Njg3ODc2NzgyODdFKzIxIjsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoYSk7CkBAIC0xMDgwLDYgKzE3MzQsMTUgQEAKICAgICAgKiBAdGVzdCBqYXZhLm1hdGguQmlnRGVjaW1hbCNzaG9ydFZhbHVlRXhhY3QoKSBTaG9ydCB2YWx1ZSBvZiBhIG5lZ2F0aXZlCiAgICAgICogICAgICAgQmlnRGVjaW1hbAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaG9ydFZhbHVlRXhhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hvcnRWYWx1ZUV4YWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TaG9ydFZhbHVlRXhhY3RGbG9hdE5lZygpIHsKICAgICAgICAgQmlnRGVjaW1hbCBhTnVtYmVyID0gbmV3IEJpZ0RlY2ltYWwoIi0zMjc2Ni45OTk5OSIpOwogICAgICAgICB0cnkgewpAQCAtMTA5NCw2ICsxNzU3LDE1IEBACiAgICAgICogQHRlc3QgamF2YS5tYXRoLkJpZ0RlY2ltYWwjc2hvcnRWYWx1ZUV4YWN0KCkgU2hvcnQgdmFsdWUgb2YgYSBwb3NpdGl2ZQogICAgICAqICAgICAgIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hvcnRWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2hvcnRWYWx1ZUV4YWN0RmxvYXRQb3MoKSB7CiAgICAgICAgIGZsb2F0IGEgPSAzMjc2Ny45OTk5OUY7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTEwOSw2ICsxNzgxLDE1IEBACiAgICAgICogQHRlc3QgamF2YS5tYXRoLkJpZ0RlY2ltYWwjc2hvcnRWYWx1ZUV4YWN0KCkgU2hvcnQgdmFsdWUgb2YgYSBwb3NpdGl2ZQogICAgICAqICAgICAgIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hvcnRWYWx1ZUV4YWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNob3J0VmFsdWVFeGFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2hvcnRWYWx1ZUV4YWN0TG9uZ1BvcygpIHsKICAgICAgICAgbG9uZyBhID0gMTIzNDVMOwogICAgICAgICBCaWdEZWNpbWFsIGFOdW1iZXIgPSBuZXcgQmlnRGVjaW1hbChhKTsKQEAgLTExMjAsNiArMTgwMSwxNSBAQAogICAgICAqIEB0ZXN0IGphdmEubWF0aC5CaWdEZWNpbWFsI3Nob3J0VmFsdWVFeGFjdCgpIFNob3J0IHZhbHVlIG9mIGEgcG9zaXRpdmUKICAgICAgKiAgICAgICBCaWdEZWNpbWFsCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNob3J0VmFsdWVFeGFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaG9ydFZhbHVlRXhhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1Nob3J0VmFsdWVFeGFjdExvbmdOZWcoKSB7CiAgICAgICAgIGxvbmcgYSA9IC0xMjM0NUw7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwpAQCAtMTEzMSw2ICsxODIxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI3N0cmlwVHJhaWxpbmdaZXJvcygpIHN0cmlwVHJhaWxpbmdaZXJvcygpIGZvcgogICAgICAqICAgICAgICBCaWdEZWNpbWFsIHdpdGggemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3RyaXBUcmFpbGluZ1plcm9zIG1ldGhvZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0cmlwVHJhaWxpbmdaZXJvcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RyaXBUcmFpbGluZ1plcm9zWmVyb3MoKSB7CiAKICAgICAgICAgQmlnRGVjaW1hbCBiZE51bWJlciA9IG5ldyBCaWdEZWNpbWFsKCIwMDAwMDAwIik7CkBAIC0xMTUzLDYgKzE4NTIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjc3RyaXBUcmFpbGluZ1plcm9zKCkgc3RyaXBUcmFpbGluZ1plcm9zKCkgZm9yCiAgICAgICogICAgICAgIHBvc2l0aXZlIEJpZ0RlY2ltYWwKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3RyaXBUcmFpbGluZ1plcm9zIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN0cmlwVHJhaWxpbmdaZXJvcyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RyaXBUcmFpbGluZ1plcm9zKCkgewogCiAgICAgICAgIFN0cmluZyBzID0gIjAwMDAwMDAwMTAwMDAwMDAwMTAwMDAwMDAwLjAwMDAwMDAwMDEwMDAwMDAwMCI7CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdEZWNpbWFsU2NhbGVPcGVyYXRpb25zVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnRGVjaW1hbFNjYWxlT3BlcmF0aW9uc1Rlc3QuamF2YQppbmRleCAwYjBkMTY1Li40YzYxOGRmIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdEZWNpbWFsU2NhbGVPcGVyYXRpb25zVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0RlY2ltYWxTY2FsZU9wZXJhdGlvbnNUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguKjsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnRGVjaW1hbC5jbGFzcykKIC8qKgogICogQ2xhc3M6ICBqYXZhLm1hdGguQmlnRGVjaW1hbAogICogTWV0aG9kczogbW92ZVBvaW50TGVmdCwgbW92ZVBvaW50UmlnaHQsIHNjYWxlLCBzZXRTY2FsZSwgdW5zY2FsZWRWYWx1ZSAqIApAQCAtMzIsNiArMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgZGVmYXVsdCBzY2FsZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2NhbGUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNjYWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNjYWxlRGVmYXVsdCgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBjU2NhbGUgPSAwOwpAQCAtNDIsNiArNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBDaGVjayBhIG5lZ2F0aXZlIHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNjYWxlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzY2FsZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FsZU5lZygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAtMTA7CkBAIC01Myw2ICs3NywxNSBAQAogICAgIC8qKgogICAgICAqIENoZWNrIGEgcG9zaXRpdmUgc2NhbGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2NhbGUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNjYWxlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNjYWxlUG9zKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDEwOwpAQCAtNjQsNiArOTcsMTUgQEAKICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgemVybyBzY2FsZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzY2FsZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2NhbGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NhbGVaZXJvKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDA7CkBAIC03NSw2ICsxMTcsMTUgQEAKICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgdW5zY2FsZWQgdmFsdWUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bnNjYWxlZFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVuc2NhbGVkVmFsdWUoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTAwOwpAQCAtODYsNiArMTM3LDE1IEBACiAgICAgLyoqCiAgICAgICogU2V0IGEgZ3JlYXRlciBuZXcgc2NhbGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNldFNjYWxlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZUdyZWF0ZXIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTg7CkBAIC05OSw2ICsxNTksMTUgQEAKICAgICAvKioKICAgICAgKiBTZXQgYSBsZXNzIG5ldyBzY2FsZTsgdGhpcy5zY2FsZSA9PSA4OyBuZXdTY2FsZSA9PSA1LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRTY2FsZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2NhbGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2NhbGVMZXNzKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIyLjM0NTcyNjQ1ODc2ODc2MDAwMEUrMTAiOwogICAgICAgICBpbnQgbmV3U2NhbGUgPSA1OwpAQCAtMTExLDYgKzE4MCwxNSBAQAogICAgIC8qKgogICAgICAqIFZlcmlmeSBhbiBleGNlcHRpb24gd2hlbiBzZXR0aW5nIGEgbmV3IHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNldFNjYWxlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZUV4Y2VwdGlvbigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAyODsKQEAgLTEyNyw2ICsyMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHNhbWUgbmV3IHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNldFNjYWxlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZVNhbWUoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMTg7CkBAIC0xNDAsNiArMjI3LDE1IEBACiAgICAgLyoqCiAgICAgICogU2V0IGEgbmV3IHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNjYWxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2NhbGVSb3VuZFVwKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgU3RyaW5nIGIgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM5IjsKQEAgLTE1NCw2ICsyNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXQgYSBuZXcgc2NhbGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFNjYWxlUm91bmREb3duKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgU3RyaW5nIGIgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4IjsKQEAgLTE2OCw2ICsyNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXQgYSBuZXcgc2NhbGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFNjYWxlUm91bmRDZWlsaW5nKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgU3RyaW5nIGIgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM5IjsKQEAgLTE4Miw2ICsyOTYsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXQgYSBuZXcgc2NhbGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFNjYWxlUm91bmRGbG9vcigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIFN0cmluZyBiID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzOCI7CkBAIC0xOTYsNiArMzE5LDE1IEBACiAgICAgLyoqCiAgICAgICogU2V0IGEgbmV3IHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2NhbGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZVJvdW5kSGFsZlVwKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgU3RyaW5nIGIgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4IjsKQEAgLTIxMCw2ICszNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXQgYSBuZXcgc2NhbGUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFNjYWxlUm91bmRIYWxmRG93bigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIFN0cmluZyBiID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzOCI7CkBAIC0yMjQsNiArMzY1LDE1IEBACiAgICAgLyoqCiAgICAgICogU2V0IGEgbmV3IHNjYWxlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2NhbGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZVJvdW5kSGFsZkV2ZW4oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBTdHJpbmcgYiA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzgiOwpAQCAtMjM4LDYgKzM4OCwxNSBAQAogICAgIC8qKgogICAgICAqIFNldFNjYWxlKGludCwgUm91bmRpbmdNb2RlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNjYWxlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2NhbGVJbnRSb3VuZGluZ01vZGUoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMjg7CkBAIC0yNTMsNiArNDEyLDE1IEBACiAgICAgLyoqCiAgICAgICogTW92ZSB0aGUgZGVjaW1hbCBwb2ludCB0byB0aGUgbGVmdDsgdGhlIHNoaWZ0IHZhbHVlIGlzIHBvc2l0aXZlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1vdmVQb2ludExlZnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZVBvaW50TGVmdFBvcygpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAyODsKQEAgLTI2Nyw2ICs0MzUsMTUgQEAKICAgICAvKioKICAgICAgKiBNb3ZlIHRoZSBkZWNpbWFsIHBvaW50IHRvIHRoZSBsZWZ0OyB0aGUgc2hpZnQgdmFsdWUgaXMgcG9zaXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtb3ZlUG9pbnRMZWZ0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1vdmVQb2ludExlZnROZWcoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBpbnQgYVNjYWxlID0gMjg7CkBAIC0yODEsNiArNDU4LDE1IEBACiAgICAgLyoqCiAgICAgICogTW92ZSB0aGUgZGVjaW1hbCBwb2ludCB0byB0aGUgcmlnaHQ7IHRoZSBzaGlmdCB2YWx1ZSBpcyBwb3NpdGl2ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbW92ZVBvaW50UmlnaHQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1vdmVQb2ludFJpZ2h0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1vdmVQb2ludFJpZ2h0UG9zR3JlYXRlcigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMTIzMTIxMjQ3ODk4NzQ4Mjk4ODQyOTgwODc3OTgxMDQ1NzYzNDc4MTM4NDc1Njc5NDk4NyI7CiAgICAgICAgIGludCBhU2NhbGUgPSAyODsKQEAgLTI5NSw2ICs0ODEsMTUgQEAKICAgICAvKioKICAgICAgKiBNb3ZlIHRoZSBkZWNpbWFsIHBvaW50IHRvIHRoZSByaWdodDsgdGhlIHNoaWZ0IHZhbHVlIGlzIHBvc2l0aXZlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vdmVQb2ludFJpZ2h0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtb3ZlUG9pbnRSaWdodCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlUG9pbnRSaWdodFBvc0xlc3MoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg0Mjk4MDg3Nzk4MTA0NTc2MzQ3ODEzODQ3NTY3OTQ5ODciOwogICAgICAgICBTdHJpbmcgYiA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3MDAiOwpAQCAtMzEwLDYgKzUwNSwxNSBAQAogICAgIC8qKgogICAgICAqIE1vdmUgdGhlIGRlY2ltYWwgcG9pbnQgdG8gdGhlIHJpZ2h0OyB0aGUgc2hpZnQgdmFsdWUgaXMgcG9zaXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbW92ZVBvaW50UmlnaHQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1vdmVQb2ludFJpZ2h0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1vdmVQb2ludFJpZ2h0TmVnKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIxMjMxMjEyNDc4OTg3NDgyOTg4NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDI4OwpAQCAtMzI0LDYgKzUyOCwxNSBAQAogICAgIC8qKgogICAgICAqIE1vdmUgdGhlIGRlY2ltYWwgcG9pbnQgdG8gdGhlIHJpZ2h0IHdoZW4gdGhlIHNjYWxlIG92ZXJmbG93cwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtb3ZlUG9pbnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW92ZVBvaW50UmlnaHQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZVBvaW50UmlnaHRFeGNlcHRpb24oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg3MzQ4NzIzNjQ4NzI2MzQ3NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IEludGVnZXIuTUFYX1ZBTFVFOyAvLzIxNDc0ODM2NDcKQEAgLTM0MCw2ICs1NTMsMTUgQEAKICAgICAvKioKICAgICAgKiBwcmVjaXNpb24oKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByZWNpc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjaXNpb24oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjEyMzEyMTI0Nzg5ODc0ODI5ODg3MzQ4NzIzNjQ4NzI2MzQ3NDI5ODA4Nzc5ODEwNDU3NjM0NzgxMzg0NzU2Nzk0OTg3IjsKICAgICAgICAgaW50IGFTY2FsZSA9IDE0OwpAQCAtMzU0LDYgKzU3NiwxNSBAQAogICAgICAqIGNoZWNrIHRoYXQgc2V0U2NhbGUgd2l0aCBhIHNjYWxlIGdyZWF0ZXIgdG8gdGhlIGV4aXN0aW5nIHNjYWxlIGRvZXMgbm90CiAgICAgICogY2hhbmdlIHRoZSB2YWx1ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInByZWNpc2lvbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZSgpIHsKICAgICAgICAgQmlnRGVjaW1hbCB4MSA9IG5ldyBCaWdEZWNpbWFsKDEuMjM0MDApOwogICAgICAgICBCaWdEZWNpbWFsIHgyID0geDEuc2V0U2NhbGUoNzUpOwpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlckFkZFRlc3QuamF2YSBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJBZGRUZXN0LmphdmEKaW5kZXggNzA0OWNmNC4uYjY3Mzg5ZiAxMDA2NDQKLS0tIGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlckFkZFRlc3QuamF2YQorKysgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyQWRkVGVzdC5qYXZhCkBAIC0yMSw5ICsyMSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitAVGVzdFRhcmdldENsYXNzKEJpZ0ludGVnZXIuY2xhc3MpCiAvKioKICAqIENsYXNzOiAgamF2YS5tYXRoLkJpZ0ludGVnZXIKICAqIE1ldGhvZDogYWRkIApAQCAtMzIsNiArMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBBZGQgdHdvIHBvc2l0aXZlIG51bWJlcnMgb2YgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFkZCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtNTIsNiArNjcsMTUgQEAKICAgICAvKioKICAgICAgKiBBZGQgdHdvIG5lZ2F0aXZlIG51bWJlcnMgb2YgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFkZCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtNzQsNiArOTgsMTUgQEAKICAgICAgKiBUaGUgZmlyc3Qgb25lIGlzIHBvc2l0aXZlIGFuZCB0aGUgc2Vjb25kIGlzIG5lZ2F0aXZlLgogICAgICAqIFRoZSBmaXJzdCBvbmUgaXMgZ3JlYXRlciBpbiBhYnNvbHV0ZSB2YWx1ZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHszLCA0LCA1LCA2LCA3LCA4LCA5fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKQEAgLTk2LDYgKzEyOSwxNSBAQAogICAgICAqIFRoZSBmaXJzdCBvbmUgaXMgbmVnYXRpdmUgYW5kIHRoZSBzZWNvbmQgaXMgcG9zaXRpdmUuCiAgICAgICogVGhlIGZpcnN0IG9uZSBpcyBncmVhdGVyIGluIGFic29sdXRlIHZhbHVlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U0KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezMsIDQsIDUsIDYsIDcsIDgsIDl9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwpAQCAtMTE4LDYgKzE2MCwxNSBAQAogICAgICAqIFRoZSBmaXJzdCBpcyBwb3NpdGl2ZSBhbmQgdGhlIHNlY29uZCBpcyBuZWdhdGl2ZS4KICAgICAgKiBUaGUgZmlyc3QgaXMgbGVzcyBpbiBhYnNvbHV0ZSB2YWx1ZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHszLCA0LCA1LCA2LCA3LCA4LCA5fTsKQEAgLTE0MCw2ICsxOTEsMTUgQEAKICAgICAgKiBUaGUgZmlyc3Qgb25lIGlzIG5lZ2F0aXZlIGFuZCB0aGUgc2Vjb25kIGlzIHBvc2l0aXZlLgogICAgICAqIFRoZSBmaXJzdCBvbmUgaXMgbGVzcyBpbiBhYnNvbHV0ZSB2YWx1ZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHszLCA0LCA1LCA2LCA3LCA4LCA5fTsKQEAgLTE2MSw2ICsyMjEsMTUgQEAKICAgICAgKiBBZGQgdHdvIHBvc2l0aXZlIG51bWJlcnMgb2YgZGlmZmVyZW50IGxlbmd0aC4KICAgICAgKiBUaGUgZmlyc3QgaXMgbG9uZ2VyLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U3KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTE4Miw2ICsyNTEsMTUgQEAKICAgICAgKiBBZGQgdHdvIHBvc2l0aXZlIG51bWJlcnMgb2YgZGlmZmVyZW50IGxlbmd0aC4KICAgICAgKiBUaGUgc2Vjb25kIGlzIGxvbmdlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlOCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgMywgNCwgNSwgNiwgN307CkBAIC0yMDEsNiArMjc5LDE1IEBACiAgICAgICogQWRkIHR3byBuZWdhdGl2ZSBudW1iZXJzIG9mIGRpZmZlcmVudCBsZW5ndGguCiAgICAgICogVGhlIGZpcnN0IGlzIGxvbmdlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlOSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CkBAIC0yMjIsNiArMzA5LDE1IEBACiAgICAgICogQWRkIHR3byBuZWdhdGl2ZSBudW1iZXJzIG9mIGRpZmZlcmVudCBsZW5ndGguCiAgICAgICogVGhlIHNlY29uZCBpcyBsb25nZXIuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFkZCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEwKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKQEAgLTI0NCw2ICszNDAsMTUgQEAKICAgICAgKiBUaGUgZmlyc3QgaXMgcG9zaXRpdmUuCiAgICAgICogVGhlIGZpcnN0IGlzIGxvbmdlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgMywgNCwgNSwgNiwgN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtMjY2LDYgKzM3MSwxNSBAQAogICAgICAqIFRoZSBmaXJzdCBpcyBwb3NpdGl2ZS4KICAgICAgKiBUaGUgc2Vjb25kIGlzIGxvbmdlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OwpAQCAtMjg4LDYgKzQwMiwxNSBAQAogICAgICAqIFRoZSBmaXJzdCBpcyBuZWdhdGl2ZS4KICAgICAgKiBUaGUgZmlyc3QgaXMgbG9uZ2VyLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CkBAIC0zMTAsNiArNDMzLDE1IEBACiAgICAgICogVGhlIGZpcnN0IGlzIG5lZ2F0aXZlLgogICAgICAqIFRoZSBzZWNvbmQgaXMgbG9uZ2VyLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxNCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgMywgNCwgNSwgNiwgN307CkBAIC0zMzAsNiArNDYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQWRkIHR3byBlcXVhbCBudW1iZXJzIG9mIGRpZmZlcmVudCBzaWducwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxNSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKQEAgLTM0OSw2ICs0OTAsMTUgQEAKICAgICAvKioKICAgICAgKiBBZGQgemVybyB0byBhIG51bWJlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxNigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTM2OSw2ICs1MTksMTUgQEAKICAgICAvKioKICAgICAgKiBBZGQgYSBudW1iZXIgdG8gemVybwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxNygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKQEAgLTM4OSw2ICs1NDgsMTUgQEAKICAgICAvKioKICAgICAgKiBBZGQgemVybyB0byB6ZXJvCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFkZCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTE4KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezB9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezB9OwpAQCAtNDA5LDYgKzU3NywxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCBaRVJPIHRvIGEgbnVtYmVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFkZCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTE5KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIHJCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwpAQCAtNDI3LDYgKzYwNCwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCBhIG51bWJlciB0byB6ZXJvCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFkZCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTIwKCkgewogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIHJCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwpAQCAtNDQ1LDYgKzYzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEFkZCBaRVJPIHRvIFpFUk8KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYWRkIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMjEoKSB7CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7MH07CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIuWkVSTzsKQEAgLTQ2MSw2ICs2NTYsMTUgQEAKICAgICAvKioKICAgICAgKiBBZGQgT05FIHRvIE9ORQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UyMigpIHsKICAgICAgICAgYnl0ZSByQnl0ZXNbXSA9IHsyfTsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gQmlnSW50ZWdlci5PTkU7CkBAIC00NzcsNiArNjgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQWRkIHR3byBudW1iZXJzIHNvIHRoYXQgY2FycnkgaXMgMQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhZGQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UyMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyQW5kVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlckFuZFRlc3QuamF2YQppbmRleCA0M2QwNTU2Li5mMjVkZDZkIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyQW5kVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJBbmRUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnSW50ZWdlci5jbGFzcykKIC8qKgogICogQ2xhc3M6ICBqYXZhLm1hdGguQmlnSW50ZWdlcgogICogTWV0aG9kOiBhbmQgCkBAIC0zMiw2ICszOCwxNSBAQAogICAgIC8qKgogICAgICAqIEFuZCBmb3IgemVybyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0WmVyb1BvcygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTUyLDYgKzY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQW5kIGZvciB6ZXJvIGFuZCBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFplcm9OZWcoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC03Miw2ICs5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEFuZCBmb3IgYSBwb3NpdGl2ZSBudW1iZXIgYW5kIHplcm8gCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zWmVybygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTkyLDYgKzEyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEFuZCBmb3IgYSBuZWdhdGl2ZSBudW1iZXIgYW5kIHplcm8gIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ1BvcygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTExMiw2ICsxNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBBbmQgZm9yIHplcm8gYW5kIHplcm8KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYW5kIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbmQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RaZXJvWmVybygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTEzMiw2ICsxODMsMTUgQEAKICAgICAvKioKICAgICAgKiBBbmQgZm9yIHplcm8gYW5kIG9uZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFplcm9PbmUoKSB7CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIuWkVSTzsKICAgICAgICAgQmlnSW50ZWdlciBiTnVtYmVyID0gQmlnSW50ZWdlci5PTkU7CkBAIC0xNDMsNiArMjAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQW5kIGZvciBvbmUgYW5kIG9uZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9uZU9uZSgpIHsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gQmlnSW50ZWdlci5PTkU7CiAgICAgICAgIEJpZ0ludGVnZXIgYk51bWJlciA9IEJpZ0ludGVnZXIuT05FOwpAQCAtMTU0LDYgKzIyMywxNSBAQAogICAgIC8qKgogICAgICAqIEFuZCBmb3IgdHdvIHBvc2l0aXZlIG51bWJlcnMgb2YgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zUG9zU2FtZUxlbmd0aCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0xNzQsNiArMjUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQW5kIGZvciB0d28gcG9zaXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIGxvbmdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvc1Bvc0ZpcnN0TG9uZ2VyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjgsIDksIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3LCAyMywgODcsIC0yNSwgLTc1fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTE5NCw2ICsyODEsMTUgQEAKICAgICAvKioKICAgICAgKiBBbmQgZm9yIHR3byBwb3NpdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgc2hvcnRlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvc1Bvc0ZpcnN0U2hvcnRlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTI4LCA5LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExNywgMjMsIDg3LCAtMjUsIC03NX07CkBAIC0yMTQsNiArMzEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQW5kIGZvciB0d28gbmVnYXRpdmUgbnVtYmVycyBvZiB0aGUgc2FtZSBsZW5ndGgKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYW5kIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbmQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdOZWdTYW1lTGVuZ3RoKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTIzNCw2ICszMzksMTUgQEAKICAgICAvKioKICAgICAgKiBBbmQgZm9yIHR3byBuZWdhdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgbG9uZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnTmVnRmlyc3RMb25nZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwpAQCAtMjU0LDYgKzM2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEFuZCBmb3IgdHdvIG5lZ2F0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBzaG9ydGVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnTmVnRmlyc3RTaG9ydGVyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0xMjgsIDksIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3LCAyMywgODcsIC0yNSwgLTc1fTsKQEAgLTI3NCw2ICszOTcsMTUgQEAKICAgICAvKioKICAgICAgKiBBbmQgZm9yIHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzaWducyBhbmQgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zTmVnU2FtZUxlbmd0aCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0yOTQsNiArNDI2LDE1IEBACiAgICAgLyoqCiAgICAgICogQW5kIGZvciB0d28gbnVtYmVycyBvZiBkaWZmZXJlbnQgc2lnbnMgYW5kIHRoZSBzYW1lIGxlbmd0aAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ1Bvc1NhbWVMZW5ndGgoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwpAQCAtMzE0LDYgKzQ1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEFuZCBmb3IgYSBuZWdhdGl2ZSBhbmQgYSBwb3NpdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgbG9uZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnUG9zRmlyc3RMb25nZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwpAQCAtMzM0LDYgKzQ4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEFuZCBmb3IgYSBuZWdhdGl2ZSBhbmQgYSBwb3NpdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgc2hvcnRlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ1Bvc0ZpcnN0U2hvcnRlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTI4LCA5LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExNywgMjMsIDg3LCAtMjUsIC03NX07CkBAIC0zNTQsNiArNTEzLDE1IEBACiAgICAgLyoqCiAgICAgICogQW5kIGZvciBhIHBvc2l0aXZlIGFuZCBhIG5lZ2F0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBsb25nZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYW5kIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbmQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NOZWdGaXJzdExvbmdlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA5LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExNywgMjMsIDg3LCAtMjUsIC03NX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0zNzQsNiArNTQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQW5kIGZvciBhIHBvc2l0aXZlIGFuZCBhIG5lZ2F0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBzaG9ydGVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zTmVnRmlyc3RTaG9ydGVyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0xMjgsIDksIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3LCAyMywgODcsIC0yNSwgLTc1fTsKQEAgLTM5NCw2ICs1NzEsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0IGZvciBhIHNwZWNpYWwgY2FzZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImFuZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNwZWNpYWxDYXNlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEsIC0xLCAtMX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7NSwgLTQsIC0zLCAtMn07CkBAIC00MTQsNiArNjAwLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgYSBzcGVjaWFsIGNhc2UKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYW5kIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbmQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWFsQ2FzZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTUxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstNTIsIC01MSwgLTUwLCAtNDksIC00OH07CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyQ29tcGFyZVRlc3QuamF2YSBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJDb21wYXJlVGVzdC5qYXZhCmluZGV4IGI3MDBkNjIuLjE1M2EwMDIgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJDb21wYXJlVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJDb21wYXJlVGVzdC5qYXZhCkBAIC0yMSw5ICsyMSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitAVGVzdFRhcmdldENsYXNzKEJpZ0ludGVnZXIuY2xhc3MpCiAvKioKICAqIENsYXNzOiAgIGphdmEubWF0aC5CaWdJbnRlZ2VyCiAgKiBNZXRob2RzOiBhYnMsIGNvbXBhcmVUbywgZXF1YWxzLCBtYXgsIG1pbiwgbmVnYXRlLCBzaWdudW0KQEAgLTMyLDYgKzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogYWJzKCkgZm9yIGEgcG9zaXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhYnMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFicyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNQb3NpdGl2ZSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTQ5LDYgKzY0LDE1IEBACiAgICAgLyoqCiAgICAgICogYWJzKCkgZm9yIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFicyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFic05lZ2F0aXZlKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTY4LDYgKzkyLDE1IEBACiAgICAgICogQ29tcGFyZSB0d28gcG9zaXRpdmUgbnVtYmVycy4KICAgICAgKiBUaGUgZmlyc3QgaXMgZ3JlYXRlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNvbXBhcmVUbyBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvUG9zUG9zMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CkBAIC04Myw2ICsxMTYsMTUgQEAKICAgICAgKiBDb21wYXJlIHR3byBwb3NpdGl2ZSBudW1iZXJzLgogICAgICAqIFRoZSBmaXJzdCBpcyBsZXNzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUb1Bvc1BvczIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwpAQCAtOTcsNiArMTM5LDE1IEBACiAgICAgICogY29tcGFyZVRvKEJpZ0ludGVnZXIgYSkuCiAgICAgICogQ29tcGFyZSB0d28gZXF1YWwgcG9zaXRpdmUgbnVtYmVycy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY29tcGFyZVRvIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9FcXVhbFBvcygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKQEAgLTExMiw2ICsxNjMsMTUgQEAKICAgICAgKiBDb21wYXJlIHR3byBuZWdhdGl2ZSBudW1iZXJzLgogICAgICAqIFRoZSBmaXJzdCBpcyBncmVhdGVyIGluIGFic29sdXRlIHZhbHVlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUb05lZ05lZzEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtMTI3LDYgKzE4NywxNSBAQAogICAgICAqIENvbXBhcmUgdHdvIG5lZ2F0aXZlIG51bWJlcnMuCiAgICAgICogVGhlIGZpcnN0IGlzIGxlc3MgIGluIGFic29sdXRlIHZhbHVlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVOZWdOZWcyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKQEAgLTE0MSw2ICsyMTAsMTUgQEAKICAgICAgKiBjb21wYXJlVG8oQmlnSW50ZWdlciBhKS4KICAgICAgKiBDb21wYXJlIHR3byBlcXVhbCBuZWdhdGl2ZSBudW1iZXJzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUb0VxdWFsTmVnKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwpAQCAtMTU2LDYgKzIzNCwxNSBAQAogICAgICAqIENvbXBhcmUgdHdvIG51bWJlcnMgb2YgZGlmZmVyZW50IHNpZ25zLgogICAgICAqIFRoZSBmaXJzdCBpcyBwb3NpdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY29tcGFyZVRvIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9EaWZmU2lnbnMxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTE3MSw2ICsyNTgsMTUgQEAKICAgICAgKiBDb21wYXJlIHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzaWducy4KICAgICAgKiBUaGUgZmlyc3QgaXMgbmVnYXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNvbXBhcmVUbyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvRGlmZlNpZ25zMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CkBAIC0xODUsNiArMjgxLDE1IEBACiAgICAgICogY29tcGFyZVRvKEJpZ0ludGVnZXIgYSkuCiAgICAgICogQ29tcGFyZSBhIHBvc2l0aXZlIG51bWJlciB0byBaRVJPLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUb1Bvc1plcm8oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xOTcsNiArMzAyLDE1IEBACiAgICAgICogY29tcGFyZVRvKEJpZ0ludGVnZXIgYSkuCiAgICAgICogQ29tcGFyZSBaRVJPIHRvIGEgcG9zaXRpdmUgbnVtYmVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUb1plcm9Qb3MoKSB7CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGludCBiU2lnbiA9IDE7CkBAIC0yMDksNiArMzIzLDE1IEBACiAgICAgICogY29tcGFyZVRvKEJpZ0ludGVnZXIgYSkuCiAgICAgICogQ29tcGFyZSBhIG5lZ2F0aXZlIG51bWJlciB0byBaRVJPLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjb21wYXJlVG8gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUb05lZ1plcm8oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtMjIxLDYgKzM0NCwxNSBAQAogICAgICAqIGNvbXBhcmVUbyhCaWdJbnRlZ2VyIGEpLgogICAgICAqIENvbXBhcmUgWkVSTyB0byBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY29tcGFyZVRvIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9aZXJvTmVnKCkgewogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBpbnQgYlNpZ24gPSAtMTsKQEAgLTIzMyw2ICszNjUsMTUgQEAKICAgICAgKiBjb21wYXJlVG8oQmlnSW50ZWdlciBhKS4KICAgICAgKiBDb21wYXJlIFpFUk8gdG8gWkVSTy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY29tcGFyZVRvIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9aZXJvWmVybygpIHsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gQmlnSW50ZWdlci5aRVJPOwogICAgICAgICBCaWdJbnRlZ2VyIGJOdW1iZXIgPSBCaWdJbnRlZ2VyLlpFUk87CkBAIC0yNDMsNiArMzg0LDE1IEBACiAgICAgICogZXF1YWxzKE9iamVjdCBvYmopLgogICAgICAqIG9iaiBpcyBub3QgYSBCaWdJbnRlZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBlcXVhbHMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMjU0LDYgKzQwNCwxNSBAQAogICAgIC8qKgogICAgICAqIGVxdWFscyhudWxsKS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZXF1YWxzIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc051bGwoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0yNjYsNiArNDI1LDE1IEBACiAgICAgICogb2JqIGlzIGEgQmlnSW50ZWdlci4KICAgICAgKiBudW1iZXJzIGFyZSBlcXVhbC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZXF1YWxzIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0JpZ0ludGVnZXJUcnVlKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwpAQCAtMjgxLDYgKzQ0OSwxNSBAQAogICAgICAqIG9iaiBpcyBhIEJpZ0ludGVnZXIuCiAgICAgICogbnVtYmVycyBhcmUgbm90IGVxdWFsLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBlcXVhbHMgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQmlnSW50ZWdlckZhbHNlKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKQEAgLTI5NSw2ICs0NzIsMTUgQEAKICAgICAgKiBtYXgoQmlnSW50ZWdlciB2YWwpLgogICAgICAqIHRoZSBmaXJzdCBpcyBncmVhdGVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbWF4IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhHcmVhdGVyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKQEAgLTMxNiw2ICs1MDIsMTUgQEAKICAgICAgKiBtYXgoQmlnSW50ZWdlciB2YWwpLgogICAgICAqIHRoZSBmaXJzdCBpcyBsZXNzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtYXggbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1heCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1heExlc3MoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7NDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwpAQCAtMzM3LDYgKzUzMiwxNSBAQAogICAgICAqIG1heChCaWdJbnRlZ2VyIHZhbCkuCiAgICAgICogbnVtYmVycyBhcmUgZXF1YWwuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1heCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4RXF1YWwoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7NDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKQEAgLTM1OCw2ICs1NjIsMTUgQEAKICAgICAgKiBtYXgoQmlnSW50ZWdlciB2YWwpLgogICAgICAqIG1heCBvZiBuZWdhdGl2ZSBhbmQgWkVSTy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbWF4IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXgiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhOZWdaZXJvKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0zNzcsNiArNTkwLDE1IEBACiAgICAgICogbWluKEJpZ0ludGVnZXIgdmFsKS4KICAgICAgKiB0aGUgZmlyc3QgaXMgZ3JlYXRlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1peCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluR3JlYXRlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHs0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CkBAIC0zOTgsNiArNjIwLDE1IEBACiAgICAgICogbWluKEJpZ0ludGVnZXIgdmFsKS4KICAgICAgKiB0aGUgZmlyc3QgaXMgbGVzcy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbWl4IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtaW4iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5MZXNzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKQEAgLTQxOSw2ICs2NTAsMTUgQEAKICAgICAgKiBtaW4oQmlnSW50ZWdlciB2YWwpLgogICAgICAqIG51bWJlcnMgYXJlIGVxdWFsLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtaXggbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1pbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1pbkVxdWFsKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHs0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CkBAIC00NDAsNiArNjgwLDE1IEBACiAgICAgICogbWF4KEJpZ0ludGVnZXIgdmFsKS4KICAgICAgKiBtaW4gb2YgcG9zaXRpdmUgYW5kIFpFUk8uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1peCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluUG9zWmVybygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHs0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC00NTgsNiArNzA3LDE1IEBACiAgICAgLyoqCiAgICAgICogbmVnYXRlKCkgYSBwb3NpdGl2ZSBudW1iZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBuZWdhdGUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5lZ2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGVQb3NpdGl2ZSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTQ3NSw2ICs3MzMsMTUgQEAKICAgICAvKioKICAgICAgKiBuZWdhdGUoKSBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbmVnYXRlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZWdhdGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRlTmVnYXRpdmUoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNDkyLDYgKzc1OSwxNSBAQAogICAgIC8qKgogICAgICAqIG5lZ2F0ZSgpIFpFUk8uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG5lZ2F0ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmVnYXRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0ZVplcm8oKSB7CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7MH07CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIuWkVSTzsKQEAgLTUwNyw2ICs3ODMsMTUgQEAKICAgICAvKioKICAgICAgKiBzaWdudW0oKSBvZiBhIHBvc2l0aXZlIG51bWJlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNpZ251bSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2lnbnVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpZ251bVBvc2l0aXZlKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtNTE3LDYgKzgwMiwxNSBAQAogICAgIC8qKgogICAgICAqIHNpZ251bSgpIG9mIGEgbmVnYXRpdmUgbnVtYmVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaWdudW0gbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNpZ251bSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWdudW1OZWdhdGl2ZSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC01MjcsNiArODIxLDE1IEBACiAgICAgLyoqCiAgICAgICogc2lnbnVtKCkgb2YgWkVSTy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2lnbnVtIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaWdudW0iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbnVtWmVybygpIHsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gQmlnSW50ZWdlci5aRVJPOwogICAgICAgICBhc3NlcnRFcXVhbHMoImluY29ycmVjdCBzaWduIiwgMCwgYU51bWJlci5zaWdudW0oKSk7CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyQ29uc3RydWN0b3JzVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlckNvbnN0cnVjdG9yc1Rlc3QuamF2YQppbmRleCBhZDliMTE4Li4zYTdkMDgxIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyQ29uc3RydWN0b3JzVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJDb25zdHJ1Y3RvcnNUZXN0LmphdmEKQEAgLTIxLDEwICsyMSwxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnSW50ZWdlci5jbGFzcykKIC8qKgogICogQ2xhc3M6ICAgamF2YS5tYXRoLkJpZ0ludGVnZXIKICAqIENvbnN0cnVjdG9yczogQmlnSW50ZWdlcihieXRlW10gYSksIEJpZ0ludGVnZXIoaW50IHNpZ24sIGJ5dGVbXSBhKSwgCkBAIC0zNSw2ICs0MSwxNSBAQAogICAgICAqIENyZWF0ZSBhIG51bWJlciBmcm9tIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIFZlcmlmeSBhbiBleGNlcHRpb24gdGhyb3duIGlmIGFuIGFycmF5IGlzIHplcm8gYnl0ZXMgbG9uZwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JCeXRlc0V4Y2VwdGlvbigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHt9OwogICAgICAgICB0cnkgewpAQCAtNDksNiArNjQsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBwb3NpdGl2ZSBudW1iZXIgZnJvbSBhbiBhcnJheSBvZiBieXRlcy4KICAgICAgKiBUaGUgbnVtYmVyIGZpdHMgaW4gYW4gYXJyYXkgb2YgaW50ZWdlcnMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yQnl0ZXNQb3NpdGl2ZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CkBAIC02NSw2ICs4OSwxNSBAQAogICAgICAqIENyZWF0ZSBhIHBvc2l0aXZlIG51bWJlciBmcm9tIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIFRoZSBudW1iZXIgZml0cyBpbiBhbiBpbnRlZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckJ5dGVzUG9zaXRpdmUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwfTsKICAgICAgICAgYnl0ZSByQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMH07CkBAIC04MSw2ICsxMTQsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBwb3NpdGl2ZSBudW1iZXIgZnJvbSBhbiBhcnJheSBvZiBieXRlcy4KICAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGlzIDQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yQnl0ZXNQb3NpdGl2ZTMoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTI3LCA1NiwgMTAwLCAtMX07CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7MTI3LCA1NiwgMTAwLCAtMX07CkBAIC05Nyw2ICsxMzksMTUgQEAKICAgICAgKiBDcmVhdGUgYSBwb3NpdGl2ZSBudW1iZXIgZnJvbSBhbiBhcnJheSBvZiBieXRlcy4KICAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGlzIG11bHRpcGxlIG9mIDQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yQnl0ZXNQb3NpdGl2ZSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMjcsIDU2LCAxMDAsIC0xLCAxNCwgNzUsIC0yNCwgLTEwMH07CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7MTI3LCA1NiwgMTAwLCAtMSwgMTQsIDc1LCAtMjQsIC0xMDB9OwpAQCAtMTEzLDYgKzE2NCwxNSBAQAogICAgICAqIENyZWF0ZSBhIG5lZ2F0aXZlIG51bWJlciBmcm9tIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIFRoZSBudW1iZXIgZml0cyBpbiBhbiBhcnJheSBvZiBpbnRlZ2Vycy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JCeXRlc05lZ2F0aXZlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7LTEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgMywgOTF9OwpAQCAtMTI5LDYgKzE4OSwxNSBAQAogICAgICAqIENyZWF0ZSBhIG5lZ2F0aXZlIG51bWJlciBmcm9tIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIFRoZSBudW1iZXIgZml0cyBpbiBhbiBpbnRlZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckJ5dGVzTmVnYXRpdmUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMiwgNTYsIDEwMH07CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7LTEyLCA1NiwgMTAwfTsKQEAgLTE0NSw2ICsyMTQsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBuZWdhdGl2ZSBudW1iZXIgZnJvbSBhbiBhcnJheSBvZiBieXRlcy4KICAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGlzIDQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yQnl0ZXNOZWdhdGl2ZTMoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgLTEyLCA1NiwgMTAwfTsKICAgICAgICAgYnl0ZSByQnl0ZXNbXSA9IHstMTI4LCAtMTIsIDU2LCAxMDB9OwpAQCAtMTYxLDYgKzIzOSwxNSBAQAogICAgICAqIENyZWF0ZSBhIG5lZ2F0aXZlIG51bWJlciBmcm9tIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgbXVsdGlwbGUgb2YgNC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JCeXRlc05lZ2F0aXZlNCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCAtMTIsIDU2LCAxMDAsIC0xMywgNTYsIDkzLCAtNzh9OwogICAgICAgICBieXRlIHJCeXRlc1tdID0gey0xMjgsIC0xMiwgNTYsIDEwMCwgLTEzLCA1NiwgOTMsIC03OH07CkBAIC0xNzYsNiArMjYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgemVybyBudW1iZXIgZnJvbSBhbiBhcnJheSBvZiB6ZXJvIGJ5dGVzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckJ5dGVzWmVybygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswLCAwLCAwLCAtMCwgKzAsIDAsIC0wfTsKICAgICAgICAgYnl0ZSByQnl0ZXNbXSA9IHswfTsKQEAgLTE5Miw2ICsyODgsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBudW1iZXIgZnJvbSBhIHNpZ24gYW5kIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIFZlcmlmeSBhbiBleGNlcHRpb24gdGhyb3duIGlmIGEgc2lnbiBoYXMgaW1wcm9wZXIgdmFsdWUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoaW50LCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclNpZ25CeXRlc0V4Y2VwdGlvbjEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIzLCA0NSwgLTMsIC03Nn07CiAgICAgICAgIGludCBhU2lnbiA9IDM7CkBAIC0yMDcsNiArMzEyLDE1IEBACiAgICAgICogQ3JlYXRlIGEgbnVtYmVyIGZyb20gYSBzaWduIGFuZCBhbiBhcnJheSBvZiBieXRlcy4KICAgICAgKiBWZXJpZnkgYW4gZXhjZXB0aW9uIHRocm93biBpZiB0aGUgYXJyYXkgY29udGFpbnMgbm9uLXplcm8gYnl0ZXMgd2hpbGUgdGhlIHNpZ24gaXMgMC4gCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoaW50LCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclNpZ25CeXRlc0V4Y2VwdGlvbjIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIzLCA0NSwgLTMsIC03Nn07CiAgICAgICAgIGludCBhU2lnbiA9IDA7CkBAIC0yMjMsNiArMzM3LDE1IEBACiAgICAgICogVGhlIG51bWJlciBmaXRzIGluIGFuIGFycmF5IG9mIGludGVnZXJzLgogICAgICAqIFRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgaXMgcG9zaXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoaW50LCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclNpZ25CeXRlc1Bvc2l0aXZlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTI0MSw2ICszNjQsMTUgQEAKICAgICAgKiBUaGUgbnVtYmVyIGZpdHMgaW4gYW4gYXJyYXkgb2YgaW50ZWdlcnMuCiAgICAgICogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBuZWdhdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzUG9zaXRpdmUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTI1OCw2ICszOTAsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBwb3NpdGl2ZSBudW1iZXIgZnJvbSBhIHNpZ24gYW5kIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIFRoZSBudW1iZXIgZml0cyBpbiBhbiBpbnRlZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNQb3NpdGl2ZTMoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyLCA1NiwgMTAwfTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTI3Niw2ICs0MTcsMTUgQEAKICAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGlzIDQuCiAgICAgICogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBwb3NpdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzUG9zaXRpdmU0KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyNywgNTYsIDEwMCwgLTJ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMjk0LDYgKzQ0NCwxNSBAQAogICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgNC4KICAgICAgKiBUaGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIG5lZ2F0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNQb3NpdGl2ZTUoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyNywgNTYsIDEwMCwgLTJ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMzEyLDYgKzQ3MSwxNSBAQAogICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgbXVsdGlwbGUgb2YgNC4KICAgICAgKiBUaGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIHBvc2l0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNQb3NpdGl2ZTYoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMjMsIC0xMDF9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMzMwLDYgKzQ5OCwxNSBAQAogICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgbXVsdGlwbGUgb2YgNC4KICAgICAgKiBUaGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIG5lZ2F0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNQb3NpdGl2ZTcoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDIzLCAtMTAxfTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTM0OCw2ICs1MjUsMTUgQEAKICAgICAgKiBUaGUgbnVtYmVyIGZpdHMgaW4gYW4gYXJyYXkgb2YgaW50ZWdlcnMuCiAgICAgICogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBwb3NpdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzTmVnYXRpdmUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTV9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTM2Niw2ICs1NTIsMTUgQEAKICAgICAgKiBUaGUgbnVtYmVyIGZpdHMgaW4gYW4gYXJyYXkgb2YgaW50ZWdlcnMuCiAgICAgICogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBuZWdhdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzTmVnYXRpdmUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0zODMsNiArNTc4LDE1IEBACiAgICAgICogQ3JlYXRlIGEgbmVnYXRpdmUgbnVtYmVyIGZyb20gYSBzaWduIGFuZCBhbiBhcnJheSBvZiBieXRlcy4KICAgICAgKiBUaGUgbnVtYmVyIGZpdHMgaW4gYW4gaW50ZWdlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzTmVnYXRpdmUzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMiwgNTYsIDEwMH07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNDAxLDYgKzYwNSwxNSBAQAogICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgNC4KICAgICAgKiBUaGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIHBvc2l0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNOZWdhdGl2ZTQoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTI3LCA1NiwgMTAwLCAtMn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNDE5LDYgKzYzMiwxNSBAQAogICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgNC4KICAgICAgKiBUaGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIG5lZ2F0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNOZWdhdGl2ZTUoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyNywgNTYsIDEwMCwgLTJ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTQzNyw2ICs2NTksMTUgQEAKICAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGlzIG11bHRpcGxlIG9mIDQuCiAgICAgICogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBwb3NpdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzTmVnYXRpdmU2KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDIzLCAtMTAxfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC00NTUsNiArNjg2LDE1IEBACiAgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBpcyBtdWx0aXBsZSBvZiA0LgogICAgICAqIFRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgaXMgbmVnYXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoaW50LCBieXRlW10pIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclNpZ25CeXRlc05lZ2F0aXZlNygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMjMsIC0xMDF9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTQ3Miw2ICs3MTIsMTUgQEAKICAgICAgKiBDcmVhdGUgYSB6ZXJvIG51bWJlciBmcm9tIGEgc2lnbiBhbmQgYW4gYXJyYXkgb2YgemVybyBieXRlcy4KICAgICAgKiBUaGUgc2lnbiBpcyAtMS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzWmVybzEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTAsIDAsICswLCAwLCAwLCAwMCwgMDAwfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC00ODksNiArNzM4LDE1IEBACiAgICAgICogQ3JlYXRlIGEgemVybyBudW1iZXIgZnJvbSBhIHNpZ24gYW5kIGFuIGFycmF5IG9mIHplcm8gYnl0ZXMuCiAgICAgICogVGhlIHNpZ24gaXMgMC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzWmVybzIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTAsIDAsICswLCAwLCAwLCAwMCwgMDAwfTsKICAgICAgICAgaW50IGFTaWduID0gMDsKQEAgLTUwNiw2ICs3NjQsMTUgQEAKICAgICAgKiBDcmVhdGUgYSB6ZXJvIG51bWJlciBmcm9tIGEgc2lnbiBhbmQgYW4gYXJyYXkgb2YgemVybyBieXRlcy4KICAgICAgKiBUaGUgc2lnbiBpcyAxLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNaZXJvMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMCwgMCwgKzAsIDAsIDAsIDAwLCAwMDB9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtNTIzLDYgKzc5MCwxNSBAQAogICAgICAqIENyZWF0ZSBhIHplcm8gbnVtYmVyIGZyb20gYSBzaWduIGFuZCBhbiBhcnJheSBvZiB6ZXJvIGxlbmd0aC4KICAgICAgKiBUaGUgc2lnbiBpcyAtMS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzWmVyb051bGwxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0ge307CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNTQwLDYgKzgxNiwxNSBAQAogICAgICAqIENyZWF0ZSBhIHplcm8gbnVtYmVyIGZyb20gYSBzaWduIGFuZCBhbiBhcnJheSBvZiB6ZXJvIGxlbmd0aC4KICAgICAgKiBUaGUgc2lnbiBpcyAwLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKGludCwgYnl0ZVtdKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTaWduQnl0ZXNaZXJvTnVsbDIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7fTsKICAgICAgICAgaW50IGFTaWduID0gMDsKQEAgLTU1Nyw2ICs4NDIsMTUgQEAKICAgICAgKiBDcmVhdGUgYSB6ZXJvIG51bWJlciBmcm9tIGEgc2lnbiBhbmQgYW4gYXJyYXkgb2YgemVybyBsZW5ndGguCiAgICAgICogVGhlIHNpZ24gaXMgMS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihpbnQsIGJ5dGVbXSkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU2lnbkJ5dGVzWmVyb051bGwzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0ge307CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC01NzQsNiArODY4LDE1IEBACiAgICAgICogQ3JlYXRlIGEgbnVtYmVyIGZyb20gYSBzdHJpbmcgdmFsdWUgYW5kIHJhZGl4LgogICAgICAqIFZlcmlmeSBhbiBleGNlcHRpb24gdGhyb3duIGlmIGEgcmFkaXggaXMgb3V0IG9mIHJhbmdlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKFN0cmluZywgaW50KSBjb25zdHJ1Y3Rvci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU3RyaW5nRXhjZXB0aW9uMSgpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gIjkyMzQ4NTM4NzY0MDEiOwogICAgICAgICBpbnQgcmFkaXggPSA0NTsKQEAgLTU4OSw2ICs4OTIsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBudW1iZXIgZnJvbSBhIHN0cmluZyB2YWx1ZSBhbmQgcmFkaXguCiAgICAgICogVmVyaWZ5IGFuIGV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCBhIHNwYWNlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKFN0cmluZywgaW50KSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU3RyaW5nRXhjZXB0aW9uMigpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gIiAgIDkyMzQ4NTM4NzY0MDEiOwogICAgICAgICBpbnQgcmFkaXggPSAxMDsKQEAgLTYwMyw2ICs5MTUsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBudW1iZXIgZnJvbSBhIHN0cmluZyB2YWx1ZSBhbmQgcmFkaXguCiAgICAgICogVmVyaWZ5IGFuIGV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHN0cmluZyBjb250YWlucyBpbXByb3BlciBjaGFyYWN0ZXJzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKFN0cmluZywgaW50KSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU3RyaW5nRXhjZXB0aW9uMygpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gIjkyMzQ4JCojNzg5ODciOwogICAgICAgICBpbnQgcmFkaXggPSAzNDsKQEAgLTYxNyw2ICs5MzgsMTUgQEAKICAgICAgKiBDcmVhdGUgYSBudW1iZXIgZnJvbSBhIHN0cmluZyB2YWx1ZSBhbmQgcmFkaXguCiAgICAgICogVmVyaWZ5IGFuIGV4Y2VwdGlvbiB0aHJvd24gaWYgc29tZSBkaWdpdHMgYXJlIGdyZWF0ZXIgdGhhbiByYWRpeC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihTdHJpbmcsIGludCkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclN0cmluZ0V4Y2VwdGlvbjQoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICI5OHp2NzY1aGRzYWl5IjsKICAgICAgICAgaW50IHJhZGl4ID0gMjA7CkBAIC02MzAsNiArOTYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcG9zaXRpdmUgbnVtYmVyIGZyb20gYSBzdHJpbmcgdmFsdWUgYW5kIHJhZGl4IDIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoU3RyaW5nLCBpbnQpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTdHJpbmdSYWRpeDIoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICIxMDEwMTAxMDEwMTAxMDEwMSI7CiAgICAgICAgIGludCByYWRpeCA9IDI7CkBAIC02NDYsNiArOTg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcG9zaXRpdmUgbnVtYmVyIGZyb20gYSBzdHJpbmcgdmFsdWUgYW5kIHJhZGl4IDguCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoU3RyaW5nLCBpbnQpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTdHJpbmdSYWRpeDgoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICI3NjM1NjIzNzA3MTYyMzQ1MCI7CiAgICAgICAgIGludCByYWRpeCA9IDg7CkBAIC02NjIsNiArMTAxMCwxNSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIHBvc2l0aXZlIG51bWJlciBmcm9tIGEgc3RyaW5nIHZhbHVlIGFuZCByYWRpeCAxMC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihTdHJpbmcsIGludCkgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclN0cmluZ1JhZGl4MTAoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICI5ODczMjg5MDEzNDg5MzQ4OTgiOwogICAgICAgICBpbnQgcmFkaXggPSAxMDsKQEAgLTY3OCw2ICsxMDM1LDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcG9zaXRpdmUgbnVtYmVyIGZyb20gYSBzdHJpbmcgdmFsdWUgYW5kIHJhZGl4IDE2LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKFN0cmluZywgaW50KSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU3RyaW5nUmFkaXgxNigpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gImZlMjM0MGE4YjVjZTc5MCI7CiAgICAgICAgIGludCByYWRpeCA9IDE2OwpAQCAtNjk0LDYgKzEwNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBwb3NpdGl2ZSBudW1iZXIgZnJvbSBhIHN0cmluZyB2YWx1ZSBhbmQgcmFkaXggMzYuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoU3RyaW5nLCBpbnQpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTdHJpbmdSYWRpeDM2KCkgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSAic2tkamdvY3ZoZGpma2wyMGpuZGprZjM0N2VqZzQ1NyI7CiAgICAgICAgIGludCByYWRpeCA9IDM2OwpAQCAtNzEwLDYgKzEwODUsMTUgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZWdhdGl2ZSBudW1iZXIgZnJvbSBhIHN0cmluZyB2YWx1ZSBhbmQgcmFkaXggMTAuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoU3RyaW5nLCBpbnQpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JTdHJpbmdSYWRpeDEwTmVnYXRpdmUoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICItMjM0ODcxMzc2MDM3IjsKICAgICAgICAgaW50IHJhZGl4ID0gMzY7CkBAIC03MjYsNiArMTExMCwxNSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIHplcm8gbnVtYmVyIGZyb20gYSBzdHJpbmcgdmFsdWUgYW5kIHJhZGl4IDM2LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKFN0cmluZywgaW50KSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yU3RyaW5nUmFkaXgxMFplcm8oKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICItMDAwMDAwMDAwMDAwMDAiOwogICAgICAgICBpbnQgcmFkaXggPSAxMDsKQEAgLTc0Miw2ICsxMTM1LDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcmFuZG9tIG51bWJlciBvZiA3NSBiaXRzIGxlbmd0aC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQgZm9yIG5lZ2F0aXZlIG51bWJlciBvZiBiaXRzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLnV0aWwuUmFuZG9tLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JSYW5kb20oKSB7CiAgICAgICAgIGludCBiaXRMZW4gPSA3NTsKICAgICAgICAgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oKTsKQEAgLTc1Miw2ICsxMTU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcHJpbWUgbnVtYmVyIG9mIDI1IGJpdHMgbGVuZ3RoLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQgZm9yIGluY29ycmVjdCBiaXRMZW5ndGggcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3MsIGphdmEudXRpbC5SYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclByaW1lKCkgewogICAgICAgICBpbnQgYml0TGVuID0gMjU7CiAgICAgICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKCk7CkBAIC03ODIsNiArMTE5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNCaWdJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0clN0cmluZzEoKSB7CiAgICAgICAgIFN0cmluZyBzID0gIjAiOwogICAgICAgICBCaWdJbnRlZ2VyIGJpX3MgPSBuZXcgQmlnSW50ZWdlcihzKTsKQEAgLTc5Miw2ICsxMjEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI0JpZ0ludGVnZXIoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJTdHJpbmcyKCkgewogICAgICAgICBTdHJpbmcgcyA9ICItMjE0NzQ4MzY0OCI7CiAgICAgICAgIEJpZ0ludGVnZXIgYmlfcyA9IG5ldyBCaWdJbnRlZ2VyKHMpOwpAQCAtODAzLDYgKzEyMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjQmlnSW50ZWdlcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBCaWdJbnRlZ2VyKFN0cmluZykgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlcl9PSyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0clN0cmluZzMoKSB7CiAgICAgICAgIFN0cmluZyBzID0gIjIxNDc0ODM2NDciOwogICAgICAgICBCaWdJbnRlZ2VyIGJpX3MgPSBuZXcgQmlnSW50ZWdlcihzKTsKQEAgLTgxNCw2ICsxMjUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI0JpZ0ludGVnZXIoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgQmlnSW50ZWdlcihTdHJpbmcpIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJTdHJpbmdFeGMxKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjAxMjM0IDU2Iik7CkBAIC04MjUsNiArMTI3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNCaWdJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RyU3RyaW5nRXhjMigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxMjM0IzU2Iik7CkBAIC04MzYsNiArMTI5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNCaWdJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RyU3RyaW5nRXhjMygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxMjM0LjU2Iik7CkBAIC04NDcsNiArMTMxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNCaWdJbnRlZ2VyKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIEJpZ0ludGVnZXIoU3RyaW5nKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RyU3RyaW5nRXhjNCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxRSsxIik7CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyQ29udmVydFRlc3QuamF2YSBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJDb252ZXJ0VGVzdC5qYXZhCmluZGV4IDcwOTY2YjUuLmM3ODRkODggMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJDb252ZXJ0VGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJDb252ZXJ0VGVzdC5qYXZhCkBAIC0yMSw5ICsyMSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitAVGVzdFRhcmdldENsYXNzKEJpZ0ludGVnZXIuY2xhc3MpCiAvKioKICAqIENsYXNzOiAgIGphdmEubWF0aC5CaWdJbnRlZ2VyCiAgKiBNZXRob2RzOiBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCB0b0J5dGVBcnJheSgpLCB2YWx1ZU9mKGxvbmcgdmFsKSwKQEAgLTMzLDYgKzM5LDE1IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkb3VibGUgdmFsdWUgb2YgWkVSTy4gCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVaZXJvKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIwIjsKICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDAuMDsKQEAgLTQ0LDYgKzU5LDE1IEBACiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIG51bWJlciB0byBhIGRvdWJsZSB2YWx1ZS4gCiAgICAgICogVGhlIG51bWJlcidzIGxlbmd0aCBpcyBsZXNzIHRoYW4gNjQgYml0cy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlUG9zaXRpdmUxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIyNzQ2NzIzODk0NSI7CiAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAyLjc0NjcyMzg5NDVFMTA7CkBAIC01NSw2ICs3OSwxNSBAQAogICAgICAqIENvbnZlcnQgYSBwb3NpdGl2ZSBudW1iZXIgdG8gYSBkb3VibGUgdmFsdWUuIAogICAgICAqIFRoZSBudW1iZXIncyBiaXQgbGVuZ3RoIGlzIGluc2lkZSBbNjMsIDEwMjRdLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVQb3NpdGl2ZTIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjI3NDY3MjM4OTQ1NzIzNjQ1NzgyNjU0MjYzNDYyNzM0NTY5NzIiOwogICAgICAgICBkb3VibGUgcmVzdWx0ID0gMi43NDY3MjM4OTQ1NzIzNjQ1RTM2OwpAQCAtNjYsNiArOTksMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEgZG91YmxlIHZhbHVlLiAKICAgICAgKiBUaGUgbnVtYmVyJ3MgYml0IGxlbmd0aCBpcyBsZXNzIHRoYW4gNjQgYml0cy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlTmVnYXRpdmUxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjc0NjcyMzg5NDUiOwogICAgICAgICBkb3VibGUgcmVzdWx0ID0gLTIuNzQ2NzIzODk0NUUxMDsKQEAgLTc3LDYgKzExOSwxNSBAQAogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYSBkb3VibGUgdmFsdWUuIAogICAgICAqIFRoZSBudW1iZXIncyBiaXQgbGVuZ3RoIGlzIGluc2lkZSBbNjMsIDEwMjRdLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVOZWdhdGl2ZTIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0yNzQ2NzIzODk0NTcyMzY0NTc4MjY1NDI2MzQ2MjczNDU2OTcyIjsKICAgICAgICAgZG91YmxlIHJlc3VsdCA9IC0yLjc0NjcyMzg5NDU3MjM2NDVFMzY7CkBAIC04OSw2ICsxNDAsMTUgQEAKICAgICAgKiBSb3VuZGluZyBpcyBuZWVkZWQuCiAgICAgICogVGhlIHJvdW5kaW5nIGJpdCBpcyAxIGFuZCB0aGUgbmV4dCBiaXQgdG8gdGhlIGxlZnQgaXMgMS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlUG9zUm91bmRlZDEoKSB7CiAgICAgICAgIGJ5dGVbXSBhID0gey0xMjgsIDEsIDIsIDMsIDQsIDUsIDYwLCAyMywgMSwgLTMsIC01fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTEwMyw2ICsxNjMsMTUgQEAKICAgICAgKiBUaGUgcm91bmRpbmcgYml0IGlzIDEgYW5kIHRoZSBuZXh0IGJpdCB0byB0aGUgbGVmdCBpcyAwCiAgICAgICogYnV0IHNvbWUgb2YgZHJvcHBlZCBiaXRzIGFyZSAxcy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlUG9zUm91bmRlZDIoKSB7CiAgICAgICAgIGJ5dGVbXSBhID0gey0xMjgsIDEsIDIsIDMsIDQsIDUsIDM2LCAyMywgMSwgLTMsIC01fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTExNCw2ICsxODMsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgcG9zaXRpdmUgbnVtYmVyIHRvIGEgZG91YmxlIHZhbHVlLiAKICAgICAgKiBSb3VuZGluZyBpcyBOT1QgbmVlZGVkLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVQb3NOb3RSb3VuZGVkKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAxLCAyLCAzLCA0LCA1LCAtMTI4LCAyMywgMSwgLTMsIC01fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTEyNiw2ICsyMDQsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgcG9zaXRpdmUgbnVtYmVyIHRvIGEgZG91YmxlIHZhbHVlLiAKICAgICAgKiBSb3VuZGluZyBpcyBuZWVkZWQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRvdWJsZVZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb3VibGVWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZU5lZ1JvdW5kZWQxKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAxLCAyLCAzLCA0LCA1LCA2MCwgMjMsIDEsIC0zLCAtNX07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtMTQwLDYgKzIyNywxNSBAQAogICAgICAqIFRoZSByb3VuZGluZyBiaXQgaXMgMSBhbmQgdGhlIG5leHQgYml0IHRvIHRoZSBsZWZ0IGlzIDAKICAgICAgKiBidXQgc29tZSBvZiBkcm9wcGVkIGJpdHMgYXJlIDFzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVOZWdSb3VuZGVkMigpIHsKICAgICAgICAgYnl0ZVtdIGEgPSB7LTEyOCwgMSwgMiwgMywgNCwgNSwgMzYsIDIzLCAxLCAtMywgLTV9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTE1Miw2ICsyNDgsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgcG9zaXRpdmUgbnVtYmVyIHRvIGEgZG91YmxlIHZhbHVlLiAKICAgICAgKiBSb3VuZGluZyBpcyBOT1QgbmVlZGVkLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVOZWdOb3RSb3VuZGVkKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAxLCAyLCAzLCA0LCA1LCAtMTI4LCAyMywgMSwgLTMsIC01fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0xNjYsNiArMjcxLDE1IEBACiAgICAgICogVGhlIHJvdW5kaW5nIGJpdCBpcyAwLgogICAgICAqIFRoZSByZXN1bHQgaXMgRG91YmxlLk1BWF9WQUxVRS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlUG9zTWF4VmFsdWUoKSB7CiAgICAgICAgIGJ5dGVbXSBhID0gezAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC04LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAogICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCkBAIC0xODYsNiArMzAwLDE1IEBACiAgICAgICogVGhlIGV4cG9uZW50IGlzIDEwMjMgYW5kIHRoZSBtYW50aXNzYSBpcyBhbGwgMXMuCiAgICAgICogVGhlIHJlc3VsdCBpcyAtRG91YmxlLk1BWF9WQUxVRS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlTmVnTWF4VmFsdWUoKSB7CiAgICAgICAgIGJ5dGVbXSBhID0gezAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC04LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAogICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCkBAIC0yMDcsNiArMzMwLDE1IEBACiAgICAgICogVGhlIHJvdW5kaW5nIGJpdCBpcyAxLgogICAgICAqIFRoZSByZXN1bHQgaXMgRG91YmxlLlBPU0lUSVZFX0lORklOSVRZLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVQb3NpdGl2ZUluZmluaXR5MSgpIHsKICAgICAgICAgYnl0ZVtdIGEgPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC04LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKQEAgLTIyNiw2ICszNTgsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgcG9zaXRpdmUgbnVtYmVyIHRvIGEgZG91YmxlIHZhbHVlLiAKICAgICAgKiBUaGUgbnVtYmVyJ3MgYml0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gMTAyNC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZG91YmxlVmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlUG9zaXRpdmVJbmZpbml0eTIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjI3NDY3MjM4OTQ1NzIzNjQ1NzgyNjU0MjYzNDYyNzM0NTY5NzIyODM3NDY4NzIzNjQ3Njg2NzY3NDc0NjIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzMjM0MjM0MjM0MjM0MjM0MjM0MjY3Njc0NTYzNDU3NDUyOTM3NjIzODQ3NTYyMzg0NzU2MzQ1NjM0NTY4NDU2MzQ1Njg5MzQ1NjgzNDc1ODYzNDY1Nzg2NDg1NzY0Nzg1Njg0NTY0NTc2MzQ4NzU2NzM4NDU2Nzg0NTY3ODY1ODczNDU4NzM2NDU3Njc0NTY4MzQ3NTY3NDU3NjM0NTc4NjM0ODU3Njg0NzU2Nzg0NjU3ODM0NTY3MDI4OTc4MzAyOTY3MjA0NzY4NDY1Nzg2MzQ1NzYzODQ1Njc4NDU2NzgzNDY1NzM0NjU3ODY0NTc4NjMiOwogICAgICAgICBkb3VibGUgYU51bWJlciA9IG5ldyBCaWdJbnRlZ2VyKGEpLmRvdWJsZVZhbHVlKCk7CkBAIC0yMzYsNiArMzc3LDE1IEBACiAgICAgICogQ29udmVydCBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGRvdWJsZSB2YWx1ZS4gCiAgICAgICogVGhlIG51bWJlcidzIGJpdCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDEwMjQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRvdWJsZVZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb3VibGVWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZU5lZ2F0aXZlSW5maW5pdHkxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICItMjc0NjcyMzg5NDU3MjM2NDU3ODI2NTQyNjM0NjI3MzQ1Njk3MjI4Mzc0Njg3MjM2NDc2ODY3Njc0NzQ2MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjMyMzQyMzQyMzQyMzQyMzQyMzQyNjc2NzQ1NjM0NTc0NTI5Mzc2MjM4NDc1NjIzODQ3NTYzNDU2MzQ1Njg0NTYzNDU2ODkzNDU2ODM0NzU4NjM0NjU3ODY0ODU3NjQ3ODU2ODQ1NjQ1NzYzNDg3NTY3Mzg0NTY3ODQ1Njc4NjU4NzM0NTg3MzY0NTc2NzQ1NjgzNDc1Njc0NTc2MzQ1Nzg2MzQ4NTc2ODQ3NTY3ODQ2NTc4MzQ1NjcwMjg5NzgzMDI5NjcyMDQ3Njg0NjU3ODYzNDU3NjM4NDU2Nzg0NTY3ODM0NjU3MzQ2NTc4NjQ1Nzg2MyI7CiAgICAgICAgIGRvdWJsZSBhTnVtYmVyID0gbmV3IEJpZ0ludGVnZXIoYSkuZG91YmxlVmFsdWUoKTsKQEAgLTI0OCw2ICszOTgsMTUgQEAKICAgICAgKiBUaGUgcm91bmRpbmcgYml0IGlzIDAuCiAgICAgICogVGhlIHJlc3VsdCBpcyBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRvdWJsZVZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb3VibGVWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZU5lZ2F0aXZlSW5maW5pdHkyKCkgewogICAgICAgICBieXRlW10gYSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLApAQCAtMjY4LDYgKzQyNywxNSBAQAogICAgICAqIFRoZSBleHBvbmVudCBpcyAxMDIzIGFuZCB0aGUgbWFudGlzc2EgaXMgYWxsIDBzCiAgICAgICogYnV0IHRoZSA1NHRoIGJpdCAoaW1wbGljaXQpIGlzIDEuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRvdWJsZVZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb3VibGVWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZVBvc01hbnRpc3NhSXNaZXJvKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKQEAgLTI4OSw2ICs0NTcsMTUgQEAKICAgICAgKiBUaGUgZXhwb25lbnQgaXMgMTAyMyBhbmQgdGhlIG1hbnRpc3NhIGlzIGFsbCAwcwogICAgICAqIGJ1dCB0aGUgNTR0aCBiaXQgKGltcGxpY2l0KSBpcyAxLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkb3VibGVWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZG91YmxlVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVOZWdNYW50aXNzYUlzWmVybygpIHsKICAgICAgICAgYnl0ZVtdIGEgPSB7LTEyOCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCkBAIC0zMDcsNiArNDg0LDE1IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBmbG9hdCB2YWx1ZSBvZiBaRVJPLiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZVplcm8oKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjAiOwogICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjBmOwpAQCAtMzE4LDYgKzUwNCwxNSBAQAogICAgICAqIENvbnZlcnQgYSBwb3NpdGl2ZSBudW1iZXIgdG8gYSBmbG9hdCB2YWx1ZS4gCiAgICAgICogVGhlIG51bWJlcidzIGxlbmd0aCBpcyBsZXNzIHRoYW4gMzIgYml0cy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlUG9zaXRpdmUxKCkgewogICAgICAgICBTdHJpbmcgYSA9ICIyNzQ2NzIzOCI7CiAgICAgICAgIGZsb2F0IHJlc3VsdCA9IDIuNzQ2NzIzOEU3ZjsKQEAgLTMyOSw2ICs1MjQsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgcG9zaXRpdmUgbnVtYmVyIHRvIGEgZmxvYXQgdmFsdWUuIAogICAgICAqIFRoZSBudW1iZXIncyBiaXQgbGVuZ3RoIGlzIGluc2lkZSBbMzIsIDEyN10uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZVBvc2l0aXZlMigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMjc0NjcyMzg5NDU3MjM2NDU3ODIiOwogICAgICAgICBmbG9hdCByZXN1bHQgPSAyLjc0NjcyMzlFMTlmOwpAQCAtMzQwLDYgKzU0NCwxNSBAQAogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYSBmbG9hdCB2YWx1ZS4gCiAgICAgICogVGhlIG51bWJlcidzIGJpdCBsZW5ndGggaXMgbGVzcyB0aGFuIDMyIGJpdHMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZU5lZ2F0aXZlMSgpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTI3NDY3MjM4IjsKICAgICAgICAgZmxvYXQgcmVzdWx0ID0gLTIuNzQ2NzIzOEU3ZjsKQEAgLTM1MSw2ICs1NjQsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEgZG91ZmxvYXRibGUgdmFsdWUuIAogICAgICAqIFRoZSBudW1iZXIncyBiaXQgbGVuZ3RoIGlzIGluc2lkZSBbNjMsIDEwMjRdLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVOZWdhdGl2ZTIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0yNzQ2NzIzODk0NTcyMzY0NTc4MiI7CiAgICAgICAgIGZsb2F0IHJlc3VsdCA9IC0yLjc0NjcyMzlFMTlmOwpAQCAtMzYzLDYgKzU4NSwxNSBAQAogICAgICAqIFJvdW5kaW5nIGlzIG5lZWRlZC4KICAgICAgKiBUaGUgcm91bmRpbmcgYml0IGlzIDEgYW5kIHRoZSBuZXh0IGJpdCB0byB0aGUgbGVmdCBpcyAxLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVQb3NSb3VuZGVkMSgpIHsKICAgICAgICAgYnl0ZVtdIGEgPSB7LTEyOCwgMSwgLTEsIC00LCA0LCA1LCA2MCwgMjMsIDEsIC0zLCAtNX07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0zNzcsNiArNjA4LDE1IEBACiAgICAgICogVGhlIHJvdW5kaW5nIGJpdCBpcyAxIGFuZCB0aGUgbmV4dCBiaXQgdG8gdGhlIGxlZnQgaXMgMAogICAgICAqIGJ1dCBzb21lIG9mIGRyb3BwZWQgYml0cyBhcmUgMXMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZVBvc1JvdW5kZWQyKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAxLCAyLCAtMTI4LCA0LCA1LCA2MCwgMjMsIDEsIC0zLCAtNX07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0zODgsNiArNjI4LDE1IEBACiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIG51bWJlciB0byBhIGZsb2F0IHZhbHVlLiAKICAgICAgKiBSb3VuZGluZyBpcyBOT1QgbmVlZGVkLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVQb3NOb3RSb3VuZGVkKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAxLCAyLCAzLCA0LCA1LCA2MCwgMjMsIDEsIC0zLCAtNX07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC00MDAsNiArNjQ5LDE1IEBACiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIG51bWJlciB0byBhIGZsb2F0IHZhbHVlLiAKICAgICAgKiBSb3VuZGluZyBpcyBuZWVkZWQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZU5lZ1JvdW5kZWQxKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAxLCAtMSwgLTQsIDQsIDUsIDYwLCAyMywgMSwgLTMsIC01fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC00MTQsNiArNjcyLDE1IEBACiAgICAgICogVGhlIHJvdW5kaW5nIGJpdCBpcyAxIGFuZCB0aGUgbmV4dCBiaXQgdG8gdGhlIGxlZnQgaXMgMAogICAgICAqIGJ1dCBzb21lIG9mIGRyb3BwZWQgYml0cyBhcmUgMXMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZU5lZ1JvdW5kZWQyKCkgewogICAgICAgICBieXRlW10gYSA9IHstMTI4LCAxLCAyLCAtMTI4LCA0LCA1LCA2MCwgMjMsIDEsIC0zLCAtNX07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNDI2LDYgKzY5MywxNSBAQAogICAgICAqIENvbnZlcnQgYSBwb3NpdGl2ZSBudW1iZXIgdG8gYSBmbG9hdCB2YWx1ZS4gCiAgICAgICogUm91bmRpbmcgaXMgTk9UIG5lZWRlZC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlTmVnTm90Um91bmRlZCgpIHsKICAgICAgICAgYnl0ZVtdIGEgPSB7LTEyOCwgMSwgMiwgMywgNCwgNSwgNjAsIDIzLCAxLCAtMywgLTV9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTQ0MCw2ICs3MTYsMTUgQEAKICAgICAgKiBUaGUgcm91bmRpbmcgYml0IGlzIDAuCiAgICAgICogVGhlIHJlc3VsdCBpcyBGbG9hdC5NQVhfVkFMVUUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZVBvc01heFZhbHVlKCkgewogICAgICAgICBieXRlW10gYSA9IHswLCAtMSwgLTEsIC0xLCAwLCAtMSwgLTEsIC04LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTQ1Myw2ICs3MzgsMTUgQEAKICAgICAgKiBUaGUgcm91bmRpbmcgYml0IGlzIDAuCiAgICAgICogVGhlIHJlc3VsdCBpcyAtRmxvYXQuTUFYX1ZBTFVFLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVOZWdNYXhWYWx1ZSgpIHsKICAgICAgICAgYnl0ZVtdIGEgPSB7MCwgLTEsIC0xLCAtMSwgMCwgLTEsIC0xLCAtOCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNDY2LDYgKzc2MCwxNSBAQAogICAgICAqIFRoZSByb3VuZGluZyBiaXQgaXMgMS4KICAgICAgKiBUaGUgcmVzdWx0IGlzIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbG9hdFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbG9hdFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VmFsdWVQb3NpdGl2ZUluZmluaXR5MSgpIHsKICAgICAgICAgYnl0ZVtdIGEgPSB7MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtNDc3LDYgKzc4MCwxNSBAQAogICAgICAqIENvbnZlcnQgYSBwb3NpdGl2ZSBudW1iZXIgdG8gYSBmbG9hdCB2YWx1ZS4gCiAgICAgICogVGhlIG51bWJlcidzIGJpdCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDEyNy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlUG9zaXRpdmVJbmZpbml0eTIoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIjI3NDY3MjM4OTQ1NzIzNjQ1NzgyNjU0MjYzNDYyNzM0NTY5NzIyODM3NDY4NzIzNjQ3Njg2NzY3NDc0NjIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzMjM0MjM0MjM0MjM0MjM0MjM0MjY3Njc0NTYzNDU3NDUyOTM3NjIzODQ3NTYyMzg0NzU2MzQ1NjM0NTY4NDU2MzQ1Njg5MzQ1NjgzNDc1ODYzNDY1Nzg2NDg1NzY0Nzg1Njg0NTY0NTc2MzQ4NzU2NzM4NDU2Nzg0NTY3ODY1ODczNDU4NzM2NDU3Njc0NTY4MzQ3NTY3NDU3NjM0NTc4NjM0ODU3Njg0NzU2Nzg0NjU3ODM0NTY3MDI4OTc4MzAyOTY3MjA0NzY4NDY1Nzg2MzQ1NzYzODQ1Njc4NDU2NzgzNDY1NzM0NjU3ODY0NTc4NjMiOwogICAgICAgICBmbG9hdCBhTnVtYmVyID0gbmV3IEJpZ0ludGVnZXIoYSkuZmxvYXRWYWx1ZSgpOwpAQCAtNDg3LDYgKzc5OSwxNSBAQAogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYSBmbG9hdCB2YWx1ZS4gCiAgICAgICogVGhlIG51bWJlcidzIGJpdCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDEyNy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlTmVnYXRpdmVJbmZpbml0eTEoKSB7CiAgICAgICAgIFN0cmluZyBhID0gIi0yNzQ2NzIzODk0NTcyMzY0NTc4MjY1NDI2MzQ2MjczNDU2OTcyMjgzNzQ2ODcyMzY0NzY4Njc2NzQ3NDYyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzIzNDIzNDIzNDIzNDIzNDIzNDI2NzY3NDU2MzQ1NzQ1MjkzNzYyMzg0NzU2MjM4NDc1NjM0NTYzNDU2ODQ1NjM0NTY4OTM0NTY4MzQ3NTg2MzQ2NTc4NjQ4NTc2NDc4NTY4NDU2NDU3NjM0ODc1NjczODQ1Njc4NDU2Nzg2NTg3MzQ1ODczNjQ1NzY3NDU2ODM0NzU2NzQ1NzYzNDU3ODYzNDg1NzY4NDc1Njc4NDY1NzgzNDU2NzAyODk3ODMwMjk2NzIwNDc2ODQ2NTc4NjM0NTc2Mzg0NTY3ODQ1Njc4MzQ2NTczNDY1Nzg2NDU3ODYzIjsKICAgICAgICAgZmxvYXQgYU51bWJlciA9IG5ldyBCaWdJbnRlZ2VyKGEpLmZsb2F0VmFsdWUoKTsKQEAgLTQ5OSw2ICs4MjAsMTUgQEAKICAgICAgKiBUaGUgcm91bmRpbmcgYml0IGlzIDAuCiAgICAgICogVGhlIHJlc3VsdCBpcyBGbG9hdC5ORUdBVElWRV9JTkZJTklUWS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlTmVnYXRpdmVJbmZpbml0eTIoKSB7CiAgICAgICAgIGJ5dGVbXSBhID0gezAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC01MTEsNiArODQxLDE1IEBACiAgICAgICogVGhlIGV4cG9uZW50IGlzIDEwMjMgYW5kIHRoZSBtYW50aXNzYSBpcyBhbGwgMHMKICAgICAgKiBidXQgdGhlIDU0dGggYml0IChpbXBsaWNpdCkgaXMgMS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlUG9zTWFudGlzc2FJc1plcm8oKSB7CiAgICAgICAgIGJ5dGVbXSBhID0gey0xMjgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtNTI0LDYgKzg2MywxNSBAQAogICAgICAqIFRoZSBleHBvbmVudCBpcyAxMDIzIGFuZCB0aGUgbWFudGlzc2EgaXMgYWxsIDBzCiAgICAgICogYnV0IHRoZSA1NHRoIGJpdCAoaW1wbGljaXQpIGlzIDEuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsb2F0VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsb2F0VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRWYWx1ZU5lZ01hbnRpc3NhSXNaZXJvKCkgewogICAgICAgICBieXRlW10gYSA9IHsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC01MzUsNiArODgzLDE1IEBACiAgICAgICogQ29udmVydCBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZsb2F0IHZhbHVlLiAKICAgICAgKiBUaGUgbnVtYmVyJ3MgYml0IGxlbmd0aCBpcyBsZXNzIHRoYW4gMzIgYml0cy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxvYXRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbG9hdFZhbHVlQnVnMjQ4MigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiMjE0NzQ4MzY0OSI7CiAgICAgICAgIGZsb2F0IHJlc3VsdCA9IDIuMTQ3NDgzNjVFOWY7CkBAIC01NDYsNiArOTAzLDE1IEBACiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIEJpZ0ludGVnZXIgdG8gYW4gaW50ZWdlciB2YWx1ZS4gCiAgICAgICogVGhlIGxvdyBkaWdpdCBpcyBwb3NpdGl2ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgaW50VmFsdWUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludFZhbHVlUG9zaXRpdmUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzfTsKICAgICAgICAgaW50IHJlc0ludCA9IDE0OTYxNDQ2NDM7CkBAIC01NTcsNiArOTIzLDE1IEBACiAgICAgICogQ29udmVydCBhIHBvc2l0aXZlIEJpZ0ludGVnZXIgdG8gYW4gaW50ZWdlciB2YWx1ZS4gCiAgICAgICogVGhlIGxvdyBkaWdpdCBpcyBwb3NpdGl2ZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBpbnRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50VmFsdWVQb3NpdGl2ZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDB9OwogICAgICAgICBpbnQgcmVzSW50ID0gODAwODY4OwpAQCAtNTY4LDYgKzk0MywxNSBAQAogICAgICAqIENvbnZlcnQgYSBwb3NpdGl2ZSBCaWdJbnRlZ2VyIHRvIGFuIGludGVnZXIgdmFsdWUuIAogICAgICAqIFRoZSBsb3cgZGlnaXQgaXMgbmVnYXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGludFZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRWYWx1ZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRWYWx1ZVBvc2l0aXZlMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHs1NiwgMTMsIDc4LCAtMTIsIC01LCA1NiwgMTAwfTsKICAgICAgICAgaW50IHNpZ24gPSAxOwpAQCAtNTgwLDYgKzk2NCwxNSBAQAogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBCaWdJbnRlZ2VyIHRvIGFuIGludGVnZXIgdmFsdWUuCiAgICAgICogVGhlIGxvdyBkaWdpdCBpcyBuZWdhdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgaW50VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludFZhbHVlTmVnYXRpdmUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCAtMTI4LCA0NSwgOTEsIDN9OwogICAgICAgICBpbnQgc2lnbiA9IC0xOwpAQCAtNTkyLDYgKzk4NSwxNSBAQAogICAgICAqIENvbnZlcnQgYSBuZWdhdGl2ZSBCaWdJbnRlZ2VyIHRvIGFuIGludGVnZXIgdmFsdWUuCiAgICAgICogVGhlIGxvdyBkaWdpdCBpcyBuZWdhdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgaW50VmFsdWUgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImludFZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludFZhbHVlTmVnYXRpdmUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMiwgNTYsIDEwMH07CiAgICAgICAgIGludCByZXN1bHQgPSAtNzcxOTk2OwpAQCAtNjAzLDYgKzEwMDUsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgbmVnYXRpdmUgQmlnSW50ZWdlciB0byBhbiBpbnRlZ2VyIHZhbHVlLiAKICAgICAgKiBUaGUgbG93IGRpZ2l0IGlzIHBvc2l0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBpbnRWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50VmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50VmFsdWVOZWdhdGl2ZTMoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDEyNywgNDUsIDkxLCAzfTsKICAgICAgICAgaW50IHNpZ24gPSAtMTsKQEAgLTYxNSw2ICsxMDI2LDE1IEBACiAgICAgICogQ29udmVydCBhIEJpZ0ludGVnZXIgdG8gYSBwb3NpdGl2ZSBsb25nIHZhbHVlCiAgICAgICogVGhlIEJpZ0ludGVnZXIgaXMgbG9uZ2VyIHRoYW4gaW50LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbG9uZ1ZhbHVlIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ1ZhbHVlUG9zaXRpdmUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAxMjAsIC0zNCwgLTEyLCA0NSwgOTh9OwogICAgICAgICBsb25nIHJlc3VsdCA9IDMyNjgyMDk3NzIyNTg5MzAwMThMOwpAQCAtNjI2LDYgKzEwNDYsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgbnVtYmVyIHRvIGEgcG9zaXRpdmUgbG9uZyB2YWx1ZQogICAgICAqIFRoZSBudW1iZXIgZml0cyBpbiBhIGxvbmcuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGxvbmdWYWx1ZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9uZ1ZhbHVlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExvbmdWYWx1ZVBvc2l0aXZlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgMTgsIC0xMDUsIDM0LCAtMTgsIDQ1fTsKICAgICAgICAgbG9uZyByZXN1bHQgPSA4ODA1NjM3NTgxNTg3Njk3MDlMOwpAQCAtNjM3LDYgKzEwNjYsMTUgQEAKICAgICAgKiBDb252ZXJ0IGEgbnVtYmVyIHRvIGEgbmVnYXRpdmUgbG9uZyB2YWx1ZQogICAgICAqIFRoZSBCaWdJbnRlZ2VyIGlzIGxvbmdlciB0aGFuIGludC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbG9uZ1ZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ1ZhbHVlTmVnYXRpdmUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyLCAtMSwgMTAwLCAtMiwgLTc2LCAtMTI4LCA0NSwgOTEsIDN9OwogICAgICAgICBsb25nIHJlc3VsdCA9IC00MzYzMDA0NTE2ODgzNzg4NUw7CkBAIC02NDgsNiArMTA4NiwxNSBAQAogICAgICAqIENvbnZlcnQgYSBudW1iZXIgdG8gYSBuZWdhdGl2ZSBsb25nIHZhbHVlCiAgICAgICogVGhlIG51bWJlciBmaXRzIGluIGEgbG9uZy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbG9uZ1ZhbHVlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ1ZhbHVlTmVnYXRpdmUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMiwgNTYsIDEwMCwgNDUsIC0xMDEsIDQ1LCA5OH07CiAgICAgICAgIGxvbmcgcmVzdWx0ID0gLTMzMTU2OTY4MDc0OTgzOThMOwpAQCAtNjU4LDYgKzExMDUsMTUgQEAKICAgICAvKioKICAgICAgKiB2YWx1ZU9mIChsb25nIHZhbCk6IGNvbnZlcnQgSW50ZWdlci5NQVhfVkFMVUUgdG8gYSBCaWdJbnRlZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdmFsdWVPZiBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZkludGVnZXJNYXgoKSB7CiAgICAgICAgIGxvbmcgbG9uZ1ZhbCA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YobG9uZ1ZhbCk7CkBAIC02NzMsNiArMTEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIHZhbHVlT2YgKGxvbmcgdmFsKTogY29udmVydCBJbnRlZ2VyLk1JTl9WQUxVRSB0byBhIEJpZ0ludGVnZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHZhbHVlT2YgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZJbnRlZ2VyTWluKCkgewogICAgICAgICBsb25nIGxvbmdWYWwgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gQmlnSW50ZWdlci52YWx1ZU9mKGxvbmdWYWwpOwpAQCAtNjg4LDYgKzExNTMsMTUgQEAKICAgICAvKioKICAgICAgKiB2YWx1ZU9mIChsb25nIHZhbCk6IGNvbnZlcnQgTG9uZy5NQVhfVkFMVUUgdG8gYSBCaWdJbnRlZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB2YWx1ZU9mIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mTG9uZ01heCgpIHsKICAgICAgICAgbG9uZyBsb25nVmFsID0gTG9uZy5NQVhfVkFMVUU7CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIudmFsdWVPZihsb25nVmFsKTsKQEAgLTcwMyw2ICsxMTc3LDE1IEBACiAgICAgLyoqCiAgICAgICogdmFsdWVPZiAobG9uZyB2YWwpOiBjb252ZXJ0IExvbmcuTUlOX1ZBTFVFIHRvIGEgQmlnSW50ZWdlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdmFsdWVPZiBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZkxvbmdNaW4oKSB7CiAgICAgICAgIGxvbmcgbG9uZ1ZhbCA9IExvbmcuTUlOX1ZBTFVFOwogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YobG9uZ1ZhbCk7CkBAIC03MTgsNiArMTIwMSwxNSBAQAogICAgIC8qKgogICAgICAqIHZhbHVlT2YgKGxvbmcgdmFsKTogY29udmVydCBhIHBvc2l0aXZlIGxvbmcgdmFsdWUgdG8gYSBCaWdJbnRlZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB2YWx1ZU9mIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mTG9uZ1Bvc2l0aXZlMSgpIHsKICAgICAgICAgbG9uZyBsb25nVmFsID0gMjY4MjA5NzcyMjU4OTMwMDE4TDsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gQmlnSW50ZWdlci52YWx1ZU9mKGxvbmdWYWwpOwpAQCAtNzM0LDYgKzEyMjYsMTUgQEAKICAgICAgKiB2YWx1ZU9mIChsb25nIHZhbCk6IGNvbnZlcnQgYSBwb3NpdGl2ZSBsb25nIHZhbHVlIHRvIGEgQmlnSW50ZWdlci4KICAgICAgKiBUaGUgbG9uZyB2YWx1ZSBmaXRzIGluIGludGVnZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHZhbHVlT2YgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZMb25nUG9zaXRpdmUyKCkgewogICAgICAgICBsb25nIGxvbmdWYWwgPSA1ODkzMDAxOEw7CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIudmFsdWVPZihsb25nVmFsKTsKQEAgLTc0OSw2ICsxMjUwLDE1IEBACiAgICAgLyoqCiAgICAgICogdmFsdWVPZiAobG9uZyB2YWwpOiBjb252ZXJ0IGEgbmVnYXRpdmUgbG9uZyB2YWx1ZSB0byBhIEJpZ0ludGVnZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHZhbHVlT2YgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZMb25nTmVnYXRpdmUxKCkgewogICAgICAgICBsb25nIGxvbmdWYWwgPSAtMjY4MjA5NzcyMjU4OTMwMDE4TDsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gQmlnSW50ZWdlci52YWx1ZU9mKGxvbmdWYWwpOwpAQCAtNzY1LDYgKzEyNzUsMTUgQEAKICAgICAgKiB2YWx1ZU9mIChsb25nIHZhbCk6IGNvbnZlcnQgYSBuZWdhdGl2ZSBsb25nIHZhbHVlIHRvIGEgQmlnSW50ZWdlci4KICAgICAgKiBUaGUgbG9uZyB2YWx1ZSBmaXRzIGluIGludGVnZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHZhbHVlT2YgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZMb25nTmVnYXRpdmUyKCkgewogICAgICAgICBsb25nIGxvbmdWYWwgPSAtNTg5MzAwMThMOwogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YobG9uZ1ZhbCk7CkBAIC03NzksNiArMTI5OCwxNSBAQAogICAgIC8qKgogICAgICAqIHZhbHVlT2YgKGxvbmcgdmFsKTogY29udmVydCBhIHplcm8gbG9uZyB2YWx1ZSB0byBhIEJpZ0ludGVnZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHZhbHVlT2YgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZMb25nWmVybygpIHsKICAgICAgICAgbG9uZyBsb25nVmFsID0gMEw7CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIudmFsdWVPZihsb25nVmFsKTsKZGlmZiAtLWdpdCBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJEaXZpZGVUZXN0LmphdmEgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyRGl2aWRlVGVzdC5qYXZhCmluZGV4IDEwYmYxNDcuLjY0Y2E5ODkgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJEaXZpZGVUZXN0LmphdmEKKysrIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlckRpdmlkZVRlc3QuamF2YQpAQCAtMjEsOSArMjEsMTUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworQFRlc3RUYXJnZXRDbGFzcyhCaWdJbnRlZ2VyLmNsYXNzKQogLyoqCiAgKiBDbGFzczogICBqYXZhLm1hdGguQmlnSW50ZWdlcgogICogTWV0aG9kczogZGl2aWRlLCByZW1haW5kZXIsIG1vZCwgYW5kIGRpdmlkZUFuZFJlbWFpbmRlciAKQEAgLTMyLDYgKzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlIGJ5IHplcm8KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTUwLDYgKzY1LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlIGJ5IFpFUk8KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTY2LDYgKzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlIHR3byBlcXVhbCBwb3NpdGl2ZSBudW1iZXJzCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTMoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyNywgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjd9OwpAQCAtODYsNiArMTE5LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlIHR3byBlcXVhbCBpbiBhYnNvbHV0ZSB2YWx1ZSBudW1iZXJzIG9mIGRpZmZlcmVudCBzaWducy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0xMjcsIDEwMCwgNTYsIDcsIDk4LCAtMSwgMzksIC0xMjgsIDEyN307CkBAIC0xMDcsNiArMTQ5LDE1IEBACiAgICAgICogRGl2aWRlIHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBsZW5ndGggYW5kIGRpZmZlcmVudCBzaWducy4KICAgICAgKiBUaGUgc2Vjb25kIGlzIGxvbmdlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0xMjcsIDEwMCwgNTYsIDcsIDk4LCAtMSwgMzksIC0xMjgsIDEyNywgMSwgMiwgMywgNCwgNX07CkBAIC0xMjgsNiArMTc5LDE1IEBACiAgICAgICogRGl2aWRlIHR3byBwb3NpdGl2ZSBudW1iZXJzIG9mIHRoZSBzYW1lIGxlbmd0aC4KICAgICAgKiBUaGUgc2Vjb25kIGlzIGdyZWF0ZXIuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTYoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxNSwgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3fTsKQEAgLTE0OCw2ICsyMDgsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgdHdvIHBvc2l0aXZlIG51bWJlcnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTcoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3LCA1LCA2LCA3LCA4LCA5fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxNSwgNDgsIC0yOSwgNywgOTgsIC0xLCAzOSwgLTEyOH07CkBAIC0xNjgsNiArMjM3LDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlIGEgcG9zaXRpdmUgbnVtYmVyIGJ5IGEgbmVnYXRpdmUgb25lLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U4KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDEwMCwgNTYsIDcsIDk4LCAtMSwgMzksIC0xMjgsIDEyNywgNSwgNiwgNywgOCwgOX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTUsIDQ4LCAtMjksIDcsIDk4LCAtMSwgMzksIC0xMjh9OwpAQCAtMTg4LDYgKzI2NiwxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZSBhIG5lZ2F0aXZlIG51bWJlciBieSBhIHBvc2l0aXZlIG9uZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlOSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjcsIDUsIDYsIDcsIDgsIDl9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezE1LCA0OCwgLTI5LCA3LCA5OCwgLTEsIDM5LCAtMTI4fTsKQEAgLTIwOCw2ICsyOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgdHdvIG5lZ2F0aXZlIG51bWJlcnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEwKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDEwMCwgNTYsIDcsIDk4LCAtMSwgMzksIC0xMjgsIDEyNywgNSwgNiwgNywgOCwgOX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTUsIDQ4LCAtMjksIDcsIDk4LCAtMSwgMzksIC0xMjh9OwpAQCAtMjI4LDYgKzMyNCwxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZSB6ZXJvIGJ5IGEgbmVnYXRpdmUgbnVtYmVyLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxNSwgNDgsIC0yOSwgNywgOTgsIC0xLCAzOSwgLTEyOH07CkBAIC0yNDgsNiArMzUzLDE1IEBACiAgICAgLyoqCiAgICAgICogRGl2aWRlIFpFUk8gYnkgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEyKCkgewogICAgICAgICBieXRlIGJCeXRlc1tdID0gezE1LCA0OCwgLTI5LCA3LCA5OCwgLTEsIDM5LCAtMTI4fTsKICAgICAgICAgaW50IGJTaWduID0gLTE7ICAgICAgICAKQEAgLTI2Niw2ICszODAsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgYSBwb3NpdGl2ZSBudW1iZXIgYnkgT05FLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxNSwgNDgsIC0yOSwgNywgOTgsIC0xLCAzOSwgLTEyOH07CiAgICAgICAgIGludCBhU2lnbiA9IDE7ICAgICAgICAKQEAgLTI4NCw2ICs0MDcsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgT05FIGJ5IE9ORS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMTQoKSB7CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7MX07CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIuT05FOwpAQCAtMzAwLDYgKzQzMiwxNSBAQAogICAgIC8qKgogICAgICAqIFZlcmlmaWVzIHRoZSBjYXNlIHdoZW4gYm9ycm93ICE9IDAgaW4gdGhlIHByaXZhdGUgZGl2aWRlIG1ldGhvZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpc2lvbktudXRoMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTMsIC0zLCAtMywgLTN9OwpAQCAtMzIwLDYgKzQ2MSwxNSBAQAogICAgIC8qKgogICAgICAqIFZlcmlmaWVzIHRoZSBjYXNlIHdoZW4gdGhlIGRpdmlzb3IgaXMgYWxyZWFkeSBub3JtYWxpemVkLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlzaW9uS251dGhJc05vcm1hbGl6ZWQoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTksIC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKQEAgLTM0MSw2ICs0OTEsMTUgQEAKICAgICAgKiBWZXJpZmllcyB0aGUgY2FzZSB3aGVuIHRoZSBmaXJzdCBkaWdpdHMgb2YgdGhlIGRpdmlkZW5kCiAgICAgICogYW5kIGRpdmlzb3IgZXF1YWwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGRpdmlkZSBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aXNpb25LbnV0aEZpcnN0RGlnaXRzRXF1YWwoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MiwgLTMsIC00LCAtNSwgLTEsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MiwgLTMsIC00LCAtNSwgLTEsIC0xLCAtMSwgLTF9OwpAQCAtMzYxLDYgKzUyMCwxNSBAQAogICAgIC8qKgogICAgICAqIERpdmlkZSB0aGUgbnVtYmVyIG9mIG9uZSBkaWdpdCBieSB0aGUgbnVtYmVyIG9mIG9uZSBkaWdpdCAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZGl2aWRlIG1ldGhvZC4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpc2lvbktudXRoT25lRGlnaXRCeU9uZURpZ2l0KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezExMywgLTgzLCAxMjMsIC01fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsyLCAtMywgLTQsIC01fTsKQEAgLTM4MSw2ICs1NDksMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgdGhlIG51bWJlciBvZiBtdWx0aSBkaWdpdHMgYnkgdGhlIG51bWJlciBvZiBvbmUgZGlnaXQgCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBkaXZpZGUgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpdmlzaW9uS251dGhNdWx0aURpZ2l0c0J5T25lRGlnaXQoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTEzLCAtODMsIDEyMywgLTUsIDE4LCAtMzQsIDY3LCAzOSwgLTI5fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsyLCAtMywgLTQsIC01fTsKQEAgLTQwMSw2ICs1NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBSZW1haW5kZXIgb2YgZGl2aXNpb24gYnkgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgcmVtYWluZGVyIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1haW5kZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMTUoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MH07CkBAIC00MTksNiArNjA1LDE1IEBACiAgICAgLyoqCiAgICAgICogUmVtYWluZGVyIG9mIGRpdmlzaW9uIG9mIGVxdWFsIG51bWJlcnMKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgcmVtYWluZGVyIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1haW5kZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMTYoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyNywgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjd9OwpAQCAtNDM5LDYgKzYzNCwxNSBAQAogICAgIC8qKgogICAgICAqIFJlbWFpbmRlciBvZiBkaXZpc2lvbiBvZiB0d28gcG9zaXRpdmUgbnVtYmVycwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciByZW1haW5kZXIgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlbWFpbmRlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxNygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjcsIDc1fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsyNywgLTE1LCA2NSwgMzksIDEwMH07CkBAIC00NTksNiArNjYzLDE1IEBACiAgICAgLyoqCiAgICAgICogUmVtYWluZGVyIG9mIGRpdmlzaW9uIG9mIHR3byBuZWdhdGl2ZSBudW1iZXJzCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHJlbWFpbmRlciBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluZGVyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTE4KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjcsIDEwMCwgNTYsIDcsIDk4LCAtMSwgMzksIC0xMjgsIDEyNywgNzV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezI3LCAtMTUsIDY1LCAzOSwgMTAwfTsKQEAgLTQ4MCw2ICs2OTMsMTUgQEAKICAgICAgKiBSZW1haW5kZXIgb2YgZGl2aXNpb24gb2YgdHdvIG51bWJlcnMgb2YgZGlmZmVyZW50IHNpZ25zLgogICAgICAqIFRoZSBmaXJzdCBpcyBwb3NpdGl2ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgcmVtYWluZGVyIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1haW5kZXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMTkoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyNywgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3LCA3NX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MjcsIC0xNSwgNjUsIDM5LCAxMDB9OwpAQCAtNTAxLDYgKzcyMywxNSBAQAogICAgICAqIFJlbWFpbmRlciBvZiBkaXZpc2lvbiBvZiB0d28gbnVtYmVycyBvZiBkaWZmZXJlbnQgc2lnbnMuCiAgICAgICogVGhlIGZpcnN0IGlzIG5lZ2F0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciByZW1haW5kZXIgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlbWFpbmRlciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UyMCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjcsIDc1fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsyNywgLTE1LCA2NSwgMzksIDEwMH07CkBAIC01MjEsNiArNzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhlIHN0ZXAgRDYgZnJvbSB0aGUgS251dGggYWxnb3JpdGhtCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHJlbWFpbmRlciBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluZGVyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVyS251dGgxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKQEAgLTU0MSw2ICs3ODEsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgdGhlIG51bWJlciBvZiBvbmUgZGlnaXQgYnkgdGhlIG51bWJlciBvZiBvbmUgZGlnaXQgCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHJlbWFpbmRlciBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluZGVyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVyS251dGhPbmVEaWdpdEJ5T25lRGlnaXQoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTEzLCAtODMsIDEyMywgLTV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezIsIC0zLCAtNCwgLTUwfTsKQEAgLTU2MSw2ICs4MTAsMTUgQEAKICAgICAvKioKICAgICAgKiBEaXZpZGUgdGhlIG51bWJlciBvZiBtdWx0aSBkaWdpdHMgYnkgdGhlIG51bWJlciBvZiBvbmUgZGlnaXQgCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHJlbWFpbmRlciBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluZGVyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVyS251dGhNdWx0aURpZ2l0c0J5T25lRGlnaXQoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTEzLCAtODMsIDEyMywgLTUsIDE4LCAtMzQsIDY3LCAzOSwgLTI5fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsyLCAtMywgLTQsIC01MH07CkBAIC01ODIsNiArODQwLDE1IEBACiAgICAgICogZGl2aWRlQW5kUmVtYWluZGVyIG9mIHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzaWducy4KICAgICAgKiBUaGUgZmlyc3QgaXMgbmVnYXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJBcml0aG1ldGljRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXZpZGVBbmRSZW1haW5kZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMjEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyNywgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3LCA3NX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MjcsIC0xNSwgNjUsIDM5LCAxMDB9OwpAQCAtNjE0LDYgKzg4MSwxNSBAQAogICAgIC8qKgogICAgICAqIG1vZCB3aGVuIG1vZHVsdXMgaXMgbmVnYXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vZCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW9kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTIyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEsIDMwLCA0MCwgNTYsIC0xLCA0NX07CkBAIC02MzIsNiArOTA4LDE1IEBACiAgICAgLyoqCiAgICAgICogbW9kIHdoZW4gYSBkaXZpc29yIGlzIHBvc2l0aXZlCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW9kIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTIzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjcsIDEwMCwgNTYsIDcsIDk4LCAtMSwgMzksIC0xMjgsIDEyNywgNzV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezI3LCAtMTUsIDY1LCAzOSwgMTAwfTsKQEAgLTY1Miw2ICs5MzcsMTUgQEAKICAgICAvKioKICAgICAgKiBtb2Qgd2hlbiBhIGRpdmlzb3IgaXMgbmVnYXRpdmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbW9kIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtb2QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMjQoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyNywgMTAwLCA1NiwgNywgOTgsIC0xLCAzOSwgLTEyOCwgMTI3LCA3NX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MjcsIC0xNSwgNjUsIDM5LCAxMDB9OwpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlckhhc2hDb2RlVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlckhhc2hDb2RlVGVzdC5qYXZhCmluZGV4IGY2YzE3YTguLmI4Yjc3NmMgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJIYXNoQ29kZVRlc3QuamF2YQorKysgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VySGFzaENvZGVUZXN0LmphdmEKQEAgLTIxLDEwICsyMSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhCaWdJbnRlZ2VyLmNsYXNzKQogLyoqCiAgKiBDbGFzczogICBqYXZhLm1hdGguQmlnSW50ZWdlcgogICogTWV0aG9kOiBoYXNoQ29kZSgpCkBAIC0zMyw2ICszOCwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3QgaGFzaCBjb2RlcyBmb3IgdGhlIHNhbWUgb2JqZWN0CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBoYXNoQ29kZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZU9iamVjdCgpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlMSA9ICIxMjM3ODI0NjcyODcyNzgzNDI5MDI3NjQ1NzM4NjM3NDg4Mjk3Njc4Mjg0OSI7CiAgICAgICAgIFN0cmluZyB2YWx1ZTIgPSAiLTU2MzQ1NjIwOTU4NzIwMzgyNjI5Mjg3Mjg3Mjc4MzQyOTAyNzY0NTczODYzNzQ4ODI5NzY3ODI4NDkiOwpAQCAtNTEsNiArNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0IGhhc2ggY29kZXMgZm9yIGVxdWFsIG9iamVjdHMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGhhc2hDb2RlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbE9iamVjdHMoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZTEgPSAiMTIzNzgyNDY3Mjg3Mjc4MzQyOTAyNzY0NTczODYzNzQ4ODI5NzY3ODI4NDkiOwogICAgICAgICBTdHJpbmcgdmFsdWUyID0gIjEyMzc4MjQ2NzI4NzI3ODM0MjkwMjc2NDU3Mzg2Mzc0ODgyOTc2NzgyODQ5IjsKQEAgLTY3LDYgKzkwLDE1IEBACiAgICAgICogVGVzdCBoYXNoIGNvZGVzIGZvciB1bmVxdWFsIG9iamVjdHMuCiAgICAgICogVGhlIGNvZGVzIGFyZSB1bmVxdWFsLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBoYXNoQ29kZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5lcXVhbE9iamVjdHNVbmVxdWFsKCkgewogICAgICAgICBTdHJpbmcgdmFsdWUxID0gIjEyMzc4MjQ2NzI4NzI3ODM0MjkwMjc2NDU3Mzg2Mzc0ODgyOTc2NzgyODQ5IjsKICAgICAgICAgU3RyaW5nIHZhbHVlMiA9ICItNTYzNDU2MjA5NTg3MjAzODI2MjkyODcyODcyNzgzNDI5MDI3NjQ1NzM4NjM3NDg4Mjk3Njc4Mjg0OSI7CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyTW9kUG93VGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlck1vZFBvd1Rlc3QuamF2YQppbmRleCBiMmJkODAxLi40M2YxMjhhIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyTW9kUG93VGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJNb2RQb3dUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnSW50ZWdlci5jbGFzcykKIC8qKgogICogQ2xhc3M6ICAgamF2YS5tYXRoLkJpZ0ludGVnZXIKICAqIE1ldGhvZHM6IG1vZFBvdywgbW9kSW52ZXJzZSwgYW5kIGdjZCAKQEAgLTMyLDYgKzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogbW9kUG93OiBub24tcG9zaXRpdmUgbW9kdWx1cwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbW9kUG93IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtb2RQb3ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kUG93RXhjZXB0aW9uKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIGVCeXRlc1tdID0gezEsIDIsIDMsIDQsIDV9OwpAQCAtNTMsNiArNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBtb2RQb3c6IHBvc2l0aXZlIGV4cG9uZW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vZFBvdyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW9kUG93IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1vZFBvd1Bvc0V4cCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjcsIDc1LCA0OCwgLTd9OwogICAgICAgICBieXRlIGVCeXRlc1tdID0gezI3LCAtMTUsIDY1LCAzOX07CkBAIC03Niw2ICsxMDAsMTUgQEAKICAgICAvKioKICAgICAgKiBtb2RQb3c6IG5lZ2F0aXZlIGV4cG9uZW50CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vZFBvdyBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW9kUG93IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1vZFBvd05lZ0V4cCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI3LCAxMDAsIDU2LCA3LCA5OCwgLTEsIDM5LCAtMTI4LCAxMjcsIDc1LCA0OCwgLTd9OwogICAgICAgICBieXRlIGVCeXRlc1tdID0gezI3LCAtMTUsIDY1LCAzOX07CkBAIC05OSw2ICsxMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBtb2RJbnZlcnNlOiBub24tcG9zaXRpdmUgbW9kdWx1cwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbW9kSW52ZXJzZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW9kSW52ZXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdG1vZEludmVyc2VFeGNlcHRpb24oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgN307CiAgICAgICAgIGJ5dGUgbUJ5dGVzW10gPSB7MSwgMiwgM307CkBAIC0xMTcsNiArMTU5LDE1IEBACiAgICAgLyoqCiAgICAgICogbW9kSW52ZXJzZTogbm9uLWludmVydGlibGUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vZEludmVyc2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1vZEludmVyc2UiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rtb2RJbnZlcnNlTm9uSW52ZXJ0aWJsZSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTUsIDI0LCAxMjMsIDU2LCAtMTEsIC0xMTIsIC0zNCwgLTk4LCA4LCAxMCwgMTIsIDE0LCAyNSwgMTI1LCAtMTUsIDI4LCAtMTI3fTsKICAgICAgICAgYnl0ZSBtQnl0ZXNbXSA9IHstMTIsIDEsIDAsIDAsIDAsIDIzLCA0NCwgNTUsIDY2fTsKQEAgLTEzNSw2ICsxODYsMTUgQEAKICAgICAvKioKICAgICAgKiBtb2RJbnZlcnNlOiBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbW9kSW52ZXJzZSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW9kSW52ZXJzZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdG1vZEludmVyc2VQb3MxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezI0LCAxMjMsIDU2LCAtMTEsIC0xMTIsIC0zNCwgLTk4LCA4LCAxMCwgMTIsIDE0LCAyNSwgMTI1LCAtMTUsIDI4LCAtMTI3fTsKICAgICAgICAgYnl0ZSBtQnl0ZXNbXSA9IHsxMjIsIDQ1LCAzNiwgMTAwLCAxMjIsIDQ1fTsKQEAgLTE1NSw2ICsyMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBtb2RJbnZlcnNlOiBwb3NpdGl2ZSBudW1iZXIgKGFub3RoZXIgY2FzZTogYSA8IDApCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vZEludmVyc2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1vZEludmVyc2UiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rtb2RJbnZlcnNlUG9zMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxNSwgMjQsIDEyMywgNTYsIC0xMSwgLTExMiwgLTM0LCAtOTgsIDgsIDEwLCAxMiwgMTQsIDI1LCAxMjUsIC0xNSwgMjgsIC0xMjd9OwogICAgICAgICBieXRlIG1CeXRlc1tdID0gezIsIDEyMiwgNDUsIDM2LCAxMDB9OwpAQCAtMTc1LDYgKzI0NCwxNSBAQAogICAgIC8qKgogICAgICAqIG1vZEludmVyc2U6IG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtb2RJbnZlcnNlIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtb2RJbnZlcnNlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0bW9kSW52ZXJzZU5lZzEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTUsIDI0LCAxMjMsIDU2LCAtMTEsIC0xMTIsIC0zNCwgLTk4LCA4LCAxMCwgMTIsIDE0LCAyNSwgMTI1LCAtMTUsIDI4LCAtMTI3fTsKICAgICAgICAgYnl0ZSBtQnl0ZXNbXSA9IHsyLCAxMjIsIDQ1LCAzNiwgMTAwfTsKQEAgLTE5NSw2ICsyNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBtb2RJbnZlcnNlOiBuZWdhdGl2ZSBudW1iZXIgKGFub3RoZXIgY2FzZTogeCA8IDApCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG1vZEludmVyc2UgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1vZEludmVyc2UiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rtb2RJbnZlcnNlTmVnMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTUsIDI0LCAxMjMsIDU3LCAtMTUsIDI0LCAxMjMsIDU3LCAtMTUsIDI0LCAxMjMsIDU3fTsKICAgICAgICAgYnl0ZSBtQnl0ZXNbXSA9IHsxMjIsIDIsIDQsIDEyMiwgMiwgNH07CkBAIC0yMTMsNiArMzAwLDE1IEBACiAgICAgLyoqCiAgICAgICogZ2NkOiB0aGUgc2Vjb25kIG51bWJlciBpcyB6ZXJvCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnY2QgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdjZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdjZFNlY29uZFplcm8oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTUsIDI0LCAxMjMsIDU3LCAtMTUsIDI0LCAxMjMsIDU3LCAtMTUsIDI0LCAxMjMsIDU3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTIzMyw2ICszMjksMTUgQEAKICAgICAvKioKICAgICAgKiBnY2Q6IHRoZSBmaXJzdCBudW1iZXIgaXMgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnY2QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdjZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdjZEZpcnN0WmVybygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxNSwgMjQsIDEyMywgNTcsIC0xNSwgMjQsIDEyMywgNTcsIC0xNSwgMjQsIDEyMywgNTd9OwpAQCAtMjUzLDYgKzM1OCwxNSBAQAogICAgIC8qKgogICAgICAqIGdjZDogdGhlIGZpcnN0IG51bWJlciBpcyBaRVJPCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdjZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2NkIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2NkRmlyc3RaRVJPKCkgewogICAgICAgICBieXRlIGJCeXRlc1tdID0gezE1LCAyNCwgMTIzLCA1NywgLTE1LCAyNCwgMTIzLCA1NywgLTE1LCAyNCwgMTIzLCA1N307CiAgICAgICAgIGludCBiU2lnbiA9IDE7CkBAIC0yNzEsNiArMzg1LDE1IEBACiAgICAgLyoqCiAgICAgICogZ2NkOiBib3RoIG51bWJlcnMgYXJlIHplcm9zCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdjZCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2NkIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2NkQm90aFplcm9zKCkgewogICAgICAgICBieXRlIHJCeXRlc1tdID0gezB9OwogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiMCIpOwpAQCAtMjg2LDYgKzQwOSwxNSBAQAogICAgIC8qKgogICAgICAqIGdjZDogdGhlIGZpcnN0IG51bWJlciBpcyBsb25nZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2NkIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnY2QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHY2RGaXJzdExvbmdlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTUsIDI0LCAxMjMsIDU2LCAtMTEsIC0xMTIsIC0zNCwgLTk4LCA4LCAxMCwgMTIsIDE0LCAyNSwgMTI1LCAtMTUsIDI4LCAtMTI3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTIsIDEsIDAsIDAsIDAsIDIzLCA0NCwgNTUsIDY2fTsKQEAgLTMwNiw2ICs0MzgsMTUgQEAKICAgICAvKioKICAgICAgKiBnY2Q6IHRoZSBzZWNvbmQgbnVtYmVyIGlzIGxvbmdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBnY2QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdjZCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdjZFNlY29uZExvbmdlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTIsIDEsIDAsIDAsIDAsIDIzLCA0NCwgNTUsIDY2fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTUsIDI0LCAxMjMsIDU2LCAtMTEsIC0xMTIsIC0zNCwgLTk4LCA4LCAxMCwgMTIsIDE0LCAyNSwgMTI1LCAtMTUsIDI4LCAtMTI3fTsKZGlmZiAtLWdpdCBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJNdWx0aXBseVRlc3QuamF2YSBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJNdWx0aXBseVRlc3QuamF2YQppbmRleCBjYmQxNWU5Li5iNzhjOTQxIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyTXVsdGlwbHlUZXN0LmphdmEKKysrIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlck11bHRpcGx5VGVzdC5qYXZhCkBAIC0yMSw5ICsyMSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitAVGVzdFRhcmdldENsYXNzKEJpZ0ludGVnZXIuY2xhc3MpCiAvKioKICAqIENsYXNzOiAgamF2YS5tYXRoLkJpZ0ludGVnZXIKICAqIE1ldGhvZDogbXVsdGlwbHkgCkBAIC0zMiw2ICszOCwxNSBAQAogICAgIC8qKgogICAgICAqIE11bHRpcGx5IHR3byBuZWdhdGl2ZSBudW1iZXJzIG9mIHRoZSBzYW1lIGxlbmd0aAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbXVsdGlwbHkgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm11bHRpcGx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtNTMsNiArNjgsMTUgQEAKICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycyBvZiB0aGUgc2FtZSBsZW5ndGggYW5kIGRpZmZlcmVudCBzaWducy4KICAgICAgKiBUaGUgZmlyc3QgaXMgbmVnYXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG11bHRpcGx5IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtdWx0aXBseSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDN9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTc0LDYgKzk4LDE1IEBACiAgICAgICogTXVsdGlwbHkgdHdvIHBvc2l0aXZlIG51bWJlcnMgb2YgZGlmZmVyZW50IGxlbmd0aC4KICAgICAgKiBUaGUgZmlyc3QgaXMgbG9uZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtdWx0aXBseSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibXVsdGlwbHkiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCAxLCAyLCAzLCA0LCA1fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CkBAIC05Niw2ICsxMjksMTUgQEAKICAgICAgKiBNdWx0aXBseSB0d28gcG9zaXRpdmUgbnVtYmVycyBvZiBkaWZmZXJlbnQgbGVuZ3RoLgogICAgICAqIFRoZSBzZWNvbmQgaXMgbG9uZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtdWx0aXBseSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibXVsdGlwbHkiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgMywgMSwgMiwgMywgNCwgNX07CkBAIC0xMTksNiArMTYxLDE1IEBACiAgICAgICogVGhlIGZpcnN0IGlzIHBvc2l0aXZlLgogICAgICAqIFRoZSBmaXJzdCBpcyBsb25nZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG11bHRpcGx5IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtdWx0aXBseSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U1KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDEsIDIsIDMsIDQsIDV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTE0Miw2ICsxOTMsMTUgQEAKICAgICAgKiBUaGUgZmlyc3QgaXMgcG9zaXRpdmUuCiAgICAgICogVGhlIHNlY29uZCBpcyBsb25nZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG11bHRpcGx5IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtdWx0aXBseSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U2KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCAxLCAyLCAzLCA0LCA1fTsKQEAgLTE2Myw2ICsyMjMsMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSBhIG51bWJlciBieSB6ZXJvLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtdWx0aXBseSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibXVsdGlwbHkiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCAxLCAyLCAzLCA0LCA1fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTE4Myw2ICsyNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSBhIG51bWJlciBieSBaRVJPLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBtdWx0aXBseSBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibXVsdGlwbHkiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlOCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCAxLCAyLCAzLCA0LCA1fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTIwMSw2ICsyNzksMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSBhIHBvc2l0aXZlIG51bWJlciBieSBPTkUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG11bHRpcGx5IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtdWx0aXBseSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U5KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDEsIDIsIDMsIDQsIDV9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMjE5LDYgKzMwNiwxNSBAQAogICAgIC8qKgogICAgICAqIE11bHRpcGx5IGEgbmVnYXRpdmUgbnVtYmVyIGJ5IE9ORS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbXVsdGlwbHkgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm11bHRpcGx5IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEwKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDEsIDIsIDMsIDQsIDV9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTIzNyw2ICszMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycyBvZiA0IGJ5dGVzIGxlbmd0aC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbXVsdGlwbHkgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm11bHRpcGx5IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50YnlJbnQxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0fTsKQEAgLTI1Nyw2ICszNjIsMTUgQEAKICAgICAvKioKICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycyBvZiA0IGJ5dGVzIGxlbmd0aC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgbXVsdGlwbHkgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm11bHRpcGx5IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50YnlJbnQyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xLCAtMSwgLTEsIC0xfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMSwgLTEsIC0xLCAtMX07CkBAIC0yNzcsNiArMzkxLDE1IEBACiAgICAgLyoqCiAgICAgICogTmVnYXRpdmUgZXhwb25lbnQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBwb3cgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvdyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3dFeGNlcHRpb24oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgN307CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0yOTMsNiArNDE2LDE1IEBACiAgICAgLyoqCiAgICAgICogRXhwb25lbnRpYXRpb24gb2YgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYW4gb2RkIGV4cG9uZW50LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBwb3cgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvdyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3dOZWdhdGl2ZU51bVRvT2RkRXhwKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezUwLCAtMjYsIDkwLCA2OSwgMTIwLCAzMiwgNjMsIC0xMDMsIC0xNCwgMzV9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTMxNCw2ICs0NDYsMTUgQEAKICAgICAvKioKICAgICAgKiBFeHBvbmVudGlhdGlvbiBvZiBhIG5lZ2F0aXZlIG51bWJlciB0byBhbiBldmVuIGV4cG9uZW50LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBwb3cgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvdyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3dOZWdhdGl2ZU51bVRvRXZlbkV4cCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHs1MCwgLTI2LCA5MCwgNjksIDEyMCwgMzIsIDYzLCAtMTAzLCAtMTQsIDM1fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0zMzQsNiArNDc1LDE1IEBACiAgICAgLyoqCiAgICAgICogRXhwb25lbnRpYXRpb24gb2YgYSBuZWdhdGl2ZSBudW1iZXIgdG8gemVybyBleHBvbmVudC4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgcG93IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3ciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG93TmVnYXRpdmVOdW1Ub1plcm9FeHAoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7NTAsIC0yNiwgOTAsIDY5LCAxMjAsIDMyLCA2MywgLTEwMywgLTE0LCAzNX07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtMzUyLDYgKzUwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEV4cG9uZW50aWF0aW9uIG9mIGEgcG9zaXRpdmUgbnVtYmVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBwb3cgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvdyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3dQb3NpdGl2ZU51bSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHs1MCwgLTI2LCA5MCwgNjksIDEyMCwgMzIsIDYzLCAtMTAzLCAtMTQsIDM1fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTM3Myw2ICs1MzIsMTUgQEAKICAgICAvKioKICAgICAgKiBFeHBvbmVudGlhdGlvbiBvZiBhIG5lZ2F0aXZlIG51bWJlciB0byB6ZXJvIGV4cG9uZW50LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBwb3cgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvdyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3dQb3NpdGl2ZU51bVRvWmVyb0V4cCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHs1MCwgLTI2LCA5MCwgNjksIDEyMCwgMzIsIDYzLCAtMTAzLCAtMTQsIDM1fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKZGlmZiAtLWdpdCBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJOb3RUZXN0LmphdmEgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyTm90VGVzdC5qYXZhCmluZGV4IDMzMDU1NzEuLmEyNTIzY2IgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJOb3RUZXN0LmphdmEKKysrIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlck5vdFRlc3QuamF2YQpAQCAtMjEsOSArMjEsMTUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworQFRlc3RUYXJnZXRDbGFzcyhCaWdJbnRlZ2VyLmNsYXNzKQogLyoqCiAgKiBDbGFzczogIGphdmEubWF0aC5CaWdJbnRlZ2VyCiAgKiBNZXRob2RzOiBhbmQsIGFuZE5vdApAQCAtMzIsNiArMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBhbmROb3QgZm9yIHR3byBwb3NpdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgbG9uZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBhbmROb3QgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFuZE5vdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFuZE5vdFBvc1Bvc0ZpcnN0TG9uZ2VyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjgsIDksIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3LCAyMywgODcsIC0yNSwgLTc1fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTUyLDYgKzY3LDE1IEBACiAgICAgLyoqCiAgICAgICogYW5kTm90IGZvciB0d28gcG9zaXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIHNob3J0ZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYW5kTm90IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbmROb3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbmROb3RQb3NQb3NGaXJzdFNob3J0ZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwpAQCAtNzIsNiArOTYsMTUgQEAKICAgICAvKioKICAgICAgKiBhbmROb3QgZm9yIHR3byBuZWdhdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgbG9uZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGFuZE5vdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kTm90IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kTm90TmVnTmVnRmlyc3RMb25nZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwpAQCAtOTIsNiArMTI1LDE1IEBACiAgICAgLyoqCiAgICAgICogYW5kTm90IGZvciBhIG5lZ2F0aXZlIGFuZCBhIHBvc2l0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBsb25nZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYW5kTm90IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbmROb3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdQb3NGaXJzdExvbmdlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA5LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExNywgMjMsIDg3LCAtMjUsIC03NX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0xMTIsNiArMTU0LDE1IEBACiAgICAgLyoqCiAgICAgICogTm90IGZvciBaRVJPIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igbm90IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90WmVybygpIHsKICAgICAgICAgYnl0ZSByQnl0ZXNbXSA9IHstMX07CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIuWkVSTzsKQEAgLTEyNyw2ICsxNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBOb3QgZm9yIE9ORQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBub3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm5vdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RPbmUoKSB7CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7LTJ9OwogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBCaWdJbnRlZ2VyLk9ORTsKQEAgLTE0Miw2ICsyMDIsMTUgQEAKICAgICAvKioKICAgICAgKiBOb3QgZm9yIGEgcG9zaXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG5vdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibm90IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vdFBvcygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExN307CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xNTksNiArMjI4LDE1IEBACiAgICAgLyoqCiAgICAgICogTm90IGZvciBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBub3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm5vdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb3ROZWcoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTd9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTE3Nyw2ICsyNTUsMTUgQEAKICAgICAgKiBOb3QgZm9yIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igbm90IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90U3BlY2lhbENhc2UoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEsIC0xLCAtMSwgLTF9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlck9wZXJhdGVCaXRzVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlck9wZXJhdGVCaXRzVGVzdC5qYXZhCmluZGV4IDNhMDVlMzEuLjQxZjIwZTUgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJPcGVyYXRlQml0c1Rlc3QuamF2YQorKysgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyT3BlcmF0ZUJpdHNUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnSW50ZWdlci5jbGFzcykKIC8qKgogICogQ2xhc3M6ICAgamF2YS5tYXRoLkJpZ0ludGVnZXIKICAqIE1ldGhvZHM6IGJpdExlbmd0aCwgc2hpZnRMZWZ0LCBzaGlmdFJpZ2h0LApAQCAtMzMsNiArMzksMTUgQEAKICAgICAvKioKICAgICAgKiBiaXRDb3VudCgpIG9mIHplcm8uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBiaXRDb3VudCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYml0Q291bnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qml0Q291bnRaZXJvKCkgewogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiMCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYU51bWJlci5iaXRDb3VudCgpKTsKQEAgLTQxLDYgKzU2LDE1IEBACiAgICAgLyoqCiAgICAgICogYml0Q291bnQoKSBvZiBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYml0Q291bnQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJpdENvdW50IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEJpdENvdW50TmVnKCkgewogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiLTEyMzc4NjM0NzU2MzgyOTM3ODczNDg3NjM4NzQ2MjgzNzY3MjM4NjU3ODcyMzY4NzQ4NzI2ODc1Iik7CiAgICAgICAgIGFzc2VydEVxdWFscyg4NywgYU51bWJlci5iaXRDb3VudCgpKTsKQEAgLTQ5LDYgKzczLDE1IEBACiAgICAgLyoqCiAgICAgICogYml0Q291bnQoKSBvZiBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYml0Q291bnQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJpdENvdW50IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEJpdENvdW50UG9zKCkgewogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigiMTIzNzg2MzQ3NTYzNDM1NjQ3NTc1ODI5Mzc4NzM0ODc2Mzg3NDYyODM3NjcyMzg2NTc4NzIzNjg3NDg3MjY4NzUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwNywgYU51bWJlci5iaXRDb3VudCgpKTsKQEAgLTU3LDYgKzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogYml0TGVuZ3RoKCkgb2YgemVyby4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGJpdExlbmd0aCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYml0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEJpdExlbmd0aFplcm8oKSB7CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBhTnVtYmVyLmJpdExlbmd0aCgpKTsKQEAgLTY1LDYgKzEwNywxNSBAQAogICAgIC8qKgogICAgICAqIGJpdExlbmd0aCgpIG9mIGEgcG9zaXRpdmUgbnVtYmVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBiaXRMZW5ndGggbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJpdExlbmd0aCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCaXRMZW5ndGhQb3NpdGl2ZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MTIsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAzLCA5MX07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC03NSw2ICsxMjYsMTUgQEAKICAgICAvKioKICAgICAgKiBiaXRMZW5ndGgoKSBvZiBhIHBvc2l0aXZlIG51bWJlciB3aXRoIHRoZSBsZWZ0bW9zdCBiaXQgc2V0CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGJpdExlbmd0aCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYml0TGVuZ3RoIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEJpdExlbmd0aFBvc2l0aXZlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC04NSw2ICsxNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBiaXRMZW5ndGgoKSBvZiBhIHBvc2l0aXZlIG51bWJlciB3aGljaCBpcyBhIHBvd2VyIG9mIDIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYml0TGVuZ3RoIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaXRMZW5ndGgiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qml0TGVuZ3RoUG9zaXRpdmUzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtOTUsNiArMTY0LDE1IEBACiAgICAgLyoqCiAgICAgICogYml0TGVuZ3RoKCkgb2YgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGJpdExlbmd0aCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYml0TGVuZ3RoIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEJpdExlbmd0aE5lZ2F0aXZlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0xMDUsNiArMTgzLDE1IEBACiAgICAgLyoqCiAgICAgICogYml0TGVuZ3RoKCkgb2YgYSBuZWdhdGl2ZSBudW1iZXIgd2l0aCB0aGUgbGVmdG1vc3QgYml0IHNldAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBiaXRMZW5ndGggbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJpdExlbmd0aCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCaXRMZW5ndGhOZWdhdGl2ZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTExNSw2ICsyMDIsMTUgQEAKICAgICAvKioKICAgICAgKiBiaXRMZW5ndGgoKSBvZiBhIG5lZ2F0aXZlIG51bWJlciB3aGljaCBpcyBhIHBvd2VyIG9mIDIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgYml0TGVuZ3RoIG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiaXRMZW5ndGgiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qml0TGVuZ3RoTmVnYXRpdmUzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTEyNSw2ICsyMjEsMTUgQEAKICAgICAvKioKICAgICAgKiBjbGVhckJpdChpbnQgbikgb2YgYSBuZWdhdGl2ZSBuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjbGVhckJpdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXJCaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJCaXRFeGNlcHRpb24oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTE0MSw2ICsyNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBjbGVhckJpdChpbnQgbikgb3V0c2lkZSB6ZXJvCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNsZWFyQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhckJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckJpdFplcm8oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MH07CiAgICAgICAgIGludCBhU2lnbiA9IDA7CkBAIC0xNTksNiArMjczLDE1IEBACiAgICAgLyoqCiAgICAgICogY2xlYXJCaXQoaW50IG4pIG91dHNpZGUgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjbGVhckJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXJCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJCaXRaZXJvT3V0c2lkZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MH07CiAgICAgICAgIGludCBhU2lnbiA9IDA7CkBAIC0xNzcsNiArMzAwLDE1IEBACiAgICAgLyoqCiAgICAgICogY2xlYXJCaXQoaW50IG4pIGluc2lkZSBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjbGVhckJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXJCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJCaXROZWdhdGl2ZUluc2lkZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTE5NSw2ICszMjcsMTUgQEAKICAgICAvKioKICAgICAgKiBjbGVhckJpdChpbnQgbikgaW5zaWRlIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNsZWFyQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhckJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckJpdE5lZ2F0aXZlSW5zaWRlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtMjEzLDYgKzM1NCwxNSBAQAogICAgIC8qKgogICAgICAqIGNsZWFyQml0KDIpIGluIHRoZSBuZWdhdGl2ZSBudW1iZXIgd2l0aCBhbGwgb25lcyBpbiBiaXQgcmVwcmVzZW50YXRpb24KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0TmVnYXRpdmVJbnNpZGUzKCkgewogICAgICAgICBTdHJpbmcgYXMgPSAiLTE4NDQ2NzQ0MDczNzA5NTUxNjE1IjsKICAgICAgICAgaW50IG51bWJlciA9IDI7CkBAIC0yMjYsNiArMzc2LDE1IEBACiAgICAgICogd2l0aCBhbGwgb25lcyBpbiBiaXQgcmVwcmVzZW50YXRpb24uCiAgICAgICogdGhlIHJlc3VsdGluZyBudW1iZXIncyBsZW5ndGggaXMgMi4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0TmVnYXRpdmVJbnNpZGU0KCkgewogICAgICAgICBTdHJpbmcgYXMgPSAiLTQyOTQ5NjcyOTUiOwogICAgICAgICBTdHJpbmcgcmVzID0gIi00Mjk0OTY3Mjk2IjsKQEAgLTI0MCw2ICszOTksMTUgQEAKICAgICAgKiB3aXRoIGFsbCBvbmVzIGluIGJpdCByZXByZXNlbnRhdGlvbi4KICAgICAgKiB0aGUgcmVzdWx0aW5nIG51bWJlcidzIGxlbmd0aCBpcyAzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjbGVhckJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXJCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJCaXROZWdhdGl2ZUluc2lkZTUoKSB7CiAgICAgICAgIFN0cmluZyBhcyA9ICItMTg0NDY3NDQwNzM3MDk1NTE2MTUiOwogICAgICAgICBTdHJpbmcgcmVzID0gIi0xODQ0Njc0NDA3MzcwOTU1MTYxNiI7CkBAIC0yNTIsNiArNDIwLDE1IEBACiAgICAgLyoqCiAgICAgICogY2xlYXJCaXQoaW50IG4pIG91dHNpZGUgYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0TmVnYXRpdmVPdXRzaWRlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtMjcwLDYgKzQ0NywxNSBAQAogICAgIC8qKgogICAgICAqIGNsZWFyQml0KGludCBuKSBvdXRzaWRlIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNsZWFyQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhckJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckJpdE5lZ2F0aXZlT3V0c2lkZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTI4OCw2ICs0NzQsMTUgQEAKICAgICAvKioKICAgICAgKiBjbGVhckJpdChpbnQgbikgaW5zaWRlIGEgcG9zaXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNsZWFyQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhckJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckJpdFBvc2l0aXZlSW5zaWRlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0zMDYsNiArNTAxLDE1IEBACiAgICAgLyoqCiAgICAgICogY2xlYXJCaXQoaW50IG4pIGluc2lkZSBhIHBvc2l0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBjbGVhckJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXJCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJCaXRQb3NpdGl2ZUluc2lkZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMzI0LDYgKzUyOCwxNSBAQAogICAgIC8qKgogICAgICAqIGNsZWFyQml0KGludCBuKSBpbnNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0UG9zaXRpdmVJbnNpZGUzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTM0Miw2ICs1NTUsMTUgQEAKICAgICAvKioKICAgICAgKiBjbGVhckJpdChpbnQgbikgaW5zaWRlIGEgcG9zaXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGNsZWFyQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhckJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckJpdFBvc2l0aXZlSW5zaWRlNCAoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMzYwLDYgKzU4MiwxNSBAQAogICAgIC8qKgogICAgICAqIGNsZWFyQml0KGludCBuKSBpbnNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0UG9zaXRpdmVJbnNpZGU1ICgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0zNzgsNiArNjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogY2xlYXJCaXQoaW50IG4pIG91dHNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0UG9zaXRpdmVPdXRzaWRlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0zOTYsNiArNjM2LDE1IEBACiAgICAgLyoqCiAgICAgICogY2xlYXJCaXQoaW50IG4pIG91dHNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0UG9zaXRpdmVPdXRzaWRlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC00MTQsNiArNjYzLDE1IEBACiAgICAgLyoqCiAgICAgICogY2xlYXJCaXQoaW50IG4pIHRoZSBsZWZ0bW9zdCBiaXQgaW4gYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgY2xlYXJCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQml0VG9wTmVnYXRpdmUoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTQzMiw2ICs2OTAsMTUgQEAKICAgICAvKioKICAgICAgKiBmbGlwQml0KGludCBuKSBvZiBhIG5lZ2F0aXZlIG4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsaXBCaXQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsaXBCaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxpcEJpdEV4Y2VwdGlvbigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtNDQ4LDYgKzcxNSwxNSBAQAogICAgIC8qKgogICAgICAqIGZsaXBCaXQoaW50IG4pIHplcm8KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0WmVybygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgaW50IGFTaWduID0gMDsKQEAgLTQ2Niw2ICs3NDIsMTUgQEAKICAgICAvKioKICAgICAgKiBmbGlwQml0KGludCBuKSBvdXRzaWRlIHplcm8KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0WmVyb091dHNpZGUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezB9OwogICAgICAgICBpbnQgYVNpZ24gPSAwOwpAQCAtNDg0LDYgKzc2OSwxNSBAQAogICAgIC8qKgogICAgICAqIGZsaXBCaXQoaW50IG4pIG91dHNpZGUgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbGlwQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbGlwQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsaXBCaXRaZXJvT3V0c2lkZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MH07CiAgICAgICAgIGludCBhU2lnbiA9IDA7CkBAIC01MDIsNiArNzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogZmxpcEJpdChpbnQgbikgdGhlIGxlZnRtb3N0IGJpdCBpbiBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbGlwQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbGlwQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsaXBCaXRMZWZ0bW9zdE5lZ2F0aXZlKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC01MjAsNiArODIzLDE1IEBACiAgICAgLyoqCiAgICAgICogZmxpcEJpdChpbnQgbikgdGhlIGxlZnRtb3N0IGJpdCBpbiBhIHBvc2l0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBmbGlwQml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbGlwQml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsaXBCaXRMZWZ0bW9zdFBvc2l0aXZlKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTUzOCw2ICs4NTAsMTUgQEAKICAgICAvKioKICAgICAgKiBmbGlwQml0KGludCBuKSBpbnNpZGUgYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0TmVnYXRpdmVJbnNpZGUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC01NTYsNiArODc3LDE1IEBACiAgICAgLyoqCiAgICAgICogZmxpcEJpdChpbnQgbikgaW5zaWRlIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsaXBCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsaXBCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxpcEJpdE5lZ2F0aXZlSW5zaWRlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNTc0LDYgKzkwNCwxNSBAQAogICAgIC8qKgogICAgICAqIGZsaXBCaXQoaW50IG4pIGluc2lkZSBhIG5lZ2F0aXZlIG51bWJlciB3aXRoIGFsbCBvbmVzIGluIGJpdCByZXByZXNlbnRhdGlvbiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0TmVnYXRpdmVJbnNpZGUzKCkgewogICAgICAgICBTdHJpbmcgYXMgPSAiLTE4NDQ2NzQ0MDczNzA5NTUxNjE1IjsKICAgICAgICAgU3RyaW5nIHJlcyA9ICItMTg0NDY3NDQwNzM3MDk1NTE2MTEiOwpAQCAtNTg4LDYgKzkyNywxNSBAQAogICAgICAqIHdpdGggYWxsIG9uZXMgaW4gYml0IHJlcHJlc2VudGF0aW9uLgogICAgICAqIHRoZSByZXN1bHRpbmcgbnVtYmVyJ3MgbGVuZ3RoIGlzIDIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsaXBCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsaXBCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxpcEJpdE5lZ2F0aXZlSW5zaWRlNCgpIHsKICAgICAgICAgU3RyaW5nIGFzID0gIi00Mjk0OTY3Mjk1IjsKICAgICAgICAgU3RyaW5nIHJlcyA9ICItNDI5NDk2NzI5NiI7CkBAIC02MDIsNiArOTUwLDE1IEBACiAgICAgICogd2l0aCBhbGwgb25lcyBpbiBiaXQgcmVwcmVzZW50YXRpb24uCiAgICAgICogdGhlIHJlc3VsdGluZyBudW1iZXIncyBsZW5ndGggaXMgMy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0TmVnYXRpdmVJbnNpZGU1KCkgewogICAgICAgICBTdHJpbmcgYXMgPSAiLTE4NDQ2NzQ0MDczNzA5NTUxNjE1IjsKICAgICAgICAgU3RyaW5nIHJlcyA9ICItMTg0NDY3NDQwNzM3MDk1NTE2MTYiOwpAQCAtNjE0LDYgKzk3MSwxNSBAQAogICAgIC8qKgogICAgICAqIGZsaXBCaXQoaW50IG4pIG91dHNpZGUgYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0TmVnYXRpdmVPdXRzaWRlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNjMyLDYgKzk5OCwxNSBAQAogICAgIC8qKgogICAgICAqIGZsaXBCaXQoaW50IG4pIG91dHNpZGUgYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0TmVnYXRpdmVPdXRzaWRlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtNjUwLDYgKzEwMjUsMTUgQEAKICAgICAvKioKICAgICAgKiBmbGlwQml0KGludCBuKSBpbnNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0UG9zaXRpdmVJbnNpZGUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTY2OCw2ICsxMDUyLDE1IEBACiAgICAgLyoqCiAgICAgICogZmxpcEJpdChpbnQgbikgaW5zaWRlIGEgcG9zaXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGZsaXBCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZsaXBCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxpcEJpdFBvc2l0aXZlSW5zaWRlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC02ODYsNiArMTA3OSwxNSBAQAogICAgIC8qKgogICAgICAqIGZsaXBCaXQoaW50IG4pIG91dHNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0UG9zaXRpdmVPdXRzaWRlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC03MDQsNiArMTEwNiwxNSBAQAogICAgIC8qKgogICAgICAqIGZsaXBCaXQoaW50IG4pIG91dHNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZmxpcEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxpcEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwQml0UG9zaXRpdmVPdXRzaWRlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC03MjIsNiArMTEzMywxNSBAQAogICAgIC8qKgogICAgICAqIHNldEJpdChpbnQgbikgb2YgYSBuZWdhdGl2ZSBuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRFeGNlcHRpb24oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTczOCw2ICsxMTU4LDE1IEBACiAgICAgLyoqCiAgICAgICogc2V0Qml0KGludCBuKSBvdXRzaWRlIHplcm8KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2V0Qml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qml0WmVybygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgaW50IGFTaWduID0gMDsKQEAgLTc1Niw2ICsxMTg1LDE1IEBACiAgICAgLyoqCiAgICAgICogc2V0Qml0KGludCBuKSBvdXRzaWRlIHplcm8KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2V0Qml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qml0WmVyb091dHNpZGUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezB9OwogICAgICAgICBpbnQgYVNpZ24gPSAwOwpAQCAtNzc0LDYgKzEyMTIsMTUgQEAKICAgICAvKioKICAgICAgKiBzZXRCaXQoaW50IG4pIGluc2lkZSBhIHBvc2l0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRQb3NpdGl2ZUluc2lkZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtNzkyLDYgKzEyMzksMTUgQEAKICAgICAvKioKICAgICAgKiBzZXRCaXQoaW50IG4pIGluc2lkZSBhIHBvc2l0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRQb3NpdGl2ZUluc2lkZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtODEwLDYgKzEyNjYsMTUgQEAKICAgICAvKioKICAgICAgKiBzZXRCaXQoaW50IG4pIGluc2lkZSBhIHBvc2l0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRQb3NpdGl2ZUluc2lkZTMoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtODI4LDYgKzEyOTMsMTUgQEAKICAgICAvKioKICAgICAgKiBzZXRCaXQoaW50IG4pIGluc2lkZSBhIHBvc2l0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRQb3NpdGl2ZUluc2lkZTQgKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTg0Niw2ICsxMzIwLDE1IEBACiAgICAgLyoqCiAgICAgICogc2V0Qml0KGludCBuKSBvdXRzaWRlIGEgcG9zaXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNldEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Qml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEJpdFBvc2l0aXZlT3V0c2lkZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtODY0LDYgKzEzNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBzZXRCaXQoaW50IG4pIG91dHNpZGUgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2V0Qml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qml0UG9zaXRpdmVPdXRzaWRlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC04ODIsNiArMTM3NCwxNSBAQAogICAgIC8qKgogICAgICAqIHNldEJpdChpbnQgbikgdGhlIGxlZnRtb3N0IGJpdCBpbiBhIHBvc2l0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRUb3BQb3NpdGl2ZSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC05MDAsNiArMTQwMSwxNSBAQAogICAgIC8qKgogICAgICAqIHNldEJpdChpbnQgbikgdGhlIGxlZnRtb3N0IGJpdCBpbiBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRMZWZ0bW9zdE5lZ2F0aXZlKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC05MTgsNiArMTQyOCwxNSBAQAogICAgIC8qKgogICAgICAqIHNldEJpdChpbnQgbikgaW5zaWRlIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNldEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Qml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEJpdE5lZ2F0aXZlSW5zaWRlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtOTM2LDYgKzE0NTUsMTUgQEAKICAgICAvKioKICAgICAgKiBzZXRCaXQoaW50IG4pIGluc2lkZSBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXROZWdhdGl2ZUluc2lkZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTk1NCw2ICsxNDgyLDE1IEBACiAgICAgLyoqCiAgICAgICogc2V0Qml0KGludCBuKSBpbnNpZGUgYSBuZWdhdGl2ZSBudW1iZXIgd2l0aCBhbGwgb25lcyBpbiBiaXQgcmVwcmVzZW50YXRpb24KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2V0Qml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qml0TmVnYXRpdmVJbnNpZGUzKCkgewogICAgICAgICBTdHJpbmcgYXMgPSAiLTE4NDQ2NzQ0MDczNzA5NTUxNjE1IjsKICAgICAgICAgU3RyaW5nIHJlcyA9ICItMTg0NDY3NDQwNzM3MDk1NTE2MTEiOwpAQCAtOTY4LDYgKzE1MDUsMTUgQEAKICAgICAgKiB3aXRoIGFsbCBvbmVzIGluIGJpdCByZXByZXNlbnRhdGlvbi4KICAgICAgKiB0aGUgcmVzdWx0aW5nIG51bWJlcidzIGxlbmd0aCBpcyAyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXROZWdhdGl2ZUluc2lkZTQoKSB7CiAgICAgICAgIFN0cmluZyBhcyA9ICItNDI5NDk2NzI5NSI7CiAgICAgICAgIGludCBudW1iZXIgPSAwOwpAQCAtOTgxLDYgKzE1MjcsMTUgQEAKICAgICAgKiB3aXRoIGFsbCBvbmVzIGluIGJpdCByZXByZXNlbnRhdGlvbi4KICAgICAgKiB0aGUgcmVzdWx0aW5nIG51bWJlcidzIGxlbmd0aCBpcyAzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXROZWdhdGl2ZUluc2lkZTUoKSB7CiAgICAgICAgIFN0cmluZyBhcyA9ICItMTg0NDY3NDQwNzM3MDk1NTE2MTUiOwogICAgICAgICBpbnQgbnVtYmVyID0gMDsKQEAgLTk5Miw2ICsxNTQ3LDE1IEBACiAgICAgLyoqCiAgICAgICogc2V0Qml0KGludCBuKSBvdXRzaWRlIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNldEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Qml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEJpdE5lZ2F0aXZlT3V0c2lkZTEoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTEwMTAsNiArMTU3NCwxNSBAQAogICAgIC8qKgogICAgICAqIHNldEJpdChpbnQgbikgb3V0c2lkZSBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXROZWdhdGl2ZU91dHNpZGUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0xMDMwLDYgKzE2MDMsMTUgQEAKICAgICAgKiByZXByZXNlbnRlZCBhcyBuICogMzIgKyAzMSwgd2hlcmUgbiBpcyBhbiBhcmJpdHJhcnkgaW50ZWdlci4KICAgICAgKiBIZXJlIDE5MSA9IDUgKiAzMiArIDMxIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzZXRCaXQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCaXRCdWcxMzMxKCkgewogICAgICAgICBCaWdJbnRlZ2VyIHJlc3VsdCA9IEJpZ0ludGVnZXIudmFsdWVPZigwTCkuc2V0Qml0KDE5MSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiaW5jb3JyZWN0IHZhbHVlIiwgIjMxMzg1NTA4Njc2OTMzNDAzODE5MTc4OTQ3MTE2MDM4MzMyMDgwNTExNzc3MjIyMzIwMTcyNTY0NDgiLCByZXN1bHQudG9TdHJpbmcoKSk7CkBAIC0xMDM5LDYgKzE2MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBzaGlmdExlZnQoaW50IG4pLCBuID0gMAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRMZWZ0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaGlmdExlZnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hpZnRMZWZ0MSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xMDU3LDYgKzE2NDgsMTUgQEAKICAgICAvKioKICAgICAgKiBzaGlmdExlZnQoaW50IG4pLCBuIDwgMAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaGlmdExlZnQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNoaWZ0TGVmdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdExlZnQyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTEwNzUsNiArMTY3NSwxNSBAQAogICAgIC8qKgogICAgICAqIHNoaWZ0TGVmdChpbnQgbikgYSBwb3NpdGl2ZSBudW1iZXIsIG4gPiAwCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNoaWZ0TGVmdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRMZWZ0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNoaWZ0TGVmdDMoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMTA5Myw2ICsxNzAyLDE1IEBACiAgICAgLyoqCiAgICAgICogc2hpZnRMZWZ0KGludCBuKSBhIHBvc2l0aXZlIG51bWJlciwgbiA+IDAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRMZWZ0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaGlmdExlZnQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hpZnRMZWZ0NCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xMTExLDYgKzE3MjksMTUgQEAKICAgICAvKioKICAgICAgKiBzaGlmdExlZnQoaW50IG4pIGEgbmVnYXRpdmUgbnVtYmVyLCBuID4gMAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaGlmdExlZnQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNoaWZ0TGVmdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdExlZnQ1KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0xMTI5LDYgKzE3NTYsMTUgQEAKICAgICAvKioKICAgICAgKiBzaGlmdFJpZ2h0KGludCBuKSwgbiA9IDAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRSaWdodCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdFJpZ2h0MSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xMTQ3LDYgKzE3ODMsMTUgQEAKICAgICAvKioKICAgICAgKiBzaGlmdFJpZ2h0KGludCBuKSwgbiA8IDAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRSaWdodCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdFJpZ2h0MigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xMTY1LDYgKzE4MTAsMTUgQEAKICAgICAvKioKICAgICAgKiBzaGlmdFJpZ2h0KGludCBuKSwgMCA8IG4gPCAzMgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaGlmdFJpZ2h0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaGlmdFJpZ2h0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNoaWZ0UmlnaHQzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTExODMsNiArMTgzNywxNSBAQAogICAgIC8qKgogICAgICAqIHNoaWZ0UmlnaHQoaW50IG4pLCBuID4gMzIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRSaWdodCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdFJpZ2h0NCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xMjAxLDYgKzE4NjQsMTUgQEAKICAgICAvKioKICAgICAgKiBzaGlmdFJpZ2h0KGludCBuKSwgbiBpcyBncmVhdGVyIHRoYW4gYml0TGVuZ3RoKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRSaWdodCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdFJpZ2h0NSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xMjIxLDYgKzE4OTMsMTUgQEAKICAgICAgKiBzaGlmdCBkaXN0YW5jZSBpcyBtdWx0aXBsZSBvZiAzMjsKICAgICAgKiBzaGlmdGVkIGJpdHMgYXJlIE5PVCB6ZXJvZXMuIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaGlmdFJpZ2h0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaGlmdFJpZ2h0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNoaWZ0UmlnaHROZWdOb25aZXJvZXNNdWwzMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKICAgICAgICAgaW50IGFTaWduID0gLTE7CkBAIC0xMjQxLDYgKzE5MjIsMTUgQEAKICAgICAgKiBzaGlmdCBkaXN0YW5jZSBpcyBOT1QgbXVsdGlwbGUgb2YgMzI7CiAgICAgICogc2hpZnRlZCBiaXRzIGFyZSBOT1QgemVyb2VzLiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRSaWdodCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdFJpZ2h0TmVnTm9uWmVyb2VzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTEyNjEsNiArMTk1MSwxNSBAQAogICAgICAqIHNoaWZ0IGRpc3RhbmNlIGlzIE5PVCBtdWx0aXBsZSBvZiAzMjsKICAgICAgKiBzaGlmdGVkIGJpdHMgYXJlIHplcm9lcy4gCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNoaWZ0UmlnaHQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNoaWZ0UmlnaHQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hpZnRSaWdodE5lZ1plcm9lcygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTEyODEsNiArMTk4MCwxNSBAQAogICAgICAqIHNoaWZ0IGRpc3RhbmNlIGlzIG11bHRpcGxlIG9mIDMyOwogICAgICAqIHNoaWZ0ZWQgYml0cyBhcmUgemVyb2VzLiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRSaWdodCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGlmdFJpZ2h0TmVnWmVyb2VzTXVsMzIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtMTI5OSw2ICsyMDA3LDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdEJpdChpbnQgbikgb2YgYSBuZWdhdGl2ZSBuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzaGlmdFJpZ2h0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0ZXN0Qml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRlc3RCaXRFeGNlcHRpb24oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2fTsKICAgICAgICAgaW50IGFTaWduID0gMTsKQEAgLTEzMTUsNiArMjAzMiwxNSBAQAogICAgIC8qKgogICAgICAqIHRlc3RCaXQoaW50IG4pIG9mIGEgcG9zaXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNoaWZ0UmlnaHQgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRlc3RCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEJpdFBvc2l0aXZlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMTMyNiw2ICsyMDUyLDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdEJpdChpbnQgbikgb2YgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidGVzdEJpdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Qml0UG9zaXRpdmUyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IDE7CkBAIC0xMzM3LDYgKzIwNzIsMTUgQEAKICAgICAvKioKICAgICAgKiB0ZXN0Qml0KGludCBuKSBvZiBhIHBvc2l0aXZlIG51bWJlciwgbiA+IGJpdExlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNoaWZ0UmlnaHQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRlc3RCaXQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEJpdFBvc2l0aXZlMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAxOwpAQCAtMTM0OCw2ICsyMDkyLDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdEJpdChpbnQgbikgb2YgYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc2hpZnRSaWdodCBtZXRob2QuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidGVzdEJpdCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Qml0TmVnYXRpdmUxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xLCAtMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNn07CiAgICAgICAgIGludCBhU2lnbiA9IC0xOwpAQCAtMTM1OSw2ICsyMTEyLDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdEJpdChpbnQgbikgb2YgYSBwb3NpdGl2ZSBuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNoaWZ0UmlnaHQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRlc3RCaXQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEJpdE5lZ2F0aXZlMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTEzNzAsNiArMjEzMiwxNSBAQAogICAgIC8qKgogICAgICAqIHRlc3RCaXQoaW50IG4pIG9mIGEgcG9zaXRpdmUgbiwgbiA+IGJpdExlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHNoaWZ0UmlnaHQgbWV0aG9kLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRlc3RCaXQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEJpdE5lZ2F0aXZlMygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEyOCwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjZ9OwogICAgICAgICBpbnQgYVNpZ24gPSAtMTsKQEAgLTEzODQsNiArMjE1NSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNnZXRMb3dlc3RTZXRCaXQoKSBnZXRMb3dlc3RTZXRCaXQgZm9yCiAgICAgICogICAgICAgIG5lZ2F0aXZlIEJpZ0ludGVnZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldExvd2VzdFNldEJpdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG93ZXN0U2V0Qml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb3dlc3RTZXRCaXROZWcoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7CiAgICAgICAgICAgICAgICAgLTEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2CkBAIC0xMzk5LDYgKzIxNzksMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjZ2V0TG93ZXN0U2V0Qml0KCkgZ2V0TG93ZXN0U2V0Qml0IGZvcgogICAgICAqICAgICAgICBwb3NpdGl2ZSBCaWdJbnRlZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIGdldExvd2VzdFNldEJpdCBtZXRob2QuIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG93ZXN0U2V0Qml0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb3dlc3RTZXRCaXRQb3MoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7CiAgICAgICAgICAgICAgICAgLTEsIC0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2CkBAIC0xNDMwLDYgKzIyMTksMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjZ2V0TG93ZXN0U2V0Qml0KCkgZ2V0TG93ZXN0U2V0Qml0IGZvciB6ZXJvCiAgICAgICogICAgICAgIEJpZ0ludGVnZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgZ2V0TG93ZXN0U2V0Qml0IG1ldGhvZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb3dlc3RTZXRCaXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExvd2VzdFNldEJpdFplcm8oKSB7CiAgICAgICAgIGJ5dGVbXSBhQnl0ZXMgPSB7CiAgICAgICAgICAgICAwCmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyT3JUZXN0LmphdmEgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyT3JUZXN0LmphdmEKaW5kZXggNGI1YWU4My4uZTZlZmViMCAxMDA2NDQKLS0tIGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlck9yVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJPclRlc3QuamF2YQpAQCAtMjEsOSArMjEsMTUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworQFRlc3RUYXJnZXRDbGFzcyhCaWdJbnRlZ2VyLmNsYXNzKQogLyoqCiAgKiBDbGFzczogIGphdmEubWF0aC5CaWdJbnRlZ2VyCiAgKiBNZXRob2Q6IG9yIApAQCAtMzIsNiArMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBPciBmb3IgemVybyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0WmVyb1BvcygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTUyLDYgKzY3LDE1IEBACiAgICAgLyoqCiAgICAgICogT3IgZm9yIHplcm8gYW5kIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0WmVyb05lZygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTcyLDYgKzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogT3IgZm9yIGEgcG9zaXRpdmUgbnVtYmVyIGFuZCB6ZXJvIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBvciBvcGVyYXRpb24iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvc1plcm8oKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MH07CkBAIC05Miw2ICsxMjUsMTUgQEAKICAgICAvKioKICAgICAgKiBPciBmb3IgYSBuZWdhdGl2ZSBudW1iZXIgYW5kIHplcm8gIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBvciBvcGVyYXRpb24iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ1BvcygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHswfTsKQEAgLTExMiw2ICsxNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBPciBmb3IgemVybyBhbmQgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBvciBvcGVyYXRpb24iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFplcm9aZXJvKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezB9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezB9OwpAQCAtMTMyLDYgKzE4MywxNSBAQAogICAgIC8qKgogICAgICAqIE9yIGZvciB6ZXJvIGFuZCBvbmUKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igb3Igb3BlcmF0aW9uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RaZXJvT25lKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezB9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezF9OwpAQCAtMTUyLDYgKzIxMiwxNSBAQAogICAgIC8qKgogICAgICAqIE9yIGZvciBvbmUgYW5kIG9uZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBvciBvcGVyYXRpb24iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9uZU9uZSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxfTsKQEAgLTE3Miw2ICsyNDEsMTUgQEAKICAgICAvKioKICAgICAgKiBPciBmb3IgdHdvIHBvc2l0aXZlIG51bWJlcnMgb2YgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zUG9zU2FtZUxlbmd0aCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0xOTIsNiArMjcwLDE1IEBACiAgICAgLyoqCiAgICAgICogT3IgZm9yIHR3byBwb3NpdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgbG9uZ2VyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zUG9zRmlyc3RMb25nZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwpAQCAtMjEyLDYgKzI5OSwxNSBAQAogICAgIC8qKgogICAgICAqIE9yIGZvciB0d28gcG9zaXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIHNob3J0ZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igb3Igb3BlcmF0aW9uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NQb3NGaXJzdFNob3J0ZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwpAQCAtMjMyLDYgKzMyOCwxNSBAQAogICAgIC8qKgogICAgICAqIE9yIGZvciB0d28gbmVnYXRpdmUgbnVtYmVycyBvZiB0aGUgc2FtZSBsZW5ndGgKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igb3Igb3BlcmF0aW9uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdOZWdTYW1lTGVuZ3RoKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjgsIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTI1Miw2ICszNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBPciBmb3IgdHdvIG5lZ2F0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBsb25nZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igb3Igb3BlcmF0aW9uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3IiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdOZWdGaXJzdExvbmdlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA5LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExNywgMjMsIDg3LCAtMjUsIC03NX07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0yNzIsNiArMzg2LDE1IEBACiAgICAgLyoqCiAgICAgICogT3IgZm9yIHR3byBuZWdhdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgc2hvcnRlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBvciBvcGVyYXRpb24iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ05lZ0ZpcnN0U2hvcnRlcigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTI4LCA5LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExNywgMjMsIDg3LCAtMjUsIC03NX07CkBAIC0yOTIsNiArNDE1LDE1IEBACiAgICAgLyoqCiAgICAgICogT3IgZm9yIHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzaWducyBhbmQgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zTmVnU2FtZUxlbmd0aCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0zMTIsNiArNDQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogT3IgZm9yIHR3byBudW1iZXJzIG9mIGRpZmZlcmVudCBzaWducyBhbmQgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnUG9zU2FtZUxlbmd0aCgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMTI4LCA1NiwgMTAwLCAtMiwgLTc2LCA4OSwgNDUsIDkxLCAzLCAtMTUsIDM1LCAyNiwgLTExN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CkBAIC0zMzIsNiArNDczLDE1IEBACiAgICAgLyoqCiAgICAgICogT3IgZm9yIGEgbmVnYXRpdmUgYW5kIGEgcG9zaXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIGxvbmdlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBvciBvcGVyYXRpb24iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ1Bvc0ZpcnN0TG9uZ2VyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjgsIDksIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3LCAyMywgODcsIC0yNSwgLTc1fTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMiwgLTMsIC00LCAtNCwgNSwgMTQsIDIzLCAzOSwgNDgsIDU3LCA2NiwgNSwgMTQsIDIzfTsKQEAgLTM1Miw2ICs1MDIsMTUgQEAKICAgICAvKioKICAgICAgKiBPciBmb3IgdHdvIG5lZ2F0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBzaG9ydGVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnUG9zRmlyc3RTaG9ydGVyKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0xMjgsIDksIDU2LCAxMDAsIC0yLCAtNzYsIDg5LCA0NSwgOTEsIDMsIC0xNSwgMzUsIDI2LCAtMTE3LCAyMywgODcsIC0yNSwgLTc1fTsKQEAgLTM3Miw2ICs1MzEsMTUgQEAKICAgICAvKioKICAgICAgKiBPciBmb3IgYSBwb3NpdGl2ZSBhbmQgYSBuZWdhdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgbG9uZ2VyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIG9yIG9wZXJhdGlvbiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zTmVnRmlyc3RMb25nZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0yLCAtMywgLTQsIC00LCA1LCAxNCwgMjMsIDM5LCA0OCwgNTcsIDY2LCA1LCAxNCwgMjN9OwpAQCAtMzkyLDYgKzU2MCwxNSBAQAogICAgIC8qKgogICAgICAqIE9yIGZvciBhIHBvc2l0aXZlIGFuZCBhIG5lZ2F0aXZlIG51bWJlcjsgdGhlIGZpcnN0IGlzIHNob3J0ZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igb3Igb3BlcmF0aW9uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3IiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NOZWdGaXJzdFNob3J0ZXIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7LTIsIC0zLCAtNCwgLTQsIDUsIDE0LCAyMywgMzksIDQ4LCA1NywgNjYsIDUsIDE0LCAyM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7LTEyOCwgOSwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIC0xMTcsIDIzLCA4NywgLTI1LCAtNzV9OwpAQCAtNDA5LDYgKzU4NiwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImluY29ycmVjdCBzaWduIiwgLTEsIHJlc3VsdC5zaWdudW0oKSk7CiAgICAgfQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBvciBvcGVyYXRpb24iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvciIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlZ3Jlc3Npb24oKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0xOTk2CiAgICAgICAgIEJpZ0ludGVnZXIgeCA9IG5ldyBCaWdJbnRlZ2VyKCItMTAyMyIpOwpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlclN1YnRyYWN0VGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlclN1YnRyYWN0VGVzdC5qYXZhCmluZGV4IGYwYTYzMzIuLjc3NTBmYzAgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJTdWJ0cmFjdFRlc3QuamF2YQorKysgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyU3VidHJhY3RUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnSW50ZWdlci5jbGFzcykKIC8qKgogICogQ2xhc3M6ICBqYXZhLm1hdGguQmlnSW50ZWdlcgogICogTWV0aG9kOiBzdWJ0cmFjdCAKQEAgLTMzLDYgKzM5LDE1IEBACiAgICAgICogU3VidHJhY3QgdHdvIHBvc2l0aXZlIG51bWJlcnMgb2YgdGhlIHNhbWUgbGVuZ3RoLgogICAgICAqIFRoZSBmaXJzdCBpcyBncmVhdGVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VidHJhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgM307CkBAIC01NCw2ICs2OSwxNSBAQAogICAgICAqIFN1YnRyYWN0IHR3byBwb3NpdGl2ZSBudW1iZXJzIG9mIHRoZSBzYW1lIGxlbmd0aC4KICAgICAgKiBUaGUgc2Vjb25kIGlzIGdyZWF0ZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTIoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtNzYsNiArMTAwLDE1IEBACiAgICAgICogVGhlIGZpcnN0IGlzIHBvc2l0aXZlLgogICAgICAqIFRoZSBmaXJzdCBpcyBncmVhdGVyIGluIGFic29sdXRlIHZhbHVlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzfTsKQEAgLTk4LDYgKzEzMSwxNSBAQAogICAgICAqIFRoZSBmaXJzdCBpcyBwb3NpdGl2ZS4KICAgICAgKiBUaGUgc2Vjb25kIGlzIGdyZWF0ZXIgaW4gYWJzb2x1dGUgdmFsdWUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTQoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgM307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtMTE5LDYgKzE2MSwxNSBAQAogICAgICAqIFN1YnRyYWN0IHR3byBuZWdhdGl2ZSBudW1iZXJzIG9mIHRoZSBzYW1lIGxlbmd0aC4KICAgICAgKiBUaGUgZmlyc3QgaXMgZ3JlYXRlciBpbiBhYnNvbHV0ZSB2YWx1ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VidHJhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgM307CkBAIC0xNDAsNiArMTkxLDE1IEBACiAgICAgICogU3VidHJhY3QgdHdvIG5lZ2F0aXZlIG51bWJlcnMgb2YgdGhlIHNhbWUgbGVuZ3RoLgogICAgICAqIFRoZSBzZWNvbmQgaXMgZ3JlYXRlciBpbiBhYnNvbHV0ZSB2YWx1ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VidHJhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlNigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CkBAIC0xNjIsNiArMjIyLDE1IEBACiAgICAgICogVGhlIGZpcnN0IGlzIG5lZ2F0aXZlLgogICAgICAqIFRoZSBmaXJzdCBpcyBncmVhdGVyIGluIGFic29sdXRlIHZhbHVlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U3KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzfTsKQEAgLTE4NCw2ICsyNTMsMTUgQEAKICAgICAgKiBUaGUgZmlyc3QgaXMgbmVnYXRpdmUuCiAgICAgICogVGhlIHNlY29uZCBpcyBncmVhdGVyIGluIGFic29sdXRlIHZhbHVlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2U4KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDN9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTIwNSw2ICsyODMsMTUgQEAKICAgICAgKiBTdWJ0cmFjdCB0d28gcG9zaXRpdmUgbnVtYmVycyBvZiBkaWZmZXJlbnQgbGVuZ3RoLgogICAgICAqIFRoZSBmaXJzdCBpcyBsb25nZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTkoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgMywgNCwgNSwgNiwgN307CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDEwLCAyMCwgMzB9OwpAQCAtMjI2LDYgKzMxMywxNSBAQAogICAgICAqIFN1YnRyYWN0IHR3byBwb3NpdGl2ZSBudW1iZXJzIG9mIGRpZmZlcmVudCBsZW5ndGguCiAgICAgICogVGhlIHNlY29uZCBpcyBsb25nZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEwKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKQEAgLTI0OCw2ICszNDQsMTUgQEAKICAgICAgKiBUaGUgZmlyc3QgaXMgcG9zaXRpdmUuCiAgICAgICogVGhlIGZpcnN0IGlzIGdyZWF0ZXIgaW4gYWJzb2x1dGUgdmFsdWUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTExKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTI3MCw2ICszNzUsMTUgQEAKICAgICAgKiBUaGUgZmlyc3QgaXMgcG9zaXRpdmUuCiAgICAgICogVGhlIHNlY29uZCBpcyBncmVhdGVyIGluIGFic29sdXRlIHZhbHVlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxMigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgMywgNCwgNSwgNiwgN307CkBAIC0yOTIsNiArNDA2LDE1IEBACiAgICAgICogVGhlIGZpcnN0IGlzIG5lZ2F0aXZlLgogICAgICAqIFRoZSBmaXJzdCBpcyBsb25nZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEzKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTMxNCw2ICs0MzcsMTUgQEAKICAgICAgKiBUaGUgZmlyc3QgaXMgbmVnYXRpdmUuCiAgICAgICogVGhlIHNlY29uZCBpcyBsb25nZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTE0KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTMzNSw2ICs0NjcsMTUgQEAKICAgICAgKiBTdWJ0cmFjdCB0d28gbmVnYXRpdmUgbnVtYmVycyBvZiBkaWZmZXJlbnQgbGVuZ3RoLgogICAgICAqIFRoZSBmaXJzdCBpcyBsb25nZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTE1KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCAxMCwgMjAsIDMwfTsKQEAgLTM1Niw2ICs0OTcsMTUgQEAKICAgICAgKiBTdWJ0cmFjdCB0d28gbmVnYXRpdmUgbnVtYmVycyBvZiBkaWZmZXJlbnQgbGVuZ3RoLgogICAgICAqIFRoZSBzZWNvbmQgaXMgbG9uZ2VyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxNigpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgMTAsIDIwLCAzMH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgMSwgMiwgMywgNCwgNSwgNiwgN307CkBAIC0zNzYsNiArNTI2LDE1IEBACiAgICAgLyoqCiAgICAgICogU3VidHJhY3QgdHdvIHBvc2l0aXZlIGVxdWFsIGluIGFic29sdXRlIHZhbHVlIG51bWJlcnMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTE3KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gey0xMjAsIDM0LCA3OCwgLTIzLCAtMTExLCA0NSwgMTI3LCAyMywgNDUsIC0zfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHstMTIwLCAzNCwgNzgsIC0yMywgLTExMSwgNDUsIDEyNywgMjMsIDQ1LCAtM307CkBAIC0zOTcsNiArNTU2LDE1IEBACiAgICAgICogU3VidHJhY3QgemVybyBmcm9tIGEgbnVtYmVyLgogICAgICAqIFRoZSBudW1iZXIgaXMgcG9zaXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTE4KCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyMCwgMzQsIDc4LCAtMjMsIC0xMTEsIDQ1LCAxMjcsIDIzLCA0NSwgLTN9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gezB9OwpAQCAtNDE4LDYgKzU4NiwxNSBAQAogICAgICAqIFN1YnRyYWN0IGEgbnVtYmVyIGZyb20gemVyby4KICAgICAgKiBUaGUgbnVtYmVyIGlzIG5lZ2F0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UxOSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHswfTsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMjAsIDM0LCA3OCwgLTIzLCAtMTExLCA0NSwgMTI3LCAyMywgNDUsIC0zfTsKQEAgLTQzOCw2ICs2MTUsMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB6ZXJvIGZyb20gemVyby4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VidHJhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMjAoKSB7CiAgICAgICAgIGJ5dGUgYUJ5dGVzW10gPSB7MH07CiAgICAgICAgIGJ5dGUgYkJ5dGVzW10gPSB7MH07CkBAIC00NTksNiArNjQ1LDE1IEBACiAgICAgICogU3VidHJhY3QgWkVSTyBmcm9tIGEgbnVtYmVyLgogICAgICAqIFRoZSBudW1iZXIgaXMgcG9zaXRpdmUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTIxKCkgewogICAgICAgICBieXRlIGFCeXRlc1tdID0gezEyMCwgMzQsIDc4LCAtMjMsIC0xMTEsIDQ1LCAxMjcsIDIzLCA0NSwgLTN9OwogICAgICAgICBieXRlIHJCeXRlc1tdID0gezEyMCwgMzQsIDc4LCAtMjMsIC0xMTEsIDQ1LCAxMjcsIDIzLCA0NSwgLTN9OwpAQCAtNDc4LDYgKzY3MywxNSBAQAogICAgICAqIFN1YnRyYWN0IGEgbnVtYmVyIGZyb20gWkVSTy4KICAgICAgKiBUaGUgbnVtYmVyIGlzIG5lZ2F0aXZlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UyMigpIHsKICAgICAgICAgYnl0ZSBiQnl0ZXNbXSA9IHsxMjAsIDM0LCA3OCwgLTIzLCAtMTExLCA0NSwgMTI3LCAyMywgNDUsIC0zfTsKICAgICAgICAgYnl0ZSByQnl0ZXNbXSA9IHsxMjAsIDM0LCA3OCwgLTIzLCAtMTExLCA0NSwgMTI3LCAyMywgNDUsIC0zfTsKQEAgLTQ5Niw2ICs3MDAsMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCBaRVJPIGZyb20gWkVSTy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3Igc3VidHJhY3QgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VidHJhY3QiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMjMoKSB7CiAgICAgICAgIGJ5dGUgckJ5dGVzW10gPSB7MH07CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IEJpZ0ludGVnZXIuWkVSTzsKQEAgLTUxMiw2ICs3MjUsMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCBPTkUgZnJvbSBPTkUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHN1YnRyYWN0IG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInN1YnRyYWN0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTI0KCkgewogICAgICAgICBieXRlIHJCeXRlc1tdID0gezB9OwogICAgICAgICBCaWdJbnRlZ2VyIGFOdW1iZXIgPSBCaWdJbnRlZ2VyLk9ORTsKQEAgLTUyOCw2ICs3NTAsMTUgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycyBzbyB0aGF0IGJvcnJvdyBpcyAxLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciBzdWJ0cmFjdCBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhc2UyNSgpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OwogICAgICAgICBieXRlIGJCeXRlc1tdID0gey0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjh9OwpkaWZmIC0tZ2l0IGEvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlclRvU3RyaW5nVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlclRvU3RyaW5nVGVzdC5qYXZhCmluZGV4IDhhNGIwZTQuLmJkMGQwYjEgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJUb1N0cmluZ1Rlc3QuamF2YQorKysgYi9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyVG9TdHJpbmdUZXN0LmphdmEKQEAgLTIxLDEwICsyMSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGg7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhCaWdJbnRlZ2VyLmNsYXNzKQogLyoqCiAgKiBDbGFzczogICBqYXZhLm1hdGguQmlnSW50ZWdlcgogICogTWV0aG9kOiB0b1N0cmluZyhpbnQgcmFkaXgpCkBAIC0zMyw2ICszOCwxNSBAQAogICAgIC8qKgogICAgICAqIElmIDM2IDwgcmFkaXggPCAyIGl0IHNob3VsZCBiZSBzZXQgdG8gMTAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSYWRpeE91dE9mUmFuZ2UoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICI0NDI0MjkyMzQ4NTM4NzY0MDEiOwogICAgICAgICBpbnQgcmFkaXggPSAxMDsKQEAgLTQ0LDYgKzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdCBuZWdhdGl2ZSBudW1iZXIgb2YgcmFkaXggMgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9TdHJpbmcgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmFkaXgyTmVnKCkgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSAiLTEwMTAwMTEwMDAxMDAxMDAwMTAwMTAxMDEwMTExMDAwMDEwMTAxMDExMDAwMTAxMDAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDAxMDEwMSI7CiAgICAgICAgIGludCByYWRpeCA9IDI7CkBAIC01NSw2ICs3OCwxNSBAQAogICAgIC8qKgogICAgICAqIHRlc3QgcG9zaXRpdmUgbnVtYmVyIG9mIHJhZGl4IDIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJhZGl4MlBvcygpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gIjEwMTAwMDAxMTExMTAwMDAwMDExMDEwMTAxMDEwMTAxMDEwMTAxMDAwMTAwMTAxMDEwMTAxMDEwMTAxMDAxMDEwMTAxMDEwMTAxMDAwMDEwMDAxMDAxMCI7CiAgICAgICAgIGludCByYWRpeCA9IDI7CkBAIC02Niw2ICs5OCwxNSBAQAogICAgIC8qKgogICAgICAqIHRlc3QgbmVnYXRpdmUgbnVtYmVyIG9mIHJhZGl4IDEwCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSYWRpeDEwTmVnKCkgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSAiLTI0ODk3NTYzMDg1NzIzNjQ3ODk4NzgzOTQ4NzI5ODQiOwogICAgICAgICBpbnQgcmFkaXggPSAxNjsKQEAgLTc3LDYgKzExOCwxNSBAQAogICAgIC8qKgogICAgICAqIHRlc3QgcG9zaXRpdmUgbnVtYmVyIG9mIHJhZGl4IDEwCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSYWRpeDEwUG9zKCkgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSAiMjM4NzYyNzg5MjM0NzU2NzM5ODczNjQ3MzQ3NiI7CiAgICAgICAgIGludCByYWRpeCA9IDE2OwpAQCAtODgsNiArMTM4LDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdCBuZWdhdGl2ZSBudW1iZXIgb2YgcmFkaXggMTYKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJhZGl4MTZOZWcoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICItMjg3NjI4YTg4MzQ1MWI4MDA4NjVjNjdlOGQ3ZmYyMCI7CiAgICAgICAgIGludCByYWRpeCA9IDE2OwpAQCAtOTksNiArMTU4LDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdCBwb3NpdGl2ZSBudW1iZXIgb2YgcmFkaXggMTYKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJhZGl4MTZQb3MoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICIyODc2MjhhODgzNDUxYjgwMDg2NWM2N2U4ZDdmZjIwIjsKICAgICAgICAgaW50IHJhZGl4ID0gMTY7CkBAIC0xMTAsNiArMTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdCBuZWdhdGl2ZSBudW1iZXIgb2YgcmFkaXggMjQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJhZGl4MjROZWcoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICItMjg3NjI4YTg4Z21uMzQ1MWI4aWprMDA4NjVjNjdlOGQ3ZmYyMCI7CiAgICAgICAgIGludCByYWRpeCA9IDI0OwpAQCAtMTIxLDYgKzE5OCwxNSBAQAogICAgIC8qKgogICAgICAqIHRlc3QgcG9zaXRpdmUgbnVtYmVyIG9mIHJhZGl4IDI0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSYWRpeDI0UG9zKCkgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSAiMjg3NjI4YTg4MzQ1MWJnODBpamhrMDg2NWM2N2U4ZDdmZjIwIjsKICAgICAgICAgaW50IHJhZGl4ID0gMjQ7CkBAIC0xMzIsNiArMjE4LDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdCBuZWdhdGl2ZSBudW1iZXIgb2YgcmFkaXggMjQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJhZGl4MzZOZWcoKSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICItdWhndXdldXQ5OGl1NGgzNDc4dHEzOTg1cHE5OHllaXV0aDMzNDg1eXE0YWl1aGFsYWk0ODV5aWFlaGFzZGtyOHR5d2k1dWhzbGVpOCI7CiAgICAgICAgIGludCByYWRpeCA9IDM2OwpAQCAtMTQzLDYgKzIzOCwxNSBAQAogICAgIC8qKgogICAgICAqIHRlc3QgcG9zaXRpdmUgbnVtYmVyIG9mIHJhZGl4IDI0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSYWRpeDM2UG9zKCkgewogICAgICAgICBTdHJpbmcgdmFsdWUgPSAiMjM4OTVsdDQ1eTZ2aGdsaXV3aGdpNDV5ODQ1aHRzdWVyaHNpNDU4NnlzdWVyaHRzaW81eTY4cGVydWhnc2lsNDU2OHlwZW9yaWh0c2U0OHk2IjsKICAgICAgICAgaW50IHJhZGl4ID0gMzY7CkBAIC0xNTYsNiArMjYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI3RvU3RyaW5nKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZzEoKSB7CiAKICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMDAwMDAwMCI7CkBAIC0xNjcsNiArMjgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI3RvU3RyaW5nKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgdG9TdHJpbmcgbWV0aG9kIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nMigpIHsKICAgICAgICAgU3RyaW5nIHMgPSAiMTIzNDU2Nzg5MDk4NzY1NDMyMSI7CiAgICAgICAgIEJpZ0ludGVnZXIgYmkgPSBuZXcgQmlnSW50ZWdlcihzKTsKQEAgLTE3Nyw2ICsyOTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmczKCkgewogICAgICAgICBTdHJpbmcgcyA9ICItMTIzNDU2Nzg5MDk4NzY1NDMyMSI7CiAgICAgICAgIEJpZ0ludGVnZXIgYmkgPSBuZXcgQmlnSW50ZWdlcihzKTsKQEAgLTE4Nyw2ICszMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmc0KCkgewogICAgICAgICBTdHJpbmcgcyA9ICIxMjM0NTY3ODkwMTIzNCI7CiAgICAgICAgIGxvbmcgbCA9IDEyMzQ1Njc4OTAxMjM0TDsKQEAgLTE5OCw2ICszMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB0b1N0cmluZyBtZXRob2QiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmc1KCkgewogICAgICAgICBTdHJpbmcgcyA9ICItMTIzNDU2Nzg5MDEyMzQiOwogICAgICAgICBsb25nIGwgPSAtMTIzNDU2Nzg5MDEyMzRMOwpAQCAtMjA5LDYgKzM1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHRvU3RyaW5nIG1ldGhvZCIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgYnl0ZSBhQnl0ZXNbXSA9IHsKICAgICAgICAgICAgICAgICAxMiwgNTYsIDEwMCwgLTIsIC03NiwgODksIDQ1LCA5MSwgMywgLTE1LCAzNSwgMjYsIDMsIDkxCmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyWG9yVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL21hdGgvQmlnSW50ZWdlclhvclRlc3QuamF2YQppbmRleCAxZTg3Nzg2Li41MDk4MzYxIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvbWF0aC9CaWdJbnRlZ2VyWG9yVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS9tYXRoL0JpZ0ludGVnZXJYb3JUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnSW50ZWdlci5jbGFzcykKIC8qKgogICogQ2xhc3M6ICBqYXZhLm1hdGguQmlnSW50ZWdlcgogICogTWV0aG9kOiB4b3IKQEAgLTMyLDEwICszOCwxOSBAQAogICAgIC8qKgogICAgICAqIFhvciBmb3IgemVybyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHhvciBvcGVyYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAieG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0WmVyb1BvcygpIHsKICAgICAgICAgU3RyaW5nIG51bUEgPSAiMCI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIjI3Mzg0NjI3ODM1Mjk4NzU2Mjg5MzI3MzY1IjsKLSAgICAgICAgU3RyaW5nIHJlcyA9ICIyNzM4NDYyNzgzNTI5ODc1NjI4OTMyNzM2NSI7CisgICAgICAgIFN0cmluZyByZXMgID0gIjI3Mzg0NjI3ODM1Mjk4NzU2Mjg5MzI3MzY1IjsKICAgICAgICAgQmlnSW50ZWdlciBhTnVtYmVyID0gbmV3IEJpZ0ludGVnZXIobnVtQSk7CiAgICAgICAgIEJpZ0ludGVnZXIgYk51bWJlciA9IG5ldyBCaWdJbnRlZ2VyKG51bUIpOwogICAgICAgICBCaWdJbnRlZ2VyIHJlc3VsdCA9IGFOdW1iZXIueG9yKGJOdW1iZXIpOwpAQCAtNDUsMTAgKzYwLDE5IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciB6ZXJvIGFuZCBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB4b3Igb3BlcmF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFplcm9OZWcoKSB7CiAgICAgICAgIFN0cmluZyBudW1BID0gIjAiOwogICAgICAgICBTdHJpbmcgbnVtQiA9ICItMjczODQ2Mjc4MzUyOTg3NTYyODkzMjczNjUiOwotICAgICAgICBTdHJpbmcgcmVzID0gIi0yNzM4NDYyNzgzNTI5ODc1NjI4OTMyNzM2NSI7CisgICAgICAgIFN0cmluZyByZXMgPSAgIi0yNzM4NDYyNzgzNTI5ODc1NjI4OTMyNzM2NSI7CiAgICAgICAgIEJpZ0ludGVnZXIgYU51bWJlciA9IG5ldyBCaWdJbnRlZ2VyKG51bUEpOwogICAgICAgICBCaWdJbnRlZ2VyIGJOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcihudW1CKTsKICAgICAgICAgQmlnSW50ZWdlciByZXN1bHQgPSBhTnVtYmVyLnhvcihiTnVtYmVyKTsKQEAgLTU4LDYgKzgyLDE1IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciBhIHBvc2l0aXZlIG51bWJlciBhbmQgemVybyAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NaZXJvKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICIyNzM4NDYyNzgzNTI5ODc1NjI4OTMyNzM2NSI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIjAiOwpAQCAtNzEsNiArMTA0LDE1IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciBhIG5lZ2F0aXZlIG51bWJlciBhbmQgemVybyAgCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHhvciBvcGVyYXRpb24uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAieG9yIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnUG9zKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICItMjczODQ2Mjc4MzUyOTg3NTYyODkzMjczNjUiOwogICAgICAgICBTdHJpbmcgbnVtQiA9ICIwIjsKQEAgLTg0LDYgKzEyNiwxNSBAQAogICAgIC8qKgogICAgICAqIFhvciBmb3IgemVybyBhbmQgemVybwogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB4b3Igb3BlcmF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFplcm9aZXJvKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICIwIjsKICAgICAgICAgU3RyaW5nIG51bUIgPSAiMCI7CkBAIC05Nyw2ICsxNDgsMTUgQEAKICAgICAvKioKICAgICAgKiBYb3IgZm9yIHplcm8gYW5kIG9uZQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB4b3Igb3BlcmF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFplcm9PbmUoKSB7CiAgICAgICAgIFN0cmluZyBudW1BID0gIjAiOwogICAgICAgICBTdHJpbmcgbnVtQiA9ICIxIjsKQEAgLTExMCw2ICsxNzAsMTUgQEAKICAgICAvKioKICAgICAgKiBYb3IgZm9yIG9uZSBhbmQgb25lCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHhvciBvcGVyYXRpb24uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAieG9yIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0T25lT25lKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICIxIjsKICAgICAgICAgU3RyaW5nIG51bUIgPSAiMSI7CkBAIC0xMjMsNiArMTkyLDE1IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciB0d28gcG9zaXRpdmUgbnVtYmVycyBvZiB0aGUgc2FtZSBsZW5ndGgKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NQb3NTYW1lTGVuZ3RoKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICIyODM3NDYyNzgzNDI4Mzc0NzY3ODQ1NjQ4NzU2ODQ3NjciOwogICAgICAgICBTdHJpbmcgbnVtQiA9ICIyOTM0Nzg1NzM0ODkzNDc2NTg3NjM3NDU4Mzk0NTc2MzciOwpAQCAtMTM2LDYgKzIxNCwxNSBAQAogICAgIC8qKgogICAgICAqIFhvciBmb3IgdHdvIHBvc2l0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBsb25nZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NQb3NGaXJzdExvbmdlcigpIHsKICAgICAgICAgU3RyaW5nIG51bUEgPSAiMjgzNzQ2Mjc4MzQyODM3NDc2Nzg0NTY0ODc0ODk3Mzg0NzU5Mzg3NDgzNzk0ODU3NTY4NDc2NyI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIjI5MzQ3ODU3MzQ4OTM0NzY1ODc2Mzc0NTgzOTQ1NzYzNyI7CkBAIC0xNDksNiArMjM2LDE1IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciB0d28gcG9zaXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIHNob3J0ZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NQb3NGaXJzdFNob3J0ZXIoKSB7CiAgICAgICAgIFN0cmluZyBudW1BID0gIjI5MzQ3ODU3MzQ4OTM0NzY1ODc2Mzc0NTgzOTQ1NzYzNyI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIjI4Mzc0NjI3ODM0MjgzNzQ3Njc4NDU2NDg3NDg5NzM4NDc1OTM4NzQ4Mzc5NDg1NzU2ODQ3NjciOwpAQCAtMTYyLDYgKzI1OCwxNSBAQAogICAgIC8qKgogICAgICAqIFhvciBmb3IgdHdvIG5lZ2F0aXZlIG51bWJlcnMgb2YgdGhlIHNhbWUgbGVuZ3RoCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlRoaXMgaXMgYSBjb21wbGV0ZSBzdWJzZXQgb2YgdGVzdHMgZm9yIHhvciBvcGVyYXRpb24uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAieG9yIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnTmVnU2FtZUxlbmd0aCgpIHsKICAgICAgICAgU3RyaW5nIG51bUEgPSAiLTI4Mzc0NjI3ODM0MjgzNzQ3Njc4NDU2NDg3NTY4NDc2NyI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIi0yOTM0Nzg1NzM0ODkzNDc2NTg3NjM3NDU4Mzk0NTc2MzciOwpAQCAtMTc1LDYgKzI4MCwxNSBAQAogICAgIC8qKgogICAgICAqIFhvciBmb3IgdHdvIG5lZ2F0aXZlIG51bWJlcnM7IHRoZSBmaXJzdCBpcyBsb25nZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdOZWdGaXJzdExvbmdlcigpIHsKICAgICAgICAgU3RyaW5nIG51bUEgPSAiLTI4Mzc0NjI3ODM0MjgzNzQ3Njc4NDU2NDg3NDg5NzM4NDc1OTM4NzQ4Mzc5NDg1NzU2ODQ3NjciOwogICAgICAgICBTdHJpbmcgbnVtQiA9ICItMjkzNDc4NTczNDg5MzQ3NjU4NzYzNzQ1ODM5NDU3NjM3IjsKQEAgLTE4OCw2ICszMDIsMTUgQEAKICAgICAvKioKICAgICAgKiBYb3IgZm9yIHR3byBuZWdhdGl2ZSBudW1iZXJzOyB0aGUgZmlyc3QgaXMgc2hvcnRlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB4b3Igb3BlcmF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ05lZ0ZpcnN0U2hvcnRlcigpIHsKICAgICAgICAgU3RyaW5nIG51bUEgPSAiMjkzNDc4NTczNDg5MzQ3NjU4NzYzNzQ1ODM5NDU3NjM3IjsKICAgICAgICAgU3RyaW5nIG51bUIgPSAiMjgzNzQ2Mjc4MzQyODM3NDc2Nzg0NTY0ODc0ODk3Mzg0NzU5Mzg3NDgzNzk0ODU3NTY4NDc2NyI7CkBAIC0yMDEsNiArMzI0LDE1IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciB0d28gbnVtYmVycyBvZiBkaWZmZXJlbnQgc2lnbnMgYW5kIHRoZSBzYW1lIGxlbmd0aAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB4b3Igb3BlcmF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvc05lZ1NhbWVMZW5ndGgoKSB7CiAgICAgICAgIFN0cmluZyBudW1BID0gIjI4Mzc0NjI3ODM0MjgzNzQ3Njc4NDU2NDg3NTY4NDc2NyI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIi0yOTM0Nzg1NzM0ODkzNDc2NTg3NjM3NDU4Mzk0NTc2MzciOwpAQCAtMjE0LDYgKzM0NiwxNSBAQAogICAgIC8qKgogICAgICAqIFhvciBmb3IgdHdvIG51bWJlcnMgb2YgZGlmZmVyZW50IHNpZ25zIGFuZCB0aGUgc2FtZSBsZW5ndGgKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdQb3NTYW1lTGVuZ3RoKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICItMjgzNzQ2Mjc4MzQyODM3NDc2Nzg0NTY0ODc1Njg0NzY3IjsKICAgICAgICAgU3RyaW5nIG51bUIgPSAiMjkzNDc4NTczNDg5MzQ3NjU4NzYzNzQ1ODM5NDU3NjM3IjsKQEAgLTIyNyw2ICszNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBYb3IgZm9yIGEgbmVnYXRpdmUgYW5kIGEgcG9zaXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIGxvbmdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB4b3Igb3BlcmF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5lZ1Bvc0ZpcnN0TG9uZ2VyKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICItMjgzNzQ2Mjc4MzQyODM3NDc2Nzg0NTY0ODc0ODk3Mzg0NzU5Mzg3NDgzNzk0ODU3NTY4NDc2NyI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIjI5MzQ3ODU3MzQ4OTM0NzY1ODc2Mzc0NTgzOTQ1NzYzNyI7CkBAIC0yNDAsNiArMzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciB0d28gbmVnYXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIHNob3J0ZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdQb3NGaXJzdFNob3J0ZXIoKSB7CiAgICAgICAgIFN0cmluZyBudW1BID0gIi0yOTM0Nzg1NzM0ODkzNDc2NTg3NjM3NDU4Mzk0NTc2MzciOwogICAgICAgICBTdHJpbmcgbnVtQiA9ICIyODM3NDYyNzgzNDI4Mzc0NzY3ODQ1NjQ4NzQ4OTczODQ3NTkzODc0ODM3OTQ4NTc1Njg0NzY3IjsKQEAgLTI1Myw2ICs0MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBYb3IgZm9yIGEgcG9zaXRpdmUgYW5kIGEgbmVnYXRpdmUgbnVtYmVyczsgdGhlIGZpcnN0IGlzIGxvbmdlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICJUaGlzIGlzIGEgY29tcGxldGUgc3Vic2V0IG9mIHRlc3RzIGZvciB4b3Igb3BlcmF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvc05lZ0ZpcnN0TG9uZ2VyKCkgewogICAgICAgICBTdHJpbmcgbnVtQSA9ICIyODM3NDYyNzgzNDI4Mzc0NzY3ODQ1NjQ4NzQ4OTczODQ3NTkzODc0ODM3OTQ4NTc1Njg0NzY3IjsKICAgICAgICAgU3RyaW5nIG51bUIgPSAiLTI5MzQ3ODU3MzQ4OTM0NzY1ODc2Mzc0NTgzOTQ1NzYzNyI7CkBAIC0yNjYsNiArNDM0LDE1IEBACiAgICAgLyoqCiAgICAgICogWG9yIGZvciBhIHBvc2l0aXZlIGFuZCBhIG5lZ2F0aXZlIG51bWJlcjsgdGhlIGZpcnN0IGlzIHNob3J0ZXIKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiVGhpcyBpcyBhIGNvbXBsZXRlIHN1YnNldCBvZiB0ZXN0cyBmb3IgeG9yIG9wZXJhdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ4b3IiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NOZWdGaXJzdFNob3J0ZXIoKSB7CiAgICAgICAgIFN0cmluZyBudW1BID0gIjI5MzQ3ODU3MzQ4OTM0NzY1ODc2Mzc0NTgzOTQ1NzYzNyI7CiAgICAgICAgIFN0cmluZyBudW1CID0gIi0yODM3NDYyNzgzNDI4Mzc0NzY3ODQ1NjQ4NzQ4OTczODQ3NTkzODc0ODM3OTQ4NTc1Njg0NzY3IjsKZGlmZiAtLWdpdCBhL21hdGgvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9tYXRoL0JpZ0RlY2ltYWxUZXN0LmphdmEgYi9tYXRoL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbWF0aC9CaWdEZWNpbWFsVGVzdC5qYXZhCmluZGV4IGFjNjdhYzkuLjc2YmRjYmEgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9tYXRoL0JpZ0RlY2ltYWxUZXN0LmphdmEKKysrIGIvbWF0aC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL21hdGgvQmlnRGVjaW1hbFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5tYXRoOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwpAQCAtMjYsNyArMzEsNyBAQAogaW1wb3J0IGphdmEubWF0aC5NYXRoQ29udGV4dDsKIGltcG9ydCBqYXZhLm1hdGguUm91bmRpbmdNb2RlOwogCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnRGVjaW1hbC5jbGFzcykKIHB1YmxpYyBjbGFzcyBCaWdEZWNpbWFsVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAgICAgQmlnSW50ZWdlciB2YWx1ZSA9IG5ldyBCaWdJbnRlZ2VyKCIxMjM0NTkwOCIpOwogCkBAIC0zNSw2ICs0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNCaWdEZWNpbWFsKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9tYXRoX0JpZ0ludGVnZXIoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmlnID0gbmV3IEJpZ0RlY2ltYWwodmFsdWUpOwogICAgICAgICBhc3NlcnRUcnVlKCJ0aGUgQmlnRGVjaW1hbCB2YWx1ZSBpcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiLCBiaWcKQEAgLTQ1LDYgKzU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI0JpZ0RlY2ltYWwoamF2YS5tYXRoLkJpZ0ludGVnZXIsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9tYXRoX0JpZ0ludGVnZXJJKCkgewogICAgICAgICBCaWdEZWNpbWFsIGJpZyA9IG5ldyBCaWdEZWNpbWFsKHZhbHVlMiwgNSk7CiAgICAgICAgIGFzc2VydFRydWUoInRoZSBCaWdEZWNpbWFsIHZhbHVlIGlzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIsIGJpZwpAQCAtNTcsNiArODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjQmlnRGVjaW1hbChkb3VibGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJVbnByZWRpY3RhYmxlIGNhc2VzIHdpdGggbGltaXRhdGlvbiBvZiBkb3VibGUgcmVwcmVzZW50YXRpb24gYXJlIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yRCgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBiaWcgPSBuZXcgQmlnRGVjaW1hbCgxMjNFMDQpOwogICAgICAgICBhc3NlcnRUcnVlKApAQCAtOTAsNiArMTIyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI0JpZ0RlY2ltYWwoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmlnID0gbmV3IEJpZ0RlY2ltYWwoIjM0NS4yMzQ5OTYwMDI5Mzg1MCIpOwogICAgICAgICBhc3NlcnRUcnVlKCJ0aGUgQmlnRGVjaW1hbCB2YWx1ZSBpcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiLCBiaWcKQEAgLTExMCw2ICsxNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjQmlnRGVjaW1hbChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3JfU3RyaW5nX3BsdXNfZXhwKCkgewogICAgICAgICAvKgogICAgICAgICAgKiBCaWdEZWNpbWFsIGRvZXMgbm90IHN1cHBvcnQgYSArIHNpZ24gaW4gdGhlIGV4cG9uZW50IHdoZW4gY29udmVydGluZwpAQCAtMTIyLDYgKzE3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNCaWdEZWNpbWFsKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2hlY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3JfU3RyaW5nX2VtcHR5KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoIiIpOyAgICAgICAgICAgIApAQCAtMTMzLDYgKzE5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNCaWdEZWNpbWFsKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2hlY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3JfU3RyaW5nX3BsdXNfbWludXNfZXhwKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoIiszNWUrLTIiKTsgICAgICAgICAgICAKQEAgLTE1MCw2ICsyMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjQmlnRGVjaW1hbChjaGFyW10pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2hlY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25zdHJ1Y3Rvcl9DQ19wbHVzX21pbnVzX2V4cCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKCIrMzVlKy0yIi50b0NoYXJBcnJheSgpKTsgICAgICAgICAgCkBAIC0xNjcsNiArMjQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2FicygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hYnMoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmlnID0gbmV3IEJpZ0RlY2ltYWwoIi0xMjM0Iik7CiAgICAgICAgIEJpZ0RlY2ltYWwgYmlnYWJzID0gYmlnLmFicygpOwpAQCAtMTgxLDYgKzI2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNhZGQoamF2YS5tYXRoLkJpZ0RlY2ltYWwpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX21hdGhfQmlnRGVjaW1hbCgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBhZGQxID0gbmV3IEJpZ0RlY2ltYWwoIjIzLjQ1NiIpOwogICAgICAgICBCaWdEZWNpbWFsIGFkZDIgPSBuZXcgQmlnRGVjaW1hbCgiMzg0OS4yMzUiKTsKQEAgLTE5OCw2ICsyOTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjY29tcGFyZVRvKGphdmEubWF0aC5CaWdEZWNpbWFsKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9tYXRoX0JpZ0RlY2ltYWwoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgY29tcDEgPSBuZXcgQmlnRGVjaW1hbCgiMS4wMCIpOwogICAgICAgICBCaWdEZWNpbWFsIGNvbXAyID0gbmV3IEJpZ0RlY2ltYWwoMS4wMDAwMDBEKTsKQEAgLTIxNCw2ICszMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjZGl2aWRlKGphdmEubWF0aC5CaWdEZWNpbWFsLCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiBVc2VkIG9ubHkgUk9VTkRfVVAgJiBST1VORF9ET1dOIHJvdW5kIG1vZGVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpdmlkZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RpdmlkZUxqYXZhX21hdGhfQmlnRGVjaW1hbEkoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgZGl2ZDEgPSBuZXcgQmlnRGVjaW1hbCh2YWx1ZSwgMik7CiAgICAgICAgIEJpZ0RlY2ltYWwgZGl2ZDIgPSBuZXcgQmlnRGVjaW1hbCgiMi4zMzUiKTsKQEAgLTI0MSw2ICszNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjZGl2aWRlKGphdmEubWF0aC5CaWdEZWNpbWFsLCBpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIFVzZWQgb25seSBST1VORF9VUCAmIFJPVU5EX0RPV04gcm91bmQgbW9kZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kaXZpZGVMamF2YV9tYXRoX0JpZ0RlY2ltYWxJSSgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBkaXZkMSA9IG5ldyBCaWdEZWNpbWFsKHZhbHVlMiwgNCk7CiAgICAgICAgIEJpZ0RlY2ltYWwgZGl2ZDIgPSBuZXcgQmlnRGVjaW1hbCgiMC4wMDIzIik7CkBAIC0yNjUsNiArMzg3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2RvdWJsZVZhbHVlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5hcnJvd2luZyBsaW1pdGF0aW9ucyBvZiBkb3VibGUgcmVwcmVzZW50YXRpb24gYXJlIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvdWJsZVZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kb3VibGVWYWx1ZSgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBiaWdEQiA9IG5ldyBCaWdEZWNpbWFsKC0xLjIzNEUtMTEyKTsKIC8vICAgICAgICBDb21tZW50aW5nIG91dCB0aGlzIHBhcnQgYmVjYXVzZSBpdCBjYXVzZXMgYW4gZW5kbGVzcyBsb29wIChzZWUgSEFSTU9OWS0zMTkgYW5kIEhBUk1PTlktMzI5KQpAQCAtMjk2LDYgKzQyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBlcXVhbDEgPSBuZXcgQmlnRGVjaW1hbCgxLjAwRCk7CiAgICAgICAgIEJpZ0RlY2ltYWwgZXF1YWwyID0gbmV3IEJpZ0RlY2ltYWwoIjEuMCIpOwpAQCAtMzIzLDYgKzQ2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNmbG9hdFZhbHVlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5hcnJvd2luZyBsaW1pdGF0aW9ucyBvZiBmbG9hdCByZXByZXNlbnRhdGlvbiBhcmUgbm90IGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmxvYXRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxvYXRWYWx1ZSgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBmbDEgPSBuZXcgQmlnRGVjaW1hbCgiMjM0NTYzNzgyMzQ0NTY3Iik7CiAgICAgICAgIGFzc2VydFRydWUoInRoZSBmbG9hdCByZXByZXNlbnRhdGlvbiBvZiBiaWdEZWNpbWFsIDIzNDU2Mzc4MjM0NDU2NyIsCkBAIC0zNTAsNiArNDk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2hhc2hDb2RlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIC8vIGFueXRoaW5nIHRoYXQgaXMgZXF1YWwgbXVzdCBoYXZlIHRoZSBzYW1lIGhhc2hDb2RlCiAgICAgICAgIEJpZ0RlY2ltYWwgaGFzaCA9IG5ldyBCaWdEZWNpbWFsKCIxLjAwIik7CkBAIC0zNzgsNiArNTM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI2ludFZhbHVlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50VmFsdWUoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgaW50MSA9IG5ldyBCaWdEZWNpbWFsKHZhbHVlLCAzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhlIGludCB2YWx1ZSBvZiAxMjM0NS45MDggaXMgbm90IDEyMzQ1IiwKQEAgLTM5Niw2ICs1NjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjbG9uZ1ZhbHVlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb25nVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvbmdWYWx1ZSgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBsb25nMSA9IG5ldyBCaWdEZWNpbWFsKHZhbHVlMi5uZWdhdGUoKSwgMCk7CiAgICAgICAgIGFzc2VydFRydWUoInRoZSBsb25nIHZhbHVlIG9mIDEyMzM0NTYwMDAwIGlzIG5vdCAxMjMzNDU2MDAwMCIsIGxvbmcxCkBAIC00MTQsNiArNTkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI21heChqYXZhLm1hdGguQmlnRGVjaW1hbCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWF4TGphdmFfbWF0aF9CaWdEZWNpbWFsKCkgewogICAgICAgICBCaWdEZWNpbWFsIG1heDEgPSBuZXcgQmlnRGVjaW1hbCh2YWx1ZTIsIDEpOwogICAgICAgICBCaWdEZWNpbWFsIG1heDIgPSBuZXcgQmlnRGVjaW1hbCh2YWx1ZTIsIDQpOwpAQCAtNDMxLDYgKzYxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNtaW4oamF2YS5tYXRoLkJpZ0RlY2ltYWwpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21pbkxqYXZhX21hdGhfQmlnRGVjaW1hbCgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBtaW4xID0gbmV3IEJpZ0RlY2ltYWwoLTEyMzQ1LjREKTsKICAgICAgICAgQmlnRGVjaW1hbCBtaW4yID0gbmV3IEJpZ0RlY2ltYWwoLTEyMzQ1LjM5RCk7CkBAIC00NDUsNiArNjM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI21vdmVQb2ludExlZnQoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW92ZVBvaW50TGVmdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbW92ZVBvaW50TGVmdEkoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgbW92ZVB0TGVmdCA9IG5ldyBCaWdEZWNpbWFsKCIxMjM0NTYyNjUuMzQiKTsKICAgICAgICAgQmlnRGVjaW1hbCBhbHJlYWR5TW92ZWQgPSBtb3ZlUHRMZWZ0Lm1vdmVQb2ludExlZnQoNSk7CkBAIC00NzQsNiArNjc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI21vdmVQb2ludFJpZ2h0KGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFyaXRobWV0aWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1vdmVQb2ludFJpZ2h0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tb3ZlUG9pbnRSaWdodEkoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgbW92ZVB0UmlnaHQgPSBuZXcgQmlnRGVjaW1hbCgiLTEuNTg3OTY1MjE0NTgiKTsKICAgICAgICAgQmlnRGVjaW1hbCBhbHJlYWR5TW92ZWQgPSBtb3ZlUHRSaWdodC5tb3ZlUG9pbnRSaWdodCg4KTsKQEAgLTUwMCw2ICs3MTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjbXVsdGlwbHkoamF2YS5tYXRoLkJpZ0RlY2ltYWwpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibXVsdGlwbHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbXVsdGlwbHlMamF2YV9tYXRoX0JpZ0RlY2ltYWwoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgbXVsdGkxID0gbmV3IEJpZ0RlY2ltYWwodmFsdWUsIDUpOwogICAgICAgICBCaWdEZWNpbWFsIG11bHRpMiA9IG5ldyBCaWdEZWNpbWFsKDIuMzQ1RCk7CkBAIC01MzUsNiArNzU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI25lZ2F0ZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmVnYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZWdhdGUoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgbmVnYXRlMSA9IG5ldyBCaWdEZWNpbWFsKHZhbHVlMiwgNyk7CiAgICAgICAgIGFzc2VydFRydWUoInRoZSBuZWdhdGUgb2YgMTIzMy40NTYwMDAwIGlzIG5vdCAtMTIzMy40NTYwMDAwIiwgbmVnYXRlMQpAQCAtNTUwLDYgKzc4MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNzY2FsZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2NhbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NjYWxlKCkgewogICAgICAgICBCaWdEZWNpbWFsIHNjYWxlMSA9IG5ldyBCaWdEZWNpbWFsKHZhbHVlMiwgOCk7CiAgICAgICAgIGFzc2VydFRydWUoInRoZSBzY2FsZSBvZiB0aGUgbnVtYmVyIDEyMy4zNDU2MDAwMCBpcyB3cm9uZyIsIHNjYWxlMQpAQCAtNTczLDYgKzgxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNzZXRTY2FsZShpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2NhbGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNjYWxlSSgpIHsKICAgICAgICAgLy8gcm91bmRpbmcgbW9kZSBkZWZhdWx0cyB0byB6ZXJvCiAgICAgICAgIEJpZ0RlY2ltYWwgc2V0U2NhbGUxID0gbmV3IEJpZ0RlY2ltYWwodmFsdWUsIDMpOwpAQCAtNTkyLDYgKzg0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNzZXRTY2FsZShpbnQsIGludCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTY2FsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTY2FsZUlJKCkgewogICAgICAgICBCaWdEZWNpbWFsIHNldFNjYWxlMSA9IG5ldyBCaWdEZWNpbWFsKDIuMzIzRTEwMik7CiAgICAgICAgIEJpZ0RlY2ltYWwgc2V0U2NhbGUyID0gc2V0U2NhbGUxLnNldFNjYWxlKDQpOwpAQCAtNzI2LDYgKzk4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNzaWdudW0oKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpZ251bSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2lnbnVtKCkgewogICAgICAgICBCaWdEZWNpbWFsIHNpZ24gPSBuZXcgQmlnRGVjaW1hbCgxMjNFLTEwNCk7CiAgICAgICAgIGFzc2VydFRydWUoIjEyM0UtMTA0IGlzIG5vdCBwb3NpdGl2ZSBpbiBzaWdudW0oKSIsIHNpZ24uc2lnbnVtKCkgPT0gMSk7CkBAIC03MzksNiArMTAwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNzdWJ0cmFjdChqYXZhLm1hdGguQmlnRGVjaW1hbCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdWJ0cmFjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdWJ0cmFjdExqYXZhX21hdGhfQmlnRGVjaW1hbCgpIHsKICAgICAgICAgQmlnRGVjaW1hbCBzdWIxID0gbmV3IEJpZ0RlY2ltYWwoIjEzOTQ4Iik7CiAgICAgICAgIEJpZ0RlY2ltYWwgc3ViMiA9IG5ldyBCaWdEZWNpbWFsKCIyODM5LjQ4OSIpOwpAQCAtNzcxLDYgKzEwNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjdG9CaWdJbnRlZ2VyKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0JpZ0ludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvQmlnSW50ZWdlcigpIHsKICAgICAgICAgQmlnRGVjaW1hbCBzdWIxID0gbmV3IEJpZ0RlY2ltYWwoIi0yOTgzMC45ODkiKTsKICAgICAgICAgQmlnSW50ZWdlciByZXN1bHQgPSBzdWIxLnRvQmlnSW50ZWdlcigpOwpAQCAtNzk0LDYgKzEwNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjdG9TdHJpbmcoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgQmlnRGVjaW1hbCB0b1N0cmluZzEgPSBuZXcgQmlnRGVjaW1hbCgiMTIzNC4wMDAiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhlIHRvU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIDEyMzQuMDAwIGlzIHdyb25nIiwKQEAgLTgxMiw2ICsxMTA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI3Vuc2NhbGVkVmFsdWUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVuc2NhbGVkVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2NhbGVkVmFsdWUoKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgdW5zVmFsID0gbmV3IEJpZ0RlY2ltYWwoIi0yODM5NDg1LjAwMCIpOwogICAgICAgICBhc3NlcnRUcnVlKCJ0aGUgdW5zY2FsZWRWYWx1ZSBvZiAtMjgzOTQ4NS4wMDAgaXMgd3JvbmciLCB1bnNWYWwKQEAgLTgzMiw2ICsxMTM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdEZWNpbWFsI3ZhbHVlT2YobG9uZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkooKSB7CiAgICAgICAgIEJpZ0RlY2ltYWwgdmFsdWVPZkwgPSBCaWdEZWNpbWFsLnZhbHVlT2YoOTIyMzM3MjAzNjg1NDc3NTgwNkwpOwogICAgICAgICBhc3NlcnRUcnVlKCJ0aGUgYmlnRGVjaW1hbCBlcXVpdmFsZW50IG9mIDkyMjMzNzIwMzY4NTQ3NzU4MDYgaXMgd3JvbmciLApAQCAtODUwLDYgKzExNjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjdmFsdWVPZihsb25nLCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZkpJKCkgewogICAgICAgICBCaWdEZWNpbWFsIHZhbHVlT2ZKSSA9IEJpZ0RlY2ltYWwudmFsdWVPZig5MjIzMzcyMDM2ODU0Nzc1ODA2TCwgNSk7CiAgICAgICAgIGFzc2VydFRydWUoCkBAIC04NzksNiArMTE5OSwxNSBAQAogCiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIHNlcmlhbGl6YXRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0JpZ0RlY2ltYWxfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTE4OTYKICAgICAgICAgY2hhcltdIGluID0geyAnMScsICc1JywgJzYnLCAnNycsICc4JywgJzcnLCAnLicsICcwJywgJzAnIH07CkBAIC04OTYsMzEgKzEyMjUsNDAgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJkLmRvdWJsZVZhbHVlKCksIG5iZC5kb3VibGVWYWx1ZSgpLCAwLjApOwogICAgICAgICBhc3NlcnRFcXVhbHMoYmQudG9TdHJpbmcoKSwgbmJkLnRvU3RyaW5nKCkpOwogICAgIH0KLQkKLQkvKioKLQkgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0RlY2ltYWwjc3RyaXBUcmFpbGluZ1plcm8obG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X3N0cmlwVHJhaWxpbmdaZXJvKCkgewotCQlCaWdEZWNpbWFsIHNpeGh1bmRyZWR0ZXN0ID0gbmV3IEJpZ0RlY2ltYWwoIjYwMC4wIik7Ci0JCWFzc2VydFRydWUoInN0cmlwVHJhaWxpbmdaZXJvIGZhaWxlZCBmb3IgNjAwLjAiLAotCQkJCSgoc2l4aHVuZHJlZHRlc3Quc3RyaXBUcmFpbGluZ1plcm9zKCkpLnNjYWxlKCkgPT0gLTIpCi0JCQkJKTsKLQkJCi0JCS8qIFNpbmdsZSBkaWdpdCwgbm8gdHJhaWxpbmcgemVybywgb2RkIG51bWJlciAqLwotCQlCaWdEZWNpbWFsIG5vdHJhaWxpbmd6ZXJvdGVzdCA9IG5ldyBCaWdEZWNpbWFsKCIxIik7Ci0JCWFzc2VydFRydWUoInN0cmlwVHJhaWxpbmdaZXJvIGZhaWxlZCBmb3IgMSIsCi0JCQkJKChub3RyYWlsaW5nemVyb3Rlc3Quc3RyaXBUcmFpbGluZ1plcm9zKCkpLnNjYWxlKCkgPT0gMCkKLQkJCQkpOwotCQkKLQkJLyogWmVybyAqLworICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnRGVjaW1hbCNzdHJpcFRyYWlsaW5nWmVybyhsb25nKQorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0cmlwVHJhaWxpbmdaZXJvcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RyaXBUcmFpbGluZ1plcm8oKSB7CisgICAgICAgIEJpZ0RlY2ltYWwgc2l4aHVuZHJlZHRlc3QgPSBuZXcgQmlnRGVjaW1hbCgiNjAwLjAiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic3RyaXBUcmFpbGluZ1plcm8gZmFpbGVkIGZvciA2MDAuMCIsCisgICAgICAgICAgICAgICAgKChzaXhodW5kcmVkdGVzdC5zdHJpcFRyYWlsaW5nWmVyb3MoKSkuc2NhbGUoKSA9PSAtMikKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgLyogU2luZ2xlIGRpZ2l0LCBubyB0cmFpbGluZyB6ZXJvLCBvZGQgbnVtYmVyICovCisgICAgICAgIEJpZ0RlY2ltYWwgbm90cmFpbGluZ3plcm90ZXN0ID0gbmV3IEJpZ0RlY2ltYWwoIjEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic3RyaXBUcmFpbGluZ1plcm8gZmFpbGVkIGZvciAxIiwKKyAgICAgICAgICAgICAgICAoKG5vdHJhaWxpbmd6ZXJvdGVzdC5zdHJpcFRyYWlsaW5nWmVyb3MoKSkuc2NhbGUoKSA9PSAwKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIAorICAgICAgICAvKiBaZXJvICovCiAgICAgICAgIC8vcmVncmVzc2lvbiBmb3IgSEFSTU9OWS00NjIzLCBOT04tQlVHIERJRkYgd2l0aCBSSQotCQlCaWdEZWNpbWFsIHplcm90ZXN0ID0gbmV3IEJpZ0RlY2ltYWwoIjAuMDAwMCIpOwotCQlhc3NlcnRUcnVlKCJzdHJpcFRyYWlsaW5nWmVybyBmYWlsZWQgZm9yIDAuMDAwMCIsCi0JCQkJKCh6ZXJvdGVzdC5zdHJpcFRyYWlsaW5nWmVyb3MoKSkuc2NhbGUoKSA9PSAwKQotCQkJCSk7CQkKLQl9CQorICAgICAgICBCaWdEZWNpbWFsIHplcm90ZXN0ID0gbmV3IEJpZ0RlY2ltYWwoIjAuMDAwMCIpOworICAgICAgICBhc3NlcnRUcnVlKCJzdHJpcFRyYWlsaW5nWmVybyBmYWlsZWQgZm9yIDAuMDAwMCIsCisgICAgICAgICAgICAgICAgKCh6ZXJvdGVzdC5zdHJpcFRyYWlsaW5nWmVyb3MoKSkuc2NhbGUoKSA9PSAwKQorICAgICAgICAgICAgICAgICk7ICAgICAgICAKKyAgICB9ICAgIAogCi0JcHVibGljIHZvaWQgdGVzdE1hdGhDb250ZXh0Q29uc3RydWN0aW9uKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRoQ29udGV4dENvbnN0cnVjdGlvbigpIHsKICAgICAgICAgU3RyaW5nIGEgPSAiLTEyMzgwOTQ1RSs2MSI7CiAgICAgICAgIEJpZ0RlY2ltYWwgYU51bWJlciA9IG5ldyBCaWdEZWNpbWFsKGEpOwogICAgICAgICBpbnQgcHJlY2lzaW9uID0gNjsKQEAgLTkzOCw3ICsxMjc2LDcgQEAKICAgICAgICAgICAgICAgICBtY1N0cik7CiAgICAgICAgIAogICAgICAgICBhc3NlcnRFcXVhbHMoIkRpZmZlcmVudCBNYXRoQ29udGV4dCBhcmUgcmVwb3J0ZWQgYXMgRXF1YWwgIiwKLSAgICAgICAgCQltY0ludC5lcXVhbHMobWNTdHIpLAorICAgICAgICAgICAgICAgIG1jSW50LmVxdWFscyhtY1N0ciksCiAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFcXVhbCBNYXRoQ29udGV4dHMgaGF2ZSBkaWZmZXJlbnQgaGFzaGNvZGVzICIsCkBAIC05NDgsNiArMTI4Niw2IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiTWF0aENvbnRleHQudG9TdHJpbmcoKSByZXR1cm5pbmcgaW5jb3JyZWN0IHZhbHVlIiwKICAgICAgICAgICAgICAgICBtY0ludFJtLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgInByZWNpc2lvbj02IHJvdW5kaW5nTW9kZT1IQUxGX0RPV04iKTsKLQl9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9tYXRoL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbWF0aC9CaWdJbnRlZ2VyVGVzdC5qYXZhIGIvbWF0aC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlclRlc3QuamF2YQppbmRleCA1YTRmYWU3Li4xNmUyZTUwIDEwMDY0NAotLS0gYS9tYXRoL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbWF0aC9CaWdJbnRlZ2VyVGVzdC5qYXZhCisrKyBiL21hdGgvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXJUZXN0LmphdmEKQEAgLTE3LDkgKzE3LDE1IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubWF0aDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQmlnSW50ZWdlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBCaWdJbnRlZ2VyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBCaWdJbnRlZ2VyIG1pbnVzVHdvID0gbmV3IEJpZ0ludGVnZXIoIi0yIiwgMTApOwpAQCAtODAsNiArODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjQmlnSW50ZWdlcihpbnQsIGphdmEudXRpbC5SYW5kb20pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS51dGlsLlJhbmRvbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV91dGlsX1JhbmRvbSgpIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTEwNDcKICAgICAgICAgdHJ5IHsKQEAgLTEzMiw2ICsxNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjQmlnSW50ZWdlcihieXRlW10pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdW1iZXJGb3JtYXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkQigpIHsKICAgICAgICAgYnl0ZVtdIG15Qnl0ZUFycmF5OwogICAgICAgICBteUJ5dGVBcnJheSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4RkYsIChieXRlKSAweEZFIH07CkBAIC0xNDYsNiArMTcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI0JpZ0ludGVnZXIoaW50LCBieXRlW10pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlnSW50ZWdlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkkQigpIHsKICAgICAgICAgYnl0ZVtdIG15Qnl0ZUFycmF5OwogICAgICAgICBteUJ5dGVBcnJheSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4RkUgfTsKQEAgLTE3MCw2ICsyMDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjQmlnSW50ZWdlcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25zdHJ1Y3Rvcl9TdHJpbmdfZW1wdHkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiIik7ICAgICAgICAgICAgCkBAIC0xODEsNiArMjIzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI3RvQnl0ZUFycmF5KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0J5dGVBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9CeXRlQXJyYXkoKSB7CiAgICAgICAgIGJ5dGVbXSBteUJ5dGVBcnJheSwgYW5vdGhlckJ5dGVBcnJheTsKICAgICAgICAgbXlCeXRlQXJyYXkgPSBuZXcgYnl0ZVtdIHsgOTcsIDMzLCAxMjAsIDEyNCwgNTAsIDIsIDAsIDAsIDAsIDEyLCAxMjQsCkBAIC0xOTcsNiArMjQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI2lzUHJvYmFibGVQcmltZShpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNQcm9iYWJsZVByaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1Byb2JhYmxlUHJpbWVJKCkgewogICAgICAgICBpbnQgZmFpbHMgPSAwOwogICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKDIwLCAyMCwgcmFuZCk7CkBAIC0yOTksNiArMzU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKCIwPTAiLCB6ZXJvLmVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiLTEyMz0tMTIzIiwgQmlnSW50ZWdlci52YWx1ZU9mKC0xMjMpLmVxdWFscygKQEAgLTMxNCw2ICszODMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjY29tcGFyZVRvKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9tYXRoX0JpZ0ludGVnZXIoKSB7CiAgICAgICAgIGFzc2VydFRydWUoIlNtYWxsZXIgbnVtYmVyIHJldHVybmVkID49IDAiLCBvbmUuY29tcGFyZVRvKHR3bykgPCAwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGFyZ2VyIG51bWJlciByZXR1cm5lZCA+PSAwIiwgdHdvLmNvbXBhcmVUbyhvbmUpID4gMCk7CkBAIC0zMjUsNiArNDAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI2ludFZhbHVlKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBpbnRWYWx1ZSBmb3IgMioqNzAiLAogICAgICAgICAgICAgICAgIHR3b1RvVGhlU2V2ZW50eS5pbnRWYWx1ZSgpID09IDApOwpAQCAtMzM0LDYgKzQyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNsb25nVmFsdWUoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvbmdWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9uZ1ZhbHVlKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbG9uZ1ZhbHVlIGZvciAyKio3MCIsCiAgICAgICAgICAgICAgICAgdHdvVG9UaGVTZXZlbnR5LmxvbmdWYWx1ZSgpID09IDApOwpAQCAtMzQzLDYgKzQzOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciN2YWx1ZU9mKGxvbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZKKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJJbmN1cnJlZCBudW1iZXIgcmV0dXJuZWQgZm9yIDIiLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMkwpCiAgICAgICAgICAgICAgICAgLmVxdWFscyh0d28pKTsKQEAgLTM1Myw2ICs0NTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjYWRkKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBPSywgYnV0IHNvbWUgY2FzZXMgbGlzdGVkIGJlbG93IGNhbiBiZSByZWFzb25hYmxlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9tYXRoX0JpZ0ludGVnZXIoKSB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBzdW0tLXdhbnRlZCBhIHppbGxpb24iLCBhWmlsbGlvbi5hZGQoYVppbGxpb24pCiAgICAgICAgICAgICAgICAgLmFkZChhWmlsbGlvbi5uZWdhdGUoKSkuZXF1YWxzKGFaaWxsaW9uKSk7CkBAIC0zODcsNiArNTAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI25lZ2F0ZSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmVnYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZWdhdGUoKSB7CiAgICAgICAgIGFzc2VydFRydWUoIlNpbmdsZSBuZWdhdGlvbiBvZiB6ZXJvIGRpZCBub3QgcmVzdWx0IGluIHplcm8iLCB6ZXJvCiAgICAgICAgICAgICAgICAgLm5lZ2F0ZSgpLmVxdWFscyh6ZXJvKSk7CkBAIC00MTUsNiArNTM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI3NpZ251bSgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2lnbnVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaWdudW0oKSB7CiAgICAgICAgIGFzc2VydFRydWUoIldyb25nIHBvc2l0aXZlIHNpZ251bSIsIHR3by5zaWdudW0oKSA9PSAxKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgemVybyBzaWdudW0iLCB6ZXJvLnNpZ251bSgpID09IDApOwpAQCAtNDI1LDYgKzU1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNhYnMoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFicyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWJzKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJJbnZhbGlkIG51bWJlciByZXR1cm5lZCBmb3IgemlsbGlvbiIsIGFaaWxsaW9uLm5lZ2F0ZSgpCiAgICAgICAgICAgICAgICAgLmFicygpLmVxdWFscyhhWmlsbGlvbi5hYnMoKSkpOwpAQCAtNDM4LDYgKzU3OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNwb3coaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Bvd0koKSB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBleHBvbmVudCByZXR1cm5lZCBmb3IgMioqMTAiLCB0d28ucG93KDEwKS5lcXVhbHMoCiAgICAgICAgICAgICAgICAgdHdvVG9UaGVUZW4pKTsKQEAgLTQ1MCw2ICs2MDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjbW9kSW52ZXJzZShqYXZhLm1hdGguQmlnSW50ZWdlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtb2RJbnZlcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21vZEludmVyc2VMamF2YV9tYXRoX0JpZ0ludGVnZXIoKSB7CiAgICAgICAgIEJpZ0ludGVnZXIgYSA9IHplcm8sIG1vZCwgaW52OwogICAgICAgICBmb3IgKGludCBqID0gMzsgaiA8IDUwOyBqKyspIHsKQEAgLTQ5OSw2ICs2NTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjc2hpZnRSaWdodChpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2hpZnRSaWdodCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2hpZnRSaWdodEkoKSB7CiAgICAgICAgIGFzc2VydFRydWUoIjEgPj4gMCIsIEJpZ0ludGVnZXIudmFsdWVPZigxKS5zaGlmdFJpZ2h0KDApLmVxdWFscygKICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSkpOwpAQCAtNTU2LDYgKzcyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNzaGlmdExlZnQoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNoaWZ0TGVmdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2hpZnRMZWZ0SSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiMSA8PCAwIiwgb25lLnNoaWZ0TGVmdCgwKS5lcXVhbHMob25lKSk7CiAgICAgICAgIGFzc2VydFRydWUoIjEgPDwgMSIsIG9uZS5zaGlmdExlZnQoMSkuZXF1YWxzKHR3bykpOwpAQCAtNTk3LDYgKzc3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNtdWx0aXBseShqYXZhLm1hdGguQmlnSW50ZWdlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtdWx0aXBseSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tdWx0aXBseUxqYXZhX21hdGhfQmlnSW50ZWdlcigpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN1bS0td2FudGVkIHRocmVlIHppbGxpb24iLCBhWmlsbGlvbgogICAgICAgICAgICAgICAgIC5hZGQoYVppbGxpb24pLmFkZChhWmlsbGlvbikuZXF1YWxzKApAQCAtNjIzLDYgKzgwOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNkaXZpZGUoamF2YS5tYXRoLkJpZ0ludGVnZXIpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RpdmlkZUxqYXZhX21hdGhfQmlnSW50ZWdlcigpIHsKICAgICAgICAgdGVzdEFsbERpdnMoYmkzMywgYmkzKTsKICAgICAgICAgdGVzdEFsbERpdnMoYmkyMiwgYmkyKTsKQEAgLTY4MSw2ICs4NzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjcmVtYWluZGVyKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbWFpbmRlckxqYXZhX21hdGhfQmlnSW50ZWdlcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxhcmdlUG9zLnJlbWFpbmRlcih6ZXJvKTsKQEAgLTcxMCw2ICs5MTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjbW9kKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibW9kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21vZExqYXZhX21hdGhfQmlnSW50ZWdlcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxhcmdlUG9zLm1vZCh6ZXJvKTsKQEAgLTczOSw2ICs5NTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjZGl2aWRlQW5kUmVtYWluZGVyKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQXJpdGhtZXRpY0V4Y2VwdGlvbiBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGl2aWRlQW5kUmVtYWluZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RpdmlkZUFuZFJlbWFpbmRlckxqYXZhX21hdGhfQmlnSW50ZWdlcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxhcmdlUG9zLmRpdmlkZUFuZFJlbWFpbmRlcih6ZXJvKTsKQEAgLTc2OCw2ICs5OTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjQmlnSW50ZWdlcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWdJbnRlZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgibmV3KDApIiwgbmV3IEJpZ0ludGVnZXIoIjAiKS5lcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApKSk7CiAgICAgICAgIGFzc2VydFRydWUoIm5ldygxKSIsIG5ldyBCaWdJbnRlZ2VyKCIxIikuZXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSkpOwpAQCAtNzgyLDYgKzEwMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjQmlnSW50ZWdlcihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdW1iZXJGb3JtYXRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJpZ0ludGVnZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJuZXcoMCwxNikiLCBuZXcgQmlnSW50ZWdlcigiMCIsIDE2KS5lcXVhbHMoQmlnSW50ZWdlcgogICAgICAgICAgICAgICAgIC52YWx1ZU9mKDApKSk7CkBAIC04MDYsNiArMTA0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciN0b1N0cmluZygpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRUcnVlKCIwLnRvU3RyaW5nIiwgIjAiLmVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMCkudG9TdHJpbmcoKSkpOwogICAgICAgICBhc3NlcnRUcnVlKCIxLnRvU3RyaW5nIiwgIjEiLmVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSkudG9TdHJpbmcoKSkpOwpAQCAtODIwLDYgKzEwNjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjdG9TdHJpbmcoaW50KQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZ0koKSB7CiAgICAgICAgIGFzc2VydFRydWUoIjAudG9TdHJpbmcoMTYpIiwgIjAiLmVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMCkudG9TdHJpbmcoCiAgICAgICAgICAgICAgICAgMTYpKSk7CkBAIC04MzgsNiArMTA5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNhbmQoamF2YS5tYXRoLkJpZ0ludGVnZXIpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FuZExqYXZhX21hdGhfQmlnSW50ZWdlcigpIHsKICAgICAgICAgZm9yIChCaWdJbnRlZ2VyW10gZWxlbWVudCA6IGJvb2xlYW5QYWlycykgewogICAgICAgICAgICAgQmlnSW50ZWdlciBpMSA9IGVsZW1lbnRbMF0sIGkyID0gZWxlbWVudFsxXTsKQEAgLTg1NCw2ICsxMTIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI29yKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29yTGphdmFfbWF0aF9CaWdJbnRlZ2VyKCkgewogICAgICAgICBmb3IgKEJpZ0ludGVnZXJbXSBlbGVtZW50IDogYm9vbGVhblBhaXJzKSB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyIGkxID0gZWxlbWVudFswXSwgaTIgPSBlbGVtZW50WzFdOwpAQCAtODcwLDYgKzExNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5tYXRoLkJpZ0ludGVnZXIjeG9yKGphdmEubWF0aC5CaWdJbnRlZ2VyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInhvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF94b3JMamF2YV9tYXRoX0JpZ0ludGVnZXIoKSB7CiAgICAgICAgIGZvciAoQmlnSW50ZWdlcltdIGVsZW1lbnQgOiBib29sZWFuUGFpcnMpIHsKICAgICAgICAgICAgIEJpZ0ludGVnZXIgaTEgPSBlbGVtZW50WzBdLCBpMiA9IGVsZW1lbnRbMV07CkBAIC04ODYsNiArMTE3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm1hdGguQmlnSW50ZWdlciNub3QoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5vdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfbm90KCkgewogICAgICAgICBmb3IgKEJpZ0ludGVnZXJbXSBlbGVtZW50IDogYm9vbGVhblBhaXJzKSB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyIGkxID0gZWxlbWVudFswXTsKQEAgLTkwMCw2ICsxMTk0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubWF0aC5CaWdJbnRlZ2VyI2FuZE5vdChqYXZhLm1hdGguQmlnSW50ZWdlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbmROb3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYW5kTm90TGphdmFfbWF0aF9CaWdJbnRlZ2VyKCkgewogICAgICAgICBmb3IgKEJpZ0ludGVnZXJbXSBlbGVtZW50IDogYm9vbGVhblBhaXJzKSB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyIGkxID0gZWxlbWVudFswXSwgaTIgPSBlbGVtZW50WzFdOwpAQCAtOTIxLDcgKzEyMjQsMTYgQEAKICAgICB9CiAgICAgCiAKLSAgICAgcHVibGljIHZvaWQgdGVzdENsb25lKCkgeworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0xNzcwCiAgICAgICAgIE15QmlnSW50ZWdlciBteUJpZ0ludGVnZXIgPSBuZXcgTXlCaWdJbnRlZ2VyKCIxMjM0NSIpOwogICAgICAgICBteUJpZ0ludGVnZXIgPSAoTXlCaWdJbnRlZ2VyKSBteUJpZ0ludGVnZXIuY2xvbmUoKTsKZGlmZiAtLWdpdCBhL21hdGgvc3JjL3Rlc3QvamF2YS90ZXN0cy9tYXRoL0FsbFRlc3RzLmphdmEgYi9tYXRoL3NyYy90ZXN0L2phdmEvdGVzdHMvbWF0aC9BbGxUZXN0cy5qYXZhCmluZGV4IDIwNjY0ZmQuLjkyMTZmMjEgMTAwNjQ0Ci0tLSBhL21hdGgvc3JjL3Rlc3QvamF2YS90ZXN0cy9tYXRoL0FsbFRlc3RzLmphdmEKKysrIGIvbWF0aC9zcmMvdGVzdC9qYXZhL3Rlc3RzL21hdGgvQWxsVGVzdHMuamF2YQpAQCAtMzIsMzAgKzMyLDggQEAKICAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIE1hdGggdGVzdCBzdWl0ZXMiKTsKIAogICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmFwaS5qYXZhLm1hdGguQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3Qob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5BbGxUZXN0cy5zdWl0ZSgpKTsKIAotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdEZWNpbWFsQXJpdGhtZXRpY1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdEZWNpbWFsQ29tcGFyZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdEZWNpbWFsQ29uc3RydWN0b3JzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoLkJpZ0RlY2ltYWxDb252ZXJ0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoLkJpZ0RlY2ltYWxTY2FsZU9wZXJhdGlvbnNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGguQmlnSW50ZWdlckFkZFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdJbnRlZ2VyQW5kVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoLkJpZ0ludGVnZXJDb21wYXJlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoLkJpZ0ludGVnZXJDb25zdHJ1Y3RvcnNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGguQmlnSW50ZWdlckNvbnZlcnRUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGguQmlnSW50ZWdlckRpdmlkZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdJbnRlZ2VySGFzaENvZGVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGguQmlnSW50ZWdlck1vZFBvd1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdJbnRlZ2VyTXVsdGlwbHlUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGguQmlnSW50ZWdlck5vdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdJbnRlZ2VyT3BlcmF0ZUJpdHNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGguQmlnSW50ZWdlck9yVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoLkJpZ0ludGVnZXJQcm9iYWJsZVByaW1lVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS5tYXRoLkJpZ0ludGVnZXJTdWJ0cmFjdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5CaWdJbnRlZ2VyVG9TdHJpbmdUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGguQmlnSW50ZWdlclhvclRlc3QuY2xhc3MpOwotICAgICAgICAvLyBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5NYXRoQ29udGV4dENvbnN0cnVjdG9yc1Rlc3QuY2xhc3MpOwotICAgICAgICAvLyBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5oYXJtb255LnRlc3RzLmphdmEubWF0aC5NYXRoQ29udGV4dE1ldGhvZHNUZXN0LmNsYXNzKTsKICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0J1ZmZlci5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyLmphdmEKaW5kZXggMjAwMjQ2Yy4uOWU4NzBlNCAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyLmphdmEKQEAgLTQsOSArNCw5IEBACiAgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAogICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgorICogCiAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgorICogCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCkBAIC0yMCwyNSArMjAsMjUgQEAKIC8qKgogICogQSBidWZmZXIgaXMgYSBsaXN0IG9mIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgcHJpbWl0aXZlIHR5cGUuCiAgKiA8cD4KLSAqIEEgYnVmZmVyIGNhbiBiZSBkZXNjcmliZWQgYnkgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgKiBBIGJ1ZmZlciBjYW4gYmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAqIDx1bD4KLSAqIDxsaT5DYXBhY2l0eSwgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBhIGJ1ZmZlciBjYW4gaG9sZC4gQ2FwYWNpdHkgaXMgbm8KLSAqIGxlc3MgdGhhbiB6ZXJvIGFuZCBuZXZlciBjaGFuZ2VzLjwvbGk+Ci0gKiA8bGk+UG9zaXRpb24sIGlzIGEgY3Vyc29yIG9mIHRoaXMgYnVmZmVyLiBFbGVtZW50cyBhcmUgcmVhZCBvciB3cml0ZSBhdCB0aGUKLSAqIHBvc2l0aW9uIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbiBpbmRleCBleHBsaWNpdGx5LiBQb3NpdGlvbiBpcyBubyBsZXNzIHRoYW4KLSAqIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbiB0aGUgbGltaXQuPC9saT4KLSAqIDxsaT5MaW1pdCBjb250cm9scyB0aGUgc2NvcGUgb2YgYWNjZXNzaWJsZSBlbGVtZW50cy4gWW91IGNhbiBvbmx5IHJlYWQgb3IKKyAqIDxsaT5DYXBhY2l0eTogdGhlIG51bWJlciBvZiBlbGVtZW50cyBhIGJ1ZmZlciBjYW4gaG9sZC4gQ2FwYWNpdHkgbWF5IG5vdCBiZQorICogbmVnYXRpdmUgYW5kIG5ldmVyIGNoYW5nZXMuPC9saT4KKyAqIDxsaT5Qb3NpdGlvbjogYSBjdXJzb3Igb2YgdGhpcyBidWZmZXIuIEVsZW1lbnRzIGFyZSByZWFkIG9yIHdyaXR0ZW4gYXQgdGhlCisgKiBwb3NpdGlvbiBpZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gaW5kZXggZXhwbGljaXRseS4gUG9zaXRpb24gbWF5IG5vdCBiZQorICogbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4gdGhlIGxpbWl0LjwvbGk+CisgKiA8bGk+TGltaXQ6IGNvbnRyb2xzIHRoZSBzY29wZSBvZiBhY2Nlc3NpYmxlIGVsZW1lbnRzLiBZb3UgY2FuIG9ubHkgcmVhZCBvcgogICogd3JpdGUgZWxlbWVudHMgZnJvbSBpbmRleCB6ZXJvIHRvIDxjb2RlPmxpbWl0IC0gMTwvY29kZT4uIEFjY2Vzc2luZwotICogZWxlbWVudHMgb3V0IG9mIHRoZSBzY29wZSB3aWxsIGNhdXNlIGV4Y2VwdGlvbi4gTGltaXQgaXMgbm8gbGVzcyB0aGFuIHplcm8KLSAqIGFuZCBubyBncmVhdGVyIHRoYW4gY2FwYWNpdHkuPC9saT4KLSAqIDxsaT5NYXJrLCBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBzbyB0aGF0IHlvdSBjYW4gcmVzZXQKLSAqIHRoZSBwb3NpdGlvbiBsYXRlci4gTWFyayBpcyBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIHBvc2l0aW9uLjwvbGk+Ci0gKiA8bGk+QSBidWZmZXIgY2FuIGJlIHJlYWRvbmx5IG9yIHJlYWQtd3JpdGUuIFRyeWluZyB0byBtb2RpZnkgdGhlIGVsZW1lbnRzIG9mCi0gKiBhIHJlYWRvbmx5IGJ1ZmZlciB3aWxsIGNhdXNlIDxjb2RlPlJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uPC9jb2RlPiwgd2hpbGUKLSAqIGNoYW5naW5nIHRoZSBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgb2YgYSByZWFkb25seSBidWZmZXIgaXMgT0suPC9saT4KKyAqIGVsZW1lbnRzIG91dCBvZiB0aGUgc2NvcGUgd2lsbCBjYXVzZSBhbiBleGNlcHRpb24uIExpbWl0IG1heSBub3QgYmUgbmVnYXRpdmUKKyAqIGFuZCBub3QgZ3JlYXRlciB0aGFuIGNhcGFjaXR5LjwvbGk+CisgKiA8bGk+TWFyazogdXNlZCB0byByZW1lbWJlciB0aGUgY3VycmVudCBwb3NpdGlvbiwgc28gdGhhdCB5b3UgY2FuIHJlc2V0IHRoZQorICogcG9zaXRpb24gbGF0ZXIuIE1hcmsgbWF5IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm8gZ3JlYXRlciB0aGFuIHBvc2l0aW9uLjwvbGk+CisgKiA8bGk+QSBidWZmZXIgY2FuIGJlIHJlYWQtb25seSBvciByZWFkLXdyaXRlLiBUcnlpbmcgdG8gbW9kaWZ5IHRoZSBlbGVtZW50cworICogb2YgYSByZWFkLW9ubHkgYnVmZmVyIHdpbGwgY2F1c2UgYSA8Y29kZT5SZWFkT25seUJ1ZmZlckV4Y2VwdGlvbjwvY29kZT4sCisgKiB3aGlsZSBjaGFuZ2luZyB0aGUgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIG9mIGEgcmVhZC1vbmx5IGJ1ZmZlciBpcyBPSy48L2xpPgogICogPGxpPkEgYnVmZmVyIGNhbiBiZSBkaXJlY3Qgb3IgaW5kaXJlY3QuIEEgZGlyZWN0IGJ1ZmZlciB3aWxsIHRyeSBpdHMgYmVzdCB0bwotICogdGFrZSBhZHZhbnRhZ2Ugb2YgbmF0aXZlIG1lbW9yeSBBUElzIGFuZCBpdCBtYXkgbm90IHN0YXkgaW4gamF2YSBoZWFwLCB0aHVzCi0gKiBub3QgYWZmZWN0ZWQgYnkgR0MuPC9saT4KKyAqIHRha2UgYWR2YW50YWdlIG9mIG5hdGl2ZSBtZW1vcnkgQVBJcyBhbmQgaXQgbWF5IG5vdCBzdGF5IGluIHRoZSBKYXZhIGhlYXAsCisgKiB0aHVzIGl0IGlzIG5vdCBhZmZlY3RlZCBieSBnYXJiYWdlIGNvbGxlY3Rpb24uPC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CiAgKiA8cD4KQEAgLTQ2LDcgKzQ2LDggQEAKICAqIHJlcXVpcmVkLCB0aGVuIHRoZSBjYWxsZXJzIGFyZSByZXNwb25zaWJsZSB0byB0YWtlIGNhcmUgb2YgdGhlCiAgKiBzeW5jaHJvbml6YXRpb24gaXNzdWVzLgogICogPC9wPgotICoKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCdWZmZXIgewogCkBAIC02MSwxMyArNjIsMTMgQEAKICAgICBmaW5hbCBpbnQgY2FwYWNpdHk7CiAKICAgICAvKioKLSAgICAgKiA8Y29kZT5saW1pdCAtIDE8L2NvZGU+IGlzIHRoZSBsYXN0IGVsZW1lbnQgdGhhdCBjYW4gYmUgcmVhZCBvciB3cml0ZS4KKyAgICAgKiA8Y29kZT5saW1pdCAtIDE8L2NvZGU+IGlzIHRoZSBsYXN0IGVsZW1lbnQgdGhhdCBjYW4gYmUgcmVhZCBvciB3cml0dGVuLgogICAgICAqIExpbWl0IG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5jYXBhY2l0eTwvY29kZT4uCiAgICAgICovCiAgICAgaW50IGxpbWl0OwogCiAgICAgLyoqCi0gICAgICogTWFyayBpcyB0aGUgcG9zaXRpb24gd2lsbCBiZSBzZXQgd2hlbiA8Y29kZT5yZXNldCgpPC9jb2RlPiBpcyBjYWxsZWQuCisgICAgICogTWFyayBpcyB3aGVyZSBwb3NpdGlvbiB3aWxsIGJlIHNldCB3aGVuIDxjb2RlPnJlc2V0KCk8L2NvZGU+IGlzIGNhbGxlZC4KICAgICAgKiBNYXJrIGlzIG5vdCBzZXQgYnkgZGVmYXVsdC4gTWFyayBpcyBhbHdheXMgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCiAgICAgICogZ3JlYXRlciB0aGFuIDxjb2RlPnBvc2l0aW9uPC9jb2RlPi4KICAgICAgKi8KQEAgLTExNiw3ICsxMTcsNyBAQAogICAgICAqIENvbnN0cnVjdCBhIGJ1ZmZlciB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXBhY2l0eSBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGNhcGFjaXR5IG9mIHRoaXMgYnVmZmVyLgogICAgICAqLwogICAgIEJ1ZmZlcihpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTEyOCw4ICsxMjksOSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2FwYWNpdHkgb2YgdGhpcyBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoaXMgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBjYXBhY2l0eSgpIHsKICAgICAgICAgcmV0dXJuIGNhcGFjaXR5OwpAQCAtMTM4LDEyICsxNDAsMTQgQEAKICAgICAvKioKICAgICAgKiBDbGVhcnMgdGhpcyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogV2hpbGUgdGhlIGNvbnRlbnQgb2YgdGhpcyBidWZmZXIgaXMgbm90IGNoYW5nZWQgdGhlIGZvbGxvd2luZyBpbnRlcm5hbAotICAgICAqIGNoYW5nZXMgdGFrZSBwbGFjZSA6IHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHJlc2V0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsCi0gICAgICogdGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgbGltaXQgaXMgbWFkZSBlcXVhbCB0byB0aGUgY2FwYWNpdHkgYW5kIG1hcmsgaXMgdW5zZXQuCisgICAgICogV2hpbGUgdGhlIGNvbnRlbnQgb2YgdGhpcyBidWZmZXIgaXMgbm90IGNoYW5nZWQsIHRoZSBmb2xsb3dpbmcgaW50ZXJuYWwKKyAgICAgKiBjaGFuZ2VzIHRha2UgcGxhY2U6IHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHJlc2V0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGhlIGJ1ZmZlciwgdGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgbGltaXQgaXMgbWFkZSBlcXVhbCB0byB0aGUgY2FwYWNpdHkKKyAgICAgKiBhbmQgbWFyayBpcyBjbGVhcmVkLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBCdWZmZXIgY2xlYXIoKSB7CiAgICAgICAgIHBvc2l0aW9uID0gMDsKQEAgLTE2MSw4ICsxNjUsOSBAQAogICAgICAqIDxwPgogICAgICAqIFRoZSBjb250ZW50IG9mIHRoaXMgYnVmZmVyIGlzIG5vdCBjaGFuZ2VkLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBCdWZmZXIgZmxpcCgpIHsKICAgICAgICAgbGltaXQgPSBwb3NpdGlvbjsKQEAgLTE3MiwyOCArMTc3LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSByZW1haW5pbmcgZWxlbWVudChzKSBpbiB0aGlzIGJ1ZmZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBPciBtb3JlIHByZWNpc2VseSwgcmV0dXJucyA8Y29kZT5wb3NpdGlvbiAmbHQ7IGxpbWl0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIHJlbWFpbmluZyBlbGVtZW50KHMpIGluIHRoaXMgYnVmZmVyLgorICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoaXMgYnVmZmVyLCB0aGF0IGlzIGlmCisgICAgICoge0Bjb2RlIHBvc2l0aW9uIDwgbGltaXR9LgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGFyZSBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhpcyBidWZmZXIsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNSZW1haW5pbmcoKSB7CiAgICAgICAgIHJldHVybiBwb3NpdGlvbiA8IGxpbWl0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyByZWFkb25seSBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhpcyBidWZmZXIgaXMgcmVhZG9ubHkgb3Igbm90LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIHJlYWQtb25seS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGJ1ZmZlciBpcyByZWFkLW9ubHksIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlYWRPbmx5KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBsaW1pdCBvZiB0aGlzIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpbWl0IG9mIHRoaXMgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpbWl0IG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgbGltaXQoKSB7CiAgICAgICAgIHJldHVybiBsaW1pdDsKQEAgLTIwNywxMyArMjE1LDE0IEBACiAgICAgICogYmVlbiBhZGp1c3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIDxjb2RlPm5ld0xpbWl0PC9jb2RlPi4gSWYgdGhlIG1hcmsKICAgICAgKiBpcyBzZXQgYW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IGxpbWl0LCB0aGVuIGl0IGlzIGNsZWFyZWQuCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIG5ld0xpbWl0Ci0gICAgICogICAgICAgICAgICBUaGUgbmV3IGxpbWl0LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgIGNhcGFjaXR5Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBsaW1pdCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIGNhcGFjaXR5LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5uZXdMaW1pdDwvY29kZT4gaXMgaW52YWxpZC4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiA8Y29kZT5uZXdMaW1pdDwvY29kZT4gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQnVmZmVyIGxpbWl0KGludCBuZXdMaW1pdCkgewogICAgICAgICBpZiAobmV3TGltaXQgPCAwIHx8IG5ld0xpbWl0ID4gY2FwYWNpdHkpIHsKQEAgLTIzMSwxMCArMjQwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTWFyayB0aGUgY3VycmVudCBwb3NpdGlvbiwgc28gdGhhdCB0aGUgcG9zaXRpb24gbWF5IHJldHVybiB0byB0aGlzIHBvaW50CisgICAgICogTWFya3MgdGhlIGN1cnJlbnQgcG9zaXRpb24sIHNvIHRoYXQgdGhlIHBvc2l0aW9uIG1heSByZXR1cm4gdG8gdGhpcyBwb2ludAogICAgICAqIGxhdGVyIGJ5IGNhbGxpbmcgPGNvZGU+cmVzZXQoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQnVmZmVyIG1hcmsoKSB7CiAgICAgICAgIG1hcmsgPSBwb3NpdGlvbjsKQEAgLTI0Myw4ICsyNTMsOSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhpcyBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGlzIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgcG9zaXRpb24oKSB7CiAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKQEAgLTI1MywxNiArMjY0LDE3IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhpcyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1hcmsgaXMgc2V0IGFuZCBpcyBncmVhdGVyIHRoYW4gdGhlIG5ldyBwb3NpdGlvbiwgdGhlbiBpdCBpcworICAgICAqIElmIHRoZSBtYXJrIGlzIHNldCBhbmQgaXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBuZXcgcG9zaXRpb24sIHRoZW4gaXQgaXMKICAgICAgKiBjbGVhcmVkLgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdQb3NpdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIG5ldyBwb3NpdGlvbiwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlcgotICAgICAqICAgICAgICAgICAgdGhhbiBsaW1pdAotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcG9zaXRpb24sIG11c3QgYmUgbm90IG5lZ2F0aXZlIGFuZCBub3QgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICBsaW1pdC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+bmV3UG9zaXRpb248L2NvZGU+IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiA8Y29kZT5uZXdQb3NpdGlvbjwvY29kZT4gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQnVmZmVyIHBvc2l0aW9uKGludCBuZXdQb3NpdGlvbikgewogICAgICAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID4gbGltaXQpIHsKQEAgLTI3NywyMyArMjg5LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGlzIGJ1ZmZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBPciBtb3JlIHByZWNpc2VseSwgcmV0dXJucyA8Y29kZT5saW1pdCAtIHBvc2l0aW9uPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGVsZW1lbnRzIGluIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhpcyBidWZmZXIsIHRoYXQgaXMKKyAgICAgKiB7QGNvZGUgbGltaXQgLSBwb3NpdGlvbn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IHJlbWFpbmluZygpIHsKICAgICAgICAgcmV0dXJuIGxpbWl0IC0gcG9zaXRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoaXMgYnVmZmVyIHRvIHRoZSA8Y29kZT5tYXJrPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiBSZXNldHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgYnVmZmVyIHRvIHRoZSA8Y29kZT5tYXJrPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW52YWxpZE1hcmtFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGUgbWFyayBpcyBub3Qgc2V0CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG1hcmsgaXMgbm90IHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQnVmZmVyIHJlc2V0KCkgewogICAgICAgICBpZiAobWFyayA9PSBVTlNFVF9NQVJLKSB7CkBAIC0zMDYsMTMgKzMxOCwxMiBAQAogICAgIC8qKgogICAgICAqIFJld2luZHMgdGhpcyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHBvc2l0aW9uIGlzIHNldCB0byB6ZXJvLCBhbmQgdGhlIG1hcmsgaXMgY2xlYXJlZC4KKyAgICAgKiBUaGUgcG9zaXRpb24gaXMgc2V0IHRvIHplcm8sIGFuZCB0aGUgbWFyayBpcyBjbGVhcmVkLiBUaGUgY29udGVudCBvZiB0aGlzCisgICAgICogYnVmZmVyIGlzIG5vdCBjaGFuZ2VkLgogICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29udGVudCBvZiB0aGlzIGJ1ZmZlciBpcyBub3QgY2hhbmdlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQnVmZmVyIHJld2luZCgpIHsKICAgICAgICAgcG9zaXRpb24gPSAwOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0J1ZmZlck92ZXJmbG93RXhjZXB0aW9uLmphdmEKaW5kZXggOWRjNjMzMC4uYTllYzYwZCAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxMCArMTgsMTAgQEAKIAogCiAvKioKLSAqIEEgPGNvZGU+QnVmZmVyT3ZlcmZsb3dFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB3aGVuIHlvdSB0cnkgdG8gd3JpdGUgCi0gKiBlbGVtZW50cyB0byBhIGJ1ZmZlciwgYnV0IHRoZXJlIGlzIG5vdCBlbm91Z2ggcmVtYWluaW5nIHNwYWNlIGluIHRoZSAKLSAqIGJ1ZmZlci4KKyAqIEEgPGNvZGU+QnVmZmVyT3ZlcmZsb3dFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB3aGVuIGVsZW1lbnRzIGFyZSB3cml0dGVuCisgKiB0byBhIGJ1ZmZlciBidXQgdGhlcmUgaXMgbm90IGVub3VnaCByZW1haW5pbmcgc3BhY2UgaW4gdGhlIGJ1ZmZlci4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogCkBAIC0yOSw2ICsyOSw4IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+QnVmZmVyT3ZlcmZsb3dFeGNlcHRpb248L2NvZGU+LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0J1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbi5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uLmphdmEKaW5kZXggZmU1NjU1NS4uZjE1YThkYiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uLmphdmEKQEAgLTE4LDEwICsxOCwxMCBAQAogCiAKIC8qKgotICogQSA8Y29kZT5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB3aGVuIHlvdSB0cnkgdG8gcmVhZAotICogZWxlbWVudHMgZnJvbSBhIGJ1ZmZlciwgYnV0IHRoZXJlIGlzIG5vdCBlbm91Z2ggcmVtYWluaW5nIGVsZW1lbnRzIGluIHRoZQotICogYnVmZmVyLgorICogQSA8Y29kZT5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB3aGVuIGVsZW1lbnRzIGFyZSByZWFkCisgKiBmcm9tIGEgYnVmZmVyIGJ1dCB0aGVyZSBhcmUgbm90IGVub3VnaCByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlIGJ1ZmZlci4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIApAQCAtMjksNiArMjksOCBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjwvY29kZT4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0J5dGVCdWZmZXIuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0J5dGVCdWZmZXIuamF2YQppbmRleCA3YTE0YWQ5Li5hMDMzMjk4IDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9CeXRlQnVmZmVyLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnl0ZUJ1ZmZlci5qYXZhCkBAIC0yMSw5ICsyMSwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3M7CiAKIC8qKgotICogQSBidWZmZXIgb2YgPGNvZGU+Ynl0ZTwvY29kZT5zLgorICogQSBidWZmZXIgZm9yIGJ5dGVzLgogICogPHA+Ci0gKiBBIGJ5dGUgYnVmZmVyIGNhbiBiZSBjcmVhdGVkIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiBBIGJ5dGUgYnVmZmVyIGNhbiBiZSBjcmVhdGVkIGluIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgorICogPC9wPgogICogPHVsPgogICogPGxpPntAbGluayAjYWxsb2NhdGUoaW50KSBBbGxvY2F0ZX0gYSBuZXcgYnl0ZSBhcnJheSBhbmQgY3JlYXRlIGEgYnVmZmVyCiAgKiBiYXNlZCBvbiBpdDs8L2xpPgpAQCAtMzIsMTkgKzMzLDE5IEBACiAgKiA8bGk+e0BsaW5rICN3cmFwKGJ5dGVbXSkgV3JhcH0gYW4gZXhpc3RpbmcgYnl0ZSBhcnJheSB0byBjcmVhdGUgYSBuZXcKICAqIGJ1ZmZlci48L2xpPgogICogPC91bD4KLSAqIDwvcD4KLSAqCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEJ5dGVCdWZmZXIgZXh0ZW5kcyBCdWZmZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPEJ5dGVCdWZmZXI+IHsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBieXRlIGJ1ZmZlciBiYXNlZCBvbiBhIG5ldyBhbGxvY2F0ZWQgYnl0ZSBhcnJheS4KLSAgICAgKgorICAgICAqIENyZWF0ZXMgYSBieXRlIGJ1ZmZlciBiYXNlZCBvbiBhIG5ld2x5IGFsbG9jYXRlZCBieXRlIGFycmF5LgorICAgICAqIAogICAgICAqIEBwYXJhbSBjYXBhY2l0eQotICAgICAqICAgICAgICAgICAgVGhlIGNhcGFjaXR5IG9mIHRoZSBuZXcgYnVmZmVyCi0gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBieXRlIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGNhcGFjaXR5IG9mIHRoZSBuZXcgYnVmZmVyCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBieXRlIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIDxjb2RlPmNhcGFjaXR5PC9jb2RlPiBpcyBsZXNzIHRoYW4gemVybworICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjYXBhY2l0eSA8IDB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBhbGxvY2F0ZShpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5IDwgMCkgewpAQCAtNTQsMTMgKzU1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRpcmVjdCBieXRlIGJ1ZmZlciBiYXNlZCBvbiBhIG5ldyBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLgotICAgICAqCisgICAgICogQ3JlYXRlcyBhIGRpcmVjdCBieXRlIGJ1ZmZlciBiYXNlZCBvbiBhIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICBUaGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIKLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGJ5dGUgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGJ5dGUgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzIGxlc3MgdGhhbiB6ZXJvCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNhcGFjaXR5IDwgMH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGFsbG9jYXRlRGlyZWN0KGludCBjYXBhY2l0eSkgewogICAgICAgICBpZiAoY2FwYWNpdHkgPCAwKSB7CkBAIC03MywzNCArNzUsMzcgQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IGJ5dGUgYnVmZmVyIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5LgogICAgICAqIDxwPgogICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwotICAgICAqIDxjb2RlPndyYXAoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk8L2NvZGU+LjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgICAgVGhlIGJ5dGUgYXJyYXkgd2hpY2ggdGhlIG5ldyBidWZmZXIgd2lsbCBiZSBiYXNlZCBvbgotICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgYnl0ZSBidWZmZXIKKyAgICAgKiB7QGNvZGUgd3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKX0uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgd2hpY2ggdGhlIG5ldyBidWZmZXIgd2lsbCBiZSBiYXNlZCBvbgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgYnl0ZSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIHdyYXAoYnl0ZVtdIGFycmF5KSB7CiAgICAgICAgIHJldHVybiBCdWZmZXJGYWN0b3J5Lm5ld0J5dGVCdWZmZXIoYXJyYXkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgbmV3IGEgYnl0ZSBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCisgICAgICogQ3JlYXRlcyBhIG5ldyBieXRlIGJ1ZmZlciBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUgPGNvZGU+c3RhcnQ8L2NvZGU+LCBsaW1pdCB3aWxsIGJlCi0gICAgICogPGNvZGU+c3RhcnQgKyBsZW48L2NvZGU+LCBjYXBhY2l0eSB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSB7QGNvZGUgc3RhcnR9LCBsaW1pdCB3aWxsIGJlCisgICAgICoge0Bjb2RlIHN0YXJ0ICsgbGVufSwgY2FwYWNpdHkgd2lsbCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIFRoZSBieXRlIGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24uCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgc3RhcnQgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+YXJyYXkubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGFycmF5Lmxlbmd0aH0uCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgVGhlIGxlbmd0aCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5hcnJheS5sZW5ndGggLSBzdGFydDwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGJ5dGUgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoLCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGFycmF5Lmxlbmd0aCAtIHN0YXJ0fS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGJ5dGUgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5zdGFydDwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIHN0YXJ0fSBvciB7QGNvZGUgbGVufSBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciB3cmFwKGJ5dGVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuKSB7CiAgICAgICAgIGludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CkBAIC0xMTYsMTQgKzEyMSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBieXRlIG9yZGVyIG9mIHRoaXMgYnVmZmVyLCBkZWZhdWx0IGlzIDxjb2RlPkJJR19FTkRJQU48L2NvZGU+LgorICAgICAqIFRoZSBieXRlIG9yZGVyIG9mIHRoaXMgYnVmZmVyLCBkZWZhdWx0IGlzIHtAY29kZSBCSUdfRU5ESUFOfS4KICAgICAgKi8KICAgICBFbmRpYW5uZXNzIG9yZGVyID0gRW5kaWFubmVzcy5CSUdfRU5ESUFOOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkJ5dGVCdWZmZXI8L2NvZGU+IHdpdGggZ2l2ZW4gY2FwYWNpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgIFRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBCeXRlQnVmZmVyfSB3aXRoIGdpdmVuIGNhcGFjaXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXBhY2l0eQorICAgICAqICAgICAgICAgICAgdGhlIGNhcGFjaXR5IG9mIHRoZSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQnl0ZUJ1ZmZlcihpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgc3VwZXIoY2FwYWNpdHkpOwpAQCAtMTMzLDEzICsxNDAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZiB0aGVyZSdzIG9uZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGJ5dGUgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24KKyAgICAgKiBSZXR1cm5zIHRoZSBieXRlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbi4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSByZWFkb25seSBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgcmVhZC1vbmx5IGFycmF5LgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYW4gYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYW4gYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBhcnJheSgpIHsKICAgICAgICAgcmV0dXJuIHByb3RlY3RlZEFycmF5KCk7CkBAIC0xNDcsMzEgKzE1NSwzNCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBieXRlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZgotICAgICAqIHRoZXJlJ3Mgb25lLgorICAgICAqIHRoZXJlIGlzIG9uZS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgb2Zmc2V0IGlzIHRoZSBpbmRleCBvZiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gdGhlIHplcm8gcG9zaXRpb24gb2YKLSAgICAgKiB0aGUgYnVmZmVyLgorICAgICAqIFRoZSBvZmZzZXQgaXMgdGhlIGluZGV4IG9mIHRoZSBhcnJheSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgemVybworICAgICAqIHBvc2l0aW9uIG9mIHRoZSBidWZmZXIuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgb2Zmc2V0IG9mIHRoZSBieXRlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBieXRlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhIHJlYWRvbmx5IGFycmF5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSByZWFkLW9ubHkgYXJyYXkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGFycmF5T2Zmc2V0KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXlPZmZzZXQoKTsKICAgICB9CiAKICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCi0gICAgQE92ZXJyaWRlIE9iamVjdCBfYXJyYXkoKSB7CisgICAgQE92ZXJyaWRlIAorICAgIE9iamVjdCBfYXJyYXkoKSB7CiAgICAgICAgIGlmIChoYXNBcnJheSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUgaW50IF9hcnJheU9mZnNldCgpIHsKKyAgICBAT3ZlcnJpZGUgCisgICAgaW50IF9hcnJheU9mZnNldCgpIHsKICAgICAgICAgaWYgKGhhc0FycmF5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBhcnJheU9mZnNldCgpOwogICAgICAgICB9CkBAIC0xODAsMTU0ICsxOTEsMTcyIEBACiAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjaGFyIGJ1ZmZlciB3aGljaCBpcyBiYXNlZCBvbiB0aGUgcmVtYWluaW5nIGNvbnRlbnQgb2YKLSAgICAgKiB0aGlzIGJ5dGUgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBjaGFyIGJ1ZmZlciB3aGljaCBpcyBiYXNlZCBvbiB0aGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgdGhpcworICAgICAqIGJ5dGUgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gaXMgemVybywgaXRzIGxpbWl0IGFuZCBjYXBhY2l0eSBpcwotICAgICAqIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzIGRpdmlkZWQgYnkgdHdvLCBhbmQgaXRzIG1hcmsgaXMgbm90IHNldC4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSBzYW1lIGFzIHRoaXMKLSAgICAgKiBidWZmZXIuIFRoZSBuZXcgYnVmZmVyIGlzIGRpcmVjdCwgaWYgdGhpcyBieXRlIGJ1ZmZlciBpcyBkaXJlY3QuPC9wPgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gaXMgemVybywgaXRzIGxpbWl0IGFuZCBjYXBhY2l0eSBpcyB0aGUgbnVtYmVyCisgICAgICogb2YgcmVtYWluaW5nIGJ5dGVzIGRpdmlkZWQgYnkgdHdvLCBhbmQgaXRzIG1hcmsgaXMgbm90IHNldC4gVGhlIG5ldworICAgICAqIGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBpcyBkaXJlY3QgaWYgdGhpcyBieXRlIGJ1ZmZlciBpcyBkaXJlY3QuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zCi0gICAgICogZWl0aGVyIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuCi0gICAgICogVGhlIHR3byBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBjaGFyIGJ1ZmZlciB3aGljaCBpcyBiYXNlZCBvbiB0aGUgY29udGVudCBvZgotICAgICAqIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgorICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuIFRoZSB0d28gYnVmZmVyJ3MKKyAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY2hhciBidWZmZXIgd2hpY2ggaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhpcyBieXRlIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhckJ1ZmZlciBhc0NoYXJCdWZmZXIoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkb3VibGUgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY29udGVudCBvZgotICAgICAqIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogUmV0dXJucyBhIGRvdWJsZSBidWZmZXIgd2hpY2ggaXMgYmFzZWQgb24gdGhlIHJlbWFpbmluZyBjb250ZW50IG9mIHRoaXMKKyAgICAgKiBieXRlIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIGlzIHplcm8sIGl0cyBsaW1pdCBhbmQgY2FwYWNpdHkgaXMKLSAgICAgKiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBieXRlcyBkaXZpZGVkIGJ5IHR3bywgYW5kIGl0cyBtYXJrIGlzIG5vdCBzZXQuCi0gICAgICogVGhlIG5ldyBidWZmZXIncyByZWFkb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUgc2FtZSBhcyB0aGlzCi0gICAgICogYnVmZmVyLiBUaGUgbmV3IGJ1ZmZlciBpcyBkaXJlY3QsIGlmIHRoaXMgYnl0ZSBidWZmZXIgaXMgZGlyZWN0LjwvcD4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIGlzIHplcm8sIGl0cyBsaW1pdCBhbmQgY2FwYWNpdHkgaXMgdGhlIG51bWJlcgorICAgICAqIG9mIHJlbWFpbmluZyBieXRlcyBkaXZpZGVkIGJ5IGVpZ2h0LCBhbmQgaXRzIG1hcmsgaXMgbm90IHNldC4gVGhlIG5ldworICAgICAqIGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBpcyBkaXJlY3QgaWYgdGhpcyBieXRlIGJ1ZmZlciBpcyBkaXJlY3QuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zCi0gICAgICogZWl0aGVyIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuCi0gICAgICogVGhlIHR3byBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBkb3VibGUgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mCi0gICAgICogdGhpcyBieXRlIGJ1ZmZlci4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCisgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncworICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBkb3VibGUgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoaXMgYnl0ZQorICAgICAqICAgICAgICAgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBEb3VibGVCdWZmZXIgYXNEb3VibGVCdWZmZXIoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBmbG9hdCBidWZmZXIgd2hpY2ggaXMgYmFzZWQgb24gdGhlIHJlbWFpbmluZyBjb250ZW50IG9mCi0gICAgICogdGhpcyBieXRlIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY29udGVudCBvZiB0aGlzCisgICAgICogYnl0ZSBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzCi0gICAgICogdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSB0d28sIGFuZCBpdHMgbWFyayBpcyBub3Qgc2V0LgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcmVhZG9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHNhbWUgYXMgdGhpcwotICAgICAqIGJ1ZmZlci4gVGhlIG5ldyBidWZmZXIgaXMgZGlyZWN0LCBpZiB0aGlzIGJ5dGUgYnVmZmVyIGlzIGRpcmVjdC48L3A+CisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzIHRoZSBudW1iZXIKKyAgICAgKiBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSBmb3VyLCBhbmQgaXRzIG1hcmsgaXMgbm90IHNldC4gVGhlIG5ldworICAgICAqIGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBpcyBkaXJlY3QgaWYgdGhpcyBieXRlIGJ1ZmZlciBpcyBkaXJlY3QuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zCi0gICAgICogZWl0aGVyIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuCi0gICAgICogVGhlIHR3byBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBmbG9hdCBidWZmZXIgd2hpY2ggaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YKLSAgICAgKiB0aGlzIGJ5dGUgYnVmZmVyLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLiBUaGUgdHdvIGJ1ZmZlcidzCisgICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIGZsb2F0IGJ1ZmZlciB3aGljaCBpcyBiYXNlZCBvbiB0aGUgY29udGVudCBvZiB0aGlzIGJ5dGUgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBGbG9hdEJ1ZmZlciBhc0Zsb2F0QnVmZmVyKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IGJ1ZmZlciB3aGljaCBpcyBiYXNlZCBvbiB0aGUgcmVtYWluaW5nIGNvbnRlbnQgb2YKLSAgICAgKiB0aGlzIGJ5dGUgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBpbnQgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY29udGVudCBvZiB0aGlzIGJ5dGUKKyAgICAgKiBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzCi0gICAgICogdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSB0d28sIGFuZCBpdHMgbWFyayBpcyBub3Qgc2V0LgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcmVhZG9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHNhbWUgYXMgdGhpcwotICAgICAqIGJ1ZmZlci4gVGhlIG5ldyBidWZmZXIgaXMgZGlyZWN0LCBpZiB0aGlzIGJ5dGUgYnVmZmVyIGlzIGRpcmVjdC48L3A+CisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzIHRoZSBudW1iZXIKKyAgICAgKiBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSBmb3VyLCBhbmQgaXRzIG1hcmsgaXMgbm90IHNldC4gVGhlIG5ldworICAgICAqIGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBpcyBkaXJlY3QgaWYgdGhpcyBieXRlIGJ1ZmZlciBpcyBkaXJlY3QuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zCi0gICAgICogZWl0aGVyIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuCi0gICAgICogVGhlIHR3byBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBpbnQgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mCi0gICAgICogdGhpcyBieXRlIGJ1ZmZlci4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCisgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncworICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBpbnQgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEludEJ1ZmZlciBhc0ludEJ1ZmZlcigpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxvbmcgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY29udGVudCBvZgotICAgICAqIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogUmV0dXJucyBhIGxvbmcgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY29udGVudCBvZiB0aGlzCisgICAgICogYnl0ZSBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzCi0gICAgICogdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSB0d28sIGFuZCBpdHMgbWFyayBpcyBub3Qgc2V0LgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcmVhZG9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHNhbWUgYXMgdGhpcwotICAgICAqIGJ1ZmZlci4gVGhlIG5ldyBidWZmZXIgaXMgZGlyZWN0LCBpZiB0aGlzIGJ5dGUgYnVmZmVyIGlzIGRpcmVjdC48L3A+CisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzIHRoZSBudW1iZXIKKyAgICAgKiBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSBlaWdodCwgYW5kIGl0cyBtYXJrIGlzIG5vdCBzZXQuIFRoZSBuZXcKKyAgICAgKiBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyJ3MuCisgICAgICogVGhlIG5ldyBidWZmZXIgaXMgZGlyZWN0IGlmIHRoaXMgYnl0ZSBidWZmZXIgaXMgZGlyZWN0LgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucwotICAgICAqIGVpdGhlciBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLgotICAgICAqIFRoZSB0d28gYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgbG9uZyBidWZmZXIgd2hpY2ggaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YKLSAgICAgKiB0aGlzIGJ5dGUgYnVmZmVyLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLiBUaGUgdHdvIGJ1ZmZlcidzCisgICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIGxvbmcgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IExvbmdCdWZmZXIgYXNMb25nQnVmZmVyKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmVhZG9ubHkgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5ldyBpbnN0YW5jZSwgZXZlbiB0aGlzCi0gICAgICogYnVmZmVyIGlzIHJlYWRvbmx5IGl0c2VsZi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5Ci0gICAgICogYW5kIG1hcmsgYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyLjwvcD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBuZXcgaW5zdGFuY2UsIGV2ZW4gaWYgdGhpcworICAgICAqIGJ1ZmZlciBpcyByZWFkLW9ubHkgaXRzZWxmLiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkKKyAgICAgKiBhbmQgbWFyayBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zCi0gICAgICogdGhpcyBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG5ldyBidWZmZXIuCi0gICAgICogVGhlIHR3byBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSByZWFkb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyB0aGlzCisgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBuZXcgYnVmZmVyLiBUaGUgdHdvCisgICAgICogYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIHJlYWQtb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzaG9ydCBidWZmZXIgd2hpY2ggaXMgYmFzZWQgb24gdGhlIHJlbWFpbmluZyBjb250ZW50IG9mCi0gICAgICogdGhpcyBieXRlIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgc2hvcnQgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY29udGVudCBvZiB0aGlzCisgICAgICogYnl0ZSBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzCi0gICAgICogdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSB0d28sIGFuZCBpdHMgbWFyayBpcyBub3Qgc2V0LgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcmVhZG9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHNhbWUgYXMgdGhpcwotICAgICAqIGJ1ZmZlci4gVGhlIG5ldyBidWZmZXIgaXMgZGlyZWN0LCBpZiB0aGlzIGJ5dGUgYnVmZmVyIGlzIGRpcmVjdC48L3A+CisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiBpcyB6ZXJvLCBpdHMgbGltaXQgYW5kIGNhcGFjaXR5IGlzIHRoZSBudW1iZXIKKyAgICAgKiBvZiByZW1haW5pbmcgYnl0ZXMgZGl2aWRlZCBieSB0d28sIGFuZCBpdHMgbWFyayBpcyBub3Qgc2V0LiBUaGUgbmV3CisgICAgICogYnVmZmVyJ3MgcmVhZC1vbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIGlzIGRpcmVjdCBpZiB0aGlzIGJ5dGUgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMKLSAgICAgKiBlaXRoZXIgYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4KLSAgICAgKiBUaGUgdHdvIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIHNob3J0IGJ1ZmZlciB3aGljaCBpcyBiYXNlZCBvbiB0aGUgY29udGVudCBvZgotICAgICAqIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgorICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuIFRoZSB0d28gYnVmZmVyJ3MKKyAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2hvcnQgYnVmZmVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNob3J0QnVmZmVyIGFzU2hvcnRCdWZmZXIoKTsKIAogICAgIC8qKgogICAgICAqIENvbXBhY3RzIHRoaXMgYnl0ZSBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHJlbWFpbmluZyA8Y29kZT5ieXRlPC9jb2RlPnMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUKLSAgICAgKiBidWZmZXIsIHN0YXJpbmcgZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8KLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT47IHRoZSBsaW1pdCBpcyBzZXQgdG8gY2FwYWNpdHk7IHRoZSBtYXJrIGlzCisgICAgICogVGhlIHJlbWFpbmluZyBieXRlcyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZQorICAgICAqIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8KKyAgICAgKiB7QGNvZGUgcmVtYWluaW5nKCl9OyB0aGUgbGltaXQgaXMgc2V0IHRvIGNhcGFjaXR5OyB0aGUgbWFyayBpcwogICAgICAqIGNsZWFyZWQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgY29tcGFjdCgpOwogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZSB0aGUgcmVtYWluaW5nIDxjb2RlPmJ5dGU8L2NvZGU+cyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyCi0gICAgICogYnl0ZSBidWZmZXIncyByZW1haW5pbmcgPGNvZGU+Ynl0ZTwvY29kZT5zLgotICAgICAqCisgICAgICogQ29tcGFyZXMgdGhlIHJlbWFpbmluZyBieXRlcyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyIGJ5dGUgYnVmZmVyJ3MKKyAgICAgKiByZW1haW5pbmcgYnl0ZXMuCisgICAgICogCiAgICAgICogQHBhcmFtIG90aGVyQnVmZmVyCi0gICAgICogICAgICAgICAgICBBbm90aGVyIGJ5dGUgYnVmZmVyCi0gICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIDxjb2RlPm90aGVyPC9jb2RlPjsgMCBpZgotICAgICAqICAgICAgICAgdGhpcyBlcXVhbHMgdG8gPGNvZGU+b3RoZXI8L2NvZGU+OyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoaXMgaXMKLSAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5vdGhlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgYnl0ZSBidWZmZXIuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIHtAY29kZSBvdGhlcn07IDAgaWYgdGhpcworICAgICAqICAgICAgICAgZXF1YWxzIHRvIHtAY29kZSBvdGhlcn07IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhpcyBpcyBncmVhdGVyCisgICAgICogICAgICAgICB0aGFuIHtAY29kZSBvdGhlcn0uCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5vdGhlcjwvY29kZT4gaXMgbm90IGEgYnl0ZSBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgb3RoZXJ9IGlzIG5vdCBhIGJ5dGUgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEJ5dGVCdWZmZXIgb3RoZXJCdWZmZXIpIHsKICAgICAgICAgaW50IGNvbXBhcmVSZW1haW5pbmcgPSAocmVtYWluaW5nKCkgPCBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKSkgPyByZW1haW5pbmcoKQpAQCAtMzQ5LDMxICszNzgsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIHRoZQotICAgICAqIHNhbWUgYXMgdGhpcyBidWZmZXIuIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHJlYWRvbmx5IHByb3BlcnR5IGFuZAotICAgICAqIGJ5dGUgb3JkZXIgYXJlIHNhbWUgYXMgdGhpcyBidWZmZXIgdG9vLjwvcD4KKyAgICAgKiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGFyZSB0aGUgc2FtZQorICAgICAqIGFzIHRoaXMgYnVmZmVyJ3MuIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZQorICAgICAqIG9yZGVyIGFyZSB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlcidzIHRvby4KKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMKLSAgICAgKiBlaXRoZXIgYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4KLSAgICAgKiBUaGUgdHdvIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCisgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncworICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGR1cGxpY2F0ZSgpOwogCiAgICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGlzIGJ5dGUgYnVmZmVyIGVxdWFscyB0byBhbm90aGVyIG9iamVjdC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGJ5dGUgYnVmZmVyIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0LgogICAgICAqIDxwPgotICAgICAqIElmIDxjb2RlPm90aGVyPC9jb2RlPiBpcyBub3QgYSBieXRlIGJ1ZmZlciwgdGhlbiBmYWxzZSBpcyByZXR1cm5lZC48L3A+Ci0gICAgICogPHA+Ci0gICAgICogVHdvIGJ5dGUgYnVmZmVycyBhcmUgZXF1YWxzIGlmLCBhbmQgb25seSBpZiwgdGhlaXIgcmVtYWluaW5nCi0gICAgICogPGNvZGU+Ynl0ZTwvY29kZT5zIGFyZSBleGFjdGx5IHRoZSBzYW1lLiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZAotICAgICAqIG1hcmsgYXJlIG5vdCBjb25zaWRlcmVkLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdGhlciB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdAotICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGJ5dGUgYnVmZmVyIGVxdWFscyB0byBhbm90aGVyIG9iamVjdC4KKyAgICAgKiBJZiB7QGNvZGUgb3RoZXJ9IGlzIG5vdCBhIGJ5dGUgYnVmZmVyIHRoZW4ge0Bjb2RlIGZhbHNlfSBpcyByZXR1cm5lZC4gVHdvCisgICAgICogYnl0ZSBidWZmZXJzIGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGVpciByZW1haW5pbmcgYnl0ZXMgYXJlIGV4YWN0bHkKKyAgICAgKiB0aGUgc2FtZS4gUG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBhcmUgbm90IGNvbnNpZGVyZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBieXRlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGJ5dGUgYnVmZmVyIGlzIGVxdWFsIHRvIHtAY29kZSBvdGhlcn0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CiAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgQnl0ZUJ1ZmZlcikpIHsKQEAgLTM5Niw1NCArNDMwLDUzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnl0ZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uIGJ5IDEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBieXRlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIFJldHVybnMgdGhlIGJ5dGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgMS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGUgZ2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA8Y29kZT5ieXRlPC9jb2RlPnMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBieXRlIGFycmF5IGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5ieXRlPC9jb2RlPnMKLSAgICAgKiByZWFkLgorICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXkgYW5kCisgICAgICogaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+Z2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIGdldChkZXN0LCAwLCBkZXN0Lmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBkZXN0Ci0gICAgICogICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gYnl0ZSBhcnJheQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBieXRlIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiA8Y29kZT5kZXN0Lmxlbmd0aDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGRlc3QubGVuZ3RofSBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIHJlbWFpbmluZygpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoYnl0ZVtdIGRlc3QpIHsKICAgICAgICAgcmV0dXJuIGdldChkZXN0LCAwLCBkZXN0Lmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgPGNvZGU+Ynl0ZTwvY29kZT5zIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkCi0gICAgICogYnl0ZSBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwgYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbgotICAgICAqIGJ5IHRoZSBudW1iZXIgb2YgPGNvZGU+Ynl0ZTwvY29kZT5zIHJlYWQuCi0gICAgICoKKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5LAorICAgICAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUKKyAgICAgKiBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZGVzdAotICAgICAqICAgICAgICAgICAgVGhlIHRhcmdldCBieXRlIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGJ5dGUgYXJyYXkuCiAgICAgICogQHBhcmFtIG9mZgotICAgICAqICAgICAgICAgICAgVGhlIG9mZnNldCBvZiB0aGUgYnl0ZSBhcnJheSwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8KLSAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5kZXN0Lmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGJ5dGUgYXJyYXksIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZAorICAgICAqICAgICAgICAgICAgbm90IGdyZWF0ZXIgdGhhbiB7QGNvZGUgZGVzdC5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgPGNvZGU+Ynl0ZTwvY29kZT5zIHRvIHJlYWQsIG11c3QgYmUgbm8gbGVzcwotICAgICAqICAgICAgICAgICAgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4gPGNvZGU+ZGVzdC5sZW5ndGggLSBvZmY8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90CisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIGRlc3QubGVuZ3RoIC0gb2ZmfQorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgZWl0aGVyIDxjb2RlPm9mZjwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIG9mZn0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPmxlbjwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGxlbn0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSByZW1haW5pbmcoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KGJ5dGVbXSBkZXN0LCBpbnQgb2ZmLCBpbnQgbGVuKSB7CiAgICAgICAgIGludCBsZW5ndGggPSBkZXN0Lmxlbmd0aDsKQEAgLTQ2MSwyMTQgKzQ5NCwyMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBhbmQgdGhlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICAgICBUaGUgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBsaW1pdAotICAgICAqIEByZXR1cm4gQSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIElmIGluZGV4IGlzIGludmFsaWQKKyAgICAgKiBSZXR1cm5zIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kIGRvZXMgbm90IGNoYW5nZSB0aGUgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gbGltaXQuCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGluZGV4IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGUgZ2V0KGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgMi4KKyAgICAgKiBSZXR1cm5zIHRoZSBjaGFyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IDIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIDIgYnl0ZXMgc3RhcnQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBhcmUgY29tcG9zZWQgaW50byBhIGNoYXIKLSAgICAgKiBhY2NvcmRpbmcgdG8gY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4gVGhlIHBvc2l0aW9uIGluY3JlYXNlcyBieQotICAgICAqIDIuCisgICAgICogVGhlIDIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYXJlIGNvbXBvc2VkIGludG8gYSBjaGFyCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIgYW5kIHJldHVybmVkLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNoYXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2hhciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+bGltaXQgLSAyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIGxpbWl0IC0gMn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGNoYXIgZ2V0Q2hhcigpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2hhciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIDxwPgotICAgICAqIFRoZSAyIGJ5dGVzIHN0YXJ0IGZyb20gdGhlIHNwZWNpZmllZCBpbmRleCBhcmUgY29tcG9zZWQgaW50byBhIGNoYXIKLSAgICAgKiBhY2NvcmRpbmcgdG8gY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4gVGhlIHBvc2l0aW9uIGlzIG5vdAorICAgICAqIFRoZSAyIGJ5dGVzIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBpbmRleCBhcmUgY29tcG9zZWQgaW50byBhIGNoYXIKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuIFRoZSBwb3NpdGlvbiBpcyBub3QKICAgICAgKiBjaGFuZ2VkLgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmxpbWl0IC0gMjwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoZSBjaGFyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDJ9LgorICAgICAqIEByZXR1cm4gdGhlIGNoYXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleH0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgY2hhciBnZXRDaGFyKGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieQorICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieQogICAgICAqIDguCiAgICAgICogPHA+Ci0gICAgICogVGhlIDggYnl0ZXMgc3RhcnQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBhcmUgY29tcG9zZWQgaW50byBhIGRvdWJsZQotICAgICAqIGFjY29yZGluZyB0byBjdXJyZW50IGJ5dGUgb3JkZXIgYW5kIHJldHVybmVkLiBUaGUgcG9zaXRpb24gaW5jcmVhc2VzIGJ5Ci0gICAgICogOC4KKyAgICAgKiBUaGUgOCBieXRlcyBzdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFyZSBjb21wb3NlZCBpbnRvIGEgZG91YmxlCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIgYW5kIHJldHVybmVkLiAKICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkb3VibGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZG91YmxlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5saW1pdCAtIDg8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgbGltaXQgLSA4fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldERvdWJsZSgpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZG91YmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogPHA+Ci0gICAgICogVGhlIDggYnl0ZXMgc3RhcnQgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZSBjb21wb3NlZCBpbnRvIGEgZG91YmxlCi0gICAgICogYWNjb3JkaW5nIHRvIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuIFRoZSBwb3NpdGlvbiBpcyBub3QKKyAgICAgKiBUaGUgOCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZSBjb21wb3NlZCBpbnRvIGEgZG91YmxlCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIgYW5kIHJldHVybmVkLiBUaGUgcG9zaXRpb24gaXMgbm90CiAgICAgICogY2hhbmdlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5saW1pdCAtIDg8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGUgZG91YmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDh9LgorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0RG91YmxlKGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uIGJ5IDQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDQgYnl0ZXMgc3RhcnQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBhcmUgY29tcG9zZWQgaW50byBhIGZsb2F0Ci0gICAgICogYWNjb3JkaW5nIHRvIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuIFRoZSBwb3NpdGlvbiBpbmNyZWFzZXMgYnkKKyAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieQogICAgICAqIDQuCisgICAgICogPHA+CisgICAgICogVGhlIDQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYXJlIGNvbXBvc2VkIGludG8gYSBmbG9hdAorICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBmbG9hdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+bGltaXQgLSA0PC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIGxpbWl0IC0gNH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEZsb2F0KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIDxwPgotICAgICAqIFRoZSA0IGJ5dGVzIHN0YXJ0IGZyb20gdGhlIHNwZWNpZmllZCBpbmRleCBhcmUgY29tcG9zZWQgaW50byBhIGZsb2F0Ci0gICAgICogYWNjb3JkaW5nIHRvIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuIFRoZSBwb3NpdGlvbiBpcyBub3QKKyAgICAgKiBUaGUgNCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZSBjb21wb3NlZCBpbnRvIGEgZmxvYXQKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuIFRoZSBwb3NpdGlvbiBpcyBub3QKICAgICAgKiBjaGFuZ2VkLgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmxpbWl0IC0gNDwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoZSBmbG9hdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgbGltaXQgLSA0fS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRGbG9hdChpbnQgaW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgNC4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgNC4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgNCBieXRlcyBzdGFydCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFyZSBjb21wb3NlZCBpbnRvIGEgaW50Ci0gICAgICogYWNjb3JkaW5nIHRvIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuCi0gICAgICogVGhlIHBvc2l0aW9uIGluY3JlYXNlcyBieSA0LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGludCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBJZiB0aGUgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIDxjb2RlPmxpbWl0IC0gNDwvY29kZT4KKyAgICAgKiBUaGUgNCBieXRlcyBzdGFydGluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhcmUgY29tcG9zZWQgaW50byBhIGludAorICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaW50IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgbGltaXQgLSA0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEludCgpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogPHA+Ci0gICAgICogVGhlIDQgYnl0ZXMgc3RhcnQgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZSBjb21wb3NlZCBpbnRvIGEgaW50Ci0gICAgICogYWNjb3JkaW5nIHRvIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuIFRoZSBwb3NpdGlvbiBpcyBub3QKKyAgICAgKiBUaGUgNCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZSBjb21wb3NlZCBpbnRvIGEgaW50CisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIgYW5kIHJldHVybmVkLiBUaGUgcG9zaXRpb24gaXMgbm90CiAgICAgICogY2hhbmdlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5saW1pdCAtIDQ8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGUgaW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDR9LgorICAgICAqIEByZXR1cm4gdGhlIGludCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb25nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgOC4KKyAgICAgKiBSZXR1cm5zIHRoZSBsb25nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IDguCiAgICAgICogPHA+Ci0gICAgICogVGhlIDggYnl0ZXMgc3RhcnQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBhcmUgY29tcG9zZWQgaW50byBhIGxvbmcKLSAgICAgKiBhY2NvcmRpbmcgdG8gY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4gVGhlIHBvc2l0aW9uIGluY3JlYXNlcyBieQotICAgICAqIDguCisgICAgICogVGhlIDggYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYXJlIGNvbXBvc2VkIGludG8gYSBsb25nCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIgYW5kIHJldHVybmVkLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxvbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbG9uZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+bGltaXQgLSA4PC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIGxpbWl0IC0gOH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbG9uZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIDxwPgotICAgICAqIFRoZSA4IGJ5dGVzIHN0YXJ0IGZyb20gdGhlIHNwZWNpZmllZCBpbmRleCBhcmUgY29tcG9zZWQgaW50byBhIGxvbmcKLSAgICAgKiBhY2NvcmRpbmcgdG8gY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4gVGhlIHBvc2l0aW9uIGlzIG5vdAorICAgICAqIFRoZSA4IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYXJlIGNvbXBvc2VkIGludG8gYSBsb25nCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIgYW5kIHJldHVybmVkLiBUaGUgcG9zaXRpb24gaXMgbm90CiAgICAgICogY2hhbmdlZC4KICAgICAgKiA8L3A+CiAgICAgICoKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5saW1pdCAtIDg8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGUgbG9uZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgbGltaXQgLSA4fS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZyhpbnQgaW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hvcnQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSAyLgorICAgICAqIFJldHVybnMgdGhlIHNob3J0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IDIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIDIgYnl0ZXMgc3RhcnQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBhcmUgY29tcG9zZWQgaW50byBhIHNob3J0Ci0gICAgICogYWNjb3JkaW5nIHRvIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuCi0gICAgICogVGhlIHBvc2l0aW9uIGluY3JlYXNlcyBieSAyLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNob3J0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIElmIHRoZSBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+bGltaXQgLSAyPC9jb2RlPgorICAgICAqIFRoZSAyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFyZSBjb21wb3NlZCBpbnRvIGEgc2hvcnQKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYnl0ZSBvcmRlciBhbmQgcmV0dXJuZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNob3J0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgbGltaXQgLSAyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0U2hvcnQoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNob3J0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogPHA+Ci0gICAgICogVGhlIDIgYnl0ZXMgc3RhcnQgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZSBjb21wb3NlZCBpbnRvIGEgc2hvcnQKLSAgICAgKiBhY2NvcmRpbmcgdG8gY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4gVGhlIHBvc2l0aW9uIGlzIG5vdAorICAgICAqIFRoZSAyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYXJlIGNvbXBvc2VkIGludG8gYSBzaG9ydAorICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBieXRlIG9yZGVyIGFuZCByZXR1cm5lZC4gVGhlIHBvc2l0aW9uIGlzIG5vdAogICAgICAqIGNoYW5nZWQuCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+bGltaXQgLSAyPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhlIHNob3J0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDJ9LgorICAgICAqIEByZXR1cm4gdGhlIHNob3J0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBieXRlIGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgYnVmZmVyIGlzIHJlYWRvbmx5LCB0aGVuIGZhbHNlIGlzIHJldHVybmVkLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhIGJ5dGUgYXJyYXkgYW5kIGlzIHJlYWQvd3JpdGUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBieXRlIGFycmF5IGFuZCBwcm92aWRlcworICAgICAqIHJlYWQvd3JpdGUgYWNjZXNzLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgYnl0ZSBhcnJheSBhbmQgcHJvdmlkZXMKKyAgICAgKiAgICAgICAgIHJlYWQvd3JpdGUgYWNjZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBcnJheSgpIHsKICAgICAgICAgcmV0dXJuIHByb3RlY3RlZEhhc0FycmF5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGFzaCBjb2RlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIDxjb2RlPmJ5dGU8L2NvZGU+cy4KLSAgICAgKiA8cD4KLSAgICAgKiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGRvbid0IGFmZmVjdCB0aGUgaGFzaCBjb2RlLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGhhc2ggY29kZSBjYWxjdWxhdGVkIGZyb20gdGhlIHJlbWFpbmluZyA8Y29kZT5ieXRlPC9jb2RlPnMuCisgICAgICogQ2FsY3VsYXRlcyB0aGlzIGJ1ZmZlcidzIGhhc2ggY29kZSBmcm9tIHRoZSByZW1haW5pbmcgY2hhcnMuIFRoZQorICAgICAqIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgZG9uJ3QgYWZmZWN0IHRoZSBoYXNoIGNvZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBteVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC02ODAsMjQgKzcyOCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QuCi0gICAgICogPHA+Ci0gICAgICogQSBieXRlIGJ1ZmZlciBpcyBkaXJlY3QsIGlmIGl0IGlzIGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIgYW5kIHRoZSBieXRlCi0gICAgICogYnVmZmVyIGlzIGRpcmVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBidWZmZXIgaXMgZGlyZWN0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlyZWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nCi0gICAgICogPGNvZGU+Ynl0ZTwvY29kZT5zIGZyb20vdG8gb3RoZXIgcHJpbWl0aXZlIHR5cGVzLgorICAgICAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcgYnl0ZXMgZnJvbS90bworICAgICAqIG90aGVyIHByaW1pdGl2ZSB0eXBlcy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBieXRlIG9yZGVyIG9mIGJ5dGUgYnVmZmVyIGlzIGFsd2F5cyBCSUdfRU5ESUFOLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcKLSAgICAgKiA8Y29kZT5ieXRlPC9jb2RlPnMgZnJvbS90byBvdGhlciBwcmltaXRpdmUgdHlwZXMuCisgICAgICogVGhlIGRlZmF1bHQgYnl0ZSBvcmRlciBvZiBieXRlIGJ1ZmZlciBpcyBhbHdheXMKKyAgICAgKiB7QGxpbmsgQnl0ZU9yZGVyI0JJR19FTkRJQU4gQklHX0VORElBTn0KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBvcmRlciB1c2VkIGJ5IHRoaXMgYnVmZmVyIHdoZW4gY29udmVydGluZyBieXRlcyBmcm9tL3RvCisgICAgICogICAgICAgICBvdGhlciBwcmltaXRpdmUgdHlwZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEJ5dGVPcmRlciBvcmRlcigpIHsKICAgICAgICAgcmV0dXJuIG9yZGVyID09IEVuZGlhbm5lc3MuQklHX0VORElBTiA/IEJ5dGVPcmRlci5CSUdfRU5ESUFOCkBAIC03MDYsMTIgKzc1NCwxMyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgYnl0ZSBvcmRlciBvZiB0aGlzIGJ1ZmZlci4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBieXRlT3JkZXIKLSAgICAgKiAgICAgICAgICAgIFRoZSBieXRlIG9yZGVyIHRvIHNldC4gSWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGUgb3JkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIG9yZGVyIHRvIHNldC4gSWYge0Bjb2RlIG51bGx9IHRoZW4gdGhlIG9yZGVyCiAgICAgICogICAgICAgICAgICB3aWxsIGJlIHtAbGluayBCeXRlT3JkZXIjTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOfS4KLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAc2VlIEJ5dGVPcmRlcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBCeXRlQnVmZmVyIG9yZGVyKEJ5dGVPcmRlciBieXRlT3JkZXIpIHsKICAgICAgICAgcmV0dXJuIG9yZGVySW1wbChieXRlT3JkZXIpOwpAQCAtNzI0LDg0ICs3NzMsODYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXkoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNlZSA8Y29kZT5hcnJheSgpPC9jb2RlPgorICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSB7QGNvZGUgYXJyYXkoKX0uCisgICAgICogCisgICAgICogQHNlZSAjYXJyYXkoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGFic3RyYWN0IGJ5dGVbXSBwcm90ZWN0ZWRBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIDxjb2RlPmFycmF5T2Zmc2V0KCk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiBzZWUgPGNvZGU+YXJyYXlPZmZzZXQoKTwvY29kZT4KKyAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUge0Bjb2RlIGFycmF5T2Zmc2V0KCl9LgorICAgICAqIAorICAgICAqIEBzZWUgI2FycmF5T2Zmc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBhYnN0cmFjdCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKTsKIAogICAgIC8qKgotICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSA8Y29kZT5oYXNBcnJheSgpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmhhc0FycmF5KCk8L2NvZGU+CisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBoYXNBcnJheSgpfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNoYXNBcnJheSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYWJzdHJhY3QgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBieXRlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24KKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGJ5dGUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24KICAgICAgKiBieSAxLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGIKLSAgICAgKiAgICAgICAgICAgIFRoZSBieXRlIHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgaWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHB1dChieXRlIGIpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmJ5dGU8L2NvZGU+cyBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSB0byB0aGUgY3VycmVudAotICAgICAqIHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5ieXRlPC9jb2RlPnMKLSAgICAgKiB3cml0dGVuLgorICAgICAqIFdyaXRlcyBieXRlcyBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQKKyAgICAgKiBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT5wdXQoc3JjLCAwLCBzcmMubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIHB1dChzcmMsIDAsIHNyYy5sZW5ndGgpfS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICBUaGUgc291cmNlIGJ5dGUgYXJyYXkKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGJ5dGUgYXJyYXkuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+IGlzIGxlc3MgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPnNyYy5sZW5ndGg8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHJlbWFpbmluZygpfSBpcyBsZXNzIHRoYW4ge0Bjb2RlIHNyYy5sZW5ndGh9LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBCeXRlQnVmZmVyIHB1dChieXRlW10gc3JjKSB7CiAgICAgICAgIHJldHVybiBwdXQoc3JjLCAwLCBzcmMubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+Ynl0ZTwvY29kZT5zIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LCBzdGFydGluZyBmcm9tIHRoZQotICAgICAqIHNwZWNpZmllZCBvZmZzZXQsIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkKLSAgICAgKiB0aGUgbnVtYmVyIG9mIDxjb2RlPmJ5dGU8L2NvZGU+cyB3cml0dGVuLgotICAgICAqCisgICAgICogV3JpdGVzIGJ5dGVzIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LCBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LAorICAgICAqIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgKiB3cml0dGVuLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgYnl0ZSBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBieXRlIGFycmF5LgogICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgYnl0ZSBhcnJheSwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8KLSAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5zcmMubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiBieXRlIGFycmF5LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoYW4ge0Bjb2RlIHNyYy5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgPGNvZGU+Ynl0ZTwvY29kZT5zIHRvIHdyaXRlLCBtdXN0IGJlIG5vIGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPnNyYy5sZW5ndGggLSBvZmY8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdAorICAgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBzcmMubGVuZ3RoIC0gb2ZmfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+bGVuPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSByZW1haW5pbmcoKX0gaXMgbGVzcyB0aGFuIHtAY29kZSBsZW59LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5vZmY8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBvZmZ9IG9yIHtAY29kZSBsZW59IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgcHV0KGJ5dGVbXSBzcmMsIGludCBvZmYsIGludCBsZW4pIHsKICAgICAgICAgaW50IGxlbmd0aCA9IHNyYy5sZW5ndGg7CkBAIC04MTksMjAgKzg3MCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhbGwgdGhlIHJlbWFpbmluZyA8Y29kZT5ieXRlPC9jb2RlPnMgb2YgdGhlIDxjb2RlPnNyYzwvY29kZT4KLSAgICAgKiBieXRlIGJ1ZmZlciB0byB0aGlzIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24sIGFuZCBpbmNyZWFzZSBib3RoIGJ1ZmZlcnMnCi0gICAgICogcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5ieXRlPC9jb2RlPnMgY29waWVkLgotICAgICAqCisgICAgICogV3JpdGVzIGFsbCB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSB7QGNvZGUgc3JjfSBieXRlIGJ1ZmZlciB0byB0aGlzCisgICAgICogYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbiwgYW5kIGluY3JlYXNlcyBib3RoIGJ1ZmZlcnMnIHBvc2l0aW9uIGJ5IHRoZQorICAgICAqIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCisgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgVGhlIHNvdXJjZSBieXRlIGJ1ZmZlcgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgYnl0ZSBidWZmZXIuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+c3JjLnJlbWFpbmluZygpPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gdGhpcwotICAgICAqICAgICAgICAgICAgICAgIGJ1ZmZlcidzIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzcmMucmVtYWluaW5nKCl9IGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGJ1ZmZlcidzCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIHJlbWFpbmluZygpfS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnNyYzwvY29kZT4gaXMgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3JjfSBpcyB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBwdXQoQnl0ZUJ1ZmZlciBzcmMpIHsKICAgICAgICAgaWYgKHNyYyA9PSB0aGlzKSB7CkBAIC04NDgsMjY0ICs5MDAsMjgxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBieXRlIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIgYW5kIHRoZSBwb3NpdGlvbiBpcwotICAgICAqIG5vdCBjaGFuZ2VkLgotICAgICAqCisgICAgICogV3JpdGUgYSBieXRlIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUKKyAgICAgKiBwb3NpdGlvbi4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIHRoZSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIHRoZSBsaW1pdC4KICAgICAgKiBAcGFyYW0gYgotICAgICAqICAgICAgICAgICAgVGhlIGJ5dGUgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGluZGV4fSBpcyBpbnZhbGlkLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHB1dChpbnQgaW5kZXgsIGJ5dGUgYik7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGNoYXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbgorICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gY2hhciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbgogICAgICAqIGJ5IDIuCiAgICAgICogPHA+CiAgICAgICogVGhlIGNoYXIgaXMgY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIuCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgY2hhciB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5saW1pdCAtIDI8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBsaW1pdCAtIDJ9LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHB1dENoYXIoY2hhciB2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhIGNoYXIgdG8gdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGNoYXIgdG8gdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgY2hhciBpcyBjb252ZXJ0ZWQgdG8gYnl0ZXMgdXNpbmcgdGhlIGN1cnJlbnQgYnl0ZSBvcmRlci4gVGhlIHBvc2l0aW9uCiAgICAgICogaXMgbm90IGNoYW5nZWQuCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+bGltaXQgLSAyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgbGltaXQgLSAyfS4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyIHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleH0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBwdXRDaGFyKGludCBpbmRleCwgY2hhciB2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRvdWJsZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBkb3VibGUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24KICAgICAgKiBieSA4LgogICAgICAqIDxwPgogICAgICAqIFRoZSBkb3VibGUgaXMgY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIuCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgZG91YmxlIHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+bGltaXQgLSA4PC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgbGltaXQgLSA4fS4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBwdXREb3VibGUoZG91YmxlIHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIuCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBkb3VibGUgdG8gdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgZG91YmxlIGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyB0aGUgY3VycmVudCBieXRlIG9yZGVyLiBUaGUKICAgICAgKiBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5saW1pdCAtIDg8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDh9LgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIGRvdWJsZSB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleH0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBwdXREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBmbG9hdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBmbG9hdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbgogICAgICAqIGJ5IDQuCiAgICAgICogPHA+CiAgICAgICogVGhlIGZsb2F0IGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyB0aGUgY3VycmVudCBieXRlIG9yZGVyLgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIGZsb2F0IHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5saW1pdCAtIDQ8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBsaW1pdCAtIDR9LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHB1dEZsb2F0KGZsb2F0IHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgZmxvYXQgdG8gdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGZsb2F0IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIuCiAgICAgICogPHA+CiAgICAgICogVGhlIGZsb2F0IGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyB0aGUgY3VycmVudCBieXRlIG9yZGVyLiBUaGUKICAgICAgKiBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5saW1pdCAtIDQ8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDR9LgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIGZsb2F0IHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgcHV0RmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGludCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uIGJ5CisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBpbnQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkKICAgICAgKiA0LgogICAgICAqIDxwPgogICAgICAqIFRoZSBpbnQgaXMgY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIuCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgaW50IHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGludCB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+bGltaXQgLSA0PC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgbGltaXQgLSA0fS4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBwdXRJbnQoaW50IHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgaW50IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIuCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBpbnQgdG8gdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgaW50IGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyB0aGUgY3VycmVudCBieXRlIG9yZGVyLiBUaGUgcG9zaXRpb24KICAgICAgKiBpcyBub3QgY2hhbmdlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5saW1pdCAtIDQ8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDR9LgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIGludCB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBpbmRleH0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBwdXRJbnQoaW50IGluZGV4LCBpbnQgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBsb25nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24KKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGxvbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24KICAgICAgKiBieSA4LgogICAgICAqIDxwPgogICAgICAqIFRoZSBsb25nIGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyB0aGUgY3VycmVudCBieXRlIG9yZGVyLgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIGxvbmcgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+bGltaXQgLSA4PC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgbGltaXQgLSA4fS4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBwdXRMb25nKGxvbmcgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBsb25nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIuCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBsb25nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIuCiAgICAgICogPHA+CiAgICAgICogVGhlIGxvbmcgaXMgY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHRoZSBjdXJyZW50IGJ5dGUgb3JkZXIuIFRoZSBwb3NpdGlvbgogICAgICAqIGlzIG5vdCBjaGFuZ2VkLgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmxpbWl0IC0gODwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIGVxdWFsIG9yIGxlc3MgdGhhbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGxpbWl0IC0gOH0uCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgbG9uZyB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgcHV0TG9uZyhpbnQgaW5kZXgsIGxvbmcgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBzaG9ydCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBzaG9ydCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbgogICAgICAqIGJ5IDIuCiAgICAgICogPHA+CiAgICAgICogVGhlIHNob3J0IGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyB0aGUgY3VycmVudCBieXRlIG9yZGVyLgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHNob3J0IHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5saW1pdCAtIDI8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBsaW1pdCAtIDJ9LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHB1dFNob3J0KHNob3J0IHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgc2hvcnQgdG8gdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIHNob3J0IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIuCiAgICAgICogPHA+CiAgICAgICogVGhlIHNob3J0IGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyB0aGUgY3VycmVudCBieXRlIG9yZGVyLiBUaGUKICAgICAgKiBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5saW1pdCAtIDI8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBlcXVhbCBvciBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsaW1pdCAtIDJ9LgogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHNob3J0IHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgaW5kZXh9IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgcHV0U2hvcnQoaW50IGluZGV4LCBzaG9ydCB2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncwotICAgICAqIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiwgYW5kIGl0cyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0bwotICAgICAqIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlCi0gICAgICogMCwgbGltaXQgd2lsbCBiZSBpdHMgY2FwYWNpdHksIGFuZCBpdHMgbWFyayBpcyB1bnNldC4gVGhlIG5ldyBidWZmZXIncwotICAgICAqIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyLjwvcD4KKyAgICAgKiB7QGNvZGUgcmVtYWluaW5nKCl9LCBhbmQgaXQncyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0bworICAgICAqIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIDAsCisgICAgICogbGltaXQgd2lsbCBiZSBpdHMgY2FwYWNpdHksIGFuZCBpdHMgbWFyayBpcyBjbGVhcmVkLiBUaGUgbmV3IGJ1ZmZlcidzCisgICAgICogcmVhZC1vbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucwotICAgICAqIGVpdGhlciBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLgotICAgICAqIFRoZSB0d28gYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgorICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuIFRoZSB0d28gYnVmZmVyJ3MKKyAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHNsaWNlKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoaXMgYnl0ZSBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0J5dGVPcmRlci5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnl0ZU9yZGVyLmphdmEKaW5kZXggNGFlNmE5Ni4uODcwMjE2ZiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnl0ZU9yZGVyLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQnl0ZU9yZGVyLmphdmEKQEAgLTIwLDE4ICsyMCwyMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtOwogCiAvKioKLSAqIEhvbGRzIGJ5dGUgb3JkZXIgY29uc3RhbnRzLgorICogRGVmaW5lcyBieXRlIG9yZGVyIGNvbnN0YW50cy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBCeXRlT3JkZXIgewogCiAgICAgLyoqCiAgICAgICogVGhpcyBjb25zdGFudCByZXByZXNlbnRzIGJpZyBlbmRpYW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlT3JkZXIgQklHX0VORElBTiA9IG5ldyBCeXRlT3JkZXIoIkJJR19FTkRJQU4iKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCiAgICAgICogVGhpcyBjb25zdGFudCByZXByZXNlbnRzIGxpdHRsZSBlbmRpYW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlT3JkZXIgTElUVExFX0VORElBTiA9IG5ldyBCeXRlT3JkZXIoIkxJVFRMRV9FTkRJQU4iKTsgLy8kTk9OLU5MUy0xJAogCkBAIC00OCw4ICs1Myw5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwbGF0Zm9ybSBieXRlIG9yZGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgb3JkZXIgb2JqZWN0LCB3aGljaCBpcyBlaXRoZXIgaWRlbnRpY2FsIHRvIExJVFRMRV9FTkRJQU4KLSAgICAgKiAgICAgICAgIG9yIEJJR19FTkRJQU4uCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBvcmRlciBvYmplY3QsIHdoaWNoIGlzIGVpdGhlciBMSVRUTEVfRU5ESUFOIG9yCisgICAgICogICAgICAgICBCSUdfRU5ESUFOLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnl0ZU9yZGVyIG5hdGl2ZU9yZGVyKCkgewogICAgICAgICByZXR1cm4gTkFUSVZFX09SREVSOwpAQCAtNjIsMTAgKzY4LDEzIEBACiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorICAgICAqIEByZXR1cm4gIkJJR19FTkRJQU4iIGZvciB7QGxpbmsgI0JJR19FTkRJQU4gQnl0ZU9yZGVyLkJJR19FTkRJQU59CisgICAgICogICAgICAgICBvYmplY3RzLCAiTElUVExFX0VORElBTiIgZm9yCisgICAgICogICAgICAgICB7QGxpbmsgI0xJVFRMRV9FTkRJQU4gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU59IG9iamVjdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIG5hbWU7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9DaGFyQnVmZmVyLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9DaGFyQnVmZmVyLmphdmEKaW5kZXggMmMxMmU4ZS4uMjg5OTY1YSAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vQ2hhckJ1ZmZlci5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0NoYXJCdWZmZXIuamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIEEgYnVmZmVyIG9mIDxjb2RlPmNoYXI8L2NvZGU+cy4KKyAqIEEgYnVmZmVyIG9mIGNoYXJzLgogICogPHA+Ci0gKiBBIGNoYXIgYnVmZmVyIGNhbiBiZSBjcmVhdGVkIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiBBIGNoYXIgYnVmZmVyIGNhbiBiZSBjcmVhdGVkIGluIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgorICogPC9wPgogICogPHVsPgogICogPGxpPntAbGluayAjYWxsb2NhdGUoaW50KSBBbGxvY2F0ZX0gYSBuZXcgY2hhciBhcnJheSBhbmQgY3JlYXRlIGEgYnVmZmVyCiAgKiBiYXNlZCBvbiBpdDs8L2xpPgpAQCAtMzMsMjAgKzM0LDIxIEBACiAgKiA8bGk+VXNlIHtAbGluayBqYXZhLm5pby5CeXRlQnVmZmVyI2FzQ2hhckJ1ZmZlcigpIEJ5dGVCdWZmZXIuYXNDaGFyQnVmZmVyfQogICogdG8gY3JlYXRlIGEgY2hhciBidWZmZXIgYmFzZWQgb24gYSBieXRlIGJ1ZmZlci48L2xpPgogICogPC91bD4KLSAqIDwvcD4KLSAqCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhckJ1ZmZlciBleHRlbmRzIEJ1ZmZlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8Q2hhckJ1ZmZlcj4sCiAgICAgICAgIENoYXJTZXF1ZW5jZSwgQXBwZW5kYWJsZSwgUmVhZGFibGUgewogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNoYXIgYnVmZmVyIGJhc2VkIG9uIGEgbmV3IGFsbG9jYXRlZCBjaGFyIGFycmF5LgotICAgICAqCisgICAgICogQ3JlYXRlcyBhIGNoYXIgYnVmZmVyIGJhc2VkIG9uIGEgbmV3bHkgYWxsb2NhdGVkIGNoYXIgYXJyYXkuCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICBUaGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIKLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGNoYXIgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBjaGFyIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIDxjb2RlPmNhcGFjaXR5PC9jb2RlPiBpcyBsZXNzIHRoYW4gemVybworICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjYXBhY2l0eX0gaXMgbGVzcyB0aGFuIHplcm8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDaGFyQnVmZmVyIGFsbG9jYXRlKGludCBjYXBhY2l0eSkgewogICAgICAgICBpZiAoY2FwYWNpdHkgPCAwKSB7CkBAIC01OSwzNiArNjEsMzcgQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IGNoYXIgYnVmZmVyIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBjaGFyIGFycmF5LgogICAgICAqIDxwPgogICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwotICAgICAqIDxjb2RlPndyYXAoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk8L2NvZGU+LgorICAgICAqIHtAY29kZSB3cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpfS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyIGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGNoYXIgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY2hhciBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDaGFyQnVmZmVyIHdyYXAoY2hhcltdIGFycmF5KSB7CiAgICAgICAgIHJldHVybiB3cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgbmV3IGEgY2hhciBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGNoYXIgYXJyYXkuCisgICAgICogQ3JlYXRlcyBhIG5ldyBjaGFyIGJ1ZmZlciBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gY2hhciBhcnJheS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUgPGNvZGU+c3RhcnQ8L2NvZGU+LCBsaW1pdCB3aWxsIGJlCi0gICAgICogPGNvZGU+c3RhcnQgKyBsZW48L2NvZGU+LCBjYXBhY2l0eSB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSB7QGNvZGUgc3RhcnR9LCBsaW1pdCB3aWxsIGJlCisgICAgICoge0Bjb2RlIHN0YXJ0ICsgbGVufSwgY2FwYWNpdHkgd2lsbCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyIGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24uCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgc3RhcnQgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+YXJyYXkubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGFycmF5Lmxlbmd0aH0uCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgVGhlIGxlbmd0aCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5hcnJheS5sZW5ndGggLSBzdGFydDwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGNoYXIgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoLCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGFycmF5Lmxlbmd0aCAtIHN0YXJ0fS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNoYXIgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5zdGFydDwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIHN0YXJ0fSBvciB7QGNvZGUgbGVufSBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2hhckJ1ZmZlciB3cmFwKGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuKSB7CiAgICAgICAgIGludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CkBAIC0xMDgsMTIgKzExMSwxMyBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcgY2hhciBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGNoYXIgc2VxdWVuY2UuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+d3JhcChjaHNlcSwgMCwgY2hzZXEubGVuZ3RoKCkpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgd3JhcChjaHNlcSwgMCwgY2hzZXEubGVuZ3RoKCkpfS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hzZXEKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyIHNlcXVlbmNlIHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGNoYXIgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgY2hhciBzZXF1ZW5jZSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY2hhciBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDaGFyQnVmZmVyIHdyYXAoQ2hhclNlcXVlbmNlIGNoc2VxKSB7CiAgICAgICAgIHJldHVybiBCdWZmZXJGYWN0b3J5Lm5ld0NoYXJCdWZmZXIoY2hzZXEpOwpAQCAtMTIyLDIzICsxMjYsMjMgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IGNoYXIgYnVmZmVyIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBjaGFyIHNlcXVlbmNlLgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSA8Y29kZT5zdGFydDwvY29kZT4sIGxpbWl0IHdpbGwgYmUKLSAgICAgKiA8Y29kZT5lbmQ8L2NvZGU+LCBjYXBhY2l0eSB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlIGNoYXIgc2VxdWVuY2UuCi0gICAgICogVGhlIG5ldyBidWZmZXIgaXMgcmVhZG9ubHkuCisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIHtAY29kZSBzdGFydH0sIGxpbWl0IHdpbGwgYmUKKyAgICAgKiB7QGNvZGUgZW5kfSwgY2FwYWNpdHkgd2lsbCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFyIHNlcXVlbmNlLiBUaGUgbmV3CisgICAgICogYnVmZmVyIGlzIHJlYWQtb25seS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hzZXEKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyIHNlcXVlbmNlIHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIHNlcXVlbmNlIHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24uCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgc3RhcnQgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+Y2hzZXEubGVuZ3RoKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBub3QgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgY2hzZXEubGVuZ3RoKCl9LgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBlbmQgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQKLSAgICAgKiAgICAgICAgICAgIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5jaHNlcS5sZW5ndGgoKTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGNoYXIgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgZW5kIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB7QGNvZGUgc3RhcnR9IGFuZCBubworICAgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBjaHNlcS5sZW5ndGgoKX0uCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBjaGFyIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmVuZDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGVuZH0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJCdWZmZXIgd3JhcChDaGFyU2VxdWVuY2UgY2hzZXEsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBpZiAoY2hzZXEgPT0gbnVsbCkgewpAQCAtMTQ3LDcgKzE1MSw3IEBACiAgICAgICAgIGlmIChzdGFydCA8IDAgfHwgZW5kIDwgc3RhcnQgfHwgZW5kID4gY2hzZXEubGVuZ3RoKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgQ2hhckJ1ZmZlciByZXN1bHQgPSBCdWZmZXJGYWN0b3J5Lm5ld0NoYXJCdWZmZXIoY2hzZXEpOwogICAgICAgICByZXN1bHQucG9zaXRpb24gPSBzdGFydDsKICAgICAgICAgcmVzdWx0LmxpbWl0ID0gZW5kOwpAQCAtMTU1LDEwICsxNTksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+Q2hhckJ1ZmZlcjwvY29kZT4gd2l0aCBnaXZlbiBjYXBhY2l0eS4KLSAgICAgKgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgQ2hhckJ1ZmZlcn0gd2l0aCBnaXZlbiBjYXBhY2l0eS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBDaGFyQnVmZmVyKGludCBjYXBhY2l0eSkgewogICAgICAgICBzdXBlcihjYXBhY2l0eSk7CkBAIC0xNjgsMTMgKzE3MywxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYXIgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24sIGlmIHRoZXJlJ3Mgb25lLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY2hhciBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIFJldHVybnMgdGhlIGNoYXIgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24sIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkLW9ubHkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgY2hhcltdIGFycmF5KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXkoKTsKQEAgLTE4MiwzMSArMTg4LDM0IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXIgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24sIGlmCi0gICAgICogdGhlcmUncyBvbmUuCisgICAgICogdGhlcmUgaXMgb25lLgogICAgICAqIDxwPgogICAgICAqIFRoZSBvZmZzZXQgaXMgdGhlIGluZGV4IG9mIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byB0aGUgemVybyBwb3NpdGlvbiBvZgogICAgICAqIHRoZSBidWZmZXIuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgb2Zmc2V0IG9mIHRoZSBjaGFyIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFyIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXkgYnV0IGl0IGlzIHJlYWQtb25seS4KICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGFuIGFycmF5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGFuIGFycmF5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgYXJyYXlPZmZzZXQoKSB7CiAgICAgICAgIHJldHVybiBwcm90ZWN0ZWRBcnJheU9mZnNldCgpOwogICAgIH0KIAogICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKLSAgICBAT3ZlcnJpZGUgT2JqZWN0IF9hcnJheSgpIHsKKyAgICBAT3ZlcnJpZGUgCisgICAgT2JqZWN0IF9hcnJheSgpIHsKICAgICAgICAgaWYgKGhhc0FycmF5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIEBPdmVycmlkZSBpbnQgX2FycmF5T2Zmc2V0KCkgeworICAgIEBPdmVycmlkZSAKKyAgICBpbnQgX2FycmF5T2Zmc2V0KCkgewogICAgICAgICBpZiAoaGFzQXJyYXkoKSkgewogICAgICAgICAgICAgcmV0dXJuIGFycmF5T2Zmc2V0KCk7CiAgICAgICAgIH0KQEAgLTIxNSwzNCArMjI0LDM2IEBACiAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSByZWFkb25seSBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSByZWFkLW9ubHkgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHJldHVybmVkIGJ1ZmZlciBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbmV3IGluc3RhbmNlLCBldmVuIHRoaXMgYnVmZmVyCi0gICAgICogaXMgcmVhZG9ubHkgaXRzZWxmLiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsKLSAgICAgKiBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIuCisgICAgICogVGhlIHJldHVybmVkIGJ1ZmZlciBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbmV3IGluc3RhbmNlLCBldmVuIGlmIHRoaXMKKyAgICAgKiBidWZmZXIgaXMgcmVhZC1vbmx5IGl0c2VsZi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5CisgICAgICogYW5kIG1hcmsgYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyJ3MuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIHRoaXMgYnVmZmVyJ3MKLSAgICAgKiBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG5ldyBidWZmZXIuIFRoZSB0d28gYnVmZmVyJ3MKLSAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyB0aGlzCisgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBuZXcgYnVmZmVyLiBUaGUgdHdvCisgICAgICogYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgcmVhZG9ubHkgdmVyc2lvbiBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IHZlcnNpb24gb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENoYXJCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGxvY2F0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUgYnVmZmVyLiBUaGUKICAgICAgKiBpbmRleCB2YWx1ZSBpcyByZWZlcmVuY2VkIGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXggcmVmZXJlbmNlZCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4gSXQgbXVzdAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHJlZmVyZW5jZWQgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgcG9zaXRpb24uIEl0IG11c3QKICAgICAgKiAgICAgICAgICAgIG5vdCBiZSBsZXNzIHRoYW4gemVybyBidXQgbGVzcyB0aGFuIHRoZSB2YWx1ZSBvYnRhaW5lZCBmcm9tIGEKLSAgICAgKiAgICAgICAgICAgIGNhbGwgdG8gPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICBjYWxsIHRvIHtAY29kZSByZW1haW5pbmcoKX0uCiAgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGxvY2F0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCAocmVmZXJlbmNlZCBmcm9tIHRoZQogICAgICAqICAgICAgICAgY3VycmVudCBwb3NpdGlvbikgaW4gdGhlIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGUgaW5kZXggaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSByZW1haW5pbmcoKSkgewpAQCAtMjU0LDI5ICsyNjUsMzAgQEAKICAgICAvKioKICAgICAgKiBDb21wYWN0cyB0aGlzIGNoYXIgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSByZW1haW5pbmcgPGNvZGU+Y2hhcjwvY29kZT5zIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlCi0gICAgICogYnVmZmVyLCBzdGFyaW5nIGZyb20gcG9zaXRpb24gemVyby4gVGhlbiB0aGUgcG9zaXRpb24gaXMgc2V0IHRvCi0gICAgICogPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+OyB0aGUgbGltaXQgaXMgc2V0IHRvIGNhcGFjaXR5OyB0aGUgbWFyayBpcwotICAgICAqIGNsZWFyZWQuCisgICAgICogVGhlIHJlbWFpbmluZyBjaGFycyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBidWZmZXIsCisgICAgICogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8KKyAgICAgKiB7QGNvZGUgcmVtYWluaW5nKCl9OyB0aGUgbGltaXQgaXMgc2V0IHRvIGNhcGFjaXR5OyB0aGUgbWFyayBpcyBjbGVhcmVkLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyQnVmZmVyIGNvbXBhY3QoKTsKIAogICAgIC8qKgotICAgICAqIENvbXBhcmUgdGhlIHJlbWFpbmluZyA8Y29kZT5jaGFyPC9jb2RlPnMgb2YgdGhpcyBidWZmZXIgdG8gYW5vdGhlcgotICAgICAqIGNoYXIgYnVmZmVyJ3MgcmVtYWluaW5nIDxjb2RlPmNoYXI8L2NvZGU+cy4KLSAgICAgKgorICAgICAqIENvbXBhcmUgdGhlIHJlbWFpbmluZyBjaGFycyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyIGNoYXIKKyAgICAgKiBidWZmZXIncyByZW1haW5pbmcgY2hhcnMuCisgICAgICogCiAgICAgICogQHBhcmFtIG90aGVyQnVmZmVyCi0gICAgICogICAgICAgICAgICBBbm90aGVyIGNoYXIgYnVmZmVyCi0gICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIDxjb2RlPm90aGVyPC9jb2RlPjsgMCBpZgotICAgICAqICAgICAgICAgdGhpcyBlcXVhbHMgdG8gPGNvZGU+b3RoZXI8L2NvZGU+OyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoaXMgaXMKLSAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5vdGhlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgY2hhciBidWZmZXIuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIHtAY29kZSBvdGhlckJ1ZmZlcn07IDAgaWYKKyAgICAgKiAgICAgICAgIHRoaXMgZXF1YWxzIHRvIHtAY29kZSBvdGhlckJ1ZmZlcn07IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhpcyBpcworICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBvdGhlckJ1ZmZlcn0uCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5vdGhlcjwvY29kZT4gaXMgbm90IGEgY2hhciBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgb3RoZXJCdWZmZXJ9IGlzIG5vdCBhIGNoYXIgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENoYXJCdWZmZXIgb3RoZXJCdWZmZXIpIHsKICAgICAgICAgaW50IGNvbXBhcmVSZW1haW5pbmcgPSAocmVtYWluaW5nKCkgPCBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKSkgPyByZW1haW5pbmcoKQpAQCAtMjk4LDM2ICszMTAsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIHRoZSBzYW1lCi0gICAgICogYXMgdGhpcyBidWZmZXIuIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyCi0gICAgICogYXJlIHNhbWUgYXMgdGhpcyBidWZmZXIgdG9vLgorICAgICAqIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIGluaXRpYWwgcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBhcmUKKyAgICAgKiB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kCisgICAgICogYnl0ZSBvcmRlciBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncywgdG9vLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCiAgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncwogICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhckJ1ZmZlciBkdXBsaWNhdGUoKTsKIAogICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBjaGFyIGJ1ZmZlciBlcXVhbHMgdG8gYW5vdGhlciBvYmplY3QuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjaGFyIGJ1ZmZlciBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdC4KICAgICAgKiA8cD4KLSAgICAgKiBJZiA8Y29kZT5vdGhlcjwvY29kZT4gaXMgbm90IGEgY2hhciBidWZmZXIsIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogSWYge0Bjb2RlIG90aGVyfSBpcyBub3QgYSBjaGFyIGJ1ZmZlciB0aGVuIHtAY29kZSBmYWxzZX0gaXMgcmV0dXJuZWQuIFR3bworICAgICAqIGNoYXIgYnVmZmVycyBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgcmVtYWluaW5nIGNoYXJzIGFyZSBleGFjdGx5CisgICAgICogdGhlIHNhbWUuIFBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIG5vdCBjb25zaWRlcmVkLgogICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUd28gY2hhciBidWZmZXJzIGFyZSBlcXVhbHMgaWYsIGFuZCBvbmx5IGlmLCB0aGVpciByZW1haW5pbmcKLSAgICAgKiA8Y29kZT5jaGFyPC9jb2RlPnMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuIFBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kCi0gICAgICogbWFyayBhcmUgbm90IGNvbnNpZGVyZWQuCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIG90aGVyCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGFnYWluc3QKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhpcyBjaGFyIGJ1ZmZlciBlcXVhbHMgdG8gYW5vdGhlciBvYmplY3QuCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGNoYXIgYnVmZmVyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgY2hhciBidWZmZXIgaXMgZXF1YWwgdG8ge0Bjb2RlIG90aGVyfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKICAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBDaGFyQnVmZmVyKSkgewpAQCAtMzUwLDYxICszNjIsNjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgMS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNoYXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogUmV0dXJucyB0aGUgY2hhciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSAxLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNoYXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGUgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgY2hhciBnZXQoKTsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDxjb2RlPmNoYXI8L2NvZGU+cyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZAotICAgICAqIGNoYXIgYXJyYXkgYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmNoYXI8L2NvZGU+cwotICAgICAqIHJlYWQuCisgICAgICogUmVhZHMgY2hhcnMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgY2hhciBhcnJheSBhbmQKKyAgICAgKiBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgY2hhcnMgcmVhZC4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT5nZXQoZGVzdCwgMCwgZGVzdC5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgZ2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKX0uCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGRlc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBjaGFyIGFycmF5Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGNoYXIgYXJyYXkuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIDxjb2RlPmRlc3QubGVuZ3RoPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgZGVzdC5sZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgcmVtYWluaW5nKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGFyQnVmZmVyIGdldChjaGFyW10gZGVzdCkgewogICAgICAgICByZXR1cm4gZ2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA8Y29kZT5jaGFyPC9jb2RlPnMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjaGFyIGFycmF5LCBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uCi0gICAgICogYnkgdGhlIG51bWJlciBvZiA8Y29kZT5jaGFyPC9jb2RlPnMgcmVhZC4KLSAgICAgKgorICAgICAqIFJlYWRzIGNoYXJzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkIGNoYXIgYXJyYXksCisgICAgICogc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwgYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIGNoYXJzIHJlYWQuCisgICAgICogCiAgICAgICogQHBhcmFtIGRlc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgY2hhciBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBjaGFyIGFycmF5LgogICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgdGhlIGNoYXIgYXJyYXksIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCi0gICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+ZGVzdC5sZW5ndGg8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFyIGFycmF5LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90CisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIGRlc3QubGVuZ3RofS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIDxjb2RlPmNoYXI8L2NvZGU+cyB0byByZWFkLCBtdXN0IGJlIG5vIGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPmRlc3QubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY2hhcnMgdG8gcmVhZCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8KKyAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZGVzdC5sZW5ndGggLSBvZmZ9LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgZWl0aGVyIDxjb2RlPm9mZjwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIG9mZn0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPmxlbjwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGxlbn0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSByZW1haW5pbmcoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoYXJCdWZmZXIgZ2V0KGNoYXJbXSBkZXN0LCBpbnQgb2ZmLCBpbnQgbGVuKSB7CiAgICAgICAgIGludCBsZW5ndGggPSBkZXN0Lmxlbmd0aDsKICAgICAgICAgaWYgKChvZmYgPCAwICkgfHwgKGxlbiA8IDApIHx8IChsb25nKW9mZiArIChsb25nKWxlbiA+IGxlbmd0aCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAobGVuID4gcmVtYWluaW5nKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtNDE1LDM1ICs0MjYsMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY2hhciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBhbmQgdGhlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLgotICAgICAqCisgICAgICogUmV0dXJucyBhIGNoYXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleDsgdGhlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gbGltaXQKLSAgICAgKiBAcmV0dXJuIEEgY2hhciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIGxpbWl0LgorICAgICAqIEByZXR1cm4gYSBjaGFyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgaW5kZXggaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGluZGV4IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGNoYXIgZ2V0KGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBjaGFyIGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgYnVmZmVyIGlzIHJlYWRvbmx5LCB0aGVuIGZhbHNlIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhIGNoYXIgYXJyYXkgYW5kIGlzIHJlYWQvd3JpdGUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBjaGFyIGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgYnl0ZSBhcnJheSBhbmQgcHJvdmlkZXMKKyAgICAgKiAgICAgICAgIHJlYWQvd3JpdGUgYWNjZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBcnJheSgpIHsKICAgICAgICAgcmV0dXJuIHByb3RlY3RlZEhhc0FycmF5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGFzaCBjb2RlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIDxjb2RlPmNoYXI8L2NvZGU+cy4KLSAgICAgKiA8cD4KLSAgICAgKiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGRvbid0IGFmZmVjdCB0aGUgaGFzaCBjb2RlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGhhc2ggY29kZSBjYWxjdWxhdGVkIGZyb20gdGhlIHJlbWFpbmluZyA8Y29kZT5jaGFyPC9jb2RlPnMuCisgICAgICogQ2FsY3VsYXRlcyB0aGlzIGJ1ZmZlcidzIGhhc2ggY29kZSBmcm9tIHRoZSByZW1haW5pbmcgY2hhcnMuIFRoZQorICAgICAqIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgZG9uJ3QgYWZmZWN0IHRoZSBoYXNoIGNvZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIGNoYXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBteVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC00NTUsMTI4ICs0NjUsMTI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QuIEEgZGlyZWN0IGJ1ZmZlciB3aWxsIHRyeSBpdHMKKyAgICAgKiBiZXN0IHRvIHRha2UgYWR2YW50YWdlIG9mIG5hdGl2ZSBtZW1vcnkgQVBJcyBhbmQgaXQgbWF5IG5vdCBzdGF5IGluIHRoZQorICAgICAqIEphdmEgaGVhcCwgc28gaXQgaXMgbm90IGFmZmVjdGVkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4KICAgICAgKiA8cD4KLSAgICAgKiBBIGRpcmVjdCBidWZmZXIgd2lsbCB0cnkgaXRzIGJlc3QgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbmF0aXZlIG1lbW9yeSBBUElzCi0gICAgICogYW5kIGl0IG1heSBub3Qgc3RheSBpbiBqYXZhIGhlYXAsIHRodXMgbm90IGFmZmVjdGVkIGJ5IEdDLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBIGNoYXIgYnVmZmVyIGlzIGRpcmVjdCwgaWYgaXQgaXMgYmFzZWQgb24gYSBieXRlIGJ1ZmZlciBhbmQgdGhlIGJ5dGUKKyAgICAgKiBBIGNoYXIgYnVmZmVyIGlzIGRpcmVjdCBpZiBpdCBpcyBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyIGFuZCB0aGUgYnl0ZQogICAgICAqIGJ1ZmZlciBpcyBkaXJlY3QuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlyZWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIDxjb2RlPmNoYXI8L2NvZGU+cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByZW1haW5pbmcgPGNvZGU+Y2hhcjwvY29kZT5zLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgY2hhcnMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBjaGFycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGxlbmd0aCgpIHsKICAgICAgICAgcmV0dXJuIHJlbWFpbmluZygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcKLSAgICAgKiA8Y29kZT5jaGFyPC9jb2RlPnMgZnJvbS90byA8Y29kZT5ieXRlPC9jb2RlPnMuCisgICAgICogUmV0dXJucyB0aGUgYnl0ZSBvcmRlciB1c2VkIGJ5IHRoaXMgYnVmZmVyIHdoZW4gY29udmVydGluZyBjaGFycyBmcm9tL3RvCisgICAgICogYnl0ZXMuCiAgICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIsIHRoZW4gYWx3YXlzIHJldHVybiB0aGUKLSAgICAgKiBwbGF0Zm9ybSdzIG5hdGl2ZSBieXRlIG9yZGVyLgorICAgICAqIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyLCB0aGVuIHRoaXMgYWx3YXlzIHJldHVybnMKKyAgICAgKiB0aGUgcGxhdGZvcm0ncyBuYXRpdmUgYnl0ZSBvcmRlci4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nCi0gICAgICogICAgICAgICA8Y29kZT5jaGFyPC9jb2RlPnMgZnJvbS90byA8Y29kZT5ieXRlPC9jb2RlPnMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBvcmRlciB1c2VkIGJ5IHRoaXMgYnVmZmVyIHdoZW4gY29udmVydGluZyBjaGFycyBmcm9tL3RvCisgICAgICogICAgICAgICBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZU9yZGVyIG9yZGVyKCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXkoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheSgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5KCk8L2NvZGU+CisgICAgICogQHNlZSAjYXJyYXkoKQogICAgICAqLwogICAgIGFic3RyYWN0IGNoYXJbXSBwcm90ZWN0ZWRBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIDxjb2RlPmFycmF5T2Zmc2V0KCk8L2NvZGU+LgorICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSB7QGNvZGUgYXJyYXlPZmZzZXQoKX0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHNlZSA8Y29kZT5hcnJheU9mZnNldCgpPC9jb2RlPgorICAgICAqIEBzZWUgI2FycmF5T2Zmc2V0KCkKICAgICAgKi8KICAgICBhYnN0cmFjdCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKTsKIAogICAgIC8qKgotICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSA8Y29kZT5oYXNBcnJheSgpPC9jb2RlPi4KKyAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUge0Bjb2RlIGhhc0FycmF5KCl9LgogICAgICAqCi0gICAgICogQHJldHVybiBzZWUgPGNvZGU+aGFzQXJyYXkoKTwvY29kZT4KKyAgICAgKiBAc2VlICNoYXNBcnJheSgpCiAgICAgICovCiAgICAgYWJzdHJhY3QgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBjaGFyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24KKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGNoYXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24KICAgICAgKiBieSAxLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFyIHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgaWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyQnVmZmVyIHB1dChjaGFyIGMpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmNoYXI8L2NvZGU+cyBpbiB0aGUgZ2l2ZW4gY2hhciBhcnJheSB0byB0aGUgY3VycmVudAotICAgICAqIHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5jaGFyPC9jb2RlPnMKLSAgICAgKiB3cml0dGVuLgorICAgICAqIFdyaXRlcyBjaGFycyBmcm9tIHRoZSBnaXZlbiBjaGFyIGFycmF5IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZAorICAgICAqIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBjaGFycyB3cml0dGVuLgogICAgICAqIDxwPgogICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwotICAgICAqIDxjb2RlPnB1dChzcmMsIDAsIHNyYy5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgcHV0KHNyYywgMCwgc3JjLmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgY2hhciBhcnJheQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2hhciBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+c3JjLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgcmVtYWluaW5nKCl9IGlzIGxlc3MgdGhhbiB7QGNvZGUgc3JjLmxlbmd0aH0uCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENoYXJCdWZmZXIgcHV0KGNoYXJbXSBzcmMpIHsKICAgICAgICAgcmV0dXJuIHB1dChzcmMsIDAsIHNyYy5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5jaGFyPC9jb2RlPnMgaW4gdGhlIGdpdmVuIGNoYXIgYXJyYXksIHN0YXJ0aW5nIGZyb20gdGhlCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCwgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieQotICAgICAqIHRoZSBudW1iZXIgb2YgPGNvZGU+Y2hhcjwvY29kZT5zIHdyaXR0ZW4uCi0gICAgICoKKyAgICAgKiBXcml0ZXMgY2hhcnMgZnJvbSB0aGUgZ2l2ZW4gY2hhciBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwKKyAgICAgKiB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIGNoYXJzCisgICAgICogd3JpdHRlbi4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICBUaGUgc291cmNlIGNoYXIgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2hhciBhcnJheS4KICAgICAgKiBAcGFyYW0gb2ZmCi0gICAgICogICAgICAgICAgICBUaGUgb2Zmc2V0IG9mIGNoYXIgYXJyYXksIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCi0gICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+c3JjLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgY2hhciBhcnJheSwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyCisgICAgICogICAgICAgICAgICB0aGFuIHtAY29kZSBzcmMubGVuZ3RofS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIDxjb2RlPmNoYXI8L2NvZGU+cyB0byB3cml0ZSwgbXVzdCBiZSBubyBsZXNzCi0gICAgICogICAgICAgICAgICB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5zcmMubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcnMgdG8gd3JpdGUsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIHNyYy5sZW5ndGggLSBvZmZ9LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiBpcyBsZXNzIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5sZW48L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHJlbWFpbmluZygpfSBpcyBsZXNzIHRoYW4ge0Bjb2RlIGxlbn0uCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgZWl0aGVyIDxjb2RlPm9mZjwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIG9mZn0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2hhckJ1ZmZlciBwdXQoY2hhcltdIHNyYywgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbGVuZ3RoID0gc3JjLmxlbmd0aDsKICAgICAgICAgaWYgKChvZmYgPCAwICkgfHwgKGxlbiA8IDApIHx8IChsb25nKW9mZiArIChsb25nKWxlbiA+IGxlbmd0aCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAobGVuID4gcmVtYWluaW5nKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC01ODcsMjAgKzU5NywyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhbGwgdGhlIHJlbWFpbmluZyA8Y29kZT5jaGFyPC9jb2RlPnMgb2YgdGhlIDxjb2RlPnNyYzwvY29kZT4KLSAgICAgKiBjaGFyIGJ1ZmZlciB0byB0aGlzIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24sIGFuZCBpbmNyZWFzZSBib3RoIGJ1ZmZlcnMnCi0gICAgICogcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5jaGFyPC9jb2RlPnMgY29waWVkLgotICAgICAqCisgICAgICogV3JpdGVzIGFsbCB0aGUgcmVtYWluaW5nIGNoYXJzIG9mIHRoZSB7QGNvZGUgc3JjfSBjaGFyIGJ1ZmZlciB0byB0aGlzCisgICAgICogYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbiwgYW5kIGluY3JlYXNlcyBib3RoIGJ1ZmZlcnMnIHBvc2l0aW9uIGJ5IHRoZQorICAgICAqIG51bWJlciBvZiBjaGFycyBjb3BpZWQuCisgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgVGhlIHNvdXJjZSBjaGFyIGJ1ZmZlcgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgY2hhciBidWZmZXIuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+c3JjLnJlbWFpbmluZygpPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gdGhpcwotICAgICAqICAgICAgICAgICAgICAgIGJ1ZmZlcidzIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzcmMucmVtYWluaW5nKCl9IGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGJ1ZmZlcidzCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIHJlbWFpbmluZygpfS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnNyYzwvY29kZT4gaXMgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3JjfSBpcyB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2hhckJ1ZmZlciBwdXQoQ2hhckJ1ZmZlciBzcmMpIHsKICAgICAgICAgaWYgKHNyYyA9PSB0aGlzKSB7CkBAIC02MDksNyArNjIwLDcgQEAKICAgICAgICAgaWYgKHNyYy5yZW1haW5pbmcoKSA+IHJlbWFpbmluZygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBjaGFyW10gY29udGVudHMgPSBuZXcgY2hhcltzcmMucmVtYWluaW5nKCldOwogICAgICAgICBzcmMuZ2V0KGNvbnRlbnRzKTsKICAgICAgICAgcHV0KGNvbnRlbnRzKTsKQEAgLTYxNyw3MyArNjI4LDcwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBjaGFyIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIgYW5kIHRoZSBwb3NpdGlvbiBpcwotICAgICAqIG5vdCBjaGFuZ2VkLgotICAgICAqCisgICAgICogV3JpdGVzIGEgY2hhciB0byB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoaXMgYnVmZmVyOyB0aGUgcG9zaXRpb24gaXMgbm90CisgICAgICogY2hhbmdlZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIHRoZSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gdGhlIGxpbWl0LgogICAgICAqIEBwYXJhbSBjCi0gICAgICogICAgICAgICAgICBUaGUgY2hhciB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgaW5kZXggaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGluZGV4IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENoYXJCdWZmZXIgcHV0KGludCBpbmRleCwgY2hhciBjKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGFsbCA8Y29kZT5jaGFyPC9jb2RlPnMgb2YgdGhlIGdpdmUgc3RyaW5nIHRvIHRoZSBjdXJyZW50Ci0gICAgICogcG9zaXRpb24gb2YgdGhpcyBidWZmZXIsIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIGxlbmd0aCBvZgotICAgICAqIHN0cmluZy4KKyAgICAgKiBXcml0ZXMgYWxsIGNoYXJzIG9mIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhpcworICAgICAqIGJ1ZmZlciwgYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIGxlbmd0aCBvZiBzdHJpbmcuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+cHV0KHN0ciwgMCwgc3RyLmxlbmd0aCgpKTwvY29kZT4uCisgICAgICoge0Bjb2RlIHB1dChzdHIsIDAsIHN0ci5sZW5ndGgoKSl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZgotICAgICAqICAgICAgICAgICAgICAgIHN0cmluZworICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSByZW1haW5pbmcoKX0gaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2Ygc3RyaW5nLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDaGFyQnVmZmVyIHB1dChTdHJpbmcgc3RyKSB7CiAgICAgICAgIHJldHVybiBwdXQoc3RyLCAwLCBzdHIubGVuZ3RoKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIDxjb2RlPmNoYXI8L2NvZGU+cyBvZiB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0gICAgICogb2YgdGhpcyBidWZmZXIsIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZgotICAgICAqIDxjb2RlPmNoYXI8L2NvZGU+cyB3cml0dGVuLgotICAgICAqCisgICAgICogV3JpdGVzIGNoYXJzIG9mIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhpcyBidWZmZXIsCisgICAgICogYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBjaGFycyB3cml0dGVuLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gd3JpdGUuCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgZmlyc3QgY2hhciB0byB3cml0ZSwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8KLSAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5zdHIubGVuZ3RoKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhciB0byB3cml0ZSwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyCisgICAgICogICAgICAgICAgICB0aGFuIHtAY29kZSBzdHIubGVuZ3RoKCl9LgogICAgICAqIEBwYXJhbSBlbmQKLSAgICAgKiAgICAgICAgICAgIFRoZSBsYXN0IGNoYXIgdG8gd3JpdGUgKGV4Y2x1ZGluZyksIG11c3QgYmUgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5zdGFydDwvY29kZT4gYW5kIG5vIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+c3RyLmxlbmd0aCgpPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0IGNoYXIgdG8gd3JpdGUgKGV4Y2x1ZGluZyksIG11c3QgYmUgbGVzcyB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgc3RhcnR9IGFuZCBub3QgZ3JlYXRlciB0aGFuIHtAY29kZSBzdHIubGVuZ3RoKCl9LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnJlbWFpbmluZzwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+ZW5kIC0gc3RhcnQ8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHJlbWFpbmluZygpfSBpcyBsZXNzIHRoYW4ge0Bjb2RlIGVuZCAtIHN0YXJ0fS4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmVuZDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGVuZH0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2hhckJ1ZmZlciBwdXQoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgIGludCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7CiAgICAgICAgIGlmIChzdGFydCA8IDAgfHwgZW5kIDwgc3RhcnQgfHwgZW5kID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IHJlbWFpbmluZygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtNjk0LDYzICs3MDIsNjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncwotICAgICAqIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiwgYW5kIGl0cyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0bwotICAgICAqIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIDAsCi0gICAgICogbGltaXQgd2lsbCBiZSBpdHMgY2FwYWNpdHksIGFuZCBpdHMgbWFyayBpcyB1bnNldC4gVGhlIG5ldyBidWZmZXIncwotICAgICAqIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSBzbGljZWQgYnVmZmVyJ3MgY2FwYWNpdHkgd2lsbCBiZSB0aGlzIGJ1ZmZlcidzIHtAY29kZSByZW1haW5pbmcoKX0sCisgICAgICogYW5kIGl0cyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0byB0aGlzIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIDAsIGxpbWl0IHdpbGwgYmUgaXRzIGNhcGFjaXR5LCBhbmQgaXRzCisgICAgICogbWFyayBpcyBjbGVhcmVkLiBUaGUgbmV3IGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUKKyAgICAgKiBzYW1lIGFzIHRoaXMgYnVmZmVyLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCiAgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncwogICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzbGljZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENoYXJCdWZmZXIgc2xpY2UoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgY2hhciBidWZmZXIgcmVwcmVzZW50cyBhIHN1Yi1zZXF1ZW5jZSBvZiB0aGlzIGJ1ZmZlcidzCisgICAgICogUmV0dXJucyBhIG5ldyBjaGFyIGJ1ZmZlciByZXByZXNlbnRpbmcgYSBzdWItc2VxdWVuY2Ugb2YgdGhpcyBidWZmZXIncwogICAgICAqIGN1cnJlbnQgcmVtYWluaW5nIGNvbnRlbnQuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIDxjb2RlPnBvc2l0aW9uKCkgKyBzdGFydDwvY29kZT4sCi0gICAgICogbGltaXQgd2lsbCBiZSA8Y29kZT5wb3NpdGlvbigpICsgZW5kPC9jb2RlPiwgY2FwYWNpdHkgd2lsbCBiZSBzYW1lIGFzCi0gICAgICogdGhpcyBidWZmZXIuIFRoZSBuZXcgYnVmZmVyJ3MgcmVhZG9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHNhbWUKLSAgICAgKiBhcyB0aGlzIGJ1ZmZlci4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUge0Bjb2RlIHBvc2l0aW9uKCkgKyBzdGFydH0sIGxpbWl0IHdpbGwKKyAgICAgKiBiZSB7QGNvZGUgcG9zaXRpb24oKSArIGVuZH0sIGNhcGFjaXR5IHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIuCisgICAgICogVGhlIG5ldyBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHRoZSBzYW1lIGFzIHRoaXMKKyAgICAgKiBidWZmZXIuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKICAgICAgKiBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLiBUaGUgdHdvIGJ1ZmZlcidzCiAgICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBzdGFydCBpbmRleCBvZiB0aGUgc3ViLXNlcXVlbmNlLCByZWZlcmVuY2VkIGZyb20gdGhlCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHN1Yi1zZXF1ZW5jZSwgcmVmZXJlbmNlZCBmcm9tIHRoZQogICAgICAqICAgICAgICAgICAgY3VycmVudCBidWZmZXIgcG9zaXRpb24uIE11c3Qgbm90IGJlIGxlc3MgdGhhbiB6ZXJvIGFuZCBub3QKICAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2J0YWluZWQgZnJvbSBhIGNhbGwgdG8KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSByZW1haW5pbmcoKX0uCiAgICAgICogQHBhcmFtIGVuZAotICAgICAqICAgICAgICAgICAgVGhlIGVuZCBpbmRleCBvZiB0aGUgc3ViLXNlcXVlbmNlLCByZWZlcmVuY2VkIGZyb20gdGhlIGN1cnJlbnQKLSAgICAgKiAgICAgICAgICAgIGJ1ZmZlciBwb3NpdGlvbi4gTXVzdCBub3QgYmUgbGVzcyB0aGFuIDxjb2RlPnN0YXJ0PC9jb2RlPgotICAgICAqICAgICAgICAgICAgYW5kIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9idGFpbmVkIGZyb20gYSBjYWxsIHRvCi0gICAgICogICAgICAgICAgICA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IGNoYXIgYnVmZmVyIHJlcHJlc2VudHMgYSBzdWItc2VxdWVuY2Ugb2YgdGhpcyBidWZmZXIncworICAgICAqICAgICAgICAgICAgdGhlIGVuZCBpbmRleCBvZiB0aGUgc3ViLXNlcXVlbmNlLCByZWZlcmVuY2VkIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgIGJ1ZmZlciBwb3NpdGlvbi4gTXVzdCBub3QgYmUgbGVzcyB0aGFuIHtAY29kZSBzdGFydH0gYW5kIG5vdAorICAgICAqICAgICAgICAgICAgYmUgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvYnRhaW5lZCBmcm9tIGEgY2FsbCB0bworICAgICAqICAgICAgICAgICAge0Bjb2RlIHJlbWFpbmluZygpfS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGNoYXIgYnVmZmVyIHJlcHJlc2VudHMgYSBzdWItc2VxdWVuY2Ugb2YgdGhpcyBidWZmZXIncwogICAgICAqICAgICAgICAgY3VycmVudCByZW1haW5pbmcgY29udGVudC4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmVuZDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGVuZH0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgcmVtYWluaW5nIDxjb2RlPmNoYXI8L2NvZGU+cwotICAgICAqIG9mIHRoaXMgYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRzIHRoZSBjdXJyZW50IHJlbWFpbmluZyA8Y29kZT5jaGFyPC9jb2RlPnMKLSAgICAgKiAgICAgICAgIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHJlbWFpbmluZyBjaGFycyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCByZW1haW5pbmcgY2hhcnMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTc2MSwxNCArNzY5LDQwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBBcHBlbmRhYmxlI2FwcGVuZChjaGFyKQorICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gY2hhciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbgorICAgICAqIGJ5IDEuCisgICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCisgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdC4KKyAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoYXJCdWZmZXIgYXBwZW5kKGNoYXIgYyl7CiAgICAgICAgIHJldHVybiBwdXQoYyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBBcHBlbmRhYmxlI2FwcGVuZChDaGFyU2VxdWVuY2UpCisgICAgICogV3JpdGVzIGFsbCBjaGFycyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHNlcXVlbmNlIHtAY29kZSBjc3F9IHRvIHRoZQorICAgICAqIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhpcyBidWZmZXIsIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZSBsZW5ndGgKKyAgICAgKiBvZiB0aGUgY3NxLgorICAgICAqIDxwPgorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB7QGNvZGUgYXBwZW5kKGNzcS50b1N0cmluZygpKX0uCisgICAgICogPC9wPgorICAgICAqIElmIHRoZSB7QGNvZGUgQ2hhclNlcXVlbmNlfSBpcyB7QGNvZGUgbnVsbH0gdGhlIHN0cmluZyAibnVsbCIgd2lsbCBiZQorICAgICAqIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3NxCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENoYXJTZXF1ZW5jZX0gdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHJlbWFpbmluZygpfSBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBjc3EuCisgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGFyQnVmZmVyIGFwcGVuZChDaGFyU2VxdWVuY2UgY3NxKXsKICAgICAgICAgaWYgKGNzcSAhPSBudWxsKSB7CkBAIC03NzgsNyArODEyLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBBcHBlbmRhYmxlI2FwcGVuZChDaGFyU2VxdWVuY2UsIGludCwgaW50KQorICAgICAqIFdyaXRlcyBjaGFycyBvZiB0aGUgZ2l2ZW4ge0Bjb2RlIENoYXJTZXF1ZW5jZX0gdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YKKyAgICAgKiB0aGlzIGJ1ZmZlciwgYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBjaGFycyB3cml0dGVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjc3EKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2hhclNlcXVlbmNlfSB0byB3cml0ZS4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyIHRvIHdyaXRlLCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoYW4ge0Bjb2RlIGNzcS5sZW5ndGgoKX0uCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgY2hhciB0byB3cml0ZSAoZXhjbHVkaW5nKSwgbXVzdCBiZSBsZXNzIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBzdGFydH0gYW5kIG5vdCBncmVhdGVyIHRoYW4ge0Bjb2RlIGNzcS5sZW5ndGgoKX0uCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHJlbWFpbmluZygpfSBpcyBsZXNzIHRoYW4ge0Bjb2RlIGVuZCAtIHN0YXJ0fS4KKyAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIHN0YXJ0fSBvciB7QGNvZGUgZW5kfSBpcyBpbnZhbGlkLgorICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2hhckJ1ZmZlciBhcHBlbmQoQ2hhclNlcXVlbmNlIGNzcSwgaW50IHN0YXJ0LCBpbnQgZW5kKXsKICAgICAgICAgaWYgKGNzcSA9PSBudWxsKSB7CkBAIC03OTIsNyArODQ0LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBSZWFkYWJsZSNyZWFkKENoYXJCdWZmZXIpCisgICAgICogUmVhZHMgY2hhcmFjdGVycyBmcm9tIHRoaXMgYnVmZmVyIGFuZCBwdXRzIHRoZW0gaW50byB7QGNvZGUgdGFyZ2V0fS4gVGhlCisgICAgICogbnVtYmVyIG9mIGNoYXJzIHRoYXQgYXJlIGNvcGllZCBpcyBlaXRoZXIgdGhlIG51bWJlciBvZiByZW1haW5pbmcgY2hhcnMKKyAgICAgKiBpbiB0aGlzIGJ1ZmZlciBvciB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBjaGFycyBpbiB7QGNvZGUgdGFyZ2V0fSwKKyAgICAgKiB3aGljaGV2ZXIgaXMgc21hbGxlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGNoYXIgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHRhcmdldH0gaXMgdGhpcyBidWZmZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHtAY29kZSB0YXJnZXR9LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFycyBjb3BpZWQgb3IgLTEgaWYgdGhlcmUgYXJlIG5vIGNoYXJzIGxlZnQgdG8gYmUKKyAgICAgKiAgICAgICAgIHJlYWQgZnJvbSB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHJlYWQoQ2hhckJ1ZmZlciB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmKHRhcmdldCA9PSB0aGlzKXsKQEAgLTgwNiw1ICs4NzMsNSBAQAogICAgICAgICBnZXQoY2hhcnMpOwogICAgICAgICB0YXJnZXQucHV0KGNoYXJzKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CisgICAgfSAgICAKIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0RvdWJsZUJ1ZmZlci5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vRG91YmxlQnVmZmVyLmphdmEKaW5kZXggZjA4MTg4Yy4uYjNjMjYxZCAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vRG91YmxlQnVmZmVyLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vRG91YmxlQnVmZmVyLmphdmEKQEAgLTE4LDkgKzE4LDEwIEBACiBwYWNrYWdlIGphdmEubmlvOwogCiAvKioKLSAqIEEgYnVmZmVyIG9mIDxjb2RlPmRvdWJsZTwvY29kZT5zLgorICogQSBidWZmZXIgb2YgZG91Ymxlcy4KICAqIDxwPgotICogQSBkb3VibGUgYnVmZmVyIGNhbiBiZSBjcmVhdGVkIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiBBIGRvdWJsZSBidWZmZXIgY2FuIGJlIGNyZWF0ZWQgaW4gZWl0aGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiA8L3A+CiAgKiA8dWw+CiAgKiA8bGk+e0BsaW5rICNhbGxvY2F0ZShpbnQpIEFsbG9jYXRlfSBhIG5ldyBkb3VibGUgYXJyYXkgYW5kIGNyZWF0ZSBhIGJ1ZmZlcgogICogYmFzZWQgb24gaXQ7PC9saT4KQEAgLTMwLDE2ICszMSwyMCBAQAogICoge0BsaW5rIGphdmEubmlvLkJ5dGVCdWZmZXIjYXNEb3VibGVCdWZmZXIoKSBCeXRlQnVmZmVyLmFzRG91YmxlQnVmZmVyfSB0bwogICogY3JlYXRlIGEgZG91YmxlIGJ1ZmZlciBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyLjwvbGk+CiAgKiA8L3VsPgotICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERvdWJsZUJ1ZmZlciBleHRlbmRzIEJ1ZmZlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8RG91YmxlQnVmZmVyPiB7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG91YmxlIGJ1ZmZlciBiYXNlZCBvbiBhIG5ldyBhbGxvY2F0ZWQgZG91YmxlIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhcGFjaXR5ICBUaGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIKLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGRvdWJsZSBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiA8Y29kZT5jYXBhY2l0eTwvY29kZT4gaXMgbGVzcyB0aGFuIHplcm8KKyAgICAgKiBDcmVhdGVzIGEgZG91YmxlIGJ1ZmZlciBiYXNlZCBvbiBhIG5ld2x5IGFsbG9jYXRlZCBkb3VibGUgYXJyYXkuCisgICAgICogCisgICAgICogQHBhcmFtIGNhcGFjaXR5CisgICAgICogICAgICAgICAgICB0aGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBkb3VibGUgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNhcGFjaXR5fSBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIERvdWJsZUJ1ZmZlciBhbGxvY2F0ZShpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5IDwgMCkgewpAQCAtNTIsMzQgKzU3LDM3IEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyBkb3VibGUgYnVmZmVyIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBkb3VibGUgYXJyYXkuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+d3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTwvY29kZT4uPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICAgICBUaGUgZG91YmxlIGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGRvdWJsZSBidWZmZXIKKyAgICAgKiB7QGNvZGUgd3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKX0uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZG91YmxlIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIERvdWJsZUJ1ZmZlciB3cmFwKGRvdWJsZVtdIGFycmF5KSB7CiAgICAgICAgIHJldHVybiB3cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgbmV3IGEgZG91YmxlIGJ1ZmZlciBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gZG91YmxlIGFycmF5LgorICAgICAqIENyZWF0ZXMgYSBuZXcgZG91YmxlIGJ1ZmZlciBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gZG91YmxlIGFycmF5LgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSA8Y29kZT5zdGFydDwvY29kZT4sIGxpbWl0IHdpbGwgYmUKLSAgICAgKiA8Y29kZT5zdGFydCArIGxlbjwvY29kZT4sIGNhcGFjaXR5IHdpbGwgYmUgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuCisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIHtAY29kZSBzdGFydH0sIGxpbWl0IHdpbGwgYmUKKyAgICAgKiB7QGNvZGUgc3RhcnQgKyBsZW59LCBjYXBhY2l0eSB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgVGhlIGRvdWJsZSBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24uCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBUaGUgc3RhcnQgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+YXJyYXkubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGFycmF5Lmxlbmd0aH0uCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgVGhlIGxlbmd0aCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5hcnJheS5sZW5ndGggLSBzdGFydDwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGRvdWJsZSBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBub3QgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgYXJyYXkubGVuZ3RoIC0gc3RhcnR9LgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZG91YmxlIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIERvdWJsZUJ1ZmZlciB3cmFwKGRvdWJsZVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW4pIHsKICAgICAgICAgaW50IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKQEAgLTk1LDkgKzEwMywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5Eb3VibGVCdWZmZXI8L2NvZGU+IHdpdGggZ2l2ZW4gY2FwYWNpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgIFRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBEb3VibGVCdWZmZXJ9IHdpdGggZ2l2ZW4gY2FwYWNpdHkuCisgICAgICogCisgICAgICogQHBhcmFtIGNhcGFjaXR5CisgICAgICogICAgICAgICAgICB0aGUgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlci4KICAgICAgKi8KICAgICBEb3VibGVCdWZmZXIoaW50IGNhcGFjaXR5KSB7CiAgICAgICAgIHN1cGVyKGNhcGFjaXR5KTsKQEAgLTEwNywxMyArMTE2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG91YmxlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZiB0aGVyZSdzIG9uZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRvdWJsZSBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiwgaWYgdGhlcmUgaXMgb25lLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbi4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkb25seQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGFuIGFycmF5IGJ1dCBpdCBpcyByZWFkLW9ubHkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZG91YmxlW10gYXJyYXkoKSB7CiAgICAgICAgIHJldHVybiBwcm90ZWN0ZWRBcnJheSgpOwpAQCAtMTIxLDMxICsxMzEsMzQgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgZG91YmxlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZgotICAgICAqIHRoZXJlJ3Mgb25lLgorICAgICAqIHRoZXJlIGlzIG9uZS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgb2Zmc2V0IGlzIHRoZSBpbmRleCBvZiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gdGhlIHplcm8gcG9zaXRpb24gb2YKLSAgICAgKiB0aGUgYnVmZmVyLgorICAgICAqIFRoZSBvZmZzZXQgaXMgdGhlIGluZGV4IG9mIHRoZSBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSB6ZXJvIHBvc2l0aW9uCisgICAgICogb2YgdGhlIGJ1ZmZlci4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvZmZzZXQgb2YgdGhlIGRvdWJsZSBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZG91YmxlIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkLW9ubHkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGFycmF5T2Zmc2V0KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXlPZmZzZXQoKTsKICAgICB9CiAKICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCi0gICAgQE92ZXJyaWRlIE9iamVjdCBfYXJyYXkoKSB7CisgICAgQE92ZXJyaWRlIAorICAgIE9iamVjdCBfYXJyYXkoKSB7CiAgICAgICAgIGlmIChoYXNBcnJheSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUgaW50IF9hcnJheU9mZnNldCgpIHsKKyAgICBAT3ZlcnJpZGUgCisgICAgaW50IF9hcnJheU9mZnNldCgpIHsKICAgICAgICAgaWYgKGhhc0FycmF5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBhcnJheU9mZnNldCgpOwogICAgICAgICB9CkBAIC0xNTQsOTIgKzE2NywxMDUgQEAKICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHJlYWRvbmx5IGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHJlYWQtb25seSBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBuZXcgaW5zdGFuY2UsIGV2ZW4gdGhpcwotICAgICAqIGJ1ZmZlciBpcyByZWFkb25seSBpdHNlbGYuIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eQotICAgICAqIGFuZCBtYXJrIGFyZSB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlci48L3A+CisgICAgICogVGhlIHJldHVybmVkIGJ1ZmZlciBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbmV3IGluc3RhbmNlLCBldmVuIGlmIHRoaXMKKyAgICAgKiBidWZmZXIgaXMgcmVhZC1vbmx5IGl0c2VsZi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5CisgICAgICogYW5kIG1hcmsgYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyJ3MuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zCi0gICAgICogdGhpcyBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG5ldyBidWZmZXIuCi0gICAgICogVGhlIHR3byBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSByZWFkb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyB0aGF0IHRoaXMKKyAgICAgKiBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG5ldyBidWZmZXIuIFRoZSB0d28KKyAgICAgKiBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IHZlcnNpb24gb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERvdWJsZUJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCk7CiAKICAgICAvKioKICAgICAgKiBDb21wYWN0cyB0aGlzIGRvdWJsZSBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHJlbWFpbmluZyA8Y29kZT5kb3VibGU8L2NvZGU+cyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZQotICAgICAqIGJ1ZmZlciwgc3RhcmluZyBmcm9tIHBvc2l0aW9uIHplcm8uIFRoZW4gdGhlIHBvc2l0aW9uIGlzIHNldCB0bwotICAgICAqIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPjsgdGhlIGxpbWl0IGlzIHNldCB0byBjYXBhY2l0eTsgdGhlIG1hcmsgaXMKLSAgICAgKiBjbGVhcmVkLgorICAgICAqIFRoZSByZW1haW5pbmcgZG91YmxlcyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBidWZmZXIsIHN0YXJpbmcKKyAgICAgKiBmcm9tIHBvc2l0aW9uIHplcm8uIFRoZW4gdGhlIHBvc2l0aW9uIGlzIHNldCB0byB7QGNvZGUgcmVtYWluaW5nKCl9OyB0aGUKKyAgICAgKiBsaW1pdCBpcyBzZXQgdG8gY2FwYWNpdHk7IHRoZSBtYXJrIGlzIGNsZWFyZWQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERvdWJsZUJ1ZmZlciBjb21wYWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgPGNvZGU+ZG91YmxlPC9jb2RlPnMgb2YgdGhpcyBidWZmZXIgdG8gYW5vdGhlcgotICAgICAqIGRvdWJsZSBidWZmZXIncyByZW1haW5pbmcgPGNvZGU+ZG91YmxlPC9jb2RlPnMuCi0gICAgICoKKyAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgZG91YmxlcyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyIGRvdWJsZSBidWZmZXIncworICAgICAqIHJlbWFpbmluZyBkb3VibGVzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlckJ1ZmZlcgotICAgICAqICAgICAgICAgICAgQW5vdGhlciBkb3VibGUgYnVmZmVyCi0gICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIDxjb2RlPm90aGVyPC9jb2RlPjsgMCBpZgotICAgICAqICAgICAgICAgdGhpcyBlcXVhbHMgdG8gPGNvZGU+b3RoZXI8L2NvZGU+OyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoaXMgaXMKLSAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5vdGhlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgZG91YmxlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhpcyBpcyBsZXNzIHRoYW4ge0Bjb2RlIG90aGVyfTsgMCBpZiB0aGlzCisgICAgICogICAgICAgICBlcXVhbHMgdG8ge0Bjb2RlIG90aGVyfTsgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGlzIGlzIGdyZWF0ZXIKKyAgICAgKiAgICAgICAgIHRoYW4ge0Bjb2RlIG90aGVyfS4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPm90aGVyPC9jb2RlPiBpcyBub3QgYSBkb3VibGUgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIG90aGVyfSBpcyBub3QgYSBkb3VibGUgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKERvdWJsZUJ1ZmZlciBvdGhlckJ1ZmZlcikgewogICAgICAgICBpbnQgY29tcGFyZVJlbWFpbmluZyA9IChyZW1haW5pbmcoKSA8IG90aGVyQnVmZmVyLnJlbWFpbmluZygpKSA/IHJlbWFpbmluZygpCiAgICAgICAgICAgICAgICAgOiBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKTsKICAgICAgICAgaW50IHRoaXNQb3MgPSBwb3NpdGlvbjsKICAgICAgICAgaW50IG90aGVyUG9zID0gb3RoZXJCdWZmZXIucG9zaXRpb247Ci0gICAgICAgIGRvdWJsZSB0aGlzQnl0ZSwgb3RoZXJCeXRlOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgZG91YmxlIHRoaXNEb3VibGUsIG90aGVyRG91YmxlOwogICAgICAgICB3aGlsZSAoY29tcGFyZVJlbWFpbmluZyA+IDApIHsKLSAgICAgICAgICAgIHRoaXNCeXRlID0gZ2V0KHRoaXNQb3MpOwotICAgICAgICAgICAgb3RoZXJCeXRlID0gb3RoZXJCdWZmZXIuZ2V0KG90aGVyUG9zKTsKLSAgICAgICAgICAgIGlmICh0aGlzQnl0ZSAhPSBvdGhlckJ5dGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0J5dGUgPCBvdGhlckJ5dGUgPyAtMSA6IDE7CisgICAgICAgICAgICB0aGlzRG91YmxlID0gZ2V0KHRoaXNQb3MpOworICAgICAgICAgICAgb3RoZXJEb3VibGUgPSBvdGhlckJ1ZmZlci5nZXQob3RoZXJQb3MpOworICAgICAgICAgICAgLy8gY2hlY2tzIGZvciBkb3VibGUgYW5kIE5hTiBpbmVxdWFsaXR5CisgICAgICAgICAgICBpZiAoKHRoaXNEb3VibGUgIT0gb3RoZXJEb3VibGUpCisgICAgICAgICAgICAgICAgICAgICYmICgodGhpc0RvdWJsZSA9PSB0aGlzRG91YmxlKSB8fCAob3RoZXJEb3VibGUgPT0gb3RoZXJEb3VibGUpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzRG91YmxlIDwgb3RoZXJEb3VibGUgPyAtMSA6IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aGlzUG9zKys7CiAgICAgICAgICAgICBvdGhlclBvcysrOwogICAgICAgICAgICAgY29tcGFyZVJlbWFpbmluZy0tOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIHJlbWFpbmluZygpIC0gb3RoZXJCdWZmZXIucmVtYWluaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGFyZSB0aGUKLSAgICAgKiBzYW1lIGFzIHRoaXMgYnVmZmVyLiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyByZWFkb25seSBwcm9wZXJ0eSBhbmQKLSAgICAgKiBieXRlIG9yZGVyIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyIHRvby48L3A+CisgICAgICogVGhlIGR1cGxpY2F0ZWQgYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBhcmUgdGhlIHNhbWUKKyAgICAgKiBhcyB0aGlzIGJ1ZmZlcidzLiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUKKyAgICAgKiBvcmRlciBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncywgdG9vLgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucwotICAgICAqIGVpdGhlciBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLgotICAgICAqIFRoZSB0d28gYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLiBUaGUgdHdvIGJ1ZmZlcidzCisgICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERvdWJsZUJ1ZmZlciBkdXBsaWNhdGUoKTsKIAogICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBkb3VibGUgYnVmZmVyIGVxdWFscyB0byBhbm90aGVyIG9iamVjdC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGRvdWJsZSBidWZmZXIgaXMgZXF1YWwgdG8gYW5vdGhlciBvYmplY3QuCiAgICAgICogPHA+Ci0gICAgICogSWYgPGNvZGU+b3RoZXI8L2NvZGU+IGlzIG5vdCBhIGRvdWJsZSBidWZmZXIsIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuPC9wPgotICAgICAqIDxwPgotICAgICAqIFR3byBkb3VibGUgYnVmZmVycyBhcmUgZXF1YWxzIGlmLCBhbmQgb25seSBpZiwgdGhlaXIgcmVtYWluaW5nCi0gICAgICogPGNvZGU+ZG91YmxlPC9jb2RlPnMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuIFBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kCi0gICAgICogbWFyayBhcmUgbm90IGNvbnNpZGVyZWQuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG90aGVyIHRoZSBvYmplY3QgdG8gYmUgY29tcGFyZWQgYWdhaW5zdAotICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGRvdWJsZSBidWZmZXIgZXF1YWxzIHRvIGFub3RoZXIgb2JqZWN0LgorICAgICAqIElmIHtAY29kZSBvdGhlcn0gaXMgbm90IGEgZG91YmxlIGJ1ZmZlciB0aGVuIHtAY29kZSBmYWxzZX0gaXMgcmV0dXJuZWQuCisgICAgICogVHdvIGRvdWJsZSBidWZmZXJzIGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGVpciByZW1haW5pbmcgZG91YmxlcyBhcmUKKyAgICAgKiBleGFjdGx5IHRoZSBzYW1lLiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGFyZSBub3QgY29uc2lkZXJlZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG90aGVyCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGRvdWJsZSBidWZmZXIuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBkb3VibGUgYnVmZmVyIGlzIGVxdWFsIHRvIHtAY29kZSBvdGhlcn0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CiAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRG91YmxlQnVmZmVyKSkgewpAQCAtMjYyLDYwICsyODgsNjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSAxLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZG91YmxlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIElmIHRoZSBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQKKyAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkKKyAgICAgKiAxLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXQoKTsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDxjb2RlPmRvdWJsZTwvY29kZT5zIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgZG91YmxlIGFycmF5IGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZgotICAgICAqIDxjb2RlPmRvdWJsZTwvY29kZT5zIHJlYWQuCisgICAgICogUmVhZHMgZG91YmxlcyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBkb3VibGUgYXJyYXkKKyAgICAgKiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIGRvdWJsZXMgcmVhZC4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT5nZXQoZGVzdCwgMCwgZGVzdC5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgZ2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKX0uCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGRlc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBkb3VibGUgYXJyYXkKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZG91YmxlIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiA8Y29kZT5kZXN0Lmxlbmd0aDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGRlc3QubGVuZ3RofSBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIHJlbWFpbmluZygpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRG91YmxlQnVmZmVyIGdldChkb3VibGVbXSBkZXN0KSB7CiAgICAgICAgIHJldHVybiBnZXQoZGVzdCwgMCwgZGVzdC5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIDxjb2RlPmRvdWJsZTwvY29kZT5zIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgZG91YmxlIGFycmF5LCBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBhbmQgaW5jcmVhc2UKLSAgICAgKiB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5kb3VibGU8L2NvZGU+cyByZWFkLgotICAgICAqCisgICAgICogUmVhZHMgZG91YmxlcyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBkb3VibGUgYXJyYXksCisgICAgICogc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwgYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIGRvdWJsZXMgcmVhZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZGVzdAotICAgICAqICAgICAgICAgICAgVGhlIHRhcmdldCBkb3VibGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZG91YmxlIGFycmF5LgogICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgdGhlIGRvdWJsZSBhcnJheSwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQKLSAgICAgKiAgICAgICAgICAgIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5kZXN0Lmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvdWJsZSBhcnJheSwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdAorICAgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBkZXN0Lmxlbmd0aH0uCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiA8Y29kZT5kb3VibGU8L2NvZGU+cyB0byByZWFkLCBtdXN0IGJlIG5vIGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPmRlc3QubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZG91YmxlcyB0byByZWFkLCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZAorICAgICAqICAgICAgICAgICAgbm90IGdyZWF0ZXIgdGhhbiB7QGNvZGUgZGVzdC5sZW5ndGggLSBvZmZ9LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgZWl0aGVyIDxjb2RlPm9mZjwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIG9mZn0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPmxlbjwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGxlbn0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSByZW1haW5pbmcoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERvdWJsZUJ1ZmZlciBnZXQoZG91YmxlW10gZGVzdCwgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbGVuZ3RoID0gZGVzdC5sZW5ndGg7CiAgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgKGxvbmcpb2ZmICsgKGxvbmcpbGVuID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIGlmIChsZW4gPiByZW1haW5pbmcoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC0zMjYsMzEgKzM1MywzNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkb3VibGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgYW5kIHRoZSBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gbGltaXQKLSAgICAgKiBAcmV0dXJuIEEgZG91YmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIElmIGluZGV4IGlzIGludmFsaWQKKyAgICAgKiBSZXR1cm5zIGEgZG91YmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXg7IHRoZSBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiBsaW1pdC4KKyAgICAgKiBAcmV0dXJuIGEgZG91YmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgaW5kZXggaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldChpbnQgaW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgZG91YmxlIGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgYnVmZmVyIGlzIHJlYWRvbmx5LCB0aGVuIGZhbHNlIGlzIHJldHVybmVkLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhIGRvdWJsZSBhcnJheSBhbmQgaXMgcmVhZC93cml0ZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhIGRvdWJsZSBhcnJheSBhbmQgaXMKKyAgICAgKiByZWFkL3dyaXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgZG91YmxlIGFycmF5IGFuZAorICAgICAqICAgICAgICAgcHJvdmlkZXMgcmVhZC93cml0ZSBhY2Nlc3MsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FycmF5KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkSGFzQXJyYXkoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIYXNoIGNvZGUgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSByZW1haW5pbmcgPGNvZGU+ZG91YmxlPC9jb2RlPnMuCi0gICAgICogPHA+Ci0gICAgICogUG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBkb24ndCBhZmZlY3QgdGhlIGhhc2ggY29kZS48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBoYXNoIGNvZGUgY2FsY3VsYXRlZCBmcm9tIHRoZSByZW1haW5pbmcgPGNvZGU+ZG91YmxlPC9jb2RlPnMuCisgICAgICogQ2FsY3VsYXRlcyB0aGlzIGJ1ZmZlcidzIGhhc2ggY29kZSBmcm9tIHRoZSByZW1haW5pbmcgY2hhcnMuIFRoZQorICAgICAqIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgZG9uJ3QgYWZmZWN0IHRoZSBoYXNoIGNvZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIGNoYXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBteVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC0zNjQsMTE3ICszOTUsMTE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QuIEEgZGlyZWN0IGJ1ZmZlciB3aWxsIHRyeSBpdHMKKyAgICAgKiBiZXN0IHRvIHRha2UgYWR2YW50YWdlIG9mIG5hdGl2ZSBtZW1vcnkgQVBJcyBhbmQgaXQgbWF5IG5vdCBzdGF5IGluIHRoZQorICAgICAqIEphdmEgaGVhcCwgc28gaXQgaXMgbm90IGFmZmVjdGVkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4KICAgICAgKiA8cD4KLSAgICAgKiBBIGRpcmVjdCBidWZmZXIgd2lsbCB0cnkgaXRzIGJlc3QgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbmF0aXZlIG1lbW9yeQotICAgICAqIEFQSXMgYW5kIGl0IG1heSBub3Qgc3RheSBpbiBqYXZhIGhlYXAsIHRodXMgbm90IGFmZmVjdGVkIGJ5IEdDLjwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBIGRvdWJsZSBidWZmZXIgaXMgZGlyZWN0LCBpZiBpdCBpcyBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyIGFuZCB0aGUgYnl0ZQotICAgICAqIGJ1ZmZlciBpcyBkaXJlY3QuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiBBIGRvdWJsZSBidWZmZXIgaXMgZGlyZWN0IGlmIGl0IGlzIGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIgYW5kIHRoZSBieXRlCisgICAgICogYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBidWZmZXIgaXMgZGlyZWN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RpcmVjdCgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnl0ZSBvcmRlciB1c2VkIGJ5IHRoaXMgYnVmZmVyIHdoZW4gY29udmVydGluZwotICAgICAqIDxjb2RlPmRvdWJsZTwvY29kZT5zIGZyb20vdG8gPGNvZGU+Ynl0ZTwvY29kZT5zLgorICAgICAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcgZG91YmxlcworICAgICAqIGZyb20vdG8gYnl0ZXMuCiAgICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIsIHRoZW4gYWx3YXlzIHJldHVybiB0aGUKLSAgICAgKiBwbGF0Zm9ybSdzIG5hdGl2ZSBieXRlIG9yZGVyLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcKLSAgICAgKiA8Y29kZT5kb3VibGU8L2NvZGU+cyBmcm9tL3RvIDxjb2RlPmJ5dGU8L2NvZGU+cy4KKyAgICAgKiBJZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYSBieXRlIGJ1ZmZlciwgdGhlbiB0aGlzIGFsd2F5cyByZXR1cm5zCisgICAgICogdGhlIHBsYXRmb3JtJ3MgbmF0aXZlIGJ5dGUgb3JkZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcgZG91YmxlcworICAgICAqICAgICAgICAgZnJvbS90byBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZU9yZGVyIG9yZGVyKCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXkoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheSgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5KCk8L2NvZGU+CisgICAgICogQHNlZSAjYXJyYXkoKQogICAgICAqLwogICAgIGFic3RyYWN0IGRvdWJsZVtdIHByb3RlY3RlZEFycmF5KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXlPZmZzZXQoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheU9mZnNldCgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5T2Zmc2V0KCk8L2NvZGU+CisgICAgICogQHNlZSAjYXJyYXlPZmZzZXQoKQogICAgICAqLwogICAgIGFic3RyYWN0IGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpOwogCiAgICAgLyoqCi0gICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIDxjb2RlPmhhc0FycmF5KCk8L2NvZGU+LgorICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSB7QGNvZGUgaGFzQXJyYXkoKX0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHNlZSA8Y29kZT5oYXNBcnJheSgpPC9jb2RlPgorICAgICAqIEBzZWUgI2hhc0FycmF5KCkKICAgICAgKi8KICAgICBhYnN0cmFjdCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRvdWJsZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uCi0gICAgICogYnkgMS4KLSAgICAgKgorICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gZG91YmxlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZXMgdGhlCisgICAgICogcG9zaXRpb24gYnkgMS4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZAotICAgICAqICAgICAgICAgICAgVGhlIGRvdWJsZSB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgaWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBEb3VibGVCdWZmZXIgcHV0KGRvdWJsZSBkKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5kb3VibGU8L2NvZGU+cyBpbiB0aGUgZ2l2ZW4gZG91YmxlIGFycmF5IHRvIHRoZSBjdXJyZW50Ci0gICAgICogcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmRvdWJsZTwvY29kZT5zCi0gICAgICogd3JpdHRlbi4KKyAgICAgKiBXcml0ZXMgZG91YmxlcyBmcm9tIHRoZSBnaXZlbiBkb3VibGUgYXJyYXkgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kCisgICAgICogaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIGRvdWJsZXMgd3JpdHRlbi4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT5wdXQoc3JjLCAwLCBzcmMubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIHB1dChzcmMsIDAsIHNyYy5sZW5ndGgpfS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICBUaGUgc291cmNlIGRvdWJsZSBhcnJheQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZG91YmxlIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiBpcyBsZXNzIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5zcmMubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSByZW1haW5pbmcoKX0gaXMgbGVzcyB0aGFuIHtAY29kZSBzcmMubGVuZ3RofS4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgRG91YmxlQnVmZmVyIHB1dChkb3VibGVbXSBzcmMpIHsKICAgICAgICAgcmV0dXJuIHB1dChzcmMsIDAsIHNyYy5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5kb3VibGU8L2NvZGU+cyBpbiB0aGUgZ2l2ZW4gZG91YmxlIGFycmF5LCBzdGFydGluZyBmcm9tCi0gICAgICogdGhlIHNwZWNpZmllZCBvZmZzZXQsIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24KLSAgICAgKiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmRvdWJsZTwvY29kZT5zIHdyaXR0ZW4uCi0gICAgICoKKyAgICAgKiBXcml0ZXMgZG91YmxlcyBmcm9tIHRoZSBnaXZlbiBkb3VibGUgYXJyYXksIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIG9mZnNldCwgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlcgorICAgICAqIG9mIGRvdWJsZXMgd3JpdHRlbi4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICBUaGUgc291cmNlIGRvdWJsZSBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBkb3VibGUgYXJyYXkuCiAgICAgICogQHBhcmFtIG9mZgotICAgICAqICAgICAgICAgICAgVGhlIG9mZnNldCBvZiBkb3VibGUgYXJyYXksIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCi0gICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+c3JjLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgZG91YmxlIGFycmF5LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90CisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIHNyYy5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgPGNvZGU+ZG91YmxlPC9jb2RlPnMgdG8gd3JpdGUsIG11c3QgYmUgbm8KLSAgICAgKiAgICAgICAgICAgIGxlc3MgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnNyYy5sZW5ndGggLSBvZmY8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkb3VibGVzIHRvIHdyaXRlLCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZAorICAgICAqICAgICAgICAgICAgbm90IGdyZWF0ZXIgdGhhbiB7QGNvZGUgc3JjLmxlbmd0aCAtIG9mZn0uCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+IGlzIGxlc3MgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmxlbjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgcmVtYWluaW5nKCl9IGlzIGxlc3MgdGhhbiB7QGNvZGUgbGVufS4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+b2ZmPC9jb2RlPiBvciA8Y29kZT5sZW48L2NvZGU+IGlzCi0gICAgICogICAgICAgICAgICAgICAgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGVpdGhlciB7QGNvZGUgb2ZmfSBvciB7QGNvZGUgbGVufSBpcyBpbnZhbGlkLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEb3VibGVCdWZmZXIgcHV0KGRvdWJsZVtdIHNyYywgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbGVuZ3RoID0gc3JjLmxlbmd0aDsKICAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCAobG9uZylvZmYgKyAobG9uZylsZW4gPiBsZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgaWYgKGxlbiA+IHJlbWFpbmluZygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtNDg1LDIwICs1MTcsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYWxsIHRoZSByZW1haW5pbmcgPGNvZGU+ZG91YmxlPC9jb2RlPnMgb2YgdGhlIDxjb2RlPnNyYzwvY29kZT4KLSAgICAgKiBkb3VibGUgYnVmZmVyIHRvIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbiwgYW5kIGluY3JlYXNlIGJvdGgKLSAgICAgKiBidWZmZXJzJyBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmRvdWJsZTwvY29kZT5zIGNvcGllZC4KLSAgICAgKgorICAgICAqIFdyaXRlcyBhbGwgdGhlIHJlbWFpbmluZyBkb3VibGVzIG9mIHRoZSB7QGNvZGUgc3JjfSBkb3VibGUgYnVmZmVyIHRvIHRoaXMKKyAgICAgKiBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLCBhbmQgaW5jcmVhc2VzIGJvdGggYnVmZmVycycgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIGRvdWJsZXMgY29waWVkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgZG91YmxlIGJ1ZmZlcgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZG91YmxlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5zcmMucmVtYWluaW5nKCk8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgYnVmZmVyJ3MgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHNyYy5yZW1haW5pbmcoKX0gaXMgZ3JlYXRlciB0aGFuIHRoaXMgYnVmZmVyJ3MKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgcmVtYWluaW5nKCl9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+c3JjPC9jb2RlPiBpcyB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzcmN9IGlzIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEb3VibGVCdWZmZXIgcHV0KERvdWJsZUJ1ZmZlciBzcmMpIHsKICAgICAgICAgaWYgKHNyYyA9PSB0aGlzKSB7CkBAIC01MTYsNDAgKzU0OSw0NSBAQAogICAgIC8qKgogICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIgYW5kIHRoZSBwb3NpdGlvbiBpcwogICAgICAqIG5vdCBjaGFuZ2VkLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiB0aGUgbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiB0aGUgbGltaXQuCiAgICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIFRoZSBkb3VibGUgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgaW5kZXggaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGluZGV4IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERvdWJsZUJ1ZmZlciBwdXQoaW50IGluZGV4LCBkb3VibGUgZCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncwotICAgICAqIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiwgYW5kIGl0cyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0bwotICAgICAqIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlCi0gICAgICogMCwgbGltaXQgd2lsbCBiZSBpdHMgY2FwYWNpdHksIGFuZCBpdHMgbWFyayBpcyB1bnNldC4gVGhlIG5ldyBidWZmZXIncwotICAgICAqIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyLjwvcD4KKyAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncyB7QGNvZGUgcmVtYWluaW5nKCl9LAorICAgICAqIGFuZCBpdHMgemVybyBwb3NpdGlvbiB3aWxsIGNvcnJlc3BvbmQgdG8gdGhpcyBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSAwLCBsaW1pdCB3aWxsIGJlIGl0cyBjYXBhY2l0eSwgYW5kIGl0cworICAgICAqIG1hcmsgaXMgY2xlYXJlZC4gVGhlIG5ldyBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlCisgICAgICogdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMKLSAgICAgKiBlaXRoZXIgYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4KLSAgICAgKiBUaGUgdHdvIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLiBUaGUgdHdvIGJ1ZmZlcidzCisgICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRG91YmxlQnVmZmVyIHNsaWNlKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoaXMgZG91YmxlIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhpcyBkb3VibGUgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIGRvdWJsZSBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoaXMgZG91YmxlIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtNTU4LDcgKzU5Niw3IEBACiAgICAgICAgIGJ1Zi5hcHBlbmQoY2FwYWNpdHkoKSk7CiAgICAgICAgIGJ1Zi5hcHBlbmQoIiBwb3NpdGlvbj0iKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICBidWYuYXBwZW5kKHBvc2l0aW9uKCkpOwotICAgICAgICBidWYuYXBwZW5kKCIgbGltaXQ9Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgYnVmLmFwcGVuZCgiIGxpbWl0PSIpOyAvLyROT04tTkxTLTEkICAgIAogICAgICAgICBidWYuYXBwZW5kKGxpbWl0KCkpOwogICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vRmxvYXRCdWZmZXIuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0Zsb2F0QnVmZmVyLmphdmEKaW5kZXggYzY5NWQxMy4uZjdlZTkxNyAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vRmxvYXRCdWZmZXIuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9GbG9hdEJ1ZmZlci5qYXZhCkBAIC0xOCw5ICsxOCwxMCBAQAogcGFja2FnZSBqYXZhLm5pbzsKIAogLyoqCi0gKiBBIGJ1ZmZlciBvZiA8Y29kZT5mbG9hdDwvY29kZT5zLgorICogQSBidWZmZXIgb2YgZmxvYXRzLgogICogPHA+CiAgKiBBIGZsb2F0IGJ1ZmZlciBjYW4gYmUgY3JlYXRlZCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgorICogPC9wPgogICogPHVsPgogICogPGxpPntAbGluayAjYWxsb2NhdGUoaW50KSBBbGxvY2F0ZX0gYSBuZXcgZmxvYXQgYXJyYXkgYW5kIGNyZWF0ZSBhIGJ1ZmZlcgogICogYmFzZWQgb24gaXQ7PC9saT4KQEAgLTI5LDE3ICszMCwyMCBAQAogICogPGxpPlVzZSB7QGxpbmsgamF2YS5uaW8uQnl0ZUJ1ZmZlciNhc0Zsb2F0QnVmZmVyKCkgQnl0ZUJ1ZmZlci5hc0Zsb2F0QnVmZmVyfQogICogdG8gY3JlYXRlIGEgZmxvYXQgYnVmZmVyIGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIuPC9saT4KICAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEZsb2F0QnVmZmVyIGV4dGVuZHMgQnVmZmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxGbG9hdEJ1ZmZlcj4gewogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZsb2F0IGJ1ZmZlciBiYXNlZCBvbiBhIG5ldyBhbGxvY2F0ZWQgZmxvYXQgYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgIFRoZSBjYXBhY2l0eSBvZiB0aGUgbmV3IGJ1ZmZlcgotICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgZmxvYXQgYnVmZmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzIGxlc3MgdGhhbiB6ZXJvCisgICAgICogQ3JlYXRlcyBhIGZsb2F0IGJ1ZmZlciBiYXNlZCBvbiBhIG5ld2x5IGFsbG9jYXRlZCBmbG9hdCBhcnJheS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FwYWNpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXBhY2l0eSBvZiB0aGUgbmV3IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZsb2F0IGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjYXBhY2l0eX0gaXMgbGVzcyB0aGFuIHplcm8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGbG9hdEJ1ZmZlciBhbGxvY2F0ZShpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5IDwgMCkgewpAQCAtNTIsMzQgKzU2LDM5IEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyBmbG9hdCBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGZsb2F0IGFycmF5LgogICAgICAqIDxwPgogICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwotICAgICAqIDxjb2RlPndyYXAoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk8L2NvZGU+LjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgICAgVGhlIGZsb2F0IGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGZsb2F0IGJ1ZmZlcgorICAgICAqIHtAY29kZSB3cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpfS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgd2hpY2ggdGhlIG5ldyBidWZmZXIgd2lsbCBiZSBiYXNlZCBvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZsb2F0IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZsb2F0QnVmZmVyIHdyYXAoZmxvYXRbXSBhcnJheSkgewogICAgICAgICByZXR1cm4gd3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIG5ldyBhIGZsb2F0IGJ1ZmZlciBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gZmxvYXQgYXJyYXkuCisgICAgICogQ3JlYXRlcyBhIG5ldyBmbG9hdCBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGZsb2F0IGFycmF5LgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSA8Y29kZT5zdGFydDwvY29kZT4sIGxpbWl0IHdpbGwgYmUKLSAgICAgKiA8Y29kZT5zdGFydCArIGxlbjwvY29kZT4sIGNhcGFjaXR5IHdpbGwgYmUgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuCisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIHtAY29kZSBzdGFydH0sIGxpbWl0IHdpbGwgYmUKKyAgICAgKiB7QGNvZGUgc3RhcnQgKyBsZW59LCBjYXBhY2l0eSB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgVGhlIGZsb2F0IGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIHN0YXJ0IGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmFycmF5Lmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBhcnJheS5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBsZW5ndGgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+YXJyYXkubGVuZ3RoIC0gc3RhcnQ8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBmbG9hdCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBub3QgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgYXJyYXkubGVuZ3RoIC0gc3RhcnR9LgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmxvYXQgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5zdGFydDwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIHN0YXJ0fSBvciB7QGNvZGUgbGVufSBpcyBpbnZhbGlkLgorICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgYXJyYXl9IGlzIG51bGwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGbG9hdEJ1ZmZlciB3cmFwKGZsb2F0W10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbikgewogICAgICAgICAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CkBAIC05Nyw3ICsxMDYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5GbG9hdEJ1ZmZlcjwvY29kZT4gd2l0aCBnaXZlbiBjYXBhY2l0eS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIEZsb2F0QnVmZmVyfSB3aXRoIGdpdmVuIGNhcGFjaXR5LgogICAgICAqCiAgICAgICogQHBhcmFtIGNhcGFjaXR5ICBUaGUgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlcgogICAgICAqLwpAQCAtMTA5LDEzICsxMTgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiwgaWYgdGhlcmUncyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBmbG9hdCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIFJldHVybnMgdGhlIGZsb2F0IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24uCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGFuIGFycmF5LCBidXQgaXQgaXMgcmVhZG9ubHkKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWQtb25seS4KICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGFuIGFycmF5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGFuIGFycmF5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdFtdIGFycmF5KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXkoKTsKQEAgLTEyMywxNyArMTMzLDE4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGZsb2F0IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZgotICAgICAqIHRoZXJlJ3Mgb25lLgorICAgICAqIHRoZXJlIGlzIG9uZS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgb2Zmc2V0IGlzIHRoZSBpbmRleCBvZiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gdGhlIHplcm8gcG9zaXRpb24gb2YKLSAgICAgKiB0aGUgYnVmZmVyLgorICAgICAqIFRoZSBvZmZzZXQgaXMgdGhlIGluZGV4IG9mIHRoZSBhcnJheSBhbmQgY29ycmVzcG9uZHMgdG8gdGhlIHplcm8gcG9zaXRpb24KKyAgICAgKiBvZiB0aGUgYnVmZmVyLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG9mZnNldCBvZiB0aGUgZmxvYXQgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZsb2F0IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkLW9ubHkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGFycmF5T2Zmc2V0KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXlPZmZzZXQoKTsKQEAgLTE1Niw5MiArMTY3LDEwNSBAQAogICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmVhZG9ubHkgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5ldyBpbnN0YW5jZSwgZXZlbiB0aGlzCi0gICAgICogYnVmZmVyIGlzIHJlYWRvbmx5IGl0c2VsZi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5Ci0gICAgICogYW5kIG1hcmsgYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyLjwvcD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBuZXcgaW5zdGFuY2UsIGV2ZW4gaWYgdGhpcworICAgICAqIGJ1ZmZlciBpcyByZWFkLW9ubHkgaXRzZWxmLiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkKKyAgICAgKiBhbmQgbWFyayBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zCi0gICAgICogdGhpcyBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG5ldyBidWZmZXIuCi0gICAgICogVGhlIHR3byBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSByZWFkb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyB0aGlzCisgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBuZXcgYnVmZmVyLiBUaGUgdHdvCisgICAgICogYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIHJlYWQtb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBGbG9hdEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCk7CiAKICAgICAvKioKICAgICAgKiBDb21wYWN0cyB0aGlzIGZsb2F0IGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVtYWluaW5nIDxjb2RlPmZsb2F0PC9jb2RlPnMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUKLSAgICAgKiBidWZmZXIsIHN0YXJpbmcgZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8KLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT47IHRoZSBsaW1pdCBpcyBzZXQgdG8gY2FwYWNpdHk7IHRoZSBtYXJrIGlzCi0gICAgICogY2xlYXJlZC4KKyAgICAgKiBUaGUgcmVtYWluaW5nIGZsb2F0cyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBidWZmZXIsIHN0YXJ0aW5nCisgICAgICogZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8ge0Bjb2RlIHJlbWFpbmluZygpfTsgdGhlCisgICAgICogbGltaXQgaXMgc2V0IHRvIGNhcGFjaXR5OyB0aGUgbWFyayBpcyBjbGVhcmVkLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBGbG9hdEJ1ZmZlciBjb21wYWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgPGNvZGU+ZmxvYXQ8L2NvZGU+cyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyCi0gICAgICogZmxvYXQgYnVmZmVyJ3MgcmVtYWluaW5nIDxjb2RlPmZsb2F0PC9jb2RlPnMuCi0gICAgICoKKyAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgZmxvYXRzIG9mIHRoaXMgYnVmZmVyIHRvIGFub3RoZXIgZmxvYXQgYnVmZmVyJ3MKKyAgICAgKiByZW1haW5pbmcgZmxvYXRzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlckJ1ZmZlcgotICAgICAqICAgICAgICAgICAgQW5vdGhlciBmbG9hdCBidWZmZXIKLSAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhpcyBpcyBsZXNzIHRoYW4gPGNvZGU+b3RoZXI8L2NvZGU+OyAwIGlmCi0gICAgICogICAgICAgICB0aGlzIGVxdWFscyB0byA8Y29kZT5vdGhlcjwvY29kZT47IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhpcyBpcwotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIDxjb2RlPm90aGVyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgYW5vdGhlciBmbG9hdCBidWZmZXIuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIHtAY29kZSBvdGhlckJ1ZmZlcn07IDAgaWYKKyAgICAgKiAgICAgICAgIHRoaXMgZXF1YWxzIHRvIHtAY29kZSBvdGhlckJ1ZmZlcn07IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhpcyBpcworICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBvdGhlckJ1ZmZlcn0uCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5vdGhlcjwvY29kZT4gaXMgbm90IGEgZmxvYXQgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIG90aGVyQnVmZmVyfSBpcyBub3QgYSBmbG9hdCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oRmxvYXRCdWZmZXIgb3RoZXJCdWZmZXIpIHsKICAgICAgICAgaW50IGNvbXBhcmVSZW1haW5pbmcgPSAocmVtYWluaW5nKCkgPCBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKSkgPyByZW1haW5pbmcoKQogICAgICAgICAgICAgICAgIDogb3RoZXJCdWZmZXIucmVtYWluaW5nKCk7CiAgICAgICAgIGludCB0aGlzUG9zID0gcG9zaXRpb247CiAgICAgICAgIGludCBvdGhlclBvcyA9IG90aGVyQnVmZmVyLnBvc2l0aW9uOwotICAgICAgICBmbG9hdCB0aGlzQnl0ZSwgb3RoZXJCeXRlOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgZmxvYXQgdGhpc0Zsb2F0LCBvdGhlckZsb2F0OwogICAgICAgICB3aGlsZSAoY29tcGFyZVJlbWFpbmluZyA+IDApIHsKLSAgICAgICAgICAgIHRoaXNCeXRlID0gZ2V0KHRoaXNQb3MpOwotICAgICAgICAgICAgb3RoZXJCeXRlID0gb3RoZXJCdWZmZXIuZ2V0KG90aGVyUG9zKTsKLSAgICAgICAgICAgIGlmICh0aGlzQnl0ZSAhPSBvdGhlckJ5dGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0J5dGUgPCBvdGhlckJ5dGUgPyAtMSA6IDE7CisgICAgICAgICAgICB0aGlzRmxvYXQgPSBnZXQodGhpc1Bvcyk7CisgICAgICAgICAgICBvdGhlckZsb2F0ID0gb3RoZXJCdWZmZXIuZ2V0KG90aGVyUG9zKTsKKyAgICAgICAgICAgIC8vIGNoZWNrcyBmb3IgZmxvYXQgYW5kIE5hTiBpbmVxdWFsaXR5CisgICAgICAgICAgICBpZiAoKHRoaXNGbG9hdCAhPSBvdGhlckZsb2F0KQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRoaXNGbG9hdCA9PSB0aGlzRmxvYXQpIHx8IChvdGhlckZsb2F0ID09IG90aGVyRmxvYXQpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzRmxvYXQgPCBvdGhlckZsb2F0ID8gLTEgOiAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhpc1BvcysrOwogICAgICAgICAgICAgb3RoZXJQb3MrKzsKICAgICAgICAgICAgIGNvbXBhcmVSZW1haW5pbmctLTsKICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiByZW1haW5pbmcoKSAtIG90aGVyQnVmZmVyLnJlbWFpbmluZygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogUmV0dXJucyBhIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGR1cGxpY2F0ZWQgYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBhcmUgdGhlCi0gICAgICogc2FtZSBhcyB0aGlzIGJ1ZmZlci4gVGhlIGR1cGxpY2F0ZWQgYnVmZmVyJ3MgcmVhZG9ubHkgcHJvcGVydHkgYW5kCi0gICAgICogYnl0ZSBvcmRlciBhcmUgc2FtZSBhcyB0aGlzIGJ1ZmZlciB0b28uPC9wPgorICAgICAqIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIHRoZSBzYW1lCisgICAgICogYXMgdGhpcyBidWZmZXIuIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlcgorICAgICAqIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyIHRvby4KKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMKLSAgICAgKiBlaXRoZXIgYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4KLSAgICAgKiBUaGUgdHdvIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCisgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncworICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBGbG9hdEJ1ZmZlciBkdXBsaWNhdGUoKTsKIAogICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBmbG9hdCBidWZmZXIgZXF1YWxzIHRvIGFub3RoZXIgb2JqZWN0LgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgZmxvYXQgYnVmZmVyIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0LgogICAgICAqIDxwPgotICAgICAqIElmIDxjb2RlPm90aGVyPC9jb2RlPiBpcyBub3QgYSBmbG9hdCBidWZmZXIsIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuPC9wPgotICAgICAqIDxwPgotICAgICAqIFR3byBmbG9hdCBidWZmZXJzIGFyZSBlcXVhbHMgaWYsIGFuZCBvbmx5IGlmLCB0aGVpciByZW1haW5pbmcKLSAgICAgKiA8Y29kZT5mbG9hdDwvY29kZT5zIGFyZSBleGFjdGx5IHRoZSBzYW1lLiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZAotICAgICAqIG1hcmsgYXJlIG5vdCBjb25zaWRlcmVkLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdGhlciB0aGUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGFnYWluc3QKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhpcyBmbG9hdCBidWZmZXIgZXF1YWxzIHRvIGFub3RoZXIgb2JqZWN0LgorICAgICAqIElmIHtAY29kZSBvdGhlcn0gaXMgbm90IGEgZmxvYXQgYnVmZmVyIHRoZW4ge0Bjb2RlIGZhbHNlfSBpcyByZXR1cm5lZC4KKyAgICAgKiBUd28gZmxvYXQgYnVmZmVycyBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgcmVtYWluaW5nIGZsb2F0cyBhcmUKKyAgICAgKiBleGFjdGx5IHRoZSBzYW1lLiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGFyZSBub3QgY29uc2lkZXJlZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG90aGVyCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGZsb2F0IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGZsb2F0IGJ1ZmZlciBpcyBlcXVhbCB0byB7QGNvZGUgb3RoZXJ9LAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewogICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZsb2F0QnVmZmVyKSkgewpAQCAtMjY0LDYwICsyODgsNjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmbG9hdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uIGJ5IDEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBmbG9hdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBJZiB0aGUgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0CisgICAgICogUmV0dXJucyB0aGUgZmxvYXQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkKKyAgICAgKiAxLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA8Y29kZT5mbG9hdDwvY29kZT5zIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkCi0gICAgICogZmxvYXQgYXJyYXkgYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmZsb2F0PC9jb2RlPnMKLSAgICAgKiByZWFkLgorICAgICAqIFJlYWRzIGZsb2F0cyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBmbG9hdCBhcnJheSBhbmQKKyAgICAgKiBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgZmxvYXRzIHJlYWQuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+Z2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIGdldChkZXN0LCAwLCBkZXN0Lmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBkZXN0Ci0gICAgICogICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gZmxvYXQgYXJyYXkKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZmxvYXQgYXJyYXkuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIDxjb2RlPmRlc3QubGVuZ3RoPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgZGVzdC5sZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgcmVtYWluaW5nKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGbG9hdEJ1ZmZlciBnZXQoZmxvYXRbXSBkZXN0KSB7CiAgICAgICAgIHJldHVybiBnZXQoZGVzdCwgMCwgZGVzdC5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIDxjb2RlPmZsb2F0PC9jb2RlPnMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBmbG9hdCBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwgYW5kIGluY3JlYXNlIHRoZQotICAgICAqIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgPGNvZGU+ZmxvYXQ8L2NvZGU+cyByZWFkLgotICAgICAqCisgICAgICogUmVhZHMgZmxvYXRzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkIGZsb2F0IGFycmF5LAorICAgICAqIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQsIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZQorICAgICAqIG51bWJlciBvZiBmbG9hdHMgcmVhZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZGVzdAotICAgICAqICAgICAgICAgICAgVGhlIHRhcmdldCBmbG9hdCBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBmbG9hdCBhcnJheS4KICAgICAgKiBAcGFyYW0gb2ZmCi0gICAgICogICAgICAgICAgICBUaGUgb2Zmc2V0IG9mIHRoZSBmbG9hdCBhcnJheSwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQKLSAgICAgKiAgICAgICAgICAgIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5kZXN0Lmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGZsb2F0IGFycmF5LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm8KKyAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZGVzdC5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgPGNvZGU+ZmxvYXQ8L2NvZGU+cyB0byByZWFkLCBtdXN0IGJlIG5vIGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPmRlc3QubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZmxvYXRzIHRvIHJlYWQsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIGRlc3QubGVuZ3RoIC0gb2ZmfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5vZmY8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBvZmZ9IG9yIHtAY29kZSBsZW59IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5sZW48L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBsZW59IGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgcmVtYWluaW5nKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGbG9hdEJ1ZmZlciBnZXQoZmxvYXRbXSBkZXN0LCBpbnQgb2ZmLCBpbnQgbGVuKSB7CiAgICAgICAgIGludCBsZW5ndGggPSBkZXN0Lmxlbmd0aDsKICAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCAobG9uZylvZmYgKyAobG9uZylsZW4gPiBsZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgaWYgKGxlbiA+IHJlbWFpbmluZygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KQEAgLTMyOCwzMSArMzUzLDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZsb2F0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGFuZCB0aGUgcG9zaXRpb24gaXMgbm90IGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIGxpbWl0Ci0gICAgICogQHJldHVybiBBIGZsb2F0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIElmIGluZGV4IGlzIGludmFsaWQKKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleDsgdGhlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIGxpbWl0LgorICAgICAqIEByZXR1cm4gYSBmbG9hdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGluZGV4IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0IGdldChpbnQgaW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgZmxvYXQgYXJyYXkgYW5kIGlzIHJlYWQvd3JpdGUuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBidWZmZXIgaXMgcmVhZG9ubHksIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBXaGV0aGVyIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgZmxvYXQgYXJyYXkgYW5kIGlzIHJlYWQvd3JpdGUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBmbG9hdCBhcnJheSBhbmQgaXMKKyAgICAgKiByZWFkL3dyaXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgZmxvYXQgYXJyYXkgYW5kCisgICAgICogICAgICAgICBwcm92aWRlcyByZWFkL3dyaXRlIGFjY2Vzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQXJyYXkoKSB7CiAgICAgICAgIHJldHVybiBwcm90ZWN0ZWRIYXNBcnJheSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhhc2ggY29kZSBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHJlbWFpbmluZyA8Y29kZT5mbG9hdDwvY29kZT5zLgotICAgICAqIDxwPgotICAgICAqIFBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgZG9uJ3QgYWZmZWN0IHRoZSBoYXNoIGNvZGUuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgaGFzaCBjb2RlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIDxjb2RlPmZsb2F0PC9jb2RlPnMuCisgICAgICogQ2FsY3VsYXRlcyB0aGlzIGJ1ZmZlcidzIGhhc2ggY29kZSBmcm9tIHRoZSByZW1haW5pbmcgY2hhcnMuIFRoZQorICAgICAqIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgZG9uJ3QgYWZmZWN0IHRoZSBoYXNoIGNvZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIGZsb2F0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBpbnQgbXlQb3NpdGlvbiA9IHBvc2l0aW9uOwpAQCAtMzY0LDExNiArMzkzLDExOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgZGlyZWN0LiBBIGRpcmVjdCBidWZmZXIgd2lsbCB0cnkgaXRzCisgICAgICogYmVzdCB0byB0YWtlIGFkdmFudGFnZSBvZiBuYXRpdmUgbWVtb3J5IEFQSXMgYW5kIGl0IG1heSBub3Qgc3RheSBpbiB0aGUKKyAgICAgKiBKYXZhIGhlYXAsIHNvIGl0IGlzIG5vdCBhZmZlY3RlZCBieSBnYXJiYWdlIGNvbGxlY3Rpb24uCiAgICAgICogPHA+Ci0gICAgICogQSBkaXJlY3QgYnVmZmVyIHdpbGwgdHJ5IGl0cyBiZXN0IHRvIHRha2UgYWR2YW50YWdlIG9mIG5hdGl2ZSBtZW1vcnkKLSAgICAgKiBBUElzIGFuZCBpdCBtYXkgbm90IHN0YXkgaW4gamF2YSBoZWFwLCB0aHVzIG5vdCBhZmZlY3RlZCBieSBHQy48L3A+Ci0gICAgICogPHA+Ci0gICAgICogQSBmbG9hdCBidWZmZXIgaXMgZGlyZWN0LCBpZiBpdCBpcyBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyIGFuZCB0aGUgYnl0ZQotICAgICAqIGJ1ZmZlciBpcyBkaXJlY3QuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiBBIGZsb2F0IGJ1ZmZlciBpcyBkaXJlY3QgaWYgaXQgaXMgYmFzZWQgb24gYSBieXRlIGJ1ZmZlciBhbmQgdGhlIGJ5dGUKKyAgICAgKiBidWZmZXIgaXMgZGlyZWN0LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlyZWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nCi0gICAgICogPGNvZGU+ZmxvYXQ8L2NvZGU+cyBmcm9tL3RvIDxjb2RlPmJ5dGU8L2NvZGU+cy4KKyAgICAgKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nIGZsb2F0cyBmcm9tL3RvCisgICAgICogYnl0ZXMuCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIsIHRoZW4gYWx3YXlzIHJldHVybiB0aGUKLSAgICAgKiBwbGF0Zm9ybSdzIG5hdGl2ZSBieXRlIG9yZGVyLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcKLSAgICAgKiA8Y29kZT5mbG9hdDwvY29kZT5zIGZyb20vdG8gPGNvZGU+Ynl0ZTwvY29kZT5zLgorICAgICAqIHBsYXRmb3JtJ3MgbmF0aXZlIGJ5dGUgb3JkZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcgZmxvYXRzIGZyb20vdG8KKyAgICAgKiAgICAgICAgIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlT3JkZXIgb3JkZXIoKTsKIAogICAgIC8qKgotICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSA8Y29kZT5hcnJheSgpPC9jb2RlPi4KKyAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUge0Bjb2RlIGFycmF5KCl9LgogICAgICAqCi0gICAgICogQHJldHVybiBzZWUgPGNvZGU+YXJyYXkoKTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHNlZSB7QGNvZGUgYXJyYXkoKX0KICAgICAgKi8KICAgICBhYnN0cmFjdCBmbG9hdFtdIHByb3RlY3RlZEFycmF5KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXlPZmZzZXQoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheU9mZnNldCgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5T2Zmc2V0KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGFycmF5T2Zmc2V0KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3QgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+aGFzQXJyYXkoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBoYXNBcnJheSgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmhhc0FycmF5KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGhhc0FycmF5KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3QgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBmbG9hdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBmbG9hdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbgogICAgICAqIGJ5IDEuCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZgotICAgICAqICAgICAgICAgICAgVGhlIGZsb2F0IHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgIGlmIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRmxvYXRCdWZmZXIgcHV0KGZsb2F0IGYpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmZsb2F0PC9jb2RlPnMgaW4gdGhlIGdpdmVuIGZsb2F0IGFycmF5IHRvIHRoZSBjdXJyZW50Ci0gICAgICogcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmZsb2F0PC9jb2RlPnMKLSAgICAgKiB3cml0dGVuLgorICAgICAqIFdyaXRlcyBmbG9hdHMgZnJvbSB0aGUgZ2l2ZW4gZmxvYXQgYXJyYXkgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kCisgICAgICogaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIGZsb2F0cyB3cml0dGVuLgogICAgICAqIDxwPgogICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwotICAgICAqIDxjb2RlPnB1dChzcmMsIDAsIHNyYy5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgcHV0KHNyYywgMCwgc3JjLmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgZmxvYXQgYXJyYXkKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGZsb2F0IGFycmF5LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiBpcyBsZXNzIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5zcmMubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSByZW1haW5pbmcoKX0gaXMgbGVzcyB0aGFuIHtAY29kZSBzcmMubGVuZ3RofS4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgRmxvYXRCdWZmZXIgcHV0KGZsb2F0W10gc3JjKSB7CiAgICAgICAgIHJldHVybiBwdXQoc3JjLCAwLCBzcmMubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+ZmxvYXQ8L2NvZGU+cyBpbiB0aGUgZ2l2ZW4gZmxvYXQgYXJyYXksIHN0YXJ0aW5nIGZyb20gdGhlCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCwgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieQotICAgICAqIHRoZSBudW1iZXIgb2YgPGNvZGU+ZmxvYXQ8L2NvZGU+cyB3cml0dGVuLgotICAgICAqCisgICAgICogV3JpdGVzIGZsb2F0cyBmcm9tIHRoZSBnaXZlbiBmbG9hdCBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogb2Zmc2V0LCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyCisgICAgICogb2YgZmxvYXRzIHdyaXR0ZW4uCisgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgVGhlIHNvdXJjZSBmbG9hdCBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmbG9hdCBhcnJheS4KICAgICAgKiBAcGFyYW0gb2ZmCi0gICAgICogICAgICAgICAgICBUaGUgb2Zmc2V0IG9mIGZsb2F0IGFycmF5LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBubwotICAgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIDxjb2RlPnNyYy5sZW5ndGg8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIGZsb2F0IGFycmF5LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90CisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIHNyYy5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgPGNvZGU+ZmxvYXQ8L2NvZGU+cyB0byB3cml0ZSwgbXVzdCBiZSBubyBsZXNzCi0gICAgICogICAgICAgICAgICB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5zcmMubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZmxvYXRzIHRvIHdyaXRlLCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZAorICAgICAqICAgICAgICAgICAgbm8gZ3JlYXRlciB0aGFuIHtAY29kZSBzcmMubGVuZ3RoIC0gb2ZmfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+bGVuPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSByZW1haW5pbmcoKX0gaXMgbGVzcyB0aGFuIHtAY29kZSBsZW59LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5vZmY8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBvZmZ9IG9yIHtAY29kZSBsZW59IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZsb2F0QnVmZmVyIHB1dChmbG9hdFtdIHNyYywgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbGVuZ3RoID0gc3JjLmxlbmd0aDsKICAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCAobG9uZylvZmYgKyAobG9uZylsZW4gPiBsZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgaWYgKGxlbiA+IHJlbWFpbmluZygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtNDg0LDIwICs1MTUsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYWxsIHRoZSByZW1haW5pbmcgPGNvZGU+ZmxvYXQ8L2NvZGU+cyBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPgotICAgICAqIGZsb2F0IGJ1ZmZlciB0byB0aGlzIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24sIGFuZCBpbmNyZWFzZSBib3RoCi0gICAgICogYnVmZmVycycgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5mbG9hdDwvY29kZT5zIGNvcGllZC4KLSAgICAgKgorICAgICAqIFdyaXRlcyBhbGwgdGhlIHJlbWFpbmluZyBmbG9hdHMgb2YgdGhlIHtAY29kZSBzcmN9IGZsb2F0IGJ1ZmZlciB0byB0aGlzCisgICAgICogYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbiwgYW5kIGluY3JlYXNlcyBib3RoIGJ1ZmZlcnMnIHBvc2l0aW9uIGJ5IHRoZQorICAgICAqIG51bWJlciBvZiBmbG9hdHMgY29waWVkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgZmxvYXQgYnVmZmVyCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmbG9hdCBidWZmZXIuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+c3JjLnJlbWFpbmluZygpPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gdGhpcwotICAgICAqICAgICAgICAgICAgICAgIGJ1ZmZlcidzIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzcmMucmVtYWluaW5nKCl9IGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGJ1ZmZlcidzCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIHJlbWFpbmluZygpfS4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnNyYzwvY29kZT4gaXMgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgc3JjfSBpcyB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmxvYXRCdWZmZXIgcHV0KEZsb2F0QnVmZmVyIHNyYykgewogICAgICAgICBpZiAoc3JjID09IHRoaXMpIHsKQEAgLTUxMyw0MiArNTQ1LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBmbG9hdCB0byB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoaXMgYnVmZmVyIGFuZCB0aGUgcG9zaXRpb24gaXMKLSAgICAgKiBub3QgY2hhbmdlZC4KLSAgICAgKgorICAgICAqIFdyaXRlcyBhIGZsb2F0IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXI7IHRoZSBwb3NpdGlvbiBpcyBub3QKKyAgICAgKiBjaGFuZ2VkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gdGhlIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gdGhlIGxpbWl0LgogICAgICAqIEBwYXJhbSBmCi0gICAgICogICAgICAgICAgICBUaGUgZmxvYXQgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBpbmRleCBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgaW5kZXggaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRmxvYXRCdWZmZXIgcHV0KGludCBpbmRleCwgZmxvYXQgZik7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncwotICAgICAqIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiwgYW5kIGl0cyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0bwotICAgICAqIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlCi0gICAgICogMCwgbGltaXQgd2lsbCBiZSBpdHMgY2FwYWNpdHksIGFuZCBpdHMgbWFyayBpcyB1bnNldC4gVGhlIG5ldyBidWZmZXIncwotICAgICAqIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyLjwvcD4KKyAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncyB7QGNvZGUgcmVtYWluaW5nKCl9LAorICAgICAqIGFuZCBpdHMgemVybyBwb3NpdGlvbiB3aWxsIGNvcnJlc3BvbmQgdG8gdGhpcyBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSAwLCBsaW1pdCB3aWxsIGJlIGl0cyBjYXBhY2l0eSwgYW5kIGl0cworICAgICAqIG1hcmsgaXMgY2xlYXJlZC4gVGhlIG5ldyBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlCisgICAgICogc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucwotICAgICAqIGVpdGhlciBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLgotICAgICAqIFRoZSB0d28gYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgorICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuIFRoZSB0d28gYnVmZmVyJ3MKKyAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBGbG9hdEJ1ZmZlciBzbGljZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGlzIGZsb2F0IGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhpcyBmbG9hdCBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoaXMgZmxvYXQgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIGZsb2F0IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vSW50QnVmZmVyLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9JbnRCdWZmZXIuamF2YQppbmRleCBiYTdhYzE4Li43YTE5ZGZkIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9JbnRCdWZmZXIuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9JbnRCdWZmZXIuamF2YQpAQCAtMTgsOSArMTgsMTAgQEAKIHBhY2thZ2UgamF2YS5uaW87CiAKIC8qKgotICogQSBidWZmZXIgb2YgPGNvZGU+aW50PC9jb2RlPnMuCisgKiBBIGJ1ZmZlciBvZiBpbnRzLgogICogPHA+CiAgKiBBIGludCBidWZmZXIgY2FuIGJlIGNyZWF0ZWQgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgd2F5czoKKyAqIDwvcD4KICAqIDx1bD4KICAqIDxsaT57QGxpbmsgI2FsbG9jYXRlKGludCkgQWxsb2NhdGV9IGEgbmV3IGludCBhcnJheSBhbmQgY3JlYXRlIGEgYnVmZmVyCiAgKiBiYXNlZCBvbiBpdDs8L2xpPgpAQCAtMjgsMTggKzI5LDIwIEBACiAgKiA8bGk+VXNlIHtAbGluayBqYXZhLm5pby5CeXRlQnVmZmVyI2FzSW50QnVmZmVyKCkgQnl0ZUJ1ZmZlci5hc0ludEJ1ZmZlcn0gdG8KICAqIGNyZWF0ZSBhIGludCBidWZmZXIgYmFzZWQgb24gYSBieXRlIGJ1ZmZlci48L2xpPgogICogPC91bD4KLSAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnRCdWZmZXIgZXh0ZW5kcyBCdWZmZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPEludEJ1ZmZlcj4gewogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGludCBidWZmZXIgYmFzZWQgb24gYSBuZXcgYWxsb2NhdGVkIGludCBhcnJheS4KLSAgICAgKgorICAgICAqIENyZWF0ZXMgYW4gaW50IGJ1ZmZlciBiYXNlZCBvbiBhIG5ld2x5IGFsbG9jYXRlZCBpbnQgYXJyYXkuCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICBUaGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIKLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGludCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXBhY2l0eSBvZiB0aGUgbmV3IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGludCBidWZmZXIuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiA8Y29kZT5jYXBhY2l0eTwvY29kZT4gaXMgbGVzcyB0aGFuIHplcm8KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY2FwYWNpdHl9IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW50QnVmZmVyIGFsbG9jYXRlKGludCBjYXBhY2l0eSkgewogICAgICAgICBpZiAoY2FwYWNpdHkgPCAwKSB7CkBAIC01MiwzNiArNTUsMzcgQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IGludCBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGludCBhcnJheS4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT53cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgd3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKX0uCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgaW50IGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGludCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgYXJyYXkgd2hpY2ggdGhlIG5ldyBidWZmZXIgd2lsbCBiZSBiYXNlZCBvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGludCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbnRCdWZmZXIgd3JhcChpbnRbXSBhcnJheSkgewogICAgICAgICByZXR1cm4gd3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIG5ldyBhIGludCBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGludCBhcnJheS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IGludCBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGludCBhcnJheS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUgPGNvZGU+c3RhcnQ8L2NvZGU+LCBsaW1pdCB3aWxsIGJlCi0gICAgICogPGNvZGU+c3RhcnQgKyBsZW48L2NvZGU+LCBjYXBhY2l0eSB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSB7QGNvZGUgc3RhcnR9LCBsaW1pdCB3aWxsIGJlCisgICAgICoge0Bjb2RlIHN0YXJ0ICsgbGVufSwgY2FwYWNpdHkgd2lsbCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbnQgYXJyYXkgd2hpY2ggdGhlIG5ldyBidWZmZXIgd2lsbCBiZSBiYXNlZCBvbgorICAgICAqICAgICAgICAgICAgdGhlIGludCBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIHN0YXJ0IGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmFycmF5Lmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBhcnJheS5sZW5ndGh9CiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgVGhlIGxlbmd0aCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5hcnJheS5sZW5ndGggLSBzdGFydDwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGludCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBub3QgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgYXJyYXkubGVuZ3RoIC0gc3RhcnR9LgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgaW50IGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEludEJ1ZmZlciB3cmFwKGludFtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW4pIHsKICAgICAgICAgICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewpAQCAtOTksMTAgKzEwMywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5JbnRCdWZmZXI8L2NvZGU+IHdpdGggZ2l2ZW4gY2FwYWNpdHkuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBJbnRCdWZmZXJ9IHdpdGggZ2l2ZW4gY2FwYWNpdHkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIFRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlci4KICAgICAgKi8KICAgICBJbnRCdWZmZXIoaW50IGNhcGFjaXR5KSB7CiAgICAgICAgIHN1cGVyKGNhcGFjaXR5KTsKQEAgLTExMiwxMyArMTE2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZiB0aGVyZSdzIG9uZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGludCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIFJldHVybnMgdGhlIGludCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiwgaWYgdGhlcmUgaXMgb25lLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGludCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbi4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkb25seQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGFuIGFycmF5LCBidXQgaXQgaXMgcmVhZC1vbmx5LgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYW4gYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYW4gYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludFtdIGFycmF5KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXkoKTsKQEAgLTEyNiwxNyArMTMxLDE4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGludCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiwgaWYKLSAgICAgKiB0aGVyZSdzIG9uZS4KKyAgICAgKiB0aGVyZSBpcyBvbmUuCiAgICAgICogPHA+CiAgICAgICogVGhlIG9mZnNldCBpcyB0aGUgaW5kZXggb2YgdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIHRoZSB6ZXJvIHBvc2l0aW9uIG9mCiAgICAgICogdGhlIGJ1ZmZlci4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvZmZzZXQgb2YgdGhlIGludCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgaW50IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkLW9ubHkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGFycmF5T2Zmc2V0KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXlPZmZzZXQoKTsKQEAgLTE1OSw5OSArMTY1LDEwMyBAQAogICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmVhZG9ubHkgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgogICAgICAqIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5ldyBpbnN0YW5jZSwgZXZlbiB0aGlzIGJ1ZmZlcgotICAgICAqIGlzIHJlYWRvbmx5IGl0c2VsZi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrCi0gICAgICogYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyLgorICAgICAqIGlzIHJlYWQtb25seSBpdHNlbGYuIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyaworICAgICAqIGFyZSB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyB0aGlzIGJ1ZmZlcidzCi0gICAgICogY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBuZXcgYnVmZmVyLiBUaGUgdHdvIGJ1ZmZlcidzCi0gICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgdGhpcworICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgbmV3IGJ1ZmZlci4gVGhlIHR3bworICAgICAqIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIHJlYWRvbmx5IHZlcnNpb24gb2YgdGhpcyBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhIHJlYWQtb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpOwogCiAgICAgLyoqCiAgICAgICogQ29tcGFjdHMgdGhpcyBpbnQgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSByZW1haW5pbmcgPGNvZGU+aW50PC9jb2RlPnMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUKLSAgICAgKiBidWZmZXIsIHN0YXJpbmcgZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8KLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT47IHRoZSBsaW1pdCBpcyBzZXQgdG8gY2FwYWNpdHk7IHRoZSBtYXJrIGlzCi0gICAgICogY2xlYXJlZC4KKyAgICAgKiBUaGUgcmVtYWluaW5nIGludHMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUgYnVmZmVyLCBzdGFydGluZyBmcm9tCisgICAgICogcG9zaXRpb24gemVyby4gVGhlbiB0aGUgcG9zaXRpb24gaXMgc2V0IHRvIHtAY29kZSByZW1haW5pbmcoKX07IHRoZQorICAgICAqIGxpbWl0IGlzIHNldCB0byBjYXBhY2l0eTsgdGhlIG1hcmsgaXMgY2xlYXJlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSW50QnVmZmVyIGNvbXBhY3QoKTsKIAogICAgIC8qKgotICAgICAqIENvbXBhcmUgdGhlIHJlbWFpbmluZyA8Y29kZT5pbnQ8L2NvZGU+cyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyIGludAotICAgICAqIGJ1ZmZlcidzIHJlbWFpbmluZyA8Y29kZT5pbnQ8L2NvZGU+cy4KLSAgICAgKgorICAgICAqIENvbXBhcmVzIHRoZSByZW1haW5pbmcgaW50cyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyIGludCBidWZmZXIncworICAgICAqIHJlbWFpbmluZyBpbnRzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlckJ1ZmZlcgotICAgICAqICAgICAgICAgICAgQW5vdGhlciBpbnQgYnVmZmVyCi0gICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIDxjb2RlPm90aGVyPC9jb2RlPjsgMCBpZgotICAgICAqICAgICAgICAgdGhpcyBlcXVhbHMgdG8gPGNvZGU+b3RoZXI8L2NvZGU+OyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoaXMgaXMKLSAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5vdGhlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgaW50IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhpcyBpcyBsZXNzIHRoYW4ge0Bjb2RlIG90aGVyfTsgMCBpZiB0aGlzCisgICAgICogICAgICAgICBlcXVhbHMgdG8ge0Bjb2RlIG90aGVyfTsgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGlzIGlzIGdyZWF0ZXIKKyAgICAgKiAgICAgICAgIHRoYW4ge0Bjb2RlIG90aGVyfS4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPm90aGVyPC9jb2RlPiBpcyBub3QgYSBpbnQgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIG90aGVyfSBpcyBub3QgYW4gaW50IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhJbnRCdWZmZXIgb3RoZXJCdWZmZXIpIHsKICAgICAgICAgaW50IGNvbXBhcmVSZW1haW5pbmcgPSAocmVtYWluaW5nKCkgPCBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKSkgPyByZW1haW5pbmcoKQogICAgICAgICAgICAgICAgIDogb3RoZXJCdWZmZXIucmVtYWluaW5nKCk7CiAgICAgICAgIGludCB0aGlzUG9zID0gcG9zaXRpb247CiAgICAgICAgIGludCBvdGhlclBvcyA9IG90aGVyQnVmZmVyLnBvc2l0aW9uOwotICAgICAgICBpbnQgdGhpc0J5dGUsIG90aGVyQnl0ZTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIGludCB0aGlzSW50LCBvdGhlckludDsKICAgICAgICAgd2hpbGUgKGNvbXBhcmVSZW1haW5pbmcgPiAwKSB7Ci0gICAgICAgICAgICB0aGlzQnl0ZSA9IGdldCh0aGlzUG9zKTsKLSAgICAgICAgICAgIG90aGVyQnl0ZSA9IG90aGVyQnVmZmVyLmdldChvdGhlclBvcyk7Ci0gICAgICAgICAgICBpZiAodGhpc0J5dGUgIT0gb3RoZXJCeXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNCeXRlIDwgb3RoZXJCeXRlID8gLTEgOiAxOworICAgICAgICAgICAgdGhpc0ludCA9IGdldCh0aGlzUG9zKTsKKyAgICAgICAgICAgIG90aGVySW50ID0gb3RoZXJCdWZmZXIuZ2V0KG90aGVyUG9zKTsKKyAgICAgICAgICAgIGlmICh0aGlzSW50ICE9IG90aGVySW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNJbnQgPCBvdGhlckludCA/IC0xIDogMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRoaXNQb3MrKzsKICAgICAgICAgICAgIG90aGVyUG9zKys7CiAgICAgICAgICAgICBjb21wYXJlUmVtYWluaW5nLS07CiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gcmVtYWluaW5nKCkgLSBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgogICAgICAqIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIHRoZSBzYW1lCi0gICAgICogYXMgdGhpcyBidWZmZXIuIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyCi0gICAgICogYXJlIHNhbWUgYXMgdGhpcyBidWZmZXIgdG9vLgorICAgICAqIGFzIHRoaXMgYnVmZmVyLiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIKKyAgICAgKiBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCisgICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgogICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuIFRoZSB0d28gYnVmZmVyJ3MKICAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEludEJ1ZmZlciBkdXBsaWNhdGUoKTsKIAogICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBpbnQgYnVmZmVyIGVxdWFscyB0byBhbm90aGVyIG9iamVjdC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGludCBidWZmZXIgaXMgZXF1YWwgdG8gYW5vdGhlciBvYmplY3QuCiAgICAgICogPHA+Ci0gICAgICogSWYgPGNvZGU+b3RoZXI8L2NvZGU+IGlzIG5vdCBhIGludCBidWZmZXIsIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogSWYge0Bjb2RlIG90aGVyfSBpcyBub3QgYSBpbnQgYnVmZmVyIHRoZW4ge0Bjb2RlIGZhbHNlfSBpcyByZXR1cm5lZC4gVHdvCisgICAgICogaW50IGJ1ZmZlcnMgYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZWlyIHJlbWFpbmluZyBpbnRzIGFyZSBleGFjdGx5IHRoZQorICAgICAqIHNhbWUuIFBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIG5vdCBjb25zaWRlcmVkLgogICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUd28gaW50IGJ1ZmZlcnMgYXJlIGVxdWFscyBpZiwgYW5kIG9ubHkgaWYsIHRoZWlyIHJlbWFpbmluZwotICAgICAqIDxjb2RlPmludDwvY29kZT5zIGFyZSBleGFjdGx5IHRoZSBzYW1lLiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZAotICAgICAqIG1hcmsgYXJlIG5vdCBjb25zaWRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlcgotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCBhZ2FpbnN0Ci0gICAgICogQHJldHVybiBXaGV0aGVyIHRoaXMgaW50IGJ1ZmZlciBlcXVhbHMgdG8gYW5vdGhlciBvYmplY3QuCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGludCBidWZmZXIuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnQgYnVmZmVyIGlzIGVxdWFsIHRvIHtAY29kZSBvdGhlcn0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CiAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgSW50QnVmZmVyKSkgewpAQCAtMjc0LDU0ICsyODQsNTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSAxLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgaW50IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSAxLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGludCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA8Y29kZT5pbnQ8L2NvZGU+cyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZAotICAgICAqIGludCBhcnJheSBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgPGNvZGU+aW50PC9jb2RlPnMKLSAgICAgKiByZWFkLgorICAgICAqIFJlYWRzIGludHMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgaW50IGFycmF5IGFuZAorICAgICAqIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBpbnRzIHJlYWQuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+Z2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIGdldChkZXN0LCAwLCBkZXN0Lmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBkZXN0Ci0gICAgICogICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gaW50IGFycmF5Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGludCBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgPGNvZGU+ZGVzdC5sZW5ndGg8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBkZXN0Lmxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSByZW1haW5pbmcoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludEJ1ZmZlciBnZXQoaW50W10gZGVzdCkgewogICAgICAgICByZXR1cm4gZ2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA8Y29kZT5pbnQ8L2NvZGU+cyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZAotICAgICAqIGludCBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwgYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbgotICAgICAqIGJ5IHRoZSBudW1iZXIgb2YgPGNvZGU+aW50PC9jb2RlPnMgcmVhZC4KLSAgICAgKgorICAgICAqIFJlYWRzIGludHMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgaW50IGFycmF5LAorICAgICAqIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQsIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZQorICAgICAqIG51bWJlciBvZiBpbnRzIHJlYWQuCisgICAgICogCiAgICAgICogQHBhcmFtIGRlc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgaW50IGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGludCBhcnJheS4KICAgICAgKiBAcGFyYW0gb2ZmCi0gICAgICogICAgICAgICAgICBUaGUgb2Zmc2V0IG9mIHRoZSBpbnQgYXJyYXksIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCi0gICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+ZGVzdC5sZW5ndGg8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBpbnQgYXJyYXksIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBub3QKKyAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZGVzdC5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgPGNvZGU+aW50PC9jb2RlPnMgdG8gcmVhZCwgbXVzdCBiZSBubyBsZXNzCi0gICAgICogICAgICAgICAgICB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5kZXN0Lmxlbmd0aCAtIG9mZjwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGludHMgdG8gcmVhZCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm90CisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIGRlc3QubGVuZ3RoIC0gb2ZmfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5vZmY8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBvZmZ9IG9yIHtAY29kZSBsZW59IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5sZW48L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBsZW59IGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgcmVtYWluaW5nKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnRCdWZmZXIgZ2V0KGludFtdIGRlc3QsIGludCBvZmYsIGludCBsZW4pIHsKICAgICAgICAgaW50IGxlbmd0aCA9IGRlc3QubGVuZ3RoOwpAQCAtMzM4LDM1ICszNDcsMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGFuZCB0aGUgcG9zaXRpb24gaXMgbm90IGNoYW5nZWQuCi0gICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIGludCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4OyB0aGUgcG9zaXRpb24gaXMgbm90IGNoYW5nZWQuCisgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBsaW1pdAotICAgICAqIEByZXR1cm4gQSBpbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiBsaW1pdC4KKyAgICAgKiBAcmV0dXJuIGFuIGludCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGluZGV4IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBpbmRleCBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0KGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBpbnQgYXJyYXkgYW5kIGlzIHJlYWQvd3JpdGUuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBidWZmZXIgaXMgcmVhZG9ubHksIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBXaGV0aGVyIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgaW50IGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgaW50IGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgaW50IGFycmF5IGFuZCBwcm92aWRlcworICAgICAqICAgICAgICAgcmVhZC93cml0ZSBhY2Nlc3MsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FycmF5KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkSGFzQXJyYXkoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIYXNoIGNvZGUgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSByZW1haW5pbmcgPGNvZGU+aW50PC9jb2RlPnMuCi0gICAgICogPHA+Ci0gICAgICogUG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBkb24ndCBhZmZlY3QgdGhlIGhhc2ggY29kZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBoYXNoIGNvZGUgY2FsY3VsYXRlZCBmcm9tIHRoZSByZW1haW5pbmcgPGNvZGU+aW50PC9jb2RlPnMuCisgICAgICogQ2FsY3VsYXRlcyB0aGlzIGJ1ZmZlcidzIGhhc2ggY29kZSBmcm9tIHRoZSByZW1haW5pbmcgY2hhcnMuIFRoZQorICAgICAqIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgZG9uJ3QgYWZmZWN0IHRoZSBoYXNoIGNvZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIGludHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaW50IG15UG9zaXRpb24gPSBwb3NpdGlvbjsKQEAgLTM3OCwxMTUgKzM4NiwxMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBidWZmZXIgaXMgZGlyZWN0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4gQSBkaXJlY3QgYnVmZmVyIHdpbGwgdHJ5IGl0cworICAgICAqIGJlc3QgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbmF0aXZlIG1lbW9yeSBBUElzIGFuZCBpdCBtYXkgbm90IHN0YXkgaW4gdGhlCisgICAgICogSmF2YSBoZWFwLCBzbyBpdCBpcyBub3QgYWZmZWN0ZWQgYnkgZ2FyYmFnZSBjb2xsZWN0aW9uLgogICAgICAqIDxwPgotICAgICAqIEEgaW50IGJ1ZmZlciBpcyBkaXJlY3QsIGlmIGl0IGlzIGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIgYW5kIHRoZSBieXRlCisgICAgICogQW4gaW50IGJ1ZmZlciBpcyBkaXJlY3QgaWYgaXQgaXMgYmFzZWQgb24gYSBieXRlIGJ1ZmZlciBhbmQgdGhlIGJ5dGUKICAgICAgKiBidWZmZXIgaXMgZGlyZWN0LgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QuCi0gICAgICovCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBidWZmZXIgaXMgZGlyZWN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXJlY3QoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcKLSAgICAgKiA8Y29kZT5pbnQ8L2NvZGU+cyBmcm9tL3RvIDxjb2RlPmJ5dGU8L2NvZGU+cy4KKyAgICAgKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nIGludHMgZnJvbS90bworICAgICAqIGJ5dGVzLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyLCB0aGVuIGFsd2F5cyByZXR1cm4gdGhlCiAgICAgICogcGxhdGZvcm0ncyBuYXRpdmUgYnl0ZSBvcmRlci4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nCi0gICAgICogICAgICAgICA8Y29kZT5pbnQ8L2NvZGU+cyBmcm9tL3RvIDxjb2RlPmJ5dGU8L2NvZGU+cy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nIGludHMgZnJvbS90bworICAgICAqICAgICAgICAgYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVPcmRlciBvcmRlcigpOwogCiAgICAgLyoqCi0gICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIDxjb2RlPmFycmF5KCk8L2NvZGU+LgorICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSB7QGNvZGUgYXJyYXkoKX0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHNlZSA8Y29kZT5hcnJheSgpPC9jb2RlPgorICAgICAqIEByZXR1cm4gc2VlIHtAY29kZSBhcnJheSgpfQogICAgICAqLwogICAgIGFic3RyYWN0IGludFtdIHByb3RlY3RlZEFycmF5KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXlPZmZzZXQoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheU9mZnNldCgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5T2Zmc2V0KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGFycmF5T2Zmc2V0KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3QgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+aGFzQXJyYXkoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBoYXNBcnJheSgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmhhc0FycmF5KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGhhc0FycmF5KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3QgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBpbnQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieQotICAgICAqIDEuCi0gICAgICoKKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGludCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbgorICAgICAqIGJ5IDEuCisgICAgICogCiAgICAgICogQHBhcmFtIGkKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbnQgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgaW50IHRvIHdyaXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgIGlmIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSW50QnVmZmVyIHB1dChpbnQgaSk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+aW50PC9jb2RlPnMgaW4gdGhlIGdpdmVuIGludCBhcnJheSB0byB0aGUgY3VycmVudAotICAgICAqIHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5pbnQ8L2NvZGU+cwotICAgICAqIHdyaXR0ZW4uCisgICAgICogV3JpdGVzIGludHMgZnJvbSB0aGUgZ2l2ZW4gaW50IGFycmF5IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZAorICAgICAqIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBpbnRzIHdyaXR0ZW4uCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+cHV0KHNyYywgMCwgc3JjLmxlbmd0aCk8L2NvZGU+LgorICAgICAqIHtAY29kZSBwdXQoc3JjLCAwLCBzcmMubGVuZ3RoKX0uCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgVGhlIHNvdXJjZSBpbnQgYXJyYXkKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGludCBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+c3JjLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgcmVtYWluaW5nKCl9IGlzIGxlc3MgdGhhbiB7QGNvZGUgc3JjLmxlbmd0aH0uCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEludEJ1ZmZlciBwdXQoaW50W10gc3JjKSB7CiAgICAgICAgIHJldHVybiBwdXQoc3JjLCAwLCBzcmMubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgPGNvZGU+aW50PC9jb2RlPnMgaW4gdGhlIGdpdmVuIGludCBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgb2Zmc2V0LCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uIGJ5Ci0gICAgICogdGhlIG51bWJlciBvZiA8Y29kZT5pbnQ8L2NvZGU+cyB3cml0dGVuLgotICAgICAqCisgICAgICogV3JpdGVzIGludHMgZnJvbSB0aGUgZ2l2ZW4gaW50IGFycmF5LCBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LAorICAgICAqIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgaW50cworICAgICAqIHdyaXR0ZW4uCisgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgVGhlIHNvdXJjZSBpbnQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgaW50IGFycmF5LgogICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgaW50IGFycmF5LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBubwotICAgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIDxjb2RlPnNyYy5sZW5ndGg8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIGludCBhcnJheSwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyCisgICAgICogICAgICAgICAgICB0aGFuIHtAY29kZSBzcmMubGVuZ3RofS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIDxjb2RlPmludDwvY29kZT5zIHRvIHdyaXRlLCBtdXN0IGJlIG5vIGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPnNyYy5sZW5ndGggLSBvZmY8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBpbnRzIHRvIHdyaXRlLCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBub3QKKyAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgc3JjLmxlbmd0aCAtIG9mZn0uCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+IGlzIGxlc3MgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPmxlbjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgcmVtYWluaW5nKCl9IGlzIGxlc3MgdGhhbiB7QGNvZGUgbGVufS4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+b2ZmPC9jb2RlPiBvciA8Y29kZT5sZW48L2NvZGU+IGlzCi0gICAgICogICAgICAgICAgICAgICAgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGVpdGhlciB7QGNvZGUgb2ZmfSBvciB7QGNvZGUgbGVufSBpcyBpbnZhbGlkLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnRCdWZmZXIgcHV0KGludFtdIHNyYywgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbGVuZ3RoID0gc3JjLmxlbmd0aDsKICAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCAobG9uZylsZW4gKyAobG9uZylvZmYgPiBsZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgaWYgKGxlbiA+IHJlbWFpbmluZygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtNDk3LDIwICs1MDgsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYWxsIHRoZSByZW1haW5pbmcgPGNvZGU+aW50PC9jb2RlPnMgb2YgdGhlIDxjb2RlPnNyYzwvY29kZT4KLSAgICAgKiBpbnQgYnVmZmVyIHRvIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbiwgYW5kIGluY3JlYXNlIGJvdGggYnVmZmVycycKLSAgICAgKiBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmludDwvY29kZT5zIGNvcGllZC4KLSAgICAgKgorICAgICAqIFdyaXRlcyBhbGwgdGhlIHJlbWFpbmluZyBpbnRzIG9mIHRoZSB7QGNvZGUgc3JjfSBpbnQgYnVmZmVyIHRvIHRoaXMKKyAgICAgKiBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLCBhbmQgaW5jcmVhc2VzIGJvdGggYnVmZmVycycgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIGludHMgY29waWVkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgaW50IGJ1ZmZlcgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgaW50IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5zcmMucmVtYWluaW5nKCk8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgYnVmZmVyJ3MgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHNyYy5yZW1haW5pbmcoKX0gaXMgZ3JlYXRlciB0aGFuIHRoaXMgYnVmZmVyJ3MKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgcmVtYWluaW5nKCl9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+c3JjPC9jb2RlPiBpcyB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzcmN9IGlzIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnRCdWZmZXIgcHV0KEludEJ1ZmZlciBzcmMpIHsKICAgICAgICAgaWYgKHNyYyA9PSB0aGlzKSB7CkBAIC01MjYsNDQgKzUzOCw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgaW50IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIgYW5kIHRoZSBwb3NpdGlvbiBpcyBub3QKKyAgICAgKiBXcml0ZSBhIGludCB0byB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoaXMgYnVmZmVyOyB0aGUgcG9zaXRpb24gaXMgbm90CiAgICAgICogY2hhbmdlZC4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gdGhlIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gdGhlIGxpbWl0LgogICAgICAqIEBwYXJhbSBpCi0gICAgICogICAgICAgICAgICBUaGUgaW50IHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGludCB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGluZGV4IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBpbmRleCBpcyBpbnZhbGlkLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRCdWZmZXIgcHV0KGludCBpbmRleCwgaW50IGkpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBzbGljZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHNsaWNlZCBidWZmZXIncyBjYXBhY2l0eSB3aWxsIGJlIHRoaXMgYnVmZmVyJ3MKLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4sIGFuZCBpdHMgemVybyBwb3NpdGlvbiB3aWxsIGNvcnJlc3BvbmQgdG8KLSAgICAgKiB0aGlzIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24uIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSAwLAotICAgICAqIGxpbWl0IHdpbGwgYmUgaXRzIGNhcGFjaXR5LCBhbmQgaXRzIG1hcmsgaXMgdW5zZXQuIFRoZSBuZXcgYnVmZmVyJ3MKLSAgICAgKiByZWFkb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUgc2FtZSBhcyB0aGlzIGJ1ZmZlci4KKyAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncyB7QGNvZGUgcmVtYWluaW5nKCl9LAorICAgICAqIGFuZCBpdHMgemVybyBwb3NpdGlvbiB3aWxsIGNvcnJlc3BvbmQgdG8gdGhpcyBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSAwLCBsaW1pdCB3aWxsIGJlIGl0cyBjYXBhY2l0eSwgYW5kIGl0cworICAgICAqIG1hcmsgaXMgY2xlYXJlZC4gVGhlIG5ldyBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlCisgICAgICogc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCiAgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncwogICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzbGljZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEludEJ1ZmZlciBzbGljZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGlzIGludCBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoaXMgaW50IGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudHMgb2YgdGhlIHN0YXRlIG9mIHRoaXMgaW50IGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudHMgb2YgdGhlIHN0YXRlIG9mIHRoaXMgaW50IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vSW52YWxpZE1hcmtFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0ludmFsaWRNYXJrRXhjZXB0aW9uLmphdmEKaW5kZXggMTg2MDU3Ni4uNTMwZDljZiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vSW52YWxpZE1hcmtFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9JbnZhbGlkTWFya0V4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNiArMTgsMTkgQEAKIAogCiAvKioKLSAqIEEgPGNvZGU+SW52YWxpZE1hcmtFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB3aGVuIDxjb2RlPnJlc2V0KCk8L2NvZGU+Ci0gKiBpcyBjYWxsZWQgb24gYSBidWZmZXIsIGJ1dCB0aGVyZSBpcyBubyBtYXJrIHNldCBwcmV2aW91c2x5LgorICogQW4ge0Bjb2RlIEludmFsaWRNYXJrRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB7QGNvZGUgcmVzZXQoKX0gaXMgY2FsbGVkIG9uIGEKKyAqIGJ1ZmZlciwgYnV0IG5vIG1hcmsgaGFzIGJlZW4gc2V0IHByZXZpb3VzbHkuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW52YWxpZE1hcmtFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTY5ODMyOTcxMDQzODUxMDc3NEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkludmFsaWRNYXJrRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHtAY29kZSBJbnZhbGlkTWFya0V4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludmFsaWRNYXJrRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vTG9uZ0J1ZmZlci5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vTG9uZ0J1ZmZlci5qYXZhCmluZGV4IGE0NGY1NmEuLmIwYmY3ZWEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0xvbmdCdWZmZXIuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9Mb25nQnVmZmVyLmphdmEKQEAgLTE4LDkgKzE4LDEwIEBACiBwYWNrYWdlIGphdmEubmlvOwogCiAvKioKLSAqIEEgYnVmZmVyIG9mIDxjb2RlPmxvbmc8L2NvZGU+cy4KKyAqIEEgYnVmZmVyIG9mIGxvbmdzLgogICogPHA+CiAgKiBBIGxvbmcgYnVmZmVyIGNhbiBiZSBjcmVhdGVkIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiA8L3A+CiAgKiA8dWw+CiAgKiA8bGk+e0BsaW5rICNhbGxvY2F0ZShpbnQpIEFsbG9jYXRlfSBhIG5ldyBsb25nIGFycmF5IGFuZCBjcmVhdGUgYSBidWZmZXIKICAqIGJhc2VkIG9uIGl0OzwvbGk+CkBAIC0yOSwxOCArMzAsMjAgQEAKICAqIDxsaT5Vc2Uge0BsaW5rIGphdmEubmlvLkJ5dGVCdWZmZXIjYXNMb25nQnVmZmVyKCkgQnl0ZUJ1ZmZlci5hc0xvbmdCdWZmZXJ9CiAgKiB0byBjcmVhdGUgYSBsb25nIGJ1ZmZlciBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyLjwvbGk+CiAgKiA8L3VsPgotICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExvbmdCdWZmZXIgZXh0ZW5kcyBCdWZmZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPExvbmdCdWZmZXI+IHsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsb25nIGJ1ZmZlciBiYXNlZCBvbiBhIG5ldyBhbGxvY2F0ZWQgbG9uZyBhcnJheS4KLSAgICAgKgorICAgICAqIENyZWF0ZXMgYSBsb25nIGJ1ZmZlciBiYXNlZCBvbiBhIG5ld2x5IGFsbG9jYXRlZCBsb25nIGFycmF5LgorICAgICAqIAogICAgICAqIEBwYXJhbSBjYXBhY2l0eQotICAgICAqICAgICAgICAgICAgVGhlIGNhcGFjaXR5IG9mIHRoZSBuZXcgYnVmZmVyCi0gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb25nIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGNhcGFjaXR5IG9mIHRoZSBuZXcgYnVmZmVyLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgbG9uZyBidWZmZXIuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiA8Y29kZT5jYXBhY2l0eTwvY29kZT4gaXMgbGVzcyB0aGFuIHplcm8KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY2FwYWNpdHl9IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTG9uZ0J1ZmZlciBhbGxvY2F0ZShpbnQgY2FwYWNpdHkpIHsKICAgICAgICAgaWYgKGNhcGFjaXR5IDwgMCkgewpAQCAtNTMsMzYgKzU2LDM3IEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyBsb25nIGJ1ZmZlciBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gbG9uZyBhcnJheS4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT53cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgd3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKX0uCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgbG9uZyBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uCi0gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb25nIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgYXJyYXkgd2hpY2ggdGhlIG5ldyBidWZmZXIgd2lsbCBiZSBiYXNlZCBvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGxvbmcgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTG9uZ0J1ZmZlciB3cmFwKGxvbmdbXSBhcnJheSkgewogICAgICAgICByZXR1cm4gd3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIG5ldyBhIGxvbmcgYnVmZmVyIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBsb25nIGFycmF5LgorICAgICAqIENyZWF0ZXMgYSBuZXcgbG9uZyBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGxvbmcgYXJyYXkuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIDxjb2RlPnN0YXJ0PC9jb2RlPiwgbGltaXQgd2lsbCBiZQotICAgICAqIDxjb2RlPnN0YXJ0ICsgbGVuPC9jb2RlPiwgY2FwYWNpdHkgd2lsbCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUge0Bjb2RlIHN0YXJ0fSwgbGltaXQgd2lsbCBiZQorICAgICAqIHtAY29kZSBzdGFydCArIGxlbn0sIGNhcGFjaXR5IHdpbGwgYmUgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogICAgICAgICAgICBUaGUgbG9uZyBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgVGhlIHN0YXJ0IGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmFycmF5Lmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBhcnJheS5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBsZW5ndGgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgPGNvZGU+YXJyYXkubGVuZ3RoIC0gc3RhcnQ8L2NvZGU+Ci0gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb25nIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBhcnJheS5sZW5ndGggLSBzdGFydH0uCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBsb25nIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExvbmdCdWZmZXIgd3JhcChsb25nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbikgewogICAgICAgICAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CkBAIC0xMDAsNyArMTA0LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+TG9uZ0J1ZmZlcjwvY29kZT4gd2l0aCBnaXZlbiBjYXBhY2l0eS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIExvbmdCdWZmZXJ9IHdpdGggZ2l2ZW4gY2FwYWNpdHkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKICAgICAgKiAgICAgICAgICAgIFRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCkBAIC0xMTMsMTMgKzExNywxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvbmcgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24sIGlmIHRoZXJlJ3Mgb25lLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbG9uZyBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIFJldHVybnMgdGhlIGxvbmcgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24sIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkLW9ubHkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgbG9uZ1tdIGFycmF5KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXkoKTsKQEAgLTEyNywxNyArMTMyLDE4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGxvbmcgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24sIGlmCi0gICAgICogdGhlcmUncyBvbmUuCisgICAgICogdGhlcmUgaXMgb25lLgogICAgICAqIDxwPgotICAgICAqIFRoZSBvZmZzZXQgaXMgdGhlIGluZGV4IG9mIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byB0aGUgemVybyBwb3NpdGlvbiBvZgotICAgICAqIHRoZSBidWZmZXIuCisgICAgICogVGhlIG9mZnNldCBpcyB0aGUgaW5kZXggb2YgdGhlIGFycmF5IGFuZCBjb3JyZXNwb25kcyB0byB0aGUgemVybyBwb3NpdGlvbgorICAgICAqIG9mIHRoZSBidWZmZXIuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgb2Zmc2V0IG9mIHRoZSBsb25nIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBsb25nIGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWRvbmx5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkLW9ubHkuCiAgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhbiBhcnJheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGFycmF5T2Zmc2V0KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXlPZmZzZXQoKTsKQEAgLTE2MCw5OSArMTY2LDEwMyBAQAogICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmVhZG9ubHkgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5ldyBpbnN0YW5jZSwgZXZlbiB0aGlzIGJ1ZmZlcgotICAgICAqIGlzIHJlYWRvbmx5IGl0c2VsZi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrCi0gICAgICogYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5ldyBpbnN0YW5jZSwgZXZlbiBpZiB0aGlzCisgICAgICogYnVmZmVyIGlzIHJlYWQtb25seSBpdHNlbGYuIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eQorICAgICAqIGFuZCBtYXJrIGFyZSB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyB0aGlzIGJ1ZmZlcidzCi0gICAgICogY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBuZXcgYnVmZmVyLiBUaGUgdHdvIGJ1ZmZlcidzCi0gICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgdGhpcworICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgbmV3IGJ1ZmZlci4gVGhlIHR3bworICAgICAqIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIHJlYWRvbmx5IHZlcnNpb24gb2YgdGhpcyBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhIHJlYWQtb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBMb25nQnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKTsKIAogICAgIC8qKgogICAgICAqIENvbXBhY3RzIHRoaXMgbG9uZyBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHJlbWFpbmluZyA8Y29kZT5sb25nPC9jb2RlPnMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUKLSAgICAgKiBidWZmZXIsIHN0YXJpbmcgZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8KLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT47IHRoZSBsaW1pdCBpcyBzZXQgdG8gY2FwYWNpdHk7IHRoZSBtYXJrIGlzCi0gICAgICogY2xlYXJlZC4KKyAgICAgKiBUaGUgcmVtYWluaW5nIGxvbmdzIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGJ1ZmZlciwgc3RhcmluZyBmcm9tCisgICAgICogcG9zaXRpb24gemVyby4gVGhlbiB0aGUgcG9zaXRpb24gaXMgc2V0IHRvIHtAY29kZSByZW1haW5pbmcoKX07IHRoZQorICAgICAqIGxpbWl0IGlzIHNldCB0byBjYXBhY2l0eTsgdGhlIG1hcmsgaXMgY2xlYXJlZC4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTG9uZ0J1ZmZlciBjb21wYWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgPGNvZGU+bG9uZzwvY29kZT5zIG9mIHRoaXMgYnVmZmVyIHRvIGFub3RoZXIKLSAgICAgKiBsb25nIGJ1ZmZlcidzIHJlbWFpbmluZyA8Y29kZT5sb25nPC9jb2RlPnMuCi0gICAgICoKKyAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgbG9uZ3Mgb2YgdGhpcyBidWZmZXIgdG8gYW5vdGhlciBsb25nIGJ1ZmZlcidzCisgICAgICogcmVtYWluaW5nIGxvbmdzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlckJ1ZmZlcgotICAgICAqICAgICAgICAgICAgQW5vdGhlciBsb25nIGJ1ZmZlcgotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGlzIGlzIGxlc3MgdGhhbiA8Y29kZT5vdGhlcjwvY29kZT47IDAgaWYKLSAgICAgKiAgICAgICAgIHRoaXMgZXF1YWxzIHRvIDxjb2RlPm90aGVyPC9jb2RlPjsgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGlzIGlzCi0gICAgICogICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+b3RoZXI8L2NvZGU+CisgICAgICogICAgICAgICAgICBhbm90aGVyIGxvbmcgYnVmZmVyLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGlzIGlzIGxlc3MgdGhhbiB7QGNvZGUgb3RoZXJCdWZmZXJ9OyAwIGlmCisgICAgICogICAgICAgICB0aGlzIGVxdWFscyB0byB7QGNvZGUgb3RoZXJCdWZmZXJ9OyBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoaXMgaXMKKyAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgb3RoZXJCdWZmZXJ9CiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5vdGhlcjwvY29kZT4gaXMgbm90IGEgbG9uZyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgb3RoZXJCdWZmZXJ9IGlzIG5vdCBhIGxvbmcgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExvbmdCdWZmZXIgb3RoZXJCdWZmZXIpIHsKICAgICAgICAgaW50IGNvbXBhcmVSZW1haW5pbmcgPSAocmVtYWluaW5nKCkgPCBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKSkgPyByZW1haW5pbmcoKQogICAgICAgICAgICAgICAgIDogb3RoZXJCdWZmZXIucmVtYWluaW5nKCk7CiAgICAgICAgIGludCB0aGlzUG9zID0gcG9zaXRpb247CiAgICAgICAgIGludCBvdGhlclBvcyA9IG90aGVyQnVmZmVyLnBvc2l0aW9uOwotICAgICAgICBsb25nIHRoaXNCeXRlLCBvdGhlckJ5dGU7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBsb25nIHRoaXNMb25nLCBvdGhlckxvbmc7CiAgICAgICAgIHdoaWxlIChjb21wYXJlUmVtYWluaW5nID4gMCkgewotICAgICAgICAgICAgdGhpc0J5dGUgPSBnZXQodGhpc1Bvcyk7Ci0gICAgICAgICAgICBvdGhlckJ5dGUgPSBvdGhlckJ1ZmZlci5nZXQob3RoZXJQb3MpOwotICAgICAgICAgICAgaWYgKHRoaXNCeXRlICE9IG90aGVyQnl0ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzQnl0ZSA8IG90aGVyQnl0ZSA/IC0xIDogMTsKKyAgICAgICAgICAgIHRoaXNMb25nID0gZ2V0KHRoaXNQb3MpOworICAgICAgICAgICAgb3RoZXJMb25nID0gb3RoZXJCdWZmZXIuZ2V0KG90aGVyUG9zKTsKKyAgICAgICAgICAgIGlmICh0aGlzTG9uZyAhPSBvdGhlckxvbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0xvbmcgPCBvdGhlckxvbmcgPyAtMSA6IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aGlzUG9zKys7CiAgICAgICAgICAgICBvdGhlclBvcysrOwogICAgICAgICAgICAgY29tcGFyZVJlbWFpbmluZy0tOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIHJlbWFpbmluZygpIC0gb3RoZXJCdWZmZXIucmVtYWluaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGFyZSB0aGUgc2FtZQotICAgICAqIGFzIHRoaXMgYnVmZmVyLiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyByZWFkb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlcgotICAgICAqIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyIHRvby4KKyAgICAgKiBhcyB0aGlzIGJ1ZmZlci4gVGhlIGR1cGxpY2F0ZWQgYnVmZmVyJ3MgcmVhZC1vbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyCisgICAgICogYXJlIHNhbWUgYXMgdGhpcyBidWZmZXIncywgdG9vLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCiAgICAgICogYnVmZmVyJ3MgY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBvdGhlci4gVGhlIHR3byBidWZmZXIncwogICAgICAqIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTG9uZ0J1ZmZlciBkdXBsaWNhdGUoKTsKIAogICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBsb25nIGJ1ZmZlciBlcXVhbHMgdG8gYW5vdGhlciBvYmplY3QuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBsb25nIGJ1ZmZlciBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdC4KICAgICAgKiA8cD4KLSAgICAgKiBJZiA8Y29kZT5vdGhlcjwvY29kZT4gaXMgbm90IGEgbG9uZyBidWZmZXIsIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogSWYge0Bjb2RlIG90aGVyfSBpcyBub3QgYSBsb25nIGJ1ZmZlciB0aGVuIHtAY29kZSBmYWxzZX0gaXMgcmV0dXJuZWQuIFR3bworICAgICAqIGxvbmcgYnVmZmVycyBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgcmVtYWluaW5nIGxvbmdzIGFyZSBleGFjdGx5CisgICAgICogdGhlIHNhbWUuIFBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIG5vdCBjb25zaWRlcmVkLgogICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUd28gbG9uZyBidWZmZXJzIGFyZSBlcXVhbHMgaWYsIGFuZCBvbmx5IGlmLCB0aGVpciByZW1haW5pbmcKLSAgICAgKiA8Y29kZT5sb25nPC9jb2RlPnMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuIFBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kCi0gICAgICogbWFyayBhcmUgbm90IGNvbnNpZGVyZWQuCi0gICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIG90aGVyCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGFnYWluc3QKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhpcyBsb25nIGJ1ZmZlciBlcXVhbHMgdG8gYW5vdGhlciBvYmplY3QuCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGxvbmcgYnVmZmVyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgbG9uZyBidWZmZXIgaXMgZXF1YWwgdG8ge0Bjb2RlIG90aGVyfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKICAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBMb25nQnVmZmVyKSkgewpAQCAtMjc2LDYwICsyODYsNTkgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGxvbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieSAxLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbG9uZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlIHBvc2l0aW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA8Y29kZT5sb25nPC9jb2RlPnMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBsb25nIGFycmF5IGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5sb25nPC9jb2RlPnMKLSAgICAgKiByZWFkLgorICAgICAqIFJlYWRzIGxvbmdzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkIGxvbmcgYXJyYXkgYW5kCisgICAgICogaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIGxvbmdzIHJlYWQuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+Z2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIGdldChkZXN0LCAwLCBkZXN0Lmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBkZXN0Ci0gICAgICogICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gbG9uZyBhcnJheQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBsb25nIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiA8Y29kZT5kZXN0Lmxlbmd0aDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIGRlc3QubGVuZ3RofSBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIHJlbWFpbmluZygpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTG9uZ0J1ZmZlciBnZXQobG9uZ1tdIGRlc3QpIHsKICAgICAgICAgcmV0dXJuIGdldChkZXN0LCAwLCBkZXN0Lmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgPGNvZGU+bG9uZzwvY29kZT5zIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkCi0gICAgICogbG9uZyBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwgYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbgotICAgICAqIGJ5IHRoZSBudW1iZXIgb2YgPGNvZGU+bG9uZzwvY29kZT5zIHJlYWQuCi0gICAgICoKKyAgICAgKiBSZWFkcyBsb25ncyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBsb25nIGFycmF5LAorICAgICAqIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQsIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIGxvbmdzIHJlYWQuCisgICAgICogCiAgICAgICogQHBhcmFtIGRlc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgbG9uZyBhcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBsb25nIGFycmF5LgogICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgdGhlIGxvbmcgYXJyYXksIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCi0gICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+ZGVzdC5sZW5ndGg8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBsb25nIGFycmF5LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90CisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIGRlc3QubGVuZ3RofS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIDxjb2RlPmxvbmc8L2NvZGU+cyB0byByZWFkLCBtdXN0IGJlIG5vIGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPmRlc3QubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbG9uZ3MgdG8gcmVhZCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm90CisgICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4ge0Bjb2RlIGRlc3QubGVuZ3RoIC0gb2ZmfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5vZmY8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBvZmZ9IG9yIHtAY29kZSBsZW59IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5sZW48L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBsZW59IGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgcmVtYWluaW5nKCl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMb25nQnVmZmVyIGdldChsb25nW10gZGVzdCwgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbGVuZ3RoID0gZGVzdC5sZW5ndGg7CiAgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgKGxvbmcpbGVuICsgKGxvbmcpb2ZmID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIGlmIChsZW4gPiByZW1haW5pbmcoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC0zNDAsMzUgKzM0OSwzNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsb25nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGFuZCB0aGUgcG9zaXRpb24gaXMgbm90IGNoYW5nZWQuCi0gICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBsb25nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXg7IHRoZSBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIGxpbWl0Ci0gICAgICogQHJldHVybiBBIGxvbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiBsaW1pdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgaW5kZXggaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGluZGV4IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0KGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBsb25nIGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgYnVmZmVyIGlzIHJlYWRvbmx5LCB0aGVuIGZhbHNlIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhIGxvbmcgYXJyYXkgYW5kIGlzIHJlYWQvd3JpdGUuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBsb25nIGFycmF5IGFuZCBpcyByZWFkL3dyaXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGEgbG9uZyBhcnJheSBhbmQgcHJvdmlkZXMKKyAgICAgKiAgICAgICAgIHJlYWQvd3JpdGUgYWNjZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBcnJheSgpIHsKICAgICAgICAgcmV0dXJuIHByb3RlY3RlZEhhc0FycmF5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGFzaCBjb2RlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIDxjb2RlPmxvbmc8L2NvZGU+cy4KLSAgICAgKiA8cD4KLSAgICAgKiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrIGRvbid0IGFmZmVjdCB0aGUgaGFzaCBjb2RlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGhhc2ggY29kZSBjYWxjdWxhdGVkIGZyb20gdGhlIHJlbWFpbmluZyA8Y29kZT5sb25nPC9jb2RlPnMuCisgICAgICogQ2FsY3VsYXRlcyB0aGlzIGJ1ZmZlcidzIGhhc2ggY29kZSBmcm9tIHRoZSByZW1haW5pbmcgY2hhcnMuIFRoZQorICAgICAqIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgZG9uJ3QgYWZmZWN0IHRoZSBoYXNoIGNvZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIGxvbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBteVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC0zODIsMTE5ICszOTAsMTE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QuIEEgZGlyZWN0IGJ1ZmZlciB3aWxsIHRyeSBpdHMKKyAgICAgKiBiZXN0IHRvIHRha2UgYWR2YW50YWdlIG9mIG5hdGl2ZSBtZW1vcnkgQVBJcyBhbmQgaXQgbWF5IG5vdCBzdGF5IGluIHRoZQorICAgICAqIEphdmEgaGVhcCwgc28gaXQgaXMgbm90IGFmZmVjdGVkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4KICAgICAgKiA8cD4KLSAgICAgKiBBIGRpcmVjdCBidWZmZXIgd2lsbCB0cnkgaXRzIGJlc3QgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbmF0aXZlIG1lbW9yeSBBUElzCi0gICAgICogYW5kIGl0IG1heSBub3Qgc3RheSBpbiBqYXZhIGhlYXAsIHRodXMgbm90IGFmZmVjdGVkIGJ5IEdDLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBIGxvbmcgYnVmZmVyIGlzIGRpcmVjdCwgaWYgaXQgaXMgYmFzZWQgb24gYSBieXRlIGJ1ZmZlciBhbmQgdGhlIGJ5dGUKKyAgICAgKiBBIGxvbmcgYnVmZmVyIGlzIGRpcmVjdCBpZiBpdCBpcyBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyIGFuZCB0aGUgYnl0ZQogICAgICAqIGJ1ZmZlciBpcyBkaXJlY3QuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlyZWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nCi0gICAgICogPGNvZGU+bG9uZzwvY29kZT5zIGZyb20vdG8gPGNvZGU+Ynl0ZTwvY29kZT5zLgorICAgICAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcgbG9uZ3MgZnJvbS90bworICAgICAqIGJ5dGVzLgogICAgICAqIDxwPgogICAgICAqIElmIHRoaXMgYnVmZmVyIGlzIG5vdCBiYXNlZCBvbiBhIGJ5dGUgYnVmZmVyLCB0aGVuIGFsd2F5cyByZXR1cm4gdGhlCiAgICAgICogcGxhdGZvcm0ncyBuYXRpdmUgYnl0ZSBvcmRlci4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nCi0gICAgICogICAgICAgICA8Y29kZT5sb25nPC9jb2RlPnMgZnJvbS90byA8Y29kZT5ieXRlPC9jb2RlPnMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBvcmRlciB1c2VkIGJ5IHRoaXMgYnVmZmVyIHdoZW4gY29udmVydGluZyBsb25ncyBmcm9tL3RvCisgICAgICogICAgICAgICBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZU9yZGVyIG9yZGVyKCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXkoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheSgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGFycmF5KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3QgbG9uZ1tdIHByb3RlY3RlZEFycmF5KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXlPZmZzZXQoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheU9mZnNldCgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5T2Zmc2V0KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGFycmF5T2Zmc2V0KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3QgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+aGFzQXJyYXkoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBoYXNBcnJheSgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmhhc0FycmF5KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGhhc0FycmF5KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3QgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBsb25nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24KKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGxvbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24KICAgICAgKiBieSAxLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGwKLSAgICAgKiAgICAgICAgICAgIFRoZSBsb25nIHRvIHdyaXRlCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgaWYgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0LgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBMb25nQnVmZmVyIHB1dChsb25nIGwpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPmxvbmc8L2NvZGU+cyBpbiB0aGUgZ2l2ZW4gbG9uZyBhcnJheSB0byB0aGUgY3VycmVudAotICAgICAqIHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5sb25nPC9jb2RlPnMKLSAgICAgKiB3cml0dGVuLgorICAgICAqIFdyaXRlcyBsb25ncyBmcm9tIHRoZSBnaXZlbiBsb25nIGFycmF5IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZAorICAgICAqIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBsb25ncyB3cml0dGVuLgogICAgICAqIDxwPgogICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwotICAgICAqIDxjb2RlPnB1dChzcmMsIDAsIHNyYy5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgcHV0KHNyYywgMCwgc3JjLmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgbG9uZyBhcnJheQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbG9uZyBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+c3JjLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgcmVtYWluaW5nKCl9IGlzIGxlc3MgdGhhbiB7QGNvZGUgc3JjLmxlbmd0aH0uCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIExvbmdCdWZmZXIgcHV0KGxvbmdbXSBzcmMpIHsKICAgICAgICAgcmV0dXJuIHB1dChzcmMsIDAsIHNyYy5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5sb25nPC9jb2RlPnMgaW4gdGhlIGdpdmVuIGxvbmcgYXJyYXksIHN0YXJ0aW5nIGZyb20gdGhlCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCwgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbiBieQotICAgICAqIHRoZSBudW1iZXIgb2YgPGNvZGU+bG9uZzwvY29kZT5zIHdyaXR0ZW4uCi0gICAgICoKKyAgICAgKiBXcml0ZXMgbG9uZ3MgZnJvbSB0aGUgZ2l2ZW4gbG9uZyBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogb2Zmc2V0LCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgaW5jcmVhc2VzIHRoZSBwb3NpdGlvbiBieSB0aGUgbnVtYmVyCisgICAgICogb2YgbG9uZ3Mgd3JpdHRlbi4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICBUaGUgc291cmNlIGxvbmcgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgbG9uZyBhcnJheS4KICAgICAgKiBAcGFyYW0gb2ZmCi0gICAgICogICAgICAgICAgICBUaGUgb2Zmc2V0IG9mIGxvbmcgYXJyYXksIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIG5vCi0gICAgICogICAgICAgICAgICBncmVhdGVyIHRoYW4gPGNvZGU+c3JjLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgbG9uZyBhcnJheSwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyCisgICAgICogICAgICAgICAgICB0aGFuIHtAY29kZSBzcmMubGVuZ3RofS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIDxjb2RlPmxvbmc8L2NvZGU+cyB0byB3cml0ZSwgbXVzdCBiZSBubyBsZXNzCi0gICAgICogICAgICAgICAgICB0aGFuIHplcm8gYW5kIG5vIGdyZWF0ZXIgdGhhbiA8Y29kZT5zcmMubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbG9uZ3MgdG8gd3JpdGUsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kCisgICAgICogICAgICAgICAgICBub3QgZ3JlYXRlciB0aGFuIHtAY29kZSBzcmMubGVuZ3RoIC0gb2ZmfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+bGVuPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSByZW1haW5pbmcoKX0gaXMgbGVzcyB0aGFuIHtAY29kZSBsZW59LgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGVpdGhlciA8Y29kZT5vZmY8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBvZmZ9IG9yIHtAY29kZSBsZW59IGlzIGludmFsaWQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExvbmdCdWZmZXIgcHV0KGxvbmdbXSBzcmMsIGludCBvZmYsIGludCBsZW4pIHsKICAgICAgICAgaW50IGxlbmd0aCA9IHNyYy5sZW5ndGg7CiAgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgKGxvbmcpbGVuICsgKGxvbmcpb2ZmID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIGlmIChsZW4gPiByZW1haW5pbmcoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KQEAgLTUwNSwyMCArNTEyLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGFsbCB0aGUgcmVtYWluaW5nIDxjb2RlPmxvbmc8L2NvZGU+cyBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPgotICAgICAqIGxvbmcgYnVmZmVyIHRvIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbiwgYW5kIGluY3JlYXNlIGJvdGggYnVmZmVycycKLSAgICAgKiBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPmxvbmc8L2NvZGU+cyBjb3BpZWQuCi0gICAgICoKKyAgICAgKiBXcml0ZXMgYWxsIHRoZSByZW1haW5pbmcgbG9uZ3Mgb2YgdGhlIHtAY29kZSBzcmN9IGxvbmcgYnVmZmVyIHRvIHRoaXMKKyAgICAgKiBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLCBhbmQgaW5jcmVhc2VzIGJvdGggYnVmZmVycycgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIGxvbmdzIGNvcGllZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICBUaGUgc291cmNlIGxvbmcgYnVmZmVyCi0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBsb25nIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5zcmMucmVtYWluaW5nKCk8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgYnVmZmVyJ3MgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHNyYy5yZW1haW5pbmcoKX0gaXMgZ3JlYXRlciB0aGFuIHRoaXMgYnVmZmVyJ3MKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgcmVtYWluaW5nKCl9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+c3JjPC9jb2RlPiBpcyB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzcmN9IGlzIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMb25nQnVmZmVyIHB1dChMb25nQnVmZmVyIHNyYykgewogICAgICAgICBpZiAoc3JjID09IHRoaXMpIHsKQEAgLTUzNCw0NCArNTQyLDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBsb25nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIgYW5kIHRoZSBwb3NpdGlvbiBpcwotICAgICAqIG5vdCBjaGFuZ2VkLgotICAgICAqCisgICAgICogV3JpdGVzIGEgbG9uZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoaXMgYnVmZmVyOyB0aGUgcG9zaXRpb24gaXMgbm90CisgICAgICogY2hhbmdlZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIFRoZSBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIHRoZSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIHRoZSBsaW1pdC4KICAgICAgKiBAcGFyYW0gbAotICAgICAqICAgICAgICAgICAgVGhlIGxvbmcgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGluZGV4IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBpbmRleCBpcyBpbnZhbGlkLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBMb25nQnVmZmVyIHB1dChpbnQgaW5kZXgsIGxvbmcgbCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2xpY2VkIGJ1ZmZlcidzIGNhcGFjaXR5IHdpbGwgYmUgdGhpcyBidWZmZXIncwotICAgICAqIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiwgYW5kIGl0cyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0bwotICAgICAqIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIDAsCi0gICAgICogbGltaXQgd2lsbCBiZSBpdHMgY2FwYWNpdHksIGFuZCBpdHMgbWFyayBpcyB1bnNldC4gVGhlIG5ldyBidWZmZXIncwotICAgICAqIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZSBzYW1lIGFzIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSBzbGljZWQgYnVmZmVyJ3MgY2FwYWNpdHkgd2lsbCBiZSB0aGlzIGJ1ZmZlcidzIHtAY29kZSByZW1haW5pbmcoKX0sCisgICAgICogYW5kIGl0cyB6ZXJvIHBvc2l0aW9uIHdpbGwgY29ycmVzcG9uZCB0byB0aGlzIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiB3aWxsIGJlIDAsIGxpbWl0IHdpbGwgYmUgaXRzIGNhcGFjaXR5LCBhbmQgaXRzCisgICAgICogbWFyayBpcyBjbGVhcmVkLiBUaGUgbmV3IGJ1ZmZlcidzIHJlYWQtb25seSBwcm9wZXJ0eSBhbmQgYnl0ZSBvcmRlciBhcmUKKyAgICAgKiBzYW1lIGFzIHRoaXMgYnVmZmVyJ3MuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgorICAgICAqIFRoZSBuZXcgYnVmZmVyIHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyBlaXRoZXIKICAgICAgKiBidWZmZXIncyBjaGFuZ2Ugb2YgY29udGVudCB3aWxsIGJlIHZpc2libGUgdG8gdGhlIG90aGVyLiBUaGUgdHdvIGJ1ZmZlcidzCiAgICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhIHNsaWNlZCBidWZmZXIgdGhhdCBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTG9uZ0J1ZmZlciBzbGljZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGlzIGxvbmcgYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGlzIGxvbmcgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIGxvbmcgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIGxvbmcgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9NYXBwZWRCeXRlQnVmZmVyLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9NYXBwZWRCeXRlQnVmZmVyLmphdmEKaW5kZXggNWMxMWVhZS4uOGY2NzI3ZCAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vTWFwcGVkQnl0ZUJ1ZmZlci5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL01hcHBlZEJ5dGVCdWZmZXIuamF2YQpAQCAtMjMsMjEgKzIzLDIyIEBACiAKIAogLyoqCi0gKiA8Y29kZT5NYXBwZWRCeXRlQnVmZmVyPC9jb2RlPiBpcyBhIHNwZWNpYWwga2luZCBvZiBkaXJlY3QgYnl0ZSBidWZmZXIsCi0gKiB3aGljaCBtYXBzIGEgcmVnaW9uIG9mIGZpbGUgdG8gbWVtb3J5LgorICoge0Bjb2RlIE1hcHBlZEJ5dGVCdWZmZXJ9IGlzIGEgc3BlY2lhbCBraW5kIG9mIGRpcmVjdCBieXRlIGJ1ZmZlciB3aGljaCBtYXBzIGEKKyAqIHJlZ2lvbiBvZiBmaWxlIHRvIG1lbW9yeS4KICAqIDxwPgotICogPGNvZGU+TWFwcGVkQnl0ZUJ1ZmZlcjwvY29kZT4gY2FuIGJlIGNyZWF0ZWQgYnkgY2FsbGluZworICoge0Bjb2RlIE1hcHBlZEJ5dGVCdWZmZXJ9IGNhbiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcKICAqIHtAbGluayBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNtYXAoamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwuTWFwTW9kZSwgbG9uZywgbG9uZykgRmlsZUNoYW5uZWwubWFwfS4KICAqIE9uY2UgY3JlYXRlZCwgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgYnl0ZSBidWZmZXIgYW5kIHRoZSBmaWxlIHJlZ2lvbiByZW1haW5zCiAgKiB2YWxpZCB1bnRpbCB0aGUgYnl0ZSBidWZmZXIgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIEFsbCBvciBwYXJ0IG9mIGEgPGNvZGU+TWFwcGVkQnl0ZUJ1ZmZlcjwvY29kZT4ncyBjb250ZW50IG1heSBjaGFuZ2Ugb3IKLSAqIGJlY29tZSBpbmFjY2Vzc2libGUgYXQgYW55IHRpbWUsIHNpbmNlIHRoZSBtYXBwZWQgZmlsZSByZWdpb24gY2FuIGJlIG1vZGlmaWVkCi0gKiBieSBhbm90aGVyIHRocmVhZCBvciBwcm9jZXNzIGF0IGFueSB0aW1lLiBJZiB0aGlzIGhhcHBlbnMsIHRoZSBiZWhhdmlvciBvZgotICogdGhlIDxjb2RlPk1hcHBlZEJ5dGVCdWZmZXI8L2NvZGU+IGlzIHVuZGVmaW5lZC4KKyAqIEFsbCBvciBwYXJ0IG9mIGEge0Bjb2RlIE1hcHBlZEJ5dGVCdWZmZXJ9J3MgY29udGVudCBtYXkgY2hhbmdlIG9yIGJlY29tZQorICogaW5hY2Nlc3NpYmxlIGF0IGFueSB0aW1lLCBzaW5jZSB0aGUgbWFwcGVkIGZpbGUgcmVnaW9uIGNhbiBiZSBtb2RpZmllZCBieQorICogYW5vdGhlciB0aHJlYWQgb3IgcHJvY2VzcyBhdCBhbnkgdGltZS4gSWYgdGhpcyBoYXBwZW5zLCB0aGUgYmVoYXZpb3Igb2YgdGhlCisgKiB7QGNvZGUgTWFwcGVkQnl0ZUJ1ZmZlcn0gaXMgdW5kZWZpbmVkLgogICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1hcHBlZEJ5dGVCdWZmZXIgZXh0ZW5kcyBCeXRlQnVmZmVyIHsKIApAQCAtNzIsMTggKzczLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYnVmZmVyJ3MgY29udGVudCBpcyBsb2FkZWQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWZmZXIncyBjb250ZW50IGlzIGxvYWRlZC4gSWYgdGhlIHJlc3VsdCBpcyB0cnVlCisgICAgICogdGhlcmUgaXMgYSBoaWdoIHByb2JhYmlsaXR5IHRoYXQgdGhlIHdob2xlIGJ1ZmZlciBtZW1vcnkgaXMgY3VycmVudGx5CisgICAgICogbG9hZGVkIGluIFJBTS4gSWYgaXQgaXMgZmFsc2UgaXQgaXMgdW5zdXJlIGlmIGl0IGlzIGxvYWRlZCBvciBub3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgYnVmZmVyJ3MgY29udGVudCBpcyBsb2FkZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBidWZmZXIncyBjb250ZW50IGlzIGxvYWRlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzTG9hZGVkKCkgewogICAgICAgICByZXR1cm4gKChNYXBwZWRQbGF0Zm9ybUFkZHJlc3MpKChEaXJlY3RCdWZmZXIpIHdyYXBwZWQpLmdldEJhc2VBZGRyZXNzKCkpLm1tYXBJc0xvYWRlZCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWRzIHRoaXMgYnVmZmVyJ3MgY29udGVudCBpbnRvIG1lbW9yeS4KKyAgICAgKiBMb2FkcyB0aGlzIGJ1ZmZlcidzIGNvbnRlbnQgaW50byBtZW1vcnkgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvCisgICAgICogc3VjY2VlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgTWFwcGVkQnl0ZUJ1ZmZlciBsb2FkKCkgewogICAgICAgICAoKE1hcHBlZFBsYXRmb3JtQWRkcmVzcykoKERpcmVjdEJ1ZmZlcikgd3JhcHBlZCkuZ2V0QmFzZUFkZHJlc3MoKSkubW1hcExvYWQoKTsKQEAgLTkxLDEyICs5OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhbGwgY2hhbmdlcyBvZiB0aGUgYnVmZmVyIHRvIHRoZSBtYXBwZWQgZmlsZS4KKyAgICAgKiBXcml0ZXMgYWxsIGNoYW5nZXMgb2YgdGhlIGJ1ZmZlciB0byB0aGUgbWFwcGVkIGZpbGUuIElmIHRoZSBtYXBwZWQgZmlsZQorICAgICAqIGlzIHN0b3JlZCBvbiBhIGxvY2FsIGRldmljZSwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBjaGFuZ2VzIGFyZQorICAgICAqIHdyaXR0ZW4gdG8gdGhlIGZpbGUuIE5vIHN1Y2ggZ3VhcmFudGVlIGlzIGdpdmVuIGlmIHRoZSBmaWxlIGlzIGxvY2F0ZWQgb24KKyAgICAgKiBhIHJlbW90ZSBkZXZpY2UuCiAgICAgICogCi0gICAgICogQWxsIGNoYW5nZXMgbXVzdCBiZSB3cml0dGVuIGJ5IGludm9raW5nIHRoaXMgbWV0aG9kIGlmIHRoZSBtYXBwZWQgZmlsZQotICAgICAqIGV4aXN0cyBvbiB0aGUgbG9jYWwgZGV2aWNlLCBvdGhlcndpc2UgdGhlIGFjdGlvbiBjYW4gbm90IGJlIHNwZWNpZmllZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgTWFwcGVkQnl0ZUJ1ZmZlciBmb3JjZSgpIHsKICAgICAgICAgaWYgKG1hcE1vZGUgPT0gSU1lbW9yeVN5c3RlbS5NTUFQX1JFQURfV1JJVEUpIHsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL01hcHBlZEJ5dGVCdWZmZXJBZGFwdGVyLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9NYXBwZWRCeXRlQnVmZmVyQWRhcHRlci5qYXZhCmluZGV4IDU1MzNkZjkuLmEzZjVkN2UgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL01hcHBlZEJ5dGVCdWZmZXJBZGFwdGVyLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vTWFwcGVkQnl0ZUJ1ZmZlckFkYXB0ZXIuamF2YQpAQCAtMTUsMTMgKzE1LDE3IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyB1cGRhdGVkIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS5uaW87CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5EaXJlY3RCdWZmZXI7CiAKIAotY2xhc3MgTWFwcGVkQnl0ZUJ1ZmZlckFkYXB0ZXIgZXh0ZW5kcyBNYXBwZWRCeXRlQnVmZmVyIGltcGxlbWVudHMgRGlyZWN0QnVmZmVyIHsKK2ZpbmFsIGNsYXNzIE1hcHBlZEJ5dGVCdWZmZXJBZGFwdGVyIGV4dGVuZHMgTWFwcGVkQnl0ZUJ1ZmZlciBpbXBsZW1lbnRzIERpcmVjdEJ1ZmZlciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9TSVpFID0gMjsKIApAQCAtMTAxLDEwICsxMDUsOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBieXRlIGdldCgpIHsKLSAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gdGhpcy5saW1pdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0KHRoaXMucG9zaXRpb24rKyk7CisgICAgICAgIGJ5dGUgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldCgpOyAKKyAgICAgICAgdGhpcy5wb3NpdGlvbisrOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIHB1YmxpYyBieXRlIGdldChpbnQgaW5kZXgpIHsKQEAgLTExMiwxMiArMTE1LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgY2hhciBnZXRDaGFyKCkgewotICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uICsgQ0hBUl9TSVpFOwotICAgICAgICBpZiAobmV3UG9zaXRpb24gPiB0aGlzLmxpbWl0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0Q2hhcih0aGlzLnBvc2l0aW9uKTsKLSAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOworICAgICAgICBjaGFyIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5nZXRDaGFyKCk7CisgICAgICAgIHRoaXMucG9zaXRpb24gKz0gQ0hBUl9TSVpFOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTI2LDEyICsxMjUsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCkgewotICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uICsgRE9VQkxFX1NJWkU7Ci0gICAgICAgIGlmIChuZXdQb3NpdGlvbiA+IHRoaXMubGltaXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBkb3VibGUgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldERvdWJsZSh0aGlzLnBvc2l0aW9uKTsKLSAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOworICAgICAgICBkb3VibGUgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldERvdWJsZSgpOworICAgICAgICB0aGlzLnBvc2l0aW9uICs9IERPVUJMRV9TSVpFOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTQ0LDEyICsxMzksOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdCgpIHsKLSAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gdGhpcy5wb3NpdGlvbiArIEZMT0FUX1NJWkU7Ci0gICAgICAgIGlmIChuZXdQb3NpdGlvbiA+IHRoaXMubGltaXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBmbG9hdCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0RmxvYXQodGhpcy5wb3NpdGlvbik7Ci0gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKKyAgICAgICAgZmxvYXQgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldEZsb2F0KCk7CisgICAgICAgIHRoaXMucG9zaXRpb24gKz0gRkxPQVRfU0laRTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTE1OCwxMiArMTQ5LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldEludCgpIHsKLSAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gdGhpcy5wb3NpdGlvbiArIElOVEVHRVJfU0laRTsKLSAgICAgICAgaWYgKG5ld1Bvc2l0aW9uID4gdGhpcy5saW1pdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGludCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0SW50KHRoaXMucG9zaXRpb24pOwotICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgICAgIGludCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0SW50KCk7CisgICAgICAgIHRoaXMucG9zaXRpb24gKz0gSU5URUdFUl9TSVpFOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTcyLDEyICsxNTksOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBsb25nIGdldExvbmcoKSB7Ci0gICAgICAgIGludCBuZXdQb3NpdGlvbiA9IHRoaXMucG9zaXRpb24gKyBMT05HX1NJWkU7Ci0gICAgICAgIGlmIChuZXdQb3NpdGlvbiA+IHRoaXMubGltaXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5nZXRMb25nKHRoaXMucG9zaXRpb24pOwotICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgICAgIGxvbmcgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldExvbmcoKTsKKyAgICAgICAgdGhpcy5wb3NpdGlvbiArPSBMT05HX1NJWkU7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xODYsMTIgKzE2OSw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHNob3J0IGdldFNob3J0KCkgewotICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uICsgU0hPUlRfU0laRTsKLSAgICAgICAgaWYgKG5ld1Bvc2l0aW9uID4gdGhpcy5saW1pdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHNob3J0IHJlc3VsdCA9IHRoaXMud3JhcHBlZC5nZXRTaG9ydCh0aGlzLnBvc2l0aW9uKTsKLSAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOworICAgICAgICBzaG9ydCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0U2hvcnQoKTsKKyAgICAgICAgdGhpcy5wb3NpdGlvbiArPSBTSE9SVF9TSVpFOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMjEzLDEwICsxOTIsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIHB1dChieXRlIGIpIHsKLSAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gdGhpcy5saW1pdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy53cmFwcGVkLnB1dCh0aGlzLnBvc2l0aW9uKyssIGIpOworICAgICAgICB0aGlzLndyYXBwZWQucHV0KGIpOworICAgICAgICB0aGlzLnBvc2l0aW9uKys7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIApAQCAtMjMzLDEyICsyMTAsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIHB1dENoYXIoY2hhciB2YWx1ZSkgewotICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uICsgQ0hBUl9TSVpFOwotICAgICAgICBpZiAobmV3UG9zaXRpb24gPiB0aGlzLmxpbWl0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLndyYXBwZWQucHV0Q2hhcih0aGlzLnBvc2l0aW9uLCB2YWx1ZSk7Ci0gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKKyAgICAgICAgdGhpcy53cmFwcGVkLnB1dENoYXIodmFsdWUpOworICAgICAgICB0aGlzLnBvc2l0aW9uICs9IENIQVJfU0laRTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCkBAIC0yNDgsMTIgKzIyMSw4IEBACiAgICAgfQogCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgcHV0RG91YmxlKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uICsgRE9VQkxFX1NJWkU7Ci0gICAgICAgIGlmIChuZXdQb3NpdGlvbiA+IHRoaXMubGltaXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMud3JhcHBlZC5wdXREb3VibGUodGhpcy5wb3NpdGlvbiwgdmFsdWUpOwotICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgICAgIHRoaXMud3JhcHBlZC5wdXREb3VibGUodmFsdWUpOworICAgICAgICB0aGlzLnBvc2l0aW9uICs9IERPVUJMRV9TSVpFOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKQEAgLTI2MywxMiArMjMyLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBwdXRGbG9hdChmbG9hdCB2YWx1ZSkgewotICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uICsgRkxPQVRfU0laRTsKLSAgICAgICAgaWYgKG5ld1Bvc2l0aW9uID4gdGhpcy5saW1pdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy53cmFwcGVkLnB1dEZsb2F0KHRoaXMucG9zaXRpb24sIHZhbHVlKTsKLSAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOworICAgICAgICB0aGlzLndyYXBwZWQucHV0RmxvYXQodmFsdWUpOworICAgICAgICB0aGlzLnBvc2l0aW9uICs9IEZMT0FUX1NJWkU7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIApAQCAtMjgzLDEyICsyNDgsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIHB1dEludChpbnQgdmFsdWUpIHsKLSAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gdGhpcy5wb3NpdGlvbiArIElOVEVHRVJfU0laRTsKLSAgICAgICAgaWYgKG5ld1Bvc2l0aW9uID4gdGhpcy5saW1pdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy53cmFwcGVkLnB1dEludCh0aGlzLnBvc2l0aW9uLCB2YWx1ZSk7Ci0gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKKyAgICAgICAgdGhpcy53cmFwcGVkLnB1dEludCh2YWx1ZSk7CisgICAgICAgIHRoaXMucG9zaXRpb24gKz0gSU5URUdFUl9TSVpFOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKQEAgLTI5OCwxMiArMjU5LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBwdXRMb25nKGxvbmcgdmFsdWUpIHsKLSAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gdGhpcy5wb3NpdGlvbiArIExPTkdfU0laRTsKLSAgICAgICAgaWYgKG5ld1Bvc2l0aW9uID4gdGhpcy5saW1pdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy53cmFwcGVkLnB1dExvbmcodGhpcy5wb3NpdGlvbiwgdmFsdWUpOwotICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgICAgIHRoaXMud3JhcHBlZC5wdXRMb25nKHZhbHVlKTsKKyAgICAgICAgdGhpcy5wb3NpdGlvbiArPSBMT05HX1NJWkU7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIApAQCAtMzEzLDEyICsyNzAsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIHB1dFNob3J0KHNob3J0IHZhbHVlKSB7Ci0gICAgICAgIGludCBuZXdQb3NpdGlvbiA9IHRoaXMucG9zaXRpb24gKyBTSE9SVF9TSVpFOwotICAgICAgICBpZiAobmV3UG9zaXRpb24gPiB0aGlzLmxpbWl0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLndyYXBwZWQucHV0U2hvcnQodGhpcy5wb3NpdGlvbiwgdmFsdWUpOwotICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgICAgIHRoaXMud3JhcHBlZC5wdXRTaG9ydCh2YWx1ZSk7CisgICAgICAgIHRoaXMucG9zaXRpb24gKz0gU0hPUlRfU0laRTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCkBAIC0zNTksMTAgKzMxMiw3IEBACiAgICAgICAgIHRoaXMud3JhcHBlZC5mcmVlKCk7CiAgICAgfQogCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAotICAgIC8vIGNvcGllZCBmcm9tIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueSAgICAgICAgCiAgICAgcHVibGljIGludCBnZXRCeXRlQ2FwYWNpdHkoKSB7CiAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldEJ5dGVDYXBhY2l0eSgpOwogICAgIH0KLSAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL1JlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLmphdmEKaW5kZXggOTkwZDhlYy4uNjJlMmQ1ZiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9SZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNiArMTgsMTkgQEAKIAogCiAvKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlCdWZmZXJFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB3aGVuIHNvbWUgd3JpdGUgb3BlcmF0aW9uCi0gKiBpcyBjYWxsZWQgb24gYSByZWFkb25seSBidWZmZXIuCisgKiBBIHtAY29kZSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gc29tZSB3cml0ZSBvcGVyYXRpb24gaXMKKyAqIGNhbGxlZCBvbiBhIHJlYWQtb25seSBidWZmZXIuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24gZXh0ZW5kcyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTIxMDA2Mzk3NjQ5NjIzNDA5MEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+UmVhZE9ubHlCdWZmZXJFeGNlcHRpb248L2NvZGU+LgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL1JlYWRXcml0ZURpcmVjdEJ5dGVCdWZmZXIuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL1JlYWRXcml0ZURpcmVjdEJ5dGVCdWZmZXIuamF2YQppbmRleCA3NDY1NWI4Li45NWI0ZWJjIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9SZWFkV3JpdGVEaXJlY3RCeXRlQnVmZmVyLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vUmVhZFdyaXRlRGlyZWN0Qnl0ZUJ1ZmZlci5qYXZhCkBAIC01MCwxMyArNTAsMTMgQEAKICAgICBSZWFkV3JpdGVEaXJlY3RCeXRlQnVmZmVyKGludCBjYXBhY2l0eSkgewogICAgICAgICBzdXBlcihjYXBhY2l0eSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIFJlYWRXcml0ZURpcmVjdEJ5dGVCdWZmZXIoaW50IHBvaW50ZXIsIGludCBjYXBhY2l0eSkgewogICAgICAgICB0aGlzKFBsYXRmb3JtQWRkcmVzc0ZhY3Rvcnkub24ocG9pbnRlciwgY2FwYWNpdHkpLGNhcGFjaXR5LDApOwogICAgIH0KICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAotICAgIAorCiAgICAgUmVhZFdyaXRlRGlyZWN0Qnl0ZUJ1ZmZlcihTYWZlQWRkcmVzcyBhZGRyZXNzLCBpbnQgY2FwYWNpdHksIGludCBvZmZzZXQpIHsKICAgICAgICAgc3VwZXIoYWRkcmVzcywgY2FwYWNpdHksIG9mZnNldCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vU2hvcnRCdWZmZXIuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL1Nob3J0QnVmZmVyLmphdmEKaW5kZXggNThjMjQ2Mi4uMzlmOWRkZiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vU2hvcnRCdWZmZXIuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9TaG9ydEJ1ZmZlci5qYXZhCkBAIC0xOCw5ICsxOCwxMCBAQAogcGFja2FnZSBqYXZhLm5pbzsKIAogLyoqCi0gKiBBIGJ1ZmZlciBvZiA8Y29kZT5zaG9ydDwvY29kZT5zLgorICogQSBidWZmZXIgb2Ygc2hvcnRzLgogICogPHA+CiAgKiBBIHNob3J0IGJ1ZmZlciBjYW4gYmUgY3JlYXRlZCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgorICogPC9wPgogICogPHVsPgogICogPGxpPntAbGluayAjYWxsb2NhdGUoaW50KSBBbGxvY2F0ZX0gYSBuZXcgc2hvcnQgYXJyYXkgYW5kIGNyZWF0ZSBhIGJ1ZmZlcgogICogYmFzZWQgb24gaXQ7PC9saT4KQEAgLTI5LDE4ICszMCwyMCBAQAogICogPGxpPlVzZSB7QGxpbmsgamF2YS5uaW8uQnl0ZUJ1ZmZlciNhc1Nob3J0QnVmZmVyKCkgQnl0ZUJ1ZmZlci5hc1Nob3J0QnVmZmVyfQogICogdG8gY3JlYXRlIGEgc2hvcnQgYnVmZmVyIGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIuPC9saT4KICAqIDwvdWw+Ci0gKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2hvcnRCdWZmZXIgZXh0ZW5kcyBCdWZmZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPFNob3J0QnVmZmVyPiB7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc2hvcnQgYnVmZmVyIGJhc2VkIG9uIGEgbmV3IGFsbG9jYXRlZCBzaG9ydCBhcnJheS4KLSAgICAgKgorICAgICAqIENyZWF0ZXMgYSBzaG9ydCBidWZmZXIgYmFzZWQgb24gYSBuZXdseSBhbGxvY2F0ZWQgc2hvcnQgYXJyYXkuCisgICAgICogCiAgICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICBUaGUgY2FwYWNpdHkgb2YgdGhlIG5ldyBidWZmZXIKLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHNob3J0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGNhcGFjaXR5IG9mIHRoZSBuZXcgYnVmZmVyLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgc2hvcnQgYnVmZmVyLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzIGxlc3MgdGhhbiB6ZXJvCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNhcGFjaXR5fSBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNob3J0QnVmZmVyIGFsbG9jYXRlKGludCBjYXBhY2l0eSkgewogICAgICAgICBpZiAoY2FwYWNpdHkgPCAwKSB7CkBAIC01MywzNiArNTYsMzcgQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IHNob3J0IGJ1ZmZlciBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gc2hvcnQgYXJyYXkuCiAgICAgICogPHA+CiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAgICogPGNvZGU+d3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIHdyYXAoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCl9LgogICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqICAgICAgICAgICAgVGhlIHNob3J0IGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24KLSAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHNob3J0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IGFycmF5IHdoaWNoIHRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgYmFzZWQgb24uCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBzaG9ydCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTaG9ydEJ1ZmZlciB3cmFwKHNob3J0W10gYXJyYXkpIHsKICAgICAgICAgcmV0dXJuIHdyYXAoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBuZXcgYSBzaG9ydCBidWZmZXIgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIHNob3J0IGFycmF5LgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2hvcnQgYnVmZmVyIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBzaG9ydCBhcnJheS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUgPGNvZGU+c3RhcnQ8L2NvZGU+LCBsaW1pdCB3aWxsIGJlCi0gICAgICogPGNvZGU+c3RhcnQgKyBsZW48L2NvZGU+LCBjYXBhY2l0eSB3aWxsIGJlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgorICAgICAqIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSB7QGNvZGUgc3RhcnR9LCBsaW1pdCB3aWxsIGJlCisgICAgICoge0Bjb2RlIHN0YXJ0ICsgbGVufSwgY2FwYWNpdHkgd2lsbCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gYXJyYXkKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaG9ydCBhcnJheSB3aGljaCB0aGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGJhc2VkIG9uCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgYXJyYXkgd2hpY2ggdGhlIG5ldyBidWZmZXIgd2lsbCBiZSBiYXNlZCBvbi4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBzdGFydCBpbmRleCwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5hcnJheS5sZW5ndGg8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXgsIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBub3QgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgYXJyYXkubGVuZ3RofS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBUaGUgbGVuZ3RoLCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmFycmF5Lmxlbmd0aCAtIHN0YXJ0PC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgc2hvcnQgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoLCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGFycmF5Lmxlbmd0aCAtIHN0YXJ0fS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHNob3J0IGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IG9yIDxjb2RlPmxlbjwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgZWl0aGVyIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNob3J0QnVmZmVyIHdyYXAoc2hvcnRbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuKSB7CiAgICAgICAgICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKQEAgLTEwMCw3ICsxMDQsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5TaG9ydEJ1ZmZlcjwvY29kZT4gd2l0aCBnaXZlbiBjYXBhY2l0eS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIFNob3J0QnVmZmVyfSB3aXRoIGdpdmVuIGNhcGFjaXR5LgogICAgICAqCiAgICAgICogQHBhcmFtIGNhcGFjaXR5CiAgICAgICogICAgICAgICAgICBUaGUgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlcgpAQCAtMTEzLDEzICsxMTcsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaG9ydCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiwgaWYgdGhlcmUncyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaG9ydCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbgorICAgICAqIFJldHVybnMgdGhlIHNob3J0IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2hvcnQgYXJyYXkgd2hpY2ggdGhpcyBidWZmZXIgaXMgYmFzZWQgb24uCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGFuIGFycmF5LCBidXQgaXQgaXMgcmVhZG9ubHkKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhbiBhcnJheSwgYnV0IGl0IGlzIHJlYWQtb25seS4KICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGFuIGFycmF5CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBidWZmZXIgaXMgbm90IGJhc2VkIG9uIGFuIGFycmF5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzaG9ydFtdIGFycmF5KCkgewogICAgICAgICByZXR1cm4gcHJvdGVjdGVkQXJyYXkoKTsKQEAgLTEyNywxNyArMTMyLDE4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIHNob3J0IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uLCBpZgotICAgICAqIHRoZXJlJ3Mgb25lLgorICAgICAqIHRoZXJlIGlzIG9uZS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgb2Zmc2V0IGlzIHRoZSBpbmRleCBvZiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gdGhlIHplcm8gcG9zaXRpb24gb2YKLSAgICAgKiB0aGUgYnVmZmVyLgorICAgICAqIFRoZSBvZmZzZXQgaXMgdGhlIGluZGV4IG9mIHRoZSBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSB6ZXJvIHBvc2l0aW9uCisgICAgICogb2YgdGhlIGJ1ZmZlci4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvZmZzZXQgb2YgdGhlIHNob3J0IGFycmF5IHdoaWNoIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzaG9ydCBhcnJheSB3aGljaCB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbi4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYW4gYXJyYXksIGJ1dCBpdCBpcyByZWFkb25seQorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgYnVmZmVyIGlzIGJhc2VkIG9uIGFuIGFycmF5LCBidXQgaXQgaXMgcmVhZC1vbmx5LgogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYW4gYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYW4gYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBhcnJheU9mZnNldCgpIHsKICAgICAgICAgcmV0dXJuIHByb3RlY3RlZEFycmF5T2Zmc2V0KCk7CkBAIC0xNjAsNDggKzE2Niw1MCBAQAogICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmVhZG9ubHkgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5ldyBpbnN0YW5jZSwgZXZlbiB0aGlzIGJ1ZmZlcgotICAgICAqIGlzIHJlYWRvbmx5IGl0c2VsZi4gVGhlIG5ldyBidWZmZXIncyBwb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5IGFuZCBtYXJrCi0gICAgICogYXJlIHRoZSBzYW1lIGFzIHRoaXMgYnVmZmVyLgorICAgICAqIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5ldyBpbnN0YW5jZSwgZXZlbiBpZiB0aGlzCisgICAgICogYnVmZmVyIGlzIHJlYWQtb25seSBpdHNlbGYuIFRoZSBuZXcgYnVmZmVyJ3MgcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eQorICAgICAqIGFuZCBtYXJrIGFyZSB0aGUgc2FtZSBhcyB0aGlzIGJ1ZmZlcidzLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLCB3aGljaCBtZWFucyB0aGlzIGJ1ZmZlcidzCi0gICAgICogY2hhbmdlIG9mIGNvbnRlbnQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBuZXcgYnVmZmVyLiBUaGUgdHdvIGJ1ZmZlcidzCi0gICAgICogcG9zaXRpb24sIGxpbWl0IGFuZCBtYXJrIGFyZSBpbmRlcGVuZGVudC4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlciBzaGFyZXMgaXRzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgdGhpcworICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgbmV3IGJ1ZmZlci4gVGhlIHR3bworICAgICAqIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCBhbmQgbWFyayBhcmUgaW5kZXBlbmRlbnQuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIHJlYWRvbmx5IHZlcnNpb24gb2YgdGhpcyBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhIHJlYWQtb25seSB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCk7CiAKICAgICAvKioKICAgICAgKiBDb21wYWN0cyB0aGlzIHNob3J0IGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVtYWluaW5nIDxjb2RlPnNob3J0PC9jb2RlPnMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUKLSAgICAgKiBidWZmZXIsIHN0YXJpbmcgZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8KLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT47IHRoZSBsaW1pdCBpcyBzZXQgdG8gY2FwYWNpdHk7IHRoZSBtYXJrIGlzCi0gICAgICogY2xlYXJlZC4KKyAgICAgKiBUaGUgcmVtYWluaW5nIHNob3J0cyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBidWZmZXIsIHN0YXJ0aW5nCisgICAgICogZnJvbSBwb3NpdGlvbiB6ZXJvLiBUaGVuIHRoZSBwb3NpdGlvbiBpcyBzZXQgdG8ge0Bjb2RlIHJlbWFpbmluZygpfTsgdGhlCisgICAgICogbGltaXQgaXMgc2V0IHRvIGNhcGFjaXR5OyB0aGUgbWFyayBpcyBjbGVhcmVkLgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydEJ1ZmZlciBjb21wYWN0KCk7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgPGNvZGU+c2hvcnQ8L2NvZGU+cyBvZiB0aGlzIGJ1ZmZlciB0byBhbm90aGVyCi0gICAgICogc2hvcnQgYnVmZmVyJ3MgcmVtYWluaW5nIDxjb2RlPnNob3J0PC9jb2RlPnMuCi0gICAgICoKKyAgICAgKiBDb21wYXJlIHRoZSByZW1haW5pbmcgc2hvcnRzIG9mIHRoaXMgYnVmZmVyIHRvIGFub3RoZXIgc2hvcnQgYnVmZmVyJ3MKKyAgICAgKiByZW1haW5pbmcgc2hvcnRzLgorICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlckJ1ZmZlcgotICAgICAqICAgICAgICAgICAgQW5vdGhlciBzaG9ydCBidWZmZXIKLSAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhpcyBpcyBsZXNzIHRoYW4gPGNvZGU+b3RoZXI8L2NvZGU+OyAwIGlmCi0gICAgICogICAgICAgICB0aGlzIGVxdWFscyB0byA8Y29kZT5vdGhlcjwvY29kZT47IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhpcyBpcwotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIDxjb2RlPm90aGVyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgYW5vdGhlciBzaG9ydCBidWZmZXIuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMgaXMgbGVzcyB0aGFuIHtAY29kZSBvdGhlckJ1ZmZlcn07IDAgaWYKKyAgICAgKiAgICAgICAgIHRoaXMgZXF1YWxzIHRvIHtAY29kZSBvdGhlckJ1ZmZlcn07IGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhpcyBpcworICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBvdGhlckJ1ZmZlcn0uCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5vdGhlcjwvY29kZT4gaXMgbm90IGEgc2hvcnQgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIG90aGVyQnVmZmVyfSBpcyBub3QgYSBzaG9ydCBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oU2hvcnRCdWZmZXIgb3RoZXJCdWZmZXIpIHsKICAgICAgICAgaW50IGNvbXBhcmVSZW1haW5pbmcgPSAocmVtYWluaW5nKCkgPCBvdGhlckJ1ZmZlci5yZW1haW5pbmcoKSkgPyByZW1haW5pbmcoKQpAQCAtMjIzLDM2ICsyMzEsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHVwbGljYXRlZCBidWZmZXIgdGhhdCBzaGFyZXMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIFJldHVybnMgYSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgogICAgICAqIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHBvc2l0aW9uLCBsaW1pdCwgY2FwYWNpdHkgYW5kIG1hcmsgYXJlIHRoZSBzYW1lCi0gICAgICogYXMgdGhpcyBidWZmZXIuIFRoZSBkdXBsaWNhdGVkIGJ1ZmZlcidzIHJlYWRvbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyCi0gICAgICogYXJlIHNhbWUgYXMgdGhpcyBidWZmZXIgdG9vLgorICAgICAqIGFzIHRoaXMgYnVmZmVyLiBUaGUgZHVwbGljYXRlZCBidWZmZXIncyByZWFkLW9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIKKyAgICAgKiBhcmUgdGhlIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCisgICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgogICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuIFRoZSB0d28gYnVmZmVyJ3MKICAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBkdXBsaWNhdGVkIGJ1ZmZlciB0aGF0IHNoYXJlcyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhIGR1cGxpY2F0ZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNob3J0QnVmZmVyIGR1cGxpY2F0ZSgpOwogCiAgICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGlzIHNob3J0IGJ1ZmZlciBlcXVhbHMgdG8gYW5vdGhlciBvYmplY3QuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBzaG9ydCBidWZmZXIgaXMgZXF1YWwgdG8gYW5vdGhlciBvYmplY3QuCiAgICAgICogPHA+Ci0gICAgICogSWYgPGNvZGU+b3RoZXI8L2NvZGU+IGlzIG5vdCBhIHNob3J0IGJ1ZmZlciwgdGhlbiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBJZiB7QGNvZGUgb3RoZXJ9IGlzIG5vdCBhIHNob3J0IGJ1ZmZlciB0aGVuIHtAY29kZSBmYWxzZX0gaXMgcmV0dXJuZWQuCisgICAgICogVHdvIHNob3J0IGJ1ZmZlcnMgYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZWlyIHJlbWFpbmluZyBzaG9ydHMgYXJlCisgICAgICogZXhhY3RseSB0aGUgc2FtZS4gUG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBhcmUgbm90IGNvbnNpZGVyZWQuCiAgICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFR3byBzaG9ydCBidWZmZXJzIGFyZSBlcXVhbHMgaWYsIGFuZCBvbmx5IGlmLCB0aGVpciByZW1haW5pbmcKLSAgICAgKiA8Y29kZT5zaG9ydDwvY29kZT5zIGFyZSBleGFjdGx5IHRoZSBzYW1lLiBQb3NpdGlvbiwgbGltaXQsIGNhcGFjaXR5Ci0gICAgICogYW5kIG1hcmsgYXJlIG5vdCBjb25zaWRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlcgotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCBhZ2FpbnN0Ci0gICAgICogQHJldHVybiBXaGV0aGVyIHRoaXMgc2hvcnQgYnVmZmVyIGVxdWFscyB0byBhbm90aGVyIG9iamVjdC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgc2hvcnQgYnVmZmVyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgc2hvcnQgYnVmZmVyIGlzIGVxdWFsIHRvIHtAY29kZSBvdGhlcn0sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CiAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2hvcnRCdWZmZXIpKSB7CkBAIC0yNzUsNTQgKzI4Myw1NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNob3J0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgMS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNob3J0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIFJldHVybnMgdGhlIHNob3J0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZXMgdGhlIHBvc2l0aW9uIGJ5CisgICAgICogMS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzaG9ydCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiBAZXhjZXB0aW9uIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcG9zaXRpb24gaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGxpbWl0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBzaG9ydCBnZXQoKTsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDxjb2RlPnNob3J0PC9jb2RlPnMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzaG9ydCBhcnJheSBhbmQgaW5jcmVhc2UgdGhlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgPGNvZGU+c2hvcnQ8L2NvZGU+cwotICAgICAqIHJlYWQuCisgICAgICogUmVhZHMgc2hvcnRzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkIHNob3J0IGFycmF5IGFuZAorICAgICAqIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBzaG9ydHMgcmVhZC4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT5nZXQoZGVzdCwgMCwgZGVzdC5sZW5ndGgpPC9jb2RlPi4KKyAgICAgKiB7QGNvZGUgZ2V0KGRlc3QsIDAsIGRlc3QubGVuZ3RoKX0uCiAgICAgICogPC9wPgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIGRlc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBzaG9ydCBhcnJheQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBzaG9ydCBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgPGNvZGU+ZGVzdC5sZW5ndGg8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBkZXN0Lmxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSByZW1haW5pbmcoKX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNob3J0QnVmZmVyIGdldChzaG9ydFtdIGRlc3QpIHsKICAgICAgICAgcmV0dXJuIGdldChkZXN0LCAwLCBkZXN0Lmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgPGNvZGU+c2hvcnQ8L2NvZGU+cyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZAotICAgICAqIHNob3J0IGFycmF5LCBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBhbmQgaW5jcmVhc2UgdGhlCi0gICAgICogcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5zaG9ydDwvY29kZT5zIHJlYWQuCi0gICAgICoKKyAgICAgKiBSZWFkcyBzaG9ydHMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgc2hvcnQgYXJyYXksCisgICAgICogc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldCwgYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIHNob3J0cyByZWFkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBkZXN0Ci0gICAgICogICAgICAgICAgICBUaGUgdGFyZ2V0IHNob3J0IGFycmF5CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHNob3J0IGFycmF5LgogICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgdGhlIHNob3J0IGFycmF5LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZAotICAgICAqICAgICAgICAgICAgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPmRlc3QubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgc2hvcnQgYXJyYXksIG11c3Qgbm90IGJlIG5lZ2F0aXZlIGFuZCBub3QKKyAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgZGVzdC5sZW5ndGh9LgogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgPGNvZGU+c2hvcnQ8L2NvZGU+cyB0byByZWFkLCBtdXN0IGJlIG5vIGxlc3MKLSAgICAgKiAgICAgICAgICAgIHRoYW4gemVybyBhbmQgbm8gZ3JlYXRlciB0aGFuIDxjb2RlPmRlc3QubGVuZ3RoIC0gb2ZmPC9jb2RlPgotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2hvcnRzIHRvIHJlYWQsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kCisgICAgICogICAgICAgICAgICBub3QgZ3JlYXRlciB0aGFuIHtAY29kZSBkZXN0Lmxlbmd0aCAtIG9mZn0uCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBlaXRoZXIgPGNvZGU+b2ZmPC9jb2RlPiBvciA8Y29kZT5sZW48L2NvZGU+IGlzCi0gICAgICogICAgICAgICAgICAgICAgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGVpdGhlciB7QGNvZGUgb2ZmfSBvciB7QGNvZGUgbGVufSBpcyBpbnZhbGlkLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+bGVuPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgbGVufSBpcyBncmVhdGVyIHRoYW4ge0Bjb2RlIHJlbWFpbmluZygpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2hvcnRCdWZmZXIgZ2V0KHNob3J0W10gZGVzdCwgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbGVuZ3RoID0gZGVzdC5sZW5ndGg7CkBAIC0zMzksMzUgKzM0NywzNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzaG9ydCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBhbmQgdGhlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLgotICAgICAqCisgICAgICogUmV0dXJucyB0aGUgc2hvcnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleDsgdGhlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLgorICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgVGhlIGluZGV4LCBtdXN0IGJlIG5vIGxlc3MgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gbGltaXQKLSAgICAgKiBAcmV0dXJuIEEgc2hvcnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiBsaW1pdC4KKyAgICAgKiBAcmV0dXJuIGEgc2hvcnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBpbmRleCBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgaW5kZXggaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0KGludCBpbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBzaG9ydCBhcnJheSBhbmQgaXMgcmVhZC93cml0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIGJ1ZmZlciBpcyByZWFkb25seSwgdGhlbiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBzaG9ydCBhcnJheSBhbmQgaXMgcmVhZC93cml0ZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBiYXNlZCBvbiBhIHNob3J0IGFycmF5IGFuZCBpcworICAgICAqIHJlYWQvd3JpdGUuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBidWZmZXIgaXMgYmFzZWQgb24gYSBzaG9ydCBhcnJheSBhbmQKKyAgICAgKiAgICAgICAgIHByb3ZpZGVzIHJlYWQvd3JpdGUgYWNjZXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBcnJheSgpIHsKICAgICAgICAgcmV0dXJuIHByb3RlY3RlZEhhc0FycmF5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGFzaCBjb2RlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVtYWluaW5nIDxjb2RlPnNob3J0PC9jb2RlPnMuCi0gICAgICogPHA+Ci0gICAgICogUG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBkb24ndCBhZmZlY3QgdGhlIGhhc2ggY29kZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBoYXNoIGNvZGUgY2FsY3VsYXRlZCBmcm9tIHRoZSByZW1haW5pbmcgPGNvZGU+c2hvcnQ8L2NvZGU+cy4KKyAgICAgKiBDYWxjdWxhdGVzIHRoaXMgYnVmZmVyJ3MgaGFzaCBjb2RlIGZyb20gdGhlIHJlbWFpbmluZyBjaGFycy4gVGhlCisgICAgICogcG9zaXRpb24sIGxpbWl0LCBjYXBhY2l0eSBhbmQgbWFyayBkb24ndCBhZmZlY3QgdGhlIGhhc2ggY29kZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgY2FsY3VsYXRlZCBmcm9tIHRoZSByZW1haW5pbmcgc2hvcnRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBteVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC0zNzksMTE5ICszODcsMTE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBkaXJlY3QuIEEgZGlyZWN0IGJ1ZmZlciB3aWxsIHRyeSBpdHMKKyAgICAgKiBiZXN0IHRvIHRha2UgYWR2YW50YWdlIG9mIG5hdGl2ZSBtZW1vcnkgQVBJcyBhbmQgaXQgbWF5IG5vdCBzdGF5IGluIHRoZQorICAgICAqIEphdmEgaGVhcCwgc28gaXQgaXMgbm90IGFmZmVjdGVkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4KICAgICAgKiA8cD4KLSAgICAgKiBBIGRpcmVjdCBidWZmZXIgd2lsbCB0cnkgaXRzIGJlc3QgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbmF0aXZlIG1lbW9yeSBBUElzCi0gICAgICogYW5kIGl0IG1heSBub3Qgc3RheSBpbiBqYXZhIGhlYXAsIHRodXMgbm90IGFmZmVjdGVkIGJ5IEdDLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHNob3J0IGJ1ZmZlciBpcyBkaXJlY3QsIGlmIGl0IGlzIGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIgYW5kIHRoZSBieXRlCisgICAgICogQSBzaG9ydCBidWZmZXIgaXMgZGlyZWN0IGlmIGl0IGlzIGJhc2VkIG9uIGEgYnl0ZSBidWZmZXIgYW5kIHRoZSBieXRlCiAgICAgICogYnVmZmVyIGlzIGRpcmVjdC4KICAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBidWZmZXIgaXMgZGlyZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgYnVmZmVyIGlzIGRpcmVjdCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXJlY3QoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcKLSAgICAgKiA8Y29kZT5zaG9ydDwvY29kZT5zIGZyb20vdG8gPGNvZGU+Ynl0ZTwvY29kZT5zLgorICAgICAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgdXNlZCBieSB0aGlzIGJ1ZmZlciB3aGVuIGNvbnZlcnRpbmcgc2hvcnRzIGZyb20vdG8KKyAgICAgKiBieXRlcy4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGlzIGJ1ZmZlciBpcyBub3QgYmFzZWQgb24gYSBieXRlIGJ1ZmZlciwgdGhlbiBhbHdheXMgcmV0dXJuIHRoZQogICAgICAqIHBsYXRmb3JtJ3MgbmF0aXZlIGJ5dGUgb3JkZXIuCiAgICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgYnl0ZSBvcmRlciB1c2VkIGJ5IHRoaXMgYnVmZmVyIHdoZW4gY29udmVydGluZwotICAgICAqICAgICAgICAgPGNvZGU+c2hvcnQ8L2NvZGU+cyBmcm9tL3RvIDxjb2RlPmJ5dGU8L2NvZGU+cy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIG9yZGVyIHVzZWQgYnkgdGhpcyBidWZmZXIgd2hlbiBjb252ZXJ0aW5nIHNob3J0cyBmcm9tL3RvCisgICAgICogICAgICAgICBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZU9yZGVyIG9yZGVyKCk7CiAKICAgICAvKioKLSAgICAgKiBDaGlsZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIHRvIHJlYWxpemUgPGNvZGU+YXJyYXkoKTwvY29kZT4uCisgICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIHtAY29kZSBhcnJheSgpfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gc2VlIDxjb2RlPmFycmF5KCk8L2NvZGU+CisgICAgICogQHJldHVybiBzZWUge0Bjb2RlIGFycmF5KCl9CiAgICAgICovCiAgICAgYWJzdHJhY3Qgc2hvcnRbXSBwcm90ZWN0ZWRBcnJheSgpOwogCiAgICAgLyoqCi0gICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIDxjb2RlPmFycmF5T2Zmc2V0KCk8L2NvZGU+LgorICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSB7QGNvZGUgYXJyYXlPZmZzZXQoKX0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHNlZSA8Y29kZT5hcnJheU9mZnNldCgpPC9jb2RlPgorICAgICAqIEByZXR1cm4gc2VlIHtAY29kZSBhcnJheU9mZnNldCgpfQogICAgICAqLwogICAgIGFic3RyYWN0IGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpOwogCiAgICAgLyoqCi0gICAgICogQ2hpbGQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCB0byByZWFsaXplIDxjb2RlPmhhc0FycmF5KCk8L2NvZGU+LgorICAgICAqIENoaWxkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QgdG8gcmVhbGl6ZSB7QGNvZGUgaGFzQXJyYXkoKX0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHNlZSA8Y29kZT5oYXNBcnJheSgpPC9jb2RlPgorICAgICAqIEByZXR1cm4gc2VlIHtAY29kZSBoYXNBcnJheSgpfQogICAgICAqLwogICAgIGFic3RyYWN0IGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gc2hvcnQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlIHRoZSBwb3NpdGlvbgorICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gc2hvcnQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24KICAgICAgKiBieSAxLgotICAgICAqCisgICAgICogCiAgICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaG9ydCB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBwb3NpdGlvbiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gbGltaXQuCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNob3J0QnVmZmVyIHB1dChzaG9ydCBzKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyA8Y29kZT5zaG9ydDwvY29kZT5zIGluIHRoZSBnaXZlbiBzaG9ydCBhcnJheSB0byB0aGUgY3VycmVudAotICAgICAqIHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiA8Y29kZT5zaG9ydDwvY29kZT5zCi0gICAgICogd3JpdHRlbi4KKyAgICAgKiBXcml0ZXMgc2hvcnRzIGZyb20gdGhlIGdpdmVuIHNob3J0IGFycmF5IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZAorICAgICAqIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBzaG9ydHMgd3JpdHRlbi4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKLSAgICAgKiA8Y29kZT5wdXQoc3JjLCAwLCBzcmMubGVuZ3RoKTwvY29kZT4uCisgICAgICoge0Bjb2RlIHB1dChzcmMsIDAsIHNyYy5sZW5ndGgpfS4KICAgICAgKiA8L3A+Ci0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICBUaGUgc291cmNlIHNob3J0IGFycmF5Ci0gICAgICogQHJldHVybiBUaGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBzaG9ydCBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gaXMgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+c3JjLmxlbmd0aDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgcmVtYWluaW5nKCl9IGlzIGxlc3MgdGhhbiB7QGNvZGUgc3JjLmxlbmd0aH0uCiAgICAgICogQGV4Y2VwdGlvbiBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgaWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFNob3J0QnVmZmVyIHB1dChzaG9ydFtdIHNyYykgewogICAgICAgICByZXR1cm4gcHV0KHNyYywgMCwgc3JjLmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDxjb2RlPnNob3J0PC9jb2RlPnMgaW4gdGhlIGdpdmVuIHNob3J0IGFycmF5LCBzdGFydGluZyBmcm9tIHRoZQotICAgICAqIHNwZWNpZmllZCBvZmZzZXQsIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBpbmNyZWFzZSB0aGUgcG9zaXRpb24gYnkKLSAgICAgKiB0aGUgbnVtYmVyIG9mIDxjb2RlPnNob3J0PC9jb2RlPnMgd3JpdHRlbi4KLSAgICAgKgorICAgICAqIFdyaXRlcyBzaG9ydHMgZnJvbSB0aGUgZ2l2ZW4gc2hvcnQgYXJyYXksIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIG9mZnNldCwgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlYXNlcyB0aGUgcG9zaXRpb24gYnkgdGhlIG51bWJlcgorICAgICAqIG9mIHNob3J0cyB3cml0dGVuLgorICAgICAqIAogICAgICAqIEBwYXJhbSBzcmMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc2hvcnQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugc2hvcnQgYXJyYXkuCiAgICAgICogQHBhcmFtIG9mZgotICAgICAqICAgICAgICAgICAgVGhlIG9mZnNldCBvZiBzaG9ydCBhcnJheSwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQgbm8KLSAgICAgKiAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiA8Y29kZT5zcmMubGVuZ3RoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiBzaG9ydCBhcnJheSwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIG5vdAorICAgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBzcmMubGVuZ3RofS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIDxjb2RlPnNob3J0PC9jb2RlPnMgdG8gd3JpdGUsIG11c3QgYmUgbm8gbGVzcwotICAgICAqICAgICAgICAgICAgdGhhbiB6ZXJvIGFuZCBubyBncmVhdGVyIHRoYW4gPGNvZGU+c3JjLmxlbmd0aCAtIG9mZjwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNob3J0cyB0byB3cml0ZSwgbXVzdCBiZSBubyBsZXNzIHRoYW4gemVybyBhbmQKKyAgICAgKiAgICAgICAgICAgIG5vdCBncmVhdGVyIHRoYW4ge0Bjb2RlIHNyYy5sZW5ndGggLSBvZmZ9LgorICAgICAqIEByZXR1cm4gdGhpcyBidWZmZXIuCiAgICAgICogQGV4Y2VwdGlvbiBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiBpcyBsZXNzIHRoYW4KLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5sZW48L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHJlbWFpbmluZygpfSBpcyBsZXNzIHRoYW4ge0Bjb2RlIGxlbn0uCiAgICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgZWl0aGVyIDxjb2RlPm9mZjwvY29kZT4gb3IgPGNvZGU+bGVuPC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlaXRoZXIge0Bjb2RlIG9mZn0gb3Ige0Bjb2RlIGxlbn0gaXMgaW52YWxpZC4KICAgICAgKiBAZXhjZXB0aW9uIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgbm8gY2hhbmdlcyBtYXkgYmUgbWFkZSB0byB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2hvcnRCdWZmZXIgcHV0KHNob3J0W10gc3JjLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CiAgICAgICAgIGludCBsZW5ndGggPSBzcmMubGVuZ3RoOwogICAgICAgICBpZiAob2ZmIDwgMCB8fCBsZW4gPCAwIHx8IChsb25nKW9mZiArIChsb25nKWxlbiA+IGxlbmd0aCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAobGVuID4gcmVtYWluaW5nKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC01MDIsMjAgKzUwOSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhbGwgdGhlIHJlbWFpbmluZyA8Y29kZT5zaG9ydDwvY29kZT5zIG9mIHRoZSA8Y29kZT5zcmM8L2NvZGU+Ci0gICAgICogc2hvcnQgYnVmZmVyIHRvIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbiwgYW5kIGluY3JlYXNlIGJvdGgKLSAgICAgKiBidWZmZXJzJyBwb3NpdGlvbiBieSB0aGUgbnVtYmVyIG9mIDxjb2RlPnNob3J0PC9jb2RlPnMgY29waWVkLgotICAgICAqCisgICAgICogV3JpdGVzIGFsbCB0aGUgcmVtYWluaW5nIHNob3J0cyBvZiB0aGUge0Bjb2RlIHNyY30gc2hvcnQgYnVmZmVyIHRvIHRoaXMKKyAgICAgKiBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLCBhbmQgaW5jcmVhc2VzIGJvdGggYnVmZmVycycgcG9zaXRpb24gYnkgdGhlCisgICAgICogbnVtYmVyIG9mIHNob3J0cyBjb3BpZWQuCisgICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgVGhlIHNvdXJjZSBzaG9ydCBidWZmZXIKLSAgICAgKiBAcmV0dXJuIFRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIHNob3J0IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT5zcmMucmVtYWluaW5nKCk8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgYnVmZmVyJ3MgPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHNyYy5yZW1haW5pbmcoKX0gaXMgZ3JlYXRlciB0aGFuIHRoaXMgYnVmZmVyJ3MKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgcmVtYWluaW5nKCl9LgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgPGNvZGU+c3JjPC9jb2RlPiBpcyB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBzcmN9IGlzIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTaG9ydEJ1ZmZlciBwdXQoU2hvcnRCdWZmZXIgc3JjKSB7CiAgICAgICAgIGlmIChzcmMgPT0gdGhpcykgewpAQCAtNTMxLDQ0ICs1MzksNDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhIHNob3J0IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBidWZmZXIgYW5kIHRoZSBwb3NpdGlvbiBpcwotICAgICAqIG5vdCBjaGFuZ2VkLgotICAgICAqCisgICAgICogV3JpdGVzIGEgc2hvcnQgdG8gdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIGJ1ZmZlcjsgdGhlIHBvc2l0aW9uIGlzIG5vdAorICAgICAqIGNoYW5nZWQuCisgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBUaGUgaW5kZXgsIG11c3QgYmUgbm8gbGVzcyB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiB0aGUgbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCwgbXVzdCBub3QgYmUgbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiB0aGUgbGltaXQuCiAgICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaG9ydCB0byB3cml0ZQotICAgICAqIEByZXR1cm4gVGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB0byB3cml0ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyLgogICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGluZGV4IGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBpbmRleCBpcyBpbnZhbGlkLgogICAgICAqIEBleGNlcHRpb24gUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBjaGFuZ2VzIG1heSBiZSBtYWRlIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgICAgIGlmIG5vIGNoYW5nZXMgbWF5IGJlIG1hZGUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydEJ1ZmZlciBwdXQoaW50IGluZGV4LCBzaG9ydCBzKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzbGljZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiBSZXR1cm5zIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgogICAgICAqIDxwPgotICAgICAqIFRoZSBzbGljZWQgYnVmZmVyJ3MgY2FwYWNpdHkgd2lsbCBiZSB0aGlzIGJ1ZmZlcidzCi0gICAgICogPGNvZGU+cmVtYWluaW5nKCk8L2NvZGU+LCBhbmQgaXRzIHplcm8gcG9zaXRpb24gd2lsbCBjb3JyZXNwb25kIHRvCi0gICAgICogdGhpcyBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUgMCwKLSAgICAgKiBsaW1pdCB3aWxsIGJlIGl0cyBjYXBhY2l0eSwgYW5kIGl0cyBtYXJrIGlzIHVuc2V0LiBUaGUgbmV3IGJ1ZmZlcidzCi0gICAgICogcmVhZG9ubHkgcHJvcGVydHkgYW5kIGJ5dGUgb3JkZXIgYXJlIHNhbWUgYXMgdGhpcyBidWZmZXIuCisgICAgICogVGhlIHNsaWNlZCBidWZmZXIncyBjYXBhY2l0eSB3aWxsIGJlIHRoaXMgYnVmZmVyJ3Mge0Bjb2RlIHJlbWFpbmluZygpfSwKKyAgICAgKiBhbmQgaXRzIHplcm8gcG9zaXRpb24gd2lsbCBjb3JyZXNwb25kIHRvIHRoaXMgYnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBUaGUgbmV3IGJ1ZmZlcidzIHBvc2l0aW9uIHdpbGwgYmUgMCwgbGltaXQgd2lsbCBiZSBpdHMgY2FwYWNpdHksIGFuZCBpdHMKKyAgICAgKiBtYXJrIGlzIGNsZWFyZWQuIFRoZSBuZXcgYnVmZmVyJ3MgcmVhZC1vbmx5IHByb3BlcnR5IGFuZCBieXRlIG9yZGVyIGFyZQorICAgICAqIHNhbWUgYXMgdGhpcyBidWZmZXIncy4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlciwgd2hpY2ggbWVhbnMgZWl0aGVyCisgICAgICogVGhlIG5ldyBidWZmZXIgc2hhcmVzIGl0cyBjb250ZW50IHdpdGggdGhpcyBidWZmZXIsIHdoaWNoIG1lYW5zIGVpdGhlcgogICAgICAqIGJ1ZmZlcidzIGNoYW5nZSBvZiBjb250ZW50IHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgb3RoZXIuIFRoZSB0d28gYnVmZmVyJ3MKICAgICAgKiBwb3NpdGlvbiwgbGltaXQgYW5kIG1hcmsgYXJlIGluZGVwZW5kZW50LgogICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzbGljZWQgYnVmZmVyIHRoYXQgc2hhcmVzIGNvbnRlbnQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc2xpY2VkIGJ1ZmZlciB0aGF0IHNoYXJlcyBpdHMgY29udGVudCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydEJ1ZmZlciBzbGljZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGlzIHNob3J0IGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhpcyBzaG9ydCBidWZmZXIuCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoaXMgc2hvcnQgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIHNob3J0IGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvbi5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGEwOTJkYzkuLmQ1NTg0OTIgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0FscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9BbHJlYWR5Q29ubmVjdGVkRXhjZXB0aW9uLmphdmEKQEAgLTE4LDE1ICsxOCwxOSBAQAogCiAKIC8qKgotICogVGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGNvbm5lY3QgYSBTb2NrZXRDaGFubmVsIHRoYXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQuCisgKiBBbiB7QGNvZGUgQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvCisgKiBjb25uZWN0IGEgU29ja2V0Q2hhbm5lbCB0aGF0IGlzIGFscmVhZHkgY29ubmVjdGVkLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTczMzE4OTUyNDUwNTM3NzMzNTdMOwogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHtAY29kZSBBbHJlYWR5Q29ubmVjdGVkRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0FzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDJjMDdiYTBmLi5lMzRkOGQwIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0FzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uLmphdmEKQEAgLTE4LDE1ICsxOCwxOSBAQAogCiAKIC8qKgotICogVGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY2hhbm5lbCBmb3IgYW4gSU8gb3BlcmF0aW9uIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZC4KKyAqIEFuIHtAY29kZSBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY2hhbm5lbAorICogZm9yIGFuIEkvTyBvcGVyYXRpb24gaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uIGV4dGVuZHMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODkxMTc4MzEyNDMyMzEzOTY2TDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHtAY29kZSBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQnl0ZUNoYW5uZWwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0J5dGVDaGFubmVsLmphdmEKaW5kZXggMGMyNjJjMC4uOTdmNWQyMyAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQnl0ZUNoYW5uZWwuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9CeXRlQ2hhbm5lbC5qYXZhCkBAIC0yNCw2ICsyNCw5IEBACiAgKiB3cml0YWJsZSBieXRlIGNoYW5uZWxzLgogICogPC9wPgogICogCisgKiBAc2VlIFJlYWRhYmxlQnl0ZUNoYW5uZWwKKyAqIEBzZWUgV3JpdGFibGVCeXRlQ2hhbm5lbAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQnl0ZUNoYW5uZWwgZXh0ZW5kcyBSZWFkYWJsZUJ5dGVDaGFubmVsLCBXcml0YWJsZUJ5dGVDaGFubmVsIHsKICAgICAvLyBObyBtZXRob2RzIGRlZmluZWQuCmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DYW5jZWxsZWRLZXlFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0NhbmNlbGxlZEtleUV4Y2VwdGlvbi5qYXZhCmluZGV4IGM0NDhmZDguLmViYjdjNzYgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0NhbmNlbGxlZEtleUV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0NhbmNlbGxlZEtleUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCw4ICsxOCwxMCBAQAogCiAKIC8qKgotICogVGhyb3duIHdoZW4gYW4gaW52YWxpZCBzZWxlY3Rpb24ga2V5IGlzIHVzZWQuCisgKiBBIHtAY29kZSBDYW5jZWxsZWRLZXlFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGFuIGludmFsaWQgc2VsZWN0aW9uIGtleSBpcworICogdXNlZC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDYW5jZWxsZWRLZXlFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCkBAIC0yOSw4ICszMSw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg0MzgwMzIxMzgwMjg4MTQyNjhMOwogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIENhbmNlbGxlZEtleUV4Y2VwdGlvbn0uCiAgICAgICoKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbC5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbC5qYXZhCmluZGV4IGRhOWU3MTUuLjU4NWNlMjkgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0NoYW5uZWwuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DaGFubmVsLmphdmEKQEAgLTIxLDE5ICsyMSwxOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogQSBjaGFubmVsIGlzIGEgY29uZHVpdCB0byBJTyBzZXJ2aWNlcyBjb3ZlcmluZyBzdWNoIGl0ZW1zIGFzIGZpbGVzLCBzb2NrZXRzLAotICogaGFyZHdhcmUgZGV2aWNlcywgSU8gcG9ydHMsIG9yIHNvbWUgc29mdHdhcmUgY29tcG9uZW50LgorICogQSBjaGFubmVsIGlzIGEgY29uZHVpdCB0byBJL08gc2VydmljZXMgY292ZXJpbmcgc3VjaCBpdGVtcyBhcyBmaWxlcywgc29ja2V0cywKKyAqIGhhcmR3YXJlIGRldmljZXMsIEkvTyBwb3J0cyBvciBzb21lIHNvZnR3YXJlIGNvbXBvbmVudC4KICAqIDxwPgotICogQ2hhbm5lbHMgYXJlIG9wZW4gdXBvbiBjcmVhdGlvbiwgYW5kIGNhbiBiZSBleHBsaWNpdGx5IGNsb3NlZC4gT25jZSBhIGNoYW5uZWwKLSAqIGlzIGNsb3NlZCBpdCBjYW5ub3QgYmUgcmUtb3BlbmVkLCBhbmQgYXR0ZW1wdHMgdG8gcGVyZm9ybSBJTyBvcGVyYXRpb25zIG9uCi0gKiB0aGUgY2xvc2VkIGNoYW5uZWwgcmVzdWx0IGluIGEgPGNvZGU+Q2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICogPC9jb2RlPi4KKyAqIENoYW5uZWxzIGFyZSBvcGVuIHVwb24gY3JlYXRpb24sIGFuZCBjYW4gYmUgY2xvc2VkIGV4cGxpY2l0bHkuIE9uY2UgYSBjaGFubmVsCisgKiBpcyBjbG9zZWQgaXQgY2Fubm90IGJlIHJlLW9wZW5lZCwgYW5kIGFueSBhdHRlbXB0cyB0byBwZXJmb3JtIEkvTyBvcGVyYXRpb25zCisgKiBvbiB0aGUgY2xvc2VkIGNoYW5uZWwgcmVzdWx0IGluIGEgPGNvZGU+Q2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjwvY29kZT4uCiAgKiA8L3A+CiAgKiA8cD4KLSAqIFBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb25zIG9yIHN1Yi1pbnRlcmZhY2VzIG9mIENoYW5uZWwgZGljdGF0ZSB3aGV0aGVyIHRoZXkKLSAqIGFyZSB0aHJlYWQtc2FmZSBvciBub3QuCisgKiBQYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9ucyBvciBzdWItaW50ZXJmYWNlcyBvZiB7QGNvZGUgQ2hhbm5lbH0gZGljdGF0ZQorICogd2hldGhlciB0aGV5IGFyZSB0aHJlYWQtc2FmZSBvciBub3QuCiAgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENoYW5uZWwgZXh0ZW5kcyBDbG9zZWFibGUgewogCkBAIC00MSwyNyArNDEsMjggQEAKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjaGFubmVsIGlzIG9wZW4gb3Igbm90LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhbm5lbCBpcyBvcGVuLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKTsKIAogICAgIC8qKgotICAgICAqIENsb3NlcyBhbiBvcGVuIGNoYW5uZWwuCi0gICAgICogCi0gICAgICogSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4gSWYgdGhlcmUgaXMgYQotICAgICAqIHByb2JsZW0gd2l0aCBjbG9zaW5nIHRoZSBjaGFubmVsIHRoZW4gdGhlIG1ldGhvZCB0aHJvd3MgYW4gSU9FeGNlcHRpb24KLSAgICAgKiBhbmQgdGhlIGV4Y2VwdGlvbiBjb250YWlucyByZWFzb25zIGZvciB0aGUgZmFpbHVyZS4KKyAgICAgKiBDbG9zZXMgYW4gb3BlbiBjaGFubmVsLiBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZCB0aGVuIHRoaXMgbWV0aG9kCisgICAgICogaGFzIG5vIGVmZmVjdC4gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggY2xvc2luZyB0aGUgY2hhbm5lbCB0aGVuIHRoZQorICAgICAqIG1ldGhvZCB0aHJvd3MgYW4gSU9FeGNlcHRpb24gYW5kIHRoZSBleGNlcHRpb24gY29udGFpbnMgcmVhc29ucyBmb3IgdGhlCisgICAgICogZmFpbHVyZS4KICAgICAgKiA8cD4KICAgICAgKiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcGVyZm9ybSBhbiBvcGVyYXRpb24gb24gYSBjbG9zZWQgY2hhbm5lbCB0aGVuIGEKLSAgICAgKiA8Y29kZT5DbG9zZWRDaGFubmVsRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93biBvbiB0aGF0IGF0dGVtcHQuCisgICAgICoge0BsaW5rIENsb3NlZENoYW5uZWxFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duIG9uIHRoYXQgYXR0ZW1wdC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogSWYgbXVsdGlwbGUgdGhyZWFkcyBhdHRlbXB0cyB0byBzaW11bHRhbmVvdXNseSBjbG9zZSBhIGNoYW5uZWwsIHRoZW4gb25seQotICAgICAqIG9uZSB0aHJlYWQgd2lsbCBydW4gdGhlIGNsb3N1cmUgY29kZSwgYW5kIG90aGVycyB3aWxsIGJlIGJsb2NrZWQgdW50aWwgdGhlCi0gICAgICogZmlyc3QgcmV0dXJucy4KKyAgICAgKiBJZiBtdWx0aXBsZSB0aHJlYWRzIGF0dGVtcHQgdG8gc2ltdWx0YW5lb3VzbHkgY2xvc2UgYSBjaGFubmVsLCB0aGVuIG9ubHkKKyAgICAgKiBvbmUgdGhyZWFkIHdpbGwgcnVuIHRoZSBjbG9zdXJlIGNvZGUsIGFuZCBvdGhlcnMgd2lsbCBiZSBibG9ja2VkIHVudGlsCisgICAgICogdGhlIGZpcnN0IHJldHVybnMuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGNsb3NpbmcgdGhlIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DaGFubmVscy5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHMuamF2YQppbmRleCAxMGEzMDFjLi5mYTcwZGMwIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DaGFubmVscy5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0NoYW5uZWxzLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIC8qKgogICogVGhpcyBjbGFzcyBwcm92aWRlcyBzZXZlcmFsIHV0aWxpdGllcyB0byBnZXQgSS9PIHN0cmVhbXMgZnJvbSBjaGFubmVscy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFubmVscyB7CiAKQEAgLTUxLDQ0ICs1Miw4MCBAQAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIG9uIHRoZSBnaXZlbiBjaGFubmVsCisgICAgICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gb24gdGhlIGdpdmVuIGNoYW5uZWwuIFRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcworICAgICAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPklmIHRoZSBzdHJlYW0gaXMgY2xvc2VkLCB0aGVuIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwgaXMgY2xvc2VkIGFzCisgICAgICogd2VsbC48L2xpPgorICAgICAqIDxsaT5JdCBpcyB0aHJlYWQgc2FmZS48L2xpPgorICAgICAqIDxsaT5JdCB0aHJvd3MgYW4ge0BsaW5rIElsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb259IGlmIHRoZSBjaGFubmVsIGlzCisgICAgICogaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIHtAY29kZSByZWFkfSBpcyBjYWxsZWQuPC9saT4KKyAgICAgKiA8bGk+TmVpdGhlciB7QGNvZGUgbWFya30gbm9yIHtAY29kZSByZXNldH0gaXMgc3VwcG9ydGVkLjwvbGk+CisgICAgICogPGxpPkl0IGlzIG5vdCBidWZmZXJlZC48L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYW5uZWwKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFubmVsIHRvIGJlIHdyYXBwZWQgaW4gYW4gSW5wdXRTdHJlYW0uCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbCB0byBiZSB3cmFwcGVkIGJ5IGFuIElucHV0U3RyZWFtLgogICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gdGhhdCB0YWtlcyBieXRlcyBmcm9tIHRoZSBnaXZlbiBieXRlIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShSZWFkYWJsZUJ5dGVDaGFubmVsIGNoYW5uZWwpIHsKICAgICAgICAgcmV0dXJuIG5ldyBSZWFkYWJsZUJ5dGVDaGFubmVsSW5wdXRTdHJlYW0oY2hhbm5lbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvdXRwdXQgc3RyZWFtIG9uIHRoZSBnaXZlbiBjaGFubmVsCisgICAgICogUmV0dXJucyBhbiBvdXRwdXQgc3RyZWFtIG9uIHRoZSBnaXZlbiBjaGFubmVsLiBUaGUgcmVzdWx0aW5nIHN0cmVhbSBoYXMKKyAgICAgKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT5JZiB0aGUgc3RyZWFtIGlzIGNsb3NlZCwgdGhlbiB0aGUgdW5kZXJseWluZyBjaGFubmVsIGlzIGNsb3NlZCBhcworICAgICAqIHdlbGwuPC9saT4KKyAgICAgKiA8bGk+SXQgaXMgdGhyZWFkIHNhZmUuPC9saT4KKyAgICAgKiA8bGk+SXQgdGhyb3dzIGFuIHtAbGluayBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9ufSBpZiB0aGUgY2hhbm5lbCBpcworICAgICAqIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCB7QGNvZGUgd3JpdGV9IGlzIGNhbGxlZC48L2xpPgorICAgICAqIDxsaT5JdCBpcyBub3QgYnVmZmVyZWQuPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaGFubmVsCi0gICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbCB0byBiZSB3cmFwcGVkIGluIGFuIE91dHB1dFN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFubmVsIHRvIGJlIHdyYXBwZWQgYnkgYW4gT3V0cHV0U3RyZWFtLgogICAgICAqIEByZXR1cm4gYW4gT3V0cHV0U3RyZWFtIHRoYXQgcHV0cyBieXRlcyBvbnRvIHRoZSBnaXZlbiBieXRlIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBPdXRwdXRTdHJlYW0gbmV3T3V0cHV0U3RyZWFtKFdyaXRhYmxlQnl0ZUNoYW5uZWwgY2hhbm5lbCkgewogICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlQnl0ZUNoYW5uZWxPdXRwdXRTdHJlYW0oY2hhbm5lbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNoYW5uZWwgb24gdGhlIGdpdmVuIGlucHV0IHN0cmVhbQorICAgICAqIFJldHVybnMgYSByZWFkYWJsZSBjaGFubmVsIG9uIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0uIFRoZSByZXN1bHRpbmcKKyAgICAgKiBjaGFubmVsIGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT5JZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQsIHRoZW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGlzIGNsb3NlZCBhcworICAgICAqIHdlbGwuPC9saT4KKyAgICAgKiA8bGk+SXQgaXMgbm90IGJ1ZmZlcmVkLjwvbGk+CisgICAgICogPC91bD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gYmUgd3JhcHBlZCBpbiBhIGJ5dGUgY2hhbm5lbC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gYmUgd3JhcHBlZCBieSBhIGJ5dGUgY2hhbm5lbC4KICAgICAgKiBAcmV0dXJuIGEgYnl0ZSBjaGFubmVsIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgUmVhZGFibGVCeXRlQ2hhbm5lbCBuZXdDaGFubmVsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CiAgICAgICAgIHJldHVybiBuZXcgUmVhZGFibGVCeXRlQ2hhbm5lbEltcGwoaW5wdXRTdHJlYW0pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjaGFubmVsIG9uIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtCisgICAgICogUmV0dXJucyBhIHdyaXRhYmxlIGNoYW5uZWwgb24gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCisgICAgICogCisgICAgICogVGhlIHJlc3VsdGluZyBjaGFubmVsIGhhcyBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPklmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCwgdGhlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gaXMgY2xvc2VkIGFzCisgICAgICogd2VsbC48L2xpPgorICAgICAqIDxsaT5JdCBpcyBub3QgYnVmZmVyZWQuPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdXRwdXRTdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gYmUgd3JhcHBlZCBpbiBhIGJ5dGUgY2hhbm5lbC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gYmUgd3JhcHBlZCBieSBhIGJ5dGUgY2hhbm5lbC4KICAgICAgKiBAcmV0dXJuIGEgYnl0ZSBjaGFubmVsIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVCeXRlQ2hhbm5lbCBuZXdDaGFubmVsKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKICAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZUJ5dGVDaGFubmVsSW1wbChvdXRwdXRTdHJlYW0pOwpAQCAtOTgsMTIgKzEzNSwxNCBAQAogICAgICAqIFJldHVybnMgYSByZWFkZXIgdGhhdCBkZWNvZGVzIGJ5dGVzIGZyb20gYSBjaGFubmVsLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaGFubmVsCi0gICAgICogICAgICAgICAgICBDaGFubmVsIHRvIGJlIHJlYWQuCisgICAgICogICAgICAgICAgICB0aGUgQ2hhbm5lbCB0byBiZSByZWFkLgogICAgICAqIEBwYXJhbSBkZWNvZGVyCi0gICAgICogICAgICAgICAgICBDaGFyc2V0IGRlY29kZXIgdG8gYmUgdXNlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyc2V0IGRlY29kZXIgdG8gYmUgdXNlZC4KICAgICAgKiBAcGFyYW0gbWluQnVmZmVyQ2FwYWNpdHkKLSAgICAgKiAgICAgICAgICAgIFRoZSBtaW5pbXVtIHNpemUgb2YgYnl0ZSBidWZmZXIsIC0xIG1lYW5zIHRvIHVzZSBkZWZhdWx0IHNpemUuCi0gICAgICogQHJldHVybiBUaGUgcmVhZGVyLgorICAgICAqICAgICAgICAgICAgVGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgYnl0ZSBidWZmZXIsIC0xIG1lYW5zIHRvIHVzZSB0aGUKKyAgICAgKiAgICAgICAgICAgIGRlZmF1bHQgc2l6ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWFkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBSZWFkZXIgbmV3UmVhZGVyKFJlYWRhYmxlQnl0ZUNoYW5uZWwgY2hhbm5lbCwKICAgICAgICAgICAgIENoYXJzZXREZWNvZGVyIGRlY29kZXIsIGludCBtaW5CdWZmZXJDYXBhY2l0eSkgewpAQCAtMTEzLDEzICsxNTIsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmVhZGVyIHRoYXQgZGVjb2RlcyBieXRlcyBmcm9tIGEgY2hhbm5lbC4KKyAgICAgKiBSZXR1cm5zIGEgcmVhZGVyIHRoYXQgZGVjb2RlcyBieXRlcyBmcm9tIGEgY2hhbm5lbC4gVGhpcyBtZXRob2QgY3JlYXRlcyBhCisgICAgICogcmVhZGVyIHdpdGggYSBidWZmZXIgb2YgZGVmYXVsdCBzaXplLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaGFubmVsCi0gICAgICogICAgICAgICAgICBDaGFubmVsIHRvIGJlIHJlYWQuCisgICAgICogICAgICAgICAgICB0aGUgQ2hhbm5lbCB0byBiZSByZWFkLgogICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZQotICAgICAqICAgICAgICAgICAgTmFtZSBvZiBjaGFyc2V0LgotICAgICAqIEByZXR1cm4gVGhlIHJlYWRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0LgorICAgICAqIEByZXR1cm4gdGhlIHJlYWRlci4KKyAgICAgKiBAdGhyb3dzIGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGNoYXJzZXQgbmFtZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgUmVhZGVyIG5ld1JlYWRlcihSZWFkYWJsZUJ5dGVDaGFubmVsIGNoYW5uZWwsCiAgICAgICAgICAgICBTdHJpbmcgY2hhcnNldE5hbWUpIHsKQEAgLTEyNywxNiArMTcwLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHdyaXRlciB0aGF0IGVuY29kZXMgY2hhcmFjdGVycyBieSBlbmNvZGVyIGFuZCBvdXRwdXQgYnl0ZXMgdG8gYQotICAgICAqIGNoYW5uZWwuCisgICAgICogUmV0dXJucyBhIHdyaXRlciB0aGF0IGVuY29kZXMgY2hhcmFjdGVycyB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgZW5jb2Rlcn0gYW5kIHNlbmRzIHRoZSBieXRlcyB0byB0aGUgc3BlY2lmaWVkIGNoYW5uZWwuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYW5uZWwKLSAgICAgKiAgICAgICAgICAgIENoYW5uZWwgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFubmVsIHRvIHdyaXRlIHRvLgogICAgICAqIEBwYXJhbSBlbmNvZGVyCi0gICAgICogICAgICAgICAgICBDaGFyc2V0IGRlY29kZXIgdG8gYmUgdXNlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyc2V0RW5jb2RlciB0byBiZSB1c2VkLgogICAgICAqIEBwYXJhbSBtaW5CdWZmZXJDYXBhY2l0eQotICAgICAqICAgICAgICAgICAgVGhlIG1pbmltdW0gc2l6ZSBvZiBieXRlIGJ1ZmZlciwgLTEgbWVhbnMgdG8gdXNlIGRlZmF1bHQgc2l6ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSB3cml0ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBieXRlIGJ1ZmZlciwgLTEgbWVhbnMgdG8gdXNlIHRoZQorICAgICAqICAgICAgICAgICAgZGVmYXVsdCBzaXplLgorICAgICAqIEByZXR1cm4gdGhlIHdyaXRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFdyaXRlciBuZXdXcml0ZXIoV3JpdGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsLAogICAgICAgICAgICAgQ2hhcnNldEVuY29kZXIgZW5jb2RlciwgaW50IG1pbkJ1ZmZlckNhcGFjaXR5KSB7CkBAIC0xNDUsMTQgKzE5MCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSB3cml0ZXIgdGhhdCBlbmNvZGVzIGNoYXJhY3RlcnMgYnkgZW5jb2RlciBhbmQgb3V0cHV0IGJ5dGVzIHRvIGEKLSAgICAgKiBjaGFubmVsLgorICAgICAqIFJldHVybnMgYSB3cml0ZXIgdGhhdCBlbmNvZGVzIGNoYXJhY3RlcnMgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIGVuY29kZXJ9IGFuZCBzZW5kcyB0aGUgYnl0ZXMgdG8gdGhlIHNwZWNpZmllZCBjaGFubmVsLiBUaGlzIG1ldGhvZAorICAgICAqIGNyZWF0ZXMgYSB3cml0ZXIgd2l0aCBhIGJ1ZmZlciBvZiBkZWZhdWx0IHNpemUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYW5uZWwKLSAgICAgKiAgICAgICAgICAgIENoYW5uZWwgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFubmVsIHRvIGJlIHdyaXR0ZW4gdG8uCiAgICAgICogQHBhcmFtIGNoYXJzZXROYW1lCi0gICAgICogICAgICAgICAgICBOYW1lIG9mIGNoYXJzZXQuCi0gICAgICogQHJldHVybiBUaGUgd3JpdGVyLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoYXJzZXQuCisgICAgICogQHJldHVybiB0aGUgd3JpdGVyLgorICAgICAqIEB0aHJvd3MgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gY2hhcnNldCBuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBXcml0ZXIgbmV3V3JpdGVyKFdyaXRhYmxlQnl0ZUNoYW5uZWwgY2hhbm5lbCwKICAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0TmFtZSkgewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uLmphdmEKaW5kZXggNWM0YWEwYi4uYzdkNWM2YSAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyMCArMTgsMjQgQEAKIAogCiAvKioKLSAqIFRocm93biB3aGVuIGEgdGhyZWFkIGlzIGludGVycnVwdGVkIGluIGEgYmxvY2tpbmcgSU8gb3BlcmF0aW9uLgorICogQSB7QGNvZGUgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGEgdGhyZWFkIGlzIGludGVycnVwdGVkCisgKiBpbiBhIGJsb2NraW5nIEkvTyBvcGVyYXRpb24uCiAgKiA8cD4KLSAqIFdoZW4gdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBieSBhIGNhbGwgdG8gPGNvZGU+aW50ZXJydXB0KCk8L2NvZGU+Ci0gKiBpdCB3aWxsIGNsb3NlIHRoZSBjaGFubmVsLCBzZXQgdGhlIGludGVycnVwdCBzdGF0dXMgb2YgdGhlIHRocmVhZCB0byB0cnVlLAotICogYW5kIHRocm93IGEgPGNvZGU+Q2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb248L2NvZGU+LgorICogV2hlbiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkIGJ5IGEgY2FsbCB0byB7QGNvZGUgaW50ZXJydXB0KCl9LCBpdCBjbG9zZXMKKyAqIHRoZSBjaGFubmVsLCBzZXRzIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIG9mIHRoZSB0aHJlYWQgdG8ge0Bjb2RlIHRydWV9IGFuZAorICogdGhyb3dzIGEge0Bjb2RlIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9ufS4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbiBleHRlbmRzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NDg4MTkxNTQzNTM0Mjg2NzUwTDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DbG9zZWRDaGFubmVsRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DbG9zZWRDaGFubmVsRXhjZXB0aW9uLmphdmEKaW5kZXggYTJhYjFjMy4uNGNmNGIzOCAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZENoYW5uZWxFeGNlcHRpb24uamF2YQpAQCAtMjAsMTYgKzIwLDE5IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhIGNoYW5uZWwgaXMgY2xvc2VkIGZvciB0aGUgdHlwZSBvZiBvcGVyYXRpb24KLSAqIGF0dGVtcHRlZC4KKyAqIEEge0Bjb2RlIENsb3NlZENoYW5uZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGEgY2hhbm5lbCBpcyBjbG9zZWQgZm9yIHRoZQorICogdHlwZSBvZiBvcGVyYXRpb24gYXR0ZW1wdGVkLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENsb3NlZENoYW5uZWxFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4ODI3NzcxODU0MzM1NTM4NTdMOwogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBDbG9zZWRDaGFubmVsRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZFNlbGVjdG9yRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9DbG9zZWRTZWxlY3RvckV4Y2VwdGlvbi5qYXZhCmluZGV4IDYyZGNhMDcuLjBmYjE2ZDMgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZFNlbGVjdG9yRXhjZXB0aW9uLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24uamF2YQpAQCAtMTgsMTYgKzE4LDE5IEBACiAKIAogLyoqCi0gKiBUaHJvd24gd2hlbiBhbiBhIHNlbGVjdG9yIGlzIGNsb3NlZCBhbmQgYW4gSU8gb3BlcmF0aW9uIGlzIGF0dGVtcHRlZC4KKyAqIEEge0Bjb2RlIENsb3NlZFNlbGVjdG9yRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhIHtAbGluayBTZWxlY3RvciBzZWxlY3Rvcn0KKyAqIGlzIGNsb3NlZCBhbmQgYW4gSS9PIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjQ2NjI5NzEyMjMxNzg0NzgzNUw7CiAgICAgCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IGNmNmZkMjUuLmM1MzU5MjUgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb24uamF2YQpAQCAtMTgsMTcgKzE4LDIwIEBACiAKIAogLyoqCi0gKiBUaHJvd24gd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gY29ubmVjdCBhIFNvY2tldENoYW5uZWwgdGhhdCBoYXMgYQotICogbm9uLWJsb2NraW5nIGNvbm5lY3Rpb24gYWxyZWFkeSB1bmRlcndheS4KKyAqIEEge0Bjb2RlIENvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KKyAqIGNvbm5lY3QgYSB7QGxpbmsgU29ja2V0Q2hhbm5lbH0gdGhhdCBoYXMgYSBub24tYmxvY2tpbmcgY29ubmVjdGlvbiBhbHJlYWR5CisgKiB1bmRlcndheS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDA4MzkzMzY2NTAxNzYwODc5TDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBDb25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbn0uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvRGF0YWdyYW1DaGFubmVsLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9EYXRhZ3JhbUNoYW5uZWwuamF2YQppbmRleCBkNWM5OWUyMmMuLjUzNDE1NWEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0RhdGFncmFtQ2hhbm5lbC5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0RhdGFncmFtQ2hhbm5lbC5qYXZhCkBAIC0yNywyMiArMjcsMjMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybTsKIAogLyoqCi0gKiBBIERhdGFncmFtQ2hhbm5lbCBpcyBhIHNlbGVjdGFibGUgY2hhbm5lbCBmb3IgcGFydCBhYnN0cmFjdGlvbiBvZiBkYXRhZ3JhbQotICogc29ja2V0LiBUaGUgPGNvZGU+c29ja2V0PC9jb2RlPiBtZXRob2Qgb2YgdGhpcyBjbGFzcyBjYW4gcmV0dXJuIHRoZSByZWxhdGVkCi0gKiA8Y29kZT5EYXRhZ3JhbVNvY2tldDwvY29kZT4gaW5zdGFuY2UsIHdoaWNoIGNhbiBoYW5kbGUgdGhlIHNvY2tldC4KKyAqIEEge0Bjb2RlIERhdGFncmFtQ2hhbm5lbH0gaXMgYSBzZWxlY3RhYmxlIGNoYW5uZWwgdGhhdCByZXByZXNlbnRzIGEgcGFydGlhbAorICogYWJzdHJhY3Rpb24gb2YgYSBkYXRhZ3JhbSBzb2NrZXQuIFRoZSB7QGNvZGUgc29ja2V0fSBtZXRob2Qgb2YgdGhpcyBjbGFzcyBjYW4KKyAqIHJldHVybiB0aGUgcmVsYXRlZCB7QGNvZGUgRGF0YWdyYW1Tb2NrZXR9IGluc3RhbmNlLCB3aGljaCBjYW4gaGFuZGxlIHRoZQorICogc29ja2V0LgogICogPHA+Ci0gKiBBIGRhdGFncmFtIGNoYW5uZWwgaXMgb3BlbiBidXQgbm90IGNvbm5lY3RlZCB3aGVuIGNyZWF0ZWQgYnkKLSAqIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZC4gQWZ0ZXIgY29ubmVjdGVkLCBpdCB3aWxsIGtlZXAgdGhlIGNvbm5lY3RlZAotICogc3RhdHVzIGJlZm9yZSBkaXNjb25uZWN0aW5nIG9yIGNsb3NpbmcuIFRoZSBiZW5lZml0IG9mIGEgY29ubmVjdGVkIGNoYW5uZWwgaXMKLSAqIHRoZSByZWR1Y2VkIGVmZm9ydCBvZiBzZWN1cml0eSBjaGVja3MgZHVyaW5nIHNlbmQgYW5kIHJlY2VpdmUuIFdoZW4gaW52b2tpbmcKLSAqIDxjb2RlPnJlYWQ8L2NvZGU+IG9yIDxjb2RlPndyaXRlPC9jb2RlPiwgYSBjb25uZWN0ZWQgY2hhbm5lbCBpcwotICogcmVxdWlyZWQuCisgKiBBIGRhdGFncmFtIGNoYW5uZWwgaXMgb3BlbiBidXQgbm90IGNvbm5lY3RlZCB3aGVuIGNyZWF0ZWQgd2l0aCB0aGUKKyAqIHtAY29kZSBvcGVuKCl9IG1ldGhvZC4gQWZ0ZXIgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGtlZXAgdGhlIGNvbm5lY3RlZAorICogc3RhdHVzIHVudGlsIGl0IGlzIGRpc2Nvbm5lY3RlZCBvciBjbG9zZWQuIFRoZSBiZW5lZml0IG9mIGEgY29ubmVjdGVkIGNoYW5uZWwKKyAqIGlzIHRoZSByZWR1Y2VkIGVmZm9ydCBvZiBzZWN1cml0eSBjaGVja3MgZHVyaW5nIHNlbmQgYW5kIHJlY2VpdmUuIFdoZW4KKyAqIGludm9raW5nIHtAY29kZSByZWFkfSBvciB7QGNvZGUgd3JpdGV9LCBhIGNvbm5lY3RlZCBjaGFubmVsIGlzIHJlcXVpcmVkLgogICogPC9wPgogICogPHA+Ci0gKiBEYXRhZ3JhbSBjaGFubmVscyBhcmUgdGhyZWFkLXNhZmUsIG5vIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGNhbiByZWFkIG9yIHdyaXRlCi0gKiBhdCBnaXZlbiB0aW1lLgorICogRGF0YWdyYW0gY2hhbm5lbHMgYXJlIHRocmVhZC1zYWZlOyBvbmx5IG9uZSB0aHJlYWQgY2FuIHJlYWQgb3Igd3JpdGUgYXQgdGhlCisgKiBzYW1lIHRpbWUuCiAgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YWdyYW1DaGFubmVsIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbAogICAgICAgICBpbXBsZW1lbnRzIEJ5dGVDaGFubmVsLCBTY2F0dGVyaW5nQnl0ZUNoYW5uZWwsIEdhdGhlcmluZ0J5dGVDaGFubmVsIHsKQEAgLTUyLDI5NiArNTMsMzEyIEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGlzIGNsYXNzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERhdGFncmFtQ2hhbm5lbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNlbGVjdG9yUHJvdmlkZXIKLSAgICAgKiAgICAgICAgICAgIEEgaW5zdGFuY2Ugb2YgU2VsZWN0b3JQcm92aWRlcgorICAgICAqICAgICAgICAgICAgYW4gaW5zdGFuY2Ugb2YgU2VsZWN0b3JQcm92aWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGF0YWdyYW1DaGFubmVsKFNlbGVjdG9yUHJvdmlkZXIgc2VsZWN0b3JQcm92aWRlcikgewogICAgICAgICBzdXBlcihzZWxlY3RvclByb3ZpZGVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBvcGVuIGFuZCBub3QtY29ubmVjdGVkIGRhdGFncmFtIGNoYW5uZWwuCisgICAgICogQ3JlYXRlcyBhbiBvcGVuZWQgYW5kIG5vdC1jb25uZWN0ZWQgZGF0YWdyYW0gY2hhbm5lbC4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGNoYW5uZWwgaXMgZ290IGJ5IDxjb2RlPm9wZW5EYXRhZ3JhbUNoYW5uZWw8L2NvZGU+IG1ldGhvZCBvZiB0aGUKLSAgICAgKiBkZWZhdWx0IDxjb2RlPlNlbGVjdG9yUHJvdmlkZXIgPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBUaGlzIGNoYW5uZWwgaXMgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSA8Y29kZT5vcGVuRGF0YWdyYW1DaGFubmVsPC9jb2RlPgorICAgICAqIG1ldGhvZCBvZiB0aGUgZGVmYXVsdCB7QGxpbmsgU2VsZWN0b3JQcm92aWRlcn0gaW5zdGFuY2UuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5ldyBjcmVhdGVkIGNoYW5uZWwgd2hpY2ggaXMgb3BlbiBidXQgbm90LWNvbm5lY3RlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY2hhbm5lbCB3aGljaCBpcyBvcGVuIGJ1dCBub3QgY29ubmVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBzb21lIElPIHByb2JsZW0gb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIHNvbWUgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIERhdGFncmFtQ2hhbm5lbCBvcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKS5vcGVuRGF0YWdyYW1DaGFubmVsKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWxpZCBvcGVyYXRpb25zIG9mIHRoaXMgY2hhbm5lbC4gRGF0YWdyYW0gY2hhbm5lbHMgc3VwcG9ydCByZWFkCi0gICAgICogYW5kIHdyaXRlIG9wZXJhdGlvbiwgc28gdGhpcyBtZXRob2QgcmV0dXJucyAoCisgICAgICogR2V0cyB0aGUgdmFsaWQgb3BlcmF0aW9ucyBvZiB0aGlzIGNoYW5uZWwuIERhdGFncmFtIGNoYW5uZWxzIHN1cHBvcnQgcmVhZAorICAgICAqIGFuZCB3cml0ZSBvcGVyYXRpb25zLCBzbyB0aGlzIG1ldGhvZCByZXR1cm5zICgKICAgICAgKiA8Y29kZT5TZWxlY3Rpb25LZXkuT1BfUkVBRDwvY29kZT4gfCA8Y29kZT5TZWxlY3Rpb25LZXkuT1BfV1JJVEU8L2NvZGU+ICkuCiAgICAgICogCiAgICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbCN2YWxpZE9wcygpCi0gICAgICogQHJldHVybiBWYWxpZCBvcGVyYXRpb25zIGluIGJpdC1zZXQuCisgICAgICogQHJldHVybiB2YWxpZCBvcGVyYXRpb25zIGluIGJpdC1zZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCB2YWxpZE9wcygpIHsKICAgICAgICAgcmV0dXJuIChTZWxlY3Rpb25LZXkuT1BfUkVBRCB8IFNlbGVjdGlvbktleS5PUF9XUklURSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByZWxhdGVkIGRhdGFncmFtIHNvY2tldCBvZiB0aGlzIGNoYW5uZWwsIHdoaWNoIHdvbid0IGRlY2xhcmUKLSAgICAgKiBwdWJsaWMgbWV0aG9kcyB0aGF0IG5vdCBkZWNsYXJlZCBpbiA8Y29kZT5EYXRhZ3JhbVNvY2tldDwvY29kZT4uCisgICAgICogUmV0dXJucyB0aGUgcmVsYXRlZCBkYXRhZ3JhbSBzb2NrZXQgb2YgdGhpcyBjaGFubmVsLCB3aGljaCBkb2VzIG5vdAorICAgICAqIGRlZmluZSBhZGRpdGlvbmFsIHB1YmxpYyBtZXRob2RzIHRvIHRob3NlIGRlZmluZWQgYnkKKyAgICAgKiB7QGxpbmsgRGF0YWdyYW1Tb2NrZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHJlbGF0ZWQgRGF0YWdyYW1Tb2NrZXQgaW5zdGFuY2UuCisgICAgICogQHJldHVybiB0aGUgcmVsYXRlZCBEYXRhZ3JhbVNvY2tldCBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRGF0YWdyYW1Tb2NrZXQgc29ja2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgd2hldGhlciB0aGlzIGNoYW5uZWwncyBzb2NrZXQgaXMgY29ubmVjdGVkIG9yIG5vdC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjaGFubmVsJ3Mgc29ja2V0IGlzIGNvbm5lY3RlZCBvciBub3QuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhpcyBjaGFubmVsJ3Mgc29ja2V0IGlzIGNvbm5lY3RlZDsKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2hhbm5lbCdzIHNvY2tldCBpcyBjb25uZWN0ZWQ7CiAgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29ubmVjdGVkKCk7CiAKICAgICAvKioKLSAgICAgKiBDb25uZWN0IHRoZSBzb2NrZXQgb2YgdGhpcyBjaGFubmVsIHRvIGEgcmVtb3RlIGFkZHJlc3MsIHdoaWNoIGlzIHRoZSBvbmx5Ci0gICAgICogY29tbXVuaWNhdGlvbiBwZWVyIG9mIGdldHRpbmcgYW5kIHNlbmRpbmcgZGF0YWdyYW1zIGFmdGVyIGNvbm5lY3RlZC4KKyAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IG9mIHRoaXMgY2hhbm5lbCB0byBhIHJlbW90ZSBhZGRyZXNzLCB3aGljaCBpcyB0aGUKKyAgICAgKiBvbmx5IGNvbW11bmljYXRpb24gcGVlciBmb3IgZ2V0dGluZyBhbmQgc2VuZGluZyBkYXRhZ3JhbXMgYWZ0ZXIgYmVpbmcKKyAgICAgKiBjb25uZWN0ZWQuCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBhbnkgbW9tZW50LCBhbmQgd29uJ3QgYWZmZWN0IHRoZSBwcm9jZXNzaW5nCi0gICAgICogcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9uLiBUaGUgY29ubmVjdCBzdGF0dXMgd29uJ3QgY2hhbmdlZCBiZWZvcmUKLSAgICAgKiBkaXNjb25uZWN0ZWQgYW5kIGNsb3NlZC4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSByZWFkIGFuZAorICAgICAqIHdyaXRlIG9wZXJhdGlvbnMgYmVpbmcgcHJvY2Vzc2VkIGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgY2FsbGVkLiBUaGUKKyAgICAgKiBjb25uZWN0aW9uIHN0YXR1cyBkb2VzIG5vdCBjaGFuZ2UgdW50aWwgdGhlIGNoYW5uZWwgaXMgZGlzY29ubmVjdGVkIG9yCisgICAgICogY2xvc2VkLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBqdXN0IGV4ZWN1dGUgdGhlIHNhbWUgc2VjdXJpdHkgY2hlY2tzIGFzIHRoZSBjb25uZWN0IG1ldGhvZAotICAgICAqIG9mIHRoZSA8Y29kZT5EYXRhZ3JhbVNvY2tldDwvY29kZT4gY2xhc3MuCisgICAgICogVGhpcyBtZXRob2QgZXhlY3V0ZXMgdGhlIHNhbWUgc2VjdXJpdHkgY2hlY2tzIGFzIHRoZSBjb25uZWN0IG1ldGhvZCBvZgorICAgICAqIHRoZSB7QGxpbmsgRGF0YWdyYW1Tb2NrZXR9IGNsYXNzLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcmVzcwotICAgICAqICAgICAgICAgICAgVGhlIGFkZHJlc3MgdG8gYmUgY29ubmVjdGVkLgotICAgICAqIEByZXR1cm4gVGhpcyBjaGFubmVsLgorICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3MgdG8gYmUgY29ubmVjdGVkIHRvLgorICAgICAqIEByZXR1cm4gdGhpcyBjaGFubmVsLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKICAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQogICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0LCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciwgYW5kIHRoZSBhZGRyZXNzIGlzIG5vdAotICAgICAqICAgICAgICAgICAgIHBlcm1pdHRlZCB0byBhY2Nlc3MuCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyLCBhbmQgdGhlIGFkZHJlc3MgaXMgbm90CisgICAgICogICAgICAgICAgICAgcGVybWl0dGVkIHRvIGJlIGFjY2Vzc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3VycnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERhdGFncmFtQ2hhbm5lbCBjb25uZWN0KFNvY2tldEFkZHJlc3MgYWRkcmVzcykKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3QgdGhlIHNvY2tldCBvZiB0aGlzIGNoYW5uZWwsIHdoaWNoIGlzIGNvbm5lY3RlZCBiZWZvcmUgZm9yCi0gICAgICogZ2V0dGluZyBhbmQgc2VuZGluZyBkYXRhZ3JhbXMuCisgICAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldCBvZiB0aGlzIGNoYW5uZWwsIHdoaWNoIGhhcyBiZWVuIGNvbm5lY3RlZCBiZWZvcmUKKyAgICAgKiBpbiBvcmRlciB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGFncmFtcy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGF0IGFueSBtb21lbnQsIGFuZCB3b24ndCBhZmZlY3QgdGhlIHByb2Nlc3NpbmcKLSAgICAgKiByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb24uIEl0IHdvbid0IGhhcyBhbnkgZWZmZWN0IGlmIHRoZSBzb2NrZXQgaXMgbm90Ci0gICAgICogY29ubmVjdGVkIG9yIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSByZWFkIGFuZAorICAgICAqIHdyaXRlIG9wZXJhdGlvbnMgYmVpbmcgdW5kZXJ3YXkuIEl0IGRvZXMgbm90IGhhdmUgYW55IGVmZmVjdCBpZiB0aGUKKyAgICAgKiBzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCBvciB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhpcyBjaGFubmVsLgorICAgICAqIEByZXR1cm4gdGhpcyBjaGFubmVsLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgorICAgICAqICAgICAgICAgICAgIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRGF0YWdyYW1DaGFubmVsIGRpc2Nvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXQgYSBkYXRhZ3JhbSBmcm9tIHRoaXMgY2hhbm5lbC4KKyAgICAgKiBHZXRzIGEgZGF0YWdyYW0gZnJvbSB0aGlzIGNoYW5uZWwuCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgdHJhbnNmZXJzIHRoZSBkYXRhZ3JhbSBmcm9tIHRoZSBjaGFubmVsIGludG8gdGhlIHRhcmdldCBieXRlCi0gICAgICogYnVmZmVyIGFuZCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGFncmFtLCBpZiB0aGUgZGF0YWdyYW0gaXMKLSAgICAgKiBhdmFpbGFibGUgb3Igd2lsbCBiZSBhdmFpbGFibGUgYXMgdGhpcyBjaGFubmVsIGlzIGluIGJsb2NraW5nIG1vZGUuIFRoaXMKLSAgICAgKiBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGF0YWdyYW0gaXMgbm90IGF2YWlsYWJsZSBub3cKLSAgICAgKiBhbmQgdGhlIGNoYW5uZWwgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUuIFRoZSB0cmFuc2ZlciBzdGFydCBhdCB0aGUKLSAgICAgKiBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBidWZmZXIsIGFuZCB0aGUgcmVzaWR1YWwgcGFydCBvZiB0aGUgZGF0YWdyYW0KLSAgICAgKiB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlcmUgaXMgbm8gZWZmaWNpZW50IHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyIHRvIHN0b3JlCi0gICAgICogdGhlIGRhdGFncmFtLgorICAgICAqIFRoaXMgbWV0aG9kIHRyYW5zZmVycyBhIGRhdGFncmFtIGZyb20gdGhlIGNoYW5uZWwgaW50byB0aGUgdGFyZ2V0IGJ5dGUKKyAgICAgKiBidWZmZXIuIElmIHRoaXMgY2hhbm5lbCBpcyBpbiBibG9ja2luZyBtb2RlLCBpdCB3YWl0cyBmb3IgdGhlIGRhdGFncmFtCisgICAgICogYW5kIHJldHVybnMgaXRzIGFkZHJlc3Mgd2hlbiBpdCBpcyBhdmFpbGFibGUuIElmIHRoaXMgY2hhbm5lbCBpcyBpbgorICAgICAqIG5vbi1ibG9ja2luZyBtb2RlIGFuZCBubyBkYXRhZ3JhbSBpcyBhdmFpbGFibGUsIGl0IHJldHVybnMge0Bjb2RlIG51bGx9CisgICAgICogaW1tZWRpYXRlbHkuIFRoZSB0cmFuc2ZlciBzdGFydHMgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGJ1ZmZlciwKKyAgICAgKiBhbmQgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUKKyAgICAgKiBkYXRhZ3JhbSB0aGVuIHRoZSBwYXJ0IG9mIHRoZSBkYXRhZ3JhbSB0aGF0IGRvZXMgbm90IGZpdCBpcyBkaXNjYXJkZWQuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYXQgYW55IG1vbWVudCwgYW5kIHdpbGwgYmxvY2sgaWYgdGhlcmUgaXMKLSAgICAgKiBhbm90aGVyIHRocmVhZCBzdGFydGVkIGEgcmVhZCBvcGVyYXRpb24gb24gdGhlIGNoYW5uZWwuCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhbmQgaXQgd2lsbCBibG9jayBpZiB0aGVyZSBpcworICAgICAqIGFub3RoZXIgdGhyZWFkIHRoYXQgaGFzIHN0YXJ0ZWQgYSByZWFkIG9wZXJhdGlvbiBvbiB0aGUgY2hhbm5lbC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QganVzdCBleGVjdXRlIHRoZSBzYW1lIHNlY3VyaXR5IGNoZWNrcyBhcyB0aGUgcmVjZWl2ZSBtZXRob2QKLSAgICAgKiBvZiB0aGUgPGNvZGU+RGF0YWdyYW1Tb2NrZXQ8L2NvZGU+IGNsYXNzLgorICAgICAqIFRoaXMgbWV0aG9kIGV4ZWN1dGVzIHRoZSBzYW1lIHNlY3VyaXR5IGNoZWNrcyBhcyB0aGUgcmVjZWl2ZSBtZXRob2Qgb2YKKyAgICAgKiB0aGUge0BsaW5rIERhdGFncmFtU29ja2V0fSBjbGFzcy4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHRhcmdldAotICAgICAqICAgICAgICAgICAgVGhlIGJ5dGUgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWNlaXZlZCBkYXRhZ3JhbS4KLSAgICAgKiBAcmV0dXJuIEFkZHJlc3Mgb2YgdGhlIGRhdGFncmFtIGlmIHRoZSB0cmFuc2ZlciBpcyBwZXJmb3JtZWQsIG9yIG51bGwgaWYKLSAgICAgKiAgICAgICAgIHRoZSBjaGFubmVsIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCB0aGUgZGF0YWdyYW0gYXJlCi0gICAgICogICAgICAgICB1bmF2YWlsYWJsZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVjZWl2ZWQgZGF0YWdyYW0uCisgICAgICogQHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YWdyYW0gaWYgdGhlIHRyYW5zZmVyIGlzIHBlcmZvcm1lZCwgb3IgbnVsbAorICAgICAqICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vIGRhdGFncmFtIGlzCisgICAgICogICAgICAgICBhdmFpbGFibGUuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAogICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCiAgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0IGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyLCBhbmQgdGhlIGFkZHJlc3MgaXMgbm90Ci0gICAgICogICAgICAgICAgICAgcGVybWl0dGVkIHRvIGFjY2Vzcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIsIGFuZCB0aGUgYWRkcmVzcyBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICBwZXJtaXR0ZWQgdG8gYmUgYWNjZXNzZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFNvbWUgb3RoZXIgSU8gZXJyb3Igb2NjdXJyZWQuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTb2NrZXRBZGRyZXNzIHJlY2VpdmUoQnl0ZUJ1ZmZlciB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNlbmRzIG91dCBhIGRhdGFncmFtIGJ5IHRoZSBjaGFubmVsLgorICAgICAqIFNlbmRzIGEgZGF0YWdyYW0gdGhyb3VnaCB0aGlzIGNoYW5uZWwuIFRoZSBkYXRhZ3JhbSBjb25zaXN0cyBvZiB0aGUKKyAgICAgKiByZW1haW5pbmcgYnl0ZXMgaW4ge0Bjb2RlIHNvdXJjZX0uCiAgICAgICogPHA+Ci0gICAgICogVGhlIHByZWNvbmRpdGlvbiBvZiBzZW5kaW5nIGlzIHRoYXQgd2hldGhlciB0aGUgY2hhbm5lbCBpcyBpbiBibG9ja2luZwotICAgICAqIG1vZGUgYW5kIGVub3VnaCBieXRlIGJ1ZmZlciBzcGFjZSB3aWxsIGJlIGF2YWlsYWJsZSwgb3IgdGhlIGNoYW5uZWwgaXMgaW4KLSAgICAgKiBub24tYmxvY2tpbmcgbW9kZSBhbmQgYnl0ZSBidWZmZXIgc3BhY2UgaXMgZW5vdWdoLiBUaGUgdHJhbnNmZXIgYWN0aW9uIGlzCi0gICAgICoganVzdCBsaWtlIGEgcmVndWxhciB3cml0ZSBvcGVyYXRpb24uCisgICAgICogSWYgdGhpcyBjaGFubmVsIGlzIGluIGJsb2NraW5nIG1vZGUgdGhlbiB0aGUgZGF0YWdyYW0gaXMgc2VudCBhcyBzb29uIGFzCisgICAgICogdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBidWZmZXIuIElmIHRoaXMgY2hhbm5lbCBpcworICAgICAqIGluIG5vbi1ibG9ja2luZyBtb2RlIHRoZW4gdGhlIGRhdGFncmFtIGlzIG9ubHkgc2VudCBpZiB0aGVyZSBpcyBlbm91Z2gKKyAgICAgKiBzcGFjZSBpbiB0aGUgdW5kZXJseWluZyBvdXRwdXQgYnVmZmVyIGF0IHRoYXQgbW9tZW50LiBUaGUgdHJhbnNmZXIgYWN0aW9uCisgICAgICogaXMganVzdCBsaWtlIGEgcmVndWxhciB3cml0ZSBvcGVyYXRpb24uCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYXQgYW55IG1vbWVudCwgYW5kIHdpbGwgYmxvY2sgaWYgdGhlcmUgaXMKLSAgICAgKiBhbm90aGVyIHRocmVhZCBzdGFydGVkIGEgcmVhZCBvcGVyYXRpb24gb24gdGhlIGNoYW5uZWwuCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhbmQgaXQgd2lsbCBibG9jayBpZiBhbm90aGVyIHRocmVhZAorICAgICAqIGhhcyBzdGFydGVkIGEgc2VuZCBvcGVyYXRpb24gb24gdGhpcyBjaGFubmVsLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBqdXN0IGV4ZWN1dGUgdGhlIHNhbWUgc2VjdXJpdHkgY2hlY2tzIGFzIHRoZSBzZW5kIG1ldGhvZCBvZgotICAgICAqIHRoZSA8Y29kZT5EYXRhZ3JhbVNvY2tldDwvY29kZT4gY2xhc3MuCisgICAgICogVGhpcyBtZXRob2QgZXhlY3V0ZXMgdGhlIHNhbWUgc2VjdXJpdHkgY2hlY2tzIGFzIHRoZSBzZW5kIG1ldGhvZCBvZiB0aGUKKyAgICAgKiB7QGxpbmsgRGF0YWdyYW1Tb2NrZXR9IGNsYXNzLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogICAgICAgICAgICBUaGUgYnl0ZSBidWZmZXIgd2l0aCB0aGUgZGF0YWdyYW0gdG8gYmUgc2VudC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGJ1ZmZlciB3aXRoIHRoZSBkYXRhZ3JhbSB0byBiZSBzZW50LgogICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICogICAgICAgICAgICBUaGUgYWRkcmVzcyB0byBiZSBzZW50LgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBzZW50IGJ5dGVzLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGl0IHJldHVybnMKLSAgICAgKiAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCByZW1haW5pbmcgaW4gdGhlIGJ5dGUgYnVmZmVyLiBJZiB0aGUKLSAgICAgKiAgICAgICAgIGNoYW5uZWwgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vIGVub3VnaCBzcGFjZSBmb3IgdGhlCi0gICAgICogICAgICAgICBkYXRhZ3JhbSBpbiB0aGUgYnVmZmVyLCBpdCBtYXkgcmV0dXJucyB6ZXJvLgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoZSBkYXRhZ3JhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZworICAgICAqICAgICAgICAgaW4ge0Bjb2RlIHNvdXJjZX0gb3IgemVybyBpZiB0aGUgY2hhbm5lbCBpcyBpbiBub24tYmxvY2tpbmcgbW9kZQorICAgICAqICAgICAgICAgYW5kIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBkYXRhZ3JhbSBpbiB0aGUgdW5kZXJseWluZworICAgICAqICAgICAgICAgb3V0cHV0IGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCiAgICAgICogICAgICAgICAgICAgaXMgaW4gb3BlcmF0aW9uLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKICAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBjYWxsaW5nIHRocmVhZCB3aWxsIGhhdmUgdGhlCi0gICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCwgYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQgYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIsIGFuZCB0aGUgYWRkcmVzcyBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIsIGFuZCB0aGUgYWRkcmVzcyBpcyBub3QKICAgICAgKiAgICAgICAgICAgICBwZXJtaXR0ZWQgdG8gYWNjZXNzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHNlbmQoQnl0ZUJ1ZmZlciBzb3VyY2UsIFNvY2tldEFkZHJlc3MgYWRkcmVzcykKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGRhdGFncmFtIGZyb20gdGhlIGNoYW5uZWwgaW50byB0aGUgYnl0ZSBidWZmZXIuCisgICAgICogUmVhZHMgYSBkYXRhZ3JhbSBmcm9tIHRoaXMgY2hhbm5lbCBpbnRvIHRoZSBieXRlIGJ1ZmZlci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJlY29uZGl0aW9uIG9mIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQKLSAgICAgKiBhbmQgdGhlIGNvbWluZyBkYXRhZ3JhbSBpcyBmcm9tIHRoZSBjb25uZWN0ZWQgYWRkcmVzcy4gSWYgdGhlIGJ1ZmZlciBpcwotICAgICAqIG5vdCBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGFncmFtLCB0aGUgcmVzaWR1YWwgcGFydCBvZiB0aGUgZGF0YWdyYW0gaXMKLSAgICAgKiBpZ25vcmVkLiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgcmVhZCBtZXRob2QKLSAgICAgKiBpbiB0aGUgPGNvZGU+UmVhZGFibGVCeXRlQ2hhbm5lbDwvY29kZT4gaW50ZXJmYWNlLgorICAgICAqIFRoZSBwcmVjb25kaXRpb24gZm9yIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQKKyAgICAgKiBhbmQgdGhlIGluY29taW5nIGRhdGFncmFtIGlzIGZyb20gdGhlIGNvbm5lY3RlZCBhZGRyZXNzLiBJZiB0aGUgYnVmZmVyIGlzCisgICAgICogbm90IGJpZyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGFncmFtLCB0aGUgcGFydCBvZiB0aGUgZGF0YWdyYW0gdGhhdCBkb2VzCisgICAgICogbm90IGZpdCBpbiB0aGUgYnVmZmVyIGlzIGRpc2NhcmRlZC4gT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUKKyAgICAgKiBiZWhhdmlvciBhcyB0aGUge0Bjb2RlIHJlYWR9IG1ldGhvZCBpbiB0aGUge0BsaW5rIFJlYWRhYmxlQnl0ZUNoYW5uZWx9CisgICAgICogaW50ZXJmYWNlLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwjcmVhZChqYXZhLm5pby5CeXRlQnVmZmVyKQogICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiAgICAgICAgICAgIFRoZSBieXRlIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVjZWl2ZWQgZGF0YWdyYW0uCi0gICAgICogQHJldHVybiBOb24tbmVnYXRpdmUgbnVtYmVyIGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgYXMgdGhlCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBidWZmZXIgdG8gc3RvcmUgdGhlIHJlY2VpdmVkIGRhdGFncmFtLgorICAgICAqIEByZXR1cm4gYSBub24tbmVnYXRpdmUgbnVtYmVyIGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgYXMgdGhlCiAgICAgICogICAgICAgICByZWFkIG9wZXJhdGlvbiByZWFjaGVzIHRoZSBlbmQgb2Ygc3RyZWFtLgogICAgICAqIEB0aHJvd3MgTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZCB5ZXQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZCB5ZXQuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAogICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCiAgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0IGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgU29tZSBvdGhlciBJTyBlcnJvciBvY2N1cnJlZC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCByZWFkKEJ5dGVCdWZmZXIgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBkYXRhZ3JhbSBmcm9tIHRoZSBjaGFubmVsIGludG8gdGhlIGJ5dGUgYnVmZmVyLgorICAgICAqIFJlYWRzIGEgZGF0YWdyYW0gZnJvbSB0aGlzIGNoYW5uZWwgaW50byBhbiBhcnJheSBvZiBieXRlIGJ1ZmZlcnMuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHByZWNvbmRpdGlvbiBvZiBjYWxsaW5nIHRoaXMgbWV0aG9kIGlzIHRoYXQgdGhlIGNoYW5uZWwgaXMgY29ubmVjdGVkCi0gICAgICogYW5kIHRoZSBjb21pbmcgZGF0YWdyYW0gaXMgZnJvbSB0aGUgY29ubmVjdGVkIGFkZHJlc3MuIElmIHRoZSBidWZmZXIgaXMKLSAgICAgKiBub3QgZW5vdWdoIHRvIHN0b3JlIHRoZSBkYXRhZ3JhbSwgdGhlIHJlc2lkdWFsIHBhcnQgb2YgdGhlIGRhdGFncmFtIGlzCi0gICAgICogaWdub3JlZC4gT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHJlYWQgbWV0aG9kCi0gICAgICogaW4gdGhlIDxjb2RlPlNjYXR0ZXJpbmdCeXRlQ2hhbm5lbDwvY29kZT4gaW50ZXJmYWNlLgorICAgICAqIFRoZSBwcmVjb25kaXRpb24gZm9yIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQKKyAgICAgKiBhbmQgdGhlIGluY29taW5nIGRhdGFncmFtIGlzIGZyb20gdGhlIGNvbm5lY3RlZCBhZGRyZXNzLiBJZiB0aGUgYnVmZmVycworICAgICAqIGRvIG5vdCBoYXZlIGVub3VnaCByZW1haW5pbmcgc3BhY2UgdG8gc3RvcmUgdGhlIGRhdGFncmFtLCB0aGUgcGFydCBvZiB0aGUKKyAgICAgKiBkYXRhZ3JhbSB0aGF0IGRvZXMgbm90IGZpdCBpbiB0aGUgYnVmZmVycyBpcyBkaXNjYXJkZWQuIE90aGVyd2lzZSwgdGhpcworICAgICAqIG1ldGhvZCBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHtAY29kZSByZWFkfSBtZXRob2QgaW4gdGhlCisgICAgICoge0BsaW5rIFNjYXR0ZXJpbmdCeXRlQ2hhbm5lbH0gaW50ZXJmYWNlLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLlNjYXR0ZXJpbmdCeXRlQ2hhbm5lbCNyZWFkKGphdmEubmlvLkJ5dGVCdWZmZXJbXSwKICAgICAgKiAgICAgIGludCwgaW50KQogICAgICAqIEBwYXJhbSB0YXJnZXRzCi0gICAgICogICAgICAgICAgICBUaGUgYnl0ZSBidWZmZXJzIHRvIHN0b3JlIHRoZSByZWNlaXZlZCBkYXRhZ3JhbS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGJ1ZmZlcnMgdG8gc3RvcmUgdGhlIHJlY2VpdmVkIGRhdGFncmFtLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIEEgbm9uLW5lZ2F0aXZlIG9mZnNldCBpbiB0aGUgYXJyYXkgb2YgYnVmZmVyLCBwb2ludGluZyB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIHN0YXJ0aW5nIGJ1ZmZlciB0byBzdG9yZSB0aGUgYnl0ZSB0cmFuc2ZlcnJlZCwgbXVzdCBubyBsYXJnZXIKLSAgICAgKiAgICAgICAgICAgIHRoYW4gdGFyZ2V0cy5sZW5ndGguCisgICAgICogICAgICAgICAgICBhIG5vbi1uZWdhdGl2ZSBvZmZzZXQgaW4gdGhlIGFycmF5IG9mIGJ1ZmZlcnMsIHBvaW50aW5nIHRvIHRoZQorICAgICAqICAgICAgICAgICAgc3RhcnRpbmcgYnVmZmVyIHRvIHN0b3JlIHRoZSBieXRlcyB0cmFuc2ZlcnJlZCwgbXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgIGJpZ2dlciB0aGFuIHtAY29kZSB0YXJnZXRzLmxlbmd0aH0uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgQSBub24tbmVnYXRpdmUgbGVuZ3RoIHRvIGluZGljYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlCi0gICAgICogICAgICAgICAgICB0byBiZSByZWFkLCBtdXN0IG5vIGxhcmdlciB0aGFuIHRhcmdldHMubGVuZ3RoIC0gb2Zmc2V0LgotICAgICAqIEByZXR1cm4gTm9uLW5lZ2F0aXZlIG51bWJlciBhcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIGFzIHRoZQorICAgICAqICAgICAgICAgICAgYSBub24tbmVnYXRpdmUgbGVuZ3RoIHRvIGluZGljYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgICAqICAgICAgICAgICAgYnVmZmVycyB0byBiZSBmaWxsZWQsIG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuCisgICAgICogICAgICAgICAgICB7QGNvZGUgdGFyZ2V0cy5sZW5ndGggLSBvZmZzZXR9LgorICAgICAqIEByZXR1cm4gYSBub24tbmVnYXRpdmUgbnVtYmVyIGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgaWYgdGhlCiAgICAgICogICAgICAgICByZWFkIG9wZXJhdGlvbiByZWFjaGVzIHRoZSBlbmQgb2Ygc3RyZWFtLgogICAgICAqIEB0aHJvd3MgTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZCB5ZXQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZCB5ZXQuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAogICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCiAgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0IGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgU29tZSBvdGhlciBJTyBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZChCeXRlQnVmZmVyW10gdGFyZ2V0cywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGRhdGFncmFtIGZyb20gdGhlIGNoYW5uZWwgaW50byB0aGUgYnl0ZSBidWZmZXIuCisgICAgICogUmVhZHMgYSBkYXRhZ3JhbSBmcm9tIHRoaXMgY2hhbm5lbCBpbnRvIGFuIGFycmF5IG9mIGJ5dGUgYnVmZmVycy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJlY29uZGl0aW9uIG9mIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQKLSAgICAgKiBhbmQgdGhlIGNvbWluZyBkYXRhZ3JhbSBpcyBmcm9tIHRoZSBjb25uZWN0ZWQgYWRkcmVzcy4gSWYgdGhlIGJ1ZmZlciBpcwotICAgICAqIG5vdCBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGFncmFtLCB0aGUgcmVzaWR1YWwgcGFydCBvZiB0aGUgZGF0YWdyYW0gaXMKLSAgICAgKiBpZ25vcmVkLiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgcmVhZCBtZXRob2QKLSAgICAgKiBpbiB0aGUgPGNvZGU+U2NhdHRlcmluZ0J5dGVDaGFubmVsPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICogVGhlIHByZWNvbmRpdGlvbiBmb3IgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBjaGFubmVsIGlzIGNvbm5lY3RlZAorICAgICAqIGFuZCB0aGUgaW5jb21pbmcgZGF0YWdyYW0gaXMgZnJvbSB0aGUgY29ubmVjdGVkIGFkZHJlc3MuIElmIHRoZSBidWZmZXJzCisgICAgICogZG8gbm90IGhhdmUgZW5vdWdoIHJlbWFpbmluZyBzcGFjZSB0byBzdG9yZSB0aGUgZGF0YWdyYW0sIHRoZSBwYXJ0IG9mIHRoZQorICAgICAqIGRhdGFncmFtIHRoYXQgZG9lcyBub3QgZml0IGluIHRoZSBidWZmZXJzIGlzIGRpc2NhcmRlZC4gT3RoZXJ3aXNlLCB0aGlzCisgICAgICogbWV0aG9kIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUge0Bjb2RlIHJlYWR9IG1ldGhvZCBpbiB0aGUKKyAgICAgKiB7QGxpbmsgU2NhdHRlcmluZ0J5dGVDaGFubmVsfSBpbnRlcmZhY2UuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2NhdHRlcmluZ0J5dGVDaGFubmVsI3JlYWQoamF2YS5uaW8uQnl0ZUJ1ZmZlcltdKQogICAgICAqIEBwYXJhbSB0YXJnZXRzCi0gICAgICogICAgICAgICAgICBUaGUgYnl0ZSBidWZmZXJzIHRvIHN0b3JlIHRoZSByZWNlaXZlZCBkYXRhZ3JhbS4KLSAgICAgKiBAcmV0dXJuIE5vbi1uZWdhdGl2ZSBudW1iZXIgYXMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBhcyB0aGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGJ1ZmZlcnMgdG8gc3RvcmUgdGhlIHJlY2VpdmVkIGRhdGFncmFtLgorICAgICAqIEByZXR1cm4gYSBub24tbmVnYXRpdmUgbnVtYmVyIGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgaWYgdGhlCiAgICAgICogICAgICAgICByZWFkIG9wZXJhdGlvbiByZWFjaGVzIHRoZSBlbmQgb2Ygc3RyZWFtLgogICAgICAqIEB0aHJvd3MgTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZCB5ZXQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZCB5ZXQuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAogICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCiAgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0IGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgU29tZSBvdGhlciBJTyBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCBsb25nIHJlYWQoQnl0ZUJ1ZmZlcltdIHRhcmdldHMpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzQ5LDEwNSArMzY2LDEwNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIGRhdGFncmFtIGZyb20gdGhlIGJ5dGUgYnVmZmVyIGludG8gdGhlIGNoYW5uZWwuCisgICAgICogV3JpdGVzIGEgZGF0YWdyYW0gZnJvbSB0aGUgYnl0ZSBidWZmZXIgdG8gdGhpcyBjaGFubmVsLgogICAgICAqIDxwPgogICAgICAqIFRoZSBwcmVjb25kaXRpb24gb2YgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBjaGFubmVsIGlzIGNvbm5lY3RlZAogICAgICAqIGFuZCB0aGUgZGF0YWdyYW0gaXMgc2VudCB0byB0aGUgY29ubmVjdGVkIGFkZHJlc3MuIE90aGVyd2lzZSwgdGhpcyBtZXRob2QKLSAgICAgKiBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHdyaXRlIG1ldGhvZCBpbiB0aGUKLSAgICAgKiA8Y29kZT5Xcml0YWJsZUJ5dGVDaGFubmVsPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICogaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSB7QGNvZGUgd3JpdGV9IG1ldGhvZCBpbiB0aGUKKyAgICAgKiB7QGxpbmsgV3JpdGFibGVCeXRlQ2hhbm5lbH0gaW50ZXJmYWNlLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwjd3JpdGUoamF2YS5uaW8uQnl0ZUJ1ZmZlcikKICAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogICAgICAgICAgICBUaGUgYnl0ZSBidWZmZXIgYXMgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YWdyYW0uCi0gICAgICogQHJldHVybiBOb24tbmVnYXRpdmUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBidWZmZXIgYXMgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YWdyYW0uCisgICAgICogQHJldHVybiBhIG5vbi1uZWdhdGl2ZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KICAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgeWV0LgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgeWV0LgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKICAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQogICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0LCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFNvbWUgb3RoZXIgSU8gZXJyb3Igb2NjdXJyZWQuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGRhdGFncmFtIGZyb20gdGhlIGJ5dGUgYnVmZmVyIGludG8gdGhlIGNoYW5uZWwuCisgICAgICogV3JpdGVzIGEgZGF0YWdyYW0gZnJvbSB0aGUgYnl0ZSBidWZmZXJzIHRvIHRoaXMgY2hhbm5lbC4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgcHJlY29uZGl0aW9uIG9mIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQKICAgICAgKiBhbmQgdGhlIGRhdGFncmFtIGlzIHNlbnQgdG8gdGhlIGNvbm5lY3RlZCBhZGRyZXNzLiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kCi0gICAgICogaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSB3cml0ZSBtZXRob2QgaW4gdGhlCi0gICAgICogPGNvZGU+R2F0aGVyaW5nQnl0ZUNoYW5uZWw8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgKiBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHtAY29kZSB3cml0ZX0gbWV0aG9kIGluIHRoZQorICAgICAqIHtAbGluayBHYXRoZXJpbmdCeXRlQ2hhbm5lbH0gaW50ZXJmYWNlLgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuR2F0aGVyaW5nQnl0ZUNoYW5uZWwjd3JpdGUoamF2YS5uaW8uQnl0ZUJ1ZmZlcltdLAogICAgICAqICAgICAgaW50LCBpbnQpCiAgICAgICogQHBhcmFtIHNvdXJjZXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBieXRlIGJ1ZmZlcnMgYXMgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YWdyYW0uCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBidWZmZXJzIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGFncmFtLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIEEgbm9uLW5lZ2F0aXZlIG9mZnNldCBpbiB0aGUgYXJyYXkgb2YgYnVmZmVyLCBwb2ludGluZyB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIHN0YXJ0aW5nIGJ1ZmZlciB0byBiZSByZXRyaWV2ZWQsIG11c3Qgbm8gbGFyZ2VyIHRoYW4KLSAgICAgKiAgICAgICAgICAgIHNvdXJjZXMubGVuZ3RoLgorICAgICAqICAgICAgICAgICAgYSBub24tbmVnYXRpdmUgb2Zmc2V0IGluIHRoZSBhcnJheSBvZiBidWZmZXJzLCBwb2ludGluZyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHN0YXJ0aW5nIGJ1ZmZlciB0byBiZSByZXRyaWV2ZWQsIG11c3QgYmUgbm8gbGFyZ2VyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBzb3VyY2VzLmxlbmd0aH0uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgQSBub24tbmVnYXRpdmUgbGVuZ3RoIHRvIGluZGljYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlCi0gICAgICogICAgICAgICAgICB0byBiZSB3cml0dGVuLCBtdXN0IG5vIGxhcmdlciB0aGFuIHNvdXJjZXMubGVuZ3RoIC0gb2Zmc2V0LgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGl0IHJldHVybnMKLSAgICAgKiAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCByZW1haW5pbmcgaW4gdGhlIGJ5dGUgYnVmZmVyLiBJZiB0aGUKLSAgICAgKiAgICAgICAgIGNoYW5uZWwgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vIGVub3VnaCBzcGFjZSBmb3IgdGhlCi0gICAgICogICAgICAgICBkYXRhZ3JhbSBpbiB0aGUgYnVmZmVyLCBpdCBtYXkgcmV0dXJucyB6ZXJvLgorICAgICAqICAgICAgICAgICAgYSBub24tbmVnYXRpdmUgbGVuZ3RoIHRvIGluZGljYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgICAqICAgICAgICAgICAgYnVmZmVycyB0byBiZSBzdWJtaXR0ZWQsIG11c3QgYmUgbm8gYmlnZ2VyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBzb3VyY2VzLmxlbmd0aCAtIG9mZnNldH0uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgaXQgcmV0dXJucworICAgICAqICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdoZXJlIHJlbWFpbmluZyBpbiB0aGUgYnl0ZSBidWZmZXJzLiBJZgorICAgICAqICAgICAgICAgdGhlIGNoYW5uZWwgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICAgICogICAgICAgICBzcGFjZSBmb3IgdGhlIGRhdGFncmFtIGluIHRoZSBidWZmZXIsIGl0IG1heSByZXR1cm4gemVyby4KICAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgeWV0LgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgeWV0LgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKICAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQogICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0LCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFNvbWUgb3RoZXIgSU8gZXJyb3Igb2NjdXJyZWQuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHdyaXRlKEJ5dGVCdWZmZXJbXSBzb3VyY2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgZGF0YWdyYW0gZnJvbSB0aGUgYnl0ZSBidWZmZXIgaW50byB0aGUgY2hhbm5lbC4KKyAgICAgKiBXcml0ZXMgYSBkYXRhZ3JhbSBmcm9tIHRoZSBieXRlIGJ1ZmZlcnMgdG8gdGhpcyBjaGFubmVsLgogICAgICAqIDxwPgogICAgICAqIFRoZSBwcmVjb25kaXRpb24gb2YgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBjaGFubmVsIGlzIGNvbm5lY3RlZAogICAgICAqIGFuZCB0aGUgZGF0YWdyYW0gaXMgc2VudCB0byB0aGUgY29ubmVjdGVkIGFkZHJlc3MuIE90aGVyd2lzZSwgdGhpcyBtZXRob2QKICAgICAgKiBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHdyaXRlIG1ldGhvZCBpbiB0aGUKLSAgICAgKiA8Y29kZT5HYXRoZXJpbmdCeXRlQ2hhbm5lbDwvY29kZT4gaW50ZXJmYWNlLgorICAgICAqIHtAbGluayBHYXRoZXJpbmdCeXRlQ2hhbm5lbH0gaW50ZXJmYWNlLgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuR2F0aGVyaW5nQnl0ZUNoYW5uZWwjd3JpdGUoamF2YS5uaW8uQnl0ZUJ1ZmZlcltdKQogICAgICAqIEBwYXJhbSBzb3VyY2VzCi0gICAgICogICAgICAgICAgICBUaGUgYnl0ZSBidWZmZXJzIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGFncmFtLgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGl0IHJldHVybnMKLSAgICAgKiAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCByZW1haW5pbmcgaW4gdGhlIGJ5dGUgYnVmZmVyLiBJZiB0aGUKLSAgICAgKiAgICAgICAgIGNoYW5uZWwgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vIGVub3VnaCBzcGFjZSBmb3IgdGhlCi0gICAgICogICAgICAgICBkYXRhZ3JhbSBpbiB0aGUgYnVmZmVyLCBpdCBtYXkgcmV0dXJucyB6ZXJvLgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYnVmZmVycyBhcyB0aGUgc291cmNlIG9mIHRoZSBkYXRhZ3JhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCByZXR1cm5zCisgICAgICogICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2hlcmUgcmVtYWluaW5nIGluIHRoZSBieXRlIGJ1ZmZlci4gSWYKKyAgICAgKiAgICAgICAgIHRoZSBjaGFubmVsIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgICAqICAgICAgICAgc3BhY2UgZm9yIHRoZSBkYXRhZ3JhbSBpbiB0aGUgYnVmZmVyLCBpdCBtYXkgcmV0dXJuIHplcm8uCiAgICAgICogQHRocm93cyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBub3QgY29ubmVjdGVkIHlldC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBub3QgY29ubmVjdGVkIHlldC4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCiAgICAgICogICAgICAgICAgICAgaXMgaW4gb3BlcmF0aW9uLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKICAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBjYWxsaW5nIHRocmVhZCB3aWxsIGhhdmUgdGhlCi0gICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCwgYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQgYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIGxvbmcgd3JpdGUoQnl0ZUJ1ZmZlcltdIHNvdXJjZXMpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVDaGFubmVsLmphdmEKaW5kZXggMThiZjllMi4uMDUxOGZkMyAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWwuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9GaWxlQ2hhbm5lbC5qYXZhCkBAIC0yNSwyNSArMjUsMjUgQEAKIC8qKgogICogQW4gYWJzdHJhY3QgY2hhbm5lbCB0eXBlIGZvciBpbnRlcmFjdGlvbiB3aXRoIGEgcGxhdGZvcm0gZmlsZS4KICAqIDxwPgotICogQSBGaWxlQ2hhbm5lbCBkZWZpbmVzIHRoZSBtZXRob2RzIGZvciByZWFkaW5nLCB3cml0aW5nLCBtZW1vcnkgbWFwcGluZywgYW5kCi0gKiBtYW5pcHVsYXRpbmcgdGhlIGxvZ2ljYWwgc3RhdGUgb2YgYSBwbGF0Zm9ybSBmaWxlLiBUaGlzIHR5cGUgZG9lcyBub3QgaGF2ZSBhCi0gKiBtZXRob2QgZm9yIG9wZW5pbmcgZmlsZXMsIHNpbmNlIHRoaXMgYmVoYXZpb3VyIGhhcyBiZWVuIGRlbGVnYXRlZCB0byB0aGUKLSAqIDxjb2RlPkZpbGVJbnB1dFN0cmVhbTwvY29kZT4sIDxjb2RlPkZpbGVPdXRwdXRTdHJlYW08L2NvZGU+LCBhbmQKLSAqIDxjb2RlPlJhbmRvbUFjY2Vzc0ZpbGU8L2NvZGU+IHR5cGVzLgorICogQSB7QGNvZGUgRmlsZUNoYW5uZWx9IGRlZmluZXMgdGhlIG1ldGhvZHMgZm9yIHJlYWRpbmcsIHdyaXRpbmcsIG1lbW9yeQorICogbWFwcGluZywgYW5kIG1hbmlwdWxhdGluZyB0aGUgbG9naWNhbCBzdGF0ZSBvZiBhIHBsYXRmb3JtIGZpbGUuIFRoaXMgdHlwZQorICogZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBmb3Igb3BlbmluZyBmaWxlcywgc2luY2UgdGhpcyBiZWhhdmlvciBoYXMgYmVlbgorICogZGVsZWdhdGVkIHRvIHRoZSB7QGxpbmsgamF2YS5pby5GaWxlSW5wdXRTdHJlYW19LAorICoge0BsaW5rIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbX0gYW5kIHtAbGluayBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGV9IHR5cGVzLgogICogPC9wPgogICogPHA+Ci0gKiBGaWxlQ2hhbm5lbHMgY3JlYXRlZCBmcm9tIGEgRmlsZUlucHV0U3RyZWFtLCBvciBhIFJhbmRvbUFjY2Vzc0ZpbGUgY3JlYXRlZCBpbgotICogbW9kZSAiciIsIGFyZSByZWFkLW9ubHkuIEZpbGVDaGFubmVscyBjcmVhdGVkIGZyb20gYSBGaWxlT3V0cHV0U3RyZWFtIGFyZQotICogd3JpdGUtb25seS4gRmlsZUNoYW5uZWxzIGNyZWF0ZWQgZnJvbSBhIFJhbmRvbUFjY2Vzc0ZpbGUgY3JlYXRlZCBpbiBtb2RlICJydyIKLSAqIGFyZSByZWFkL3dyaXRlLiBGaWxlQ2hhbm5lbHMgY3JlYXRlZCBmcm9tIGEgUmFuZG9tQWNjZXNzRmlsZSB0aGF0IHdhcyBvcGVuZWQKLSAqIGluIGFwcGVuZC1tb2RlIHdpbGwgYWxzbyBiZSBpbiBhcHBlbmQtbW9kZSAtLSBtZWFuaW5nIHRoYXQgZWFjaCB3cml0ZSB3aWxsIGJlCi0gKiBwcm9jZWVkZWQgYnkgYSBzZWVrIHRvIHRoZSBlbmQgb2YgZmlsZS4gU29tZSBwbGF0Zm9ybXMgd2lsbCBzZWVrIGFuZCB3cml0ZQotICogYXRvbWljYWxseSwgb3RoZXJzIHdpbGwgbm90LgorICogRmlsZUNoYW5uZWxzIGNyZWF0ZWQgZnJvbSBhIHtAY29kZSBGaWxlSW5wdXRTdHJlYW19IG9yIGEKKyAqIHtAY29kZSBSYW5kb21BY2Nlc3NGaWxlfSBjcmVhdGVkIGluIG1vZGUgInIiLCBhcmUgcmVhZC1vbmx5LiBGaWxlQ2hhbm5lbHMKKyAqIGNyZWF0ZWQgZnJvbSBhIHtAY29kZSBGaWxlT3V0cHV0U3RyZWFtfSBhcmUgd3JpdGUtb25seS4gRmlsZUNoYW5uZWxzIGNyZWF0ZWQKKyAqIGZyb20gYSB7QGNvZGUgUmFuZG9tQWNjZXNzRmlsZX0gY3JlYXRlZCBpbiBtb2RlICJydyIgYXJlIHJlYWQvd3JpdGUuCisgKiBGaWxlQ2hhbm5lbHMgY3JlYXRlZCBmcm9tIGEge0Bjb2RlIFJhbmRvbUFjY2Vzc0ZpbGV9IHRoYXQgd2FzIG9wZW5lZCBpbgorICogYXBwZW5kLW1vZGUgd2lsbCBhbHNvIGJlIGluIGFwcGVuZC1tb2RlIC0tIG1lYW5pbmcgdGhhdCBlYWNoIHdyaXRlIHdpbGwgYmUKKyAqIHByb2NlZWRlZCBieSBhIHNlZWsgdG8gdGhlIGVuZCBvZiBmaWxlLgogICogPC9wPgogICogPHA+Ci0gKiBGaWxlQ2hhbm5lbHMgaGFzIGEgdmlydHVhbCBwb2ludGVyIGludG8gdGhlIGZpbGUgd2hpY2ggaXMgcmVmZXJyZWQgdG8gYXMgYQotICogZmlsZSA8ZW0+cG9zaXRpb248L2VtPi4gVGhlIHBvc2l0aW9uIGNhbiBiZSBtYW5pcHVsYXRlZCBieSByZXBvc2l0aW9uaW5nCi0gKiBpdCB3aXRoaW4gdGhlIGZpbGUsIGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBjYW4gYmUgcXVlcmllZC4KKyAqIEZpbGVDaGFubmVscyBoYXZlIGEgdmlydHVhbCBwb2ludGVyIGludG8gdGhlIGZpbGUgd2hpY2ggaXMgcmVmZXJyZWQgdG8gYXMgYQorICogZmlsZSA8ZW0+cG9zaXRpb248L2VtPi4gVGhlIHBvc2l0aW9uIGNhbiBiZSBtYW5pcHVsYXRlZCBieSBtb3ZpbmcgaXQKKyAqIHdpdGhpbiB0aGUgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBvc2l0aW9uIGNhbiBiZSBxdWVyaWVkLgogICogPC9wPgogICogPHA+CiAgKiBGaWxlQ2hhbm5lbHMgYWxzbyBoYXZlIGFuIGFzc29jaWF0ZWQgPGVtPnNpemU8L2VtPi4gVGhlIHNpemUgb2YgdGhlIGZpbGUKQEAgLTU2LDE5ICs1NiwxOSBAQAogICogRmlsZUNoYW5uZWxzIGhhdmUgb3BlcmF0aW9ucyBiZXlvbmQgdGhlIHNpbXBsZSByZWFkLCB3cml0ZSwgYW5kIGNsb3NlLiBUaGV5CiAgKiBjYW4gYWxzbzoKICAqIDx1bD4KLSAqIDxsaT5yZXF1ZXN0IHRoYXQgY2FjaGVkIGRhdGEgYmUgZm9yY2VkIG9udG8gdGhlIGRpc2s8L2xpPgotICogPGxpPmxvY2sgcmFuZ2VzIG9mIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZTwvbGk+CisgKiA8bGk+cmVxdWVzdCB0aGF0IGNhY2hlZCBkYXRhIGJlIGZvcmNlZCBvbnRvIHRoZSBkaXNrLDwvbGk+CisgKiA8bGk+bG9jayByYW5nZXMgb2YgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLDwvbGk+CiAgKiA8bGk+dHJhbnNmZXIgZGF0YSBkaXJlY3RseSB0byBhbm90aGVyIGNoYW5uZWwgaW4gYSBtYW5uZXIgdGhhdCBoYXMgdGhlCi0gKiBwb3RlbnRpYWwgdG8gYmUgb3B0aW1pemVkIGJ5IHRoZSBwbGF0Zm9ybTwvbGk+CisgKiBwb3RlbnRpYWwgdG8gYmUgb3B0aW1pemVkIGJ5IHRoZSBwbGF0Zm9ybSw8L2xpPgogICogPGxpPm1lbW9yeS1tYXBwaW5nIGZpbGVzIGludG8gTklPIGJ1ZmZlcnMgdG8gcHJvdmlkZSBlZmZpY2llbnQgbWFuaXB1bGF0aW9uCi0gKiBvZiBmaWxlIGRhdGE8L2xpPgorICogb2YgZmlsZSBkYXRhLDwvbGk+CiAgKiA8bGk+cmVhZCBhbmQgd3JpdGUgdG8gdGhlIGZpbGUgYXQgYWJzb2x1dGUgYnl0ZSBvZmZzZXRzIGluIGEgZmFzaGlvbiB0aGF0Ci0gKiBkb2VzIG5vdCBtb2RpZnkgdGhlIGN1cnJlbnQgcG9zaXRpb248L2xpPgorICogZG9lcyBub3QgbW9kaWZ5IHRoZSBjdXJyZW50IHBvc2l0aW9uLjwvbGk+CiAgKiA8L3VsPgogICogPC9wPgogICogPHA+CiAgKiBGaWxlQ2hhbm5lbHMgYXJlIHRocmVhZC1zYWZlLiBPbmx5IG9uZSBvcGVyYXRpb24gaW52b2x2aW5nIG1hbmlwdWxhdGlvbiBvZgotICogdGhlIGZpbGUgcG9zaXRpb24gbWF5IGJlIGluLWZsaWdodCBhdCBvbmNlLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHN1Y2gKKyAqIHRoZSBmaWxlIHBvc2l0aW9uIG1heSBiZSBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHN1Y2gKICAqIG9wZXJhdGlvbnMgd2lsbCBibG9jaywgYW5kIG9uZSBvZiB0aG9zZSBibG9ja2VkIHdpbGwgYmUgZnJlZWQgdG8gY29udGludWUKICAqIHdoZW4gdGhlIGZpcnN0IG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiBUaGVyZSBpcyBubyBvcmRlcmVkIHF1ZXVlIG9yIGZhaXJuZXNzCiAgKiBhcHBsaWVkIHRvIHRoZSBibG9ja2VkIHRocmVhZHMuCkBAIC03OSwzMiArNzksNDEgQEAKICAqIDwvcD4KICAqIDxwPgogICogVGhlIGxvZ2ljYWwgdmlldyBvZiB0aGUgdW5kZXJseWluZyBmaWxlIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBGaWxlQ2hhbm5lbHMKLSAqIGFuZCBJTyBzdHJlYW1zIG9wZW5lZCBvbiB0aGUgc2FtZSBmaWxlIGJ5IHRoZSBzYW1lIEpWTSBwcm9jZXNzLiBUaGVyZWZvcmUKLSAqIG1vZGlmaWNhdGlvbnMgcGVyZm9ybWVkIHZpYSBhIGNoYW5uZWwgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBzdHJlYW0sIGFuZCB2aWNlCi0gKiB2ZXJzYTsgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGZpbGUgcG9zaXRpb24sIGNvbnRlbnQsIHNpemUsIGV0Yy4KKyAqIGFuZCBJL08gc3RyZWFtcyBvcGVuZWQgb24gdGhlIHNhbWUgZmlsZSBieSB0aGUgc2FtZSB2aXJ0dWFsIG1hY2hpbmUgcHJvY2Vzcy4KKyAqIFRoZXJlZm9yZSwgbW9kaWZpY2F0aW9ucyBwZXJmb3JtZWQgdmlhIGEgY2hhbm5lbCB3aWxsIGJlIHZpc2libGUgdG8gdGhlCisgKiBzdHJlYW0gYW5kIHZpY2UgdmVyc2E7IHRoaXMgaW5jbHVkZXMgbW9kaWZpY2F0aW9ucyB0byB0aGUgZmlsZSBwb3NpdGlvbiwKKyAqIGNvbnRlbnQsIHNpemUsIGV0Yy4KICAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlQ2hhbm5lbCBleHRlbmRzIEFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwKICAgICAgICAgaW1wbGVtZW50cyBHYXRoZXJpbmdCeXRlQ2hhbm5lbCwgU2NhdHRlcmluZ0J5dGVDaGFubmVsLCBCeXRlQ2hhbm5lbCB7CiAKICAgICAvKioKLSAgICAgKiBBIHR5cGUgb2YgZmlsZSBtYXBwaW5nIG1vZGVzLgorICAgICAqIHtAY29kZSBNYXBNb2RlfSBkZWZpbmVzIGZpbGUgbWFwcGluZyBtb2RlIGNvbnN0YW50cy4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcE1vZGUgewogICAgICAgICAvKioKICAgICAgICAgICogUHJpdmF0ZSBtYXBwaW5nIG1vZGUgKGVxdWl2YWxlbnQgdG8gY29weSBvbiB3cml0ZSkuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwTW9kZSBQUklWQVRFID0gbmV3IE1hcE1vZGUoIlBSSVZBVEUiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZWFkLW9ubHkgbWFwcGluZyBtb2RlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcE1vZGUgUkVBRF9PTkxZID0gbmV3IE1hcE1vZGUoIlJFQURfT05MWSIpOyAvLyROT04tTkxTLTEkCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQtd3JpdGUgbWFwcGluZyBtb2RlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcE1vZGUgUkVBRF9XUklURSA9IG5ldyBNYXBNb2RlKCJSRUFEX1dSSVRFIik7IC8vJE5PTi1OTFMtMSQKIApAQCAtMTIwLDEwICsxMjksMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHZlcnNpb24gb2YgdGhlIG1hcHBpbmcgbW9kZSB1c2VmdWwgZm9yIGRlYnVnZ2luZwotICAgICAgICAgKiBldGMuCisgICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgbWFwcGluZyBtb2RlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgbW9kZSBzdHJpbmcuCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBtYXAgbW9kZSBhcyBzdHJpbmcuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiBkaXNwbGF5TmFtZTsKQEAgLTEzMiwyMCArMTQxLDIyIEBACiAKICAgICAvKioKICAgICAgKiBQcm90ZWN0ZWQgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRmlsZUNoYW5uZWwoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0aGF0IGFsbCB1cGRhdGVzIHRvIHRoZSBjaGFubmVsIGFyZSBjb21taXR0ZWQgdG8gdGhlIHN0b3JhZ2UKKyAgICAgKiBSZXF1ZXN0cyB0aGF0IGFsbCB1cGRhdGVzIHRvIHRoaXMgY2hhbm5lbCBhcmUgY29tbWl0dGVkIHRvIHRoZSBzdG9yYWdlCiAgICAgICogZGV2aWNlLgogICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBtZXRob2QgcmV0dXJucyBhbGwgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBwbGF0Zm9ybSBmaWxlCi0gICAgICogdW5kZXJseWluZyB0aGlzIGNoYW5uZWwgd2lsbCBiZSBjb21taXR0ZWQgdG8gYSBsb2NhbCBzdG9yYWdlIGRldmljZS4gSWYKLSAgICAgKiB0aGUgZmlsZSBpcyBub3QgaG9zdGVkIGxvY2FsbHksIHN1Y2ggYXMgYSBuZXR3b3JrZWQgZmlsZSBzeXN0ZW0sIHRoZW4KLSAgICAgKiBhcHBsaWNhdGlvbnMgY2Fubm90IGJlIGNlcnRhaW4gdGhhdCB0aGUgbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4KLSAgICAgKiBjb21taXR0ZWQuCisgICAgICogV2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zLCBhbGwgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBwbGF0Zm9ybSBmaWxlCisgICAgICogdW5kZXJseWluZyB0aGlzIGNoYW5uZWwgaGF2ZSBiZWVuIGNvbW1pdHRlZCBpZiB0aGUgZmlsZSByZXNpZGVzIG9uIGEKKyAgICAgKiBsb2NhbCBzdG9yYWdlIGRldmljZS4gSWYgdGhlIGZpbGUgaXMgbm90IGhvc3RlZCBsb2NhbGx5LCBmb3IgZXhhbXBsZSBvbiBhCisgICAgICogbmV0d29ya2VkIGZpbGUgc3lzdGVtLCB0aGVuIGFwcGxpY2F0aW9ucyBjYW5ub3QgYmUgY2VydGFpbiB0aGF0IHRoZQorICAgICAqIG1vZGlmaWNhdGlvbnMgaGF2ZSBiZWVuIGNvbW1pdHRlZC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+CiAgICAgICogVGhlcmUgYXJlIG5vIGFzc3VyYW5jZXMgZ2l2ZW4gdGhhdCBjaGFuZ2VzIG1hZGUgdG8gdGhlIGZpbGUgdXNpbmcgbWV0aG9kcwpAQCAtMTUzLDMxICsxNjQsMjkgQEAKICAgICAgKiBtYXBwZWQgYnl0ZSBidWZmZXIgbWF5IG5vdCBiZSBjb21taXR0ZWQuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5tZXRhZGF0YTwvY29kZT4gcGFyYW1ldGVyIGluZGljYXRlZCB3aGV0aGVyIHRoZSB1cGRhdGUgc2hvdWxkCisgICAgICogVGhlIDxjb2RlPm1ldGFkYXRhPC9jb2RlPiBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBzaG91bGQKICAgICAgKiBpbmNsdWRlIHRoZSBmaWxlJ3MgbWV0YWRhdGEgc3VjaCBhcyBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lLCBsYXN0IGFjY2VzcwogICAgICAqIHRpbWUsIGV0Yy4gTm90ZSB0aGF0IHBhc3NpbmcgPGNvZGU+dHJ1ZTwvY29kZT4gbWF5IGludm9rZSBhbiB1bmRlcmx5aW5nCiAgICAgICogd3JpdGUgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gKGlmIHRoZSBwbGF0Zm9ybSBpcyBtYWludGFpbmluZyBtZXRhZGF0YQogICAgICAqIHN1Y2ggYXMgbGFzdCBhY2Nlc3MgdGltZSksIGV2ZW4gaWYgdGhlIGNoYW5uZWwgaXMgb3BlbmVkIHJlYWQtb25seS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWV0YWRhdGEKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGZpbGUgbWV0YWRhdGEgc2hvdWxkIGJlIGZsdXNoZWQgaW4gYWRkaXRpb24gdG8gdGhlCi0gICAgICogICAgICAgICAgICBmaWxlIGNvbnRlbnQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGZpbGUgbWV0YWRhdGEgc2hvdWxkIGJlIGZsdXNoZWQgaW4KKyAgICAgKiAgICAgICAgICAgIGFkZGl0aW9uIHRvIHRoZSBmaWxlIGNvbnRlbnQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgc29tZSBvdGhlciBwcm9ibGVtIG9jY3VycmVkLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb3JjZShib29sZWFuIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBPYnRhaW4gYW4gZXhjbHVzaXZlIGxvY2sgb24gdGhpcyBmaWxlLgorICAgICAqIE9idGFpbnMgYW4gZXhjbHVzaXZlIGxvY2sgb24gdGhpcyBmaWxlLgogICAgICAqIDxwPgogICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGFjcXVpcmluZyBhIG1heGltdW0gbGVuZ3RoIGxvY2sgb24gYQogICAgICAqIGZpbGUuIEl0IGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiBmaWxlQ2hhbm5lbC5sb2NrKDBMLCBMb25nLk1BWF9WQUxVRSwgZmFsc2UpCi0gICAgICogPC9wcmU+CisgICAgICoge0Bjb2RlIGZpbGVDaGFubmVsLmxvY2soMEwsIExvbmcuTUFYX1ZBTFVFLCBmYWxzZSk7fQogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGxvY2sgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbG9ja2VkIGZpbGUgYXJlYS4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KQEAgLTE4NSwyNCArMTk0LDI2IEBACiAgICAgICogQHRocm93cyBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICB0aGlzIGNoYW5uZWwgd2FzIG5vdCBvcGVuZWQgZm9yIHdyaXRpbmcuCiAgICAgICogQHRocm93cyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRWl0aGVyIGEgbG9jayBpcyBhbHJlYWR5IGhlbGQgdGhhdCBvdmVybGFwcyB0aGlzIGxvY2sKKyAgICAgKiAgICAgICAgICAgICBlaXRoZXIgYSBsb2NrIGlzIGFscmVhZHkgaGVsZCB0aGF0IG92ZXJsYXBzIHRoaXMgbG9jawogICAgICAqICAgICAgICAgICAgIHJlcXVlc3QsIG9yIGFub3RoZXIgdGhyZWFkIGlzIHdhaXRpbmcgdG8gYWNxdWlyZSBhIGxvY2sgdGhhdAogICAgICAqICAgICAgICAgICAgIHdpbGwgb3ZlcmxhcCB3aXRoIHRoaXMgcmVxdWVzdC4KICAgICAgKiBAdGhyb3dzIEZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIGNhbGxpbmcgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvIGFjcXVpcmUKKyAgICAgKiAgICAgICAgICAgICB0aGUgY2FsbGluZyB0aHJlYWQgd2FzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgdG8gYWNxdWlyZQogICAgICAqICAgICAgICAgICAgIHRoZSBsb2NrLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBUaGUgY2hhbm5lbCB3YXMgY2xvc2VkIHdoaWxlIHRoZSBjYWxsaW5nIHRocmVhZCB3YXMgd2FpdGluZworICAgICAqICAgICAgICAgICAgIHRoZSBjaGFubmVsIHdhcyBjbG9zZWQgd2hpbGUgdGhlIGNhbGxpbmcgdGhyZWFkIHdhcyB3YWl0aW5nCiAgICAgICogICAgICAgICAgICAgdG8gYWNxdWlyZSB0aGUgbG9jay4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgc29tZSBvdGhlciBwcm9ibGVtIG9jY3VycmVkIG9idGFpbmluZyB0aGUgcmVxdWVzdGVkIGxvY2suCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIG9idGFpbmluZyB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgbG9jay4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgRmlsZUxvY2sgbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBsb2NrKDBMLCBMb25nLk1BWF9WQUxVRSwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9idGFpbiBhIGxvY2sgb24gYSBzcGVjaWZpZWQgcmVnaW9uIG9mIHRoZSBmaWxlLgorICAgICAqIE9idGFpbnMgYSBsb2NrIG9uIGEgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgZmlsZS4KICAgICAgKiA8cD4KICAgICAgKiBUaGlzIGlzIHRoZSBibG9ja2luZyB2ZXJzaW9uIG9mIGxvY2sgYWNxdWlzaXRpb24sIHNlZSBhbHNvIHRoZQogICAgICAqIDxjb2RlPnRyeUxvY2soKTwvY29kZT4gbWV0aG9kcy4KQEAgLTIxNSwxOSArMjI2LDIwIEBACiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIHJlcXVlc3QgaXMgbm90IGZvciBhbiBvdmVybGFwcGluZyBsb2NrLCB0aGUgdGhyZWFkIGNhbGxpbmcgdGhpcwogICAgICAqIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBsb2NrIGlzIG9idGFpbmVkIChsaWtlbHkgYnkgbm8gY29udGVudGlvbiBvcgotICAgICAqIGFub3RoZXIgcHJvY2VzcyByZWxlYXNpbmcgYSBsb2NrKSwgb3IgdGhpcyB0aHJlYWQgYmVpbmcgaW50ZXJydXB0ZWQgb3IKLSAgICAgKiB0aGUgY2hhbm5lbCBjbG9zZWQuCisgICAgICogYW5vdGhlciBwcm9jZXNzIHJlbGVhc2luZyBhIGxvY2spLCBvciB1bnRpbCB0aGlzIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBvcgorICAgICAqIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIGxvY2sgaXMgb2J0YWluZWQgc3VjY2Vzc2Z1bGx5IHRoZW4gdGhlIEZpbGVMb2NrIG9iamVjdCByZXR1cm5lZAotICAgICAqIHJlcHJlc2VudHMgdGhlIGxvY2sgZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyBvbiB0aGUgbG9ja2VkIHJlZ2lvbi4KKyAgICAgKiBJZiB0aGUgbG9jayBpcyBvYnRhaW5lZCBzdWNjZXNzZnVsbHkgdGhlbiB0aGUge0BsaW5rIEZpbGVMb2NrfSBvYmplY3QKKyAgICAgKiByZXR1cm5lZCByZXByZXNlbnRzIHRoZSBsb2NrIGZvciBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgb24gdGhlIGxvY2tlZAorICAgICAqIHJlZ2lvbi4KICAgICAgKiA8L3A+CiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jaywgdGhlIHRocmVhZCBpcwotICAgICAqIHNldCB0byB0aGUgaW50ZXJydXB0ZWQgc3RhdGUsIGFuZCB0aHJvd3MgYQotICAgICAqIDxjb2RlPkZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uPC9jb2RlPi4gSWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkCi0gICAgICogd2hpbGUgdGhlIHRocmVhZCBpcyB3YWl0aW5nIHRvIG9idGFpbiB0aGUgbG9jayB0aGVuIHRoZSB0aHJlYWQgdGhyb3dzIGEKLSAgICAgKiA8Y29kZT5Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbjwvY29kZT4uCisgICAgICogc2V0IHRvIHRoZSBpbnRlcnJ1cHRlZCBzdGF0ZSBhbmQgdGhyb3dzIGEKKyAgICAgKiB7QGxpbmsgRmlsZUxvY2tJbnRlcnJ1cHRpb25FeGNlcHRpb259LiBJZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkIHdoaWxlCisgICAgICogdGhlIHRocmVhZCBpcyB3YWl0aW5nIHRvIG9idGFpbiB0aGUgbG9jayB0aGVuIHRoZSB0aHJlYWQgdGhyb3dzIGEKKyAgICAgKiB7QGxpbmsgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb259LgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KICAgICAgKiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgdGhlIHBvc2l0aW9uIGFuZCBzaXplIHRvIGJlIHdpdGhpbiB0aGUKQEAgLTIzNSw2OCArMjQ3LDcyIEBACiAgICAgICogPC9wPgogICAgICAqIDxwPgogICAgICAqIFNvbWUgcGxhdGZvcm1zIGRvIG5vdCBzdXBwb3J0IHNoYXJlZCBsb2NrcywgYW5kIGlmIGEgcmVxdWVzdCBpcyBtYWRlIGZvcgotICAgICAqIGEgc2hhcmVkIGxvY2sgb24gc3VjaCBhIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0byBhY3F1aXJlIGFuCisgICAgICogYSBzaGFyZWQgbG9jayBvbiBzdWNoIGEgcGxhdGZvcm0sIHRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0byBhY3F1aXJlIGFuCiAgICAgICogZXhjbHVzaXZlIGxvY2sgaW5zdGVhZC4gSXQgaXMgdW5kZWZpbmVkIHdoZXRoZXIgdGhlIGxvY2sgb2J0YWluZWQgaXMKICAgICAgKiBhZHZpc29yeSBvciBtYW5kYXRvcnkuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbG9jayByZWdpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIGxvY2tlZCByZWdpb24uCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGxvY2ssIGluIGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBsb2NrZWQgcmVnaW9uIGluIGJ5dGVzLgogICAgICAqIEBwYXJhbSBzaGFyZWQKICAgICAgKiAgICAgICAgICAgIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gYXR0ZW1wdCBzaG91bGQgYmUgbWFkZSB0byBhY3F1aXJlCiAgICAgICogICAgICAgICAgICBhIHNoYXJlZCBsb2NrLgotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbG9jayBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGxvY2sgb2JqZWN0LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBvc2l0aW9ufSBvciB7QGNvZGUgc2l6ZX0gaXMgbmVnYXRpdmUuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBvdmVybGFwcyBhbiBleGlzdGluZyBsb2NrIG9yIHBlbmRpbmcKICAgICAgKiAgICAgICAgICAgICBsb2NrIHJlcXVlc3QuCiAgICAgICogQHRocm93cyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBub3Qgb3BlbiBpbiByZWFkLW1vZGUgYW5kIHNoYXJlZCBpcyB0cnVlLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBvcGVuZWQgaW4gcmVhZC1tb2RlIGJ1dCBzaGFyZWQgaXMgdHJ1ZS4KICAgICAgKiBAdGhyb3dzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBvcGVuIGluIHdyaXRlIG1vZGUgYW5kIHNoYXJlZCBpcyBmYWxzZS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBub3Qgb3BlbmVkIGluIHdyaXRlIG1vZGUgYnV0IHNoYXJlZCBpcworICAgICAqICAgICAgICAgICAgIGZhbHNlLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlzIGV4ZWN1dGluZy4KICAgICAgKiBAdGhyb3dzIEZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCB3aGlsZSBpbiB0aGUgc3RhdGUgb2Ygd2FpdGluZwotICAgICAqICAgICAgICAgICAgIG9uIHRoZSBkZXNpcmVkIGZpbGUgbG9jay4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkIHdoaWxlIGluIHRoZSBzdGF0ZSBvZiB3YWl0aW5nIG9uCisgICAgICogICAgICAgICAgICAgdGhlIGRlc2lyZWQgZmlsZSBsb2NrLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzb21lIG90aGVyIElPIHByb2JsZW0gb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRmlsZUxvY2sgbG9jayhsb25nIHBvc2l0aW9uLCBsb25nIHNpemUsIGJvb2xlYW4gc2hhcmVkKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogTWFwcyB0aGUgZmlsZSBpbnRvIG1lbW9yeS5UaGVyZSBjYW4gYmUgdGhyZWUgbW9kZXM6UmVhZC1vbmx5LFJlYWQvd3JpdGUKLSAgICAgKiBhbmQgUHJpdmF0ZS4KLSAgICAgKiAKLSAgICAgKiBBZnRlciBtYXBwaW5nLCB0aGUgbWVtb3J5IGFuZCB0aGUgZmlsZSBjaGFubmVsIGRvIG5vdCBhZmZlY3QgZWFjaCBvdGhlci4KLSAgICAgKiAKLSAgICAgKiBOb3RlIDogbWFwcGluZyBhIGZpbGUgaW50byBtZW1vcnkgaXMgdXN1YWxseSBleHBlbnNpdmUuCisgICAgICogTWFwcyB0aGUgZmlsZSBpbnRvIG1lbW9yeS4gVGhlcmUgY2FuIGJlIHRocmVlIG1vZGVzOiByZWFkLW9ubHksCisgICAgICogcmVhZC93cml0ZSBhbmQgcHJpdmF0ZS4gQWZ0ZXIgbWFwcGluZywgY2hhbmdlcyBtYWRlIHRvIG1lbW9yeSBvciB0aGUgZmlsZQorICAgICAqIGNoYW5uZWwgZG8gbm90IGFmZmVjdCB0aGUgb3RoZXIgc3RvcmFnZSBwbGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBtYXBwaW5nIGEgZmlsZSBpbnRvIG1lbW9yeSBpcyB1c3VhbGx5IGV4cGVuc2l2ZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aHJlZSBtb2RlcyB0byBtYXAKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgdGhyZWUgbWFwcGluZyBtb2Rlcy4KICAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgZmlsZQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBmaWxlLgogICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICB0aGUgc2l6ZSB0byBtYXAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXBwZWQgYnl0ZSBidWZmZXIKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSByZWdpb24gdG8gbWFwIGludG8gbWVtb3J5LgorICAgICAqIEByZXR1cm4gdGhlIG1hcHBlZCBieXRlIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBmaWxlIGlzIG5vdCBvcGVuZWQgZm9yIHJlYWRpbmcgYnV0IHRoZSBnaXZlbiBtb2RlIGlzCi0gICAgICogICAgICAgICAgICAgIlJFQURfT05MWSIKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgRmlsZUNoYW5uZWwgaXMgbm90IG9wZW5lZCBmb3IgcmVhZGluZyBidXQgdGhlIGdpdmVuCisgICAgICogICAgICAgICAgICAgbW9kZSBpcyAiUkVBRF9PTkxZIi4KICAgICAgKiBAdGhyb3dzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBmaWxlIGlzIG5vdCBvcGVuZWQgZm9yIHdyaXRpbmcgYnV0IHRoZSBtb2RlIGlzIG5vdAotICAgICAqICAgICAgICAgICAgICJSRUFEX09OTFkiCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEZpbGVDaGFubmVsIGlzIG5vdCBvcGVuZWQgZm9yIHdyaXRpbmcgYnV0IHRoZSBnaXZlbgorICAgICAqICAgICAgICAgICAgIG1vZGUgaXMgbm90ICJSRUFEX09OTFkiLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGdpdmVuIHBhcmFtZXRlcnMgb2YgcG9zaXRpb24gYW5kIHNpemUgYXJlIG5vdCBjb3JyZWN0CisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIHBhcmFtZXRlcnMgb2YgcG9zaXRpb24gYW5kIHNpemUgYXJlIG5vdCBjb3JyZWN0LgorICAgICAqICAgICAgICAgICAgIEJvdGggbXVzdCBiZSBub24gbmVnYXRpdmUuIHtAY29kZSBzaXplfSBhbHNvIG11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgYmlnZ2VyIHRoYW4gbWF4IGludGVnZXIuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBJL08gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IE1hcHBlZEJ5dGVCdWZmZXIgbWFwKEZpbGVDaGFubmVsLk1hcE1vZGUgbW9kZSwKICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwpAQCAtMzA3LDkgKzMyMywxMCBAQAogICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIG51bWJlciBvZiBieXRlcyBmcm9tCiAgICAgICogICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc29tZSBvdGhlciBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgcG9zaXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKQEAgLTMxOSw5ICszMzYsOSBAQAogICAgICAqIFRoZSBhcmd1bWVudCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvdW50ZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCiAgICAgICogVGhlIHBvc2l0aW9uIGNhbm5vdCBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IGlzIG5lZ2F0aXZlLiBUaGUgbmV3IHBvc2l0aW9uCiAgICAgICogY2FuIGJlIHNldCBiZXlvbmQgdGhlIGN1cnJlbnQgZmlsZSBzaXplLiBJZiBzZXQgYmV5b25kIHRoZSBjdXJyZW50IGZpbGUKLSAgICAgKiBzaXplLCBhdHRlbXB0cyB0byByZWFkIHdpbGwgcmV0dXJuIGVuZCBvZiBmaWxlLCBhbmQgd3JpdGVzIHdpbGwgc3VjY2VlZCwKLSAgICAgKiBidXQgZmlsbC1pbiB0aGUgYnl0ZXMgYmV0d2VlbiB0aGUgY3VycmVudCBlbmQgb2YgZmlsZSBhbmQgdGhlIHBvc2l0aW9uCi0gICAgICogd2l0aCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mICh1bnNwZWNpZmllZCkgYnl0ZSB2YWx1ZXMuCisgICAgICogc2l6ZSwgYXR0ZW1wdHMgdG8gcmVhZCB3aWxsIHJldHVybiBlbmQgb2YgZmlsZS4gV3JpdGUgb3BlcmF0aW9ucyB3aWxsCisgICAgICogc3VjY2VlZCBidXQgdGhleSB3aWxsIGZpbGwgdGhlIGJ5dGVzIGJldHdlZW4gdGhlIGN1cnJlbnQgZW5kIG9mIGZpbGUgYW5kCisgICAgICogdGhlIG5ldyBwb3NpdGlvbiB3aXRoIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgKHVuc3BlY2lmaWVkKSBieXRlIHZhbHVlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0CiAgICAgICogICAgICAgICAgICB0aGUgbmV3IGZpbGUgcG9zaXRpb24sIGluIGJ5dGVzLgpAQCAtMzI5LDIwMyArMzQ2LDI3OSBAQAogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBuZWdhdGl2ZS4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzb21lIG90aGVyIElPIHByb2JsZW0gb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRmlsZUNoYW5uZWwgcG9zaXRpb24obG9uZyBvZmZzZXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNoYW5uZWwgaW50byB0aGUgZ2l2ZW4gYnl0ZSBidWZmZXIuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIGZpbGUgY2hhbm5lbCBpbnRvIHRoZSBnaXZlbiBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGJ5dGVzIGFyZSByZWFkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24sIGFuZCBhZnRlciBzb21lCi0gICAgICogbnVtYmVyIG9mIGJ5dGVzIGFyZSByZWFkICh1cCB0byB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgICAgKiBidWZmZXIpIHRoZSBmaWxlIHBvc2l0aW9uIGlzIGluY3JlYXNlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5Ci0gICAgICogcmVhZC4KKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIGJlIHJlYWQgaXMgdGhlIHJlbWFpbmluZyBudW1iZXIgb2YKKyAgICAgKiBieXRlcyBpbiB0aGUgYnVmZmVyIHdoZW4gdGhlIG1ldGhvZCBpcyBpbnZva2VkLiBUaGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBpbnRvIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgdGhlIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsIG1heSBibG9jayBpZiBvdGhlciB0aHJlYWRzIGFyZSBhbHNvIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoaXMKKyAgICAgKiBjaGFubmVsLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBVcG9uIGNvbXBsZXRpb24sIHRoZSBidWZmZXIncyBwb3NpdGlvbiBpcyBzZXQgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZXMKKyAgICAgKiB0aGF0IGhhdmUgYmVlbiByZWFkLiBUaGUgYnVmZmVyJ3MgbGltaXQgaXMgbm90IGNoYW5nZWQuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbCNyZWFkKGphdmEubmlvLkJ5dGVCdWZmZXIpCisgICAgICogQHBhcmFtIGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGJ5dGVzLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgorICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBjbG9zZXMgdGhlIGNoYW5uZWwgZHVyaW5nIHRoZSByZWFkLgorICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCBkdXJpbmcgdGhlCisgICAgICogICAgICAgICAgICAgcmVhZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMsIGRldGFpbHMgYXJlIGluIHRoZSBtZXNzYWdlLgorICAgICAqIEB0aHJvd3MgTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaGFzIG5vdCBiZWVuIG9wZW5lZCBpbiBhIG1vZGUgdGhhdCBwZXJtaXRzCisgICAgICogICAgICAgICAgICAgcmVhZGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoQnl0ZUJ1ZmZlciBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGZpbGUgY2hhbm5lbCBpbnRvIHRoZSBnaXZlbiBidWZmZXIgc3RhcnRpbmcgZnJvbSB0aGUKLSAgICAgKiBnaXZlbiBmaWxlIHBvc2l0aW9uLgorICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhpcyBmaWxlIGNoYW5uZWwgaW50byB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nIGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIGZpbGUgcG9zaXRpb24uCiAgICAgICogPHA+CiAgICAgICogVGhlIGJ5dGVzIGFyZSByZWFkIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBmaWxlIHBvc2l0aW9uICh1cCB0byB0aGUKICAgICAgKiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIpLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5CiAgICAgICogcmVhZCBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIHBvc2l0aW9uIGlzIGJleW9uZCB0aGUgY3VycmVudCBlbmQgb2YgZmlsZSwgdGhlbiBubyBieXRlcyBhcmUKKyAgICAgKiBJZiB7QGNvZGUgcG9zaXRpb259IGlzIGJleW9uZCB0aGUgY3VycmVudCBlbmQgb2YgZmlsZSwgdGhlbiBubyBieXRlcyBhcmUKICAgICAgKiByZWFkLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgZmlsZSBwb3NpdGlvbiBpcyB1bm1vZGlmaWVkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqIE5vdGUgdGhhdCB0aGUgZmlsZSBwb3NpdGlvbiBpcyB1bm1vZGlmaWVkIGJ5IHRoaXMgbWV0aG9kLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGJ5dGVzLgogICAgICAqIEBwYXJhbSBwb3NpdGlvbgogICAgICAqICAgICAgICAgICAgdGhlIChub24tbmVnYXRpdmUpIHBvc2l0aW9uIGF0IHdoaWNoIHRvIHJlYWQgdGhlIGJ5dGVzLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+cG9zaXRpb248L2NvZGU+IGlzIGxlc3MgdGhhbiA8Y29kZT4tMTwvY29kZT4uCi0gICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCi0gICAgICogQHRocm93cyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCB3YXMgbm90IG9wZW5lZCBpbiByZWFkLW1vZGUuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgaXMgZXhlY3V0aW5nLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGlzCiAgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQogICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+cG9zaXRpb248L2NvZGU+IGlzIGxlc3MgdGhhbiAwLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBzb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGhhcyBub3QgYmVlbiBvcGVuZWQgaW4gYSBtb2RlIHRoYXQgcGVybWl0cworICAgICAqICAgICAgICAgICAgIHJlYWRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCByZWFkKEJ5dGVCdWZmZXIgYnVmZmVyLCBsb25nIHBvc2l0aW9uKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY2hhbm5lbCBpbnRvIGFsbCB0aGUgZ2l2ZW4gYnl0ZSBidWZmZXJzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBieXRlcyBhcmUgcmVhZCBzdGFydGluZyBhdCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLCBhbmQgYWZ0ZXIgc29tZQotICAgICAqIG51bWJlciBvZiBieXRlcyBhcmUgcmVhZCAodXAgdG8gdGhlIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMgaW4gYWxsIHRoZQotICAgICAqIGJ1ZmZlcnMpIHRoZSBmaWxlIHBvc2l0aW9uIGlzIGluY3JlYXNlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5CisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIGZpbGUgY2hhbm5lbCBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIHNwZWNpZmllZCBhcnJheQorICAgICAqIG9mIGJ1ZmZlcnMuIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIHJlYWQgYXMgbWFueSBieXRlcyBhcyBjYW4gYmUgc3RvcmVkCisgICAgICogaW4gdGhlIGJ1ZmZlciBhcnJheSBmcm9tIHRoaXMgY2hhbm5lbCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICogYWN0dWFsbHkgcmVhZC4gSXQgYWxzbyBpbmNyZWFzZXMgdGhlIGZpbGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBieXRlcwogICAgICAqIHJlYWQuCisgICAgICogPHA+CisgICAgICogSWYgYSByZWFkIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywgc3Vic2VxdWVudCB0aHJlYWRzIHdpbGwgYmxvY2sgdW50aWwKKyAgICAgKiB0aGUgcmVhZCBpcyBjb21wbGV0ZWQgYW5kIHdpbGwgdGhlbiBjb250ZW5kIGZvciB0aGUgYWJpbGl0eSB0byByZWFkLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBiZWhhdmVzIGV4YWN0bHkgbGlrZToKLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIHJlYWQoYnVmZmVycywgMCwgYnVmZmVycy5sZW5ndGgpOwotICAgICAqIDwvcHJlPgotICAgICAqIAorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICoge0Bjb2RlIHJlYWQoYnVmZmVycywgMCwgYnVmZmVycy5sZW5ndGgpO30KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TY2F0dGVyaW5nQnl0ZUNoYW5uZWwjcmVhZChqYXZhLm5pby5CeXRlQnVmZmVyW10pCisgICAgICogQHBhcmFtIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBieXRlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCisgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgZHVyaW5nIHRoaXMgcmVhZAorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRocmVhZCBkdXJpbmcgdGhpcworICAgICAqICAgICAgICAgICAgIHJlYWQgb3BlcmF0aW9uLgorICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3VyczsgZGV0YWlscyBhcmUgaW4gdGhlIG1lc3NhZ2UuCisgICAgICogQHRocm93cyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBoYXMgbm90IGJlZW4gb3BlbmVkIGluIGEgbW9kZSB0aGF0IHBlcm1pdHMKKyAgICAgKiAgICAgICAgICAgICByZWFkaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBsb25nIHJlYWQoQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiByZWFkKGJ1ZmZlcnMsIDAsIGJ1ZmZlcnMubGVuZ3RoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoZSBmaWxlIGNoYW5uZWwgaW50byBhIHN1YnNldCBvZiB0aGUgZ2l2ZW4gYnl0ZQotICAgICAqIGJ1ZmZlcnMuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIGZpbGUgY2hhbm5lbCBhbmQgc3RvcmVzIHRoZW0gaW4gYSBzdWJzZXQgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGFycmF5IG9mIGJ1ZmZlcnMuIFRoZSBzdWJzZXQgaXMgZGVmaW5lZCBieSB7QGNvZGUgc3RhcnR9IGFuZAorICAgICAqIHtAY29kZSBudW1iZXJ9LCBpbmRpY2F0aW5nIHRoZSBmaXJzdCBidWZmZXIgYW5kIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0bworICAgICAqIHVzZS4gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gcmVhZCBhcyBtYW55IGJ5dGVzIGFzIGNhbiBiZSBzdG9yZWQgaW4gdGhlCisgICAgICogYnVmZmVyIHN1YnNldCBmcm9tIHRoaXMgY2hhbm5lbCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5CisgICAgICogcmVhZC4gSXQgYWxzbyBpbmNyZWFzZXMgdGhlIGZpbGUgcG9zaXRpb24gYnkgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgcmVhZCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHN1YnNlcXVlbnQgdGhyZWFkcyB3aWxsIGJsb2NrIHVudGlsCisgICAgICogdGhlIHJlYWQgaXMgY29tcGxldGVkIGFuZCB3aWxsIHRoZW4gY29udGVuZCBmb3IgdGhlIGFiaWxpdHkgdG8gcmVhZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TY2F0dGVyaW5nQnl0ZUNoYW5uZWwjcmVhZChqYXZhLm5pby5CeXRlQnVmZmVyW10sCi0gICAgICogICAgICBpbnQsIGludCkKKyAgICAgKiBAcGFyYW0gYnVmZmVycworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnVmZmVyIHRvIHN0b3JlIGJ5dGVzIGluLgorICAgICAqIEBwYXJhbSBudW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIHN0b3JlIGJ5dGVzIGluLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgorICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGR1cmluZyB0aGlzIHJlYWQKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0aHJlYWQgZHVyaW5nIHRoaXMKKyAgICAgKiAgICAgICAgICAgICByZWFkIG9wZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydCA8IDB9IG9yIHtAY29kZSBudW1iZXIgPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgc3RhcnQgKyBudW1iZXJ9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJzfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzOyBkZXRhaWxzIGFyZSBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGhhcyBub3QgYmVlbiBvcGVuZWQgaW4gYSBtb2RlIHRoYXQgcGVybWl0cworICAgICAqICAgICAgICAgICAgIHJlYWRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZChCeXRlQnVmZmVyW10gYnVmZmVycywgaW50IHN0YXJ0LCBpbnQgbnVtYmVyKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB1bmRlcmx5aW5nIHRoaXMgY2hhbm5lbCwgaW4gYnl0ZXMuCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB1bmRlcmx5aW5nIHRoaXMgY2hhbm5lbCBpbiBieXRlcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGdldHRpbmcgdGhlIHNpemUgb2YgdGhlIGZpbGUuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBnZXR0aW5nIHRoZSBzaXplIG9mIHRoZSBmaWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2ZlcnMgYnl0ZXMgaW50byB0aGlzIGNoYW5uZWwncyBmaWxlIGZyb20gdGhlIGdpdmVuIHJlYWRhYmxlIGJ5dGUKLSAgICAgKiBjaGFubmVsLiBJdCBtYXkgYmUgdmVyeSBlZmZpY2llbnQuCi0gICAgICogCi0gICAgICogQnkgaW52b2tpbmcgdGhpcyBtZXRob2QsIGl0IHdpbGwgcmVhZCBmb3JtIHRoZSBzb3VyY2UgY2hhbm5lbCBhbmQgd3JpdGUKLSAgICAgKiBpbnRvIHRoZSBmaWxlIGNoYW5uZWwuCi0gICAgICogCi0gICAgICogTm90ZTogbm8gZ3VhcmFudGVlIHdoZXRoZXIgYWxsIGJ5dGVzIG1heSBiZSB0cmFuc2ZlcnJlZC4gQW5kIGl0IGRvZXMgbm90Ci0gICAgICogbW9kaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhbm5lbC4KKyAgICAgKiBSZWFkcyB1cCB0byB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20ge0Bjb2RlIHNyY30gYW5kIHN0b3JlcyB0aGVtIGluIHRoaXMKKyAgICAgKiBjaGFubmVsJ3MgZmlsZSBzdGFydGluZyBhdCB7QGNvZGUgcG9zaXRpb259LiBObyBieXRlcyBhcmUgdHJhbnNmZXJyZWQgaWYKKyAgICAgKiB7QGNvZGUgcG9zaXRpb259IGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoaXMgY2hhbm5lbCdzIGZpbGUuIExlc3MKKyAgICAgKiB0aGFuIHtAY29kZSBjb3VudH0gYnl0ZXMgYXJlIHRyYW5zZmVycmVkIGlmIHRoZXJlIGFyZSBsZXNzIGJ5dGVzCisgICAgICogcmVtYWluaW5nIGluIHRoZSBzb3VyY2UgY2hhbm5lbCBvciBpZiB0aGUgc291cmNlIGNoYW5uZWwgaXMgbm9uLWJsb2NraW5nCisgICAgICogYW5kIGhhcyBsZXNzIHRoYW4ge0Bjb2RlIGNvdW50fSBieXRlcyBpbW1lZGlhdGVseSBhdmFpbGFibGUgaW4gaXRzIG91dHB1dAorICAgICAqIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBjaGFubmVsJ3MgcG9zaXRpb24gaXMgbm90IG1vZGlmaWVkLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3JjCi0gICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNoYW5uZWwgdG8gcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBjaGFubmVsIHRvIHJlYWQgYnl0ZXMgZnJvbS4KICAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbmVnYXRpdmUgcG9zaXRpb24gdG8gYmVnaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbmVnYXRpdmUgc3RhcnQgcG9zaXRpb24uCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbm9uLW5lZ2F0aXZlIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkCisgICAgICogICAgICAgICAgICB0aGUgbm9uLW5lZ2F0aXZlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgdHJhbnNmZXJyZWQuCi0gICAgICogCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcGFyYW1ldGVycyBhcmUgbm90IGNvcnJlY3QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KICAgICAgKiBAdGhyb3dzIE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzb3VyY2UgY2hhbm5lbCBpcyBub3QgcmVhZGFibGUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc291cmNlIGNoYW5uZWwgaXMgbm90IHJlYWRhYmxlLgogICAgICAqIEB0aHJvd3MgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBjaGFubmVsIGlzIG5vdCB3cml0YWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBub3Qgd3JpdGFibGUuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgZWl0aGVyIGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgY2hhbm5lbCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgZWl0aGVyIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IG90aGVyIHRocmVhZHMgZHVyaW5nIHRoaXMgb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZWl0aGVyIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IG90aGVyIHRocmVhZHMgZHVyaW5nIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBJL08gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgdHJhbnNmZXJGcm9tKFJlYWRhYmxlQnl0ZUNoYW5uZWwgc3JjLCBsb25nIHBvc2l0aW9uLAogICAgICAgICAgICAgbG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVHJhbnNmZXJzIGRhdGEgZnJvbSB0aGUgZmlsZSB0byB0aGUgZ2l2ZW4gY2hhbm5lbC4gSXQgbWF5IGJlIHZlcnkKLSAgICAgKiBlZmZpY2llbnQuCi0gICAgICogCi0gICAgICogQnkgaW52b2tpbmcgdGhpcyBtZXRob2QsIGl0IHdpbGwgcmVhZCBmb3JtIHRoZSBmaWxlIGFuZCB3cml0ZSBpbnRvIHRoZQotICAgICAqIHdyaXRhYmxlIGNoYW5uZWwuCi0gICAgICogCi0gICAgICogTm90ZTogbm8gZ3VhcmFudGVlIHdoZXRoZXIgYWxsIGJ5dGVzIG1heSBiZSB0cmFuc2ZlcmVkLkFuZCBpdCBkb2VzIG5vdAotICAgICAqIG1vZGlmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYW5uZWwuCisgICAgICogUmVhZHMgdXAgdG8ge0Bjb2RlIGNvdW50fSBieXRlcyBmcm9tIHRoaXMgY2hhbm5lbCdzIGZpbGUgc3RhcnRpbmcgYXQKKyAgICAgKiB7QGNvZGUgcG9zaXRpb259IGFuZCB3cml0ZXMgdGhlbSB0byB7QGNvZGUgdGFyZ2V0fS4gTm8gYnl0ZXMgYXJlCisgICAgICogdHJhbnNmZXJyZWQgaWYge0Bjb2RlIHBvc2l0aW9ufSBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGlzIGNoYW5uZWwncworICAgICAqIGZpbGUuIExlc3MgdGhhbiB7QGNvZGUgY291bnR9IGJ5dGVzIGFyZSB0cmFuc2ZlcnJlZCBpZiB0aGVyZSBsZXNzIGJ5dGVzCisgICAgICogYXZhaWxhYmxlIGZyb20gdGhpcyBjaGFubmVsJ3MgZmlsZSBvciBpZiB0aGUgdGFyZ2V0IGNoYW5uZWwgaXMKKyAgICAgKiBub24tYmxvY2tpbmcgYW5kIGhhcyBsZXNzIHRoYW4ge0Bjb2RlIGNvdW50fSBieXRlcyBmcmVlIGluIGl0cyBpbnB1dAorICAgICAqIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBjaGFubmVsJ3MgcG9zaXRpb24gaXMgbm90IG1vZGlmaWVkLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBub24tbmVnYXRpdmUgcG9zaXRpb24gdG8gYmVnaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBub24tbmVnYXRpdmUgcG9zaXRpb24gdG8gYmVnaW4uCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogICAgICAgICAgICB0aGUgbm9uLW5lZ2F0aXZlIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkCisgICAgICogICAgICAgICAgICB0aGUgbm9uLW5lZ2F0aXZlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KICAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGNoYW5uZWwgdG8gd3JpdGUgaW50bworICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBjaGFubmVsIHRvIHdyaXRlIHRvLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgdHJhbnNmZXJyZWQuCi0gICAgICogCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcGFyYW1ldGVycyBhcmUgbm90IGNvcnJlY3QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KICAgICAgKiBAdGhyb3dzIE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgY2hhbm5lbCBpcyBub3QgcmVhZGFibGUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgbm90IHJlYWRhYmxlLgogICAgICAqIEB0aHJvd3MgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHRhcmdldCBjaGFubmVsIGlzIG5vdCB3cml0YWJsZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0YXJnZXQgY2hhbm5lbCBpcyBub3Qgd3JpdGFibGUuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgZWl0aGVyIGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgY2hhbm5lbCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgZWl0aGVyIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IG90aGVyIHRocmVhZHMgZHVyaW5nIHRoaXMKLSAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgY2hhbm5lbCBpcyBjbG9zZWQgYnkgb3RoZXIgdGhyZWFkcyBkdXJpbmcgdGhpcworICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkIGR1cmluZyB0aGlzIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW55IEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyB0cmFuc2ZlclRvKGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsCiAgICAgICAgICAgICBXcml0YWJsZUJ5dGVDaGFubmVsIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVHJ1bmNhdGVzIHRoZSBmaWxlIHVuZGVybHlpbmcgdGhpcyBjaGFubmVsIHRvIGEgZ2l2ZW4gc2l6ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBbnkgYnl0ZXMgYmV5b25kIHRoZSBnaXZlbiBzaXplIGFyZSByZW1vdmVkIGZyb20gdGhlIGZpbGUuIElmIHRoZXJlIGFyZQotICAgICAqIG5vIGJ5dGVzIGJleW9uZCB0aGUgZ2l2ZW4gc2l6ZSB0aGVuIHRoZSBmaWxlIGNvbnRlbnRzIGFyZSB1bm1vZGlmaWVkLgotICAgICAqIDwvcD4KKyAgICAgKiBUcnVuY2F0ZXMgdGhlIGZpbGUgdW5kZXJseWluZyB0aGlzIGNoYW5uZWwgdG8gYSBnaXZlbiBzaXplLiBBbnkgYnl0ZXMKKyAgICAgKiBiZXlvbmQgdGhlIGdpdmVuIHNpemUgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZmlsZS4gSWYgdGhlcmUgYXJlIG5vIGJ5dGVzCisgICAgICogYmV5b25kIHRoZSBnaXZlbiBzaXplIHRoZW4gdGhlIGZpbGUgY29udGVudHMgYXJlIHVubW9kaWZpZWQuCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIGZpbGUgcG9zaXRpb24gaXMgY3VycmVudGx5IGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gc2l6ZSwgdGhlbiBpdCBpcwotICAgICAqIHNldCB0byBiZSB0aGUgZ2l2ZW4gc2l6ZS4KKyAgICAgKiBzZXQgdG8gdGhlIG5ldyBzaXplLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBmaWxlCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aGUgcmVxdWVzdGVkIHNpemUgaXMgbmVnYXRpdmUuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBzaXplIGlzIG5lZ2F0aXZlLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgdGhlIGNoYW5uZWwgY2Fubm90IGJlIHdyaXR0ZW4uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgY2Fubm90IGJlIHdyaXR0ZW4gdG8uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHNvbWUgb3RoZXIgSU8gcHJvYmxlbSBvY2N1cnJlZC4KLSAgICAgKiBAcmV0dXJuIHRoaXMgY2hhbm5lbAorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgY2hhbm5lbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRmlsZUNoYW5uZWwgdHJ1bmNhdGUobG9uZyBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKQEAgLTUzNCw3OSArNjI3LDkyIEBACiAgICAgICogPHA+CiAgICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgYXR0ZW1wdGluZyB0byBhY3F1aXJlIGEgbWF4aW11bSBsZW5ndGgKICAgICAgKiBsb2NrIG9uIHRoZSBmaWxlLiBJdCBpcyBlcXVpdmFsZW50IHRvOgotICAgICAqIAotICAgICAqIDxwcmU+Ci0gICAgICogZmlsZUNoYW5uZWwudHJ5TG9jaygwTCwgTG9uZy5NQVhfVkFMVUUsIGZhbHNlKQotICAgICAqIDwvcHJlPgotICAgICAqIAorICAgICAqIHtAY29kZSBmaWxlQ2hhbm5lbC50cnlMb2NrKDBMLCBMb25nLk1BWF9WQUxVRSwgZmFsc2UpO30KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhY3F1aXNpdGlvbiB3b3VsZCByZXN1bHQgaW4KLSAgICAgKiBhbiBvdmVybGFwcGVkIGxvY2sgd2l0aCBhbm90aGVyIE9TIHByb2Nlc3MuCisgICAgICogVGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfSBpZiB0aGUgYWNxdWlzaXRpb24gd291bGQgcmVzdWx0IGluIGFuCisgICAgICogb3ZlcmxhcHBlZCBsb2NrIHdpdGggYW5vdGhlciBPUyBwcm9jZXNzLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGxvY2sgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbG9jayB3b3VsZAotICAgICAqICAgICAgICAgb3ZlcmxhcCBhbiBleGlzdGluZyBleGNsdXNpdmUgbG9jayBpbiBhbm90aGVyIE9TIHByb2Nlc3MuCisgICAgICogQHJldHVybiB0aGUgZmlsZSBsb2NrIG9iamVjdCwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBsb2NrIHdvdWxkIG92ZXJsYXAKKyAgICAgKiAgICAgICAgIHdpdGggYW4gZXhpc3RpbmcgZXhjbHVzaXZlIGxvY2sgaW4gYW5vdGhlciBPUyBwcm9jZXNzLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHRoZSBmaWxlIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaWxlIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIEVpdGhlciBhIGxvY2sgaXMgYWxyZWFkeSBoZWxkIHRoYXQgb3ZlcmxhcHMgdGhpcyBsb2NrCi0gICAgICogICAgICAgICAgICAgcmVxdWVzdCwgb3IgYW5vdGhlciB0aHJlYWQgaXMgd2FpdGluZyB0byBhY3F1aXJlIGEgbG9jayB0aGF0Ci0gICAgICogICAgICAgICAgICAgd2lsbCBvdmVybGFwIHdpdGggdGhpcyByZXF1ZXN0LgorICAgICAqICAgICAgICAgICAgIGlmIGEgbG9jayBhbHJlYWR5IGV4aXN0cyB0aGF0IG92ZXJsYXBzIHRoaXMgbG9jayByZXF1ZXN0IG9yCisgICAgICogICAgICAgICAgICAgYW5vdGhlciB0aHJlYWQgaXMgd2FpdGluZyB0byBhY3F1aXJlIGEgbG9jayB0aGF0IHdpbGwgb3ZlcmxhcAorICAgICAqICAgICAgICAgICAgIHdpdGggdGhpcyByZXF1ZXN0LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbnkgSS9PIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGFueSBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBGaWxlTG9jayB0cnlMb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHRyeUxvY2soMEwsIExvbmcuTUFYX1ZBTFVFLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gYWNxdWlyZSBhbiBleGNsdXNpdmUgbG9jayBvbiB0aGlzIGZpbGUgd2l0aG91dCBibG9ja2luZy4KKyAgICAgKiBBdHRlbXB0cyB0byBhY3F1aXJlIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRoaXMgZmlsZSB3aXRob3V0IGJsb2NraW5nLiBUaGUKKyAgICAgKiBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgdGhlIGFjcXVpc2l0aW9uIHdvdWxkIHJlc3VsdCBpbiBhbgorICAgICAqIG92ZXJsYXBwZWQgbG9jayB3aXRoIGFub3RoZXIgT1MgcHJvY2Vzcy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFjcXVpc2l0aW9uIHdvdWxkIHJlc3VsdCBpbgotICAgICAqIGFuIG92ZXJsYXBwZWQgbG9jayB3aXRoIGFub3RoZXIgT1MgcHJvY2Vzcy4KKyAgICAgKiBJdCBpcyBwb3NzaWJsZSB0byBhY3F1aXJlIGEgbG9jayBmb3IgYW55IHJlZ2lvbiBldmVuIGlmIGl0J3MgY29tcGxldGVseQorICAgICAqIG91dHNpZGUgb2YgdGhlIGZpbGUncyBzaXplLiBUaGUgc2l6ZSBvZiB0aGUgbG9jayBpcyBmaXhlZC4gSWYgdGhlIGZpbGUKKyAgICAgKiBncm93cyBvdXRzaWRlIG9mIHRoZSBsb2NrIHRoYXQgcmVnaW9uIG9mIHRoZSBmaWxlIHdvbid0IGJlIGxvY2tlZCBieSB0aGlzCisgICAgICogbG9jay4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBvc2l0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb3NpdGlvbi4KICAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgZmlsZSB0byBsb2NrCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiBmaWxlIHRvIGxvY2suCiAgICAgICogQHBhcmFtIHNoYXJlZAotICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiBzaGFyZQotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbG9jayBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsb2NrIHdvdWxkCi0gICAgICogICAgICAgICBvdmVybGFwIGFuIGV4aXN0aW5nIGV4Y2x1c2l2ZSBsb2NrIGluIGFub3RoZXIgT1MgcHJvY2Vzcy4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGxvY2sgaXMgc2hhcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbG9jayBvYmplY3QsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgbG9jayB3b3VsZCBvdmVybGFwCisgICAgICogICAgICAgICB3aXRoIGFuIGV4aXN0aW5nIGV4Y2x1c2l2ZSBsb2NrIGluIGFub3RoZXIgT1MgcHJvY2Vzcy4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFueSBwYXJhbWV0ZXJzIGFyZSBiYWQKKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aGUgZmlsZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSBjaGFubmVsIGlzIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFaXRoZXIgYSBsb2NrIGlzIGFscmVhZHkgaGVsZCB0aGF0IG92ZXJsYXBzIHRoaXMgbG9jawotICAgICAqICAgICAgICAgICAgIHJlcXVlc3QsIG9yIGFub3RoZXIgdGhyZWFkIGlzIHdhaXRpbmcgdG8gYWNxdWlyZSBhIGxvY2sgdGhhdAotICAgICAqICAgICAgICAgICAgIHdpbGwgb3ZlcmxhcCB3aXRoIHRoaXMgcmVxdWVzdC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGxvY2sgaXMgYWxyZWFkeSBoZWxkIHRoYXQgb3ZlcmxhcHMgdGhpcyBsb2NrIHJlcXVlc3Qgb3IKKyAgICAgKiAgICAgICAgICAgICBhbm90aGVyIHRocmVhZCBpcyB3YWl0aW5nIHRvIGFjcXVpcmUgYSBsb2NrIHRoYXQgd2lsbCBvdmVybGFwCisgICAgICogICAgICAgICAgICAgd2l0aCB0aGlzIHJlcXVlc3QuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBJL08gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYW55IEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEZpbGVMb2NrIHRyeUxvY2sobG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplLCBib29sZWFuIHNoYXJlZCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBieXRlcyBmcm9tIHRoZSBnaXZlbiBieXRlIGJ1ZmZlciBpbnRvIHRoZSBmaWxlIGNoYW5uZWwuCisgICAgICogV3JpdGVzIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGJ5dGUgYnVmZmVyIHRvIHRoaXMgZmlsZSBjaGFubmVsLgogICAgICAqIDxwPgogICAgICAqIFRoZSBieXRlcyBhcmUgd3JpdHRlbiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLCBhbmQgYWZ0ZXIKICAgICAgKiBzb21lIG51bWJlciBvZiBieXRlcyBhcmUgd3JpdHRlbiAodXAgdG8gdGhlIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMgaW4KICAgICAgKiB0aGUgYnVmZmVyKSB0aGUgZmlsZSBwb3NpdGlvbiBpcyBpbmNyZWFzZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcwogICAgICAqIGFjdHVhbGx5IHdyaXR0ZW4uCiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsI3dyaXRlKGphdmEubmlvLkJ5dGVCdWZmZXIpCi0gICAgICogCiAgICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBidWZmZXIgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBieXRlcyB0byBiZSB3cml0dGVuLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgd2FzIG5vdCBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgd2FzIGFscmVhZHkgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBjbG9zZXMgdGhlIGNoYW5uZWwgZHVyaW5nIHRoZSB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhpcworICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGludGVycnVwdCBzdGF0ZSBvZiB0aGUgY2FsbGluZyAKKyAgICAgKiAgICAgICAgICAgICB0aHJlYWQgaXMgc2V0IGFuZCB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3VycywgZGV0YWlscyBhcmUgaW4gdGhlIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCB3cml0ZShCeXRlQnVmZmVyIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciB0byB0aGUgZmlsZSBjaGFubmVsIHN0YXJ0aW5nIGF0IHRoZQorICAgICAqIFdyaXRlcyBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIgdG8gdGhpcyBmaWxlIGNoYW5uZWwgc3RhcnRpbmcgYXQgdGhlCiAgICAgICogZ2l2ZW4gZmlsZSBwb3NpdGlvbi4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgYnl0ZXMgYXJlIHdyaXR0ZW4gc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGZpbGUgcG9zaXRpb24gKHVwIHRvIHRoZQpAQCAtNjE5LDcgKzcyNSw3IEBACiAgICAgICogYnl0ZSB2YWx1ZXMuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBmaWxlIHBvc2l0aW9uIGlzIHVubW9kaWZpZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogTm90ZSB0aGF0IHRoZSBmaWxlIHBvc2l0aW9uIGlzIG5vdCBtb2RpZmllZCBieSB0aGlzIG1ldGhvZC4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgpAQCAtNjI4LDUxICs3MzQsOTUgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSAobm9uLW5lZ2F0aXZlKSBwb3NpdGlvbiBhdCB3aGljaCB0byB3cml0ZSB0aGUgYnl0ZXMuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgbGVzcyB0aGFuIDxjb2RlPi0xPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgbGVzcyB0aGFuIDAuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIHdhcyBub3Qgb3BlbmVkIGluIHdyaXRlLW1vZGUuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgaXMgZXhlY3V0aW5nLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBjYWxsaW5nIHRocmVhZCB3aWxsIGhhdmUgdGhlCi0gICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCwgYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBpbnRlcnJ1cHQgc3RhdGUgb2YgdGhlIGNhbGxpbmcKKyAgICAgKiAgICAgICAgICAgICB0aHJlYWQgaXMgc2V0IGFuZCB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHNvbWUgb3RoZXIgSU8gZXJyb3Igb2NjdXJyZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcG9zaXRpb24pCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYnl0ZXMgZnJvbSBhbGwgdGhlIGdpdmVuIGJ5dGUgYnVmZmVycyBpbnRvIHRoZSBmaWxlIGNoYW5uZWwuCisgICAgICogV3JpdGVzIGJ5dGVzIGZyb20gYWxsIHRoZSBnaXZlbiBieXRlIGJ1ZmZlcnMgdG8gdGhpcyBmaWxlIGNoYW5uZWwuCiAgICAgICogPHA+CiAgICAgICogVGhlIGJ5dGVzIGFyZSB3cml0dGVuIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24sIGFuZCBhZnRlcgotICAgICAqIHNvbWUgbnVtYmVyIG9mIGJ5dGVzIGFyZSB3cml0dGVuICh1cCB0byB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyBpbgotICAgICAqIGFsbCB0aGUgYnVmZmVycykgdGhlIGZpbGUgcG9zaXRpb24gaXMgaW5jcmVhc2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgKiBhY3R1YWxseSB3cml0dGVuLgorICAgICAqIHRoZSBieXRlcyBhcmUgd3JpdHRlbiAodXAgdG8gdGhlIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMgaW4gYWxsIHRoZQorICAgICAqIGJ1ZmZlcnMpLCB0aGUgZmlsZSBwb3NpdGlvbiBpcyBpbmNyZWFzZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseQorICAgICAqIHdyaXR0ZW4uCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgYmVoYXZlcyBleGFjdGx5IGxpa2U6Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiB3cml0ZShidWZmZXJzLCAwLCBidWZmZXJzLmxlbmd0aCk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiB7QGNvZGUgd3JpdGUoYnVmZmVycywgMCwgYnVmZmVycy5sZW5ndGgpO30KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5HYXRoZXJpbmdCeXRlQ2hhbm5lbCN3cml0ZShqYXZhLm5pby5CeXRlQnVmZmVyW10pCisgICAgICogQHBhcmFtIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXJzIGNvbnRhaW5pbmcgYnl0ZXMgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCisgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgZHVyaW5nIHRoaXMgd3JpdGUKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBpbnRlcnJ1cHQgc3RhdGUgb2YgdGhlIGNhbGxpbmcgCisgICAgICogICAgICAgICAgICAgdGhyZWFkIGlzIHNldCBhbmQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3VyczsgZGV0YWlscyBhcmUgaW4gdGhlIG1lc3NhZ2UuCisgICAgICogQHRocm93cyBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgd2FzIG5vdCBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGxvbmcgd3JpdGUoQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiB3cml0ZShidWZmZXJzLCAwLCBidWZmZXJzLmxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogV3JpdGVzIGJ5dGVzIGZyb20gYSBzdWJzZXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheSBvZiBidWZmZXJzIGludG8gdGhpcworICAgICAqIGZpbGUgY2hhbm5lbC4gVGhlIHN1YnNldCBpcyBkZWZpbmVkIGJ5IHtAY29kZSBvZmZzZXR9IGFuZCB7QGNvZGUgbGVuZ3RofSwKKyAgICAgKiBpbmRpY2F0aW5nIHRoZSBmaXJzdCBidWZmZXIgYW5kIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0byB1c2UuCisgICAgICogPHA+CisgICAgICogSWYgYSB3cml0ZSBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHN1YnNlcXVlbnQgdGhyZWFkcyB3aWxsIGJsb2NrIHVudGlsCisgICAgICogdGhlIHdyaXRlIGlzIGNvbXBsZXRlZCBhbmQgdGhlbiBjb250ZW5kIGZvciB0aGUgYWJpbGl0eSB0byB3cml0ZS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5HYXRoZXJpbmdCeXRlQ2hhbm5lbCN3cml0ZShqYXZhLm5pby5CeXRlQnVmZmVyW10sCi0gICAgICogICAgICBpbnQsIGludCkKKyAgICAgKiBAcGFyYW0gYnVmZmVycworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyB0aGF0IGlzIHRoZSBzb3VyY2UgZm9yIGJ5dGVzIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRvIHRoaXMgY2hhbm5lbC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ1ZmZlciBpbiB7QGNvZGUgYnVmZmVycyB9dG8gZ2V0IGJ5dGVzCisgICAgICogICAgICAgICAgICBmcm9tLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0byBnZXQgYnl0ZXMgZnJvbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiB0byB0aGlzIGNoYW5uZWwuCisgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgZHVyaW5nIHRoaXMgd3JpdGUKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBpbnRlcnJ1cHQgc3RhdGUgb2YgdGhlIGNhbGxpbmcgCisgICAgICogICAgICAgICAgICAgdGhyZWFkIGlzIHNldCBhbmQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYnVmZmVyc30uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3VyczsgZGV0YWlscyBhcmUgaW4gdGhlIG1lc3NhZ2UuCisgICAgICogQHRocm93cyBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgd2FzIG5vdCBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgd3JpdGUoQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9GaWxlTG9jay5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUxvY2suamF2YQppbmRleCA0NmM5NGRkLi5lOWFhZTFmIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9GaWxlTG9jay5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVMb2NrLmphdmEKQEAgLTE5LDU4ICsxOSw2MyBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotLy8gQkVHSU4gYW5kcm9pZC1ub3RlCi0vLyAgIC0gZml4ZWQgYmFkIGh0bSBpbiBqYXZhZG9jIGNvbW1lbnRzIC1qb2VvCi0vLyBFTkQgYW5kcm9pZC1ub3RlCi0KIC8qKgotICogQSA8Y29kZT5GaWxlTG9jazwvY29kZT4gcmVwcmVzZW50cyBhIGxvY2tlZCByZWdpb24gb2YgYSBmaWxlLgorICogQSB7QGNvZGUgRmlsZUxvY2t9IHJlcHJlc2VudHMgYSBsb2NrZWQgcmVnaW9uIG9mIGEgZmlsZS4KICAqIDxwPgogICogTG9ja3MgaGF2ZSBjZXJ0YWluIHByb3BlcnRpZXMgdGhhdCBlbmFibGUgY29sbGFib3JhdGluZyBwcm9jZXNzZXMgdG8gYXZvaWQKLSAqIHRoZSBsb3N0IHVwZGF0ZSBwcm9ibGVtLCBvciByZWFkaW5nIGluY29uc2lzdGVudCBkYXRhLgotICogPC9wPgotICogPHA+Ci0gKiBsb2dpY2FsbHksIGEgZmlsZSBsb2NrIGNhbiBiZSAnZXhjbHVzaXZlJyBvciAnc2hhcmVkJy4gTXVsdGlwbGUgcHJvY2Vzc2VzIGNhbgotICogaG9sZCBzaGFyZWQgbG9ja3Mgb24gdGhlIHNhbWUgcmVnaW9uIG9mIGEgZmlsZSwgYnV0IG9ubHkgYSBzaW5nbGUgcHJvY2VzcyBjYW4KLSAqIGhvbGQgYW4gZXhjbHVzaXZlIGxvY2sgb24gYSBnaXZlbiByZWdpb24gb2YgYSBmaWxlIGFuZCBubyBvdGhlciBwcm9jZXNzIGNhbgorICogdGhlIGxvc3QgdXBkYXRlIHByb2JsZW0gb3IgcmVhZGluZyBpbmNvbnNpc3RlbnQgZGF0YS4gTG9naWNhbGx5LCBhIGZpbGUgbG9jaworICogY2FuIGJlIDxlbT5leGNsdXNpdmU8L2VtPiBvciA8ZW0+c2hhcmVkPC9lbT4uIE11bHRpcGxlIHByb2Nlc3NlcyBjYW4gaG9sZAorICogc2hhcmVkIGxvY2tzIG9uIHRoZSBzYW1lIHJlZ2lvbiBvZiBhIGZpbGUsIGJ1dCBvbmx5IGEgc2luZ2xlIHByb2Nlc3MgY2FuIGhvbGQKKyAqIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIGEgZ2l2ZW4gcmVnaW9uIG9mIGEgZmlsZSBhbmQgbm8gb3RoZXIgcHJvY2VzcyBjYW4KICAqIHNpbXVsdGFuZW91c2x5IGhvbGQgYSBzaGFyZWQgbG9jayBvdmVybGFwcGluZyB0aGUgZXhjbHVzaXZlIGxvY2suIEFuCi0gKiBhcHBsaWNhdGlvbiBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgYSBGaWxlTG9jayBpcyBzaGFyZWQgb3IgZXhjbHVzaXZlIHZpYSB0aGUKLSAqIDxjb2RlPmlzU2hhcmVkKCk8L2NvZGU+IEFQSS4KKyAqIGFwcGxpY2F0aW9uIGNhbiBkZXRlcm1pbmUgd2hldGhlciBhIHtAY29kZSBGaWxlTG9ja30gaXMgc2hhcmVkIG9yIGV4Y2x1c2l2ZQorICogdmlhIHRoZSB7QGNvZGUgaXNTaGFyZWQoKX0gbWV0aG9kLgogICogPC9wPgogICogPHA+CiAgKiBMb2NrcyBoZWxkIGJ5IGEgcGFydGljdWxhciBwcm9jZXNzIGNhbm5vdCBvdmVybGFwIG9uZSBhbm90aGVyLiBBcHBsaWNhdGlvbnMKLSAqIGNhbiBkZXRlcm1pbmUgd2hldGhlciBhIHByb3Bvc2VkIGxvY2sgd2lsbCBvdmVybGFwIGJ5IHVzaW5nIHRoZQotICogPGNvZGU+b3ZlcmxhcHMobG9uZywgbG9uZyk8L2NvZGU+KSBBUEkuICBMb2NrcyBoZWxkIGluCi0gKiBvdGhlciBwcm9jZXNzZXMgbWF5IG92ZXJsYXAgbG9ja3MgaGVsZCBpbiB0aGlzIHByb2Nlc3MuPC9wPgorICogY2FuIGRldGVybWluZSB3aGV0aGVyIGEgcHJvcG9zZWQgbG9jayB3aWxsIG92ZXJsYXAgYnkgdXNpbmcgdGhlIHtAY29kZQorICogb3ZlcmxhcHMobG9uZywgbG9uZyl9KSBtZXRob2QuIExvY2tzIGhlbGQgaW4gb3RoZXIgcHJvY2Vzc2VzIG1heSBvdmVybGFwCisgKiBsb2NrcyBoZWxkIGluIHRoaXMgcHJvY2Vzcy4gTG9ja3MgYXJlIHNoYXJlZCBhbW9uZ3N0IGFsbCB0aHJlYWRzIGluIHRoZQorICogYWNxdWlyaW5nIHByb2Nlc3MsIGFuZCBhcmUgdGhlcmVmb3JlIHVuc3VpdGFibGUgZm9yIGludHJhLXByb2Nlc3MKKyAqIHN5bmNocm9uaXphdGlvbi4KKyAqIDwvcD4KICAqIDxwPgotICogTG9ja3MgYXJlIHNoYXJlZCBhbW9uZ3N0IGFsbCB0aHJlYWRzIGluIHRoZSBhY3F1aXJpbmcgcHJvY2VzcywgYW5kIGFyZSB0aGVyZWZvcmUgdW5zdWl0YWJsZSBmb3IKLSAqIGludHJhLXByb2Nlc3Mgc3luY2hyb25pemF0aW9uLjwvcD4KKyAqIE9uY2UgYSBsb2NrIGlzIGFjcXVpcmVkLCBpdCBpcyBpbW11dGFibGUgaW4gYWxsIGl0cyBzdGF0ZSBleGNlcHQge0Bjb2RlCisgKiBpc1ZhbGlkKCl9LiBUaGUgbG9jayB3aWxsIGluaXRpYWxseSBiZSB2YWxpZCwgYnV0IG1heSBiZSByZW5kZXJlZCBpbnZhbGlkIGJ5CisgKiBleHBsaWNpdCByZW1vdmFsIG9mIHRoZSBsb2NrLCB1c2luZyB7QGNvZGUgcmVsZWFzZSgpfSwgb3IgaW1wbGljaXRseSBieQorICogY2xvc2luZyB0aGUgY2hhbm5lbCBvciBleGl0aW5nIHRoZSBwcm9jZXNzICh0ZXJtaW5hdGluZyB0aGUgdmlydHVhbCBtYWNoaW5lKS4KKyAqIDwvcD4KKyAqIDxoMz5QbGF0Zm9ybSBkZXBlbmRlbmNpZXM8L2gzPgogICogPHA+Ci0gKiBPbmNlIGEgbG9jayBpcyBhY3F1aXJlZCBpdCBpcyBpbW11dGFibGUgaW4gYWxsIGl0cyBzdGF0ZSBleGNlcHQgPGNvZGU+aXNWYWxpZCgpPC9jb2RlPi4gIFRoZSBsb2NrCi0gKiB3aWxsIGluaXRpYWxseSBiZSB2YWxpZCwgYnV0IG1heSBiZSByZW5kZXJlZCBpbnZhbGlkIGJ5IGV4cGxpY2l0IHJlbW92YWwgb2YgdGhlIGxvY2ssIHVzaW5nIDxjb2RlPgotICogcmVsZWFzZSgpPC9jb2RlPiwgb3IgaW1wbGljaXRseSBieSBjbG9zaW5nIHRoZSBjaGFubmVsIG9yIGV4aXRpbmcgdGhlIHByb2Nlc3MgKHRlcm1pbmF0aW5nIHRoZSBKVk0pLjwvcD4KKyAqIExvY2tzIGFyZSBpbnRlbmRlZCB0byBiZSB0cnVlIHBsYXRmb3JtIG9wZXJhdGluZyBzeXN0ZW0gZmlsZSBsb2NrcywgYW5kCisgKiB0aGVyZWZvcmUgbG9ja3MgaGVsZCBieSB0aGUgdmlydHVhbCBtYWNoaW5lIHByb2Nlc3Mgd2lsbCBiZSB2aXNpYmxlIHRvIG90aGVyCisgKiBvcGVyYXRpbmcgc3lzdGVtIHByb2Nlc3Nlcy4KKyAqIDwvcD4KICAqIDxwPgotICogPGVtPlBsYXRmb3JtIGRlcGVuZGVuY2llczwvZW0+PC9wPgorICogVGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIGxvY2tzIHdpbGwgc2hvdworICogdGhyb3VnaCBpbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGUsIHNvbWUgcGxhdGZvcm1zJyBsb2NrcyBhcmUKKyAqICdtYW5kYXRvcnknIC0tIG1lYW5pbmcgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZW5mb3JjZXMgdGhlIGxvY2tzIG9uIHByb2Nlc3NlcworICogdGhhdCBhdHRlbXB0IHRvIGFjY2VzcyBsb2NrZWQgcmVnaW9ucyBvZiBmaWxlczsgd2hlcmVhcyBvdGhlciBwbGF0Zm9ybXMnCisgKiBsb2NrcyBhcmUgb25seSAnYWR2aXNvcnknIC0tIG1lYW5pbmcgdGhhdCBwcm9jZXNzZXMgYXJlIHJlcXVpcmVkIHRvCisgKiBjb2xsYWJvcmF0ZSB0byBlbnN1cmUgbG9ja3MgYXJlIGFjcXVpcmVkIGFuZCB0aGVyZSBpcyBhIHBvdGVudGlhbCBmb3IKKyAqIHByb2Nlc3NlcyB0byBub3QgcGxheSB3ZWxsLiBUbyBiZSBvbiB0aGUgc2FmZSBzaWRlLCBpdCBpcyBiZXN0IHRvIGFzc3VtZSB0aGF0CisgKiB0aGUgcGxhdGZvcm0gaXMgYWRvcHRpbmcgYWR2aXNvcnkgbG9ja3MgYW5kIGFsd2F5cyBhY3F1aXJlIHNoYXJlZCBsb2NrcyB3aGVuCisgKiByZWFkaW5nIGEgcmVnaW9uIG9mIGEgZmlsZS4KKyAqIDwvcD4KICAqIDxwPgotICogTG9ja3MgYXJlIGludGVuZGVkIHRvIGJlIHRydWUgcGxhdGZvcm0gb3BlcmF0aW5nIHN5c3RlbSBmaWxlIGxvY2tzLCBhbmQgdGhlcmVmb3JlIGxvY2tzIGhlbGQgYnkgdGhlCi0gKiBKVk0gcHJvY2VzcyB3aWxsIGJlIHZpc2libGUgdG8gb3RoZXIgT1MgcHJvY2Vzc2VzLjwvcD4KKyAqIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgcHJlc2VuY2Ugb2YgYSBsb2NrIHdpbGwgcHJldmVudCB0aGUgZmlsZSBmcm9tIGJlaW5nCisgKiBtZW1vcnktbWFwcGVkLiBPbiBzb21lIHBsYXRmb3JtcywgY2xvc2luZyBhIGNoYW5uZWwgb24gYSBnaXZlbiBmaWxlIGhhbmRsZQorICogd2lsbCByZWxlYXNlIGFsbCB0aGUgbG9ja3MgaGVsZCBvbiB0aGF0IGZpbGUgLS0gZXZlbiBpZiB0aGVyZSBhcmUgb3RoZXIKKyAqIGNoYW5uZWxzIG9wZW4gb24gdGhlIHNhbWUgZmlsZTsgdGhlaXIgbG9ja3Mgd2lsbCBhbHNvIGJlIHJlbGVhc2VkLiBUaGUgc2FmZQorICogb3B0aW9uIGhlcmUgaXMgdG8gZW5zdXJlIHRoYXQgeW91IG9ubHkgYWNxdWlyZSBsb2NrcyBvbiBhIHNpbmdsZSBjaGFubmVsIGZvcgorICogYSBwYXJ0aWN1bGFyIGZpbGUgYW5kIHRoYXQgYmVjb21lcyB0aGUgc3luY2hyb25pemF0aW9uIHBvaW50LgorICogPC9wPgogICogPHA+Ci0gKiBUaGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB1bmRlcmx5aW5nIE9TIGxvY2tzIHdpbGwgc2hvdyB0aHJvdWdoIGluIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uLiAgRm9yCi0gKiBleGFtcGxlLCBzb21lIHBsYXRmb3JtcycgbG9ja3MgYXJlICdtYW5kYXRvcnknIC0tIG1lYW5pbmcgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZW5mb3JjZXMgdGhlIGxvY2tzCi0gKiBvbiBwcm9jZXNzZXMgdGhhdCBhdHRlbXB0IHRvIGFjY2VzcyBsb2NrZWQgcmVnaW9ucyBvZiBmaWxlOyB3aGVyZWFzIG90aGVyIHBsYXRmb3JtcycgbG9ja3MgYXJlCi0gKiBvbmx5ICdhZHZpc29yeScgLS0gbWVhbmluZyB0aGF0IHByb2Nlc3NlcyBhcmUgcmVxdWlyZWQgdG8gY29sbGFib3JhdGUgb24gZW5zdXJpbmcgbG9ja3MgYXJlIGFjcXVpcmVkCi0gKiBhbmQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgZm9yIHByb2Nlc3NlcyBub3QgdG8gcGxheSB3ZWxsLiAgVGhlIG9ubHkgc2FmZSBhbnN3ZXIgaXMgdG8gYXNzdW1lIHRoYXQKLSAqIHRoZSBwbGF0Zm9ybSBpcyBhZG9wdGluZyBhZHZpc29yeSBsb2NrcyBhbiBhbHdheXMgYWNxdWlyZSBzaGFyZWQgbG9ja3Mgd2hlbiByZWFkaW5nIGEgcmVnaW9uIG9mIGZpbGUuPC9wPgotICogPHA+Ci0gKiBPbiBzb21lIHBsYXRmb3JtcyB0aGUgcHJlc2VuY2Ugb2YgYSBsb2NrIHdpbGwgcHJldmVudCB0aGUgZmlsZSBiZWluZyBtZW1vcnkgbWFwcGVkLiAgT24gc29tZSBwbGF0Zm9ybXMKLSAqIGNsb3NpbmcgYSBjaGFubmVsIG9uIGEgZ2l2ZW4gZmlsZSBoYW5kbGUgd2lsbCByZWxlYXNlIGFsbCB0aGUgbG9ja3MgaGVsZCBvbiB0aGF0IGZpbGUgLS0gZXZlbiBpZiB0aGVyZQotICogYXJlIG90aGVyIGNoYW5uZWxzIG9wZW4gb24gdGhlIHNhbWUgZmlsZSAodGhlaXIgbG9ja3Mgd2lsbCBiZSByZWxlYXNlZCkuICBUaGUgc2FmZSBvcHRpb24gaGVyZSBpcyB0bwotICogZW5zdXJlIHRoYXQgeW91IG9ubHkgYWNxdWlyZSBsb2NrcyBvbiBhIHNpbmdsZSBjaGFubmVsIGZvciBhIHBhcnRpY3VsYXIgZmlsZSwgYW5kIHRoYXQgYmVjb21lcyB0aGUKLSAqIHN5bmNocm9uaXphdGlvbiBwb2ludC48L3A+Ci0gKiA8cD4KLSAqIEZ1cnRoZXIgY2FyZSBzaG91bGQgYmUgZXhlcmNpc2VkIHdoZW4gbG9ja2luZyBmaWxlcyBtYWludGFpbmVkIG9uIG5ldHdvcmsgZmlsZSBzeXN0ZW1zIHNpbmNlIHRoZXkgb2Z0ZW4KLSAqIGhhdmUgZnVydGhlciBsaW1pdGF0aW9ucy48L3A+ICAKLSAqCisgKiBGdXJ0aGVyIGNhcmUgc2hvdWxkIGJlIGV4ZXJjaXNlZCB3aGVuIGxvY2tpbmcgZmlsZXMgbWFpbnRhaW5lZCBvbiBuZXR3b3JrCisgKiBmaWxlIHN5c3RlbXMsIHNpbmNlIHRoZXkgb2Z0ZW4gaGF2ZSBmdXJ0aGVyIGxpbWl0YXRpb25zLgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVMb2NrIHsKIApAQCAtODcsMTggKzkyLDE5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNoYXJlZDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBmaWxlIGxvY2sgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gY2hhbm5lbC4gVGhlCi0gICAgICogY29uc3RydWN0b3IgZW5mb3JjZXMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uLCBzdHJldGNoLCBhbmQgc2hhcmVkIHN0YXR1cyBvZgotICAgICAqIHRoZSBsb2NrLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZmlsZSBsb2NrIGluc3RhbmNlIGZvciBhIGdpdmVuIGNoYW5uZWwuIFRoZSBjb25zdHJ1Y3RvcgorICAgICAqIGVuZm9yY2VzIHRoZSBzdGFydGluZyBwb3NpdGlvbiwgbGVuZ3RoIGFuZCBzaGFyaW5nIG1vZGUgb2YgdGhlIGxvY2suCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYW5uZWwKLSAgICAgKiAgICAgICAgICAgIHVuZGVybHlpbmcgZmlsZSBjaGFubmVsIHRoYXQgaG9sZHMgdGhlIGxvY2suCisgICAgICogICAgICAgICAgICB0aGUgdW5kZXJseWluZyBmaWxlIGNoYW5uZWwgdGhhdCBob2xkcyB0aGUgbG9jay4KICAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgbG9jay4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGxvY2suCiAgICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIGxlbmd0aCBvZiBsb2NrIGluIG51bWJlciBvZiBieXRlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGxvY2sgaW4gbnVtYmVyIG9mIGJ5dGVzLgogICAgICAqIEBwYXJhbSBzaGFyZWQKLSAgICAgKiAgICAgICAgICAgIHNoYXJlZCBzdGF0dXMgb2YgbG9jayAodHJ1ZSBpcyBzaGFyZWQsIGZhbHNlIGlzIGV4Y2x1c2l2ZSkuCisgICAgICogICAgICAgICAgICB0aGUgbG9jaydzIHNoYXJpbmcgbW9kZSBvZiBsb2NrOyB7QGNvZGUgdHJ1ZX0gaXMgc2hhcmVkLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpcyBleGNsdXNpdmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEZpbGVMb2NrKEZpbGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSwKICAgICAgICAgICAgIGJvb2xlYW4gc2hhcmVkKSB7CkBAIC0xMTMsOSArMTE5LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jaydzIEZpbGVDaGFubmVsLgorICAgICAqIFJldHVybnMgdGhlIGxvY2sncyB7QGxpbmsgRmlsZUNoYW5uZWx9LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEZpbGVDaGFubmVsIGNoYW5uZWwoKSB7CiAgICAgICAgIHJldHVybiBjaGFubmVsOwpAQCAtMTI1LDYgKzEzMiw3IEBACiAgICAgICogUmV0dXJucyB0aGUgbG9jaydzIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGxvY2sgcG9zaXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGxvbmcgcG9zaXRpb24oKSB7CiAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKQEAgLTEzMywzMSArMTQxLDM1IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGxvY2sgaW4gYnl0ZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiBmaWxlIGxvY2sgaW4gYnl0ZXMuCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBsb2NrIGluIGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBsb25nIHNpemUoKSB7CiAgICAgICAgIHJldHVybiBzaXplOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBsb2NrIGlzIHNoYXJlZCB3aXRoIG90aGVyIHByb2Nlc3NlcyBhbmQgZmFsc2UgaWYKLSAgICAgKiBpdCBpcyBub3QuCisgICAgICogSW5kaWNhdGVzIGlmIHRoZSBmaWxlIGxvY2sgaXMgc2hhcmVkIHdpdGggb3RoZXIgcHJvY2Vzc2VzIG9yIGlmIGl0IGlzCisgICAgICogZXhjbHVzaXZlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbG9jayBpcyBhIHNoYXJlZCBsb2NrLCBhbmQgZmFsc2UgaWYgaXQgaXMgZXhjbHVzaXZlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBsb2NrIGlzIGEgc2hhcmVkIGxvY2ssIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMKKyAgICAgKiAgICAgICAgIGV4Y2x1c2l2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1NoYXJlZCgpIHsKICAgICAgICAgcmV0dXJuIHNoYXJlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2VpdmVyJ3MgbG9jayByZWdpb24gb3ZlcmxhcHBzIHRoZSByZWdpb24gZGVzY3JpYmVkCi0gICAgICogaW4gdGhlIHBhcmFtZXRlciBsaXN0LGFuZCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyJ3MgbG9jayByZWdpb24gb3ZlcmxhcHMgdGhlIHJlZ2lvbiBkZXNjcmliZWQKKyAgICAgKiBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0YXJ0CiAgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBjb21wYXJhdGl2ZSBsb2NrLgogICAgICAqIEBwYXJhbSBsZW5ndGgKICAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGNvbXBhcmF0aXZlIGxvY2suCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFuIG92ZXJsYXAsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgaXMgYW4gb3ZlcmxhcCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gb3ZlcmxhcHMobG9uZyBzdGFydCwgbG9uZyBsZW5ndGgpIHsKICAgICAgICAgZmluYWwgbG9uZyBlbmQgPSBwb3NpdGlvbiArIHNpemUgLSAxOwpAQCAtMTY5LDIzICsxODEsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIGEgdmFsaWQgZmlsZSBsb2NrIG9yIG5vdC4gVGhlIGxvY2sgaXMKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGxvY2sgaXMgYSB2YWxpZCBmaWxlIGxvY2suIFRoZSBsb2NrIGlzCiAgICAgICogdmFsaWQgdW5sZXNzIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwgaGFzIGJlZW4gY2xvc2VkIG9yIGl0IGhhcyBiZWVuCiAgICAgICogZXhwbGljaXRseSByZWxlYXNlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxvY2sgaXMgdmFsaWQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGxvY2sgaXMgdmFsaWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmFsaWQoKTsKIAogICAgIC8qKgogICAgICAqIFJlbGVhc2VzIHRoaXMgcGFydGljdWxhciBsb2NrIG9uIHRoZSBmaWxlLiBJZiB0aGUgbG9jayBpcyBpbnZhbGlkIHRoZW4KLSAgICAgKiB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LiBPbmNlIHJlbGVhc2VkIHRoZSBsb2NrIGJlY29tZXMgaW52YWxpZC4KKyAgICAgKiB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LiBPbmNlIHJlbGVhc2VkLCB0aGUgbG9jayBiZWNvbWVzIGludmFsaWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQgd2hlbiBhbiBhdHRlbXB0IHRvIHJlbGVhc2UKICAgICAgKiAgICAgICAgICAgICB0aGUgbG9jayBpcyBtYWRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBzb21lIG90aGVyIElPIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIApAQCAtMTk0LDYgKzIwOCw3IEBACiAgICAgICogdG8gYW4gZW5kIHVzZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZGlzcGxheSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNjQpOyAvLyBHdWVzcyBsZW5ndGggb2Ygc3RyaW5nCmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9GaWxlTG9ja0ludGVycnVwdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUxvY2tJbnRlcnJ1cHRpb25FeGNlcHRpb24uamF2YQppbmRleCA0NDI5NWYyLi4wOTIwZjUyIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9GaWxlTG9ja0ludGVycnVwdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTIwLDE4ICsyMCwyMiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogVGhyb3duIHdoZW4gdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvIGFjcXVpcmUgYSBmaWxlIGxvY2suCisgKiBBIHtAY29kZSBGaWxlTG9ja0ludGVycnVwdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gYSB0aHJlYWQgaXMKKyAqIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgdG8gYWNxdWlyZSBhIGZpbGUgbG9jay4KICAqIDxwPgogICogTm90ZSB0aGF0IHRoZSB0aHJlYWQgd2lsbCBhbHNvIGJlIGluIHRoZSAnaW50ZXJydXB0ZWQnIHN0YXRlLgogICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzEwNDA4MDY0MzY1MzUzMjM4M0w7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgRmlsZUxvY2tJbnRlcnJ1cHRpb25FeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlTG9ja0ludGVycnVwdGlvbkV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0dhdGhlcmluZ0J5dGVDaGFubmVsLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9HYXRoZXJpbmdCeXRlQ2hhbm5lbC5qYXZhCmluZGV4IDYyN2FhM2QuLmU4YTZjNzMgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0dhdGhlcmluZ0J5dGVDaGFubmVsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvR2F0aGVyaW5nQnl0ZUNoYW5uZWwuamF2YQpAQCAtMjEsODMgKzIxLDgxIEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHRvIGNoYW5uZWxzIHRoYXQgY2FuIHdyaXRlIGEgc2V0IG9mIGJ1ZmZlcnMgaW4gYSBzaW5nbGUKLSAqIG9wZXJhdGlvbi4KLSAqIDxwPgotICogVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlIGZvciByZWFkcyBpcyBjYWxsZWQKLSAqIDxjb2RlPlNjYXR0ZXJpbmdCeXRlQ2hhbm5lbDwvY29kZT4uCisgKiBUaGUgaW50ZXJmYWNlIGZvciBjaGFubmVscyB0aGF0IGNhbiB3cml0ZSBhIHNldCBvZiBidWZmZXJzIGluIGEgc2luZ2xlCisgKiBvcGVyYXRpb24uIFRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSBmb3IgcmVhZCBvcGVyYXRpb25zIGlzCisgKiB7QGxpbmsgU2NhdHRlcmluZ0J5dGVDaGFubmVsfS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgR2F0aGVyaW5nQnl0ZUNoYW5uZWwgZXh0ZW5kcyBXcml0YWJsZUJ5dGVDaGFubmVsIHsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBieXRlcyBmcm9tIGFsbCB0aGUgZ2l2ZW4gYnVmZmVycyB0byB0aGUgY2hhbm5lbC4KKyAgICAgKiBXcml0ZXMgYnl0ZXMgZnJvbSBhbGwgdGhlIGdpdmVuIGJ1ZmZlcnMgdG8gYSBjaGFubmVsLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiB3cml0ZShidWZmZXJzLCAwLCBidWZmZXJzLmxlbmd0aCk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCisgICAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bzoge0Bjb2RlIHdyaXRlKGJ1ZmZlcnMsIDAsIGJ1ZmZlcnMubGVuZ3RoKTt9CiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWZmZXJzCiAgICAgICogICAgICAgICAgICB0aGUgYnVmZmVycyBjb250YWluaW5nIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCisgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBkdXJpbmcgdGhpcyB3cml0ZQorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgaW50ZXJydXB0IHN0YXRlIG9mIHRoZSBjYWxsaW5nIAorICAgICAqICAgICAgICAgICAgIHRocmVhZCBpcyBzZXQgYW5kIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCi0gICAgICogQHRocm93cyBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBvcGVuLCBidXQgbm90IGluIGEgbW9kZSB0aGF0IHBlcm1pdHMKLSAgICAgKiAgICAgICAgICAgICB3cml0aW5nLgotICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkIGluIGl0cyBJTyBvcGVyYXRpb24gYnkgYW5vdGhlcgotICAgICAqICAgICAgICAgICAgIHRocmVhZCBjbG9zaW5nIHRoZSBjaGFubmVsLgotICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgd3JpdGUgaXMgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0aHJlYWQgc2VuZGluZyBhbgotICAgICAqICAgICAgICAgICAgIGV4cGxpY2l0IGludGVycnVwdC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGxlbmd0aCA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBsZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJzfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc29tZSBvdGhlciB0eXBlIG9mIGV4Y2VwdGlvbiBvY2N1cnMuIERldGFpbHMgYXJlIGluIHRoZQotICAgICAqICAgICAgICAgICAgIG1lc3NhZ2UuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzOyBkZXRhaWxzIGFyZSBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGhhcyBub3QgYmVlbiBvcGVuZWQgaW4gYSBtb2RlIHRoYXQgcGVybWl0cworICAgICAqICAgICAgICAgICAgIHdyaXRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgd3JpdGUoQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN1YnNldCBvZiB0aGUgZ2l2ZW4gYnl0ZXMgZnJvbSB0aGUgYnVmZmVycyB0byB0aGUgY2hhbm5lbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byB3cml0ZSBhbGwgb2YgdGhlIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiBieXRlcwotICAgICAqIGZyb20gPGNvZGU+bGVuZ3RoPC9jb2RlPiBieXRlIGJ1ZmZlcnMsIGluIG9yZGVyLCBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPmJ1ZmZlcnNbb2Zmc2V0XTwvY29kZT4uIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqIDwvcD4KKyAgICAgKiBXcml0ZXMgYnl0ZXMgZnJvbSBhIHN1YnNldCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIGJ1ZmZlcnMgdG8gYQorICAgICAqIGNoYW5uZWwuIFRoZSBzdWJzZXQgaXMgZGVmaW5lZCBieSB7QGNvZGUgb2Zmc2V0fSBhbmQge0Bjb2RlIGxlbmd0aH0sCisgICAgICogaW5kaWNhdGluZyB0aGUgZmlyc3QgYnVmZmVyIGFuZCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gdXNlLgogICAgICAqIDxwPgogICAgICAqIElmIGEgd3JpdGUgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLCBzdWJzZXF1ZW50IHRocmVhZHMgd2lsbCBibG9jayB1bnRpbAotICAgICAqIHRoZSB3cml0ZSBpcyBjb21wbGV0ZWQsIGFuZCB3aWxsIHRoZW4gY29udGVuZCBmb3IgdGhlIGFiaWxpdHkgdG8gd3JpdGUuCisgICAgICogdGhlIHdyaXRlIGlzIGNvbXBsZXRlZCBhbmQgdGhlbiBjb250ZW5kIGZvciB0aGUgYWJpbGl0eSB0byB3cml0ZS4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBieXRlIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgc291cmNlIG9mIHJlbWFpbmluZwotICAgICAqICAgICAgICAgICAgYnl0ZXMgdGhhdCB3aWxsIGJlIGF0dGVtcHRlZCB0byBiZSB3cml0dGVuLgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyB0aGF0IGlzIHRoZSBzb3VyY2UgZm9yIGJ5dGVzIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRvIHRoZSBjaGFubmVsLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnVmZmVyIHRvIHdyaXRlLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBidWZmZXIgaW4ge0Bjb2RlIGJ1ZmZlcnMgfXRvIGdldCBieXRlcworICAgICAqICAgICAgICAgICAgZnJvbS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gd3JpdGUuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gZ2V0IGJ5dGVzIGZyb20uCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCisgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBkdXJpbmcgdGhpcyB3cml0ZQorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgaW50ZXJydXB0IHN0YXRlIG9mIHRoZSBjYWxsaW5nIAorICAgICAqICAgICAgICAgICAgIHRocmVhZCBpcyBzZXQgYW5kIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgb2Zmc2V0IDwgMCBvciA+IGJ1ZmZlcnMubGVuZ3RoOyBvciBsZW5ndGggPCAwIG9yID4KLSAgICAgKiAgICAgICAgICAgICBidWZmZXJzLmxlbmd0aCAtIG9mZnNldC4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0gb3Ige0Bjb2RlIGxlbmd0aCA8IDB9LCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBvZmZzZXQgKyBsZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJzfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzOyBkZXRhaWxzIGFyZSBpbiB0aGUgbWVzc2FnZS4KICAgICAgKiBAdGhyb3dzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIHdhcyBub3Qgb3BlbmVkIGZvciB3cml0aW5nLgotICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHRoZSBjaGFubmVsIGlzIGN1cnJlbnRseSBjbG9zZWQuCi0gICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHRoZSBjaGFubmVsIHdhcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIHdyaXRlIHdhcwotICAgICAqICAgICAgICAgICAgIHVuZGVyd2F5LgotICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgd3JpdGUKLSAgICAgKiAgICAgICAgICAgICB3YXMgdW5kZXJ3YXkuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNvbWUgb3RoZXIgdHlwZSBvZiBleGNlcHRpb24gb2NjdXJzLiBEZXRhaWxzIGFyZSBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHdyaXRlKEJ5dGVCdWZmZXJbXSBidWZmZXJzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbi5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDE4N2MyMWYuLjNlZmQ5NGEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0lsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9JbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uLmphdmEKQEAgLTE4LDE2ICsxOCwyMCBAQAogCiAKIC8qKgotICogVGhyb3duIHdoZW4gd2hlbiBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyBhIHNwZWNpZmljIGJsb2NraW5nIG1vZGUgaXMgaW52b2tlZAotICogb24gYSBjaGFubmVsIHRoYXQgaXMgaW4gYSBkaWZmZXJlbnQgYmxvY2tpbmcgbW9kZS4KKyAqIEFuIHtAY29kZSBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gdGhhdAorICogcmVxdWlyZXMgYSBzcGVjaWZpYyBibG9ja2luZyBtb2RlIGlzIGludm9rZWQgb24gYSBjaGFubmVsIHRoYXQgaXMgaW4gYQorICogZGlmZmVyZW50IGJsb2NraW5nIG1vZGUuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzMzNTc3NDk2MTg1NTU5MDQ3NEw7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9JbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0lsbGVnYWxTZWxlY3RvckV4Y2VwdGlvbi5qYXZhCmluZGV4IDdhNjIzNWYuLjBjZmZkMjIgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0lsbGVnYWxTZWxlY3RvckV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0lsbGVnYWxTZWxlY3RvckV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNyArMTgsMTkgQEAKIAogCiAvKioKLSAqIFRocm93biB3aGVuIGEgY2FsbCBpcyBtYWRlIHRvIHJlZ2lzdGVyIGEgY2hhbm5lbCBvbiBhIHNlbGVjdG9yIHRoYXQgaGFzIGJlZW4KLSAqIGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgcHJvdmlkZXIuCisgKiBBbiB7QGNvZGUgSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhIGNhbGwgaXMgbWFkZSB0byByZWdpc3RlcgorICogYSBjaGFubmVsIG9uIGEgc2VsZWN0b3IgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIGJ5IGEgZGlmZmVyZW50IHByb3ZpZGVyLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIElsbGVnYWxTZWxlY3RvckV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODQwNjMyMzM0NzI1MzMyMDk4N0w7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvSW50ZXJydXB0aWJsZUNoYW5uZWwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL0ludGVycnVwdGlibGVDaGFubmVsLmphdmEKaW5kZXggYzVlMTEwZC4uMDM3NTYxOCAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvSW50ZXJydXB0aWJsZUNoYW5uZWwuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9JbnRlcnJ1cHRpYmxlQ2hhbm5lbC5qYXZhCkBAIC0yMCwzOCArMjAsMzggQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIENoYW5uZWxzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFyZSBib3RoIGFzeW5jaHJvbm91c2x5IGNsb3NhYmxlIGFuZAotICogaW50ZXJydXB0aWJsZS4KKyAqIENoYW5uZWxzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBhc3luY2hyb25vdXNseSBjbG9zZWQgYW5kCisgKiBpbnRlcnJ1cHRlZC4KICAqIDxwPgotICogQSBjaGFubmVsIHRoYXQgaXMgYXN5bmNocm9ub3VzbHkgY2xvc2FibGUgcGVybWl0cyBhIHRocmVhZCBibG9ja2VkIG9uIGFuIElPCi0gKiBvcGVyYXRpb24gKHRoZSBJTyB0aHJlYWQpIHRvIGJlIHJlbGVhc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGNhbGxpbmcgdGhlCi0gKiBjaGFubmVsJ3MgPGNvZGU+Y2xvc2UoKTwvY29kZT4gbWV0aG9kLiBUaGUgSU8gdGhyZWFkIHdpbGwgdGhyb3cgYW4KLSAqIDxjb2RlPkFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uPC9jb2RlPiBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCisgKiBBIGNoYW5uZWwgdGhhdCBjYW4gYmUgYXN5bmNocm9ub3VzbHkgY2xvc2VkIHBlcm1pdHMgdGhhdCBhIHRocmVhZCBibG9ja2VkIG9uCisgKiBhbiBJL08gb3BlcmF0aW9uICh0aGUgSS9PIHRocmVhZCkgY2FuIGJlIHJlbGVhc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGNhbGxpbmcKKyAqIHRoZSBjaGFubmVsJ3Mge0BsaW5rICNjbG9zZSgpfSBtZXRob2QuIFRoZSBJL08gdGhyZWFkIHdpbGwgdGhyb3cgYW4KKyAqIHtAbGluayBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbn0gYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUgY2xvc2VkLgogICogPC9wPgogICogPHA+Ci0gKiBBIGNoYW5uZWwgdGhhdCBpcyBpbnRlcnJ1cHRpYmxlIHBlcm1pdHMgYSB0aHJlYWQgYmxvY2tlZCBvbiBhbiBJTyBvcGVyYXRpb24KLSAqICh0aGUgSU8gdGhyZWFkKSB0byBiZSBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRocmVhZCAoYnkgaW52b2tpbmcKLSAqIDxjb2RlPmludGVycnVwdCgpPC9jb2RlPiBvbiB0aGUgSU8gdGhyZWFkKS4gV2hlbiB0aGUgSU8gdGhyZWFkIGlzCi0gKiBpbnRlcnJ1cHRlZCBpdCB3aWxsIHRocm93IGEgPGNvZGU+Q2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb248L2NvZGU+Ci0gKiBleGNlcHRpb24sIGl0IHdpbGwgaGF2ZSBpdHMgaW50ZXJydXB0ZWQgc3RhdHVzIHNldCwgYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUKLSAqIGNsb3NlZC4gSWYgdGhlIElPIHRocmVhZCBhdHRlbXB0cyB0byBtYWtlIGFuIElPIGNhbGwgd2l0aCB0aGUgaW50ZXJydXB0Ci0gKiBzdGF0dXMgc2V0IHRoZSBjYWxsIHdpbGwgaW1tZWRpYXRlbHkgZmFpbCB3aXRoIGEKLSAqIDxjb2RlPkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uPC9jb2RlPi4KKyAqIEEgY2hhbm5lbCB0aGF0IGlzIGludGVycnVwdGlibGUgcGVybWl0cyBhIHRocmVhZCBibG9ja2VkIG9uIGFuIEkvTyBvcGVyYXRpb24KKyAqICh0aGUgSS9PIHRocmVhZCkgdG8gYmUgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0aHJlYWQgKGJ5IGludm9raW5nCisgKiB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCgpfSBvbiB0aGUgSS9PIHRocmVhZCkuIFdoZW4gdGhlIEkvTyB0aHJlYWQgaXMKKyAqIGludGVycnVwdGVkIGl0IHdpbGwgdGhyb3cgYSB7QGxpbmsgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb259LCBpdCB3aWxsIGhhdmUKKyAqIGl0cyBpbnRlcnJ1cHRlZCBzdGF0dXMgc2V0IGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4gSWYgdGhlIEkvTyB0aHJlYWQKKyAqIGF0dGVtcHRzIHRvIG1ha2UgYW4gSS9PIGNhbGwgd2l0aCB0aGUgaW50ZXJydXB0IHN0YXR1cyBzZXQgdGhlIGNhbGwgd2lsbAorICogaW1tZWRpYXRlbHkgZmFpbCB3aXRoIGEge0BsaW5rIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9ufS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW50ZXJydXB0aWJsZUNoYW5uZWwgZXh0ZW5kcyBDaGFubmVsIHsKIAogICAgIC8qKgotICAgICAqIENsb3NlcyBhbiBJbnRlcnJ1cHRpYmxlQ2hhbm5lbC4gVGhpcyBtZXRob2QgaXMgcHJlY2lzZWx5IHRoZSBzYW1lIGFzIHRoZQotICAgICAqIHN1cGVyLWludGVyZmFjZSA8Y29kZT5jbG9zZSgpPC9jb2RlPi4KKyAgICAgKiBDbG9zZXMgdGhlIGNoYW5uZWwuCiAgICAgICogPHA+Ci0gICAgICogQW55IHRocmVhZHMgdGhhdCBhcmUgYmxvY2tlZCBvbiBJTyBvcGVyYXRpb25zIG9uIHRoaXMgY2hhbm5lbCB3aWxsIGJlCi0gICAgICogaW50ZXJydXB0ZWQgd2l0aCBhbiA8Y29kZT5Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqIDwvY29kZT4uCisgICAgICogQW55IHRocmVhZHMgdGhhdCBhcmUgYmxvY2tlZCBvbiBJL08gb3BlcmF0aW9ucyBvbiB0aGlzIGNoYW5uZWwgd2lsbCBiZQorICAgICAqIGludGVycnVwdGVkIHdpdGggYW4ge0BsaW5rIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9ufS4gT3RoZXJ3aXNlLCB0aGlzCisgICAgICogbWV0aG9kIGJlaGF2ZXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiB0aGUge0Bjb2RlIENoYW5uZWx9IGludGVyZmFjZS4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIElPIHByb2JsZW0gb2NjdXJzIGNsb3NpbmcgdGhlIGNoYW5uZWwuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoZSBjaGFubmVsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uLmphdmEKaW5kZXggN2UxOTc5Ny4uMzQzNGI4NyAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvTm9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb24uamF2YQpAQCAtMTgsMTcgKzE4LDIyIEBACiAKIAogLyoqCi0gKiBUaHJvd24gaWYgU29ja2V0Q2hhbm5lbCdzIGZpbmlzaENvbm5lY3QgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlCi0gKiBTb2NrZXRDaGFubmVsJ3MgY29ubmVjdCBtZXRob2QgY29tcGxldGVkIHdpdGhvdXQgZXJyb3IuCisgKiBBIHtAY29kZSBOb0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9ufSBpcyB0aHJvd24gaWYge0Bjb2RlIFNvY2tldENoYW5uZWx9J3MKKyAqIHtAbGluayBTb2NrZXRDaGFubmVsI2ZpbmlzaENvbm5lY3QoKSBmaW5pc2hDb25uZWN0fSBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZQorICogdGhlIHtAY29kZSBTb2NrZXRDaGFubmVsfSdzCisgKiB7QGxpbmsgU29ja2V0Q2hhbm5lbCNjb25uZWN0KFNvY2tldEFkZHJlc3MpIGNvbm5lY3R9IG1ldGhvZCBjb21wbGV0ZWQgd2l0aG91dAorICogZXJyb3IuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTm9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODI5NjU2MTE4MzYzMzEzNDc0M0w7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgTm9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbn0uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5vQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDZkYzMxOGUuLmM0MzY2ODIgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNSArMTgsMTkgQEAKIAogCiAvKioKLSAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIGEgY2hhbm5lbCB0aGF0IGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLgorICogQSB7QGNvZGUgTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbQorICogYSBjaGFubmVsIHRoYXQgaXMgbm90IG9wZW4gZm9yIHJlYWRpbmcuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMjAwOTE1Njc5Mjk0OTkzNTE0TDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDQ2NmY1MGEuLjgxNTQ5Y2IgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNSArMTgsMTkgQEAKIAogCiAvKioKLSAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gYSBjaGFubmVsIHRoYXQgaXMgbm90IG9wZW4gZm9yIHdyaXRpbmcuCisgKiBBIHtAY29kZSBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gYQorICogY2hhbm5lbCB0aGF0IGlzIG5vdCBvcGVuIGZvciB3cml0aW5nLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzA3MTIzMDQ4ODI3OTAxMTYyMUw7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSB7QGNvZGUgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvTm90WWV0Qm91bmRFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL05vdFlldEJvdW5kRXhjZXB0aW9uLmphdmEKaW5kZXggYTQxMzU0YS4uMjIxMDkwMyAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvTm90WWV0Qm91bmRFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob3RZZXRCb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNyArMTgsMTkgQEAKIAogCiAvKioKLSAqIFRocm93biBpZiB0aGUgc2VydmVyIHNvY2tldCBjaGFubmVsIGlzIG5vdCBib3VuZCBiZWZvcmUgYW4gSU8gb3BlcmF0aW9uIGlzCi0gKiBtYWRlLgorICogQSB7QGNvZGUgTm90WWV0Qm91bmRFeGNlcHRpb259IGlzIHRocm93biBpZiB0aGUgc2VydmVyIHNvY2tldCBjaGFubmVsIGlzIG5vdAorICogYm91bmQgYmVmb3JlIGFuIEkvTyBvcGVyYXRpb24gaXMgbWFkZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOb3RZZXRCb3VuZEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NjQwOTk5MzAzOTUwMjAyMjQyTDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBOb3RZZXRCb3VuZEV4Y2VwdGlvbn0uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5vdFlldEJvdW5kRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob3RZZXRDb25uZWN0ZWRFeGNlcHRpb24uamF2YQppbmRleCAwNmU3M2U1Li4zOTNjNzdmIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob3RZZXRDb25uZWN0ZWRFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Ob3RZZXRDb25uZWN0ZWRFeGNlcHRpb24uamF2YQpAQCAtMTgsMTcgKzE4LDE5IEBACiAKIAogLyoqCi0gKiBUaHJvd24gaWYgdGhlIHNvY2tldCBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgYmVmb3JlIGFuIElPIG9wZXJhdGlvbiBpcwotICogaW52b2tlZC4KKyAqIEEge0Bjb2RlIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbn0gaXMgdGhyb3duIGlmIHRoZSBzb2NrZXQgY2hhbm5lbCBpcyBub3QKKyAqIGNvbm5lY3RlZCBiZWZvcmUgYW4gSS9PIG9wZXJhdGlvbiBpcyBpbnZva2VkLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0Njk3MzE2NTUxOTA5NTEzNDY0TDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb259LgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9PdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9PdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uLmphdmEKaW5kZXggMTZhOTY0NS4uNmEwMGE2YiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL092ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24uamF2YQpAQCAtMTgsMTYgKzE4LDE5IEBACiAKIAogLyoqCi0gKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgYSBsb2NrIHRoYXQgb3ZlcmxhcHMgYW4gZXhpc3Rpbmcgb3IgcGVuZGluZwotICogbG9jayBoZWxkIGJ5IHRoaXMgcHJvY2Vzcy4KKyAqIEFuIHtAY29kZSBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGFjcXVpcmUKKyAqIGEgbG9jayB0aGF0IG92ZXJsYXBzIGFuIGV4aXN0aW5nIG9yIHBlbmRpbmcgbG9jayBoZWxkIGJ5IHRoaXMgcHJvY2Vzcy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIwNDc4MTIxMzgxNjMwNjg0MzNMOwogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEge0Bjb2RlIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvUGlwZS5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvUGlwZS5qYXZhCmluZGV4IGIwYzQ0ZjQuLmUyODgxMmMgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1BpcGUuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9QaXBlLmphdmEKQEAgLTIxLDMzICsyMSwzNyBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwogCiAvKioKLSAqIEEgcGlwZSBjb250YWlucyB0d28gY2hhbm5lbHMuIE9uZSBpcyB0aGUgd3JpdGFibGUgc2luayBjaGFubmVsIGFuZCB0aGUgb3RoZXIgaXMKLSAqIHJlYWRhYmxlIHNvdXJjZSBjaGFubmVsLiBXaGVuIGJ5dGVzIGFyZSB3cml0dGVuIGludG8gdGhlIHdyaXRhYmxlIGNoYW5uZWwgdGhleQotICogY2FuIGJlIHJlYWQgZnJvbSByZWFkYWJsZSBjaGFubmVsLiBUaGUgb3JkZXIgb2YgdGhlc2UgYnl0ZXMgcmVtYWlucyB1bmNoYW5nZWQuIAotICogCisgKiBBIHBpcGUgY29udGFpbnMgdHdvIGNoYW5uZWxzLiBPbmUgaXMgdGhlIHdyaXRhYmxlIHNpbmsgY2hhbm5lbCBhbmQgdGhlIG90aGVyCisgKiBpcyB0aGUgcmVhZGFibGUgc291cmNlIGNoYW5uZWwuIFdoZW4gYnl0ZXMgYXJlIHdyaXR0ZW4gaW50byB0aGUgd3JpdGFibGUKKyAqIGNoYW5uZWwgdGhleSBjYW4gYmUgcmVhZCBmcm9tIHRoZSByZWFkYWJsZSBjaGFubmVsLiBUaGUgb3JkZXIgb2YgdGhlc2UgYnl0ZXMKKyAqIHJlbWFpbnMgdW5jaGFuZ2VkLgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQaXBlIHsKIAogICAgIC8qKgotICAgICAqIFdyaXRhYmxlIHNpbmsgY2hhbm5lbCBmb3Igd3JpdGluZyBpbnRvLgorICAgICAqIFdyaXRhYmxlIHNpbmsgY2hhbm5lbCB1c2VkIHRvIHdyaXRlIHRvIGEgcGlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNpbmtDaGFubmVsIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbAogICAgICAgICAgICAgaW1wbGVtZW50cyBXcml0YWJsZUJ5dGVDaGFubmVsLCBHYXRoZXJpbmdCeXRlQ2hhbm5lbCB7CiAgICAgICAgIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIENvbnN0cnVjdG9yLgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTaW5rQ2hhbm5lbH0uCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIKLSAgICAgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgdGhlIGNoYW5uZWwKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgdGhlIGNoYW5uZWwuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIFNpbmtDaGFubmVsKFNlbGVjdG9yUHJvdmlkZXIgcHJvdmlkZXIpIHsKICAgICAgICAgICAgIHN1cGVyKHByb3ZpZGVyKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgdGhpcyBjaGFubmVsIHN1cHBvcnRzIG9ubHkgd3JpdGluZy4KKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhpcyBjaGFubmVsIG9ubHkgc3VwcG9ydHMgd3JpdGluZy4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gYSBzdGF0aWMgdmFsdWUgb2YgT1BfV1JJVEUKKyAgICAgICAgICogQHJldHVybiBhIHN0YXRpYyB2YWx1ZSBvZiBPUF9XUklURS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgaW50IHZhbGlkT3BzKCkgewogICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbktleS5PUF9XUklURTsKQEAgLTU1LDI2ICs1OSwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRhYmxlIHNvdXJjZSBjaGFubmVsIGZvciByZWFkaW5nIGZyb20uCisgICAgICogUmVhZGFibGUgc291cmNlIGNoYW5uZWwgdXNlZCB0byByZWFkIGZyb20gYSBwaXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU291cmNlQ2hhbm5lbCBleHRlbmRzCiAgICAgICAgICAgICBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsIGltcGxlbWVudHMgUmVhZGFibGVCeXRlQ2hhbm5lbCwKICAgICAgICAgICAgIFNjYXR0ZXJpbmdCeXRlQ2hhbm5lbCB7CiAgICAgICAgIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIENvbnN0cnVjdG9yLgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTb3VyY2VDaGFubmVsfS4KICAgICAgICAgICogCiAgICAgICAgICAqIEBwYXJhbSBwcm92aWRlcgotICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciBvZiB0aGUgY2hhbm5lbAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciBvZiB0aGUgY2hhbm5lbC4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgU291cmNlQ2hhbm5lbChTZWxlY3RvclByb3ZpZGVyIHByb3ZpZGVyKSB7CiAgICAgICAgICAgICBzdXBlcihwcm92aWRlcik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5kaWNhdGVzIHRoaXMgY2hhbm5lbCBzdXBwb3J0cyBvbmx5IHJlYWRpbmcuCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoaXMgY2hhbm5lbCBvbmx5IHN1cHBvcnRzIHJlYWRpbmcuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIGEgc3RhdGljIHZhbHVlIG9mIE9QX1JFQUQKKyAgICAgICAgICogQHJldHVybiBhIHN0YXRpYyB2YWx1ZSBvZiBPUF9SRUFELgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsaWRPcHMoKSB7CiAgICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uS2V5Lk9QX1JFQUQ7CkBAIC04NSwxNyArOTIsMjAgQEAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplcyBhIHBpcGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBwaXBlCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBwaXBlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFBpcGUgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblBpcGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgcHJvdGVjdGVkIGNvbnN0cnVjdG9yLgorICAgICAqIFRoZSBwcm90ZWN0ZWQgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUGlwZSgpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTEwNCwxNCArMTE0LDE2IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc2luayBjaGFubmVsIG9mIHRoZSBwaXBlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB3cml0YWJsZSBzaW5rIGNoYW5uZWwgb2YgdGhlIHBpcGUKKyAgICAgKiBAcmV0dXJuIGEgd3JpdGFibGUgc2luayBjaGFubmVsIG9mIHRoZSBwaXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaW5rQ2hhbm5lbCBzaW5rKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgY2hhbm5lbCBvZiB0aGUgcGlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcmVhZGFibGUgc291cmNlIGNoYW5uZWwgb2YgdGhlIHBpcGUKKyAgICAgKiBAcmV0dXJuIGEgcmVhZGFibGUgc291cmNlIGNoYW5uZWwgb2YgdGhlIHBpcGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNvdXJjZUNoYW5uZWwgc291cmNlKCk7CiAKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1JlYWRhYmxlQnl0ZUNoYW5uZWwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1JlYWRhYmxlQnl0ZUNoYW5uZWwuamF2YQppbmRleCBmMzRlNzAyLi45YmUxYTcyIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9SZWFkYWJsZUJ5dGVDaGFubmVsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvUmVhZGFibGVCeXRlQ2hhbm5lbC5qYXZhCkBAIC0yMSwxMiArMjEsMTYgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiAvKioKLSAqIEEgUmVhZGFibGVCeXRlQ2hhbm5lbCBpcyBhIHR5cGUgb2YgQ2hhbm5lbCB0aGF0IGNhbiByZWFkIGJ5dGVzLgorICogQSB7QGNvZGUgUmVhZGFibGVCeXRlQ2hhbm5lbH0gaXMgYSB0eXBlIG9mIHtAbGluayBDaGFubmVsfSB0aGF0IGNhbiByZWFkCisgKiBieXRlcy4KICAqIDxwPgotICogUmVhZHMgYXJlIHN5bmNocm9ub3VzIG9uIGEgUmVhZGFibGVCeXRlQ2hhbm5lbCwgdGhhdCBpcywgaWYgYSByZWFkIGlzIGFscmVhZHkKLSAqIGluIHByb2dyZXNzIG9uIHRoZSBjaGFubmVsIHRoZW4gc3Vic2VxdWVudCByZWFkcyB3aWxsIGJsb2NrIHVudGlsIHRoZSBmaXJzdAotICogcmVhZCBjb21wbGV0ZXMuIEl0IGlzIHVuZGVmaW5lZCB3aGV0aGVyIG5vbi1yZWFkIG9wZXJhdGlvbnMgd2lsbCBibG9jay4KKyAqIFJlYWQgb3BlcmF0aW9ucyBhcmUgc3luY2hyb25vdXMgb24gYSB7QGNvZGUgUmVhZGFibGVCeXRlQ2hhbm5lbH0sIHRoYXQgaXMsCisgKiBpZiBhIHJlYWQgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyBvbiB0aGUgY2hhbm5lbCB0aGVuIHN1YnNlcXVlbnQgcmVhZHMgd2lsbAorICogYmxvY2sgdW50aWwgdGhlIGZpcnN0IHJlYWQgY29tcGxldGVzLiBJdCBpcyB1bmRlZmluZWQgd2hldGhlciBub24tcmVhZAorICogb3BlcmF0aW9ucyB3aWxsIGJsb2NrLgorICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSZWFkYWJsZUJ5dGVDaGFubmVsIGV4dGVuZHMgQ2hhbm5lbCB7CiAKQEAgLTM0LDM0ICszOCwzNyBAQAogICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNoYW5uZWwgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgogICAgICAqIDxwPgogICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHdpbGwgYmUgcmVhZCBpcyB0aGUKLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgd2hlbiB0aGUgbWV0aG9kCi0gICAgICogaW52b2tlZC4gVGhlIGJ5dGVzIHdpbGwgYmUgcmVhZCBpbnRvIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgdGhlIGJ1ZmZlcidzCi0gICAgICogPGNvZGU+cG9zaXRpb248L2NvZGU+LgorICAgICAqIHtAbGluayBqYXZhLm5pby5CdWZmZXIjcmVtYWluaW5nKCkgcmVtYWluaW5nfSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICAgICogYnVmZmVyIHdoZW4gdGhlIG1ldGhvZCBpcyBpbnZva2VkLiBUaGUgYnl0ZXMgd2lsbCBiZSByZWFkIGludG8gdGhlIGJ1ZmZlcgorICAgICAqIHN0YXJ0aW5nIGF0IHRoZSBidWZmZXIncyBjdXJyZW50CisgICAgICoge0BsaW5rIGphdmEubmlvLkJ1ZmZlciNwb3NpdGlvbigpIHBvc2l0aW9ufS4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhlIGNhbGwgbWF5IGJsb2NrIGlmIG90aGVyIHRocmVhZHMgYXJlIGFsc28gYXR0ZW1wdGluZyB0byByZWFkIG9uIHRoZQorICAgICAqIFRoZSBjYWxsIG1heSBibG9jayBpZiBvdGhlciB0aHJlYWRzIGFyZSBhbHNvIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZQogICAgICAqIHNhbWUgY2hhbm5lbC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVXBvbiBjb21wbGV0aW9uLCB0aGUgYnVmZmVyJ3MgPGNvZGU+cG9zaXRpb24oKTwvY29kZT4gaXMgdXBkYXRlZCB0byB0aGUKLSAgICAgKiBlbmQgb2YgdGhlIGJ5dGVzIHRoYXQgd2VyZSByZWFkLiBUaGUgYnVmZmVyJ3MgPGNvZGU+bGltaXQoKTwvY29kZT4gaXMKLSAgICAgKiB1bm1vZGlmaWVkLgorICAgICAqIFVwb24gY29tcGxldGlvbiwgdGhlIGJ1ZmZlcidzIHtAY29kZSBwb3NpdGlvbn0gaXMgdXBkYXRlZCB0byB0aGUgZW5kIG9mCisgICAgICogdGhlIGJ5dGVzIHRoYXQgd2VyZSByZWFkLiBUaGUgYnVmZmVyJ3MKKyAgICAgKiB7QGxpbmsgamF2YS5uaW8uQnVmZmVyI2xpbWl0KCkgbGltaXR9IGlzIG5vdCBjaGFuZ2VkLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVyCiAgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgYnl0ZXMuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCi0gICAgICogQHRocm93cyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCB3YXMgbm90IG9wZW5lZCBmb3IgcmVhZGluZy4KLSAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCB3YXMgYWxyZWFkeSBjbG9zZWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGNsb3NlcyB0aGUgY2hhbm5lbCBkdXJpbmcgdGhlIHJlYWQuCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdCB0aGUgY2FsbGluZyB0aHJlYWQgZHVyaW5nIHRoZQotICAgICAqICAgICAgICAgICAgIHJlYWQuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgaW50ZXJydXB0IHN0YXRlIG9mIHRoZSBjYWxsaW5nIAorICAgICAqICAgICAgICAgICAgIHRocmVhZCBpcyBzZXQgYW5kIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGFub3RoZXIgSU8gZXhjZXB0aW9uIG9jY3VycywgZGV0YWlscyBhcmUgaW4gdGhlIG1lc3NhZ2UuCisgICAgICogICAgICAgICAgICAgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLCBkZXRhaWxzIGFyZSBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIHdhcyBub3Qgb3BlbmVkIGZvciByZWFkaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvU2NhdHRlcmluZ0J5dGVDaGFubmVsLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TY2F0dGVyaW5nQnl0ZUNoYW5uZWwuamF2YQppbmRleCA0MWZiNzJmLi4yZTY1NGRiIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TY2F0dGVyaW5nQnl0ZUNoYW5uZWwuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TY2F0dGVyaW5nQnl0ZUNoYW5uZWwuamF2YQpAQCAtMjEsODIgKzIxLDc5IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHRvIGNoYW5uZWxzIHRoYXQgY2FuIHJlYWQgYSBzZXQgb2YgYnVmZmVycyBpbiBhIHNpbmdsZQotICogb3BlcmF0aW9uLgotICogPHA+Ci0gKiBUaGUgY29ycmVzcG9uZGluZyBpbnRlcmZhY2UgZm9yIHdyaXRlcyBpcyBjYWxsZWQKLSAqIDxjb2RlPkdhdGhlcmluZ0J5dGVDaGFubmVsPC9jb2RlPi4KKyAqIFRoZSBpbnRlcmZhY2UgZm9yIGNoYW5uZWxzIHRoYXQgY2FuIHJlYWQgZGF0YSBpbnRvIGEgc2V0IG9mIGJ1ZmZlcnMgaW4gYQorICogc2luZ2xlIG9wZXJhdGlvbi4gVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlIGZvciB3cml0ZXMgaXMKKyAqIHtAbGluayBHYXRoZXJpbmdCeXRlQ2hhbm5lbH0uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFNjYXR0ZXJpbmdCeXRlQ2hhbm5lbCBleHRlbmRzIFJlYWRhYmxlQnl0ZUNoYW5uZWwgewogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY2hhbm5lbCBpbnRvIGFsbCB0aGUgZ2l2ZW4gYnVmZmVycy4KKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoaXMgY2hhbm5lbCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgYnVmZmVycy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvOgotICAgICAqIAotICAgICAqIDxwcmU+Ci0gICAgICogcmVhZChidWZmZXJzLCAwLCBidWZmZXJzLmxlbmd0aCk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCisgICAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byB7QGNvZGUgcmVhZChidWZmZXJzLCAwLCBidWZmZXJzLmxlbmd0aCk7fQogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVycwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyB0byByZWNlaXZlIHRoZSBieXRlcyBiZWluZyByZWFkLgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyB0byBzdG9yZSB0aGUgYnl0ZXMgYmVpbmcgcmVhZC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KKyAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGR1cmluZyB0aGlzIHJlYWQKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGludGVycnVwdCBzdGF0ZSBvZiB0aGUgY2FsbGluZyAKKyAgICAgKiAgICAgICAgICAgICB0aHJlYWQgaXMgc2V0IGFuZCB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLgotICAgICAqIEB0aHJvd3MgTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgb3BlbiwgYnV0IG5vdCBpbiBhIG1vZGUgdGhhdCBwZXJtaXRzCi0gICAgICogICAgICAgICAgICAgcmVhZGluZy4KLSAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBpbiBpdHMgSU8gb3BlcmF0aW9uIGJ5IGFub3RoZXIKLSAgICAgKiAgICAgICAgICAgICB0aHJlYWQgY2xvc2luZyB0aGUgY2hhbm5lbC4KLSAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHJlYWQgaXMgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0aHJlYWQgc2VuZGluZyBhbgotICAgICAqICAgICAgICAgICAgIGV4cGxpY2l0IGludGVycnVwdC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc29tZSBvdGhlciB0eXBlIG9mIGV4Y2VwdGlvbiBvY2N1cnMuIERldGFpbHMgYXJlIGluIHRoZQotICAgICAqICAgICAgICAgICAgIG1lc3NhZ2UuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzOyBkZXRhaWxzIGFyZSBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGhhcyBub3QgYmVlbiBvcGVuZWQgaW4gYSBtb2RlIHRoYXQgcGVybWl0cworICAgICAqICAgICAgICAgICAgIHJlYWRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgcmVhZChCeXRlQnVmZmVyW10gYnVmZmVycykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY2hhbm5lbCBpbnRvIGEgc3Vic2V0IG9mIHRoZSBnaXZlbiBidWZmZXJzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIHJlYWQgYWxsIG9mIHRoZSA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gYnl0ZXMKLSAgICAgKiBmcm9tIDxjb2RlPmxlbmd0aDwvY29kZT4gYnl0ZSBidWZmZXJzLCBpbiBvcmRlciwgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5idWZmZXJzW29mZnNldF08L2NvZGU+LiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKiA8L3A+CisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIGNoYW5uZWwgYW5kIHN0b3JlcyB0aGVtIGluIGEgc3Vic2V0IG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBhcnJheSBvZiBidWZmZXJzLiBUaGUgc3Vic2V0IGlzIGRlZmluZWQgYnkge0Bjb2RlIG9mZnNldH0gYW5kCisgICAgICoge0Bjb2RlIGxlbmd0aH0sIGluZGljYXRpbmcgdGhlIGZpcnN0IGJ1ZmZlciBhbmQgdGhlIG51bWJlciBvZiBidWZmZXJzIHRvCisgICAgICogdXNlLiBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byByZWFkIGFzIG1hbnkgYnl0ZXMgYXMgY2FuIGJlIHN0b3JlZCBpbiB0aGUKKyAgICAgKiBidWZmZXIgc3Vic2V0IGZyb20gdGhlIGNoYW5uZWwgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseQorICAgICAqIHJlYWQuCiAgICAgICogPHA+CiAgICAgICogSWYgYSByZWFkIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywgc3Vic2VxdWVudCB0aHJlYWRzIHdpbGwgYmxvY2sgdW50aWwKLSAgICAgKiB0aGUgcmVhZCBpcyBjb21wbGV0ZWQsIGFuZCB3aWxsIHRoZW4gY29udGVuZCBmb3IgdGhlIGFiaWxpdHkgdG8gcmVhZC4KKyAgICAgKiB0aGUgcmVhZCBpcyBjb21wbGV0ZWQgYW5kIHdpbGwgdGhlbiBjb250ZW5kIGZvciB0aGUgYWJpbGl0eSB0byByZWFkLgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmZmVycwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIHJlYWQuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgYnl0ZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnVmZmVyIHRvIHJlYWQuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ1ZmZlciB0byBzdG9yZSBieXRlcyBpbi4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyB0byByZWFkLgorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc3RvcmUgYnl0ZXMgaW4uCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgb2Zmc2V0IDwgMCBvciA+IGJ1ZmZlcnMubGVuZ3RoOyBvciBsZW5ndGggPCAwIG9yID4KLSAgICAgKiAgICAgICAgICAgICBidWZmZXJzLmxlbmd0aCAtIG9mZnNldC4KLSAgICAgKiBAdGhyb3dzIE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIHdhcyBub3Qgb3BlbmVkIGZvciByZWFkaW5nLgotICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHRoZSBjaGFubmVsIGlzIGN1cnJlbnRseSBjbG9zZWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHRoZSBjaGFubmVsIHdhcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIHdyaXRlIHdhcwotICAgICAqICAgICAgICAgICAgIHVuZGVyd2F5LgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBkdXJpbmcgdGhpcyByZWFkCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgd3JpdGUKLSAgICAgKiAgICAgICAgICAgICB3YXMgdW5kZXJ3YXkuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgaW50ZXJydXB0IHN0YXRlIG9mIHRoZSBjYWxsaW5nIAorICAgICAqICAgICAgICAgICAgIHRocmVhZCBpcyBzZXQgYW5kIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYnVmZmVyc30uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNvbWUgb3RoZXIgdHlwZSBvZiBleGNlcHRpb24gb2NjdXJzLiBEZXRhaWxzIGFyZSBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICBtZXNzYWdlLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3VyczsgZGV0YWlscyBhcmUgaW4gdGhlIG1lc3NhZ2UuCisgICAgICogQHRocm93cyBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBoYXMgbm90IGJlZW4gb3BlbmVkIGluIGEgbW9kZSB0aGF0IHBlcm1pdHMKKyAgICAgKiAgICAgICAgICAgICByZWFkaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHJlYWQoQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TZWxlY3RhYmxlQ2hhbm5lbC5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0YWJsZUNoYW5uZWwuamF2YQppbmRleCA3NzA3YzI5Li5kZWQ2NmU2IDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TZWxlY3RhYmxlQ2hhbm5lbC5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGFibGVDaGFubmVsLmphdmEKQEAgLTIyLDk1ICsyMiwxMzYgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKIAogLyoqCi0gKiBBIGNoYW5uZWwgdGhhdCBjYW4gYmUgZGV0ZWN0ZWQgYnkgYSBzZWxlY3Rvci4gVGhlIGNoYW5uZWwgY2FuIGJlIHJlZ2lzdGVyZWQKLSAqIHdpdGggc29tZSBzZWxlY3RvcnMsIGFuZCB3aGVuIGludm9rZSBzZWxlY3QgbWV0aG9kIG9mIHRoZSBzZWxlY3RvcnMsIHRoZQotICogY2hhbm5lbCBjYW4gYmUgY2hlY2tlZCBpZiBpdCBpcyByZWFkYWJsZSwgd3JpdGFibGUsIGNvbm5lY3RhYmxlIG9yCi0gKiBhY2NlcHRhYmxlIGFjY29yZGluZyB0byBpdHMgaW50ZXJlc3Rpbmcgb3BlcmF0aW9uLgotICogCisgKiBBIGNoYW5uZWwgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGEge0BsaW5rIFNlbGVjdG9yfS4gVGhlIGNoYW5uZWwgbXVzdCBiZQorICogcmVnaXN0ZXJlZCB3aXRoIGEgc2VsZWN0b3IgYnkgY2FsbGluZyBvbmUgb2YgdGhlIHtAY29kZSByZWdpc3Rlcn0gbWV0aG9kcywKKyAqIHdoaWNoIHJldHVybiBhIHtAbGluayBTZWxlY3Rpb25LZXl9IG9iamVjdC4gSW4gb3JkZXIgdG8gZGVyZWdpc3RlciBhIGNoYW5uZWwKKyAqIGZyb20gYSBzZWxlY3RvciwgaXRzIHNlbGVjdGlvbiBrZXkgbXVzdCBiZSBjYW5jZWxlZC4gVGhpcyBjYW4gYmUgZG9uZQorICogZXhwbGljaXRseSBieSBjYWxsaW5nIHRoZSB7QGxpbmsgU2VsZWN0aW9uS2V5I2NhbmNlbCgpfSBtZXRob2QgYnV0IGl0IGlzIGFsc28KKyAqIGRvbmUgaW1wbGljaXRseSB3aGVuIHRoZSBjaGFubmVsIG9yIHRoZSBzZWxlY3RvciBpcyBjbG9zZWQuCisgKiA8cD4KKyAqIEEgY2hhbm5lbCBtYXkgYmUgcmVnaXN0ZXJlZCB3aXRoIHNldmVyYWwgc2VsZWN0b3JzIGF0IHRoZSBzYW1lIHRpbWUgYnV0IG9ubHkKKyAqIG9uY2UgZm9yIGFueSBnaXZlbiBzZWxlY3Rvci4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0YWJsZUNoYW5uZWwgZXh0ZW5kcyBBYnN0cmFjdEludGVycnVwdGlibGVDaGFubmVsCiAgICAgICAgIGltcGxlbWVudHMgQ2hhbm5lbCB7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBjYW4gYmUgb3ZlcnJpZGRlbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTZWxlY3RhYmxlQ2hhbm5lbH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNlbGVjdGFibGVDaGFubmVsKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJsb2NraW5nIGxvY2sgd2hpY2ggc3luY2hyb25pemVzIHRoZSBjb25maWd1cmVCbG9ja2luZyBhbmQKLSAgICAgKiByZWdpc3RlciBtZXRob2RzLgorICAgICAqIEdldHMgdGhlIGJsb2NraW5nIGxvY2sgd2hpY2ggc3luY2hyb25pemVzIHRoZSB7QGNvZGUgY29uZmlndXJlQmxvY2tpbmd9CisgICAgICogYW5kIHtAY29kZSByZWdpc3Rlcn0gbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBibG9ja2luZyBvYmplY3QgYXMgbG9jaworICAgICAqIEByZXR1cm4gdGhlIGJsb2NraW5nIG9iamVjdCBhcyBsb2NrLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgYmxvY2tpbmdMb2NrKCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGJsb2NraW5nIG1vZGUgb2YgdGhlIGNoYW5uZWwuCisgICAgICogU2V0cyB0aGUgYmxvY2tpbmcgbW9kZSBvZiB0aGlzIGNoYW5uZWwuIEEgY2FsbCB0byB0aGlzIG1ldGhvZCBibG9ja3MgaWYKKyAgICAgKiBvdGhlciBjYWxscyB0byB0aGlzIG1ldGhvZCBvciB0byBhIHtAY29kZSByZWdpc3Rlcn0gbWV0aG9kIGFyZSBleGVjdXRpbmcuCisgICAgICogVGhlIG5ldyBibG9ja2luZyBtb2RlIGlzIHZhbGlkIGZvciBjYWxscyB0byBvdGhlciBtZXRob2RzIHRoYXQgYXJlCisgICAgICogaW52b2tlZCBhZnRlciB0aGUgY2FsbCB0byB0aGlzIG1ldGhvZC4gSWYgb3RoZXIgbWV0aG9kcyBhcmUgYWxyZWFkeQorICAgICAqIGV4ZWN1dGluZyB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhleSBzdGlsbCBoYXZlIHRoZSBvbGQgbW9kZSBhbmQKKyAgICAgKiB0aGUgY2FsbCB0byB0aGlzIG1ldGhvZCBtaWdodCBibG9jayBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBibG9jawotICAgICAqICAgICAgICAgICAgdHJ1ZSBhcyBibG9ja2luZywgZmFsc2UgYXMgbm9uLWJsb2NraW5nCi0gICAgICogQHJldHVybiB0aGlzIGNoYW5uZWwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBmb3Igc2V0dGluZyB0aGlzIGNoYW5uZWwncyBtb2RlIHRvIGJsb2NraW5nLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSB0byBzZXQgaXQgdG8gbm9uLWJsb2NraW5nLgorICAgICAqIEByZXR1cm4gdGhpcyBjaGFubmVsLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoaXMgY2hhbm5lbCBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYmxvY2t9IGlzIHtAY29kZSB0cnVlfSBhbmQgdGhpcyBjaGFubmVsIGhhcyBiZWVuCisgICAgICogICAgICAgICAgICAgcmVnaXN0ZXJlZCB3aXRoIGF0IGxlYXN0IG9uZSBzZWxlY3Rvci4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgSS9PIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNlbGVjdGFibGVDaGFubmVsIGNvbmZpZ3VyZUJsb2NraW5nKGJvb2xlYW4gYmxvY2spCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGNoYW5uZWwgaXMgaW4gYmxvY2tpbmcgbW9kZS4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGNoYW5uZWwgaXMgaW4gYmxvY2tpbmcgbW9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY2hhbm5lbCBpcyBibG9ja2luZworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgY2hhbm5lbCBpcyBibG9ja2luZywgdW5kZWZpbmVkIGlmIHRoaXMKKyAgICAgKiAgICAgICAgIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQmxvY2tpbmcoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgY2hhbm5lbCBpcyByZWdpc3RlcmVkLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2hhbm5lbCBpcyByZWdpc3RlcmVkIHdpdGggYXQgbGVhc3Qgb25lIHNlbGVjdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjaGFubmVsIGlzIHJlZ2lzdGVyZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNoYW5uZWwgaXMgcmVnaXN0ZXJlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVnaXN0ZXJlZCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2VsZWN0aW9uIGtleSBmb3IgdGhlIGNoYW5uZWwgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0b3IuCisgICAgICogR2V0cyB0aGlzIGNoYW5uZWwncyBzZWxlY3Rpb24ga2V5IGZvciB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWxlY3RvciB3aXRoIHdoaWNoIHRoaXMgY2hhbm5lbCBtYXkgcmVnaXN0ZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24ga2V5IGZvciB0aGUgY2hhbm5lbCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNlbGVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgc2VsZWN0b3Igd2l0aCB3aGljaCB0aGlzIGNoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24ga2V5IGZvciB0aGUgY2hhbm5lbCBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcyBjaGFubmVsCisgICAgICogICAgICAgICBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHtAY29kZSBzZWx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZWxlY3Rpb25LZXkga2V5Rm9yKFNlbGVjdG9yIHNlbCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm92aWRlciBvZiB0aGUgY2hhbm5lbC4KKyAgICAgKiBHZXRzIHRoZSBwcm92aWRlciBvZiB0aGlzIGNoYW5uZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgb2YgdGhlIGNoYW5uZWwKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBvZiB0aGlzIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNlbGVjdG9yUHJvdmlkZXIgcHJvdmlkZXIoKTsKIAogICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvciB3aXRoIGEgY2VydGFpbiBpbnRlcmVzdGluZyBvcGVyYXRpb24uCisgICAgICogUmVnaXN0ZXJzIHRoaXMgY2hhbm5lbCB3aXRoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBpbnRlcmVzdCBzZXQuIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZWxlY3RvciwgdGhlCisgICAgICogY29ycmVzcG9uZGluZyBzZWxlY3Rpb24ga2V5IGlzIHJldHVybmVkIGJ1dCB0aGUKKyAgICAgKiB7QGxpbmsgU2VsZWN0aW9uS2V5IGludGVyZXN0IHNldH0gaXMgdXBkYXRlZCB0byB7QGNvZGUgb3BlcmF0aW9uc30uIFRoZQorICAgICAqIHJldHVybmVkIGtleSBpcyBjYW5jZWxlZCBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgd2hpbGUgcmVnaXN0ZXJpbmcgaXMgaW4KKyAgICAgKiBwcm9ncmVzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIHZhbGlkIGF0IGFueSB0aW1lLiBJZiBhbm90aGVyIHRocmVhZCBleGVjdXRlcyB0aGlzCisgICAgICogbWV0aG9kIG9yIHRoZSB7QGNvZGUgY29uZmlndXJlQmxvY2tpbmcoYm9vbGVhbn0gbWV0aG9kIHRoZW4gdGhpcyBjYWxsIGlzCisgICAgICogYmxvY2tlZCB1bnRpbCB0aGUgb3RoZXIgY2FsbCBmaW5pc2hlcy4gQWZ0ZXIgdGhhdCwgaXQgd2lsbCBzeW5jaHJvbml6ZSBvbgorICAgICAqIHRoZSBrZXkgc2V0IG9mIHRoZSBzZWxlY3RvciBhbmQgdGh1cyBtYXkgYWdhaW4gYmxvY2sgaWYgb3RoZXIgdGhyZWFkcworICAgICAqIGFsc28gaG9sZCBsb2NrcyBvbiB0aGUga2V5IHNldCBvZiB0aGUgc2FtZSBzZWxlY3Rvci4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiB7QGNvZGUgcmVnaXN0ZXIoc2VsZWN0b3IsIG9wZXJhdGlvbnMsIG51bGwpfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHNlbGVjdG9yCi0gICAgICogICAgICAgICAgICB0aGUgc2VsZWN0b3Igd2l0aCB3aGljaCB0aGlzIGNoYW5uZWwgc2hhbGwgYmUgcmVnaXN0ZXJlZAorICAgICAqICAgICAgICAgICAgdGhlIHNlbGVjdG9yIHdpdGggd2hpY2ggdG8gcmVnaXN0ZXIgdGhpcyBjaGFubmVsLgogICAgICAqIEBwYXJhbSBvcGVyYXRpb25zCi0gICAgICogICAgICAgICAgICB0aGUgaW50ZXJlc3Rpbmcgb3BlcmF0aW9uCi0gICAgICogQHJldHVybiB0aGUgc2VsZWN0aW9uIGtleSBpbmRpY2F0ZXMgdGhlIGNoYW5uZWwKKyAgICAgKiAgICAgICAgICAgIHRoaXMgY2hhbm5lbCdzIHtAbGluayBTZWxlY3Rpb25LZXkgaW50ZXJlc3Qgc2V0fS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24ga2V5IGZvciB0aGlzIHJlZ2lzdHJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgaW4gYmxvY2tpbmcgbW9kZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjaGFubmVsIGlzIGluIGJsb2NraW5nIG1vZGUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIGNoYW5uZWwgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBwcm92aWRlciBhcyB0aGUKLSAgICAgKiAgICAgICAgICAgICBnaXZlbiBzZWxlY3RvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHByb3ZpZGVyIGFzIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgICAgIHNlbGVjdG9yLgogICAgICAqIEB0aHJvd3MgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgYnV0IGl0cyBrZXkgaGFzIGJlZW4gY2FuY2VsbGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgYnV0IGl0cyBrZXkgaGFzIGJlZW4gY2FuY2VsZWQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgb3BlcmF0aW9uIGdpdmVuIGlzIHVuc3VwcG9ydGVkIGJ5IHRoaXMgY2hhbm5lbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvcGVyYXRpb24gZ2l2ZW4gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFNlbGVjdGlvbktleSByZWdpc3RlcihTZWxlY3RvciBzZWxlY3RvciwgaW50IG9wZXJhdGlvbnMpCiAgICAgICAgICAgICB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiB7CkBAIC0xMTgsMzUgKzE1OSw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvciB3aXRoIGEgY2VydGFpbiBpbnRlcmVzdGluZyBvcGVyYXRpb24KLSAgICAgKiBhbmQgYW4gYXR0YWNoZWQgb2JqZWN0LgorICAgICAqIFJlZ2lzdGVycyB0aGlzIGNoYW5uZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogaW50ZXJlc3Qgc2V0IGFuZCBhbiBvYmplY3QgdG8gYXR0YWNoLiBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5CisgICAgICogcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZWxlY3RvciwgdGhlIGNvcnJlc3BvbmRpbmcgc2VsZWN0aW9uIGtleSBpcyByZXR1cm5lZAorICAgICAqIGJ1dCBpdHMge0BsaW5rIFNlbGVjdGlvbktleSBpbnRlcmVzdCBzZXR9IGlzIHVwZGF0ZWQgdG8ge0Bjb2RlIG9wc30gYW5kCisgICAgICogdGhlIGF0dGFjaGVkIG9iamVjdCBpcyB1cGRhdGVkIHRvIHtAY29kZSBhdHR9LiBUaGUgcmV0dXJuZWQga2V5IGlzCisgICAgICogY2FuY2VsZWQgaWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIHdoaWxlIHJlZ2lzdGVyaW5nIGlzIGluIHByb2dyZXNzLgorICAgICAqIDxwPgorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgdmFsaWQgYXQgYW55IHRpbWUuIElmIGFub3RoZXIgdGhyZWFkIGV4ZWN1dGVzIHRoaXMKKyAgICAgKiBtZXRob2Qgb3IgdGhlIHtAY29kZSBjb25maWd1cmVCbG9ja2luZyhib29sZWFuKX0gbWV0aG9kIHRoZW4gdGhpcyBjYWxsIGlzCisgICAgICogYmxvY2tlZCB1bnRpbCB0aGUgb3RoZXIgY2FsbCBmaW5pc2hlcy4gQWZ0ZXIgdGhhdCwgaXQgd2lsbCBzeW5jaHJvbml6ZSBvbgorICAgICAqIHRoZSBrZXkgc2V0IG9mIHRoZSBzZWxlY3RvciBhbmQgdGh1cyBtYXkgYWdhaW4gYmxvY2sgaWYgb3RoZXIgdGhyZWFkcworICAgICAqIGFsc28gaG9sZCBsb2NrcyBvbiB0aGUga2V5IHNldCBvZiB0aGUgc2FtZSBzZWxlY3Rvci4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHNlbAotICAgICAqICAgICAgICAgICAgdGhlIHNlbGVjdG9yIHdpdGggd2hpY2ggdGhpcyBjaGFubmVsIHNoYWxsIGJlIHJlZ2lzdGVyZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWxlY3RvciB3aXRoIHdoaWNoIHRvIHJlZ2lzdGVyIHRoaXMgY2hhbm5lbC4KICAgICAgKiBAcGFyYW0gb3BzCi0gICAgICogICAgICAgICAgICB0aGUgaW50ZXJlc3Rpbmcgb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICB0aGlzIGNoYW5uZWwncyB7QGxpbmsgU2VsZWN0aW9uS2V5IGludGVyZXN0IHNldH0uCiAgICAgICogQHBhcmFtIGF0dAotICAgICAqICAgICAgICAgICAgVGhlIGF0dGFjaGVkIG9iamVjdCwgd2hpY2ggY2FuIGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24ga2V5IGluZGljYXRlcyB0aGUgY2hhbm5lbAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhdHRhY2gsIGNhbiBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiB0aGUgc2VsZWN0aW9uIGtleSBmb3IgdGhpcyByZWdpc3RyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgaW4gYmxvY2tpbmcgbW9kZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBjaGFubmVsIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgcHJvdmlkZXIgd2l0aCB0aGUKLSAgICAgKiAgICAgICAgICAgICBnaXZlbiBzZWxlY3RvcgotICAgICAqIEB0aHJvd3MgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhpcyBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgYnV0IGl0cyBrZXkgaGFzIGJlZW4gY2FuY2VsbGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBvcGVyYXRpb24gZ2l2ZW4gaXMgdW5zdXBwb3J0ZWQgYnkgdGhpcyBjaGFubmVsCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9wc30gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNoYW5uZWwuCisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGluIGJsb2NraW5nIG1vZGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBwcm92aWRlciBhcyB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgICBzZWxlY3Rvci4KKyAgICAgKiBAdGhyb3dzIENhbmNlbGxlZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyByZWdpc3RlcmVkIGJ1dCBpdHMga2V5IGhhcyBiZWVuIGNhbmNlbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZWxlY3Rpb25LZXkgcmVnaXN0ZXIoU2VsZWN0b3Igc2VsLCBpbnQgb3BzLCBPYmplY3QgYXR0KQogICAgICAgICAgICAgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwb3NzaWJsZSBpbnRlcmVzdGluZyBvcGVyYXRpb24gb2YgdGhlIGNoYW5uZWwuCisgICAgICogR2V0cyB0aGUgc2V0IG9mIHZhbGlkIHtAbGluayBTZWxlY3Rpb25LZXkgb3BlcmF0aW9uc30gb2YgdGhpcyBjaGFubmVsLgorICAgICAqIEluc3RhbmNlcyBvZiBhIGNvbmNyZXRlIGNoYW5uZWwgY2xhc3MgYWx3YXlzIHJldHVybiB0aGUgc2FtZSB2YWx1ZS4gCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcG9zc2libGUgaW50ZXJlc3Rpbmcgb3BlcmF0aW9uIG9mIHRoZSBjaGFubmVsCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIG9wZXJhdGlvbnMgdGhhdCB0aGlzIGNoYW5uZWwgc3VwcG9ydHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCB2YWxpZE9wcygpOwogCmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TZWxlY3Rpb25LZXkuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleS5qYXZhCmluZGV4IGY1MmY5OWUuLmIzNzczZmEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleS5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleS5qYXZhCkBAIC0xOSw0NyArMTksNzMgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKIAogLyoqCi0gKiBBIGtleSB0aGF0IHJlcHJlc2VudGluZyB0aGUgcmVsYXRpb25zaGlwIG9mIGEgY2hhbm5lbCBhbmQgdGhlIHNlbGVjdG9yLgorICogQSB7QGNvZGUgU2VsZWN0aW9uS2V5fSByZXByZXNlbnRzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIGNoYW5uZWwgYW5kIGEKKyAqIHNlbGVjdG9yIGZvciB3aGljaCB0aGUgY2hhbm5lbCBpcyByZWdpc3RlcmVkLgorICogPGgzPk9wZXJhdGlvbiBzZXQ8L2gzPgorICogQW4gb3BlcmF0aW9uIHNldCBpcyByZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyIHZhbHVlLiBUaGUgYml0cyBvZiBhbiBvcGVyYXRpb24KKyAqIHNldCByZXByZXNlbnQgY2F0ZWdvcmllcyBvZiBvcGVyYXRpb25zIGZvciBhIGtleSdzIGNoYW5uZWw6IEFjY2VwdGluZyBzb2NrZXQKKyAqIGNvbm5lY3Rpb25zICh7QGNvZGUgT1BfQUNDRVBUfSksIGNvbm5lY3Rpbmcgd2l0aCBhIHNvY2tldCAoe0Bjb2RlIE9QX0NPTk5FQ1R9KSwKKyAqIHJlYWRpbmcgKHtAY29kZSBPUF9SRUFEfSkgYW5kIHdyaXRpbmcgKHtAY29kZSBPUF9XUklURX0pLgorICogPGg0PkludGVyZXN0IHNldDwvaDQ+CisgKiBUaGUgaW50ZXJlc3Qgc2V0IGlzIGFuIG9wZXJhdGlvbiBzZXQgdGhhdCBkZWZpbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgYQorICoge0BsaW5rIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWx9IGlzIGludGVyZXN0ZWQgaW4gcGVyZm9ybWluZy4KKyAqIDxoND5SZWFkeSBzZXQ8L2g0PgorICogVGhlIHJlYWR5IHNldCBpcyBhbiBvcGVyYXRpb24gc2V0IHRoYXQgc2hvd3MgdGhlIG9wZXJhdGlvbnMgdGhhdCBhCisgKiB7QGNvZGUgY2hhbm5lbH0gaXMgcmVhZHkgdG8gZXhlY3V0ZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25LZXkgewogCiAgICAgLyoqCi0gICAgICogSW50ZXJlc3Rpbmcgb3BlcmF0aW9uIG1hc2sgYml0IGZvciBzb2NrZXQtYWNjZXB0IG9wZXJhdGlvbnMuCisgICAgICogSW50ZXJlc3Qgc2V0IG1hc2sgYml0IGZvciBzb2NrZXQtYWNjZXB0IG9wZXJhdGlvbnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUNDRVBUID0gMTY7CiAKICAgICAvKioKLSAgICAgKiBJbnRlcmVzdGluZyBvcGVyYXRpb24gbWFzayBiaXQgZm9yIHNvY2tldC1jb25uZWN0IG9wZXJhdGlvbnMuCisgICAgICogSW50ZXJlc3Qgc2V0IG1hc2sgYml0IGZvciBzb2NrZXQtY29ubmVjdCBvcGVyYXRpb25zLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NPTk5FQ1QgPSA4OwogCiAgICAgLyoqCiAgICAgICogSW50ZXJlc3Rpbmcgb3BlcmF0aW9uIG1hc2sgYml0IGZvciByZWFkIG9wZXJhdGlvbnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVBRCA9IDE7CiAKICAgICAvKioKLSAgICAgKiBJbnRlcmVzdGluZyBvcGVyYXRpb24gbWFzayBiaXQgZm9yIHdyaXRlIG9wZXJhdGlvbnMuCisgICAgICogSW50ZXJlc3Qgc2V0IG1hc2sgYml0IGZvciB3cml0ZSBvcGVyYXRpb25zLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1dSSVRFID0gNDsKIAogICAgIHByaXZhdGUgdm9sYXRpbGUgT2JqZWN0IGF0dGFjaG1lbnQgPSBudWxsOwogCiAgICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNlbGVjdGlvbktleX0uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNlbGVjdGlvbktleSgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBdHRhY2hlcyBhbiBvYmplY3QgdG8gdGhlIGtleS4KKyAgICAgKiBBdHRhY2hlcyBhbiBvYmplY3QgdG8gdGhpcyBrZXkuIEl0IGlzIGFjY2VwdGFibGUgdG8gYXR0YWNoIHtAY29kZSBudWxsfSwKKyAgICAgKiB0aGlzIGRpc2NhcmRzIHRoZSBvbGQgYXR0YWNobWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYW5PYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYXR0YWNoCi0gICAgICogQHJldHVybiB0aGUgbGFzdCBhdHRhY2hlZCBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYXR0YWNoLCBvciB7QGNvZGUgbnVsbH0gdG8gZGlzY2FyZCB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgYXR0YWNobWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGF0dGFjaGVkIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gb2JqZWN0IGhhcyBiZWVuCisgICAgICogICAgICAgICBhdHRhY2hlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGF0dGFjaChPYmplY3QgYW5PYmplY3QpIHsKICAgICAgICAgT2JqZWN0IG9sZEF0dGFjaG1lbnQgPSBhdHRhY2htZW50OwpAQCAtNzAsNyArOTYsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGF0dGFjaGVkIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRhY2hlZCBvYmplY3Qgb3IgbnVsbCBpZiBubyBvYmplY3QgaGFzIGJlZW4gYXR0YWNoZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRhY2hlZCBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIG9iamVjdCBoYXMgYmVlbgorICAgICAqICAgICAgICAgYXR0YWNoZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIE9iamVjdCBhdHRhY2htZW50KCkgewogICAgICAgICByZXR1cm4gYXR0YWNobWVudDsKQEAgLTc4LDExMiArMTA2LDE0NCBAQAogCiAgICAgLyoqCiAgICAgICogQ2FuY2VscyB0aGlzIGtleS4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGtleSB0aGF0IGhhcyBiZWVuIGNhbmNlbGVkIGlzIG5vIGxvbmdlciB2YWxpZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBvbgorICAgICAqIGFuIGFscmVhZHkgY2FuY2VsZWQga2V5IGRvZXMgbm90aGluZy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBzYWZlIGF0IGFueSB0aW1lLiBUaGUgY2FsbCBtaWdodCBibG9jayB1bnRpbAorICAgICAqIGFub3RoZXIgb25nb2luZyBjYWxsIHRvIGEgbWV0aG9kIG9mIHRoaXMgc2VsZWN0b3IgaGFzIGZpbmlzaGVkLiBUaGUKKyAgICAgKiByZWFzb24gaXMgdGhhdCBpdCBpcyBzeW5jaHJvbml6aW5nIG9uIHRoZSBrZXkgc2V0IG9mIHRoZSBzZWxlY3Rvci4gQWZ0ZXIKKyAgICAgKiB0aGlzIGNhbGwgZmluaXNoZXMsIHRoZSBrZXkgd2lsbCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHNlbGVjdG9ycworICAgICAqIGNhbmNlbGVkLWtleXMgc2V0IGFuZCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiBhbnkgZnV0dXJlIHNlbGVjdHMgb2YgdGhpcworICAgICAqIHNlbGVjdG9yLgorICAgICAqIDwvcD4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYW5jZWwoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGNoYW5uZWwgb2YgdGhpcyBrZXkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhbm5lbCBvZiB0aGlzIGtleQorICAgICAqIEByZXR1cm4gdGhlIGNoYW5uZWwgb2YgdGhpcyBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGludGVyZXN0aW5nIG9wZXJhdGlvbiBvZiB0aGlzIGtleS4KKyAgICAgKiBHZXRzIHRoaXMga2V5J3Mge0BsaW5rIFNlbGVjdGlvbktleSBpbnRlcmVzdCBzZXR9LiBUaGUgcmV0dXJuZWQgc2V0IGhhcworICAgICAqIG9ubHkgdGhvc2UgYml0cyBzZXQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMga2V5J3MgY2hhbm5lbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcmVzdGluZyBvcGVyYXRpb24gb2YgdGhpcyBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcmVzdCBzZXQgb2YgdGhpcyBrZXkuCiAgICAgICogQHRocm93cyBDYW5jZWxsZWRLZXlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGhhcyBiZWVuIGNhbmNlbGxlZCBhbHJlYWR5CisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgaW50ZXJlc3RPcHMoKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGludGVyZXN0aW5nIG9wZXJhdGlvbiBmb3IgdGhpcyBrZXkuCisgICAgICogU2V0cyB0aGUge0BsaW5rIFNlbGVjdGlvbktleSBpbnRlcmVzdCBzZXR9IGZvciB0aGlzIGtleS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3BlcmF0aW9ucwotICAgICAqICAgICAgICAgICAgdGhlIGludGVyZXN0aW5nIG9wZXJhdGlvbiB0byBzZXQKLSAgICAgKiBAcmV0dXJuIHRoaXMga2V5CisgICAgICogICAgICAgICAgICB0aGUgbmV3IGludGVyZXN0IHNldC4KKyAgICAgKiBAcmV0dXJuIHRoaXMga2V5LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIG9wZXJhdGlvbiBpcyBub3QgaW4gdGhlIGtleSdzIGludGVyZXN0aW5nCi0gICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIHNldAorICAgICAqICAgICAgICAgICAgIGlmIGEgYml0IGluIHtAY29kZSBvcGVyYXRpb25zfSBpcyBub3QgaW4gdGhlIHNldCBvZgorICAgICAqICAgICAgICAgICAgIHtAbGluayBTZWxlY3RhYmxlQ2hhbm5lbCN2YWxpZE9wcygpIHZhbGlkIG9wZXJhdGlvbnN9IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBrZXkncyBjaGFubmVsLgogICAgICAqIEB0aHJvd3MgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGtleSBoYXMgYmVlbiBjYW5jZWxsZWQgYWxyZWFkeQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2VsZWN0aW9uS2V5IGludGVyZXN0T3BzKGludCBvcGVyYXRpb25zKTsKIAogICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNoYW5uZWwgb2YgdGhpcyBrZXkgaXMgaW50ZXJlc3RlZCBpbiBhY2NlcHQgb3BlcmF0aW9uCi0gICAgICogYW5kIHJlYWR5IGZvciBhY2NlcHRhdGlvbi4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGtleSdzIGNoYW5uZWwgaXMgaW50ZXJlc3RlZCBpbiB0aGUgYWNjZXB0CisgICAgICogb3BlcmF0aW9uIGFuZCBpcyByZWFkeSB0byBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zLiBBIGNhbGwgdG8gdGhpcyBtZXRob2QKKyAgICAgKiBpcyBlcXVhbCB0byBleGVjdXRpbmcge0Bjb2RlIChyZWFkeU9wcygpICYgT1BfQUNDRVBUKSA9PSBPUF9BQ0NFUFR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhbm5lbCBpcyBpbnRlcmVzdGVkIGluIGFjY2VwdCBvcGVyYXRpb24gYW5kIHJlYWR5Ci0gICAgICogICAgICAgICBmb3IgYWNjZXB0YXRpb24KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2hhbm5lbCBpcyBpbnRlcmVzdGVkIGluIHRoZSBhY2NlcHQgb3BlcmF0aW9uCisgICAgICogICAgICAgICBhbmQgaXMgcmVhZHkgdG8gYWNjZXB0IG5ldyBjb25uZWN0aW9ucywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBDYW5jZWxsZWRLZXlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGhhcyBiZWVuIGNhbmNlbGxlZCBhbHJlYWR5CisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWNjZXB0YWJsZSgpIHsKICAgICAgICAgcmV0dXJuIChyZWFkeU9wcygpICYgT1BfQUNDRVBUKSA9PSBPUF9BQ0NFUFQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGVsbHMgd2hldGhlciB0aGUgY2hhbm5lbCBvZiB0aGlzIGtleSBpcyBpbnRlcmVzdGVkIGluIGNvbm5lY3Qgb3BlcmF0aW9uCi0gICAgICogYW5kIHJlYWR5IGZvciBjb25uZWN0aW9uLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMga2V5J3MgY2hhbm5lbCBpcyBpbnRlcmVzdGVkIGluIHRoZSBjb25uZWN0CisgICAgICogb3BlcmF0aW9uIGFuZCBpcyByZWFkeSB0byBjb25uZWN0LiBBIGNhbGwgdG8gdGhpcyBtZXRob2QgaXMgZXF1YWwgdG8KKyAgICAgKiBleGVjdXRpbmcge0Bjb2RlIChyZWFkeU9wcygpICYgT1BfQ09OTkVDVCkgPT0gT1BfQ09OTkVDVH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFubmVsIGlzIGludGVyZXN0ZWQgaW4gY29ubmVjdCBvcGVyYXRpb24gYW5kIHJlYWR5Ci0gICAgICogICAgICAgICBmb3IgY29ubmVjdGlvbgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjaGFubmVsIGlzIGludGVyZXN0ZWQgaW4gdGhlIGNvbm5lY3QKKyAgICAgKiAgICAgICAgIG9wZXJhdGlvbiBhbmQgaXMgcmVhZHkgdG8gY29ubmVjdCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBDYW5jZWxsZWRLZXlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGhhcyBiZWVuIGNhbmNlbGxlZCBhbHJlYWR5Ci0gICAgICovCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgICAKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nvbm5lY3RhYmxlKCkgewogICAgICAgICByZXR1cm4gKHJlYWR5T3BzKCkgJiBPUF9DT05ORUNUKSA9PSBPUF9DT05ORUNUOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNoYW5uZWwgb2YgdGhpcyBrZXkgaXMgaW50ZXJlc3RlZCBpbiByZWFkIG9wZXJhdGlvbiBhbmQKLSAgICAgKiByZWFkeSBmb3IgcmVhZGluZy4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGtleSdzIGNoYW5uZWwgaXMgaW50ZXJlc3RlZCBpbiB0aGUgcmVhZCBvcGVyYXRpb24KKyAgICAgKiBhbmQgaXMgcmVhZHkgdG8gcmVhZC4gQSBjYWxsIHRvIHRoaXMgbWV0aG9kIGlzIGVxdWFsIHRvIGV4ZWN1dGluZworICAgICAqIHtAY29kZSAocmVhZHlPcHMoKSAmIE9QX1JFQUQpID09IE9QX1JFQUR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhbm5lbCBpcyBpbnRlcmVzdGVkIGluIHJlYWQgb3BlcmF0aW9uIGFuZCByZWFkeSBmb3IKLSAgICAgKiAgICAgICAgIHJlYWRpbmcKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2hhbm5lbCBpcyBpbnRlcmVzdGVkIGluIHRoZSByZWFkIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgYW5kIGlzIHJlYWR5IHRvIHJlYWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGtleSBoYXMgYmVlbiBjYW5jZWxsZWQgYWxyZWFkeQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlYWRhYmxlKCkgewogICAgICAgICByZXR1cm4gKHJlYWR5T3BzKCkgJiBPUF9SRUFEKSA9PSBPUF9SRUFEOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGtleSBpcyB2YWxpZC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGtleSBpcyB2YWxpZC4gQSBrZXkgaXMgdmFsaWQgYXMgbG9uZyBhcyBpdCBoYXMgbm90CisgICAgICogYmVlbiBjYW5jZWxlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSBoYXMgbm90IGJlZW4gY2FuY2VsbGVkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBrZXkgaGFzIG5vdCBiZWVuIGNhbmNlbGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWYWxpZCgpOwogCiAgICAgLyoqCi0gICAgICogVGVsbHMgd2hldGhlciB0aGUgY2hhbm5lbCBvZiB0aGlzIGtleSBpcyBpbnRlcmVzdGVkIGluIHdyaXRlIG9wZXJhdGlvbgotICAgICAqIGFuZCByZWFkeSBmb3Igd3JpdGluZy4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGtleSdzIGNoYW5uZWwgaXMgaW50ZXJlc3RlZCBpbiB0aGUgd3JpdGUgb3BlcmF0aW9uCisgICAgICogYW5kIGlzIHJlYWR5IHRvIHdyaXRlLiBBIGNhbGwgdG8gdGhpcyBtZXRob2QgaXMgZXF1YWwgdG8gZXhlY3V0aW5nCisgICAgICoge0Bjb2RlIChyZWFkeU9wcygpICYgT1BfV1JJVEUpID09IE9QX1dSSVRFfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYW5uZWwgaXMgaW50ZXJlc3RlZCBpbiB3cml0ZSBvcGVyYXRpb24gYW5kIHJlYWR5Ci0gICAgICogICAgICAgICBmb3Igd3JpdGluZworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjaGFubmVsIGlzIGludGVyZXN0ZWQgaW4gdGhlIHdyaWUgb3BlcmF0aW9uCisgICAgICogICAgICAgICBhbmQgaXMgcmVhZHkgdG8gd3JpdGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGtleSBoYXMgYmVlbiBjYW5jZWxsZWQgYWxyZWFkeQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1dyaXRhYmxlKCkgewogICAgICAgICByZXR1cm4gKHJlYWR5T3BzKCkgJiBPUF9XUklURSkgPT0gT1BfV1JJVEU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVhZHkgb3BlcmF0aW9uLgorICAgICAqIEdldHMgdGhlIHNldCBvZiBvcGVyYXRpb25zIHRoYXQgYXJlIHJlYWR5LiBUaGUgcmV0dXJuZWQgc2V0IGhhcyBvbmx5CisgICAgICogdGhvc2UgYml0cyBzZXQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMga2V5J3MgY2hhbm5lbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWFkeSBvcGVyYXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRpb25zIGZvciB3aGljaCB0aGlzIGtleSdzIGNoYW5uZWwgaXMgcmVhZHkuCiAgICAgICogQHRocm93cyBDYW5jZWxsZWRLZXlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGhhcyBiZWVuIGNhbmNlbGxlZCBhbHJlYWR5CisgICAgICogICAgICAgICAgICAgaWYgdGhlIGtleSBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZHlPcHMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJlbGF0ZWQgc2VsZWN0b3IuCisgICAgICogR2V0cyB0aGUgc2VsZWN0b3IgZm9yIHdoaWNoIHRoaXMga2V5J3MgY2hhbm5lbCBpcyByZWdpc3RlcmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbGF0ZWQgc2VsZWN0b3IKKyAgICAgKiBAcmV0dXJuIHRoZSByZWxhdGVkIHNlbGVjdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZWxlY3RvciBzZWxlY3RvcigpOwogfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0b3IuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdG9yLmphdmEKaW5kZXggOTFlNGUwMS4uZDQxN2Y1MSAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0b3IuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TZWxlY3Rvci5qYXZhCkBAIC0yMSwxMjggKzIxLDE2NyBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgotICogQSBjb250cm9sbGVyIGZvciBzZWxlY3Rpb24gb2YgU2VsZWN0YWJsZUNoYW5uZWwgb2JqZWN0cy4KKyAqIEEgY29udHJvbGxlciBmb3IgdGhlIHNlbGVjdGlvbiBvZiB7QGxpbmsgU2VsZWN0YWJsZUNoYW5uZWx9IG9iamVjdHMuCisgKiBTZWxlY3RhYmxlIGNoYW5uZWxzIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggYSBzZWxlY3RvciBhbmQgZ2V0IGEKKyAqIHtAbGluayBTZWxlY3Rpb25LZXl9IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVnaXN0cmF0aW9uLiBUaGUga2V5cyBhcmUgYWxzbworICogYWRkZWQgdG8gdGhlIHNlbGVjdG9yJ3Mga2V5IHNldC4gU2VsZWN0aW9uIGtleXMgY2FuIGJlIGNhbmNlbGVkIHNvIHRoYXQgdGhlCisgKiBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaXMgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VsZWN0b3IuCisgKiA8cD4KKyAqIEJ5IGludm9raW5nIHRoZSB7QGNvZGUgc2VsZWN0fSBtZXRob2QsIHRoZSBrZXkgc2V0IGlzIGNoZWNrZWQgYW5kIGFsbCBrZXlzCisgKiB0aGF0IGhhdmUgYmVlbiBjYW5jZWxlZCBzaW5jZSBsYXN0IHNlbGVjdCBvcGVyYXRpb24gYXJlIG1vdmVkIHRvIHRoZSBzZXQgb2YKKyAqIGNhbmNlbGVkIGtleXMuIER1cmluZyB0aGUgc2VsZWN0IG9wZXJhdGlvbiwgdGhlIGNoYW5uZWxzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzCisgKiBzZWxlY3RvciBhcmUgY2hlY2tlZCB0byBzZWUgd2hldGhlciB0aGV5IGFyZSByZWFkeSBmb3Igb3BlcmF0aW9uIGFjY29yZGluZyB0bworICogdGhlaXIge0BsaW5rIFNlbGVjdGlvbktleSBpbnRlcmVzdCBzZXR9LgorICogPC9wPgogICogCi0gKiBTZWxlY3RhYmxlIGNoYW5uZWxzIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggYSBzZWxlY3RvciwgYW5kIGdldCBTZWxlY3Rpb25LZXkKLSAqIGFzIGEgbGlua2FnZS4gVGhlIGtleXMgYXJlIGFsc28gYWRkZWQgdG8gdGhlIHNlbGVjdG9yJ3Mga2V5c2V0LiBUaGUKLSAqIFNlbGVjdGlvbktleSBjYW4gYmUgY2FuY2VsbGVkIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpcyBubyBsb25nZXIKLSAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VsZWN0b3IuCi0gKiAKLSAqIEJ5IGludm9raW5nIHRoZSBzZWxlY3Qgb3BlcmF0aW9uLCB0aGUga2V5c2V0IGlzIGNoZWNrZWQgYW5kIGFsbCBrZXlzIHRoYXQgYXJlCi0gKiBjYW5jZWxsZWQgc2luY2UgbGFzdCBzZWxlY3Qgb3BlcmF0aW9uIGFyZSBtb3ZlZCB0byBjYW5jZWxsZWRLZXkgc2V0LiBEdXJpbmcKLSAqIHRoZSBzZWxlY3Qgb3BlcmF0aW9uLCB0aGUgY2hhbm5lbHMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgc2VsZWN0b3IgYXJlIGNoZWNrZWQKLSAqIHRvIHNlZSB3aGV0aGVyIHRoZXkgYXJlIHJlYWR5IGZvciBvcGVyYXRpb24gYWNjb3JkaW5nIHRvIHRoZWlyIGludGVyZXN0aW5nCi0gKiBvcGVyYXRpb24uCi0gKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0b3IgewogCiAgICAgLyoqCi0gICAgICogVGhlIGZhY3RvcnkgbWV0aG9kIGZvciBzZWxlY3Rvci4KKyAgICAgKiBUaGUgZmFjdG9yeSBtZXRob2QgZm9yIHNlbGVjdG9yLiBJdCByZXR1cm5zIHRoZSBzZWxlY3RvciByZXR1cm5lZCBieSB0aGUKKyAgICAgKiBkZWZhdWx0IHtAbGluayBTZWxlY3RvclByb3ZpZGVyfSBieSBjYWxsaW5nIGl0cyB7QGNvZGUgb3BlbkNvbGxlY3Rvcn0KKyAgICAgKiBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBzZWxlY3RvcgorICAgICAqIEByZXR1cm4gYSBuZXcgc2VsZWN0b3IuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2VsZWN0b3Igb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNlbGVjdG9yfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU2VsZWN0b3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2VzIHRoaXMgc2VsZWN0b3IuCisgICAgICogQ2xvc2VzIHRoaXMgc2VsZWN0b3IuIE9uZ29pbmcgY2FsbHMgdG8gdGhlIHtAY29kZSBzZWxlY3R9IG1ldGhvZHMgb2YgdGhpcworICAgICAqIHNlbGVjdG9yIHdpbGwgZ2V0IGludGVycnVwdGVkLiBUaGlzIGludGVycnVwdGlvbiBiZWhhdmVzIGFzIGlmIHRoZQorICAgICAqIHtAbGluayAjd2FrZXVwKCl9IG1ldGhvZCBvZiB0aGlzIHNlbGVjdG9yIGlzIGNhbGxlZC4gQWZ0ZXIgdGhpcywgYWxsIGtleXMKKyAgICAgKiB0aGF0IGFyZSBzdGlsbCB2YWxpZCBhcmUgaW52YWxpZGF0ZWQgYW5kIHRoZWlyIGNoYW5uZWxzIGFyZSB1bnJlZ2lzdGVyZWQuCisgICAgICogQWxsIHJlc291cmNlcyBoZWxkIGJ5IHRoaXMgc2VsZWN0b3IgYXJlIHJlbGVhc2VkLgorICAgICAqIDxwPgorICAgICAqIEFueSBmdXJ0aGVyIGF0dGVtcHQgb2YgdXNpbmcgdGhpcyBzZWxlY3RvciBhZnRlciB0aGlzIG1ldGhvZCBoYXMgYmVlbgorICAgICAqIGNhbGxlZCAoZXhjZXB0IGNhbGxpbmcge0BsaW5rICNjbG9zZSgpfSBvciB7QGxpbmsgI3dha2V1cCgpfSkgcmVzdWx0cyBpbgorICAgICAqIGEge0BsaW5rIENsb3NlZFNlbGVjdG9yRXhjZXB0aW9ufSBiZWluZyB0aHJvd24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXRoZXIgdGhpcyBzZWxlY3RvciBpcyBvcGVuLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgc2VsZWN0b3IgaXMgb3Blbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzZWxlY3RvciBpcyBub3QgY2xvc2VkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzZWxlY3RvciBpcyBub3QgY2xvc2VkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNPcGVuKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXQgb2YgcmVnaXN0ZXJlZCBrZXlzLgorICAgICAqIEdldHMgdGhlIHNldCBvZiByZWdpc3RlcmVkIGtleXMuIFRoZSBzZXQgaXMgaW1tdXRhYmxlIGFuZCBpcyBub3QgdGhyZWFkLQorICAgICAqIHNhZmUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5c2V0IG9mIHJlZ2lzdGVyZWQga2V5cworICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiByZWdpc3RlcmVkIGtleXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNldDxTZWxlY3Rpb25LZXk+IGtleXMoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHByb3ZpZGVyIG9mIHRoaXMgc2VsZWN0b3IuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgb2YgdGhpcyBzZWxlY3RvcgorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG9mIHRoaXMgc2VsZWN0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNlbGVjdG9yUHJvdmlkZXIgcHJvdmlkZXIoKTsKIAogICAgIC8qKgotICAgICAqIERldGVjdHMgaWYgYW55IG9mIHRoZSByZWdpc3RlcmVkIGNoYW5uZWxzIGFyZSByZWFkeSBmb3IgSS9PIG9wZXJhdGlvbnMKLSAgICAgKiBhY2NvcmRpbmcgdG8gdGhlaXIgaW50ZXJlc3Rpbmcgb3BlcmF0aW9uLiBUaGlzIG9wZXJhdGlvbiB3aWxsIG5vdCByZXR1cm4KLSAgICAgKiB1bnRpbCBzb21lIG9mIHRoZSBjaGFubmVscyBhcmUgcmVhZHkgb3Igd2FrZXVwIGlzIGludm9rZWQuCisgICAgICogRGV0ZWN0cyBpZiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgY2hhbm5lbHMgaXMgcmVhZHkgZm9yIEkvTyBvcGVyYXRpb25zCisgICAgICogYWNjb3JkaW5nIHRvIGl0cyB7QGxpbmsgU2VsZWN0aW9uS2V5IGludGVyZXN0IHNldH0uIFRoaXMgbWV0aG9kIGRvZXMgbm90CisgICAgICogcmV0dXJuIHVudGlsIGF0IGxlYXN0IG9uZSBjaGFubmVsIGlzIHJlYWR5LCB7QGxpbmsgI3dha2V1cCgpfSBpcworICAgICAqIGludm9rZWQgb3IgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGludGVycnVwdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGFyZSByZWFkeSBmb3Igb3BlcmF0aW9uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgYXJlIHJlYWR5IGZvciBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc2VsZWN0b3IgaXMgY2xvc2VkCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNlbGVjdG9yIGlzIGNsb3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHNlbGVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVjdHMgaWYgYW55IG9mIHRoZSByZWdpc3RlcmVkIGNoYW5uZWxzIGFyZSByZWFkeSBmb3IgSS9PIG9wZXJhdGlvbnMKLSAgICAgKiBhY2NvcmRpbmcgdG8gdGhlaXIgaW50ZXJlc3Rpbmcgb3BlcmF0aW9uLlRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IHJldHVybgotICAgICAqIHVudGlsIHNvbWUgb2YgdGhlIGNoYW5uZWxzIGFyZSByZWFkeSBvciB3YWtldXAgaXMgaW52b2tlZCBvciB0aW1lb3V0Ci0gICAgICogZXhwaXJlZC4KKyAgICAgKiBEZXRlY3RzIGlmIGFueSBvZiB0aGUgcmVnaXN0ZXJlZCBjaGFubmVscyBpcyByZWFkeSBmb3IgSS9PIG9wZXJhdGlvbnMKKyAgICAgKiBhY2NvcmRpbmcgdG8gaXRzIHtAbGluayBTZWxlY3Rpb25LZXkgaW50ZXJlc3Qgc2V0fS4gVGhpcyBtZXRob2QgZG9lcyBub3QKKyAgICAgKiByZXR1cm4gdW50aWwgYXQgbGVhc3Qgb25lIGNoYW5uZWwgaXMgcmVhZHksIHtAbGluayAjd2FrZXVwKCl9IGlzIGludm9rZWQsCisgICAgICogdGhlIGNhbGxpbmcgdGhyZWFkIGlzIGludGVycnVwdGVkIG9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlIHRpbWVvdXR9CisgICAgICogZXhwaXJlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGltZW91dAotICAgICAqICAgICAgICAgICAgdGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCBhcmUgcmVhZHkgZm9yIG9wZXJhdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICB0aGUgbm9uLW5lZ2F0aXZlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQ7IDAgd2lsbCBibG9jayBmb3JldmVyCisgICAgICogICAgICAgICAgICBpZiBubyBjaGFubmVscyBnZXQgcmVhZHkuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgYXJlIHJlYWR5IGZvciBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzZWxlY3RvciBpcyBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2VsZWN0b3IgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGdpdmVuIHRpbWVvdXQgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHplcm8KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gdGltZW91dCBhcmd1bWVudCBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHNlbGVjdChsb25nIHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGtleXMgd2hvc2UgY2hhbm5lbHMgYXJlIHJlYWR5IGZvciBvcGVyYXRpb24uCisgICAgICogR2V0cyB0aGUgc2VsZWN0aW9uIGtleXMgd2hvc2UgY2hhbm5lbHMgYXJlIHJlYWR5IGZvciBvcGVyYXRpb24uIFRoZSBzZXQKKyAgICAgKiBpcyBub3QgdGhyZWFkLXNhZmUgYW5kIG5vIGtleXMgbWF5IGJlIGFkZGVkIHRvIGl0LiBSZW1vdmluZyBrZXlzIGlzCisgICAgICogYWxsb3dlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXlzIHdob3NlIGNoYW5uZWxzIGFyZSByZWFkeSBmb3Igb3BlcmF0aW9uCisgICAgICogQHJldHVybiB0aGUgc2VsZWN0aW9uIGtleXMgd2hvc2UgY2hhbm5lbHMgYXJlIHJlYWR5IGZvciBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzZWxlY3RvciBpcyBjbG9zZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNldDxTZWxlY3Rpb25LZXk+IHNlbGVjdGVkS2V5cygpOwogCiAgICAgLyoqCi0gICAgICogRGV0ZWN0cyBpZiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgY2hhbm5lbHMgYXJlIHJlYWR5IGZvciBJL08gb3BlcmF0aW9ucwotICAgICAqIGFjY29yZGluZyB0byB0aGVpciBpbnRlcmVzdGluZyBvcGVyYXRpb24uVGhpcyBvcGVyYXRpb24gd2lsbCBub3QgcmV0dXJuCi0gICAgICogaW1tZWRpYXRlbHkuCisgICAgICogRGV0ZWN0cyBpZiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgY2hhbm5lbHMgaXMgcmVhZHkgZm9yIEkvTyBvcGVyYXRpb25zCisgICAgICogYWNjb3JkaW5nIHRvIGl0cyB7QGxpbmsgU2VsZWN0aW9uS2V5IGludGVyZXN0IHNldH0uIFRoaXMgb3BlcmF0aW9uIHdpbGwKKyAgICAgKiByZXR1cm4gaW1tZWRpYXRlbHkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgYXJlIHJlYWR5IGZvciBvcGVyYXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCBhcmUgcmVhZHkgZm9yIG9wZXJhdGlvbiwgMCBpZiBub25lIGlzCisgICAgICogICAgICAgICByZWFkeS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgSS9PIGVycm9yIG9jY3VyCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycnMuCiAgICAgICogQHRocm93cyBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzZWxlY3RvciBpcyBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2VsZWN0b3IgaXMgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2VsZWN0Tm93KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRm9yY2VzIHRoZSBibG9ja2VkIHNlbGVjdCBvcGVyYXRpb24gdG8gcmV0dXJuIGltbWVkaWF0ZWx5LiBJZiBubyBzZWxlY3QKLSAgICAgKiBvcGVyYXRpb24gaXMgYmxvY2tlZCBjdXJyZW50bHksIHRoZSBuZXh0IHNlbGVjdCBvcGVyYXRpb24gc2hhbGwgcmV0dXJuCi0gICAgICogaW1tZWRpYXRlbHkuCisgICAgICogRm9yY2VzIGJsb2NrZWQge0Bjb2RlIHNlbGVjdH0gb3BlcmF0aW9ucyB0byByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICogPHA+CisgICAgICogSWYgbm8ge0Bjb2RlIHNlbGVjdH0gb3BlcmF0aW9uIGlzIGJsb2NrZWQgd2hlbiB7QGNvZGUgd2FrZXVwKCl9IGlzIGNhbGxlZAorICAgICAqIHRoZW4gdGhlIG5leHQge0Bjb2RlIHNlbGVjdH0gb3BlcmF0aW9uIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBUaGlzIGNhbgorICAgICAqIGJlIHVuZG9uZSBieSBhIGNhbGwgdG8ge0Bjb2RlIHNlbGVjdE5vdygpfTsgYWZ0ZXIgY2FsbGluZworICAgICAqIHtAY29kZSBzZWxlY3ROb3coKX0sIGEgc3Vic2VxdWVudCBjYWxsIG9mIHtAY29kZSBzZWxlY3R9IGNhbiBibG9jaworICAgICAqIGFnYWluLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgc2VsZWN0b3IKKyAgICAgKiBAcmV0dXJuIHRoaXMgc2VsZWN0b3IuCiAgICAgICogQHRocm93cyBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzZWxlY3RvciBpcyBjbG9zZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2VsZWN0b3IgaXMgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZWxlY3RvciB3YWtldXAoKTsKIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NlcnZlclNvY2tldENoYW5uZWwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NlcnZlclNvY2tldENoYW5uZWwuamF2YQppbmRleCBhYzM3ZTdkLi44ZWNiMTgzIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9TZXJ2ZXJTb2NrZXRDaGFubmVsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvU2VydmVyU29ja2V0Q2hhbm5lbC5qYXZhCkBAIC0yMyw5NiArMjMsMTAzIEBACiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7CiAKIC8qKgotICogQSBTZXJ2ZXJTb2NrZXRDaGFubmVsIGlzIGEgcGFydGx5IGFic3RyYWN0ZWQgc3RyZWFtLW9yaWVudGVkIGxpc3RlbmluZyBzb2NrZXQKLSAqIHdoaWNoIGlzIHNlbGVjdGFibGUuIEJpbmRpbmcgYW5kIG1hbmlwdWxhdGlvbiBvZiBzb2NrZXQgb3B0aW9ucyBjYW4gb25seSBiZSBkb25lCi0gKiB0aHJvdWdoIHRoZSBhc3NvY2lhdGVkIDxjb2RlPlNlcnZlclNvY2tldDwvY29kZT4gb2JqZWN0LCByZXR1cm5lZCBieSBjYWxsaW5nIAotICogc29ja2V0IG1ldGhvZC4gU2VydmVyU29ja2V0Q2hhbm5lbHMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBmb3IgYSBwcmUtZXhpc3RpbmcgCi0gKiBzZXJ2ZXIgc29ja2V0LCBub3IgY2FuIGl0IGJlIGFzc2lnbmVkIGEgU29ja2V0SW1wbC4KLSAqIDxwPiAKLSAqIEEgU2VydmVyLVNvY2tldCBjaGFubmVsIGlzIG9wZW4gYnV0IG5vdCBib3VuZCB3aGVuIGNyZWF0ZWQgYnkKLSAqIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZC4gKENhbGxpbmcgPGNvZGU+YWNjZXB0PC9jb2RlPiBiZWZvcmUgYm91bmQgd2lsbCBjYXVzZSBhCi0gKiA8Y29kZT5Ob3RZZXRCb3VuZEV4Y2VwdGlvbjwvY29kZT4pLiBJdCBjYW4gYmUgYm91bmQgYnkgY2FsbGluZyB0aGUgYmluZCBtZXRob2QgCi0gKiBvZiBhIHJlbGF0ZWQgPGNvZGU+U2VydmVyU29ja2V0PC9jb2RlPiBpbnN0YW5jZS48L3A+ICAKKyAqIEEge0Bjb2RlIFNlcnZlclNvY2tldENoYW5uZWx9IGlzIGEgcGFydGlhbCBhYnN0cmFjdGlvbiBvZiBhIHNlbGVjdGFibGUsCisgKiBzdHJlYW0tb3JpZW50ZWQgbGlzdGVuaW5nIHNvY2tldC4gQmluZGluZyBhbmQgbWFuaXB1bGF0aW9uIG9mIHNvY2tldCBvcHRpb25zCisgKiBjYW4gb25seSBiZSBkb25lIHRocm91Z2ggdGhlIGFzc29jaWF0ZWQge0BsaW5rIFNlcnZlclNvY2tldH0gb2JqZWN0LCByZXR1cm5lZAorICogYnkgY2FsbGluZyB7QGNvZGUgc29ja2V0KCl9LiBTZXJ2ZXJTb2NrZXRDaGFubmVscyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGZvcgorICogYW4gYWxyZWFkeSBleGlzdGluZyBzZXJ2ZXItc29ja2V0LCBub3IgY2FuIGEge0BsaW5rIGphdmEubmV0LlNvY2tldEltcGx9IGJlIGFzc2lnbmVkLgorICogPHA+CisgKiBBIHNlcnZlci1zb2NrZXQgY2hhbm5lbCBpcyBvcGVuIGJ1dCBub3QgYm91bmQgd2hlbiBjcmVhdGVkIGJ5IHRoZSB7QGNvZGUKKyAqIG9wZW4oKX0gbWV0aG9kLiBDYWxsaW5nIHtAY29kZSBhY2NlcHR9IGJlZm9yZSBib3VuZCB3aWxsIGNhdXNlIGEKKyAqIHtAbGluayBOb3RZZXRCb3VuZEV4Y2VwdGlvbn0uIEl0IGNhbiBiZSBib3VuZCBieSBjYWxsaW5nIHRoZSBiaW5kIG1ldGhvZCBvZiBhCisgKiByZWxhdGVkIHtAY29kZSBTZXJ2ZXJTb2NrZXR9IGluc3RhbmNlLgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlclNvY2tldENoYW5uZWwgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsIHsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBmb3IgU2VydmVyU29ja2V0Q2hhbm5lbAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIFNlcnZlclNvY2tldENoYW5uZWx9LgorICAgICAqIAogICAgICAqIEBwYXJhbSBzZWxlY3RvclByb3ZpZGVyCi0gICAgICogICAgICAgICAgICBBbiBpbnN0YW5jZSBvZiBTZWxlY3RvclByb3ZpZGVyCisgICAgICogICAgICAgICAgICBhbiBpbnN0YW5jZSBvZiBTZWxlY3RvclByb3ZpZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotCiAgICAgcHJvdGVjdGVkIFNlcnZlclNvY2tldENoYW5uZWwoU2VsZWN0b3JQcm92aWRlciBzZWxlY3RvclByb3ZpZGVyKSB7CiAgICAgICAgIHN1cGVyKHNlbGVjdG9yUHJvdmlkZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBvcGVuIGFuZCB1bmJvdW5kIHNlcnZlci1zb2NrZXQgY2hhbm5lbC4KKyAgICAgKiBDcmVhdGVzIGFuIG9wZW4gYW5kIHVuYm91bmQgc2VydmVyLXNvY2tldCBjaGFubmVsLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgY2hhbm5lbCBpcyBnb3QgYnkgY2FsbGluZyA8Y29kZT5vcGVuU2VydmVyU29ja2V0Q2hhbm5lbDwvY29kZT4KLSAgICAgKiBtZXRob2Qgb2YgdGhlIGRlZmF1bHQgPGNvZGU+U2VsZWN0b3JQcm92aWRlciA8L2NvZGU+IGluc3RhbmNlLgotICAgICAqIDwvcD4gCisgICAgICogVGhpcyBjaGFubmVsIGlzIGNyZWF0ZWQgYnkgY2FsbGluZyB7QGNvZGUgb3BlblNlcnZlclNvY2tldENoYW5uZWx9IG1ldGhvZAorICAgICAqIG9mIHRoZSBkZWZhdWx0IHtAY29kZSBTZWxlY3RvclByb3ZpZGVyfSBpbnN0YW5jZS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNyZWF0ZWQgY2hhbm5lbCB3aGljaCBpcyBvcGVuIGJ1dCB1bmJvdW5kLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBjaGFubmVsIHdoaWNoIGlzIG9wZW4gYnV0IHVuYm91bmQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNlcnZlclNvY2tldENoYW5uZWwgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlcnZlclNvY2tldENoYW5uZWwoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbGlkIG9wZXJhdGlvbnMgb2YgdGhpcyBjaGFubmVsLiBTZXJ2ZXItc29ja2V0IGNoYW5uZWxzIHN1cHBvcnQKLSAgICAgKiBhY2NlcHRpbmcgb3BlcmF0aW9uLkN1cnJlbnRseSB0aGUgb25seSBzdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIE9QX0FDQ0VQVC4KLSAgICAgKiBJdCBhbHdheXMgcmV0dXJucyA8Y29kZT5TZWxlY3Rpb25LZXkuT1BfQUNDRVBUPC9jb2RlPi4KKyAgICAgKiBHZXRzIHRoZSB2YWxpZCBvcGVyYXRpb25zIG9mIHRoaXMgY2hhbm5lbC4gU2VydmVyLXNvY2tldCBjaGFubmVscyBzdXBwb3J0CisgICAgICogYWNjZXB0aW5nIG9wZXJhdGlvbiwgc28gdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUKKyAgICAgKiBTZWxlY3Rpb25LZXkuT1BfQUNDRVBUfS4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsI3ZhbGlkT3BzKCkKLSAgICAgKiBAcmV0dXJuIFZhbGlkIG9wZXJhdGlvbnMgaW4gYml0LXNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCB2YWxpZE9wcygpIHsKICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbktleS5PUF9BQ0NFUFQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByZWxhdGVkIHNlcnZlci1zb2NrZXQgb2YgdGhpcyBjaGFubmVsLiAKLSAgICAgKiBBbGwgcHVibGljIG1ldGhvZHMgZGVjbGFyZWQgaW4gcmV0dXJuZWQgb2JqZWN0IHNob3VsZCBiZSBkZWNsYXJlZCBpbiA8Y29kZT5TZXJ2ZXJTb2NrZXQ8L2NvZGU+LgorICAgICAqIFJldHVybiB0aGUgc2VydmVyLXNvY2tldCBhc3NpZ25lZCB0aGlzIGNoYW5uZWwsIHdoaWNoIGRvZXMgbm90IGRlY2xhcmUKKyAgICAgKiBhbnkgcHVibGljIG1ldGhvZHMgdGhhdCBhcmUgbm90IGRlY2xhcmVkIGluIHtAY29kZSBTZXJ2ZXJTb2NrZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHJlbGF0ZWQgU2VydmVyU29ja2V0IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIHNlcnZlci1zb2NrZXQgYXNzaWduZWQgdG8gdGhpcyBjaGFubmVsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZXJ2ZXJTb2NrZXQgc29ja2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBBY2NlcHRzIGEgY29ubmVjdGlvbiB0byB0aGlzIHNvY2tldC4KKyAgICAgKiBBY2NlcHRzIGEgY29ubmVjdGlvbiB0byB0aGlzIHNlcnZlci1zb2NrZXQgY2hhbm5lbC4KICAgICAgKiA8cD4KLSAgICAgKiBJdCByZXR1cm5zIG51bGwgd2hlbiB0aGUgY2hhbm5lbCBpcyBub24tYmxvY2tpbmcgYW5kIG5vIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGl0Ci0gICAgICogYmxvY2tzIGluZGVmaW5pdGVseSB1bnRpbCBhIG5ldyBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZSBvciBhbiBJL08gZXJyb3Igb2NjdXJzLgotICAgICAqIFRoZSByZXR1cm5lZCBjaGFubmVsIHdpbGwgYmUgaW4gYmxvY2tpbmcgbW9kZSBhbnkgd2F5LiAKKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfSB3aGVuIHRoaXMgY2hhbm5lbCBpcyBub24tYmxvY2tpbmcgYW5kIG5vCisgICAgICogY29ubmVjdGlvbiBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBpdCBibG9ja3MgdW50aWwgYSBuZXcgY29ubmVjdGlvbiBpcworICAgICAqIGF2YWlsYWJsZSBvciBhbiBJL08gZXJyb3Igb2NjdXJzLiBUaGUgc29ja2V0IGNoYW5uZWwgcmV0dXJuZWQgYnkgdGhpcworICAgICAqIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBpbiBibG9ja2luZyBtb2RlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBqdXN0IGV4ZWN1dGVzIHRoZSBzYW1lIHNlY3VyaXR5IGNoZWNrcyBhcyB0aGUge0Bjb2RlCisgICAgICogYWNjZXB0KCl9IG1ldGhvZCBvZiB0aGUge0BsaW5rIFNlcnZlclNvY2tldH0gY2xhc3MuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGp1c3QgZXhlY3V0ZSB0aGUgc2FtZSBzZWN1cml0eSBjaGVja3MgYXMgdGhlIGFjY2VwdCBtZXRob2Qgb2YKLSAgICAgKiB0aGUgPGNvZGU+U2VydmVyU29ja2V0PC9jb2RlPiBjbGFzcy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYWNjZXB0ZWQgU29ja2V0Q2hhbm5lbCBpbnN0YW5jZSwgb3IgbnVsbCBhcyB0aGUgY2hhbm5lbCBpcwotICAgICAqICAgICAgICAgbm9uLWJsb2NraW5nIGFuZCBubyBjb25uZWN0aW9ucyBhdmFpbGFibGUuCi0gICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogQHJldHVybiB0aGUgYWNjZXB0ZWQge0Bjb2RlIFNvY2tldENoYW5uZWx9IGluc3RhbmNlLCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoZSBjaGFubmVsIGlzIG5vbi1ibG9ja2luZyBhbmQgbm8gY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKICAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQotICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0LCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCi0gICAgICogQHRocm93cyBOb3RZZXRCb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBzb2NrZXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZC4KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyLCBhbmQgdGhlIG5ldyBjb25uZWN0aW9uIGlzIG5vdAotICAgICAqICAgICAgICAgICAgIHBlcm1pdHRlZCB0byBhY2Nlc3MuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhpcworICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGludGVycnVwdCBzdGF0ZSBvZiB0aGUgY2FsbGluZworICAgICAqICAgICAgICAgICAgIHRocmVhZCBpcyBzZXQgYW5kIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIE5vdFlldEJvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvY2tldCBoYXMgbm90IHlldCBiZWVuIGJvdW5kLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIgYW5kIGl0IGRvZXMgbm90IHBlcm1pdCB0bworICAgICAqICAgICAgICAgICAgIGFjY2VzcyB0aGUgbmV3IGNvbm5lY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNvY2tldENoYW5uZWwgYWNjZXB0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Tb2NrZXRDaGFubmVsLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Tb2NrZXRDaGFubmVsLmphdmEKaW5kZXggODEyZDgxMS4uYTcwOWRlZSAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvU29ja2V0Q2hhbm5lbC5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1NvY2tldENoYW5uZWwuamF2YQpAQCAtMjcsMzYgKzI3LDM5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm07CiAKIC8qKgotICogQSBTb2NrZXRDaGFubmVsIGlzIGEgc2VsZWN0YWJsZSBjaGFubmVsIGZvciBwYXJ0IGFic3RyYWN0aW9uIG9mIHN0cmVhbQotICogY29ubmVjdGluZyBzb2NrZXQuIFRoZSA8Y29kZT5zb2NrZXQ8L2NvZGU+IG1ldGhvZCBvZiB0aGlzIGNsYXNzIGNhbiByZXR1cm4KLSAqIHRoZSByZWxhdGVkIDxjb2RlPlNvY2tldDwvY29kZT4gaW5zdGFuY2UsIHdoaWNoIGNhbiBoYW5kbGUgdGhlIHNvY2tldC4KKyAqIEEge0Bjb2RlIFNvY2tldENoYW5uZWx9IGlzIGEgc2VsZWN0YWJsZSBjaGFubmVsIHRoYXQgcHJvdmlkZXMgYSBwYXJ0aWFsCisgKiBhYnN0cmFjdGlvbiBvZiBzdHJlYW0gY29ubmVjdGluZyBzb2NrZXQuIHtAY29kZSBzb2NrZXQoKX0gcmV0dXJucyB0aGUgcmVsYXRlZAorICoge0BsaW5rIFNvY2tldH0gaW5zdGFuY2Ugd2hpY2ggY2FuIGhhbmRsZSB0aGUgc29ja2V0LgogICogPHA+Ci0gKiBBIHNvY2tldCBjaGFubmVsIGlzIG9wZW4gYnV0IG5vdCBjb25uZWN0ZWQgd2hlbiBjcmVhdGVkIGJ5IDxjb2RlPm9wZW48L2NvZGU+Ci0gKiBtZXRob2QuIEFmdGVyIGNvbm5lY3RlZCBieSBjYWxsaW5nIHRoZSA8Y29kZT5jb25uZWN0PC9jb2RlPiBtZXRob2QsIGl0IHdpbGwKLSAqIGtlZXAgY29ubmVjdGVkIGJlZm9yZSBjbG9zZWQuIFRoZSBjb25uZWN0aW9uIGlzIG5vbi1ibG9ja2luZyB0aGF0IHRoZQotICogPGNvZGU+Y29ubmVjdDwvY29kZT4gbWV0aG9kIGlzIGZvciB0aGUgaW5pdGlhbCBjb25uZWN0aW9uIGFuZCBmb2xsb3dpbmcKLSAqIDxjb2RlPmZpbmlzaENvbm5lY3Q8L2NvZGU+IG1ldGhvZCBpcyBmb3IgdGhlIGZpbmFsIHN0ZXBzIG9mIGNvbm5lY3Rpb24uIFRoZQotICogPGNvZGU+aXNDb25uZWN0aW9uUGVuZGluZzwvY29kZT4gbWV0aG9kIGNhbiB0ZWxsIHRoZSBjb25uZWN0aW9uIGlzIGJsb2NrZWQKLSAqIG9yIG5vdDsgdGhlIDxjb2RlPmlzQ29ubmVjdGVkPC9jb2RlPiBtZXRob2QgY2FuIHRlbGwgdGhlIHNvY2tldCBpcwotICogY29ubmVjdGVkIGZpbmFsbHkgb3Igbm90LgorICogQSBzb2NrZXQgY2hhbm5lbCBpcyBvcGVuIGJ1dCBub3QgY29ubmVjdGVkIHdoZW4gY3JlYXRlZCBieSB7QGNvZGUgb3BlbigpfS4KKyAqIEFmdGVyIGNvbm5lY3RpbmcgaXQgYnkgY2FsbGluZyB7QGNvZGUgY29ubmVjdChTb2NrZXRBZGRyZXNzKX0sIGl0IHdpbGwgcmVtYWluCisgKiBjb25uZWN0ZWQgdW50aWwgaXQgZ2V0cyBjbG9zZWQuIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vbi1ibG9ja2luZyB0aGVuCisgKiB7QGNvZGUgY29ubmVjdChTb2NrZXRBZGRyZXNzKX0gaXMgdXNlZCB0byBpbml0aWF0ZSB0aGUgY29ubmVjdGlvbiwgZm9sbG93ZWQKKyAqIGJ5IGEgY2FsbCBvZiB7QGNvZGUgZmluaXNoQ29ubmVjdCgpfSB0byBwZXJmb3JtIHRoZSBmaW5hbCBzdGVwcyBvZgorICogY29ubmVjdGluZy4ge0Bjb2RlIGlzQ29ubmVjdGlvblBlbmRpbmcoKX0gaW5kaWNhdGVzIGlmIHRoZSBjb25uZWN0aW9uIGlzCisgKiBibG9ja2VkIG9yIG5vdDsge0Bjb2RlIGlzQ29ubmVjdGVkKCl9IGluZGljYXRlcyBpZiB0aGUgc29ja2V0IGlzIGZpbmFsbHkKKyAqIGNvbm5lY3RlZCBvciBub3QuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSBzaHV0IGRvd24gb3BlcmF0aW9uIGNhbiBiZSBpbmRlcGVuZGVudCBhbmQgYXN5bmNocm9ub3VzIGZvciBpbnB1dCBhbmQKLSAqIG91dHB1dC4gVGhlIDxjb2RlPnNodXRkb3duSW5wdXQ8L2NvZGU+IG1ldGhvZCBpcyBmb3IgaW5wdXQsIGFuZCBjYW4gbWFrZQotICogdGhlIGZvbGxvd2luZyByZWFkIG9wZXJhdGlvbiBmYWlsIGFzIGVuZCBvZiBzdHJlYW0uIElmIHRoZSBpbnB1dCBpcyBzaHV0IGRvd24KLSAqIGFuZCBhbm90aGVyIHRocmVhZCBpcyBwZW5kaW5nIGluIHJlYWQgb3BlcmF0aW9uLCB0aGUgcmVhZCB3aWxsIGVuZCB3aXRob3V0Ci0gKiBlZmZlY3QgYW5kIHJldHVybiBlbmQgb2Ygc3RyZWFtLiBUaGUgPGNvZGU+c2h1dGRvd25PdXRwdXQ8L2NvZGU+IG1ldGhvZCBpcwotICogZm9yIG91dHB1dCwgYW5kIGNhbiBtYWtlIHRoZSBmb2xsb3dpbmcgd3JpdGUgb3BlcmF0aW9uIHRocm93aW5nIGEKLSAqIDxjb2RlPkNsb3NlZENoYW5uZWxFeGNlcHRpb248L2NvZGU+LiBJZiB0aGUgb3V0cHV0IGlzIHNodXQgZG93biBhbmQKLSAqIGFub3RoZXIgaXMgcGVuZGluZyBpbiBhIHdyaXRlIG9wZXJhdGlvbiwgYW4KLSAqIDxjb2RlPkFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIHRocm93biB0byB0aGUgcGVuZGluZyB0aHJlYWQuCisgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBzaWRlcyBvZiBhIGNoYW5uZWwgY2FuIGJlIHNodXQgZG93biBpbmRlcGVuZGVudGx5IGFuZAorICogYXN5bmNocm9ub3VzbHkgd2l0aG91dCBjbG9zaW5nIHRoZSBjaGFubmVsLiBUaGUge0Bjb2RlIHNodXRkb3duSW5wdXR9IG1ldGhvZAorICogaXMgdXNlZCBmb3IgdGhlIGlucHV0IHNpZGUgb2YgYSBjaGFubmVsIGFuZCBzdWJzZXF1ZW50IHJlYWQgb3BlcmF0aW9ucyByZXR1cm4KKyAqIC0xLCB3aGljaCBtZWFucyBlbmQgb2Ygc3RyZWFtLiBJZiBhbm90aGVyIHRocmVhZCBpcyBibG9ja2VkIGluIGEgcmVhZAorICogb3BlcmF0aW9uIHdoZW4gdGhlIHNodXRkb3duIG9jY3VycywgdGhlIHJlYWQgd2lsbCBlbmQgd2l0aG91dCBlZmZlY3QgYW5kCisgKiByZXR1cm4gZW5kIG9mIHN0cmVhbS4gVGhlIHtAY29kZSBzaHV0ZG93bk91dHB1dH0gbWV0aG9kIGlzIHVzZWQgZm9yIHRoZQorICogb3V0cHV0IHNpZGUgb2YgdGhlIGNoYW5uZWw7IHN1YnNlcXVlbnQgd3JpdGUgb3BlcmF0aW9ucyB0aHJvdyBhCisgKiB7QGxpbmsgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbn0uIElmIHRoZSBvdXRwdXQgaXMgc2h1dCBkb3duIGFuZCBhbm90aGVyIHRocmVhZAorICogaXMgYmxvY2tlZCBpbiBhIHdyaXRlIG9wZXJhdGlvbiwgYW4ge0BsaW5rIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9ufSB3aWxsCisgKiBiZSB0aHJvd24gdG8gdGhlIHBlbmRpbmcgdGhyZWFkLgogICogPC9wPgogICogPHA+CiAgKiBTb2NrZXQgY2hhbm5lbHMgYXJlIHRocmVhZC1zYWZlLCBubyBtb3JlIHRoYW4gb25lIHRocmVhZCBjYW4gcmVhZCBvciB3cml0ZSBhdAotICogZ2l2ZW4gdGltZS4gVGhlIDxjb2RlPmNvbm5lY3Q8L2NvZGU+IGFuZCA8Y29kZT5maW5pc2hDb25uZWN0PC9jb2RlPgotICogbWV0aG9kcyBhcmUgY29uY3VycmVudCBlYWNoIG90aGVyLCB3aGVuIHRoZXkgYXJlIHByb2Nlc3NpbmcsIG90aGVyIHJlYWQgYW5kCi0gKiB3cml0ZSB3aWxsIGJsb2NrLgorICogYW55IGdpdmVuIHRpbWUuIFRoZSB7QGNvZGUgY29ubmVjdChTb2NrZXRBZGRyZXNzKX0gYW5kIHtAY29kZQorICogZmluaXNoQ29ubmVjdCgpfSBtZXRob2RzIGFyZSBzeW5jaHJvbml6ZWQgYWdhaW5zdCBlYWNoIG90aGVyOyB3aGVuIHRoZXkgYXJlCisgKiBwcm9jZXNzaW5nLCBjYWxscyB0byB7QGNvZGUgcmVhZH0gYW5kIHtAY29kZSB3cml0ZX0gd2lsbCBibG9jay4KICAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb2NrZXRDaGFubmVsIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCBpbXBsZW1lbnRzCiAgICAgICAgIEJ5dGVDaGFubmVsLCBTY2F0dGVyaW5nQnl0ZUNoYW5uZWwsIEdhdGhlcmluZ0J5dGVDaGFubmVsIHsKQEAgLTY2LDU3ICs2OSw1OSBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzcy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTb2NrZXRDaGFubmVsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2VsZWN0b3JQcm92aWRlcgotICAgICAqICAgICAgICAgICAgQSBpbnN0YW5jZSBvZiBTZWxlY3RvclByb3ZpZGVyCisgICAgICogICAgICAgICAgICBhbiBpbnN0YW5jZSBvZiBTZWxlY3RvclByb3ZpZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTb2NrZXRDaGFubmVsKFNlbGVjdG9yUHJvdmlkZXIgc2VsZWN0b3JQcm92aWRlcikgewogICAgICAgICBzdXBlcihzZWxlY3RvclByb3ZpZGVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBvcGVuIGFuZCBub3QtY29ubmVjdGVkIHNvY2tldCBjaGFubmVsLgorICAgICAqIENyZWF0ZXMgYW4gb3BlbiBhbmQgdW5jb25uZWN0ZWQgc29ja2V0IGNoYW5uZWwuCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBjaGFubmVsIGlzIGdvdCBieSA8Y29kZT5vcGVuU29ja2V0Q2hhbm5lbDwvY29kZT4gbWV0aG9kIG9mIHRoZQotICAgICAqIGRlZmF1bHQgPGNvZGU+U2VsZWN0b3JQcm92aWRlciA8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIFRoaXMgY2hhbm5lbCBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcge0Bjb2RlIG9wZW5Tb2NrZXRDaGFubmVsKCl9IG9mIHRoZQorICAgICAqIGRlZmF1bHQge0BsaW5rIFNlbGVjdG9yUHJvdmlkZXJ9IGluc3RhbmNlLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY3JlYXRlZCBjaGFubmVsIHdoaWNoIGlzIG9wZW4gYnV0IG5vdC1jb25uZWN0ZWQuCisgICAgICogQHJldHVybiB0aGUgbmV3IGNoYW5uZWwgd2hpY2ggaXMgb3BlbiBidXQgdW5jb25uZWN0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNvY2tldENoYW5uZWwgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNvY2tldENoYW5uZWwoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzb2NrZXQgY2hhbm5lbCBhbmQgY29ubmVjdCBpdCB0byBhIHNvY2tldCBhZGRyZXNzLgorICAgICAqIENyZWF0ZXMgYSBzb2NrZXQgY2hhbm5lbCBhbmQgY29ubmVjdHMgaXQgdG8gYSBzb2NrZXQgYWRkcmVzcy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtIGp1c3QgYXMgPGNvZGU+b3BlbjwvY29kZT4gbWV0aG9kIGZvbGxvd2luZyBieSB0aGUKLSAgICAgKiA8Y29kZT5jb25uZWN0PC9jb2RlPiBtZXRob2QuCisgICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgYSBjYWxsIHRvIHtAY29kZSBvcGVuKCl9IGZvbGxvd2VkIGJ5IGEgY2FsbCB0bworICAgICAqIHtAY29kZSBjb25uZWN0KFNvY2tldEFkcmVzcyl9LgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWRkcmVzcwotICAgICAqICAgICAgICAgICAgVGhlIHNvY2tldCBhZGRyZXNzIHRvIGJlIGNvbm5lY3RlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgb3BlbmVkIGNoYW5uZWwuCisgICAgICogICAgICAgICAgICB0aGUgc29ja2V0IGFkZHJlc3MgdG8gYmUgY29ubmVjdGVkIHRvLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBjb25uZWN0ZWQgY2hhbm5lbC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICAgICAgaXMgaW4gb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICBpcyBleGVjdXRpbmcuCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQotICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0LCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCi0gICAgICogQHRocm93cyBVbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBhZGRyZXNzIGlzIG5vdCByZXNvbHZlZC4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgYWRkcmVzcyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhpcworICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBleGVjdXRpbmcuIFRoZSBjYWxsaW5nIHRocmVhZCB3aWxsIGhhdmUgdGhlCisgICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciwgYW5kIHRoZSBhZGRyZXNzIGlzIG5vdAotICAgICAqICAgICAgICAgICAgIHBlcm1pdHRlZCB0byBhY2Nlc3MuCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyIGFuZCBpdCBkZW5pZXMgdGhlIGFjY2VzcyBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBhZGRyZXNzfS4KKyAgICAgKiBAdGhyb3dzIFVucmVzb2x2ZWRBZGRyZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFkZHJlc3MgaXMgbm90IHJlc29sdmVkLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhZGRyZXNzIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgU29tZSBvdGhlciBJTyBlcnJvciBvY2N1cnJlZC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU29ja2V0Q2hhbm5lbCBvcGVuKFNvY2tldEFkZHJlc3MgYWRkcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsID0gb3BlbigpOwpAQCAtMTI3LDI0MCArMTMyLDIzNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsaWQgb3BlcmF0aW9ucyBvZiB0aGlzIGNoYW5uZWwuIFNvY2tldCBjaGFubmVscyBzdXBwb3J0Ci0gICAgICogY29ubmVjdCwgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9uLCBzbyB0aGlzIG1ldGhvZCByZXR1cm5zICgKLSAgICAgKiA8Y29kZT5TZWxlY3Rpb25LZXkuT1BfQ09OTkVDVDwvY29kZT4gfAotICAgICAqIDxjb2RlPlNlbGVjdGlvbktleS5PUF9SRUFEPC9jb2RlPiB8IDxjb2RlPlNlbGVjdGlvbktleS5PUF9XUklURTwvY29kZT4gKS4KKyAgICAgKiBHZXRzIHRoZSB2YWxpZCBvcGVyYXRpb25zIG9mIHRoaXMgY2hhbm5lbC4gU29ja2V0IGNoYW5uZWxzIHN1cHBvcnQKKyAgICAgKiBjb25uZWN0LCByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb24sIHNvIHRoaXMgbWV0aG9kIHJldHVybnMKKyAgICAgKiB7QGNvZGUgU2VsZWN0aW9uS2V5Lk9QX0NPTk5FQ1QgfCBTZWxlY3Rpb25LZXkuT1BfUkVBRCB8IFNlbGVjdGlvbktleS5PUF9XUklURX0uCiAgICAgICogCisgICAgICogQHJldHVybiB0aGUgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBjaGFubmVsLgogICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWwjdmFsaWRPcHMoKQotICAgICAqIEByZXR1cm4gVmFsaWQgb3BlcmF0aW9ucyBpbiBiaXQtc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsaWRPcHMoKSB7CiAgICAgICAgIHJldHVybiAoU2VsZWN0aW9uS2V5Lk9QX0NPTk5FQ1QgfCBTZWxlY3Rpb25LZXkuT1BfUkVBRCB8IFNlbGVjdGlvbktleS5PUF9XUklURSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByZWxhdGVkIHNvY2tldCBvZiB0aGlzIGNoYW5uZWwsIHdoaWNoIHdvbid0IGRlY2xhcmUgcHVibGljCi0gICAgICogbWV0aG9kcyB0aGF0IG5vdCBkZWNsYXJlZCBpbiA8Y29kZT5Tb2NrZXQ8L2NvZGU+LgorICAgICAqIFJldHVybnMgdGhlIHNvY2tldCBhc3NpZ25lZCB0byB0aGlzIGNoYW5uZWwsIHdoaWNoIGRvZXMgbm90IGRlY2xhcmUgYW55IHB1YmxpYworICAgICAqIG1ldGhvZHMgdGhhdCBhcmUgbm90IGRlY2xhcmVkIGluIHtAY29kZSBTb2NrZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHJlbGF0ZWQgU29ja2V0IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIHNvY2tldCBhc3NpZ25lZCB0byB0aGlzIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNvY2tldCBzb2NrZXQoKTsKIAogICAgIC8qKgotICAgICAqIEFuc3dlciB3aGV0aGVyIHRoaXMgY2hhbm5lbCdzIHNvY2tldCBpcyBjb25uZWN0ZWQgb3Igbm90LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2hhbm5lbCdzIHNvY2tldCBpcyBjb25uZWN0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhpcyBjaGFubmVsJ3Mgc29ja2V0IGlzIGNvbm5lY3RlZDsKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjaGFubmVsJ3Mgc29ja2V0IGlzIGNvbm5lY3RlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29ubmVjdGVkKCk7CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgd2hldGhlciB0aGlzIGNoYW5uZWwncyBzb2NrZXQgaXMgaW4gY29ubmVjdGluZyBvciBub3QuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjaGFubmVsJ3Mgc29ja2V0IGlzIHN0aWxsIHRyeWluZyB0byBjb25uZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHRoZSBjb25uZWN0aW9uIGlzIGluaXRpYXRlZCBidXQgbm90Ci0gICAgICogICAgICAgICBmaW5pc2hlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY29ubmVjdGlvbiBpcyBpbml0aWF0ZWQgYnV0IG5vdCBmaW5pc2hlZDsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29ubmVjdGlvblBlbmRpbmcoKTsKIAogICAgIC8qKgotICAgICAqIENvbm5lY3QgdGhlIHNvY2tldCB0byByZW1vdGUgYWRkcmVzcy4KKyAgICAgKiBDb25uZWN0cyB0aGlzIGNoYW5uZWwncyBzb2NrZXQgd2l0aCBhIHJlbW90ZSBhZGRyZXNzLgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjaGFubmVsIGlzIGJsb2NraW5nLCB0aGlzIG1ldGhvZCB3aWxsIHN1c3BlbmQgYmVmb3JlIGNvbm5lY3Rpb24KLSAgICAgKiBmaW5pc2hlZCBvciBhbiBJL08gZXhjZXB0aW9uLiBJZiB0aGUgY2hhbm5lbCBpcyBub24tYmxvY2tpbmcsIHRoaXMgbWV0aG9kCi0gICAgICogd2lsbCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbm5lY3Rpb24gaXMgZmluaXNoZWQgYXQgb25jZSBvcgotICAgICAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSBjb25uZWN0aW9uIG11c3Qgd2FpdAotICAgICAqIDxjb2RlPmZpbmlzaENvbm5lY3Q8L2NvZGU+IHRvIGZpbmlzaGVkIG90aGVyd2lzZS4KKyAgICAgKiBJZiB0aGlzIGNoYW5uZWwgaXMgYmxvY2tpbmcsIHRoaXMgbWV0aG9kIHdpbGwgc3VzcGVuZCB1bnRpbCBjb25uZWN0aW5nIGlzCisgICAgICogZmluaXNoZWQgb3IgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnJzLiBJZiB0aGUgY2hhbm5lbCBpcyBub24tYmxvY2tpbmcsCisgICAgICogdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb25uZWN0aW9uIGlzIGZpbmlzaGVkIGF0CisgICAgICogb25jZSBvciByZXR1cm4ge0Bjb2RlIGZhbHNlfSB3aGVuIHRoZSBjb25uZWN0aW9uIG11c3QgYmUgZmluaXNoZWQgbGF0ZXIKKyAgICAgKiBieSBjYWxsaW5nIHtAY29kZSBmaW5pc2hDb25uZWN0KCl9LgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGF0IGFueSBtb21lbnQsIGFuZCBjYW4gYmxvY2sgb3RoZXIgcmVhZCBhbmQKLSAgICAgKiB3cml0ZSBvcGVyYXRpb25zIHdoaWxlIGNvbm5lY3RpbmcuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGp1c3QgZXhlY3V0ZSB0aGUgc2FtZSBzZWN1cml0eSBjaGVja3MgYXMgdGhlIGNvbm5lY3QgbWV0aG9kCi0gICAgICogb2YgdGhlIDxjb2RlPlNvY2tldDwvY29kZT4gY2xhc3MuCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBhbnkgbW9tZW50IGFuZCBjYW4gYmxvY2sgb3RoZXIgcmVhZCBhbmQKKyAgICAgKiB3cml0ZSBvcGVyYXRpb25zIHdoaWxlIGNvbm5lY3RpbmcuIEl0IGV4ZWN1dGVzIHRoZSBzYW1lIHNlY3VyaXR5IGNoZWNrcworICAgICAqIGFzIHRoZSBjb25uZWN0IG1ldGhvZCBvZiB0aGUge0Bjb2RlIFNvY2tldH0gY2xhc3MuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICogICAgICAgICAgICBUaGUgYWRkcmVzcyB0byBiZSBjb25uZWN0ZWQuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb25uZWN0aW9uIGlzIGZpbmlzaGVkLDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3MgdG8gY29ubmVjdCB3aXRoLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb25uZWN0aW9uIGlzIGZpbmlzaGVkLCB7QGNvZGUgZmFsc2V9CiAgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBBbHJlYWR5Q29ubmVjdGVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgY29ubmVjdGVkIGFscmVhZHkuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjb25uZWN0ZWQuCiAgICAgICogQHRocm93cyBDb25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIEEgbm9uLWJsb2NraW5nIGNvbm5lY3RpbmcgaXMgZG9pbmcgb24gdGhpcyBjaGFubmVsLgorICAgICAqICAgICAgICAgICAgIGEgbm9uLWJsb2NraW5nIGNvbm5lY3Rpbmcgb3BlcmF0aW9uIGlzIGFscmVhZHkgZXhlY3V0aW5nIG9uCisgICAgICogICAgICAgICAgICAgdGhpcyBjaGFubmVsLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgaXMgZXhlY3V0aW5nLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGlzCiAgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0IGFuZCB0aGlzIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCiAgICAgICogQHRocm93cyBVbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBhZGRyZXNzIGlzIG5vdCByZXNvbHZlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBpcyBub3QgcmVzb2x2ZWQuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGFkZHJlc3MgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhZGRyZXNzIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyLCBhbmQgdGhlIGFkZHJlc3MgaXMgbm90Ci0gICAgICogICAgICAgICAgICAgcGVybWl0dGVkIHRvIGFjY2Vzcy4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIgYW5kIGl0IGRlbmllcyB0aGUgYWNjZXNzIG9mCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGFkZHJlc3N9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29ubmVjdChTb2NrZXRBZGRyZXNzIGFkZHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENvbXBsZXRlIHRoZSBjb25uZWN0aW9uLgorICAgICAqIENvbXBsZXRlcyB0aGUgY29ubmVjdGlvbiBwcm9jZXNzIGluaXRpYXRlZCBieSBhIGNhbGwgb2Yge0Bjb2RlCisgICAgICogY29ubmVjdChTb2NrZXRBZGRyZXNzKX0uCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIHRoZSBjaGFubmVsIGlzIGNvbm5lY3RhYmxlIHRvIGZpbmlzaCB0aGUKLSAgICAgKiBjb25uZWN0aW9uLCBhbmQgdGhlIGNvbm5lY3RhYmxlIHN0YXR1cyBvZiBhIGNoYW5uZWwgbWVhbnMgdGhlIGNoYW5uZWwgaXMKLSAgICAgKiBhZnRlciBpbml0aWF0aW5nIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCBjYWxsaW5nIGl0cwotICAgICAqIDxjb2RlPmNvbm5lY3Q8L2NvZGU+IG1ldGhvZC4gSXQgd2lsbCB0aHJvdyByZWxhdGVkCi0gICAgICogPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+IGlmIHRoZSBjb25uZWN0aW9uIGZhaWxlZC4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgY29ubmVjdGlvbiBpcyBmaW5pc2hlZCBhbHJlYWR5CisgICAgICogYW5kIHJldHVybnMge0Bjb2RlIGZhbHNlfSBpZiB0aGUgY2hhbm5lbCBpcyBub24tYmxvY2tpbmcgYW5kIHRoZQorICAgICAqIGNvbm5lY3Rpb24gaXMgbm90IGZpbmlzaGVkIHlldC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbm5lY3Rpb24gaXMgZmluaXNoZWQKLSAgICAgKiBhbHJlYWR5LCBhbmQgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hhbm5lbCBpcyBub24tYmxvY2tpbmcKLSAgICAgKiBhbmQgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGZpbmlzaGVkIHlldC4KKyAgICAgKiBJZiB0aGlzIGNoYW5uZWwgaXMgaW4gYmxvY2tpbmcgbW9kZSwgdGhpcyBtZXRob2Qgd2lsbCBzdXNwZW5kIGFuZCByZXR1cm4KKyAgICAgKiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBmaW5pc2hlZC4gSXQgY2xvc2VzIHRoaXMgY2hhbm5lbCBhbmQKKyAgICAgKiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25uZWN0aW9uIGZhaWxzLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2hhbm5lbCBpcyBpbiBibG9ja2luZyBtb2RlLCB0aGlzIG1ldGhvZCB3aWxsIHN1c3BlbmQsIGFuZCByZXR1cm4KLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgY29ubmVjdGlvbiBmaW5pc2hlZCBvciB0aHJvdyBzb21lIGV4Y2VwdGlvbgotICAgICAqIG90aGVyd2lzZS4gVGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQgaWYgdGhlIGNvbm5lY3Rpb24gZmFpbGVkIGFuZCB0aGlzCi0gICAgICogbWV0aG9kIHRocm93biBzb21lIGV4Y2VwdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBhbnkgbW9tZW50LCBhbmQgY2FuIGJsb2NrIG90aGVyIHJlYWQgYW5kCi0gICAgICogd3JpdGUgb3BlcmF0aW9ucyB3aGlsZSBjb25uZWN0aW5nLgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYXQgYW55IG1vbWVudCBhbmQgaXQgY2FuIGJsb2NrIG90aGVyIHtAY29kZQorICAgICAqIHJlYWR9IGFuZCB7QGNvZGUgd3JpdGV9IG9wZXJhdGlvbnMgd2hpbGUgY29ubmVjdGluZy4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgZmluaXNoZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgTm9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgYW5kIHRoZSBjb25uZWN0aW9uIGlzIG5vdAotICAgICAqICAgICAgICAgICAgIGluaXRpYXRlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2hhbm5lbCBpcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgY29ubmVjdGlvbiBwcm9jZXNzCisgICAgICogICAgICAgICAgICAgaGFzIG5vdCBiZWVuIGluaXRpYXRlZC4KICAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlzIGV4ZWN1dGluZy4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCi0gICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGlzCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgaGFzIHRoZQorICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZmluaXNoQ29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNoYW5uZWwgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgorICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhpcyBzb2NrZXQgY2hhbm5lbCBpbnRvIHRoZSBnaXZlbiBidWZmZXIuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBiZSByZWFkIGlzIHRoZQotICAgICAqIDxjb2RlPnJlbWFpbmluZygpPC9jb2RlPiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciB3aGVuIHRoZSBtZXRob2QKLSAgICAgKiBpbnZva2VkLiBUaGUgYnl0ZXMgd2lsbCBiZSByZWFkIGludG8gdGhlIGJ1ZmZlciBzdGFydGluZyBhdCB0aGUgYnVmZmVyJ3MKLSAgICAgKiA8Y29kZT5wb3NpdGlvbjwvY29kZT4uCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBiZSByZWFkIGlzIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mCisgICAgICogYnl0ZXMgaW4gdGhlIGJ1ZmZlciB3aGVuIHRoZSBtZXRob2QgaXMgaW52b2tlZC4gVGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkCisgICAgICogaW50byB0aGUgYnVmZmVyIHN0YXJ0aW5nIGF0IHRoZSBidWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbCBtYXkgYmxvY2sgaWYgb3RoZXIgdGhyZWFkcyBhcmUgYWxzbyBhdHRlbXB0aW5nIHRvIHJlYWQgb24gdGhlCi0gICAgICogc2FtZSBjaGFubmVsLgorICAgICAqIFRoZSBjYWxsIG1heSBibG9jayBpZiBvdGhlciB0aHJlYWRzIGFyZSBhbHNvIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoaXMKKyAgICAgKiBjaGFubmVsLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBVcG9uIGNvbXBsZXRpb24sIHRoZSBidWZmZXIncyA8Y29kZT5wb3NpdGlvbigpPC9jb2RlPiBpcyB1cGRhdGVkIHRvIHRoZQotICAgICAqIGVuZCBvZiB0aGUgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQuIFRoZSBidWZmZXIncyA8Y29kZT5saW1pdCgpPC9jb2RlPiBpcwotICAgICAqIHVubW9kaWZpZWQuCisgICAgICogVXBvbiBjb21wbGV0aW9uLCB0aGUgYnVmZmVyJ3MgcG9zaXRpb24gaXMgc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGVzCisgICAgICogdGhhdCBoYXZlIGJlZW4gcmVhZC4gVGhlIGJ1ZmZlcidzIGxpbWl0IGlzIG5vdCBjaGFuZ2VkLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwjcmVhZChqYXZhLm5pby5CeXRlQnVmZmVyKQogICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiAgICAgICAgICAgIFRoZSBieXRlIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBieXRlcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KLSAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgeWV0LgotICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGJ5dGVzLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgY2xvc2VzIHRoZSBjaGFubmVsIGR1cmluZyB0aGUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBub3QgeWV0IGNvbm5lY3RlZC4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCi0gICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGlzCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgaW50ZXJydXB0IHN0YXRlIG9mIHRoZSBjYWxsaW5nCisgICAgICogICAgICAgICAgICAgdGhyZWFkIGlzIHNldCBhbmQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFNvbWUgb3RoZXIgSU8gZXJyb3Igb2NjdXJyZWQuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZChCeXRlQnVmZmVyIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY2hhbm5lbCBpbnRvIGEgc3Vic2V0IG9mIHRoZSBnaXZlbiBidWZmZXJzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIHJlYWQgYWxsIG9mIHRoZSA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gYnl0ZXMKLSAgICAgKiBmcm9tIDxjb2RlPmxlbmd0aDwvY29kZT4gYnl0ZSBidWZmZXJzLCBpbiBvcmRlciwgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT50YXJnZXRzW29mZnNldF08L2NvZGU+LiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKiA8L3A+CisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHNvY2tldCBjaGFubmVsIGFuZCBzdG9yZXMgdGhlbSBpbiBhIHN1YnNldCBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgYXJyYXkgb2YgYnVmZmVycy4gVGhlIHN1YnNldCBpcyBkZWZpbmVkIGJ5IHtAY29kZSBvZmZzZXR9IGFuZAorICAgICAqIHtAY29kZSBsZW5ndGh9LCBpbmRpY2F0aW5nIHRoZSBmaXJzdCBidWZmZXIgYW5kIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0bworICAgICAqIHVzZS4gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gcmVhZCBhcyBtYW55IGJ5dGVzIGFzIGNhbiBiZSBzdG9yZWQgaW4gdGhlCisgICAgICogYnVmZmVyIHN1YnNldCBmcm9tIHRoaXMgY2hhbm5lbCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5CisgICAgICogcmVhZC4KICAgICAgKiA8cD4KICAgICAgKiBJZiBhIHJlYWQgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLCBzdWJzZXF1ZW50IHRocmVhZHMgd2lsbCBibG9jayB1bnRpbAotICAgICAqIHRoZSByZWFkIGlzIGNvbXBsZXRlZCwgYW5kIHdpbGwgdGhlbiBjb250ZW5kIGZvciB0aGUgYWJpbGl0eSB0byByZWFkLgorICAgICAqIHRoZSByZWFkIGlzIGNvbXBsZXRlZCBhbmQgd2lsbCB0aGVuIGNvbnRlbmQgZm9yIHRoZSBhYmlsaXR5IHRvIHJlYWQuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2NhdHRlcmluZ0J5dGVDaGFubmVsI3JlYWQoamF2YS5uaW8uQnl0ZUJ1ZmZlcltdLAotICAgICAqICAgICAgaW50LCBpbnQpCiAgICAgICogQHBhcmFtIHRhcmdldHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBieXRlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSByZWFkLgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ1ZmZlciB0byByZWFkLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBidWZmZXIgdG8gc3RvcmUgYnl0ZXMgaW4uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gcmVhZC4KLSAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgeWV0LgotICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc3RvcmUgYnl0ZXMgaW4uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCiAgICAgICogQHRocm93cyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZSBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgICAgIGlzIGluIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGR1cmluZyB0aGlzIHJlYWQKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQotICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0LCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhpcworICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGludGVycnVwdCBzdGF0ZSBvZiB0aGUgY2FsbGluZworICAgICAqICAgICAgICAgICAgIHRocmVhZCBpcyBzZXQgYW5kIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgbGVuZ3RoIDwgMH0sIG9yIGlmIHtAY29kZQorICAgICAqICAgICAgICAgICAgIG9mZnNldCArIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHtAY29kZSB0YXJnZXRzfS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgU29tZSBvdGhlciBJTyBlcnJvciBvY2N1cnJlZC4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgbm90IHlldCBjb25uZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZChCeXRlQnVmZmVyW10gdGFyZ2V0cywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNoYW5uZWwgaW50byBhbGwgdGhlIGdpdmVuIGJ1ZmZlcnMuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGlzIHNvY2tldCBjaGFubmVsIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogYXJyYXkgb2YgYnVmZmVycy4gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gcmVhZCBhcyBtYW55IGJ5dGVzIGFzIGNhbiBiZQorICAgICAqIHN0b3JlZCBpbiB0aGUgYnVmZmVyIGFycmF5IGZyb20gdGhpcyBjaGFubmVsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgICAgKiBieXRlcyBhY3R1YWxseSByZWFkLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG86CisgICAgICogSWYgYSByZWFkIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywgc3Vic2VxdWVudCB0aHJlYWRzIHdpbGwgYmxvY2sgdW50aWwKKyAgICAgKiB0aGUgcmVhZCBpcyBjb21wbGV0ZWQgYW5kIHdpbGwgdGhlbiBjb250ZW5kIGZvciB0aGUgYWJpbGl0eSB0byByZWFkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGNvZGUgcmVhZCh0YXJnZXRzLCAwLAorICAgICAqIHRhcmdldHMubGVuZ3RoKTt9CisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIDxwcmU+Ci0gICAgICogcmVhZCh0YXJnZXRzLCAwLCB0YXJnZXRzLmxlbmd0aCk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TY2F0dGVyaW5nQnl0ZUNoYW5uZWwjcmVhZChqYXZhLm5pby5CeXRlQnVmZmVyW10pCiAgICAgICogQHBhcmFtIHRhcmdldHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBieXRlIGJ1ZmZlcnMgdG8gcmVjZWl2ZSB0aGUgYnl0ZXMgYmVpbmcgcmVhZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBieXRlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCi0gICAgICogQHRocm93cyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBub3QgY29ubmVjdGVkIHlldC4KLSAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICAgICAgaXMgaW4gb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgZHVyaW5nIHRoaXMgcmVhZAorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCi0gICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGlzCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgaW50ZXJydXB0IHN0YXRlIG9mIHRoZSBjYWxsaW5nCisgICAgICogICAgICAgICAgICAgdGhyZWFkIGlzIHNldCBhbmQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFNvbWUgb3RoZXIgSU8gZXJyb3Igb2NjdXJyZWQuCi0gICAgICogCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIG5vdCB5ZXQgY29ubmVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgbG9uZyByZWFkKEJ5dGVCdWZmZXJbXSB0YXJnZXRzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTM2OCwxMTQgKzM2OCwxMDEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHRvIHRoZSBjaGFubmVsLgorICAgICAqIFdyaXRlcyBieXRlcyBmcm9tIHRoZSBnaXZlbiBieXRlIGJ1ZmZlciB0byB0aGlzIHNvY2tldCBjaGFubmVsLiBUaGUKKyAgICAgKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSB3cml0dGVuIGlzIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzCisgICAgICogaW4gdGhlIGJ1ZmZlciB3aGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuIFRoZSBieXRlcyBhcmUgdGFrZW4gZnJvbSB0aGUKKyAgICAgKiBidWZmZXIgc3RhcnRpbmcgYXQgdGhlIGJ1ZmZlcidzIHBvc2l0aW9uLgogICAgICAqIDxwPgotICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHdpbGwgYmUgd3JpdHRlbiBpcyB0aGUKLSAgICAgKiA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgd2hlbiB0aGUgbWV0aG9kCi0gICAgICogaW52b2tlZC4gVGhlIGJ5dGVzIHdpbGwgYmUgd3JpdHRlbiBmcm9tIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgdGhlCi0gICAgICogYnVmZmVyJ3MgPGNvZGU+cG9zaXRpb248L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbCBtYXkgYmxvY2sgaWYgb3RoZXIgdGhyZWFkcyBhcmUgYWxzbyBhdHRlbXB0aW5nIHRvIHdyaXRlIG9uIHRoZQorICAgICAqIFRoZSBjYWxsIG1heSBibG9jayBpZiBvdGhlciB0aHJlYWRzIGFyZSBhbHNvIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdGhlCiAgICAgICogc2FtZSBjaGFubmVsLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBVcG9uIGNvbXBsZXRpb24sIHRoZSBidWZmZXIncyA8Y29kZT5wb3NpdGlvbigpPC9jb2RlPiBpcyB1cGRhdGVkIHRvIHRoZQotICAgICAqIGVuZCBvZiB0aGUgYnl0ZXMgdGhhdCB3ZXJlIHdyaXR0ZW4uIFRoZSBidWZmZXIncyA8Y29kZT5saW1pdCgpPC9jb2RlPgotICAgICAqIGlzIHVubW9kaWZpZWQuCisgICAgICogVXBvbiBjb21wbGV0aW9uLCB0aGUgYnVmZmVyJ3MgcG9zaXRpb24gaXMgdXBkYXRlZCB0byB0aGUgZW5kIG9mIHRoZSBieXRlcworICAgICAqIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4uIFRoZSBidWZmZXIncyBsaW1pdCBpcyBub3QgY2hhbmdlZC4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsI3dyaXRlKGphdmEubmlvLkJ5dGVCdWZmZXIpCiAgICAgICogQHBhcmFtIHNvdXJjZQogICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCi0gICAgICogQHRocm93cyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBub3QgY29ubmVjdGVkIHlldC4KLSAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICAgICAgaXMgaW4gb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGNsb3NlcyB0aGUgY2hhbm5lbCBkdXJpbmcgdGhlIHdyaXRlLgogICAgICAqIEB0aHJvd3MgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBjYWxsaW5nIHRocmVhZCB3aWxsIGhhdmUgdGhlCi0gICAgICogICAgICAgICAgICAgaW50ZXJydXB0IHN0YXRlIHNldCwgYW5kIHRoZSBjaGFubmVsIHdpbGwgYmUgY2xvc2VkLgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBpbnRlcnJ1cHQgc3RhdGUgb2YgdGhlIGNhbGxpbmcKKyAgICAgKiAgICAgICAgICAgICB0aHJlYWQgaXMgc2V0IGFuZCB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCisgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNoYW5uZWwgd2FzIGFscmVhZHkgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBub3QgY29ubmVjdGVkIHlldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHdyaXRlKEJ5dGVCdWZmZXIgc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzdWJzZXQgb2YgdGhlIGdpdmVuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcnMgdG8gdGhlIGNoYW5uZWwuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gd3JpdGUgYWxsIG9mIHRoZSA8Y29kZT5yZW1haW5pbmcoKTwvY29kZT4gYnl0ZXMKLSAgICAgKiBmcm9tIDxjb2RlPmxlbmd0aDwvY29kZT4gYnl0ZSBidWZmZXJzLCBpbiBvcmRlciwgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5zb3VyY2VzW29mZnNldF08L2NvZGU+LiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKiA8L3A+CisgICAgICogV3JpdGVzIGJ5dGVzIGZyb20gYSBzdWJzZXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheSBvZiBidWZmZXJzIGludG8gdGhpcworICAgICAqIHNvY2tldCBjaGFubmVsLiBUaGUgc3Vic2V0IGlzIGRlZmluZWQgYnkge0Bjb2RlIG9mZnNldH0gYW5kIHtAY29kZQorICAgICAqIGxlbmd0aH0sIGluZGljYXRpbmcgdGhlIGZpcnN0IGJ1ZmZlciBhbmQgdGhlIG51bWJlciBvZiBidWZmZXJzIHRvIHVzZS4KICAgICAgKiA8cD4KICAgICAgKiBJZiBhIHdyaXRlIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywgc3Vic2VxdWVudCB0aHJlYWRzIHdpbGwgYmxvY2sgdW50aWwKLSAgICAgKiB0aGUgd3JpdGUgaXMgY29tcGxldGVkLCBhbmQgd2lsbCB0aGVuIGNvbnRlbmQgZm9yIHRoZSBhYmlsaXR5IHRvIHdyaXRlLgorICAgICAqIHRoZSB3cml0ZSBpcyBjb21wbGV0ZWQgYW5kIHRoZW4gY29udGVuZCBmb3IgdGhlIGFiaWxpdHkgdG8gd3JpdGUuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuR2F0aGVyaW5nQnl0ZUNoYW5uZWwjd3JpdGUoamF2YS5uaW8uQnl0ZUJ1ZmZlcltdLAotICAgICAqICAgICAgaW50LCBpbnQpCiAgICAgICogQHBhcmFtIHNvdXJjZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBieXRlIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgc291cmNlIG9mIHJlbWFpbmluZwotICAgICAqICAgICAgICAgICAgYnl0ZXMgdGhhdCB3aWxsIGJlIGF0dGVtcHRlZCB0byBiZSB3cml0dGVuLgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGUgYnVmZmVycyB0aGF0IGlzIHRoZSBzb3VyY2UgZm9yIGJ5dGVzIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRvIHRoaXMgY2hhbm5lbC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ1ZmZlciB0byB3cml0ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnVmZmVyIGluIHtAY29kZSBidWZmZXJzIH10byBnZXQgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIGZyb20uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBidWZmZXJzIHRvIHdyaXRlLgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgotICAgICAqIEB0aHJvd3MgTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZCB5ZXQuCi0gICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gZ2V0IGJ5dGVzIGZyb20uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhpcyBjaGFubmVsLgogICAgICAqIEB0aHJvd3MgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgICAgICBpcyBpbiBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBkdXJpbmcgdGhpcyB3cml0ZQorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhlCi0gICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGluZyB0aHJlYWQgd2lsbCBoYXZlIHRoZQotICAgICAqICAgICAgICAgICAgIGludGVycnVwdCBzdGF0ZSBzZXQsIGFuZCB0aGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoZSBjYWxsaW5nIHRocmVhZCB3aGlsZSB0aGlzCisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgaW50ZXJydXB0IHN0YXRlIG9mIHRoZSBjYWxsaW5nCisgICAgICogICAgICAgICAgICAgdGhyZWFkIGlzIHNldCBhbmQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW5ndGggPCAwfSwgb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgb2Zmc2V0ICsgbGVuZ3RofSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2Yge0Bjb2RlIHNvdXJjZXN9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBub3QgeWV0IGNvbm5lY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyB3cml0ZShCeXRlQnVmZmVyW10gc291cmNlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBieXRlcyBmcm9tIGFsbCB0aGUgZ2l2ZW4gYnVmZmVycyB0byB0aGUgY2hhbm5lbC4KKyAgICAgKiBXcml0ZXMgYnl0ZXMgZnJvbSBhbGwgdGhlIGdpdmVuIGJ5dGUgYnVmZmVycyB0byB0aGlzIHNvY2tldCBjaGFubmVsLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiB3cml0ZShidWZmZXJzLCAwLCBidWZmZXJzLmxlbmd0aCk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcge0Bjb2RlIHdyaXRlKHNvdXJjZXMsIDAsCisgICAgICogc291cmNlcy5sZW5ndGgpO30KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5HYXRoZXJpbmdCeXRlQ2hhbm5lbCN3cml0ZShqYXZhLm5pby5CeXRlQnVmZmVyW10pCiAgICAgICogQHBhcmFtIHNvdXJjZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXJzIGNvbnRhaW5pbmcgYnl0ZXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXJzIGNvbnRhaW5pbmcgYnl0ZXMgdG8gd3JpdGUuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCi0gICAgICogQHRocm93cyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBub3QgY29ubmVjdGVkIHlldC4KLSAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICAgICAgaXMgaW4gb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgZHVyaW5nIHRoaXMgd3JpdGUKKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCiAgICAgICogQHRocm93cyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGNhbGxpbmcgdGhyZWFkIHdoaWxlIHRoZQotICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHQgc3RhdGUgc2V0LCBhbmQgdGhlIGNoYW5uZWwgd2lsbCBiZSBjbG9zZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhpcworICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gVGhlIGludGVycnVwdCBzdGF0ZSBvZiB0aGUgY2FsbGluZworICAgICAqICAgICAgICAgICAgIHRocmVhZCBpcyBzZXQgYW5kIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBTb21lIG90aGVyIElPIGVycm9yIG9jY3VycmVkLgotICAgICAqIAorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY2hhbm5lbCBpcyBub3QgeWV0IGNvbm5lY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIGxvbmcgd3JpdGUoQnl0ZUJ1ZmZlcltdIHNvdXJjZXMpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb24uamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1VucmVzb2x2ZWRBZGRyZXNzRXhjZXB0aW9uLmphdmEKaW5kZXggY2Q2OWE2MS4uZGZiNDc1YiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb24uamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9VbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNyArMTgsMTkgQEAKIAogCiAvKioKLSAqIFRocm93biB3aGVuIHRyeWluZyB0byB1c2UgYW4gdW5yZXNvbHZlZCBuZXR3b3JrIGFkZHJlc3MgaW4gYSBuZXR3b3JrCi0gKiBvcGVyYXRpb24uCisgKiBBbiB7QGNvZGUgVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRyeWluZyB0byB1c2UgYW4KKyAqIHVucmVzb2x2ZWQgbmV0d29yayBhZGRyZXNzIGluIGEgbmV0d29yayBvcGVyYXRpb24uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjEzNjk1OTA5MzYyMDc5NDE0OEw7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIFVucmVzb2x2ZWRBZGRyZXNzRXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9VbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9VbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uLmphdmEKaW5kZXggMjllNjg0MC4uYmE2MTNhYyAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbi5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1Vuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24uamF2YQpAQCAtMTgsMTYgKzE4LDE5IEBACiAKIAogLyoqCi0gKiBUaHJvd24gd2hlbiBjb25uZWN0aW5nIG9yIGJpbmRpbmcgdG8gYW4gdW5zdXBwb3J0ZWQgYWRkcmVzcyB0eXBlLgorICogQW4ge0Bjb2RlIFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGNvbm5lY3Rpbmcgb3IKKyAqIGJpbmRpbmcgdG8gYW4gdW5zdXBwb3J0ZWQgYWRkcmVzcyB0eXBlLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI5NjQzMjM4NDI4Mjk3MDA0OTNMOwogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHtAY29kZSBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1dyaXRhYmxlQnl0ZUNoYW5uZWwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL1dyaXRhYmxlQnl0ZUNoYW5uZWwuamF2YQppbmRleCBjY2ZhNTU4Li5mOGVhNzdmIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9Xcml0YWJsZUJ5dGVDaGFubmVsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvV3JpdGFibGVCeXRlQ2hhbm5lbC5qYXZhCkBAIC0yMSwxMyArMjEsMTUgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiAvKioKLSAqIEEgV3JpdGFibGVCeXRlQ2hhbm5lbCBpcyBhIHR5cGUgb2YgQ2hhbm5lbCB0aGF0IGNhbiB3cml0ZSBieXRlcy4KKyAqIEEge0Bjb2RlIFdyaXRhYmxlQnl0ZUNoYW5uZWx9IGlzIGEgdHlwZSBvZiB7QGxpbmsgQ2hhbm5lbH0gdGhhdCBjYW4gd3JpdGUKKyAqIGJ5dGVzLgogICogPHA+Ci0gKiBXcml0ZXMgYXJlIHN5bmNocm9ub3VzIG9uIGEgV3JpdGFibGVCeXRlQ2hhbm5lbCwgdGhhdCBpcywgaWYgYSB3cml0ZSBpcwotICogYWxyZWFkeSBpbiBwcm9ncmVzcyBvbiB0aGUgY2hhbm5lbCB0aGVuIHN1YnNlcXVlbnQgd3JpdGVzIHdpbGwgYmxvY2sgdW50aWwKLSAqIHRoZSBmaXJzdCB3cml0ZSBjb21wbGV0ZXMuIEl0IGlzIHVuZGVmaW5lZCB3aGV0aGVyIG5vbi13cml0ZSBvcGVyYXRpb25zIHdpbGwKLSAqIGJsb2NrLgorICogV3JpdGUgb3BlcmF0aW9ucyBhcmUgc3luY2hyb25vdXMgb24gYSB7QGNvZGUgV3JpdGFibGVCeXRlQ2hhbm5lbH0sIHRoYXQgaXMsCisgKiBpZiBhIHdyaXRlIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3Mgb24gdGhlIGNoYW5uZWwgdGhlbiBzdWJzZXF1ZW50IHdyaXRlcyB3aWxsCisgKiBibG9jayB1bnRpbCB0aGUgZmlyc3Qgd3JpdGUgY29tcGxldGVzLiBJdCBpcyB1bmRlZmluZWQgd2hldGhlciBub24td3JpdGUKKyAqIG9wZXJhdGlvbnMgd2lsbCBibG9jay4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVCeXRlQ2hhbm5lbCBleHRlbmRzIENoYW5uZWwgewogCkBAIC02Myw2ICs2NSw3IEBACiAgICAgICogICAgICAgICAgICAgd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGFub3RoZXIgSU8gZXhjZXB0aW9uIG9jY3VycywgZGV0YWlscyBhcmUgaW4gdGhlIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvcGFja2FnZS5odG1sIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvcGFja2FnZS5odG1sCmluZGV4IDQ1NGI2NzEuLjdjYTFhNDggMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3BhY2thZ2UuaHRtbAorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9wYWNrYWdlLmh0bWwKQEAgLTMsNyArMyw4IEBACiAgICAgPHA+CiAgICAgICBDaGFubmVscyBwcm92aWRlIGEgd2F5IHRvIGNvbm5lY3QgdG8gc291cmNlcyBvZiBkYXRhIHN1Y2ggYXMKICAgICAgIGZpbGVzLCBzb2NrZXRzIG9yIG90aGVyIHN0cnVjdHVyZXMgdGhhdCBhbGxvdyBpbnB1dCBhbmQvb3Igb3V0cHV0IG9mCi0gICAgICBkYXRhLiBUaGUgc2VsZWN0b3Igc3VwcG9ydHMgbXVsdGlwbGV4aW5nIG9mIG5vbi1ibG9ja2luZyBjaGFubmVscy4KKyAgICAgIGRhdGEuIFNlbGVjdG9ycyBzdXBwb3J0IG11bHRpcGxleGluZyBvZiBub24tYmxvY2tpbmcgY2hhbm5lbHMuCiAgICAgPC9wPgorICAgIEBzaW5jZSBBbmRyb2lkIDEuMAogICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RJbnRlcnJ1cHRpYmxlQ2hhbm5lbC5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwuamF2YQppbmRleCBiZWQ2ZGI4Li44Zjg0ZTEwOSAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RJbnRlcnJ1cHRpYmxlQ2hhbm5lbC5qYXZhCkBAIC0yNywxNSArMjcsMTcgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CiAKIC8qKgotICogVGhpcyBjbGFzcyByb290cyB0aGUgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJydXB0aWJsZSBjaGFubmVscy4KKyAqIHtAY29kZSBBYnN0cmFjdEludGVycnVwdGlibGVDaGFubmVsfSBpcyB0aGUgcm9vdCBjbGFzcyBmb3IgaW50ZXJydXB0aWJsZQorICogY2hhbm5lbHMuCiAgKiA8cD4KICAqIFRoZSBiYXNpYyB1c2FnZSBwYXR0ZXJuIGZvciBhbiBpbnRlcnJ1cHRpYmxlIGNoYW5uZWwgaXMgdG8gaW52b2tlCi0gKiA8Y29kZT5iZWdpbigpPC9jb2RlPiBiZWZvcmUgYW55IElPIG9wZXJhdGlvbnMsIHRoZW4KLSAqIDxjb2RlPmVuZChib29sZWFuKTwvY29kZT4gYWZ0ZXIgY29tcGxldGluZyB0aGUgb3BlcmF0aW9uLiBUaGUgYXJndW1lbnQgdG8KLSAqIHRoZSBlbmQgbWV0aG9kIHNob3dzIHdoZXRoZXIgdGhlcmUgaGFzIGJlZW4gYW55IGNoYW5nZSB0byB0aGUgamF2YQotICogZW52aXJvbm1lbnQgdGhhdCBpcyB2aXNpYmxlIHRvIHRoZSBBUEkgdXNlci4KKyAqIHtAY29kZSBiZWdpbigpfSBiZWZvcmUgYW55IEkvTyBvcGVyYXRpb24gdGhhdCBwb3RlbnRpYWxseSBibG9ja3MKKyAqIGluZGVmaW5pdGVseSwgdGhlbiB7QGNvZGUgZW5kKGJvb2xlYW4pfSBhZnRlciBjb21wbGV0aW5nIHRoZSBvcGVyYXRpb24uIFRoZQorICogYXJndW1lbnQgdG8gdGhlIHtAY29kZSBlbmR9IG1ldGhvZCBzaG91bGQgaW5kaWNhdGUgaWYgdGhlIEkvTyBvcGVyYXRpb24gaGFzCisgKiBhY3R1YWxseSBjb21wbGV0ZWQgc28gdGhhdCBhbnkgY2hhbmdlIG1heSBiZSB2aXNpYmxlIHRvIHRoZSBpbnZva2VyLgogICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwgaW1wbGVtZW50cyBDaGFubmVsLAogICAgICAgICBJbnRlcnJ1cHRpYmxlQ2hhbm5lbCB7CkBAIC02NywyOSArNjksNDIgQEAKIAogICAgIC8qKgogICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGFubmVsIGlzIG9wZW4uCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjaGFubmVsIGlzIG9wZW4uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFubmVsIGlzIG9wZW4sIGFuZCBmYWxzZSBpZiBpdCBpcyBjbG9zZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjaGFubmVsIGlzIG9wZW4sIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMKKyAgICAgKiAgICAgICAgIGNsb3NlZC4KICAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWwjaXNPcGVuKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIGJvb2xlYW4gaXNPcGVuKCkgewogICAgICAgICByZXR1cm4gIWNsb3NlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIGNoYW5uZWwuCisgICAgICogQ2xvc2VzIGFuIG9wZW4gY2hhbm5lbC4gSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQgdGhlbiB0aGlzIG1ldGhvZAorICAgICAqIGhhcyBubyBlZmZlY3QsIG90aGVyd2lzZSBpdCBjbG9zZXMgdGhlIHJlY2VpdmVyIHZpYSB0aGUKKyAgICAgKiB7QGNvZGUgaW1wbENsb3NlQ2hhbm5lbH0gbWV0aG9kLgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkIHRoZW4gdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCwKLSAgICAgKiBvdGhlcndpc2UgaXQgY2xvc2VzIHRoZSByZWNlaXZlciB2aWEgdGhlIGltcGxDbG9zZUNoYW5uZWwgbWV0aG9kLgorICAgICAqIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbiBvbiBhIGNsb3NlZCBjaGFubmVsIHRoZW4gYQorICAgICAqIHtAbGluayBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIG11bHRpcGxlIHRocmVhZHMgYXR0ZW1wdCB0byBzaW11bHRhbmVvdXNseSBjbG9zZSBhIGNoYW5uZWwsIHRoZW4gb25seQorICAgICAqIG9uZSB0aHJlYWQgd2lsbCBydW4gdGhlIGNsb3N1cmUgY29kZSBhbmQgdGhlIG90aGVycyB3aWxsIGJlIGJsb2NrZWQgdW50aWwKKyAgICAgKiB0aGUgZmlyc3Qgb25lIGNvbXBsZXRlcy4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsI2Nsb3NlKCkKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoaXMgY2hhbm5lbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghY2xvc2VkKSB7CkBAIC0xMDMsMTAgKzExOCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN0YXJ0IGFuIElPIG9wZXJhdGlvbiB0aGF0IGlzIHBvdGVudGlhbGx5IGJsb2NraW5nLgotICAgICAqIDxwPgotICAgICAqIE9uY2UgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBpbnZva2UgYQotICAgICAqIGNvcnJlc3BvbmRpbmcgPGNvZGU+ZW5kKGJvb2xlYW4pPC9jb2RlPi4KKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGNvZGUgc2VjdGlvbiB0aGF0IGluY2x1ZGVzIGFuIEkvTyBvcGVyYXRpb24KKyAgICAgKiB0aGF0IGlzIHBvdGVudGlhbGx5IGJsb2NraW5nLiBBZnRlciB0aGlzIG9wZXJhdGlvbiwgdGhlIGFwcGxpY2F0aW9uCisgICAgICogc2hvdWxkIGludm9rZSB0aGUgY29ycmVzcG9uZGluZyB7QGNvZGUgZW5kKGJvb2xlYW4pfSBtZXRob2QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYmVnaW4oKSB7CiAgICAgICAgIC8vIEZJWE1FOiBiZSBhY2NvbW1vZGF0ZSBiZWZvcmUgVk0gYWN0dWFsbHkgcHJvdmlkZXMKQEAgLTEzMSwxNiArMTQ3LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5kIGFuIElPIG9wZXJhdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHN0YXJ0ZWQgd2l0aCA8Y29kZT5iZWdpbigpPC9jb2RlPi4KKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGVuZCBvZiBhIGNvZGUgc2VjdGlvbiB0aGF0IGhhcyBiZWVuIHN0YXJ0ZWQgd2l0aAorICAgICAqIHtAY29kZSBiZWdpbigpfSBhbmQgdGhhdCBpbmNsdWRlcyBhIHBvdGVudGlhbGx5IGJsb2NraW5nIEkvTyBvcGVyYXRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAgIHBhc3MgdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBhbmQgaGFkIGEgc2lkZSBlZmZlY3Qgb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBKYXZhIHN5c3RlbSwgb3IgZmFsc2UgaWYgbm90LgorICAgICAqICAgICAgICAgICAgcGFzcyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBoYXMgc3VjY2VlZGVkIGFuZAorICAgICAqICAgICAgICAgICAgaGFzIGhhZCBhIG5vdGljZWFibGUgZWZmZWN0OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgdGhlIGNoYW5uZWwgd2FzIGNsb3NlZCB3aGlsZSB0aGUgSU8gb3BlcmF0aW9uIHdhcyBpbgotICAgICAqICAgICAgICAgICAgIHByb2dyZXNzLgotICAgICAqIEB0aHJvd3MgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aGUgdGhyZWFkIGNvbmR1Y3RpbmcgdGhlIElPIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIGlzIGV4ZWN1dGluZy4KKyAgICAgKiBAdGhyb3dzIENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY2FsbGluZyB0aHJlYWQgd2hpbGUgdGhpcworICAgICAqICAgICAgICAgICAgIG1ldGhvZCBpcyBleGVjdXRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5kKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uIHsKICAgICAgICAgLy8gRklYTUU6IGJlIGFjY29tbW9kYXRlIGJlZm9yZSBWTSBhY3R1YWxseSBwcm92aWRlcwpAQCAtMTYzLDE4ICsxODIsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRzIHRoZSBjbG9zZSBjaGFubmVsIGJlaGF2aW9yLgorICAgICAqIEltcGxlbWVudHMgdGhlIGNoYW5uZWwgY2xvc2luZyBiZWhhdmlvci4KICAgICAgKiA8cD4KICAgICAgKiBDbG9zZXMgdGhlIGNoYW5uZWwgd2l0aCBhIGd1YXJhbnRlZSB0aGF0IHRoZSBjaGFubmVsIGlzIG5vdCBjdXJyZW50bHkKLSAgICAgKiBjbG9zZWQgdmlhIDxjb2RlPmNsb3NlKCk8L2NvZGU+IGFuZCB0aGF0IHRoZSBtZXRob2QgaXMgdGhyZWFkLXNhZmUuCisgICAgICogY2xvc2VkIHRocm91Z2ggYW5vdGhlciBpbnZvY2F0aW9uIG9mIHtAY29kZSBjbG9zZSgpfSBhbmQgdGhhdCB0aGUgbWV0aG9kCisgICAgICogaXMgdGhyZWFkLXNhZmUuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIGFueSBvdXRzdGFuZGluZyB0aHJlYWRzIGJsb2NrZWQgb24gSU8gb3BlcmF0aW9ucyBvbiB0aGlzIGNoYW5uZWwgbXVzdCBiZQotICAgICAqIHJlbGVhc2VkIHdpdGggZWl0aGVyIGEgbm9ybWFsIHJldHVybiBjb2RlLCBvciBhbgotICAgICAqIDxjb2RlPkFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBBbnkgb3V0c3RhbmRpbmcgdGhyZWFkcyBibG9ja2VkIG9uIEkvTyBvcGVyYXRpb25zIG9uIHRoaXMgY2hhbm5lbCBtdXN0IGJlCisgICAgICogcmVsZWFzZWQgd2l0aCBlaXRoZXIgYSBub3JtYWwgcmV0dXJuIGNvZGUsIG9yIGJ5IHRocm93aW5nIGFuCisgICAgICoge0Bjb2RlIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9ufS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgY2xvc2luZyB0aGUgY2hhbm5lbC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW1wbENsb3NlQ2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbC5qYXZhCmluZGV4IDk3MTg0YTIuLmE5YmVlNTIgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwuamF2YQpAQCAtMjksMTIgKzI5LDExIEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIHNlbGVjdGFibGUgY2hhbm5lbHMuCi0gKiA8cD4KLSAqIEluIHRoaXMgY2xhc3MsIHRoZXJlIGFyZSBtZXRob2RzIGFib3V0IHJlZ2lzdGVyaW5nL2RlcmVnaXN0ZXJpbmcgYSBjaGFubmVsLAotICogYWJvdXQgY2hhbm5lbCBjbG9zaW5nLiBJdCByZWFsaXplIHRoZSBtdWx0aS10aHJlYWQgc2FmZS4KLSAqIDwvcD4KKyAqIHtAY29kZSBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsfSBpcyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IKKyAqIHNlbGVjdGFibGUgY2hhbm5lbHMuIEl0IGRlY2xhcmVzIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nLCB1bnJlZ2lzdGVyaW5nIGFuZAorICogY2xvc2luZyBzZWxlY3RhYmxlIGNoYW5uZWxzLiBJdCBpcyB0aHJlYWQtc2FmZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsIGV4dGVuZHMgU2VsZWN0YWJsZUNoYW5uZWwgewogCkBAIC01MywxMCArNTIsMTEgQEAKICAgICBib29sZWFuIGlzQmxvY2tpbmcgPSB0cnVlOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3MuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNlbGVjdG9yUHJvdmlkZXIKLSAgICAgKiAgICAgICAgICAgIEEgaW5zdGFuY2Ugb2YgU2VsZWN0b3JQcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNlbGVjdG9yIHByb3ZpZGVyIHRoYXQgY3JlYXRlcyB0aGlzIGNoYW5uZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwoU2VsZWN0b3JQcm92aWRlciBzZWxlY3RvclByb3ZpZGVyKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC02NCwyNCArNjQsMzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIFNlbGVjdG9yUHJvdmlkZXIgb2YgdGhpcyBjaGFubmVsLgorICAgICAqIFJldHVybnMgdGhlIHNlbGVjdG9yIHByb3ZpZGVyIHRoYXQgaGFzIGNyZWF0ZWQgdGhpcyBjaGFubmVsLgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWwjcHJvdmlkZXIoKQotICAgICAqIEByZXR1cm4gVGhlIHByb3ZpZGVyIG9mIHRoaXMgY2hhbm5lbC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgY2hhbm5lbCdzIHNlbGVjdG9yIHByb3ZpZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTZWxlY3RvclByb3ZpZGVyIHByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbCNpc1JlZ2lzdGVyZWQoKQorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2hhbm5lbCBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9yIG1vcmUgc2VsZWN0b3JzLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgY2hhbm5lbCBpcyByZWdpc3RlcmVkIHdpdGggYSBzZWxlY3RvciwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHN5bmNocm9uaXplZCBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoKSB7CiAgICAgICAgIHJldHVybiAha2V5TGlzdC5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbCNrZXlGb3IoamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IpCisgICAgICogR2V0cyB0aGlzIGNoYW5uZWwncyBzZWxlY3Rpb24ga2V5IGZvciB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvcgorICAgICAqICAgICAgICAgICAgdGhlIHNlbGVjdG9yIHdpdGggd2hpY2ggdGhpcyBjaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisgICAgICogQHJldHVybiB0aGUgc2VsZWN0aW9uIGtleSBmb3IgdGhlIGNoYW5uZWwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgY2hhbm5lbAorICAgICAqICAgICAgICAgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB7QGNvZGUgc2VsZWN0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHN5bmNocm9uaXplZCBwdWJsaWMgZmluYWwgU2VsZWN0aW9uS2V5IGtleUZvcihTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleUxpc3Quc2l6ZSgpOyBpKyspIHsKQEAgLTk0LDE4ICsxMDUsMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFsaXplIHRoZSByZWdpc3RlciBmdW5jdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCByZWdpc3RlcnMgY3VycmVudCBjaGFubmVsIHRvIHRoZSBzZWxlY3RvciwgdGhlbiBhbnN3ZXIgdGhlIHNlbGVjdGlvbgotICAgICAqIGtleS4gVGhlIGNoYW5uZWwgbXVzdCBiZSBvcGVuIGFuZCB0aGUgaW50ZXJlc3Qgb3Agc2V0IG11c3QgYmUgdmFsaWQuIElmCi0gICAgICogdGhlIGN1cnJlbnQgY2hhbm5lbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgdG8gdGhlIHNlbGVjdG9yLCB0aGUgbWV0aG9kCi0gICAgICogb25seSBzZXQgdGhlIG5ldyBpbnRlcmVzdCBvcCBzZXQ7IG90aGVyd2lzZSBpdCB3aWxsIGNhbGwgdGhlCi0gICAgICogPGNvZGU+cmVnaXN0ZXI8L2NvZGU+IGluIDxjb2RlPnNlbGVjdG9yPC9jb2RlPiwgYW5kIGFkZCB0aGUgcmVsYXRpdmUKLSAgICAgKiBrZXkgdG8gdGhlIGtleSBzZXQgb2YgdGhlIGN1cnJlbnQgY2hhbm5lbC4KLSAgICAgKiA8L3A+CisgICAgICogUmVnaXN0ZXJzIHRoaXMgY2hhbm5lbCB3aXRoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBpbnRlcmVzdCBzZXQuIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZWxlY3RvciwgdGhlCisgICAgICoge0BsaW5rIFNlbGVjdGlvbktleSBpbnRlcmVzdCBzZXR9IGlzIHVwZGF0ZWQgdG8ge0Bjb2RlIGludGVyZXN0U2V0fSBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBzZWxlY3Rpb24ga2V5IGlzIHJldHVybmVkLiBJZiB0aGUgY2hhbm5lbCBpcyBub3QgeWV0CisgICAgICogcmVnaXN0ZXJlZCwgdGhpcyBtZXRob2QgY2FsbHMgdGhlIHtAY29kZSByZWdpc3Rlcn0gbWV0aG9kIG9mCisgICAgICoge0Bjb2RlIHNlbGVjdG9yfSBhbmQgYWRkcyB0aGUgc2VsZWN0aW9uIGtleSB0byB0aGlzIGNoYW5uZWwncyBrZXkgc2V0LgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWwjcmVnaXN0ZXIoamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IsCi0gICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICogQHBhcmFtIHNlbGVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgc2VsZWN0b3Igd2l0aCB3aGljaCB0byByZWdpc3RlciB0aGlzIGNoYW5uZWwuCisgICAgICogQHBhcmFtIGludGVyZXN0U2V0CisgICAgICogICAgICAgICAgICB0aGlzIGNoYW5uZWwncyB7QGxpbmsgU2VsZWN0aW9uS2V5IGludGVyZXN0IHNldH0uCisgICAgICogQHBhcmFtIGF0dGFjaG1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYXR0YWNoLCBjYW4gYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIHRoaXMgcmVnaXN0cmF0aW9uLgorICAgICAqIEB0aHJvd3MgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgYnV0IGl0cyBrZXkgaGFzIGJlZW4gY2FuY2VsZWQuCisgICAgICogQHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbnRlcmVzdFNldH0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNoYW5uZWwuCisgICAgICogQHRocm93cyBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBjaGFubmVsIGlzIGluIGJsb2NraW5nIG1vZGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBwcm92aWRlciBhcyB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgICBzZWxlY3Rvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU2VsZWN0aW9uS2V5IHJlZ2lzdGVyKFNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgaW50ZXJlc3RTZXQsCiAgICAgICAgICAgICBPYmplY3QgYXR0YWNobWVudCkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24gewpAQCAtMTQ5LDkgKzE3NCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEltcGxlbWVudCB0aGUgY2xvc2luZyBmdW5jdGlvbi4KKyAgICAgKiBJbXBsZW1lbnRzIHRoZSBjaGFubmVsIGNsb3NpbmcgYmVoYXZpb3IuIENhbGxzCisgICAgICoge0Bjb2RlIGltcGxDbG9zZVNlbGVjdGFibGVDaGFubmVsKCl9IGZpcnN0LCB0aGVuIGxvb3BzIHRocm91Z2ggdGhlIGxpc3QKKyAgICAgKiBvZiBzZWxlY3Rpb24ga2V5cyBhbmQgY2FuY2VscyB0aGVtLCB3aGljaCB1bnJlZ2lzdGVycyB0aGlzIGNoYW5uZWwgZnJvbQorICAgICAqIGFsbCBzZWxlY3RvcnMgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoLgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwjaW1wbENsb3NlQ2hhbm5lbCgpCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGUgY2hhbm5lbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBzeW5jaHJvbml6ZWQgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW1wbENsb3NlQ2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGltcGxDbG9zZVNlbGVjdGFibGVDaGFubmVsKCk7CkBAIC0xNjQsMTUgKzE5NCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEltcGxlbWVudCB0aGUgY2xvc2luZyBmdW5jdGlvbiBvZiB0aGUgU2VsZWN0YWJsZUNoYW5uZWwuCisgICAgICogSW1wbGVtZW50cyB0aGUgY2xvc2luZyBmdW5jdGlvbiBvZiB0aGUgU2VsZWN0YWJsZUNoYW5uZWwuIFRoaXMgbWV0aG9kIGlzCisgICAgICogY2FsbGVkIGZyb20ge0Bjb2RlIGltcGxDbG9zZUNoYW5uZWwoKX0uCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSS9PIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbXBsQ2xvc2VTZWxlY3RhYmxlQ2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWwjaXNCbG9ja2luZygpCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjaGFubmVsIGlzIGluIGJsb2NraW5nIG1vZGUuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjaGFubmVsIGlzIGJsb2NraW5nLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCbG9ja2luZygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChibG9ja2luZ0xvY2spIHsKQEAgLTE4MSwxOSArMjE3LDM0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbCNibG9ja2luZ0xvY2soKQorICAgICAqIEdldHMgdGhlIG9iamVjdCB1c2VkIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9mIHtAY29kZSByZWdpc3Rlcn0gYW5kCisgICAgICoge0Bjb2RlIGNvbmZpZ3VyZUJsb2NraW5nfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgYmxvY2tpbmdMb2NrKCkgewogICAgICAgICByZXR1cm4gYmxvY2tpbmdMb2NrOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgYmxvY2tpbmcgbW9kZSBvZiB0aGlzIGNoYW5uZWwuCisgICAgICogU2V0cyB0aGUgYmxvY2tpbmcgbW9kZSBvZiB0aGlzIGNoYW5uZWwuIEEgY2FsbCB0byB0aGlzIG1ldGhvZCBibG9ja3MgaWYKKyAgICAgKiBvdGhlciBjYWxscyB0byB0aGlzIG1ldGhvZCBvciB0byB7QGNvZGUgcmVnaXN0ZXJ9IGFyZSBleGVjdXRpbmcuIFRoZQorICAgICAqIGFjdHVhbCBzZXR0aW5nIG9mIHRoZSBtb2RlIGlzIGRvbmUgYnkgY2FsbGluZworICAgICAqIHtAY29kZSBpbXBsQ29uZmlndXJlQmxvY2tpbmcoYm9vbGVhbil9LgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWwjY29uZmlndXJlQmxvY2tpbmcoYm9vbGVhbikKICAgICAgKiBAcGFyYW0gYmxvY2tpbmdNb2RlCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYmxvY2tpbmcgbW9kZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICAgICBmb3Igbm9uLWJsb2NraW5nIG1vZGUuCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gZm9yIHNldHRpbmcgdGhpcyBjaGFubmVsJ3MgbW9kZSB0byBibG9ja2luZywKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gdG8gc2V0IGl0IHRvIG5vbi1ibG9ja2luZy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgY2hhbm5lbC4KKyAgICAgKiBAdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNoYW5uZWwgaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBibG9ja30gaXMge0Bjb2RlIHRydWV9IGFuZCB0aGlzIGNoYW5uZWwgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgICAgICByZWdpc3RlcmVkIHdpdGggYXQgbGVhc3Qgb25lIHNlbGVjdG9yLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTZWxlY3RhYmxlQ2hhbm5lbCBjb25maWd1cmVCbG9ja2luZyhib29sZWFuIGJsb2NraW5nTW9kZSkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yMTUsMTMgKzI2NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEltcGxlbWVudCB0aGUgc2V0dGluZyBvZiBibG9ja2luZyBtb2RlLgorICAgICAqIEltcGxlbWVudHMgdGhlIHNldHRpbmcgb2YgdGhlIGJsb2NraW5nIG1vZGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJsb2NraW5nTW9kZQotICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGJsb2NraW5nIG1vZGU7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgICAgZm9yIG5vbi1ibG9ja2luZyBtb2RlLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGZvciBzZXR0aW5nIHRoaXMgY2hhbm5lbCdzIG1vZGUgdG8gYmxvY2tpbmcsCisgICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IHRvIHNldCBpdCB0byBub24tYmxvY2tpbmcuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSS9PIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGltcGxDb25maWd1cmVCbG9ja2luZyhib29sZWFuIGJsb2NraW5nTW9kZSkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdGlvbktleS5qYXZhIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0aW9uS2V5LmphdmEKaW5kZXggYmNhMWY4Ny4uZTgzOTEyNiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0aW9uS2V5LmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0aW9uS2V5LmphdmEKQEAgLTE5LDExICsxOSwxMCBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKIAogLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3Igc2VsZWN0aW9uIGtleS4KLSAqIDxwPgotICogVGhlIGNsYXNzIHRha2VzIGNoYXJnZSBvZiB0aGUgdmFsaWRhdGlvbiBhbmQgY2FuY2VsbGF0aW9uIG9mIGtleS4KLSAqIDwvcD4KLSAqIAorICoge0Bjb2RlIEFic3RyYWN0U2VsZWN0aW9uS2V5fSBpcyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc2VsZWN0aW9uIGtleXMuCisgKiBJdCBpbXBsZW1lbnRzIHZhbGlkYXRpb24gYW5kIGNhbmNlbGxhdGlvbiBtZXRob2RzLgorICoKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWxlY3Rpb25LZXkgZXh0ZW5kcyBTZWxlY3Rpb25LZXkgewogCkBAIC0zMywyMyArMzIsMzQgQEAKICAgICBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3MuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQWJzdHJhY3RTZWxlY3Rpb25LZXl9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBBYnN0cmFjdFNlbGVjdGlvbktleSgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSNpc1ZhbGlkKCkKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGtleSBpcyB2YWxpZC4gQSBrZXkgaXMgdmFsaWQgYXMgbG9uZyBhcyBpdCBoYXMgbm90CisgICAgICogYmVlbiBjYW5jZWxlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGtleSBoYXMgbm90IGJlZW4gY2FuY2VsZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKCkgewogICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoaXMga2V5IGFuZCBhZGRzIGl0IHRvIHRoZSBjYW5jZWxsZWQga2V5IHNldC4KKyAgICAgKiBDYW5jZWxzIHRoaXMga2V5LgorICAgICAqIDxwPgorICAgICAqIEEga2V5IHRoYXQgaGFzIGJlZW4gY2FuY2VsZWQgaXMgbm8gbG9uZ2VyIHZhbGlkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uCisgICAgICogYW4gYWxyZWFkeSBjYW5jZWxlZCBrZXkgZG9lcyBub3RoaW5nLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSNjYW5jZWwoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNhbmNlbCgpIHsKICAgICAgICAgaWYgKGlzVmFsaWQpIHsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdG9yLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3Rvci5qYXZhCmluZGV4IGE3NDRmYjguLmFkZWYyNDMgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdG9yLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0b3IuamF2YQpAQCAtMjQsMTMgKzI0LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3Igc2VsZWN0b3JzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHJlYWxpemVzIHRoZSBpbnRlcnJ1cHRpb24gb2Ygc2VsZWN0aW9uIGJ5IDxjb2RlPmJlZ2luPC9jb2RlPiBhbmQKLSAqIDxjb2RlPmVuZDwvY29kZT4uIEl0IGFsc28gaG9sZHMgdGhlIGNhbmNlbGxlZCBhbmQgdGhlIGRlbGV0aW9uIG9mIHRoZSBrZXkKKyAqIHtAY29kZSBBYnN0cmFjdFNlbGVjdG9yfSBpcyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc2VsZWN0b3JzLgorICogSXQgcmVhbGl6ZXMgdGhlIGludGVycnVwdGlvbiBvZiBzZWxlY3Rpb24gYnkge0Bjb2RlIGJlZ2lufSBhbmQKKyAqIHtAY29kZSBlbmR9LiBJdCBhbHNvIGhvbGRzIHRoZSBjYW5jZWxsYXRpb24gYW5kIHRoZSBkZWxldGlvbiBvZiB0aGUga2V5CiAgKiBzZXQuCi0gKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWxlY3RvciBleHRlbmRzIFNlbGVjdG9yIHsKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNPcGVuID0gdHJ1ZTsKQEAgLTQzLDE5ICs0MiwyNCBAQAogICAgIHByaXZhdGUgU2V0PFNlbGVjdGlvbktleT4gY2FuY2VsbGVkS2V5c1NldCA9IG5ldyBIYXNoU2V0PFNlbGVjdGlvbktleT4oKTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGlzIGNsYXNzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFic3RyYWN0U2VsZWN0b3J9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZWxlY3RvclByb3ZpZGVyCi0gICAgICogICAgICAgICAgICBBIGluc3RhbmNlIG9mIFNlbGVjdG9yUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWxlY3RvciBwcm92aWRlciB0aGF0IGNyZWF0ZXMgdGhpcyBzZWxlY3Rvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTZWxlY3RvcihTZWxlY3RvclByb3ZpZGVyIHNlbGVjdG9yUHJvdmlkZXIpIHsKICAgICAgICAgcHJvdmlkZXIgPSBzZWxlY3RvclByb3ZpZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIGNoYW5uZWwuCisgICAgICogQ2xvc2VzIHRoaXMgc2VsZWN0b3IuIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpZiB0aGlzIHNlbGVjdG9yIGlzCisgICAgICogYWxyZWFkeSBjbG9zZWQuIFRoZSBhY3R1YWwgY2xvc2luZyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgaW4KKyAgICAgKiB7QGNvZGUgaW1wbENsb3NlU2VsZWN0b3IoKX0uCiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciNjbG9zZSgpCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzT3BlbikgewpAQCAtNjgsNTQgKzcyLDYzIEBACiAgICAgICogSW1wbGVtZW50cyB0aGUgY2xvc2luZyBvZiB0aGlzIGNoYW5uZWwuCiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSS9PIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbXBsQ2xvc2VTZWxlY3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IjaXNPcGVuKCkKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHNlbGVjdG9yIGlzIG9wZW4uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzZWxlY3RvciBpcyBub3QgY2xvc2VkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcGVuKCkgewogICAgICAgICByZXR1cm4gaXNPcGVuOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNlbGVjdG9yUHJvdmlkZXIgb2YgdGhpcyBjaGFubmVsLgorICAgICAqIEdldHMgdGhpcyBzZWxlY3RvcidzIHByb3ZpZGVyLgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IjcHJvdmlkZXIoKQorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG9mIHRoaXMgc2VsZWN0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFNlbGVjdG9yUHJvdmlkZXIgcHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYW5jZWxsZWQga2V5IHNldCBvZiB0aGlzIGNoYW5uZWwuCisgICAgICogUmV0dXJucyB0aGlzIGNoYW5uZWwncyBzZXQgb2YgY2FuY2VsZWQgc2VsZWN0aW9uIGtleXMuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgY2FuY2VsbGVkIGtleSBzZXQuCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGNhbmNlbGVkIHNlbGVjdGlvbiBrZXlzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8U2VsZWN0aW9uS2V5PiBjYW5jZWxsZWRLZXlzKCkgewogICAgICAgICByZXR1cm4gY2FuY2VsbGVkS2V5c1NldDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBjaGFubmVsIHRvIHRoaXMgc2VsZWN0b3IuCisgICAgICogUmVnaXN0ZXJzIGEgY2hhbm5lbCB3aXRoIHRoaXMgc2VsZWN0b3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYW5uZWwKLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGFubmVsIHRvIGJlIHJlZ2lzdGVyZWQuCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbCB0byBiZSByZWdpc3RlcmVkLgogICAgICAqIEBwYXJhbSBvcGVyYXRpb25zCi0gICAgICogICAgICAgICAgICBUaGUgaW50ZXJlc3Qgc2V0LgorICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBTZWxlY3Rpb25LZXkgaW50ZXJlc3Qgc2V0fSBvZiB7QGNvZGUgY2hhbm5lbH0uCiAgICAgICogQHBhcmFtIGF0dGFjaG1lbnQKLSAgICAgKiAgICAgICAgICAgIFRoZSBhdHRhY2htZW50IG9mIHRoZSBrZXkuCi0gICAgICogQHJldHVybiBUaGUga2V5IHJlbGF0ZWQgd2l0aCB0aGUgY2hhbm5lbCBhbmQgdGhlIHNlbGVjdG9yLgorICAgICAqICAgICAgICAgICAgdGhlIGF0dGFjaG1lbnQgZm9yIHRoZSBzZWxlY3Rpb24ga2V5LgorICAgICAqIEByZXR1cm4gdGhlIGtleSByZWxhdGVkIHRvIHRoZSBjaGFubmVsIGFuZCB0aGlzIHNlbGVjdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTZWxlY3Rpb25LZXkgcmVnaXN0ZXIoQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsLAogICAgICAgICAgICAgaW50IG9wZXJhdGlvbnMsIE9iamVjdCBhdHRhY2htZW50KTsKIAogICAgIC8qKgotICAgICAqIERlbGV0ZXMgdGhlIGtleSBmcm9tIGNoYW5uZWwncyBrZXkgc2V0LgorICAgICAqIERlbGV0ZXMgdGhlIGtleSBmcm9tIHRoZSBjaGFubmVsJ3Mga2V5IHNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICBUaGUga2V5LgorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkZXJlZ2lzdGVyKEFic3RyYWN0U2VsZWN0aW9uS2V5IGtleSkgewogICAgICAgICAoKEFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwpIGtleS5jaGFubmVsKCkpLmRlcmVnaXN0ZXIoa2V5KTsKQEAgLTEyMyw3ICsxMzYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIHN0YXJ0cyBhIHBvdGVudGlhbGx5IGJsb2NraW5nIEkvTyBvcGVyYXRpb24KKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGNvZGUgc2VjdGlvbiB0aGF0IGluY2x1ZGVzIGFuIEkvTyBvcGVyYXRpb24KKyAgICAgKiB0aGF0IGlzIHBvdGVudGlhbGx5IGJsb2NraW5nLiBBZnRlciB0aGlzIG9wZXJhdGlvbiwgdGhlIGFwcGxpY2F0aW9uCisgICAgICogc2hvdWxkIGludm9rZSB0aGUgY29ycmVzcG9uZGluZyB7QGNvZGUgZW5kKGJvb2xlYW4pfSBtZXRob2QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYmVnaW4oKSB7CiAgICAgICAgIC8vIEZJWE1FOiBiZSBhY2NvbW1vZGF0ZSBiZWZvcmUgVk0gYWN0dWFsbHkgcHJvdmlkZXMKQEAgLTE0Myw3ICsxNjAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGVuZHMgYSBwb3RlbnRpYWxseSBibG9ja2luZyBJL08gb3BlcmF0aW9uCisgICAgICogSW5kaWNhdGVzIHRoZSBlbmQgb2YgYSBjb2RlIHNlY3Rpb24gdGhhdCBoYXMgYmVlbiBzdGFydGVkIHdpdGgKKyAgICAgKiB7QGNvZGUgYmVnaW4oKX0gYW5kIHRoYXQgaW5jbHVkZXMgYSBwb3RlbnRpYWxseSBibG9ja2luZyBJL08gb3BlcmF0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGVuZCgpIHsKICAgICAgICAgLy8gRklYTUU6IGJlIGFjY29tbW9kYXRlIGJlZm9yZSBWTSBhY3R1YWxseSBwcm92aWRlcwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL1NlbGVjdG9yUHJvdmlkZXIuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9TZWxlY3RvclByb3ZpZGVyLmphdmEKaW5kZXggOTI3MzNjNy4uYjRiMThlMyAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL1NlbGVjdG9yUHJvdmlkZXIuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvU2VsZWN0b3JQcm92aWRlci5qYXZhCkBAIC0zNCwxNiArMzQsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlNlbGVjdG9yUHJvdmlkZXJJbXBsOwogCiAvKioKLSAqIFByb3ZpZGVyIGZvciBuaW8gc2VsZWN0b3IgYW5kIHNlbGVjdGFibGUgY2hhbm5lbC4KKyAqIHtAY29kZSBTZWxlY3RvclByb3ZpZGVyfSBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgZGVjbGFyZXMgbWV0aG9kcyBmb3IKKyAqIHByb3ZpZGluZyBpbnN0YW5jZXMgb2Yge0BsaW5rIERhdGFncmFtQ2hhbm5lbH0sIHtAbGluayBQaXBlfSwKKyAqIHtAbGluayBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rvcn0gLCB7QGxpbmsgU2VydmVyU29ja2V0Q2hhbm5lbH0sIGFuZAorICoge0BsaW5rIFNvY2tldENoYW5uZWx9LiBBbGwgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBhcmUgdGhyZWFkLXNhZmUuCiAgKiA8cD4KLSAqIFRoZSBwcm92aWRlciBjYW4gYmUgZ290IGJ5IHN5c3RlbSBwcm9wZXJ0eSBvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGluIGEgamFyCi0gKiBmaWxlLCBpZiBub3QsIHRoZSBzeXN0ZW0gZGVmYXVsdCBwcm92aWRlciB3aWxsIHJldHVybi4gVGhlIG1haW4gZnVuY3Rpb24gb2YKLSAqIHRoaXMgY2xhc3MgaXMgdG8gcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBvZgotICogPGNvZGU+RGF0YWdyYW1DaGFubmVsPC9jb2RlPiwgPGNvZGU+UGlwZTwvY29kZT4sIDxjb2RlPlNlbGVjdG9yPC9jb2RlPiAsCi0gKiA8Y29kZT5TZXJ2ZXJTb2NrZXRDaGFubmVsPC9jb2RlPiwgYW5kIDxjb2RlPlNvY2tldENoYW5uZWw8L2NvZGU+LiBBbGwKLSAqIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYXJlIG11bHRpLXRocmVhZCBzYWZlLgorICogQSBwcm92aWRlciBpbnN0YW5jZSBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBzeXN0ZW0gcHJvcGVydHkgb3IgdGhlCisgKiBjb25maWd1cmF0aW9uIGZpbGUgaW4gYSBqYXIgZmlsZTsgaWYgbm8gcHJvdmlkZSBpcyBhdmFpbGFibGUgdGhhdCB3YXkgdGhlbgorICogdGhlIHN5c3RlbSBkZWZhdWx0IHByb3ZpZGVyIGlzIHJldHVybmVkLgogICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdG9yUHJvdmlkZXIgZXh0ZW5kcyBPYmplY3QgewogCkBAIC01OCwxMSArNTksMTIgQEAKICAgICBwcml2YXRlIHN0YXRpYyBDaGFubmVsIGluaGVyaXRlZENoYW5uZWw7IAogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3MuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU2VsZWN0b3JQcm92aWRlcn0uCiAgICAgICogCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciwgYW5kIGl0IGRlbmllcwotICAgICAqICAgICAgICAgICAgIFJ1bnRpbWVQZXJtaXNzaW9uKCJzZWxlY3RvclByb3ZpZGVyIikuCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyIGluc3RhbGxlZCB0aGF0IGRvZXMgbm90IHBlcm1pdAorICAgICAqICAgICAgICAgICAgIHRoZSBydW50aW1lIHBlcm1pc3Npb24gbGFiZWxlZCAic2VsZWN0b3JQcm92aWRlciIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNlbGVjdG9yUHJvdmlkZXIoKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC03MywyMSArNzUsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb3ZpZGVyIGJ5IGZvbGxvd2luZyBzdGVwcyBpbiB0aGUgZmlyc3QgY2FsbGluZy4KLSAgICAgKiA8cD4KKyAgICAgKiBHZXRzIGEgcHJvdmlkZXIgaW5zdGFuY2UgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgc3RlcHMgd2hlbiBjYWxsZWQgZm9yCisgICAgICogdGhlIGZpcnN0IHRpbWU6CiAgICAgICogPHVsPgotICAgICAqIDxsaT4gSWYgdGhlIHN5c3RlbSBwcm9wZXJ0eSAiamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIiIGlzCi0gICAgICogc2V0LCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgcmV0dXJuIHByb3ZpZGVyLgotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPklmIHRoZXJlIGlzIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlIG5hbWVkCi0gICAgICogImphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIiBpbiBNRVRBLUlORi9zZXJ2aWNlcyBvZiBzb21lIGphcgotICAgICAqIGZpbGUgdmFsaWQgaW4gdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIsIHRoZSBmaXJzdCBjbGFzcyBuYW1lIGlzIHRoZSByZXR1cm4KLSAgICAgKiBwcm92aWRlcidzIGNsYXNzIG5hbWUuIDwvbGk+Ci0gICAgICogPGxpPiBPdGhlcndpc2UsIGEgc3lzdGVtIGRlZmF1bHQgcHJvdmlkZXIgd2lsbCBiZSByZXR1cm5lZC4gPC9saT4KKyAgICAgKiA8bGk+IGlmIHRoZSBzeXN0ZW0gcHJvcGVydHkgImphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIiBpcworICAgICAqIHNldCwgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHByb3ZpZGVyCisgICAgICogcmV0dXJuZWQ7IDwvbGk+CisgICAgICogPGxpPmlmIHRoZXJlIGlzIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlIG5hbWVkCisgICAgICogImphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIiBpbiBNRVRBLUlORi9zZXJ2aWNlcyBvZiBhIGphcgorICAgICAqIGZpbGUgdmFsaWQgaW4gdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIsIHRoZSBmaXJzdCBjbGFzcyBuYW1lIGlzIHRoZQorICAgICAqIHByb3ZpZGVyJ3MgY2xhc3MgbmFtZTsgPC9saT4KKyAgICAgKiA8bGk+IG90aGVyd2lzZSwgYSBzeXN0ZW0gZGVmYXVsdCBwcm92aWRlciB3aWxsIGJlIHJldHVybmVkLjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgcHJvdmlkZXIuCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgU2VsZWN0b3JQcm92aWRlciBwcm92aWRlcigpIHsKICAgICAgICAgaWYgKG51bGwgPT0gcHJvdmlkZXIpIHsKQEAgLTE5NSw2MiArMTk3LDc2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IG9wZW4gPGNvZGU+RGF0YWdyYW1DaGFubmVsPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IG9wZW4ge0Bjb2RlIERhdGFncmFtQ2hhbm5lbH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgY2hhbm5lbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY2hhbm5lbC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgc29tZSBJL08gZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERhdGFncmFtQ2hhbm5lbCBvcGVuRGF0YWdyYW1DaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPlBpcGU8L2NvZGU+LgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFBpcGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHBpcGUuCisgICAgICogQHJldHVybiB0aGUgbmV3IHBpcGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSS9PIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQaXBlIG9wZW5QaXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IHNlbGVjdG9yLgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2VsZWN0b3IuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IuCisgICAgICogQHJldHVybiB0aGUgbmV3IHNlbGVjdG9yLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBzb21lIEkvTyBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQWJzdHJhY3RTZWxlY3RvciBvcGVuU2VsZWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgb3BlbiA8Y29kZT5TZXJ2ZXJTb2NrZXRDaGFubmVsPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IG9wZW4ge0Bjb2RlIFNlcnZlclNvY2tldENoYW5uZWx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNoYW5uZWwuCisgICAgICogQHJldHVybiB0aGUgbmV3IGNoYW5uZWwuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSS9PIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZXJ2ZXJTb2NrZXRDaGFubmVsIG9wZW5TZXJ2ZXJTb2NrZXRDaGFubmVsKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBvcGVuIDxjb2RlPlNvY2tldENoYW5uZWw8L2NvZGU+LgorICAgICAqIENyZWF0ZSBhIG5ldyBvcGVuIHtAY29kZSBTb2NrZXRDaGFubmVsfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjaGFubmVsLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBjaGFubmVsLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBzb21lIEkvTyBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU29ja2V0Q2hhbm5lbCBvcGVuU29ja2V0Q2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgY2hhbm5lbCBpbmhlcml0ZWQgZnJvbSB0aGUgaW5zdGFuY2Ugd2hpY2ggY3JlYXRlZCB0aGlzIEpWTS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjaGFubmVsIGluaGVyaXRlZCBmcm9tIHRoZSBpbnN0YW5jZSB0aGF0IGNyZWF0ZWQgdGhpcworICAgICAqIHZpcnR1YWwgbWFjaGluZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjaGFubmVsLgorICAgICAqIEByZXR1cm4gdGhlIGNoYW5uZWwuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIHNvbWUgSS9PIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIsIGFuZCBpdCBkZW5pZXMKLSAgICAgKiAgICAgICAgICAgICBSdW50aW1lUGVybWlzc2lvbigic2VsZWN0b3JQcm92aWRlciIpLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciBpbnN0YWxsZWQgdGhhdCBkb2VzIG5vdCBwZXJtaXQKKyAgICAgKiAgICAgICAgICAgICB0aGUgcnVudGltZSBwZXJtaXNzaW9uIGxhYmVsZWQgInNlbGVjdG9yUHJvdmlkZXIiLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGFubmVsIGluaGVyaXRlZENoYW5uZWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbW5nciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKHNtbmdyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNtbmdyLmNoZWNrUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJpbmhlcml0ZWRDaGFubmVsIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgaWYgKG51bGwgPT0gaW5oZXJpdGVkQ2hhbm5lbCkgewogICAgICAgICAgICAgaW5oZXJpdGVkQ2hhbm5lbCA9IFBsYXRmb3JtLmdldE5ldHdvcmtTeXN0ZW0oKS5pbmhlcml0ZWRDaGFubmVsKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9wYWNrYWdlLmh0bWwgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvcGFja2FnZS5odG1sCmluZGV4IGU3YjhhNDkuLmZkZTNkM2UgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9wYWNrYWdlLmh0bWwKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL3BhY2thZ2UuaHRtbApAQCAtMyw1ICszLDYgQEAKICAgICA8cD4KICAgICAgIFNlcnZpY2UtcHJvdmlkZXIgY2xhc3NlcyBmb3IgbmlvIGNoYW5uZWxzLgogICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKICAgPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vcGFja2FnZS5odG1sIGIvbmlvL3NyYy9tYWluL2phdmEvamF2YS9uaW8vcGFja2FnZS5odG1sCmluZGV4IDE3ZDZjZWIuLjQ2YjZhYWYgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL3BhY2thZ2UuaHRtbAorKysgYi9uaW8vc3JjL21haW4vamF2YS9qYXZhL25pby9wYWNrYWdlLmh0bWwKQEAgLTUsMTEgKzUsMTIgQEAKICAgICA8L3A+CiAgICAgPHA+CiAgICAgICBUaGVyZSBhcmUgYnVmZmVycyBmb3IgbW9zdCBwcmltaXRpdmUgZGF0YSB0eXBlcyBzdWNoIGFzCi0gICAgICBGbG9hdEJ1ZmZlciwgSW50QnVmZmVyLCAuLi4gVGhleSBhbGwgZ2l2ZSBtZWFucyB0byBwdXQvZ2V0IGRhdGEgZnJvbSB0aGUKLSAgICAgIGJ1ZmZlcnMsIHRvIGNvbXBhY3QsIHNsaWNlIG9yIGR1cGxpY2F0ZSBpdCwgb3IgdG8gd3JhcCBhbiBleGlzdGluZwotICAgICAgYXJyYXkuIEEgYnVmZmVyIGFsc28gbWFuYWdlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUKLSAgICAgIGJ1ZmZlciwgbGV0cyB5b3UgcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcsIHNraXAgZWxlbWVudHMgb3IgZ28gdG8gdGhlCi0gICAgICBsYXN0IGVsZW1lbnQuCisgICAgICA8Y29kZT5GbG9hdEJ1ZmZlcjwvY29kZT4sIDxjb2RlPkludEJ1ZmZlcjwvY29kZT4sIGV0Yy4gVGhlc2UgY2xhc3NlcworICAgICAgcHJvdmlkZSBtZXRob2RzIHRvIGdldCBhbmQgcHV0IGRhdGEgZnJvbSB0aGUKKyAgICAgIGJ1ZmZlcnMsIHRvIGNvbXBhY3QsIHNsaWNlIG9yIGR1cGxpY2F0ZSB0aGVtLCBvciB0byB3cmFwIGFuIGV4aXN0aW5nCisgICAgICBhcnJheS4gQnVmZmVycyBhbHNvIG1hbmFnZSB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUKKyAgICAgIGJ1ZmZlciwgdGhleSBjYW4gYmUgcmV3b3VuZCB0byB0aGUgYmVnaW5uaW5nIGFuZCBhbGxvdyBza2lwcGluZyBvZiBlbGVtZW50cy4KICAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvRGlyZWN0QnVmZmVyLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL0RpcmVjdEJ1ZmZlci5qYXZhCmluZGV4IGVjMTI2NjUuLjUyYTdiNjUgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvRGlyZWN0QnVmZmVyLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9EaXJlY3RCdWZmZXIuamF2YQpAQCAtMSw1ICsxLDQgQEAKLS8qIAotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisvKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgogICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvRmlsZUNoYW5uZWxJbXBsLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL0ZpbGVDaGFubmVsSW1wbC5qYXZhCmluZGV4IDU0YTdjMmUuLjY4N2I0MzggMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvRmlsZUNoYW5uZWxJbXBsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9GaWxlQ2hhbm5lbEltcGwuamF2YQpAQCAtNDEyLDcgKzQxMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBGaWxlQ2hhbm5lbCkgewogICAgICAgICAgICAgICAgIEZpbGVDaGFubmVsIGZpbGVTcmMgPSAoRmlsZUNoYW5uZWwpIHNyYzsKQEAgLTQzNSw2ICs0MzUsNyBAQAogICAgICAgICAgICAgICAgKChEaXJlY3RCdWZmZXIpIGJ1ZmZlcikuZnJlZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyB0cmFuc2ZlclRvKGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgdGFyZ2V0KQpAQCAtNDYxLDcgKzQ2Miw3IEBACiAgICAgICAgICAgICByZXR1cm4ga2VybmVsVHJhbnNmZXIoaGFuZGxlLCAoKFNvY2tldENoYW5uZWxJbXBsKSB0YXJnZXQpLmdldEZEKCksCiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLCBjb3VudCk7CiAgICAgICAgIH0KLQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1ZmZlciA9IG1hcChNYXBNb2RlLlJFQURfT05MWSwgcG9zaXRpb24sIGNvdW50KTsKICAgICAgICAgICAgIHJldHVybiB0YXJnZXQud3JpdGUoYnVmZmVyKTsKQEAgLTQ3Myw2ICs0NzQsNyBAQAogICAgICAgICAgICAgICAgICgoRGlyZWN0QnVmZmVyKSBidWZmZXIpLmZyZWUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgcHJpdmF0ZSBsb25nIGtlcm5lbFRyYW5zZmVyKGludCBsLCBGaWxlRGVzY3JpcHRvciBmZCwgbG9uZyBwb3NpdGlvbiwKQEAgLTU5Myw3ICs1OTUsNyBAQAogICAgICAgICBpbnRbXSBoYW5kbGVzID0gbmV3IGludFtsZW5ndGhdOwogICAgICAgICBpbnRbXSBvZmZzZXRzID0gbmV3IGludFtsZW5ndGhdOwogICAgICAgICBpbnRbXSBsZW5ndGhzID0gbmV3IGludFtsZW5ndGhdOwotCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAvLyBsaXN0IG9mIGFsbG9jYXRlZCBkaXJlY3QgQnl0ZUJ1ZmZlcnMgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcgR0MtZWQKICAgICAgICAgRGlyZWN0QnVmZmVyW10gYWxsb2NhdGVkQnVmcyA9IG5ldyBEaXJlY3RCdWZmZXJbbGVuZ3RoXTsKIApAQCAtNjE0LDYgKzYxNiw3IEBACiAgICAgICAgICAgICBoYW5kbGVzW2ldID0gKChEaXJlY3RCdWZmZXIpIGJ1ZmZlcikuZ2V0RWZmZWN0aXZlQWRkcmVzcygpLnRvSW50KCk7CiAgICAgICAgICAgICBsZW5ndGhzW2ldID0gYnVmZmVyLnJlbWFpbmluZygpOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgICAgICBsb25nIGJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgIGJvb2xlYW4gY29tcGxldGVkID0gZmFsc2U7CkBAIC02MjUsMTMgKzYyOCwxNCBAQAogICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGVuZChjb21wbGV0ZWQpOwotCisgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICAgICAgICAgIC8vIGZyZWUgdGVtcG9yYXJ5IGRpcmVjdCBidWZmZXJzCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdGVkQnVmc1tpXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWRCdWZzW2ldLmZyZWUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU2VsZWN0b3JJbXBsLmphdmEgYi9uaW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL1NlbGVjdG9ySW1wbC5qYXZhCmluZGV4IGI4YjZhMTUuLmY4ZTdkODAgMTAwNjQ0Ci0tLSBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU2VsZWN0b3JJbXBsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9TZWxlY3RvckltcGwuamF2YQpAQCAtMTgyLDkgKzE4MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBkb0NhbmNlbCgpOwogICAgICAgICAgICAgICAgICAgICBpbnRbXSByZWFkeUNoYW5uZWxzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jsb2NrID0gKFNFTEVDVF9OT1cgIT0gdGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gY29waWVkIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIChrZXlzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVDaGFubmVscygpOwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxvY2spIHsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU2VydmVyU29ja2V0Q2hhbm5lbEltcGwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU2VydmVyU29ja2V0Q2hhbm5lbEltcGwuamF2YQppbmRleCAwNzg2NDk4Li4zYmMzNjhmIDEwMDY0NAotLS0gYS9uaW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL1NlcnZlclNvY2tldENoYW5uZWxJbXBsLmphdmEKKysrIGIvbmlvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbC5qYXZhCkBAIC0yNjQsNiArMjY0LDEwIEBACiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmltcGxBY2NlcHQoYVNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgIHNvY2tDaGFubmVsLnNldENvbm5lY3RlZCgpOworICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGNvcGllZCBmcm9tIGEgbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CisgICAgICAgICAgICAgICAgICAgIHNvY2tDaGFubmVsLnNldEJvdW5kKHRydWUpOworICAgICAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CiAgICAgICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU29ja2V0Q2hhbm5lbEltcGwuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU29ja2V0Q2hhbm5lbEltcGwuamF2YQppbmRleCBiYzhhOWJiLi44ZTZjNTJmZiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9Tb2NrZXRDaGFubmVsSW1wbC5qYXZhCisrKyBiL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU29ja2V0Q2hhbm5lbEltcGwuamF2YQpAQCAtMTIwLDggKzEyMCwxMSBAQAogICAgIC8vIEF0IGZpcnN0LCB1bmluaXRpYWxpemVkLgogICAgIGludCBzdGF0dXMgPSBTT0NLRVRfU1RBVFVTX1VOSU5JVDsKIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIC8vIGNvcGllZCBmcm9tIGEgbmV3ZXIgdmVyc2lvbiBvZiBoYXJtb255CiAgICAgLy8gd2hldGhlciB0aGUgc29ja2V0IGlzIGJvdW5kCi0gICAgYm9vbGVhbiBpc0JvdW5kID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbGVhbiBpc0JvdW5kID0gZmFsc2U7CisgICAgLy8gRU5EIGFkcm9pZC1jaGFuZ2VkCiAKICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCByZWFkTG9jayA9IG5ldyBPYmplY3QoKTsKIApAQCAtMjI5LDYgKzIzMiwxMyBAQAogICAgICAgICBzdGF0dXMgPSBTT0NLRVRfU1RBVFVTX0NPTk5FQ1RFRDsKICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgLy8gY29waWVkIGZyb20gYSBuZXdlciB2ZXJzaW9uIG9mIGhhcm1vbnkKKyAgICB2b2lkIHNldEJvdW5kKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpc0JvdW5kID0gZmxhZzsKKyAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKKwogICAgIC8qCiAgICAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI2lzQ29ubmVjdGlvblBlbmRpbmcoKQogICAgICAqLwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YSBiL25pby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKaW5kZXggMzVjMzkwMC4uZDI5MWYxMiAxMDA2NDQKLS0tIGEvbmlvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQorKysgYi9uaW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCkBAIC0yMyw3ICsyMywxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwubmxzOwogCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgYW5kIHJldHVybnMgdGhlbSwKQEAgLTQwLDkgKzQ5LDExIEBACiAgKiAKICAqLwogcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLSAgICAKKworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzUmVzb3VyY2UgPQogICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5ubHMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIGEgbWVzc2FnZSB3aGljaCBoYXMgbm8gYXJndW1lbnRzLgpAQCAtNTIsNyArNjMsOSBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2cpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTksNiArMTMyLDEyIEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2csIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZywgYXJncyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBEdXBsaWNhdGUgY29kZSB3YXMgZHJvcHBlZCBpbiBmYXZvciBvZiB1c2luZyBNc2dIZWxwLgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQWJzdHJhY3RCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0Fic3RyYWN0QnVmZmVyVGVzdC5qYXZhCmluZGV4IDU3YzE0NzEuLmY1OGJmN2QgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQWJzdHJhY3RCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9BYnN0cmFjdEJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsMTIgKzE2LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkludmFsaWRNYXJrRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkJ1ZmZlci5jbGFzcykKIC8qKgogICogVGVzdHMgYSBqYXZhLm5pby5CdWZmZXIgaW5zdGFuY2UuCiAgKi8KQEAgLTM3LDEyICs0MiwyOSBAQAogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbnsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGNhcGFjaXR5IHdpdGggd2hpY2ggdGhlIGJ1ZmZlciBpcyBjcmVhdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhcGFjaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhcGFjaXR5KCkgewogICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYmFzZUJ1Zi5wb3NpdGlvbigpICYmIGJhc2VCdWYucG9zaXRpb24oKSA8PSBiYXNlQnVmLmxpbWl0KCkKICAgICAgICAgICAgICAgICAmJiBiYXNlQnVmLmxpbWl0KCkgPD0gYmFzZUJ1Zi5jYXBhY2l0eSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgLy8gbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CiAgICAgICAgIC8vIHNhdmUgc3RhdGUKICAgICAgICAgaW50IG9sZFBvc2l0aW9uID0gYmFzZUJ1Zi5wb3NpdGlvbigpOwpAQCAtNjMsNyArODUsMTUgQEAKICAgICAgICAgYmFzZUJ1Zi5saW1pdChvbGRMaW1pdCk7CiAgICAgICAgIGJhc2VCdWYucG9zaXRpb24ob2xkUG9zaXRpb24pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgdGhhdCBtYXJrIGlzIGRpc2NhcnRlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbGlwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsaXAoKSB7CiAgICAgICAgIC8vIHNhdmUgc3RhdGUKICAgICAgICAgaW50IG9sZFBvc2l0aW9uID0gYmFzZUJ1Zi5wb3NpdGlvbigpOwpAQCAtODQsNyArMTE0LDE1IEBACiAgICAgICAgIGJhc2VCdWYubGltaXQob2xkTGltaXQpOwogICAgICAgICBiYXNlQnVmLnBvc2l0aW9uKG9sZFBvc2l0aW9uKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzUmVtYWluaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc1JlbWFpbmluZygpIHsKICAgICAgICAgLy8gc2F2ZSBzdGF0ZQogICAgICAgICBpbnQgb2xkUG9zaXRpb24gPSBiYXNlQnVmLnBvc2l0aW9uKCk7CkBAIC05OCw3ICsxMzYsMTUgQEAKICAgICAgICAgYmFzZUJ1Zi5saW1pdChvbGRMaW1pdCk7CiAgICAgICAgIGJhc2VCdWYucG9zaXRpb24ob2xkUG9zaXRpb24pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJBYnN0cmFjdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlYWRPbmx5KCkgewogICAgICAgICBiYXNlQnVmLmlzUmVhZE9ubHkoKTsKICAgICB9CkBAIC0xMDYsNiArMTUyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgbGltaXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaW1pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMaW1pdCgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGJhc2VCdWYucG9zaXRpb24oKSAmJiBiYXNlQnVmLnBvc2l0aW9uKCkgPD0gYmFzZUJ1Zi5saW1pdCgpCiAgICAgICAgICAgICAgICAgJiYgYmFzZUJ1Zi5saW1pdCgpIDw9IGJhc2VCdWYuY2FwYWNpdHkoKSk7CkBAIC0xMTQsNiArMTY5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBCdWZmZXIgbGltaXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaW1pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMaW1pdGludCgpIHsKICAgICAgICAgLy8gc2F2ZSBzdGF0ZQogICAgICAgICBpbnQgb2xkUG9zaXRpb24gPSBiYXNlQnVmLnBvc2l0aW9uKCk7CkBAIC0xNjMsNyArMjI3LDE1IEBACiAgICAgICAgIGJhc2VCdWYubGltaXQob2xkTGltaXQpOwogICAgICAgICBiYXNlQnVmLnBvc2l0aW9uKG9sZFBvc2l0aW9uKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFyayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXJrKCkgewogICAgICAgICAvLyBzYXZlIHN0YXRlCiAgICAgICAgIGludCBvbGRQb3NpdGlvbiA9IGJhc2VCdWYucG9zaXRpb24oKTsKQEAgLTE5MCw2ICsyNjIsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGludCBwb3NpdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aW9uKCkgewogICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYmFzZUJ1Zi5wb3NpdGlvbigpICYmIGJhc2VCdWYucG9zaXRpb24oKSA8PSBiYXNlQnVmLmxpbWl0KCkKICAgICAgICAgICAgICAgICAmJiBiYXNlQnVmLmxpbWl0KCkgPD0gYmFzZUJ1Zi5jYXBhY2l0eSgpKTsKQEAgLTE5OCw2ICsyNzksMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIEJ1ZmZlciBwb3NpdGlvbihpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aW9uaW50KCkgewogICAgICAgICAvLyBzYXZlIHN0YXRlCiAgICAgICAgIGludCBvbGRQb3NpdGlvbiA9IGJhc2VCdWYucG9zaXRpb24oKTsKQEAgLTI0OCwxMSArMzM4LDI3IEBACiAgICAgICAgIGJhc2VCdWYubGltaXQob2xkTGltaXQpOwogICAgICAgICBiYXNlQnVmLnBvc2l0aW9uKG9sZFBvc2l0aW9uKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtYWluaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbWFpbmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJhc2VCdWYucmVtYWluaW5nKCksIGJhc2VCdWYubGltaXQoKSAtIGJhc2VCdWYucG9zaXRpb24oKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0KCkgewogICAgICAgICAvLyBzYXZlIHN0YXRlCiAgICAgICAgIGludCBvbGRQb3NpdGlvbiA9IGJhc2VCdWYucG9zaXRpb24oKTsKQEAgLTI4Myw3ICszODksMTUgQEAKICAgICAgICAgYmFzZUJ1Zi5saW1pdChvbGRMaW1pdCk7CiAgICAgICAgIGJhc2VCdWYucG9zaXRpb24ob2xkUG9zaXRpb24pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXdpbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmV3aW5kKCkgewogICAgICAgICAvLyBzYXZlIHN0YXRlCiAgICAgICAgIGludCBvbGRQb3NpdGlvbiA9IGJhc2VCdWYucG9zaXRpb24oKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQWxsVGVzdHMuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQWxsVGVzdHMuamF2YQppbmRleCBjZWZiMmRhLi41YjRjYmM1IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0FsbFRlc3RzLmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9BbGxUZXN0cy5qYXZhCkBAIC05Niw2ICs5Niw3IEBACiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShEdXBsaWNhdGVEaXJlY3RCeXRlQnVmZmVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShXcmFwcGVkSW50QnVmZmVyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShIZWFwQ2hhckJ1ZmZlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwcGVkQnl0ZUJ1ZmZlclRlc3QuY2xhc3MpOwogICAgICAgICAvLyRKVW5pdC1FTkQkCiAgICAgICAgIHJldHVybiBzdWl0ZTsKICAgICB9CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J1ZmZlck92ZXJmbG93RXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCA0MDQ2NzM5Li43ZDhjNzYzIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J1ZmZlck92ZXJmbG93RXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDE3ICsxNiwzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCkpOwpAQCAtMzUsNiArNTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oKSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQnVmZmVyVGVzdC5qYXZhCmluZGV4IGE3Y2M2NDIuLmEyZWU1ZmQgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQnVmZmVyVGVzdC5qYXZhCkBAIC0xNywxNiArMTcsMzMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkludmFsaWRNYXJrRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiAvKioKICAqIFRlc3QgYSBqYXZhLm5pby5CdWZmZXIgaW5zdGFuY2UuCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIEJ1ZmZlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgYnVmZmVyJ3Mgc3RhdGUgZG9lc24ndCBjaGFuZ2UgYWZ0ZXIgdGVzdGluZy4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3NpdGlvbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImxpbWl0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RCdWZmZXJJbnN0YW5jZShCdWZmZXIgYnVmKSB7CiAgICAgICAgIC8vIHNhdmUgc3RhdGUKICAgICAgICAgaW50IG9sZFBvc2l0aW9uID0gYnVmLnBvc2l0aW9uKCk7CkBAIC01MCwxMiArNjcsMjggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5wb3NpdGlvbigpLCBvbGRQb3NpdGlvbik7CiAgICAgICAgIGFzc2VydEVxdWFscyhidWYubGltaXQoKSwgb2xkTGltaXQpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgY2FwYWNpdHkgd2l0aCB3aGljaCB0aGUgYnVmZmVyIGlzIGNyZWF0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FwYWNpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdENhcGFjaXR5KEJ1ZmZlciBidWYpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGJ1Zi5wb3NpdGlvbigpICYmIGJ1Zi5wb3NpdGlvbigpIDw9IGJ1Zi5saW1pdCgpCiAgICAgICAgICAgICAgICAgJiYgYnVmLmxpbWl0KCkgPD0gYnVmLmNhcGFjaXR5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDbGVhcihCdWZmZXIgYnVmKSB7CiAgICAgICAgIC8vIHNhdmUgc3RhdGUKICAgICAgICAgaW50IG9sZFBvc2l0aW9uID0gYnVmLnBvc2l0aW9uKCk7CkBAIC03Niw3ICsxMDksMTYgQEAKICAgICAgICAgYnVmLmxpbWl0KG9sZExpbWl0KTsKICAgICAgICAgYnVmLnBvc2l0aW9uKG9sZFBvc2l0aW9uKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIHRoYXQgbWFyayBpcyBkaXNjYXJkZWQgYWZ0ZXIgYSBjYWxsIG9mIGZsaXAgIiArCisgICAgICAgICAgICAibWV0aG9kLiAiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbGlwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RGbGlwKEJ1ZmZlciBidWYpIHsKICAgICAgICAgLy8gc2F2ZSBzdGF0ZQogICAgICAgICBpbnQgb2xkUG9zaXRpb24gPSBidWYucG9zaXRpb24oKTsKQEAgLTk3LDcgKzEzOSwxNSBAQAogICAgICAgICBidWYubGltaXQob2xkTGltaXQpOwogICAgICAgICBidWYucG9zaXRpb24ob2xkUG9zaXRpb24pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNSZW1haW5pbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEhhc1JlbWFpbmluZyhCdWZmZXIgYnVmKSB7CiAgICAgICAgIC8vIHNhdmUgc3RhdGUKICAgICAgICAgaW50IG9sZFBvc2l0aW9uID0gYnVmLnBvc2l0aW9uKCk7CkBAIC0xMTEsNyArMTYxLDE1IEBACiAgICAgICAgIGJ1Zi5saW1pdChvbGRMaW1pdCk7CiAgICAgICAgIGJ1Zi5wb3NpdGlvbihvbGRQb3NpdGlvbik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFic3RyYWN0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlYWRPbmx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RJc1JlYWRPbmx5KEJ1ZmZlciBidWYpIHsKICAgICAgICAgYnVmLmlzUmVhZE9ubHkoKTsKICAgICB9CkBAIC0xMTksNiArMTc3LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgbGltaXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaW1pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0TGltaXQoQnVmZmVyIGJ1ZikgewogICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYnVmLnBvc2l0aW9uKCkgJiYgYnVmLnBvc2l0aW9uKCkgPD0gYnVmLmxpbWl0KCkKICAgICAgICAgICAgICAgICAmJiBidWYubGltaXQoKSA8PSBidWYuY2FwYWNpdHkoKSk7CkBAIC0xMjcsNiArMTk0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBCdWZmZXIgbGltaXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsaW1pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0TGltaXRpbnQoQnVmZmVyIGJ1ZikgewogICAgICAgICAvLyBzYXZlIHN0YXRlCiAgICAgICAgIGludCBvbGRQb3NpdGlvbiA9IGJ1Zi5wb3NpdGlvbigpOwpAQCAtMTc2LDcgKzI1MiwxNSBAQAogICAgICAgICBidWYubGltaXQob2xkTGltaXQpOwogICAgICAgICBidWYucG9zaXRpb24ob2xkUG9zaXRpb24pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXJrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RNYXJrKEJ1ZmZlciBidWYpIHsKICAgICAgICAgLy8gc2F2ZSBzdGF0ZQogICAgICAgICBpbnQgb2xkUG9zaXRpb24gPSBidWYucG9zaXRpb24oKTsKQEAgLTIwMyw2ICsyODcsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGludCBwb3NpdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RQb3NpdGlvbihCdWZmZXIgYnVmKSB7CiAgICAgICAgIGFzc2VydFRydWUoMCA8PSBidWYucG9zaXRpb24oKSAmJiBidWYucG9zaXRpb24oKSA8PSBidWYubGltaXQoKQogICAgICAgICAgICAgICAgICYmIGJ1Zi5saW1pdCgpIDw9IGJ1Zi5jYXBhY2l0eSgpKTsKQEAgLTIxMSw2ICszMDQsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIEJ1ZmZlciBwb3NpdGlvbihpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RQb3NpdGlvbmludChCdWZmZXIgYnVmKSB7CiAgICAgICAgIC8vIHNhdmUgc3RhdGUKICAgICAgICAgaW50IG9sZFBvc2l0aW9uID0gYnVmLnBvc2l0aW9uKCk7CkBAIC0yNjEsMTEgKzM2MywyNyBAQAogICAgICAgICBidWYubGltaXQob2xkTGltaXQpOwogICAgICAgICBidWYucG9zaXRpb24ob2xkUG9zaXRpb24pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1haW5pbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFJlbWFpbmluZyhCdWZmZXIgYnVmKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhidWYucmVtYWluaW5nKCksIGJ1Zi5saW1pdCgpIC0gYnVmLnBvc2l0aW9uKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UmVzZXQoQnVmZmVyIGJ1ZikgewogICAgICAgICAvLyBzYXZlIHN0YXRlCiAgICAgICAgIGludCBvbGRQb3NpdGlvbiA9IGJ1Zi5wb3NpdGlvbigpOwpAQCAtMjk2LDcgKzQxNCwxNSBAQAogICAgICAgICBidWYubGltaXQob2xkTGltaXQpOwogICAgICAgICBidWYucG9zaXRpb24ob2xkUG9zaXRpb24pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXdpbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFJld2luZChCdWZmZXIgYnVmKSB7CiAgICAgICAgIC8vIHNhdmUgc3RhdGUKICAgICAgICAgaW50IG9sZFBvc2l0aW9uID0gYnVmLnBvc2l0aW9uKCk7CkBAIC0zMTYsNyArNDQyLDE1IEBACiAgICAgICAgIGJ1Zi5saW1pdChvbGRMaW1pdCk7CiAgICAgICAgIGJ1Zi5wb3NpdGlvbihvbGRQb3NpdGlvbik7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHRlc3QgYW55dGhpbmcuIEp1c3QgdG8gcmVtb3ZlIEpVbml0IHdhcm5pbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vdGhpbmcoKSB7CiAgICAgICAgIC8vIHRvIHJlbW92ZSBKVW5pdCB3YXJuaW5nCiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb25UZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCAzMzcyNDczLi41MTgwZjUyIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTYsMTIgKzE2LDE4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uCiAgKi8KQEAgLTMwLDYgKzM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpKTsKQEAgLTM4LDYgKzUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQnl0ZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQnl0ZUJ1ZmZlclRlc3QuamF2YQppbmRleCA2ZTIyMjMwLi5mOTdhZDVmIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J5dGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9CeXRlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKQEAgLTM1LDYgKzQwLDcgQEAKICAqIFRlc3RzIGphdmEubmlvLkJ5dGVCdWZmZXIKICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKEJ5dGVCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQnl0ZUJ1ZmZlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEJ1ZmZlclRlc3QgewogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNNQUxMX1RFU1RfTEVOR1RIID0gNTsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfTEVOR1RIID0gMjUwOwpAQCAtNTYsNyArNjIsMTYgQEAKICAgICAgKiAxLiBjYXNlIGZvciBjaGVjayBCeXRlQnVmZmVyIHRlc3RCdWYgcHJvcGVydGllcwogICAgICAqIDIuIGNhc2UgZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBiYWNraW5nIGFycmF5LiBEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlICIgKworICAgICAgICAgICAgIm9mIGNhcGFjaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFsbG9jYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9BbGxvY2F0ZUkoKSB7CiAgICAgICAgIC8vICAgIGNhc2U6IEJ5dGVCdWZmZXIgdGVzdEJ1ZiBwcm9wZXJ0aWVzIGlzIHNhdGlzZnkgdGhlIGNvbmRpdGlvbnMgc3BlY2lmaWNhdGlvbgogICAgICAgICBCeXRlQnVmZmVyIHRlc3RCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDIwKTsKQEAgLTc2LDcgKzkxLDE2IEBACiAgICAgLyoKICAgICAgKiB0ZXN0IGZvciBtZXRob2Qgc3RhdGljIEJ5dGVCdWZmZXIgYWxsb2NhdGVEaXJlY3QoaW50IGNhcGFjaXR5KQogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgY2hlY2sgYmFja2luZyBhcnJheS4gRG9lc24ndCBjaGVjayBib3VuZGFyeSAiICsKKyAgICAgICAgICAgICJ2YWx1ZSBvZiBjYXBhY2l0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZURpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQWxsb2NhdGVEaXJlY3RJKCkgewogICAgICAgICAvLyAgICAgICAgY2FzZTogQnl0ZUJ1ZmZlciB0ZXN0QnVmIHByb3BlcnRpZXMgaXMgc2F0aXNmeSB0aGUgY29uZGl0aW9ucyBzcGVjaWZpY2F0aW9uCiAgICAgICAgIEJ5dGVCdWZmZXIgdGVzdEJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMjApOwpAQCAtOTEsNyArMTE1LDE1IEBACiAgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2Vjb25kIGlmL2Vsc2UgdmVyaWZpZXMgdGhlIHNhbWUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheSgpIHsKICAgICAgICAgaWYgKGJ1Zi5oYXNBcnJheSgpKSB7CiAgICAgICAgICAgICBieXRlIGFycmF5W10gPSBidWYuYXJyYXkoKTsKQEAgLTEyOSw3ICsxNjEsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRoZSBzZWNvbmQgaWYvZWxzZSB2ZXJpZmllcyB0aGUgc2FtZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5T2Zmc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5T2Zmc2V0KCkgewogICAgICAgICBpZiAoYnVmLmhhc0FycmF5KCkpIHsKICAgICAgICAgICAgIGJ5dGUgYXJyYXlbXSA9IGJ1Zi5hcnJheSgpOwpAQCAtMTY3LDcgKzIwNywxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFzUmVhZE9ubHlCdWZmZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWFkT25seUJ1ZmZlcigpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ1Zi5tYXJrKCk7CkBAIC0xOTEsNyArMjM5LDE1IEBACiAgICAgICAgIGJ1Zi5yZXNldCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYnVmLnBvc2l0aW9uKCksIDApOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhY3QoKSB7CiAgICAgICAgIGlmIChidWYuaXNSZWFkT25seSgpKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMjUyLDcgKzMwOCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUbygpIHsKICAgICAgICAgLy8gY29tcGFyZSB0byBzZWxmCiAgICAgICAgIGFzc2VydEVxdWFscygwLCBidWYuY29tcGFyZVRvKGJ1ZikpOwpAQCAtMjgwLDcgKzM0NCwxNSBAQAogICAgICAgICAKICAgICAgICAgYXNzZXJ0VHJ1ZShCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMjFdKS5jb21wYXJlVG8oQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgyMSkpID09IDApOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkdXBsaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm1hcmsoKTsKQEAgLTMxMiw3ICszODQsMTUgQEAKICAgICAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBkdXBsaWNhdGUpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewogICAgICAgICAvLyBlcXVhbCB0byBzZWxmCiAgICAgICAgIGFzc2VydFRydWUoYnVmLmVxdWFscyhidWYpKTsKQEAgLTMzOCw2ICs0MTgsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJ5dGUgZ2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtMzU1LDYgKzQ0NCwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uQnl0ZUJ1ZmZlciBnZXQoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Ynl0ZUFycmF5KCkgewogICAgICAgICBieXRlIGFycmF5W10gPSBuZXcgYnl0ZVsxXTsKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC0zODEsNiArNDc5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5CeXRlQnVmZmVyIGdldChieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldGJ5dGVBcnJheWludGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ5dGUgYXJyYXlbXSA9IG5ldyBieXRlW2J1Zi5jYXBhY2l0eSgpXTsKQEAgLTQ0OCw2ICs1NTUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJ5dGUgZ2V0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0aW50KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC00NjcsNyArNTgzLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGhlIHNhbWUgdmVyaWZpY2F0aW9uIGluIGlmL2Vsc2UgYmxvY2suIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXJyYXkoKSB7CiAgICAgICAgIGlmIChidWYuaGFzQXJyYXkoKSkgewogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChidWYuYXJyYXkoKSk7CkBAIC00OTIsNyArNjE2LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBsb2FkVGVzdERhdGExKGJ1Zik7CkBAIC01MTcsMTEgKzY0OSwyNyBAQAogICAgICAgICBkdXBsaWNhdGUucG9zaXRpb24oYnVmLmNhcGFjaXR5KCkvMik7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmhhc2hDb2RlKCkhPSBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFic3RyYWN0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYnVmLmlzRGlyZWN0KCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyKCkgewogICAgICAgICAvLyBCSUdfRU5ESUFOIGlzIHRoZSBkZWZhdWx0IGJ5dGUgb3JkZXIKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5CSUdfRU5ESUFOLCBidWYub3JkZXIoKSk7CkBAIC01NDQsNyArNjkyLDE1IEBACiAgICAgICogdGVzdCBjb3ZlcnMgZm9sbG93aW5nIHVzZWNhc2VzOgogICAgICAqIDEuIGNhc2UgZm9yIGNoZWNrCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVPcmRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9PcmRlckxqYXZhX2xhbmdfQnl0ZU9yZGVyKCkgewogICAgICAgICAvLyAgICAgICAgIEJJR19FTkRJQU4gaXMgdGhlIGRlZmF1bHQgYnl0ZSBvcmRlcgogICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZU9yZGVyLkJJR19FTkRJQU4sIGJ1Zi5vcmRlcigpKTsKQEAgLTU2NSw2ICs3MjEsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KGJ5dGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0Ynl0ZSgpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC01OTUsNiArNzYwLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dChieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRieXRlQXJyYXkoKSB7CiAgICAgICAgIGJ5dGUgYXJyYXlbXSA9IG5ldyBieXRlWzFdOwogICAgICAgICBpZiAoYnVmLmlzUmVhZE9ubHkoKSkgewpAQCAtNjMyLDYgKzgwNiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRieXRlQXJyYXlpbnRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBieXRlIGFycmF5W10gPSBuZXcgYnl0ZVtidWYuY2FwYWNpdHkoKV07CkBAIC03MTAsNiArODkzLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dChqYXZhLm5pby5CeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dEJ5dGVCdWZmZXIoKSB7CiAgICAgICAgIEJ5dGVCdWZmZXIgb3RoZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGJ1Zi5jYXBhY2l0eSgpKTsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKQEAgLTc2Miw2ICs5NTQsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KGludCwgYnl0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0aW50Ynl0ZSgpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC03OTMsNyArOTk0LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNsaWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNsaWNlKCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5jYXBhY2l0eSgpID4gU01BTExfVEVTVF9MRU5HVEgpOwogICAgICAgICBidWYucG9zaXRpb24oMSk7CkBAIC04MjEsNyArMTAzMCwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNsaWNlLmdldCgxKSwgMTAwKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIHN0ciA9IGJ1Zi50b1N0cmluZygpOwogICAgICAgICBhc3NlcnRUcnVlKHN0ci5pbmRleE9mKCJCeXRlIikgPj0gMCB8fCBzdHIuaW5kZXhPZigiYnl0ZSIpID49IDApOwpAQCAtODI5LDcgKzEwNDYsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShzdHIuaW5kZXhPZigiIiArIGJ1Zi5saW1pdCgpKSA+PSAwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzdHIuaW5kZXhPZigiIiArIGJ1Zi5jYXBhY2l0eSgpKSA+PSAwKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNDaGFyQnVmZmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFzQ2hhckJ1ZmZlcigpIHsKICAgICAgICAgQ2hhckJ1ZmZlciBjaGFyQnVmZmVyOwogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyXTsKQEAgLTg4NSw3ICsxMTEwLDE1IEBACiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhc0RvdWJsZUJ1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBc0RvdWJsZUJ1ZmZlcigpIHsKICAgICAgICAgRG91YmxlQnVmZmVyIGRvdWJsZUJ1ZmZlcjsKICAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbOF07CkBAIC05NDgsNyArMTE4MSwxNSBAQAogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNGbG9hdEJ1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBc0Zsb2F0QnVmZmVyKCkgewogICAgICAgICBGbG9hdEJ1ZmZlciBmbG9hdEJ1ZmZlcjsKICAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbNF07CkBAIC0xMDExLDcgKzEyNTIsMTUgQEAKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFzSW50QnVmZmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFzSW50QnVmZmVyKCkgewogICAgICAgICBJbnRCdWZmZXIgaW50QnVmZmVyOwogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVs0XTsKQEAgLTEwNjgsNyArMTMxNywxNSBAQAogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNMb25nQnVmZmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFzTG9uZ0J1ZmZlcigpIHsKICAgICAgICAgTG9uZ0J1ZmZlciBsb25nQnVmZmVyOwogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVs4XTsKQEAgLTExMjUsNyArMTM4MiwxNSBAQAogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNTaG9ydEJ1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBc1Nob3J0QnVmZmVyKCkgewogICAgICAgICBTaG9ydEJ1ZmZlciBzaG9ydEJ1ZmZlcjsKICAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbMl07CkBAIC0xMTgyLDcgKzE0NDcsMTUgQEAKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhcigpIHsKICAgICAgICAgaW50IG5ieXRlcyA9IDI7CiAgICAgICAgIGJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlW25ieXRlc107CkBAIC0xMjA4LDcgKzE0ODEsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENoYXJpbnQoKSB7CiAgICAgICAgIGludCBuYnl0ZXMgPSAyOwogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVtuYnl0ZXNdOwpAQCAtMTIzOSw3ICsxNTIwLDE1IEBACiAKICAgICAgICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0Q2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0Q2hhcigpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xMjc3LDcgKzE1NjYsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dENoYXJpbnQoKSB7CiAgICAgICAgIGlmIChidWYuaXNSZWFkT25seSgpKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTMyNSw3ICsxNjIyLDE1IEBACiAgICAgICAgICAgICAvL2V4cGVjdGVkIAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERvdWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGUoKSB7CiAgICAgICAgIGludCBuYnl0ZXMgPSA4OwogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVtuYnl0ZXNdOwpAQCAtMTM1NCw3ICsxNjU5LDE1IEBACiAKICAgICAgICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZWludCgpIHsKICAgICAgICAgaW50IG5ieXRlcyA9IDg7CiAgICAgICAgIGJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlW25ieXRlc107CkBAIC0xMzk0LDcgKzE3MDcsMTUgQEAKICAgICAgICAgICAgIC8vZXhwZWN0ZWQgCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0RG91YmxlKCkgewogICAgICAgICBpZiAoYnVmLmlzUmVhZE9ubHkoKSkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTE0MzIsNyArMTc1MywxNSBAQAogCiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0RG91YmxlaW50KCkgewogICAgICAgICBpZiAoYnVmLmlzUmVhZE9ubHkoKSkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTE0NzQsNyArMTgwMywxNSBAQAogCiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0KCkgewogICAgICAgICBpbnQgbmJ5dGVzID0gNDsKICAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbbmJ5dGVzXTsKQEAgLTE1MDMsNyArMTg0MCwxNSBAQAogCiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0aW50KCkgewogICAgICAgICBpbnQgbmJ5dGVzID0gNDsKICAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbbmJ5dGVzXTsKQEAgLTE1MzcsNyArMTg4MiwxNSBAQAogCiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRGbG9hdCgpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNTc1LDcgKzE5MjgsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRGbG9hdGludCgpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNjE3LDcgKzE5NzgsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewogICAgICAgICBpbnQgbmJ5dGVzID0gNDsKICAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbbmJ5dGVzXTsKQEAgLTE2NDMsNyArMjAxMiwxNSBAQAogCiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRpbnQoKSB7CiAgICAgICAgIGludCBuYnl0ZXMgPSA0OwogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVtuYnl0ZXNdOwpAQCAtMTY3OSw3ICsyMDU2LDE1IEBACiAgICAgICAgICAgICAvL2V4cGVjdGVkIAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dEludCgpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNzE3LDcgKzIxMDIsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dEludGludCgpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNzU5LDcgKzIxNTIsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmcoKSB7CiAgICAgICAgIGludCBuYnl0ZXMgPSA4OwogICAgICAgICBieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVtuYnl0ZXNdOwpAQCAtMTc4NSw3ICsyMTg2LDE1IEBACiAKICAgICAgICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25naW50KCkgewogICAgICAgICBpbnQgbmJ5dGVzID0gODsKICAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbbmJ5dGVzXTsKQEAgLTE4MTYsNyArMjIyNSwxNSBAQAogCiAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0TG9uZygpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xODU0LDcgKzIyNzEsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0TG9uZ2ludCgpIHsKICAgICAgICAgaWYgKGJ1Zi5pc1JlYWRPbmx5KCkpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xODk2LDcgKzIzMjEsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaG9ydCgpIHsKICAgICAgICAgaW50IG5ieXRlcyA9IDI7CiAgICAgICAgIGJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlW25ieXRlc107CkBAIC0xOTIyLDcgKzIzNTUsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaG9ydGludCgpIHsKICAgICAgICAgaW50IG5ieXRlcyA9IDI7CiAgICAgICAgIGJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlW25ieXRlc107CkBAIC0xOTUzLDcgKzIzOTQsMTUgQEAKIAogICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dFNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0U2hvcnQoKSB7CiAgICAgICAgIGlmIChidWYuaXNSZWFkT25seSgpKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTk5MSw3ICsyNDQwLDE1IEBACiAKICAgICAgICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IGNoZWNrIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRTaG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIHNob3J0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0U2hvcnRpbnQoKSB7CiAgICAgICAgIGlmIChidWYuaXNSZWFkT25seSgpKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMjAzNyw2ICsyNDk0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChieXRlW10saW50LGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIFZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRCeXRlQnVmZmVyX251bGxfYXJyYXkoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjY0CiAgICAgICAgIGJ5dGUgYXJyYXlbXSA9IG51bGw7CkBAIC0yMDU5LDcgKzI1MjYsMTUgQEAKICAgICAgKiAyLiBjYXNlIGZvciBjaGVjayBlcXVhbCBiZXR3ZWVuIGJ1ZjIgYW5kIGJ5dGUgYXJyYXlbXQogICAgICAqIDMuIGNhc2UgZm9yIGNoZWNrIGEgYnVmMiBkZXBlbmRlbnMgdG8gYXJyYXlbXQogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9XcmFwJEIoKSB7CiAgICAgICAgIGJ5dGUgYXJyYXlbXSA9IG5ldyBieXRlW0JVRkZFUl9MRU5HVEhdOwogICAgICAgICBsb2FkVGVzdERhdGExKGFycmF5LCAwLCBCVUZGRVJfTEVOR1RIKTsKQEAgLTIwODYsNyArMjU2MSwxNSBAQAogICAgICAqIDMuIGNhc2UgZm9yIGNoZWNrIGEgYnVmMiBkZXBlbmRlbnMgdG8gYXJyYXlbXQogICAgICAqIDQuIGNhc2UgZXhwZWN0ZWQgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9XcmFwJEJJSSgpIHsKICAgICAgICAgYnl0ZSBhcnJheVtdID0gbmV3IGJ5dGVbQlVGRkVSX0xFTkdUSF07CiAgICAgICAgIGludCBvZmZzZXQgPSA1OwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9CeXRlT3JkZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J5dGVPcmRlclRlc3QuamF2YQppbmRleCAzYTA5MDdjLi4xZmM4MmFiIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J5dGVPcmRlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0J5dGVPcmRlclRlc3QuamF2YQpAQCAtMTcsMTAgKzE3LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhCeXRlT3JkZXIuY2xhc3MpCiAvKioKICAqIFRlc3QgamF2YS5uaW8uQnl0ZU9yZGVyCiAgKiAKQEAgLTMwLDEyICszNSwyOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKEJ5dGVPcmRlclRlc3QuY2xhc3MpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5CSUdfRU5ESUFOLnRvU3RyaW5nKCksICJCSUdfRU5ESUFOIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlT3JkZXIuTElUVExFX0VORElBTi50b1N0cmluZygpLCAiTElUVExFX0VORElBTiIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuYXRpdmVPcmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVPcmRlcigpIHsKICAgICAgICAgQnl0ZU9yZGVyIG8gPSBCeXRlT3JkZXIubmF0aXZlT3JkZXIoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShvID09IEJ5dGVPcmRlci5CSUdfRU5ESUFOIHx8IG8gPT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9DaGFyQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9DaGFyQnVmZmVyVGVzdC5qYXZhCmluZGV4IDBhNGRlZDkuLmNlMzk0YTUgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vQ2hhckJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0NoYXJCdWZmZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwpAQCAtMjksNiArMzQsNyBAQAogICogVGVzdHMgamF2YS5uaW8uQ2hhckJ1ZmZlcgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2hhckJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBDaGFyQnVmZmVyVGVzdCBleHRlbmRzIEFic3RyYWN0QnVmZmVyVGVzdCB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfVEVTVF9MRU5HVEggPSA1OwogCkBAIC01NSw3ICs2MSwxNSBAQAogICAgICAqIGZvbGxvd2luZyB1c2VjYXNlczogMS4gY2FzZSBmb3IgY2hlY2sgQ2hhckJ1ZmZlciB0ZXN0QnVmIHByb3BlcnRpZXMgMi4KICAgICAgKiBjYXNlIGV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQWxsb2NhdGVJKCkgewogICAgICAgICAvLyBjYXNlOiBDaGFyQnVmZmVyIHRlc3RCdWYgcHJvcGVydGllcyBpcyBzYXRpc2Z5IHRoZSBjb25kaXRpb25zCiAgICAgICAgIC8vIHNwZWNpZmljYXRpb24KQEAgLTczLDcgKzg3LDE1IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRoZSBzYW1lIHRlc3QgY29kZSBhcyBpbiB0ZXN0QXJyYXlPZmZzZXQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICBjaGFyIGFycmF5W10gPSBidWYuYXJyYXkoKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwpAQCAtOTAsNyArMTEyLDE1IEBACiAgICAgICAgIGxvYWRUZXN0RGF0YTIoYnVmKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRoZSBzYW1lIHRlc3QgY29kZSBhcyBpbiB0ZXN0QXJyYXlPZmZzZXQgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5T2Zmc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5T2Zmc2V0KCkgewogICAgICAgICBjaGFyIGFycmF5W10gPSBidWYuYXJyYXkoKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwpAQCAtMTA3LDcgKzEzNywxNSBAQAogICAgICAgICBsb2FkVGVzdERhdGEyKGJ1Zik7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNSZWFkT25seUJ1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBc1JlYWRPbmx5QnVmZmVyKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm1hcmsoKTsKQEAgLTE1Nyw3ICsxOTUsMTUgQEAKICAgICAgICAgYnVmLnJlc2V0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhidWYucG9zaXRpb24oKSwgb3JpZ2luYWxQb3NpdGlvbik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdCgpIHsKICAgICAgICAgLy8gY2FzZTogYnVmZmVyIGlzIGZ1bGwKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC0yMDgsNyArMjU0LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgewogICAgICAgICAvLyBjb21wYXJlIHRvIHNlbGYKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1Zi5jb21wYXJlVG8oYnVmKSk7CkBAIC0yMzQsNyArMjg4LDE1IEBACiAgICAgICAgIGFzc2VydFRydWUoYnVmLmNvbXBhcmVUbyhvdGhlcikgPiAwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShvdGhlci5jb21wYXJlVG8oYnVmKSA8IDApOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkdXBsaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlKCkgewogICAgICAgICAvLyBtYXJrIHRoZSBwb3NpdGlvbiAwCiAgICAgICAgIGJ1Zi5jbGVhcigpOwpAQCAtMjk2LDcgKzM1OCwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGR1cGxpY2F0ZSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CiAgICAgICAgIC8vIGVxdWFsIHRvIHNlbGYKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuZXF1YWxzKGJ1ZikpOwpAQCAtMzIyLDYgKzM5MiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgY2hhciBnZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC0zMzksNiArNDE4LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5DaGFyQnVmZmVyIGdldChjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZGlmZmVyZW50IGFycmF5czogZW1wdHksIG51bGwgYW5kIGV0Yy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Y2hhckFycmF5KCkgewogICAgICAgICBjaGFyIGFycmF5W10gPSBuZXcgY2hhclsxXTsKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC0zNTksNiArNDQ3LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5DaGFyQnVmZmVyIGdldChjaGFyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldGNoYXJBcnJheWludGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGNoYXIgYXJyYXlbXSA9IG5ldyBjaGFyW2J1Zi5jYXBhY2l0eSgpXTsKQEAgLTQyNiw2ICs1MjMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGNoYXIgZ2V0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtNDQ1LDcgKzU1MSwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGxvYWRUZXN0RGF0YTEoYnVmKTsKQEAgLTQ2MCw2ICs1NzQsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkNoYXJCdWZmZXIgcHV0KGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRjaGFyKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC00NzksNiArNjAyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dChjaGFyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGNoYXJBcnJheSgpIHsKICAgICAgICAgY2hhciBhcnJheVtdID0gbmV3IGNoYXJbMV07CiAKQEAgLTUwNyw2ICs2MzksMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkNoYXJCdWZmZXIgcHV0KGNoYXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRjaGFyQXJyYXlpbnRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBjaGFyIGFycmF5W10gPSBuZXcgY2hhcltidWYuY2FwYWNpdHkoKV07CkBAIC01NzksNiArNzIwLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dChqYXZhLm5pby5DaGFyQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0Q2hhckJ1ZmZlcigpIHsKICAgICAgICAgQ2hhckJ1ZmZlciBvdGhlciA9IENoYXJCdWZmZXIuYWxsb2NhdGUoYnVmLmNhcGFjaXR5KCkpOwogCkBAIC02MjEsNiArNzcxLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dChpbnQsIGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgY2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGludGNoYXIoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTY0Miw3ICs4MDEsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2xpY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2xpY2UoKSB7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmNhcGFjaXR5KCkgPiA1KTsKICAgICAgICAgYnVmLnBvc2l0aW9uKDEpOwpAQCAtNjcwLDcgKzgzNywxNSBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNsaWNlLmdldCgxKSwgNTAwKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIiI7CiAgICAgICAgIGZvciAoaW50IGkgPSBidWYucG9zaXRpb24oKTsgaSA8IGJ1Zi5saW1pdCgpOyBpKyspIHsKQEAgLTY3OSw3ICs4NTQsMTUgQEAKICAgICAgICAgU3RyaW5nIHN0ciA9IGJ1Zi50b1N0cmluZygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0cik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoYXJBdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyQXQoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLnJlbWFpbmluZygpOyBpKyspIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWYuZ2V0KGJ1Zi5wb3NpdGlvbigpICsgaSksIGJ1Zi5jaGFyQXQoaSkpOwpAQCAtNjk3LDExICs4ODAsMjcgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExlbmd0aCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5sZW5ndGgoKSwgYnVmLnJlbWFpbmluZygpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3ViU2VxdWVuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJTZXF1ZW5jZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5zdWJTZXF1ZW5jZSgtMSwgYnVmLmxlbmd0aCgpKTsKQEAgLTczNyw3ICs5MzYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEsIGJ1Zi5sZW5ndGgoKSAtIDEpKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0U3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgc3RyID0gIiAiOwogCkBAIC03NjIsNyArOTY5LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0U3RyaW5naW50aW50KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgU3RyaW5nIHN0ciA9IFN0cmluZy52YWx1ZU9mKG5ldyBjaGFyW2J1Zi5jYXBhY2l0eSgpXSk7CkBAIC04NzcsNyArMTA5MiwxNiBAQAogICAgICAgICAgICAgdmFsdWUgPSAoY2hhcikgKHZhbHVlICsgMSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcHBlbmQgbWV0aG9kIHdpdGggdGhlIHNhbWUgQ2hhclNlcXVlbmNlIG9iamVjdCAiICsKKyAgICAgICAgICAgICJmb3Igd2hpY2ggaXQncyBjYWxsZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRTZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENoYXJCdWZmZXIgY2IgPSBDaGFyQnVmZmVyLmFsbG9jYXRlKDEwKTsKICAgICAgICAgQ2hhckJ1ZmZlciBjYjIgPSBjYi5kdXBsaWNhdGUoKTsKQEAgLTkwMyw3ICsxMTI3LDIzIEBACiAgICAgICAgIGNiMi5jbGVhcigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoY2IsIGNiMik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kT3ZlckZsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFyQnVmZmVyIGNiID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxKTsKICAgICAgICAgQ2hhclNlcXVlbmNlIGNzID0gIlN0cmluZyI7CkBAIC05MjcsNyArMTE2NywyMyBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQ7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkT25seU1hcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIENoYXJCdWZmZXIgY2IgPSBDaGFyQnVmZmVyLndyYXAoIkFCQ0RFIikuYXNSZWFkT25seUJ1ZmZlcigpOwogICAgICAgICBDaGFyU2VxdWVuY2UgY3MgPSAiU3RyaW5nIjsKQEAgLTk1MSwxNCArMTIwNywzMCBAQAogICAgICAgICB9CiAgICAgICAgIGNiLmFwcGVuZChjcywgMSwgMSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZENOb3JtYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFyQnVmZmVyIGNiID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgyKTsKICAgICAgICAgY2IucHV0KCdBJyk7CiAgICAgICAgIGFzc2VydFNhbWUoY2IsIGNiLmFwcGVuZCgnQicpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdCJywgY2IuZ2V0KDEpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hhclNlcXVlbmNlTm9ybWFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhckJ1ZmZlciBjYiA9IENoYXJCdWZmZXIuYWxsb2NhdGUoMTApOwogICAgICAgICBjYi5wdXQoJ0EnKTsKQEAgLTk2Nyw3ICsxMjM5LDE2IEBACiAgICAgICAgIGNiLmFwcGVuZChudWxsKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgY2IuZmxpcCgpLnRvU3RyaW5nKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UsIGFuZCBudWxsIGFzIENoYXJTZXF1ZW5jZSAiICsKKyAgICAgICAgICAgICJwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hhclNlcXVlbmNlSUlOb3JtYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFyQnVmZmVyIGNiID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxMCk7CiAgICAgICAgIGNiLnB1dCgnQScpOwpAQCAtOTc3LDcgKzEyNTgsMTUgQEAKICAgICAgICAgY2IuYXBwZW5kKG51bGwsIDAsIDEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm4iLCBjYi5mbGlwKCkudG9TdHJpbmcoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBlbmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRDaGFyU2VxdWVuY2VJSV9JbGxlZ2FsQXJndW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFyQnVmZmVyIGNiID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxMCk7CiAgICAgICAgIGNiLmFwcGVuZCgiU3RyaW5nIiwgMCwgMCk7CkBAIC0xMDEzLDcgKzEzMDIsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZENoYXJCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFyQnVmZmVyIHNvdXJjZSA9IENoYXJCdWZmZXIud3JhcCgiU3RyaW5nIik7CiAgICAgICAgIENoYXJCdWZmZXIgdGFyZ2V0ID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxMCk7CkBAIC0xMDMwLDcgKzEzMjcsMTUgQEAKICAgICAgICAgfQogCiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFJlYWRPbmx5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhckJ1ZmZlciBzb3VyY2UgPSBDaGFyQnVmZmVyLndyYXAoIlN0cmluZyIpOwogICAgICAgICBDaGFyQnVmZmVyIHRhcmdldCA9IENoYXJCdWZmZXIuYWxsb2NhdGUoMTApLmFzUmVhZE9ubHlCdWZmZXIoKTsKQEAgLTEwNDQsNyArMTM0OSwxNiBAQAogICAgICAgICB0YXJnZXQuZmxpcCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc291cmNlLnJlYWQodGFyZ2V0KSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcmVhZCBtZXRob2Qgd2l0aCBDaGFyQnVmZmVyIHBhcmFtZXRlciB3aGljaCBsZW5ndGggIiArCisgICAgICAgICAgICAiaXMgbGVzcyB0aGFuIHJlYWQgQ2hhckJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkT3ZlcmZsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFyQnVmZmVyIHNvdXJjZSA9IENoYXJCdWZmZXIud3JhcCgiU3RyaW5nIik7CiAgICAgICAgIENoYXJCdWZmZXIgdGFyZ2V0ID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxKTsKQEAgLTEwNTIsNyArMTM2NiwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIlMiLCB0YXJnZXQuZmxpcCgpLnRvU3RyaW5nKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc291cmNlLnBvc2l0aW9uKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDaGFyQnVmZmVyIHNvdXJjZSA9IENoYXJCdWZmZXIud3JhcCgiYWJ1ZmZlciIpOwogICAgICAgICB0cnkgewpAQCAtMTA2MiwxOSArMTM4NCw1MSBAQAogICAgICAgICAgICAgLy9leHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFic3RyYWN0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmlzRGlyZWN0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGZhbHNlIHJldHVybmVkIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5oYXNBcnJheSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXIoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSwgYnVmLm9yZGVyKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJBYnN0cmFjdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlYWRPbmx5KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaXNSZWFkT25seSgpKTsKICAgICB9CkBAIC0xMDg1LDcgKzE0MzksMTUgQEAKICAgICAgKiBmb3IgY2hlY2sgZXF1YWwgYmV0d2VlbiBidWYyIGFuZCBjaGFyIGFycmF5W10gMy4gY2FzZSBmb3IgY2hlY2sgYSBidWYyCiAgICAgICogZGVwZW5kZW5zIHRvIGFycmF5W10KICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfV3JhcCRDKCkgewogICAgICAgICBjaGFyIGFycmF5W10gPSBuZXcgY2hhcltCVUZGRVJfTEVOR1RIXTsKICAgICAgICAgbG9hZFRlc3REYXRhMShhcnJheSwgMCwgQlVGRkVSX0xFTkdUSCk7CkBAIC0xMTEzLDcgKzE0NzUsMTUgQEAKICAgICAgKiAzLiBjYXNlIGZvciBjaGVjayBhIGJ1ZjIgZGVwZW5kZW5zIHRvIGFycmF5W10KICAgICAgKiA0LiBjYXNlIGV4cGVjdGVkIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIAogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfV3JhcCRDSUkoKSB7CiAgICAgICAgIGNoYXIgYXJyYXlbXSA9IG5ldyBjaGFyW0JVRkZFUl9MRU5HVEhdOwogICAgICAgICBpbnQgb2Zmc2V0ID0gNTsKQEAgLTExNTIsNyArMTUyMiwxNSBAQAogICAgICAqIDMuIGNhc2UgZm9yIGNoZWNrIFN0cmluZwogICAgICAqIDQuIGNhc2UgZm9yIGNoZWNrIENoYXJCdWZmZXIKICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1dyYXBMamF2YV9sYW5nX0NoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgLy8gYWRkZWQgdGhpcyBpZiBjbGF1c2UgdG8gcHJldmVudCBUZXN0cyBmYWlsaW5nIHVuZGVyIHNwZWNpYWwgY29uZGl0aW9ucy4gCiAgICAgICAgIC8vIElmIHRoZSB0ZXN0IGV4dGVuZGluZyB0aGlzIHRlc3QgaXMgbWFkZSBmb3IgYSByZWFkIG9ubHkgYnVmZmVyIGl0IGZhaWxzIApAQCAtMTIwOSw3ICsxNTg3LDE1IEBACiAgICAgICogMy4gY2FzZSBmb3IgY2hlY2sgU3RyaW5nCiAgICAgICogNC4gY2FzZSBmb3IgY2hlY2sgQ2hhckJ1ZmZlcgogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1dyYXBMamF2YV9sYW5nX0NoYXJTZXF1ZW5jZUlJKCkgewogICAgICAgICBpbnQgc3RhcnQgPSBidWYucG9zaXRpb24oKTsKICAgICAgICAgaW50IGVuZCA9IGJ1Zi5saW1pdCgpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RCeXRlQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RCeXRlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDc3NmY1MDUuLjIwZjNmOGYgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0Qnl0ZUJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RpcmVjdEJ5dGVCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDggKzE1LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQnl0ZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaXJlY3RCeXRlQnVmZmVyVGVzdCBleHRlbmRzIEJ5dGVCdWZmZXJUZXN0IHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zNSw2ICs0MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5CeXRlQnVmZmVyI2FsbG9jYXRlRGlyZWN0KGludCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWxsb2NhdGVEaXJlY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb2NhdGVkQnl0ZUJ1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgtMSk7CkBAIC00MywxNSArNTgsMzkgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc0RpcmVjdCBtZXRob2QgZm9yIGRpcmVjdCBCeXRlQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRGlyZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzRGlyZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5pc0RpcmVjdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNBcnJheSBtZXRob2QgZm9yIGRpcmVjdCBCeXRlQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNSZWFkT25seSBtZXRob2QgZm9yIGRpcmVjdCBCeXRlQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhZE9ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWFkT25seSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmlzUmVhZE9ubHkoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RDaGFyQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RDaGFyQnVmZmVyVGVzdC5qYXZhCmluZGV4IDgzY2ZjOWQuLjBhN2M5MWQgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0Q2hhckJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RpcmVjdENoYXJCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRGlyZWN0Q2hhckJ1ZmZlclRlc3QgZXh0ZW5kcyBDaGFyQnVmZmVyVGVzdCB7CiAgICAgCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKXsKQEAgLTMwLDExICszNiwyNyBAQAogICAgICAgICBidWYgPSBudWxsOwogICAgICAgICBiYXNlQnVmID0gbnVsbDsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaGFzQXJyYXkgbWV0aG9kIGZvciBkaXJlY3QgQ2hhckJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmhhc0FycmF5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGFycmF5IG1ldGhvZCBmb3IgZGlyZWN0IENoYXJCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXkoKTsKQEAgLTQyLDcgKzY0LDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcnJheU9mZnNldCBtZXRob2QgZm9yIGRpcmVjdCBDaGFyQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5T2Zmc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5T2Zmc2V0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5T2Zmc2V0KCk7CkBAIC01MCwxMSArODAsMjcgQEAKICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNEaXJlY3QgbWV0aG9kIGZvciBkaXJlY3QgQ2hhckJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNEaXJlY3QoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG9yZGVyIG1ldGhvZCBmb3IgZGlyZWN0IENoYXJCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXIoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlT3JkZXIuQklHX0VORElBTiwgYnVmLm9yZGVyKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0RG91YmxlQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3REb3VibGVCdWZmZXJUZXN0LmphdmEKaW5kZXggNTYxYzBmYS4uZjE1N2ZiMSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3REb3VibGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3REb3VibGVCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkRvdWJsZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaXJlY3REb3VibGVCdWZmZXJUZXN0IGV4dGVuZHMgRG91YmxlQnVmZmVyVGVzdCB7CiAgICAgcHVibGljIHZvaWQgc2V0VXAoKXsKICAgICAgICAgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChCVUZGRVJfTEVOR1RIKjgpLmFzRG91YmxlQnVmZmVyKCk7CkBAIC0yOSwxMSArMzUsMjcgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGhhc0FycmF5IG1ldGhvZCBmb3IgZGlyZWN0IERvdWJsZUJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmhhc0FycmF5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGFycmF5IG1ldGhvZCBmb3IgZGlyZWN0IERvdWJsZUJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5hcnJheSgpOwpAQCAtNDEsNyArNjMsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGFycmF5T2Zmc2V0IG1ldGhvZCBmb3IgZGlyZWN0IERvdWJsZUJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5hcnJheU9mZnNldCgpOwpAQCAtNDksMTEgKzc5LDI3IEBACiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGlzRGlyZWN0IG1ldGhvZCBmb3IgZGlyZWN0IERvdWJsZUJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNEaXJlY3QoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG9yZGVyIG1ldGhvZCBmb3IgZGlyZWN0IERvdWJsZUJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvcmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5CSUdfRU5ESUFOLCBidWYub3JkZXIoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RGbG9hdEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0RmxvYXRCdWZmZXJUZXN0LmphdmEKaW5kZXggODczOWMxYi4uM2E0OGM3MCAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RGbG9hdEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RpcmVjdEZsb2F0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw5ICsxNSwxNSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5GbG9hdEJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaXJlY3RGbG9hdEJ1ZmZlclRlc3QgZXh0ZW5kcyBGbG9hdEJ1ZmZlclRlc3QgewogICAgIHB1YmxpYyB2b2lkIHNldFVwKCl7CiAgICAgICAgIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQlVGRkVSX0xFTkdUSCo0KS5hc0Zsb2F0QnVmZmVyKCk7CkBAIC0yOSwxMSArMzUsMjcgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGhhc0FycmF5IG1ldGhvZCBmb3IgZGlyZWN0IEZsb2F0QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXJyYXkgbWV0aG9kIGZvciBkaXJlY3QgRmxvYXRCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXkoKTsKQEAgLTQxLDcgKzYzLDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcnJheU9mZnNldCBtZXRob2QgZm9yIGRpcmVjdCBGbG9hdEJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5hcnJheU9mZnNldCgpOwpAQCAtNTAsMTEgKzgwLDI3IEBACiAgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc0RpcmVjdCBtZXRob2QgZm9yIGRpcmVjdCBGbG9hdEJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNEaXJlY3QoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG9yZGVyIG1ldGhvZCBmb3IgZGlyZWN0IEZsb2F0QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZU9yZGVyLkJJR19FTkRJQU4sIGJ1Zi5vcmRlcigpKTsKICAgICB9CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RpcmVjdEludEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0SW50QnVmZmVyVGVzdC5qYXZhCmluZGV4IDM5MzM2NmUuLmIyOGNhYjAgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0SW50QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0SW50QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw5ICsxNSwxNSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5JbnRCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRGlyZWN0SW50QnVmZmVyVGVzdCBleHRlbmRzIEludEJ1ZmZlclRlc3QgewogICAgIHB1YmxpYyB2b2lkIHNldFVwKCl7CiAgICAgICAgIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQlVGRkVSX0xFTkdUSCo0KS5hc0ludEJ1ZmZlcigpOwpAQCAtMjksMTEgKzM1LDI3IEBACiAgICAgICAgIGJ1ZiA9IG51bGw7CiAgICAgICAgIGJhc2VCdWYgPSBudWxsOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNBcnJheSBtZXRob2QgZm9yIGRpcmVjdCBJbnRCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXJyYXkoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5oYXNBcnJheSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcnJheSBtZXRob2QgZm9yIGRpcmVjdCBJbnRCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXkoKTsKQEAgLTQxLDcgKzYzLDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcnJheU9mZnNldCBtZXRob2QgZm9yIGRpcmVjdCBJbnRCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXlPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlPZmZzZXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXlPZmZzZXQoKTsKQEAgLTUwLDExICs4MCwyNyBAQAogICAgICAgICAgICAgLy9leHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNEaXJlY3QgbWV0aG9kIGZvciBkaXJlY3QgSW50QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRGlyZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzRGlyZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5pc0RpcmVjdCgpKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgb3JkZXIgbWV0aG9kIGZvciBkaXJlY3QgSW50QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZU9yZGVyLkJJR19FTkRJQU4sIGJ1Zi5vcmRlcigpKTsKICAgICB9CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RpcmVjdExvbmdCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RpcmVjdExvbmdCdWZmZXJUZXN0LmphdmEKaW5kZXggMjQ1Y2QyNS4uYzE0OGFiYSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RMb25nQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0TG9uZ0J1ZmZlclRlc3QuamF2YQpAQCAtMTUsMTAgKzE1LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwogCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uTG9uZ0J1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaXJlY3RMb25nQnVmZmVyVGVzdCBleHRlbmRzIExvbmdCdWZmZXJUZXN0IHsKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpewogICAgICAgICBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KEJVRkZFUl9MRU5HVEgqOCkuYXNMb25nQnVmZmVyKCk7CkBAIC0zMCwxMSArMzUsMjcgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGhhc0FycmF5IG1ldGhvZCBmb3IgZGlyZWN0IExvbmdCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXJyYXkoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5oYXNBcnJheSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcnJheSBtZXRob2QgZm9yIGRpcmVjdCBMb25nQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5KCk7CkBAIC00Miw3ICs2MywxNSBAQAogICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXJyYXlPZmZzZXQgbWV0aG9kIGZvciBkaXJlY3QgTG9uZ0J1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5hcnJheU9mZnNldCgpOwpAQCAtNTEsMTEgKzgwLDI3IEBACiAgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc0RpcmVjdCBtZXRob2QgZm9yIGRpcmVjdCBMb25nQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRGlyZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzRGlyZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5pc0RpcmVjdCgpKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgb3JkZXIgbWV0aG9kIGZvciBkaXJlY3QgTG9uZ0J1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvcmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5CSUdfRU5ESUFOLCBidWYub3JkZXIoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RTaG9ydEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRGlyZWN0U2hvcnRCdWZmZXJUZXN0LmphdmEKaW5kZXggOWFlMjkwYS4uMTg0YWRiOSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EaXJlY3RTaG9ydEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RpcmVjdFNob3J0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw5ICsxNSwxNSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5TaG9ydEJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaXJlY3RTaG9ydEJ1ZmZlclRlc3QgZXh0ZW5kcyBTaG9ydEJ1ZmZlclRlc3QgewogICAgIHB1YmxpYyB2b2lkIHNldFVwKCl7CiAgICAgICAgIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQlVGRkVSX0xFTkdUSCoyKS5hc1Nob3J0QnVmZmVyKCk7CkBAIC0yOSwxMSArMzUsMjcgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGhhc0FycmF5IG1ldGhvZCBmb3IgZGlyZWN0IFNob3J0QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXJyYXkgbWV0aG9kIGZvciBkaXJlY3QgU2hvcnRCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXkoKTsKQEAgLTQxLDcgKzYzLDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcnJheU9mZnNldCBtZXRob2QgZm9yIGRpcmVjdCBTaG9ydEJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5hcnJheU9mZnNldCgpOwpAQCAtNTAsMTEgKzgwLDI3IEBACiAgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc0RpcmVjdCBtZXRob2QgZm9yIGRpcmVjdCBTaG9ydEJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNEaXJlY3QoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG9yZGVyIG1ldGhvZCBmb3IgZGlyZWN0IFNob3J0QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZU9yZGVyLkJJR19FTkRJQU4sIGJ1Zi5vcmRlcigpKTsKICAgICB9CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0RvdWJsZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRG91YmxlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDg2Zjg2YWIuLjY0YjBjOTcgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRG91YmxlQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRG91YmxlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKQEAgLTI3LDYgKzMyLDcgQEAKIC8qKgogICogVGVzdHMgamF2YS5uaW8uRG91YmxlQnVmZmVyCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uRG91YmxlQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIERvdWJsZUJ1ZmZlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEJ1ZmZlclRlc3QgewogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfVEVTVF9MRU5HVEggPSA1OwpAQCAtNTEsNyArNTcsMTUgQEAKICAgICAgKiBmb2xsb3dpbmcgdXNlY2FzZXM6IDEuIGNhc2UgZm9yIGNoZWNrIERvdWJsZUJ1ZmZlciB0ZXN0QnVmIHByb3BlcnRpZXMgMi4KICAgICAgKiBjYXNlIGV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZpZXMgYm91bmRhcnkgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWxsb2NhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0FsbG9jYXRlSSgpIHsKICAgICAgICAgLy8gY2FzZTogRG91YmxlQnVmZmVyIHRlc3RCdWYgcHJvcGVydGllcyBpcyBzYXRpc2Z5IHRoZSBjb25kaXRpb25zCiAgICAgICAgIC8vIHNwZWNpZmljYXRpb24KQEAgLTczLDYgKzg3LDE1IEBACiAgICAgICogVGVzdCB3aXRoIGJpdCBzZXF1ZW5jZXMgdGhhdCByZXByZXNlbnQgdGhlIElFRUU3NTQgZG91YmxlcyBQb3NpdGl2ZQogICAgICAqIGluZmluaXR5LCBuZWdhdGl2ZSBpbmZpbml0eSwgYW5kIE5hTi4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBib3VuZGFyeSB2YWx1ZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5hTnMoKSB7CiAgICAgICAgIGxvbmdbXSBuYW5zID0gbmV3IGxvbmdbXSB7IDB4N2ZmMDAwMDAwMDAwMDAwMEwsIDB4ZmZmMDAwMDAwMDAwMDAwMEwsCiAgICAgICAgICAgICAgICAgMHg3ZmY4MDAwMDAwMDAwMDAwTCB9OwpAQCAtOTMsNyArMTE2LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKGxvbmdCaXRzSW4gPT0gYnVmTG9uZ091dCk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2FtZSB0ZXN0IGFzIHRlc3RBcnJheU9mZnNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheSgpIHsKICAgICAgICAgZG91YmxlIGFycmF5W10gPSBidWYuYXJyYXkoKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwpAQCAtMTEwLDcgKzE0MSwxNSBAQAogICAgICAgICBsb2FkVGVzdERhdGEyKGJ1Zik7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2FtZSB0ZXN0IGFzIHRlc3RBcnJheS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgZG91YmxlIGFycmF5W10gPSBidWYuYXJyYXkoKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwpAQCAtMTI3LDcgKzE2NiwxNSBAQAogICAgICAgICBsb2FkVGVzdERhdGEyKGJ1Zik7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNSZWFkT25seUJ1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBc1JlYWRPbmx5QnVmZmVyKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm1hcmsoKTsKQEAgLTE1MSw3ICsxOTgsMTUgQEAKICAgICAgICAgYnVmLnJlc2V0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhidWYucG9zaXRpb24oKSwgMCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdCgpIHsKICAgICAgICAgLy8gY2FzZTogYnVmZmVyIGlzIGZ1bGwKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC0yMDIsNyArMjU3LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5Eb3VibGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG8oKSB7CiAgICAgICAgIERvdWJsZUJ1ZmZlciBvdGhlciA9IERvdWJsZUJ1ZmZlci5hbGxvY2F0ZShidWYuY2FwYWNpdHkoKSk7CiAgICAgICAgIGxvYWRUZXN0RGF0YTEob3RoZXIpOwpAQCAtMjE4LDggKzI4MSwyNyBAQAogICAgICAgICBvdGhlci5saW1pdCg1KTsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuY29tcGFyZVRvKG90aGVyKSA+IDApOwogICAgICAgICBhc3NlcnRUcnVlKG90aGVyLmNvbXBhcmVUbyhidWYpIDwgMCk7Ci0gICAgfQogCisgICAgICAgIERvdWJsZUJ1ZmZlciBkYnVmZmVyMSA9IERvdWJsZUJ1ZmZlci53cmFwKG5ldyBkb3VibGVbXSB7IERvdWJsZS5OYU4gfSk7CisgICAgICAgIERvdWJsZUJ1ZmZlciBkYnVmZmVyMiA9IERvdWJsZUJ1ZmZlci53cmFwKG5ldyBkb3VibGVbXSB7IERvdWJsZS5OYU4gfSk7CisgICAgICAgIERvdWJsZUJ1ZmZlciBkYnVmZmVyMyA9IERvdWJsZUJ1ZmZlci53cmFwKG5ldyBkb3VibGVbXSB7IDQyZCB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCBlcXVhbCBjb21wYXJpc29uIHdpdGggTmFOIGVudHJ5IiwgMCwgZGJ1ZmZlcjEKKyAgICAgICAgICAgICAgICAuY29tcGFyZVRvKGRidWZmZXIyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uIHdpdGggTmFOIGVudHJ5IiwgMSwgZGJ1ZmZlcjMKKyAgICAgICAgICAgICAgICAuY29tcGFyZVRvKGRidWZmZXIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uIHdpdGggTmFOIGVudHJ5IiwgMSwgZGJ1ZmZlcjEKKyAgICAgICAgICAgICAgICAuY29tcGFyZVRvKGRidWZmZXIzKSk7CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkdXBsaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm1hcmsoKTsKQEAgLTI1Miw3ICszMzQsMTUgQEAKICAgICAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBkdXBsaWNhdGUpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewogICAgICAgICAvLyBlcXVhbCB0byBzZWxmCiAgICAgICAgIGFzc2VydFRydWUoYnVmLmVxdWFscyhidWYpKTsKQEAgLTI3OCw2ICszNjgsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGRvdWJsZSBnZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC0yOTUsNiArMzk0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5Eb3VibGVCdWZmZXIgZ2V0KGRvdWJsZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRkb3VibGVBcnJheSgpIHsKICAgICAgICAgZG91YmxlIGFycmF5W10gPSBuZXcgZG91YmxlWzFdOwogICAgICAgICBidWYuY2xlYXIoKTsKQEAgLTMxNSw2ICs0MjMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBnZXQoZG91YmxlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0ZG91YmxlQXJyYXlpbnRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBkb3VibGUgYXJyYXlbXSA9IG5ldyBkb3VibGVbYnVmLmNhcGFjaXR5KCldOwpAQCAtMzgyLDYgKzQ5OSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgZG91YmxlIGdldChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTQwMSwxMSArNTI3LDI3IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZmFsc2UgcmV0dXJuZWQgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXJyYXkoKSB7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmhhc0FycmF5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIERvdWJsZUJ1ZmZlciByZWFkb25seSA9IGJ1Zi5hc1JlYWRPbmx5QnVmZmVyKCk7CkBAIC00MTYsMTEgKzU1OCwyNyBAQAogICAgICAgICBkdXBsaWNhdGUucG9zaXRpb24oYnVmLmNhcGFjaXR5KCkgLyAyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaGFzaENvZGUoKSAhPSBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZGlyZWN0IGJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmlzRGlyZWN0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvcmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcigpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpLCBidWYub3JkZXIoKSk7CiAgICAgfQpAQCAtNDI4LDYgKzU4NiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYm91bmRhcnkgdmFsdWVzLCBhbmQgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGRvdWJsZSgpIHsKIAogICAgICAgICBidWYuY2xlYXIoKTsKQEAgLTQ0OCw2ICs2MTUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBwdXQoZG91YmxlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0ZG91YmxlQXJyYXkoKSB7CiAgICAgICAgIGRvdWJsZSBhcnJheVtdID0gbmV3IGRvdWJsZVsxXTsKIApAQCAtNDcwLDYgKzY0NiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dChkb3VibGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGRvdWJsZUFycmF5aW50aW50KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZG91YmxlIGFycmF5W10gPSBuZXcgZG91YmxlW2J1Zi5jYXBhY2l0eSgpXTsKQEAgLTUzNyw2ICs3MjIsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBwdXQoamF2YS5uaW8uRG91YmxlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5Eb3VibGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXREb3VibGVCdWZmZXIoKSB7CiAgICAgICAgIERvdWJsZUJ1ZmZlciBvdGhlciA9IERvdWJsZUJ1ZmZlci5hbGxvY2F0ZShidWYuY2FwYWNpdHkoKSk7CiAKQEAgLTU2Niw2ICs3NjAsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBwdXQoaW50LCBkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0aW50ZG91YmxlKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC01ODcsNyArNzkwLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNsaWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNsaWNlKCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5jYXBhY2l0eSgpID4gNSk7CiAgICAgICAgIGJ1Zi5wb3NpdGlvbigxKTsKQEAgLTYxNiw3ICs4MjcsMTUgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzbGljZS5nZXQoMSksIDUwMCwgMC4wKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIHN0ciA9IGJ1Zi50b1N0cmluZygpOwogICAgICAgICBhc3NlcnRUcnVlKHN0ci5pbmRleE9mKCJEb3VibGUiKSA+PSAwIHx8IHN0ci5pbmRleE9mKCJkb3VibGUiKSA+PSAwKTsKQEAgLTYzMSw3ICs4NTAsMTUgQEAKICAgICAgKiBjYXNlIGZvciBjaGVjayBlcXVhbCBiZXR3ZWVuIGJ1ZjIgYW5kIGRvdWJsZSBhcnJheVtdIDMuIGNhc2UgZm9yIGNoZWNrIGEKICAgICAgKiBidWYyIGRlcGVuZGVucyB0byBhcnJheVtdCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfV3JhcCREKCkgewogICAgICAgICBkb3VibGUgYXJyYXlbXSA9IG5ldyBkb3VibGVbQlVGRkVSX0xFTkdUSF07CiAgICAgICAgIGxvYWRUZXN0RGF0YTEoYXJyYXksIDAsIEJVRkZFUl9MRU5HVEgpOwpAQCAtNjU4LDcgKzg4NSwxNSBAQAogICAgICAqIDMuIGNhc2UgZm9yIGNoZWNrIGEgYnVmMiBkZXBlbmRlbnMgdG8gYXJyYXlbXSA0LiBjYXNlIGV4cGVjdGVkCiAgICAgICogSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9XcmFwJERJSSgpIHsKICAgICAgICAgZG91YmxlIGFycmF5W10gPSBuZXcgZG91YmxlW0JVRkZFUl9MRU5HVEhdOwogICAgICAgICBpbnQgb2Zmc2V0ID0gNTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRHVwbGljYXRlRGlyZWN0Qnl0ZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRHVwbGljYXRlRGlyZWN0Qnl0ZUJ1ZmZlclRlc3QuamF2YQppbmRleCA2NTYyNDFhLi5iNjdkZTBjIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0R1cGxpY2F0ZURpcmVjdEJ5dGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EdXBsaWNhdGVEaXJlY3RCeXRlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiw5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIER1cGxpY2F0ZURpcmVjdEJ5dGVCdWZmZXJUZXN0IGV4dGVuZHMgRGlyZWN0Qnl0ZUJ1ZmZlclRlc3QgewogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRHVwbGljYXRlSGVhcEJ5dGVCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0R1cGxpY2F0ZUhlYXBCeXRlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDlmNDRkN2EuLjI5YWY2NzkgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRHVwbGljYXRlSGVhcEJ5dGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EdXBsaWNhdGVIZWFwQnl0ZUJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsNyArMTYsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRHVwbGljYXRlSGVhcEJ5dGVCdWZmZXJUZXN0IGV4dGVuZHMgSGVhcEJ5dGVCdWZmZXJUZXN0IHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0R1cGxpY2F0ZVdyYXBwZWRCeXRlQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9EdXBsaWNhdGVXcmFwcGVkQnl0ZUJ1ZmZlclRlc3QuamF2YQppbmRleCAyNzk2Yjg4Li43YjM4YmFjIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0R1cGxpY2F0ZVdyYXBwZWRCeXRlQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRHVwbGljYXRlV3JhcHBlZEJ5dGVCdWZmZXJUZXN0LmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIER1cGxpY2F0ZVdyYXBwZWRCeXRlQnVmZmVyVGVzdCBleHRlbmRzIFdyYXBwZWRCeXRlQnVmZmVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9GbG9hdEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vRmxvYXRCdWZmZXJUZXN0LmphdmEKaW5kZXggNjRjODMxYi4uNjdmMmMyZCAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9GbG9hdEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0Zsb2F0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNyw5ICsxNywxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkRvdWJsZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5JbnZhbGlkTWFya0V4Y2VwdGlvbjsKIApAQCAtMjcsNiArMzMsNyBAQAogICogVGVzdHMgamF2YS5uaW8uRmxvYXRCdWZmZXIKICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkZsb2F0QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIEZsb2F0QnVmZmVyVGVzdCBleHRlbmRzIEFic3RyYWN0QnVmZmVyVGVzdCB7CiAgICAgCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfVEVTVF9MRU5HVEggPSA1OwpAQCAtNTEsNyArNTgsMTUgQEAKICAgICAgKiBmb2xsb3dpbmcgdXNlY2FzZXM6IDEuIGNhc2UgZm9yIGNoZWNrIEZsb2F0QnVmZmVyIHRlc3RCdWYgcHJvcGVydGllcyAyLgogICAgICAqIGNhc2UgZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYm91bmRhcnkgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQWxsb2NhdGVJKCkgewogICAgICAgICAvLyBjYXNlOiBGbG9hdEJ1ZmZlciB0ZXN0QnVmIHByb3BlcnRpZXMgaXMgc2F0aXNmeSB0aGUgY29uZGl0aW9ucwogICAgICAgICAvLyBzcGVjaWZpY2F0aW9uCkBAIC02OCw3ICs4MywxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRoZSBzYW1lIHRlc3QgYXMgdGVzdEFycmF5T2Zmc2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICBmbG9hdCBhcnJheVtdID0gYnVmLmFycmF5KCk7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKQEAgLTg1LDcgKzEwOCwxNSBAQAogICAgICAgICBsb2FkVGVzdERhdGEyKGJ1Zik7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2FtZSB0ZXN0IGFzIHRlc3RBcnJheS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgZmxvYXQgYXJyYXlbXSA9IGJ1Zi5hcnJheSgpOwogICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgYXJyYXksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYuY2FwYWNpdHkoKSk7CkBAIC0xMDIsNyArMTMzLDE1IEBACiAgICAgICAgIGxvYWRUZXN0RGF0YTIoYnVmKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhc1JlYWRPbmx5QnVmZmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFzUmVhZE9ubHlCdWZmZXIoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBidWYubWFyaygpOwpAQCAtMTI2LDcgKzE2NSwxNSBAQAogICAgICAgICBidWYucmVzZXQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5wb3NpdGlvbigpLCAwKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYWN0KCkgewogCiAgICAgICAgIC8vIGNhc2U6IGJ1ZmZlciBpcyBmdWxsCkBAIC0xNzgsNyArMjI1LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5GbG9hdEJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUbygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5jb21wYXJlVG8obnVsbCk7ICAgIApAQCAtMjA3LDggKzI2MiwyOCBAQAogICAgICAgICBvdGhlci5saW1pdCg1KTsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuY29tcGFyZVRvKG90aGVyKSA+IDApOwogICAgICAgICBhc3NlcnRUcnVlKG90aGVyLmNvbXBhcmVUbyhidWYpIDwgMCk7Ci0gICAgfQorICAgICAgICAKKyAgICAgICAgRmxvYXRCdWZmZXIgZmJ1ZmZlcjEgPSBGbG9hdEJ1ZmZlci53cmFwKG5ldyBmbG9hdFtdIHsgRmxvYXQuTmFOIH0pOworICAgICAgICBGbG9hdEJ1ZmZlciBmYnVmZmVyMiA9IEZsb2F0QnVmZmVyLndyYXAobmV3IGZsb2F0W10geyBGbG9hdC5OYU4gfSk7CisgICAgICAgIEZsb2F0QnVmZmVyIGZidWZmZXIzID0gRmxvYXRCdWZmZXIud3JhcChuZXcgZmxvYXRbXSB7IDQyZiB9KTsKIAorICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCBlcXVhbCBjb21wYXJpc29uIHdpdGggTmFOIGVudHJ5IiwgMCwgZmJ1ZmZlcjEKKyAgICAgICAgICAgICAgICAuY29tcGFyZVRvKGZidWZmZXIyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uIHdpdGggTmFOIGVudHJ5IiwgMSwgZmJ1ZmZlcjMKKyAgICAgICAgICAgICAgICAuY29tcGFyZVRvKGZidWZmZXIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uIHdpdGggTmFOIGVudHJ5IiwgMSwgZmJ1ZmZlcjEKKyAgICAgICAgICAgICAgICAuY29tcGFyZVRvKGZidWZmZXIzKSk7CisKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImR1cGxpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGUoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBidWYubWFyaygpOwpAQCAtMjQwLDcgKzMxNSwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGR1cGxpY2F0ZSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CiAgICAgICAgIC8vIGVxdWFsIHRvIHNlbGYKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuZXF1YWxzKGJ1ZikpOwpAQCAtMjY2LDYgKzM0OSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgZmxvYXQgZ2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtMjgzLDYgKzM3NSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uRmxvYXRCdWZmZXIgZ2V0KGZsb2F0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0ZmxvYXRBcnJheSgpIHsKICAgICAgICAgZmxvYXQgYXJyYXlbXSA9IG5ldyBmbG9hdFsxXTsKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC0zMTEsNiArNDEyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5GbG9hdEJ1ZmZlciBnZXQoZmxvYXRbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldGZsb2F0QXJyYXlpbnRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmbG9hdCBhcnJheVtdID0gbmV3IGZsb2F0W2J1Zi5jYXBhY2l0eSgpXTsKQEAgLTM3OCw2ICs0ODgsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGZsb2F0IGdldChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTM5NywxMSArNTE2LDI3IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBhcnJheSBtZXRob2QgZG9lc24ndCByZXR1cm4gbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChidWYuYXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgRmxvYXRCdWZmZXIgcmVhZG9ubHkgPSBidWYuYXNSZWFkT25seUJ1ZmZlcigpOwpAQCAtNDEyLDExICs1NDcsMjcgQEAKICAgICAgICAgZHVwbGljYXRlLnBvc2l0aW9uKGJ1Zi5jYXBhY2l0eSgpIC8gMik7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmhhc2hDb2RlKCkgIT0gZHVwbGljYXRlLmhhc2hDb2RlKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGRpcmVjdCBidWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEaXJlY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNEaXJlY3QoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5pc0RpcmVjdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXIoKSB7CiAgICAgICAgIGJ1Zi5vcmRlcigpOwogICAgICAgICBpZiAoYnVmLmhhc0FycmF5KCkpIHsKQEAgLTQyNyw2ICs1NzgsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkZsb2F0QnVmZmVyIHB1dChmbG9hdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRmbG9hdCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtNDQ2LDYgKzYwNiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KGZsb2F0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Zsb2F0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRmbG9hdEFycmF5KCkgewogICAgICAgICBmbG9hdCBhcnJheVtdID0gbmV3IGZsb2F0WzFdOwogICAgICAgICBidWYuY2xlYXIoKTsKQEAgLTQ3NCw2ICs2NDMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkZsb2F0QnVmZmVyIHB1dChmbG9hdFtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRmbG9hdEFycmF5aW50aW50KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZmxvYXQgYXJyYXlbXSA9IG5ldyBmbG9hdFtidWYuY2FwYWNpdHkoKV07CkBAIC01NDAsNiArNzE4LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwdXQoamF2YS5uaW8uRmxvYXRCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkZsb2F0QnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0RmxvYXRCdWZmZXIoKSB7CiAgICAgICAgIEZsb2F0QnVmZmVyIG90aGVyID0gRmxvYXRCdWZmZXIuYWxsb2NhdGUoYnVmLmNhcGFjaXR5KCkpOwogICAgICAgICB0cnkgewpAQCAtNTc1LDYgKzc2MiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KGludCwgZmxvYXQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRpbnRmbG9hdCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtNTk2LDcgKzc5MiwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzbGljZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTbGljZSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuY2FwYWNpdHkoKSA+IDUpOwogICAgICAgICBidWYucG9zaXRpb24oMSk7CkBAIC02MjQsNyArODI4LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2xpY2UuZ2V0KDEpLCA1MDAsIDAuMCk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZyBzdHIgPSBidWYudG9TdHJpbmcoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzdHIuaW5kZXhPZigiRmxvYXQiKSA+PSAwIHx8IHN0ci5pbmRleE9mKCJmbG9hdCIpID49IDApOwpAQCAtNjM5LDcgKzg1MSwxNSBAQAogICAgICAqIGZvciBjaGVjayBlcXVhbCBiZXR3ZWVuIGJ1ZjIgYW5kIGZsb2F0IGFycmF5W10gMy4gY2FzZSBmb3IgY2hlY2sgYSBidWYyCiAgICAgICogZGVwZW5kZW5zIHRvIGFycmF5W10KICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1dyYXAkUygpIHsKICAgICAgICAgZmxvYXQgYXJyYXlbXSA9IG5ldyBmbG9hdFtCVUZGRVJfTEVOR1RIXTsKICAgICAgICAgbG9hZFRlc3REYXRhMShhcnJheSwgMCwgQlVGRkVSX0xFTkdUSCk7CkBAIC02NjYsNyArODg2LDE1IEBACiAgICAgICogY2FzZSBmb3IgY2hlY2sgYSBidWYyIGRlcGVuZGVucyB0byBhcnJheVtdIDQuIGNhc2UgZXhwZWN0ZWQKICAgICAgKiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfV3JhcCRTSUkoKSB7CiAgICAgICAgIGZsb2F0IGFycmF5W10gPSBuZXcgZmxvYXRbQlVGRkVSX0xFTkdUSF07CiAgICAgICAgIGludCBvZmZzZXQgPSA1OwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwQnl0ZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcEJ5dGVCdWZmZXJUZXN0LmphdmEKaW5kZXggMmY4ZTQ0Yi4uMTM5NDllNiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwQnl0ZUJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBCeXRlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNiw5ICsxNiwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBIZWFwQnl0ZUJ1ZmZlclRlc3QgZXh0ZW5kcyBCeXRlQnVmZmVyVGVzdCB7CiAgICAgCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAKQEAgLTM3LDYgKzQyLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmlvLkJ5dGVCdWZmZXIjYWxsb2NhdGUoaW50KQogICAgICAqIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvY2F0ZWRCeXRlQnVmZmVyX0lsbGVnYWxBcmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBCeXRlQnVmZmVyLmFsbG9jYXRlKC0xKTsKQEAgLTQ1LDE1ICs1OSwzOSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQgCiAgICAgICAgIH0KICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNEaXJlY3QgbWV0aG9kIHdpdGggbm90IGRpcmVjdCBidWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEaXJlY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNEaXJlY3QoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5pc0RpcmVjdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0FycmF5IHJldHVybnMgdHJ1ZSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNSZWFkT25seSBtZXRob2Qgd2l0aCBub24gcmVhZCBvbmx5IGJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlYWRPbmx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzUmVhZE9ubHkoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5pc1JlYWRPbmx5KCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcENoYXJCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBDaGFyQnVmZmVyVGVzdC5qYXZhCmluZGV4IGEwYzhkNzQuLmJhOWU2ODEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcENoYXJCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwQ2hhckJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsOSArMTYsMTQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIAotCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSGVhcENoYXJCdWZmZXJUZXN0IGV4dGVuZHMgQ2hhckJ1ZmZlclRlc3QgewogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CkBAIC0zMiw3ICszNywxNSBAQAogICAgICAgICBidWYgPSBudWxsOwogICAgICAgICBiYXNlQnVmID0gbnVsbDsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFsbG9jYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFsbG9jYXRlZENoYXJCdWZmZXJfSWxsZWdhbEFyZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENoYXJCdWZmZXIuYWxsb2NhdGUoLTEpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwRG91YmxlQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwRG91YmxlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDI5ODU4OTkuLmU1ZjhjM2UgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcERvdWJsZUJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBEb3VibGVCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDggKzE1LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkRvdWJsZUJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5Eb3VibGVCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSGVhcERvdWJsZUJ1ZmZlclRlc3QgZXh0ZW5kcyBEb3VibGVCdWZmZXJUZXN0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMzAsNyArMzYsMTUgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvY2F0ZWREb3VibGVCdWZmZXJfSWxsZWdhbEFyZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIERvdWJsZUJ1ZmZlci5hbGxvY2F0ZSgtMSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBGbG9hdEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcEZsb2F0QnVmZmVyVGVzdC5qYXZhCmluZGV4IGY5MGIzNGUuLjJkMWY3ZmQgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcEZsb2F0QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcEZsb2F0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5GbG9hdEJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBIZWFwRmxvYXRCdWZmZXJUZXN0IGV4dGVuZHMgRmxvYXRCdWZmZXJUZXN0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMzAsNyArMzYsMTUgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvY2F0ZWRGbG9hdEJ1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmxvYXRCdWZmZXIuYWxsb2NhdGUoLTEpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwSW50QnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwSW50QnVmZmVyVGVzdC5qYXZhCmluZGV4IDBkNjg4MzUuLjk0NmY3NWMgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcEludEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBJbnRCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDggKzE1LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5JbnRCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSGVhcEludEJ1ZmZlclRlc3QgZXh0ZW5kcyBJbnRCdWZmZXJUZXN0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMzAsNyArMzYsMTUgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvY2F0ZWRJbnRCdWZmZXJfSWxsZWdhbEFyZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEludEJ1ZmZlci5hbGxvY2F0ZSgtMSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBMb25nQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9IZWFwTG9uZ0J1ZmZlclRlc3QuamF2YQppbmRleCBmNGYyYWUxLi5hMDhkOTNlIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBMb25nQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcExvbmdCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDggKzE1LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkxvbmdCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uTG9uZ0J1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBIZWFwTG9uZ0J1ZmZlclRlc3QgZXh0ZW5kcyBMb25nQnVmZmVyVGVzdCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKQEAgLTMwLDcgKzM2LDE1IEBACiAgICAgICAgIGJ1ZiA9IG51bGw7CiAgICAgICAgIGJhc2VCdWYgPSBudWxsOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWxsb2NhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb2NhdGVkTG9uZ0J1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTG9uZ0J1ZmZlci5hbGxvY2F0ZSgtMSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0hlYXBTaG9ydEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcFNob3J0QnVmZmVyVGVzdC5qYXZhCmluZGV4IDMyN2EwMzUuLjE1ZDdmMGEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcFNob3J0QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSGVhcFNob3J0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5TaG9ydEJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5TaG9ydEJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBIZWFwU2hvcnRCdWZmZXJUZXN0IGV4dGVuZHMgU2hvcnRCdWZmZXJUZXN0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMzAsNyArMzYsMTUgQEAKICAgICAgICAgYnVmID0gbnVsbDsKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGxvY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvY2F0ZWRTaG9ydEJ1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU2hvcnRCdWZmZXIuYWxsb2NhdGUoLTEpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9JbnRCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0ludEJ1ZmZlclRlc3QuamF2YQppbmRleCAxOGE2ODYwLi4zMDhiZmQ2IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0ludEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0ludEJ1ZmZlclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKQEAgLTI3LDYgKzMyLDcgQEAKICAqIFRlc3RzIGphdmEubmlvLkludEJ1ZmZlcgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uSW50QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIEludEJ1ZmZlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEJ1ZmZlclRlc3QgewogICAgIAogICAgIApAQCAtNTIsNyArNTgsMTUgQEAKICAgICAgKiBmb2xsb3dpbmcgdXNlY2FzZXM6IDEuIGNhc2UgZm9yIGNoZWNrIEludEJ1ZmZlciB0ZXN0QnVmIHByb3BlcnRpZXMgMi4KICAgICAgKiBjYXNlIGV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVpZnkgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFsbG9jYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9BbGxvY2F0ZUkoKSB7CiAgICAgICAgIC8vIGNhc2U6IEludEJ1ZmZlciB0ZXN0QnVmIHByb3BlcnRpZXMgaXMgc2F0aXNmeSB0aGUgY29uZGl0aW9ucwogICAgICAgICAvLyBzcGVjaWZpY2F0aW9uCkBAIC02OSw3ICs4MywxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRoZSBzYW1lIHRlc3QgYXMgdGVzdEFycmF5T2Zmc2V0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICBpbnQgYXJyYXlbXSA9IGJ1Zi5hcnJheSgpOwogICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgYXJyYXksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYuY2FwYWNpdHkoKSk7CkBAIC04Niw3ICsxMDgsMTUgQEAKICAgICAgICAgbG9hZFRlc3REYXRhMihidWYpOwogICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgYXJyYXksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYuY2FwYWNpdHkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGhlIHNhbWUgdGVzdCBhcyB0ZXN0QXJyYXkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXlPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgIHZvaWQgdGVzdEFycmF5T2Zmc2V0KCkgewogICAgICAgICBpbnQgYXJyYXlbXSA9IGJ1Zi5hcnJheSgpOwogICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgYXJyYXksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYuY2FwYWNpdHkoKSk7CkBAIC0xMDMsNyArMTMzLDE1IEBACiAgICAgICAgIGxvYWRUZXN0RGF0YTIoYnVmKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwogICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNSZWFkT25seUJ1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyAgdm9pZCB0ZXN0QXNSZWFkT25seUJ1ZmZlcigpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ1Zi5tYXJrKCk7CkBAIC0xMjcsNyArMTY1LDE1IEBACiAgICAgICAgIGJ1Zi5yZXNldCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYnVmLnBvc2l0aW9uKCksIDApOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RDb21wYWN0KCkgewogICAgICAgICAvLyBjYXNlOiBidWZmZXIgaXMgZnVsbAogICAgICAgICBidWYuY2xlYXIoKTsKQEAgLTE3OCw3ICsyMjQsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkludEJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RDb21wYXJlVG8oKSB7CiAgICAgICAgIC8vIGNvbXBhcmUgdG8gc2VsZgogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYnVmLmNvbXBhcmVUbyhidWYpKTsKQEAgLTIwMSw3ICsyNTUsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuY29tcGFyZVRvKG90aGVyKSA+IDApOwogICAgICAgICBhc3NlcnRUcnVlKG90aGVyLmNvbXBhcmVUbyhidWYpIDwgMCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImR1cGxpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyAgdm9pZCB0ZXN0RHVwbGljYXRlKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm1hcmsoKTsKQEAgLTIzMyw3ICsyOTUsMTUgQEAKICAgICAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBkdXBsaWNhdGUpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgIHZvaWQgdGVzdEVxdWFscygpIHsKICAgICAgICAgLy8gZXF1YWwgdG8gc2VsZgogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5lcXVhbHMoYnVmKSk7CkBAIC0yNTksNiArMzI5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgZ2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RHZXQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTI3Niw2ICszNTUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkludEJ1ZmZlciBnZXQoaW50W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RHZXRpbnRBcnJheSgpIHsKICAgICAgICAgaW50IGFycmF5W10gPSBuZXcgaW50WzFdOwogICAgICAgICBidWYuY2xlYXIoKTsKQEAgLTMwMiw2ICszOTAsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkludEJ1ZmZlciBnZXQoaW50W10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgIHZvaWQgdGVzdEdldGludEFycmF5aW50aW50KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgaW50IGFycmF5W10gPSBuZXcgaW50W2J1Zi5jYXBhY2l0eSgpXTsKQEAgLTM2OSw2ICs0NjYsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGludCBnZXQoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgIHZvaWQgdGVzdEdldGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtMzg4LDExICs0OTQsMjcgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGFycmF5IG1ldGhvZCBkb2Vzbid0IHJldHVybiBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChidWYuYXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIEludEJ1ZmZlciByZWFkb25seSA9IGJ1Zi5hc1JlYWRPbmx5QnVmZmVyKCk7CkBAIC00MDMsMTEgKzUyNSwyNyBAQAogICAgICAgICBkdXBsaWNhdGUucG9zaXRpb24oYnVmLmNhcGFjaXR5KCkgLyAyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaGFzaENvZGUoKSAhPSBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNEaXJlY3QgbWV0aG9kIGZvciBub24gZGlyZWN0IGJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyAgdm9pZCB0ZXN0SXNEaXJlY3QoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5pc0RpcmVjdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgIHZvaWQgdGVzdE9yZGVyKCkgewogICAgICAgICBidWYub3JkZXIoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpLCBidWYub3JkZXIoKSk7CkBAIC00MTYsNiArNTU0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5JbnRCdWZmZXIgcHV0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgIHZvaWQgdGVzdFB1dGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtNDM1LDYgKzU4MiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uSW50QnVmZmVyIHB1dChpbnRbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyAgdm9pZCB0ZXN0UHV0aW50QXJyYXkoKSB7CiAgICAgICAgIGludCBhcnJheVtdID0gbmV3IGludFsxXTsKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC00NjMsNiArNjE5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5JbnRCdWZmZXIgcHV0KGludFtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgIHZvaWQgdGVzdFB1dGludEFycmF5aW50aW50KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgaW50IGFycmF5W10gPSBuZXcgaW50W2J1Zi5jYXBhY2l0eSgpXTsKQEAgLTUyOSw2ICs2OTQsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkludEJ1ZmZlciBwdXQoamF2YS5uaW8uSW50QnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5JbnRCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyAgdm9pZCB0ZXN0UHV0SW50QnVmZmVyKCkgewogICAgICAgICBJbnRCdWZmZXIgb3RoZXIgPSBJbnRCdWZmZXIuYWxsb2NhdGUoYnVmLmNhcGFjaXR5KCkpOwogICAgICAgICB0cnkgewpAQCAtNTY0LDYgKzczOCwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uSW50QnVmZmVyIHB1dChpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyAgdm9pZCB0ZXN0UHV0aW50aW50KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC01ODUsNyArNzY4LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNsaWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RTbGljZSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuY2FwYWNpdHkoKSA+IDUpOwogICAgICAgICBidWYucG9zaXRpb24oMSk7CkBAIC02MTMsNyArODA0LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2xpY2UuZ2V0KDEpLCA1MDApOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljICB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIHN0ciA9IGJ1Zi50b1N0cmluZygpOwogICAgICAgICBhc3NlcnRUcnVlKHN0ci5pbmRleE9mKCJJbnQiKSA+PSAwIHx8IHN0ci5pbmRleE9mKCJpbnQiKSA+PSAwKTsKQEAgLTYyOCw3ICs4MjcsMTUgQEAKICAgICAgKiBlcXVhbCBiZXR3ZWVuIGJ1ZjIgYW5kIGludCBhcnJheVtdIDMuIGNhc2UgZm9yIGNoZWNrIGEgYnVmMiBkZXBlbmRlbnMgdG8KICAgICAgKiBhcnJheVtdCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfV3JhcCRJKCkgewogICAgICAgICBpbnQgYXJyYXlbXSA9IG5ldyBpbnRbQlVGRkVSX0xFTkdUSF07CiAgICAgICAgIGxvYWRUZXN0RGF0YTEoYXJyYXksIDAsIEJVRkZFUl9MRU5HVEgpOwpAQCAtNjU1LDcgKzg2MiwxNSBAQAogICAgICAqIGZvciBjaGVjayBhIGJ1ZjIgZGVwZW5kZW5zIHRvIGFycmF5W10gNC4gY2FzZSBleHBlY3RlZAogICAgICAqIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfV3JhcCRJSUkoKSB7CiAgICAgICAgIGludCBhcnJheVtdID0gbmV3IGludFtCVUZGRVJfTEVOR1RIXTsKICAgICAgICAgaW50IG9mZnNldCA9IDU7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0ludmFsaWRNYXJrRXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9JbnZhbGlkTWFya0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmMjkxZmY0Li5iMThkM2RhIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0ludmFsaWRNYXJrRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vSW52YWxpZE1hcmtFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE1LDE3ICsxNSwzMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5JbnZhbGlkTWFya0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoSW52YWxpZE1hcmtFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgSW52YWxpZE1hcmtFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbnZhbGlkTWFya0V4Y2VwdGlvbigpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBJbnZhbGlkTWFya0V4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vTG9uZ0J1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vTG9uZ0J1ZmZlclRlc3QuamF2YQppbmRleCAzZmIxNWE2Li4xNTI5ZGY3IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL0xvbmdCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9Mb25nQnVmZmVyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwpAQCAtMjcsNiArMzIsNyBAQAogICogVGVzdHMgamF2YS5uaW8uTG9uZ0J1ZmZlcgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uTG9uZ0J1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBMb25nQnVmZmVyVGVzdCBleHRlbmRzIEFic3RyYWN0QnVmZmVyVGVzdCB7CiAgICAgCiAgICAgCkBAIC01Miw3ICs1OCwxNSBAQAogICAgICAqIGZvbGxvd2luZyB1c2VjYXNlczogMS4gY2FzZSBmb3IgY2hlY2sgTG9uZ0J1ZmZlciB0ZXN0QnVmIHByb3BlcnRpZXMgMi4KICAgICAgKiBjYXNlIGV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGJvdW5kYXJ5IHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFsbG9jYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9BbGxvY2F0ZUkoKSB7CiAgICAgICAgIC8vIGNhc2U6IExvbmdCdWZmZXIgdGVzdEJ1ZiBwcm9wZXJ0aWVzIGlzIHNhdGlzZnkgdGhlIGNvbmRpdGlvbnMKICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbgpAQCAtNjksNyArODMsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2FtZSB0ZXN0IGFzIHRlc3RBcnJheU9mZnNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheSgpIHsKICAgICAgICAgbG9uZyBhcnJheVtdID0gYnVmLmFycmF5KCk7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKQEAgLTg2LDcgKzEwOCwxNSBAQAogICAgICAgICBsb2FkVGVzdERhdGEyKGJ1Zik7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2FtZSB0ZXN0IGFzIHRlc3RBcnJheS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgbG9uZyBhcnJheVtdID0gYnVmLmFycmF5KCk7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKQEAgLTEwMyw3ICsxMzMsMTUgQEAKICAgICAgICAgbG9hZFRlc3REYXRhMihidWYpOwogICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgYXJyYXksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYuY2FwYWNpdHkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFzUmVhZE9ubHlCdWZmZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWFkT25seUJ1ZmZlcigpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ1Zi5tYXJrKCk7CkBAIC0xMjcsNyArMTY1LDE1IEBACiAgICAgICAgIGJ1Zi5yZXNldCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYnVmLnBvc2l0aW9uKCksIDApOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhY3QoKSB7CiAgICAgICAgIC8vIGNhc2U6IGJ1ZmZlciBpcyBmdWxsCiAgICAgICAgIGJ1Zi5jbGVhcigpOwpAQCAtMTc4LDcgKzIyNCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uTG9uZ0J1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUbygpIHsKICAgICAgICAgLy8gY29tcGFyZSB0byBzZWxmCiAgICAgICAgIGFzc2VydEVxdWFscygwLCBidWYuY29tcGFyZVRvKGJ1ZikpOwpAQCAtMjAxLDcgKzI1NSwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5jb21wYXJlVG8ob3RoZXIpID4gMCk7CiAgICAgICAgIGFzc2VydFRydWUob3RoZXIuY29tcGFyZVRvKGJ1ZikgPCAwKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZHVwbGljYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZSgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ1Zi5tYXJrKCk7CkBAIC0yMzMsNyArMjk1LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgZHVwbGljYXRlKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKICAgICAgICAgLy8gZXF1YWwgdG8gc2VsZgogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5lcXVhbHMoYnVmKSk7CkBAIC0yNTksNiArMzI5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBsb25nIGdldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTI3Niw2ICszNTUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkxvbmdCdWZmZXIgZ2V0KGxvbmdbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldGxvbmdBcnJheSgpIHsKICAgICAgICAgbG9uZyBhcnJheVtdID0gbmV3IGxvbmdbMV07CiAgICAgICAgIGJ1Zi5jbGVhcigpOwpAQCAtMzAzLDYgKzM5MSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uTG9uZ0J1ZmZlciBnZXQobG9uZ1tdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRsb25nQXJyYXlpbnRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBsb25nIGFycmF5W10gPSBuZXcgbG9uZ1tidWYuY2FwYWNpdHkoKV07CkBAIC0zNzAsNiArNDY3LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBsb25nIGdldChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRpbnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTM4OSwxMSArNDk1LDI3IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBhcnJheSBtZXRob2QgZG9lc24ndCByZXR1cm4gbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChidWYuYXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgTG9uZ0J1ZmZlciByZWFkb25seSA9IGJ1Zi5hc1JlYWRPbmx5QnVmZmVyKCk7CkBAIC00MDQsMTEgKzUyNiwyNyBAQAogICAgICAgICBkdXBsaWNhdGUucG9zaXRpb24oYnVmLmNhcGFjaXR5KCkgLyAyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaGFzaENvZGUoKSAhPSBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNEaXJlY3QgbWV0aG9kIGZvciBub24gZGlyZWN0IGJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RpcmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdCgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmlzRGlyZWN0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvcmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcigpIHsKICAgICAgICAgYnVmLm9yZGVyKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSwgYnVmLm9yZGVyKCkpOwpAQCAtNDE3LDYgKzU1NSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGxvbmcoKSB7CiAgICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC00MzYsNiArNTgzLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5Mb25nQnVmZmVyIHB1dChsb25nW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGxvbmdBcnJheSgpIHsKICAgICAgICAgbG9uZyBhcnJheVtdID0gbmV3IGxvbmdbMV07CiAgICAgICAgIGJ1Zi5jbGVhcigpOwpAQCAtNDY0LDYgKzYyMCwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQobG9uZ1tdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZ1tdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGxvbmdBcnJheWludGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGxvbmcgYXJyYXlbXSA9IG5ldyBsb25nW2J1Zi5jYXBhY2l0eSgpXTsKQEAgLTUzNiw2ICs3MDEsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLkxvbmdCdWZmZXIgcHV0KGphdmEubmlvLkxvbmdCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkxvbmdCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRMb25nQnVmZmVyKCkgewogICAgICAgICBMb25nQnVmZmVyIG90aGVyID0gTG9uZ0J1ZmZlci5hbGxvY2F0ZShidWYuY2FwYWNpdHkoKSk7CiAgICAgICAgIHRyeSB7CkBAIC01NzEsNiArNzQ1LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5Mb25nQnVmZmVyIHB1dChpbnQsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGludGxvbmcoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTU5Miw3ICs3NzUsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2xpY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2xpY2UoKSB7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmNhcGFjaXR5KCkgPiA1KTsKICAgICAgICAgYnVmLnBvc2l0aW9uKDEpOwpAQCAtNjIwLDcgKzgxMSwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNsaWNlLmdldCgxKSwgNTAwKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIHN0ciA9IGJ1Zi50b1N0cmluZygpOwogICAgICAgICBhc3NlcnRUcnVlKHN0ci5pbmRleE9mKCJMb25nIikgPj0gMCB8fCBzdHIuaW5kZXhPZigibG9uZyIpID49IDApOwpAQCAtNjM1LDcgKzgzNCwxNSBAQAogICAgICAqIGZvciBjaGVjayBlcXVhbCBiZXR3ZWVuIGJ1ZjIgYW5kIGxpbmcgYXJyYXlbXSAzLiBjYXNlIGZvciBjaGVjayBhIGJ1ZjIKICAgICAgKiBkZXBlbmRlbnMgdG8gYXJyYXlbXQogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9XcmFwJEwoKSB7CiAgICAgICAgIGxvbmcgYXJyYXlbXSA9IG5ldyBsb25nW0JVRkZFUl9MRU5HVEhdOwogICAgICAgICBsb2FkVGVzdERhdGExKGFycmF5LCAwLCBCVUZGRVJfTEVOR1RIKTsKQEAgLTY2Miw3ICs4NjksMTUgQEAKICAgICAgKiBjYXNlIGZvciBjaGVjayBhIGJ1ZjIgZGVwZW5kZW5zIHRvIGFycmF5W10gNC4gY2FzZSBleHBlY3RlZAogICAgICAqIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1dyYXAkTElJKCkgewogICAgICAgICBsb25nIGFycmF5W10gPSBuZXcgbG9uZ1tCVUZGRVJfTEVOR1RIXTsKICAgICAgICAgaW50IG9mZnNldCA9IDU7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL01hcHBlZEJ5dGVCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL01hcHBlZEJ5dGVCdWZmZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjNTBhZQotLS0gL2Rldi9udWxsCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vTWFwcGVkQnl0ZUJ1ZmZlclRlc3QuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLk1hcE1vZGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBNYXBwZWRCeXRlQnVmZmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIEZpbGUgdG1wRmlsZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIHJlZ3Jlc3Npb24gdGVzdCBmb3IgZmFpbGluZyB0byBjb3JyZWN0bHkgc2V0IGNhcGFjaXR5IG9mIHVuZGVybHlpbmcKKyAgICAgKiB3cmFwcGVkIGJ1ZmZlciBmcm9tIGEgbWFwcGVkIGJ5dGUgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3Rhc0ludEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE1hcCBmaWxlCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpOworICAgICAgICBGaWxlQ2hhbm5lbCBmYyA9IGZpcy5nZXRDaGFubmVsKCk7CisgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgbW1iID0gZmMubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBmYworICAgICAgICAgICAgICAgIC5zaXplKCkpOworICAgICAgICBpbnQgbGVuID0gbW1iLmNhcGFjaXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR290IHdyb25nIG51bWJlciBvZiBieXRlcyIsIDQ2LCBsZW4pOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgLy8gUmVhZCBpbiBvdXIgMjYgYnl0ZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSB7CisgICAgICAgICAgICBieXRlIGIgPSBtbWIuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCB3cm9uZyBieXRlIHZhbHVlIiwgKGJ5dGUpICdBJyArIGksIGIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgY29udmVydCB0byBhbiBJbnRCdWZmZXIgdG8gcmVhZCBvdXIgaW50cworICAgICAgICBJbnRCdWZmZXIgaWJ1ZmZlciA9IG1tYi5hc0ludEJ1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgaW50IHZhbCA9IGlidWZmZXIuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCB3cm9uZyBpbnQgdmFsdWUiLCBpICsgMSwgdmFsKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIGZjLmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlciNmb3JjZSgpfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9yY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBidWZmZXIgd2FzIG5vdCBtYXBwZWQgaW4gcmVhZC93cml0ZSBtb2RlCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpOworICAgICAgICBGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbFJlYWQgPSBmaWxlSW5wdXRTdHJlYW0uZ2V0Q2hhbm5lbCgpOworICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIG1tYlJlYWQgPSBmaWxlQ2hhbm5lbFJlYWQubWFwKE1hcE1vZGUuUkVBRF9PTkxZLCAwLAorICAgICAgICAgICAgICAgIGZpbGVDaGFubmVsUmVhZC5zaXplKCkpOworCisgICAgICAgIG1tYlJlYWQuZm9yY2UoKTsKKworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpOworICAgICAgICBGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbFIgPSBpbnB1dFN0cmVhbS5nZXRDaGFubmVsKCk7CisgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgcmVzdWx0UmVhZCA9IGZpbGVDaGFubmVsUi5tYXAoTWFwTW9kZS5SRUFEX09OTFksIDAsCisgICAgICAgICAgICAgICAgZmlsZUNoYW5uZWxSLnNpemUoKSk7CisKKyAgICAgICAgLy9JZiB0aGlzIGJ1ZmZlciB3YXMgbm90IG1hcHBlZCBpbiByZWFkL3dyaXRlIG1vZGUsIHRoZW4gaW52b2tpbmcgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJJbnZva2luZyBmb3JjZSgpIHNob3VsZCBoYXZlIG5vIGVmZmVjdCB3aGVuIHRoaXMgYnVmZmVyIHdhcyBub3QgbWFwcGVkIGluIHJlYWQvd3JpdGUgbW9kZSIsCisgICAgICAgICAgICAgICAgbW1iUmVhZCwgcmVzdWx0UmVhZCk7CisKKyAgICAgICAgLy8gQnVmZmVyIHdhcyBtYXBwZWQgaW4gcmVhZC93cml0ZSBtb2RlCisgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFuZG9tRmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHRtcEZpbGUsICJydyIpOworICAgICAgICBGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbFJlYWRXcml0ZSA9IHJhbmRvbUZpbGUuZ2V0Q2hhbm5lbCgpOworICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIG1tYlJlYWRXcml0ZSA9IGZpbGVDaGFubmVsUmVhZFdyaXRlLm1hcCgKKyAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbC5NYXBNb2RlLlJFQURfV1JJVEUsIDAsIGZpbGVDaGFubmVsUmVhZFdyaXRlLnNpemUoKSk7CisKKyAgICAgICAgbW1iUmVhZFdyaXRlLnB1dCgoYnl0ZSkgJ28nKTsKKyAgICAgICAgbW1iUmVhZFdyaXRlLmZvcmNlKCk7CisKKyAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYW5kb20gPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSh0bXBGaWxlLCAicnciKTsKKyAgICAgICAgRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWxSVyA9IHJhbmRvbS5nZXRDaGFubmVsKCk7CisgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgcmVzdWx0UmVhZFdyaXRlID0gZmlsZUNoYW5uZWxSVy5tYXAoCisgICAgICAgICAgICAgICAgRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX1dSSVRFLCAwLCBmaWxlQ2hhbm5lbFJXLnNpemUoKSk7CisKKyAgICAgICAgLy8gSW52b2tpbmcgZm9yY2UoKSB3aWxsIGNoYW5nZSB0aGUgYnVmZmVyCisgICAgICAgIGFzc2VydEZhbHNlKG1tYlJlYWRXcml0ZS5lcXVhbHMocmVzdWx0UmVhZFdyaXRlKSk7CisgICAgICAgIAorICAgICAgICBmaWxlQ2hhbm5lbFJlYWQuY2xvc2UoKTsKKyAgICAgICAgZmlsZUNoYW5uZWxSLmNsb3NlKCk7CisgICAgICAgIGZpbGVDaGFubmVsUmVhZFdyaXRlLmNsb3NlKCk7CisgICAgICAgIGZpbGVDaGFubmVsUlcuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXIjbG9hZCgpfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpOworICAgICAgICBGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbFJlYWQgPSBmaWxlSW5wdXRTdHJlYW0uZ2V0Q2hhbm5lbCgpOworICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIG1tYlJlYWQgPSBmaWxlQ2hhbm5lbFJlYWQubWFwKE1hcE1vZGUuUkVBRF9PTkxZLCAwLAorICAgICAgICAgICAgICAgIGZpbGVDaGFubmVsUmVhZC5zaXplKCkpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1tYlJlYWQsIG1tYlJlYWQubG9hZCgpKTsKKworICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhbmRvbUZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSh0bXBGaWxlLCAicnciKTsKKyAgICAgICAgRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWxSZWFkV3JpdGUgPSByYW5kb21GaWxlLmdldENoYW5uZWwoKTsKKyAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBtbWJSZWFkV3JpdGUgPSBmaWxlQ2hhbm5lbFJlYWRXcml0ZS5tYXAoCisgICAgICAgICAgICAgICAgRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX1dSSVRFLCAwLCBmaWxlQ2hhbm5lbFJlYWRXcml0ZS5zaXplKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhtbWJSZWFkV3JpdGUsIG1tYlJlYWRXcml0ZS5sb2FkKCkpOworICAgICAgICAKKyAgICAgICAgZmlsZUNoYW5uZWxSZWFkLmNsb3NlKCk7CisgICAgICAgIGZpbGVDaGFubmVsUmVhZFdyaXRlLmNsb3NlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBDcmVhdGUgdGVtcCBmaWxlIHdpdGggMjYgYnl0ZXMgYW5kIDUgaW50cworICAgICAgICB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaGFybW9ueSIsICJ0ZXN0Iik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorICAgICAgICB0bXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKTsKKyAgICAgICAgRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBmaWxlT3V0cHV0U3RyZWFtLmdldENoYW5uZWwoKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgyNiArIDIwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSB7CisgICAgICAgICAgICBieXRlQnVmZmVyLnB1dCgoYnl0ZSkgKCdBJyArIGkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgYnl0ZUJ1ZmZlci5wdXRJbnQoaSArIDEpOworICAgICAgICB9CisgICAgICAgIGJ5dGVCdWZmZXIucmV3aW5kKCk7CisgICAgICAgIGZpbGVDaGFubmVsLndyaXRlKGJ5dGVCdWZmZXIpOworICAgICAgICBmaWxlQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICBmaWxlT3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUJ1ZmZlckV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlCdWZmZXJFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggODU2YmQ1Yi4uN2E4ZGM0YyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUJ1ZmZlckV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5QnVmZmVyRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSwxNyArMTUsMzIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uUmVhZE9ubHlCdWZmZXJFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbigpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlDaGFyQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUNoYXJCdWZmZXJUZXN0LmphdmEKaW5kZXggZTg0Y2M5Yy4uNjlhZTg0YyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUNoYXJCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUNoYXJCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uUmVhZE9ubHlCdWZmZXJFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZWFkT25seUNoYXJCdWZmZXJUZXN0IGV4dGVuZHMgQ2hhckJ1ZmZlclRlc3QgewogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTMyLDE1ICszOCw0MSBAQAogICAgICAgICBiYXNlQnVmID0gbnVsbDsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzUmVhZE9ubHkgcmV0dXJucyB0cnVlIGZvciByZWFkIG9ubHkgIiArCisgICAgICAgICAgICAiQ2hhckJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlYWRPbmx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzUmVhZE9ubHkoKSB7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmlzUmVhZE9ubHkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBoYXNBcnJheSByZXR1cm5zIGZhbHNlIGZvciByZWFkIG9ubHkgIiArCisgICAgICAgICAgICAiQ2hhckJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmhhc0FycmF5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5KCk7CkBAIC00OCwxMiArODAsMjggQEAKICAgICAgICAgfSBjYXRjaCAoUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewogICAgICAgICBDaGFyQnVmZmVyIGR1cGxpY2F0ZSA9IGJ1Zi5kdXBsaWNhdGUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5oYXNoQ29kZSgpLCBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXlPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlPZmZzZXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXlPZmZzZXQoKTsKQEAgLTYxLDcgKzEwOSwxNSBAQAogICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhY3QoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuY29tcGFjdCgpOwpAQCAtNzAsNyArMTI2LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRjaGFyKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLnB1dCgoY2hhcikgMCk7CkBAIC03OSw3ICsxNDMsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiBhbmQgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGNoYXJBcnJheSgpIHsKICAgICAgICAgY2hhciBhcnJheVtdID0gbmV3IGNoYXJbMV07CiAgICAgICAgIHRyeSB7CkBAIC05NSw3ICsxNjcsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGNoYXJBcnJheWludGludCgpIHsKICAgICAgICAgY2hhciBhcnJheVtdID0gbmV3IGNoYXJbMV07CiAgICAgICAgIHRyeSB7CkBAIC0xMjMsNyArMjAzLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRDaGFyQnVmZmVyKCkgewogICAgICAgICBDaGFyQnVmZmVyIG90aGVyID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxKTsKICAgICAgICAgdHJ5IHsKQEAgLTE0NSw3ICsyMzMsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0aW50Y2hhcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5wdXQoMCwgKGNoYXIpIDApOwpAQCAtMTYwLDcgKzI1NiwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dFN0cmluZ2ludGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIFN0cmluZyBzdHIgPSBTdHJpbmcudmFsdWVPZihuZXcgY2hhcltidWYuY2FwYWNpdHkoKV0pOwpAQCAtMTkwLDcgKzI5NCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0U3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgc3RyID0gIiAiOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seURpcmVjdEJ5dGVCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5RGlyZWN0Qnl0ZUJ1ZmZlclRlc3QuamF2YQppbmRleCAyMGM3OTE0Li5kMWE1MjY1IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5RGlyZWN0Qnl0ZUJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5RGlyZWN0Qnl0ZUJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsNyArMTYsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlEaXJlY3RCeXRlQnVmZmVyVGVzdCBleHRlbmRzIERpcmVjdEJ5dGVCdWZmZXJUZXN0IHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yOCwxNSArMzMsMzkgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc1JlYWRPbmx5IG1ldGhvZCBmb3IgcmVhZCBvbmx5IEJ5dGVCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlYWRPbmx5KCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5pc1JlYWRPbmx5KCkpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0FycmF5IG1ldGhvZCByZXR1cm5zIGZhbHNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgc3VwZXIucmVhZE9ubHlIYXNoQ29kZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlEb3VibGVCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5RG91YmxlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDA4MzRkMzMuLjQ2NTIyYzIgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlEb3VibGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seURvdWJsZUJ1ZmZlclRlc3QuamF2YQpAQCAtMTUsOSArMTUsMTUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uRG91YmxlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLlJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkRvdWJsZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZWFkT25seURvdWJsZUJ1ZmZlclRlc3QgZXh0ZW5kcyBEb3VibGVCdWZmZXJUZXN0IHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yOSwxNSArMzUsMzkgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGlzUmVhZE9ubHkgbWV0aG9kIGZvciByZWFkIG9ubHkgRG91YmxlQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhZE9ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWFkT25seSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNSZWFkT25seSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0FycmF5IHJldHVybnMgZmFsc2UgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXJyYXkoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5oYXNBcnJheSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5hcnJheSgpOwpAQCAtNDUsMTIgKzc1LDI4IEBACiAgICAgICAgIH0gY2F0Y2ggKFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgRG91YmxlQnVmZmVyIGR1cGxpY2F0ZSA9IGJ1Zi5kdXBsaWNhdGUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5oYXNoQ29kZSgpLCBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXlPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlPZmZzZXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXlPZmZzZXQoKTsKQEAgLTU4LDcgKzEwNCwxNSBAQAogICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhY3QoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuY29tcGFjdCgpOwpAQCAtNjcsNyArMTIxLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGRvdWJsZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5wdXQoMCk7CkBAIC03Niw3ICsxMzgsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRkb3VibGVBcnJheSgpIHsKICAgICAgICAgZG91YmxlIGFycmF5W10gPSBuZXcgZG91YmxlWzFdOwogICAgICAgICB0cnkgewpAQCAtOTIsNyArMTYyLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGRvdWJsZUFycmF5aW50aW50KCkgewogICAgICAgICBkb3VibGUgYXJyYXlbXSA9IG5ldyBkb3VibGVbMV07CiAgICAgICAgIHRyeSB7CkBAIC0xMjAsNyArMTk4LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkRvdWJsZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dERvdWJsZUJ1ZmZlcigpIHsKICAgICAgICAgRG91YmxlQnVmZmVyIG90aGVyID0gRG91YmxlQnVmZmVyLmFsbG9jYXRlKDEpOwogICAgICAgICB0cnkgewpAQCAtMTQyLDcgKzIyOCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGludGRvdWJsZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5wdXQoMCwgKGRvdWJsZSkgMCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5RmxvYXRCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5RmxvYXRCdWZmZXJUZXN0LmphdmEKaW5kZXggM2FjYzVjNC4uMWVkY2VjYiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUZsb2F0QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlGbG9hdEJ1ZmZlclRlc3QuamF2YQpAQCAtMTUsOSArMTUsMTUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uUmVhZE9ubHlCdWZmZXJFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uRmxvYXRCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlGbG9hdEJ1ZmZlclRlc3QgZXh0ZW5kcyBGbG9hdEJ1ZmZlclRlc3QgewogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CkBAIC0yOCwxNSArMzQsNDAgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGlzUmVhZE9ubHkgbWV0aG9kIGZvciByZWFkIG9ubHkgRmxvYXRCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlYWRPbmx5KCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5pc1JlYWRPbmx5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaGFzQXJyYXkgcmV0dXJucyBmYWxzZSBmb3IgUmVhZCBPbmx5ICIgKworICAgICAgICAgICAgIkZsb2F0QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXkoKTsKQEAgLTQ1LDEyICs3NiwyOCBAQAogICAgICAgICAgICAgLy9leHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewogICAgICAgICBGbG9hdEJ1ZmZlciBkdXBsaWNhdGUgPSBidWYuZHVwbGljYXRlKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhidWYuaGFzaENvZGUoKSwgZHVwbGljYXRlLmhhc2hDb2RlKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5T2Zmc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5T2Zmc2V0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5T2Zmc2V0KCk7CkBAIC01OSw3ICsxMDYsMTUgQEAKICAgICAgICAgICAgIC8vZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5jb21wYWN0KCk7CkBAIC02OCw3ICsxMjMsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRmbG9hdCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5wdXQoMCk7CkBAIC03Nyw3ICsxNDAsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGZsb2F0QXJyYXkoKSB7CiAgICAgICAgIGZsb2F0IGFycmF5W10gPSBuZXcgZmxvYXRbMV07CiAgICAgICAgIHRyeSB7CkBAIC05Myw3ICsxNjQsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZmxvYXRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRmbG9hdEFycmF5aW50aW50KCkgewogICAgICAgICBmbG9hdCBhcnJheVtdID0gbmV3IGZsb2F0WzFdOwogICAgICAgICB0cnkgewpAQCAtMTIxLDcgKzIwMCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5GbG9hdEJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dEZsb2F0QnVmZmVyKCkgewogICAgICAgICBGbG9hdEJ1ZmZlciBvdGhlciA9IEZsb2F0QnVmZmVyLmFsbG9jYXRlKDEpOwogICAgICAgICB0cnkgewpAQCAtMTQzLDcgKzIzMCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0aW50ZmxvYXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYucHV0KDAsIChmbG9hdCkgMCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcEJ5dGVCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcEJ5dGVCdWZmZXJUZXN0LmphdmEKaW5kZXggNzQ1MmEyNC4uN2MwZjA5MyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBCeXRlQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwQnl0ZUJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsNyArMTYsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlIZWFwQnl0ZUJ1ZmZlclRlc3QgZXh0ZW5kcyBIZWFwQnl0ZUJ1ZmZlclRlc3QgewogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI4LDE1ICszMywzOSBAQAogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGlzUmVhZE9ubHkgbWV0aG9kIGZvciByZWFkIG9ubHkgQnl0ZUJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlYWRPbmx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzUmVhZE9ubHkoKSB7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmlzUmVhZE9ubHkoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZhbHNlIHJldHVybmVkIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0FycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgc3VwZXIucmVhZE9ubHlIYXNoQ29kZSgpOyAgICAKICAgICB9CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcENoYXJCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcENoYXJCdWZmZXJUZXN0LmphdmEKaW5kZXggNGM3NzkyYS4uZTVhNDM3ZCAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBDaGFyQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwQ2hhckJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsOSArMTYsMTQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIAotCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlIZWFwQ2hhckJ1ZmZlclRlc3QgZXh0ZW5kcyBSZWFkT25seUNoYXJCdWZmZXJUZXN0IHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcERvdWJsZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwRG91YmxlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDVjMjI5YTIuLjg4NDhlMjEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwRG91YmxlQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwRG91YmxlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5Eb3VibGVCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uRG91YmxlQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5SGVhcERvdWJsZUJ1ZmZlclRlc3QgZXh0ZW5kcyBSZWFkT25seURvdWJsZUJ1ZmZlclRlc3QgewogICAgIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcEZsb2F0QnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBGbG9hdEJ1ZmZlclRlc3QuamF2YQppbmRleCBmMmM2NjQ0Li42Y2RhNDJjIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcEZsb2F0QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwRmxvYXRCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkZsb2F0QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5SGVhcEZsb2F0QnVmZmVyVGVzdCBleHRlbmRzIFJlYWRPbmx5RmxvYXRCdWZmZXJUZXN0IHsKKyAgICAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBidWYgPSBGbG9hdEJ1ZmZlci5hbGxvY2F0ZShCVUZGRVJfTEVOR1RIKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwSW50QnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBJbnRCdWZmZXJUZXN0LmphdmEKaW5kZXggZjlhMzg3Ny4uMDk4YjlhYiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBJbnRCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBJbnRCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5JbnRCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlIZWFwSW50QnVmZmVyVGVzdCBleHRlbmRzIFJlYWRPbmx5SW50QnVmZmVyVGVzdCB7CisgICAgCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgYnVmID0gSW50QnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9MRU5HVEgpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBMb25nQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBMb25nQnVmZmVyVGVzdC5qYXZhCmluZGV4IGVmYmE5NzguLjZlMTQ2MTUgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwTG9uZ0J1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcExvbmdCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkxvbmdCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uTG9uZ0J1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZWFkT25seUhlYXBMb25nQnVmZmVyVGVzdCBleHRlbmRzIFJlYWRPbmx5TG9uZ0J1ZmZlclRlc3R7CisgICAgCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgYnVmID0gTG9uZ0J1ZmZlci5hbGxvY2F0ZShCVUZGRVJfTEVOR1RIKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwU2hvcnRCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SGVhcFNob3J0QnVmZmVyVGVzdC5qYXZhCmluZGV4IGJiYmQ2MTYuLjRkMzhhYTcgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlIZWFwU2hvcnRCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUhlYXBTaG9ydEJ1ZmZlclRlc3QuamF2YQpAQCAtMTUsOSArMTUsMTYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uU2hvcnRCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uU2hvcnRCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlIZWFwU2hvcnRCdWZmZXJUZXN0IGV4dGVuZHMgUmVhZE9ubHlTaG9ydEJ1ZmZlclRlc3QgeworICAgIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIGJ1ZiA9IFNob3J0QnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9MRU5HVEgpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUludEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlJbnRCdWZmZXJUZXN0LmphdmEKaW5kZXggNjFlNzhhNi4uNmM5N2FlMiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUludEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5SW50QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw5ICsxNSwxNSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uUmVhZE9ubHlCdWZmZXJFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uSW50QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5SW50QnVmZmVyVGVzdCBleHRlbmRzIEludEJ1ZmZlclRlc3QgewogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CkBAIC0yOCwxNSArMzQsNDAgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGlzUmVhZE9ubHkgbWV0aG9kIGZvciByZWFkIG9ubHkgSW50QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhZE9ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWFkT25seSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNSZWFkT25seSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNBcnJheSBtZXRob2QgcmV0dXJucyBmYWxzZSBmb3IgcmVhZCBvbmx5ICIgKworICAgICAgICAgICAgIkludEJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmhhc0FycmF5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5KCk7CkBAIC00NSwxMiArNzYsMjggQEAKICAgICAgICAgICAgIC8vZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgSW50QnVmZmVyIGR1cGxpY2F0ZSA9IGJ1Zi5kdXBsaWNhdGUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5oYXNoQ29kZSgpLCBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXlPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlPZmZzZXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXlPZmZzZXQoKTsKQEAgLTU5LDcgKzEwNiwxNSBAQAogICAgICAgICAgICAgLy9leHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYWN0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmNvbXBhY3QoKTsKQEAgLTY4LDcgKzEyMywxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRpbnQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYucHV0KDApOwpAQCAtNzcsNyArMTQwLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0aW50QXJyYXkoKSB7CiAgICAgICAgIGludCBhcnJheVtdID0gbmV3IGludFsxXTsKICAgICAgICAgdHJ5IHsKQEAgLTkzLDcgKzE2NCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnRbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRpbnRBcnJheWludGludCgpIHsKICAgICAgICAgaW50IGFycmF5W10gPSBuZXcgaW50WzFdOwogICAgICAgICB0cnkgewpAQCAtMTIxLDcgKzIwMCwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5JbnRCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRJbnRCdWZmZXIoKSB7CiAgICAgICAgIEludEJ1ZmZlciBvdGhlciA9IEludEJ1ZmZlci5hbGxvY2F0ZSgxKTsKICAgICAgICAgdHJ5IHsKQEAgLTE0Myw3ICsyMzAsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRpbnRpbnQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYucHV0KDAsIChpbnQpIDApOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seUxvbmdCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5TG9uZ0J1ZmZlclRlc3QuamF2YQppbmRleCBiNjcwNjA2Li5iMjk5ZDA2IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5TG9uZ0J1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5TG9uZ0J1ZmZlclRlc3QuamF2YQpAQCAtMTUsOSArMTUsMTUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uTG9uZ0J1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5SZWFkT25seUJ1ZmZlckV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5Mb25nQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5TG9uZ0J1ZmZlclRlc3QgZXh0ZW5kcyBMb25nQnVmZmVyVGVzdCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKQEAgLTI4LDE1ICszNCw0MCBAQAogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNSZWFkT25seSBtZXRob2QgZm9yIHJlYWQgb25seSBMb25nQnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhZE9ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWFkT25seSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNSZWFkT25seSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0FycmF5IG1ldGhvZCByZXR1cm5zIGZhbHNlIGZvciByZWFkIG9ubHkgIiArCisgICAgICAgICAgICAiTG9uZ0J1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmhhc0FycmF5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5KCk7CkBAIC00NSwxMiArNzYsMjggQEAKICAgICAgICAgICAgIC8vZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgTG9uZ0J1ZmZlciBkdXBsaWNhdGUgPSBidWYuZHVwbGljYXRlKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhidWYuaGFzaENvZGUoKSwgZHVwbGljYXRlLmhhc2hDb2RlKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5T2Zmc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5T2Zmc2V0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5T2Zmc2V0KCk7CkBAIC01OSw3ICsxMDYsMTUgQEAKICAgICAgICAgICAgIC8vZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5jb21wYWN0KCk7CkBAIC02OCw3ICsxMjMsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGxvbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYucHV0KDApOwpAQCAtNzcsNyArMTQwLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGxvbmdBcnJheSgpIHsKICAgICAgICAgbG9uZyBhcnJheVtdID0gbmV3IGxvbmdbMV07CiAgICAgICAgIHRyeSB7CkBAIC05Myw3ICsxNjQsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZ1tdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dGxvbmdBcnJheWludGludCgpIHsKICAgICAgICAgbG9uZyBhcnJheVtdID0gbmV3IGxvbmdbMV07CiAgICAgICAgIHRyeSB7CkBAIC0xMjEsNyArMjAwLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkxvbmdCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRMb25nQnVmZmVyKCkgewogICAgICAgICBMb25nQnVmZmVyIG90aGVyID0gTG9uZ0J1ZmZlci5hbGxvY2F0ZSgxKTsKICAgICAgICAgdHJ5IHsKQEAgLTE0Myw3ICsyMzAsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0aW50bG9uZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5wdXQoMCwgKGxvbmcpIDApOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVNob3J0QnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVNob3J0QnVmZmVyVGVzdC5qYXZhCmluZGV4IDYxMWY2YmYuLjEzYzI1NTggMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlTaG9ydEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5U2hvcnRCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLlJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLlNob3J0QnVmZmVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLlNob3J0QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5U2hvcnRCdWZmZXJUZXN0IGV4dGVuZHMgU2hvcnRCdWZmZXJUZXN0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMjgsMTUgKzM0LDM5IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBpc1JlYWRPbmx5IG1ldGhvZCBmb3IgcmVhZCBvbmx5IFNob3J0QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhZE9ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWFkT25seSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaXNSZWFkT25seSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNBcnJheSBtZXRob2QgZm9yIHJlYWQgb25seSBTaG9ydEJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmhhc0FycmF5KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVmLmFycmF5KCk7CkBAIC00NSwxMiArNzUsMjggQEAKICAgICAgICAgICAgIC8vZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKICAgICAgICAgU2hvcnRCdWZmZXIgZHVwbGljYXRlID0gYnVmLmR1cGxpY2F0ZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYnVmLmhhc2hDb2RlKCksIGR1cGxpY2F0ZS5oYXNoQ29kZSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheU9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mZnNldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5hcnJheU9mZnNldCgpOwpAQCAtNTksNyArMTA1LDE1IEBACiAgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhY3QoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuY29tcGFjdCgpOwpAQCAtNjgsNyArMTIyLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0c2hvcnQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYucHV0KChzaG9ydCkwKTsKQEAgLTc3LDcgKzEzOSwxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0c2hvcnRBcnJheSgpIHsKICAgICAgICAgc2hvcnQgYXJyYXlbXSA9IG5ldyBzaG9ydFsxXTsKICAgICAgICAgdHJ5IHsKQEAgLTkzLDcgKzE2MywxNSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dHNob3J0QXJyYXlpbnRpbnQoKSB7CiAgICAgICAgIHNob3J0IGFycmF5W10gPSBuZXcgc2hvcnRbMV07CiAgICAgICAgIHRyeSB7CkBAIC0xMjEsNyArMTk5LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLlNob3J0QnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0U2hvcnRCdWZmZXIoKSB7CiAgICAgICAgIFNob3J0QnVmZmVyIG90aGVyID0gU2hvcnRCdWZmZXIuYWxsb2NhdGUoMSk7CiAgICAgICAgIHRyeSB7CkBAIC0xNDMsNyArMjI5LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgc2hvcnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRpbnRzaG9ydCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1Zi5wdXQoMCwgKHNob3J0KSAwKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkQnl0ZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkQnl0ZUJ1ZmZlclRlc3QuamF2YQppbmRleCAwMzFkNzViLi5iNWUxYWUwIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZEJ5dGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWRCeXRlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZWFkT25seVdyYXBwZWRCeXRlQnVmZmVyVGVzdCBleHRlbmRzIFdyYXBwZWRCeXRlQnVmZmVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjgsMTUgKzMzLDQwIEBACiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNSZWFkT25seSBtZXRob2QgZm9yIHJlYWQgb25seSB3cmFwcGVkICIgKworICAgICAgICAgICAgIkJ5dGVCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlYWRPbmx5KCkgewogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5pc1JlYWRPbmx5KCkpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNBcnJheSBtZXRob2QgZm9yIHJlYWQgb25seSB3cmFwcGVkIEJ5dGVCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXJyYXkoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5oYXNBcnJheSgpKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewogICAgICAgICBzdXBlci5yZWFkT25seUhhc2hDb2RlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWRDaGFyQnVmZmVyVGVzdDEuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkQ2hhckJ1ZmZlclRlc3QxLmphdmEKaW5kZXggNTdjMDRiZi4uNDgxZGQ5YyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWRDaGFyQnVmZmVyVGVzdDEuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZENoYXJCdWZmZXJUZXN0MS5qYXZhCkBAIC0xNiw4ICsxNiwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVhZE9ubHlXcmFwcGVkQ2hhckJ1ZmZlclRlc3QxIGV4dGVuZHMgUmVhZE9ubHlDaGFyQnVmZmVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWREb3VibGVCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZERvdWJsZUJ1ZmZlclRlc3QuamF2YQppbmRleCBkMWJhOWRmLi5iZGQ2MDY2IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZERvdWJsZUJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZERvdWJsZUJ1ZmZlclRlc3QuamF2YQpAQCAtMTUsOSArMTUsMTYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uRG91YmxlQnVmZmVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkRvdWJsZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZWFkT25seVdyYXBwZWREb3VibGVCdWZmZXJUZXN0IGV4dGVuZHMgUmVhZE9ubHlEb3VibGVCdWZmZXJUZXN0IHsKKwogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIGJ1ZiA9IERvdWJsZUJ1ZmZlci53cmFwKG5ldyBkb3VibGVbQlVGRkVSX0xFTkdUSF0pOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWRGbG9hdEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkRmxvYXRCdWZmZXJUZXN0LmphdmEKaW5kZXggYWZmZGRhYS4uN2U0ZDI4YiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWRGbG9hdEJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZEZsb2F0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw5ICsxNSwxNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5GbG9hdEJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZWFkT25seVdyYXBwZWRGbG9hdEJ1ZmZlclRlc3QgZXh0ZW5kcyBSZWFkT25seUZsb2F0QnVmZmVyVGVzdCB7CisKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBidWYgPSBGbG9hdEJ1ZmZlci53cmFwKG5ldyBmbG9hdFtCVUZGRVJfTEVOR1RIXSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZEludEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkSW50QnVmZmVyVGVzdC5qYXZhCmluZGV4IGE0ZDAxNTUuLjNjNTYwYmIgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkSW50QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkSW50QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw5ICsxNSwxNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uSW50QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5V3JhcHBlZEludEJ1ZmZlclRlc3QgZXh0ZW5kcyBSZWFkT25seUludEJ1ZmZlclRlc3QgeworCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgYnVmID0gSW50QnVmZmVyLndyYXAobmV3IGludFtCVUZGRVJfTEVOR1RIXSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZExvbmdCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZExvbmdCdWZmZXJUZXN0LmphdmEKaW5kZXggNTg0OTFkYS4uYjIzMDAxYSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWRMb25nQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkTG9uZ0J1ZmZlclRlc3QuamF2YQpAQCAtMTUsOSArMTUsMTYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uTG9uZ0J1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5Mb25nQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5V3JhcHBlZExvbmdCdWZmZXJUZXN0IGV4dGVuZHMgUmVhZE9ubHlMb25nQnVmZmVyVGVzdHsKKwogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIGJ1ZiA9IExvbmdCdWZmZXIud3JhcChuZXcgbG9uZ1tCVUZGRVJfTEVOR1RIXSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZFNob3J0QnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9SZWFkT25seVdyYXBwZWRTaG9ydEJ1ZmZlclRlc3QuamF2YQppbmRleCAwZWNiM2E0Li45N2YxNzAzIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1JlYWRPbmx5V3JhcHBlZFNob3J0QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vUmVhZE9ubHlXcmFwcGVkU2hvcnRCdWZmZXJUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLlNob3J0QnVmZmVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLlNob3J0QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlYWRPbmx5V3JhcHBlZFNob3J0QnVmZmVyVGVzdCBleHRlbmRzIFJlYWRPbmx5U2hvcnRCdWZmZXJUZXN0IHsKKwogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIGJ1ZiA9IFNob3J0QnVmZmVyLndyYXAobmV3IHNob3J0W0JVRkZFUl9MRU5HVEhdKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2hvcnRCdWZmZXJUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1Nob3J0QnVmZmVyVGVzdC5qYXZhCmluZGV4IDg2YmFkMmQuLjk5Nzg2NWEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2hvcnRCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9TaG9ydEJ1ZmZlclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKQEAgLTI3LDYgKzMyLDcgQEAKICAqIFRlc3RzIGphdmEubmlvLlNob3J0QnVmZmVyCiAgKgogICovCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLlNob3J0QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFNob3J0QnVmZmVyVGVzdCBleHRlbmRzIEFic3RyYWN0QnVmZmVyVGVzdCB7CiAgICAgCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfVEVTVF9MRU5HVEggPSA1OwpAQCAtNTEsNyArNTcsMTUgQEAKICAgICAgKiBmb2xsb3dpbmcgdXNlY2FzZXM6IDEuIGNhc2UgZm9yIGNoZWNrIFNob3J0QnVmZmVyIHRlc3RCdWYgcHJvcGVydGllcyAyLgogICAgICAqIGNhc2UgZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYm91bmRhcnkgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWxsb2NhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0FsbG9jYXRlSSgpIHsKICAgICAgICAgLy8gY2FzZTogU2hvcnRCdWZmZXIgdGVzdEJ1ZiBwcm9wZXJ0aWVzIGlzIHNhdGlzZnkgdGhlIGNvbmRpdGlvbnMKICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbgpAQCAtNjgsNyArODIsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUaGUgc2FtZSB0ZXN0IGFzIHRlc3RBcnJheU9mZnNldC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheSgpIHsKICAgICAgICAgc2hvcnQgYXJyYXlbXSA9IGJ1Zi5hcnJheSgpOwogICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgYXJyYXksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYuY2FwYWNpdHkoKSk7CkBAIC04NSw3ICsxMDcsMTUgQEAKICAgICAgICAgbG9hZFRlc3REYXRhMihidWYpOwogICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgYXJyYXksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYuY2FwYWNpdHkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGhlIHNhbWUgdGVzdCBhcyB0ZXN0QXJyYXkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXlPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlPZmZzZXQoKSB7CiAgICAgICAgIHNob3J0IGFycmF5W10gPSBidWYuYXJyYXkoKTsKICAgICAgICAgYXNzZXJ0Q29udGVudEVxdWFscyhidWYsIGFycmF5LCBidWYuYXJyYXlPZmZzZXQoKSwgYnVmLmNhcGFjaXR5KCkpOwpAQCAtMTAyLDcgKzEzMiwxNSBAQAogICAgICAgICBsb2FkVGVzdERhdGEyKGJ1Zik7CiAgICAgICAgIGFzc2VydENvbnRlbnRFcXVhbHMoYnVmLCBhcnJheSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5jYXBhY2l0eSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXNSZWFkT25seUJ1ZmZlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBc1JlYWRPbmx5QnVmZmVyKCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgYnVmLm1hcmsoKTsKQEAgLTEyNiw3ICsxNjQsMTUgQEAKICAgICAgICAgYnVmLnJlc2V0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhidWYucG9zaXRpb24oKSwgMCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdCgpIHsKICAgICAgICAgLy8gY2FzZTogYnVmZmVyIGlzIGZ1bGwKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC0xNzcsNyArMjIzLDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5TaG9ydEJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVUbygpIHsKICAgICAgICAgLy8gY29tcGFyZSB0byBzZWxmCiAgICAgICAgIGFzc2VydEVxdWFscygwLCBidWYuY29tcGFyZVRvKGJ1ZikpOwpAQCAtMjAwLDcgKzI1NCwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5jb21wYXJlVG8ob3RoZXIpID4gMCk7CiAgICAgICAgIGFzc2VydFRydWUob3RoZXIuY29tcGFyZVRvKGJ1ZikgPCAwKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZHVwbGljYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZSgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGJ1Zi5tYXJrKCk7CkBAIC0yMzIsNyArMjk0LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRDb250ZW50RXF1YWxzKGJ1ZiwgZHVwbGljYXRlKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKICAgICAgICAgLy8gZXF1YWwgdG8gc2VsZgogICAgICAgICBhc3NlcnRUcnVlKGJ1Zi5lcXVhbHMoYnVmKSk7CkBAIC0yNTgsNiArMzI4LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBzaG9ydCBnZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewogICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuY2FwYWNpdHkoKTsgaSsrKSB7CkBAIC0yNzUsNiArMzU0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5TaG9ydEJ1ZmZlciBnZXQoc2hvcnRbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRzaG9ydEFycmF5KCkgewogICAgICAgICBzaG9ydCBhcnJheVtdID0gbmV3IHNob3J0WzFdOwogICAgICAgICBidWYuY2xlYXIoKTsKQEAgLTI5NSw2ICszODMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLlNob3J0QnVmZmVyIGdldChzaG9ydFtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0c2hvcnRBcnJheWludGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIHNob3J0IGFycmF5W10gPSBuZXcgc2hvcnRbYnVmLmNhcGFjaXR5KCldOwpAQCAtMzU2LDYgKzQ1MywxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igc2hvcnQgZ2V0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmNhcGFjaXR5KCk7IGkrKykgewpAQCAtMzc1LDExICs0ODEsMjcgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGFycmF5IG1ldGhvZCBkb2Vzbid0IHJldHVybiBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0FycmF5KCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKGJ1Zi5hcnJheSgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBTaG9ydEJ1ZmZlciByZWFkb25seSA9IGJ1Zi5hc1JlYWRPbmx5QnVmZmVyKCk7CkBAIC0zOTAsMTEgKzUxMiwyNyBAQAogICAgICAgICBkdXBsaWNhdGUucG9zaXRpb24oYnVmLmNhcGFjaXR5KCkgLyAyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaGFzaENvZGUoKSAhPSBkdXBsaWNhdGUuaGFzaENvZGUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNEaXJlY3QgbWV0aG9kIGZvciBub24gZGlyZWN0IFNob3J0QnVmZmVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzRGlyZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzRGlyZWN0KCkgewogICAgICAgICBhc3NlcnRGYWxzZShidWYuaXNEaXJlY3QoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9yZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyKCkgewogICAgICAgICBidWYub3JkZXIoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpLCBidWYub3JkZXIoKSk7CkBAIC00MDMsNiArNTQxLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5TaG9ydEJ1ZmZlciBwdXQoc2hvcnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0c2hvcnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTQyMiw2ICs1NjksMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dChzaG9ydFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0c2hvcnRBcnJheSgpIHsKICAgICAgICAgc2hvcnQgYXJyYXlbXSA9IG5ldyBzaG9ydFsxXTsKICAgICAgICAgYnVmLmNsZWFyKCk7CkBAIC00NTAsNiArNjA2LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBqYXZhLm5pby5TaG9ydEJ1ZmZlciBwdXQoc2hvcnRbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0c2hvcnRBcnJheWludGludCgpIHsKICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgIHNob3J0IGFycmF5W10gPSBuZXcgc2hvcnRbYnVmLmNhcGFjaXR5KCldOwpAQCAtNTE2LDYgKzY4MSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgamF2YS5uaW8uU2hvcnRCdWZmZXIgcHV0KGphdmEubmlvLlNob3J0QnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5TaG9ydEJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dFNob3J0QnVmZmVyKCkgewogICAgICAgICBTaG9ydEJ1ZmZlciBvdGhlciA9IFNob3J0QnVmZmVyLmFsbG9jYXRlKGJ1Zi5jYXBhY2l0eSgpKTsKICAgICAgICAgdHJ5IHsKQEAgLTU1MSw2ICs3MjUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dChpbnQsIHNob3J0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIHNob3J0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0aW50c2hvcnQoKSB7CiAgICAgICAgIGJ1Zi5jbGVhcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5jYXBhY2l0eSgpOyBpKyspIHsKQEAgLTU3Miw3ICs3NTUsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2xpY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2xpY2UoKSB7CiAgICAgICAgIGFzc2VydFRydWUoYnVmLmNhcGFjaXR5KCkgPiA1KTsKICAgICAgICAgYnVmLnBvc2l0aW9uKDEpOwpAQCAtNjAwLDcgKzc5MSwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNsaWNlLmdldCgxKSwgNTAwKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIHN0ciA9IGJ1Zi50b1N0cmluZygpOwogICAgICAgICBhc3NlcnRUcnVlKHN0ci5pbmRleE9mKCJTaG9ydCIpID49IDAgfHwgc3RyLmluZGV4T2YoInNob3J0IikgPj0gMCk7CkBAIC02MTUsNyArODE0LDE1IEBACiAgICAgICogZm9yIGNoZWNrIGVxdWFsIGJldHdlZW4gYnVmMiBhbmQgc2hvcnQgYXJyYXlbXSAzLiBjYXNlIGZvciBjaGVjayBhIGJ1ZjIKICAgICAgKiBkZXBlbmRlbnMgdG8gYXJyYXlbXQogICAgICAqLwotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge3Nob3J0W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfV3JhcCRTKCkgewogICAgICAgICBzaG9ydCBhcnJheVtdID0gbmV3IHNob3J0W0JVRkZFUl9MRU5HVEhdOwogICAgICAgICBsb2FkVGVzdERhdGExKGFycmF5LCAwLCBCVUZGRVJfTEVOR1RIKTsKQEAgLTY0Miw3ICs4NDksMTUgQEAKICAgICAgKiBjYXNlIGZvciBjaGVjayBhIGJ1ZjIgZGVwZW5kZW5zIHRvIGFycmF5W10gNC4gY2FzZSBleHBlY3RlZAogICAgICAqIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9XcmFwJFNJSSgpIHsKICAgICAgICAgc2hvcnQgYXJyYXlbXSA9IG5ldyBzaG9ydFtCVUZGRVJfTEVOR1RIXTsKICAgICAgICAgaW50IG9mZnNldCA9IDU7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1NsaWNlRGlyZWN0Qnl0ZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2xpY2VEaXJlY3RCeXRlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDU0MWNkZTAuLmY2ZDYxMWUgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2xpY2VEaXJlY3RCeXRlQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2xpY2VEaXJlY3RCeXRlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBTbGljZURpcmVjdEJ5dGVCdWZmZXJUZXN0IGV4dGVuZHMgRGlyZWN0Qnl0ZUJ1ZmZlclRlc3QgewogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2xpY2VIZWFwQnl0ZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2xpY2VIZWFwQnl0ZUJ1ZmZlclRlc3QuamF2YQppbmRleCA5ZjlmN2FhLi4yYjRhN2Y1IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1NsaWNlSGVhcEJ5dGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9TbGljZUhlYXBCeXRlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBTbGljZUhlYXBCeXRlQnVmZmVyVGVzdCBleHRlbmRzIEhlYXBCeXRlQnVmZmVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9TbGljZVdyYXBwZWRCeXRlQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9TbGljZVdyYXBwZWRCeXRlQnVmZmVyVGVzdC5qYXZhCmluZGV4IGYxZGRmYjkuLjg0ZjM3ZTcgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vU2xpY2VXcmFwcGVkQnl0ZUJ1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1NsaWNlV3JhcHBlZEJ5dGVCdWZmZXJUZXN0LmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFNsaWNlV3JhcHBlZEJ5dGVCdWZmZXJUZXN0IGV4dGVuZHMgV3JhcHBlZEJ5dGVCdWZmZXJUZXN0IHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRCeXRlQnVmZmVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkQnl0ZUJ1ZmZlclRlc3QuamF2YQppbmRleCA2NDYwZDJlLi43OGI5NmZjIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRCeXRlQnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZEJ5dGVCdWZmZXJUZXN0LmphdmEKQEAgLTE2LDggKzE2LDE0IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pbzsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBXcmFwcGVkQnl0ZUJ1ZmZlclRlc3QgZXh0ZW5kcyBCeXRlQnVmZmVyVGVzdCB7CiAgICAgCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM2LDYgKzQyLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmlvLkJ5dGVCdWZmZXIjYWxsb2NhdGUoYnl0ZVtdLGludCxpbnQpCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZEJ5dGVCdWZmZXJfSWxsZWdhbEFyZygpIHsKICAgICAgICAgYnl0ZSBhcnJheVtdID0gbmV3IGJ5dGVbQlVGRkVSX0xFTkdUSF07CiAgICAgICAgIHRyeSB7CkBAIC04MSwxNSArOTYsMzkgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaXNEaXJlY3QgbWV0aG9kIGZvciBub24gZGlyZWN0IEJ5dGVCdWZmZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEaXJlY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNEaXJlY3QoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1Zi5pc0RpcmVjdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNBcnJheSBtZXRob2QgZm9yIHdyYXBwZWQgQnl0ZUJ1ZmZlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBcnJheSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShidWYuaGFzQXJyYXkoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhZE9ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWFkT25seSgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoYnVmLmlzUmVhZE9ubHkoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkQ2hhckJ1ZmZlclRlc3QxLmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRDaGFyQnVmZmVyVGVzdDEuamF2YQppbmRleCA5MTgxYTc3Li4zMTg3NzQ2IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRDaGFyQnVmZmVyVGVzdDEuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRDaGFyQnVmZmVyVGVzdDEuamF2YQpAQCAtMTYsOCArMTYsMTQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFdyYXBwZWRDaGFyQnVmZmVyVGVzdDEgZXh0ZW5kcyBDaGFyQnVmZmVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzcsNiArNDMsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uQ2hhckJ1ZmZlciNhbGxvY2F0ZShjaGFyW10saW50LGludCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkQ2hhckJ1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICBjaGFyIGFycmF5W10gPSBuZXcgY2hhcltCVUZGRVJfTEVOR1RIXTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZENoYXJCdWZmZXJUZXN0Mi5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkQ2hhckJ1ZmZlclRlc3QyLmphdmEKaW5kZXggMWU5OGQ2My4uYTAwOWE0MSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkQ2hhckJ1ZmZlclRlc3QyLmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkQ2hhckJ1ZmZlclRlc3QyLmphdmEKQEAgLTE2LDEwICsxNiwxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLlJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgV3JhcHBlZENoYXJCdWZmZXJUZXN0MiBleHRlbmRzIFJlYWRPbmx5Q2hhckJ1ZmZlclRlc3QgewogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1RSSU5HID0gIjEyMzQ1Njc4OWFiY2RlZjEyMzQ1IjsKIApAQCAtMzQsNyArNDAsMTUgQEAKICAgICAgICAgYmFzZUJ1ZiA9IG51bGw7CiAgICAgICAgIGJ1ZiA9IG51bGw7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24sIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRDaGFyU2VxdWVuY2VfSWxsZWdhbEFyZygpIHsKICAgICAgICAgU3RyaW5nIHN0ciA9IFRFU1RfU1RSSU5HOwogICAgICAgICB0cnkgewpAQCAtNjgsNyArODIsMTUgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWYuYXJyYXkoKTsKQEAgLTc2LDcgKzk4LDE2IEBACiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24sICIgKworICAgICAgICAgICAgIkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uLCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0Y2hhckFycmF5aW50aW50KCkgewogICAgICAgICBjaGFyIGFycmF5W10gPSBuZXcgY2hhclsxXTsKICAgICAgICAgdHJ5IHsKQEAgLTEwNCw3ICsxMzUsMTYgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24sICIgKworICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRDaGFyQnVmZmVyKCkgewogICAgICAgICBDaGFyQnVmZmVyIG90aGVyID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZERvdWJsZUJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZERvdWJsZUJ1ZmZlclRlc3QuamF2YQppbmRleCBmODliNDFlLi40ZmZmMzYxIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWREb3VibGVCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkRG91YmxlQnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5Eb3VibGVCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uRG91YmxlQnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFdyYXBwZWREb3VibGVCdWZmZXJUZXN0IGV4dGVuZHMgRG91YmxlQnVmZmVyVGVzdCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKQEAgLTM1LDYgKzQxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmlvLkNoYXJCdWZmZXIjYWxsb2NhdGUoY2hhcltdLGludCxpbnQpCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZERvdWJsZXVmZmVyX0lsbGVnYWxBcmcoKSB7CiAgICAgICAgIGRvdWJsZSBhcnJheVtdID0gbmV3IGRvdWJsZVsyMF07CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRGbG9hdEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZEZsb2F0QnVmZmVyVGVzdC5qYXZhCmluZGV4IDQzYjEzYzMuLmEzMDk4NjggMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZEZsb2F0QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZEZsb2F0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5GbG9hdEJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBXcmFwcGVkRmxvYXRCdWZmZXJUZXN0IGV4dGVuZHMgRmxvYXRCdWZmZXJUZXN0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMzUsNiArNDEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uQ2hhckJ1ZmZlciNhbGxvY2F0ZShjaGFyW10saW50LGludCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtmbG9hdFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRGbG9hdEJ1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICBmbG9hdCBhcnJheVtdID0gbmV3IGZsb2F0WzIwXTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZEludEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZEludEJ1ZmZlclRlc3QuamF2YQppbmRleCAzODNlOTY0Li5jY2NiNjMzIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRJbnRCdWZmZXJUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkSW50QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uSW50QnVmZmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFdyYXBwZWRJbnRCdWZmZXJUZXN0IGV4dGVuZHMgSW50QnVmZmVyVGVzdCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKQEAgLTM1LDYgKzQxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmlvLkNoYXJCdWZmZXIjYWxsb2NhdGUoY2hhcltdLGludCxpbnQpCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50W10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZEludEJ1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICBpbnQgYXJyYXlbXSA9IG5ldyBpbnRbMjBdOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkTG9uZ0J1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZExvbmdCdWZmZXJUZXN0LmphdmEKaW5kZXggNTgxYzkxMi4uNTJlOGVhZSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9XcmFwcGVkTG9uZ0J1ZmZlclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRMb25nQnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5Mb25nQnVmZmVyOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLkxvbmdCdWZmZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgV3JhcHBlZExvbmdCdWZmZXJUZXN0IGV4dGVuZHMgTG9uZ0J1ZmZlclRlc3QgewogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CkBAIC0zNSw2ICs0MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5DaGFyQnVmZmVyI2FsbG9jYXRlKGNoYXJbXSxpbnQsaW50KQogICAgICAqIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmdbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkTG9uZ0J1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICBsb25nIGFycmF5W10gPSBuZXcgbG9uZ1syMF07CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL1dyYXBwZWRTaG9ydEJ1ZmZlclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZFNob3J0QnVmZmVyVGVzdC5qYXZhCmluZGV4IDljNmY3ODEuLjM2Nzk0YjUgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZFNob3J0QnVmZmVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vV3JhcHBlZFNob3J0QnVmZmVyVGVzdC5qYXZhCkBAIC0xNSw4ICsxNSwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW87CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5TaG9ydEJ1ZmZlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5TaG9ydEJ1ZmZlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBXcmFwcGVkU2hvcnRCdWZmZXJUZXN0IGV4dGVuZHMgU2hvcnRCdWZmZXJUZXN0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMzUsNiArNDEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uQ2hhckJ1ZmZlciNhbGxvY2F0ZShjaGFyW10saW50LGludCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtzaG9ydFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRTaG9ydEJ1ZmZlcl9JbGxlZ2FsQXJnKCkgewogICAgICAgICBzaG9ydCBhcnJheVtdID0gbmV3IHNob3J0WzIwXTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBlZTFlZmUyLi5jMjM2NjU5IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0FscmVhZHlDb25uZWN0ZWRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9BbHJlYWR5Q29ubmVjdGVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSwxMiArMTUsMTggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQWxyZWFkeUNvbm5lY3RlZEV4Y2VwdGlvbi5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIEFscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24KICAqLwpAQCAtMjksNiArMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IEFscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24oKSk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBBbHJlYWR5Q29ubmVjdGVkRXhjZXB0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZDc2NmQwZC4uN2E4YzQyNiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0FzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24oKSk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ2FuY2VsbGVkS2V5RXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DYW5jZWxsZWRLZXlFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZTgyMzYyMi4uOGUzOThhOSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DYW5jZWxsZWRLZXlFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DYW5jZWxsZWRLZXlFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE1LDYgKzE1LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVsczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNhbmNlbGxlZEtleUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2FuY2VsbGVkS2V5RXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIENhbmNlbGxlZEtleUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBDYW5jZWxsZWRLZXlFeGNlcHRpb24oKSk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IENhbmNlbGxlZEtleUV4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHNUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0NoYW5uZWxzVGVzdC5qYXZhCmluZGV4IGFjZjVjNzUuLmE3OTFjMjAgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHNUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DaGFubmVsc1Rlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtNDYsNyArNTEsNyBAQAogICogY2hhcmFjdGVycyA6ICJQQEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdIgogICogCiAgKi8KLQorQFRlc3RUYXJnZXRDbGFzcyhDaGFubmVscy5jbGFzcykKIHB1YmxpYyBjbGFzcyBDaGFubmVsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfU0VUID0gIkdCMjMxMiI7IC8vJE5PTi1OTFMtMSQKIApAQCAtMTEyLDYgKzExNywxNSBAQAogICAgIH0KIAogICAgIC8vIHRlc3QgaWYgbmV3IENoYW5uZWwgdG8gaW5wdXQgaXMgbnVsbAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld0NoYW5uZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld0NoYW5uZWxJbnB1dFN0cmVhbV9JbnB1dE51bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHRoaXMudGVzdE51bSk7CiAgICAgICAgIHRoaXMuZmlucyA9IG51bGw7CkBAIC0xMjgsNiArMTQyLDE1IEBACiAgICAgfQogCiAgICAgLy8gdGVzdCBpZiBidWZmZXIgdG8gcmVhZCBpcyBudWxsCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3Q2hhbm5lbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Q2hhbm5lbElucHV0U3RyZWFtX0J1ZmZlck51bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHRoaXMudGVzdE51bSk7CiAgICAgICAgIGludCByZWFkcmVzID0gdGhpcy50ZXN0TnVtOwpAQCAtMTUzLDYgKzE3NiwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5DaGFubmVscy5OZXdDaGFubmVsJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld0NoYW5uZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld0NoYW5uZWxJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBidWZTaXplID0gMTA7CiAgICAgICAgIGludCByZWFkcmVzID0gMDsKQEAgLTE4MSw2ICsyMTMsMTUgQEAKICAgICB9CiAKICAgICAvLyB0ZXN0IGlmIGZvdXQgdG8gY2hhbmdlIGlzIG51bGwKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdDaGFubmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Q2hhbm5lbE91dHB1dFN0cmVhbV9pbnB1dE51bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgd3JpdGVyZXMgPSB0aGlzLnRlc3ROdW07CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHRoaXMud3JpdGVidWZTaXplKTsKQEAgLTIwMSw2ICsyNDIsMTUgQEAKICAgICB9CiAKICAgICAvLyB0ZXN0IGlmIHdyaXRlIGJ1ZiBpcyBudWxsCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3Q2hhbm5lbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld0NoYW5uZWxPdXRwdXRTdHJlYW1fQnVmTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCB3cml0ZXJlcyA9IHRoaXMudGVzdE51bTsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZWJ1ZiA9IG51bGw7CkBAIC0yMjMsNiArMjczLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2phdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzLk5ld0NoYW5uZWwoT3V0cHV0U3RyZWFtKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdDaGFubmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Q2hhbm5lbE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCB3cml0ZU51bSA9IDA7CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KHRoaXMud3JpdGVidWZTaXplKTsKQEAgLTI2Nyw3ICszMjYsMTUgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld0lucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdJbnB1dFN0cmVhbVJlYWRhYmxlQnl0ZUNoYW5uZWxfSW5wdXROdWxsKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gcmVhZGJ1ZiA9IG5ldyBieXRlW3RoaXMudGVzdE51bV07CkBAIC0yOTMsNyArMzYwLDE2IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24gZm9yIHJlYWQgbWV0aG9kcyAiICsKKyAgICAgICAgICAgICJhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3SW5wdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld0lucHV0U3RyZWFtUmVhZGFibGVCeXRlQ2hhbm5lbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHJlYWRiY2J1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QodGhpcy50ZXN0TnVtKTsKICAgICAgICAgYnl0ZVtdIHJlYWRidWYgPSBuZXcgYnl0ZVt0aGlzLnRlc3ROdW1dOwpAQCAtMzIwLDcgKzM5NiwxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3T3V0cHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdPdXRwdXRTdHJlYW1Xcml0YWJsZUJ5dGVDaGFubmVsX0lucHV0TnVsbCgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHdyaXRlYnVmID0gbmV3IGJ5dGVbdGhpcy50ZXN0TnVtXTsKQEAgLTM0OSw3ICs0MzMsMTYgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24gZm9yIHdyaXRlIG1ldGhvZHMgIiArCisgICAgICAgICAgICAiYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld091dHB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0U3RyZWFtV3JpdGFibGVCeXRlQ2hhbm5lbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gd3JpdGVidWYgPSBuZXcgYnl0ZVt0aGlzLnRlc3ROdW1dOwogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlYmNidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KHRoaXMudGVzdE51bSk7CkBAIC0zNzYsNyArNDY5LDE2IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3UmVhZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2Rlci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0bmV3UmVhZGVyQ2hhcnNldEVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuZmlucyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRmlsZSk7CiAKQEAgLTM5MCw3ICs0OTIsMTcgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24gZm9yICIgKworICAgICAgICAgICAgIm5vbi1ibG9ja2luZyBtb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1dyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdG5ld1dyaXRlckNoYXJzZXRFcnJvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmZvdXRzID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wRmlsZSk7CiAgICAgICAgIFdyaXRhYmxlQnl0ZUNoYW5uZWwgd2JDaGFubmVsID0gQ2hhbm5lbHMubmV3Q2hhbm5lbCh0aGlzLmZvdXRzKTsKQEAgLTQwNyw2ICs1MTksMTYgQEAKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IKICAgICAgKiAnamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbHMubmV3UmVhZGVyKFJlYWRhYmxlQnl0ZUNoYW5uZWwsIFN0cmluZyknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3UmVhZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2Rlci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVhZGVyUmVhZGFibGVCeXRlQ2hhbm5lbFN0cmluZ19JbnB1dE51bGwoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGJ1ZlNpemUgPSB0aGlzLnRlc3ROdW07CkBAIC00NTIsNiArNTc0LDE3IEBACiAgICAgICogVGVzdCBtZXRob2QgZm9yCiAgICAgICogJ2phdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzLm5ld1JlYWRlcihSZWFkYWJsZUJ5dGVDaGFubmVsLCBTdHJpbmcpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbiBleGNlcHRpb24gd2hpbGUgIiArCisgICAgICAgICAgICAicmVhZCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3UmVhZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2Rlci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVhZGVyUmVhZGFibGVCeXRlQ2hhbm5lbFN0cmluZ19pbnRlcm5hbEJ1ZmZlclplcm8oKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGJ1ZlNpemUgPSB0aGlzLnRlc3ROdW07CkBAIC00OTcsNiArNjMwLDE2IEBACiAgICAgICogVGVzdCBtZXRob2QgZm9yCiAgICAgICogJ2phdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzLm5ld1JlYWRlcihSZWFkYWJsZUJ5dGVDaGFubmVsLCBTdHJpbmcpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdSZWFkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVhZGVyUmVhZGFibGVCeXRlQ2hhbm5lbFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBidWZTaXplID0gdGhpcy50ZXN0TnVtOwogICAgICAgICBpbnQgcmVhZHJlcyA9IDA7CkBAIC01MzMsNiArNjc2LDE1IEBACiAgICAgLyoKICAgICAgKiBaZXJvLUJ1ZmZlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1dyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLmNsYXNzLCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdXcml0ZXJXcml0YWJsZUJ5dGVDaGFubmVsU3RyaW5nX2ludGVybmFsQnVmWmVybygpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogCkBAIC01ODQsNiArNzM2LDE2IEBACiAgICAgLyoKICAgICAgKiB0aGlzIHRlc3QgY2Fubm90IGJlIHBhc3NlZCB3aGVuIGJ1ZmZlciBzZXQgdG8gMCEKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uIGZvciB3cml0ZSBtZXRob2RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1dyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld1dyaXRlcldyaXRhYmxlQnl0ZUNoYW5uZWxTdHJpbmdfSW5wdXROdWxsKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuZm91dHMgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKTsKQEAgLTYwNyw2ICs3NjksMTYgQEAKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IKICAgICAgKiAnamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbHMubmV3V3JpdGVyKFdyaXRhYmxlQnl0ZUNoYW5uZWwsIFN0cmluZyknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1dyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdXcml0ZXJXcml0YWJsZUJ5dGVDaGFubmVsU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5mb3V0cyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpOwogICAgICAgICBXcml0YWJsZUJ5dGVDaGFubmVsIHdiQ2hhbm5lbCA9IENoYW5uZWxzLm5ld0NoYW5uZWwodGhpcy5mb3V0cyk7CkBAIC02NTEsNiArODIzLDE2IEBACiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzI25ld1JlYWRlcihSZWFkYWJsZUJ5dGVDaGFubmVsIGNoYW5uZWwsCiAgICAgICogICAgICAgIFN0cmluZyBjaGFyc2V0TmFtZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1JlYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3UmVhZGVyX0xSZWFkYWJsZUJ5dGVDaGFubmVsX0xTdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgbG9jYWxBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLApkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZWNhNTBhMy4uNGU0ODk0NSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24oKSk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA1N2I1ZDEyLi4yNzdlYzM0IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZENoYW5uZWxFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DbG9zZWRDaGFubmVsRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMjQsMTEgKzI5LDIxIEBACiAvKioKICAqIFRlc3RzIGZvciBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICB9KSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbigpKTsKQEAgLTM3LDYgKzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICB9KSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DbG9zZWRTZWxlY3RvckV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMDA2Yjg4Zi4uMmYwMDExMyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9DbG9zZWRTZWxlY3RvckV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZFNlbGVjdG9yRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRTZWxlY3RvckV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IENsb3NlZFNlbGVjdG9yRXhjZXB0aW9uKCkpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IENsb3NlZFNlbGVjdG9yRXhjZXB0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZDI5M2Q4Ni4uNDc0OTZmNyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhDb25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IENvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uKCkpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IENvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9EYXRhZ3JhbUNoYW5uZWxUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0RhdGFncmFtQ2hhbm5lbFRlc3QuamF2YQppbmRleCBiMWM2MTQzLi5jYTZkMDUyIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0RhdGFncmFtQ2hhbm5lbFRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0RhdGFncmFtQ2hhbm5lbFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKIGltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsKQEAgLTQyLDYgKzQ3LDcgQEAKICAqIFRlc3QgZm9yIERhdGFncmFtQ2hhbm5lbAogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRGF0YWdyYW1DaGFubmVsLmNsYXNzKQogcHVibGljIGNsYXNzIERhdGFncmFtQ2hhbm5lbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUNJVFlfTk9STUFMID0gMjAwOwpAQCAtMTIzLDYgKzEyOSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5EYXRhZ3JhbUNoYW5uZWwudmFsaWRPcHMoKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsaWRPcHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRPcHMoKSB7CiAgICAgICAgIE1vY2tEYXRhZ3JhbUNoYW5uZWwgdGVzdE1vY2sgPSBuZXcgTW9ja0RhdGFncmFtQ2hhbm5lbChTZWxlY3RvclByb3ZpZGVyCiAgICAgICAgICAgICAgICAgLnByb3ZpZGVyKCkpOwpAQCAtMTM2LDYgKzE1MSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5EYXRhZ3JhbUNoYW5uZWwub3BlbigpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2FsbCBvcGVuIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvcGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9wZW4oKSB7CiAgICAgICAgIE1vY2tEYXRhZ3JhbUNoYW5uZWwgdGVzdE1vY2sgPSBuZXcgTW9ja0RhdGFncmFtQ2hhbm5lbChTZWxlY3RvclByb3ZpZGVyCiAgICAgICAgICAgICAgICAgLnByb3ZpZGVyKCkpOwpAQCAtMTQ5LDYgKzE3MywxNiBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5EYXRhZ3JhbUNoYW5uZWwucmVhZChCeXRlQnVmZmVyKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbiwgIiArIAorICAgICAgICAgICAgIkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlQnVmZmVyQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgdGVzdE51bSA9IDA7CiAgICAgICAgIGxvbmcgcmVhZHJlcyA9IHRlc3ROdW07CkBAIC0xODUsNiArMjE5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2phdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbC5yZWFkKEJ5dGVCdWZmZXIpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVCdWZmZXJBcnJheV9CdWZOdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0RhdGFncmFtQ2hhbm5lbCB0ZXN0TW9jayA9IG5ldyBNb2NrRGF0YWdyYW1DaGFubmVsKFNlbGVjdG9yUHJvdmlkZXIKICAgICAgICAgICAgICAgICAucHJvdmlkZXIoKSk7CkBAIC0yMTQsNiArMjU3LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2phdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbC53cml0ZShCeXRlQnVmZmVyKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbGwgZXhjZXB0aW9ucyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0RhdGFncmFtQ2hhbm5lbCB0ZXN0TW9jayA9IG5ldyBNb2NrRGF0YWdyYW1DaGFubmVsKFNlbGVjdG9yUHJvdmlkZXIKICAgICAgICAgICAgICAgICAucHJvdmlkZXIoKSk7CkBAIC0yNTAsNiArMzAyLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2phdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbC53cml0ZShCeXRlQnVmZmVyKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlcl9CdWZudWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0RhdGFncmFtQ2hhbm5lbCB0ZXN0TW9jayA9IG5ldyBNb2NrRGF0YWdyYW1DaGFubmVsKFNlbGVjdG9yUHJvdmlkZXIKICAgICAgICAgICAgICAgICAucHJvdmlkZXIoKSk7CkBAIC0yODQsNiArMzQ1LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTb2NrZXRfQmFzaWNTdGF0dXNCZWZvcmVDb25uZWN0KCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7Ly8gbm90IGNvbm5lY3RlZAogICAgICAgICBEYXRhZ3JhbVNvY2tldCBzMSA9IHRoaXMuY2hhbm5lbDEuc29ja2V0KCk7CkBAIC0yOTgsNiArMzY4LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9CbG9ja19CYXNpY1N0YXR1c0FmdGVyQ29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29ubmVjdChsb2NhbEFkZHIxKTsKICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgczEgPSB0aGlzLmNoYW5uZWwxLnNvY2tldCgpOwpAQCAtMzA2LDcgKzM4NSwxNSBAQAogICAgICAgICAvLyBzYW1lCiAgICAgICAgIGFzc2VydFNhbWUoczEsIHMyKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9Ob25CbG9ja19CYXNpY1N0YXR1c0FmdGVyQ29ubmVjdCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geyAgICAgICAgCiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29ubmVjdChsb2NhbEFkZHIxKTsKQEAgLTMyMyw2ICs0MTAsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9BY3Rpb25zQmVmb3JlQ29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7Ly8gbm90IGNvbm5lY3RlZAogICAgICAgICBEYXRhZ3JhbVNvY2tldCBzID0gdGhpcy5jaGFubmVsMS5zb2NrZXQoKTsKQEAgLTMzNCwxMyArNDMwLDMwIEBACiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9CbG9ja19BY3Rpb25zQWZ0ZXJDb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5jaGFubmVsMS5pc0Nvbm5lY3RlZCgpKTsvLyBub3QgY29ubmVjdGVkCiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29ubmVjdChsb2NhbEFkZHIxKTsKICAgICAgICAgRGF0YWdyYW1Tb2NrZXQgcyA9IHRoaXMuY2hhbm5lbDEuc29ja2V0KCk7CiAgICAgICAgIGFzc2VydFNvY2tldEFjdGlvbkFmdGVyQ29ubmVjdChzKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9Ob25CbG9ja19BY3Rpb25zQWZ0ZXJDb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25uZWN0KGxvY2FsQWRkcjEpOwogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKQEAgLTQyNSw3ICs1MzgsMTUgQEAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gVGVzdCBmb3IgY29uZmlndXJlQmxvY2tpbmcoKQogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29uZmlndXJlQmxvY2tpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZUJsb2NraW5nX1JlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLmNoYW5uZWwxLmlzQmxvY2tpbmcoKSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShDQVBBQ0lUWV8xS0IpOwpAQCAtNDU0LDYgKzU3NSwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNDb25uZWN0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDb25uZWN0ZWRfV2l0aFNlcnZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNvbm5lY3RMb2NhbFNlcnZlcigpOwogICAgICAgICBkaXNjb25uZWN0QWZ0ZXJDb25uZWN0ZWQoKTsKQEAgLTQ2OSw2ICs1OTksMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ0RhdGFncmFtQ2hhbm5lbEltcGwuY29ubmVjdChTb2NrZXRBZGRyZXNzKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0X0Jsb2NrV2l0aFNlcnZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGJsb2NraW5nIG1vZGUKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLmNoYW5uZWwxLmlzQmxvY2tpbmcoKSk7CkBAIC00ODAsNiArNjE5LDE2IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdEYXRhZ3JhbUNoYW5uZWxJbXBsLmNvbm5lY3QoU29ja2V0QWRkcmVzcyknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24sICIgKworICAgICAgICAgICAgIkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdF9CbG9ja05vU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY29ubmVjdFdpdGhvdXRTZXJ2ZXIoKTsKICAgICAgICAgZGlzY29ubmVjdEFmdGVyQ29ubmVjdGVkKCk7CkBAIC00OTAsNiArNjM5LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0X05vbkJsb2NrV2l0aFNlcnZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIE5vbiBibG9ja2luZyBtb2RlCiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtNTAzLDYgKzY2MSwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RfTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIHRyeSB7CkBAIC01MTgsNiArNjg1LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RfVW5zdXBwb3J0ZWRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5jaGFubmVsMS5pc0Nvbm5lY3RlZCgpKTsKICAgICAgICAgY2xhc3MgU3ViU29ja2V0QWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgewpAQCAtNTQxLDYgKzcxNywxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdF9VbnJlc29sdmVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5jaGFubmVsMS5pc0Nvbm5lY3RlZCgpKTsKICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdW5yZXNvbHZlZCA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygKQEAgLTU1Miw3ICs3MzcsMTUgQEAKICAgICAgICAgICAgIC8vIE9LLgogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RfRW1wdHlIb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAKQEAgLTU2Nyw2ICs3NjAsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RfQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY2xvc2UoKTsKQEAgLTU4NSw2ICs3ODcsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0X0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29ubmVjdChsb2NhbEFkZHIxKTsKQEAgLTYwNCw2ICs4MTUsMTUgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0X0NoZWNrT3BlbkJlZm9yZVN0YXR1cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29ubmVjdChsb2NhbEFkZHIxKTsKQEAgLTY1Nyw2ICs4NzcsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzY29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNjb25uZWN0X0JlZm9yZUNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzQ29ubmVjdGVkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHModGhpcy5jaGFubmVsMSwgdGhpcy5jaGFubmVsMS5kaXNjb25uZWN0KCkpOwpAQCAtNjY4LDYgKzg5NywxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXNjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpc2Nvbm5lY3RfVW5jb25uZWN0ZWRDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzQ29ubmVjdGVkKCkpOwogICAgICAgICB0aGlzLmNoYW5uZWwxLmNsb3NlKCk7CkBAIC02ODEsNiArOTE5LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpc2Nvbm5lY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY29ubmVjdF9CbG9ja1dpdGhTZXJ2ZXJDaGFubmVsQ2xvc2VkKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5jaGFubmVsMS5pc0Jsb2NraW5nKCkpOwpAQCAtNjk1LDYgKzk0MiwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXNjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpc2Nvbm5lY3RfTm9uQmxvY2tXaXRoU2VydmVyQ2hhbm5lbENsb3NlZCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKQEAgLTcwOSw2ICs5NjUsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzY29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNjb25uZWN0X0Jsb2NrV2l0aFNlcnZlclNlcnZlckNsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5jaGFubmVsMS5pc0Jsb2NraW5nKCkpOwogICAgICAgICBjb25uZWN0TG9jYWxTZXJ2ZXIoKTsKQEAgLTcyNCw2ICs5ODksMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzY29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNjb25uZWN0X05vbkJsb2NrV2l0aFNlcnZlclNlcnZlckNsb3NlZCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKQEAgLTc0NSw2ICsxMDE5LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfVW5jb25uZWN0ZWROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIHRyeSB7CkBAIC03NjAsNiArMTA0MywxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX1VuY29ubmVjdGVkUmVhZG9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5jaGFubmVsMS5pc0Nvbm5lY3RlZCgpKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBkc3QgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENBUEFDSVRZX05PUk1BTCkKQEAgLTc3OCw2ICsxMDcwLDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfVW5jb25uZWN0ZWRCdWZFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5jaGFubmVsMS5pc0Nvbm5lY3RlZCgpKTsKQEAgLTc5MCw2ICsxMDkxLDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfVW5jb25uZWN0ZWRCdWZaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgZHN0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9aRVJPKTsKQEAgLTgwMSw2ICsxMTExLDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfVW5jb25uZWN0ZWRCdWZOb3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzQ29ubmVjdGVkKCkpOwogICAgICAgICBCeXRlQnVmZmVyIGRzdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKQEAgLTgxNSw2ICsxMTM0LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfVW5jb25uZWN0ZWRCdWZGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgZHN0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9PTkUpOwpAQCAtODI5LDYgKzExNTcsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZV9VbmNvbm5lY3RlZENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgZHN0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwpAQCAtODQ3LDYgKzExODQsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZV9VbmNvbm5lY3RlZENsb3NlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzQ29ubmVjdGVkKCkpOwogICAgICAgICB0aGlzLmNoYW5uZWwxLmNsb3NlKCk7CkBAIC04NjUsNiArMTIxMSwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX1VuY29ubmVjdGVkQ2xvc2VSZWFkb25seSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzQ29ubmVjdGVkKCkpOwogICAgICAgICBCeXRlQnVmZmVyIGRzdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKQpAQCAtODg1LDYgKzEyNDAsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZV9Ob25CbG9ja05vU2VydmVyQnVmRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CiAgICAgICAgIHJlY2VpdmVOb25CbG9ja05vU2VydmVyKENBUEFDSVRZX05PUk1BTCk7CkBAIC04OTUsNiArMTI1OSwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX0Jsb2NrTm9TZXJ2ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5jaGFubmVsMS5pc0Jsb2NraW5nKCkpOwogICAgICAgICByZWNlaXZlTm9TZXJ2ZXJOdWxsKCk7CkBAIC05MDUsNiArMTI3OCwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX05vbkJsb2NrTm9TZXJ2ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwogICAgICAgICByZWNlaXZlTm9TZXJ2ZXJOdWxsKCk7CkBAIC05MTUsNiArMTI5NywxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX0Jsb2NrTm9TZXJ2ZXJSZWFkb25seSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKHRoaXMuY2hhbm5lbDEuaXNCbG9ja2luZygpKTsKICAgICAgICAgcmVjZWl2ZU5vU2VydmVyUmVhZG9ubHkoKTsKQEAgLTkyNSw2ICsxMzE2LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfTm9uQmxvY2tOb1NlcnZlclJlYWRvbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwogICAgICAgICByZWNlaXZlTm9TZXJ2ZXJSZWFkb25seSgpOwpAQCAtOTM1LDYgKzEzMzUsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZV9Ob25CbG9ja05vU2VydmVyQnVmWmVybygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgcmVjZWl2ZU5vbkJsb2NrTm9TZXJ2ZXIoQ0FQQUNJVFlfWkVSTyk7CkBAIC05NDUsNiArMTM1NCwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX05vbkJsb2NrTm9TZXJ2ZXJCdWZOb3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgY29ubmVjdFdpdGhvdXRTZXJ2ZXIoKTsKQEAgLTk1OCw2ICsxMzc2LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfTm9uQmxvY2tOb1NlcnZlckJ1ZkZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CiAgICAgICAgIGNvbm5lY3RXaXRob3V0U2VydmVyKCk7CkBAIC05NzAsNiArMTM5NywxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZV9CbG9ja05vU2VydmVyQ2hhbm5lbENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5jaGFubmVsMS5pc0Jsb2NraW5nKCkpOwogICAgICAgICByZWNlaXZlTm9TZXJ2ZXJDaGFubmVsQ2xvc2UoKTsKQEAgLTk4MCw2ICsxNDE2LDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfTm9uQmxvY2tOb1NlcnZlckNoYW5uZWxDbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgcmVjZWl2ZU5vU2VydmVyQ2hhbm5lbENsb3NlKCk7CkBAIC05OTAsNiArMTQzNSwxNSBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZV9CbG9ja05vU2VydmVyQ2xvc2VOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5jaGFubmVsMS5pc0Jsb2NraW5nKCkpOwogICAgICAgICByZWNlaXZlTm9TZXJ2ZXJDaGFubmVsQ2xvc2VOdWxsKCk7CkBAIC0xMDAwLDYgKzE0NTQsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZV9Ob25CbG9ja05vU2VydmVyQ2xvc2VOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwogICAgICAgICByZWNlaXZlTm9TZXJ2ZXJDaGFubmVsQ2xvc2VOdWxsKCk7CkBAIC0xMDEwLDYgKzE0NzMsMTUgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX05vbkJsb2NrTm9TZXJ2ZXJDbG9zZVJlYWRvbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwogICAgICAgICByZWNlaXZlTm9TZXJ2ZXJDaGFubmVsQ2xvc2VSZWFkb25seSgpOwpAQCAtMTAyMCw2ICsxNDkyLDE1IEBACiAgICAgICogCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVfQmxvY2tOb1NlcnZlckNsb3NlUmVhZG9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLmNoYW5uZWwxLmlzQmxvY2tpbmcoKSk7CiAgICAgICAgIHJlY2VpdmVOb1NlcnZlckNoYW5uZWxDbG9zZVJlYWRvbmx5KCk7CkBAIC0xMTM5LDE2ICsxNjIwLDQxIEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ0RhdGFncmFtQ2hhbm5lbEltcGwuc2VuZChCeXRlQnVmZmVyLCBTb2NrZXRBZGRyZXNzKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VuZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFNlbmRfTm9TZXJ2ZXJCbG9ja2luZ0NvbW1vbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENBUEFDSVRZX05PUk1BTCk7CiAgICAgICAgIHNlbmREYXRhQmxvY2tpbmcobG9jYWxBZGRyMSwgd3JpdGVCdWYpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kX05vU2VydmVyTm9uYmxvY2tpbmdDb21tb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwogICAgICAgICBzZW5kRGF0YU5vbkJsb2NraW5nKGxvY2FsQWRkcjEsIHdyaXRlQnVmKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VuZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZF9Ob1NlcnZlclR3aWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKICAgICAgICAgc2VuZERhdGFCbG9ja2luZyhsb2NhbEFkZHIxLCB3cml0ZUJ1Zik7CkBAIC0xMTYxLDcgKzE2NjcsMTUgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kX05vU2VydmVyTm9uQmxvY2tpbmdUd2ljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENBUEFDSVRZX05PUk1BTCk7CiAgICAgICAgIHNlbmREYXRhTm9uQmxvY2tpbmcobG9jYWxBZGRyMSwgd3JpdGVCdWYpOwpAQCAtMTE3NCw3ICsxNjg4LDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VuZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZF9Ob1NlcnZlckJ1Zk51bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgc2VuZERhdGFCbG9ja2luZyhsb2NhbEFkZHIxLCBudWxsKTsKQEAgLTExODMsNyArMTcwNSwxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlbmRfTm9TZXJ2ZXJCdWZOdWxsVHdpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwogICAgICAgICB0cnkgewpAQCAtMTIwMCw3ICsxNzMwLDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiRE9lc24ndCB2ZXJpZnkgYWxsIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHNwZWMuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VuZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZF9Ob1NlcnZlckFkZHJOdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKICAgICAgICAgdHJ5IHsKQEAgLTEyMTAsNyArMTc0OCwxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlbmRfTm9TZXJ2ZXJBZGRyTnVsbFR3aWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKICAgICAgICAgdHJ5IHsKQEAgLTEyMzEsNyArMTc3NywxOSBAQAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBUZXN0IGZvciByZWNlaXZlKClhbmQgc2VuZCgpOiBTZW5kIGFuZCBSZWNlaXZlIHdpdGggUmVhbCBEYXRhCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF9CbG9ja19Ob3JtYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5zb2NrZXQoKS5iaW5kKGxvY2FsQWRkcjIpOwogICAgICAgICBzZW5kQnlDaGFubmVsKCJzb21lIG5vcm1hbCBzdHJpbmcgaW4gdGVzdFJlY2VpdmVTZW5kX05vcm1hbCIsCkBAIC0xMjM5LDcgKzE3OTcsMTkgQEAKICAgICAgICAgcmVjZWl2ZUJ5Q2hhbm5lbChDQVBBQ0lUWV9OT1JNQUwsIGxvY2FsQWRkcjIsCiAgICAgICAgICAgICAgICAgInNvbWUgbm9ybWFsIHN0cmluZyBpbiB0ZXN0UmVjZWl2ZVNlbmRfTm9ybWFsIik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX0Jsb2NrX05vdEJvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIG5vdCBib3VuZAogICAgICAgICBzZW5kQnlDaGFubmVsKCJzb21lIG5vcm1hbCBzdHJpbmcgaW4gdGVzdFJlY2VpdmVTZW5kX05vcm1hbCIsCkBAIC0xMjQ4LDcgKzE4MTgsMTkgQEAKICAgICAgICAgYXNzZXJ0TnVsbChjaGFubmVsMS5yZWNlaXZlKGJ1ZikpOwogICAgICAgICBhc3NlcnRGYWxzZShjaGFubmVsMS5zb2NrZXQoKS5pc0JvdW5kKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF9Ob25CbG9ja19Ob3RCb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBub3QgYm91bmQKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC0xMjU4LDcgKzE4NDAsMTkgQEAKICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXSk7CiAgICAgICAgIGFzc2VydE51bGwoKEluZXRTb2NrZXRBZGRyZXNzKSB0aGlzLmNoYW5uZWwxLnJlY2VpdmUoYnVmKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX0Jsb2NrX05vcm1hbF9TMkMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5zb2NrZXQoKS5iaW5kKGxvY2FsQWRkcjIpOwogICAgICAgICBzZW5kQnlEYXRhZ3JhbVNvY2tldCgKQEAgLTEyNjYsMTQgKzE4NjAsMzggQEAKICAgICAgICAgcmVjZWl2ZUJ5Q2hhbm5lbChDQVBBQ0lUWV9OT1JNQUwsIGxvY2FsQWRkcjIsCiAgICAgICAgICAgICAgICAgInNvbWUgbm9ybWFsIHN0cmluZyBpbiB0ZXN0UmVjZWl2ZVNlbmRfTm9ybWFsX1MyQyIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZVNlbmRfQmxvY2tfTm9ybWFsX0MyUygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmRhdGFncmFtU29ja2V0MSA9IG5ldyBEYXRhZ3JhbVNvY2tldChsb2NhbEFkZHIyLmdldFBvcnQoKSk7CiAgICAgICAgIFN0cmluZyBzdHIxID0gInNvbWUgbm9ybWFsIHN0cmluZyBpbiB0ZXN0UmVjZWl2ZVNlbmRfTm9ybWFsX0MyUyI7CiAgICAgICAgIHNlbmRCeUNoYW5uZWwoc3RyMSwgbG9jYWxBZGRyMik7CiAgICAgICAgIHJlY2VpdmVCeURhdGFncmFtU29ja2V0KENBUEFDSVRZX05PUk1BTCwgbG9jYWxBZGRyMiwgc3RyMSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX05vbkJsb2NrX05vcm1hbF9DMlMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CiAgICAgICAgIHRoaXMuY2hhbm5lbDIuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtMTI4Miw3ICsxOTAwLDE5IEBACiAgICAgICAgIHNlbmRCeUNoYW5uZWwoc3RyMSwgbG9jYWxBZGRyMik7CiAgICAgICAgIHJlY2VpdmVCeURhdGFncmFtU29ja2V0KENBUEFDSVRZX05PUk1BTCwgbG9jYWxBZGRyMiwgc3RyMSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX05vcm1hbF9TMlMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG1zZyA9ICJub3JtYWwgc3RyaW5nIGluIHRlc3RSZWNlaXZlU2VuZF9Ob3JtYWxfUzJTIjsKICAgICAgICAgdGhpcy5kYXRhZ3JhbVNvY2tldDEgPSBuZXcgRGF0YWdyYW1Tb2NrZXQodGVzdFBvcnQpOwpAQCAtMTI5NiwxMyArMTkyNiwzMyBAQAogICAgICAgICB0aGlzLmRhdGFncmFtU29ja2V0Mi5yZWNlaXZlKHJkcCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU3RyaW5nKGJ1ZiwgMCwgQ0FQQUNJVFlfTk9STUFMKS50cmltKCksIG1zZyk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF9CbG9ja19FbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLnNvY2tldCgpLmJpbmQobG9jYWxBZGRyMik7CiAgICAgICAgIHNlbmRCeUNoYW5uZWwoIiIsIGxvY2FsQWRkcjIpOwogICAgICAgICByZWNlaXZlQnlDaGFubmVsKENBUEFDSVRZX05PUk1BTCwgbG9jYWxBZGRyMiwgIiIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF9Ob25CbG9ja19FbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgdGhpcy5jaGFubmVsMi5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC0xMzEwLDEzICsxOTYwLDM3IEBACiAgICAgICAgIHNlbmRCeUNoYW5uZWwoIiIsIGxvY2FsQWRkcjIpOwogICAgICAgICByZWNlaXZlQnlDaGFubmVsKENBUEFDSVRZX05PUk1BTCwgbG9jYWxBZGRyMiwgIiIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZVNlbmRfQmxvY2tfRW1wdHlfUzJDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuc29ja2V0KCkuYmluZChsb2NhbEFkZHIyKTsKICAgICAgICAgc2VuZEJ5RGF0YWdyYW1Tb2NrZXQoIiIsIGxvY2FsQWRkcjIpOwogICAgICAgICByZWNlaXZlQnlDaGFubmVsKENBUEFDSVRZX05PUk1BTCwgbG9jYWxBZGRyMiwgIiIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlY2VpdmUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF9Ob25CbG9ja19FbXB0eV9TMkMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CiAgICAgICAgIHRoaXMuY2hhbm5lbDIuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtMTMyNCwxMyArMTk5OCwzNyBAQAogICAgICAgICBzZW5kQnlEYXRhZ3JhbVNvY2tldCgiIiwgbG9jYWxBZGRyMik7CiAgICAgICAgIHJlY2VpdmVCeUNoYW5uZWwoQ0FQQUNJVFlfTk9STUFMLCBsb2NhbEFkZHIyLCAiIik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF9CbG9ja19FbXB0eV9DMlMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5kYXRhZ3JhbVNvY2tldDEgPSBuZXcgRGF0YWdyYW1Tb2NrZXQobG9jYWxBZGRyMi5nZXRQb3J0KCkpOwogICAgICAgICBzZW5kQnlDaGFubmVsKCIiLCBsb2NhbEFkZHIyKTsKICAgICAgICAgcmVjZWl2ZUJ5RGF0YWdyYW1Tb2NrZXQoQ0FQQUNJVFlfTk9STUFMLCBsb2NhbEFkZHIyLCAiIik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX05vbkJsb2NrX0VtcHR5X0MyUygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgdGhpcy5jaGFubmVsMi5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC0xMzM4LDcgKzIwMzYsMTUgQEAKICAgICAgICAgc2VuZEJ5Q2hhbm5lbCgiIiwgbG9jYWxBZGRyMik7CiAgICAgICAgIHJlY2VpdmVCeURhdGFncmFtU29ja2V0KENBUEFDSVRZX05PUk1BTCwgbG9jYWxBZGRyMiwgIiIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF9FbXB0eV9TMlMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG1zZyA9ICIiOwogICAgICAgICB0aGlzLmRhdGFncmFtU29ja2V0MSA9IG5ldyBEYXRhZ3JhbVNvY2tldCh0ZXN0UG9ydCk7CkBAIC0xMzUyLDE5ICsyMDU4LDU1IEBACiAgICAgICAgIHRoaXMuZGF0YWdyYW1Tb2NrZXQyLnJlY2VpdmUocmRwKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmcoYnVmLCAwLCBDQVBBQ0lUWV9OT1JNQUwpLnRyaW0oKSwgbXNnKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VuZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZVNlbmRfQmxvY2tfT3ZlcnNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFubmVsMS5zb2NrZXQoKS5iaW5kKGxvY2FsQWRkcjIpOwogICAgICAgICBzZW5kQnlDaGFubmVsKCIwMTIzNDU2Nzg5IiwgbG9jYWxBZGRyMik7CiAgICAgICAgIHJlY2VpdmVCeUNoYW5uZWwoNSwgbG9jYWxBZGRyMiwgIjAxMjM0Iik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX0Jsb2NrX092ZXJzaXplX0MyUygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmRhdGFncmFtU29ja2V0MSA9IG5ldyBEYXRhZ3JhbVNvY2tldChsb2NhbEFkZHIyLmdldFBvcnQoKSk7CiAgICAgICAgIHNlbmRCeUNoYW5uZWwoIjAxMjM0NTY3ODkiLCBsb2NhbEFkZHIyKTsKICAgICAgICAgcmVjZWl2ZUJ5RGF0YWdyYW1Tb2NrZXQoNSwgbG9jYWxBZGRyMiwgIjAxMjM0Iik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX05vbkJsb2NrX092ZXJzaXplX0MyUygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgdGhpcy5jaGFubmVsMi5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC0xMzcyLDEzICsyMTE0LDM3IEBACiAgICAgICAgIHNlbmRCeUNoYW5uZWwoIjAxMjM0NTY3ODkiLCBsb2NhbEFkZHIyKTsKICAgICAgICAgcmVjZWl2ZUJ5RGF0YWdyYW1Tb2NrZXQoNSwgbG9jYWxBZGRyMiwgIjAxMjM0Iik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kX0Jsb2NrX092ZXJzaXplX1MyQygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLmNoYW5uZWwxLnNvY2tldCgpLmJpbmQobG9jYWxBZGRyMik7CiAgICAgICAgIHNlbmRCeURhdGFncmFtU29ja2V0KCIwMTIzNDU2Nzg5IiwgbG9jYWxBZGRyMik7CiAgICAgICAgIHJlY2VpdmVCeUNoYW5uZWwoNSwgbG9jYWxBZGRyMiwgIjAxMjM0Iik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVjZWl2ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlU2VuZF84SygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmdCdWZmZXIgc3RyOGsgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgOCAqIENBUEFDSVRZXzFLQjsgaSsrKSB7CkBAIC0xMzg5LDcgKzIxNTUsMTYgQEAKICAgICAgICAgc2VuZEJ5Q2hhbm5lbChzdHIsIGxvY2FsQWRkcjIpOwogICAgICAgICByZWNlaXZlQnlDaGFubmVsKDggKiBDQVBBQ0lUWV8xS0IsIGxvY2FsQWRkcjIsIHN0cik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNlbmQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVTZW5kXzY0SygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmdCdWZmZXIgc3RyNjRrID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENBUEFDSVRZXzY0S0I7IGkrKykgewpAQCAtMTQ4MSw3ICsyMjU2LDE1IEBACiAgICAgcHJpdmF0ZSBjbGFzcyBtb2NrQWRkcmVzcyBleHRlbmRzIFNvY2tldEFkZHJlc3MgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kX01vY2tTb2NrZXRBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU29ja2V0QWRkcmVzcyBiYWRBZGRyID0gbmV3IG1vY2tBZGRyZXNzKCk7CkBAIC0xNTA1LDcgKzIyODgsMTYgQEAKICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIoc20pOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24sICIgKyAKKyAgICAgICAgICAgICJDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZF9TZWN1cml0eSgpIHRocm93cyBFeGNlcHRpb24geyAgICAgICAgCiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShDQVBBQ0lUWV9OT1JNQUwpOwogICAgICAgICBTdHJpbmcgc3RySGVsbG8gPSAiaGVsbG8iOwpAQCAtMTUyNCw3ICsyMzE2LDE1IEBACiAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKHNtKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWNlaXZlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlX1BlZWtfU2VjdXJpdHlfTm9uYmxvY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAgIAogICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFlfTk9STUFMKTsKICAgICAgICAgU3RyaW5nIHN0ckhlbGxvID0gImhlbGxvIjsKQEAgLTE1NjYsMTcgKzIzNjYsNDIgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIGZvciAnRGF0YWdyYW1DaGFubmVsSW1wbC53cml0ZShCeXRlQnVmZmVyKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyX0Jsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKICAgICAgICAgY29ubmVjdFdyaXRlQnVmKGxvY2FsQWRkcjEsIHdyaXRlQnVmKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyX05vbkJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CiAgICAgICAgIGNvbm5lY3RXcml0ZUJ1Zihsb2NhbEFkZHIxLCB3cml0ZUJ1Zik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlcl9CbG9ja19jbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwogICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBpcEFkZHIgPSBsb2NhbEFkZHIxOyAKQEAgLTE1OTEsNyArMjQxNiwxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlcl9Ob25CbG9ja19jbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwogICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBpcEFkZHIgPSBsb2NhbEFkZHIxOyAKQEAgLTE2MDgsNyArMjQ0MSwxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlcl9CbG9ja19CdWZOdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMCk7CiAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGlwQWRkciA9IGxvY2FsQWRkcjE7IApAQCAtMTYzNSw3ICsyNDc2LDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyX05vbkJsb2NrX0J1Zk51bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgwKTsKICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXBBZGRyID0gbG9jYWxBZGRyMTsgICAgIApAQCAtMTY3MCw2ICsyNTE5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ0RhdGFncmFtQ2hhbm5lbEltcGwud3JpdGUoQnl0ZUJ1ZmZlcltdLCBpbnQsIGludCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X0Jsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHdyaXRlQnVmID0gbmV3IEJ5dGVCdWZmZXJbMl07CiAgICAgICAgIHdyaXRlQnVmWzBdID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwpAQCAtMTY4OCw3ICsyNTQ2LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCB0aGlzLmNoYW5uZWwxLndyaXRlKHdyaXRlQnVmLCAwLCAxKSk7CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X05vbkJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHdyaXRlQnVmID0gbmV3IEJ5dGVCdWZmZXJbMl07CiAgICAgICAgIHdyaXRlQnVmWzBdID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwpAQCAtMTcwOSw3ICsyNTc1LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCB0aGlzLmNoYW5uZWwxLndyaXRlKHdyaXRlQnVmLCAwLCAxKSk7CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X05vQ29ubmVjdEluZGV4QmFkKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSB3cml0ZUJ1ZiA9IG5ldyBCeXRlQnVmZmVyWzJdOwpAQCAtMTczNCw3ICsyNjA4LDE1IEBACiAgICAgICAgIC8vIGNhbm5vdCBiZSBidWZmZXJlZCBhZ2FpbiEKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY2hhbm5lbDEud3JpdGUod3JpdGVCdWYsIDAsIDEpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X0Nvbm5lY3RlZEluZGV4QmFkKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSB3cml0ZUJ1ZiA9IG5ldyBCeXRlQnVmZmVyWzJdOwpAQCAtMTc1Niw3ICsyNjM4LDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X0J1Zk51bGxOb0Nvbm5lY3QoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHdyaXRlQnVmID0gbmV3IEJ5dGVCdWZmZXJbMl07CkBAIC0xNzgwLDcgKzI2NzAsMTUgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUJ5dGVCdWZmZXJBcnJheUludEludF9CdWZOdWxsQ29ubmVjdCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyW10gd3JpdGVCdWYgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKQEAgLTE4MTYsNiArMjcxNCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdEYXRhZ3JhbUNoYW5uZWxJbXBsLnJlYWQoQnl0ZUJ1ZmZlciknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENBUEFDSVRZX05PUk1BTCk7CiAgICAgICAgIHRyeSB7CkBAIC0xODM3LDcgKzI3NDQsMTUgQEAKICAgICAgICAgICAgIC8vIE9LLgogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVCdWZmZXJfYnVmTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMCk7CiAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGlwQWRkciA9IGxvY2FsQWRkcjE7IApAQCAtMTg2NCw2ICsyNzc5LDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ0RhdGFncmFtQ2hhbm5lbEltcGwucmVhZChCeXRlQnVmZmVyW10sIGludCwgaW50KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbiwgIiArIAorICAgICAgICAgICAgIkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZUJ1ZmZlckFycmF5SW50SW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHJlYWRCdWYgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKICAgICAgICAgcmVhZEJ1ZlswXSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKQEAgLTE5MDIsNyArMjgyNywxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVCdWZmZXJBcnJheUludEludF9CdWZOdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHJlYWRCdWYgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKICAgICAgICAgcmVhZEJ1ZlswXSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKQEAgLTE5NDIsNyArMjg3NSwxOSBAQAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyB0ZXN0IHJlYWQgYW5kIHdyaXRlCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbmZpZ3VyZUJsb2NraW5nIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVfY29uZmlndXJlQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHRhcmdldEFycmF5ID0gbmV3IGJ5dGVbMl07CiAgICAgICAgIC8vIGJpbmQgYW5kIGNvbm5lY3QKQEAgLTE5NzAsNyArMjkxNSwxNSBAQAogICAgICAgICAgICAgLy8gb2sKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVfQmxvY2tfWmVybygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gc291cmNlQXJyYXkgPSBuZXcgYnl0ZVswXTsKICAgICAgICAgYnl0ZVtdIHRhcmdldEFycmF5ID0gbmV3IGJ5dGVbMF07CkBAIC0xOTkwLDcgKzI5NDMsMTkgQEAKIAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZENvdW50KTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKSwgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlX0Jsb2NrX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gc291cmNlQXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwogICAgICAgICBieXRlW10gdGFyZ2V0QXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwpAQCAtMjAwNyw3ICsyOTcyLDE1IEBACiAgICAgICAgIHJlYWRXcml0ZVJlYWREYXRhKHRoaXMuY2hhbm5lbDEsIHNvdXJjZUFycmF5LCB0aGlzLmNoYW5uZWwyLAogICAgICAgICAgICAgICAgIHRhcmdldEFycmF5LCBDQVBBQ0lUWV9OT1JNQUwsICJ0ZXN0UmVhZFdyaXRlX0Jsb2NrX05vcm1hbCIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVfQmxvY2tfRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZW1wdHkgYnVmCiAgICAgICAgIGJ5dGVbXSBzb3VyY2VBcnJheSA9ICIiLmdldEJ5dGVzKCk7CkBAIC0yMDI5LDcgKzMwMDIsMTkgQEAKICAgICAgICAgLy8gZW1wdHkgbWVzc2FnZSBsZXQgdGhlIHJlYWRlciBibG9ja2VkCiAgICAgICAgIGNsb3NlQmxvY2tlZFJlYWRlckNoYW5uZWwyKHRhcmdldEJ1Zik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICksICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZV9jaGFuZ2VCbG9ja19FbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBlbXB0eSBidWYKICAgICAgICAgYnl0ZVtdIHNvdXJjZUFycmF5ID0gIiIuZ2V0Qnl0ZXMoKTsKQEAgLTIwNzAsNyArMzA1NSwxOSBAQAogICAgICAgICAgICAgLy8gT0suCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKSwgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlX0Jsb2NrXzhLQigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gc291cmNlQXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV8xS0IgKiA4XTsKICAgICAgICAgYnl0ZVtdIHRhcmdldEFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfMUtCICogOF07CkBAIC0yMTIxLDcgKzMxMTgsMTYgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscyh0YXJnZXRBcnJheVtpXSwgKGJ5dGUpIGkpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICJDbG9zZWRDaGFubmVsRXhjZXB0aW9uLCBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlX0Jsb2NrXzY0SygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gc291cmNlQXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV82NEtCXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VBcnJheS5sZW5ndGg7IGkrKykgewpAQCAtMjE0Myw3ICszMTQ5LDE1IEBACiAgICAgICAgICAgICAvLyB0b28gYmlnCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlX0Jsb2NrX0RpZmZlcmVudEFkZHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHNvdXJjZUFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKICAgICAgICAgYnl0ZVtdIHRhcmdldEFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKQEAgLTIxNjcsNyArMzE4MSwxNSBAQAogICAgICAgICAvLyB3ZSBjbG9zZSB0aGUgYmxvY2tlZCBjaGFubmVsCiAgICAgICAgIGNsb3NlQmxvY2tlZFJlYWRlckNoYW5uZWwyKHRhcmdldEJ1Zik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZV9CbG9ja19Xcml0ZXJOb3RCaW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBzb3VyY2VBcnJheSA9IG5ldyBieXRlW0NBUEFDSVRZX05PUk1BTF07CiAgICAgICAgIGJ5dGVbXSB0YXJnZXRBcnJheSA9IG5ldyBieXRlW0NBUEFDSVRZX05PUk1BTF07CkBAIC0yMTg4LDcgKzMyMTAsMTUgQEAKICAgICAgICAgQnl0ZUJ1ZmZlciB0YXJnZXRCdWYgPSBCeXRlQnVmZmVyLndyYXAodGFyZ2V0QXJyYXkpOwogICAgICAgICBjbG9zZUJsb2NrZWRSZWFkZXJDaGFubmVsMih0YXJnZXRCdWYpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVfQmxvY2tfV3JpdGVyQmluZExhdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgYnl0ZVtdIHRhcmdldEFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKQEAgLTIyNDAsNyArMzI3MCwxNSBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlX0Jsb2NrX1JlYWRlck5vdEJpbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHNvdXJjZUFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKICAgICAgICAgYnl0ZVtdIHRhcmdldEFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKQEAgLTIyODgsNiArMzMyNiwxOSBAQAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBUZXN0IHJlYWQgYW5kIHdyaXRlIGluIG5vbi1ibG9jayBtb2RlLgogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICksICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlX05vbkJsb2NrX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gc291cmNlQXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwogICAgICAgICBieXRlW10gdGFyZ2V0QXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwpAQCAtMjMwNyw3ICszMzU4LDE5IEBACiAgICAgICAgIHJlYWRXcml0ZVJlYWREYXRhKHRoaXMuY2hhbm5lbDEsIHNvdXJjZUFycmF5LCB0aGlzLmNoYW5uZWwyLAogICAgICAgICAgICAgICAgIHRhcmdldEFycmF5LCBDQVBBQ0lUWV9OT1JNQUwsICJ0ZXN0UmVhZFdyaXRlX05vbkJsb2NrX05vcm1hbCIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVfTm9uQmxvY2tfOEtCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBzb3VyY2VBcnJheSA9IG5ldyBieXRlW0NBUEFDSVRZXzFLQiAqIDhdOwogICAgICAgICBieXRlW10gdGFyZ2V0QXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV8xS0IgKiA4XTsKQEAgLTIzMjcsNyArMzM5MCwxOSBAQAogICAgICAgICByZWFkV3JpdGVSZWFkRGF0YSh0aGlzLmNoYW5uZWwxLCBzb3VyY2VBcnJheSwgdGhpcy5jaGFubmVsMiwKICAgICAgICAgICAgICAgICB0YXJnZXRBcnJheSwgOCAqIENBUEFDSVRZXzFLQiwgInRlc3RSZWFkV3JpdGVfTm9uQmxvY2tfOEtCIik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLCAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZV9Ob25CbG9ja19EaWZmZXJlbnRBZGRyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBzb3VyY2VBcnJheSA9IG5ldyBieXRlW0NBUEFDSVRZX05PUk1BTF07CiAgICAgICAgIGJ5dGVbXSB0YXJnZXRBcnJheSA9IG5ldyBieXRlW0NBUEFDSVRZX05PUk1BTF07CkBAIC0yMzUyLDcgKzM0MjcsMTkgQEAKICAgICAgICAgQnl0ZUJ1ZmZlciB0YXJnZXRCdWYgPSBCeXRlQnVmZmVyLndyYXAodGFyZ2V0QXJyYXkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdGhpcy5jaGFubmVsMi5yZWFkKHRhcmdldEJ1ZikpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgKSwgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVfTm9uQmxvY2tfV3JpdGVyTm90QmluZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gc291cmNlQXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwogICAgICAgICBieXRlW10gdGFyZ2V0QXJyYXkgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwpAQCAtMjM3Niw3ICszNDYzLDE5IEBACiAgICAgICAgIEJ5dGVCdWZmZXIgdGFyZ2V0QnVmID0gQnl0ZUJ1ZmZlci53cmFwKHRhcmdldEFycmF5KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY2hhbm5lbDIucmVhZCh0YXJnZXRCdWYpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICksICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlX05vbkJsb2NrX1JlYWRlck5vdEJpbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHNvdXJjZUFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKICAgICAgICAgYnl0ZVtdIHRhcmdldEFycmF5ID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKQEAgLTI0MDAsNyArMzQ5OSwxNSBAQAogICAgICAgICBCeXRlQnVmZmVyIHRhcmdldEJ1ZiA9IEJ5dGVCdWZmZXIud3JhcCh0YXJnZXRBcnJheSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB0aGlzLmNoYW5uZWwyLnJlYWQodGFyZ2V0QnVmKSk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfTEJ1ZmZlcl9wb3NpdGlvbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS02ODMKICAgICAgICAgaW50IHBvc3Rpb24gPSAxNjsKQEAgLTI0MTIsNyArMzUxOSwxNSBAQAogICAgICAgICBzb3VyY2VCdWYucG9zaXRpb24ocG9zdGlvbik7CiAgICAgICAgIGFzc2VydEVxdWFscyhDQVBBQ0lUWV9OT1JNQUwgLSBwb3N0aW9uLCBkYy53cml0ZShzb3VyY2VCdWYpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VuZF9MQnVmZmVyX0xTb2NrZXRBZGRyZXNzX1Bvc2l0b25Ob3RaZXJvKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzAxCkBAIC0yNDMzLDYgKzM1NDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgRGF0YWdyYW1DaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcltdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJExCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS03NTQKICAgICAgICAgY2hhbm5lbDIuc29ja2V0KCkuYmluZChsb2NhbEFkZHIxKTsKQEAgLTI0NTIsNiArMzU3NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBEYXRhZ3JhbUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyW10saW50LGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kTEJ5dGVCdWZmZXJJSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzU0CiAgICAgICAgIGNoYW5uZWwyLnNvY2tldCgpLmJpbmQobG9jYWxBZGRyMSk7CkBAIC0yNDcxLDYgKzM2MDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgRGF0YWdyYW1DaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF9MQnl0ZUJ1ZmZlcl9jbG9zZWRfbnVsbEJ1ZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzU0CiAgICAgICAgIEJ5dGVCdWZmZXIgYyA9IG51bGw7CkBAIC0yNDg3LDYgKzM2MjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgRGF0YWdyYW1DaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF9MQnl0ZUJ1ZmZlcl9Ob3RDb25uZWN0ZWRfbnVsbEJ1ZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzU0CiAgICAgICAgIEJ5dGVCdWZmZXIgYyA9IG51bGw7CkBAIC0yNTAyLDYgKzM2NTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgRGF0YWdyYW1DaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF9MQnl0ZUJ1ZmZlcl9yZWFkT25seUJ1ZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzU0CiAgICAgICAgIEJ5dGVCdWZmZXIgYyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSk7CkBAIC0yNTI0LDYgKzM2ODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgRGF0YWdyYW1DaGFubmVsI3NlbmQoQnl0ZUJ1ZmZlciwgU29ja2V0QWRkcmVzcykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZW5kIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VuZF9MQnl0ZUJ1ZmZlcl9MU29ja2V0QWRkcmVzc19jbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb257CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS05MTMKICAgICAgICAgY2hhbm5lbDEuY2xvc2UoKTsKQEAgLTI1NTcsNiArMzcyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBEYXRhZ3JhbUNoYW5uZWwjc29ja2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldF9JbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0xMDM2CiAgICAgICAgIERhdGFncmFtQ2hhbm5lbCBjaGFubmVsID0gRGF0YWdyYW1DaGFubmVsLm9wZW4oKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWxMb2NraW5nVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9GaWxlQ2hhbm5lbExvY2tpbmdUZXN0LmphdmEKaW5kZXggYThkZjkwNy4uNGQ3MDdjNyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9GaWxlQ2hhbm5lbExvY2tpbmdUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9GaWxlQ2hhbm5lbExvY2tpbmdUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVsczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC0zMyw2ICszOCw3IEBACiAvKioKICAqIEFQSSB0ZXN0cyBmb3IgdGhlIE5JTyBGaWxlQ2hhbm5lbCBsb2NraW5nIEFQSXMKICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5jbGFzcykKIHB1YmxpYyBjbGFzcyBGaWxlQ2hhbm5lbExvY2tpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBGaWxlQ2hhbm5lbCByZWFkT25seUNoYW5uZWw7CkBAIC03MCw3ICs3NiwxOSBAQAogICAgICAgICAgICAgICAgICJydyIpOwogICAgICAgICByZWFkV3JpdGVDaGFubmVsID0gcmFuZG9tQWNjZXNzRmlsZS5nZXRDaGFubmVsKCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lsbGVnYWxMb2NrcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIENhbm5vdCBhY3F1aXJlIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIGEgcmVhZC1vbmx5IGZpbGUgY2hhbm5lbAogICAgICAgICB0cnkgewpAQCAtODgsNyArMTA2LDE1IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9ja1JlYWRXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEFjcXVpcmUgYW4gZXhjbHVzaXZlIGxvY2sgYWNyb3NzIHRoZSBlbnRpcmUgZmlsZS4KICAgICAgICAgRmlsZUxvY2sgZmxvY2sgPSByZWFkV3JpdGVDaGFubmVsLmxvY2soKTsKQEAgLTk2LDcgKzEyMiwxNSBAQAogICAgICAgICAgICAgZmxvY2sucmVsZWFzZSgpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lsbGVnYWxMb2NrUGFyYW1ldGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIENhbm5vdCBsb2NrIG5lZ2F0aXZlIHBvc2l0aW9ucwogICAgICAgICB0cnkgewpAQCAtMTI5LDcgKzE2MywxNSBAQAogICAgICAgICAgICAgZmxvY2sxLnJlbGVhc2UoKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2FsbCBpc1NoYXJlZCwgaXNWYWxpZCBtZXRob2RzIGFmdGVyIGxvY2suIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2tMTFooKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBMb2NrIGEgcmFuZ2UgYXQgdGhlIGZyb250LCBub24tc2hhcmVkLgogICAgICAgICBGaWxlTG9jayBmbG9jazEgPSByZWFkV3JpdGVDaGFubmVsLmxvY2soMCwgMTAsIGZhbHNlKTsKQEAgLTE0MSw3ICsxODMsMTUgQEAKICAgICAgICAgZmxvY2sxLnJlbGVhc2UoKTsKICAgICAgICAgZmxvY2syLnJlbGVhc2UoKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbGwgZXhjZXB0aW9ucyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cnlMb2NrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cnlMb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJlYWRPbmx5Q2hhbm5lbC50cnlMb2NrKCk7CkBAIC0xNTAsNyArMjAwLDE1IEBACiAgICAgICAgICAgICAvLyBFeHBlY3RlZC4KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGFsbCBleGNlcHRpb25zIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRyeUxvY2siLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cnlMb2NrTExaKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gSXQgaXMgaWxsZWdhbCB0byByZXF1ZXN0IGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIGEgcmVhZC1vbmx5IGNoYW5uZWwKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWxUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVDaGFubmVsVGVzdC5qYXZhCmluZGV4IDEwZjJmY2MuLjY4YzgyMjMgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWxUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9GaWxlQ2hhbm5lbFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtNDcsNiArNTIsNyBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEZpbGVDaGFubmVsLmNsYXNzKQogcHVibGljIGNsYXNzIEZpbGVDaGFubmVsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQVBBQ0lUWSA9IDEwMDsKQEAgLTIyOSw2ICsyMzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjZm9yY2UoYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBmb3JjZSBtZXRob2Qgd2l0aCBmYWxzZSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9yY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JjZUooKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcChDT05URU5UX0FTX0JZVEVTKTsKICAgICAgICAgd3JpdGVPbmx5RmlsZUNoYW5uZWwud3JpdGUod3JpdGVCdWZmZXIpOwpAQCAtMjQzLDYgKzI1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNmb3JjZShib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9yY2VKX2Nsb3NlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0ZU9ubHlGaWxlQ2hhbm5lbC5jbG9zZSgpOwogICAgICAgICB0cnkgewpAQCAtMjYzLDYgKzI4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNmb3JjZShib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9yY2VKX1JlYWRPbmx5Q2hhbm5lbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBmb3JjZSBvbiBhIHJlYWQgb25seSBmaWxlIGNoYW5uZWwgaGFzIG5vIGVmZmVjdC4KICAgICAgICAgcmVhZE9ubHlGaWxlQ2hhbm5lbC5mb3JjZSh0cnVlKTsKQEAgLTI3Miw2ICszMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcG9zaXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9zaXRpb25fSW5pdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZE9ubHlGaWxlQ2hhbm5lbC5wb3NpdGlvbigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHdyaXRlT25seUZpbGVDaGFubmVsLnBvc2l0aW9uKCkpOwpAQCAtMjgxLDYgKzMyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNwb3NpdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb3NpdGlvbl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0ZURhdGFUb0ZpbGUoZmlsZU9mUmVhZE9ubHlGaWxlQ2hhbm5lbCk7CiAKQEAgLTMzMSw2ICszODIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcG9zaXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9zaXRpb25fV3JpdGVPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAoQ09OVEVOVF9BU19CWVRFUyk7CiAgICAgICAgIHdyaXRlT25seUZpbGVDaGFubmVsLndyaXRlKHdyaXRlQnVmZmVyKTsKQEAgLTM0MCw2ICs0MDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcG9zaXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9zaXRpb25fUmVhZFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlRGF0YVRvRmlsZShmaWxlT2ZSZWFkV3JpdGVGaWxlQ2hhbm5lbCk7CiAKQEAgLTM1Niw2ICs0MjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcG9zaXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb3NpdGlvbl9DbG9zZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmVhZE9ubHlGaWxlQ2hhbm5lbC5jbG9zZSgpOwogICAgICAgICB0cnkgewpAQCAtMzg1LDYgKzQ2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNwb3NpdGlvbihsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG9zaXRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb3NpdGlvbkpfQ2xvc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgUE9TSVRJT04gPSAxMDA7CiAKQEAgLTQxNiw2ICs1MDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcG9zaXRpb24obG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9zaXRpb25KX05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgTkVHQVRJVkVfUE9TSVRJT04gPSAtMTsKICAgICAgICAgdHJ5IHsKQEAgLTQ0Myw2ICs1MzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcG9zaXRpb24obG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicG9zaXRpb24iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb3NpdGlvbkpfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRPbmx5RmlsZUNoYW5uZWwpOwogCkBAIC00NjcsNiArNTcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3Bvc2l0aW9uKGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9zaXRpb25KX1dyaXRlT25seSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0ZURhdGFUb0ZpbGUoZmlsZU9mV3JpdGVPbmx5RmlsZUNoYW5uZWwpOwogCkBAIC01MDEsNiArNjE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHplcm8gc2l6ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaXplX0luaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRPbmx5RmlsZUNoYW5uZWwuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHdyaXRlT25seUZpbGVDaGFubmVsLnNpemUoKSk7CkBAIC01MTAsNiArNjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0ZURhdGFUb0ZpbGUoZmlsZU9mUmVhZE9ubHlGaWxlQ2hhbm5lbCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlT2ZSZWFkT25seUZpbGVDaGFubmVsLmxlbmd0aCgpLCByZWFkT25seUZpbGVDaGFubmVsCkBAIC01MTksNiArNjUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZV9DbG9zZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmVhZE9ubHlGaWxlQ2hhbm5lbC5jbG9zZSgpOwogICAgICAgICB0cnkgewpAQCAtNTQ4LDYgKzY4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cnVuY2F0ZShsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ1bmNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cnVuY2F0ZUpfQ2xvc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJlYWRPbmx5RmlsZUNoYW5uZWwuY2xvc2UoKTsKICAgICAgICAgdHJ5IHsKQEAgLTU3Nyw2ICs3MjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ1bmNhdGUobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ1bmNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cnVuY2F0ZUpfSWxsZWdhbEFyZ3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS05NDEKICAgICAgICAgdHJ5IHsKQEAgLTYwNCw2ICs3NjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ1bmNhdGUobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ1bmNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cnVuY2F0ZUpfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRPbmx5RmlsZUNoYW5uZWwpOwogICAgICAgICB0cnkgewpAQCAtNjI0LDYgKzc5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cnVuY2F0ZShsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ1bmNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cnVuY2F0ZUooKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRXcml0ZUZpbGVDaGFubmVsKTsKIApAQCAtNjQ2LDYgKzgyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNsb2NrKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2NrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tGaWxlQ2hhbm5lbCBtb2NrRmlsZUNoYW5uZWwgPSBuZXcgTW9ja0ZpbGVDaGFubmVsKCk7CiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGNhbGxpbmcgbG9jaygpIGxlYWRzIHRvIHRoZSBtZXRob2QKQEAgLTY1OSw2ICs4NDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjbG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2tKSlpfQ2xvc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJlYWRPbmx5RmlsZUNoYW5uZWwuY2xvc2UoKTsKICAgICAgICAgdHJ5IHsKQEAgLTY5Niw2ICs4OTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjbG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2NrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9ja0pKWl9JbGxlZ2FsQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHdyaXRlT25seUZpbGVDaGFubmVsLmxvY2soMCwgLTEsIGZhbHNlKTsKQEAgLTcyOSw2ICs5MzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjbG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2NrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9ja0pKWl9Ob25Xcml0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmVhZE9ubHlGaWxlQ2hhbm5lbC5sb2NrKDAsIDEwLCBmYWxzZSk7CkBAIC03NDksNiArOTYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI2xvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2tKSlpfTm9uUmVhZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHdyaXRlT25seUZpbGVDaGFubmVsLmxvY2soMCwgMTAsIHRydWUpOwpAQCAtNzY5LDYgKzk5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNsb2NrKGxvbmcsIGxvbmcsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2hhcmVkIGNoYW5uZWwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2tKSlpfU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgUE9TSVRJT04gPSAxMDA7CiAgICAgICAgIGZpbmFsIGxvbmcgU0laRSA9IDIwMDsKQEAgLTc4NSw2ICsxMDE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI2xvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHVuc2hhcmVkIGNoYW5uZWwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2tKSlpfTm90U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgUE9TSVRJT04gPSAxMDA7CiAgICAgICAgIGZpbmFsIGxvbmcgU0laRSA9IDIwMDsKQEAgLTc5OSw2ICsxMDM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI2xvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBsb2sgbWV0aG9kIHdpdGggTG9uZyBtYXggdmFsdWUgYXMgYSBzaXplLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvY2siLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb2NrSkpaX0xvbmdfTUFYX1ZBTFVFKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgUE9TSVRJT04gPSAwOwogICAgICAgICBmaW5hbCBsb25nIFNJWkUgPSBMb25nLk1BWF9WQUxVRTsKQEAgLTgxMyw2ICsxMDYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI2xvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvY2siLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb2NrSkpaX092ZXJsYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgUE9TSVRJT04gPSAxMDA7CiAgICAgICAgIGZpbmFsIGxvbmcgU0laRSA9IDIwMDsKQEAgLTgzMCw2ICsxMDg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI2xvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IG5vdCBvdmVybGFwaW5nIHJlZ2lvbnMgY2FuIGJlIGxvY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2NrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9ja0pKWl9Ob3RPdmVybGFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBsb25nIFBPU0lUSU9OID0gMTAwOwogICAgICAgICBmaW5hbCBsb25nIFNJWkUgPSAyMDA7CkBAIC04NDMsNiArMTExMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNsb2NrKGxvbmcsbG9uZyxib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZ1bmN0aW9uYWxpdHkgYWZ0ZXIgcmVsZWFzZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2tKSlpfQWZ0ZXJfUmVsZWFzZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaWxlTG9jayA9IHdyaXRlT25seUZpbGVDaGFubmVsLmxvY2soMCwgMTAsIGZhbHNlKTsKICAgICAgICAgZmlsZUxvY2sucmVsZWFzZSgpOwpAQCAtODU0LDYgKzExMzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ5TG9jaygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ5TG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJ5TG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrRmlsZUNoYW5uZWwgbW9ja0ZpbGVDaGFubmVsID0gbmV3IE1vY2tGaWxlQ2hhbm5lbCgpOwogICAgICAgICAvLyBWZXJpZnkgdGhhdCBjYWxsaW5nIHRyeUxvY2soKSBsZWFkcyB0byB0aGUgbWV0aG9kCkBAIC04NjcsNiArMTE1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cnlMb2NrKGxvbmcsIGxvbmcsIGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ5TG9jayIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyeUxvY2tKSlpfQ2xvc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJlYWRPbmx5RmlsZUNoYW5uZWwuY2xvc2UoKTsKICAgICAgICAgdHJ5IHsKQEAgLTkwNCw2ICsxMTk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyeUxvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRyeUxvY2siLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cnlMb2NrSkpaX0lsbGVnYWxBcmd1bWVudCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgd3JpdGVPbmx5RmlsZUNoYW5uZWwudHJ5TG9jaygwLCAtMSwgZmFsc2UpOwpAQCAtOTM3LDYgKzEyNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ5TG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ5TG9jayIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyeUxvY2tKSlpfTm9uV3JpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJlYWRPbmx5RmlsZUNoYW5uZWwudHJ5TG9jaygwLCAxMCwgZmFsc2UpOwpAQCAtOTU3LDYgKzEyNjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ5TG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ5TG9jayIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyeUxvY2tKSlpfTm9uUmVhZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHdyaXRlT25seUZpbGVDaGFubmVsLnRyeUxvY2soMCwgMTAsIHRydWUpOwpAQCAtOTc3LDYgKzEyOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ5TG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cnlMb2NrIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJ5TG9ja0pKWl9TaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgbG9uZyBQT1NJVElPTiA9IDEwMDsKICAgICAgICAgZmluYWwgbG9uZyBTSVpFID0gMjAwOwpAQCAtOTkzLDYgKzEzMjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ5TG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cnlMb2NrIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJ5TG9ja0pKWl9Ob3RTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgbG9uZyBQT1NJVElPTiA9IDEwMDsKICAgICAgICAgZmluYWwgbG9uZyBTSVpFID0gMjAwOwpAQCAtMTAwNyw2ICsxMzQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyeUxvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJ5TG9jayIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyeUxvY2tKSlpfTG9uZ19NQVhfVkFMVUUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgbG9uZyBQT1NJVElPTiA9IDA7CiAgICAgICAgIGZpbmFsIGxvbmcgU0laRSA9IExvbmcuTUFYX1ZBTFVFOwpAQCAtMTAyMSw2ICsxMzY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyeUxvY2sobG9uZywgbG9uZywgYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cnlMb2NrIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJ5TG9ja0pKWl9PdmVybGFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBsb25nIFBPU0lUSU9OID0gMTAwOwogICAgICAgICBmaW5hbCBsb25nIFNJWkUgPSAyMDA7CkBAIC0xMDM4LDYgKzEzOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ5TG9jayhsb25nLCBsb25nLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cnlMb2NrIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJ5TG9ja0pKWl9Ob3RPdmVybGFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBsb25nIFBPU0lUSU9OID0gMTAwOwogICAgICAgICBmaW5hbCBsb25nIFNJWkUgPSAyMDA7CkBAIC0xMDUzLDYgKzE0MTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJ5TG9jayhsb25nLGxvbmcsYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cnlMb2NrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJ5TG9ja0pKWl9BZnRlcl9SZWxlYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbGVMb2NrID0gd3JpdGVPbmx5RmlsZUNoYW5uZWwudHJ5TG9jaygwLCAxMCwgZmFsc2UpOwogICAgICAgICBmaWxlTG9jay5yZWxlYXNlKCk7CkBAIC0xMDY1LDYgKzE0NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTEJ5dGVCdWZmZXJfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWZmZXIgPSBudWxsOwogCkBAIC0xMDg2LDYgKzE0NzAsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIERvZXNuJ3QgdmVyaWZ5ICIgKworICAgICAgICAgICAgIkFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uLCBDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMQnl0ZUJ1ZmZlcl9DbG9zZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciByZWFkQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShDQVBBQ0lUWSk7CiAKQEAgLTExMjYsNiArMTUyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTEJ5dGVCdWZmZXJfV3JpdGVPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogCkBAIC0xMTQ5LDYgKzE1NTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTEJ5dGVCdWZmZXJfRW1wdHlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogICAgICAgICBpbnQgcmVzdWx0ID0gcmVhZE9ubHlGaWxlQ2hhbm5lbC5yZWFkKHJlYWRCdWZmZXIpOwpAQCAtMTE1OSw2ICsxNTcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZExCeXRlQnVmZmVyX0xpbWl0ZWRDYXBhY2l0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0ZURhdGFUb0ZpbGUoZmlsZU9mUmVhZE9ubHlGaWxlQ2hhbm5lbCk7CiAKQEAgLTExNzUsNiArMTU5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0ZURhdGFUb0ZpbGUoZmlsZU9mUmVhZE9ubHlGaWxlQ2hhbm5lbCk7CiAKQEAgLTExOTEsNiArMTYyMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMQnl0ZUJ1ZmZlckpfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWZmZXIgPSBudWxsOwogCkBAIC0xMjM4LDYgKzE2NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyLCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMQnl0ZUJ1ZmZlckpfQ2xvc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogCkBAIC0xMjYxLDYgKzE3MTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyLCBsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZExCeXRlQnVmZmVySl9JbGxlZ2FsQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciByZWFkQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShDQVBBQ0lUWSk7CiAKQEAgLTEyOTgsNiArMTc1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMQnl0ZUJ1ZmZlckpfV3JpdGVPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogCkBAIC0xMzIxLDYgKzE3ODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMQnl0ZUJ1ZmZlckpfRW1wdHlmaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogICAgICAgICBpbnQgcmVzdWx0ID0gcmVhZE9ubHlGaWxlQ2hhbm5lbC5yZWFkKHJlYWRCdWZmZXIsIDApOwpAQCAtMTMzMSw2ICsxODA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcixsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTEJ5dGVCdWZmZXJKX1Bvc3Rpb25fQmV5b25kRmlsZUxpbWl0KCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogCkBAIC0xMzQ2LDYgKzE4MzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRMQnl0ZUJ1ZmZlckpfUG9zdGlvbl9Bc19Mb25nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogICAgICAgICB0cnkgewpAQCAtMTM1OCw2ICsxODUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcixsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTEJ5dGVCdWZmZXJKKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlRGF0YVRvRmlsZShmaWxlT2ZSZWFkT25seUZpbGVDaGFubmVsKTsKICAgICAgICAgQnl0ZUJ1ZmZlciByZWFkQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShDQVBBQ0lUWSk7CkBAIC0xMzgwLDYgKzE4ODMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRMQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktODQ5CiAgICAgICAgIHdyaXRlRGF0YVRvRmlsZShmaWxlT2ZSZWFkT25seUZpbGVDaGFubmVsKTsKQEAgLTE0MDAsNiArMTkxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVyX21vY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZUNoYW5uZWwgbW9ja0NoYW5uZWwgPSBuZXcgTW9ja0ZpbGVDaGFubmVsKCk7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZmZXJzID0gbmV3IEJ5dGVCdWZmZXJbMl07CkBAIC0xNDEyLDYgKzE5MzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVySUlfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyW10gcmVhZEJ1ZmZlcnMgPSBudWxsOwogCkBAIC0xNDU2LDYgKzE5ODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkTEJ5dGVCdWZmZXJJSV9DbG9zZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHJlYWRCdWZmZXJzID0gbmV3IEJ5dGVCdWZmZXJbMl07CiAgICAgICAgIHJlYWRCdWZmZXJzWzBdID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShDQVBBQ0lUWSk7CkBAIC0xNTA5LDYgKzIwNDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVySUlfV3JpdGVPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSByZWFkQnVmZmVycyA9IG5ldyBCeXRlQnVmZmVyWzJdOwogICAgICAgICByZWFkQnVmZmVyc1swXSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwpAQCAtMTUzMyw2ICsyMDgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVySUlfSW5kZXhPdXRPZkJvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSByZWFkQnVmZmVycyA9IG5ldyBCeXRlQnVmZmVyWzJdOwogICAgICAgICByZWFkQnVmZmVyc1swXSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwpAQCAtMTU3OSw2ICsyMTM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCRMQnl0ZUJ1ZmZlcklJX0VtcHR5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyW10gcmVhZEJ1ZmZlcnMgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKICAgICAgICAgcmVhZEJ1ZmZlcnNbMF0gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKENBUEFDSVRZKTsKQEAgLTE1OTIsNiArMjE1OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkTEJ5dGVCdWZmZXJJSV9FbXB0eUJ1ZmZlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHJlYWRCdWZmZXJzID0gbmV3IEJ5dGVCdWZmZXJbMl07CiAgICAgICAgIHRyeSB7CkBAIC0xNjE1LDYgKzIxOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVySUlfRW1wdHlGaWxlX0VtcHR5QnVmZmVycygpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHJlYWRCdWZmZXJzID0gbmV3IEJ5dGVCdWZmZXJbMl07CkBAIC0xNjI2LDYgKzIyMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVySUlfTGVuZ3RoX1plcm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRPbmx5RmlsZUNoYW5uZWwpOwogICAgICAgICBCeXRlQnVmZmVyW10gcmVhZEJ1ZmZlcnMgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKQEAgLTE2MzgsNiArMjIzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkTEJ5dGVCdWZmZXJJSV9MaW1pdGVkQ2FwYWNpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRPbmx5RmlsZUNoYW5uZWwpOwogICAgICAgICBCeXRlQnVmZmVyW10gcmVhZEJ1ZmZlcnMgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKQEAgLTE2NTksNiArMjI2MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkTEJ5dGVCdWZmZXJJSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0ZURhdGFUb0ZpbGUoZmlsZU9mUmVhZE9ubHlGaWxlQ2hhbm5lbCk7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSByZWFkQnVmZmVycyA9IG5ldyBCeXRlQnVmZmVyWzJdOwpAQCAtMTY4MCw2ICsyMjkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI2lzT3BlbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiBEb2Vzbid0IHZlcmlmeSB0aGF0IGlzT3BlbiByZXR1cm5zIHRydWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNPcGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc09wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS00MAogICAgICAgICBGaWxlIGxvZ0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJvdXQiLCAidG1wIik7CkBAIC0xNjk0LDYgKzIzMTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjcG9zaXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wb3NpdGlvbl9hcHBlbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTUwOAogICAgICAgICBGaWxlIHRtcGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJGaWxlT3V0cHV0U3RyZWFtIiwgInRtcCIpOwpAQCAtMTcxNSw2ICsyMzQ0LDE4IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI21hcChNYXBNb2RlLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24sICIgKworICAgICAgICAgICAgIk5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbiAsIENsb3NlZENoYW5uZWxFeGNlcHRpb24sICIgKworICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24uICIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFwX0Fibm9ybWFsTW9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3cml0ZU9ubHlGaWxlQ2hhbm5lbC5tYXAoTWFwTW9kZS5SRUFEX09OTFksIDAsIENPTlRFTlRfTEVOR1RIKTsKQEAgLTE4MDYsNiArMjQ0NywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNtYXAoTWFwTW9kZSxsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLk1hcE1vZGUuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXBfUmVhZE9ubHlfQ2xvc2VDaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY2xvc2UgY2hhbm5lbCBoYXMgbm8gZWZmZWN0IG9uIG1hcCBpZiBtYXBwZWQKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRXcml0ZUZpbGVDaGFubmVsLnNpemUoKSk7CkBAIC0xODE5LDYgKzI0NzAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjbWFwKE1hcE1vZGUsbG9uZyxsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXAiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFwX1ByaXZhdGVfQ2xvc2VDaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBtYXBwZWQgPSByZWFkV3JpdGVGaWxlQ2hhbm5lbC5tYXAoTWFwTW9kZS5QUklWQVRFLCAwLAogICAgICAgICAgICAgICAgIENPTlRFTlRfTEVOR1RIKTsKQEAgLTE4MzEsNiArMjQ5MiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNtYXAoTWFwTW9kZSxsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLk1hcE1vZGUuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXBfUmVhZE9ubHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIG1hcHBlZCA9IG51bGw7CiAgICAgICAgIC8vIHRyeSBwdXQgc29tZXRoaW5nIHRvIHJlYWRvbmx5IG1hcApAQCAtMTg2Miw2ICsyNTMzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI21hcChNYXBNb2RlLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFwIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwuTWFwTW9kZS5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcF9SZWFkT25seV9Ob25aZXJvUG9zaXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzLndyaXRlRGF0YVRvRmlsZShmaWxlT2ZSZWFkT25seUZpbGVDaGFubmVsKTsKICAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBtYXBwZWQgPSByZWFkT25seUZpbGVDaGFubmVsLm1hcChNYXBNb2RlLlJFQURfT05MWSwKQEAgLTE4NzQsNiArMjU1NSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNtYXAoTWFwTW9kZSxsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLk1hcE1vZGUuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXBfUHJpdmF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMud3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRXcml0ZUZpbGVDaGFubmVsKTsKICAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBtYXBwZWQgPSByZWFkV3JpdGVGaWxlQ2hhbm5lbC5tYXAoTWFwTW9kZS5QUklWQVRFLCAwLApAQCAtMTg5OSw2ICsyNTkwLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI21hcChNYXBNb2RlLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFwIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwuTWFwTW9kZS5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X21hcF9Qcml2YXRlX05vblplcm9Qb3NpdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgbWFwcGVkID0gcmVhZFdyaXRlRmlsZUNoYW5uZWwubWFwKE1hcE1vZGUuUFJJVkFURSwgMTAsCiAgICAgICAgICAgICAgICAgQ09OVEVOVF9MRU5HVEggLSAxMCk7CkBAIC0xOTEwLDYgKzI2MTEsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjbWFwKE1hcE1vZGUsbG9uZyxsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXAiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFwX1JlYWRXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgbWFwcGVkID0gbnVsbDsKICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRXcml0ZUZpbGVDaGFubmVsKTsKQEAgLTE5MzcsNiArMjY0OCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCNtYXAoTWFwTW9kZSxsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1hcCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLk1hcE1vZGUuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9tYXBfUmVhZFdyaXRlX05vblplcm9Qb3NpdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHRlc3QgcG9zaXRpb24gbm9uLXplcm8KICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZlJlYWRXcml0ZUZpbGVDaGFubmVsKTsKQEAgLTE5NTksNiArMjY4MCwxNSBAQAogICAgICAqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI21hcChNYXBNb2RlLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFwIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwuTWFwTW9kZS5jbGFzcywgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbWFwX0xhcmdlUG9zaXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMzA4NQogICAgICAgICBpbnRbXSBzaXplcyA9IHsKQEAgLTIwMDEsNiArMjczMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMQnl0ZUJ1ZmZlcl9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVCdWZmZXIgPSBudWxsOwogCkBAIC0yMDIyLDYgKzI3NjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTEJ5dGVCdWZmZXJfQ2xvc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKENBUEFDSVRZKTsKIApAQCAtMjA2Miw2ICsyODEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTEJ5dGVCdWZmZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogCkBAIC0yMDg1LDYgKzI4NDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcChDT05URU5UX0FTX0JZVEVTKTsKIApAQCAtMjEwNSw2ICsyODcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMQnl0ZUJ1ZmZlcl9wb3NpdGlvbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBwb3MgPSA1OwogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKENPTlRFTlRfQVNfQllURVMpOwpAQCAtMjEyNyw2ICsyOTAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMQnl0ZUJ1ZmZlckpfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQnVmZmVyID0gbnVsbDsKIApAQCAtMjE3Miw2ICsyOTU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZUxCeXRlQnVmZmVySl9DbG9zZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogCkBAIC0yMTk1LDYgKzI5ODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlciwgbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMQnl0ZUJ1ZmZlckpfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciB3cml0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFkpOwogCkBAIC0yMjM2LDYgKzMwMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlciwgbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVMQnl0ZUJ1ZmZlckpfSWxsZWdhbEFyZ3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgd3JpdGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKENBUEFDSVRZKTsKIApAQCAtMjI3Myw2ICszMDg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTEJ5dGVCdWZmZXJKKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlRGF0YVRvRmlsZShmaWxlT2ZXcml0ZU9ubHlGaWxlQ2hhbm5lbCk7CiAKQEAgLTIyOTksNiArMzExOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJExCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSB3cml0ZUJ1ZmZlcnMgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKICAgICAgICAgTW9ja0ZpbGVDaGFubmVsIG1vY2tGaWxlQ2hhbm5lbCA9IG5ldyBNb2NrRmlsZUNoYW5uZWwoKTsKQEAgLTIzMTEsNiArMzE0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyW10saW50LGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRMQnl0ZUJ1ZmZlcklJX051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHdyaXRlQnVmZmVycyA9IG51bGw7CiAKQEAgLTIzNDgsNiArMzE4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyW10saW50LGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJExCeXRlQnVmZmVySUlfQ2xvc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSB3cml0ZUJ1ZmZlcnMgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKICAgICAgICAgd3JpdGVCdWZmZXJzWzBdID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShDQVBBQ0lUWSk7CkBAIC0yMzkwLDYgKzMyMzcsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcltdLGludCxpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJExCeXRlQnVmZmVySUlfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIHdyaXRlQnVmZmVycyA9IG5ldyBCeXRlQnVmZmVyWzJdOwogICAgICAgICB3cml0ZUJ1ZmZlcnNbMF0gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKENBUEFDSVRZKTsKQEAgLTI0MzIsNiArMzI4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyW10saW50LGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRMQnl0ZUJ1ZmZlcklJX0VtcHR5QnVmZmVycygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyW10gd3JpdGVCdWZmZXJzID0gbmV3IEJ5dGVCdWZmZXJbMl07CiAgICAgICAgIHRyeSB7CkBAIC0yNDUyLDYgKzMzMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcltdLGludCxpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRMQnl0ZUJ1ZmZlcklJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSB3cml0ZUJ1ZmZlcnMgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKICAgICAgICAgd3JpdGVCdWZmZXJzWzBdID0gQnl0ZUJ1ZmZlci53cmFwKENPTlRFTlRfQVNfQllURVMpOwpAQCAtMjQ4MCw2ICszMzU1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyYW5zZmVyRnJvbShSZWFkYWJsZUJ5dGVDaGFubmVsLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRyYW5zZmVyRnJvbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsLmNsYXNzLCBsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zZmVyRnJvbUxSZWFkYWJsZUJ5dGVDaGFubmVsSkpfQ2xvc2VkKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICByZWFkQnl0ZUNoYW5uZWwgPSBEYXRhZ3JhbUNoYW5uZWwub3BlbigpOwpAQCAtMjUxOSw2ICszNDAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyYW5zZmVyRnJvbShSZWFkYWJsZUJ5dGVDaGFubmVsLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJhbnNmZXJGcm9tIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzcywgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJGcm9tTFJlYWRhYmxlQnl0ZUNoYW5uZWxKSl9Tb3VyY2VDbG9zZWQoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJlYWRCeXRlQ2hhbm5lbCA9IERhdGFncmFtQ2hhbm5lbC5vcGVuKCk7CkBAIC0yNTU3LDYgKzM0NTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJhbnNmZXJGcm9tKFJlYWRhYmxlQnl0ZUNoYW5uZWwsbG9uZyxsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJhbnNmZXJGcm9tIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzcywgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJGcm9tTFJlYWRhYmxlQnl0ZUNoYW5uZWxKSl9JbGxlZ2FsQXJndW1lbnQoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJlYWRCeXRlQ2hhbm5lbCA9IERhdGFncmFtQ2hhbm5lbC5vcGVuKCk7CkBAIC0yNTc4LDYgKzM0ODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJhbnNmZXJGcm9tKFJlYWRhYmxlQnl0ZUNoYW5uZWwsbG9uZyxsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlckZyb20iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsLmNsYXNzLCBsb25nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cmFuc2ZlckZyb21MUmVhZGFibGVCeXRlQ2hhbm5lbEpKX05vbldyaXRhYmxlKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICByZWFkQnl0ZUNoYW5uZWwgPSBEYXRhZ3JhbUNoYW5uZWwub3BlbigpOwpAQCAtMjU5Miw2ICszNTAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyYW5zZmVyRnJvbShSZWFkYWJsZUJ5dGVDaGFubmVsLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJhbnNmZXJGcm9tIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzcywgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJGcm9tTFJlYWRhYmxlQnl0ZUNoYW5uZWxKSl9Tb3VyY2VOb25SZWFkYWJsZSgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKQEAgLTI2MDksNiArMzUyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlckZyb20oUmVhZGFibGVCeXRlQ2hhbm5lbCxsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRyYW5zZmVyRnJvbSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3MsIGxvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zZmVyRnJvbUxSZWFkYWJsZUJ5dGVDaGFubmVsSkpfUG9zaXRpb25CZXlvbmRTaXplKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBpbml0IGRhdGEgdG8gZmlsZS4KQEAgLTI2MzEsNiArMzU2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlckZyb20oUmVhZGFibGVCeXRlQ2hhbm5lbCxsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRyYW5zZmVyRnJvbSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3MsIGxvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zZmVyRnJvbUxSZWFkYWJsZUJ5dGVDaGFubmVsSkpfRmlsZUNoYW5uZWwoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGluaXQgZGF0YSB0byBmaWxlLgpAQCAtMjY2OCw2ICszNjA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyYW5zZmVyRnJvbShSZWFkYWJsZUJ5dGVDaGFubmVsLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJhbnNmZXJGcm9tIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzcywgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zZmVyRnJvbUxSZWFkYWJsZUJ5dGVDaGFubmVsSkpfRGF0YWdyYW1DaGFubmVsKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjb25uZWN0cyB0d28gZGF0YWdyYW1DaGFubmVscy4KQEAgLTI3MDksNiArMzY1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlckZyb20oUmVhZGFibGVCeXRlQ2hhbm5lbCxsb25nLGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRyYW5zZmVyRnJvbSIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwuY2xhc3MsIGxvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zZmVyRnJvbUxSZWFkYWJsZUJ5dGVDaGFubmVsSkpfU29ja2V0Q2hhbm5lbCgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY29ubmVjdHMgdHdvIHNvY2tldENoYW5uZWxzLgpAQCAtMjc0OCw2ICszNzA0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyYW5zZmVyRnJvbShSZWFkYWJsZUJ5dGVDaGFubmVsLGxvbmcsbG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJhbnNmZXJGcm9tIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbC5jbGFzcywgbG9uZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJGcm9tTFJlYWRhYmxlQnl0ZUNoYW5uZWxKSl9QaXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGluaXRzIGRhdGEgaW4gZmlsZS4KICAgICAgICAgd3JpdGVEYXRhVG9GaWxlKGZpbGVPZldyaXRlT25seUZpbGVDaGFubmVsKTsKQEAgLTI3ODMsNiArMzc0OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlclRvIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJUb0pKTFdyaXRhYmxlQnl0ZUNoYW5uZWxfTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0YWJsZUJ5dGVDaGFubmVsID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTI4MTksNiArMzc5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRyYW5zZmVyVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cmFuc2ZlclRvSkpMV3JpdGFibGVCeXRlQ2hhbm5lbF9DbG9zZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGFibGVCeXRlQ2hhbm5lbCA9IERhdGFncmFtQ2hhbm5lbC5vcGVuKCk7CiAgICAgICAgIHJlYWRPbmx5RmlsZUNoYW5uZWwuY2xvc2UoKTsKQEAgLTI4NTcsNiArMzg0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlclRvIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJUb0pKTFdyaXRhYmxlQnl0ZUNoYW5uZWxfU291cmNlQ2xvc2VkKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0YWJsZUJ5dGVDaGFubmVsID0gRGF0YWdyYW1DaGFubmVsLm9wZW4oKTsKQEAgLTI4OTUsNiArMzg4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlclRvIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJUb0pKTFdyaXRhYmxlQnl0ZUNoYW5uZWxfSWxsZWdhbEFyZ3VtZW50KCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3cml0YWJsZUJ5dGVDaGFubmVsID0gRGF0YWdyYW1DaGFubmVsLm9wZW4oKTsKQEAgLTI5MTYsNiArMzkxNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlclRvIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJUb0pKTFdyaXRhYmxlQnl0ZUNoYW5uZWxfTm9uUmVhZGFibGUoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRhYmxlQnl0ZUNoYW5uZWwgPSBEYXRhZ3JhbUNoYW5uZWwub3BlbigpOwpAQCAtMjkzMCw2ICszOTQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyYW5zZmVyVG8obG9uZyxsb25nLFdyaXRhYmxlQnl0ZUNoYW5uZWwpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRyYW5zZmVyVG8iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cmFuc2ZlclRvSkpMV3JpdGFibGVCeXRlQ2hhbm5lbF9UYXJnZXROb25Xcml0YWJsZSgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKQEAgLTI5NjgsNiArMzk4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlclRvIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJUb0pKTFdyaXRhYmxlQnl0ZUNoYW5uZWxfUG9zaXRpb25CZXlvbmRTaXplKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBpbml0IGRhdGEgdG8gZmlsZS4KQEAgLTI5OTAsNiArNDAxOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlclRvIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJUb0pKTFdyaXRhYmxlQnl0ZUNoYW5uZWxfRmlsZUNoYW5uZWwoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGluaXQgZGF0YSB0byBmaWxlLgpAQCAtMzAyOCw2ICs0MDY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsI3RyYW5zZmVyVG8obG9uZyxsb25nLFdyaXRhYmxlQnl0ZUNoYW5uZWwpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInRyYW5zZmVyVG8iLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzLCBsb25nLmNsYXNzLCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLmNsYXNzfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90cmFuc2ZlclRvSkpMV3JpdGFibGVCeXRlQ2hhbm5lbF9Tb2NrZXRDaGFubmVsKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBpbml0cyBkYXRhIGludG8gZmlsZS4KQEAgLTMwODYsNiArNDEzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCN0cmFuc2ZlclRvKGxvbmcsbG9uZyxXcml0YWJsZUJ5dGVDaGFubmVsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2ZlclRvIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzcywgbG9uZy5jbGFzcywgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbC5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdHJhbnNmZXJUb0pKTFdyaXRhYmxlQnl0ZUNoYW5uZWxfRGF0YWdyYW1DaGFubmVsKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBpbml0cyBkYXRhIHRvIGZpbGUuCkBAIC0zMTM1LDYgKzQxOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwjdHJhbnNmZXJUbyhsb25nLGxvbmcsV3JpdGFibGVCeXRlQ2hhbm5lbCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidHJhbnNmZXJUbyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwuY2xhc3N9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zZmVyVG9KSkxXcml0YWJsZUJ5dGVDaGFubmVsX1BpcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gaW5pdHMgZGF0YSBpbiBmaWxlLgogICAgICAgICB3cml0ZURhdGFUb0ZpbGUoZmlsZU9mUmVhZE9ubHlGaWxlQ2hhbm5lbCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9GaWxlTG9ja0ludGVycnVwdGlvbkV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBhNmQ2MGQ1Li5iYzUzN2NmIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUxvY2tJbnRlcnJ1cHRpb25FeGNlcHRpb25UZXN0LmphdmEKQEAgLTE1LDYgKzE1LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVsczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMjQsMTEgKzI5LDIxIEBACiAvKioKICAqIFRlc3RzIGZvciBGaWxlTG9ja0ludGVycnVwdGlvbkV4Y2VwdGlvbgogICovCitAVGVzdFRhcmdldENsYXNzKEZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIEZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IEZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uKCkpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsCmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVMb2NrVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9GaWxlTG9ja1Rlc3QuamF2YQppbmRleCBkMTNjNTIxLi41YmVlNzM0IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVMb2NrVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUxvY2tUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVsczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI1LDcgKzMwLDcgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhGaWxlTG9jay5jbGFzcykKIC8qKgogICogVGVzdHMgY2xhc3MgRmlsZUxvY2suCiAgKi8KQEAgLTY2LDYgKzcxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrI0ZpbGVMb2NrKEZpbGVDaGFubmVsLCBsb25nLCBsb25nLAogICAgICAqICAgICAgICBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWxlTG9jayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5jbGFzcywgbG9uZy5jbGFzcywgbG9uZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3Rvcl9MamF2YV9uaW9fY2hhbm5lbHNfRmlsZUNoYW5uZWxKSlooKSB7CiAgICAgICAgIEZpbGVMb2NrIGZpbGVMb2NrMSA9IG5ldyBNb2NrRmlsZUxvY2sobnVsbCwgMCwgMCwgZmFsc2UpOwogICAgICAgICBhc3NlcnROdWxsKGZpbGVMb2NrMS5jaGFubmVsKCkpOwpAQCAtOTQsNiArMTA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrI2NoYW5uZWwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGFubmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGFubmVsKCkgewogICAgICAgICBhc3NlcnRTYW1lKHJlYWRXcml0ZUNoYW5uZWwsIG1vY2tMb2NrLmNoYW5uZWwoKSk7CiAgICAgICAgIEZpbGVMb2NrIGxvY2sgPSBuZXcgTW9ja0ZpbGVMb2NrKG51bGwsIDAsIDEwLCB0cnVlKTsKQEAgLTEwMyw2ICsxMjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2sjcG9zaXRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwb3NpdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcG9zaXRpb24oKSB7CiAgICAgICAgIEZpbGVMb2NrIGZpbGVMb2NrMSA9IG5ldyBNb2NrRmlsZUxvY2socmVhZFdyaXRlQ2hhbm5lbCwgMjAsIDEwMCwgdHJ1ZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyMCwgZmlsZUxvY2sxLnBvc2l0aW9uKCkpOwpAQCAtMTE2LDYgKzE0OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jayNzaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2l6ZSgpIHsKICAgICAgICAgRmlsZUxvY2sgZmlsZUxvY2sxID0gbmV3IE1vY2tGaWxlTG9jayhyZWFkV3JpdGVDaGFubmVsLCAyMCwgMTAwLCB0cnVlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgZmlsZUxvY2sxLnNpemUoKSk7CkBAIC0xMzAsNiArMTcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrI2lzU2hhcmVkKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiW2NoZWNrIHdpdGggZmFsc2Ugc2hhcmVkIHBhcmFtZXRlcl0iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1NoYXJlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTaGFyZWQoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKG1vY2tMb2NrLmlzU2hhcmVkKCkpOwogICAgICAgICBGaWxlTG9jayBsb2NrID0gbmV3IE1vY2tGaWxlTG9jayhudWxsLCAwLCAxMCwgdHJ1ZSk7CkBAIC0xMzksNiArMTg5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrI292ZXJsYXBzKGxvbmcsIGxvbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm92ZXJsYXBzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3ZlcmxhcHNfSkooKSB7CiAgICAgICAgIGFzc2VydFRydWUobW9ja0xvY2sub3ZlcmxhcHMoMCwgMTEpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobW9ja0xvY2sub3ZlcmxhcHMoMCwgMTApKTsKQEAgLTE1Myw2ICsyMTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2sjaXNWYWxpZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVmFsaWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmFsaWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlTG9jayBmaWxlTG9jayA9IHJlYWRXcml0ZUNoYW5uZWwubG9jaygpOwogICAgICAgICBhc3NlcnRUcnVlKGZpbGVMb2NrLmlzVmFsaWQoKSk7CkBAIC0xNjMsNiArMjMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrI3JlbGVhc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWxlYXNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWxlYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCAidG1wIik7CiAgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0lsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb25UZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL0lsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMWUyNmViMC4uYWY5ZGI2NyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9JbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbgogICovCitAVGVzdFRhcmdldENsYXNzKElsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uKCkpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9JbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggM2Q4MDM3NS4uMDcwYWViNiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9JbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9JbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE1LDYgKzE1LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVsczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLklsbGVnYWxTZWxlY3RvckV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9uCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIElsbGVnYWxTZWxlY3RvckV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbGxlZ2FsU2VsZWN0b3JFeGNlcHRpb24oKSk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IElsbGVnYWxTZWxlY3RvckV4Y2VwdGlvbigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTWFwTW9kZVRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTWFwTW9kZVRlc3QuamF2YQppbmRleCAzMzIzNGViLi43YTY2OTlmIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL01hcE1vZGVUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9NYXBNb2RlVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTIzLDExICsyOCwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgRmlsZUNoYW5uZWwuTWFwTW9kZQogICovCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLk1hcE1vZGUuY2xhc3MpCiBwdWJsaWMgY2xhc3MgTWFwTW9kZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlI1BSSVZBVEUsUkVBRE9OTFksUkVBRFdSSVRFCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmaWVsZHMuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIUNvbnN0YW50cyIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1BSSVZBVEVfUkVBRE9OTFlfUkVBRFdSSVRFKCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKEZpbGVDaGFubmVsLk1hcE1vZGUuUFJJVkFURSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFkpOwpAQCAtNDQsNiArNTksMTUgQEAKICAgICAvKioKICAgICAgKiBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKEZpbGVDaGFubmVsLk1hcE1vZGUuUFJJVkFURS50b1N0cmluZygpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChGaWxlQ2hhbm5lbC5NYXBNb2RlLlJFQURfT05MWS50b1N0cmluZygpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTm9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTm9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCA2ZmNjNzFmLi5kNzhjNDY2IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Ob0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Ob0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMjQsMTEgKzI5LDIxIEBACiAvKioKICAqIFRlc3RzIGZvciBOb0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTm9Db25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBOb0Nvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IE5vQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb24oKSk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdApkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Ob25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb25UZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBlMjg3ZTJmLi5hYzZmODIwIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMjQsMTEgKzI5LDIxIEBACiAvKioKICAqIFRlc3RzIGZvciBOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhOb25SZWFkYWJsZUNoYW5uZWxFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IE5vblJlYWRhYmxlQ2hhbm5lbEV4Y2VwdGlvbigpKTsKQEAgLTM3LDYgKzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Ob25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb25UZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBjMTQ1MzU0Li45Zjc2N2I5IDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMjQsMTEgKzI5LDIxIEBACiAvKioKICAqIFRlc3RzIGZvciBOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhOb25Xcml0YWJsZUNoYW5uZWxFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IE5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbigpKTsKQEAgLTM3LDYgKzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgTm9uV3JpdGFibGVDaGFubmVsRXhjZXB0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Ob3RZZXRCb3VuZEV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTm90WWV0Qm91bmRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMzVmZDdkZi4uOTVmMjA5YiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Ob3RZZXRCb3VuZEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vdFlldEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Ob3RZZXRCb3VuZEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgTm90WWV0Qm91bmRFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhOb3RZZXRCb3VuZEV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBOb3RZZXRCb3VuZEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBOb3RZZXRCb3VuZEV4Y2VwdGlvbigpKTsKQEAgLTM3LDYgKzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgTm90WWV0Qm91bmRFeGNlcHRpb24oKSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL05vdFlldENvbm5lY3RlZEV4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDZjZmIwYWYuLmJlMjdjYzcgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Ob3RZZXRDb25uZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CkBAIC0yNCwxMSArMjksMjEgQEAKIC8qKgogICogVGVzdHMgZm9yIE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbgogICovCitAVGVzdFRhcmdldENsYXNzKE5vdFlldENvbm5lY3RlZEV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgTm90WWV0Q29ubmVjdGVkRXhjZXB0aW9uKCkpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBOb3RZZXRDb25uZWN0ZWRFeGNlcHRpb24oKSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL092ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb25UZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL092ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggOWQzYTc4Ni4uNTQxMmI0MyAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9PdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbgogICovCitAVGVzdFRhcmdldENsYXNzKE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uKCkpOwpAQCAtMzcsNiArNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvUGlwZVRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvUGlwZVRlc3QuamF2YQppbmRleCBjMWIyMTExLi5mYjAyNzUwIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1BpcGVUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9QaXBlVGVzdC5qYXZhCkBAIC0xNiwxMyArMTYsMTggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5QaXBlOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU2lua0NoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5Tb3VyY2VDaGFubmVsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKFBpcGUuY2xhc3MpCiAvKgogICogVGVzdHMgZm9yIFBpcGUgYW5kIGl0cyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgKi8KQEAgLTMxLDYgKzM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUjb3BlbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9wZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CiAgICAgICAgIFBpcGUgcGlwZSA9IFBpcGUub3BlbigpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHBpcGUpOwpAQCAtMzksNiArNTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZSNzaW5rKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2luayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2luaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFBpcGUgcGlwZSA9IFBpcGUub3BlbigpOwogICAgICAgICBTaW5rQ2hhbm5lbCBzaW5rID0gcGlwZS5zaW5rKCk7CkBAIC00OCw2ICs3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlI3NvdXJjZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvdXJjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUGlwZSBwaXBlID0gUGlwZS5vcGVuKCk7CiAgICAgICAgIFNvdXJjZUNoYW5uZWwgc291cmNlID0gcGlwZS5zb3VyY2UoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0YWJsZUNoYW5uZWxUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGFibGVDaGFubmVsVGVzdC5qYXZhCmluZGV4IDI1YjVmMDAuLjIzNDc4ZmYgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0YWJsZUNoYW5uZWxUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9TZWxlY3RhYmxlQ2hhbm5lbFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOwpAQCAtMjcsMTEgKzMyLDIxIEBACiAvKgogICogVGVzdHMgZm9yIFNlbGVjdGFibGVDaGFubmVsCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VsZWN0YWJsZUNoYW5uZWwuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2VsZWN0YWJsZUNoYW5uZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNlbGVjdGFibGVDaGFubmVsI3JlZ2lzdGVyKFNlbGVjdG9yLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiQWJzdHJhY3QgbWV0aG9kLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rvci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVnaXN0ZXJfTFNlbGVjdG9ySSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tTZWxlY3RhYmxlQ2hhbm5lbCBtc2MgPSBuZXcgTW9ja1NlbGVjdGFibGVDaGFubmVsKCk7CiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGNhbGxpbmcgcmVnaXN0ZXIoU2VsZWN0b3IsIGludCkgbGVhZHMgdG8gdGhlIG1ldGhvZApkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9TZWxlY3Rpb25LZXlUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleVRlc3QuamF2YQppbmRleCBlZDMzNzUyLi42OGI2NTMyIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleVRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CkBAIC0zMSw2ICszNiw3IEBACiAvKgogICogVGVzdHMgZm9yIFNlbGVjdGlvbktleSBhbmQgaXRzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhTZWxlY3Rpb25LZXkuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uS2V5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIFNlbGVjdG9yIHNlbGVjdG9yOwpAQCAtOTYsNiArMTAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSNhdHRhY2goT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdHRhY2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2F0dGFjaCgpIHsKICAgICAgICAgTW9ja1NlbGVjdGlvbktleSBtb2NrU2VsZWN0aW9uS2V5ID0gbmV3IE1vY2tTZWxlY3Rpb25LZXkoU2VsZWN0aW9uS2V5Lk9QX0FDQ0VQVCk7CiAgICAgICAgIC8vIG5vIHByZXZpb3VzLCByZXR1cm4gbnVsbApAQCAtMTE0LDYgKzEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkjYXR0YWNobWVudCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImF0dGFjaG1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2F0dGFjaG1lbnQoKSB7CiAgICAgICAgIE1vY2tTZWxlY3Rpb25LZXkgbW9ja1NlbGVjdGlvbktleSA9IG5ldyBNb2NrU2VsZWN0aW9uS2V5KFNlbGVjdGlvbktleS5PUF9BQ0NFUFQpOwogICAgICAgICBhc3NlcnROdWxsKG1vY2tTZWxlY3Rpb25LZXkuYXR0YWNobWVudCgpKTsKQEAgLTEyNSw2ICsxNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5I2NoYW5uZWwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGFubmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGFubmVsKCkgewogICAgICAgICBhc3NlcnRTYW1lKHNjLCBzZWxlY3Rpb25LZXkuY2hhbm5lbCgpKTsKICAgICAgICAgLy8gY2FuIGJlIGludm9rZWQgZXZlbiBjYW5jZWxlZApAQCAtMTM1LDYgKzE2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkjaW50ZXJlc3RPcHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbnRlcmVzdE9wcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW50ZXJlc3RPcHMoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhTZWxlY3Rpb25LZXkuT1BfQ09OTkVDVCwgc2VsZWN0aW9uS2V5LmludGVyZXN0T3BzKCkpOwogICAgIH0KQEAgLTE0Miw2ICsxODQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5I2ludGVyZXN0T3BzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDYW5jZWxsZWRLZXlFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW50ZXJlc3RPcHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ludGVyZXN0T3BzSSgpIHsKICAgICAgICAgc2VsZWN0aW9uS2V5LmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhTZWxlY3Rpb25LZXkuT1BfV1JJVEUsIHNlbGVjdGlvbktleS5pbnRlcmVzdE9wcygpKTsKQEAgLTE3MSw2ICsyMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5I2lzVmFsaWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVmFsaWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmFsaWQoKSB7CiAgICAgICAgIGFzc2VydFRydWUoc2VsZWN0aW9uS2V5LmlzVmFsaWQoKSk7CiAgICAgfQpAQCAtMTc4LDYgKzIzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkjaXNWYWxpZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzVmFsaWQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc1ZhbGlkX0tleUNhbmNlbGxlZCgpIHsKICAgICAgICAgc2VsZWN0aW9uS2V5LmNhbmNlbCgpOwogICAgICAgICBhc3NlcnRGYWxzZShzZWxlY3Rpb25LZXkuaXNWYWxpZCgpKTsKQEAgLTE4Niw2ICsyNTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5I2lzVmFsaWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1ZhbGlkIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWYWxpZF9DaGFubmVsQ29sc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc2MuY2xvc2UoKTsKICAgICAgICAgYXNzZXJ0RmFsc2Uoc2VsZWN0aW9uS2V5LmlzVmFsaWQoKSk7CkBAIC0xOTQsNiArMjcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSNpc1ZhbGlkKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNWYWxpZCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmFsaWRfU2VsZWN0b3JDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOwogICAgICAgICBhc3NlcnRGYWxzZShzZWxlY3Rpb25LZXkuaXNWYWxpZCgpKTsKQEAgLTIwMiw2ICsyODksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5I2lzQWNjZXB0YWJsZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQWNjZXB0YWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNBY2NlcHRhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja1NlbGVjdGlvbktleSBtb2NrU2VsZWN0aW9uS2V5MSA9IG5ldyBNb2NrU2VsZWN0aW9uS2V5KFNlbGVjdGlvbktleS5PUF9BQ0NFUFQpOwogICAgICAgICBhc3NlcnRUcnVlKG1vY2tTZWxlY3Rpb25LZXkxLmlzQWNjZXB0YWJsZSgpKTsKQEAgLTIxMiw2ICszMDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5I2lzQ29ubmVjdGFibGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0Nvbm5lY3RhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0Nvbm5lY3RhYmxlKCkgewogICAgICAgICBNb2NrU2VsZWN0aW9uS2V5IG1vY2tTZWxlY3Rpb25LZXkxID0gbmV3IE1vY2tTZWxlY3Rpb25LZXkoU2VsZWN0aW9uS2V5Lk9QX0NPTk5FQ1QpOwogICAgICAgICBhc3NlcnRUcnVlKG1vY2tTZWxlY3Rpb25LZXkxLmlzQ29ubmVjdGFibGUoKSk7CkBAIC0yMjIsNiArMzI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSNpc1JlYWRhYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNSZWFkYWJsZSgpIHsKICAgICAgICAgTW9ja1NlbGVjdGlvbktleSBtb2NrU2VsZWN0aW9uS2V5MSA9IG5ldyBNb2NrU2VsZWN0aW9uS2V5KFNlbGVjdGlvbktleS5PUF9SRUFEKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtb2NrU2VsZWN0aW9uS2V5MS5pc1JlYWRhYmxlKCkpOwpAQCAtMjMyLDYgKzM0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkjaXNXcml0YWJsZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzV3JpdGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzV3JpdGFibGUoKSB7CiAgICAgICAgIE1vY2tTZWxlY3Rpb25LZXkgbW9ja1NlbGVjdGlvbktleTEgPSBuZXcgTW9ja1NlbGVjdGlvbktleShTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOwogICAgICAgICBhc3NlcnRUcnVlKG1vY2tTZWxlY3Rpb25LZXkxLmlzV3JpdGFibGUoKSk7CkBAIC0yNDIsNiArMzY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSNjYW5jZWwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5jZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NhbmNlbCgpIHsKICAgICAgICAgc2VsZWN0aW9uS2V5LmNhbmNlbCgpOwogICAgICAgICB0cnkgewpAQCAtMjk0LDYgKzQyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkjcmVhZHlPcHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENhbmNlbGxlZEtleUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkeU9wcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZHlPcHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgcG9ydCA9IFN1cHBvcnRfUG9ydE1hbmFnZXIuZ2V0TmV4dFBvcnQoKTsKICAgICAgICAgU2VydmVyU29ja2V0IHNzID0gbmV3IFNlcnZlclNvY2tldChwb3J0KTsKQEAgLTMxMyw2ICs0NTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5I3NlbGVjdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VsZWN0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdG9yKCkgewogICAgICAgICBhc3NlcnRTYW1lKHNlbGVjdG9yLCBzZWxlY3Rpb25LZXkuc2VsZWN0b3IoKSk7CiAgICAgICAgIHNlbGVjdGlvbktleS5jYW5jZWwoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0b3JUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NlbGVjdG9yVGVzdC5qYXZhCmluZGV4IDlmNzMxNzIuLmZlYjFjOTIgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0b3JUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9TZWxlY3RvclRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CkBAIC0zNSw2ICs0MCw3IEBACiAvKgogICogVGVzdHMgZm9yIFNlbGVjdG9yIGFuZCBpdHMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICovCitAVGVzdFRhcmdldENsYXNzKFNlbGVjdG9yLmNsYXNzKQogcHVibGljIGNsYXNzIFNlbGVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUUgPSAxMDA7CkBAIC03OSw2ICs4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciNvcGVuKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3BlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdE51bGwoc2VsZWN0b3IpOwogICAgIH0KQEAgLTg2LDYgKzEwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTZWxlY3RvciNpc09wZW4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc09wZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoc2VsZWN0b3IuaXNPcGVuKCkpOwogICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOwpAQCAtOTUsNiArMTE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yI3Byb3ZpZGVyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Byb3ZpZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gc2hvdWxkIGJlIHN5c3RlbSBkZWZhdWx0IHByb3ZpZGVyCiAgICAgICAgIGFzc2VydE5vdE51bGwoc2VsZWN0b3IucHJvdmlkZXIoKSk7CkBAIC0xMDQsNiArMTM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yI2tleXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9rZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IHNzYy5yZWdpc3RlcihzZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX0FDQ0VQVCk7CiAgICAgICAgIApAQCAtMTUwLDYgKzE5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciNrZXlzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VsZWN0ZWRLZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZWxlY3RlZEtleXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTb2NrZXRDaGFubmVsIHNjID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CiAgICAgICAgIHNzYy5yZWdpc3RlcihzZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX0FDQ0VQVCk7CkBAIC0xOTUsNiArMjQ2LDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWwuU2VsZWN0b3Ijc2VsZWN0Tm93KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZWxlY3ROb3coKSBtZXRob2QgZm9yIFNlbGVjdG9yIHJlZ2lzdGVyZWQgd2l0aCAiICsKKyAgICAgICAgICAgIlNlbGVjdGlvbktleXMuT1BfQUNDRVBULCAgU2VsZWN0aW9uS2V5cy5PUF9DT05ORUNULCAiICsKKyAgICAgICAgICAgIlNlbGVjdGlvbktleXMuT1BfUkVBRCwgU2VsZWN0aW9uS2V5cy5PUF9XUklURSBrZXlzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdE5vdyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0Tm93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0X3NlbGVjdF9PUF9BQ0NFUFQoU2VsZWN0VHlwZS5OT1csIDApOwogICAgICAgICBhc3NlcnRfc2VsZWN0X09QX0NPTk5FQ1QoU2VsZWN0VHlwZS5OT1csIDApOwpAQCAtMjA1LDYgKzI2NywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVsLlNlbGVjdG9yI3NlbGVjdE5vdygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbiBpcyB0aHJvd24gIiArCisgICAgICAgICAgICAiaWYgc2VsZWN0Tm93KCkgbWV0aG9kIGlzIGNhbGxlZCBmb3IgY2xvc2VkIFNlbGVjdG9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdE5vdyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0Tm93X1NlbGVjdG9yQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0X3NlbGVjdF9TZWxlY3RvckNsb3NlZChTZWxlY3RUeXBlLk5PVywgMCk7CiAgICAgfQpAQCAtMjEyLDYgKzI4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yI3NlbGVjdE5vdygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBzZWxlY3ROb3coKSBtZXRob2QgZG9lc24ndCBibG9jay4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZWxlY3ROb3ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdE5vd19UaW1lb3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gbWFrZSBzdXJlIHNlbGVjdE5vdyBkb2Vzbid0IGJsb2NrCiAgICAgICAgIHNlbGVjdG9yLnNlbGVjdE5vdygpOwpAQCAtMjIwLDYgKzMwMSwxNyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVsLlNlbGVjdG9yI3NlbGVjdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VsZWN0KCkgbWV0aG9kIGZvciBTZWxlY3RvciByZWdpc3RlcmVkIHdpdGggIiArCisgICAgICAgICAgICAiU2VsZWN0aW9uS2V5cy5PUF9BQ0NFUFQsICBTZWxlY3Rpb25LZXlzLk9QX0NPTk5FQ1QsICIgKworICAgICAgICAgICAgIlNlbGVjdGlvbktleXMuT1BfUkVBRCwgU2VsZWN0aW9uS2V5cy5PUF9XUklURSBrZXlzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0X3NlbGVjdF9PUF9BQ0NFUFQoU2VsZWN0VHlwZS5OVUxMLCAwKTsKICAgICAgICAgYXNzZXJ0X3NlbGVjdF9PUF9DT05ORUNUKFNlbGVjdFR5cGUuTlVMTCwgMCk7CkBAIC0yMzAsNiArMzIyLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWwuU2VsZWN0b3Ijc2VsZWN0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IENsb3NlZFNlbGVjdG9yRXhjZXB0aW9uIGlzIHRocm93biAiICsKKyAgICAgICAgICAgICJpZiBzZWxlY3QoKSBtZXRob2QgaXMgY2FsbGVkIGZvciBjbG9zZWQgU2VsZWN0b3IuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VsZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZWxlY3RfU2VsZWN0b3JDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3NlcnRfc2VsZWN0X1NlbGVjdG9yQ2xvc2VkKFNlbGVjdFR5cGUuTlVMTCwgMCk7CiAgICAgfQpAQCAtMjM3LDYgKzMzOSwxOCBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVsLlNlbGVjdG9yI3NlbGVjdChsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlbGVjdChsb25nKSBtZXRob2QgZm9yIFNlbGVjdG9yIHJlZ2lzdGVyZWQgd2l0aCAiICsKKyAgICAgICAgICAgIlNlbGVjdGlvbktleXMuT1BfQUNDRVBULCAgU2VsZWN0aW9uS2V5cy5PUF9DT05ORUNULCAiICsKKyAgICAgICAgICAgIlNlbGVjdGlvbktleXMuT1BfUkVBRCwgU2VsZWN0aW9uS2V5cy5PUF9XUklURSBrZXlzIGFuZCBkaWZmZXJlbnQgIiArCisgICAgICAgICAgICJ0aW1lb3V0J3MgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEooKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3NlcnRfc2VsZWN0X09QX0FDQ0VQVChTZWxlY3RUeXBlLlRJTUVPVVQsIDApOwogICAgICAgICBhc3NlcnRfc2VsZWN0X09QX0NPTk5FQ1QoU2VsZWN0VHlwZS5USU1FT1VULCAwKTsKQEAgLTI1Miw2ICszNjYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbC5TZWxlY3RvciNzZWxlY3QobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IENsb3NlZFNlbGVjdG9yRXhjZXB0aW9uIGlzIHRocm93biAiICsKKyAgICAgICAgICAgICJpZiBzZWxlY3QobG9uZykgbWV0aG9kIGlzIGNhbGxlZCBmb3IgY2xvc2VkIFNlbGVjdG9yLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNlbGVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEpfU2VsZWN0b3JDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3NlcnRfc2VsZWN0X1NlbGVjdG9yQ2xvc2VkKFNlbGVjdFR5cGUuVElNRU9VVCwgMCk7CiAgICAgICAgIHNlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOwpAQCAtMjYxLDYgKzM4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVsLlNlbGVjdG9yI3NlbGVjdChsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZWxlY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZWxlY3RKX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzZWxlY3Rvci5zZWxlY3QoLTEpOwpAQCAtMjcyLDYgKzQwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yI3NlbGVjdChsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgc2VsZWN0KHRpbWVvdXQpIGRvZXNuJ3QgYmxvY2suIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2VsZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0Sl9UaW1lb3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gbWFrZSBzdXJlIHNlbGVjdCh0aW1lb3V0KSBkb2Vzbid0IGJsb2NrCiAgICAgICAgIHNlbGVjdG9yLnNlbGVjdChXQUlUX1RJTUUpOwpAQCAtMjgwLDYgKzQyMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciN3YWtldXAoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3YWtldXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dha2V1cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIG1ha2Ugc3VyZSB0aGUgdGVzdCBkb2VzIG5vdCBibG9jayBvbiBzZWxlY3QKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU2VydmVyU29ja2V0Q2hhbm5lbFRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU2VydmVyU29ja2V0Q2hhbm5lbFRlc3QuamF2YQppbmRleCAxYzQ1ZTZjLi45YzhhYjkxIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NlcnZlclNvY2tldENoYW5uZWxUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9TZXJ2ZXJTb2NrZXRDaGFubmVsVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CkBAIC0zOSw2ICs0NCw3IEBACiAvKgogICogdGVzdCBmb3IgU2VydmVyU29ja2V0Q2hhbm5lbAogICovCitAVGVzdFRhcmdldENsYXNzKFNlcnZlclNvY2tldENoYW5uZWwuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2VydmVyU29ja2V0Q2hhbm5lbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUNJVFlfTk9STUFMID0gMjAwOwpAQCAtODgsNiArOTQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIGZvciAnamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbC52YWxpZE9wcygpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWxpZE9wcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZE9wcygpIHsKICAgICAgICAgTW9ja1NlcnZlclNvY2tldENoYW5uZWwgdGVzdE1TQ2hubG51bGwgPSBuZXcgTW9ja1NlcnZlclNvY2tldENoYW5uZWwoCiAgICAgICAgICAgICAgICAgbnVsbCk7CkBAIC0xMDIsNiArMTE3LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2phdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWwub3BlbigpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2FsbCBvcGVuKCkgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9wZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbigpIHsKICAgICAgICAgTW9ja1NlcnZlclNvY2tldENoYW5uZWwgdGVzdE1TQ2hubCA9IG5ldyBNb2NrU2VydmVyU29ja2V0Q2hhbm5lbChudWxsKTsKICAgICAgICAgTW9ja1NlcnZlclNvY2tldENoYW5uZWwgdGVzdE1TQ2hubG5vdG51bGwgPSBuZXcgTW9ja1NlcnZlclNvY2tldENoYW5uZWwoCkBAIC0xMjEsNiArMTQ1LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2NvbS5pYm0uaW8ubmlvLlNlcnZlclNvY2tldENoYW5uZWxJbXBsLnNvY2tldCgpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNvY2tldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTb2NrZXRfQmxvY2tfQmVmb3JlQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLnNlcnZlckNoYW5uZWwuaXNPcGVuKCkpOwogICAgICAgICBhc3NlcnRUcnVlKHRoaXMuc2VydmVyQ2hhbm5lbC5pc0Jsb2NraW5nKCkpOwpAQCAtMTM2LDcgKzE2OSwxNSBAQAogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLnNlcnZlckNoYW5uZWwuaXNPcGVuKCkpOwogCiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9Ob25CbG9ja19CZWZvcmVDbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKHRoaXMuc2VydmVyQ2hhbm5lbC5pc09wZW4oKSk7CiAgICAgICAgIHRoaXMuc2VydmVyQ2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC0xNTIsNyArMTkzLDE1IEBACiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuc2VydmVyQ2hhbm5lbC5pc09wZW4oKSk7CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0X0Jsb2NrX0Nsb3NlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0aGlzLnNlcnZlckNoYW5uZWwuY2xvc2UoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5zZXJ2ZXJDaGFubmVsLmlzT3BlbigpKTsKQEAgLTE2NCw3ICsyMTMsMTUgQEAKICAgICAgICAgLy8gc2FtZQogICAgICAgICBhc3NlcnRTYW1lKHMxLCBzMik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9Ob25CbG9ja19DbG9zZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5zZXJ2ZXJDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgdGhpcy5zZXJ2ZXJDaGFubmVsLmNsb3NlKCk7CkBAIC0xODUsNyArMjQyLDI3IEBACiAgICAgICAgIGFzc2VydE51bGwocy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBzLmdldFNvVGltZW91dCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBkZWZhdWx0IHN0YXR1cyBvZiBTZXJ2ZXJTb2NrZXRDaGFubmVsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbGlkT3BzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWdpc3RlcmVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0Jsb2NraW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENoYW5uZWxCYXNpY1N0YXR1cygpIHsKICAgICAgICAgU2VydmVyU29ja2V0IGdvdFNvY2tldCA9IHRoaXMuc2VydmVyQ2hhbm5lbC5zb2NrZXQoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZ290U29ja2V0LmlzQ2xvc2VkKCkpOwpAQCAtMjAyLDcgKzI3OSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdjb20uaWJtLmlvLm5pby5TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbC5hY2NlcHQoKScKICAgICAgKi8KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE5vdFlldEJvdW5kRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFjY2VwdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRfQmxvY2tfTm90WWV0Qm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKHRoaXMuc2VydmVyQ2hhbm5lbC5pc09wZW4oKSk7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5zZXJ2ZXJDaGFubmVsLmlzQmxvY2tpbmcoKSk7CkBAIC0yMTMsNyArMjk4LDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb3RZZXRCb3VuZEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY2NlcHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0X05vbkJsb2NrX05vdFlldEJvdW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLnNlcnZlckNoYW5uZWwuaXNPcGVuKCkpOwogICAgICAgICB0aGlzLnNlcnZlckNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtMjI0LDcgKzMxNywxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY2NlcHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0X0Nsb3NlZENoYW5uZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5zZXJ2ZXJDaGFubmVsLmNsb3NlKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuc2VydmVyQ2hhbm5lbC5pc09wZW4oKSk7CkBAIC0yMzUsNyArMzM2LDE1IEBACiAgICAgICAgICAgICAvLyBPSy4KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFjY2VwdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRfQmxvY2tfTm9Db25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLnNlcnZlckNoYW5uZWwuaXNCbG9ja2luZygpKTsKICAgICAgICAgU2VydmVyU29ja2V0IGdvdFNvY2tldCA9IHRoaXMuc2VydmVyQ2hhbm5lbC5zb2NrZXQoKTsKQEAgLTI2MCw3ICszNjksMTYgQEAKICAgICAgICAgICAgIC8vIE9LLgogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBhY2NlcHQoKSByZXR1cm5zIG51bGwgaWYgdGhlIGNoYW5uZWwgaXMgaW4gIiArCisgICAgICAgICAgICAibm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vIGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlIHRvIGJlIGFjY2VwdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFjY2VwdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRfTm9uQmxvY2tfTm9Db25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU2VydmVyU29ja2V0IGdvdFNvY2tldCA9IHRoaXMuc2VydmVyQ2hhbm5lbC5zb2NrZXQoKTsKICAgICAgICAgZ290U29ja2V0LmJpbmQobG9jYWxBZGRyMSk7IApAQCAtMjcyLDYgKzM5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTZXJ2ZXJTb2NrZXRDaGFubmVsI2FjY2VwdCgpLnNvY2tldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWNjZXB0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkX0Jsb2NraW5nX1JlYWxEYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc2VydmVyQ2hhbm5lbC5zb2NrZXQoKS5iaW5kKGxvY2FsQWRkcjEpOwogICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFlfTk9STUFMKTsKQEAgLTMxMCw2ICs0MzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgU2VydmVyU29ja2V0Q2hhbm5lbCNhY2NlcHQoKS5zb2NrZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY2NlcHQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkX05vbkJsb2NraW5nX1JlYWxEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHNlcnZlckNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwogICAgICAgICBzZXJ2ZXJDaGFubmVsLnNvY2tldCgpLmJpbmQobG9jYWxBZGRyMSk7CkBAIC0zMjksNiArNDY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNlcnZlclNvY2tldENoYW5uZWwjYWNjZXB0KCkuc29ja2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY2NlcHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlX0Jsb2NraW5nX1JlYWxEYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2ZXJDaGFubmVsLmlzQmxvY2tpbmcoKSk7CiAgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBzZXJ2ZXJDaGFubmVsLnNvY2tldCgpOwpAQCAtMzUxLDYgKzQ5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTZXJ2ZXJTb2NrZXRDaGFubmVsI2FjY2VwdCgpLnNvY2tldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWNjZXB0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZV9Ob25CbG9ja2luZ19SZWFsRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzZXJ2ZXJDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKICAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IHNlcnZlckNoYW5uZWwuc29ja2V0KCk7CkBAIC0zNzEsNiArNTI1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNlcnZlclNvY2tldENoYW5uZWwjYWNjZXB0KCkuc29ja2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWNjZXB0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF9MQnl0ZUJ1ZmZlcl9CbG9ja2luZ19SZWFkV3JpdGVSZWFsTGFyZ2VEYXRhKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHNlcnZlckNoYW5uZWwuc29ja2V0KCkuYmluZChsb2NhbEFkZHIxKTsKQEAgLTM5MCw2ICs1NTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgU2VydmVyU29ja2V0Q2hhbm5lbCNhY2NlcHQoKS5zb2NrZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhY2NlcHQiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkX0xCeXRlQnVmZmVyX05vbkJsb2NraW5nX1JlYWRXcml0ZVJlYWxMYXJnZURhdGEoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHNlcnZlckNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtNDEwLDYgKzU4MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTZXJ2ZXJTb2NrZXRDaGFubmVsI2FjY2VwdCgpLnNvY2tldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWNjZXB0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZV9MQnl0ZUJ1ZmZlcl9Ob25CbG9ja2luZ19SZWFkV3JpdGVSZWFsTGFyZ2VEYXRhKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzZXJ2ZXJDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKQEAgLTQyOSw2ICs2MTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgU2VydmVyU29ja2V0Q2hhbm5lbCNhY2NlcHQoKS5zb2NrZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFjY2VwdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfTEJ5dGVCdWZmZXJfQmxvY2tpbmdfUmVhZFdyaXRlUmVhbExhcmdlRGF0YSgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2VydmVyQ2hhbm5lbC5zb2NrZXQoKS5iaW5kKGxvY2FsQWRkcjEpOwpAQCAtNDY5LDYgKzY1OSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTZXJ2ZXJTb2NrZXRDaGFubmVsI3NvY2tldCgpLmdldFNvVGltZW91dCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBhY2NlcHQgbWV0aG9kICByZXR1cm5zIG51bGwgc2luY2UgIiArCisgICAgICAgICAgICAidGhlcmUgYXJlIG5vIHBlbmRpbmcgY29ubmVjdGlvbnMuIERvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWNjZXB0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hY2NlcHRfU09USU1FT1VUKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTcwNyAgICAgICAgCiAgICAgICAgIGZpbmFsIGludCBTT19USU1FT1VUID0gMTA7CkBAIC00OTIsNiArNjkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNlcnZlclNvY2tldCNzb2NrZXQoKS5hY2NlcHQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIFZlcmlmaWVzIElsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24uIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc29ja2V0X2FjY2VwdF9CbG9ja2luZ19Ob3RCb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS03NDggICAgICAgCiAgICAgICAgIFNlcnZlclNvY2tldCBnb3RTb2NrZXQgPSBzZXJ2ZXJDaGFubmVsLnNvY2tldCgpOwpAQCAtNTE0LDYgKzcyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTZXJ2ZXJTb2NrZXQjc29ja2V0KCkuYWNjZXB0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiBWZXJpZmllcyBJbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNvY2tldCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldF9hY2NlcHRfTm9uYmxvY2tpbmdfTm90Qm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzQ4ICAgICAgIAogICAgICAgICBTZXJ2ZXJTb2NrZXQgZ290U29ja2V0ID0gc2VydmVyQ2hhbm5lbC5zb2NrZXQoKTsKQEAgLTUzNiw2ICs3NTQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgU2VydmVyU29ja2V0I3NvY2tldCgpLmFjY2VwdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gVmVyaWZpZXMgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJDbG9zZWRDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNvY2tldCIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc29ja2V0X2FjY2VwdF9Ob25ibG9ja2luZ19Cb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS03NDgKICAgICAgICAgc2VydmVyQ2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC01NTksNiArNzg3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNlcnZlclNvY2tldCNzb2NrZXQoKS5hY2NlcHQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldF9hY2NlcHRfQmxvY2tpbmdfQm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzQ4CiAgICAgICAgIHNlcnZlckNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcodHJ1ZSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NpbmtDaGFubmVsVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9TaW5rQ2hhbm5lbFRlc3QuamF2YQppbmRleCA5N2M0YzRkLi41Y2Y3ZGQwIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NpbmtDaGFubmVsVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU2lua0NoYW5uZWxUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVsczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CkBAIC0yNyw3ICszMiw3IEBACiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgUGlwZS5TaW5rQ2hhbm5lbCBjbGFzcwogICovCkBAIC02MCwxMyArNjUsMzEgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5TaW5rQ2hhbm5lbCN2YWxpZE9wcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInZhbGlkT3BzIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWxpZE9wcygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFNlbGVjdGlvbktleS5PUF9XUklURSwgc2luay52YWxpZE9wcygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5TaW5rQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyKQorICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIgW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZV9MQnl0ZUJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZBcnJheSA9IHsgYnVmZmVyLCBwb3NpdGlvbmVkQnVmZmVyIH07CiAgICAgICAgIGJvb2xlYW5bXSBzaW5rQmxvY2tpbmdNb2RlID0geyB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKQEAgLTEwMiw2ICsxMjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5TaW5rQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfTEJ5dGVCdWZmZXJfbXV0bGlUaHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBUSFJFQURfTlVNID0gMjA7CkBAIC0xNDYsNiArMTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU2lua0NoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlX0xCeXRlQnVmZmVyX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHdyaXRlIG51bGwgQnl0ZUJ1ZmZlcgogICAgICAgICBCeXRlQnVmZmVyIG51bGxCdWYgPSBudWxsOwpAQCAtMTYwLDYgKzIwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfTEJ5dGVCdWZmZXJfU291cmNlQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc291cmNlLmNsb3NlKCk7CiAgICAgICAgIGludCB3cml0dGVuID0gc2luay53cml0ZShidWZmZXIpOwpAQCAtMTY5LDYgKzIxOSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZV9MQnl0ZUJ1ZmZlcl9TaW5rQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc2luay5jbG9zZSgpOwogICAgICAgICB0cnkgewpAQCAtMTkxLDYgKzI1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfJExCeXRlQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIGJ1ZkFycmF5ID0geyBidWZmZXIsIHBvc2l0aW9uZWRCdWZmZXIgfTsKICAgICAgICAgYm9vbGVhbltdIHNpbmtCbG9ja2luZ01vZGUgPSB7IHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSB9OwpAQCAtMjI0LDYgKzI5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfJExCeXRlQnVmZmVyX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHdyaXRlIG51bGwgQnl0ZUJ1ZmZlcltdCiAgICAgICAgIEJ5dGVCdWZmZXJbXSBudWxsQnVmQXJyYXlSZWYgPSBudWxsOwpAQCAtMjQ4LDYgKzMyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfJExCeXRlQnVmZmVyX1NvdXJjZUNsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZBcnJheSA9IHsgYnVmZmVyIH07CiAgICAgICAgIHNvdXJjZS5jbG9zZSgpOwpAQCAtMjU4LDYgKzM0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfJExCeXRlQnVmZmVyX1NpbmtDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyW10gYnVmQXJyYXkgPSB7IGJ1ZmZlciB9OwogICAgICAgICBzaW5rLmNsb3NlKCk7CkBAIC0yOTAsNiArMzg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU2lua0NoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZV8kTEJ5dGVCdWZmZXJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZBcnJheSA9IHsgYnVmZmVyLCBwb3NpdGlvbmVkQnVmZmVyIH07CiAgICAgICAgIGJvb2xlYW5bXSBzaW5rQmxvY2tpbmdNb2RlID0geyB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKQEAgLTMxOSw2ICs0MjQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5TaW5rQ2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlXyRMQnl0ZUJ1ZmZlcklJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHdyaXRlIG51bGwgQnl0ZUJ1ZmZlcltdCiAgICAgICAgIEJ5dGVCdWZmZXJbXSBudWxsQnVmQXJyYXlSZWYgPSBudWxsOwpAQCAtMzkzLDYgKzUwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlXyRMQnl0ZUJ1ZmZlcklJX1NvdXJjZUNsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZBcnJheSA9IHsgYnVmZmVyIH07CiAgICAgICAgIHNvdXJjZS5jbG9zZSgpOwpAQCAtNDAzLDYgKzUyNywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNpbmtDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24sICIgKworICAgICAgICAgICAgICAgICAgICAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVfJExCeXRlQnVmZmVySUlfU2lua0Nsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZBcnJheSA9IHsgYnVmZmVyIH07CiAgICAgICAgIHNpbmsuY2xvc2UoKTsKQEAgLTQ4NywxMSArNjIxLDMzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU2lua0NoYW5uZWwjY2xvc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB3cml0ZSBtZXRob2QgYWZ0ZXIgY2xvc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc2luay5jbG9zZSgpOwogICAgICAgICBhc3NlcnRGYWxzZShzaW5rLmlzT3BlbigpKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgIiArCisgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBtZXRob2QgaXMgY2FsbGVkIGZvciBjbG9zZWQgY2hhbm5lbC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldENoYW5uZWxfcmVhZF9jbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNzYyA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOwogICAgICAgICBzc2Muc29ja2V0KCkuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksNDk5OTkpKTsKQEAgLTUxNSw3ICs2NzEsMTUgQEAKICAgICAgICAgfQogICAgICAgICBzb2NrLmNsb3NlKCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb2NrZXRDaGFubmVsX3JlYWRfd3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2VydmVyU29ja2V0Q2hhbm5lbCBzc2MgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKICAgICAgICAgc3NjLnNvY2tldCgpLmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLDQ5OTk5KSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NvY2tldENoYW5uZWxUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NvY2tldENoYW5uZWxUZXN0LmphdmEKaW5kZXggMGQ0OGM2Mi4uZjdjODgyMiAxMDA3NTUKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Tb2NrZXRDaGFubmVsVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU29ja2V0Q2hhbm5lbFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtNDMsNiArNDgsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfUG9ydE1hbmFnZXI7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU29ja2V0Q2hhbm5lbC5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIFNvY2tldENoYW5uZWwgYW5kIGl0cyBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICovCkBAIC0xMTUsNiArMTIxLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2phdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWwudmFsaWRPcHMoKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsaWRPcHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRPcHMoKSB7CiAgICAgICAgIE1vY2tTb2NrZXRDaGFubmVsIHRlc3RNU0NoYW5uZWwgPSBuZXcgTW9ja1NvY2tldENoYW5uZWwobnVsbCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxMywgdGhpcy5jaGFubmVsMS52YWxpZE9wcygpKTsKQEAgLTEyNCw2ICsxMzksMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWV0aG9kIGZvciAnamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbC5vcGVuKCknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9wZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXJbXSBidWYgPSBuZXcgamF2YS5uaW8uQnl0ZUJ1ZmZlclsxXTsKICAgICAgICAgYnVmWzBdID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDQVBBQ0lUWV9OT1JNQUwpOwpAQCAtMTQ1LDYgKzE2OSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsLm9wZW4oU29ja2V0QWRkcmVzcyknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9wZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9wZW5Tb2NrZXRBZGRyZXNzX051bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTb2NrZXRDaGFubmVsIGNoYW5uZWwxSVAgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTU5LDYgKzE5MiwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsLnJlYWQoQnl0ZUJ1ZmZlcltdKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlQnVmZmVyQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyW10gYnl0ZUJ1ZiA9IG51bGw7CiAgICAgICAgIE1vY2tTb2NrZXRDaGFubmVsIHRlc3RNU0NoYW5uZWxudWxsID0gbmV3IE1vY2tTb2NrZXRDaGFubmVsKG51bGwpOwpAQCAtMTk0LDYgKzIzNiwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsLnJlYWQoQnl0ZUJ1ZmZlcltdKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlQnVmZmVyQXJyYXlfQnVmTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXJbXSBieXRlQnVmID0gbnVsbDsKICAgICAgICAgTW9ja1NvY2tldENoYW5uZWwgdGVzdE1TQ2hhbm5lbG51bGwgPSBuZXcgTW9ja1NvY2tldENoYW5uZWwobnVsbCk7CkBAIC0yMjIsNiArMjczLDE2IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ2phdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWwud3JpdGUoQnl0ZUJ1ZmZlcltdKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24sIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyW10gYnl0ZUJ1ZiA9IG51bGw7CiAgICAgICAgIE1vY2tTb2NrZXRDaGFubmVsIHRlc3RNU0NoYW5uZWxudWxsID0gbmV3IE1vY2tTb2NrZXRDaGFubmVsKG51bGwpOwpAQCAtMjQ3LDYgKzMwOCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtZXRob2QgZm9yICdqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsLndyaXRlKEJ5dGVCdWZmZXJbXSknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyQXJyYXlfQnVmTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXJbXSBieXRlQnVmID0gbnVsbDsKICAgICAgICAgTW9ja1NvY2tldENoYW5uZWwgdGVzdE1TQ2hhbm5lbG51bGwgPSBuZXcgTW9ja1NvY2tldENoYW5uZWwobnVsbCk7CkBAIC0yNzEsNyArMzQxLDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0X0Jhc2ljU3RhdHVzQmVmb3JlQ29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7Ly8gbm90IGNvbm5lY3RlZAogICAgICAgICBTb2NrZXQgczEgPSB0aGlzLmNoYW5uZWwxLnNvY2tldCgpOwpAQCAtMjgwLDcgKzM1OCwxNSBAQAogICAgICAgICAvLyBzYW1lCiAgICAgICAgIGFzc2VydFNhbWUoczEsIHMyKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0X0Jsb2NrX0Jhc2ljU3RhdHVzQWZ0ZXJDb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5jaGFubmVsMS5pc0Nvbm5lY3RlZCgpKTsvLyBub3QgY29ubmVjdGVkCiAgICAgICAgIGFzc2VydFRydWUodGhpcy5jaGFubmVsMS5jb25uZWN0KGxvY2FsQWRkcjEpKTsKQEAgLTI5Myw3ICszNzksMTUgQEAKICAgICAgICAgLy8gc2FtZQogICAgICAgICBhc3NlcnRTYW1lKHMxLCBzMik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9Ob25CbG9ja19CYXNpY1N0YXR1c0FmdGVyQ29ubmVjdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzQ29ubmVjdGVkKCkpOy8vIG5vdCBjb25uZWN0ZWQKICAgICAgICAgdGhpcy5jaGFubmVsMS5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC0zMTYsMTMgKzQxMCwyOSBAQAogICAgICAgICAgICAgYXNzZXJ0U2FtZShzMSwgczIpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldF9CbG9ja19BY3Rpb25zQmVmb3JlQ29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7Ly8gbm90IGNvbm5lY3RlZAogICAgICAgICBTb2NrZXQgcyA9IHRoaXMuY2hhbm5lbDEuc29ja2V0KCk7CiAgICAgICAgIGFzc2VydFNvY2tldEFjdGlvbl9CbG9ja19CZWZvcmVDb25uZWN0KHMpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNvY2tldCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTb2NrZXRfQmxvY2tfQWN0aW9uc0FmdGVyQ29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKHRoaXMuY2hhbm5lbDEuaXNDb25uZWN0ZWQoKSk7Ly8gbm90IGNvbm5lY3RlZAogICAgICAgICBhc3NlcnRUcnVlKHRoaXMuY2hhbm5lbDEuY29ubmVjdChsb2NhbEFkZHIxKSk7CkBAIC0zMzEsNyArNDQxLDE1IEBACiAgICAgICAgIGFzc2VydFNvY2tldEFjdGlvbl9CbG9ja19BZnRlckNvbm5lY3Qocyk7CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0X05vbkJsb2NrX0FjdGlvbnNBZnRlckNvbm5lY3RCZWZvcmVGaW5pc2goKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5jaGFubmVsMS5pc0Nvbm5lY3RlZCgpKTsvLyBub3QgY29ubmVjdGVkCkBAIC0zNDYsNyArNDY0LDE1IEBACiAgICAgICAgIC8vIHNhbWUKICAgICAgICAgYXNzZXJ0U2FtZShzMSwgczIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNvY2tldCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTb2NrZXRfTm9uQmxvY2tfQWN0aW9uc0FmdGVyQ29ubmVjdEFmdGVyRmluaXNoKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzQ29ubmVjdGVkKCkpOy8vIG5vdCBjb25uZWN0ZWQKQEAgLTU1Nyw2ICs2ODMsMTkgQEAKICAgICAvKioKICAgICAgKiBjb25uZWN0LS0+ZmluaXNoLS0+Y2xvc2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX05vcm1sX05vU2VydmVyX0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJDbG9zZWQoKTsKQEAgLTU4MSw2ICs3MjAsMTkgQEAKICAgICAvKioKICAgICAgKiBjb25uZWN0LS0+ZmluaXNoLS0+Y2xvc2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX05vcm1sX05vU2VydmVyX05vbkJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGNvbm5lY3ROb1NlcnZlck5vbkJsb2NrKCk7CiAKQEAgLTU5MSw2ICs3NDMsMTkgQEAKICAgICAvKioKICAgICAgKiBjb25uZWN0LS0+ZmluaXNoLS0+Y2xvc2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX05vcm1sX1NlcnZlcl9CbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjb25uZWN0U2VydmVyQmxvY2soKTsKIApAQCAtNjAyLDYgKzc2NywxOSBAQAogICAgIC8qKgogICAgICAqIGNvbm5lY3QtLT5maW5pc2gtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfTm9ybWxfU2VydmVyX05vbkJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGNvbm5lY3RTZXJ2ZXJOb25CbG9jaygpOwogCkBAIC02MTIsNiArNzkwLDE5IEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPnNlcnZlciBjbG9zZWQtLT5maW5pc2gtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfU2VydmVyQ2xvc2VkX0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJPcGVuKCk7CkBAIC02MzMsNiArODI0LDE5IEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPnNlcnZlciBjbG9zZWQtLT5maW5pc2gtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfU2VydmVyQ2xvc2VkX05vbkJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJPcGVuKCk7CkBAIC02NTMsNiArODU3LDE5IEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPmZpbmlzaC0tPnNlcnZlciBjbG9zZWQtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfU2VydmVyQ2xvc2VkQWZ0ZXJGaW5pc2hfQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY29ubmVjdFNlcnZlckJsb2NrKCk7CiAKQEAgLTY2Niw2ICs4ODMsMTkgQEAKICAgICAvKioKICAgICAgKiBjb25uZWN0LS0+ZmluaXNoLS0+c2VydmVyIGNsb3NlZC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9TZXJ2ZXJDbG9zZWRBZnRlckZpbmlzaF9Ob25CbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjb25uZWN0U2VydmVyTm9uQmxvY2soKTsKIApAQCAtNjc4LDYgKzkwOCwxOSBAQAogICAgIC8qKgogICAgICAqIG5vIHNlcnZlci0tPmNvbm5lY3QtLT5zZXJ2ZXIgb3Blbi0tPmZpbmlzaC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9TZXJ2ZXJTdGFydExhdGVyX0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJDbG9zZWQoKTsKQEAgLTcwMyw2ICs5NDYsMTkgQEAKICAgICAvKioKICAgICAgKiBubyBzZXJ2ZXItLT5jb25uZWN0LS0+c2VydmVyIG9wZW4tLT5maW5pc2gtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfU2VydmVyU3RhcnRMYXRlcl9Ob25CbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBlbnN1cmUKICAgICAgICAgZW5zdXJlU2VydmVyQ2xvc2VkKCk7CkBAIC03MjYsNiArOTgyLDE5IEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPmZpbmlzaC0tPmZpbmlzaC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9GaW5pc2hUd2ljZV9Ob1NlcnZlcl9Ob25CbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBlbnN1cmUKICAgICAgICAgZW5zdXJlU2VydmVyQ2xvc2VkKCk7CkBAIC03NDksNiArMTAxOCwxOSBAQAogICAgIC8qKgogICAgICAqIGNvbm5lY3QtLT5maW5pc2gtLT5maW5pc2gtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfRmluaXNoVHdpY2VfU2VydmVyX0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGNvbm5lY3RTZXJ2ZXJCbG9jaygpOwogICAgICAgICB0cnlGaW5pc2goKTsKQEAgLTc2MCw2ICsxMDQyLDE5IEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPmZpbmlzaC0tPmZpbmlzaC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9GaW5pc2hUd2ljZV9TZXJ2ZXJfTm9uQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY29ubmVjdFNlcnZlck5vbkJsb2NrKCk7CiAgICAgICAgIHRyeUZpbmlzaCgpOwpAQCAtNzcwLDYgKzEwNjUsMjQgQEAKICAgICAvKioKICAgICAgKiBjb25uZWN0LS0+ZmluaXNoLS0+Y29ubmVjdC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2FzZTogIGNvbm5lY3QtLT5maW5pc2gtLT5jb25uZWN0LS0+Y2xvc2UuICIgKworICAgICAgICAgICAgICAgICAgICAiVmVyaWZpZXMgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29uZmlndXJlQmxvY2tpbmciLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfQ29ubmVjdEFmdGVyRmluaXNoX05vU2VydmVyX0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJDbG9zZWQoKTsKQEAgLTgwMiw2ICsxMTE1LDIwIEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPmZpbmlzaC0tPmNvbm5lY3QtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNhc2U6IGNvbm5lY3QtLT5maW5pc2gtLT5jb25uZWN0LS0+Y2xvc2UuICIgKworICAgICAgICAgICAgICAgICAgICAiVmVyaWZpZXMgQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb24sIENvbm5lY3RFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfQ29ubmVjdEFmdGVyRmluaXNoX05vU2VydmVyX05vbkJsb2NrKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBlbnN1cmUKQEAgLTg1Niw2ICsxMTgzLDE1IEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPmZpbmlzaC0tPmNvbm5lY3QtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEFscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX0Nvbm5lY3RBZnRlckZpbmlzaF9TZXJ2ZXJfQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY29ubmVjdFNlcnZlckJsb2NrKCk7CiAKQEAgLTkwMSw2ICsxMjM3LDE1IEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPmZpbmlzaC0tPmNvbm5lY3QtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEFscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfQ29ubmVjdEFmdGVyRmluaXNoX1NlcnZlcl9Ob25CbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjb25uZWN0U2VydmVyTm9uQmxvY2soKTsKIApAQCAtOTQ1LDYgKzEyOTAsMjAgQEAKICAgICAvKioKICAgICAgKiBjb25uZWN0LS0+Y29ubmVjdC0tPmZpbmlzaC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2FzZTogY29ubmVjdC0tPmNvbm5lY3QtLT5maW5pc2gtLT5jbG9zZS4gIiArCisgICAgICAgICAgICAgICAgICAgICJWZXJpZmllcyBDb25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9Db25uZWN0VHdpY2VfTm9TZXJ2ZXJfTm9uQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZW5zdXJlCiAgICAgICAgIGVuc3VyZVNlcnZlckNsb3NlZCgpOwpAQCAtOTk2LDYgKzEzNTUsMjAgQEAKICAgICAvKioKICAgICAgKiBjb25uZWN0LS0+Y29ubmVjdC0tPmZpbmlzaC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2FzZSBjb25uZWN0LS0+Y29ubmVjdC0tPmZpbmlzaC0tPmNsb3NlLiAiICsKKyAgICAgICAgICAgICAgICAgICAgIlZlcmlmaWVzIEFscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfQ29ubmVjdFR3aWNlX1NlcnZlcl9CbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBlbnN1cmUKICAgICAgICAgZW5zdXJlU2VydmVyT3BlbigpOwpAQCAtMTA0Myw2ICsxNDE2LDIwIEBACiAgICAgLyoqCiAgICAgICogY29ubmVjdC0tPmNvbm5lY3QtLT5maW5pc2gtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNhc2UgY29ubmVjdC0tPmNvbm5lY3QtLT5maW5pc2gtLT5jbG9zZS4gIiArCisgICAgICAgICAgICAgICAgICAgICJWZXJpZmllcyBDb25uZWN0aW9uUGVuZGluZ0V4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9Db25uZWN0VHdpY2VfU2VydmVyX05vbkJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJPcGVuKCk7CkBAIC0xMDg5LDYgKzE0NzYsMTkgQEAKICAgICAvKioKICAgICAgKiBmaW5pc2gtLT5jb25uZWN0LS0+ZmluaXNoLS0+Y2xvc2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX0ZpbmlzaEZpcnN0X05vU2VydmVyX0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJDbG9zZWQoKTsKQEAgLTExMjIsNiArMTUyMiwxOSBAQAogICAgIC8qKgogICAgICAqIGZpbmlzaC0tPmNvbm5lY3QtLT5maW5pc2gtLT5jbG9zZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfRmluaXNoRmlyc3RfTm9TZXJ2ZXJfTm9uQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZW5zdXJlCiAgICAgICAgIGVuc3VyZVNlcnZlckNsb3NlZCgpOwpAQCAtMTE1Myw2ICsxNTY2LDE5IEBACiAgICAgLyoqCiAgICAgICogZmluaXNoLS0+Y29ubmVjdC0tPmZpbmlzaC0tPmNsb3NlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfRmluaXNoRmlyc3RfU2VydmVyX0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGVuc3VyZQogICAgICAgICBlbnN1cmVTZXJ2ZXJPcGVuKCk7CkBAIC0xMTgwLDYgKzE2MDYsMTkgQEAKICAgICAvKioKICAgICAgKiBmaW5pc2gtLT5jb25uZWN0LS0+ZmluaXNoLS0+Y2xvc2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICB9KSAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9GaW5pc2hGaXJzdF9TZXJ2ZXJfTm9uQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZW5zdXJlCiAgICAgICAgIGVuc3VyZVNlcnZlck9wZW4oKTsKQEAgLTEyMDIsNyArMTY0MSwxNSBAQAogICAgICAgICB0aGlzLmNoYW5uZWwxLmNsb3NlKCk7CiAgICAgICAgIHN0YXR1c0NoYW5uZWxDbG9zZWQoKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3RhdHVzTm90Q29ubmVjdGVkX05vdFBlbmRpbmcoKTsKICAgICAgICAgdHJ5IHsKQEAgLTEyMTIsNyArMTY1OSwxNSBAQAogICAgICAgICAgICAgLy8gT0suCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX1Vuc3VwcG9ydGVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjbGFzcyBTdWJTb2NrZXRBZGRyZXNzIGV4dGVuZHMgU29ja2V0QWRkcmVzcyB7CiAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKQEAgLTEyMzEsNyArMTY4NiwxNSBAQAogICAgICAgICAgICAgLy8gT0suCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX1VucmVzb2x2ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdGF0dXNOb3RDb25uZWN0ZWRfTm90UGVuZGluZygpOwogICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyB1bnJlc29sdmVkID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKApAQCAtMTI0Myw3ICsxNzA2LDE1IEBACiAgICAgICAgICAgICAvLyBPSy4KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfRW1wdHlIb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN0YXR1c05vdENvbm5lY3RlZF9Ob3RQZW5kaW5nKCk7CiAgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXIgPSBuZXcgU2VydmVyU29ja2V0KDApOwpAQCAtMTI1Niw3ICsxNzI3LDIzIEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25maWd1cmVCbG9ja2luZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9DbG9zZUZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMuY2hhbm5lbDEuY2xvc2UoKTsKICAgICAgICAgc3RhdHVzQ2hhbm5lbENsb3NlZCgpOwpAQCAtMTI4Myw3ICsxNzcwLDE5IEBACiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzQ2hhbm5lbENsb3NlZCgpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uZXQuU29ja2V0QWRkcmVzcy5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfU3RhdHVzQWZ0ZXJGaW5pc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gMS4gY2xvc2Ugc2VydmVyLCBmaW5pc2ggbXVzdCByZXR1cm4gZmFsc2UsIGNoZWNrIHRoZSBzdGF0dXMKICAgICAgICAgZW5zdXJlU2VydmVyQ2xvc2VkKCk7CkBAIC0xNDQwLDYgKzE5MzksMTUgQEAKICAgICAgKiAKICAgICAgKiAnU29ja2V0Q2hhbm5lbEltcGwuY29ubmVjdChTb2NrZXRBZGRyZXNzKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmV0LlNvY2tldEFkZHJlc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX0RhdGFfQ29ubmVjdFdpdGhTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZW5zdXJlU2VydmVyT3BlbigpOwogICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyIHdyaXRlQnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlcgpAQCAtMTQ3Myw2ICsxOTgxLDIzIEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ1NvY2tldENoYW5uZWxJbXBsLmNvbm5lY3QoU29ja2V0QWRkcmVzcyknCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbmZpZ3VyZUJsb2NraW5nIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgIH0pIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX0RhdGFfQ29ubmVjdFdpdGhTZXJ2ZXJfbm9uQmxvY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZW5zdXJlU2VydmVyT3BlbigpOwogICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyIHdyaXRlQnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlcgpAQCAtMTUwOCw2ICsyMDMzLDE5IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG1ldGhvZCBmb3IgJ1NvY2tldENoYW5uZWxJbXBsLmZpbmlzaENvbm5lY3QoKScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb25maWd1cmVCbG9ja2luZyIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICB9KSAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9EYXRhX0ZpbmlzaENvbm5lY3Rfbm9uQmxvY2tpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBlbnN1cmVTZXJ2ZXJPcGVuKCk7CiAKQEAgLTE1NDIsNyArMjA4MCwyMyBAQAogICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLmNoYW5uZWwxLmlzUmVnaXN0ZXJlZCgpKTsKICAgICAgICAgdHJ5RmluaXNoKCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29ubmVjdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm9wZW4iLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICB9KSAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q0ZJSV9EYXRhX0ZpbmlzaENvbm5lY3RfQWRkclNldFNlcnZlclN0YXJ0TGF0ZXIoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGVuc3VyZVNlcnZlckNsb3NlZCgpOwpAQCAtMTYxMiw3ICsyMTY2LDE1IEBACiAgICAgICAgICAgICAvLyBGSVhNRTogYXNzZXJ0RXF1YWxzKGUuZ2V0TWVzc2FnZSgpLCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaW5pc2hDb25uZWN0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgfSkgCiAgICAgcHVibGljIHZvaWQgdGVzdENGSUlfRGF0YV9GaW5pc2hDb25uZWN0X1NlcnZlclN0YXJ0TGF0ZXIoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZW5zdXJlU2VydmVyQ2xvc2VkKCk7CkBAIC0xNjcxLDcgKzIyMzMsMTkgQEAKICAgICAgICAgICAgIC8vIEZJWE1FOiBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZpbmlzaENvbm5lY3QiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNvbmZpZ3VyZUJsb2NraW5nIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgIH0pIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDRklJX0RhdGFfRmluaXNoQ29ubmVjdF9CbG9ja2luZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGVuc3VyZVNlcnZlck9wZW4oKTsKICAgICAgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlciB3cml0ZUJ1ZiA9IGphdmEubmlvLkJ5dGVCdWZmZXIKQEAgLTE3MDksNiArMjI4MywxNSBAQAogICAgIC8qKgogICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSGFybW9ueS0xOTQ3LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmluaXNoQ29ubmVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9maW5pc2hDb25uZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNvY2tldEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygibG9jYWxob3N0IiwgMjA0Nik7CiAKQEAgLTE3NTAsNiArMjMzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZExqYXZhX25pb19CeXRlQnVmZmVyX0Jsb2NraW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gaW5pdGlhbGl6ZSB3cml0ZSBjb250ZW50CiAgICAgICAgIGJ5dGVbXSB3cml0ZUNvbnRlbnQgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwpAQCAtMTc5Myw2ICsyMzg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWwjcmVhZChCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkTGphdmFfbmlvX0J5dGVCdWZmZXJfTm9uYmxvY2tpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBpbml0aWFsaXplIHdyaXRlIGNvbnRlbnQKICAgICAgICAgYnl0ZVtdIHdyaXRlQ29udGVudCA9IG5ldyBieXRlW0NBUEFDSVRZX05PUk1BTF07CkBAIC0xODM5LDYgKzI0NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCN3cml0ZShCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3J0aWVMamF2YV9uaW9fQnl0ZUJ1ZmZlcl9CbG9ja2luZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGluaXRpYWxpemUgd3JpdGUgY29udGVudAogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQ29udGVudCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFlfTk9STUFMKTsKQEAgLTE4ODksNiArMjQ5OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cnRpZUxqYXZhX25pb19CeXRlQnVmZmVyX05vbkJsb2NraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGluaXRpYWxpemUgd3JpdGUgY29udGVudAogICAgICAgICBCeXRlQnVmZmVyIHdyaXRlQ29udGVudCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQ0FQQUNJVFlfTk9STUFMKTsKQEAgLTE5NTksNyArMjU3OCwxNSBAQAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBUZXN0IGZvciByZWFkL3dyaXRlIGJ1dCBubyByZWFsIGRhdGEgZXhwcmVzc2VkCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLnNlcnZlcjEuaXNCb3VuZCgpKTsKICAgICAgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlciByZWFkQnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlcgpAQCAtMTk5Myw3ICsyNjIwLDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZUJ1ZmZlcl9EaXJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLnNlcnZlcjEuaXNCb3VuZCgpKTsKICAgICAgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlciByZWFkQnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlcgpAQCAtMjAyNyw3ICsyNjYyLDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVCdWZmZXJfQnVmTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKHRoaXMuc2VydmVyMS5pc0JvdW5kKCkpOwogICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyIHJlYWRCdWYgPSBqYXZhLm5pby5CeXRlQnVmZmVyLmFsbG9jYXRlKDApOwpAQCAtMjA2MSw2ICsyNzA0LDE1IEBACiAgICAgLyoKICAgICAgKiBTb2NrZXRDaGFubmVsSW1wbC5yZWFkKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlQnVmZmVyQXJyYXlJbnRJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLnNlcnZlcjEuaXNCb3VuZCgpKTsKICAgICAgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlcltdIHJlYWRCdWYgPSBuZXcgamF2YS5uaW8uQnl0ZUJ1ZmZlclsyXTsKQEAgLTIxMDAsNiArMjc1MiwxNSBAQAogICAgIC8qCiAgICAgICogU29ja2V0Q2hhbm5lbEltcGwucmVhZChCeXRlQnVmZmVyW10sIGludCwgaW50KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlQnVmZmVyQXJyYXlJbnRJbnRfRGlyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5zZXJ2ZXIxLmlzQm91bmQoKSk7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXJbXSByZWFkQnVmID0gbmV3IGphdmEubmlvLkJ5dGVCdWZmZXJbMl07CkBAIC0yMTM1LDcgKzI3OTYsMTUgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZUJ1ZmZlckFycmF5SW50SW50X0J1Zk51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLnNlcnZlcjEuaXNCb3VuZCgpKTsKICAgICAgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlcltdIHJlYWRCdWYgPSBuZXcgamF2YS5uaW8uQnl0ZUJ1ZmZlclsyXTsKQEAgLTIxNzksNyArMjg0OCwxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5zZXJ2ZXIxLmlzQm91bmQoKSk7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXIgd3JpdGVCdWYgPSBqYXZhLm5pby5CeXRlQnVmZmVyCkBAIC0yMjEwLDcgKzI4ODcsMTYgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyX0RpcmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5zZXJ2ZXIxLmlzQm91bmQoKSk7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXIgd3JpdGVCdWYgPSBqYXZhLm5pby5CeXRlQnVmZmVyCkBAIC0yMjQxLDcgKzI5MjcsMTUgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUJ5dGVCdWZmZXJfQnVmTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGhpcy5zZXJ2ZXIxLmlzQm91bmQoKSk7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXIgd3JpdGVCdWYgPSBqYXZhLm5pby5CeXRlQnVmZmVyLmFsbG9jYXRlKDApOwpAQCAtMjI1OCw2ICsyOTUyLDE2IEBACiAgICAgLyoKICAgICAgKiBTb2NrZXRDaGFubmVsSW1wbC53cml0ZShCeXRlQnVmZmVyW10sIGludCwgaW50KScKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAiQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQnVmZmVyQXJyYXlJbnRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyW10gd3JpdGVCdWYgPSBuZXcgamF2YS5uaW8uQnl0ZUJ1ZmZlclsyXTsKICAgICAgICAgd3JpdGVCdWZbMF0gPSBqYXZhLm5pby5CeXRlQnVmZmVyLmFsbG9jYXRlKENBUEFDSVRZX05PUk1BTCk7CkBAIC0yMjk2LDYgKzMwMDAsMTUgQEAKICAgICAvKgogICAgICAqIFNvY2tldENoYW5uZWxJbXBsLndyaXRlKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpJwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X0RpcmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXJbXSB3cml0ZUJ1ZiA9IG5ldyBqYXZhLm5pby5CeXRlQnVmZmVyWzJdOwogICAgICAgICB3cml0ZUJ1ZlswXSA9IGphdmEubmlvLkJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0FQQUNJVFlfTk9STUFMKTsKQEAgLTIzMzAsNyArMzA0MywxNSBAQAogICAgICAgICAgICAgLy8gY29ycmVjdAogICAgICAgICB9CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X0J1Zk51bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyW10gd3JpdGVCdWYgPSBuZXcgamF2YS5uaW8uQnl0ZUJ1ZmZlclswXTsKIApAQCAtMjM2OSw3ICszMDkwLDE1IEBACiAgICAgICAgICAgICAvLyBjb3JyZWN0CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQnl0ZUJ1ZmZlckFycmF5SW50SW50X1NpemVFcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXJbXSB3cml0ZUJ1ZiA9IG5ldyBqYXZhLm5pby5CeXRlQnVmZmVyWzBdOwogCkBAIC0yNDA4LDcgKzMxMzcsMTUgQEAKICAgICAgICAgICAgIC8vIGNvcnJlY3QKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZUJ1ZmZlckFycmF5SW50SW50X1NpemVFcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGphdmEubmlvLkJ5dGVCdWZmZXJbXSByZWFkQnVmID0gbmV3IGphdmEubmlvLkJ5dGVCdWZmZXJbMF07CiAKQEAgLTI0NTgsNiArMzE5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcltdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja1NvY2tldENoYW5uZWwgc2MgPSBuZXcgTW9ja1NvY2tldENoYW5uZWwobnVsbCk7CiAgICAgICAgIEJ5dGVCdWZmZXIgW10gYnl0ZUJ1ZmZlckFycmF5ID0geyBCeXRlQnVmZmVyLmFsbG9jYXRlKDEpLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEpfTsKQEAgLTI0NzAsNiArMzIxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcltdLGludCxpbnQpCiAgICAgICovICAKKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWQkTEJ5dGVCdWZmZXJJSV9ibG9ja2luZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRfcmVhZCRMQnl0ZUJ1ZmZlcih0cnVlKTsKICAgICB9CkBAIC0yNDc3LDYgKzMyMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXJbXSxpbnQsaW50KQogICAgICAqLyAgCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJExCeXRlQnVmZmVySUlfbm9uYmxvY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0X3JlYWQkTEJ5dGVCdWZmZXIoZmFsc2UpOwogICAgIH0KQEAgLTI1MzksNiArMzMwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSxpbnQsaW50KQogICAgICAqLyAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlJExCeXRlQnVmZmVySUlfYmxvY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0X3dyaXRlJExCeXRlQnVmZmVyKHRydWUpOwogICAgIH0KQEAgLTI1NDYsNiArMzMxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSxpbnQsaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGUkTEJ5dGVCdWZmZXJJSV9ub25ibG9ja2luZygpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0X3dyaXRlJExCeXRlQnVmZmVyKGZhbHNlKTsKQEAgLTI2MTEsNiArMzM5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRMQnl0ZUJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tTb2NrZXRDaGFubmVsIHNjID0gbmV3IE1vY2tTb2NrZXRDaGFubmVsKG51bGwpOwogICAgICAgICBCeXRlQnVmZmVyIFtdIGJ5dGVCdWZmZXJBcnJheSA9IHsgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKSwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKX07CkBAIC0yNjIwLDcgKzM0MTEsMTUgQEAKICAgICAgICAgc2Mud3JpdGUoYnl0ZUJ1ZmZlckFycmF5KTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzYy5pc1dyaXRlQ2FsbGVkKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0X2NvbmZpZ3VyZWJsb2NraW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHNlcnZlcldCdWYgPSBuZXcgYnl0ZVtDQVBBQ0lUWV9OT1JNQUxdOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcldCdWYubGVuZ3RoOyBpKyspIHsKQEAgLTI2NTEsNiArMzQ1MCwxNSBAQAogICAgICAqIEB0ZXN0cyBTb2NrZXRDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcltdLCBpbnQsIGludCkgd2hlbiByZW1vdGUgc2VydmVyCiAgICAgICogICAgICAgIGNsb3NlZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb2NrZXRDaGFubmVsX3JlYWRfQnl0ZUJ1ZmZlcklJX3JlbW90ZUNsb3NlZCgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiAxIGZvciBIQVJNT05ZLTU0OQpAQCAtMjY2OCw2ICszNDc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNvY2tldENoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcltdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldENoYW5uZWxfd3JpdGVfQnl0ZUJ1ZmZlcklJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gMiBmb3IgSEFSTU9OWS01NDkKICAgICAgICAgU2VydmVyU29ja2V0Q2hhbm5lbCBzc2MgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKQEAgLTI2OTEsNiArMzUwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTb2NrZXRDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcltdLCBpbnQsIGludCkgd2l0aCBhIG51bGwgQnl0ZUJ1ZmZlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb2NrZXRDaGFubmVsX3JlYWRfQnl0ZUJ1ZmZlcklJX2J1Zk5VTEwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiAzIGZvciBIQVJNT05ZLTU0OQogICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNzYyA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOwpAQCAtMjcxNCw2ICszNTQwLDE5IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNvY2tldENoYW5uZWwjd3JpdGUoQnl0ZUJ1ZmZlcikgYWZ0ZXIgY2xvc2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb2NrZXRDaGFubmVsX3dyaXRlX2Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gNCBmb3IgSEFSTU9OWS01NDkKICAgICAgICAgU2VydmVyU29ja2V0Q2hhbm5lbCBzc2MgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKQEAgLTI3MzYsNiArMzU3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTb2NrZXRDaGFubmVsI3dyaXRlKEJ5dGVCdWZmZXIpIGlmIHBvc2l0aW9uIGlzIG5vdCB6ZXJvCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb2NrZXRDaGFubmVsX3dyaXRlX0J5dGVCdWZmZXJfcG9zTm90WmVybygpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVncmVzc2lvbiA1IGZvciBIQVJNT05ZLTU0OQpAQCAtMjc2Myw2ICszNjExLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNvY2tldENoYW5uZWxJbXBsI3JlYWQoQnl0ZUJ1ZmZlcltdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJEJ5dGVCdWZmZXJfQmxvY2tpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktNzI4CiAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbQ0FQQUNJVFlfTk9STUFMXTsKQEAgLTI3OTAsNiArMzY0NywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTb2NrZXRDaGFubmVsSW1wbCNzb2NrZXQoKS5nZXRPdXRwdXRTdHJlYW0oKS5yZWFkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldF9nZXRPdXRwdXRTdHJlYW1fbm9uQmxvY2tpbmdfcmVhZF9FeGNlcHRpb24oKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hhbm5lbDEuY29ubmVjdCh0aGlzLmxvY2FsQWRkcjEpOwpAQCAtMjg0NCw2ICszNzExLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNvY2tldENoYW5uZWxJbXBsI3NvY2tldCgpLmdldE91dHB1dFN0cmVhbSgpLnJlYWQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLCBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICAgICAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldF9nZXRPdXRwdXRTdHJlYW1fYmxvY2tpbmdfcmVhZF9FeGNlcHRpb24oKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hhbm5lbDEuY29ubmVjdCh0aGlzLmxvY2FsQWRkcjEpOwpAQCAtMjg5Nyw2ICszNzc0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIFNvY2tldENoYW5uZWxJbXBsI3NvY2tldCgpLmdldE91dHB1dFN0cmVhbSgpLndyaXRlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24sICIgKworICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NvY2tldF9nZXRPdXRwdXRTdHJlYW1fbm9uQmxvY2tpbmdfd3JpdGVfRXhjZXB0aW9uKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNoYW5uZWwxLmNvbm5lY3QodGhpcy5sb2NhbEFkZHIxKTsKQEAgLTI5NjMsNiArMzg1MCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTb2NrZXRDaGFubmVsSW1wbCNzb2NrZXQoKS5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sIENsb3NlZENoYW5uZWxFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAic29ja2V0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zb2NrZXRfZ2V0T3V0cHV0U3RyZWFtX2Jsb2NraW5nX3dyaXRlX0V4Y2VwdGlvbigpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGFubmVsMS5jb25uZWN0KHRoaXMubG9jYWxBZGRyMSk7CkBAIC0zMDE2LDYgKzM5MTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgU29ja2V0Q2hhbm5lbEltcGwjc29ja2V0KCkuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInNvY2tldCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc29ja2V0X2dldE91dHB1dFN0cmVhbV93cml0ZV9vbmVCeXRlKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU291cmNlQ2hhbm5lbFRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvU291cmNlQ2hhbm5lbFRlc3QuamF2YQppbmRleCAwNWRjYTkwLi45MjI1ZDBhIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1NvdXJjZUNoYW5uZWxUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9Tb3VyY2VDaGFubmVsVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKQEAgLTIzLDcgKzI4LDcgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5Tb3VyY2VDaGFubmVsLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5Tb3VyY2VDaGFubmVsCiAgKi8KQEAgLTU2LDYgKzYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCN2YWxpZE9wcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInZhbGlkT3BzIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWxpZE9wcygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFNlbGVjdGlvbktleS5PUF9SRUFELCBzb3VyY2UudmFsaWRPcHMoKSk7CiAgICAgfQpAQCAtNjMsNiArNzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5Tb3VyY2VDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkX0xCeXRlQnVmZmVyX0RhdGFBdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBpZiBhbnl0aGluZyBjYW4gcmVhZCwgcmVhZCBtZXRob2Qgd2lsbCBub3QgYmxvY2sKICAgICAgICAgc2luay53cml0ZShCeXRlQnVmZmVyLmFsbG9jYXRlKDEpKTsKQEAgLTczLDYgKzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfTEJ5dGVCdWZmZXJfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBudWxsQnVmID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTg2LDYgKzExOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNvdXJjZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkX0xCeXRlQnVmZmVyX1NpbmtDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKICAgICAgICAgc2luay53cml0ZShidWZmZXIpOwpAQCAtMTA0LDYgKzE0NSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNvdXJjZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sICIgKworICAgICAgICAgICAgICAgICAgICAiTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF9MQnl0ZUJ1ZmZlcl9Tb3VyY2VDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKICAgICAgICAgc291cmNlLmNsb3NlKCk7CkBAIC0xNTAsNiArMjAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJExCeXRlQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIGJ1ZkFycmF5ID0geyBidWZmZXIsIHBvc2l0aW9uZWRCdWZmZXIgfTsKICAgICAgICAgYm9vbGVhbltdIHNpbmtCbG9ja2luZ01vZGUgPSB7IHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSB9OwpAQCAtMjAxLDYgKzI2MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFubmVscy5QaXBlLlNvdXJjZUNoYW5uZWwjcmVhZChCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kTEJ5dGVCdWZmZXJfRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlcltdIG51bGxCdWZBcnJheVJlZiA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0yMzIsNiArMzAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KSAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkXyRMQnl0ZUJ1ZmZlcl9TaW5rQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciByZWFkQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShCVUZGRVJfU0laRSk7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSByZWFkQnVmQXJyYXkgPSB7IHJlYWRCdWYgfTsKQEAgLTI1Miw2ICszMzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5Tb3VyY2VDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJExCeXRlQnVmZmVyX1NvdXJjZUNsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQlVGRkVSX1NJWkUpOwogICAgICAgICBCeXRlQnVmZmVyW10gcmVhZEJ1ZkFycmF5ID0geyByZWFkQnVmIH07CkBAIC0yOTMsNiArMzgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXJbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZF8kTEJ5dGVCdWZmZXJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZBcnJheSA9IHsgYnVmZmVyLCBwb3NpdGlvbmVkQnVmZmVyIH07CiAgICAgICAgIGJvb2xlYW5bXSBzaW5rQmxvY2tpbmdNb2RlID0geyB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKQEAgLTM0NCw2ICs0NDAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZS5Tb3VyY2VDaGFubmVsI3JlYWQoQnl0ZUJ1ZmZlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkXyRMQnl0ZUJ1ZmZlcklJX0V4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgQnl0ZUJ1ZmZlcltdIG51bGxCdWZBcnJheVJlZiA9IG51bGw7CkBAIC00MTYsNiArNTIyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRfJExCeXRlQnVmZmVySUlfU2lua0Nsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQlVGRkVSX1NJWkUpOwogICAgICAgICBCeXRlQnVmZmVyW10gcmVhZEJ1ZkFycmF5ID0geyByZWFkQnVmIH07CkBAIC00MzUsNiArNTUwLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCNyZWFkKEJ5dGVCdWZmZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJDbG9zZWRDaGFubmVsRXhjZXB0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlcltdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkXyRMQnl0ZUJ1ZmZlcklJX1NvdXJjZUNsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQlVGRkVSX1NJWkUpOwogICAgICAgICBCeXRlQnVmZmVyW10gcmVhZEJ1ZkFycmF5ID0geyByZWFkQnVmIH07CkBAIC01MjQsNiArNjQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUuU291cmNlQ2hhbm5lbCNjbG9zZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzaW5rLmNsb3NlKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKHNpbmsuaXNPcGVuKCkpOwpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9VbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvblRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMzE1N2YzYi4uZmY5MjI3ZSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9VbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1VucmVzb2x2ZWRBZGRyZXNzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5VbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb24KICAqLworQFRlc3RUYXJnZXRDbGFzcyhVbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBVbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBVbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbigpKTsKQEAgLTM3LDYgKzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgVW5yZXNvbHZlZEFkZHJlc3NFeGNlcHRpb24oKSk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1Vuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb25UZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL1Vuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZWI4YmFiYS4uN2RkMDUwOCAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9VbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI0LDExICsyOSwyMSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbgogICovCitAVGVzdFRhcmdldENsYXNzKFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24oKSk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWxUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdEludGVycnVwdGlibGVDaGFubmVsVGVzdC5qYXZhCmluZGV4IGU4YzI0ZWQuLmE1YWYxZmEgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWxUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RJbnRlcnJ1cHRpYmxlQ2hhbm5lbFRlc3QuamF2YQpAQCAtMTYsMTcgKzE2LDMxIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVscy5zcGk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdEludGVycnVwdGlibGVDaGFubmVsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQWJzdHJhY3RJbnRlcnJ1cHRpYmxlQ2hhbm5lbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3RzIEFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwjY2xvc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNb2NrSW50ZXJydXB0aWJsZUNoYW5uZWwgdGVzdE1pQ2hhbm5lbCA9IG5ldyBNb2NrSW50ZXJydXB0aWJsZUNoYW5uZWwoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TWlDaGFubmVsLmlzT3BlbigpKTsKQEAgLTM5LDYgKzUzLDE5IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIEFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwjYmVnaW4vZW5kKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmVnaW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2JlZ2luX2VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKICAgICAgICAgTW9ja0ludGVycnVwdGlibGVDaGFubmVsIHRlc3RDaGFubmVsID0gbmV3IE1vY2tJbnRlcnJ1cHRpYmxlQ2hhbm5lbCgpOwpAQCAtNzgsNiArMTA1LDIzIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIEFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwjY2xvc2UvYmVnaW4vZW5kKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmVnaW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9zZV9iZWdpbl9lbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgIE1vY2tJbnRlcnJ1cHRpYmxlQ2hhbm5lbCB0ZXN0Q2hhbm5lbCA9IG5ldyBNb2NrSW50ZXJydXB0aWJsZUNoYW5uZWwoKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWxUZXN0LmphdmEgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsVGVzdC5qYXZhCmluZGV4IGQ2ZTBlMDguLmNmNjhiOGUgMTAwNjQ0Ci0tLSBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWxUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzLnNwaTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5JbGxlZ2FsQmxvY2tpbmdNb2RlRXhjZXB0aW9uOwpAQCAtMzIsNiArMzcsNyBAQAogLyoqCiAgKiBUZXN0cyBmb3IgQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsLmNsYXNzKQogcHVibGljIGNsYXNzIEFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBNb2NrU2VsZWN0YWJsZUNoYW5uZWwgdGVzdENoYW5uZWw7CkBAIC01MCw2ICs1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsI2ltcGxDbG9zZUNoYW5uZWwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsQ2xvc2VDaGFubmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbXBsQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0ZXN0Q2hhbm5lbC5pc0ltcGxDbG9zZVNlbGVjdGFibGVDaGFubmVsQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgIHRlc3RDaGFubmVsLmltcGxDbG9zZVNlbGVjdGFibGVDaGFubmVsQ291bnQgPSAwOwpAQCAtNzMsNiArODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCNwcm92aWRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcm92aWRlcigpIHsKICAgICAgICAgU2VsZWN0b3JQcm92aWRlciBwcm92aWRlciA9IHRlc3RDaGFubmVsLnByb3ZpZGVyKCk7CiAgICAgICAgIGFzc2VydFNhbWUoU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLCBwcm92aWRlcik7CkBAIC04NCw2ICsxMDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCNpc0Jsb2NraW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNCbG9ja2luZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNCbG9ja2luZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUodGVzdENoYW5uZWwuaXNCbG9ja2luZygpKTsKICAgICAgICAgdGVzdENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtOTYsNiArMTI5LDE1IEBACiAgICAgICogCiAgICAgICogQHRlc3RzIEFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwjYmxvY2tpbmdMb2NrKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmxvY2tpbmdMb2NrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ibG9ja2luZ0xvY2soKSB7CiAgICAgICAgIE9iamVjdCBnb3RPYmogPSB0ZXN0Q2hhbm5lbC5ibG9ja2luZ0xvY2soKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChnb3RPYmopOwpAQCAtMTA0LDYgKzE0NiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsI3JlZ2lzdGVyKFNlbGVjdG9yLCBpbnQsIE9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVnaXN0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlZ2lzdGVyX0xTZWxlY3RvcklMT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UodGVzdENoYW5uZWwuaXNSZWdpc3RlcmVkKCkpOwogICAgICAgICBTZWxlY3RvciBhY2NlcHRTZWxlY3RvcjEgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CkBAIC0xMjUsNiArMTc3LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIEFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwjcmVnaXN0ZXIoU2VsZWN0b3IsIGludCwgT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWdpc3RlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rvci5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVnaXN0ZXJfTFNlbGVjdG9ySUxPYmplY3RfSWxsZWdhbEFyZ3VtZW50KCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFNlbGVjdG9yIGFjY2VwdFNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOwpAQCAtMjIyLDYgKzI4NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsI2tleUZvcihTZWxlY3RvcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAia2V5Rm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2tleWZvcl9MU2VsZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU29ja2V0Q2hhbm5lbCBzYyA9IFNvY2tldENoYW5uZWwub3BlbigpOwogICAgICAgICBPYmplY3QgYXJnT2JqID0gbmV3IE9iamVjdCgpOwpAQCAtMjQ0LDYgKzMxNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsI2NvbmZpZ3VyZUJsb2NraW5nKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbmZpZ3VyZUJsb2NraW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uZmlndXJlQmxvY2tpbmdfWl9JbGxlZ2FsQmxvY2tpbmdNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNvY2tldENoYW5uZWwgc2MgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKICAgICAgICAgc2MuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtMjY0LDYgKzM0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBBYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsI2NvbmZpZ3VyZUJsb2NraW5nKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbmZpZ3VyZUJsb2NraW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uZmlndXJlQmxvY2tpbmdfWigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrU2VsZWN0YWJsZUNoYW5uZWwgbW9jayA9IG5ldyBNb2NrU2VsZWN0YWJsZUNoYW5uZWwoU2VsZWN0b3JQcm92aWRlcgogICAgICAgICAgICAgICAgIC5wcm92aWRlcigpKTsKZGlmZiAtLWdpdCBhL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0aW9uS2V5VGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3Rpb25LZXlUZXN0LmphdmEKaW5kZXggMTQwNGZjMS4uOWVjYTQyZSAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3Rpb25LZXlUZXN0LmphdmEKKysrIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3Rpb25LZXlUZXN0LmphdmEKQEAgLTE2LDE4ICsxNiwzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8udGVzdHMuamF2YS5uaW8uY2hhbm5lbHMuc3BpOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGlvbktleTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhBYnN0cmFjdFNlbGVjdGlvbktleS5jbGFzcykKIHB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlbGVjdGlvbktleVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgQWJzdHJhY3RTZWxlY3Rpb25LZXkjaXNWYWxpZCgpIHdpdGhvdXQgc2VsZWN0b3IKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNWYWxpZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWYWxpZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrU2VsZWN0aW9uS2V5IHRlc3RLZXkgPSBuZXcgTW9ja1NlbGVjdGlvbktleSgpOwogICAgICAgICBhc3NlcnRUcnVlKHRlc3RLZXkuaXNWYWxpZCgpKTsKQEAgLTM2LDYgKzUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIEFic3RyYWN0U2VsZWN0aW9uS2V5I2NhbmNlbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5jZWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NhbmNlbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrU2VsZWN0aW9uS2V5IHRlc3RLZXkgPSBuZXcgTW9ja1NlbGVjdGlvbktleSgpOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3RvclRlc3QuamF2YSBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0b3JUZXN0LmphdmEKaW5kZXggNGIzOTAwMS4uOGFkMjQzMiAxMDA2NDQKLS0tIGEvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3RvclRlc3QuamF2YQorKysgYi9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdG9yVGVzdC5qYXZhCkBAIC0xNiwxNSArMTYsMjEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLnRlc3RzLmphdmEubmlvLmNoYW5uZWxzLnNwaTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuSWxsZWdhbEJsb2NraW5nTW9kZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbDsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuQWJzdHJhY3RTZWxlY3RvcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhBYnN0cmFjdFNlbGVjdG9yLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgQWJzdHJhY3RTZWxlY3RvciBhbmQgcmVnaXN0ZXIgb2YgaXRzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAqLyAKQEAgLTMzLDYgKzM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIEFic3RyYWN0U2VsZWN0b3IjcHJvdmlkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJvdmlkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTZWxlY3RvciBtb2NrU2VsZWN0b3IgPSBuZXcgTW9ja0Fic3RyYWN0U2VsZWN0b3IoU2VsZWN0b3JQcm92aWRlcgogICAgICAgICAgICAgICAgIC5wcm92aWRlcigpKTsKQEAgLTQ1LDYgKzYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIEFic3RyYWN0U2VsZWN0b3IjY2xvc2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9zZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNb2NrQWJzdHJhY3RTZWxlY3RvciBtb2NrU2VsZWN0b3IgPSBuZXcgTW9ja0Fic3RyYWN0U2VsZWN0b3IoCiAgICAgICAgICAgICAgICAgU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpKTsKQEAgLTU2LDYgKzgwLDE5IEBACiAgICAgICogCiAgICAgICogQHRlc3RzIEFic3RyYWN0U2VsZWN0b3IjYmVnaW4vZW5kKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmVnaW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkgICAgICAgIAorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9iZWdpbl9lbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNb2NrQWJzdHJhY3RTZWxlY3RvciBtb2NrU2VsZWN0b3IgPSBuZXcgTW9ja0Fic3RyYWN0U2VsZWN0b3IoCiAgICAgICAgICAgICAgICAgU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpKTsgICAgIApAQCAtMTAwLDYgKzEzNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBBYnN0cmFjdFNlbGVjdG9yI2lzT3BlbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzT3BlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlbGVjdG9yIGFjY2VwdFNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOwogICAgICAgICBhc3NlcnRUcnVlKGFjY2VwdFNlbGVjdG9yLmlzT3BlbigpKTsKQEAgLTExMCw2ICsxNTYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgQWJzdHJhY3RTZWxlY3RvciNyZWdpc3RlcihTZWxlY3RvcixpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcmVnaXN0ZXIgbWV0aG9kIGZyb20gU2VsZWN0YWJsZUNoYW5uZWwgIiArCisgICAgICAgICAgICAgICAgICAgICJjbGFzcy4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWdpc3RlciIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTZWxlY3Rvci5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgIH0pICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWdpc3Rlcl9MU2VsZWN0b3JJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlbGVjdG9yIGFjY2VwdFNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOwogICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNzYyA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOwpAQCAtMTI2LDYgKzE4MiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBBYnN0cmFjdFNlbGVjdG9yI3JlZ2lzdGVyKFNlbGVjdG9yLGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyByZWdpc3RlciBtZXRob2QgZnJvbSBTZWxlY3RhYmxlQ2hhbm5lbCAiICsKKyAgICAgICAgICAgICAgICAgICAgImNsYXNzLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1NlbGVjdG9yLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWdpc3Rlcl9MU2VsZWN0b3JJX2Vycm9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU2VsZWN0b3IgYWNjZXB0U2VsZWN0b3IgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CiAgICAgICAgIFNlcnZlclNvY2tldENoYW5uZWwgc3NjID0gU2VydmVyU29ja2V0Q2hhbm5lbC5vcGVuKCk7CmRpZmYgLS1naXQgYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9TZWxlY3RvclByb3ZpZGVyVGVzdC5qYXZhIGIvbmlvL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pby90ZXN0cy9qYXZhL25pby9jaGFubmVscy9zcGkvU2VsZWN0b3JQcm92aWRlclRlc3QuamF2YQppbmRleCAzMDVlOWUyLi4yN2ZmZmRmIDEwMDY0NAotLS0gYS9uaW8vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvL3Rlc3RzL2phdmEvbmlvL2NoYW5uZWxzL3NwaS9TZWxlY3RvclByb3ZpZGVyVGVzdC5qYXZhCisrKyBiL25pby9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW8vdGVzdHMvamF2YS9uaW8vY2hhbm5lbHMvc3BpL1NlbGVjdG9yUHJvdmlkZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pby50ZXN0cy5qYXZhLm5pby5jaGFubmVscy5zcGk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbDsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5QaXBlOwpAQCAtMjYsMTIgKzMxLDIxIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKFNlbGVjdG9yUHJvdmlkZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2VsZWN0b3JQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgU2VsZWN0b3JQcm92aWRlciNwcm92aWRlcigpIHVzaW5nIHNlY3VyaXR5IG1hbmFnZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Byb3ZpZGVyX3NlY3VyaXR5KCkgeyAgICAgICAgCiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBvcmlnaW5hbFNlY3VpcnR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgTW9ja1NlbGVjdG9yUHJvdmlkZXJTZWN1cml0eU1hbmFnZXIoKSk7CkBAIC00OCw2ICs2MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBTZWxlY3RvclByb3ZpZGVyI3Byb3ZpZGVyKCkgdXNpbmcgc2VjdXJpdHkgbWFuYWdlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJvdmlkZXJfc2VjdXJpdHlfdHdpY2UoKSB7CiAgICAgICAgIFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKTsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9yaWdpbmFsU2VjdWlydHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IDdhOTc3M2YuLmE2YzA0YmMgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24uamF2YQorKysgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uLmphdmEKQEAgLTIwLDIwICsyMCwyMyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgorICogQSB7QGNvZGUgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhbiBlbmNvZGluZyBvciBkZWNvZGluZworICogZXJyb3Igb2NjdXJzLgogICogCi0gKiBUeXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhbiBlbmNvZGluZyBvciBkZWNvZGluZyBlcnJvciBvY2N1cnMuCi0gKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCiAgICAgLyoKLSAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiB0byBjaGVjayB0aGUgSjJTRSB2ZXJzaW9uCisgICAgICogVGhpcyBjb25zdGFudCBpcyB1c2VkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24gdG8gY2hlY2sgdGhlIHZlcnNpb24KICAgICAgKiB3aGljaCBjcmVhdGVkIHRoZSBzZXJpYWxpemVkIG9iamVjdC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NDIxNTMyMjMyMTU0NjI3NzgzTDsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldC5qYXZhIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXQuamF2YQppbmRleCA0Mjc0YjI2Li4wNDVmNzFmIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0LmphdmEKQEAgLTQyLDE3ICs0MiwxNyBAQAogCiAvKioKICAqIEEgY2hhcnNldCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgVW5pY29kZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYW5kIGEgYnl0ZQotICogc2VxdWVuY2UuIEl0IGZhY2lsaXRhdGUgdGhlIGVuY29kaW5nIGZyb20gYSBVbmljb2RlIGNoYXJhY3RlciBzZXF1ZW5jZSBpbnRvIGEKLSAqIGJ5dGUgc2VxdWVuY2UsIGFuZCB0aGUgZGVjb2RpbmcgZnJvbSBhIGJ5dGUgc2VxdWVuY2UgaW50byBhIFVuaWNvZGUgY2hhcmFjdGVyCi0gKiBzZXF1ZW5jZS4KKyAqIHNlcXVlbmNlLiBJdCBmYWNpbGl0YXRlcyB0aGUgZW5jb2RpbmcgZnJvbSBhIFVuaWNvZGUgY2hhcmFjdGVyIHNlcXVlbmNlIGludG8KKyAqIGEgYnl0ZSBzZXF1ZW5jZSwgYW5kIHRoZSBkZWNvZGluZyBmcm9tIGEgYnl0ZSBzZXF1ZW5jZSBpbnRvIGEgVW5pY29kZQorICogY2hhcmFjdGVyIHNlcXVlbmNlLgogICogPHA+Ci0gKiBBIGNoYXJzZXQgaGFzIGEgY2Fub25pY2FsIG5hbWUsIHdoaWNoIGFyZSB1c3VhbGx5IGluIHVwcGVyY2FzZS4gVHlwaWNhbGx5IGl0CisgKiBBIGNoYXJzZXQgaGFzIGEgY2Fub25pY2FsIG5hbWUsIHdoaWNoIGlzIHVzdWFsbHkgaW4gdXBwZXJjYXNlLiBUeXBpY2FsbHkgaXQKICAqIGFsc28gaGFzIG9uZSBvciBtb3JlIGFsaWFzZXMuIFRoZSBuYW1lIHN0cmluZyBjYW4gb25seSBjb25zaXN0IG9mIHRoZQogICogZm9sbG93aW5nIGNoYXJhY3RlcnM6ICcwJyAtICc5JywgJ0EnIC0gJ1onLCAnYScgLSAneicsICcuJywgJzonLiAnLScgYW5kICdfJy4KICAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUgbXVzdCBiZSBhIGRpZ2l0IG9yIGEgbGV0dGVyLgogICogPC9wPgogICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNoYXJzZXRzIHNob3VsZCBiZSBzdXBwb3J0ZWQgYnkgYW55IGphdmEgcGxhdGZvcm1zOiBVUy1BU0NJSSwKKyAqIFRoZSBmb2xsb3dpbmcgY2hhcnNldHMgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSBhbnkgamF2YSBwbGF0Zm9ybTogVVMtQVNDSUksCiAgKiBJU08tODg1OS0xLCBVVEYtOCwgVVRGLTE2QkUsIFVURi0xNkxFLCBVVEYtMTYuCiAgKiA8L3A+CiAgKiA8cD4KQEAgLTYxLDE5ICs2MSwyMCBAQAogICogYXMgImphdmEubmlvLmNoYXJzZXQuc3BpLkNoYXJzZXRQcm92aWRlciIgYW5kIGxvY2F0ZWQgaW4gdGhlCiAgKiAiTUVUQS1JTkYvc2VydmljZXMiIHN1YiBmb2xkZXIgb2Ygb25lIG9yIG1vcmUgY2xhc3NwYXRocy4gVGhlIGZpbGVzIHNob3VsZCBiZQogICogZW5jb2RlZCBpbiAiVVRGLTgiLiBFYWNoIGxpbmUgb2YgdGhlaXIgY29udGVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG5hbWUgb2YgYQotICogY2hhcnNldCBwcm92aWRlciB3aGljaCBleHRlbmRzIDxjb2RlPmphdmEubmlvLnNwaS5DaGFyc2V0UHJvdmlkZXI8L2NvZGU+LgotICogQSBsaW5lIHNob3VsZCBlbmRzIHdpdGggJ1xyJywgJ1xuJyBvciAnXHJcbicuIExlYWRpbmcgYW5kIHRyYWlsaW5nCi0gKiB3aGl0ZXNwYWNlcyBhcmUgdHJpbW1lZC4gQmxhbmsgbGluZXMsIGFuZCBsaW5lcyAoYWZ0ZXIgdHJpbW1lZCkgc3RhcnRpbmcgd2l0aAotICogIiMiIHdoaWNoIGFyZSByZWdhcmRlZCBhcyBjb21tZW50cywgYXJlIGJvdGggaWdub3JlZC4gRHVwbGljYXRlcyBvZiBhbHJlYWR5Ci0gKiBhcHBlYXJlZCBuYW1lcyBhcmUgYWxzbyBpZ25vcmVkLiBCb3RoIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCB0aGUKLSAqIHByb3ZpZGVyIGNsYXNzZXMgd2lsbCBiZSBsb2FkZWQgdXNpbmcgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlci4KKyAqIGNoYXJzZXQgcHJvdmlkZXIgd2hpY2ggZXh0ZW5kcworICogPGNvZGU+amF2YS5uaW8uY2hhcnNldC5zcGkuQ2hhcnNldFByb3ZpZGVyPC9jb2RlPi4gQSBsaW5lIHNob3VsZCBlbmQgd2l0aAorICogJ1xyJywgJ1xuJyBvciAnXHJcbicuIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFyZSB0cmltbWVkLiBCbGFuaworICogbGluZXMsIGFuZCBsaW5lcyAoYWZ0ZXIgdHJpbW1pbmcpIHN0YXJ0aW5nIHdpdGggIiMiIHdoaWNoIGFyZSByZWdhcmRlZCBhcworICogY29tbWVudHMsIGFyZSBib3RoIGlnbm9yZWQuIER1cGxpY2F0ZXMgb2YgbmFtZXMgYWxyZWFkeSBmb3VuZCBhcmUgYWxzbworICogaWdub3JlZC4gQm90aCB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgdGhlIHByb3ZpZGVyIGNsYXNzZXMgd2lsbCBiZSBsb2FkZWQKKyAqIHVzaW5nIHRoZSB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIuCiAgKiA8L3A+CiAgKiA8cD4KICAqIFRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUuCiAgKiA8L3A+CiAgKiAKICAqIEBzZWUgamF2YS5uaW8uY2hhcnNldC5zcGkuQ2hhcnNldFByb3ZpZGVyCi0gKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhcnNldCBpbXBsZW1lbnRzIENvbXBhcmFibGU8Q2hhcnNldD4gewogCkBAIC0xNjIsMTQgKzE2MywxNCBAQAogICAgICAqIGlnbm9yZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNhbm9uaWNhbE5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgY2hhcnNldAorICAgICAqICAgICAgICAgICAgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBjaGFyc2V0LgogICAgICAqIEBwYXJhbSBhbGlhc2VzCi0gICAgICogICAgICAgICAgICBhbiBhcnJheSBjb250YWluaW5nIGFsbCBhbGlhc2VzIG9mIHRoZSBjaGFyc2V0CisgICAgICogICAgICAgICAgICBhbiBhcnJheSBjb250YWluaW5nIGFsbCBhbGlhc2VzIG9mIHRoZSBjaGFyc2V0LiBNYXkgYmUgbnVsbC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIG9uIGFuIGlsbGVnYWwgdmFsdWUgYmVpbmcgc3VwcGxpZWQgZm9yIGVpdGhlcgogICAgICAqICAgICAgICAgICAgIDxjb2RlPmNhbm9uaWNhbE5hbWU8L2NvZGU+IG9yIGZvciBhbnkgZWxlbWVudCBvZgogICAgICAqICAgICAgICAgICAgIDxjb2RlPmFsaWFzZXM8L2NvZGU+LgotICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBDaGFyc2V0KFN0cmluZyBjYW5vbmljYWxOYW1lLCBTdHJpbmdbXSBhbGlhc2VzKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiB7CkBAIC0yMDUsMTYgKzIwNiwxNiBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBjaGFyYWN0ZXIgaXMgYSBsZXR0ZXIgKGFzY2lpKSB3aGljaCBhcmUgZGVmaW5lZCBpbiBKYXZhCi0gICAgICogU3BlYy4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBhIGNoYXJhY3RlciBpcyBhIGxldHRlciAoYXNjaWkpIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZQorICAgICAqIHNwZWMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xldHRlcihjaGFyIGMpIHsKICAgICAgICAgcmV0dXJuICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwgKCdBJyA8PSBjICYmIGMgPD0gJ1onKTsKICAgICB9CiAKICAgICAvKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIGEgZGlnaXQgKGFzY2lpKSB3aGljaCBhcmUgZGVmaW5lZCBpbiBKYXZhCi0gICAgICogU3BlYy4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBhIGNoYXJhY3RlciBpcyBhIGRpZ2l0IChhc2NpaSkgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlCisgICAgICogc3BlYy4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoY2hhciBjKSB7CiAgICAgICAgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpOwpAQCAtMzY1LDcgKzM2Niw4IEBACiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIG1hcCBvZiBhbGwgYXZhaWxhYmxlIGNoYXJzZXRzIHN1cHBvcnRlZCBieSB0aGUKLSAgICAgKiAgICAgICAgIHJ1bnRpbWUKKyAgICAgKiAgICAgICAgIHJ1bnRpbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyBTb3J0ZWRNYXA8U3RyaW5nLCBDaGFyc2V0PiBhdmFpbGFibGVDaGFyc2V0cygpIHsKQEAgLTQ0MSwxNyArNDQzLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1DbGFzc0xvYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgPSBjLm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBkZXNpcmVkIGNoYXJzZXQgZnJvbSB0aGlzIHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgIENoYXJzZXQgY3MgPSAoKENoYXJzZXRQcm92aWRlcikgY3ApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoYXJzZXRGb3JOYW1lKGNoYXJzZXROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChjcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBkZXNpcmVkIGNoYXJzZXQgZnJvbSB0aGlzIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc2V0IGNzID0gKChDaGFyc2V0UHJvdmlkZXIpIGNwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hhcnNldEZvck5hbWUoY2hhcnNldE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gY3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGxpbmUgb2YgdGhlIGNvbmZpZyBmaWxlCiAgICAgICAgICAgICAgICAgcHJvdmlkZXJDbGFzc05hbWUgPSByZWFkZXIucmVhZExpbmUoKTsKQEAgLTU0OSwxMiArNTU3LDEzIEBACiAgICAgICogR2V0cyBhIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGNoYXJzZXQgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hhcnNldE5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0Ci0gICAgICogQHJldHVybiBhIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGNoYXJzZXQgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBjaGFyc2V0IG9yIGFuIGFsaWFzLgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5DaGFyc2V0PC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBjaGFyc2V0IG5hbWUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIGNoYXJzZXQgbmFtZSBpcyBpbGxlZ2FsLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY2hhcnNldCBuYW1lIGlzIGlsbGVnYWwuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZGVzaXJlZCBjaGFyc2V0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBydW50aW1lLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBkZXNpcmVkIGNoYXJzZXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJ1bnRpbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDaGFyc2V0IGZvck5hbWUoU3RyaW5nIGNoYXJzZXROYW1lKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIHsKQEAgLTU2OSwxMCArNTc4LDExIEBACiAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcnNldCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBydW50aW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoYXJzZXQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyc2V0IGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hhcnNldC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyc2V0IGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBjaGFyc2V0IG5hbWUgaXMgaWxsZWdhbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNoYXJzZXQgbmFtZSBpcyBpbGxlZ2FsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgY2hhcnNldE5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIHsKQEAgLTU4NCwyMyArNTk0LDI3IEBACiAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY2hhcnNldCBpcyBhIHN1cGVyIHNldCBvZiB0aGUgZ2l2ZW4gY2hhcnNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hhcnNldAotICAgICAqICAgICAgICAgICAgYSBnaXZlbiBjaGFyc2V0CisgICAgICogICAgICAgICAgICBhIGdpdmVuIGNoYXJzZXQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2hhcnNldCBpcyBhIHN1cGVyIHNldCBvZiB0aGUgZ2l2ZW4gY2hhcnNldCwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQorICAgICAqICAgICAgICAgZmFsc2UgaWYgaXQncyB1bmtub3duIG9yIHRoaXMgY2hhcnNldCBpcyBub3QgYSBzdXBlcnNldCBvZgorICAgICAqICAgICAgICAgdGhlIGdpdmVuIGNoYXJzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29udGFpbnMoQ2hhcnNldCBjaGFyc2V0KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYSBuZXcgaW5zdGFuY2Ugb2YgZW5jb2RlciBmb3IgdGhpcyBjaGFyc2V0LgorICAgICAqIEdldHMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gZW5jb2RlciBmb3IgdGhpcyBjaGFyc2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgZW5jb2RlciBmb3IgdGhpcyBjaGFyc2V0CisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBhbiBlbmNvZGVyIGZvciB0aGlzIGNoYXJzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENoYXJzZXRFbmNvZGVyIG5ld0VuY29kZXIoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYSBuZXcgaW5zdGFuY2Ugb2YgZGVjb2RlciBmb3IgdGhpcyBjaGFyc2V0LgorICAgICAqIEdldHMgYSBuZXcgaW5zdGFuY2Ugb2YgYSBkZWNvZGVyIGZvciB0aGlzIGNoYXJzZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBkZWNvZGVyIGZvciB0aGlzIGNoYXJzZXQKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGEgZGVjb2RlciBmb3IgdGhpcyBjaGFyc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyc2V0RGVjb2RlciBuZXdEZWNvZGVyKCk7CiAKQEAgLTYwOCw2ICs2MjIsNyBAQAogICAgICAqIEdldHMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoaXMgY2hhcnNldC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoaXMgY2hhcnNldCdzIG5hbWUgaW4gY2Fub25pY2FsIGZvcm0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lKCkgewogICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWxOYW1lOwpAQCAtNjE2LDcgKzYzMSw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2V0IG9mIHRoaXMgY2hhcnNldCdzIGFsaWFzZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgc2V0IG9mIHRoaXMgY2hhcnNldCdzIGFsaWFzZXMKKyAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBzZXQgb2YgdGhpcyBjaGFyc2V0J3MgYWxpYXNlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU2V0PFN0cmluZz4gYWxpYXNlcygpIHsKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh0aGlzLmFsaWFzZXNTZXQpOwpAQCAtNjI1LDcgKzY0MSwxMiBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBjaGFyc2V0IGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNoYXJzZXQgZm9yIHRoZSBkZWZhdWx0IGxvY2FsZQorICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgd2hpY2ggYWx3YXlzIHJldHVybnMKKyAgICAgKiB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhpcyBjaGFyc2V0LiBTdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBNZXRob2QKKyAgICAgKiBtYXkgcmV0dXJuIGEgZGlzcGxheSBuYW1lIHRoYXQgd2FzIGxvY2FsaXplZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY2hhcnNldCBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZGlzcGxheU5hbWUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbE5hbWU7CkBAIC02MzQsMjAgKzY1NSwyNiBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBjaGFyc2V0IGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKiAKKyAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdoaWNoIGFsd2F5cyByZXR1cm5zCisgICAgICogdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoaXMgY2hhcnNldC4gU3ViY2xhc3NlcyBvdmVycmlkaW5nIHRoaXMgTWV0aG9kCisgICAgICogbWF5IHJldHVybiBhIGRpc3BsYXkgbmFtZSB0aGF0IHdhcyBsb2NhbGl6ZWQuCisgICAgICogCiAgICAgICogQHBhcmFtIGwKICAgICAgKiAgICAgICAgICAgIGEgY2VydGFpbiBsb2NhbGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY2hhcnNldCBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGUKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY2hhcnNldCBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBkaXNwbGF5TmFtZShMb2NhbGUgbCkgewogICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWxOYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNoYXJzZXQgaXMga25vd24gdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgSUFOQQorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2hhcnNldCBpcyBrbm93biB0byBiZSByZWdpc3RlcmVkIGluIHRoZSBJQU5BCiAgICAgICogQ2hhcnNldCBSZWdpc3RyeS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXJzZXQgaXMga25vd24gdG8gYmUgcmVnaXN0ZXJlZCwgb3RoZXJ3aXNlIHJldHVybnMKICAgICAgKiAgICAgICAgIGZhbHNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUmVnaXN0ZXJlZCgpIHsKICAgICAgICAgcmV0dXJuICFjYW5vbmljYWxOYW1lLnN0YXJ0c1dpdGgoIngtIikgLy8kTk9OLU5MUy0xJApAQCAtNjU1LDkgKzY4MiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNoYXJzZXQgc3VwcG9ydHMgZW5jb2RpbmcsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjaGFyc2V0IHN1cHBvcnRzIGVuY29kaW5nLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2hhcnNldCBzdXBwb3J0cyBlbmNvZGluZywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhbkVuY29kZSgpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC02NzIsOCArNzAwLDkgQEAKICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBidWZmZXIgY29udGFpbmluZyB0aGUgY29udGVudCB0byBiZSBlbmNvZGVkCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBlbmNvZGluZworICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBidWZmZXIgY29udGFpbmluZyB0aGUgY29udGVudCB0byBiZSBlbmNvZGVkLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZW5jb2RpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgc3luY2hyb25pemVkIHB1YmxpYyBmaW5hbCBCeXRlQnVmZmVyIGVuY29kZShDaGFyQnVmZmVyIGJ1ZmZlcikgewogICAgICAgICBDaGFyc2V0RW5jb2RlciBlID0gZ2V0Q2FjaGVkQ2hhcnNldEVuY29kZXIoY2Fub25pY2FsTmFtZSk7CkBAIC03MTEsMjQgKzc0MCwyNiBAQAogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBlbmNvZGVkCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBlbmNvZGluZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBlbmNvZGVkLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZW5jb2RpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEJ5dGVCdWZmZXIgZW5jb2RlKFN0cmluZyBzKSB7CiAgICAgICAgIHJldHVybiBlbmNvZGUoQ2hhckJ1ZmZlci53cmFwKHMpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZWNvZGVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlIGJ5dGUgYnVmZmVyIGFuZCBvdXRwdXRzIHRvIGEgY2hhcmFjdGVyCi0gICAgICogYnVmZmVyIHRoYXQgaXMgdG8gYmUgcmV0dXJuZWQuCisgICAgICogRGVjb2RlcyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGJ5dGUgYnVmZmVyIGFuZCB3cml0ZXMgaXQgdG8gYQorICAgICAqIGNoYXJhY3RlciBidWZmZXIgdGhhdCBpcyB0byBiZSByZXR1cm5lZC4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24gaW4gY2FzZSBvZiBkZWNvZGluZyBlcnJvcnMgaXMKICAgICAgKiA8Y29kZT5Db2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFPC9jb2RlPi4KICAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgdG8gYmUgZGVjb2RlZAotICAgICAqIEByZXR1cm4gYSBjaGFyYWN0ZXIgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG91dHB1dCBvZiB0aGUgZGVjb2RpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb250ZW50IHRvIGJlIGRlY29kZWQuCisgICAgICogQHJldHVybiBhIGNoYXJhY3RlciBidWZmZXIgY29udGFpbmluZyB0aGUgb3V0cHV0IG9mIHRoZSBkZWNvZGluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2hhckJ1ZmZlciBkZWNvZGUoQnl0ZUJ1ZmZlciBidWZmZXIpIHsKICAgICAgICAgQ2hhcnNldERlY29kZXIgZCA9IGdldENhY2hlZENoYXJzZXREZWNvZGVyKGNhbm9uaWNhbE5hbWUpOwpAQCAtNzY1LDEyICs3OTYsMTQgQEAKICAgICAgKi8KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgY2hhcnNldCB3aXRoIHRoZSBnaXZlbiBjaGFyc2V0LgorICAgICAqIENvbXBhcmVzIHRoaXMgY2hhcnNldCB3aXRoIHRoZSBnaXZlbiBjaGFyc2V0LiBUaGlzIGNvbXBhcmF0aW9uIGlzCisgICAgICogYmFzZWQgb24gdGhlIGNhc2UgaW5zZW5zaXRpdmUgY2Fub25pY2FsIG5hbWVzIG9mIHRoZSBjaGFyc2V0cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hhcnNldAotICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGguCiAgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgbGVzcyB0aGFuIHRoZSBnaXZlbiBvYmplY3QsIGEgcG9zaXRpdmUKLSAgICAgKiAgICAgICAgIGludGVnZXIgaWYgbGFyZ2VyIHRoYW4gaXQsIG9yIDAgaWYgZXF1YWwgdG8gaXQKKyAgICAgKiAgICAgICAgIGludGVnZXIgaWYgbGFyZ2VyIHRoYW4gaXQsIG9yIDAgaWYgZXF1YWwgdG8gaXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oQ2hhcnNldCBjaGFyc2V0KSB7CiAgICAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbE5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjaGFyc2V0LmNhbm9uaWNhbE5hbWUpOwpAQCAtNzg3LDggKzgyMCw5IEBACiAgICAgICogY29uc2lkZXJlZCB0byBiZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgY2Fub25pY2FsIG5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjYW5vbmljYWwgbmFtZSwgb3RoZXJ3aXNlIGZhbHNlCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGguCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjYW5vbmljYWwgbmFtZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CkBAIC04MDIsNyArODM2LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBjaGFyc2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBvZiB0aGlzIGNoYXJzZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBjaGFyc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7CkBAIC04MTMsNyArODQ4LDggQEAKICAgICAgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2hhcnNldC4gVXN1YWxseSB0aGlzIGNvbnRhaW5zIHRoZQogICAgICAqIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBjaGFyc2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjaGFyc2V0CisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNoYXJzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTgyMSw5ICs4NTcsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzeXN0ZW0gZGVmYXVsdCBjaGFyc2V0IGZyb20ganZtLgorICAgICAqIEdldHMgdGhlIHN5c3RlbSBkZWZhdWx0IGNoYXJzZXQgZnJvbSB0aGUgdmlydHVhbCBtYWNoaW5lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgY2hhcnNldAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgY2hhcnNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJzZXQgZGVmYXVsdENoYXJzZXQoKSB7CiAgICAgICAgIENoYXJzZXQgZGVmYXVsdENoYXJzZXQgPSBudWxsOwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXREZWNvZGVyLmphdmEgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldERlY29kZXIuamF2YQppbmRleCA1YzFiZTZlLi4zOGZiOWIyIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldERlY29kZXIuamF2YQorKysgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldERlY29kZXIuamF2YQpAQCAtMjQsNDUgKzI0LDQ1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm5pb2NoYXIuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEFuIGNvbnZlcnRlciB0aGF0IGNhbiBjb252ZXJ0IGJ5dGVzIHNlcXVlbmNlIGluIHNvbWUgY2hhcnNldCB0byAxNi1iaXQKKyAqIEEgY29udmVydGVyIHRoYXQgY2FuIGNvbnZlcnQgYSBieXRlIHNlcXVlbmNlIGZyb20gYSBjaGFyc2V0IGludG8gYSAxNi1iaXQKICAqIFVuaWNvZGUgY2hhcmFjdGVyIHNlcXVlbmNlLgogICogPHA+Ci0gKiBUaGUgaW5wdXQgYnl0ZSBzZXF1ZW5jZSBpcyB3cmFwcGVkIGJ5IHtAbGluayBqYXZhLm5pby5CeXRlQnVmZmVyIEJ5dGVCdWZmZXJ9Ci0gKiBhbmQgdGhlIG91dHB1dCBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMge0BsaW5rIGphdmEubmlvLkNoYXJCdWZmZXIgQ2hhckJ1ZmZlcn0uCi0gKiBBIGRlY29kZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIHVzZWQgaW4gZm9sbG93aW5nIHNlcXVlbmNlLCB3aGljaCBpcyByZWZlcnJlZCB0bwotICogYXMgYSBkZWNvZGluZyBvcGVyYXRpb246CisgKiBUaGUgaW5wdXQgYnl0ZSBzZXF1ZW5jZSBpcyB3cmFwcGVkIGJ5IGEKKyAqIHtAbGluayBqYXZhLm5pby5CeXRlQnVmZmVyIEJ5dGVCdWZmZXJ9IGFuZCB0aGUgb3V0cHV0IGNoYXJhY3RlciBzZXF1ZW5jZSBpcyBhCisgKiB7QGxpbmsgamF2YS5uaW8uQ2hhckJ1ZmZlciBDaGFyQnVmZmVyfS4gQSBkZWNvZGVyIGluc3RhbmNlIHNob3VsZCBiZSB1c2VkIGluCisgKiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlLCB3aGljaCBpcyByZWZlcnJlZCB0byBhcyBhIGRlY29kaW5nIG9wZXJhdGlvbjoKICAqIDxvbD4KLSAqIDxsaT5JbnZva2luZyB0aGUge0BsaW5rICNyZXNldCgpIHJlc2V0fSBtZXRob2QgdG8gcmVzZXQgdGhlIGRlY29kZXIgaWYgdGhlCisgKiA8bGk+aW52b2tpbmcgdGhlIHtAbGluayAjcmVzZXQoKSByZXNldH0gbWV0aG9kIHRvIHJlc2V0IHRoZSBkZWNvZGVyIGlmIHRoZQogICogZGVjb2RlciBoYXMgYmVlbiB1c2VkOzwvbGk+Ci0gKiA8bGk+SW52b2tpbmcgdGhlIHtAbGluayAjZGVjb2RlKEJ5dGVCdWZmZXIsIENoYXJCdWZmZXIsIGJvb2xlYW4pIGRlY29kZX0KKyAqIDxsaT5pbnZva2luZyB0aGUge0BsaW5rICNkZWNvZGUoQnl0ZUJ1ZmZlciwgQ2hhckJ1ZmZlciwgYm9vbGVhbikgZGVjb2RlfQogICogbWV0aG9kIHVudGlsIHRoZSBhZGRpdGlvbmFsIGlucHV0IGlzIG5vdCBuZWVkZWQsIHRoZSA8Y29kZT5lbmRPZklucHV0PC9jb2RlPgogICogcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvIGZhbHNlLCB0aGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgZmlsbGVkIGFuZCB0aGUKICAqIG91dHB1dCBidWZmZXIgbXVzdCBiZSBmbHVzaGVkIGJldHdlZW4gaW52b2NhdGlvbnM7PC9saT4KLSAqIDxsaT5JbnZva2luZyB0aGUge0BsaW5rICNkZWNvZGUoQnl0ZUJ1ZmZlciwgQ2hhckJ1ZmZlciwgYm9vbGVhbikgZGVjb2RlfQotICogbWV0aG9kIGxhc3QgdGltZSwgYW5kIHRoZSB0aGUgPGNvZGU+ZW5kT2ZJbnB1dDwvY29kZT4gcGFyYW1ldGVyIG11c3QgYmUgc2V0Ci0gKiB0byB0cnVlPC9saT4KLSAqIDxsaT5JbnZva2luZyB0aGUge0BsaW5rICNmbHVzaChDaGFyQnVmZmVyKSBmbHVzaH0gbWV0aG9kIHRvIGZsdXNoIHRoZQorICogPGxpPmludm9raW5nIHRoZSB7QGxpbmsgI2RlY29kZShCeXRlQnVmZmVyLCBDaGFyQnVmZmVyLCBib29sZWFuKSBkZWNvZGV9CisgKiBtZXRob2QgZm9yIHRoZSBsYXN0IHRpbWUsIGFuZCB0aGVuIHRoZSA8Y29kZT5lbmRPZklucHV0PC9jb2RlPiBwYXJhbWV0ZXIKKyAqIG11c3QgYmUgc2V0IHRvIHRydWU7PC9saT4KKyAqIDxsaT5pbnZva2luZyB0aGUge0BsaW5rICNmbHVzaChDaGFyQnVmZmVyKSBmbHVzaH0gbWV0aG9kIHRvIGZsdXNoIHRoZQogICogb3V0cHV0LjwvbGk+CiAgKiA8L29sPgogICogPC9wPgogICogPHA+CiAgKiBUaGUge0BsaW5rICNkZWNvZGUoQnl0ZUJ1ZmZlciwgQ2hhckJ1ZmZlciwgYm9vbGVhbikgZGVjb2RlfSBtZXRob2Qgd2lsbAotICogY29udmVydCBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlLCBhbmQgdGhlIHByb2Nlc3Mgd29uJ3Qgc3RvcCBleGNlcHQgdGhlCi0gKiBpbnB1dCBieXRlcyBoYXMgYmVlbiBydW4gb3V0IG9mLCB0aGUgb3V0cHV0IGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQgb3Igc29tZQotICogZXJyb3IgaGFzIGhhcHBlbmVkLiBBIHtAbGluayBDb2RlclJlc3VsdCBDb2RlclJlc3VsdH0gaW5zdGFuY2Ugd2lsbCBiZQotICogcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhlIHN0b3AgcmVhc29uLCBhbmQgdGhlIGludm9rZXIgY2FuIGlkZW50aWZ5IHRoZSByZXN1bHQKLSAqIGFuZCBjaG9vc2UgZnVydGhlciBhY3Rpb24sIHdoaWNoIGNhbiBpbmNsdWRlIGZpbGxpbmcgdGhlIGlucHV0IGJ1ZmZlciwKLSAqIGZsdXNoaW5nIHRoZSBvdXRwdXQgYnVmZmVyLCByZWNvdmVyaW5nIGZyb20gZXJyb3IgYW5kIHRyeWluZyBhZ2Fpbi4KKyAqIGNvbnZlcnQgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZSwgYW5kIHRoZSBwcm9jZXNzIHdvbid0IHN0b3AgdW50aWwgdGhlIGlucHV0CisgKiBieXRlcyBoYXZlIHJ1biBvdXQsIHRoZSBvdXRwdXQgYnVmZmVyIGhhcyBiZWVuIGZpbGxlZCBvciBzb21lIGVycm9yIGhhcworICogaGFwcGVuZWQuIEEge0BsaW5rIENvZGVyUmVzdWx0IENvZGVyUmVzdWx0fSBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIHRvCisgKiBpbmRpY2F0ZSB0aGUgc3RvcCByZWFzb24sIGFuZCB0aGUgaW52b2tlciBjYW4gaWRlbnRpZnkgdGhlIHJlc3VsdCBhbmQgY2hvb3NlCisgKiBmdXJ0aGVyIGFjdGlvbiwgd2hpY2ggaW5jbHVkZXMgZmlsbGluZyB0aGUgaW5wdXQgYnVmZmVyLCBmbHVzaGluZyB0aGUgb3V0cHV0CisgKiBidWZmZXIgb3IgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yIGFuZCB0cnlpbmcgYWdhaW4uCiAgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZXJlIGFyZSB0d28gY29tbW9uIGRlY29kaW5nIGVycm9ycy4gT25lIGlzIG5hbWVkIGFzIG1hbGZvcm1lZCBhbmQgaXQgaXMKLSAqIHJldHVybmVkIHdoZW4gdGhlIGlucHV0IGJ5dGUgc2VxdWVuY2UgaXMgaWxsZWdhbCBmb3IgY3VycmVudCBzcGVjaWZpYwotICogY2hhcnNldCwgdGhlIG90aGVyIGlzIG5hbWVkIGFzIHVubWFwcGFibGUgY2hhcmFjdGVyIGFuZCBpdCBpcyByZXR1cm5lZCB3aGVuIGEKKyAqIFRoZXJlIGFyZSB0d28gY29tbW9uIGRlY29kaW5nIGVycm9ycy4gT25lIGlzIG5hbWVkIG1hbGZvcm1lZCBhbmQgaXQgaXMKKyAqIHJldHVybmVkIHdoZW4gdGhlIGlucHV0IGJ5dGUgc2VxdWVuY2UgaXMgaWxsZWdhbCBmb3IgdGhlIGN1cnJlbnQgc3BlY2lmaWMKKyAqIGNoYXJzZXQsIHRoZSBvdGhlciBpcyBuYW1lZCB1bm1hcHBhYmxlIGNoYXJhY3RlciBhbmQgaXQgaXMgcmV0dXJuZWQgd2hlbiBhCiAgKiBwcm9ibGVtIG9jY3VycyBtYXBwaW5nIGEgbGVnYWwgaW5wdXQgYnl0ZSBzZXF1ZW5jZSB0byBpdHMgVW5pY29kZSBjaGFyYWN0ZXIKICAqIGVxdWl2YWxlbnQuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSB0d28gZXJyb3JzIGNhbiBiZSBoYW5kbGVkIGluIHRocmVlIHdheXMsIHRoZSBkZWZhdWx0IG9uZSBpcyB0byByZXBvcnQgdGhlCisgKiBCb3RoIGVycm9ycyBjYW4gYmUgaGFuZGxlZCBpbiB0aHJlZSB3YXlzLCB0aGUgZGVmYXVsdCBvbmUgaXMgdG8gcmVwb3J0IHRoZQogICogZXJyb3IgdG8gdGhlIGludm9rZXIgYnkgYSB7QGxpbmsgQ29kZXJSZXN1bHQgQ29kZXJSZXN1bHR9IGluc3RhbmNlLCBhbmQgdGhlCiAgKiBhbHRlcm5hdGl2ZXMgYXJlIHRvIGlnbm9yZSBpdCBvciB0byByZXBsYWNlIHRoZSBlcnJvbmVvdXMgaW5wdXQgd2l0aCB0aGUKICAqIHJlcGxhY2VtZW50IHN0cmluZy4gVGhlIHJlcGxhY2VtZW50IHN0cmluZyBpcyAiXHVGRkZEIiBieSBkZWZhdWx0IGFuZCBjYW4gYmUKQEAgLTc0LDEyICs3NCwxMiBAQAogICogbWV0aG9kLgogICogPC9wPgogICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIGFic3RyYWN0IGNsYXNzIGFuZCBlbmNhcHN1bGF0ZSBtYW55IGNvbW1vbiBvcGVyYXRpb25zIG9mCi0gKiBkZWNvZGluZyBwcm9jZXNzIGZvciBhbGwgY2hhcnNldHMuIERlY29kZXIgZm9yIHNwZWNpZmljIGNoYXJzZXQgc2hvdWxkIGV4dGVuZAotICogdGhpcyBjbGFzcyBhbmQgbmVlZCBvbmx5IGltcGxlbWVudAotICoge0BsaW5rICNkZWNvZGVMb29wKEJ5dGVCdWZmZXIsIENoYXJCdWZmZXIpIGRlY29kZUxvb3B9IG1ldGhvZCBmb3IgYmFzaWMKLSAqIGRlY29kaW5nIGxvb3AuIElmIGEgc3ViY2xhc3MgbWFpbnRhaW5zIGludGVybmFsIHN0YXRlLCBpdCBzaG91bGQgb3ZlcnJpZGUgdGhlCi0gKiB7QGxpbmsgI2ltcGxGbHVzaChDaGFyQnVmZmVyKSBpbXBsRmx1c2h9IG1ldGhvZCBhbmQKKyAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIGVuY2Fwc3VsYXRlcyBtYW55IGNvbW1vbiBvcGVyYXRpb25zIG9mIHRoZQorICogZGVjb2RpbmcgcHJvY2VzcyBmb3IgYWxsIGNoYXJzZXRzLiBEZWNvZGVycyBmb3IgYSBzcGVjaWZpYyBjaGFyc2V0IHNob3VsZAorICogZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIG5lZWQgb25seSB0byBpbXBsZW1lbnQgdGhlCisgKiB7QGxpbmsgI2RlY29kZUxvb3AoQnl0ZUJ1ZmZlciwgQ2hhckJ1ZmZlcikgZGVjb2RlTG9vcH0gbWV0aG9kIGZvciB0aGUgYmFzaWMKKyAqIGRlY29kaW5nLiBJZiBhIHN1YmNsYXNzIG1haW50YWlucyBhbiBpbnRlcm5hbCBzdGF0ZSwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoZQorICoge0BsaW5rICNpbXBsRmx1c2goQ2hhckJ1ZmZlcikgaW1wbEZsdXNofSBtZXRob2QgYW5kIHRoZQogICoge0BsaW5rICNpbXBsUmVzZXQoKSBpbXBsUmVzZXR9IG1ldGhvZCBpbiBhZGRpdGlvbi4KICAqIDwvcD4KICAqIDxwPgpAQCAtODgsNiArODgsNyBAQAogICogCiAgKiBAc2VlIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldAogICogQHNlZSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENoYXJzZXREZWNvZGVyIHsKICAgICAvKgpAQCAtMTM1LDIzICsxMzYsMjMgQEAKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+Q2hhcnNldERlY29kZXI8L2NvZGU+IHVzaW5nIGdpdmVuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5DaGFyc2V0RGVjb2RlcjwvY29kZT4gdXNpbmcgdGhlIGdpdmVuCiAgICAgICogPGNvZGU+Q2hhcnNldDwvY29kZT4sIGF2ZXJhZ2UgbnVtYmVyIGFuZCBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzCiAgICAgICogY3JlYXRlZCBieSB0aGlzIGRlY29kZXIgZm9yIG9uZSBpbnB1dCBieXRlLCBhbmQgdGhlIGRlZmF1bHQgcmVwbGFjZW1lbnQKICAgICAgKiBzdHJpbmcgIlx1RkZGRCIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNoYXJzZXQKLSAgICAgKiAgICAgICAgICAgIHRoaXMgZGVjb2RlcidzIDxjb2RlPkNoYXJzZXQ8L2NvZGU+LCB3aGljaCBjcmVhdGUgdGhpcwotICAgICAqICAgICAgICAgICAgZGVjb2RlcgorICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IHRvIGJlIHVzZWQgYnkgdGhpcyBkZWNvZGVyLgogICAgICAqIEBwYXJhbSBhdmVyYWdlQ2hhcnNQZXJCeXRlCi0gICAgICogICAgICAgICAgICBhdmVyYWdlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBkZWNvZGVyIGZvciBvbmUKLSAgICAgKiAgICAgICAgICAgIGlucHV0IGJ5dGUsIG11c3QgYmUgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdmVyYWdlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBkZWNvZGVyIGZvcgorICAgICAqICAgICAgICAgICAgb25lIGlucHV0IGJ5dGUsIG11c3QgYmUgcG9zaXRpdmUuCiAgICAgICogQHBhcmFtIG1heENoYXJzUGVyQnl0ZQotICAgICAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBjcmVhdGVkIGJ5IHRoaXMgZGVjb2RlciBmb3Igb25lCi0gICAgICogICAgICAgICAgICBpbnB1dCBieXRlLCBtdXN0IGJlIHBvc2l0aXZlCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBjcmVhdGVkIGJ5IHRoaXMgZGVjb2RlciBmb3IKKyAgICAgKiAgICAgICAgICAgIG9uZSBpbnB1dCBieXRlLCBtdXN0IGJlIHBvc2l0aXZlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+YXZlcmFnZUNoYXJzUGVyQnl0ZTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5tYXhDaGFyc1BlckJ5dGU8L2NvZGU+IGlzIG5lZ2F0aXZlCisgICAgICogICAgICAgICAgICAgPGNvZGU+bWF4Q2hhcnNQZXJCeXRlPC9jb2RlPiBpcyBuZWdhdGl2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2hhcnNldERlY29kZXIoQ2hhcnNldCBjaGFyc2V0LCBmbG9hdCBhdmVyYWdlQ2hhcnNQZXJCeXRlLAogICAgICAgICAgICAgZmxvYXQgbWF4Q2hhcnNQZXJCeXRlKSB7CkBAIC0xNzcsNTcgKzE3OCw2MiBAQAogICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwogICAgIC8qKgotICAgICAqIGdldCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjcmVhdGVkIGJ5IHRoaXMgZGVjb2RlciBmb3Igc2luZ2xlCi0gICAgICogaW5wdXQgYnl0ZQorICAgICAqIEdldHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY3JlYXRlZCBieSB0aGlzIGRlY29kZXIgZm9yIGEKKyAgICAgKiBzaW5nbGUgaW5wdXQgYnl0ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdmVyYWdlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBkZWNvZGVyIGZvcgotICAgICAqICAgICAgICAgc2luZ2xlIGlucHV0IGJ5dGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhdmVyYWdlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBkZWNvZGVyIGZvciBhCisgICAgICogICAgICAgICBzaW5nbGUgaW5wdXQgYnl0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZmxvYXQgYXZlcmFnZUNoYXJzUGVyQnl0ZSgpIHsKICAgICAgICAgcmV0dXJuIGF2ZXJDaGFyczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IHdoaWNoIGNyZWF0ZXMgdGhpcyBkZWNvZGVyLgorICAgICAqIEdldHMgdGhlIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IHdoaWNoIHRoaXMgZGVjb2RlciB1c2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IHdoaWNoIGNyZWF0ZXMgdGhpcyBkZWNvZGVyCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+Q2hhcnNldDwvY29kZT4gd2hpY2ggdGhpcyBkZWNvZGVyIHVzZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENoYXJzZXQgY2hhcnNldCgpIHsKICAgICAgICAgcmV0dXJuIGNzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBmYWNhZGUgbWV0aG9kIGZvciBkZWNvZGluZyBvcGVyYXRpb24uCisgICAgICogVGhpcyBpcyBhIGZhY2FkZSBtZXRob2QgZm9yIHRoZSBkZWNvZGluZyBvcGVyYXRpb24uCiAgICAgICogPHA+CiAgICAgICogVGhpcyBtZXRob2QgZGVjb2RlcyB0aGUgcmVtYWluaW5nIGJ5dGUgc2VxdWVuY2Ugb2YgdGhlIGdpdmVuIGJ5dGUgYnVmZmVyCiAgICAgICogaW50byBhIG5ldyBjaGFyYWN0ZXIgYnVmZmVyLiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBhIGNvbXBsZXRlIGRlY29kaW5nCiAgICAgICogb3BlcmF0aW9uLCByZXNldHMgYXQgZmlyc3QsIHRoZW4gZGVjb2RlcywgYW5kIGZsdXNoZXMgYXQgbGFzdC4KICAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGlmIGFub3RoZXIgZGVjb2RlIG9wZXJhdGlvbiBpcyBvbmdvaW5nLgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCB3aGlsZSBhbm90aGVyIHtAY29kZSBkZWNvZGV9IG9wZXJhdGlvbgorICAgICAqIGlzIG9uZ29pbmcuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KICAgICAgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPkNoYXJCdWZmZXI8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHRoZSBjaGFyYWN0ZXJzCiAgICAgICogICAgICAgICBwcm9kdWNlZCBieSB0aGlzIGRlY29kaW5nIG9wZXJhdGlvbi4gVGhlIGJ1ZmZlcidzIGxpbWl0IHdpbGwgYmUKLSAgICAgKiAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiBsYXN0IGNoYXJhY3RlciBpbiBidWZmZXIsIGFuZCB0aGUgcG9zaXRpb24gd2lsbAotICAgICAqICAgICAgICAgYmUgemVybworICAgICAqICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCBhbmQgdGhlCisgICAgICogICAgICAgICBwb3NpdGlvbiB3aWxsIGJlIHplcm8uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIGRlY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBkZWNvZGluZyBvcGVyYXRpb24gaXMgb25nb2luZy4KICAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgaWxsZWdhbCBpbnB1dCBieXRlIHNlcXVlbmNlIGZvciB0aGlzIGNoYXJzZXQgZW5jb3VudGVyZWQsCi0gICAgICogICAgICAgICAgICAgYW5kIHRoZSBhY3Rpb24gZm9yIG1hbGZvcm1lZCBlcnJvciBpcworICAgICAqICAgICAgICAgICAgIGlmIGFuIGlsbGVnYWwgaW5wdXQgYnl0ZSBzZXF1ZW5jZSBmb3IgdGhpcyBjaGFyc2V0IHdhcworICAgICAqICAgICAgICAgICAgIGVuY291bnRlcmVkLCBhbmQgdGhlIGFjdGlvbiBmb3IgbWFsZm9ybWVkIGVycm9yIGlzCiAgICAgICogICAgICAgICAgICAge0BsaW5rIENvZGluZ0Vycm9yQWN0aW9uI1JFUE9SVCBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlR9CiAgICAgICogQHRocm93cyBVbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbGVnYWwgYnV0IHVubWFwcGFibGUgaW5wdXQgYnl0ZSBzZXF1ZW5jZSBmb3IgdGhpcyBjaGFyc2V0Ci0gICAgICogICAgICAgICAgICAgZW5jb3VudGVyZWQsIGFuZCB0aGUgYWN0aW9uIGZvciB1bm1hcHBhYmxlIGNoYXJhY3RlciBlcnJvciBpcworICAgICAqICAgICAgICAgICAgIGlmIGEgbGVnYWwgYnV0IHVubWFwcGFibGUgaW5wdXQgYnl0ZSBzZXF1ZW5jZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgIGNoYXJzZXQgd2FzIGVuY291bnRlcmVkLCBhbmQgdGhlIGFjdGlvbiBmb3IgdW5tYXBwYWJsZQorICAgICAqICAgICAgICAgICAgIGNoYXJhY3RlciBlcnJvciBpcwogICAgICAqICAgICAgICAgICAgIHtAbGluayBDb2RpbmdFcnJvckFjdGlvbiNSRVBPUlQgQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUfS4KICAgICAgKiAgICAgICAgICAgICBVbm1hcHBhYmxlIG1lYW5zIHRoZSBieXRlIHNlcXVlbmNlIGF0IHRoZSBpbnB1dCBidWZmZXIncwogICAgICAqICAgICAgICAgICAgIGN1cnJlbnQgcG9zaXRpb24gY2Fubm90IGJlIG1hcHBlZCB0byBhIFVuaWNvZGUgY2hhcmFjdGVyCiAgICAgICogICAgICAgICAgICAgc2VxdWVuY2UuCiAgICAgICogQHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBvdGhlciBleGNlcHRpb24gaGFwcGVuZWQgZHVyaW5nIHRoZSBkZWNvZGUgb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBleGNlcHRpb24gaGFwcGVuZWQgZHVyaW5nIHRoZSBkZWNvZGUgb3BlcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDaGFyQnVmZmVyIGRlY29kZShCeXRlQnVmZmVyIGluKQogICAgICAgICAgICAgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CkBAIC0zMTMsNDkgKzMxOSw1MSBAQAogICAgICAqIG9wZXJhdGlvbiBtYXkgYmUgcmVnYXJkZWQgYXMgY29tcGxldGUuIE90aGVyd2lzZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlCiAgICAgICogY2FsbGVkIG9uY2UgbW9yZSB3aXRoIGFkZGl0aW9uYWwgaW5wdXQuPC9saT4KICAgICAgKiA8bGk+QSB7QGxpbmsgQ29kZXJSZXN1bHQjbWFsZm9ybWVkRm9yTGVuZ3RoKGludCkgbWFsZm9ybWVkIGlucHV0fSByZXN1bHQKLSAgICAgKiBpbmRpY2F0ZXMgdGhhdCBzb21lIG1hbGZvcm1lZCBpbnB1dCBlcnJvciBlbmNvdW50ZXJlZCwgYW5kIHRoZSBlcnJvbmVvdXMKLSAgICAgKiBieXRlcyBzdGFydCBhdCB0aGUgaW5wdXQgYnVmZmVyJ3MgcG9zaXRpb24gYW5kIHRoZWlyIG51bWJlciBjYW4gYmUgZ290IGJ5Ci0gICAgICogcmVzdWx0J3Mge0BsaW5rIENvZGVyUmVzdWx0I2xlbmd0aCgpIGxlbmd0aH0uIFRoaXMga2luZCBvZiByZXN1bHQgY2FuIGJlCi0gICAgICogcmV0dXJuZWQgb25seSBpZiB0aGUgbWFsZm9ybWVkIGFjdGlvbiBpcworICAgICAqIGluZGljYXRlcyB0aGF0IHNvbWUgbWFsZm9ybWVkIGlucHV0IGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLCBhbmQgdGhlCisgICAgICogZXJyb25lb3VzIGJ5dGVzIHN0YXJ0IGF0IHRoZSBpbnB1dCBidWZmZXIncyBwb3NpdGlvbiBhbmQgdGhlaXIgbnVtYmVyIGNhbgorICAgICAqIGJlIGdvdCBieSByZXN1bHQncyB7QGxpbmsgQ29kZXJSZXN1bHQjbGVuZ3RoKCkgbGVuZ3RofS4gVGhpcyBraW5kIG9mCisgICAgICogcmVzdWx0IGNhbiBiZSByZXR1cm5lZCBvbmx5IGlmIHRoZSBtYWxmb3JtZWQgYWN0aW9uIGlzCiAgICAgICoge0BsaW5rIENvZGluZ0Vycm9yQWN0aW9uI1JFUE9SVCBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlR9LiA8L2xpPgogICAgICAqIDxsaT5BIHtAbGluayBDb2RlclJlc3VsdCN1bm1hcHBhYmxlRm9yTGVuZ3RoKGludCkgdW5tYXBwYWJsZSBjaGFyYWN0ZXJ9Ci0gICAgICogcmVzdWx0IGluZGljYXRlcyB0aGF0IHNvbWUgdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IgZW5jb3VudGVyZWQsIGFuZAotICAgICAqIHRoZSBlcnJvbmVvdXMgYnl0ZXMgc3RhcnQgYXQgdGhlIGlucHV0IGJ1ZmZlcidzIHBvc2l0aW9uIGFuZCB0aGVpciBudW1iZXIKLSAgICAgKiBjYW4gYmUgZ290IGJ5IHJlc3VsdCdzIHtAbGluayBDb2RlclJlc3VsdCNsZW5ndGgoKSBsZW5ndGh9LiBUaGlzIGtpbmQgb2YKLSAgICAgKiByZXN1bHQgY2FuIGJlIHJldHVybmVkIG9ubHkgaWYgdGhlIHVubWFwcGFibGUgY2hhcmFjdGVyIGFjdGlvbiBpcworICAgICAqIHJlc3VsdCBpbmRpY2F0ZXMgdGhhdCBzb21lIHVubWFwcGFibGUgY2hhcmFjdGVyIGVycm9yIGhhcyBiZWVuCisgICAgICogZW5jb3VudGVyZWQsIGFuZCB0aGUgZXJyb25lb3VzIGJ5dGVzIHN0YXJ0IGF0IHRoZSBpbnB1dCBidWZmZXIncyBwb3NpdGlvbgorICAgICAqIGFuZCB0aGVpciBudW1iZXIgY2FuIGJlIGdvdCBieSByZXN1bHQncworICAgICAqIHtAbGluayBDb2RlclJlc3VsdCNsZW5ndGgoKSBsZW5ndGh9LiBUaGlzIGtpbmQgb2YgcmVzdWx0IGNhbiBiZSByZXR1cm5lZAorICAgICAqIG9ubHkgaWYgdGhlIHVubWFwcGFibGUgY2hhcmFjdGVyIGFjdGlvbiBpcwogICAgICAqIHtAbGluayBDb2RpbmdFcnJvckFjdGlvbiNSRVBPUlQgQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUfS4gPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+ZW5kT2ZJbnB1dDwvY29kZT4gcGFyYW1ldGVyIGluZGljYXRlcyB0aGF0IGlmIHRoZSBpbnZva2VyIGNhbgotICAgICAqIHByb3ZpZGVyIGZ1cnRoZXIgaW5wdXQuIFRoaXMgcGFyYW1ldGVyIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGJ5dGVzCi0gICAgICogaW4gY3VycmVudCBpbnB1dCBidWZmZXIgYXJlIGFsbCBpbnB1dHMgZm9yIHRoaXMgZGVjb2Rpbmcgb3BlcmF0aW9uLiBOb3RlCi0gICAgICogdGhhdCBpdCBpcyBjb21tb24gYW5kIHdvbid0IGNhdXNlIGVycm9yIHRoYXQgdGhlIGludm9rZXIgc2V0cyBmYWxzZSBhbmQKLSAgICAgKiB0aGVuIGZpbmRzIG5vIG1vcmUgaW5wdXQgYXZhaWxhYmxlOyB3aGlsZSBpdCBtYXkgY2F1c2UgZXJyb3IgdGhhdCB0aGUKLSAgICAgKiBpbnZva2VyIGFsd2F5cyBzZXRzIHRydWUgaW4gc2V2ZXJhbCBjb25zZWN1dGl2ZSBpbnZvY2F0aW9ucyBzbyB0aGF0IGFueQotICAgICAqIHJlbWFpbmluZyBpbnB1dCB3aWxsIGJlIHRyZWF0ZWQgYXMgbWFsZm9ybWVkIGlucHV0LgorICAgICAqIFRoZSA8Y29kZT5lbmRPZklucHV0PC9jb2RlPiBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGludm9rZXIgY2Fubm90CisgICAgICogcHJvdmlkZSBmdXJ0aGVyIGlucHV0LiBUaGlzIHBhcmFtZXRlciBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBieXRlcyBpbgorICAgICAqIGN1cnJlbnQgaW5wdXQgYnVmZmVyIGFyZSBhbGwgaW5wdXRzIGZvciB0aGlzIGRlY29kaW5nIG9wZXJhdGlvbi4gTm90ZQorICAgICAqIHRoYXQgaXQgaXMgY29tbW9uIGFuZCB3b24ndCBjYXVzZSBhbiBlcnJvciBpZiB0aGUgaW52b2tlciBzZXRzIGZhbHNlIGFuZAorICAgICAqIHRoZW4gY2FuJ3QgcHJvdmlkZSBtb3JlIGlucHV0LCB3aGlsZSBpdCBtYXkgY2F1c2UgYW4gZXJyb3IgaWYgdGhlIGludm9rZXIKKyAgICAgKiBhbHdheXMgc2V0cyB0cnVlIGluIHNldmVyYWwgY29uc2VjdXRpdmUgaW52b2NhdGlvbnMuIFRoaXMgd291bGQgbWFrZSB0aGUKKyAgICAgKiByZW1haW5pbmcgaW5wdXQgdG8gYmUgdHJlYXRlZCBhcyBtYWxmb3JtZWQgaW5wdXQuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMKKyAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIHRoZQogICAgICAqIHtAbGluayAjZGVjb2RlTG9vcChCeXRlQnVmZmVyLCBDaGFyQnVmZmVyKSBkZWNvZGVMb29wfSBtZXRob2QgdG8KLSAgICAgKiBpbXBsZW1lbnQgYmFzaWMgZGVjb2RlIGxvZ2ljIGZvciBzcGVjaWZpYyBjaGFyc2V0LgorICAgICAqIGltcGxlbWVudCB0aGUgYmFzaWMgZGVjb2RlIGxvZ2ljIGZvciBhIHNwZWNpZmljIGNoYXJzZXQuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCiAgICAgICogQHBhcmFtIGVuZE9mSW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgYWxsIHRoZSBpbnB1dCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBwcm92aWRlZAorICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiBhbGwgdGhlIGlucHV0IGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHByb3ZpZGVkLgogICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db2RlclJlc3VsdDwvY29kZT4gaW5zdGFuY2Ugd2hpY2ggaW5kaWNhdGVzIHRoZSByZWFzb24KLSAgICAgKiAgICAgICAgIG9mIHRlcm1pbmF0aW9uCisgICAgICogICAgICAgICBvZiB0ZXJtaW5hdGlvbi4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGRlY29kaW5nIGhhcyBzdGFydGVkIG9yIG5vIG1vcmUgaW5wdXQgaXMgbmVlZGVkIGluIHRoaXMKICAgICAgKiAgICAgICAgICAgICBkZWNvZGluZyBwcm9ncmVzcy4KICAgICAgKiBAdGhyb3dzIENvZGVyTWFsZnVuY3Rpb25FcnJvcgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGxpbmsgI2RlY29kZUxvb3AoQnl0ZUJ1ZmZlciwgQ2hhckJ1ZmZlcikgZGVjb2RlTG9vcH0KICAgICAgKiAgICAgICAgICAgICBtZXRob2QgdGhyZXcgYW4gPGNvZGU+QnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIDxjb2RlPkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ29kZXJSZXN1bHQgZGVjb2RlKEJ5dGVCdWZmZXIgaW4sIENoYXJCdWZmZXIgb3V0LAogICAgICAgICAgICAgYm9vbGVhbiBlbmRPZklucHV0KSB7CkBAIC00MTMsMTAyICs0MjEsMTE1IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXJlc3VsdC5pc01hbGZvcm1lZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgcmVtb3ZlZCBpbiBIYXJtb255IHJldmlzaW9uIDUxODA0NworICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIG1ha2luZyB0aGUgY29uZGl0aW9uYWwgc3RhdGVtZW50IHVuY29uZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAvLyBsZWFkcyB0byBtaXNiZWhhdmlvciB3aGVuIHVzaW5nIFJFUExBQ0Ugb24gbWFsZm9ybWVkSW5wdXQuCiAgICAgICAgICAgICAgICAgaW4ucG9zaXRpb24oaW4ucG9zaXRpb24oKSArIHJlc3VsdC5sZW5ndGgoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZWNvZGUgYnl0ZXMgaW50byBjaGFyYWN0ZXJzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKKyAgICAgKiBEZWNvZGVzIGJ5dGVzIGludG8gY2hhcmFjdGVycy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZQogICAgICAqIHtAbGluayAjZGVjb2RlKEJ5dGVCdWZmZXIsIENoYXJCdWZmZXIsIGJvb2xlYW4pIGRlY29kZX0gbWV0aG9kLgotICAgICAqIAorICAgICAqIDxwPgogICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBlc3NlbnRpYWwgZGVjb2Rpbmcgb3BlcmF0aW9uLCBhbmQgaXQgd29uJ3QKICAgICAgKiBzdG9wIGRlY29kaW5nIHVudGlsIGVpdGhlciBhbGwgdGhlIGlucHV0IGJ5dGVzIGFyZSByZWFkLCB0aGUgb3V0cHV0Ci0gICAgICogYnVmZmVyIGlzIGZpbGxlZCwgb3Igc29tZSBleGNlcHRpb24gZW5jb3VudGVyZWQuIEFuZCB0aGVuIGl0IHdpbGwgcmV0dXJuCi0gICAgICogYSA8Y29kZT5Db2RlclJlc3VsdDwvY29kZT4gb2JqZWN0IGluZGljYXRpbmcgdGhlIHJlc3VsdCBvZiBjdXJyZW50CisgICAgICogYnVmZmVyIGlzIGZpbGxlZCwgb3Igc29tZSBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQuIFRoZW4gaXQgd2lsbCByZXR1cm4gYQorICAgICAqIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgcmVzdWx0IG9mIGN1cnJlbnQKICAgICAgKiBkZWNvZGluZyBvcGVyYXRpb24uIFRoZSBydWxlcyB0byBjb25zdHJ1Y3QgdGhlIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPgotICAgICAqIGlzIHNhbWUgYXMgdGhlIHtAbGluayAjZGVjb2RlKEJ5dGVCdWZmZXIsIENoYXJCdWZmZXIsIGJvb2xlYW4pIGRlY29kZX0uCi0gICAgICogV2hlbiBleGNlcHRpb24gZW5jb3VudGVyZWQgaW4gdGhlIGRlY29kaW5nIG9wZXJhdGlvbiwgbW9zdCBpbXBsZW1lbnRhdGlvbgotICAgICAqIG9mIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgcmVsZXZhbnQgcmVzdWx0IG9iamVjdCB0bworICAgICAqIGFyZSB0aGUgc2FtZSBhcyBmb3IKKyAgICAgKiB7QGxpbmsgI2RlY29kZShCeXRlQnVmZmVyLCBDaGFyQnVmZmVyLCBib29sZWFuKSBkZWNvZGV9LiBXaGVuIGFuCisgICAgICogZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkIGluIHRoZSBkZWNvZGluZyBvcGVyYXRpb24sIG1vc3QgaW1wbGVtZW50YXRpb25zCisgICAgICogb2YgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSByZWxldmFudCByZXN1bHQgb2JqZWN0IHRvIHRoZQogICAgICAqIHtAbGluayAjZGVjb2RlKEJ5dGVCdWZmZXIsIENoYXJCdWZmZXIsIGJvb2xlYW4pIGRlY29kZX0gbWV0aG9kLCBhbmQgc29tZQogICAgICAqIHBlcmZvcm1hbmNlIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBtYXkgaGFuZGxlIHRoZSBleGNlcHRpb24gYW5kCiAgICAgICogaW1wbGVtZW50IHRoZSBlcnJvciBhY3Rpb24gaXRzZWxmLgotICAgICAqIAorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KICAgICAgKiBUaGUgYnVmZmVycyBhcmUgc2Nhbm5lZCBmcm9tIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25zLCBhbmQgdGhlaXIgcG9zaXRpb25zCiAgICAgICogd2lsbCBiZSBtb2RpZmllZCBhY2NvcmRpbmdseSwgd2hpbGUgdGhlaXIgbWFya3MgYW5kIGxpbWl0cyB3aWxsIGJlCiAgICAgICogaW50YWN0LiBBdCBtb3N0IHtAbGluayBCeXRlQnVmZmVyI3JlbWFpbmluZygpIGluLnJlbWFpbmluZygpfSBjaGFyYWN0ZXJzCiAgICAgICogd2lsbCBiZSByZWFkLCBhbmQge0BsaW5rIENoYXJCdWZmZXIjcmVtYWluaW5nKCkgb3V0LnJlbWFpbmluZygpfSBieXRlcwogICAgICAqIHdpbGwgYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgc29tZSBpbXBsZW1lbnRhdGlvbiBtYXkgcHJlLXNjYW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmV0dXJuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBzb21lIGltcGxlbWVudGF0aW9ucyBtYXkgcHJlLXNjYW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmV0dXJuIGEKICAgICAgKiA8Y29kZT5Db2RlclJlc3VsdC5VTkRFUkZMT1c8L2NvZGU+IHVudGlsIGl0IHJlY2VpdmVzIHN1ZmZpY2llbnQgaW5wdXQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlcgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db2RlclJlc3VsdDwvY29kZT4gaW5zdGFuY2UgaW5kaWNhdGluZyB0aGUgcmVzdWx0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Q29kZXJSZXN1bHQ8L2NvZGU+IGluc3RhbmNlIGluZGljYXRpbmcgdGhlIHJlc3VsdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29kZXJSZXN1bHQgZGVjb2RlTG9vcChCeXRlQnVmZmVyIGluLCBDaGFyQnVmZmVyIG91dCk7CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoYXJzZXQgZGV0ZWN0ZWQgYnkgdGhpcyBkZWNvZGVyLCB0aGlzIG1ldGhvZCBpcyBvcHRpb25hbC4KKyAgICAgKiBHZXRzIHRoZSBjaGFyc2V0IGRldGVjdGVkIGJ5IHRoaXMgZGVjb2RlcjsgdGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuCiAgICAgICogPHA+CiAgICAgICogSWYgaW1wbGVtZW50aW5nIGFuIGF1dG8tZGV0ZWN0aW5nIGNoYXJzZXQsIHRoZW4gdGhpcyBkZWNvZGVyIHJldHVybnMgdGhlCiAgICAgICogZGV0ZWN0ZWQgY2hhcnNldCBmcm9tIHRoaXMgbWV0aG9kIHdoZW4gaXQgaXMgYXZhaWxhYmxlLiBUaGUgcmV0dXJuZWQKICAgICAgKiBjaGFyc2V0IHdpbGwgYmUgdGhlIHNhbWUgZm9yIHRoZSByZXN0IG9mIHRoZSBkZWNvZGUgb3BlcmF0aW9uLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBJZiBpbnN1ZmZpY2llbnQgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgdG8gZGV0ZXJtaW5lIHRoZSBjaGFyc2V0LAorICAgICAqIElmIGluc3VmZmljaWVudCBieXRlcyBoYXZlIGJlZW4gcmVhZCB0byBkZXRlcm1pbmUgdGhlIGNoYXJzZXQsIGFuCiAgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KICAgICAgKiA8L3A+CiAgICAgICogPHA+CiAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRocm93cwogICAgICAqIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiwgc28gaXQgc2hvdWxkIGJlIG92ZXJyaWRkZW4KLSAgICAgKiBieSBzdWJjbGFzcyBpZiBuZWVkZWQuCisgICAgICogYnkgYSBzdWJjbGFzcyBpZiBuZWVkZWQuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGNoYXJzZXQgZGV0ZWN0ZWQgYnkgdGhpcyBkZWNvZGVyLCBvciBudWxsIGlmIGl0IGlzIG5vdCB5ZXQKLSAgICAgKiAgICAgICAgIGRldGVybWluZWQKKyAgICAgKiAgICAgICAgIGRldGVybWluZWQuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZGVjb2RlciBkb2VzIG5vdCBpbXBsZW1lbnQgYW4gYXV0by1kZXRlY3RpbmcgY2hhcnNldAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZGVjb2RlciBkb2VzIG5vdCBpbXBsZW1lbnQgYW4gYXV0by1kZXRlY3RpbmcgY2hhcnNldC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGluc3VmZmljaWVudCBieXRlcyBoYXZlIGJlZW4gcmVhZCB0byBkZXRlcm1pbmUgdGhlIGNoYXJzZXQKKyAgICAgKiAgICAgICAgICAgICBpZiBpbnN1ZmZpY2llbnQgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAqICAgICAgICAgICAgIGNoYXJzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENoYXJzZXQgZGV0ZWN0ZWRDaGFyc2V0KCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGbHVzaCB0aGlzIGRlY29kZXIuCisgICAgICogRmx1c2hlcyB0aGlzIGRlY29kZXIuCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBjYWxsIHtAbGluayAjaW1wbEZsdXNoKENoYXJCdWZmZXIpIGltcGxGbHVzaH0uIFNvbWUKICAgICAgKiBkZWNvZGVycyBtYXkgbmVlZCB0byB3cml0ZSBzb21lIGNoYXJhY3RlcnMgdG8gdGhlIG91dHB1dCBidWZmZXIgd2hlbiB0aGV5Ci0gICAgICogaGF2ZSByZWFkIGFsbCBpbnB1dCBieXRlcywgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGRlbgotICAgICAqIHtAbGluayAjaW1wbEZsdXNoKENoYXJCdWZmZXIpIGltcGxGbHVzaH0gdG8gcGVyZm9ybSB3cml0aW5nIGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcyB3b24ndCBsYXJnZXIgdGhhbgotICAgICAqIHtAbGluayBDaGFyQnVmZmVyI3JlbWFpbmluZygpIG91dC5yZW1haW5pbmcoKX0uIElmIHNvbWUgZGVjb2RlciB3YW50IHRvCi0gICAgICogd3JpdGUgbW9yZSBieXRlcyB0aGFuIG91dHB1dCBidWZmZXIncyByZW1haW5pbmcgc3BhY2VzLCB0aGVuCisgICAgICogaGF2ZSByZWFkIGFsbCBpbnB1dCBieXRlczsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKKyAgICAgKiB7QGxpbmsgI2ltcGxGbHVzaChDaGFyQnVmZmVyKSBpbXBsRmx1c2h9IHRvIHBlcmZvcm0gdGhlIHdyaXRpbmcgb3BlcmF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzIHdvbid0IGJlIGxhcmdlciB0aGFuCisgICAgICoge0BsaW5rIENoYXJCdWZmZXIjcmVtYWluaW5nKCkgb3V0LnJlbWFpbmluZygpfS4gSWYgc29tZSBkZWNvZGVyIHdhbnRzIHRvCisgICAgICogd3JpdGUgbW9yZSBieXRlcyB0aGFuIGFuIG91dHB1dCBidWZmZXIncyByZW1haW5pbmcgc3BhY2UgYWxsb3dzLCB0aGVuIGEKICAgICAgKiA8Y29kZT5Db2RlclJlc3VsdC5PVkVSRkxPVzwvY29kZT4gd2lsbCBiZSByZXR1cm5lZCwgYW5kIHRoaXMgbWV0aG9kCi0gICAgICogbXVzdCBiZSBjYWxsZWQgYWdhaW4gd2l0aCBhIGNoYXJhY3RlciBidWZmZXIgdGhhdCBoYXMgbW9yZSBzcGFjZXMuCi0gICAgICogT3RoZXJ3aXNlIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPkNvZGVyUmVzdWx0LlVOREVSRkxPVzwvY29kZT4sCi0gICAgICogd2hpY2ggbWVhbnMgb25lIGRlY29kaW5nIHByb2Nlc3MgaGFzIGJlZW4gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLSAgICAgKiAKKyAgICAgKiBtdXN0IGJlIGNhbGxlZCBhZ2FpbiB3aXRoIGEgY2hhcmFjdGVyIGJ1ZmZlciB0aGF0IGhhcyBtb3JlIHJlbWFpbmluZworICAgICAqIHNwYWNlLiBPdGhlcndpc2UgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KKyAgICAgKiA8Y29kZT5Db2RlclJlc3VsdC5VTkRFUkZMT1c8L2NvZGU+LCB3aGljaCBtZWFucyBvbmUgZGVjb2RpbmcgcHJvY2VzcworICAgICAqIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogPC9wPgorICAgICAqIDxwPgogICAgICAqIER1cmluZyB0aGUgZmx1c2gsIHRoZSBvdXRwdXQgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSBjaGFuZ2VkCiAgICAgICogYWNjb3JkaW5nbHksIHdoaWxlIGl0cyBtYXJrIGFuZCBsaW1pdCB3aWxsIGJlIGludGFjdC4KLSAgICAgKiAKKyAgICAgKiA8L3A+CiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBvdXRwdXQgYnVmZmVyLgogICAgICAqIEByZXR1cm4gPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgPGNvZGU+Q29kZXJSZXN1bHQuT1ZFUkZMT1c8L2NvZGU+CisgICAgICogICAgICAgICA8Y29kZT5Db2RlclJlc3VsdC5PVkVSRkxPVzwvY29kZT4uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGRlY29kZXIgaGFzbid0IHJlYWQgYWxsIGlucHV0IGJ5dGVzIGR1cmluZyBvbmUKICAgICAgKiAgICAgICAgICAgICBkZWNvZGluZyBwcm9jZXNzLCB3aGljaCBtZWFucyBuZWl0aGVyIGFmdGVyIGNhbGxpbmcKICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2RlY29kZShCeXRlQnVmZmVyKSBkZWNvZGUoQnl0ZUJ1ZmZlcil9IG5vciBhZnRlcgogICAgICAqICAgICAgICAgICAgIGNhbGxpbmcge0BsaW5rICNkZWNvZGUoQnl0ZUJ1ZmZlciwgQ2hhckJ1ZmZlciwgYm9vbGVhbikKLSAgICAgKiAgICAgICAgICAgICBkZWNvZGUoQnl0ZUJ1ZmZlciwgQ2hhckJ1ZmZlciwgYm9vbGVhbil9IHdpdGggdHJ1ZSB2YWx1ZSBmb3IKLSAgICAgKiAgICAgICAgICAgICB0aGUgbGFzdCBib29sZWFuIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgIGRlY29kZShCeXRlQnVmZmVyLCBDaGFyQnVmZmVyLCBib29sZWFuKX0gd2l0aCB0cnVlIGFzIHZhbHVlCisgICAgICogICAgICAgICAgICAgZm9yIHRoZSBsYXN0IGJvb2xlYW4gcGFyYW1ldGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDb2RlclJlc3VsdCBmbHVzaChDaGFyQnVmZmVyIG91dCkgewogICAgICAgICBpZiAoc3RhdHVzICE9IEVORCAmJiBzdGF0dXMgIT0gSU5JVCkgewpAQCAtNTIyLDc5ICs1NDMsODggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGbHVzaCB0aGlzIGRlY29kZXIuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCBhbHdheXMgcmV0dXJuCi0gICAgICogPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPiwgYW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuCi0gICAgICogaWYgbmVlZGVkLgorICAgICAqIEZsdXNoZXMgdGhpcyBkZWNvZGVyLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIGFsd2F5cworICAgICAqIHJldHVybnMgPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPjsgdGhpcyBtZXRob2QgY2FuIGJlCisgICAgICogb3ZlcnJpZGRlbiBpZiBuZWVkZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyLgogICAgICAqIEByZXR1cm4gPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgPGNvZGU+Q29kZXJSZXN1bHQuT1ZFUkZMT1c8L2NvZGU+CisgICAgICogICAgICAgICA8Y29kZT5Db2RlclJlc3VsdC5PVkVSRkxPVzwvY29kZT4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENvZGVyUmVzdWx0IGltcGxGbHVzaChDaGFyQnVmZmVyIG91dCkgewogICAgICAgICByZXR1cm4gQ29kZXJSZXN1bHQuVU5ERVJGTE9XOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGF0IHRoaXMgZGVjb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiBzcGVjaWZpZWQgZm9yCi0gICAgICogbWFsZm9ybWVkIGlucHV0IGVycm9yIGhhcyBiZWVuIGNoYW5nZWQuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcwotICAgICAqIG5vdGhpbmcsIGFuZCB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWQuCisgICAgICogTm90aWZpZXMgdGhhdCB0aGlzIGRlY29kZXIncyA8Y29kZT5Db2RpbmdFcnJvckFjdGlvbjwvY29kZT4gc3BlY2lmaWVkCisgICAgICogZm9yIG1hbGZvcm1lZCBpbnB1dCBlcnJvciBoYXMgYmVlbiBjaGFuZ2VkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgICAqIGRvZXMgbm90aGluZzsgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdBY3Rpb24KLSAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgYWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGFjdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBpbXBsT25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbiBuZXdBY3Rpb24pIHsKICAgICAgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eQogICAgIH0KIAogICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGF0IHRoaXMgZGVjb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiBzcGVjaWZpZWQgZm9yCi0gICAgICogdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IgaGFzIGJlZW4gY2hhbmdlZC4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzCi0gICAgICogbm90aGluZywgYW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZC4KKyAgICAgKiBOb3RpZmllcyB0aGF0IHRoaXMgZGVjb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiBzcGVjaWZpZWQKKyAgICAgKiBmb3IgdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmc7IHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3QWN0aW9uCi0gICAgICogICAgICAgICAgICBUaGUgbmV3IGFjdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhY3Rpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgaW1wbE9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbiBuZXdBY3Rpb24pIHsKICAgICAgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eQogICAgIH0KIAogICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGF0IHRoaXMgZGVjb2RlcidzIHJlcGxhY2VtZW50IGhhcyBiZWVuIGNoYW5nZWQuIERlZmF1bHQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsIGFuZCB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWQuCisgICAgICogTm90aWZpZXMgdGhhdCB0aGlzIGRlY29kZXIncyByZXBsYWNlbWVudCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZzsgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdSZXBsYWNlbWVudAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyByZXBsYWNlbWVudCBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcmVwbGFjZW1lbnQgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGltcGxSZXBsYWNlV2l0aChTdHJpbmcgbmV3UmVwbGFjZW1lbnQpIHsKICAgICAgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgZGVjb2RlcidzIGNoYXJzZXQgcmVsYXRlZCBzdGF0ZS4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzCi0gICAgICogbm90aGluZywgYW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZC4KKyAgICAgKiBSZXNldCB0aGlzIGRlY29kZXIncyBjaGFyc2V0IHJlbGF0ZWQgc3RhdGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogZG9lcyBub3RoaW5nOyB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgaW1wbFJlc2V0KCkgewogICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IGlmIHRoaXMgZGVjb2RlciBpbXBsZW1lbnRzIGFuIGF1dG8tZGV0ZWN0aW5nIGNoYXJzZXQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBkZWNvZGVyIGltcGxlbWVudHMgYW4gYXV0by1kZXRlY3RpbmcgY2hhcnNldC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZGVjb2RlciBpbXBsZW1lbnRzIGFuIGF1dG8tZGV0ZWN0aW5nCi0gICAgICogICAgICAgICBjaGFyc2V0CisgICAgICogICAgICAgICBjaGFyc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b0RldGVjdGluZygpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCBpZiB0aGlzIGRlY29kZXIgaGFzIGRldGVjdGVkIGEgY2hhcnNldCwgdGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBkZWNvZGVyIGhhcyBkZXRlY3RlZCBhIGNoYXJzZXQ7IHRoaXMgbWV0aG9kIGlzCisgICAgICogb3B0aW9uYWwuCiAgICAgICogPHA+CiAgICAgICogSWYgdGhpcyBkZWNvZGVyIGltcGxlbWVudHMgYW4gYXV0by1kZXRlY3RpbmcgY2hhcnNldCwgdGhlbiB0aGlzIG1ldGhvZAogICAgICAqIG1heSBzdGFydCB0byByZXR1cm4gdHJ1ZSBkdXJpbmcgZGVjb2Rpbmcgb3BlcmF0aW9uIHRvIGluZGljYXRlIHRoYXQgYQogICAgICAqIGNoYXJzZXQgaGFzIGJlZW4gZGV0ZWN0ZWQgaW4gdGhlIGlucHV0IGJ5dGVzIGFuZCB0aGF0IHRoZSBjaGFyc2V0IGNhbiBiZQotICAgICAqIHJldHJpZXZlZCBieSBpbnZva2luZyB7QGxpbmsgI2RldGVjdGVkQ2hhcnNldCgpIGRldGVjdGVkQ2hhcnNldH0gbWV0aG9kLgorICAgICAqIHJldHJpZXZlZCBieSBpbnZva2luZyB0aGUge0BsaW5rICNkZXRlY3RlZENoYXJzZXQoKSBkZXRlY3RlZENoYXJzZXR9CisgICAgICogbWV0aG9kLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KICAgICAgKiBOb3RlIHRoYXQgYSBkZWNvZGVyIHRoYXQgaW1wbGVtZW50cyBhbiBhdXRvLWRldGVjdGluZyBjaGFyc2V0IG1heSBzdGlsbApAQCAtNjA2LDEyICs2MzYsMTMgQEAKICAgICAgKiA8cD4KICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIGFuCiAgICAgICogPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+OyBpdCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieQotICAgICAqIHN1YmNsYXNzIGlmIG5lZWRlZC4KKyAgICAgKiBhIHN1YmNsYXNzIGlmIG5lZWRlZC4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0aGlzIGRlY29kZXIgaGFzIGRldGVjdGVkIGEgY2hhcnNldAorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBkZWNvZGVyIGhhcyBkZXRlY3RlZCBhIGNoYXJzZXQuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZGVjb2RlciBkb2Vzbid0IGltcGxlbWVudCBhbiBhdXRvLWRldGVjdGluZyBjaGFyc2V0CisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBkZWNvZGVyIGRvZXNuJ3QgaW1wbGVtZW50IGFuIGF1dG8tZGV0ZWN0aW5nIGNoYXJzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDaGFyc2V0RGV0ZWN0ZWQoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwpAQCAtNjE5LDM4ICs2NTAsNDEgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhpcyBkZWNvZGVyJ3MgPGNvZGU+Q29kaW5nRXJyb3JBY3Rpb248L2NvZGU+IHdoZW4gbWFsZm9ybWVkIGlucHV0Ci0gICAgICogb2NjdXJyZWQgZHVyaW5nIGRlY29kaW5nIHByb2Nlc3MuCisgICAgICogb2NjdXJyZWQgZHVyaW5nIHRoZSBkZWNvZGluZyBwcm9jZXNzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhpcyBkZWNvZGVyJ3MgPGNvZGU+Q29kaW5nRXJyb3JBY3Rpb248L2NvZGU+IHdoZW4gbWFsZm9ybWVkCi0gICAgICogICAgICAgICBpbnB1dCBvY2N1cnJlZCBkdXJpbmcgZGVjb2RpbmcgcHJvY2Vzcy4KKyAgICAgKiAgICAgICAgIGlucHV0IG9jY3VycmVkIGR1cmluZyB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29kaW5nRXJyb3JBY3Rpb24gbWFsZm9ybWVkSW5wdXRBY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBtYWxmb3JtQWN0aW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgY3JlYXRlZCBieSB0aGlzIGRlY29kZXIKLSAgICAgKiBmb3Igb25lIGlucHV0IGJ5dGUsIG11c3QgYmUgcG9zaXRpdmUKKyAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSBjcmVhdGVkIGJ5IHRoaXMKKyAgICAgKiBkZWNvZGVyIGZvciBvbmUgaW5wdXQgYnl0ZSwgbXVzdCBiZSBwb3NpdGl2ZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSBjcmVhdGVkIGJ5IHRoaXMKLSAgICAgKiAgICAgICAgIGRlY29kZXIgZm9yIG9uZSBpbnB1dCBieXRlLCBtdXN0IGJlIHBvc2l0aXZlCisgICAgICogICAgICAgICBkZWNvZGVyIGZvciBvbmUgaW5wdXQgYnl0ZSwgbXVzdCBiZSBwb3NpdGl2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZmxvYXQgbWF4Q2hhcnNQZXJCeXRlKCkgewogICAgICAgICByZXR1cm4gbWF4Q2hhcnM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoaXMgZGVjb2RlcidzIGFjdGlvbiBvbiBtYWxmb3JtZWQgaW5wdXQgZXJyb3IuCisgICAgICogU2V0cyB0aGlzIGRlY29kZXIncyBhY3Rpb24gb24gbWFsZm9ybWVkIGlucHV0IGVycm9ycy4KICAgICAgKiAKICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNhbGwgdGhlCiAgICAgICoge0BsaW5rICNpbXBsT25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbikgaW1wbE9uTWFsZm9ybWVkSW5wdXR9CiAgICAgICogbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5ldyBhY3Rpb24gYXMgYXJndW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld0FjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhY3Rpb24gb24gbWFsZm9ybWVkIGlucHV0IGVycm9yCi0gICAgICogQHJldHVybiB0aGlzIGRlY29kZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYWN0aW9uIG9uIG1hbGZvcm1lZCBpbnB1dCBlcnJvci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgZGVjb2Rlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBuZXdBY3Rpb24gaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuZXdBY3Rpb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2hhcnNldERlY29kZXIgb25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbiBuZXdBY3Rpb24pIHsKICAgICAgICAgaWYgKG51bGwgPT0gbmV3QWN0aW9uKSB7CkBAIC02NjIsMTcgKzY5NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGlzIGRlY29kZXIncyBhY3Rpb24gb24gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IuCisgICAgICogU2V0cyB0aGlzIGRlY29kZXIncyBhY3Rpb24gb24gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3JzLgogICAgICAqIAogICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCB0aGUKICAgICAgKiB7QGxpbmsgI2ltcGxPblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24pIGltcGxPblVubWFwcGFibGVDaGFyYWN0ZXJ9CiAgICAgICogbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5ldyBhY3Rpb24gYXMgYXJndW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld0FjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhY3Rpb24gb24gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IKLSAgICAgKiBAcmV0dXJuIHRoaXMgZGVjb2RlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhY3Rpb24gb24gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IuCisgICAgICogQHJldHVybiB0aGlzIGRlY29kZXIuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gbmV3QWN0aW9uIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmV3QWN0aW9ufSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENoYXJzZXREZWNvZGVyIG9uVW5tYXBwYWJsZUNoYXJhY3RlcigKICAgICAgICAgICAgIENvZGluZ0Vycm9yQWN0aW9uIG5ld0FjdGlvbikgewpAQCAtNjg1LDI4ICs3MjAsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHJlcGxhY2VtZW50IHN0cmluZywgd2hpY2ggaXMgbmV2ZXIgbnVsbCBvciBlbXB0eQorICAgICAqIEdldHMgdGhlIHJlcGxhY2VtZW50IHN0cmluZywgd2hpY2ggaXMgbmV2ZXIgbnVsbCBvciBlbXB0eS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBsYWNlbWVudCBzdHJpbmcsIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nLCBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlcGxhY2VtZW50KCkgewogICAgICAgICByZXR1cm4gcmVwbGFjZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgbmV3IHJlcGxhY2VtZW50IHZhbHVlLgorICAgICAqIFNldHMgdGhlIG5ldyByZXBsYWNlbWVudCBzdHJpbmcuCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgZmlyc3QgY2hlY2tzIHRoZSBnaXZlbiByZXBsYWNlbWVudCdzIHZhbGlkaXR5LCB0aGVuIGNoYW5nZXMKLSAgICAgKiB0aGUgcmVwbGFjZW1lbnQgdmFsdWUsIGFuZCBhdCBsYXN0IGNhbGxzCisgICAgICogdGhlIHJlcGxhY2VtZW50IHZhbHVlLCBhbmQgYXQgbGFzdCBjYWxscyB0aGUKICAgICAgKiB7QGxpbmsgI2ltcGxSZXBsYWNlV2l0aChTdHJpbmcpIGltcGxSZXBsYWNlV2l0aH0gbWV0aG9kIHdpdGggdGhlIGdpdmVuCiAgICAgICogbmV3IHJlcGxhY2VtZW50IGFzIGFyZ3VtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdSZXBsYWNlbWVudAotICAgICAqICAgICAgICAgICAgdGhlIHJlcGxhY2VtZW50IHN0cmluZywgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkKLSAgICAgKiBAcmV0dXJuIHRoaXMgZGVjb2RlcgorICAgICAqICAgICAgICAgICAgdGhlIHJlcGxhY2VtZW50IHN0cmluZywgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkuIEl0cyBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB7QGxpbmsgI21heENoYXJzUGVyQnl0ZSgpfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgZGVjb2Rlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiByZXBsYWNlbWVudCBjYW5ub3Qgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnQKLSAgICAgKiAgICAgICAgICAgICBtZW50aW9uZWQgYWJvdmUKKyAgICAgKiAgICAgICAgICAgICBtZW50aW9uZWQgYWJvdmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENoYXJzZXREZWNvZGVyIHJlcGxhY2VXaXRoKFN0cmluZyBuZXdSZXBsYWNlbWVudCkgewogICAgICAgICBpZiAobnVsbCA9PSBuZXdSZXBsYWNlbWVudCB8fCBuZXdSZXBsYWNlbWVudC5sZW5ndGgoKSA9PSAwKSB7CkBAIC03MjQsMTEgKzc2MiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgZGVjb2Rlci4gVGhpcyBtZXRob2Qgd2lsbCByZXNldCBpbnRlcm5hbCBzdGF0dXMsIGFuZCB0aGVuIGNhbGwKLSAgICAgKiA8Y29kZT5pbXBsUmVzZXQoKTwvY29kZT4gdG8gcmVzZXQgYW55IHN0YXR1cyByZWxhdGVkIHRvIHNwZWNpZmljCi0gICAgICogY2hhcnNldC4KKyAgICAgKiBSZXNldHMgdGhpcyBkZWNvZGVyLiBUaGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0dXMsIGFuZCB0aGVuCisgICAgICogY2FsbHMgPGNvZGU+aW1wbFJlc2V0KCk8L2NvZGU+IHRvIHJlc2V0IGFueSBzdGF0dXMgcmVsYXRlZCB0byB0aGUKKyAgICAgKiBzcGVjaWZpYyBjaGFyc2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBkZWNvZGVyCisgICAgICogQHJldHVybiB0aGlzIGRlY29kZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENoYXJzZXREZWNvZGVyIHJlc2V0KCkgewogICAgICAgICBzdGF0dXMgPSBJTklUOwpAQCAtNzM3LDExICs3NzYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoaXMgZGVjb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiB3aGVuIHVubWFwcGFibGUKLSAgICAgKiBjaGFyYWN0ZXIgb2NjdXJyZWQgZHVyaW5nIGRlY29kaW5nIHByb2Nlc3MuCisgICAgICogR2V0cyB0aGlzIGRlY29kZXIncyA8Y29kZT5Db2RpbmdFcnJvckFjdGlvbjwvY29kZT4gd2hlbiBhbiB1bm1hcHBhYmxlCisgICAgICogY2hhcmFjdGVyIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgZGVjb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiB3aGVuIHVubWFwcGFibGUKLSAgICAgKiAgICAgICAgIGNoYXJhY3RlciBvY2N1cnJlZCBkdXJpbmcgZGVjb2RpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgZGVjb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiB3aGVuIGFuCisgICAgICogICAgICAgICB1bm1hcHBhYmxlIGNoYXJhY3RlciBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGRlY29kaW5nIHByb2Nlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvZGluZ0Vycm9yQWN0aW9uIHVubWFwcGFibGVDaGFyYWN0ZXJBY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB1bm1hcEFjdGlvbjsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0RW5jb2Rlci5qYXZhIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRFbmNvZGVyLmphdmEKaW5kZXggMGNiM2ZkYy4uMjRiOGIzZiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRFbmNvZGVyLmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRFbmNvZGVyLmphdmEKQEAgLTI0LDYxICsyNCw2MiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5uaW9jaGFyLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBBbiBjb252ZXJ0ZXIgdGhhdCBjYW4gY29udmVydCAxNi1iaXQgVW5pY29kZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gYnl0ZQotICogc2VxdWVuY2UgaW4gc29tZSBjaGFyc2V0IC4KKyAqIEEgY29udmVydGVyIHRoYXQgY2FuIGNvbnZlcnRzIGEgMTYtYml0IFVuaWNvZGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIGEgYnl0ZQorICogc2VxdWVuY2UgaW4gc29tZSBjaGFyc2V0LgogICogPHA+Ci0gKiBUaGUgaW5wdXQgY2hhcmFjdGVyIHNlcXVlbmNlIGlzIHdyYXBwZWQgYnkKLSAqIHtAbGluayBqYXZhLm5pby5DaGFyQnVmZmVyIENoYXJCdWZmZXJ9IGFuZCB0aGUgb3V0cHV0IGNoYXJhY3RlciBzZXF1ZW5jZSBpcwotICoge0BsaW5rIGphdmEubmlvLkJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlcn0uIEEgZW5jb2RlciBpbnN0YW5jZSBzaG91bGQgYmUgdXNlZCBpbgotICogZm9sbG93aW5nIHNlcXVlbmNlLCB3aGljaCBpcyByZWZlcnJlZCB0byBhcyBhIGVuY29kaW5nIG9wZXJhdGlvbjoKKyAqIFRoZSBpbnB1dCBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgd3JhcHBlZCBieSBhCisgKiB7QGxpbmsgamF2YS5uaW8uQ2hhckJ1ZmZlciBDaGFyQnVmZmVyfSBhbmQgdGhlIG91dHB1dCBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgYQorICoge0BsaW5rIGphdmEubmlvLkJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlcn0uIEFuIGVuY29kZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIHVzZWQKKyAqIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UsIHdoaWNoIGlzIHJlZmVycmVkIHRvIGFzIGEgZW5jb2Rpbmcgb3BlcmF0aW9uOgogICogPG9sPgotICogPGxpPkludm9raW5nIHRoZSB7QGxpbmsgI3Jlc2V0KCkgcmVzZXR9IG1ldGhvZCB0byByZXNldCB0aGUgZW5jb2RlciBpZiB0aGUKKyAqIDxsaT5pbnZva2luZyB0aGUge0BsaW5rICNyZXNldCgpIHJlc2V0fSBtZXRob2QgdG8gcmVzZXQgdGhlIGVuY29kZXIgaWYgdGhlCiAgKiBlbmNvZGVyIGhhcyBiZWVuIHVzZWQ7PC9saT4KLSAqIDxsaT5JbnZva2luZyB0aGUge0BsaW5rICNlbmNvZGUoQ2hhckJ1ZmZlciwgQnl0ZUJ1ZmZlciwgYm9vbGVhbikgZW5jb2RlfQorICogPGxpPmludm9raW5nIHRoZSB7QGxpbmsgI2VuY29kZShDaGFyQnVmZmVyLCBCeXRlQnVmZmVyLCBib29sZWFuKSBlbmNvZGV9CiAgKiBtZXRob2QgdW50aWwgdGhlIGFkZGl0aW9uYWwgaW5wdXQgaXMgbm90IG5lZWRlZCwgdGhlIDxjb2RlPmVuZE9mSW5wdXQ8L2NvZGU+CiAgKiBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgdG8gZmFsc2UsIHRoZSBpbnB1dCBidWZmZXIgbXVzdCBiZSBmaWxsZWQgYW5kIHRoZQogICogb3V0cHV0IGJ1ZmZlciBtdXN0IGJlIGZsdXNoZWQgYmV0d2VlbiBpbnZvY2F0aW9uczs8L2xpPgotICogPGxpPkludm9raW5nIHRoZSB7QGxpbmsgI2VuY29kZShDaGFyQnVmZmVyLCBCeXRlQnVmZmVyLCBib29sZWFuKSBlbmNvZGV9Ci0gKiBtZXRob2QgbGFzdCB0aW1lLCBhbmQgdGhlIHRoZSA8Y29kZT5lbmRPZklucHV0PC9jb2RlPiBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQKLSAqIHRvIHRydWU8L2xpPgotICogPGxpPkludm9raW5nIHRoZSB7QGxpbmsgI2ZsdXNoKEJ5dGVCdWZmZXIpIGZsdXNofSBtZXRob2QgdG8gZmx1c2ggdGhlCisgKiA8bGk+aW52b2tpbmcgdGhlIHtAbGluayAjZW5jb2RlKENoYXJCdWZmZXIsIEJ5dGVCdWZmZXIsIGJvb2xlYW4pIGVuY29kZX0KKyAqIG1ldGhvZCBmb3IgdGhlIGxhc3QgdGltZSBhbmQgdGhlIDxjb2RlPmVuZE9mSW5wdXQ8L2NvZGU+IHBhcmFtZXRlciBtdXN0IGJlCisgKiBzZXQgdG8ge0Bjb2RlIHRydWV9PC9saT4KKyAqIDxsaT5pbnZva2luZyB0aGUge0BsaW5rICNmbHVzaChCeXRlQnVmZmVyKSBmbHVzaH0gbWV0aG9kIHRvIGZsdXNoIHRoZQogICogb3V0cHV0LjwvbGk+CiAgKiA8L29sPgogICogPC9wPgogICogPHA+CiAgKiBUaGUge0BsaW5rICNlbmNvZGUoQ2hhckJ1ZmZlciwgQnl0ZUJ1ZmZlciwgYm9vbGVhbikgZW5jb2RlfSBtZXRob2Qgd2lsbAotICogY29udmVydCBhcyBtYW55IGNoYXJhY3RlcnMgYXMgcG9zc2libGUsIGFuZCB0aGUgcHJvY2VzcyB3b24ndCBzdG9wIGV4Y2VwdCB0aGUKLSAqIGlucHV0IGNoYXJhY3RlcnMgaGFzIGJlZW4gcnVuIG91dCBvZiwgdGhlIG91dHB1dCBidWZmZXIgaGFzIGJlZW4gZmlsbGVkIG9yCi0gKiBzb21lIGVycm9yIGhhcyBoYXBwZW5lZC4gQSB7QGxpbmsgQ29kZXJSZXN1bHQgQ29kZXJSZXN1bHR9IGluc3RhbmNlIHdpbGwgYmUKKyAqIGNvbnZlcnQgYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLCBhbmQgdGhlIHByb2Nlc3Mgd29uJ3Qgc3RvcCB1bnRpbCB0aGUKKyAqIGlucHV0IGNoYXJhY3RlcnMgaGF2ZSBydW4gb3V0LCB0aGUgb3V0cHV0IGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQgb3Igc29tZQorICogZXJyb3IgaGFzIGhhcHBlbmVkLiBBIHtAbGluayBDb2RlclJlc3VsdCBDb2RlclJlc3VsdH0gaW5zdGFuY2Ugd2lsbCBiZQogICogcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhlIHN0b3AgcmVhc29uLCBhbmQgdGhlIGludm9rZXIgY2FuIGlkZW50aWZ5IHRoZSByZXN1bHQKLSAqIGFuZCBjaG9vc2UgZnVydGhlciBhY3Rpb24sIHdoaWNoIGNhbiBpbmNsdWRlIGZpbGxpbmcgdGhlIGlucHV0IGJ1ZmZlciwKLSAqIGZsdXNoaW5nIHRoZSBvdXRwdXQgYnVmZmVyLCByZWNvdmVyaW5nIGZyb20gZXJyb3IgYW5kIHRyeWluZyBhZ2Fpbi4KKyAqIGFuZCBjaG9vc2UgZnVydGhlciBhY3Rpb24sIHdoaWNoIGluY2x1ZGVzIGZpbGxpbmcgdGhlIGlucHV0IGJ1ZmZlciwgZmx1c2hpbmcKKyAqIHRoZSBvdXRwdXQgYnVmZmVyIG9yIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciBhbmQgdHJ5aW5nIGFnYWluLgogICogPC9wPgogICogPHA+Ci0gKiBUaGVyZSBhcmUgdHdvIGNvbW1vbiBlbmNvZGluZyBlcnJvcnMuIE9uZSBpcyBuYW1lZCBhcyBtYWxmb3JtZWQgYW5kIGl0IGlzCi0gKiByZXR1cm5lZCB3aGVuIHRoZSBpbnB1dCBjb250ZW50IGlzIGlsbGVnYWwgMTYtYml0IFVuaWNvZGUgY2hhcmFjdGVyIHNlcXVlbmNlLAotICogdGhlIG90aGVyIGlzIG5hbWVkIGFzIHVubWFwcGFibGUgY2hhcmFjdGVyIGFuZCBvY2N1cnMgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0KLSAqIG1hcHBpbmcgdGhlIGlucHV0IHRvIGEgdmFsaWQgYnl0ZSBzZXF1ZW5jZSBpbiB0aGUgc3BlY2lmaWMgY2hhcnNldC4KKyAqIFRoZXJlIGFyZSB0d28gY29tbW9uIGVuY29kaW5nIGVycm9ycy4gT25lIGlzIG5hbWVkIG1hbGZvcm1lZCBhbmQgaXQgaXMKKyAqIHJldHVybmVkIHdoZW4gdGhlIGlucHV0IGNvbnRlbnQgaXMgYW4gaWxsZWdhbCAxNi1iaXQgVW5pY29kZSBjaGFyYWN0ZXIKKyAqIHNlcXVlbmNlLCB0aGUgb3RoZXIgaXMgbmFtZWQgdW5tYXBwYWJsZSBjaGFyYWN0ZXIgYW5kIG9jY3VycyB3aGVuIHRoZXJlIGlzIGEKKyAqIHByb2JsZW0gbWFwcGluZyB0aGUgaW5wdXQgdG8gYSB2YWxpZCBieXRlIHNlcXVlbmNlIGluIHRoZSBzcGVjaWZpZWQgY2hhcnNldC4KICAqIDwvcD4KICAqIDxwPgotICogVGhlIHR3byBlcnJvcnMgY2FuIGJlIGhhbmRsZWQgaW4gdGhyZWUgd2F5cywgdGhlIGRlZmF1bHQgb25lIGlzIHRvIHJlcG9ydCB0aGUKKyAqIEJvdGggZXJyb3JzIGNhbiBiZSBoYW5kbGVkIGluIHRocmVlIHdheXMsIHRoZSBkZWZhdWx0IG9uZSBpcyB0byByZXBvcnQgdGhlCiAgKiBlcnJvciB0byB0aGUgaW52b2tlciBieSBhIHtAbGluayBDb2RlclJlc3VsdCBDb2RlclJlc3VsdH0gaW5zdGFuY2UsIGFuZCB0aGUKICAqIGFsdGVybmF0aXZlcyBhcmUgdG8gaWdub3JlIGl0IG9yIHRvIHJlcGxhY2UgdGhlIGVycm9uZW91cyBpbnB1dCB3aXRoIHRoZQotICogcmVwbGFjZW1lbnQgYnl0ZSBhcnJheS4gVGhlIHJlcGxhY2VtZW50IGJ5dGUgYXJyYXkgaXMgeyhieXRlKSc/J30gYnkgZGVmYXVsdAotICogYW5kIGNhbiBiZSBjaGFuZ2VkIGJ5IGludm9raW5nIHtAbGluayAjcmVwbGFjZVdpdGgoYnl0ZVtdKSByZXBsYWNlV2l0aH0KLSAqIG1ldGhvZC4gVGhlIGludm9rZXIgb2YgdGhpcyBlbmNvZGVyIGNhbiBjaG9vc2Ugb25lIHdheSBieSBzcGVjaWZ5aW5nIGEKKyAqIHJlcGxhY2VtZW50IGJ5dGUgYXJyYXkuIFRoZSByZXBsYWNlbWVudCBieXRlIGFycmF5IGlzICd7QGNvZGUgP30nIGJ5CisgKiBkZWZhdWx0IGFuZCBjYW4gYmUgY2hhbmdlZCBieSBpbnZva2luZyB0aGUKKyAqIHtAbGluayAjcmVwbGFjZVdpdGgoYnl0ZVtdKSByZXBsYWNlV2l0aH0gbWV0aG9kLiBUaGUgaW52b2tlciBvZiB0aGlzIGVuY29kZXIKKyAqIGNhbiBjaG9vc2Ugb25lIHdheSBieSBzcGVjaWZ5aW5nIGEKICAqIHtAbGluayBDb2RpbmdFcnJvckFjdGlvbiBDb2RpbmdFcnJvckFjdGlvbn0gaW5zdGFuY2UgZm9yIGVhY2ggZXJyb3IgdHlwZSB2aWEKLSAqIHtAbGluayAjb25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbikgb25NYWxmb3JtZWRJbnB1dH0gbWV0aG9kIGFuZAotICoge0BsaW5rICNvblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24pIG9uVW5tYXBwYWJsZUNoYXJhY3Rlcn0KKyAqIHRoZSB7QGxpbmsgI29uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24pIG9uTWFsZm9ybWVkSW5wdXR9IG1ldGhvZCBhbmQKKyAqIHRoZSB7QGxpbmsgI29uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbikgb25Vbm1hcHBhYmxlQ2hhcmFjdGVyfQogICogbWV0aG9kLgogICogPC9wPgogICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIGFic3RyYWN0IGNsYXNzIGFuZCBlbmNhcHN1bGF0ZSBtYW55IGNvbW1vbiBvcGVyYXRpb25zIG9mCi0gKiBlbmNvZGluZyBwcm9jZXNzIGZvciBhbGwgY2hhcnNldHMuIGVuY29kZXIgZm9yIHNwZWNpZmljIGNoYXJzZXQgc2hvdWxkIGV4dGVuZAotICogdGhpcyBjbGFzcyBhbmQgbmVlZCBvbmx5IGltcGxlbWVudAorICogVGhpcyBjbGFzcyBpcyBhYnN0cmFjdCBhbmQgZW5jYXBzdWxhdGVzIG1hbnkgY29tbW9uIG9wZXJhdGlvbnMgb2YgdGhlCisgKiBlbmNvZGluZyBwcm9jZXNzIGZvciBhbGwgY2hhcnNldHMuIEVuY29kZXJzIGZvciBhIHNwZWNpZmljIGNoYXJzZXQgc2hvdWxkCisgKiBleHRlbmQgdGhpcyBjbGFzcyBhbmQgbmVlZCBvbmx5IHRvIGltcGxlbWVudCB0aGUKICAqIHtAbGluayAjZW5jb2RlTG9vcChDaGFyQnVmZmVyLCBCeXRlQnVmZmVyKSBlbmNvZGVMb29wfSBtZXRob2QgZm9yIGJhc2ljCi0gKiBlbmNvZGluZyBsb29wLiBJZiBhIHN1YmNsYXNzIG1haW50YWlucyBpbnRlcm5hbCBzdGF0ZSwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNpbXBsRmx1c2goQnl0ZUJ1ZmZlcikgaW1wbEZsdXNofSBtZXRob2QgYW5kCisgKiBlbmNvZGluZy4gSWYgYSBzdWJjbGFzcyBtYWludGFpbnMgYW4gaW50ZXJuYWwgc3RhdGUsIGl0IHNob3VsZCBvdmVycmlkZSB0aGUKKyAqIHtAbGluayAjaW1wbEZsdXNoKEJ5dGVCdWZmZXIpIGltcGxGbHVzaH0gbWV0aG9kIGFuZCB0aGUKICAqIHtAbGluayAjaW1wbFJlc2V0KCkgaW1wbFJlc2V0fSBtZXRob2QgaW4gYWRkaXRpb24uCiAgKiA8L3A+CiAgKiA8cD4KQEAgLTg3LDYgKzg4LDcgQEAKICAqIAogICogQHNlZSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQKICAqIEBzZWUgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFyc2V0RW5jb2RlciB7CiAgICAgLyoKQEAgLTEzOSwyMiArMTQxLDIyIEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+Q2hhcnNldEVuY29kZXI8L2NvZGU+IHVzaW5nIGdpdmVuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5DaGFyc2V0RW5jb2RlcjwvY29kZT4gdXNpbmcgdGhlIGdpdmVuCiAgICAgICogPGNvZGU+Q2hhcnNldDwvY29kZT4sIGF2ZXJhZ2UgbnVtYmVyIGFuZCBtYXhpbXVtIG51bWJlciBvZiBieXRlcwogICAgICAqIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyIGZvciBvbmUgaW5wdXQgY2hhcmFjdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjcwotICAgICAqICAgICAgICAgICAgdGhpcyBlbmNvZGVyJ3MgPGNvZGU+Q2hhcnNldDwvY29kZT4sIHdoaWNoIGNyZWF0ZSB0aGlzCi0gICAgICogICAgICAgICAgICBlbmNvZGVyCisgICAgICogICAgICAgICAgICB0aGUgPGNvZGU+Q2hhcnNldDwvY29kZT4gdG8gYmUgdXNlZCBieSB0aGlzIGVuY29kZXIuCiAgICAgICogQHBhcmFtIGF2ZXJhZ2VCeXRlc1BlckNoYXIKICAgICAgKiAgICAgICAgICAgIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ5dGVzIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyIGZvciBvbmUgaW5wdXQKLSAgICAgKiAgICAgICAgICAgIGNoYXJhY3RlciwgbXVzdCBiZSBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyLCBtdXN0IGJlIHBvc2l0aXZlLgogICAgICAqIEBwYXJhbSBtYXhCeXRlc1BlckNoYXIKICAgICAgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBiZSBjcmVhdGVkIGJ5IHRoaXMgZW5jb2RlcgotICAgICAqICAgICAgICAgICAgZm9yIG9uZSBpbnB1dCBjaGFyYWN0ZXIsIG11c3QgYmUgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgIGZvciBvbmUgaW5wdXQgY2hhcmFjdGVyLCBtdXN0IGJlIHBvc2l0aXZlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+bWF4Qnl0ZXNQZXJDaGFyPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmF2ZXJhZ2VCeXRlUGVyQ2hhcjwvY29kZT4gaXMgbmVnYXRpdmUKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5hdmVyYWdlQnl0ZXNQZXJDaGFyPC9jb2RlPiBpcyBuZWdhdGl2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2hhcnNldEVuY29kZXIoQ2hhcnNldCBjcywgZmxvYXQgYXZlcmFnZUJ5dGVzUGVyQ2hhciwKICAgICAgICAgICAgIGZsb2F0IG1heEJ5dGVzUGVyQ2hhcikgewpAQCAtMTYzLDI2ICsxNjUsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+Q2hhcnNldEVuY29kZXI8L2NvZGU+IHVzaW5nIGdpdmVuCi0gICAgICogPGNvZGU+Q2hhcnNldDwvY29kZT4sIHJlcGxhY2UgYnl0ZSBhcnJheSwgYXZlcmFnZSBudW1iZXIgYW5kIG1heGltdW0KLSAgICAgKiBudW1iZXIgb2YgYnl0ZXMgY3JlYXRlZCBieSB0aGlzIGVuY29kZXIgZm9yIG9uZSBpbnB1dCBjaGFyYWN0ZXIuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5DaGFyc2V0RW5jb2RlcjwvY29kZT4gdXNpbmcgdGhlIGdpdmVuCisgICAgICogPGNvZGU+Q2hhcnNldDwvY29kZT4sIHJlcGxhY2VtZW50IGJ5dGUgYXJyYXksIGF2ZXJhZ2UgbnVtYmVyIGFuZAorICAgICAqIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyIGZvciBvbmUgaW5wdXQgY2hhcmFjdGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjcwotICAgICAqICAgICAgICAgICAgdGhlIHRoaXMgZW5jb2RlcidzIDxjb2RlPkNoYXJzZXQ8L2NvZGU+LCB3aGljaCBjcmVhdGUgdGhpcwotICAgICAqICAgICAgICAgICAgZW5jb2RlcgorICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IHRvIGJlIHVzZWQgYnkgdGhpcyBlbmNvZGVyLgogICAgICAqIEBwYXJhbSBhdmVyYWdlQnl0ZXNQZXJDaGFyCi0gICAgICogICAgICAgICAgICBhdmVyYWdlIG51bWJlciBvZiBieXRlcyBjcmVhdGVkIGJ5IHRoaXMgZW5jb2RlciBmb3Igc2luZ2xlCi0gICAgICogICAgICAgICAgICBpbnB1dCBjaGFyYWN0ZXIsIG11c3QgYmUgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ5dGVzIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyIGZvciBvbmUgc2luZ2xlCisgICAgICogICAgICAgICAgICBpbnB1dCBjaGFyYWN0ZXIsIG11c3QgYmUgcG9zaXRpdmUuCiAgICAgICogQHBhcmFtIG1heEJ5dGVzUGVyQ2hhcgogICAgICAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggY2FuIGJlIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyCi0gICAgICogICAgICAgICAgICBmb3Igc2luZ2xlIGlucHV0IGNoYXJhY3RlciwgbXVzdCBiZSBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgZm9yIG9uZSBzaW5nbGUgaW5wdXQgY2hhcmFjdGVyLCBtdXN0IGJlIHBvc2l0aXZlLgogICAgICAqIEBwYXJhbSByZXBsYWNlbWVudAogICAgICAqICAgICAgICAgICAgdGhlIHJlcGxhY2VtZW50IGJ5dGUgYXJyYXksIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5LCBpdHMKLSAgICAgKiAgICAgICAgICAgIGxlbmd0aCBjYW5ub3QgbGFyZ2VyIHRoYW4gPGNvZGU+bWF4Qnl0ZXNQZXJDaGFyPC9jb2RlPiwgYW5kCi0gICAgICogICAgICAgICAgICBtdXN0IGJlIGxlZ2FsIHJlcGxhY2VtZW50LCB3aGljaCBjYW4gYmUganVzdGlmaWVkIGJ5Ci0gICAgICogICAgICAgICAgICB7QGxpbmsgI2lzTGVnYWxSZXBsYWNlbWVudChieXRlW10pIGlzTGVnYWxSZXBsYWNlbWVudH0KKyAgICAgKiAgICAgICAgICAgIGxlbmd0aCBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gPGNvZGU+bWF4Qnl0ZXNQZXJDaGFyPC9jb2RlPiwKKyAgICAgKiAgICAgICAgICAgIGFuZCBtdXN0IGJlIGEgbGVnYWwgcmVwbGFjZW1lbnQsIHdoaWNoIGNhbiBiZSBqdXN0aWZpZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjaXNMZWdhbFJlcGxhY2VtZW50KGJ5dGVbXSkgaXNMZWdhbFJlcGxhY2VtZW50fS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFueSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgaWYgYW55IHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENoYXJzZXRFbmNvZGVyKENoYXJzZXQgY3MsIGZsb2F0IGF2ZXJhZ2VCeXRlc1BlckNoYXIsCiAgICAgICAgICAgICBmbG9hdCBtYXhCeXRlc1BlckNoYXIsIGJ5dGVbXSByZXBsYWNlbWVudCkgewpAQCAtMjA4LDMxICsyMTAsMzUgQEAKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KICAgICAvKioKLSAgICAgKiBnZXQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ5dGVzIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyIGZvciBzaW5nbGUgaW5wdXQKLSAgICAgKiBjaGFyYWN0ZXIKKyAgICAgKiBHZXRzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBieXRlcyBjcmVhdGVkIGJ5IHRoaXMgZW5jb2RlciBmb3IgYSBzaW5nbGUKKyAgICAgKiBpbnB1dCBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYnl0ZXMgY3JlYXRlZCBieSB0aGlzIGVuY29kZXIgZm9yIHNpbmdsZQotICAgICAqICAgICAgICAgaW5wdXQgY2hhcmFjdGVyCisgICAgICogQHJldHVybiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYnl0ZXMgY3JlYXRlZCBieSB0aGlzIGVuY29kZXIgZm9yIGEgc2luZ2xlCisgICAgICogICAgICAgICBpbnB1dCBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IGF2ZXJhZ2VCeXRlc1BlckNoYXIoKSB7CiAgICAgICAgIHJldHVybiBhdmVyQnl0ZXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgaWYgZ2l2ZW4gY2hhcmFjdGVyIGNhbiBiZSBlbmNvZGVkIGJ5IHRoaXMgZW5jb2Rlci4KLSAgICAgKiAKKyAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCBieSB0aGlzIGVuY29kZXIuCisgICAgICogPHA+CiAgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBjaGFuZ2UgdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGlzIGVuY29kZXIsIHNvCi0gICAgICogaXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiBhbm90aGVyIGVuY29kZSBwcm9jZXNzIGlzIG9uZ29pbmcsIG90aGVyd2lzZQotICAgICAqIGl0IHdpbGwgdGhyb3cgPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKiAKKyAgICAgKiBpdCBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIGFub3RoZXIgZW5jb2RpbmcgcHJvY2VzcyBpcyBvbmdvaW5nLAorICAgICAqIG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4uCisgICAgICogPC9wPgorICAgICAqIDxwPgogICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGMKLSAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBlbmNvZGVyCi0gICAgICogQHJldHVybiB0cnVlIGlmIGdpdmVuIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCBieSB0aGlzIGVuY29kZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBlbmNvZGVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgYnkgdGhpcyBlbmNvZGVyLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBlbmNvZGUgcHJvY2VzcyBpcyBvbmdvaW5nIHNvIHRoYXQgY3VycmVudCBpbnRlcm5hbAotICAgICAqICAgICAgICAgICAgIHN0YXR1cyBpcyBuZWl0aGVyIFJFU0VUIG9yIEZMVVNICisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciBlbmNvZGUgcHJvY2VzcyBpcyBvbmdvaW5nIHNvIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0dXMgaXMgbmVpdGhlciBSRVNFVCBvciBGTFVTSC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5FbmNvZGUoY2hhciBjKSB7CiAgICAgICAgIHJldHVybiBpbXBsQ2FuRW5jb2RlKENoYXJCdWZmZXIud3JhcChuZXcgY2hhcltdIHsgYyB9KSk7CkBAIC0yNjQsMjEgKzI3MCwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrIGlmIGdpdmVuIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gY2FuIGJlIGVuY29kZWQgYnkgdGhpcworICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gY2FuIGJlIGVuY29kZWQgYnkgdGhpcwogICAgICAqIGVuY29kZXIuCiAgICAgICogCiAgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBjaGFuZ2UgdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGlzIGVuY29kZXIsIHNvCiAgICAgICogaXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiBhbm90aGVyIGVuY29kZSBwcm9jZXNzIGlzIG9uZ29pbmcsIG90aGVyd2lzZQotICAgICAqIGl0IHdpbGwgdGhyb3cgPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBpdCB3aWxsIHRocm93IGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4uCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZXF1ZW5jZQotICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ2l2ZW4gPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPiBjYW4gYmUgZW5jb2RlZCBieSB0aGlzCi0gICAgICogICAgICAgICBlbmNvZGVyCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gY2FuIGJlIGVuY29kZWQgYnkKKyAgICAgKiAgICAgICAgIHRoaXMgZW5jb2Rlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGN1cnJlbnQgaW50ZXJuYWwgc3RhdHVzIGlzIG5laXRoZXIgUkVTRVQgb3IgRkxVU0gKKyAgICAgKiAgICAgICAgICAgICBpZiBjdXJyZW50IGludGVybmFsIHN0YXR1cyBpcyBuZWl0aGVyIFJFU0VUIG9yIEZMVVNILgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhbkVuY29kZShDaGFyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKICAgICAgICAgQ2hhckJ1ZmZlciBjYjsKQEAgLTI5MSwxNiArMjk4LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSA8Y29kZT5DaGFyc2V0PC9jb2RlPiB3aGljaCBjcmVhdGVzIHRoaXMgZW5jb2Rlci4KKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5DaGFyc2V0PC9jb2RlPiB3aGljaCB0aGlzIGVuY29kZXIgdXNlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5DaGFyc2V0PC9jb2RlPiB3aGljaCBjcmVhdGVzIHRoaXMgZW5jb2RlcgorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IHdoaWNoIHRoaXMgZW5jb2RlciB1c2VzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDaGFyc2V0IGNoYXJzZXQoKSB7CiAgICAgICAgIHJldHVybiBjczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgZmFjYWRlIG1ldGhvZCBmb3IgZW5jb2Rpbmcgb3BlcmF0aW9uLgorICAgICAqIFRoaXMgaXMgYSBmYWNhZGUgbWV0aG9kIGZvciB0aGUgZW5jb2Rpbmcgb3BlcmF0aW9uLgogICAgICAqIDxwPgogICAgICAqIFRoaXMgbWV0aG9kIGVuY29kZXMgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXIgc2VxdWVuY2Ugb2YgdGhlIGdpdmVuCiAgICAgICogY2hhcmFjdGVyIGJ1ZmZlciBpbnRvIGEgbmV3IGJ5dGUgYnVmZmVyLiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBhIGNvbXBsZXRlCkBAIC0zMTEsMjYgKzMxOSwyNyBAQAogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBidWZmZXIKLSAgICAgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPkJ5dGVCdWZmZXI8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHRoZSBieXRlcyBwcm9kdWNlZAotICAgICAqICAgICAgICAgYnkgdGhpcyBlbmNvZGluZyBvcGVyYXRpb24uIFRoZSBidWZmZXIncyBsaW1pdCB3aWxsIGJlIHRoZQotICAgICAqICAgICAgICAgcG9zaXRpb24gb2YgbGFzdCBieXRlIGluIGJ1ZmZlciwgYW5kIHRoZSBwb3NpdGlvbiB3aWxsIGJlIHplcm8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBidWZmZXIuCisgICAgICogQHJldHVybiBhIG5ldyA8Y29kZT5CeXRlQnVmZmVyPC9jb2RlPiBjb250YWluaW5nIHRoZSBieXRlcyBwcm9kdWNlZCBieQorICAgICAqICAgICAgICAgdGhpcyBlbmNvZGluZyBvcGVyYXRpb24uIFRoZSBidWZmZXIncyBsaW1pdCB3aWxsIGJlIHRoZSBwb3NpdGlvbgorICAgICAqICAgICAgICAgb2YgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgYnVmZmVyLCBhbmQgdGhlIHBvc2l0aW9uIHdpbGwgYmUgemVyby4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIgZW5jb2Rpbmcgb3BlcmF0aW9uIGlzIG9uZ29pbmcKKyAgICAgKiAgICAgICAgICAgICBpZiBhbm90aGVyIGVuY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nLgogICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBpbGxlZ2FsIGlucHV0IGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhpcyBjaGFyc2V0CisgICAgICogICAgICAgICAgICAgaWYgYW4gaWxsZWdhbCBpbnB1dCBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoaXMgY2hhcnNldCBpcwogICAgICAqICAgICAgICAgICAgIGVuY291bnRlcmVkLCBhbmQgdGhlIGFjdGlvbiBmb3IgbWFsZm9ybWVkIGVycm9yIGlzCiAgICAgICogICAgICAgICAgICAge0BsaW5rIENvZGluZ0Vycm9yQWN0aW9uI1JFUE9SVCBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlR9CiAgICAgICogQHRocm93cyBVbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbGVnYWwgYnV0IHVubWFwcGFibGUgaW5wdXQgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGlzCi0gICAgICogICAgICAgICAgICAgY2hhcnNldCBlbmNvdW50ZXJlZCwgYW5kIHRoZSBhY3Rpb24gZm9yIHVubWFwcGFibGUgY2hhcmFjdGVyCi0gICAgICogICAgICAgICAgICAgZXJyb3IgaXMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGxlZ2FsIGJ1dCB1bm1hcHBhYmxlIGlucHV0IGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgIGNoYXJzZXQgaXMgZW5jb3VudGVyZWQsIGFuZCB0aGUgYWN0aW9uIGZvciB1bm1hcHBhYmxlCisgICAgICogICAgICAgICAgICAgY2hhcmFjdGVyIGVycm9yIGlzCiAgICAgICogICAgICAgICAgICAge0BsaW5rIENvZGluZ0Vycm9yQWN0aW9uI1JFUE9SVCBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlR9LgogICAgICAqICAgICAgICAgICAgIFVubWFwcGFibGUgbWVhbnMgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHNlcXVlbmNlIGF0IHRoZSBpbnB1dAogICAgICAqICAgICAgICAgICAgIGJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24gY2Fubm90IGJlIG1hcHBlZCB0byBhIGVxdWl2YWxlbnQKICAgICAgKiAgICAgICAgICAgICBieXRlIHNlcXVlbmNlLgogICAgICAqIEB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkIGR1cmluZyB0aGUgZW5jb2RlIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG90aGVyIGV4Y2VwdGlvbiBoYXBwZW5lZCBkdXJpbmcgdGhlIGVuY29kZSBvcGVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEJ5dGVCdWZmZXIgZW5jb2RlKENoYXJCdWZmZXIgaW4pCiAgICAgICAgICAgICB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKQEAgLTQxMCw1OCArNDE5LDU5IEBACiAgICAgICogZm9sbG93aW5nIHJ1bGVzOgogICAgICAqIDx1bD4KICAgICAgKiA8bGk+QSB7QGxpbmsgQ29kZXJSZXN1bHQjbWFsZm9ybWVkRm9yTGVuZ3RoKGludCkgbWFsZm9ybWVkIGlucHV0fSByZXN1bHQKLSAgICAgKiBpbmRpY2F0ZXMgdGhhdCBzb21lIG1hbGZvcm1lZCBpbnB1dCBlcnJvciBlbmNvdW50ZXJlZCwgYW5kIHRoZSBlcnJvbmVvdXMKLSAgICAgKiBjaGFyYWN0ZXJzIHN0YXJ0IGF0IHRoZSBpbnB1dCBidWZmZXIncyBwb3NpdGlvbiBhbmQgdGhlaXIgbnVtYmVyIGNhbiBiZQotICAgICAqIGdvdCBieSByZXN1bHQncyB7QGxpbmsgQ29kZXJSZXN1bHQjbGVuZ3RoKCkgbGVuZ3RofS4gVGhpcyBraW5kIG9mIHJlc3VsdAotICAgICAqIGNhbiBiZSByZXR1cm5lZCBvbmx5IGlmIHRoZSBtYWxmb3JtZWQgYWN0aW9uIGlzCi0gICAgICoge0BsaW5rIENvZGluZ0Vycm9yQWN0aW9uI1JFUE9SVCBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlR9LiA8L2xpPgorICAgICAqIGluZGljYXRlcyB0aGF0IHNvbWUgbWFsZm9ybWVkIGlucHV0IGVycm9yIHdhcyBlbmNvdW50ZXJlZCwgYW5kIHRoZQorICAgICAqIGVycm9uZW91cyBjaGFyYWN0ZXJzIHN0YXJ0IGF0IHRoZSBpbnB1dCBidWZmZXIncyBwb3NpdGlvbiBhbmQgdGhlaXIKKyAgICAgKiBudW1iZXIgY2FuIGJlIGdvdCBieSByZXN1bHQncyB7QGxpbmsgQ29kZXJSZXN1bHQjbGVuZ3RoKCkgbGVuZ3RofS4gVGhpcworICAgICAqIGtpbmQgb2YgcmVzdWx0IGNhbiBiZSByZXR1cm5lZCBvbmx5IGlmIHRoZSBtYWxmb3JtZWQgYWN0aW9uIGlzCisgICAgICoge0BsaW5rIENvZGluZ0Vycm9yQWN0aW9uI1JFUE9SVCBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlR9LjwvbGk+CiAgICAgICogPGxpPntAbGluayBDb2RlclJlc3VsdCNVTkRFUkZMT1cgQ29kZXJSZXN1bHQuVU5ERVJGTE9XfSBpbmRpY2F0ZXMgdGhhdAotICAgICAqIGFzIG1hbnkgY2hhcmFjdGVycyBhcyBwb3NzaWJsZSBpbiB0aGUgaW5wdXQgYnVmZmVyIGhhcyBiZWVuIGVuY29kZWQuIElmCisgICAgICogYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlIGluIHRoZSBpbnB1dCBidWZmZXIgaGF2ZSBiZWVuIGVuY29kZWQuIElmCiAgICAgICogdGhlcmUgaXMgbm8gZnVydGhlciBpbnB1dCBhbmQgbm8gY2hhcmFjdGVycyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgdGhlbgogICAgICAqIHRoaXMgdGFzayBpcyBjb21wbGV0ZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgdGhlbiB0aGUgY2xpZW50IHNob3VsZAogICAgICAqIGNhbGwgdGhpcyBtZXRob2QgYWdhaW4gc3VwcGx5aW5nIHNvbWUgbW9yZSBpbnB1dCBjaGFyYWN0ZXJzLjwvbGk+CiAgICAgICogPGxpPntAbGluayBDb2RlclJlc3VsdCNPVkVSRkxPVyBDb2RlclJlc3VsdC5PVkVSRkxPV30gaW5kaWNhdGVzIHRoYXQgdGhlCiAgICAgICogb3V0cHV0IGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQsIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCBzb21lIGNoYXJhY3RlcnMKICAgICAgKiByZW1haW5pbmcgaW4gdGhlIGlucHV0IGJ1ZmZlci4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGludm9rZWQgYWdhaW4gd2l0aCBhCi0gICAgICogbm9uLWZ1bGwgb3V0cHV0IGJ1ZmZlciA8L2xpPgorICAgICAqIG5vbi1mdWxsIG91dHB1dCBidWZmZXIuPC9saT4KICAgICAgKiA8bGk+QSB7QGxpbmsgQ29kZXJSZXN1bHQjdW5tYXBwYWJsZUZvckxlbmd0aChpbnQpIHVubWFwcGFibGUgY2hhcmFjdGVyfQogICAgICAqIHJlc3VsdCBpbmRpY2F0ZXMgdGhhdCBzb21lIHVubWFwcGFibGUgY2hhcmFjdGVyIGVycm9yIHdhcyBlbmNvdW50ZXJlZCwKICAgICAgKiBhbmQgdGhlIGVycm9uZW91cyBjaGFyYWN0ZXJzIHN0YXJ0IGF0IHRoZSBpbnB1dCBidWZmZXIncyBwb3NpdGlvbiBhbmQKICAgICAgKiB0aGVpciBudW1iZXIgY2FuIGJlIGdvdCBieSByZXN1bHQncyB7QGxpbmsgQ29kZXJSZXN1bHQjbGVuZ3RoKCkgbGVuZ3RofS4KICAgICAgKiBUaGlzIGtpbmQgb2YgcmVzdWx0IGNhbiBiZSByZXR1cm5lZCBvbmx5IG9uCi0gICAgICoge0BsaW5rIENvZGluZ0Vycm9yQWN0aW9uI1JFUE9SVCBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlR9LiA8L2xpPgorICAgICAqIHtAbGluayBDb2RpbmdFcnJvckFjdGlvbiNSRVBPUlQgQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUfS48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSA8Y29kZT5lbmRPZklucHV0PC9jb2RlPiBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIGludm9rZXIgY2FuCisgICAgICogVGhlIDxjb2RlPmVuZE9mSW5wdXQ8L2NvZGU+IHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhlIGludm9rZXIgY2FuCiAgICAgICogcHJvdmlkZXIgZnVydGhlciBpbnB1dC4gVGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUKLSAgICAgKiBjaGFyYWN0ZXJzIGluIGN1cnJlbnQgaW5wdXQgYnVmZmVyIGFyZSBhbGwgaW5wdXRzIGZvciB0aGlzIGVuY29kaW5nCi0gICAgICogb3BlcmF0aW9uLiBOb3RlIHRoYXQgaXQgaXMgY29tbW9uIGFuZCB3b24ndCBjYXVzZSBlcnJvciB0aGF0IHRoZSBpbnZva2VyCi0gICAgICogc2V0cyBmYWxzZSBhbmQgdGhlbiBmaW5kcyBubyBtb3JlIGlucHV0IGF2YWlsYWJsZTsgd2hpbGUgaXQgbWF5IGNhdXNlCi0gICAgICogZXJyb3IgdGhhdCB0aGUgaW52b2tlciBhbHdheXMgc2V0cyB0cnVlIGluIHNldmVyYWwgY29uc2VjdXRpdmUKLSAgICAgKiBpbnZvY2F0aW9ucyBzbyB0aGF0IGFueSByZW1haW5pbmcgaW5wdXQgd2lsbCBiZSB0cmVhdGVkIGFzIG1hbGZvcm1lZAorICAgICAqIGNoYXJhY3RlcnMgaW4gdGhlIGN1cnJlbnQgaW5wdXQgYnVmZmVyIGFyZSBhbGwgaW5wdXRzIGZvciB0aGlzIGVuY29kaW5nCisgICAgICogb3BlcmF0aW9uLiBOb3RlIHRoYXQgaXQgaXMgY29tbW9uIGFuZCB3b24ndCBjYXVzZSBhbiBlcnJvciBpZiB0aGUgaW52b2tlcgorICAgICAqIHNldHMgZmFsc2UgYW5kIHRoZW4gaGFzIG5vIG1vcmUgaW5wdXQgYXZhaWxhYmxlLCB3aGlsZSBpdCBtYXkgY2F1c2UgYW4KKyAgICAgKiBlcnJvciBpZiB0aGUgaW52b2tlciBhbHdheXMgc2V0cyB0cnVlIGluIHNldmVyYWwgY29uc2VjdXRpdmUgaW52b2NhdGlvbnMuCisgICAgICogVGhpcyB3b3VsZCBtYWtlIHRoZSByZW1haW5pbmcgaW5wdXQgdG8gYmUgdHJlYXRlZCBhcyBtYWxmb3JtZWQgaW5wdXQuCiAgICAgICogaW5wdXQuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMKKyAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIHRoZQogICAgICAqIHtAbGluayAjZW5jb2RlTG9vcChDaGFyQnVmZmVyLCBCeXRlQnVmZmVyKSBlbmNvZGVMb29wfSBtZXRob2QgdG8KLSAgICAgKiBpbXBsZW1lbnQgYmFzaWMgZW5jb2RlIGxvZ2ljIGZvciBzcGVjaWZpYyBjaGFyc2V0LgorICAgICAqIGltcGxlbWVudCB0aGUgYmFzaWMgZW5jb2RlIGxvZ2ljIGZvciBhIHNwZWNpZmljIGNoYXJzZXQuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCiAgICAgICogQHBhcmFtIGVuZE9mSW5wdXQKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgYWxsIHRoZSBpbnB1dCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBwcm92aWRlZAotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db2RlclJlc3VsdDwvY29kZT4gaW5zdGFuY2UgaW5kaWNhdGluZyB0aGUgcmVzdWx0CisgICAgICogICAgICAgICAgICB0cnVlIGlmIGFsbCB0aGUgaW5wdXQgY2hhcmFjdGVycyBoYXZlIGJlZW4gcHJvdmlkZWQuCisgICAgICogQHJldHVybiBhIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPiBpbnN0YW5jZSBpbmRpY2F0aW5nIHRoZSByZXN1bHQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5jb2Rpbmcgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IHN0YXJ0ZWQgb3Igbm8gbW9yZQotICAgICAqICAgICAgICAgICAgIGlucHV0IG5lZWRlZCBpbiB0aGlzIGVuY29kaW5nIHByb2dyZXNzLgorICAgICAqICAgICAgICAgICAgIGlucHV0IGlzIG5lZWRlZCBpbiB0aGlzIGVuY29kaW5nIHByb2Nlc3MuCiAgICAgICogQHRocm93cyBDb2Rlck1hbGZ1bmN0aW9uRXJyb3IKICAgICAgKiAgICAgICAgICAgICBJZiB0aGUge0BsaW5rICNlbmNvZGVMb29wKENoYXJCdWZmZXIsIEJ5dGVCdWZmZXIpIGVuY29kZUxvb3B9CiAgICAgICogICAgICAgICAgICAgbWV0aG9kIHRocmV3IGFuIDxjb2RlPkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb248L2NvZGU+CisgICAgICogICAgICAgICAgICAgPGNvZGU+QnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ29kZXJSZXN1bHQgZW5jb2RlKENoYXJCdWZmZXIgaW4sIEJ5dGVCdWZmZXIgb3V0LAogICAgICAgICAgICAgYm9vbGVhbiBlbmRPZklucHV0KSB7CkBAIC01MTIsNjggKzUyMiw3NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuY29kZSBjaGFyYWN0ZXJzIGludG8gYnl0ZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQorICAgICAqIEVuY29kZXMgY2hhcmFjdGVycyBpbnRvIGJ5dGVzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgKiB7QGxpbmsgI2VuY29kZShDaGFyQnVmZmVyLCBCeXRlQnVmZmVyLCBib29sZWFuKSBlbmNvZGV9LgotICAgICAqIAorICAgICAqIDxwPgogICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBlc3NlbnRpYWwgZW5jb2Rpbmcgb3BlcmF0aW9uLCBhbmQgaXQgd29uJ3QKICAgICAgKiBzdG9wIGVuY29kaW5nIHVudGlsIGVpdGhlciBhbGwgdGhlIGlucHV0IGNoYXJhY3RlcnMgYXJlIHJlYWQsIHRoZSBvdXRwdXQKLSAgICAgKiBidWZmZXIgaXMgZmlsbGVkLCBvciBzb21lIGV4Y2VwdGlvbiBlbmNvdW50ZXJlZC4gQW5kIHRoZW4gaXQgd2lsbCByZXR1cm4KLSAgICAgKiBhIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgcmVzdWx0IG9mIGN1cnJlbnQKLSAgICAgKiBlbmNvZGluZyBvcGVyYXRpb24uIFRoZSBydWxlcyB0byBjb25zdHJ1Y3QgdGhlIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPgotICAgICAqIGlzIHNhbWUgYXMgdGhlIHtAbGluayAjZW5jb2RlKENoYXJCdWZmZXIsIEJ5dGVCdWZmZXIsIGJvb2xlYW4pIGVuY29kZX0uCi0gICAgICogV2hlbiBleGNlcHRpb24gZW5jb3VudGVyZWQgaW4gdGhlIGVuY29kaW5nIG9wZXJhdGlvbiwgbW9zdCBpbXBsZW1lbnRhdGlvbgotICAgICAqIG9mIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgcmVsZXZhbnQgcmVzdWx0IG9iamVjdCB0bworICAgICAqIGJ1ZmZlciBpcyBmaWxsZWQsIG9yIHNvbWUgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkLiBUaGVuIGl0IHdpbGwKKyAgICAgKiByZXR1cm4gYSA8Y29kZT5Db2RlclJlc3VsdDwvY29kZT4gb2JqZWN0IGluZGljYXRpbmcgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgKiBjdXJyZW50IGVuY29kaW5nIG9wZXJhdGlvbi4gVGhlIHJ1bGUgdG8gY29uc3RydWN0IHRoZQorICAgICAqIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPiBpcyB0aGUgc2FtZSBhcyBmb3IKKyAgICAgKiB7QGxpbmsgI2VuY29kZShDaGFyQnVmZmVyLCBCeXRlQnVmZmVyLCBib29sZWFuKSBlbmNvZGV9LiBXaGVuIGFuCisgICAgICogZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkIGluIHRoZSBlbmNvZGluZyBvcGVyYXRpb24sIG1vc3QgaW1wbGVtZW50YXRpb25zCisgICAgICogb2YgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSByZWxldmFudCByZXN1bHQgb2JqZWN0IHRvIHRoZQogICAgICAqIHtAbGluayAjZW5jb2RlKENoYXJCdWZmZXIsIEJ5dGVCdWZmZXIsIGJvb2xlYW4pIGVuY29kZX0gbWV0aG9kLCBhbmQgc29tZQogICAgICAqIHBlcmZvcm1hbmNlIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBtYXkgaGFuZGxlIHRoZSBleGNlcHRpb24gYW5kCiAgICAgICogaW1wbGVtZW50IHRoZSBlcnJvciBhY3Rpb24gaXRzZWxmLgotICAgICAqIAorICAgICAqIDwvcD48cD4KICAgICAgKiBUaGUgYnVmZmVycyBhcmUgc2Nhbm5lZCBmcm9tIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25zLCBhbmQgdGhlaXIgcG9zaXRpb25zCiAgICAgICogd2lsbCBiZSBtb2RpZmllZCBhY2NvcmRpbmdseSwgd2hpbGUgdGhlaXIgbWFya3MgYW5kIGxpbWl0cyB3aWxsIGJlCiAgICAgICogaW50YWN0LiBBdCBtb3N0IHtAbGluayBDaGFyQnVmZmVyI3JlbWFpbmluZygpIGluLnJlbWFpbmluZygpfSBjaGFyYWN0ZXJzCiAgICAgICogd2lsbCBiZSByZWFkLCBhbmQge0BsaW5rIEJ5dGVCdWZmZXIjcmVtYWluaW5nKCkgb3V0LnJlbWFpbmluZygpfSBieXRlcwogICAgICAqIHdpbGwgYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgc29tZSBpbXBsZW1lbnRhdGlvbiBtYXkgcHJlLXNjYW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmV0dXJuCisgICAgICogPC9wPjxwPgorICAgICAqIE5vdGUgdGhhdCBzb21lIGltcGxlbWVudGF0aW9ucyBtYXkgcHJlLXNjYW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmV0dXJuCiAgICAgICogPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPiB1bnRpbCBpdCByZWNlaXZlcyBzdWZmaWNpZW50IGlucHV0LgotICAgICAqIAorICAgICAqIDxwPgogICAgICAqIEBwYXJhbSBpbgotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlci4KICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlcgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db2RlclJlc3VsdDwvY29kZT4gaW5zdGFuY2UgaW5kaWNhdGluZyB0aGUgcmVzdWx0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Q29kZXJSZXN1bHQ8L2NvZGU+IGluc3RhbmNlIGluZGljYXRpbmcgdGhlIHJlc3VsdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29kZXJSZXN1bHQgZW5jb2RlTG9vcChDaGFyQnVmZmVyIGluLCBCeXRlQnVmZmVyIG91dCk7CiAKICAgICAvKioKLSAgICAgKiBGbHVzaCB0aGlzIGVuY29kZXIuCi0gICAgICogCisgICAgICogRmx1c2hlcyB0aGlzIGVuY29kZXIuCisgICAgICogPHA+CiAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBjYWxsIHtAbGluayAjaW1wbEZsdXNoKEJ5dGVCdWZmZXIpIGltcGxGbHVzaH0uIFNvbWUKICAgICAgKiBlbmNvZGVycyBtYXkgbmVlZCB0byB3cml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gdGhleSBoYXZlCiAgICAgICogcmVhZCBhbGwgaW5wdXQgY2hhcmFjdGVycywgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGRlbgogICAgICAqIHtAbGluayAjaW1wbEZsdXNoKEJ5dGVCdWZmZXIpIGltcGxGbHVzaH0gdG8gcGVyZm9ybSB3cml0aW5nIGFjdGlvbi4KLSAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogPHA+CiAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMgd29uJ3QgbGFyZ2VyIHRoYW4KLSAgICAgKiB7QGxpbmsgQnl0ZUJ1ZmZlciNyZW1haW5pbmcoKSBvdXQucmVtYWluaW5nKCl9LiBJZiBzb21lIGVuY29kZXIgd2FudCB0bwotICAgICAqIHdyaXRlIG1vcmUgYnl0ZXMgdGhhbiBvdXRwdXQgYnVmZmVyJ3MgcmVtYWluaW5nIHNwYWNlcywgdGhlbgorICAgICAqIHtAbGluayBCeXRlQnVmZmVyI3JlbWFpbmluZygpIG91dC5yZW1haW5pbmcoKX0uIElmIHNvbWUgZW5jb2RlciB3YW50cyB0bworICAgICAqIHdyaXRlIG1vcmUgYnl0ZXMgdGhhbiB0aGUgb3V0cHV0IGJ1ZmZlcidzIGF2YWlsYWJsZSByZW1haW5pbmcgc3BhY2UsIHRoZW4KICAgICAgKiA8Y29kZT5Db2RlclJlc3VsdC5PVkVSRkxPVzwvY29kZT4gd2lsbCBiZSByZXR1cm5lZCwgYW5kIHRoaXMgbWV0aG9kCi0gICAgICogbXVzdCBiZSBjYWxsZWQgYWdhaW4gd2l0aCBhIGJ5dGUgYnVmZmVyIGhhcyBtb3JlIHNwYWNlcy4gT3RoZXJ3aXNlIHRoaXMKLSAgICAgKiBtZXRob2Qgd2lsbCByZXR1cm4gPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPiwgd2hpY2ggbWVhbnMgb25lCi0gICAgICogZW5jb2RpbmcgcHJvY2VzcyBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotICAgICAqIAorICAgICAqIG11c3QgYmUgY2FsbGVkIGFnYWluIHdpdGggYSBieXRlIGJ1ZmZlciB0aGF0IGhhcyBmcmVlIHNwYWNlLiBPdGhlcndpc2UKKyAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5Db2RlclJlc3VsdC5VTkRFUkZMT1c8L2NvZGU+LCB3aGljaAorICAgICAqIG1lYW5zIG9uZSBlbmNvZGluZyBwcm9jZXNzIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogPC9wPgorICAgICAqIDxwPgogICAgICAqIER1cmluZyB0aGUgZmx1c2gsIHRoZSBvdXRwdXQgYnVmZmVyJ3MgcG9zaXRpb24gd2lsbCBiZSBjaGFuZ2VkCiAgICAgICogYWNjb3JkaW5nbHksIHdoaWxlIGl0cyBtYXJrIGFuZCBsaW1pdCB3aWxsIGJlIGludGFjdC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBvdXRwdXQgYnVmZmVyLgogICAgICAqIEByZXR1cm4gPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgPGNvZGU+Q29kZXJSZXN1bHQuT1ZFUkZMT1c8L2NvZGU+CisgICAgICogICAgICAgICA8Y29kZT5Db2RlclJlc3VsdC5PVkVSRkxPVzwvY29kZT4uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGVuY29kZXIgaGFzbid0IHJlYWQgYWxsIGlucHV0IGNoYXJhY3RlcnMgZHVyaW5nIG9uZQogICAgICAqICAgICAgICAgICAgIGVuY29kaW5nIHByb2Nlc3MsIHdoaWNoIG1lYW5zIG5laXRoZXIgYWZ0ZXIgY2FsbGluZwogICAgICAqICAgICAgICAgICAgIHtAbGluayAjZW5jb2RlKENoYXJCdWZmZXIpIGVuY29kZShDaGFyQnVmZmVyKX0gbm9yIGFmdGVyCiAgICAgICogICAgICAgICAgICAgY2FsbGluZyB7QGxpbmsgI2VuY29kZShDaGFyQnVmZmVyLCBCeXRlQnVmZmVyLCBib29sZWFuKSAKLSAgICAgKiAgICAgICAgICAgICBlbmNvZGUoQ2hhckJ1ZmZlciwgQnl0ZUJ1ZmZlciwgYm9vbGVhbil9IHdpdGggdHJ1ZSB2YWx1ZSBmb3IKLSAgICAgKiAgICAgICAgICAgICB0aGUgbGFzdCBib29sZWFuIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgIGVuY29kZShDaGFyQnVmZmVyLCBCeXRlQnVmZmVyLCBib29sZWFuKX0gd2l0aCB7QGNvZGUgdHJ1ZX0KKyAgICAgKiAgICAgICAgICAgICBmb3IgdGhlIGxhc3QgYm9vbGVhbiBwYXJhbWV0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENvZGVyUmVzdWx0IGZsdXNoKEJ5dGVCdWZmZXIgb3V0KSB7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gRU5EICYmIHN0YXR1cyAhPSBJTklUKSB7CkBAIC01ODcsNjQgKzYwMyw3MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIHRoaXMgZW5jb2Rlci4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIGFsd2F5cyByZXR1cm4KLSAgICAgKiA8Y29kZT5Db2RlclJlc3VsdC5VTkRFUkZMT1c8L2NvZGU+LCBhbmQgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4KLSAgICAgKiBpZiBuZWVkZWQuCisgICAgICogRmx1c2hlcyB0aGlzIGVuY29kZXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgYWx3YXlzCisgICAgICogcmV0dXJucyA8Y29kZT5Db2RlclJlc3VsdC5VTkRFUkZMT1c8L2NvZGU+OyB0aGlzIG1ldGhvZCBjYW4gYmUKKyAgICAgKiBvdmVycmlkZGVuIGlmIG5lZWRlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCiAgICAgICogQHJldHVybiA8Y29kZT5Db2RlclJlc3VsdC5VTkRFUkZMT1c8L2NvZGU+IG9yCi0gICAgICogICAgICAgICA8Y29kZT5Db2RlclJlc3VsdC5PVkVSRkxPVzwvY29kZT4KKyAgICAgKiAgICAgICAgIDxjb2RlPkNvZGVyUmVzdWx0Lk9WRVJGTE9XPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ29kZXJSZXN1bHQgaW1wbEZsdXNoKEJ5dGVCdWZmZXIgb3V0KSB7CiAgICAgICAgIHJldHVybiBDb2RlclJlc3VsdC5VTkRFUkZMT1c7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTm90aWZ5IHRoYXQgdGhpcyBlbmNvZGVyJ3MgPGNvZGU+Q29kaW5nRXJyb3JBY3Rpb248L2NvZGU+IHNwZWNpZmllZCBmb3IKLSAgICAgKiBtYWxmb3JtZWQgaW5wdXQgZXJyb3IgaGFzIGJlZW4gY2hhbmdlZC4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzCi0gICAgICogbm90aGluZywgYW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZC4KKyAgICAgKiBOb3RpZmllcyB0aGF0IHRoaXMgZW5jb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiBzcGVjaWZpZWQKKyAgICAgKiBmb3IgbWFsZm9ybWVkIGlucHV0IGVycm9yIGhhcyBiZWVuIGNoYW5nZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogZG9lcyBub3RoaW5nOyB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld0FjdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIG5ldyBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYWN0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGltcGxPbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uIG5ld0FjdGlvbikgewogICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTm90aWZ5IHRoYXQgdGhpcyBlbmNvZGVyJ3MgPGNvZGU+Q29kaW5nRXJyb3JBY3Rpb248L2NvZGU+IHNwZWNpZmllZCBmb3IKLSAgICAgKiB1bm1hcHBhYmxlIGNoYXJhY3RlciBlcnJvciBoYXMgYmVlbiBjaGFuZ2VkLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMKLSAgICAgKiBub3RoaW5nLCBhbmQgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkLgorICAgICAqIE5vdGlmaWVzIHRoYXQgdGhpcyBlbmNvZGVyJ3MgPGNvZGU+Q29kaW5nRXJyb3JBY3Rpb248L2NvZGU+IHNwZWNpZmllZAorICAgICAqIGZvciB1bm1hcHBhYmxlIGNoYXJhY3RlciBlcnJvciBoYXMgYmVlbiBjaGFuZ2VkLiBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZzsgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuZXdBY3Rpb24KLSAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgYWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGFjdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBpbXBsT25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uIG5ld0FjdGlvbikgewogICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTm90aWZ5IHRoYXQgdGhpcyBlbmNvZGVyJ3MgcmVwbGFjZW1lbnQgaGFzIGJlZW4gY2hhbmdlZC4gRGVmYXVsdAotICAgICAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZywgYW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZC4KKyAgICAgKiBOb3RpZmllcyB0aGF0IHRoaXMgZW5jb2RlcidzIHJlcGxhY2VtZW50IGhhcyBiZWVuIGNoYW5nZWQuIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nOyB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld1JlcGxhY2VtZW50Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHJlcGxhY2VtZW50IHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIG5ldyByZXBsYWNlbWVudCBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgaW1wbFJlcGxhY2VXaXRoKGJ5dGVbXSBuZXdSZXBsYWNlbWVudCkgewogICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzZXQgdGhpcyBlbmNvZGVyJ3MgY2hhcnNldCByZWxhdGVkIHN0YXRlLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMKLSAgICAgKiBub3RoaW5nLCBhbmQgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkLgorICAgICAqIFJlc2V0cyB0aGlzIGVuY29kZXIncyBjaGFyc2V0IHJlbGF0ZWQgc3RhdGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogZG9lcyBub3RoaW5nOyB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgaW1wbFJlc2V0KCkgewogICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIGxlZ2FsIGFzIHRoaXMgZW5jb2RlcidzIHJlcGxhY2VtZW50IGJ5dGUKKyAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIGxlZ2FsIGFzIHRoaXMgZW5jb2RlcidzIHJlcGxhY2VtZW50IGJ5dGUKICAgICAgKiBhcnJheS4KICAgICAgKiAKICAgICAgKiBUaGUgZ2l2ZW4gYnl0ZSBhcnJheSBpcyBsZWdhbCBpZiBhbmQgb25seSBpZiBpdCBjYW4gYmUgZGVjb2RlIGludG8KQEAgLTY1Myw5ICs2NzUsMTAgQEAKICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlcGwKLSAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBieXRlIGFycmF5IHRvIGJlIGNoZWNrZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBieXRlIGFycmF5IHRvIGJlIGNoZWNrZWQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgbGVnYWwgYXMgdGhpcyBlbmNvZGVyJ3MKICAgICAgKiAgICAgICAgIHJlcGxhY2VtZW50IGJ5dGUgYXJyYXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMZWdhbFJlcGxhY2VtZW50KGJ5dGVbXSByZXBsKSB7CiAgICAgICAgIGlmIChkZWNvZGVyID09IG51bGwpIHsKQEAgLTY3NiwzOSArNjk5LDQyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGlzIGVuY29kZXIncyA8Y29kZT5Db2RpbmdFcnJvckFjdGlvbjwvY29kZT4gd2hlbiBtYWxmb3JtZWQgaW5wdXQKLSAgICAgKiBvY2N1cnJlZCBkdXJpbmcgZW5jb2RpbmcgcHJvY2Vzcy4KKyAgICAgKiBHZXRzIHRoaXMgZW5jb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiB3aGVuIGEgbWFsZm9ybWVkCisgICAgICogaW5wdXQgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBlbmNvZGluZyBwcm9jZXNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBlbmNvZGVyJ3MgPGNvZGU+Q29kaW5nRXJyb3JBY3Rpb248L2NvZGU+IHdoZW4gbWFsZm9ybWVkCi0gICAgICogICAgICAgICBpbnB1dCBvY2N1cnJlZCBkdXJpbmcgZW5jb2RpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgZW5jb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiB3aGVuIGEgbWFsZm9ybWVkCisgICAgICogICAgICAgICBpbnB1dCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGVuY29kaW5nIHByb2Nlc3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvZGluZ0Vycm9yQWN0aW9uIG1hbGZvcm1lZElucHV0QWN0aW9uKCkgewogICAgICAgICByZXR1cm4gbWFsZm9ybUFjdGlvbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBiZSBjcmVhdGVkIGJ5IHRoaXMgZW5jb2RlciBmb3IKLSAgICAgKiBvbmUgaW5wdXQgY2hhcmFjdGVyLCBtdXN0IGJlIHBvc2l0aXZlCisgICAgICogR2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggY2FuIGJlIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyIGZvcgorICAgICAqIG9uZSBpbnB1dCBjaGFyYWN0ZXIsIG11c3QgYmUgcG9zaXRpdmUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggY2FuIGJlIGNyZWF0ZWQgYnkgdGhpcyBlbmNvZGVyCi0gICAgICogICAgICAgICBmb3Igb25lIGlucHV0IGNoYXJhY3RlciwgbXVzdCBiZSBwb3NpdGl2ZQorICAgICAqICAgICAgICAgZm9yIG9uZSBpbnB1dCBjaGFyYWN0ZXIsIG11c3QgYmUgcG9zaXRpdmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IG1heEJ5dGVzUGVyQ2hhcigpIHsKICAgICAgICAgcmV0dXJuIG1heEJ5dGVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGlzIGVuY29kZXIncyBhY3Rpb24gb24gbWFsZm9ybWVkIGlucHV0IGVycm9yLgorICAgICAqIFNldHMgdGhpcyBlbmNvZGVyJ3MgYWN0aW9uIG9uIG1hbGZvcm1lZCBpbnB1dCBlcnJvci4KICAgICAgKiAKICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNhbGwgdGhlCiAgICAgICoge0BsaW5rICNpbXBsT25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbikgaW1wbE9uTWFsZm9ybWVkSW5wdXR9CiAgICAgICogbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5ldyBhY3Rpb24gYXMgYXJndW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5ld0FjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhY3Rpb24gb24gbWFsZm9ybWVkIGlucHV0IGVycm9yCi0gICAgICogQHJldHVybiB0aGlzIGVuY29kZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYWN0aW9uIG9uIG1hbGZvcm1lZCBpbnB1dCBlcnJvci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgZW5jb2Rlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBuZXdBY3Rpb24gaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBuZXdBY3Rpb24gaXMgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2hhcnNldEVuY29kZXIgb25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbiBuZXdBY3Rpb24pIHsKICAgICAgICAgaWYgKG51bGwgPT0gbmV3QWN0aW9uKSB7CkBAIC03MjEsMTcgKzc0NywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGlzIGVuY29kZXIncyBhY3Rpb24gb24gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IuCisgICAgICogU2V0cyB0aGlzIGVuY29kZXIncyBhY3Rpb24gb24gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZXJyb3IuCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBjYWxsIHRoZQogICAgICAqIHtAbGluayAjaW1wbE9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbikgaW1wbE9uVW5tYXBwYWJsZUNoYXJhY3Rlcn0KICAgICAgKiBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gbmV3IGFjdGlvbiBhcyBhcmd1bWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3QWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IGFjdGlvbiBvbiB1bm1hcHBhYmxlIGNoYXJhY3RlciBlcnJvcgotICAgICAqIEByZXR1cm4gdGhpcyBlbmNvZGVyCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGFjdGlvbiBvbiB1bm1hcHBhYmxlIGNoYXJhY3RlciBlcnJvci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgZW5jb2Rlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBuZXdBY3Rpb24gaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBuZXdBY3Rpb24gaXMgbnVsbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2hhcnNldEVuY29kZXIgb25Vbm1hcHBhYmxlQ2hhcmFjdGVyKAogICAgICAgICAgICAgQ29kaW5nRXJyb3JBY3Rpb24gbmV3QWN0aW9uKSB7CkBAIC03NDUsMzMgKzc3MiwzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgcmVwbGFjZW1lbnQgYnl0ZSBhcnJheSwgd2hpY2ggaXMgbmV2ZXIgbnVsbCBvciBlbXB0eSwgYW5kIGl0IGlzCi0gICAgICogbGVnYWwKKyAgICAgKiBHZXRzIHRoZSByZXBsYWNlbWVudCBieXRlIGFycmF5LCB3aGljaCBpcyBuZXZlciBudWxsIG9yIGVtcHR5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlcGxhY2VtZW50IGJ5dGUgYXJyYXksIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5LCBhbmQgaXQgaXMKLSAgICAgKiAgICAgICAgIGxlZ2FsCisgICAgICogQHJldHVybiB0aGUgcmVwbGFjZW1lbnQgYnl0ZSBhcnJheSwgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSByZXBsYWNlbWVudCgpIHsKICAgICAgICAgcmV0dXJuIHJlcGxhY2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IG5ldyByZXBsYWNlbWVudCB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSBuZXcgcmVwbGFjZW1lbnQgdmFsdWUuCiAgICAgICogCiAgICAgICogVGhpcyBtZXRob2QgZmlyc3QgY2hlY2tzIHRoZSBnaXZlbiByZXBsYWNlbWVudCdzIHZhbGlkaXR5LCB0aGVuIGNoYW5nZXMKLSAgICAgKiB0aGUgcmVwbGFjZW1lbnQgdmFsdWUsIGFuZCBhdCBsYXN0IGNhbGxzCisgICAgICogdGhlIHJlcGxhY2VtZW50IHZhbHVlIGFuZCBmaW5hbGx5IGNhbGxzIHRoZQogICAgICAqIHtAbGluayAjaW1wbFJlcGxhY2VXaXRoKGJ5dGVbXSkgaW1wbFJlcGxhY2VXaXRofSBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4KICAgICAgKiBuZXcgcmVwbGFjZW1lbnQgYXMgYXJndW1lbnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlcGxhY2VtZW50CiAgICAgICogICAgICAgICAgICB0aGUgcmVwbGFjZW1lbnQgYnl0ZSBhcnJheSwgY2Fubm90IGJlIG51bGwgb3IgZW1wdHksIGl0cwotICAgICAqICAgICAgICAgICAgbGVuZ3RoIGNhbm5vdCBsYXJnZXIgdGhhbiA8Y29kZT5tYXhCeXRlc1BlckNoYXI8L2NvZGU+LCBhbmQKLSAgICAgKiAgICAgICAgICAgIG11c3QgYmUgbGVnYWwgcmVwbGFjZW1lbnQsIHdoaWNoIGNhbiBiZSBqdXN0aWZpZWQgYnkKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmlzTGVnYWxSZXBsYWNlbWVudChieXRlW10gcmVwbCk8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGlzIGVuY29kZXIKKyAgICAgKiAgICAgICAgICAgIGxlbmd0aCBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gPGNvZGU+bWF4Qnl0ZXNQZXJDaGFyPC9jb2RlPiwKKyAgICAgKiAgICAgICAgICAgIGFuZCBpdCBtdXN0IGJlIGxlZ2FsIHJlcGxhY2VtZW50LCB3aGljaCBjYW4gYmUganVzdGlmaWVkIGJ5CisgICAgICogICAgICAgICAgICBjYWxsaW5nIDxjb2RlPmlzTGVnYWxSZXBsYWNlbWVudChieXRlW10gcmVwbCk8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhpcyBlbmNvZGVyLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIHJlcGxhY2VtZW50IGNhbm5vdCBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudAotICAgICAqICAgICAgICAgICAgIG1lbnRpb25lZCBhYm92ZQorICAgICAqICAgICAgICAgICAgIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2hhcnNldEVuY29kZXIgcmVwbGFjZVdpdGgoYnl0ZVtdIHJlcGxhY2VtZW50KSB7CiAgICAgICAgIGlmIChudWxsID09IHJlcGxhY2VtZW50IHx8IDAgPT0gcmVwbGFjZW1lbnQubGVuZ3RoCkBAIC03ODYsMTEgKzgxMywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0IHRoaXMgZW5jb2Rlci4gVGhpcyBtZXRob2Qgd2lsbCByZXNldCBpbnRlcm5hbCBzdGF0dXMsIGFuZCB0aGVuIGNhbGwKLSAgICAgKiA8Y29kZT5pbXBsUmVzZXQoKTwvY29kZT4gdG8gcmVzZXQgYW55IHN0YXR1cyByZWxhdGVkIHRvIHNwZWNpZmljCi0gICAgICogY2hhcnNldC4KKyAgICAgKiBSZXNldHMgdGhpcyBlbmNvZGVyLiBUaGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0dXMgYW5kIHRoZW4KKyAgICAgKiBjYWxsYSA8Y29kZT5pbXBsUmVzZXQoKTwvY29kZT4gdG8gcmVzZXQgYW55IHN0YXR1cyByZWxhdGVkIHRvIHRoZQorICAgICAqIHNwZWNpZmljIGNoYXJzZXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGlzIGVuY29kZXIKKyAgICAgKiBAcmV0dXJuIHRoaXMgZW5jb2Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2hhcnNldEVuY29kZXIgcmVzZXQoKSB7CiAgICAgICAgIHN0YXR1cyA9IElOSVQ7CkBAIC04MDQsNiArODMyLDcgQEAKICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoaXMgZW5jb2RlcidzIDxjb2RlPkNvZGluZ0Vycm9yQWN0aW9uPC9jb2RlPiB3aGVuIHVubWFwcGFibGUKICAgICAgKiAgICAgICAgIGNoYXJhY3RlciBvY2N1cnJlZCBkdXJpbmcgZW5jb2RpbmcgcHJvY2Vzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29kaW5nRXJyb3JBY3Rpb24gdW5tYXBwYWJsZUNoYXJhY3RlckFjdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHVubWFwQWN0aW9uOwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NvZGVyTWFsZnVuY3Rpb25FcnJvci5qYXZhIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0NvZGVyTWFsZnVuY3Rpb25FcnJvci5qYXZhCmluZGV4IGMyNDAwY2IuLjJmYzJhZTggMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Db2Rlck1hbGZ1bmN0aW9uRXJyb3IuamF2YQorKysgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ29kZXJNYWxmdW5jdGlvbkVycm9yLmphdmEKQEAgLTE4LDIxICsxOCwyNSBAQAogcGFja2FnZSBqYXZhLm5pby5jaGFyc2V0OwogCiAvKioKLSAqIEVycm9ycyB0aHJvd24gd2hlbiB0aGUgZW5jb2Rlci9kZWNvZGVyIGlzIG1hbGZ1bmN0aW9uaW5nLgorICogQSB7QGNvZGUgQ29kZXJNYWxmdW5jdGlvbkVycm9yfSBpcyB0aHJvd24gd2hlbiB0aGUgZW5jb2Rlci9kZWNvZGVyIGlzCisgKiBtYWxmdW5jdGlvbmluZy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb2Rlck1hbGZ1bmN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAKICAgICAvKgotICAgICAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uIHRvIGNoZWNrIHRoZSBKMlNFIHZlcnNpb24KKyAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiB0byBjaGVjayB0aGUgdmVyc2lvbgogICAgICAqIHdoaWNoIGNyZWF0ZWQgdGhlIHNlcmlhbGl6ZWQgb2JqZWN0LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTUxNDEyMzQ4MDU3Nzk0MzAxTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBlcnJvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDb2Rlck1hbGZ1bmN0aW9uRXJyb3J9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBleAotICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIGVuY29kZXIvZGVjb2RlcgorICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIGVuY29kZXIvZGVjb2Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29kZXJNYWxmdW5jdGlvbkVycm9yKEV4Y2VwdGlvbiBleCkgewogICAgICAgICBzdXBlcihleCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ29kZXJSZXN1bHQuamF2YSBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Db2RlclJlc3VsdC5qYXZhCmluZGV4IGMyMjIzOTQuLjlkNDdjOWYgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Db2RlclJlc3VsdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Db2RlclJlc3VsdC5qYXZhCkBAIC0yNiwyMSArMjYsMjIgQEAKICAqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHJlc3VsdCBvZiBlbmNvZGluZy9kZWNvZGluZy4gVGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YKICAqIHJlc3VsdHM6CiAgKiA8b2w+Ci0gKiA8bGk+VU5ERVJGTE9XIGluZGljYXRlcyBhbGwgaW5wdXQgaGFzIGJlZW4gcHJvY2Vzc2VkLCBvciBtb3JlIGlucHV0IGlzCisgKiA8bGk+VU5ERVJGTE9XIGluZGljYXRlcyB0aGF0IGFsbCBpbnB1dCBoYXMgYmVlbiBwcm9jZXNzZWQgYnV0IG1vcmUgaW5wdXQgaXMKICAqIHJlcXVpcmVkLiBJdCBpcyByZXByZXNlbnRlZCBieSB0aGUgdW5pcXVlIG9iamVjdAogICogPGNvZGU+Q29kZXJSZXN1bHQuVU5ERVJGTE9XPC9jb2RlPi4KLSAqIDxsaT5PVkVSRkxPVyBpbmRpY2F0ZXMgaW5zdWZmaWNpZW50IG91dHB1dCBidWZmZXIuIEl0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZQotICogdW5pcXVlIG9iamVjdCA8Y29kZT5Db2RlclJlc3VsdC5PVkVSRkxPVzwvY29kZT4uCi0gKiA8bGk+QSBtYWxmb3JtZWQtaW5wdXQgZXJyb3IgaW5kaWNhdGVzIGFuIHVucmVjb2duaXphYmxlIHNlcXVlbmNlIG9mIGlucHV0Ci0gKiB1bml0cyBoYXMgYmVlbiBlbmNvdW50ZXJlZC4gR2V0IGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBvZiByZXN1bHQgYnkgY2FsbGluZwotICogPGNvZGU+Q29kZXJSZXN1bHQubWFsZm9ybWVkRm9yTGVuZ3RoKGludCk8L2NvZGU+IHdpdGggdGhlIGxlbmd0aCBvZiB0aGUKLSAqIG1hbGZvcm1lZC1pbnB1dC4KLSAqIDxsaT5BbiB1bm1hcHBhYmxlLWNoYXJhY3RlciBlcnJvciBpbmRpY2F0ZXMgYSBzZXF1ZW5jZSBvZiBpbnB1dCB1bml0cyBjYW4KLSAqIG5vdCBiZSBtYXBwZWQgdG8gdGhlIG91dHB1dCBjaGFyc2V0LiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIG9mIHJlc3VsdAotICogYnkgY2FsbGluZyA8Y29kZT5Db2RlclJlc3VsdC51bm1hcHBhYmxlRm9yTGVuZ3RoKGludCk8L2NvZGU+IHdpdGggdGhlIGlucHV0Ci0gKiBzZXF1ZW5jZSBzaXplIGluZGljYXRpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSB1bm1hcHBhYmxlIGNoYXJhY3Rlci4KKyAqIDxsaT5PVkVSRkxPVyBpbmRpY2F0ZXMgYW4gaW5zdWZmaWNpZW50IG91dHB1dCBidWZmZXIgc2l6ZS4gSXQgaXMgcmVwcmVzZW50ZWQKKyAqIGJ5IHRoZSB1bmlxdWUgb2JqZWN0IDxjb2RlPkNvZGVyUmVzdWx0Lk9WRVJGTE9XPC9jb2RlPi4KKyAqIDxsaT5BIG1hbGZvcm1lZC1pbnB1dCBlcnJvciBpbmRpY2F0ZXMgdGhhdCBhbiB1bnJlY29nbml6YWJsZSBzZXF1ZW5jZSBvZgorICogaW5wdXQgdW5pdHMgaGFzIGJlZW4gZW5jb3VudGVyZWQuIEdldCBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgb2YgcmVzdWx0IGJ5CisgKiBjYWxsaW5nIDxjb2RlPkNvZGVyUmVzdWx0Lm1hbGZvcm1lZEZvckxlbmd0aChpbnQpPC9jb2RlPiB3aXRoIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBtYWxmb3JtZWQtaW5wdXQuCisgKiA8bGk+QW4gdW5tYXBwYWJsZS1jaGFyYWN0ZXIgZXJyb3IgaW5kaWNhdGVzIHRoYXQgYSBzZXF1ZW5jZSBvZiBpbnB1dCB1bml0cworICogY2FuIG5vdCBiZSBtYXBwZWQgdG8gdGhlIG91dHB1dCBjaGFyc2V0LiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIG9mCisgKiByZXN1bHQgYnkgY2FsbGluZyA8Y29kZT5Db2RlclJlc3VsdC51bm1hcHBhYmxlRm9yTGVuZ3RoKGludCk8L2NvZGU+IHdpdGgKKyAqIHRoZSBpbnB1dCBzZXF1ZW5jZSBzaXplIGluZGljYXRpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSB1bm1hcHBhYmxlIGNoYXJhY3Rlci4KICAqIDwvb2w+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ29kZXJSZXN1bHQgewogCkBAIC01OSwxMyArNjAsMTcgQEAKICAgICAvKioKICAgICAgKiBSZXN1bHQgb2JqZWN0IGluZGljYXRpbmcgdGhhdCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZGF0YSBpbiB0aGUKICAgICAgKiBlbmNvZGluZy9kZWNvZGluZyBidWZmZXIgb3IgdGhhdCBhZGRpdGlvbmFsIGRhdGEgaXMgcmVxdWlyZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlclJlc3VsdCBVTkRFUkZMT1cgPSBuZXcgQ29kZXJSZXN1bHQoVFlQRV9VTkRFUkZMT1csCiAgICAgICAgICAgICAwKTsKIAogICAgIC8qKgotICAgICAqIFJlc3VsdCBvYmplY3QgdXNlZCB0byBzaWduaWZ5IHRoYXQgdGhlIG91dCBidWZmZXIgZG9lcyBub3QgaGF2ZSBlbm91Z2gKLSAgICAgKiBzcGFjZSBhdmFpbGFibGUgaW4gaXQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgZW5jb2RpbmcvZGVjb2RpbmcuCisgICAgICogUmVzdWx0IG9iamVjdCB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgZG9lcyBub3QgaGF2ZQorICAgICAqIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgZW5jb2RpbmcvZGVjb2RpbmcuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlclJlc3VsdCBPVkVSRkxPVyA9IG5ldyBDb2RlclJlc3VsdChUWVBFX09WRVJGTE9XLCAwKTsKIApAQCAtODEsMTQgKzg2LDE0IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgV2Vha0hhc2hNYXA8SW50ZWdlciwgQ29kZXJSZXN1bHQ+IF91bm1hcHBhYmxlRXJyb3JzID0gbmV3IFdlYWtIYXNoTWFwPEludGVnZXIsIENvZGVyUmVzdWx0PigpOwogCi0gICAgLy8gdGhlIHR5cGUgdGhpcyByZXN1bHQKKyAgICAvLyB0aGUgdHlwZSBvZiB0aGlzIHJlc3VsdAogICAgIHByaXZhdGUgZmluYWwgaW50IHR5cGU7CiAKICAgICAvLyB0aGUgbGVuZ3RoIG9mIHRoZSBlcnJvbmVvdXMgaW5wdXQKICAgICBwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Db2RlclJlc3VsdDwvY29kZT4gb2JqZWN0IHdpdGggaXRzIHRleHQgZGVzY3JpcHRpb24uCisgICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPiBvYmplY3Qgd2l0aCBpdHMgdGV4dCBkZXNjcmlwdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZQogICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhpcyByZXN1bHQKQEAgLTEwNiwxMSArMTExLDEyIEBACiAgICAgICogZXJyb3IuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbWFsZm9ybWVkLWlucHV0CisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBtYWxmb3JtZWQtaW5wdXQuCiAgICAgICogQHJldHVybiBhIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyBhIG1hbGZvcm1lZC1pbnB1dAotICAgICAqICAgICAgICAgZXJyb3IKKyAgICAgKiAgICAgICAgIGVycm9yLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgPGNvZGU+bGVuZ3RoPC9jb2RlPiBpcyBub24tcG9zaXRpdmUuCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+bGVuZ3RoPC9jb2RlPiBpcyBub24tcG9zaXRpdmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ29kZXJSZXN1bHQgbWFsZm9ybWVkRm9yTGVuZ3RoKGludCBsZW5ndGgpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKQEAgLTEzNiwxMSArMTQyLDEyIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIGxlbmd0aAogICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgdW5pdCBzZXF1ZW5jZSBkZW5vdGluZyB0aGUgdW5tYXBwYWJsZQotICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgICBjaGFyYWN0ZXIuCiAgICAgICogQHJldHVybiBhIDxjb2RlPkNvZGVyUmVzdWx0PC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyBhbiB1bm1hcHBhYmxlCi0gICAgICogICAgICAgICBjaGFyYWN0ZXIgZXJyb3IKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlciBlcnJvci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIDxjb2RlPmxlbmd0aDwvY29kZT4gaXMgbm9uLXBvc2l0aXZlLgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmxlbmd0aDwvY29kZT4gaXMgbm9uLXBvc2l0aXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENvZGVyUmVzdWx0IHVubWFwcGFibGVGb3JMZW5ndGgoaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewpAQCAtMTYzLDcgKzE3MCw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVzdWx0IGlzIGFuIHVuZGVyZmxvdyBjb25kaXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFuIHVuZGVyZmxvdywgb3RoZXJ3aXNlIGZhbHNlCisgICAgICogQHJldHVybiB0cnVlIGlmIGFuIHVuZGVyZmxvdywgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVW5kZXJmbG93KCkgewogICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IFRZUEVfVU5ERVJGTE9XOwpAQCAtMTczLDggKzE4MSw5IEBACiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVzdWx0IHJlcHJlc2VudHMgYSBtYWxmb3JtZWQtaW5wdXQgZXJyb3Igb3IgYW4KICAgICAgKiB1bm1hcHBhYmxlLWNoYXJhY3RlciBlcnJvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBtYWxmb3JtZWQtaW5wdXQgZXJyb3Igb3IgYW4gdW5tYXBwYWJsZS1jaGFyYWN0ZXIgZXJyb3IsCi0gICAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIG1hbGZvcm1lZC1pbnB1dCBlcnJvciBvciBhbiAKKyAgICAgKiAgICAgICAgIHVubWFwcGFibGUtY2hhcmFjdGVyIGVycm9yLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSBUWVBFX01BTEZPUk1FRF9JTlBVVApAQCAtMTg0LDcgKzE5Myw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVzdWx0IHJlcHJlc2VudHMgYSBtYWxmb3JtZWQtaW5wdXQgZXJyb3IuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgbWFsZm9ybWVkLWlucHV0IGVycm9yLCBvdGhlcndpc2UgZmFsc2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIG1hbGZvcm1lZC1pbnB1dCBlcnJvciwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzTWFsZm9ybWVkKCkgewogICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IFRZUEVfTUFMRk9STUVEX0lOUFVUOwpAQCAtMTkzLDcgKzIwMyw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVzdWx0IGlzIGFuIG92ZXJmbG93IGNvbmRpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gb3ZlcmZsb3csIG90aGVyd2lzZSBmYWxzZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIG92ZXJmbG93LCBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvdygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSBUWVBFX09WRVJGTE9XOwpAQCAtMjAyLDcgKzIxMyw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVzdWx0IHJlcHJlc2VudHMgYW4gdW5tYXBwYWJsZS1jaGFyYWN0ZXIgZXJyb3IuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFuIHVubWFwcGFibGUtY2hhcmFjdGVyIGVycm9yLCBvdGhlcndpc2UgZmFsc2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiB1bm1hcHBhYmxlLWNoYXJhY3RlciBlcnJvciwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVW5tYXBwYWJsZSgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSBUWVBFX1VOTUFQUEFCTEVfQ0hBUjsKQEAgLTIxMiw5ICsyMjQsMTAgQEAKICAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGVycm9uZW91cyBpbnB1dC4gVGhlIGxlbmd0aCBpcyBvbmx5IG1lYW5pbmdmdWwgdG8KICAgICAgKiBhIG1hbGZvcm1lZC1pbnB1dCBlcnJvciBvciBhbiB1bm1hcHBibGUgY2hhcmFjdGVyIGVycm9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCwgYXMgYW4gaW50ZWdlciwgb2YgdGhpcyBvYmplY3QncyBlcnJvbmVvdXMgaW5wdXQKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGgsIGFzIGFuIGludGVnZXIsIG9mIHRoaXMgb2JqZWN0J3MgZXJyb25lb3VzIGlucHV0LgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiB0aGlzIHJlc3VsdCBpcyBhbiBvdmVyZmxvdyBvciB1bmRlcmZsb3cuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyByZXN1bHQgaXMgYW4gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBUWVBFX01BTEZPUk1FRF9JTlBVVApAQCAtMjMxLDE1ICsyNDQsMTYgQEAKICAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjb2RlciByZXN1bHQuCiAgICAgICogCiAgICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBhbiB1bmRlcmZsb3cuCisgICAgICogICAgICAgICAgICAgaW4gY2FzZSB0aGlzIGlzIGFuIHVuZGVyZmxvdy4KICAgICAgKiBAdGhyb3dzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYW4gb3ZlcmZsb3cuCisgICAgICogICAgICAgICAgICAgaW4gY2FzZSB0aGlzIGlzIGFuIG92ZXJmbG93LgogICAgICAqIEB0aHJvd3MgVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIElmIGFuIHVubWFwcGFibGUtY2hhcmFjdGVyIGVycm9yLgorICAgICAqICAgICAgICAgICAgIGluIGNhc2UgdGhpcyBpcyBhbiB1bm1hcHBhYmxlLWNoYXJhY3RlciBlcnJvci4KICAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgYSBtYWxmb3JtZWQtaW5wdXQgZXJyb3IuCisgICAgICogICAgICAgICAgICAgaW4gY2FzZSB0aGlzIGlzIGEgbWFsZm9ybWVkLWlucHV0IGVycm9yLgogICAgICAqIEB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIGRlZmF1bHQgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24sCiAgICAgICAgICAgICBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiwgVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiwKQEAgLTI2Nyw3ICsyODEsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoaXMgcmVzdWx0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoaXMgcmVzdWx0CisgICAgICogQHJldHVybiBhIHRleHQgZGVzY3JpcHRpb24gb2YgdGhpcyByZXN1bHQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIGRzYyA9IG51bGw7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvQ29kaW5nRXJyb3JBY3Rpb24uamF2YSBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Db2RpbmdFcnJvckFjdGlvbi5qYXZhCmluZGV4IGUyNThjNzEuLmQ5NDljODEgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Db2RpbmdFcnJvckFjdGlvbi5qYXZhCisrKyBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Db2RpbmdFcnJvckFjdGlvbi5qYXZhCkBAIC0xOCwyNyArMTgsMzYgQEAKIAogLyoqCiAgKiBVc2VkIHRvIGluZGljYXRlIHdoYXQga2luZCBvZiBhY3Rpb25zIHRvIHRha2UgaW4gY2FzZSBvZiBlbmNvZGluZy9kZWNvZGluZwotICogZXJyb3JzLiBDdXJyZW50bHkgdGhyZWUgYWN0aW9ucyBhcmUgZGVmaW5lZCwgbmFtZWx5LCBJR05PUkUsIFJFUExBQ0UgYW5kCi0gKiBSRVBPUlQuCisgKiBlcnJvcnMuIEN1cnJlbnRseSB0aHJlZSBhY3Rpb25zIGFyZSBkZWZpbmVkOiB7QGNvZGUgSUdOT1JFfSwge0Bjb2RlIFJFUExBQ0V9CisgKiBhbmQge0Bjb2RlIFJFUE9SVH0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ29kaW5nRXJyb3JBY3Rpb24gewogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGluZyB0aGUgYWN0aW9uIHRvIGlnbm9yZSBhbnkgZXJyb3JzLgorICAgICAqIERlbm90ZXMgdGhlIGFjdGlvbiB0byBpZ25vcmUgYW55IGVycm9ycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvZGluZ0Vycm9yQWN0aW9uIElHTk9SRSA9IG5ldyBDb2RpbmdFcnJvckFjdGlvbigKICAgICAgICAgICAgICJJR05PUkUiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGluZyB0aGUgYWN0aW9uIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aXRoIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCisgICAgICogRGVub3RlcyB0aGUgYWN0aW9uIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aXRoIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCiAgICAgICogd2hlbiBtYWxmb3JtZWQgaW5wdXQgb3IgYW4gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgaXMgZW5jb3VudGVyZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2RpbmdFcnJvckFjdGlvbiBSRVBMQUNFID0gbmV3IENvZGluZ0Vycm9yQWN0aW9uKAogICAgICAgICAgICAgIlJFUExBQ0UiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGluZyB0aGUgYWN0aW9uIHRvIHJlcG9ydCB0aGUgZW5jb3VudGVyZWQgZXJyb3IgaW4gYW4gYXBwcm9wcmlhdGUKLSAgICAgKiBtYW5uZXIsIGZvciBleGFtcGxlLCB0aHJvdyBhbiBleGNlcHRpb24gb3IgcmV0dXJuIGFuIGluZm9ybWF0aXZlIHJlc3VsdC4KKyAgICAgKiBEZW5vdGVzIHRoZSBhY3Rpb24gdG8gcmVwb3J0IHRoZSBlbmNvdW50ZXJlZCBlcnJvciBpbiBhbiBhcHByb3ByaWF0ZQorICAgICAqIG1hbm5lciwgZm9yIGV4YW1wbGUgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9yIHJldHVybiBhbiBpbmZvcm1hdGl2ZQorICAgICAqIHJlc3VsdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvZGluZ0Vycm9yQWN0aW9uIFJFUE9SVCA9IG5ldyBDb2RpbmdFcnJvckFjdGlvbigKICAgICAgICAgICAgICJSRVBPUlQiKTsgLy8kTk9OLU5MUy0xJApAQCAtNTQsOSArNjMsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGlzIGFjdGlvbiBpbmRpY2F0aW9uLi4KKyAgICAgKiBSZXR1cm5zIGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGlzIGFjdGlvbiBpbmRpY2F0aW9uLgogICAgICAqIAogICAgICAqIEByZXR1cm4gYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoaXMgYWN0aW9uIGluZGljYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJBY3Rpb246ICIgKyB0aGlzLmFjdGlvbjsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0lsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbi5qYXZhIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L0lsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGZhZTEyNjkuLjM2ZmYzYWQgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24uamF2YQorKysgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uLmphdmEKQEAgLTIwLDEyICsyMCwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5uaW9jaGFyLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaHJvd24gd2hlbiBhbiBpbGxlZ2FsIGNoYXJzZXQgbmFtZSBpcyBlbmNvdW50ZXJlZC4KKyAqIEFuIHtAY29kZSBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGFuIGlsbGVnYWwgY2hhcnNldCBuYW1lCisgKiBpcyBlbmNvdW50ZXJlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCiAgICAgLyoKLSAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiB0byBjaGVjayB0aGUgSjJTRSB2ZXJzaW9uCisgICAgICogVGhpcyBjb25zdGFudCBpcyB1c2VkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24gdG8gY2hlY2sgdGhlIHZlcnNpb24KICAgICAgKiB3aGljaCBjcmVhdGVkIHRoZSBzZXJpYWxpemVkIG9iamVjdC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDU3NTI1MzU4NDcwMDAyOTg5TDsKQEAgLTM0LDEwICszNywxMiBAQAogICAgIHByaXZhdGUgU3RyaW5nIGNoYXJzZXROYW1lOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIGV4Y2VwdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBjaGFyc2V0IG5hbWUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9ufSB3aXRoIHRoZSBzdXBwbGllZAorICAgICAqIGNoYXJzZXQgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hhcnNldAotICAgICAqICAgICAgICAgICAgdGhlIGVuY291bnRlcmVkIGlsbGVnYWwgY2hhcnNldCBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgZW5jb3VudGVyZWQgaWxsZWdhbCBjaGFyc2V0IG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbihTdHJpbmcgY2hhcnNldCkgewogICAgICAgICAvLyBuaW9jaGFyLjBGPVRoZSBpbGxlZ2FsIGNoYXJzZXQgbmFtZSBpcyAiezB9Ii4KQEAgLTQ4LDcgKzUzLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBlbmNvdW50ZXJlZCBpbGxlZ2FsIGNoYXJzZXQgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmNvdW50ZXJlZCBpbGxlZ2FsIGNoYXJzZXQgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIGVuY291bnRlcmVkIGlsbGVnYWwgY2hhcnNldCBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldE5hbWUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmNoYXJzZXROYW1lOwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L01hbGZvcm1lZElucHV0RXhjZXB0aW9uLmphdmEgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24uamF2YQppbmRleCAxN2IwMDA1Li45ZmEwYWEyIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24uamF2YQorKysgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24uamF2YQpAQCAtMjAsMTMgKzIwLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm5pb2NoYXIuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRocm93biB3aGVuIGEgbWFsZm9ybWVkIGlucHV0IGlzIGVuY291bnRlcmVkLCBmb3IgZXhhbXBsZSwgYSBieXRlIHNlcXVlbmNlIGlzCi0gKiBpbGxlZ2FsIGZvciB0aGUgZ2l2ZW4gY2hhcnNldC4KKyAqIEEge0Bjb2RlIE1hbGZvcm1lZElucHV0RXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBhIG1hbGZvcm1lZCBpbnB1dCBpcworICogZW5jb3VudGVyZWQsIGZvciBleGFtcGxlIGlmIGEgYnl0ZSBzZXF1ZW5jZSBpcyBpbGxlZ2FsIGZvciB0aGUgZ2l2ZW4gY2hhcnNldC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBleHRlbmRzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAKICAgICAvKgotICAgICAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uIHRvIGNoZWNrIHRoZSBKMlNFIHZlcnNpb24KKyAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiB0byBjaGVjayB0aGUgdmVyc2lvbgogICAgICAqIHdoaWNoIGNyZWF0ZWQgdGhlIHNlcmlhbGl6ZWQgb2JqZWN0LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDM4ODIzMzk5ODM0ODA2MTk0TDsKQEAgLTM1LDEwICszNywxMSBAQAogICAgIHByaXZhdGUgaW50IGlucHV0TGVuZ3RoOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbWFsZm9ybWVkIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBtYWxmb3JtZWQgaW5wdXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uKGludCBsZW5ndGgpIHsKICAgICAgICAgdGhpcy5pbnB1dExlbmd0aCA9IGxlbmd0aDsKQEAgLTQ3LDcgKzUwLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIG1hbGZvcm1lZCBpbnB1dC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIG1hbGZvcm1lZCBpbnB1dAorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgbWFsZm9ybWVkIGlucHV0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXRMZW5ndGgoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmlucHV0TGVuZ3RoOwpAQCAtNTYsNyArNjAsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBleGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIGV4Y2VwdGlvbgorICAgICAqIEByZXR1cm4gYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewogICAgICAgICAvLyBuaW9jaGFyLjA1PU1hbGZvcm1lZCBpbnB1dCBsZW5ndGggaXMgezB9LgpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L1VubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24uamF2YSBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEKaW5kZXggMWM2NmM1Mi4uN2NjNTZlMiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L1VubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQorKysgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbi5qYXZhCkBAIC0yMCwxMiArMjAsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubmlvY2hhci5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhyb3duIHdoZW4gYW4gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZm9yIHRoZSBnaXZlbiBjaGFyc2V0IGlzIGVuY291bnRlcmVkLgorICogQW4ge0Bjb2RlIFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGFuIHVubWFwcGFibGUKKyAqIGNoYXJhY3RlciBmb3IgdGhlIGdpdmVuIGNoYXJzZXQgaXMgZW5jb3VudGVyZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiBleHRlbmRzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAKICAgICAvKgotICAgICAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uIHRvIGNoZWNrIHRoZSBKMlNFIHZlcnNpb24KKyAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiB0byBjaGVjayB0aGUgdmVyc2lvbgogICAgICAqIHdoaWNoIGNyZWF0ZWQgdGhlIHNlcmlhbGl6ZWQgb2JqZWN0LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MDI2OTYyMzcxNTM3NzA2MTIzTDsKQEAgLTM0LDEwICszNywxMSBAQAogICAgIHByaXZhdGUgaW50IGlucHV0TGVuZ3RoOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBVbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSB1bm1hcHBhYmxlIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgdW5tYXBwYWJsZSBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24oaW50IGxlbmd0aCkgewogICAgICAgICB0aGlzLmlucHV0TGVuZ3RoID0gbGVuZ3RoOwpAQCAtNDYsNyArNTAsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgdW5tYXBwYWJsZSBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB1bm1hcHBhYmxlIGNoYXJhY3RlcgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdW5tYXBwYWJsZSBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRJbnB1dExlbmd0aCgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRMZW5ndGg7CkBAIC01NSw3ICs2MCw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIGV4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgZXhjZXB0aW9uCisgICAgICogQHJldHVybiBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CiAgICAgICAgIC8vIG5pb2NoYXIuMEE9VGhlIHVubWFwcGFibGUgY2hhcmFjdGVyIGxlbmd0aCBpcyB7MH0uCmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uLmphdmEgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uLmphdmEKaW5kZXggMWI1NTM5Ny4uNDVkYmYzZCAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L1Vuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbi5qYXZhCisrKyBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24uamF2YQpAQCAtMjAsMTIgKzIwLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm5pb2NoYXIuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIGNoYXJzZXQgbmFtZSBpcyBlbmNvdW50ZXJlZC4KKyAqIEFuIHtAY29kZSBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIGNoYXJzZXQKKyAqIG5hbWUgaXMgZW5jb3VudGVyZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKIAogICAgIC8qCi0gICAgICogVGhpcyBjb25zdGFudCBpcyB1c2VkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24gdG8gY2hlY2sgdGhlIEoyU0UgdmVyc2lvbgorICAgICAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uIHRvIGNoZWNrIHRoZSB2ZXJzaW9uCiAgICAgICogd2hpY2ggY3JlYXRlZCB0aGUgc2VyaWFsaXplZCBvYmplY3QuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQ5MDc2NTUyNDcyNzM4NjM2N0w7CkBAIC0zNCwxMCArMzcsMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBjaGFyc2V0TmFtZTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBleGNlcHRpb24gd2l0aCB0aGUgc3VwcGxpZWQgY2hhcnNldCBuYW1lLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbn0gd2l0aCB0aGUgc3VwcGxpZWQgY2hhcnNldCBuYW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjaGFyc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgZW5jb3VudGVyZWQgdW5zdXBwb3J0ZWQgY2hhcnNldCBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgZW5jb3VudGVyZWQgdW5zdXBwb3J0ZWQgY2hhcnNldCBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oU3RyaW5nIGNoYXJzZXQpIHsKICAgICAgICAgLy8gbmlvY2hhci4wND1UaGUgdW5zdXBwb3J0ZWQgY2hhcnNldCBuYW1lIGlzICJ7MH0iLgpAQCAtNDgsNyArNTIsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGVuY291bnRlcmVkIHVuc3VwcG9ydGVkIGNoYXJzZXQgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmNvdW50ZXJlZCB1bnN1cHBvcnRlZCBjaGFyc2V0IG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvdW50ZXJlZCB1bnN1cHBvcnRlZCBjaGFyc2V0IG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcnNldE5hbWU7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvcGFja2FnZS5odG1sIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L3BhY2thZ2UuaHRtbAppbmRleCAxMDRmZDUwLi4xNzVmYjcxIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvcGFja2FnZS5odG1sCisrKyBiL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9wYWNrYWdlLmh0bWwKQEAgLTEsNyArMSw3IEBACiA8aHRtbD4KICAgPGJvZHk+CiAgICAgPHA+Ci0gICAgICBUaGlzIHBhY2thZ2UgYWxsb3dzIHRyYW5zbGF0aW5nIGJldHdlZW4gYnl0ZXMgYW5kIGRpZmZlcmVudAorICAgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHRyYW5zbGF0aW9uIHNlcnZpY2VzIGJldHdlZW4gYnl0ZXMgYW5kIGRpZmZlcmVudAogICAgICAgY2hhcmFjdGVyIHNldHMuCiAgICAgPC9wPgogICAgIDxwPgpAQCAtMTAsNSArMTAsNiBAQAogICAgICAgZGUtL2VuY29kZXIgcGFpciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYW5zbGF0ZSBhIGJ5dGUgc3RyZWFtLiBXaXRoIHRoZQogICAgICAgc2VydmljZSBwcm92aWRlciBwYWNrYWdlIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB5b3VyIG93biBjaGFyc2V0cy4KICAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9zcGkvQ2hhcnNldFByb3ZpZGVyLmphdmEgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL2NoYXJzZXQvc3BpL0NoYXJzZXRQcm92aWRlci5qYXZhCmluZGV4IDhhNDcwZDcuLjZkNWM2NmYgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9zcGkvQ2hhcnNldFByb3ZpZGVyLmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L3NwaS9DaGFyc2V0UHJvdmlkZXIuamF2YQpAQCAtMjEsNiArMjEsOCBAQAogCiAvKioKICAqIFRoZSBzZXJ2aWNlIHByb3ZpZGVyIGNsYXNzIGZvciBjaGFyYWN0ZXIgc2V0cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFyc2V0UHJvdmlkZXIgewogCkBAIC0zNCw2ICszNiw3IEBACiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciBpbnN0YWxsZWQgdGhhdCBkb2VzIG5vdCBwZXJtaXQKICAgICAgKiAgICAgICAgICAgICB0aGUgcnVudGltZSBwZXJtaXNzaW9uIGxhYmVsZWQgImNoYXJzZXRQcm92aWRlciIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENoYXJzZXRQcm92aWRlcigpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTQ1LDYgKzQ4LDcgQEAKICAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBhdmFpbGFibGUgY2hhcnNldHMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaXRlcmF0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEl0ZXJhdG9yPENoYXJzZXQ+IGNoYXJzZXRzKCk7CiAKQEAgLTUyLDEwICs1NiwxMiBAQAogICAgICAqIFJldHVybnMgdGhlIG5hbWVkIGNoYXJzZXQuCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIGNoYXJzZXQgaXMgdW5hdmFpbGFibGUgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hhcnNldE5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBjYW5vbmljYWwgb3IgYWxpYXMgbmFtZSBvZiBhIGNoYXJhY3RlciBzZXQuCiAgICAgICogQHJldHVybiB0aGUgY2hhcnNldCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hdmFpbGFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENoYXJzZXQgY2hhcnNldEZvck5hbWUoU3RyaW5nIGNoYXJzZXROYW1lKTsKIH0KZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhcnNldC9zcGkvcGFja2FnZS5odG1sIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L3NwaS9wYWNrYWdlLmh0bWwKaW5kZXggYTY4YzZkMy4uZjdkOWQyYiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L3NwaS9wYWNrYWdlLmh0bWwKKysrIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFyc2V0L3NwaS9wYWNrYWdlLmh0bWwKQEAgLTEsNyArMSw4IEBACiA8aHRtbD4KICAgPGJvZHk+CiAgICAgPHA+Ci0gICAgICBTZXJ2aWNlLXByb3ZpZGVyIGNsYXNzZSBmb3IgbmlvIGNoYXJzZXQuCisgICAgICBTZXJ2aWNlLXByb3ZpZGVyIGNsYXNzIGZvciBuaW8gY2hhcnNldC4KICAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb2NoYXIvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEgYi9uaW9fY2hhci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9jaGFyL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCmluZGV4IDMzNjg4NjQuLmYyZmI2NTIgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb2NoYXIvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvY2hhci9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQpAQCAtMjEsOSArMjEsMjIgQEAKICAqIGlmIHRoaXMgdG9vbCBydW5zIGFnYWluLiBCZXR0ZXIgbWFrZSBjaGFuZ2VzIGluIHRoZSB0ZW1wbGF0ZSBmaWxlLgogICovCiAKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gUmVkdW5kYW50IGNvZGUgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm93IGNhbGxlZCBmcm9tIE1zZ0hlbHAuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pb2NoYXIuaW50ZXJuYWwubmxzOwogCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgYW5kIHJldHVybnMgdGhlbSwKQEAgLTQwLDkgKzUzLDExIEBACiAgKiAKICAqLwogcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLSAgICAKKworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzUmVzb3VyY2UgPQogICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255Lm5pb2NoYXIuaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8qKgogICAgICAqIFJldHJpZXZlcyBhIG1lc3NhZ2Ugd2hpY2ggaGFzIG5vIGFyZ3VtZW50cy4KQEAgLTUyLDcgKzY3LDkgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgpAQCAtMTE5LDcgKzEzNiwxMyBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2csIGFyZ3MpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gRHVwbGljYXRlIGNvZGUgd2FzIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgTXNnSGVscC4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiB9CiAKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQVNDSUlDaGFyc2V0RW5jb2RlclRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQVNDSUlDaGFyc2V0RW5jb2RlclRlc3QuamF2YQppbmRleCAwMTM4NWYyLi5mNzA0ZTNiIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0FTQ0lJQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9BU0NJSUNoYXJzZXRFbmNvZGVyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW9fY2hhci50ZXN0cy5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwpAQCAtMjcsNyArMzIsNyBAQAogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhDaGFyc2V0RW5jb2Rlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBBU0NJSUNoYXJzZXRFbmNvZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8vIGNoYXJzZXQgZm9yIGFzY2lpCkBAIC00Niw2ICs1MSwxNSBAQAogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlQ2hhclNlcXVlbmNlKCkgewogICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgYXNjQ1MKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgiXHUwMDc3IikpOwpAQCAtNTgsMjEgKzcyLDY2IEBACiAgICAgICAgIGFzc2VydFRydWUoZW5jb2Rlci5jYW5FbmNvZGUoIiIpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZVN1cnJvZ2F0ZSAoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGVuY29kZXIuY2FuRW5jb2RlKCdcdWQ4MDAnKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGVuY29kZXIuY2FuRW5jb2RlKCJcdWRjMDAiKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlY2hhcigpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdTAwNzcnKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGVuY29kZXIuY2FuRW5jb2RlKCdcdWMyYTMnKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZlcmFnZUJ5dGVzUGVyQ2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXhCeXRlc1BlckNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWNEZWZhdWx0VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygxLjAsIGVuY29kZXIuYXZlcmFnZUJ5dGVzUGVyQ2hhcigpLCAwLjApOwogICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCBlbmNvZGVyLm1heEJ5dGVzUGVyQ2hhcigpLCAwLjApOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpU3RlcEVuY29kZSgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBlbmNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKICAgICAgICAgZW5jb2Rlci5vblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKQEAgLTk0LDYgKzE1MywxNSBAQAogICAgICAgICAgICAgICAgIC5pc01hbGZvcm1lZCgpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZU1hcHBpbmcoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgZW5jb2Rlci5yZXNldCgpOwogICAgICAgICAKQEAgLTEyOSw2ICsxOTcsMjEgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBmdW5jdGlvbmFsaXR5LiBFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludGVybmFsU3RhdGUoKSB7CiAgICAgICAgIENoYXJCdWZmZXIgaW4gPSBDaGFyQnVmZmVyLndyYXAoIkEiKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBvdXQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDB4MTApOwpAQCAtMTQyLDYgKzIyNSwyMSBAQAogICAgIH0KICAgICAKICAgICAvL3Jlc2V0IGNvdWxkIGJlIGNhbGxlZCBhdCBhbnkgdGltZQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGZ1bmN0aW9uYWxpdHkuIEV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJuYWxTdGF0ZV9SZXNldCgpIHsKICAgICAgICAgQ2hhcnNldEVuY29kZXIgbmV3RW5jb2RlciA9IGNzLm5ld0VuY29kZXIoKTsKICAgICAgICAgLy9Jbml0IC0gPiByZXNldApAQCAtMTc1LDYgKzI3MywxNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ29kZXJNYWxmdW5jdGlvbkVycm9yIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludGVybmFsU3RhdGVfRW5jb2RpbmcoKSB7CiAgICAgICAgIENoYXJzZXRFbmNvZGVyIG5ld0VuY29kZXIgPSBjcy5uZXdFbmNvZGVyKCk7CiAgICAgICAgIC8vSW5pdCAtID4gZW5jb2RpbmcKQEAgLTIzMiw2ICszMzksMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNvZGVyTWFsZnVuY3Rpb25FcnJvciBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcm5hbFN0YXRlX0VuY29kaW5nX0VORCgpIHsKICAgICAgICAgQ2hhcnNldEVuY29kZXIgbmV3RW5jb2RlciA9IGNzLm5ld0VuY29kZXIoKTsKIApAQCAtMjg3LDYgKzQwMywxNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ29kZXJNYWxmdW5jdGlvbkVycm9yIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludGVybmFsU3RhdGVfRmx1c2hlZCgpIHsKICAgICAgICAgQ2hhcnNldEVuY29kZXIgbmV3RW5jb2RlciA9IGNzLm5ld0VuY29kZXIoKTsKICAgICAgICAgCkBAIC0zNDYsNiArNDcxLDIxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcm5hbFN0YXRlX0VuY29kZSgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBDaGFyc2V0RW5jb2RlciBuZXdFbmNvZGVyID0gY3MubmV3RW5jb2RlcigpOwogICAgICAgICAvL0luaXQgLSA+IGVuY29kZQpAQCAtMzkzLDYgKzUzMywyNCBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ29kZXJNYWxmdW5jdGlvbkVycm9yIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludGVybmFsU3RhdGVfZnJvbV9FbmNvZGUoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhcnNldEVuY29kZXIgbmV3RW5jb2RlciA9IGNzLm5ld0VuY29kZXIoKTsKICAgICAgICAgCmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0FsbFRlc3RzLmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0FsbFRlc3RzLmphdmEKaW5kZXggOGRkNDg1Yy4uYzhmMDYzZSAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9BbGxUZXN0cy5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQWxsVGVzdHMuamF2YQpAQCAtMjksNiArMjksNyBAQAogICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKAogICAgICAgICAgICAgICAgICJUZXN0IGZvciBvcmcuYXBhY2hlLmhhcm1vbnkubmlvX2NoYXIudGVzdHMuamF2YS5uaW8uY2hhcnNldCIpOwogICAgICAgICAvLyRKVW5pdC1CRUdJTiQKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFTQ0lJQ2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvblRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENoYXJzZXRUZXN0LmNsYXNzKTsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZjFiYWI2My4uMWZiZWFjZSAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pb19jaGFyLnRlc3RzLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwogCkBAIC0yMywxMSArMjgsMjEgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0IENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbgogICovCiBwdWJsaWMgY2xhc3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKICAgICAgICAgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGV4ID0gbmV3IENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnRUcnVlKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pOwpAQCAtMzgsNiArNTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24uIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25TZWxmIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25TZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uKCkpOwpAQCAtNDYsNiArNzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlHb2xkZW4odGhpcywgbmV3IENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbigpKTsKIApkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0RGVjb2RlclRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldERlY29kZXJUZXN0LmphdmEKaW5kZXggODYxNzY2OS4uZWM4OWVkNSAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0RGVjb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXREZWNvZGVyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW9fY2hhci50ZXN0cy5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwpAQCAtMjksMTMgKzM0LDIyIEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhDaGFyc2V0RGVjb2Rlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBDaGFyc2V0RGVjb2RlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2Rlci5DaGFyc2V0RGVjb2RlcihDaGFyc2V0LCBmbG9hdCwKICAgICAgKiAgICAgICAgZmxvYXQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXREZWNvZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ2hhcnNldC5jbGFzcywgZmxvYXQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmlvX2NoYXJzZXRfQ2hhcnNldEZGKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTE0MgogICAgICAgICB0cnkgewpAQCAtNjQsNiArNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlciNkZWNvZGUoamF2YS5uaW8uQnl0ZUJ1ZmZlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWNvZGUoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0zMwogLy8gICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEpOwpAQCAtMTAxLDYgKzEyNCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBtYWxmdW5jdGlvbiBkZWNvZGUoQnl0ZUJ1ZmZlcikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gQ2hlY2tzIENvZGVyTWFsZnVuY3Rpb25FcnJvciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RlY29kZUxqYXZhX25pb19CeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tNYWxmdW5jdGlvbkNoYXJzZXQgY3MxID0gbmV3IE1vY2tNYWxmdW5jdGlvbkNoYXJzZXQoCiAgICAgICAgICAgICAgICAgIkhhcm1vbnktMTI0LTEiLCBudWxsKTsgLy8kTk9OLU5MUy0xJApAQCAtMTc2LDYgKzIwOCwyMSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGRlY29kZShCeXRlQnVmZmVyKSAuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsT25NYWxmb3JtZWRJbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uLmNsYXNzfQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVwbGFjZVdpdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZUxqYXZhX25pb19CeXRlQnVmZmVyX1JlcGxhY2VPdmVyZmxvdygpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHJlcGxhY2VTdHJpbmcgPSAiYSI7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRFbmNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0RW5jb2RlclRlc3QuamF2YQppbmRleCBmY2UyYTFhLi4xMDRiOTkzIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRFbmNvZGVyVGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pb19jaGFyLnRlc3RzLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CkBAIC0yNiwxMyArMzEsMjUgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKENoYXJzZXRFbmNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIENoYXJzZXRFbmNvZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyLkNoYXJzZXRFbmNvZGVyKAogICAgICAqICAgICAgICBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQsIGZsb2F0LCBmbG9hdCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyc2V0RW5jb2RlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuY2xhc3MsIGZsb2F0LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyc2V0RW5jb2RlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuY2xhc3MsIGZsb2F0LmNsYXNzLCBmbG9hdC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbmlvX2NoYXJzZXRfQ2hhcnNldEZGKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTE0MQogICAgICAgICB0cnkgewpAQCAtNTcsNiArNzQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2Rlci5DaGFyc2V0RW5jb2RlcigKICAgICAgKiAgICAgICAgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LCBmbG9hdCwgZmxvYXQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyc2V0RW5jb2RlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuY2xhc3MsIGZsb2F0LmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25pb19jaGFyc2V0X0NoYXJzZXROdWxsKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ5MQogICAgICAgICBDaGFyc2V0RW5jb2RlciBlY2ggPSBuZXcgTW9ja0NoYXJzZXRFbmNvZGVyRm9ySGFybW9ueTQ5MShudWxsLCAxLCAxKTsKQEAgLTEwNCw2ICsxMzAsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgbWFsZnVuY3Rpb24gZW5jb2RlKENoYXJCdWZmZXIpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QgY2hlY2tzIENvZGVyTWFsZnVuY3Rpb25FcnJvciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0VuY29kZUxqYXZhX25pb19DaGFyQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tNYWxmdW5jdGlvbkNoYXJzZXQgY3MgPSBuZXcgTW9ja01hbGZ1bmN0aW9uQ2hhcnNldCgibW9jayIsIG51bGwpOwogICAgICAgICB0cnkgewpAQCAtMTUzLDYgKzE4OCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCByZXNlcnZlIGJ5dGVzIGVuY29kZShDaGFyQnVmZmVyLEJ5dGVCdWZmZXIsYm9vbGVhbikKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9FbmNvZGVMamF2YV9uaW9fQ2hhckJ1ZmZlckxqYXZhX25pb19CeXRlQnVmZmVyQigpIHsKICAgICAgICAgQ2hhcnNldEVuY29kZXIgZW5jb2RlciA9IENoYXJzZXQuZm9yTmFtZSgidXRmLTgiKS5uZXdFbmNvZGVyKCk7CiAgICAgICAgIENoYXJCdWZmZXIgaW4xID0gQ2hhckJ1ZmZlci53cmFwKCJcdWQ4MDAiKTsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFRlc3QuamF2YQppbmRleCAwYzQ2Y2Q5Li5jOTEyNDY5IDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW9fY2hhci50ZXN0cy5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKQEAgLTI5LDcgKzM0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKENoYXJzZXQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ2hhcnNldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvLyBXaWxsIGNvbnRhaW4gbmFtZXMgb2YgY2hhcnNldHMgcmVnaXN0ZXJlZCB3aXRoIElBTkEKQEAgLTU2LDYgKzYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCNpc1JlZ2lzdGVyZWQoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVnaXN0ZXJlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNSZWdpc3RlcmVkKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ1CiAgICAgICAgIGZvciAoSXRlcmF0b3IgbmFtZUl0ciA9IGtub3duUmVnaXN0ZXJlZENoYXJzZXRzLml0ZXJhdG9yKCk7IG5hbWVJdHIuaGFzTmV4dCgpOykgewpAQCAtNzMsNiArODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0I2lzU3VwcG9ydGVkKFN0cmluZykKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWRfRW1wdHlTdHJpbmcoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTEzCiAgICAgICAgIHRyeSB7CkBAIC04Niw2ICsxMDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0I2RlZmF1bHRDaGFyc2V0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWZhdWx0Q2hhcnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVmYXVsdENoYXJzZXQoKSB7CiAgICAgICAgIFN0cmluZyBjaGFyc2V0TmFtZSA9IG51bGw7CiAgICAgICAgIFN0cmluZyBkZWZhdWx0Q2hhcnNldE5hbWUgPSBudWxsOwpAQCAtMTM1LDYgKzE2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQjZm9yTmFtZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9yTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvck5hbWVMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLyoKICAgICAgICAgICogaW52b2tlIGZvck5hbWUgdHdvIHRpbWVzIHdpdGggdGhlIHNhbWUgY2Fub25pY2FsIG5hbWUsIGl0CkBAIC0xNTYsNiArMTk3LDE1IEBACiAgICAgLyoKICAgICAgKiB0ZXN0IGNhY2hlZCBkZWNvZGVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfRGVjb2RlTGphdmFfbmlvX0J5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uewogICAgICAgICAgICAgTW9ja0NoYXJzZXRGb3JEZWNvZGVyIGNzMSA9IG5ldyBNb2NrQ2hhcnNldEZvckRlY29kZXIoIkNhY2hlZENoYXJzZXQiLG51bGwpOwogICAgICAgICAgICAgTW9ja0NoYXJzZXRGb3JEZWNvZGVyIGNzMiA9IG5ldyBNb2NrQ2hhcnNldEZvckRlY29kZXIoIkNhY2hlZENoYXJzZXQiLG51bGwpOwpAQCAtMjE4LDYgKzI2OCwxNSBAQAogICAgIC8qCiAgICAgICogdGVzdCBjYWNoZWQgZW5jb2RlcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0VuY29kZUxqYXZhX25pb19DaGFyQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBNb2NrQ2hhcnNldEZvckVuY29kZXIgY3MxID0gbmV3IE1vY2tDaGFyc2V0Rm9yRW5jb2RlcigiQ2FjaGVkQ2hhcnNldCIsIG51bGwpOwogICAgICAgICAgICAgTW9ja0NoYXJzZXRGb3JFbmNvZGVyIGNzMiA9IG5ldyBNb2NrQ2hhcnNldEZvckVuY29kZXIoIkNhY2hlZENoYXJzZXQiLCBudWxsKTsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvQ29kZXJNYWxmdW5jdGlvbkVycm9yVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9Db2Rlck1hbGZ1bmN0aW9uRXJyb3JUZXN0LmphdmEKaW5kZXggZGM5ZjI2OS4uZWVmYWQ2MyAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9Db2Rlck1hbGZ1bmN0aW9uRXJyb3JUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9Db2Rlck1hbGZ1bmN0aW9uRXJyb3JUZXN0LmphdmEKQEAgLTE2LDEyICsxNiwxOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW9fY2hhci50ZXN0cy5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2Rlck1hbGZ1bmN0aW9uRXJyb3I7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKENvZGVyTWFsZnVuY3Rpb25FcnJvci5jbGFzcykKIC8qKgogICogVGVzdCBqYXZhLm5pby5Db2Rlck1hbGZ1bmN0aW9uRXJyb3IuCiAgKi8KQEAgLTMwLDYgKzM2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IGNvbnN0cnVjdG9yIHdpdGggbm9ybWFsIHBhcmFtLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvZGVyTWFsZnVuY3Rpb25FcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuRXhjZXB0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfTm9ybWFsKCkgewogICAgICAgICBFeGNlcHRpb24gZXggPSBuZXcgRXhjZXB0aW9uKCk7CiAgICAgICAgIENvZGVyTWFsZnVuY3Rpb25FcnJvciBlID0gbmV3IENvZGVyTWFsZnVuY3Rpb25FcnJvcihleCk7CkBAIC0zOSw2ICs1NCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBjb25zdHJ1Y3RvciB3aXRoIG51bGwgcGFyYW0uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ29kZXJNYWxmdW5jdGlvbkVycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5FeGNlcHRpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9OdWxsKCkgewogICAgICAgICBDb2Rlck1hbGZ1bmN0aW9uRXJyb3IgZSA9IG5ldyBDb2Rlck1hbGZ1bmN0aW9uRXJyb3IobnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRDYXVzZSgpKTsKQEAgLTQ3LDYgKzcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IENvZGVyTWFsZnVuY3Rpb25FcnJvcihudWxsKSk7CkBAIC01NSw2ICs4OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgQ29kZXJNYWxmdW5jdGlvbkVycm9yKG51bGwpKTsKIApkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb25UZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0lsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA5MTRlZWEyLi42MWJkYzgxIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0lsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L0lsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvX2NoYXIudGVzdHMuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwogCkBAIC0yNCwxMSArMjksMjUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbi5jbGFzcykKIC8qKgogICogVGVzdCBjbGFzcyBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24uCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGFyc2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKworICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZXggPSBuZXcgSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJpbXBvc3NpYmxlIik7CkBAIC03Nyw2ICs5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24oCkBAIC04Niw2ICsxMTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvblRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggNDBhYjljNy4uNGVjOTk4ZiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L01hbGZvcm1lZElucHV0RXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW9fY2hhci50ZXN0cy5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjsKQEAgLTI1LDExICszMCwyNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdC5TZXJpYWxpemFibGVBc3NlcnQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24uY2xhc3MpCiAvKioKICAqIFRlc3QgY2xhc3MgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24uCiAgKi8KIHB1YmxpYyBjbGFzcyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNZXNzYWdlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSxAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElucHV0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBleCA9IG5ldyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbigzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShleCBpbnN0YW5jZW9mIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbik7CkBAIC02OCw2ICs4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbigxMSksCkBAIC03Nyw2ICsxMDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24oMTEpLApkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDBhYmVmYmUuLmNiZDI1NmEgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L1VubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pb19jaGFyLnRlc3RzLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb247CkBAIC0yNSwxMSArMzAsMjcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3QuU2VyaWFsaXphYmxlQXNzZXJ0OwogCitAVGVzdFRhcmdldENsYXNzKFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24uY2xhc3MpCiAvKioKICAqIFRlc3QgY2xhc3MgVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbi4KICAqLwogcHVibGljIGNsYXNzIFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWVzc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5wdXRMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24gZXggPSBuZXcgVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbigzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShleCBpbnN0YW5jZW9mIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbik7CkBAIC02OSw2ICs5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24oMTEpLApAQCAtNzgsNiArMTA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBuZXcgVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbigKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZGQxNzg0OC4uY2E3MzZlMiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pb19jaGFyLnRlc3RzLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKIApAQCAtMjQsMTEgKzI5LDI1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24uY2xhc3MpCiAvKioKICAqIFRlc3QgY2xhc3MgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uLgogICovCiBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2hhcnNldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKICAgICAgICAgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4ID0gbmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiaW1wb3NzaWJsZSIpOwpAQCAtNzYsNiArOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbigKQEAgLTg1LDYgKzExMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oCmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L3NwaS9DaGFyc2V0UHJvdmlkZXJUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9uaW9fY2hhci90ZXN0cy9qYXZhL25pby9jaGFyc2V0L3NwaS9DaGFyc2V0UHJvdmlkZXJUZXN0LmphdmEKaW5kZXggN2E5MGI1Ni4uNDMyMTQ3OSAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvbmlvX2NoYXIvdGVzdHMvamF2YS9uaW8vY2hhcnNldC9zcGkvQ2hhcnNldFByb3ZpZGVyVGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L25pb19jaGFyL3Rlc3RzL2phdmEvbmlvL2NoYXJzZXQvc3BpL0NoYXJzZXRQcm92aWRlclRlc3QuamF2YQpAQCAtMTYsMTMgKzE2LDE4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255Lm5pb19jaGFyLnRlc3RzLmphdmEubmlvLmNoYXJzZXQuc3BpOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuc3BpLkNoYXJzZXRQcm92aWRlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKENoYXJzZXRQcm92aWRlci5jbGFzcykKIC8qKgogICogVGVzdCBjbGFzcyBqYXZhLm5pby5jaGFyc2V0LnNwaS5DaGFyc2V0UHJvdmlkZXIuCiAgKi8KQEAgLTMxLDYgKzM2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBzZWN1cml0eSBjaGVjayBpbiB0aGUgY29uc3RydWN0b3IuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb3JtYWwgY29uZGl0aW9uIGRvZXMgbm90IGNoZWNrZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyB3aXRoIHN1ZmZpY2llbnQgcHJpdmlsZWdlCiAgICAgICAgIG5ldyBNb2NrQ2hhcnNldFByb3ZpZGVyKCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0FTQ0NoYXJzZXREZWNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9BU0NDaGFyc2V0RGVjb2RlclRlc3QuamF2YQppbmRleCA1ZGNmOTU2Li5kNDFmNWJmIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0FTQ0NoYXJzZXREZWNvZGVyVGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQVNDQ2hhcnNldERlY29kZXJUZXN0LmphdmEKQEAgLTE2LDEwICsxNiwxMyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQVNDQ2hhcnNldERlY29kZXJUZXN0IGV4dGVuZHMgQ2hhcnNldERlY29kZXJUZXN0IHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0FTQ0NoYXJzZXRUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0FTQ0NoYXJzZXRUZXN0LmphdmEKaW5kZXggZDkwN2U5My4uN2QwZTM2NiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9BU0NDaGFyc2V0VGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQVNDQ2hhcnNldFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTIgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuY2xhc3MpCiAvKioKICAqIFRlc3QgY2hhcnNldCBVUy1BU0NJSS4KICAqLwpAQCAtMzcsNiArNDMsMTUgQEAKICAgICAgKiAKICAgICAgKiBAc2VlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0LkNvbmNyZXRlQ2hhcnNldFRlc3QjdGVzdEVuY29kZV9Ob3JtYWwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZV9Ob3JtYWwoKSB7CiAgICAgICAgIFN0cmluZyBpbnB1dCA9ICJhYlx1NUQxNFx1NjU0RiI7CiAgICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBuZXcgYnl0ZVtdIHsgOTcsIDk4LApAQCAtNTAsNiArNjUsMTUgQEAKICAgICAgKiAKICAgICAgKiBAc2VlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0LkNvbmNyZXRlQ2hhcnNldFRlc3QjdGVzdERlY29kZV9Ob3JtYWwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZV9Ob3JtYWwoKSB7CiAgICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW10geyA5NywgOTgsIDYzLCA2MyB9OwogICAgICAgICBjaGFyW10gb3V0cHV0ID0gImFiPz8iLnRvQ2hhckFycmF5KCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0Fic3RyYWN0Q2hhcnNldFRlc3RDYXNlLmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0Fic3RyYWN0Q2hhcnNldFRlc3RDYXNlLmphdmEKaW5kZXggOWE5YjQ1Yy4uNmRlZDEwMiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9BYnN0cmFjdENoYXJzZXRUZXN0Q2FzZS5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQWJzdHJhY3RDaGFyc2V0VGVzdENhc2UuamF2YQpAQCAtMSwxMSArMSwxNiBAQAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzKQogLyoqCiAgKiBTdXBlciBjbGFzcyBmb3IgY29uY3JldGUgY2hhcnNldCB0ZXN0IHN1aXRlcy4KICAqLwpAQCAtNTksNiArNjQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgY2FuRW5jb2RlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRoaXMuY2FuRW5jb2RlLCB0aGlzLnRlc3RpbmdDaGFyc2V0LmNhbkVuY29kZSgpKTsKICAgICB9CkBAIC02Niw2ICs4MCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBpc1JlZ2lzdGVyZWQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlZ2lzdGVyZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWdpc3RlcmVkKCkgewogICAgICAgICBhc3NlcnRFcXVhbHModGhpcy5pc1JlZ2lzdGVyZWQsIHRoaXMudGVzdGluZ0NoYXJzZXQuaXNSZWdpc3RlcmVkKCkpOwogICAgIH0KQEAgLTczLDYgKzk2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IG5hbWUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5hbWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyh0aGlzLmNhbm9uaWNhbE5hbWUsIHRoaXMudGVzdGluZ0NoYXJzZXQubmFtZSgpKTsKICAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKHRoaXMuY2Fub25pY2FsTmFtZSwgdGhpcy50ZXN0aW5nQ2hhcnNldC5kaXNwbGF5TmFtZSgpKTsKQEAgLTgzLDYgKzExNSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBhbGlhc2VzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBmdW5jdGlvbmFsaXR5IGNvbXBsZXRlbHkgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFsaWFzZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxpYXNlcygpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFsaWFzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIENoYXJzZXQgYyA9IENoYXJzZXQuZm9yTmFtZSh0aGlzLmFsaWFzZXNbaV0pOwpAQCAtOTUsNiArMTM2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZW5jb2RlKFN0cmluZykgd2l0aCBudWxsLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVfU3RyaW5nX051bGwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0aGlzLnRlc3RpbmdDaGFyc2V0LmVuY29kZSgoU3RyaW5nKSBudWxsKTsKQEAgLTEwNyw2ICsxNTcsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBlbmNvZGUoQ2hhckJ1ZmZlcikgd2l0aCBudWxsLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVfQ2hhckJ1ZmZlcl9OdWxsKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgdGhpcy50ZXN0aW5nQ2hhcnNldC5lbmNvZGUoKENoYXJCdWZmZXIpIG51bGwpOwpAQCAtMTM0LDYgKzE5MywxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCBlbmNvZGluZy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJTdXBlciBjbGFzcyBmb3IgdGVzdGluZy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0ZXN0RW5jb2RlX05vcm1hbCgpOwogCiAgICAgLyoKQEAgLTE1NCw1ICsyMjIsMTQgQEAKICAgICAvKgogICAgICAqIFRlc3QgZGVjb2RpbmcuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlN1cGVyIGNsYXNzIGZvciB0ZXN0aW5nLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3REZWNvZGVfTm9ybWFsKCk7CiB9CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0FsbFRlc3RzLmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0FsbFRlc3RzLmphdmEKaW5kZXggZTcxODY1MS4uNjY2ZDY5OCAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9BbGxUZXN0cy5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQWxsVGVzdHMuamF2YQpAQCAtMSwxMiArMSwxMiBAQAotLyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCiAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKKyAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCkBAIC0xNiw0NiArMTYsNTAgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5uaW9fY2hhci50ZXN0cy5qYXZhLm5pby5jaGFyc2V0LkFTQ0lJQ2hhcnNldEVuY29kZXJUZXN0OwotCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKIAogLyoqCi0gKiBUZXN0IHN1aXRlIGZvciBqYXZhLm5pby5jaGFyc2V0IHBhY2thZ2UuCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogICovCisKIHB1YmxpYyBjbGFzcyBBbGxUZXN0cyB7CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihBbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0Iik7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsiKTsKICAgICAgICAgLy8gJEpVbml0LUJFR0lOJAotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29kaW5nRXJyb3JBY3Rpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENvZGVyUmVzdWx0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaGFyc2V0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBU0NDaGFyc2V0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJU09DaGFyc2V0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVVEY4Q2hhcnNldFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVRGMTZDaGFyc2V0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVVEYxNkJFQ2hhcnNldFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVRGMTZMRUNoYXJzZXRUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENoYXJzZXRFbmNvZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJU09DaGFyc2V0RW5jb2RlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVRGQ2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgLy8gR0JDaGFyc2V0IG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgLy8gc3VpdGUuYWRkVGVzdFN1aXRlKEdCQ2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFTQ0lJQ2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURjE2Q2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURjE2TEVDaGFyc2V0RW5jb2RlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVRGMTZCRUNoYXJzZXRFbmNvZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaGFyc2V0RGVjb2RlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSVNPQ2hhcnNldERlY29kZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURkNoYXJzZXREZWNvZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIEdCQ2hhcnNldCBub3Qgc3VwcG9ydGVkCi0gICAgICAgIC8vIHN1aXRlLmFkZFRlc3RTdWl0ZShHQkNoYXJzZXREZWNvZGVyVGVzdC5jbGFzcyk7CisKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFTQ0NoYXJzZXREZWNvZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVVEYxNkNoYXJzZXREZWNvZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVVEYxNkxFQ2hhcnNldERlY29kZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFTQ0NoYXJzZXRUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENoYXJzZXREZWNvZGVyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaGFyc2V0RW5jb2RlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhcnNldFByb3ZpZGVyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaGFyc2V0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDb2RlclJlc3VsdFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29kaW5nRXJyb3JBY3Rpb25UZXN0LmNsYXNzKTsKKy8vIEdCQ2hhcnNldCBub3Qgc3VwcG9ydGVkCisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdCQ2hhcnNldERlY29kZXJUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR0JDaGFyc2V0RW5jb2RlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSVNPQ2hhcnNldERlY29kZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKElTT0NoYXJzZXRFbmNvZGVyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJU09DaGFyc2V0VGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVVEYxNkJFQ2hhcnNldERlY29kZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURjE2QkVDaGFyc2V0RW5jb2RlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVRGMTZCRUNoYXJzZXRUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURjE2Q2hhcnNldERlY29kZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURjE2Q2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURjE2Q2hhcnNldFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVRGMTZMRUNoYXJzZXREZWNvZGVyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVVEYxNkxFQ2hhcnNldEVuY29kZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURjE2TEVDaGFyc2V0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVVEY4Q2hhcnNldFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVVRGQ2hhcnNldERlY29kZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVURkNoYXJzZXRFbmNvZGVyVGVzdC5jbGFzcyk7CisKICAgICAgICAgLy8gJEpVbml0LUVORCQKICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgIH0KZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldERlY29kZXJUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXREZWNvZGVyVGVzdC5qYXZhCmluZGV4IDBkMDY3YjAuLjc0YmI4NTIgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldERlY29kZXJUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0RGVjb2RlclRlc3QuamF2YQpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CkBAIC0yNyw3ICszMiw3IEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKENoYXJzZXREZWNvZGVyLmNsYXNzKQogLyoqCiAgKiBBUEkgdW5pdCB0ZXN0IGZvciBqYXZhLm5pby5DaGFyc2V0RGVjb2RlcgogICovCkBAIC03MCw2ICs3NSwzMyBAQAogICAgIC8vIGFzc2VydFRydWUoZGVjb2Rlci5tYXhDaGFyc1BlckJ5dGUoKSA9PSBNQVhfQllURVMpOwogICAgIC8vIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoYXJzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRldGVjdGVkQ2hhcnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNDaGFyc2V0RGV0ZWN0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQXV0b0RldGVjdGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFsZm9ybWVkSW5wdXRBY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVubWFwcGFibGVDaGFyYWN0ZXJBY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlcGxhY2VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZXMoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoY3MsIGRlY29kZXIuY2hhcnNldCgpKTsKICAgICAgICAgdHJ5IHsKQEAgLTkyLDYgKzEyNCwyNCBAQAogICAgIC8qCiAgICAgICogdGVzdCBjb25zdHJ1Y3RvcgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXREZWNvZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ2hhcnNldC5jbGFzcywgZmxvYXQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoYXJzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImF2ZXJhZ2VDaGFyc1BlckJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1heENoYXJzUGVyQnl0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyc2V0RGVjb2RlcigpIHsKICAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZQogICAgICAgICBkZWNvZGVyID0gbmV3IE1vY2tDaGFyc2V0RGVjb2RlcihjcywgKGZsb2F0KSBBVkVSX0JZVEVTLCBNQVhfQllURVMpOwpAQCAtMTQ4LDYgKzE5OCwxOCBAQAogICAgIC8qCiAgICAgICogdGVzdCBvbk1hbGZvcm1lZElucHV0CiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFsZm9ybWVkSW5wdXRBY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9uTWFsZm9ybWVkSW5wdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9uTWFsZm9ybWVkSW5wdXQoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JULCBkZWNvZGVyLm1hbGZvcm1lZElucHV0QWN0aW9uKCkpOwogICAgICAgICB0cnkgewpAQCAtMTYyLDYgKzIyNCwxOCBAQAogICAgIC8qCiAgICAgICogdGVzdCB1bm1hcHBhYmxlQ2hhcmFjdGVyCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tYXBwYWJsZUNoYXJhY3RlckFjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib25Vbm1hcHBhYmxlQ2hhcmFjdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RPblVubWFwcGFibGVDaGFyYWN0ZXIoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JULCBkZWNvZGVyCiAgICAgICAgICAgICAgICAgLnVubWFwcGFibGVDaGFyYWN0ZXJBY3Rpb24oKSk7CkBAIC0xNzgsNiArMjUyLDE4IEBACiAgICAgLyoKICAgICAgKiB0ZXN0IHJlcGxhY2VXaXRoCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVwbGFjZVdpdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXBsYWNlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlV2l0aCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGRlY29kZXIucmVwbGFjZVdpdGgobnVsbCk7CkBAIC0yMDIsNiArMjg4LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBDaGFyQnVmZmVyIGRlY29kZShCeXRlQnVmZmVyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uICYgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZUJ5dGVCdWZmZXIoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgaW1wbFRlc3REZWNvZGVCeXRlQnVmZmVyKCk7CiAgICAgfQpAQCAtMjI3LDYgKzMyMiwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZyhvdXQuYXJyYXkoKSwgMCwgb3V0LmxpbWl0KCkpLCB1bmlzdHIpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uICYgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZUJ5dGVCdWZmZXJFeGNlcHRpb24oKQogICAgICAgICAgICAgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIENoYXJCdWZmZXIgb3V0OwpAQCAtMjkzLDYgKzM5NywxNiBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQ29kZXJSZXN1bHQgZGVjb2RlKEJ5dGVCdWZmZXIsIENoYXJCdWZmZXIsIGJvb2xlYW4pCiAgICAgICovCisKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4gRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVCeXRlQnVmZmVyQ2hhckJ1ZmZlcmJvb2xlYW4oKSB7CiAgICAgICAgIGltcGxUZXN0RGVjb2RlQnl0ZUJ1ZmZlckNoYXJCdWZmZXJib29sZWFuKCk7CiAgICAgfQpAQCAtMzY5LDExICs0ODMsMjkgQEAKICAgICAgICAgYXNzZXJ0Q2hhckJ1ZmZlclZhbHVlKG91dCwgYm9tICsgdW5pc3RyKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4gRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVDaGFyQnVmZmVyQnl0ZUJ1ZmZlcmJvb2xlYW5FeGNlcHRpb25UcnVlKCkKICAgICAgICAgICAgIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogICAgICAgICBpbXBsVGVzdERlY29kZUNoYXJCdWZmZXJCeXRlQnVmZmVyYm9vbGVhbkV4Y2VwdGlvbih0cnVlKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4gRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVDaGFyQnVmZmVyQnl0ZUJ1ZmZlcmJvb2xlYW5FeGNlcHRpb25GYWxzZSgpCiAgICAgICAgICAgICB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgaW1wbFRlc3REZWNvZGVDaGFyQnVmZmVyQnl0ZUJ1ZmZlcmJvb2xlYW5FeGNlcHRpb24oZmFsc2UpOwpAQCAtNDgyLDYgKzYxNCwxNSBAQAogICAgIC8qCiAgICAgICogdGVzdCBmbHVzaAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rmx1c2goKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhckJ1ZmZlciBvdXQgPSBDaGFyQnVmZmVyLmFsbG9jYXRlKDEwKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHsgMTIsIDEyIH0pOwpAQCAtNTAxLDYgKzY0MiwxNSBAQAogICAgICAqLwogICAgIC8vIE5vcm1hbCBjYXNlOiBqdXN0IGFmdGVyIHJlc2V0LCBhbmQgaXQgYWxzbyBtZWFucyByZXNldCBjYW4gYmUgZG9uZQogICAgIC8vIGFueXdoZXJlCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXRJbGxlZ2FsU3RhdGUoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGdiID0gZ2V0VW5pYnl0ZXMoKTsKICAgICAgICAgZGVjb2Rlci5yZXNldCgpOwpAQCAtNTEyLDYgKzY2MiwxOCBAQAogICAgICAgICBkZWNvZGVyLnJlc2V0KCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaElsbGVnYWxTdGF0ZSgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIGluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geyA5OCwgOTggfSk7CiAgICAgICAgIENoYXJCdWZmZXIgb3V0ID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSg1KTsKQEAgLTU0NCw2ICs3MDYsMTggQEAKICAgICB9CiAKICAgICAvLyB0ZXN0IGlsbGVnYWwgc3RhdGVzIGZvciBkZWNvZGUgZmFjYWRlCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlRmFjYWRlSWxsZWdhbFN0YXRlKCkgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGRlY29kZSBmYWNhZGUgY2FuIGJlIGV4ZWN1dGUgaW4gYW55d2hlcmUKICAgICAgICAgYnl0ZVtdIGdiID0gZ2V0VW5pYnl0ZXMoKTsKQEAgLTU3Nyw2ICs3NTEsMTUgQEAKICAgICB9CiAKICAgICAvLyB0ZXN0IGlsbGVnYWwgc3RhdGVzIGZvciB0d28gZGVjb2RlIG1ldGhvZCB3aXRoIGVuZE9mSW5wdXQgaXMgdHJ1ZQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ29kZXJNYWxmdW5jdGlvbkVycm9yIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlVHJ1ZUlsbGVnYWxTdGF0ZSgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIGluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geyA5OCwgOTggfSk7CiAgICAgICAgIENoYXJCdWZmZXIgb3V0ID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSgxMDApOwpAQCAtNjE3LDYgKzgwMCwxNSBAQAogICAgIH0KIAogICAgIC8vIHRlc3QgaWxsZWdhbCBzdGF0ZXMgZm9yIHR3byBkZWNvZGUgbWV0aG9kIHdpdGggZW5kT2ZJbnB1dCBpcyBmYWxzZQorQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgcHVycG9zZSA9ICJDb2Rlck1hbGZ1bmN0aW9uRXJyb3IgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVGYWxzZUlsbGVnYWxTdGF0ZSgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIGluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geyA5OCwgOTggfSk7CiAgICAgICAgIENoYXJCdWZmZXIgb3V0ID0gQ2hhckJ1ZmZlci5hbGxvY2F0ZSg1KTsKQEAgLTY3NCwxMiArODY2LDMwIEBACiAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsRmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcGxGbHVzaCgpIHsKICAgICAgICAgZGVjb2RlciA9IG5ldyBNb2NrQ2hhcnNldERlY29kZXIoY3MsIDEsIDMpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQ29kZXJSZXN1bHQuVU5ERVJGTE9XLCAoKE1vY2tDaGFyc2V0RGVjb2RlcikgZGVjb2RlcikKICAgICAgICAgICAgICAgICAucHViSW1wbEZsdXNoKG51bGwpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsT25NYWxmb3JtZWRJbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbE9uTWFsZm9ybWVkSW5wdXQoKSB7CiAgICAgICAgIGRlY29kZXIgPSBuZXcgTW9ja0NoYXJzZXREZWNvZGVyKGNzLCAxLCAzKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKENvZGVyUmVzdWx0LlVOREVSRkxPVywgKChNb2NrQ2hhcnNldERlY29kZXIpIGRlY29kZXIpCkBAIC02ODcsMTYgKzg5Nyw0MyBAQAogCiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbE9uVW5tYXBwYWJsZUNoYXJhY3RlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbE9uVW5tYXBwYWJsZUNoYXJhY3RlcigpIHsKICAgICAgICAgZGVjb2RlciA9IG5ldyBNb2NrQ2hhcnNldERlY29kZXIoY3MsIDEsIDMpOwogICAgICAgICAoKE1vY2tDaGFyc2V0RGVjb2RlcikgZGVjb2RlcikucHViSW1wbE9uVW5tYXBwYWJsZUNoYXJhY3RlcihudWxsKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsUmVwbGFjZVdpdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcGxSZXBsYWNlV2l0aCgpIHsKICAgICAgICAgZGVjb2RlciA9IG5ldyBNb2NrQ2hhcnNldERlY29kZXIoY3MsIDEsIDMpOwogICAgICAgICAoKE1vY2tDaGFyc2V0RGVjb2RlcikgZGVjb2RlcikucHViSW1wbFJlcGxhY2VXaXRoKG51bGwpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxSZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsUmVzZXQoKSB7CiAgICAgICAgIGRlY29kZXIgPSBuZXcgTW9ja0NoYXJzZXREZWNvZGVyKGNzLCAxLCAzKTsKICAgICAgICAgKChNb2NrQ2hhcnNldERlY29kZXIpIGRlY29kZXIpLnB1YkltcGxSZXNldCgpOwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0RW5jb2RlclRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKaW5kZXggMzI4NGE1Ny4uNDc1Y2Q4NyAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0RW5jb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRFbmNvZGVyVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwpAQCAtMjksNyArMzQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2hhcnNldEVuY29kZXIuY2xhc3MpCiAvKioKICAqIEFQSSB1bml0IHRlc3QgZm9yIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIKICAqLwpAQCAtODEsMTEgKzg2LDQ0IEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZlcmFnZUJ5dGVzUGVyQ2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4Qnl0ZXNQZXJDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNwZWNpZmljRGVmYXVsdFZhbHVlKCkgewogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuYXZlcmFnZUJ5dGVzUGVyQ2hhcigpID09IEFWRVJfQllURVMpOwogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIubWF4Qnl0ZXNQZXJDaGFyKCkgPT0gTUFYX0JZVEVTKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIm9uTWFsZm9ybWVkSW5wdXQgJiBvblVubWFwcGFibGVDaGFyYWN0ZXIgcmVxdWlyZXMgY2hlY2sgZm9yIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hbGZvcm1lZElucHV0QWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1hcHBhYmxlQ2hhcmFjdGVyQWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvbk1hbGZvcm1lZElucHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib25Vbm1hcHBhYmxlQ2hhcmFjdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVwbGFjZW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JULCBlbmNvZGVyLm1hbGZvcm1lZElucHV0QWN0aW9uKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JULCBlbmNvZGVyCkBAIC0xMDUsNiArMTQzLDMzIEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBjb25zdHJ1Y3RvciBDaGFyc2V0RW5jb2RlcihDaGFyc2V0LCBmbG9hdCwgZmxvYXQpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hhcnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZlcmFnZUJ5dGVzUGVyQ2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4Qnl0ZXNQZXJDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYWxmb3JtZWRJbnB1dEFjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tYXBwYWJsZUNoYXJhY3RlckFjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldEVuY29kZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzLCBmbG9hdC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVwbGFjZW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldEVuY29kZXJDaGFyc2V0ZmxvYXRmbG9hdCgpIHsKICAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZQogICAgICAgICBlbmNvZGVyID0gbmV3IE1vY2tDaGFyc2V0RW5jb2RlcihjcywgKGZsb2F0KSBBVkVSX0JZVEVTLCBNQVhfQllURVMpOwpAQCAtMTc0LDYgKzIzOSwyNyBAQAogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGNvbnN0cnVjdG9yIENoYXJzZXRFbmNvZGVyKENoYXJzZXQsIGZsb2F0LCBmbG9hdCwKICAgICAgKiBieXRlW10pCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldEVuY29kZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzLCBmbG9hdC5jbGFzcywgZmxvYXQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGFyc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdmVyYWdlQnl0ZXNQZXJDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXhCeXRlc1BlckNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlcGxhY2VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENoYXJzZXRFbmNvZGVyQ2hhcnNldGZsb2F0ZmxvYXRieXRlQXJyYXkoKSB7CiAgICAgICAgIGJ5dGVbXSBiYSA9IGdldExlZ2FsQnl0ZUFycmF5KCk7CiAgICAgICAgIC8vIG5vcm1hbCBjYXNlCkBAIC0yNDgsNiArMzM0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBib29sZWFuIGNhbkVuY29kZShjaGFyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZWNoYXIoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZm9yIG5vbi1tYXBwZWQgY2hhcgogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdWMyYzAnKSk7CkBAIC0yNjcsNiArMzYyLDI3IEBACiAKICAgICAvLyBOb3JtYWwgY2FzZToganVzdCBhZnRlciByZXNldCwgYW5kIGl0IGFsc28gbWVhbnMgcmVzZXQgY2FuIGJlIGRvbmUKICAgICAvLyBhbnl3aGVyZQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXRJbGxlZ2FsU3RhdGUoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0U2FtZShlbmNvZGVyLCBlbmNvZGVyLnJlc2V0KCkpOwogICAgICAgICBlbmNvZGVyLmNhbkVuY29kZSgnXHVkOTAxJyk7CkBAIC0yODEsNiArMzk3LDE4IEBACiAgICAgICAgIGFzc2VydFNhbWUoZW5jb2RlciwgZW5jb2Rlci5yZXNldCgpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZsdXNoSWxsZWdhbFN0YXRlKCkgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIENoYXJCdWZmZXIgaW4gPSBDaGFyQnVmZmVyLndyYXAoImFhYSIpOwogICAgICAgICBCeXRlQnVmZmVyIG91dCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNSk7CkBAIC0zMDksNiArNDM3LDI3IEBACiAgICAgfQogCiAgICAgLy8gdGVzdCBpbGxlZ2FsIHN0YXRlcyBmb3IgZW5jb2RlIGZhY2FkZQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUZhY2FkZUlsbGVnYWxTdGF0ZSgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICAvLyBlbmNvZGUgZmFjYWRlIGNhbiBiZSBleGVjdXRlIGluIGFueXdoZXJlCiAgICAgICAgIENoYXJCdWZmZXIgaW4gPSBDaGFyQnVmZmVyLndyYXAoImFhYSIpOwpAQCAtMzU0LDYgKzUwMywyNyBAQAogICAgIH0KIAogICAgIC8vIHRlc3QgaWxsZWdhbCBzdGF0ZXMgZm9yIHR3byBlbmNvZGUgbWV0aG9kIHdpdGggZW5kT2ZJbnB1dCBpcyB0cnVlCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVRydWVJbGxlZ2FsU3RhdGUoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhckJ1ZmZlciBpbiA9IENoYXJCdWZmZXIud3JhcCgiYWFhIik7CiAgICAgICAgIEJ5dGVCdWZmZXIgb3V0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1KTsKQEAgLTQwNCw2ICs1NzQsMzAgQEAKICAgICB9CiAKICAgICAvLyB0ZXN0IGlsbGVnYWwgc3RhdGVzIGZvciB0d28gZW5jb2RlIG1ldGhvZCB3aXRoIGVuZE9mSW5wdXQgaXMgZmFsc2UKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzLCBqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlRmFsc2VJbGxlZ2FsU3RhdGUoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhckJ1ZmZlciBpbiA9IENoYXJCdWZmZXIud3JhcCgiYWFhIik7CiAgICAgICAgIEJ5dGVCdWZmZXIgb3V0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1KTsKQEAgLTQ2Miw2ICs2NTYsMjQgQEAKICAgICB9CiAKICAgICAvLyB0ZXN0IGlsbGVnYWwgc3RhdGVzIGZvciB0d28gY2FuRW5jb2RlIG1ldGhvZHMKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZUlsbGVnYWxTdGF0ZSgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICAvLyBOb3JtYWwgY2FzZToganVzdCBjcmVhdGVkCiAgICAgICAgIGVuY29kZXIuY2FuRW5jb2RlKCJcdWQ5MDBcdWRjMDAiKTsKQEAgLTUwOCw2ICs3MjAsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJvb2xlYW4gY2FuRW5jb2RlKENoYXJTZXF1ZW5jZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5FbmNvZGVDaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIC8vIGZvciBub24tbWFwcGVkIGNoYXIKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgiXHVjMmMwIikpOwpAQCAtNTI0LDYgKzc0NSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQ2hhcnNldCBjaGFyc2V0KCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXRFbmNvZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ2hhcnNldC5jbGFzcywgZmxvYXQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVuY29kZXIgPSBuZXcgTW9ja0NoYXJzZXRFbmNvZGVyKENoYXJzZXQuZm9yTmFtZSgiZ2JrIiksIDEsCkBAIC01MzgsNiArNzY4LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBCeXRlQnVmZmVyIGVuY29kZShDaGFyQnVmZmVyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0LiBFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUNoYXJCdWZmZXIoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgLy8gTnVsbCBwb2ludGVyCiAgICAgICAgIHRyeSB7CkBAIC01OTgsNiArODM3LDE1IEBACiAgICAgICAgIHJldHVybiBDaGFyQnVmZmVyLndyYXAoInJ1bnRpbWUgYnVmZmVyIik7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJNaXNzZWQgY2hlY2tpbmcgZm9yIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAmIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlQ2hhckJ1ZmZlckV4Y2VwdGlvbigpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIG91dDsKICAgICAgICAgQ2hhckJ1ZmZlciBpbjsKQEAgLTY3Nyw2ICs5MjUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIENvZGVyUmVzdWx0IGVuY29kZShDaGFyQnVmZmVyLCBCeXRlQnVmZmVyLCBib29sZWFuKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0LiBFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUNoYXJCdWZmZXJCeXRlQnVmZmVyYm9vbGVhbigpCiAgICAgICAgICAgICB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBvdXQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDIwMCk7CkBAIC03ODIsMTEgKzEwMzksMjkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4gRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVDaGFyQnVmZmVyQnl0ZUJ1ZmZlcmJvb2xlYW5FeGNlcHRpb25GYWxzZSgpCiAgICAgICAgICAgICB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgaW1wbFRlc3RFbmNvZGVDaGFyQnVmZmVyQnl0ZUJ1ZmZlcmJvb2xlYW5FeGNlcHRpb24oZmFsc2UpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdC4gRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVDaGFyQnVmZmVyQnl0ZUJ1ZmZlcmJvb2xlYW5FeGNlcHRpb25UcnVlKCkKICAgICAgICAgICAgIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBpbXBsVGVzdEVuY29kZUNoYXJCdWZmZXJCeXRlQnVmZmVyYm9vbGVhbkV4Y2VwdGlvbih0cnVlKTsKQEAgLTg4Nyw2ICsxMTYyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBDb2RlclJlc3VsdCBmbHVzaChCeXRlQnVmZmVyKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGphdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaCgpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICBCeXRlQnVmZmVyIG91dCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNik7CiAgICAgICAgIENoYXJCdWZmZXIgaW4gPSBDaGFyQnVmZmVyLndyYXAoImFhYSIpOwpAQCAtOTAyLDYgKzExODYsMTUgQEAKICAgICAvKgogICAgICAqIHRlc3QgaXNMZWdhbFJlcGxhY2VtZW50KGJ5dGVbXSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTGVnYWxSZXBsYWNlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0xlZ2FsUmVwbGFjZW1lbnQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBlbmNvZGVyLmlzTGVnYWxSZXBsYWNlbWVudChudWxsKTsKQEAgLTkxNyw2ICsxMjEwLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTGVnYWxSZXBsYWNlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0xlZ2FsUmVwbGFjZW1lbnRFbXB0eUFycmF5KCkgewogICAgICAgICAvLyBJU08sIEFTQywgR0IsIFVURjggZW5jb2RlciB3aWxsIHRocm93IGV4Y2VwdGlvbiBpbiBSSQogICAgICAgICAvLyBvdGhlcnMgd2lsbCBwYXNzCkBAIC05MjcsNiArMTIyOSwxOCBAQAogICAgICAgICAvLyB9CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib25NYWxmb3JtZWRJbnB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hbGZvcm1lZElucHV0QWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE9uTWFsZm9ybWVkSW5wdXQoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JULCBlbmNvZGVyLm1hbGZvcm1lZElucHV0QWN0aW9uKCkpOwogICAgICAgICB0cnkgewpAQCAtOTM4LDYgKzEyNTIsMTggQEAKICAgICAgICAgYXNzZXJ0U2FtZShDb2RpbmdFcnJvckFjdGlvbi5JR05PUkUsIGVuY29kZXIubWFsZm9ybWVkSW5wdXRBY3Rpb24oKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib25Vbm1hcHBhYmxlQ2hhcmFjdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tYXBwYWJsZUNoYXJhY3RlckFjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RPblVubWFwcGFibGVDaGFyYWN0ZXIoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JULCBlbmNvZGVyCiAgICAgICAgICAgICAgICAgLnVubWFwcGFibGVDaGFyYWN0ZXJBY3Rpb24oKSk7CkBAIC05NTEsNiArMTI3NywxOCBAQAogICAgICAgICAgICAgICAgIC51bm1hcHBhYmxlQ2hhcmFjdGVyQWN0aW9uKCkpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlcGxhY2VXaXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXBsYWNlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlbWVudCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVuY29kZXIucmVwbGFjZVdpdGgobnVsbCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRQcm92aWRlclRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFByb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDc0YjU2YTkuLmU2YjY5YmMgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFByb3ZpZGVyVGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFByb3ZpZGVyVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKQEAgLTI4LDYgKzMzLDcgQEAKIGltcG9ydCB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0VGVzdC5Nb2NrQ2hhcnNldDsKIGltcG9ydCB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0VGVzdC5Nb2NrU2VjdXJpdHlNYW5hZ2VyOwogCitAVGVzdFRhcmdldENsYXNzKENoYXJzZXRQcm92aWRlci5jbGFzcykKIC8qKgogICogVGVzdCBjaGFyc2V0IHByb3ZpZGVycyBtYW5hZ2VkIGJ5IENoYXJzZXQuCiAgKi8KQEAgLTkxLDcgKzk3LDcgQEAKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgaXNTdXBwb3J0ZWQoU3RyaW5nKSB3aXRoIGNoYXJzZXQgc3VwcG9ydGVkIGJ5IHNvbWUKICAgICAgKiBwcm92aWRlcnMgKG11bHRpcGxlKS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWRfQW5kX0Zvck5hbWVfTm9ybWFsUHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdElzU3VwcG9ydGVkX0FuZF9Gb3JOYW1lX05vcm1hbFByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnRGYWxzZShDaGFyc2V0LmlzU3VwcG9ydGVkKCJtb2NrQ2hhcnNldDEwIikpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQ2hhcnNldC5pc1N1cHBvcnRlZCgibW9ja0NoYXJzZXQxMSIpKTsKQEAgLTE1OSw2ICsxNjUsMTUgQEAKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgaXNTdXBwb3J0ZWQoU3RyaW5nKSB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbnMKICAgICAgKiBhIG5vbi1leGlzdGluZyBjbGFzcyBuYW1lLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBmb3IgQ2hhcnNldC5pc1N1cHBvcnRlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoYXJzZXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkX05vbkV4aXN0aW5nQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTE3OCw3ICsxOTMsNyBAQAogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBpc1N1cHBvcnRlZChTdHJpbmcpIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWlucwogICAgICAqIGEgbm9uLUNoYXJzZXRQcm92aWRlciBjbGFzcyBuYW1lLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZF9Ob3RDaGFyc2V0UHJvdmlkZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIF90ZXN0SXNTdXBwb3J0ZWRfTm90Q2hhcnNldFByb3ZpZGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiamF2YS5sYW5nLlN0cmluZ1xyIik7CkBAIC0xOTcsNyArMjEyLDcgQEAKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgaXNTdXBwb3J0ZWQoU3RyaW5nKSB3aXRoIGluc3VmZmljaWVudCBwcml2aWxlZ2UgdG8gdXNlCiAgICAgICogY2hhcnNldCBwcm92aWRlci4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWRfSW5zdWZmaWNpZW50UHJpdmlsZWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgX3Rlc3RJc1N1cHBvcnRlZF9JbnN1ZmZpY2llbnRQcml2aWxlZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZE1hbiA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgTW9ja1NlY3VyaXR5TWFuYWdlcigpKTsKICAgICAgICAgdHJ5IHsKQEAgLTIyNSw2ICsyNDAsMTUgQEAKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZm9yTmFtZShTdHJpbmcpIHdoZW4gdGhlIGNoYXJzZXQgcHJvdmlkZXIgc3VwcG9ydHMgYQogICAgICAqIGJ1aWx0LWluIGNoYXJzZXQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVGVzdCBmb3IgQ2hhcnNldC5pc1N1cHBvcnRlZCIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImNoYXJzZXRzIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZvck5hbWVfRHVwbGljYXRlV2l0aEJ1aWx0SW5DaGFyc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CkBAIC0yNDMsNyArMjY3LDcgQEAKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZm9yTmFtZShTdHJpbmcpIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWlucyBhCiAgICAgICogbm9uLWV4aXN0aW5nIGNsYXNzIG5hbWUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZvck5hbWVfTm9uRXhpc3RpbmdDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIF90ZXN0Rm9yTmFtZV9Ob25FeGlzdGluZ0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgICBzYi5hcHBlbmQoImltcG9zc2libGVcciIpOwpAQCAtMjYyLDcgKzI4Niw3IEBACiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGZvck5hbWUoU3RyaW5nKSB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbnMgYQogICAgICAqIG5vbi1DaGFyc2V0UHJvdmlkZXIgY2xhc3MgbmFtZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yTmFtZV9Ob3RDaGFyc2V0UHJvdmlkZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIF90ZXN0Rm9yTmFtZV9Ob3RDaGFyc2V0UHJvdmlkZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgc2IuYXBwZW5kKCJqYXZhLmxhbmcuU3RyaW5nXHIiKTsKQEAgLTI4MSw3ICszMDUsNyBAQAogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBhdmFpbGFibGVDaGFyc2V0cygpIHdpdGggY2hhcnNldCBzdXBwb3J0ZWQgYnkgc29tZQogICAgICAqIHByb3ZpZGVycyAobXVsdGlwbGUpLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBdmFpbGFibGVDaGFyc2V0c19Ob3JtYWxQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIF90ZXN0QXZhaWxhYmxlQ2hhcnNldHNfTm9ybWFsUHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFzc2VydEZhbHNlKENoYXJzZXQuYXZhaWxhYmxlQ2hhcnNldHMoKQogICAgICAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkoIm1vY2tDaGFyc2V0MTAiKSk7CkBAIC0zNDAsNiArMzY0LDE1IEBACiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGF2YWlsYWJsZUNoYXJzZXRzKFN0cmluZykgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCiAgICAgICogY29udGFpbnMgYSBub24tZXhpc3RpbmcgY2xhc3MgbmFtZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUZXN0IGZvciBDaGFyc2V0LmlzU3VwcG9ydGVkIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hhcnNldHMiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZhaWxhYmxlQ2hhcnNldHNfTm9uRXhpc3RpbmdDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtMzU5LDcgKzM5Miw3IEBACiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGF2YWlsYWJsZUNoYXJzZXRzKFN0cmluZykgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCiAgICAgICogY29udGFpbnMgYSBub24tQ2hhcnNldFByb3ZpZGVyIGNsYXNzIG5hbWUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEF2YWlsYWJsZUNoYXJzZXRzX05vdENoYXJzZXRQcm92aWRlckNsYXNzKCkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEF2YWlsYWJsZUNoYXJzZXRzX05vdENoYXJzZXRQcm92aWRlckNsYXNzKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtMzc5LDYgKzQxMiwxNSBAQAogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBhdmFpbGFibGVDaGFyc2V0cyhTdHJpbmcpIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQogICAgICAqIGNvbnRhaW5zIGFuIGlsbGVnYWwgc3RyaW5nLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlRlc3QgZm9yIENoYXJzZXQuaXNTdXBwb3J0ZWQiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGFyc2V0cyIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmFpbGFibGVDaGFyc2V0c19JbGxlZ2FsU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRUZXN0LmphdmEKaW5kZXggZGFmMjRhNS4uMjJkMmY4YiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0VGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CkBAIC0zMyw2ICszOCw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2hhcnNldC5jbGFzcykKIC8qKgogICogVGVzdCBjbGFzcyBqYXZhLm5pby5DaGFyc2V0LgogICovCkBAIC02MSw2ICs2NywyMSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgcmVxdWlyZWQgNiBjaGFyc2V0cyBhcmUgc3VwcG9ydGVkLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlRlc3QgaXMgT0sgZm9yIGF2YWlsYWJsZUNoYXJzZXRzLiBGb3IgZm9yTmFtZSAmIGlzU3VwcG9ydGVkIG9ubHkgZnVuY3Rpb25hbGl0eSB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwb3J0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZhaWxhYmxlQ2hhcnNldHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRDaGFyc2V0U3VwcG9ydGVkKCkgewogICAgICAgICBhc3NlcnRUcnVlKENoYXJzZXQuaXNTdXBwb3J0ZWQoIlVTLUFTQ0lJIikpOwogICAgICAgICBhc3NlcnRUcnVlKENoYXJzZXQuaXNTdXBwb3J0ZWQoIkFTQ0lJIikpOwpAQCAtOTgsNiArMTE5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgaXNTdXBwb3J0ZWQoU3RyaW5nKSB3aXRoIG51bGwuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWRfTnVsbCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENoYXJzZXQuaXNTdXBwb3J0ZWQobnVsbCk7CkBAIC0xMTEsNiArMTQxLDE1IEBACiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGlzU3VwcG9ydGVkKFN0cmluZykgd2l0aCBlbXB0eSBzdHJpbmcuCiAgICAgICogCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJjaGVjayB0ZXN0IG9uIHRhcmdldCB2bSBhbmQgZml4LCBub3cgaXQgaXMgZHVtbXkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWRfRW1wdHlTdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDaGFyc2V0LmlzU3VwcG9ydGVkKCIiKTsKQEAgLTEyNCw2ICsxNjMsMTUgQEAKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgaXNTdXBwb3J0ZWQoU3RyaW5nKSB3aXRoIGEgc3RyaW5nIHN0YXJ0aW5nIHdpdGggIi4iLgogICAgICAqIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwb3J0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkX0ludmFsaWRJbml0aWFsQ2hhcmFjdGVyKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2hhcnNldC5pc1N1cHBvcnRlZCgiLmNoYXIiKTsKQEAgLTEzNSw2ICsxODMsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBpc1N1cHBvcnRlZChTdHJpbmcpIHdpdGggaWxsZWdhbCBjaGFyc2V0IG5hbWUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2VkLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZF9JbGxlZ2FsTmFtZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENoYXJzZXQuaXNTdXBwb3J0ZWQoIiAvLy8jJCQiKTsKQEAgLTE0Nyw2ICsyMDQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBpc1N1cHBvcnRlZChTdHJpbmcpIHdpdGggbm90IHN1cHBvcnRlZCBjaGFyc2V0IG5hbWUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZF9Ob3RTdXBwb3J0ZWQoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKENoYXJzZXQuaXNTdXBwb3J0ZWQoImltcG9zc2libGUiKSk7CiAgICAgfQpAQCAtMTU0LDYgKzIyMCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGZvck5hbWUoU3RyaW5nKSB3aXRoIG51bGwuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JOYW1lX051bGwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDaGFyc2V0LmZvck5hbWUobnVsbCk7CkBAIC0xNjYsNiArMjQxLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZm9yTmFtZShTdHJpbmcpIHdpdGggZW1wdHkgc3RyaW5nLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JOYW1lIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JOYW1lX0VtcHR5U3RyaW5nKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2hhcnNldC5mb3JOYW1lKCIiKTsKQEAgLTE3OCw2ICsyNjIsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBmb3JOYW1lKFN0cmluZykgd2l0aCBhIHN0cmluZyBzdGFydGluZyB3aXRoICIuIi4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9yTmFtZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yTmFtZV9JbnZhbGlkSW5pdGlhbENoYXJhY3RlcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENoYXJzZXQuZm9yTmFtZSgiLmNoYXIiKTsKQEAgLTE5MCw2ICsyODMsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBmb3JOYW1lKFN0cmluZykgd2l0aCBpbGxlZ2FsIGNoYXJzZXQgbmFtZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9yTmFtZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yTmFtZV9JbGxlZ2FsTmFtZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENoYXJzZXQuZm9yTmFtZSgiIC8vLyMkJCIpOwpAQCAtMjAyLDYgKzMwNCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGZvck5hbWUoU3RyaW5nKSB3aXRoIG5vdCBzdXBwb3J0ZWQgY2hhcnNldCBuYW1lLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JOYW1lIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JOYW1lX05vdFN1cHBvcnRlZCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENoYXJzZXQuZm9yTmFtZSgiaW1wb3NzaWJsZSIpOwpAQCAtMjE0LDYgKzMyNSwyNCBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBub3JtYWwgcGFyYW1ldGVyIHZhbHVlcy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpc3BsYXlOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGlhc2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX05vcm1hbCgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG1vY2tOYW1lID0gIm1vY2tDaGFyMTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVouOi1fIjsKICAgICAgICAgTW9ja0NoYXJzZXQgYyA9IG5ldyBNb2NrQ2hhcnNldChtb2NrTmFtZSwgbmV3IFN0cmluZ1tdIHsgIm1vY2siIH0pOwpAQCAtMjI4LDYgKzM1NywxNSBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggZW1wdHkgY2Fub25pY2FsIG5hbWUuCiAgICAgICogCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gImNoZWNrIHRlc3Qgb24gdGFyZ2V0IHZtIGFuZCBmaXgsIG5vdyBpdCBpcyBkdW1teSIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfRW1wdHlDYW5vbmljYWxOYW1lKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IE1vY2tDaGFyc2V0KCIiLCBuZXcgU3RyaW5nWzBdKTsKQEAgLTI0Miw2ICszODAsMTUgQEAKICAgICAgKiBkaWdpdCBub3IgYSBsZXR0ZXIuCiAgICAgICogCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyc2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX0lsbGVnYWxDYW5vbmljYWxOYW1lX0luaXRpYWwoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0NoYXJzZXQoIi0xMjMiLCBuZXcgU3RyaW5nW10geyAibW9jayIgfSk7CkBAIC0yNTQsNiArNDAxLDE1IEBACiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBpbGxlZ2FsIGNhbm9uaWNhbCBuYW1lLCBpbGxlZ2FsIGNoYXJhY3RlciBpbgogICAgICAqIHRoZSBtaWRkbGUuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfSWxsZWdhbENhbm9uaWNhbE5hbWVfTWlkZGxlKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IE1vY2tDaGFyc2V0KCIxJSUyMyIsIG5ldyBTdHJpbmdbXSB7ICJtb2NrIiB9KTsKQEAgLTI3Miw2ICs0MjgsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggbnVsbCBjYW5vbmljYWwgbmFtZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9OdWxsQ2Fub25pY2FsTmFtZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE1vY2tDaGFyc2V0IGMgPSBuZXcgTW9ja0NoYXJzZXQobnVsbCwgbmV3IFN0cmluZ1tdIHsgIm1vY2siIH0pOwpAQCAtMjg0LDYgKzQ0OSwyNyBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBudWxsIGFsaWFzZXMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzcGxheU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpc3BsYXlOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWxpYXNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfTnVsbEFsaWFzZXMoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMgPSBuZXcgTW9ja0NoYXJzZXQoIm1vY2tDaGFyIiwgbnVsbCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9ja0NoYXIiLCBjLm5hbWUoKSk7CkBAIC0yOTUsNiArNDgxLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aXRoIGEgbnVsbCBhbGlhc2VzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyc2V0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nW10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX051bGxBbGlhc2UoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0NoYXJzZXQoIm1vY2tDaGFyIiwgbmV3IFN0cmluZ1tdIHsgIm1vY2siLCBudWxsIH0pOwpAQCAtMzA3LDYgKzUwMiwyNyBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RydWN0b3Igd2l0aCBubyBhbGlhc2VzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaGFyc2V0IiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nW10uY2xhc3N9CisgICAgICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgbWV0aG9kTmFtZSA9ICJuYW1lIiwKKyAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgbWV0aG9kTmFtZSA9ICJkaXNwbGF5TmFtZSIsCisgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzcGxheU5hbWUiLAorICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGlhc2VzIiwKKyAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX05vQWxpYXNlcygpIHsKICAgICAgICAgTW9ja0NoYXJzZXQgYyA9IG5ldyBNb2NrQ2hhcnNldCgibW9ja0NoYXIiLCBuZXcgU3RyaW5nWzBdKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrQ2hhciIsIGMubmFtZSgpKTsKQEAgLTMxOSw2ICs1MzUsMTUgQEAKICAgICAgKiBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aXRoIGVtcHR5IGFsaWFzZXMuCiAgICAgICogCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXQiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfRW1wdHlBbGlhc2VzKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IE1vY2tDaGFyc2V0KCJtb2NrQ2hhciIsIG5ldyBTdHJpbmdbXSB7ICIiIH0pOwpAQCAtMzMzLDYgKzU1OCwxNSBAQAogICAgICAqIG5vciBhIGxldHRlci4KICAgICAgKiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9JbGxlZ2FsQWxpYXNlc19Jbml0aWFsKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IE1vY2tDaGFyc2V0KCJtb2NrQ2hhciIsIG5ldyBTdHJpbmdbXSB7ICJtb2NrIiwgIi0xMjMiIH0pOwpAQCAtMzQ1LDYgKzU3OSwxNSBAQAogICAgICAqIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdpdGggaWxsZWdhbCBhbGlhc2UsIGlsbGVnYWwgY2hhcmFjdGVyIGluIHRoZQogICAgICAqIG1pZGRsZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9JbGxlZ2FsQWxpYXNlc19NaWRkbGUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0NoYXJzZXQoIm1vY2tDaGFyIiwgbmV3IFN0cmluZ1tdIHsgIm1vY2siLCAiMjIjI2FiIiB9KTsKQEAgLTM2NCw2ICs2MDcsMTUgQEAKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgYWxpYXNlcygpIHdpdGggbXVsdGlwbGUgYWxpYXNlcy4gTW9zdCBjb25kaXRpb25zIGhhdmUKICAgICAgKiBiZWVuIHRlc3RlZCBpbiB0aGUgdGVzdGNhc2VzIGZvciB0aGUgY29uc3RydWN0b3JzLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gImFsaWFzZXMiLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgKQorICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxpYXNlc19NdWx0aXBsZSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG1vY2tOYW1lID0gIm1vY2tDaGFyMTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVouOi1fIjsKICAgICAgICAgTW9ja0NoYXJzZXQgYyA9IG5ldyBNb2NrQ2hhcnNldCgibW9ja0NoYXIiLCBuZXcgU3RyaW5nW10geyAibW9jayIsCkBAIC0zODYsNiArNjM4LDE1IEBACiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGFsaWFzZXMoKSB3aXRoIGR1cGxpY2F0ZSBhbGlhc2VzLCBvbmUgc2FtZSB3aXRoIGl0cwogICAgICAqIGNhbm9uaWNhbCBuYW1lLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWxpYXNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGlhc2VzX0R1cGxpY2F0ZSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG1vY2tOYW1lID0gIm1vY2tDaGFyMTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVouOi1fIjsKICAgICAgICAgTW9ja0NoYXJzZXQgYyA9IG5ldyBNb2NrQ2hhcnNldCgibW9ja0NoYXIiLCBuZXcgU3RyaW5nW10geyAibW9ja0NoYXIiLApAQCAtNDAxLDYgKzY2MiwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGNhbkVuY29kZSgpLiBUZXN0IHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlKCkgewogICAgICAgICBNb2NrQ2hhcnNldCBjID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIGFzc2VydFRydWUoYy5jYW5FbmNvZGUoKSk7CkBAIC00MDksNiArNjc5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgaXNSZWdpc3RlcmVkKCkuIFRlc3QgdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVnaXN0ZXJlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlZ2lzdGVyZWQoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMgPSBuZXcgTW9ja0NoYXJzZXQoIm1vY2siLCBudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShjLmlzUmVnaXN0ZXJlZCgpKTsKQEAgLTQxNyw2ICs2OTYsMTUgQEAKICAgICAvKgogICAgICAqIFRoZSBuYW1lKCkgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBieSB0aGUgdGVzdGNhc2VzIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGVtcHR5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgewogICAgICAgICAvLyBhbHJlYWR5IGNvdmVyZWQgYnkgdGVzdENvbnN0cnVjdG9yX1hYWCBzZXJpZXMKICAgICB9CkBAIC00MjUsNiArNzEzLDE1IEBACiAgICAgICogVGhlIGRpc3BsYXlOYW1lKCkgbWV0aG9kIGhhdmUgYmVlbiB0ZXN0ZWQgYnkgdGhlIHRlc3RjYXNlcyBmb3IgdGhlCiAgICAgICogY29uc3RydWN0b3IuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGVtcHR5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzcGxheU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcGxheU5hbWUoKSB7CiAgICAgICAgIC8vIGFscmVhZHkgY292ZXJlZCBieSB0ZXN0Q29uc3RydWN0b3JfWFhYIHNlcmllcwogICAgIH0KQEAgLTQzMiw2ICs3MjksMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgZGlzcGxheU5hbWUoTG9jYWxlKSB3aXRoIG51bGwuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlzcGxheU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpc3BsYXlOYW1lX0xvY2FsZV9OdWxsKCkgewogICAgICAgICBNb2NrQ2hhcnNldCBjID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9jayIsIGMuZGlzcGxheU5hbWUobnVsbCkpOwpAQCAtNDQwLDYgKzc0NiwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGNvbXBhcmVUbyhPYmplY3QpIHdpdGggbm9ybWFsIGNvbmRpdGlvbnMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvX05vcm1hbCgpIHsKICAgICAgICAgTW9ja0NoYXJzZXQgYzEgPSBuZXcgTW9ja0NoYXJzZXQoIm1vY2siLCBudWxsKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGMxLmNvbXBhcmVUbyhjMSkpOwpAQCAtNDc1LDYgKzc5MCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGNvbXBhcmVUbyhPYmplY3QpIHdpdGggbnVsbCBwYXJhbS4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmVUbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvX051bGwoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMxID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIHRyeSB7CkBAIC00ODgsNiArODEyLDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgY29tcGFyZVRvKE9iamVjdCkgd2l0aCBhbm90aGVyIGtpbmQgb2YgY2hhcnNldCBvYmplY3QuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvX0RpZmZDaGFyc2V0Q2xhc3MoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMxID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIE1vY2tDaGFyc2V0MiBjMiA9IG5ldyBNb2NrQ2hhcnNldDIoIk1vY2siLCBuZXcgU3RyaW5nW10geyAibXluYW1lIiB9KTsKQEAgLTQ5OCw2ICs4MzEsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBlcXVhbHMoT2JqZWN0KSB3aXRoIG51bGwgcGFyYW0uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19Ob3JtYWwoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMxID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIE1vY2tDaGFyc2V0MiBjMiA9IG5ldyBNb2NrQ2hhcnNldDIoIm1vY2siLCBudWxsKTsKQEAgLTUxMiw2ICs4NTQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBlcXVhbHMoT2JqZWN0KSB3aXRoIG5vcm1hbCBjb25kaXRpb25zLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19OdWxsKCkgewogICAgICAgICBNb2NrQ2hhcnNldCBjMSA9IG5ldyBNb2NrQ2hhcnNldCgibW9jayIsIG51bGwpOwogICAgICAgICBhc3NlcnRGYWxzZShjMS5lcXVhbHMobnVsbCkpOwpAQCAtNTIwLDYgKzg3MSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGVxdWFscyhPYmplY3QpIHdpdGggYW5vdGhlciBraW5kIG9mIGNoYXJzZXQgb2JqZWN0LgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19Ob25DaGFyc2V0T2JqZWN0KCkgewogICAgICAgICBNb2NrQ2hhcnNldCBjMSA9IG5ldyBNb2NrQ2hhcnNldCgibW9jayIsIG51bGwpOwogICAgICAgICBhc3NlcnRGYWxzZShjMS5lcXVhbHMoInRlc3QiKSk7CkBAIC01MjgsNiArODg4LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZXF1YWxzKE9iamVjdCkgd2l0aCBhbm90aGVyIGtpbmQgb2YgY2hhcnNldCBvYmplY3QuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzX0RpZmZDaGFyc2V0Q2xhc3MoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMxID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIE1vY2tDaGFyc2V0MiBjMiA9IG5ldyBNb2NrQ2hhcnNldDIoIm1vY2siLCBudWxsKTsKQEAgLTUzOCw2ICs5MDcsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBoYXNoQ29kZSgpLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlX0RpZmZDaGFyc2V0Q2xhc3MoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMxID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhjMS5oYXNoQ29kZSgpLCAibW9jayIuaGFzaENvZGUoKSk7CkBAIC01NTEsNiArOTI5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZW5jb2RlKENoYXJCdWZmZXIpIHVuZGVyIG5vcm1hbCBjb25kaXRpb24uCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZV9DaGFyQnVmZmVyX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrQ2hhcnNldCBjMSA9IG5ldyBNb2NrQ2hhcnNldCgidGVzdEVuY29kZV9DaGFyQnVmZmVyX05vcm1hbF9tb2NrIiwgbnVsbCk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBjMS5lbmNvZGUoQ2hhckJ1ZmZlci53cmFwKCJhYmNkZWZnIikpOwpAQCAtNTYyLDYgKzk0OSwxOCBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGVuY29kZShDaGFyQnVmZmVyKSB3aXRoIGFuIHVubWFwcGFibGUgY2hhci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdFbmNvZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVfQ2hhckJ1ZmZlcl9Vbm1hcHBhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENoYXJzZXQgYzEgPSBDaGFyc2V0LmZvck5hbWUoImlzbzg4NTktMSIpOwogICAgICAgICBCeXRlQnVmZmVyIGJiID0gYzEuZW5jb2RlKENoYXJCdWZmZXIud3JhcCgiYWJjZFx1NUQxNGVmZyIpKTsKQEAgLTU3Myw2ICs5NzIsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBlbmNvZGUoQ2hhckJ1ZmZlcikgd2l0aCBudWxsIENoYXJCdWZmZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlX0NoYXJCdWZmZXJfTnVsbENoYXJCdWZmZXIoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMgPSBuZXcgTW9ja0NoYXJzZXQoIm1vY2siLCBudWxsKTsKICAgICAgICAgdHJ5IHsKQEAgLTU4Niw2ICs5OTQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBlbmNvZGUoQ2hhckJ1ZmZlcikgd2l0aCBudWxsIGVuY29kZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlX0NoYXJCdWZmZXJfTnVsbEVuY29kZXIoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0MiBjID0gbmV3IE1vY2tDaGFyc2V0MigibW9jazIiLCBudWxsKTsKICAgICAgICAgdHJ5IHsKQEAgLTU5OSw2ICsxMDE2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZW5jb2RlKFN0cmluZykgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbi4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVfU3RyaW5nX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrQ2hhcnNldCBjMSA9IG5ldyBNb2NrQ2hhcnNldCgidGVzdEVuY29kZV9TdHJpbmdfTm9ybWFsX21vY2siLCBudWxsKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IGMxLmVuY29kZSgiYWJjZGVmZyIpOwpAQCAtNjEwLDYgKzEwMzYsMTggQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBlbmNvZGUoU3RyaW5nKSB3aXRoIGFuIHVubWFwcGFibGUgY2hhci4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzfQorICAgICAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3RW5jb2RlciIsCisgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVfU3RyaW5nX1VubWFwcGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2hhcnNldCBjMSA9IENoYXJzZXQuZm9yTmFtZSgiaXNvODg1OS0xIik7CiAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBjMS5lbmNvZGUoImFiY2RcdTVEMTRlZmciKTsKQEAgLTYyMSw2ICsxMDU5LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZW5jb2RlKFN0cmluZykgd2l0aCBudWxsIENoYXJCdWZmZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQ2hhckJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlX1N0cmluZ19OdWxsU3RyaW5nKCkgewogICAgICAgICBNb2NrQ2hhcnNldCBjID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIHRyeSB7CkBAIC02MzQsNiArMTA4MSwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIGVuY29kZShTdHJpbmcpIHdpdGggbnVsbCBlbmNvZGVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkNoYXJCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZV9TdHJpbmdfTnVsbEVuY29kZXIoKSB7CiAKICAgICAgICAgTW9ja0NoYXJzZXQyIGMgPSBuZXcgTW9ja0NoYXJzZXQyKCJtb2NrMiIsIG51bGwpOwpAQCAtNjQ4LDYgKzExMDQsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBkZWNvZGUoQnl0ZUJ1ZmZlcikgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbi4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlX05vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrQ2hhcnNldCBjMSA9IG5ldyBNb2NrQ2hhcnNldCgibW9jayIsIG51bGwpOwogICAgICAgICBDaGFyQnVmZmVyIGNiID0gYzEuZGVjb2RlKEJ5dGVCdWZmZXIud3JhcCgiYWJjZGVmZyIKQEAgLTY2MCw2ICsxMTI1LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZGVjb2RlKEJ5dGVCdWZmZXIpIHdpdGggYSBtYWxmb3JtZWQgaW5wdXQuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVfTWFsZm9ybWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENoYXJzZXQgYzEgPSBDaGFyc2V0LmZvck5hbWUoImlzbzg4NTktMSIpOwogICAgICAgICBDaGFyQnVmZmVyIGNiID0gYzEuZGVjb2RlKEJ5dGVCdWZmZXIud3JhcCgiYWJjZFx1NUQxNGVmZyIKQEAgLTY3Miw2ICsxMTQ2LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBtZXRob2QgZGVjb2RlKEJ5dGVCdWZmZXIpIHdpdGggbnVsbCBDaGFyQnVmZmVyLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZV9OdWxsQnl0ZUJ1ZmZlcigpIHsKICAgICAgICAgTW9ja0NoYXJzZXQgYyA9IG5ldyBNb2NrQ2hhcnNldCgibW9jayIsIG51bGwpOwogICAgICAgICB0cnkgewpAQCAtNjg1LDYgKzExNjgsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCBkZWNvZGUoQnl0ZUJ1ZmZlcikgd2l0aCBudWxsIGVuY29kZXIuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlX051bGxEZWNvZGVyKCkgewogICAgICAgICBNb2NrQ2hhcnNldDIgYyA9IG5ldyBNb2NrQ2hhcnNldDIoIm1vY2syIiwgbnVsbCk7CiAgICAgICAgIHRyeSB7CkBAIC02OTgsNiArMTE5MCwxNSBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgbWV0aG9kIHRvU3RyaW5nKCkuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIE1vY2tDaGFyc2V0IGMxID0gbmV3IE1vY2tDaGFyc2V0KCJtb2NrIiwgbnVsbCk7CiAgICAgICAgIGFzc2VydFRydWUoLTEgIT0gYzEudG9TdHJpbmcoKS5pbmRleE9mKCJtb2NrIikpOwpAQCAtNzA2LDcgKzEyMDcsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0I2F2YWlsYWJsZUNoYXJzZXRzKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2F2YWlsYWJsZUNoYXJzZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZhaWxhYmxlQ2hhcnNldHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9hdmFpbGFibGVDaGFyc2V0cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMTA1MQogICAgICAgICBDbGFzc0xvYWRlciBvcmlnaW5hbENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKQogICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKQEAgLTcyMyw3ICsxMjMzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCNhdmFpbGFibGVDaGFyc2V0cygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9mb3JOYW1lTFN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9yTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9mb3JOYW1lTFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhhcm1vbnktMTA1MQogICAgICAgICBDbGFzc0xvYWRlciBvcmlnaW5hbENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKQogICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ29kZXJSZXN1bHRUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NvZGVyUmVzdWx0VGVzdC5qYXZhCmluZGV4IGQzNjJhNTcuLjFiNGE5MmQgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ29kZXJSZXN1bHRUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9Db2RlclJlc3VsdFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0OwpAQCAtMjMsNyArMjgsNyBAQAogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhDb2RlclJlc3VsdC5jbGFzcykKIC8qKgogICogVGVzdCBjbGFzcyBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0LgogICovCkBAIC00Niw2ICs1MSwzNiBAQAogICAgIC8qCiAgICAgICogVGVzdCB0aGUgY29uc3RhbnQgT1ZFUkZMT1cgYW5kIFVOREVSRkxPVy4KICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0Vycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01hbGZvcm1lZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNPdmVyZmxvdyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNVbmRlcmZsb3ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVW5tYXBwYWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0aHJvd0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RhbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdFNhbWUoQ29kZXJSZXN1bHQuT1ZFUkZMT1csIENvZGVyUmVzdWx0LlVOREVSRkxPVyk7CiAKQEAgLTk0LDYgKzEyOSwyMSBAQAogICAgICAqIFRlc3QgbWV0aG9kIGlzRXJyb3IoKS4KICAgICAgKiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0Vycm9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYWxmb3JtZWRGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVubWFwcGFibGVGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFcnJvcigpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoQ29kZXJSZXN1bHQuVU5ERVJGTE9XLmlzRXJyb3IoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKENvZGVyUmVzdWx0Lk9WRVJGTE9XLmlzRXJyb3IoKSk7CkBAIC0xMDUsNiArMTU1LDIxIEBACiAgICAgICogVGVzdCBtZXRob2QgaXNNYWxmb3JtZWQoKS4KICAgICAgKiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzTWFsZm9ybWVkIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYWxmb3JtZWRGb3JMZW5ndGgiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICksICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1hcHBhYmxlRm9yTGVuZ3RoIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzTWFsZm9ybWVkKCkgewogICAgICAgICBhc3NlcnRGYWxzZShDb2RlclJlc3VsdC5VTkRFUkZMT1cuaXNNYWxmb3JtZWQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKENvZGVyUmVzdWx0Lk9WRVJGTE9XLmlzTWFsZm9ybWVkKCkpOwpAQCAtMTE2LDYgKzE4MSwyMSBAQAogICAgICAqIFRlc3QgbWV0aG9kIGlzTWFsZm9ybWVkKCkuCiAgICAgICogCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1VubWFwcGFibGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIm1hbGZvcm1lZEZvckxlbmd0aCIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgKSwgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gInVubWFwcGFibGVGb3JMZW5ndGgiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNVbm1hcHBhYmxlKCkgewogICAgICAgICBhc3NlcnRGYWxzZShDb2RlclJlc3VsdC5VTkRFUkZMT1cuaXNVbm1hcHBhYmxlKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShDb2RlclJlc3VsdC5PVkVSRkxPVy5pc1VubWFwcGFibGUoKSk7CkBAIC0xMjcsNiArMjA3LDIxIEBACiAgICAgICogVGVzdCBtZXRob2QgaXNPdmVyZmxvdygpLgogICAgICAqIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzT3ZlcmZsb3ciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1hbGZvcm1lZEZvckxlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVubWFwcGFibGVGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNPdmVyZmxvdygpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoQ29kZXJSZXN1bHQuVU5ERVJGTE9XLmlzT3ZlcmZsb3coKSk7CiAgICAgICAgIGFzc2VydFRydWUoQ29kZXJSZXN1bHQuT1ZFUkZMT1cuaXNPdmVyZmxvdygpKTsKQEAgLTEzOCw2ICsyMzMsMjEgQEAKICAgICAgKiBUZXN0IG1ldGhvZCBpc1VuZGVyZmxvdygpLgogICAgICAqIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVW5kZXJmbG93IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYWxmb3JtZWRGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLCAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1hcHBhYmxlRm9yTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzVW5kZXJmbG93KCkgewogICAgICAgICBhc3NlcnRUcnVlKENvZGVyUmVzdWx0LlVOREVSRkxPVy5pc1VuZGVyZmxvdygpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoQ29kZXJSZXN1bHQuT1ZFUkZMT1cuaXNVbmRlcmZsb3coKSk7CkBAIC0xNDksNiArMjU5LDIxIEBACiAgICAgICogVGVzdCBtZXRob2QgbGVuZ3RoKCkuCiAgICAgICogCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYWxmb3JtZWRGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLCAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1hcHBhYmxlRm9yTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExlbmd0aCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENvZGVyUmVzdWx0LlVOREVSRkxPVy5sZW5ndGgoKTsKQEAgLTE3MSw2ICsyOTYsMTUgQEAKICAgICAgKiBUZXN0IG1ldGhvZCBtYWxmb3JtZWRGb3JMZW5ndGgoaW50KS4KICAgICAgKiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYWxmb3JtZWRGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFsZm9ybWVkRm9yTGVuZ3RoKCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKENvZGVyUmVzdWx0Lm1hbGZvcm1lZEZvckxlbmd0aChJbnRlZ2VyLk1BWF9WQUxVRSkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKENvZGVyUmVzdWx0Lm1hbGZvcm1lZEZvckxlbmd0aCgxKSk7CkBAIC0xOTgsNiArMzMyLDE1IEBACiAgICAgICogVGVzdCBtZXRob2QgdW5tYXBwYWJsZUZvckxlbmd0aChpbnQpLgogICAgICAqIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVubWFwcGFibGVGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5tYXBwYWJsZUZvckxlbmd0aCgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChDb2RlclJlc3VsdC51bm1hcHBhYmxlRm9yTGVuZ3RoKEludGVnZXIuTUFYX1ZBTFVFKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoQ29kZXJSZXN1bHQudW5tYXBwYWJsZUZvckxlbmd0aCgxKSk7CkBAIC0yMjMsNiArMzY2LDIxIEBACiAgICAgICogVGVzdCBtZXRob2QgdGhyb3dFeGNlcHRpb24oKS4KICAgICAgKiAKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0aHJvd0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWFsZm9ybWVkRm9yTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKSwgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW5tYXBwYWJsZUZvckxlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ29kZXJSZXN1bHQuT1ZFUkZMT1cudGhyb3dFeGNlcHRpb24oKTsKQEAgLTI1NCw2ICs0MTIsMjEgQEAKICAgICAgKiBUZXN0IG1ldGhvZCB0b1N0cmluZygpLgogICAgICAqIAogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYWxmb3JtZWRGb3JMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLCAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1bm1hcHBhYmxlRm9yTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoQ29kZXJSZXN1bHQuT1ZFUkZMT1cudG9TdHJpbmcoKS5pbmRleE9mKCJPVkVSRkxPVyIpICE9IC0xKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2RlclJlc3VsdC5VTkRFUkZMT1cudG9TdHJpbmcoKS5pbmRleE9mKCJVTkRFUkZMT1ciKSAhPSAtMSk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NvZGluZ0Vycm9yQWN0aW9uVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9Db2RpbmdFcnJvckFjdGlvblRlc3QuamF2YQppbmRleCAxZTIzYWVmLi41ODQ3ZmQxIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NvZGluZ0Vycm9yQWN0aW9uVGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvQ29kaW5nRXJyb3JBY3Rpb25UZXN0LmphdmEKQEAgLTE2LDEwICsxNiwxNSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhDb2RpbmdFcnJvckFjdGlvbi5jbGFzcykKIC8qKgogICogVGVzdCBjbGFzcyBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uCiAgKi8KQEAgLTQyLDYgKzQ3LDE1IEBACiAgICAgLyoKICAgICAgKiBUZXN0IHRoZSBjb25zdGFudHMuCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZnkgY29uc3RhbnQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElHTk9SRSgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChDb2RpbmdFcnJvckFjdGlvbi5JR05PUkUpOwogICAgICAgICBhc3NlcnROb3ROdWxsKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwpAQCAtNTQsNiArNjgsMTUgQEAKICAgICAvKgogICAgICAqIFRlc3QgdGhlIG1ldGhvZCB0b1N0cmluZygpLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZ5IGNvbnN0YW50IiwKKyAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2RpbmdFcnJvckFjdGlvbi5JR05PUkUudG9TdHJpbmcoKS5pbmRleE9mKCJJR05PUkUiKSAhPSAtMSk7CiAgICAgICAgIGFzc2VydFRydWUoQ29kaW5nRXJyb3JBY3Rpb24uUkVQTEFDRS50b1N0cmluZygpLmluZGV4T2YoIlJFUExBQ0UiKSAhPSAtMSk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0dCQ2hhcnNldERlY29kZXJUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0dCQ2hhcnNldERlY29kZXJUZXN0LmphdmEKaW5kZXggODU1ZTg1Yi4uNjNmNTM5OCAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9HQkNoYXJzZXREZWNvZGVyVGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvR0JDaGFyc2V0RGVjb2RlclRlc3QuamF2YQpAQCAtMTYsMTAgKzE2LDEzIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2Rlci5jbGFzcykKIC8qKgogICogdGVzdCBnYjE4MDMwIGRlY29kZXIKICAqLwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9HQkNoYXJzZXRFbmNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9HQkNoYXJzZXRFbmNvZGVyVGVzdC5qYXZhCmluZGV4IDY4OTBiMGMuLjRlMzA5OTcgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvR0JDaGFyc2V0RW5jb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0dCQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKQEAgLTE2LDEwICsxNiwxNiBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2Rlci5jbGFzcykKIC8qKgogICogdGVzdCBjYXNlIHNwZWNpZmljIGFjdGl2aXR5IG9mIGdiMTgwMzAgY2hhcnNldCBlbmNvZGVyCiAgKi8KQEAgLTQzLDYgKzQ5LDE1IEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlY2hhcigpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgdXRmQ1MKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgnXHUwMDc3JykpOwpAQCAtNTUsNiArNzAsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJvb2xlYW4gY2FuRW5jb2RlKENoYXJTZXF1ZW5jZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5FbmNvZGVDaGFyU2VxdWVuY2UoKSB7CiAgICAgICAgIGFzc2VydFRydWUoZW5jb2Rlci5jYW5FbmNvZGUoIiIpKTsKICAgICAgICAgLy8gc3Vycm9nYXRlIGNoYXIKQEAgLTY2LDYgKzkwLDE4IEBACiAgICAgICAgIGFzc2VydEZhbHNlKGVuY29kZXIuY2FuRW5jb2RlKCJcdWQ4MDAiKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXZlcmFnZUJ5dGVzUGVyQ2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF4Qnl0ZXNQZXJDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNwZWNpZmljRGVmYXVsdFZhbHVlKCkgewogICAgICAgICAvLyBGSVhNRTogZGlmZmVyZW50IGhlcmUhCiAgICAgICAgIGFzc2VydEVxdWFscyg0LjAsIGVuY29kZXIubWF4Qnl0ZXNQZXJDaGFyKCksIDAuMCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0lTT0NoYXJzZXREZWNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9JU09DaGFyc2V0RGVjb2RlclRlc3QuamF2YQppbmRleCBmMTEwNGNkLi5lZmIyNTM5IDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0lTT0NoYXJzZXREZWNvZGVyVGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvSVNPQ2hhcnNldERlY29kZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKQEAgLTIzLDYgKzI1LDcgQEAKIC8qKgogICogdGVzdCBJU08tODg1OS0xIGRlY29kZXIKICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIElTT0NoYXJzZXREZWNvZGVyVGVzdCBleHRlbmRzIENoYXJzZXREZWNvZGVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9JU09DaGFyc2V0RW5jb2RlclRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvSVNPQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKaW5kZXggZWEyNTkyOS4uYWY3NjRjNSAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9JU09DaGFyc2V0RW5jb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0lTT0NoYXJzZXRFbmNvZGVyVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwpAQCAtMjYsNiArMzEsNyBAQAogLyoqCiAgKiB0ZXN0IGNhc2Ugc3BlY2lmaWMgYWN0aXZpdHkgb2YgaXNvLTg4NTktMSBjaGFyc2V0IGVuY29kZXIKICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIElTT0NoYXJzZXRFbmNvZGVyVGVzdCBleHRlbmRzIENoYXJzZXRFbmNvZGVyVGVzdCB7CiAKICAgICAvLyBjaGFyc2V0IGZvciBpc28tODg1OS0xCkBAIC00Niw2ICs1MiwxNSBAQAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZUNoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgLy8gbm9ybWFsIGNhc2UgZm9yIGlzb0NTCiAgICAgICAgIGFzc2VydFRydWUoZW5jb2Rlci5jYW5FbmNvZGUoIlx1MDA3NyIpKTsKQEAgLTU4LDE2ICs3Myw0OSBAQAogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCIiKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5FbmNvZGVJQ1VCdWcoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKGVuY29kZXIuY2FuRW5jb2RlKChjaGFyKSAnXHVkODAwJykpOwogICAgICAgICBhc3NlcnRGYWxzZShlbmNvZGVyLmNhbkVuY29kZSgoU3RyaW5nKSAiXHVkODAwIikpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZWNoYXIoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgnXHUwMDc3JykpOwogICAgICAgICBhc3NlcnRGYWxzZShlbmNvZGVyLmNhbkVuY29kZSgnXHVjMmEzJykpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImF2ZXJhZ2VCeXRlc1BlckNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1heEJ5dGVzUGVyQ2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpY0RlZmF1bHRWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuY29kZXIuYXZlcmFnZUJ5dGVzUGVyQ2hhcigpLCAwLjAwMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBlbmNvZGVyLm1heEJ5dGVzUGVyQ2hhcigpLCAwLjAwMSk7CkBAIC04OSw2ICsxMzcsMjEgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGFsc286IGZsdXNoICYgZW5jb2RlLCBidXQgbm90IGNvdmVycyBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9uTWFsZm9ybWVkSW5wdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvblVubWFwcGFibGVDaGFyYWN0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVN0ZXBFbmNvZGUoKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKICAgICAgICAgZW5jb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7CiAgICAgICAgIGVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0lTT0NoYXJzZXRUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L0lTT0NoYXJzZXRUZXN0LmphdmEKaW5kZXggNWMwMTBiMi4uNTYyYWRjMyAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9JU09DaGFyc2V0VGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvSVNPQ2hhcnNldFRlc3QuamF2YQpAQCAtMTYsOSArMTYsMTUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogLyoqCiAgKiBUZXN0IElTTy04ODU5LTEuCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzKQogcHVibGljIGNsYXNzIElTT0NoYXJzZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RDaGFyc2V0VGVzdENhc2UgewogCiAgICAgLyoqCkBAIC0zNiw2ICs0MiwxNSBAQAogICAgICAqIAogICAgICAqIEBzZWUgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQuQ29uY3JldGVDaGFyc2V0VGVzdCN0ZXN0RW5jb2RlX05vcm1hbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QsIHRleHQgc291cmNlOiBBYnN0cmFjdENoYXJzZXRUZXN0Q2FzZS5pbnRlcm5hbFRlc3RFbmNvZGUuIEV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlX05vcm1hbCgpIHsKICAgICAgICAgU3RyaW5nIGlucHV0ID0gImFiXHU1RDE0XHU2NTRGIjsKICAgICAgICAgYnl0ZVtdIG91dHB1dCA9IG5ldyBieXRlW10geyA5NywgOTgsCkBAIC00OSw2ICs2NCwxNSBAQAogICAgICAqIAogICAgICAqIEBzZWUgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQuQ29uY3JldGVDaGFyc2V0VGVzdCN0ZXN0RGVjb2RlX05vcm1hbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QsIHRleHQgc291cmNlOiBBYnN0cmFjdENoYXJzZXRUZXN0Q2FzZS5pbnRlcm5hbFRlc3REZWNvZGUuIEV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlX05vcm1hbCgpIHsKICAgICAgICAgYnl0ZVtdIGlucHV0ID0gbmV3IGJ5dGVbXSB7IDk3LCA5OCwgNjMsIDYzIH07CiAgICAgICAgIGNoYXJbXSBvdXRwdXQgPSAiYWI/PyIudG9DaGFyQXJyYXkoKTsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGMTZCRUNoYXJzZXREZWNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkJFQ2hhcnNldERlY29kZXJUZXN0LmphdmEKaW5kZXggOWUyYjY2ZC4uMGE0M2U0MiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkJFQ2hhcnNldERlY29kZXJUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkJFQ2hhcnNldERlY29kZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKQEAgLTIzLDYgKzI1LDggQEAKIC8qKgogICogCiAgKi8KKworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIFVURjE2QkVDaGFyc2V0RGVjb2RlclRlc3QgZXh0ZW5kcyBDaGFyc2V0RGVjb2RlclRlc3QgewogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGMTZCRUNoYXJzZXRFbmNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkJFQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKaW5kZXggMTk0YjNiMy4uNGYwNWM0NiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkJFQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkJFQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKQEAgLTIzLDYgKzI4LDcgQEAKIC8qKgogICogVE9ETyB0eXBlIGRlZgogICovCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgVVRGMTZCRUNoYXJzZXRFbmNvZGVyVGVzdCBleHRlbmRzIENoYXJzZXRFbmNvZGVyVGVzdCB7CiAKICAgICAvLyBjaGFyc2V0IGZvciB1dGYtMTZiZQpAQCAtNTAsMTAgKzU2LDI4IEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNoYXJzZXRFbmNvZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLmNoYXJzZXQuQ2hhcnNldC5jbGFzcywgZmxvYXQuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldEVuY29kZXJDaGFyc2V0ZmxvYXRmbG9hdCgpIHsKICAgICAgICAgLy8gdGhpcyBjb25zdHJ1Y3RvciBpcyBpbnZhbGlkIGZvciBVVEYxNkxFIENoYXJzZXRFbmNvZGVyCiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlY2hhcigpIHRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgdXRmQ1MKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgnXHUwMDc3JykpOwpAQCAtNjQsNiArODgsMTUgQEAKIAogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZUNoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgLy8gbm9ybWFsIGNhc2UgZm9yIHV0ZkNTCiAgICAgICAgIGFzc2VydFRydWUoZW5jb2Rlci5jYW5FbmNvZGUoIlx1MDA3NyIpKTsKQEAgLTgyLDEwICsxMTUsMjggQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoZW5jb2Rlci5jYW5FbmNvZGUoIlx1ZDgwMFx1ZGIwMCIpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZUlDVUJ1ZygpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoZW5jb2Rlci5jYW5FbmNvZGUoIlx1ZDgwMCIpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXhCeXRlc1BlckNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWNEZWZhdWx0VmFsdWUoKSB7CiAgICAgICAgIC8vID8/PyBUT0RPIE5JTyBhZGFwdCB0byB0aGUgYWN0dWFsbHkgdXNlZCBVVEYxNkJFIGNoYXJzZXQgRW5jb2RlcgogICAgICAgICAvLyBhc3NlcnRFcXVhbHMoMiwgZW5jb2Rlci5hdmVyYWdlQnl0ZXNQZXJDaGFyKCksIDAuMDAxKTsKQEAgLTEwNCw2ICsxNTUsMTUgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMZWdhbFJlcGxhY2VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzTGVnYWxSZXBsYWNlbWVudEVtcHR5QXJyYXkoKSB7CiAgICAgICAgIGFzc2VydFRydWUoZW5jb2Rlci5pc0xlZ2FsUmVwbGFjZW1lbnQobmV3IGJ5dGVbMF0pKTsKICAgICB9CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2QkVDaGFyc2V0VGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkJFQ2hhcnNldFRlc3QuamF2YQppbmRleCA3NTRhZmEzLi4zNTNhMDhiIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2QkVDaGFyc2V0VGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGMTZCRUNoYXJzZXRUZXN0LmphdmEKQEAgLTE2LDkgKzE2LDE1IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIC8qKgogICogVGVzdCBVVEYtMTZCRS4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgVVRGMTZCRUNoYXJzZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RDaGFyc2V0VGVzdENhc2UgewogCiAgICAgLyoqCkBAIC0zNCw2ICs0MCwxNSBAQAogICAgICAqIAogICAgICAqIEBzZWUgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQuQ29uY3JldGVDaGFyc2V0VGVzdCN0ZXN0RW5jb2RlX05vcm1hbCgpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsIHRlc3QsIHRleHQgc291cmNlOiBBYnN0cmFjdENoYXJzZXRUZXN0Q2FzZS5pbnRlcm5hbFRlc3RFbmNvZGUuIEV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlX05vcm1hbCgpIHsKICAgICAgICAgU3RyaW5nIGlucHV0ID0gImFiXHU1RDE0XHU2NTRGIjsKICAgICAgICAgYnl0ZVtdIG91dHB1dCA9IG5ldyBieXRlW10geyAwLCA5NywgMCwgOTgsIDkzLCAyMCwgMTAxLCA3OSB9OwpAQCAtNDUsNiArNjAsMTUgQEAKICAgICAgKiAKICAgICAgKiBAc2VlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0LkNvbmNyZXRlQ2hhcnNldFRlc3QjdGVzdERlY29kZV9Ob3JtYWwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0LCB0ZXh0IHNvdXJjZTogQWJzdHJhY3RDaGFyc2V0VGVzdENhc2UuaW50ZXJuYWxUZXN0RGVjb2RlLiBFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZV9Ob3JtYWwoKSB7CiAgICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW10geyAwLCA5NywgMCwgOTgsIDkzLCAyMCwgMTAxLCA3OSB9OwogICAgICAgICBjaGFyW10gb3V0cHV0ID0gImFiXHU1RDE0XHU2NTRGIi50b0NoYXJBcnJheSgpOwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkNoYXJzZXREZWNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkNoYXJzZXREZWNvZGVyVGVzdC5qYXZhCmluZGV4IGZhMWQ1ZWMuLjE3ZmJmYzUgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGMTZDaGFyc2V0RGVjb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2Q2hhcnNldERlY29kZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwpAQCAtMjcsNiArMzIsNyBAQAogLyoqCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIFVURjE2Q2hhcnNldERlY29kZXJUZXN0IGV4dGVuZHMgQ2hhcnNldERlY29kZXJUZXN0IHsKIAogICAgIGJvb2xlYW4gYmlnRW5kaWFuID0gdHJ1ZTsKQEAgLTY4LDYgKzc0LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLm5pby5DaGFyQnVmZmVyLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlTdGVwRGVjb2RlKCkgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghY3MubmFtZSgpLmVxdWFscygibW9jayIpKSB7CiAgICAgICAgICAgICBkZWNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKQEAgLTExMiw2ICsxMjcsMTggQEAKICAgICAgICAgfQogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW1wbGVtZW50YXRpb24gaW4gQ2hhcnNldERlY29kZXJUZXN0LmltcGxUZXN0RGVjb2RlQnl0ZUJ1ZmZlckNoYXJCdWZmZXJib29sZWFuICYgQ2hhcnNldERlY29kZXJUZXN0LmltcGxUZXN0RGVjb2RlQnl0ZUJ1ZmZlci4gRXhjZXB0aW9ucyBjaGVjaGluZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubmlvLkJ5dGVCdWZmZXIuY2xhc3MsIGphdmEubmlvLkNoYXJCdWZmZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMaXR0bGVFbmRpYW4oKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uLAogICAgICAgICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIGJpZ0VuZGlhbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkNoYXJzZXRFbmNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkNoYXJzZXRFbmNvZGVyVGVzdC5qYXZhCmluZGV4IGJkYzUwNWQuLmUwYjRiN2QgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGMTZDaGFyc2V0RW5jb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2Q2hhcnNldEVuY29kZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247CkBAIC0yNSw2ICszMCw3IEBACiAvKioKICAqIFRPRE8gdHlwZSBkZWYKICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIFVURjE2Q2hhcnNldEVuY29kZXJUZXN0IGV4dGVuZHMgQ2hhcnNldEVuY29kZXJUZXN0IHsKIAogICAgIC8vIGNoYXJzZXQgZm9yIHV0Zi0xNgpAQCAtNTQsMTAgKzYwLDI4IEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGVtcHR5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldEVuY29kZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzLCBmbG9hdC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyc2V0RW5jb2RlckNoYXJzZXRmbG9hdGZsb2F0KCkgewogICAgICAgICAvLyB0aGlzIGNvbnN0cnVjdG9yIGlzIGludmFsaWQgZm9yIFVURjE2TEUgQ2hhcnNldEVuY29kZXIKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5FbmNvZGVjaGFyKCkgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIG5vcm1hbCBjYXNlIGZvciB1dGZDUwogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdTAwNzcnKSk7CkBAIC02Nyw2ICs5MSwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdWMyYzAnKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlQ2hhclNlcXVlbmNlKCkgewogICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgdXRmQ1MKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgiXHUwMDc3IikpOwpAQCAtODUsMTEgKzExOCwzNSBAQAogICAgICAgICBhc3NlcnRGYWxzZShlbmNvZGVyLmNhbkVuY29kZSgiXHVkODAwXHVkYjAwIikpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZUlDVUJ1ZygpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoZW5jb2Rlci5jYW5FbmNvZGUoJ1x1ZDgwMCcpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZW5jb2Rlci5jYW5FbmNvZGUoIlx1ZDgwMCIpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdmVyYWdlQnl0ZXNQZXJDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXhCeXRlc1BlckNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWNEZWZhdWx0VmFsdWUoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhlbmNvZGVyLmF2ZXJhZ2VCeXRlc1BlckNoYXIoKSwgMiwgMC4wMDEpOwogICAgICAgICAvLyBhc3NlcnRFcXVhbHMoNCwgZW5jb2Rlci5tYXhCeXRlc1BlckNoYXIoKSk7CkBAIC0xMDksNiArMTY2LDE1IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzTGVnYWxSZXBsYWNlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0xlZ2FsUmVwbGFjZW1lbnRFbXB0eUFycmF5KCkgewogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuaXNMZWdhbFJlcGxhY2VtZW50KG5ldyBieXRlWzBdKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkNoYXJzZXRUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2Q2hhcnNldFRlc3QuamF2YQppbmRleCBlNzdiZTVlLi43MjVlNDNhIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2Q2hhcnNldFRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2Q2hhcnNldFRlc3QuamF2YQpAQCAtMTYsOSArMTYsMTUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogLyoqCiAgKiBUZXN0IFVURi0xNi4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgVVRGMTZDaGFyc2V0VGVzdCBleHRlbmRzIEFic3RyYWN0Q2hhcnNldFRlc3RDYXNlIHsKIAogICAgIC8qKgpAQCAtMzMsNiArMzksMTUgQEAKICAgICAgKiAKICAgICAgKiBAc2VlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0LkNvbmNyZXRlQ2hhcnNldFRlc3QjdGVzdEVuY29kZV9Ob3JtYWwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVfTm9ybWFsKCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAKQEAgLTQzLDYgKzU4LDE1IEBACiAgICAgICogCiAgICAgICogQHNlZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldC5Db25jcmV0ZUNoYXJzZXRUZXN0I3Rlc3REZWNvZGVfTm9ybWFsKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVfTm9ybWFsKCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGMTZMRUNoYXJzZXREZWNvZGVyVGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkxFQ2hhcnNldERlY29kZXJUZXN0LmphdmEKaW5kZXggMTgzZmE0Ny4uZWVkMWIxMiAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkxFQ2hhcnNldERlY29kZXJUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkxFQ2hhcnNldERlY29kZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CkBAIC0yMyw2ICsyOCw3IEBACiAvKioKICAqIFRPRE8gdHlwZWRlZgogICovCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgVVRGMTZMRUNoYXJzZXREZWNvZGVyVGVzdCBleHRlbmRzIENoYXJzZXREZWNvZGVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkxFQ2hhcnNldEVuY29kZXJUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2TEVDaGFyc2V0RW5jb2RlclRlc3QuamF2YQppbmRleCBlNjY5ZTExLi4wMDNlMWQ3IDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2TEVDaGFyc2V0RW5jb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2TEVDaGFyc2V0RW5jb2RlclRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwpAQCAtMjMsNiArMjgsNyBAQAogLyoqCiAgKiBUT0RPIHR5cGUgZGVmCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2Rlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBVVEYxNkxFQ2hhcnNldEVuY29kZXJUZXN0IGV4dGVuZHMgQ2hhcnNldEVuY29kZXJUZXN0IHsKIAogICAgIC8vIGNoYXJzZXQgZm9yIHV0Zi0xNmxlCkBAIC01MSwxMCArNTcsMjggQEAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IGNvbnN0cnVjdG9yIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2hhcnNldEVuY29kZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzLCBmbG9hdC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyc2V0RW5jb2RlckNoYXJzZXRmbG9hdGZsb2F0KCkgewogICAgICAgICAvLyB0aGlzIGNvbnN0cnVjdG9yIGlzIGludmFsaWQgZm9yIFVURjE2TEUgQ2hhcnNldEVuY29kZXIKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5FbmNvZGVjaGFyKCkgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIG5vcm1hbCBjYXNlIGZvciB1dGZDUwogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdTAwNzcnKSk7CkBAIC02NCw2ICs4OCwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdWMyYzAnKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlQ2hhclNlcXVlbmNlKCkgewogICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgdXRmQ1MKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgiXHUwMDc3IikpOwpAQCAtODIsMTUgKzExNSw0NSBAQAogICAgICAgICBhc3NlcnRGYWxzZShlbmNvZGVyLmNhbkVuY29kZSgiXHVkODAwXHVkYjAwIikpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlSUNVQnVnKCkgewogICAgICAgICBhc3NlcnRGYWxzZShlbmNvZGVyLmNhbkVuY29kZSgiXHVkODAwIikpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImF2ZXJhZ2VCeXRlc1BlckNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm1heEJ5dGVzUGVyQ2hhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpY0RlZmF1bHRWYWx1ZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGVuY29kZXIuYXZlcmFnZUJ5dGVzUGVyQ2hhcigpLCAwLjAwMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCBlbmNvZGVyLm1heEJ5dGVzUGVyQ2hhcigpLCAwLjAwMSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMZWdhbFJlcGxhY2VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzTGVnYWxSZXBsYWNlbWVudEVtcHR5QXJyYXkoKSB7CiAgICAgICAgIGFzc2VydFRydWUoZW5jb2Rlci5pc0xlZ2FsUmVwbGFjZW1lbnQobmV3IGJ5dGVbMF0pKTsKICAgICB9CmRpZmYgLS1naXQgYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2TEVDaGFyc2V0VGVzdC5qYXZhIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEYxNkxFQ2hhcnNldFRlc3QuamF2YQppbmRleCBiMzJhYjliLi41NjE0ZWFjIDEwMDY0NAotLS0gYS9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjE2TEVDaGFyc2V0VGVzdC5qYXZhCisrKyBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGMTZMRUNoYXJzZXRUZXN0LmphdmEKQEAgLTE2LDkgKzE2LDE2IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIC8qKgogICogVGVzdCBVVEYtMTZMRS4KICAqLworCitAVGVzdFRhcmdldENsYXNzKGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldC5jbGFzcykKIHB1YmxpYyBjbGFzcyBVVEYxNkxFQ2hhcnNldFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENoYXJzZXRUZXN0Q2FzZSB7CiAKICAgICAvKioKQEAgLTM0LDYgKzQxLDE1IEBACiAgICAgICogCiAgICAgICogQHNlZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldC5Db25jcmV0ZUNoYXJzZXRUZXN0I3Rlc3RFbmNvZGVfTm9ybWFsKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdCwgdGV4dCBzb3VyY2U6IEFic3RyYWN0Q2hhcnNldFRlc3RDYXNlLmludGVybmFsVGVzdEVuY29kZS4gRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVfTm9ybWFsKCkgewogICAgICAgICBTdHJpbmcgaW5wdXQgPSAiYWJcdTVEMTRcdTY1NEYiOwogICAgICAgICBieXRlW10gb3V0cHV0ID0gbmV3IGJ5dGVbXSB7IDk3LCAwLCA5OCwgMCwgMjAsIDkzLCA3OSwgMTAxIH07CkBAIC00NSw2ICs2MSwxNSBAQAogICAgICAqIAogICAgICAqIEBzZWUgdGVzdHMuYXBpLmphdmEubmlvLmNoYXJzZXQuQ29uY3JldGVDaGFyc2V0VGVzdCN0ZXN0RGVjb2RlX05vcm1hbCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWwgdGVzdCwgdGV4dCBzb3VyY2U6IEFic3RyYWN0Q2hhcnNldFRlc3RDYXNlLmludGVybmFsVGVzdERlY29kZS4gRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVjb2RlIiwKKyAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVfTm9ybWFsKCkgewogICAgICAgICBieXRlW10gaW5wdXQgPSBuZXcgYnl0ZVtdIHsgOTcsIDAsIDk4LCAwLCAyMCwgOTMsIDc5LCAxMDEgfTsKICAgICAgICAgY2hhcltdIG91dHB1dCA9ICJhYlx1NUQxNFx1NjU0RiIudG9DaGFyQXJyYXkoKTsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGOENoYXJzZXRUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURjhDaGFyc2V0VGVzdC5qYXZhCmluZGV4IDhlMGY1N2YuLmNmMjI0NzYgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGOENoYXJzZXRUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEY4Q2hhcnNldFRlc3QuamF2YQpAQCAtMTYsOSArMTYsMTUgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogLyoqCiAgKiBUZXN0IFVURi04IGNoYXJzZXQuCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmNsYXNzKQogcHVibGljIGNsYXNzIFVURjhDaGFyc2V0VGVzdCBleHRlbmRzIEFic3RyYWN0Q2hhcnNldFRlc3RDYXNlIHsKIAogICAgIC8qKgpAQCAtMzQsNiArNDAsMTUgQEAKICAgICAgKiAKICAgICAgKiBAc2VlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0LkNvbmNyZXRlQ2hhcnNldFRlc3QjdGVzdERlY29kZV9Ob3JtYWwoKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0LCB0ZXh0IHNvdXJjZTogQWJzdHJhY3RDaGFyc2V0VGVzdENhc2UuaW50ZXJuYWxUZXN0RGVjb2RlLiBFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZV9Ob3JtYWwoKSB7CiAgICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW10geyA5NywgOTgsIC0yNywgLTc2LCAtMTA4LCAtMjYsIC0xMDcsIC0xMTMgfTsKICAgICAgICAgY2hhcltdIG91dHB1dCA9ICJhYlx1NUQxNFx1NjU0RiIudG9DaGFyQXJyYXkoKTsKQEAgLTQ1LDYgKzYwLDE1IEBACiAgICAgICogCiAgICAgICogQHNlZSB0ZXN0cy5hcGkuamF2YS5uaW8uY2hhcnNldC5Db25jcmV0ZUNoYXJzZXRUZXN0I3Rlc3RFbmNvZGVfTm9ybWFsKCkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0LCB0ZXh0IHNvdXJjZTogQWJzdHJhY3RDaGFyc2V0VGVzdENhc2UuaW50ZXJuYWxUZXN0RW5jb2RlLiBFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmNvZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlX05vcm1hbCgpIHsKICAgICAgICAgU3RyaW5nIGlucHV0ID0gImFiXHU1RDE0XHU2NTRGIjsKICAgICAgICAgYnl0ZVtdIG91dHB1dCA9IG5ldyBieXRlW10geyA5NywgOTgsIC0yNywgLTc2LCAtMTA4LCAtMjYsIC0xMDcsIC0xMTMgfTsKZGlmZiAtLWdpdCBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGQ2hhcnNldERlY29kZXJUZXN0LmphdmEgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURkNoYXJzZXREZWNvZGVyVGVzdC5qYXZhCmluZGV4IDI4OGNkMTYuLjE2YjUyZWIgMTAwNjQ0Ci0tLSBhL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGQ2hhcnNldERlY29kZXJUZXN0LmphdmEKKysrIGIvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEZDaGFyc2V0RGVjb2RlclRlc3QuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwpAQCAtMjMsNiArMjUsNyBAQAogLyoqCiAgKiB0ZXN0IHV0Zi04IGRlY29kZXIKICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIFVURkNoYXJzZXREZWNvZGVyVGVzdCBleHRlbmRzIENoYXJzZXREZWNvZGVyVGVzdCB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEZDaGFyc2V0RW5jb2RlclRlc3QuamF2YSBiL25pb19jaGFyL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvbmlvL2NoYXJzZXQvVVRGQ2hhcnNldEVuY29kZXJUZXN0LmphdmEKaW5kZXggYjRmMWU3ZC4uYTdjMTlkNSAxMDA2NDQKLS0tIGEvbmlvX2NoYXIvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9uaW8vY2hhcnNldC9VVEZDaGFyc2V0RW5jb2RlclRlc3QuamF2YQorKysgYi9uaW9fY2hhci9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL25pby9jaGFyc2V0L1VURkNoYXJzZXRFbmNvZGVyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLm5pby5jaGFyc2V0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CkBAIC0yMyw2ICsyOCw3IEBACiAvKioKICAqIHRlc3QgY2FzZSBzcGVjaWZpYyBhY3Rpdml0eSBvZiB1dGYtOCBjaGFyc2V0IGVuY29kZXIKICAqLworQFRlc3RUYXJnZXRDbGFzcyhqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIFVURkNoYXJzZXRFbmNvZGVyVGVzdCBleHRlbmRzIENoYXJzZXRFbmNvZGVyVGVzdCB7CiAKICAgICAvLyBjaGFyc2V0IGZvciBVVEYtOApAQCAtNDQsNiArNTAsMTUgQEAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FuRW5jb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5FbmNvZGVjaGFyKCkgdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIG5vcm1hbCBjYXNlIGZvciB1dGZDUwogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdTAwNzcnKSk7CkBAIC01Myw2ICs2OCwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKGVuY29kZXIuY2FuRW5jb2RlKCdcdWMyYzAnKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNhbkVuY29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRW5jb2RlQ2hhclNlcXVlbmNlKCkgewogICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgdXRmQ1MKICAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVyLmNhbkVuY29kZSgiXHUwMDc3IikpOwpAQCAtNzEsMTAgKzk1LDMxIEBACiAgICAgICAgIGFzc2VydEZhbHNlKGVuY29kZXIuY2FuRW5jb2RlKCJcdWQ4MDBcdWRiMDAiKSk7CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjYW5FbmNvZGUiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbkVuY29kZUlDVUJ1ZygpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoZW5jb2Rlci5jYW5FbmNvZGUoIlx1ZDgwMCIpKTsKICAgICB9CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhdmVyYWdlQnl0ZXNQZXJDaGFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXhCeXRlc1BlckNoYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWNEZWZhdWx0VmFsdWUoKSB7CiAgICAgICAgIC8vIGFzc2VydEVxdWFscygxLjEsIGVuY29kZXIuYXZlcmFnZUJ5dGVzUGVyQ2hhcigpLCAwLjAwMDEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZW5jb2Rlci5hdmVyYWdlQnl0ZXNQZXJDaGFyKCksIDAuMDAwMSk7CmRpZmYgLS1naXQgYS9vcGVuc3NsL3NyYy9tYWluL25hdGl2ZS9CTkludGVyZmFjZS5jIGIvb3BlbnNzbC9zcmMvbWFpbi9uYXRpdmUvQk5JbnRlcmZhY2UuYwppbmRleCA2MzYzMGZkLi42MDI2ZDU1IDEwMDY0NAotLS0gYS9vcGVuc3NsL3NyYy9tYWluL25hdGl2ZS9CTkludGVyZmFjZS5jCisrKyBiL29wZW5zc2wvc3JjL21haW4vbmF0aXZlL0JOSW50ZXJmYWNlLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgIHVuc2lnbmVkIGludCBoaSA9IGR3ID4+IDMyOyAvLyBUaGlzIHNoaWZ0cyB3aXRob3V0IHNpZ24gZXh0ZW5zaW9uLgogICAgIGludCBsbyA9IChpbnQpZHc7IC8vIFRoaXMgdHJ1bmNhdGVzIGltcGxpY2l0ZWx5LgogCi0gICAgLy8gbWM6IGNmLiBsaXRFbmRJbnRzMmJuOgorICAgIC8vIGNmLiBsaXRFbmRJbnRzMmJuOgogICAgIGJuX2NoZWNrX3RvcChhKTsKICAgICAgICAgaWYgKGJuX3dleHBhbmQoYSwgMikgIT0gTlVMTCkgewogICAgICAgICAgICAgYS0+ZFswXSA9IGxvOwpAQCAtMjE2LDE2ICsyMTYsMTcgQEAKIAogLyoqCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGxpdEVuZEludHMyYm4oaW50W10sIGludCwgaW50LCBpbnQpCi0gKiBtYzogVGhpcyBwcm9jZWR1cmUgZGlyZWN0bHkgd3JpdGVzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBCSUdOVU1zLgotICogbWM6IFdlIGRvIHNvIGFzIHRoZXJlIGlzIG5vIGRpcmVjdCBpbnRlcmZhY2UgYmFzZWQgb24gTGl0dGxlIEVuZGlhbiBJbnRlZ2VyIEFycmF5cy4KLSAqIG1jOiBBbHNvIG5vdGUgdGhhdCB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiBpcyB1c2VkIGluIHRoZSBDb3Jkb2JhIEphdmEgSW1wbGVtZW50YXRpb24gb2YgQmlnSW50ZWdlcnMsCisgKiBOb3RlOiAKKyAqIFRoaXMgcHJvY2VkdXJlIGRpcmVjdGx5IHdyaXRlcyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgQklHTlVNcy4KKyAqIFdlIGRvIHNvIGFzIHRoZXJlIGlzIG5vIGRpcmVjdCBpbnRlcmZhY2UgYmFzZWQgb24gTGl0dGxlIEVuZGlhbiBJbnRlZ2VyIEFycmF5cy4KKyAqIEFsc28gbm90ZSB0aGF0IHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGlzIHVzZWQgaW4gdGhlIENvcmRvYmEgSmF2YSBJbXBsZW1lbnRhdGlvbiBvZiBCaWdJbnRlZ2VycywKICAqICAgICAgICB3aGVyZW9mIGNlcnRhaW4gZnVuY3Rpb25hbGl0eSBpcyBzdGlsbCBiZWluZyB1c2VkLgogICovCiBzdGF0aWMgamJvb2xlYW4gTmF0aXZlQk5fbGl0RW5kSW50czJibihKTklFbnYqIGVudiwgamNsYXNzIGNscywgamludEFycmF5IGFyciwgaW50IGxlbiwgamJvb2xlYW4gbmVnLCBCSUdOVU0qIHJldCkgewogICAgIGlmICghb25lVmFsaWRIYW5kbGUoZW52LCByZXQpKSByZXR1cm4gRkFMU0U7CiAgICAgYm5fY2hlY2tfdG9wKHJldCk7CiAJaWYgKGxlbiA+IDApIHsKLSAgICAgICAgQk5fVUxPTkcqIHRtcEludHM7IC8vIG1jOiBCTl9VTE9ORyBpcyA0IEJ5dGVzIG9uIHRoaXMgc3lzdGVtIGZvciBzdXJlLCBpLmUuIHNhbWUgYXMgamludCEKKyAgICAgICAgQk5fVUxPTkcqIHRtcEludHM7IC8vIEJOX1VMT05HIGlzIDQgQnl0ZXMgb24gdGhpcyBzeXN0ZW0gZm9yIHN1cmUsIGkuZS4gc2FtZSBhcyBqaW50IQogICAgICAgICB0bXBJbnRzID0gKEJOX1VMT05HKikoKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJyLCAwKSk7CiAgICAgICAgIGlmICgodG1wSW50cyAhPSBOVUxMKSAmJiAoYm5fd2V4cGFuZChyZXQsIGxlbikgIT0gTlVMTCkpIHsKICAgICAgICAgICAgIGludCBpID0gbGVuOyBkbyB7IGktLTsgcmV0LT5kW2ldID0gdG1wSW50c1tpXTsgfSB3aGlsZSAoaSA+IDApOwpAQCAtMjM0LDcgKzIzNSw3IEBACiAgICAgICAgICAgICByZXQtPm5lZyA9IG5lZzsKICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2FsbCB0aGlzIGR1ZSB0byBjbGVhciBieXRlIGF0IHRvcCBpZiBhdm9pZGluZwogICAgICAgICAgICAgLy8gaGF2aW5nIHRoZSB0b3AgYml0IHNldCAoLXZlIG51bWJlcikKLSAgICAgICAgICAgIC8vIG1jOiBCYXNpY2FsbHkgZ2V0IHJpZCBvZiB0b3AgemVybyBpbnRzOgorICAgICAgICAgICAgLy8gQmFzaWNhbGx5IGdldCByaWQgb2YgdG9wIHplcm8gaW50czoKICAgICAgICAgICAgIGJuX2NvcnJlY3RfdG9wKHJldCk7CiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQpAQCAtMjQ0LDcgKzI0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KIAl9Ci0JZWxzZSB7IC8vIG1jOiAobGVuID0gMCkgbWVhbnMgdmFsdWUgPSAwIGFuZCBzaWduIHdpbGwgYmUgMCwgdG9vLgorCWVsc2UgeyAvLyAobGVuID0gMCkgbWVhbnMgdmFsdWUgPSAwIGFuZCBzaWduIHdpbGwgYmUgMCwgdG9vLgogCQlyZXQtPnRvcCA9IDA7CiAgICAgCXJldHVybiBUUlVFOwogCX0KQEAgLTI2MSw3ICsyNjIsNyBAQAogLy8gV2UgcmVseSBvbjogKEJOX0JJVFMyID09IDMyKSwgaS5lLiBCTl9VTE9ORyBpcyB1bnNpZ25lZCBpbnQgYW5kIGhhcyA0IGJ5dGVzOgogLy8KICAgICBibl9jaGVja190b3AocmV0KTsKLS8vIG1jOiBGSVhNRTogQVNTRVJUIChieXRlc0xlbiA+IDApOworLy8gRklYTUU6IEFTU0VSVCAoYnl0ZXNMZW4gPiAwKTsKIAlpbnQgaW50TGVuID0gKGJ5dGVzTGVuICsgMykgLyA0OwogCWludCBmaXJzdE5vbnplcm9EaWdpdCA9IC0yOwogICAgIGlmIChibl93ZXhwYW5kKHJldCwgaW50TGVuKSAhPSBOVUxMKSB7CkBAIC00MTcsOSArNDE4LDkgQEAKICAgICB1bnNpZ25lZCBjaGFyICogdG1wQnl0ZXM7CiAgICAgaW50IGxlbiwgYnl0ZUNudDsKICAgICBieXRlQ250ID0gQk5fbnVtX2J5dGVzKGEpOwotLy8gbWM6IEZJWE1FOiBDdXJyZW50bHkgaWdub3JpbmcgYXJyYXkgcGFzc2VkIGluIHRvOgorLy8gRklYTUU6IEN1cnJlbnRseSBpZ25vcmluZyBhcnJheSBwYXNzZWQgaW4gdG86CiAgICAgcmV0dXJuSkJ5dGVzID0gKCplbnYpLT5OZXdCeXRlQXJyYXkoZW52LCBieXRlQ250KTsKLS8vIG1jOiBGSVhNRTogaXMgaXQgbmVjY2Vzc2FyeSB0byBjaGVjayBmb3IgcmV0dXJuSkJ5dGVzICE9IE5VTEw/CisvLyBGSVhNRTogaXMgaXQgbmVjY2Vzc2FyeSB0byBjaGVjayBmb3IgcmV0dXJuSkJ5dGVzICE9IE5VTEw/CiAgICAgdG1wQnl0ZXMgPSAodW5zaWduZWQgY2hhciAqKSgoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCByZXR1cm5KQnl0ZXMsIDApKTsKICAgICBpZiAodG1wQnl0ZXMgIT0gTlVMTCkgewogICAgICAgICBsZW4gPSBCTl9ibjJiaW4oYSwgdG1wQnl0ZXMpOwpAQCAtNDMxLDcgKzQzMiw3IEBACiAKIC8qKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50W10gYm4ybGl0RW5kSW50cyhpbnQsIGludFtdKQotICogbWM6IGNmLiBsaXRFbmRJbnRzMmJuCisgKiBjZi4gbGl0RW5kSW50czJibgogICovCiBzdGF0aWMgamludEFycmF5IE5hdGl2ZUJOX2JuMmxpdEVuZEludHMoSk5JRW52KiBlbnYsIGpjbGFzcyBjbHMsIEJJR05VTSogYSwgamludEFycmF5IHRvKSB7CiAgICAgaWYgKCFvbmVWYWxpZEhhbmRsZShlbnYsIGEpKSByZXR1cm4gTlVMTDsKQEAgLTQzOSw5ICs0NDAsOSBAQAogICAgIGJuX2NoZWNrX3RvcChhKTsKICAgICBpbnQgbGVuID0gYS0+dG9wOwogICAgIGlmIChsZW4gPiAwKSB7Ci0vLyBtYzogRklYTUU6IEN1cnJlbnRseSBpZ25vcmluZyBhcnJheSBwYXNzZWQgaW4gdG86CisvLyBGSVhNRTogQ3VycmVudGx5IGlnbm9yaW5nIGFycmF5IHBhc3NlZCBpbiB0bzoKICAgICAgICAgcmV0dXJuSkludHMgPSAoKmVudiktPk5ld0ludEFycmF5KGVudiwgbGVuKTsKLS8vIG1jOiBGSVhNRTogaXMgaXQgbmVjY2Vzc2FyeSB0byBjaGVjayBmb3IgcmV0dXJuSkJ5dGVzICE9IE5VTEw/CisvLyBGSVhNRTogaXMgaXQgbmVjY2Vzc2FyeSB0byBjaGVjayBmb3IgcmV0dXJuSkJ5dGVzICE9IE5VTEw/CiAgICAgICAgIEJOX1VMT05HKiB0bXBJbnRzID0gKEJOX1VMT05HKikoKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgcmV0dXJuSkludHMsIDApKTsKICAgICAgICAgaWYgKHRtcEludHMgIT0gTlVMTCkgewogICAgICAgICAgICAgaW50IGkgPSBsZW47IGRvIHsgaS0tOyB0bXBJbnRzW2ldID0gYS0+ZFtpXTsgfSB3aGlsZSAoaSA+IDApOwpAQCAtNDY0LDkgKzQ2NSw5IEBACiAgICAgdW5zaWduZWQgY2hhciAqIHRtcEJ5dGVzOwogICAgIGludCBsZW4sIGJ5dGVDbnQ7CiAgICAgYnl0ZUNudCA9IEJOX251bV9ieXRlcyhhKTsKLS8vIG1jOiBGSVhNRTogQ3VycmVudGx5IGlnbm9yaW5nIGFycmF5IHBhc3NlZCBpbiB0bzoKKy8vIEZJWE1FOiBDdXJyZW50bHkgaWdub3JpbmcgYXJyYXkgcGFzc2VkIGluIHRvOgogICAgIHJldHVybkpCeXRlcyA9ICgqZW52KS0+TmV3Qnl0ZUFycmF5KGVudiwgYnl0ZUNudCk7Ci0vLyBtYzogRklYTUU6IGlzIGl0IG5lY2Nlc3NhcnkgdG8gY2hlY2sgZm9yIHJldHVybkpCeXRlcyAhPSBOVUxMPworLy8gRklYTUU6IGlzIGl0IG5lY2Nlc3NhcnkgdG8gY2hlY2sgZm9yIHJldHVybkpCeXRlcyAhPSBOVUxMPwogICAgIHRtcEJ5dGVzID0gKHVuc2lnbmVkIGNoYXIgKikoKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgcmV0dXJuSkJ5dGVzLCAwKSk7CiAgICAgaWYgKHRtcEJ5dGVzICE9IE5VTEwpIHsKICAgICAgICAgbGVuID0gQk5fYm4yYmluKGEsIHRtcEJ5dGVzKTsKQEAgLTYxNSw4ICs2MTYsOCBAQAogCiAgICAgbiA9IC1uOwogLy8gICAgcmV0dXJuIEJOX3JzaGlmdChyLCBhLCBuKTsKLS8vIG1jOiBGb2xsb3dpbmcgY29kZSBpbnNvdXJjZWQgZnJvbSBibl9zaGlmdC5jIGluIG9yZGVyIHRvIGhhdmUgYnVnIGZpeGVkOgotLy8gbWM6IEZJWE1FOiBTaG91bGQgcmVwb3J0IHRvIG9wZW5zc2wgdGVhbSEhIQorLy8gRm9sbG93aW5nIGNvZGUgaW5zb3VyY2VkIGZyb20gYm5fc2hpZnQuYyBpbiBvcmRlciB0byBoYXZlIGJ1ZyBmaXhlZDoKKy8vIEZJWE1FOiBTaG91bGQgcmVwb3J0IHRvIG9wZW5zc2wgdGVhbSEhIQogCiAJaW50IGksaixudyxsYixyYjsKIAlCTl9VTE9ORyAqdCwqZjsKQEAgLTYyOCw3ICs2MjksNyBAQAogCW53PW4vQk5fQklUUzI7CiAJcmI9biVCTl9CSVRTMjsKIAlsYj1CTl9CSVRTMi1yYjsKLS8vIG1jOiBDaGFuZ2VkICJudyA+IGEtPnRvcCB8fCBhLT50b3AgPT0gMCIgdG8gbncgPj0gYS0+dG9wIiBhcyBjb25zaWRlcmluZyB0aGlzIGEgYnVnOgorLy8gQ2hhbmdlZCAibncgPiBhLT50b3AgfHwgYS0+dG9wID09IDAiIHRvIG53ID49IGEtPnRvcCIgYXMgY29uc2lkZXJpbmcgdGhpcyBhIGJ1ZzoKIAlpZiAobncgPj0gYS0+dG9wKQogCQl7CiAJCUJOX3plcm8ocik7CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9BYnN0cmFjdFByZWZlcmVuY2VzLmphdmEgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9BYnN0cmFjdFByZWZlcmVuY2VzLmphdmEKaW5kZXggNTlmOWE2NS4uNzExY2MwMSAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvQWJzdHJhY3RQcmVmZXJlbmNlcy5qYXZhCisrKyBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL0Fic3RyYWN0UHJlZmVyZW5jZXMuamF2YQpAQCAtMzQsMjMgKzM0LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnByZWZzLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHBhcnRseSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5QcmVmZXJlbmNlczwvY29kZT4sIHdoaWNoIGNhbiBiZSAKLSAqIHVzZWQgdG8gc2ltcGxpZnkgPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRlZmluZSBuaW5lIGFic3RyYWN0IFNQSSBtZXRob2RzLCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IAotICogcHJlZmVyZW5jZSBwcm92aWRlci4gQW5kIHByb3ZpZGVyIGNhbiBhbHNvIG92ZXJyaWRlIG90aGVyIG1ldGhvZHMgb2YgdGhpcyAKLSAqIGNsYXNzLiBTb21lIFNQSSBtZXRob2RzIHdpbGwgdGhyb3cgPGNvZGU+QmFja2luZ1N0b3JlRXhjZXB0aW9uPC9jb2RlPiwgCi0gKiBpbmNsdWRpbmcgPGNvZGU+Y2hpbGRyZW5OYW1lc1NwaSgpPC9jb2RlPiwgPGNvZGU+Zmx1c2hTcGkoKTwvY29kZT4sIAotICogPGNvZGU+a2V5c1NwaSgpPC9jb2RlPiwgPGNvZGU+cmVtb3ZlTm9kZVNwaSgpPC9jb2RlPiwgCi0gKiA8Y29kZT5zeW5jU3BpKCk8L2NvZGU+OyA8Y29kZT5nZXRTcGkoU3RyaW5nLCBTdHJpbmcpPC9jb2RlPiBuZXZlciB0aHJvd3MgYW55IAotICogZXhjZXB0aW9uczsgdGhlIGxhc3QgU1BJIG1ldGhvZHMsIDxjb2RlPnB1dFNwaShTdHJpbmcpPC9jb2RlPiwgCi0gKiA8Y29kZT5yZW1vdmVTcGkoU3RyaW5nKTwvY29kZT4gYW5kIDxjb2RlPmNoaWxkU3BpKFN0cmluZyk8L2NvZGU+IHdvbid0IHRocm93IAotICogPGNvZGU+QmFja2luZ1N0b3JlRXhjZXB0aW9uPC9jb2RlPiwgYnV0IGluIHNvbWUgaW1wbGVtZW50YXRpb25zLCB0aGV5IG1heSAKLSAqIHRocm93IDxjb2RlPlNlY3VyaXR5RXhjZXB0aW9uPC9jb2RlPiBkdWUgdG8gbGFja2luZyB0aGUgcGVybWlzc2lvbiB0byBhY2Nlc3MgCi0gKiBiYWNraW5nIGVuZCBzdG9yYWdlLjwvcD4KKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBjbGFzcworICogUHJlZmVyZW5jZXMsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IHtAY29kZSBQcmVmZXJlbmNlc30gcHJvdmlkZXIncworICogaW1wbGVtZW50YXRpb24uIFRoaXMgY2xhc3MgZGVmaW5lcyBuaW5lIGFic3RyYWN0IFNQSSBtZXRob2RzLCB3aGljaCBtdXN0IGJlCisgKiBpbXBsZW1lbnRlZCBieSBhIHByZWZlcmVuY2UgcHJvdmlkZXIuCiAgKiAKLSAqIEBzaW5jZSAxLjQKLSAqIEBzZWUgUHJlZmVyZW5jZXMKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcmVmZXJlbmNlcyBleHRlbmRzIFByZWZlcmVuY2VzIHsKICAgICAvKgpAQCAtNTgsOSArNDcsMTQgQEAKICAgICAgKiBDbGFzcyBmaWVsZHMKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwotICAgIC8qKiB0aGUgdW5oYW5kbGVkIGV2ZW50cyBjb2xsZWN0aW9uICovCisgICAgLyoqCisgICAgICogVGhlIHVuaGFuZGxlZCBldmVudHMgY29sbGVjdGlvbi4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PEV2ZW50T2JqZWN0PiBldmVudHMgPSBuZXcgTGlua2VkTGlzdDxFdmVudE9iamVjdD4oKTsKLSAgICAvKiogdGhlIGV2ZW50IGRpc3BhdGNoZXIgdGhyZWFkICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgZGlzcGF0Y2hlciB0aHJlYWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXZlbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCJQcmVmZXJlbmNlIEV2ZW50IERpc3BhdGNoZXIiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoKQEAgLTkzLDcgKzg3LDkgQEAKICAgICAgKiBJbnN0YW5jZSBmaWVsZHMgKHBhY2thZ2UtcHJpdmF0ZSkKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwotICAgIC8qKiB0cnVlIGlmIHRoaXMgbm9kZSBpcyBpbiB1c2VyIHByZWZlcmVuY2UgaGllcmFyY2h5ICovCisgICAgLyoqCisgICAgICogVHJ1ZSwgaWYgdGhpcyBub2RlIGlzIGluIHVzZXIgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICovCiAgICAgYm9vbGVhbiB1c2VyTm9kZTsKIAogICAgIC8qCkBAIC0xMDEsMjAgKzk3LDMyIEBACiAgICAgICogSW5zdGFuY2UgZmllbGRzIChwcml2YXRlKQogICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCi0gICAgLyoqIE1hcmtlciBjbGFzcyBmb3IgJ2xvY2snIGZpZWxkLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvY2sge30KLSAgICAvKiogVGhlIG9iamVjdCB1c2VkIHRvIGxvY2sgdGhpcyBub2RlLiAqLworICAgIC8qKgorICAgICAqIE1hcmtlciBjbGFzcyBmb3IgJ2xvY2snIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvY2sgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgdXNlZCB0byBsb2NrIHRoaXMgbm9kZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGxvY2s7CiAgICAgCiAgICAgLyoqCi0gICAgICogVGhpcyBmaWVsZCBpcyB0cnVlIGlmIHRoaXMgbm9kZSBpcyBjcmVhdGVkIHdoaWxlIGl0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIAotICAgICAqIGJhY2tpbmcgc3RvcmUuIFRoaXMgZmllbGQncyBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLCBhbmQgaXQgaXMgY2hlY2tlZCB3aGVuIAotICAgICAqIHRoZSBub2RlIGNyZWF0aW9uIGlzIGNvbXBsZXRlZCwgYW5kIGlmIGl0IGlzIHRydWUsIHRoZSBub2RlIGNoYW5nZSBldmVudCAKLSAgICAgKiB3aWxsIGJlIGZpcmVkIGZvciB0aGlzIG5vZGUncyBwYXJlbnQuCisgICAgICogVGhpcyBmaWVsZCBpcyB0cnVlIGlmIHRoaXMgbm9kZSBpcyBjcmVhdGVkIHdoaWxlIGl0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlCisgICAgICogYmFja2luZyBzdG9yZS4gVGhpcyBmaWVsZCdzIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UsIGFuZCBpdCBpcyBjaGVja2VkCisgICAgICogd2hlbiB0aGUgbm9kZSBjcmVhdGlvbiBpcyBjb21wbGV0ZWQsIGFuZCBpZiBpdCBpcyB0cnVlLCB0aGUgbm9kZSBjaGFuZ2UKKyAgICAgKiBldmVudCB3aWxsIGJlIGZpcmVkIGZvciB0aGlzIG5vZGUncyBwYXJlbnQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbmV3Tm9kZTsKIAotICAgIC8qKiBjYWNoZWQgY2hpbGQgbm9kZXMgKi8KKyAgICAvKioKKyAgICAgKiBDYWNoZWQgY2hpbGQgbm9kZXMKKyAgICAgKi8KICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEFic3RyYWN0UHJlZmVyZW5jZXM+IGNhY2hlZE5vZGU7CiAKICAgICAvL3RoZSBjb2xsZWN0aW9ucyBvZiBsaXN0ZW5lcnMKQEAgLTEzOSwxNyArMTQ3LDE5IEBACiAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+QWJzdHJhY3RQcmVmZXJlbmNlczwvY29kZT4gaW5zdGFuY2UgdXNpbmcgZ2l2ZW4gCi0gICAgICogcGFyZW50IG5vZGUgYW5kIG5vZGUgbmFtZS4gCi0gICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBYnN0cmFjdFByZWZlcmVuY2VzfSBpbnN0YW5jZSB1c2luZyB0aGUgZ2l2ZW4gcGFyZW50IG5vZGUKKyAgICAgKiBhbmQgbm9kZSBuYW1lLgorICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgdGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZSwgY2FuIGJlIG51bGwsIHdoaWNoIG1lYW5zIHRoaXMgCi0gICAgICogICAgICAgICAgICAgICAgIG5vZGUgaXMgcm9vdAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBuZXcgbm9kZSBvciB7QGNvZGUgbnVsbH0gdG8gaW5kaWNhdGUKKyAgICAgKiAgICAgICAgICAgIHRoYXQgdGhlIG5ldyBub2RlIGlzIGEgcm9vdCBub2RlLgogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgbm9kZSwgY2FuIGJlIGVtcHR5KCIiKSwgd2hpY2ggbWVhbnMgdGhpcyAKLSAgICAgKiAgICAgICAgICAgICAgICAgbm9kZSBpcyByb290CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmV3IG5vZGUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIGluZGljYXRlIHRoYXQKKyAgICAgKiAgICAgICAgICAgIHRoaXMgbm9kZSBpcyBjYWxsZWQgInJvb3QiLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIG5hbWUgY29udGFpbnMgc2xhc2gsIG9yIGJlIGVtcHR5IGlmIHBhcmVudCBpcyBub3QgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuYW1lIGNvbnRhaW5zIGEgc2xhc2ggY2hhcmFjdGVyIG9yIGlzIGVtcHR5IGlmIHtAY29kZQorICAgICAqICAgICAgICAgICAgIHBhcmVudH0gaXMgbm90IHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQcmVmZXJlbmNlcyhBYnN0cmFjdFByZWZlcmVuY2VzIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKChudWxsID09IHBhcmVudCBeIG5hbWUubGVuZ3RoKCkgPT0gMCkgfHwgbmFtZS5pbmRleE9mKCIvIikgPj0gMCkgeyAvLyROT04tTkxTLTEkCkBAIC0xNzIsMjQgKzE4MiwyOSBAQAogICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGFycmF5cyBvZiBhbGwgY2FjaGVkIGNoaWxkcmVuIG5vZGUuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY2FjaGVkIGNoaWxkIG5vZGVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYXJyYXlzIG9mIGFsbCBjYWNoZWQgY2hpbGRyZW4gbm9kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBjYWNoZWQgY2hpbGQgbm9kZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0UHJlZmVyZW5jZXNbXSBjYWNoZWRDaGlsZHJlbigpIHsKICAgICAgICAgcmV0dXJuIGNhY2hlZE5vZGUudmFsdWVzKCkudG9BcnJheShuZXcgQWJzdHJhY3RQcmVmZXJlbmNlc1tjYWNoZWROb2RlLnNpemUoKV0pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2hpbGQgbm9kZSB3aXRoIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC4gVGhlIAotICAgICAqIGdpdmVuIG5hbWUgbXVzdCBiZSB2YWxpZCBhbmQgdGhpcyBub2RlIGNhbm5vdCBiZSByZW1vdmVkLiBJbnZvY2F0aW9uIG9mIAotICAgICAqIHRoaXMgbWV0aG9kIGltcGxpZXMgdGhhdCB0aGUgbm9kZSB3aXRoIGdpdmVuIG5hbWUgaXMgbm90IGNhY2hlZChvciwgaGFzIAotICAgICAqIGJlZW4gcmVtb3ZlZC4pCisgICAgICogUmV0dXJucyB0aGUgY2hpbGQgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvciB7QGNvZGUgbnVsbH0gaWYgaXQKKyAgICAgKiBkb2Vzbid0IGV4aXN0LiBJbXBsZW1lbnRlcnMgY2FuIGFzc3VtZSB0aGF0IHRoZSBuYW1lIHN1cHBsaWVkIHRvIHRoaXMgbWV0aG9kIAorICAgICAqIHdpbGwgYmUgYSB2YWxpZCBub2RlIG5hbWUgc3RyaW5nIChjb25mb3JtaW5nIHRvIHRoZSBub2RlIG5hbWluZyBmb3JtYXQpIGFuZCAKKyAgICAgKiB3aWxsIG5vdCBjb3JyZXNwb25kIHRvIGEgbm9kZSB0aGF0IGhhcyBiZWVuIGNhY2hlZCBvciByZW1vdmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lICAgIHRoZSBnaXZlbiBjaGlsZCBuYW1lIHRvIGJlIGdvdCAKLSAgICAgKiBAcmV0dXJuICAgICAgICB0aGUgY2hpbGQgbm9kZSB3aXRoIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdCAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgY2hpbGQgbm9kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBub2RlIHdpdGggdGhlIGdpdmVuIG5hbWUgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgICAgIGV4aXN0LgogICAgICAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIG9wZXJhdGlvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIGFuIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgIGZhaWx1cmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0UHJlZmVyZW5jZXMgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKQEAgLTIwOSwxMSArMjI0LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQgYnkgaW52b2tpbmcgCi0gICAgICoge0BsaW5rICNyZW1vdmVOb2RlKCkgcmVtb3ZlTm9kZX0uIAotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkIGJ5IGludm9raW5nIAotICAgICAqICAgICAgICAgICAgIHtAbGluayAjcmVtb3ZlTm9kZSgpIHJlbW92ZU5vZGV9CisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkIGJ5IGludm9raW5nIHRoZSBtZXRob2Qge0Bjb2RlCisgICAgICogcmVtb3ZlTm9kZSgpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSwgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbW92ZWQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpAQCAtMjIyLDEwNCArMjM4LDEyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoIGNoYW5nZXMgb2YgdGhpcyBub2RlIHRvIHRoZSBiYWNraW5nIHN0b3JlLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSAKLSAgICAgKiBmbHVzaCB0aGlzIG5vZGUsIGFuZCBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGRlc2NlbmRhbnQgbm9kZXMuIFRoZSAKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiB3aGljaCB3YW50IHRvIGZsdXNoIGFsbCBub2RlcyBhdCBvbmNlIHNob3VsZCBvdmVycmlkZSAKLSAgICAgKiB7QGxpbmsgI2ZsdXNoKCkgZmx1c2goKX0gbWV0aG9kLiAKLSAgICAgKgorICAgICAqIEZsdXNoZXMgY2hhbmdlcyBvZiB0aGlzIG5vZGUgdG8gdGhlIGJhY2tpbmcgc3RvcmUuIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIG9ubHkgZmx1c2ggdGhpcyBub2RlIGFuZCBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGRlc2NlbmRhbnQgbm9kZXMuIEFueQorICAgICAqIGltcGxlbWVudGF0aW9uIHRoYXQgd2FudHMgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IHRvIGZsdXNoIGFsbCBub2RlcyAKKyAgICAgKiBhdCBvbmNlIHNob3VsZCBvdmVycmlkZSB0aGUgbWV0aG9kIHtAbGluayAjZmx1c2goKSBmbHVzaCgpfS4KKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlIG9yIGNhdXNlcyBvcGVyYXRpb24gZmFpbHVyZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlIG9yIGNhdXNlcyBhbiBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICBmYWlsdXJlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZsdXNoU3BpKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gbmFtZXMgb2YgdGhpcyBub2RlJ3MgYWxsIGNoaWxkcmVuICwgb3IgZW1wdHkgYXJyYXkgaWYgdGhpcyBub2RlIGhhcyAKLSAgICAgKiBubyBjaGlsZC4gQ2FjaGVkIGNoaWxkcmVuIG5hbWUgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBuYW1lcyBvZiB0aGlzIG5vZGUncyBhbGwgY2hpbGRyZW4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgb2YgdGhlIGNoaWxkIG5vZGVzIG9mIHRoaXMgbm9kZSBvciBhbiBlbXB0eSBhcnJheSBpZgorICAgICAqIHRoaXMgbm9kZSBoYXMgbm8gY2hpbGRyZW4uIFRoZSBuYW1lcyBvZiBjYWNoZWQgY2hpbGRyZW4gYXJlIG5vdCByZXF1aXJlZCB0byBiZQorICAgICAqIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoaXMgbm9kZSdzIGNoaWxkcmVuLgogICAgICAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIG9wZXJhdGlvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIGFuIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgIGZhaWx1cmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGNoaWxkcmVuTmFtZXNTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjaGlsZCBwcmVmZXJlbmNlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYW5kIGNyZWF0ZSBuZXcgb25lIGlmIAotICAgICAqIGl0IGRvZXMgbm90IGV4aXN0LiBJbnZva2VyIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBhc3N1cmUgdGhhdCB0aGUgZ2l2ZW4gbmFtZSAKLSAgICAgKiBhcmUgdmFsaWQgYXMgd2VsbCBhcyB0aGlzIG5vZGUgaXMgbm90IHJlbW92ZWQuIEludm9jYXRpb24gb2YgdGhpcyBtZXRob2QgCi0gICAgICogaW1wbGllcyB0aGF0IHRoZSBub2RlIHdpdGggZ2l2ZW4gbmFtZSBpcyBub3QgY2FjaGVkKG9yLCBoYXMgYmVlbiByZW1vdmVkLikKLSAgICAgKiBJZiB0aGUgbmFtZWQgbm9kZSBoYXMganVzdCBiZWVuIHJlbW92ZWQsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIG11c3QgCi0gICAgICogY3JlYXRlIGEgbmV3IG9uZSBpbnN0ZWFkIG9mIHJlYWN0aXZhdGVkIHRoZSByZW1vdmVkIG9uZS4gCisgICAgICogUmV0dXJucyB0aGUgY2hpbGQgcHJlZmVyZW5jZSBub2RlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGNyZWF0aW5nIGl0CisgICAgICogaWYgaXQgZG9lcyBub3QgZXhpc3QuIFRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZQorICAgICAqIGdpdmVuIG5hbWUgaXMgdmFsaWQgYW5kIHRoYXQgdGhpcyBub2RlIGhhcyBub3QgYmVlbiByZW1vdmVkIG9yIGNhY2hlZC4gCisgICAgICogSWYgdGhlIG5hbWVkIG5vZGUgaGFzIGp1c3QgYmVlbiByZW1vdmVkLCB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGlzIG1ldGhvZCBtdXN0IGNyZWF0ZSBhIG5ldyBvbmUgaW5zdGVhZCBvZiByZWFjdGl2YXRpbmcgdGhlIHJlbW92ZWQKKyAgICAgKiBvbmUuCiAgICAgICogPHA+Ci0gICAgICogVGhlIG5ldyBjcmVhdGlvbiBpcyBub3QgcmVxdWlyZWQgdG8gYmUgcGVyc2lzdGVkIGltbWVkaWF0ZWx5IHVudGlsIHRoZSBmbHVzaCAKLSAgICAgKiBtZXRob2QgaXMgaW52b2tlZC48L3A+CisgICAgICogVGhlIG5ldyBjcmVhdGlvbiBpcyBub3QgcmVxdWlyZWQgdG8gYmUgcGVyc2lzdGVkIGltbWVkaWF0ZWx5IHVudGlsIHRoZQorICAgICAqIGZsdXNoIG1ldGhvZCB3aWxsIGJlIGludm9rZWQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBBYnN0cmFjdFByZWZlcmVuY2VzCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgcHJlZmVyZW5jZSB0byBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBwcmVmZXJlbmNlIG5vZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGRTcGkoU3RyaW5nIG5hbWUpOwogCiAKICAgICAvKioKLSAgICAgKiBQdXQgdGhlIGdpdmVuIGtleS12YWx1ZSBwYWlyIGludG8gdGhpcyBub2RlLiBJbnZva2VyIG9mIHRoaXMgbWV0aG9kIHNob3VsZAotICAgICAqIGFzc3VyZSB0aGF0IGJvdGggdGhlIGdpdmVuIHZhbHVlcyBhcmUgdmFsaWQgYXMgd2VsbCBhcyB0aGlzIG5vZGUgCi0gICAgICogaXMgbm90IHJlbW92ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgICB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGdpdmVuIHByZWZlcmVuY2UgdmFsdWUKKyAgICAgKiBQdXRzIHRoZSBnaXZlbiBrZXktdmFsdWUgcGFpciBpbnRvIHRoaXMgbm9kZS4gQ2FsbGVyIG9mIHRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIGVuc3VyZSB0aGF0IGJvdGggb2YgdGhlIGdpdmVuIHZhbHVlcyBhcmUgdmFsaWQgYW5kIHRoYXQgdGhpcworICAgICAqIG5vZGUgaGFzIG5vdCBiZWVuIHJlbW92ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBwcmVmZXJlbmNlIGtleS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1dFNwaShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJlZmVyZW5jZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleS4gSW52b2tlciBvZiB0aGlzIG1ldGhvZCAKLSAgICAgKiBzaG91bGQgYXNzdXJlIHRoYXQgZ2l2ZW4ga2V5IGFyZSB2YWxpZCBhcyB3ZWxsIGFzIHRoaXMgbm9kZSBpcyBub3QgcmVtb3ZlZC4gCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb25zLCBidXQgaWYgaXQgZG9lcywgdGhlIGludm9rZXIgc2hvdWxkIAotICAgICAqIGNhdGNoIGl0IGFuZCBkZWFsIHdpdGggaXQgYXMgbnVsbCByZXR1cm4gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBnaXZlbiBrZXkgdG8gYmUgc2VhcmNoZWQgZm9yCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleQorICAgICAqIEdldHMgdGhlIHByZWZlcmVuY2UgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXkuIFRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGdpdmVuIGtleSBpcyB2YWxpZCBhbmQgdGhhdCB0aGlzIG5vZGUgaGFzIG5vdCBiZWVuCisgICAgICogcmVtb3ZlZC4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9ucyBidXQgaWYgaXQgZG9lcywgdGhlCisgICAgICogY2FsbGVyIHdpbGwgaWdub3JlIHRoZSBleGNlcHRpb24sIHJlZ2FyZGluZyBpdCBhcyBhIHtAY29kZSBudWxsfSByZXR1cm4gdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIGtleSB0byBiZSBzZWFyY2hlZCBmb3IuCisgICAgICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNwaShTdHJpbmcga2V5KTsKIAogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCBrZXlzIG9mIHRoaXMgbm9kZSdzIHByZWZlcmVuY2VzLCBvciBlbXB0eSBhcnJheSBpZiBubyBwcmVmZXJlbmNlIAotICAgICAqIGZvdW5kIG9uIHRoaXMgbm9kZS4gSW52b2tlciBvZiB0aGlzIG1ldGhvZCBzaG91bGQgYXNzdXJlIHRoYXQgdGhpcyBub2RlIGlzIAotICAgICAqIG5vdCByZW1vdmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhbGwga2V5cyBvZiB0aGlzIG5vZGUncyBwcmVmZXJlbmNlcworICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHByZWZlcmVuY2Uga2V5cyBvZiB0aGlzIG5vZGUgb3IgYW4gZW1wdHkgYXJyYXkgaWYKKyAgICAgKiBubyBwcmVmZXJlbmNlcyBoYXZlIGJlZW4gZm91bmQuIFRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGF0CisgICAgICogdGhpcyBub2RlIGhhcyBub3QgYmVlbiByZW1vdmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGFsbCBwcmVmZXJlbmNlIGtleXMuCiAgICAgICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgb3BlcmF0aW9uIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10ga2V5c1NwaSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhpcyBub2RlIGZyb20gdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRyZWUuIFRoZSBpbnZva2VyIG9mIHRoaXMgCi0gICAgICogbWV0aG9kIHNob3VsZCBhc3N1cmUgdGhhdCB0aGlzIG5vZGUgaGFzIG5vIGNoaWxkIG5vZGUsIHdoaWNoIG1lYW5zIHRoZSAKLSAgICAgKiB7QGxpbmsgUHJlZmVyZW5jZXMjcmVtb3ZlTm9kZSgpIFByZWZlcmVuY2VzLnJlbW92ZU5vZGUoKX0gc2hvdWxkIGludm9rZSAKLSAgICAgKiB0aGlzIG1ldGhvZCBtdWx0aS10aW1lcyBpbiBib3R0b20tdXAgcGF0dGVybi4gVGhlIHJlbW92YWwgaXMgbm90IHJlcXVpcmVkIAotICAgICAqIHRvIGJlIHBlcnNpc3RlZCBhdCBvbmNlIHVudGlsIHRoZSBpdCBpcyBmbHVzaGVkLiAgCi0gICAgICoKKyAgICAgKiBSZW1vdmVzIHRoaXMgbm9kZSBmcm9tIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0cmVlLiBUaGUgY2FsbGVyIG9mIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGF0IHRoaXMgbm9kZSBoYXMgbm8gY2hpbGQgbm9kZXMsIHdoaWNoIG1lYW5zIHRoZQorICAgICAqIG1ldGhvZCB7QGxpbmsgUHJlZmVyZW5jZXMjcmVtb3ZlTm9kZSgpIFByZWZlcmVuY2VzLnJlbW92ZU5vZGUoKX0gc2hvdWxkCisgICAgICogaW52b2tlIHRoaXMgbWV0aG9kIG11bHRpcGxlLXRpbWVzIGluIGJvdHRvbS11cCBwYXR0ZXJuLiBUaGUgcmVtb3ZhbCBpcworICAgICAqIG5vdCByZXF1aXJlZCB0byBiZSBwZXJzaXN0ZWQgdW50aWwgYWZ0ZXIgaXQgaXMgZmx1c2hlZC4KKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlIG9yIGNhdXNlcyBvcGVyYXRpb24gZmFpbHVyZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlIG9yIGNhdXNlcyBhbiBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICBmYWlsdXJlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbW92ZU5vZGVTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIGtleS4gSW52b2tlciBvZiB0aGlzIG1ldGhvZCAKLSAgICAgKiBzaG91bGQgYXNzdXJlIHRoYXQgZ2l2ZW4ga2V5IGFyZSB2YWxpZCBhcyB3ZWxsIGFzIHRoaXMgbm9kZSBpcyBub3QgcmVtb3ZlZC4gCisgICAgICogUmVtb3ZlcyB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LiBUaGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBnaXZlbiBrZXkgaXMgdmFsaWQgYW5kIHRoYXQgdGhpcyBub2RlIGhhcyBub3QgYmVlbgorICAgICAqIHJlbW92ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSAgICB0aGUgZ2l2ZW4ga2V5IHRvIHJlbW92ZWQKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBwcmVmZXJlbmNlIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVTcGkoU3RyaW5nIGtleSk7CiAKICAgICAvKioKLSAgICAgKiBTeW5jaHJvbml6ZSB0aGlzIG5vZGUgd2l0aCB0aGUgYmFja2luZyBzdG9yZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgCi0gICAgICogc3luY2hyb25pemUgdGhpcyBub2RlLCBhbmQgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBkZXNjZW5kYW50IG5vZGVzLiBUaGUgCi0gICAgICogaW1wbGVtZW50YXRpb24gd2hpY2ggd2FudCB0byBzeW5jaHJvbml6ZSBhbGwgbm9kZXMgYXQgb25jZSBzaG91bGQgb3ZlcnJpZGUgCi0gICAgICoge0BsaW5rICNzeW5jKCkgc3luYygpfSBtZXRob2QuIAorICAgICAqIFN5bmNocm9uaXplcyB0aGlzIG5vZGUgd2l0aCB0aGUgYmFja2luZyBzdG9yZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkKKyAgICAgKiBzeW5jaHJvbml6ZSB0aGlzIG5vZGUgYW5kIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgZGVzY2VuZGFudCBub2Rlcy4gQW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiB0aGF0IHdhbnRzIHRvIHByb3ZpZGUgZnVuY3Rpb25hbGl0eSB0byBzeW5jaHJvbml6ZSBhbGwgbm9kZXMgYXQgb25jZSBzaG91bGQKKyAgICAgKiBvdmVycmlkZSB0aGUgbWV0aG9kIHtAbGluayAjc3luYygpIHN5bmMoKX0uCiAgICAgICogCiAgICAgICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgb3BlcmF0aW9uIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzeW5jU3BpKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uLmphdmEgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb24uamF2YQppbmRleCA3ZGRiM2YzLi5lOGE4MDVjIDEwMDY0NAotLS0gYS9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb24uamF2YQorKysgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb24uamF2YQpAQCAtMTksMzAgKzE5LDMzIEBACiAKIAogLyoqCi0gKiBBbiBleGNlcHRpb24gdG8gaW5kaWNhdGUgdGhhdCBzb21lIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBhY2Nlc3NpbmcKLSAqIHRoZSBiYWNraW5nIHN0b3JlLgotICoKLSAqIEBzaW5jZSAxLjQKKyAqIEFuIGV4Y2VwdGlvbiB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBhY2Nlc3NpbmcgdGhlCisgKiBiYWNraW5nIHN0b3JlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODU5Nzk2NTAwNDAxMTA4NDY5TDsKICAgICAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjwvY29kZT4gaW5zdGFuY2UgdXNpbmcgYW4gCi0gICAgICogZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQmFja2luZ1N0b3JlRXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIGEgZGV0YWlsZWQgZXhjZXB0aW9uCisgICAgICogbWVzc2FnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyAgICAgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsZWQgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiAoU3RyaW5nIHMpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5CYWNraW5nU3RvcmVFeGNlcHRpb248L2NvZGU+IGluc3RhbmNlIHVzaW5nIGEKLSAgICAgKiBuZXN0ZWQgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKiAgICAKLSAgICAgKiBAcGFyYW0gdCAgICAgICAgdGhlIG5lc3RlZCA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbn0gaW5zdGFuY2Ugd2l0aCBhIG5lc3RlZCB7QGNvZGUgVGhyb3dhYmxlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIG5lc3RlZCB7QGNvZGUgVGhyb3dhYmxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmFja2luZ1N0b3JlRXhjZXB0aW9uIChUaHJvd2FibGUgdCkgewogICAgICAgICBzdXBlcih0KTsKZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL0ZpbGVQcmVmZXJlbmNlc0ZhY3RvcnlJbXBsLmphdmEgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9GaWxlUHJlZmVyZW5jZXNGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDgzMGNmMzIuLmNjNjhlNjIgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL0ZpbGVQcmVmZXJlbmNlc0ZhY3RvcnlJbXBsLmphdmEKKysrIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvRmlsZVByZWZlcmVuY2VzRmFjdG9yeUltcGwuamF2YQpAQCAtMTcsMTAgKzE3LDEwIEBACiBwYWNrYWdlIGphdmEudXRpbC5wcmVmczsKIAogLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlByZWZlcmVuY2VzRmFjdG9yeTwvY29kZT4gZm9yIExpbnV4IAotICogcGxhdGZvcm0sIHVzaW5nIGZpbGUgc3lzdGVtIGFzIGJhY2sgZW5kLgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+UHJlZmVyZW5jZXNGYWN0b3J5PC9jb2RlPiBmb3IgdGhlIExpbnV4IAorICogcGxhdGZvcm0sIHVzaW5nIHRoZSBmaWxlIHN5c3RlbSBhcyBpdHMgYmFjayBlbmQuCiAgKiAKLSAqIEBzaW5jZSAxLjQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBjbGFzcyBGaWxlUHJlZmVyZW5jZXNGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFByZWZlcmVuY2VzRmFjdG9yeSB7CiAgICAgLy8gIHVzZXIgcm9vdCBwcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvRmlsZVByZWZlcmVuY2VzSW1wbC5qYXZhIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvRmlsZVByZWZlcmVuY2VzSW1wbC5qYXZhCmluZGV4IDczOTRjZWMuLmNmODVmYTAgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL0ZpbGVQcmVmZXJlbmNlc0ltcGwuamF2YQorKysgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9GaWxlUHJlZmVyZW5jZXNJbXBsLmphdmEKQEAgLTI4LDEyICsyOCwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5BYnN0cmFjdFByZWZlcmVuY2VzPC9jb2RlPiBmb3IgTGludXggcGxhdGZvcm0sCi0gKiB1c2luZyBmaWxlIHN5c3RlbSBhcyBiYWNrIGVuZC4KKyAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkFic3RyYWN0UHJlZmVyZW5jZXM8L2NvZGU+IGZvciB0aGUgTGludXggcGxhdGZvcm0sCisgKiB1c2luZyB0aGUgZmlsZSBzeXN0ZW0gYXMgaXRzIGJhY2sgZW5kLgogICogCiAgKiBUT0RPIHNvbWUgc3luYyBtZWNoYW5pc20gd2l0aCBiYWNrZW5kLCBQZXJmb3JtYW5jZSAtIGNoZWNrIGZpbGUgZWRpdCBkYXRlCiAgKiAKLSAqIEBzaW5jZSAxLjQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBjbGFzcyBGaWxlUHJlZmVyZW5jZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlcyB7CiAKZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL0ludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uLmphdmEKaW5kZXggYWM3OWUyZC4uYjMxYjNhMSAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uLmphdmEKKysrIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDQ0ICsxOCw0OSBAQAogcGFja2FnZSBqYXZhLnV0aWwucHJlZnM7CiAKIC8qKgotICogQW4gZXhjZXB0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlIGlucHV0IFhNTCBmaWxlIGlzIG5vdCB3ZWxsLWZvcm1lZCBvciAKLSAqIHZhbGlkYXRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGRvY3VtZW50IHR5cGUsIHdoaWNoIGlzIHNwZWNpZmllZCBieSAKLSAqIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPi4gCisgKiBBbiBleGNlcHRpb24gdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5wdXQgWE1MIGZpbGUgaXMgbm90IHdlbGwtZm9ybWVkIG9yIGNvdWxkCisgKiBub3QgYmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIGRvY3VtZW50IHR5cGUgKHNwZWNpZmllZCBieQorICogaW4gdGhlIHtAY29kZSBQcmVmZXJlbmNlc30pLgogICogCi0gKiBAc2VlIFByZWZlcmVuY2VzCi0gKgotICogQHNpbmNlIDEuNAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03OTE3MTUxODQyMzIxMTk2NjlMOwogICAgIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uPC9jb2RlPiBpbnN0YW5jZSB1c2luZyBhbiAKLSAgICAgKiBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb259IGluc3RhbmNlIHdpdGggYQorICAgICAqIGRldGFpbGVkIGV4Y2VwdGlvbiBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzICAgICB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWxlZCBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIChTdHJpbmcgcykgewogICAgICAgICBzdXBlcihzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbjwvY29kZT4gaW5zdGFuY2UgdXNpbmcgYSAKLSAgICAgKiBleGNlcHRpb24gbWVzc2FnZSBhbmQgYSBuZXN0ZWQgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb259IGluc3RhbmNlIHdpdGggYQorICAgICAqIGRldGFpbGVkIGV4Y2VwdGlvbiBtZXNzYWdlIGFuZCBhIG5lc3RlZCB7QGNvZGUgVGhyb3dhYmxlfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyAgICAgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgICAqIEBwYXJhbSB0ICAgICAgICB0aGUgbmVzdGVkIDxjb2RlPlRocm93YWJsZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWxlZCBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIG5lc3RlZCB7QGNvZGUgVGhyb3dhYmxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIChTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKICAgICAgICAgc3VwZXIocyx0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbjwvY29kZT4gaW5zdGFuY2UgdXNpbmcgYQotICAgICAqIG5lc3RlZCA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGluc3RhbmNlLgotICAgICAqICAgIAotICAgICAqIEBwYXJhbSB0ICAgICAgICB0aGUgbmVzdGVkIDxjb2RlPlRocm93YWJsZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9ufSBpbnN0YW5jZSB3aXRoIGEgbmVzdGVkCisgICAgICoge0Bjb2RlIFRocm93YWJsZX0uCisgICAgICogCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXN0ZWQge0Bjb2RlIFRocm93YWJsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiAoVGhyb3dhYmxlIHQpIHsKICAgICAgICAgc3VwZXIodCk7CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9Ob2RlQ2hhbmdlRXZlbnQuamF2YSBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VFdmVudC5qYXZhCmluZGV4IGQ0MWZiZDIuLmU5ODI0YmMgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VFdmVudC5qYXZhCisrKyBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VFdmVudC5qYXZhCkBAIC0yNSwxNiArMjUsMTQgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoaXMgaXMgdGhlIGV2ZW50IGNsYXNzIHRvIGluZGljYXRlIG9uZSBjaGlsZCBvZiB0aGUgcHJlZmVyZW5jZXMgbm9kZSBoYXMgCisgKiBUaGlzIGlzIHRoZSBldmVudCBjbGFzcyB0byBpbmRpY2F0ZSB0aGF0IG9uZSBjaGlsZCBvZiB0aGUgcHJlZmVyZW5jZSBub2RlIGhhcwogICogYmVlbiBhZGRlZCBvciBkZWxldGVkLgogICogPHA+Ci0gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgY2xhc3MgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYWN0dWFsbHksIHNvIHJlbGV2YW50IAotICogc2VyaWFsaXphdGlvbiBtZXRob2RzIG9ubHkgdGhyb3cgPGNvZGU+Tm90U2VyaWFsaXphYmxlRXhjZXB0aW9uPC9jb2RlPi48L3A+CisgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzZXJpYWxpemF0aW9uIGZ1bmN0aW9uYWxpdHkgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCwgc28KKyAqIHRoZSBzZXJpYWxpemF0aW9uIG1ldGhvZHMgZG8gbm90aGluZyBidXQgdGhyb3cgYSB7QGNvZGUgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9ufS4KKyAqIDwvcD4KICAqIAotICogQHNlZSBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMKLSAqIEBzZWUgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcgotICogCi0gKiBAc2luY2UgMS40CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE5vZGVDaGFuZ2VFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKICAgICAKQEAgLTQ0LDEyICs0MiwxNCBAQAogICAgIHByaXZhdGUgZmluYWwgUHJlZmVyZW5jZXMgY2hpbGQ7CiAgICAgCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPk5vZGVDaGFuZ2VFdmVudDwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTm9kZUNoYW5nZUV2ZW50fSBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCAgICAgICAgdGhlIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHRoaXMgZXZlbnQgaGFwcGVuZWQsIAotICAgICAqICAgICAgICAgICAgICAgICB0aGlzIG9iamVjdCBpcyBjb25zaWRlcmVkIGFzIGV2ZW50J3Mgc291cmNlLgotICAgICAqIEBwYXJhbSBjICAgICAgICB0aGUgY2hpbGQgPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IGluc3RhbmNlIHRoYXQgd2FzIGFkZGVkIAotICAgICAqICAgICAgICAgICAgICAgICBvciBkZWxldGVkLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFByZWZlcmVuY2VzfSBpbnN0YW5jZSB0aGF0IGZpcmVkIHRoaXMgZXZlbnQ7IHRoaXMgb2JqZWN0IGlzCisgICAgICogICAgICAgICAgICBjb25zaWRlcmVkIGFzIHRoZSBldmVudCBzb3VyY2UuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGlsZCB7QGNvZGUgUHJlZmVyZW5jZXN9IGluc3RhbmNlIHRoYXQgd2FzIGFkZGVkIG9yIGRlbGV0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5vZGVDaGFuZ2VFdmVudCAoUHJlZmVyZW5jZXMgcCwgUHJlZmVyZW5jZXMgYykgewogICAgICAgICBzdXBlcihwKTsKQEAgLTU4LDM0ICs1OCwzNiBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHRoaXMgZXZlbnQgaGFwcGVuZWQuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIFByZWZlcmVuY2VzfSBpbnN0YW5jZSB0aGF0IGZpcmVkIHRoaXMgZXZlbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiAgICAgICAgdGhlIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHRoaXMgZXZlbnQgaGFwcGVuZWQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFByZWZlcmVuY2VzfSBpbnN0YW5jZSB0aGF0IGZpcmVkIHRoaXMgZXZlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByZWZlcmVuY2VzIGdldFBhcmVudCgpIHsKICAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGlsZCA8Y29kZT5QcmVmZXJlbmNlczwvY29kZT4gbm9kZSB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgorICAgICAqIEdldHMgdGhlIGNoaWxkIHtAY29kZSBQcmVmZXJlbmNlc30gbm9kZSB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gICAgICAgIHRoZSBjaGlsZCA8Y29kZT5QcmVmZXJlbmNlczwvY29kZT4gbm9kZSB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLgorICAgICAqIEByZXR1cm4gdGhlIGFkZGVkIG9yIHJlbW92ZWQgY2hpbGQge0Bjb2RlIFByZWZlcmVuY2VzfSBub2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmVmZXJlbmNlcyBnZXRDaGlsZCgpIHsKICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgIH0KICAgICAKICAgICAvKgotICAgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYSA8Y29kZT5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb248L2NvZGU+LCBiZWNhdXNlIAotICAgICAqIHRoaXMgb2JqZWN0IGNhbm5vdCBiZSBzZXJpYWxpemVkLCAgCisgICAgICogVGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIDxjb2RlPk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjwvY29kZT4sCisgICAgICogYmVjYXVzZSB0aGlzIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCwKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QgKE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oKTsKICAgICB9CiAgICAgCiAgICAgLyoKLSAgICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGEgPGNvZGU+Tm90U2VyaWFsaXphYmxlRXhjZXB0aW9uPC9jb2RlPiwgYmVjYXVzZSAKLSAgICAgKiB0aGlzIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCwgIAorICAgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYSA8Y29kZT5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb248L2NvZGU+LAorICAgICAqIGJlY2F1c2UgdGhpcyBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQsCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QgKE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKCk7CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9Ob2RlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmluZGV4IDAzMmZjMTYuLmYxNmIyMDYgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCkBAIC0yMSwyNiArMjEsMzEgQEAKIGltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50OwogCiAvKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gaGFuZGxlIHByZWZlcmVuY2VzIG5vZGUgY2hhbmdlIGV2ZW50LiBJbXBsZW1lbnRhdGlvbiAKLSAqIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBpbnN0YWxsZWQgYnkgPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IGluc3RhbmNlLgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBoYW5kbGUgcHJlZmVyZW5jZSBub2RlIGNoYW5nZSBldmVudHMuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIGluc3RhbGxlZCBieSB0aGUge0Bjb2RlIFByZWZlcmVuY2VzfSBpbnN0YW5jZS4KICAqIAotICogQHNlZSBQcmVmZXJlbmNlcwogICogQHNlZSBOb2RlQ2hhbmdlRXZlbnQKICAqIAotICogQHNpbmNlIDEuNAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTm9kZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuZXZlciBhIGNoaWxkIGlzIGFkZGVkIHRvIGEgbm9kZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuZXZlciBhIGNoaWxkIG5vZGUgaXMgYWRkZWQgdG8gYW5vdGhlciBub2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIE5vZGUgY2hhbmdlIGV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSBjaGFuZ2UgZXZlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hpbGRBZGRlZCAoTm9kZUNoYW5nZUV2ZW50IGUpOwogICAgIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW5ldmVyIGEgY2hpbGQgaXMgcmVtb3ZlZCBmcm9tIGEgbm9kZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuZXZlciBhIGNoaWxkIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIGFub3RoZXIKKyAgICAgKiBub2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIE5vZGUgY2hhbmdlIGV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSBjaGFuZ2UgZXZlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hpbGRSZW1vdmVkIChOb2RlQ2hhbmdlRXZlbnQgZSk7CiB9CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9Ob2RlU2V0LmphdmEgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9Ob2RlU2V0LmphdmEKaW5kZXggMjAyYjkwYi4uN2VkZDAzMCAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvTm9kZVNldC5qYXZhCisrKyBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL05vZGVTZXQuamF2YQpAQCAtNiw2ICs2LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKKy8qKgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLyAKIGNsYXNzIE5vZGVTZXQgaW1wbGVtZW50cyBOb2RlTGlzdCB7CiAKICAgICBBcnJheUxpc3Q8Tm9kZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VDaGFuZ2VFdmVudC5qYXZhIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZUNoYW5nZUV2ZW50LmphdmEKaW5kZXggZmYzZjlhMi4uZjBmMDc4NyAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZUNoYW5nZUV2ZW50LmphdmEKKysrIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZUNoYW5nZUV2ZW50LmphdmEKQEAgLTI1LDE3ICsyNSwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKIAogLyoqCi0gKiBUaGlzIGlzIHRoZSBldmVudCBjbGFzcyB0byBpbmRpY2F0ZSBzb21lIHByZWZlcmVuY2VzIGhhcyBiZWVuIGFkZGVkLCAKLSAqIGRlbGV0ZWQgb3IgdXBkYXRlZC4KKyAqIFRoaXMgaXMgdGhlIGV2ZW50IGNsYXNzIHRvIGluZGljYXRlIHRoYXQgYSBwcmVmZXJlbmNlIGhhcyBiZWVuIGFkZGVkLCBkZWxldGVkCisgKiBvciB1cGRhdGVkLgogICogPHA+Ci0gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgY2xhc3MgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYWN0dWFsbHksIHNvIHJlbGV2YW50IAotICogc2VyaWFsaXphdGlvbiBtZXRob2RzIG9ubHkgdGhyb3cgPGNvZGU+Tm90U2VyaWFsaXphYmxlRXhjZXB0aW9uPC9jb2RlPi4KKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25hbGl0eSBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLCBzbworICogdGhlIHNlcmlhbGl6YXRpb24gbWV0aG9kcyBkbyBub3RoaW5nIGJ1dCB0aHJvdyBhIHtAY29kZSBOb3RTZXJpYWxpemFibGVFeGNlcHRpb259LgogICogPC9wPgogICogCi0gKiBAc2VlIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcwotICogQHNlZSBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyCi0gKiAKLSAqIEBzaW5jZSAxLjQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCkBAIC00OCwxMyArNDUsMTcgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB7QGNvZGUgUHJlZmVyZW5jZUNoYW5nZUV2ZW50fSBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCAgICAgICAgdGhlIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHRoaXMgZXZlbnQgaGFwcGVuZWQsIAotICAgICAqICAgICAgICAgICAgICAgICB0aGlzIG9iamVjdCBpcyBjb25zaWRlcmVkIGFzIGV2ZW50J3Mgc291cmNlLgotICAgICAqIEBwYXJhbSBrICAgICAgICB0aGUgY2hhbmdlZCBwcmVmZXJlbmNlJ3Mga2V5Ci0gICAgICogQHBhcmFtIHYgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJlZmVyZW5jZSwgdGhpcyB2YWx1ZSBjYW4gYmUgbnVsbCwgCi0gICAgICogICAgICAgICAgICAgICAgIHdoaWNoIG1lYW5zIHRoZSBwcmVmZXJlbmNlIGlzIHJlbW92ZWQuCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJlZmVyZW5jZXN9IGluc3RhbmNlIHRoYXQgZmlyZWQgdGhpcyBldmVudDsgdGhpcyBvYmplY3QgaXMKKyAgICAgKiAgICAgICAgICAgIGNvbnNpZGVyZWQgYXMgdGhlIGV2ZW50J3Mgc291cmNlLgorICAgICAqIEBwYXJhbSBrCisgICAgICogICAgICAgICAgICB0aGUgY2hhbmdlZCBwcmVmZXJlbmNlIGtleS4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2hhbmdlZCBwcmVmZXJlbmNlLCB0aGlzIHZhbHVlIGNhbiBiZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIG51bGx9LCB3aGljaCBtZWFucyB0aGUgcHJlZmVyZW5jZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmVmZXJlbmNlQ2hhbmdlRXZlbnQoUHJlZmVyZW5jZXMgcCwgU3RyaW5nIGssIFN0cmluZyB2KSB7CiAgICAgICAgIHN1cGVyKHApOwpAQCAtNjQsNDUgKzY1LDQ4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFuZ2VkIHByZWZlcmVuY2UncyBrZXkuCisgICAgICogR2V0cyB0aGUga2V5IG9mIHRoZSBjaGFuZ2VkIHByZWZlcmVuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhbmdlZCBwcmVmZXJlbmNlJ3Mga2V5CisgICAgICogQHJldHVybiB0aGUgY2hhbmdlZCBwcmVmZXJlbmNlJ3Mga2V5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewogICAgICAgICByZXR1cm4ga2V5OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByZWZlcmVuY2UsIG9yIG51bGwgaWYgdGhpcyBwcmVmZXJlbmNlIAotICAgICAqIGlzIHJlbW92ZWQuCisgICAgICogR2V0cyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByZWZlcmVuY2Ugb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqIHByZWZlcmVuY2UgaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJlZmVyZW5jZSwgb3IgbnVsbCBpZiB0aGlzIHByZWZlcmVuY2UgCi0gICAgICogaXMgcmVtb3ZlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJlZmVyZW5jZSBvciBudWxsIGlmIHRoZSBwcmVmZXJlbmNlCisgICAgICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3VmFsdWUoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHRoaXMgZXZlbnQgaGFwcGVuZWQuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIFByZWZlcmVuY2VzfSBpbnN0YW5jZSB0aGF0IGZpcmVkIHRoaXMgZXZlbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IGluc3RhbmNlIHRoYXQgdGhpcyBldmVudCBoYXBwZW5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUHJlZmVyZW5jZXN9IGluc3RhbmNlIHRoYXQgZmlyZWQgdGhpcyBldmVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0Tm9kZSgpIHsKICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGEgPGNvZGU+Tm90U2VyaWFsaXphYmxlRXhjZXB0aW9uPC9jb2RlPiwgYmVjYXVzZSAKLSAgICAgKiB0aGlzIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCwgIAorICAgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYSA8Y29kZT5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb248L2NvZGU+LAorICAgICAqIGJlY2F1c2UgdGhpcyBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQsCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKgotICAgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYSA8Y29kZT5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb248L2NvZGU+LCBiZWNhdXNlIAotICAgICAqIHRoaXMgb2JqZWN0IGNhbm5vdCBiZSBzZXJpYWxpemVkLCAgCisgICAgICogVGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIDxjb2RlPk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjwvY29kZT4sCisgICAgICogYmVjYXVzZSB0aGlzIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCwKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uewogICAgICAgICB0aHJvdyBuZXcgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKCk7CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCmluZGV4IDJkZGIxNjkuLjI4YmI3NjMgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCkBAIC0yMCwyMyArMjAsMjMgQEAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAogLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGhhbmRsZSBwcmVmZXJlbmNlcyBjaGFuZ2UgZXZlbnQuIEltcGxlbWVudGF0aW9uIAotICogb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIGluc3RhbGxlZCBieSA8Y29kZT5QcmVmZXJlbmNlczwvY29kZT4gaW5zdGFuY2UuCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGhhbmRsZSBwcmVmZXJlbmNlcyBjaGFuZ2UgZXZlbnRzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YKKyAqIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBpbnN0YWxsZWQgYnkgdGhlIHtAY29kZSBQcmVmZXJlbmNlc30gaW5zdGFuY2UuCiAgKiAKLSAqIEBzZWUgUHJlZmVyZW5jZXMKICAqIEBzZWUgUHJlZmVyZW5jZUNoYW5nZUV2ZW50Ci0gKgogICogCi0gKiBAc2luY2UgMS40CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKICAgICAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGludm9rZWQgd2hlbmV2ZXIgc29tZSBwcmVmZXJlbmNlIGlzIGFkZGVkLCBkZWxldGVkIG9yIAorICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCB3aGVuZXZlciBhIHByZWZlcmVuY2UgaXMgYWRkZWQsIGRlbGV0ZWQgb3IKICAgICAgKiB1cGRhdGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwY2UgICAgIHRoZSBldmVudCBpbnN0YW5jZSB3aGljaCBkZXNjcmliZXMgdGhlIGNoYW5nZWQgUHJlZmVyZW5jZXMgCi0gICAgICogICAgICAgICAgICAgICAgIGluc3RhbmNlIGFuZCBwcmVmZXJlbmNlcyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcGNlCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgaW5zdGFuY2Ugd2hpY2ggZGVzY3JpYmVzIHRoZSBjaGFuZ2VkIHtAY29kZSBQcmVmZXJlbmNlc30KKyAgICAgKiAgICAgICAgICAgIGluc3RhbmNlIGFuZCB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICB2b2lkIHByZWZlcmVuY2VDaGFuZ2UgKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBwY2UpOwogfQpkaWZmIC0tZ2l0IGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXMuamF2YSBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzLmphdmEKaW5kZXggZDgyYWQxZS4uYjdhMGM3MCAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXMuamF2YQorKysgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9QcmVmZXJlbmNlcy5qYXZhCkBAIC0xNiw4MSArMTYsNzYgQEAKIAogcGFja2FnZSBqYXZhLnV0aWwucHJlZnM7CiAKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisvLyBFTkQgYW5kcm9pZC1hZGRlZAorCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IGluc3RhbmNlIHJlcHJlc2VudHMgb25lIG5vZGUgaW4gcHJlZmVyZW5jZXMgdHJlZSwKLSAqIHdoaWNoIHByb3ZpZGUgYSBtZWNoYW5pc21zIHRvIHN0b3JlIGFuZCBhY2Nlc3MgY29uZmlndXJhdGlvbiBkYXRhIGluIGEKLSAqIGhpZXJhcmNoaWNhbCB3YXkuIFR3byBoaWVyYXJjaHkgdHJlZSBpcyBtYWludGFpbmVkLCBvbmUgZm9yIHN5c3RlbQotICogcHJlZmVyZW5jZXMgc2hhcmVkIGJ5IGFsbCB1c2VycywgYW5kIHRoZSBvdGhlciBmb3IgdXNlciBwcmVmZXJlbmNlcyB3aGljaCBpcwotICogc3BlY2lmaWMgZm9yIGVhY2ggdXNlci4gUHJlZmVyZW5jZXMgaGllcmFyY2h5IHRyZWUgYW5kIGRhdGEgaXMgc3RvcmVkCi0gKiBwcmVjaXNlbHkgaW4gaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IGJhY2tlbmQsIGFuZCB1c2VyIGRvZXNuJ3QgbmVlZCB0byBjYXJlCi0gKiBhYm91dCB0aGUgZGV0YWlscy4KKyAqIEFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB7QGNvZGUgUHJlZmVyZW5jZXN9IHJlcHJlc2VudHMgb25lIG5vZGUgaW4gYSBwcmVmZXJlbmNlIHRyZWUsCisgKiB3aGljaCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBzdG9yZSBhbmQgYWNjZXNzIGNvbmZpZ3VyYXRpb24gZGF0YSBpbiBhCisgKiBoaWVyYXJjaGljYWwgd2F5LiBUd28gaGllcmFyY2h5IHRyZWVzIGFyZSBtYWludGFpbmVkLCBvbmUgZm9yIHN5c3RlbQorICogcHJlZmVyZW5jZXMgc2hhcmVkIGJ5IGFsbCB1c2VycyBhbmQgdGhlIG90aGVyIGZvciB1c2VyIHByZWZlcmVuY2VzIAorICogc3BlY2lmaWMgdG8gdGhlIHVzZXIuIHtAY29kZSBQcmVmZXJlbmNlc30gaGllcmFyY2h5IHRyZWVzIGFuZCBkYXRhIGFyZSBzdG9yZWQKKyAqIGluIGFuIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBiYWNrLWVuZC4KICAqIDxwPgotICogRXZlcnkgbm9kZSBoYXMgb25lIG5hbWUgYW5kIG9uZSB1bmlxdWUgYWJzb2x1dGUgcGF0aCBpbiBhIHNpbWlsYXIgd2F5IHdpdGgKLSAqIGRpcmVjdG9yaWVzIGluIGZpbGUgc3lzdGVtLiBUaGUgcm9vdCBub2RlJ3MgbmFtZSBpcyAiIiwgYW5kIG90aGVyIG5vZGVzJyBuYW1lCi0gKiBzdHJpbmcgY2Fubm90IGNvbnRhaW5zIHNsYXNoIGFuZCBjYW5ub3QgYmUgZW1wdHkuIFRoZSByb290IG5vZGUncyBhYnNvbHV0ZQotICogcGF0aCBpcyAiLyIsIGFuZCBvdGhlciBub2RlcycgYWJzb2x1dGUgcGF0aCBlcXVhbHMgJmx0O3BhcmVudCdzIGFic29sdXRlCi0gKiBwYXRoJmd0OyArICIvIiArICZsdDtub2RlJ3MgbmFtZSZndDsuIEFsbCBhYnNvbHV0ZSBwYXRocyBzdGFydCB3aXRoIHNsYXNoLgotICogRXZlcnkgbm9kZSBoYXMgb25lIHJlbGF0aXZlIHBhdGggdG8gb25lIG9mIGl0cyBhbmNlc3Rvci4gUmVsYXRpdmUgcGF0aAotICogZG9lc24ndCBzdGFydCB3aXRoIHNsYXNoLCBhbmQgZXF1YWxzIHRvIGFic29sdXRlIHBhdGggd2hlbiBmb2xsb3dpbmcgYWZ0ZXIKLSAqIGFuY2VzdG9yJ3MgYWJzb2x1dGUgcGF0aCBhbmQgYSBzbGFzaC4KKyAqIEV2ZXJ5IG5vZGUgaGFzIG9uZSBuYW1lIGFuZCBvbmUgdW5pcXVlIGFic29sdXRlIHBhdGggZm9sbG93aW5nIHRoZSBzYW1lIAorICogbm90YXRpb25hbCBjb252ZW50aW9ucyBhcyBkaXJlY3RvcmllcyBpbiBhIGZpbGUgc3lzdGVtLiBUaGUgcm9vdCBub2RlJ3MgCisgKiBuYW1lIGlzICIiLCBhbmQgb3RoZXIgbm9kZSBuYW1lIHN0cmluZ3MgY2Fubm90IGNvbnRhaW4gdGhlIHNsYXNoIGNoYXJhY3RlciAKKyAqIGFuZCBjYW5ub3QgYmUgZW1wdHkuIFRoZSByb290IG5vZGUncyBhYnNvbHV0ZSBwYXRoIGlzICIvIiwgYW5kIGFsbCBvdGhlciAKKyAqIG5vZGVzJyBhYnNvbHV0ZSBwYXRocyBhcmUgY29uc3RydWN0ZWQgaW4gdGhlIHN0YW5kYXJkIHdheTogJmx0O3BhcmVudCdzIGFic29sdXRlCisgKiBwYXRoJmd0OyArICIvIiArICZsdDtub2RlJ3MgbmFtZSZndDsuIFNpbmNlIHRoZSBzZXQgb2Ygbm9kZXMgZm9ybXMgYSB0cmVlIHdpdGggCisgKiB0aGUgcm9vdCBub2RlIGF0IGl0cyBiYXNlLCBhbGwgYWJzb2x1dGUgcGF0aHMgc3RhcnQgd2l0aCB0aGUgc2xhc2ggY2hhcmFjdGVyLgorICogRXZlcnkgbm9kZSBoYXMgb25lIHJlbGF0aXZlIHBhdGggdG8gZWFjaCBvZiBpdHMgYW5jZXN0b3JzLiBUaGUgcmVsYXRpdmUgcGF0aAorICogZG9lc24ndCBzdGFydCB3aXRoIHNsYXNoOiBpdCBlcXVhbHMgdGhlIG5vZGUncyBhYnNvbHV0ZSBwYXRoIHdpdGggbGVhZGluZyAKKyAqIHN1YnN0cmluZyByZW1vdmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFuY2VzdG9yJ3MgYWJzb2x1dGUgcGF0aCBhbmQgYSBzbGFzaC4KICAqIDwvcD4KICAqIDxwPgotICogVGhlIG1vZGlmaWNhdGlvbiB0byBwcmVmZXJlbmNlcyBkYXRhIG1heSBiZSBhc3luY2hyb25vdXMsIHdoaWNoIG1lYW5zIHRoZXkKLSAqIG1heSBkb24ndCBibG9jayBhbmQgbWF5IHJldHVybnMgaW1tZWRpYXRlbHksIGltcGxlbWVudGF0aW9uIGNhbiBmZWVsIGZyZWUgdG8KLSAqIHRoZSBtb2RpZmljYXRpb25zIHRvIHRoZSBiYWNrZW5kIGluIGFueSB0aW1lIHVudGlsIHRoZSBmbHVzaCgpIG9yIHN5bmMoKQotICogbWV0aG9kIGlzIGludm9rZWQsIHRoZXNlIHR3byBtZXRob2RzIGZvcmNlIHN5bmNocm9uaXplZCB1cGRhdGVzIHRvIGJhY2tlbmQuCisgKiBNb2RpZmljYXRpb24gdG8gcHJlZmVyZW5jZXMgZGF0YSBtYXkgYmUgYXN5bmNocm9ub3VzLCB3aGljaCBtZWFucyB0aGF0IAorICogcHJlZmVyZW5jZSB1cGRhdGUgbWV0aG9kIGNhbGxzIG1heSByZXR1cm4gaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiBibG9ja2luZy4gCisgKiBUaGUge0Bjb2RlIGZsdXNoKCl9IGFuZCB7QGNvZGUgc3luYygpfSBtZXRob2RzIGZvcmNlIHRoZSBiYWNrLWVuZCB0byAKKyAqIHN5bmNocm9ub3VzbHkgcGVyZm9ybSBhbGwgcGVuZGluZyB1cGRhdGVzLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIAorICogcGVybWl0dGVkIHRvIHBlcmZvcm0gdGhlIG1vZGlmaWNhdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgYmFjay1lbmQgZGF0YSAKKyAqIGF0IGFueSB0aW1lIGJldHdlZW4gdGhlIG1vbWVudCB0aGUgcmVxdWVzdCBpcyBtYWRlIGFuZCB0aGUgbW9tZW50IHRoZSAKKyAqIHtAY29kZSBmbHVzaCgpfSBvciB7QGNvZGUgc3luYygpfSBtZXRob2QgcmV0dXJucy4KICAqIFBsZWFzZSBub3RlIHRoYXQgaWYgSlZNIGV4aXQgbm9ybWFsbHksIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGFzc3VyZSBhbGwKICAqIG1vZGlmaWNhdGlvbnMgYXJlIHBlcnNpc3RlZCBpbXBsaWNpdGx5LgogICogPC9wPgogICogPHA+Ci0gKiBVc2VyIGludm9raW5nIG1ldGhvZHMgdGhhdCByZXRyaWV2ZSBwcmVmZXJlbmNlcyBtdXN0IHByb3ZpZGUgZGVmYXVsdCB2YWx1ZSwKLSAqIGRlZmF1bHQgdmFsdWUgaXMgcmV0dXJuZWQgd2hlbiBwcmVmZXJlbmNlcyBjYW5ub3QgYmUgZm91bmQgb3IgYmFja2VuZCBpcwotICogdW5hdmFpbGFibGUuIFNvbWUgb3RoZXIgbWV0aG9kcyB3aWxsIHRocm93IDxjb2RlPkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjwvY29kZT4KLSAqIHdoZW4gYmFja2VuZCBpcyB1bmF2YWlsYWJsZS4KKyAqIFdoZW4gaW52b2tpbmcgYSBtZXRob2QgdGhhdCByZXRyaWV2ZXMgcHJlZmVyZW5jZXMsIHRoZSB1c2VyIG11c3QgcHJvdmlkZSAKKyAqIGEgZGVmYXVsdCB2YWx1ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcHJlZmVyZW5jZXMgY2Fubm90IAorICogYmUgZm91bmQgb3IgdGhlIGJhY2stZW5kIGlzIHVuYXZhaWxhYmxlLiBTb21lIG90aGVyIG1ldGhvZHMgd2lsbCB0aHJvdyAKKyAqIHtAY29kZSBCYWNraW5nU3RvcmVFeGNlcHRpb259IHdoZW4gdGhlIGJhY2stZW5kIGlzIHVuYXZhaWxhYmxlLgogICogPC9wPgogICogPHA+Ci0gKiBQcmVmZXJlbmNlcyBjYW4gYmUgZXhwb3J0IHRvL2ltcG9ydCBmcm9tIFhNTCBmaWxlcywgdGhlIFhNTCBkb2N1bWVudCBtdXN0Ci0gKiBoYXZlIHRoZSBmb2xsb3dpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbjoKKyAqIFByZWZlcmVuY2VzIGNhbiBiZSBleHBvcnRlZCB0byBhbmQgaW1wb3J0ZWQgZnJvbSBhbiBYTUwgZmlsZXMuCisgKiA8cD4KKyAqIFRoZXJlIG11c3QgYmUgYSBjb25jcmV0ZSB7QGNvZGUgUHJlZmVyZW5jZXNGYWN0b3J5fSB0eXBlIGZvciBldmVyeSBjb25jcmV0ZQorICoge0Bjb2RlIFByZWZlcmVuY2VzfSB0eXBlIGRldmVsb3BlZC4gRXZlcnkgSjJTRSBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0CisgKiBpbXBsZW1lbnRhdGlvbiBmb3IgZXZlcnkgc3VwcG9ydGVkIHBsYXRmb3JtLCBhbmQgbXVzdCBhbHNvIHByb3ZpZGUgYSBtZWFucyBvZgorICogcmVwbGFjaW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIHN5c3RlbSBwcm9wZXJ0eQorICoge0Bjb2RlIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlc0ZhY3Rvcnl9IHRvIGRldGVtaW5lIHdoaWNoIHByZWZlcmVuY2VzIAorICogaW1wbGVtZW50YXRpb24gdG8gdXNlLgogICogPC9wPgogICogPHA+Ci0gKiA8IURPQ1RZUEUgcHJlZmVyZW5jZXMgU1lTVEVNICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcmVmZXJlbmNlcy5kdGQiPgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHN5c3RlbSBVUkkgaXMgbm90IHJlYWxseSBhY2Nlc3NlZCBieSBuZXR3b3JrLCBpdCBpcyBvbmx5IGEKLSAqIGlkZW50aWZpY2F0aW9uIHN0cmluZy4gVmlzaXQgdGhlIERURCBsb2NhdGlvbiB0byBzZWUgdGhlIGFjdHVhbCBmb3JtYXQKLSAqIHBlcm1pdHRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlcmUgaGFzIHRvIGJlIGEgY29uY3JldGUgPGNvZGU+UHJlZmVyZW5jZXNGYWN0b3J5PC9jb2RlPiB0eXBlIGZvciBldmVyeQotICogY29uY3JldGUgPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IHR5cGUgZGV2ZWxvcGVkLiBFdmVyeSBKMlNFIGltcGxlbWVudGF0aW9uCi0gKiBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBldmVyeSBzdXBwb3J0ZWQgcGxhdGZvcm0sIGFuZCB0aGUKLSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FuIGJlIHJlcGxhY2VkIGluIHNvbWUgd2F5LiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAqIHN5c3RlbSBwcm9wZXJ0eSBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXNGYWN0b3J5IHRvIGRpY3RhdGUgdGhlIHByZWZlcmVuY2VzCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogTWV0aG9kcyBvZiB0aGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlLiBJZiBtdWx0aSBKVk1zIHVzaW5nIHNhbWUgYmFja2VuZAotICogY29uY3VycmVudGx5LCB0aGUgYmFja2VuZCB3b24ndCBiZSBjb3JydXB0ZWQsIGJ1dCBubyBvdGhlciBndWFyYW50ZWVzIGlzCi0gKiBtYWRlLgorICogVGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBhcmUgdGhyZWFkLXNhZmUuIElmIG11bHRpcGxlIEpWTXMgYXJlIHVzaW5nIHRoZSBzYW1lCisgKiBiYWNrLWVuZCBjb25jdXJyZW50bHksIHRoZSBiYWNrLWVuZCB3b24ndCBiZSBjb3JydXB0ZWQsIGJ1dCBubyBvdGhlcgorICogYmVoYXZpb3IgZ3VhcmFudGVlcyBhcmUgbWFkZS4KICAqIDwvcD4KICAqIAotICogQHNlZSBQcmVmZXJlbmNlc0ZhY3RvcnkKLSAqIAotICogQHNpbmNlIDEuNAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlcyB7CiAgICAgCkBAIC0xMDEsMzYgKzk2LDQzIEBACiAgICAgICovCiAgICAgCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBzaXplIGluIGNoYXJhY3RlcnMgb2YgcHJlZmVyZW5jZXMga2V5ICAKKyAgICAgKiBNYXhpbXVtIHNpemUgaW4gY2hhcmFjdGVycyBhbGxvd2VkIGZvciBhIHByZWZlcmVuY2VzIGtleS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfS0VZX0xFTkdUSCA9IDgwOwogICAgIAogICAgIC8qKgotICAgICAqIE1heGltdW0gc2l6ZSBpbiBjaGFyYWN0ZXJzIG9mIHByZWZlcmVuY2VzIG5hbWUKKyAgICAgKiBNYXhpbXVtIHNpemUgaW4gY2hhcmFjdGVycyBhbGxvd2VkIGZvciBhIHByZWZlcmVuY2VzIG5hbWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05BTUVfTEVOR1RIID0gODA7CiAgICAgCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBzaXplIGluIGNoYXJhY3RlcnMgb2YgcHJlZmVyZW5jZXMgdmFsdWUKKyAgICAgKiBNYXhpbXVtIHNpemUgaW4gY2hhcmFjdGVycyBhbGxvd2VkIGZvciBhIHByZWZlcmVuY2VzIHZhbHVlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9WQUxVRV9MRU5HVEggPSA4MTkyOwotICAgIAorCiAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIC8qKgotICAgICAqIHRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgd2hlcmUgcHJlZmVyZW5jZXMgZmFjdG9yeSBjbGFzcyBuYW1lcyAKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdoZXJlIHByZWZlcmVuY2VzIGZhY3RvcnkgY2xhc3MgbmFtZXMKICAgICAgKiBjYW4gYmUgc3BlY2lmaWVkLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NPTkZJR1VSQVRJT05fRklMRV9OQU1FID0gIk1FVEEtSU5GL3NlcnZpY2VzL2phdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlc0ZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAKKwogICAgIC8qKgotICAgICAqIHRoZSBlbmNvZGluZyBvZiBjb25maWd1cmF0aW9uIGZpbGVzCisgICAgICogVGhlIGVuY29kaW5nIG9mIGNvbmZpZ3VyYXRpb24gZmlsZXMKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9GSUxFX0VOQ09ESU5HID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogdGhlIGNvbW1lbnQgc3RyaW5nIHVzZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcworICAgICAqIFRoZSBjb21tZW50IHN0cmluZyB1c2VkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9GSUxFX0NPTU1FTlQgPSAiIyI7IC8vJE5PTi1OTFMtMSQKKwogICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICAvL3Blcm1pc3Npb24KQEAgLTE1Miw3MCArMTU0LDY4IEBACiAgICAgICAgIH0pOwogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKICAgICAgICAgLy8gaWYoZmFjdG9yeUNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgIC8vICAgICB0cnkgewotICAgICAgICAvLyAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIC8vICAgICAgICAgaWYobG9hZGVyID09IG51bGwpewotICAgICAgICAvLyAgICAgICAgICAgICBsb2FkZXIgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwotICAgICAgICAvLyAgICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgICBDbGFzczw/PiBmYWN0b3J5Q2xhc3MgPSBsb2FkZXIubG9hZENsYXNzKGZhY3RvcnlDbGFzc05hbWUpOwotICAgICAgICAvLyAgICAgICAgIGZhY3RvcnkgPSAoUHJlZmVyZW5jZXNGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgLy8gICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vICAgICAgICAgLy8gcHJlZnMuMTA9Q2Fubm90IGluaXRpYXRlIFByZWZlcmVuY2VzRmFjdG9yeTogezB9LiBDYXVzZWQgYnkgezF9CisgICAgICAgIC8vIHRyeSB7CisgICAgICAgIC8vIENsYXNzTG9hZGVyIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIC8vIGlmKGxvYWRlciA9PSBudWxsKXsKKyAgICAgICAgLy8gbG9hZGVyID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBDbGFzczw/PiBmYWN0b3J5Q2xhc3MgPSBsb2FkZXIubG9hZENsYXNzKGZhY3RvcnlDbGFzc05hbWUpOworICAgICAgICAvLyBmYWN0b3J5ID0gKFByZWZlcmVuY2VzRmFjdG9yeSkgZmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIC8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIC8vIHByZWZzLjEwPUNhbm5vdCBpbml0aWF0ZSBQcmVmZXJlbmNlc0ZhY3Rvcnk6IHswfS4gQ2F1c2VkIGJ5IHsxfQogICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKE1lc3NhZ2VzLmdldFN0cmluZygicHJlZnMuMTAiLCBmYWN0b3J5Q2xhc3NOYW1lLCBlKSk7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLyAgICAgfQorICAgICAgICAvLyB9CiAgICAgICAgIC8vIH0KICAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmKGxvYWRlciA9PSBudWxsKXsKKyAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICBsb2FkZXIgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwogICAgICAgICB9Ci0gICAgICAgIGlmKGZhY3RvcnlDbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICBpZiAoZmFjdG9yeUNsYXNzTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBFbnVtZXJhdGlvbjxVUkw+IGVuID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgZW4gPSBsb2FkZXIuZ2V0UmVzb3VyY2VzKEZBQ1RPUllfQ09ORklHVVJBVElPTl9GSUxFX05BTUUpOwogICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgaW50IGNvbW1lbnRJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGVuLm5leHRFbGVtZW50KCkub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIGVhY2ggbGluZSBmb3IgY2hhcnNldCBwcm92aWRlciBjbGFzcyBuYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHVVJBVElPTl9GSUxFX0VOQ09ESU5HKSwgODE5Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLW1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzc05hbWUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudEluZGV4ID0gZmFjdG9yeUNsYXNzTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YoQ09ORklHVVJBVElPTl9GSUxFX0NPTU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICBpZihjb21tZW50SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3NOYW1lID0gZmFjdG9yeUNsYXNzTmFtZS5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudEluZGV4KS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYoZmFjdG9yeUNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGEgcmVzb3VyY2UgY291bGRuJ3QgYmUgcmVhZAotICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZW4ubmV4dEVsZW1lbnQoKS5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIGVhY2ggbGluZSBmb3IgY2hhcnNldCBwcm92aWRlciBjbGFzcyBuYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1tb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHVVJBVElPTl9GSUxFX0VOQ09ESU5HKSwgODE5Mik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1tb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzTmFtZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudEluZGV4ID0gZmFjdG9yeUNsYXNzTmFtZS5pbmRleE9mKENPTkZJR1VSQVRJT05fRklMRV9DT01NRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50SW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzTmFtZSA9IGZhY3RvcnlDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNvbW1lbnRJbmRleCkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlDbGFzc05hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgYSByZXNvdXJjZSBjb3VsZG4ndCBiZSByZWFkCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHByZWZzLjEwPUNhbm5vdCBpbml0aWF0ZSBQcmVmZXJlbmNlc0ZhY3Rvcnk6IHswfS4gQ2F1c2VkIGJ5IHsxfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKE1lc3NhZ2VzLmdldFN0cmluZygicHJlZnMuMTAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBQ1RPUllfQ09ORklHVVJBVElPTl9GSUxFX05BTUUsIGUpKTsgICAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgLy8gcHJlZnMuMTA9Q2Fubm90IGluaXRpYXRlIFByZWZlcmVuY2VzRmFjdG9yeTogezB9LiBDYXVzZWQgYnkKKyAgICAgICAgICAgICAgICAvLyB7MX0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihNZXNzYWdlcy5nZXRTdHJpbmcoInByZWZzLjEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBQ1RPUllfQ09ORklHVVJBVElPTl9GSUxFX05BTUUsIGUpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYoZmFjdG9yeUNsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChmYWN0b3J5Q2xhc3NOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIGZhY3RvcnlDbGFzc05hbWUgPSAiamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ZhY3RvcnlJbXBsIjsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2xhc3M8Pz4gYyA9IGxvYWRlci5sb2FkQ2xhc3MoZmFjdG9yeUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gKFByZWZlcmVuY2VzRmFjdG9yeSkgYy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gKFByZWZlcmVuY2VzRmFjdG9yeSljLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBwcmVmcy4xMD1DYW5ub3QgaW5pdGlhdGUgUHJlZmVyZW5jZXNGYWN0b3J5OiB7MH0uIENhdXNlZCBieSB7MX0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKE1lc3NhZ2VzLmdldFN0cmluZygicHJlZnMuMTAiLCAKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzTmFtZSwgZSkpOyAgIC8vJE5PTi1OTFMtMSQgIAorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcmVmcy4xMCIsIGZhY3RvcnlDbGFzc05hbWUsIGUpKTsgLy8kTk9OLU5MUy0xJCAgCiAgICAgICAgIH0KICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICB9CkBAIC0yMjcsNyArMjI3LDkgQEAKICAgICAgKi8KICAgICAKICAgICAvKioKLSAgICAgKiAgICBEZWZhdWx0IGNvbnN0cnVjdG9yLCBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMgb25seS4KKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMgb25seS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUHJlZmVyZW5jZXMoKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC0yNDAsMjg1ICsyNDIsMzMwIEBACiAgICAgICovCiAgICAgCiAgICAgLyoqCi0gICAgICogR2V0IHRoaXMgcHJlZmVyZW5jZSBub2RlJ3MgYWJzb2x1dGUgcGF0aCBzdHJpbmcuCisgICAgICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBzdHJpbmcgb2YgdGhpcyBwcmVmZXJlbmNlIG5vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHByZWZlcmVuY2Ugbm9kZSdzIGFic29sdXRlIHBhdGggc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugbm9kZSdzIGFic29sdXRlIHBhdGggc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgYWJzb2x1dGVQYXRoKCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIG5hbWVzIG9mIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsIG9yIGVtcHR5IHN0cmluZyBpZiB0aGlzIG5vZGUgCi0gICAgICogaGFzIG5vIGNoaWxkcmVuLiAKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgY2hpbGRyZW4gb2YgdGhpcyBub2RlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGlzCisgICAgICogbm9kZSBoYXMgbm8gY2hpbGRyZW4uCiAgICAgICogCi0gICAgICogQHJldHVybiAgICAgICAgIG5hbWVzIG9mIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgY2hpbGRyZW4gb2YgdGhpcyBub2RlLgogICAgICAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIG9wZXJhdGlvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBjaGlsZHJlbk5hbWVzKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIHByZWZlcmVuY2VzIG9mIHRoaXMgbm9kZS4gCisgICAgICogUmVtb3ZlcyBhbGwgcHJlZmVyZW5jZXMgb2YgdGhpcyBub2RlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIG9wZXJhdGlvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBFeHBvcnQgYWxsIHByZWZlcmVuY2VzIG9mIHRoaXMgbm9kZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbSBpbiBYTUwgCi0gICAgICogZG9jdW1lbnQuIAorICAgICAqIEV4cG9ydHMgYWxsIG9mIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGlzIG5vZGUgdG8gYSBYTUwgZG9jdW1lbnQgdXNpbmcgdGhlIGdpdmVuCisgICAgICogb3V0cHV0IHN0cmVhbS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIFhNTCBkb2N1bWVudCBoYXMgdGhlIGZvbGxvd2luZyBET0NUWVBFIGRlY2xhcmF0aW9uOgorICAgICAqIFRoaXMgWE1MIGRvY3VtZW50IHVzZXMgdGhlIFVURi04IGVuY29kaW5nIGFuZCBpcyB3cml0dGVuIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiBEVEQgaW4gaXRzIERPQ1RZUEUgZGVjbGFyYXRpb24sIHdoaWNoIGlzIHRoZSBmb2xsb3dpbmc6CisgICAgICogCiAgICAgICogPHByZT4KLSAgICAgKiAmbHQ7IURPQ1RZUEUgcHJlZmVyZW5jZXMgU1lTVEVNICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcmVmZXJlbmNlcy5kdGQiJmd0OzwvcHJlPgotICAgICAqIEFuZCB0aGUgVVRGLTggZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbm9kZSBpcyBub3QgCi0gICAgICogdGhyZWFkLXNhZmUsIHdoaWNoIGlzIGFuIGV4Y2VwdGlvbiBvZiB0aGlzIGNsYXNzLiAKKyAgICAgKiAmbHQ7IURPQ1RZUEUgcHJlZmVyZW5jZXMgU1lTVEVNICZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3ByZWZlcmVuY2VzLmR0ZCZxdW90OyZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8aT5QbGVhc2Ugbm90ZSB0aGF0ICh1bmxpa2UgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB0aGF0IGRvbid0IGNvbmNlcm4gc2VyaWFsaXphdGlvbiksIHRoaXMgY2FsbCBpcyBub3QgdGhyZWFkLXNhZmUuPC9pPgogICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gIG9zdHJlYW0KLSAgICAgKiAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0gdG8gZXhwb3J0IHRoZSBYTUwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3N0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdGhlIFhNTC1mb3JtYXR0ZWQgZGF0YSB0by4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGV4cG9ydCBvcGVyYXRpb24gY2F1c2VkIGFuIDxjb2RlPklPRXhjZXB0aW9uPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleHBvcnRpbmcuCiAgICAgICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgb3BlcmF0aW9uIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4cG9ydE5vZGUgKE91dHB1dFN0cmVhbSBvc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBFeHBvcnQgYWxsIHByZWZlcmVuY2VzIG9mIHRoaXMgbm9kZSBhbmQgaXRzIGFsbCBkZXNjZW5kYW50cyB0byB0aGUgZ2l2ZW4gCi0gICAgICogb3V0cHV0IHN0cmVhbSBpbiBYTUwgZG9jdW1lbnQuIAorICAgICAqIEV4cG9ydHMgYWxsIG9mIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGlzIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgdG8gYSBYTUwKKyAgICAgKiBkb2N1bWVudCB1c2luZyB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIFhNTCBkb2N1bWVudCBoYXMgdGhlIGZvbGxvd2luZyBET0NUWVBFIGRlY2xhcmF0aW9uOgorICAgICAqIFRoaXMgWE1MIGRvY3VtZW50IHVzZXMgdGhlIFVURi04IGVuY29kaW5nIGFuZCBpcyB3cml0dGVuIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiBEVEQgaW4gaXRzIERPQ1RZUEUgZGVjbGFyYXRpb24sIHdoaWNoIGlzIHRoZSBmb2xsb3dpbmc6CisgICAgICogCiAgICAgICogPHByZT4KLSAgICAgKiAmbHQ7IURPQ1RZUEUgcHJlZmVyZW5jZXMgU1lTVEVNICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcmVmZXJlbmNlcy5kdGQiJmd0OzwvcHJlPiAgICAgKiAKLSAgICAgKiBBbmQgdGhlIFVURi04IGVuY29kaW5nIHdpbGwgYmUgdXNlZC4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG5vZGUgaXMgbm90IAotICAgICAqIHRocmVhZC1zYWZlLCB3aGljaCBpcyBhbiBleGNlcHRpb24gb2YgdGhpcyBjbGFzcy4gCisgICAgICogJmx0OyFET0NUWVBFIHByZWZlcmVuY2VzIFNZU1RFTSAmcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcmVmZXJlbmNlcy5kdGQmcXVvdDsmZ3Q7CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPGk+UGxlYXNlIG5vdGUgdGhhdCAodW5saWtlIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdGhhdCBkb24ndCBjb25jZXJuIHNlcmlhbGl6YXRpb24pLCB0aGlzIGNhbGwgaXMgbm90IHRocmVhZC1zYWZlLjwvaT4KICAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtICBvc3RyZWFtCi0gICAgICogICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtIHRvIGV4cG9ydCB0aGUgWE1MCisgICAgICogCisgICAgICogQHBhcmFtIG9zdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRoZSBYTUwtZm9ybWF0dGVkIGRhdGEgdG8uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBleHBvcnQgb3BlcmF0aW9uIGNhdXNlZCBhbiA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhwb3J0aW5nLgogICAgICAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIG9wZXJhdGlvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIGFuIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgIGZhaWx1cmUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleHBvcnRTdWJ0cmVlIChPdXRwdXRTdHJlYW0gb3N0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWNraW5nU3RvcmVFeGNlcHRpb247CiAgICAgCiAgICAgLyoqCi0gICAgICogRm9yY2UgdGhlIHVwZGF0ZXMgdG8gdGhpcyBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMgdG8gdGhlIGJhY2tpbmcgc3RvcmUuIAorICAgICAqIEZvcmNlcyBhbGwgcGVuZGluZyB1cGRhdGVzIHRvIHRoaXMgbm9kZSBhbmQgaXRzIGRlc2NlbmRhbnRzIHRvIGJlIAorICAgICAqIHBlcnNpc3RlZCBpbiB0aGUgYmFja2luZyBzdG9yZS4KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCwgdGhlbiB0aGUgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCBvbmx5IAotICAgICAqIGZsdXNoIHRoaXMgbm9kZSB3aXRob3V0IGRlc2NlbmRhbnRzLgotICAgICAqIDwvcD4gCisgICAgICogSWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQsIHRoZSBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIG9ubHkgZmx1c2hlcworICAgICAqIHRoaXMgbm9kZSwgbm90IGl0cyBkZXNjZW5kYW50cy4KKyAgICAgKiA8L3A+CisgICAgICogCiAgICAgICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgb3BlcmF0aW9uIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb247CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIG9yIGRlZmF1bHQgdmFsdWUgaWYgbm8gCi0gICAgICogdmFsdWUgaXMgbWFwcGVkIG9yIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIFN0cmluZ30gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXkgb3IgaXRzIGRlZmF1bHQgdmFsdWUgaWYgbm8KKyAgICAgKiB2YWx1ZSBpcyBtYXBwZWQgb3Igbm8gYmFja2luZyBzdG9yZSBpcyBhdmFpbGFibGUuCiAgICAgICogPHA+Ci0gICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzIGNhc2UsIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCB0aGUgc3RvcmVkIGRlZmF1bHQgdmFsdWUgaXMgCi0gICAgICogcmV0dXJuZWQuCisgICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzCisgICAgICogY2FzZSwgaWYgdGhlcmUgaXMgbm8gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIHRoZSBzdG9yZWQgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlIGtleQotICAgICAqIEBwYXJhbSBkZWZsdCAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyAKLSAgICAgKiAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXkgb3IgYmFja2luZyBzdG9yZSB1bmF2YWlsYWJsZSAKLSAgICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIG9yIGRlZmF1bHQgdmFsdWUgaWYgCi0gICAgICogICAgICAgICAgICAgICAgIG5vIHZhbHVlIGlzIG1hcHBlZCBvciBiYWNraW5nIHN0b3JlIHVuYXZhaWxhYmxlIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleS4KKyAgICAgKiBAcGFyYW0gZGVmbHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlLCB3aGljaCB3aWxsIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzCisgICAgICogICAgICAgICAgICBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBvciBubyBiYWNraW5nIHN0b3JlIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBwYXJhbWV0ZXIga2V5IGlzIG51bGwgCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciB7QGNvZGUga2V5fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXQgKFN0cmluZyBrZXksIFN0cmluZyBkZWZsdCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciBkZWZhdWx0IHZhbHVlIGlmIG5vIAotICAgICAqIHZhbHVlIGlzIG1hcHBlZCwgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSwgb3IgdGhlIHZhbHVlIGlzIGludmFsaWQuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIGJvb2xlYW59IHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5IG9yIGl0cyBkZWZhdWx0IHZhbHVlIGlmIG5vCisgICAgICogdmFsdWUgaXMgbWFwcGVkLCBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSwgb3IgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHZhbGlkIHZhbHVlIGlzIHN0cmluZyBlcXVhbHMgInRydWUiLCB3aGljaCByZXByZXNlbnRzIHRydWUsIG9yICJmYWxzZSIsIAotICAgICAqIHdoaWNoIHJlcHJlc2VudHMgZmFsc2UsIGNhc2UgaXMgaWdub3JlZC4gCi0gICAgICogPC9wPiAgCisgICAgICogVGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSB0aGUge0Bjb2RlIFN0cmluZ30gInRydWUiLCB3aGljaCByZXByZXNlbnRzIHtAY29kZSB0cnVlfSBhbmQKKyAgICAgKiAiZmFsc2UiLCB3aGljaCByZXByZXNlbnRzIHtAY29kZSBmYWxzZX0sIGlnbm9yaW5nIGNhc2UuCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBzdG9yZSBkZWZhdWx0IHZhbHVlcyBpbiBiYWNraW5nIHN0b3Jlcy4gSW4gdGhpcyBjYXNlLCAKLSAgICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgdGhlIHN0b3JlZCBkZWZhdWx0IHZhbHVlIGlzIAotICAgICAqIHJldHVybmVkLgorICAgICAqIFNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBzdG9yZSBkZWZhdWx0IHZhbHVlcyBpbiBiYWNraW5nIHN0b3Jlcy4gSW4gdGhpcworICAgICAqIGNhc2UsIGlmIHRoZXJlIGlzIG5vIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCB0aGUgc3RvcmVkIGRlZmF1bHQKKyAgICAgKiB2YWx1ZSBpcyByZXR1cm5lZC4KICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSAgICB0aGUgcHJlZmVyZW5jZSBrZXkKLSAgICAgKiBAcGFyYW0gZGVmbHQgICAgdGhlIGRlZmF1bHQgdmFsdWUsIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgCi0gICAgICogICAgICAgICAgICAgICAgIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBiYWNraW5nIHN0b3JlIHVuYXZhaWxhYmxlIG9yIHZhbHVlIAotICAgICAqICAgICAgICAgICAgICAgICBpcyBpbnZhbGlkIAotICAgICAqIEByZXR1cm4gICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgb3IgZGVmYXVsdCB2YWx1ZSBpZiAKLSAgICAgKiAgICAgICAgICAgICAgICAgbm8gdmFsdWUgaXMgbWFwcGVkLCBiYWNraW5nIHN0b3JlIHVuYXZhaWxhYmxlIG9yIHZhbHVlIGlzIGludmFsaWQKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBrZXkuCisgICAgICogQHBhcmFtIGRlZmx0CisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcworICAgICAqICAgICAgICAgICAgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIGlmIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlLCBvciBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHZhbHVlIGlzIGludmFsaWQuCisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgcGFyYW1ldGVyIGtleSBpcyBudWxsIAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIge0Bjb2RlIGtleX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEJvb2xlYW4gKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmbHQpOwogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYnl0ZSBhcnJheSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgb3IgZGVmYXVsdCB2YWx1ZSBpZiBubyAKLSAgICAgKiB2YWx1ZSBpcyBtYXBwZWQsIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUsIG9yIHRoZSB2YWx1ZSBpcyBpbnZhbGlkIHN0cmluZy4KKyAgICAgKiBHZXRzIHRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXkgb3IgaXRzIGRlZmF1bHQgdmFsdWUgaWYKKyAgICAgKiBubyB2YWx1ZSBpcyBtYXBwZWQsIGlmIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlLCBvciBpZiB0aGUgdmFsdWUgaXMgYW4KKyAgICAgKiBpbnZhbGlkIHN0cmluZy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsaWQgdmFsdWUgc3RyaW5nIGlzIEJhc2U2NCBlbmNvZGVkIGJpbmFyeSBkYXRhLiBUaGUgQmFzZTY0IGVuY29kaW5nIAotICAgICAqIGlzIGFzIGRlZmluZWQgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0NS50eHQiPlJGQyAyMDQ1PC9hPiwgCi0gICAgICogc2VjdGlvbiA2LjguCi0gICAgICogPC9wPiAgCisgICAgICogVG8gYmUgdmFsaWQsIHRoZSB2YWx1ZSBzdHJpbmcgbXVzdCBiZSBCYXNlNjQtZW5jb2RlZCBiaW5hcnkgZGF0YS4gVGhlIEJhc2U2NCBlbmNvZGluZworICAgICAqIGlzIGFzIGRlZmluZWQgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0NS50eHQiPlJGQworICAgICAqIDIwNDU8L2E+LCBzZWN0aW9uIDYuOC4KKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzIGNhc2UsIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCB0aGUgc3RvcmVkIGRlZmF1bHQgdmFsdWUgaXMgCi0gICAgICogcmV0dXJuZWQuCisgICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzCisgICAgICogY2FzZSwgaWYgdGhlcmUgaXMgbm8gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIHRoZSBzdG9yZWQgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlIGtleQotICAgICAqIEBwYXJhbSBkZWZsdCAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyAKLSAgICAgKiAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgCi0gICAgICogICAgICAgICAgICAgICAgIGlzIGludmFsaWQgCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSBieXRlIGFycmF5IHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciBkZWZhdWx0IHZhbHVlIGlmIAotICAgICAqICAgICAgICAgICAgICAgICBubyB2YWx1ZSBpcyBtYXBwZWQsIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgaXMgaW52YWxpZAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleS4KKyAgICAgKiBAcGFyYW0gZGVmbHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlLCB3aGljaCB3aWxsIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzCisgICAgICogICAgICAgICAgICBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUsIG9yIGlmIHRoZQorICAgICAqICAgICAgICAgICAgdmFsdWUgaXMgaW52YWxpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIGFycmF5IHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBwYXJhbWV0ZXIga2V5IGlzIG51bGwgCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciB7QGNvZGUga2V5fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRCeXRlQXJyYXkgKFN0cmluZyBrZXksIGJ5dGVbXSBkZWZsdCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBkb3VibGUgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIG9yIGRlZmF1bHQgdmFsdWUgaWYgbm8gCi0gICAgICogdmFsdWUgaXMgbWFwcGVkLCBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlLCBvciB0aGUgdmFsdWUgaXMgaW52YWxpZCBzdHJpbmcuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIGRvdWJsZX0gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXkgb3IgaXRzIGRlZmF1bHQgdmFsdWUgaWYgbm8KKyAgICAgKiB2YWx1ZSBpcyBtYXBwZWQsIGlmIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlLCBvciBpZiB0aGUgdmFsdWUgaXMgYW4gaW52YWxpZAorICAgICAqIHN0cmluZy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsaWQgdmFsdWUgc3RyaW5nIGNhbiBiZSBjb252ZXJ0ZWQgdG8gZG91YmxlIG51bWJlciBieSAKKyAgICAgKiBUbyBiZSB2YWxpZCwgdGhlIHZhbHVlIHN0cmluZyBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHtAY29kZSBkb3VibGV9IGJ5CiAgICAgICoge0BsaW5rIERvdWJsZSNwYXJzZURvdWJsZShTdHJpbmcpIERvdWJsZS5wYXJzZURvdWJsZShTdHJpbmcpfS4KLSAgICAgKiA8L3A+ICAKKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzIGNhc2UsIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCB0aGUgc3RvcmVkIGRlZmF1bHQgdmFsdWUgaXMgCi0gICAgICogcmV0dXJuZWQuCisgICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzCisgICAgICogY2FzZSwgaWYgdGhlcmUgaXMgbm8gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIHRoZSBzdG9yZWQgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlIGtleQotICAgICAqIEBwYXJhbSBkZWZsdCAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyAKLSAgICAgKiAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgCi0gICAgICogICAgICAgICAgICAgICAgIGlzIGludmFsaWQgCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSBkb3VibGUgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIG9yIGRlZmF1bHQgdmFsdWUgaWYgCi0gICAgICogICAgICAgICAgICAgICAgIG5vIHZhbHVlIGlzIG1hcHBlZCwgYmFja2luZyBzdG9yZSB1bmF2YWlsYWJsZSBvciB2YWx1ZSBpcyBpbnZhbGlkCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Uga2V5LgorICAgICAqIEBwYXJhbSBkZWZsdAorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUsIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMKKyAgICAgKiAgICAgICAgICAgIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSwgb3IgaWYgdGhlCisgICAgICogICAgICAgICAgICB2YWx1ZSBpcyBpbnZhbGlkLgorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgcGFyYW1ldGVyIGtleSBpcyBudWxsIAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIge0Bjb2RlIGtleX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0RG91YmxlIChTdHJpbmcga2V5LCBkb3VibGUgZGVmbHQpOwogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZmxvYXQgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIG9yIGRlZmF1bHQgdmFsdWUgaWYgbm8gCi0gICAgICogdmFsdWUgaXMgbWFwcGVkLCBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlLCBvciB0aGUgdmFsdWUgaXMgaW52YWxpZCBzdHJpbmcuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIGZsb2F0fSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBvciBpdHMgZGVmYXVsdCB2YWx1ZSBpZiBubworICAgICAqIHZhbHVlIGlzIG1hcHBlZCwgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnZhbGlkCisgICAgICogc3RyaW5nLgogICAgICAqIDxwPgotICAgICAqIFRoZSB2YWxpZCB2YWx1ZSBzdHJpbmcgY2FuIGJlIGNvbnZlcnRlZCB0byBmbG9hdCBudW1iZXIgYnkgCisgICAgICogVG8gYmUgdmFsaWQsIHRoZSB2YWx1ZSBzdHJpbmcgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgZmxvYXR9IGJ5CiAgICAgICoge0BsaW5rIEZsb2F0I3BhcnNlRmxvYXQoU3RyaW5nKSBGbG9hdC5wYXJzZUZsb2F0KFN0cmluZyl9LgotICAgICAqIDwvcD4gIAorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgc3RvcmUgZGVmYXVsdCB2YWx1ZXMgaW4gYmFja2luZyBzdG9yZXMuIEluIHRoaXMgY2FzZSwgCi0gICAgICogaWYgdGhlcmUgaXMgbm8gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIHRoZSBzdG9yZWQgZGVmYXVsdCB2YWx1ZSBpcyAKLSAgICAgKiByZXR1cm5lZC4KKyAgICAgKiBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgc3RvcmUgZGVmYXVsdCB2YWx1ZXMgaW4gYmFja2luZyBzdG9yZXMuIEluIHRoaXMKKyAgICAgKiBjYXNlLCBpZiB0aGVyZSBpcyBubyB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgdGhlIHN0b3JlZCBkZWZhdWx0CisgICAgICogdmFsdWUgaXMgcmV0dXJuZWQuCiAgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgICAgdGhlIHByZWZlcmVuY2Uga2V5Ci0gICAgICogQHBhcmFtIGRlZmx0ICAgIHRoZSBkZWZhdWx0IHZhbHVlLCB3aGljaCB3aWxsIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIAotICAgICAqICAgICAgICAgICAgICAgICBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgYmFja2luZyBzdG9yZSB1bmF2YWlsYWJsZSBvciB2YWx1ZSAKLSAgICAgKiAgICAgICAgICAgICAgICAgaXMgaW52YWxpZCAKLSAgICAgKiBAcmV0dXJuICAgICAgICAgdGhlIGZsb2F0IHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciBkZWZhdWx0IHZhbHVlIGlmIAotICAgICAqICAgICAgICAgICAgICAgICBubyB2YWx1ZSBpcyBtYXBwZWQsIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgaXMgaW52YWxpZAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleS4KKyAgICAgKiBAcGFyYW0gZGVmbHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlLCB3aGljaCB3aWxsIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzCisgICAgICogICAgICAgICAgICBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUsIG9yIGlmIHRoZQorICAgICAqICAgICAgICAgICAgdmFsdWUgaXMgaW52YWxpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgcGFyYW1ldGVyIGtleSBpcyBudWxsIAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIge0Bjb2RlIGtleX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRGbG9hdCAoU3RyaW5nIGtleSwgZmxvYXQgZGVmbHQpOwogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZmxvYXQgdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIG9yIGRlZmF1bHQgdmFsdWUgaWYgbm8gCi0gICAgICogdmFsdWUgaXMgbWFwcGVkLCBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlLCBvciB0aGUgdmFsdWUgaXMgaW52YWxpZCBzdHJpbmcuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIGludH0gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXkgb3IgaXRzIGRlZmF1bHQgdmFsdWUgaWYgbm8KKyAgICAgKiB2YWx1ZSBpcyBtYXBwZWQsIGlmIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlLCBvciBpZiB0aGUgdmFsdWUgaXMgYW4gaW52YWxpZAorICAgICAqIHN0cmluZy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsaWQgdmFsdWUgc3RyaW5nIGNhbiBiZSBjb252ZXJ0ZWQgdG8gaW50ZWdlciBieSAKKyAgICAgKiBUbyBiZSB2YWxpZCwgdGhlIHZhbHVlIHN0cmluZyBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhbiB7QGNvZGUgaW50fSBieQogICAgICAqIHtAbGluayBJbnRlZ2VyI3BhcnNlSW50KFN0cmluZykgSW50ZWdlci5wYXJzZUludChTdHJpbmcpfS4KLSAgICAgKiA8L3A+ICAKKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzIGNhc2UsIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCB0aGUgc3RvcmVkIGRlZmF1bHQgdmFsdWUgaXMgCi0gICAgICogcmV0dXJuZWQuCisgICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzCisgICAgICogY2FzZSwgaWYgdGhlcmUgaXMgbm8gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIHRoZSBzdG9yZWQgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlIGtleQotICAgICAqIEBwYXJhbSBkZWZsdCAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyAKLSAgICAgKiAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgCi0gICAgICogICAgICAgICAgICAgICAgIGlzIGludmFsaWQgCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSBpbnRlZ2VyIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciBkZWZhdWx0IHZhbHVlIGlmIAotICAgICAqICAgICAgICAgICAgICAgICBubyB2YWx1ZSBpcyBtYXBwZWQsIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgaXMgaW52YWxpZAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleS4KKyAgICAgKiBAcGFyYW0gZGVmbHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlLCB3aGljaCB3aWxsIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzCisgICAgICogICAgICAgICAgICBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUsIG9yIGlmIHRoZQorICAgICAqICAgICAgICAgICAgdmFsdWUgaXMgaW52YWxpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBwYXJhbWV0ZXIga2V5IGlzIG51bGwgCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciB7QGNvZGUga2V5fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRJbnQgKFN0cmluZyBrZXksIGludCBkZWZsdCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBsb25nIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciBkZWZhdWx0IHZhbHVlIGlmIG5vIAotICAgICAqIHZhbHVlIGlzIG1hcHBlZCwgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSwgb3IgdGhlIHZhbHVlIGlzIGludmFsaWQgc3RyaW5nLgorICAgICAqIEdldHMgdGhlIHtAY29kZSBsb25nfSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBvciBpdHMgZGVmYXVsdCB2YWx1ZSBpZiBubworICAgICAqIHZhbHVlIGlzIG1hcHBlZCwgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnZhbGlkCisgICAgICogc3RyaW5nLgogICAgICAqIDxwPgotICAgICAqIFRoZSB2YWxpZCB2YWx1ZSBzdHJpbmcgY2FuIGJlIGNvbnZlcnRlZCB0byBsb25nIGludGVnZXIgYnkgCisgICAgICogVG8gYmUgdmFsaWQsIHRoZSB2YWx1ZSBzdHJpbmcgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgbG9uZ30gYnkKICAgICAgKiB7QGxpbmsgTG9uZyNwYXJzZUxvbmcoU3RyaW5nKSBMb25nLnBhcnNlTG9uZyhTdHJpbmcpfS4KLSAgICAgKiA8L3A+ICAKKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzIGNhc2UsIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCB0aGUgc3RvcmVkIGRlZmF1bHQgdmFsdWUgaXMgCi0gICAgICogcmV0dXJuZWQuCisgICAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN0b3JlIGRlZmF1bHQgdmFsdWVzIGluIGJhY2tpbmcgc3RvcmVzLiBJbiB0aGlzCisgICAgICogY2FzZSwgaWYgdGhlcmUgaXMgbm8gdmFsdWUgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIHRoZSBzdG9yZWQgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlIGtleQotICAgICAqIEBwYXJhbSBkZWZsdCAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyAKLSAgICAgKiAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIHRoZSBnaXZlbiBrZXksIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgCi0gICAgICogICAgICAgICAgICAgICAgIGlzIGludmFsaWQgCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSBsb25nIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciBkZWZhdWx0IHZhbHVlIGlmIAotICAgICAqICAgICAgICAgICAgICAgICBubyB2YWx1ZSBpcyBtYXBwZWQsIGJhY2tpbmcgc3RvcmUgdW5hdmFpbGFibGUgb3IgdmFsdWUgaXMgaW52YWxpZAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleS4KKyAgICAgKiBAcGFyYW0gZGVmbHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlLCB3aGljaCB3aWxsIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzCisgICAgICogICAgICAgICAgICBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSwgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUsIG9yIGlmIHRoZQorICAgICAqICAgICAgICAgICAgdmFsdWUgaXMgaW52YWxpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIHZhbHVlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBwYXJhbWV0ZXIga2V5IGlzIG51bGwgCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciB7QGNvZGUga2V5fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZyAoU3RyaW5nIGtleSwgbG9uZyBkZWZsdCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogSW1wb3J0IGFsbCBwcmVmZXJlbmNlcyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gaW4gWE1MIGRvY3VtZW50LiAKKyAgICAgKiBJbXBvcnRzIGFsbCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgZG9jdW1lbnQgdXNpbmcgdGhlIGdpdmVuIGlucHV0CisgICAgICogc3RyZWFtLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgWE1MIGRvY3VtZW50IGhhcyB0aGUgZm9sbG93aW5nIERPQ1RZUEUgZGVjbGFyYXRpb246CisgICAgICogVGhpcyBYTUwgZG9jdW1lbnQgdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcgYW5kIG11c3QgYmUgd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogRFREIGluIGl0cyBET0NUWVBFIGRlY2xhcmF0aW9uLCB3aGljaCBtdXN0IGJlIHRoZSBmb2xsb3dpbmc6CisgICAgICogCiAgICAgICogPHByZT4KLSAgICAgKiAmbHQ7IURPQ1RZUEUgcHJlZmVyZW5jZXMgU1lTVEVNICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcmVmZXJlbmNlcy5kdGQiJmd0OzwvcHJlPiAgICAgKiAKLSAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbm9kZSBpcyBub3QgdGhyZWFkLXNhZmUsIHdoaWNoIGlzIGFuIGV4Y2VwdGlvbiBvZiAKLSAgICAgKiB0aGlzIGNsYXNzLiAKKyAgICAgKiAmbHQ7IURPQ1RZUEUgcHJlZmVyZW5jZXMgU1lTVEVNICZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3ByZWZlcmVuY2VzLmR0ZCZxdW90OyZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8aT5QbGVhc2Ugbm90ZSB0aGF0ICh1bmxpa2UgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB0aGF0IGRvbid0IGNvbmNlcm4gc2VyaWFsaXphdGlvbiksIHRoaXMgY2FsbCBpcyBub3QgdGhyZWFkLXNhZmUuPC9pPgogICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaXN0cmVhbQotICAgICAqICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHJlYWQgZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIHRoZSBkYXRhIGZyb20uCiAgICAgICogQHRocm93cyBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhlIGRhdGEgcmVhZCBmcm9tIGdpdmVuIGlucHV0IHN0cmVhbSBpcyBub3QgdmFsaWQgWE1MIAotICAgICAqICAgICAgICAgICAgICAgICBkb2N1bWVudAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIGlzIG5vdCBmcm9tIGEKKyAgICAgKiAgICAgICAgICAgICB2YWxpZCBYTUwgZG9jdW1lbnQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBpbXBvcnQgb3BlcmF0aW9uIGNhdXNlZCBhbiA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW1wb3J0aW5nLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgPGNvZGU+UnVudGltZVBlcm1pc3Npb24oInByZWZlcmVuY2VzIik8L2NvZGU+IGlzIGRlbmllZCAKLSAgICAgKiAgICAgICAgICAgICAgICAgYnkgYSA8Y29kZT5TZWN1cml0eU1hbmFnZXI8L2NvZGU+CisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIFJ1bnRpbWVQZXJtaXNzaW9uKCJwcmVmZXJlbmNlcyIpfSBpcyBkZW5pZWQgYnkgYQorICAgICAqICAgICAgICAgICAgIFNlY3VyaXR5TWFuYWdlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0UHJlZmVyZW5jZXMgKElucHV0U3RyZWFtIGlzdHJlYW0pIHRocm93cyBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tTZWN1cml0eSgpOwpAQCAtNTMwLDMxOCArNTc3LDM3OCBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgdXNlciBwcmVmZXJlbmNlcywgZmFsc2UgaWYgdGhpcyBpcyBhIHN5c3RlbSAKLSAgICAgKiBwcmVmZXJlbmNlcworICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgdXNlciBwcmVmZXJlbmNlIG5vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiAgICAgICAgIHRydWUgaWYgdGhpcyBpcyBhIHVzZXIgcHJlZmVyZW5jZXMsIGZhbHNlIGlmIHRoaXMgaXMgYSAKLSAgICAgKiAgICAgICAgICAgICAgICAgc3lzdGVtIHByZWZlcmVuY2VzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0sIGlmIHRoaXMgaXMgYSB1c2VyIHByZWZlcmVuY2Ugbm9kZSwge0Bjb2RlIGZhbHNlfSBpZgorICAgICAqICAgICAgICAgdGhpcyBpcyBhIHN5c3RlbSBwcmVmZXJlbmNlIG5vZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNVc2VyTm9kZSgpOwogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgcHJlZmVyZW5jZXMga2V5cyBzdG9yZWQgaW4gdGhpcyBub2RlLCBvciBlbXB0eSBhcnJheSBpZiBubyAKLSAgICAgKiBrZXkgaXMgZm91bmQuCisgICAgICogUmV0dXJucyBhbGwgcHJlZmVyZW5jZSBrZXlzIHN0b3JlZCBpbiB0aGlzIG5vZGUgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8KKyAgICAgKiBrZXkgd2FzIGZvdW5kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gICAgICAgICBhbGwgcHJlZmVyZW5jZXMga2V5cyBpbiB0aGlzIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBwcmVmZXJlbmNlIGtleXMgb2YgdGhpcyBub2RlLgogICAgICAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIG9wZXJhdGlvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5hdmFpbGFibGUgb3IgY2F1c2VzIGFuIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgIGZhaWx1cmUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10ga2V5cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb247CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIG5hbWUgb2YgdGhpcyBub2RlLgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIG5hbWUoKTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHByZWZlcmVuY2VzIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBuYW1lLiBUaGUgcGF0aCBuYW1lIGNhbiAKLSAgICAgKiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gVGhlIGRpY3RhdGVkIHByZWZlcmVuY2VzIGFuZCBpdHMgYW5jZXN0b3JzIHdpbGwgCisgICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBub2RlIHdpdGggdGhlIGdpdmVuIHBhdGggbmFtZS4gVGhlIHBhdGggbmFtZSBjYW4KKyAgICAgKiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gVGhlIHJlcXVlc3RlZCBub2RlIGFuZCBpdHMgYW5jZXN0b3JzIHdpbGwKICAgICAgKiBiZSBjcmVhdGVkIGlmIHRoZXkgZG8gbm90IGV4aXN0LgogICAgICAqIDxwPgotICAgICAqIFRoZSBwYXRoIGlzIHRyZWF0ZWQgYXMgcmVsYXRpdmUgdG8gdGhpcyBub2RlIGlmIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAKLSAgICAgKiBzbGFzaCwgb3IgYXMgYWJzb2x1dGUgb3RoZXJ3aXNlLjwvcD4gIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gcGF0aCAgICB0aGUgcGF0aCBuYW1lIG9mIGRpY3RhdGVkIHByZWZlcmVuY2VzCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSBkaWN0YXRlZCBwcmVmZXJlbmNlcyBub2RlCisgICAgICogVGhlIHBhdGggaXMgdHJlYXRlZCBhcyByZWxhdGl2ZSB0byB0aGlzIG5vZGUgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoIGEKKyAgICAgKiBzbGFzaCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgICAgICAgdGhlIHBhdGggbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHByZWZlcmVuY2Ugbm9kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgcHJlZmVyZW5jZSBub2RlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoZSBwYXRoIG5hbWUgaXMgaW52YWxpZC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGF0aCBuYW1lIGlzIGludmFsaWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBnaXZlbiBwYXRoIGlzIG51bGwuCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIHBhdGggaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQcmVmZXJlbmNlcyBub2RlIChTdHJpbmcgcGF0aCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwcmVmZXJlbmNlcyBub2RlIHdpdGggdGhlIGdpdmVuIHBhdGggbmFtZS4gVGhlIHBhdGggaXMgdHJlYXRlZCAKLSAgICAgKiBhcyByZWxhdGl2ZSB0byB0aGlzIG5vZGUgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoIHNsYXNoLCBvciBhcyBhYnNvbHV0ZSAKLSAgICAgKiBvdGhlcndpc2UuCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcmVmZXJlbmNlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBuYW1lIGV4aXN0cy4gVGhlCisgICAgICogcGF0aCBpcyB0cmVhdGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgbm9kZSBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzbGFzaCwKKyAgICAgKiBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBhbiBhYnNvbHV0ZSBwYXRoLgogICAgICAqIDxwPgotICAgICAqIFBsZWFzZSBub3RlIHRoYXQgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQsIGludm9jYXRpb24gb2YgdGhpcyBub2RlIAotICAgICAqIHdpbGwgdGhyb3cgPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiBleGNlcHQgdGhlIGdpdmVuIHBhdGggaXMgCi0gICAgICogZW1wdHkgc3RyaW5nLCB3aGljaCB3aWxsIHJldHVybiBmYWxzZS4KKyAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLCBhbiBpbnZvY2F0aW9uIG9mIHRoaXMKKyAgICAgKiBub2RlIHdpbGwgdGhyb3cgYW4ge0Bjb2RlIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gdW5sZXNzIHRoZSBnaXZlbiBwYXRoIGlzCisgICAgICogYW4gZW1wdHkgc3RyaW5nLCB3aGljaCB3aWxsIHJldHVybiB7QGNvZGUgZmFsc2V9LgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aCAgICB0aGUgcGF0aCBuYW1lIG9mIGRpY3RhdGVkIHByZWZlcmVuY2VzCi0gICAgICogQHJldHVybiAgICAgICAgIHRydWUgaWYgdGhlIGRpY3RhdGVkIHByZWZlcmVuY2VzIG5vZGUgZXhpc3RzCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIG5hbWUgb2YgdGhlIHByZWZlcmVuY2Ugbm9kZSB0byBxdWVyeS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSwgaWYgdGhlIHF1ZXJpZWQgcHJlZmVyZW5jZSBub2RlIGV4aXN0cywge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkIGFuZCB0aGUgcGF0aCBpcyBub3QgZW1wdHkgc3RyaW5nLgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkIGFuZCB0aGUgcGF0aCBpcyBub3QgYW4gZW1wdHkKKyAgICAgKiAgICAgICAgICAgICBzdHJpbmcuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhlIHBhdGggbmFtZSBpcyBpbnZhbGlkLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXRoIG5hbWUgaXMgaW52YWxpZC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIGdpdmVuIHBhdGggaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgb3BlcmF0aW9uIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBub2RlRXhpc3RzIChTdHJpbmcgcGF0aCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHBhcmVudCBwcmVmZXJlbmNlcyBub2RlIG9mIHRoaXMgbm9kZSwgb3IgbnVsbCBpZiB0aGlzIG5vZGUgaXMgcm9vdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgcHJlZmVyZW5jZSBub2RlIG9mIHRoaXMgbm9kZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcworICAgICAqIG5vZGUgaXMgdGhlIHJvb3Qgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcHJlZmVyZW5jZXMgbm9kZSBvZiB0aGlzIG5vZGUuCisgICAgICogQHJldHVybiB0aGUgcGFyZW50IHByZWZlcmVuY2Ugbm9kZSBvZiB0aGlzIG5vZGUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCAgICAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUHJlZmVyZW5jZXMgcGFyZW50KCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQWRkIG5ldyBwcmVmZXJlbmNlcyB0byB0aGlzIG5vZGUgdXNpbmcgZ2l2ZW4ga2V5IGFuZCB2YWx1ZSwgb3IgdXBkYXRlIAotICAgICAqIHZhbHVlIGlmIHByZWZlcmVuY2VzIHdpdGggZ2l2ZW4ga2V5IGhhcyBhbHJlYWR5IGV4aXN0ZWQuCisgICAgICogQWRkcyBhIG5ldyBwcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSB1c2luZyB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZSBvcgorICAgICAqIHVwZGF0ZXMgdGhlIHZhbHVlIGlmIGEgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSAgICB0aGUgcHJlZmVyZW5jZXMga2V5IHRvIGJlIGFkZGVkIG9yIGJlIHVwZGF0ZWQgCi0gICAgICogQHBhcmFtIHZhbHVlICAgIHRoZSBwcmVmZXJlbmNlcyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleQorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleSB0byBiZSBhZGRlZCBvciB1cGRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IG9yIHZhbHVlIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IG9yIHZhbHVlIGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIAotICAgICAqICAgICAgICAgICAgICAgICA8Y29kZT5NQVhfS0VZX0xFTkdUSDwvY29kZT4sIG9yIHRoZSB2YWx1ZSdzIGxlbmd0aCBpcyBiaWdnZXIgCi0gICAgICogICAgICAgICAgICAgICAgIHRoYW4gPGNvZGU+TUFYX1ZBTFVFX0xFTkdUSDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIHtAY29kZQorICAgICAqICAgICAgICAgICAgIE1BWF9LRVlfTEVOR1RIfSBvciB0aGUgdmFsdWUncyBsZW5ndGggaXMgYmlnZ2VyIHRoYW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgTUFYX1ZBTFVFX0xFTkdUSH0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCAgICAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXQgKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQWRkIG5ldyBwcmVmZXJlbmNlcyB0byB0aGlzIG5vZGUgdXNpbmcgZ2l2ZW4ga2V5IGFuZCBzdHJpbmcgZm9ybSBvZiBnaXZlbiAKLSAgICAgKiB2YWx1ZSwgb3IgdXBkYXRlIHZhbHVlIGlmIHByZWZlcmVuY2VzIHdpdGggZ2l2ZW4ga2V5IGhhcyBhbHJlYWR5IGV4aXN0ZWQuIAorICAgICAqIEFkZHMgYSBuZXcgcHJlZmVyZW5jZSB3aXRoIGEge0Bjb2RlIGJvb2xlYW59IHZhbHVlIHRvIHRoaXMgbm9kZSB1c2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBrZXkgYW5kIHZhbHVlIG9yIHVwZGF0ZXMgdGhlIHZhbHVlIGlmIGEgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBrZXkKKyAgICAgKiBhbHJlYWR5IGV4aXN0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlcyBrZXkgdG8gYmUgYWRkZWQgb3IgYmUgdXBkYXRlZCAKLSAgICAgKiBAcGFyYW0gdmFsdWUgICAgdGhlIHByZWZlcmVuY2VzIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5CisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Uga2V5IHRvIGJlIGFkZGVkIG9yIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB7QGNvZGUgYm9vbGVhbn0gdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIAotICAgICAqICAgICAgICAgICAgICAgICA8Y29kZT5NQVhfS0VZX0xFTkdUSDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIHtAY29kZQorICAgICAqICAgICAgICAgICAgIE1BWF9LRVlfTEVOR1RIfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkICAgIAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dEJvb2xlYW4gKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOwogICAgIAogICAgIC8qKgotICAgICAqIEFkZCBuZXcgcHJlZmVyZW5jZXMgdG8gdGhpcyBub2RlIHVzaW5nIGdpdmVuIGtleSBhbmQgc3RyaW5nIGZvcm0gb2YgZ2l2ZW4gCi0gICAgICogdmFsdWUsIG9yIHVwZGF0ZSB2YWx1ZSBpZiBwcmVmZXJlbmNlcyB3aXRoIGdpdmVuIGtleSBoYXMgYWxyZWFkeSBleGlzdGVkLiAKKyAgICAgKiBBZGRzIGEgbmV3IHByZWZlcmVuY2UgdG8gdGhpcyBub2RlIHVzaW5nIHRoZSBnaXZlbiBrZXkgYW5kIHRoZSBzdHJpbmcKKyAgICAgKiBmb3JtIG9mIHRoZSBnaXZlbiB2YWx1ZSBvciB1cGRhdGVzIHRoZSB2YWx1ZSBpZiBhIHByZWZlcmVuY2Ugd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHN0cmluZyBmb3JtIG9mIHZhbHVlIGlzIHRoZSBCYXNlNjQgZW5jb2RlZCBiaW5hcnkgZGF0YSBvZiB0aGUgZ2l2ZW4gCi0gICAgICogYnl0ZSBhcnJheS4gVGhlIEJhc2U2NCBlbmNvZGluZyBpcyBhcyBkZWZpbmVkIGluIAotICAgICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUudHh0Ij5SRkMgMjA0NTwvYT4sIHNlY3Rpb24gNi44LjwvcD4KKyAgICAgKiBUaGUgc3RyaW5nIGZvcm0gb2YgdGhlIHZhbHVlIGlzIHRoZSBCYXNlNjQtZW5jb2RlZCBiaW5hcnkgZGF0YSBvZiB0aGUKKyAgICAgKiBnaXZlbiBieXRlIGFycmF5LiBUaGUgQmFzZTY0IGVuY29kaW5nIGlzIGFzIGRlZmluZWQgaW4gPGEKKyAgICAgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDQ1LnR4dCI+UkZDIDIwNDU8L2E+LCBzZWN0aW9uIDYuOC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSAgICB0aGUgcHJlZmVyZW5jZXMga2V5IHRvIGJlIGFkZGVkIG9yIGJlIHVwZGF0ZWQgCi0gICAgICogQHBhcmFtIHZhbHVlICAgIHRoZSBwcmVmZXJlbmNlcyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleQorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleSB0byBiZSBhZGRlZCBvciB1cGRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IG9yIHZhbHVlIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IG9yIHZhbHVlIGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIAotICAgICAqICAgICAgICAgICAgICAgICA8Y29kZT5NQVhfS0VZX0xFTkdUSDwvY29kZT4gb3IgdmFsdWUncyBsZW5ndGggaXMgYmlnZ2VyIHRoYW4gIAotICAgICAqICAgICAgICAgICAgICAgICB0aHJlZSBxdWFydGVycyBvZiA8Y29kZT5NQVhfS0VZX0xFTkdUSDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIHtAY29kZQorICAgICAqICAgICAgICAgICAgIE1BWF9LRVlfTEVOR1RIfSBvciB2YWx1ZSdzIGxlbmd0aCBpcyBiaWdnZXIgdGhhbiB0aHJlZQorICAgICAqICAgICAgICAgICAgIHF1YXJ0ZXJzIG9mIHtAY29kZSBNQVhfS0VZX0xFTkdUSH0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCAgICAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXRCeXRlQXJyYXkgKFN0cmluZyBrZXksIGJ5dGVbXSB2YWx1ZSk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQWRkIG5ldyBwcmVmZXJlbmNlcyB0byB0aGlzIG5vZGUgdXNpbmcgZ2l2ZW4ga2V5IGFuZCBzdHJpbmcgZm9ybSBvZiBnaXZlbiAKLSAgICAgKiB2YWx1ZSwgb3IgdXBkYXRlIHZhbHVlIGlmIHByZWZlcmVuY2VzIHdpdGggZ2l2ZW4ga2V5IGhhcyBhbHJlYWR5IGV4aXN0ZWQuIAorICAgICAqIEFkZHMgYSBuZXcgcHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgdXNpbmcgdGhlIGdpdmVuIGtleSBhbmQge0Bjb2RlIGRvdWJsZX0KKyAgICAgKiB2YWx1ZSBvciB1cGRhdGVzIHRoZSB2YWx1ZSBpZiBhIHByZWZlcmVuY2Ugd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHN0cmluZyBmb3JtIG9mIGdpdmVuIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgCi0gICAgICoge0BsaW5rIERvdWJsZSN0b1N0cmluZyhkb3VibGUpIERvdWJsZS50b1N0cmluZyhkb3VibGUpfTwvcD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgc3RvcmVkIGluIGl0cyBzdHJpbmcgZm9ybSwgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZworICAgICAqIHtAbGluayBEb3VibGUjdG9TdHJpbmcoZG91YmxlKSBEb3VibGUudG9TdHJpbmcoZG91YmxlKX0uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgICAgdGhlIHByZWZlcmVuY2VzIGtleSB0byBiZSBhZGRlZCBvciBiZSB1cGRhdGVkIAotICAgICAqIEBwYXJhbSB2YWx1ZSAgICB0aGUgcHJlZmVyZW5jZXMgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBrZXkgdG8gYmUgYWRkZWQgb3IgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGtleSBpcyBudWxsCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGtleSBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGtleSdzIGxlbmd0aCBpcyBiaWdnZXIgdGhhbiAKLSAgICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+TUFYX0tFWV9MRU5HVEg8L2NvZGU+CisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGtleSdzIGxlbmd0aCBpcyBiaWdnZXIgdGhhbiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBNQVhfS0VZX0xFTkdUSH0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCAgICAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXREb3VibGUgKFN0cmluZyBrZXksIGRvdWJsZSB2YWx1ZSk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQWRkIG5ldyBwcmVmZXJlbmNlcyB0byB0aGlzIG5vZGUgdXNpbmcgZ2l2ZW4ga2V5IGFuZCBzdHJpbmcgZm9ybSBvZiBnaXZlbiAKLSAgICAgKiB2YWx1ZSwgb3IgdXBkYXRlIHZhbHVlIGlmIHByZWZlcmVuY2VzIHdpdGggZ2l2ZW4ga2V5IGhhcyBhbHJlYWR5IGV4aXN0ZWQuIAorICAgICAqIEFkZHMgYSBuZXcgcHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgdXNpbmcgdGhlIGdpdmVuIGtleSBhbmQge0Bjb2RlIGZsb2F0fSAKKyAgICAgKiB2YWx1ZSBvciB1cGRhdGVzIHRoZSB2YWx1ZSBpZiBhIHByZWZlcmVuY2Ugd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHN0cmluZyBmb3JtIG9mIGdpdmVuIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgCi0gICAgICoge0BsaW5rIEZsb2F0I3RvU3RyaW5nKGZsb2F0KSBGbG9hdC50b1N0cmluZyhmbG9hdCl9PC9wPgorICAgICAqIFRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gaXRzIHN0cmluZyBmb3JtLCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nCisgICAgICoge0BsaW5rIEZsb2F0I3RvU3RyaW5nKGZsb2F0KSBGbG9hdC50b1N0cmluZyhmbG9hdCl9LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlcyBrZXkgdG8gYmUgYWRkZWQgb3IgYmUgdXBkYXRlZCAKLSAgICAgKiBAcGFyYW0gdmFsdWUgICAgdGhlIHByZWZlcmVuY2VzIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5CisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Uga2V5IHRvIGJlIGFkZGVkIG9yIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkgaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkncyBsZW5ndGggaXMgYmlnZ2VyIHRoYW4gCi0gICAgICogICAgICAgICAgICAgICAgIDxjb2RlPk1BWF9LRVlfTEVOR1RIPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkncyBsZW5ndGggaXMgYmlnZ2VyIHRoYW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgTUFYX0tFWV9MRU5HVEh9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQgICAgCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0RmxvYXQgKFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKTsKICAgICAKICAgICAvKioKLSAgICAgKiBBZGQgbmV3IHByZWZlcmVuY2VzIHRvIHRoaXMgbm9kZSB1c2luZyBnaXZlbiBrZXkgYW5kIHN0cmluZyBmb3JtIG9mIGdpdmVuIAotICAgICAqIHZhbHVlLCBvciB1cGRhdGUgdmFsdWUgaWYgcHJlZmVyZW5jZXMgd2l0aCBnaXZlbiBrZXkgaGFzIGFscmVhZHkgZXhpc3RlZC4gCisgICAgICogQWRkcyBhIG5ldyBwcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSB1c2luZyB0aGUgZ2l2ZW4ga2V5IGFuZCB7QGNvZGUgaW50fSAKKyAgICAgKiB2YWx1ZSBvciB1cGRhdGVzIHRoZSB2YWx1ZSBpZiBhIHByZWZlcmVuY2Ugd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHN0cmluZyBmb3JtIG9mIGdpdmVuIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgCi0gICAgICoge0BsaW5rIEludGVnZXIjdG9TdHJpbmcoaW50KSBJbnRlZ2VyLnRvU3RyaW5nKGludCl9PC9wPgorICAgICAqIFRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gaXRzIHN0cmluZyBmb3JtLCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nCisgICAgICoge0BsaW5rIEludGVnZXIjdG9TdHJpbmcoaW50KSBJbnRlZ2VyLnRvU3RyaW5nKGludCl9LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBwcmVmZXJlbmNlcyBrZXkgdG8gYmUgYWRkZWQgb3IgYmUgdXBkYXRlZCAKLSAgICAgKiBAcGFyYW0gdmFsdWUgICAgdGhlIHByZWZlcmVuY2VzIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5CisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Uga2V5IHRvIGJlIGFkZGVkIG9yIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkgaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkncyBsZW5ndGggaXMgYmlnZ2VyIHRoYW4gCi0gICAgICogICAgICAgICAgICAgICAgIDxjb2RlPk1BWF9LRVlfTEVOR1RIPC9jb2RlPgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkncyBsZW5ndGggaXMgYmlnZ2VyIHRoYW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgTUFYX0tFWV9MRU5HVEh9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQgICAgCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0SW50IChTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwogICAgIAogICAgIC8qKgotICAgICAqIEFkZCBuZXcgcHJlZmVyZW5jZXMgdG8gdGhpcyBub2RlIHVzaW5nIGdpdmVuIGtleSBhbmQgc3RyaW5nIGZvcm0gb2YgZ2l2ZW4gCi0gICAgICogdmFsdWUsIG9yIHVwZGF0ZSB2YWx1ZSBpZiBwcmVmZXJlbmNlcyB3aXRoIGdpdmVuIGtleSBoYXMgYWxyZWFkeSBleGlzdGVkLiAKKyAgICAgKiBBZGRzIGEgbmV3IHByZWZlcmVuY2UgdG8gdGhpcyBub2RlIHVzaW5nIHRoZSBnaXZlbiBrZXkgYW5kIHtAY29kZSBsb25nfSAKKyAgICAgKiB2YWx1ZSBvciB1cGRhdGVzIHRoZSB2YWx1ZSBpZiBhIHByZWZlcmVuY2Ugd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHN0cmluZyBmb3JtIG9mIGdpdmVuIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgCi0gICAgICoge0BsaW5rIExvbmcjdG9TdHJpbmcobG9uZykgTG9uZy50b1N0cmluZyhsb25nKX08L3A+CisgICAgICogVGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBpdHMgc3RyaW5nIGZvcm0sIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcKKyAgICAgKiB7QGxpbmsgTG9uZyN0b1N0cmluZyhsb25nKSBMb25nLnRvU3RyaW5nKGxvbmcpfS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSAgICB0aGUgcHJlZmVyZW5jZXMga2V5IHRvIGJlIGFkZGVkIG9yIGJlIHVwZGF0ZWQgCi0gICAgICogQHBhcmFtIHZhbHVlICAgIHRoZSBwcmVmZXJlbmNlcyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleQorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIGtleSB0byBiZSBhZGRlZCBvciB1cGRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5IGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIAotICAgICAqICAgICAgICAgICAgICAgICA8Y29kZT5NQVhfS0VZX0xFTkdUSDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ga2V5J3MgbGVuZ3RoIGlzIGJpZ2dlciB0aGFuIHtAY29kZQorICAgICAqICAgICAgICAgICAgIE1BWF9LRVlfTEVOR1RIfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkICAgIAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dExvbmcgKFN0cmluZyBrZXksIGxvbmcgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBwcmVmZXJlbmNlcyBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBmcm9tIHRoaXMgbm9kZS4KKyAgICAgKiBSZW1vdmVzIHRoZSBwcmVmZXJlbmNlIG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhpcyBub2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgICAgdGhlIGdpdmVuIHByZWZlcmVuY2VzIGtleSB0byByZW1vdmVkIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHByZWZlcmVuY2UgdG8gYmUgcmVtb3ZlZC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBrZXkgaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQgICAgCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlIChTdHJpbmcga2V5KTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhpcyBwcmVmZXJlbmNlcyBub2RlIGFuZCBpdHMgYWxsIGRlc2NlbmRhbnRzLiBUaGUgcmVtb3ZhbCBtYXliZQotICAgICAqIHdvbid0IGJlIHBlcnNpc3RlZCB1bnRpbCB0aGUgPGNvZGU+Zmx1c2goKTwvY29kZT4gbWV0aG9kIGlzIGludm9rZWQuIAorICAgICAqIFJlbW92ZXMgdGhpcyBwcmVmZXJlbmNlIG5vZGUgd2l0aCBhbGwgaXRzIGRlc2NlbmRhbnRzLiBUaGUgcmVtb3ZhbCAKKyAgICAgKiB3b24ndCBuZWNlc3NhcmlseSBiZSBwZXJzaXN0ZWQgdW50aWwgdGhlIG1ldGhvZCB7QGNvZGUgZmx1c2goKX0gaXMgaW52b2tlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiBiYWNraW5nIHN0b3JlIGlzIHVuYXZhaWxhYmxlIG9yIGNhdXNlcyBvcGVyYXRpb24gZmFpbHVyZSAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhpcyBpcyBhIHJvb3Qgbm9kZQorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgaXMgYSByb290IG5vZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlTm9kZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb247CiAgICAgCiAgICAgLyoqCi0gICAgICogUmVnaXN0ZXIgYW4gPGNvZGU+Tm9kZUNoYW5nZUxpc3RlbmVyPC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhpcyBub2RlLCB3aGljaCAKLSAgICAgKiB3aWxsIHJlY2VpdmUgPGNvZGU+Tm9kZUNoYW5nZUV2ZW50PC9jb2RlPi4gPGNvZGU+Tm9kZUNoYW5nZUV2ZW50PC9jb2RlPiB3aWxsIAotICAgICAqIGJlIHByb2R1Y2VkIHdoZW4gZGlyZWN0IGNoaWxkIG5vZGUgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgbm9kZS4gCisgICAgICogUmVnaXN0ZXJzIGEge0Bjb2RlIE5vZGVDaGFuZ2VMaXN0ZW5lcn0gaW5zdGFuY2UgZm9yIHRoaXMgbm9kZSwgd2hpY2ggd2lsbCBoYW5kbGUKKyAgICAgKiB7QGNvZGUgTm9kZUNoYW5nZUV2ZW50fXMuIHtAY29kZSBOb2RlQ2hhbmdlRXZlbnR9cyB3aWxsIGJlIGZpcmVkIHdoZW4gYSBjaGlsZCBub2RlIGhhcworICAgICAqIGJlZW4gYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmNsICAgIHRoZSBnaXZlbiBsaXN0ZW5lciB0byBiZSByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIG5jbAorICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBsaXN0ZW5lciBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGROb2RlQ2hhbmdlTGlzdGVuZXIgKE5vZGVDaGFuZ2VMaXN0ZW5lciBuY2wpOwogICAgIAogICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGFuIDxjb2RlPlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gaW5zdGFuY2UgZm9yIHRoaXMgbm9kZSwgd2hpY2ggCi0gICAgICogd2lsbCByZWNlaXZlIDxjb2RlPlByZWZlcmVuY2VDaGFuZ2VFdmVudDwvY29kZT4uIDxjb2RlPlByZWZlcmVuY2VDaGFuZ2VFdmVudDwvY29kZT4gd2lsbCAKLSAgICAgKiBiZSBwcm9kdWNlZCB3aGVuIHByZWZlcmVuY2UgaXMgYWRkZWQgdG8sIHJlbW92ZWQgZnJvbSBvciB1cGRhdGVkIGZvciB0aGlzIG5vZGUuIAorICAgICAqIFJlZ2lzdGVycyBhIHtAY29kZSBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJ9IGluc3RhbmNlIGZvciB0aGlzIG5vZGUsIHdoaWNoIHdpbGwKKyAgICAgKiBoYW5kbGUge0Bjb2RlIFByZWZlcmVuY2VDaGFuZ2VFdmVudH1zLiB7QGNvZGUgUHJlZmVyZW5jZUNoYW5nZUV2ZW50fXMgd2lsbCBiZSBmaXJlZCB3aGVuCisgICAgICogYSBwcmVmZXJlbmNlIGhhcyBiZWVuIGFkZGVkIHRvLCByZW1vdmVkIGZyb20sIG9yIHVwZGF0ZWQgZm9yIHRoaXMgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGNsICAgIHRoZSBnaXZlbiBsaXN0ZW5lciB0byBiZSByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIHBjbAorICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBsaXN0ZW5lciBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgKFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwY2wpOwogICAgIAogICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gPGNvZGU+Tm9kZUNoYW5nZUxpc3RlbmVyPC9jb2RlPiBpbnN0YW5jZSBmcm9tIHRoaXMgbm9kZS4gCisgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4ge0Bjb2RlIE5vZGVDaGFuZ2VMaXN0ZW5lcn0gaW5zdGFuY2UgZnJvbSB0aGlzIG5vZGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5jbCAgICB0aGUgZ2l2ZW4gbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAorICAgICAqIEBwYXJhbSBuY2wKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBsaXN0ZW5lciAKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyIChOb2RlQ2hhbmdlTGlzdGVuZXIgbmNsKTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIDxjb2RlPlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gaW5zdGFuY2UgZnJvbSB0aGlzIG5vZGUuIAorICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIHtAY29kZSBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJ9IGluc3RhbmNlIGZyb20gdGhpcyBub2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwY2wgICAgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcGFyYW0gcGNsCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGxpc3RlbmVyIGlzIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciAoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHBjbCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogU3luY2hyb25pemUgdGhpcyBwcmVmZXJlbmNlcyBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMnIGRhdGEgd2l0aCB0aGUgYmFjayAKLSAgICAgKiBlbmQgcHJlZmVyZW5jZXMgc3RvcmUuIFRoZSBjaGFuZ2VzIG9mIGJhY2sgZW5kIHNob3VsZCBiZSByZWZsZWN0IGJ5IHRoaXMgCi0gICAgICogbm9kZSBhbmQgaXRzIGRlc2NlbmRhbnRzLCBtZWFud2hpbGUsIHRoZSBjaGFuZ2VzIG9mIHRoaXMgbm9kZSBhbmQgZGVzY2VuZGFudHMgCi0gICAgICogc2hvdWxkIGJlIHBlcnNpc3RlZC4KKyAgICAgKiBTeW5jaHJvbml6ZXMgdGhlIGRhdGEgb2YgdGhpcyBwcmVmZXJlbmNlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyB3aXRoCisgICAgICogdGhlIGJhY2stZW5kIHByZWZlcmVuY2Ugc3RvcmUuIEFueSBjaGFuZ2VzIGZvdW5kIGluIHRoZSBiYWNrLWVuZCBkYXRhIHNob3VsZCBiZSByZWZsZWN0ZWQKKyAgICAgKiBpbiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cywgYW5kIGF0IHRoZSBzYW1lIHRpbWUgYW55IGxvY2FsIGNoYW5nZXMgdG8gdGhpcyBub2RlIGFuZAorICAgICAqIGRlc2NlbmRhbnRzIHNob3VsZCBiZSBwZXJzaXN0ZWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgb3BlcmF0aW9uIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYmFja2luZyBzdG9yZSBpcyB1bmF2YWlsYWJsZSBvciBjYXVzZXMgYW4gb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbm9kZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN5bmMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uOwogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByZWZlcmVuY2Ugbm9kZSBmb3IgdGhlIHBhY2thZ2Ugb2YgZ2l2ZW4gY2xhc3MuIFRoZSAKLSAgICAgKiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXR1cm5lZCBub2RlIGlzIG9uZSBzbGFzaCBmb2xsb3dlZCBieSB0aGUgZ2l2ZW4gCi0gICAgICogY2xhc3MncyBmdWxsIHBhY2thZ2UgbmFtZSB3aXRoIHJlcGxhY2luZyBlYWNoIHBlcmlvZCAoJy4nKSB3aXRoIHNsYXNoLgotICAgICAqIEZvciBleGFtcGxlLCB0aGUgcHJlZmVyZW5jZSdzIGFzc29jaWF0ZWQgd2l0aCBjbGFzcyA8Y29kZT5PYmplY3Q8Y29kZT4gCi0gICAgICogaGFzIGFic29sdXRlIHBhdGggbGlrZSAiL2phdmEvbGFuZyIuIEFzIGEgc3BlY2lhbCBjYXNlLCB0aGUgdW5uYW1lZCAKLSAgICAgKiBwYWNrYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBwcmVmZXJlbmNlIG5vZGUgIi88dW5uYW1lZD4iLiAKLSAgICAgKiAgCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgbm9kZSBhbmQgaXRzIGFuY2VzdG9ycyBpZiBuZWVkZWQsIGFuZCB0aGUgbmV3IAotICAgICAqIGNyZWF0ZWQgbm9kZXMgbWF5YmUgd29uJ3QgYmUgcGVyc2lzdGVkIHVudGlsIHRoZSA8Y29kZT5mbHVzaCgpPC9jb2RlPiAKLSAgICAgKiBpcyBpbnZva2VkLgorICAgICAqIFJldHVybnMgdGhlIHN5c3RlbSBwcmVmZXJlbmNlIG5vZGUgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmV0dXJuZWQgbm9kZSBpcyBvbmUgc2xhc2ggZm9sbG93ZWQgYnkgdGhlIGdpdmVuCisgICAgICogY2xhc3MncyBmdWxsIHBhY2thZ2UgbmFtZSwgcmVwbGFjaW5nIGVhY2ggcGVyaW9kIGNoYXJhY3RlciAoJy4nKSB3aXRoCisgICAgICogYSBzbGFzaC4gRm9yIGV4YW1wbGUsIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwcmVmZXJlbmNlIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgKiB0aGUgY2xhc3MgT2JqZWN0IHdvdWxkIGJlICIvamF2YS9sYW5nIi4gQXMgYSBzcGVjaWFsIGNhc2UsIHRoZSB1bm5hbWVkCisgICAgICogcGFja2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBwcmVmZXJlbmNlIG5vZGUgIi8mbHQ7dW5uYW1lZCZndDsiLiBUaGlzCisgICAgICogbWV0aG9kIHdpbGwgY3JlYXRlIHRoZSBub2RlIGFuZCBpdHMgYW5jZXN0b3JzIGFzIG5lZWRlZC4gQW55IG5vZGVzIGNyZWF0ZWQKKyAgICAgKiBieSB0aGlzIG1ldGhvZCB3b24ndCBuZWNlc3NhcmlseSBiZSBwZXJzaXN0ZWQgdW50aWwgdGhlIG1ldGhvZCB7QGNvZGUgZmx1c2goKX0gaXMKKyAgICAgKiBpbnZva2VkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjICAgICAgICB0aGUgZ2l2ZW4gY2xhc3MgCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSBzeXN0ZW0gcHJlZmVyZW5jZSBub2RlIGZvciB0aGUgcGFja2FnZSBvZiBnaXZlbiBjbGFzcy4gCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gcHJlZmVyZW5jZSBub2RlIGZvciB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBjbGFzcyBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiA8Y29kZT5SdW50aW1lUGVybWlzc2lvbigicHJlZmVyZW5jZXMiKTwvY29kZT4gaXMgZGVuaWVkIAotICAgICAqICAgICAgICAgICAgICAgICBieSBhIDxjb2RlPlNlY3VyaXR5TWFuYWdlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFJ1bnRpbWVQZXJtaXNzaW9uKCJwcmVmZXJlbmNlcyIpfSBpcyBkZW5pZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBhIFNlY3VyaXR5TWFuYWdlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIHN5c3RlbU5vZGVGb3JQYWNrYWdlIChDbGFzczw/PiBjKSB7CiAgICAgICAgIGNoZWNrU2VjdXJpdHkoKTsKQEAgLTg0OSwxMiArOTU2LDEzIEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcm9vdCBub2RlIGZvciBzeXN0ZW0gcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSBzeXN0ZW0gcHJlZmVyZW5jZSBoaWVyYXJjaHkuCiAgICAgICogCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSByb290IG5vZGUgZm9yIHN5c3RlbSBwcmVmZXJlbmNlIGhpZXJhcmNoeQorICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBwcmVmZXJlbmNlIGhpZXJhcmNoeSByb290IG5vZGUuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiA8Y29kZT5SdW50aW1lUGVybWlzc2lvbigicHJlZmVyZW5jZXMiKTwvY29kZT4gaXMgZGVuaWVkIAotICAgICAqICAgICAgICAgICAgICAgICBieSBhIDxjb2RlPlNlY3VyaXR5TWFuYWdlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFJ1bnRpbWVQZXJtaXNzaW9uKCJwcmVmZXJlbmNlcyIpfSBpcyBkZW5pZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBhIFNlY3VyaXR5TWFuYWdlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIHN5c3RlbVJvb3QoKSB7CiAgICAgICAgIGNoZWNrU2VjdXJpdHkoKTsKQEAgLTg3MSwyNCArOTc5LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB1c2VyIHByZWZlcmVuY2Ugbm9kZSBmb3IgdGhlIHBhY2thZ2Ugb2YgZ2l2ZW4gY2xhc3MuIFRoZSAKLSAgICAgKiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXR1cm5lZCBub2RlIGlzIG9uZSBzbGFzaCBmb2xsb3dlZCBieSB0aGUgZ2l2ZW4gCi0gICAgICogY2xhc3MncyBmdWxsIHBhY2thZ2UgbmFtZSB3aXRoIHJlcGxhY2luZyBlYWNoIHBlcmlvZCAoJy4nKSB3aXRoIHNsYXNoLgotICAgICAqIEZvciBleGFtcGxlLCB0aGUgcHJlZmVyZW5jZSdzIGFzc29jaWF0ZWQgd2l0aCBjbGFzcyA8Y29kZT5PYmplY3Q8Y29kZT4gCi0gICAgICogaGFzIGFic29sdXRlIHBhdGggbGlrZSAiL2phdmEvbGFuZyIuIEFzIGEgc3BlY2lhbCBjYXNlLCB0aGUgdW5uYW1lZCAKLSAgICAgKiBwYWNrYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBwcmVmZXJlbmNlIG5vZGUgIi88dW5uYW1lZD4iLiAKLSAgICAgKiAgCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgbm9kZSBhbmQgaXRzIGFuY2VzdG9ycyBpZiBuZWVkZWQsIGFuZCB0aGUgbmV3IAotICAgICAqIGNyZWF0ZWQgbm9kZXMgbWF5YmUgd29uJ3QgYmUgcGVyc2lzdGVkIHVudGlsIHRoZSA8Y29kZT5mbHVzaCgpPC9jb2RlPiAKLSAgICAgKiBpcyBpbnZva2VkLgorICAgICAqIFJldHVybnMgdGhlIHVzZXIgcHJlZmVyZW5jZSBub2RlIGZvciB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJldHVybmVkIG5vZGUgaXMgb25lIHNsYXNoIGZvbGxvd2VkIGJ5IHRoZSBnaXZlbgorICAgICAqIGNsYXNzJ3MgZnVsbCBwYWNrYWdlIG5hbWUsIHJlcGxhY2luZyBlYWNoIHBlcmlvZCBjaGFyYWN0ZXIgKCcuJykgd2l0aAorICAgICAqIGEgc2xhc2guIEZvciBleGFtcGxlLCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggCisgICAgICogdGhlIGNsYXNzIE9iamVjdCB3b3VsZCBiZSAiL2phdmEvbGFuZyIuIEFzIGEgc3BlY2lhbCBjYXNlLCB0aGUgdW5uYW1lZAorICAgICAqIHBhY2thZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcHJlZmVyZW5jZSBub2RlICIvJmx0O3VubmFtZWQmZ3Q7Ii4gVGhpcworICAgICAqIG1ldGhvZCB3aWxsIGNyZWF0ZSB0aGUgbm9kZSBhbmQgaXRzIGFuY2VzdG9ycyBhcyBuZWVkZWQuIEFueSBub2RlcyBjcmVhdGVkCisgICAgICogYnkgdGhpcyBtZXRob2Qgd29uJ3QgbmVjZXNzYXJpbHkgYmUgcGVyc2lzdGVkIHVudGlsIHRoZSBtZXRob2Qge0Bjb2RlIGZsdXNoKCl9IGlzCisgICAgICogaW52b2tlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyAgICB0aGUgZ2l2ZW4gY2xhc3MgCi0gICAgICogQHJldHVybiAgICAgICAgIHRoZSB1c2VyIHByZWZlcmVuY2Ugbm9kZSBmb3IgdGhlIHBhY2thZ2Ugb2YgZ2l2ZW4gY2xhc3MuIAorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgdXNlciBwcmVmZXJlbmNlIG5vZGUgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBjbGFzcy4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgaWYgPGNvZGU+UnVudGltZVBlcm1pc3Npb24oInByZWZlcmVuY2VzIik8L2NvZGU+IGlzIGRlbmllZCAKLSAgICAgKiAgICAgICAgICAgICAgICAgYnkgYSA8Y29kZT5TZWN1cml0eU1hbmFnZXI8L2NvZGU+CisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBSdW50aW1lUGVybWlzc2lvbigicHJlZmVyZW5jZXMiKX0gaXMgZGVuaWVkIGJ5CisgICAgICogICAgICAgICAgICAgYSBTZWN1cml0eU1hbmFnZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlcyB1c2VyTm9kZUZvclBhY2thZ2UgKENsYXNzPD8+IGMpIHsKICAgICAgICAgY2hlY2tTZWN1cml0eSgpOwpAQCAtODk3LDcgKzEwMDYsNyBAQAogICAgIAogICAgIC8vcGFyc2Ugbm9kZSdzIGFic29sdXRlIHBhdGggZnJvbSBjbGFzcyBpbnN0YW5jZQogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROb2RlTmFtZShDbGFzczw/PiBjKXsKLSAgICAgICAgLy8gPz8/IFBSRUZTIFRPRE8gY2hhbmdlIGJhY2sgdG8gaGFybW9ueSBjb2RlIG9uY2UgZ2V0UGFja2FnZSAKKyAgICAgICAgLy8gPz8/IFBSRUZTIFRPRE8gY2hhbmdlIGJhY2sgdG8gaGFybW9ueSBjb2RlIG9uY2UgZ2V0UGFja2FnZQogICAgICAgICAvLyBkZWxpdmVycyB0aGUgY29ycmVjdCByZXN1bHRzCiAgICAgICAgIC8vIFBhY2thZ2UgcCA9IGMuZ2V0UGFja2FnZSgpOwogICAgICAgICAvLyBpZihudWxsID09IHApewpAQCAtOTA5LDI0ICsxMDE4LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByb290IG5vZGUgZm9yIHVzZXIgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSB1c2VyIHByZWZlcmVuY2UgaGllcmFyY2h5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gICAgICAgICB0aGUgcm9vdCBub2RlIGZvciB1c2VyIHByZWZlcmVuY2UgaGllcmFyY2h5CisgICAgICogQHJldHVybiB0aGUgdXNlciBwcmVmZXJlbmNlIGhpZXJhcmNoeSByb290IG5vZGUuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICBpZiA8Y29kZT5SdW50aW1lUGVybWlzc2lvbigicHJlZmVyZW5jZXMiKTwvY29kZT4gaXMgZGVuaWVkIAotICAgICAqICAgICAgICAgICAgICAgICBieSBhIDxjb2RlPlNlY3VyaXR5TWFuYWdlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFJ1bnRpbWVQZXJtaXNzaW9uKCJwcmVmZXJlbmNlcyIpfSBpcyBkZW5pZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBhIFNlY3VyaXR5TWFuYWdlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIHVzZXJSb290KCkgewogICAgICAgICBjaGVja1NlY3VyaXR5KCk7CiAgICAgICAgIHJldHVybiBmYWN0b3J5LnVzZXJSb290KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoaXMgbm9kZS4gVGhlIGZvcm1hdCBpcyAiVXNlci9TeXN0ZW0gCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuIFRoZSBmb3JtYXQgaXMgIlVzZXIvU3lzdGVtCiAgICAgICogUHJlZmVyZW5jZSBOb2RlOiAiIGZvbGxvd2VkIGJ5IHRoaXMgbm9kZSdzIGFic29sdXRlIHBhdGguCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmlwdGlvbiBvZiB0aGlzIG5vZGUKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzRmFjdG9yeS5qYXZhIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXNGYWN0b3J5LmphdmEKaW5kZXggZTQzMGMwOC4uZTU2ZGQ5NSAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXNGYWN0b3J5LmphdmEKKysrIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXNGYWN0b3J5LmphdmEKQEAgLTE4LDI3ICsxOCwyOCBAQAogcGFja2FnZSBqYXZhLnV0aWwucHJlZnM7CiAKIC8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB7QGxpbmsgUHJlZmVyZW5jZXN9IGNsYXNzIAotICogYXMgZmFjdG9yeSBjbGFzcyB0byBjcmVhdGUgUHJlZmVyZW5jZXMgaW5zdGFuY2UuIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSBpbXBsZW1lbnRlZCAKLSAqIGFuZCBpbnN0YWxsZWQgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIHtAbGluayBQcmVmZXJlbmNlc30gY2xhc3MgYXMgZmFjdG9yeSBjbGFzcyB0bworICogY3JlYXRlIHtAY29kZSBQcmVmZXJlbmNlc30gaW5zdGFuY2VzLiBUaGlzIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYW5kIGluc3RhbGxlZAorICogdG8gcmVwbGFjZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBpbXBsZW1lbnRhdGlvbi4KICAqIAotICogQHNlZSBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMKLSAqIAotICogQHNpbmNlIDEuNAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUHJlZmVyZW5jZXNGYWN0b3J5IHsKKwogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2VzIGhpZXJhcmNoeSBmb3IgdGhlIGNhbGxpbmcgdXNlcgorICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcHJlZmVyZW5jZXMgaGllcmFyY2h5IGZvciB0aGUgY2FsbGluZyB1c2VyCiAgICAgICogY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSB1c2VyIHJvb3QgcHJlZmVyZW5jZXMgbm9kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyIHByZWZlcmVuY2VzIGhpZXJhcmNoeSByb290IG5vZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgUHJlZmVyZW5jZXMgdXNlclJvb3QoKTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBzeXN0ZW0gcHJlZmVyZW5jZXMgaGllcmFyY2h5LgorICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgc3lzdGVtIHByZWZlcmVuY2VzIGhpZXJhcmNoeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByb290IG9mIHRoZSBzeXN0ZW0gcHJlZmVyZW5jZXMgaGllcmFyY2h5LgorICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBwcmVmZXJlbmNlcyBoaWVyYXJjaHkgcm9vdCBub2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFByZWZlcmVuY2VzIHN5c3RlbVJvb3QoKTsKIH0KZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL1hNTFBhcnNlci5qYXZhIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvWE1MUGFyc2VyLmphdmEKaW5kZXggYTNmZGI2Yy4uMmVkZmM3MSAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvWE1MUGFyc2VyLmphdmEKKysrIGIvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvWE1MUGFyc2VyLmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKQEAgLTQxLDEyICs0MCwxNiBAQAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisvLyBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKKy8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CisvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKKy8vIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQVBJOworLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CiBpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwpAQCAtNTQsOSArNTcsMTYgQEAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CiAKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy8gRU5EIGFuZHJvaWQtYWRkZWQKKwogLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB0aGUgUHJlZmVyZW5jZXMgaW1wb3J0L2V4cG9ydCBmcm9tIFhNTCBmaWxlLgorICogVXRpbGl0eSBjbGFzcyBmb3IgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcge0Bjb2RlIFByZWZlcmVuY2VzfSBkYXRhIGZyb20gYW4gWE1MIGZpbGUuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBjbGFzcyBYTUxQYXJzZXIgewogCkBAIC0xMTksNyArMTI5LDkgQEAKICAgICAgKi8KICAgICBzdGF0aWMgewogICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKICAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CkBAIC0zNTcsNyArMzY5LDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGxvYWQgWE1MIGRvY3VtZW50CiAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8vIGNoZWNrIHByZWZlcmVuY2VzJyBleHBvcnQgdmVyc2lvbgogICAgICAgICAgICAgRWxlbWVudCBwcmVmZXJlbmNlczsKICAgICAgICAgICAgIHByZWZlcmVuY2VzID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwpAQCAtMzg2LDEyICszOTgsMjIgQEAKICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vICAgICB0aHJvdyBuZXcgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uKGUpOworICAgICAgICAvLyB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWROb2RlKFByZWZlcmVuY2VzIHByZWZzLCBFbGVtZW50IG5vZGUpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIHJlbW92ZWQgdGhyb3cgY2xhdXNlIGZvciBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIC8vIGxvYWQgcHJlZmVyZW5jZXMKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gc2VsZWN0Tm9kZUxpc3Qobm9kZSwgIm5vZGUiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICBOb2RlTGlzdCBlbnRyaWVzID0gc2VsZWN0Tm9kZUxpc3Qobm9kZSwgIm1hcC9lbnRyeSIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaW50IGNoaWxkTnVtYmVyID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7CiAgICAgICAgIFByZWZlcmVuY2VzW10gcHJlZkNoaWxkcmVuID0gbmV3IFByZWZlcmVuY2VzW2NoaWxkTnVtYmVyXTsKICAgICAgICAgaW50IGVudHJ5TnVtYmVyID0gZW50cmllcy5nZXRMZW5ndGgoKTsKQEAgLTQxOSw4ICs0NDEsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgCi0gICAgLy8gPz8/IFBSRUZTIFRPRE8gZGlydHkgaW1wbGVtZW50YXRpb24gb2YgYSBtZXRob2QgZnJvbSBqYXZheC54bWwueHBhdGgKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgLy8gVE9ETyBkaXJ0eSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1ldGhvZCBmcm9tIGphdmF4LnhtbC54cGF0aAogICAgIC8vIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgY2FsbCB0byBhIGdvb2QgaW1wbCBvZiB0aGlzIG1ldGhvZAogICAgIHByaXZhdGUgc3RhdGljIE5vZGVMaXN0IHNlbGVjdE5vZGVMaXN0KEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50LCBTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgIApAQCAtNDY2LDYgKzQ4OCw3IEBACiAgICAgICAgIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgKiB1dGlsaXRpZXMgZm9yIEZpbGVQcmVmZXJlbmNlc0ltcGwsIHdoaWNoIGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgTGludXggcGxhdGZvcm0KQEAgLTUwOSw4ICs1MzIsMTAgQEAKICAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCBjaGFubmVsID0gaXN0cmVhbS5nZXRDaGFubmVsKCk7CiAgICAgICAgICAgICAgICAgbG9jayA9IGNoYW5uZWwubG9jaygwTCwgTG9uZy5NQVhfVkFMVUUsIHRydWUpOwogICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UoaW4pOworICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbW9kaWZpZWQKICAgICAgICAgICAgICAgICBOb2RlTGlzdCBlbnRyaWVzID0gc2VsZWN0Tm9kZUxpc3QoZG9jCiAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnRFbGVtZW50KCksICJlbnRyeSIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtbW9kaWZpZWQKICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZW50cmllcy5nZXRMZW5ndGgoKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBlbnRyaWVzLml0ZW0oaSk7CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9wYWNrYWdlLmh0bWwgYi9wcmVmcy9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9wcmVmcy9wYWNrYWdlLmh0bWwKaW5kZXggYmI2OGMzNC4uOGEzZGQzMyAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcHJlZnMvcGFja2FnZS5odG1sCisrKyBiL3ByZWZzL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ByZWZzL3BhY2thZ2UuaHRtbApAQCAtMSwxMSArMSwxNCBAQAogPGh0bWw+CiAgIDxib2R5PgogICAgIDxwPgotICAgICAgUHJvdmlkZXMgYSBwcmVmZXJlbmNlcyBtZWNoYW5pc20sIHRoYXQgaXMsIGEgbWVhbnMgb2Ygd3JpdGluZworICAgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgcHJlZmVyZW5jZXMgbWVjaGFuaXNtLCB0aGF0IGlzLCBhIG1lYW5zIG9mIHdyaXRpbmcKICAgICAgIGNvbmZpZ3VyYXRpb24gZGF0YSAoa2V5L3ZhbHVlIHBhaXJzKSB0byBhIHBlcnNpc3RlbnQgZGF0YSBzdG9yZSBhbmQKICAgICAgIHJldHJpZXZpbmcgaXQgZnJvbSB0aGVyZS4gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2luZHMgb2Ygc3RvcmVzCi0gICAgICBhdmFpbGFibGUsIG9uZSBmb3Igc3RvcmluZyB1c2VyIGRhdGEgYW5kIG9uZSBmb3Igc3RvcmluZyBzeXN0ZW0KLSAgICAgIGNvbmZpZ3VyYXRpb24gZGF0YS4KKyAgICAgIGF2YWlsYWJsZTogb25lIGZvciBzdG9yaW5nIHVzZXIgZGF0YSBhbmQgb25lIGZvciBzdG9yaW5nIHN5c3RlbQorICAgICAgY29uZmlndXJhdGlvbiBkYXRhLiBTaW5jZSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpcyBkZXBlbmRlbnQKKyAgICAgIG9uIHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB0aGlzIHBhY2thZ2UgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIGluc3RhbGxhdGlvbgorICAgICAgb2YgYSBjdXN0b20gc2VydmljZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbi4KICAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhIGIvcHJlZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKaW5kZXggMThiMGIzYS4uY2ZjNzIzNiAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvcHJlZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKQEAgLTIxLDYgKzIxLDEwIEBACiAgKiBpZiB0aGlzIHRvb2wgcnVucyBhZ2Fpbi4gQmV0dGVyIG1ha2UgY2hhbmdlcyBpbiB0aGUgdGVtcGxhdGUgZmlsZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFJlZHVuZGFudCBjb2RlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vdyBjYWxsZWQgZnJvbSBNc2dIZWxwLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy5pbnRlcm5hbC5ubHM7CiAKIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKQEAgLTEyOSw0ICsxMzMsOCBAQAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2csIGFyZ3MpOwogICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gRHVwbGljYXRlIGNvZGUgd2FzIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgTXNnSGVscC4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiB9CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvQWJzdHJhY3RQcmVmZXJlbmNlc1Rlc3QuamF2YSBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9BYnN0cmFjdFByZWZlcmVuY2VzVGVzdC5qYXZhCmluZGV4IDhmMTk2NjYuLjlmYmU4MGQgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9BYnN0cmFjdFByZWZlcmVuY2VzVGVzdC5qYXZhCisrKyBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9BYnN0cmFjdFByZWZlcmVuY2VzVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy50ZXN0cy5qYXZhLnV0aWwucHJlZnM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTUxLDE4MzEgKzU2LDI1NjkgQEAKICAqIFRPRE86IHJlZmluZSB0aGlzIHRlc3QgdG8gYWRhcHQgYWxsIGltcGxlbWVudGF0aW9ucwogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQWJzdHJhY3RQcmVmZXJlbmNlcy5jbGFzcykKIHB1YmxpYyBjbGFzcyBBYnN0cmFjdFByZWZlcmVuY2VzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCUFic3RyYWN0UHJlZmVyZW5jZXMgcHJlZjsKKyAgICBBYnN0cmFjdFByZWZlcmVuY2VzIHByZWY7CiAKLQlzdGF0aWMgQWJzdHJhY3RQcmVmZXJlbmNlcyByb290ID0gbnVsbDsKKyAgICBzdGF0aWMgQWJzdHJhY3RQcmVmZXJlbmNlcyByb290ID0gbnVsbDsKIAotCXN0YXRpYyBBYnN0cmFjdFByZWZlcmVuY2VzIHBhcmVudCA9IG51bGw7CisgICAgc3RhdGljIEFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50ID0gbnVsbDsKIAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgbG9uZ0tleTsKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIGxvbmdLZXk7CiAKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIGxvbmdWYWx1ZTsKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIGxvbmdWYWx1ZTsKIAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgbG9uZ05hbWU7CisgICAgZmluYWwgc3RhdGljIFN0cmluZyBsb25nTmFtZTsKIAotCU1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgbmw7CisgICAgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBubDsKIAotCU1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGw7CisgICAgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwbDsKIAotCXN0YXRpYyB7Ci0JCVN0cmluZ0J1ZmZlciBrZXkgPSBuZXcgU3RyaW5nQnVmZmVyKFByZWZlcmVuY2VzLk1BWF9LRVlfTEVOR1RIKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQcmVmZXJlbmNlcy5NQVhfS0VZX0xFTkdUSDsgaSsrKSB7Ci0JCQlrZXkuYXBwZW5kKCdhJyk7Ci0JCX0KLQkJbG9uZ0tleSA9IGtleS50b1N0cmluZygpOwotCQlTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEg7IGkrKykgewotCQkJdmFsdWUuYXBwZW5kKCdhJyk7Ci0JCX0KLQkJbG9uZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICBzdGF0aWMgeworICAgICAgICBTdHJpbmdCdWZmZXIga2V5ID0gbmV3IFN0cmluZ0J1ZmZlcihQcmVmZXJlbmNlcy5NQVhfS0VZX0xFTkdUSCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUHJlZmVyZW5jZXMuTUFYX0tFWV9MRU5HVEg7IGkrKykgeworICAgICAgICAgICAga2V5LmFwcGVuZCgnYScpOworICAgICAgICB9CisgICAgICAgIGxvbmdLZXkgPSBrZXkudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcihQcmVmZXJlbmNlcy5NQVhfVkFMVUVfTEVOR1RIKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQcmVmZXJlbmNlcy5NQVhfVkFMVUVfTEVOR1RIOyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgnYScpOworICAgICAgICB9CisgICAgICAgIGxvbmdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CiAKLQkJU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKFByZWZlcmVuY2VzLk1BWF9OQU1FX0xFTkdUSCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUHJlZmVyZW5jZXMuTUFYX05BTUVfTEVOR1RIOyBpKyspIHsKLQkJCW5hbWUuYXBwZW5kKCdhJyk7Ci0JCX0KLQkJbG9uZ05hbWUgPSBuYW1lLnRvU3RyaW5nKCk7Ci0JfQorICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoUHJlZmVyZW5jZXMuTUFYX05BTUVfTEVOR1RIKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQcmVmZXJlbmNlcy5NQVhfTkFNRV9MRU5HVEg7IGkrKykgeworICAgICAgICAgICAgbmFtZS5hcHBlbmQoJ2EnKTsKKyAgICAgICAgfQorICAgICAgICBsb25nTmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlyb290ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzLnVzZXJSb290KCk7Ci0JCXBhcmVudCA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcwotCQkJCS51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQkvLyBGSVhNRTogY2hhbmdlIGhlcmUgaXMgZGFuZ2Vyb3VzCi0JCS8vIHByZWYgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudCwKLQkJLy8gIm1vY2siKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByb290ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzLnVzZXJSb290KCk7CisgICAgICAgIHBhcmVudCA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIC51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICAvLyBGSVhNRTogY2hhbmdlIGhlcmUgaXMgZGFuZ2Vyb3VzCisgICAgICAgIC8vIHByZWYgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudCwKKyAgICAgICAgLy8gIm1vY2siKTsKIAotCQlwcmVmID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudC5ub2RlKCJtb2NrIik7Ci0JfQorICAgICAgICBwcmVmID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudC5ub2RlKCJtb2NrIik7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChwcmVmIGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHsKLQkJCQkoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQotCQkJCQkJLnNldFJlc3VsdChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcy5OT1JNQUwpOwotCQkJfQotCQkJcHJlZi5yZW1vdmVOb2RlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChwcmVmIGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHsKKyAgICAgICAgICAgICAgICAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlc3VsdChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcy5OT1JNQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXByZWYgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoCi0JCQkJCShBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAibW8vY2siKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZiA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhudWxsLCAibW9jayIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQluZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMobnVsbCwgIiAiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHByZWYsICIiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHByZWYsIG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCW5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwcmVmLCAiICIpOworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFic3RyYWN0UHJlZmVyZW5jZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZiA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAgICAgKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzLnVzZXJSb290KCksICJtby9jayIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKG51bGwsICJtb2NrIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhudWxsLCAiICIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocHJlZiwgIiIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocHJlZiwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShwcmVmIGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHByZWYsICIgIik7CiAKLQkJUHJlZmVyZW5jZXMgcDIgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMobnVsbCwgIiIpOwotCQlhc3NlcnROb3RTYW1lKHAyLCBQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCkpOwotCQlhc3NlcnROb3RTYW1lKHAyLCBQcmVmZXJlbmNlcy51c2VyUm9vdCgpKTsKLQkJYXNzZXJ0RmFsc2UocDIuaXNVc2VyTm9kZSgpKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgcDIgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMobnVsbCwgIiIpOworICAgICAgICBhc3NlcnROb3RTYW1lKHAyLCBQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCkpOworICAgICAgICBhc3NlcnROb3RTYW1lKHAyLCBQcmVmZXJlbmNlcy51c2VyUm9vdCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocDIuaXNVc2VyTm9kZSgpKTsKIAotCQlwMiA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMKLQkJCQkudXNlclJvb3QoKSwgIm1vY2siKTsKLQkJYXNzZXJ0Tm90U2FtZShwMiwgcHJlZik7Ci0JCXAyLnJlbW92ZU5vZGUoKTsKLQl9CisgICAgICAgIHAyID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIC51c2VyUm9vdCgpLCAibW9jayIpOworICAgICAgICBhc3NlcnROb3RTYW1lKHAyLCBwcmVmKTsKKyAgICAgICAgcDIucmVtb3ZlTm9kZSgpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0ZWRGaWVsZHMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocHJlZiwgIm5ld05vZGUiKTsKLQkJYXNzZXJ0RmFsc2UocC5nZXROZXdOb2RlKCkpOwotCQlhc3NlcnRTYW1lKHAuZ2V0TG9jaygpLmdldENsYXNzKCksIE9iamVjdC5jbGFzcyk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIUNvbnN0YW50cyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFic29sdXRlUGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0ZWRGaWVsZHMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocHJlZiwgIm5ld05vZGUiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocC5nZXROZXdOb2RlKCkpOworICAgICAgICBhc3NlcnRTYW1lKHAuZ2V0TG9jaygpLmdldENsYXNzKCksIE9iamVjdC5jbGFzcyk7CiAKLQkJcCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZi5ub2RlKCJjaGlsZCIpOwotCQlhc3NlcnRUcnVlKHAuZ2V0TmV3Tm9kZSgpKTsKKyAgICAgICAgcCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZi5ub2RlKCJjaGlsZCIpOworICAgICAgICBhc3NlcnRUcnVlKHAuZ2V0TmV3Tm9kZSgpKTsKIAotCQlwID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQotCQkJCS5wdWJsaWNDaGlsZFNwaSgiY2hpbGQyIik7Ci0JCWFzc2VydFRydWUocC5nZXROZXdOb2RlKCkpOwotCX0KKyAgICAgICAgcCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgKChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZikKKyAgICAgICAgICAgICAgICAucHVibGljQ2hpbGRTcGkoImNoaWxkMiIpOworICAgICAgICBhc3NlcnRUcnVlKHAuZ2V0TmV3Tm9kZSgpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscygiVXNlciBQcmVmZXJlbmNlIE5vZGU6ICIgKyBwcmVmLmFic29sdXRlUGF0aCgpLCBwcmVmCi0JCQkJLnRvU3RyaW5nKCkpOworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlVzZXIgUHJlZmVyZW5jZSBOb2RlOiAiICsgcHJlZi5hYnNvbHV0ZVBhdGgoKSwgcHJlZgorICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKIAotCQlwcmVmID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcwotCQkJCS5zeXN0ZW1Sb290KCksICJtb2NrIik7Ci0JCWFzc2VydEVxdWFscygiU3lzdGVtIFByZWZlcmVuY2UgTm9kZTogIiArIHByZWYuYWJzb2x1dGVQYXRoKCksIHByZWYKLQkJCQkudG9TdHJpbmcoKSk7Ci0JfQorICAgICAgICBwcmVmID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIC5zeXN0ZW1Sb290KCksICJtb2NrIik7CisgICAgICAgIGFzc2VydEVxdWFscygiU3lzdGVtIFByZWZlcmVuY2UgTm9kZTogIiArIHByZWYuYWJzb2x1dGVQYXRoKCksIHByZWYKKyAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEFic29sdXRlUGF0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIvamF2YS91dGlsL3ByZWZzL21vY2siLCBwcmVmLmFic29sdXRlUGF0aCgpKTsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnNvbHV0ZVBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVQYXRoKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIi9qYXZhL3V0aWwvcHJlZnMvbW9jayIsIHByZWYuYWJzb2x1dGVQYXRoKCkpOwogCi0JCXByZWYgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocHJlZiwgIiAiKTsKLQkJYXNzZXJ0RXF1YWxzKCIvamF2YS91dGlsL3ByZWZzL21vY2svICIsIHByZWYuYWJzb2x1dGVQYXRoKCkpOwotCX0KKyAgICAgICAgcHJlZiA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwcmVmLCAiICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9qYXZhL3V0aWwvcHJlZnMvbW9jay8gIiwgcHJlZi5hYnNvbHV0ZVBhdGgoKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuTmFtZXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHByZWYuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hpbGRyZW5OYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbk5hbWVzKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwcmVmLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGgpOwogCi0JCVByZWZlcmVuY2VzIGNoaWxkMSA9IHByZWYubm9kZSgiY2hpbGQxIik7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMSA9IHByZWYubm9kZSgiY2hpbGQxIik7CiAKLQkJcHJlZi5ub2RlKCJjaGlsZDIiKTsKLQkJcHJlZi5ub2RlKCJjaGlsZDMiKTsKLQkJY2hpbGQxLm5vZGUoInN1YmNoaWxkMSIpOworICAgICAgICBwcmVmLm5vZGUoImNoaWxkMiIpOworICAgICAgICBwcmVmLm5vZGUoImNoaWxkMyIpOworICAgICAgICBjaGlsZDEubm9kZSgic3ViY2hpbGQxIik7CiAKLQkJYXNzZXJ0U2FtZShwcmVmLCBjaGlsZDEucGFyZW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgcHJlZi5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGlsZDEiLCBwcmVmLmNoaWxkcmVuTmFtZXMoKVswXSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZDEuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygic3ViY2hpbGQxIiwgY2hpbGQxLmNoaWxkcmVuTmFtZXMoKVswXSk7Ci0JfQorICAgICAgICBhc3NlcnRTYW1lKHByZWYsIGNoaWxkMS5wYXJlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBwcmVmLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkMSIsIHByZWYuY2hpbGRyZW5OYW1lcygpWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoaWxkMS5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJjaGlsZDEiLCBjaGlsZDEuY2hpbGRyZW5OYW1lcygpWzBdKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJcHJlZi5wdXQoInRlc3RDbGVhcktleSIsICJ0ZXN0Q2xlYXJWYWx1ZSIpOwotCQlwcmVmLnB1dCgidGVzdENsZWFyS2V5MSIsICJ0ZXN0Q2xlYXJWYWx1ZTEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Q2xlYXJWYWx1ZSIsIHByZWYuZ2V0KCJ0ZXN0Q2xlYXJLZXkiLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdENsZWFyVmFsdWUxIiwgcHJlZi5nZXQoInRlc3RDbGVhcktleTEiLCBudWxsKSk7Ci0JCXByZWYuY2xlYXIoKTsKLQkJYXNzZXJ0TnVsbChwcmVmLmdldCgidGVzdENsZWFyS2V5IiwgbnVsbCkpOwotCQlhc3NlcnROdWxsKHByZWYuZ2V0KCJ0ZXN0Q2xlYXJLZXkxIiwgbnVsbCkpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBwcmVmLnB1dCgidGVzdENsZWFyS2V5IiwgInRlc3RDbGVhclZhbHVlIik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0Q2xlYXJLZXkxIiwgInRlc3RDbGVhclZhbHVlMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RDbGVhclZhbHVlIiwgcHJlZi5nZXQoInRlc3RDbGVhcktleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Q2xlYXJWYWx1ZTEiLCBwcmVmLmdldCgidGVzdENsZWFyS2V5MSIsIG51bGwpKTsKKyAgICAgICAgcHJlZi5jbGVhcigpOworICAgICAgICBhc3NlcnROdWxsKHByZWYuZ2V0KCJ0ZXN0Q2xlYXJLZXkiLCBudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwocHJlZi5nZXQoInRlc3RDbGVhcktleTEiLCBudWxsKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKHByZWYuZ2V0KCIiLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygiZGVmYXVsdCIsIHByZWYuZ2V0KCJrZXkiLCAiZGVmYXVsdCIpKTsKLQkJYXNzZXJ0TnVsbChwcmVmLmdldCgia2V5IiwgbnVsbCkpOwotCQlwcmVmLnB1dCgidGVzdEdldGtleSIsICJ2YWx1ZSIpOwotCQlhc3NlcnROdWxsKHByZWYuZ2V0KCJ0ZXN0R2V0S2V5IiwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlIiwgcHJlZi5nZXQoInRlc3RHZXRrZXkiLCBudWxsKSk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChwcmVmLmdldCgiIiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmF1bHQiLCBwcmVmLmdldCgia2V5IiwgImRlZmF1bHQiKSk7CisgICAgICAgIGFzc2VydE51bGwocHJlZi5nZXQoImtleSIsIG51bGwpKTsKKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXRrZXkiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwcmVmLmdldCgidGVzdEdldEtleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHByZWYuZ2V0KCJ0ZXN0R2V0a2V5IiwgbnVsbCkpOwogCi0JCXRyeSB7Ci0JCQlwcmVmLmdldChudWxsLCAiYWJjIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwcmVmLmdldCgiIiwgImFiYyIpOwotCQlwcmVmLmdldCgia2V5IiwgbnVsbCk7Ci0JCXByZWYuZ2V0KCJrZXkiLCAiIik7Ci0JCXByZWYucHV0RmxvYXQoImZsb2F0S2V5IiwgMS4wZik7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgcHJlZi5nZXQoImZsb2F0S2V5IiwgbnVsbCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXQobnVsbCwgImFiYyIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5nZXQoIiIsICJhYmMiKTsKKyAgICAgICAgcHJlZi5nZXQoImtleSIsIG51bGwpOworICAgICAgICBwcmVmLmdldCgia2V5IiwgIiIpOworICAgICAgICBwcmVmLnB1dEZsb2F0KCJmbG9hdEtleSIsIDEuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMCIsIHByZWYuZ2V0KCJmbG9hdEtleSIsIG51bGwpKTsKIAotCQlwcmVmLnJlbW92ZU5vZGUoKTsKLQkJdHJ5IHsKLQkJCXByZWYuZ2V0KCJrZXkiLCAiYWJjIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYuZ2V0KG51bGwsICJhYmMiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICBwcmVmLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0KCJrZXkiLCAiYWJjIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0KG51bGwsICJhYmMiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW4oKSB7Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldEJvb2xlYW4obnVsbCwgZmFsc2UpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qm9vbGVhbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0Qm9vbGVhbihudWxsLCBmYWxzZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCXByZWYucHV0KCJ0ZXN0R2V0Qm9vbGVhbktleSIsICJmYWxzZSIpOwotCQlwcmVmLnB1dCgidGVzdEdldEJvb2xlYW5LZXkyIiwgInZhbHVlIik7Ci0JCWFzc2VydEZhbHNlKHByZWYuZ2V0Qm9vbGVhbigidGVzdEdldEJvb2xlYW5LZXkiLCB0cnVlKSk7Ci0JCWFzc2VydFRydWUocHJlZi5nZXRCb29sZWFuKCJ0ZXN0R2V0Qm9vbGVhbktleTIiLCB0cnVlKSk7Ci0JfQorICAgICAgICBwcmVmLnB1dCgidGVzdEdldEJvb2xlYW5LZXkiLCAiZmFsc2UiKTsKKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXRCb29sZWFuS2V5MiIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRGYWxzZShwcmVmLmdldEJvb2xlYW4oInRlc3RHZXRCb29sZWFuS2V5IiwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYuZ2V0Qm9vbGVhbigidGVzdEdldEJvb2xlYW5LZXkyIiwgdHJ1ZSkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RQdXRCeXRlQXJyYXkoKSB7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJ5dGVBcnJheShudWxsLCBuZXcgYnl0ZVswXSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5wdXRCeXRlQXJyYXkoInRlc3RQdXRCeXRlQXJyYXlLZXk0IiwgbnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRCeXRlQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0Qnl0ZUFycmF5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobnVsbCwgbmV3IGJ5dGVbMF0pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0Qnl0ZUFycmF5KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5NCIsIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5LCBuZXcgYnl0ZVswXSk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5ICsgImEiLCBuZXcgYnl0ZVswXSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYnl0ZVtdIGxvbmdBcnJheSA9IG5ldyBieXRlWyhpbnQpIChQcmVmZXJlbmNlcy5NQVhfVkFMVUVfTEVOR1RIICogMC43NCldOwotCQlieXRlW10gbG9uZ2VyQXJyYXkgPSBuZXcgYnl0ZVsoaW50KSAoUHJlZmVyZW5jZXMuTUFYX1ZBTFVFX0xFTkdUSCAqIDAuNzUpICsgMV07Ci0JCXByZWYucHV0Qnl0ZUFycmF5KGxvbmdLZXksIGxvbmdBcnJheSk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5LCBsb25nZXJBcnJheSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobG9uZ0tleSwgbmV3IGJ5dGVbMF0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobG9uZ0tleSArICJhIiwgbmV3IGJ5dGVbMF0pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBsb25nQXJyYXkgPSBuZXcgYnl0ZVsoaW50KSAoUHJlZmVyZW5jZXMuTUFYX1ZBTFVFX0xFTkdUSCAqIDAuNzQpXTsKKyAgICAgICAgYnl0ZVtdIGxvbmdlckFycmF5ID0gbmV3IGJ5dGVbKGludCkgKFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEggKiAwLjc1KSArIDFdOworICAgICAgICBwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5LCBsb25nQXJyYXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobG9uZ0tleSwgbG9uZ2VyQXJyYXkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJcHJlZi5wdXRCeXRlQXJyYXkoInRlc3RQdXRCeXRlQXJyYXlLZXkiLCBuZXcgYnl0ZVswXSk7Ci0JCWFzc2VydEVxdWFscygiIiwgcHJlZi5nZXQoInRlc3RQdXRCeXRlQXJyYXlLZXkiLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVswXSwgcHJlZi5nZXRCeXRlQXJyYXkoCi0JCQkJInRlc3RQdXRCeXRlQXJyYXlLZXkiLCBudWxsKSkpOworICAgICAgICBwcmVmLnB1dEJ5dGVBcnJheSgidGVzdFB1dEJ5dGVBcnJheUtleSIsIG5ldyBieXRlWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwcmVmLmdldCgidGVzdFB1dEJ5dGVBcnJheUtleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlWzBdLCBwcmVmLmdldEJ5dGVBcnJheSgKKyAgICAgICAgICAgICAgICAidGVzdFB1dEJ5dGVBcnJheUtleSIsIG51bGwpKSk7CiAKLQkJcHJlZi5wdXRCeXRlQXJyYXkoInRlc3RQdXRCeXRlQXJyYXlLZXkzIiwgbmV3IGJ5dGVbXSB7ICdhJywgJ2InLCAnYycgfSk7Ci0JCWFzc2VydEVxdWFscygiWVdKaiIsIHByZWYuZ2V0KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5MyIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10geyAnYScsICdiJywgJ2MnIH0sIHByZWYKLQkJCQkuZ2V0Qnl0ZUFycmF5KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5MyIsIG51bGwpKSk7Ci0JfQorICAgICAgICBwcmVmLnB1dEJ5dGVBcnJheSgidGVzdFB1dEJ5dGVBcnJheUtleTMiLCBuZXcgYnl0ZVtdIHsgJ2EnLCAnYicsICdjJyB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZV0pqIiwgcHJlZi5nZXQoInRlc3RQdXRCeXRlQXJyYXlLZXkzIiwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7ICdhJywgJ2InLCAnYycgfSwgcHJlZgorICAgICAgICAgICAgICAgIC5nZXRCeXRlQXJyYXkoInRlc3RQdXRCeXRlQXJyYXlLZXkzIiwgbnVsbCkpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZUFycmF5KCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQl0cnkgewotCQkJcHJlZi5nZXRCeXRlQXJyYXkobnVsbCwgbmV3IGJ5dGVbMF0pOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYnl0ZVtdIGI2NEFycmF5ID0gbmV3IGJ5dGVbXSB7IDB4NTksIDB4NTcsIDB4NGEsIDB4NmEgfTsvLyBCQVNFNjQKLQkJLy8gZW5jb2RpbmcgZm9yCi0JCS8vICJhYmMiCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJ5dGVBcnJheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCeXRlQXJyYXkoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmdldEJ5dGVBcnJheShudWxsLCBuZXcgYnl0ZVswXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gYjY0QXJyYXkgPSBuZXcgYnl0ZVtdIHsgMHg1OSwgMHg1NywgMHg0YSwgMHg2YSB9Oy8vIEJBU0U2NAorICAgICAgICAvLyBlbmNvZGluZyBmb3IKKyAgICAgICAgLy8gImFiYyIKIAotCQlwcmVmLnB1dCgidGVzdEdldEJ5dGVBcnJheUtleSIsICJhYmM9Iik7Ci0JCXByZWYucHV0KCJ0ZXN0R2V0Qnl0ZUFycmF5S2V5MiIsIG5ldyBTdHJpbmcoYjY0QXJyYXkpKTsKLQkJcHJlZi5wdXQoImludmFsaWRLZXkiLCAiPD4/Iik7Ci0JCS8vIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVswXSwgcC5nZXRCeXRlQXJyYXkoCi0JCS8vICJ0ZXN0R2V0Qnl0ZUFycmF5S2V5IiwgbmV3IGJ5dGVbMF0pKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHsgMTA1LCAtNzMgfSwgcHJlZi5nZXRCeXRlQXJyYXkoCi0JCQkJInRlc3RHZXRCeXRlQXJyYXlLZXkiLCBuZXcgYnl0ZVswXSkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10geyAnYScsICdiJywgJ2MnIH0sIHByZWYKLQkJCQkuZ2V0Qnl0ZUFycmF5KCJ0ZXN0R2V0Qnl0ZUFycmF5S2V5MiIsIG5ldyBieXRlWzBdKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbMF0sIHByZWYuZ2V0Qnl0ZUFycmF5KCJpbnZhbGlkS2V5IiwKLQkJCQluZXcgYnl0ZVswXSkpKTsKKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXRCeXRlQXJyYXlLZXkiLCAiYWJjPSIpOworICAgICAgICBwcmVmLnB1dCgidGVzdEdldEJ5dGVBcnJheUtleTIiLCBuZXcgU3RyaW5nKGI2NEFycmF5KSk7CisgICAgICAgIHByZWYucHV0KCJpbnZhbGlkS2V5IiwgIjw+PyIpOworICAgICAgICAvLyBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbMF0sIHAuZ2V0Qnl0ZUFycmF5KAorICAgICAgICAvLyAidGVzdEdldEJ5dGVBcnJheUtleSIsIG5ldyBieXRlWzBdKSkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7IDEwNSwgLTczIH0sIHByZWYuZ2V0Qnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICJ0ZXN0R2V0Qnl0ZUFycmF5S2V5IiwgbmV3IGJ5dGVbMF0pKSk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHsgJ2EnLCAnYicsICdjJyB9LCBwcmVmCisgICAgICAgICAgICAgICAgLmdldEJ5dGVBcnJheSgidGVzdEdldEJ5dGVBcnJheUtleTIiLCBuZXcgYnl0ZVswXSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlWzBdLCBwcmVmLmdldEJ5dGVBcnJheSgiaW52YWxpZEtleSIsCisgICAgICAgICAgICAgICAgbmV3IGJ5dGVbMF0pKSk7CiAKLQkJcHJlZi5wdXRCeXRlQXJyYXkoInRlc3RHZXRCeXRlQXJyYXlLZXkzIiwgYjY0QXJyYXkpOwotCQlwcmVmLnB1dEJ5dGVBcnJheSgidGVzdEdldEJ5dGVBcnJheUtleTQiLCAiYWJjIi5nZXRCeXRlcygpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGI2NEFycmF5LCBwcmVmLmdldEJ5dGVBcnJheSgKLQkJCQkidGVzdEdldEJ5dGVBcnJheUtleTMiLCBuZXcgYnl0ZVswXSkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKCJhYmMiLmdldEJ5dGVzKCksIHByZWYuZ2V0Qnl0ZUFycmF5KAotCQkJCSJ0ZXN0R2V0Qnl0ZUFycmF5S2V5NCIsIG5ldyBieXRlWzBdKSkpOwotCX0KKyAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkoInRlc3RHZXRCeXRlQXJyYXlLZXkzIiwgYjY0QXJyYXkpOworICAgICAgICBwcmVmLnB1dEJ5dGVBcnJheSgidGVzdEdldEJ5dGVBcnJheUtleTQiLCAiYWJjIi5nZXRCeXRlcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGI2NEFycmF5LCBwcmVmLmdldEJ5dGVBcnJheSgKKyAgICAgICAgICAgICAgICAidGVzdEdldEJ5dGVBcnJheUtleTMiLCBuZXcgYnl0ZVswXSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKCJhYmMiLmdldEJ5dGVzKCksIHByZWYuZ2V0Qnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICJ0ZXN0R2V0Qnl0ZUFycmF5S2V5NCIsIG5ldyBieXRlWzBdKSkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGUoKSB7Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldERvdWJsZShudWxsLCAwKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERvdWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmdldERvdWJsZShudWxsLCAwKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJcHJlZi5wdXQoInRlc3RHZXREb3VibGVLZXkiLCAiMSIpOwotCQlwcmVmLnB1dCgidGVzdEdldERvdWJsZUtleTIiLCAidmFsdWUiKTsKLQkJcHJlZi5wdXREb3VibGUoInRlc3RHZXREb3VibGVLZXkzIiwgMSk7Ci0JCXByZWYucHV0SW50KCJ0ZXN0R2V0RG91YmxlS2V5NCIsIDEpOwotCQlhc3NlcnRFcXVhbHMoMS4wLCBwcmVmLmdldERvdWJsZSgidGVzdEdldERvdWJsZUtleSIsIDAuMCksIDApOwotCQlhc3NlcnRFcXVhbHMoMC4wLCBwcmVmLmdldERvdWJsZSgidGVzdEdldERvdWJsZUtleTIiLCAwLjApLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKDEuMCwgcHJlZi5nZXREb3VibGUoInRlc3RHZXREb3VibGVLZXkzIiwgMC4wKSwgMCk7Ci0JCWFzc2VydEVxdWFscygxLjAsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0R2V0RG91YmxlS2V5NCIsIDAuMCksIDApOwotCX0KKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXREb3VibGVLZXkiLCAiMSIpOworICAgICAgICBwcmVmLnB1dCgidGVzdEdldERvdWJsZUtleTIiLCAidmFsdWUiKTsKKyAgICAgICAgcHJlZi5wdXREb3VibGUoInRlc3RHZXREb3VibGVLZXkzIiwgMSk7CisgICAgICAgIHByZWYucHV0SW50KCJ0ZXN0R2V0RG91YmxlS2V5NCIsIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCBwcmVmLmdldERvdWJsZSgidGVzdEdldERvdWJsZUtleSIsIDAuMCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCBwcmVmLmdldERvdWJsZSgidGVzdEdldERvdWJsZUtleTIiLCAwLjApLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcHJlZi5nZXREb3VibGUoInRlc3RHZXREb3VibGVLZXkzIiwgMC4wKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjAsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0R2V0RG91YmxlS2V5NCIsIDAuMCksIDApOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RHZXRGbG9hdCgpIHsKLQkJdHJ5IHsKLQkJCXByZWYuZ2V0RmxvYXQobnVsbCwgMGYpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXQoInRlc3RHZXRGbG9hdEtleSIsICIxIik7Ci0JCXByZWYucHV0KCJ0ZXN0R2V0RmxvYXRLZXkyIiwgInZhbHVlIik7Ci0JCWFzc2VydEVxdWFscygxZiwgcHJlZi5nZXRGbG9hdCgidGVzdEdldEZsb2F0S2V5IiwgMGYpLCAwKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMGYsIHByZWYuZ2V0RmxvYXQoInRlc3RHZXRGbG9hdEtleTIiLCAwZiksIDApOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGbG9hdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0RmxvYXQobnVsbCwgMGYpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXRGbG9hdEtleSIsICIxIik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0RmxvYXRLZXkyIiwgInZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscygxZiwgcHJlZi5nZXRGbG9hdCgidGVzdEdldEZsb2F0S2V5IiwgMGYpLCAwKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBhc3NlcnRFcXVhbHMoMGYsIHByZWYuZ2V0RmxvYXQoInRlc3RHZXRGbG9hdEtleTIiLCAwZiksIDApOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldEludChudWxsLCAwKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmdldEludChudWxsLCAwKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJcHJlZi5wdXQoInRlc3RHZXRJbnRLZXkiLCAiMSIpOwotCQlwcmVmLnB1dCgidGVzdEdldEludEtleTIiLCAidmFsdWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByZWYuZ2V0SW50KCJ0ZXN0R2V0SW50S2V5IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcHJlZi5nZXRJbnQoInRlc3RHZXRJbnRLZXkyIiwgMCkpOwotCX0KKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXRJbnRLZXkiLCAiMSIpOworICAgICAgICBwcmVmLnB1dCgidGVzdEdldEludEtleTIiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByZWYuZ2V0SW50KCJ0ZXN0R2V0SW50S2V5IiwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcHJlZi5nZXRJbnQoInRlc3RHZXRJbnRLZXkyIiwgMCkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RHZXRMb25nKCkgewotCQl0cnkgewotCQkJcHJlZi5nZXRMb25nKG51bGwsIDApOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9uZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0TG9uZyhudWxsLCAwKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJcHJlZi5wdXQoInRlc3RHZXRMb25nS2V5IiwgIjEiKTsKLQkJcHJlZi5wdXQoInRlc3RHZXRMb25nS2V5MiIsICJ2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgcHJlZi5nZXRJbnQoInRlc3RHZXRMb25nS2V5IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcHJlZi5nZXRJbnQoInRlc3RHZXRMb25nS2V5MiIsIDApKTsKLQl9CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0TG9uZ0tleSIsICIxIik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0TG9uZ0tleTIiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByZWYuZ2V0SW50KCJ0ZXN0R2V0TG9uZ0tleSIsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHByZWYuZ2V0SW50KCJ0ZXN0R2V0TG9uZ0tleTIiLCAwKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdElzVXNlck5vZGUoKSB7Ci0JCWFzc2VydFRydWUocHJlZi5pc1VzZXJOb2RlKCkpOworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVXNlck5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNVc2VyTm9kZSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcmVmLmlzVXNlck5vZGUoKSk7CiAKLQkJcHJlZiA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMKLQkJCQkuc3lzdGVtUm9vdCgpLCAibW9jayIpOwotCQlhc3NlcnRGYWxzZShwcmVmLmlzVXNlck5vZGUoKSk7Ci0JfQorICAgICAgICBwcmVmID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIC5zeXN0ZW1Sb290KCksICJtb2NrIik7CisgICAgICAgIGFzc2VydEZhbHNlKHByZWYuaXNVc2VyTm9kZSgpKTsKKyAgICB9CiAKLQkvLyBUT0RPLCBob3cgdG8gdGVzdCB0aGUgInN0b3JlZCBkZWZhdWx0cyIKLQkvLyBUT0RPLCBob3cgdG8gdGVzdCB0aGUgbXVsdGktdGhyZWFkCi0JcHVibGljIHZvaWQgdGVzdEtleXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHByZWYua2V5cygpLmxlbmd0aCk7CisgICAgLy8gVE9ETywgaG93IHRvIHRlc3QgdGhlICJzdG9yZWQgZGVmYXVsdHMiCisgICAgLy8gVE9ETywgaG93IHRvIHRlc3QgdGhlIG11bHRpLXRocmVhZAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLiBQcm9iYWJseSB0b2RvIGxpc3QgcmVhc29uYWJsZSBmb3IgZnVuY3Rpb25hbCBzdHJlc3MgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEtleXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHByZWYua2V5cygpLmxlbmd0aCk7CiAKLQkJcHJlZi5wdXQoImtleTAiLCAidmFsdWUiKTsKLQkJcHJlZi5wdXQoImtleTEiLCAidmFsdWUxIik7Ci0JCXByZWYucHV0KCJrZXkyIiwgInZhbHVlMiIpOwotCQlwcmVmLnB1dCgia2V5MyIsICJ2YWx1ZTMiKTsKKyAgICAgICAgcHJlZi5wdXQoImtleTAiLCAidmFsdWUiKTsKKyAgICAgICAgcHJlZi5wdXQoImtleTEiLCAidmFsdWUxIik7CisgICAgICAgIHByZWYucHV0KCJrZXkyIiwgInZhbHVlMiIpOworICAgICAgICBwcmVmLnB1dCgia2V5MyIsICJ2YWx1ZTMiKTsKIAotCQlTdHJpbmdbXSBrZXlzID0gcHJlZi5rZXlzKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBrZXlzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKDAsIGtleXNbaV0uaW5kZXhPZigia2V5IikpOwotCQkJYXNzZXJ0RXF1YWxzKDQsIGtleXNbaV0ubGVuZ3RoKCkpOwotCQl9Ci0JfQorICAgICAgICBTdHJpbmdbXSBrZXlzID0gcHJlZi5rZXlzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBrZXlzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGtleXNbaV0uaW5kZXhPZigia2V5IikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGtleXNbaV0ubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdE5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygibW9jayIsIHByZWYubmFtZSgpKTsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygibW9jayIsIHByZWYubmFtZSgpKTsKIAotCQlwcmVmID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHByZWYsICIgIik7Ci0JCWFzc2VydEVxdWFscygiICIsIHByZWYubmFtZSgpKTsKLQl9CisgICAgICAgIHByZWYgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocHJlZiwgIiAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgIiwgcHJlZi5uYW1lKCkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RDaGFyQ2FzZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlhc3NlcnRTYW1lKHByZWYubm9kZSgic2FtZWNoaWxkIiksIHByZWYubm9kZSgic2FtZWNoaWxkIikpOwotCQlhc3NlcnROb3RTYW1lKHByZWYubm9kZSgic2FtZUNoaWxkIiksIHByZWYubm9kZSgic2FtZWNoaWxkIikpOwotCQlhc3NlcnROb3RTYW1lKHByZWYubm9kZSgiY2hpbGQiKSwgcHJlZi5ub2RlKCJDaGlsZCIpKTsKLQkJYXNzZXJ0Tm90U2FtZShwcmVmLm5vZGUoImNoaWxkIiksIHByZWYubm9kZSgiQ2hpbGQiKSk7Ci0JCWFzc2VydE5vdFNhbWUocHJlZi5ub2RlKCJjaGlsZCIpLCBwcmVmLm5vZGUoIiBjaGlsZCIpKTsKLQkJU3RyaW5nW10gbmFtZXMgPSBwcmVmLmNoaWxkcmVuTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIG5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlhc3NlcnRUcnVlKCJzYW1lY2hpbGQiLmVxdWFscyhuYW1lKSB8fCAic2FtZUNoaWxkIi5lcXVhbHMobmFtZSkKLQkJCQkJfHwgImNoaWxkIi5lcXVhbHMobmFtZSkgfHwgIkNoaWxkIi5lcXVhbHMobmFtZSkKLQkJCQkJfHwgIiBjaGlsZCIuZXF1YWxzKG5hbWUpKTsKLQkJfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0IGZvciBrZXlzIHdpdGggc3BlY2lhbCBzeW1ib2xzLiBObyBleGNlcHRpb25zIHdlcmUgY2hlY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENoYXJDYXNlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFNhbWUocHJlZi5ub2RlKCJzYW1lY2hpbGQiKSwgcHJlZi5ub2RlKCJzYW1lY2hpbGQiKSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUocHJlZi5ub2RlKCJzYW1lQ2hpbGQiKSwgcHJlZi5ub2RlKCJzYW1lY2hpbGQiKSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUocHJlZi5ub2RlKCJjaGlsZCIpLCBwcmVmLm5vZGUoIkNoaWxkIikpOworICAgICAgICBhc3NlcnROb3RTYW1lKHByZWYubm9kZSgiY2hpbGQiKSwgcHJlZi5ub2RlKCJDaGlsZCIpKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShwcmVmLm5vZGUoImNoaWxkIiksIHByZWYubm9kZSgiIGNoaWxkIikpOworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHByZWYuY2hpbGRyZW5OYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbmFtZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInNhbWVjaGlsZCIuZXF1YWxzKG5hbWUpIHx8ICJzYW1lQ2hpbGQiLmVxdWFscyhuYW1lKQorICAgICAgICAgICAgICAgICAgICB8fCAiY2hpbGQiLmVxdWFscyhuYW1lKSB8fCAiQ2hpbGQiLmVxdWFscyhuYW1lKQorICAgICAgICAgICAgICAgICAgICB8fCAiIGNoaWxkIi5lcXVhbHMobmFtZSkpOworICAgICAgICB9CiAKLQkJUHJlZmVyZW5jZXMgbW9jazEgPSBwcmVmLm5vZGUoIm1vY2sxIik7Ci0JCW1vY2sxLnB1dCgia2V5IiwgIjF2YWx1ZSIpOwotCQltb2NrMS5wdXQoIktFWSIsICIydmFsdWUiKTsKLQkJbW9jazEucHV0KCIvSy9FL1kiLCAiN3ZhbHVlIik7Ci0JCW1vY2sxLnB1dCgiL0svRVxcWVxcYWJjfkAhIyQlXiYqKFxcIiwgIjh2YWx1ZSIpOworICAgICAgICBQcmVmZXJlbmNlcyBtb2NrMSA9IHByZWYubm9kZSgibW9jazEiKTsKKyAgICAgICAgbW9jazEucHV0KCJrZXkiLCAiMXZhbHVlIik7CisgICAgICAgIG1vY2sxLnB1dCgiS0VZIiwgIjJ2YWx1ZSIpOworICAgICAgICBtb2NrMS5wdXQoIi9LL0UvWSIsICI3dmFsdWUiKTsKKyAgICAgICAgbW9jazEucHV0KCIvSy9FXFxZXFxhYmN+QCEjJCVeJiooXFwiLCAiOHZhbHVlIik7CiAKLQkJYXNzZXJ0RXF1YWxzKCI4dmFsdWUiLCBtb2NrMS5nZXQoIi9LL0VcXFlcXGFiY35AISMkJV4mKihcXCIsIG51bGwpKTsKLQkJYXNzZXJ0TnVsbChtb2NrMS5nZXQoIi9rL2UveSIsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKCI3dmFsdWUiLCBtb2NrMS5nZXQoIi9LL0UvWSIsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxdmFsdWUiLCBtb2NrMS5nZXQoImtleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4dmFsdWUiLCBtb2NrMS5nZXQoIi9LL0VcXFlcXGFiY35AISMkJV4mKihcXCIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtb2NrMS5nZXQoIi9rL2UveSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI3dmFsdWUiLCBtb2NrMS5nZXQoIi9LL0UvWSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxdmFsdWUiLCBtb2NrMS5nZXQoImtleSIsIG51bGwpKTsKIAotCQlTdHJpbmdbXSBrZXlzID0gbW9jazEua2V5cygpOwotCQlhc3NlcnRFcXVhbHMoNCwga2V5cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBrZXkgPSBrZXlzW2ldOwotCQkJYXNzZXJ0VHJ1ZSgia2V5Ii5lcXVhbHMoa2V5KSB8fCAiS0VZIi5lcXVhbHMoa2V5KQotCQkJCQl8fCAiL0svRS9ZIi5lcXVhbHMoa2V5KQotCQkJCQl8fCAiL0svRVxcWVxcYWJjfkAhIyQlXiYqKFxcIi5lcXVhbHMoa2V5KSk7Ci0JCX0KLQl9CisgICAgICAgIFN0cmluZ1tdIGtleXMgPSBtb2NrMS5rZXlzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBrZXlzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IGtleXNbaV07CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJrZXkiLmVxdWFscyhrZXkpIHx8ICJLRVkiLmVxdWFscyhrZXkpCisgICAgICAgICAgICAgICAgICAgIHx8ICIvSy9FL1kiLmVxdWFscyhrZXkpCisgICAgICAgICAgICAgICAgICAgIHx8ICIvSy9FXFxZXFxhYmN+QCEjJCVeJiooXFwiLmVxdWFscyhrZXkpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3ROb2RlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlwcmVmLm5vZGUobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5ub2RlKCIvamF2YS91dGlsL3ByZWZzLyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLm5vZGUoIi9qYXZhLy91dGlsL3ByZWZzIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYubm9kZShsb25nTmFtZSArICJhIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbChwcmVmLm5vZGUobG9uZ05hbWUpKTsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLm5vZGUobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5ub2RlKCIvamF2YS91dGlsL3ByZWZzLyIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLm5vZGUoIi9qYXZhLy91dGlsL3ByZWZzIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYubm9kZShsb25nTmFtZSArICJhIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcmVmLm5vZGUobG9uZ05hbWUpKTsKIAotCQlhc3NlcnRTYW1lKHJvb3QsIHByZWYubm9kZSgiLyIpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShyb290LCBwcmVmLm5vZGUoIi8iKSk7CiAKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBwcmVmLm5vZGUoIi9qYXZhL3V0aWwvcHJlZnMiKTsKLQkJYXNzZXJ0U2FtZShwcmVmcywgcGFyZW50KTsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZnMgPSBwcmVmLm5vZGUoIi9qYXZhL3V0aWwvcHJlZnMiKTsKKyAgICAgICAgYXNzZXJ0U2FtZShwcmVmcywgcGFyZW50KTsKIAotCQlhc3NlcnRTYW1lKHByZWYsIHByZWYubm9kZSgiIikpOworICAgICAgICBhc3NlcnRTYW1lKHByZWYsIHByZWYubm9kZSgiIikpOwogCi0JCWlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjaGlsZCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgKChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZikKLQkJCQkucHVibGljQ2hpbGRTcGkoImNoaWxkIik7Ci0JCWFzc2VydFNhbWUoY2hpbGQsIHByZWYubm9kZSgiY2hpbGQiKSk7CisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjaGlsZCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgKChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZikKKyAgICAgICAgICAgICAgICAucHVibGljQ2hpbGRTcGkoImNoaWxkIik7CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQsIHByZWYubm9kZSgiY2hpbGQiKSk7CiAKLQkJUHJlZmVyZW5jZXMgY2hpbGQyID0gcHJlZi5ub2RlKCJjaGlsZDIiKTsKLQkJYXNzZXJ0U2FtZShjaGlsZDIsICgoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWYpCi0JCQkJLnB1YmxpY0NoaWxkU3BpKCJjaGlsZDIiKSk7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMiA9IHByZWYubm9kZSgiY2hpbGQyIik7CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQyLCAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQorICAgICAgICAgICAgICAgIC5wdWJsaWNDaGlsZFNwaSgiY2hpbGQyIikpOwogCi0JCVByZWZlcmVuY2VzIGdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkL2dyYW5kY2hpbGQiKTsKLQkJYXNzZXJ0U2FtZShncmFuZGNoaWxkLCBjaGlsZC5jaGlsZFNwaSgiZ3JhbmRjaGlsZCIpKTsKLQkJYXNzZXJ0U2FtZShncmFuZGNoaWxkLCBjaGlsZC5jYWNoZWRDaGlsZHJlbkltcGwoKVswXSk7Ci0JCWdyYW5kY2hpbGQucmVtb3ZlTm9kZSgpOwotCQlhc3NlcnROb3RTYW1lKGdyYW5kY2hpbGQsIHByZWYubm9kZSgiY2hpbGQvZ3JhbmRjaGlsZCIpKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgZ3JhbmRjaGlsZCA9IHByZWYubm9kZSgiY2hpbGQvZ3JhbmRjaGlsZCIpOworICAgICAgICBhc3NlcnRTYW1lKGdyYW5kY2hpbGQsIGNoaWxkLmNoaWxkU3BpKCJncmFuZGNoaWxkIikpOworICAgICAgICBhc3NlcnRTYW1lKGdyYW5kY2hpbGQsIGNoaWxkLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKKyAgICAgICAgZ3JhbmRjaGlsZC5yZW1vdmVOb2RlKCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoZ3JhbmRjaGlsZCwgcHJlZi5ub2RlKCJjaGlsZC9ncmFuZGNoaWxkIikpOwogCi0JCWdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkMy9ncmFuZGNoaWxkIik7Ci0JCUFic3RyYWN0UHJlZmVyZW5jZXNbXSBjaGlsZHMgPSAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQotCQkJCS5jYWNoZWRDaGlsZHJlbkltcGwoKTsKLQkJUHJlZmVyZW5jZXMgY2hpbGQzID0gY2hpbGQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRzW2ldLm5hbWUoKS5lcXVhbHMoImNoaWxkMyIpKSB7Ci0JCQkJY2hpbGQzID0gY2hpbGRzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoY2hpbGQzLCBncmFuZGNoaWxkLnBhcmVudCgpKTsKLQl9CisgICAgICAgIGdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkMy9ncmFuZGNoaWxkIik7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXNbXSBjaGlsZHMgPSAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQorICAgICAgICAgICAgICAgIC5jYWNoZWRDaGlsZHJlbkltcGwoKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQzID0gY2hpbGQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2hpbGRzW2ldLm5hbWUoKS5lcXVhbHMoImNoaWxkMyIpKSB7CisgICAgICAgICAgICAgICAgY2hpbGQzID0gY2hpbGRzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQzLCBncmFuZGNoaWxkLnBhcmVudCgpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZUV4aXN0cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcHJlZi5ub2RlRXhpc3RzKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYubm9kZUV4aXN0cygiL2phdmEvdXRpbC9wcmVmcy8iKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5ub2RlRXhpc3RzKCIvamF2YS8vdXRpbC9wcmVmcyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibm9kZUV4aXN0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9kZUV4aXN0cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5ub2RlRXhpc3RzKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYubm9kZUV4aXN0cygiL2phdmEvdXRpbC9wcmVmcy8iKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5ub2RlRXhpc3RzKCIvamF2YS8vdXRpbC9wcmVmcyIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoIi8iKSk7CisgICAgICAgIGFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCIvIikpOwogCi0JCWFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCIvamF2YS91dGlsL3ByZWZzIikpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiL2phdmEvdXRpbC9wcmVmcyIpKTsKIAotCQlhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiIikpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiIikpOwogCi0JCWFzc2VydEZhbHNlKHByZWYubm9kZUV4aXN0cygiY2hpbGQiKSk7Ci0JCVByZWZlcmVuY2VzIGdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkL2dyYW5kY2hpbGQiKTsKLQkJYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkIikpOwotCQlhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiY2hpbGQvZ3JhbmRjaGlsZCIpKTsKLQkJZ3JhbmRjaGlsZC5yZW1vdmVOb2RlKCk7Ci0JCWFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCJjaGlsZCIpKTsKLQkJYXNzZXJ0RmFsc2UocHJlZi5ub2RlRXhpc3RzKCJjaGlsZC9ncmFuZGNoaWxkIikpOwotCQlhc3NlcnRGYWxzZShncmFuZGNoaWxkLm5vZGVFeGlzdHMoIiIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJlZi5ub2RlRXhpc3RzKCJjaGlsZCIpKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgZ3JhbmRjaGlsZCA9IHByZWYubm9kZSgiY2hpbGQvZ3JhbmRjaGlsZCIpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiY2hpbGQiKSk7CisgICAgICAgIGFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCJjaGlsZC9ncmFuZGNoaWxkIikpOworICAgICAgICBncmFuZGNoaWxkLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkIikpOworICAgICAgICBhc3NlcnRGYWxzZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkL2dyYW5kY2hpbGQiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGdyYW5kY2hpbGQubm9kZUV4aXN0cygiIikpOwogCi0JCWFzc2VydEZhbHNlKHByZWYubm9kZUV4aXN0cygiY2hpbGQyL2dyYW5kY2hpbGQiKSk7Ci0JCXByZWYubm9kZSgiY2hpbGQyL2dyYW5kY2hpbGQiKTsKLQkJYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkMi9ncmFuZGNoaWxkIikpOwotCX0KKyAgICAgICAgYXNzZXJ0RmFsc2UocHJlZi5ub2RlRXhpc3RzKCJjaGlsZDIvZ3JhbmRjaGlsZCIpKTsKKyAgICAgICAgcHJlZi5ub2RlKCJjaGlsZDIvZ3JhbmRjaGlsZCIpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiY2hpbGQyL2dyYW5kY2hpbGQiKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudCgpIHsKLQkJYXNzZXJ0U2FtZShwYXJlbnQsIHByZWYucGFyZW50KCkpOwotCQlBYnN0cmFjdFByZWZlcmVuY2VzIGNoaWxkMSA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwcmVmLCAiY2hpbGQxIik7Ci0JCWFzc2VydFNhbWUocHJlZiwgY2hpbGQxLnBhcmVudCgpKTsKLQkJYXNzZXJ0TnVsbChyb290LnBhcmVudCgpKTsKLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmVudCgpIHsKKyAgICAgICAgYXNzZXJ0U2FtZShwYXJlbnQsIHByZWYucGFyZW50KCkpOworICAgICAgICBBYnN0cmFjdFByZWZlcmVuY2VzIGNoaWxkMSA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwcmVmLCAiY2hpbGQxIik7CisgICAgICAgIGFzc2VydFNhbWUocHJlZiwgY2hpbGQxLnBhcmVudCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyb290LnBhcmVudCgpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCXByZWYucHV0KCIiLCAiZW1wdHl2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHMoImVtcHR5dmFsdWUiLCBwcmVmLmdldCgiIiwgbnVsbCkpOwotCQlwcmVmLnB1dCgidGVzdFB1dGtleSIsICJ2YWx1ZTEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBwcmVmLmdldCgidGVzdFB1dGtleSIsIG51bGwpKTsKLQkJcHJlZi5wdXQoInRlc3RQdXRrZXkiLCAidmFsdWUyIik7Ci0JCWFzc2VydEVxdWFscygidmFsdWUyIiwgcHJlZi5nZXQoInRlc3RQdXRrZXkiLCBudWxsKSk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJNaXNzZWQgY2hlY2sgZm9yIG1heCB2YWx1ZXM6IE1BWF9LRVlfTEVOR1RILCBNQVhfTkFNRV9MRU5HVEgsIE1BWF9WQUxVRV9MRU5HVEgiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBwcmVmLnB1dCgiIiwgImVtcHR5dmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbXB0eXZhbHVlIiwgcHJlZi5nZXQoIiIsIG51bGwpKTsKKyAgICAgICAgcHJlZi5wdXQoInRlc3RQdXRrZXkiLCAidmFsdWUxIik7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgcHJlZi5nZXQoInRlc3RQdXRrZXkiLCBudWxsKSk7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0UHV0a2V5IiwgInZhbHVlMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIHByZWYuZ2V0KCJ0ZXN0UHV0a2V5IiwgbnVsbCkpOwogCi0JCXByZWYucHV0KCIiLCAiZW1wdHl2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHMoImVtcHR5dmFsdWUiLCBwcmVmLmdldCgiIiwgbnVsbCkpOworICAgICAgICBwcmVmLnB1dCgiIiwgImVtcHR5dmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbXB0eXZhbHVlIiwgcHJlZi5nZXQoIiIsIG51bGwpKTsKIAotCQl0cnkgewotCQkJcHJlZi5wdXQobnVsbCwgInZhbHVlIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5wdXQoImtleSIsIG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXQobG9uZ0tleSwgbG9uZ1ZhbHVlKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0KGxvbmdLZXkgKyAxLCBsb25nVmFsdWUpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUgKyAxKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXQobnVsbCwgInZhbHVlIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXQoImtleSIsIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXQobG9uZ0tleSwgbG9uZ1ZhbHVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0KGxvbmdLZXkgKyAxLCBsb25nVmFsdWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUgKyAxKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCXByZWYucmVtb3ZlTm9kZSgpOwotCQl0cnkgewotCQkJcHJlZi5wdXQobG9uZ0tleSwgbG9uZ1ZhbHVlICsgMSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAgICAgcHJlZi5yZW1vdmVOb2RlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUgKyAxKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXQobG9uZ0tleSwgbG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RQdXRCb29sZWFuKCkgewotCQl0cnkgewotCQkJcHJlZi5wdXRCb29sZWFuKG51bGwsIGZhbHNlKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0Qm9vbGVhbihsb25nS2V5LCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJvb2xlYW4obG9uZ0tleSArICJhIiwgZmFsc2UpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0Qm9vbGVhbigidGVzdFB1dEJvb2xlYW5LZXkiLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiZmFsc2UiLCBwcmVmLmdldCgidGVzdFB1dEJvb2xlYW5LZXkiLCBudWxsKSk7Ci0JCWFzc2VydEZhbHNlKHByZWYuZ2V0Qm9vbGVhbigidGVzdFB1dEJvb2xlYW5LZXkiLCB0cnVlKSk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dEJvb2xlYW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dEJvb2xlYW4obnVsbCwgZmFsc2UpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXRCb29sZWFuKGxvbmdLZXksIGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0Qm9vbGVhbihsb25nS2V5ICsgImEiLCBmYWxzZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXRCb29sZWFuKCJ0ZXN0UHV0Qm9vbGVhbktleSIsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIHByZWYuZ2V0KCJ0ZXN0UHV0Qm9vbGVhbktleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJlZi5nZXRCb29sZWFuKCJ0ZXN0UHV0Qm9vbGVhbktleSIsIHRydWUpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UHV0RG91YmxlKCkgewotCQl0cnkgewotCQkJcHJlZi5wdXREb3VibGUobnVsbCwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwcmVmLnB1dERvdWJsZShsb25nS2V5LCAzKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0RG91YmxlKGxvbmdLZXkgKyAiYSIsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0RG91YmxlKCJ0ZXN0UHV0RG91YmxlS2V5IiwgMyk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgcHJlZi5nZXQoInRlc3RQdXREb3VibGVLZXkiLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygzLCBwcmVmLmdldERvdWJsZSgidGVzdFB1dERvdWJsZUtleSIsIDApLCAwKTsKLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dERvdWJsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0RG91YmxlKG51bGwsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXREb3VibGUobG9uZ0tleSwgMyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dERvdWJsZShsb25nS2V5ICsgImEiLCAzKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dERvdWJsZSgidGVzdFB1dERvdWJsZUtleSIsIDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMuMCIsIHByZWYuZ2V0KCJ0ZXN0UHV0RG91YmxlS2V5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcHJlZi5nZXREb3VibGUoInRlc3RQdXREb3VibGVLZXkiLCAwKSwgMCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFB1dEZsb2F0KCkgewotCQl0cnkgewotCQkJcHJlZi5wdXRGbG9hdChudWxsLCAzZik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwcmVmLnB1dEZsb2F0KGxvbmdLZXksIDNmKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0RmxvYXQobG9uZ0tleSArICJhIiwgM2YpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0RmxvYXQoInRlc3RQdXRGbG9hdEtleSIsIDNmKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLCBwcmVmLmdldCgidGVzdFB1dEZsb2F0S2V5IiwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoM2YsIHByZWYuZ2V0RmxvYXQoInRlc3RQdXRGbG9hdEtleSIsIDApLCAwKTsKLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRGbG9hdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0RmxvYXQobnVsbCwgM2YpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXRGbG9hdChsb25nS2V5LCAzZik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dEZsb2F0KGxvbmdLZXkgKyAiYSIsIDNmKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dEZsb2F0KCJ0ZXN0UHV0RmxvYXRLZXkiLCAzZik7CisgICAgICAgIGFzc2VydEVxdWFscygiMy4wIiwgcHJlZi5nZXQoInRlc3RQdXRGbG9hdEtleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDNmLCBwcmVmLmdldEZsb2F0KCJ0ZXN0UHV0RmxvYXRLZXkiLCAwKSwgMCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFB1dEludCgpIHsKLQkJdHJ5IHsKLQkJCXByZWYucHV0SW50KG51bGwsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRJbnQobG9uZ0tleSwgMyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEludChsb25nS2V5ICsgImEiLCAzKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwcmVmLnB1dEludCgidGVzdFB1dEludEtleSIsIDMpOwotCQlhc3NlcnRFcXVhbHMoIjMiLCBwcmVmLmdldCgidGVzdFB1dEludEtleSIsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHByZWYuZ2V0SW50KCJ0ZXN0UHV0SW50S2V5IiwgMCkpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0SW50KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRJbnQobnVsbCwgMyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dEludChsb25nS2V5LCAzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0SW50KGxvbmdLZXkgKyAiYSIsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHByZWYucHV0SW50KCJ0ZXN0UHV0SW50S2V5IiwgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyIsIHByZWYuZ2V0KCJ0ZXN0UHV0SW50S2V5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcHJlZi5nZXRJbnQoInRlc3RQdXRJbnRLZXkiLCAwKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFB1dExvbmcoKSB7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dExvbmcobnVsbCwgM0wpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRMb25nKGxvbmdLZXksIDNMKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0TG9uZyhsb25nS2V5ICsgImEiLCAzTCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRMb25nKCJ0ZXN0UHV0TG9uZ0tleSIsIDNMKTsKLQkJYXNzZXJ0RXF1YWxzKCIzIiwgcHJlZi5nZXQoInRlc3RQdXRMb25nS2V5IiwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoM0wsIHByZWYuZ2V0TG9uZygidGVzdFB1dExvbmdLZXkiLCAwKSk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dExvbmcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dExvbmcobnVsbCwgM0wpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXRMb25nKGxvbmdLZXksIDNMKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0TG9uZyhsb25nS2V5ICsgImEiLCAzTCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXRMb25nKCJ0ZXN0UHV0TG9uZ0tleSIsIDNMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgcHJlZi5nZXQoInRlc3RQdXRMb25nS2V5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoM0wsIHByZWYuZ2V0TG9uZygidGVzdFB1dExvbmdLZXkiLCAwKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlwcmVmLnJlbW92ZSgia2V5Iik7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgcHJlZi5yZW1vdmUoImtleSIpOwogCi0JCXByZWYucHV0KCJrZXkiLCAidmFsdWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHByZWYuZ2V0KCJrZXkiLCBudWxsKSk7Ci0JCXByZWYucmVtb3ZlKCJrZXkiKTsKLQkJYXNzZXJ0TnVsbChwcmVmLmdldCgia2V5IiwgbnVsbCkpOworICAgICAgICBwcmVmLnB1dCgia2V5IiwgInZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBwcmVmLmdldCgia2V5IiwgbnVsbCkpOworICAgICAgICBwcmVmLnJlbW92ZSgia2V5Iik7CisgICAgICAgIGFzc2VydE51bGwocHJlZi5nZXQoImtleSIsIG51bGwpKTsKIAotCQlwcmVmLnJlbW92ZSgia2V5Iik7CisgICAgICAgIHByZWYucmVtb3ZlKCJrZXkiKTsKIAotCQl0cnkgewotCQkJcHJlZi5yZW1vdmUobnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmUobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCXByZWYucmVtb3ZlTm9kZSgpOwotCQl0cnkgewotCQkJcHJlZi5yZW1vdmUoImtleSIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICBwcmVmLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlKCJrZXkiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VzIGNoaWxkID0gcHJlZi5ub2RlKCJjaGlsZCIpOwotCQlQcmVmZXJlbmNlcyBjaGlsZDEgPSBwcmVmLm5vZGUoImNoaWxkMSIpOwotCQlQcmVmZXJlbmNlcyBncmFuZGNoaWxkID0gY2hpbGQubm9kZSgiZ3JhbmRjaGlsZCIpOworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkIik7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMSA9IHByZWYubm9kZSgiY2hpbGQxIik7CisgICAgICAgIFByZWZlcmVuY2VzIGdyYW5kY2hpbGQgPSBjaGlsZC5ub2RlKCJncmFuZGNoaWxkIik7CiAKLQkJcHJlZi5yZW1vdmVOb2RlKCk7CisgICAgICAgIHByZWYucmVtb3ZlTm9kZSgpOwogCi0JCWFzc2VydEZhbHNlKGNoaWxkLm5vZGVFeGlzdHMoIiIpKTsKLQkJYXNzZXJ0RmFsc2UoY2hpbGQxLm5vZGVFeGlzdHMoIiIpKTsKLQkJYXNzZXJ0RmFsc2UoZ3JhbmRjaGlsZC5ub2RlRXhpc3RzKCIiKSk7Ci0JCWFzc2VydEZhbHNlKHByZWYubm9kZUV4aXN0cygiIikpOwotCX0KKyAgICAgICAgYXNzZXJ0RmFsc2UoY2hpbGQubm9kZUV4aXN0cygiIikpOworICAgICAgICBhc3NlcnRGYWxzZShjaGlsZDEubm9kZUV4aXN0cygiIikpOworICAgICAgICBhc3NlcnRGYWxzZShncmFuZGNoaWxkLm5vZGVFeGlzdHMoIiIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJlZi5ub2RlRXhpc3RzKCIiKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEFkZE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFsc28gY2hlY2tzIGV2ZW50IGZsb3cuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkTm9kZUNoYW5nZUxpc3RlbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0QWRkTm9kZUNoYW5nZUxpc3RlbmVyKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJUHJlZmVyZW5jZXMgY2hpbGQxID0gbnVsbDsKLQkJUHJlZmVyZW5jZXMgY2hpbGQyID0gbnVsbDsKLQkJUHJlZmVyZW5jZXMgY2hpbGQzID0gbnVsbDsKLQkJLy8gVG8gZ2V0IGV4aXN0ZWQgbm9kZSBkb2Vzbid0IGNyZWF0ZSB0aGUgY2hhbmdlIGV2ZW50Ci0JCXRyeSB7Ci0JCQlubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQljaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2sxIik7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgbmwuZ2V0QWRkZWQoKSk7Ci0JCQlubC5yZXNldCgpOwotCQkJY2hpbGQyID0gcHJlZi5ub2RlKCJtb2NrMSIpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIG5sLmdldEFkZGVkKCkpOwotCQkJbmwucmVzZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCWNoaWxkMS5yZW1vdmVOb2RlKCk7Ci0JCX0KLQkJLy8gc2FtZSBsaXN0ZW5lciBjYW4gYmUgYWRkZWQgdHdpY2UsIGFuZCBtdXN0IGJlIHJlbW92ZWQgdHdpY2UKLQkJdHJ5IHsKLQkJCW5sID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCXByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCXByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCWNoaWxkMSA9IHByZWYubm9kZSgibW9jazIiKTsKLQkJCWFzc2VydEVxdWFscygyLCBubC5nZXRBZGRlZCgpKTsKLQkJCW5sLnJlc2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQljaGlsZDEucmVtb3ZlTm9kZSgpOwotCQl9Ci0JCS8vIHRlc3QgcmVtb3ZlIGV2ZW50Ci0JCXRyeSB7Ci0JCQlubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQljaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2szIik7Ci0JCQljaGlsZDEucmVtb3ZlTm9kZSgpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIG5sLmdldFJlbW92ZWQoKSk7Ci0JCQlubC5yZXNldCgpOwotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQl9Ci0JCS8vIHRlc3QgcmVtb3ZlIGV2ZW50IHdpdGggdHdvIGxpc3RlbmVycwotCQl0cnkgewotCQkJbmwgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQkJY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrNiIpOwotCQkJY2hpbGQxLnJlbW92ZU5vZGUoKTsKLQkJCWFzc2VydEVxdWFscygyLCBubC5nZXRSZW1vdmVkKCkpOwotCQkJbmwucmVzZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJfQotCQkvLyB0ZXN0IGFkZC9yZW1vdmUgaW5kaXJlY3QgY2hpbGRyZW4sIG9yIHJlbW92ZSBzZXZlcmFsIGNoaWxkcmVuIGF0IHRoZQotCQkvLyBzYW1lIHRpbWUKLQkJdHJ5IHsKLQkJCW5sID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCWNoaWxkMSA9IHByZWYubm9kZSgibW9jazQiKTsKLQkJCWNoaWxkMS5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQkJY2hpbGQyID0gcHJlZi5ub2RlKCJtb2NrNC9tb2NrNSIpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOwotCQkJbmwucmVzZXQoKTsKLQkJCWNoaWxkMyA9IHByZWYubm9kZSgibW9jazQvbW9jazUvbW9jazYiKTsKLQkJCWFzc2VydEVxdWFscygwLCBubC5nZXRBZGRlZCgpKTsKLQkJCW5sLnJlc2V0KCk7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMSA9IG51bGw7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMiA9IG51bGw7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMyA9IG51bGw7CisgICAgICAgIC8vIFRvIGdldCBleGlzdGVkIG5vZGUgZG9lc24ndCBjcmVhdGUgdGhlIGNoYW5nZSBldmVudAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmwgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrMSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOworICAgICAgICAgICAgbmwucmVzZXQoKTsKKyAgICAgICAgICAgIGNoaWxkMiA9IHByZWYubm9kZSgibW9jazEiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBubC5nZXRBZGRlZCgpKTsKKyAgICAgICAgICAgIG5sLnJlc2V0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBjaGlsZDEucmVtb3ZlTm9kZSgpOworICAgICAgICB9CisgICAgICAgIC8vIHNhbWUgbGlzdGVuZXIgY2FuIGJlIGFkZGVkIHR3aWNlLCBhbmQgbXVzdCBiZSByZW1vdmVkIHR3aWNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBjaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2syIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmwuZ2V0QWRkZWQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgY2hpbGQxLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IHJlbW92ZSBldmVudAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmwgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrMyIpOworICAgICAgICAgICAgY2hpbGQxLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBubC5nZXRSZW1vdmVkKCkpOworICAgICAgICAgICAgbmwucmVzZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IHJlbW92ZSBldmVudCB3aXRoIHR3byBsaXN0ZW5lcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5sID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIHByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgICAgIHByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgICAgIGNoaWxkMSA9IHByZWYubm9kZSgibW9jazYiKTsKKyAgICAgICAgICAgIGNoaWxkMS5yZW1vdmVOb2RlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmwuZ2V0UmVtb3ZlZCgpKTsKKyAgICAgICAgICAgIG5sLnJlc2V0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGVzdCBhZGQvcmVtb3ZlIGluZGlyZWN0IGNoaWxkcmVuLCBvciByZW1vdmUgc2V2ZXJhbCBjaGlsZHJlbiBhdCB0aGUKKyAgICAgICAgLy8gc2FtZSB0aW1lCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBjaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2s0Iik7CisgICAgICAgICAgICBjaGlsZDEuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgICAgIGNoaWxkMiA9IHByZWYubm9kZSgibW9jazQvbW9jazUiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBubC5nZXRBZGRlZCgpKTsKKyAgICAgICAgICAgIG5sLnJlc2V0KCk7CisgICAgICAgICAgICBjaGlsZDMgPSBwcmVmLm5vZGUoIm1vY2s0L21vY2s1L21vY2s2Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmwuZ2V0QWRkZWQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOwogCi0JCQljaGlsZDMucmVtb3ZlTm9kZSgpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIG5sLmdldFJlbW92ZWQoKSk7Ci0JCQlubC5yZXNldCgpOworICAgICAgICAgICAgY2hpbGQzLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBubC5nZXRSZW1vdmVkKCkpOworICAgICAgICAgICAgbmwucmVzZXQoKTsKIAotCQkJY2hpbGQzID0gcHJlZi5ub2RlKCJtb2NrNC9tb2NrNyIpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOwotCQkJbmwucmVzZXQoKTsKKyAgICAgICAgICAgIGNoaWxkMyA9IHByZWYubm9kZSgibW9jazQvbW9jazciKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBubC5nZXRBZGRlZCgpKTsKKyAgICAgICAgICAgIG5sLnJlc2V0KCk7CiAKLQkJCWNoaWxkMS5yZW1vdmVOb2RlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgbmwuZ2V0UmVtb3ZlZCgpKTsKLQkJCW5sLnJlc2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWNoaWxkMS5yZW1vdmVOb2RlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9CisgICAgICAgICAgICBjaGlsZDEucmVtb3ZlTm9kZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5sLmdldFJlbW92ZWQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGlsZDEucmVtb3ZlTm9kZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIFRPRE86IHN0YXJ0IGZyb20gaGVyZQotCQl0cnkgewotCQkJcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFsc28gY2hlY2tzIGV2ZW50IGZsb3cuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0QWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAvLyBUT0RPOiBzdGFydCBmcm9tIGhlcmUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQkvLyBUbyBnZXQgZXhpc3RlZCBub2RlIGRvZXNuJ3QgY3JlYXRlIHRoZSBjaGFuZ2UgZXZlbnQKLQkJdHJ5IHsKLQkJCXBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJCXByZWYucHV0SW50KCJtb2NrMSIsIDEyMyk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgcGwuZ2V0Q2hhbmdlZCgpKTsKLQkJCXByZWYucHV0TG9uZygibG9uZ19rZXkiLCBMb25nLk1BWF9WQUxVRSk7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgcGwuZ2V0Q2hhbmdlZCgpKTsKLQkJCXBsLnJlc2V0KCk7CisgICAgICAgIC8vIFRvIGdldCBleGlzdGVkIG5vZGUgZG9lc24ndCBjcmVhdGUgdGhlIGNoYW5nZSBldmVudAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGwgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICAgICAgcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICAgICAgcHJlZi5wdXRJbnQoIm1vY2sxIiwgMTIzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBwbC5nZXRDaGFuZ2VkKCkpOworICAgICAgICAgICAgcHJlZi5wdXRMb25nKCJsb25nX2tleSIsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBwbC5nZXRDaGFuZ2VkKCkpOworICAgICAgICAgICAgcGwucmVzZXQoKTsKIAotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwotCQkJLy9jaGlsZDEucmVtb3ZlTm9kZSgpOwotCQl9Ci0JCQkJICAgICAgCi0JCS8vIHNhbWUgbGlzdGVuZXIgY2FuIGJlIGFkZGVkIHR3aWNlLCBhbmQgbXVzdCBiZSByZW1vdmVkIHR3aWNlCi0JCXRyeSB7Ci0JCQlwbCA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCQlwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCQlwcmVmLnB1dEZsb2F0KCJmbG9hdF9rZXkiLCBGbG9hdC5NSU5fVkFMVUUpOwotCQkJYXNzZXJ0RXF1YWxzKDIsIHBsLmdldENoYW5nZWQoKSk7Ci0JCQlwbC5yZXNldCgpOwotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICAgICAgLy9jaGlsZDEucmVtb3ZlTm9kZSgpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIHNhbWUgbGlzdGVuZXIgY2FuIGJlIGFkZGVkIHR3aWNlLCBhbmQgbXVzdCBiZSByZW1vdmVkIHR3aWNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwbCA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7CisgICAgICAgICAgICBwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7CisgICAgICAgICAgICBwcmVmLnB1dEZsb2F0KCJmbG9hdF9rZXkiLCBGbG9hdC5NSU5fVkFMVUUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBsLmdldENoYW5nZWQoKSk7CisgICAgICAgICAgICBwbC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwogCi0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQl0cnkgewotCQkJcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBsMSA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCU1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgbDIgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQlwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7Ci0JCXByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKGwxKTsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgbDEgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyIGwyID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgICAgICBwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7CiAKLQkJcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobDEpOwotCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKGwyKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKGwyKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXRyeSB7Ci0JCQlwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGwxID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBsMiA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGwxKTsKLQkJcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOwotCQl0cnkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGwxKTsKLQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOwotCQl0cnkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGwxID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBsMiA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgIHByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGwxKTsKKyAgICAgICAgcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHByZWYucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGwxKTsKKyAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFN5bmMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3luYygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewogCi0JCWlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmOwotCQlwLnJlc2V0U3luY1RpbWVzKCk7Ci0JCXAuc3luYygpOwotCQlhc3NlcnRFcXVhbHMoMSwgcC5nZXRTeW5jVGltZXMoKSk7CisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmOworICAgICAgICBwLnJlc2V0U3luY1RpbWVzKCk7CisgICAgICAgIHAuc3luYygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcC5nZXRTeW5jVGltZXMoKSk7CiAKLQkJcC5yZXNldFN5bmNUaW1lcygpOwotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjaGlsZCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcAotCQkJCS5ub2RlKCJjaGlsZCIpOwotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjaGlsZDIgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocCwKLQkJCQkiY2hpbGQyIik7Ci0JCXAuY2hpbGRzLnB1dCgiY2hpbGQyIiwgY2hpbGQyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHAuY2FjaGVkQ2hpbGRyZW5JbXBsKCkubGVuZ3RoKTsKLQkJYXNzZXJ0U2FtZShjaGlsZCwgcC5jYWNoZWRDaGlsZHJlbkltcGwoKVswXSk7Ci0JCXAuc3luYygpOwotCQlhc3NlcnRFcXVhbHMoMSwgcC5nZXRTeW5jVGltZXMoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZC5nZXRTeW5jVGltZXMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZDIuZ2V0U3luY1RpbWVzKCkpOworICAgICAgICBwLnJlc2V0U3luY1RpbWVzKCk7CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIGNoaWxkID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwCisgICAgICAgICAgICAgICAgLm5vZGUoImNoaWxkIik7CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIGNoaWxkMiA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwLAorICAgICAgICAgICAgICAgICJjaGlsZDIiKTsKKyAgICAgICAgcC5jaGlsZHMucHV0KCJjaGlsZDIiLCBjaGlsZDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcC5jYWNoZWRDaGlsZHJlbkltcGwoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRTYW1lKGNoaWxkLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKKyAgICAgICAgcC5zeW5jKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwLmdldFN5bmNUaW1lcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmdldFN5bmNUaW1lcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNoaWxkMi5nZXRTeW5jVGltZXMoKSk7CiAKLQkJcC5yZXNldFN5bmNUaW1lcygpOwotCQljaGlsZC5yZXNldFN5bmNUaW1lcygpOwotCQljaGlsZC5zeW5jKCk7Ci0JCWFzc2VydEVxdWFscygwLCBwLmdldFN5bmNUaW1lcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmdldFN5bmNUaW1lcygpKTsKKyAgICAgICAgcC5yZXNldFN5bmNUaW1lcygpOworICAgICAgICBjaGlsZC5yZXNldFN5bmNUaW1lcygpOworICAgICAgICBjaGlsZC5zeW5jKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwLmdldFN5bmNUaW1lcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmdldFN5bmNUaW1lcygpKTsKIAotCQlwLnJlc2V0U3luY1RpbWVzKCk7Ci0JCWNoaWxkLnJlc2V0U3luY1RpbWVzKCk7Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIGdyYW5kc29uID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBjaGlsZAotCQkJCS5ub2RlKCJncmFuZHNvbiIpOwotCQljaGlsZC5zeW5jKCk7Ci0JCWFzc2VydEVxdWFscygwLCBwLmdldFN5bmNUaW1lcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmdldFN5bmNUaW1lcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdyYW5kc29uLmdldFN5bmNUaW1lcygpKTsKLQl9CisgICAgICAgIHAucmVzZXRTeW5jVGltZXMoKTsKKyAgICAgICAgY2hpbGQucmVzZXRTeW5jVGltZXMoKTsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgZ3JhbmRzb24gPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIGNoaWxkCisgICAgICAgICAgICAgICAgLm5vZGUoImdyYW5kc29uIik7CisgICAgICAgIGNoaWxkLnN5bmMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAuZ2V0U3luY1RpbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hpbGQuZ2V0U3luY1RpbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ3JhbmRzb24uZ2V0U3luY1RpbWVzKCkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RGbHVzaCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQkKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7Ci0JCXAucmVzZXRGbHVzaGVkVGltZXMoKTsKLQkJcC5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgcC5nZXRGbHVzaGVkVGltZXMoKSk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmx1c2goKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmOworICAgICAgICBwLnJlc2V0Rmx1c2hlZFRpbWVzKCk7CisgICAgICAgIHAuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHAuZ2V0Rmx1c2hlZFRpbWVzKCkpOwogCi0JCXAucmVzZXRGbHVzaGVkVGltZXMoKTsKLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGQgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHAKLQkJCQkubm9kZSgiY2hpbGQiKTsKLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGQyID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHAsCi0JCQkJImNoaWxkMiIpOwotCQlwLmNoaWxkcy5wdXQoImNoaWxkMiIsIGNoaWxkMik7Ci0JCWFzc2VydEVxdWFscygxLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7Ci0JCWFzc2VydFNhbWUoY2hpbGQsIHAuY2FjaGVkQ2hpbGRyZW5JbXBsKClbMF0pOwotCQlwLmZsdXNoKCk7Ci0JCWFzc2VydEVxdWFscygxLCBwLmdldEZsdXNoZWRUaW1lcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmdldEZsdXNoZWRUaW1lcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNoaWxkMi5nZXRGbHVzaGVkVGltZXMoKSk7CisgICAgICAgIHAucmVzZXRGbHVzaGVkVGltZXMoKTsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGQgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHAKKyAgICAgICAgICAgICAgICAubm9kZSgiY2hpbGQiKTsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGQyID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHAsCisgICAgICAgICAgICAgICAgImNoaWxkMiIpOworICAgICAgICBwLmNoaWxkcy5wdXQoImNoaWxkMiIsIGNoaWxkMik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQsIHAuY2FjaGVkQ2hpbGRyZW5JbXBsKClbMF0pOworICAgICAgICBwLmZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwLmdldEZsdXNoZWRUaW1lcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmdldEZsdXNoZWRUaW1lcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNoaWxkMi5nZXRGbHVzaGVkVGltZXMoKSk7CiAKLQkJcC5yZXNldEZsdXNoZWRUaW1lcygpOwotCQljaGlsZC5yZXNldEZsdXNoZWRUaW1lcygpOwotCQljaGlsZC5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcC5nZXRGbHVzaGVkVGltZXMoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZC5nZXRGbHVzaGVkVGltZXMoKSk7CisgICAgICAgIHAucmVzZXRGbHVzaGVkVGltZXMoKTsKKyAgICAgICAgY2hpbGQucmVzZXRGbHVzaGVkVGltZXMoKTsKKyAgICAgICAgY2hpbGQuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAuZ2V0Rmx1c2hlZFRpbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hpbGQuZ2V0Rmx1c2hlZFRpbWVzKCkpOwogCi0JCXAucmVzZXRGbHVzaGVkVGltZXMoKTsKLQkJY2hpbGQucmVzZXRGbHVzaGVkVGltZXMoKTsKLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgZ3JhbmRzb24gPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIGNoaWxkCi0JCQkJLm5vZGUoImdyYW5kc29uIik7Ci0JCWNoaWxkLmZsdXNoKCk7Ci0JCWFzc2VydEVxdWFscygwLCBwLmdldEZsdXNoZWRUaW1lcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmdldEZsdXNoZWRUaW1lcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdyYW5kc29uLmdldEZsdXNoZWRUaW1lcygpKTsKKyAgICAgICAgcC5yZXNldEZsdXNoZWRUaW1lcygpOworICAgICAgICBjaGlsZC5yZXNldEZsdXNoZWRUaW1lcygpOworICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBncmFuZHNvbiA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgY2hpbGQKKyAgICAgICAgICAgICAgICAubm9kZSgiZ3JhbmRzb24iKTsKKyAgICAgICAgY2hpbGQuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAuZ2V0Rmx1c2hlZFRpbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hpbGQuZ2V0Rmx1c2hlZFRpbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ3JhbmRzb24uZ2V0Rmx1c2hlZFRpbWVzKCkpOwogCi0JCXAucmVzZXRGbHVzaGVkVGltZXMoKTsKLQkJY2hpbGQucmVzZXRGbHVzaGVkVGltZXMoKTsKLQkJZ3JhbmRzb24ucmVzZXRGbHVzaGVkVGltZXMoKTsKLQkJY2hpbGQucmVtb3ZlTm9kZSgpOwotCQljaGlsZC5mbHVzaCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcC5nZXRGbHVzaGVkVGltZXMoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZC5nZXRGbHVzaGVkVGltZXMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBncmFuZHNvbi5nZXRGbHVzaGVkVGltZXMoKSk7Ci0JfQorICAgICAgICBwLnJlc2V0Rmx1c2hlZFRpbWVzKCk7CisgICAgICAgIGNoaWxkLnJlc2V0Rmx1c2hlZFRpbWVzKCk7CisgICAgICAgIGdyYW5kc29uLnJlc2V0Rmx1c2hlZFRpbWVzKCk7CisgICAgICAgIGNoaWxkLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgY2hpbGQuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAuZ2V0Rmx1c2hlZFRpbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hpbGQuZ2V0Rmx1c2hlZFRpbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZ3JhbmRzb24uZ2V0Rmx1c2hlZFRpbWVzKCkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGlsZCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlpZiAoIShwcmVmIGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZjsKLQkJYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbCgiY2hpbGQiKSk7Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIGNoaWxkID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHAsICJjaGlsZCIpOwotCQlwLmNoaWxkcy5wdXQoImNoaWxkIiwgY2hpbGQpOwotCQlhc3NlcnRTYW1lKGNoaWxkLCBwLmdldENoaWxkSW1wbCgiY2hpbGQiKSk7Ci0JCWFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoImNoaWxkICIpKTsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGlsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGQoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7CisgICAgICAgIGFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoImNoaWxkIikpOworICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjaGlsZCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwLCAiY2hpbGQiKTsKKyAgICAgICAgcC5jaGlsZHMucHV0KCJjaGlsZCIsIGNoaWxkKTsKKyAgICAgICAgYXNzZXJ0U2FtZShjaGlsZCwgcC5nZXRDaGlsZEltcGwoImNoaWxkIikpOworICAgICAgICBhc3NlcnROdWxsKHAuZ2V0Q2hpbGRJbXBsKCJjaGlsZCAiKSk7CiAKLQkJYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbCgiY2hpbGQvZ3JhbmRzb24iKSk7Ci0JCWNoaWxkLmNoaWxkcy5wdXQoImdyYW5kc29uIiwgbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKGNoaWxkLAotCQkJCSJncmFuZHNvbiIpKTsKLQkJYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbCgiY2hpbGQvZ3JhbmRzb24iKSk7CisgICAgICAgIGFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoImNoaWxkL2dyYW5kc29uIikpOworICAgICAgICBjaGlsZC5jaGlsZHMucHV0KCJncmFuZHNvbiIsIG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhjaGlsZCwKKyAgICAgICAgICAgICAgICAiZ3JhbmRzb24iKSk7CisgICAgICAgIGFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoImNoaWxkL2dyYW5kc29uIikpOwogCi0JCWFzc2VydE51bGwocC5nZXRDaGlsZEltcGwobnVsbCkpOwotCQlhc3NlcnROdWxsKHAuZ2V0Q2hpbGRJbXBsKCIiKSk7Ci0JCWFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoIiAiKSk7Ci0JCWFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoImFiYy8vYWJjIikpOwotCQlhc3NlcnROdWxsKHAuZ2V0Q2hpbGRJbXBsKCJjaGlsZC8iKSk7Ci0JCWFzc2VydE51bGwocC5nZXRDaGlsZEltcGwobG9uZ05hbWUgKyAiYSIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbChudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoIiIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbCgiICIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbCgiYWJjLy9hYmMiKSk7CisgICAgICAgIGFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoImNoaWxkLyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbChsb25nTmFtZSArICJhIikpOwogCi0JCWNoaWxkLnJlbW92ZU5vZGUoKTsKLQkJYXNzZXJ0TnVsbChwLmdldENoaWxkSW1wbCgiY2hpbGQiKSk7Ci0JfQorICAgICAgICBjaGlsZC5yZW1vdmVOb2RlKCk7CisgICAgICAgIGFzc2VydE51bGwocC5nZXRDaGlsZEltcGwoImNoaWxkIikpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RJc1JlbW92ZWQoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7Ci0JCWFzc2VydEZhbHNlKHAuaXNSZW1vdmVkSW1wbCgpKTsKLQkJcC5yZW1vdmVOb2RlKCk7Ci0JCWFzc2VydFRydWUocC5pc1JlbW92ZWRJbXBsKCkpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlbW92ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZW1vdmVkKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmOworICAgICAgICBhc3NlcnRGYWxzZShwLmlzUmVtb3ZlZEltcGwoKSk7CisgICAgICAgIHAucmVtb3ZlTm9kZSgpOworICAgICAgICBhc3NlcnRUcnVlKHAuaXNSZW1vdmVkSW1wbCgpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJcHJlZi5leHBvcnROb2RlKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFeHBlY3RlZAotCQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleHBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEV4cG9ydE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZXhwb3J0Tm9kZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgfQogCi0JCXByZWYucHV0Qm9vbGVhbigia2V5IiwgZmFsc2UpOwotCQlQcmVmZXJlbmNlcyBjaGlsZCA9IHByZWYubm9kZSgiY2hpbGQ8Iik7Ci0JCWNoaWxkLnB1dCgia2V5MiIsICJ2YWx1ZTI8Iik7Ci0JCVByZWZlcmVuY2VzIGdyYW5kc29uID0gY2hpbGQubm9kZSgiZ3JhbmRzb24iKTsKLQkJZ3JhbmRzb24ucHV0KCJrZXkzIiwgInZhbHVlMyIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCSAgICBjaGlsZC5leHBvcnROb2RlKG91dCk7CisgICAgICAgIHByZWYucHV0Qm9vbGVhbigia2V5IiwgZmFsc2UpOworICAgICAgICBQcmVmZXJlbmNlcyBjaGlsZCA9IHByZWYubm9kZSgiY2hpbGQ8Iik7CisgICAgICAgIGNoaWxkLnB1dCgia2V5MiIsICJ2YWx1ZTI8Iik7CisgICAgICAgIFByZWZlcmVuY2VzIGdyYW5kc29uID0gY2hpbGQubm9kZSgiZ3JhbmRzb24iKTsKKyAgICAgICAgZ3JhbmRzb24ucHV0KCJrZXkzIiwgInZhbHVlMyIpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBjaGlsZC5leHBvcnROb2RlKG91dCk7CiAKLQkJYnl0ZVtdIHJlc3VsdCA9IG91dC50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3VsdCk7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBvdXQudG9TdHJpbmcoKS5nZXRCeXRlcygpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHQpOwogCiAgICAgICAgICAgICAgICAgdHJ5IHsKLQkJICAgIHBhcnNlWG1sU3RyZWFtKGluLCB0cnVlKTsKKyAgICAgICAgICAgIHBhcnNlWG1sU3RyZWFtKGluLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKICAgICAgICAgICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uICIgKyBlZSArICIgZG9lcyBub3QgZXhwZWN0ZWQiKTsKICAgICAgICAgICAgICAgICB9Ci0JfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIERvY3VtZW50IHBhcnNlWG1sU3RyZWFtKElucHV0U3RyZWFtIGlucHV0LCBib29sZWFuIHZhbGlkYXRpbmcpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIENyZWF0ZSBhIGJ1aWxkZXIgZmFjdG9yeQotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKKyAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhtbFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCwgYm9vbGVhbiB2YWxpZGF0aW5nKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICAvLyBDcmVhdGUgYSBidWlsZGVyIGZhY3RvcnkKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7CiAKLQkJLy8gQ3JlYXRlIHRoZSBidWlsZGVyIGFuZCBwYXJzZSB0aGUgZmlsZQotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCURvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UoaW5wdXQpOwotCQlyZXR1cm4gZG9jOwotCX0KKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBidWlsZGVyIGFuZCBwYXJzZSB0aGUgZmlsZQorICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UoaW5wdXQpOworICAgICAgICByZXR1cm4gZG9jOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRTdWJ0cmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlwcmVmLmV4cG9ydFN1YnRyZWUobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEV4cGVjdGVkCi0JCX0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJcHJlZi5wdXRCb29sZWFuKCJrZXkiLCBmYWxzZSk7Ci0JCVByZWZlcmVuY2VzIGNoaWxkID0gcHJlZi5ub2RlKCJjaGlsZCIpOwotCQljaGlsZC5wdXQoImtleTIiLCAidmFsdWUyIik7Ci0JCVByZWZlcmVuY2VzIGdyYW5kc29uID0gY2hpbGQubm9kZSgiZ3JhbmRzb24iKTsKLQkJZ3JhbmRzb24ucHV0KCJrZXkzIiwgInZhbHVlMyIpOwotCQljaGlsZC5ub2RlKCJncmFuZHNvbjIiKTsKLQkJUHJlZmVyZW5jZXMgZ3JhbmRncmFuZHNvbiA9IGdyYW5kc29uLm5vZGUoImdyYW5kZ3JhbmRzb24iKTsKLQkJZ3JhbmRncmFuZHNvbi5wdXQoImtleTQiLCAidmFsdWU0Iik7Ci0JCWNoaWxkLmV4cG9ydFN1YnRyZWUob3V0KTsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4cG9ydFN1YnRyZWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0RXhwb3J0U3VidHJlZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5leHBvcnRTdWJ0cmVlKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICB9CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHByZWYucHV0Qm9vbGVhbigia2V5IiwgZmFsc2UpOworICAgICAgICBQcmVmZXJlbmNlcyBjaGlsZCA9IHByZWYubm9kZSgiY2hpbGQiKTsKKyAgICAgICAgY2hpbGQucHV0KCJrZXkyIiwgInZhbHVlMiIpOworICAgICAgICBQcmVmZXJlbmNlcyBncmFuZHNvbiA9IGNoaWxkLm5vZGUoImdyYW5kc29uIik7CisgICAgICAgIGdyYW5kc29uLnB1dCgia2V5MyIsICJ2YWx1ZTMiKTsKKyAgICAgICAgY2hpbGQubm9kZSgiZ3JhbmRzb24yIik7CisgICAgICAgIFByZWZlcmVuY2VzIGdyYW5kZ3JhbmRzb24gPSBncmFuZHNvbi5ub2RlKCJncmFuZGdyYW5kc29uIik7CisgICAgICAgIGdyYW5kZ3JhbmRzb24ucHV0KCJrZXk0IiwgInZhbHVlNCIpOworICAgICAgICBjaGlsZC5leHBvcnRTdWJ0cmVlKG91dCk7CiAKLQkJYnl0ZVtdIHJlc3VsdCA9IG91dC50b0J5dGVBcnJheSgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhyZXN1bHQsICJ1dGYtOCIpKTsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG91dC50b0J5dGVBcnJheSgpOworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhyZXN1bHQsICJ1dGYtOCIpKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KTsKIAogICAgICAgICAgICAgICAgIHRyeSB7Ci0JCSAgICBwYXJzZVhtbFN0cmVhbShpbiwgdHJ1ZSk7CisgICAgICAgICAgICBwYXJzZVhtbFN0cmVhbShpbiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiAiICsgZWUgKyAiIGRvZXMgbm90IGV4cGVjdGVkIik7CiAgICAgICAgICAgICAgICAgfQotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVkQ2hpbGRyZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7Ci0JCWFzc2VydEVxdWFscygwLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2FjaGVkQ2hpbGRyZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVkQ2hpbGRyZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7CiAKLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGQgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHAKLQkJCQkuZ2V0Q2hpbGRJbXBsKCJjaGlsZCIpOwotCQlhc3NlcnROdWxsKGNoaWxkKTsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGQgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHAKKyAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRJbXBsKCJjaGlsZCIpOworICAgICAgICBhc3NlcnROdWxsKGNoaWxkKTsKIAotCQljaGlsZCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwLCAiY2hpbGQiKTsKLQkJYXNzZXJ0U2FtZShjaGlsZCwgcC5nZXRDaGlsZEltcGwoImNoaWxkIikpOworICAgICAgICBjaGlsZCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhwLCAiY2hpbGQiKTsKKyAgICAgICAgYXNzZXJ0U2FtZShjaGlsZCwgcC5nZXRDaGlsZEltcGwoImNoaWxkIikpOwogCi0JCWFzc2VydEVxdWFscygwLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7CiAKLQkJcC5ub2RlKCJjaGlsZCIpOwotCQlhc3NlcnRTYW1lKGNoaWxkLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKKyAgICAgICAgcC5ub2RlKCJjaGlsZCIpOworICAgICAgICBhc3NlcnRTYW1lKGNoaWxkLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKIAotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBncmFuZGNoaWxkID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKGNoaWxkLAotCQkJCSJncmFuZGNoaWxkIik7Ci0JCWFzc2VydFNhbWUoZ3JhbmRjaGlsZCwgY2hpbGQuZ2V0Q2hpbGRJbXBsKCJncmFuZGNoaWxkIikpOwotCQlhc3NlcnROdWxsKHAuZ2V0Q2hpbGRJbXBsKCJncmFuZGNoaWxkIikpOworICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBncmFuZGNoaWxkID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKGNoaWxkLAorICAgICAgICAgICAgICAgICJncmFuZGNoaWxkIik7CisgICAgICAgIGFzc2VydFNhbWUoZ3JhbmRjaGlsZCwgY2hpbGQuZ2V0Q2hpbGRJbXBsKCJncmFuZGNoaWxkIikpOworICAgICAgICBhc3NlcnROdWxsKHAuZ2V0Q2hpbGRJbXBsKCJncmFuZGNoaWxkIikpOwogCi0JCWFzc2VydEVxdWFscygxLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZC5jYWNoZWRDaGlsZHJlbkltcGwoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcC5jYWNoZWRDaGlsZHJlbkltcGwoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY2hpbGQuY2FjaGVkQ2hpbGRyZW5JbXBsKCkubGVuZ3RoKTsKIAotCQlwLm5vZGUoImNoaWxkL2dyYW5kY2hpbGQiKTsKLQkJYXNzZXJ0U2FtZShjaGlsZCwgcC5jYWNoZWRDaGlsZHJlbkltcGwoKVswXSk7Ci0JCWFzc2VydFNhbWUoZ3JhbmRjaGlsZCwgY2hpbGQuY2FjaGVkQ2hpbGRyZW5JbXBsKClbMF0pOwotCQlhc3NlcnRFcXVhbHMoMSwgcC5jYWNoZWRDaGlsZHJlbkltcGwoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGQuY2FjaGVkQ2hpbGRyZW5JbXBsKCkubGVuZ3RoKTsKKyAgICAgICAgcC5ub2RlKCJjaGlsZC9ncmFuZGNoaWxkIik7CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQsIHAuY2FjaGVkQ2hpbGRyZW5JbXBsKClbMF0pOworICAgICAgICBhc3NlcnRTYW1lKGdyYW5kY2hpbGQsIGNoaWxkLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHAuY2FjaGVkQ2hpbGRyZW5JbXBsKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoaWxkLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7CiAKLQkJcC5jaGlsZHMucHV0KCJjaGlsZDIiLCBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocCwgImNoaWxkMiIpKTsKLQkJcC5ub2RlRXhpc3RzKCJjaGlsZDIvZ3JhbmRjaGlsZCIpOwotCQlhc3NlcnRTYW1lKGNoaWxkLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKLQkJYXNzZXJ0U2FtZShncmFuZGNoaWxkLCBjaGlsZC5jYWNoZWRDaGlsZHJlbkltcGwoKVswXSk7Ci0JCWFzc2VydEVxdWFscygxLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZC5jYWNoZWRDaGlsZHJlbkltcGwoKS5sZW5ndGgpOwotCX0KKyAgICAgICAgcC5jaGlsZHMucHV0KCJjaGlsZDIiLCBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMocCwgImNoaWxkMiIpKTsKKyAgICAgICAgcC5ub2RlRXhpc3RzKCJjaGlsZDIvZ3JhbmRjaGlsZCIpOworICAgICAgICBhc3NlcnRTYW1lKGNoaWxkLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKKyAgICAgICAgYXNzZXJ0U2FtZShncmFuZGNoaWxkLCBjaGlsZC5jYWNoZWRDaGlsZHJlbkltcGwoKVswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwLmNhY2hlZENoaWxkcmVuSW1wbCgpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjaGlsZC5jYWNoZWRDaGlsZHJlbkltcGwoKS5sZW5ndGgpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1ldGhvZCgpIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCSgoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWYpLnByb3RlY3RlZEFic3RyYWN0TWV0aG9kKCk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiQ2FuZGlkYXRlIGZvciByZW1vdmFsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1ldGhvZCgpIHsKKyAgICAgICAgaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICgoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWYpLnByb3RlY3RlZEFic3RyYWN0TWV0aG9kKCk7CisgICAgfQogCi0JcHVibGljIE9iamVjdCBpbnZva2VOb25QdWJsaWNNZXRob2QoQWJzdHJhY3RQcmVmZXJlbmNlcyBvYmosIFN0cmluZyBuYW1lLAotCQkJQ2xhc3NbXSBwYXJhbXMsIE9iamVjdFtdIHBhcmFtVmFsdWVzKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sCi0JCQlOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKLQkJCUlsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG5hbWUsIHBhcmFtcyk7Ci0JCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gbWV0aG9kLmludm9rZShvYmosIHBhcmFtVmFsdWVzKTsKLQl9CitAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICBwdXJwb3NlID0gIkNhbmRpZGF0ZSBmb3IgcmVtb3ZhbC4iLAorICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICIiLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU5vblB1YmxpY01ldGhvZChBYnN0cmFjdFByZWZlcmVuY2VzIG9iaiwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtcywgT2JqZWN0W10gcGFyYW1WYWx1ZXMpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2QobmFtZSwgcGFyYW1zKTsKKyAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKG9iaiwgcGFyYW1WYWx1ZXMpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RCYWNraW5nU3RvcmVFeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQlCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlpZiAoIShwcmVmIGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZjsKLQkJcC5zZXRSZXN1bHQoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMuYmFja2luZ0V4Y2VwdGlvbik7Ci0JCXRyeSB7Ci0JCQlwLmNoaWxkcmVuTmFtZXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLnB1dCgiZXhjZXB0aW9ua2V5IiwgInZhbHVlIik7Ci0JCXAuYWJzb2x1dGVQYXRoKCk7Ci0JCXAudG9TdHJpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJleGNlcHRpb24gZGVmYXVsdCIsIHAuZ2V0KCJrZXkiLCAiZXhjZXB0aW9uIGRlZmF1bHQiKSk7Ci0JCXAucmVtb3ZlKCJrZXkiKTsKLQkJdHJ5IHsKLQkJCXAuY2xlYXIoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLnB1dEludCgia2V5IiwgMyk7Ci0JCXAuZ2V0SW50KCJrZXkiLCAzKTsKLQkJcC5wdXRMb25nKCJrZXkiLCAzbCk7Ci0JCXAuZ2V0TG9uZygia2V5IiwgM2wpOwotCQlwLnB1dERvdWJsZSgia2V5IiwgMyk7Ci0JCXAuZ2V0RG91YmxlKCJrZXkiLCAzKTsKLQkJcC5wdXRCb29sZWFuKCJrZXkiLCB0cnVlKTsKLQkJcC5nZXRCb29sZWFuKCJrZXkiLCB0cnVlKTsKLQkJcC5wdXRGbG9hdCgia2V5IiwgM2YpOwotCQlwLmdldEZsb2F0KCJrZXkiLCAzZik7Ci0JCXAucHV0Qnl0ZUFycmF5KCJrZXkiLCBuZXcgYnl0ZVswXSk7Ci0JCXAuZ2V0Qnl0ZUFycmF5KCJrZXkiLCBuZXcgYnl0ZVswXSk7Ci0JCXRyeSB7Ci0JCQlwLmtleXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBjaGVja3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hpbGRyZW5OYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsdXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleHBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4cG9ydFN1YnRyZWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2hpbGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RCYWNraW5nU3RvcmVFeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBpZiAoIShwcmVmIGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpKSB7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZjsKKyAgICAgICAgcC5zZXRSZXN1bHQoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMuYmFja2luZ0V4Y2VwdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLnB1dCgiZXhjZXB0aW9ua2V5IiwgInZhbHVlIik7CisgICAgICAgIHAuYWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHAudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGNlcHRpb24gZGVmYXVsdCIsIHAuZ2V0KCJrZXkiLCAiZXhjZXB0aW9uIGRlZmF1bHQiKSk7CisgICAgICAgIHAucmVtb3ZlKCJrZXkiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY2xlYXIoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLnB1dEludCgia2V5IiwgMyk7CisgICAgICAgIHAuZ2V0SW50KCJrZXkiLCAzKTsKKyAgICAgICAgcC5wdXRMb25nKCJrZXkiLCAzbCk7CisgICAgICAgIHAuZ2V0TG9uZygia2V5IiwgM2wpOworICAgICAgICBwLnB1dERvdWJsZSgia2V5IiwgMyk7CisgICAgICAgIHAuZ2V0RG91YmxlKCJrZXkiLCAzKTsKKyAgICAgICAgcC5wdXRCb29sZWFuKCJrZXkiLCB0cnVlKTsKKyAgICAgICAgcC5nZXRCb29sZWFuKCJrZXkiLCB0cnVlKTsKKyAgICAgICAgcC5wdXRGbG9hdCgia2V5IiwgM2YpOworICAgICAgICBwLmdldEZsb2F0KCJrZXkiLCAzZik7CisgICAgICAgIHAucHV0Qnl0ZUFycmF5KCJrZXkiLCBuZXcgYnl0ZVswXSk7CisgICAgICAgIHAuZ2V0Qnl0ZUFycmF5KCJrZXkiLCBuZXcgYnl0ZVswXSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmtleXMoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlwLmtleXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcC5jaGlsZHJlbk5hbWVzKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcC5wYXJlbnQoKTsKLQkJcC5ub2RlKCIiKTsKLQkJcC5ub2RlRXhpc3RzKCIiKTsKLQkJdHJ5IHsKLQkJCXAucmVtb3ZlTm9kZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAubmFtZSgpOwotCQlwLmFic29sdXRlUGF0aCgpOwotCQlwLmlzVXNlck5vZGUoKTsKLQkJTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBtb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJcC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCXAucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlNb2NrTm9kZUNoYW5nZUxpc3RlbmVyIG1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQlwLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihtb2NrTm9kZUNoYW5nZUxpc3RlbmVyKTsKLQkJcC5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobW9ja05vZGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCXAudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCXAuc3luYygpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmZsdXNoKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAuZXhwb3J0Tm9kZShuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmV4cG9ydFN1YnRyZWUobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLmlzUmVtb3ZlZEltcGwoKTsKLQkJdHJ5IHsKLQkJCXAuZ2V0Q2hpbGRJbXBsKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAuY2FjaGVkQ2hpbGRyZW5JbXBsKCk7Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5rZXlzKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY2hpbGRyZW5OYW1lcygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHAucGFyZW50KCk7CisgICAgICAgIHAubm9kZSgiIik7CisgICAgICAgIHAubm9kZUV4aXN0cygiIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLm5hbWUoKTsKKyAgICAgICAgcC5hYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgcC5pc1VzZXJOb2RlKCk7CisgICAgICAgIE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgbW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgIHAuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBwLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihtb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBtb2NrTm9kZUNoYW5nZUxpc3RlbmVyID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgcC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobW9ja05vZGVDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIHAucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBwLnRvU3RyaW5nKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnN5bmMoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5mbHVzaCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmV4cG9ydE5vZGUobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5leHBvcnRTdWJ0cmVlKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5pc1JlbW92ZWRJbXBsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmdldENoaWxkSW1wbChudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLmNhY2hlZENoaWxkcmVuSW1wbCgpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7Ci0JCXAuc2V0UmVzdWx0KE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzLnJ1bnRpbWVFeGNlcHRpb24pOwotCQl0cnkgewotCQkJcC5jaGlsZHJlbk5hbWVzKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcC5wdXQoImV4Y2VwdGlvbmtleSIsICJ2YWx1ZSIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcC5hYnNvbHV0ZVBhdGgoKTsKLQkJcC50b1N0cmluZygpOwotCQlhc3NlcnRFcXVhbHMoImV4Y2VwdGlvbiBkZWZhdWx0IiwgcC5nZXQoImtleSIsICJleGNlcHRpb24gZGVmYXVsdCIpKTsKLQkJdHJ5IHsKLQkJCXAucmVtb3ZlKCJrZXkiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmNsZWFyKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcC5wdXRJbnQoImtleSIsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcC5nZXRJbnQoImtleSIsIDMpOwotCQl0cnkgewotCQkJcC5wdXRMb25nKCJrZXkiLCAzbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLmdldExvbmcoImtleSIsIDNsKTsKLQkJdHJ5IHsKLQkJCXAucHV0RG91YmxlKCJrZXkiLCAzKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAuZ2V0RG91YmxlKCJrZXkiLCAzKTsKLQkJdHJ5IHsKLQkJCXAucHV0Qm9vbGVhbigia2V5IiwgdHJ1ZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLmdldEJvb2xlYW4oImtleSIsIHRydWUpOwotCQl0cnkgewotCQkJcC5wdXRGbG9hdCgia2V5IiwgM2YpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcC5nZXRGbG9hdCgia2V5IiwgM2YpOwotCQl0cnkgewotCQkJcC5wdXRCeXRlQXJyYXkoImtleSIsIG5ldyBieXRlWzBdKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAuZ2V0Qnl0ZUFycmF5KCJrZXkiLCBuZXcgYnl0ZVswXSk7Ci0JCXRyeSB7Ci0JCQlwLmtleXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmtleXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmNoaWxkcmVuTmFtZXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAucGFyZW50KCk7Ci0JCXAubm9kZSgiIik7Ci0JCXAubm9kZUV4aXN0cygiIik7Ci0JCXRyeSB7Ci0JCQlwLnJlbW92ZU5vZGUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAubmFtZSgpOwotCQlwLmFic29sdXRlUGF0aCgpOwotCQlwLmlzVXNlck5vZGUoKTsKLQkJTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwY2wgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlwLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCQlwLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCQlNb2NrTm9kZUNoYW5nZUxpc3RlbmVyIG5jbCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXAuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5jbCk7Ci0JCXAucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5jbCk7Ci0JCXAudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCXAuc3luYygpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAuZmx1c2goKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmV4cG9ydE5vZGUobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmV4cG9ydFN1YnRyZWUobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAuaXNSZW1vdmVkSW1wbCgpOwotCQl0cnkgewotCQkJcC5nZXRDaGlsZEltcGwobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLmNhY2hlZENoaWxkcmVuSW1wbCgpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRlc3QgY2hlY2tzIFJ1bnRpbWVFeGNlcHRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGlsZHJlbk5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0Qnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeW5jIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhwb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleHBvcnRTdWJ0cmVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoaWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0UnVudGltZUV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmOworICAgICAgICBwLnNldFJlc3VsdChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcy5ydW50aW1lRXhjZXB0aW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY2hpbGRyZW5OYW1lcygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0KCJleGNlcHRpb25rZXkiLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHAuYWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHAudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGNlcHRpb24gZGVmYXVsdCIsIHAuZ2V0KCJrZXkiLCAiZXhjZXB0aW9uIGRlZmF1bHQiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnJlbW92ZSgia2V5Iik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5jbGVhcigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0SW50KCJrZXkiLCAzKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHAuZ2V0SW50KCJrZXkiLCAzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0TG9uZygia2V5IiwgM2wpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5nZXRMb25nKCJrZXkiLCAzbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnB1dERvdWJsZSgia2V5IiwgMyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLmdldERvdWJsZSgia2V5IiwgMyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnB1dEJvb2xlYW4oImtleSIsIHRydWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5nZXRCb29sZWFuKCJrZXkiLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0RmxvYXQoImtleSIsIDNmKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHAuZ2V0RmxvYXQoImtleSIsIDNmKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0Qnl0ZUFycmF5KCJrZXkiLCBuZXcgYnl0ZVswXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLmdldEJ5dGVBcnJheSgia2V5IiwgbmV3IGJ5dGVbMF0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5rZXlzKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5rZXlzKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5jaGlsZHJlbk5hbWVzKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLnBhcmVudCgpOworICAgICAgICBwLm5vZGUoIiIpOworICAgICAgICBwLm5vZGVFeGlzdHMoIiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5yZW1vdmVOb2RlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLm5hbWUoKTsKKyAgICAgICAgcC5hYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgcC5pc1VzZXJOb2RlKCk7CisgICAgICAgIE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGNsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgcC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGNsKTsKKyAgICAgICAgcC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGNsKTsKKyAgICAgICAgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBuY2wgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICBwLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihuY2wpOworICAgICAgICBwLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihuY2wpOworICAgICAgICBwLnRvU3RyaW5nKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnN5bmMoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTW9ja1J1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmZsdXNoKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5leHBvcnROb2RlKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5leHBvcnRTdWJ0cmVlKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vY2tSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwLmlzUmVtb3ZlZEltcGwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZ2V0Q2hpbGRJbXBsKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChNb2NrUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5jYWNoZWRDaGlsZHJlbkltcGwoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0U1BJUmV0dXJuTnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7Ci0JCXAuc2V0UmVzdWx0KE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzLnJldHVybk51bGwpOwotCQl0cnkgewotCQkJcC5jaGlsZHJlbk5hbWVzKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLmFic29sdXRlUGF0aCgpOwotCQlwLnRvU3RyaW5nKCk7Ci0JCXAucHV0KCJudWxsa2V5IiwgInZhbHVlIik7Ci0JCWFzc2VydEVxdWFscygibnVsbCBkZWZhdWx0IiwgcC5nZXQoImtleSIsICJudWxsIGRlZmF1bHQiKSk7Ci0JCXAucmVtb3ZlKCJrZXkiKTsKLQkJdHJ5IHsKLQkJCXAuY2xlYXIoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAucHV0SW50KCJrZXkiLCAzKTsKLQkJcC5nZXRJbnQoImtleSIsIDMpOwotCQlwLnB1dExvbmcoImtleSIsIDNsKTsKLQkJcC5nZXRMb25nKCJrZXkiLCAzbCk7Ci0JCXAucHV0RG91YmxlKCJrZXkiLCAzKTsKLQkJcC5nZXREb3VibGUoImtleSIsIDMpOwotCQlwLnB1dEJvb2xlYW4oImtleSIsIHRydWUpOwotCQlwLmdldEJvb2xlYW4oImtleSIsIHRydWUpOwotCQlwLnB1dEZsb2F0KCJrZXkiLCAzZik7Ci0JCXAuZ2V0RmxvYXQoImtleSIsIDNmKTsKLQkJcC5wdXRCeXRlQXJyYXkoImtleSIsIG5ldyBieXRlWzBdKTsKLQkJcC5nZXRCeXRlQXJyYXkoImtleSIsIG5ldyBieXRlWzBdKTsKLQkJcC5rZXlzKCk7Ci0JCXRyeSB7Ci0JCQlwLmNoaWxkcmVuTmFtZXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAucGFyZW50KCk7Ci0JCXAubm9kZSgiIik7Ci0JCXAubm9kZUV4aXN0cygiIik7Ci0JCXRyeSB7Ci0JCQlwLnJlbW92ZU5vZGUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAubmFtZSgpOwotCQlwLmFic29sdXRlUGF0aCgpOwotCQlwLmlzVXNlck5vZGUoKTsKLQkJTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBtb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJcC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCXAucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlNb2NrTm9kZUNoYW5nZUxpc3RlbmVyIG1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQlwLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihtb2NrTm9kZUNoYW5nZUxpc3RlbmVyKTsKLQkJcC5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobW9ja05vZGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCXAudG9TdHJpbmcoKTsKLQkJcC5zeW5jKCk7Ci0JCXAuZmx1c2goKTsKLQkJdHJ5IHsKLQkJCXAuZXhwb3J0Tm9kZShTeXN0ZW0ub3V0KTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmV4cG9ydFN1YnRyZWUoU3lzdGVtLm91dCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwLmlzUmVtb3ZlZEltcGwoKTsKLQkJdHJ5IHsKLQkJCXAuZ2V0Q2hpbGRJbXBsKCIiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXAuY2FjaGVkQ2hpbGRyZW5JbXBsKCk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBPSywgYnV0IGl0IHZlcmlmaWVzIHVuc3BlY2lmaWVkIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoaWxkcmVuTmFtZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGlsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4cG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhwb3J0U3VidHJlZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RTUElSZXR1cm5OdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBpZiAoIShwcmVmIGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpKSB7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZjsKKyAgICAgICAgcC5zZXRSZXN1bHQoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMucmV0dXJuTnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHAuYWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHAudG9TdHJpbmcoKTsKKyAgICAgICAgcC5wdXQoIm51bGxrZXkiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIGRlZmF1bHQiLCBwLmdldCgia2V5IiwgIm51bGwgZGVmYXVsdCIpKTsKKyAgICAgICAgcC5yZW1vdmUoImtleSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5jbGVhcigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5wdXRJbnQoImtleSIsIDMpOworICAgICAgICBwLmdldEludCgia2V5IiwgMyk7CisgICAgICAgIHAucHV0TG9uZygia2V5IiwgM2wpOworICAgICAgICBwLmdldExvbmcoImtleSIsIDNsKTsKKyAgICAgICAgcC5wdXREb3VibGUoImtleSIsIDMpOworICAgICAgICBwLmdldERvdWJsZSgia2V5IiwgMyk7CisgICAgICAgIHAucHV0Qm9vbGVhbigia2V5IiwgdHJ1ZSk7CisgICAgICAgIHAuZ2V0Qm9vbGVhbigia2V5IiwgdHJ1ZSk7CisgICAgICAgIHAucHV0RmxvYXQoImtleSIsIDNmKTsKKyAgICAgICAgcC5nZXRGbG9hdCgia2V5IiwgM2YpOworICAgICAgICBwLnB1dEJ5dGVBcnJheSgia2V5IiwgbmV3IGJ5dGVbMF0pOworICAgICAgICBwLmdldEJ5dGVBcnJheSgia2V5IiwgbmV3IGJ5dGVbMF0pOworICAgICAgICBwLmtleXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY2hpbGRyZW5OYW1lcygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5wYXJlbnQoKTsKKyAgICAgICAgcC5ub2RlKCIiKTsKKyAgICAgICAgcC5ub2RlRXhpc3RzKCIiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucmVtb3ZlTm9kZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5uYW1lKCk7CisgICAgICAgIHAuYWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHAuaXNVc2VyTm9kZSgpOworICAgICAgICBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIG1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICBwLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihtb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgcC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgbW9ja05vZGVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgIHAuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBwLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihtb2NrTm9kZUNoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgcC50b1N0cmluZygpOworICAgICAgICBwLnN5bmMoKTsKKyAgICAgICAgcC5mbHVzaCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5leHBvcnROb2RlKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZXhwb3J0U3VidHJlZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHAuaXNSZW1vdmVkSW1wbCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5nZXRDaGlsZEltcGwoIiIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5jYWNoZWRDaGlsZHJlbkltcGwoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXByZWYucmVtb3ZlTm9kZSgpOwotCQkvLyBhZnRlciByZW1vdmUgbm9kZSwgZXZlcnkgbWV0aG9kcywgZXhjZXB0IG5hbWUoKSwgYWJzb2x1dGVQYXRoKCksCi0JCS8vIGlzVXNlck5vZGUoKSwgZmx1c2goKSBvciBub2RlRXhpc3RzKCIiKSwKLQkJLy8gd2lsbCB0aHJvdyBpbGxlZ2FsIHN0YXRlIGV4Y2VwdGlvbgotCQlwcmVmLm5vZGVFeGlzdHMoIiIpOwotCQlwcmVmLm5hbWUoKTsKLQkJcHJlZi5hYnNvbHV0ZVBhdGgoKTsKLQkJcHJlZi5pc1VzZXJOb2RlKCk7Ci0JCXByZWYudG9TdHJpbmcoKTsKLQkJcHJlZi5mbHVzaCgpOwotCQl0cnkgewotCQkJcHJlZi5ub2RlRXhpc3RzKCJjaGlsZCIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLmNoaWxkcmVuTmFtZXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5yZW1vdmUobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYuY2xlYXIoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5nZXQoImtleSIsICJudWxsIGRlZmF1bHQiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5wdXQoIm51bGxrZXkiLCAidmFsdWUiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5wdXRJbnQoImtleSIsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldEludCgia2V5IiwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucHV0TG9uZygia2V5IiwgM2wpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldExvbmcoImtleSIsIDNsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5wdXREb3VibGUoImtleSIsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldERvdWJsZSgia2V5IiwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucHV0Qm9vbGVhbigia2V5IiwgdHJ1ZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYuZ2V0Qm9vbGVhbigia2V5IiwgdHJ1ZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucHV0RmxvYXQoImtleSIsIDNmKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5nZXRGbG9hdCgia2V5IiwgM2YpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJ5dGVBcnJheSgia2V5IiwgbmV3IGJ5dGVbMF0pOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldEJ5dGVBcnJheSgia2V5IiwgbmV3IGJ5dGVbMF0pOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLmtleXMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5rZXlzKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYuY2hpbGRyZW5OYW1lcygpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLnBhcmVudCgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLm5vZGUobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucmVtb3ZlTm9kZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmCi0JCQkJCS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYKLQkJCQkJLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLnN5bmMoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5leHBvcnROb2RlKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLmV4cG9ydFN1YnRyZWUobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7Ci0JCXAuaXNSZW1vdmVkSW1wbCgpOwotCQlwLmNhY2hlZENoaWxkcmVuSW1wbCgpOwotCQl0cnkgewotCQkJcC5nZXRDaGlsZEltcGwobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUZXN0IHZlcmlmaWVzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5vZGVFeGlzdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGlsZHJlbk5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0Qnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeXRlQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoaWxkcmVuTmFtZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZE5vZGVDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4cG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhwb3J0U3VidHJlZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGlsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgLy8gYWZ0ZXIgcmVtb3ZlIG5vZGUsIGV2ZXJ5IG1ldGhvZHMsIGV4Y2VwdCBuYW1lKCksIGFic29sdXRlUGF0aCgpLAorICAgICAgICAvLyBpc1VzZXJOb2RlKCksIGZsdXNoKCkgb3Igbm9kZUV4aXN0cygiIiksCisgICAgICAgIC8vIHdpbGwgdGhyb3cgaWxsZWdhbCBzdGF0ZSBleGNlcHRpb24KKyAgICAgICAgcHJlZi5ub2RlRXhpc3RzKCIiKTsKKyAgICAgICAgcHJlZi5uYW1lKCk7CisgICAgICAgIHByZWYuYWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHByZWYuaXNVc2VyTm9kZSgpOworICAgICAgICBwcmVmLnRvU3RyaW5nKCk7CisgICAgICAgIHByZWYuZmx1c2goKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYubm9kZUV4aXN0cygiY2hpbGQiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5jaGlsZHJlbk5hbWVzKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmNsZWFyKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0KCJrZXkiLCAibnVsbCBkZWZhdWx0Iik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0KCJudWxsa2V5IiwgInZhbHVlIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0SW50KCJrZXkiLCAzKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXRJbnQoImtleSIsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dExvbmcoImtleSIsIDNsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXRMb25nKCJrZXkiLCAzbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0RG91YmxlKCJrZXkiLCAzKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXREb3VibGUoImtleSIsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dEJvb2xlYW4oImtleSIsIHRydWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmdldEJvb2xlYW4oImtleSIsIHRydWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dEZsb2F0KCJrZXkiLCAzZik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0RmxvYXQoImtleSIsIDNmKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkoImtleSIsIG5ldyBieXRlWzBdKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXRCeXRlQXJyYXkoImtleSIsIG5ldyBieXRlWzBdKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5rZXlzKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYua2V5cygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wYXJlbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5ub2RlKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZgorICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmCisgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5zeW5jKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZXhwb3J0Tm9kZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5leHBvcnRTdWJ0cmVlKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmOworICAgICAgICBwLmlzUmVtb3ZlZEltcGwoKTsKKyAgICAgICAgcC5jYWNoZWRDaGlsZHJlbkltcGwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZ2V0Q2hpbGRJbXBsKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdE51bGxBbmRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7Ci0JCXAucmVtb3ZlTm9kZSgpOwotCQl0cnkgewotCQkJcC5nZXQobnVsbCwgIm51bGwgZGVmYXVsdCIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAucHV0KG51bGwsICJ2YWx1ZSIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAucHV0SW50KG51bGwsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAuZ2V0SW50KG51bGwsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAucHV0TG9uZyhudWxsLCAzbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcC5nZXRMb25nKG51bGwsIDNsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLnB1dERvdWJsZShudWxsLCAzKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmdldERvdWJsZShudWxsLCAzKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLnB1dEJvb2xlYW4obnVsbCwgdHJ1ZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcC5nZXRCb29sZWFuKG51bGwsIHRydWUpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAucHV0RmxvYXQobnVsbCwgM2YpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAuZ2V0RmxvYXQobnVsbCwgM2YpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAucHV0Qnl0ZUFycmF5KG51bGwsIG5ldyBieXRlWzBdKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmdldEJ5dGVBcnJheShudWxsLCBuZXcgYnl0ZVswXSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXAucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCB2ZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAmIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGxvbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmxvYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0Qnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCeXRlQXJyYXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZE5vZGVDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdE51bGxBbmRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEocHJlZiBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSkgeworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSAoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWY7CisgICAgICAgIHAucmVtb3ZlTm9kZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5nZXQobnVsbCwgIm51bGwgZGVmYXVsdCIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0KG51bGwsICJ2YWx1ZSIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0SW50KG51bGwsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZ2V0SW50KG51bGwsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0TG9uZyhudWxsLCAzbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5nZXRMb25nKG51bGwsIDNsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnB1dERvdWJsZShudWxsLCAzKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmdldERvdWJsZShudWxsLCAzKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnB1dEJvb2xlYW4obnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5nZXRCb29sZWFuKG51bGwsIHRydWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0RmxvYXQobnVsbCwgM2YpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZ2V0RmxvYXQobnVsbCwgM2YpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0Qnl0ZUFycmF5KG51bGwsIG5ldyBieXRlWzBdKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmdldEJ5dGVBcnJheShudWxsLCBuZXcgYnl0ZVswXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogIAotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI2NoaWxkcmVuTmFtZXNTcGkoKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuTmFtZXNTcGkoKSB7Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoCi0JCQkJKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzLnVzZXJSb290KCksICJtb2NrIik7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgcC5jaGlsZHJlbk5hbWVzU3BpKCkubGVuZ3RoKTsKLQkJfSBjYXRjaChqYXZhLnV0aWwucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uIGJzZSkgewotCQkJZmFpbCgiamF2YS51dGlsLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBpcyB0aHJvd246ICIgKyAKLQkJCQkJYnNlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI2NoaWxkU3BpKCkKLQkgKgotCSAqLworICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI2NoaWxkcmVuTmFtZXNTcGkoKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hpbGRyZW5OYW1lc1NwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbk5hbWVzU3BpKCkgeworICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKAorICAgICAgICAgICAgICAgIChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAibW9jayIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAuY2hpbGRyZW5OYW1lc1NwaSgpLmxlbmd0aCk7CisgICAgICAgIH0gY2F0Y2goamF2YS51dGlsLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBic2UpIHsKKyAgICAgICAgICAgIGZhaWwoImphdmEudXRpbC5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb24gaXMgdGhyb3duOiAiICsgCisgICAgICAgICAgICAgICAgICAgIGJzZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcyNjaGlsZFNwaSgpCisgICAgICoKKyAgICAgKi8KIAotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZFNwaSgpIHsKLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygKLQkJCQkoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgIm1vY2siKTsKLQkJUHJlZmVyZW5jZXMgY2hpbGQgPSBwLm5vZGUoIm1vY2sxIik7Ci0JCWFzc2VydEVxdWFscyhjaGlsZCwgcC5jaGlsZFNwaSgibW9jazEiKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI2ZsdXNoU3BpKCkKLQkgKgotCSAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoaWxkU3BpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZFNwaSgpIHsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgIm1vY2siKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQgPSBwLm5vZGUoIm1vY2sxIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjaGlsZCwgcC5jaGlsZFNwaSgibW9jazEiKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI2ZsdXNoU3BpKCkKKyAgICAgKgorICAgICAqLwogCi0JcHVibGljIHZvaWQgdGVzdEZsdXNoU3BpKCkgewotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKAotCQkJCShBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAibW9jayIpOwotCQl0cnkgewotCQkJcC5mbHVzaFNwaSgpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI2dldFNwaSgpCi0JICoKLQkgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmbHVzaFNwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaFNwaSgpIHsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgIm1vY2siKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZmx1c2hTcGkoKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcyNnZXRTcGkoKQorICAgICAqCisgICAgICovCiAKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BpKCkgewotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKAotCQkJCShBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAibW9jayIpOwotCQl0cnkgewotCQkJYXNzZXJ0TnVsbChwLmdldFNwaSgiIikpOwotCQkJcC5wdXQoImtleSIsICJkZWZhdWx0Iik7Ci0JCQlhc3NlcnRFcXVhbHMoImRlZmF1bHQiLCBwLmdldFNwaSgia2V5IikpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI2tleXNTcGkoKQotCSAqCi0JICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3BpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTcGkoKSB7CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoCisgICAgICAgICAgICAgICAgKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzLnVzZXJSb290KCksICJtb2NrIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKHAuZ2V0U3BpKCIiKSk7CisgICAgICAgICAgICBwLnB1dCgia2V5IiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCIsIHAuZ2V0U3BpKCJrZXkiKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMja2V5c1NwaSgpCisgICAgICoKKyAgICAgKi8KIAotCXB1YmxpYyB2b2lkIHRlc3RLZXlzU3BpKCkgewotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKAotCQkJCShBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAibW9jayIpOwotCQl0cnkgewotCQkJcC5wdXQoImtleTEiLCAiZGVmYXVsdCIpOwotCQkJcC5wdXRJbnQoImtleTIiLCAxMjMpOwotCQkJYXNzZXJ0RXF1YWxzKDIsIHAua2V5c1NwaSgpLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoImtleTIiLCBwLmtleXNTcGkoKVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoImtleTEiLCBwLmtleXNTcGkoKVsxXSk7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMjcHV0U3BpKCkKLQkgKgotCSAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleXNTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5c1NwaSgpIHsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgIm1vY2siKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0KCJrZXkxIiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIHAucHV0SW50KCJrZXkyIiwgMTIzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBwLmtleXNTcGkoKS5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXkyIiwgcC5rZXlzU3BpKClbMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXkxIiwgcC5rZXlzU3BpKClbMV0pOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI3B1dFNwaSgpCisgICAgICoKKyAgICAgKi8KIAotCXB1YmxpYyB2b2lkIHRlc3RQdXRTcGkoKSB7Ci0JCU1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoCi0JCQkJKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzLnVzZXJSb290KCksICJtb2NrIik7Ci0JCXRyeSB7Ci0JCQlwLnB1dFNwaSgia2V5MSIsICJkZWZhdWx0Iik7Ci0JCQlwLnB1dFNwaSgia2V5MiIsICIxMjMiKTsKLQkJCWFzc2VydEVxdWFscygyLCBwLmtleXNTcGkoKS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJrZXkyIiwgcC5rZXlzU3BpKClbMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJrZXkxIiwgcC5rZXlzU3BpKClbMV0pOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzI3JlbW92ZVNwaSgpCi0JICoKLQkgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dFNwaSgpIHsKKyAgICAgICAgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgIm1vY2siKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucHV0U3BpKCJrZXkxIiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIHAucHV0U3BpKCJrZXkyIiwgIjEyMyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHAua2V5c1NwaSgpLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImtleTIiLCBwLmtleXNTcGkoKVswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImtleTEiLCBwLmtleXNTcGkoKVsxXSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMjcmVtb3ZlU3BpKCkKKyAgICAgKgorICAgICAqLwogCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwaSgpIHsKLQkJTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgcCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcygKLQkJCQkoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgIm1vY2siKTsKLQkJcC5wdXQoImtleTEiLCAidmFsdWUxIik7Ci0JCXRyeSB7Ci0JCQlwLnJlbW92ZVNwaSgia2V5MSIpOworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5vZGVTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BpKCkgeworICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKAorICAgICAgICAgICAgICAgIChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAibW9jayIpOworICAgICAgICBwLnB1dCgia2V5MSIsICJ2YWx1ZTEiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAucmVtb3ZlU3BpKCJrZXkxIik7CiAKLQkJCWFzc2VydE51bGwocC5nZXRTcGkoImtleTEiKSk7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMjc3luY1NwaSgpCi0JICoKLQkgKi8KKyAgICAgICAgICAgIGFzc2VydE51bGwocC5nZXRTcGkoImtleTEiKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMjc3luY1NwaSgpCisgICAgICoKKyAgICAgKi8KIAotCXB1YmxpYyB2b2lkIHRlc3RTeW5jU3BpKCkgewotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBwID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKAotCQkJCShBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAibW9jayIpOwotCQlwLnB1dCgia2V5MSIsICJ2YWx1ZTEiKTsKLQkJdHJ5IHsKLQkJCXAuc3luY1NwaSgpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODI4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdExvbmdQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHByZWYKLQkJCQkubm9kZUV4aXN0cygiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkIikpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeW5jU3BpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNTcGkoKSB7CisgICAgICAgIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHAgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoCisgICAgICAgICAgICAgICAgKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzLnVzZXJSb290KCksICJtb2NrIik7CisgICAgICAgIHAucHV0KCJrZXkxIiwgInZhbHVlMSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5zeW5jU3BpKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVncmVzc2lvbiBmb3IgSEFSTU9OWS04MjgKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5vZGVFeGlzdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEZhbHNlKHByZWYKKyAgICAgICAgICAgICAgICAubm9kZUV4aXN0cygiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkIikpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvblRlc3QuamF2YSBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggNTAzNWExYi4uYzM0ODUzYyAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy50ZXN0cy5qYXZhLnV0aWwucHJlZnM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnV0aWwucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMjYsMTEgKzMxLDIxIEBACiAgKiAKICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBCYWNraW5nU3RvcmVFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbihTdHJpbmcpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmFja2luZ1N0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNraW5nU3RvcmVFeGNlcHRpb25TdHJpbmcoKSB7CiAgICAgICAgIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlID0gbmV3IEJhY2tpbmdTdG9yZUV4Y2VwdGlvbigibXNnIik7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRDYXVzZSgpKTsKQEAgLTQwLDYgKzU1LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbihUaHJvd2FibGUpCiAgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmFja2luZ1N0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNraW5nU3RvcmVFeGNlcHRpb25UaHJvd2FibGUoKSB7CiAgICAgICAgIFRocm93YWJsZSB0ID0gbmV3IFRocm93YWJsZSgibXNnIik7CiAgICAgICAgIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlID0gbmV3IEJhY2tpbmdTdG9yZUV4Y2VwdGlvbih0KTsKQEAgLTUxLDYgKzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgKQorICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeVNlbGYobmV3IEJhY2tpbmdTdG9yZUV4Y2VwdGlvbigibXNnIikpOwpAQCAtNTksNiArOTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsIG5ldyBCYWNraW5nU3RvcmVFeGNlcHRpb24oIm1zZyIpKTsKZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9GaWxlUHJlZmVyZW5jZXNJbXBsVGVzdC5qYXZhIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL0ZpbGVQcmVmZXJlbmNlc0ltcGxUZXN0LmphdmEKaW5kZXggMDI2YzgxMy4uMmI2NDFhYiAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL0ZpbGVQcmVmZXJlbmNlc0ltcGxUZXN0LmphdmEKKysrIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL0ZpbGVQcmVmZXJlbmNlc0ltcGxUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnByZWZzLnRlc3RzLmphdmEudXRpbC5wcmVmczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZVBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CkBAIC0yNSwxMSArMzAsMTIgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRmlsZVByZWZlcmVuY2VzSW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIFN0cmluZyBwcmV2RmFjdG9yeTsKLQlwcml2YXRlIFByZWZlcmVuY2VzIHVyb290OwotCXByaXZhdGUgUHJlZmVyZW5jZXMgc3Jvb3Q7CisgICAgcHJpdmF0ZSBQcmVmZXJlbmNlcyB1cm9vdDsKKyAgICBwcml2YXRlIFByZWZlcmVuY2VzIHNyb290OwogICAgIAogICAgIHB1YmxpYyBGaWxlUHJlZmVyZW5jZXNJbXBsVGVzdCgpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTM5LDcgKzQ1LDcgQEAKICAgICAgLy8gICBwcmV2RmFjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzRmFjdG9yeSIpOwogICAgIC8vICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzRmFjdG9yeSIsICJqYXZhLnV0aWwucHJlZnMuRmlsZVByZWZlcmVuY2VzRmFjdG9yeUltcGwiKTsKICAgICAgICAgCi0JLy8JdXJvb3QgPSAoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMudXNlclJvb3QoKTsKKyAgICAvLyAgICB1cm9vdCA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpOwogICAgICAgICB1cm9vdCA9IFByZWZlcmVuY2VzLnVzZXJSb290KCk7CiAgICAgICAgIHNyb290ID0gUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpOwogICAgIH0KQEAgLTUyLDE2MyArNTgsMjA4IEBACiAgICAgICAgIHNyb290ID0gbnVsbDsKICAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UHV0R2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQl1cm9vdC5wdXQoInVrZXkxIiwgInZhbHVlMSIpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHVyb290LmdldCgidWtleTEiLCBudWxsKSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0gdXJvb3Qua2V5cygpOwotCQlhc3NlcnRUcnVlKG5hbWVzLmxlbmd0aCA+PSAxKTsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0R2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICB1cm9vdC5wdXQoInVrZXkxIiwgInZhbHVlMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHVyb290LmdldCgidWtleTEiLCBudWxsKSk7CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gdXJvb3Qua2V5cygpOworICAgICAgICBhc3NlcnRUcnVlKG5hbWVzLmxlbmd0aCA+PSAxKTsKIAotCQl1cm9vdC5wdXQoInVrZXkyIiwgInZhbHVlMyIpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlMyIsIHVyb290LmdldCgidWtleTIiLCBudWxsKSk7Ci0JCXVyb290LnB1dCgiXHU0ZTJkIGtleTEiLCAiXHU0ZTJkIHZhbHVlMSIpOwotCQlhc3NlcnRFcXVhbHMoIlx1NGUyZCB2YWx1ZTEiLCB1cm9vdC5nZXQoIlx1NGUyZCBrZXkxIiwgbnVsbCkpOwotCQluYW1lcyA9IHVyb290LmtleXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVzLmxlbmd0aCk7CisgICAgICAgIHVyb290LnB1dCgidWtleTIiLCAidmFsdWUzIik7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUzIiwgdXJvb3QuZ2V0KCJ1a2V5MiIsIG51bGwpKTsKKyAgICAgICAgdXJvb3QucHV0KCJcdTRlMmQga2V5MSIsICJcdTRlMmQgdmFsdWUxIik7CisgICAgICAgIGFzc2VydEVxdWFscygiXHU0ZTJkIHZhbHVlMSIsIHVyb290LmdldCgiXHU0ZTJkIGtleTEiLCBudWxsKSk7CisgICAgICAgIG5hbWVzID0gdXJvb3Qua2V5cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmFtZXMubGVuZ3RoKTsKIAotCQl1cm9vdC5jbGVhcigpOwotCQluYW1lcyA9IHVyb290LmtleXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVzLmxlbmd0aCk7CisgICAgICAgIHVyb290LmNsZWFyKCk7CisgICAgICAgIG5hbWVzID0gdXJvb3Qua2V5cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmFtZXMubGVuZ3RoKTsKIAotCQlzcm9vdC5wdXQoInNrZXkxIiwgInZhbHVlMSIpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHNyb290LmdldCgic2tleTEiLCBudWxsKSk7Ci0JCXNyb290LnB1dCgiXHU0ZTJkIGtleTEiLCAiXHU0ZTJkIHZhbHVlMSIpOwotCQlhc3NlcnRFcXVhbHMoIlx1NGUyZCB2YWx1ZTEiLCBzcm9vdC5nZXQoIlx1NGUyZCBrZXkxIiwgbnVsbCkpOwotCX0KKyAgICAgICAgc3Jvb3QucHV0KCJza2V5MSIsICJ2YWx1ZTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBzcm9vdC5nZXQoInNrZXkxIiwgbnVsbCkpOworICAgICAgICBzcm9vdC5wdXQoIlx1NGUyZCBrZXkxIiwgIlx1NGUyZCB2YWx1ZTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdTRlMmQgdmFsdWUxIiwgc3Jvb3QuZ2V0KCJcdTRlMmQga2V5MSIsIG51bGwpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGROb2RlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBjaGlsZDEgPSB1cm9vdC5ub2RlKCJjaGlsZDEiKTsKLQkJUHJlZmVyZW5jZXMgY2hpbGQyID0gdXJvb3Qubm9kZSgiXHU0ZTJkIGNoaWxkMiIpOwotCQlQcmVmZXJlbmNlcyBncmFuZGNoaWxkID0gY2hpbGQxLm5vZGUoImdyYW5kIik7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGlsZHJlbk5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RDaGlsZE5vZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMSA9IHVyb290Lm5vZGUoImNoaWxkMSIpOworICAgICAgICBQcmVmZXJlbmNlcyBjaGlsZDIgPSB1cm9vdC5ub2RlKCJcdTRlMmQgY2hpbGQyIik7CisgICAgICAgIFByZWZlcmVuY2VzIGdyYW5kY2hpbGQgPSBjaGlsZDEubm9kZSgiZ3JhbmQiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChncmFuZGNoaWxkKTsKIAotCQlTdHJpbmdbXSBjaGlsZE5hbWVzID0gdXJvb3QuY2hpbGRyZW5OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoNCwgY2hpbGROYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihjaGlsZE5hbWVzW2ldKTsKLQkJfQorICAgICAgICBTdHJpbmdbXSBjaGlsZE5hbWVzID0gdXJvb3QuY2hpbGRyZW5OYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgY2hpbGROYW1lcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjaGlsZE5hbWVzW2ldKTsKKyAgICAgICAgfQogCi0JCWNoaWxkTmFtZXMgPSBjaGlsZDEuY2hpbGRyZW5OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGROYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihjaGlsZE5hbWVzW2ldKTsKLQkJfQorICAgICAgICBjaGlsZE5hbWVzID0gY2hpbGQxLmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoaWxkTmFtZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2hpbGROYW1lc1tpXSk7CisgICAgICAgIH0KIAotCQljaGlsZE5hbWVzID0gY2hpbGQyLmNoaWxkcmVuTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNoaWxkTmFtZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oY2hpbGROYW1lc1tpXSk7Ci0JCX0KKyAgICAgICAgY2hpbGROYW1lcyA9IGNoaWxkMi5jaGlsZHJlbk5hbWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjaGlsZE5hbWVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNoaWxkTmFtZXNbaV0pOworICAgICAgICB9CiAKLQkJY2hpbGQxLnJlbW92ZU5vZGUoKTsKLQkJY2hpbGROYW1lcyA9IHVyb290LmNoaWxkcmVuTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNoaWxkTmFtZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oY2hpbGROYW1lc1tpXSk7Ci0JCX0KLQkJLy8gY2hpbGQyLnJlbW92ZU5vZGUoKTsKLQkJLy8gY2hpbGROYW1lcyA9IHVyb290LmNoaWxkcmVuTmFtZXMoKTsKLQkJLy8gYXNzZXJ0RXF1YWxzKDAsIGNoaWxkTmFtZXMubGVuZ3RoKTsKKyAgICAgICAgY2hpbGQxLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgY2hpbGROYW1lcyA9IHVyb290LmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNoaWxkTmFtZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2hpbGROYW1lc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hpbGQyLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgLy8gY2hpbGROYW1lcyA9IHVyb290LmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKDAsIGNoaWxkTmFtZXMubGVuZ3RoKTsKIAotCQljaGlsZDEgPSBzcm9vdC5ub2RlKCJjaGlsZDEiKTsKLQkJY2hpbGQyID0gc3Jvb3Qubm9kZSgiY2hpbGQyIik7Ci0JCWdyYW5kY2hpbGQgPSBjaGlsZDEubm9kZSgiZ3JhbmQiKTsKKyAgICAgICAgY2hpbGQxID0gc3Jvb3Qubm9kZSgiY2hpbGQxIik7CisgICAgICAgIGNoaWxkMiA9IHNyb290Lm5vZGUoImNoaWxkMiIpOworICAgICAgICBncmFuZGNoaWxkID0gY2hpbGQxLm5vZGUoImdyYW5kIik7CiAKLQkJY2hpbGROYW1lcyA9IHNyb290LmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgY2hpbGROYW1lcyA9IHNyb290LmNoaWxkcmVuTmFtZXMoKTsKIAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihjaGlsZE5hbWVzW2ldKTsKLQkJfQotCS8vCWFzc2VydEVxdWFscygyLCBjaGlsZE5hbWVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNoaWxkTmFtZXNbaV0pOworICAgICAgICB9CisgICAgLy8gICAgYXNzZXJ0RXF1YWxzKDIsIGNoaWxkTmFtZXMubGVuZ3RoKTsKIAotCQljaGlsZE5hbWVzID0gY2hpbGQxLmNoaWxkcmVuTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkTmFtZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oY2hpbGROYW1lc1tpXSk7Ci0JCX0KKyAgICAgICAgY2hpbGROYW1lcyA9IGNoaWxkMS5jaGlsZHJlbk5hbWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjaGlsZE5hbWVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNoaWxkTmFtZXNbaV0pOworICAgICAgICB9CiAKLQkJY2hpbGROYW1lcyA9IGNoaWxkMi5jaGlsZHJlbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGNoaWxkTmFtZXNbaV0pOwotCQl9Ci0JfQorICAgICAgICBjaGlsZE5hbWVzID0gY2hpbGQyLmNoaWxkcmVuTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNoaWxkTmFtZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2hpbGROYW1lc1tpXSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0U2VjdXJpdHlFeGNlcHRpb24oKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgY2hpbGQxID0gdXJvb3Qubm9kZSgiY2hpbGQxIik7Ci0JCU1vY2tGaWxlU2VjdXJpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTW9ja0ZpbGVTZWN1cml0eU1hbmFnZXIoKTsKLQkJbWFuYWdlci5pbnN0YWxsKCk7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXVyb290Lm5vZGUoInNlY3VyaXR5Tm9kZSIpOwotCQkJCWZhaWwoInNob3VsZCB0aHJvdyBzZWN1cml0eSBleGNlcHRpb24iKTsKLQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gbmVlZCBGaWxlUGVybWlzc2lvbihkZWxldGUpOwotCQkJCWNoaWxkMS5yZW1vdmVOb2RlKCk7Ci0JCQkJZmFpbCgic2hvdWxkIHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbiIpOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfQotCQkJdHJ5IHsKLQkJCQl1cm9vdC5jaGlsZHJlbk5hbWVzKCk7Ci0JCQkJZmFpbCgic2hvdWxkIHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbiIpOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfQotCQkJdXJvb3Qua2V5cygpOwotCQkJdXJvb3QucHV0KCJzZWN1cml0eWtleSIsICJ2YWx1ZTEiKTsKLQkJCXVyb290LnJlbW92ZSgic2VjdXJpdHlrZXkiKTsKLQkJCXRyeSB7Ci0JCQkJdXJvb3QuZmx1c2goKTsKLQkJCQlmYWlsKCJzaG91bGQgdGhyb3cgc2VjdXJpdHkgZXhjZXB0aW9uIik7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCWFzc2VydFRydWUoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU2VjdXJpdHlFeGNlcHRpb24pOwotCQkJfQotCQkJdHJ5IHsKLQkJCQl1cm9vdC5zeW5jKCk7Ci0JCQkJZmFpbCgic2hvdWxkIHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbiIpOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNlY3VyaXR5RXhjZXB0aW9uKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1hbmFnZXIucmVzdG9yZURlZmF1bHQoKTsKLQkJfQotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG9ubHksIGJ1dCBtZXRob2RzIGFyZSBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlTm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hpbGRyZW5OYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZmx1c2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjdXJpdHlFeGNlcHRpb24oKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQxID0gdXJvb3Qubm9kZSgiY2hpbGQxIik7CisgICAgICAgIE1vY2tGaWxlU2VjdXJpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTW9ja0ZpbGVTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgbWFuYWdlci5pbnN0YWxsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVyb290Lm5vZGUoInNlY3VyaXR5Tm9kZSIpOworICAgICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBzZWN1cml0eSBleGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gbmVlZCBGaWxlUGVybWlzc2lvbihkZWxldGUpOworICAgICAgICAgICAgICAgIGNoaWxkMS5yZW1vdmVOb2RlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cm9vdC5jaGlsZHJlbk5hbWVzKCk7CisgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXJvb3Qua2V5cygpOworICAgICAgICAgICAgdXJvb3QucHV0KCJzZWN1cml0eWtleSIsICJ2YWx1ZTEiKTsKKyAgICAgICAgICAgIHVyb290LnJlbW92ZSgic2VjdXJpdHlrZXkiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXJvb3QuZmx1c2goKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgc2VjdXJpdHkgZXhjZXB0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU2VjdXJpdHlFeGNlcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cm9vdC5zeW5jKCk7CisgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNlY3VyaXR5RXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1hbmFnZXIucmVzdG9yZURlZmF1bHQoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBNb2NrRmlsZVNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CisgICAgc3RhdGljIGNsYXNzIE1vY2tGaWxlU2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKIAotCQlTZWN1cml0eU1hbmFnZXIgZGZsdDsKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIGRmbHQ7CiAKLQkJcHVibGljIE1vY2tGaWxlU2VjdXJpdHlNYW5hZ2VyKCkgewotCQkJc3VwZXIoKTsKLQkJCWRmbHQgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIE1vY2tGaWxlU2VjdXJpdHlNYW5hZ2VyKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIGRmbHQgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKCkgewotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcih0aGlzKTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBpbnN0YWxsKCkgeworICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcih0aGlzKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlc3RvcmVEZWZhdWx0KCkgewotCQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihkZmx0KTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdCgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIoZGZsdCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKSB7Ci0JCQlpZiAocGVybSBpbnN0YW5jZW9mIEZpbGVQZXJtaXNzaW9uKSB7Ci0JCQkJdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKGRmbHQgIT0gbnVsbCkgewotCQkJCWRmbHQuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgICAgIGlmIChwZXJtIGluc3RhbmNlb2YgRmlsZVBlcm1pc3Npb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGZsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGZsdC5jaGVja1Blcm1pc3Npb24ocGVybSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtLCBPYmplY3QgY3R4KSB7Ci0JCQlpZiAocGVybSBpbnN0YW5jZW9mIEZpbGVQZXJtaXNzaW9uKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHBlcm0uZ2V0QWN0aW9ucygpKTsKLQkJCQl0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKLQkJCX0gZWxzZSBpZiAoZGZsdCAhPSBudWxsKSB7Ci0JCQkJZGZsdC5jaGVja1Blcm1pc3Npb24ocGVybSwgY3R4KTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtLCBPYmplY3QgY3R4KSB7CisgICAgICAgICAgICBpZiAocGVybSBpbnN0YW5jZW9mIEZpbGVQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBlcm0uZ2V0QWN0aW9ucygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGZsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGZsdC5jaGVja1Blcm1pc3Npb24ocGVybSwgY3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9JbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDc4ZWQ3MDQuLjM5ZWY5ZjMgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9JbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL0ludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkucHJlZnMudGVzdHMuamF2YS51dGlsLnByZWZzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS51dGlsLnByZWZzLkludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI1LDExICszMCwyMSBAQAogLyoqCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24oU3RyaW5nKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uU3RyaW5nKCkgewogICAgICAgICBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24gZSA9IG5ldyBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIm1zZyIpOwpAQCAtNDEsNiArNTYsMTUgQEAKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbihTdHJpbmcsCiAgICAgICogVGhyb3dhYmxlKQogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uU3RyaW5nVGhyb3dhYmxlKCkgewogICAgICAgICBUaHJvd2FibGUgdCA9IG5ldyBUaHJvd2FibGUoInJvb3QiKTsKICAgICAgICAgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIGUgPSBuZXcgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uKApAQCAtNTQsNiArNzgsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uKFRocm93YWJsZSkKICAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvblRocm93YWJsZSgpIHsKICAgICAgICAgVGhyb3dhYmxlIHQgPSBuZXcgVGhyb3dhYmxlKCJyb290Iik7CiAgICAgICAgIEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiBlID0gbmV3IEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbigKQEAgLTY2LDYgKzk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG5ldyBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24oCkBAIC03NSw2ICsxMTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworQFRlc3RJbmZvKAorICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICApCisgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5R29sZGVuKHRoaXMsCmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMuamF2YSBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrQWJzdHJhY3RQcmVmZXJlbmNlcy5qYXZhCmluZGV4IDVmYWNhMjMuLjE4MjA5NTQgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrQWJzdHJhY3RQcmVmZXJlbmNlcy5qYXZhCisrKyBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrQWJzdHJhY3RQcmVmZXJlbmNlcy5qYXZhCkBAIC0yNCwyMjIgKzI0LDIyMiBAQAogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZXMgewotCXN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDA7CiAKLQlzdGF0aWMgZmluYWwgaW50IGJhY2tpbmdFeGNlcHRpb24gPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgYmFja2luZ0V4Y2VwdGlvbiA9IDE7CiAKLQlzdGF0aWMgZmluYWwgaW50IHJ1bnRpbWVFeGNlcHRpb24gPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgcnVudGltZUV4Y2VwdGlvbiA9IDI7CiAKLQlzdGF0aWMgZmluYWwgaW50IHJldHVybk51bGwgPSAzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgcmV0dXJuTnVsbCA9IDM7CiAKLQlpbnQgcmVzdWx0ID0gTk9STUFMOworICAgIGludCByZXN1bHQgPSBOT1JNQUw7CiAKLQlQcm9wZXJ0aWVzIGF0dHIgPSBuZXcgUHJvcGVydGllcygpOworICAgIFByb3BlcnRpZXMgYXR0ciA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAKLQlNYXA8U3RyaW5nLCBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcz4gY2hpbGRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcz4oKTsKKyAgICBNYXA8U3RyaW5nLCBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcz4gY2hpbGRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcz4oKTsKIAotCXByaXZhdGUgaW50IGZsdXNoZWRUaW1lczsKKyAgICBwcml2YXRlIGludCBmbHVzaGVkVGltZXM7CiAKLQlwcml2YXRlIGludCBzeW5jVGltZXM7CisgICAgcHJpdmF0ZSBpbnQgc3luY1RpbWVzOwogCi0JcHJvdGVjdGVkIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKEFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQl0aGlzKHBhcmVudCwgbmFtZSwgZmFsc2UpOworICAgIHByb3RlY3RlZCBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhBYnN0cmFjdFByZWZlcmVuY2VzIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIG5hbWUsIGZhbHNlKTsKIAotCX0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoQWJzdHJhY3RQcmVmZXJlbmNlcyBwYXJlbnQsIFN0cmluZyBuYW1lLAotCQkJYm9vbGVhbiBuZXdOb2RlKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCXN1cGVyLm5ld05vZGUgPSBuZXdOb2RlOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHsKLQkJCSgoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudCkuYWRkQ2hpbGQodGhpcyk7Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKEFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50LCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gbmV3Tm9kZSkgeworICAgICAgICBzdXBlcihwYXJlbnQsIG5hbWUpOworICAgICAgICBzdXBlci5uZXdOb2RlID0gbmV3Tm9kZTsKKyAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSB7CisgICAgICAgICAgICAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwYXJlbnQpLmFkZENoaWxkKHRoaXMpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGludCBnZXRGbHVzaGVkVGltZXMoKSB7Ci0JCXJldHVybiBmbHVzaGVkVGltZXM7Ci0JfQorICAgIHB1YmxpYyBpbnQgZ2V0Rmx1c2hlZFRpbWVzKCkgeworICAgICAgICByZXR1cm4gZmx1c2hlZFRpbWVzOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHJlc2V0Rmx1c2hlZFRpbWVzKCkgewotCQlmbHVzaGVkVGltZXMgPSAwOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZXNldEZsdXNoZWRUaW1lcygpIHsKKyAgICAgICAgZmx1c2hlZFRpbWVzID0gMDsKKyAgICB9CiAKLQlwdWJsaWMgaW50IGdldFN5bmNUaW1lcygpIHsKLQkJcmV0dXJuIHN5bmNUaW1lczsKLQl9CisgICAgcHVibGljIGludCBnZXRTeW5jVGltZXMoKSB7CisgICAgICAgIHJldHVybiBzeW5jVGltZXM7CisgICAgfQogCi0JcHVibGljIHZvaWQgcmVzZXRTeW5jVGltZXMoKSB7Ci0JCXN5bmNUaW1lcyA9IDA7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0U3luY1RpbWVzKCkgeworICAgICAgICBzeW5jVGltZXMgPSAwOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBhZGRDaGlsZChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjKSB7Ci0JCWNoaWxkcy5wdXQoYy5uYW1lKCksIGMpOwotCX0KKyAgICBwcml2YXRlIHZvaWQgYWRkQ2hpbGQoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMgYykgeworICAgICAgICBjaGlsZHMucHV0KGMubmFtZSgpLCBjKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoaW50IHIpIHsKLQkJcmVzdWx0ID0gcjsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0KGludCByKSB7CisgICAgICAgIHJlc3VsdCA9IHI7CisgICAgfQogCi0JcHVibGljIE9iamVjdCBsb2NrKCkgewotCQlyZXR1cm4gbG9jazsKLQl9CisgICAgcHVibGljIE9iamVjdCBsb2NrKCkgeworICAgICAgICByZXR1cm4gbG9jazsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nW10gY2hpbGRyZW5OYW1lc1NwaSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQljaGVja0V4Y2VwdGlvbigpOwotCQlpZiAocmVzdWx0ID09IHJldHVybk51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW10gciA9IG5ldyBTdHJpbmdbY2hpbGRzLnNpemUoKV07Ci0JCWNoaWxkcy5rZXlTZXQoKS50b0FycmF5KHIpOwotCQlyZXR1cm4gcjsKLQl9CisgICAgcHVibGljIFN0cmluZ1tdIGNoaWxkcmVuTmFtZXNTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSByZXR1cm5OdWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZ1tdIHIgPSBuZXcgU3RyaW5nW2NoaWxkcy5zaXplKCldOworICAgICAgICBjaGlsZHMua2V5U2V0KCkudG9BcnJheShyKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRXhjZXB0aW9uKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAocmVzdWx0KSB7Ci0JCWNhc2UgTk9STUFMOgotCQkJcmV0dXJuOwotCQljYXNlIGJhY2tpbmdFeGNlcHRpb246Ci0JCQl0aHJvdyBuZXcgQmFja2luZ1N0b3JlRXhjZXB0aW9uKCJ0ZXN0Iik7Ci0JCWNhc2UgcnVudGltZUV4Y2VwdGlvbjoKLQkJCXRocm93IG5ldyBNb2NrUnVudGltZUV4Y2VwdGlvbigidGVzdCIpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBjaGVja0V4Y2VwdGlvbigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIE5PUk1BTDoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBiYWNraW5nRXhjZXB0aW9uOgorICAgICAgICAgICAgdGhyb3cgbmV3IEJhY2tpbmdTdG9yZUV4Y2VwdGlvbigidGVzdCIpOworICAgICAgICBjYXNlIHJ1bnRpbWVFeGNlcHRpb246CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9ja1J1bnRpbWVFeGNlcHRpb24oInRlc3QiKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBBYnN0cmFjdFByZWZlcmVuY2VzIHB1YmxpY0NoaWxkU3BpKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjaGlsZFNwaShuYW1lKTsKLQl9CisgICAgcHVibGljIEFic3RyYWN0UHJlZmVyZW5jZXMgcHVibGljQ2hpbGRTcGkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkU3BpKG5hbWUpOworICAgIH0KIAotCXB1YmxpYyBBYnN0cmFjdFByZWZlcmVuY2VzIGNoaWxkU3BpKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQljaGVja0V4Y2VwdGlvbigpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChyZXN1bHQgPT0gcmV0dXJuTnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBYnN0cmFjdFByZWZlcmVuY2VzIHIgPSBjaGlsZHMuZ2V0KG5hbWUpOwotCQlpZiAociA9PSBudWxsKSB7Ci0JCQlyID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHRoaXMsIG5hbWUsIHRydWUpOworICAgIHB1YmxpYyBBYnN0cmFjdFByZWZlcmVuY2VzIGNoaWxkU3BpKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gcmV0dXJuTnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBBYnN0cmFjdFByZWZlcmVuY2VzIHIgPSBjaGlsZHMuZ2V0KG5hbWUpOworICAgICAgICBpZiAociA9PSBudWxsKSB7CisgICAgICAgICAgICByID0gbmV3IE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKHRoaXMsIG5hbWUsIHRydWUpOwogCi0JCX0KLQkJcmV0dXJuIHI7Ci0JfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGZsdXNoU3BpKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCWNoZWNrRXhjZXB0aW9uKCk7Ci0JCWZsdXNoZWRUaW1lcysrOwotCX0KKyAgICBwdWJsaWMgdm9pZCBmbHVzaFNwaSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBjaGVja0V4Y2VwdGlvbigpOworICAgICAgICBmbHVzaGVkVGltZXMrKzsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFNwaShTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQljaGVja0V4Y2VwdGlvbigpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChudWxsID09IGtleSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCA9PSByZXR1cm5OdWxsID8gbnVsbCA6IGF0dHIuZ2V0UHJvcGVydHkoa2V5KTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRTcGkoU3RyaW5nIGtleSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tFeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCA9PSBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQgPT0gcmV0dXJuTnVsbCA/IG51bGwgOiBhdHRyLmdldFByb3BlcnR5KGtleSk7CisgICAgfQogCi0JcHVibGljIFN0cmluZ1tdIGtleXNTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tFeGNlcHRpb24oKTsKLQkJU2V0PE9iamVjdD4ga2V5cyA9IGF0dHIua2V5U2V0KCk7Ci0JCVN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXTsKLQkJa2V5cy50b0FycmF5KHJlc3VsdHMpOwotCQlyZXR1cm4gcmVzdWx0ID09IHJldHVybk51bGwgPyBudWxsIDogcmVzdWx0czsKLQl9CisgICAgcHVibGljIFN0cmluZ1tdIGtleXNTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tFeGNlcHRpb24oKTsKKyAgICAgICAgU2V0PE9iamVjdD4ga2V5cyA9IGF0dHIua2V5U2V0KCk7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXTsKKyAgICAgICAga2V5cy50b0FycmF5KHJlc3VsdHMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID09IHJldHVybk51bGwgPyBudWxsIDogcmVzdWx0czsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBwdXRTcGkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0cnkgewotCQkJY2hlY2tFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAobmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhdHRyLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHB1dFNwaShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGF0dHIucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlU3BpKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCWNoZWNrRXhjZXB0aW9uKCk7Ci0JCSgoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudCgpKS5jaGlsZHMucmVtb3ZlKG5hbWUoKSk7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZU5vZGVTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tFeGNlcHRpb24oKTsKKyAgICAgICAgKChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcGFyZW50KCkpLmNoaWxkcy5yZW1vdmUobmFtZSgpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGkoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJY2hlY2tFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAobnVsbCA9PSBrZXkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhdHRyLnJlbW92ZShrZXkpOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTcGkoU3RyaW5nIGtleSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tFeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCA9PSBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhdHRyLnJlbW92ZShrZXkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHN5bmNTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tFeGNlcHRpb24oKTsKLQkJc3luY1RpbWVzKys7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHN5bmNTcGkoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tFeGNlcHRpb24oKTsKKyAgICAgICAgc3luY1RpbWVzKys7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gZ2V0TmV3Tm9kZSgpIHsKLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIGdldE5ld05vZGUoKSB7CisgICAgICAgIHJldHVybiBuZXdOb2RlOworICAgIH0KIAotCXB1YmxpYyBPYmplY3QgZ2V0TG9jaygpIHsKLQkJcmV0dXJuIGxvY2s7Ci0JfQorICAgIHB1YmxpYyBPYmplY3QgZ2V0TG9jaygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2s7CisgICAgfQogCi0JcHVibGljIHZvaWQgcHJvdGVjdGVkQWJzdHJhY3RNZXRob2QoKSB7Ci0JCXRyeSB7Ci0JCQljaGlsZHJlbk5hbWVzU3BpKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2hpbGRTcGkoIm1vY2siKTsKLQkJdHJ5IHsKLQkJCWZsdXNoU3BpKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlMSkgewotCQl9Ci0JCWdldFNwaShudWxsKTsKLQkJaXNSZW1vdmVkKCk7Ci0JCXRyeSB7Ci0JCQlrZXlzU3BpKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlMikgewotCQl9Ci0JCXB1dFNwaShudWxsLCBudWxsKTsKLQkJdHJ5IHsKLQkJCXJlbW92ZU5vZGVTcGkoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUzKSB7Ci0JCX0KLQkJcmVtb3ZlU3BpKG51bGwpOwotCQl0cnkgewotCQkJc3luY1NwaSgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTQpIHsKLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBwcm90ZWN0ZWRBYnN0cmFjdE1ldGhvZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoaWxkcmVuTmFtZXNTcGkoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBjaGlsZFNwaSgibW9jayIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmx1c2hTcGkoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUxKSB7CisgICAgICAgIH0KKyAgICAgICAgZ2V0U3BpKG51bGwpOworICAgICAgICBpc1JlbW92ZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtleXNTcGkoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIH0KKyAgICAgICAgcHV0U3BpKG51bGwsIG51bGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVtb3ZlTm9kZVNwaSgpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTMpIHsKKyAgICAgICAgfQorICAgICAgICByZW1vdmVTcGkobnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jU3BpKCk7CisgICAgICAgIH0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlNCkgeworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNSZW1vdmVkSW1wbCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzUmVtb3ZlZCgpOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZWRJbXBsKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuaXNSZW1vdmVkKCk7CisgICAgfQogCi0JcHVibGljIEFic3RyYWN0UHJlZmVyZW5jZXMgZ2V0Q2hpbGRJbXBsKFN0cmluZyBuYW1lKQotCQkJdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZChuYW1lKTsKLQl9CisgICAgcHVibGljIEFic3RyYWN0UHJlZmVyZW5jZXMgZ2V0Q2hpbGRJbXBsKFN0cmluZyBuYW1lKQorICAgICAgICAgICAgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRDaGlsZChuYW1lKTsKKyAgICB9CiAKLQlwdWJsaWMgQWJzdHJhY3RQcmVmZXJlbmNlc1tdIGNhY2hlZENoaWxkcmVuSW1wbCgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhY2hlZENoaWxkcmVuKCk7Ci0JfQorICAgIHB1YmxpYyBBYnN0cmFjdFByZWZlcmVuY2VzW10gY2FjaGVkQ2hpbGRyZW5JbXBsKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuY2FjaGVkQ2hpbGRyZW4oKTsKKyAgICB9CiAKIH0KIAogY2xhc3MgTW9ja1J1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0JcHVibGljIE1vY2tSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KKyAgICBwdWJsaWMgTW9ja1J1bnRpbWVFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQogCi0JcHVibGljIE1vY2tSdW50aW1lRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KKyAgICBwdWJsaWMgTW9ja1J1bnRpbWVFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTW9ja05vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL01vY2tOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YQppbmRleCA3ZmJhOTE0Li40OTAyMzQzIDEwMDY0NAotLS0gYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTW9ja05vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrTm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKQEAgLTUsMTYxICs1LDE2MSBAQAogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKIAogcHVibGljIGNsYXNzIE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBOb2RlQ2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgYm9vbGVhbiBhZGREaXNwYXRjaGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGFkZERpc3BhdGNoZWQgPSBmYWxzZTsKIAotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVEaXNwYXRjaGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZURpc3BhdGNoZWQgPSBmYWxzZTsKIAotCXByaXZhdGUgT2JqZWN0IGFkZExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBPYmplY3QgYWRkTG9jayA9IG5ldyBPYmplY3QoKTsKIAotCXByaXZhdGUgT2JqZWN0IHJlbW92ZUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBPYmplY3QgcmVtb3ZlTG9jayA9IG5ldyBPYmplY3QoKTsKIAotCXByaXZhdGUgaW50IGFkZGVkID0gMDsKKyAgICBwcml2YXRlIGludCBhZGRlZCA9IDA7CiAKLQlwcml2YXRlIGludCByZW1vdmVkID0gMDsKKyAgICBwcml2YXRlIGludCByZW1vdmVkID0gMDsKIAotCXByaXZhdGUgaW50IHRlc3ROdW0gPSAwOworICAgIHByaXZhdGUgaW50IHRlc3ROdW0gPSAwOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9HRVRfQ0hJTEQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfR0VUX0NISUxEID0gMTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfR0VUX1BBUkVOVCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9HRVRfUEFSRU5UID0gMjsKIAotCWJvb2xlYW4gYWRkUmVzdWx0ID0gZmFsc2U7CisgICAgYm9vbGVhbiBhZGRSZXN1bHQgPSBmYWxzZTsKIAotCWJvb2xlYW4gcmVtb3ZlUmVzdWx0ID0gZmFsc2U7CisgICAgYm9vbGVhbiByZW1vdmVSZXN1bHQgPSBmYWxzZTsKIAotCXB1YmxpYyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKGludCB0ZXN0KSB7Ci0JCXRlc3ROdW0gPSB0ZXN0OwotCX0KKyAgICBwdWJsaWMgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcihpbnQgdGVzdCkgeworICAgICAgICB0ZXN0TnVtID0gdGVzdDsKKyAgICB9CiAKLQlwdWJsaWMgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICBwdWJsaWMgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBjaGlsZEFkZGVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7CisgICAgcHVibGljIHZvaWQgY2hpbGRBZGRlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewogCi0JCXN5bmNocm9uaXplZCAoYWRkTG9jaykgewotCQkJc3dpdGNoICh0ZXN0TnVtKSB7Ci0JCQljYXNlIFRFU1RfR0VUX0NISUxEOgotCQkJCVByZWZlcmVuY2VzIGNoaWxkID0gZS5nZXRDaGlsZCgpOwotCQkJCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkJCWFkZFJlc3VsdCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjaGlsZC5uYW1lKCkgPT0gIm1vY2sxIikgewotCQkJCQkJYWRkUmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVEVTVF9HRVRfUEFSRU5UOgotCQkJCVByZWZlcmVuY2VzIHBhcmVudCA9IGUuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCWFkZFJlc3VsdCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwYXJlbnQubmFtZSgpID09ICJtb2NrIikgewotCQkJCQkJYWRkUmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KKyAgICAgICAgc3luY2hyb25pemVkIChhZGRMb2NrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHRlc3ROdW0pIHsKKyAgICAgICAgICAgIGNhc2UgVEVTVF9HRVRfQ0hJTEQ6CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQgPSBlLmdldENoaWxkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5hbWUoKSA9PSAibW9jazEiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVNUX0dFVF9QQVJFTlQ6CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMgcGFyZW50ID0gZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5uYW1lKCkgPT0gIm1vY2siKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkrK2FkZGVkOwotCQkJYWRkRGlzcGF0Y2hlZCA9IHRydWU7Ci0JCQlhZGRMb2NrLm5vdGlmeUFsbCgpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgIGFkZERpc3BhdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgYWRkTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQlzeW5jaHJvbml6ZWQgKHJlbW92ZUxvY2spIHsKLQkJCXN3aXRjaCAodGVzdE51bSkgewotCQkJY2FzZSBURVNUX0dFVF9DSElMRDoKLQkJCQlQcmVmZXJlbmNlcyBjaGlsZCA9IGUuZ2V0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJCQlyZW1vdmVSZXN1bHQgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY2hpbGQubmFtZSgpID09ICJtb2NrMSIpIHsKLQkJCQkJCXJlbW92ZVJlc3VsdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRFU1RfR0VUX1BBUkVOVDoKLQkJCQlQcmVmZXJlbmNlcyBwYXJlbnQgPSBlLmdldFBhcmVudCgpOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCQlhZGRSZXN1bHQgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocGFyZW50Lm5hbWUoKSA9PSAibW9jayIpIHsKLQkJCQkJCWFkZFJlc3VsdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9CisgICAgcHVibGljIHZvaWQgY2hpbGRSZW1vdmVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAocmVtb3ZlTG9jaykgeworICAgICAgICAgICAgc3dpdGNoICh0ZXN0TnVtKSB7CisgICAgICAgICAgICBjYXNlIFRFU1RfR0VUX0NISUxEOgorICAgICAgICAgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkID0gZS5nZXRDaGlsZCgpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5uYW1lKCkgPT0gIm1vY2sxIikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVEVTVF9HRVRfUEFSRU5UOgorICAgICAgICAgICAgICAgIFByZWZlcmVuY2VzIHBhcmVudCA9IGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQubmFtZSgpID09ICJtb2NrIikgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KIAotCQkJCWJyZWFrOwotCQkJfQotCQkJcmVtb3ZlZCsrOwotCQkJcmVtb3ZlRGlzcGF0Y2hlZCA9IHRydWU7Ci0JCQlyZW1vdmVMb2NrLm5vdGlmeUFsbCgpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlZCsrOworICAgICAgICAgICAgcmVtb3ZlRGlzcGF0Y2hlZCA9IHRydWU7CisgICAgICAgICAgICByZW1vdmVMb2NrLm5vdGlmeUFsbCgpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gZ2V0QWRkUmVzdWx0KCkgewotCQlzeW5jaHJvbml6ZWQgKGFkZExvY2spIHsKLQkJCWlmICghYWRkRGlzcGF0Y2hlZCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIFRPRE86IGRvbid0IGtub3cgd2h5IG11c3QgYWRkIGxpbWl0YXRpb24KLQkJCQkJYWRkTG9jay53YWl0KDEwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWFkZERpc3BhdGNoZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYWRkUmVzdWx0OwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBZGRSZXN1bHQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWRkTG9jaykgeworICAgICAgICAgICAgaWYgKCFhZGREaXNwYXRjaGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3Qga25vdyB3aHkgbXVzdCBhZGQgbGltaXRhdGlvbgorICAgICAgICAgICAgICAgICAgICBhZGRMb2NrLndhaXQoMTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRSZXN1bHQ7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gZ2V0UmVtb3ZlUmVzdWx0KCkgewotCQlzeW5jaHJvbml6ZWQgKHJlbW92ZUxvY2spIHsKLQkJCWlmICghcmVtb3ZlRGlzcGF0Y2hlZCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIFRPRE86IGRvbid0IGtub3cgd2h5IG11c3QgYWRkIGxpbWl0YXRpb24KLQkJCQkJcmVtb3ZlTG9jay53YWl0KDEwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJlbW92ZURpc3BhdGNoZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlUmVzdWx0OwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW1vdmVSZXN1bHQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAocmVtb3ZlTG9jaykgeworICAgICAgICAgICAgaWYgKCFyZW1vdmVEaXNwYXRjaGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3Qga25vdyB3aHkgbXVzdCBhZGQgbGltaXRhdGlvbgorICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NrLndhaXQoMTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlRGlzcGF0Y2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdmVSZXN1bHQ7CisgICAgfQogCi0JcHVibGljIGludCBnZXRBZGRlZCgpIHsKLQkJc3luY2hyb25pemVkIChhZGRMb2NrKSB7Ci0JCQlpZiAoIWFkZERpc3BhdGNoZWQpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBUT0RPOiBkb24ndCBrbm93IHdoeSBtdXN0IGFkZCBsaW1pdGF0aW9uCi0JCQkJCWFkZExvY2sud2FpdCgxMDAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBhZGRlZDsKLQl9CisgICAgcHVibGljIGludCBnZXRBZGRlZCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChhZGRMb2NrKSB7CisgICAgICAgICAgICBpZiAoIWFkZERpc3BhdGNoZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkb24ndCBrbm93IHdoeSBtdXN0IGFkZCBsaW1pdGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGFkZExvY2sud2FpdCgxMDAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICB9CiAKLQlwdWJsaWMgaW50IGdldFJlbW92ZWQoKSB7Ci0JCXN5bmNocm9uaXplZCAocmVtb3ZlTG9jaykgewotCQkJaWYgKCFyZW1vdmVEaXNwYXRjaGVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlTG9jay53YWl0KDEwMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZW1vdmVEaXNwYXRjaGVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWQ7CisgICAgcHVibGljIGludCBnZXRSZW1vdmVkKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlbW92ZUxvY2spIHsKKyAgICAgICAgICAgIGlmICghcmVtb3ZlRGlzcGF0Y2hlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2sud2FpdCgxMDAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlRGlzcGF0Y2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdmVkOwogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlhZGRlZCA9IDA7Ci0JCXJlbW92ZWQgPSAwOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgYWRkZWQgPSAwOworICAgICAgICByZW1vdmVkID0gMDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL01vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIuamF2YQppbmRleCBiMDkzODNlLi4wZTYyZGFmIDEwMDY0NAotLS0gYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmphdmEKQEAgLTQsOTkgKzQsOTkgQEAKIGltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwogCiBwdWJsaWMgY2xhc3MgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwogCi0JcHJpdmF0ZSBpbnQgY2hhbmdlZCA9IDA7CisgICAgcHJpdmF0ZSBpbnQgY2hhbmdlZCA9IDA7CiAKLQlwcml2YXRlIGJvb2xlYW4gYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfR0VUX0tFWSA9IDE7CisgICAgcHJpdmF0ZSBib29sZWFuIGFkZERpc3BhdGNoZWQgPSBmYWxzZTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX0dFVF9LRVkgPSAxOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9HRVRfTkVXX1ZBTFVFID0gMjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX0dFVF9OT0RFID0gMzsKLQkKLQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQotCWludCB0ZXN0TnVtID0gMDsKLQkKLQkKLQlwdWJsaWMgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGludCB0ZXN0KSB7Ci0JCXRlc3ROdW0gPSB0ZXN0OwotCX0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX0dFVF9ORVdfVkFMVUUgPSAyOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfR0VUX05PREUgPSAzOworICAgIAorICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgCisgICAgaW50IHRlc3ROdW0gPSAwOworICAgIAorICAgIAorICAgIHB1YmxpYyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoaW50IHRlc3QpIHsKKyAgICAgICAgdGVzdE51bSA9IHRlc3Q7CisgICAgfQogCi0JLy8gcHJpdmF0ZSBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAvLyBwcml2YXRlIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwogCi0JcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgcGNlKSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJc3dpdGNoKHRlc3ROdW0pIHsKLQkJCQljYXNlIFRFU1RfR0VUX0tFWToKLQkJCQkJaWYocGNlICE9IG51bGwpIHsKLQkJCQkJCWlmKHBjZS5nZXRLZXkoKS5lcXVhbHMoImtleV9pbnQiKSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVEVTVF9HRVRfTkVXX1ZBTFVFOgotCQkJCQlpZihwY2UgIT0gbnVsbCkgewotCQkJCQkJaWYocGNlLmdldE5ld1ZhbHVlKCkuZXF1YWxzKG5ldyBJbnRlZ2VyKEludGVnZXIuTUFYX1ZBTFVFKS50b1N0cmluZygpKSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gCQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBURVNUX0dFVF9OT0RFOgotCQkJCQlpZihwY2UgIT0gbnVsbCkgewotCQkJCQkJaWYoIm1vY2siLmVxdWFscyhwY2UuZ2V0Tm9kZSgpLm5hbWUoKSkpIHsKLQkJCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9IAkJCQkJCi0JCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJY2hhbmdlZCsrOwotCQkJYWRkRGlzcGF0Y2hlZCA9IHRydWU7Ci0JCQlsb2NrLm5vdGlmeUFsbCgpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IHBjZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKKyAgICAgICAgICAgIHN3aXRjaCh0ZXN0TnVtKSB7CisgICAgICAgICAgICAgICAgY2FzZSBURVNUX0dFVF9LRVk6CisgICAgICAgICAgICAgICAgICAgIGlmKHBjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwY2UuZ2V0S2V5KCkuZXF1YWxzKCJrZXlfaW50IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRFU1RfR0VUX05FV19WQUxVRToKKyAgICAgICAgICAgICAgICAgICAgaWYocGNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBjZS5nZXROZXdWYWx1ZSgpLmVxdWFscyhuZXcgSW50ZWdlcihJbnRlZ2VyLk1BWF9WQUxVRSkudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVEVTVF9HRVRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYocGNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCJtb2NrIi5lcXVhbHMocGNlLmdldE5vZGUoKS5uYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5nZWQrKzsKKyAgICAgICAgICAgIGFkZERpc3BhdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgbG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBib29sZWFuIGdldFJlc3VsdCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7CisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVzdWx0KCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKIAotCQkJaWYgKCFhZGREaXNwYXRjaGVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gVE9ETzogZG9uJ3Qga25vdyB3aHkgbXVzdCBhZGQgbGltaXRhdGlvbgotCQkJCQlsb2NrLndhaXQoMTAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IGdldENoYW5nZWQoKSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgICAgICAgaWYgKCFhZGREaXNwYXRjaGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3Qga25vdyB3aHkgbXVzdCBhZGQgbGltaXRhdGlvbgorICAgICAgICAgICAgICAgICAgICBsb2NrLndhaXQoMTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldENoYW5nZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewogCi0JCQlpZiAoIWFkZERpc3BhdGNoZWQpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBUT0RPOiBkb24ndCBrbm93IHdoeSBtdXN0IGFkZCBsaW1pdGF0aW9uCi0JCQkJCWxvY2sud2FpdCgxMDAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOwotCQkJcmV0dXJuIGNoYW5nZWQ7Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoIWFkZERpc3BhdGNoZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkb24ndCBrbm93IHdoeSBtdXN0IGFkZCBsaW1pdGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGxvY2sud2FpdCgxMDAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkRGlzcGF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJY2hhbmdlZCA9IDA7Ci0JCXJlc3VsdCA9IGZhbHNlOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgY2hhbmdlZCA9IDA7CisgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrUHJlZmVyZW5jZXNGYWN0b3J5LmphdmEgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTW9ja1ByZWZlcmVuY2VzRmFjdG9yeS5qYXZhCmluZGV4IDA4YjQzZWMuLjM3ZGI1NWQgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrUHJlZmVyZW5jZXNGYWN0b3J5LmphdmEKKysrIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL01vY2tQcmVmZXJlbmNlc0ZhY3RvcnkuamF2YQpAQCAtMjMsMjAgKzIzLDIwIEBACiAgKiAKICAqLwogcHVibGljIGNsYXNzIE1vY2tQcmVmZXJlbmNlc0ZhY3RvcnkgaW1wbGVtZW50cyBQcmVmZXJlbmNlc0ZhY3RvcnkgewotCXN0YXRpYyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyB1c2VyUm9vdCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhudWxsLAotCQkJIiIpOworICAgIHN0YXRpYyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyB1c2VyUm9vdCA9IG5ldyBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyhudWxsLAorICAgICAgICAgICAgIiIpOwogCi0Jc3RhdGljIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHN5c3RlbVJvb3QgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoCi0JCQludWxsLCAiIik7CisgICAgc3RhdGljIE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzIHN5c3RlbVJvb3QgPSBuZXcgTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMoCisgICAgICAgICAgICBudWxsLCAiIik7CiAKLQlwdWJsaWMgTW9ja1ByZWZlcmVuY2VzRmFjdG9yeSgpIHsKLQl9CisgICAgcHVibGljIE1vY2tQcmVmZXJlbmNlc0ZhY3RvcnkoKSB7CisgICAgfQogCi0JcHVibGljIFByZWZlcmVuY2VzIHVzZXJSb290KCkgewotCQlyZXR1cm4gdXNlclJvb3Q7Ci0JfQorICAgIHB1YmxpYyBQcmVmZXJlbmNlcyB1c2VyUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJSb290OworICAgIH0KIAotCXB1YmxpYyBQcmVmZXJlbmNlcyBzeXN0ZW1Sb290KCkgewotCQlyZXR1cm4gc3lzdGVtUm9vdDsKLQl9CisgICAgcHVibGljIFByZWZlcmVuY2VzIHN5c3RlbVJvb3QoKSB7CisgICAgICAgIHJldHVybiBzeXN0ZW1Sb290OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrU2VjdXJpdHlNYW5hZ2VyLmphdmEgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTW9ja1NlY3VyaXR5TWFuYWdlci5qYXZhCmluZGV4IDI3ZjlhOTcuLmU1YTBiZmQgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Nb2NrU2VjdXJpdHlNYW5hZ2VyLmphdmEKKysrIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL01vY2tTZWN1cml0eU1hbmFnZXIuamF2YQpAQCAtMjQsMzcgKzI0LDM3IEBACiAgKi8KIGNsYXNzIE1vY2tTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogCi0JU2VjdXJpdHlNYW5hZ2VyIGRmbHQ7CisgICAgU2VjdXJpdHlNYW5hZ2VyIGRmbHQ7CiAKLQlwdWJsaWMgTW9ja1NlY3VyaXR5TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJZGZsdCA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLQl9CisgICAgcHVibGljIE1vY2tTZWN1cml0eU1hbmFnZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGRmbHQgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgaW5zdGFsbCgpIHsKLQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcih0aGlzKTsKLQl9CisgICAgcHVibGljIHZvaWQgaW5zdGFsbCgpIHsKKyAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcih0aGlzKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdCgpIHsKLQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihkZmx0KTsKLQl9CisgICAgcHVibGljIHZvaWQgcmVzdG9yZURlZmF1bHQoKSB7CisgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIoZGZsdCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFBlcm1pc3Npb24gcGVybSkgewotCQlpZiAocGVybSBpbnN0YW5jZW9mIFJ1bnRpbWVQZXJtaXNzaW9uCi0JCQkJJiYgcGVybS5nZXROYW1lKCkuZXF1YWxzKCJwcmVmZXJlbmNlcyIpKSB7Ci0JCQl0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmIChkZmx0ICE9IG51bGwpIHsKLQkJCWRmbHQuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgaWYgKHBlcm0gaW5zdGFuY2VvZiBSdW50aW1lUGVybWlzc2lvbgorICAgICAgICAgICAgICAgICYmIHBlcm0uZ2V0TmFtZSgpLmVxdWFscygicHJlZmVyZW5jZXMiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGZsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBkZmx0LmNoZWNrUGVybWlzc2lvbihwZXJtKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0sIE9iamVjdCBjdHgpIHsKLQkJaWYgKHBlcm0gaW5zdGFuY2VvZiBSdW50aW1lUGVybWlzc2lvbgotCQkJCSYmIHBlcm0uZ2V0TmFtZSgpLmVxdWFscygicHJlZmVyZW5jZXMiKSkgewotCQkJdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoZGZsdCAhPSBudWxsKSB7Ci0JCQlkZmx0LmNoZWNrUGVybWlzc2lvbihwZXJtLCBjdHgpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0sIE9iamVjdCBjdHgpIHsKKyAgICAgICAgaWYgKHBlcm0gaW5zdGFuY2VvZiBSdW50aW1lUGVybWlzc2lvbgorICAgICAgICAgICAgICAgICYmIHBlcm0uZ2V0TmFtZSgpLmVxdWFscygicHJlZmVyZW5jZXMiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGZsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBkZmx0LmNoZWNrUGVybWlzc2lvbihwZXJtLCBjdHgpOworICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTm9kZUNoYW5nZUV2ZW50VGVzdC5qYXZhIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VFdmVudFRlc3QuamF2YQppbmRleCA3OTgzNWJhLi5iNTY1OTI0IDEwMDY0NAotLS0gYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTm9kZUNoYW5nZUV2ZW50VGVzdC5qYXZhCisrKyBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Ob2RlQ2hhbmdlRXZlbnRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnByZWZzLnRlc3RzLmphdmEudXRpbC5wcmVmczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzOwogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247CkBAIC0yOSw4NyArMzQsMTMzIEBACiAvKioKICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKE5vZGVDaGFuZ2VFdmVudC5jbGFzcykKIHB1YmxpYyBjbGFzcyBOb2RlQ2hhbmdlRXZlbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JTm9kZUNoYW5nZUV2ZW50IGV2ZW50OworICAgIE5vZGVDaGFuZ2VFdmVudCBldmVudDsKIAotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLQkJZXZlbnQgPSBuZXcgTm9kZUNoYW5nZUV2ZW50KFByZWZlcmVuY2VzLnN5c3RlbVJvb3QoKSwgUHJlZmVyZW5jZXMKLQkJCQkudXNlclJvb3QoKSk7Ci0JCWFzc2VydFNhbWUoUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpLCBldmVudC5nZXRQYXJlbnQoKSk7Ci0JCWFzc2VydFNhbWUoUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgZXZlbnQuZ2V0Q2hpbGQoKSk7Ci0JCWFzc2VydFNhbWUoUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vZGVDaGFuZ2VFdmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMuY2xhc3MsIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgeworICAgICAgICBldmVudCA9IG5ldyBOb2RlQ2hhbmdlRXZlbnQoUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpLCBQcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIC51c2VyUm9vdCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCksIGV2ZW50LmdldFBhcmVudCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCBldmVudC5nZXRDaGlsZCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCksIGV2ZW50LmdldFNvdXJjZSgpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOdWxsUGFyYW0oKSB7Ci0JCXRyeSB7Ci0JCQlldmVudCA9IG5ldyBOb2RlQ2hhbmdlRXZlbnQobnVsbCwgUHJlZmVyZW5jZXMudXNlclJvb3QoKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb2RlQ2hhbmdlRXZlbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzLmNsYXNzLCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck51bGxQYXJhbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV2ZW50ID0gbmV3IE5vZGVDaGFuZ2VFdmVudChudWxsLCBQcmVmZXJlbmNlcy51c2VyUm9vdCgpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCWV2ZW50ID0gbmV3IE5vZGVDaGFuZ2VFdmVudChQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCksIG51bGwpOwotCQlhc3NlcnRTYW1lKFByZWZlcmVuY2VzLnN5c3RlbVJvb3QoKSwgZXZlbnQuZ2V0UGFyZW50KCkpOwotCQlhc3NlcnROdWxsKGV2ZW50LmdldENoaWxkKCkpOwotCQlhc3NlcnRTYW1lKFByZWZlcmVuY2VzLnN5c3RlbVJvb3QoKSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCX0KKyAgICAgICAgZXZlbnQgPSBuZXcgTm9kZUNoYW5nZUV2ZW50KFByZWZlcmVuY2VzLnN5c3RlbVJvb3QoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydFNhbWUoUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpLCBldmVudC5nZXRQYXJlbnQoKSk7CisgICAgICAgIGFzc2VydE51bGwoZXZlbnQuZ2V0Q2hpbGQoKSk7CisgICAgICAgIGFzc2VydFNhbWUoUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpLCBldmVudC5nZXRTb3VyY2UoKSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCi0JCWV2ZW50ID0gbmV3IE5vZGVDaGFuZ2VFdmVudChQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCksIG51bGwpOworICAgICAgICBldmVudCA9IG5ldyBOb2RlQ2hhbmdlRXZlbnQoUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpLCBudWxsKTsKIAotCQl0cnkgewotCQkJU2VyaWFsaXphdGlvblRlc3QuY29weVNlcmlhbGl6YWJsZShldmVudCk7Ci0JCQlmYWlsKCJObyBleHBlY3RlZCBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LmNvcHlTZXJpYWxpemFibGUoZXZlbnQpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhwZWN0ZWQgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGQoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGNvcnJlY3QsIGZ1bmN0aW9uYWxpdHkgY2hlY2tlZCBpbiBzZXBhcmF0ZSBNb2NrIGNsYXNzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoaWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldENoaWxkKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CiAKLQkJQWJzdHJhY3RQcmVmZXJlbmNlcyBwYXJlbnQgPSAoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMKLQkJCQkudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgQWJzdHJhY3RQcmVmZXJlbmNlcyBwYXJlbnQgPSAoQWJzdHJhY3RQcmVmZXJlbmNlcykgUHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKIAotCQlBYnN0cmFjdFByZWZlcmVuY2VzIHByZWYgPSAoQWJzdHJhY3RQcmVmZXJlbmNlcykgcGFyZW50Lm5vZGUoIm1vY2siKTsKKyAgICAgICAgQWJzdHJhY3RQcmVmZXJlbmNlcyBwcmVmID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudC5ub2RlKCJtb2NrIik7CiAKLQkJTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKAotCQkJCU1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIuVEVTVF9HRVRfQ0hJTEQpOwotCQl0cnkgewotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQkJUHJlZmVyZW5jZXMgY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrMSIpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOwotCQkJYXNzZXJ0VHJ1ZShubC5nZXRBZGRSZXN1bHQoKSk7Ci0JCQlubC5yZXNldCgpOwotCQkJY2hpbGQxLnJlbW92ZU5vZGUoKTsKLQkJCWFzc2VydEVxdWFscygxLCBubC5nZXRSZW1vdmVkKCkpOwotCQkJYXNzZXJ0VHJ1ZShubC5nZXRSZW1vdmVSZXN1bHQoKSk7Ci0JCQlubC5yZXNldCgpOwotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQYXJlbnQoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKAorICAgICAgICAgICAgICAgIE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIuVEVTVF9HRVRfQ0hJTEQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrMSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShubC5nZXRBZGRSZXN1bHQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICAgICAgY2hpbGQxLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBubC5nZXRSZW1vdmVkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShubC5nZXRSZW1vdmVSZXN1bHQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICB9CisgICAgfQorICAgIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlRlc3QgaXMgY29ycmVjdCwgZnVuY3Rpb25hbGl0eSBjaGVja2VkIGluIHNlcGFyYXRlIE1vY2sgY2xhc3MuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGFyZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmVudCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewogCi0JCUFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzCi0JCQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CiAKLQkJQWJzdHJhY3RQcmVmZXJlbmNlcyBwcmVmID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudC5ub2RlKCJtb2NrIik7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXMgcHJlZiA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBwYXJlbnQubm9kZSgibW9jayIpOwogCi0JCU1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgbmwgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigKLQkJCQlNb2NrTm9kZUNoYW5nZUxpc3RlbmVyLlRFU1RfR0VUX0NISUxEKTsKLQkJdHJ5IHsKLQkJCXByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCVByZWZlcmVuY2VzIGNoaWxkMSA9IHByZWYubm9kZSgibW9jazEiKTsKLQkJCWFzc2VydEVxdWFscygxLCBubC5nZXRBZGRlZCgpKTsKLQkJCWFzc2VydFRydWUobmwuZ2V0QWRkUmVzdWx0KCkpOwotCQkJbmwucmVzZXQoKTsKLQkJCWNoaWxkMS5yZW1vdmVOb2RlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgbmwuZ2V0UmVtb3ZlZCgpKTsKLQkJCWFzc2VydFRydWUobmwuZ2V0UmVtb3ZlUmVzdWx0KCkpOwotCQkJbmwucmVzZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJfQotCX0KKyAgICAgICAgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKAorICAgICAgICAgICAgICAgIE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIuVEVTVF9HRVRfQ0hJTEQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrMSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShubC5nZXRBZGRSZXN1bHQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICAgICAgY2hpbGQxLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBubC5nZXRSZW1vdmVkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShubC5nZXRSZW1vdmVSZXN1bHQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VMaXN0ZW5lclRlc3QuamF2YSBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9Ob2RlQ2hhbmdlTGlzdGVuZXJUZXN0LmphdmEKaW5kZXggNTA5ZmE5ZS4uNWVmNGY1MCAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VMaXN0ZW5lclRlc3QuamF2YQorKysgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvTm9kZUNoYW5nZUxpc3RlbmVyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy50ZXN0cy5qYXZhLnV0aWwucHJlZnM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50OwogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwpAQCAtMjUsNDMgKzMwLDYyIEBACiAvKioKICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKE5vZGVDaGFuZ2VMaXN0ZW5lci5jbGFzcykKIHB1YmxpYyBjbGFzcyBOb2RlQ2hhbmdlTGlzdGVuZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JTm9kZUNoYW5nZUxpc3RlbmVyIGw7CisgICAgTm9kZUNoYW5nZUxpc3RlbmVyIGw7CiAKLQkvKgotCSAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWwgPSBuZXcgTm9kZUNoYW5nZUxpc3RlbmVySW1wbCgpOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGwgPSBuZXcgTm9kZUNoYW5nZUxpc3RlbmVySW1wbCgpOworICAgIH0KIAotCS8qCi0JICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZEFkZGVkKCkgewotCQlsLmNoaWxkQWRkZWQobmV3IE5vZGVDaGFuZ2VFdmVudChQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCBQcmVmZXJlbmNlcwotCQkJCS51c2VyUm9vdCgpKSk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlRlc3RpbmcgSW50ZXJmYWNlIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hpbGRBZGRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRBZGRlZCgpIHsKKyAgICAgICAgbC5jaGlsZEFkZGVkKG5ldyBOb2RlQ2hhbmdlRXZlbnQoUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgUHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAudXNlclJvb3QoKSkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZFJlbW92ZWQoKSB7Ci0JCWwuY2hpbGRSZW1vdmVkKG5ldyBOb2RlQ2hhbmdlRXZlbnQoUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgUHJlZmVyZW5jZXMKLQkJCQkudXNlclJvb3QoKSkpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJUZXN0aW5nIEludGVyZmFjZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoaWxkUmVtb3ZlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRSZW1vdmVkKCkgeworICAgICAgICBsLmNoaWxkUmVtb3ZlZChuZXcgTm9kZUNoYW5nZUV2ZW50KFByZWZlcmVuY2VzLnVzZXJSb290KCksIFByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgLnVzZXJSb290KCkpKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGVDaGFuZ2VMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBOb2RlQ2hhbmdlTGlzdGVuZXIgeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZUNoYW5nZUxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIE5vZGVDaGFuZ2VMaXN0ZW5lciB7CiAKLQkJcHVibGljIHZvaWQgY2hpbGRBZGRlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGNoaWxkQWRkZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgeworICAgICAgICB9CiAKLQl9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZUNoYW5nZUV2ZW50VGVzdC5qYXZhIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VDaGFuZ2VFdmVudFRlc3QuamF2YQppbmRleCBjMzcwOWRjLi4yNjdhYzI4IDEwMDY0NAotLS0gYS9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZUNoYW5nZUV2ZW50VGVzdC5qYXZhCisrKyBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9QcmVmZXJlbmNlQ2hhbmdlRXZlbnRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnByZWZzLnRlc3RzLmphdmEudXRpbC5wcmVmczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzOwogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7CkBAIC0yOCwxMCArMzMsMjAgQEAKIC8qKgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUHJlZmVyZW5jZUNoYW5nZUV2ZW50LmNsYXNzKQogcHVibGljIGNsYXNzIFByZWZlcmVuY2VDaGFuZ2VFdmVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQ7CiAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNoZWNrcyBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJlZmVyZW5jZUNoYW5nZUV2ZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByZWZlcmVuY2VDaGFuZ2VFdmVudEV4Y2VwdGlvbigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGV2ZW50ID0gbmV3IFByZWZlcmVuY2VDaGFuZ2VFdmVudChudWxsLCAia2V5IiwgInZhbHVlIik7CkBAIC00MCw2ICs1NSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJlZmVyZW5jZUNoYW5nZUV2ZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yTnVsbFZhbHVlKCkgewogICAgICAgICBldmVudCA9IG5ldyBQcmVmZXJlbmNlQ2hhbmdlRXZlbnQoUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgImtleSIsIG51bGwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImtleSIsIGV2ZW50LmdldEtleSgpKTsKQEAgLTY2LDYgKzkwLDE1IEBACiAgICAgICAgIGFzc2VydFNhbWUoUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgZXZlbnQuZ2V0U291cmNlKCkpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByZWZlcmVuY2VDaGFuZ2VFdmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKICAgICAgICAgZXZlbnQgPSBuZXcgUHJlZmVyZW5jZUNoYW5nZUV2ZW50KFByZWZlcmVuY2VzLnVzZXJSb290KCksICJrZXkiLAogICAgICAgICAgICAgICAgICJ2YWx1ZSIpOwpAQCAtNzUsNiArMTA4LDE1IEBACiAgICAgICAgIGFzc2VydFNhbWUoUHJlZmVyZW5jZXMudXNlclJvb3QoKSwgZXZlbnQuZ2V0U291cmNlKCkpOwogICAgIH0KIAorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHNlcmlhbGl6YXRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGV2ZW50ID0gbmV3IFByZWZlcmVuY2VDaGFuZ2VFdmVudChQcmVmZXJlbmNlcy51c2VyUm9vdCgpLCAia2V5IiwKICAgICAgICAgICAgICAgICAidmFsdWUiKTsKQEAgLTg1LDY3ICsxMjcsOTQgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGNvcnJlY3QsIGZ1bmN0aW9uYWxpdHkgY2hlY2tlZCBpbiBzZXBhcmF0ZSBNb2NrIGNsYXNzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRLZXkoKSB7Ci0JCUFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzCi0JCQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CiAKLQkJQWJzdHJhY3RQcmVmZXJlbmNlcyBwcmVmID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudC5ub2RlKCJtb2NrIik7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXMgcHJlZiA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBwYXJlbnQubm9kZSgibW9jayIpOwogCi0JCU1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGwgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigKLQkJCQlNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLlRFU1RfR0VUX0tFWSk7Ci0JCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0SW50KCJrZXlfaW50IiwgSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIHBsLmdldENoYW5nZWQoKSk7Ci0JCQlhc3NlcnRUcnVlKHBsLmdldFJlc3VsdCgpKTsKLQkJCXBsLnJlc2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCX0KKyAgICAgICAgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwbCA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAorICAgICAgICAgICAgICAgIE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIuVEVTVF9HRVRfS0VZKTsKKyAgICAgICAgcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRJbnQoImtleV9pbnQiLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGwuZ2V0Q2hhbmdlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocGwuZ2V0UmVzdWx0KCkpOworICAgICAgICAgICAgcGwucmVzZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGlzIGNvcnJlY3QsIGZ1bmN0aW9uYWxpdHkgY2hlY2tlZCBpbiBzZXBhcmF0ZSBNb2NrIGNsYXNzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5ld1ZhbHVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5ld1ZhbHVlKCkgewotCQlBYnN0cmFjdFByZWZlcmVuY2VzIHBhcmVudCA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcwotCQkJCS51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICBBYnN0cmFjdFByZWZlcmVuY2VzIHBhcmVudCA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBQcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIC51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwogCi0JCUFic3RyYWN0UHJlZmVyZW5jZXMgcHJlZiA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBwYXJlbnQubm9kZSgibW9jayIpOworICAgICAgICBBYnN0cmFjdFByZWZlcmVuY2VzIHByZWYgPSAoQWJzdHJhY3RQcmVmZXJlbmNlcykgcGFyZW50Lm5vZGUoIm1vY2siKTsKIAotCQlNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoCi0JCQkJTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5URVNUX0dFVF9ORVdfVkFMVUUpOwotCQlwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEludCgia2V5X2ludCIsIEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCWFzc2VydEVxdWFscygxLCBwbC5nZXRDaGFuZ2VkKCkpOwotCQkJYXNzZXJ0VHJ1ZShwbC5nZXRSZXN1bHQoKSk7Ci0JCQlwbC5yZXNldCgpOwotCQkJCi0JCQlwcmVmLnB1dEludCgia2V5X2ludCIsIEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCWFzc2VydEVxdWFscygxLCBwbC5nZXRDaGFuZ2VkKCkpOwotCQkJYXNzZXJ0VHJ1ZShwbC5nZXRSZXN1bHQoKSk7Ci0JCQlwbC5yZXNldCgpOwotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwotCQl9CisgICAgICAgIE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGwgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLlRFU1RfR0VUX05FV19WQUxVRSk7CisgICAgICAgIHByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0SW50KCJrZXlfaW50IiwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBsLmdldENoYW5nZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBsLmdldFJlc3VsdCgpKTsKKyAgICAgICAgICAgIHBsLnJlc2V0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByZWYucHV0SW50KCJrZXlfaW50IiwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBsLmdldENoYW5nZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBsLmdldFJlc3VsdCgpKTsKKyAgICAgICAgICAgIHBsLnJlc2V0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7CisgICAgICAgIH0KICAgICB9CiAgICAgCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBpcyBjb3JyZWN0LCBmdW5jdGlvbmFsaXR5IGNoZWNrZWQgaW4gc2VwYXJhdGUgTW9jayBjbGFzcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5vZGUoKSB7Ci0JCUFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzCi0JCQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXMgcGFyZW50ID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIFByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CiAKLQkJQWJzdHJhY3RQcmVmZXJlbmNlcyBwcmVmID0gKEFic3RyYWN0UHJlZmVyZW5jZXMpIHBhcmVudC5ub2RlKCJtb2NrIik7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXMgcHJlZiA9IChBYnN0cmFjdFByZWZlcmVuY2VzKSBwYXJlbnQubm9kZSgibW9jayIpOwogCi0JCU1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGwgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigKLQkJCQlNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLlRFU1RfR0VUX05PREUpOwotCQlwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEludCgia2V5X2ludCIsIEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCWFzc2VydEVxdWFscygxLCBwbC5nZXRDaGFuZ2VkKCkpOwotCQkJYXNzZXJ0VHJ1ZShwbC5nZXRSZXN1bHQoKSk7Ci0JCQlwbC5yZXNldCgpOworICAgICAgICBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5URVNUX0dFVF9OT0RFKTsKKyAgICAgICAgcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRJbnQoImtleV9pbnQiLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGwuZ2V0Q2hhbmdlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocGwuZ2V0UmVzdWx0KCkpOworICAgICAgICAgICAgcGwucmVzZXQoKTsKIAotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwotCQl9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7CisgICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJUZXN0LmphdmEgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyVGVzdC5qYXZhCmluZGV4IGM0MTcwNTIuLjNkZDJiMTcgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJUZXN0LmphdmEKKysrIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lclRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkucHJlZnMudGVzdHMuamF2YS51dGlsLnByZWZzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudDsKIGltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwogaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKQEAgLTI1LDI4ICszMCwzOCBAQAogLyoqCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBsOworICAgIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBsOwogCi0JLyoKLQkgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlsID0gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lckltcGwoKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBsID0gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lckltcGwoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZmVyZW5jZUNoYW5nZSgpIHsKLQkJbC5wcmVmZXJlbmNlQ2hhbmdlKG5ldyBQcmVmZXJlbmNlQ2hhbmdlRXZlbnQoUHJlZmVyZW5jZXMudXNlclJvb3QoKSwKLQkJCQkiIiwgIiIpKTsKLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdGluZyBJbnRlcmZhY2UiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmVmZXJlbmNlQ2hhbmdlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVmZXJlbmNlQ2hhbmdlKCkgeworICAgICAgICBsLnByZWZlcmVuY2VDaGFuZ2UobmV3IFByZWZlcmVuY2VDaGFuZ2VFdmVudChQcmVmZXJlbmNlcy51c2VyUm9vdCgpLAorICAgICAgICAgICAgICAgICIiLCAiIikpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVySW1wbCBpbXBsZW1lbnRzCi0JCQlQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBwY2UpIHsKLQkJfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVySW1wbCBpbXBsZW1lbnRzCisgICAgICAgICAgICBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBwY2UpIHsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzRmFjdG9yeVRlc3QuamF2YSBiL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9QcmVmZXJlbmNlc0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggZDBjMzU0MS4uMmJhZGM5OSAxMDA2NDQKLS0tIGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzRmFjdG9yeVRlc3QuamF2YQorKysgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXNGYWN0b3J5VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy50ZXN0cy5qYXZhLnV0aWwucHJlZnM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7CiBpbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzRmFjdG9yeTsKIApAQCAtMjQsMzYgKzI5LDU1IEBACiAvKioKICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKFByZWZlcmVuY2VzRmFjdG9yeS5jbGFzcykKIHB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0ZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JUHJlZmVyZW5jZXNGYWN0b3J5IGY7CisgICAgUHJlZmVyZW5jZXNGYWN0b3J5IGY7CiAKLQkvKgotCSAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWYgPSBuZXcgUHJlZmVyZW5jZXNGYWN0b3J5SW1wbCgpOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGYgPSBuZXcgUHJlZmVyZW5jZXNGYWN0b3J5SW1wbCgpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RVc2VyUm9vdCgpIHsKLQkJZi51c2VyUm9vdCgpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJUZXN0aW5nIEludGVyZmFjZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVzZXJSb290IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFVzZXJSb290KCkgeworICAgICAgICBmLnVzZXJSb290KCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFN5c3RlbVJvb3QoKSB7Ci0JCWYuc3lzdGVtUm9vdCgpOwotCX0KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJUZXN0aW5nIEludGVyZmFjZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVzZXJSb290IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbVJvb3QoKSB7CisgICAgICAgIGYuc3lzdGVtUm9vdCgpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZmVyZW5jZXNGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFByZWZlcmVuY2VzRmFjdG9yeSB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVmZXJlbmNlc0ZhY3RvcnlJbXBsIGltcGxlbWVudHMgUHJlZmVyZW5jZXNGYWN0b3J5IHsKIAotCQlwdWJsaWMgUHJlZmVyZW5jZXMgdXNlclJvb3QoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgUHJlZmVyZW5jZXMgdXNlclJvb3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBQcmVmZXJlbmNlcyBzeXN0ZW1Sb290KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFByZWZlcmVuY2VzIHN5c3RlbVJvb3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzVGVzdC5qYXZhIGIvcHJlZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcHJlZnMvdGVzdHMvamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzVGVzdC5qYXZhCmluZGV4IDIzMjQ4YzAuLjI1Zjg5MWUgMTAwNjQ0Ci0tLSBhL3ByZWZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3ByZWZzL3Rlc3RzL2phdmEvdXRpbC9wcmVmcy9QcmVmZXJlbmNlc1Rlc3QuamF2YQorKysgYi9wcmVmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9wcmVmcy90ZXN0cy9qYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXNUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnByZWZzLnRlc3RzLmphdmEudXRpbC5wcmVmczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMzUsMTQxOSArNDAsMTg5MiBAQAogLyoqCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhQcmVmZXJlbmNlcy5jbGFzcykKIHB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLQlNb2NrU2VjdXJpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTW9ja1NlY3VyaXR5TWFuYWdlcigpOworICAgIE1vY2tTZWN1cml0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNb2NrU2VjdXJpdHlNYW5hZ2VyKCk7CiAKLQlNb2NrSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIGxvbmdLZXk7Ci0JCi0JZmluYWwgc3RhdGljIFN0cmluZyBsb25nVmFsdWU7CisgICAgTW9ja0lucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgCisgICAgZmluYWwgc3RhdGljIFN0cmluZyBsb25nS2V5OworICAgIAorICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgbG9uZ1ZhbHVlOwogCi0JSW5wdXRTdHJlYW0gaW47Ci0Jc3RhdGljIHsKLQkJU3RyaW5nQnVmZmVyIGtleSA9IG5ldyBTdHJpbmdCdWZmZXIoUHJlZmVyZW5jZXMuTUFYX0tFWV9MRU5HVEgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IFByZWZlcmVuY2VzLk1BWF9LRVlfTEVOR1RIOyBpKyspIHsKLQkJCWtleS5hcHBlbmQoJ2EnKTsKLQkJfQotCQlsb25nS2V5ID0ga2V5LnRvU3RyaW5nKCk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEg7IGkrKykgewotCQkJdmFsdWUuYXBwZW5kKCdhJyk7Ci0JCX0KLQkJbG9uZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKLQl9CisgICAgSW5wdXRTdHJlYW0gaW47CisgICAgc3RhdGljIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGtleSA9IG5ldyBTdHJpbmdCdWZmZXIoUHJlZmVyZW5jZXMuTUFYX0tFWV9MRU5HVEgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFByZWZlcmVuY2VzLk1BWF9LRVlfTEVOR1RIOyBpKyspIHsKKyAgICAgICAgICAgIGtleS5hcHBlbmQoJ2EnKTsKKyAgICAgICAgfQorICAgICAgICBsb25nS2V5ID0ga2V5LnRvU3RyaW5nKCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEg7IGkrKykgeworICAgICAgICAgICAgdmFsdWUuYXBwZW5kKCdhJyk7CisgICAgICAgIH0KKyAgICAgICAgbG9uZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCSI8IURPQ1RZUEUgcHJlZmVyZW5jZXMgU1lTVEVNIFwiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvcHJlZmVyZW5jZXMuZHRkXCI+PHByZWZlcmVuY2VzPjxyb290IHR5cGU9XCJ1c2VyXCI+PG1hcD48L21hcD48L3Jvb3Q+PC9wcmVmZXJlbmNlcz4iCi0JCQkJCQkuZ2V0Qnl0ZXMoIlVURi04IikpOwotCQlzdHJlYW0gPSBuZXcgTW9ja0lucHV0U3RyZWFtKGluKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAiPCFET0NUWVBFIHByZWZlcmVuY2VzIFNZU1RFTSBcImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3ByZWZlcmVuY2VzLmR0ZFwiPjxwcmVmZXJlbmNlcz48cm9vdCB0eXBlPVwidXNlclwiPjxtYXA+PC9tYXA+PC9yb290PjwvcHJlZmVyZW5jZXM+IgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgc3RyZWFtID0gbmV3IE1vY2tJbnB1dFN0cmVhbShpbik7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlzdHJlYW0uY2xvc2UoKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtTm9kZUZvclBhY2thZ2UoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwID0gUHJlZmVyZW5jZXMuc3lzdGVtTm9kZUZvclBhY2thZ2UoT2JqZWN0LmNsYXNzKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gbWF5IGJlIGNhdXNlZCBieSBhYnNlbmNlIG9mIHByaXZpbGVnZXMgb24gdGhlIHVuZGVybHlpbmcgT1MKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRFcXVhbHMoIi9qYXZhL2xhbmciLCBwLmFic29sdXRlUGF0aCgpKTsKLQkJYXNzZXJ0VHJ1ZShwIGluc3RhbmNlb2YgQWJzdHJhY3RQcmVmZXJlbmNlcyk7Ci0JCVByZWZlcmVuY2VzIHJvb3QgPSBQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCk7Ci0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHJvb3Qubm9kZSgiamF2YSIpOwotCQlhc3NlcnRTYW1lKHBhcmVudCwgcC5wYXJlbnQoKSk7Ci0JCWFzc2VydEZhbHNlKHAuaXNVc2VyTm9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsYW5nIiwgcC5uYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN5c3RlbSBQcmVmZXJlbmNlIE5vZGU6ICIgKyBwLmFic29sdXRlUGF0aCgpLCBwCi0JCQkJLnRvU3RyaW5nKCkpOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKDAsIHAuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3VsZCBiZSB0aHJvd24gYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24KLQkJfQotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKDAsIHAua2V5cygpLmxlbmd0aCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3VsZCBiZSB0aHJvd24gYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24KLQkJfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5c3RlbU5vZGVGb3JQYWNrYWdlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbU5vZGVGb3JQYWNrYWdlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHAgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcCA9IFByZWZlcmVuY2VzLnN5c3RlbU5vZGVGb3JQYWNrYWdlKE9iamVjdC5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG1heSBiZSBjYXVzZWQgYnkgYWJzZW5jZSBvZiBwcml2aWxlZ2VzIG9uIHRoZSB1bmRlcmx5aW5nIE9TCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvamF2YS9sYW5nIiwgcC5hYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGFzc2VydFRydWUocCBpbnN0YW5jZW9mIEFic3RyYWN0UHJlZmVyZW5jZXMpOworICAgICAgICBQcmVmZXJlbmNlcyByb290ID0gUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpOworICAgICAgICBQcmVmZXJlbmNlcyBwYXJlbnQgPSByb290Lm5vZGUoImphdmEiKTsKKyAgICAgICAgYXNzZXJ0U2FtZShwYXJlbnQsIHAucGFyZW50KCkpOworICAgICAgICBhc3NlcnRGYWxzZShwLmlzVXNlck5vZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibGFuZyIsIHAubmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTeXN0ZW0gUHJlZmVyZW5jZSBOb2RlOiAiICsgcC5hYnNvbHV0ZVBhdGgoKSwgcAorICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBwLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGgpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gY291bGQgYmUgdGhyb3duIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBwLmtleXMoKS5sZW5ndGgpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gY291bGQgYmUgdGhyb3duIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uCisgICAgICAgIH0KIAotCQl0cnkgewotCQkJcCA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShudWxsKTsKLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtUm9vdCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBwID0gUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpOwotCQlhc3NlcnRUcnVlKHAgaW5zdGFuY2VvZiBBYnN0cmFjdFByZWZlcmVuY2VzKTsKLQkJYXNzZXJ0RXF1YWxzKCIvIiwgcC5hYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydFNhbWUobnVsbCwgcC5wYXJlbnQoKSk7Ci0JCWFzc2VydEZhbHNlKHAuaXNVc2VyTm9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBwLm5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiU3lzdGVtIFByZWZlcmVuY2UgTm9kZTogIiArIHAuYWJzb2x1dGVQYXRoKCksIHAKLQkJCQkudG9TdHJpbmcoKSk7Ci0JCS8vIGFzc2VydEVxdWFscygwLCBwLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGgpOwotCQkvLyBhc3NlcnRFcXVhbHMoMCwgcC5rZXlzKCkubGVuZ3RoKTsKLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3lzdGVtUm9vdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1Sb290KCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHAgPSBQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCk7CisgICAgICAgIGFzc2VydFRydWUocCBpbnN0YW5jZW9mIEFic3RyYWN0UHJlZmVyZW5jZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi8iLCBwLmFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShudWxsLCBwLnBhcmVudCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocC5pc1VzZXJOb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHAubmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTeXN0ZW0gUHJlZmVyZW5jZSBOb2RlOiAiICsgcC5hYnNvbHV0ZVBhdGgoKSwgcAorICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKDAsIHAuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7CisgICAgICAgIC8vIGFzc2VydEVxdWFscygwLCBwLmtleXMoKS5sZW5ndGgpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHMoKSB7Ci0JCWFzc2VydEVxdWFscyg4MCwgUHJlZmVyZW5jZXMuTUFYX0tFWV9MRU5HVEgpOwotCQlhc3NlcnRFcXVhbHMoODAsIFByZWZlcmVuY2VzLk1BWF9OQU1FX0xFTkdUSCk7Ci0JCWFzc2VydEVxdWFscyg4MTkyLCBQcmVmZXJlbmNlcy5NQVhfVkFMVUVfTEVOR1RIKTsKLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIGNvbnN0YW50IHZhbHVlcyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoODAsIFByZWZlcmVuY2VzLk1BWF9LRVlfTEVOR1RIKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgwLCBQcmVmZXJlbmNlcy5NQVhfTkFNRV9MRU5HVEgpOworICAgICAgICBhc3NlcnRFcXVhbHMoODE5MiwgUHJlZmVyZW5jZXMuTUFYX1ZBTFVFX0xFTkdUSCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFVzZXJOb2RlRm9yUGFja2FnZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBwID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKE9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiL2phdmEvbGFuZyIsIHAuYWJzb2x1dGVQYXRoKCkpOwotCQlhc3NlcnRUcnVlKHAgaW5zdGFuY2VvZiBBYnN0cmFjdFByZWZlcmVuY2VzKTsKLQkJUHJlZmVyZW5jZXMgcm9vdCA9IFByZWZlcmVuY2VzLnVzZXJSb290KCk7Ci0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHJvb3Qubm9kZSgiamF2YSIpOwotCQlhc3NlcnRTYW1lKHBhcmVudCwgcC5wYXJlbnQoKSk7Ci0JCWFzc2VydFRydWUocC5pc1VzZXJOb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoImxhbmciLCBwLm5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVXNlciBQcmVmZXJlbmNlIE5vZGU6ICIgKyBwLmFic29sdXRlUGF0aCgpLCBwLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcC5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHAua2V5cygpLmxlbmd0aCk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXNlck5vZGVGb3JQYWNrYWdlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFVzZXJOb2RlRm9yUGFja2FnZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBQcmVmZXJlbmNlcyBwID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKE9iamVjdC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2phdmEvbGFuZyIsIHAuYWJzb2x1dGVQYXRoKCkpOworICAgICAgICBhc3NlcnRUcnVlKHAgaW5zdGFuY2VvZiBBYnN0cmFjdFByZWZlcmVuY2VzKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgcm9vdCA9IFByZWZlcmVuY2VzLnVzZXJSb290KCk7CisgICAgICAgIFByZWZlcmVuY2VzIHBhcmVudCA9IHJvb3Qubm9kZSgiamF2YSIpOworICAgICAgICBhc3NlcnRTYW1lKHBhcmVudCwgcC5wYXJlbnQoKSk7CisgICAgICAgIGFzc2VydFRydWUocC5pc1VzZXJOb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxhbmciLCBwLm5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVXNlciBQcmVmZXJlbmNlIE5vZGU6ICIgKyBwLmFic29sdXRlUGF0aCgpLCBwLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcC5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHAua2V5cygpLmxlbmd0aCk7CiAKLQkJdHJ5IHsKLQkJCXAgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RVc2VyUm9vdCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBwID0gUHJlZmVyZW5jZXMudXNlclJvb3QoKTsKLQkJYXNzZXJ0VHJ1ZShwIGluc3RhbmNlb2YgQWJzdHJhY3RQcmVmZXJlbmNlcyk7Ci0JCWFzc2VydEVxdWFscygiLyIsIHAuYWJzb2x1dGVQYXRoKCkpOwotCQlhc3NlcnRTYW1lKG51bGwsIHAucGFyZW50KCkpOwotCQlhc3NlcnRUcnVlKHAuaXNVc2VyTm9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBwLm5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVXNlciBQcmVmZXJlbmNlIE5vZGU6ICIgKyBwLmFic29sdXRlUGF0aCgpLCBwLnRvU3RyaW5nKCkpOwotCQkvLyBhc3NlcnRFcXVhbHMoMCwgcC5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoKTsKLQkJLy8gYXNzZXJ0RXF1YWxzKHAua2V5cygpLmxlbmd0aCwgMCk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVzZXJSb290IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFVzZXJSb290KCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHAgPSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpOworICAgICAgICBhc3NlcnRUcnVlKHAgaW5zdGFuY2VvZiBBYnN0cmFjdFByZWZlcmVuY2VzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvIiwgcC5hYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGFzc2VydFNhbWUobnVsbCwgcC5wYXJlbnQoKSk7CisgICAgICAgIGFzc2VydFRydWUocC5pc1VzZXJOb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHAubmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVc2VyIFByZWZlcmVuY2UgTm9kZTogIiArIHAuYWJzb2x1dGVQYXRoKCksIHAudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIGFzc2VydEVxdWFscygwLCBwLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGgpOworICAgICAgICAvLyBhc3NlcnRFcXVhbHMocC5rZXlzKCkubGVuZ3RoLCAwKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0UHJlZmVyZW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBudWxsOwotCQl0cnkgewotCQkJcHJlZnMgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXNUZXN0LmNsYXNzKTsKLQkJCS8vIGFzc2VydEVxdWFscygwLCBwcmVmcy5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoKTsKLQkJCS8vIGFzc2VydEZhbHNlKHByZWZzLm5vZGVFeGlzdHMoIm1vY2svY2hpbGQvZ3JhbmRzb24iKSk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiAmIElPRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnRQcmVmZXJlbmNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEltcG9ydFByZWZlcmVuY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWZzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWZzID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzVGVzdC5jbGFzcyk7CisgICAgICAgICAgICAvLyBhc3NlcnRFcXVhbHMoMCwgcHJlZnMuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7CisgICAgICAgICAgICAvLyBhc3NlcnRGYWxzZShwcmVmcy5ub2RlRXhpc3RzKCJtb2NrL2NoaWxkL2dyYW5kc29uIikpOwogCi0JCQlwcmVmcy5wdXQoInByZWZza2V5IiwgIm9sZHZhbHVlIik7Ci0JCQlwcmVmcy5wdXQoInByZWZza2V5MiIsICJvbGR2YWx1ZTIiKTsKLQkJCWluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvcHJlZnMvamF2YS91dGlsL3ByZWZzL3VzZXJwcmVmcy54bWwiKTsKLQkJCVByZWZlcmVuY2VzLmltcG9ydFByZWZlcmVuY2VzKGluKTsKKyAgICAgICAgICAgIHByZWZzLnB1dCgicHJlZnNrZXkiLCAib2xkdmFsdWUiKTsKKyAgICAgICAgICAgIHByZWZzLnB1dCgicHJlZnNrZXkyIiwgIm9sZHZhbHVlMiIpOworICAgICAgICAgICAgaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi9wcmVmcy9qYXZhL3V0aWwvcHJlZnMvdXNlcnByZWZzLnhtbCIpOworICAgICAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoaW4pOwogCi0JCQlwcmVmcyA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlc1Rlc3QuY2xhc3MpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIHByZWZzLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZShwcmVmcy5ub2RlRXhpc3RzKCJtb2NrL2NoaWxkL2dyYW5kc29uIikpOwotCQkJYXNzZXJ0RXF1YWxzKCJuZXd2YWx1ZSIsIHByZWZzLmdldCgicHJlZnNrZXkiLCBudWxsKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIm9sZHZhbHVlMiIsIHByZWZzLmdldCgicHJlZnNrZXkyIiwgbnVsbCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJuZXd2YWx1ZTMiLCBwcmVmcy5nZXQoInByZWZza2V5MyIsIG51bGwpKTsKKyAgICAgICAgICAgIHByZWZzID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzVGVzdC5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJlZnMuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHByZWZzLm5vZGVFeGlzdHMoIm1vY2svY2hpbGQvZ3JhbmRzb24iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5ld3ZhbHVlIiwgcHJlZnMuZ2V0KCJwcmVmc2tleSIsIG51bGwpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygib2xkdmFsdWUyIiwgcHJlZnMuZ2V0KCJwcmVmc2tleTIiLCBudWxsKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5ld3ZhbHVlMyIsIHByZWZzLmdldCgicHJlZnNrZXkzIiwgbnVsbCkpOwogCi0JCQlpbiA9IFByZWZlcmVuY2VzVGVzdC5jbGFzcwotCQkJCQkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL3ByZWZzL2phdmEvdXRpbC9wcmVmcy91c2VycHJlZnMtYmFkZm9ybS54bWwiKTsKLQkJCXRyeSB7Ci0JCQkJUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoaW4pOwotCQkJCWZhaWwoKTsKLQkJCX0gY2F0Y2ggKEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl9CisgICAgICAgICAgICBpbiA9IFByZWZlcmVuY2VzVGVzdC5jbGFzcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL3ByZWZzL2phdmEvdXRpbC9wcmVmcy91c2VycHJlZnMtYmFkZm9ybS54bWwiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoaW4pOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CiAKLQkJCWluID0gUHJlZmVyZW5jZXNUZXN0LmNsYXNzCi0JCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvcHJlZnMvamF2YS91dGlsL3ByZWZzL3VzZXJwcmVmcy1iYWR0eXBlLnhtbCIpOwotCQkJdHJ5IHsKLQkJCQlQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhpbik7Ci0JCQkJZmFpbCgpOwotCQkJfSBjYXRjaCAoSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCX0KKyAgICAgICAgICAgIGluID0gUHJlZmVyZW5jZXNUZXN0LmNsYXNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvcHJlZnMvamF2YS91dGlsL3ByZWZzL3VzZXJwcmVmcy1iYWR0eXBlLnhtbCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhpbik7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KIAotCS8vCQlpbiA9IFByZWZlcmVuY2VzVGVzdC5jbGFzcwotCS8vCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvcHJlZnMvamF2YS91dGlsL3ByZWZzL3VzZXJwcmVmcy1iYWRlbmNvZGluZy54bWwiKTsKLQkvLwkJdHJ5IHsKLQkvLwkJCVByZWZlcmVuY2VzLmltcG9ydFByZWZlcmVuY2VzKGluKTsKLQkvLwkJCWZhaWwoKTsKLQkvLwkJfSBjYXRjaCAoSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkvLwkJfQorICAgIC8vICAgICAgICBpbiA9IFByZWZlcmVuY2VzVGVzdC5jbGFzcworICAgIC8vICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvcHJlZnMvamF2YS91dGlsL3ByZWZzL3VzZXJwcmVmcy1iYWRlbmNvZGluZy54bWwiKTsKKyAgICAvLyAgICAgICAgdHJ5IHsKKyAgICAvLyAgICAgICAgICAgIFByZWZlcmVuY2VzLmltcG9ydFByZWZlcmVuY2VzKGluKTsKKyAgICAvLyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAvLyAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAvLyAgICAgICAgfQogCi0JCQlpbiA9IFByZWZlcmVuY2VzVGVzdC5jbGFzcwotCQkJCQkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL3ByZWZzL2phdmEvdXRpbC9wcmVmcy91c2VycHJlZnMtaGlnaGVydmVyc2lvbi54bWwiKTsKLQkJCXRyeSB7Ci0JCQkJUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoaW4pOwotCQkJCWZhaWwoKTsKLQkJCX0gY2F0Y2ggKEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl9CisgICAgICAgICAgICBpbiA9IFByZWZlcmVuY2VzVGVzdC5jbGFzcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL3ByZWZzL2phdmEvdXRpbC9wcmVmcy91c2VycHJlZnMtaGlnaGVydmVyc2lvbi54bWwiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoaW4pOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CiAKLQkJCWluID0gUHJlZmVyZW5jZXNUZXN0LmNsYXNzCi0JCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvcHJlZnMvamF2YS91dGlsL3ByZWZzL3VzZXJwcmVmcy1hc2NpaS54bWwiKTsKLQkJCVByZWZlcmVuY2VzLmltcG9ydFByZWZlcmVuY2VzKGluKTsKLQkJCXByZWZzID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzVGVzdC5jbGFzcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXByZWZzID0gUHJlZmVyZW5jZXMudXNlclJvb3QoKS5ub2RlKCJ0ZXN0cyIpOwotCQkJCXByZWZzLnJlbW92ZU5vZGUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBpbiA9IFByZWZlcmVuY2VzVGVzdC5jbGFzcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL3ByZWZzL2phdmEvdXRpbC9wcmVmcy91c2VycHJlZnMtYXNjaWkueG1sIik7CisgICAgICAgICAgICBQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhpbik7CisgICAgICAgICAgICBwcmVmcyA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlc1Rlc3QuY2xhc3MpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcmVmcyA9IFByZWZlcmVuY2VzLnVzZXJSb290KCkubm9kZSgidGVzdHMiKTsKKyAgICAgICAgICAgICAgICBwcmVmcy5yZW1vdmVOb2RlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydFByZWZlcmVuY2VzRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBmb3IgRXhjZXB0aW9ucyBvbmx5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydFByZWZlcmVuY2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRQcmVmZXJlbmNlc0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlieXRlW10gc291cmNlID0gbmV3IGJ5dGVbMF07Ci0JCUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCXRyeSB7Ci0JCQlQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhpbik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAgICAgYnl0ZVtdIHNvdXJjZSA9IG5ldyBieXRlWzBdOworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzb3VyY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoaW4pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJc3RyZWFtLnNldFJlc3VsdChNb2NrSW5wdXRTdHJlYW0uZXhjZXB0aW9uKTsKLQkJdHJ5IHsKLQkJCVByZWZlcmVuY2VzLmltcG9ydFByZWZlcmVuY2VzKHN0cmVhbSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICBzdHJlYW0uc2V0UmVzdWx0KE1vY2tJbnB1dFN0cmVhbS5leGNlcHRpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoc3RyZWFtKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJc3RyZWFtLnNldFJlc3VsdChNb2NrSW5wdXRTdHJlYW0ucnVudGltZUV4Y2VwdGlvbik7Ci0JCXRyeSB7Ci0JCQlQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhzdHJlYW0pOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgc3RyZWFtLnNldFJlc3VsdChNb2NrSW5wdXRTdHJlYW0ucnVudGltZUV4Y2VwdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhzdHJlYW0pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RTZWN1cml0eSgpIHRocm93cyBJbnZhbGlkUHJlZmVyZW5jZXNGb3JtYXRFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltYW5hZ2VyLmluc3RhbGwoKTsKLQkJCXRyeSB7Ci0JCQkJUHJlZmVyZW5jZXMudXNlclJvb3QoKTsKLQkJCQlmYWlsKCk7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVByZWZlcmVuY2VzLnN5c3RlbVJvb3QoKTsKLQkJCQlmYWlsKCk7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShudWxsKTsKLQkJCQlmYWlsKCk7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1c2VyUm9vdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3lzdGVtUm9vdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXNlck5vZGVGb3JQYWNrYWdlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DbGFzcy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzeXN0ZW1Ob2RlRm9yUGFja2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2xhc3MuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wb3J0UHJlZmVyZW5jZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFNlY3VyaXR5KCkgdGhyb3dzIEludmFsaWRQcmVmZXJlbmNlc0Zvcm1hdEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZXIuaW5zdGFsbCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcmVmZXJlbmNlcy51c2VyUm9vdCgpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KIAotCQkJdHJ5IHsKLQkJCQlQcmVmZXJlbmNlcy5zeXN0ZW1Ob2RlRm9yUGFja2FnZShudWxsKTsKLQkJCQlmYWlsKCk7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByZWZlcmVuY2VzLnN5c3RlbU5vZGVGb3JQYWNrYWdlKG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KIAotCQkJdHJ5IHsKLQkJCQlQcmVmZXJlbmNlcy5pbXBvcnRQcmVmZXJlbmNlcyhzdHJlYW0pOwotCQkJCWZhaWwoKTsKLQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1hbmFnZXIucmVzdG9yZURlZmF1bHQoKTsKLQkJfQotCX0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMuaW1wb3J0UHJlZmVyZW5jZXMoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtYW5hZ2VyLnJlc3RvcmVEZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNZXRob2RzKCkgewotCQlQcmVmZXJlbmNlcyBwID0gbmV3IE1vY2tQcmVmZXJlbmNlcygpOwotCQlwLmFic29sdXRlUGF0aCgpOwotCQl0cnkgewotCQkJcC5jaGlsZHJlbk5hbWVzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlNCkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmNsZWFyKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlNSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmV4cG9ydE5vZGUobnVsbCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGU2KSB7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlNikgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmV4cG9ydFN1YnRyZWUobnVsbCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGU3KSB7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlNykgewotCQl9Ci0JCXRyeSB7Ci0JCQlwLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlOCkgewotCQl9Ci0JCXAuZ2V0KG51bGwsIG51bGwpOwotCQlwLmdldEJvb2xlYW4obnVsbCwgZmFsc2UpOwotCQlwLmdldEJ5dGVBcnJheShudWxsLCBudWxsKTsKLQkJcC5nZXRGbG9hdChudWxsLCAwLjFmKTsKLQkJcC5nZXREb3VibGUobnVsbCwgMC4xKTsKLQkJcC5nZXRJbnQobnVsbCwgMSk7Ci0JCXAuZ2V0TG9uZyhudWxsLCAxbCk7Ci0JCXAuaXNVc2VyTm9kZSgpOwotCQl0cnkgewotCQkJcC5rZXlzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcC5uYW1lKCk7Ci0JCXAubm9kZShudWxsKTsKLQkJdHJ5IHsKLQkJCXAubm9kZUV4aXN0cyhudWxsKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUxKSB7Ci0JCX0KLQkJcC5wYXJlbnQoKTsKLQkJcC5wdXQobnVsbCwgbnVsbCk7Ci0JCXAucHV0Qm9vbGVhbihudWxsLCBmYWxzZSk7Ci0JCXAucHV0Qnl0ZUFycmF5KG51bGwsIG51bGwpOwotCQlwLnB1dERvdWJsZShudWxsLCAxKTsKLQkJcC5wdXRGbG9hdChudWxsLCAxZik7Ci0JCXAucHV0SW50KG51bGwsIDEpOwotCQlwLnB1dExvbmcobnVsbCwgMWwpOwotCQlwLnJlbW92ZShudWxsKTsKLQkJdHJ5IHsKLQkJCXAucmVtb3ZlTm9kZSgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTIpIHsKLQkJfQotCQlwLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJcC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCXAucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG51bGwpOwotCQlwLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJdHJ5IHsKLQkJCXAuc3luYygpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTMpIHsKLQkJfQotCQlwLnRvU3RyaW5nKCk7Ci0JfQorQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlRlc3QgZm9yIGFic3RyYWN0IG1ldGhvZHMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWJzb2x1dGVQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGlsZHJlbk5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhwb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleHBvcnRTdWJ0cmVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZsdXNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVXNlck5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub2RlRXhpc3RzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0Qnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKSwgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICksIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBsb25nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZE5vZGVDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN5bmMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLCBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TWV0aG9kcygpIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgcCA9IG5ldyBNb2NrUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgcC5hYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY2hpbGRyZW5OYW1lcygpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5leHBvcnROb2RlKG51bGwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlNikgeworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTYpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5leHBvcnRTdWJ0cmVlKG51bGwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlNykgeworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTcpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZTgpIHsKKyAgICAgICAgfQorICAgICAgICBwLmdldChudWxsLCBudWxsKTsKKyAgICAgICAgcC5nZXRCb29sZWFuKG51bGwsIGZhbHNlKTsKKyAgICAgICAgcC5nZXRCeXRlQXJyYXkobnVsbCwgbnVsbCk7CisgICAgICAgIHAuZ2V0RmxvYXQobnVsbCwgMC4xZik7CisgICAgICAgIHAuZ2V0RG91YmxlKG51bGwsIDAuMSk7CisgICAgICAgIHAuZ2V0SW50KG51bGwsIDEpOworICAgICAgICBwLmdldExvbmcobnVsbCwgMWwpOworICAgICAgICBwLmlzVXNlck5vZGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAua2V5cygpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHAubmFtZSgpOworICAgICAgICBwLm5vZGUobnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLm5vZGVFeGlzdHMobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlMSkgeworICAgICAgICB9CisgICAgICAgIHAucGFyZW50KCk7CisgICAgICAgIHAucHV0KG51bGwsIG51bGwpOworICAgICAgICBwLnB1dEJvb2xlYW4obnVsbCwgZmFsc2UpOworICAgICAgICBwLnB1dEJ5dGVBcnJheShudWxsLCBudWxsKTsKKyAgICAgICAgcC5wdXREb3VibGUobnVsbCwgMSk7CisgICAgICAgIHAucHV0RmxvYXQobnVsbCwgMWYpOworICAgICAgICBwLnB1dEludChudWxsLCAxKTsKKyAgICAgICAgcC5wdXRMb25nKG51bGwsIDFsKTsKKyAgICAgICAgcC5yZW1vdmUobnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIH0KKyAgICAgICAgcC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgIHAuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG51bGwpOworICAgICAgICBwLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgcC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUzKSB7CisgICAgICAgIH0KKyAgICAgICAgcC50b1N0cmluZygpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLQkJTW9ja1ByZWZlcmVuY2VzIG1wID0gbmV3IE1vY2tQcmVmZXJlbmNlcygpOwotCQlhc3NlcnRFcXVhbHMobXAuZ2V0Q2xhc3MoKSwgTW9ja1ByZWZlcmVuY2VzLmNsYXNzKTsKLQl9CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJlZmVyZW5jZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIE1vY2tQcmVmZXJlbmNlcyBtcCA9IG5ldyBNb2NrUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1wLmdldENsYXNzKCksIE1vY2tQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlQcmVmZXJlbmNlcyBwMSA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwocDEudG9TdHJpbmcoKSk7CitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2sgZXhpc3RlZCBpbXBsZW1lbnRhdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBQcmVmZXJlbmNlcyBwMSA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwocDEudG9TdHJpbmcoKSk7CiAKLQkJUHJlZmVyZW5jZXMgcDIgPSBQcmVmZXJlbmNlcy5zeXN0ZW1Sb290KCk7Ci0JCWFzc2VydE5vdE51bGwocDIudG9TdHJpbmcoKSk7CisgICAgICAgIFByZWZlcmVuY2VzIHAyID0gUHJlZmVyZW5jZXMuc3lzdGVtUm9vdCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHAyLnRvU3RyaW5nKCkpOwogCi0JCVByZWZlcmVuY2VzIHAzID0gUHJlZmVyZW5jZXMudXNlclJvb3QoKTsKLQkJYXNzZXJ0Tm90TnVsbChwMy50b1N0cmluZygpKTsKLQl9Ci0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2Fic29sdXRlUGF0aCgpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVQYXRoKCkgewotCQlQcmVmZXJlbmNlcyBwID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCIvamF2YS91dGlsL3ByZWZzIiwgcC5hYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIFByZWZlcmVuY2VzIHAzID0gUHJlZmVyZW5jZXMudXNlclJvb3QoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwMy50b1N0cmluZygpKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2Fic29sdXRlUGF0aCgpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhYnNvbHV0ZVBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVQYXRoKCkgeworICAgICAgICBQcmVmZXJlbmNlcyBwID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvamF2YS91dGlsL3ByZWZzIiwgcC5hYnNvbHV0ZVBhdGgoKSk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2NoaWxkcmVuTmFtZXMoKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuTmFtZXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2NoaWxkcmVuTmFtZXMoKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoaWxkcmVuTmFtZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5OYW1lcygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKIAotCQlQcmVmZXJlbmNlcyBjaGlsZDEgPSBwcmVmLm5vZGUoImNoaWxkMSIpOworICAgICAgICBQcmVmZXJlbmNlcyBjaGlsZDEgPSBwcmVmLm5vZGUoImNoaWxkMSIpOwogCi0JCXByZWYubm9kZSgiY2hpbGQyIik7Ci0JCXByZWYubm9kZSgiY2hpbGQzIik7Ci0JCWNoaWxkMS5ub2RlKCJzdWJjaGlsZDEiKTsKKyAgICAgICAgcHJlZi5ub2RlKCJjaGlsZDIiKTsKKyAgICAgICAgcHJlZi5ub2RlKCJjaGlsZDMiKTsKKyAgICAgICAgY2hpbGQxLm5vZGUoInN1YmNoaWxkMSIpOwogCi0JCWFzc2VydFNhbWUocHJlZiwgY2hpbGQxLnBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHByZWYuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiY2hpbGQxIiwgcHJlZi5jaGlsZHJlbk5hbWVzKClbMF0pOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGQxLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoInN1YmNoaWxkMSIsIGNoaWxkMS5jaGlsZHJlbk5hbWVzKClbMF0pOwotCX0KKyAgICAgICAgYXNzZXJ0U2FtZShwcmVmLCBjaGlsZDEucGFyZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcHJlZi5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZDEiLCBwcmVmLmNoaWxkcmVuTmFtZXMoKVswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjaGlsZDEuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViY2hpbGQxIiwgY2hpbGQxLmNoaWxkcmVuTmFtZXMoKVswXSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2NsZWFyKCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKLQkJcHJlZi5wdXQoInRlc3RDbGVhcktleSIsICJ0ZXN0Q2xlYXJWYWx1ZSIpOwotCQlwcmVmLnB1dCgidGVzdENsZWFyS2V5MSIsICJ0ZXN0Q2xlYXJWYWx1ZTEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Q2xlYXJWYWx1ZSIsIHByZWYuZ2V0KCJ0ZXN0Q2xlYXJLZXkiLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdENsZWFyVmFsdWUxIiwgcHJlZi5nZXQoInRlc3RDbGVhcktleTEiLCBudWxsKSk7Ci0JCXByZWYuY2xlYXIoKTsKLQkJYXNzZXJ0TnVsbChwcmVmLmdldCgidGVzdENsZWFyS2V5IiwgbnVsbCkpOwotCQlhc3NlcnROdWxsKHByZWYuZ2V0KCJ0ZXN0Q2xlYXJLZXkxIiwgbnVsbCkpOwotCX0JCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2NsZWFyKCkKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgcHJlZi5wdXQoInRlc3RDbGVhcktleSIsICJ0ZXN0Q2xlYXJWYWx1ZSIpOworICAgICAgICBwcmVmLnB1dCgidGVzdENsZWFyS2V5MSIsICJ0ZXN0Q2xlYXJWYWx1ZTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Q2xlYXJWYWx1ZSIsIHByZWYuZ2V0KCJ0ZXN0Q2xlYXJLZXkiLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdENsZWFyVmFsdWUxIiwgcHJlZi5nZXQoInRlc3RDbGVhcktleTEiLCBudWxsKSk7CisgICAgICAgIHByZWYuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwcmVmLmdldCgidGVzdENsZWFyS2V5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKHByZWYuZ2V0KCJ0ZXN0Q2xlYXJLZXkxIiwgbnVsbCkpOworICAgIH0gICAgCiAKLQkvKioKLQkgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjZ2V0KFN0cmluZyBrZXksIFN0cmluZyBkZWYpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VzIHJvb3QgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQlQcmVmZXJlbmNlcyBwcmVmID0gcm9vdC5ub2RlKCJtb2NrIik7Ci0JCWFzc2VydE51bGwocHJlZi5nZXQoIiIsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZWZhdWx0IiwgcHJlZi5nZXQoImtleSIsICJkZWZhdWx0IikpOwotCQlhc3NlcnROdWxsKHByZWYuZ2V0KCJrZXkiLCBudWxsKSk7Ci0JCXByZWYucHV0KCJ0ZXN0R2V0a2V5IiwgInZhbHVlIik7Ci0JCWFzc2VydE51bGwocHJlZi5nZXQoInRlc3RHZXRLZXkiLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUiLCBwcmVmLmdldCgidGVzdEdldGtleSIsIG51bGwpKTsKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjZ2V0KFN0cmluZyBrZXksIFN0cmluZyBkZWYpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBQcmVmZXJlbmNlcyByb290ID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZiA9IHJvb3Qubm9kZSgibW9jayIpOworICAgICAgICBhc3NlcnROdWxsKHByZWYuZ2V0KCIiLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCIsIHByZWYuZ2V0KCJrZXkiLCAiZGVmYXVsdCIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwcmVmLmdldCgia2V5IiwgbnVsbCkpOworICAgICAgICBwcmVmLnB1dCgidGVzdEdldGtleSIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnROdWxsKHByZWYuZ2V0KCJ0ZXN0R2V0S2V5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcHJlZi5nZXQoInRlc3RHZXRrZXkiLCBudWxsKSk7CiAKLQkJdHJ5IHsKLQkJCXByZWYuZ2V0KG51bGwsICJhYmMiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYuZ2V0KCIiLCAiYWJjIik7Ci0JCXByZWYuZ2V0KCJrZXkiLCBudWxsKTsKLQkJcHJlZi5nZXQoImtleSIsICIiKTsKLQkJcHJlZi5wdXRGbG9hdCgiZmxvYXRLZXkiLCAxLjBmKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBwcmVmLmdldCgiZmxvYXRLZXkiLCBudWxsKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmdldChudWxsLCAiYWJjIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLmdldCgiIiwgImFiYyIpOworICAgICAgICBwcmVmLmdldCgia2V5IiwgbnVsbCk7CisgICAgICAgIHByZWYuZ2V0KCJrZXkiLCAiIik7CisgICAgICAgIHByZWYucHV0RmxvYXQoImZsb2F0S2V5IiwgMS4wZik7CisgICAgICAgIGFzc2VydEVxdWFscygiMS4wIiwgcHJlZi5nZXQoImZsb2F0S2V5IiwgbnVsbCkpOwogCi0JCXByZWYucmVtb3ZlTm9kZSgpOwotCQl0cnkgewotCQkJcHJlZi5nZXQoImtleSIsICJhYmMiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5nZXQobnVsbCwgImFiYyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgICAgIHByZWYucmVtb3ZlTm9kZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXQoImtleSIsICJhYmMiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXQobnVsbCwgImFiYyIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjZ2V0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIGRlZikKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKLQkJdHJ5IHsKLQkJCXByZWYuZ2V0Qm9vbGVhbihudWxsLCBmYWxzZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW4oKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXRCb29sZWFuKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJcHJlZi5wdXQoInRlc3RHZXRCb29sZWFuS2V5IiwgImZhbHNlIik7Ci0JCXByZWYucHV0KCJ0ZXN0R2V0Qm9vbGVhbktleTIiLCAidmFsdWUiKTsKLQkJYXNzZXJ0RmFsc2UocHJlZi5nZXRCb29sZWFuKCJ0ZXN0R2V0Qm9vbGVhbktleSIsIHRydWUpKTsKLQkJYXNzZXJ0VHJ1ZShwcmVmLmdldEJvb2xlYW4oInRlc3RHZXRCb29sZWFuS2V5MiIsIHRydWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2dldEJ5dGVBcnJheShTdHJpbmcga2V5LCBieXRlW10gZGVmKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldEJ5dGVBcnJheSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldEJ5dGVBcnJheShudWxsLCBuZXcgYnl0ZVswXSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlieXRlW10gYjY0QXJyYXkgPSBuZXcgYnl0ZVtdIHsgMHg1OSwgMHg1NywgMHg0YSwgMHg2YSB9Oy8vIEJBU0U2NAorICAgICAgICBwcmVmLnB1dCgidGVzdEdldEJvb2xlYW5LZXkiLCAiZmFsc2UiKTsKKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXRCb29sZWFuS2V5MiIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRGYWxzZShwcmVmLmdldEJvb2xlYW4oInRlc3RHZXRCb29sZWFuS2V5IiwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYuZ2V0Qm9vbGVhbigidGVzdEdldEJvb2xlYW5LZXkyIiwgdHJ1ZSkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjZ2V0Qnl0ZUFycmF5KFN0cmluZyBrZXksIGJ5dGVbXSBkZWYpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQsIGJ1dCBtZXRob2QgaXMgYWJzdHJhY3QsIHByb2JhYmx5IGl0IGlzIE9LIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Qnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVBcnJheSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmdldEJ5dGVBcnJheShudWxsLCBuZXcgYnl0ZVswXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gYjY0QXJyYXkgPSBuZXcgYnl0ZVtdIHsgMHg1OSwgMHg1NywgMHg0YSwgMHg2YSB9Oy8vIEJBU0U2NAogCi0JCXByZWYucHV0KCJ0ZXN0R2V0Qnl0ZUFycmF5S2V5IiwgImFiYz0iKTsKLQkJcHJlZi5wdXQoInRlc3RHZXRCeXRlQXJyYXlLZXkyIiwgbmV3IFN0cmluZyhiNjRBcnJheSkpOwotCQlwcmVmLnB1dCgiaW52YWxpZEtleSIsICI8Pj8iKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10geyAxMDUsIC03MyB9LCBwcmVmLmdldEJ5dGVBcnJheSgKLQkJCQkidGVzdEdldEJ5dGVBcnJheUtleSIsIG5ldyBieXRlWzBdKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7ICdhJywgJ2InLCAnYycgfSwgcHJlZgotCQkJCS5nZXRCeXRlQXJyYXkoInRlc3RHZXRCeXRlQXJyYXlLZXkyIiwgbmV3IGJ5dGVbMF0pKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVswXSwgcHJlZi5nZXRCeXRlQXJyYXkoImludmFsaWRLZXkiLAotCQkJCW5ldyBieXRlWzBdKSkpOworICAgICAgICBwcmVmLnB1dCgidGVzdEdldEJ5dGVBcnJheUtleSIsICJhYmM9Iik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0Qnl0ZUFycmF5S2V5MiIsIG5ldyBTdHJpbmcoYjY0QXJyYXkpKTsKKyAgICAgICAgcHJlZi5wdXQoImludmFsaWRLZXkiLCAiPD4/Iik7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHsgMTA1LCAtNzMgfSwgcHJlZi5nZXRCeXRlQXJyYXkoCisgICAgICAgICAgICAgICAgInRlc3RHZXRCeXRlQXJyYXlLZXkiLCBuZXcgYnl0ZVswXSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10geyAnYScsICdiJywgJ2MnIH0sIHByZWYKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZUFycmF5KCJ0ZXN0R2V0Qnl0ZUFycmF5S2V5MiIsIG5ldyBieXRlWzBdKSkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbMF0sIHByZWYuZ2V0Qnl0ZUFycmF5KCJpbnZhbGlkS2V5IiwKKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVswXSkpKTsKIAotCQlwcmVmLnB1dEJ5dGVBcnJheSgidGVzdEdldEJ5dGVBcnJheUtleTMiLCBiNjRBcnJheSk7Ci0JCXByZWYucHV0Qnl0ZUFycmF5KCJ0ZXN0R2V0Qnl0ZUFycmF5S2V5NCIsICJhYmMiLmdldEJ5dGVzKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYjY0QXJyYXksIHByZWYuZ2V0Qnl0ZUFycmF5KAotCQkJCSJ0ZXN0R2V0Qnl0ZUFycmF5S2V5MyIsIG5ldyBieXRlWzBdKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoImFiYyIuZ2V0Qnl0ZXMoKSwgcHJlZi5nZXRCeXRlQXJyYXkoCi0JCQkJInRlc3RHZXRCeXRlQXJyYXlLZXk0IiwgbmV3IGJ5dGVbMF0pKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNnZXREb3VibGUoU3RyaW5nIGtleSwgZG91YmxlIGRlZikKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQl0cnkgewotCQkJcHJlZi5nZXREb3VibGUobnVsbCwgMCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICBwcmVmLnB1dEJ5dGVBcnJheSgidGVzdEdldEJ5dGVBcnJheUtleTMiLCBiNjRBcnJheSk7CisgICAgICAgIHByZWYucHV0Qnl0ZUFycmF5KCJ0ZXN0R2V0Qnl0ZUFycmF5S2V5NCIsICJhYmMiLmdldEJ5dGVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYjY0QXJyYXksIHByZWYuZ2V0Qnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICJ0ZXN0R2V0Qnl0ZUFycmF5S2V5MyIsIG5ldyBieXRlWzBdKSkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoImFiYyIuZ2V0Qnl0ZXMoKSwgcHJlZi5nZXRCeXRlQXJyYXkoCisgICAgICAgICAgICAgICAgInRlc3RHZXRCeXRlQXJyYXlLZXk0IiwgbmV3IGJ5dGVbMF0pKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNnZXREb3VibGUoU3RyaW5nIGtleSwgZG91YmxlIGRlZikKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlKCkgeworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0RG91YmxlKG51bGwsIDApOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlwcmVmLnB1dCgidGVzdEdldERvdWJsZUtleSIsICIxIik7Ci0JCXByZWYucHV0KCJ0ZXN0R2V0RG91YmxlS2V5MiIsICJ2YWx1ZSIpOwotCQlwcmVmLnB1dERvdWJsZSgidGVzdEdldERvdWJsZUtleTMiLCAxKTsKLQkJcHJlZi5wdXRJbnQoInRlc3RHZXREb3VibGVLZXk0IiwgMSk7Ci0JCWFzc2VydEVxdWFscygxLjAsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0R2V0RG91YmxlS2V5IiwgMC4wKSwgMCk7Ci0JCWFzc2VydEVxdWFscygwLjAsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0R2V0RG91YmxlS2V5MiIsIDAuMCksIDApOwotCQlhc3NlcnRFcXVhbHMoMS4wLCBwcmVmLmdldERvdWJsZSgidGVzdEdldERvdWJsZUtleTMiLCAwLjApLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKDEuMCwgcHJlZi5nZXREb3VibGUoInRlc3RHZXREb3VibGVLZXk0IiwgMC4wKSwgMCk7Ci0JfQorICAgICAgICBwcmVmLnB1dCgidGVzdEdldERvdWJsZUtleSIsICIxIik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0RG91YmxlS2V5MiIsICJ2YWx1ZSIpOworICAgICAgICBwcmVmLnB1dERvdWJsZSgidGVzdEdldERvdWJsZUtleTMiLCAxKTsKKyAgICAgICAgcHJlZi5wdXRJbnQoInRlc3RHZXREb3VibGVLZXk0IiwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjAsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0R2V0RG91YmxlS2V5IiwgMC4wKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0R2V0RG91YmxlS2V5MiIsIDAuMCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCBwcmVmLmdldERvdWJsZSgidGVzdEdldERvdWJsZUtleTMiLCAwLjApLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcHJlZi5nZXREb3VibGUoInRlc3RHZXREb3VibGVLZXk0IiwgMC4wKSwgMCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2dldEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IGRlZikKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRGbG9hdCgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldEZsb2F0KG51bGwsIDBmKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0KCJ0ZXN0R2V0RmxvYXRLZXkiLCAiMSIpOwotCQlwcmVmLnB1dCgidGVzdEdldEZsb2F0S2V5MiIsICJ2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHMoMWYsIHByZWYuZ2V0RmxvYXQoInRlc3RHZXRGbG9hdEtleSIsIDBmKSwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDBmLCBwcmVmLmdldEZsb2F0KCJ0ZXN0R2V0RmxvYXRLZXkyIiwgMGYpLCAwKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2dldEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IGRlZikKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGbG9hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBmbG9hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0KCkgeworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0RmxvYXQobnVsbCwgMGYpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXQoInRlc3RHZXRGbG9hdEtleSIsICIxIik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0RmxvYXRLZXkyIiwgInZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscygxZiwgcHJlZi5nZXRGbG9hdCgidGVzdEdldEZsb2F0S2V5IiwgMGYpLCAwKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBhc3NlcnRFcXVhbHMoMGYsIHByZWYuZ2V0RmxvYXQoInRlc3RHZXRGbG9hdEtleTIiLCAwZiksIDApOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZikKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQl0cnkgewotCQkJcHJlZi5nZXRJbnQobnVsbCwgMCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZikKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgeworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYuZ2V0SW50KG51bGwsIDApOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlwcmVmLnB1dCgidGVzdEdldEludEtleSIsICIxIik7Ci0JCXByZWYucHV0KCJ0ZXN0R2V0SW50S2V5MiIsICJ2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgcHJlZi5nZXRJbnQoInRlc3RHZXRJbnRLZXkiLCAwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwcmVmLmdldEludCgidGVzdEdldEludEtleTIiLCAwKSk7Ci0JfQorICAgICAgICBwcmVmLnB1dCgidGVzdEdldEludEtleSIsICIxIik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0SW50S2V5MiIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJlZi5nZXRJbnQoInRlc3RHZXRJbnRLZXkiLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwcmVmLmdldEludCgidGVzdEdldEludEtleTIiLCAwKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2dldExvbmcoU3RyaW5nIGtleSwgbG9uZyBkZWYpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TG9uZygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLmdldExvbmcobnVsbCwgMCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNnZXRMb25nKFN0cmluZyBrZXksIGxvbmcgZGVmKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmcoKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5nZXRMb25nKG51bGwsIDApOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlwcmVmLnB1dCgidGVzdEdldExvbmdLZXkiLCAiMSIpOwotCQlwcmVmLnB1dCgidGVzdEdldExvbmdLZXkyIiwgInZhbHVlIik7Ci0JCWFzc2VydEVxdWFscygxLCBwcmVmLmdldEludCgidGVzdEdldExvbmdLZXkiLCAwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwcmVmLmdldEludCgidGVzdEdldExvbmdLZXkyIiwgMCkpOwotCX0KLQkKLQkvKioKLQkgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjaXNVc2VyTm9kZSgpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNVc2VyTm9kZSgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZjEgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQlhc3NlcnRUcnVlKHByZWYxLmlzVXNlck5vZGUoKSk7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0TG9uZ0tleSIsICIxIik7CisgICAgICAgIHByZWYucHV0KCJ0ZXN0R2V0TG9uZ0tleTIiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByZWYuZ2V0SW50KCJ0ZXN0R2V0TG9uZ0tleSIsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHByZWYuZ2V0SW50KCJ0ZXN0R2V0TG9uZ0tleTIiLCAwKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNpc1VzZXJOb2RlKCkKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVXNlck5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNVc2VyTm9kZSgpIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZjEgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYxLmlzVXNlck5vZGUoKSk7CiAKLQkJUHJlZmVyZW5jZXMgcHJlZjIgPSBQcmVmZXJlbmNlcy5zeXN0ZW1Ob2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKHByZWYyLmlzVXNlck5vZGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNrZXlzKCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RLZXlzKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQlwcmVmLmNsZWFyKCk7Ci0JCQotCQlwcmVmLnB1dCgia2V5MCIsICJ2YWx1ZSIpOwotCQlwcmVmLnB1dCgia2V5MSIsICJ2YWx1ZTEiKTsKLQkJcHJlZi5wdXQoImtleTIiLCAidmFsdWUyIik7Ci0JCXByZWYucHV0KCJrZXkzIiwgInZhbHVlMyIpOworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmMiA9IFByZWZlcmVuY2VzLnN5c3RlbU5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJlZjIuaXNVc2VyTm9kZSgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2tleXMoKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJrZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEtleXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIHByZWYuY2xlYXIoKTsKKyAgICAgICAgCisgICAgICAgIHByZWYucHV0KCJrZXkwIiwgInZhbHVlIik7CisgICAgICAgIHByZWYucHV0KCJrZXkxIiwgInZhbHVlMSIpOworICAgICAgICBwcmVmLnB1dCgia2V5MiIsICJ2YWx1ZTIiKTsKKyAgICAgICAgcHJlZi5wdXQoImtleTMiLCAidmFsdWUzIik7CiAKLQkJU3RyaW5nW10ga2V5cyA9IHByZWYua2V5cygpOwotCQlhc3NlcnRFcXVhbHMoNCwga2V5cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygwLCBrZXlzW2ldLmluZGV4T2YoImtleSIpKTsKLQkJCWFzc2VydEVxdWFscyg0LCBrZXlzW2ldLmxlbmd0aCgpKTsKLQkJfQotCX0KKyAgICAgICAgU3RyaW5nW10ga2V5cyA9IHByZWYua2V5cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwga2V5cy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBrZXlzW2ldLmluZGV4T2YoImtleSIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCBrZXlzW2ldLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNuYW1lKCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKLQkJUHJlZmVyZW5jZXMgY2hpbGQgPSBwcmVmLm5vZGUoIm1vY2siKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2NrIiwgY2hpbGQubmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI25vZGUoU3RyaW5nIHBhdGhOYW1lKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5vZGUoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKFByZWZlcmVuY2VzLk1BWF9OQU1FX0xFTkdUSCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUHJlZmVyZW5jZXMuTUFYX05BTUVfTEVOR1RIOyBpKyspIHsKLQkJCW5hbWUuYXBwZW5kKCdhJyk7Ci0JCX0KLQkJU3RyaW5nIGxvbmdOYW1lID0gbmFtZS50b1N0cmluZygpOwotCQkKLQkJUHJlZmVyZW5jZXMgcm9vdCA9IFByZWZlcmVuY2VzLnVzZXJSb290KCk7Ci0JCVByZWZlcmVuY2VzIHBhcmVudCA9IFByZWZlcmVuY2VzCi0JCQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBwYXJlbnQubm9kZSgibW9jayIpOwotCQkKLQkJdHJ5IHsKLQkJCXByZWYubm9kZShudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLm5vZGUoIi9qYXZhL3V0aWwvcHJlZnMvIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYubm9kZSgiL2phdmEvL3V0aWwvcHJlZnMiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5ub2RlKGxvbmdOYW1lICsgImEiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlhc3NlcnROb3ROdWxsKHByZWYubm9kZShsb25nTmFtZSkpOworICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNuYW1lKCkKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkID0gcHJlZi5ub2RlKCJtb2NrIik7CisgICAgICAgIGFzc2VydEVxdWFscygibW9jayIsIGNoaWxkLm5hbWUoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNub2RlKFN0cmluZyBwYXRoTmFtZSkKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBuYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihQcmVmZXJlbmNlcy5NQVhfTkFNRV9MRU5HVEgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFByZWZlcmVuY2VzLk1BWF9OQU1FX0xFTkdUSDsgaSsrKSB7CisgICAgICAgICAgICBuYW1lLmFwcGVuZCgnYScpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBsb25nTmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgCisgICAgICAgIFByZWZlcmVuY2VzIHJvb3QgPSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpOworICAgICAgICBQcmVmZXJlbmNlcyBwYXJlbnQgPSBQcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIC51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gcGFyZW50Lm5vZGUoIm1vY2siKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLm5vZGUobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5ub2RlKCIvamF2YS91dGlsL3ByZWZzLyIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLm5vZGUoIi9qYXZhLy91dGlsL3ByZWZzIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYubm9kZShsb25nTmFtZSArICJhIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcmVmLm5vZGUobG9uZ05hbWUpKTsKIAotCQlhc3NlcnRTYW1lKHJvb3QsIHByZWYubm9kZSgiLyIpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShyb290LCBwcmVmLm5vZGUoIi8iKSk7CiAKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBwcmVmLm5vZGUoIi9qYXZhL3V0aWwvcHJlZnMiKTsKLQkJYXNzZXJ0U2FtZShwcmVmcywgcGFyZW50KTsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZnMgPSBwcmVmLm5vZGUoIi9qYXZhL3V0aWwvcHJlZnMiKTsKKyAgICAgICAgYXNzZXJ0U2FtZShwcmVmcywgcGFyZW50KTsKIAotCQlhc3NlcnRTYW1lKHByZWYsIHByZWYubm9kZSgiIikpOworICAgICAgICBhc3NlcnRTYW1lKHByZWYsIHByZWYubm9kZSgiIikpOwogCi0JCWlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjaGlsZCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgKChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZikKLQkJCQkucHVibGljQ2hpbGRTcGkoImNoaWxkIik7Ci0JCWFzc2VydFNhbWUoY2hpbGQsIHByZWYubm9kZSgiY2hpbGQiKSk7CisgICAgICAgIGlmICghKHByZWYgaW5zdGFuY2VvZiBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcyBjaGlsZCA9IChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgKChNb2NrQWJzdHJhY3RQcmVmZXJlbmNlcykgcHJlZikKKyAgICAgICAgICAgICAgICAucHVibGljQ2hpbGRTcGkoImNoaWxkIik7CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQsIHByZWYubm9kZSgiY2hpbGQiKSk7CiAKLQkJUHJlZmVyZW5jZXMgY2hpbGQyID0gcHJlZi5ub2RlKCJjaGlsZDIiKTsKLQkJYXNzZXJ0U2FtZShjaGlsZDIsICgoTW9ja0Fic3RyYWN0UHJlZmVyZW5jZXMpIHByZWYpCi0JCQkJLnB1YmxpY0NoaWxkU3BpKCJjaGlsZDIiKSk7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMiA9IHByZWYubm9kZSgiY2hpbGQyIik7CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQyLCAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQorICAgICAgICAgICAgICAgIC5wdWJsaWNDaGlsZFNwaSgiY2hpbGQyIikpOwogCi0JCVByZWZlcmVuY2VzIGdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkL2dyYW5kY2hpbGQiKTsKLQkJYXNzZXJ0U2FtZShncmFuZGNoaWxkLCBjaGlsZC5jaGlsZFNwaSgiZ3JhbmRjaGlsZCIpKTsKLQkJYXNzZXJ0U2FtZShncmFuZGNoaWxkLCBjaGlsZC5jYWNoZWRDaGlsZHJlbkltcGwoKVswXSk7Ci0JCWdyYW5kY2hpbGQucmVtb3ZlTm9kZSgpOwotCQlhc3NlcnROb3RTYW1lKGdyYW5kY2hpbGQsIHByZWYubm9kZSgiY2hpbGQvZ3JhbmRjaGlsZCIpKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgZ3JhbmRjaGlsZCA9IHByZWYubm9kZSgiY2hpbGQvZ3JhbmRjaGlsZCIpOworICAgICAgICBhc3NlcnRTYW1lKGdyYW5kY2hpbGQsIGNoaWxkLmNoaWxkU3BpKCJncmFuZGNoaWxkIikpOworICAgICAgICBhc3NlcnRTYW1lKGdyYW5kY2hpbGQsIGNoaWxkLmNhY2hlZENoaWxkcmVuSW1wbCgpWzBdKTsKKyAgICAgICAgZ3JhbmRjaGlsZC5yZW1vdmVOb2RlKCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoZ3JhbmRjaGlsZCwgcHJlZi5ub2RlKCJjaGlsZC9ncmFuZGNoaWxkIikpOwogCi0JCWdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkMy9ncmFuZGNoaWxkIik7Ci0JCUFic3RyYWN0UHJlZmVyZW5jZXNbXSBjaGlsZHMgPSAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQotCQkJCS5jYWNoZWRDaGlsZHJlbkltcGwoKTsKLQkJUHJlZmVyZW5jZXMgY2hpbGQzID0gY2hpbGQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRzW2ldLm5hbWUoKS5lcXVhbHMoImNoaWxkMyIpKSB7Ci0JCQkJY2hpbGQzID0gY2hpbGRzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoY2hpbGQzLCBncmFuZGNoaWxkLnBhcmVudCgpKTsKLQl9CisgICAgICAgIGdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkMy9ncmFuZGNoaWxkIik7CisgICAgICAgIEFic3RyYWN0UHJlZmVyZW5jZXNbXSBjaGlsZHMgPSAoKE1vY2tBYnN0cmFjdFByZWZlcmVuY2VzKSBwcmVmKQorICAgICAgICAgICAgICAgIC5jYWNoZWRDaGlsZHJlbkltcGwoKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQzID0gY2hpbGQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2hpbGRzW2ldLm5hbWUoKS5lcXVhbHMoImNoaWxkMyIpKSB7CisgICAgICAgICAgICAgICAgY2hpbGQzID0gY2hpbGRzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFNhbWUoY2hpbGQzLCBncmFuZGNoaWxkLnBhcmVudCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjbm9kZUV4aXN0cyhTdHJpbmcgcGF0aE5hbWUpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZUV4aXN0cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNub2RlRXhpc3RzKFN0cmluZyBwYXRoTmFtZSkKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uICYgQmFja2luZ1N0b3JlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJub2RlRXhpc3RzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlRXhpc3RzKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CiAKLQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gUHJlZmVyZW5jZXMKLQkJCQkudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IHBhcmVudC5ub2RlKCJtb2NrIik7Ci0JCQotCQl0cnkgewotCQkJcHJlZi5ub2RlRXhpc3RzKG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYubm9kZUV4aXN0cygiL2phdmEvdXRpbC9wcmVmcy8iKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5ub2RlRXhpc3RzKCIvamF2YS8vdXRpbC9wcmVmcyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9CisgICAgICAgIFByZWZlcmVuY2VzIHBhcmVudCA9IFByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBwYXJlbnQubm9kZSgibW9jayIpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYubm9kZUV4aXN0cyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLm5vZGVFeGlzdHMoIi9qYXZhL3V0aWwvcHJlZnMvIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYubm9kZUV4aXN0cygiL2phdmEvL3V0aWwvcHJlZnMiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCWFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCIvIikpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiLyIpKTsKIAotCQlhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiL2phdmEvdXRpbC9wcmVmcyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoIi9qYXZhL3V0aWwvcHJlZnMiKSk7CiAKLQkJYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoIiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoIiIpKTsKIAotCQlhc3NlcnRGYWxzZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkIikpOwotCQlQcmVmZXJlbmNlcyBncmFuZGNoaWxkID0gcHJlZi5ub2RlKCJjaGlsZC9ncmFuZGNoaWxkIik7Ci0JCWFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCJjaGlsZCIpKTsKLQkJYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkL2dyYW5kY2hpbGQiKSk7Ci0JCWdyYW5kY2hpbGQucmVtb3ZlTm9kZSgpOwotCQlhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiY2hpbGQiKSk7Ci0JCWFzc2VydEZhbHNlKHByZWYubm9kZUV4aXN0cygiY2hpbGQvZ3JhbmRjaGlsZCIpKTsKLQkJYXNzZXJ0RmFsc2UoZ3JhbmRjaGlsZC5ub2RlRXhpc3RzKCIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHByZWYubm9kZUV4aXN0cygiY2hpbGQiKSk7CisgICAgICAgIFByZWZlcmVuY2VzIGdyYW5kY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkL2dyYW5kY2hpbGQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkIikpOworICAgICAgICBhc3NlcnRUcnVlKHByZWYubm9kZUV4aXN0cygiY2hpbGQvZ3JhbmRjaGlsZCIpKTsKKyAgICAgICAgZ3JhbmRjaGlsZC5yZW1vdmVOb2RlKCk7CisgICAgICAgIGFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCJjaGlsZCIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJlZi5ub2RlRXhpc3RzKCJjaGlsZC9ncmFuZGNoaWxkIikpOworICAgICAgICBhc3NlcnRGYWxzZShncmFuZGNoaWxkLm5vZGVFeGlzdHMoIiIpKTsKIAotCQlhc3NlcnRGYWxzZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkMi9ncmFuZGNoaWxkIikpOwotCQlwcmVmLm5vZGUoImNoaWxkMi9ncmFuZGNoaWxkIik7Ci0JCWFzc2VydFRydWUocHJlZi5ub2RlRXhpc3RzKCJjaGlsZDIvZ3JhbmRjaGlsZCIpKTsKLQl9CisgICAgICAgIGFzc2VydEZhbHNlKHByZWYubm9kZUV4aXN0cygiY2hpbGQyL2dyYW5kY2hpbGQiKSk7CisgICAgICAgIHByZWYubm9kZSgiY2hpbGQyL2dyYW5kY2hpbGQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcmVmLm5vZGVFeGlzdHMoImNoaWxkMi9ncmFuZGNoaWxkIikpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNwYXJlbnQoKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudCgpIHsKLQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gUHJlZmVyZW5jZXMKLQkJCQkudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IHBhcmVudC5ub2RlKCJtb2NrIik7Ci0JCQotCQlhc3NlcnRTYW1lKHBhcmVudCwgcHJlZi5wYXJlbnQoKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQdXQoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzCi0JCS51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQlwcmVmLnB1dCgiIiwgImVtcHR5dmFsdWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXB0eXZhbHVlIiwgcHJlZi5nZXQoIiIsIG51bGwpKTsKLQkJcHJlZi5wdXQoInRlc3RQdXRrZXkiLCAidmFsdWUxIik7Ci0JCWFzc2VydEVxdWFscygidmFsdWUxIiwgcHJlZi5nZXQoInRlc3RQdXRrZXkiLCBudWxsKSk7Ci0JCXByZWYucHV0KCJ0ZXN0UHV0a2V5IiwgInZhbHVlMiIpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlMiIsIHByZWYuZ2V0KCJ0ZXN0UHV0a2V5IiwgbnVsbCkpOworICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNwYXJlbnQoKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnQoKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHBhcmVudCA9IFByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBwYXJlbnQubm9kZSgibW9jayIpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0U2FtZShwYXJlbnQsIHByZWYucGFyZW50KCkpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKKyAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIHByZWYucHV0KCIiLCAiZW1wdHl2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVtcHR5dmFsdWUiLCBwcmVmLmdldCgiIiwgbnVsbCkpOworICAgICAgICBwcmVmLnB1dCgidGVzdFB1dGtleSIsICJ2YWx1ZTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBwcmVmLmdldCgidGVzdFB1dGtleSIsIG51bGwpKTsKKyAgICAgICAgcHJlZi5wdXQoInRlc3RQdXRrZXkiLCAidmFsdWUyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgcHJlZi5nZXQoInRlc3RQdXRrZXkiLCBudWxsKSk7CiAKLQkJcHJlZi5wdXQoIiIsICJlbXB0eXZhbHVlIik7Ci0JCWFzc2VydEVxdWFscygiZW1wdHl2YWx1ZSIsIHByZWYuZ2V0KCIiLCBudWxsKSk7CisgICAgICAgIHByZWYucHV0KCIiLCAiZW1wdHl2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVtcHR5dmFsdWUiLCBwcmVmLmdldCgiIiwgbnVsbCkpOwogCi0JCXRyeSB7Ci0JCQlwcmVmLnB1dChudWxsLCAidmFsdWUiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dCgia2V5IiwgbnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUpOwotCQl0cnkgewotCQkJcHJlZi5wdXQobG9uZ0tleSArIDEsIGxvbmdWYWx1ZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucHV0KGxvbmdLZXksIGxvbmdWYWx1ZSArIDEpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dChudWxsLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dCgia2V5IiwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXQobG9uZ0tleSArIDEsIGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0KGxvbmdLZXksIGxvbmdWYWx1ZSArIDEpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJcHJlZi5yZW1vdmVOb2RlKCk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUgKyAxKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICBwcmVmLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0KGxvbmdLZXksIGxvbmdWYWx1ZSArIDEpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCXByZWYucHV0KGxvbmdLZXksIGxvbmdWYWx1ZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dChsb25nS2V5LCBsb25nVmFsdWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQdXRCb29sZWFuKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKLQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJvb2xlYW4obnVsbCwgZmFsc2UpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRCb29sZWFuKGxvbmdLZXksIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0Qm9vbGVhbihsb25nS2V5ICsgImEiLCBmYWxzZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRCb29sZWFuKCJ0ZXN0UHV0Qm9vbGVhbktleSIsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIHByZWYuZ2V0KCJ0ZXN0UHV0Qm9vbGVhbktleSIsIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UocHJlZi5nZXRCb29sZWFuKCJ0ZXN0UHV0Qm9vbGVhbktleSIsIHRydWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UHV0RG91YmxlKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKLQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dERvdWJsZShudWxsLCAzKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0RG91YmxlKGxvbmdLZXksIDMpOwotCQl0cnkgewotCQkJcHJlZi5wdXREb3VibGUobG9uZ0tleSArICJhIiwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXREb3VibGUoInRlc3RQdXREb3VibGVLZXkiLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLCBwcmVmLmdldCgidGVzdFB1dERvdWJsZUtleSIsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0UHV0RG91YmxlS2V5IiwgMCksIDApOwotCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEJvb2xlYW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dEJvb2xlYW4oKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcworICAgICAgICAudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0Qm9vbGVhbihudWxsLCBmYWxzZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dEJvb2xlYW4obG9uZ0tleSwgZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCb29sZWFuKGxvbmdLZXkgKyAiYSIsIGZhbHNlKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dEJvb2xlYW4oInRlc3RQdXRCb29sZWFuS2V5IiwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgcHJlZi5nZXQoInRlc3RQdXRCb29sZWFuS2V5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRGYWxzZShwcmVmLmdldEJvb2xlYW4oInRlc3RQdXRCb29sZWFuS2V5IiwgdHJ1ZSkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjcHV0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSB2YWx1ZSkKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0RG91YmxlKCkgeworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKKyAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dERvdWJsZShudWxsLCAzKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHByZWYucHV0RG91YmxlKGxvbmdLZXksIDMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXREb3VibGUobG9uZ0tleSArICJhIiwgMyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXREb3VibGUoInRlc3RQdXREb3VibGVLZXkiLCAzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzLjAiLCBwcmVmLmdldCgidGVzdFB1dERvdWJsZUtleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHByZWYuZ2V0RG91YmxlKCJ0ZXN0UHV0RG91YmxlS2V5IiwgMCksIDApOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNwdXRGbG9hdChTdHJpbmcga2V5LCBmbG9hdCB2YWx1ZSkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQdXRGbG9hdCgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzCi0JCS51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQl0cnkgewotCQkJcHJlZi5wdXRGbG9hdChudWxsLCAzZik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlwcmVmLnB1dEZsb2F0KGxvbmdLZXksIDNmKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0RmxvYXQobG9uZ0tleSArICJhIiwgM2YpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0RmxvYXQoInRlc3RQdXRGbG9hdEtleSIsIDNmKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLCBwcmVmLmdldCgidGVzdFB1dEZsb2F0S2V5IiwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoM2YsIHByZWYuZ2V0RmxvYXQoInRlc3RQdXRGbG9hdEtleSIsIDApLCAwKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGZsb2F0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0RmxvYXQoKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcworICAgICAgICAudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0RmxvYXQobnVsbCwgM2YpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5wdXRGbG9hdChsb25nS2V5LCAzZik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnB1dEZsb2F0KGxvbmdLZXkgKyAiYSIsIDNmKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dEZsb2F0KCJ0ZXN0UHV0RmxvYXRLZXkiLCAzZik7CisgICAgICAgIGFzc2VydEVxdWFscygiMy4wIiwgcHJlZi5nZXQoInRlc3RQdXRGbG9hdEtleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDNmLCBwcmVmLmdldEZsb2F0KCJ0ZXN0UHV0RmxvYXRLZXkiLCAwKSwgMCk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UHV0SW50KCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKLQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEludChudWxsLCAzKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucHV0SW50KGxvbmdLZXksIDMpOwotCQl0cnkgewotCQkJcHJlZi5wdXRJbnQobG9uZ0tleSArICJhIiwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRJbnQoInRlc3RQdXRJbnRLZXkiLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKCIzIiwgcHJlZi5nZXQoInRlc3RQdXRJbnRLZXkiLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygzLCBwcmVmLmdldEludCgidGVzdFB1dEludEtleSIsIDApKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQsIGJ1dCBtZXRob2QgaXMgYWJzdHJhY3QsIHByb2JhYmx5IGl0IGlzIE9LIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dEludCgpIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzCisgICAgICAgIC51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRJbnQobnVsbCwgMyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dEludChsb25nS2V5LCAzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0SW50KGxvbmdLZXkgKyAiYSIsIDMpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHByZWYucHV0SW50KCJ0ZXN0UHV0SW50S2V5IiwgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyIsIHByZWYuZ2V0KCJ0ZXN0UHV0SW50S2V5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcHJlZi5nZXRJbnQoInRlc3RQdXRJbnRLZXkiLCAwKSk7CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dExvbmcoU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQdXRMb25nKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKLQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dExvbmcobnVsbCwgM0wpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRMb25nKGxvbmdLZXksIDNMKTsKLQkJdHJ5IHsKLQkJCXByZWYucHV0TG9uZyhsb25nS2V5ICsgImEiLCAzTCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcHJlZi5wdXRMb25nKCJ0ZXN0UHV0TG9uZ0tleSIsIDNMKTsKLQkJYXNzZXJ0RXF1YWxzKCIzIiwgcHJlZi5nZXQoInRlc3RQdXRMb25nS2V5IiwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoM0wsIHByZWYuZ2V0TG9uZygidGVzdFB1dExvbmdLZXkiLCAwKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNwdXRCeXRlQXJyYXkoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFB1dEJ5dGVBcnJheSgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzCi0JCS51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQl0cnkgewotCQkJcHJlZi5wdXRCeXRlQXJyYXkobnVsbCwgbmV3IGJ5dGVbMF0pOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWYucHV0Qnl0ZUFycmF5KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5NCIsIG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjcHV0TG9uZyhTdHJpbmcga2V5LCBsb25nIHZhbHVlKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dExvbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dExvbmcoKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcworICAgICAgICAudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0TG9uZyhudWxsLCAzTCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dExvbmcobG9uZ0tleSwgM0wpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRMb25nKGxvbmdLZXkgKyAiYSIsIDNMKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwcmVmLnB1dExvbmcoInRlc3RQdXRMb25nS2V5IiwgM0wpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCBwcmVmLmdldCgidGVzdFB1dExvbmdLZXkiLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzTCwgcHJlZi5nZXRMb25nKCJ0ZXN0UHV0TG9uZ0tleSIsIDApKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3B1dEJ5dGVBcnJheShTdHJpbmcga2V5LCBieXRlW10gdmFsdWUpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQsIGJ1dCBtZXRob2QgaXMgYWJzdHJhY3QsIHByb2JhYmx5IGl0IGlzIE9LIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHV0Qnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFB1dEJ5dGVBcnJheSgpIHsKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzCisgICAgICAgIC51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobnVsbCwgbmV3IGJ5dGVbMF0pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucHV0Qnl0ZUFycmF5KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5NCIsIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5LCBuZXcgYnl0ZVswXSk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5ICsgImEiLCBuZXcgYnl0ZVswXSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYnl0ZVtdIGxvbmdBcnJheSA9IG5ldyBieXRlWyhpbnQpIChQcmVmZXJlbmNlcy5NQVhfVkFMVUVfTEVOR1RIICogMC43NCldOwotCQlieXRlW10gbG9uZ2VyQXJyYXkgPSBuZXcgYnl0ZVsoaW50KSAoUHJlZmVyZW5jZXMuTUFYX1ZBTFVFX0xFTkdUSCAqIDAuNzUpICsgMV07Ci0JCXByZWYucHV0Qnl0ZUFycmF5KGxvbmdLZXksIGxvbmdBcnJheSk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5LCBsb25nZXJBcnJheSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobG9uZ0tleSwgbmV3IGJ5dGVbMF0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobG9uZ0tleSArICJhIiwgbmV3IGJ5dGVbMF0pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBsb25nQXJyYXkgPSBuZXcgYnl0ZVsoaW50KSAoUHJlZmVyZW5jZXMuTUFYX1ZBTFVFX0xFTkdUSCAqIDAuNzQpXTsKKyAgICAgICAgYnl0ZVtdIGxvbmdlckFycmF5ID0gbmV3IGJ5dGVbKGludCkgKFByZWZlcmVuY2VzLk1BWF9WQUxVRV9MRU5HVEggKiAwLjc1KSArIDFdOworICAgICAgICBwcmVmLnB1dEJ5dGVBcnJheShsb25nS2V5LCBsb25nQXJyYXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5wdXRCeXRlQXJyYXkobG9uZ0tleSwgbG9uZ2VyQXJyYXkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJcHJlZi5wdXRCeXRlQXJyYXkoInRlc3RQdXRCeXRlQXJyYXlLZXkiLCBuZXcgYnl0ZVswXSk7Ci0JCWFzc2VydEVxdWFscygiIiwgcHJlZi5nZXQoInRlc3RQdXRCeXRlQXJyYXlLZXkiLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVswXSwgcHJlZi5nZXRCeXRlQXJyYXkoCi0JCQkJInRlc3RQdXRCeXRlQXJyYXlLZXkiLCBudWxsKSkpOworICAgICAgICBwcmVmLnB1dEJ5dGVBcnJheSgidGVzdFB1dEJ5dGVBcnJheUtleSIsIG5ldyBieXRlWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwcmVmLmdldCgidGVzdFB1dEJ5dGVBcnJheUtleSIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlWzBdLCBwcmVmLmdldEJ5dGVBcnJheSgKKyAgICAgICAgICAgICAgICAidGVzdFB1dEJ5dGVBcnJheUtleSIsIG51bGwpKSk7CiAKLQkJcHJlZi5wdXRCeXRlQXJyYXkoInRlc3RQdXRCeXRlQXJyYXlLZXkzIiwgbmV3IGJ5dGVbXSB7ICdhJywgJ2InLCAnYycgfSk7Ci0JCWFzc2VydEVxdWFscygiWVdKaiIsIHByZWYuZ2V0KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5MyIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10geyAnYScsICdiJywgJ2MnIH0sIHByZWYKLQkJCQkuZ2V0Qnl0ZUFycmF5KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5MyIsIG51bGwpKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNyZW1vdmUoU3RyaW5nIGtleSkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzCi0JCS51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQlwcmVmLnJlbW92ZSgia2V5Iik7CisgICAgICAgIHByZWYucHV0Qnl0ZUFycmF5KCJ0ZXN0UHV0Qnl0ZUFycmF5S2V5MyIsIG5ldyBieXRlW10geyAnYScsICdiJywgJ2MnIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmoiLCBwcmVmLmdldCgidGVzdFB1dEJ5dGVBcnJheUtleTMiLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHsgJ2EnLCAnYicsICdjJyB9LCBwcmVmCisgICAgICAgICAgICAgICAgLmdldEJ5dGVBcnJheSgidGVzdFB1dEJ5dGVBcnJheUtleTMiLCBudWxsKSkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjcmVtb3ZlKFN0cmluZyBrZXkpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKKyAgICAgICAgLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIHByZWYucmVtb3ZlKCJrZXkiKTsKIAotCQlwcmVmLnB1dCgia2V5IiwgInZhbHVlIik7Ci0JCWFzc2VydEVxdWFscygidmFsdWUiLCBwcmVmLmdldCgia2V5IiwgbnVsbCkpOwotCQlwcmVmLnJlbW92ZSgia2V5Iik7Ci0JCWFzc2VydE51bGwocHJlZi5nZXQoImtleSIsIG51bGwpKTsKKyAgICAgICAgcHJlZi5wdXQoImtleSIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcHJlZi5nZXQoImtleSIsIG51bGwpKTsKKyAgICAgICAgcHJlZi5yZW1vdmUoImtleSIpOworICAgICAgICBhc3NlcnROdWxsKHByZWYuZ2V0KCJrZXkiLCBudWxsKSk7CiAKLQkJcHJlZi5yZW1vdmUoImtleSIpOworICAgICAgICBwcmVmLnJlbW92ZSgia2V5Iik7CiAKLQkJdHJ5IHsKLQkJCXByZWYucmVtb3ZlKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCQlwcmVmLnJlbW92ZU5vZGUoKTsKLQkJdHJ5IHsKLQkJCXByZWYucmVtb3ZlKCJrZXkiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgcHJlZi5yZW1vdmVOb2RlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZSgia2V5Iik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjcmVtb3ZlTm9kZSgpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9kZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMKLQkJLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCVByZWZlcmVuY2VzIGNoaWxkID0gcHJlZi5ub2RlKCJjaGlsZCIpOwotCQlQcmVmZXJlbmNlcyBjaGlsZDEgPSBwcmVmLm5vZGUoImNoaWxkMSIpOwotCQlQcmVmZXJlbmNlcyBncmFuZGNoaWxkID0gY2hpbGQubm9kZSgiZ3JhbmRjaGlsZCIpOworICAgIC8qKgorICAgICAqIEB0ZXN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyNyZW1vdmVOb2RlKCkKKyAgICAgKgorICAgICAqLworQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9ucyBjaGVja2luZyBtaXNzZWQsIGJ1dCBtZXRob2QgaXMgYWJzdHJhY3QsIHByb2JhYmx5IGl0IGlzIE9LIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlTm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcworICAgICAgICAudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgUHJlZmVyZW5jZXMgY2hpbGQgPSBwcmVmLm5vZGUoImNoaWxkIik7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMSA9IHByZWYubm9kZSgiY2hpbGQxIik7CisgICAgICAgIFByZWZlcmVuY2VzIGdyYW5kY2hpbGQgPSBjaGlsZC5ub2RlKCJncmFuZGNoaWxkIik7CiAKLQkJcHJlZi5yZW1vdmVOb2RlKCk7CisgICAgICAgIHByZWYucmVtb3ZlTm9kZSgpOwogCi0JCWFzc2VydEZhbHNlKGNoaWxkLm5vZGVFeGlzdHMoIiIpKTsKLQkJYXNzZXJ0RmFsc2UoY2hpbGQxLm5vZGVFeGlzdHMoIiIpKTsKLQkJYXNzZXJ0RmFsc2UoZ3JhbmRjaGlsZC5ub2RlRXhpc3RzKCIiKSk7Ci0JCWFzc2VydEZhbHNlKHByZWYubm9kZUV4aXN0cygiIikpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjYWRkTm9kZUNoYW5nZUxpc3RlbmVyKE5vZGVDaGFuZ2VMaXN0ZW5lciBuY2wpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTm9kZUNoYW5nZUxpc3RlbmVyKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQl0cnkgewotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgICAgICBhc3NlcnRGYWxzZShjaGlsZC5ub2RlRXhpc3RzKCIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNoaWxkMS5ub2RlRXhpc3RzKCIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGdyYW5kY2hpbGQubm9kZUV4aXN0cygiIikpOworICAgICAgICBhc3NlcnRGYWxzZShwcmVmLm5vZGVFeGlzdHMoIiIpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2FkZE5vZGVDaGFuZ2VMaXN0ZW5lcihOb2RlQ2hhbmdlTGlzdGVuZXIgbmNsKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJPbmx5IE51bGxQb2ludGVyRXhjZXB0aW9uIGNoZWNrZWQsIGJ1dCBtZXRob2QgaXMgYWJzdHJhY3QsIHByb2JhYmx5IGl0IGlzIE9LIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkTm9kZUNoYW5nZUxpc3RlbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0QWRkTm9kZUNoYW5nZUxpc3RlbmVyKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQogCi0JCVByZWZlcmVuY2VzIGNoaWxkMSA9IG51bGw7Ci0JCVByZWZlcmVuY2VzIGNoaWxkMiA9IG51bGw7Ci0JCVByZWZlcmVuY2VzIGNoaWxkMyA9IG51bGw7Ci0JCQotCQlNb2NrTm9kZUNoYW5nZUxpc3RlbmVyIG5sID0gbnVsbDsKLQkJLy8gVG8gZ2V0IGV4aXN0ZWQgbm9kZSBkb2Vzbid0IGNyZWF0ZSB0aGUgY2hhbmdlIGV2ZW50Ci0JCXRyeSB7Ci0JCQlubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQljaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2sxIik7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgbmwuZ2V0QWRkZWQoKSk7Ci0JCQlubC5yZXNldCgpOwotCQkJY2hpbGQyID0gcHJlZi5ub2RlKCJtb2NrMSIpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIG5sLmdldEFkZGVkKCkpOwotCQkJbmwucmVzZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCWNoaWxkMS5yZW1vdmVOb2RlKCk7Ci0JCX0KLQkJLy8gc2FtZSBsaXN0ZW5lciBjYW4gYmUgYWRkZWQgdHdpY2UsIGFuZCBtdXN0IGJlIHJlbW92ZWQgdHdpY2UKLQkJdHJ5IHsKLQkJCW5sID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCXByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCXByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCWNoaWxkMSA9IHByZWYubm9kZSgibW9jazIiKTsKLQkJCWFzc2VydEVxdWFscygyLCBubC5nZXRBZGRlZCgpKTsKLQkJCW5sLnJlc2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQljaGlsZDEucmVtb3ZlTm9kZSgpOwotCQl9Ci0JCS8vIHRlc3QgcmVtb3ZlIGV2ZW50Ci0JCXRyeSB7Ci0JCQlubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7Ci0JCQljaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2szIik7Ci0JCQljaGlsZDEucmVtb3ZlTm9kZSgpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIG5sLmdldFJlbW92ZWQoKSk7Ci0JCQlubC5yZXNldCgpOwotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQl9Ci0JCS8vIHRlc3QgcmVtb3ZlIGV2ZW50IHdpdGggdHdvIGxpc3RlbmVycwotCQl0cnkgewotCQkJbmwgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQkJY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrNiIpOwotCQkJY2hpbGQxLnJlbW92ZU5vZGUoKTsKLQkJCWFzc2VydEVxdWFscygyLCBubC5nZXRSZW1vdmVkKCkpOwotCQkJbmwucmVzZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKLQkJfQotCQkvLyB0ZXN0IGFkZC9yZW1vdmUgaW5kaXJlY3QgY2hpbGRyZW4sIG9yIHJlbW92ZSBzZXZlcmFsIGNoaWxkcmVuIGF0IHRoZQotCQkvLyBzYW1lIHRpbWUKLQkJdHJ5IHsKLQkJCW5sID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCWNoaWxkMSA9IHByZWYubm9kZSgibW9jazQiKTsKLQkJCWNoaWxkMS5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOwotCQkJY2hpbGQyID0gcHJlZi5ub2RlKCJtb2NrNC9tb2NrNSIpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOwotCQkJbmwucmVzZXQoKTsKLQkJCWNoaWxkMyA9IHByZWYubm9kZSgibW9jazQvbW9jazUvbW9jazYiKTsKLQkJCWFzc2VydEVxdWFscygwLCBubC5nZXRBZGRlZCgpKTsKLQkJCW5sLnJlc2V0KCk7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMSA9IG51bGw7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMiA9IG51bGw7CisgICAgICAgIFByZWZlcmVuY2VzIGNoaWxkMyA9IG51bGw7CisgICAgICAgIAorICAgICAgICBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyIG5sID0gbnVsbDsKKyAgICAgICAgLy8gVG8gZ2V0IGV4aXN0ZWQgbm9kZSBkb2Vzbid0IGNyZWF0ZSB0aGUgY2hhbmdlIGV2ZW50CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBjaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2sxIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmwuZ2V0QWRkZWQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICAgICAgY2hpbGQyID0gcHJlZi5ub2RlKCJtb2NrMSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5sLmdldEFkZGVkKCkpOworICAgICAgICAgICAgbmwucmVzZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgICAgIGNoaWxkMS5yZW1vdmVOb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2FtZSBsaXN0ZW5lciBjYW4gYmUgYWRkZWQgdHdpY2UsIGFuZCBtdXN0IGJlIHJlbW92ZWQgdHdpY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5sID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIHByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgICAgIHByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgICAgIGNoaWxkMSA9IHByZWYubm9kZSgibW9jazIiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBubC5nZXRBZGRlZCgpKTsKKyAgICAgICAgICAgIG5sLnJlc2V0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBjaGlsZDEucmVtb3ZlTm9kZSgpOworICAgICAgICB9CisgICAgICAgIC8vIHRlc3QgcmVtb3ZlIGV2ZW50CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBubCA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihubCk7CisgICAgICAgICAgICBjaGlsZDEgPSBwcmVmLm5vZGUoIm1vY2szIik7CisgICAgICAgICAgICBjaGlsZDEucmVtb3ZlTm9kZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5sLmdldFJlbW92ZWQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICB9CisgICAgICAgIC8vIHRlc3QgcmVtb3ZlIGV2ZW50IHdpdGggdHdvIGxpc3RlbmVycworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmwgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgY2hpbGQxID0gcHJlZi5ub2RlKCJtb2NrNiIpOworICAgICAgICAgICAgY2hpbGQxLnJlbW92ZU5vZGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBubC5nZXRSZW1vdmVkKCkpOworICAgICAgICAgICAgbmwucmVzZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKG5sKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IGFkZC9yZW1vdmUgaW5kaXJlY3QgY2hpbGRyZW4sIG9yIHJlbW92ZSBzZXZlcmFsIGNoaWxkcmVuIGF0IHRoZQorICAgICAgICAvLyBzYW1lIHRpbWUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5sID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIGNoaWxkMSA9IHByZWYubm9kZSgibW9jazQiKTsKKyAgICAgICAgICAgIGNoaWxkMS5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobmwpOworICAgICAgICAgICAgY2hpbGQyID0gcHJlZi5ub2RlKCJtb2NrNC9tb2NrNSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOworICAgICAgICAgICAgbmwucmVzZXQoKTsKKyAgICAgICAgICAgIGNoaWxkMyA9IHByZWYubm9kZSgibW9jazQvbW9jazUvbW9jazYiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBubC5nZXRBZGRlZCgpKTsKKyAgICAgICAgICAgIG5sLnJlc2V0KCk7CiAKLQkJCWNoaWxkMy5yZW1vdmVOb2RlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgbmwuZ2V0UmVtb3ZlZCgpKTsKLQkJCW5sLnJlc2V0KCk7CisgICAgICAgICAgICBjaGlsZDMucmVtb3ZlTm9kZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5sLmdldFJlbW92ZWQoKSk7CisgICAgICAgICAgICBubC5yZXNldCgpOwogCi0JCQljaGlsZDMgPSBwcmVmLm5vZGUoIm1vY2s0L21vY2s3Iik7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgbmwuZ2V0QWRkZWQoKSk7Ci0JCQlubC5yZXNldCgpOworICAgICAgICAgICAgY2hpbGQzID0gcHJlZi5ub2RlKCJtb2NrNC9tb2NrNyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5sLmdldEFkZGVkKCkpOworICAgICAgICAgICAgbmwucmVzZXQoKTsKIAotCQkJY2hpbGQxLnJlbW92ZU5vZGUoKTsKLQkJCWFzc2VydEVxdWFscygyLCBubC5nZXRSZW1vdmVkKCkpOwotCQkJbmwucmVzZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJY2hpbGQxLnJlbW92ZU5vZGUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGNoaWxkMS5yZW1vdmVOb2RlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmwuZ2V0UmVtb3ZlZCgpKTsKKyAgICAgICAgICAgIG5sLnJlc2V0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoaWxkMS5yZW1vdmVOb2RlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQl9Ci0JCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI2FkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGNsKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCi0JCVByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOwotCQlNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHBsID0gbnVsbDsKLQkJCi0JCS8vIFRPRE86IHN0YXJ0IGZyb20gaGVyZQotCQl0cnkgewotCQkJcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwY2wpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk9ubHkgTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tlZCwgYnV0IG1ldGhvZCBpcyBhYnN0cmFjdCwgcHJvYmFibHkgaXQgaXMgT0siLAorICAgICAgdGFyZ2V0cyA9IHsgCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0QWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAKKyAgICAgICAgUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7CisgICAgICAgIE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGwgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gVE9ETzogc3RhcnQgZnJvbSBoZXJlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQkJLy8gVG8gZ2V0IGV4aXN0ZWQgbm9kZSBkb2Vzbid0IGNyZWF0ZSB0aGUgY2hhbmdlIGV2ZW50Ci0JCXRyeSB7Ci0JCQlwbCA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCQlwcmVmLnB1dEludCgibW9jazEiLCAxMjMpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIHBsLmdldENoYW5nZWQoKSk7Ci0JCQlwcmVmLnB1dExvbmcoImxvbmdfa2V5IiwgTG9uZy5NQVhfVkFMVUUpOwotCQkJYXNzZXJ0RXF1YWxzKDIsIHBsLmdldENoYW5nZWQoKSk7Ci0JCQlwbC5yZXNldCgpOwotCQkJdHJ5IHsKLQkJCQlwcmVmLmNsZWFyKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIHBsLmdldENoYW5nZWQoKSk7Ci0JCQl9IGNhdGNoKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBic2UpIHsKLQkJCQlwbC5yZXNldCgpOwotCQkJCWZhaWwoIkJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBpcyB0aHJvd24iKTsKLQkJCX0KLQkJCXBsLnJlc2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCQkvL2NoaWxkMS5yZW1vdmVOb2RlKCk7Ci0JCX0KLQkJCQkgICAgICAKLQkJLy8gc2FtZSBsaXN0ZW5lciBjYW4gYmUgYWRkZWQgdHdpY2UsIGFuZCBtdXN0IGJlIHJlbW92ZWQgdHdpY2UKLQkJdHJ5IHsKLQkJCXBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJCXByZWYucHV0RmxvYXQoImZsb2F0X2tleSIsIEZsb2F0Lk1JTl9WQUxVRSk7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgcGwuZ2V0Q2hhbmdlZCgpKTsKLQkJCXBsLnJlc2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JCQlwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7CisgICAgICAgIC8vIFRvIGdldCBleGlzdGVkIG5vZGUgZG9lc24ndCBjcmVhdGUgdGhlIGNoYW5nZSBldmVudAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGwgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICAgICAgcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICAgICAgcHJlZi5wdXRJbnQoIm1vY2sxIiwgMTIzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBwbC5nZXRDaGFuZ2VkKCkpOworICAgICAgICAgICAgcHJlZi5wdXRMb25nKCJsb25nX2tleSIsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBwbC5nZXRDaGFuZ2VkKCkpOworICAgICAgICAgICAgcGwucmVzZXQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJlZi5jbGVhcigpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBwbC5nZXRDaGFuZ2VkKCkpOworICAgICAgICAgICAgfSBjYXRjaChCYWNraW5nU3RvcmVFeGNlcHRpb24gYnNlKSB7CisgICAgICAgICAgICAgICAgcGwucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJCYWNraW5nU3RvcmVFeGNlcHRpb24gaXMgdGhyb3duIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICAgICAgLy9jaGlsZDEucmVtb3ZlTm9kZSgpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIHNhbWUgbGlzdGVuZXIgY2FuIGJlIGFkZGVkIHR3aWNlLCBhbmQgbXVzdCBiZSByZW1vdmVkIHR3aWNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwbCA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7CisgICAgICAgICAgICBwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihwbCk7CisgICAgICAgICAgICBwcmVmLnB1dEZsb2F0KCJmbG9hdF9rZXkiLCBGbG9hdC5NSU5fVkFMVUUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBsLmdldENoYW5nZWQoKSk7CisgICAgICAgICAgICBwbC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwogCi0JCX0KLQkJLy8gdGVzdCByZW1vdmUgZXZlbnQKLQkJdHJ5IHsKLQkJCXBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJCXByZWYucHV0RG91YmxlKCJkb3VibGVfa2V5IiwgRG91YmxlLk1BWF9WQUxVRSk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgcGwuZ2V0Q2hhbmdlZCgpKTsKLQkJCXRyeSB7Ci0JCQkJcHJlZi5jbGVhcigpOwotCQkJCWFzc2VydEVxdWFscygzLCBwbC5nZXRDaGFuZ2VkKCkpOwotCQkJfSBjYXRjaChCYWNraW5nU3RvcmVFeGNlcHRpb24gYnNlKSB7Ci0JCQkJZmFpbCgiQmFja2luZ1N0b3JlRXhjZXB0aW9uIGlzIHRocm93biIpOwotCQkJfQotCQkJcGwucmVzZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByZWYucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJfQotCQkvLyB0ZXN0IHJlbW92ZSBldmVudCB3aXRoIHR3byBsaXN0ZW5lcnMKLQkJdHJ5IHsKLQkJCXBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkJCXByZWYucHV0Qnl0ZUFycmF5KCJieXRlX2FycmF5X2tleSIsIG5ldyBieXRlIFtdIHsxICwyICwgM30pOwotCQkJdHJ5IHsKLQkJCQlwcmVmLmNsZWFyKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDQsIHBsLmdldENoYW5nZWQoKSk7Ci0JCQl9IGNhdGNoKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBic2UpIHsKLQkJCQlmYWlsKCJCYWNraW5nU3RvcmVFeGNlcHRpb24gaXMgdGhyb3duIik7Ci0JCQl9Ci0JCQlwbC5yZXNldCgpOwotCQl9IGZpbmFsbHkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOwotCQl9CisgICAgICAgIH0KKyAgICAgICAgLy8gdGVzdCByZW1vdmUgZXZlbnQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIHByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKKyAgICAgICAgICAgIHByZWYucHV0RG91YmxlKCJkb3VibGVfa2V5IiwgRG91YmxlLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGwuZ2V0Q2hhbmdlZCgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJlZi5jbGVhcigpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBwbC5nZXRDaGFuZ2VkKCkpOworICAgICAgICAgICAgfSBjYXRjaChCYWNraW5nU3RvcmVFeGNlcHRpb24gYnNlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiQmFja2luZ1N0b3JlRXhjZXB0aW9uIGlzIHRocm93biIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGwucmVzZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IHJlbW92ZSBldmVudCB3aXRoIHR3byBsaXN0ZW5lcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBsID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIHByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKKyAgICAgICAgICAgIHByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHBsKTsKKyAgICAgICAgICAgIHByZWYucHV0Qnl0ZUFycmF5KCJieXRlX2FycmF5X2tleSIsIG5ldyBieXRlIFtdIHsxICwyICwgM30pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcmVmLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHBsLmdldENoYW5nZWQoKSk7CisgICAgICAgICAgICB9IGNhdGNoKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBic2UpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJCYWNraW5nU3RvcmVFeGNlcHRpb24gaXMgdGhyb3duIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbC5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIocGwpOworICAgICAgICB9CiAKLQl9Ci0JCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3JlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihOb2RlQ2hhbmdlTGlzdGVuZXIgbmNsKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlNb2NrTm9kZUNoYW5nZUxpc3RlbmVyIGwxID0gbmV3IE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBsMiA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKGwxKTsKLQkJcHJlZi5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMjcmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKE5vZGVDaGFuZ2VMaXN0ZW5lciBuY2wpCisgICAgICoKKyAgICAgKi8KK0BUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQsIGJ1dCBtZXRob2QgaXMgYWJzdHJhY3QsIHByb2JhYmx5IGl0IGlzIE9LIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWYgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UoUHJlZmVyZW5jZXMuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lciBsMSA9IG5ldyBNb2NrTm9kZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgIE1vY2tOb2RlQ2hhbmdlTGlzdGVuZXIgbDIgPSBuZXcgTW9ja05vZGVDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICBwcmVmLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7CisgICAgICAgIHByZWYuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKGwxKTsKIAotCQlwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7Ci0JCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKGwxKTsKLQkJdHJ5IHsKLQkJCXByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKGwxKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobDIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICBwcmVmLnJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihsMSk7CisgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKGwxKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKGwxKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlZi5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIobDIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3JlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGNsKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZShQcmVmZXJlbmNlcy5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGwxID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBsMiA9IG5ldyBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXByZWYuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGwxKTsKLQkJcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOwotCQl0cnkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXByZWYucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGwxKTsKLQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOwotCQl0cnkgewotCQkJcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9CisgICAgLyoqCisgICAgICogQHRlc3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzI3JlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcGNsKQorICAgICAqCisgICAgICovCitAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLCBidXQgbWV0aG9kIGlzIGFic3RyYWN0LCBwcm9iYWJseSBpdCBpcyBPSyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBQcmVmZXJlbmNlcyBwcmVmID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKFByZWZlcmVuY2VzLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZWYucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgbDEgPSBuZXcgTW9ja1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICBNb2NrUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGwyID0gbmV3IE1vY2tQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgcHJlZi5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgICAgICBwcmVmLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihsMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihsMik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJlZi5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobDEpOworICAgICAgICBwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihsMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVmLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihsMSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTW9ja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgTW9ja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewogCi0JCXN0YXRpYyBmaW5hbCBpbnQgbm9ybWFsID0gMDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBub3JtYWwgPSAwOwogCi0JCXN0YXRpYyBmaW5hbCBpbnQgZXhjZXB0aW9uID0gMTsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBleGNlcHRpb24gPSAxOwogCi0JCXN0YXRpYyBmaW5hbCBpbnQgcnVudGltZUV4Y2VwdGlvbiA9IDI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgcnVudGltZUV4Y2VwdGlvbiA9IDI7CiAKLQkJaW50IHJlc3VsdCA9IG5vcm1hbDsKKyAgICAgICAgaW50IHJlc3VsdCA9IG5vcm1hbDsKIAotCQlJbnB1dFN0cmVhbSB3cmFwcGVyOworICAgICAgICBJbnB1dFN0cmVhbSB3cmFwcGVyOwogCi0JCXB1YmxpYyB2b2lkIHNldFJlc3VsdChpbnQgaSkgewotCQkJcmVzdWx0ID0gaTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoaW50IGkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgY2hlY2tFeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJc3dpdGNoIChyZXN1bHQpIHsKLQkJCWNhc2Ugbm9ybWFsOgotCQkJCXJldHVybjsKLQkJCWNhc2UgZXhjZXB0aW9uOgotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigidGVzdCIpOwotCQkJY2FzZSBydW50aW1lRXhjZXB0aW9uOgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ0ZXN0Iik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgICAgICBjYXNlIG5vcm1hbDoKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIGV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRlc3QiKTsKKyAgICAgICAgICAgIGNhc2UgcnVudGltZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidGVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIE1vY2tJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgewotCQkJd3JhcHBlciA9IGluOwotCQl9CisgICAgICAgIHB1YmxpYyBNb2NrSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgICAgIHdyYXBwZXIgPSBpbjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQljaGVja0V4Y2VwdGlvbigpOwotCQkJcmV0dXJuIHdyYXBwZXIucmVhZCgpOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgY2hlY2tFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnJlYWQoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBNb2NrUHJlZmVyZW5jZXMgZXh0ZW5kcyBQcmVmZXJlbmNlcyB7CisgICAgc3RhdGljIGNsYXNzIE1vY2tQcmVmZXJlbmNlcyBleHRlbmRzIFByZWZlcmVuY2VzIHsKIAotCQlwdWJsaWMgTW9ja1ByZWZlcmVuY2VzKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgTW9ja1ByZWZlcmVuY2VzKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJpbmcgYWJzb2x1dGVQYXRoKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZyBhYnNvbHV0ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJpbmdbXSBjaGlsZHJlbk5hbWVzKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gY2hpbGRyZW5OYW1lcygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBleHBvcnROb2RlKE91dHB1dFN0cmVhbSBvc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQkJQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBleHBvcnROb2RlKE91dHB1dFN0cmVhbSBvc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIGV4cG9ydFN1YnRyZWUoT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCQlCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGV4cG9ydFN1YnRyZWUoT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICB9CiAKLQkJcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmx0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcga2V5LCBTdHJpbmcgZGVmbHQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIGRlZmx0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIGRlZmx0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheShTdHJpbmcga2V5LCBieXRlW10gZGVmbHQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZUFycmF5KFN0cmluZyBrZXksIGJ5dGVbXSBkZWZsdCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgZGVmbHQpIHsKLQkJCXJldHVybiAwOwotCQl9CisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSBkZWZsdCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgZGVmbHQpIHsKLQkJCXJldHVybiAwOwotCQl9CisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5LCBmbG9hdCBkZWZsdCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmbHQpIHsKLQkJCXJldHVybiAwOwotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBrZXksIGludCBkZWZsdCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBrZXksIGxvbmcgZGVmbHQpIHsKLQkJCXJldHVybiAwOwotCQl9CisgICAgICAgIHB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIGtleSwgbG9uZyBkZWZsdCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBpc1VzZXJOb2RlKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlck5vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyaW5nW10ga2V5cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGtleXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIFN0cmluZyBuYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlwdWJsaWMgUHJlZmVyZW5jZXMgbm9kZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFByZWZlcmVuY2VzIG5vZGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gbm9kZUV4aXN0cyhTdHJpbmcgbmFtZSkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gbm9kZUV4aXN0cyhTdHJpbmcgbmFtZSkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQlwdWJsaWMgUHJlZmVyZW5jZXMgcGFyZW50KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFByZWZlcmVuY2VzIHBhcmVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CiAKLQkJfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewogCi0JCX0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHB1dEJ5dGVBcnJheShTdHJpbmcga2V5LCBieXRlW10gdmFsdWUpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcHV0Qnl0ZUFycmF5KFN0cmluZyBrZXksIGJ5dGVbXSB2YWx1ZSkgewogCi0JCX0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHB1dERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcHV0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSB2YWx1ZSkgewogCi0JCX0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHB1dEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHB1dEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKSB7CiAKLQkJfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcHV0SW50KFN0cmluZyBrZXksIGludCB2YWx1ZSkgeworICAgICAgICBwdWJsaWMgdm9pZCBwdXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CiAKLQkJfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcHV0TG9uZyhTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHB1dExvbmcoU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewogCi0JCX0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KSB7CiAKLQkJfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcmVtb3ZlTm9kZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CiAKLQkJfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgYWRkTm9kZUNoYW5nZUxpc3RlbmVyKE5vZGVDaGFuZ2VMaXN0ZW5lciBuY2wpIHsKKyAgICAgICAgcHVibGljIHZvaWQgYWRkTm9kZUNoYW5nZUxpc3RlbmVyKE5vZGVDaGFuZ2VMaXN0ZW5lciBuY2wpIHsKIAotCQl9CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHBjbCkgeworICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHBjbCkgewogCi0JCX0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihOb2RlQ2hhbmdlTGlzdGVuZXIgbmNsKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihOb2RlQ2hhbmdlTGlzdGVuZXIgbmNsKSB7CiAKLQkJfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwY2wpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwY2wpIHsKIAotCQl9CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBzeW5jKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHN5bmMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKIAotCQl9CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQl9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9yZWdleC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9NYXRjaFJlc3VsdC5qYXZhIGIvcmVnZXgvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hSZXN1bHQuamF2YQppbmRleCBhOWI4N2M2Li5mYTY3YmE2IDEwMDY0NAotLS0gYS9yZWdleC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9NYXRjaFJlc3VsdC5qYXZhCisrKyBiL3JlZ2V4L3NyYy9tYWluL2phdmEvamF2YS91dGlsL3JlZ2V4L01hdGNoUmVzdWx0LmphdmEKQEAgLTI4LDggKzI4LDggQEAKICAqIAogICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWF0Y2hSZXN1bHQKLXsKK3B1YmxpYyBpbnRlcmZhY2UgTWF0Y2hSZXN1bHQgeworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIHRleHQgdGhhdCBtYXRjaGVkCiAgICAgICogdGhlIHdob2xlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gCkBAIC0zOCw3ICszOCw3IEBACiAgICAgICogCiAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIGludCBlbmQoKTsKKyAgICBpbnQgZW5kKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgdGV4dCB0aGF0IG1hdGNoZWQKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgKiAKICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGVuZChpbnQgZ3JvdXApOworICAgIGludCBlbmQoaW50IGdyb3VwKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRleHQgdGhhdCBtYXRjaGVkIHRoZSB3aG9sZSByZWd1bGFyIGV4cHJlc3Npb24uIApAQCAtNjEsNyArNjEsNyBAQAogICAgICAqIAogICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ3JvdXAoKTsKKyAgICBTdHJpbmcgZ3JvdXAoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRleHQgdGhhdCBtYXRjaGVkIGEgZ2l2ZW4gZ3JvdXAgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgKiAKICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdyb3VwKGludCBncm91cCk7CisgICAgU3RyaW5nIGdyb3VwKGludCBncm91cCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZ3JvdXBzIGluIHRoZSByZXN1bHQsIHdoaWNoIGlzIGFsd2F5cyBlcXVhbCB0bwpAQCAtODQsNyArODQsNyBAQAogICAgICAqIAogICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ3JvdXBDb3VudCgpOworICAgIGludCBncm91cENvdW50KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB0ZXh0IHRoYXQgbWF0Y2hlZApAQCAtOTQsNyArOTQsNyBAQAogICAgICAqIAogICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBpbnQgc3RhcnQoKTsKKyAgICBpbnQgc3RhcnQoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHRleHQgdGhhdCBtYXRjaGVkIGEgZ2l2ZW4KQEAgLTEwOCw2ICsxMDgsNSBAQAogICAgICAqIAogICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBpbnQgc3RhcnQoaW50IGdyb3VwKTsKLQorICAgIGludCBzdGFydChpbnQgZ3JvdXApOwogfQpkaWZmIC0tZ2l0IGEvcmVnZXgvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlci5qYXZhIGIvcmVnZXgvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlci5qYXZhCmluZGV4IGE2NTk3N2EuLmUzZTQ4NzQgMTAwNjQ0Ci0tLSBhL3JlZ2V4L3NyYy9tYWluL2phdmEvamF2YS91dGlsL3JlZ2V4L01hdGNoZXIuamF2YQorKysgYi9yZWdleC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9NYXRjaGVyLmphdmEKQEAgLTc2NSw5ICs3NjUsMTQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKG5hdGl2ZVBhdHRlcm4gIT0gMCkgewotICAgICAgICAgICAgTmF0aXZlUmVnRXguY2xvc2UobmF0aXZlUGF0dGVybik7CisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYXR0ZXJuICE9IDApIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVSZWdFeC5jbG9zZShuYXRpdmVQYXR0ZXJuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9yZWdleC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuLmphdmEgYi9yZWdleC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuLmphdmEKaW5kZXggODhiZTc3Yi4uYzA1OGRiOCAxMDA2NDQKLS0tIGEvcmVnZXgvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvUGF0dGVybi5qYXZhCisrKyBiL3JlZ2V4L3NyYy9tYWluL2phdmEvamF2YS91dGlsL3JlZ2V4L1BhdHRlcm4uamF2YQpAQCAtNDU1LDkgKzQ1NSwxNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBpZiAobU5hdGl2ZVBhdHRlcm4gIT0gMCkgewotICAgICAgICAgICAgTmF0aXZlUmVnRXguY2xvc2UobU5hdGl2ZVBhdHRlcm4pOworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobU5hdGl2ZVBhdHRlcm4gIT0gMCkgeworICAgICAgICAgICAgICAgIE5hdGl2ZVJlZ0V4LmNsb3NlKG1OYXRpdmVQYXR0ZXJuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3JlZ2V4L3NyYy9tYWluL2phdmEvamF2YS91dGlsL3JlZ2V4L3BhY2thZ2UuaHRtbCBiL3JlZ2V4L3NyYy9tYWluL2phdmEvamF2YS91dGlsL3JlZ2V4L3BhY2thZ2UuaHRtbAppbmRleCAxYTFlNjUzLi4wNTA4ZjNlIDEwMDY0NAotLS0gYS9yZWdleC9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9wYWNrYWdlLmh0bWwKKysrIGIvcmVnZXgvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvcGFja2FnZS5odG1sCkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgICBbYV0KICAgICAgICAgPC90ZD4KICAgICAgICAgPHRkPgotICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgc2V0IGNvbnNpc3Rpbmcgb2YgdGhlIGxldHRlciAneCcgb25seS4KKyAgICAgICAgICBUaGUgY2hhcmFjdGVyIHNldCBjb25zaXN0aW5nIG9mIHRoZSBsZXR0ZXIgJ2EnIG9ubHkuCiAgICAgICAgIDwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgICAgIDwvdGQ+CiAgICAgICAgIDx0ZD4KICAgICAgICAgICBUaGUgY2hhcmFjdGVyIHNldCBjb25zaXN0aW5nIG9mIHRoZSBsZXR0ZXJzICd4JywgJ3knLCBhbmQgJ3onLAotICAgICAgICAgIGRlc2NyaWJlZCBieSBleHBsaWNpdCBlbm1lcmF0aW9uLgorICAgICAgICAgIGRlc2NyaWJlZCBieSBleHBsaWNpdCBlbnVtZXJhdGlvbi4KICAgICAgICAgPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+CkBAIC01MjgsOCArNTI4LDggQEAKICAgICAgICAgPC90ZD4KICAgICAgICAgPHRkPgogICAgICAgICAgIFRoZSBQb3NpeCBzZXQgd2l0aCB0aGUgc3BlY2lmaWVkIE5BTUUgKFxwe30pIG9yIHRoZSBvcHBvc2l0ZQotICAgICAgICAgIG9mIGl0IChcUHt9KS0gTGVnYWwgdmFsdWVzIGZvciBOQU1FIGFyZSAnQWxudW0nLCAnQWxwaGEnLCAnQVNDSUknLAotICAgICAgICAgICdCbGFuaycsICdDbnRybCcsICdEaWdpdCcsICdHcmFwaCcsICdMb3dlcicsICdQcmludCcsICdQcnVuY3QnLAorICAgICAgICAgIG9mIGl0IChcUHt9KSAtIExlZ2FsIHZhbHVlcyBmb3IgTkFNRSBhcmUgJ0FsbnVtJywgJ0FscGhhJywgJ0FTQ0lJJywKKyAgICAgICAgICAnQmxhbmsnLCAnQ250cmwnLCAnRGlnaXQnLCAnR3JhcGgnLCAnTG93ZXInLCAnUHJpbnQnLCAnUHVuY3QnLAogICAgICAgICAgICdVcHBlcicsICdYRGlnaXQnIC4KICAgICAgICAgPC90ZD4KICAgICAgIDwvdHI+CmRpZmYgLS1naXQgYS9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjJUZXN0LmphdmEgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjJUZXN0LmphdmEKaW5kZXggOGNkODg0MS4uYTE1YWRhZSAxMDA2NDQKLS0tIGEvcmVnZXgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS91dGlsL3JlZ2V4L01hdGNoZXIyVGVzdC5qYXZhCisrKyBiL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9NYXRjaGVyMlRlc3QuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RTdGF0dXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwpAQCAtMzIsOCArMzIsOCBAQAogcHVibGljIGNsYXNzIE1hdGNoZXIyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0b1N0cmluZygpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgdG9TdHJpbmcoKSBtZXRob2QuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KQEAgLTQ1LDggKzQ1LDggQEAKICAgICB9CiAgICAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBzdGFydCwgZW5kLCBncm91cCwgdXNlUGF0dGVybiBtZXRob2RzICIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc3RhcnQsIGVuZCwgZ3JvdXAsIHVzZVBhdHRlcm4gbWV0aG9kcyAiICsKICAgICAgICAgICAgICAgICAgICAgIndpdGggd3JvbmcgY29uZGl0aW9ucywgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHNob3VsZCBiZSAiICsKICAgICAgICAgICAgICAgICAgICAgInRocm93biIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInN0YXJ0IiwgCkBAIC0xMTcsOCArMTE3LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBlbmQsIHN0YXJ0LCBncm91cCBtZXRob2RzIHdpdGggd3JvbmcgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBlbmQsIHN0YXJ0LCBncm91cCBtZXRob2RzIHdpdGggd3JvbmcgIiArCiAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb25zLCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiICsKICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic3RhcnQiLCAKQEAgLTI2OSw4ICsyNjksOCBAQAogICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS05OTcKICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGF0IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIiArCiAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIGNhbGxpbmcgb2YgcmVwbGFjZUFsbCAiICsKICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCB3aXRoIGluY29ycmVjdCBzdHJpbmcuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVwbGFjZUFsbCIsIApkaWZmIC0tZ2l0IGEvcmVnZXgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS91dGlsL3JlZ2V4L01hdGNoZXJUZXN0LmphdmEgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlclRlc3QuamF2YQppbmRleCAxODdjMWU1Li45MWRhOWU0IDEwMDY0NAotLS0gYS9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlclRlc3QuamF2YQorKysgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlclRlc3QuamF2YQpAQCAtMjAsNyArMjAsNyBAQAogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RTdGF0dXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwpAQCAtNDIsOSArNDIsOSBAQAogICAgICAgICAgICAgIigoKGEpfChiKSkqKWFhYmIiLCAiKCgoYSl8KGIpKSopYWEoYiliIiwgIigoKGEpfChiKSkqKWEoYShiKWIpIiB9OwogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgYXBwZW5kUmVwbGFjZW1lbnQoU3RyaW5nQnVmZmVyIHNiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgIlN0cmluZyByZXBsYWNlbWVudCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBhcHBlbmRSZXBsYWNlbWVudChTdHJpbmdCdWZmZXIgc2IsICIgKworICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIHJlcGxhY2VtZW50KSBtZXRob2QuIERvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiYXBwZW5kUmVwbGFjZW1lbnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7IGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIH0pICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtNjMsOSArNjMsOSBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGFwcGVuZFJlcGxhY2VtZW50KFN0cmluZ0J1ZmZlciBzYiwgIiArCi0gICAgICAgICAgICAgICAgICAgICJTdHJpbmcgcmVwbGFjZW1lbnQpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXBwZW5kUmVwbGFjZW1lbnQoU3RyaW5nQnVmZmVyIHNiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIlN0cmluZyByZXBsYWNlbWVudCkgbWV0aG9kLiBEb2VzblwndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJhcHBlbmRSZXBsYWNlbWVudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHsgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgfSkgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC04NCw4ICs4NCw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgcmVwbGFjZUFsbChTdHJpbmcgcmVwbGFjZW1lbnQpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcmVwbGFjZUFsbChTdHJpbmcgcmVwbGFjZW1lbnQpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXBsYWNlQWxsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAKICAgICAgICAgICAgIH0KQEAgLTEwNCw4ICsxMDQsOCBAQAogICAgICAqIHRlc3QgcmVzZXQoU3RyaW5nKSBtZXRob2QuCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIHJlc2V0KENoYXJTZXF1ZW5jZSBpbnB1dCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIHJlc2V0KENoYXJTZXF1ZW5jZSBpbnB1dCkgbWV0aG9kLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlc2V0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KQEAgLTEyNSw5ICsxMjUsMTAgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBhcHBlbmRSZXBsYWNlbWVudChTdHJpbmdCdWZmZXIgc2IsICIgKwotICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIHJlcGxhY2VtZW50KSBtZXRob2Qgd2l0aCBzdHJpbmcgb2Ygc2xhc2hlcyBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXBwZW5kUmVwbGFjZW1lbnQoU3RyaW5nQnVmZmVyIHNiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIlN0cmluZyByZXBsYWNlbWVudCkgbWV0aG9kIHdpdGggc3RyaW5nIG9mIHNsYXNoZXMgYXMgYSBwYXJhbWV0ZXIuIiArCisgICAgICAgICAgICAgICAgICAgICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImFwcGVuZFJlcGxhY2VtZW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcyB9KSAgICAgICAgICAgICAgICAgICAgICAgICAKQEAgLTE0NSw4ICsxNDYsOCBAQAogCiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHJlcGxhY2VGaXJzdChTdHJpbmcgcmVwbGFjZW1lbnQpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcmVwbGFjZUZpcnN0KFN0cmluZyByZXBsYWNlbWVudCkgbWV0aG9kLiAiLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXBsYWNlRmlyc3QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pIAogICAgICAgICAgICAgfQpAQCAtMTYwLDggKzE2MSw4IEBACiAgICAgICAgIGFzc2VydEVxdWFscygienp6Y2F0enp6ZG9nenp6IiwgbWF0LnJlcGxhY2VGaXJzdCgiY2F0IikpOwogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBwYXR0ZXJuKCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcGF0dGVybigpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJwYXR0ZXJuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCiAgICAgICAgICAgICB9CkBAIC0xODMsOCArMTg0LDggQEAKICAgICAgKiB0ZXN0IHJlc2V0KCkgbWV0aG9kLgogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSByZXNldCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSByZXNldCgpIG1ldGhvZC4gIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVzZXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0yMDQsOCArMjA1LDggQEAKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBTdHJpbmcgZ3JvdXAoaW50KQogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGdyb3VwKGludCBncm91cCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBncm91cChpbnQgZ3JvdXApIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJncm91cCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHsgaW50LmNsYXNzIH0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KQEAgLTI1NCw4ICsyNTUsOCBAQAogCiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGdyb3VwKCkgYW5kIGdyb3VwKGludCBncm91cCkgbWV0aG9kcy4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ3JvdXAoKSBhbmQgZ3JvdXAoaW50IGdyb3VwKSBtZXRob2RzLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdyb3VwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pLAogICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJncm91cCIsIApAQCAtMjg5LDggKzI5MCw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgZ3JvdXAoaW50IGdyb3VwKSBtZXRob2QuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdyb3VwKGludCBncm91cCkgbWV0aG9kLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdyb3VwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBpbnQuY2xhc3MgfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfQpAQCAtMzA4LDggKzMwOSw4IEBACiAgICAgICogdGVzdCBoYXNBbmNob3JpbmdCb3VuZHMoKSBtZXRob2QuCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhhdCBoYXNBbmNob3JpbmdCb3VuZHMgbWV0aG9kIHJldHVybnMiICsKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0FuY2hvcmluZ0JvdW5kcyBtZXRob2QgcmV0dXJucyIgKwogICAgICAgICAgICAgICAgICAgICAiIGNvcnJlY3QgdmFsdWUuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiaGFzQW5jaG9yaW5nQm91bmRzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMzM4LDEwICszMzksMTAgQEAKICAgICAgKiB0ZXN0IGhhc1RyYW5zcGFyZW50Qm91bmRzKCkgbWV0aG9kLgogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoYXQgaGFzVHJhbnNwYXJlbnRCb3VuZCBtZXRob2QgcmV0dXJucyIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaGFzVHJhbnNwYXJlbnRCb3VuZCBtZXRob2QgcmV0dXJucyIgKwogICAgICAgICAgICAgICAgICAgICAiIGNvcnJlY3QgdmFsdWUuIiwKLSAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiaGFzVHJhbnNwYXJlbnRCb3VuZCIsIAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJoYXNUcmFuc3BhcmVudEJvdW5kcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KICAgICApICAKQEAgLTM2OCw4ICszNjksOCBAQAogICAgICAqIHRlc3Qgc3RhcnQoaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIHN0YXJ0KGludCBncm91cCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgc3RhcnQoaW50IGdyb3VwKSBtZXRob2QuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic3RhcnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC00MDEsOCArNDAyLDggQEAKICAgICAgKiB0ZXN0IGVuZChpbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiBlbmQoaW50IGdyb3VwKSBtZXRob2QuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIGVuZChpbnQgZ3JvdXApIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJlbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC00MjksOCArNDMwLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBtYXRjaGVzKCkgbWV0aG9kIGluIG1pc2NlbGxhbmVvdXMgY2FzZXMuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1hdGNoZXMoKSBtZXRob2QgaW4gbWlzY2VsbGFuZW91cyBjYXNlcy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KQEAgLTQ2NCw4ICs0NjUsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlN0cmVzcyB0ZXN0IGZvciBtYXRjaGVzKCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJTdHJlc3MgdGVzdCBmb3IgbWF0Y2hlcygpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KQEAgLTUxMCw4ICs1MTEsOCBAQAogICAgICAgICB9CiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIG1hdGNoZXMoKSBhbmQgZ3JvdXAoaW50IGdyb3VwKSBtZXRob2RzIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtYXRjaGVzKCkgYW5kIGdyb3VwKGludCBncm91cCkgbWV0aG9kcyIgKwogICAgICAgICAgICAgICAgICAgICAiIGZvciBzcGVjaWZpYyBwYXR0ZXJuLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hdGNoZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSksCkBAIC01NDAsOCArNTQxLDggQEAKICAgICAgKiB0ZXN0IGxvb2tpbmdBdCgpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGF0IGxvb2tpbmdBdCgpIG1ldGhvZCByZXR1cm5zIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBsb29raW5nQXQoKSBtZXRob2QgcmV0dXJucyIgKwogICAgICAgICAgICAgICAgICAgICAiIGNvcnJlY3QgdmFsdWUuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibG9va2luZ0F0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtNTY1LDggKzU2Niw4IEBACiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgYm9vbGVhbiBmaW5kKCkKICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGF0IGZpbmQoKSBtZXRob2QgcmV0dXJucyIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBmaW5kKCkgbWV0aG9kIHJldHVybnMiICsKICAgICAgICAgICAgICAgICAgICAgIiBjb3JyZWN0IHZhbHVlLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImZpbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC02MDYsOCArNjA3LDkgQEAKICAgICAgKiB0ZXN0IGZpbmQgKGludCkgbWV0aG9kLiBDcmVhdGVkIHZpYSBtb2RpZnlpbmcgbWV0aG9kIGZvciBmaW5kCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgZmluZChpbnQgc3RhcnQpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgZmluZChpbnQgc3RhcnQpICIgKworICAgICAgICAgICAgICAgICAgICAibWV0aG9kLiBEb2Vzbid0IHZlcmlmeSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImZpbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC02NDgsOSArNjUwLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBtYXRjaGVzKCkgbWV0aG9kIGZvciBwcmVkZWZpbmVkICIgKwotICAgICAgICAgICAgICAgICAgICAiY2hhcmFjdGVycyBpbiBzZXF1ZW5jZS4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWF0Y2hlcygpIG1ldGhvZCBmb3IgcHJlZGVmaW5lZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZXBsYWNlRmlyc3QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pIAogICAgICAgICAgICAgfQpAQCAtNjY3LDggKzY2OCw4IEBACiAgICAgICogdGVzdCBzdGFydCgpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgc3RhcnQoKSBtZXRob2QuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBzdGFydCgpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzdGFydCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KQEAgLTY5Nyw4ICs2OTgsOCBAQAogICAgICAqIHRlc3QgZW5kKCkgbWV0aG9kLgogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIGVuZCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgZW5kKCkgbWV0aG9kLiAiLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJlbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC03MjIsOCArNzIzLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBncm91cENvdW50KCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ3JvdXBDb3VudCgpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJncm91cENvdW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC03MzcsOCArNzM4LDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBtYXRjaGVzKCkgYW5kIGdyb3VwKGludCBncm91cCkgbWV0aG9kcyIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWF0Y2hlcygpIGFuZCBncm91cChpbnQgZ3JvdXApIG1ldGhvZHMiICsKICAgICAgICAgICAgICAgICAgICAgIiBmb3Igc3BlY2lmaWMgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pLApAQCAtNzU3LDggKzc1OCw4IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgZmluZCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZmluZCgpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmaW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfQpAQCAtNzc0LDggKzc3NSw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5UT0RPLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgbWF0Y2hlcyBtZXRob2QgZm9yIGlucHV0IHNlcXVlbmNlICIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWF0Y2hlcyBtZXRob2QgZm9yIGlucHV0IHNlcXVlbmNlICIgKwogICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIGJ5IFVSTC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtODIxLDggKzgyMiw4IEBACiAKICAgICB9CiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5UT0RPLAotICAgICAgICAgICAgbm90ZXMgPSAiVE9ETyB0aGVyZSBpcyBubyBhbnkgdGVzdGluZy4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVE9ETyB0aGVyZSBpcyBubyBhbnkgdGVzdGluZy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC04MzcsOCArODM4LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUT0RPIHRoZXJlIGlzIG5vIGFueSB0ZXN0aW5nLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJET2Vzbid0IHZlcmlmeSBhbnl0aGluZy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC04NTEsOCArODUyLDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBtYXRjaGVzKCkgbWV0aG9kIGZvciAiICsKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1hdGNoZXMoKSBtZXRob2QgZm9yICIgKwogICAgICAgICAgICAgICAgICAgICAiY29tcG9zaXRlIHBhdHRlcm4gZ3JvdXBzLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hdGNoZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC04NzksOCArODgwLDggQEAKIAogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyAgbWF0Y2hlcygpIG1ldGhvZCBmb3Igc3BlY2lmaWMgcGF0dGVybnMuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzICBtYXRjaGVzKCkgbWV0aG9kIGZvciBzcGVjaWZpYyBwYXR0ZXJucy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCiAgICAgICAgICAgICB9CkBAIC05MDUsOCArOTA2LDggQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShQYXR0ZXJuLm1hdGNoZXMoIihhYXxiYik/K2JiIiwgImFhYmIiKSk7CiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIG1hdGNoZXMoKSBhbmQgZ3JvdXAoaW50IGdyb3VwKSBtZXRob2RzIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtYXRjaGVzKCkgYW5kIGdyb3VwKGludCBncm91cCkgbWV0aG9kcyIgKwogICAgICAgICAgICAgICAgICAgICAiIGZvciBzcGVjaWZpYyBwYXR0ZXJuLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hdGNoZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSksCkBAIC05MjgsOCArOTI5LDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBtYXRjaGVzKCkgYW5kIGdyb3VwKGludCBncm91cCkgbWV0aG9kcyIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWF0Y2hlcygpIGFuZCBncm91cChpbnQgZ3JvdXApIG1ldGhvZHMiICsKICAgICAgICAgICAgICAgICAgICAgIiBmb3Igc3BlY2lmaWMgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pLApAQCAtOTU0LDggKzk1NSw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgbWF0Y2hlcygpIG1ldGhvZCBmb3IgY2FzZSBpbnNlbnNpdGl2ZSAiICsKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1hdGNoZXMoKSBtZXRob2QgZm9yIGNhc2UgaW5zZW5zaXRpdmUgIiArCiAgICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hdGNoZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtOTc3LDggKzk3OCw5IEBACiAKICAgICB9CiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgcXVvdGVSZXBsYWNlbWVudChTdHJpbmcgcykgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBxdW90ZVJlcGxhY2VtZW50KFN0cmluZyBzKSBtZXRob2QuICIgKworICAgICAgICAgICAgICAgICAgICAiRG9lc24ndCBjaGVjayBuZWdhdGl2ZSBjYXNlcy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJxdW90ZVJlcGxhY2VtZW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAKICAgICAgICAgICAgIH0KQEAgLTk4OCw4ICs5OTAsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIG1hdGNoZXMoKSBhbmQgZ3JvdXAoaW50IGdyb3VwKSBtZXRob2RzLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtYXRjaGVzKCkgYW5kIGdyb3VwKGludCBncm91cCkgbWV0aG9kcy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pLAogICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJncm91cCIsIApAQCAtMTAyMiw4ICsxMDI0LDkgQEAKIAogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCBkb2Vzbid0IHZlcmlmeSBNYXRjaGVyIGFuZCBzaG91bGQgYmUgbW92ZWQgdG8gUGF0dGVyVGVzdCIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCBkb2Vzbid0IHZlcmlmeSBNYXRjaGVyIGFuZCBzaG91bGQgYmUgbW92ZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ0byBQYXR0ZXJUZXN0IiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHsgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzIH0pIApAQCAtMTAzOCw4ICsxMDQxLDkgQEAKIAogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCBkb2Vzbid0IHZlcmlmeSBNYXRjaGVyIGFuZCBzaG91bGQgYmUgbW92ZWQgdG8gUGF0dGVyVGVzdCIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBNYXRjaGVyIGFuZCBzaG91bGQgYmUgbW92ZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ0byBQYXR0ZXJUZXN0IiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHsgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzIH0pIApAQCAtMTA3Myw4ICsxMDc3LDkgQEAKIAogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCBkb2Vzbid0IHZlcmlmeSBNYXRjaGVyIGFuZCBzaG91bGQgYmUgbW92ZWQgdG8gUGF0dGVyVGVzdCIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCBkb2Vzbid0IHZlcmlmeSBNYXRjaGVyIGFuZCBzaG91bGQgYmUgbW92ZWQgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICJQYXR0ZXJUZXN0LiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNwbGl0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyB9KSAKQEAgLTEwOTAsOCArMTA5NSw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhhdCBmaW5kKCkgbWV0aG9kIHdvcmtzIGNvcnJlY3RseSAiICsKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZmluZCgpIG1ldGhvZCB3b3JrcyBjb3JyZWN0bHkgIiArCiAgICAgICAgICAgICAgICAgICAgICJ3aXRoICQgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmaW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMTEwNyw4ICsxMTEyLDggQEAKICAgICAgKiBWZXJpZnkgaWYgdGhlIE1hdGNoZXIgY2FuIG1hdGNoIHRoZSBpbnB1dCB3aGVuIHJlZ2lvbiBpcyBjaGFuZ2VkCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgbWF0Y2hlcygpIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24uIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1hdGNoZXMoKSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIm1hdGNoZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfQpAQCAtMTEyNiw4ICsxMTMxLDggQEAKICAgICAvLyBUZXN0IHRvb2sgYWdlcywgbm93IGdvaW5nIGluIHN0ZXBzIG9mIDE2IGNvZGUgcG9pbnRzIHRvIHNwZWVkIHRoaW5ncyB1cC4KICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5UT0RPLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHN0cmVzcyB0ZXN0IGZvciBtYXRjaGVzKFN0cmluZyByZWdleCkgbWV0aG9kIGZyb20gU3RyaW5nIGNsYXNzLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgc3RyZXNzIHRlc3QgZm9yIG1hdGNoZXMoU3RyaW5nIHJlZ2V4KSBtZXRob2QgZnJvbSBTdHJpbmcgY2xhc3MuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xMTcxLDggKzExNzYsOCBAQAogICAgICAqIFZlcmlmeSBpZiB0aGUgTWF0Y2hlciBiZWhhdmVzIGNvcnJlY3Qgd2hlbiByZWdpb24gaXMgY2hhbmdlZAogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGZpbmQoKSBtZXRob2QgZm9yIHNwZWNpZmllZCByZWdpb24gaW4gIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmaW5kKCkgbWV0aG9kIGZvciBzcGVjaWZpZWQgcmVnaW9uIGluICIgKwogICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgY2FzZS4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmaW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMTE5Nyw4ICsxMjAyLDggQEAKICAgICAgKiBjaGFuZ2VkCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgZmluZCgpIG1ldGhvZCBmb3Igc3BlY2lmaWVkIHJlZ2lvbiBpbiAiICsKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGZpbmQoKSBtZXRob2QgZm9yIHNwZWNpZmllZCByZWdpb24gaW4gIiArCiAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBjYXNlLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImZpbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xMjIwLDggKzEyMjUsOCBAQAogICAgICAqIHRlc3QgcXVvdGVSZXBsYWNlbWVudChTdHJpbmcpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgcXVvdGVSZXBsYWNlbWVudChTdHJpbmcgcykgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgcXVvdGVSZXBsYWNlbWVudChTdHJpbmcgcykgbWV0aG9kLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImxvb2tpbmdBdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xMjQwLDggKzEyNDUsOCBAQAogICAgICAqIHRlc3QgcmVnaW9uU3RhcnQoKSBtZXRob2QuCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIHJlZ2lvblN0YXJ0KCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIHJlZ2lvblN0YXJ0KCkgbWV0aG9kLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlZ2lvblN0YXJ0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfQpAQCAtMTI2NCw4ICsxMjY5LDggQEAKICAgICAgKiB0ZXN0IHJlZ2lvbkVuZCgpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgcmVnaW9uRW5kKCkgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIHJlZ2lvbkVuZCgpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJyZWdpb25FbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xMjg4LDggKzEyOTMsOCBAQAogICAgICAqIHRlc3QgdG9NYXRjaFJlc3VsdCgpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgdG9NYXRjaFJlc3VsdCBtZXRob2QuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgdG9NYXRjaFJlc3VsdCBtZXRob2QuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidG9NYXRjaFJlc3VsdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KQEAgLTEzMTYsOCArMTMyMSw4IEBACiAgICAgICogdGVzdCB1c2VQYXR0ZXJuKFBhdHRlcm4gbmV3UGF0dGVybikgbWV0aG9kLgogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSB1c2VQYXR0ZXJuKFBhdHRlcm4gbmV3UGF0dGVybikgbWV0aG9kLiIsCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgdXNlUGF0dGVybihQYXR0ZXJuIG5ld1BhdHRlcm4pIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ1c2VQYXR0ZXJuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xMzQzLDkgKzEzNDgsMTEgQEAKICAgICAgKiB0ZXN0IHVzZUFjaG9yaW5nQm91bmRzKCkgbWV0aG9kLgogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHVzZUFuY2hvcmluZ0JvdW5kcyBtZXRob2QuIiwKLSAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiIHVzZUFuY2hvcmluZ0JvdW5kcyIsIAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdXNlQW5jaG9yaW5nQm91bmRzIG1ldGhvZC4gIiArCisgICAgICAgICAgICAgICAgICAgICJUaGUgc2FtZSB2ZXJpZmljYXRpb24gaW4gYXNzZXJ0IG1ldGhvZHMgZm9yIGRpZmZlcmVudCAiICsKKyAgICAgICAgICAgICAgICAgICAgImNhc2VzLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInVzZUFuY2hvcmluZ0JvdW5kcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CiAgICAgKSAgICAKQEAgLTEzNjksOCArMTM3Niw4IEBACiAgICAgICogdGVzdCB1c2VUcmFuc3BhcmVudEJvdW5kcygpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgdXNlVHJhbnNwYXJlbnRCb3VuZHMoYm9vbGVhbiBiKSBtZXRob2QuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgdXNlVHJhbnNwYXJlbnRCb3VuZHMoYm9vbGVhbiBiKSBtZXRob2QuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAidXNlVHJhbnNwYXJlbnRCb3VuZHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfQpAQCAtMTQwNiw5ICsxNDEzLDkgQEAKICAgICAgKiB0ZXN0IGhpdEVuZCgpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGF0IGhpdEVuZCgpIG1ldGhvZCByZXR1cm5zIiArCi0gICAgICAgICAgICAgICAgICAgICIgY29ycmVjdCB2YWx1ZS4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaGl0RW5kKCkgbWV0aG9kIHJldHVybnMiICsKKyAgICAgICAgICAgICAgICAgICAgIiBjb3JyZWN0IHZhbHVlLiAiLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJoaXRFbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xNDMwLDggKzE0MzcsOCBAQAogICAgICAqIHRlc3QgcmVxdWlyZUVuZCgpIG1ldGhvZC4KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgcmVxdWlyZUVuZCgpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSByZXF1aXJlRW5kKCkgbWV0aG9kLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlcXVpcmVFbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xNDU4LDggKzE0NjUsOCBAQAogICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS02NzQKICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJTcGVjaWFsIHJlZ3Jlc3Npb24gdGVzdCBmb3IgbWF0Y2hlcygpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiU3BlY2lhbCByZWdyZXNzaW9uIHRlc3QgZm9yIG1hdGNoZXMoKSBtZXRob2QuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcmVnZXgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS91dGlsL3JlZ2V4L01vZGVUZXN0LmphdmEgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTW9kZVRlc3QuamF2YQppbmRleCA0M2U0MzczLi5lMDExMjJkIDEwMDY0NAotLS0gYS9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTW9kZVRlc3QuamF2YQorKysgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvTW9kZVRlc3QuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RTdGF0dXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwpAQCAtMzMsOCArMzMsOCBAQAogQFRlc3RUYXJnZXRDbGFzcyhQYXR0ZXJuLmNsYXNzKQogcHVibGljIGNsYXNzIE1vZGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBhbmQgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCB2ZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgYW5kICIgKwogICAgICAgICAgICAgICAgICAgICAiY29tcGlsZShTdHJpbmcgcmVnZXgsIGludCBmbGFncykgbWV0aG9kcyB3aXRoICIgKwogICAgICAgICAgICAgICAgICAgICAiUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIG1vZGUuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsIApAQCAtNzMsOCArNzMsOCBAQAogICAgICAgICBhc3NlcnRGYWxzZShtLmZpbmQoKSk7CiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBhbmQgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCB2ZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgYW5kICIgKwogICAgICAgICAgICAgICAgICAgICAiY29tcGlsZShTdHJpbmcgcmVnZXgsIGludCBmbGFncykgbWV0aG9kcyB3aXRoICIgKwogICAgICAgICAgICAgICAgICAgICAiUGF0dGVybi5NVUxUSUxJTkUgbW9kZS4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCmRpZmYgLS1naXQgYS9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUGF0dGVybjJUZXN0LmphdmEgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUGF0dGVybjJUZXN0LmphdmEKaW5kZXggZDVmZDQyNS4uNjZiMDA1NiAxMDA2NDQKLS0tIGEvcmVnZXgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS91dGlsL3JlZ2V4L1BhdHRlcm4yVGVzdC5qYXZhCisrKyBiL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuMlRlc3QuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RTdGF0dXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOwogCiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CkBAIC0zNCw4ICszNCw4IEBACiBwdWJsaWMgY2xhc3MgUGF0dGVybjJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzICIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgIiArCiAgICAgICAgICAgICAgICAgICAgICJtYXRjaGVzKFN0cmluZyByZWdleCwgQ2hhclNlcXVlbmNlIGlucHV0KSBtZXRob2QuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHsgamF2YS5sYW5nLlN0cmluZy5jbGFzcywKQEAgLTYzLDggKzYzLDggQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShQYXR0ZXJuLm1hdGNoZXMoIiIsICIiKSk7CiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBtZXRob2QgYW5kIG1hdGNoZXIgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgbWV0aG9kIGFuZCBtYXRjaGVyICIgKwogICAgICAgICAgICAgICAgICAgICAiZm9yIGNyZWF0ZWQgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTEyNyw4ICsxMjcsOCBAQAogICAgICAgICB9CiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBtZXRob2QgYW5kIG1hdGNoZXIgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgbWV0aG9kIGFuZCBtYXRjaGVyICIgKwogICAgICAgICAgICAgICAgICAgICAiZm9yIGNyZWF0ZWQgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTE5MCw4ICsxOTAsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBtZXRob2QgYW5kIG1hdGNoZXIgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgbWV0aG9kIGFuZCBtYXRjaGVyICIgKwogICAgICAgICAgICAgICAgICAgICAiZm9yIGNyZWF0ZWQgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTI0Nyw4ICsyNDcsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBtZXRob2QgYW5kIG1hdGNoZXIgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgbWV0aG9kIGFuZCBtYXRjaGVyICIgKwogICAgICAgICAgICAgICAgICAgICAiZm9yIGNyZWF0ZWQgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTQ1Myw4ICs0NTMsOCBAQAogLy8gICAgICAgIH0KICAgICB9CiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgcGF0dGVybnMgd2l0aCBkaWZmZXJlbnQgcmFuZ2VzIG9mIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBhdHRlcm5zIHdpdGggZGlmZmVyZW50IHJhbmdlcyBvZiBjaGFyYWN0ZXJzLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLAogICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVyIiwgCkBAIC03MjgsOCArNzI4LDggQEAKICAgICAgICAgLy8gVE9ETwogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgbWV0aG9kIGFuZCBtYXRjaGVyICIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29tcGlsZShTdHJpbmcgcmVnZXgpIG1ldGhvZCBhbmQgbWF0Y2hlciAiICsKICAgICAgICAgICAgICAgICAgICAgImZvciBwYXR0ZXJucyB3aXRoIFBPU0lYIGNoYXJhY3RlcnMuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSksCkBAIC04ODAsOCArODgwLDggQEAKICAgICAgICAgLy8gVE9ETwogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUT0RPIGVtcHR5IHRlc3QuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIlRPRE8gZW1wdHkgdGVzdC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkKICAgICAgICAgICAgICAgIH0KQEAgLTkzNCw4ICs5MzQsOCBAQAogICAgICAgICAvLyBDbgogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBtYXRjaGVyKENoYXJTZXF1ZW5jZSBpbnB1dCkgbWV0aG9kICIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWF0Y2hlcihDaGFyU2VxdWVuY2UgaW5wdXQpIG1ldGhvZCAiICsKICAgICAgICAgICAgICAgICAgICAgImZvciBpbnB1dCBzcGVjaWZpZWQgYnkgVW5pY29kZSBibG9ja3MuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHsgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzcyB9KQpAQCAtMTAxMSw4ICsxMDExLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUT0RPIGVtcHR5IHRlc3QiLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVE9ETyBlbXB0eSB0ZXN0IiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xMDM0LDggKzEwMzQsOCBAQAogICAgICAgICAvLyBUT0RPCiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgIG5vdGVzID0gIlRPRE8gZW1wdHkgdGVzdC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVE9ETyBlbXB0eSB0ZXN0LiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gIiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KQogICAgICAgICAgICAgfQpAQCAtMTA2MCw4ICsxMDYwLDggQEAKICAgICAgICAgLy8gVE9ETwogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICBub3RlcyA9ICJUT0RPIGVtcHR5IHRlc3QiLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVE9ETyBlbXB0eSB0ZXN0IiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xMTA0LDggKzExMDQsOCBAQAogICAgICAgICAvLyBUT0RPCiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBtZXRob2QgYW5kIG1hdGNoZXIgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgbWV0aG9kIGFuZCBtYXRjaGVyICIgKwogICAgICAgICAgICAgICAgICAgICAiZm9yIGNyZWF0ZWQgcGF0dGVybi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTExNzMsOCArMTE3Myw4IEBACiAgICAgICAgIC8vIFRPRE8KICAgICB9CiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgY29tcGlsZShTdHJpbmcgcmVnZXgpIG1ldGhvZC4iLAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29tcGlsZShTdHJpbmcgcmVnZXgpIG1ldGhvZC4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KQogICAgICAgICAgICAgfQpAQCAtMTE4Niw4ICsxMTg2LDggQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShwYXR0ZXJuLm1hdGNoZXIobmFtZSkubWF0Y2hlcygpKTsKICAgICB9CiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgY29tcGlsZShTdHJpbmcgcmVnZXgsIGludCBmbGFnKSBtZXRob2QuIiwKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4LCBpbnQgZmxhZykgbWV0aG9kLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzc30pCkBAIC0xMjAzLDkgKzEyMDMsOSBAQAogICAgICAgICBhc3NlcnRUcnVlKG1hdGNoZXIuZmluZCgwKSk7CiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBhbmQgIiArCi0gICAgICAgICAgICAgICAgICAgICJjb21waWxlKFN0cmluZyByZWdleCwgaW50IGZsYWcpIG1ldGhvZCBmb3IiICsKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICJjb21waWxlKFN0cmluZyByZWdleCwgaW50IGZsYWcpIG1ldGhvZCBmb3IgIiArCiAgICAgICAgICAgICAgICAgICAgICJzcGVjaWZpYyBwYXR0ZXJucy4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIH0pLApAQCAtMTI5Niw4ICsxMjk2LDggQEAKICAgICAgICAgYXNzZXJ0RmFsc2UobS5maW5kKCkpOwogICAgIH0KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCwgaW50IGZsYWcpIG1ldGhvZCIgKworICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29tcGlsZShTdHJpbmcgcmVnZXgsIGludCBmbGFnKSBtZXRob2QgIiArCiAgICAgICAgICAgICAgICAgICAgICJmb3Igc3BlY2lmaWMgc3RyaW5nLiIsCiAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgCkBAIC0xMzI2LDggKzEzMjYsOCBAQAogICAgICAgICBhc3NlcnRGYWxzZShmb3VuZCk7CiAgICAgfQogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBtZXRob2QiICsKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBtZXRob2QiICsKICAgICAgICAgICAgICAgICAgICAgImZvciBzcGVjaWZpYyBzdHJpbmcuIiwKICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkKZGlmZiAtLWdpdCBhL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuRXJyb3JUZXN0LmphdmEgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUGF0dGVybkVycm9yVGVzdC5qYXZhCmluZGV4IGI3NTE3MGEuLjNiMWM2ZmMgMTAwNjQ0Ci0tLSBhL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuRXJyb3JUZXN0LmphdmEKKysrIGIvcmVnZXgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS91dGlsL3JlZ2V4L1BhdHRlcm5FcnJvclRlc3QuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RTdGF0dXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOwogCiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtMzEsMTAgKzMxLDExIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYXR0ZXJuRXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIGNvbXBpbGUoU3RyaW5nIHJlZ2V4KSBhbmQgIiArCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb21waWxlKFN0cmluZyByZWdleCkgYW5kICIgKwogICAgICAgICAgICAgICAgICAgICAiY29tcGlsZShTdHJpbmcgcmVnZXgsIGludCBmbGFnKSBtZXRob2Qgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGFyYW1ldGVycy4iLAorICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXJhbWV0ZXJzLiBEb2Vzbid0IHZlcmlmeSAiICsKKyAgICAgICAgICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgUGF0dGVyblN5bnRheEV4Y2VwdGlvbi4iLAogICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0geyBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwgCmRpZmYgLS1naXQgYS9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUGF0dGVyblRlc3QuamF2YSBiL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuVGVzdC5qYXZhCmluZGV4IDdlYjZhOGUuLjUyZTBhODQgMTAwNjQ0Ci0tLSBhL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuVGVzdC5qYXZhCisrKyBiL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuVGVzdC5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOwogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7Ci1pbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFN0YXR1czsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKQEAgLTg2LDggKzg2LDggQEAKIAogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgICBub3RlcyA9ICIiLCB0YXJnZXRzID0ge30gCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgICBwdXJwb3NlID0gIiIsIHRhcmdldHMgPSB7fSAKICAgICAgICAgICAgKSAgICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlcigpIHsKICAgICB9CkBAIC05Niw4ICs5Niw4IEBACiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU3RyaW5nW10gc3BsaXQoQ2hhclNlcXVlbmNlLCBpbnQpCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBzcGxpdCIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBzcGxpdCIgKwogICAgICAgICAgICAgICAgICAgICAgInNwbGl0KGphdmEubGFuZy5TdHJpbmcsIGludCkgbWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzcGxpdCIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgIApAQCAtMTgxLDggKzE4MSw4IEBACiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU3RyaW5nW10gc3BsaXQoQ2hhclNlcXVlbmNlKQogICAgICAqLwogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc3BsaXQiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc3BsaXQiICsKICAgICAgICAgICAgICAgICAgICAgICJzcGxpdChqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNwbGl0IiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgIApAQCAtMjA4LDggKzIwOCw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBwYXR0ZXJuKCkgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBwYXR0ZXJuKCkgbWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJwYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgCiAgICAgICAgICAgICAgfQpAQCAtMjI3LDggKzIyNyw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKICAgICAgICAgICAgICB9CkBAIC0yNjYsOCArMjY2LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSIgKwogICAgICAgICAgICAgICAgICAgICAgIiBtZXRob2QgZm9yIGRpZmZlcmVudCBmbGFncy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKQEAgLTQ0Nyw4ICs0NDcsOCBAQAogICAgICAqLwogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBmbGFncygpIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGZsYWdzKCkiICsKICAgICAgICAgICAgICAgICAgICAgICIgbWV0aG9kIGZvciBkZWZhdWx0IGZsYWdzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJmbGFncyIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgIApAQCAtNDcyLDggKzQ3Miw4IEBACiAgICAgICovCiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZywgaW50KSAmIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZywgaW50KSAmIiArCiAgICAgICAgICAgICAgICAgICAgICAiIGZsYWdzKCkgbWV0aG9kcy4gQ2hlY2tzIHRoYXQgY29wbWlsYXRpb24gd2FzIGNvcmVjdC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZmxhZ3MiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSksCkBAIC00OTksOCArNDk5LDggQEAKICAgICAgKi8KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIgKwogICAgICAgICAgICAgICAgICAgICAgIkNoZWNrcyB0aGF0IGNvcnJlY3QgZXhjZXB0aW9ucyB3ZXJlIHRocm93bi4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKQEAgLTU2Miw4ICs1NjIsOCBAQAogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFBhdHRlcm4gY29tcGlsZShTdHJpbmcpCiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiArCiAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2tzIHRoYXQgY29ycmVjdCBleGNlcHRpb25zIHdlcmUgdGhyb3duLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgIApAQCAtNTkyLDggKzU5Miw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKICAgICAgICAgICAgICB9CkBAIC02MDYsOCArNjA2LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5UT0RPLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoKSBtZXRob2QuIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoKSBtZXRob2QuIiArCiAgICAgICAgICAgICAgICAgICAgICAiIEFsc28gdGVzdGVkIG1ldGhvZHMgZnJvbSBtYXRjaGVyOiBtYXRjaGVzKCksIHN0YXJ0KGludCksIGdyb3VwKGludCkiLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKQEAgLTYyMyw5ICs2MjMsMTAgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIG1hdGNoZXMoamF2YS5sYW5nLlN0cmluZywiICsKLSAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2QuIiwKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCIgKworICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZC4gRG9lc24ndCB2ZXJpZnkgIiArCisgICAgICAgICAgICAgICAgICAgICAiUGF0dGVyblN5bnRheEV4Y2VwdGlvbi4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZS5jbGFzc30pICAgICAgCkBAIC02NjAsOCArNjYxLDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIG1hdGNoZXMoamF2YS5sYW5nLlN0cmluZywiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCIgKwogICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLApAQCAtNjgxLDggKzY4Miw4IEBACiAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKIC8vIFJlbW92ZWQgb25lIHBhdHRlcm4gdGhhdCBpcyBidWdneSBvbiB0aGUgSkRLLiBXZSBkb24ndCB3YW50IHRvIGR1cGxpY2F0ZSB0aGF0LgogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcsIiArCiAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsCkBAIC03MjMsOCArNzI0LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIG1hdGNoZXMoamF2YS5sYW5nLlN0cmluZywiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCIgKwogICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZCBmb3IgcmFuZ2VkIHBhdHRlcm5zLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsCkBAIC03NTUsOCArNzU2LDggQEAKICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIG1hdGNoZXMoamF2YS5sYW5nLlN0cmluZywiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCIgKwogICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAibWF0Y2hlcyIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLApAQCAtNzY4LDggKzc2OSw5IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBtYXRjaGVyKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBtYXRjaGVyKGphdmEubGFuZy5TdHJpbmcpICIgKworICAgICAgICAgICAgICAgICAgICAibWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVyIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgIAogICAgICAgICAgICAgIH0KQEAgLTc4Miw4ICs3ODQsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCiAgICAgICAgICAgICAgfQpAQCAtNzkzLDIwICs3OTUsMjAgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5UT0RPLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgIAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgKSAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBfdGVzdEJ1ZzE4NygpIHsKKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlZF90ZXN0QnVnMTg3KCkgewogICAgICAgICBQYXR0ZXJuCiAgICAgICAgICAgICAgICAgLmNvbXBpbGUoInwoP2lkbXN1eC1pZG1zdXgpfCg/aWRtc3V4LWlkbXN1eCl8W158XFxbLVxcMDI3NHxcXCwtXFxcXFtefFdcXH1cXG5xXFx4NjVcXDAwMlxceEZFXFwwNVxcMDZcXDAwXFx4NjZcXHg0N2lcXCxcXHhGMlxcPVxcMDZcXHUwRUE0XFx4OUJcXHgzQ1xcZlxcfFxce1xceEU1XFwwNVxcclxcdTk0NEFcXHhDQVxcZXxcXHgxOVxcMDRcXHgwN1xcMDRcXHU2MDdCXFwwMjNcXDAwNzNcXHg5MVRyXFwwMTUwXFx4ODNdXT8oP2lkbXN1eC1pZG1zdXg6XFxwe0FscGhhfXs3fT8pfHwoPzw9W15cXHVFQzQ3XFwwMVxcMDJcXHUzNDIxXFxhXFxmXFxhXFwwMTNxXFwwMzV3XFxlXSkoPzw9XFxwe1B1bmN0fXswLH0/KSg/PV5cXHB7TG93ZXJ9KSg/IVxcYns4LDE0fSkoPzwhW3xcXDAwLVxcMDE0NltefFxcMDRcXDAxXFwwNFxcMDYwXFxmXFx1MjI0RE9cXHgxQVxceEM0XFwwMFxcMDJcXDAzMTVcXDAzNTFcXHU4NEE4XFx4Q0J0XFx4Q0NcXDA2fFxcMDE0MVxcMDBcXD1cXGVcXGZcXHg2QlxcMDAyNlRiXFwwNDBcXHg3NnhKJiZbXFxcXC1cXF1cXDA1XFwwN1xcMDJcXHUyREFGXFx0XFx4OUNcXGVcXDAwMjNcXDAyXFwsWFxcZXxcXHU2MDU4ZmxZXFx1OTU0Q11dXXs1fT8pKD88PVxccHtTY317OH0rKVtefFxcMDI2LVxcdTg5QkF8b1xcdTYyNzdcXHRcXDA3XFx4NTAmJlxccHtQdW5jdH1dezgsMTR9KygoPzw9XlxccHtQdW5jdH0pfCg/aWRtc3V4LWlkbXN1eCl8fCg/PltcXHgzRS1cXF1dKXwoP2lkbXN1eC1pZG1zdXg6XFxwe1B1bmN0fSl8KD88IVtcXDAxMTFcXDAzNzFcXHhERlxcdTZBNDlcXDA3XFx1MkE0RFxcMDBcXDAyMTJcXDAyWGQtXFx4RURbXlxcYS1cXDAwNjF8XFwwMjU3XFwwNFxcZlxcW1xcMDI2NlxcMDQzXFwwM1xceDJEXFwwNDImJlteXFxmLVxcXSYmXFxzXV1dKXwoPz5bfFxcblxcMDQyXFx1QjA5RlxcMDZcXHUwRjJCXFx1Qzk2RFxceDg5XFx1QzE2NlxceEFBfFxcMDQtXFxdW158XFxhXFx8XFxyeFxcMDRcXHVBNzcwXFxuXFwwMlxcdFxcMDUyXFwwNTZcXDAyNzRcXHxcXD1cXDA3XFxlfFxcMDAtXFx4MUQmJlteXFwwMDVcXHVCMTVCXFx1Q0RBQ1xcblxceDc0XFwwMTAzXFwwMTQ3XFx1RDkxQlxcblxcMDYyR1xcdTlCNEJcXDA3N1xcfVxcMDMyNCYmW15cXDAzMDJcXCxcXDAyMjFcXDA0XFx1NkQxNlxcMDR4eVxcdUQxOTNcXFtcXDA2MVxcMDZcXDA0NVxceDBGfFxcZVxceEJCXFxmXFx1MUI1MlxcMDIzXFx1M0FEMlxcMDMzXFwwMDdcXDAyMlxcfVxceDY2XFx1QTYzRkotXFwwMzA0XV1dXXswLDB9KXx8KD88IVtefFxcMDE1NFVcXHUwODc3XFwwM1xcZnlcXG5cXHxcXDAxNDdcXDA3LVxcPVt8cVxcdTY5QkVcXDAyNDNcXHJwXFwwNTNcXDAyXFx4MzNJXFx1NUUzOVxcdTlDNDBcXDA1Mi1cXHhCQ1t8XFwwMDY0LVxcP3xcXHVGQzBDXFx4MzBcXDAwNjBcXHg0NVxcXFxcXDAyXFw/cFxceEQ4XFwwMTU1XFwwN1xcMDM2N1xcMDRcXHVGMDdCXFwwMDBKW158XFwwMDUxLVxce3xcXHU5RTRFXFx1NzMyOFxcXVxcdTZBQjhcXDA2XFx4NzFcXGFcXF1cXGVcXHxLTlxcdTA2QUFcXDAwMDBcXDA2M1xcdTI1MjMmJltcXDAwNVxcMDI3N1xceDQxVVxcMDM0XFx9UlxcdTE0QzdcXHU0NzY3XFx4MDlcXG5cXDA1NEV2XFwwMTQ0XFw8XFxmXFwsUS1cXHhFNF1dXV1dezN9Kyl8KD8+XispfCg/IVtefFxcfFxcbkpcXHRcXDxcXDA0RVxcXFxcXHRcXDAxXFxcXFxcMDJcXHxcXD1cXH1cXHhGM1xcdUJFQzJcXDAzMktcXDAxNFxcdUNDNUZcXDA3MnFcXHxcXDAxNTNcXHhEOVxcMDMyMlxcdUM2QzhbXlxcdFxcMDM0MlxceDM0XFx4OTFcXDA2XFx7XFx4RjFcXGFcXHUxNzEwXFw/XFx4RTdcXHVDMTA2XFwwMnBGXFw8JiZbXnxcXF1cXDA2NFxcdTM4MURcXHU1MENGXFxlTyYmW158XFwwNlxceDJGXFwwNFxcMDQ1XFwwMzJcXHU4NTM2V1xcMDM3N1xcMDAxN3xcXHgwNlxcdUU1RkFcXDA1XFx4RDRcXDAyMFxcMDRjXFx4RkNcXDAySFxceDBBXFxyXV1dXSs/KSg/aWRtc3V4LWlkbXN1eCl8KD88IVt8XFxyLVxcLCYmW0lcXHRcXHJcXDAyMDFcXHhEQlxcZSYmW158XFwwMlxcMDZcXDAwXFw8XFxhXFx1Nzk1MlxcMDY0XFwwNTFcXDA3M1xceDQxXFw/blxcMDQwXFwwMDUzXFwwMzEmJltcXHgxNS1cXHxdXV1dezgsMTF9PykoPyFbXnxcXDwtXFx1QTc0QlxceEZBXFx1N0NEMlxcMDI0XFwwN25cXDxcXHg2QVxcMDA0MlxcdUU0RkZcXHJcXHU4OTZCXFxbXFw9XFwwNDJZJiZeXFxwe0FTQ0lJfV0rKyl8KD88IVtSLVxcfCYmW1xcYVxcMDEyMEFcXHU2MTQ1XFw8XFwwNTAtZFt8XFxlLVxcdUEwN0N8XFwwMTYtXFx1ODBEOV1dXXsxLH0rKXwoP2lkbXN1eC1pZG1zdXgpfCg/aWRtc3V4LWlkbXN1eCl8KD9pZG1zdXgtaWRtc3V4OlxcQns2LH0/KXwoPzw9XFxEezUsOH0/KXwoPz5bXFx7LVxcMDIwN3xcXDA2LVxcMDI3NlxccHtYRGlnaXR9XSkoP2lkbXN1eC1pZG1zdXg6W158XFx4NTJcXDAwMTJcXF11XFx4QURcXDAwNTFmXFwwMTQyXFxcXGxcXHxcXDA1MFxcMDVcXGZcXHRcXHU3QjkxXFxyXFx1Nzc2M1xce3xoXFwwMTA0XFxhXFxmXFwwMjM0XFx1MkQ0RiYmXlxcUHtJbkdyZWVrfV0pKSIpOwogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCiAgICAgICAgICAgICAgfQpAQCAtODIwLDggKzgyMiw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKICAgICAgICAgICAgICB9CkBAIC04MzYsMTIgKzgzOCwxMiBAQAogCiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKKyAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30pICAgICAgCiAgICAgICAgICAgICAgfQogICAgICAgICAgICApICAgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RCdWcxOTcoKSB7CkBAIC04NzEsOCArODczLDggQEAKIAogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKICAgICAgICAgICAgICB9CkBAIC04OTYsOCArODk4LDkgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgIiArCisgICAgICAgICAgICAgICAgICAgICJtZXRob2QuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCiAgICAgICAgICAgICAgfQpAQCAtOTExLDggKzkxNCw5IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICIgKworICAgICAgICAgICAgICAgICAgICAibWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgIAogICAgICAgICAgICAgIH0KQEAgLTkyNiw4ICs5MzAsOSBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKICAgICAgICAgICAgICB9CkBAIC05NDEsOCArOTQ2LDkgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgIiArCisgICAgICAgICAgICAgICAgICAgICJtZXRob2QuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCiAgICAgICAgICAgICAgfQpAQCAtOTU2LDggKzk2Miw5IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICIgKworICAgICAgICAgICAgICAgICAgICAibWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSAgICAgIAogICAgICAgICAgICAgIH0KQEAgLTk3NCw4ICs5ODEsOSBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkgICAgICAKICAgICAgICAgICAgICB9CkBAIC05OTIsMTMgKzEwMDAsMTQgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mICIgKworICAgICAgICAgICAgICAgICAgICAiY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCiAgICAgICAgICAgICAgfQogICAgICAgICAgICApICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIF90ZXN0RmluZEJvdW5kYXJ5Q2FzZXM3KCkgeworICAgIHB1YmxpYyB2b2lkIGRpc2FibGVkX3Rlc3RGaW5kQm91bmRhcnlDYXNlczcoKSB7CiAgICAgICAgIFN0cmluZ1tdIHJlcyA9IHsgIiIsICJhIiwgIiIsICIiIH07CiAgICAgICAgIFBhdHRlcm4gcGF0ID0gUGF0dGVybi5jb21waWxlKCIuKiIpOwogICAgICAgICBNYXRjaGVyIG1hdCA9IHBhdC5tYXRjaGVyKCJcbmFcbiIpOwpAQCAtMTAxMSw4ICsxMDIwLDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKwogICAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXIoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSksCkBAIC0xMDM4LDggKzEwNDcsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTEwNDcsNyArMTA1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgX3Rlc3RCYWNrUmVmZXJlbmNlczEoKSB7CisgICAgcHVibGljIHZvaWQgZGlzYWJsZWRfdGVzdEJhY2tSZWZlcmVuY2VzMSgpIHsKICAgICAgICAgUGF0dGVybiBwYXQgPSBQYXR0ZXJuLmNvbXBpbGUoIihcXCgoXFx3Kik6KC4qKTooXFwyKVxcKSkiKTsKICAgICAgICAgTWF0Y2hlciBtYXQgPSBwYXQKICAgICAgICAgICAgICAgICAubWF0Y2hlcigiKHN0YXJ0MTogd29yZCA6c3RhcnQxKShzdGFydDI6IHdvcmQgOnN0YXJ0MikiKTsKQEAgLTEwNjIsOCArMTA3MSw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcsIGludCkgJiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzfSksCkBAIC0xMDgyLDggKzEwOTEsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZywgaW50KSAmICIgKwogICAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXIoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuSW50ZWdlci5jbGFzc30pLApAQCAtMTA5NywxMyArMTEwNiwxOSBAQAogICAgICAgICBtYXQubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIG1hdC5lbmQoKSk7CiAgICAgfQotLy8KLSAgICAvL1RPRE8KLSAgICAvL1RPRE8KLSAgICAvL1RPRE8KLSAgICAvL1RPRE8KLSAgICAvL1RPRE8KLSAgICAvL1RPRE8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGF0dGVybiBwYXQgPSBQYXR0ZXJuLmNvbXBpbGUoImEqYmMiKTsKICAgICAgICAgU2VyaWFsaXphYmxlQXNzZXJ0IGNvbXBhcmF0b3IgPSBuZXcgU2VyaWFsaXphYmxlQXNzZXJ0KCkgewpAQCAtMTExOCw4ICsxMTMzLDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZywgaW50KSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcsIGludCkgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGVyKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLkludGVnZXIuY2xhc3N9KSwKQEAgLTExMzksOCArMTE1NCw5IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICIgKworICAgICAgICAgICAgICAgICAgICAibWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KQogICAgICAgICAgICAgIH0KQEAgLTExNTQsOCArMTE3MCw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkKICAgICAgICAgICAgICB9CkBAIC0xMTY2LDggKzExODIsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTEyNDUsMTMgKzEyNjEsMTMgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgKSAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBfdGVzdENvcnJlY3RSZXBsYWNlbWVudEJhY2tyZWZlcmVuY2VkSm9pbnRTZXQoKSB7CisgICAgcHVibGljIHZvaWQgZGlzYWJsZWRfdGVzdENvcnJlY3RSZXBsYWNlbWVudEJhY2tyZWZlcmVuY2VkSm9pbnRTZXQoKSB7CiAgICAgICAgIFBhdHRlcm4gcGF0ID0gUGF0dGVybi5jb21waWxlKCJhYihhKSpcXDEiKTsKICAgICAgICAgcGF0ID0gUGF0dGVybi5jb21waWxlKCJhYmMoY2QpZmciKTsKICAgICAgICAgcGF0ID0gUGF0dGVybi5jb21waWxlKCJhYmEqY2QiKTsKQEAgLTEyNzAsOCArMTI4Niw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGVyKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLApAQCAtMTI4Niw4ICsxMzAyLDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKwogICAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXIoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSksCkBAIC0xMzY0LDggKzEzODAsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTEzODUsMTAgKzE0MDEsMTQgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5UT0RPLAotICAgICAgICAgICAgIG5vdGVzID0gIiIsCi0gICAgICAgICAgICAgdGFyZ2V0cyA9IHt9Ci0gICAgICAgICAgICkgICAgICAgICAgCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzcGxpdCBtZXRob2QgZm9yIGVtcHR5IHN0cmluZy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzcGxpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXRFbXB0eUNoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgU3RyaW5nIHMxID0gIiI7CiAgICAgICAgIFN0cmluZ1tdIGFyciA9IHMxLnNwbGl0KCI6Iik7CkBAIC0xMzk2LDggKzE0MTYsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAic3BsaXQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgaW50KSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTE0MTQsOCArMTQzNCw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuVE9ETywKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcpLCAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nKSwgIiArCiAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kIGZvciBjYXNlIGluc2Vuc2l0aXZlIGZsYWdzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJtYXRjaGVzIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UuY2xhc3N9KQpAQCAtMTQyNiw4ICsxNDQ2LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKwogICAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXIoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSksCkBAIC0xNDUwLDggKzE0NzAsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLlRPRE8sIC8vaXNDb21waWxlZCBjaGVja2luZyBub3QgbmVlZGVkIHRlc3Qgc2hvdWxkIGZhaWwgaW4gY2FzZSBvZiBleGNlcHRpb24KLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLCAvL2lzQ29tcGlsZWQgY2hlY2tpbmcgbm90IG5lZWRlZCB0ZXN0IHNob3VsZCBmYWlsIGluIGNhc2Ugb2YgZXhjZXB0aW9uCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYiICsKICAgICAgICAgICAgICAgICAgICAgICIgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLCAKQEAgLTE0NzgsOCArMTQ5OCw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGVyKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLApAQCAtMTUyMCw4ICsxNTQwLDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5UT0RPLCAvL2lzQ29tcGlsZWQgY2hlY2tpbmcgbm90IG5lZWRlZCB0ZXN0IHNob3VsZCBmYWlsIGluIGNhc2Ugb2YgZXhjZXB0aW9uCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2QuIiwKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLCAvL2lzQ29tcGlsZWQgY2hlY2tpbmcgbm90IG5lZWRlZCB0ZXN0IHNob3VsZCBmYWlsIGluIGNhc2Ugb2YgZXhjZXB0aW9uCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpIG1ldGhvZC4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSkKICAgICAgICAgICAgICB9CkBAIC0xNTM5LDggKzE1NTksOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTE1NjIsOCArMTU4Miw4IEBACiAgICAgICogXHB7amF2YUxvd2VyQ2FzZX0gXHB7amF2YVVwcGVyQ2FzZX0gXHB7amF2YVdoaXRlc3BhY2V9IFxwe2phdmFNaXJyb3JlZH0KICAgICAgKi8KICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgbWV0aG9kLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KQogICAgICAgICAgICAgIH0KQEAgLTE4OTAsOCArMTkxMCw4IEBACiAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCiAgICAgCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGVyKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLApAQCAtMTk2Niw4ICsxOTg2LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKwogICAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXIoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSksCkBAIC0yMDE4LDggKzIwMzgsOCBAQAogICAgICAqLwogICAgIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTIxMjksOCArMjE0OSw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICIgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpIG1hdGNoZXIoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSksCkBAIC0yMTc5LDcgKzIxOTksMTUgQEAKICAgICAvKioKICAgICAgKiBzIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLnF1b3RlKFN0cmluZykKICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicXVvdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9xdW90ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBmb3IgKFN0cmluZyBhUGF0dGVybiA6IHRlc3RQYXR0ZXJucykgewogICAgICAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKGFQYXR0ZXJuKTsKQEAgLTIyMDIsOCArMjIzMCw4IEBACiAgICAgICovCiAgICAgCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGVyKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLApAQCAtMjI0MCw4ICsyMjY4LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKwogICAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXIoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiY29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSksCkBAIC0yMjYyLDggKzIyOTAsOCBAQAogICAgIH0KIAogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nKSAmICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCiAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSBtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJjb21waWxlIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KSwKQEAgLTIyOTIsOCArMjMyMCw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlKGphdmEubGFuZy5TdHJpbmcsIGludCkgJiBtYXRjaGVyKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLApAQCAtMjMyMyw4ICsyMzUxLDggQEAKICAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktNjg4CiAgICAgICovCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcpICYgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykgJiAiICsKICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGVyKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pLApkaWZmIC0tZ2l0IGEvcmVnZXgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS91dGlsL3JlZ2V4L1JlcGxhY2VUZXN0LmphdmEgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUmVwbGFjZVRlc3QuamF2YQppbmRleCBkYTc3OWZiLi4wNzc5NzhiIDEwMDY0NAotLS0gYS9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUmVwbGFjZVRlc3QuamF2YQorKysgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUmVwbGFjZVRlc3QuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RTdGF0dXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwpAQCAtMjksOCArMjksOCBAQAogQFRlc3RUYXJnZXRDbGFzcyhNYXRjaGVyLmNsYXNzKQogcHVibGljIGNsYXNzIFJlcGxhY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIEBUZXN0SW5mbygKLSAgICAgICAgICAgICBzdGF0dXMgPSBUZXN0U3RhdHVzLkxHVE0sCi0gICAgICAgICAgICAgbm90ZXMgPSAiVGhlIHRlc3QgdmVyaWZpZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgIiArCisgICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mICIgKwogICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VGaXJzdChqYXZhLmxhbmcuU3RyaW5nKSAmIHJlcGxhY2VBbGwoamF2YS5sYW5nLlN0cmluZykiICsKICAgICAgICAgICAgICAgICAgICAgICIgbWV0aG9kcy4iLAogICAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAicmVwbGFjZUZpcnN0IiwKQEAgLTU0LDggKzU0LDggQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiICsKICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlRmlyc3QoamF2YS5sYW5nLlN0cmluZykgJiByZXBsYWNlQWxsKGphdmEubGFuZy5TdHJpbmcpIiArCiAgICAgICAgICAgICAgICAgICAgICAiIG1ldGhvZHMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlcGxhY2VGaXJzdCIsCkBAIC05Niw4ICs5Niw4IEBACiAgICAgfQogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgIiArCiAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZUFsbChqYXZhLmxhbmcuU3RyaW5nKSBtZXRob2Qgd2l0aCBiYWNrc2xhc2ggY2hhcnMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInJlcGxhY2VBbGwiLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCmRpZmYgLS1naXQgYS9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvU3BsaXRUZXN0LmphdmEgYi9yZWdleC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvU3BsaXRUZXN0LmphdmEKaW5kZXggN2YyNTRiNS4uNGZkMjI0MyAxMDA2NDQKLS0tIGEvcmVnZXgvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdHMvamF2YS91dGlsL3JlZ2V4L1NwbGl0VGVzdC5qYXZhCisrKyBiL3JlZ2V4L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9TcGxpdFRlc3QuamF2YQpAQCAtMyw3ICszLDcgQEAKIGltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiBpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CiBpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKLWltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0U3RhdHVzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKQEAgLTE1LDggKzE1LDggQEAKICAqLwogcHVibGljIGNsYXNzIFNwbGl0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mICIgKworICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiAiICsKICAgICAgICAgICAgICAgICAgICAgICJzcGxpdChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKSAmIGNvbXBpbGUoamF2YS5sYW5nLlN0cmluZykiICsKICAgICAgICAgICAgICAgICAgICAgICJtZXRob2RzLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzcGxpdCIsCkBAIC0zNiwxNCArMzYsMTEgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgInNwbGl0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UpICYgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nLCIgKwotICAgICAgICAgICAgICAgICAgICAgIiBpbnQpIG1ldGhvZHMuIFRlc3QgdXNlcyBub3QgZW1wdHkgcGF0dGVybi4iLAorICAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICJzcGxpdChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKS4gVGVzdCB1c2VzIG5vdCBlbXB0eSBwYXR0ZXJuLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzcGxpdCIsCi0gICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3N9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAotICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCisgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3N9KQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgKSAgICAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXQxKCkgdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24gewpAQCAtMTM4LDE0ICsxMzUsMTEgQEAKICAgICB9CiAKICAgICBAVGVzdEluZm8oCi0gICAgICAgICAgICAgc3RhdHVzID0gVGVzdFN0YXR1cy5MR1RNLAotICAgICAgICAgICAgIG5vdGVzID0gIlRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgInNwbGl0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UpICYgY29tcGlsZShqYXZhLmxhbmcuU3RyaW5nLCIgKwotICAgICAgICAgICAgICAgICAgICAgIiBpbnQgbWV0aG9kcy4gVGVzdCB1c2VzIGVtcHR5IHBhdHRlcm4uIiwKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgIiArCisgICAgICAgICAgICAgICAgICAgICAic3BsaXQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkuIFRlc3QgdXNlcyBlbXB0eSBwYXR0ZXJuLiIsCiAgICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzcGxpdCIsCi0gICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3N9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNvbXBpbGUiLAotICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pICAgICAgCisgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLmNsYXNzLCBpbnQuY2xhc3N9KSAgICAgCiAgICAgICAgICAgICAgfQogICAgICAgICAgICApICAgICAgICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxpdDIoKSB7CkBAIC0xNzYsOCArMTcwLDggQEAKIAogCiAgICAgQFRlc3RJbmZvKAotICAgICAgICAgICAgIHN0YXR1cyA9IFRlc3RTdGF0dXMuTEdUTSwKLSAgICAgICAgICAgICBub3RlcyA9ICJUaGUgdGVzdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiICsKKyAgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgIiArCiAgICAgICAgICAgICAgICAgICAgICAic3BsaXQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkgJiBjb21waWxlKGphdmEubGFuZy5TdHJpbmcsIiArCiAgICAgICAgICAgICAgICAgICAgICAiIGludCkgbWV0aG9kcy4gVGVzdCB1c2VzIGVtcHR5IHBhdHRlcm4gYW5kIHN1cHBsZW1lbnRhcnkgY2hhcnMuIiwKICAgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNwbGl0IiwKZGlmZiAtLWdpdCBhL3J1bi1jb3JlLXRlc3RzIGIvcnVuLWNvcmUtdGVzdHMKaW5kZXggNTVjYmE4NS4uMzY1NmUyZCAxMDA3NTUKLS0tIGEvcnVuLWNvcmUtdGVzdHMKKysrIGIvcnVuLWNvcmUtdGVzdHMKQEAgLTE3LDEyICsxNywxNSBAQAogIwogIyBUbyBpbnN0YWxsIHRoaXMgc2NyaXB0IGFuZCB0aGUgdGVzdHMgb24gYSBkZXZpY2U6CiAjICQgbWFrZSAob25seSBuZWNlc3Nhcnkgb25jZSkKLSMgJCBtYWtlIGNvcmUtdGVzdHMgc25vZCAodG8gY3JlYXRlIGEgc3lzdGVtLmltZyBjb250YWluaW5nIHRoZXNlIGZpbGVzKQorIyAkIG1ha2UgQ3RzQ29yZVRlc3RzIHNub2QgKHRvIGNyZWF0ZSBhIHN5c3RlbS5pbWcgY29udGFpbmluZyB0aGVzZSBmaWxlcykKICMgIE9SCi0jICQgbWFrZSBjb3JlLXRlc3RzICYmIGFkYiBzeW5jICh0byBwdXNoIHRoZXNlIGZpbGVzIHRvIGEgcnVubmluZyBzeXN0ZW0pCisjICQgbWFrZSBDdHNDb3JlVGVzdHMgJiYgYWRiIHN5bmMgKHRvIHB1c2ggdGhlc2UgZmlsZXMgdG8gYSBydW5uaW5nIHN5c3RlbSkKIAogdG1wPS9kYXRhL2NvcmUtdGVzdHMudG1wCiBta2RpciAkdG1wCiBjaG1vZCA3NzcgJHRtcAogICAKLWV4ZWMgZGFsdmlrdm0gLURqYXZhLmlvLnRtcGRpcj0kdG1wIC1YYm9vdGNsYXNzcGF0aDokQk9PVENMQVNTUEFUSDovc3lzdGVtL2ZyYW1ld29yay9jb3JlLXRlc3RzLmphciBjb20uZ29vZ2xlLmNvcmV0ZXN0cy5NYWluICIkQCIKK2V4ZWMgZGFsdmlrdm0gLUR1c2VyLmxhbmd1YWdlPWVuIC1EdXNlci5yZWdpb249VVMgLURqYXZhLmlvLnRtcGRpcj0kdG1wIFwKKyAgICAgLVhib290Y2xhc3NwYXRoOiRCT09UQ0xBU1NQQVRIIFwKKyAgICAgLWNsYXNzcGF0aCAvc3lzdGVtL2ZyYW1ld29yay9jb3JlLXRlc3RzLmphciBcCisgICAgIGNvbS5nb29nbGUuY29yZXRlc3RzLk1haW4gIiRAIgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sQ29udGV4dC5qYXZhIGIvc2VjdXJpdHkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sQ29udGV4dC5qYXZhCmluZGV4IDIyYjFhMzAuLmY5ZDg4M2EgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbENvbnRleHQuamF2YQorKysgYi9zZWN1cml0eS1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0LmphdmEKQEAgLTEsMzEgKzEsNDQgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAogICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgVi4gQXN0YXBjaHVrCi0qIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xLjIuMi40LjMgJAotKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlsczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgKiB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9IGVuY2Fwc3VsYXRlcyB0aGUge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59cyBvbgorICogd2hpY2ggYWNjZXNzIGNvbnRyb2wgZGVjaXNpb25zIGFyZSBiYXNlZC4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEFjY2Vzc0NvbnRyb2xDb250ZXh0IHsKIApAQCAtMzMsNyArNDYsNyBAQAogICAgIC8vIEl0IGhhcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczoKICAgICAvLyAgICAgLSAnY29udGV4dCcgY2FuIG5vdCBiZSBudWxsCiAgICAgLy8gICAgIC0gbmV2ZXIgY29udGFpbnMgbnVsbChzKQotICAgIC8vICAgICAtIGFsbCBlbGVtZW50cyBhcmUgdW5pcSAobm8gZHVwcykKKyAgICAvLyAgICAgLSBhbGwgZWxlbWVudHMgYXJlIHVuaXF1ZSAobm8gZHVwcykKICAgICBQcm90ZWN0aW9uRG9tYWluW10gY29udGV4dDsKIAogICAgIERvbWFpbkNvbWJpbmVyIGNvbWJpbmVyOwpAQCAtNDIsNyArNTUsMjUgQEAKICAgICBwcml2YXRlIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGluaGVyaXRlZDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFjY2Vzc0NvbnRyb2xDb250ZXh0fSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9IGFuZCB7QGNvZGUgRG9tYWluQ29tYmluZXJ9LgorICAgICAqIDxwPgorICAgICAqIElmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkLCBjb2RlIGNhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIG5lZWQgdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBjcmVhdGVBY2Nlc3NDb250cm9sQ29udGV4dH0gdG8KKyAgICAgKiBiZSBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhY2MKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9IHJlbGF0ZWQgdG8gdGhlIGdpdmVuIHtAY29kZQorICAgICAqICAgICAgICAgICAgRG9tYWluQ29tYmluZXJ9CisgICAgICogQHBhcmFtIGNvbWJpbmVyCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIERvbWFpbkNvbWJpbmVyfSByZWxhdGVkIHRvIHRoZSBnaXZlbiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0fQorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbnZva2UgdGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWNjfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQWNjZXNzQ29udHJvbENvbnRleHQoQWNjZXNzQ29udHJvbENvbnRleHQgYWNjLAogICAgICAgICAgICAgRG9tYWluQ29tYmluZXIgY29tYmluZXIpIHsKQEAgLTU3LDcgKzg4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9IHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIGFycmF5IG9mIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufXMuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn1zIHRoYXQgYXJlIHVzZWQgdG8gcGVyZm9ybSBhY2Nlc3MKKyAgICAgKiAgICAgICAgICAgIGNoZWNrcyBpbiB0aGUgY29udGV4dCBvZiB0aGlzIHtAY29kZSBBY2Nlc3NDb250cm9sQ29udGV4dH0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNvbnRleHR9IGlzIHtAY29kZSBudWxsfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sQ29udGV4dChQcm90ZWN0aW9uRG9tYWluW10gY29udGV4dCkgewogICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CkBAIC0xMTIsNyArMTUxLDcgQEAKICAgICAgKiA8L2xpPgogICAgICAqICAgCiAgICAgICogQHBhcmFtIHN0YWNrIC0gYXJyYXkgb2YgUHJvdGVjdGlvbkRvbWFpbnMKLSAgICAgKiBAcGFyYW0gaW5oZXJpdGVkIC0gaW5oZXJpdGVkIGNvbnRleHQsIHdoaWNoIG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIGNvbWJpbmVyIC0gY29tYmluZXIKICAgICAgKi8KICAgICBBY2Nlc3NDb250cm9sQ29udGV4dChQcm90ZWN0aW9uRG9tYWluW10gc3RhY2ssCiAgICAgICAgICAgICBEb21haW5Db21iaW5lciBjb21iaW5lcikgewpAQCAtMTIxLDcgKzE2MCwzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENoZWNrcyB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gYWdhaW5zdCB0aGUgdm0ncyBjdXJyZW50IHNlY3VyaXR5IHBvbGljeS4KKyAgICAgKiBUaGUgY2hlY2sgaXMgYmFzZWQgb24gdGhpcyB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9IGFzIG9wcG9zZWQgdG8gdGhlCisgICAgICoge0BsaW5rIEFjY2Vzc0NvbnRyb2xsZXIjY2hlY2tQZXJtaXNzaW9uKFBlcm1pc3Npb24pfSBtZXRob2Qgd2hpY2gKKyAgICAgKiBwZXJmb3JtcyBhY2Nlc3MgY2hlY2tzIGJhc2VkIG9uIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHRocmVhZC4gVGhpcworICAgICAqIG1ldGhvZCByZXR1cm5zIHNpbGVudGx5IGlmIHRoZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQsIG90aGVyd2lzZSBhbgorICAgICAqIHtAY29kZSBBY2Nlc3NDb250cm9sRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogPHA+CisgICAgICogQSBwZXJtaXNzaW9uIGlzIGNvbnNpZGVyZWQgZ3JhbnRlZCBpZiBldmVyeSB7QGxpbmsgUHJvdGVjdGlvbkRvbWFpbn0gaW4KKyAgICAgKiB0aGlzIGNvbnRleHQgaGFzIGJlZW4gZ3JhbnRlZCB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24uCisgICAgICogPHA+CisgICAgICogSWYgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGFyZSBvbiB0aGUgY2FsbCBzdGFjaywgb25seSB0aGUge0Bjb2RlCisgICAgICogUHJvdGVjdGlvbkRvbWFpbn1zIGZyb20gdGhlIGxhc3QgcHJpdmlsZWdlZCBvcGVyYXRpb24gYXJlIHRha2VuIGludG8KKyAgICAgKiBhY2NvdW50LgorICAgICAqIDxwPgorICAgICAqIElmIGluaGVyaXRlZCBtZXRob2RzIGFyZSBvbiB0aGUgY2FsbCBzdGFjaywgdGhlIHByb3RlY3Rpb24gZG9tYWlucyBvZiB0aGUKKyAgICAgKiBkZWNsYXJpbmcgY2xhc3NlcyBhcmUgY2hlY2tlZCwgbm90IHRoZSBwcm90ZWN0aW9uIGRvbWFpbnMgb2YgdGhlIGNsYXNzZXMKKyAgICAgKiBvbiB3aGljaCB0aGUgbWV0aG9kIGlzIGludm9rZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHBlcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrIGFnYWluc3QgdGhlIHBvbGljeQorICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBub3QgZ3JhbnRlZAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2NoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0pIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHBlcm0gPT0gbnVsbCkgewpAQCAtMTM4LDkgKzIwMiwyMiBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMge0Bjb2RlIEFjY2Vzc0NvbnRyb2xDb250ZXh0fSBmb3IKKyAgICAgKiBlcXVhbGl0eS4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYWxzbyBhbgorICAgICAqIGluc3RhbmNlIG9mIHtAY29kZSBBY2Nlc3NDb250cm9sQ29udGV4dH0sIGFuZCB0aGUgdHdvIGNvbnRleHRzCisgICAgICogZW5jYXBzdWxhdGUgdGhlIHNhbWUge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59cy4gVGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUKKyAgICAgKiBQcm90ZWN0aW9uRG9tYWlufXMgaXMgaWdub3JlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0fQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBBY2Nlc3NDb250cm9sQ29udGV4dH0sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE1OSw3ICsyMzYsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgRG9tYWluQ29tYmluZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZQorICAgICAqIEFjY2Vzc0NvbnRyb2xDb250ZXh0fS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBnZXREb21haW5Db21iaW5lcn0gdG8gYmUgZ3JhbnRlZCwKKyAgICAgKiBvdGhlcndpc2UgYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBEb21haW5Db21iaW5lcn0gYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBBY2Nlc3NDb250cm9sQ29udGV4dH0KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERvbWFpbkNvbWJpbmVyIGdldERvbWFpbkNvbWJpbmVyKCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xNjksOCArMjU4LDE3IEBACiAgICAgICAgIHJldHVybiBjb21iaW5lcjsKICAgICB9CiAKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9LgorICAgICAqIFJldHVybnMgdGhlIHNhbWUgaGFzaCBjb2RlIGZvciB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9cyB0aGF0IGFyZQorICAgICAqIGVxdWFsIHRvIGVhY2ggb3RoZXIgYXMgcmVxdWlyZWQgYnkgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2YKKyAgICAgKiB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIEFjY2Vzc0NvbnRyb2xDb250ZXh0fQorICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sQ29udGV4dCNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBoYXNoID0gMDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5qYXZhIGIvc2VjdXJpdHkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyLmphdmEKaW5kZXggYzUwNGZjOC4uNWM1YmMyNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIGIvc2VjdXJpdHkta2VybmVsL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyLmphdmEKQEAgLTEsMTggKzEsMzMgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAogICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CkBAIC0yMywyOCArMzgsNDQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuU2VjdXJpdHlVdGlsczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIEFjY2Vzc0NvbnRyb2xsZXJ9IHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIHRvIHBlcmZvcm0gYWNjZXNzIGNvbnRyb2wKKyAqIGNoZWNrcyBhbmQgcHJpdmlsZWdlZCBvcGVyYXRpb25zLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQWNjZXNzQ29udHJvbGxlciB7CiAKICAgICBwcml2YXRlIEFjY2Vzc0NvbnRyb2xsZXIoKSB7CiAgICAgICAgIHRocm93IG5ldyBFcnJvcigic3RhdGljcyBvbmx5LiIpOwotICAgIH07CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQSBtYXAgdXNlZCB0byBzdG9yZSBhIG1hcHBpbmcgYmV0d2VlbiBhIGdpdmVuIFRocmVhZCBhbmQKICAgICAgKiBBY2Nlc3NDb250cm9sbGVyQ29udGV4dC1zIHVzZWQgaW4gc3VjY2Vzc2l2ZSBjYWxscyBvZiBkb1ByaXZpbGVnZWQoKS4gQQogICAgICAqIFdlYWtIYXNoTWFwIGlzIHVzZWQgdG8gYWxsb3cgYXV0b21hZ2ljYWwgd2lwaW5nIG9mIHRoZSBkZWFkIHRocmVhZHMgZnJvbQogICAgICAqIHRoZSBtYXAuIFRoZSB0aHJlYWQgKG5vcm1hbGx5IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIGlzIHVzZWQgYXMgYSBrZXkKLSAgICAgKiBmb3IgdGhlIG1hcCwgYW5kIGEgdmFsdWUgaXMgQXJyYXlMaXN0IHdoZXJlIGFsbCBBY2Nlc3NDb250cm9sQ29udGV4dC1zIGFyZQotICAgICAqIHN0b3JlZC4gKChBcnJheUxpc3QpY29udGV4dHMuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpKS5sYXN0RWxlbWVudCgpIC0gCi0gICAgICogaXMgcmVmZXJlbmNlIHRvIHRoZSBsYXRlc3QgY29udGV4dCBwYXNzZWQgdG8gdGhlIGRvUHJpdmlsZWdlZCgpIGNhbGwuCisgICAgICogZm9yIHRoZSBtYXAsIGFuZCBhIHZhbHVlIGlzIEFycmF5TGlzdCB3aGVyZSBhbGwgQWNjZXNzQ29udHJvbENvbnRleHQtcworICAgICAqIGFyZSBzdG9yZWQuCisgICAgICogKChBcnJheUxpc3QpY29udGV4dHMuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpKS5sYXN0RWxlbWVudCgpIC0gaXMKKyAgICAgKiByZWZlcmVuY2UgdG8gdGhlIGxhdGVzdCBjb250ZXh0IHBhc3NlZCB0byB0aGUgZG9Qcml2aWxlZ2VkKCkgY2FsbC4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWFrSGFzaE1hcDxUaHJlYWQsIEFycmF5TGlzdDxBY2Nlc3NDb250cm9sQ29udGV4dD4+IAotICAgIGNvbnRleHRzID0gbmV3IFdlYWtIYXNoTWFwPFRocmVhZCwgQXJyYXlMaXN0PEFjY2Vzc0NvbnRyb2xDb250ZXh0Pj4oKTsKLSAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWFrSGFzaE1hcDxUaHJlYWQsIEFycmF5TGlzdDxBY2Nlc3NDb250cm9sQ29udGV4dD4+IGNvbnRleHRzID0gbmV3IFdlYWtIYXNoTWFwPFRocmVhZCwgQXJyYXlMaXN0PEFjY2Vzc0NvbnRyb2xDb250ZXh0Pj4oKTsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHNwZWNpZmllZCBwcml2aWxlZ2VkIGFjdGlvbi4gT25seSB0aGUKKyAgICAgKiB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0gb2YgdGhlIGRpcmVjdCBjYWxsZXIgb2YgdGhpcyBtZXRob2QgYW5kIHRoZQorICAgICAqIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufXMgb2YgYWxsIHN1YnNlcXVlbnQgY2xhc3NlcyBpbiB0aGUgY2FsbCBjaGFpbiBhcmUKKyAgICAgKiBjaGVja2VkIHRvIGJlIGdyYW50ZWQgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uIGlmIGFjY2VzcyBjaGVja3MgYXJlCisgICAgICogcGVyZm9ybWVkLgorICAgICAqIDxwPgorICAgICAqIElmIGFuIGluc3RhbmNlIG9mIHtAY29kZSBSdW50aW1lRXhjZXB0aW9ufSBpcyB0aHJvd24gZHVyaW5nIHRoZSBleGVjdXRpb24KKyAgICAgKiBvZiB0aGUge0Bjb2RlIFByaXZpbGVnZWRBY3Rpb24jcnVuKCl9IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gYWN0aW9uLCBpdCB3aWxsCisgICAgICogYmUgcHJvcGFnYXRlZCB0aHJvdWdoIHRoaXMgbWV0aG9kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2l0aCBwcml2aWxlZ2VzCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhY3Rpb24gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CkBAIC01NCw3ICs4NSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHNwZWNpZmllZCBwcml2aWxlZ2VkIGFjdGlvbi4gVGhlCisgICAgICoge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IG9mIHRoZSBkaXJlY3QgY2FsbGVyIG9mIHRoaXMgbWV0aG9kLCB0aGUge0Bjb2RlCisgICAgICogUHJvdGVjdGlvbkRvbWFpbn1zIG9mIGFsbCBzdWJzZXF1ZW50IGNsYXNzZXMgaW4gdGhlIGNhbGwgY2hhaW4gYW5kIGFsbAorICAgICAqIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufXMgb2YgdGhlIGdpdmVuIGNvbnRleHQgYXJlIGNoZWNrZWQgdG8gYmUgZ3JhbnRlZAorICAgICAqIHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbiBpZiBhY2Nlc3MgY2hlY2tzIGFyZSBwZXJmb3JtZWQuCisgICAgICogPHA+CisgICAgICogSWYgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIFJ1bnRpbWVFeGNlcHRpb259IGlzIHRocm93biBkdXJpbmcgdGhlIGV4ZWN1dGlvbgorICAgICAqIG9mIHRoZSB7QGNvZGUgUHJpdmlsZWdlZEFjdGlvbiNydW4oKX0gbWV0aG9kIG9mIHRoZSBnaXZlbiBhY3Rpb24sIGl0IHdpbGwKKyAgICAgKiBiZSBwcm9wYWdhdGVkIHRocm91Z2ggdGhpcyBtZXRob2QuCisgICAgICogCisgICAgICogQHBhcmFtIGFjdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZCB3aXRoIHByaXZpbGVnZXMKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBBY2Nlc3NDb250cm9sQ29udGV4dH0gd2hvc2UgcHJvdGVjdGlvbiBkb21haW5zIGFyZQorICAgICAqICAgICAgICAgICAgY2hlY2tlZCBhZGRpdGlvbmFsbHkKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBwcml2aWxlZ2VkIGFjdGlvbgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFjdGlvbiBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZChQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbiwKICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGNvbnRleHQpIHsKQEAgLTY1LDcgKzExNCwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHNwZWNpZmllZCBwcml2aWxlZ2VkIGFjdGlvbi4gT25seSB0aGUKKyAgICAgKiB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0gb2YgdGhlIGRpcmVjdCBjYWxsZXIgb2YgdGhpcyBtZXRob2QgYW5kIHRoZQorICAgICAqIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufXMgb2YgYWxsIHN1YnNlcXVlbnQgY2xhc3NlcyBpbiB0aGUgY2FsbCBjaGFpbiBhcmUKKyAgICAgKiBjaGVja2VkIHRvIGJlIGdyYW50ZWQgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uIGlmIGFjY2VzcyBjaGVja3MgYXJlCisgICAgICogcGVyZm9ybWVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duIGJ5IHRoZSBhY3Rpb24ncyBydW4gbWV0aG9kLCBpdCB3aWxsIGJlCisgICAgICogd3JhcHBlZCBhbmQgcHJvcGFnYXRlZCB0aHJvdWdoIHRoaXMgbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIElmIGFuIGluc3RhbmNlIG9mIHtAY29kZSBSdW50aW1lRXhjZXB0aW9ufSBpcyB0aHJvd24gZHVyaW5nIHRoZSBleGVjdXRpb24KKyAgICAgKiBvZiB0aGUge0Bjb2RlIFByaXZpbGVnZWRBY3Rpb24jcnVuKCl9IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gYWN0aW9uLCBpdCB3aWxsCisgICAgICogYmUgcHJvcGFnYXRlZCB0aHJvdWdoIHRoaXMgbWV0aG9kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2l0aCBwcml2aWxlZ2VzCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBAdGhyb3dzIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWN0aW9uJ3MgcnVuIG1ldGhvZCB0aHJvd3MgYW55IGNoZWNrZWQgZXhjZXB0aW9uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGlzIHtAY29kZSBudWxsfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248VD4gYWN0aW9uKQogICAgICAgICAgICAgdGhyb3dzIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gewpAQCAtNzYsNyArMTQ1LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgc3BlY2lmaWVkIHByaXZpbGVnZWQgYWN0aW9uLiBUaGUKKyAgICAgKiB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0gb2YgdGhlIGRpcmVjdCBjYWxsZXIgb2YgdGhpcyBtZXRob2QsIHRoZSB7QGNvZGUKKyAgICAgKiBQcm90ZWN0aW9uRG9tYWlufXMgb2YgYWxsIHN1YnNlcXVlbnQgY2xhc3NlcyBpbiB0aGUgY2FsbCBjaGFpbiBhbmQgYWxsCisgICAgICoge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59cyBvZiB0aGUgZ2l2ZW4gY29udGV4dCBhcmUgY2hlY2tlZCB0byBiZSBncmFudGVkCisgICAgICogdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uIGlmIGFjY2VzcyBjaGVja3MgYXJlIHBlcmZvcm1lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93biBieSB0aGUgYWN0aW9uJ3MgcnVuIG1ldGhvZCwgaXQgd2lsbCBiZQorICAgICAqIHdyYXBwZWQgYW5kIHByb3BhZ2F0ZWQgdGhyb3VnaCB0aGlzIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gaXMgdGhyb3duIGR1cmluZyB0aGUgZXhlY3V0aW9uCisgICAgICogb2YgdGhlIHtAY29kZSBQcml2aWxlZ2VkQWN0aW9uI3J1bigpfSBtZXRob2Qgb2YgdGhlIGdpdmVuIGFjdGlvbiwgaXQgd2lsbAorICAgICAqIGJlIHByb3BhZ2F0ZWQgdGhyb3VnaCB0aGlzIG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdpdGggcHJpdmlsZWdlcworICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEFjY2Vzc0NvbnRyb2xDb250ZXh0fSB3aG9zZSBwcm90ZWN0aW9uIGRvbWFpbnMgYXJlCisgICAgICogICAgICAgICAgICBjaGVja2VkIGFkZGl0aW9uYWxseQorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogQHRocm93cyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFjdGlvbidzIHJ1biBtZXRob2QgdGhyb3dzIGFueSBjaGVja2VkIGV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFjdGlvbiBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPFQ+IGFjdGlvbiwKICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGNvbnRleHQpIHRocm93cyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHsKQEAgLTg3LDExICsxNzksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgcmVhbCBpbXBsZW1lbnRhdGlvbiBvZiBkb1ByaXZpbGVnZWQoKSBtZXRob2QuPGJyPgotICAgICAqIEl0IHB1c2hlcyB0aGUgcGFzc2VkIGNvbnRleHQgaW50byB0aGlzIHRocmVhZCdzIGNvbnRleHRzIHN0YWNrLAotICAgICAqIGFuZCB0aGVuIGludm9rZXMgPGNvZGU+YWN0aW9uLnJ1bigpPC9jb2RlPi48YnI+Ci0gICAgICogVGhlIHB1c2hlZCBjb250ZXh0IGlzIHRoZW4gaW52ZXN0aWdhdGVkIGluIHRoZSB7QGxpbmsgZ2V0Q29udGV4dCgpfQotICAgICAqIHdoaWNoIGlzIGNhbGxlZCBpbiB0aGUge0BsaW5rIGNoZWNrUGVybWlzc2lvbn0uCisgICAgICogVGhlIHJlYWwgaW1wbGVtZW50YXRpb24gb2YgZG9Qcml2aWxlZ2VkKCkgbWV0aG9kLiBJdCBwdXNoZXMgdGhlIHBhc3NlZAorICAgICAqIGNvbnRleHQgaW50byB0aGlzIHRocmVhZCdzIGNvbnRleHRzIHN0YWNrLCBhbmQgdGhlbiBpbnZva2VzCisgICAgICogPGNvZGU+YWN0aW9uLnJ1bigpPC9jb2RlPi4gVGhlIHB1c2hlZCBjb250ZXh0IGlzIHRoZW4gaW52ZXN0aWdhdGVkIGluIHRoZQorICAgICAqIHtAbGluayAjZ2V0Q29udGV4dCgpfSB3aGljaCBpcyBjYWxsZWQgaW4gdGhlIHtAbGluayAjY2hlY2tQZXJtaXNzaW9ufS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWRJbXBsKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248VD4gYWN0aW9uLAogICAgICAgICAgICAgQWNjZXNzQ29udHJvbENvbnRleHQgY29udGV4dCkgdGhyb3dzIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gewpAQCAtMTE0LDcgKzIwNSw3IEBACiAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwogCiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXJyb3JzIGF1dG9tYWdpY2FsbHkgZ28gdGhyb3VnaHQgLSB0aGV5IGFyZSBub3QgY2F0Y2hlZCBieSB0aGlzCisgICAgICAgICAgICAvLyBFcnJvcnMgYXV0b21hZ2ljYWxseSBnbyB0aHJvdWdoIC0gdGhleSBhcmUgbm90IGNhdGNoZWQgYnkgdGhpcwogICAgICAgICAgICAgLy8gYmxvY2sKIAogICAgICAgICAgICAgLy8gVW5jaGVja2VkIGV4Y2VwdGlvbnMgbXVzdCBwYXNzIHRocm91Z2ggd2l0aG91dCBtb2RpZmljYXRpb24KQEAgLTEyNiw3ICsyMTcsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24oZXgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgaWYgKGN1cnJUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc3luYygpIGhlcmUsIGFzIGVhY2ggZ2l2ZW4gJ2EnIHdpbGwgYmUgYWNjZXNzZWQgCisgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzeW5jKCkgaGVyZSwgYXMgZWFjaCBnaXZlbiAnYScgd2lsbCBiZSBhY2Nlc3NlZAogICAgICAgICAgICAgICAgIC8vIG9ubHkgZnJvbSBvbmUgVGhyZWFkLiAnY29udGV4dHMnIHN0aWxsIG5lZWQgc3luYygpIGhvd2V2ZXIsCiAgICAgICAgICAgICAgICAgLy8gYXMgaXQncyBhY2Nlc3NlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CiAgICAgICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkgewpAQCAtMTM5LDEwICsyMzAsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSByZWFsIGltcGxlbWVudGF0aW9uIG9mIGFwcHJvcHJpYXRlIGRvUHJpdmlsZWdlZCgpIG1ldGhvZC48YnI+Ci0gICAgICogSXQgcHVzaGVzIHRoZSBwYXNzZWQgY29udGV4dCBpbnRvIHRoaXMgdGhyZWFkJ3Mgc3RhY2sgb2YgY29udGV4dHMgYW5kIAorICAgICAqIEl0IHB1c2hlcyB0aGUgcGFzc2VkIGNvbnRleHQgaW50byB0aGlzIHRocmVhZCdzIHN0YWNrIG9mIGNvbnRleHRzIGFuZAogICAgICAqIHRoZW4gaW52b2tlcyA8Y29kZT5hY3Rpb24ucnVuKCk8L2NvZGU+Ljxicj4KLSAgICAgKiBUaGUgcHVzaGVkIGNvbnRleHQgaXMgdGhlbiBpbnZlc3RpZ2F0ZWQgaW4gdGhlIHtAbGluayBnZXRDb250ZXh0KCl9IAotICAgICAqIHdoaWNoIGlzIGNhbGxlZCBpbiB0aGUge0BsaW5rIGNoZWNrUGVybWlzc2lvbn0uICAKKyAgICAgKiBUaGUgcHVzaGVkIGNvbnRleHQgaXMgdGhlbiBpbnZlc3RpZ2F0ZWQgaW4gdGhlIHtAbGluayAjZ2V0Q29udGV4dCgpfQorICAgICAqIHdoaWNoIGlzIGNhbGxlZCBpbiB0aGUge0BsaW5rICNjaGVja1Blcm1pc3Npb259LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZEltcGwoUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24sCiAgICAgICAgICAgICBBY2Nlc3NDb250cm9sQ29udGV4dCBjb250ZXh0KSB7CkBAIC0xNTEsMTAgKzI0MiwxMCBAQAogCiAgICAgICAgIGlmIChjdXJyVGhyZWFkID09IG51bGwgfHwgY29udGV4dHMgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gQmlnIGJvb20gdGltZSAtIFZNIGlzIHN0YXJ0aW5nLi4uIE5vIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbnM6Ci0gICAgICAgICAgICAvLyAxc3QsIEkgZG8gYmVsaWV2ZSB0aGVyZSBpcyBubyBtYWxpY2lvdXMgY29kZSBhdmFpbGFibGUgaGVyZSBmb3IgCisgICAgICAgICAgICAvLyAxc3QsIEkgZG8gYmVsaWV2ZSB0aGVyZSBpcyBubyBtYWxpY2lvdXMgY29kZSBhdmFpbGFibGUgaGVyZSBmb3IKICAgICAgICAgICAgIC8vIHRoaXMgbW9tZW50Ci0gICAgICAgICAgICAvLyAyZCwgSSBjYW50IHVzZSBjdXJyZW50VGhyZWFkKCkgYXMgYSBrZXkgYW55d2F5IC0gd2hlbiBpdCB3aWxsIAotICAgICAgICAgICAgLy8gdHVybiBpbnRvIHRoZSByZWFsIFRocmVhZCwgSSdsbCBiZSB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIAorICAgICAgICAgICAgLy8gMmQsIEkgY2FudCB1c2UgY3VycmVudFRocmVhZCgpIGFzIGEga2V5IGFueXdheSAtIHdoZW4gaXQgd2lsbAorICAgICAgICAgICAgLy8gdHVybiBpbnRvIHRoZSByZWFsIFRocmVhZCwgSSdsbCBiZSB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlCiAgICAgICAgICAgICAvLyBzdG9yZWQgd2l0aCAnY3VyclRocmVhZD09bnVsbCcgYXMgYSBrZXkuCiAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwogICAgICAgICB9CkBAIC0xNzMsNyArMjY0LDcgQEAKICAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucnVuKCk7CiAKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc3luYygpIGhlcmUsIGFzIGVhY2ggZ2l2ZW4gJ2EnIHdpbGwgYmUgYWNjZXNzZWQgCisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHN5bmMoKSBoZXJlLCBhcyBlYWNoIGdpdmVuICdhJyB3aWxsIGJlIGFjY2Vzc2VkCiAgICAgICAgICAgICAvLyBvbmx5IGZyb20gb25lIFRocmVhZC4gJ2NvbnRleHRzJyBzdGlsbCBuZWVkIHN5bmMoKSBob3dldmVyLAogICAgICAgICAgICAgLy8gYXMgaXQncyBhY2Nlc3NlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CiAgICAgICAgICAgICBpZiAoYSAhPSBudWxsKSB7CkBAIC0xODMsNyArMjc0LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ2hlY2tzIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBhZ2FpbnN0IHRoZSB2bSdzIGN1cnJlbnQgc2VjdXJpdHkgcG9saWN5LgorICAgICAqIFRoZSBjaGVjayBpcyBwZXJmb3JtZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiBUaGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgc2lsZW50bHkgaWYgdGhlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCwgb3RoZXJ3aXNlIGFuIHtAY29kZQorICAgICAqIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHBlcm1pc3Npb24gaXMgY29uc2lkZXJlZCBncmFudGVkIGlmIGV2ZXJ5IHtAbGluayBQcm90ZWN0aW9uRG9tYWlufSBpbgorICAgICAqIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IGhhcyBiZWVuIGdyYW50ZWQgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uLgorICAgICAqIElmIHByaXZpbGVnZWQgb3BlcmF0aW9ucyBhcmUgb24gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LCBvbmx5IHRoZSB7QGNvZGUKKyAgICAgKiBQcm90ZWN0aW9uRG9tYWlufXMgZnJvbSB0aGUgbGFzdCBwcml2aWxlZ2VkIG9wZXJhdGlvbiBhcmUgdGFrZW4gaW50bworICAgICAqIGFjY291bnQuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRoZSBwZXJtaXNzaW9uIGNoZWNrIHRvCisgICAgICoge0BsaW5rIEFjY2Vzc0NvbnRyb2xDb250ZXh0I2NoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uKX0gb24gdGhlIGN1cnJlbnQKKyAgICAgKiBjYWxsZXJzJyBjb250ZXh0IG9idGFpbmVkIGJ5IHtAbGluayAjZ2V0Q29udGV4dCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGVybQorICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2sgYWdhaW5zdCB0aGUgcG9saWN5CisgICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uIGlzIG5vdCBncmFudGVkCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xDb250ZXh0I2NoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uKQorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKQogICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewpAQCAtMTk1LDI1ICszMDksMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFycmF5IG9mIFByb3RlY3Rpb25Eb21haW5zIGZyb20gdGhlIGNsYXNzZXMgcmVzaWRpbmcgCi0gICAgICogb24gdGhlIHN0YWNrIG9mIHRoZSBjdXJyZW50IHRocmVhZCwgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY2FsbGVyCi0gICAgICogb2YgdGhlIG5lYXJlc3QgcHJpdmlsZWdlZCBmcmFtZS4gIFJlZmxlY3Rpb24gZnJhbWVzIGFyZSBza2lwcGVkLgotICAgICAqIFRoZSByZXR1cm5lZCBhcnJheSBpcyBuZXZlciBudWxsIGFuZCBuZXZlciBjb250YWlucyBudWxsIGVsZW1lbnRzLAotICAgICAqIG1lYW5pbmcgdGhhdCBib290c3RyYXAgY2xhc3NlcyBhcmUgZWZmZWN0aXZlbHkgaWdub3JlZC4KKyAgICAgKiBSZXR1cm5zIGFycmF5IG9mIFByb3RlY3Rpb25Eb21haW5zIGZyb20gdGhlIGNsYXNzZXMgcmVzaWRpbmcgb24gdGhlIHN0YWNrCisgICAgICogb2YgdGhlIGN1cnJlbnQgdGhyZWFkLCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjYWxsZXIgb2YgdGhlIG5lYXJlc3QKKyAgICAgKiBwcml2aWxlZ2VkIGZyYW1lLiBSZWZsZWN0aW9uIGZyYW1lcyBhcmUgc2tpcHBlZC4gVGhlIHJldHVybmVkIGFycmF5IGlzCisgICAgICogbmV2ZXIgbnVsbCBhbmQgbmV2ZXIgY29udGFpbnMgbnVsbCBlbGVtZW50cywgbWVhbmluZyB0aGF0IGJvb3RzdHJhcAorICAgICAqIGNsYXNzZXMgYXJlIGVmZmVjdGl2ZWx5IGlnbm9yZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFByb3RlY3Rpb25Eb21haW5bXSBnZXRTdGFja0RvbWFpbnMoKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBBY2Nlc3NDb250cm9sQ29udGV4dH0gZm9yIHRoZSBjdXJyZW50IHtAY29kZSBUaHJlYWR9CisgICAgICogaW5jbHVkaW5nIHRoZSBpbmhlcml0ZWQgYWNjZXNzIGNvbnRyb2wgY29udGV4dCBvZiB0aGUgdGhyZWFkIHRoYXQgc3Bhd25lZAorICAgICAqIHRoZSBjdXJyZW50IHRocmVhZCAocmVjdXJzaXZlbHkpLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCBjb250ZXh0IG1heSBiZSB1c2VkIHRvIHBlcmZvcm0gYWNjZXNzIGNoZWNrcyBhdCBhIGxhdGVyCisgICAgICogcG9pbnQgaW4gdGltZSwgcG9zc2libHkgYnkgYW5vdGhlciB0aHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIEFjY2Vzc0NvbnRyb2xDb250ZXh0fSBmb3IgdGhlIGN1cnJlbnQge0Bjb2RlIFRocmVhZH0KKyAgICAgKiBAc2VlIFRocmVhZCNjdXJyZW50VGhyZWFkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NDb250cm9sQ29udGV4dCBnZXRDb250ZXh0KCkgewogCiAgICAgICAgIC8vIGR1cGxpY2F0ZXMgKGlmIGFueSkgd2lsbCBiZSByZW1vdmVkIGluIEFDQyBjb25zdHJ1Y3RvcgogICAgICAgICBQcm90ZWN0aW9uRG9tYWluW10gc3RhY2sgPSBnZXRTdGFja0RvbWFpbnMoKTsKLSAgICAgICAgCisKICAgICAgICAgVGhyZWFkIGN1cnJUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwogICAgICAgICBpZiAoY3VyclRocmVhZCA9PSBudWxsIHx8IGNvbnRleHRzID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEJpZyBib28gdGltZS4gTm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyA/IAorICAgICAgICAgICAgLy8gQmlnIGJvbyB0aW1lLiBObyBuZWVkIHRvIGNoZWNrIGFueXRoaW5nID8KICAgICAgICAgICAgIHJldHVybiBuZXcgQWNjZXNzQ29udHJvbENvbnRleHQoc3RhY2spOwogICAgICAgICB9CiAKQEAgLTIyMSw3ICszNDQsNyBAQAogICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbnRleHRzKSB7CiAgICAgICAgICAgICB0aHJlYWRDb250ZXh0cyA9IGNvbnRleHRzLmdldChjdXJyVGhyZWFkKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBBY2Nlc3NDb250cm9sQ29udGV4dCB0aGF0OwogICAgICAgICBpZiAoKHRocmVhZENvbnRleHRzID09IG51bGwpIHx8ICh0aHJlYWRDb250ZXh0cy5zaXplKCkgPT0gMCkpIHsKICAgICAgICAgICAgIC8vIFdlIHdlcmUgbm90IGluIGRvUHJpdmlsZWdlZCBtZXRob2QsIHNvCkBAIC0yMzYsOSArMzU5LDggQEAKICAgICAgICAgaWYgKHRoYXQgIT0gbnVsbCAmJiB0aGF0LmNvbWJpbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIFByb3RlY3Rpb25Eb21haW5bXSBhc3NpZ25lZCA9IG51bGw7CiAgICAgICAgICAgICBpZiAodGhhdC5jb250ZXh0ICE9IG51bGwgJiYgdGhhdC5jb250ZXh0Lmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkID0gbmV3IFByb3RlY3Rpb25Eb21haW5bdGhhdC5jb250ZXh0Lmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhhdC5jb250ZXh0LCAwLCBhc3NpZ25lZCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGFzc2lnbmVkID0gbmV3IFByb3RlY3Rpb25Eb21haW5bdGhhdC5jb250ZXh0Lmxlbmd0aF07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGF0LmNvbnRleHQsIDAsIGFzc2lnbmVkLCAwLCBhc3NpZ25lZC5sZW5ndGgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgUHJvdGVjdGlvbkRvbWFpbltdIGFsbHBkcyA9IHRoYXQuY29tYmluZXIuY29tYmluZShzdGFjaywgYXNzaWduZWQpOwogICAgICAgICAgICAgaWYgKGFsbHBkcyA9PSBudWxsKSB7CkBAIC0yNDksMTEgKzM3MSw0IEBACiAKICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sQ29udGV4dChzdGFjaywgdGhhdCk7CiAgICAgfQotCi0gICAgLyoKLSAgICAgKiBURU1QT1JBUlksIHVzZWQgZm9yIHRlc3RpbmcgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy9wdWJsaWMgc3RhdGljIFByb3RlY3Rpb25Eb21haW5bXSB0ZXN0U3RhY2tEb21haW5zKCkgewotICAgIC8vICAgIHJldHVybiBnZXRTdGFja0RvbWFpbnMoKTsKLSAgICAvL30KIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2ZpbGVzL2NhY2VydHMuYmtzIGIvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2FjZXJ0cy5ia3MKaW5kZXggZWUzNzc5MC4uMWQwNmRjMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2FjZXJ0cy5ia3MKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2FjZXJ0cy5ia3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2FjZXJ0cy8zOTllNzc1OS4wIGIvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2FjZXJ0cy8zOTllNzc1OS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDYzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9maWxlcy9jYWNlcnRzLzM5OWU3NzU5LjAKQEAgLTAsMCArMSw4MyBAQAorQ2VydGlmaWNhdGU6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDg6M2I6ZTA6NTY6OTA6NDI6NDY6YjE6YTE6NzU6NmE6Yzk6NTk6OTE6Yzc6NGEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1EaWdpQ2VydCBJbmMsIE9VPXd3dy5kaWdpY2VydC5jb20sIENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBOb3YgMTAgMDA6MDA6MDAgMjAwNiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE5vdiAxMCAwMDowMDowMCAyMDMxIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPURpZ2lDZXJ0IEluYywgT1U9d3d3LmRpZ2ljZXJ0LmNvbSwgQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmUyOjNiOmUxOjExOjcyOmRlOmE4OmE0OmQzOmEzOjU3OmFhOjUwOmEyOgorICAgICAgICAgICAgICAgICAgICA4ZjowYjo3Nzo5MDpjOTphMjphNTplZToxMjpjZTo5Njo1YjowMTowOToyMDoKKyAgICAgICAgICAgICAgICAgICAgY2M6MDE6OTM6YTc6NGU6MzA6Yjc6NTM6Zjc6NDM6YzQ6Njk6MDA6NTc6OWQ6CisgICAgICAgICAgICAgICAgICAgIGUyOjhkOjIyOmRkOjg3OjA2OjQwOjAwOjgxOjA5OmNlOmNlOjFiOjgzOmJmOgorICAgICAgICAgICAgICAgICAgICBkZjpjZDozYjo3MTo0NjplMjpkNjo2NjpjNzowNTpiMzo3NjoyNzoxNjo4ZjoKKyAgICAgICAgICAgICAgICAgICAgN2I6OWU6MWU6OTU6N2Q6ZWU6Yjc6NDg6YTM6MDg6ZGE6ZDY6YWY6N2E6MGM6CisgICAgICAgICAgICAgICAgICAgIDM5OjA2OjY1OjdmOjRhOjVkOjFmOmJjOjE3OmY4OmFiOmJlOmVlOjI4OmQ3OgorICAgICAgICAgICAgICAgICAgICA3NDo3Zjo3YTo3ODo5OTo1OTo4NTo2ODo2ZTo1YzoyMzozMjo0YjpiZjo0ZToKKyAgICAgICAgICAgICAgICAgICAgYzA6ZTg6NWE6NmQ6ZTM6NzA6YmY6Nzc6MTA6YmY6ZmM6MDE6ZjY6ODU6ZDk6CisgICAgICAgICAgICAgICAgICAgIGE4OjQ0OjEwOjU4OjMyOmE5Ojc1OjE4OmQ1OmQxOmEyOmJlOjQ3OmUyOjI3OgorICAgICAgICAgICAgICAgICAgICA2YTpmNDo5YTozMzpmODo0OTowODo2MDo4YjpkNDo1ZjpiNDozYTo4NDpiZjoKKyAgICAgICAgICAgICAgICAgICAgYTE6YWE6NGE6NGM6N2Q6M2U6Y2Y6NGY6NWY6NmM6NzY6NWU6YTA6NGI6Mzc6CisgICAgICAgICAgICAgICAgICAgIDkxOjllOmRjOjIyOmU2OjZkOmNlOjE0OjFhOjhlOjZhOmNiOmZlOmNkOmIzOgorICAgICAgICAgICAgICAgICAgICAxNDo2NDoxNzpjNzo1YjoyOTo5ZTozMjpiZjpmMjplZTpmYTpkMzowYjo0MjoKKyAgICAgICAgICAgICAgICAgICAgZDQ6YWI6Yjc6NDE6MzI6ZGE6MGM6ZDQ6ZWY6Zjg6ODE6ZDU6YmI6OGQ6NTg6CisgICAgICAgICAgICAgICAgICAgIDNmOmI1OjFiOmU4OjQ5OjI4OmEyOjcwOmRhOjMxOjA0OmRkOmY3OmIyOjE2OgorICAgICAgICAgICAgICAgICAgICBmMjo0YzowYTo0ZTowNzphODplZDo0YTozZDo1ZTpiNTo3ZjphMzo5MDpjMzoKKyAgICAgICAgICAgICAgICAgICAgYWY6MjcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBEaWdpdGFsIFNpZ25hdHVyZSwgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgMDM6REU6NTA6MzU6NTY6RDE6NEM6QkI6NjY6RjA6QTM6RTI6MUI6MUI6QzM6OTc6QjI6M0Q6RDE6NTUKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjAzOkRFOjUwOjM1OjU2OkQxOjRDOkJCOjY2OkYwOkEzOkUyOjFCOjFCOkMzOjk3OkIyOjNEOkQxOjU1CisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgY2I6OWM6Mzc6YWE6NDg6MTM6MTI6MGE6ZmE6ZGQ6NDQ6OWM6NGY6NTI6YjA6ZjQ6ZGY6YWU6CisgICAgICAgIDA0OmY1Ojc5Ojc5OjA4OmEzOjI0OjE4OmZjOjRiOjJiOjg0OmMwOjJkOmI5OmQ1OmM3OmZlOgorICAgICAgICBmNDpjMToxZjo1ODpjYjpiODo2ZDo5Yzo3YTo3NDplNzo5ODoyOTphYjoxMTpiNTplMzo3MDoKKyAgICAgICAgYTA6YTE6Y2Q6NGM6ODg6OTk6OTM6OGM6OTE6NzA6ZTI6YWI6MGY6MWM6YmU6OTM6YTk6ZmY6CisgICAgICAgIDYzOmQ1OmU0OjA3OjYwOmQzOmEzOmJmOjlkOjViOjA5OmYxOmQ1OjhlOmUzOjUzOmY0OjhlOgorICAgICAgICA2MzpmYTozZjphNzpkYjpiNDo2NjpkZjo2Mjo2NjpkNjpkMTo2ZTo0MTo4ZDpmMjoyZDpiNToKKyAgICAgICAgZWE6Nzc6NGE6OWY6OWQ6NTg6ZTI6MmI6NTk6YzA6NDA6MjM6ZWQ6MmQ6Mjg6ODI6NDU6M2U6CisgICAgICAgIDc5OjU0OjkyOjI2Ojk4OmUwOjgwOjQ4OmE4OjM3OmVmOmYwOmQ2Ojc5OjYwOjE2OmRlOmFjOgorICAgICAgICBlODowZTpjZDo2ZTphYzo0NDoxNzozODoyZjo0OTpkYTplMTo0NTozZToyYTpiOTozNjo1MzoKKyAgICAgICAgY2Y6M2E6NTA6MDY6Zjc6MmU6ZTg6YzQ6NTc6NDk6NmM6NjE6MjE6MTg6ZDU6MDQ6YWQ6Nzg6CisgICAgICAgIDNjOjJjOjNhOjgwOjZiOmE3OmViOmFmOjE1OjE0OmU5OmQ4Ojg5OmMxOmI5OjM4OjZjOmUyOgorICAgICAgICA5MTo2Yzo4YTpmZjo2NDpiOTo3NzoyNTo1NzozMDpjMDoxYjoyNDphMzplMTpkYzplOTpkZjoKKyAgICAgICAgNDc6N2M6YjU6YjQ6MjQ6MDg6MDU6MzA6ZWM6MmQ6YmQ6MGI6YmY6NDU6YmY6NTA6Yjk6YTk6CisgICAgICAgIGYzOmViOjk4OjAxOjEyOmFkOmM4Ojg4OmM2Ojk4OjM0OjVmOjhkOjBhOjNjOmM2OmU5OmQ1OgorICAgICAgICA5NTo5NTo2ZDpkZQorU0hBMSBGaW5nZXJwcmludD1BODo5ODo1RDozQTo2NTpFNTpFNTpDNDpCMjpENzpENjo2RDo0MDpDNjpERDoyRjpCMTo5Qzo1NDozNgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoCitNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCitkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JECitRVEFlRncwd05qRXhNVEF3TURBd01EQmFGdzB6TVRFeE1UQXdNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUCitNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCitiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHCis5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNGp2aEVYTGVxS1RUbzFlcVVLS1BDM2VReWFLbDdoTE9sbHNCCitDU0RNQVpPblRqQzNVL2REeEdrQVY1M2lqU0xkaHdaQUFJRUp6czRiZzcvZnpUdHhSdUxXWnNjRnMzWW5Gbzk3CituaDZWZmU2M1NLTUkydGF2ZWd3NUJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0Cis0M0MvZHhDLy9BSDJoZG1vUkJCWU1xbDFHTlhSb3I1SDRpZHE5Sm96K0VrSVlJdlVYN1E2aEwraHFrcE1mVDdQCitUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveTd2clRDMExVcTdkQk10b00xTy80CitnZFc3alZnL3RSdm9TU2lpY05veEJOMzNzaGJ5VEFwT0I2anRTajFldFgramtNT3ZKd0lEQVFBQm8yTXdZVEFPCitCZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUE5NVFOVmJSCitUTHRtOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3CitEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTXVjTjZwSUV4SUsrdDFFbkU5U3NQVGZyZ1QxZVhrSW95UVkvRXNyCitoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yRWJYamNLQ2h6VXlJbVpPTWtYRGlxdzhjdnBPcC8yUFY1QWRnCiswNk8vblZzSjhkV080MVAwam1QNlA2ZmJ0R2JmWW1iVzBXNUJqZkl0dGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGCitQbmxVa2lhWTRJQklxRGZ2OE5aNVlCYmVyT2dPelc2c1JCYzRMMG5hNFVVK0tyazJVODg2VUFiM0x1akVWMGxzCitZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCitDQVV3N0MyOUM3OUZ2MUM1cWZQcm1BRVNyY2lJeHBnMFg0MEtQTWJwMVpXVmJkND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2ZpbGVzL2NhY2VydHMvNjkxMDVmNGYuMCBiL3NlY3VyaXR5L3NyYy9tYWluL2ZpbGVzL2NhY2VydHMvNjkxMDVmNGYuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQwM2YwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2FjZXJ0cy82OTEwNWY0Zi4wCkBAIC0wLDAgKzEsODMgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDBjOmU3OmUwOmU1OjE3OmQ4OjQ2OmZlOjhmOmU1OjYwOmZjOjFiOmYwOjMwOjM5CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaUNlcnQgSW5jLCBPVT13d3cuZGlnaWNlcnQuY29tLCBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE5vdiAxMCAwMDowMDowMCAyMDA2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTm92IDEwIDAwOjAwOjAwIDIwMzEgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RGlnaUNlcnQgSW5jLCBPVT13d3cuZGlnaWNlcnQuY29tLCBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmFkOjBlOjE1OmNlOmU0OjQzOjgwOjVjOmIxOjg3OmYzOmI3OjYwOmY5OgorICAgICAgICAgICAgICAgICAgICA3MToxMjphNTphZTpkYzoyNjo5NDo4ODphYTpmNDpjZTpmNToyMDozOToyODoKKyAgICAgICAgICAgICAgICAgICAgNTg6NjA6MGM6Zjg6ODA6ZGE6YTk6MTU6OTU6MzI6NjE6M2M6YjU6YjE6Mjg6CisgICAgICAgICAgICAgICAgICAgIDg0OjhhOjhhOmRjOjlmOjBhOjBjOjgzOjE3OjdhOjhmOjkwOmFjOjhhOmU3OgorICAgICAgICAgICAgICAgICAgICA3OTo1Mzo1YzozMTo4NDoyYTpmNjowZjo5ODozMjozNjo3NjpjYzpkZTpkZDoKKyAgICAgICAgICAgICAgICAgICAgM2M6YTg6YTI6ZWY6NmE6ZmI6MjE6ZjI6NTI6NjE6ZGY6OWY6MjA6ZDc6MWY6CisgICAgICAgICAgICAgICAgICAgIGUyOmIxOmQ5OmZlOjE4OjY0OmQyOjEyOjViOjVmOmY5OjU4OjE4OjM1OmJjOgorICAgICAgICAgICAgICAgICAgICA0NzpjZDphMTozNjpmOTo2Yjo3ZjpkNDpiMDozODozZTpjMToxYjpjMzo4YzoKKyAgICAgICAgICAgICAgICAgICAgMzM6ZDk6ZDg6MmY6MTg6ZmU6Mjg6MGY6YjM6YTc6ODM6ZDY6YzM6NmU6NDQ6CisgICAgICAgICAgICAgICAgICAgIGMwOjYxOjM1Ojk2OjE2OmZlOjU5OjljOjhiOjc2OjZkOmQ3OmYxOmEyOjRiOgorICAgICAgICAgICAgICAgICAgICAwZDoyYjpmZjowYjo3MjpkYTo5ZTo2MDpkMDo4ZTo5MDozNTpjNjo3ODo1NToKKyAgICAgICAgICAgICAgICAgICAgODc6MjA6YTE6Y2Y6ZTU6NmQ6MGE6Yzg6NDk6N2M6MzE6OTg6MzM6NmM6MjI6CisgICAgICAgICAgICAgICAgICAgIGU5Ojg3OmQwOjMyOjVhOmEyOmJhOjEzOjgyOjExOmVkOjM5OjE3OjlkOjk5OgorICAgICAgICAgICAgICAgICAgICAzYTo3MjphMTplNjpmYTphNDpkOTpkNToxNzozMTo3NTphZTo4NTo3ZDoyMjoKKyAgICAgICAgICAgICAgICAgICAgYWU6M2Y6MDE6NDY6ODY6ZjY6Mjg6Nzk6Yzg6YjE6ZGE6ZTQ6NTc6MTc6YzQ6CisgICAgICAgICAgICAgICAgICAgIDdlOjFjOjBlOmIwOmI0OjkyOmE2OjU2OmIzOmJkOmIyOjk3OmVkOmFhOmE3OgorICAgICAgICAgICAgICAgICAgICBmMDpiNzpjNTphODozZjo5NToxNjpkMDpmZjphMTo5NjplYjowODo1ZjoxODoKKyAgICAgICAgICAgICAgICAgICAgNzc6NGYKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBEaWdpdGFsIFNpZ25hdHVyZSwgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNDU6RUI6QTI6QUY6RjQ6OTI6Q0I6ODI6MzE6MkQ6NTE6OEI6QTc6QTc6MjE6OUQ6RjM6NkQ6Qzg6MEYKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjQ1OkVCOkEyOkFGOkY0OjkyOkNCOjgyOjMxOjJEOjUxOjhCOkE3OkE3OjIxOjlEOkYzOjZEOkM4OjBGCisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYTI6MGU6YmM6ZGY6ZTI6ZWQ6ZjA6ZTM6NzI6NzM6N2E6NjQ6OTQ6YmY6Zjc6NzI6NjY6ZDg6CisgICAgICAgIDMyOmU0OjQyOjc1OjYyOmFlOjg3OmViOmYyOmQ1OmQ5OmRlOjU2OmIzOjlmOmNjOmNlOjE0OgorICAgICAgICAyODpiOTowZDo5Nzo2MDo1YzoxMjo0Yzo1ODplNDpkMzozZDo4Mzo0OTo0NTo1ODo5NzozNToKKyAgICAgICAgNjk6MWE6YTg6NDc6ZWE6NTY6YzY6Nzk6YWI6MTI6ZDg6Njc6ODE6ODQ6ZGY6N2Y6MDk6M2M6CisgICAgICAgIDk0OmU2OmI4OjI2OjJjOjIwOmJkOjNkOmIzOjI4Ojg5OmY3OjVmOmZmOjIyOmUyOjk3Ojg0OgorICAgICAgICAxZjplOTo2NTplZjo4NzplMDpkZjpjMTo2Nzo0OTpiMzo1ZDplYjpiMjowOToyYTplYjoyNjoKKyAgICAgICAgZWQ6Nzg6YmU6N2Q6M2Y6MmI6ZjM6Yjc6MjY6MzU6NmQ6NWY6ODk6MDE6YjY6NDk6NWI6OWY6CisgICAgICAgIDAxOjA1OjliOmFiOjNkOjI1OmMxOmNjOmI2OjdmOmMyOmYxOjZmOjg2OmM2OmZhOjY0OjY4OgorICAgICAgICBlYjo4MToyZDo5NDplYjo0MjpiNzpmYTo4YzoxZTpkZDo2MjpmMTpiZTo1MDo2NzpiNzo2YzoKKyAgICAgICAgYmQ6ZjM6ZjE6MWY6NmI6MGM6MzY6MDc6MTY6N2Y6Mzc6N2M6YTk6NWI6NmQ6N2E6ZjE6MTI6CisgICAgICAgIDQ2OjYwOjgzOmQ3OjI3OjA0OmJlOjRiOmNlOjk3OmJlOmMzOjY3OjJhOjY4OjExOmRmOjgwOgorICAgICAgICBlNzowYzozMzo2NjpiZjoxMzowZDoxNDo2ZTpmMzo3ZjoxZjo2MzoxMDoxZTpmYTo4ZDoxYjoKKyAgICAgICAgMjU6NmQ6NmM6OGY6YTU6Yjc6NjE6MDE6YjE6ZDI6YTM6MjY6YTE6MTA6NzE6OWQ6YWQ6ZTI6CisgICAgICAgIGMzOmY5OmMzOjk5OjUxOmI3OjJiOjA3OjA4OmNlOjJlOmU2OjUwOmIyOmE3OmZhOjBhOjQ1OgorICAgICAgICAyZjphMjpmMDpmMgorU0hBMSBGaW5nZXJwcmludD0wNTo2MzpCODo2MzowRDo2MjpENzo1QTpCQjpDODpBQjoxRTo0QjpERjpCNTpBODo5OTpCMjo0RDo0MworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEdHpDQ0FwK2dBd0lCQWdJUURPZmc1UmZZUnY2UDVXRDhHL0F3T1RBTkJna3Foa2lHOXcwQkFRVUZBREJsCitNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCitkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CitiM1FnUTBFd0hoY05NRFl4TVRFd01EQXdNREF3V2hjTk16RXhNVEV3TURBd01EQXdXakJsTVFzd0NRWURWUVFHCitFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCitjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdnZ0VpCitNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0RGhYTzVFT0FYTEdIODdkZytYRVNwYTdjCitKcFNJcXZUTzlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQCittREkyZHN6ZTNUeW9vdTlxK3lIeVVtSGZueURYSCtLeDJmNFlaTklTVzEvNVdCZzF2RWZOb1RiNWEzL1VzRGcrCit3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVy9sbWNpM1p0MS9HaVN3MHIvd3R5MnA1ZzBJNlFOY1o0CitWWWNnb2MvbGJRcklTWHd4bUROc0l1bUgwREphb3JvVGdoSHRPUmVkbVRweW9lYjZwTm5WRnpGMXJvVjlJcTQvCitBVWFHOWloNXlMSGE1RmNYeEg0Y0RyQzBrcVpXczcyeWwrMnFwL0MzeGFnL2xSYlEvNkdXNndoZkdIZFBBZ01CCitBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXCitCQlJGNjZLdjlKTExnakV0VVl1bnB5R2Q4MjNJRHpBZkJnTlZIU01FR0RBV2dCUkY2Nkt2OUpMTGdqRXRVWXVuCitweUdkODIzSUR6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFvZzY4MytMdDhPTnljM3BrbEwvM2NtYllNdVJDCitkV0t1aCt2eTFkbmVWck9mek00VUtMa05sMkJjRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmCitmd2s4bE9hNEppd2d2VDJ6S0luM1gvOGk0cGVFSCtsbDc0ZmczOEZuU2JOZDY3SUpLdXNtN1hpK2ZUOHI4N2NtCitOVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpOGI1UVo3ZHN2ZlB4CitIMnNNTmdjV2Z6ZDhxVnR0ZXZFU1JtQ0QxeWNFdmt2T2w3N0RaeXBvRWQrQTV3d3pacjhURFJSdTgzOGZZeEFlCisrbzBiSlcxc2o2VzNZUUd4MHFNbW9SQnhuYTNpdy9uRG1WRzNLd2NJemk3bVVMS24rZ3BGTDZMdzhnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2ZpbGVzL2NhY2VydHMvODFiOTc2OGYuMCBiL3NlY3VyaXR5L3NyYy9tYWluL2ZpbGVzL2NhY2VydHMvODFiOTc2OGYuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjNmYzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2FjZXJ0cy84MWI5NzY4Zi4wCkBAIC0wLDAgKzEsODQgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOmFjOjVjOjI2OjZhOjBiOjQwOjliOjhmOjBiOjc5OmYyOmFlOjQ2OjI1Ojc3CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaUNlcnQgSW5jLCBPVT13d3cuZGlnaWNlcnQuY29tLCBDTj1EaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBOb3YgMTAgMDA6MDA6MDAgMjAwNiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE5vdiAxMCAwMDowMDowMCAyMDMxIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPURpZ2lDZXJ0IEluYywgT1U9d3d3LmRpZ2ljZXJ0LmNvbSwgQ049RGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YzY6Y2M6ZTU6NzM6ZTY6ZmI6ZDQ6YmI6ZTU6MmQ6MmQ6MzI6YTY6ZGY6CisgICAgICAgICAgICAgICAgICAgIGU1OjgxOjNmOmM5OmNkOjI1OjQ5OmI2OjcxOjJhOmMzOmQ1Ojk0OjM0OjY3OgorICAgICAgICAgICAgICAgICAgICBhMjowYToxYzpiMDo1Zjo2OTphNjo0MDpiMTpjNDpiNzpiMjo4ZjpkMDo5ODoKKyAgICAgICAgICAgICAgICAgICAgYTQ6YTk6NDE6NTk6M2E6ZDM6ZGM6OTQ6ZDY6M2M6ZGI6NzQ6Mzg6YTQ6NGE6CisgICAgICAgICAgICAgICAgICAgIGNjOjRkOjI1OjgyOmY3OjRhOmE1OjUzOjEyOjM4OmVlOmYzOjQ5OjZkOjcxOgorICAgICAgICAgICAgICAgICAgICA5MTo3ZTo2MzpiNjphYjphNjo1ZjpjMzphNDo4NDpmODo0Zjo2Mjo1MTpiZToKKyAgICAgICAgICAgICAgICAgICAgZjg6YzU6ZWM6ZGI6Mzg6OTI6ZTM6MDY6ZTU6MDg6OTE6MGM6YzQ6Mjg6NDE6CisgICAgICAgICAgICAgICAgICAgIDU1OmZiOmNiOjVhOjg5OjE1OjdlOjcxOmU4OjM1OmJmOjRkOjcyOjA5OjNkOgorICAgICAgICAgICAgICAgICAgICBiZTozYTozODo1MDo1Yjo3NzozMToxYjo4ZDpiMzpjNzoyNDo0NTo5YTphNzoKKyAgICAgICAgICAgICAgICAgICAgYWM6NmQ6MDA6MTQ6NWE6MDQ6Yjc6YmE6MTM6ZWI6NTE6MGE6OTg6NDE6NDE6CisgICAgICAgICAgICAgICAgICAgIDIyOjRlOjY1OjYxOjg3OjgxOjQxOjUwOmE2Ojc5OjVjOjg5OmRlOjE5OjRhOgorICAgICAgICAgICAgICAgICAgICA1NzpkNToyZTplNjo1ZDoxYzo1MzoyYzo3ZTo5ODpjZDoxYTowNjoxNjphNDoKKyAgICAgICAgICAgICAgICAgICAgNjg6NzM6ZDA6MzQ6MDQ6MTM6NWM6YTE6NzE6ZDM6NWE6N2M6NTU6ZGI6NWU6CisgICAgICAgICAgICAgICAgICAgIDY0OmUxOjM3Ojg3OjMwOjU2OjA0OmU1OjExOmI0OjI5OjgwOjEyOmYxOjc5OgorICAgICAgICAgICAgICAgICAgICAzOTo4ODphMjowMjoxMTo3YzoyNzo2NjpiNzo4ODpiNzo3ODpmMjpjYTowYToKKyAgICAgICAgICAgICAgICAgICAgYTg6Mzg6YWI6MGE6NjQ6YzI6YmY6NjY6NWQ6OTU6ODQ6YzE6YTE6MjU6MWU6CisgICAgICAgICAgICAgICAgICAgIDg3OjVkOjFhOjUwOjBiOjIwOjEyOmNjOjQxOmJiOjZlOjBiOjUxOjM4OmI4OgorICAgICAgICAgICAgICAgICAgICA0YjpjYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIERpZ2l0YWwgU2lnbmF0dXJlLCBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBCMTozRTpDMzo2OTowMzpGODpCRjo0NzowMTpENDo5ODoyNjoxQTowODowMjpFRjo2Mzo2NDoyQjpDMworICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6QjE6M0U6QzM6Njk6MDM6Rjg6QkY6NDc6MDE6RDQ6OTg6MjY6MUE6MDg6MDI6RUY6NjM6NjQ6MkI6QzMKKworICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAxYzoxYTowNjo5NzpkYzpkNzo5Yzo5ZjozYzo4ODo2NjowNjowODo1NzoyMTpkYjoyMTo0NzoKKyAgICAgICAgZjg6MmE6Njc6YWE6YmY6MTg6MzI6NzY6NDA6MTA6NTc6YzE6OGE6ZjM6N2E6ZDk6MTE6NjU6CisgICAgICAgIDhlOjM1OmZhOjllOmZjOjQ1OmI1OjllOmQ5OjRjOjMxOjRiOmI4OjkxOmU4OjQzOjJjOjhlOgorICAgICAgICBiMzo3ODpjZTpkYjplMzo1Mzo3OTo3MTpkNjplNToyMTo5NDowMTpkYTo1NTo4Nzo5YToyNDoKKyAgICAgICAgNjQ6ZjY6OGE6NjY6Y2M6ZGU6OWM6Mzc6Y2Q6YTg6MzQ6YjE6Njk6OWI6MjM6Yzg6OWU6Nzg6CisgICAgICAgIDIyOjJiOjcwOjQzOmUzOjU1OjQ3OjMxOjYxOjE5OmVmOjU4OmM1Ojg1OjJmOjRlOjMwOmY2OgorICAgICAgICBhMDozMToxNjoyMzpjODplNzplMjo2NToxNjozMzpjYjpiZjoxYToxYjphMDozZDpmODpjYToKKyAgICAgICAgNWU6OGI6MzE6OGI6NjA6MDg6ODk6MmQ6MGM6MDY6NWM6NTI6Yjc6YzQ6Zjk6MGE6OTg6ZDE6CisgICAgICAgIDE1OjVmOjlmOjEyOmJlOjdjOjM2OjYzOjM4OmJkOjQ0OmE0OjdmOmU0OjI2OjJiOjBhOmM0OgorICAgICAgICA5Nzo2OTowZDplOTo4YzplMjpjMDoxMDo1NzpiODpjODo3NjoxMjo5MTo1NTpmMjo0ODo2OToKKyAgICAgICAgZDg6YmM6MmE6MDI6NWI6MGY6NDQ6ZDQ6MjA6MzE6ZGI6ZjQ6YmE6NzA6MjY6NWQ6OTA6NjA6CisgICAgICAgIDllOmJjOjRiOjE3OjA5OjJmOmI0OmNiOjFlOjQzOjY4OmM5OjA3OjI3OmMxOmQyOjVjOmY3OgorICAgICAgICBlYToyMTpiOTo2ODoxMjo5YzozYzo5YzpiZjo5ZTpmYzo4MDo1Yzo5Yjo2MzpjZDplYzo0NzoKKyAgICAgICAgYWE6MjU6Mjc6Njc6YTA6Mzc6ZjM6MDA6ODI6N2Q6NTQ6ZDc6YTk6Zjg6ZTk6MmU6MTM6YTM6CisgICAgICAgIDc3OmU4OjFmOjRhCitTSEExIEZpbmdlcnByaW50PTVGOkI3OkVFOjA2OjMzOkUyOjU5OkRCOkFEOjBDOjRDOjlBOkU2OkQzOjhGOjFBOjYxOkM3OkRDOjI1CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnMKK01Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKK2QzY3VaR2xuYVdObGNuUXVZMjl0TVNzd0tRWURWUVFERXlKRWFXZHBRMlZ5ZENCSWFXZG9JRUZ6YzNWeVlXNWoKK1pTQkZWaUJTYjI5MElFTkJNQjRYRFRBMk1URXhNREF3TURBd01Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUwKK01Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RERVJwWjJsRFpYSjBJRWx1WXpFWk1CY0dBMVVFQ3hNUWQzZDMKK0xtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdVkyVWcKK1JWWWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU1iTTVYUG0KKys5Uzc1UzB0TXFiZjVZRS95YzBsU2JaeEtzUFZsRFJub2dvY3NGOXBwa0N4eExleWo5Q1lwS2xCV1RyVDNKVFcKK1BOdDBPS1JLekUwbGd2ZEtwVk1TT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU0KK3hDaEJWZnZMV29rVmZuSG9OYjlOY2drOXZqbzRVRnQzTVJ1TnM4Y2tSWnFuckcwQUZGb0V0N29UNjFFS21FRkIKK0lrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRTkFRVFhLRngwMXA4VmR0ZVpPRTMKK2h6QldCT1VSdENtQUV2RjVPWWlpQWhGOEoyYTNpTGQ0OHNvS3FEaXJDbVRDdjJaZGxZVEJvU1VlaDEwYVVBc2cKK0VzeEJ1MjRMVVRpNFM4c0NBd0VBQWFOak1HRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUYKK01BTUJBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUEKK0ZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFjR2dhWDNOZWMKK256eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVFWOEdLODNyWkVXV09OZnFlL0VXMW50bE1NVXU0a2VoRExJNnoKK2VNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnBteVBJbm5naUszQkQ0MVZITVdFWjcxakYKK2hTOU9NUGFnTVJZanlPZmlaUll6eTc4YUc2QTkrTXBlaXpHTFlBaUpMUXdHWEZLM3hQa0ttTkVWWDU4U3ZudzIKK1l6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKK3ZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXAKKytPa3VFNk4zNkI5SworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2VydGltcG9ydC5zaCBiL3NlY3VyaXR5L3NyYy9tYWluL2ZpbGVzL2NlcnRpbXBvcnQuc2gKaW5kZXggZmUzZjk0My4uN2MwZmFiMCAxMDA3NTUKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vZmlsZXMvY2VydGltcG9ydC5zaAorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9maWxlcy9jZXJ0aW1wb3J0LnNoCkBAIC0xLDggKzEsNSBAQAogIyEvYmluL2Jhc2gKICMgVGhpcyBzY3JpcHQgd2FzIHRlc3RlZCB0byB3b3JrIHdpdGggYm91bmN5Y2FzdGxlIDEuMzIuCi0jCi0jIChOT1RFOiBrZXl0b29sIGRvZXMgbm90IHBpY2sgdXAgYm91bmN5Y2FzdGxlJ3MgamNlIHByb3ZpZGVyIGphcgotIyAgdW5sZXNzIGl0IGlzIGluc3RhbGxlZCB1bmRlciB0aGUgc3lzdGVtIGphciBkaXJlY3RvcnkpCiAKIHNldCAteAogc2V0IC1lCkBAIC0yOSw2ICsyNiw3IEBACiAgICAgICAta2V5c3RvcmUgJENFUlRTVE9SRSBcCiAgICAgICAtc3RvcmV0eXBlIEJLUyBcCiAgICAgICAtcHJvdmlkZXIgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQm91bmN5Q2FzdGxlUHJvdmlkZXIgXAorICAgICAgLXByb3ZpZGVycGF0aCAvdXNyL3NoYXJlL2phdmEvYmNwcm92LmphciBcCiAgICAgICAtc3RvcmVwYXNzICRTVE9SRVBBU1MKICAgbGV0ICJDT1VOVEVSPSRDT1VOVEVSICsgMSIKIGRvbmUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDMxOTY4YzAuLjE3MTBlNzcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sRXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xFeGNlcHRpb24uamF2YQpAQCAtMjMsNDAgKzIzLDM4IEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogVGhpcyBydW50aW1lIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhbiBhY2Nlc3MgY29udHJvbCBjaGVjayBpbmRpY2F0ZXMgdGhhdAotICogYWNjZXNzIHNob3VsZCBub3QgYmUgZ3JhbnRlZC4KKyAqIHtAY29kZSBBY2Nlc3NDb250cm9sRXhjZXB0aW9ufSBpcyB0aHJvd24gaWYgdGhlIGFjY2VzcyBjb250cm9sIGluZnJhc3RydWN0dXJlCisgKiBkZW5pZXMgcHJvdGVjdGVkIGFjY2VzcyBkdWUgdG8gbWlzc2luZyBwZXJtaXNzaW9ucy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGV4dGVuZHMgU2VjdXJpdHlFeGNlcHRpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTEzODIyNTY4NDA5Njk4ODUzNUw7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKLSAgICAgKi8KICAgICBwcml2YXRlIFBlcm1pc3Npb24gcGVybTsgLy8gTmFtZWQgYXMgZGVtYW5kZWQgYnkgU2VyaWFsaXplZCBGb3JtLgogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZ2l2ZW4gbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrLCBtZXNzYWdlIGFuZAotICAgICAqIGFzc29jaWF0ZWQgcGVybWlzc2lvbiBhbGwgZmlsbGVkIGluLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZ2l2ZW4gbWVzc2FnZSBhbmQgdGhlIHJlcXVlc3RlZCB7QGNvZGUgUGVybWlzc2lvbn0gd2hpY2ggd2FzIG5vdCBncmFudGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSBwZXJtCi0gICAgICogICAgICAgICAgICBQZXJtaXNzaW9uIFRoZSBmYWlsZWQgcGVybWlzc2lvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQge0Bjb2RlIFBlcm1pc3Npb259IHdoaWNoIHdhcyBub3QgZ3JhbnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgUGVybWlzc2lvbiBwZXJtKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOwpAQCAtNjQsMTAgKzYyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVjZWl2ZXIncyBwZXJtaXNzaW9uLgorICAgICAqIFJldHVybnMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHRoYXQgY2F1c2VkIHRoaXMgRXhjZXB0aW9uIG9yIHtAY29kZQorICAgICAqIG51bGx9IGlmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFBlcm1pc3Npb259LgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gUGVybWlzc2lvbiB0aGUgcmVjZWl2ZXIncyBwZXJtaXNzaW9uCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHBlcm1pc3Npb24gdGhhdCBjYXVzZWQgdGhpcyBFeGNlcHRpb24sIG1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGVybWlzc2lvbiBnZXRQZXJtaXNzaW9uKCkgewogICAgICAgICByZXR1cm4gcGVybTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IuamF2YQppbmRleCA3YzEwMzU0Li4xOTllZmExIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5qYXZhCkBAIC0yNywxMiArMjcsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKLQogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcn0gaXMgYW4gZW5naW5lIGNsYXNzIHdoaWNoIGlzIGNhcGFibGUgb2YKKyAqIGdlbmVyYXRpbmcgcGFyYW1ldGVycyBmb3IgdGhlIGFsZ29yaXRobSBpdCB3YXMgaW5pdGlhbGl6ZWQgd2l0aC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciB7CiAKICAgICAvLyBTdG9yZSBzcGkgc2VydmljZSBuYW1lCkBAIC01NCw4ICs1NCwxNiBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFsZ29yaXRobTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcn0gd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBhcmd1bWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmFtR2VuU3BpCisgICAgICogICAgICAgICAgICBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uLCB0aGlzIGVuZ2luZSBpbnN0YW5jZSBkZWxlZ2F0ZXMgdG8uCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yKAogICAgICAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpIHBhcmFtR2VuU3BpLCBQcm92aWRlciBwcm92aWRlciwKQEAgLTY2LDE3ICs3NCwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3J9IGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgYWxnb3JpdGhtLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0byB1c2UuCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yfSBmb3IgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTkyLDEwICsxMTEsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcn0gZnJvbSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbGdvcml0aG0gaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbikgYXMgaW4gMS40IHJlbGVhc2UKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHByb3ZpZGVyIG9mIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcn0uCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yfSBmb3IgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKQEAgLTExMiwxMCArMTQ0LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3J9IGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYWxnb3JpdGhtIGlzIG51bGwgKGluc3RlYWQgb2YKLSAgICAgKiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24pIGFzIGluIDEuNCByZWxlYXNlCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0byB1c2UuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3J9LgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcn0gZm9yIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTM0LDMyICsxNzYsNTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3J9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3J9IHdpdGggdGhlIGdpdmVuIHNpemUuCisgICAgICogVGhlIGRlZmF1bHQgcGFyYW1ldGVyIHNldCBhbmQgYSBkZWZhdWx0IHtAY29kZSBTZWN1cmVSYW5kb219IGluc3RhbmNlCisgICAgICogd2lsbCBiZSB1c2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSAoaW4gbnVtYmVyIG9mIGJpdHMpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoaW50IHNpemUpIHsKICAgICAgICAgc3BpSW1wbC5lbmdpbmVJbml0KHNpemUsIHJhbmRtKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3J9IHdpdGggdGhlIGdpdmVuIHNpemUKKyAgICAgKiBhbmQgdGhlIGdpdmVuIHtAY29kZSBTZWN1cmVSYW5kb219LiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXIgc2V0IHdpbGwgYmUKKyAgICAgKiB1c2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSAoaW4gbnVtYmVyIG9mIGJpdHMpLgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgcmFuZG9tbmVzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KGludCBzaXplLCBTZWN1cmVSYW5kb20gcmFuZG9tKSB7CiAgICAgICAgIHNwaUltcGwuZW5naW5lSW5pdChzaXplLCByYW5kb20pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcn0gd2l0aCB0aGUgZ2l2ZW4ge0Bjb2RlCisgICAgICogQWxnb3JpdGhtUGFyYW1ldGVyU3BlY30uIEEgZGVmYXVsdCB7QGNvZGUgU2VjdXJlUmFuZG9tfSBpbnN0YW5jZSB3aWxsIGJlCisgICAgICogdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuUGFyYW1TcGVjCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyB0byB1c2UuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBnZW5QYXJhbVNwZWMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC0xNjcsOCArMjMyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yfSB3aXRoIHRoZSBnaXZlbgorICAgICAqIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfSBhbmQgdGhlIGdpdmVuIHtAY29kZSBTZWN1cmVSYW5kb219LgorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5QYXJhbVNwZWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXJzIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9mIHJhbmRvbW5lc3MuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBnZW5QYXJhbVNwZWMsCiAgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tKSB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC0xNzYsOCArMjQ5LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGZvciB0aGlzIGdlbmVyYXRvcidzCisgICAgICogYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGZvciB0aGlzIGdlbmVyYXRvcidzIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQWxnb3JpdGhtUGFyYW1ldGVycyBnZW5lcmF0ZVBhcmFtZXRlcnMoKSB7CiAgICAgICAgIHJldHVybiBzcGlJbXBsLmVuZ2luZUdlbmVyYXRlUGFyYW1ldGVycygpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaS5qYXZhCmluZGV4IDcwY2I4ZDIuLjlkZGZmMjMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpLmphdmEKQEAgLTI1LDM0ICsyNSw1NiBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpfSBpcyB0aGUgU2VydmljZSBQcm92aWRlciBJbnRlcmZhY2UKKyAqIChTUEkpIGRlZmluaXRpb24gZm9yIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3J9LgogICogCisgKiBAc2VlIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGkgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpfSAuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaSgpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGl9IHdpdGggdGhlIGdpdmVuCisgICAgICogc2l6ZSBhbmQgdGhlIGdpdmVuIHtAY29kZSBTZWN1cmVSYW5kb219LiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXIgc2V0CisgICAgICogd2lsbCBiZSB1c2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSAoaW4gbnVtYmVyIG9mIGJpdHMpLgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgcmFuZG9tbmVzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KGludCBzaXplLCBTZWN1cmVSYW5kb20gcmFuZG9tKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaX0gd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyU3BlY30gYW5kIHRoZSBnaXZlbiB7QGNvZGUgU2VjdXJlUmFuZG9tfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuUGFyYW1TcGVjCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyB0byB1c2UuCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiByYW5kb21uZXNzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KEFsZ29yaXRobVBhcmFtZXRlclNwZWMgZ2VuUGFyYW1TcGVjLAogICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30gZm9yIHRoaXMgZ2VuZXJhdG9yJ3MKKyAgICAgKiBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30gZm9yIHRoaXMgZ2VuZXJhdG9yJ3MgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdlbmVyYXRlUGFyYW1ldGVycygpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJzLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVycy5qYXZhCmluZGV4IGU0OTU0MzkuLmFhZWZlMWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJzLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlcnMuamF2YQpAQCAtMzEsMTAgKzMxLDExIEBACiAKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGlzIGFuIGVuZ2luZSBjbGFzcyB3aGljaCBwcm92aWRlcyBhbGdvcml0aG0KKyAqIHBhcmFtZXRlcnMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBBbGdvcml0aG1QYXJhbWV0ZXJzIHsKICAgICAvKioKICAgICAgKiBUaGUgc2VydmljZSBuYW1lLgpAQCAtNDIsMTIgKzQzLDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVklDRSA9ICJBbGdvcml0aG1QYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogVXNlZCB0byBhY2Nlc3MgY29tbW9uIGVuZ2luZSBmdW5jdGlvbmFsaXR5CisgICAgICogVXNlZCB0byBhY2Nlc3MgY29tbW9uIGVuZ2luZSBmdW5jdGlvbmFsaXR5LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIEVuZ2luZSBlbmdpbmUgPSBuZXcgRW5naW5lKFNFVklDRSk7CiAKICAgICAvKioKLSAgICAgKiBUaGUgcHJvdmlkZXIKKyAgICAgKiBUaGUgc2VjdXJpdHkgcHJvdmlkZXIuCiAgICAgICovCiAgICAgcHJpdmF0ZSBQcm92aWRlciBwcm92aWRlcjsKIApAQCAtNTcsMjkgKzU4LDUwIEBACiAgICAgcHJpdmF0ZSBBbGdvcml0aG1QYXJhbWV0ZXJzU3BpIHNwaUltcGw7CiAKICAgICAvKioKLSAgICAgKiBUaGUgYWxnb3JpdGhtLgorICAgICAqIFRoZSBzZWN1cml0eSBhbGdvcml0aG0uCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgYWxnb3JpdGhtOwogCiAgICAgLyoqCi0gICAgICogVGhlIGluaXRpYWxpemF0aW9uIHN0YXRlCisgICAgICogVGhlIGluaXRpYWxpemF0aW9uIHN0YXRlLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsgLy8gPSBmYWxzZTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IHdpdGggdGhlIGdpdmVuCisgICAgICogYXJndW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdQcmFtU3BpCisgICAgICogICAgICAgICAgICB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgc2VjdXJpdHkgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWxnb3JpdGhtUGFyYW1ldGVycyhBbGdvcml0aG1QYXJhbWV0ZXJzU3BpIGtleUZhY1NwaSwKKyAgICBwcm90ZWN0ZWQgQWxnb3JpdGhtUGFyYW1ldGVycyhBbGdvcml0aG1QYXJhbWV0ZXJzU3BpIGFsZ1ByYW1TcGksCiAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlciwgU3RyaW5nIGFsZ29yaXRobSkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gcmVuYW1lZCBwYXJhbWV0ZXIKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7CiAgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOwotICAgICAgICB0aGlzLnNwaUltcGwgPSBrZXlGYWNTcGk7CisgICAgICAgIHRoaXMuc3BpSW1wbCA9IGFsZ1ByYW1TcGk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30gZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0byB1c2UuCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30gZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtOTQsOCArMTE2LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gdG8gdXNlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcHJvdmlkZXIgb2YgdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHByb3ZpZGVyfSBpcyB7QGNvZGUgbnVsbH0gb3Igb2YgbGVuZ3RoIHplcm8uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKQEAgLTExMiw4ICsxNTAsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwcm92aWRlciBmb3IgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0byB1c2UuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHByb3ZpZGVyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBbGdvcml0aG1QYXJhbWV0ZXJzIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sCiAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC0xMzEsMjQgKzE4MywzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSB3aXRoIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogQWxnb3JpdGhtUGFyYW1ldGVyU3BlY30uCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmFtU3BlYworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogICAgICAgICAgICAgaW5pdGlhbGl6ZWQgb3IgdGhlIGdpdmVuIHtAY29kZSBwYXJhbVNwZWN9IGlzIG5vdCBhcHByb3ByaWF0ZQorICAgICAqICAgICAgICAgICAgIGZvciBpbml0aWFsaXppbmcgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtU3BlYykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbiB7CkBAIC0xNjEsOCArMjI1LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30gd2l0aCB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIGJ5dGVbXX0gdXNpbmcgdGhlIGRlZmF1bHQgZGVjb2RpbmcgZm9ybWF0IGZvciBwYXJhbWV0ZXJzLiBUaGUgZGVmYXVsdAorICAgICAqIGVuY29kaW5nIGZvcm1hdCBpcyBBU04uMS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogICAgICAgICAgICAgaW5pdGlhbGl6ZWQsIG9yIHRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIGVuY29kZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChieXRlW10gcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKQEAgLTE3Myw4ICsyNDUsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSB3aXRoIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogYnl0ZVtdfSB1c2luZyB0aGUgc3BlY2lmaWVkIGRlY29kaW5nIGZvcm1hdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZWNvZGluZyBmb3JtYXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgICAgICAgICAgICBpbml0aWFsaXplZCwgb3IgdGhlIHBhcmFtZXRlciBjb3VsZCBub3QgYmUgZW5jb2RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KGJ5dGVbXSBwYXJhbXMsIFN0cmluZyBmb3JtYXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewpAQCAtMTg1LDggKzI2NiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfSBmb3IgdGhpcyB7QGNvZGUKKyAgICAgKiBBbGdvcml0aG1QYXJhbWV0ZXJzfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1TcGVjCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gaW4gd2hpY2ggdGhpcworICAgICAqICAgICAgICAgICAgcGFyYW1ldGVycyBzaG91bGQgYmUgY29udmVydGVkLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfSBmb3IgdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnN9LgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogICAgICAgICAgICAgaW5pdGlhbGl6ZWQsIG9yIGlmIHRoaXMgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgY29udmVydGVkIHRvCisgICAgICogICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjbGFzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgPFQgZXh0ZW5kcyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjPiBUIGdldFBhcmFtZXRlclNwZWMoQ2xhc3M8VD4gcGFyYW1TcGVjKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIHsKQEAgLTE5OCw4ICsyOTAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGluIHRoZWlyIGRlZmF1bHQgZW5jb2RpbmcKKyAgICAgKiBmb3JtYXQuIFRoZSBkZWZhdWx0IGVuY29kaW5nIGZvcm1hdCBpcyBBU04uMS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHBhcmFtZXRlcnMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgICAgICAgICAgICBpbml0aWFsaXplZCwgb3IgaWYgdGhpcyBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSBlbmNvZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZ2V0RW5jb2RlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKQEAgLTIwOSw4ICszMDcsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGluIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcKKyAgICAgKiBmb3JtYXQuCisgICAgICogCisgICAgICogQHBhcmFtIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIGZvcm1hdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHBhcmFtZXRlcnMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgICAgICAgICAgICBpbml0aWFsaXplZCwgb3IgaWYgdGhpcyBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSBlbmNvZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZ2V0RW5jb2RlZChTdHJpbmcgZm9ybWF0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoIWluaXRpYWxpemVkKSB7CkBAIC0yMjAsOCArMzI2LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAoIWluaXRpYWxpemVkKSB7CkBAIC0yMjksNCArMzM4LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3BpSW1wbC5lbmdpbmVUb1N0cmluZygpOwogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyc1NwaS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlcnNTcGkuamF2YQppbmRleCBkNDA1NDY2Li4zYmM4ODkxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyc1NwaS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJzU3BpLmphdmEKQEAgLTI3LDU1ICsyNywxMDkgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzU3BpfSBpcyB0aGUgU2VydmljZSBQcm92aWRlciBJbnRlcmZhY2UgKFNQSSkKKyAqIGRlZmluaXRpb24gZm9yIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfS4KICAqIAorICogQHNlZSBBbGdvcml0aG1QYXJhbWV0ZXJzCiAgKi8KLQogcHVibGljIGFic3RyYWN0IGNsYXNzIEFsZ29yaXRobVBhcmFtZXRlcnNTcGkgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc1NwaX0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlclNwZWN9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbVNwZWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc1NwaX0gaGFzIGFscmVhZHkgYmVlbgorICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemVkIG9yIHRoZSBnaXZlbiB7QGNvZGUgcGFyYW1TcGVjfSBpcyBub3QgYXBwcm9wcmlhdGUKKyAgICAgKiAgICAgICAgICAgICBmb3IgaW5pdGlhbGl6aW5nIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnNTcGl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbVNwZWMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzU3BpfSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgYnl0ZVtdfSB1c2luZyB0aGUgZGVmYXVsdCBkZWNvZGluZyBmb3JtYXQgZm9yIHBhcmFtZXRlcnMuIFRoZQorICAgICAqIGRlZmF1bHQgZW5jb2RpbmcgZm9ybWF0IGlzIEFTTi4xLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIHBhcmFtZXRlcnMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnNTcGl9IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgICAgICAgICAgICBpbml0aWFsaXplZCwgb3IgdGhlIHBhcmFtZXRlciBjb3VsZCBub3QgYmUgZW5jb2RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KGJ5dGVbXSBwYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnNTcGl9IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBieXRlW119IHVzaW5nIHRoZSBzcGVjaWZpZWQgZGVjb2RpbmcgZm9ybWF0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRlY29kaW5nIGZvcm1hdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc1NwaX0gaGFzIGFscmVhZHkgYmVlbgorICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemVkLCBvciB0aGUgcGFyYW1ldGVyIGNvdWxkIG5vdCBiZSBlbmNvZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoYnl0ZVtdIHBhcmFtcywgU3RyaW5nIGZvcm1hdCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfSBmb3IgdGhpcyB7QGNvZGUKKyAgICAgKiBBbGdvcml0aG1QYXJhbWV0ZXJzU3BpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1TcGVjCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gaW4gd2hpY2ggdGhpcworICAgICAqICAgICAgICAgICAgcGFyYW1ldGVycyBzaG91bGQgYmUgY29udmVydGVkLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfSBmb3IgdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnNTcGl9LgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzU3BpfSBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogICAgICAgICAgICAgaW5pdGlhbGl6ZWQsIG9yIGlmIHRoaXMgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgY29udmVydGVkIHRvCisgICAgICogICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjbGFzcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgPFQgZXh0ZW5kcyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjPiBUIGVuZ2luZUdldFBhcmFtZXRlclNwZWMoCiAgICAgICAgICAgICBDbGFzczxUPiBwYXJhbVNwZWMpIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgaW4gdGhlaXIgZGVmYXVsdCBlbmNvZGluZyBmb3JtYXQuIFRoZSBkZWZhdWx0CisgICAgICogZW5jb2RpbmcgZm9ybWF0IGlzIEFTTi4xLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgcGFyYW1ldGVycy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc1NwaX0gaGFzIGFscmVhZHkgYmVlbgorICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemVkLCBvciBpZiB0aGlzIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGVuY29kZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGZvcm1hdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgZm9ybWF0LgorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgcGFyYW1ldGVycy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc1NwaX0gaGFzIGFscmVhZHkgYmVlbgorICAgICAqICAgICAgICAgICAgIGluaXRpYWxpemVkLCBvciBpZiB0aGlzIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGVuY29kZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKFN0cmluZyBmb3JtYXQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICoge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnNTcGl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJzU3BpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGVuZ2luZVRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGxQZXJtaXNzaW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWxsUGVybWlzc2lvbi5qYXZhCmluZGV4IDM2YTIwODcuLmY0YjhhYWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGxQZXJtaXNzaW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb24uamF2YQpAQCAtMTksMTUgKzE5LDE0IEBACiAKIAogLyoqCi0gKiBTdWJjbGFzcyBvZiBQZXJtaXNzaW9uIHdob3NlIGluc3RhbmNlcyBpbXBseSBhbGwgb3RoZXIgcGVybWlzc2lvbnMuIEdyYW50aW5nCi0gKiB0aGlzIHBlcm1pc3Npb24gaXMgZXF1aXZhbGVudCB0byBkaXNhYmxpbmcgc2VjdXJpdHkuCisgKiB7QGNvZGUgQWxsUGVybWlzc2lvbn0gcmVwcmVzZW50cyB0aGUgcGVybWlzc2lvbiB0byBwZXJmb3JtIGFueSBvcGVyYXRpb24uCisgKiBTaW5jZSBpdHMge0BsaW5rICNpbXBsaWVzKFBlcm1pc3Npb24pfSBtZXRob2QgYWx3YXlzIHJldHVybnMge0Bjb2RlIHRydWV9LAorICogZ3JhbnRpbmcgdGhpcyBwZXJtaXNzaW9uIGlzIGVxdWl2YWxlbnQgdG8gZGlzYWJsaW5nIHNlY3VyaXR5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEFsbFBlcm1pc3Npb24gZXh0ZW5kcyBQZXJtaXNzaW9uIHsKIAotICAgIC8qKgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjkxNjQ3NDU3MTQ1MTMxODA3NUw7CiAKICAgICAvLyBQZXJtaXNzaW9uIG5hbWUKQEAgLTM3LDM2ICszNiw0MiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQUNUSU9OUyA9ICI8YWxsIGFjdGlvbnM+IjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiBUaGUgdHdvIGFyZ3VtZW50IHZlcnNpb24gaXMKLSAgICAgKiBwcm92aWRlZCBmb3IgY2xhc3MgPGNvZGU+UG9saWN5PC9jb2RlPiBzbyB0aGF0IGl0IGhhcyBhIGNvbnNpc3RlbnQgY2FsbAotICAgICAqIHBhdHRlcm4gYWNyb3NzIGFsbCBQZXJtaXNzaW9ucy4gVGhlIG5hbWUgYW5kIGFjdGlvbiBsaXN0IGFyZSBib3RoCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxsUGVybWlzc2lvbn0uIFRoZSB0d28gYXJndW1lbnQKKyAgICAgKiB2ZXJzaW9uIGlzIHByb3ZpZGVkIGZvciBjbGFzcyB7QGNvZGUgUG9saWN5fSBzbyB0aGF0IGl0IGhhcyBhIGNvbnNpc3RlbnQKKyAgICAgKiBjYWxsIHBhdHRlcm4gYWNyb3NzIGFsbCBwZXJtaXNzaW9ucy4gVGhlIG5hbWUgYW5kIGFjdGlvbiBsaXN0IGFyZSBib3RoCiAgICAgICogaWdub3JlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpZ25vcmVkLgorICAgICAqICAgICAgICAgICAgaWdub3JlZC4KICAgICAgKiBAcGFyYW0gYWN0aW9ucwotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpZ25vcmVkLgorICAgICAqICAgICAgICAgICAgaWdub3JlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQWxsUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKICAgICAgICAgc3VwZXIoQUxMX1BFUk1JU1NJT05TKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQWxsUGVybWlzc2lvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFsbFBlcm1pc3Npb24oKSB7CiAgICAgICAgIHN1cGVyKEFMTF9QRVJNSVNTSU9OUyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudAotICAgICAqIHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uIEFsbAotICAgICAqIEFsbFBlcm1pc3Npb25zIGFyZSBlcXVhbCB0byBlYWNoIG90aGVyLgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyB7QGNvZGUgQWxsUGVybWlzc2lvbn0gZm9yCisgICAgICogZXF1YWxpdHkgYW5kIHJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsLAorICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLiBUbyBiZSBlcXVhbCwgdGhlIGdpdmVuIG9iamVjdCBuZWVkcyB0byBiZSBhbgorICAgICAqIGluc3RhbmNlIG9mIHtAY29kZSBBbGxQZXJtaXNzaW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIEFsbFBlcm1pc3Npb259LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBBbGxQZXJtaXNzaW9ufSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICogQHNlZSAjaGFzaENvZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtNzQsNDggKzc5LDUwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIG9iamVjdHMgd2hpY2gKLSAgICAgKiBhbnN3ZXIgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gPGNvZGU+ZXF1YWxzPC9jb2RlPiBtdXN0Ci0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIEFsbFBlcm1pc3Npb259LiBSZXR1cm5zIHRoZQorICAgICAqIHNhbWUgaGFzaCBjb2RlIGZvciB7QGNvZGUgQWxsUGVybWlzc2lvbn1zIHRoYXQgYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIgYXMKKyAgICAgKiByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZiB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIEFsbFBlcm1pc3Npb259LgorICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCisgICAgICogQHNlZSBBbGxQZXJtaXNzaW9uI2VxdWFscyhPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLiBTaW5jZSBBbGxQZXJtaXNzaW9uCi0gICAgICogb2JqZWN0cyBhbGxvdyBhbGwgYWN0aW9ucywgYW5zd2VyIHdpdGggdGhlIHN0cmluZyAiPGFsbCBhY3Rpb25zPiIuCisgICAgICogUmV0dXJucyB0aGUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQWxsUGVybWlzc2lvbn0uIFNpbmNlCisgICAgICoge0Bjb2RlIEFsbFBlcm1pc3Npb259IG9iamVjdHMgYWxsb3cgYWxsIGFjdGlvbnMsIHRoaXMgbWV0aG9kIHJldHVybnMKKyAgICAgKiBhbHdheXMgdGhlIHN0cmluZyAiJmx0O2FsbCBhY3Rpb25zJmd0OyIuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBBbGxQZXJtaXNzaW9ufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbnMoKSB7CiAgICAgICAgIHJldHVybiBBTExfQUNUSU9OUzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoZSByZWNlaXZlci4KLSAgICAgKiBBbGxQZXJtaXNzaW9uIG9iamVjdHMgaW1wbHkgYWxsIG90aGVyIHBlcm1pc3Npb25zLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhpcyBwZXJtaXNzaW9uLgorICAgICAqIHtAY29kZSBBbGxQZXJtaXNzaW9ufSBvYmplY3RzIGltcGx5IGFsbCBvdGhlciBwZXJtaXNzaW9ucy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24gaXMgaW1wbGllZAotICAgICAqICAgICAgICAgYnkgdGhlIHJlY2VpdmVyLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vdC4KKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB7QGNvZGUgdHJ1ZX0uCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgcGVybWlzc2lvbiB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2suCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgaG9sZGluZyBwZXJtaXNzaW9ucyBvZiB0aGlzIGNsYXNzLgotICAgICAqIEFuc3dlciBudWxsIGlmIGFueSBwZXJtaXNzaW9uIGNvbGxlY3Rpb24gY2FuIGJlIHVzZWQuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGZvciBob2xkaW5nIHBlcm1pc3Npb25zIG9mCisgICAgICogdGhpcyBjbGFzcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uIG9yIG51bGwKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uQ29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gYSBuZXcge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBuZXcgQWxsUGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGxQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKaW5kZXggMDhiMGIxZS4uMDAwMzY1ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKQEAgLTI3LDEwICsyNywxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogU3BlY2lmaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZm9yIHN0b3JpbmcgQWxsUGVybWlzc2lvbnMuIEFsbCBpbnN0YW5jZXMgb2YKLSAqIEFsbFBlcm1pc3Npb24gYXJlIGVxdWl2YWxlbnQsIHNvIGl0IGlzIGVub3VnaCB0byBzdG9yZSBhIHNpbmdsZSBhZGRlZAotICogaW5zdGFuY2UuCisgKiBTcGVjaWZpYyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGZvciBzdG9yaW5nIHtAY29kZSBBbGxQZXJtaXNzaW9ufXMuIEFsbAorICogaW5zdGFuY2VzIG9mIHtAY29kZSBBbGxQZXJtaXNzaW9ufSBhcmUgZXF1aXZhbGVudCwgc28gaXQgaXMgZW5vdWdoIHRvIHN0b3JlIGEKKyAqIHNpbmdsZSBhZGRlZCBpbnN0YW5jZS4KICAqIAorICogQHNlZSBBbGxQZXJtaXNzaW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogZmluYWwgY2xhc3MgQWxsUGVybWlzc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBQZXJtaXNzaW9uQ29sbGVjdGlvbiB7CiAKQEAgLTQ2LDcgKzQ4LDcgQEAKICAgICBwcml2YXRlIHRyYW5zaWVudCBQZXJtaXNzaW9uIGFsbDsKIAogICAgIC8qKgotICAgICAqIEFkZHMgYW4gQWxsUGVybWlzc2lvbiB0byB0aGUgY29sbGVjdGlvbi4KKyAgICAgKiBBZGRzIGFuIHtAY29kZSBBbGxQZXJtaXNzaW9ufSB0byB0aGUgY29sbGVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CiAgICAgICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKQEAgLTYwLDcgKzYyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGVudW1lcmF0aW9uIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgICAqIFJldHVybnMgdGhlIGVudW1lcmF0aW9uIG9mIHRoZSBjb2xsZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxQZXJtaXNzaW9uPiBlbGVtZW50cygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25FbnVtZXJhdGlvbjxQZXJtaXNzaW9uPihhbGwpOwpAQCAtMTAzLDIzICsxMDUsMjEgQEAKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhlIHJlY2VpdmVyLgotICAgICAqIEFsbFBlcm1pc3Npb24gb2JqZWN0cyBpbXBseSBhbGwgb3RoZXIgcGVybWlzc2lvbnMuCisgICAgICoge0Bjb2RlIEFsbFBlcm1pc3Npb259IG9iamVjdHMgaW1wbHkgYWxsIG90aGVyIHBlcm1pc3Npb25zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkCi0gICAgICogICAgICAgICBieSB0aGUgcmVjZWl2ZXIsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbm90LgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyLCBhbmQge0Bjb2RlIGZhbHNlfSBpZiBpdCBpcyBub3QuCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgcGVybWlzc2lvbiB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2suCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKICAgICAgICAgcmV0dXJuIGFsbCAhPSBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhY2NvcmRpbmdseSB0byBleHBlY3RlZCBmb3JtYXQ6Ci0gICAgICogPGRsPgotICAgICAqIDxkdD5ib29sZWFuIGFsbF9hbGxvd2VkCi0gICAgICogPGRkPlRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhpcyBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eQotICAgICAqIDwvZGw+CisgICAgICogV3JpdGVzIHRoZSBmaWVsZHMgYWNjb3JkaW5nIHRvIGV4cGVjdGVkIGZvcm1hdCwgYWRkaW5nIHRoZSBib29sZWFuIGZpZWxkCisgICAgICoge0Bjb2RlIGFsbF9hbGxvd2VkfSB3aGljaCBpcyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb2xsZWN0aW9uIGlzIG5vdAorICAgICAqIGVtcHR5LgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbS5QdXRGaWVsZCBmaWVsZHMgPSBvdXQucHV0RmllbGRzKCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQXV0aFByb3ZpZGVyLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQXV0aFByb3ZpZGVyLmphdmEKaW5kZXggYWU4YjE1OS4uNWEzYmU3NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0F1dGhQcm92aWRlci5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BdXRoUHJvdmlkZXIuamF2YQpAQCAtMjcsNDAgKzI3LDk0IEBACiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIEF1dGhQcm92aWRlcn0gaXMgYW4gYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgSmF2YSBTZWN1cml0eSB7QGNvZGUKKyAqIFByb3ZpZGVyfSB3aGljaCBwcm92aWRlIGxvZ2luIGFuZCBsb2dvdXQuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdXRoUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlciB7CiAKLSAgICAvKioKLSAgICAgKiBAc2VyaWFsCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDE5Nzg1OTA1MzA4NDU0NjQ2MUw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEF1dGhQcm92aWRlcn0gd2l0aCBpdHMgbmFtZSwgdmVyc2lvbgorICAgICAqIGFuZCBkZXNjcmlwdGlvbi4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIGluZm8KKyAgICAgKiAgICAgICAgICAgIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb3ZpZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBBdXRoUHJvdmlkZXIoU3RyaW5nIG5hbWUsIGRvdWJsZSB2ZXJzaW9uLCBTdHJpbmcgaW5mbykgewogICAgICAgICBzdXBlcihuYW1lLCB2ZXJzaW9uLCBpbmZvKTsgCiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUGVyZm9ybXMgYSBsb2dpbiBpbnRvIHRoaXMge0Bjb2RlIEF1dGhQcm92aWRlcn0uIFRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogQ2FsbGJhY2tIYW5kbGVyfSBpcyB1c2VkIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjYWxsZXIuCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcworICAgICAqIHRoZSB7QGNvZGUgU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgYXV0aFByb3ZpZGVyLk5BTUV9ICh3aGVyZSBOQU1FIGlzCisgICAgICogdGhlIHByb3ZpZGVyIG5hbWUpIHRvIGJlIGdyYW50ZWQsIG90aGVyd2lzZSBhIHtAY29kZSBTZWN1cml0eUV4Y2VwdGlvbn0KKyAgICAgKiB3aWxsIGJlIHRocm93bi4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3ViamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHN1YmplY3QgdGhhdCBpcyB1c2VkIHRvIGxvZ2luLgorICAgICAqIEBwYXJhbSBoYW5kbGVyCisgICAgICogICAgICAgICAgICB0aGUgaGFuZGxlciB0byBvYnRhaW4gYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgICAgKiAgICAgICAgICAgIGNhbGxlci4KKyAgICAgKiBAdGhyb3dzIExvZ2luRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGxvZ2luIGZhaWxzLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbnZva2UgdGhpcyBtZXRob2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbG9naW4oU3ViamVjdCBzdWJqZWN0LCBDYWxsYmFja0hhbmRsZXIgaGFuZGxlcikgdGhyb3dzIExvZ2luRXhjZXB0aW9uOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUGVyZm9ybXMgYSBsb2dvdXQgZnJvbSB0aGlzIHtAY29kZSBBdXRoUHJvdmlkZXJ9LgorICAgICAqIDxwPgorICAgICAqIElmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkLCBjb2RlIGNhbGxpbmcgdGhpcyBtZXRob2QgbmVlZHMKKyAgICAgKiB0aGUge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0ge0Bjb2RlIGF1dGhQcm92aWRlci5OQU1FfSAod2hlcmUgTkFNRSBpcworICAgICAqIHRoZSBwcm92aWRlciBuYW1lKSB0byBiZSBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259CisgICAgICogd2lsbCBiZSB0aHJvd24uCisgICAgICogPC9wPgogICAgICAqIAorICAgICAqIEB0aHJvd3MgTG9naW5FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbG9nb3V0IGZhaWxzLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbnZva2UgdGhpcyBtZXRob2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbG9nb3V0KCkgdGhyb3dzIExvZ2luRXhjZXB0aW9uOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUge0Bjb2RlIENhbGxiYWNrSGFuZGxlcn0gdG8gdGhpcyB7QGNvZGUgQXV0aFByb3ZpZGVyfS4gSWYgbm8KKyAgICAgKiBoYW5kbGVyIGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNsb2dpbihTdWJqZWN0LCBDYWxsYmFja0hhbmRsZXIpfSBtZXRob2QsCisgICAgICogdGhpcyB7QGNvZGUgQXV0aFByb3ZpZGVyfSBpcyB1c2luZyB0aGUgc3BlY2lmaWVkIHtAY29kZSBDYWxsYmFja0hhbmRsZXJ9LgorICAgICAqIDxwPgorICAgICAqIElmIG5vIGhhbmRsZXIgaXMgc2V0LCB0aGlzIHtAY29kZSBBdXRoUHJvdmlkZXJ9IHVzZXMgdGhlIHtAY29kZQorICAgICAqIENhbGxiYWNrSGFuZGxlcn0gc3BlY2lmaWVkIGJ5IHRoZSB7QGNvZGUKKyAgICAgKiBhdXRoLmxvZ2luLmRlZmF1bHRDYWxsYmFja0hhbmRsZXJ9IHNlY3VyaXR5IHByb3BlcnR5LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBhdXRoUHJvdmlkZXIuTkFNRX0gKHdoZXJlIE5BTUUgaXMKKyAgICAgKiB0aGUgcHJvdmlkZXIgbmFtZSkgdG8gYmUgZ3JhbnRlZCwgb3RoZXJ3aXNlIGEge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufQorICAgICAqIHdpbGwgYmUgdGhyb3duLgorICAgICAqIDwvcD4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGFuZGxlcgorICAgICAqICAgICAgICAgICAgdGhlIGhhbmRsZXIgdG8gb2J0YWluIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCisgICAgICogICAgICAgICAgICBjYWxsZXIuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXIoQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9CYXNpY1Blcm1pc3Npb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9CYXNpY1Blcm1pc3Npb24uamF2YQppbmRleCA5Y2RhOWEyLi4xZDU2NmVjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQmFzaWNQZXJtaXNzaW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0Jhc2ljUGVybWlzc2lvbi5qYXZhCkBAIC0yOCwyMCArMjgsMzkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFN1cGVyY2xhc3Mgb2YgcGVybWlzc2lvbnMgd2hpY2ggaGF2ZSBuYW1lcyBidXQgbm8gYWN0aW9uIGxpc3RzLgorICoge0Bjb2RlIEJhc2ljUGVybWlzc2lvbn0gaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIG9mIGFsbCBwZXJtaXNzaW9ucyB3aGljaAorICogaGF2ZSBhIG5hbWUgYnV0IG5vIGFjdGlvbiBsaXN0cy4gQSB7QGNvZGUgQmFzaWNQZXJtaXNzaW9ufSBpcyBncmFudGVkIG9yIGl0CisgKiBpcyBub3QuCisgKiA8cD4KKyAqIE5hbWVzIG9mIGEgQmFzaWNQZXJtaXNzaW9uIGZvbGxvdyB0aGUgZG90IHNlcGFyYXRlZCwgaGllcmFyY2hpY2FsIHByb3BlcnR5CisgKiBuYW1pbmcgY29udmVudGlvbi4gQXN0ZXJpc2sgJyonIGNhbiBiZSB1c2VkIGFzIHdpbGRjYXJkcy4gRWl0aGVyIGJ5IGl0c2VsZiwKKyAqIG1hdGNoaW5nIGFueXRoaW5nLCBvciBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lLCBpbW1lZGlhdGVseSBwcmVjZWRlZCBieSBhICcuJy4KKyAqIEZvciBleGFtcGxlOgogICogCisgKiA8cHJlPgorICogY29tLmdvb2dsZS5hbmRyb2lkLiogIGdyYW50cyBhbGwgcGVybWlzc2lvbnMgdW5kZXIgdGhlIGNvbS5nb29nbGUuYW5kcm9pZCBwZXJtaXNzaW9uIGhpZXJhcmNoeQorICogKiAgICAgICAgICAgICAgICAgICAgIGdyYW50cyBhbGwgcGVybWlzc2lvbnMKKyAqIDwvcHJlPgorICogPC9wPjxwPgorICogV2hpbGUgdGhpcyBjbGFzcyBpZ25vcmVzIHRoZSBhY3Rpb24gbGlzdCBpbiB0aGUKKyAqIHtAbGluayAjQmFzaWNQZXJtaXNzaW9uKFN0cmluZywgU3RyaW5nKX0gY29uc3RydWN0b3IsIHN1YmNsYXNzZXMgbWF5CisgKiBpbXBsZW1lbnQgYWN0aW9ucyBvbiB0b3Agb2YgdGhpcyBjbGFzcy4KKyAqIDwvcD4KICAqLwotCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzaWNQZXJtaXNzaW9uIGV4dGVuZHMgUGVybWlzc2lvbiBpbXBsZW1lbnRzCiAgICAgU2VyaWFsaXphYmxlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyNzk0MzgyOTg0MzY3NzM0OThMOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFjdGlvbiBsaXN0LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJhc2ljUGVybWlzc2lvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBuZXcgcGVybWlzc2lvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIG5hbWV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgbmFtZS5sZW5ndGgoKSA9PSAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmFzaWNQZXJtaXNzaW9uKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHN1cGVyKG5hbWUpOwpAQCAtNDksMTMgKzY4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFjdGlvbiBsaXN0LgotICAgICAqIFRoZSBhY3Rpb24gbGlzdCBpcyBpZ25vcmVkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJhc2ljUGVybWlzc2lvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbmFtZS4gVGhlIHtAY29kZSBhY3Rpb259IHBhcmFtZXRlciBpcyBpZ25vcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIG5ldyBwZXJtaXNzaW9uLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24uCiAgICAgICogQHBhcmFtIGFjdGlvbgotICAgICAqICAgICAgICAgICAgU3RyaW5nIGlnbm9yZWQuCisgICAgICogICAgICAgICAgICBpcyBpZ25vcmVkLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG5hbWUubGVuZ3RoKCkgPT0gMH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJhc2ljUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbikgewogICAgICAgICBzdXBlcihuYW1lKTsKQEAgLTc1LDE1ICs5OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLiBJbiB0aGlzCi0gICAgICogY2FzZSwgdGhlIHJlY2VpdmVyIGFuZCB0aGUgb2JqZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBjbGFzcyBhbmQgbmFtZS4KKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMge0Bjb2RlIEJhc2ljUGVybWlzc2lvbn0gZm9yCisgICAgICogZXF1YWxpdHkuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGhhcyB0aGUgc2FtZSBjbGFzcworICAgICAqIGFuZCB0aGUgdHdvIHtAY29kZSBQZXJtaXNzaW9uc31zIGhhdmUgdGhlIHNhbWUgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0BsaW5rICNpbXBsaWVzKFBlcm1pc3Npb24pfSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgZm9yIG1ha2luZyBhY2Nlc3MKKyAgICAgKiBjb250cm9sIGNoZWNrcy4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzIG9iamVjdAotICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIEJhc2ljUGVybWlzc2lvbn0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIEJhc2ljUGVybWlzc2lvbn0sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmIChvYmogPT0gdGhpcykgewpAQCAtOTcsMzUgKzEyNiwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byBvYmplY3RzIHdoaWNoCi0gICAgICogYW5zd2VyIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIHtAY29kZSBCYXNpY1Blcm1pc3Npb259LiBSZXR1cm5zIHRoZQorICAgICAqIHNhbWUgaGFzaCBjb2RlIGZvciB7QGNvZGUgQmFzaWNQZXJtaXNzaW9ufXMgdGhhdCBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlcgorICAgICAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mIHtAbGluayBPYmplY3QjaGFzaENvZGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIEJhc2ljUGVybWlzc2lvbn0uCisgICAgICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKKyAgICAgKiBAc2VlIEJhc2ljUGVybWlzc2lvbiNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIuIEJhc2ljUGVybWlzc2lvbiBvYmplY3RzCi0gICAgICogaGF2ZSBubyBhY3Rpb25zLCBzbyBhbnN3ZXIgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBlcm1pc3Npb24uIFNpbmNlIHtAY29kZQorICAgICAqIEJhc2ljUGVybWlzc2lvbn0gaW5zdGFuY2VzIGhhdmUgbm8gYWN0aW9ucywgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25zKCkgewogICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGlzIHBlcm1pc3Npb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQKLSAgICAgKiAgICAgICAgIGJ5IHRoZSByZWNlaXZlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QuCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgcGVybWlzc2lvbiB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2sgYWdhaW5zdCB0aGlzIHBlcm1pc3Npb24uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhpcworICAgICAqICAgICAgICAgcGVybWlzc2lvbiwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKICAgICAgICAgaWYgKHBlcm1pc3Npb24gIT0gbnVsbCAmJiBwZXJtaXNzaW9uLmdldENsYXNzKCkgPT0gdGhpcy5nZXRDbGFzcygpKSB7CkBAIC0xMzUsOSArMTY3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgPGNvZGU+dGhpc05hbWU8L2NvZGU+IGltcGxpZXMgPGNvZGU+dGhhdE5hbWU8L2NvZGU+LAorICAgICAqIENoZWNrcyBpZiB7QGNvZGUgdGhpc05hbWV9IGltcGxpZXMge0Bjb2RlIHRoYXROYW1lfSwKICAgICAgKiBhY2NvcmRpbmdseSB0byBoaWVyYXJjaGljYWwgcHJvcGVydHkgbmFtaW5nIGNvbnZlbnRpb24uCi0gICAgICogSXQgaXMgYXNzdW1lZCB0aGF0IG5hbWVzIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5LgorICAgICAqIEl0IGlzIGFzc3VtZWQgdGhhdCBuYW1lcyBjYW5ub3QgYmUge0Bjb2RlIG51bGx9IG9yIGVtcHR5LgogICAgICAqLwogICAgIHN0YXRpYyBib29sZWFuIG5hbWVJbXBsaWVzKFN0cmluZyB0aGlzTmFtZSwgU3RyaW5nIHRoYXROYW1lKSB7CiAgICAgICAgIGlmICh0aGlzTmFtZSA9PSB0aGF0TmFtZSkgewpAQCAtMTY0LDE5ICsxOTYsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciBob2xkaW5nIHBlcm1pc3Npb25zIG9mIHRoaXMgY2xhc3MuCi0gICAgICogQW5zd2VyIG51bGwgaWYgYW55IHBlcm1pc3Npb24gY29sbGVjdGlvbiBjYW4gYmUgdXNlZC4KKyAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHtAbGluayBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gZm9yIGhvbGRpbmcgcGVybWlzc2lvbnMuCiAgICAgICogPHA+Ci0gICAgICogTm90ZTogRm9yIEJhc2ljUGVybWlzc2lvbiAoYW5kIHN1YmNsYXNzZXMgd2hpY2ggZG8gbm90IG92ZXJyaWRlIHRoaXMKLSAgICAgKiBtZXRob2QpLCB0aGUgY29sbGVjdGlvbiB3aGljaCBpcyByZXR1cm5lZCBkb2VzIDxlbT5ub3Q8L2VtPiBpbnZva2UgdGhlCi0gICAgICogLmltcGxpZXMgbWV0aG9kIG9mIHRoZSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgc3RvcmVkIGluIGl0IHdoZW4gY2hlY2tpbmcKLSAgICAgKiBpZiB0aGUgY29sbGVjdGlvbiBpbXBsaWVzIGEgcGVybWlzc2lvbi4gSW5zdGVhZCwgaXQgYXNzdW1lcyB0aGF0IGlmIHRoZQotICAgICAqIHR5cGUgb2YgdGhlIHBlcm1pc3Npb24gaXMgY29ycmVjdCwgYW5kIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIGlzCi0gICAgICogY29ycmVjdCwgdGhlcmUgaXMgYSBtYXRjaC4KKyAgICAgKiBGb3Ige0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSAoYW5kIHN1YmNsYXNzZXMgd2hpY2ggZG8gbm90IG92ZXJyaWRlCisgICAgICogdGhpcyBtZXRob2QpLCB0aGUgY29sbGVjdGlvbiB3aGljaCBpcyByZXR1cm5lZCBkb2VzIDxlbT5ub3Q8L2VtPiBpbnZva2UKKyAgICAgKiB0aGUge0BsaW5rICNpbXBsaWVzKFBlcm1pc3Npb24pfSBtZXRob2Qgb2YgdGhlIHBlcm1pc3Npb25zIHdoaWNoIGFyZQorICAgICAqIHN0b3JlZCBpbiBpdCB3aGVuIGNoZWNraW5nIGlmIHRoZSBjb2xsZWN0aW9uIGltcGxpZXMgYSBwZXJtaXNzaW9uLgorICAgICAqIEluc3RlYWQsIGl0IGFzc3VtZXMgdGhhdCBpZiB0aGUgdHlwZSBvZiB0aGUgcGVybWlzc2lvbiBpcyBjb3JyZWN0LCBhbmQKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiBpcyBjb3JyZWN0LCB0aGVyZSBpcyBhIG1hdGNoLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uIG9yIG51bGwKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uQ29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gYW4gZW1wdHkge0BsaW5rIFBlcm1pc3Npb25Db2xsZWN0aW9ufSBmb3IgaG9sZGluZyBwZXJtaXNzaW9ucy4KKyAgICAgKiBAc2VlIEJhc2ljUGVybWlzc2lvbkNvbGxlY3Rpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBuZXcgQmFzaWNQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0Jhc2ljUGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9CYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKaW5kZXggNDZkYWQwMi4uYzM0NTg2NSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0Jhc2ljUGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQmFzaWNQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCkBAIC0zMiwxMCArMzIsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFNwZWNpZmljIFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciBzdG9yaW5nIEJhc2ljUGVybWlzc2lvbnMgb2YgYXJiaXRyYXJ5IHR5cGUuCisgKiBTcGVjaWZpYyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGZvciBzdG9yaW5nIHtAY29kZSBCYXNpY1Blcm1pc3Npb25zfSBvZgorICogYXJiaXRyYXJ5IHR5cGUuCiAgKiAKKyAqIEBzZWUgQmFzaWNQZXJtaXNzaW9uCisgKiBAc2VlIFBlcm1pc3Npb25Db2xsZWN0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBmaW5hbCBjbGFzcyBCYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uIGV4dGVuZHMgUGVybWlzc2lvbkNvbGxlY3Rpb24gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzM5MzAxNzQyNDcyOTc5Mzk5TDsKQEAgLTEwMywxMCArMTA2LDExIEBACiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGUgcmVjZWl2ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQKLSAgICAgKiAgICAgICAgIGJ5IHRoZSByZWNlaXZlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QuCisgICAgICogQHJldHVybiBib29sZWFuIHtAY29kZSB0cnVlfSBpZiB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIsIGFuZCB7QGNvZGUgZmFsc2V9IGlmIGl0IGlzIG5vdC4KICAgICAgKiBAcGFyYW0gcGVybWlzc2lvbgotICAgICAqICAgICAgICAgICAgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBjaGVjay4KKyAgICAgKiBAc2VlIFBlcm1pc3Npb24KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewogICAgICAgICBpZiAocGVybWlzc2lvbiA9PSBudWxsIHx8IHBlcm1pc3Npb24uZ2V0Q2xhc3MoKSAhPSBwZXJtQ2xhc3MpIHsKQEAgLTE1MCwxNSArMTU0LDIxIEBACiAgICAgICogPGRsPgogICAgICAqIDxkdD5ib29sZWFuIGFsbF9hbGxvd2VkCiAgICAgICogPGRkPlRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhpcyBCYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uIGNvbnRhaW5zIGEKLSAgICAgKiBCYXNpY1Blcm1pc3Npb24gd2l0aCAnKicgYXMgaXRzIHBlcm1pc3Npb24gbmFtZS4KKyAgICAgKiB7QGNvZGUgQmFzaWNQZXJtaXNzaW9ufSB3aXRoICcqJyBhcyBpdHMgcGVybWlzc2lvbiBuYW1lLgogICAgICAqIDxkdD5DbGFzcyZsdDtUJmd0OyBwZXJtQ2xhc3MKLSAgICAgKiA8ZGQ+VGhlIGNsYXNzIHRvIHdoaWNoIGFsbCBCYXNpY1Blcm1pc3Npb25zIGluIHRoaXMKKyAgICAgKiA8ZGQ+VGhlIGNsYXNzIHRvIHdoaWNoIGFsbCB7QGNvZGUgQmFzaWNQZXJtaXNzaW9ufXMgaW4gdGhpcwogICAgICAqIEJhc2ljUGVybWlzc2lvbkNvbGxlY3Rpb24gYmVsb25ncy4KICAgICAgKiA8ZHQ+SGFzaHRhYmxlJmx0O0ssViZndDsgcGVybWlzc2lvbnMKLSAgICAgKiA8ZGQ+VGhlIEJhc2ljUGVybWlzc2lvbnMgaW4gdGhpcyBCYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uLiBBbGwKLSAgICAgKiBCYXNpY1Blcm1pc3Npb25zIGluIHRoZSBjb2xsZWN0aW9uIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGNsYXNzLiBUaGUKLSAgICAgKiBIYXNodGFibGUgaXMgaW5kZXhlZCBieSB0aGUgQmFzaWNQZXJtaXNzaW9uIG5hbWU7IHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgKiBIYXNodGFibGUgZW50cnkgaXMgdGhlIHBlcm1pc3Npb24uCisgICAgICogPGRkPlRoZQorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogQmFzaWNQZXJtaXNzaW9uCisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogcyBpbiB0aGlzIHtAY29kZSBCYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9ufS4gQWxsIHtAY29kZSBCYXNpY1Blcm1pc3Npb259cworICAgICAqIGluIHRoZSBjb2xsZWN0aW9uIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGNsYXNzLiBUaGUgSGFzaHRhYmxlIGlzIGluZGV4ZWQKKyAgICAgKiBieSB0aGUge0Bjb2RlIEJhc2ljUGVybWlzc2lvbn0gbmFtZTsgdGhlIHZhbHVlIG9mIHRoZSBIYXNodGFibGUgZW50cnkgaXMKKyAgICAgKiB0aGUgcGVybWlzc2lvbi4KICAgICAgKiA8L2RsPgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQ2VydGlmaWNhdGUuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9DZXJ0aWZpY2F0ZS5qYXZhCmluZGV4IDIyYmVhYzAuLmJmOWExYWUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9DZXJ0aWZpY2F0ZS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9DZXJ0aWZpY2F0ZS5qYXZhCkBAIC0yMCw2ICsyMCwxMCBAQAogKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIEFkZGVkIERlcHJlY2F0ZWQgYW5ub3RhdGlvbi4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBqYXZhLnNlY3VyaXR5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI3LDUwICszMSw5OSBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiB7QGNvZGUgQ2VydGlmaWNhdGV9IHJlcHJlc2VudHMgYW4gaWRlbnRpdHkgY2VydGlmaWNhdGUsIHN1Y2ggYXMgWC41MDkgb3IgUEdQLgorICogTm90ZTogQSB7QGNvZGUgQ2VydGlmaWNhdGV9IGluc3RhbmNlcyBkb2VzIG5vdCBtYWtlIGFueSBzdGF0ZW1lbnQgYWJvdXQgdGhlCisgKiB2YWxpZGl0eSBvZiBpdHNlbGYuIEl0J3MgaW4gdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbiB0byB2ZXJpZnkKKyAqIHRoZSB2YWxpZGl0eSBvZiBpdHMgY2VydGlmaWNhdGVzLgogICogCi0gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBiZWhhdmlvciBpbgotICogICAgICAgICAgICAge0BsaW5rIGphdmF4LnNlY3VyaXR5LmNlcnQgamF2YXguc2VjdXJpdHkuY2VydH0KKyAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGJlaGF2aW9yIGluIHtAbGluayBqYXZheC5zZWN1cml0eS5jZXJ0fQorICogQHNlZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCitARGVwcmVjYXRlZAogcHVibGljIGludGVyZmFjZSBDZXJ0aWZpY2F0ZSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIERlY29kZXMgYSBjZXJ0aWZpY2F0ZSBmcm9tIHRoZSBnaXZlbiB7QGNvZGUgSW5wdXRTdHJlYW19LiBUaGUgZm9ybWF0IG9mCisgICAgICogdGhlIGRhdGEgdG8gZW5jb2RlIG11c3QgYmUgdGhhdCBpZGVudGlmaWVkIGJ5IHtAbGluayAjZ2V0Rm9ybWF0KCl9IGFuZAorICAgICAqIGVuY29kZWQgYnkge0BsaW5rICNlbmNvZGUoT3V0cHV0U3RyZWFtKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcmVhZCBmcm9tLgorICAgICAqIEB0aHJvd3MgS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gaXMgaW5jb21wbGV0ZSBvciBpbmNvcnJlY3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYWNjZXNzaW5nIHRoZSBwcm92aWRlZCBzdHJlYW0uCisgICAgICogQHNlZSAjZW5jb2RlKE91dHB1dFN0cmVhbSkKKyAgICAgKiBAc2VlICNnZXRGb3JtYXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlY29kZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBLZXlFeGNlcHRpb24sIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBFbmNvZGVzIHRoaXMgY2VydGlmaWNhdGUgdG8gYW4gb3V0cHV0IHN0cmVhbS4gVGhlCisgICAgICoge0BsaW5rICNkZWNvZGUoSW5wdXRTdHJlYW0pfSBtZXRob2QgbXVzdCBiZSBhYmxlIHRvIGRlY29kZSB0aGUgZm9ybWF0CisgICAgICogd3JpdHRlbiBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gZW5jb2RlIHRoaXMgY2VydGlmaWNhdGUgdG8uCisgICAgICogQHRocm93cyBLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbiBpcyBpbmNvbXBsZXRlIG9yIGluY29ycmVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBieSBhY2Nlc3NpbmcgdGhlIHByb3ZpZGVkIHN0cmVhbS4KKyAgICAgKiBAc2VlICNkZWNvZGUoSW5wdXRTdHJlYW0pCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5jb2RlKE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBLZXlFeGNlcHRpb24sIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZm9ybWF0IG9mIHRoaXMgY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZm9ybWF0IG9mIHRoaXMgY2VydGlmaWNhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGd1YXJhbnRvciBvZiB0aGlzIGNlcnRpZmljYXRlLiBUaGF0IGd1YXJhbnRvciBndWFyYW50ZWVzLAorICAgICAqIHRoYXQgdGhlIHB1YmxpYyBrZXkgb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBmcm9tIHRoZSBwcmluY2lwYWwgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgI2dldFByaW5jaXBhbCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBndWFyYW50b3Igb2YgdGhpcyBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAc2VlICNnZXRQcmluY2lwYWwoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0R3VhcmFudG9yKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmluY2lwYWwgb2YgdGhpcyBjZXJ0aWZpY2F0ZS4gVGhlIHByaW5jaXBhbCBpcyBndWFyYW50ZWVkIGJ5CisgICAgICogdGhlIGd1YXJhbnRvciByZXR1cm5lZCBieSB7QGxpbmsgI2dldEd1YXJhbnRvcigpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmluY2lwYWwgb2YgdGhpcyBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAc2VlICNnZXRHdWFyYW50b3IoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMga2V5IG9mIHRoaXMgY2VydGlmaWNhdGUuIFRoZSBwdWJsaWMga2V5IGlzIGd1YXJhbnRlZWQKKyAgICAgKiBieSB0aGUgZ3VhcmFudG9yIHRvIGJlbG9uZyB0byB0aGUgcHJpbmNpcGFsLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBrZXkgb2YgdGhpcyBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAc2VlICNnZXRHdWFyYW50b3IoKQorICAgICAqIEBzZWUgQ2VydGlmaWNhdGUjZ2V0UHJpbmNpcGFsKCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHVibGljS2V5IGdldFB1YmxpY0tleSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICogdGhpcyB7QGNvZGUgQ2VydGlmaWNhdGV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXRhaWxlZAorICAgICAqICAgICAgICAgICAgd2hldGhlciBvciBub3QgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2VydGlmaWNhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuIGRldGFpbGVkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQ29kZVNpZ25lci5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0NvZGVTaWduZXIuamF2YQppbmRleCA3MTBlNGY4Li4wNzE5ZThmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQ29kZVNpZ25lci5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Db2RlU2lnbmVyLmphdmEKQEAgLTI4LDMxICsyOCwzMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgKiB7QGNvZGUgQ29kZVNpZ25lcn0gcmVwcmVzZW50cyBhIHNpZ25lciBvZiBjb2RlLiBJbnN0YW5jZXMgYXJlIGltbXV0YWJsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGZpbmFsIGNsYXNzIENvZGVTaWduZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjgxOTI4ODEwNTE5MzkzNzU4MUw7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKLSAgICAgKi8KICAgICBwcml2YXRlIENlcnRQYXRoIHNpZ25lckNlcnRQYXRoOwogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCi0gICAgICovCiAgICAgcHJpdmF0ZSBUaW1lc3RhbXAgdGltZXN0YW1wOwogCiAgICAgLy8gQ2FjaGVkIGhhc2ggY29kZSB2YWx1ZQogICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQ29kZVNpZ25lcn0uCisgICAgICogCisgICAgICogQHBhcmFtIHNpZ25lckNlcnRQYXRoCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlIHNpZ25lci4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wCisgICAgICogICAgICAgICAgICB0aGUgdGltZSBzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlIHNpZ25lciwgbWF5YmUge0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNpZ25lckNlcnRQYXRofSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvZGVTaWduZXIoQ2VydFBhdGggc2lnbmVyQ2VydFBhdGgsIFRpbWVzdGFtcCB0aW1lc3RhbXApIHsKICAgICAgICAgaWYgKHNpZ25lckNlcnRQYXRoID09IG51bGwpIHsKQEAgLTYzLDcgKzY0LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIHtAY29kZSBDb2RlU2lnbmVyfSBmb3IgZXF1YWxpdHkuCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZgorICAgICAqIHtAY29kZSBDb2RlU2lnbmVyfSwgdGhlIHR3byB7QGNvZGUgQ29kZVNpZ25lcn0gZW5jYXBzdWxhdGUgdGhlIHNhbWUKKyAgICAgKiBjZXJ0aWZpY2F0ZSBwYXRoIGFuZCB0aGUgc2FtZSB0aW1lIHN0YW1wLCBpZiBwcmVzZW50IGluIGJvdGguCisgICAgICogCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGZvciBlcXVhbGl0eSB3aXRoIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICAgICBDb2RlU2lnbmVyfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgQ29kZVNpZ25lcn0sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmIChvYmogPT0gdGhpcykgewpAQCAtODEsMjEgKzkyLDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQ29kZVNpZ25lcn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQ29kZVNpZ25lcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRQYXRoIGdldFNpZ25lckNlcnRQYXRoKCkgewogICAgICAgICByZXR1cm4gc2lnbmVyQ2VydFBhdGg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyB0aGUgdGltZSBzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQ29kZVNpZ25lcn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdGltZSBzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQ29kZVNpZ25lcn0sIG1heWJlCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoKSB7CiAgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIHtAY29kZSBDb2RlU2lnbmVyfS4gUmV0dXJucyB0aGUgc2FtZQorICAgICAqIGhhc2ggY29kZSBmb3Ige0Bjb2RlIENvZGVTaWduZXJ9cyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGFzCisgICAgICogcmVxdWlyZWQgYnkgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2Yge0BsaW5rIE9iamVjdCNoYXNoQ29kZX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIHtAY29kZSBDb2RlU2lnbmVyfS4KKyAgICAgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzZWUgQ29kZVNpZ25lciNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGlmIChoYXNoID09IDApIHsKQEAgLTEwNiw3ICsxMzEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgICAgKiB0aGlzIHtAY29kZSBDb2RlU2lnbmVyfSBpbmNsdWRpbmcgaXRzIGZpcnN0IGNlcnRpZmljYXRlIGFuZCBpdHMgdGltZQorICAgICAqIHN0YW1wLCBpZiBwcmVzZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMge0Bjb2RlIENvZGVTaWduZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGFueSBzcGVjaWFsIHJlYXNvbiBmb3IgJzI1NicgaGVyZSwgaXQncyB0YWtlbiBhYnJ1cHRseQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0NvZGVTb3VyY2UuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Db2RlU291cmNlLmphdmEKaW5kZXggOGMyMzVlNi4uZjRkYTg5YyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0NvZGVTb3VyY2UuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQ29kZVNvdXJjZS5qYXZhCkBAIC00NCw2ICs0NCwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCisvKioKKyAqIHtAY29kZSBDb2RlU291cmNlfSBlbmNhcHN1bGF0ZXMgdGhlIGxvY2F0aW9uIGZyb20gd2hlcmUgY29kZSBpcyBsb2FkZWQgYW5kCisgKiB0aGUgY2VydGlmaWNhdGVzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGNvZGUuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZAorICogYnkge0Bjb2RlIFNlY3VyZUNsYXNzTG9hZGVyfSB0byBkZWZpbmUgcHJvdGVjdGlvbiBkb21haW5zIGZvciBsb2FkZWQgY2xhc3Nlcy4KKyAqIAorICogQHNlZSBTZWN1cmVDbGFzc0xvYWRlcgorICogQHNlZSBQcm90ZWN0aW9uRG9tYWluCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIENvZGVTb3VyY2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDk3NzU0MTgxOTk3NjAxMzk1MUw7CkBAIC02NSwxMyArNzQsMTYgQEAKICAgICBwcml2YXRlIHRyYW5zaWVudCBDZXJ0aWZpY2F0ZUZhY3RvcnkgZmFjdG9yeTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB1cmwgYW5kIGNlcnRpZmljYXRlcwotICAgICAqIGZpZWxkcyBmaWxsZWQgaW4gZnJvbSB0aGUgYXJndW1lbnRzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIENvZGVTb3VyY2V9IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBVUkx9IGFuZCB0aGUge0Bjb2RlIENlcnRpZmljYXRlfXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICBVUkwgdGhlIFVSTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgVVJMfSByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIGZyb20gd2hlcmUgY29kZSBpcworICAgICAqICAgICAgICAgICAgbG9hZGVkLCBtYXliZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHBhcmFtIGNlcnRzCi0gICAgICogICAgICAgICAgICBDZXJ0aWZpY2F0ZVtdIHRoZSBDZXJ0aWZpY2F0ZXMuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENlcnRpZmljYXRlfSB1c2VkIHRvIHZlcmlmeSB0aGUgY29kZSwgbG9hZGVkIGZyb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGxvY2F0aW9ufSwgbWF5YmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2RlU291cmNlKFVSTCBsb2NhdGlvbiwgQ2VydGlmaWNhdGVbXSBjZXJ0cykgewogICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CkBAIC04MSw2ICs5MywxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQ29kZVNvdXJjZX0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIFVSTH0gYW5kIHRoZSB7QGNvZGUgQ29kZVNpZ25lcn1zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBVUkx9IHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gZnJvbSB3aGVyZSBjb2RlIGlzCisgICAgICogICAgICAgICAgICBsb2FkZWQsIG1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gc2lnbmVycworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDb2RlU2lnbmVyfXMgb2YgdGhlIGNvZGUsIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBsb2NhdGlvbn0uIE1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgQ29kZVNvdXJjZShVUkwgbG9jYXRpb24sIENvZGVTaWduZXJbXSBzaWduZXJzKSB7CiAgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgaWYgKHNpZ25lcnMgIT0gbnVsbCkgewpAQCAtOTAsMTcgKzExNCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSByZXByZXNlbnQKLSAgICAgKiB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcyBzcGVjaWZpYyBjb21wYXJpc29uLiBJbiB0aGlzCi0gICAgICogY2FzZSwgdGhlIHJlY2VpdmVyIGFuZCB0aGUgb2JqZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBVUkwgYW5kIHRoZSBzYW1lCi0gICAgICogY29sbGVjdGlvbiBvZiBjZXJ0aWZpY2F0ZXMuCi0gICAgICogCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIHtAY29kZSBDb2RlU291cmNlfSBmb3IgZXF1YWxpdHkuCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZgorICAgICAqIHtAY29kZSBDb2RlU291cmNlfSwgcG9pbnRzIHRvIHRoZSBzYW1lIHtAY29kZSBVUkx9IGxvY2F0aW9uIGFuZCB0aGUgdHdvCisgICAgICogY29kZSBzb3VyY2VzIGVuY2Fwc3VsYXRlIHRoZSBzYW1lIHtAY29kZSBDZXJ0aWZpY2F0ZX1zLiBUaGUgb3JkZXIgb2YgdGhlCisgICAgICoge0Bjb2RlIENlcnRpZmljYXRlfXMgaXMgaWdub3JlZCBieSB0aGlzIG1ldGhvZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0Ci0gICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkgd2l0aCB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgICAgQ29kZVNvdXJjZX0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIENvZGVTb3VyY2V9LCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKQEAgLTEzOCwxMCArMTYzLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGVzIGhlbGQgb250byBieSB0aGUgcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGVzIG9mIHRoaXMge0Bjb2RlIENvZGVTb3VyY2V9LiBJZiB0aGUKKyAgICAgKiB7QGxpbmsgI0NvZGVTb3VyY2UoVVJMLCBDb2RlU2lnbmVyW10pfSBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKKyAgICAgKiB0aGlzIGluc3RhbmNlLCB0aGUgY2VydGlmaWNhdGVzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBzdXBwbGllZCBzaWduZXJzLgorICAgICAqIDxwPgorICAgICAqIEV4dGVybmFsIG1vZGlmaWNhdGlvbnMgb2YgdGhlIHJldHVybmVkIHtAY29kZSBDZXJ0aWZpY2F0ZVtdfSBoYXMgbm8KKyAgICAgKiBpbXBhY3Qgb24gdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gQ2VydGlmaWNhdGVbXSB0aGUgcmVjZWl2ZXIncyBjZXJ0aWZpY2F0ZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZXMgb2YgdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0gb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICB0aGVyZSBpcyBub25lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpIHsKICAgICAgICAgZ2V0Q2VydGlmaWNhdGVzTm9DbG9uZSgpOwpAQCAtMTc2LDYgKzIwOCwxNiBAQAogICAgICAgICByZXR1cm4gY2VydHM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIENvZGVTaWduZXJ9cyBvZiB0aGlzIHtAY29kZSBDb2RlU291cmNlfS4gSWYgdGhlCisgICAgICoge0BsaW5rICNDb2RlU291cmNlKFVSTCwgQ2VydGlmaWNhdGVbXSl9IGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZQorICAgICAqIHRoaXMgaW5zdGFuY2UsIHRoZSBzaWduZXJzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBzdXBwbGllZCBjZXJ0aWZpY2F0ZXMuCisgICAgICogT25seSBYLjUwOSBjZXJ0aWZpY2F0ZXMgYXJlIGFuYWx5emVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lcnMgb2YgdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0sIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZQorICAgICAqICAgICAgICAgaXMgbm9uZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ29kZVNpZ25lcltdIGdldENvZGVTaWduZXJzKCkgewogICAgICAgICBpZiAoc2lnbmVycyAhPSBudWxsKSB7CiAgICAgICAgICAgICBDb2RlU2lnbmVyW10gdG1wID0gbmV3IENvZGVTaWduZXJbc2lnbmVycy5sZW5ndGhdOwpAQCAtMjY1LDI0ICszMDcsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWNlaXZlcidzIGxvY2F0aW9uLgorICAgICAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoaXMge0Bjb2RlIENvZGVTb3VyY2V9LgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gVVJMIHRoZSByZWNlaXZlcidzIFVSTAorICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMge0Bjb2RlIENvZGVTb3VyY2V9LCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFVSTCBnZXRMb2NhdGlvbigpIHsKICAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byBvYmplY3RzIHdoaWNoCi0gICAgICogYW5zd2VyIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIDxjb2RlPi5lcXVhbHM8L2NvZGU+IG11c3QKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0uCisgICAgICogUmV0dXJucyB0aGUgc2FtZSBoYXNoIGNvZGUgZm9yIHtAY29kZSBDb2RlU291cmNlfXMgdGhhdCBhcmUKKyAgICAgKiBlcXVhbCB0byBlYWNoIG90aGVyIGFzIHJlcXVpcmVkIGJ5IHRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mCisgICAgICoge0BsaW5rIE9iamVjdCNoYXNoQ29kZX0uCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIHJlY2VpdmVyJ3MgaGFzaC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIENvZGVTb3VyY2V9LgorICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCisgICAgICogQHNlZSBDb2RlU291cmNlI2VxdWFscyhPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgLy8KQEAgLTI5MywxMyArMzM2LDcwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGNvZGUgc291cmNlIGlzIGltcGxpZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29kZSBzb3VyY2UgaXMgaW1wbGllZCBieSB0aGlzIHtAY29kZQorICAgICAqIENvZGVTb3VyY2V9LiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICAgICAqIHtAY29kZSB0cnVlfSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX06CisgICAgICogPHA+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGNvZGUgY3N9IGlzIG5vdCB7QGNvZGUgbnVsbH0KKyAgICAgKiA8bGk+aWYgdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0gaGFzIGFzc29jaWF0ZWQgY2VydGlmaWNhdGVzLCBhbGwKKyAgICAgKiBjZXJ0aWZpY2F0ZXMgYXJlIHByZXNlbnQgaW4ge0Bjb2RlIGNzfS4gVGhlIGNlcnRpZmljYXRlcyBhcmUgZXh0cmFjdGVkCisgICAgICogZnJvbSB0aGUgc2lnbmVycyBpZiBzaWduZXJzIGFyZSBwcmVzZW50LgorICAgICAqIDxsaT5pZiB0aGlzIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIGlzIG5vdCB7QGNvZGUgbnVsbH0sIHRoZQorICAgICAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBjaGVja2VkCisgICAgICogPHVsPgorICAgICAqIDxsaT50aGlzIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIGlzIG5vdCB7QGNvZGUgbnVsbH0KKyAgICAgKiA8bGk+dGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0ncyBsb2NhdGlvbiBwcm90b2NvbCBpcyBlcXVhbCB0byB7QGNvZGUgY3N9J3MKKyAgICAgKiBsb2NhdGlvbiBwcm90b2NvbAorICAgICAqIDxsaT5pZiB0aGlzIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIGhvc3QgaXMgbm90IHtAY29kZSBudWxsfSwgdGhlCisgICAgICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGNoZWNrZWQKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAY29kZSBjc30ncyBob3N0IGlzIG5vdCB7QGNvZGUgbnVsbH0KKyAgICAgKiA8bGk+dGhlIHtAbGluayBTb2NrZXRQZXJtaXNzaW9ufSBvZiB0aGlzIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uCisgICAgICogaG9zdCBpbXBsaWVzIHRoZSB7QGNvZGUgU29ja2V0UGVybWlzc2lvbn0gb2Yge0Bjb2RlIGNzfSdzIGxvY2F0aW9uIGhvc3QKKyAgICAgKiA8L3VsPgorICAgICAqIDxsaT5pZiB0aGlzIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIHBvcnQgIT0gLTEgdGhlIHBvcnQgb2Yge0Bjb2RlCisgICAgICogY3N9J3MgbG9jYXRpb24gaXMgZXF1YWwgdG8gdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0ncyBsb2NhdGlvbiBwb3J0CisgICAgICogPGxpPnRoaXMge0Bjb2RlIENvZGVTb3VyY2V9J3MgbG9jYXRpb24gZmlsZSBtYXRjaGVzIHtAY29kZSBjc30ncyBmaWxlCisgICAgICogd2hlcmVhcyBzcGVjaWFsIHdpbGRjYXJkIG1hdGNoaW5nIGFwcGxpZXMgYXMgZGVzY3JpYmVkIGJlbG93CisgICAgICogPGxpPnRoaXMge0Bjb2RlIENvZGVTb3VyY2V9J3MgbG9jYXRpb24gcmVmZXJlbmNlIGlzIGVxdWFsIHRvIHRvIHtAY29kZQorICAgICAqIGNzfSdzIGxvY2F0aW9uIHJlZmVyZW5jZQorICAgICAqIDwvdWw+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBJZiB0aGlzIHtAY29kZSBDb2RlU291cmNlfSBoYXMgYSB7QGNvZGUgbnVsbH0gbG9jYXRpb24gYW5kIG5vdCBhbnkKKyAgICAgKiBjZXJ0aWZpY2F0ZXMsIHRoaXMgbWV0aG9kIHJldHVybnMge0Bjb2RlIHRydWV9LgorICAgICAqIDxwPgorICAgICAqIE1hdGNoaW5nIHJ1bGVzIGZvciB0aGUge0Bjb2RlIENvZGVTb3VyY2V9J3MgbG9jYXRpb24gZmlsZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmlmIHRoaXMge0Bjb2RlIENvZGVTb3VyY2V9J3MgbG9jYXRpb24gZmlsZSBlbmRzIHdpdGgge0Bjb2RlICIvLSJ9LAorICAgICAqIHRoZW4ge0Bjb2RlIGNzfSdzIGZpbGUgbXVzdCBzdGFydCB3aXRoIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIGZpbGUKKyAgICAgKiAoZXhjbHVzaXZlIHRoZSB0cmFpbGluZyAnLScpCisgICAgICogPGxpPmlmIHRoaXMge0Bjb2RlIENvZGVTb3VyY2V9J3MgbG9jYXRpb24gZmlsZSBlbmRzIHdpdGgge0Bjb2RlICIvKiJ9LAorICAgICAqIHRoZW4ge0Bjb2RlIGNzfSdzIGZpbGUgbXVzdCBzdGFydCB3aXRoIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIGZpbGUKKyAgICAgKiAoZXhjbHVzaXZlIHRoZSB0cmFpbGluZyAnKicpIGFuZCBtdXN0IG5vdCBoYXZlIGFueSBmdXJ0aGVyICcvJworICAgICAqIDxsaT5pZiB0aGlzIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIGZpbGUgZW5kcyB3aXRoIHtAY29kZSAiLyJ9LAorICAgICAqIHRoZW4ge0Bjb2RlIGNzfSdzIGZpbGUgbXVzdCBzdGFydCB3aXRoIHtAY29kZSBDb2RlU291cmNlfSdzIGxvY2F0aW9uIGZpbGUKKyAgICAgKiA8bGk+aWYgdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0ncyBsb2NhdGlvbiBmaWxlIGRvZXMgbm90IGVuZCB3aXRoIHtAY29kZQorICAgICAqICIvIn0sIHRoZW4ge0Bjb2RlIGNzfSdzIGZpbGUgbXVzdCBzdGFydCB3aXRoIHtAY29kZSBDb2RlU291cmNlfSdzCisgICAgICogbG9jYXRpb24gZmlsZSB3aXRoIHRoZSAnLycgYXBwZW5kZWQgdG8gaXQuCisgICAgICogPC91bD4KKyAgICAgKiBFeGFtcGxlcyBmb3IgbG9jYXRpb25zIHRoYXQgaW1wbHkgdGhlIGxvY2F0aW9uCisgICAgICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYW5kcm9pZC9zZWN1cml0eS5hcGsiOgogICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogaHR0cDoKKyAgICAgKiBodHRwOi8vJiM0MjsvYW5kcm9pZC8qCisgICAgICogaHR0cDovLyouZ29vZ2xlLmNvbS9hbmRyb2lkLyoKKyAgICAgKiBodHRwOi8vY29kZS5nb29nbGUuY29tL2FuZHJvaWQvLQorICAgICAqIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYW5kcm9pZC9zZWN1cml0eS5hcGsKKyAgICAgKiA8L3ByZT4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IGNvZGUgc291cmNlIGlzCi0gICAgICogICAgICAgICBpbXBsaWVkIGJ5IHRoZSByZWNlaXZlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QuCiAgICAgICogQHBhcmFtIGNzCi0gICAgICogICAgICAgICAgICBDb2RlU291cmNlIHRoZSBjb2RlIHNvdXJjZSB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgc291cmNlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhcmd1bWVudCBjb2RlIHNvdXJjZSBpcyBpbXBsaWVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBDb2RlU291cmNlfSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhDb2RlU291cmNlIGNzKSB7CiAgICAgICAgIC8vCkBAIC00NDksMTAgKzU0OSwxMSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCisgICAgICogdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0gaW5jbHVkaW5nIGl0cyBsb2NhdGlvbiwgaXRzIGNlcnRpZmljYXRlcyBhbmQgaXRzCisgICAgICogc2lnbmVycy4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgQ29kZVNvdXJjZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0RpZ2VzdEV4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0RpZ2VzdEV4Y2VwdGlvbi5qYXZhCmluZGV4IGI2M2VkZGEuLmQ1Nzk4ODUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9EaWdlc3RFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvRGlnZXN0RXhjZXB0aW9uLmphdmEKQEAgLTIzLDQ0ICsyMyw1NSBAQAogcGFja2FnZSBqYXZhLnNlY3VyaXR5OwogCiAvKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBleGNlcHRpb25zIGZvciBtZXNzYWdlIGRpZ2VzdCBjb21wdXRhdGlvbi4KLSAqIAorICp7QGNvZGUgRGlnZXN0RXhjZXB0aW9ufSBpcyBhIGdlbmVyYWwgbWVzc2FnZSBkaWdlc3QgZXhjZXB0aW9uLgorICoKKyAqQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEaWdlc3RFeGNlcHRpb24gZXh0ZW5kcyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1ODIxNDUwMzAzMDkzNjUyNTE1TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KLSAgICAgKiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBEaWdlc3RFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZ2l2ZW4gbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGlnZXN0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIERpZ2VzdEV4Y2VwdGlvbn0uCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERpZ2VzdEV4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIERpZ2VzdEV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBtZXNzYWdlIGFuZCB0aGUgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHdoaWNoIGlzIHRoZSBjYXVzZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERpZ2VzdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIERpZ2VzdEV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGlnZXN0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvRGlnZXN0SW5wdXRTdHJlYW0uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9EaWdlc3RJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDg0Y2UzYWQuLjBkYjc2MTMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9EaWdlc3RJbnB1dFN0cmVhbS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9EaWdlc3RJbnB1dFN0cmVhbS5qYXZhCkBAIC0yNywxMyArMjcsMTcgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiB7QGNvZGUgRGlnZXN0SW5wdXRTdHJlYW19IGlzIGEge0Bjb2RlIEZpbHRlcklucHV0U3RyZWFtfSB3aGljaCBtYWludGFpbnMgYW4KKyAqIGFzc29jaWF0ZWQgbWVzc2FnZSBkaWdlc3QuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGlnZXN0SW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFRoZSBtZXNzYWdlIGRpZ2VzdCBmb3IgdGhpcyBzdHJlYW0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VEaWdlc3QgZGlnZXN0OwogCkBAIC00MSw3ICs0NSwxNCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBpc09uID0gdHJ1ZTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHtAY29kZSBEaWdlc3RJbnB1dFN0cmVhbX0sIHVzaW5nIHRoZQorICAgICAqIGdpdmVuIHtAY29kZSBzdHJlYW19IGFuZCB0aGUge0Bjb2RlIGRpZ2VzdH0uCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gZGlnZXN0CisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSBkaWdlc3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERpZ2VzdElucHV0U3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSwgTWVzc2FnZURpZ2VzdCBkaWdlc3QpIHsKICAgICAgICAgc3VwZXIoc3RyZWFtKTsKQEAgLTQ5LDQyICs2MCwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1lc3NhZ2VEaWdlc3Qgd2hpY2ggdGhlIHJlY2VpdmVyIHVzZXMgd2hlbiBjb21wdXRpbmcgdGhlCi0gICAgICogaGFzaC4KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdCBmb3IgdGhpcyBzdHJlYW0uCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBNZXNzYWdlRGlnZXN0IHRoZSBkaWdlc3QgdGhlIHJlY2VpdmVyIHVzZXMgd2hlbiBjb21wdXRpbmcgdGhlCi0gICAgICogICAgICAgICBoYXNoLgotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0IGZvciB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWVzc2FnZURpZ2VzdCBnZXRNZXNzYWdlRGlnZXN0KCkgewogICAgICAgICByZXR1cm4gZGlnZXN0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIE1lc3NhZ2VEaWdlc3Qgd2hpY2ggdGhlIHJlY2VpdmVyIHdpbGwgdXNlIHdoZW4gY29tcHV0aW5nIHRoZQotICAgICAqIGhhc2guCi0gICAgICogCisgICAgICogU2V0cyB0aGUgbWVzc2FnZSBkaWdlc3Qgd2hpY2ggdGhpcyBzdHJlYW0gd2lsbCB1c2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpZ2VzdAotICAgICAqICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCB0aGUgZGlnZXN0IHRvIHVzZSB3aGVuIGNvbXB1dGluZyB0aGUgaGFzaC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIE1lc3NhZ2VEaWdlc3QKLSAgICAgKiBAc2VlICNvbgorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgZGlnZXN0IHdoaWNoIHRoaXMgc3RyZWFtIHdpbGwgdXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEaWdlc3QoTWVzc2FnZURpZ2VzdCBkaWdlc3QpIHsKICAgICAgICAgdGhpcy5kaWdlc3QgPSBkaWdlc3Q7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG5leHQgYnl0ZSBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbnQuIFVwZGF0ZXMgdGhlIGRpZ2VzdCBmb3IgdGhlCi0gICAgICogYnl0ZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIGVuYWJsZWQuCisgICAgICogUmVhZHMgdGhlIG5leHQgYnl0ZSBhbmQgcmV0dXJucyBpdCBhcyBhbiB7QGNvZGUgaW50fS4gVXBkYXRlcyB0aGUgZGlnZXN0CisgICAgICogZm9yIHRoZSBieXRlIGlmIHRoaXMgZnVuY3Rpb24gaXMge0BsaW5rICNvbihib29sZWFuKX0uCisgICAgICogPHA+CisgICAgICogVGhpcyBvcGVyYXRpb24gaXMgYmxvY2tpbmcuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IHRoZSBieXRlIHdoaWNoIHdhcyByZWFkIG9yIC0xIGF0IGVuZCBvZiBzdHJlYW0uCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgcmVhZGluZyB0aGUgc291cmNlIHN0cmVhbSBjYXVzZXMgYW4gSU9FeGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgYnl0ZSB3aGljaCB3YXMgcmVhZCBvciAtMSBhdCBlbmQgb2Ygc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiByZWFkaW5nIHRoZSBzb3VyY2Ugc3RyZWFtIGNhdXNlcyBhbiB7QGNvZGUgSU9FeGNlcHRpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlYWQgdGhlIG5leHQgYnl0ZQpAQCAtMTAwLDcgKzEwNiwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmVhZHMge0Bjb2RlIGxlbn0gYnl0ZXMgaW50byB0aGUgc3BlY2lmaWVkIHtAY29kZSBieXRlW119LCBzdGFydGluZyBmcm9tCisgICAgICogdGhlIHNwZWNpZmllZCBvZmZzZXQuIFVwZGF0ZXMgdGhlIGRpZ2VzdCBpZiB0aGlzIGZ1bmN0aW9uIGlzCisgICAgICoge0BsaW5rICNvbihib29sZWFuKX0uCisgICAgICogPHA+CisgICAgICogVGhpcyBvcGVyYXRpb24gaXMgYmxvY2tpbmcuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYn0gdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQgZnJvbQorICAgICAqICAgICAgICAgICAgdGhpcyBzdHJlYW0KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4ge0Bjb2RlIGJ9CisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgIGZpbHRlcmVkIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkIHdoaWxlIHJlYWRpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcmVhZGluZyB0aGUgc291cmNlIHN0cmVhbSBjYXVzZXMgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gcmVhZCBuZXh0IHVwIHRvIGxlbiBieXRlcwpAQCAtMTE4LDIzICsxNDIsMjEgQEAKICAgICAvKioKICAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBkaWdlc3QgZnVuY3Rpb24gKGRlZmF1bHQgaXMgb24pLgogICAgICAqIAotICAgICAqIAogICAgICAqIEBwYXJhbSBvbgotICAgICAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlIGlmIHRoZSBkaWdlc3Qgc2hvdWxkIGJlIGNvbXB1dGVkLCBhbmQgZmFsc2UKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgZGlnZXN0IHNob3VsZCBiZSBjb21wdXRlZCwge0Bjb2RlIGZhbHNlfQogICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEBzZWUgTWVzc2FnZURpZ2VzdAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uKGJvb2xlYW4gb24pIHsKICAgICAgICAgaXNPbiA9IG9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMKKyAgICAgKiB7QGNvZGUgRGlnZXN0SW5wdXRTdHJlYW19IGluY2x1ZGluZyB0aGUgZGlnZXN0LgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgRGlnZXN0SW5wdXRTdHJlYW19LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiwgIiArIGRpZ2VzdC50b1N0cmluZygpICsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0RpZ2VzdE91dHB1dFN0cmVhbS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0RpZ2VzdE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDliYmM1OTMuLjg1OGY4ZGQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9EaWdlc3RPdXRwdXRTdHJlYW0uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvRGlnZXN0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTI3LDEzICsyNywxNSBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKKyAqIHtAY29kZSBEaWdlc3RPdXRwdXRTdHJlYW19IGlzIGEge0Bjb2RlIEZpbHRlck91dHB1dFN0cmVhbX0gd2hpY2ggbWFpbnRhaW5zIGFuCisgKiBhc3NvY2lhdGVkIG1lc3NhZ2UgZGlnZXN0LgogICovCiBwdWJsaWMgY2xhc3MgRGlnZXN0T3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIG1lc3NhZ2UgZGlnZXN0IGZvciB0aGlzIHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgTWVzc2FnZURpZ2VzdCBkaWdlc3Q7CiAKQEAgLTQxLDcgKzQzLDE0IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzT24gPSB0cnVlOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMge0Bjb2RlIERpZ2VzdE91dHB1dFN0cmVhbX0sIHVzaW5nIHRoZQorICAgICAqIGdpdmVuIHtAY29kZSBzdHJlYW19IGFuZCB0aGUge0Bjb2RlIGRpZ2VzdH0uCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIGRpZ2VzdAorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgZGlnZXN0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEaWdlc3RPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSwgTWVzc2FnZURpZ2VzdCBkaWdlc3QpIHsKICAgICAgICAgc3VwZXIoc3RyZWFtKTsKQEAgLTQ5LDM1ICs1OCwzNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1lc3NhZ2VEaWdlc3Qgd2hpY2ggdGhlIHJlY2VpdmVyIHVzZXMgd2hlbiBjb21wdXRpbmcgdGhlCi0gICAgICogaGFzaC4KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdCBmb3IgdGhpcyBzdHJlYW0uCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBNZXNzYWdlRGlnZXN0IHRoZSBkaWdlc3QgdGhlIHJlY2VpdmVyIHVzZXMgd2hlbiBjb21wdXRpbmcgdGhlCi0gICAgICogICAgICAgICBoYXNoLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0IGZvciB0aGlzIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLQogICAgIHB1YmxpYyBNZXNzYWdlRGlnZXN0IGdldE1lc3NhZ2VEaWdlc3QoKSB7CiAgICAgICAgIHJldHVybiBkaWdlc3Q7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgTWVzc2FnZURpZ2VzdCB3aGljaCB0aGUgcmVjZWl2ZXIgd2lsbCB1c2Ugd2hlbiBjb21wdXRpbmcgdGhlCi0gICAgICogaGFzaC4KLSAgICAgKiAKKyAgICAgKiBTZXRzIHRoZSBtZXNzYWdlIGRpZ2VzdCB3aGljaCB0aGlzIHN0cmVhbSB3aWxsIHVzZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGlnZXN0Ci0gICAgICogICAgICAgICAgICBNZXNzYWdlRGlnZXN0IHRoZSBkaWdlc3QgdG8gdXNlIHdoZW4gY29tcHV0aW5nIHRoZSBoYXNoLgotICAgICAqIAotICAgICAqIEBzZWUgTWVzc2FnZURpZ2VzdAotICAgICAqIEBzZWUgI29uCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSBkaWdlc3Qgd2hpY2ggdGhpcyBzdHJlYW0gd2lsbCB1c2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZURpZ2VzdChNZXNzYWdlRGlnZXN0IGRpZ2VzdCkgewogICAgICAgICB0aGlzLmRpZ2VzdCA9IGRpZ2VzdDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIHtAY29kZSBpbnR9IHRvIHRoZSBzdHJlYW0uIFVwZGF0ZXMgdGhlIGRpZ2VzdCBpZgorICAgICAqIHRoaXMgZnVuY3Rpb24gaXMge0BsaW5rICNvbihib29sZWFuKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHdyaXRpbmcgdG8gdGhlIHN0cmVhbSBjYXVzZXMgYSB7QGNvZGUgSU9FeGNlcHRpb259CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHVwZGF0ZSBkaWdlc3Qgb25seSBpZiBkaWdlc3QgZnVuY3Rpb25hbGl0eSBpcyBvbgpAQCAtODksNyArOTgsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFdyaXRlcyB7QGNvZGUgbGVufSBieXRlcyBpbnRvIHRoZSBzdHJlYW0sIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIG9mZnNldC4gVXBkYXRlcyB0aGUgZGlnZXN0IGlmIHRoaXMgZnVuY3Rpb24gaXMge0BsaW5rICNvbihib29sZWFuKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHtAY29kZSBifSB0byB3cml0ZS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHtAY29kZSBifSB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgd3JpdGluZyB0byB0aGUgc3RyZWFtIGNhdXNlcyBhbiB7QGNvZGUgSU9FeGNlcHRpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyB1cGRhdGUgZGlnZXN0IG9ubHkgaWYgZGlnZXN0IGZ1bmN0aW9uYWxpdHkgaXMgb24KQEAgLTEwMywyMyArMTIzLDIxIEBACiAgICAgLyoqCiAgICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZGlnZXN0IGZ1bmN0aW9uIChkZWZhdWx0IGlzIG9uKS4KICAgICAgKiAKLSAgICAgKiAKICAgICAgKiBAcGFyYW0gb24KLSAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZGlnZXN0IHNob3VsZCBiZSBjb21wdXRlZCwgYW5kIGZhbHNlCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRpZ2VzdCBzaG91bGQgYmUgY29tcHV0ZWQsIHtAY29kZSBmYWxzZX0KICAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIE1lc3NhZ2VEaWdlc3QKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbihib29sZWFuIG9uKSB7CiAgICAgICAgIGlzT24gPSBvbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICoge0Bjb2RlIERpZ2VzdE91dHB1dFN0cmVhbX0gaW5jbHVkaW5nIHRoZSBkaWdlc3QuCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBEaWdlc3RPdXRwdXRTdHJlYW19LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiwgIiArIGRpZ2VzdC50b1N0cmluZygpICsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0RvbWFpbkNvbWJpbmVyLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvRG9tYWluQ29tYmluZXIuamF2YQppbmRleCBkYjA3MmI2Li41MDFjNDE5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvRG9tYWluQ29tYmluZXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvRG9tYWluQ29tYmluZXIuamF2YQpAQCAtMjMsMTMgKzIzLDMxIEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogQSBEb21haW5Db21iaW5lciBpcyBhIHdheSB0byB1cGRhdGUgdGhlIHByb3RlY3Rpb24gZG9tYWlucyBmcm9tIGFuCi0gKiBBY2Nlc3NDb250cm9sQ29udGV4dAorICoge0Bjb2RlIERvbWFpbkNvbWJpbmVyfSBpcyB1c2VkIHRvIHVwZGF0ZSBhbmQgb3B0aW1pemUge0Bjb2RlCisgKiBQcm90ZWN0aW9uRG9tYWlufXMgZnJvbSBhbiB7QGNvZGUgQWNjZXNzQ29udHJvbENvbnRleHR9LgogICogCisgKiBAc2VlIEFjY2Vzc0NvbnRyb2xDb250ZXh0CisgKiBAc2VlIEFjY2Vzc0NvbnRyb2xDb250ZXh0I0FjY2Vzc0NvbnRyb2xDb250ZXh0KEFjY2Vzc0NvbnRyb2xDb250ZXh0LAorICogICAgICBEb21haW5Db21iaW5lcikKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERvbWFpbkNvbWJpbmVyIHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gcHJvdmlkZWQge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59CisgICAgICogYXJyYXlzLiBJbXBsZW1lbnRlcnMgY2FuIHNpbXBseSBtZXJnZSB0aGUgdHdvIGFycmF5cyBpbnRvIG9uZSwgcmVtb3ZlCisgICAgICogZHVwbGljYXRlcyBhbmQgcGVyZm9ybSBvdGhlciBvcHRpbWl6YXRpb25zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjdXJyZW50CisgICAgICogICAgICAgICAgICB0aGUgcHJvdGVjdGlvbiBkb21haW5zIG9mIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiB0aHJlYWQgKHNpbmNlCisgICAgICogICAgICAgICAgICB0aGUgbW9zdCByZWNlbnQgY2FsbCB0byB7QGxpbmsgQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWR9CisgICAgICogICAgICAgICAgICApLgorICAgICAqIEBwYXJhbSBhc3NpZ25lZAorICAgICAqICAgICAgICAgICAgdGhlIHByb3RlY3Rpb24gZG9tYWlucyBvZiB0aGUgcGFyZW50IHRocmVhZCwgbWF5YmUge0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfS4KKyAgICAgKiBAcmV0dXJuIGEgc2luZ2xlIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufSBhcnJheSBjb21wdXRlZCBmcm9tIHRoZSB0d28KKyAgICAgKiAgICAgICAgIHByb3ZpZGVkIGFycmF5cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBQcm90ZWN0aW9uRG9tYWluW10gY29tYmluZShQcm90ZWN0aW9uRG9tYWluW10gY3VycmVudCwKICAgICAgICAgICAgIFByb3RlY3Rpb25Eb21haW5bXSBhc3NpZ25lZCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uLmphdmEKaW5kZXggZmI4ZDcyZS4uMmExY2FjYiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0dlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24uamF2YQpAQCAtMjMsNDQgKzIzLDU2IEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBnZW5lcmFsIHNlY3VyaXR5IGV4Y2VwdGlvbi4gU3ViY2xhc3NlcyB3aWxsCi0gKiByZXByZXNlbnRzIHNwZWNpZmljIHNlY3VyaXR5IHByb2JsZW1zLgorICoge0Bjb2RlIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbn0gaXMgYSBnZW5lcmFsIHNlY3VyaXR5IGV4Y2VwdGlvbiBhbmQgdGhlCisgKiBzdXBlcmNsYXNzIGZvciBhbGwgc2VjdXJpdHkgc3BlY2lmaWMgZXhjZXB0aW9ucy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4OTQ3OTgxMjIwNTM1MzkyMzdMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UgYW5kIHRoZSBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBpcyB0aGUgY2F1c2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9HdWFyZC5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0d1YXJkLmphdmEKaW5kZXggODA0MmUzNC4uMWU0ZDI3MCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0d1YXJkLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0d1YXJkLmphdmEKQEAgLTIzLDE0ICsyMywyMiBAQAogcGFja2FnZSBqYXZhLnNlY3VyaXR5OwogCiAvKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IG9iamVjdHMgd2hpY2ggd2lzaCB0byBjb250cm9sIGFjY2VzcyB0bwotICogb3RoZXIgb2JqZWN0cy4KKyAqIHtAY29kZSBHdWFyZH0gaW1wbGVtZW50b3JzIHByb3RlY3QgYWNjZXNzIHRvIG90aGVyIG9iamVjdHMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEd1YXJkIHsKIAotICAgIC8qKiAKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgT2JqZWN0fSBzaG91bGQgYmUgZ3JhbnRlZC4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHNpbGVudGx5IGlmIGFjY2VzcyBpcyBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUKKyAgICAgKiBTZWN1cml0eUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYmUgcHJvdGVjdGVkIGJ5IHRoaXMge0Bjb2RlIEd1YXJkfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYWNjZXNzIGlzIG5vdCBncmFudGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrR3VhcmQoT2JqZWN0IG9iamVjdCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0d1YXJkZWRPYmplY3QuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9HdWFyZGVkT2JqZWN0LmphdmEKaW5kZXggYjI4NDAyNi4uYTY0ZDYzNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0d1YXJkZWRPYmplY3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvR3VhcmRlZE9iamVjdC5qYXZhCkBAIC0yNiwzNSArMjYsMjkgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBHdWFyZGVkT2JqZWN0IGNvbnRyb2xzIGFjY2VzcyB0byBhbiBvYmplY3QsIGJ5IGNoZWNraW5nIGFsbCByZXF1ZXN0cyBmb3IgdGhlCi0gKiBvYmplY3Qgd2l0aCBhIEd1YXJkLgorICoge0Bjb2RlIEd1YXJkZWRPYmplY3R9IGNvbnRyb2xzIGFjY2VzcyB0byBhbiBvYmplY3QsIGJ5IGNoZWNraW5nIGFsbCByZXF1ZXN0cworICogZm9yIHRoZSBvYmplY3Qgd2l0aCBhIHtAY29kZSBHdWFyZH0uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgR3VhcmRlZE9iamVjdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MjQwNDUwMDk2MjI3ODM0MzA4TDsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2JqZWN0OwogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEd1YXJkIGd1YXJkOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEd1YXJkZWRPYmplY3QgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBPYmplY3QKLSAgICAgKiB1c2luZyB0aGUgc3BlY2lmaWVkIEd1YXJkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEd1YXJkZWRPYmplY3R9IHdoaWNoIHByb3RlY3RzIGFjY2VzcworICAgICAqIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIE9iamVjdH0gdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgR3VhcmR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gZ3VhcmQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT2JqZWN0fSB0byBwcm90ZWN0LgogICAgICAqIEBwYXJhbSBndWFyZAotICAgICAqICAgICAgICAgICAgdGhlIEd1YXJkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEd1YXJkfSB3aGljaCBwcm90ZWN0cyB0aGUgc3BlY2lmaWVkIHtAY29kZSBPYmplY3R9LAorICAgICAqICAgICAgICAgICAgbWF5YmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBHdWFyZGVkT2JqZWN0KE9iamVjdCBvYmplY3QsIEd1YXJkIGd1YXJkKSB7CiAgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwpAQCAtNjIsMTUgKzU2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgYWNjZXNzIHNob3VsZCBiZSBncmFudGVkIHRvIHRoZSBvYmplY3QuIElmIGFjY2VzcyBpcwotICAgICAqIGdyYW50ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9iamVjdC4gSWYgaXQgaXMgbm90IGdyYW50ZWQsIHRoZW4gYQotICAgICAqIDxjb2RlPlNlY3VyaXR5RXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uCisgICAgICogUmV0dXJucyB0aGUgZ3VhcmRlZCB7QGNvZGUgT2JqZWN0fSBpZiB0aGUgYXNzb2NpYXRlZCB7QGNvZGUgR3VhcmR9CisgICAgICogcGVybWl0cyBhY2Nlc3MuIElmIGFjY2VzcyBpcyBub3QgZ3JhbnRlZCwgdGhlbiBhIHtAY29kZQorICAgICAqIFNlY3VyaXR5RXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZ3VhcmRlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIGFjY2VzcyBpcyBub3QgZ3JhbnRlZCB0byB0aGUgb2JqZWN0CisgICAgICogQHJldHVybiB0aGUgZ3VhcmRlZCBvYmplY3QuCisgICAgICogQGV4Y2VwdGlvbiBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFjY2VzcyBpcyBub3QgZ3JhbnRlZCB0byB0aGUgZ3VhcmRlZCBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBpZiAoZ3VhcmQgIT0gbnVsbCkgewpAQCAtNzksOCArNzIsOSBAQAogICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgIH0KIAotICAgIC8qKiAKLSAgICAgKiBDaGVja3MgZ3VhcmQgKGlmIHRoZXJlIGlzIG9uZSkgYmVmb3JlIHBlcmZvcm1pbmcgYSBkZWZhdWx0IHNlcmlhbGl6YXRpb24uIAorICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgZ3VhcmQgKGlmIHRoZXJlIGlzIG9uZSkgYmVmb3JlIHBlcmZvcm1pbmcgYSBkZWZhdWx0CisgICAgICogc2VyaWFsaXphdGlvbi4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoZ3VhcmQgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0lkZW50aXR5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvSWRlbnRpdHkuamF2YQppbmRleCA3YzM0NjlkLi43MTExMDI5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvSWRlbnRpdHkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvSWRlbnRpdHkuamF2YQpAQCAtMjAsNiArMjAsMTAgQEAKICogQHZlcnNpb24gJFJldmlzaW9uJAogKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBBZGRlZCBEZXByZWNhdGVkIGFubm90YXRpb24uCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwpAQCAtMjksOSArMzMsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKKyAqIHtAY29kZSBJZGVudGl0eX0gcmVwcmVzZW50cyBhbiBpZGVudGl0eSBsaWtlIGEgcGVyc29uIG9yIGEgY29tcGFueS4KICAqIAotICogQGRlcHJlY2F0ZWQKKyAqIEBkZXByZWNhdGVkIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaGFzIGJlZW4gcmVwbGFjZSBieQorICogICAgICAgICAgICAge0BsaW5rIFByaW5jaXBhbH0sIHtAbGluayBLZXlTdG9yZX0gYW5kIHRoZSB7QGNvZGUKKyAqICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuY2VydH0gcGFja2FnZS4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCitARGVwcmVjYXRlZAogcHVibGljIGFic3RyYWN0IGNsYXNzIElkZW50aXR5IGltcGxlbWVudHMgUHJpbmNpcGFsLCBTZXJpYWxpemFibGUgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MDk5MjIwMDc4MjY2MDA2NTlMOwogCkBAIC00NSwxMyArNTQsMzggQEAKIAogICAgIHByaXZhdGUgVmVjdG9yPENlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXM7CiAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIElkZW50aXR5KCkgewogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIElkZW50aXR5fSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBJZGVudGl0eShTdHJpbmcgbmFtZSkgewogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIElkZW50aXR5fSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKKyAgICAgKiB0aGUgc2NvcGUgb2YgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogQHBhcmFtIHNjb3BlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIElkZW50aXR5U2NvcGV9IG9mIHRoaXMge0Bjb2RlIElkZW50aXR5fS4KKyAgICAgKiBAdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiB7QGNvZGUgSWRlbnRpdHl9IHdpdGggdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IHByZXNlbnQKKyAgICAgKiAgICAgICAgICAgICBpbiB0aGUgc3BlY2lmaWVkIHNjb3BlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBJZGVudGl0eShTdHJpbmcgbmFtZSwgSWRlbnRpdHlTY29wZSBzY29wZSkKICAgICAgICAgICAgIHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgdGhpcyhuYW1lKTsKQEAgLTYxLDYgKzk1LDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBZGRzIGEge0Bjb2RlIENlcnRpZmljYXRlfSB0byB0aGlzIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcworICAgICAqIHRoZSB7QGNvZGUgU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgYWRkSWRlbnRpdHlDZXJ0aWZpY2F0ZX0gdG8gYmUKKyAgICAgKiBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2VydGlmaWNhdGV9IHRvIGJlIGFkZGVkIHRvIHRoaXMge0Bjb2RlIElkZW50aXR5fS4KKyAgICAgKiBAdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbnZva2UgdGhpcyBtZXRob2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ2VydGlmaWNhdGUoQ2VydGlmaWNhdGUgY2VydGlmaWNhdGUpCiAgICAgICAgICAgICB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTEwNSw2ICsxNTYsMjMgQEAKIAogICAgICAgCiAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQge0Bjb2RlIENlcnRpZmljYXRlfSBmcm9tIHRoaXMge0Bjb2RlIElkZW50aXR5fS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSAicmVtb3ZlSWRlbnRpdHlDZXJ0aWZpY2F0ZSJ9IHRvIGJlCisgICAgICogZ3JhbnRlZCwgb3RoZXJ3aXNlIGEge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiA8cD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2VydGlmaWNhdGV9IHRvIGJlIHJlbW92ZWQuCisgICAgICogQHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNlcnRpZmljYXRlKENlcnRpZmljYXRlIGNlcnRpZmljYXRlKQogICAgICAgICAgICAgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC0xMTIsNiArMTgwLDExIEBACiAgICAgICAgICAgICBzbS5jaGVja1NlY3VyaXR5QWNjZXNzKCJyZW1vdmVJZGVudGl0eUNlcnRpZmljYXRlIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBpZiAoY2VydGlmaWNhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgICAgIGlmICghY2VydGlmaWNhdGVzLmNvbnRhaW5zKGNlcnRpZmljYXRlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMucmVtb3ZlRWxlbWVudChjZXJ0aWZpY2F0ZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTksNiArMTkyLDE0IEBACiAKICAgICAgIAogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGVzIGZvciB0aGlzIHtAY29kZSBJZGVudGl0eX0uIEV4dGVybmFsCisgICAgICogbW9kaWZpY2F0aW9ucyBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaGFzIG5vIGltcGFjdCBvbiB0aGlzIHtAY29kZQorICAgICAqIElkZW50aXR5fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2VydGlmaWNhdGVzfSBmb3IgdGhpcyB7QGNvZGUgSWRlbnRpdHl9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzKCkgewogICAgICAgICBpZiAoY2VydGlmaWNhdGVzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQ2VydGlmaWNhdGVbMF07CkBAIC0xMzEsNiArMjEyLDIxIEBACiAKICAgICAgIAogCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCB7QGNvZGUgSWRlbnRpdHl9IHdpdGggdGhpcyB7QGNvZGUgSWRlbnRpdHl9IGZvcgorICAgICAqIGVxdWFsaXR5IGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCwKKyAgICAgKiB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUbyBiZSBlcXVhbCwgdHdvIHtAY29kZSBJZGVudGl0eX0gb2JqZWN0cyBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBhbmQKKyAgICAgKiB0aGUgc2FtZSBwdWJsaWMga2V5cy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlkZW50aXR5CisgICAgICogICAgICAgICAgICB0aGUgaWRlbnRpdHkgdG8gY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgSWRlbnRpdHl9IG9iamVjdHMgYXJlIGVxdWFsLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRlbnRpdHlFcXVhbHMoSWRlbnRpdHkgaWRlbnRpdHkpIHsKICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyhpZGVudGl0eS5uYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTQ2LDYgKzI0MiwxNSBAQAogCiAgICAgICAKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgICAqIHRoaXMge0Bjb2RlIElkZW50aXR5fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGV0YWlsZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgb3Igbm90IHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgUGVybWlzc2lvbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovICAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGJvb2xlYW4gZGV0YWlsZWQpIHsKICAgICAgICAgU3RyaW5nIHMgPSB0b1N0cmluZygpOwogICAgICAgICBpZiAoZGV0YWlsZWQpIHsKQEAgLTE1Nyw2ICsyNjIsMTIgQEAKIAogICAgICAgCiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgSWRlbnRpdHlTY29wZX0gb2YgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBJZGVudGl0eVNjb3BlfSBvZiB0aGlzIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGZpbmFsIElkZW50aXR5U2NvcGUgZ2V0U2NvcGUoKSB7CiAgICAgICAgIHJldHVybiBzY29wZTsKICAgICB9CkBAIC0xNjQsNiArMjc1LDI0IEBACiAKICAgICAgIAogCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIHtAY29kZSBQdWJsaWNLZXl9IHRvIHRoaXMge0Bjb2RlIElkZW50aXR5fS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBzZXRJZGVudGl0eVB1YmxpY0tleX0gdG8gYmUKKyAgICAgKiBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFB1YmxpY0tleX0gdG8gYmUgc2V0LgorICAgICAqIEB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFub3RoZXIge0Bjb2RlIElkZW50aXR5fSBpbiB0aGUgc2FtZSBzY29wZSBhcyB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgICAgIElkZW50aXR5fSBhbHJlYWR5IGhhcyB0aGUgc2FtZSB7QGNvZGUgUHVibGljS2V5fS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpY0tleShQdWJsaWNLZXkga2V5KSB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKQEAgLTE4NCw2ICszMTMsMTIgQEAKIAogICAgICAgCiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgUHVibGljS2V5fSBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBQdWJsaWNLZXl9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKSB7CiAgICAgICAgIHJldHVybiBwdWJsaWNLZXk7CiAgICAgfQpAQCAtMTkxLDYgKzMyNiwyMCBAQAogCiAgICAgICAKIAorICAgIC8qKgorICAgICAqIFNldHMgYW4gaW5mb3JtYXRpb24gc3RyaW5nIGZvciB0aGlzIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcworICAgICAqIHRoZSB7QGNvZGUgU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgc2V0SWRlbnRpdHlJbmZvfSB0byBiZSBncmFudGVkLAorICAgICAqIG90aGVyd2lzZSBhIHtAY29kZSBTZWN1cml0eUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGluZm8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBzZXQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBpbmZvKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKQEAgLTIwMiw2ICszNTEsMTIgQEAKIAogICAgICAgCiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBzdHJpbmcgb2YgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIHN0cmluZyBvZiB0aGlzIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgewogICAgICAgICByZXR1cm4gaW5mbzsKICAgICB9CkBAIC0yMDksNiArMzY0LDE5IEBACiAKICAgICAgIAogCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIHtAY29kZSBJZGVudGl0eX0gZm9yIGVxdWFsaXR5IGFuZAorICAgICAqIHJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsLCB7QGNvZGUgZmFsc2V9CisgICAgICogb3RoZXJ3aXNlLiB7QGNvZGUgSWRlbnRpdHl9IG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwsIGlmIHRoZXkgaGF2ZQorICAgICAqIHRoZSBzYW1lIG5hbWUgYW5kIGFyZSBpbiB0aGUgc2FtZSBzY29wZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIElkZW50aXR5fS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgSWRlbnRpdHl9LCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjI3LDYgKzM5NSwxMiBAQAogCiAgICAgICAKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfQpAQCAtMjM0LDYgKzQwOCwxNiBAQAogCiAgICAgICAKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LiBSZXR1cm5zIHRoZSBzYW1lCisgICAgICogaGFzaCBjb2RlIGZvciB7QGNvZGUgSWRlbnRpdHl9cyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGFzIHJlcXVpcmVkCisgICAgICogYnkgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2Yge0BsaW5rIE9iamVjdCNoYXNoQ29kZX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIHtAY29kZSBJZGVudGl0eX0uCisgICAgICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKKyAgICAgKiBAc2VlIElkZW50aXR5I2VxdWFscyhPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaW50IGhhc2ggPSAwOwogICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CkBAIC0yNDgsNiArNDMyLDIxIEBACiAKICAgICAgIAogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICogdGhpcyB7QGNvZGUgSWRlbnRpdHl9IGluY2x1ZGluZyBpdHMgbmFtZSBhbmQgaXRzIHNjb3BlLgorICAgICAqIDxwPgorICAgICAqIElmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkLCBjb2RlIGNhbGxpbmcgdGhpcyBtZXRob2QKKyAgICAgKiBuZWVkcyB0aGUge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0ge0Bjb2RlIHByaW50SWRlbnRpdHl9IHRvIGJlIGdyYW50ZWQsCisgICAgICogb3RoZXJ3aXNlIGEge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgSWRlbnRpdHl9LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbnZva2UgdGhpcyBtZXRob2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc20gIT0gbnVsbCkgewpAQCAtMjU5LDQgKzQ1OCw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHM7CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9JZGVudGl0eVNjb3BlLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvSWRlbnRpdHlTY29wZS5qYXZhCmluZGV4IGRhYTg5MjUuLjkzNzI5ZGMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9JZGVudGl0eVNjb3BlLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0lkZW50aXR5U2NvcGUuamF2YQpAQCAtMjAsNiArMjAsMTAgQEAKICogQHZlcnNpb24gJFJldmlzaW9uJAogKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBBZGRlZCBEZXByZWNhdGVkIGFubm90YXRpb24uCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKQEAgLTI4LDM1ICszMiw1MyBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCi0gKiBAZGVwcmVjYXRlZAorICoge0Bjb2RlIElkZW50aXR5U2NvcGV9IHJlcHJlc2VudHMgYSBzY29wZSBmb3Ige0BsaW5rIElkZW50aXR5fSBvYmplY3RzLgorICogCisgKiBAZGVwcmVjYXRlZCBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGhhcyBiZWVuIHJlcGxhY2UgYnkKKyAqICAgICAgICAgICAgIHtAbGluayBQcmluY2lwYWx9LCB7QGxpbmsgS2V5U3RvcmV9IGFuZCB0aGUge0Bjb2RlCisgKiAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LmNlcnR9IHBhY2thZ2UuCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLworQERlcHJlY2F0ZWQKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJZGVudGl0eVNjb3BlIGV4dGVuZHMgSWRlbnRpdHkgewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjMzNzM0NjI4MTE4OTc3MzMxMEw7CiAKICAgICAvLyBzeXN0ZW1TY29wZSBob2xkcyByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc3lzdGVtIHNjb3BlCiAgICAgcHJpdmF0ZSBzdGF0aWMgSWRlbnRpdHlTY29wZSBzeXN0ZW1TY29wZTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIElkZW50aXR5U2NvcGV9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBJZGVudGl0eVNjb3BlKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIElkZW50aXR5U2NvcGV9IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMge0Bjb2RlIElkZW50aXR5U2NvcGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJZGVudGl0eVNjb3BlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIElkZW50aXR5U2NvcGV9IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG5hbWUgYW5kIHRoZSBzcGVjaWZpZWQgc2NvcGUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMge0Bjb2RlIElkZW50aXR5U2NvcGV9LgorICAgICAqIEBwYXJhbSBzY29wZQorICAgICAqICAgICAgICAgICAgdGhlIHNjb3BlIG9mIHRoaXMge0Bjb2RlIElkZW50aXR5U2NvcGV9LgorICAgICAqIEB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGlkZW50aXR5IHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJZGVudGl0eVNjb3BlKFN0cmluZyBuYW1lLCBJZGVudGl0eVNjb3BlIHNjb3BlKQogICAgICAgICAgICAgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gewpAQCAtNjQsNyArODYsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0ncyBzY29wZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0ncyBzY29wZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIElkZW50aXR5U2NvcGUgZ2V0U3lzdGVtU2NvcGUoKSB7CiAgICAgICAgIC8qIApAQCAtOTAsNyArMTE1LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogU2V0cyB0aGUgc3lzdGVtJ3Mgc2NvcGUuCisgICAgICogCisgICAgICogQHBhcmFtIHNjb3BlCisgICAgICogICAgICAgICAgICB0aGUgc2NvcGUgdG8gc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRTeXN0ZW1TY29wZShJZGVudGl0eVNjb3BlIHNjb3BlKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTEwMSw0OSArMTMwLDk4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHtAY29kZSBJZGVudGl0eX0gb2JqZWN0cyBpbiB0aGlzIHNjb3BlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB7QGNvZGUgSWRlbnRpdHl9IG9iamVjdHMgaW4gdGhpcyBzY29wZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHNpemUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBJZGVudGl0eX0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogbm8ge0Bjb2RlIElkZW50aXR5fSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBwcmVzZW50IGluIHRoaXMgc2NvcGUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgSWRlbnRpdHl9IHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBJZGVudGl0eX0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICBub3QgcHJlc2VudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSWRlbnRpdHkgZ2V0SWRlbnRpdHkoU3RyaW5nIG5hbWUpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIElkZW50aXR5fSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgcHJpbmNpcGFsIG9yCisgICAgICoge0Bjb2RlIG51bGx9IGlmIG5vIHtAY29kZSBJZGVudGl0eX0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogcHJpbmNpcGFsIGlzIHByZXNlbnQgaW4gdGhpcyBzY29wZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFByaW5jaXBhbH0gd2hvc2UgbmFtZSBpcyB1c2VkIHRvIGxvb2t1cCB0aGUge0Bjb2RlCisgICAgICogICAgICAgICAgICBJZGVudGl0eX0gdG8gYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIElkZW50aXR5fSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIG5vdCBwcmVzZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJZGVudGl0eSBnZXRJZGVudGl0eShQcmluY2lwYWwgcHJpbmNpcGFsKSB7CiAgICAgICAgIHJldHVybiBnZXRJZGVudGl0eShwcmluY2lwYWwuZ2V0TmFtZSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgSWRlbnRpdHl9IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqIG9yIHtAY29kZSBudWxsfSBpZiBubyB7QGNvZGUgSWRlbnRpdHl9IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqIGlzIHByZXNlbnQgaW4gdGhpcyBzY29wZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFB1YmxpY0tleX0gb2YgdGhlIHtAY29kZSBJZGVudGl0eX0gdG8gYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIElkZW50aXR5fSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgb3Ige0Bjb2RlCisgICAgICogICAgICAgICBudWxsfSBpZiBub3QgcHJlc2VudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSWRlbnRpdHkgZ2V0SWRlbnRpdHkoUHVibGljS2V5IGtleSk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBBZGRzIGFuIHtAY29kZSBJZGVudGl0eX0gdG8gdGhpcyB7QGNvZGUgSWRlbnRpdHlTY29wZX0uCisgICAgICogCisgICAgICogQHBhcmFtIGlkZW50aXR5CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIElkZW50aXR5fSB0byBiZSBhZGRlZC4KKyAgICAgKiBAdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBJZGVudGl0eX0gaXMgaW52YWxpZCBvciBhbiBpZGVudGl0eQorICAgICAqICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZElkZW50aXR5KElkZW50aXR5IGlkZW50aXR5KQogICAgICAgICAgICAgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBSZW1vdmVzIGFuIHtAY29kZSBJZGVudGl0eX0gZnJvbSB0aGlzIHtAY29kZSBJZGVudGl0eVNjb3BlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWRlbnRpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgSWRlbnRpdHl9IHRvIGJlIHJlbW92ZWQuCisgICAgICogQHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSBJZGVudGl0eX0gaXMgbm90IHByZXNlbnQgaW4gdGhpcyBzY29wZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVJZGVudGl0eShJZGVudGl0eSBpZGVudGl0eSkKICAgICAgICAgICAgIHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgRW51bWVyYXRpb259IG92ZXIgdGhlIHtAY29kZSBJZGVudGl0eX0gb2JqZWN0cyBpbiB0aGlzCisgICAgICoge0Bjb2RlIElkZW50aXR5U2NvcGV9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIEVudW1lcmF0aW9ufSBvdmVyIHRoZSB7QGNvZGUgSWRlbnRpdHl9IG9iamVjdHMgaW4gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIElkZW50aXR5U2NvcGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBFbnVtZXJhdGlvbjxJZGVudGl0eT4gaWRlbnRpdGllcygpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIHtAY29kZSBJZGVudGl0eVNjb3BlfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBJZGVudGl0eVNjb3BlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoIlsiKS5hcHBlbmQoc2l6ZSgpKS5hcHBlbmQoIl0iKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLmphdmEKaW5kZXggYWRmNDk0Yy4uMGQ4YTYwNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbi5qYXZhCkBAIC0yMyw0NCArMjMsNTcgQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgaW52YWxpZCBhbGdvcml0aG0gcGFyYW1ldGVycyB0byBjcnlwdG9ncmFwaGljIHNlcnZpY2VzLgorICoge0Bjb2RlIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb259IGluZGljYXRlcyB0aGUgb2NjdXJyZW5jZSBvZgorICogaW52YWxpZCBhbGdvcml0aG0gcGFyYW1ldGVycy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGV4dGVuZHMKICAgICAgICAgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLworICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI4NjQ2NzIyOTc0OTk0NzE0NzJMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb259CisgICAgICogd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZ2l2ZW4gbWVzc2FnZSBhbmQgdGhlIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBpcyB0aGUgY2F1c2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbn0KKyAgICAgKiB3aXRoIHRoZSBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIoY2F1c2UpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uLmphdmEKaW5kZXggNDVhM2IzMC4uOTVkODY0ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbi5qYXZhCkBAIC0yMyw0NiArMjMsNTUgQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBVc2VkIHdoZW4gaW52YWxpZCBjcnlwdG9ncmFwaHkga2V5cyBhcmUgdXNlZC4KKyAqIHtAY29kZSBJbnZhbGlkS2V5RXhjZXB0aW9ufSBpbmRpY2F0ZXMgZXhjZXB0aW9uYWwgY29uZGl0aW9ucywgY2F1c2VkIGJ5IGFuCisgKiBpbnZhbGlkIGtleS4KICAqIAotICogQHNlZSBUaHJvd2FibGUKLSAqIEBzZWUgRXJyb3IKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW52YWxpZEtleUV4Y2VwdGlvbiBleHRlbmRzIEtleUV4Y2VwdGlvbiB7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU2OTg0Nzk5MjA1OTMzNTk4MTZMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEludmFsaWRLZXlFeGNlcHRpb259IHdpdGggdGhlIGdpdmVuCisgICAgICogbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZEtleUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBJbnZhbGlkS2V5RXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZEtleUV4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEludmFsaWRLZXlFeGNlcHRpb259IHdpdGggdGhlIGdpdmVuCisgICAgICogbWVzc2FnZSBhbmQgdGhlIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBpcyB0aGUgY2F1c2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkS2V5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgSW52YWxpZEtleUV4Y2VwdGlvbn0gd2l0aCB0aGUgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHdoaWNoIGlzIHRoZSBjYXVzZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEludmFsaWRLZXlFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbi5qYXZhCmluZGV4IDRhZjNiOTcuLmFjMTA0NDggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0ludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24uamF2YQpAQCAtMjMsMzEgKzIzLDMxIEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYW4gaW52YWxpZCBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIGEgbWV0aG9kLgorICoge0Bjb2RlIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb259IGluZGljYXRlcyBleGNlcHRpb25hbCBjb25kaXRpb25zLCBjYXVzZWQgYnkKKyAqIGludmFsaWQgcGFyYW1ldGVycy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg1Nzk2ODUzNjkzNTY2NzgwOEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCi0gICAgICogCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb259LgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKCkgewogICAgIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXkuamF2YQppbmRleCAyODRkMWE3Li4xMzU5YWIyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleS5qYXZhCkBAIC0yNSwzNiArMjUsNDggQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBEZWZpbmVzIHRoZSBiYXNpYyBwcm9wZXJ0aWVzIG9mIGFsbCBrZXkgb2JqZWN0cy4KKyAqIHtAY29kZSBLZXl9IGlzIHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciBhbGwga2V5cy4KICAqIAogICogQHNlZSBQdWJsaWNLZXkKKyAqIEBzZWUgUHJpdmF0ZUtleQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgS2V5IGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHtAY29kZSBzZXJpYWxWZXJzaW9uVUlEfSB0byBiZSBjb21wYXRpYmxlIHdpdGggSkRLMS4xLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjYwMzM4NDE1Mjc0OTU2NzY1NEw7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gdGhhdCB0aGlzIGtleSB3aWxsIHdvcmsKLSAgICAgKiB3aXRoLiBJZiB0aGUgYWxnb3JpdGhtIGlzIHVua25vd24sIGl0IHJldHVybnMgbnVsbC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gb2YgdGhpcyBrZXkuIElmIHRoZSBhbGdvcml0aG0gaXMKKyAgICAgKiB1bmtub3duLCB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIHJlY2VpdmVyJ3MgYWxnb3JpdGhtCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIG9mIHRoaXMga2V5IG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGFsZ29yaXRobSBpcyB1bmtub3duLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmb3JtYXQgdXNlZCB0byBlbmNvZGUgdGhlIGtleSwgb3IgbnVsbAorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hdCB1c2VkIHRvIGVuY29kZSB0aGlzIGtleSwgb3Ige0Bjb2RlIG51bGx9CiAgICAgICogaWYgaXQgY2FuIG5vdCBiZSBlbmNvZGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSByZWNlaXZlcidzIGVuY29kaW5nIGZvcm1hdAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZvcm1hdCB1c2VkIHRvIGVuY29kZSB0aGlzIGtleSwgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiBpdCBjYW4gbm90IGJlIGVuY29kZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuY29kZWQgZm9ybSBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyB0aGUgZW5jb2RlZCBmb3JtIG9mIHRoaXMga2V5LCBvciB7QGNvZGUgbnVsbH0gaWYgZW5jb2RpbmcgaXMgbm90CisgICAgICogc3VwcG9ydGVkIGJ5IHRoaXMga2V5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYnl0ZVtdIHRoZSBlbmNvZGVkIGZvcm0gb2YgdGhlIHJlY2VpdmVyCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBmb3JtIG9mIHRoaXMga2V5LCBvciB7QGNvZGUgbnVsbH0gaWYgZW5jb2RpbmcgaXMgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5RXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5RXhjZXB0aW9uLmphdmEKaW5kZXggZmM4M2JjMi4uYjAxZjc1YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleUV4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlFeGNlcHRpb24uamF2YQpAQCAtMjMsNDggKzIzLDUzIEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgcHJvYmxlbXMgd2l0aAotICoga2V5cy4KKyAqIHtAY29kZSBLZXlFeGNlcHRpb259IGlzIHRoZSBjb21tb24gc3VwZXJjbGFzcyBvZiBhbGwga2V5IHJlbGF0ZWQgZXhjZXB0aW9ucy4KICAqIAotICogCi0gKiBAc2VlIFRocm93YWJsZQotICogQHNlZSBFcnJvcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBLZXlFeGNlcHRpb24gZXh0ZW5kcyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzQ4MzY3Njk0MjgxMjQzMjEwOEw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCi0gICAgICogCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5RXhjZXB0aW9ufSB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBLZXlFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5RXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5RXhjZXB0aW9uKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5RXhjZXB0aW9ufSB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlCisgICAgICogYW5kIHRoZSBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5RXhjZXB0aW9ufSB3aXRoIHRoZSBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5RmFjdG9yeS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleUZhY3RvcnkuamF2YQppbmRleCAyN2JhNmRmLi43YzQ5NjZmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5RmFjdG9yeS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlGYWN0b3J5LmphdmEKQEAgLTI4LDEyICsyOCwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAotCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiB7QGNvZGUgS2V5RmFjdG9yeX0gaXMgYW4gZW5naW5lIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhbnNsYXRlIGJldHdlZW4KKyAqIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXkgb2JqZWN0cyBhbmQgY29udmVydCBrZXlzIGJldHdlZW4gdGhlaXIgZXh0ZXJuYWwKKyAqIHJlcHJlc2VudGF0aW9uLCB0aGF0IGNhbiBiZSBlYXNpbHkgdHJhbnNwb3J0ZWQgYW5kIHRoZWlyIGludGVybmFsCisgKiByZXByZXNlbnRhdGlvbi4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIEtleUZhY3RvcnkgewogICAgIC8vIFRoZSBzZXJ2aWNlIG5hbWUuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAiS2V5RmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKQEAgLTUyLDggKzU0LDE2IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgYWxnb3JpdGhtOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlGYWN0b3J5fSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhcmd1bWVudHMuCiAgICAgICogCisgICAgICogQHBhcmFtIGtleUZhY1NwaQorICAgICAqICAgICAgICAgICAgdGhlIGNvbmNyZXRlIGtleSBmYWN0b3J5IHNlcnZpY2UuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIGFsZ29yaXRobSB0byB1c2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEtleUZhY3RvcnkoS2V5RmFjdG9yeVNwaSBrZXlGYWNTcGksIAogICAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyLApAQCAtNjQsOCArNzQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleUZhY3Rvcnl9IHRoYXQgdXRpbGl6ZXMgdGhlIHNwZWNpZmllZAorICAgICAqIGFsZ29yaXRobS4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleUZhY3Rvcnl9IHRoYXQgdXRpbGl6ZXMgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gcHJvdmlkZXIgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBLZXlGYWN0b3J5IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtNzksOCArOTcsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleUZhY3Rvcnl9IHRoYXQgdXRpbGl6ZXMgdGhlIHNwZWNpZmllZAorICAgICAqIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCiAgICAgICogCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlGYWN0b3J5fSB0aGF0IHV0aWxpemVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBwcm92aWRlciBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHByb3ZpZGVyfSBpcyB7QGNvZGUgbnVsbH0gb3IgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBLZXlGYWN0b3J5IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewpAQCAtOTUsOCArMTI3LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlGYWN0b3J5fSB0aGF0IHV0aWxpemVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgc2VjdXJpdHkgcHJvdmlkZXIuCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5RmFjdG9yeX0gdGhhdCB1dGlsaXplcyB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3ZpZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBLZXlGYWN0b3J5IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC0xMTMsMjQgKzE1NSwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIEtleUZhY3Rvcnl9LgogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBLZXlGYWN0b3J5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgS2V5RmFjdG9yeX0KKyAgICAgKiAuCiAgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBLZXlGYWN0b3J5fQorICAgICAqICAgICAgICAgLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gYWxnb3JpdGhtOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogR2VuZXJhdGVzIGEgaW5zdGFuY2Ugb2Yge0Bjb2RlIFB1YmxpY0tleX0gZnJvbSB0aGUgZ2l2ZW4ga2V5CisgICAgICogc3BlY2lmaWNhdGlvbi4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5U3BlYworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIHB1YmxpYyBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMga2V5CisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGtleVNwZWN9IGlzIGludmFsaWQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgUHVibGljS2V5IGdlbmVyYXRlUHVibGljKEtleVNwZWMga2V5U3BlYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKQEAgLTEzOCw4ICsxOTMsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIEdlbmVyYXRlcyBhIGluc3RhbmNlIG9mIHtAY29kZSBQcml2YXRlS2V5fSBmcm9tIHRoZSBnaXZlbiBrZXkKKyAgICAgKiBzcGVjaWZpY2F0aW9uLgogICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlTcGVjCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGtleVNwZWN9IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByaXZhdGVLZXkgZ2VuZXJhdGVQcml2YXRlKEtleVNwZWMga2V5U3BlYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKQEAgLTE0Nyw4ICsyMDksMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGtleSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IGZyb20gd2hpY2ggdGhlIHNwZWNpZmljYXRpb24gaXMgcmVxdWVzdGVkLgorICAgICAqIEBwYXJhbSBrZXlTcGVjCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcmVxdWVzdGVkIHtAY29kZSBLZXlTcGVjfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBrZXkgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgY2FuIG5vdCBiZSBwcm9jZXNzZWQsIG9yIHRoZSByZXF1ZXN0ZWQgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAge0Bjb2RlIEtleVNwZWN9IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIDxUIGV4dGVuZHMgS2V5U3BlYz4gVCBnZXRLZXlTcGVjKEtleSBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczxUPiBrZXlTcGVjKQpAQCAtMTU3LDggKzIyOCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVHJhbnNsYXRlcyB0aGUgZ2l2ZW4ga2V5IGludG8gYSBrZXkgZnJvbSB0aGlzIGtleSBmYWN0b3J5LgogICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdG8gdHJhbnNsYXRlLgorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zbGF0ZWQga2V5LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNhbiBub3QgYmUgdHJhbnNsYXRlZCBieSB0aGlzIGtleQorICAgICAqICAgICAgICAgICAgIGZhY3RvcnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEtleSB0cmFuc2xhdGVLZXkoS2V5IGtleSkKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlGYWN0b3J5U3BpLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5RmFjdG9yeVNwaS5qYXZhCmluZGV4IGVlN2E4NjEuLjdkMzE1NGUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlGYWN0b3J5U3BpLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleUZhY3RvcnlTcGkuamF2YQpAQCAtMjUsMzkgKzI1LDcwIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOwogCi0KIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIHtAY29kZSBLZXlGYWN0b3J5U3BpfSBpcyB0aGUgU2VydmljZSBQcm92aWRlciBJbnRlcmZhY2UgKFNQSSkgZGVmaW5pdGlvbiBmb3IKKyAqIHtAbGluayBLZXlGYWN0b3J5fS4KICAqIAorICogQHNlZSBLZXlGYWN0b3J5CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgS2V5RmFjdG9yeVNwaSB7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBHZW5lcmF0ZXMgYSBpbnN0YW5jZSBvZiB7QGNvZGUgUHVibGljS2V5fSBmcm9tIHRoZSBnaXZlbiBrZXkKKyAgICAgKiBzcGVjaWZpY2F0aW9uLgogICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlTcGVjCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHVibGljIGtleS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMga2V5LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBrZXlTcGVjfSBpcyBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQdWJsaWNLZXkgZW5naW5lR2VuZXJhdGVQdWJsaWMoS2V5U3BlYyBrZXlTcGVjKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIEdlbmVyYXRlcyBhIGluc3RhbmNlIG9mIHtAY29kZSBQcml2YXRlS2V5fSBmcm9tIHRoZSBnaXZlbiBrZXkKKyAgICAgKiBzcGVjaWZpY2F0aW9uLgogICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlTcGVjCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGtleVNwZWN9IGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFByaXZhdGVLZXkgZW5naW5lR2VuZXJhdGVQcml2YXRlKEtleVNwZWMga2V5U3BlYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGtleSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IGZyb20gd2hpY2ggdGhlIHNwZWNpZmljYXRpb24gaXMgcmVxdWVzdGVkLgorICAgICAqIEBwYXJhbSBrZXlTcGVjCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcmVxdWVzdGVkIHtAY29kZSBLZXlTcGVjfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBrZXkgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgY2FuIG5vdCBiZSBwcm9jZXNzZWQsIG9yIHRoZSByZXF1ZXN0ZWQgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAge0Bjb2RlIEtleVNwZWN9IGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IDxUIGV4dGVuZHMgS2V5U3BlYz4gVCBlbmdpbmVHZXRLZXlTcGVjKEtleSBrZXksIENsYXNzPFQ+IGtleVNwZWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb247CiAgICAgLy9GSVhNRSAxLjUgc2lnbmF0dXJlOiBwcm90ZWN0ZWQgYWJzdHJhY3QgPFQgZXh0ZW5kcyBLZXlTcGVjPiBUIGVuZ2luZUdldEtleVNwZWMoS2V5IGtleSwgQ2xhc3M8VD4ga2V5U3BlYykgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUcmFuc2xhdGVzIHRoZSBnaXZlbiBrZXkgaW50byBhIGtleSBmcm9tIHRoaXMga2V5IGZhY3RvcnkuCiAgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSB0byB0cmFuc2xhdGUuCisgICAgICogQHJldHVybiB0aGUgdHJhbnNsYXRlZCBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgY2FuIG5vdCBiZSB0cmFuc2xhdGVkIGJ5IHRoaXMga2V5CisgICAgICogICAgICAgICAgICAgZmFjdG9yeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgS2V5IGVuZ2luZVRyYW5zbGF0ZUtleShLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEKaW5kZXggYWM3ZTcwYS4uMjk1ZWMwMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhCkBAIC0yMywzOCArMjMsNTYgQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIEtleU1hbmFnZW1lbnRFeGNlcHRpb259IGlzIGEgZ2VuZXJhbCBleGNlcHRpb24sIHRocm93biB0byBpbmRpY2F0ZSBhbgorICogZXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nIGFuIG9wZXJhdGlvbiBjb25jZXJuaW5nIGtleSBtYW5hZ2VtZW50LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBLZXlFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5NDc2NzQyMTYxNTcwNjI2OTVMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlNYW5hZ2VtZW50RXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlNYW5hZ2VtZW50RXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleU1hbmFnZW1lbnRFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZ2l2ZW4gbWVzc2FnZSBhbmQgdGhlIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBpcyB0aGUgY2F1c2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIoY2F1c2UpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVBhaXIuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlQYWlyLmphdmEKaW5kZXggNDkzNjI1OS4uNjM5OTQyNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVBhaXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5UGFpci5qYXZhCkBAIC0yNSwxOSArMjUsMjggQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIEtleVBhaXJ9IGlzIGEgY29udGFpbmVyIGZvciBhIHB1YmxpYyBrZXkgYW5kIGEgcHJpdmF0ZSBrZXkuIFNpbmNlIHRoZQorICogcHJpdmF0ZSBrZXkgY2FuIGJlIGFjY2Vzc2VkLCBpbnN0YW5jZXMgbXVzdCBiZSB0cmVhdGVkIGxpa2UgYSBwcml2YXRlIGtleS4KICAqIAorICogQHNlZSBQcml2YXRlS2V5CisgKiBAc2VlIFB1YmxpY0tleQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBLZXlQYWlyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc1NjUxODk1MDIyNjgwMDk4MzdMOwogICAgIHByaXZhdGUgZmluYWwgUHJpdmF0ZUtleSBwcml2YXRlS2V5OwogICAgIHByaXZhdGUgZmluYWwgUHVibGljS2V5IHB1YmxpY0tleTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5UGFpcn0gd2l0aCBhIHB1YmxpYyBrZXkgYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgcHJpdmF0ZSBrZXkuCisgICAgICogCisgICAgICogQHBhcmFtIHB1YmxpY0tleQorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyBrZXkuCisgICAgICogQHBhcmFtIHByaXZhdGVLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5UGFpcihQdWJsaWNLZXkgcHVibGljS2V5LCBQcml2YXRlS2V5IHByaXZhdGVLZXkpIHsKICAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gcHJpdmF0ZUtleTsKQEAgLTQ1LDE0ICs1NCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaXZhdGVLZXkgZ2V0UHJpdmF0ZSgpIHsKICAgICAgICAgcmV0dXJuIHByaXZhdGVLZXk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMga2V5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFB1YmxpY0tleSBnZXRQdWJsaWMoKSB7CiAgICAgICAgIHJldHVybiBwdWJsaWNLZXk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvci5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3IuamF2YQppbmRleCBlOWZlMGM0Li41NjgyYWEyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvci5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yLmphdmEKQEAgLTI5LDkgKzI5LDEyIEBACiAKIAogLyoqCisgKiB7QGNvZGUgS2V5UGFpckdlbmVyYXRvcn0gaXMgYW4gZW5naW5lIGNsYXNzIHdoaWNoIGlzIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBhCisgKiBwcml2YXRlIGtleSBhbmQgaXRzIHJlbGF0ZWQgcHVibGljIGtleSB1dGlsaXppbmcgdGhlIGFsZ29yaXRobSBpdCB3YXMKKyAqIGluaXRpYWxpemVkIHdpdGguCiAgKiAKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKKyAqIEBzZWUgS2V5UGFpckdlbmVyYXRvclNwaQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBLZXlQYWlyR2VuZXJhdG9yIGV4dGVuZHMgS2V5UGFpckdlbmVyYXRvclNwaSB7CiAKQEAgLTUxLDI1ICs1NCwzOSBAQAogICAgIHByaXZhdGUgU3RyaW5nIGFsZ29yaXRobTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3J9IHdpdGggdGhlIG5hbWUgb2YKKyAgICAgKiB0aGUgYWxnb3JpdGhtIHRvIHVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhbGdvcml0aG0gdG8gdXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEtleVBhaXJHZW5lcmF0b3IoU3RyaW5nIGFsZ29yaXRobSkgewogICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gb2YgdGhpcyB7QGNvZGUgS2V5UGFpckdlbmVyYXRvcn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIG9mIHRoaXMge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3J9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlQYWlyR2VuZXJhdG9yfSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqIHNwZWNpZmllZCBhbGdvcml0aG0uCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIHRvIHVzZQorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3J9IHRoYXQgdXRpbGl6ZXMgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgYWxnb3JpdGhtCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEtleVBhaXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtOTMsMTAgKzExMCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5UGFpckdlbmVyYXRvcn0gdGhhdCB1dGlsaXplcyB0aGUKKyAgICAgKiBzcGVjaWZpZWQgYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYWxnb3JpdGhtIGlzIG51bGwgKGluc3RlYWQgb2YKLSAgICAgKiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24pIGFzIGluIDEuNCByZWxlYXNlCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlcgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3J9IHRoYXQgdXRpbGl6ZXMgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlcgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEtleVBhaXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewpAQCAtMTEyLDEwICsxMzksMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3J9IHRoYXQgdXRpbGl6ZXMgdGhlCisgICAgICogc3BlY2lmaWVkIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFsZ29yaXRobSBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uKSBhcyBpbiAxLjQgcmVsZWFzZQorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gdG8gdXNlCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlQYWlyR2VuZXJhdG9yfSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgS2V5UGFpckdlbmVyYXRvciBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTQyLDI0ICsxNzgsMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgS2V5UGFpckdlbmVyYXRvcn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3J9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5UGFpckdlbmVyYXRvcn0gd2l0aCB0aGUgZ2l2ZW4ga2V5IHNpemUuIFRoZQorICAgICAqIGRlZmF1bHQgcGFyYW1ldGVyIHNldCBhbmQgYSBkZWZhdWx0IHtAY29kZSBTZWN1cmVSYW5kb219IGluc3RhbmNlIHdpbGwgYmUKKyAgICAgKiB1c2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUga2V5IChudW1iZXIgb2YgYml0cykKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGludCBrZXlzaXplKSB7CiAgICAgICAgIGluaXRpYWxpemUoa2V5c2l6ZSwgcmFuZG9tKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBLZXlQYWlyR2VuZXJhdG9yfSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUKKyAgICAgKiBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfS4gQSBkZWZhdWx0IHtAY29kZSBTZWN1cmVSYW5kb219IGluc3RhbmNlIHdpbGwgYmUKKyAgICAgKiB1c2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgdG8gdXNlCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpAQCAtMTY3LDI3ICsyMTcsNTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bmlxdWUge0Bjb2RlIEtleVBhaXJ9IGVhY2ggdGltZSB0aGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcyB7QGxpbmsgI2dlbmVyYXRlS2V5UGFpcigpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgbmV3IHVuaXF1ZSB7QGNvZGUgS2V5UGFpcn0gZWFjaCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBLZXlQYWlyIGdlbktleVBhaXIoKSB7CiAgICAgICAgIHJldHVybiBnZW5lcmF0ZUtleVBhaXIoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bmlxdWUge0Bjb2RlIEtleVBhaXJ9IGVhY2ggdGltZSB0aGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcyB7QGxpbmsgI2dlbktleVBhaXIoKX0uCisgICAgICogCisgICAgICogQHJldHVybiBhIG5ldyB1bmlxdWUge0Bjb2RlIEtleVBhaXJ9IGVhY2ggdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgS2V5UGFpciBnZW5lcmF0ZUtleVBhaXIoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3J9IHdpdGggdGhlIGdpdmVuIGtleSBzaXplIGFuZCB0aGUKKyAgICAgKiBnaXZlbiB7QGNvZGUgU2VjdXJlUmFuZG9tfS4gVGhlIGRlZmF1bHQgcGFyYW1ldGVyIHNldCB3aWxsIGJlIHVzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGtleXNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgc2l6ZQorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgcmFuZG9tbmVzcworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoaW50IGtleXNpemUsIFNlY3VyZVJhbmRvbSByYW5kb20pIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBLZXlQYWlyR2VuZXJhdG9yfSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUKKyAgICAgKiBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfSBhbmQgdGhlIGdpdmVuIHtAY29kZSBTZWN1cmVSYW5kb219LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgdG8gdXNlCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiByYW5kb21uZXNzCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtLCBTZWN1cmVSYW5kb20gcmFuZG9tKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3JTcGkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yU3BpLmphdmEKaW5kZXggOGU1MTM2Ny4uMjcyYzMwNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3JTcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvclNwaS5qYXZhCkBAIC0yNywzMyArMjcsNTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiB7QGNvZGUgS2V5UGFpckdlbmVyYXRvclNwaX0gaXMgdGhlIFNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlIChTUEkpCisgKiBkZWZpbml0aW9uIGZvciB7QGxpbmsgS2V5UGFpckdlbmVyYXRvcn0uCiAgKiAKKyAqIEBzZWUgS2V5UGFpckdlbmVyYXRvcgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGFic3RyYWN0IGNsYXNzIEtleVBhaXJHZW5lcmF0b3JTcGkgeworICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVBhaXJHZW5lcmF0b3JTcGl9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBLZXlQYWlyR2VuZXJhdG9yU3BpKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbmV3IHVuaXF1ZSB7QGNvZGUgS2V5UGFpcn0gZWFjaCB0aW1lIHRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBuZXcgdW5pcXVlIHtAY29kZSBLZXlQYWlyfSBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBLZXlQYWlyIGdlbmVyYXRlS2V5UGFpcigpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5UGFpckdlbmVyYXRvclNwaX0gd2l0aCB0aGUgZ2l2ZW4ga2V5IHNpemUgYW5kCisgICAgICogdGhlIGdpdmVuIHtAY29kZSBTZWN1cmVSYW5kb219LiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXIgc2V0IHdpbGwgYmUgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5c2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBzaXplIChudW1iZXIgb2YgYml0cykuCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiByYW5kb21uZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemUoaW50IGtleXNpemUsIFNlY3VyZVJhbmRvbSByYW5kb20pOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5UGFpckdlbmVyYXRvclNwaX0gd2l0aCB0aGUgZ2l2ZW4ge0Bjb2RlCisgICAgICogQWxnb3JpdGhtUGFyYW1ldGVyU3BlY30gYW5kIHRoZSBnaXZlbiB7QGNvZGUgU2VjdXJlUmFuZG9tfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyB0byB1c2UuCisgICAgICogQHBhcmFtIHJhbmRvbQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiByYW5kb21uZXNzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVJlcC5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVJlcC5qYXZhCmluZGV4IDk1N2ZkYWMuLmVjMWQzNjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlSZXAuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5UmVwLmphdmEKQEAgLTM2LDEzICszNiwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIHtAY29kZSBLZXlSZXB9IGlzIGEgc3RhbmRhcmRpemVkIHJlcHJlc2VudGF0aW9uIGZvciBzZXJpYWxpemVkIHtAbGluayBLZXl9CisgKiBvYmplY3RzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEtleVJlcCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NzU3NjgzODk4ODMwNjQxODUzTDsKICAgICAvLyBLZXkgdHlwZQogICAgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOwpAQCAtNTQsNyArNTQsMjMgQEAKICAgICBwcml2YXRlIGJ5dGVbXSBlbmNvZGVkOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlSZXB9IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCisgICAgICogVGhlIGFyZ3VtZW50cyBzaG91bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUge0Bjb2RlIEtleX0gb2JqZWN0IHRoYXQgaGFzIHRvCisgICAgICogYmUgc2VyaWFsaXplZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtIChvYnRhaW5lZCBieSB7QGxpbmsgS2V5I2dldEFsZ29yaXRobSgpfSkuCisgICAgICogQHBhcmFtIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBvZiB0aGUga2V5IChvYnRhaW5lZCBieSB7QGxpbmsgS2V5I2dldEZvcm1hdCgpfSkuCisgICAgICogQHBhcmFtIGVuY29kZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIHtAY29kZSBieXRlW119IChvYnRhaW5lZCBieQorICAgICAqICAgICAgICAgICAge0BsaW5rIEtleSNnZXRFbmNvZGVkKCl9KS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHR5cGUsIGFsZ29yaXRobSwgZm9ybWF0IG9yIGVuY29kZWR9IGlzIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgICAgIC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5UmVwKFR5cGUgdHlwZSwKICAgICAgICAgICAgIFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBmb3JtYXQsIGJ5dGVbXSBlbmNvZGVkKSB7CkBAIC03Nyw3ICs5MywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIHtAY29kZSBLZXl9IG9iamVjdC4gVGhyZWUge0BsaW5rIFR5cGV9fGZvcm1hdAorICAgICAqIGNvbWJpbmF0aW9ucyBhcmUgc3VwcG9ydGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAY29kZSBUeXBlLlBSSVZBVEV9IHwgIlBLQ1MjOCIgOiByZXR1cm5zIGEge0BsaW5rIFByaXZhdGVLZXl9CisgICAgICogaW5zdGFuY2UsIGdlbmVyYXRlZCBmcm9tIGEga2V5IGZhY3RvcnkgKHN1aXRhYmxlIGZvciB0aGUgYWxnb3JpdGhtKSB0aGF0CisgICAgICogaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIHtAbGluayBQS0NTOEVuY29kZWRLZXlTcGVjfSB1c2luZyB0aGUgZW5jb2RlZCBrZXkKKyAgICAgKiBieXRlcy4KKyAgICAgKiA8bGk+IHtAY29kZSBUeXBlLlNFQ1JFVH0gfCAiUkFXIiA6IHJldHVybnMgYSB7QGxpbmsgU2VjcmV0S2V5U3BlY30KKyAgICAgKiBpbnN0YW5jZSwgY3JlYXRlZCB3aXRoIHRoZSBlbmNvZGVkIGtleSBieXRlcyBhbmQgdGhlIGFsZ29yaXRobS4KKyAgICAgKiA8bGk+IHtAY29kZSBUeXBlLlBVQkxJQ30gfCAiWC41MDkiOiByZXR1cm5zIGEge0BsaW5rIFB1YmxpY0tleX0gaW5zdGFuY2UsCisgICAgICogZ2VuZXJhdGVkIGZyb20gYSBrZXkgZmFjdG9yeSAoc3VpdGFibGUgZm9yIHRoZSBhbGdvcml0aG0pIHRoYXQgaXMKKyAgICAgKiBpbml0aWFsaXplZCB3aXRoIGEge0BsaW5rIFg1MDlFbmNvZGVkS2V5U3BlY30gdXNpbmcgdGhlIGVuY29kZWQga2V5CisgICAgICogYnl0ZXMuCisgICAgICogPC91bD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB7QGNvZGUgS2V5fSBvYmplY3QuCisgICAgICogQHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIFR5cGV9fGZvcm1hdCBjb21iaW5hdGlvbiBpcyBub3QgcmVjb2duaXplZCwgb3IKKyAgICAgKiAgICAgICAgICAgICB0aGUgcmVzb2x1dGlvbiBvZiBhbnkga2V5IHBhcmFtZXRlciBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCAodHlwZSkgewpAQCAtMTM4LDExICsxNzMsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdXBwb3J0ZWQga2V5IHR5cGVzCisgICAgICoge0Bjb2RlIFR5cGV9IGVudW1lcmF0ZXMgdGhlIHN1cHBvcnRlZCBrZXkgdHlwZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUgeworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR5cGUgZm9yIHNlY3JldCBrZXlzLgorICAgICAgICAgKi8KICAgICAgICAgU0VDUkVULAorICAgICAgICAvKioKKyAgICAgICAgICogVHlwZSBmb3IgcHVibGljIGtleXMuCisgICAgICAgICAqLwogICAgICAgICBQVUJMSUMsCisgICAgICAgIC8qKgorICAgICAgICAgKiBUeXBlIGZvciBwcml2YXRlIGtleXMuCisgICAgICAgICAqLwogICAgICAgICBQUklWQVRFCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVN0b3JlLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUuamF2YQppbmRleCA5YTY2OTlmLi44ODdjYmVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUuamF2YQpAQCAtNDIsNiArNDIsMTkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAKKy8qKgorICoge0Bjb2RlIEtleVN0b3JlfSBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgY3J5cHRvZ3JhcGhpYyBrZXlzIGFuZCB0aGVpcgorICogb3duZXJzLgorICogPHA+CisgKiBUaGUgdHlwZSBvZiB0aGUgc3lzdGVtIGtleSBzdG9yZSBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIHRoZSB7QGNvZGUgCisgKiAna2V5c3RvcmUudHlwZSd9IHByb3BlcnR5IGluIHRoZSBmaWxlIG5hbWVkIHtAY29kZQorICogSkFWQV9IT01FL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5fS4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBDZXJ0aWZpY2F0ZQorICogQHNlZSBQcml2YXRlS2V5CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEtleVN0b3JlIHsKIAogICAgIC8vIFN0b3JlIEtleVN0b3JlIFNFUlZJQ0UgbmFtZQpAQCAtNzMsNiArODYsMTcgQEAKICAgICAvLyBTdG9yZSB1c2VkIHR5cGUKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOwogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5U3RvcmV9IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb25jcmV0ZSBrZXkgc3RvcmUuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB7QGNvZGUgS2V5U3RvcmV9IHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBLZXlTdG9yZShLZXlTdG9yZVNwaSBrZXlTdG9yZVNwaSwgUHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyB0eXBlKSB7CiAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKQEAgLTkxLDkgKzExNSwyMCBAQAogICAgICAgICB0aHJvdyBuZXcgS2V5U3RvcmVFeGNlcHRpb24oTk9USU5JVEtFWVNUT1JFKTsKICAgICB9CiAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKLSAgICAKKwogICAgIC8qKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5U3RvcmV9IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQge0Bjb2RlIEtleVN0b3JlfS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlTdG9yZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIG5ldyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBLZXlTdG9yZX0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0eXBlfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNlZSAjZ2V0RGVmYXVsdFR5cGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEtleVN0b3JlIGdldEluc3RhbmNlKFN0cmluZyB0eXBlKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewogICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CkBAIC0xMTAsMTAgKzE0NSwyNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVN0b3JlfSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiB0eXBlLgogICAgICAqIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uKSBhcyBpbiAxLjQgcmVsZWFzZQorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQge0Bjb2RlIEtleVN0b3JlfS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHByb3ZpZGVyIG9mIHRoZSB7QGNvZGUgS2V5U3RvcmV9LgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVN0b3JlfSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIKKyAgICAgKiAgICAgICAgIHdpdGggdGhlIGdpdmVuIHR5cGUuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIG5ldyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBLZXlTdG9yZX0uCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwcm92aWRlcn0gaXMge0Bjb2RlIG51bGx9IG9yIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICogQHNlZSAjZ2V0RGVmYXVsdFR5cGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEtleVN0b3JlIGdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBTdHJpbmcgcHJvdmlkZXIpCiAgICAgICAgICAgICB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKQEAgLTEzMiwxMCArMTgxLDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5U3RvcmV9IGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlcgorICAgICAqIHdpdGggdGhlIGdpdmVuIHR5cGUuCiAgICAgICogCi0gICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbikgYXMgaW4gMS40IHJlbGVhc2UKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIHtAY29kZSBLZXlTdG9yZX0uCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgdGhlIHtAY29kZSBLZXlTdG9yZX0uCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5U3RvcmV9IGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlcgorICAgICAqICAgICAgICAgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgbmV3IHtAY29kZQorICAgICAqICAgICAgICAgICAgIEtleVN0b3JlfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwcm92aWRlcn0gaXMge0Bjb2RlIG51bGx9IG9yIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICogQHNlZSAjZ2V0RGVmYXVsdFR5cGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEtleVN0b3JlIGdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBQcm92aWRlciBwcm92aWRlcikKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CkBAIC0xNTksOCArMjIwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB0eXBlIGZvciB7QGNvZGUgS2V5U3RvcmV9IGluc3RhbmNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHtAY29kZSAna2V5c3RvcmUudHlwZSd9IHByb3BlcnR5IGluIHRoZQorICAgICAqIGZpbGUgbmFtZWQge0Bjb2RlIEpBVkFfSE9NRS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eX0uIElmIHRoaXMgcHJvcGVydHkKKyAgICAgKiBpcyBub3Qgc2V0LCB7QGNvZGUgImprcyJ9IHdpbGwgYmUgdXNlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogIAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdHlwZSBmb3Ige0Bjb2RlIEtleVN0b3JlfSBpbnN0YW5jZXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKICAgICAgICAgU3RyaW5nIGR0ID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCkBAIC0xNzQsMjQgKzI0Miw0MiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBLZXlTdG9yZX0uCiAgICAgICogCi0gICAgICogIAorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBLZXlTdG9yZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHtAY29kZSBLZXlTdG9yZX0uCiAgICAgICogCi0gICAgICogIAorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyB7QGNvZGUgS2V5U3RvcmV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUga2V5IHdpdGggdGhlIGdpdmVuIGFsaWFzLCB1c2luZyB0aGUgcGFzc3dvcmQgdG8gcmVjb3ZlciB0aGUKKyAgICAgKiBrZXkgZnJvbSB0aGUgc3RvcmUuCiAgICAgICogCi0gICAgICogIAorICAgICAqIEBwYXJhbSBhbGlhcworICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIGZvciB0aGUgZW50cnkuCisgICAgICogQHBhcmFtIHBhc3N3b3JkCisgICAgICogICAgICAgICAgICB0aGUgcGFzc3dvcmQgdXNlZCB0byByZWNvdmVyIHRoZSBrZXkuCisgICAgICogQHJldHVybiB0aGUga2V5IHdpdGggdGhlIHNwZWNpZmllZCBhbGlhcywgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIGFsaWFzIGlzIG5vdCBib3VuZCB0byBhbiBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhbGdvcml0aG0gZm9yIHJlY292ZXJpbmcgdGhlIGtleSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgY2FuIG5vdCBiZSByZWNvdmVyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEtleSBnZXRLZXkoU3RyaW5nIGFsaWFzLCBjaGFyW10gcGFzc3dvcmQpCiAgICAgICAgICAgICB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKQEAgLTIwNSw4ICsyOTEsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBmb3IgdGhlIGVudHJ5IHdpdGggdGhlIGdpdmVuIGFsaWFzLgogICAgICAqIAotICAgICAqICAKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGVudHJ5LgorICAgICAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRlIGNoYWluIGZvciB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gYWxpYXMsIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgdGhlIHNwZWNpZmllZCBhbGlhcyBpcyBub3QgYm91bmQgdG8gYW4gZW50cnkuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENlcnRpZmljYXRlW10gZ2V0Q2VydGlmaWNhdGVDaGFpbihTdHJpbmcgYWxpYXMpCiAgICAgICAgICAgICB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewpAQCAtMjE5LDggKzMxMiwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGUgZm9yIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiBhbGlhcy4KICAgICAgKiAKLSAgICAgKiAgCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBlbnRyeS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlIGZvciB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gYWxpYXMsIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgdGhlIHNwZWNpZmllZCBhbGlhcyBpcyBub3QgYm91bmQgdG8gYW4gZW50cnkuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKFN0cmluZyBhbGlhcykKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CkBAIC0yMzMsOCArMzMzLDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gYWxpYXMuCiAgICAgICogCi0gICAgICogIAorICAgICAqIEBwYXJhbSBhbGlhcworICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIGZvciB0aGUgZW50cnkuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRpb24gZGF0ZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBzcGVjaWZpZWQgYWxpYXMgaXMgbm90CisgICAgICogICAgICAgICBib3VuZCB0byBhbiBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgRGF0ZSBnZXRDcmVhdGlvbkRhdGUoU3RyaW5nIGFsaWFzKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewogICAgICAgICBpZiAoIWlzSW5pdCkgewpAQCAtMjQ2LDEyICszNTMsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHRoZSBnaXZlbiBhbGlhcyB3aXRoIHRoZSBrZXksIHBhc3N3b3JkIGFuZCBjZXJ0aWZpY2F0ZSBjaGFpbi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGFsaWFzIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIHJlYXNzaWduZWQuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIAotICAgICAqIDEuNC4yIGFuZCAxLjUgcmVsZWFzZXMgdGhyb3cgdW5zcGVjaWZpZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQotICAgICAqIHdoZW4gYWxpYXMgaXMgbnVsbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLSB3aGVuIHBhc3N3b3JkIGlzIG51bGwKLSAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLSB3aGVuIGtleSBpcyBpbnN0YW5jZSBvZiBQcml2YXRlS2V5IGFuZCBjaGFpbgotICAgICAqIGlzIG51bGwgb3IgZW1wdHkKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5LgorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkLgorICAgICAqIEBwYXJhbSBjaGFpbgorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIGNoYWluLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBLZXlTdG9yZX0gaXMgbm90IGluaXRpYWxpemVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGtleX0gaXMgYSB7QGNvZGUgUHJpdmF0ZUtleX0gYW5kIHtAY29kZSBjaGFpbn0gZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBjb250YWluIGFueSBjZXJ0aWZpY2F0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0S2V5RW50cnkoU3RyaW5nIGFsaWFzLCBLZXkga2V5LCBjaGFyW10gcGFzc3dvcmQsCiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNoYWluKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewpAQCAtMjcxLDggKzM5MSwyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFzc29jaWF0ZXMgdGhlIGdpdmVuIGFsaWFzIHdpdGggYSBrZXkgYW5kIGEgY2VydGlmaWNhdGUgY2hhaW4uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBhbGlhcyBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZWFzc2lnbmVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIHtAY29kZSBLZXlTdG9yZX0gaXMgb2YgdHlwZSB7QGNvZGUgImprcyJ9LCB7QGNvZGUga2V5fSBtdXN0IGJlCisgICAgICogZW5jb2RlZCBjb25mb3JtIHRvIHRoZSBQS1MjOCBzdGFuZGFyZCBhcyBhbgorICAgICAqIHtAbGluayBqYXZheC5jcnlwdG8uRW5jcnlwdGVkUHJpdmF0ZUtleUluZm99LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiAgCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBrZXkuCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBpbiBhbiBlbmNvZGVkIGZvcm1hdC4KKyAgICAgKiBAcGFyYW0gY2hhaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBrZXl9IGlzIGEge0Bjb2RlIFByaXZhdGVLZXl9IGFuZCB7QGNvZGUgY2hhaW59CisgICAgICogICAgICAgICAgICAgZG9lcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRLZXlFbnRyeShTdHJpbmcgYWxpYXMsIGJ5dGVbXSBrZXksIENlcnRpZmljYXRlW10gY2hhaW4pCiAgICAgICAgICAgICB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewpAQCAtMjg1LDEwICs0MjUsMjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHRoZSBnaXZlbiBhbGlhcyB3aXRoIGEgY2VydGlmaWNhdGUuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBhbGlhcyBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZWFzc2lnbmVkLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAxLjQuMiBhbmQgMS41IHJlbGVhc2VzIHRocm93IHVuc3BlY2lmaWVkIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogd2hlbiBhbGlhcyBpcyBudWxsCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAcGFyYW0gY2VydAorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBLZXlTdG9yZX0gaXMgbm90IGluaXRpYWxpemVkLCBvciBhbiBleGlzdGluZworICAgICAqICAgICAgICAgICAgIGFsaWFzIGlzIG5vdCBhc3NvY2lhdGVkIHRvIGFuIGVudHJ5IGNvbnRhaW5pbmcgYSB0cnVzdGVkCisgICAgICogICAgICAgICAgICAgY2VydGlmaWNhdGUsIG9yIHRoaXMgbWV0aG9kIGZhaWxzIGZvciBhbnkgb3RoZXIgcmVhc29uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENlcnRpZmljYXRlRW50cnkoU3RyaW5nIGFsaWFzLCBDZXJ0aWZpY2F0ZSBjZXJ0KQogICAgICAgICAgICAgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKQEAgLTMwMSwyNCArNDUxLDM0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRGVsZXRlcyB0aGUgZW50cnkgaWRlbnRpZmllZCB3aXRoIHRoZSBnaXZlbiBhbGlhcyBmcm9tIHRoaXMge0Bjb2RlCisgICAgICogS2V5U3RvcmV9LgogICAgICAqIAotICAgICAqIAotICAgICAqIDEuNC4yIGFuZCAxLjUgcmVsZWFzZXMgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGlhcyBpcyBudWxsCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGlzIG5vdCBpbml0aWFsaXplZCwgb3IgaWYgdGhlIGVudHJ5CisgICAgICogICAgICAgICAgICAgY2FuIG5vdCBiZSBkZWxldGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlbGV0ZUVudHJ5KFN0cmluZyBhbGlhcykgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGlmICghaXNJbml0KSB7Ci0gICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIHRocm93Tm90SW5pdGlhbGl6ZWQoKTsKLSAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQotICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygic2VjdXJpdHkuM0YiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGltcGxTcGkuZW5naW5lRGVsZXRlRW50cnkoYWxpYXMpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIEVudW1lcmF0aW9ufSBvdmVyIGFsbCBhbGlhcyBuYW1lcyBzdG9yZWQgaW4gdGhpcworICAgICAqIHtAY29kZSBLZXlTdG9yZX0uCiAgICAgICogCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgRW51bWVyYXRpb259IG92ZXIgYWxsIGFsaWFzIG5hbWVzIHN0b3JlZCBpbiB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgS2V5U3RvcmV9LgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBLZXlTdG9yZX0gaXMgbm90IGluaXRpYWxpemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IGFsaWFzZXMoKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewogICAgICAgICBpZiAoIWlzSW5pdCkgewpAQCAtMzMwLDEwICs0OTAsMTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gYWxpYXMgaXMgcHJlc2VudCBpbiB0aGlzIHtAY29kZSBLZXlTdG9yZX0uCiAgICAgICogCi0gICAgICogCi0gICAgICogMS40LjIgYW5kIDEuNSByZWxlYXNlcyB0aHJvdyB1bnNwZWNpZmllZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuCi0gICAgICogYWxpYXMgaXMgbnVsbAorICAgICAqIEBwYXJhbSBhbGlhcworICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIG9mIGFuIGVudHJ5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhbGlhcyBleGlzdHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBLZXlTdG9yZX0gaXMgbm90IGluaXRpYWxpemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvbnRhaW5zQWxpYXMoU3RyaW5nIGFsaWFzKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewogICAgICAgICBpZiAoIWlzSW5pdCkgewpAQCAtMzQ4LDggKzUxMiwxMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIHN0b3JlZCBpbiB0aGlzIHtAY29kZSBLZXlTdG9yZX0uCiAgICAgICogCi0gICAgICogIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIHN0b3JlZCBpbiB0aGlzIHtAY29kZSBLZXlTdG9yZX0uCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBzaXplKCkgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc0luaXQpIHsKQEAgLTM2MSw0NSArNTI5LDU4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhbGlhcyBpcyBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIGEKKyAgICAgKiB7QGxpbmsgUHJpdmF0ZUtleUVudHJ5fSBvciBhIHtAbGluayBTZWNyZXRLZXlFbnRyeX0uCiAgICAgICogCi0gICAgICogCi0gICAgICogamRrMS40LjIgYW5kIDEuNSByZWxlYXNlcyB0aHJvdyB1bnNwZWNpZmllZCBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqIHdoZW4gYWxpYXMgaXMgbnVsbAorICAgICAqIEBwYXJhbSBhbGlhcworICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIG9mIGFuIGVudHJ5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBhbGlhcyBpcyBhc3NvY2lhdGVkIHdpdGggYSBrZXkgZW50cnkuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNLZXlFbnRyeShTdHJpbmcgYWxpYXMpIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpZiAoIWlzSW5pdCkgewotICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB0aHJvd05vdEluaXRpYWxpemVkKCk7Ci0gICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KLSAgICAgICAgaWYgKGFsaWFzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoInNlY3VyaXR5LjNGIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gaW1wbFNwaS5lbmdpbmVJc0tleUVudHJ5KGFsaWFzKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGFsaWFzIGlzIGFzc29jaWF0ZWQgd2l0aCBhCisgICAgICoge0BsaW5rIFRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5fS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBqZGsxLjQuMiBhbmQgMS41IHJlbGVhc2VzIHRocm93IHVuc3BlY2lmaWVkIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogd2hlbiBhbGlhcyBpcyBudWxsCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgb2YgYW4gZW50cnkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGFsaWFzIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRpZmljYXRlCisgICAgICogICAgICAgICBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NlcnRpZmljYXRlRW50cnkoU3RyaW5nIGFsaWFzKQogICAgICAgICAgICAgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGlmICghaXNJbml0KSB7Ci0gICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIHRocm93Tm90SW5pdGlhbGl6ZWQoKTsKLSAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQotICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygic2VjdXJpdHkuM0YiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBpbXBsU3BpLmVuZ2luZUlzQ2VydGlmaWNhdGVFbnRyeShhbGlhcyk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxpYXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBlbnRyeSB3aG9zZSBjZXJ0aWZpY2F0ZQorICAgICAqIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBjZXJ0aWZpY2F0ZS4KICAgICAgKiAKLSAgICAgKiAgCisgICAgICogQHBhcmFtIGNlcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSB0byBmaW5kIHRoZSBhc3NvY2lhdGVkIGVudHJ5J3MgYWxpYXMgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIGFsaWFzIG9yIHtAY29kZSBudWxsfSBpZiBubyBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGNlcnRpZmljYXRlIGNhbiBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldENlcnRpZmljYXRlQWxpYXMoQ2VydGlmaWNhdGUgY2VydCkKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CkBAIC00MTIsOSArNTkzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogV3JpdGVzIHRoaXMge0Bjb2RlIEtleVN0b3JlfSB0byB0aGUgc3BlY2lmaWVkIHtAY29kZSBPdXRwdXRTdHJlYW19LiBUaGUKKyAgICAgKiBkYXRhIHdyaXR0ZW4gdG8gdGhlIHtAY29kZSBPdXRwdXRTdHJlYW19IGlzIHByb3RlY3RlZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICogcGFzc3dvcmQuCiAgICAgICogCi0gICAgICogCi0gICAgICogdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gc3RyZWFtIG9yIHBhc3N3b3JkIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdGhlIHN0b3JlJ3MgZGF0YSB0by4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXNzd29yZCB0byBwcm90ZWN0IHRoZSBkYXRhLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBLZXlTdG9yZX0gaXMgbm90IGluaXRpYWxpemVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB0byB0aGUgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVpcmVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgc3RvcmluZyB0aGUgY2VydGlmaWNhdGVzIG9mCisgICAgICogICAgICAgICAgICAgdGhpcyB7QGNvZGUgS2V5U3RvcmV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN0b3JlKE91dHB1dFN0cmVhbSBzdHJlYW0sIGNoYXJbXSBwYXNzd29yZCkKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKQEAgLTQyNCwxOCArNjIwLDI4IEBACiAgICAgICAgICAgICB0aHJvd05vdEluaXRpYWxpemVkKCk7CiAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJzZWN1cml0eS41MSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJzZWN1cml0eS41MCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9CiAgICAgICAgIGltcGxTcGkuZW5naW5lU3RvcmUoc3RyZWFtLCBwYXNzd29yZCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU3RvcmVzIHRoaXMge0Bjb2RlIEtleVN0b3JlfSB1c2luZyB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIExvYWRTdG9yZVBhcmFtZXRlcn0uCiAgICAgICogCi0gICAgICogIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2FkU3RvcmVQYXJhbWV0ZXJ9IHRoYXQgc3BlY2lmaWVzIGhvdyB0byBzdG9yZQorICAgICAqICAgICAgICAgICAgdGhpcyB7QGNvZGUgS2V5U3RvcmV9LCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBzdHJlYW0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWlyZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBzdG9yaW5nIHRoZSBjZXJ0aWZpY2F0ZXMgb2YKKyAgICAgKiAgICAgICAgICAgICB0aGlzIHtAY29kZSBLZXlTdG9yZX0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ge0BsaW5rIExvYWRTdG9yZVBhcmFtZXRlcn0gaXMgbm90IHJlY29nbml6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3RvcmUoTG9hZFN0b3JlUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CkBAIC00NDgsOCArNjU0LDI1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGZyb20gdGhlIHByb3ZpZGVkIHtAY29kZSBJbnB1dFN0cmVhbX0uCisgICAgICogUGFzcyB7QGNvZGUgbnVsbH0gYXMgdGhlIHtAY29kZSBzdHJlYW19IGFyZ3VtZW50IHRvIGluaXRpYWxpemUgYW4gZW1wdHkKKyAgICAgKiB7QGNvZGUgS2V5U3RvcmV9IG9yIHRvIGluaXRpYWxpemUgYSB7QGNvZGUgS2V5U3RvcmV9IHdoaWNoIGRvZXMgbm90IHJlbHkKKyAgICAgKiBvbiBhbiB7QGNvZGUgSW5wdXRTdHJlYW19LiBUaGlzIHtAY29kZSBLZXlTdG9yZX0gdXRpbGl6ZXMgdGhlIGdpdmVuCisgICAgICogcGFzc3dvcmQgdG8gdmVyaWZ5IHRoZSBzdG9yZWQgZGF0YS4KICAgICAgKiAKLSAgICAgKiAgCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gbG9hZCB0aGlzIHtAY29kZSBLZXlTdG9yZX0ncyBkYXRhCisgICAgICogICAgICAgICAgICBmcm9tIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXNzd29yZCB0byB2ZXJpZnkgdGhlIHN0b3JlZCBkYXRhLCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1aXJlZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNlcnRpZmljYXRlcyBvZgorICAgICAqICAgICAgICAgICAgIHRoaXMge0Bjb2RlIEtleVN0b3JlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBsb2FkKElucHV0U3RyZWFtIHN0cmVhbSwgY2hhcltdIHBhc3N3b3JkKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKQEAgLTQ1OCw4ICs2ODEsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBMb2FkcyB0aGlzIHtAY29kZSBLZXlTdG9yZX0gdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBMb2FkU3RvcmVQYXJhbWV0ZXJ9LgogICAgICAqIAotICAgICAqICAKKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTG9hZFN0b3JlUGFyYW1ldGVyfSB0aGF0IHNwZWNpZmllcyBob3cgdG8gbG9hZCB0aGlzCisgICAgICogICAgICAgICAgICB7QGNvZGUgS2V5U3RvcmV9LCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1aXJlZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNlcnRpZmljYXRlcyBvZgorICAgICAqICAgICAgICAgICAgIHRoaXMge0Bjb2RlIEtleVN0b3JlfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiB7QGxpbmsgTG9hZFN0b3JlUGFyYW1ldGVyfSBpcyBub3QgcmVjb2duaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBsb2FkKExvYWRTdG9yZVBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CkBAIC00NjgsOCArNzA1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIEVudHJ5fSB3aXRoIHRoZSBnaXZlbiBhbGlhcywgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfS4KICAgICAgKiAKLSAgICAgKiAgCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgb2YgdGhlIHJlcXVlc3RlZCBlbnRyeS4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJvdGVjdGlvblBhcmFtZXRlcn0gdXNlZCB0byBwcm90ZWN0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiAgICAgICAgICAgIGVudHJ5LCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBoZSB7QGNvZGUgRW50cnl9IHdpdGggdGhlIGdpdmVuIGFsaWFzLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICB7QGNvZGUgUHJvdGVjdGlvblBhcmFtZXRlcn0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWlyZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBVbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW50cnkgY2FuIG5vdCBiZSByZWNvdmVyZWQuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEVudHJ5IGdldEVudHJ5KFN0cmluZyBhbGlhcywgUHJvdGVjdGlvblBhcmFtZXRlciBwYXJhbSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiwKQEAgLTQ4NiwxMCArNzM4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU3RvcmVzIHRoZSBnaXZlbiB7QGNvZGUgRW50cnl9IGluIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBhbmQgYXNzb2NpYXRlcworICAgICAqIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUgYWxpYXN9LiBUaGUgZW50cnkgaXMgcHJvdGVjdGVkIGJ5IHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgUHJvdGVjdGlvblBhcmFtZXRlcn0uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBhbGlhcyBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZWFzc2lnbmVkLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAxLjUgcmVsZWFzZSB0aHJvd3MgdW5zcGVjaWZpZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGlhcyBvcgotICAgICAqIGVudHJ5IGlzIG51bGwKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGVudHJ5LgorICAgICAqIEBwYXJhbSBlbnRyeQorICAgICAqICAgICAgICAgICAgdGhlIGVudHJ5IHRvIHN0b3JlLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfSB0byBwcm90ZWN0IHRoZSBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgS2V5U3RvcmV9IGlzIG5vdCBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRFbnRyeShTdHJpbmcgYWxpYXMsIEVudHJ5IGVudHJ5LAogICAgICAgICAgICAgUHJvdGVjdGlvblBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKQEAgLTUwOCw3ICs3NzIsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW50cnkgZm9yIHRoZSBnaXZlbiBhbGlhcyBpcyBhc3NpZ25hYmxlIHRvIHRoZQorICAgICAqIHByb3ZpZGVkIHtAY29kZSBDbGFzc30uCiAgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBlbnRyeS4KKyAgICAgKiBAcGFyYW0gZW50cnlDbGFzcworICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGVudHJ5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgRW50cnl9IGZvciB0aGUgYWxpYXMgaXMgYXNzaWduYWJsZSB0bworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCB7QGNvZGUgZW50cnlDbGFzc30uCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZW50cnlJbnN0YW5jZU9mKFN0cmluZyBhbGlhcywgCiAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgS2V5U3RvcmUuRW50cnk+IGVudHJ5Q2xhc3MpCkBAIC01MjksMzQgKzgwNCw3MSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHtAY29kZSBCdWlsZGVyfSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHtAY29kZSBLZXlTdG9yZX0uCiAgICAgICogCi0gICAgICogCi0gICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJ1aWxkZXJ9LgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBCdWlsZGVyKCkgewogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBLZXlTdG9yZX0gY3JlYXRlZCBieSB0aGlzIHtAY29kZSBCdWlsZGVyfS4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHJldHVybiB0aGUge0Bjb2RlIEtleVN0b3JlfSBjcmVhdGVkIGJ5IHRoaXMge0Bjb2RlIEJ1aWxkZXJ9LgorICAgICAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IEtleVN0b3JlIGdldEtleVN0b3JlKCkgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgUHJvdGVjdGlvblBhcmFtZXRlcn0gdG8gYmUgdXNlZCB3aGVuIGEge0Bjb2RlCisgICAgICAgICAqIEVudHJ5fSB3aXRoIHRoZSBzcGVjaWZpZWQgYWxpYXMgaXMgcmVxdWVzdGVkLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKKyAgICAgICAgICogaW52b2tlZCwge0BsaW5rICNnZXRLZXlTdG9yZSgpfSBtdXN0IGJlIGNhbGxlZC4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHBhcmFtIGFsaWFzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIGZvciB0aGUgZW50cnkuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfSB0byBiZSB1c2VkIHdoZW4gYSB7QGNvZGUKKyAgICAgICAgICogICAgICAgICBFbnRyeX0gd2l0aCB0aGUgc3BlY2lmaWVkIGFsaWFzIGlzIHJlcXVlc3RlZC4KKyAgICAgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGxvb2t1cCBmb3IgdGhlIHByb3RlY3Rpb24KKyAgICAgICAgICogICAgICAgICAgICAgcGFyYW1ldGVyLgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB7QGxpbmsgI2dldEtleVN0b3JlKCl9IGlzIG5vdCBjYWxsZWQgcHJpb3IgdGhlCisgICAgICAgICAqICAgICAgICAgICAgIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsaWFzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IFByb3RlY3Rpb25QYXJhbWV0ZXIgZ2V0UHJvdGVjdGlvblBhcmFtZXRlcihTdHJpbmcgYWxpc2UpCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBQcm90ZWN0aW9uUGFyYW1ldGVyIGdldFByb3RlY3Rpb25QYXJhbWV0ZXIoU3RyaW5nIGFsaWFzKQogICAgICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbjsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgICAgIC8vIHJlbmFtZWQgcGFyYW1ldGVyCisgICAgICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIAogICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQnVpbGRlcn0gdGhhdCBob2xkcyB0aGUgZ2l2ZW4ge0Bjb2RlIEtleVN0b3JlfQorICAgICAgICAgKiBhbmQgdGhlIGdpdmVuIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfS4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHBhcmFtIGtleVN0b3JlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBLZXlTdG9yZX0gdG8gYmUgaGVsZC4KKyAgICAgICAgICogQHBhcmFtIHByb3RlY3Rpb25QYXJhbWV0ZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFByb3RlY3Rpb25QYXJhbWV0ZXJ9IHRvIGJlIGhlbGQuCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJ1aWxkZXJ9IHRoYXQgaG9sZHMgdGhlIHNwZWNpZmllZAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBLZXlTdG9yZX0gYW5kIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICAgICAqICAgICAgICAgUHJvdGVjdGlvblBhcmFtZXRlcn0uCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGtleVN0b3JlfSBvciB7QGNvZGUgcHJvdGVjdGlvblBhcmFtZXRlcn0gaXMKKyAgICAgICAgICogICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4ge0Bjb2RlIEtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0luc3RhbmNlKEtleVN0b3JlIGtleVN0b3JlLAogICAgICAgICAgICAgICAgIFByb3RlY3Rpb25QYXJhbWV0ZXIgcHJvdGVjdGlvblBhcmFtZXRlcikgewpAQCAtNTc1LDggKzg4NywzNiBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIEJ1aWxkZXJ9IHRoYXQgY3JlYXRlcyBhIG5ldyB7QGNvZGUgS2V5U3RvcmV9CisgICAgICAgICAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBJZiB7QGNvZGUgcHJvdmlkZXJ9IGlzIHtAY29kZSBudWxsfSwgYWxsIGluc3RhbGxlZCBwcm92aWRlcnMgYXJlCisgICAgICAgICAqIHNlYXJjaGVkLCBvdGhlcndpc2UgdGhlIGtleSBzdG9yZSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMKKyAgICAgICAgICogdXNlZC4KKyAgICAgICAgICogPC9wPgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB7QGNvZGUgS2V5U3RvcmV9IHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgdGhlIHtAY29kZSBLZXlTdG9yZX0gdG8gYmUgY29uc3RydWN0ZWQsCisgICAgICAgICAqICAgICAgICAgICAgbWF5YmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAcGFyYW0gZmlsZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgRmlsZX0gdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHtAY29kZQorICAgICAgICAgKiAgICAgICAgICAgIEtleVN0b3JlfS4KKyAgICAgICAgICogQHBhcmFtIHByb3RlY3Rpb25QYXJhbWV0ZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFByb3RlY3Rpb25QYXJhbWV0ZXJ9IHVzZWQgdG8gcHJvdGVjdCB0aGUgc3RvcmVkCisgICAgICAgICAqICAgICAgICAgICAga2V5cy4KKyAgICAgICAgICogQHJldHVybiBhIG5ldyB7QGNvZGUgQnVpbGRlcn0gdGhhdCBjcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlTdG9yZX0KKyAgICAgICAgICogICAgICAgICBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0eXBlLCBwcm90ZWN0aW9uUGFyYW1ldGVyfSBvciB7QGNvZGUgZmlsZX0gaXMKKyAgICAgICAgICogICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICB7QGNvZGUgcHJvdGVjdGlvblBhcmFtZXRlcn0gbm90IGFuIGluc3RhbmNlIG9mIGVpdGhlcgorICAgICAgICAgKiAgICAgICAgICAgICB7QGNvZGUgUGFzc3dvcmRQcm90ZWN0aW9ufSBvciB7QGNvZGUKKyAgICAgICAgICogICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyUHJvdGVjdGlvbn0sIHtAY29kZSBmaWxlfSBpcyBub3QgYSBmaWxlIG9yCisgICAgICAgICAqICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0IGF0IGFsbC4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3SW5zdGFuY2UoU3RyaW5nIHR5cGUsIFByb3ZpZGVyIHByb3ZpZGVyLAogICAgICAgICAgICAgICAgIEZpbGUgZmlsZSwgUHJvdGVjdGlvblBhcmFtZXRlciBwcm90ZWN0aW9uUGFyYW1ldGVyKSB7CkBAIC02MDksOCArOTQ5LDMzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQnVpbGRlcn0gdGhhdCBjcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlTdG9yZX0KKyAgICAgICAgICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHtAY29kZSBwcm92aWRlcn0gaXMge0Bjb2RlIG51bGx9LCBhbGwgaW5zdGFsbGVkIHByb3ZpZGVycyBhcmUKKyAgICAgICAgICogc2VhcmNoZWQsIG90aGVyd2lzZSB0aGUga2V5IHN0b3JlIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlciBpcworICAgICAgICAgKiB1c2VkLgorICAgICAgICAgKiA8L3A+CiAgICAgICAgICAqIAotICAgICAgICAgKiAgCisgICAgICAgICAqIEBwYXJhbSB0eXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHtAY29kZSBLZXlTdG9yZX0gdG8gYmUgY29uc3RydWN0ZWQuCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciBvZiB0aGUge0Bjb2RlIEtleVN0b3JlfSB0byBiZSBjb25zdHJ1Y3RlZCwKKyAgICAgICAgICogICAgICAgICAgICBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBwYXJhbSBwcm90ZWN0aW9uUGFyYW1ldGVyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfSB1c2VkIHRvIHByb3RlY3QgdGhlIHN0b3JlZAorICAgICAgICAgKiAgICAgICAgICAgIGtleXMuCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcge0Bjb2RlIEJ1aWxkZXJ9IHRoYXQgY3JlYXRlcyBhIG5ldyB7QGNvZGUgS2V5U3RvcmV9CisgICAgICAgICAqICAgICAgICAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdHlwZX0gb3Ige0Bjb2RlIHByb3RlY3Rpb25QYXJhbWV0ZXJ9IGlzIHtAY29kZQorICAgICAgICAgKiAgICAgICAgICAgICBudWxsfS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAge0Bjb2RlIHByb3RlY3Rpb25QYXJhbWV0ZXJ9IG5vdCBhbiBpbnN0YW5jZSBvZiBlaXRoZXIKKyAgICAgICAgICogICAgICAgICAgICAge0Bjb2RlIFBhc3N3b3JkUHJvdGVjdGlvbn0gb3Ige0Bjb2RlCisgICAgICAgICAqICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlclByb3RlY3Rpb259LCB7QGNvZGUgZmlsZX0gaXMgbm90IGEgZmlsZSBvcgorICAgICAgICAgKiAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdCBhdCBhbGwuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0luc3RhbmNlKFN0cmluZyB0eXBlLCBQcm92aWRlciBwcm92aWRlciwKICAgICAgICAgICAgICAgICBQcm90ZWN0aW9uUGFyYW1ldGVyIHByb3RlY3Rpb25QYXJhbWV0ZXIpIHsKQEAgLTgwNiw5ICsxMTcxLDEwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoge0Bjb2RlIENhbGxiYWNrSGFuZGxlclByb3RlY3Rpb259IGlzIGEge0Bjb2RlIFByb3RlY3Rpb25QYXJhbWV0ZXJ9IHRoYXQKKyAgICAgKiBlbmNhcHN1bGF0ZXMgYSB7QGxpbmsgQ2FsbGJhY2tIYW5kbGVyfS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGxiYWNrSGFuZGxlclByb3RlY3Rpb24gaW1wbGVtZW50cwogICAgICAgICAgICAgUHJvdGVjdGlvblBhcmFtZXRlciB7CkBAIC04MTYsOCArMTE4MiwxNCBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrSGFuZGxlciBjYWxsYmFja0hhbmRsZXI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIENhbGxiYWNrSGFuZGxlclByb3RlY3Rpb259IHdpdGgKKyAgICAgICAgICogdGhlIHtAY29kZSBDYWxsYmFja0hhbmRsZXJ9LgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsbGJhY2tIYW5kbGVyfS4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgaGFuZGxlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBDYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uKENhbGxiYWNrSGFuZGxlciBoYW5kbGVyKSB7CiAgICAgICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7CkBAIC04MjcsOCArMTE5OSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBDYWxsYmFja0hhbmRsZXJ9LgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ2FsbGJhY2tIYW5kbGVyfS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ2FsbGJhY2tIYW5kbGVyIGdldENhbGxiYWNrSGFuZGxlcigpIHsKICAgICAgICAgICAgIHJldHVybiBjYWxsYmFja0hhbmRsZXI7CkBAIC04MzYsMzAgKzEyMTAsMzkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiB7QGNvZGUgRW50cnl9IGlzIHRoZSBjb21tb24gbWFya2VyIGludGVyZmFjZSBmb3IgYSB7QGNvZGUgS2V5U3RvcmV9CisgICAgICogZW50cnkuCiAgICAgICogCi0gICAgICogCi0gICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRW50cnkgewogICAgIH0KIAogICAgIC8qKgorICAgICAqIHtAY29kZSBMb2FkU3RvcmVQYXJhbWV0ZXJ9IHJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgaG93IGEKKyAgICAgKiB7QGNvZGUgS2V5U3RvcmV9IGNhbiBiZSBsb2FkZWQgYW5kIHN0b3JlZC4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAKKyAgICAgKiBAc2VlIEtleVN0b3JlI2xvYWQoTG9hZFN0b3JlUGFyYW1ldGVyKQorICAgICAqIEBzZWUgS2V5U3RvcmUjc3RvcmUoTG9hZFN0b3JlUGFyYW1ldGVyKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExvYWRTdG9yZVBhcmFtZXRlciB7CiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgUHJvdGVjdGlvblBhcmFtZXRlcn0gd2hpY2ggaXMgdXNlZCB0byBwcm90ZWN0IGRhdGEKKyAgICAgICAgICogaW4gdGhlIHtAY29kZSBLZXlTdG9yZX0uCiAgICAgICAgICAqIAotICAgICAgICAgKiAgCisgICAgICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfSB3aGljaCBpcyB1c2VkIHRvIHByb3RlY3QgZGF0YQorICAgICAgICAgKiAgICAgICAgIGluIHRoZSB7QGNvZGUgS2V5U3RvcmV9LCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFByb3RlY3Rpb25QYXJhbWV0ZXIgZ2V0UHJvdGVjdGlvblBhcmFtZXRlcigpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIHtAY29kZSBQYXNzd29yZFByb3RlY3Rpb259IGlzIGEge0Bjb2RlIFByb3RlY3Rpb25QYXJhbWV0ZXJ9IHRoYXQgcHJvdGVjdHMKKyAgICAgKiBhIHtAY29kZSBLZXlTdG9yZX0gdXNpbmcgYSBwYXNzd29yZC4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhc3N3b3JkUHJvdGVjdGlvbiBpbXBsZW1lbnRzIFByb3RlY3Rpb25QYXJhbWV0ZXIsCiAgICAgICAgICAgICBEZXN0cm95YWJsZSB7CkBAIC04NzAsMTYgKzEyNTMsMjcgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRGVzdHJveWVkID0gZmFsc2U7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFBhc3N3b3JkUHJvdGVjdGlvbn0gd2l0aCBhCisgICAgICAgICAqIHBhc3N3b3JkLiBBIGNvcHkgb2YgdGhlIHBhc3N3b3JkIGlzIHN0b3JlZCBpbiB0aGUgbmV3IHtAY29kZQorICAgICAgICAgKiBQYXNzd29yZFByb3RlY3Rpb259IG9iamVjdC4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHBhcmFtIHBhc3N3b3JkCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkLCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFBhc3N3b3JkUHJvdGVjdGlvbihjaGFyW10gcGFzc3dvcmQpIHsKLSAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IChwYXNzd29yZCAhPSBudWxsKSA/IHBhc3N3b3JkLmNsb25lKCkgOiBudWxsOworICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHBhc3N3b3JkLgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYXNzd29yZC4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhc3N3b3JkIGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGNoYXJbXSBnZXRQYXNzd29yZCgpIHsKICAgICAgICAgICAgIGlmIChpc0Rlc3Ryb3llZCkgewpAQCAtODg5LDggKzEyODMsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBEZXN0cm95cyAvIGludmFsaWRhdGVzIHRoZSBwYXNzd29yZC4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHRocm93cyBEZXN0cm95RmFpbGVkRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXNzd29yZCBjb3VsZCBub3QgYmUgaW52YWxpZGF0ZWQuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgRGVzdHJveUZhaWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7CkBAIC05MDEsOCArMTI5OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwYXNzd29yZCBpcyBpbnZhbGlkYXRlZC4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBhc3N3b3JkIGlzIGludmFsaWRhdGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Rlc3Ryb3llZCgpIHsKICAgICAgICAgICAgIHJldHVybiBpc0Rlc3Ryb3llZDsKQEAgLTkxMCwxNyArMTMxMCwyMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfSBpcyBhIG1hcmtlciBpbnRlcmZhY2UgZm9yIHByb3RlY3Rpb24KKyAgICAgKiBwYXJhbWV0ZXJzLiBBIHByb3RlY3Rpb24gcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJvdGVjdCB0aGUgY29udGVudCBvZiBhCisgICAgICoge0Bjb2RlIEtleVN0b3JlfS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBQcm90ZWN0aW9uUGFyYW1ldGVyIHsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiB7QGNvZGUgUHJpdmF0ZUtleUVudHJ5fSByZXByZXNlbnRzIGEge0Bjb2RlIEtleVN0b3JlfSBlbnRyeSB0aGF0CisgICAgICogaG9sZHMgYSBwcml2YXRlIGtleS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByaXZhdGVLZXlFbnRyeSBpbXBsZW1lbnRzIEVudHJ5IHsKICAgICAgICAgLy8gU3RvcmUgQ2VydGlmaWNhdGUgY2hhaW4KQEAgLTkzMCw4ICsxMzMzLDIyIEBACiAgICAgICAgIHByaXZhdGUgUHJpdmF0ZUtleSBwcml2YXRlS2V5OwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBQcml2YXRlS2V5RW50cnl9IHdpdGggdGhlIGdpdmVuCisgICAgICAgICAqIHtAY29kZSBQcml2YXRlS2V5fSBhbmQgdGhlIHByb3ZpZGVkIGNlcnRpZmljYXRlIGNoYWluLgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcGFyYW0gcHJpdmF0ZUtleQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIGtleS4KKyAgICAgICAgICogQHBhcmFtIGNoYWluCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG9yZGVyZWQgY2VydGlmaWNhdGUgY2hhaW4gd2l0aCB0aGUgY2VydGlmaWNhdGUKKyAgICAgICAgICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcml2YXRlIGtleSBhdCBpbmRleCAwLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwcml2YXRlS2V5fSBvciB7QGNvZGUgY2hhaW59IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNoYWluLmxlbmd0aCA9PSAwfSwgdGhlIGFsZ29yaXRobSBvZiB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgcHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggdGhlIGFsZ29yaXRobSBvZiB0aGUgcHVibGljCisgICAgICAgICAqICAgICAgICAgICAgIGtleSBvZiB0aGUgZmlyc3QgY2VydGlmaWNhdGUgb3IgdGhlIGNlcnRpZmljYXRlcyBhcmUgbm90CisgICAgICAgICAqICAgICAgICAgICAgIGFsbCBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBQcml2YXRlS2V5RW50cnkoUHJpdmF0ZUtleSBwcml2YXRlS2V5LCBDZXJ0aWZpY2F0ZVtdIGNoYWluKSB7CiAgICAgICAgICAgICBpZiAocHJpdmF0ZUtleSA9PSBudWxsKSB7CkBAIC05NTksMzggKzEzNzYsNTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjbG9uZSBjaGFpbiAtIHRoaXMuY2hhaW4gPSAoQ2VydGlmaWNhdGVbXSljaGFpbi5jbG9uZSgpOworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB0aGlzLmNoYWluID0gbmV3IENlcnRpZmljYXRlW2NoYWluLmxlbmd0aF07CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoYWluLCAwLCB0aGlzLmNoYWluLCAwLCBjaGFpbi5sZW5ndGgpOwogICAgICAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gcHJpdmF0ZUtleTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBwcml2YXRlIGtleS4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFByaXZhdGVLZXkgZ2V0UHJpdmF0ZUtleSgpIHsKICAgICAgICAgICAgIHJldHVybiBwcml2YXRlS2V5OwogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRlIGNoYWluLgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZUNoYWluKCkgeworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICByZXR1cm4gY2hhaW47CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJpdmF0ZSBrZXkuCiAgICAgICAgICAqIAotICAgICAgICAgKiAgCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByaXZhdGUga2V5LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBjaGFpblswXTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZgorICAgICAgICAgKiB0aGlzIHtAY29kZSBQcml2YXRlS2V5RW50cnl9LgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBQcml2YXRlS2V5RW50cnl9LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKApAQCAtMTAwNiw5ICsxNDM2LDEwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoge0Bjb2RlIFNlY3JldEtleUVudHJ5fSByZXByZXNlbnRzIGEge0Bjb2RlIEtleVN0b3JlfSBlbnRyeSB0aGF0CisgICAgICogaG9sZHMgYSBzZWNyZXQga2V5LgogICAgICAqIAotICAgICAqIAotICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2VjcmV0S2V5RW50cnkgaW1wbGVtZW50cyBFbnRyeSB7CiAKQEAgLTEwMTYsOCArMTQ0NywxNCBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIFNlY3JldEtleSBzZWNyZXRLZXk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNlY3JldEtleUVudHJ5fSB3aXRoIHRoZSBnaXZlbgorICAgICAgICAgKiB7QGNvZGUgU2VjcmV0S2V5fS4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHBhcmFtIHNlY3JldEtleQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzZWNyZXQga2V5LgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzZWNyZXRLZXl9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU2VjcmV0S2V5RW50cnkoU2VjcmV0S2V5IHNlY3JldEtleSkgewogICAgICAgICAgICAgaWYgKHNlY3JldEtleSA9PSBudWxsKSB7CkBAIC0xMDI3LDE2ICsxNDY0LDIyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc2VjcmV0IGtleS4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHJldHVybiB0aGUgc2VjcmV0IGtleS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU2VjcmV0S2V5IGdldFNlY3JldEtleSgpIHsKICAgICAgICAgICAgIHJldHVybiBzZWNyZXRLZXk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YKKyAgICAgICAgICogdGhpcyB7QGNvZGUgU2VjcmV0S2V5RW50cnl9LgogICAgICAgICAgKiAKLSAgICAgICAgICogIAorICAgICAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZQorICAgICAgICAgKiAgICAgICAgIFNlY3JldEtleUVudHJ5fS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2VjcmV0S2V5RW50cnk6IGFsZ29yaXRobSAtICIpOyAvLyROT04tTkxTLTEkCkBAIC0xMDQ2LDkgKzE0ODksMTAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiB7QGNvZGUgVHJ1c3RlZENlcnRpZmljYXRlRW50cnl9IHJlcHJlc2VudHMgYSB7QGNvZGUgS2V5U3RvcmV9IGVudHJ5IHRoYXQKKyAgICAgKiBob2xkcyBhIHRydXN0ZWQgY2VydGlmaWNhdGUuCiAgICAgICogCi0gICAgICogCi0gICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUcnVzdGVkQ2VydGlmaWNhdGVFbnRyeSBpbXBsZW1lbnRzIEVudHJ5IHsKIApAQCAtMTA1Niw4ICsxNTAwLDE0IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgQ2VydGlmaWNhdGUgdHJ1c3RDZXJ0aWZpY2F0ZTsKIAogICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgVHJ1c3RlZENlcnRpZmljYXRlRW50cnl9IHdpdGggdGhlCisgICAgICAgICAqIGdpdmVuIHtAY29kZSBDZXJ0aWZpY2F0ZX0uCiAgICAgICAgICAqIAotICAgICAgICAgKiAgCisgICAgICAgICAqIEBwYXJhbSB0cnVzdENlcnRpZmljYXRlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGUuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHRydXN0Q2VydGlmaWNhdGV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgVHJ1c3RlZENlcnRpZmljYXRlRW50cnkoQ2VydGlmaWNhdGUgdHJ1c3RDZXJ0aWZpY2F0ZSkgewogICAgICAgICAgICAgaWYgKHRydXN0Q2VydGlmaWNhdGUgPT0gbnVsbCkgewpAQCAtMTA2NywxNiArMTUxNywyMiBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiAgCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRydXN0ZWQgY2VydGlmaWNhdGUuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIENlcnRpZmljYXRlIGdldFRydXN0ZWRDZXJ0aWZpY2F0ZSgpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVzdENlcnRpZmljYXRlOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mCisgICAgICAgICAqIHRoaXMge0Bjb2RlIFRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5fS4KICAgICAgICAgICogCi0gICAgICAgICAqICAKKyAgICAgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUKKyAgICAgICAgICogICAgICAgICBUcnVzdGVkQ2VydGlmaWNhdGVFbnRyeX0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiAiVHJ1c3RlZCBjZXJ0aWZpY2F0ZSBlbnRyeTpcbiIgKyB0cnVzdENlcnRpZmljYXRlOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDBlNzdlNDcuLjdjNjk3ZjcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbi5qYXZhCkBAIC0yMyw0MCArMjMsNTggQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIEtleVN0b3JlRXhjZXB0aW9ufSBpcyBhIGdlbmVyYWwge0Bjb2RlIEtleVN0b3JlfSBleGNlcHRpb24uCiAgKiAKKyAqIEBzZWUgS2V5U3RvcmUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgS2V5U3RvcmVFeGNlcHRpb24gZXh0ZW5kcyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTExOTM1MzE3OTMyMjM3NzI2Mkw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVN0b3JlRXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5U3RvcmVFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgS2V5U3RvcmVFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBLZXlTdG9yZUV4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEtleVN0b3JlRXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UgYW5kIHRoZSBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5U3RvcmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBLZXlTdG9yZUV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgS2V5U3RvcmVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVN0b3JlU3BpLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVTcGkuamF2YQppbmRleCAwZWQwMWRkLi5iMDJmMjY0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVTcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVTcGkuamF2YQpAQCAtMzAsNTIgKzMwLDI5NCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiB7QGNvZGUgS2V5U3RvcmVTcGl9IGlzIHRoZSBTZXJ2aWNlIFByb3ZpZGVyIEludGVyZmFjZSAoU1BJKSBkZWZpbml0aW9uIGZvcgorICoge0BsaW5rIEtleVN0b3JlfS4KKyAqIAorICogQHNlZSBLZXlTdG9yZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBLZXlTdG9yZVNwaSB7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBrZXkgd2l0aCB0aGUgZ2l2ZW4gYWxpYXMsIHVzaW5nIHRoZSBwYXNzd29yZCB0byByZWNvdmVyIHRoZQorICAgICAqIGtleSBmcm9tIHRoZSBzdG9yZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGVudHJ5LgorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkIHVzZWQgdG8gcmVjb3ZlciB0aGUga2V5LgorICAgICAqIEByZXR1cm4gdGhlIGtleSB3aXRoIHRoZSBzcGVjaWZpZWQgYWxpYXMsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBhbGlhcyBpcyBub3QgYm91bmQgdG8gYW4gZW50cnkuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYWxnb3JpdGhtIGZvciByZWNvdmVyaW5nIHRoZSBrZXkgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGNhbiBub3QgYmUgcmVjb3ZlcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBLZXkgZW5naW5lR2V0S2V5KFN0cmluZyBhbGlhcywgY2hhcltdIHBhc3N3b3JkKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRlIGNoYWluIGZvciB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gYWxpYXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBlbnRyeQorICAgICAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRlIGNoYWluIGZvciB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gYWxpYXMsIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgdGhlIHNwZWNpZmllZCBhbGlhcyBpcyBub3QgYm91bmQgdG8gYW4gZW50cnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENlcnRpZmljYXRlW10gZW5naW5lR2V0Q2VydGlmaWNhdGVDaGFpbihTdHJpbmcgYWxpYXMpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBmb3IgdGhlIGVudHJ5IHdpdGggdGhlIGdpdmVuIGFsaWFzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGlhcworICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIGZvciB0aGUgZW50cnkuCisgICAgICogQHJldHVybiB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBmb3IgdGhlIGVudHJ5IHdpdGggdGhlIGdpdmVuIGFsaWFzLCBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZSBzcGVjaWZpZWQgYWxpYXMgaXMgbm90IGJvdW5kIHRvIGFuIGVudHJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBDZXJ0aWZpY2F0ZSBlbmdpbmVHZXRDZXJ0aWZpY2F0ZShTdHJpbmcgYWxpYXMpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gYWxpYXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBlbnRyeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGlvbiBkYXRlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHNwZWNpZmllZCBhbGlhcyBpcyBub3QKKyAgICAgKiAgICAgICAgIGJvdW5kIHRvIGFuIGVudHJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBEYXRlIGVuZ2luZUdldENyZWF0aW9uRGF0ZShTdHJpbmcgYWxpYXMpOwogCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlcyB0aGUgZ2l2ZW4gYWxpYXMgd2l0aCB0aGUga2V5LCBwYXNzd29yZCBhbmQgY2VydGlmaWNhdGUgY2hhaW4uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBhbGlhcyBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZWFzc2lnbmVkLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5LgorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkLgorICAgICAqIEBwYXJhbSBjaGFpbgorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIGNoYWluLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBjYW4gbm90IGJlIHByb3RlY3RlZCwgb3IgaWYgdGhpcworICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiBmYWlscyBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUga2V5fSBpcyBhIHtAY29kZSBQcml2YXRlS2V5fSBhbmQge0Bjb2RlIGNoYWlufSBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGNvbnRhaW4gYW55IGNlcnRpZmljYXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmdpbmVTZXRLZXlFbnRyeShTdHJpbmcgYWxpYXMsIEtleSBrZXksCiAgICAgICAgICAgICBjaGFyW10gcGFzc3dvcmQsIENlcnRpZmljYXRlW10gY2hhaW4pIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbjsKIAorICAgIC8qKgorICAgICAqIEFzc29jaWF0ZXMgdGhlIGdpdmVuIGFsaWFzIHdpdGggYSBrZXkgYW5kIGEgY2VydGlmaWNhdGUgY2hhaW4uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBhbGlhcyBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZWFzc2lnbmVkLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IGluIGFuIGVuY29kZWQgZm9ybWF0LgorICAgICAqIEBwYXJhbSBjaGFpbgorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIGNoYWluLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG9wZXJhdGlvbiBmYWlscy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBrZXl9IGlzIGEge0Bjb2RlIFByaXZhdGVLZXl9IGFuZCB7QGNvZGUgY2hhaW59CisgICAgICogICAgICAgICAgICAgZG9lcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmdpbmVTZXRLZXlFbnRyeShTdHJpbmcgYWxpYXMsIGJ5dGVbXSBrZXksCiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNoYWluKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb247CiAKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHRoZSBnaXZlbiBhbGlhcyB3aXRoIGEgY2VydGlmaWNhdGUuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBhbGlhcyBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZWFzc2lnbmVkLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGNlcnRpZmljYXRlLgorICAgICAqIEBwYXJhbSBjZXJ0CisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGV4aXN0aW5nIGFsaWFzIGlzIG5vdCBhc3NvY2lhdGVkIHRvIGFuIGVudHJ5IGNvbnRhaW5pbmcKKyAgICAgKiAgICAgICAgICAgICBhIHRydXN0ZWQgY2VydGlmaWNhdGUsIG9yIHRoaXMgbWV0aG9kIGZhaWxzIGZvciBhbnkgb3RoZXIKKyAgICAgKiAgICAgICAgICAgICByZWFzb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZW5naW5lU2V0Q2VydGlmaWNhdGVFbnRyeShTdHJpbmcgYWxpYXMsCiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0KSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb247CiAKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIHRoZSBlbnRyeSBpZGVudGlmaWVkIHdpdGggdGhlIGdpdmVuIGFsaWFzIGZyb20gdGhpcyB7QGNvZGUKKyAgICAgKiBLZXlTdG9yZVNwaX0uCisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVudHJ5IGNhbiBub3QgYmUgZGVsZXRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmdpbmVEZWxldGVFbnRyeShTdHJpbmcgYWxpYXMpCiAgICAgICAgICAgICB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb247CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIHtAY29kZSBFbnVtZXJhdGlvbn0gb3ZlciBhbGwgYWxpYXMgbmFtZXMgc3RvcmVkIGluIHRoaXMKKyAgICAgKiB7QGNvZGUgS2V5U3RvcmVTcGl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIEVudW1lcmF0aW9ufSBvdmVyIGFsbCBhbGlhcyBuYW1lcyBzdG9yZWQgaW4gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIEtleVN0b3JlU3BpfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRW51bWVyYXRpb248U3RyaW5nPiBlbmdpbmVBbGlhc2VzKCk7CiAKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gYWxpYXMgaXMgcHJlc2VudCBpbiB0aGlzIHtAY29kZSBLZXlTdG9yZVNwaX0uCisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgb2YgYW4gZW50cnkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGFsaWFzIGV4aXN0cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZW5naW5lQ29udGFpbnNBbGlhcyhTdHJpbmcgYWxpYXMpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgc3RvcmVkIGluIHRoaXMge0Bjb2RlIEtleVN0b3JlU3BpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBzdG9yZWQgaW4gdGhpcyB7QGNvZGUgS2V5U3RvcmVTcGl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZW5naW5lU2l6ZSgpOwogCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhbGlhcyBpcyBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIGEKKyAgICAgKiB7QGxpbmsgS2V5U3RvcmUuUHJpdmF0ZUtleUVudHJ5fSBvciBhIHtAbGluayBLZXlTdG9yZS5TZWNyZXRLZXlFbnRyeX0uCisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgb2YgYW4gZW50cnkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGFsaWFzIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGtleSBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlbmdpbmVJc0tleUVudHJ5KFN0cmluZyBhbGlhcyk7CiAKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGFsaWFzIGlzIGFzc29jaWF0ZWQgd2l0aCBhCisgICAgICoge0BsaW5rIEtleVN0b3JlLlRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBvZiBhbiBlbnRyeS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gYWxpYXMgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY2VydGlmaWNhdGUKKyAgICAgKiAgICAgICAgIGVudHJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVuZ2luZUlzQ2VydGlmaWNhdGVFbnRyeShTdHJpbmcgYWxpYXMpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxpYXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBlbnRyeSB3aG9zZSBjZXJ0aWZpY2F0ZQorICAgICAqIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBjZXJ0aWZpY2F0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydAorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQgZW50cnkncyBhbGlhcyBmb3IuCisgICAgICogQHJldHVybiB0aGUgYWxpYXMgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgY2VydGlmaWNhdGUgY2FuIGJlIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZW5naW5lR2V0Q2VydGlmaWNhdGVBbGlhcyhDZXJ0aWZpY2F0ZSBjZXJ0KTsKIAorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGlzIHtAY29kZSBLZXlTdG9yZVNwaX0gdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUgT3V0cHV0U3RyZWFtfS4KKyAgICAgKiBUaGUgZGF0YSB3cml0dGVuIHRvIHRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfSBpcyBwcm90ZWN0ZWQgYnkgdGhlCisgICAgICogc3BlY2lmaWVkIHBhc3N3b3JkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT3V0cHV0U3RyZWFtfSB0byB3cml0ZSB0aGUgc3RvcmUncyBkYXRhIHRvLgorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkIHRvIHByb3RlY3QgdGhlIGRhdGEuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBzdHJlYW0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWlyZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgc3RvcmluZyB0aGUgY2VydGlmaWNhdGVzCisgICAgICogICAgICAgICAgICAgb2YgdGhpcyBjb2RlIHtAY29kZSBLZXlTdG9yZVNwaX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZW5naW5lU3RvcmUoT3V0cHV0U3RyZWFtIHN0cmVhbSwgY2hhcltdIHBhc3N3b3JkKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uOwogCisgICAgLyoqCisgICAgICogU3RvcmVzIHRoaXMge0Bjb2RlIEtleVN0b3JlU3BpfSB1c2luZyB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIExvYWRTdG9yZVBhcmFtZXRlcn0uCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIExvYWRTdG9yZVBhcmFtZXRlcn0gdGhhdCBzcGVjaWZpZXMgaG93IHRvIHN0b3JlCisgICAgICogICAgICAgICAgICB0aGlzIHtAY29kZSBLZXlTdG9yZVNwaX0sIG1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1aXJlZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBzdG9yaW5nIHRoZSBjZXJ0aWZpY2F0ZXMKKyAgICAgKiAgICAgICAgICAgICBvZiB0aGlzIGNvZGUge0Bjb2RlIEtleVN0b3JlU3BpfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiB7QGxpbmsgS2V5U3RvcmUuTG9hZFN0b3JlUGFyYW1ldGVyfSBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICByZWNvZ25pemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZ2luZVN0b3JlKEtleVN0b3JlLkxvYWRTdG9yZVBhcmFtZXRlciBwYXJhbSkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoInNlY3VyaXR5LjMzIikpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCisgICAgLyoqCisgICAgICogTG9hZHMgdGhpcyB7QGNvZGUgS2V5U3RvcmVTcGl9IGZyb20gdGhlIGdpdmVuIHtAY29kZSBJbnB1dFN0cmVhbX0uCisgICAgICogVXRpbGl6ZXMgdGhlIGdpdmVuIHBhc3N3b3JkIHRvIHZlcmlmeSB0aGUgc3RvcmVkIGRhdGEuCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gbG9hZCB0aGlzIHtAY29kZSBLZXlTdG9yZVNwaX0ncworICAgICAqICAgICAgICAgICAgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkIHRvIHZlcmlmeSB0aGUgc3RvcmVkIGRhdGEsIG1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVpcmVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNlcnRpZmljYXRlcworICAgICAqICAgICAgICAgICAgIG9mIHRoaXMgY29kZSB7QGNvZGUgS2V5U3RvcmVTcGl9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZ2luZUxvYWQoSW5wdXRTdHJlYW0gc3RyZWFtLCBjaGFyW10gcGFzc3dvcmQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgQ2VydGlmaWNhdGVFeGNlcHRpb247CiAKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGlzIHtAY29kZSBLZXlTdG9yZVNwaX0gdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBMb2FkU3RvcmVQYXJhbWV0ZXJ9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBMb2FkU3RvcmVQYXJhbWV0ZXJ9IHRoYXQgc3BlY2lmaWVzIGhvdyB0byBsb2FkIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBLZXlTdG9yZVNwaX0sIG1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVpcmVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNlcnRpZmljYXRlcworICAgICAqICAgICAgICAgICAgIG9mIHRoaXMgY29kZSB7QGNvZGUgS2V5U3RvcmVTcGl9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIHtAbGluayBLZXlTdG9yZS5Mb2FkU3RvcmVQYXJhbWV0ZXJ9IGlzIG5vdAorICAgICAqICAgICAgICAgICAgIHJlY29nbml6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5naW5lTG9hZChLZXlTdG9yZS5Mb2FkU3RvcmVQYXJhbWV0ZXIgcGFyYW0pCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgQ2VydGlmaWNhdGVFeGNlcHRpb24gewogICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewpAQCAtMTA2LDYgKzM0OCwyNSBAQAogICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldFN0cmluZygic2VjdXJpdHkuMzUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgRW50cnl9IHdpdGggdGhlIGdpdmVuIGFsaWFzLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIFByb3RlY3Rpb25QYXJhbWV0ZXJ9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGlhcworICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIG9mIHRoZSByZXF1ZXN0ZWQgZW50cnkuCisgICAgICogQHBhcmFtIHByb3RQYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQcm90ZWN0aW9uUGFyYW1ldGVyfSwgdXNlZCB0byBwcm90ZWN0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiAgICAgICAgICAgIGVudHJ5LCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBoZSB7QGNvZGUgRW50cnl9IHdpdGggdGhlIGdpdmVuIGFsaWFzLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICB7QGNvZGUgUHJvdGVjdGlvblBhcmFtZXRlcn0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWlyZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBVbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW50cnkgY2FuIG5vdCBiZSByZWNvdmVyZWQuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIEtleVN0b3JlLkVudHJ5IGVuZ2luZUdldEVudHJ5KFN0cmluZyBhbGlhcywKICAgICAgICAgICAgIEtleVN0b3JlLlByb3RlY3Rpb25QYXJhbWV0ZXIgcHJvdFBhcmFtKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiB7CkBAIC0xNTAsNiArNDExLDI0IEBACiAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJzZWN1cml0eS4zOCIpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAorICAgIC8qKgorICAgICAqIFN0b3JlcyB0aGUgZ2l2ZW4ge0Bjb2RlIEVudHJ5fSBpbiB0aGlzIHtAY29kZSBLZXlTdG9yZVNwaX0gYW5kIGFzc29jaWF0ZXMKKyAgICAgKiB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4ge0Bjb2RlIGFsaWFzfS4gVGhlIGVudHJ5IGlzIHByb3RlY3RlZCBieSB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIFByb3RlY3Rpb25QYXJhbWV0ZXJ9LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzcGVjaWZpZWQgYWxpYXMgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmVhc3NpZ25lZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgZm9yIHRoZSBlbnRyeS4KKyAgICAgKiBAcGFyYW0gZW50cnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbnRyeSB0byBzdG9yZS4KKyAgICAgKiBAcGFyYW0gcHJvdFBhcmFtCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFByb3RlY3Rpb25QYXJhbWV0ZXJ9IHRvIHByb3RlY3QgdGhlIGVudHJ5LgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG9wZXJhdGlvbiBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmdpbmVTZXRFbnRyeShTdHJpbmcgYWxpYXMsIEtleVN0b3JlLkVudHJ5IGVudHJ5LAogICAgICAgICAgICAgS2V5U3RvcmUuUHJvdGVjdGlvblBhcmFtZXRlciBwcm90UGFyYW0pIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CkBAIC0yMDQsNiArNDgzLDE4IEBACiAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJzZWN1cml0eS4zQiIsIGVudHJ5LnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRyeSBmb3IgdGhlIGdpdmVuIGFsaWFzIGlzIGFzc2lnbmFibGUgdG8gdGhlCisgICAgICogcHJvdmlkZWQge0Bjb2RlIENsYXNzfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxpYXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBmb3IgdGhlIGVudHJ5LgorICAgICAqIEBwYXJhbSBlbnRyeUNsYXNzCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgZW50cnkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBFbnRyeX0gZm9yIHRoZSBhbGlhcyBpcyBhc3NpZ25hYmxlIHRvCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIHtAY29kZSBlbnRyeUNsYXNzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlbmdpbmVFbnRyeUluc3RhbmNlT2YoU3RyaW5nIGFsaWFzLAogICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEtleVN0b3JlLkVudHJ5PiBlbnRyeUNsYXNzKSB7CiAgICAgICAgIGlmICghZW5naW5lQ29udGFpbnNBbGlhcyhhbGlhcykpIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdC5qYXZhCmluZGV4IGM2NjVjNDUuLjk3Y2JkY2MgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QuamF2YQpAQCAtMjcsMTIgKzI3LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCi0KIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIHtAY29kZSBNZXNzYWdlRGlnZXN0fSBpcyBhbiBlbmdpbmUgY2xhc3Mgd2hpY2ggaXMgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIG9uZQorICogd2F5IGhhc2ggdmFsdWVzIGZvciBhcmJpdHJhcnkgaW5wdXQsIHV0aWxpemluZyB0aGUgYWxnb3JpdGhtIGl0IHdhcworICogaW5pdGlhbGl6ZWQgd2l0aC4KICAqIAorICogQHNlZSBNZXNzYWdlRGlnZXN0U3BpCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVzc2FnZURpZ2VzdCBleHRlbmRzIE1lc3NhZ2VEaWdlc3RTcGkgewogICAgIAogICAgIC8vIFRoZSBzZXJ2aWNlIG5hbWUKQEAgLTQ4LDE2ICs1MCwzMCBAQAogICAgIHByaXZhdGUgU3RyaW5nIGFsZ29yaXRobTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIE1lc3NhZ2VEaWdlc3R9IHdpdGggdGhlIG5hbWUgb2YKKyAgICAgKiB0aGUgYWxnb3JpdGhtIHRvIHVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhbGdvcml0aG0gdG8gdXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VEaWdlc3QoU3RyaW5nIGFsZ29yaXRobSkgewogICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBNZXNzYWdlRGlnZXN0fSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqIHNwZWNpZmllZCBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0byB1c2UKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBNZXNzYWdlRGlnZXN0fSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIGFsZ29yaXRobQorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VEaWdlc3QgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtODEsOCArOTcsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBNZXNzYWdlRGlnZXN0fSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqIHNwZWNpZmllZCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gdG8gdXNlCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXIKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBNZXNzYWdlRGlnZXN0fSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBpcyBub3QgYXZhaWxhYmxlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZURpZ2VzdCBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CkBAIC05NywyMCArMTI3LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBNZXNzYWdlRGlnZXN0IHdoaWNoIGlzIGNhcGFibGUgb2YgcnVubmluZyB0aGUgYWxnb3JpdGhtCi0gICAgICogZGVzY3JpYmVkIGJ5IHRoZSBhcmd1bWVudC4gVGhlIHJlc3VsdCB3aWxsIGJlIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3MKLSAgICAgKiBvZiBNZXNzYWdlRGlnZXN0IHdoaWNoIGltcGxlbWVudHMgdGhhdCBhbGdvcml0aG0uCi0gICAgICogCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgTWVzc2FnZURpZ2VzdH0gdGhhdCB1dGlsaXplcyB0aGUKKyAgICAgKiBzcGVjaWZpZWQgYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIE5hbWUgb2YgdGhlIGFsZ29yaXRobSBkZXNpcmVkCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIHRvIHVzZQogICAgICAqIEBwYXJhbSBwcm92aWRlcgotICAgICAqICAgICAgICAgICAgUHJvdmlkZXIgUHJvdmlkZXIgd2hpY2ggaGFzIHRvIGltcGxlbWVudCB0aGUgYWxnb3JpdGhtCi0gICAgICogQHJldHVybiBNZXNzYWdlRGlnZXN0IGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBhbGdvcml0aG0KLSAgICAgKiAgICAgICAgIGRlc2lyZWQuCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGUgYWxnb3JpdGhtIGNhbm5vdCBiZSBmb3VuZAorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgTWVzc2FnZURpZ2VzdH0gdGhhdCB1dGlsaXplcyB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZURpZ2VzdCBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBQcm92aWRlciBwcm92aWRlcikKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTM2LDM0ICsxNjYsNDEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQotICAgIC8vIFJlbW92ZWQgQHNlZSB0YWcgdGhhdCBkaWRuJ3Qgc2VlbSB0byBhY3R1YWxseSByZWZlciB0byBhbnl0aGluZy4KLSAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCi0gICAgCiAgICAgLyoqCi0gICAgICogUHV0cyB0aGUgcmVjZWl2ZXIgYmFjayBpbiBhbiBpbml0aWFsIHN0YXRlLCBzdWNoIHRoYXQgaXQgaXMgcmVhZHkgdG8KLSAgICAgKiBjb21wdXRlIGEgbmV3IGhhc2guCisgICAgICogUHV0cyB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0fSBiYWNrIGluIGFuIGluaXRpYWwgc3RhdGUsIHN1Y2ggdGhhdCBpdCBpcworICAgICAqIHJlYWR5IHRvIGNvbXB1dGUgYSBvbmUgd2F5IGhhc2ggdmFsdWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIGVuZ2luZVJlc2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5jbHVkZXMgdGhlIGFyZ3VtZW50IGluIHRoZSBoYXNoIHZhbHVlIGNvbXB1dGVkCi0gICAgICogYnkgdGhlIHJlY2VpdmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZzAgYnl0ZQotICAgICAqICAgICAgICAgICAgIHRoZSBieXRlIHRvIGZlZWQgdG8gdGhlIGhhc2ggYWxnb3JpdGhtCi0gICAgICoKKyAgICAgKiBVcGRhdGVzIHRoaXMge0Bjb2RlIE1lc3NhZ2VEaWdlc3R9IHVzaW5nIHRoZSBnaXZlbiB7QGNvZGUgYnl0ZX0uCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gdG8gdXBkYXRlIHRoaXMge0Bjb2RlIE1lc3NhZ2VEaWdlc3R9IHdpdGgKICAgICAgKiBAc2VlICNyZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKGJ5dGUgYXJnMCkgewogICAgICAgICBlbmdpbmVVcGRhdGUoYXJnMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0fSB1c2luZyB0aGUgZ2l2ZW4ge0Bjb2RlIGJ5dGVbXX0uCisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IGFycmF5CisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHtAY29kZSBpbnB1dH0gdG8gdXBkYXRlIGZyb20KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHtAY29kZSBpbnB1dH0gdG8gdXBkYXRlIGZyb20KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXR9IG9yIHtAY29kZSBsZW59IGFyZSBub3QgdmFsaWQgaW4gcmVzcGVjdCB0bworICAgICAqICAgICAgICAgICAgIHtAY29kZSBpbnB1dH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CiAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsIHx8CkBAIC0xNzgsOCArMjE1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0fSB1c2luZyB0aGUgZ2l2ZW4ge0Bjb2RlIGJ5dGVbXX0uCisgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IGFycmF5CisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBpbnB1dH0gaXMge0Bjb2RlIG51bGx9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKGJ5dGVbXSBpbnB1dCkgewogICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewpAQCAtMTg5LDIwICsyMzEsMzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZmluYWwgaGFzaCB2YWx1ZSB0aGF0IHRoZSByZWNlaXZlciByZXByZXNlbnRzLgorICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBmaW5hbCBoYXNoIHZhbHVlIGZvciB0aGlzIHtAbGluayBNZXNzYWdlRGlnZXN0fS4KICAgICAgKiBBZnRlciB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkIHRoZSByZWNlaXZlciBpcyByZXNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIHRoZSByZWNlaXZlciBjb21wdXRlZAotICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIG9uZSB3YXkgaGFzaCB2YWx1ZQogICAgICAqIEBzZWUgI3Jlc2V0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBkaWdlc3QoKSB7CiAgICAgICAgIHJldHVybiBlbmdpbmVEaWdlc3QoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb21wdXRlcyBhbmQgc3RvcmVzIHRoZSBmaW5hbCBoYXNoIHZhbHVlIGZvciB0aGlzIHtAbGluayBNZXNzYWdlRGlnZXN0fS4KKyAgICAgKiBBZnRlciB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkIHRoZSByZWNlaXZlciBpcyByZXNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHQKKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgaW4ge0Bjb2RlIGJ1Zn0gdG8gc3RvcmUKKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgdGhlIGRpZ2VzdAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHtAY29kZSBidWZ9CisgICAgICogQHRocm93cyBEaWdlc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cmVzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0fSBvciB7QGNvZGUgbGVufSBhcmUgbm90IHZhbGlkIGluIHJlc3BlY3QgdG8KKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgYnVmfQorICAgICAqIEBzZWUgI3Jlc2V0KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGRpZ2VzdChieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgRGlnZXN0RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsIHx8CkBAIC0yMTcsOCArMjc0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUGVyZm9ybXMgdGhlIGZpbmFsIHVwZGF0ZSBhbmQgdGhlbiBjb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZmluYWwgaGFzaAorICAgICAqIHZhbHVlIGZvciB0aGlzIHtAbGluayBNZXNzYWdlRGlnZXN0fS4gQWZ0ZXIgdGhlIGRpZ2VzdCBpcyBjb21wdXRlZCB0aGUKKyAgICAgKiByZWNlaXZlciBpcyByZXNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wdXRlZCBvbmUgd2F5IGhhc2ggdmFsdWUKKyAgICAgKiBAc2VlICNyZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBkaWdlc3QoYnl0ZVtdIGlucHV0KSB7CiAgICAgICAgIHVwZGF0ZShpbnB1dCk7CkBAIC0yMjYsMjUgKzI5MCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMKKyAgICAgKiB7QGNvZGUgTWVzc2FnZURpZ2VzdH0gaW5jbHVkaW5nIHRoZSBuYW1lIG9mIGl0cyBhbGdvcml0aG0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMge0Bjb2RlIE1lc3NhZ2VEaWdlc3R9CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJNRVNTQUdFIERJR0VTVCAiICsgYWxnb3JpdGhtOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRG9lcyBhIHNpbXBseSBieXRlLXBlci1ieXRlIGNvbXBhcmUgb2YgdGhlIHR3byBkaWdlc3RzLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpZ2VzdCBhcmUgZXF1YWwgYnkgcGVyZm9ybWluZyBhIHNpbXBseQorICAgICAqIGJ5dGUtcGVyLWJ5dGUgY29tcGFyZSBvZiB0aGUgdHdvIGRpZ2VzdHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRpZ2VzdGEKLSAgICAgKiAgICAgICAgICAgIE9uZSBvZiB0aGUgZGlnZXN0cyB0byBjb21wYXJlCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgZGlnZXN0IHRvIGJlIGNvbXBhcmVkCiAgICAgICogQHBhcmFtIGRpZ2VzdGIKLSAgICAgKiAgICAgICAgICAgIFRoZSBkaWdlc3QgdG8gY29tcGFyZSB0bwotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBoYXNoZXMgYXJlIGVxdWFsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHR3byBoYXNoZXMgYXJlIG5vdCBlcXVhbAorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBkaWdlc3QgdG8gYmUgY29tcGFyZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdHdvIGhhc2hlcyBhcmUgZXF1YWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXF1YWwoYnl0ZVtdIGRpZ2VzdGEsIGJ5dGVbXSBkaWdlc3RiKSB7CiAgICAgICAgIGlmIChkaWdlc3RhLmxlbmd0aCAhPSBkaWdlc3RiLmxlbmd0aCkgewpAQCAtMjU5LDI5ICszMjQsMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBKYXZhIFNlY3VyaXR5IG5hbWUgZm9yIHRoZSBhbGdvcml0aG0gYmVpbmcgdXNlZCBieQotICAgICAqIHRoZSByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gb2YgdGhpcyB7QGNvZGUgTWVzc2FnZURpZ2VzdH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobQorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBvZiB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0fQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gYWxnb3JpdGhtOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFByb3ZpZGVyIG9mIHRoZSBkaWdlc3QgcmVwcmVzZW50ZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFByb3ZpZGVyIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgamF2YS5zZWN1cml0eS5Qcm92aWRlcgorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0fQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlciBnZXRQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZW5naW5lIGRpZ2VzdCBsZW5ndGggaW4gYnl0ZXMuIERlZmF1bHQgaXMgMC4KKyAgICAgKiBSZXR1cm5zIHRoZSBlbmdpbmUgZGlnZXN0IGxlbmd0aCBpbiBieXRlcy4gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90CisgICAgICogaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gb3IgaXMgbm90IGFuIGluc3RhbmNlIG9mIHtAY29kZSBDbG9uZWFibGV9LAorICAgICAqIHtAY29kZSAwfSBpcyByZXR1cm5lZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCB0aGUgZW5naW5lIGRpZ2VzdCBsZW5ndGggaW4gYnl0ZXMKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBkaWdlc3QgbGVuZ3RoIGluIGJ5dGVzLCBvciB7QGNvZGUgMH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldERpZ2VzdExlbmd0aCgpIHsKICAgICAgICAgaW50IGwgPSBlbmdpbmVHZXREaWdlc3RMZW5ndGgoKTsKQEAgLTI5OSwxMCArMzY3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAotICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENsb25lYWJsZSkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CkBAIC0zMTIsOCArMzc2LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0fSB1c2luZyB0aGUgZ2l2ZW4ge0Bjb2RlIGlucHV0fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQnl0ZUJ1ZmZlcn0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoQnl0ZUJ1ZmZlciBpbnB1dCkgewogICAgICAgICBlbmdpbmVVcGRhdGUoaW5wdXQpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3RTcGkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0U3BpLmphdmEKaW5kZXggM2Q0NGZiMS4uYWU1ZWQzMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3RTcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdFNwaS5qYXZhCkBAIC0yNiw0MSArMjYsNjAgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKLQogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgU2VydmljZSBQcm92aWRlciBJbnRlcmZhY2UgKHRoZXJlZm9yZSB0aGUgU3BpIHN1ZmZpeCkgZm9yCi0gKiBkaWdlc3QgYWxnb3JpdGhtcyB0byBiZSBzdXBwbGllZCBieSBwcm92aWRlcnMuIEV4YW1wbGVzIG9mIGRpZ2VzdCBhbGdvcml0aG1zCi0gKiBhcmUgTUQ1IGFuZCBTSEEuCisgKiB7QGNvZGUgTWVzc2FnZURpZ2VzdFNwaX0gaXMgdGhlIFNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlIChTUEkpIGRlZmluaXRpb24KKyAqIGZvciB7QGxpbmsgTWVzc2FnZURpZ2VzdH0uIEV4YW1wbGVzIG9mIGRpZ2VzdCBhbGdvcml0aG1zIGFyZSBNRDUgYW5kIFNIQS4gQQorICogZGlnZXN0IGlzIGEgc2VjdXJlIG9uZSB3YXkgaGFzaCBmdW5jdGlvbiBmb3IgYSBzdHJlYW0gb2YgYnl0ZXMuIEl0IGFjdHMgbGlrZQorICogYSBmaW5nZXJwcmludCBmb3IgYSBzdHJlYW0gb2YgYnl0ZXMuCiAgKiAKLSAqIEEgZGlnZXN0IGlzIGEgc2VjdXJlIGhhc2ggZnVuY3Rpb24gZm9yIGEgc3RyZWFtIG9mIGJ5dGVzLCBsaWtlIGEgZmluZ2VycHJpbnQKLSAqIGZvciB0aGUgc3RyZWFtIG9mIGJ5dGVzLgotICogCisgKiBAc2VlIE1lc3NhZ2VEaWdlc3QKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVzc2FnZURpZ2VzdFNwaSB7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBlbmdpbmUgZGlnZXN0IGxlbmd0aCBpbiBieXRlcy4gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90CisgICAgICogaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24ge0Bjb2RlIDB9IGlzIHJldHVybmVkLgogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRpZ2VzdCBsZW5ndGggaW4gYnl0ZXMsIG9yIHtAY29kZSAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldERpZ2VzdExlbmd0aCgpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVXBkYXRlcyB0aGlzIHtAY29kZSBNZXNzYWdlRGlnZXN0U3BpfSB1c2luZyB0aGUgZ2l2ZW4ge0Bjb2RlIGJ5dGV9LgogICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBieXRlfSB0byB1cGRhdGUgdGhpcyB7QGNvZGUgTWVzc2FnZURpZ2VzdFNwaX0gd2l0aC4KKyAgICAgKiBAc2VlICNlbmdpbmVSZXNldCgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lVXBkYXRlKGJ5dGUgaW5wdXQpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBVcGRhdGVzIHRoaXMge0Bjb2RlIE1lc3NhZ2VEaWdlc3RTcGl9IHVzaW5nIHRoZSBnaXZlbiB7QGNvZGUgYnl0ZVtdfS4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHtAY29kZSBpbnB1dH0gdG8gdXBkYXRlIGZyb20uCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBpbiB7QGNvZGUgaW5wdXR9IHRvIHVwZGF0ZSBmcm9tLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gb3Ige0Bjb2RlIGxlbn0gYXJlIG5vdCB2YWxpZCBpbiByZXNwZWN0IHRvCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGlucHV0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFVwZGF0ZXMgdGhpcyB7QGNvZGUgTWVzc2FnZURpZ2VzdFNwaX0gdXNpbmcgdGhlIGdpdmVuIHtAY29kZSBpbnB1dH0uCiAgICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEJ5dGVCdWZmZXJ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZShCeXRlQnVmZmVyIGlucHV0KSB7CiAgICAgICAgIGlmICghaW5wdXQuaGFzUmVtYWluaW5nKCkpIHsKQEAgLTgyLDE0ICsxMDEsMzUgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZmluYWwgaGFzaCB2YWx1ZSBmb3IgdGhpcworICAgICAqIHtAbGluayBNZXNzYWdlRGlnZXN0U3BpfS4gQWZ0ZXIgdGhlIGRpZ2VzdCBpcyBjb21wdXRlZCB0aGUgcmVjZWl2ZXIgaXMKKyAgICAgKiByZXNldC4KICAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wdXRlZCBvbmUgd2F5IGhhc2ggdmFsdWUuCisgICAgICogQHNlZSAjZW5naW5lUmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gZW5naW5lRGlnZXN0KCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb21wdXRlcyBhbmQgc3RvcmVzIHRoZSBmaW5hbCBoYXNoIHZhbHVlIGZvciB0aGlzCisgICAgICoge0BsaW5rIE1lc3NhZ2VEaWdlc3RTcGl9LiBBZnRlciB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkIHRoZSByZWNlaXZlciBpcworICAgICAqIHJlc2V0LgogICAgICAqIAorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgaW4ge0Bjb2RlIGJ1Zn0gdG8gc3RvcmUgaW4uCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgZm9yIHRoZSBkaWdlc3QuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8ge0Bjb2RlIGJ1Zn0uCisgICAgICogQHRocm93cyBEaWdlc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cmVzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gb3Ige0Bjb2RlIGxlbn0gYXJlIG5vdCB2YWxpZCBpbiByZXNwZWN0IHRvCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGJ1Zn0uCisgICAgICogQHNlZSAjZW5naW5lUmVzZXQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZW5naW5lRGlnZXN0KGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW4pCiAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEaWdlc3RFeGNlcHRpb24gewpAQCAtMTE0LDE1ICsxNTQsMTMgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBQdXRzIHRoaXMge0Bjb2RlIE1lc3NhZ2VEaWdlc3RTcGl9IGJhY2sgaW4gYW4gaW5pdGlhbCBzdGF0ZSwgc3VjaCB0aGF0IGl0CisgICAgICogaXMgcmVhZHkgdG8gY29tcHV0ZSBhIG9uZSB3YXkgaGFzaCB2YWx1ZS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVSZXNldCgpOwogICAgIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogCi0gICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb24uamF2YQppbmRleCA5ODY1MGMyLi4zMzI0MDc2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbi5qYXZhCkBAIC0yMyw0NiArMjMsNTYgQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgdGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFjY2VzcyBhbgotICogYWxnb3JpdGhtIHdoaWNoIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgbGlicmFyeS4KKyAqIHtAY29kZSBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb259IGluZGljYXRlcyB0aGF0IGEgcmVxdWVzdGVkIGFsZ29yaXRobSBjb3VsZAorICogbm90IGJlIGZvdW5kLgogICogCi0gKiBAc2VlIFRocm93YWJsZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZXh0ZW5kcyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzQ0Mzk0NzQ4NzIxODM0NjU2Mkw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCi0gICAgICogCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb259LgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZ2l2ZW4gbWVzc2FnZSBhbmQgdGhlIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBpcyB0aGUgY2F1c2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb259IHdpdGggdGhlCisgICAgICogY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHdoaWNoIGlzIHRoZSBjYXVzZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIoY2F1c2UpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24uamF2YQppbmRleCA1NzEwOTE2Li5mMDE2Y2U2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24uamF2YQpAQCAtMjMsMzIgKzIzLDMxIEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHRocm93biB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhY2Nlc3MgYQotICogcHJvdmlkZXIgYnkgbmFtZSB3aGljaCBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KKyAqIHtAY29kZSBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbn0gaW5kaWNhdGVzIHRoYXQgYSByZXF1ZXN0ZWQgc2VjdXJpdHkgcHJvdmlkZXIKKyAqIGNvdWxkIG5vdCBiZSBmb3VuZC4KICAqIAotICogCi0gKiBAc2VlIFRocm93YWJsZQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg0ODgxMTE3NTY2ODg1MzQ0NzRMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uLmphdmEKaW5kZXggZGU5MWZjNC4uOTNlNzY5YyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbi5qYXZhCkBAIC0yNSw4MSArMjUsMTE2IEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBhbGwgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgcGVybWlzc2lvbiB0byBhY2Nlc3MKLSAqIHN5c3RlbSByZXNvdXJjZXMuCisgKiB7QGNvZGUgUGVybWlzc2lvbn0gaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIG9mIGFsbCBwZXJtaXNzaW9ucyB0aGF0CisgKiBwYXJ0aWNpcGF0ZSBpbiB0aGUgYWNjZXNzIGNvbnRyb2wgc2VjdXJpdHkgZnJhbWV3b3JrIGFyb3VuZAorICoge0BsaW5rIEFjY2Vzc0NvbnRyb2xsZXJ9IGFuZCB7QGxpbmsgQWNjZXNzQ29udHJvbENvbnRleHR9LiBBIHBlcm1pc3Npb24KKyAqIGNvbnN0aXR1dGVzIG9mIGEgbmFtZSBhbmQgYXNzb2NpYXRlZCBhY3Rpb25zLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcm1pc3Npb24gaW1wbGVtZW50cyBHdWFyZCwgU2VyaWFsaXphYmxlIHsKIAotICAgIC8qKiAKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTYzNjU3MDIyMjIzMTU5NjY3NEw7CiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogCi0gICAgLyoqIAotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyB7QGNvZGUgUGVybWlzc2lvbn0gZm9yIGVxdWFsaXR5CisgICAgICogYW5kIHJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsLCB7QGNvZGUgZmFsc2V9CisgICAgICogb3RoZXJ3aXNlLgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGxpbmsgI2ltcGxpZXMoUGVybWlzc2lvbil9IG1ldGhvZCBzaG91bGQgYmUgdXNlZCBmb3IgbWFraW5nIGFjY2VzcworICAgICAqIGNvbnRyb2wgY2hlY2tzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFBlcm1pc3Npb259LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBQZXJtaXNzaW9ufSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIG9iamVjdHMgd2hpY2gKLSAgICAgKiBhbnN3ZXIgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gPGNvZGU+LmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIHtAY29kZSBQZXJtaXNzaW9ufS4gUmV0dXJucyB0aGUgc2FtZQorICAgICAqIGhhc2ggY29kZSBmb3Ige0Bjb2RlIFBlcm1pc3Npb259cyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGFzCisgICAgICogcmVxdWlyZWQgYnkgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2Yge0BsaW5rIE9iamVjdCNoYXNoQ29kZX0uCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBpbnQgdGhlIHJlY2VpdmVyJ3MgaGFzaC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIFBlcm1pc3Npb259LgorICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCisgICAgICogQHNlZSBQZXJtaXNzaW9uI2VxdWFscyhPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBoYXNoQ29kZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLiBTdWJjbGFzc2VzIHNob3VsZAotICAgICAqIHJldHVybiB0aGVpciBhY3Rpb25zIGluIGNhbm9uaWNhbCBmb3JtLiBJZiBubyBhY3Rpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiB0aGUgcmVjZWl2ZXIsIHRoZSBlbXB0eSBzdHJpbmcgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqIFJldHVybnMgYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgcGVybWlzc2lvbi4gVGhlIHJldHVybmVkIGFjdGlvbnMgYXJlIGluIGNhbm9uaWNhbCBmb3JtLiBGb3IgZXhhbXBsZToKICAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqIHNwMCA9IG5ldyBTb2NrZXRQZXJtaXNzaW9uKCZxdW90O3d3dy5nb29nbGUuY29tJnF1b3Q7LCAmcXVvdDtjb25uZWN0LHJlc29sdmUmcXVvdDspCisgICAgICogc3AxID0gbmV3IFNvY2tldFBlcm1pc3Npb24oJnF1b3Q7d3d3Lmdvb2dsZS5jb20mcXVvdDssICZxdW90O3Jlc29sdmUsY29ubmVjdCZxdW90OykKKyAgICAgKiBzcDAuZ2V0QWN0aW9ucygpLmVxdWFscyhzcDEuZ2V0QWN0aW9ucygpKSAvL3lpZWxkcyB0cnVlCisgICAgICogPC9wcmU+CiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIHJlY2VpdmVyJ3MgYWN0aW9ucy4KKyAgICAgKiBCb3RoIHBlcm1pc3Npb25zIHJldHVybiAiY29ubmVjdCxyZXNvbHZlIiAoaW4gdGhhdCBvcmRlcikgaWYge0Bjb2RlCisgICAgICogI2dldEFjdGlvbnMoKX0gaXMgaW52b2tlZC4gUmV0dXJucyBhbiBlbXB0eSBTdHJpbmcsIGlmIG5vIGFjdGlvbnMgYXJlCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGVybWlzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBlcm1pc3Npb24gb3IgYW4gZW1wdHkgc3RyaW5nIGlmCisgICAgICogICAgICAgICBubyBhY3Rpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QWN0aW9ucygpOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGUgcmVjZWl2ZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhpcyBwZXJtaXNzaW9uLgorICAgICAqIFRoZSB7QGxpbmsgQWNjZXNzQ29udHJvbGxlcn0gdXNlcyB0aGlzIG1ldGhvZCB0byBjaGVjayB3aGV0aGVyIHBlcm1pc3Npb24KKyAgICAgKiBwcm90ZWN0ZWQgYWNjZXNzIGlzIGFsbG93ZWQgd2l0aCB0aGUgcHJlc2VudCBwb2xpY3kuCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQKLSAgICAgKiAgICAgICAgIGJ5IHRoZSByZWNlaXZlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QuCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIFBlcm1pc3Npb24gdGhlIHBlcm1pc3Npb24gdG8gY2hlY2suCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBjaGVjayBhZ2FpbnN0IHRoaXMgcGVybWlzc2lvbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGlzCisgICAgICogICAgICAgICBwZXJtaXNzaW9uLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcGVybWlzc2lvbik7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgbmFtZSBzZXQgdG8gdGhlCi0gICAgICogYXJndW1lbnQuCi0gICAgICogCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgUGVybWlzc2lvbn0gd2l0aCBpdHMgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGVybWlzc2lvbi4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgcmVjZWl2ZXIncyBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfQogCi0gICAgLyoqIAotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgIC8qKgorICAgICAqIEludm9rZXMge0BsaW5rIFNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbil9IHdpdGggdGhpcworICAgICAqIHBlcm1pc3Npb24gYXMgaXRzIGFyZ3VtZW50LiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgR3VhcmR9CisgICAgICogaW50ZXJmYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIGFzIHNwZWNpZmllZCBpbiB7QGxpbmsgR3VhcmQjY2hlY2tHdWFyZChPYmplY3QpfSBidXQgaWdub3JlZAorICAgICAqICAgICAgICAgICAgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBwZXJtaXNzaW9uIGlzIG5vdCBncmFudGVkLgorICAgICAqIEBzZWUgR3VhcmQKKyAgICAgKiBAc2VlIFNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbikKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGVja0d1YXJkKE9iamVjdCBvYmopIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTEwOSwxMiArMTQ0LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgaG9sZGluZyBwZXJtaXNzaW9ucyBvZiB0aGlzIGNsYXNzLgotICAgICAqIEFuc3dlciBudWxsIGlmIGFueSBwZXJtaXNzaW9uIGNvbGxlY3Rpb24gY2FuIGJlIHVzZWQuCisgICAgICogUmV0dXJucyBhIHNwZWNpZmljIHtAbGluayBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gY29udGFpbmVyIGZvciBwZXJtaXNzaW9ucworICAgICAqIG9mIHRoaXMgdHlwZS4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgYW55IHBlcm1pc3Npb24gY29sbGVjdGlvbiBjYW4gYmUKKyAgICAgKiB1c2VkLgorICAgICAqIDxwPgorICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbiBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uCisgICAgICogZm9yIHRoZSBzcGVjaWZpYyBwZXJtaXNzaW9ucyB0aGV5IGltcGxlbWVudC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBQZXJtaXNzaW9uQ29sbGVjdGlvbiBvciBudWxsIGEgc3VpdGFibGUgcGVybWlzc2lvbiBjb2xsZWN0aW9uIGZvcgotICAgICAqICAgICAgICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBvZiB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhbiBlbXB0eSB7QGxpbmsgUGVybWlzc2lvbkNvbGxlY3Rpb259IG9yIHtAY29kZSBudWxsfSBpZiBhbnkKKyAgICAgKiAgICAgICAgIHBlcm1pc3Npb24gY29sbGVjdGlvbiBjYW4gYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTIyLDEwICsxNjIsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgorICAgICAqIHRoaXMge0Bjb2RlIFBlcm1pc3Npb259IGluY2x1ZGluZyBpdHMgbmFtZSBhbmQgaXRzIGFjdGlvbnMuCiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBQZXJtaXNzaW9ufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgYWN0aW9ucyA9IGdldEFjdGlvbnMoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKaW5kZXggYTBjZGEyNS4uMjUwMjEyMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKQEAgLTI4LDgxICsyOCw4OCBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIEFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgY2xhc3NlcyB3aGljaCBhcmUgY29sbGVjdGlvbnMgb2YgUGVybWlzc2lvbiBvYmplY3RzLgorICoge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBjb2xsZWN0aW9ucworICogdGhhdCBwcm92aWRlIGEgY29udmVuaWVudCBtZXRob2QgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4KKyAqIHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSBhbnkgb2YgdGhlIHBlcm1pc3Npb25zIHByZXNlbnQgaW4gdGhpcyBjb2xsZWN0aW9uLgorICogPHA+CisgKiBBIHtAY29kZSBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gaXMgdHlwaWNhbGx5IGNyZWF0ZWQgYnkgdXNpbmcgdGhlCisgKiB7QGxpbmsgUGVybWlzc2lvbiNuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpfSBmYWN0b3J5IG1ldGhvZC4gSWYgdGhlIG1lbnRpb25lZAorICogbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9LCB0aGVuIGEge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSBvZiBhbnkgdHlwZQorICogY2FuIGJlIHVzZWQuIElmIGEgY29sbGVjdGlvbiBpcyByZXR1cm5lZCwgaXQgbXVzdCBiZSB1c2VkIGZvciBob2xkaW5nIHNldmVyYWwKKyAqIHBlcm1pc3Npb25zIG9mIHRoZSBwYXJ0aWN1bGFyIHR5cGUuCisgKiA8L3A+CisgKiA8cD4KKyAqIFN1YmNsYXNzZXMgbXVzdCBiZSBpbXBsZW1lbnRlZCB0aHJlYWQgc2F2ZS4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02NzI3MDExMzI4OTQ2ODYxNzgzTDsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5OyAvLyA9IGZhbHNlOwogCiAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24uCi0gICAgICogCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHtAY29kZSBQZXJtaXNzaW9ufSB0byB0aGlzIGNvbGxlY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgcGVybWlzc2lvbiB0byBhZGQgdG8gdGhlCi0gICAgICogICAgICAgICAgICBjb2xsZWN0aW9uLgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNvbGxlY3Rpb24gaXMgcmVhZCBvbmx5LgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQZXJtaXNzaW9ufSB0byBhZGQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29sbGVjdGlvbiBpcyByZWFkIG9ubHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkKFBlcm1pc3Npb24gcGVybWlzc2lvbik7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvdmVyIGFsbCB7QGxpbmsgUGVybWlzc2lvbn1zIGVuY2Fwc3VsYXRlZCBieSB0aGlzCisgICAgICoge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvdmVyIGFsbCB7QGxpbmsgUGVybWlzc2lvbn1zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBFbnVtZXJhdGlvbjxQZXJtaXNzaW9uPiBlbGVtZW50cygpOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGUgcGVybWlzc2lvbnMKLSAgICAgKiBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoaXMge0Bjb2RlCisgICAgICogUGVybWlzc2lvbkNvbGxlY3Rpb259LgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgcGVybWlzc2lvbiBpcyBpbXBsaWVkCi0gICAgICogICAgICAgICBieSB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIHJlY2VpdmVyLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmCi0gICAgICogICAgICAgICBpdCBpcyBub3QuCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgcGVybWlzc2lvbiB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIHBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGUKKyAgICAgKiAgICAgICAgIHBlcm1pc3Npb25zIGluIHRoaXMgY29sbGVjdGlvbiwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgbmV3IHBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCB0byB0aGUgcmVjZWl2ZXIuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgbmV3IHBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCB0byB0aGlzIHtAY29kZQorICAgICAqIFBlcm1pc3Npb25Db2xsZWN0aW9ufS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlY2VpdmVyIGlzIHJlYWQgb25seQotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5ldyBlbGVtZW50cyBjYW4gc3RpbGwgYmUgYWRkZWQgdG8gdGhlCi0gICAgICogICAgICAgICByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVjZWl2ZXIgaXMgcmVhZCBvbmx5LCB7QGNvZGUgZmFsc2V9IGlmIG5ldworICAgICAqICAgICAgICAgZWxlbWVudHMgY2FuIHN0aWxsIGJlIGFkZGVkIHRvIHRoaXMge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewogICAgICAgICByZXR1cm4gcmVhZE9ubHk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTWFya3MgdGhlIHJlY2VpdmVyIGFzIHJlYWQgb25seSwgc28gdGhhdCBubyBuZXcgcGVybWlzc2lvbnMgY2FuIGJlIGFkZGVkCi0gICAgICogdG8gaXQuCisgICAgICogTWFya3MgdGhpcyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGFzIHJlYWQgb25seSwgc28gdGhhdCBubyBuZXcKKyAgICAgKiBwZXJtaXNzaW9ucyBjYW4gYmUgYWRkZWQgdG8gaXQuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoKSB7CiAgICAgICAgIHJlYWRPbmx5ID0gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICoge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIExpc3QgZWxpc3QgPSBuZXcgQXJyYXlMaXN0KDEwMCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbnMuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9ucy5qYXZhCmluZGV4IDkzZmFmMzMuLmI5YjEzYzYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9ucy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9ucy5qYXZhCkBAIC0zOCwxNSArMzgsMTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEEgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9uIG9mIHBlcm1pc3Npb25zLgorICoge0Bjb2RlIFBlcm1pc3Npb25zfSByZXByZXNlbnRzIGEge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSB3aGVyZSB0aGUKKyAqIGNvbnRhaW5lZCBwZXJtaXNzaW9ucyBjYW4gYmUgb2YgZGlmZmVyZW50IHR5cGVzLiBUaGUgcGVybWlzc2lvbnMgYXJlCisgKiBvcmdhbml6ZWQgaW4gdGhlaXIgYXBwcm9wcmlhdGUge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSBvYnRhaW5lZCBieQorICoge0BsaW5rIFBlcm1pc3Npb24jbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKX0uIEZvciBwZXJtaXNzaW9ucyB3aGljaCBkbyBub3QKKyAqIHByb3ZpZGUgYSBkZWRpY2F0ZWQge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSwgYSBkZWZhdWx0IHBlcm1pc3Npb24KKyAqIGNvbGxlY3Rpb24sIGJhc2VkIG9uIGEgaGFzaCB0YWJsZSwgd2lsbCBiZSB1c2VkLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFBlcm1pc3Npb25zIGV4dGVuZHMgUGVybWlzc2lvbkNvbGxlY3Rpb24gaW1wbGVtZW50cwogICAgIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ4NTg2MjIzNzA2MjM1MjQ2ODhMOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0gewpAQCAtNTYsMTggKzU5LDIxIEBACiAgICAgLy8gSGFzaCB0byBzdG9yZSBQZXJtaXNzaW9uQ29sbGVjdGlvbidzCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwIGtsYXNzZXMgPSBuZXcgSGFzaE1hcCgpOwogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gYWxsRW5hYmxlZDsgIC8vID0gZmFsc2U7CiAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBhcmd1bWVudCB0byB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiAKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiB7QGNvZGUgUGVybWlzc2lvbn0gdG8gdGhpcyBoZXRlcm9nZW5lb3VzIHtAY29kZQorICAgICAqIFBlcm1pc3Npb25Db2xsZWN0aW9ufS4gVGhlIHtAY29kZSBwZXJtaXNzaW9ufSBpcyBzdG9yZWQgaW4gaXRzCisgICAgICogYXBwcm9wcmlhdGUge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGVybWlzc2lvbgotICAgICAqICAgICAgICAgICAgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHRoZSBwZXJtaXNzaW9uIHRvIGFkZCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUGVybWlzc2lvbn0gdG8gYmUgYWRkZWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY29sbGVjdGlvbidzIHtAbGluayAjaXNSZWFkT25seSgpfSBtZXRob2QgcmV0dXJucworICAgICAqICAgICAgICAgICAgIHtAY29kZSB0cnVlfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBlcm1pc3Npb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CiAgICAgICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKQEAgLTEwMiwxMiArMTA4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgdGhlIHBlcm1pc3Npb25zIGluIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgcmVjZWl2ZXIuCi0gICAgICovCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFBlcm1pc3Npb24+IGVsZW1lbnRzKCkgewogICAgICAgICByZXR1cm4gbmV3IE1ldGFFbnVtZXJhdGlvbihrbGFzc2VzLnZhbHVlcygpLml0ZXJhdG9yKCkpOwogICAgIH0KQEAgLTE2OSwxNyArMTY5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhlIHBlcm1pc3Npb25zCi0gICAgICogY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IHBlcm1pc3Npb24gaXMgaW1wbGllZAotICAgICAqICAgICAgICAgYnkgdGhlIHBlcm1pc3Npb25zIGluIHRoZSByZWNlaXZlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZgotICAgICAqICAgICAgICAgaXQgaXMgbm90LgotICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uCi0gICAgICogICAgICAgICAgICBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gdGhlIHBlcm1pc3Npb24gdG8gY2hlY2sKLSAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewogICAgICAgICBpZiAocGVybWlzc2lvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBSSSBjb21wYXRpYmxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbnNIYXNoLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbnNIYXNoLmphdmEKaW5kZXggODc1YWJlNC4uNjlkMmIwNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25zSGFzaC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uc0hhc2guamF2YQpAQCAtMjgsMTIgKzI4LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBBIGRlZmF1bHQgUGVybWlzc2lvbkNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGEgaGFzaHRhYmxlLiBFYWNoCi0gKiBoYXNodGFibGUgZW50cnkgc3RvcmVzIGEgUGVybWlzc2lvbiBvYmplY3QgYXMgYm90aCB0aGUga2V5IGFuZCB0aGUgdmFsdWUuCi0gKiA8YnI+Ci0gKiBUaGlzIFBlcm1pc3Npb25Db2xsZWN0aW9uIGlzIGludGVuZGVkIGZvciBzdG9yaW5nICZxdW90O25ldXRyYWwmcXVvdDsKLSAqIHBlcm1pc3Npb25zIHdoaWNoIGRvIG5vdCByZXF1aXJlIHNwZWNpYWwgY29sbGVjdGlvbi4KKyAqIEEgZGVmYXVsdCB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBhIGhhc2h0YWJsZS4KKyAqIEVhY2ggaGFzaHRhYmxlIGVudHJ5IHN0b3JlcyBhIFBlcm1pc3Npb24gb2JqZWN0IGFzIGJvdGggdGhlIGtleSBhbmQgdGhlCisgKiB2YWx1ZS4gPGJyPgorICogVGhpcyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGlzIGludGVuZGVkIGZvciBzdG9yaW5nICZxdW90O25ldXRyYWwmcXVvdDsKKyAqIHBlcm1pc3Npb25zIHdoaWNoIGRvIG5vdCByZXF1aXJlIHNwZWNpYWwgY29sbGVjdGlvbi4gPC9icj4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIAogZmluYWwgY2xhc3MgUGVybWlzc2lvbnNIYXNoIGV4dGVuZHMgUGVybWlzc2lvbkNvbGxlY3Rpb24gewpAQCAtNTEsMTAgKzUyLDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhcmd1bWVudCB0byB0aGUgY29sbGVjdGlvbi4KICAgICAgKiAKLSAgICAgKiAKICAgICAgKiBAcGFyYW0gcGVybWlzc2lvbgotICAgICAqICAgICAgICAgICAgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHRoZSBwZXJtaXNzaW9uIHRvIGFkZCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9uIHRvIGFkZCB0byB0aGUgY29sbGVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CiAgICAgICAgIHBlcm1zLnB1dChwZXJtaXNzaW9uLCBwZXJtaXNzaW9uKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qb2xpY3kuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qb2xpY3kuamF2YQppbmRleCA5MTk4YmRlLi4yMWIxM2IwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUG9saWN5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1BvbGljeS5qYXZhCkBAIC0yOSw4ICsyOSwxOSBAQAogCiAKIC8qKgotICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCB0aGUgc3lzdGVtIHNlY3VyaXR5IHBvbGljeS4KKyAqIHtAY29kZSBQb2xpY3l9IGlzIHRoZSBjb21tb24gc3VwZXIgdHlwZSBvZiBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBhIHN5c3RlbQorICogc2VjdXJpdHkgcG9saWN5LiBUaGUge0Bjb2RlIFBvbGljeX0gc3BlY2lmaWVzIHdoaWNoIHBlcm1pc3Npb25zIGFwcGx5IHRvCisgKiB3aGljaCBjb2RlIHNvdXJjZXMuCisgKiA8cD4KKyAqIFRoZSBzeXN0ZW0gcG9saWN5IGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgdGhlIHtAY29kZSAncG9saWN5LnByb3ZpZGVyJ30KKyAqIHByb3BlcnR5IGluIHRoZSBmaWxlIG5hbWVkIHtAY29kZSBKQVZBX0hPTUUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHl9IHRvCisgKiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGRlc2lyZWQge0Bjb2RlIFBvbGljeX0uCisgKiA8L3A+CisgKiA8cD4KKyAqIE9ubHkgb25lIGluc3RhbmNlIG9mIGEge0Bjb2RlIFBvbGljeX0gaXMgYWN0aXZlIGF0IGFueSB0aW1lLgorICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFBvbGljeSB7CiAgICAgCkBAIC00OSwzOCArNjAsNDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBQb2xpY3kgYWN0aXZlUG9saWN5OwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFBlcm1pc3Npb25Db2xsZWN0aW9uIGRlc2NyaWJpbmcgd2hhdCBwZXJtaXNzaW9ucyBhcmUgYXZhaWxhYmxlCi0gICAgICogdG8gdGhlIGdpdmVuIENvZGVTb3VyY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VjdXJpdHkgcG9saWN5LgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGRlc2NyaWJpbmcgd2hhdCBwZXJtaXNzaW9ucyBhcmUKKyAgICAgKiBhbGxvd2VkIGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZSBDb2RlU291cmNlfSBiYXNlZCBvbiB0aGUgY3VycmVudAorICAgICAqIHNlY3VyaXR5IHBvbGljeS4KICAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IGNhbGxlZCBmb3IgY2xhc3NlcyB3aGljaCBhcmUgaW4KLSAgICAgKiB0aGUgc3lzdGVtIGRvbWFpbiAoaS5lLiBzeXN0ZW0gY2xhc3NlcykuIFN5c3RlbSBjbGFzc2VzIGFyZQotICAgICAqIDxlbT5hbHdheXM8L2VtPiBnaXZlbiBmdWxsIHBlcm1pc3Npb25zIChpLmUuIEFsbFBlcm1pc3Npb24pLiBUaGlzIGNhbgotICAgICAqIG5vdCBiZSBjaGFuZ2VkIGJ5IGluc3RhbGxpbmcgYSBuZXcgUG9saWN5LgotICAgICAqIAorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGZvciBjbGFzc2VzIHdoaWNoIGFyZSBpbiB0aGUgc3lzdGVtCisgICAgICogZG9tYWluIChpLmUuIHN5c3RlbSBjbGFzc2VzKS4gU3lzdGVtIGNsYXNzZXMgYXJlIGFsd2F5cyBnaXZlbgorICAgICAqIGZ1bGwgcGVybWlzc2lvbnMgKGkuZS4gQWxsUGVybWlzc2lvbikuIFRoaXMgY2FuIG5vdCBiZSBjaGFuZ2VkIGJ5CisgICAgICogaW5zdGFsbGluZyBhIG5ldyBwb2xpY3kuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjcwotICAgICAqICAgICAgICAgICAgQ29kZVNvdXJjZSB0aGUgY29kZSBzb3VyY2UgdG8gY29tcHV0ZSB0aGUgcGVybWlzc2lvbnMgZm9yLgotICAgICAqIEByZXR1cm4gUGVybWlzc2lvbkNvbGxlY3Rpb24gdGhlIHBlcm1pc3Npb25zIHRoZSBjb2RlIHNvdXJjZSBzaG91bGQgaGF2ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ29kZVNvdXJjZX0gdG8gY29tcHV0ZSB0aGUgcGVybWlzc2lvbnMgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIHBlcm1pc3Npb25zIHRoYXQgYXJlIGdyYW50ZWQgdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiAgICAgICAgIENvZGVTb3VyY2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQZXJtaXNzaW9uQ29sbGVjdGlvbiBnZXRQZXJtaXNzaW9ucyhDb2RlU291cmNlIGNzKTsKIAogICAgIC8qKgotICAgICAqIFJlbG9hZHMgdGhlIHBvbGljeSBjb25maWd1cmF0aW9uLCBkZXBlbmRpbmcgb24gaG93IHRoZSB0eXBlIG9mIHNvdXJjZQotICAgICAqIGxvY2F0aW9uIGZvciB0aGUgcG9saWN5IGluZm9ybWF0aW9uLgorICAgICAqIFJlbG9hZHMgdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHtAY29kZSBQb2xpY3l9IGluc3RhbmNlLgogICAgICAqIAotICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZnJlc2goKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBQZXJtaXNzaW9uQ29sbGVjdGlvbiBkZXNjcmliaW5nIHdoYXQgcGVybWlzc2lvbnMgYXJlIGF2YWlsYWJsZQotICAgICAqIHRvIHRoZSBnaXZlbiBQcm90ZWN0aW9uRG9tYWluIChtb3JlIHNwZWNpZmljYWxseSwgaXRzIENvZGVTb3VyY2UpIGJhc2VkCi0gICAgICogb24gdGhlIGN1cnJlbnQgc2VjdXJpdHkgcG9saWN5LgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGRlc2NyaWJpbmcgd2hhdCBwZXJtaXNzaW9ucyBhcmUKKyAgICAgKiBhbGxvd2VkIGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufSAobW9yZSBzcGVjaWZpY2FsbHksCisgICAgICogaXRzIHtAY29kZSBDb2RlU291cmNlfSkgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VjdXJpdHkgcG9saWN5LgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBub3Q8IGNhbGxlZCBmb3IgY2xhc3NlcyB3aGljaCBhcmUgaW4gdGhlCisgICAgICogc3lzdGVtIGRvbWFpbiAoaS5lLiBzeXN0ZW0gY2xhc3NlcykuIFN5c3RlbSBjbGFzc2VzIGFyZSBhbHdheXMKKyAgICAgKiBnaXZlbiBmdWxsIHBlcm1pc3Npb25zIChpLmUuIEFsbFBlcm1pc3Npb24pLiBUaGlzIGNhbiBub3QgYmUgY2hhbmdlZCBieQorICAgICAqIGluc3RhbGxpbmcgYSBuZXcgcG9saWN5LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZG9tYWluCi0gICAgICogICAgICAgICAgICBQcm90ZWN0aW9uRG9tYWluIHRoZSBwcm90ZWN0aW9uIGRvbWFpbiB0byBjb21wdXRlIHRoZQotICAgICAqICAgICAgICAgICAgcGVybWlzc2lvbnMgZm9yLgotICAgICAqIEByZXR1cm4gUGVybWlzc2lvbkNvbGxlY3Rpb24gdGhlIHBlcm1pc3Npb25zIHRoZSBjb2RlIHNvdXJjZSBzaG91bGQgaGF2ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0gdG8gY29tcHV0ZSB0aGUgcGVybWlzc2lvbnMgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIHBlcm1pc3Npb25zIHRoYXQgYXJlIGdyYW50ZWQgdG8gdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiAgICAgICAgIENvZGVTb3VyY2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBnZXRQZXJtaXNzaW9ucyhQcm90ZWN0aW9uRG9tYWluIGRvbWFpbikgewogICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKQEAgLTkwLDE0ICsxMTAsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFBlcm1pc3Npb24gaXMgaW1wbGllZCBieSB0aGUgUGVybWlzc2lvbkNvbGxlY3Rpb24gb2YKLSAgICAgKiB0aGUgUHJvdGVjdGlvbiBEb21haW4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHtAY29kZSBQZXJtaXNzaW9ufSBpcyBpbXBsaWVkIGJ5IHRoZQorICAgICAqIHtAY29kZSBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGRvbWFpbgotICAgICAqICAgICAgICAgICAgUHJvdGVjdGlvbkRvbWFpbiBmb3Igd2hpY2ggUGVybWlzc2lvbiB0byBiZSBjaGVja2VkCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IGZvciB3aGljaCB0aGUgcGVybWlzc2lvbiBzaG91bGQKKyAgICAgKiAgICAgICAgICAgIGJlIGdyYW50ZWQuCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIFBlcm1pc3Npb24gZm9yIHdoaWNoIGF1dGhvcml6YXRpb24gaXMgdG8gYmUgdmVyaWZpZWQKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gUGVybWlzc2lvbiBpbXBsaWVkIGJ5IFByb3RlY3Rpb25Eb21haW4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUGVybWlzc2lvbn0gZm9yIHdoaWNoIGF1dGhvcml6YXRpb24gaXMgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHZlcmlmaWVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgUGVybWlzc2lvbn0gaXMgaW1wbGllZCBieSB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBQcm90ZWN0aW9uRG9tYWlufSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQcm90ZWN0aW9uRG9tYWluIGRvbWFpbiwgUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CiAgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgewpAQCAtMTE5LDEwICsxNDMsMTkgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3lzdGVtIHNlY3VyaXR5IHBvbGljeS4gSWYgbm8gcG9saWN5IGhhcyBiZWVuCi0gICAgICogaW5zdGFudGlhdGVkIHRoZW4gdGhpcyBpcyBkb25lIHVzaW5nIHRoZSBzZWN1cml0eSBwcm9wZXJ0eSA8RU0+cG9saWN5LnByb3ZpZGVyPC9FTT4KKyAgICAgKiBpbnN0YW50aWF0ZWQgdGhlbiB0aGlzIGlzIGRvbmUgdXNpbmcgdGhlIHNlY3VyaXR5IHByb3BlcnR5IHtAY29kZQorICAgICAqICJwb2xpY3kucHJvdmlkZXIifS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBnZXRQb2xpY3l9IHRvIGJlIGdyYW50ZWQsIG90aGVyd2lzZQorICAgICAqIGEge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBQb2xpY3kgdGhlIGN1cnJlbnQgc3lzdGVtIHNlY3VyaXR5IHBvbGljeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHN5c3RlbSBzZWN1cml0eSBwb2xpY3kuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFBvbGljeSBnZXRQb2xpY3koKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTE2OSw3ICsyMDIsNyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgc3lzdGVtIHBvbGljeSBwcm92aWRlciBpcyBpbnN0YW50aWF0ZWQuCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgc3lzdGVtIHBvbGljeSBwcm92aWRlciBpcyBpbnN0YW50aWF0ZWQuCiAgICAgICovCiAgICAgc3RhdGljIGJvb2xlYW4gaXNTZXQoKSB7CiAgICAgICAgIHJldHVybiBhY3RpdmVQb2xpY3kgIT0gbnVsbDsKQEAgLTE5NywxMSArMjMwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3lzdGVtLXdpZGUgcG9saWN5IG9iamVjdCBpZiBpdCBpcyBwZXJtaXR0ZWQgYnkgdGhlIHNlY3VyaXR5Ci0gICAgICogbWFuYWdlci4KKyAgICAgKiBTZXRzIHRoZSBzeXN0ZW0gd2lkZSBwb2xpY3kuCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcworICAgICAqIHRoZSB7QGNvZGUgU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgc2V0UG9saWN5fSB0byBiZSBncmFudGVkLCBvdGhlcndpc2UKKyAgICAgKiBhIHtAY29kZSBTZWN1cml0eUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb2xpY3kKLSAgICAgKiAgICAgICAgICAgIFBvbGljeSB0aGUgcG9saWN5IG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIHNldC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUG9saWN5fSB0byBzZXQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UG9saWN5KFBvbGljeSBwb2xpY3kpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1ByaW5jaXBhbC5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1ByaW5jaXBhbC5qYXZhCmluZGV4IDJmYWM3YWYuLjA3MTY2ODEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QcmluY2lwYWwuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJpbmNpcGFsLmphdmEKQEAgLTI0LDI1ICsyNCw1MiBAQAogCiAKIC8qKgotICogUHJpbmNpcGFscyBhcmUgb2JqZWN0cyB3aGljaCBoYXZlIGlkZW50aXRpZXMuIFRoZXNlIGNhbiBiZSBpbmRpdmlkdWFscywKLSAqIGdyb3VwcywgY29ycG9yYXRpb25zLCB1bmlxdWUgcHJvZ3JhbSBleGVjdXRpb25zLCBldGMuCisgKiB7QGNvZGUgUHJpbmNpcGFsfXMgYXJlIG9iamVjdHMgd2hpY2ggaGF2ZSBpZGVudGl0aWVzLiBUaGVzZSBjYW4gYmUKKyAqIGluZGl2aWR1YWxzLCBncm91cHMsIGNvcnBvcmF0aW9ucywgdW5pcXVlIHByb2dyYW0gZXhlY3V0aW9ucywgZXRjLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBQcmluY2lwYWwgewotICAgIC8qKiAKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMge0Bjb2RlIFByaW5jaXBhbH0gZm9yIGVxdWFsaXR5CisgICAgICogYW5kIHJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsLCB7QGNvZGUgZmFsc2V9CisgICAgICogb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkgd2l0aCB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgICAgUHJpbmNpcGFsfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgUHJpbmNpcGFsfSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKCBPYmplY3Qgb2JqICk7Ci0gICAgLyoqIAotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHtAY29kZSBQcmluY2lwYWx9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB7QGNvZGUgUHJpbmNpcGFsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgICAvKiogCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIFByaW5jaXBhbH0uIFJldHVybnMgdGhlIHNhbWUKKyAgICAgKiBoYXNoIGNvZGUgZm9yIHtAY29kZSBQcmluY2lwYWx9cyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGFzCisgICAgICogcmVxdWlyZWQgYnkgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2Yge0BsaW5rIE9iamVjdCNoYXNoQ29kZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIFByaW5jaXBhbH0uCisgICAgICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKKyAgICAgKiBAc2VlIFByaW5jaXBhbCNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKTsKKyAgIAogICAgIC8qKiAKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZgorICAgICAqIHRoaXMge0Bjb2RlIFByaW5jaXBhbH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBQcmluY2lwYWx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcml2YXRlS2V5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJpdmF0ZUtleS5qYXZhCmluZGV4IGYwOWI0YTguLjg1MTNiNzUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcml2YXRlS2V5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1ByaXZhdGVLZXkuamF2YQpAQCAtMjMsMTIgKzIzLDE3IEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIHtAY29kZSBQcml2YXRlS2V5fSBpcyB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgcHJpdmF0ZSBrZXlzLgogICogCisgKiBAc2VlIFB1YmxpY0tleQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUHJpdmF0ZUtleSBleHRlbmRzIEtleSB7CisgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUge0Bjb2RlIHNlcmlhbFZlcnNpb25VSUR9IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBKREsxLjEuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MDM0MDQ0MzE0NTg5NTEzNDMwTDsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb24uamF2YQppbmRleCA0ZTE2ZTNhLi41OTEyY2RjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uLmphdmEKQEAgLTIzLDEyICsyMywyMyBAQAogcGFja2FnZSBqYXZhLnNlY3VyaXR5OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICoge0Bjb2RlIFByaXZpbGVnZWRBY3Rpb259IHJlcHJlc2VudHMgYW4gYWN0aW9uIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIHByaXZpbGVnZWQKKyAqIHJlZ2FyZGluZyBhY2Nlc3MgY29udHJvbC4gSW5zdGFuY2VzIG9mIHtAY29kZSBQcml2aWxlZ2VkQWN0aW9ufSBjYW4gYmUKKyAqIGV4ZWN1dGVkIG9uIHtAY29kZSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgpfS4KKyAqIAorICogQHNlZSBBY2Nlc3NDb250cm9sbGVyCisgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24pCisgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24sIEFjY2Vzc0NvbnRyb2xDb250ZXh0KQorICogQHNlZSBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgaW50ZXJmYWNlIFByaXZpbGVnZWRBY3Rpb248VD4geworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGFjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgYWN0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUIHJ1bigpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IGQ2OGI2YjkuLmVhY2EyYjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24uamF2YQpAQCAtMjMsMjUgKzIzLDM3IEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHVzZWQgdG8gd3JhcCBleGNlcHRpb25zIHdoaWNoIG9jY3VyIHdpdGhpbgotICogcHJpdmlsZWdlZCBvcGVyYXRpb25zLgorICoge0Bjb2RlIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb259IHdyYXBzIGV4Y2VwdGlvbnMgd2hpY2ggYXJlIHRocm93biBmcm9tCisgKiB3aXRoaW4gcHJpdmlsZWdlZCBvcGVyYXRpb25zLgorICogPHA+CisgKiBQcml2aWxlZ2VkIGFjdGlvbnMgd2hpY2ggY2FuIHRocm93IGV4Y2VwdGlvbnMgYXJlIG9mIHR5cGUge0Bjb2RlCisgKiBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9ufSBhbmQgYXJlIHRocm93biBieQorICogPHVsPgorICoge0Bjb2RlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24pfTxicj4KKyAqIHtAY29kZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLAorICogQWNjZXNzQ29udHJvbENvbnRleHQpfSA8L2JyPgorICogPC91bD4KKyAqIDwvcD4KICAqIAorICogQHNlZSBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCisgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24pCisgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24sCisgKiAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0KQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ3MjQwODY4NTE1Mzg5MDg2MDJsOwogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCi0gICAgICovCiAgICAgcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIGV4Y2VwdGlvbiBmaWxsZWQgaW4uCi0gICAgICogQHBhcmFtIGV4IAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb259IHdpdGggdGhlCisgICAgICogY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGV4CisgICAgICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHdoaWNoIGlzIHRoZSBjYXVzZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24oRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgIHN1cGVyKGV4KTsKQEAgLTQ5LDggKzYxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHdoaWNoIGNhdXNlZCB0aGUgcmVjZWl2ZXIgdG8gYmUgdGhyb3duLgotICAgICAqIEByZXR1cm4gZXhjZXB0aW9uCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93biBieSBhCisgICAgICoge0Bjb2RlIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb259LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24gYnkgYQorICAgICAqICAgICAgICAge0Bjb2RlIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uOyAvLyByZXR1cm4gKCBnZXRDYXVzZSgpIGluc3RhbmNlb2YgRXhjZXB0aW9uICkgPwpAQCAtNTgsMjEgKzc0LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F1c2Ugb2YgdGhpcyBUaHJvd2FibGUsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gY2F1c2UuCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93biBieSBhCisgICAgICoge0Bjb2RlIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb259LgogICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhyb3dhYmxlIFRoZSByZWNlaXZlcidzIGNhdXNlLgorICAgICAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24gYnkgYQorICAgICAqICAgICAgICAge0Bjb2RlIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CiAgICAgICAgIHJldHVybiBleGNlcHRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIHtAY29kZSBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9ufS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9ufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgcyA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmphdmEKaW5kZXggOThkNTZlMy4uZGQzYWU4ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi5qYXZhCkBAIC0yMywxMSArMjMsMjYgQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIFByaXZpbGVnZWRBY3Rpb259IHJlcHJlc2VudHMgYW4gYWN0aW9uLCB0aGF0IGNhbiBiZSBleGVjdXRlZAorICogcHJpdmlsZWdlZCByZWdhcmRpbmcgYWNjZXNzIGNvbnRyb2wuIEluc3RhbmNlcyBvZiB7QGNvZGUgUHJpdmlsZWdlZEFjdGlvbn0KKyAqIGNhbiBiZSBleGVjdXRlZCBpbnZva2luZyB7QGNvZGUgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoKX0uCisgKiAKKyAqIEBzZWUgQWNjZXNzQ29udHJvbGxlcgorICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKQorICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLAorICogICAgICBBY2Nlc3NDb250cm9sQ29udGV4dCkKKyAqIEBzZWUgUHJpdmlsZWdlZEFjdGlvbgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUPiB7CisgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgYWN0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBhY3Rpb24KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBUIHJ1bigpIHRocm93cyBFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJvdGVjdGlvbkRvbWFpbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW4uamF2YQppbmRleCA2Zjk4MTk0Li5kNDFmNGE4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJvdGVjdGlvbkRvbWFpbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcm90ZWN0aW9uRG9tYWluLmphdmEKQEAgLTIzLDExICsyMywxNiBAQAogcGFja2FnZSBqYXZhLnNlY3VyaXR5OwogCiAvKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGRvbWFpbiBpbiB3aGljaCBjbGFzc2VzIGZyb20gdGhlIHNhbWUgc291cmNlIChVUkwpCi0gKiBhbmQgc2lnbmVkIGJ5IHRoZSBzYW1lIGtleXMgYXJlIHN0b3JlZC4gQWxsIHRoZSBjbGFzc2VzIGluc2lkZSBhcmUgZ2l2ZW4gdGhlCi0gKiBzYW1lIHBlcm1pc3Npb25zLgorICoge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IHJlcHJlc2VudHMgYWxsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGdyYW50ZWQgdG8gYQorICogc3BlY2lmaWMgY29kZSBzb3VyY2UuIFRoZSB7QGxpbmsgQ2xhc3NMb2FkZXJ9IGFzc29jaWF0ZXMgZWFjaCBjbGFzcyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0sIGRlcGVuZGluZyBvbiB0aGUgbG9jYXRpb24gYW5kIHRoZQorICogY2VydGlmaWNhdGVzIChlbmNhcHN1bGF0ZXMgaW4ge0BsaW5rIENvZGVTb3VyY2V9KSBpdCBsb2FkcyB0aGUgY29kZSBmcm9tLgogICogPHA+Ci0gKiBOb3RlOiBhIGNsYXNzIGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgYW5kIG9ubHkgb25lIHByb3RlY3Rpb24gZG9tYWluLgorICogQSBjbGFzcyBiZWxvbmdzIHRvIGV4YWN0bHkgb25lIHByb3RlY3Rpb24gZG9tYWluIGFuZCB0aGUgcHJvdGVjdGlvbiBkb21haW4KKyAqIGNhbiBub3QgYmUgY2hhbmdlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBjbGFzcy4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQcm90ZWN0aW9uRG9tYWluIHsKIApAQCAtNDgsMTEgKzUzLDMyIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGR5bmFtaWNQZXJtczsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBwcm90ZWN0aW9uIGRvbWFpbiBmcm9tIHRoZSBnaXZlbiBjb2RlIHNvdXJjZSBhbmQgdGhlCi0gICAgICogcGVybWlzc2lvbnMgdGhhdCB0aGF0IHNob3VsZCBiZSBncmFudGVkIHRvIHRoZSBjbGFzc2VzIHdoaWNoIGFyZQotICAgICAqIGVuY2Fwc3VsYXRlZCBpbiBpdC4KLSAgICAgKiBAcGFyYW0gY3MgCi0gICAgICogQHBhcmFtIHBlcm1pc3Npb25zIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGNvZGUgc291cmNlIGFuZCB0aGUgc3BlY2lmaWVkIHN0YXRpYyBwZXJtaXNzaW9ucy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB7QGNvZGUgcGVybWlzc2lvbnN9IGlzIG5vdCB7QGNvZGUgbnVsbH0sIHRoZSB7QGNvZGUgcGVybWlzc2lvbnN9CisgICAgICogY29sbGVjdGlvbiBpcyBtYWRlIGltbXV0YWJsZSBieSBjYWxsaW5nCisgICAgICoge0BsaW5rIFBlcm1pc3Npb25Db2xsZWN0aW9uI3NldFJlYWRPbmx5KCl9IGFuZCBpdCBpcyBjb25zaWRlcmVkIGFzCisgICAgICogZ3JhbnRlZCBzdGF0aWNhbGx5IHRvIHRoaXMge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcG9saWN5IHdpbGwgbm90IGJlIGNvbnN1bHRlZCBieSBhY2Nlc3MgY2hlY2tzIGFnYWluc3QgdGhpcyB7QGNvZGUKKyAgICAgKiBQcm90ZWN0aW9uRG9tYWlufS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYge0Bjb2RlIHBlcm1pc3Npb25zfSBpcyB7QGNvZGUgbnVsbH0sIHRoZSBtZXRob2QKKyAgICAgKiB7QGxpbmsgUHJvdGVjdGlvbkRvbWFpbiNpbXBsaWVzKFBlcm1pc3Npb24pfSBhbHdheXMgcmV0dXJucyB7QGNvZGUgZmFsc2V9CisgICAgICogLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb21haW4sIG1heWJlIHtAY29kZQorICAgICAqICAgICAgICAgICAgbnVsbH0uCisgICAgICogQHBhcmFtIHBlcm1pc3Npb25zCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFBlcm1pc3Npb25Db2xsZWN0aW9ufSBjb250YWluaW5nIGFsbCBwZXJtaXNzaW9ucyB0bworICAgICAqICAgICAgICAgICAgYmUgc3RhdGljYWxseSBncmFudGVkIHRvIHRoaXMge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59LCBtYXliZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm90ZWN0aW9uRG9tYWluKENvZGVTb3VyY2UgY3MsIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBlcm1pc3Npb25zKSB7CiAgICAgICAgIHRoaXMuY29kZVNvdXJjZSA9IGNzOwpAQCAtNjUsMjIgKzkxLDM2IEBACiAgICAgICAgIC8vZHluYW1pY1Blcm1zID0gZmFsc2U7CiAgICAgfQogCisKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcHJvdGVjdGlvbiBkb21haW4gZnJvbSB0aGUgZ2l2ZW4gY29kZSBzb3VyY2UgYW5kIHRoZQotICAgICAqIHBlcm1pc3Npb25zIHRoYXQgdGhhdCBzaG91bGQgYmUgZ3JhbnRlZCB0byB0aGUgY2xhc3NlcyB3aGljaCBhcmUKLSAgICAgKiBlbmNhcHN1bGF0ZWQgaW4gaXQuIAotICAgICAqIAotICAgICAqIFRoaXMgY29uc3RydWN0b3IgYWxzbyBhbGxvd3MgdGhlIGFzc29jaWF0aW9uIG9mIGEgQ2xhc3NMb2FkZXIgYW5kIGdyb3VwCi0gICAgICogb2YgUHJpbmNpcGFscy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb2RlIHNvdXJjZSwgdGhlIHBlcm1pc3Npb25zLCB0aGUgY2xhc3MgbG9hZGVyIGFuZCB0aGUgcHJpbmNpcGFscy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB7QGNvZGUgcGVybWlzc2lvbnN9IGlzIHtAY29kZSBudWxsfSwgYW5kIGFjY2VzcyBjaGVja3MgYXJlIHBlcmZvcm1lZAorICAgICAqIGFnYWluc3QgdGhpcyBwcm90ZWN0aW9uIGRvbWFpbiwgdGhlIHBlcm1pc3Npb25zIGRlZmluZWQgYnkgdGhlIHBvbGljeSBhcmUKKyAgICAgKiBjb25zdWx0ZWQuIElmIHtAY29kZSBwZXJtaXNzaW9uc30gaXMgbm90IHtAY29kZSBudWxsfSwgdGhlIHtAY29kZQorICAgICAqIHBlcm1pc3Npb25zfSBjb2xsZWN0aW9uIGlzIG1hZGUgaW1tdXRhYmxlIGJ5IGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgUGVybWlzc2lvbkNvbGxlY3Rpb24jc2V0UmVhZE9ubHkoKX0uIElmIGFjY2VzcyBjaGVja3MgYXJlCisgICAgICogcGVyZm9ybWVkLCB0aGUgcG9saWN5IGFuZCB0aGUgcHJvdmlkZWQgcGVybWlzc2lvbiBjb2xsZWN0aW9uIGFyZSBjaGVja2VkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBFeHRlcm5hbCBtb2RpZmljYXRpb25zIG9mIHRoZSBwcm92aWRlZCB7QGNvZGUgcHJpbmNpcGFsc30gYXJyYXkgaGFzIG5vCisgICAgICogaW1wYWN0IG9uIHRoaXMge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBDb2RlU291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvbWFpbgorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvbWFpbiwgbWF5YmUge0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfS4KICAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBQZXJtaXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb21haW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb21haW4sIG1heWJlIHtAY29kZQorICAgICAqICAgICAgICAgICAgbnVsbH0uCiAgICAgICogQHBhcmFtIGNsCi0gICAgICogICAgICAgICAgICB0aGUgQ2xhc3NMb2FkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9tYWluCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgbG9hZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvbWFpbiwgbWF5YmUge0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfS4KICAgICAgKiBAcGFyYW0gcHJpbmNpcGFscwotICAgICAqICAgICAgICAgICAgdGhlIFByaW5jaXBhbHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9tYWluCisgICAgICogICAgICAgICAgICB0aGUgcHJpbmNpcGFscyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb21haW4sIG1heWJlIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgICAgLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm90ZWN0aW9uRG9tYWluKENvZGVTb3VyY2UgY3MsIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBlcm1pc3Npb25zLAogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wsIFByaW5jaXBhbFtdIHByaW5jaXBhbHMpIHsKQEAgLTk5LDM5ICsxMzksNDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDbGFzc0xvYWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIFByb3RlY3Rpb25Eb21haW4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgQ2xhc3NMb2FkZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZQorICAgICAqIFByb3RlY3Rpb25Eb21haW59LgogICAgICAqIAotICAgICAqIEByZXR1cm4gQ2xhc3NMb2FkZXIgYXNzb2NpYXRlZCBDbGFzc0xvYWRlcgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDbGFzc0xvYWRlcn0gYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBQcm90ZWN0aW9uRG9tYWlufSwgbWF5YmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvZGUgc291cmNlIG9mIHRoaXMgZG9tYWluLgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBDb2RlU291cmNlfSBvZiB0aGlzIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSB0aGUgY29kZSBzb3VyY2Ugb2YgdGhpcyBkb21haW4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQ29kZVNvdXJjZX0gb2YgdGhpcyB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0sIG1heWJlCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENvZGVTb3VyY2UgZ2V0Q29kZVNvdXJjZSgpIHsKICAgICAgICAgcmV0dXJuIGNvZGVTb3VyY2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGVybWlzc2lvbnMgdGhhdCBzaG91bGQgYmUgZ3JhbnRlZCB0byB0aGUgY2xhc3NlcyB3aGljaCBhcmUKLSAgICAgKiBlbmNhcHN1bGF0ZWQgaW4gdGhpcyBkb21haW4uCisgICAgICogUmV0dXJucyB0aGUgc3RhdGljIHBlcm1pc3Npb25zIHRoYXQgYXJlIGdyYW50ZWQgdG8gdGhpcyB7QGNvZGUKKyAgICAgKiBQcm90ZWN0aW9uRG9tYWlufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gY29sbGVjdGlvbiBvZiBwZXJtaXNzaW9ucwotICAgICAqICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9tYWluLgorICAgICAqIEByZXR1cm4gdGhlIHN0YXRpYyBwZXJtaXNzaW9ucyB0aGF0IGFyZSBncmFudGVkIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBQcm90ZWN0aW9uRG9tYWlufSwgbWF5YmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBQZXJtaXNzaW9uQ29sbGVjdGlvbiBnZXRQZXJtaXNzaW9ucygpIHsKICAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFByaW5jaXBhbHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUHJvdGVjdGlvbkRvbWFpbi4gQSBjaGFuZ2UgdG8KLSAgICAgKiB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBub3QgaW1wYWN0IHRoZSBQcm90ZWN0aW9uRG9tYWluLgorICAgICAqIFJldHVybnMgdGhlIHByaW5jaXBhbHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIFByb3RlY3Rpb25Eb21haW59LgorICAgICAqIE1vZGlmaWNhdGlvbnMgb2YgdGhlIHJldHVybmVkIHtAY29kZSBQcmluY2lwYWx9IGFycmF5IGhhcyBubyBpbXBhY3Qgb24KKyAgICAgKiB0aGlzIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFByaW5jaXBhbHNbXSBQcmluY2lwYWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUHJvdGVjdGlvbkRvbWFpbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmluY2lwYWxzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgUHJpbmNpcGFsW10gZ2V0UHJpbmNpcGFscygpIHsKICAgICAgICAgaWYoIHByaW5jaXBhbHMgPT0gbnVsbCApIHsKQEAgLTE0MywxNCArMTkxLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwZXJtaXNzaW9uIGNvbGxlY3Rpb24gb2YgdGhpcyBkb21haW4gaW1wbGllcyB0aGUKLSAgICAgKiBhcmd1bWVudCBwZXJtaXNzaW9uLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoaXMge0Bjb2RlCisgICAgICogUHJvdGVjdGlvbkRvbWFpbn0uCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0gd2FzIGNvbnN0cnVjdGVkIHdpdGgKKyAgICAgKiB7QGxpbmsgI1Byb3RlY3Rpb25Eb21haW4oQ29kZVNvdXJjZSwgUGVybWlzc2lvbkNvbGxlY3Rpb24pfSwgdGhlCisgICAgICogc3BlY2lmaWVkIHBlcm1pc3Npb24gaXMgb25seSBjaGVja2VkIGFnYWluc3QgdGhlIHBlcm1pc3Npb24gY29sbGVjdGlvbgorICAgICAqIHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4gSWYge0Bjb2RlIG51bGx9IHdhcyBwcm92aWRlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufSB3YXMgY29uc3RydWN0ZWQgd2l0aAorICAgICAqIHtAbGluayAjUHJvdGVjdGlvbkRvbWFpbihDb2RlU291cmNlLCBQZXJtaXNzaW9uQ29sbGVjdGlvbiwgQ2xhc3NMb2FkZXIsIFByaW5jaXBhbFtdKX0KKyAgICAgKiAsIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIHBvbGljeSBhbmQgdGhlCisgICAgICogcGVybWlzc2lvbiBjb2xsZWN0aW9uIHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhpcyBwZXJtaXNzaW9uIGNvbGxlY3Rpb24gaW1wbGllcyB0aGUgYXJndW1lbnQKLSAgICAgKiAgICAgICAgIGFuZCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiB0aGUgcGVybWlzc2lvbiB0byBjaGVjay4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrIGFnYWluc3QgdGhlIGRvbWFpbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBwZXJtaXNzaW9ufSBpcyBpbXBsaWVkIGJ5CisgICAgICogICAgICAgICB0aGlzIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKICAgICAgICAgLy8gRmlyc3QsIHRlc3Qgd2l0aCB0aGUgUG9saWN5LCBhcyB0aGUgZGVmYXVsdCBQb2xpY3kuaW1wbGllcygpIApAQCAtMTcwLDkgKzIzMSwxMCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCisgICAgICogdGhpcyB7QGNvZGUgUHJvdGVjdGlvbkRvbWFpbn0uCiAgICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBQcm90ZWN0aW9uRG9tYWlufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAvL0ZJWE1FOiAxLjUgdXNlIFN0cmVhbUJ1aWxkZXIgaGVyZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJvdmlkZXIuamF2YQppbmRleCBhZTRhY2I5Li40OTE0NzBmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJvdmlkZXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJvdmlkZXIuamF2YQpAQCAtNDAsNiArNDAsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuU2VydmljZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiB7QGNvZGUgUHJvdmlkZXJ9IGlzIHRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBhbGwgc2VjdXJpdHkgcHJvdmlkZXJzIGluIHRoZQorICogSmF2YSBzZWN1cml0eSBpbmZyYXN0cnVjdHVyZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm92aWRlciBleHRlbmRzIFByb3BlcnRpZXMgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00Mjk4MDAwNTE1NDQ2NDI3NzM5TDsKIApAQCAtOTAsNiArOTYsMTggQEAKICAgICAvLyBsYXN0IFNlcnZpY2UgZm91bmQgYnkgdHlwZQogICAgIHByaXZhdGUgdHJhbnNpZW50IFByb3ZpZGVyLlNlcnZpY2UgbGFzdFNlcnZpY2VzQnlUeXBlOwogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgUHJvdmlkZXJ9IHdpdGggaXRzIG5hbWUsIHZlcnNpb24gYW5kCisgICAgICogZGVzY3JpcHRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24gb2YgdGhlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBpbmZvCisgICAgICogICAgICAgICAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm92aWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgUHJvdmlkZXIoU3RyaW5nIG5hbWUsIGRvdWJsZSB2ZXJzaW9uLCBTdHJpbmcgaW5mbykgewogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwpAQCAtMTAxLDQ3ICsxMTksNjEgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgbmFtZSBvZiB0aGUgcHJvdmlkZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcHJvdmlkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHNlcnZpY2VzIGJlaW5nIHByb3ZpZGVkCisgICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBzZXJ2aWNlcyBiZWluZyBwcm92aWRlZC4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGRvdWJsZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHNlcnZpY2VzIGJlaW5nIHByb3ZpZGVkCisgICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBzZXJ2aWNlcyBiZWluZyBwcm92aWRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldFZlcnNpb24oKSB7CiAgICAgICAgIHJldHVybiB2ZXJzaW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdlbmVyaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZpY2VzIGJlaW5nIHByb3ZpZGVkLgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VydmljZXMgYmVpbmcgcHJvdmlkZWQuCiAgICAgICogCi0gICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcgZ2VuZXJpYyBkZXNjcmlwdGlvbiBvZiB0aGUgc2VydmljZXMgYmVpbmcgcHJvdmlkZWQKKyAgICAgKiBAcmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNlcnZpY2VzIGJlaW5nIHByb3ZpZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKICAgICAgICAgcmV0dXJuIGluZm87CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICogcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mCisgICAgICogdGhpcyB7QGNvZGUgUHJvdmlkZXJ9IGluY2x1ZGluZyBpdHMgbmFtZSBhbmQgaXRzIHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBQcm92aWRlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBuYW1lICsgIiB2ZXJzaW9uICIgKyB2ZXJzaW9uOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgYWxsIHByb3BlcnRpZXMgdXNlZCB0byBsb29rIHVwIHNlcnZpY2VzIGltcGxlbWVudGVkIGJ5IHRoaXMKKyAgICAgKiB7QGNvZGUgUHJvdmlkZXJ9LgorICAgICAqIDxwPgorICAgICAqIElmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkLCBjb2RlIGNhbGxpbmcgdGhpcyBtZXRob2QgbmVlZHMKKyAgICAgKiB0aGUge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0ge0Bjb2RlIGNsZWFyUHJvdmlkZXJQcm9wZXJ0aWVzLk5BTUV9CisgICAgICogKHdoZXJlIE5BTUUgaXMgdGhlIHByb3ZpZGVyIG5hbWUpIHRvIGJlIGdyYW50ZWQsIG90aGVyd2lzZSBhIHtAY29kZQorICAgICAqIFNlY3VyaXR5RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKQEAgLTE3Nyw2ICsyMDksMjIgQEAKICAgICAgICAgbXlQdXRBbGwodG1wKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgYWxsIGZyb20gdGhlIHByb3ZpZGVkIG1hcCB0byB0aGlzIHtAY29kZSBQcm92aWRlcn0uCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcworICAgICAqIHRoZSB7QGNvZGUgU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgcHV0UHJvdmlkZXJQcm9wZXJ0eS5OQU1FfSAod2hlcmUKKyAgICAgKiBOQU1FIGlzIHRoZSBwcm92aWRlciBuYW1lKSB0byBiZSBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUKKyAgICAgKiBTZWN1cml0eUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICAgICAgICB0aGUgbWFwcGluZ3MgdG8gY29weSB0byB0aGlzIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbnZva2UgdGhpcyBtZXRob2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHB1dEFsbChNYXA8Pyw/PiB0KSB7CiAKICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZToKQEAgLTIyOSw2ICsyNzcsMjcgQEAKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oc3VwZXIudmFsdWVzKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCB7QGNvZGUga2V5fSBwcm9wZXJ0eSBuYW1lIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogdmFsdWV9LgorICAgICAqIDxwPgorICAgICAqIElmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkLCBjb2RlIGNhbGxpbmcgdGhpcyBtZXRob2QgbmVlZHMKKyAgICAgKiB0aGUge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0ge0Bjb2RlIHB1dFByb3ZpZGVyUHJvcGVydHkuTkFNRX0gKHdoZXJlCisgICAgICogTkFNRSBpcyB0aGUgcHJvdmlkZXIgbmFtZSkgdG8gYmUgZ3JhbnRlZCwgb3RoZXJ3aXNlIGEge0Bjb2RlCisgICAgICogU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2FzIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGtleX0KKyAgICAgKiAgICAgICAgICxvciB7QGNvZGUgbnVsbH0gaWYgaXQgZGlkIG5vdCBoYXZlIG9uZS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc20gIT0gbnVsbCkgewpAQCAtMjUyLDYgKzMyMSwyNSBAQAogICAgICAgICByZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCB7QGNvZGUga2V5fSBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUgZnJvbSB0aGlzCisgICAgICoge0Bjb2RlIFByb3ZpZGVyfS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSByZW1vdmVQcm92aWRlclByb3BlcnR5Lk5BTUV9ICh3aGVyZQorICAgICAqIE5BTUUgaXMgdGhlIHByb3ZpZGVyIG5hbWUpIHRvIGJlIGdyYW50ZWQsIG90aGVyd2lzZSBhIHtAY29kZQorICAgICAqIFNlY3VyaXR5RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGtleX0gLG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgbm8gbWFwcGluZyB3YXMgcHJlc2VudAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgdGhlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKQEAgLTI3NywxOSArMzY1LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogCi0gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlciBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLiAgQ2FsbGVyIG11c3QKLSAgICAgKiBzcGVjaWZ5IHRoZSBjcnlwdG9ncmFwaGljIHNlcnZpY2UgYW5kIHNwZWNpZnkgY29uc3RyYWludHMgdmlhIHRoZQorICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZXIgaW1wbGVtZW50cyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4gQ2FsbGVyCisgICAgICogbXVzdCBzcGVjaWZ5IHRoZSBjcnlwdG9ncmFwaGljIHNlcnZpY2UgYW5kIHNwZWNpZnkgY29uc3RyYWludHMgdmlhIHRoZQogICAgICAqIGF0dHJpYnV0ZSBuYW1lIHRoZSBhdHRyaWJ1dGUgdmFsdWUKICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2VydgotICAgICAqICAgICAgICAgICAgQ3J5cHRvIHNlcnZpY2UKKyAgICAgKiAgICAgICAgICAgIENyeXB0byBzZXJ2aWNlLgogICAgICAqIEBwYXJhbSBhbGcKLSAgICAgKiAgICAgICAgICAgIEFsZ29yaXRobSBvciB0eXBlCisgICAgICogICAgICAgICAgICBBbGdvcml0aG0gb3IgdHlwZS4KICAgICAgKiBAcGFyYW0gYXR0cmlidXRlCi0gICAgICogICAgICAgICAgICBUaGUgYXR0cmlidXRlIG5hbWUgb3IgbnVsbAorICAgICAqICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gdmFsCi0gICAgICogICAgICAgICAgICBUaGUgYXR0cmlidXRlIHZhbHVlCisgICAgICogICAgICAgICAgICBUaGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAqIEByZXR1cm4KICAgICAgKi8KICAgICBib29sZWFuIGltcGxlbWVudHNBbGcoU3RyaW5nIHNlcnYsIFN0cmluZyBhbGcsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWwpIHsKQEAgLTMxOSwxMSArNDA2LDExIEBACiAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGdldFByb3BlcnR5SWdub3JlQ2FzZShzZXJ2QWxnICsgJyAnICsgYXR0cmlidXRlKTsKICAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZXF1YWxzSWdub3JlQ2FzZSgiS2V5U2l6ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgIGlmIChJbnRlZ2VyLnBhcnNlSW50KGF0dHJpYnV0ZVZhbHVlKSA+PSBJbnRlZ2VyLnBhcnNlSW50KHZhbCkpIHsKLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG90aGVyIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzc0LDYgKzQ2MSwyMyBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIHdpdGggdGhlIHNwZWNpZmllZCB7QGNvZGUgdHlwZX0gaW1wbGVtZW50aW5nIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgYWxnb3JpdGhtfSwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHN1Y2ggaW1wbGVtZW50YXRpb24KKyAgICAgKiBleGlzdHMuCisgICAgICogPHA+CisgICAgICogSWYgdHdvIHNlcnZpY2VzIG1hdGNoIHRoZSByZXF1ZXN0ZWQgdHlwZSBhbmQgYWxnb3JpdGhtLCB0aGUgb25lIGFkZGVkCisgICAgICogd2l0aCB0aGUge0BsaW5rICNwdXRTZXJ2aWNlKFNlcnZpY2UpfSBpcyByZXR1cm5lZCAoYXMgb3Bwb3NlZCB0byB0aGUgb25lCisgICAgICogYWRkZWQgdmlhIHtAbGluayAjcHV0KE9iamVjdCwgT2JqZWN0KX0uCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlIChmb3IgZXhhbXBsZSB7QGNvZGUgS2V5UGFpckdlbmVyYXRvcn0pCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIGFsZ29yaXRobSBuYW1lIChjYXNlIGluc2Vuc2l0aXZlKQorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gc3VjaCBpbXBsZW1lbnRhdGlvbgorICAgICAqICAgICAgICAgZXhpc3RzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBQcm92aWRlci5TZXJ2aWNlIGdldFNlcnZpY2UoU3RyaW5nIHR5cGUsCiAgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtKSB7CiAgICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgYWxnb3JpdGhtID09IG51bGwpIHsKQEAgLTQxMiw2ICs1MTYsMTQgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUge0Bjb2RlIFNldH0gb2YgYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWQgYnkgdGhpcworICAgICAqIHByb3ZpZGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIHtAY29kZSBTZXR9IG9mIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgIHByb3ZpZGVyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXQ8UHJvdmlkZXIuU2VydmljZT4gZ2V0U2VydmljZXMoKSB7CiAgICAgICAgIHVwZGF0ZVByb3BlcnR5U2VydmljZVRhYmxlKCk7CiAgICAgICAgIGlmIChsYXN0U2VydmljZXNTZXQgIT0gbnVsbCkgewpAQCAtNDI5LDYgKzU0MSwyMiBAQAogICAgICAgICByZXR1cm4gbGFzdFNlcnZpY2VzU2V0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFkZHMgYSB7QGNvZGUgU2VydmljZX0gdG8gdGhpcyB7QGNvZGUgUHJvdmlkZXJ9LiBJZiBhIHNlcnZpY2Ugd2l0aCB0aGUKKyAgICAgKiBzYW1lIG5hbWUgd2FzIHJlZ2lzdGVyZWQgdmlhIHRoaXMgbWV0aG9kLCBpdCBpcyByZXBsYWNlLgorICAgICAqIDxwPgorICAgICAqIElmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkLCBjb2RlIGNhbGxpbmcgdGhpcyBtZXRob2QgbmVlZHMKKyAgICAgKiB0aGUge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0ge0Bjb2RlIHB1dFByb3ZpZGVyUHJvcGVydHkuTkFNRX0gKHdoZXJlCisgICAgICogTkFNRSBpcyB0aGUgcHJvdmlkZXIgbmFtZSkgdG8gYmUgZ3JhbnRlZCwgb3RoZXJ3aXNlIGEge0Bjb2RlCisgICAgICogU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFNlcnZpY2V9IHRvIHJlZ2lzdGVyCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwdXRTZXJ2aWNlKFByb3ZpZGVyLlNlcnZpY2UgcykgewogICAgICAgICBpZiAocyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKQEAgLTQ1Nyw2ICs1ODUsMjQgQEAKICAgICAgICAgc2VydmljZUluZm9Ub1Byb3BlcnRpZXMocyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB7QGNvZGUgU2VydmljZX0gZnJvbSB0aGlzIHtAY29kZQorICAgICAqIFByb3ZpZGVyfS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSByZW1vdmVQcm92aWRlclByb3BlcnR5Lk5BTUV9ICh3aGVyZQorICAgICAqIE5BTUUgaXMgdGhlIHByb3ZpZGVyIG5hbWUpIHRvIGJlIGdyYW50ZWQsIG90aGVyd2lzZSBhIHtAY29kZQorICAgICAqIFNlY3VyaXR5RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBTZXJ2aWNlfSB0byByZW1vdmUKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU2VydmljZShQcm92aWRlci5TZXJ2aWNlIHMpIHsKICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CkBAIC03NTUsNiArOTAxLDEzIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIHtAY29kZSBTZXJ2aWNlfSByZXByZXNlbnRzIGEgc2VydmljZSBpbiB0aGUgSmF2YSBTZWN1cml0eSBpbmZyYXN0cnVjdHVyZS4KKyAgICAgKiBFYWNoIHNlcnZpY2UgZGVzY3JpYmVzIGl0cyB0eXBlLCB0aGUgYWxnb3JpdGhtIGl0IGltcGxlbWVudHMsIHRvIHdoaWNoCisgICAgICogcHJvdmlkZXIgaXQgYmVsb25ncyBhbmQgb3RoZXIgcHJvcGVydGllcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcnZpY2UgewogICAgICAgICAvLyBUaGUgcHJvdmlkZXIKICAgICAgICAgcHJpdmF0ZSBQcm92aWRlciBwcm92aWRlcjsKQEAgLTc4MCw2ICs5MzMsMzAgQEAKICAgICAgICAgLy8gRm9yIG5ld0luc3RhbmNlKCkgb3B0aW1pemF0aW9uCiAgICAgICAgIHByaXZhdGUgU3RyaW5nIGxhc3RDbGFzc05hbWU7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNlcnZpY2V9IHdpdGggdGhlIGdpdmVuCisgICAgICAgICAqIGF0dHJpYnV0ZXMuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgdG8gd2hpY2ggdGhpcyBzZXJ2aWNlIGJlbG9uZ3MuCisgICAgICAgICAqIEBwYXJhbSB0eXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhpcyBzZXJ2aWNlIChmb3IgZXhhbXBsZSB7QGNvZGUKKyAgICAgICAgICogICAgICAgICAgICBLZXlQYWlyR2VuZXJhdG9yfSkuCisgICAgICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtIHRoaXMgc2VydmljZSBpbXBsZW1lbnRzLgorICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGltcGxlbWVudGluZyB0aGlzIHNlcnZpY2UuCisgICAgICAgICAqIEBwYXJhbSBhbGlhc2VzCisgICAgICAgICAqICAgICAgICAgICAge0Bjb2RlIExpc3R9IG9mIGFsaWFzZXMgZm9yIHRoZSBhbGdvcml0aG0gbmFtZSwgb3Ige0Bjb2RlCisgICAgICAgICAqICAgICAgICAgICAgbnVsbH0gaWYgdGhlIGltcGxlbWVudGVkIGFsZ29yaXRobSBoYXMgbm8gYWxpYXNlcy4KKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgICAgICogICAgICAgICAgICB7QGNvZGUgTWFwfSBvZiBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAgICAgKiAgICAgICAgICAgIHRoaXMge0Bjb2RlIFNlcnZpY2V9IGhhcyBubyBhdHRyaWJ1dGVkLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwcm92aWRlciwgdHlwZSwgYWxnb3JpdGhtfSBvciB7QGNvZGUgY2xhc3NOYW1lfQorICAgICAgICAgKiAgICAgICAgICAgICBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFNlcnZpY2UoUHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyB0eXBlLCBTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsIExpc3Q8U3RyaW5nPiBhbGlhc2VzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCB8fCBhbGdvcml0aG0gPT0gbnVsbApAQCAtNzkyLDEwICs5NjksMTAgQEAKICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB0aGlzLmFsaWFzZXMgPSAoKGFsaWFzZXMgIT0gbnVsbCkgJiYgKGFsaWFzZXMuc2l6ZSgpID09IDApKQotICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSA6IGFsaWFzZXM7CisgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSA6IGFsaWFzZXM7CiAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPQotICAgICAgICAgICAgICAgICgoYXR0cmlidXRlcyAhPSBudWxsKSAmJiAoYXR0cmlidXRlcy5zaXplKCkgPT0gMCkpCi0gICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy48U3RyaW5nLFN0cmluZz5lbXB0eU1hcCgpIDogYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgKChhdHRyaWJ1dGVzICE9IG51bGwpICYmIChhdHRyaWJ1dGVzLnNpemUoKSA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy48U3RyaW5nLFN0cmluZz5lbXB0eU1hcCgpIDogYXR0cmlidXRlczsKICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfQogCkBAIC04MTUsOCArOTkyLDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFB1dHMgYSBuZXcgYXR0cmlidXRlIG1hcHBpbmcuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KICAgICAgICAgICovCiAgICAgICAgIC8qcGFja2FnZSovIHZvaWQgcHV0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcyA9PSBudWxsKSB8fCAoYXR0cmlidXRlcy5zaXplKCkgPT0gMCkpIHsKQEAgLTgyNiwyMiArMTAwMyw2MCBAQAogICAgICAgICB9CiAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyB7QGNvZGUgU2VydmljZX0uIEZvciBleGFtcGxlIHtAY29kZQorICAgICAgICAgKiBLZXlQYWlyR2VuZXJhdG9yfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyB7QGNvZGUgU2VydmljZX0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUeXBlKCkgewogICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIGltcGxlbWVudGVkIGJ5IHRoaXMge0Bjb2RlIFNlcnZpY2V9CisgICAgICAgICAqIC4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBpbXBsZW1lbnRlZCBieSB0aGlzIHtAY29kZSBTZXJ2aWNlfQorICAgICAgICAgKiAgICAgICAgIC4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKICAgICAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFByb3ZpZGVyfSB0aGlzIHtAY29kZSBTZXJ2aWNlfSBiZWxvbmdzIHRvLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFByb3ZpZGVyfSB0aGlzIHtAY29kZSBTZXJ2aWNlfSBiZWxvbmdzIHRvLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlciBnZXRQcm92aWRlcigpIHsKICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhpcyB7QGNvZGUgU2VydmljZX0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhpcyB7QGNvZGUgU2VydmljZX0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CiAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIHtAY29kZSBuYW1lfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGF0dHJpYnV0ZQorICAgICAgICAgKiAgICAgICAgIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgc2V0LgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuYW1lfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKQEAgLTg1Niw2ICsxMDcxLDIzIEBACiAgICAgICAgICAgICByZXR1cm4gYWxpYXNlcy5pdGVyYXRvcigpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBieQorICAgICAgICAgKiB0aGlzIHtAY29kZSBTZXJ2aWNlfS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvclBhcmFtZXRlcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3Rvciwgb3Ige0Bjb2RlCisgICAgICAgICAqICAgICAgICAgICAgbnVsbH0gaWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGRlY2xhcmUgYSBjb25zdHJ1Y3RvcgorICAgICAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlci4KKyAgICAgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgU2VydmljZX0uCisgICAgICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnN0YW5jZSBjb3VsZCBub3QgYmUgY29uc3RydWN0ZWQuCisgICAgICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqICAgICAgICAgICAgIHtAY29kZSBjb25zdHJ1Y3RvclBhcmFtZXRlcn0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShPYmplY3QgY29uc3RydWN0b3JQYXJhbWV0ZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb24gPT0gbnVsbCB8fCAhY2xhc3NOYW1lLmVxdWFscyhsYXN0Q2xhc3NOYW1lKSkgewpAQCAtOTE0LDE3ICsxMTQ2LDI3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgU2VydmljZX0gc3VwcG9ydHMgdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciB0byB0ZXN0LgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBTZXJ2aWNlfSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IgcGFyYW1ldGVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1BhcmFtZXRlcihPYmplY3QgcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUKLSAgICAgKiBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJlY2VpdmVyLgotICAgICAqLworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YKKyAgICAgICAgICogdGhpcyB7QGNvZGUgU2VydmljZX0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBTZXJ2aWNlfS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICJQcm92aWRlciAiICsgcHJvdmlkZXIuZ2V0TmFtZSgpICsgIiBTZXJ2aWNlICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgICAgICAgICAgICAgICsgdHlwZSArICIuIiArIGFsZ29yaXRobSArICIgIiArIGNsYXNzTmFtZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcm92aWRlckV4Y2VwdGlvbi5qYXZhCmluZGV4IDZjYTMzYWIuLmQ0ZGVmNWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcm92aWRlckV4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9Qcm92aWRlckV4Y2VwdGlvbi5qYXZhCkBAIC0yMywzNyArMjMsNTYgQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIFByb3ZpZGVyRXhjZXB0aW9ufSBpcyBhIGdlbmVyYWwgZXhjZXB0aW9uLCB0aHJvd24gYnkgc2VjdXJpdHkge0Bjb2RlCisgKiBQcm92aWRlcnN9LgogICogCisgKiBAc2VlIFByb3ZpZGVyCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFByb3ZpZGVyRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyNTYwMjM1MjY2OTM2NjU2NzRMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBQcm92aWRlckV4Y2VwdGlvbn0gd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb3ZpZGVyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFByb3ZpZGVyRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJvdmlkZXJFeGNlcHRpb24oKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBQcm92aWRlckV4Y2VwdGlvbn0gd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBtZXNzYWdlIGFuZCB0aGUgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHdoaWNoIGlzIHRoZSBjYXVzZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByb3ZpZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgUHJvdmlkZXJFeGNlcHRpb259IHdpdGggdGhlIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBpcyB0aGUgY2F1c2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcm92aWRlckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIoY2F1c2UpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1B1YmxpY0tleS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1B1YmxpY0tleS5qYXZhCmluZGV4IGZmNjhlMjguLjQ4ODhhNjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9QdWJsaWNLZXkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvUHVibGljS2V5LmphdmEKQEAgLTIzLDE1ICsyMywxNyBAQAogcGFja2FnZSBqYXZhLnNlY3VyaXR5OwogCiAvKioKLSAqIFN1cGVyaW50ZXJmYWNlIGZvciBhbGwgc3BlY2lmaWMgcHVibGljIGtleSBpbnRlcmZhY2VzCisgKiB7QGNvZGUgUHVibGljS2V5fSBpcyB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgcHVibGljIGtleXMuCiAgKiAKLSAqIAotICogQHNlZSBQdWJsaWNLZXkKICAqIEBzZWUgUHJpdmF0ZUtleQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUHVibGljS2V5IGV4dGVuZHMgS2V5IHsKKyAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFRoZSB7QGNvZGUgc2VyaWFsVmVyc2lvblVJRH0gdG8gYmUgY29tcGF0aWJsZSB3aXRoIEpESzEuMS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcxODczOTI0NzExNTkxNTEwNzJMOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NlY3VyZUNsYXNzTG9hZGVyLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlQ2xhc3NMb2FkZXIuamF2YQppbmRleCBlZDFhN2IwLi43ZDA4ZmM4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlQ2xhc3NMb2FkZXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlQ2xhc3NMb2FkZXIuamF2YQpAQCAtMjUsMzUgKzI1LDY2IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAotLyoqCi0gKiBTZWN1cmVDbGFzc0xvYWRlcnMgYXJlIHVzZWQgdG8gZHluYW1pY2FsbHkgbG9hZCwgbGluayBhbmQgaW5zdGFsbCBjbGFzc2VzCi0gKiBpbnRvIGEgcnVubmluZyBpbWFnZS4gQWRkaXRpb25hbGx5LCB0aGV5IChvcHRpb25hbGx5KSBhc3NvY2lhdGUgdGhlIGNsYXNzZXMKLSAqIHRoZXkgY3JlYXRlIHdpdGggYSBjb2RlIHNvdXJjZSBhbmQgcHJvdmlkZSBtZWNoYW5pc21zIHRvIGFsbG93IHRoZSByZWxldmFudAotICogcGVybWlzc2lvbnMgdG8gYmUgcmV0cmlldmVkLgotICogCi0gKi8KIAorLyoqCisgKiB7QGNvZGUgU2VjdXJlQ2xhc3NMb2FkZXJ9IHJlcHJlc2VudHMgYSB7QGNvZGUgQ2xhc3NMb2FkZXJ9IHdoaWNoIGFzc29jaWF0ZXMKKyAqIHRoZSBjbGFzc2VzIGl0IGxvYWRzIHdpdGggYSBjb2RlIHNvdXJjZSBhbmQgcHJvdmlkZSBtZWNoYW5pc21zIHRvIGFsbG93IHRoZQorICogcmVsZXZhbnQgcGVybWlzc2lvbnMgdG8gYmUgcmV0cmlldmVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIFNlY3VyZUNsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewogCiAgICAgLy8gQSBjYWNoZSBvZiBQcm90ZWN0aW9uRG9tYWlucyBmb3IgYSBnaXZlbiBDb2RlU291cmNlCiAgICAgcHJpdmF0ZSBIYXNoTWFwIHBkcyA9IG5ldyBIYXNoTWFwKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTZWN1cmVDbGFzc0xvYWRlcn0uIFRoZSBkZWZhdWx0CisgICAgICogcGFyZW50IHtAY29kZSBDbGFzc0xvYWRlcn0gaXMgdXNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBuZWVkcyB0aGUge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0ge0Bjb2RlIGNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXJ9IHRvIGJlCisgICAgICogZ3JhbnRlZCwgb3RoZXJ3aXNlIGEge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTZWN1cmVDbGFzc0xvYWRlcigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTZWN1cmVDbGFzc0xvYWRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogcGFyZW50IHtAY29kZSBDbGFzc0xvYWRlcn0uCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yCisgICAgICogbmVlZHMgdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBjaGVja0NyZWF0ZUNsYXNzTG9hZGVyfSB0byBiZQorICAgICAqIGdyYW50ZWQsIG90aGVyd2lzZSBhIHtAY29kZSBTZWN1cml0eUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQge0Bjb2RlIENsYXNzTG9hZGVyfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgY29uc3RydWN0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNlY3VyZUNsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCkgewogICAgICAgICBzdXBlcihwYXJlbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gZm9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogQ29kZVNvdXJjZX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvZGVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqICAgICAgICAgQ29kZVNvdXJjZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKENvZGVTb3VyY2UgY29kZXNvdXJjZSkgewogICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQsIFByb3RlY3Rpb25Eb21haW4gd2lsbCB0YWtlIGNhcmUgYWJvdXQKQEAgLTYyLDcgKzkzLDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBjbGFzcyBmcm9tIGFuIGFycmF5IG9mIGJ5dGVzIGNvbnRhaW5pbmcgYSBjbGFzcworICAgICAqIGRlZmluaXRpb24gaW4gY2xhc3MgZmlsZSBmb3JtYXQgd2l0aCBhbiBvcHRpb25hbCB7QGNvZGUgQ29kZVNvdXJjZX0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBuZXcgY2xhc3MuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIGEgbWVtb3J5IGltYWdlIG9mIGEgY2xhc3MgZmlsZS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IGluIGIgb2YgdGhlIGNsYXNzIGRhdGEuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgY2xhc3MgZGF0YS4KKyAgICAgKiBAcGFyYW0gY3MKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ29kZVNvdXJjZX0sIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGNsYXNzLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZ9IG9yIHtAY29kZSBsZW59IGFyZSBub3QgdmFsaWQgaW4gcmVzcGVjdCB0bworICAgICAqICAgICAgICAgICAgIHtAY29kZSBifS4KKyAgICAgKiBAdGhyb3dzIENsYXNzRm9ybWF0RXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGRhdGEgaXMgbm90IHZhbGlkIGNsYXNzIGRhdGEuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYWNrYWdlIHRvIHdoaWNoIHRoaXMgY2xhc3MgaXMgdG8gYmUgYWRkZWQsIGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgICBjb250YWlucyBjbGFzc2VzIHdoaWNoIHdlcmUgc2lnbmVkIGJ5IGRpZmZlcmVudCBjZXJ0aWZpY2F0ZXMsCisgICAgICogICAgICAgICAgICAgb3IgaWYgdGhlIGNsYXNzIG5hbWUgYmVnaW5zIHdpdGggImphdmEuIgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzczw/PiBkZWZpbmVDbGFzcyhTdHJpbmcgbmFtZSwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4sCiAgICAgICAgICAgICBDb2RlU291cmNlIGNzKSB7CkBAIC03MSw3ICsxMjUsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsYXNzIGZyb20gYW4gYXJyYXkgb2YgYnl0ZXMgY29udGFpbmluZyBhIGNsYXNzCisgICAgICogZGVmaW5pdGlvbiBpbiBjbGFzcyBmaWxlIGZvcm1hdCB3aXRoIGFuIG9wdGlvbmFsIHtAY29kZSBDb2RlU291cmNlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5ldyBjbGFzcy4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgYSBtZW1vcnkgaW1hZ2Ugb2YgYSBjbGFzcyBmaWxlLgorICAgICAqIEBwYXJhbSBjcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDb2RlU291cmNlfSwgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gYSBuZXcgY2xhc3MuCisgICAgICogQHRocm93cyBDbGFzc0Zvcm1hdEVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBkYXRhIGlzIG5vdCB2YWxpZCBjbGFzcyBkYXRhLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFja2FnZSB0byB3aGljaCB0aGlzIGNsYXNzIGlzIHRvIGJlIGFkZGVkLCBhbHJlYWR5CisgICAgICogICAgICAgICAgICAgY29udGFpbnMgY2xhc3NlcyB3aGljaCB3ZXJlIHNpZ25lZCBieSBkaWZmZXJlbnQgY2VydGlmaWNhdGVzLAorICAgICAqICAgICAgICAgICAgIG9yIGlmIHRoZSBjbGFzcyBuYW1lIGJlZ2lucyB3aXRoICJqYXZhLiIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8Pz4gZGVmaW5lQ2xhc3MoU3RyaW5nIG5hbWUsIEJ5dGVCdWZmZXIgYiwgQ29kZVNvdXJjZSBjcykgewogICAgICAgICAvL0ZJWE1FIDEuNSAtIHJlbW92ZSBiLmFycmF5KCksIGNhbGwgc3VwZXIuZGVmaW5lQ2xhc3MoLEJ5dGVCdWZmZXIsKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbS5qYXZhCmluZGV4IDBjZjUzNTMuLmUxZDk5ZTkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb20uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tLmphdmEKQEAgLTMzLDE2ICszMywxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jcnlwdG8uU0hBMVBSTkdfU2VjdXJlUmFuZG9tSW1wbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICoge0Bjb2RlIFNlY3VyZVJhbmRvbX0gaXMgYW4gZW5naW5lIGNsYXNzIHdoaWNoIGlzIGNhcGFibGUgb2YgZ2VuZXJhdGluZworICogY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHBzZXVkby1yYW5kb20gbnVtYmVycy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIFNlY3VyZVJhbmRvbSBleHRlbmRzIFJhbmRvbSB7CiAgICAgCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0OTQwNjcwMDA1NTYyMTg3TDsKICAgICAKICAgICAvLyBUaGUgc2VydmljZSBuYW1lLgpAQCAtNTEsNTAgKzQ4LDI5IEBACiAgICAgLy8gVXNlZCB0byBhY2Nlc3MgY29tbW9uIGVuZ2luZSBmdW5jdGlvbmFsaXR5CiAgICAgcHJpdmF0ZSBzdGF0aWMgdHJhbnNpZW50IEVuZ2luZSBlbmdpbmUgPSBuZXcgRW5naW5lKFNFUlZJQ0UpOwogICAgIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBQcm92aWRlciBwcm92aWRlcjsKICAgICAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgU2VjdXJlUmFuZG9tU3BpIHNlY3VyZVJhbmRvbVNwaTsgCiAgICAgCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBhbGdvcml0aG07CiAgICAgCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KICAgICBwcml2YXRlIGJ5dGVbXSBzdGF0ZTsKICAgICAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgYnl0ZVtdIHJhbmRvbUJ5dGVzOwogICAgIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBpbnQgcmFuZG9tQnl0ZXNVc2VkOwogICAgIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBsb25nIGNvdW50ZXI7CiAgICAgCiAgICAgLy8gSW50ZXJuYWwgU2VjdXJlUmFuZG9tIHVzZWQgZm9yIGdldFNlZWQoaW50KQogICAgIHByaXZhdGUgc3RhdGljIHRyYW5zaWVudCBTZWN1cmVSYW5kb20gaW50ZXJuYWxTZWN1cmVSYW5kb207CiAgICAgCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UKLSAgICAgKiA8Y29kZT5nZXRJbnN0YW5jZSgpPC9jb2RlPiBpbnN0ZWFkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNlY3VyZVJhbmRvbX0uIEFuIGltcGxlbWVudGF0aW9uIGZvcgorICAgICAqIHRoZSBoaWdoZXN0LXByaW9yaXR5IHByb3ZpZGVyIGlzIHJldHVybmVkLiBUaGUgY29uc3RydWN0ZWQgaW5zdGFuY2Ugd2lsbAorICAgICAqIG5vdCBoYXZlIGJlZW4gc2VlZGVkLgogICAgICAqIAotICAgICAqIEFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgaGlnaGVzdC1wcmlvcml0eSBwcm92aWRlciBpcyByZXR1cm5lZC4gVGhlCi0gICAgICogaW5zdGFuY2UgcmV0dXJuZWQgd2lsbCBub3QgaGF2ZSBiZWVuIHNlZWRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2VjdXJlUmFuZG9tKCkgewogICAgICAgICBzdXBlcigwKTsKQEAgLTExNSwxNCArOTEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZQotICAgICAqIDxjb2RlPmdldEluc3RhbmNlKCk8L2NvZGU+IGluc3RlYWQuCi0gICAgICogCi0gICAgICogQW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBoaWdoZXN0LXByaW9yaXR5IHByb3ZpZGVyIGlzIHJldHVybmVkLiBUaGUKLSAgICAgKiBpbnN0YW5jZSByZXR1cm5lZCB3aWxsIGJlIHNlZWRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2VjdXJlUmFuZG9tfS4gQW4gaW1wbGVtZW50YXRpb24gZm9yCisgICAgICogdGhlIGhpZ2hlc3QtcHJpb3JpdHkgcHJvdmlkZXIgaXMgcmV0dXJuZWQuIFRoZSBjb25zdHJ1Y3RlZCBpbnN0YW5jZSB3aWxsCisgICAgICogYmUgc2VlZGVkIHdpdGggdGhlIHBhcmFtZXRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2VlZAotICAgICAqICAgICAgICAgICAgYnl0ZXMgZm9ybWluZyB0aGUgc2VlZCBmb3IgdGhpcyBnZW5lcmF0b3IuCisgICAgICogICAgICAgICAgICB0aGUgc2VlZCBmb3IgdGhpcyBnZW5lcmF0b3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlY3VyZVJhbmRvbShieXRlW10gc2VlZCkgewogICAgICAgICB0aGlzKCk7CkBAIC0xNDMsOCArMTE4LDE0IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2VjdXJlUmFuZG9tfSB1c2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCiAgICAgICogCisgICAgICogQHBhcmFtIHNlY3VyZVJhbmRvbVNwaQorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNlY3VyaXR5IHByb3ZpZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTZWN1cmVSYW5kb20oU2VjdXJlUmFuZG9tU3BpIHNlY3VyZVJhbmRvbVNwaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyKSB7CkBAIC0xNjIsOCArMTQzLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTZWN1cmVSYW5kb219IHRoYXQgdXRpbGl6ZXMgdGhlCisgICAgICogc3BlY2lmaWVkIGFsZ29yaXRobS4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTZWN1cmVSYW5kb219IHRoYXQgdXRpbGl6ZXMgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2VjdXJlUmFuZG9tIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTc3LDE5ICsxNjgsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFNlY3VyZVJhbmRvbSB3aGljaCBpcyBjYXBhYmxlIG9mIHJ1bm5pbmcgdGhlIGFsZ29yaXRobQotICAgICAqIGRlc2NyaWJlZCBieSB0aGUgYXJndW1lbnQuIFRoZSByZXN1bHQgd2lsbCBiZSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzCi0gICAgICogb2YgU2VjdXJlUmFuZG9tU3BpIHdoaWNoIGltcGxlbWVudHMgdGhhdCBhbGdvcml0aG0uCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2VjdXJlUmFuZG9tfSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqIHNwZWNpZmllZCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhbGdvcml0aG0KLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgTmFtZSBvZiB0aGUgYWxnb3JpdGhtIGRlc2lyZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gdG8gdXNlLgogICAgICAqIEBwYXJhbSBwcm92aWRlcgotICAgICAqICAgICAgICAgICAgamF2YS5zZWN1cml0eS5Qcm92aWRlciBQcm92aWRlciB3aGljaCBoYXMgdG8gaW1wbGVtZW50IHRoZQotICAgICAqICAgICAgICAgICAgYWxnb3JpdGhtCi0gICAgICogQHJldHVybiBTZWN1cmVSYW5kb20gYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGFsZ29yaXRobSBkZXNpcmVkLgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlIGFsZ29yaXRobSBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTZWN1cmVSYW5kb219IHRoYXQgdXRpbGl6ZXMgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2VjdXJlUmFuZG9tIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewpAQCAtMjA1LDggKzE5OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2VjdXJlUmFuZG9tfSB0aGF0IHV0aWxpemVzIHRoZQorICAgICAqIHNwZWNpZmllZCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gdG8gdXNlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNlY3VyaXR5IHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNlY3VyZVJhbmRvbX0gdGhhdCB1dGlsaXplcyB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2VjdXJlUmFuZG9tIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTIyMywzOCArMjI5LDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUHJvdmlkZXIgb2YgdGhlIHNlY3VyZSByYW5kb20gcmVwcmVzZW50ZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBTZWN1cmVSYW5kb219LgogICAgICAqIAotICAgICAqIEByZXR1cm4gUHJvdmlkZXIgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIFNlY3VyZVJhbmRvbX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIG9mIHRoaXMge0Bjb2RlIFNlY3VyZVJhbmRvbX0uCiAgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIG9mIHRoaXMge0Bjb2RlIFNlY3VyZVJhbmRvbX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXNlZWRzIHRoaXMge0Bjb2RlIFNlY3VyZVJhbmRvbX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIHNlZWR9LiBUaGUgc2VlZCBvZiB0aGlzIHtAY29kZSBTZWN1cmVSYW5kb219IGluc3RhbmNlIGlzIHN1cHBsZW1lbnRlZCwKKyAgICAgKiBub3QgcmVwbGFjZWQuCiAgICAgICogCisgICAgICogQHBhcmFtIHNlZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc2VlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2VlZChieXRlW10gc2VlZCkgewogICAgICAgICBzZWN1cmVSYW5kb21TcGkuZW5naW5lU2V0U2VlZChzZWVkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNlZWRzIHRoaXMgcmFuZG9tIG9iamVjdCB3aXRoIHRoZSBlaWdodCBieXRlcyBkZXNjcmliZWQgYnkgdGhlCi0gICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIGxvbmcgcHJvdmlkZWQuCi0gICAgICogCisgICAgICogUmVzZWVkcyB0aGlzIHRoaXMge0Bjb2RlIFNlY3VyZVJhbmRvbX0gaW5zdGFuY2Ugd2l0aCB0aGUgZWlnaHQgYnl0ZXMKKyAgICAgKiBkZXNjcmliZWQgYnkgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB7QGNvZGUgbG9uZyBzZWVkfS4gVGhlIHNlZWQKKyAgICAgKiBvZiB0aGlzIHtAY29kZSBTZWN1cmVSYW5kb219IGluc3RhbmNlIGlzIHN1cHBsZW1lbnRlZCwgbm90IHJlcGxhY2VkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZWVkCi0gICAgICogICAgICAgICAgICBsb25nIE51bWJlciB3aG9zZSByZXByZXNlbnRhdGlvbiB0byB1c2UgdG8gcmVzZWVkIHRoZQotICAgICAqICAgICAgICAgICAgcmVjZWl2ZXIuCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNlZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2VlZChsb25nIHNlZWQpIHsKICAgICAgICAgaWYgKHNlZWQgPT0gMCkgeyAgICAvLyBza2lwIGNhbGwgZnJvbSBSYW5kb20KQEAgLTI3NCwxNiArMjg4LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBHZW5lcmF0ZXMgYW5kIHN0b3JlcyByYW5kb20gYnl0ZXMgaW4gdGhlIGdpdmVuIHtAY29kZSBieXRlW119IGZvciBlYWNoCisgICAgICogYXJyYXkgZWxlbWVudC4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZVtdfSB0byBiZSBmaWxsZWQgd2l0aCByYW5kb20gYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5leHRCeXRlcyhieXRlW10gYnl0ZXMpIHsKICAgICAgICAgc2VjdXJlUmFuZG9tU3BpLmVuZ2luZU5leHRCeXRlcyhieXRlcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgYW4ge0Bjb2RlIGludH0gY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAqIHJhbmRvbSBiaXRzIChyaWdodCBqdXN0aWZpZWQsIHdpdGggbGVhZGluZyB6ZXJvcykuCiAgICAgICogCisgICAgICogQHBhcmFtIG51bUJpdHMKKyAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIHRvIGJlIGdlbmVyYXRlZC4gQW4gaW5wdXQgdmFsdWUgc2hvdWxkIGJlIGluCisgICAgICogICAgICAgICAgICB0aGUgcmFuZ2UgWzAsIDMyXS4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBpbnR9IGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmFuZG9tIGJpdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBuZXh0KGludCBudW1CaXRzKSB7CiAgICAgICAgIGlmIChudW1CaXRzIDwgMCkgewpAQCAtMzA2LDEyICszMzAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBudW1iZXIgb2Ygc2VlZCBieXRlcywgY29tcHV0ZWQgdXNpbmcgdGhlIHNlZWQKLSAgICAgKiBnZW5lcmF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IHRoaXMgY2xhc3MuCisgICAgICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlZWQgYnl0ZXMsIGNvbXB1dGVkIHVzaW5nCisgICAgICogdGhlIHNlZWQgZ2VuZXJhdGlvbiBhbGdvcml0aG0gdXNlZCBieSB0aGlzIHtAY29kZSBTZWN1cmVSYW5kb219LgogICAgICAqIAogICAgICAqIEBwYXJhbSBudW1CeXRlcwotICAgICAqICAgICAgICAgICAgaW50IHRoZSBnaXZlbiBudW1iZXIgb2Ygc2VlZCBieXRlcwotICAgICAqIEByZXR1cm4gYnl0ZVtdIFRoZSBzZWVkIGJ5dGVzIGdlbmVyYXRlZAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzZWVkIGJ5dGVzLgorICAgICAqIEByZXR1cm4gdGhlIHNlZWQgYnl0ZXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRTZWVkKGludCBudW1CeXRlcykgewogICAgICAgICBpZiAoaW50ZXJuYWxTZWN1cmVSYW5kb20gPT0gbnVsbCkgewpAQCAtMzIxLDEyICszNDYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBjZXJ0YWluIG51bWJlciBvZiBzZWVkIGJ5dGVzCi0gICAgICogCisgICAgICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlZWQgYnl0ZXMsIGNvbXB1dGVkIHVzaW5nCisgICAgICogdGhlIHNlZWQgZ2VuZXJhdGlvbiBhbGdvcml0aG0gdXNlZCBieSB0aGlzIHtAY29kZSBTZWN1cmVSYW5kb219LgogICAgICAqIAogICAgICAqIEBwYXJhbSBudW1CeXRlcwotICAgICAqICAgICAgICAgICAgaW50IE51bWJlciBvZiBzZWVkIGJ5dGVzIHRvIGdlbmVyYXRlCi0gICAgICogQHJldHVybiBieXRlW10gVGhlIHNlZWQgYnl0ZXMgZ2VuZXJhdGVkCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZWQgYnl0ZXMuCisgICAgICogQHJldHVybiB0aGUgc2VlZCBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdlbmVyYXRlU2VlZChpbnQgbnVtQnl0ZXMpIHsKICAgICAgICAgcmV0dXJuIHNlY3VyZVJhbmRvbVNwaS5lbmdpbmVHZW5lcmF0ZVNlZWQobnVtQnl0ZXMpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbVNwaS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbVNwaS5qYXZhCmluZGV4IDFlYjljMWEuLjdjZTg4MGMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb21TcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tU3BpLmphdmEKQEAgLTI1LDMzICsyNSw0NSBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBTZXJ2aWNlIFByb3ZpZGVyIEludGVyZmFjZSAodGhlcmVmb3JlIHRoZSBTcGkgc3VmZml4KSBmb3IKLSAqIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gYWxnb3JpdGhtcyB0byBiZSBzdXBwbGllZCBieSBwcm92aWRlcnMuCisgKiB7QGNvZGUgU2VjdXJlUmFuZG9tU3BpfSBpcyB0aGUgPGk+U2VydmljZSBQcm92aWRlciBJbnRlcmZhY2U8L2k+ICg8Yj5TUEk8L2I+KSBkZWZpbml0aW9uCisgKiBmb3Ige0BsaW5rIFNlY3VyZVJhbmRvbX0uIAogICogCisgKiBAc2VlIFNlY3VyZVJhbmRvbQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWN1cmVSYW5kb21TcGkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogICAgIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI5OTE4NTQxNjEwMDkxOTE4MzBMOwogICAgICAgICAgICAgICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmVzZWVkcyB0aGlzIHtAY29kZSBTZWN1cmVSYW5kb21TcGl9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBzZWVkfS4gVGhlIHNlZWQgb2YgdGhpcyB7QGNvZGUgU2VjdXJlUmFuZG9tU3BpfSBpbnN0YW5jZSBpcyBzdXBwbGVtZW50ZWQsCisgICAgICogbm90IHJlcGxhY2VkLgogICAgICAqIAorICAgICAqIEBwYXJhbSBzZWVkCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNlZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lU2V0U2VlZChieXRlW10gc2VlZCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBHZW5lcmF0ZXMgYW5kIHN0b3JlcyByYW5kb20gYnl0ZXMgaW4gdGhlIGdpdmVuIHtAY29kZSBieXRlW119IGZvciBlYWNoCisgICAgICogYXJyYXkgZWxlbWVudC4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZVtdfSB0byBiZSBmaWxsZWQgd2l0aCByYW5kb20gYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lTmV4dEJ5dGVzKGJ5dGVbXSBieXRlcyk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2VlZCBieXRlcywgY29tcHV0ZWQgdXNpbmcKKyAgICAgKiB0aGUgc2VlZCBnZW5lcmF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IHRoaXMge0Bjb2RlIFNlY3VyZVJhbmRvbVNwaX0uCiAgICAgICogCisgICAgICogQHBhcmFtIG51bUJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZWQgYnl0ZXMuCisgICAgICogQHJldHVybiB0aGUgc2VlZCBieXRlcworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gZW5naW5lR2VuZXJhdGVTZWVkKGludCBudW1CeXRlcyk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJpdHkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TZWN1cml0eS5qYXZhCmluZGV4IDI4ZmQyMTAwLi43OGFiZGI3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJpdHkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJpdHkuamF2YQpAQCAtMjcsOCArMjcsMTAgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworLy8gRU5EIGFuZHJvaWQtYWRkZWQKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtNDUsNyArNDcsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEZvciBhY2Nlc3MgdG8gc2VjdXJpdHkgcHJvdmlkZXJzIGFuZCBwcm9wZXJ0aWVzLgorICoge0Bjb2RlIFNlY3VyaXR5fSBpcyB0aGUgY2VudHJhbCBjbGFzcyBpbiB0aGUgSmF2YSBTZWN1cml0eSBBUEkuIEl0IG1hbmFnZXMKKyAqIHRoZSBsaXN0IG9mIHNlY3VyaXR5IHtAY29kZSBQcm92aWRlcn0gdGhhdCBoYXZlIGJlZW4gaW5zdGFsbGVkIGludG8gdGhpcworICogcnVudGltZSBlbnZpcm9ubWVudC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTZWN1cml0eSB7CiAKQEAgLTgxLDU1ICs4Nyw1NSBAQAogICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAKICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLS8vICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvciAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICsgInNlY3VyaXR5IiArIEZpbGUuc2VwYXJhdG9yICsgImphdmEuc2VjdXJpdHkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLyAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewotLy8gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpcyk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Byb3BzLmxvYWQoaXMpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgPSB0cnVlOwotLy8gICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotLy8gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLS8vLy8gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBsb2FkIFNlY3VyaXR5IHByb3BlcnRpZXMgZmlsZTogIgotLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc2VjcHJvcHMuZ2V0UHJvcGVydHkoInNlY3VyaXR5LmFsbG93Q3VzdG9tUHJvcGVydGllc0ZpbGUiLCAidHJ1ZSIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotLy8gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN1cml0eUZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3VyaXR5RmlsZSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWN1cml0eUZpbGUuc3RhcnRzV2l0aCgiPSIpKSB7IC8vIG92ZXJ3cml0ZSAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgPSBmYWxzZTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5RmlsZSA9IHNlY3VyaXR5RmlsZS5zdWJzdHJpbmcoMSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5RmlsZSA9IFBvbGljeVV0aWxzLmV4cGFuZChzZWN1cml0eUZpbGUsIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQb2xpY3lVdGlscy5FeHBhbnNpb25GYWlsZWRFeGNlcHRpb24gZSkgewotLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBsb2FkIGN1c3RvbSBTZWN1cml0eSBwcm9wZXJ0aWVzIGZpbGUgIgotLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjdXJpdHlGaWxlICsiOiAiICsgZSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKHNlY3VyaXR5RmlsZSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpcyk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHNlY3VyaXR5RmlsZSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh1cmwub3BlblN0cmVhbSgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Byb3BzLmxvYWQoaXMpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkID0gdHJ1ZTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLS8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgbG9hZCBjdXN0b20gU2VjdXJpdHkgcHJvcGVydGllcyBmaWxlICIKLS8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlY3VyaXR5RmlsZSArIjogIiArIGUpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgKyAic2VjdXJpdHkiICsgRmlsZS5zZXBhcmF0b3IgKyAiamF2YS5zZWN1cml0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgICAgICAgICAvLyBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIC8vICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpcyk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBzZWNwcm9wcy5sb2FkKGlzKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIGxvYWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIC8vICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8vLyAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGxvYWQgU2VjdXJpdHkgcHJvcGVydGllcyBmaWxlOiAiCisgICAgICAgICAgICAgICAgLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICAgICAgICAgIC8vICAgICB9CisgICAgICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHNlY3Byb3BzLmdldFByb3BlcnR5KCJzZWN1cml0eS5hbGxvd0N1c3RvbVByb3BlcnRpZXNGaWxlIiwgInRydWUiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKyAgICAgICAgICAgICAgICAvLyAgICAgU3RyaW5nIHNlY3VyaXR5RmlsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAvLyAgICAgaWYgKHNlY3VyaXR5RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoc2VjdXJpdHlGaWxlLnN0YXJ0c1dpdGgoIj0iKSkgeyAvLyBvdmVyd3JpdGUgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgc2VjcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgbG9hZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBzZWN1cml0eUZpbGUgPSBzZWN1cml0eUZpbGUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBzZWN1cml0eUZpbGUgPSBQb2xpY3lVdGlscy5leHBhbmQoc2VjdXJpdHlGaWxlLCBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gY2F0Y2ggKFBvbGljeVV0aWxzLkV4cGFuc2lvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8vLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGxvYWQgY3VzdG9tIFNlY3VyaXR5IHByb3BlcnRpZXMgZmlsZSAiCisgICAgICAgICAgICAgICAgLy8vLyAgICAgICAgICAgICAgICAgICAgICsgc2VjdXJpdHlGaWxlICsiOiAiICsgZSk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBmID0gbmV3IEZpbGUoc2VjdXJpdHlGaWxlKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIElucHV0U3RyZWFtIGlzOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaXMpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHNlY3VyaXR5RmlsZSk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0odXJsLm9wZW5TdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHNlY3Byb3BzLmxvYWQoaXMpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyAvLyAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBsb2FkIGN1c3RvbSBTZWN1cml0eSBwcm9wZXJ0aWVzIGZpbGUgIgorICAgICAgICAgICAgICAgIC8vIC8vICAgICAgICAgICAgICAgICAgICArIHNlY3VyaXR5RmlsZSArIjogIiArIGUpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vICAgICB9CisgICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKIAogICAgICAgICAgICAgICAgIGlmICghbG9hZGVkKSB7CkBAIC0xNTUsMTQgKzE2MSwyMiBAQAogICAgICAgICBzZWNwcm9wcy5wdXQoInNlY3VyaXR5LnByb3ZpZGVyLjQiLCAib3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQm91bmN5Q2FzdGxlUHJvdmlkZXIiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgIH0KIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIGFkZGVkIERlcHJlY2F0ZWQgYW5ub3RhdGlvbgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKICAgICAvKioKLSAgICAgKiBEZXByZWNhdGVkIG1ldGhvZCB3aGljaCByZXR1cm5zIG51bGwuCi0gICAgICogQHBhcmFtIGFsZ05hbWUgCi0gICAgICogQHBhcmFtIHByb3BOYW1lIAotICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkICAgIFVzZSBBbGdvcml0aG1QYXJhbWV0ZXJzIGFuZCBLZXlGYWN0b3J5IGluc3RlYWQKKyAgICAgKiBSZXR1cm5zIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gcHJvcE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEFsZ29yaXRobVBhcmFtZXRlcnN9IGFuZCB7QGxpbmsgS2V5RmFjdG9yeX0KKyAgICAgKiAgICAgICAgICAgICBpbnN0ZWFkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtUHJvcGVydHkoU3RyaW5nIGFsZ05hbWUsIFN0cmluZyBwcm9wTmFtZSkgewogICAgICAgICBpZiAoYWxnTmFtZSA9PSBudWxsIHx8IHByb3BOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTgyLDggKzE5NiwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluc2VydCB0aGUgZ2l2ZW4ge0Bjb2RlIFByb3ZpZGVyfSBhdCB0aGUgc3BlY2lmaWVkIHtAY29kZSBwb3NpdGlvbn0uIFRoZQorICAgICAqIHBvc2l0aW9ucyBkZWZpbmUgdGhlIHByZWZlcmVuY2Ugb3JkZXIgaW4gd2hpY2ggcHJvdmlkZXJzIGFyZSBzZWFyY2hlZCBmb3IKKyAgICAgKiByZXF1ZXN0ZWQgYWxnb3JpdGhtcy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBpbnNlcnRQcm92aWRlci5OQU1FfSAod2hlcmUgTkFNRSBpcworICAgICAqIHRoZSBwcm92aWRlciBuYW1lKSB0byBiZSBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259CisgICAgICogd2lsbCBiZSB0aHJvd24uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyIHRvIGluc2VydC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiAoc3RhcnRpbmcgZnJvbSAxKS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhY3R1YWwgcG9zaXRpb24gb3Ige0Bjb2RlIC0xfSBpZiB0aGUgZ2l2ZW4ge0Bjb2RlIHByb3ZpZGVyfQorICAgICAqICAgICAgICAgd2FzIGFscmVhZHkgaW4gdGhlIGxpc3QuIFRoZSBhY3R1YWwgcG9zaXRpb24gbWF5IGJlIGRpZmZlcmVudAorICAgICAqICAgICAgICAgZnJvbSB0aGUgZGVzaXJlZCBwb3NpdGlvbi4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGludCBpbnNlcnRQcm92aWRlckF0KFByb3ZpZGVyIHByb3ZpZGVyLAogICAgICAgICAgICAgaW50IHBvc2l0aW9uKSB7CkBAIC0yMDQsMjEgKzIzNyw1MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGV4dHJhIHByb3ZpZGVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHByb3ZpZGVycy4KLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgCisgICAgICogQWRkcyB0aGUgZ2l2ZW4ge0Bjb2RlIHByb3ZpZGVyfSB0byB0aGUgY29sbGVjdGlvbiBvZiBwcm92aWRlcnMgYXQgdGhlCisgICAgICogbmV4dCBhdmFpbGFibGUgcG9zaXRpb24uCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcworICAgICAqIHRoZSB7QGNvZGUgU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgaW5zZXJ0UHJvdmlkZXIuTkFNRX0gKHdoZXJlIE5BTUUgaXMKKyAgICAgKiB0aGUgcHJvdmlkZXIgbmFtZSkgdG8gYmUgZ3JhbnRlZCwgb3RoZXJ3aXNlIGEge0Bjb2RlIFNlY3VyaXR5RXhjZXB0aW9ufQorICAgICAqIHdpbGwgYmUgdGhyb3duLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludCBUaGUgcHJpb3JpdHkvcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVyIGFkZGVkLgotICAgICAqIEBleGNlcHRpb24gU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIFNlY3VyaXR5TWFuYWdlciBpbnN0YWxsZWQgYW5kIGl0IGRlbmllcwotICAgICAqICAgICAgICAgICAgICAgIGFkZGluZyBhIG5ldyBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciB0byBiZSBhZGRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhY3R1YWwgcG9zaXRpb24gb3Ige0Bjb2RlIC0xfSBpZiB0aGUgZ2l2ZW4ge0Bjb2RlIHByb3ZpZGVyfQorICAgICAqICAgICAgICAgd2FzIGFscmVhZHkgaW4gdGhlIGxpc3QuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBhZGRQcm92aWRlcihQcm92aWRlciBwcm92aWRlcikgewogICAgICAgICByZXR1cm4gaW5zZXJ0UHJvdmlkZXJBdChwcm92aWRlciwgMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmVtb3ZlcyB0aGUge0Bjb2RlIFByb3ZpZGVyfSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmb3JtIHRoZSBjb2xsZWN0aW9uCisgICAgICogb2YgcHJvdmlkZXJzLiBJZiB0aGUgdGhlIHtAY29kZSBQcm92aWRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMKKyAgICAgKiByZW1vdmVkLCBhbGwgcHJvdmlkZXIgYXQgYSBncmVhdGVyIHBvc2l0aW9uIGFyZSBzaGlmdGVkIGRvd24gb25lCisgICAgICogcG9zaXRpb24uCisgICAgICogPHA+CisgICAgICogUmV0dXJucyBzaWxlbnRseSBpZiB7QGNvZGUgbmFtZX0gaXMge0Bjb2RlIG51bGx9IG9yIG5vIHByb3ZpZGVyIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIG5hbWUgaXMgaW5zdGFsbGVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSByZW1vdmVQcm92aWRlci5OQU1FfSAod2hlcmUgTkFNRSBpcworICAgICAqIHRoZSBwcm92aWRlciBuYW1lKSB0byBiZSBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259CisgICAgICogd2lsbCBiZSB0aHJvd24uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXIgdG8gcmVtb3ZlLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCBhbmQgdGhlIGNhbGxlciBkb2VzCisgICAgICogICAgICAgICAgICAgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbnZva2UgdGhpcyBtZXRob2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm92aWRlcihTdHJpbmcgbmFtZSkgewogICAgICAgICAvLyBJdCBpcyBub3QgY2xlYXIgZnJvbSBzcGVjLjoKQEAgLTI0NSwzMyArMzA3LDUzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBpbnN0YWxsZWQgcHJvdmlkZXJzLiBUaGUgcHJvdmlkZXJzIGFyZQorICAgICAqIG9yZGVyZWQgYWNjb3JkaW5nIHRoZWlyIHByZWZlcmVuY2Ugb3JkZXIuCisgICAgICogCisgICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCBpbnN0YWxsZWQgcHJvdmlkZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFByb3ZpZGVyW10gZ2V0UHJvdmlkZXJzKCkgewogICAgICAgICByZXR1cm4gU2VydmljZXMuZ2V0UHJvdmlkZXJzKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFByb3ZpZGVyfSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gUmV0dXJucyB7QGNvZGUKKyAgICAgKiBudWxsfSBpZiBuYW1lIGlzIHtAY29kZSBudWxsfSBvciBubyBwcm92aWRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcworICAgICAqIGluc3RhbGxlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgbWF5YmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBTZXJ2aWNlcy5nZXRQcm92aWRlcihuYW1lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHByb3ZpZGVycyB3aGljaCBtZWV0IHRoZSB1c2VyIHN1cHBsaWVkIHN0cmluZwotICAgICAqIGZpbHRlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm92aWRlcnMgd2hpY2ggbWVldCB0aGUgdXNlciBzdXBwbGllZCBzdHJpbmcKKyAgICAgKiBmaWx0ZXIuIFRoZSBzcGVjaWZpZWQgZmlsdGVyIG11c3QgYmUgc3VwcGxpZWQgaW4gb25lIG9mIHR3byBmb3JtYXRzOgorICAgICAqIDxubD4KKyAgICAgKiA8bGk+IENSWVBUT19TRVJWSUNFX05BTUUuQUxHT1JJVEhNX09SX1RZUEUgCisgICAgICogPHA+CisgICAgICogKGZvciBleGFtcGxlOiAiTWVzc2FnZURpZ2VzdC5TSEEiKSAKKyAgICAgKiA8bGk+IENSWVBUT19TRVJWSUNFX05BTUUuQUxHT1JJVEhNX09SX1RZUEUKKyAgICAgKiBBVFRSX05BTUU6QVRUUl9WQUxVRQorICAgICAqIDxwPgorICAgICAqIChmb3IgZXhhbXBsZTogIlNpZ25hdHVyZS5NRDJ3aXRoUlNBIEtleVNpemU6NTEyIikKKyAgICAgKiA8L25sPgogICAgICAqIAogICAgICAqIEBwYXJhbSBmaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIGNhc2UtaW5zZW5zaXRpdmUgZmlsdGVyCi0gICAgICogQHJldHVybiB0aGUgcHJvdmlkZXJzIHdoaWNoIG1lZXQgdGhlIHVzZXIgc3VwcGxpZWQgc3RyaW5nIGZpbHRlcgotICAgICAqICAgICAgICAgPGNvZGU+ZmlsdGVyPC9jb2RlPi4gQSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBzaWduaWZpZXMKLSAgICAgKiAgICAgICAgIHRoYXQgbm9uZSBvZiB0aGUgaW5zdGFsbGVkIHByb3ZpZGVycyBtZWV0cyB0aGUgZmlsdGVyCi0gICAgICogICAgICAgICBzcGVjaWZpY2F0aW9uCi0gICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYW4gdW51c2FibGUgZmlsdGVyIGlzIHN1cHBsaWVkCisgICAgICogICAgICAgICAgICBjYXNlLWluc2Vuc2l0aXZlIGZpbHRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlcnMgd2hpY2ggbWVldCB0aGUgdXNlciBzdXBwbGllZCBzdHJpbmcgZmlsdGVyIHtAY29kZQorICAgICAqICAgICAgICAgZmlsdGVyfS4gQSB7QGNvZGUgbnVsbH0gdmFsdWUgc2lnbmlmaWVzIHRoYXQgbm9uZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGluc3RhbGxlZCBwcm92aWRlcnMgbWVldHMgdGhlIGZpbHRlciBzcGVjaWZpY2F0aW9uLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIHVudXNhYmxlIGZpbHRlciBpcyBzdXBwbGllZC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGZpbHRlcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXJbXSBnZXRQcm92aWRlcnMoU3RyaW5nIGZpbHRlcikgewogICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHsKQEAgLTI5Niw4ICszNzgsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm92aWRlcnMgd2hpY2ggbWVldCB0aGUgdXNlciBzdXBwbGllZCBzZXQgb2YKKyAgICAgKiBmaWx0ZXJzLiBUaGUgZmlsdGVyIG11c3QgYmUgc3VwcGxpZWQgaW4gb25lIG9mIHR3byBmb3JtYXRzOgorICAgICAqIDxubD4KKyAgICAgKiA8bGk+IENSWVBUT19TRVJWSUNFX05BTUUuQUxHT1JJVEhNX09SX1RZUEUKKyAgICAgKiA8cD4KKyAgICAgKiBmb3IgZXhhbXBsZTogIk1lc3NhZ2VEaWdlc3QuU0hBIiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgbXVzdAorICAgICAqIGJlIGFuIGVtcHR5IHN0cmluZy4gPGxpPiBDUllQVE9fU0VSVklDRV9OQU1FLkFMR09SSVRITV9PUl9UWVBFCisgICAgICogQVRUUl9OQU1FOkFUVFJfVkFMVUUKKyAgICAgKiA8cD4KKyAgICAgKiBmb3IgZXhhbXBsZTogIlNpZ25hdHVyZS5NRDJ3aXRoUlNBIEtleVNpemU6NTEyIiB3aGVyZSAiS2V5U2l6ZTo1MTIiIGlzCisgICAgICogdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXIgbWFwIGVudHJ5LgorICAgICAqIDwvbmw+CisgICAgICogCisgICAgICogQHBhcmFtIGZpbHRlcgorICAgICAqICAgICAgICAgICAgY2FzZS1pbnNlbnNpdGl2ZSBmaWx0ZXIuCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXJzIHdoaWNoIG1lZXQgdGhlIHVzZXIgc3VwcGxpZWQgc3RyaW5nIGZpbHRlciB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZpbHRlcn0uIEEge0Bjb2RlIG51bGx9IHZhbHVlIHNpZ25pZmllcyB0aGF0IG5vbmUgb2YgdGhlCisgICAgICogICAgICAgICBpbnN0YWxsZWQgcHJvdmlkZXJzIG1lZXRzIHRoZSBmaWx0ZXIgc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiB1bnVzYWJsZSBmaWx0ZXIgaXMgc3VwcGxpZWQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBmaWx0ZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBQcm92aWRlcltdIGdldFByb3ZpZGVycyhNYXA8U3RyaW5nLFN0cmluZz4gZmlsdGVyKSB7CiAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgewpAQCAtMzY1LDE2ICs0NjgsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzZWN1cml0eSBwcm9wZXJ0eSBuYW1lZCBieSB0aGUgYXJndW1lbnQuCi0gICAgICogCisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcworICAgICAqIHRoZSB7QGNvZGUgU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgZ2V0UHJvcGVydHkuS0VZfSAod2hlcmUgS0VZIGlzIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUga2V5fSkgdG8gYmUgZ3JhbnRlZCwgb3RoZXJ3aXNlIGEge0Bjb2RlCisgICAgICogU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIHByb3BlcnR5IG5hbWUKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgcHJvcGVydHkgdmFsdWUKLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBTZWN1cml0eU1hbmFnZXIgaW5zdGFsbGVkIGFuZCBpdCB3aWxsIG5vdAotICAgICAqICAgICAgICAgICAgICAgIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGN1cnJlbnQgYWNjZXNzCi0gICAgICogICAgICAgICAgICAgICAgY29udHJvbCBjb250ZXh0LgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBzZWN1cml0eSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc2VjdXJpdHkgcHJvcGVydHkuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CiAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewpAQCAtMzg4LDE3ICs0OTUsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgZ2l2ZW4gc2VjdXJpdHkgcHJvcGVydHkuCi0gICAgICogCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzZWN1cml0eSBwcm9wZXJ0eS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAY29kZSBTZWN1cml0eU1hbmFnZXJ9IGlzIGluc3RhbGxlZCwgY29kZSBjYWxsaW5nIHRoaXMgbWV0aG9kIG5lZWRzCisgICAgICogdGhlIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHtAY29kZSBzZXRQcm9wZXJ0eS5LRVl9ICh3aGVyZSBLRVkgaXMgdGhlCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBrZXl9KSB0byBiZSBncmFudGVkLCBvdGhlcndpc2UgYSB7QGNvZGUKKyAgICAgKiBTZWN1cml0eUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSBwcm9wZXJ0eS4KICAgICAgKiBAcGFyYW0gZGF0bnVtCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIHByb3BlcnR5IHZhbHVlLgotICAgICAqIEBleGNlcHRpb24gU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIFNlY3VyaXR5TWFuYWdlciBpbnN0YWxsZWQgYW5kIGl0IHdpbGwgbm90Ci0gICAgICogICAgICAgICAgICAgICAgYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlIHNldCBmcm9tIHRoZSBjdXJyZW50IGFjY2VzcwotICAgICAqICAgICAgICAgICAgICAgIGNvbnRyb2wgY29udGV4dC4KKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgc2VjdXJpdHkgcHJvcGVydHkuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEge0Bjb2RlIFNlY3VyaXR5TWFuYWdlcn0gaXMgaW5zdGFsbGVkIGFuZCB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiAgICAgICAgICAgICBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGRhdG51bSkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC00MDksOCArNTIxLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIHtAY29kZSBTZXR9IG9mIGFsbCByZWdpc3RlcmVkIGFsZ29yaXRobXMgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjcnlwdG9ncmFwaGljIHNlcnZpY2UuIHtAY29kZSAiU2lnbmF0dXJlIn0sIHtAY29kZSAiQ2lwaGVyIn0gYW5kIHtAY29kZQorICAgICAqICJLZXlTdG9yZSJ9IGFyZSBleGFtcGxlcyBmb3Igc3VjaCBraW5kIG9mIHNlcnZpY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNhc2UtaW5zZW5zaXRpdmUgbmFtZSBvZiB0aGUgc2VydmljZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNldH0gb2YgYWxsIHJlZ2lzdGVyZWQgYWxnb3JpdGhtcyBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgY3J5cHRvZ3JhcGhpYyBzZXJ2aWNlLCBvciBhbiBlbXB0eSB7QGNvZGUgU2V0fSBpZiB7QGNvZGUKKyAgICAgKiAgICAgICAgIHNlcnZpY2VOYW1lfSBpcyB7QGNvZGUgbnVsbH0gb3IgaWYgbm8gcmVnaXN0ZXJlZCBwcm92aWRlcgorICAgICAqICAgICAgICAgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0QWxnb3JpdGhtcyhTdHJpbmcgc2VydmljZU5hbWUpIHsKICAgICAgICAgU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwpAQCAtNDI4LDcgKzU0OSw3IEBACiAKICAgICAvKioKICAgICAgKiAKLSAgICAgKiBVcGRhdGUgc2VxdWVuY2UgbnVtYmVycyBvZiBhbGwgcHJvdmlkZXJzCisgICAgICogVXBkYXRlIHNlcXVlbmNlIG51bWJlcnMgb2YgYWxsIHByb3ZpZGVycy4KICAgICAgKiAgCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW51bVByb3ZpZGVycygpIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb24uamF2YQppbmRleCBmMzMxYjE4Li44N2YzYWFhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJpdHlQZXJtaXNzaW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhCkBAIC0yMywzNSArMjMsMzcgQEAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAogLyoqCi0gKiBTZWN1cml0eVBlcm1pc3Npb24gb2JqZWN0cyBndWFyZCBhY2Nlc3MgdG8gdGhlIG1lY2hhbmlzbXMgd2hpY2ggaW1wbGVtZW50Ci0gKiBzZWN1cml0eS4gU2VjdXJpdHkgcGVybWlzc2lvbnMgaGF2ZSBuYW1lcywgYnV0IG5vdCBhY3Rpb25zLgorICoge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0gb2JqZWN0cyBndWFyZCBhY2Nlc3MgdG8gdGhlIG1lY2hhbmlzbXMgd2hpY2gKKyAqIGltcGxlbWVudCBzZWN1cml0eS4gU2VjdXJpdHkgcGVybWlzc2lvbnMgaGF2ZSBuYW1lcywgYnV0IG5vdCBhY3Rpb25zLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNlY3VyaXR5UGVybWlzc2lvbiBleHRlbmRzIEJhc2ljUGVybWlzc2lvbiB7CiAKLSAgICAvKiogCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzNjEwOTkzNjIyNDA1MDQ3MEw7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTZWN1cml0eVBlcm1pc3Npb259IHdpdGggdGhlIGdpdmVuCisgICAgICogbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBuZXcgcGVybWlzc2lvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZWN1cml0eVBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFjdGlvbiBsaXN0LgotICAgICAqIFRoZSBhY3Rpb24gbGlzdCBpcyBpZ25vcmVkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNlY3VyaXR5UGVybWlzc2lvbn0gd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiB7QGNvZGUgbmFtZX0gYW5kIHtAY29kZSBhY3Rpb259IGxpc3QuIFRoZSBhY3Rpb24gbGlzdCBpcyBpZ25vcmVkIC0gaXQgaXMKKyAgICAgKiBleGlzdGluZyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIG9ubHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgbmV3IHBlcm1pc3Npb24uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGVybWlzc2lvbi4KICAgICAgKiBAcGFyYW0gYWN0aW9uCi0gICAgICogICAgICAgICAgICBTdHJpbmcgaWdub3JlZC4KKyAgICAgKiAgICAgICAgICAgIGlnbm9yZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNlY3VyaXR5UGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbikgewogICAgICAgICBzdXBlcihuYW1lLCBhY3Rpb24pOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZS5qYXZhCmluZGV4IDA3MTFkOGYuLmU1ZDQ4OGUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TaWduYXR1cmUuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlLmphdmEKQEAgLTM0LDEwICszNCwxMyBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIHtAY29kZSBTaWduYXR1cmV9IGlzIGFuIGVuZ2luZSBjbGFzcyB3aGljaCBpcyBjYXBhYmxlIG9mIGNyZWF0aW5nIGFuZAorICogdmVyaWZ5aW5nIGRpZ2l0YWwgc2lnbmF0dXJlcywgdXNpbmcgZGlmZmVyZW50IGFsZ29yaXRobXMgdGhhdCBoYXZlIGJlZW4KKyAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUge0BsaW5rIFNlY3VyaXR5fSBjbGFzcy4KICAqIAorICogQHNlZSBTaWduYXR1cmVTcGkKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaWduYXR1cmUgZXh0ZW5kcyBTaWduYXR1cmVTcGkgewogICAgIAogICAgIC8vIFRoZSBzZXJ2aWNlIG5hbWUuCkBAIC01Myw0MCArNTYsNjMgQEAKICAgICBwcml2YXRlIFN0cmluZyBhbGdvcml0aG07CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb25zdGFudCB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgaGFzIG5vdCB5ZXQKKyAgICAgKiBiZWVuIGluaXRpYWxpemVkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRUQgPSAwOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHtAY29kZSBTaWduYXR1cmV9IGluc3RhbmNlIGhhcyBiZWVuCisgICAgICogaW5pdGlhbGl6ZWQgZm9yIHNpZ25pbmcuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0lHTiA9IDI7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDb25zdGFudCB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgaGFzIGJlZW4KKyAgICAgKiBpbml0aWFsaXplZCBmb3IgdmVyaWZpY2F0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUklGWSA9IDM7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0uIFRoZSB0aHJlZQorICAgICAqIHBvc3NpYmxlIHN0YXRlcyBhcmUge0BsaW5rICNVTklOSVRJQUxJWkVEfSwge0BsaW5rICNTSUdOfSBvcgorICAgICAqIHtAbGluayAjVkVSSUZZfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHN0YXRlID0gVU5JTklUSUFMSVpFRDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25hdHVyZX0gd2l0aCB0aGUgbmFtZSBvZgorICAgICAqIHRoZSBhbGdvcml0aG0gdG8gdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGFsZ29yaXRobSB0byB1c2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNpZ25hdHVyZShTdHJpbmcgYWxnb3JpdGhtKSB7CiAgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25hdHVyZX0gdGhhdCB1dGlsaXplcyB0aGUgc3BlY2lmaWVkCisgICAgICogYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gdG8gdXNlLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25hdHVyZX0gdGhhdCB1dGlsaXplcyB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTaWduYXR1cmUgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTA5LDggKzEzNSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25hdHVyZX0gdGhhdCB1dGlsaXplcyB0aGUgc3BlY2lmaWVkCisgICAgICogYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTaWduYXR1cmV9IHRoYXQgdXRpbGl6ZXMgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgYWxnb3JpdGhtIGZyb20gdGhlIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2lnbmF0dXJlIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcikKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKQEAgLTEyOSw4ICsxNjksMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBTaWduYXR1cmV9IHRoYXQgdXRpbGl6ZXMgdGhlIHNwZWNpZmllZAorICAgICAqIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0byB1c2UuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgc2VjdXJpdHkgcHJvdmlkZXIuCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2lnbmF0dXJlfSB0aGF0IHV0aWxpemVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTaWduYXR1cmUgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTE2MSwyNCArMjEzLDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIG9mIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIG9mIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgU2lnbmF0dXJlfSBpbnN0YW5jZSBmb3Igc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwKKyAgICAgKiB1c2luZyB0aGUgcHVibGljIGtleSBvZiB0aGUgaWRlbnRpdHkgd2hvc2Ugc2lnbmF0dXJlIGlzIGdvaW5nIHRvIGJlCisgICAgICogdmVyaWZpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHB1YmxpY0tleQorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHB1YmxpY0tleX0gaXMgbm90IHZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXRWZXJpZnkoUHVibGljS2V5IHB1YmxpY0tleSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKQEAgLTE4Nyw4ICsyNTAsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBTaWduYXR1cmV9IGluc3RhbmNlIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLAorICAgICAqIHVzaW5nIHRoZSBjZXJ0aWZpY2F0ZSBvZiB0aGUgaWRlbnRpdHkgd2hvc2Ugc2lnbmF0dXJlIGlzIGdvaW5nIHRvIGJlCisgICAgICogdmVyaWZpZWQuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGdpdmVuIGNlcnRpZmljYXRlIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBYNTA5Q2VydGlmaWNhdGV9IGFuZAorICAgICAqIGhhcyBhIGtleSB1c2FnZSBwYXJhbWV0ZXIgdGhhdCBpbmRpY2F0ZXMsIHRoYXQgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBub3QgdG8KKyAgICAgKiBiZSB1c2VkIGZvciBzaWduaW5nLCBhbiB7QGNvZGUgSW52YWxpZEtleUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSB1c2VkIHRvIHZlcmlmeSBhIHNpZ25hdHVyZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHVibGljS2V5IGluIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQgb3Igbm90IHRvIGJlCisgICAgICogICAgICAgICAgICAgdXNlZCBmb3Igc2lnbmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0VmVyaWZ5KENlcnRpZmljYXRlIGNlcnRpZmljYXRlKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewpAQCAtMjI0LDggKzMwMCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgZm9yIHNpZ25pbmcsIHVzaW5nIHRoZQorICAgICAqIHByaXZhdGUga2V5IG9mIHRoZSBpZGVudGl0eSB3aG9zZSBzaWduYXR1cmUgaXMgZ29pbmcgdG8gYmUgZ2VuZXJhdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcml2YXRlS2V5CisgICAgICogICAgICAgICAgICB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHByaXZhdGVLZXl9IGlzIG5vdCB2YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0U2lnbihQcml2YXRlS2V5IHByaXZhdGVLZXkpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CkBAIC0yMzQsOCArMzE2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgU2lnbmF0dXJlfSBpbnN0YW5jZSBmb3Igc2lnbmluZywgdXNpbmcgdGhlCisgICAgICogcHJpdmF0ZSBrZXkgb2YgdGhlIGlkZW50aXR5IHdob3NlIHNpZ25hdHVyZSBpcyBnb2luZyB0byBiZSBnZW5lcmF0ZWQgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBzb3VyY2Ugb2YgcmFuZG9tbmVzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJpdmF0ZUtleQorICAgICAqICAgICAgICAgICAgdGhlIHByaXZhdGUga2V5LgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU2VjdXJlUmFuZG9tfSB0byB1c2UuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHByaXZhdGVLZXl9IGlzIG5vdCB2YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0U2lnbihQcml2YXRlS2V5IHByaXZhdGVLZXksIFNlY3VyZVJhbmRvbSByYW5kb20pCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CkBAIC0yNDQsOCArMzM1LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIHRoZSBzaWduYXR1cmUgb2YgYWxsIHVwZGF0ZWQgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHtAY29kZSBTaWduYXR1cmV9IGluc3RhbmNlIGlzIHJlc2V0IHRvIHRoZSBzdGF0ZSBvZiBpdHMgbGFzdAorICAgICAqIGluaXRpYWxpemF0aW9uIGZvciBzaWduaW5nIGFuZCB0aHVzIGNhbiBiZSB1c2VkIGZvciBhbm90aGVyIHNpZ25hdHVyZQorICAgICAqIGZyb20gdGhlIHNhbWUgaWRlbnRpdHkuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZSBvZiBhbGwgdXBkYXRlZCBkYXRhLgorICAgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2lnbmF0dXJlfSBpbnN0YW5jZSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgKiAgICAgICAgICAgICBwcm9wZXJseS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIHNpZ24oKSB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHN0YXRlICE9IFNJR04pIHsKQEAgLTI1Niw4ICszNTcsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBHZW5lcmF0ZXMgYW5kIHN0b3JlcyB0aGUgc2lnbmF0dXJlIG9mIGFsbCB1cGRhdGVkIGRhdGEgaW4gdGhlIHByb3ZpZGVkCisgICAgICoge0Bjb2RlIGJ5dGVbXX0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgorICAgICAqIDxwPgorICAgICAqIFRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgaXMgcmVzZXQgdG8gdGhlIHN0YXRlIG9mIGl0cyBsYXN0CisgICAgICogaW5pdGlhbGl6YXRpb24gZm9yIHNpZ25pbmcgYW5kIHRodXMgY2FuIGJlIHVzZWQgZm9yIGFub3RoZXIgc2lnbmF0dXJlCisgICAgICogZnJvbSB0aGUgc2FtZSBpZGVudGl0eS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG91dGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgc2lnbmF0dXJlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB7QGNvZGUgb3V0YnVmfSB0byBzdG9yZS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgdGhlIHNpZ25hdHVyZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluIHtAY29kZSBvdXRidWZ9LgorICAgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2lnbmF0dXJlfSBpbnN0YW5jZSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgKiAgICAgICAgICAgICBwcm9wZXJseS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXR9IG9yIHtAY29kZSBsZW59IGFyZSBub3QgdmFsaWQgaW4gcmVzcGVjdCB0bworICAgICAqICAgICAgICAgICAgIHtAY29kZSBvdXRidWZ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgc2lnbihieXRlW10gb3V0YnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQogICAgICAgICAgICAgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiB7ICAgICAgIApAQCAtMjc0LDggKzM5NSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiB7QGNvZGUgc2lnbmF0dXJlfSBjYW4gYmUgdmVyaWZpZWQgdXNpbmcgdGhlCisgICAgICogcHVibGljIGtleSBvciBhIGNlcnRpZmljYXRlIG9mIHRoZSBzaWduZXIuCisgICAgICogPHA+CisgICAgICogVGhpcyB7QGNvZGUgU2lnbmF0dXJlfSBpbnN0YW5jZSBpcyByZXNldCB0byB0aGUgc3RhdGUgb2YgaXRzIGxhc3QKKyAgICAgKiBpbml0aWFsaXphdGlvbiBmb3IgdmVyaWZ5aW5nIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhbm90aGVyCisgICAgICogc2lnbmF0dXJlIG9mIHRoZSBzYW1lIHNpZ25lci4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHNpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHNpZ25hdHVyZSB0byB2ZXJpZnkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICAgcHJvcGVybHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gdmVyaWZ5KGJ5dGVbXSBzaWduYXR1cmUpIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24gewogICAgICAgICBpZiAoc3RhdGUgIT0gVkVSSUZZKSB7CkBAIC0yODYsOCArNDIxLDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIHtAY29kZSBzaWduYXR1cmV9IHN0YXJ0aW5nIGF0IGluZGV4IHtAY29kZQorICAgICAqIG9mZnNldH0gd2l0aCB7QGNvZGUgbGVuZ3RofSBieXRlcyBjYW4gYmUgdmVyaWZpZWQgdXNpbmcgdGhlIHB1YmxpYyBrZXkgb3IKKyAgICAgKiBhIGNlcnRpZmljYXRlIG9mIHRoZSBzaWduZXIuCisgICAgICogPHA+CisgICAgICogVGhpcyB7QGNvZGUgU2lnbmF0dXJlfSBpbnN0YW5jZSBpcyByZXNldCB0byB0aGUgc3RhdGUgb2YgaXRzIGxhc3QKKyAgICAgKiBpbml0aWFsaXphdGlvbiBmb3IgdmVyaWZ5aW5nIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhbm90aGVyCisgICAgICogc2lnbmF0dXJlIG9mIHRoZSBzYW1lIHNpZ25lci4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHNpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBieXRlW119IGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSB0byB2ZXJpZnkuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IGluIHtAY29kZSBzaWduYXR1cmV9IG9mIHRoZSBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgZm9yIHRoZSBzaWduYXR1cmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICAgcHJvcGVybHkuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2Zmc2V0fSBvciB7QGNvZGUgbGVuZ3RofSBhcmUgbm90IHZhbGlkIGluIHJlc3BlY3QKKyAgICAgKiAgICAgICAgICAgICB0byB7QGNvZGUgc2lnbmF0dXJlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiB2ZXJpZnkoYnl0ZVtdIHNpZ25hdHVyZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24gewpAQCAtMzA0LDggKzQ2MSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFVwZGF0ZXMgdGhlIGRhdGEgdG8gYmUgdmVyaWZpZWQgb3IgdG8gYmUgc2lnbmVkLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIGJ5dGV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB0byB1cGRhdGUgd2l0aC4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICAgcHJvcGVybHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlKGJ5dGUgYikgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CkBAIC0zMTYsOCArNDgwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGUgZGF0YSB0byBiZSB2ZXJpZmllZCBvciB0byBiZSBzaWduZWQsIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGNvZGUgYnl0ZVtdfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgdG8gdXBkYXRlIHdpdGguCisgICAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBTaWduYXR1cmV9IGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAqICAgICAgICAgICAgIHByb3Blcmx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZShieXRlW10gZGF0YSkgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CkBAIC0zMjgsOCArNDk5LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVXBkYXRlcyB0aGUgZGF0YSB0byBiZSB2ZXJpZmllZCBvciB0byBiZSBzaWduZWQsIHVzaW5nIHRoZSBnaXZlbiB7QGNvZGUKKyAgICAgKiBieXRlW119LCBzdGFydGluZyBmb3JtIHRoZSBzcGVjaWZpZWQgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byB1cGRhdGUgd2l0aC4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggaW4ge0Bjb2RlIGRhdGF9IG9mIHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlLgorICAgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgU2lnbmF0dXJlfSBpbnN0YW5jZSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgKiAgICAgICAgICAgICBwcm9wZXJseS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCiAgICAgICAgICAgICB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uIHsKQEAgLTM0Niw4ICs1MjgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBVcGRhdGVzIHRoZSBkYXRhIHRvIGJlIHZlcmlmaWVkIG9yIHRvIGJlIHNpZ25lZCwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBCeXRlQnVmZmVyfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBCeXRlQnVmZmVyfSB0byB1cGRhdGUgd2l0aC4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNpZ25hdHVyZX0gaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICAgcHJvcGVybHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlKEJ5dGVCdWZmZXIgZGF0YSkgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CkBAIC0zNTgsOCArNTQ3LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIHtAY29kZSBTaWduYXR1cmV9IGluY2x1ZGluZyBpdHMgYWxnb3JpdGhtIGFuZCBpdHMgc3RhdGUuCisgICAgICogCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgU2lnbmF0dXJlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gIlNJR05BVFVSRSAiICsgYWxnb3JpdGhtICsgIiBzdGF0ZTogIiArIHN0YXRlVG9TdHJpbmcoc3RhdGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTM3OSwxOSArNTcxLDM3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBhZGRlZCBEZXByZWNhdGVkIGFubm90YXRpb24KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTaWduYXR1cmUjc2V0UGFyYW1ldGVyKEFsZ29yaXRobVBhcmFtZXRlclNwZWMpIHNldFBhcmFtZXRlcn0KKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCwgYWxyZWFkeSBzZXQgb3IgaXMgbm90IGFsbG93ZWQgdG8KKyAgICAgKiAgICAgICAgICAgICBiZSBjaGFuZ2VkLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFBhcmFtZXRlcihBbGdvcml0aG1QYXJhbWV0ZXJTcGVjKX0KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFBhcmFtZXRlcihTdHJpbmcgcGFyYW0sIE9iamVjdCB2YWx1ZSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKICAgICAgICAgZW5naW5lU2V0UGFyYW1ldGVyKHBhcmFtLCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHRvIHNldC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQsIGFscmVhZHkgc2V0IG9yIGlzIG5vdCBhbGxvd2VkIHRvCisgICAgICogICAgICAgICAgICAgYmUgY2hhbmdlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQYXJhbWV0ZXIoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbXMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC0zOTksMjcgKzYwOSwzOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBBbGdvcml0aG1QYXJhbWV0ZXJzfSBvZiB0aGlzIHtAbGluayBTaWduYXR1cmV9CisgICAgICogaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IG9mIHRoaXMge0BsaW5rIFNpZ25hdHVyZX0KKyAgICAgKiAgICAgICAgIGluc3RhbmNlLCBtYXliZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpIHsKICAgICAgICAgcmV0dXJuIGVuZ2luZUdldFBhcmFtZXRlcnMoKTsKICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBhZGRlZCBEZXByZWNhdGVkIGFubm90YXRpb24KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBtYXliZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIG51bGx9LgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwYXJhbX0gaXMgbm90IGEgdmFsaWQgcGFyYW1ldGVyIGZvciB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgICAgIFNpZ25hdHVyZX0gb3IgYW4gb3RoZXIgZXJyb3Igb2NjdXJlcy4KICAgICAgKiBAZGVwcmVjYXRlZCBUaGVyZSBpcyBubyBnZW5lcmFsbHkgYWNjZXB0ZWQgcGFyYW1ldGVyIG5hbWluZyBjb252ZW50aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZW5naW5lR2V0UGFyYW1ldGVyKHBhcmFtKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKLSAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDbG9uZWFibGUpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOwpAQCAtNTAwLDQgKzcyMiw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDFiNjcwMzcuLmYwN2MzNGIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uLmphdmEKQEAgLTIzLDQzICsyMyw1NiBAQAogcGFja2FnZSBqYXZhLnNlY3VyaXR5OwogCiAvKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBnZW5lcmljIHNlY3VyaXR5IGV4Y2VwdGlvbnMuCisgKntAY29kZSBTaWduYXR1cmVFeGNlcHRpb259IGlzIGEgZ2VuZXJhbCB7QGNvZGUgU2lnbmF0dXJlfSBleGNlcHRpb24uCiAgKiAKKyAqIEBzZWUgU2lnbmF0dXJlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNpZ25hdHVyZUV4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc1MDk5ODkzMjQ5NzUxMjQ0MzhMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25hdHVyZUV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTaWduYXR1cmVFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2lnbmF0dXJlRXhjZXB0aW9ufS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2lnbmF0dXJlRXhjZXB0aW9uKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2lnbmF0dXJlRXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UgYW5kIHRoZSBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB3aGljaCBpcyB0aGUgY2F1c2UgZm9yIHRoaXMgZXhjZXB0aW9uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNpZ25hdHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25hdHVyZUV4Y2VwdGlvbn0gd2l0aCB0aGUKKyAgICAgKiBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTaWduYXR1cmVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TaWduYXR1cmVTcGkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TaWduYXR1cmVTcGkuamF2YQppbmRleCBmNDYyM2I2Li43MzhkNDg5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlU3BpLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZVNwaS5qYXZhCkBAIC0yNywzNSArMjcsNjAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiB7QGNvZGUgU2lnbmF0dXJlU3BpfSBpcyB0aGUgPGk+U2VydmljZSBQcm92aWRlciBJbnRlcmZhY2U8L2k+ICg8Yj5TUEk8L2I+KQorICogZGVmaW5pdGlvbiBmb3Ige0BsaW5rIFNpZ25hdHVyZX0uCiAgKiAKKyAqIEBzZWUgU2lnbmF0dXJlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2lnbmF0dXJlU3BpIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEltcGxlbWVudGF0aW9uIHNwZWNpZmljIHNvdXJjZSBvZiByYW5kb21uZXNzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTZWN1cmVSYW5kb20gYXBwUmFuZG9tOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgU2lnbmF0dXJlU3BpfSBpbnN0YW5jZSBmb3Igc2lnbmF0dXJlCisgICAgICogdmVyaWZpY2F0aW9uLCB1c2luZyB0aGUgcHVibGljIGtleSBvZiB0aGUgaWRlbnRpdHkgd2hvc2Ugc2lnbmF0dXJlIGlzCisgICAgICogZ29pbmcgdG8gYmUgdmVyaWZpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHB1YmxpY0tleQorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyBrZXkuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHB1YmxpY0tleX0gaXMgbm90IHZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXRWZXJpZnkoUHVibGljS2V5IHB1YmxpY0tleSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgU2lnbmF0dXJlU3BpfSBpbnN0YW5jZSBmb3Igc2lnbmluZywgdXNpbmcgdGhlCisgICAgICogcHJpdmF0ZSBrZXkgb2YgdGhlIGlkZW50aXR5IHdob3NlIHNpZ25hdHVyZSBpcyBnb2luZyB0byBiZSBnZW5lcmF0ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHByaXZhdGVLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIGtleS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcHJpdmF0ZUtleX0gaXMgbm90IHZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXRTaWduKFByaXZhdGVLZXkgcHJpdmF0ZUtleSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgU2lnbmF0dXJlU3BpfSBpbnN0YW5jZSBmb3Igc2lnbmluZywgdXNpbmcgdGhlCisgICAgICogcHJpdmF0ZSBrZXkgb2YgdGhlIGlkZW50aXR5IHdob3NlIHNpZ25hdHVyZSBpcyBnb2luZyB0byBiZSBnZW5lcmF0ZWQgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBzb3VyY2Ugb2YgcmFuZG9tbmVzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJpdmF0ZUtleQorICAgICAqICAgICAgICAgICAgdGhlIHByaXZhdGUga2V5LgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU2VjdXJlUmFuZG9tfSB0byB1c2UuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHByaXZhdGVLZXl9IGlzIG5vdCB2YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0U2lnbihQcml2YXRlS2V5IHByaXZhdGVLZXksIFNlY3VyZVJhbmRvbSByYW5kb20pCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CkBAIC02NCwyNCArODksNDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBVcGRhdGVzIHRoZSBkYXRhIHRvIGJlIHZlcmlmaWVkIG9yIHRvIGJlIHNpZ25lZCwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIHtAY29kZSBieXRlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gdXBkYXRlIHdpdGguCisgICAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBTaWduYXR1cmVTcGl9IGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAqICAgICAgICAgICAgIHByb3Blcmx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVVwZGF0ZShieXRlIGIpIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBVcGRhdGVzIHRoZSBkYXRhIHRvIGJlIHZlcmlmaWVkIG9yIHRvIGJlIHNpZ25lZCwgdXNpbmcgdGhlIGdpdmVuIHtAY29kZQorICAgICAqIGJ5dGVbXX0sIHN0YXJ0aW5nIGZvcm0gdGhlIHNwZWNpZmllZCBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBsZW5ndGguCisgICAgICogCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IHRvIHVwZGF0ZSB3aXRoLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBpbiB7QGNvZGUgYn0gb2YgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB1c2UuCisgICAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBTaWduYXR1cmVTcGl9IGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAqICAgICAgICAgICAgIHByb3Blcmx5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVVwZGF0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKICAgICAgICAgICAgIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFVwZGF0ZXMgdGhlIGRhdGEgdG8gYmUgdmVyaWZpZWQgb3IgdG8gYmUgc2lnbmVkLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICoge0Bjb2RlIEJ5dGVCdWZmZXJ9LgogICAgICAqIAotICAgICAqIFRoZSBTaWduYXR1cmVFeGNlcHRpb24gaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcyBtZXRob2QuIAotICAgICAqIFNvIHRocm93IFJ1bnRpbWVFeGNlcHRpb24gaWYgdW5kZXJseWluZyBlbmdpbmVVcGRhdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pCi0gICAgICogdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQnl0ZUJ1ZmZlcn0gdG8gdXBkYXRlIHdpdGguCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgc2luY2Uge0Bjb2RlIFNpZ25hdHVyZUV4Y2VwdGlvbn0gaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgIG1ldGhvZCBpdCB0aHJvd3MgYSB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gaWYgdW5kZXJseWluZworICAgICAqICAgICAgICAgICAgIHtAbGluayAjZW5naW5lVXBkYXRlKGJ5dGVbXSwgaW50LCBpbnQpfSB0aHJvd3Mge0Bjb2RlCisgICAgICogICAgICAgICAgICAgU2lnbmF0dXJlRXhjZXB0aW9ufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoQnl0ZUJ1ZmZlciBpbnB1dCkgewogICAgICAgICBpZiAoIWlucHV0Lmhhc1JlbWFpbmluZygpKSB7CkBAIC0xMTEsMTQgKzE2MCw0NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEdlbmVyYXRlcyBhbmQgcmV0dXJucyB0aGUgc2lnbmF0dXJlIG9mIGFsbCB1cGRhdGVkIGRhdGEuCisgICAgICogPHA+CisgICAgICogVGhpcyB7QGNvZGUgU2lnbmF0dXJlU3BpfSBpbnN0YW5jZSBpcyByZXNldCB0byB0aGUgc3RhdGUgb2YgaXRzIGxhc3QKKyAgICAgKiBpbml0aWFsaXphdGlvbiBmb3Igc2lnbmluZyBhbmQgdGh1cyBjYW4gYmUgdXNlZCBmb3IgYW5vdGhlciBzaWduYXR1cmUKKyAgICAgKiBmcm9tIHRoZSBzYW1lIGlkZW50aXR5LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgb2YgYWxsIHVwZGF0ZWQgZGF0YS4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNpZ25hdHVyZVNwaX0gaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICAgcHJvcGVybHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVTaWduKCkgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEdlbmVyYXRlcyBhbmQgc3RvcmVzIHRoZSBzaWduYXR1cmUgb2YgYWxsIHVwZGF0ZWQgZGF0YSBpbiB0aGUgcHJvdmlkZWQKKyAgICAgKiB7QGNvZGUgYnl0ZVtdfSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguCisgICAgICogPHA+CisgICAgICogVGhpcyB7QGNvZGUgU2lnbmF0dXJlU3BpfSBpbnN0YW5jZSBpcyByZXNldCB0byB0aGUgc3RhdGUgb2YgaXRzIGxhc3QKKyAgICAgKiBpbml0aWFsaXphdGlvbiBmb3Igc2lnbmluZyBhbmQgdGh1cyBjYW4gYmUgdXNlZCBmb3IgYW5vdGhlciBzaWduYXR1cmUKKyAgICAgKiBmcm9tIHRoZSBzYW1lIGlkZW50aXR5LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0YnVmCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHN0b3JlIHRoZSBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHtAY29kZSBvdXRidWZ9IHRvIHN0b3JlLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGUgc2lnbmF0dXJlLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBzdG9yZWQgaW4ge0Bjb2RlIG91dGJ1Zn0uCisgICAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBTaWduYXR1cmVTcGl9IGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAqICAgICAgICAgICAgIHByb3Blcmx5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gb3Ige0Bjb2RlIGxlbn0gYXJlIG5vdCB2YWxpZCBpbiByZXNwZWN0IHRvCisgICAgICogICAgICAgICAgICAge0Bjb2RlIG91dGJ1Zn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBlbmdpbmVTaWduKGJ5dGVbXSBvdXRidWYsIGludCBvZmZzZXQsIGludCBsZW4pCiAgICAgICAgICAgICB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uIHsKQEAgLTE0MCwxNSArMjE5LDUxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIHtAY29kZSBzaWdCeXRlc30gY2FuIGJlIHZlcmlmaWVkIHVzaW5nIHRoZQorICAgICAqIHB1YmxpYyBrZXkgb3IgYSBjZXJ0aWZpY2F0ZSBvZiB0aGUgc2lnbmVyLgorICAgICAqIDxwPgorICAgICAqIFRoaXMge0Bjb2RlIFNpZ25hdHVyZVNwaX0gaW5zdGFuY2UgaXMgcmVzZXQgdG8gdGhlIHN0YXRlIG9mIGl0cyBsYXN0CisgICAgICogaW5pdGlhbGl6YXRpb24gZm9yIHZlcmlmeWluZyBhbmQgdGh1cyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYW5vdGhlcgorICAgICAqIHNpZ25hdHVyZSBvZiB0aGUgc2FtZSBzaWduZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaWdCeXRlcworICAgICAqICAgICAgICAgICAgdGhlIHNpZ25hdHVyZSB0byB2ZXJpZnkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIFNpZ25hdHVyZVNwaX0gaW5zdGFuY2UgaXMgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICAgcHJvcGVybHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZW5naW5lVmVyaWZ5KGJ5dGVbXSBzaWdCeXRlcykKICAgICAgICAgICAgIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4ge0Bjb2RlIHNpZ0J5dGVzfSBzdGFydGluZyBhdCBpbmRleCB7QGNvZGUKKyAgICAgKiBvZmZzZXR9IHdpdGgge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgY2FuIGJlIHZlcmlmaWVkIHVzaW5nIHRoZSBwdWJsaWMga2V5IG9yCisgICAgICogYSBjZXJ0aWZpY2F0ZSBvZiB0aGUgc2lnbmVyLgorICAgICAqIDxwPgorICAgICAqIFRoaXMge0Bjb2RlIFNpZ25hdHVyZVNwaX0gaW5zdGFuY2UgaXMgcmVzZXQgdG8gdGhlIHN0YXRlIG9mIGl0cyBsYXN0CisgICAgICogaW5pdGlhbGl6YXRpb24gZm9yIHZlcmlmeWluZyBhbmQgdGh1cyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYW5vdGhlcgorICAgICAqIHNpZ25hdHVyZSBvZiB0aGUgc2FtZSBzaWduZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaWdCeXRlcworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBieXRlW119IGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSB0byB2ZXJpZnkuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IGluIHtAY29kZSBzaWdCeXRlc30gb2YgdGhlIHNpZ25hdHVyZQorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGUgc2lnbmF0dXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHtAY29kZSBTaWduYXR1cmVTcGl9IGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAqICAgICAgICAgICAgIHByb3Blcmx5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldH0gb3Ige0Bjb2RlIGxlbmd0aH0gYXJlIG5vdCB2YWxpZCBpbiByZXNwZWN0CisgICAgICogICAgICAgICAgICAgdG8ge0Bjb2RlIHNpZ0J5dGVzfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmdpbmVWZXJpZnkoYnl0ZVtdIHNpZ0J5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQogICAgICAgICAgICAgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CkBAIC0xNTgsMTcgKzI3MywzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gdmFsdWUuCiAgICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlCi0gICAgICogICAgICAgICAgICAge0BsaW5rIFNpZ25hdHVyZVNwaSNlbmdpbmVTZXRQYXJhbWV0ZXIoQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykgZW5naW5lU2V0UGFyYW1ldGVyfQorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICogQHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkLCBhbHJlYWR5IHNldCBvciBpcyBub3QgYWxsb3dlZCB0bworICAgICAqICAgICAgICAgICAgIGJlIGNoYW5nZWQuCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZW5naW5lU2V0UGFyYW1ldGVyKEFsZ29yaXRobVBhcmFtZXRlclNwZWMpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lU2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbSwgT2JqZWN0IHZhbHVlKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlclNwZWN9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdG8gc2V0LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCwgYWxyZWFkeSBzZXQgb3IgaXMgbm90IGFsbG93ZWQgdG8KKyAgICAgKiAgICAgICAgICAgICBiZSBjaGFuZ2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVNldFBhcmFtZXRlcihBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKQEAgLTE3NiwyNSArMzA1LDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIEFsZ29yaXRobVBhcmFtZXRlcnN9IG9mIHRoaXMge0BsaW5rIFNpZ25hdHVyZVNwaX0KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgQWxnb3JpdGhtUGFyYW1ldGVyc30gb2YgdGhpcyB7QGxpbmsgU2lnbmF0dXJlU3BpfQorICAgICAqICAgICAgICAgaW5zdGFuY2UsIG1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWxnb3JpdGhtUGFyYW1ldGVycyBlbmdpbmVHZXRQYXJhbWV0ZXJzKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBhZGRlZCBEZXByZWNhdGVkIGFubm90YXRpb24KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgbWF5YmUge0Bjb2RlCisgICAgICogICAgICAgICBudWxsfS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcGFyYW19IGlzIG5vdCBhIHZhbGlkIHBhcmFtZXRlciBmb3IgdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBTaWduYXR1cmVTcGl9IG9yIGFuIG90aGVyIGVycm9yIG9jY3Vycy4KICAgICAgKiBAZGVwcmVjYXRlZCBUaGVyZSBpcyBubyBnZW5lcmFsbHkgYWNjZXB0ZWQgcGFyYW1ldGVyIG5hbWluZyBjb252ZW50aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBlbmdpbmVHZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKLSAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDbG9uZWFibGUpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOwpAQCAtMjAyLDQgKzM0Myw0IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2lnbmVkT2JqZWN0LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2lnbmVkT2JqZWN0LmphdmEKaW5kZXggMjFmNDU0Ny4uZDIwMjJjOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25lZE9iamVjdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TaWduZWRPYmplY3QuamF2YQpAQCAtMzAsMzUgKzMwLDIyIEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIEEge0Bjb2RlIFNpZ25lZE9iamVjdH0gaW5zdGFuY2UgYWN0cyBhcyBhIGNvbnRhaW5lciBmb3IgYW5vdGhlciBvYmplY3QuIFRoZQorICoge0Bjb2RlIFNpZ25lZE9iamVjdH0gY29udGFpbnMgdGhlIHRhcmdldCBpbiBzZXJpYWxpemVkIGZvcm0gYWxvbmcgd2l0aCBhCisgKiBkaWdpdGFsIHNpZ25hdHVyZSBvZiB0aGUgc2VyaWFsaXplZCBkYXRhLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNpZ25lZE9iamVjdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyMDUwMjcyMDQ4NTQ0NzE2N0w7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgYnl0ZVtdIGNvbnRlbnQ7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgYnl0ZVtdIHNpZ25hdHVyZTsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgdGhlYWxnb3JpdGhtOwogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAKLSAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKIApAQCAtNzIsOCArNTksMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25lZE9iamVjdH0gd2l0aCB0aGUgdGFyZ2V0IG9iamVjdCwKKyAgICAgKiB0aGUgcHJpdmF0ZSBrZXkgYW5kIHRoZSBlbmdpbmUgdG8gY29tcHV0ZSB0aGUgc2lnbmF0dXJlLiBUaGUgZ2l2ZW4KKyAgICAgKiB7QGNvZGUgb2JqZWN0fSBpcyBzaWduZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgZW5naW5lLgogICAgICAqIAorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYmVzIHNpZ25lZC4KKyAgICAgKiBAcGFyYW0gc2lnbmluZ0tleQorICAgICAqICAgICAgICAgICAgdGhlIHByaXZhdGUga2V5LCB1c2VkIHRvIHNpZ24gdGhlIHtAY29kZSBvYmplY3R9LgorICAgICAqIEBwYXJhbSBzaWduaW5nRW5naW5lCisgICAgICogICAgICAgICAgICB0aGUgZW5naW5lIHRoYXQgcGVyZm9ybXMgdGhlIHNpZ25hdHVyZSBnZW5lcmF0aW9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlcmlhbGl6YXRpb24gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcml2YXRlIGtleSBpcyBub3QgdmFsaWQuCisgICAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBzaWduYXR1cmUgZ2VuZXJhdGlvbiBmYWlsZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNpZ25lZE9iamVjdChTZXJpYWxpemFibGUgb2JqZWN0LCBQcml2YXRlS2V5IHNpZ25pbmdLZXksCiAgICAgICAgICAgICBTaWduYXR1cmUgc2lnbmluZ0VuZ2luZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uLApAQCAtOTYsOCArOTgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGVuY2Fwc3VsYXRlZCBvYmplY3QuIEVhY2ggdGltZSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCB0aGUKKyAgICAgKiBlbmNhcHN1bGF0ZWQgb2JqZWN0IGlzIGRlc2VyaWFsaXplZCBiZWZvcmUgaXQgaXMgcmV0dXJuZWQuCiAgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZGVzZXJpYWxpemF0aW9uIGZhaWxlZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgdGhlIGVuY2Fwc3VsYXRlZCBvYmplY3QgY2FuIG5vdCBiZSBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGRlc2VyaWFsaXplIG91ciBvYmplY3QKQEAgLTExMSw4ICsxMjAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNpZ25hdHVyZSBkYXRhIG9mIHRoZSBlbmNhcHN1bGF0ZWQgc2VyaWFsaXplZCBvYmplY3QuCiAgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2lnbmF0dXJlIGRhdGEgb2YgdGhlIGVuY2Fwc3VsYXRlZCBzZXJpYWxpemVkIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ25hdHVyZSgpIHsKICAgICAgICAgYnl0ZVtdIHNpZyA9IG5ldyBieXRlW3NpZ25hdHVyZS5sZW5ndGhdOwpAQCAtMTIxLDE2ICsxMzIsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBvZiB0aGlzIHtAY29kZSBTaWduZWRPYmplY3R9LgogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBvZiB0aGlzIHtAY29kZSBTaWduZWRPYmplY3R9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gdGhlYWxnb3JpdGhtOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbnRhaW5lZCBzaWduYXR1cmUgZm9yIHRoZSBlbmNhcHN1bGF0ZWQgb2JqZWN0IGlzCisgICAgICogdmFsaWQuCiAgICAgICogCisgICAgICogQHBhcmFtIHZlcmlmaWNhdGlvbktleQorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyBrZXkgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIHZlcmlmaWNhdGlvbkVuZ2luZQorICAgICAqICAgICAgICAgICAgdGhlIHNpZ25hdHVyZSBlbmdpbmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNvbnRhaW5lZCBzaWduYXR1cmUgZm9yIHRoZSBlbmNhcHN1bGF0ZWQKKyAgICAgKiAgICAgICAgIG9iamVjdCBpcyB2YWxpZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHB1YmxpYyBrZXkgaXMgaW52YWxpZC4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShQdWJsaWNLZXkgdmVyaWZpY2F0aW9uS2V5LAogICAgICAgICAgICAgU2lnbmF0dXJlIHZlcmlmaWNhdGlvbkVuZ2luZSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2lnbmVyLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2lnbmVyLmphdmEKaW5kZXggOTcyYzQ2ZS4uOWU0ODIyNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25lci5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TaWduZXIuamF2YQpAQCAtMjIsNDIgKzIyLDU3IEBACiAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBhZGRlZCBEZXByZWNhdGVkIGFubm90YXRpb24KKy8vIEVORCBhbmRyb2lkLW5vdGUKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIHtAbGluayBTaWduZXJ9IHJlcHJlc2VudHMgYW4gaWRlbnRpdHkgKGluZGl2aWR1YWwgb3IgY29ycG9yYXRpb24pIHRoYXQgb3ducyBhCisgKiBwcml2YXRlIGtleSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleS4KICAqIAotICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYmVoYXZpb3IgaW4KLSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLnNlY3VyaXR5LmNlcnQgamF2YS5zZWN1cml0eS5jZXJ0fSBwYWNrYWdlIGFuZAotICogICAgICAgICAgICAge0BsaW5rIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIFByaW5jaXBhbH0KKyAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGJlaGF2aW9yIGluIHtAbGluayBqYXZhLnNlY3VyaXR5LmNlcnQKKyAqICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuY2VydH0gcGFja2FnZSBhbmQge0BsaW5rIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsCisgKiAgICAgICAgICAgICBQcmluY2lwYWx9CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCitARGVwcmVjYXRlZAogcHVibGljIGFic3RyYWN0IGNsYXNzIFNpZ25lciBleHRlbmRzIElkZW50aXR5IHsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNzYzNDY0MTAyMjYxMzYxNDgwTDsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAotICAgICAqLwogICAgIHByaXZhdGUgUHJpdmF0ZUtleSBwcml2YXRlS2V5OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU2lnbmVyfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU2lnbmVyKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25lcn0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHNpZ25lci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2lnbmVyKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpZ25lcn0gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUKKyAgICAgKiBnaXZlbiBzY29wZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHNpZ25lci4KKyAgICAgKiBAcGFyYW0gc2NvcGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY29wZSBvZiB0aGUgc2lnbmVyLgorICAgICAqIEB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2lnbmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZQorICAgICAqICAgICAgICAgICAgIHByb3ZpZGVkIHNjb3BlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTaWduZXIoU3RyaW5nIG5hbWUsIElkZW50aXR5U2NvcGUgc2NvcGUpCiAgICAgICAgICAgICB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB7CkBAIC02NSw3ICs4MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIHByaXZhdGUga2V5IG9mIHRoaXMge0Bjb2RlIFNpZ25lcn0uIElmIGEge0Bjb2RlCisgICAgICogU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcyB0aGUge0Bjb2RlCisgICAgICogU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgImdldFNpZ25lclByaXZhdGVLZXkifSB0byBiZSBncmFudGVkLCBvdGhlcndpc2UKKyAgICAgKiBhIHtAY29kZSBTZWN1cml0eUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkgb2YgdGhpcyB7QGNvZGUgU2lnbmVyfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcml2YXRlS2V5IGdldFByaXZhdGVLZXkoKSB7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTc3LDcgKzEwMSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCBrZXkgcGFpciB3aXRoIHRoaXMge0Bjb2RlIFNpZ25lcn0uIElmIGEge0Bjb2RlCisgICAgICogU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQsIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBuZWVkcyB0aGUge0Bjb2RlCisgICAgICogU2VjdXJpdHlQZXJtaXNzaW9ufSB7QGNvZGUgZ2V0U2lnbmVyUHJpdmF0ZUtleX0gdG8gYmUgZ3JhbnRlZCwgb3RoZXJ3aXNlCisgICAgICogYSB7QGNvZGUgU2VjdXJpdHlFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYWlyCisgICAgICogICAgICAgICAgICB0aGUga2V5IHBhaXIgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyB7QGNvZGUgU2lnbmVyfS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUga2V5IHBhaXIgaXMgaW52YWxpZC4KKyAgICAgKiBAdGhyb3dzIEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvdGhlciBrZXkgcmVsYXRlZCBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSB7QGNvZGUgU2VjdXJpdHlNYW5hZ2VyfSBpcyBpbnN0YWxsZWQgYW5kIHRoZSBjYWxsZXIgZG9lcworICAgICAqICAgICAgICAgICAgIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEtleVBhaXIoS2V5UGFpciBwYWlyKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24sIEtleUV4Y2VwdGlvbiB7CkBAIC0xMDgsNyArMTQ2LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAqIHtAY29kZSBTaWduZXJ9IGluY2x1ZGluZyBpdHMgbmFtZSBhbmQgaXRzIHNjb3BlIGlmIHByZXNlbnQuCisgICAgICogCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgU2lnbmVyfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgcyA9ICJbU2lnbmVyXSIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9UaW1lc3RhbXAuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9UaW1lc3RhbXAuamF2YQppbmRleCBiNDM0NDFlLi43ZDM3MWI1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvVGltZXN0YW1wLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1RpbWVzdGFtcC5qYXZhCkBAIC0yOSwxNCArMjksMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICoge0Bjb2RlIFRpbWVzdGFtcH0gcmVwcmVzZW50cyBhIHNpZ25lZCB0aW1lIHN0YW1wLiB7QGNvZGUgVGltZXN0YW1wfSBpcworICogaW1tdXRhYmxlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgZmluYWwgY2xhc3MgVGltZXN0YW1wIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NTAyNjgzNzA3ODIxODUxMjk0TDsKIAogICAgIHByaXZhdGUgRGF0ZSB0aW1lc3RhbXA7CkBAIC00Nyw3ICs0NiwxNyBAQAogICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgVGltZXN0YW1wfSB3aXRoIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogdGltZXN0YW1wfSBhbmQgdGhlIGdpdmVuIGNlcnRpZmljYXRlIHBhdGguCisgICAgICogCisgICAgICogQHBhcmFtIHRpbWVzdGFtcAorICAgICAqICAgICAgICAgICAgZGF0ZSBhbmQgdGltZS4KKyAgICAgKiBAcGFyYW0gc2lnbmVyQ2VydFBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSBwYXRoLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdGltZXN0YW1wfSBpcyB7QGNvZGUgbnVsbH0gb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgc2lnbmVyQ2VydFBhdGh9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZXN0YW1wKERhdGUgdGltZXN0YW1wLCBDZXJ0UGF0aCBzaWduZXJDZXJ0UGF0aCkgewogICAgICAgICBpZiAodGltZXN0YW1wID09IG51bGwpIHsKQEAgLTYyLDcgKzcxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIHtAY29kZSBUaW1lc3RhbXB9IGZvciBlcXVhbGl0eQorICAgICAqIGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCwge0Bjb2RlIGZhbHNlfQorICAgICAqIG90aGVyd2lzZS4gVGhlIGdpdmVuIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHtAY29kZSBUaW1lc3RhbXB9LCBpZiBpdCBpcworICAgICAqIGFuIGluc3RhbmNlIG9mIHtAY29kZSBUaW1lc3RhbXB9LCB0aGUgdHdvIHRpbWVzdGFtcHMgaGF2ZSBhbiBlcXVhbCBkYXRlCisgICAgICogYW5kIHRpbWUgYW5kIHRoZWlyIGNlcnRpZmljYXRlIHBhdGhzIGFyZSBlcXVhbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFRpbWVzdGFtcH0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIFRpbWVzdGFtcH0sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7CkBAIC03NywyMSArOTgsMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBSZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZSBwYXRoIG9mIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUgcGF0aCBvZiB0aGlzIHtAY29kZSBUaW1lc3RhbXB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aCBnZXRTaWduZXJDZXJ0UGF0aCgpIHsKICAgICAgICAgcmV0dXJuIHNpZ25lckNlcnRQYXRoOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhpcyB7QGNvZGUgVGltZXN0YW1wfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERhdGUgZ2V0VGltZXN0YW1wKCkgewogICAgICAgICByZXR1cm4gdGltZXN0YW1wOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgVGltZXN0YW1wfS4gUmV0dXJucyB0aGUgc2FtZQorICAgICAqIGhhc2ggY29kZSBmb3Ige0Bjb2RlIFRpbWVzdGFtcH1zIHRoYXQgYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIgYXMKKyAgICAgKiByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZiB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgVGltZXN0YW1wfS4KKyAgICAgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzZWUgVGltZXN0YW1wI2VxdWFscyhPYmplY3QpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaWYgKGhhc2ggPT0gMCkgewpAQCAtMTAxLDcgKzEzNSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMKKyAgICAgKiB7QGNvZGUgVGltZXN0YW1wfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHtAY29kZSBUaW1lc3RhbXB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDI1Nik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uLmphdmEKaW5kZXggM2M3ZDg2NC4uZGMyOTgxYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1VucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb24uamF2YQpAQCAtMjIsMjUgKzIyLDM0IEBACiAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAotLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICogCi0gKi8KIAorLyoqCisgKiB7QGNvZGUgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9ufSBpbmRpY2F0ZXMsIHRoYXQgYSB7QGNvZGUgS2V5U3RvcmUuRW50cnl9CisgKiBjYW5ub3QgYmUgcmVjb3ZlcmVkIGZyb20gYSB7QGNvZGUgS2V5U3RvcmV9LgorICogCisgKiBAc2VlIEtleVN0b3JlCisgKiBAc2VlIEtleVN0b3JlLkVudHJ5CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NTI3MTQyOTQ1MjQ2Mjg2NTM1TDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9ufSB3aXRoIHRoZQorICAgICAqIGdpdmVuIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbi5qYXZhCmluZGV4IDI3MTZlNWUuLmU0YjM5OWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1VucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24uamF2YQpAQCAtMjMsMzEgKzIzLDMyIEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHk7CiAKIC8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGV4Y2VwdGlvbnMgaWYgYSBrZXkgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBrZXlzdG9yZS4KKyAqIHtAY29kZSBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9ufSBpbmRpY2F0ZXMsIHRoYXQgYSBrZXkgY2Fubm90IGJlIHJlY292ZXJlZAorICogZnJvbSBhIHtAY29kZSBLZXlTdG9yZX0uCiAgKiAKKyAqIEBzZWUgS2V5U3RvcmUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyNzUwNjMwNzgxOTAxNTEyNzdMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb259IHdpdGggdGhlCisgICAgICogZ2l2ZW4gbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb259LgogICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uKCkgewogICAgIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9VbnJlc29sdmVkUGVybWlzc2lvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1VucmVzb2x2ZWRQZXJtaXNzaW9uLmphdmEKaW5kZXggODNhMDg5Zi4uNjU3MGRlNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1VucmVzb2x2ZWRQZXJtaXNzaW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1VucmVzb2x2ZWRQZXJtaXNzaW9uLmphdmEKQEAgLTQxLDIwICs0MSwxNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogSG9sZHMgcGVybWlzc2lvbnMgd2hpY2ggYXJlIG9mIGFuIHVua25vd24gdHlwZSB3aGVuIGEgcG9saWN5IGZpbGUgaXMgcmVhZC4KLSAqCi0gKiBUZWNobmljYWxseSwgdGhlIHJlc29sdXRpb24gb2YgVW5yZXNvbHZlZFBlcm1pc3Npb25zIGFuZAotICogc3Vic3RpdHV0aW9uIGJ5IGFjdHVhbCBwZXJtaXNzaW9ucyB0YWtlcyBwbGFjZSBpbiB0aGUKLSAqIDxjb2RlPmltcGxpZXMoKTwvY29kZT4gbWV0aG9kIG9mIGEgPGNvZGU+UGVybWlzc2lvbnM8L2NvZGU+Ci0gKiBjb2xsZWN0aW9uLCByaWdodCBiZWZvcmUgYWN0dWFsIGNoZWNraW5nLgorICogQW4ge0Bjb2RlIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSByZXByZXNlbnRzIGEge0Bjb2RlIFBlcm1pc3Npb259IHdob3NlIHR5cGUKKyAqIHNob3VsZCBiZSByZXNvbHZlZCBsYXp5IGFuZCBub3QgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRpbWUgb2YgdGhlIHtAY29kZQorICogUG9saWN5fS4ge0Bjb2RlIFVucmVzb2x2ZWRQZXJtaXNzaW9ufXMgY29udGFpbiBhbGwgaW5mb3JtYXRpb24gdG8gYmUgcmVwbGFjZWQKKyAqIGJ5IGEgY29uY3JldGUgdHlwZWQge0Bjb2RlIFBlcm1pc3Npb259IHJpZ2h0IGJlZm9yZSB0aGUgYWNjZXNzIGNoZWNrcyBhcmUKKyAqIHBlcmZvcm1lZC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBVbnJlc29sdmVkUGVybWlzc2lvbiBleHRlbmRzIFBlcm1pc3Npb24KICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKiogCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4MjE5NzMxMTU0NjcwMDg4NDZMOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGQgc2VyaWFsUGVyc2lzdGVudEZpZWxkc1tdID0gewpAQCAtNzUsMTUgKzcyLDI1IEBACiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2g7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgdHlwZSwgbmFtZSwgYW5kCi0gICAgICogY2VydGlmaWNhdGVzIHNldCB0byB0aGUgYXJndW1lbnRzIGJ5IGRlZmluaXRpb24sIGFjdGlvbnMgYXJlIGlnbm9yZWQKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBVbnJlc29sdmVkUGVybWlzc2lvbn0uIFRoZSBzdXBwbGllZAorICAgICAqIHBhcmFtZXRlcnMgYXJlIHVzZWQgd2hlbiB0aGlzIGluc3RhbmNlIGlzIHJlc29sdmVkIHRvIHRoZSBjb25jcmV0ZQorICAgICAqIHtAY29kZSBQZXJtaXNzaW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgY2xhc3Mgb2YgcGVybWlzc2lvbiBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0aGlzIGNsYXNzIGlzCisgICAgICogICAgICAgICAgICByZXNvbHZlZCB0by4KICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgcGVybWlzc2lvbiB0aGF0IGNvdWxkIG5vdCBiZSByZXNvbHZlZAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdGhpcyBjbGFzcyBpcyByZXNvbHZlZCB0bywgbWF5YmUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gYWN0aW9ucworICAgICAqICAgICAgICAgICAgdGhlIGFjdGlvbnMgb2YgdGhlIHBlcm1pc3Npb24gdGhpcyBjbGFzcyBpcyByZXNvbHZlZCB0bywgbWF5YmUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gY2VydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZXMgb2YgdGhlIHBlcm1pc3Npb24gdGhpcyBjbGFzcyBpcyByZXNvbHZlZCB0bywKKyAgICAgKiAgICAgICAgICAgIG1heWJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdHlwZSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVucmVzb2x2ZWRQZXJtaXNzaW9uKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlW10gY2VydHMpIHsKQEAgLTEyMywxNyArMTMwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudAotICAgICAqIHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uIEluIHRoaXMKLSAgICAgKiBjYXNlLCB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBvYmplY3QgbXVzdCBoYXZlIHRoZSBzYW1lIGNsYXNzLCBwZXJtaXNzaW9uCi0gICAgICogbmFtZSwgYWN0aW9ucywgYW5kIGNlcnRpZmljYXRlcworICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyB7QGNvZGUgVW5yZXNvbHZlZFBlcm1pc3Npb259IGZvcgorICAgICAqIGVxdWFsaXR5IGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCwKKyAgICAgKiB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4gVG8gYmUgZXF1YWwsIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG5lZWRzIHRvIGJlIGFuCisgICAgICogaW5zdGFuY2Ugb2Yge0Bjb2RlIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSwgdGhlIHR3byB7QGNvZGUKKyAgICAgKiBVbnJlc29sdmVkUGVybWlzc2lvbn1zIG11c3QgcmVmZXIgdG8gdGhlIHNhbWUgdHlwZSBhbmQgbXVzdCBoYXZlIHRoZSBzYW1lCisgICAgICogbmFtZSwgdGhlIHNhbWUgYWN0aW9ucyBhbmQgY2VydGlmaWNhdGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0LAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGZvciBlcXVhbGl0eSB3aXRoIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICAgICBVbnJlc29sdmVkUGVybWlzc2lvbn0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7CkBAIC0xNTUsMTMgKzE2NCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byBvYmplY3RzIHdoaWNoCi0gICAgICogYW5zd2VyIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIHtAY29kZSBVbnJlc29sdmVkUGVybWlzc2lvbn0uCisgICAgICogUmV0dXJucyB0aGUgc2FtZSBoYXNoIGNvZGUgZm9yIHtAY29kZSBVbnJlc29sdmVkUGVybWlzc2lvbn1zIHRoYXQgYXJlCisgICAgICogZXF1YWwgdG8gZWFjaCBvdGhlciBhcyByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZgorICAgICAqIHtAbGluayBPYmplY3QjaGFzaENvZGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAotICAgICAqIEBzZWUgI2VxdWFscworICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgVW5yZXNvbHZlZFBlcm1pc3Npb259LgorICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCisgICAgICogQHNlZSBVbnJlc29sdmVkUGVybWlzc2lvbiNlcXVhbHMoT2JqZWN0KQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGlmIChoYXNoID09IDApIHsKQEAgLTE3NywzOCArMTg4LDYwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLiBTaW5jZQotICAgICAqIFVucmVzb2x2ZWRQZXJtaXNzaW9uIG9iamVjdHMgaGF2ZSBubyBhY3Rpb25zLCBhbnN3ZXIgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBzaW5jZSB0aGVyZSBhcmUgbm8gYWN0aW9ucyBhbGxvd2VkIGZvciB7QGNvZGUKKyAgICAgKiBVbnJlc29sdmVkUGVybWlzc2lvbn0uIFRoZSBhY3Rpb25zLCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBhcmUKKyAgICAgKiB1c2VkIHdoZW4gdGhlIGNvbmNyZXRlIHBlcm1pc3Npb24gaXMgcmVzb2x2ZWQgYW5kIGNyZWF0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGlvbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25zKCkgewogICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKLSAgICAvKiogCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0aGlzIHtAY29kZSBVbnJlc29sdmVkUGVybWlzc2lvbn0gaXMKKyAgICAgKiByZXNvbHZlZCB0by4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRoaXMge0Bjb2RlIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBpcworICAgICAqICAgICAgICAgcmVzb2x2ZWQgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIHRhcmdldE5hbWU7CiAgICAgfQogCi0gICAgLyoqIAotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjdGlvbnMgb2YgdGhlIHBlcm1pc3Npb24gdGhpcyB7QGNvZGUgVW5yZXNvbHZlZFBlcm1pc3Npb259CisgICAgICogaXMgcmVzb2x2ZWQgdG8uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYWN0aW9ucyBvZiB0aGUgcGVybWlzc2lvbiB0aGlzIHtAY29kZSBVbnJlc29sdmVkUGVybWlzc2lvbn0KKyAgICAgKiAgICAgICAgIGlzIHJlc29sdmVkIHRvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5yZXNvbHZlZEFjdGlvbnMoKSB7CiAgICAgICAgIHJldHVybiB0YXJnZXRBY3Rpb25zOwogICAgIH0KIAotICAgIC8qKiAKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0aGlzIHtAY29kZQorICAgICAqIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBpcyByZXNvbHZlZCB0by4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgVW5yZXNvbHZlZFBlcm1pc3Npb259IGlzIHJlc29sdmVkIHRvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5yZXNvbHZlZFR5cGUoKSB7CiAgICAgICAgIHJldHVybiBzdXBlci5nZXROYW1lKCk7CiAgICAgfQogCi0gICAgLyoqIAotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRlcyBvZiB0aGUgcGVybWlzc2lvbiB0aGlzIHtAY29kZQorICAgICAqIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBpcyByZXNvbHZlZCB0by4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZXMgb2YgdGhlIHBlcm1pc3Npb24gdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBpcyByZXNvbHZlZCB0by4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRVbnJlc29sdmVkQ2VydHMoKSB7CiAgICAgICAgIGlmICh0YXJnZXRDZXJ0cyAhPSBudWxsKSB7CkBAIC0yMjAsMjggKzI1MywzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmd1bWVudCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhlCi0gICAgICogcmVjZWl2ZXIuICBVbnJlc29sdmVkUGVybWlzc2lvbiBvYmplY3RzIGltcGx5IG5vdGhpbmcKLSAgICAgKiBiZWNhdXNlIG5vdGhpbmcgaXMga25vd24gYWJvdXQgdGhlbSB5ZXQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhpcyB7QGNvZGUKKyAgICAgKiBVbnJlc29sdmVkUGVybWlzc2lvbn0uIHtAY29kZSBVbnJlc29sdmVkUGVybWlzc2lvbn0gb2JqZWN0cyBpbXBseSBub3RoaW5nCisgICAgICogc2luY2Ugbm90aGluZyBpcyBrbm93biBhYm91dCB0aGVtIHlldC4KKyAgICAgKiA8cD4KKyAgICAgKiBCZWZvcmUgYWN0dWFsIGltcGxpY2F0aW9uIGNoZWNraW5nLCB0aGlzIG1ldGhvZCB0cmllcyB0byByZXNvbHZlCisgICAgICogVW5yZXNvbHZlZFBlcm1pc3Npb25zIChpZiBhbnkpIGFnYWluc3QgdGhlIHBhc3NlZCBpbnN0YW5jZS4gU3VjY2Vzc2Z1bGx5CisgICAgICogcmVzb2x2ZWQgcGVybWlzc2lvbnMgKGlmIGFueSkgYXJlIHRha2VuIGludG8gYWNjb3VudCBkdXJpbmcgZnVydGhlcgorICAgICAqIHByb2Nlc3NpbmcuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAgICAgKiBCZWZvcmUgYWN0dWFsIGltcGxpY2F0aW9uIGNoZWNraW5nLCB0aGlzIG1ldGhvZCB0cmllcyB0bwotICAgICAgICAgKiByZXNvbHZlIFVucmVzb2x2ZWRQZXJtaXNzaW9ucyAoaWYgYW55KSBhZ2FpbnN0IHRoZSBwYXNzZWQKLSAgICAgICAgICogaW5zdGFuY2UuIFN1Y2Nlc3NmdWxseSByZXNvbHZlZCBwZXJtaXNzaW9ucyAoaWYgYW55KSBhcmUKLSAgICAgICAgICogdGFrZW4gaW50byBhY2NvdW50IGR1cmluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0gICAgICAgICAqCiAgICAgICogQHBhcmFtIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrCi0gICAgICogQHJldHVybiBhbHdheXMgcmVwbGllcyBmYWxzZQorICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2suCisgICAgICogQHJldHVybiBhbHdheXMge0Bjb2RlIGZhbHNlfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGltcGxpZXMoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzCisgICAgICoge0Bjb2RlIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBpbmNsdWRpbmcgaXRzIHRhcmdldCBuYW1lIGFuZCBpdHMgdGFyZ2V0CisgICAgICogYWN0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUgVW5yZXNvbHZlZFBlcm1pc3Npb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiAiKHVucmVzb2x2ZWQgIiArIGdldE5hbWUoKSArICIgIiArIHRhcmdldE5hbWUgKyAiICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKQEAgLTI0OSwzMSArMjg2LDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgaG9sZGluZyBwZXJtaXNzaW9ucyBvZiB0aGlzIGNsYXNzLgotICAgICAqIEFuc3dlciBudWxsIGlmIGFueSBwZXJtaXNzaW9uIGNvbGxlY3Rpb24gY2FuIGJlIHVzZWQuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgUGVybWlzc2lvbkNvbGxlY3Rpb259IGZvciBob2xkaW5nIHtAY29kZQorICAgICAqIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBvYmplY3RzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgUGVybWlzc2lvbkNvbGxlY3Rpb24gb3IgbnVsbAotICAgICAqIAotICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uCisgICAgICogQHJldHVybiBhIG5ldyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgaG9sZGluZyB7QGNvZGUKKyAgICAgKiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBvYmplY3RzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKICAgICAgICAgcmV0dXJuIG5ldyBVbnJlc29sdmVkUGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmllcyB0byByZXNvbHZlIHRoaXMgcGVybWlzc2lvbiBpbnRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuIEl0IGlzIGFzc3VtZWQKLSAgICAgKiB0aGF0IHRoZSBjbGFzcyBoYXMgYSBwcm9wZXIgbmFtZSAoYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0TmFtZSgpPC9jb2RlPgotICAgICAqIG9mIHRoaXMgdW5yZXNvbHZlZCBwZXJtaXNzaW9uKSwgc28gbm8gY2hlY2sgaXMgcGVyZm9ybWVkIHRvIHZlcmlmeSB0aGlzLgotICAgICAqIEhvd2V2ZXIsIHRoZSBjbGFzcyBtdXN0IGhhdmUgYWxsIHJlcXVpcmVkIGNlcnRpZmljYXRlcyAoYXMgcGVyCi0gICAgICogPGNvZGU+Z2V0VW5yZXNvbHZlZENlcnRzKCk8L2NvZGU+KSBhbW9uZyB0aGUgcGFzc2VkIGNvbGxlY3Rpb24gb2YKLSAgICAgKiBzaWduZXJzLiBJZiBpdCBkb2VzLCBhIHplcm8sIG9uZSwgYW5kL29yIHR3by1hcmd1bWVudCBjb25zdHJ1Y3RvciBpcwotICAgICAqIHRyaWVkIHRvIGluc3RhbnRpYXRlIGEgbmV3IHBlcm1pc3Npb24sIHdoaWNoIGlzIHRoZW4gcmV0dXJuZWQuIDxicj4KLSAgICAgKiBJZiBhbiBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBpcyBub3QgYXZhaWxhYmxlIG9yIHRoZSBjbGFzcyBpcwotICAgICAqIGltcHJvcGVybHkgc2lnbmVkLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKiBUcmllcyB0byByZXNvbHZlIHRoaXMgcGVybWlzc2lvbiBpbnRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCisgICAgICogPHA+CisgICAgICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBjbGFzcyBoYXMgYSBwcm9wZXIgbmFtZSAoYXMgcmV0dXJuZWQgYnkge0Bjb2RlCisgICAgICogZ2V0TmFtZSgpfSBvZiB0aGlzIHVucmVzb2x2ZWQgcGVybWlzc2lvbiksIHNvIG5vIGNoZWNrIGlzIHBlcmZvcm1lZCB0bworICAgICAqIHZlcmlmeSB0aGlzLiBIb3dldmVyLCB0aGUgY2xhc3MgbXVzdCBoYXZlIGFsbCByZXF1aXJlZCBjZXJ0aWZpY2F0ZXMgKGFzCisgICAgICogcGVyIHtAY29kZSBnZXRVbnJlc29sdmVkQ2VydHMoKX0pIGFtb25nIHRoZSBwYXNzZWQgY29sbGVjdGlvbiBvZiBzaWduZXJzLgorICAgICAqIElmIGl0IGRvZXMsIGEgemVybywgb25lLCBhbmQvb3IgdHdvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGlzIHRyaWVkIHRvCisgICAgICogaW5zdGFudGlhdGUgYSBuZXcgcGVybWlzc2lvbiwgd2hpY2ggaXMgdGhlbiByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYgYW4gYXBwcm9wcmlhdGUgY29uc3RydWN0b3IgaXMgbm90IGF2YWlsYWJsZSBvciB0aGUgY2xhc3MgaXMgaW1wcm9wZXJseQorICAgICAqIHNpZ25lZCwge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0VHlwZSAtIGEgdGFyZ2V0IGNsYXNzIGluc3RhbmNlLCBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBwYXJhbSBzaWduZXJzIC0gYWN0dWFsIHNpZ25lcnMgb2YgdGhlIHRhcmdldFR5cGUKKyAgICAgKiBAcGFyYW0gdGFyZ2V0VHlwZQorICAgICAqICAgICAgICAgICAgLSBhIHRhcmdldCBjbGFzcyBpbnN0YW5jZSwgbXVzdCBub3QgYmUge0Bjb2RlIG51bGx9CisgICAgICogQHBhcmFtIHNpZ25lcnMKKyAgICAgKiAgICAgICAgICAgIC0gYWN0dWFsIHNpZ25lcnMgb2YgdGhlIHRhcmdldFR5cGUKICAgICAgKiBAcmV0dXJuIHJlc29sdmVkIHBlcm1pc3Npb24gb3IgbnVsbAogICAgICAqLwogICAgIFBlcm1pc3Npb24gcmVzb2x2ZShDbGFzcyB0YXJnZXRUeXBlKSB7CkBAIC0yOTMsNyArMzM1LDcgQEAKICAgICAvKioKICAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgogICAgICAqIAotICAgICAqIE91dHB1dHMgPGNvZGU+dHlwZTwvY29kZT4sPGNvZGU+bmFtZTwvY29kZT4sPGNvZGU+YWN0aW9uczwvY29kZT4KKyAgICAgKiBPdXRwdXRzIHtAY29kZSB0eXBlfSx7QGNvZGUgbmFtZX0se0Bjb2RlIGFjdGlvbnN9CiAgICAgICogZmllbGRzIHZpYSBkZWZhdWx0IG1lY2hhbmlzbTsgbmV4dCBtYW51YWxseSB3cml0ZXMgY2VydGlmaWNhdGVzIGluIHRoZQogICAgICAqIGZvbGxvd2luZyBmb3JtYXQ6IDxicj4KICAgICAgKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1VucmVzb2x2ZWRQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1VucmVzb2x2ZWRQZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhCmluZGV4IDg0YzQ0NjcuLmE0M2E1NGYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9VbnJlc29sdmVkUGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvVW5yZXNvbHZlZFBlcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKQEAgLTQxLDE1ICs0MSwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogU3BlY2lmaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZm9yIHN0b3JpbmcgVW5yZXNvbHZlZFBlcm1pc3Npb25zLiBDb250YWluZWQKLSAqIGVsZW1lbnRzIGFyZSBncm91cGVkIGJ5IHRoZWlyIHRhcmdldCB0eXBlLgotICogCisgKiB7QGNvZGUgVW5yZXNvbHZlZFBlcm1pc3Npb25Db2xsZWN0aW9ufSByZXByZXNlbnRzIGEgc3BlY2lmaWMge0Bjb2RlCisgKiBQZXJtaXNzaW9uQ29sbGVjdGlvbn0gZm9yIHN0b3Jpbmcge0BsaW5rIFVucmVzb2x2ZWRQZXJtaXNzaW9ufSBpbnN0YW5jZXMuCisgKiBDb250YWluZWQgZWxlbWVudHMgYXJlIGdyb3VwZWQgYnkgdGhlaXIgdGFyZ2V0IHR5cGUuCiAgKi8KIGZpbmFsIGNsYXNzIFVucmVzb2x2ZWRQZXJtaXNzaW9uQ29sbGVjdGlvbiBleHRlbmRzIFBlcm1pc3Npb25Db2xsZWN0aW9uIHsKIAotICAgIC8qKiAKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzE3NjE1MzA3MTczMzEzMjQwMEw7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7IApAQCAtNTksOSArNTYsMTcgQEAKICAgICBwcml2YXRlIHRyYW5zaWVudCBNYXAga2xhc3NlcyA9IG5ldyBIYXNoTWFwKCk7CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGFuIHVucmVzb2x2ZWQgcGVybWlzc2lvbiB0byB0aGUgY29sbGVjdGlvbi4KKyAgICAgKiBBZGRzIGFuIHVucmVzb2x2ZWQgcGVybWlzc2lvbiB0byB0aGlzIHtAY29kZQorICAgICAqIFVucmVzb2x2ZWRQZXJtaXNzaW9uQ29sbGVjdGlvbn0uCiAgICAgICogCi0gICAgICogQHNlZSBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uI2FkZChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCisgICAgICogQHBhcmFtIHBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGFkZGVkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNvbGxlY3Rpb24gaXMgcmVhZCBvbmx5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBlcm1pc3Npb259IGlzIHtAY29kZSBudWxsfSBvciBub3QgYW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICAgVW5yZXNvbHZlZFBlcm1pc3Npb259LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKICAgICAgICAgaWYgKGlzUmVhZE9ubHkoKSkgewpAQCAtODMsMTEgKzg4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgZW51bWVyYXRpb24gb3ZlciBjb2xsZWN0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiNlbGVtZW50cygpCi0gICAgICovCiAgICAgcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewogICAgICAgICBDb2xsZWN0aW9uIGFsbCA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0ga2xhc3Nlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKQEAgLTk3LDkgKzk3LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWx3YXlzIHJldHVybnMgZmFsc2UuCisgICAgICogQWx3YXlzIHJldHVybnMge0Bjb2RlIGZhbHNlfS4KICAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuVW5yZXNvbHZlZFBlcm1pc3Npb24jaW1wbGllcyhQZXJtaXNzaW9uKQorICAgICAqIEByZXR1cm4gYWx3YXlzIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAc2VlIFVucmVzb2x2ZWRQZXJtaXNzaW9uI2ltcGxpZXMoUGVybWlzc2lvbikuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE2LDEzICsxMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBSZXNvbHZlcyBhbGwgcGVybWlzc2lvbnMgb2YgdGhlIHNhbWUgY2xhc3MgYXMgdGhlIHNwZWNpZmllZCB0YXJnZXQKICAgICAgKiBwZXJtaXNzaW9uIGFuZCBhZGRzIHRoZW0gdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLiBJZiBwYXNzZWQKLSAgICAgKiBjb2xsZWN0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBzb21lIHVucmVzb2x2ZWQgcGVybWlzc2lvbnMgd2VyZQotICAgICAqIHJlc29sdmVkLCBhbiBhcHByb3ByaWF0ZSBuZXcgY29sbGVjdGlvbiBpcyBpbnN0YW50aWF0ZWQgYW5kIHVzZWQuIEFsbAotICAgICAqIHJlc29sdmVkIHBlcm1pc3Npb25zIGFyZSByZW1vdmVkIGZyb20gdGhpcyB1bnJlc29sdmVkIGNvbGxlY3Rpb24sIGFuZAotICAgICAqIGNvbGxlY3Rpb24gd2l0aCByZXNvbHZlZCBvbmVzIGlzIHJldHVybmVkLgorICAgICAqIGNvbGxlY3Rpb24gaXMge0Bjb2RlIG51bGx9IGFuZCBzb21lIHVucmVzb2x2ZWQgcGVybWlzc2lvbnMgd2VyZSByZXNvbHZlZCwKKyAgICAgKiBhbiBhcHByb3ByaWF0ZSBuZXcgY29sbGVjdGlvbiBpcyBpbnN0YW50aWF0ZWQgYW5kIHVzZWQuIEFsbCByZXNvbHZlZAorICAgICAqIHBlcm1pc3Npb25zIGFyZSByZW1vdmVkIGZyb20gdGhpcyB1bnJlc29sdmVkIGNvbGxlY3Rpb24sIGFuZCBjb2xsZWN0aW9uCisgICAgICogd2l0aCByZXNvbHZlZCBvbmVzIGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXQgLSBhIGtpbmQgb2YgcGVybWlzc2lvbnMgdG8gYmUgcmVzb2x2ZWQKLSAgICAgKiBAcGFyYW0gaG9sZGVyIC0gYW4gZXhpc3RpbmcgY29sbGVjdGlvbiBmb3Igc3RvcmluZyByZXNvbHZlZCBwZXJtaXNzaW9ucworICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKiAgICAgICAgICAgIGEga2luZCBvZiBwZXJtaXNzaW9ucyB0byBiZSByZXNvbHZlZC4KKyAgICAgKiBAcGFyYW0gaG9sZGVyCisgICAgICogICAgICAgICAgICBhbiBleGlzdGluZyBjb2xsZWN0aW9uIGZvciBzdG9yaW5nIHJlc29sdmVkIHBlcm1pc3Npb25zLgogICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgcmVzb2x2ZWQgcGVybWlzc2lvbnMgKGlmIGFueSBmb3VuZCkKICAgICAgKi8KICAgICBQZXJtaXNzaW9uQ29sbGVjdGlvbiByZXNvbHZlQ29sbGVjdGlvbihQZXJtaXNzaW9uIHRhcmdldCwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvQWNsLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0FjbC5qYXZhCmluZGV4IDhhODdhNWUuLjM1YzkyZmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvQWNsLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9BY2wuamF2YQpAQCAtMTUsNjEgKzE1LDE2OSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZWtzZWkgWS4gU2VtZW5vdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuYWNsOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgPGk+QWNjZXNzIENvbnRyb2wgTGlzdDwvaT4gKDxiPkFDTDwvYj4pIGludGVyZmFjZSBkZWZpbml0aW9uLgorICogPHA+CisgKiBBbiBBQ0wgaXMgYSBzZXQgb2Yge0BsaW5rIEFjbEVudHJ5fSBvYmplY3RzLgorICogPC9wPgorICogPHA+CisgKiBBbiB7QGNvZGUgQWNsRW50cnl9IGlzIGEgbGlzdCBvZiB7QGxpbmsgUGVybWlzc2lvbn1zIHRoYXQgYXJlIGdyYW50ZWQgCisgKiAoPGk+cG9zaXRpdmU8L2k+KSBvciBkZW5pZWQKKyAqICg8aT5uZWdhdGl2ZTwvaT4pIHRvIGEge0BsaW5rIFByaW5jaXBhbH0uCisgKiA8L3A+CisgKiA8cD4KKyAqIEFuIHtAY29kZSBBY2x9IGhhcyBhIGxpc3Qgb2Ygb3duZXJzICh7QGxpbmsgT3duZXJ9KSB3aGljaCBhcmUgcHJpbmNpcGFscyBhcyB3ZWxsIHtAY29kZQorICogUHJpbmNpcGFsfS4gT25seSB0aG9zZSBwcmluY2lwYWxzIHdoaWNoIGFyZSB0aGUge0Bjb2RlIEFjbH0ncyBvd25lcnMgYXJlIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB7QGNvZGUKKyAqIEFjbH0uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSA8aT5BQ0w8L2k+IGhhcyB0byBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgKiA8dWw+CisgKiA8bGk+Rm9yIGVhY2gge0Bjb2RlIFByaW5jaXBhbH0gdGhlcmUgY2FuIGJlIG9ubHkgb25lIDxpPnBvc2l0aXZlPC9pPiBhbmQgb25lCisgKiA8aT5uZWdhdGl2ZTwvaT4ge0Bjb2RlIEFjbEVudHJ5fS48L2xpPgorICogPGxpPklmIHRoZSB0d28ge0Bjb2RlIEFjbEVudHJ5fSdzICg8aT5wb3NpdGl2ZTwvaT4gYW5kIDxpPm5lZ2F0aXZlPC9pPikgZm9yIGEKKyAqIHNwZWNpZmljIHtAY29kZSBQcmluY2lwYWx9IGdyYW50IGFuZCBkZW55IHRoZSBzYW1lIHtAY29kZSBQZXJtaXNzaW9ufSB0byB0aGF0CisgKiB7QGNvZGUgUHJpbmNpcGFsfSwgdGhlbiB0aGF0IHtAY29kZSBQZXJtaXNzaW9ufSBpcyB0cmVhdGVkIGFzCisgKiBuZWl0aGVyIGdyYW50ZWQgbm9yIGRlbmllZCB0byB0aGF0IHtAY29kZSBQcmluY2lwYWx9LjwvbGk+CisgKiA8bGk+UGVybWlzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGluZGl2aWR1YWwge0Bjb2RlIFByaW5jaXBhbH0gYWx3YXlzCisgKiBvdmVycmlkZSBwZXJtaXNzaW9ucyBvZiB0aGUgZ3JvdXAocykgdG8gd2hpY2ggdGhlIGluZGl2aWR1YWwgYmVsb25ncy48L2xpPgorICogPGxpPklmIHRoZXJlIGlzIG5vIHtAY29kZSBBY2xFbnRyeX0gYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMge0Bjb2RlCisgKiBQcmluY2lwYWx9LCB0aGVuIGl0IGlzIGludGVycHJldGVkIGFzIGFuIGVtcHR5IGxpc3Qgb2YgcGVybWlzc2lvbnMuPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CiAgKiAKLSAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQWNsIGV4dGVuZHMgT3duZXIgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgPGk+QUNMPC9pPiBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGVyCisgICAgICogICAgICAgICAgICB0aGUgaW52b2tpbmcge0Bjb2RlIFByaW5jaXBhbH0uCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIGJlIHNldC4KKyAgICAgKiBAdGhyb3dzIE5vdE93bmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGludm9raW5nIHtAY29kZSBQcmluY2lwYWx9IGlzIG5vdCBhbiBvd25lciBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgPGk+QUNMPC9pPi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICB2b2lkIHNldE5hbWUoUHJpbmNpcGFsIGNhbGxlciwgU3RyaW5nIG5hbWUpIHRocm93cyBOb3RPd25lckV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIDxpPkFDTDwvaT4gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIDxpPkFDTDwvaT4gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgU3RyaW5nIGdldE5hbWUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQWRkcyBhbiB7QGNvZGUgQWNsRW50cnl9IHRvIHRoaXMgPGk+QUNMPC9pPiBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgPGk+QUNMPC9pPiBhbHJlYWR5IGhhcyBhbiB7QGNvZGUgQWNsRW50cnl9IG9mIHRoZSBzYW1lIHR5cGUgKDxpPgorICAgICAqIHBvc2l0aXZlPC9pPiBvciA8aT5uZWdhdGl2ZTwvaT4pIGFuZCBwcmluY2lwYWwsIHRoZW4gdGhlIG5ldyBlbnRyeSBpcyBub3QgYWRkZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYWxsZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnZva2luZyB7QGNvZGUgUHJpbmNpcGFsfS4KKyAgICAgKiBAcGFyYW0gZW50cnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBBQ0wgZW50cnkgdG8gYWRkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBlbnRyeSBpcyBhZGRlZCwge0Bjb2RlIGZhbHNlfSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVudHJ5IG9mCisgICAgICogICAgICAgICB0aGUgc2FtZSB0eXBlIGZvciB0aGUgc2FtZSBwcmluY2lwYWwKKyAgICAgKiBAdGhyb3dzIE5vdE93bmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGludm9raW5nIHtAY29kZSBQcmluY2lwYWx9IGlzIG5vdCBhbiBvd25lciBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgPGk+QUNMPC9pPi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBib29sZWFuIGFkZEVudHJ5KFByaW5jaXBhbCBjYWxsZXIsIEFjbEVudHJ5IGVudHJ5KSB0aHJvd3MgTm90T3duZXJFeGNlcHRpb247CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZW1vdmVzIGFuIHtAY29kZSBBY2xFbnRyeX0gZnJvbSB0aGlzIDxpPkFDTDwvaT4gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhbGxlcgorICAgICAqICAgICAgICAgICAgdGhlIGludm9raW5nIHtAY29kZSBQcmluY2lwYWx9LgorICAgICAqIEBwYXJhbSBlbnRyeQorICAgICAqICAgICAgICAgICAgdGhlIEFDTCBlbnRyeSB0byByZW1vdmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVudHJ5IGlzIHJlbW92ZWQsIHtAY29kZSBmYWxzZX0gaWYgdGhlIGVudHJ5IGlzIG5vdCBpbiB0aGlzCisgICAgICogICAgICAgICA8aT5BQ0w8L2k+LgorICAgICAqIEB0aHJvd3MgTm90T3duZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW52b2tpbmcge0Bjb2RlIFByaW5jaXBhbH0gaXMgbm90IGFuIG93bmVyIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICA8aT5BQ0w8L2k+LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGJvb2xlYW4gcmVtb3ZlRW50cnkoUHJpbmNpcGFsIGNhbGxlciwgQWNsRW50cnkgZW50cnkpIAogICAgICAgICAgICAgICAgIHRocm93cyBOb3RPd25lckV4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhbGxvd2VkIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIFByaW5jaXBhbH0uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHNwZWNpZmllZCBwcmluY2lwYWwgaGFzIG5vIGVudHJ5IGluIHRoaXMgQUNMLCBhbiBlbXB0eSBzZXQgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGFsbG93ZWQgcGVybWlzc2lvbnMgYXJlIGNvbGxlY3RlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBydWxlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSB0d28gcGVybWlzc2lvbiBsaXN0cyAoPGk+cG9zaXRpdmU8L2k+IGFuZCA8aT5uZWdhdGl2ZTwvaT4pIG9mIHRoZQorICAgICAqIHByaW5jaXBhbCdzIGdyb3VwcyAoe0BsaW5rIEdyb3VwfSkgYXJlIGNvbGxlY3RlZC4gVGhlIHBvc2l0aXZlIChncmFudGVkKQorICAgICAqIHBlcm1pc3Npb25zIGFyZSB0aGUgdW5pb24gb2YgYWxsIGdyb3VwJ3MgcG9zaXRpdmUgcGVybWlzc2lvbnMgdGhhdCB0aGUKKyAgICAgKiBwcmluY2lwYWwgYmVsb25ncyB0bywgdGhlIG5lZ2F0aXZlIChkZW5pZWQpIHBlcm1pc3Npb25zIGFyZSB0aGUgdW5pb24gb2YKKyAgICAgKiBhbGwgZ3JvdXAncyBuZWdhdGl2ZSBwZXJtaXNzaW9ucyB0aGF0IHRoZSBwcmluY2lwYWwgYmVsb25ncyB0by4gSWYgYQorICAgICAqIHNwZWNpZmljIHBlcm1pc3Npb24gaXMgaW4gYm90aCB0aGUgcG9zaXRpdmUgYW5kIHRoZSBuZWdhdGl2ZSBsaXN0LCBpdCBpcworICAgICAqIHJlbW92ZWQgZnJvbSBib3RoIGxpc3RzLjwvbGk+CisgICAgICogPGxpPlRoZSBpbmRpdmlkdWFsIHBlcm1pc3Npb25zICg8aT5wb3NpdGl2ZTwvaT4gYW5kIDxpPm5lZ2F0aXZlPC9pPikgb2YKKyAgICAgKiB0aGUgcHJpbmNpcGFsIG92ZXJyaWRlIHRoZSBncm91cCBwZXJtaXNzaW9ucy4gVGhlIHBvc2l0aXZlIGluZGl2aWR1YWwKKyAgICAgKiBwZXJtaXNzaW9ucyBvdmVycmlkZSB0aGUgZ3JvdXAncyBuZWdhdGl2ZSBwZXJtaXNzaW9ucyBhbmQgdGhlIG5lZ2F0aXZlCisgICAgICogaW5kaXZpZHVhbCBwZXJtaXNzaW9ucyBvdmVycmlkZSB0aGUgZ3JwdXAncyBwb3NpdGl2ZSBwZXJtaXNzaW9ucy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyCisgICAgICogICAgICAgICAgICB0aGUgcHJpbmNpcGFsIHRvIGdldCB0aGUgYWxsb3dlZCBwZXJtaXNzaW9ucyBmb3IuCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGFsbG93ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbmNpcGFsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEVudW1lcmF0aW9uPFBlcm1pc3Npb24+IGdldFBlcm1pc3Npb25zKFByaW5jaXBhbCB1c2VyKTsgCiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGFuIHtAY29kZSBFbnVtZXJhdGlvbn0gb2YgdGhlIHtAY29kZSBBY2xFbnRyeX0gb2YgdGhpcworICAgICAqIDxpPkFDTDwvaT4uCisgICAgICogCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgRW51bWVyYXRpb259IG9mIHRoZSB7QGNvZGUgQWNsRW50cnl9IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIDxpPkFDTDwvaT4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgRW51bWVyYXRpb248QWNsRW50cnk+IGVudHJpZXMoKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcHJpbmNpcGFsIGlzIGdyYW50ZWQgdGhlIHNwZWNpZmllZAorICAgICAqIHBlcm1pc3Npb24uCisgICAgICogPHA+CisgICAgICogVGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBpcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMKKyAgICAgKiBzcGVjaWZpZWQgYnkge0Bjb2RlIGdldFBlcm1pc3Npb25zfS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHByaW5jaXBhbAorICAgICAqICAgICAgICAgICAgdGhlIHByaW5jaXBhbCB0aGUgY2hlY2sgdGhlIHBlcm1pc3Npb25zIGZvci4KKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2sgZm9yIHRoZSBwcmluY2lwYWwuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHByaW5jaXBhbCBpcyBncmFudGVkIHRoZSBwZXJtaXNzaW9uLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2VlICNnZXRQZXJtaXNzaW9ucyhQcmluY2lwYWwpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBjaGVja1Blcm1pc3Npb24oUHJpbmNpcGFsIHByaW5jaXBhbCwgUGVybWlzc2lvbiBwZXJtaXNzaW9uKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEFDTC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBBQ0wuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgU3RyaW5nIHRvU3RyaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0FjbEVudHJ5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0FjbEVudHJ5LmphdmEKaW5kZXggNWQwYWJjZi4uN2E1YjcyMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9BY2xFbnRyeS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvQWNsRW50cnkuamF2YQpAQCAtMTUsNzAgKzE1LDEyMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZWtzZWkgWS4gU2VtZW5vdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuYWNsOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgPGk+QWNjZXNzIENvbnRyb2wgTGlzdCBFbnRyeTwvaT4gaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKiA8cD4KKyAqIEFuIHtAY29kZSBBY2xFbnRyeX0gaXMgYSBsaXN0IG9mIHRoZSB7QGxpbmsgUGVybWlzc2lvbn1zIHRoYXQgYXJlIAorICogIGdyYW50ZWQgKDxpPnBvc2l0aXZlPC9pPikgb3IgZGVuaWVkICg8aT5uZWdhdGl2ZTwvaT4pIHRvIGEge0BsaW5rIFByaW5jaXBhbH0uCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBpbnRlcmZhY2UgQWNsRW50cnkgZXh0ZW5kcyBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXQgdGhlIHByaW5jaXBhbCBmb3IgdGhpcyBBQ0wgZW50cnkuCisgICAgICogPHA+CisgICAgICogVGhlIHByaW5jaXBhbCBmb3IgYW4gQUNMIGVudHJ5IGNhbiBvbmx5IGJlIHNldCBvbmNlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcgorICAgICAqICAgICAgICAgICAgdGhlIHByaW5jaXBhbCBmb3IgdGhpcyBBQ0wgZW50cnkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBpZiB0aGVyZSBpcyBhIHByaW5jaXBhbCBhbHJlYWR5IHNldCBmb3IKKyAgICAgKiAgICAgICAgIHRoaXMgZW50cnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBzZXRQcmluY2lwYWwoUHJpbmNpcGFsIHVzZXIpOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpbmNpcGFsIG9mIHRoaXMgQUNMIGVudHJ5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaW5jaXBhbCBvZiB0aGlzIEFDTCBlbnRyeSwgb3IgbnVsbCBpZiBub25lIGlzIHNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoaXMgQUNMIGVudHJ5IHRvIGJlIDxpPm5lZ2F0aXZlPC9pPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcGVybWlzc2lvbnMgaW4gdGhpcyBBQ0wgZW50cnkgd2lsbCBiZSBkZW5pZWQgdG8gdGhlIHByaW5jaXBhbAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudHJ5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBBbiBBQ0wgZW50cnkgaXMgPGk+cG9zaXRpdmU8L2k+IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlY29tZQorICAgICAqIDxpPm5lZ2F0aXZlPC9pPiBieSBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICB2b2lkIHNldE5lZ2F0aXZlUGVybWlzc2lvbnMoKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIEFDTCBlbnRyeSBpcyA8aT5uZWdhdGl2ZTwvaT4uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBBQ0wgZW50cnkgaXMgbmVnYXRpdmUsIHtAY29kZSBmYWxzZX0gaWYgaXQncyBwb3NpdGl2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBib29sZWFuIGlzTmVnYXRpdmUoKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uIHRvIHRoaXMgQUNMIGVudHJ5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBiZSBhZGRlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gaXMgYWRkZWQsIHtAY29kZSBmYWxzZX0gaWYgdGhlCisgICAgICogICAgICAgICBwZXJtaXNzaW9uIHdhcyBhbHJlYWR5IGluIHRoaXMgZW50cnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBhZGRQZXJtaXNzaW9uKFBlcm1pc3Npb24gcGVybWlzc2lvbik7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBmcm9tIHRoaXMgQUNMIGVudHJ5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiB0byBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwZXJtaXNzaW9uIGlzIHJlbW92ZWQsIHtAY29kZSBmYWxzZX0gaWYgdGhlIHBlcm1pc3Npb24gd2FzCisgICAgICogICAgICAgICBub3QgaW4gdGhpcyBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBib29sZWFuIHJlbW92ZVBlcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBpbiB0aGlzIEFDTCBlbnRyeS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBlcm1pc3Npb24gaXMgaW4gdGhpcyBlbnRyeSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgb2YgdGhpcyBBQ0wgZW50cnkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBwZXJtaXNzaW9ucyBvZiB0aGlzIEFDTCBlbnRyeSwKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBFbnVtZXJhdGlvbjxQZXJtaXNzaW9uPiBwZXJtaXNzaW9ucygpOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgQUNMIGVudHJ5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEFDTCBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBTdHJpbmcgdG9TdHJpbmcoKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb25lcyB0aGlzIEFDTCBlbnRyeSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGVudHJ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIE9iamVjdCBjbG9uZSgpOwogICAgIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9BY2xOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9BY2xOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDg5ZGNlYTMuLmM4ZDQyMDggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvQWNsTm90Rm91bmRFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0FjbE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTE1LDI4ICsxNSwyNSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBWLiBBc3RhcGNodWsKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmFjbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGV4Y2VwdGlvbiwgdGhhdCBpcyB0aHJvd24gd2hlbiBhIHJlZmVyZW5jZSB0byBhIG5vbi1leGlzdGVudCA8aT5BY2Nlc3MKKyAqIENvbnRyb2wgTGlzdDwvaT4gKEFDTCkgaXMgbWFkZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIAogcHVibGljIGNsYXNzIEFjbE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU2ODQyOTUwMzQwOTI2ODE3OTFMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQWNsTm90Rm91bmRFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBY2xOb3RGb3VuZEV4Y2VwdGlvbigpIHsKIAogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0dyb3VwLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0dyb3VwLmphdmEKaW5kZXggMzdiM2Q1Yi4uMTY4OThlNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9Hcm91cC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvR3JvdXAuamF2YQpAQCAtMTUsNDAgKzE1LDU1IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQWxla3NlaSBZLiBTZW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5hY2w7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIEEge0Bjb2RlIFByaW5jaXBhbH0gdGhhdCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgcHJpbmNpcGFscy4KICAqIAorICogQHNlZSBQcmluY2lwYWwKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGludGVyZmFjZSBHcm91cCBleHRlbmRzIFByaW5jaXBhbCB7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBBZGRzIGEgbWVtYmVyIHRvIHRoaXMgZ3JvdXAuCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZW1iZXIgdG8gYWRkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBtZW1iZXIgd2FzIGFkZGVkLCB7QGNvZGUgZmFsc2V9IGlmIGl0IHdhcyBhbHJlYWR5IGEgbWVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGJvb2xlYW4gYWRkTWVtYmVyKFByaW5jaXBhbCB1c2VyKTsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJlbW92ZXMgYSBtZW1iZXIgZnJvbSB0aGlzIGdyb3VwLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyCisgICAgICogICAgICAgICAgICB0aGUgbWVtYmVyIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWVtYmVyIHdhcyByZW1vdmVkLCB7QGNvZGUgZmFsc2V9IGlmIGl0IHdhcyBub3QgYSBtZW1iZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiByZW1vdmVNZW1iZXIoUHJpbmNpcGFsIHVzZXIpOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcHJpbmNpcGFsIGlzIGEgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuCisgICAgICogCisgICAgICogQHBhcmFtIG1lbWJlcgorICAgICAqICAgICAgICAgICAgdGhlIHByaW5jaXBhbCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcHJpbmNpcGFsIGlzIGEgbWVtYmVyLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBib29sZWFuIGlzTWVtYmVyKFByaW5jaXBhbCBtZW1iZXIpOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbWVtYmVycyBvZiB0aGlzIGdyb3VwLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhpcyBncm91cC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBFbnVtZXJhdGlvbjw/IGV4dGVuZHMgUHJpbmNpcGFsPiBtZW1iZXJzKCk7CiAgICAgCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0xhc3RPd25lckV4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9MYXN0T3duZXJFeGNlcHRpb24uamF2YQppbmRleCA4ZWMzMjhlLi4xMWMyMzVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL0xhc3RPd25lckV4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvTGFzdE93bmVyRXhjZXB0aW9uLmphdmEKQEAgLTE1LDI2ICsxNSwyNCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBWLiBBc3RhcGNodWsKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmFjbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICogIAorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byByZW1vdmUgdGhlIAorICogdGhlIGxhc3Qge0Bjb2RlIE93bmVyfSBmcm9tIGFuIHtAY29kZSBPd25lcn0uCisgKiAKKyAqIEBzZWUgT3duZXIKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIExhc3RPd25lckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgCi0gICAgICovCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTE0MTk5NzU0ODIxMTE0MDM1OUw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBMYXN0T3duZXJFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMYXN0T3duZXJFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9Ob3RPd25lckV4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9Ob3RPd25lckV4Y2VwdGlvbi5qYXZhCmluZGV4IDQ2ODEzMzkuLjA4MWJkZWEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvTm90T3duZXJFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL05vdE93bmVyRXhjZXB0aW9uLmphdmEKQEAgLTE1LDI2ICsxNSwyNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBWLiBBc3RhcGNodWsKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmFjbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGFjdGlvbiB0aGF0IHJlcXVpcmVzIG93bmVyc2hpcCBpcworICogYXR0ZW1wdGVkIGJ5IGEgcHJpbmNpcGFsIHRoYXQgaXMgbm90IGFuIG93bmVyIG9mIHRoZSBvYmplY3QgZm9yIHdoaWNoIAorICogb3duZXJzaGlwIGlzIHJlcXVpcmVkLiAKICAqIAorICogQHNlZSBBY2wKKyAqIEBzZWUgT3duZXIKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIE5vdE93bmVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NTU1NTk3OTExMTYzMzYyMzk5TDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIE5vdE93bmVyRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTm90T3duZXJFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9Pd25lci5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9Pd25lci5qYXZhCmluZGV4IDVmNjA0ZjcuLjMzNWRjODQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvT3duZXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL093bmVyLmphdmEKQEAgLTE1LDM2ICsxNSw1OSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZWtzZWkgWS4gU2VtZW5vdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuYWNsOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBpbnRlcmZhY2UgdG8gbWFuYWdlIG93bmVycyBvZiBvYmplY3RzIHRoYXQgcmVxdWlyZSBvd25lcnNoaXAuCiAgKiAKKyAqIEBzZWUgQWNsCisgKiBAc2VlIFByaW5jaXBhbAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGludGVyZmFjZSBPd25lciB7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBBZGRzIGEgcHJpbmNpcGFsIHRvIHRoZSBsaXN0IG9mIG93bmVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGVyCisgICAgICogICAgICAgICAgICB0aGUgaW52b2tpbmcgcHJpbmNpcGFsLgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgICAgICAgdGhlIG93bmVyIHRvIGFkZGVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvd25lciB3YXMgYWRkZWQsIHtAY29kZSBmYWxzZX0gaWYgaXQgd2FzIGFscmVhZHkgYW4gb3duZXIuCisgICAgICogQHRocm93cyBOb3RPd25lckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnZva2luZyBwcmluY2lwYWwgaXMgbm90IGFuIG93bmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGJvb2xlYW4gYWRkT3duZXIoUHJpbmNpcGFsIGNhbGxlciwgUHJpbmNpcGFsIG93bmVyKSAKICAgICAgICAgICAgICAgICAgdGhyb3dzIE5vdE93bmVyRXhjZXB0aW9uOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmVtb3ZlcyBhIHByaW5jaXBhbCBmcm9tIHRoZSBsaXN0IG9mIG93bmVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGVyCisgICAgICogICAgICAgICAgICB0aGUgaW52b2tpbmcgcHJpbmNpcGFsLgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgICAgICAgdGhlIG93bmVyIHRvIGJlIHJlbW92ZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG93bmVyIHdhcyByZW1vdmVkLCB7QGNvZGUgZmFsc2V9IGlmIGl0IHdhcyBub3QgYW4gb3duZXIuCisgICAgICogQHRocm93cyBOb3RPd25lckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnZva2luZyBwcmluY2lwYWwgaXMgbm90IGFuIG93bmVyLgorICAgICAqIEB0aHJvd3MgTGFzdE93bmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG93bmVyIHRvIGJlIHJlbW92ZWQgaXMgdGhlIGxhc3Qgb3duZXIgYW5kIGhlbmNlIHJlbW92aW5nIGl0CisgICAgICogICAgICAgICAgICAgd291bGQgbWFrZSB0aGlzIG9iamVjdCBvd25lci1sZXNzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIGJvb2xlYW4gZGVsZXRlT3duZXIoUHJpbmNpcGFsIGNhbGxlciwgUHJpbmNpcGFsIG93bmVyKSAKICAgICAgICAgICAgICAgICB0aHJvd3MgTm90T3duZXJFeGNlcHRpb24sIExhc3RPd25lckV4Y2VwdGlvbjsKICAgICAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcHJpbmNpcGFsIGlzIGFuIG93bmVyIG9mIHRoaXMgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgICAgICAgdGhlIHByaW5jaXBhbCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIHByaW5jaXBhbCBpcyBhbiBvd25lciwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBpc093bmVyKFByaW5jaXBhbCBvd25lcik7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL1Blcm1pc3Npb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvUGVybWlzc2lvbi5qYXZhCmluZGV4IGE5NjE3YmYuLjBkNmUyMmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvUGVybWlzc2lvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9hY2wvUGVybWlzc2lvbi5qYXZhCkBAIC0xNSwyOCArMTUsMzYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGVrc2VpIFkuIFNlbWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmFjbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSBwZXJtaXNzaW9uLgorICogPHA+CisgKiBJdCBjYW4gYmUgZ3JhbnRlZCBvciBkZW5pZWQgdG8gYSB7QGxpbmsgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgUHJpbmNpcGFsfSAKKyAqIHVzaW5nIGFuIHtAbGluayBBY2x9LiAKKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGludGVyZmFjZSBQZXJtaXNzaW9uIHsKIAogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgZXF1YWxzIHRoaXMgcGVybWlzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgdGhlIHBlcm1pc3Npb24gb2JqZWN0IHRvIGNvbXBhcmUgdG8gdGhpcyBwZXJtaXNzaW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMsIGZhbHNlCisgICAgICogICAgICAgICBpZiBub3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFub3RoZXIpOwogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGVybWlzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwZXJtaXNzaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIFN0cmluZyB0b1N0cmluZygpOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2FjbC9wYWNrYWdlLmh0bWwgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL3BhY2thZ2UuaHRtbAppbmRleCA5ZDIzY2Y5Li4zMTAyZmMyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL3BhY2thZ2UuaHRtbAorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvYWNsL3BhY2thZ2UuaHRtbApAQCAtNSwxMCArNSwxMSBAQAogPGh0bWw+CiA8Ym9keT4KIDxwPgotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFsbCB0aGUgY2xhc3NlcyBhbmQgYWxsIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBidWlsZCBBY2Nlc3MgQ29udHJvbCBMaXN0LgotRnVuY3Rpb25hbGl0eSBmb3IgZ2VuZXJhdGluZyBuZXcgZW50cmllcyBpbiBhbiBBQ0wge0BsaW5rIGphdmEuc2VjdXJpdHkuYWNsLkFjbEVudHJ5fTsKLWZvciB0aGUgY3JlYXRpb24gb2YgbmV3IG93bmVyIHtAbGluayBqYXZhLnNlY3VyaXR5LmFjbC5Pd25lcn0gYW5kIGZvciB0aGUgcmVnaXN0cmF0aW9uIG9mCitUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNsYXNzZXMgYW5kIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBidWlsZCBBY2Nlc3MgQ29udHJvbCBMaXN0cy4KK0Z1bmN0aW9uYWxpdHkgZm9yIGdlbmVyYXRpbmcgbmV3IGVudHJpZXMgaW4gYW4gQUNMIHtAbGluayBqYXZhLnNlY3VyaXR5LmFjbC5BY2xFbnRyeX0sCitmb3IgdGhlIGNyZWF0aW9uIG9mIG5ldyBvd25lcnMge0BsaW5rIGphdmEuc2VjdXJpdHkuYWNsLk93bmVyfSwgYW5kIGZvciB0aGUgcmVnaXN0cmF0aW9uIG9mCiBuZXcgcGVybWlzc2lvbnMge0BsaW5rIGphdmEuc2VjdXJpdHkuYWNsLlBlcm1pc3Npb259IGFyZSBwcm92aWRlZC4KIDwvcD4KK0BzaW5jZSBBbmRyb2lkIDEuMAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ1JMLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkwuamF2YQppbmRleCA3NGMwYmY1Li5iMGYzZTMwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkwuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkwuamF2YQpAQCAtMTUsMjUgKzE1LDI2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIC8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdHMgKENSTHMpLiBUaGV5IGFyZSB1c2VkIHRvCi0gKiBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gQ2VydGlmaWNhdGUgaGFzIGV4cGlyZWQgYWxyZWFkeS4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3RzIChDUkxzKSBtYWludGFpbmVkIGJ5IGEKKyAqIGNlcnRpZmljYXRlIGF1dGhvcml0eS4gVGhleSBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gQ2VydGlmaWNhdGUgaGFzCisgKiBleHBpcmVkIGFuZCBjb25zZXF1ZW50bHkgaGFzIGJlY29tZSBpbnZhbGlkLgogICogCiAgKiBAc2VlIENlcnRpZmljYXRlRmFjdG9yeQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDUkwgewogICAgIC8vIFRoZSBDUkwgdHlwZQogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGU7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcgY2VydGlmaWNhdGUgcmV2b2NhdGlvbiBsaXN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgZm9yIHRoZSBDUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENSTChTdHJpbmcgdHlwZSkgewogICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwpAQCAtNDIsMjggKzQzLDI5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIENSTC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgdHlwZSBvZiB0aGlzIENSTC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgQ1JMLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiBhIGdpdmVuIENlcnRpZmljYXRlIGhhcyBiZWVuIHJldm9rZWQgb3Igbm90LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlIGlzIHJldm9rZWQgYnkgdGhpcyBDUkwuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNlcnQKLSAgICAgKiAgICAgICAgICAgIENlcnRpZmljYXRlIFRoZSBDZXJ0aWZpY2F0ZSB0byB0ZXN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiByZXZva2VkIGZhbHNlIGlmIHRoZSBjZXJ0aWZpY2F0ZQotICAgICAqICAgICAgICAgaGFzIG5vdCBiZWVuIHJldm9rZWQgeWV0CisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNlcnRpZmljYXRlIGlzIHJldm9rZWQgYnkgdGhpcyBDUkwsIG90aGVyd2lzZQorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Jldm9rZWQoQ2VydGlmaWNhdGUgY2VydCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcmVjZWl2ZXIuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb24uamF2YQppbmRleCBlOGNhOWNiLi42MjVkN2QzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb24uamF2YQpAQCAtMjUsNDIgKzI1LDUyIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYgZXJyb3JzIG9jY3VyIGR1cmluZyBoYW5kbGluZyBvZiB7QGNvZGUgQ1JMfXMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ1JMRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY2OTQ3Mjg5NDQwOTQxOTcxNDdMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENSTEV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENSTEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDUkxFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDUkxFeGNlcHRpb24oKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDUkxFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENSTEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENSTEV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ1JMRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkxTZWxlY3Rvci5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ1JMU2VsZWN0b3IuamF2YQppbmRleCBjNmU2MDZlLi5lZTJkMzllIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DUkxTZWxlY3Rvci5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NSTFNlbGVjdG9yLmphdmEKQEAgLTE1LDI2ICsxNSwzOSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIENSTCBtZWV0cyBzb21lIGNyaXRlcmlhCisgKiB0byBzZWxlY3QgQ1JMIG9iamVjdHMgYW1vbmcgYSBzZXQgb2Yge0Bjb2RlIENSTH1zLgorICogPHA+CisgKiBUaGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBkZWZpbmUgdGhlCisgKiBjcml0ZXJpYSBmb3Igc2VsZWN0aW5nIHtAY29kZSBDUkx9cyBmcm9tIGEge0Bjb2RlIENlcnRTdG9yZX0uCisgKiA8L3A+CiAgKiAKKyAqIEBzZWUgQ2VydFN0b3JlCisgKiBAc2VlIENSTAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ1JMU2VsZWN0b3IgZXh0ZW5kcyBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDbG9uZXMgdGhpcyB7QGNvZGUgQ1JMU2VsZWN0b3J9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBkZWZpbmVkIGNyaXRlcmlhIG9mIHRoaXMgaW5zdGFuY2UgbWF0Y2ggdGhlIHNwZWNpZmllZAorICAgICAqIENSTC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3JsCisgICAgICogICAgICAgICAgICB0aGUgQ1JMIHRvIGJlIGV2YWx1YXRlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgQ1JMIG1hdGNoZXMgdGhlIGNyaXRlcmlhLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goQ1JMIGNybCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGguamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoLmphdmEKaW5kZXggNmRlNWMwOS4uMjg3NGE0ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGguamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aC5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKQEAgLTM1LDQ5ICszMCw1OSBAQAogLyoqCiAgKiBBbiBpbW11dGFibGUgY2VydGlmaWNhdGUgcGF0aCB0aGF0IGNhbiBiZSB2YWxpZGF0ZWQuIEFsbCBjZXJ0aWZpY2F0ZXMgaW4gdGhlCiAgKiBwYXRoIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChpLmUuLCBYNTA5KS4KKyAqIDxwPgorICogQSB7QGNvZGUgQ2VydFBhdGh9IGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIGJ5dGUgYXJyYXkgaW4gYXQgbGVhc3Qgb25lCisgKiBzdXBwb3J0ZWQgZW5jb2Rpbmcgc2NoZW1lIChpLmUuIFBraVBhdGggb3IgUEtDUzcpIHdoZW4gc2VyaWFsaXplZC4KKyAqIDwvcD4KKyAqIDxwPgorICogV2hlbiBhIHtAY29kZSBMaXN0fSBvZiB0aGUgY2VydGlmaWNhdGVzIGlzIG9idGFpbmVkIGl0IG11c3QgYmUgaW1tdXRhYmxlLgorICogPC9wPgorICogPHA+CisgKiBBIHtAY29kZSBDZXJ0UGF0aH0gbXVzdCBiZSB0aHJlYWQtc2FmZSB3aXRob3V0IHJlcXVpcmluZyBjb29yZGluYXRlZCBhY2Nlc3MuCisgKiA8L3A+CiAgKiAKLSAqIEEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIGJ5dGUgYXJyYXkgaW4gYXQgbGVhc3Qgb25lCi0gKiBzdXBwb3J0ZWQgZW5jb2Rpbmcgd2hlbiBzZXJpYWxpemVkLgotICogCi0gKiBXaGVuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlIGNlcnRpZmljYXRlcyBpcyBvYnRhaW5lZCBpdCBtdXN0IGJlCi0gKiBpbW11dGFibGUuCi0gKiAKLSAqIEEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IG11c3QgYmUgdGhyZWFkLXNhZmUgd2l0aG91dCByZXF1aXJpbmcgY29vcmRpbmF0ZWQKLSAqIGFjY2Vzcy4KKyAqIEBzZWUgQ2VydGlmaWNhdGUKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2VydFBhdGggaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MDY4NDcwMzA2NjQ5MTM4NjgzTDsKICAgICAvLyBTdGFuZGFyZCBuYW1lIG9mIHRoZSB0eXBlIG9mIGNlcnRpZmljYXRlcyBpbiB0aGlzIHBhdGgKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0UGF0aH0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUKKyAgICAgKiB0eXBlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgdHlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2VydFBhdGgoU3RyaW5nIHR5cGUpIHsKICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPiBpbiB0aGUKLSAgICAgKiA8Y29kZT5DZXJ0UGF0aDwvY29kZT4KKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHtAY29kZSBDZXJ0aWZpY2F0ZX0gaW4gdGhpcyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPiB0eXBlCisgICAgICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUgdHlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CiAgICAgICAgIHJldHVybiB0eXBlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT5zIGluIHRoZSBsaXN0IGFyZSB0aGUgc2FtZQorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBDZXJ0aWZpY2F0ZX1zIGluIHRoZSBsaXN0IGFyZSB0aGUgc2FtZQogICAgICAqIHR5cGUgYW5kIHRoZSBsaXN0cyBhcmUgZXF1YWwgKGFuZCBieSBpbXBsaWNhdGlvbiB0aGUgY2VydGlmaWNhdGVzCiAgICAgICogY29udGFpbmVkIHdpdGhpbiBhcmUgdGhlIHNhbWUpLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvdGhlcgotICAgICAqICAgICAgICAgICAgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IHRvIGJlIGNvbXBhcmVkIGZvciBlcXVhbGl0eQorICAgICAqICAgICAgICAgICAge0Bjb2RlIENlcnRQYXRofSB0byBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9iamVjdCBhcmUgZXF1YWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKICAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTQsMTEgKzk5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3ZlcnJpZGVzIE9iamVjdC5oYXNoQ29kZSgpIERlZmluZWQgYXM6IGhhc2hDb2RlID0gMzEgKgotICAgICAqIHBhdGguZ2V0VHlwZSgpLmhhc2hDb2RlKCkgKyBwYXRoLmdldENlcnRpZmljYXRlcygpLmhhc2hDb2RlKCk7CisgICAgICogT3ZlcnJpZGVzIHtAY29kZSBPYmplY3QuaGFzaENvZGUoKX0uIFRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6IDxicj4KKyAgICAgKiB7QGNvZGUgaGFzaENvZGUgPSAzMSAqIHBhdGguZ2V0VHlwZSgpLmhhc2hDb2RlKCkgKworICAgICAqIHBhdGguZ2V0Q2VydGlmaWNhdGVzKCkuaGFzaENvZGUoKTt9PC9icj4gPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gaGFzaCBjb2RlIGZvciBDZXJ0UGF0aCBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaW50IGhhc2ggPSBnZXRUeXBlKCkuaGFzaENvZGUoKTsKICAgICAgICAgaGFzaCA9IGhhc2gqMzEgKyBnZXRDZXJ0aWZpY2F0ZXMoKS5oYXNoQ29kZSgpOwpAQCAtMTA2LDEzICsxMTQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICAgKiA8Y29kZT5DZXJ0UGF0aDwvY29kZT4KLSAgICAgKiA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT5zLiBJdCBpcyB0aGUgcmVzdWx0IG9mCi0gICAgICogY2FsbGluZyA8Y29kZT50b1N0cmluZzwvY29kZT4gb24gYWxsIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPnMgaW4KLSAgICAgKiB0aGUgPGNvZGU+TGlzdDwvY29kZT4uIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPnMKKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgQ2VydFBhdGh9CisgICAgICogaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgPGNvZGU+Q2VydFBhdGg8L2NvZGU+CisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VHlwZSgpKTsKQEAgLTEyMCw1OCArMTI2LDY4IEBACiAgICAgICAgIHNiLmFwcGVuZChnZXRDZXJ0aWZpY2F0ZXMoKS5zaXplKCkpOwogICAgICAgICBzYi5hcHBlbmQoIjogW1xuIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgaW50IG49MTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpPWdldENlcnRpZmljYXRlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBDZXJ0aWZpY2F0ZT4gaT1nZXRDZXJ0aWZpY2F0ZXMoKS5pdGVyYXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpOyBuKyspIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tY2VydGlmaWNhdGUgIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIHNiLmFwcGVuZChuKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tXG4iKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgc2IuYXBwZW5kKCgoQ2VydGlmaWNhdGUpaS5uZXh0KCkpLnRvU3RyaW5nKCkpOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgc2IuYXBwZW5kKCJcbl0iKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBMaXN0IG9mIHRoZSA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT5zIGNvbnRhaW5lZAotICAgICAqIGluIHRoZSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4uCisgICAgICogUmV0dXJucyBhbiBpbW11dGFibGUgTGlzdCBvZiB0aGUge0Bjb2RlIENlcnRpZmljYXRlfXMgY29udGFpbmVkCisgICAgICogaW4gdGhlIHtAY29kZSBDZXJ0UGF0aH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBsaXN0IG9mIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPnMgaW4gdGhlIDxjb2RlPkNlcnRQYXRoPC9jb2RlPgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHtAY29kZSBDZXJ0aWZpY2F0ZX1zIGluIHRoZSB7QGNvZGUgQ2VydFBhdGh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PD8gZXh0ZW5kcyBDZXJ0aWZpY2F0ZT4gZ2V0Q2VydGlmaWNhdGVzKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVuY29kaW5nIG9mIHRoZSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4gdXNpbmcgdGhlIGRlZmF1bHQKLSAgICAgKiBlbmNvZGluZworICAgICAqIFJldHVybnMgYW4gZW5jb2Rpbmcgb2YgdGhlIHtAY29kZSBDZXJ0UGF0aH0gdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBkZWZhdWx0IGVuY29kaW5nIG9mIHRoZSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4KKyAgICAgKiBAcmV0dXJuIGRlZmF1bHQgZW5jb2Rpbmcgb2YgdGhlIHtAY29kZSBDZXJ0UGF0aH0uCiAgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuY29kaW5nIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0RW5jb2RlZCgpCiAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBlbmNvZGluZyBvZiB0aGUgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IHVzaW5nIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBlbmNvZGluZworICAgICAqIFJldHVybnMgYW4gZW5jb2Rpbmcgb2YgdGhlIHtAY29kZSBDZXJ0UGF0aH0gdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIGVuY29kaW5nIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZAotICAgICAqIEByZXR1cm4gZGVmYXVsdCBlbmNvZGluZyBvZiB0aGUgPGNvZGU+Q2VydFBhdGg8L2NvZGU+CisgICAgICogICAgICAgICAgICBlbmNvZGluZyB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQuCisgICAgICogQHJldHVybiBkZWZhdWx0IGVuY29kaW5nIG9mIHRoZSB7QGNvZGUgQ2VydFBhdGh9LgogICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmNvZGluZyBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEVuY29kZWQoU3RyaW5nIGVuY29kaW5nKQogICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybiBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciB0aGUgc3VwcG9ydGVkIGVuY29kaW5ncyBmb3IgYQorICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIEl0ZXJhdG9yfSBvdmVyIHRoZSBzdXBwb3J0ZWQgZW5jb2RpbmdzIGZvciBhCiAgICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIGNlcnRpZmljYXRlIHBhdGguCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciBzdXBwb3J0ZWQgZW5jb2RpbmdzIChhcwotICAgICAqICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPnMpCisgICAgICogQHJldHVybiB7QGNvZGUgSXRlcmF0b3J9IG92ZXIgc3VwcG9ydGVkIGVuY29kaW5ncyAoYXMge0Bjb2RlIFN0cmluZ31zKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3I8U3RyaW5nPiBnZXRFbmNvZGluZ3MoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhbiBhbHRlcm5hdGUgb2JqZWN0IHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBhbiBhbHRlcm5hdGUgb2JqZWN0IHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICogQHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIGFsdGVybmF0ZSBvYmplY3QgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKQEAgLTE4MywxMiArMTk5LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUgYWx0ZXJuYXRlIHtAY29kZSBTZXJpYWxpemFibGV9IGNsYXNzIHRvIGJlIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24gYW5kCisgICAgICogZGVzZXJpYWxpemF0aW9uIG9uIHtAY29kZSBDZXJ0UGF0aH0gb2JqZWN0cy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENlcnRQYXRoUmVwIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICAgICAqLworCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMwMTU2MzMwNzI0Mjc5MjA5MTVMOwogICAgICAgICAvLyBTdGFuZGFyZCBuYW1lIG9mIHRoZSB0eXBlIG9mIGNlcnRpZmljYXRlcyBpbiB0aGlzIHBhdGgKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKQEAgLTIwMyw3ICsyMjAsMTQgQEAKICAgICAgICAgfTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhSZXB9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlCisgICAgICAgICAqIGFuZCBlbmNvZGVkIGRhdGEuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gZGF0YQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIGRhdGEuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIENlcnRQYXRoUmVwKFN0cmluZyB0eXBlLCBieXRlW10gZGF0YSkgewogICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKQEAgLTIxMSw3ICsyMzUsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAgICAgKiBEZXNlcmlhbGl6ZXMgYSB7QGNvZGUgQ2VydFBhdGh9IGZyb20gYSBzZXJpYWxpemVkIHtAY29kZSBDZXJ0UGF0aFJlcH0KKyAgICAgICAgICogb2JqZWN0LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0aGUgZGVzZXJpYWxpemVkIHtAY29kZSBDZXJ0UGF0aH0uCisgICAgICAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXIuamF2YQppbmRleCA0NjljZmNiLi40N2VhYzEzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXIuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwpAQCAtMzQsMTAgKzI5LDExIEBACiAKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEgYnVpbGRlciBmb3IgYW4gdW52ZXJpZmllZAorICogPGk+Q2VydGlmaWNhdGlvbiBQYXRoPC9pPnMgZnJvbSBhIHNwZWNpZmllZCBjZXJ0aWZpY2F0ZSB0byBhIHRydXN0IGFuY2hvci4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIENlcnRQYXRoQnVpbGRlciB7CiAKICAgICAvLyBTdG9yZSBDZXJ0UGF0aEJ1aWxkZXIgc2VydmljZSBuYW1lCkBAIC02Myw3ICs1OSwxNSBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFsZ29yaXRobTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhCdWlsZGVyfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVpbGRlclNwaQorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIGRlbGVnYXRlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIGFsZ29yaXRobSBhdmFpbGFibGUgYXQgdGhlIHByb3ZpZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBDZXJ0UGF0aEJ1aWxkZXIoQ2VydFBhdGhCdWlsZGVyU3BpIGJ1aWxkZXJTcGksIFByb3ZpZGVyIHByb3ZpZGVyLAogICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSkgewpAQCAtNzMsMjQgKzc3LDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGdvcml0aG0gbmFtZSBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFsZ29yaXRobSBuYW1lIG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0UGF0aEJ1aWxkZXJ9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGFsZ29yaXRobS4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYWxnb3JpdGhtIGlzIG51bGwgKGluc3RlYWQgb2YKLSAgICAgKiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAcmV0dXJuIGEgYnVpbGRlciBmb3IgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhbGdvcml0aG0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gaW5zdGFsbGVkIHByb3ZpZGVyIGNhbiBwcm92aWRlIHRoZSBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDZXJ0UGF0aEJ1aWxkZXIgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTA1LDEzICsxMjIsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRQYXRoQnVpbGRlcn0gaW5zdGFuY2UgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogcHJvdmlkZXIgcHJvdmlkaW5nIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbGdvcml0aG0gaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKLSAgICAgKiAKLSAgICAgKiBGSVhNRToganJvY2tpdC1qMnJlMS40LjJfMDQgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyCi0gICAgICogaXMgZW1wdHkKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gYSBidWlsZGVyIGZvciB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gcHJvdmlkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgY2FuIGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbGdvcml0aG0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcHJvdmlkZXIgaXMge0Bjb2RlIG51bGx9IG9yIGVtcHR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2VydFBhdGhCdWlsZGVyIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcikKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKQEAgLTEyNywxMCArMTU0LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0UGF0aEJ1aWxkZXJ9IGluc3RhbmNlIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIHByb3ZpZGVyIHByb3ZpZGluZyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYWxnb3JpdGhtIGlzIG51bGwgKGluc3RlYWQgb2YKLSAgICAgKiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIGEgYnVpbGRlciBmb3IgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHByb3ZpZGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYWxnb3JpdGhtIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENlcnRQYXRoQnVpbGRlciBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTQ4LDcgKzE4NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQnVpbGRzIGEgY2VydGlmaWNhdGlvbiBwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiB0aGUgYnVpbHQgY2VydGlmaWNhdGlvbiBwYXRoLgorICAgICAqIEB0aHJvd3MgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGJ1aWxkIGZhaWxzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCB3aXRoIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBidWlsZGVyLgorICAgICAqIEBzZWUgQ2VydFBhdGhCdWlsZGVyUmVzdWx0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENlcnRQYXRoQnVpbGRlclJlc3VsdCBidWlsZChDZXJ0UGF0aFBhcmFtZXRlcnMgcGFyYW1zKQogICAgICAgICAgICAgdGhyb3dzIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC0xNTYsNyArMjA1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHtAY29kZSBDZXJ0UGF0aEJ1aWxkZXJ9IHR5cGUgZnJvbSB0aGUgPGk+U2VjdXJpdHkKKyAgICAgKiBQcm9wZXJ0aWVzPC9pPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHtAY29kZSBDZXJ0UGF0aEJ1aWxkZXJ9IHR5cGUgZnJvbSB0aGUgPGk+U2VjdXJpdHkKKyAgICAgKiAgICAgICAgIFByb3BlcnRpZXM8L2k+LCBvciB0aGUgc3RyaW5nICJ7QGNvZGUgUEtJWH0iIGlmIGl0IGNhbm5vdCBiZQorICAgICAqICAgICAgICAgZGV0ZXJtaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKICAgICAgICAgU3RyaW5nIGRlZmF1bHRUeXBlID0gQWNjZXNzQ29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24uamF2YQppbmRleCBjMDY0Y2ViLi5iOTU3MjkxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24uamF2YQpAQCAtMTUsNDkgKzE1LDYwIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYSB7QGNvZGUgQ2VydFBhdGhCdWlsZGVyfSBtZXRob2QgZmFpbHMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTMxNjQ3MTQyMDE3ODc5NDQwMkw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UKKyAgICAgKiBhbmQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB3aHkgdGhlIGJ1aWxkaW5nIG9mIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggZmFpbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB3aHkgdGhlIGJ1aWxkaW5nIG9mIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggZmFpbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyUmVzdWx0LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJSZXN1bHQuamF2YQppbmRleCBhOGVmZjEyLi5lNTZjNGEwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJSZXN1bHQuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJSZXN1bHQuamF2YQpAQCAtMTUsMjYgKzE1LDI5IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSBmb3IgcmVzdWx0cyBnZW5lcmF0ZWQgYnkKKyAqIHtAbGluayBDZXJ0UGF0aEJ1aWxkZXIjYnVpbGQoQ2VydFBhdGhQYXJhbWV0ZXJzKX0uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENlcnRQYXRoQnVpbGRlclJlc3VsdCBleHRlbmRzIENsb25lYWJsZSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb25lcyB0aGlzIHtAY29kZSBDZXJ0UGF0aEJ1aWxkZXJSZXN1bHR9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvcHkgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGJ1aWx0IHtAY29kZSBDZXJ0UGF0aH0gaW5zdGFuY2UuIE5ldmVyIHJldHVybnMge0Bjb2RlIG51bGx9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ1aWx0IGNlcnRpZmljYXRlIHBhdGggaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRQYXRoIGdldENlcnRQYXRoKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyU3BpLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJTcGkuamF2YQppbmRleCAwNmFkZjBiLi45NTJmMzg3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJTcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJTcGkuamF2YQpAQCAtMTUsMzAgKzE1LDM5IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIDxpPlNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlPC9pPiAoPGI+U1BJPC9iPikgZm9yIHRoZSB7QGNvZGUKKyAqIENlcnRQYXRoQnVpbGRlcn0gY2xhc3MgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc2VjdXJpdHkgcHJvdmlkZXJzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2VydFBhdGhCdWlsZGVyU3BpIHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhCdWlsZGVyU3BpfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGhCdWlsZGVyU3BpKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQnVpbGRzIGEgY2VydGlmaWNhdGlvbiBwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiBhIHJlc3VsdCBvZiB0aGUgYnVpbGQuCisgICAgICogQHRocm93cyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYnVpbGQgZmFpbHMuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBwYXRoCisgICAgICogICAgICAgICAgICAgd2l0aCB0aGlzIGJ1aWxkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENlcnRQYXRoQnVpbGRlclJlc3VsdCBlbmdpbmVCdWlsZChDZXJ0UGF0aFBhcmFtZXRlcnMgcGFyYW1zKQogICAgICAgICAgICAgdGhyb3dzIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFBhcmFtZXRlcnMuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoUGFyYW1ldGVycy5qYXZhCmluZGV4IGQ2ZGQzMzAuLmM5OTgyNmYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoUGFyYW1ldGVycy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoUGFyYW1ldGVycy5qYXZhCkBAIC0xNSwyMSArMTUsMjMgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKKyAqIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgY2VydGlmaWNhdGlvbiBwYXRoIGFsZ29yaXRobSBwYXJhbWV0ZXJzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgZ3JvdXBpbmcgcHVycG9zZXMgb2Yge0Bjb2RlIENlcnRQYXRofSBwYXJhbWV0ZXIKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENlcnRQYXRoUGFyYW1ldGVycyBleHRlbmRzIENsb25lYWJsZSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb25lcyB0aGlzIHtAY29kZSBDZXJ0UGF0aFBhcmFtZXRlcnN9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3IuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yLmphdmEKaW5kZXggNjgzYzk2OC4uZjk1YmQwMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3IuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvci5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CkBAIC0zNCwxMCArMjksMTIgQEAKIAogCiAvKioKLSAqIDwhLS0gQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgLS0+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmdW5jdGlvbmFsaXR5IGZvciB2YWxpZGF0aW5nIGNlcnRpZmljYXRpb24gcGF0aHMKKyAqIChjZXJ0aWZpY2F0ZSBjaGFpbnMpIGVzdGFibGlzaGluZyBhIHRydXN0IGNoYWluIGZyb20gYSBjZXJ0aWZpY2F0ZSB0byBhIHRydXN0CisgKiBhbmNob3IuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBDZXJ0UGF0aFZhbGlkYXRvciB7CiAgICAgLy8gU3RvcmUgQ2VydFBhdGhWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gc2VydmljZSBuYW1lCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAiQ2VydFBhdGhWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCkBAIC02Miw4ICs1OSwxNSBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFsZ29yaXRobTsKIAogICAgIC8qKgotICAgICAqIDwhLS0gQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgLS0+Ci0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRQYXRoVmFsaWRhdG9yfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsaWRhdG9yU3BpCisgICAgICogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gZGVsZWdhdGUuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgc2VjdXJpdHkgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2VydFBhdGhWYWxpZGF0b3IoQ2VydFBhdGhWYWxpZGF0b3JTcGkgdmFsaWRhdG9yU3BpLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyBhbGdvcml0aG0pIHsKQEAgLTczLDI1ICs3NywzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDwhLS0gQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYgLS0+Ci0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRpb24gcGF0aCBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggYWxnb3JpdGhtIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBhbGdvcml0aG07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPCEtLSBAY29tLmludGVsLmRybC5zcGVjX3JlZiAtLT4KLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgc2VjdXJpdHkgcHJvdmlkZXIuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPCEtLSBAY29tLmludGVsLmRybC5zcGVjX3JlZiAtLT4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGNlcnRpZmljYXRpb24gcGF0aCB2YWxpZGF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbGdvcml0aG0gaXMgbnVsbAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiBAcmV0dXJuIGEgY2VydGlmaWNhdGlvbiBwYXRoIHZhbGlkYXRvciBmb3IgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBpbnN0YWxsZWQgcHJvdmlkZXIgcHJvdmlkZXMgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFsZ29yaXRobSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDZXJ0UGF0aFZhbGlkYXRvciBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC0xMDYsOSArMTIxLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPCEtLSBAY29tLmludGVsLmRybC5zcGVjX3JlZiAtLT4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGNlcnRpZmljYXRpb24gcGF0aCB2YWxpZGF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtCisgICAgICogZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbGdvcml0aG0gaXMgbnVsbAorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWN1cml0eSBwcm92aWRlciBuYW1lLgorICAgICAqIEByZXR1cm4gYSBjZXJ0aWZpY2F0aW9uIHBhdGggdmFsaWRhdG9yIGZvciB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgc2VjdXJpdHkgcHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgdGhlCisgICAgICogICAgICAgICAgICAgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gcHJvdmlkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgY2FuIGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbGdvcml0aG0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcHJvdmlkZXIgaXMge0Bjb2RlIG51bGx9IG9yIGVtcHR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2VydFBhdGhWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKQEAgLTEyNCw5ICsxNTQsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8IS0tIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIC0tPgorICAgICAqIFJldHVybnMgYSBuZXcgY2VydGlmaWNhdGlvbiBwYXRoIHZhbGlkYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0KKyAgICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFsZ29yaXRobSBpcyBudWxsCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNlY3VyaXR5IHByb3ZpZGVyIG5hbWUuCisgICAgICogQHJldHVybiBhIGNlcnRpZmljYXRpb24gcGF0aCB2YWxpZGF0b3IgZm9yIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcHJvdmlkZXIgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbGdvcml0aG0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2VydFBhdGhWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTE0NCw4ICsxODcsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8IS0tIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIC0tPgorICAgICAqIFZhbGlkYXRlcyB0aGUge0Bjb2RlIENlcnRQYXRofSB3aXRoIHRoZSBhbGdvcml0aG0gb2YgdGhpcyB7QGNvZGUKKyAgICAgKiBDZXJ0UGF0aFZhbGlkYXRvcn0gdXNpbmcgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gcGFyYW1ldGVycy4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydFBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggdG8gYmUgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggdmFsaWRhdG9yIGFsZ29yaXRobSBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gdGhlIHZhbGlkYXRpb24gcmVzdWx0LgorICAgICAqIEB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscywgb3IgdGhlIGFsZ29yaXRobSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgY2VydGlmaWNhdGlvbiBwYXRoIGNhbm5vdCBiZSB2YWxpZGF0ZWQgdXNpbmcgdGhlIGFsZ29yaXRobSBvZgorICAgICAqICAgICAgICAgICAgIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gcGFyYW1ldGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgICAgICogICAgICAgICAgICAgdGhpcyBhbGdvcml0aG0uCisgICAgICogQHNlZSBDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCB2YWxpZGF0ZShDZXJ0UGF0aCBjZXJ0UGF0aCwKICAgICAgICAgICAgIENlcnRQYXRoUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiwKQEAgLTE1NCw4ICsyMTIsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8IS0tIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIC0tPgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHtAY29kZSBDZXJ0UGF0aFZhbGlkYXRvcn0gdHlwZSBmcm9tIHRoZSA8aT5TZWN1cml0eQorICAgICAqIFByb3BlcnRpZXM8L2k+LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQge0Bjb2RlIENlcnRQYXRoVmFsaWRhdG9yfSB0eXBlIGZyb20gdGhlIDxpPlNlY3VyaXR5CisgICAgICogICAgICAgICBQcm9wZXJ0aWVzPC9pPiwgb3IgdGhlIHN0cmluZyB7QGNvZGUgIlBLSVgifSBpZiBpdCBjYW5ub3QgYmUKKyAgICAgKiAgICAgICAgIGRldGVybWluZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7CiAgICAgICAgIFN0cmluZyBkZWZhdWx0VHlwZSA9IEFjY2Vzc0NvbnRyb2xsZXIKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCmluZGV4IDE4MzQzYTYuLjA3Mjc4NWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24uamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CkBAIC0yNywzMyArMjIsNTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYSBjZXJ0aWZpY2F0aW9uIHBhdGggKG9yIGNlcnRpZmljYXRlIGNoYWluKQorICogY2Fubm90IGJlIHZhbGlkYXRlZC4KKyAqIDxwPgorICogQSB7QGNvZGUgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb259IG1heSBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIGNlcnRpZmljYXRpb24KKyAqIHBhdGggaW5zdGFuY2UgdGhhdCBmYWlsZWQgdGhlIHZhbGlkYXRpb24gYW5kIHRoZSBpbmRleCBvZiB0aGUgZmFpbGVkCisgKiBjZXJ0aWZpY2F0ZS4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiBleHRlbmRzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMDgzMTgwMDE0OTcxODkzMTM5TDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogCi0gICAgICogU2VyaWFsaXplZCBmaWVsZCBmb3Igc3RvcmluZyBjZXJ0UGF0aCB3aGljaCBpcyBkZWZpbmVkIGluIGNvbnN0cnVjdG9yCi0gICAgICogQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24obXNnLCBjYXVzZSwgY2VydFBhdGgsIGluZGV4KQorICAgICAqIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGguCiAgICAgICovCiAgICAgcHJpdmF0ZSBDZXJ0UGF0aCBjZXJ0UGF0aDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogCi0gICAgICogU2VyaWFsaXplZCBmaWVsZCBmb3Igc3RvcmluZyBpbmRleCB3aGljaCBpcyBkZWZpbmVkIGluIGNvbnN0cnVjdG9yCi0gICAgICogQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24obXNnLCBjYXVzZSwgY2VydFBhdGgsIGluZGV4KQorICAgICAqIHRoZSBpbmRleCBvZiB0aGUgY2VydGlmaWNhdGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UgLCBjYXVzZSwgY2VydGlmaWNhdGlvbiBwYXRoIGFuZCBjZXJ0aWZpY2F0ZSBpbmRleCBpbiB0aGUKKyAgICAgKiBjZXJ0aWZpY2F0aW9uIHBhdGguCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZS4KKyAgICAgKiBAcGFyYW0gY2VydFBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggdGhhdCBmYWlsZWQgdGhlIHZhbGlkYXRpb24uCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZhaWxlZCBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjZXJ0UGF0aH0gaXMge0Bjb2RlIG51bGx9IGFuZCBpbmRleCBpcyBub3Qge0Bjb2RlCisgICAgICogICAgICAgICAgICAgLTF9LgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjZXJ0UGF0aH0gaXMgbm90IHtAY29kZSBudWxsfSBhbmQgaW5kZXggaXMgbm90CisgICAgICogICAgICAgICAgICAgcmVmZXJlbmNpbmcgYW4gY2VydGlmaWNhdGUgaW4gdGhlIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlLAogICAgICAgICAgICAgQ2VydFBhdGggY2VydFBhdGgsIGludCBpbmRleCkgewpAQCAtNzIsNDEgKzg0LDY4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWVzc2FnZSBhbmQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSB3aHkgdGhlIHBhdGggY291bGQgbm90IGJlIHZhbGlkYXRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlIHdoeSB0aGUgcGF0aCBjb3VsZCBub3QgYmUgdmFsaWRhdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIoY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRpb24gcGF0aCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRpb24gcGF0aCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIG5vbmUgd2FzIHNwZWNpZmllZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGggZ2V0Q2VydFBhdGgoKSB7CiAgICAgICAgIHJldHVybiBjZXJ0UGF0aDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmYWlsZWQgY2VydGlmaWNhdGUgaW4gdGhlIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmFpbGVkIGNlcnRpZmljYXRlIGluIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGgsIG9yCisgICAgICogICAgICAgICB7QGNvZGUgLTF9IGlmIG5vbmUgd2FzIHNwZWNpZmllZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgewogICAgICAgICByZXR1cm4gaW5kZXg7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclJlc3VsdC5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQuamF2YQppbmRleCBmZmJmMzUzLi40MjU0MGU0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclJlc3VsdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yUmVzdWx0LmphdmEKQEAgLTE1LDIxICsxNSwyMiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAqIAorICogVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvciBjZXJ0aWZpY2F0aW9uIHBhdGggdmFsaWRhdGlvbiByZXN1bHRzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgZ3JvdXBpbmcgcHVycG9zZXMgb2YgdmFsaWRhdGlvbiByZXN1bHQgaW1wbGVtZW50YXRpb25zLgorICogPC9wPgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQgZXh0ZW5kcyBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDbG9uZXMgdGhpcyB7QGNvZGUgQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHR9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JTcGkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yU3BpLmphdmEKaW5kZXggYWJjZmFlZC4uNTU3MzY3OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JTcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclNwaS5qYXZhCkBAIC0xNSwzMCArMTUsNDMgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgPGk+U2VydmljZSBQcm92aWRlciBJbnRlcmZhY2U8L2k+ICg8Yj5TUEk8L2I+KSBmb3IgdGhlIHtAY29kZQorICogQ2VydFBhdGhWYWxpZGF0b3J9IGNsYXNzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IHByb3ZpZGVycy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGFic3RyYWN0IGNsYXNzIENlcnRQYXRoVmFsaWRhdG9yU3BpIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhWYWxpZGF0b3JTcGl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aFZhbGlkYXRvclNwaSgpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFZhbGlkYXRlcyB0aGUge0Bjb2RlIENlcnRQYXRofSB3aXRoIHRoZSBhbGdvcml0aG0gb2YgdGhpcyB7QGNvZGUKKyAgICAgKiBDZXJ0UGF0aFZhbGlkYXRvcn0gdXNpbmcgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydFBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggdG8gYmUgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggdmFsaWRhdG9yIGFsZ29yaXRobSBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gdGhlIHZhbGlkYXRpb24gcmVzdWx0LgorICAgICAqIEB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscywgb3IgdGhlIGFsZ29yaXRobSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgY2VydGlmaWNhdGlvbiBwYXRoIGNhbm5vdCBiZSB2YWxpZGF0ZWQgdXNpbmcgdGhlIGFsZ29yaXRobSBvZgorICAgICAqICAgICAgICAgICAgIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gcGFyYW1ldGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgICAgICogICAgICAgICAgICAgdGhpcyBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IGVuZ2luZVZhbGlkYXRlKENlcnRQYXRoIGNlcnRQYXRoLAogICAgICAgICAgICAgQ2VydFBhdGhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFNlbGVjdG9yLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U2VsZWN0b3IuamF2YQppbmRleCBjYjBiOWVjLi4wMzE2YWQzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U2VsZWN0b3IuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U2VsZWN0b3IuamF2YQpAQCAtMjMsMTggKzIzLDM2IEBACiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEge0Bjb2RlCisgKiBDZXJ0aWZpY2F0ZX0gbWVldHMgc29tZSBjcml0ZXJpYS4KKyAqIDxwPgorICogVGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gZGVmaW5lIHRoZQorICogY3JpdGVyaWEgZm9yIHNlbGVjdGluZyB7QGNvZGUgQ2VydGlmaWNhdGV9cyBmcm9tIGEge0Bjb2RlIENlcnRTdG9yZX0uCisgKiA8L3A+CiAgKiAKKyAqIEBzZWUgQ2VydFN0b3JlCisgKiBAc2VlIENlcnRpZmljYXRlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDZXJ0U2VsZWN0b3IgZXh0ZW5kcyBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDbG9uZXMgdGhpcyB7QGNvZGUgQ2VydFNlbGVjdG9yfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZGVmaW5lZCBjcml0ZXJpYSBvZiB0aGlzIGluc3RhbmNlIG1hdGNoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjZXJ0aWZpY2F0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydAorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHRvIGJlIGV2YWx1YXRlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2VydGlmaWNhdGUgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChDZXJ0aWZpY2F0ZSBjZXJ0KTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmUuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZS5qYXZhCmluZGV4IDI0YjhiMWEuLmE1YzgyNjAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CkBAIC0zNSwxMCArMzAsMTIgQEAKIAogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIHJldHJpZXZlIHtAY29kZSBDZXJ0aWZpY2F0ZX1zIGFuZAorICoge0Bjb2RlIENSTH1zIGZyb20gYSByZWFkLW9ubHkgcmVwb3NpdG9yeS4gVGhpcyByZXBvc2l0b3J5IG1heSBiZSB2ZXJ5IGxhcmdlCisgKiBhbmQgbWF5IHN0b3JlIHRydXN0ZWQgYXMgd2VsbCBhcyB1bnRydXN0ZWQgY2VydGlmaWNhdGVzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgY2xhc3MgQ2VydFN0b3JlIHsKIAogICAgIC8vIFN0b3JlIHNwaSBpbXBsZW1lbnRhdGlvbiBzZXJ2aWNlIG5hbWUKQEAgLTY3LDcgKzY0LDE3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDZXJ0U3RvcmVQYXJhbWV0ZXJzIGNlcnRTdG9yZVBhcmFtczsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFN0b3JlfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RvcmVTcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWN1cml0eSBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHN0b3JlIHR5cGUuCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHN0b3JlIHBhcmFtZXRlcnMgKG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENlcnRTdG9yZShDZXJ0U3RvcmVTcGkgc3RvcmVTcGksIFByb3ZpZGVyIHByb3ZpZGVyLCBTdHJpbmcgdHlwZSwKICAgICAgICAgICAgIENlcnRTdG9yZVBhcmFtZXRlcnMgcGFyYW1zKSB7CkBAIC03OCwxMCArODUsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRTdG9yZX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kCisgICAgICogaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHN0b3JlIHR5cGUuCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHN0b3JlIHBhcmFtZXRlcnMgKG1heSBiZSB7QGNvZGUgbnVsbH0pLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBjZXJ0aWZpY2F0ZSBzdG9yZSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIHByb3ZpZGVyIGNhbiBwcm92aWRlIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgc3RvcmUKKyAgICAgKiAgICAgICAgICAgICB0eXBlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBjYW5ub3QgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSBzdG9yZSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHtAY29kZSB0eXBlfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDZXJ0U3RvcmUgZ2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsIENlcnRTdG9yZVBhcmFtZXRlcnMgcGFyYW1zKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC0xMDUsMTIgKzEyNSwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFN0b3JlfSBpbnN0YW5jZSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKLSAgICAgKiAKLSAgICAgKiBGSVhNRTogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgZW1wdHkKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHN0b3JlIHR5cGUuCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHN0b3JlIHBhcmFtZXRlcnMgKG1heSBiZSB7QGNvZGUgbnVsbH0pLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBjZXJ0aWZpY2F0ZSBzdG9yZSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgdGhlIHJlcXVlc3RlZAorICAgICAqICAgICAgICAgICAgIGNlcnRpZmljYXRlIHN0b3JlIHR5cGUuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIHByb3ZpZGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGNhbiBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogICAgICAgICAgICAgY2VydGlmaWNhdGUgc3RvcmUgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBwcm92aWRlciBpcyBudWxsIG9mIGVtcHR5LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdHlwZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2VydFN0b3JlIGdldEluc3RhbmNlKFN0cmluZyB0eXBlLAogICAgICAgICAgICAgQ2VydFN0b3JlUGFyYW1ldGVycyBwYXJhbXMsIFN0cmluZyBwcm92aWRlcikKQEAgLTEyNywxMCArMTY0LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRTdG9yZX0gaW5zdGFuY2UgZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGluaXRpYWxpemVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgc3RvcmUgdHlwZS4KKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgc3RvcmUgcGFyYW1ldGVycyAobWF5IGJlIHtAY29kZSBudWxsfSkuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXIuCisgICAgICogQHJldHVybiB0aGUgbmV3IGNlcnRpZmljYXRlIHN0b3JlIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgY2VydGlmaWNhdGUgc3RvcmUgdHlwZS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCisgICAgICogICAgICAgICAgICAgY2VydGlmaWNhdGUgc3RvcmUgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBwcm92aWRlciBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0eXBlfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDZXJ0U3RvcmUgZ2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsCiAgICAgICAgICAgICBDZXJ0U3RvcmVQYXJhbWV0ZXJzIHBhcmFtcywgUHJvdmlkZXIgcHJvdmlkZXIpCkBAIC0xNTgsMjEgKzIxMSwzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgc3RvcmUgdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZSB0eXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBzZWN1cml0eSBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzZWN1cml0eSBwcm92aWRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZSBwYXJhbWV0ZXJzIHRoYXQgd2VyZSB1c2VkIHRvCisgICAgICogaW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZSBwYXJhbWV0ZXJzIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgbm9uZSB3ZXJlIHNwZWNpZmllZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2VydFN0b3JlUGFyYW1ldGVycyBnZXRDZXJ0U3RvcmVQYXJhbWV0ZXJzKCkgewogICAgICAgICBpZiAoY2VydFN0b3JlUGFyYW1zID09IG51bGwpIHsKQEAgLTE4Myw3ICsyNDcsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Yge0Bjb2RlIENlcnRpZmljYXRlfXMgZm9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogQ2VydFNlbGVjdG9yfSBmcm9tIHRoaXMgY2VydGlmaWNhdGUgc3RvcmUuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgc2VsZWN0b3IgY29udGFpbmluZyB0aGUgY3JpdGVyaWEgdG8gc2VhcmNoIGZvcgorICAgICAqICAgICAgICAgICAgY2VydGlmaWNhdGVzIGluIHRoaXMgY2VydGlmaWNhdGUgc3RvcmUuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB7QGNvZGUgQ2VydGlmaWNhdGV9cyB0aGF0IG1hdGNoIHRoZSBjcml0ZXJpYSBvZiB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBzZWxlY3Rvci4KKyAgICAgKiBAdGhyb3dzIENlcnRTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9yKHMpIG9jY3VyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDZXJ0aWZpY2F0ZT4gZ2V0Q2VydGlmaWNhdGVzKENlcnRTZWxlY3RvciBzZWxlY3RvcikKICAgICAgICAgICAgIHRocm93cyBDZXJ0U3RvcmVFeGNlcHRpb24gewpAQCAtMTkxLDcgKzI2NSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB7QGNvZGUgQ1JMfXMgZm9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlIENSTFNlbGVjdG9yfQorICAgICAqIGZyb20gdGhpcyBjZXJ0aWZpY2F0ZSBzdG9yZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWxlY3RvciBjb250YWluaW5nIHRoZSBjcml0ZXJpYSB0byBzZWFyY2ggZm9yIGNlcnRpZmljYXRlCisgICAgICogICAgICAgICAgICByZXZvY2F0aW9uIGxpc3RzIGluIHRoaXMgc3RvcmUuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB7QGNvZGUgQ1JMfXMgdGhhdCBtYXRjaCB0aGUgY3JpdGVyaWEgb2YgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgc2VsZWN0b3IKKyAgICAgKiBAdGhyb3dzIENlcnRTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9yKHMpIG9jY3VyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDUkw+IGdldENSTHMoQ1JMU2VsZWN0b3Igc2VsZWN0b3IpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydFN0b3JlRXhjZXB0aW9uIHsKQEAgLTE5OSw4ICsyODMsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLworICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQge0Bjb2RlIENlcnRTdG9yZX0gdHlwZSBmcm9tIHRoZSA8aT5TZWN1cml0eQorICAgICAqIFByb3BlcnRpZXM8L2k+LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQge0Bjb2RlIENlcnRTdG9yZX0gdHlwZSBmcm9tIHRoZSA8aT5TZWN1cml0eQorICAgICAqICAgICAgICAgUHJvcGVydGllczwvaT4sIG9yIHRoZSBzdHJpbmcge0Bjb2RlICJMREFQIn0gaWYgaXQgY2Fubm90IGJlCisgICAgICogICAgICAgICBkZXRlcm1pbmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgICAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKICAgICAgICAgU3RyaW5nIGRlZmF1bHRUeXBlID0gQWNjZXNzQ29udHJvbGxlcgogICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVFeGNlcHRpb24uamF2YQppbmRleCBlOGYxNGMzLi44MzUxNjA1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVFeGNlcHRpb24uamF2YQpAQCAtMTUsNDggKzE1LDU5IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gYWNjZXNzIHRvIGEge0Bjb2RlIENlcnRTdG9yZX0gZmFpbHMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2VydFN0b3JlRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjM5NTI5NjEwNzQ3MTU3MzI0NUw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRTdG9yZUV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYW5kCisgICAgICogY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSB3aHkgdGhlIGFjY2VzcyB0byB0aGUgY2VydGlmaWNhdGUgc3RvcmUgZmFpbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0U3RvcmVFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFN0b3JlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2Ugd2h5IHRoZSBhY2Nlc3MgdG8gdGhlIGNlcnRpZmljYXRlIHN0b3JlIGZhaWxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFN0b3JlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0U3RvcmVFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRTdG9yZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0U3RvcmVFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0U3RvcmVFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlUGFyYW1ldGVycy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlUGFyYW1ldGVycy5qYXZhCmluZGV4IDM0ODYwYjIuLjU2NmIyZTIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZVBhcmFtZXRlcnMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVQYXJhbWV0ZXJzLmphdmEKQEAgLTE1LDIxICsxNSwyMSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBtYXJrZXIgaW50ZXJmYWNlIHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlcnMgdXNlZCB0byBpbml0aWFsaXplIGEge0Bjb2RlCisgKiBDZXJ0U3RvcmV9IGluc3RhbmNlLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDZXJ0U3RvcmVQYXJhbWV0ZXJzIGV4dGVuZHMgQ2xvbmVhYmxlIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ2xvbmVzIHRoaXMge0Bjb2RlIENlcnRTdG9yZVBhcmFtZXRlcnN9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlU3BpLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVTcGkuamF2YQppbmRleCBjMTExOWQ3Li5iZTY4MGE3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVTcGkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVTcGkuamF2YQpAQCAtMTUsNDMgKzE1LDYxIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIDxpPlNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlPC9pPiAoPGI+U1BJPC9iPikgZGVmaW5pdGlvbiBmb3IgdGhlIHtAY29kZQorICogQ2VydFN0b3JlfSBjbGFzcyB0byBiZSBpbXBsZW1lbnRlZCBieSBzZWN1cml0eSBwcm92aWRlcnMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDZXJ0U3RvcmVTcGkgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0U3RvcmVTcGl9LgogICAgICAqIAotICAgICAqIFBhcmFtZXRlciAncGFyYW1zJyBpcyB1bnVzYWJsZSBidXQgcmVxdWlyZWQgYnkgdGhlIHNwZWMKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgY2Fubm90IGJlIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgICBpbml0aWFsaXplIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRTdG9yZVNwaShDZXJ0U3RvcmVQYXJhbWV0ZXJzIHBhcmFtcykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Yge0Bjb2RlIENlcnRpZmljYXRlfXMgZm9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogQ2VydFNlbGVjdG9yfSBmcm9tIHRoaXMgaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogRklYTUU6IDEuNSB1cGRhdGVkIGFyZSBuZWVkZWQgQ29sbGVjdGlvbiA8PyBleHRlbmRzIENlcnRpZmljYXRlPgorICAgICAqIEBwYXJhbSBzZWxlY3RvcgorICAgICAqICAgICAgICAgICAgdGhlIHNlbGVjdG9yIGNvbnRhaW5pbmcgdGhlIGNyaXRlcmlhIHRvIHNlYXJjaCBmb3IKKyAgICAgKiAgICAgICAgICAgIGNlcnRpZmljYXRlcyBpbiB0aGlzIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Yge0Bjb2RlIENlcnRpZmljYXRlfXMgdGhhdCBtYXRjaCB0aGUgY3JpdGVyaWEgb2YgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgc2VsZWN0b3IuCisgICAgICogQHRocm93cyBDZXJ0U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlcnJvcihzKSBvY2N1ci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2VydGlmaWNhdGU+IGVuZ2luZUdldENlcnRpZmljYXRlcyhDZXJ0U2VsZWN0b3Igc2VsZWN0b3IpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydFN0b3JlRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHtAY29kZSBDUkx9cyBmb3IgdGhlIHNwZWNpZmllZCB7QGNvZGUgQ1JMU2VsZWN0b3J9CisgICAgICogZnJvbSB0aGlzIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEZJWE1FOiAxLjUgdXBkYXRlZCBhcmUgbmVlZGVkIENvbGxlY3Rpb24gPD8gZXh0ZW5kcyBDUkw+CisgICAgICogQHBhcmFtIHNlbGVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgc2VsZWN0b3IgY29udGFpbmluZyB0aGUgY3JpdGVyaWEgdG8gc2VhcmNoIGZvciBjZXJ0aWZpY2F0ZQorICAgICAqICAgICAgICAgICAgcmV2b2NhdGlvbiBsaXN0cyBpbiBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHtAY29kZSBDUkx9cyB0aGF0IG1hdGNoIHRoZSBjcml0ZXJpYSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBzZWxlY3RvcgorICAgICAqIEB0aHJvd3MgQ2VydFN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZXJyb3Iocykgb2NjdXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb248PyBleHRlbmRzIENSTD4gZW5naW5lR2V0Q1JMcyhDUkxTZWxlY3RvciBzZWxlY3RvcikKICAgICAgICAgICAgIHRocm93cyBDZXJ0U3RvcmVFeGNlcHRpb247CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGUuamF2YQppbmRleCAyNTA4ZjMxLi4wNTQzMzI5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwpAQCAtNDAsNDMgKzM1LDQ5IEBACiAgKiBBYnN0cmFjdCBjbGFzcyB0byByZXByZXNlbnQgaWRlbnRpdHkgY2VydGlmaWNhdGVzLiBJdCByZXByZXNlbnRzIGEgd2F5IHRvCiAgKiB2ZXJpZnkgdGhlIGJpbmRpbmcgb2YgYSBQcmluY2lwYWwgYW5kIGl0cyBwdWJsaWMga2V5LiBFeGFtcGxlcyBhcmUgWC41MDksCiAgKiBQR1AsIGFuZCBTRFNJLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENlcnRpZmljYXRlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM1ODU0NDA2MDE2MDU2NjYyNzdMOwogCiAgICAgLy8gVGhlIHN0YW5kYXJkIG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIHR5cGUKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgdGhlIGNlcnRpZmljYXRlIHR5cGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENlcnRpZmljYXRlKFN0cmluZyB0eXBlKSB7CiAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGUgcmVjZWl2ZXIuCisgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSB0eXBlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudAotICAgICAqIHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzIHNwZWNpZmljIGNvbXBhcmlzb24uIFRoZQotICAgICAqIGltcGxlbWVudGF0aW9uIGluIE9iamVjdCByZXR1cm5zIHRydWUgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgdGhlIGV4YWN0Ci0gICAgICogc2FtZSBvYmplY3QgYXMgdGhlIHJlY2VpdmVyICg9PSkuCisgICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSBjZXJ0aWZpY2F0ZSwgYW5kIHJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZXkKKyAgICAgKiByZXByZXNlbnQgdGhlIDxlbT5zYW1lPC9lbT4gb2JqZWN0IHVzaW5nIGEgY2xhc3Mgc3BlY2lmaWMgY29tcGFyaXNvbi4gVGhlCisgICAgICogaW1wbGVtZW50YXRpb24gaW4gT2JqZWN0IHJldHVybnMge0Bjb2RlIHRydWV9IG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIHRoZQorICAgICAqIGV4YWN0IHNhbWUgb2JqZWN0IGFzIHRoZSBjYWxsZWUgKD09KS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3RoZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0Ci0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBvYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QsIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoaXMgb2JqZWN0LgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewogICAgICAgICAvLyBvYmogZXF1YWwgdG8gaXRzZWxmCkBAIC05NiwxMyArOTcsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gb2JqZWN0cyB3aGljaAotICAgICAqIGFuc3dlciA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSBjZXJ0aWZpY2F0ZS4gQW55IHR3byBvYmplY3RzIHdoaWNoCisgICAgICogcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHBhc3NlZCB0byB7QGNvZGUgZXF1YWxzfSBtdXN0IHJldHVybiB0aGUgc2FtZQorICAgICAqIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSdzIGhhc2gKICAgICAgKiBAc2VlICNlcXVhbHMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICB0cnkgewpAQCAtMTIxLDYgKzEyMiw5IEBACiAgICAgICogUmV0dXJucyB0aGUgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBjZXJ0aWZpY2F0ZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGNlcnRpZmljYXRlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmNvZGluZyBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEVuY29kZWQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKIApAQCAtMTMwLDE3ICsxMzQsMTcgQEAKICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICogICAgICAgICAgICBQdWJsaWNLZXkgcHVibGljIGtleSBmb3Igd2hpY2ggdmVyaWZpY2F0aW9uIHNob3VsZCBiZQogICAgICAqICAgICAgICAgICAgcGVyZm9ybWVkLgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gQ2VydGlmaWNhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBlcnJvcnMgYXJlIGRldGVjdGVkCi0gICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBhbGdvcml0aG0gaXMgZGV0ZWN0ZWQKLSAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRLZXlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBpbnZhbGlkIGtleSBpcyBkZXRlY3RlZAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb3ZpZGVyCi0gICAgICogQGV4Y2VwdGlvbiBTaWduYXR1cmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmUgZXJyb3JzIGFyZSBkZXRlY3RlZAorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlbmNvZGluZyBlcnJvcnMgYXJlIGRldGVjdGVkLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gdW5zdXBwb3J0ZWQgYWxnb3JpdGhtIGlzIGRldGVjdGVkLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGludmFsaWQga2V5IGlzIGRldGVjdGVkLgorICAgICAqIEB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgc2lnbmF0dXJlIGVycm9ycyBhcmUgZGV0ZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXkpCiAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKQEAgLTE1MCwyNSArMTU0LDI1IEBACiAgICAgICAgICAgICAgICBTaWduYXR1cmVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHRoaXMgY2VydGlmaWNhdGUgd2FzIHNpZ25lZCB3aXRoIHRoZSBnaXZlbiBwdWJsaWMga2V5LiBVc2VzCi0gICAgICogdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gZ2l2ZW4gYnkgdGhlIHByb3ZpZGVyLgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhpcyBjZXJ0aWZpY2F0ZSB3YXMgc2lnbmVkIHdpdGggdGhlIGdpdmVuIHB1YmxpYyBrZXkuIEl0CisgICAgICogVXNlcyB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBnaXZlbiBieSB0aGUgcHJvdmlkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleQogICAgICAqICAgICAgICAgICAgUHVibGljS2V5IHB1YmxpYyBrZXkgZm9yIHdoaWNoIHZlcmlmaWNhdGlvbiBzaG91bGQgYmUKICAgICAgKiAgICAgICAgICAgIHBlcmZvcm1lZC4KICAgICAgKiBAcGFyYW0gc2lnUHJvdmlkZXIKICAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgc2lnbmF0dXJlIHByb3ZpZGVyLgotICAgICAqIAogICAgICAqIEBleGNlcHRpb24gQ2VydGlmaWNhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgICAgICogICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgZXJyb3JzIGFyZSBkZXRlY3RlZC4KICAgICAgKiBAZXhjZXB0aW9uIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIHVuc3VwcG9ydGVkIGFsZ29yaXRobSBpcyBkZXRlY3RlZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIHVuc3VwcG9ydGVkIGFsZ29yaXRobSBpcyBkZXRlY3RlZC4KICAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRLZXlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBpbnZhbGlkIGtleSBpcyBkZXRlY3RlZAorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGludmFsaWQga2V5IGlzIGRldGVjdGVkLgogICAgICAqIEBleGNlcHRpb24gTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb3ZpZGVyCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBkb2VzIG5vdCBleGlzdHMuCiAgICAgICogQGV4Y2VwdGlvbiBTaWduYXR1cmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmUgZXJyb3JzIGFyZSBkZXRlY3RlZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHNpZ25hdHVyZSBlcnJvcnMgYXJlIGRldGVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5LCBTdHJpbmcgc2lnUHJvdmlkZXIpCiAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKQEAgLTE3OSw5ICsxODMsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHJlY2VpdmVyLgorICAgICAqIGNlcnRpZmljYXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY2VydGlmaWNhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOwogCkBAIC0xODksMTEgKzE5NCwxNyBAQAogICAgICAqIFJldHVybnMgdGhlIHB1YmxpYyBrZXkgY29ycmVzcG9uZGluZyB0byB0aGlzIGNlcnRpZmljYXRlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBrZXkgY29ycmVzcG9uZGluZyB0byB0aGlzIGNlcnRpZmljYXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQdWJsaWNLZXkgZ2V0UHVibGljS2V5KCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYW4gYWx0ZXJuYXRlIG9iamVjdCB0byBiZSBzZXJpYWxpemVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCB0byBzZXJpYWxpemUuCisgICAgICogQHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIGFsdGVybmF0ZSBvYmplY3QgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKQEAgLTIwNSwxMyArMjE2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUgYWx0ZXJuYXRlIHtAY29kZSBTZXJpYWxpemFibGV9IGNsYXNzIHRvIGJlIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24gYW5kCisgICAgICogZGVzZXJpYWxpemF0aW9uIG9mIHtAY29kZSBDZXJ0aWZpY2F0ZX0gb2JqZWN0cy4gCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDZXJ0aWZpY2F0ZVJlcCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAgICAgKi8KKwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODU2Mzc1ODk0MDQ5NTY2MDAyMEw7CiAgICAgICAgIC8vIFRoZSBzdGFuZGFyZCBuYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0eXBlCiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGU7CkBAIC0yMjYsNyArMjM3LDE0IEBACiAgICAgICAgIH07CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlUmVwfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICogY2VydGlmaWNhdGUgdHlwZSBhbmQgZW5jb2RlZCBkYXRhLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHR5cGUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgdHlwZS4KKyAgICAgICAgICogQHBhcmFtIGRhdGEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZW5jb2RlZCBkYXRhLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBDZXJ0aWZpY2F0ZVJlcChTdHJpbmcgdHlwZSwgYnl0ZVtdIGRhdGEpIHsKICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CkBAIC0yMzQsNyArMjUyLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgICAgICogRGVzZXJpYWxpemVzIGEge0Bjb2RlIENlcnRpZmljYXRlfSBmcm9tIGEgc2VyaWFsaXplZCB7QGNvZGUKKyAgICAgICAgICogQ2VydGlmaWNhdGVSZXB9IG9iamVjdC4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIGRlc2VyaWFsaXplZCB7QGNvZGUgQ2VydGlmaWNhdGV9LgorICAgICAgICAgKiBAdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICBpZiBkZXNlcmlhbGl6YXRpb24gZmFpbHMuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewogICAgICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24uamF2YQppbmRleCAwODlmNDg3Li4xODhkMDg0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCkBAIC0xNSw1MCArMTUsNTkgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBlbmNvZGluZyBleGNlcHRpb24gZm9yIGEgY2VydGlmaWNhdGUuCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGEge0Bjb2RlIENlcnRpZmljYXRlfQorICogaXMgYmVpbmcgZW5jb2RlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICovCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MjE5NDkyODUxNTg5NDQ5MTYyTDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBmaWxsZWQgaW4uCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWVzc2FnZSBhbmQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIoY2F1c2UpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uLmphdmEKaW5kZXggYzM2NTEyYy4uNjc0ZDYxNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNSw1NCArMTUsNTggQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CiAKIC8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZ2VuZXJhbCBjZXJ0aWZpY2F0ZSBleGNlcHRpb24uCisgKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIHtAY29kZSBDZXJ0aWZpY2F0ZX0gcmVsYXRlZCBleGNlcHRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENlcnRpZmljYXRlRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKIAotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMxOTI1MzUyNTM3OTcxMTk3OThMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlRXhjZXB0aW9uKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQKKyAgICAgKiBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNhdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGIzNTQ5YTIuLmZlM2ZjMWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbi5qYXZhCkBAIC0xNSwzNyArMTUsMzMgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaW5kaWNhdGVzIHRoYXQgYSBnaXZlbiBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZC4KKyAqIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBhIHtAY29kZSBDZXJ0aWZpY2F0ZX0gaGFzIGV4cGlyZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIGV4dGVuZHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTA3MTAwMTMzOTY5MTUzMzc3MUw7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgYW5kIG1lc3NhZ2UKLSAgICAgKiBmaWxsZWQgaW4uCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkuamF2YQppbmRleCA3NDZiMjUxLi5iNDIxM2Q0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTM2LDkgKzMxLDE1IEBACiAKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEgY2VydGlmaWNhdGUgZmFjdG9yeSBhbGdvcml0aG0uCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBjZXJ0aWZpY2F0ZSBmYWN0b3J5IGFsZ29yaXRobSwKKyAqIHJlbHlpbmcgb24gcGFyc2luZyBhIHN0cmVhbSBvZiBieXRlcy4KKyAqIDxwPgorICogSXQgZGVmaW5lcyBtZXRob2RzIGZvciBwYXJzaW5nIGNlcnRpZmljYXRlIGNoYWlucyAoY2VydGlmaWNhdGUgcGF0aHMpIGFuZAorICogPGk+Q2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0czwvaT4gKENSTHMpLgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVGYWN0b3J5IHsKIAogICAgIC8vIFN0b3JlIENlcnRpZmljYXRlRmFjdG9yeSBzZXJ2aWNlIG5hbWUKQEAgLTU3LDggKzU4LDE1IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlRmFjdG9yeX0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNlcnRGYWNTcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgdHlwZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2VydGlmaWNhdGVGYWN0b3J5KENlcnRpZmljYXRlRmFjdG9yeVNwaSBjZXJ0RmFjU3BpLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyB0eXBlKSB7CkBAIC02OCwxOCArNzYsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IENlcnRpZmljYXRlRmFjdG9yeSBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUZhY3Rvcnl9IGluc3RhbmNlIHRoYXQgcHJvdmlkZXMgdGhlCisgICAgICogcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgVHlwZSBvZiBjZXJ0aWZpY2F0ZSBkZXNpcmVkCi0gICAgICogQHJldHVybiBDZXJ0aWZpY2F0ZUZhY3RvcnkgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGNlcnRpZmljYXRlCi0gICAgICogICAgICAgICB0eXBlIGRlc2lyZWQuCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSB0eXBlIGNhbm5vdCBiZSBmb3VuZAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVGYWN0b3J5fSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUgYXQgYW55CisgICAgICogICAgICAgICAgICAgaW5zdGFsbGVkIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdHlwZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2VydGlmaWNhdGVGYWN0b3J5IGdldEluc3RhbmNlKFN0cmluZyB0eXBlKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKQEAgLTk4LDEwICsxMDYsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlRmFjdG9yeX0gaW5zdGFuY2UgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogcHJvdmlkZXIgdGhhdCBwcm92aWRlcyB0aGUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUuCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFsZ29yaXRobSBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogQ2VydGlmaWNhdGVFeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSB0eXBlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHByb3ZpZGluZyBjZXJ0aWZpY2F0ZXMgb2YgdGhlCisgICAgICogICAgICAgICAgICBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcge0Bjb2RlIENlcnRpZmljYXRlRmFjdG9yeX0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgdHlwZSBpcyBub3QgYXZhaWxhYmxlIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgIHNwZWNpZmllZCBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gcHJvdmlkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgY2FuIGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBuYW1lIGlzIHtAY29kZSBudWxsfSBvciBlbXB0eS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaXQge0Bjb2RlIHR5cGV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENlcnRpZmljYXRlRmFjdG9yeSBnZXRJbnN0YW5jZShTdHJpbmcgdHlwZSwKICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlcikgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLApAQCAtMTE3LDIxICsxNDAsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IENlcnRpZmljYXRlRmFjdG9yeSBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUZhY3Rvcnl9IGluc3RhbmNlIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFR5cGUgb2YgY2VydGlmaWNhdGUgZGVzaXJlZAorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHR5cGUuCiAgICAgICogQHBhcmFtIHByb3ZpZGVyCi0gICAgICogICAgICAgICAgICBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIFByb3ZpZGVyIHdoaWNoIGhhcyB0byBpbXBsZW1lbnQgdGhlCi0gICAgICogICAgICAgICAgICBhbGdvcml0aG0KLSAgICAgKiBAcmV0dXJuIENlcnRpZmljYXRlRmFjdG9yeSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgY2VydGlmaWNhdGUKLSAgICAgKiAgICAgICAgIHR5cGUgZGVzaXJlZC4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIENlcnRpZmljYXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgdGhlIHR5cGUgY2Fubm90IGJlIGZvdW5kCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgSWYgYWxnb3JpdGhtIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciBwcm92aWRpbmcgY2VydGlmaWNhdGVzIG9mIHRoZQorICAgICAqICAgICAgICAgICAgc3BlY2lmaWVkIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUZhY3Rvcnl9IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlIHR5cGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICBzcGVjaWZpZWQgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaXMge0Bjb2RlIHR5cGV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENlcnRpZmljYXRlRmFjdG9yeSBnZXRJbnN0YW5jZShTdHJpbmcgdHlwZSwKICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewpAQCAtMTUzLDM1ICsxNzgsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBQcm92aWRlciBvZiB0aGUgY2VydGlmaWNhdGUgZmFjdG9yeSByZXByZXNlbnRlZCBieSB0aGUKLSAgICAgKiByZWNlaXZlci4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgUHJvdmlkZXJ9IG9mIHRoZSBjZXJ0aWZpY2F0ZSBmYWN0b3J5IHJlcHJlc2VudGVkIGJ5CisgICAgICogdGhlIGNlcnRpZmljYXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gUHJvdmlkZXIgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgb2YgdGhpcyBjZXJ0aWZpY2F0ZSBmYWN0b3J5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlciBnZXRQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIENlcnRpZmljYXRlIHR5cGUKKyAgICAgKiBSZXR1cm5zIHRoZSBDZXJ0aWZpY2F0ZSB0eXBlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHR5cGUgb2YgY2VydGlmaWNhdGUgYmVpbmcgdXNlZAorICAgICAqIEByZXR1cm4gdHlwZSBvZiBjZXJ0aWZpY2F0ZSBiZWluZyB1c2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGFuZCBpbml0aWFsaXplcyBhIENlcnRpZmljYXRlIGZyb20gZGF0YSBmcm9tIHRoZQotICAgICAqIHByb3ZpZGVkIGlucHV0IHN0cmVhbS4KKyAgICAgKiBHZW5lcmF0ZXMgYW5kIGluaXRpYWxpemVzIGEge0Bjb2RlIENlcnRpZmljYXRlfSBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dAorICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5TdHJlYW0KLSAgICAgKiAgICAgICAgICAgIElucHV0U3RyZWFtIFN0cmVhbSBmcm9tIHdoZXJlIGRhdGEgaXMgcmVhZCB0byBjcmVhdGUgdGhlCi0gICAgICogICAgICAgICAgICBDZXJ0aWZpY2F0ZQotICAgICAqIAotICAgICAqIEByZXR1cm4gQ2VydGlmaWNhdGUgYW4gaW5pdGlhbGl6ZWQgQ2VydGlmaWNhdGUKLSAgICAgKiBAZXhjZXB0aW9uIENlcnRpZmljYXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gZnJvbSB3aGVyZSBkYXRhIGlzIHJlYWQgdG8gY3JlYXRlIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIENlcnRpZmljYXRlfS4KKyAgICAgKiBAcmV0dXJuIGFuIGluaXRpYWxpemVkIENlcnRpZmljYXRlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBwYXJzaW5nIHByb2JsZW1zIGFyZSBkZXRlY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2VydGlmaWNhdGUgZ2VuZXJhdGVDZXJ0aWZpY2F0ZShJbnB1dFN0cmVhbSBpblN0cmVhbSkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CkBAIC0xODksNTMgKzIxNiw1MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSXRlcmF0b3Igb3ZlciB0aGUgc3VwcG9ydGVkIENlcnRQYXRoIGVuY29kaW5ncyAoYXMgU3RyaW5ncykuCi0gICAgICogVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgSXRlcmF0b3J9IG92ZXIgdGhlIHN1cHBvcnRlZCB7QGNvZGUgQ2VydFBhdGh9IGVuY29kaW5ncworICAgICAqIChhcyBTdHJpbmdzKS4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgc2NoZW1lIHRvIGFwcGx5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gSXRlcmF0b3IgSXRlcmF0b3Igb3ZlciBzdXBwb3J0ZWQgQ2VydFBhdGggZW5jb2RpbmdzIChhcyBTdHJpbmdzKQorICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBzdXBwb3J0ZWQge0BsaW5rIENlcnRQYXRofSBlbmNvZGluZ3MgKGFzCisgICAgICogICAgICAgICBTdHJpbmdzKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBnZXRDZXJ0UGF0aEVuY29kaW5ncygpIHsKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lR2V0Q2VydFBhdGhFbmNvZGluZ3MoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4gZnJvbSBkYXRhIGZyb20gdGhlIHByb3ZpZGVkCi0gICAgICogPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+LiBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBhc3N1bWVkLgorICAgICAqIEdlbmVyYXRlcyBhIHtAY29kZSBDZXJ0UGF0aH0gKGEgY2VydGlmaWNhdGUgY2hhaW4pIGZyb20gdGhlIHByb3ZpZGVkCisgICAgICoge0Bjb2RlIElucHV0U3RyZWFtfS4gVGhlIGRlZmF1bHQgZW5jb2Rpbmcgc2NoZW1lIGlzIGFwcGxpZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluU3RyZWFtCi0gICAgICogICAgICAgICAgICBJbnB1dFN0cmVhbSB3aXRoIFBLQ1M3IG9yIFBraVBhdGggZW5jb2RlZCBkYXRhCi0gICAgICogCi0gICAgICogQHJldHVybiBDZXJ0UGF0aCBhIENlcnRQYXRoIGluaXRpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBJbnB1dFN0cmVhbX0gd2l0aCBlbmNvZGVkIGRhdGEuCisgICAgICogQHJldHVybiBhIHtAY29kZSBDZXJ0UGF0aH0gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YS4KICAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQKKyAgICAgKiAgICAgICAgICAgICBpZiBwYXJzaW5nIHByb2JsZW1zIGFyZSBkZXRlY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ2VydFBhdGggZ2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbSBpblN0cmVhbSkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZ2V0Q2VydFBhdGhFbmNvZGluZ3MoKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGdldENlcnRQYXRoRW5jb2RpbmdzKCk7CiAgICAgICAgIGlmICghaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJzZWN1cml0eS43NCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzcGlJbXBsLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoaW5TdHJlYW0sIChTdHJpbmcpIGl0Lm5leHQoKSk7CisgICAgICAgIHJldHVybiBzcGlJbXBsLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoaW5TdHJlYW0sIGl0Lm5leHQoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IGZyb20gZGF0YSBmcm9tIHRoZSBwcm92aWRlZAotICAgICAqIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPi4gVGhlIGVuY29kaW5nIGlzIHRoYXQgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIGVuY29kaW5nIHBhcmFtZXRlci4KKyAgICAgKiBHZW5lcmF0ZXMgYSB7QGNvZGUgQ2VydFBhdGh9IChhIGNlcnRpZmljYXRlIGNoYWluKSBmcm9tIHRoZSBwcm92aWRlZAorICAgICAqIHtAY29kZSBJbnB1dFN0cmVhbX0gYW5kIHRoZSBzcGVjaWZpZWQgZW5jb2Rpbmcgc2NoZW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpblN0cmVhbQotICAgICAqICAgICAgICAgICAgSW5wdXRTdHJlYW0gY29udGFpbmluZyBjZXJ0aWZpY2F0ZSBwYXRoIGRhdGEgaW4gc3BlY2lmaWVkCi0gICAgICogICAgICAgICAgICBlbmNvZGluZworICAgICAqICAgICAgICAgICAge0Bjb2RlIElucHV0U3RyZWFtfSBjb250YWluaW5nIGNlcnRpZmljYXRlIHBhdGggZGF0YSBpbgorICAgICAqICAgICAgICAgICAgc3BlY2lmaWVkIGVuY29kaW5nLgogICAgICAqIEBwYXJhbSBlbmNvZGluZwotICAgICAqICAgICAgICAgICAgZW5jb2Rpbmcgb2YgdGhlIGRhdGEgaW4gdGhlIGlucHV0IHN0cmVhbQotICAgICAqIAotICAgICAqIEByZXR1cm4gQ2VydFBhdGggYSBDZXJ0UGF0aCBpbml0aWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBkYXRhCi0gICAgICogCisgICAgICogICAgICAgICAgICBlbmNvZGluZyBvZiB0aGUgZGF0YSBpbiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2VydFBhdGh9IGluaXRpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEuCiAgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDZXJ0UGF0aCBnZW5lcmF0ZUNlcnRQYXRoKElucHV0U3RyZWFtIGluU3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewpAQCAtMjQzLDE5ICsyNjksMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4gZnJvbSB0aGUgcHJvdmlkZWQgTGlzdCBvZgotICAgICAqIENlcnRpZmljYXRlcy4gVGhlIGVuY29kaW5nIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nLgorICAgICAqIEdlbmVyYXRlcyBhIHtAY29kZSBDZXJ0UGF0aH0gZnJvbSB0aGUgcHJvdmlkZWQgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMuIFRoZQorICAgICAqIGVuY29kaW5nIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjZXJ0aWZpY2F0ZXMKLSAgICAgKiAgICAgICAgICAgIExpc3QgY29udGFpbmluZyBjZXJ0aWZpY2F0ZXMgaW4gYSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5Ci0gICAgICogCi0gICAgICogQHJldHVybiBDZXJ0UGF0aCBhIENlcnRQYXRoIGluaXRpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IGNvbnRhaW5pbmcgY2VydGlmaWNhdGVzIGluIGEgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBDZXJ0aWZpY2F0ZUZhY3Rvcnl9LgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2VydFBhdGh9IGluaXRpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEuCiAgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDZXJ0UGF0aCBnZW5lcmF0ZUNlcnRQYXRoKExpc3Q8PyBleHRlbmRzIENlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewpAQCAtMjYzLDE2ICsyODgsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW5kIGluaXRpYWxpemVzIGEgY29sbGVjdGlvbiBvZiBDZXJ0aWZpY2F0ZXMgZnJvbQotICAgICAqIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIEdlbmVyYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBjb2xsZWN0aW9uIG9mICh1bnJlbGF0ZWQpIGNlcnRpZmljYXRlcyBmcm9tCisgICAgICogdGhlIHByb3ZpZGVkIGlucHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5TdHJlYW0KLSAgICAgKiAgICAgICAgICAgIElucHV0U3RyZWFtIFN0cmVhbSBmcm9tIHdoZXJlIGRhdGEgaXMgcmVhZCB0byBjcmVhdGUgdGhlCi0gICAgICogICAgICAgICAgICBDZXJ0aWZpY2F0ZXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENvbGxlY3Rpb24gYW4gaW5pdGlhbGl6ZWQgY29sbGVjdGlvbiBvZiBDZXJ0aWZpY2F0ZXMKLSAgICAgKiBAZXhjZXB0aW9uIENlcnRpZmljYXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyByZWFkIHRvIGNyZWF0ZSB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbGxlY3Rpb24uCisgICAgICogQHJldHVybiBhbiBpbml0aWFsaXplZCBjb2xsZWN0aW9uIG9mIGNlcnRpZmljYXRlcy4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIENlcnRpZmljYXRlPiBnZW5lcmF0ZUNlcnRpZmljYXRlcyhJbnB1dFN0cmVhbSBpblN0cmVhbSkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CkBAIC0yODAsMzIgKzMwNSwzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgZnJvbSBkYXRhIGZyb20KKyAgICAgKiBHZW5lcmF0ZXMgYW5kIGluaXRpYWxpemVzIGEgPGk+Q2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0PC9pPiAoQ1JMKSBmcm9tCiAgICAgICogdGhlIHByb3ZpZGVkIGlucHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5TdHJlYW0KLSAgICAgKiAgICAgICAgICAgIElucHV0U3RyZWFtIFN0cmVhbSBmcm9tIHdoZXJlIGRhdGEgaXMgcmVhZCB0byBjcmVhdGUgdGhlIENSTAotICAgICAqIAotICAgICAqIEByZXR1cm4gQ1JMIGFuIGluaXRpYWxpemVkIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBmcm9tIHdoZXJlIGRhdGEgaXMgcmVhZCB0byBjcmVhdGUgdGhlIENSTC4KKyAgICAgKiBAcmV0dXJuIGFuIGluaXRpYWxpemVkIENSTC4KICAgICAgKiBAZXhjZXB0aW9uIENSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkCisgICAgICogICAgICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENSTCBnZW5lcmF0ZUNSTChJbnB1dFN0cmVhbSBpblN0cmVhbSkgdGhyb3dzIENSTEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBzcGlJbXBsLmVuZ2luZUdlbmVyYXRlQ1JMKGluU3RyZWFtKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW5kIGluaXRpYWxpemVzIGEgY29sbGVjdGlvbiBvZiBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QKLSAgICAgKiBmcm9tIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIEdlbmVyYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBjb2xsZWN0aW9uIG9mIDxpPkNlcnRpZmljYXRlIFJldm9jYXRpb24KKyAgICAgKiBMaXN0PC9pPiAoQ1JMKSBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGluU3RyZWFtCi0gICAgICogICAgICAgICAgICBJbnB1dFN0cmVhbSBTdHJlYW0gZnJvbSB3aGVyZSBkYXRhIGlzIHJlYWQgdG8gY3JlYXRlIHRoZSBDUkxzCi0gICAgICogCi0gICAgICogQHJldHVybiBDb2xsZWN0aW9uIGFuIGluaXRpYWxpemVkIGNvbGxlY3Rpb24gb2YgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbgotICAgICAqICAgICAgICAgTGlzdAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHJlYWQgdG8gY3JlYXRlIHRoZSBDUkxzLgorICAgICAqIEByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgY29sbGVjdGlvbiBvZiBDUkxzLgogICAgICAqIEBleGNlcHRpb24gQ1JMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBwYXJzaW5nIHByb2JsZW1zIGFyZSBkZXRlY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ1JMPiBnZW5lcmF0ZUNSTHMoSW5wdXRTdHJlYW0gaW5TdHJlYW0pCiAgICAgICAgICAgICB0aHJvd3MgQ1JMRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeVNwaS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5U3BpLmphdmEKaW5kZXggZDBmNmVjNi4uZWQ2ZmZlZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5U3BpLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5U3BpLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0zMCw4OCArMjUsOTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBTZXJ2aWNlIFByb3ZpZGVyIEludGVyZmFjZSAodGhlcmVmb3JlIHRoZSBTcGkgc3VmZml4KSBmb3IKLSAqIGNlcnRpZmljYXRlIGZhY3RvcmllcyB0byBiZSBzdXBwbGllZCBieSBwcm92aWRlcnMuCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIDxpPlNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlPC9pPiAoPGI+U1BJPC9iPikgZm9yIHRoZQorICoge0Bjb2RlIENlcnRpZmljYXRlRmFjdG9yeX0gY2xhc3MuIFRoaXMgU1BJIG11c3QgYmUgaW1wbGVtZW50ZWQgZm9yIGVhY2gKKyAqIGNlcnRpZmljYXRlIHR5cGUgYSBzZWN1cml0eSBwcm92aWRlciB3aXNoZXMgdG8gc3VwcG9ydC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIAogcHVibGljIGFic3RyYWN0IGNsYXNzIENlcnRpZmljYXRlRmFjdG9yeVNwaSB7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlRmFjdG9yeVNwaSgpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW5kIGluaXRpYWxpemVzIGEgQ2VydGlmaWNhdGUgZnJvbSBkYXRhIGZyb20gdGhlCi0gICAgICogcHJvdmlkZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIEdlbmVyYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSB7QGNvZGUgQ2VydGlmaWNhdGV9IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0CisgICAgICogc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpblN0cmVhbQotICAgICAqICAgICAgICAgICAgSW5wdXRTdHJlYW0gU3RyZWFtIGZyb20gd2hlcmUgZGF0YSBpcyByZWFkIHRvIGNyZWF0ZSB0aGUKLSAgICAgKiAgICAgICAgICAgIENlcnRpZmljYXRlCi0gICAgICogCi0gICAgICogQHJldHVybiBDZXJ0aWZpY2F0ZSBhbiBpbml0aWFsaXplZCBDZXJ0aWZpY2F0ZQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHJlYWQgdG8gY3JlYXRlIHRoZQorICAgICAqICAgICAgICAgICAgY2VydGlmaWNhdGUuCisgICAgICogQHJldHVybiBhbiBpbml0aWFsaXplZCBjZXJ0aWZpY2F0ZS4KICAgICAgKiBAZXhjZXB0aW9uIENlcnRpZmljYXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBwYXJzaW5nIHByb2JsZW1zIGFyZSBkZXRlY3RlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ2VydGlmaWNhdGUgZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZShJbnB1dFN0cmVhbSBpblN0cmVhbSkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBjb2xsZWN0aW9uIG9mIENlcnRpZmljYXRlcyBmcm9tCi0gICAgICogZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBzdHJlYW0uCisgICAgICogR2VuZXJhdGVzIGFuZCBpbml0aWFsaXplcyBhIGNvbGxlY3Rpb24gb2YgY2VydGlmaWNhdGVzIGZyb20gdGhlIHByb3ZpZGVkCisgICAgICogaW5wdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpblN0cmVhbQotICAgICAqICAgICAgICAgICAgSW5wdXRTdHJlYW0gU3RyZWFtIGZyb20gd2hlcmUgZGF0YSBpcyByZWFkIHRvIGNyZWF0ZSB0aGUKLSAgICAgKiAgICAgICAgICAgIENlcnRpZmljYXRlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gQ29sbGVjdGlvbiBhbiBpbml0aWFsaXplZCBjb2xsZWN0aW9uIG9mIENlcnRpZmljYXRlcworICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBmcm9tIHdoZXJlIGRhdGEgaXMgcmVhZCB0byBjcmVhdGUgdGhlIGNlcnRpZmljYXRlcy4KKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjZXJ0aWZpY2F0ZXMuCiAgICAgICogQGV4Y2VwdGlvbiBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkCisgICAgICogICAgICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb248PyBleHRlbmRzIENlcnRpZmljYXRlPiAKICAgICAgICAgZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZXMoSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgZnJvbSBkYXRhIGZyb20KKyAgICAgKiBHZW5lcmF0ZXMgYW5kIGluaXRpYWxpemVzIGEgPGk+Q2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0PC9pPiAoQ1JMKSBmcm9tCiAgICAgICogdGhlIHByb3ZpZGVkIGlucHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5TdHJlYW0KLSAgICAgKiAgICAgICAgICAgIElucHV0U3RyZWFtIFN0cmVhbSBmcm9tIHdoZXJlIGRhdGEgaXMgcmVhZCB0byBjcmVhdGUgdGhlIENSTAotICAgICAqIAotICAgICAqIEByZXR1cm4gQ1JMIGFuIGluaXRpYWxpemVkIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBmcm9tIHdoZXJlIGRhdGEgaXMgcmVhZCB0byBjcmVhdGUgdGhlIENSTC4KKyAgICAgKiBAcmV0dXJuIGFuIENSTCBpbnN0YW5jZS4KICAgICAgKiBAZXhjZXB0aW9uIENSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkCisgICAgICogICAgICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENSTCBlbmdpbmVHZW5lcmF0ZUNSTChJbnB1dFN0cmVhbSBpblN0cmVhbSkKICAgICAgICAgICAgIHRocm93cyBDUkxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW5kIGluaXRpYWxpemVzIGEgY29sbGVjdGlvbiBvZiBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QKLSAgICAgKiBmcm9tIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIEdlbmVyYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBjb2xsZWN0aW9uIG9mIDxpPkNlcnRpZmljYXRlIFJldm9jYXRpb24KKyAgICAgKiBMaXN0PC9pPiAoQ1JMKSBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGluU3RyZWFtCi0gICAgICogICAgICAgICAgICBJbnB1dFN0cmVhbSBTdHJlYW0gZnJvbSB3aGVyZSBkYXRhIGlzIHJlYWQgdG8gY3JlYXRlIHRoZSBDUkxzCi0gICAgICogCi0gICAgICogQHJldHVybiBDb2xsZWN0aW9uIGFuIGluaXRpYWxpemVkIGNvbGxlY3Rpb24gb2YgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbgotICAgICAqICAgICAgICAgTGlzdAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHJlYWQgdG8gY3JlYXRlIHRoZSBDUkxzLgorICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIENSTHMuCiAgICAgICogQGV4Y2VwdGlvbiBDUkxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBwYXJzaW5nIHByb2JsZW1zIGFyZSBkZXRlY3RlZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDUkw+IAogICAgICAgICBlbmdpbmVHZW5lcmF0ZUNSTHMoSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBDUkxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4gZnJvbSBkYXRhIGZyb20gdGhlIHByb3ZpZGVkCi0gICAgICogPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+LiBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBhc3N1bWVkLgorICAgICAqIEdlbmVyYXRlcyBhIHtAY29kZSBDZXJ0UGF0aH0gZnJvbSB0aGUgcHJvdmlkZWQge0Bjb2RlIElucHV0U3RyZWFtfS4gVGhlCisgICAgICogZGVmYXVsdCBlbmNvZGluZyBzY2hlbWUgaXMgYXBwbGllZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5TdHJlYW0KLSAgICAgKiAgICAgICAgICAgIElucHV0U3RyZWFtIHdpdGggUEtDUzcgb3IgUGtpUGF0aCBlbmNvZGVkIGRhdGEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENlcnRQYXRoIGEgQ2VydFBhdGggaW5pdGlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YQotICAgICAqIAorICAgICAqICAgICAgICAgICAgYW4gaW5wdXQgc3RyZWFtIHdpdGggZW5jb2RlZCBkYXRhLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2VydFBhdGh9IGluaXRpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEuCiAgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRQYXRoIGVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoSW5wdXRTdHJlYW0gaW5TdHJlYW0pCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewpAQCAtMTIwLDIyICsxMTcsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4gZnJvbSBkYXRhIGZyb20gdGhlIHByb3ZpZGVkCi0gICAgICogPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+LiBUaGUgZW5jb2RpbmcgaXMgdGhhdCBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICogZW5jb2RpbmcgcGFyYW1ldGVyLgorICAgICAqIEdlbmVyYXRlcyBhIHtAY29kZSBDZXJ0UGF0aH0gZnJvbSB0aGUgcHJvdmlkZWQge0Bjb2RlCisgICAgICogSW5wdXRTdHJlYW19IGluIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluU3RyZWFtCi0gICAgICogICAgICAgICAgICBJbnB1dFN0cmVhbSBjb250YWluaW5nIGNlcnRpZmljYXRlIHBhdGggZGF0YSBpbiBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgICAgIGVuY29kaW5nCisgICAgICogICAgICAgICAgICBhbiBpbnB1dCBzdHJlYW0gY29udGFpbmluZyBjZXJ0aWZpY2F0ZSBwYXRoIGRhdGEgaW4gc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICBlbmNvZGluZy4KICAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIGVuY29kaW5nIG9mIHRoZSBkYXRhIGluIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENlcnRQYXRoIGEgQ2VydFBhdGggaW5pdGlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGVuY29kaW5nIG9mIHRoZSBkYXRhIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHJldHVybiBhIHtAY29kZSBDZXJ0UGF0aH0gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YQogICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBwYXJzaW5nIHByb2JsZW1zIGFyZSBkZXRlY3RlZAorICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3ZpZGVyIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGggZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbSBpblN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKQEAgLTE0NCwxOSArMTM5LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IGZyb20gdGhlIHByb3ZpZGVkIExpc3Qgb2YKLSAgICAgKiBDZXJ0aWZpY2F0ZXMuIFRoZSBlbmNvZGluZyBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZy4KKyAgICAgKiBHZW5lcmF0ZXMgYSB7QGNvZGUgQ2VydFBhdGh9IGZyb20gdGhlIHByb3ZpZGVkIGxpc3Qgb2YgY2VydGlmaWNhdGVzLiBUaGUKKyAgICAgKiBlbmNvZGluZyBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGVzCi0gICAgICogICAgICAgICAgICBMaXN0IGNvbnRhaW5pbmcgY2VydGlmaWNhdGVzIGluIGEgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUKLSAgICAgKiAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeQotICAgICAqIAotICAgICAqIEByZXR1cm4gQ2VydFBhdGggYSBDZXJ0UGF0aCBpbml0aWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBkYXRhCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBjb250YWluaW5nIGNlcnRpZmljYXRlcyBpbiBhIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICB7QGNvZGUgQ2VydGlmaWNhdGVGYWN0b3J5fS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIENlcnRQYXRofSBpbml0aWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBkYXRhLgogICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBwYXJzaW5nIHByb2JsZW1zIGFyZSBkZXRlY3RlZAorICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgcHJvYmxlbXMgYXJlIGRldGVjdGVkLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3ZpZGVyIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGggZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChMaXN0PD8gZXh0ZW5kcyBDZXJ0aWZpY2F0ZT4gIGNlcnRpZmljYXRlcykgCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewpAQCAtMTY1LDEwICsxNTksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgdGhlIHN1cHBvcnRlZCBDZXJ0UGF0aCBlbmNvZGluZ3MgKGFzIFN0cmluZ3MpLgotICAgICAqIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nLgorICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIEl0ZXJhdG9yfSBvdmVyIHRoZSBzdXBwb3J0ZWQge0Bjb2RlIENlcnRQYXRofSBlbmNvZGluZ3MKKyAgICAgKiAoYXMgU3RyaW5ncykuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gSXRlcmF0b3IgSXRlcmF0b3Igb3ZlciBzdXBwb3J0ZWQgQ2VydFBhdGggZW5jb2RpbmdzIChhcyBTdHJpbmdzKQorICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBzdXBwb3J0ZWQge0Bjb2RlIENlcnRQYXRofSBlbmNvZGluZ3MgKGFzCisgICAgICogICAgICAgICBTdHJpbmdzKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBlbmdpbmVHZXRDZXJ0UGF0aEVuY29kaW5ncygpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDY3M2E3MjkuLjIyMWIyMmEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uLmphdmEKQEAgLTE1LDM1ICsxNSwzNCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIC8qKgotICogVGhpcyBjbGFzcyBpbmRpY2F0ZXMgdGhhdCBhIGdpdmVuIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZCB5ZXQuCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYSB7QGNvZGUgQ2VydGlmaWNhdGV9IGlzIG5vdCB5ZXQgdmFsaWQgb3IKKyAqIHdpbGwgbm90IHlldCBiZSB2YWxpZCBvbiBhIHNwZWNpZmllZCBkYXRlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gZXh0ZW5kcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKi8KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzNTU5MTk5MDAwNDEwNjQ3MDJMOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGFuZCBtZXNzYWdlCi0gICAgICogZmlsbGVkIGluLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIHdhbGtiYWNrIGZpbGxlZCBpbi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbigpIHsKICAgICB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IGQ5ODU5NDQuLjJjNzVkMjAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbi5qYXZhCkBAIC0xNSw0OSArMTUsNTggQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaW5kaWNhdGVzIHRoYXQgYSBnaXZlbiBjZXJ0aWZpY2F0ZSBjb3VsZCBub3QgYmUgcGFyc2VkLgorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGEge0Bjb2RlIENlcnRpZmljYXRlfSBjYW4gbm90IGJlIHBhcnNlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gZXh0ZW5kcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CiAKLSAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03OTg5MjIyNDE2NzkzMzIyMDI5TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjayBhbmQgbWVzc2FnZQotICAgICAqIGZpbGxlZCBpbi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1zZwotICAgICAqICAgICAgICAgICAgU3RyaW5nIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgd2Fsa2JhY2sgZmlsbGVkIGluLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWVzc2FnZSBhbmQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24ncyBzb3VyY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uJ3Mgc291cmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycy5qYXZhCmluZGV4IDBkZWQxOWMuLjIzZDg4ODQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMuamF2YQpAQCAtMTUsMzggKzE1LDU2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBwYXJhbWV0ZXJzIHRvIGluaXRpYWxpemUgYSA8aT5Db2xsZWN0aW9uPC9pPiB0eXBlIHtAY29kZSBDZXJ0U3RvcmV9IGluc3RhbmNlLgorICogPHA+CisgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHtAY29kZSBDb2xsZWN0aW9ufSB3aGVyZSB0aGUge0Bjb2RlIENlcnRTdG9yZX0gd2lsbAorICogcmV0cmlldmUgdGhlIGNlcnRpZmljYXRlcyBhbmQgQ1JMcyBmcm9tLiAKKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBpbXBsZW1lbnRzIENlcnRTdG9yZVBhcmFtZXRlcnMgeworICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIC8vIERlZmF1bHQgZW1wdHkgYW5kIGltbXV0YWJsZSBjb2xsZWN0aW9uLgogICAgIC8vIFVzZWQgaWYgPGNvZGU+Q29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnM8L2NvZGU+aW5zdGFuY2UKICAgICAvLyBjcmVhdGVkIGJ5IHRoZSBubyBhcmcgY29uc3RydWN0b3IKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIGRlZmF1bHRDb2xsZWN0aW9uID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248Pz4gZGVmYXVsdENvbGxlY3Rpb24gPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CiAgICAgLy8gQSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBvZiA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT5zCiAgICAgLy8gYW5kIDxjb2RlPkNSTDwvY29kZT5zCi0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb247CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb247CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyc30gd2l0aG91dCBhIGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgY29sbGVjdGlvbiBpcyBhbiBlbXB0eSBhbmQgdW5tb2RpZmlhYmxlIHtAY29kZSBDb2xsZWN0aW9ufS4KKyAgICAgKiA8L3A+CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKCkgewogICAgICAgICB0aGlzLmNvbGxlY3Rpb24gPSBkZWZhdWx0Q29sbGVjdGlvbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzfSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb2xsZWN0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBub3QgY29waWVkIGFuZCB0aGVyZWZvcmUgbWF5IGJlIG1vZGlmaWVkIGF0CisgICAgICogYW55IHRpbWUuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiB3aGVyZSB0aGUge0Bjb2RlIENlcnRpZmljYXRlfXMgYW5kIHtAY29kZSBDUkx9cworICAgICAqICAgICAgICAgICAgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNvbGxlY3Rpb24gaXMgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewogICAgICAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwpAQCAtNTYsMjEgKzc0LDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDbG9uZXMgdGhpcyB7QGNvZGUgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnN9IGluc3RhbmNlLCBidXQgbm90IHRoZQorICAgICAqIHVuZGVybHlpbmcgY29sbGVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyhjb2xsZWN0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gd2hlcmUgdGhlIHtAY29kZSBDZXJ0aWZpY2F0ZX1zIGFuZCB7QGNvZGUgQ1JMfXMKKyAgICAgKiBhcmUgcmV0cmlldmVkIGZyb20uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY29sbGVjdGlvbiB3aGVyZSB0aGUge0Bjb2RlIENlcnRpZmljYXRlfXMgYW5kIHtAY29kZSBDUkx9cworICAgICAqICAgICAgICAgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRDb2xsZWN0aW9uKCkgewogICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9MREFQQ2VydFN0b3JlUGFyYW1ldGVycy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvTERBUENlcnRTdG9yZVBhcmFtZXRlcnMuamF2YQppbmRleCBkOTY1YzQyLi45MTQ1ODQ4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9MREFQQ2VydFN0b3JlUGFyYW1ldGVycy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0xEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzLmphdmEKQEAgLTE1LDE2ICsxNSwxMiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgcGFyYW1ldGVycyB0byBpbml0aWFsaXplIGEgTERBUCB7QGNvZGUgQ2VydFN0b3JlfSBpbnN0YW5jZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyBpbXBsZW1lbnRzIENlcnRTdG9yZVBhcmFtZXRlcnMgewogICAgIC8vIERlZmF1bHQgTERBUCBzZXJ2ZXIgbmFtZQpAQCAtMzgsNyArMzQsMTYgQEAKICAgICBwcml2YXRlIGZpbmFsIGludCBwb3J0OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBMREFQQ2VydFN0b3JlUGFyYW1ldGVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogc2VydmVyIG5hbWUgYW5kIHBvcnQuCisgICAgICogCisgICAgICogQHBhcmFtIHNlcnZlck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBMREFQIHNlcnZlciBuYW1lLgorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaXMge0Bjb2RlIHNlcnZlck5hbWV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMoU3RyaW5nIHNlcnZlck5hbWUsIGludCBwb3J0KSB7CiAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CkBAIC00OSw3ICs1NCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgTERBUENlcnRTdG9yZVBhcmFtZXRlcnN9IGluc3RhbmNlIHdpdGggZGVmYXVsdAorICAgICAqIHBhcmFtZXRlcnMuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgcGFyYW1ldGVycyBhcmUgc2VydmVyIG5hbWUgImxvY2FsaG9zdCIgYW5kIHBvcnQgMzg5LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMoKSB7CiAgICAgICAgIHRoaXMuc2VydmVyTmFtZSA9IERFRkFVTFRfTERBUF9TRVJWRVJfTkFNRTsKQEAgLTU3LDcgKzY4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBMREFQQ2VydFN0b3JlUGFyYW1ldGVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogc2VydmVyIG5hbWUgYW5kIGRlZmF1bHQgcG9ydCAzODkuCisgICAgICogCisgICAgICogQHBhcmFtIHNlcnZlck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBMREFQIHNlcnZlciBuYW1lLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc2VydmVyTmFtZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyhTdHJpbmcgc2VydmVyTmFtZSkgewogICAgICAgICB0aGlzLnBvcnQgPSBERUZBVUxUX0xEQVBfUE9SVDsKQEAgLTY4LDI4ICs4Niw0MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ2xvbmVzIHRoaXMge0Bjb2RlIExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyhzZXJ2ZXJOYW1lLCBwb3J0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIExEQVAgc2VydmVyIHBvcnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgTERBUCBzZXJ2ZXIgcG9ydC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CiAgICAgICAgIHJldHVybiBwb3J0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgTERBUCBzZXJ2ZXIgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBMREFQIHNlcnZlciBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIHNlcnZlck5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgTERBUENlcnRTdG9yZVBhcmFtZXRlcnN9CisgICAgICogaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzfQorICAgICAqICAgICAgICAgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1BLSVhCdWlsZGVyUGFyYW1ldGVycy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzLmphdmEKaW5kZXggYzZkZjA1YS4uYTA0N2E4MCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CkBAIC0zMSwxNSArMjYsMzYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gZm9yIGEgUEtJWCB7QGNvZGUgQ2VydFBhdGhCdWlsZGVyfQorICogYWxnb3JpdGhtIHVzZWQgdG8ge0BsaW5rIENlcnRQYXRoQnVpbGRlciNidWlsZChDZXJ0UGF0aFBhcmFtZXRlcnMpIGJ1aWxkfSAKKyAqIGNlcnRpZmljYXRlIGNoYWlucyB2YWxpZGF0ZWQgd2l0aCB0aGUgUEtJWCBjZXJ0aWZpY2F0aW9uIHBhdGggdmFsaWRhdGlvbi4gCisgKiA8cD4KKyAqIFRoZSBwYXJhbWV0ZXJzIG11c3QgYmUgY3JlYXRlZCB3aXRoIDxpPnRydXN0ZWQ8L2k+IGNlcnRpZmljYXRlIGF1dGhvcml0aWVzCisgKiBhbmQgY29uc3RyYWludHMgZm9yIHRoZSB0YXJnZXQgY2VydGlmaWNhdGVzLgorICogPC9wPgogICogCisgKiBAc2VlIENlcnRQYXRoQnVpbGRlcgorICogQHNlZSBDZXJ0UGF0aFBhcmFtZXRlcnMKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzIGV4dGVuZHMgUEtJWFBhcmFtZXRlcnMgewogICAgIC8vIE1heGltdW0gY2VydGlmaWNhdGUgcGF0aCBsZW5ndGggKDUgYnkgZGVmYXVsdCkKICAgICBwcml2YXRlIGludCBtYXhQYXRoTGVuZ3RoID0gNTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzZXQgb2Yge0Bjb2RlIFRydXN0QW5jaG9yfSBhbmQgY2VydGlmaWNhdGUgY29uc3RyYWludHMuCisgICAgICogCisgICAgICogQHBhcmFtIHRydXN0QW5jaG9ycworICAgICAqICAgICAgICAgICAgdGhlIHNldCBvZiB7QGNvZGUgVHJ1c3RBbmNob3JzfS4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q29uc3RyYWludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSBjb25zdHJhaW50cy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdHJ1c3RBbmNob3JzfSBpcyBlbXB0eS4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgaXRlbXMgaW4ge0Bjb2RlIHRydXN0QW5jaG9yc30gaXMgbm90IGFuCisgICAgICogICAgICAgICAgICAgaW5zdGFuY2Ugb2Yge0Bjb2RlIGphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBLSVhCdWlsZGVyUGFyYW1ldGVycyhTZXQ8VHJ1c3RBbmNob3I+IHRydXN0QW5jaG9ycywKICAgICAgICAgICAgIENlcnRTZWxlY3RvciB0YXJnZXRDb25zdHJhaW50cykKQEAgLTQ5LDcgKzY1LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBQS0lYQnVpbGRlclBhcmFtZXRlcnN9IGluc3RhbmNlIHdpdGggdGhlIHRydXN0ZWQKKyAgICAgKiB7QGNvZGUgWDUwOUNlcnRpZmljYXRlfSBlbnRyaWVzIGZyb20gdGhlIHNwZWNpZmllZCB7QGNvZGUgS2V5U3RvcmV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlTdG9yZQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBzdG9yZSBjb250YWluaW5nIHRydXN0ZWQgY2VydGlmaWNhdGVzLgorICAgICAqIEBwYXJhbSB0YXJnZXRDb25zdHJhaW50cworICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIGNvbnN0cmFpbnRzLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGtleVN0b3JlfSBkb2VzIG5vdCBjb250YWluZWQgYW55IHRydXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzKEtleVN0b3JlIGtleVN0b3JlLAogICAgICAgICAgICAgQ2VydFNlbGVjdG9yIHRhcmdldENvbnN0cmFpbnRzKQpAQCAtNjAsMTQgKzg4LDMyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBub24tc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIGluIGEKKyAgICAgKiBjZXJ0aWZpY2F0aW9uIHBhdGguCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY2VydGlmaWNhdGlvbiBwYXRoLCBvciB7QGNvZGUgLTF9IGlmIGl0CisgICAgICogICAgICAgICBpcyB1bmxpbWl0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhQYXRoTGVuZ3RoKCkgewogICAgICAgICByZXR1cm4gbWF4UGF0aExlbmd0aDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjZXJ0aWZpY2F0aW9uIHBhdGguCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygbm9uLXNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcyBpbiBhCisgICAgICogY2VydGlmaWNhdGlvbiBwYXRoLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWF4UGF0aExlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY2VydGlmaWNhdGlvbiBwYXRoLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBtYXhQYXRoTGVuZ3RofSBpcyBsZXNzIHRoYW4ge0Bjb2RlIC0xfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNYXhQYXRoTGVuZ3RoKGludCBtYXhQYXRoTGVuZ3RoKSB7CiAgICAgICAgIGlmIChtYXhQYXRoTGVuZ3RoIDwgLTEpIHsKQEAgLTc4LDcgKzEyNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBQS0lYQnVpbGRlclBhcmFtZXRlcnN9CisgICAgICogaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBQS0lYQnVpbGRlclBhcmFtZXRlcnN9CisgICAgICogICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJbXG4iKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdC5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdC5qYXZhCmluZGV4IGQwYTM0YmEuLjYwNjQxOTQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1BLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0LmphdmEKQEAgLTE1LDEwICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KIAogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKQEAgLTI3LDggKzIzLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHJlc3VsdCBvZiB0aGUgUEtJWCBjZXJ0aWZpY2F0aW9uIHBhdGggYnVpbGRlciwgcmV0dXJuZWQgYnkKKyAqIHtAbGluayBDZXJ0UGF0aEJ1aWxkZXIjYnVpbGQoQ2VydFBhdGhQYXJhbWV0ZXJzKX0uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCBleHRlbmRzIFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdAogICAgICAgICBpbXBsZW1lbnRzIENlcnRQYXRoQnVpbGRlclJlc3VsdCB7CkBAIC0zNiw3ICszNCwyMiBAQAogICAgIHByaXZhdGUgZmluYWwgQ2VydFBhdGggY2VydFBhdGg7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHR9IGluc3RhbmNlIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHZhbGlkYXRlZCBjZXJ0aWZpY2F0aW9uIHBhdGgsIHRoZSB0cnVzdCBhbmNob3Igb2YgdGhlCisgICAgICogY2VydGlmaWNhdGlvbiBwYXRoLCB0aGUgcG9saWN5IHRyZWUgYW5kIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBzdWJqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjZXJ0UGF0aAorICAgICAqICAgICAgICAgICAgdGhlIHZhbGlkYXRlZCBjZXJ0aWZpY2F0aW9uIHBhdGguCisgICAgICogQHBhcmFtIHRydXN0QW5jaG9yCisgICAgICogICAgICAgICAgICB0aGUgdHJ1c3QgYW5jaG9yLgorICAgICAqIEBwYXJhbSBwb2xpY3lUcmVlCisgICAgICogICAgICAgICAgICB0aGUgcG9saWN5IHRyZWUgKG9yIHtAY29kZSBudWxsfSBpZiBub3QgdXNlZCkuCisgICAgICogQHBhcmFtIHN1YmplY3RQdWJsaWNLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwdWJsaWMga2V5LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGNlclBhdGh9LCB7QGNvZGUgdHJ1c3RBbmNob3J9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgIHN1YmplY3RQb2xpY3lLZXl9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdChDZXJ0UGF0aCBjZXJ0UGF0aCwgVHJ1c3RBbmNob3IgdHJ1c3RBbmNob3IsCiAgICAgICAgICAgICBQb2xpY3lOb2RlIHBvbGljeVRyZWUsIFB1YmxpY0tleSBzdWJqZWN0UHVibGljS2V5KSB7CkBAIC00OCwxNCArNjEsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHZhbGlkYXRlZCBjZXJ0aWZpY2F0aW9uIHBhdGguCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmFsaWRhdGVkIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGggZ2V0Q2VydFBhdGgoKSB7CiAgICAgICAgIHJldHVybiBjZXJ0UGF0aDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdH0KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHR9CisgICAgICogICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoQ2hlY2tlci5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoQ2hlY2tlci5qYXZhCmluZGV4IGY0NDhiZWUuLjU2MTQ4NzggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1BLSVhDZXJ0UGF0aENoZWNrZXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhDaGVja2VyLmphdmEKQEAgLTI2LDE4ICsyNiw0MiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBjbGFzcyBzcGVjaWZ5aW5nIHRoZSBpbnRlcmZhY2UgdG8gZXh0ZW5kIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGgKKyAqIHZhbGlkYXRpb24gYWxnb3JpdGhtIGJ5IGNoZWNrcyB0byBwZXJmb3JtIG9uIGFuIHtAY29kZSBYNTA5Q2VydGlmaWNhdGV9LgorICogPHA+CisgKiBUaGUgY2hlY2tzIGFyZSBhZGRlZCB0byBhIGNlcnRpZmljYXRpb24gcGF0aCB2YWxpZGF0aW9uIHVzaW5nIHRoZQorICoge0BsaW5rIFBLSVhQYXJhbWV0ZXJzI3NldENlcnRQYXRoQ2hlY2tlcnMoamF2YS51dGlsLkxpc3QpCisgKiBzZXRDZXJ0UGF0aENoZWNrZXJzfSBvcgorICoge0BsaW5rIFBLSVhCdWlsZGVyUGFyYW1ldGVycyNhZGRDZXJ0UGF0aENoZWNrZXIoUEtJWENlcnRQYXRoQ2hlY2tlcikKKyAqIGFkZENlcnRQYXRoQ2hlY2tlcn0gb2YgdGhlIHtAY29kZSBQS0lYUGFyYW1ldGVyc30gYW5kIHtAY29kZQorICogUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzfSBjbGFzcyByZXNwZWN0aXZlbHkuIFRoZQorICoge0BsaW5rICNjaGVjayhDZXJ0aWZpY2F0ZSwgQ29sbGVjdGlvbikgY2hlY2t9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaAorICogY2VydGlmaWNhdGUgcHJvY2Vzc2VkIGJ5IGEge0Bjb2RlIENlcnRQYXRoQnVpbGRlcn0gb2Yge0Bjb2RlCisgKiBDZXJ0UGF0aFZhbGlkYXRvcn0uCisgKiA8L3A+CisgKiA8cD4KKyAqIEEge0Bjb2RlIFBLSVhDZXJ0UGF0aENoZWNrZXJ9IGltcGxlbWVudGF0aW9uIDx1Pm11c3Q8L3U+IHN1cHBvcnQgcmV2ZXJzZQorICogY2hlY2tpbmcgKGZyb20gdHJ1c3RlZCBDQSB0byB0YXJnZXQpIGFuZCA8dT5tYXk8L3U+IHN1cHBvcnQgZm9yd2FyZCBjaGVja2luZworICogKGZyb20gdGFyZ2V0IHRvIHRydXN0ZWQgQ0EpLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHtAY29kZQorICogaXNGb3J3YXJkQ2hlY2tpbmdTdXBwb3J0ZWR9IGluZGljYXRlcyB3aGV0aGVyIGZvcndhcmQgY2hlY2tpbmcgaXMgc3VwcG9ydGVkLgorICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFBLSVhDZXJ0UGF0aENoZWNrZXIgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBQS0lYQ2VydFBhdGhDaGVja2VyfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUEtJWENlcnRQYXRoQ2hlY2tlcigpIHt9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb25lcyB0aGlzIHtAY29kZSBQS0lYQ2VydFBhdGhDaGVja2VyfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTQ4LDIzICs3Miw1NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgUEtJWENlcnRQYXRoQ2hlY2tlcn0gaW5zdGFuY2UgZm9yIHNwZWNpZmllZAorICAgICAqIDxpPmNoZWNraW5nIGRpcmVjdGlvbjwvaT4uCisgICAgICogCisgICAgICogQHBhcmFtIGZvcndhcmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGNlcnRpZmljYXRpb24gcGF0aCBwcm9jZXNzaW5nLCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRydWV9IGlmIHRoZSBjZXJ0aWZpY2F0ZXMgYXJlIHByb2Nlc3NlZCBpbiBmb3J3YXJkIGRpcmVjdGlvbgorICAgICAqICAgICAgICAgICAgKGZyb20gdGFyZ2V0IHRvIHRydXN0ZWQgQ0EpLCB7QGNvZGUgZmFsc2V9IGlmIHByb2Nlc3NlZCBpbgorICAgICAqICAgICAgICAgICAgcmV2ZXJzZSBkaXJlY3Rpb24gKGZyb20gdHJ1c3RlZCBDQSB0byB0YXJnZXQpLgorICAgICAqIEB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBpbml0aWFsaXphdGlvbiBvZiB0aGlzIHtAY29kZSBQS0lYQ2VydFBhdGhDaGVja2VyfQorICAgICAqICAgICAgICAgICAgIGluc3RhbmNlIGZhaWxzLCBvciBpZiBpdCBjYW5ub3QgcHJvY2VzcyBjZXJ0aWZpY2F0ZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICAgc3BlY2lmaWVkIG9yZGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoYm9vbGVhbiBmb3J3YXJkKQogICAgICAgICB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHtAY29kZSBQS0lYQ2VydFBhdGhDaGVja2VyfSBpbnN0YW5jZSBzdXBwb3J0cworICAgICAqIDxpPmZvcndhcmQgY2hlY2tpbmc8L2k+LgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIFBLSVhDZXJ0UGF0aENoZWNrZXJ9IGluc3RhbmNlCisgICAgICogICAgICAgICBzdXBwb3J0cyBmb3J3YXJkIGNoZWNraW5nLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0ZvcndhcmRDaGVja2luZ1N1cHBvcnRlZCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgb2YgWC41MDkgY2VydGlmaWNhdGVzIHRoYXQgdGhpcyB7QGNvZGUKKyAgICAgKiBQS0lYQ2VydFBhdGhDaGVja2VyfSBpcyBhYmxlIHRvIHByb2Nlc3MuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBleHRlbnNpb25zIG9mIFguNTA5IGNlcnRpZmljYXRlcyB0aGF0IHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBQS0lYQ2VydFBhdGhDaGVja2VyfSBpcyBhYmxlIHRvIHByb2Nlc3MsIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZQorICAgICAqICAgICAgICAgYXJlIG5vbmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNldDxTdHJpbmc+IGdldFN1cHBvcnRlZEV4dGVuc2lvbnMoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ2hlY2tzIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgYW5kIHJlbW92ZXMgdGhlIHByb2Nlc3NlZCBjcml0aWNhbAorICAgICAqIGV4dGVuc2lvbnMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgWC41MDkgZXh0ZW5zaW9uIDxpPk9JRDwvaT5zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjZXJ0CisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUuCisgICAgICogQHBhcmFtIHVucmVzb2x2ZWRDcml0RXh0cworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY3JpdGljYWwgWC41MDkgZXh0ZW5zaW9uIE9JRCBzdHJpbmdzLgorICAgICAqIEB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBjaGVjayhzKSBmYWlsIG9uIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2hlY2soQ2VydGlmaWNhdGUgY2VydCwgQ29sbGVjdGlvbjxTdHJpbmc+IHVucmVzb2x2ZWRDcml0RXh0cykKICAgICAgICAgdGhyb3dzIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQuamF2YQppbmRleCBiY2RhMzgzLi4yMWY5MGM5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwpAQCAtMjcsOCArMjIsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc3VsdCBvZiB0aGUgUEtJWCBjZXJ0aWZpY2F0aW9uIHBhdGggdmFsaWRhdGlvbi4KICAqIAorICogQHNlZSBDZXJ0UGF0aFZhbGlkYXRvcgorICogQHNlZSBDZXJ0UGF0aFZhbGlkYXRvciN2YWxpZGF0ZShDZXJ0UGF0aCwgQ2VydFBhdGhQYXJhbWV0ZXJzKQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQgaW1wbGVtZW50cyBDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCB7CiAgICAgLy8gQSB0cnVzdCBhbmNob3IgdXNlZCBkdXJpbmcgdmFsaWRhdGlvbiBvZiBjZXJ0aWZpY2F0aW9uIHBhdGgKQEAgLTQwLDcgKzM4LDE3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBQdWJsaWNLZXkgc3ViamVjdFB1YmxpY0tleTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0fSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB0cnVzdCBhbmNob3IsIHRoZSB2YWxpZCBwb2xpY3kgdHJlZSBhbmQgdGhlIHN1YmplY3QgcHVibGljIGtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJ1c3RBbmNob3IKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cnVzdCBhbmNob3IgZGVzY3JpYmluZyB0aGUgY2VydGlmaWNhdGlvbiBhdXRob3JpdHkgKENBKQorICAgICAqICAgICAgICAgICAgdGhhdCBzZXJ2ZWQgYXMgdHJ1c3QgYW5jaG9yIGZvciB0aGUgY2VydGlmaWNhdGlvbiBwYXRoLgorICAgICAqIEBwYXJhbSBwb2xpY3lUcmVlCisgICAgICogICAgICAgICAgICB0aGUgdmFsaWQgcG9saWN5IHRyZWUgZnJvbSB0aGUgdmFsaWRhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3ViamVjdFB1YmxpY0tleQorICAgICAqICAgICAgICAgICAgdGhlIHN1YmplY3QgcHVibGljIGtleSBmcm9tIHRoZSB2YWxpZGF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQoVHJ1c3RBbmNob3IgdHJ1c3RBbmNob3IsCiAgICAgICAgICAgICBQb2xpY3lOb2RlIHBvbGljeVRyZWUsIFB1YmxpY0tleSBzdWJqZWN0UHVibGljS2V5KSB7CkBAIC01NywyOCArNjUsNDEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHZhbGlkIHBvbGljeSB0cmVlIGZyb20gdGhlIHZhbGlkYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmFsaWQgcG9saWN5IHRyZWUgZnJvbSB0aGUgdmFsaWRhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUG9saWN5Tm9kZSBnZXRQb2xpY3lUcmVlKCkgewogICAgICAgICByZXR1cm4gcG9saWN5VHJlZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHN1YmplY3QgcHVibGljIGtleSBmcm9tIHRoZSB2YWxpZGF0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN1YmplY3QgcHVibGljIGtleSBmcm9tIHRoZSB2YWxpZGF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkgewogICAgICAgICByZXR1cm4gc3ViamVjdFB1YmxpY0tleTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHRydXN0IGFuY2hvciBkZXNjcmliaW5nIHRoZSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSAoQ0EpIHRoYXQKKyAgICAgKiBzZXJ2ZWQgYXMgdHJ1c3QgYW5jaG9yIGZvciB0aGlzIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0cnVzdCBhbmNob3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRydXN0QW5jaG9yIGdldFRydXN0QW5jaG9yKCkgewogICAgICAgICByZXR1cm4gdHJ1c3RBbmNob3I7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDbG9uZXMgdGhpcyB7QGNvZGUgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0fSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTkwLDcgKzExMSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB7QGNvZGUKKyAgICAgKiBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHR9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHR9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9QS0lYUGFyYW1ldGVycy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUEtJWFBhcmFtZXRlcnMuamF2YQppbmRleCAzMjQ2ZDg5Li4xNmIwNjg2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9QS0lYUGFyYW1ldGVycy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1BLSVhQYXJhbWV0ZXJzLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CkBAIC0zNyw4ICszMiwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHtAY29kZSBQS0lYIENlcnRQYXRoVmFsaWRhdG9yfS4KKyAqIDxwPgorICogVGhlIHBhcmFtZXRlcnMgbXVzdCBiZSBjcmVhdGVkIHdpdGggPGk+dHJ1c3RlZDwvaT4gY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMKKyAqICh0cnVzdCBhbmNob3JzKS4KKyAqIDwvcD4KICAqIAorICogQHNlZSBDZXJ0UGF0aFZhbGlkYXRvcgorICogQHNlZSBDZXJ0UGF0aFBhcmFtZXRlcnMKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUEtJWFBhcmFtZXRlcnMgaW1wbGVtZW50cyBDZXJ0UGF0aFBhcmFtZXRlcnMgewogICAgIC8vIFNldCBvZiB0cnVzdCBhbmNob3JzIC0gbW9zdCB0cnVzdGVkIENBcwpAQCAtNzAsNyArNzIsMTQgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gcG9saWN5UXVhbGlmaWVyc1JlamVjdGVkID0gdHJ1ZTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUEtJWFBhcmFtZXRlcnN9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBzZXQgb2YKKyAgICAgKiA8aT50cnVzdGVkPC9pPiBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJ1c3RBbmNob3JzCisgICAgICogICAgICAgICAgICB0aGUgdHJ1c3RlZCBDQXMuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHRydXN0QW5jaG9yc30gaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBLSVhQYXJhbWV0ZXJzKFNldDxUcnVzdEFuY2hvcj4gdHJ1c3RBbmNob3JzKQogICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC04Miw3ICs5MSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUEtJWFBhcmFtZXRlcnN9IGluc3RhbmNlIHdpdGggdGhlIHRydXN0ZWQge0Bjb2RlCisgICAgICogWDUwOUNlcnRpZmljYXRlfSBlbnRyaWVzIGZyb20gdGhlIHNwZWNpZmllZCB7QGNvZGUgS2V5U3RvcmV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlTdG9yZQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBzdG9yZSBjb250YWluaW5nIHRydXN0ZWQgY2VydGlmaWNhdGVzLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGtleVN0b3JlfSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGtleVN0b3JlfSBkb2VzIG5vdCBjb250YWluZWQgYW55IHRydXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSBlbnRyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUEtJWFBhcmFtZXRlcnMoS2V5U3RvcmUga2V5U3RvcmUpCiAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiwKQEAgLTExNSwxNCArMTM0LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgdW5tb2RpZmlhYmxlIHNldCBvZiB0aGUgPGk+dHJ1c3RlZDwvaT4gY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMuCisgICAgICogCisgICAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgdGhlIDxpPnRydXN0ZWQ8L2k+IGNlcnRpZmljYXRlIGF1dGhvcml0aWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8VHJ1c3RBbmNob3I+IGdldFRydXN0QW5jaG9ycygpIHsKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh0cnVzdEFuY2hvcnMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgc2V0IG9mIDxpPnRydXN0ZWQ8L2k+IGNlcnRpZmljYXRlIGF1dGhvcml0aWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0cnVzdEFuY2hvcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgPGk+dHJ1c3RlZDwvaT4gY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHRydXN0QW5jaG9yc30gaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RBbmNob3JzKFNldDxUcnVzdEFuY2hvcj4gdHJ1c3RBbmNob3JzKQogICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC0xMzYsMjEgKzE2NCwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSA8aT5hbnkgcG9saWN5IE9JRDwvaT4gd2lsbCBiZSBpbmhpYml0ZWQgaWYgaXQncworICAgICAqIGluY2x1ZGVkIGluIGEgY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIDxpPmFueSBwb2xpY3kgT0lEPC9pPiB3aWxsIGJlIGluaGliaXRlZCwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQW55UG9saWN5SW5oaWJpdGVkKCkgewogICAgICAgICByZXR1cm4gYW55UG9saWN5SW5oaWJpdGVkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSA8aT5hbnkgcG9saWN5IE9JRDwvaT4gc2hvdWxkIGJlIGluaGliaXRlZCBpZiBpdCdzCisgICAgICogaW5jbHVkZWQgaW4gYSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW55UG9saWN5SW5oaWJpdGVkCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIDxpPmFueSBwb2xpY3kgT0lEPC9pPiBzaG91bGQgYmUgaW5oaWJpdGVkLAorICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QW55UG9saWN5SW5oaWJpdGVkKGJvb2xlYW4gYW55UG9saWN5SW5oaWJpdGVkKSB7CiAgICAgICAgIHRoaXMuYW55UG9saWN5SW5oaWJpdGVkID0gYW55UG9saWN5SW5oaWJpdGVkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGVja2VycyBmb3IgdGhlIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGlzdCBpcyB1bm1vZGlmaWFibGUgYW5kIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSBjbG9uZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hlY2tlcnMgZm9yIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8UEtJWENlcnRQYXRoQ2hlY2tlcj4gZ2V0Q2VydFBhdGhDaGVja2VycygpIHsKICAgICAgICAgaWYgKGNlcnRQYXRoQ2hlY2tlcnMgPT0gbnVsbCkgewpAQCAtMTc0LDcgKzIxOSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiBjaGVja2VycyBmb3IgdGhlIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGlzdCBpcyBjb3BpZWQgYW5kIHRoZSBlbnRyaWVzIGFyZSBjbG9uZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjZXJ0UGF0aENoZWNrZXJzCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjaGVja2VycyBmb3IgdGhlIGNlcnRpZmljYXRpb24gcGF0aCwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfSB0byBjbGVhciB0aGUgY2hlY2tlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2VydFBhdGhDaGVja2VycyhMaXN0PFBLSVhDZXJ0UGF0aENoZWNrZXI+IGNlcnRQYXRoQ2hlY2tlcnMpIHsKICAgICAgICAgaWYgKGNlcnRQYXRoQ2hlY2tlcnMgPT0gbnVsbCB8fCBjZXJ0UGF0aENoZWNrZXJzLmlzRW1wdHkoKSkgewpAQCAtMTk1LDcgKzI0OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHtAY29kZSBQS0lYQ2VydFBhdGhDaGVja2VyfSB0byB0aGUgbGlzdCBvZgorICAgICAqIGNlcnRpZmljYXRpb24gcGF0aCBjaGVja2Vycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2hlY2tlcgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQS0lYQ2VydFBhdGhDaGVja2VyfSB0byBhZGQsIGlmIHtAY29kZSBudWxsfSwgaXQKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDZXJ0UGF0aENoZWNrZXIoUEtJWENlcnRQYXRoQ2hlY2tlciBjaGVja2VyKSB7CiAgICAgICAgIGlmIChjaGVja2VyID09IG51bGwpIHsKQEAgLTIxMSw3ICsyNzAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGUgc3RvcmVzIHRoYXQgYXJlIHVzZWQgdG8gZmluZCBjZXJ0aWZpY2F0ZXMKKyAgICAgKiBhbmQgQ1JMcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBsaXN0IG9mIGNlcnRpZmljYXRlIHN0b3Jlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxDZXJ0U3RvcmU+IGdldENlcnRTdG9yZXMoKSB7CiAgICAgICAgIGlmIChjZXJ0U3RvcmVzID09IG51bGwpIHsKQEAgLTIzMSw3ICsyOTQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldCB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZSBzdG9yZXMgdGhhdCBhcmUgdXNlZCB0byBmaW5kIGNlcnRpZmljYXRlcyBhbmQKKyAgICAgKiBDUkxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjZXJ0U3RvcmVzIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlIHN0b3Jlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDZXJ0U3RvcmVzKExpc3Q8Q2VydFN0b3JlPiBjZXJ0U3RvcmVzKSB7CiAgICAgICAgIGlmIChjZXJ0U3RvcmVzID09IG51bGwgfHwgY2VydFN0b3Jlcy5pc0VtcHR5KCkpIHsKQEAgLTI1Myw3ICszMjAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIEFkZHMgYSBjZXJ0aWZpY2F0ZSBzdG9yZSB0byB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZSBzdG9yZXMgdGhhdCBhcmUgdXNlZAorICAgICAqIHRvIGZpbmQgY2VydGlmaWNhdGVzIGFuZCBDUkxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdG9yZQorICAgICAqICAgICAgICAgICAgdGhlIHN0b3JlIHRvIGFkZCwgaWYge0Bjb2RlIG51bGx9LCBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ2VydFN0b3JlKENlcnRTdG9yZSBzdG9yZSkgewogICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkgewpAQCAtMjY5LDM1ICszNDEsNjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHRpbWUgZm9yIHdoaWNoIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGgKKyAgICAgKiBzaG91bGQgYmUgZXZhbHVhdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHRpbWUgZm9yIHRoZSB2YWxpZGF0aW9uLCBvciB7QGNvZGUgbnVsbH0gZm9yIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICB0aW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlIGdldERhdGUoKSB7CiAgICAgICAgIHJldHVybiBkYXRlID09IG51bGwgPyBudWxsIDogKERhdGUpZGF0ZS5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgdGltZSBmb3Igd2hpY2ggdGhlIHZhbGlkYXRpb24gb2YgdGhlIGNlcnRpZmljYXRpb24gcGF0aCBzb3VsZCBiZQorICAgICAqIGV2YWx1YXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgZm9yIHRoZSB2YWxpZGF0aW9uLCBvciB7QGNvZGUgbnVsbH0gZm9yIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICB0aW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKSB7CiAgICAgICAgIHRoaXMuZGF0ZSA9IChkYXRlID09IG51bGwgPyBudWxsIDogbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciBhbiBhY2NlcHRhYmxlIHBvbGljeSBuZWVkcyB0byBiZSBleHBsaWNpdCBpZGVudGlmaWVkIGluCisgICAgICogZXZlcnkgY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYW4gZXhwbGljaXQgcG9saWN5IGlzIHJlcXVpcmVkLCBvdGhlcndpc2Uge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFeHBsaWNpdFBvbGljeVJlcXVpcmVkKCkgewogICAgICAgICByZXR1cm4gZXhwbGljaXRQb2xpY3lSZXF1aXJlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgd2hldGhlciBhbiBhbiBhY2NlcHRhYmxlIHBvbGljeSBuZWVkcyB0byBiZSBleHBsaWNpdCBpZGVudGlmaWVkIGluCisgICAgICogZXZlcnkgY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHBhcmFtIGV4cGxpY2l0UG9saWN5UmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBhbiBleHBsaWNpdCBwb2xpY3kgaXMgcmVxdWlyZWQsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFeHBsaWNpdFBvbGljeVJlcXVpcmVkKGJvb2xlYW4gZXhwbGljaXRQb2xpY3lSZXF1aXJlZCkgewogICAgICAgICB0aGlzLmV4cGxpY2l0UG9saWN5UmVxdWlyZWQgPSBleHBsaWNpdFBvbGljeVJlcXVpcmVkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBwb2xpY2llcyAoYXMgT0lEIHN0cmluZ3MpIHRoYXQgd291bGQgYmUgYWNjZXB0YWJsZQorICAgICAqIGZvciB0aGUgcHVycG9zZSBvZiBjZXJ0aWZpY2F0aW9uIHBhdGggcHJvY2Vzc2luZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB1bm1vZGlmaWFibGUgbGlzdCBvZiBwb2xpY2llcywgb3IgYW4gZW1wdHkgc2V0IGlmIGFueSBwb2xpY3kKKyAgICAgKiAgICAgICAgIGlzIGFjY2VwdGFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEluaXRpYWxQb2xpY2llcygpIHsKICAgICAgICAgaWYgKGluaXRpYWxQb2xpY2llcyA9PSBudWxsKSB7CkBAIC0zMTYsNyArNDE1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHBvbGljaWVzIChhcyBPSUQgc3RyaW5ncykgdGhhdCB3b3VsZCBiZSBhY2NlcHRhYmxlIGZvcgorICAgICAqIHRoZSBwdXJwb3NlIG9mIGNlcnRpZmljYXRpb24gcGF0aCBwcm9jZXNzaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbml0aWFsUG9saWNpZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIHBvbGljaWVzLCBvciBhbiBlbXB0eSBzZXQgb3Ige0Bjb2RlIG51bGx9IGlmIGFueQorICAgICAqICAgICAgICAgICAgcG9saWN5IGlzIGFjY2VwdGFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFBvbGljaWVzKFNldDxTdHJpbmc+IGluaXRpYWxQb2xpY2llcykgewogICAgICAgICBpZiAoaW5pdGlhbFBvbGljaWVzID09IG51bGwgfHwgaW5pdGlhbFBvbGljaWVzLmlzRW1wdHkoKSkgewpAQCAtMzM5LDYzICs0NDQsMTExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcG9saWN5IG1hcHBpbmcgaXMgaW5oaWJpdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHBvbGljeSBtYXBwaW5nIGlzIGluaGliaXRlZCwgb3RoZXJ3aXNlIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUG9saWN5TWFwcGluZ0luaGliaXRlZCgpIHsKICAgICAgICAgcmV0dXJuIHBvbGljeU1hcHBpbmdJbmhpYml0ZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHdoZXRoZXIgcG9saWN5IG1hcHBpbmcgaXMgdG8gYmUgaW5oaWJpdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb2xpY3lNYXBwaW5nSW5oaWJpdGVkCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgcG9saWN5IG1hcHBpbmcgaXMgdG8gYmUgaW5oaWJpdGVkLCBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UG9saWN5TWFwcGluZ0luaGliaXRlZChib29sZWFuIHBvbGljeU1hcHBpbmdJbmhpYml0ZWQpIHsKICAgICAgICAgdGhpcy5wb2xpY3lNYXBwaW5nSW5oaWJpdGVkID0gcG9saWN5TWFwcGluZ0luaGliaXRlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciBjZXJ0aWZpY2F0ZXMgYXJlIHJlamVjdGVkIHRoYXQgaW5jbHVkZSBwb2xpY3kKKyAgICAgKiBxdWFsaWZpZXJzIGluIGEgY2VydGlmaWNhdGUgcG9saWN5IGV4dGVuc2lvbiB0aGF0IGlzIG1hcmtlZCBhcyBjcml0aWNhbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2VydGlmaWNhdGVzIHNob3VsZCBiZSByZWplY3RlZCwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCgpIHsKICAgICAgICAgcmV0dXJuIHBvbGljeVF1YWxpZmllcnNSZWplY3RlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgd2hldGhlciBjZXJ0aWZpY2F0ZXMgc2hvdWxkIGJlIHJlamVjdGVkIHRoYXQgaW5jbHVkZSBwb2xpY3kKKyAgICAgKiBxdWFsaWZpZXJzIGluIGEgY2VydGlmaWNhdGUgcG9saWN5IGV4dGVuc2lvbiB0aGF0IGlzIG1hcmtlZCBhcyBjcml0aWNhbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9saWN5UXVhbGlmaWVyc1JlamVjdGVkCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNlcnRpZmljYXRlcyBzaG91bGQgYmUgcmVqZWN0ZWQsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQoYm9vbGVhbiBwb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQpIHsKICAgICAgICAgdGhpcy5wb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQgPSBwb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRlZmF1bHQgcmV2b2NhdGlvbiBjaGVja2luZyBtZWNoYW5pc20gb2YgdGhlCisgICAgICogdW5kZXJseWluZyBzZXJ2aWNlIHByb3ZpZGVyIGlzIHVzZWQuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRlZmF1bHQgcmV2b2NhdGlvbiBjaGVja2luZyBtZWNoYW5pc20gaXMKKyAgICAgKiAgICAgICAgIHVzZWQsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUmV2b2NhdGlvbkVuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiByZXZvY2F0aW9uRW5hYmxlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgd2hldGhlciB0aGUgZGVmYXVsdCByZXZvY2F0aW9uIGNoZWNraW5nIG1lY2hhbmlzbSBvZiB0aGUgdW5kZXJseWluZworICAgICAqIHNlcnZpY2UgcHJvdmlkZXIgc2hvdWxkIGJlIHVzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHJldm9jYXRpb25FbmFibGVkCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWQgdGhlIGRlZmF1bHQgcmV2b2NhdGlvbiBjaGVja2luZyBtZWNoYW5pc20KKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZXZvY2F0aW9uRW5hYmxlZChib29sZWFuIHJldm9jYXRpb25FbmFibGVkKSB7CiAgICAgICAgIHRoaXMucmV2b2NhdGlvbkVuYWJsZWQgPSByZXZvY2F0aW9uRW5hYmxlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNpZ25hdHVyZSBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzaWduYXR1cmUgcHJvdmlkZXIsIG9yIHtAY29kZSBudWxsfSBpZiBub25lIGlzCisgICAgICogICAgICAgICBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTaWdQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIHNpZ1Byb3ZpZGVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIHNpZ25hdHVyZSBwcm92aWRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBzZXQsIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgd2lsbCBiZSBwcmVmZXJyZWQgZm9yIGNyZWF0aW5nIHNpZ25hdHVyZXMuCisgICAgICogSWYgbm90IHNldCwgdGhlIGZpcnN0IHByb3ZpZGVyIGZvdW5kIHN1cHBvcnRpbmcgY3JlYXRpb24gb2Ygc2lnbmF0dXJlcworICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2lnUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJyZWQgc2lnbmF0dXJlIHByb3ZpZGVyLCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgICAgIGlmIG5vbmUgaXMgcHJlZmVycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpZ1Byb3ZpZGVyKFN0cmluZyBzaWdQcm92aWRlcikgewogICAgICAgICB0aGlzLnNpZ1Byb3ZpZGVyID0gc2lnUHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjb25zdHJhaW50cyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIHRhcmdldCBjZXJ0aWZpY2F0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25zdHJhaW50cyBmb3IgdGhlIHRhcmdldCBjZXJ0aWZpY2F0ZSwgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICBub25lIGFyZSBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRTZWxlY3RvciBnZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoKSB7CiAgICAgICAgIHJldHVybiAodGFyZ2V0Q2VydENvbnN0cmFpbnRzID09IG51bGwgPyBudWxsCkBAIC00MDMsNyArNTU2LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjb25zdHJhaW50cyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIHRhcmdldCBjZXJ0aWZpY2F0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q2VydENvbnN0cmFpbnRzCisgICAgICogICAgICAgICAgICB0aGUgY29uc3RyYWludHMgZm9yIHRoZSB0YXJnZXQgY2VydGlmaWNhdGUsIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgICAgbm9uZSBzaG91bGQgYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoQ2VydFNlbGVjdG9yIHRhcmdldENlcnRDb25zdHJhaW50cykgewogICAgICAgICB0aGlzLnRhcmdldENlcnRDb25zdHJhaW50cyA9ICh0YXJnZXRDZXJ0Q29uc3RyYWludHMgPT0gbnVsbCA/IG51bGwKQEAgLTQxMSw3ICs1NjksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb25lcyB0aGlzIHtAY29kZSBQS0lYUGFyYW1ldGVyc30gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2xvbmVkIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIHRyeSB7CkBAIC00MzEsNyArNTkyLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFBLSVhQYXJhbWV0ZXJzfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFBLSVhQYXJhbWV0ZXJzfSBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUG9saWN5Tm9kZS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUG9saWN5Tm9kZS5qYXZhCmluZGV4IDI0ZGRkNWIuLmMxMTJhOGEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1BvbGljeU5vZGUuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9Qb2xpY3lOb2RlLmphdmEKQEAgLTE1LDU0ICsxNSw4MSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSB0byBhIHZhbGlkIHBvbGljeSB0cmVlIG5vZGUgZm9yIHRoZSBQS0lYIGNlcnRpZmljYXRpb24gcGF0aAorICogdmFsaWRhdGlvbiBhbGdvcml0aG0uCisgKiA8cD4KKyAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBvbmUgb2YgdGhlIG91dHB1dHMgb2YgdGhlIFBLSVggY2VydGlmaWNhdGlvbiBwYXRoCisgKiB2YWxpZGF0aW9uIGFsZ29yaXRobS4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUG9saWN5Tm9kZSB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBub2RlIGFzIGFuIHtAY29kZSBJdGVyYXRvcn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgYXMgYW4ge0Bjb2RlIEl0ZXJhdG9yfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIFBvbGljeU5vZGU+IGdldENoaWxkcmVuKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGRlcHRoIG9mIHRoaXMgbm9kZSBpbiB0aGUgcG9saWN5IHRyZWUuCisgICAgICogPHA+CisgICAgICogdGhlIGRlcHRoIGlzIHplcm8gYmFzZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRlcHRoIG9mIHRoaXMgbm9kZSBpbiB0aGUgcG9saWN5IHRyZWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREZXB0aCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBleHBlY3RlZCBwb2xpY2llcyBmb3IgdGhlIG5leHQgY2VydGlmaWNhdGUgdG8gYmUgdmFsaWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZXhwZWN0ZWQgcG9saWNpZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEV4cGVjdGVkUG9saWNpZXMoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcGFyZW50IHBvbGljeSBub2RlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBwb2xpY3kgbm9kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUG9saWN5Tm9kZSBnZXRQYXJlbnQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcG9saWN5IHF1YWxpZmllcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb2xpY3kgb2YgdGhpcyBub2RlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBvbGljeSBxdWFsaWZpZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9saWN5IG9mIHRoaXMgbm9kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2V0PD8gZXh0ZW5kcyBQb2xpY3lRdWFsaWZpZXJJbmZvPiBnZXRQb2xpY3lRdWFsaWZpZXJzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHZhbGlkIHBvbGljeSBvZiB0aGlzIG5vZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmFsaWQgcG9saWN5IG9mIHRoaXMgbm9kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkUG9saWN5KCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2VydGlmaWNhdGUgcG9saWN5IGV4dGVuc2lvbiBvZiB0aGUgbW9zdCByZWNlbnRseQorICAgICAqIHByb2Nlc3NlZCBjZXJ0aWZpY2F0ZSBpcyBtYXJrZWQgYXMgY3JpdGljYWwuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGV4dGVuc2lvbiBpcyBtYXJrZWQgYXMgY3JpdGljYWwsIG90aGVyd2lzZQorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NyaXRpY2FsKCk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9Qb2xpY3lRdWFsaWZpZXJJbmZvLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9Qb2xpY3lRdWFsaWZpZXJJbmZvLmphdmEKaW5kZXggYWNhZDNiYy4uNWE2M2Q1MSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvUG9saWN5UXVhbGlmaWVySW5mby5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1BvbGljeVF1YWxpZmllckluZm8uamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMCw4ICsyNSwxMCBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHBvbGljeSBxdWFsaWZpZXIgYXMgZGVmaW5lZCBieSB0aGUgQVNOLjEKKyAqIHtAY29kZSBQb2xpY3lRdWFsaWZpZXJJbmZvfSBzdHJ1Y3R1cmUuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUG9saWN5UXVhbGlmaWVySW5mbyB7CiAgICAgLy8gVGhpcyBQb2xpY3lRdWFsaWZpZXJJbmZvIERFUiBlbmNvZGluZwpAQCAtNDQsNyArNDEsMTQgQEAKICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBwb2xpY3lRdWFsaWZpZXI7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFBvbGljeVF1YWxpZmllckluZm99IGZyb20gdGhlIHNwZWNpZmllZCBlbmNvZGVkCisgICAgICogZm9ybS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW5jb2RlZAorICAgICAqICAgICAgICAgICAgdGhlIERFUiBlbmNvZGVkIHBvbGljeSBxdWFsaWZpZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHRoZSBwb2xpY3kgcXVhbGlmaWVyIGNhbm5vdCBiZSBkZWNvZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQb2xpY3lRdWFsaWZpZXJJbmZvKGJ5dGVbXSBlbmNvZGVkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoZW5jb2RlZCA9PSBudWxsKSB7CkBAIC02NCw3ICs2OCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIEFTTi4xIERFUiBlbmNvZGVkIGNvcHkgb2YgcG9saWN5IHF1YWxpZmllciBpbmZvLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBBU04uMSBERVIgZW5jb2RlZCBjb3B5IG9mIHBvbGljeSBxdWFsaWZpZXIgaW5mby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldEVuY29kZWQoKSB7CiAgICAgICAgIGJ5dGVbXSByZXQgPSBuZXcgYnl0ZVtlbmNvZGVkLmxlbmd0aF07CkBAIC03MywxNCArODAsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgKGFuIE9JRCkgb2YgdGhpcyBwb2xpY3kgcXVhbGlmaWVyIGluZm8uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBxdWFsaWZpZXIgaW5mby4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBvbGljeVF1YWxpZmllcklkKCkgewogICAgICAgICByZXR1cm4gcG9saWN5UXVhbGlmaWVySWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgQVNOLjEgREVSIGVuY29kZWQgY29weSBvZiB0aGUgcXVhbGlmaWVyIG9mIHRoaXMgcG9saWN5CisgICAgICogcXVhbGlmaWVyIGluZm8uCisgICAgICogCisgICAgICogQHJldHVybiBhIEFTTi4xIERFUiBlbmNvZGVkIGNvcHkgb2YgdGhlIHF1YWxpZmllciBvZiB0aGlzIHBvbGljeQorICAgICAqICAgICAgICAgcXVhbGlmaWVyIGluZm8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBnZXRQb2xpY3lRdWFsaWZpZXIoKSB7CiAgICAgICAgIGlmIChwb2xpY3lRdWFsaWZpZXIgPT0gbnVsbCkgewpAQCAtOTIsNyArMTA3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFBvbGljeVF1YWxpZmllckluZm99CisgICAgICogaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBQb2xpY3lRdWFsaWZpZXJJbmZvfQorICAgICAqICAgICAgICAgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1RydXN0QW5jaG9yLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9UcnVzdEFuY2hvci5qYXZhCmluZGV4IDZkMGNjM2IuLjlkYzIwMjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1RydXN0QW5jaG9yLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvVHJ1c3RBbmNob3IuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zNCw4ICsyOSwxNiBAQAogCiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRydXN0IGFuY2hvciBmb3IgdmFsaWRhdGlvbiBvZiBYLjUwOSBjZXJ0aWZpY2F0aW9uCisgKiBwYXRoLgorICogPHA+CisgKiBJdCBpcyBhIDxpPnRydXN0ZWQ8L2k+IGNlcnRpZmljYXRlIGF1dGhvcml0eSAoQ0EpIGFuZCBpbmNsdWRlcyB0aGUgcHVibGljIGtleQorICogb2YgdGhlIENBLCB0aGUgQ0EncyBuYW1lIGFuZCB0aGUgY29uc3RyYWludHMgZm9yIHRoZSB2YWxpZGF0aW9uIG9mCisgKiBjZXJ0aWZpY2F0aW9uIHBhdGhzLiBUaGUgY29uc3RydWN0b3IgYWxzbyBhbGxvd3MgdG8gc3BlY2lmeSBhIGJpbmFyeQorICogcmVwcmVzZW50YXRpb24gb2YgYSBzbyBjYWxsZWQgIk5hbWUgQ29uc3RyYWludHMiIGV4dGVuc2lvbiBhcyBhIGJ5dGUgYXJyYXkuCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgVHJ1c3RBbmNob3IgewogICAgIC8vIE1vc3QgdHJ1c3RlZCBDQSBhcyBhIFg1MDBQcmluY2lwYWwKQEAgLTUwLDcgKzUzLDIxIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbmFtZUNvbnN0cmFpbnRzOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBUcnVzdEFuY2hvcn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlIGFuZCBuYW1lCisgICAgICogY29uc3RyYWludHMuCisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgY29uc3RyYWludHMgd2lsbCBiZSB1c2VkIGFzIGFkZGl0aW9uYWwgY29uc3RyYWludHMgZHVyaW5nIHRoZQorICAgICAqIHZhbGlkYXRpb24gb2YgY2VydGlmaWNhdGlvbiBwYXRocy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHRydXN0ZWRDZXJ0CisgICAgICogICAgICAgICAgICB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZQorICAgICAqIEBwYXJhbSBuYW1lQ29uc3RyYWludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBBU04uMSBERVIgZW5jb2RlZCBmb3JtIG9mIHRoZSBuYW1lIGNvbnN0cmFpbnRzIG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgbnVsbH0gaWYgbm9uZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBkZWNvZGluZyBvZiB0aGUgbmFtZSBjb25zdHJhaW50cyBmYWlsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUcnVzdEFuY2hvcihYNTA5Q2VydGlmaWNhdGUgdHJ1c3RlZENlcnQsIGJ5dGVbXSBuYW1lQ29uc3RyYWludHMpIHsKICAgICAgICAgaWYgKHRydXN0ZWRDZXJ0ID09IG51bGwpIHsKQEAgLTcyLDcgKzg5LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBUcnVzdEFuY2hvcn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlCisgICAgICogYXV0aG9yaXR5IG5hbWUsIGl0cyBwdWJsaWMga2V5IGFuZCB0aGUgc3BlY2lmaWVkIG5hbWUgY29uc3RyYWludHMuCisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgY29uc3RyYWludHMgd2lsbCBiZSB1c2VkIGFzIGFkZGl0aW9uYWwgY29uc3RyYWludHMgZHVyaW5nIHRoZQorICAgICAqIHZhbGlkYXRpb24gb2YgY2VydGlmaWNhdGlvbiBwYXRocy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNhTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIFguNTAwIG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eSBpbiBSRkMgMjI1MworICAgICAqICAgICAgICAgICAge0Bjb2RlIFN0cmluZ30gZm9ybWF0LgorICAgICAqIEBwYXJhbSBjYVB1YmxpY0tleQorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eQorICAgICAqIEBwYXJhbSBuYW1lQ29uc3RyYWludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBBU04uMSBERVIgZW5jb2RlZCBmb3JtIG9mIHRoZSBuYW1lIGNvbnN0cmFpbnRzIG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgbnVsbH0gaWYgbm9uZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB7QGNvZGUgY2FOYW1lfSBpcyBlbXB0eSBvciBpZiBkZWNvZGluZyBvZiB0aGUgbmFtZQorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzIGZhaWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRydXN0QW5jaG9yKFN0cmluZyBjYU5hbWUsIFB1YmxpY0tleSBjYVB1YmxpY0tleSwKICAgICAgICAgICAgIGJ5dGVbXSBuYW1lQ29uc3RyYWludHMpIHsKQEAgLTEwNSw3ICsxNDAsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFRydXN0QW5jaG9yfSB3aXRoIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUKKyAgICAgKiBhdXRob3JpdHkgbmFtZSBhcyBwcmluY2lwYWwsIGl0cyBwdWJsaWMga2V5IGFuZCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKiBjb25zdHJhaW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBjb25zdHJhaW50cyB3aWxsIGJlIHVzZWQgYXMgYWRkaXRpb25hbCBjb25zdHJhaW50cyBkdXJpbmcgdGhlCisgICAgICogdmFsaWRhdGlvbiBvZiBjZXJ0aWZpY2F0aW9uIHBhdGhzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FQcmluY2lwYWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgYXMgWDUwMCBwcmluY2lwYWwuCisgICAgICogQHBhcmFtIGNhUHVibGljS2V5CisgICAgICogICAgICAgICAgICB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGUgYXV0aG9yaXR5LgorICAgICAqIEBwYXJhbSBuYW1lQ29uc3RyYWludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBBU04uMSBERVIgZW5jb2RlZCBmb3JtIG9mIHRoZSBuYW1lIGNvbnN0cmFpbnRzIG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgbnVsbH0gaWYgbm9uZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlY29kaW5nIG9mIHRoZSBuYW1lIGNvbnN0cmFpbnRzIGZhaWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRydXN0QW5jaG9yKFg1MDBQcmluY2lwYWwgY2FQcmluY2lwYWwsCiAgICAgICAgICAgICBQdWJsaWNLZXkgY2FQdWJsaWNLZXksIGJ5dGVbXSBuYW1lQ29uc3RyYWludHMpIHsKQEAgLTEzMiw3ICsxODQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBuYW1lIGNvbnN0cmFpbnRzIGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm0uCisgICAgICogCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIG5hbWUgY29uc3RyYWludHMgaW4gQVNOLjEgREVSIGVuY29kZWQgZm9ybS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldE5hbWVDb25zdHJhaW50cygpIHsKICAgICAgICAgaWYgKG5hbWVDb25zdHJhaW50cyA9PSBudWxsKSB7CkBAIC0xNDUsMzUgKzIwMCw1OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgb2YgdGhpcyA8aT50cnVzdGVkPC9pPiBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUgb2YgdGhpcyBDQSBvciB7QGNvZGUgbnVsbH0sIGlmIHRoZSB0cnVzdCBhbmNob3IKKyAgICAgKiAgICAgICAgIG9mIHRoaXMgaW5zdGFuY2Ugd2FzIG5vdCBjcmVhdGVkIHdpdGggYSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgWDUwOUNlcnRpZmljYXRlIGdldFRydXN0ZWRDZXJ0KCkgewogICAgICAgICByZXR1cm4gdHJ1c3RlZENlcnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgYXMge0Bjb2RlIFg1MDBQcmluY2lwYWx9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICB0cnVzdCBhbmNob3Igb2YgdGhpcyBpbnN0YW5jZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCBhIHtAY29kZQorICAgICAqICAgICAgICAgWDUwMFByaW5jaXBhbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFg1MDBQcmluY2lwYWwgZ2V0Q0EoKSB7CiAgICAgICAgIHJldHVybiBjYVByaW5jaXBhbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eSBhcyB7QGNvZGUgU3RyaW5nfSBpbiBSRkMKKyAgICAgKiAyMjUzIGZvcm1hdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgYXMge0Bjb2RlIFN0cmluZ30gaW4gUkZDCisgICAgICogICAgICAgICAyMjUzIGZvcm1hdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHRydXN0IGFuY2hvciBvZiB0aGlzIGluc3RhbmNlCisgICAgICogICAgICAgICB3YXMgbm90IGNyZWF0ZWQgd2l0aCBhIENBIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDQU5hbWUoKSB7CiAgICAgICAgIHJldHVybiBjYU5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGUgYXV0aG9yaXR5IG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIHRydXN0IGFuY2hvciBpZiB0aGlzIGluc3RhbmNlIHdhcyBub3QgY3JlYXRlZCB3aXRoIGEgcHVibGljCisgICAgICogICAgICAgICBrZXkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFB1YmxpY0tleSBnZXRDQVB1YmxpY0tleSgpIHsKICAgICAgICAgcmV0dXJuIGNhUHVibGljS2V5OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBUcnVzdEFuY2hvcn0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBUcnVzdEFuY2hvcn0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVHJ1c3RBbmNob3I6IFtcbiIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMLmphdmEKaW5kZXggZTUwMmYyZi4uZWFiZGI2OCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNSTC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDUkwuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKQEAgLTQyLDE5ICszNywzNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFguNTA5IGNlcnRpZmljYXRlIHJldm9jYXRpb24gbGlzdHMgKENSTCkuCisgKiA8cD4KKyAqIE1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIENSTCBjYW4gYmUgZm91bmQgaW4gUkZDIDI0NTksCisgKiAiSW50ZXJuZXQgWC41MDkgUHVibGljIEtleSBJbmZyYXN0cnVjdHVyZSBDZXJ0aWZpY2F0ZSBhbmQgQ1JMIFByb2ZpbGUiIGF0IDxhCisgKiBocmVmCisgKiA9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI0NTkudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyNDU5LnR4dAorICogPC9hPi4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYNTA5Q1JMIGV4dGVuZHMgQ1JMIGltcGxlbWVudHMgWDUwOUV4dGVuc2lvbiB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFg1MDlDUkx9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBYNTA5Q1JMKCkgewogICAgICAgICBzdXBlcigiWC41MDkiKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGVxdWFscyB0byB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMsIG90aGVyd2lzZQorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CiAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKSB7CkBAIC03Miw3ICs4NCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgaGFzaGNvZGUgb2YgdGhpcyBDUkwgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaGNvZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTg4LDEzICsxMDMsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhpcyBDUkwgaW4gQVNOLjEgREVSIGVuY29kZWQgZm9ybS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgQ1JMIGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm0uCisgICAgICogQHRocm93cyBDUkxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlbmNvZGluZyBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEVuY29kZWQoKSB0aHJvd3MgQ1JMRXhjZXB0aW9uOwogCiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFZlcmlmaWVzIHRoaXMgQ1JMIGJ5IHZlcmlmeWluZyB0aGF0IHRoaXMgQ1JMIHdhcyBzaWduZWQgd2l0aCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHByaXZhdGUga2V5IHRvIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgcHVibGljIGtleSB0byB2ZXJpZnkgdGhpcyBDUkwgd2l0aC4KKyAgICAgKiBAdGhyb3dzIENSTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVuY29kaW5nIG9yIGRlY29kaW5nIGZhaWxzLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBuZWVkZWQgYWxnb3JpdGhtIGlzIG5vdCBwcmVzZW50LgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGludmFsaWQuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIHByb3ZpZGVyIGNhbiBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9ycyBvY2N1ciBvbiBzaWduYXR1cmVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5KQogICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENSTEV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLApAQCAtMTAyLDcgKzEzNywyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVmVyaWZpZXMgdGhpcyBDUkwgYnkgdmVyaWZ5aW5nIHRoYXQgdGhpcyBDUkwgd2FzIHNpZ25lZCB3aXRoIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgcHJpdmF0ZSBrZXkgdG8gdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5LiBUaGUgc2lnbmF0dXJlCisgICAgICogdmVyaWZpY2F0aW9uIGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIHdpbGwgYmUgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgcHVibGljIGtleSB0byB2ZXJpZnkgdGhpcyBDUkwgd2l0aC4KKyAgICAgKiBAcGFyYW0gc2lnUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciBmb3IgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBDUkxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlbmNvZGluZyBkZWNvZGluZyBmYWlscy4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgbmVlZGVkIGFsZ29yaXRobSBpcyBub3QgcHJlc2VudC4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBpbnZhbGlkLgorICAgICAqIEB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVycm9ycyBvY2N1ciBvbiBzaWduYXR1cmVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5LCBTdHJpbmcgc2lnUHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ1JMRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCkBAIC0xMTAsMTcgKzE2MywyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBDUkwuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBDUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRWZXJzaW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIDxiPkRvIG5vdCB1c2U8L2I+LCB1c2Uge0BsaW5rICNnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCl9IGluc3RlYWQuIFJldHVybnMKKyAgICAgKiB0aGUgaXNzdWVyIGFzIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIFByaW5jaXBhbCBvYmplY3QuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUHJpbmNpcGFsIGdldElzc3VlckROKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGlzc3VlciBkaXN0aW5ndWlzaGVkIG5hbWUgb2YgdGhpcyBDUkwuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZSBvZiB0aGlzIENSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgWDUwMFByaW5jaXBhbCBnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkgewogICAgICAgICB0cnkgewpAQCAtMTQwLDIyICsyMDMsNDEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSB0aGlzVXBkYXRlfSB2YWx1ZSBvZiB0aGlzIENSTC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgdGhpc1VwZGF0ZX0gdmFsdWUgb2YgdGhpcyBDUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERhdGUgZ2V0VGhpc1VwZGF0ZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgbmV4dFVwZGF0ZX0gdmFsdWUgb2YgdGhpcyBDUkwuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIG5leHRVcGRhdGV9IHZhbHVlIG9mIHRoaXMgQ1JMLCBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZQorICAgICAqICAgICAgICAgaXMgcHJlc2VudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRGF0ZSBnZXROZXh0VXBkYXRlKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIENSTCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgc2VyaWFsIG51bWJlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VyaWFsTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgc2VyaWFsIG51bWJlciB0byBzZWFyY2ggZm9yIGEgQ1JMIGVudHJ5LgorICAgICAqIEByZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlIHNlcmlhbCBudW1iZXIsIG9yIHtAY29kZQorICAgICAqICAgICAgICAgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBYNTA5Q1JMRW50cnkgZ2V0UmV2b2tlZENlcnRpZmljYXRlKEJpZ0ludGVnZXIgc2VyaWFsTnVtYmVyKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgQ1JMIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjZXJ0aWZpY2F0ZQorICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHRvIHNlYXJjaCBhIENSTCBlbnRyeSBmb3IuCisgICAgICogQHJldHVybiB0aGUgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUsIG9yIHtAY29kZSBudWxsfSBpZiBub3QKKyAgICAgKiAgICAgICAgIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBYNTA5Q1JMRW50cnkgZ2V0UmV2b2tlZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgewogICAgICAgICBpZiAoY2VydGlmaWNhdGUgPT0gbnVsbCkgewpAQCAtMTY1LDMyICsyNDcsNTUgQEAKICAgICB9CiAgICAgICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHJldm9rZWQgY2VydGlmaWNhdGVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiByZXZva2VkIGNlcnRpZmljYXRlcywgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHJldm9rZWQKKyAgICAgKiAgICAgICAgIGNlcnRpZmljYXRlcyBhcmUgaW4gdGhpcyBDUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNldDw/IGV4dGVuZHMgWDUwOUNSTEVudHJ5PiBnZXRSZXZva2VkQ2VydGlmaWNhdGVzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSB0YnNDZXJ0TGlzdH0gaW5mb3JtYXRpb24gb2YgdGhpcyBDUkwgaW4gREVSIGVuY29kZWQKKyAgICAgKiBmb3JtLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIENSTCBpbmZvcm1hdGlvbiBpbiBERVIgZW5jb2RlZCBmb3JtLgorICAgICAqIEB0aHJvd3MgQ1JMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZW5jb2RpbmcgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRUQlNDZXJ0TGlzdCgpIHRocm93cyBDUkxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNpZ25hdHVyZSBieXRlcyBvZiB0aGlzIENSTC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgYnl0ZXMgb2YgdGhpcyBDUkwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRTaWduYXR1cmUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2lnQWxnTmFtZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBPSUQgb2YgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgT0lEIG9mIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2lnQWxnT0lEKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gaW4gREVSIGVuY29kZWQgZm9ybS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIGluIERFUiBlbmNvZGVkIGZvcm0sIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgbm90IHByZXNlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRTaWdBbGdQYXJhbXMoKTsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDUkxFbnRyeS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNSTEVudHJ5LmphdmEKaW5kZXggZDcyNmY5ZC4uMzVmYjc4YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNSTEVudHJ5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNSTEVudHJ5LmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwpAQCAtMzEsMTcgKzI2LDI4IEBACiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGVudHJpZXMgaW4gYSBjZXJ0aWZpY2F0ZSByZXZvY2F0aW9uIGxpc3QgKENSTCkuCisgKiAKKyAqIEBzZWUgWDUwOUNSTAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYNTA5Q1JMRW50cnkgaW1wbGVtZW50cyBYNTA5RXh0ZW5zaW9uIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgWDUwOUNSTEVudHJ5fSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgWDUwOUNSTEVudHJ5KCkge30KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGVxdWFscyB0byB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGVxdWFscyB0byB0aGlzIGluc3RhbmNlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewogICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykgewpAQCAtNTksNyArNjUsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGhhc2hjb2RlIG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaGNvZGUgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBpbnQgcmVzID0gMDsKQEAgLTc0LDMxICs4Myw1NiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGlzIGVudHJ5IGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBmb3JtIG9mIHRoaXMgZW50cnkuCisgICAgICogQHRocm93cyBDUkxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlbmNvZGluZyBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEVuY29kZWQoKSB0aHJvd3MgQ1JMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSByZXZva2VkIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIHJldm9rZWQgY2VydGlmaWNhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJpZ0ludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpc3N1ZXIgb2YgdGhlIHJldm9rZWQgY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaXNzdWVyIG9mIHRoZSByZXZva2VkIGNlcnRpZmljYXRlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICBpc3N1ZXIgaXMgZXF1YWwgdG8gdGhlIENSTCBpc3N1ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFg1MDBQcmluY2lwYWwgZ2V0Q2VydGlmaWNhdGVJc3N1ZXIoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgZGF0ZSB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBpcyByZXZva2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRhdGUgd2hlbiB0aGUgY2VydGlmaWNhdGUgaXMgcmV2b2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRGF0ZSBnZXRSZXZvY2F0aW9uRGF0ZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBDUkwgZW50cnkgaGFzIGV4dGVuc2lvbnMuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaXMgdGhpcyBDUkwgZW50cnkgaGFzIGV4dGVuc2lvbnMsIG90aGVyd2lzZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNFeHRlbnNpb25zKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNSTFNlbGVjdG9yLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMU2VsZWN0b3IuamF2YQppbmRleCBkNjc5ZTk5Li5jMWI1ZjQ1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMU2VsZWN0b3IuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMU2VsZWN0b3IuamF2YQpAQCAtMTUsMTAgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSAqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCiAKIHBhY2thZ2UgamF2YS5zZWN1cml0eS5jZXJ0OwogCkBAIC0zNiw3ICszMiwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWU7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIEEgQ1JMIHNlbGVjdG9yICh7QGNvZGUgQ1JMU2VsZWN0b3J9IGZvciBzZWxlY3Rpbmcge0Bjb2RlCisgKiBYNTA5Q1JMfXMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLgorICogPHA+CisgKiBXaGVuIGNvbnN0cnVjdGVkLCBhbGwgY3JpdGVyaWEgYXJlIHNldCB0byBkZWZhdWx0IHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2ggYW55CisgKiB7QGNvZGUgWDUwOUNSTH0uICAKKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBYNTA5Q1JMU2VsZWN0b3IgaW1wbGVtZW50cyBDUkxTZWxlY3RvciB7CiAKQEAgLTU2LDEyICs1OSwyMyBAQAogICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlQ2hlY2tpbmc7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFg1MDlDZXJ0U2VsZWN0b3J9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBYNTA5Q1JMU2VsZWN0b3IoKSB7IH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgY3JpdGVyaW9uIGZvciB0aGUgaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZXMuCisgICAgICogPHA+CisgICAgICogVGhlIENSTCBpc3N1ZXIgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZCBkaXN0aW5ndWlzaGVkCisgICAgICogbmFtZXMuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBpc3N1ZXJzCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBpc3N1ZXIgZGlzdGluZ3Vpc2hlZCBuYW1lcyB0byBtYXRjaCwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfSBpZiBhbnkgaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZSB3aWxsIGRvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElzc3VlcnMoQ29sbGVjdGlvbjxYNTAwUHJpbmNpcGFsPiBpc3N1ZXJzKSB7CiAgICAgICAgIGlmIChpc3N1ZXJzID09IG51bGwpIHsKQEAgLTc3LDcgKzkxLDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiA8Yj5EbyBub3QgdXNlOjwvYj4gdXNlIHtAbGluayAjc2V0SXNzdWVycyhDb2xsZWN0aW9uKX0gb3Igb25lIG9mCisgICAgICoge0BsaW5rICNhZGRJc3N1ZXJOYW1lfSBpbnN0ZWFkLiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBpc3N1ZXIKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG5hbWVzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBDUkwgaXNzdWVyIG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgZGlzdGluZ3Vpc2hlZAorICAgICAqIG5hbWVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciB7QGNvZGUgbmFtZXN9IGlzIGEgY29sbGVjdGlvbiB3aXRoIGFuIGVudHJ5IGZvcgorICAgICAqIGVhY2ggbmFtZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY3JpdGVyaW9uLiBUaGUgbmFtZSBpcyBzcGVjaWZpZWQgYXMgYQorICAgICAqIHtAY29kZSBTdHJpbmd9IG9yIGEgYnl0ZSBhcnJheSBzcGVjaWZ5aW5nIHRoZSBuYW1lIChpbiBSRkMgMjI1MyBvciBBU04uMQorICAgICAqIERFUiBlbmNvZGVkIGZvcm0pCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZXMgdG8gbWF0Y2gsIG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgbnVsbH0gaWYgYW55IGlzc3VlciBkaXN0aW5ndWlzaGVkIG5hbWUgd2lsbCBkby4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJc3N1ZXJOYW1lcyhDb2xsZWN0aW9uPD8+IG5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAobmFtZXMgPT0gbnVsbCkgewpAQCAtMTA2LDcgKzEzOSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQWRkcyBhbiBpc3N1ZXIgdG8gdGhlIGNyaXRlcmlvbiBmb3IgdGhlIGlzc3VlciBkaXN0aW5ndWlzaGVkIG5hbWVzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBDUkwgaXNzdWVyIG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgZGlzdGluZ3Vpc2hlZAorICAgICAqIG5hbWVzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXNzdWVyCisgICAgICogICAgICAgICAgICB0aGUgaXNzdWVyIHRvIGFkZCB0byB0aGUgY3JpdGVyaW9uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSXNzdWVyKFg1MDBQcmluY2lwYWwgaXNzdWVyKSB7CiAgICAgICAgIGlmIChpc3N1ZXIgPT0gbnVsbCkgewpAQCAtMTMxLDcgKzE3MiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogPGI+RG8gbm90IHVzZTo8L2I+LCB1c2Uge0BsaW5rICNhZGRJc3N1ZXIoWDUwMFByaW5jaXBhbCl9IG9yCisgICAgICoge0BsaW5rICNhZGRJc3N1ZXJOYW1lKGJ5dGVbXSl9IGluc3RlYWQuIEl0IGNhbiBmYWlsIHRvIG1hdGNoIHNvbWUgQ1JMcworICAgICAqIGJlY2F1c2Ugb2YgYSBsb3NzIG9mIGVuY29kaW5nIGluZm9ybWF0aW9uIGluIGEgUkZDIDIyNTMgc3RyaW5nLgorICAgICAqIDxwPgorICAgICAqIEFkZHMgYW4gaXNzdWVyIHRvIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBpc3N1ZXIgZGlzdGluZ3Vpc2hlZCBuYW1lcy4gVGhlCisgICAgICogQ1JLIGlzc3VlciBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGRpc3Rpbmd1aXNoZWQgbmFtZXMuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBpc3NfbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIFJGQyAyMjUzIGVuY29kZWQgbmFtZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJc3N1ZXJOYW1lKFN0cmluZyBpc3NfbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzc3Vlck5hbWVzID09IG51bGwpIHsKQEAgLTE0OSw3ICsyMDIsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIEFkZHMgYW4gaXNzdWVyIHRvIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBpc3N1ZXIgZGlzdGluZ3Vpc2hlZCBuYW1lcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQ1JMIGlzc3VlciBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGRpc3Rpbmd1aXNoZWQKKyAgICAgKiBuYW1lcy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlzc19uYW1lCisgICAgICogICAgICAgICAgICB0aGUgaXNzdWVyIHRvIGFkZCB0byB0aGUgY3JpdGVyaW9uIGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSXNzdWVyTmFtZShieXRlW10gaXNzX25hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc3NfbmFtZSA9PSBudWxsKSB7CkBAIC0xNjUsMjEgKzIyOCw0OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgY3JpdGVyaW9uIGZvciB0aGUgbWluaW11bSBDUkwgbnVtYmVyLgorICAgICAqIDxwPgorICAgICAqIFRoZSBDUkwgbXVzdCBoYXZlIGEgbnVtYmVyIGV4dGVuc2lvbiB3aXRoIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgICogdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBtaW5DUkwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIENSTCBudW1iZXIgb3IgbnVsbCB0byBub3QgY2hlY2sgdGhlIG1pbmltdW0gQ1JMCisgICAgICogICAgICAgICAgICBudW1iZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNaW5DUkxOdW1iZXIoQmlnSW50ZWdlciBtaW5DUkwpIHsKICAgICAgICAgdGhpcy5taW5DUkwgPSBtaW5DUkw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBtYXhpbXVtIENSTCBudW1iZXIuCisgICAgICogPHA+CisgICAgICogVGhlIENSTCBtdXN0IGhhdmUgYSBudW1iZXIgZXh0ZW5zaW9uIHdpdGggYSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG1heENSTAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gQ1JMIG51bWJlciBvciBudWxsIHRvIG5vdCBjaGVjayB0aGUgbWF4aW11bSBDUkwKKyAgICAgKiAgICAgICAgICAgIG51bWJlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNYXhDUkxOdW1iZXIoQmlnSW50ZWdlciBtYXhDUkwpIHsKICAgICAgICAgdGhpcy5tYXhDUkwgPSBtYXhDUkw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBDUkwgdXBkYXRlIHBlcmlvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQ1JMJ3Mge0Bjb2RlIHRoaXNVcGRhdGV9IHZhbHVlIG11c3QgYmUgZXF1YWwgb3IgYmVmb3JlIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBkYXRlIGFuZCB0aGUge0Bjb2RlIG5leHRVcGRhdGV9IHZhbHVlIG11c3QgYmUgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkYXRlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0ZUFuZFRpbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRlIHRvIHNlYXJjaCBmb3IgdmFsaWQgQ1JMJ3Mgb3Ige0Bjb2RlIG51bGx9IHRvIG5vdAorICAgICAqICAgICAgICAgICAgY2hlY2sgdGhlIGRhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0ZUFuZFRpbWUoRGF0ZSBkYXRlQW5kVGltZSkgewogICAgICAgICBpZiAoZGF0ZUFuZFRpbWUgPT0gbnVsbCkgewpAQCAtMTkwLDE0ICsyODAsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgYSBjZXJ0aWZpY2F0ZSBoaW50IHRvIGZpbmQgQ1JMcy4gSXQncyBub3QgYSBjcml0ZXJpb24gYnV0IG1heSBoZWxwCisgICAgICogZmluZGluZyByZWxldmFudCBDUkxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjZXJ0CisgICAgICogICAgICAgICAgICB0aGUgY2VydGlmaWNhdGUgaGludCBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2VydGlmaWNhdGVDaGVja2luZyhYNTA5Q2VydGlmaWNhdGUgY2VydCkgewogICAgICAgICB0aGlzLmNlcnRpZmljYXRlQ2hlY2tpbmcgPSBjZXJ0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgY3JpdGVyaW9uIGZvciB0aGUgaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZXMuCisgICAgICogPHA+CisgICAgICogVGhlIENSTCBpc3N1ZXIgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgb2YgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZXMuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHVubW9kaWZpYWJsZSBsaXN0IG9mIGlzc3VlciBkaXN0aW5ndWlzaGVkIG5hbWVzIHRvIG1hdGNoLCBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIGFueSBpc3N1ZXIgZGlzdGluZ3Vpc2hlZCBuYW1lIHdpbGwgZG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbGxlY3Rpb248WDUwMFByaW5jaXBhbD4gZ2V0SXNzdWVycygpIHsKICAgICAgICAgaWYgKGlzc3Vlck5hbWVzID09IG51bGwpIHsKQEAgLTIxNSw3ICszMTcsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIGlzc3VlciBkaXN0aW5ndWlzaGVkIG5hbWVzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBDUkwgaXNzdWVyIG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBkaXN0aW5ndWlzaGVkIG5hbWVzLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgbGlzdCBvZiBpc3N1ZXIgZGlzdGluZ3Vpc2hlZCBuYW1lcyB0byBtYXRjaCwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiBhbnkgaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZSB3aWxsIGRvLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gZ2V0SXNzdWVyTmFtZXMoKSB7CiAgICAgICAgIGlmIChpc3N1ZXJOYW1lcyA9PSBudWxsKSB7CkBAIC0yMjUsMjEgKzMzNCw0NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgY3JpdGVyaW9uIGZvciB0aGUgbWluaW11bSBDUkwgbnVtYmVyLgorICAgICAqIDxwPgorICAgICAqIFRoZSBDUkwgbXVzdCBoYXZlIGEgbnVtYmVyIGV4dGVuc2lvbiB3aXRoIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgICogdG8gdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIENSTCBudW1iZXIgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBtaW5pbXVtIENSTCBudW1iZXIKKyAgICAgKiAgICAgICAgIGlzIG5vdCB0byBiZSBjaGVja2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1pbkNSTCgpIHsKICAgICAgICAgcmV0dXJuIG1pbkNSTDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIG1heGltdW0gQ1JMIG51bWJlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQ1JMIG11c3QgaGF2ZSBhIG51bWJlciBleHRlbnNpb24gd2l0aCBhIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAqIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBDUkwgbnVtYmVyIG9yIG51bGwgaWYgdGhlIG1heGltdW0gQ1JMIG51bWJlciBpcyBub3QKKyAgICAgKiAgICAgICAgIGNoZWNrZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWF4Q1JMKCkgewogICAgICAgICByZXR1cm4gbWF4Q1JMOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgY3JpdGVyaW9uIGZvciB0aGUgQ1JMIHVwZGF0ZSBwZXJpb2QuCisgICAgICogPHA+CisgICAgICogVGhlIENSTCdzIHtAY29kZSB0aGlzVXBkYXRlfSB2YWx1ZSBtdXN0IGJlIGVxdWFsIG9yIGJlZm9yZSB0aGUgcmV0dXJuZWQKKyAgICAgKiBkYXRlIGFuZCB0aGUge0Bjb2RlIG5leHRVcGRhdGV9IHZhbHVlIG11c3QgYmUgYWZ0ZXIgdGhlIHJldHVybmVkIGRhdGUuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRhdGUgdG8gc2VhcmNoIGZvciB2YWxpZCBDUkwncyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGRhdGUgaXMKKyAgICAgKiAgICAgICAgIG5vdCBjaGVja2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlIGdldERhdGVBbmRUaW1lKCkgewogICAgICAgICBpZiAoZGF0ZUFuZFRpbWUgPT0gLTEpIHsKQEAgLTI0OSwxNCArMzgyLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZSBoaW50IHRvIGZpbmQgQ1JMcy4gSXQncyBub3QgYSBjcml0ZXJpb24gYnV0IG1heQorICAgICAqIGhlbHAgZmluZGluZyByZWxldmFudCBDUkxzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRlIGhpbnQgb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBYNTA5Q2VydGlmaWNhdGUgZ2V0Q2VydGlmaWNhdGVDaGVja2luZygpIHsKICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlQ2hlY2tpbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFg1MDlDUkxTZWxlY3Rvcn0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHtAY29kZSBYNTA5Q1JMU2VsZWN0b3J9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CkBAIC0yODcsNyArNDI3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBDUkwgbWF0Y2hlcyBhbGwgdGhlIGNyaXRlcmlhIGNvbGxlY3RlZCBpbgorICAgICAqIHRoaXMgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNybAorICAgICAqICAgICAgICAgICAgdGhlIENSTCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgQ1JMIG1hdGNoZXMgYWxsIHRoZSBjcml0ZXJpYSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKENSTCBjcmwpIHsKICAgICAgICAgaWYgKCEoY3JsIGluc3RhbmNlb2YgWDUwOUNSTCkpIHsKQEAgLTMzNCw3ICs0ODEsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENsb25lcyB0aGlzIHtAY29kZSBYNTA5Q1JMfSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHJlc3VsdCA9IG5ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0U2VsZWN0b3IuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0U2VsZWN0b3IuamF2YQppbmRleCBiZTI1NjdlLi5jNmQyZTk4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q2VydFNlbGVjdG9yLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRTZWxlY3Rvci5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotICogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNTIsNyArNDcsMTAgQEAKIAogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBBIGNlcnRpZmljYXRlIHNlbGVjdG9yICh7QGNvZGUgQ2VydFNlbGVjdG9yfSBmb3Igc2VsZWN0aW5nIHtAY29kZQorICogWDUwOUNlcnRpZmljYXRlfXMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFg1MDlDZXJ0U2VsZWN0b3IgaW1wbGVtZW50cyBDZXJ0U2VsZWN0b3IgewogCkBAIC04Miw0MCArODAsNjQgQEAKICAgICBwcml2YXRlIGJ5dGVbXSBpc3N1ZXJCeXRlczsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgWDUwOUNlcnRTZWxlY3Rvcn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFg1MDlDZXJ0U2VsZWN0b3IoKSB7fQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjZXJ0aWZpY2F0ZSB0aGF0IGEgbWF0Y2hpbmcgY2VydGlmaWNhdGUgbXVzdCBiZSBlcXVhbCB0by4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSB0byBtYXRjaCwgb3IgbnVsbCB0byBub3QgY2hlY2sgdGhpcyBjcml0ZXJpYS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIHsKICAgICAgICAgY2VydGlmaWNhdGVFcXVhbHMgPSBjZXJ0aWZpY2F0ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRlIHRoYXQgYSBtYXRjaGluZyBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGVxdWFsIHRvLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRlIHRvIG1hdGNoLCBvciBudWxsIGlmIHRoaXMgY3JpdGVyaWEgaXMgbm90CisgICAgICogICAgICAgICBjaGVja2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBYNTA5Q2VydGlmaWNhdGUgZ2V0Q2VydGlmaWNhdGUoKSB7CiAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZUVxdWFsczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIHNlcmlhbCBudW1iZXIgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QgbWF0Y2guCisgICAgICogCisgICAgICogQHBhcmFtIHNlcmlhbE51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIHNlcmlhbCBudW1iZXIgdG8gbWF0Y2gsIG9yIHtAY29kZSBudWxsfSB0byBub3QgY2hlY2sgdGhlCisgICAgICogICAgICAgICAgICBzZXJpYWwgbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNlcmlhbE51bWJlcihCaWdJbnRlZ2VyIHNlcmlhbE51bWJlcikgewogICAgICAgICB0aGlzLnNlcmlhbE51bWJlciA9IHNlcmlhbE51bWJlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNlcmlhbCBudW1iZXIgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QgbWF0Y2guCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2VyaWFsIG51bWJlciB0byBtYXRjaCwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBzZXJpYWwgbnVtYmVyCisgICAgICogICAgICAgICBpcyBub3QgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKSB7CiAgICAgICAgIHJldHVybiBzZXJpYWxOdW1iZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBpc3N1ZXIgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QgbWF0Y2guCisgICAgICogCisgICAgICogQHBhcmFtIGlzc3VlcgorICAgICAqICAgICAgICAgICAgdGhlIGlzc3VlciB0byBtYXRjaCwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBpc3N1ZXIgaXMgbm90IHRvCisgICAgICogICAgICAgICAgICBiZSBjaGVja2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElzc3VlcihYNTAwUHJpbmNpcGFsIGlzc3VlcikgewogICAgICAgICB0aGlzLmlzc3VlciA9IGlzc3VlcjsKQEAgLTEyNCwxNCArMTQ2LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBpc3N1ZXIgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QgbWF0Y2guCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaXNzdWVyIHRoYXQgYSBjZXJ0aWZpY2F0ZSBtdXN0IG1hdGNoLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICBpc3N1ZXIgaXMgbm90IHRvIGJlIGNoZWNrZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFg1MDBQcmluY2lwYWwgZ2V0SXNzdWVyKCkgewogICAgICAgICByZXR1cm4gaXNzdWVyOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogPGI+RG8gbm90IHVzZTwvYj4sIHVzZSB7QGxpbmsgI2dldElzc3VlcigpfSBvcgorICAgICAqIHtAbGluayAjZ2V0SXNzdWVyQXNCeXRlcygpfSBpbnN0ZWFkLiBTZXRzIHRoZSBpc3N1ZXIgdGhhdCBhIGNlcnRpZmljYXRlCisgICAgICogbXVzdCBtYXRjaC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXNzdWVyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGlzc3VlciBpbiBhIFJGQyAyMjUzIGZvcm1hdCBzdHJpbmcsIG9yIHtAY29kZSBudWxsfSB0byBub3QKKyAgICAgKiAgICAgICAgICAgIGNoZWNrIHRoZSBpc3N1ZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgdGhlIGlzc3VlciBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJc3N1ZXIoU3RyaW5nIGlzc3Vlck5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc3N1ZXJOYW1lID09IG51bGwpIHsKQEAgLTE1MCw3ICsxODUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIDxiPkRvIG5vdCB1c2U8L2I+LCB1c2Uge0BsaW5rICNnZXRJc3N1ZXIoKX0gb3IKKyAgICAgKiB7QGxpbmsgI2dldElzc3VlckFzQnl0ZXMoKX0gaW5zdGVhZC4gUmV0dXJucyB0aGUgaXNzdWVyIHRoYXQgYQorICAgICAqIGNlcnRpZmljYXRlIG11c3QgbWF0Y2ggaW4gYSBSRkMgMjI1MyBmb3JtYXQgc3RyaW5nLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGlzc3VlciBpbiBhIFJGQyAyMjUzIGZvcm1hdCBzdHJpbmcsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGlzc3VlciBpcyBub3QgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldElzc3VlckFzU3RyaW5nKCkgewogICAgICAgICBpZiAoaXNzdWVyID09IG51bGwpIHsKQEAgLTE2Myw3ICsyMDQsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGlzc3VlciB0aGF0IGEgY2VydGlmaWNhdGUgbXVzdCBtYXRjaC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXNzdWVyRE4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0aW5ndWlzaGVkIGlzc3VlciBuYW1lIGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm1hdCwgb3IKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfSB0byBub3QgY2hlY2sgdGhlIGlzc3Vlci4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZGVjb2RpbmcgdGhlIGlzc3VlciBmYWlsLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElzc3VlcihieXRlW10gaXNzdWVyRE4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc3N1ZXJETiA9PSBudWxsKSB7CkBAIC0xODEsNyArMjI5LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBpc3N1ZXIgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QgbWF0Y2guCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZGlzdGluZ3Vpc2hlZCBpc3N1ZXIgbmFtZSBpbiBBU04uMSBERVIgZW5jb2RlZCBmb3JtYXQsIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgdGhlIGlzc3VlciBpcyBub3QgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZW5jb2RpbmcgdGhlIGlzc3VlciBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldElzc3VlckFzQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaXNzdWVyID09IG51bGwpIHsKQEAgLTE5NiwyMSArMjUwLDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXQgdGhlIHN1YmplY3QgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QgbWF0Y2guCisgICAgICogCisgICAgICogQHBhcmFtIHN1YmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWJqZWN0IGRpc3Rpbmd1aXNoZWQgbmFtZSBvciB7QGNvZGUgbnVsbH0gdG8gbm90IGNoZWNrCisgICAgICogICAgICAgICAgICB0aGUgc3ViamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFg1MDBQcmluY2lwYWwgc3ViamVjdCkgewogICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc3ViamVjdCB0aGF0IGEgY2VydGlmaWNhdGUgbXVzdCBtYXRjaC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJqZWN0IGRpc3Rpbmd1aXNoZWQgbmFtZSwgb3IgbnVsbCBpZiB0aGUgc3ViamVjdCBpcyBub3QgdG8KKyAgICAgKiAgICAgICAgIGJlIGNoZWNrZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFg1MDBQcmluY2lwYWwgZ2V0U3ViamVjdCgpIHsKICAgICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiA8Yj5EbyBub3QgdXNlPC9iPiwgdXNlIHtAbGluayAjc2V0U3ViamVjdChieXRlW10pfSBvcgorICAgICAqIHtAbGluayAjc2V0U3ViamVjdChYNTAwUHJpbmNpcGFsKX0gaW5zdGVhZC4gUmV0dXJucyB0aGUgc3ViamVjdCB0aGF0IGEKKyAgICAgKiBjZXJ0aWZpY2F0ZSBtdXN0IG1hdGNoLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdWJqZWN0RE4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWJqZWN0IGRpc3Rpbmd1aXNoZWQgbmFtZSBpbiBSRkMgMjI1MyBmb3JtYXQgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfSB0byBub3QgY2hlY2sgdGhlIHN1YmplY3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlY29kaW5nIHRoZSBzdWJqZWN0IGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN1YmplY3QoU3RyaW5nIHN1YmplY3RETikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHN1YmplY3RETiA9PSBudWxsKSB7CkBAIC0yMjUsNyArMjk3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiA8Yj5EbyBub3QgdXNlPC9iPiwgdXNlIHtAbGluayAjZ2V0U3ViamVjdCgpfSBvcgorICAgICAqIHtAbGluayAjZ2V0U3ViamVjdEFzQnl0ZXMoKX0gaW5zdGVhZC4gUmV0dXJucyB0aGUgc3ViamVjdCB0aGF0IGEKKyAgICAgKiBjZXJ0aWZpY2F0ZSBtdXN0IG1hdGNoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN1YmplY3QgZGlzdGluZ3Vpc2hlZCBuYW1lIGluIFJGQyAyMjUzIGZvcm1hdCwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICBudWxsfSBpZiB0aGUgc3ViamVjdCBpcyBub3QgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YmplY3RBc1N0cmluZygpIHsKICAgICAgICAgaWYgKHN1YmplY3QgPT0gbnVsbCkgewpAQCAtMjM1LDcgKzMxMywxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgc3ViamVjdCB0aGF0IGEgY2VydGlmaWNhdGUgbXVzdCBtYXRjaC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3ViamVjdEROCisgICAgICogICAgICAgICAgICB0aGUgc3ViamVjdCBkaXN0aW5ndWlzaGVkIG5hbWUgaW4gQVNOLjEgREVSIGZvcm1hdCwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBudWxsfSB0byBub3QgY2hlY2sgdGhlIHN1YmplY3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlY29kaW5nIHRoZSBzdWJqZWN0IGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN1YmplY3QoYnl0ZVtdIHN1YmplY3RETikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHN1YmplY3RETiA9PSBudWxsKSB7CkBAIC0yNTAsNyArMzM1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IHRoYXQgYSBjZXJ0aWZpY2F0ZSBtdXN0IG1hdGNoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN1YmplY3QgZGlzdGluZ3Vpc2hlZCBuYW1lIGluIEFTTi4xIERFUiBmb3JtYXQsIG9yIHtAY29kZQorICAgICAqICAgICAgICAgbnVsbH0gaWYgdGhlIHN1YmplY3QgaXMgbm90IHRvIGJlIGNoZWNrZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVuY29kaW5nIHRoZSBzdWJqZWN0IGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0U3ViamVjdEFzQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoc3ViamVjdCA9PSBudWxsKSB7CkBAIC0yNjAsNyArMzUxLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHRoZSB7QGxpdGVyYWwgU3ViamVjdEtleUlkZW50aWZpZXJ9IGV4dGVuc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0Bjb2RlIHN1YmplY3RLZXlJZGVudGlmaWVyfSBzaG91bGQgYmUgYSBzaW5nbGUgREVSIGVuY29kZWQgdmFsdWUuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdWJqZWN0S2V5SWRlbnRpZmllcgorICAgICAqICAgICAgICAgICAgdGhlIHN1YmplY3Qga2V5IGlkZW50aWZpZXIgb3Ige0Bjb2RlIG51bGx9IHRvIGRpc2FibGUgdGhpcworICAgICAqICAgICAgICAgICAgY2hlY2suCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3ViamVjdEtleUlkZW50aWZpZXIoYnl0ZVtdIHN1YmplY3RLZXlJZGVudGlmaWVyKSB7CiAgICAgICAgIGlmIChzdWJqZWN0S2V5SWRlbnRpZmllciA9PSBudWxsKSB7CkBAIC0yNzMsNyArMzcyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjcml0ZXJpb24gZm9yIHRoZSB7QGxpdGVyYWwgU3ViamVjdEtleUlkZW50aWZpZXJ9IGV4dGVuc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJqZWN0IGtleSBpZGVudGlmaWVyIG9yIHtAY29kZSBudWxsfSBpZiBpdCBpcyBub3QgdG8gYmUKKyAgICAgKiAgICAgICAgIGNoZWNrZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpIHsKICAgICAgICAgaWYgKHN1YmplY3RLZXlJZGVudGlmaWVyID09IG51bGwpIHsKQEAgLTI4NSw3ICszODgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHtAbGl0ZXJhbCBBdXRob3JpdHlLZXlJZGVudGlmaWVyfSBleHRlbnNpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGF1dGhvcml0eUtleUlkZW50aWZpZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdXRob3JpdHkga2V5IGlkZW50aWZpZXIsIG9yIHtAY29kZSBudWxsfSB0byBkaXNhYmxlIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGNoZWNrLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEF1dGhvcml0eUtleUlkZW50aWZpZXIoYnl0ZVtdIGF1dGhvcml0eUtleUlkZW50aWZpZXIpIHsKICAgICAgICAgaWYgKGF1dGhvcml0eUtleUlkZW50aWZpZXIgPT0gbnVsbCkgewpAQCAtMjk5LDcgKzQwNywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgY3JpdGVyaW9uIGZvciB0aGUge0BsaXRlcmFsIEF1dGhvcml0eUtleUlkZW50aWZpZXJ9CisgICAgICogZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGF1dGhvcml0eSBrZXkgaWRlbnRpZmllciwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGlzIG5vdCB0byBiZQorICAgICAqICAgICAgICAgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEF1dGhvcml0eUtleUlkZW50aWZpZXIoKSB7CiAgICAgICAgIGlmIChhdXRob3JpdHlLZXlJZGVudGlmaWVyID09IG51bGwpIHsKQEAgLTMxMSw3ICs0MjQsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHZhbGlkaXR5IGRhdGUgb2YgdGhlIGNlcnRpZmljYXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIHZhbGlkIGF0IHRoZSBzcGVjaWZpZWQgZGF0ZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGNlcnRpZmljYXRlVmFsaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWxpZGl0eSBkYXRlIG9yIHtAY29kZSBudWxsfSB0byBub3QgY2hlY2sgdGhlIGRhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2VydGlmaWNhdGVWYWxpZChEYXRlIGNlcnRpZmljYXRlVmFsaWQpIHsKICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZVZhbGlkID0gKGNlcnRpZmljYXRlVmFsaWQgPT0gbnVsbCkKQEAgLTMyMCw3ICs0MzksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHZhbGlkaXR5IGRhdGUgb2YgdGhlIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHZhbGlkaXR5IGRhdGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBkYXRlIGlzIG5vdCB0byBiZQorICAgICAqICAgICAgICAgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0ZSBnZXRDZXJ0aWZpY2F0ZVZhbGlkKCkgewogICAgICAgICByZXR1cm4gKGNlcnRpZmljYXRlVmFsaWQgPT0gbnVsbCkKQEAgLTMyOSw3ICs0NTIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHZhbGlkaXR5IGRhdGUgb2YgdGhlIHByaXZhdGUga2V5LgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcml2YXRlIGtleSBtdXN0IGJlIHZhbGlkIGF0IHRoZSBzcGVjaWZpZWQgZGF0ZS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHByaXZhdGVLZXlWYWxpZAorICAgICAqICAgICAgICAgICAgdGhlIHZhbGlkaXR5IGRhdGUgb3Ige0Bjb2RlIG51bGx9IHRvIG5vdCBjaGVjayB0aGUgZGF0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcml2YXRlS2V5VmFsaWQoRGF0ZSBwcml2YXRlS2V5VmFsaWQpIHsKICAgICAgICAgaWYgKHByaXZhdGVLZXlWYWxpZCA9PSBudWxsKSB7CkBAIC0zNDAsNyArNDcwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjcml0ZXJpb24gZm9yIHRoZSB2YWxpZGl0eSBkYXRlIG9mIHRoZSBwcml2YXRlIGtleS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJpdmF0ZSBrZXkgbXVzdCBiZSB2YWxpZCBhdCB0aGUgc3BlY2lmaWVkIGRhdGUuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHZhbGlkaXR5IGRhdGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBkYXRlIGlzIG5vdCB0byBiZQorICAgICAqICAgICAgICAgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0ZSBnZXRQcml2YXRlS2V5VmFsaWQoKSB7CiAgICAgICAgIGlmIChwcml2YXRlS2V5VmFsaWQgIT0gbnVsbCkgewpAQCAtMzcxLDcgKzUwOCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgY3JpdGVyaW9uIGZvciB0aGUgc3ViamVjdCBwdWJsaWMga2V5IHNpZ25hdHVyZSBhbGdvcml0aG0uCisgICAgICogPHA+CisgICAgICogVGhlIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiBhIHN1YmplY3QgcHVibGljIGtleSB3aXRoIHRoZSBhbGdvcml0aG0KKyAgICAgKiBzcGVjaWZpZWQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBPSUQgKG9iamVjdCBpZGVudGlmaWVyKSBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBvcgorICAgICAqICAgICAgICAgICAge0Bjb2RlIG51bGx9IHRvIG5vdCBjaGVjayB0aGUgT0lELgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpZGVudGlmaWVyIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKFN0cmluZyBvaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChvaWQgPT0gbnVsbCkgewpAQCAtMzgzLDE0ICs1MzEsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHN1YmplY3QgcHVibGljIGtleSBzaWduYXR1cmUgYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIE9JRCAob2JqZWN0IGlkZW50aWZpZXIpIG9yIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIG9yIHtAY29kZQorICAgICAqICAgICAgICAgbnVsbH0gaWYgaXQncyBub3QgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpIHsKICAgICAgICAgcmV0dXJuIHN1YmplY3RQdWJsaWNLZXlBbGdJRDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHN1YmplY3QgcHVibGljIGtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgc3ViamVjdCBwdWJsaWMga2V5IG9yIHtAY29kZSBudWxsfSB0byBub3QgY2hlY2sgdGhlIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdWJqZWN0UHVibGljS2V5KFB1YmxpY0tleSBrZXkpIHsKICAgICAgICAgc3ViamVjdFB1YmxpY0tleSA9IChrZXkgPT0gbnVsbCkgPyBudWxsIDoga2V5LmdldEVuY29kZWQoKTsKQEAgLTM5OCw3ICs1NTQsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHN1YmplY3QgcHVibGljIGtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUgc3ViamVjdCBwdWJsaWMga2V5IGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm1hdCBvciB7QGNvZGUgbnVsbH0gdG8KKyAgICAgKiAgICAgICAgICAgIG5vdCBjaGVjayB0aGUga2V5LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBkZWNvZGluZyB0aGUgdGhlIHB1YmxpYyBrZXkgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3ViamVjdFB1YmxpY0tleShieXRlW10ga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKQEAgLTQxNCwxNCArNTc3LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBzdWJqZWN0IHB1YmxpYyBrZXkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3ViamVjdCBwdWJsaWMga2V5IG9yIHtAY29kZSBudWxsfSBpZiB0aGUga2V5IGlzIG5vdCB0byBiZQorICAgICAqICAgICAgICAgY2hlY2tlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHVibGljS2V5IGdldFN1YmplY3RQdWJsaWNLZXkoKSB7CiAgICAgICAgIHJldHVybiBzdWJqZWN0UHVibGljS2V5SW1wbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHtAbGl0ZXJhbCBLZXlVc2FnZX0gZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlVc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGJvb2xlYW4gYXJyYXkgaW4gdGhlIGZvcm1hdCBhcyByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAge0BsaW5rIFg1MDlDZXJ0aWZpY2F0ZSNnZXRLZXlVc2FnZSgpfSwgb3Ige0Bjb2RlIG51bGx9IHRvIG5vdAorICAgICAqICAgICAgICAgICAgY2hlY2sgdGhlIGtleSB1c2FnZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRLZXlVc2FnZShib29sZWFuW10ga2V5VXNhZ2UpIHsKICAgICAgICAgaWYgKGtleVVzYWdlID09IG51bGwpIHsKQEAgLTQzMyw3ICs2MDYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHtAbGl0ZXJhbCBLZXlVc2FnZX0gZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gYXJyYXkgaW4gdGhlIGZvcm1hdCBhcyByZXR1cm5lZCBieQorICAgICAqICAgICAgICAge0BsaW5rIFg1MDlDZXJ0aWZpY2F0ZSNnZXRLZXlVc2FnZSgpfSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBrZXkKKyAgICAgKiAgICAgICAgIHVzYWdlIGlzIG5vdCB0byBiZSBjaGVja2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuW10gZ2V0S2V5VXNhZ2UoKSB7CiAgICAgICAgIGlmIChrZXlVc2FnZSA9PSBudWxsKSB7CkBAIC00NDUsNyArNjIzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHRoZSB7QGxpdGVyYWwgRXh0ZW5kZWRLZXlVc2FnZX0gZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlVc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIHNldCBvZiBrZXkgdXNhZ2UgT0lEcywgb3Ige0Bjb2RlIG51bGx9IHRvIG5vdCBjaGVjayBpdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSBPSURzIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRLZXlVc2FnZShTZXQ8U3RyaW5nPiBrZXlVc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTQ2NCwyOCArNjQ4LDcxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjcml0ZXJpb24gZm9yIHRoZSB7QGxpdGVyYWwgRXh0ZW5kZWRLZXlVc2FnZX0gZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBrZXkgdXNhZ2UgT0lEcywgb3Ige0Bjb2RlIG51bGx9IGlmIGl0J3Mgbm90IHRvIGJlCisgICAgICogICAgICAgICBjaGVja2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRFeHRlbmRlZEtleVVzYWdlKCkgewogICAgICAgICByZXR1cm4gZXh0ZW5kZWRLZXlVc2FnZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGZsYWcgZm9yIHRoZSBtYXRjaGluZyBiZWhhdmlvciBmb3Igc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBhIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiBhbGwgb3IgYXQgbGVhc3Qgb25lCisgICAgICogb2YgdGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMgc3BlY2lmaWVkIGJ5CisgICAgICoge0BsaW5rICNzZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc30gb3Ige0BsaW5rICNhZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lfQorICAgICAqIC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG1hdGNoQWxsTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBhIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiBhbGwgb2YgdGhlCisgICAgICogICAgICAgICAgICBzcGVjaWZpZWQgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lcywgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoYm9vbGVhbiBtYXRjaEFsbE5hbWVzKSB7CiAgICAgICAgIHRoaXMubWF0Y2hBbGxOYW1lcyA9IG1hdGNoQWxsTmFtZXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBmbGFnIGZvciB0aGUgbWF0Y2hpbmcgYmVoYXZpb3IgZm9yIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMuCisgICAgICogPHA+CisgICAgICogVGhlIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgYSBjZXJ0aWZpY2F0ZSBtdXN0IGNvbnRhaW4gYWxsIG9yIGF0IGxlYXN0IG9uZQorICAgICAqIG9mIHRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWVzIHNwZWNpZmllZCBieQorICAgICAqIHtAbGluayAjc2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXN9IG9yIHtAbGluayAjYWRkU3ViamVjdEFsdGVybmF0aXZlTmFtZX0KKyAgICAgKiAuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgY2VydGlmaWNhdGUgbXVzdCBjb250YWluIGFsbCBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWVzLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygpIHsKICAgICAgICAgcmV0dXJuIG1hdGNoQWxsTmFtZXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMuCisgICAgICogPHA+CisgICAgICogdGhlIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiBhbGwgb3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3ViamVjdAorICAgICAqIGFsdGVybmF0aXZlIG5hbWVzLiBUaGUgYmVoYXZpb3IgaXMgc3BlY2lmaWVkIGJ5CisgICAgICoge0BsaW5rICNnZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lc30uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIHtAY29kZSBuYW1lc30gaXMgYSBjb2xsZWN0aW9uIHdpdGggYW4gZW50cnkgZm9yCisgICAgICogZWFjaCBuYW1lIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjcml0ZXJpb24uIFRoZSBuYW1lIGlzIHNwZWNpZmllZCBhcyBhCisgICAgICoge0Bjb2RlIExpc3R9LCB0aGUgZmlyc3QgZW50cnkgbXVzdCBiZSBhbiB7QGNvZGUgSW50ZWdlcn0gc3BlY2lmeWluZyB0aGUKKyAgICAgKiBuYW1lIHR5cGUgKDAtOCksIHRoZSBzZWNvbmQgZW50cnkgbXVzdCBiZSBhIHtAY29kZSBTdHJpbmd9IG9yIGEgYnl0ZQorICAgICAqIGFycmF5IHNwZWNpZnlpbmcgdGhlIG5hbWUgKGluIHN0cmluZyBvciBBU04uMSBERVIgZW5jb2RlZCBmb3JtKQorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lcyBjb2xsZWN0aW9uIG9yIHtAY29kZSBudWxsfSB0byBub3QgcGVyZm9ybSB0aGlzIGNoZWNrLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZGVjb2Rpbmcgb2YgYSBuYW1lIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKENvbGxlY3Rpb248TGlzdDw/Pj4gbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNTA5LDcgKzczNiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQWRkcyBhIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZSB0byB0aGUgcmVzcGVjdGl2ZSBjcml0ZXJpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHRhZworICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG5hbWUKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgaW4gc3RyaW5nIGZvcm1hdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyB0aGUgbmFtZSBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lKGludCB0YWcsIFN0cmluZyBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MjUsNyArNzYwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBBZGRzIGEgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lIHRvIHRoZSByZXNwZWN0aXZlIGNyaXRlcmlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFnCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgaW4gQVNOLjEgREVSIGVuY29kZWQgZm9ybS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGRlY29kaW5nIG9mIHRoZSBuYW1lIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUoaW50IHRhZywgYnl0ZVtdIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01NDEsNyArNzg0LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjcml0ZXJpb24gZm9yIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMuCisgICAgICogPHA+CisgICAgICogdGhlIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiBhbGwgb3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3ViamVjdAorICAgICAqIGFsdGVybmF0aXZlIG5hbWVzLiBUaGUgYmVoYXZpb3IgaXMgc3BlY2lmaWVkIGJ5CisgICAgICoge0BsaW5rICNnZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lc30uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWVzIGlzIGEgY29sbGVjdGlvbiB3aXRoIGFuIGVudHJ5IGZvciBlYWNoIG5hbWUKKyAgICAgKiBpbmNsdWRlZCBpbiB0aGUgY3JpdGVyaW9uLiBUaGUgbmFtZSBpcyBzcGVjaWZpZWQgYXMgYSB7QGNvZGUgTGlzdH0sIHRoZQorICAgICAqIGZpcnN0IGVudHJ5IGlzIGFuIHtAY29kZSBJbnRlZ2VyfSBzcGVjaWZ5aW5nIHRoZSBuYW1lIHR5cGUgKDAtOCksIHRoZQorICAgICAqIHNlY29uZCBlbnRyeSBpcyBieXRlIGFycmF5IHNwZWNpZnlpbmcgdGhlIG5hbWUgaW4gQVNOLjEgREVSIGVuY29kZWQgZm9ybSkKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgY29sbGVjdGlvbiBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSBzcGVjaWZpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbGxlY3Rpb248TGlzdDw/Pj4gZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSB7CiAgICAgICAgIGlmIChzdWJqZWN0QWx0TmFtZXMgPT0gbnVsbCkgewpAQCAtNTY5LDcgKzgyNiw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogU2V0cyB0aGUgY3JpdGVyaW9uIGZvciB0aGUgbmFtZSBjb25zdHJhaW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2VydGlmaWNhdGUgbXVzdCBjb25zdHJhaW50IHN1YmplY3QgYW5kIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMKKyAgICAgKiB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbmFtZSBjb25zdHJhaW50cy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgY29uc3RyYWludHMgaW4gQVNOLjE6CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiBOYW1lQ29uc3RyYWludHMgOjo9IFNFUVVFTkNFIHsKKyAgICAgKiAgICAgICAgcGVybWl0dGVkU3VidHJlZXMgICAgICAgWzBdICAgICBHZW5lcmFsU3VidHJlZXMgT1BUSU9OQUwsCisgICAgICogICAgICAgIGV4Y2x1ZGVkU3VidHJlZXMgICAgICAgIFsxXSAgICAgR2VuZXJhbFN1YnRyZWVzIE9QVElPTkFMIH0KKyAgICAgKiAKKyAgICAgKiBHZW5lcmFsU3VidHJlZXMgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLk1BWCkgT0YgR2VuZXJhbFN1YnRyZWUKKyAgICAgKiAKKyAgICAgKiBHZW5lcmFsU3VidHJlZSA6Oj0gU0VRVUVOQ0UgeworICAgICAqICAgICAgICBiYXNlICAgICAgICAgICAgICAgICAgICBHZW5lcmFsTmFtZSwKKyAgICAgKiAgICAgICAgbWluaW11bSAgICAgICAgIFswXSAgICAgQmFzZURpc3RhbmNlIERFRkFVTFQgMCwKKyAgICAgKiAgICAgICAgbWF4aW11bSAgICAgICAgIFsxXSAgICAgQmFzZURpc3RhbmNlIE9QVElPTkFMIH0KKyAgICAgKiAKKyAgICAgKiBCYXNlRGlzdGFuY2UgOjo9IElOVEVHRVIgKDAuLk1BWCkKKyAgICAgKiAKKyAgICAgKiBHZW5lcmFsTmFtZSA6Oj0gQ0hPSUNFIHsKKyAgICAgKiAgICAgICAgb3RoZXJOYW1lICAgICAgICAgICAgICAgICAgICAgICBbMF0gICAgIE90aGVyTmFtZSwKKyAgICAgKiAgICAgICAgcmZjODIyTmFtZSAgICAgICAgICAgICAgICAgICAgICBbMV0gICAgIElBNVN0cmluZywKKyAgICAgKiAgICAgICAgZE5TTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICBbMl0gICAgIElBNVN0cmluZywKKyAgICAgKiAgICAgICAgeDQwMEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICBbM10gICAgIE9SQWRkcmVzcywKKyAgICAgKiAgICAgICAgZGlyZWN0b3J5TmFtZSAgICAgICAgICAgICAgICAgICBbNF0gICAgIE5hbWUsCisgICAgICogICAgICAgIGVkaVBhcnR5TmFtZSAgICAgICAgICAgICAgICAgICAgWzVdICAgICBFRElQYXJ0eU5hbWUsCisgICAgICogICAgICAgIHVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXIgICAgICAgWzZdICAgICBJQTVTdHJpbmcsCisgICAgICogICAgICAgIGlQQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgWzddICAgICBPQ1RFVCBTVFJJTkcsCisgICAgICogICAgICAgIHJlZ2lzdGVyZWRJRCAgICAgICAgICAgICAgICAgICAgWzhdICAgICBPQkpFQ1QgSURFTlRJRklFUn0KKyAgICAgKiAKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBjb25zdHJhaW50cyBpbiBBU04uMSBERVIgZW5jb2RlZCBmb3JtYXQsIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIG5vdCBjaGVjayBhbnkgY29uc3RyYWludHMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlY29kaW5nIHRoZSBuYW1lIGNvbnN0cmFpbnRzIGZhaWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZUNvbnN0cmFpbnRzKGJ5dGVbXSBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5uYW1lQ29uc3RyYWludHMgPSAoYnl0ZXMgPT0gbnVsbCkKQEAgLTU3OCw3ICs4NzcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIG5hbWUgY29uc3RyYWludHMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBjb25zdHJhaW50cyBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSBzcGVjaWZpZWQuCisgICAgICogQHNlZSAjc2V0TmFtZUNvbnN0cmFpbnRzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXROYW1lQ29uc3RyYWludHMoKSB7CiAgICAgICAgIHJldHVybiAobmFtZUNvbnN0cmFpbnRzID09IG51bGwpCkBAIC01ODcsNyArODkwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBiYXNpYyBjb25zdHJhaW50cyBleHRlbnNpb24uCisgICAgICogPHA+CisgICAgICogQSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybyBpbmRpY2F0ZXMgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QKKyAgICAgKiBpbmNsdWRlIGEgYmFzaWMgY29uc3RyYWludHMgZXh0ZW5zaW9uIHdpdGggYSBwYXRoIGxlbmd0aCBvZiBhIGxlYXN0IHRoYXQKKyAgICAgKiB2YWx1ZS4gQSB2YWx1ZSBvZiB7QGNvZGUgLTJ9IGluZGljYXRlcyB0aGF0IG9ubHkgZW5kLWVudGl0eSBjZXJ0aWZpY2F0ZXMKKyAgICAgKiBhcmUgYWNjZXB0ZWQuIEEgdmFsdWUgb2Yge0Bjb2RlIC0xfSBpbmRpY2F0ZXMgdGhhdCBubyBjaGVjayBpcyBkb25lLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGF0aExlbgorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGNyaXRlcmlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwYXRoTGVufSBpcyBsZXNzIHRoYW4ge0Bjb2RlIC0yfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCYXNpY0NvbnN0cmFpbnRzKGludCBwYXRoTGVuKSB7CiAgICAgICAgIGlmIChwYXRoTGVuIDwgLTIpIHsKQEAgLTU5NywxNCArOTEyLDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBiYXNpYyBjb25zdHJhaW50cyBleHRlbnNpb24uCisgICAgICogPHA+CisgICAgICogQSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybyBpbmRpY2F0ZXMgdGhhdCBhIGNlcnRpZmljYXRlIG11c3QKKyAgICAgKiBpbmNsdWRlIGEgYmFzaWMgY29uc3RyYWludHMgZXh0ZW5zaW9uIHdpdGggYSBwYXRoIGxlbmd0aCBvZiBhIGxlYXN0IHRoYXQKKyAgICAgKiB2YWx1ZS4gQSB2YWx1ZSBvZiB7QGNvZGUgLTJ9IGluZGljYXRlcyB0aGF0IG9ubHkgZW5kLWVudGl0eSBjZXJ0aWZpY2F0ZXMKKyAgICAgKiBhcmUgYWNjZXB0ZWQuIEEgdmFsdWUgb2Yge0Bjb2RlIC0xfSBpbmRpY2F0ZXMgdGhhdCBubyBjaGVjayBpcyBkb25lLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgY3JpdGVyaW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QmFzaWNDb25zdHJhaW50cygpIHsKICAgICAgICAgcmV0dXJuIHBhdGhMZW47CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBTZXRzIHRoZSBjcml0ZXJpb24gZm9yIHRoZSBwb2xpY3kgY29uc3RyYWludC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2VydGlmaWNhdGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlCisgICAgICogcG9saWN5IGV4dGVuc2lvbnMuIEZvciBhbiBlbXB0eSBzZXQgdGhlIGNlcnRpZmljYXRlIG11c3QgaGF2ZSBhdCBsZWFzdAorICAgICAqIHNvbWUgcG9saWNpZXMgaW4gaXRzIHBvbGljeSBleHRlbnNpb24uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb2xpY2llcworICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIHBvbGljeSBPSURzLCBhbiBlbXB0eSBzZXQsIG9yIHtAY29kZSBudWxsfSB0bworICAgICAqICAgICAgICAgICAgbm90IHBlcmZvcm0gdGhpcyBjaGVjay4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyB0aGUgc3BlY2lmaWVkIE9JRHMgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UG9saWN5KFNldDxTdHJpbmc+IHBvbGljaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAocG9saWNpZXMgPT0gbnVsbCkgewpAQCAtNjIyLDE0ICs5NTgsNDEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHBvbGljeSBjb25zdHJhaW50LgorICAgICAqIDxwPgorICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBwb2xpY3kKKyAgICAgKiBleHRlbnNpb25zLiBGb3IgYW4gZW1wdHkgc2V0IHRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGhhdmUgYXQgbGVhc3Qgc29tZQorICAgICAqIHBvbGljaWVzIGluIGl0cyBwb2xpY3kgZXh0ZW5zaW9uLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSBwb2xpY3kgT0lEcywgYW4gZW1wdHkgc2V0LCBvciB7QGNvZGUgbnVsbH0gaWYgbm90CisgICAgICogICAgICAgICB0byBiZSBjaGVja2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQb2xpY3koKSB7CiAgICAgICAgIHJldHVybiBwb2xpY2llczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFNldHMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHBhdGhUb05hbWVzIGNvbnN0cmFpbnQuCisgICAgICogPHA+CisgICAgICogVGhpcyBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgY29tcGxldGUgc2V0IG9mIG5hbWVzLCBhIGNlcnRpZmljYXRlJ3MgbmFtZQorICAgICAqIGNvbnN0cmFpbnRzIG11c3QgcGVybWl0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciB7QGNvZGUgbmFtZXN9IGlzIGEgY29sbGVjdGlvbiB3aXRoIGFuIGVudHJ5IGZvcgorICAgICAqIGVhY2ggbmFtZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY3JpdGVyaW9uLiBUaGUgbmFtZSBpcyBzcGVjaWZpZWQgYXMgYQorICAgICAqIHtAY29kZSBMaXN0fSwgdGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgYW4ge0Bjb2RlIEludGVnZXJ9IHNwZWNpZnlpbmcgdGhlCisgICAgICogbmFtZSB0eXBlICgwLTgpLCB0aGUgc2Vjb25kIGVudHJ5IG11c3QgYmUgYSB7QGNvZGUgU3RyaW5nfSBvciBhIGJ5dGUKKyAgICAgKiBhcnJheSBzcGVjaWZ5aW5nIHRoZSBuYW1lIChpbiBzdHJpbmcgb3IgQVNOLjEgREVSIGVuY29kZWQgZm9ybSkKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgbmFtZXMgY29sbGVjdGlvbiBvciB7QGNvZGUgbnVsbH0gdG8gbm90IHBlcmZvcm0gdGhpcworICAgICAqICAgICAgICAgICAgY2hlY2suCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlY29kaW5nIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhdGhUb05hbWVzKENvbGxlY3Rpb248TGlzdDw/Pj4gbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC02NTMsNyArMTAxNiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQWRkcyBhIHtAbGl0ZXJhbCAicGF0aFRvTmFtZSJ9IHRvIHRoZSByZXNwZWN0aXZlIGNyaXRlcmlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG5hbWUuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIGluIHN0cmluZyBmb3JtYXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHBhcnNpbmcgZmFpbHMuCisgICAgICogQHNlZSAjc2V0UGF0aFRvTmFtZXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRQYXRoVG9OYW1lKGludCB0eXBlLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgR2VuZXJhbE5hbWUgcGF0aF9uYW1lID0gbmV3IEdlbmVyYWxOYW1lKHR5cGUsIG5hbWUpOwpAQCAtNjY1LDcgKzEwMzcsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIEFkZHMgYSB7QGxpdGVyYWwgInBhdGhUb05hbWUifSB0byB0aGUgcmVzcGVjdGl2ZSBjcml0ZXJpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBuYW1lCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGRlY29kaW5nIGZhaWxzLgorICAgICAqIEBzZWUgI3NldFBhdGhUb05hbWVzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0aFRvTmFtZShpbnQgdHlwZSwgYnl0ZVtdIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEdlbmVyYWxOYW1lIHBhdGhfbmFtZT0gbmV3IEdlbmVyYWxOYW1lKHR5cGUsIG5hbWUpOwpAQCAtNjc3LDcgKzEwNTgsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNyaXRlcmlvbiBmb3IgdGhlIHBhdGhUb05hbWVzIGNvbnN0cmFpbnQuCisgICAgICogPHA+CisgICAgICogVGhlIGNvbnN0cmFpbnQgaXMgYSBjb2xsZWN0aW9uIHdpdGggYW4gZW50cnkgZm9yIGVhY2ggbmFtZSB0byBiZSBpbmNsdWRlZAorICAgICAqIGluIHRoZSBjcml0ZXJpb24uIFRoZSBuYW1lIGlzIHNwZWNpZmllZCBhcyBhIHtAY29kZSBMaXN0fSwgdGhlIGZpcnN0CisgICAgICogZW50cnkgaXMgYW4ge0Bjb2RlIEludGVnZXJ9IHNwZWNpZnlpbmcgdGhlIG5hbWUgdHlwZSAoMC04KSwgdGhlIHNlY29uZAorICAgICAqIGVudHJ5IGlzIGEgYnl0ZSBhcnJheSBzcGVjaWZ5aW5nIHRoZSBuYW1lIGluIEFTTi4xIERFUiBlbmNvZGVkIGZvcm0uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhdGhUb05hbWVzIGNvbnN0cmFpbnQgb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgc3BlY2lmaWVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPExpc3Q8Pz4+IGdldFBhdGhUb05hbWVzKCkgewogICAgICAgICBpZiAocGF0aFRvTmFtZXMgPT0gbnVsbCkgewpAQCAtNjkzLDcgKzEwODMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgWDUwOUNlcnRTZWxlY3Rvcn0KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0Bjb2RlIFg1MDlDZXJ0U2VsZWN0b3J9CisgICAgICogICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAvLyBGb3IgY29udmVuaWVudCByZWFkaW5nIG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KQEAgLTgxMyw3ICsxMjA4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjZXJ0aWZpY2F0ZSBtYXRjaGVzIGFsbCB0aGUgY3JpdGVyaWEKKyAgICAgKiBjb2xsZWN0ZWQgaW4gdGhpcyBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2VydGlmaWNhdGUgbWF0Y2hlcyBhbGwgdGhlIGNyaXRlcmlhLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goQ2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIHsKICAgICAgICAgaWYgKCEgKGNlcnRpZmljYXRlIGluc3RhbmNlb2YgWDUwOUNlcnRpZmljYXRlKSkgewpAQCAtMTA0OSw3ICsxNDUxLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDbG9uZXMgdGhpcyB7QGNvZGUgWDUwOUNlcnRTZWxlY3Rvcn0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY2xvbmVkIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3IgcmVzdWx0ID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlLmphdmEKaW5kZXggYWEzZDdhNS4uOWUxMDA3NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuY2VydDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC0zNCw3ICsyOSw0NiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFguNTA5IGNlcnRpZmljYXRlcy4KKyAqIDxwPgorICogVGhpcyByZXByZXNlbnRzIGEgc3RhbmRhcmQgd2F5IGZvciBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZXMgb2YgWC41MDkKKyAqIGNlcnRpZmljYXRlcy4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGJhc2ljIFguNTA5IHYzIGZvcm1hdCBkZXNjcmliZWQgaW4gQVNOLjE6CisgKiAKKyAqIDxwcmU+CisgKiBDZXJ0aWZpY2F0ZSAgOjo9ICBTRVFVRU5DRSAgeworICogICAgIHRic0NlcnRpZmljYXRlICAgICAgIFRCU0NlcnRpZmljYXRlLAorICogICAgIHNpZ25hdHVyZUFsZ29yaXRobSAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgKiAgICAgc2lnbmF0dXJlICAgICAgICAgICAgQklUIFNUUklORyAgfQorICogICAgIAorICogVEJTQ2VydGlmaWNhdGUgIDo6PSAgU0VRVUVOQ0UgIHsKKyAqICAgICAgdmVyc2lvbiAgICAgICAgIFswXSAgRVhQTElDSVQgVmVyc2lvbiBERUZBVUxUIHYxLAorICogICAgICBzZXJpYWxOdW1iZXIgICAgICAgICBDZXJ0aWZpY2F0ZVNlcmlhbE51bWJlciwKKyAqICAgICAgc2lnbmF0dXJlICAgICAgICAgICAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICAgaXNzdWVyICAgICAgICAgICAgICAgTmFtZSwKKyAqICAgICAgdmFsaWRpdHkgICAgICAgICAgICAgVmFsaWRpdHksCisgKiAgICAgIHN1YmplY3QgICAgICAgICAgICAgIE5hbWUsCisgKiAgICAgIHN1YmplY3RQdWJsaWNLZXlJbmZvIFN1YmplY3RQdWJsaWNLZXlJbmZvLAorICogICAgICBpc3N1ZXJVbmlxdWVJRCAgWzFdICBJTVBMSUNJVCBVbmlxdWVJZGVudGlmaWVyIE9QVElPTkFMLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBJZiBwcmVzZW50LCB2ZXJzaW9uIG11c3QgYmUgdjIgb3IgdjMKKyAqICAgICAgc3ViamVjdFVuaXF1ZUlEIFsyXSAgSU1QTElDSVQgVW5pcXVlSWRlbnRpZmllciBPUFRJT05BTCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gSWYgcHJlc2VudCwgdmVyc2lvbiBtdXN0IGJlIHYyIG9yIHYzCisgKiAgICAgIGV4dGVuc2lvbnMgICAgICBbM10gIEVYUExJQ0lUIEV4dGVuc2lvbnMgT1BUSU9OQUwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gSWYgcHJlc2VudCwgdmVyc2lvbiBtdXN0IGJlIHYzCisgKiAgICAgIH0KKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBjb25zdWx0IFJGQyAyNDU5CisgKiAiSW50ZXJuZXQgWC41MDkgUHVibGljIEtleSBJbmZyYXN0cnVjdHVyZSBDZXJ0aWZpY2F0ZSBhbmQgQ1JMIFByb2ZpbGUiIGF0IDxhCisgKiBocmVmCisgKiA9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI0NTkudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyNDU5LnR4dAorICogPC9hPiAuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDUwOUNlcnRpZmljYXRlCiAgICAgICAgIGV4dGVuZHMgQ2VydGlmaWNhdGUgaW1wbGVtZW50cyBYNTA5RXh0ZW5zaW9uIHsKQEAgLTQyLDQxICs3NiwxMjkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjQ5MTEyNzU4ODE4NzAzODIxNkw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFg1MDlDZXJ0aWZpY2F0ZX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFg1MDlDZXJ0aWZpY2F0ZSgpIHsKICAgICAgICAgc3VwZXIoIlguNTA5Iik7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjZXJ0aWZpY2F0ZSBpcyBjdXJyZW50bHkgdmFsaWQuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbGlkaXR5IGRlZmluZWQgaW4gQVNOLjE6CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiB2YWxpZGl0eSAgICAgICAgICAgICBWYWxpZGl0eQorICAgICAqIAorICAgICAqIFZhbGlkaXR5IDo6PSBTRVFVRU5DRSB7IAorICAgICAqICAgICAgbm90QmVmb3JlICAgICAgIENlcnRpZmljYXRlVmFsaWRpdHlEYXRlLCAKKyAgICAgKiAgICAgIG5vdEFmdGVyICAgICAgICBDZXJ0aWZpY2F0ZVZhbGlkaXR5RGF0ZSB9CisgICAgICogCisgICAgICogQ2VydGlmaWNhdGVWYWxpZGl0eURhdGUgOjo9IENIT0lDRSB7IAorICAgICAqICAgICAgdXRjVGltZSAgICAgICAgIFVUQ1RpbWUsIAorICAgICAqICAgICAgZ2VuZXJhbFRpbWUgICAgIEdlbmVyYWxpemVkVGltZSB9CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGhhcyBleHBpcmVkLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgeWV0IHZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoZWNrVmFsaWRpdHkoKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiwgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNlcnRpZmljYXRlIGlzIHZhbGlkIGF0IHRoZSBzcGVjaWZpZWQgZGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGUgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IGFnYWluc3QuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2VydGlmaWNhdGUgaGFzIGV4cGlyZWQuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB5ZXQgdmFsaWQuCisgICAgICogQHNlZSAjY2hlY2tWYWxpZGl0eSgpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2hlY2tWYWxpZGl0eShEYXRlIGRhdGUpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZXMge0Bjb2RlIHZlcnNpb259ICh2ZXJzaW9uIG51bWJlcikuCisgICAgICogPHA+CisgICAgICogVGhlIHZlcnNpb24gZGVmaW5lZCBpcyBBU04uMToKKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqIFZlcnNpb24gOjo9ICBJTlRFR0VSICB7ICB2MSgwKSwgdjIoMSksIHYzKDIpICB9CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VmVyc2lvbigpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgc2VyaWFsTnVtYmVyfSBvZiB0aGUgY2VydGlmaWNhdGUuCisgICAgICogPHA+CisgICAgICogVGhlIEFTTi4xIGRlZmluaXRpb24gb2Yge0Bjb2RlIHNlcmlhbE51bWJlcn06CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiBDZXJ0aWZpY2F0ZVNlcmlhbE51bWJlciAgOjo9ICBJTlRFR0VSCisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNlcmlhbCBudW1iZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJpZ0ludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBpc3N1ZXJ9IChpc3N1ZXIgZGlzdGluZ3Vpc2hlZCBuYW1lKSBhcyBhbgorICAgICAqIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHtAY29kZSBQcmluY2lwYWx9IG9iamVjdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQVNOLjEgZGVmaW5pdGlvbiBvZiB7QGNvZGUgaXNzdWVyfToKKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqICBpc3N1ZXIgICAgICBOYW1lCisgICAgICogCisgICAgICogIE5hbWUgOjo9IENIT0lDRSB7CisgICAgICogICAgICBSRE5TZXF1ZW5jZSB9CisgICAgICogCisgICAgICogICAgUkROU2VxdWVuY2UgOjo9IFNFUVVFTkNFIE9GIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUKKyAgICAgKiAKKyAgICAgKiAgICBSZWxhdGl2ZURpc3Rpbmd1aXNoZWROYW1lIDo6PSBTRVQgT0YgQXR0cmlidXRlVHlwZUFuZFZhbHVlCisgICAgICogCisgICAgICogICAgQXR0cmlidXRlVHlwZUFuZFZhbHVlIDo6PSBTRVFVRU5DRSB7CisgICAgICogICAgICB0eXBlICAgICBBdHRyaWJ1dGVUeXBlLAorICAgICAqICAgICAgdmFsdWUgICAgQXR0cmlidXRlVmFsdWUgfQorICAgICAqIAorICAgICAqICAgIEF0dHJpYnV0ZVR5cGUgOjo9IE9CSkVDVCBJREVOVElGSUVSCisgICAgICogCisgICAgICogICAgQXR0cmlidXRlVmFsdWUgOjo9IEFOWSBERUZJTkVEIEJZIEF0dHJpYnV0ZVR5cGUKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogPGI+cmVwbGFjZWQgYnk6PC9iPiB7QGxpbmsgI2dldElzc3Vlclg1MDBQcmluY2lwYWwoKX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIGlzc3Vlcn0gYXMgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMge0Bjb2RlCisgICAgICogICAgICAgICBQcmluY2lwYWx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQcmluY2lwYWwgZ2V0SXNzdWVyRE4oKSA7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBpc3N1ZXJ9IChpc3N1ZXIgZGlzdGluZ3Vpc2hlZCBuYW1lKSBhcyBhbiB7QGNvZGUKKyAgICAgKiBYNTAwUHJpbmNpcGFsfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgaXNzdWVyfSAoaXNzdWVyIGRpc3Rpbmd1aXNoZWQgbmFtZSkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFg1MDBQcmluY2lwYWwgZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCgpIHsKIApAQCAtOTcsMTIgKzIxOSw0NiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIHN1YmplY3R9IChzdWJqZWN0IGRpc3Rpbmd1aXNoZWQgbmFtZSkgYXMgYW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB7QGNvZGUgUHJpbmNpcGFsfSBvYmplY3QuCisgICAgICogPHA+CisgICAgICogVGhlIEFTTi4xIGRlZmluaXRpb24gb2Yge0Bjb2RlIHN1YmplY3R9OgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogc3ViamVjdCAgICAgIE5hbWUKKyAgICAgKiAKKyAgICAgKiAgTmFtZSA6Oj0gQ0hPSUNFIHsKKyAgICAgKiAgICAgIFJETlNlcXVlbmNlIH0KKyAgICAgKiAKKyAgICAgKiAgICBSRE5TZXF1ZW5jZSA6Oj0gU0VRVUVOQ0UgT0YgUmVsYXRpdmVEaXN0aW5ndWlzaGVkTmFtZQorICAgICAqIAorICAgICAqICAgIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUgOjo9IFNFVCBPRiBBdHRyaWJ1dGVUeXBlQW5kVmFsdWUKKyAgICAgKiAKKyAgICAgKiAgICBBdHRyaWJ1dGVUeXBlQW5kVmFsdWUgOjo9IFNFUVVFTkNFIHsKKyAgICAgKiAgICAgIHR5cGUgICAgIEF0dHJpYnV0ZVR5cGUsCisgICAgICogICAgICB2YWx1ZSAgICBBdHRyaWJ1dGVWYWx1ZSB9CisgICAgICogCisgICAgICogICAgQXR0cmlidXRlVHlwZSA6Oj0gT0JKRUNUIElERU5USUZJRVIKKyAgICAgKiAKKyAgICAgKiAgICBBdHRyaWJ1dGVWYWx1ZSA6Oj0gQU5ZIERFRklORUQgQlkgQXR0cmlidXRlVHlwZQorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5yZXBsYWNlZCBieTo8L2I+IHtAbGluayAjZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKX0uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBzdWJqZWN0fSAoc3ViamVjdCBkaXN0aW5ndWlzaGVkIG5hbWUpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQcmluY2lwYWwgZ2V0U3ViamVjdEROKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBzdWJqZWN0fSAoc3ViamVjdCBkaXN0aW5ndWlzaGVkIG5hbWUpIGFzIGFuIHtAY29kZQorICAgICAqIFg1MDBQcmluY2lwYWx9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBzdWJqZWN0fSAoc3ViamVjdCBkaXN0aW5ndWlzaGVkIG5hbWUpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFg1MDBQcmluY2lwYWwgZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKSB7CiAKQEAgLTEyMyw1OCArMjc5LDEyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIG5vdEJlZm9yZX0gZGF0ZSBmcm9tIHRoZSB2YWxpZGl0eSBwZXJpb2Qgb2YgdGhlCisgICAgICogY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIHZhbGlkaXR5IHBlcmlvZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRGF0ZSBnZXROb3RCZWZvcmUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIG5vdEFmdGVyfSBkYXRlIG9mIHRoZSB2YWxpZGl0eSBwZXJpb2Qgb2YgdGhlCisgICAgICogY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW5kIG9mIHRoZSB2YWxpZGl0eSBwZXJpb2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERhdGUgZ2V0Tm90QWZ0ZXIoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIHRic0NlcnRpZmljYXRlfSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgY2VydGlmaWNhdGUgaW4KKyAgICAgKiBERVItZW5jb2RlZCBmb3JtYXQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgREVSLWVuY29kZWQgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24uCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGVuY29kaW5nCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRUQlNDZXJ0aWZpY2F0ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcmF3IHNpZ25hdHVyZSBiaXRzIGZyb20gdGhlIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJhdyBzaWduYXR1cmUgYml0cyBmcm9tIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFNpZ25hdHVyZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gZm9yIHRoZSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2lnQWxnTmFtZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBPSUQgb2YgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gZnJvbSB0aGUgY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgT0lEIG9mIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2lnQWxnT0lEKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gaW4gREVSLWVuY29kZWQgZm9ybWF0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0sIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgbm9uZSBhcmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgaXNzdWVyVW5pcXVlSUR9IGZyb20gdGhlIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBpc3N1ZXJVbmlxdWVJRH0gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlJ3Mgbm9uZSBpbiB0aGUKKyAgICAgKiAgICAgICAgIGNlcnRpZmljYXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuW10gZ2V0SXNzdWVyVW5pcXVlSUQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIHN1YmplY3RVbmlxdWVJRH0gZnJvbSB0aGUgY2VydGlmaWNhdGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIHN1YmplY3RVbmlxdWVJRH0gb3IgbnVsbCBpZiB0aGVyZSdzIG5vbmUgaW4gdGhlCisgICAgICogICAgICAgICBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbltdIGdldFN1YmplY3RVbmlxdWVJRCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgS2V5VXNhZ2V9IGV4dGVuc2lvbiBhcyBhIHtAY29kZSBib29sZWFufSBhcnJheS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQVNOLjEgZGVmaW5pdGlvbiBvZiB7QGNvZGUgS2V5VXNhZ2V9OgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogS2V5VXNhZ2UgOjo9IEJJVCBTVFJJTkcgeworICAgICAqICAgICAgZGlnaXRhbFNpZ25hdHVyZSAgICAgICAgKDApLAorICAgICAqICAgICAgbm9uUmVwdWRpYXRpb24gICAgICAgICAgKDEpLAorICAgICAqICAgICAga2V5RW5jaXBoZXJtZW50ICAgICAgICAgKDIpLAorICAgICAqICAgICAgZGF0YUVuY2lwaGVybWVudCAgICAgICAgKDMpLAorICAgICAqICAgICAga2V5QWdyZWVtZW50ICAgICAgICAgICAgKDQpLAorICAgICAqICAgICAga2V5Q2VydFNpZ24gICAgICAgICAgICAgKDUpLAorICAgICAqICAgICAgY1JMU2lnbiAgICAgICAgICAgICAgICAgKDYpLAorICAgICAqICAgICAgZW5jaXBoZXJPbmx5ICAgICAgICAgICAgKDcpLAorICAgICAqICAgICAgZGVjaXBoZXJPbmx5ICAgICAgICAgICAgKDgpIH0KKyAgICAgKiAKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIEtleVVzYWdlfSBleHRlbnNpb24gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlJ3Mgbm9uZSBpbgorICAgICAqICAgICAgICAgdGhlIGNlcnRpZmljYXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuW10gZ2V0S2V5VXNhZ2UoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIHJlYWQtb25seSBsaXN0IG9mIE9JRCBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUge0Bjb2RlCisgICAgICogRXh0S2V5VXNhZ2VTeW50YXh9IGZpZWxkIG9mIHRoZSBleHRlbmRlZCBrZXkgdXNhZ2UgZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGV4dGVuZGVkIGtleSB1c2FnZSBleHRlbnNpb24sIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSdzIG5vbmUKKyAgICAgKiAgICAgICAgIGluIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBleHRlbnNpb24gZGVjb2RpbmcgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeHRlbmRlZEtleVVzYWdlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gewpAQCAtMTgyLDEyICs0MDIsNDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHBhdGggbGVuZ3RoIG9mIHRoZSBjZXJ0aWZpY2F0ZSBjb25zdHJhaW50cyBmcm9tIHRoZSB7QGNvZGUKKyAgICAgKiBCYXNpY0NvbnRyYWludHN9IGV4dGVuc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIGxlbmd0aCBvZiB0aGUgY2VydGlmaWNhdGUgY29uc3RyYWludHMgaWYgdGhlIGV4dGVuc2lvbgorICAgICAqICAgICAgICAgaXMgcHJlc2VudCBvciB7QGNvZGUgLTF9IGlmIHRoZSBleHRlbnNpb24gaXMgbm90IHByZXNlbnQuIHtAY29kZQorICAgICAqICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUV9IGlmIHRoZXJlJ3Mgbm90IGxpbWl0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QmFzaWNDb25zdHJhaW50cygpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGxpc3Qgb2YgdGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMgZnJvbSB0aGUKKyAgICAgKiB7QGNvZGUgU3ViamVjdEFsdE5hbWV9IGV4dGVuc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQVNOLjEgZGVmaW5pdGlvbiBvZiB7QGNvZGUgU3ViamVjdEFsdE5hbWV9OgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogU3ViamVjdEFsdE5hbWUgOjo9IEdlbmVyYWxOYW1lcworICAgICAqIAorICAgICAqIEdlbmVyYWxOYW1lcyA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uTUFYKSBPRiBHZW5lcmFsTmFtZQorICAgICAqIAorICAgICAqIEdlbmVyYWxOYW1lIDo6PSBDSE9JQ0UgeworICAgICAqICAgICAgb3RoZXJOYW1lICAgICAgICAgICAgICAgICAgICAgICBbMF0gICAgIEFub3RoZXJOYW1lLAorICAgICAqICAgICAgcmZjODIyTmFtZSAgICAgICAgICAgICAgICAgICAgICBbMV0gICAgIElBNVN0cmluZywKKyAgICAgKiAgICAgIGROU05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgWzJdICAgICBJQTVTdHJpbmcsCisgICAgICogICAgICB4NDAwQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgIFszXSAgICAgT1JBZGRyZXNzLAorICAgICAqICAgICAgZGlyZWN0b3J5TmFtZSAgICAgICAgICAgICAgICAgICBbNF0gICAgIE5hbWUsCisgICAgICogICAgICBlZGlQYXJ0eU5hbWUgICAgICAgICAgICAgICAgICAgIFs1XSAgICAgRURJUGFydHlOYW1lLAorICAgICAqICAgICAgdW5pZm9ybVJlc291cmNlSWRlbnRpZmllciAgICAgICBbNl0gICAgIElBNVN0cmluZywKKyAgICAgKiAgICAgIGlQQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgWzddICAgICBPQ1RFVCBTVFJJTkcsCisgICAgICogICAgICByZWdpc3RlcmVkSUQgICAgICAgICAgICAgICAgICAgIFs4XSAgICAgT0JKRUNUIElERU5USUZJRVIgfQorICAgICAqIAorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWVzIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBhcmUgbm9uZQorICAgICAqICAgICAgICAgaW4gdGhlIGNlcnRpZmljYXRlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZGVjb2Rpbmcgb2YgdGhlIGV4dGVuc2lvbiBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29sbGVjdGlvbjxMaXN0PD8+PiBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKQEAgLTE5NSw3ICs0NTAsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSByZWFkLW9ubHkgbGlzdCBvZiB0aGUgaXNzdWVyIGFsdGVybmF0aXZlIG5hbWVzIGZyb20gdGhlIHtAY29kZQorICAgICAqIElzc3VlckFsdE5hbWV9IGV4dGVuc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQVNOLjEgZGVmaW5pdGlvbiBvZiB7QGNvZGUgSXNzdWVyQWx0TmFtZX06CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiBJc3N1ZXJBbHROYW1lIDo6PSBHZW5lcmFsTmFtZXMKKyAgICAgKiAKKyAgICAgKiBHZW5lcmFsTmFtZXMgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLk1BWCkgT0YgR2VuZXJhbE5hbWUKKyAgICAgKiAKKyAgICAgKiBHZW5lcmFsTmFtZSA6Oj0gQ0hPSUNFIHsKKyAgICAgKiAgICAgIG90aGVyTmFtZSAgICAgICAgICAgICAgICAgICAgICAgWzBdICAgICBBbm90aGVyTmFtZSwKKyAgICAgKiAgICAgIHJmYzgyMk5hbWUgICAgICAgICAgICAgICAgICAgICAgWzFdICAgICBJQTVTdHJpbmcsCisgICAgICogICAgICBkTlNOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIFsyXSAgICAgSUE1U3RyaW5nLAorICAgICAqICAgICAgeDQwMEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICBbM10gICAgIE9SQWRkcmVzcywKKyAgICAgKiAgICAgIGRpcmVjdG9yeU5hbWUgICAgICAgICAgICAgICAgICAgWzRdICAgICBOYW1lLAorICAgICAqICAgICAgZWRpUGFydHlOYW1lICAgICAgICAgICAgICAgICAgICBbNV0gICAgIEVESVBhcnR5TmFtZSwKKyAgICAgKiAgICAgIHVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXIgICAgICAgWzZdICAgICBJQTVTdHJpbmcsCisgICAgICogICAgICBpUEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgIFs3XSAgICAgT0NURVQgU1RSSU5HLAorICAgICAqICAgICAgcmVnaXN0ZXJlZElEICAgICAgICAgICAgICAgICAgICBbOF0gICAgIE9CSkVDVCBJREVOVElGSUVSIH0KKyAgICAgKiAKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaXNzdWVyIGFsdGVybmF0aXZlIG5hbWVzIG9mIHtAY29kZSBudWxsfSBpZiB0aGVyZSBhcmUgbm9uZSBpbgorICAgICAqICAgICAgICAgdGhlIGNlcnRpZmljYXRlLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZGVjb2Rpbmcgb2YgdGhlIGV4dGVuc2lvbiBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29sbGVjdGlvbjxMaXN0PD8+PiBnZXRJc3N1ZXJBbHRlcm5hdGl2ZU5hbWVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUV4dGVuc2lvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUV4dGVuc2lvbi5qYXZhCmluZGV4IDQxNmZlNDQuLmNjODY0OGIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlFeHRlbnNpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5RXh0ZW5zaW9uLmphdmEKQEAgLTE1LDM4ICsxNSw1OCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIHNwZWNpZnlpbmcgYW4gWC41MDkgQ2VydGlmaWNhdGUgb3IgQ1JMIGV4dGVuc2lvbi4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgWDUwOUV4dGVuc2lvbiB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBPSURzIG9mIHRoZSBleHRlbnNpb24ocykgbWFya2VkIGFzIENSSVRJQ0FMLCB0aGF0IHRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBtYW5hZ2VzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBleHRlbnNpb24gT0lEcyBtYXJrZWQgYXMgQ1JJVElBTCwgYW4gZW1wdHkgc2V0IGlmIG5vbmUKKyAgICAgKiAgICAgICAgIGFyZSBtYXJrZWQgYXMgQ1JJVElDQUwsIG9yIHtAY29kZSBudWxsfSBpZiBubyBleHRlbnNpb25zIGFyZQorICAgICAqICAgICAgICAgcHJlc2VudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q3JpdGljYWxFeHRlbnNpb25PSURzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiB2YWx1ZSBhcyBERVItZW5jb2RlZCBPQ1RFVCBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBPSUQuCisgICAgICogCisgICAgICogQHBhcmFtIG9pZAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCBpZGVudGlmaWVyIHRvIGdldCB0aGUgZXh0ZW5zaW9uIHZhbHVlIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnNpb24gdmFsdWUgYXMgREVSLWVuY29kZWQgT0NURVQgc3RyaW5nLCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIG5vIGV4dGVuc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBPSUQgY2FuIGJlIGZvdW5kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RXh0ZW5zaW9uVmFsdWUoU3RyaW5nIG9pZCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBPSURzIG9mIHRoZSBleHRlbnNpb24ocykgbWFya2VkIGFzIE5PTi1DUklUSUNBTCwgdGhhdAorICAgICAqIHRoaXMgaW1wbGVtZW50YXRpb24gbWFuYWdlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgZXh0ZW5zaW9uIE9JRHMgbWFya2VkIGFzIE5PTi1DUklUSUFMLCBhbiBlbXB0eSBzZXQgaWYKKyAgICAgKiAgICAgICAgIG5vbmUgYXJlIG1hcmtlZCBhcyBOT04tLkNSSVRJQ0FMLCBvciB7QGNvZGUgbnVsbH0gaWYgbm8KKyAgICAgKiAgICAgICAgIGV4dGVuc2lvbnMgYXJlIHByZXNlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBoYXMgYW4gZXh0ZW5zaW9uIG1hcmtlZCBhcyBDUklUSUNBTCB0aGF0IGl0CisgICAgICogY2Fubm90IHN1cHBvcnQuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYW4gdW5zdXBwb3J0ZWQgQ1JJVElDQUwgZXh0ZW5zaW9uIGlzIHByZXNlbnQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9wYWNrYWdlLmh0bWwgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9wYWNrYWdlLmh0bWwKaW5kZXggNDIxMjg1Ny4uZTNjYzkyYiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvcGFja2FnZS5odG1sCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L3BhY2thZ2UuaHRtbApAQCAtOSwxMiArOSwxNSBAQAogWC41MDkgY2VydGlmaWNhdGVzLgogRnVuY3Rpb25hbGl0eSBmb3IgcGFyc2luZyBjZXJ0aWZpY2F0ZSwgZXh0cmFjdGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZW0sIHZhbGlkYXRpbmcgYW5kCiB2ZXJpZnlpbmcgdGhlIGluZm9ybWF0aW9uIHRoZXkgY29udGFpbnMgYXJlIHByb3ZpZGVkLgotRXhjZXB0aW9uIGFyZSBnZW5lcmF0ZWQgaWYgdGhlIGNlcnRpZmljYXRlJ3MgZW5jb2RpbmcgaXMgYnJva2VuCi17QGxpbmsgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb259LCBpZiB0aGUgY2VydGlmaWNhdGUncyB0aW1lIHN0YW1wIGlzIG5vdCB2YWxpZAote0BsaW5rIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb259LCBpZiB0aGUgdmFsaWRhdGlvbidzIHBhdGggaXMgZmFsc2UKLXtAbGluayBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb259LgotCi1BbGwgdGhlIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIHRoZSBkaWZmZXJlbnQgZW50cmllcyBhbmQgZXh0ZW5zaW9uIGZpZWxkcyBvZiBYLjUwOSBjZXJ0aWZpY2F0ZXMgYXJlIHByb3ZpZGVkLgorRXhjZXB0aW9uIGFyZSBnZW5lcmF0ZWQgbWFpbmx5IGZvciB0aHJlZSByZWFzb25zOjxicj4KKy0gaWYgdGhlIGNlcnRpZmljYXRlJ3MgZW5jb2RpbmcgaXMgYnJva2VuCisoQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbik8YnI+CistIGlmIHRoZSBjZXJ0aWZpY2F0ZSdzIHRpbWUgc3RhbXAgaXMgbm90IHZhbGlkCisoQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKTxicj4KKy0gb3IgaWYgdGhlIHZhbGlkYXRpb24ncyBwYXRoIGlzIGZhbHNlIChDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbikuCis8L3A+PHA+CitUaGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayB0aGUgZGlmZmVyZW50IGVudHJpZXMgYW5kIGV4dGVuc2lvbiBmaWVsZHMgb2YgWC41MDkgY2VydGlmaWNhdGVzIGFyZSBhbHNvIHByb3ZpZGVkLgogPC9wPgorQHNpbmNlIEFuZHJvaWQgMS4wCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FLZXkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQUtleS5qYXZhCmluZGV4IDBjNDQzZGIuLjEzNjJiZmYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQUtleS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQUtleS5qYXZhCkBAIC0xNSwyMSArMTUsMjIgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCiAKIHBhY2thZ2UgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgYmFzZSBpbnRlcmZhY2UgZm9yIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSAoRFNBKSBwdWJsaWMgb3IgcHJpdmF0ZQorICoga2V5cy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRFNBS2V5IHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIERTQSBrZXkgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBEU0Ega2V5IHBhcmFtZXRlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERTQVBhcmFtcyBnZXRQYXJhbXMoKTsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBS2V5UGFpckdlbmVyYXRvci5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBS2V5UGFpckdlbmVyYXRvci5qYXZhCmluZGV4IGMyYTJkZmIuLjRiODljNmEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQUtleVBhaXJHZW5lcmF0b3IuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FLZXlQYWlyR2VuZXJhdG9yLmphdmEKQEAgLTE1LDMxICsxNSw1NyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXM7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBpbnRlcmZhY2UgZm9yIGtleSBnZW5lcmF0b3JzIHRoYXQgY2FuIGdlbmVyYXRlIERTQSBrZXkgcGFpcnMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERTQUtleVBhaXJHZW5lcmF0b3IgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgcHJpbWUgKHtAY29kZSBwfSksIHN1YnByaW1lICh7QGNvZGUKKyAgICAgKiBxfSksIGFuZCBiYXNlICh7QGNvZGUgZ30pIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gcmFuZG9tCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9mIHJhbmRvbW5lc3MuCisgICAgICogQHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSB7QGNvZGUgbnVsbH0gb3IKKyAgICAgKiAgICAgICAgICAgICBpbnZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRFNBUGFyYW1zIHBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBnZW5lcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWx1cyBsZW5ndGguIFZhbGlkIHZhbHVlcworICAgICAqIGZvciB0aGUgbW9kdWx1cyBsZW5ndGggYXJlIHRoZSBtdWx0aXBsZXMgb2YgOCBiZXR3ZWVuIDUxMiBhbmQgMTAyNC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcGFyYW1ldGVyIHtAY29kZSBnZW5QYXJhbXN9IHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIGdlbmVyYXRlIG5ldyBwcmltZSAoe0Bjb2RlIHB9KSwgc3VicHJpbWUgKHtAY29kZSBxfSksIGFuZCBiYXNlICh7QGNvZGUgZ30pCisgICAgICogdmFsdWVzIG9yIHdoZXRoZXIKKyAgICAgKiBpdCB3aWxsIHVzZSB0aGUgcHJlLWNhbGN1bGF0ZWQgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsdXMKKyAgICAgKiBsZW5ndGguIERlZmF1bHQgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBtb2R1bHVzIGxlbmd0aHMgb2YgNTEyIGFuZCAxMDI0CisgICAgICogYml0cy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG1vZGxlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbW9kdWx1cyBpbiBiaXRzLgorICAgICAqIEBwYXJhbSBnZW5QYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgbmV3IHZhbHVlcyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorICAgICAqIEBwYXJhbSByYW5kb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgcmFuZG9tbmVzcy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIG1vZHVsdXMgbGVuZ3RoIGlzIG5vdCB2YWxpZCwgb3IgaWYgdGhlcmUgYXJlCisgICAgICogICAgICAgICAgICAgbm8gcHJlLWNhbGN1bGF0ZWQgdmFsdWVzIGFuZCB7QGNvZGUgZ2VuUGFyYW1zfSBpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShpbnQgbW9kbGVuLCBib29sZWFuIGdlblBhcmFtcywgU2VjdXJlUmFuZG9tIHJhbmRvbSkKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUGFyYW1zLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQYXJhbXMuamF2YQppbmRleCAzZGE5MjM2Li4wNDgzZGEyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQYXJhbXMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQYXJhbXMuamF2YQpAQCAtMTUsMzYgKzE1LDM4IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIGZvciBEaWdpdGFsIFNpZ25hdHVyZSBBbGdvcml0aG0gKERTQSkgc3BlY2lmaWMgcGFyYW1ldGVycy4gCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIERTQVBhcmFtcyB7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBiYXNlICh7QGNvZGUgZ30pIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJhc2UgKHtAY29kZSBnfSkgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0RygpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcHJpbWUgKHtAY29kZSBwfSkgdmFsdWUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUgKHtAY29kZSBwfSkgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgc3VicHJpbWUgKHtAY29kZSBxfSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJwcmltZSAoe0Bjb2RlIHF9IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFEoKTsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUHJpdmF0ZUtleS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUHJpdmF0ZUtleS5qYXZhCmluZGV4IDJhZDE1NmUuLmUyNTkyY2EgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQVByaXZhdGVLZXkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQcml2YXRlS2V5LmphdmEKQEAgLTE1LDMwICsxNSwzMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgRGlnaXRhbCBTaWduYXR1cmUgQWxnb3JpdGhtIChEU0EpIHByaXZhdGUga2V5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBEU0FQcml2YXRlS2V5IGV4dGVuZHMgRFNBS2V5LCBQcml2YXRlS2V5IHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFRoZSBzZXJpYWwgdmVyc2lvbiBpZGVudGlmaWVyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzc3NjQ5NzQ4MjUzMzc5MDI3OUw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcml2YXRlIGtleSB2YWx1ZSB7QGNvZGUgeH0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkgdmFsdWUge0Bjb2RlIHh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFgoKTsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUHVibGljS2V5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQdWJsaWNLZXkuamF2YQppbmRleCAwZGE3YmViLi5jY2I5ODVlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQdWJsaWNLZXkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQdWJsaWNLZXkuamF2YQpAQCAtMTUsMjggKzE1LDMwIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIGZvciBhIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSAoRFNBKSBwdWJsaWMga2V5LiAKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRFNBUHVibGljS2V5IGV4dGVuZHMgRFNBS2V5LCBQdWJsaWNLZXkgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUgc2VyaWFsIHZlcnNpb24gaWRlbnRpZmllci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyMzQ1MjYzMzI3NzkwMjIzMzJMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMga2V5IHZhbHVlIHtAY29kZSB5fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMga2V5IHZhbHVlIHtAY29kZSB5fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRZKCk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0VDS2V5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9FQ0tleS5qYXZhCmluZGV4IDk1MGE1MzMuLjlmNWQyNTQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0VDS2V5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNLZXkuamF2YQpAQCAtMTUsMjMgKzE1LDIyIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BhcmFtZXRlclNwZWM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgRWxsaXB0aWMgQ3VydmUgKEVDKSBwdWJsaWMgb3IgcHJpdmF0ZSBrZXlzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBFQ0tleSB7CisKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBFQyBrZXkgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBFQyBrZXkgcGFyYW1ldGVycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRUNQYXJhbWV0ZXJTcGVjIGdldFBhcmFtcygpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0VDUHJpdmF0ZUtleS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNQcml2YXRlS2V5LmphdmEKaW5kZXggZmNkMThiZS4uNzRlZjRjMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNQcml2YXRlS2V5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNQcml2YXRlS2V5LmphdmEKQEAgLTE1LDI4ICsxNSwzMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIEVsbGlwdGljIEN1cnZlIChFQykgcHJpdmF0ZSBrZXkuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEVDUHJpdmF0ZUtleSBleHRlbmRzIFByaXZhdGVLZXksIEVDS2V5IHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHNlcmlhbCB2ZXJzaW9uIGlkZW50aWZpZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzg5NjM5NDk1NjkyNTYwOTE4NEw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHByaXZhdGUgdmFsdWUge0Bjb2RlIFN9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaXZhdGUgdmFsdWUge0Bjb2RlIFN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFMoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9FQ1B1YmxpY0tleS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNQdWJsaWNLZXkuamF2YQppbmRleCBkMTM4MDM3Li4wNjNkZmU5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9FQ1B1YmxpY0tleS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL0VDUHVibGljS2V5LmphdmEKQEAgLTE1LDI4ICsxNSwzMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXM7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSBmb3IgYW4gRWxsaXB0aWMgQ3VydmUgKEVDKSBwdWJsaWMga2V5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBFQ1B1YmxpY0tleSBleHRlbmRzIFB1YmxpY0tleSwgRUNLZXkgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUgc2VyaWFsIHZlcnNpb24gaWRlbnRpZmllci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzE0OTg4NjI5ODc5NjMyODI2TDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHVibGljIHBvaW50IHtAY29kZSBXfSBvbiBhbiBlbGxpcHRpYyBjdXJ2ZSAoRUMpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBwb2ludCB7QGNvZGUgV30gb24gYW4gZWxsaXB0aWMgY3VydmUgKEVDKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRUNQb2ludCBnZXRXKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBS2V5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FLZXkuamF2YQppbmRleCBmZTM0OTc3Li5iYzA4NzdlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FLZXkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FLZXkuamF2YQpAQCAtMTUsMjIgKzE1LDIyIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgYmFzZSBpbnRlcmZhY2UgZm9yIFBLQ1MjMSBSU0EgcHVibGljIGFuZCBwcml2YXRlIGtleXMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJTQUtleSB7CisKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG1vZHVsdXMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbW9kdWx1cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNb2R1bHVzKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5LmphdmEKaW5kZXggNWNkZjBlMS4uYzVlODZjMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXkuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleS5qYXZhCkBAIC0xNSw1OCArMTUsODEgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQU90aGVyUHJpbWVJbmZvOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIGZvciBhIE11bHRpLVByaW1lIFJTQSBwcml2YXRlIGtleS4gU3BlY2lmaWVkIGJ5IDxhCisgKiBocmVmPSJodHRwOi8vd3d3LnJzYS5jb20vcnNhbGFicy9ub2RlLmFzcD9pZD0yMTI1Ij5QS0NTICMxIHYyLjAgQW1lbmRtZW50IDE6CisgKiBNdWx0aS1QcmltZSBSU0E8L2E+LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleSBleHRlbmRzIFJTQVByaXZhdGVLZXkgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiB0aGUgc2VyaWFsIHZlcnNpb24gaWRlbnRpZmllci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYxODA1ODUzMzUzNDYyODAwOEw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIENSVCBjb2VmZmljaWVudCwge0Bjb2RlIHFeLTEgbW9kIHB9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIENSVCBjb2VmZmljaWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRDcnRDb2VmZmljaWVudCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFkZGl0aW9uYWwgcHJpbWVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWRkaXRpb25hbCBwcmltZXMsIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlcmUgYXJlIG9ubHkgdGhlIHR3byBwcmltZXMgKHtAY29kZSBwLCBxfSksCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJTQU90aGVyUHJpbWVJbmZvW10gZ2V0T3RoZXJQcmltZUluZm8oKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfSBvZiB7QGNvZGUgbn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfSBvZiB7QGNvZGUgbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpbWVQKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHByaW1lIGZhY3RvciB7QGNvZGUgcX0gb2Yge0Bjb2RlIG59LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaW1lIGZhY3RvciB7QGNvZGUgcX0gb2Yge0Bjb2RlIG59LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFByaW1lUSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBDUlQgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBwfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBDUlQgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50UCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBDUlQgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBxfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBDUlQgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBxfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50USgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIGV9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBleHBvbmVudCB7QGNvZGUgZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHVibGljRXhwb25lbnQoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FQcml2YXRlQ3J0S2V5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FQcml2YXRlQ3J0S2V5LmphdmEKaW5kZXggOWYxMTU4Mi4uNDhkNzBjZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHJpdmF0ZUNydEtleS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQVByaXZhdGVDcnRLZXkuamF2YQpAQCAtMTUsNTkgKzE1LDY5IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlczsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIGZvciBhIFBLQ1MjMSBSU0EgcHJpdmF0ZSBrZXkgdXNpbmcgQ1JUIGluZm9ybWF0aW9uIHZhbHVlcy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUlNBUHJpdmF0ZUNydEtleSBleHRlbmRzIFJTQVByaXZhdGVLZXkgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUgc2VyaWFsIHZlcnNpb24gaWRlbnRpZmllci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NjgyMjE0MjUzNTI3NzAwMzY4TDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIENSVCBjb2VmZmljaWVudCwge0Bjb2RlIHFeLTEgbW9kIHB9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIENSVCBjb2VmZmljaWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRDcnRDb2VmZmljaWVudCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfSBvZiB7QGNvZGUgbn0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfSBvZiB7QGNvZGUgbn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpbWVQKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmltZSBmYWN0b3Ige0Bjb2RlIHF9IG9mIHtAY29kZSBufS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltZSBmYWN0b3Ige0Bjb2RlIHF9IG9mIHtAY29kZSBufS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmltZVEoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIENSVCBleHBvbmVudCBvZiB0aGUgcHJpbWV0IHtAY29kZSBwfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBDUlQgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50UCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgQ1JUIGV4cG9uZW50IG9mIHRoZSBwcmltZSB7QGNvZGUgcX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgQ1JUIGV4cG9uZW50IG9mIHRoZSBwcmltZSB7QGNvZGUgcX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpbWVFeHBvbmVudFEoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHB1YmxpYyBleHBvbmVudCB7QGNvZGUgZX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHVibGljIGV4cG9uZW50IHtAY29kZSBlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQdWJsaWNFeHBvbmVudCgpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQVByaXZhdGVLZXkuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQVByaXZhdGVLZXkuamF2YQppbmRleCA3MDdkMGMyLi4wNDFhMWUzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FQcml2YXRlS2V5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHJpdmF0ZUtleS5qYXZhCkBAIC0xNSwyOSArMTUsMzAgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIGZvciBhbiBQS0NTIzEgUlNBIHByaXZhdGUga2V5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSU0FQcml2YXRlS2V5IGV4dGVuZHMgUHJpdmF0ZUtleSwgUlNBS2V5IHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHNlcmlhbCB2ZXJzaW9uIGlkZW50aWZpZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MTg3MTQ0ODA0OTM2NTk1MDIyTDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHByaXZhdGUgZXhwb25lbnQge0Bjb2RlIGR9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaXZhdGUgZXhwb25lbnQge0Bjb2RlIGR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFByaXZhdGVFeHBvbmVudCgpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQVB1YmxpY0tleS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHVibGljS2V5LmphdmEKaW5kZXggN2E4NzgyNi4uYjEzYjFhYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHVibGljS2V5LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHVibGljS2V5LmphdmEKQEAgLTE1LDI5ICsxNSwzMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSBmb3IgYSBQS0NTIzEgUlNBIHB1YmxpYyBrZXkuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJTQVB1YmxpY0tleSBleHRlbmRzIFB1YmxpY0tleSwgUlNBS2V5IHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHNlcmlhbCB2ZXJzaW9uIGlkZW50aWZpZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODcyNzQzNDA5NjI0MTEwMTE5NEw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIGV9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBleHBvbmVudCB7QGNvZGUgZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHVibGljRXhwb25lbnQoKTsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvcGFja2FnZS5odG1sIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2ludGVyZmFjZXMvcGFja2FnZS5odG1sCmluZGV4IGQyNzcyYTYuLjZmMTRkZTEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9pbnRlcmZhY2VzL3BhY2thZ2UuaHRtbAorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvaW50ZXJmYWNlcy9wYWNrYWdlLmh0bWwKQEAgLTEwLDUgKzEwLDYgQEAKICgyKSBLZXlzIGZvciB0aGUgRGlnaXRhbCBTaWduYXR1cmUgQWxnb3JpdGhtIChEU0EpIHNwZWNpZmllZCBieSBGSVBTLTE4NjsKICgzKSBLZXlzIGZvciBhIGdlbmVyaWMgRWxsaXB0aWMgQ3VydmUgYXN5bW1ldHJpYyBlbmNyeXB0aW9uIGFsZ29yaXRobS4KIDwvcD4KK0BzaW5jZSBBbmRyb2lkIDEuMAogPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9wYWNrYWdlLmh0bWwgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvcGFja2FnZS5odG1sCmluZGV4IDZhODdiYzMuLmI0ZjQ1MGUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9wYWNrYWdlLmh0bWwKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3BhY2thZ2UuaHRtbApAQCAtNCwxMiArNCwzMyBAQAogPC9oZWFkPgogPGh0bWw+CiA8Ym9keT4KLTxwPgotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFsbCB0aGUgY2xhc3NlcyBhbmQgYWxsIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCBieSBKYXZhIHNlY3VyaXR5IGZyYW1ld29yay4KLUZ1bmN0aW9uYWxpdHkgZm9yIHNpZ25pbmcgamFyIGZpbGVzIENsYXNzIHtAbGluayBqYXZhLnNlY3VyaXR5LlNpZ25lcn07IGZvciBnZW5lcmF0aW5nCi1wdWJsaWMgYW5kIHByaXZhdGUga2V5IGZvciBhc3ltbWV0cmljIGVuY3J5cHRpb24gYWxnb3JpdGhtIHtAbGluayBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleX0gYW5kCi17QGxpbmsgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5fSBhcmUgcHJvdmlkZWQuCi1BbGwgdGhlIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGV4cGFuZCB0aGUgcHJpdmlsZWRnZXMgd2l0aGluIHRoZSBBY2Nlc3NDb250cm9sbGVyIGFyZSBhbHNvIGRlZmluZWQgaGVyZS4KKzxwPlRoaXMgcGFja2FnZSBwcm92aWRlcyBhbGwgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgdGhhdAorY29uc3RpdHV0ZSB0aGUgSmF2YSBzZWN1cml0eSBmcmFtZXdvcmsuIFRoZSBjb250ZW50IG9mIHRoaXMgcGFja2FnZSBjYW4KK2JlIGRpdmlkZWQgaW50byB0d28gcGFydHM6CisKKzx1bD4KKwk8bGk+Q2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhlIGFjY2VzcyBjb250cm9sIGluZnJhc3RydWN0dXJlLgorCTxwPlRoZSBjZW50cmFsIGNsYXNzIGlzIDxpPmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjwvaT4KKwl3aGljaCBjaGVja3MgaWYgY29kZSwgaW52b2tpbmcgc2Vuc2l0aXZlIHJlc291cmNlcywgd2FzIGdyYW50ZWQgdGhlIHJlcXVpcmVkCisJcGVybWlzc2lvbnMuCisJPHA+VGhlIGNsYXNzIGxvYWRlciAoPGk+amF2YS5zZWN1cml0eS5TZWN1cmVDbGFzc0xvYWRlcjwvaT4pIGFzc29jaWF0ZXMgY2xhc3NlcworCXdpdGggYSBwcm90ZWN0aW9uIGRvbWFpbiAoPGk+amF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluPC9pPikgd2hpY2ggY29uc2lzdHMgb2YgYQorCWNvZGUgc291cmNlICg8aT5qYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U8L2k+KSBhbmQgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnMgCisJKDxpPmphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjwvaT4pLiBUaGUgcG9saWN5LCBkZWZpbmVkIHRocm91Z2ggPGk+amF2YS5zZWN1cml0eS5Qb2xpY3k8L2k+LCBkZWZpbmVzCisJd2hpY2ggcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQgdG8gY2xhc3NlcyBsb2FkZWQgZnJvbSBhIGNvZGUgc291cmNlICggY2xhc3MKKwk8aT5qYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U8L2k+KS4KKwk8bGk+Q2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBmb3IgdGhlIGV4dGVuc2libGUgY3J5cHRvZ3JhcGhpYworCTxpPnNlcnZpY2UgcHJvdmlkZXIgaW5mcmFzdHJ1Y3R1cmU8L2k+ICg8Yj5TUEk8L2I+KSBzdWNoIGFzIGFic3RyYWN0aW9ucyBmb3IgY2VydGlmaWNhdGVzLAorCXNpZ25hdHVyZXMsIHByaXZhdGUgYW5kIHB1YmxpYyBrZXlzLiBBbHNvIGFic3RyYWN0aW9ucyBmb3IgdGhlIGFsZ29yaXRobXMKKwl0aGV5IHV0aWxpemUgYXJlIHByb3ZpZGVkIGluIHRoaXMgcGFja2FnZS4KKwk8cD5TZWN1cml0eSBwcm92aWRlcnMsIGFzIGRlZmluZWQgaW4gPGk+amF2YS5zZWN1cml0eS5Qcm92aWRlcnM8L2k+LCBjYW4gYmUgCisJcmVnaXN0ZXJlZCB0byBwcm92aWRlCisJZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBmb3IgYSB2YXJpZXR5IG9mIHNlY3VyaXR5IGluZnJhc3RydWN0dXJlLAorCXN1Y2ggYXMga2V5IHN0b3Jlcy4gVGhlcmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nCisJc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UgKGkuZS4gPGk+amF2YS5zZWN1cml0eS5LZXlTdG9yZVNwaTwvaT4pIG11c3QgYmUKKwlpbXBsZW1lbnRlZC4KKzwvdWw+CiA8L3A+CitAc2luY2UgQW5kcm9pZCAxLjAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0FsZ29yaXRobVBhcmFtZXRlclNwZWMuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0FsZ29yaXRobVBhcmFtZXRlclNwZWMuamF2YQppbmRleCAwZjFkZjcyLi4zMmM3YTNhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5qYXZhCkBAIC0xNSwxNiArMTUsMTMgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgbWFya2VyIGludGVyZmFjZSBmb3IgYWxnb3JpdGhtIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9ucy4gVGhlIHB1cnBvc2UgaXMKKyAqIHRvIGdyb3VwIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9ucyBmb3IgYWxnb3JpdGhtcy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyB7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRFNBUGFyYW1ldGVyU3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRFNBUGFyYW1ldGVyU3BlYy5qYXZhCmluZGV4IGMzMzFjMWYuLjU0NjViNWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0RTQVBhcmFtZXRlclNwZWMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9EU0FQYXJhbWV0ZXJTcGVjLmphdmEKQEAgLTE1LDE5ICsxNSwxNSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVBhcmFtczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uIHVzZWQgd2l0aCB0aGUgRGlnaXRhbCBTaWduYXR1cmUgQWxnb3JpdGhtIChEU0EpLiAKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEU0FQYXJhbWV0ZXJTcGVjIGltcGxlbWVudHMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYywgRFNBUGFyYW1zIHsKICAgICAvLyBQcmltZQpAQCAtMzgsNyArMzQsMTYgQEAKICAgICBwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgZzsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRFNBUGFyYW1ldGVyU3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIHByaW1lIHtAY29kZSBwfSwKKyAgICAgKiBzdWItcHJpbWUge0Bjb2RlIHF9IGFuZCB0aGUgYmFzZSB7QGNvZGUgZ30uCisgICAgICogCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltZSB7QGNvZGUgcH0uCisgICAgICogQHBhcmFtIHEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWItcHJpbWUge0Bjb2RlIHF9LgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgYmFzZSB7QGNvZGUgZ307CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERTQVBhcmFtZXRlclNwZWMoQmlnSW50ZWdlciBwLCBCaWdJbnRlZ2VyIHEsIEJpZ0ludGVnZXIgZykgewogICAgICAgICB0aGlzLnAgPSBwOwpAQCAtNDcsMjEgKzUyLDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIHtAY29kZSBnfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBiYXNlIHtAY29kZSBnfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRHKCkgewogICAgICAgICByZXR1cm4gZzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHByaW1lIHtAY29kZSBwfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltZSB7QGNvZGUgcH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UCgpIHsKICAgICAgICAgcmV0dXJuIHA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBzdWItcHJpbWUge0Bjb2RlIHF9LgorICAgICAqIEByZXR1cm4gdGhlIHN1Yi1wcmltZSB7QGNvZGUgcX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0USgpIHsKICAgICAgICAgcmV0dXJuIHE7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9EU0FQcml2YXRlS2V5U3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRFNBUHJpdmF0ZUtleVNwZWMuamF2YQppbmRleCBkMDk1ZWFhLi4zYjY5MmM4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9EU0FQcml2YXRlS2V5U3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0RTQVByaXZhdGVLZXlTcGVjLmphdmEKQEAgLTE1LDE4ICsxNSwxNCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgYSBEU0EgcHJpdmF0ZSBrZXkuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRFNBUHJpdmF0ZUtleVNwZWMgaW1wbGVtZW50cyBLZXlTcGVjIHsKICAgICAvLyBQcml2YXRlIGtleQpAQCAtMzksNyArMzUsMTggQEAKICAgICBwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgZzsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRFNBUHJpdmF0ZUtleVNwZWN9IHdpdGggdGhlIHNwZWNpZmllZCBwcml2YXRlIGtleSwKKyAgICAgKiBwcmltZSwgc3ViLXByaW1lIGFuZCBiYXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgcHJpdmF0ZSBrZXkge0Bjb2RlIHh9LgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgcHJpbWUge0Bjb2RlIHB9LgorICAgICAqIEBwYXJhbSBxCisgICAgICogICAgICAgICAgICB0aGUgc3ViLXByaW1lIHtAY29kZSBxfS4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGJhc2Uge0Bjb2RlIGd9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEU0FQcml2YXRlS2V5U3BlYyhCaWdJbnRlZ2VyIHgsIEJpZ0ludGVnZXIgcCwKICAgICAgICAgICAgIEJpZ0ludGVnZXIgcSwgQmlnSW50ZWdlciBnKSB7CkBAIC01MCwyOCArNTcsNDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGJhc2Uge0Bjb2RlIGd9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJhc2Uge0Bjb2RlIGd9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEcoKSB7CiAgICAgICAgIHJldHVybiBnOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpbWUge0Bjb2RlIHB9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaW1lIHtAY29kZSBwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQKCkgewogICAgICAgICByZXR1cm4gcDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHN1Yi1wcmltZSB7QGNvZGUgcX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3ViLXByaW1lIHtAY29kZSBxfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRRKCkgewogICAgICAgICByZXR1cm4gcTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHByaXZhdGUga2V5IHtAY29kZSB4fS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcml2YXRlIGtleSB7QGNvZGUgeH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0WCgpIHsKICAgICAgICAgcmV0dXJuIHg7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9EU0FQdWJsaWNLZXlTcGVjLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9EU0FQdWJsaWNLZXlTcGVjLmphdmEKaW5kZXggZTM3NDMwZC4uOTVkMTE0MSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRFNBUHVibGljS2V5U3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0RTQVB1YmxpY0tleVNwZWMuamF2YQpAQCAtMTUsMTggKzE1LDE0IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHBhcmFtZXRlcnMgc3BlY2lmeWluZyBhIERTQSBwdWJsaWMga2V5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIERTQVB1YmxpY0tleVNwZWMgaW1wbGVtZW50cyBLZXlTcGVjIHsKICAgICAvLyBQdWJsaWMga2V5CkBAIC0zOSw3ICszNSwxOCBAQAogICAgIHByaXZhdGUgZmluYWwgQmlnSW50ZWdlciBnOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBEU0FQdWJsaWNLZXlTcGVjfSB3aXRoIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleSwKKyAgICAgKiAgcHJpbWUsIHN1Yi1wcmltZSBhbmQgYmFzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyBrZXkgdmFsdWUge0Bjb2RlIHl9LgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgcHJpbWUge0Bjb2RlIHB9LgorICAgICAqIEBwYXJhbSBxCisgICAgICogICAgICAgICAgICB0aGUgc3ViLXByaW1lIHtAY29kZSBxfS4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGJhc2Uge0Bjb2RlIGd9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEU0FQdWJsaWNLZXlTcGVjKEJpZ0ludGVnZXIgeSwgQmlnSW50ZWdlciBwLAogICAgICAgICAgICAgQmlnSW50ZWdlciBxLCBCaWdJbnRlZ2VyIGcpIHsKQEAgLTUwLDI4ICs1Nyw0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgYmFzZSB7QGNvZGUgZ30uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYmFzZSB7QGNvZGUgZ30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0RygpIHsKICAgICAgICAgcmV0dXJuIGc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmltZSB7QGNvZGUgcH0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUge0Bjb2RlIHB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFAoKSB7CiAgICAgICAgIHJldHVybiBwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc3ViLXByaW1lIHtAY29kZSBxfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWItcHJpbWUge0Bjb2RlIHF9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFEoKSB7CiAgICAgICAgIHJldHVybiBxOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHVibGljIGtleSB2YWx1ZSB7QGNvZGUgeX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHVibGljIGtleSB2YWx1ZSB7QGNvZGUgeX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0WSgpIHsKICAgICAgICAgcmV0dXJuIHk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ0ZpZWxkLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ0ZpZWxkLmphdmEKaW5kZXggMjIxMDlhMy4uNzRhNWViOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNGaWVsZC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDRmllbGQuamF2YQpAQCAtMTUsMjEgKzE1LDIwIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgYSBGaW5pdGUgRmllbGQgb2YgYW4gRWxsaXB0aWMgQ3VydmUuIAogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBFQ0ZpZWxkIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmllbGQgKGluIGJpdHMpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZpZWxkIChpbiBiaXRzKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBpbnQgZ2V0RmllbGRTaXplKCk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ0ZpZWxkRjJtLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ0ZpZWxkRjJtLmphdmEKaW5kZXggYTJmMTNiMS4uZDY4Mzc4YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNGaWVsZEYybS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDRmllbGRGMm0uamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuc3BlYzsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwpAQCAtMjgsOCArMjMsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgcGFyYW1ldGVycyBzcGVjaWZ5aW5nIGEgPGk+Y2hhcmFjdGVyaXN0aWMgMiBmaW5pdGUgZmllbGQ8L2k+IG9mIGFuCisgKiBlbGxpcHRpYyBjdXJ2ZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBFQ0ZpZWxkRjJtIGltcGxlbWVudHMgRUNGaWVsZCB7CiAgICAgLy8gTWlkIHRlcm1zIGFycmF5IGxlbmd0aCBmb3IgdHJpbm9taWFsIGJhc2lzCkBAIC00OCw3ICs0NSwxNCBAQAogICAgIHByaXZhdGUgZmluYWwgaW50W10ga3M7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEVDRmllbGRGMm19IHdpdGgge0Bjb2RlIDJebX0gZWxlbWVudHMgd2l0aCBhIG5vcm1hbAorICAgICAqIGJhc2lzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtCisgICAgICogICAgICAgICAgICB0aGUgZXhwb25lbnQge0Bjb2RlIG19IGZvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG0gPD0gemVyb30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVDRmllbGRGMm0oaW50IG0pIHsKICAgICAgICAgdGhpcy5tID0gbTsKQEAgLTYwLDcgKzY0LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFQ0ZpZWxkRjJtfSB3aXRoIHtAY29kZSAyXm19IGVsZW1lbnRzIHdpdGggYSBwb2x5bm9taWFsCisgICAgICogYmFzaXMgYW5kIHRoZSByZWR1Y3Rpb24gcG9seW5vbWlhbCBiYXNlZCBvbiB7QGNvZGUgcnB9LgorICAgICAqIDxwPgorICAgICAqIFRoZSByZWR1Y3Rpb24gcG9seW5vbWlhbCBtdXN0IGJlIGVpdGhlciA8aT50cmlub21pYWw8L2k+IG9yCisgICAgICogPGk+cGVudGFub21pYWw8L2k+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbQorICAgICAqICAgICAgICAgICAgdGhlIGV4cG9uZW50IHtAY29kZSBtfSBmb3IgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gcnAKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYXNlIG9mIHRoZSByZWR1Y3Rpb24gcG9seW5vbWlhbCB3aXRoIHRoZSBuLXRoIGJpdAorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgbi10aCBjb2VmZmljaWVudCBvZiB0aGUgcmVkdWN0aW9uCisgICAgICogICAgICAgICAgICBwb2x5bm9taWFsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG0gPD0gemVyb30gb3IgdGhlIHtAY29kZSBycH0gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRUNGaWVsZEYybShpbnQgbSwgQmlnSW50ZWdlciBycCkgewogICAgICAgICB0aGlzLm0gPSBtOwpAQCAtOTMsNyArMTEyLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFQ0ZpZWxkRjJtfSB3aXRoIHtAY29kZSAyXm19IGVsZW1lbnRzIHdpdGgKKyAgICAgKiBhIHBvbHlub21pYWwgYmFzaXMgYW5kIHRoZSByZWR1Y3Rpb24gcG9seW5vbWlhbCBiYXNlZCBvbiB7QGNvZGUga3N9LgorICAgICAqIDxwPgorICAgICAqIFRoZSByZWR1Y3Rpb24gcG9seW5vbWlhbCBtdXN0IGJlIGVpdGhlciA8aT50cmlub21pYWw8L2k+IG9yCisgICAgICogPGk+cGVudGFub21pYWw8L2k+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbQorICAgICAqICAgICAgICAgICAgdGhlIGV4cG9uZW50IHtAY29kZSBtfSBmb3IgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0ga3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYXNlIG9mIHRoZSByZWR1Y3Rpb24gcG9seW5vbWlhbCB3aXRoIGNvZWZmaWNpZW50cworICAgICAqICAgICAgICAgICAgZ2l2ZW4gaW4gZGVzY2VuZGluZyBvcmRlci4gICAgIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG0gPD0gemVyb30gb3IgdGhlIHJlZHVjdGlvbiBwb2x5bm9taWFsIGlzIG5vdAorICAgICAqICAgICAgICAgICAgIHZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFQ0ZpZWxkRjJtKGludCBtLCBpbnRbXSBrcykgewogICAgICAgICB0aGlzLm0gPSBtOwpAQCAtMTQyLDcgKzE3NiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGVxdWFscyB0byB0aGlzIGZpbml0ZSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8gdGhpcyBmaW5pdGUgZmllbGQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBmaW5pdGUgZmllbGQsCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICAvLyBvYmplY3QgZXF1YWxzIHRvIGl0c2VsZgpAQCAtMTcxLDIxICsyMTEsMzQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaW5pdGUgZmllbGQgKGluIGJpdHMpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBmaW5pdGUgZmllbGQgKGluIGJpdHMpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RmllbGRTaXplKCkgewogICAgICAgICByZXR1cm4gbTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGV4cG9uZW50IHtAY29kZSBtfSBmb3IgdGhpcyBmaW5pdGUgZmllbGQsIHdpdGgge0Bjb2RlIDJebX0gYXMKKyAgICAgKiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGV4cG9uZW50IHtAY29kZSBtfSBmb3IgdGhpcyBmaW5pdGUgZmllbGQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE0oKSB7CiAgICAgICAgIHJldHVybiBtOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGludGVnZXIgYXJyYXkgY29udGFpbmluZyB0aGUgb3JkZXIgb2YgdGhlIG1pZGRsZQorICAgICAqIHRlcm0ocykgb2YgdGhlIHJlZHVjdGlvbiBwb2x5bm9taWFsIGZvciBhIHBvbHlub21pYWwgYmFzaXMuCisgICAgICogCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGludGVnZXIgYXJyYXkgY29udGFpbmluZyB0aGUgb3JkZXIgb2YgdGhlIG1pZGRsZQorICAgICAqICAgICAgICAgdGVybShzKSBvZiB0aGUgcmVkdWN0aW9uIHBvbHlub21pYWwgZm9yIGEgcG9seW5vbWlhbCBiYXNpcyBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGZvciBhIG5vcm1hbCBiYXNpcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwoKSB7CiAgICAgICAgIC8vIERlZmVuc2l2ZWx5IGNvcGllcyBwcml2YXRlIGFycmF5CkBAIC0yMDEsMTQgKzI1NCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgcmVkdWN0aW9uIHBvbHlub21pYWwgd2l0aCB0aGUgbi10aCBiaXQKKyAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBuLXRoIGNvZWZmaWNpZW50IG9mIHRoZSByZWR1Y3Rpb24gcG9seW5vbWlhbCBmb3IgYQorICAgICAqIHBvbHlub21pYWwgYmFzaXMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYmFzZSBvZiB0aGUgcmVkdWN0aW9uIHBvbHlub21pYWwgd2l0aCB0aGUgbi10aCBiaXQKKyAgICAgKiAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG4tdGggY29lZmZpY2llbnQgb2YgdGhlIHJlZHVjdGlvbiBwb2x5bm9taWFsCisgICAgICogICAgICAgICBmb3IgYSBwb2x5bm9taWFsIGJhc2lzIG9yIHtAY29kZSBudWxsfSBmb3IgYSBub3JtYWwgYmFzaXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UmVkdWN0aW9uUG9seW5vbWlhbCgpIHsKICAgICAgICAgcmV0dXJuIHJwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgaGFzaGNvZGUgdmFsdWUgZm9yIHRoaXMgZmluaXRlIGZpZWxkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGhhc2hjb2RlIHZhbHVlIGZvciB0aGlzIGZpbml0ZSBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gcnAgPT0gbnVsbCA/IG0gOiBtICsgcnAuaGFzaENvZGUoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDRmllbGRGcC5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNGaWVsZEZwLmphdmEKaW5kZXggNjMyOGVhOS4uZDNmNGVlNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNGaWVsZEZwLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNGaWVsZEZwLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKQEAgLTI3LDE1ICsyMiwyNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgYSA8aT5wcmltZSBmaW5pdGUgZmllbGQ8L2k+IG9mIGFuCisgKiBlbGxpcHRpYyBjdXJ2ZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBFQ0ZpZWxkRnAgaW1wbGVtZW50cyBFQ0ZpZWxkIHsKICAgICAvLyBQcmltZQogICAgIHByaXZhdGUgZmluYWwgQmlnSW50ZWdlciBwOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHByaW1lIGZpbml0ZSBmaWVsZCBvZiBhbiBlbGxpcHRpYyBjdXJ2ZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwcmltZSB7QGNvZGUgcH0uCisgICAgICogCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltZSB2YWx1ZSB7QGNvZGUgcH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcCA8PSB6ZXJvfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRUNGaWVsZEZwKEJpZ0ludGVnZXIgcCkgewogICAgICAgICB0aGlzLnAgPSBwOwpAQCAtNDksMjEgKzUzLDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmaW5pdGUgZmllbGQgKGluIGJpdHMpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZpbml0ZSBmaWVsZCAoaW4gYml0cykuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRGaWVsZFNpemUoKSB7CiAgICAgICAgIHJldHVybiBwLmJpdExlbmd0aCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpbWUgdmFsdWUge0Bjb2RlIHB9IGZvciB0aGlzIGZpbml0ZSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltZSB2YWx1ZSB7QGNvZGUgcH0gZm9yIHRoaXMgZmluaXRlIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFAoKSB7CiAgICAgICAgIHJldHVybiBwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgZmluaXRlIGZpZWxkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0byB0aGlzIGZpbml0ZSBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIGZpbml0ZSBmaWVsZCwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIC8vIG9iamVjdCBlcXVhbHMgaXRzZWxmCkBAIC03Nyw3ICs5MywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgaGFzaGNvZGUgdmFsdWUgZm9yIHRoaXMgZmluaXRlIGZpZWxkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGhhc2hjb2RlIHZhbHVlIGZvciB0aGlzIGZpbml0ZSBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gcC5oYXNoQ29kZSgpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNHZW5QYXJhbWV0ZXJTcGVjLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ0dlblBhcmFtZXRlclNwZWMuamF2YQppbmRleCA0YmU1MjgzLi4yMTBiMzE1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ0dlblBhcmFtZXRlclNwZWMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ0dlblBhcmFtZXRlclNwZWMuamF2YQpAQCAtMTUsMTggKzE1LDE0IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gdXNlZCB0byBnZW5lcmF0ZSBlbGxpcHRpYyBjdXJ2ZSBkb21haW4gcGFyYW1ldGVycy4gCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRUNHZW5QYXJhbWV0ZXJTcGVjIGltcGxlbWVudHMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyB7CiAgICAgLy8gU3RhbmRhcmQgKG9yIHByZWRlZmluZWQpIG5hbWUgZm9yIEVDIGRvbWFpbgpAQCAtMzQsNyArMzAsMTIgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFQ0dlblBhcmFtZXRlclNwZWN9IHdpdGggdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBvcgorICAgICAqIHByZWRlZmluZWQgbmFtZSBvZiB0aGUgdG8tYmUtZ2VuZXJhdGVkIGRvbWFpbiBwYXJhbWV0ZXIuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbGxpcHRpYyBjdXJ2ZSBkb21haW4gcGFyYW1ldGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFQ0dlblBhcmFtZXRlclNwZWMoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKQEAgLTQ0LDcgKzQ1LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIChzdGFuZGFyZCBvciBwcmVkZWZpbmVkKSBvZiB0aGUgdG8tYmUtZ2VuZXJhdGVkIGVsbGlwdGljCisgICAgICogY3VydmUgZG9tYWluIHBhcmFtZXRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUGFyYW1ldGVyU3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNQYXJhbWV0ZXJTcGVjLmphdmEKaW5kZXggZjQzODg0NC4uZTEwNzU3YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNQYXJhbWV0ZXJTcGVjLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNQYXJhbWV0ZXJTcGVjLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKQEAgLTI3LDggKzIyLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gdXNlZCB3aXRoIEVsbGlwdGljIEN1cnZlIENyeXB0b2dyYXBoeSAoRUNDKS4gCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRUNQYXJhbWV0ZXJTcGVjIGltcGxlbWVudHMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyB7CiAgICAgLy8gRWxsaXB0aWMgY3VydmUgZm9yIHdoaWNoIHRoaXMgaXMgcGFyYW1ldGVyCkBAIC00MSw3ICszNywyMSBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IGNvZmFjdG9yOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFQ1BhcmFtZXRlclNwZWN9IHdpdGggdGhlIHNwZWNpZmllZCBlbGxpcHRpYyBjdXJ2ZSwKKyAgICAgKiB0aGUgYmFzZSBwb2ludCwgdGhlIG9yZGVyIG9mIHRoZSBnZW5lcmF0b3IgKG9yIGJhc2UgcG9pbnQpIGFuZCB0aGUKKyAgICAgKiBjby1mYWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGN1cnZlCisgICAgICogICAgICAgICAgICB0aGUgZWxsaXB0aWMgY3VydmUuCisgICAgICogQHBhcmFtIGdlbmVyYXRvcgorICAgICAqICAgICAgICAgICAgdGhlIGdlbmVyYXRvciAob3IgYmFzZSBwb2ludCkuCisgICAgICogQHBhcmFtIG9yZGVyCisgICAgICogICAgICAgICAgICB0aGUgb3JkZXIgb2YgdGhlIGdlbmVyYXRvci4KKyAgICAgKiBAcGFyYW0gY29mYWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBjby1mYWN0b3IuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb3JkZXIgPD0gemVyb30gb3Ige0Bjb2RlIGNvZmFjdG9yIDw9IHplcm99LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFQ1BhcmFtZXRlclNwZWMoRWxsaXB0aWNDdXJ2ZSBjdXJ2ZSwgRUNQb2ludCBnZW5lcmF0b3IsCiAgICAgICAgICAgICBCaWdJbnRlZ2VyIG9yZGVyLCBpbnQgY29mYWN0b3IpIHsKQEAgLTcxLDI4ICs4MSw0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIGNvZmFjdG9yfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgY29mYWN0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Q29mYWN0b3IoKSB7CiAgICAgICAgIHJldHVybiBjb2ZhY3RvcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGVsbGlwdGljIGN1cnZlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVsbGlwdGljIGN1cnZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFbGxpcHRpY0N1cnZlIGdldEN1cnZlKCkgewogICAgICAgICByZXR1cm4gY3VydmU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBnZW5lcmF0b3IgKG9yIGJhc2UgcG9pbnQpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYXRvciAob3IgYmFzZSBwb2ludCkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVDUG9pbnQgZ2V0R2VuZXJhdG9yKCkgewogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgb3JkZXIgb2YgdGhlIGdlbmVyYXRvci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBvcmRlciBvZiB0aGUgZ2VuZXJhdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE9yZGVyKCkgewogICAgICAgICByZXR1cm4gb3JkZXI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ1BvaW50LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ1BvaW50LmphdmEKaW5kZXggYjRjMDczNy4uM2FiYTZjNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNQb2ludC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUG9pbnQuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuc3BlYzsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwpAQCAtMjcsMTIgKzIyLDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogQSBQb2ludCBvbiBhbiBFbGxpcHRpYyBDdXJ2ZSBpbiBiYXJ5Y2VudHJpYyAob3IgYWZmaW5lKSBjb29yZGluYXRlcy4gIAogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEVDUG9pbnQgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBUaGUgcG9pbnQgb24gYW4gRWxsaXB0aWMgQ3VydmUgYXQgaW5maW5pdHkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFQ1BvaW50IFBPSU5UX0lORklOSVRZID0gbmV3IEVDUG9pbnQoKTsKICAgICAvLyBhZmZpbmUgWCBjb29yZGluYXRlIG9mIHRoaXMgcG9pbnQKQEAgLTQ3LDcgKzQ2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHBvaW50IGF0IHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFmZmluZVgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4LWNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGFmZmluZVkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5LWNvb3JkaW5hdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVDUG9pbnQoQmlnSW50ZWdlciBhZmZpbmVYLCBCaWdJbnRlZ2VyIGFmZmluZVkpIHsKICAgICAgICAgdGhpcy5hZmZpbmVYID0gYWZmaW5lWDsKQEAgLTYxLDIxICs2NiwzNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgeC1jb29yZGluYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHgtY29vcmRpbmF0ZSwgb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUgaW5maW5pdGUgcG9pbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QWZmaW5lWCgpIHsKICAgICAgICAgcmV0dXJuIGFmZmluZVg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB5LWNvb3JkaW5hdGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgeS1jb29yZGluYXRlLCBvciB7QGNvZGUgbnVsbH0gZm90IHRoZSBpbmZpbml0ZSBwb2ludC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRBZmZpbmVZKCkgewogICAgICAgICByZXR1cm4gYWZmaW5lWTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgdGhpcyBlbGxpcHRpYyBjdXJ2ZSBwb2ludCBhcmUKKyAgICAgKiBlcXVhbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgdGhpcyBlbGxpcHRpYyBjdXJ2ZQorICAgICAqICAgICAgICAgcG9pbnQgYXJlIGVxdWFsLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CiAgICAgICAgIGlmICh0aGlzID09IG90aGVyKSB7CkBAIC05NSw3ICsxMTMsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGhhc2hjb2RlIG9mIHRoaXMgZWxsaXB0aWMgY3VydmUgcG9pbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaGFzaGNvZGUgb2YgdGhpcyBlbGxpcHRpYyBjdXJ2ZSBwb2ludC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBpZiAodGhpcy5hZmZpbmVYICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUHJpdmF0ZUtleVNwZWMuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUHJpdmF0ZUtleVNwZWMuamF2YQppbmRleCAzNDIyZjE2Li5kZTc3OGZkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ1ByaXZhdGVLZXlTcGVjLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNQcml2YXRlS2V5U3BlYy5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CkBAIC0yNyw4ICsyMiw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHBhcmFtZXRlcnMgc3BlY2lmeWluZyBhbiBFbGxpcHRpYyBDdXJ2ZSAoRUMpIHByaXZhdGUga2V5LiAKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBFQ1ByaXZhdGVLZXlTcGVjIGltcGxlbWVudHMgS2V5U3BlYyB7CiAgICAgLy8gUHJpdmF0ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXkKQEAgLTM3LDcgKzMzLDE0IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBFQ1BhcmFtZXRlclNwZWMgcGFyYW1zOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFQ1ByaXZhdGVLZXlTcGVjfSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJpdmF0ZSB2YWx1ZQorICAgICAqIHtAY29kZSBTfSBhbmQgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIHZhbHVlIHtAY29kZSBTfS4KKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgZG9tYWluIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFQ1ByaXZhdGVLZXlTcGVjKEJpZ0ludGVnZXIgcywgRUNQYXJhbWV0ZXJTcGVjIHBhcmFtcykgewogICAgICAgICB0aGlzLnMgPSBzOwpAQCAtNTIsMTQgKzU1LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBkb21haW4gcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZG9tYWluIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFQ1BhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkgewogICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpdmF0ZSB2YWx1ZSB7QGNvZGUgU30uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSB2YWx1ZSB7QGNvZGUgU30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UygpIHsKICAgICAgICAgcmV0dXJuIHM7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ1B1YmxpY0tleVNwZWMuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUHVibGljS2V5U3BlYy5qYXZhCmluZGV4IDNjNDFmOGUuLmRhMTgyYjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUHVibGljS2V5U3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUHVibGljS2V5U3BlYy5qYXZhCkBAIC0xNSwxOCArMTUsMTQgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuc3BlYzsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgYW4gRWxsaXB0aWMgQ3VydmUgKEVDKSBwdWJsaWMga2V5LiAKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBFQ1B1YmxpY0tleVNwZWMgaW1wbGVtZW50cyBLZXlTcGVjIHsKICAgICAvLyBUaGUgcHVibGljIHBvaW50CkBAIC0zNSw3ICszMSwxNiBAQAogICAgIHByaXZhdGUgZmluYWwgRUNQYXJhbWV0ZXJTcGVjIHBhcmFtczsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRUNQdWJsaWNLZXl9IHdpdGggdGhlIHNwZWNpZmllZCBwdWJsaWMgZWxsaXB0aWMKKyAgICAgKiBjdXJ2ZSBwb2ludCBhbmQgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSBwdWJsaWMgZWxsaXB0aWMgY3VydmUgcG9pbnQge0Bjb2RlIFd9LgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb21haW4gcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHBvaW50IHtAY29kZSBXfSBpcyBhdCBpbmZpbml0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRUNQdWJsaWNLZXlTcGVjKEVDUG9pbnQgdywgRUNQYXJhbWV0ZXJTcGVjIHBhcmFtcykgewogICAgICAgICB0aGlzLncgPSB3OwpAQCAtNTUsMTQgKzYwLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBkb21haW4gcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZG9tYWluIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFQ1BhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkgewogICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHVibGljIGVsbGlwdGljIGN1cnZlIHBvaW50IHtAY29kZSBXfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgZWxsaXB0aWMgY3VydmUgcG9pbnQge0Bjb2RlIFd9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBFQ1BvaW50IGdldFcoKSB7CiAgICAgICAgIHJldHVybiB3OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRWxsaXB0aWNDdXJ2ZS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRWxsaXB0aWNDdXJ2ZS5qYXZhCmluZGV4IGRiMWJhY2MuLjNhYjI5MjEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VsbGlwdGljQ3VydmUuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FbGxpcHRpY0N1cnZlLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKQEAgLTI4LDggKzIzLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBBbiBFbGxpcHRpYyBDdXJ2ZSB3aXRoIGl0cyBuZWNlc3NhcnkgdmFsdWVzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEVsbGlwdGljQ3VydmUgewogCkBAIC01MCw3ICs0NiwyMCBAQAogICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IGhhc2g7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEVsbGlwdGljQ3VydmV9IHdpdGggdGhlIHNwZWNpZmllZCBmaWVsZCwKKyAgICAgKiBjb2VmZmljaWVudHMgYW5kIHNlZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgZmluaXRlIGZpZWxkIG9mIHRoaXMgZWxsaXB0aWMgY3VydmUuCisgICAgICogQHBhcmFtIGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2VmZmljaWVudCB7QGNvZGUgYX0uCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2VmZmljaWVudCB7QGNvZGUgYn0uCisgICAgICogQHBhcmFtIHNlZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWVkIHVzZWQgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBjdXJ2ZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY29lZmZpY2llbnRzIGFyZSBub3QgaW4gdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRWxsaXB0aWNDdXJ2ZShFQ0ZpZWxkIGZpZWxkLCBCaWdJbnRlZ2VyIGEsIEJpZ0ludGVnZXIgYiwgYnl0ZVtdIHNlZWQpIHsKICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwpAQCAtOTUsMzUgKzEwNCw1OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRWxsaXB0aWNDdXJ2ZX0gd2l0aCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZAorICAgICAqIGNvZWZmaWNpZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmllbGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaW5pdGUgZmllbGQgb2YgdGhpcyBlbGxpcHRpYyBjdXJ2ZS4KKyAgICAgKiBAcGFyYW0gYQorICAgICAqICAgICAgICAgICAgdGhlIGNvZWZmaWNpZW50IHtAY29kZSBhfS4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGNvZWZmaWNpZW50IHtAY29kZSBifS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY29lZmZpY2llbnRzIGFyZSBub3QgaW4gdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRWxsaXB0aWNDdXJ2ZShFQ0ZpZWxkIGZpZWxkLCBCaWdJbnRlZ2VyIGEsIEJpZ0ludGVnZXIgYikgewogICAgICAgICB0aGlzKGZpZWxkLCBhLCBiLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNvZWZmaWNpZW50IHtAY29kZSBhfSBvZiB0aGlzIGVsbGlwdGljIGN1cnZlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvZWZmaWNpZW50IHtAY29kZSBhfSBvZiB0aGlzIGVsbGlwdGljIGN1cnZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEEoKSB7CiAgICAgICAgIHJldHVybiBhOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgY29lZmZpY2llbnQge0Bjb2RlIGJ9IG9mIHRoaXMgZWxsaXB0aWMgY3VydmUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY29lZmZpY2llbnQge0Bjb2RlIGJ9IG9mIHRoaXMgZWxsaXB0aWMgY3VydmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QigpIHsKICAgICAgICAgcmV0dXJuIGI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBmaW5pdGUgZmllbGQgb2YgdGhpcyBlbGxpcHRpYyBjdXJ2ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBmaW5pdGUgZmllbGQgb2YgdGhpcyBlbGxpcHRpYyBjdXJ2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRUNGaWVsZCBnZXRGaWVsZCgpIHsKICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIHNlZWQgdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGlzIGVsbGlwdGljIGN1cnZlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBzZWVkIHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBlbGxpcHRpYyBjdXJ2ZSwKKyAgICAgKiAgICAgICAgIG9yIHtAY29kZSBudWxsfSBpZiBub25lIHNwZWNpZmllZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldFNlZWQoKSB7CiAgICAgICAgIGlmIChzZWVkID09IG51bGwpIHsKQEAgLTEzNyw3ICsxNzAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBlcXVhbHMgdG8gdGhpcyBlbGxpcHRpYyBjdXJ2ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIGVsbGlwdGljCisgICAgICogICAgICAgICBjdXJ2ZSwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewogICAgICAgICBpZiAodGhpcyA9PSBvdGhlcikgewpAQCAtMTUzLDcgKzE5MiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgaGFzaGNvZGUgb2YgdGhpcyBlbGxpcHRpYyBjdXJ2ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoY29kZSBvZiB0aGlzIGVsbGlwdGljIGN1cnZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIC8vIGhhc2ggaW5pdCBpcyBkZWxheWVkCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FbmNvZGVkS2V5U3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRW5jb2RlZEtleVNwZWMuamF2YQppbmRleCBmOGYzMTYyLi5mMTk5YmNhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FbmNvZGVkS2V5U3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VuY29kZWRLZXlTcGVjLmphdmEKQEAgLTE1LDIzICsxNSwyNCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgYWJzdHJhY3Qga2V5IHNwZWNpZmljYXRpb24gZm9yIGEgcHVibGljIG9yIGEgcHJpdmF0ZSBrZXkgaW4gZW5jb2RlZAorICogZm9ybWF0LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEVuY29kZWRLZXlTcGVjIGltcGxlbWVudHMgS2V5U3BlYyB7CiAgICAgLy8gRW5jb2RlZCBrZXkKICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBlbmNvZGVkS2V5OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFbmNvZGVkS2V5U3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIGVuY29kZWQga2V5IGJ5dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmNvZGVkS2V5CisgICAgICogICAgICAgICAgICB0aGUgZW5jb2RlZCBrZXkgYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEVuY29kZWRLZXlTcGVjKGJ5dGVbXSBlbmNvZGVkS2V5KSB7CiAgICAgICAgIC8vIERlZmVuc2l2ZWx5IGNvcGllcyBwYXJhbWV0ZXIKQEAgLTQyLDcgKzQzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBlbmNvZGVkIGtleSBieXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIGtleSBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CiAgICAgICAgIC8vIERlZmVuc2l2ZWx5IGNvcGllcyBwcml2YXRlIGFycmF5CkBAIC01Myw3ICs1NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgZm9ybWF0IG9mIHRoaXMgZW5jb2RlZCBrZXkKKyAgICAgKiBzcGVjaWZpY2F0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIGZvcm1hdCBvZiB0aGlzIGVuY29kZWQga2V5CisgICAgICogICAgICAgICBzcGVjaWZpY2F0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Rm9ybWF0KCk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb24uamF2YQppbmRleCA2ZGY5ZTVjLi5hODNlOTg0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uLmphdmEKQEAgLTE1LDUxICsxNSw2NCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGludmFsaWQga2V5IHNwZWNpZmljYXRpb24gaXMKKyAqIGVuY291bnRlcmVkLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGV4dGVuZHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHNlcmlhbCB2ZXJzaW9uIGlkZW50aWZpZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzU0NjEzOTI5Mzk5ODgxMDc3OEw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIG9mIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgSW52YWxpZEtleVNwZWNFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UKKyAgICAgKiBhbmQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgSW52YWxpZEtleVNwZWNFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbi5qYXZhCmluZGV4IGM3Y2UyM2YuLjY2OGZkYTUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24uamF2YQpAQCAtMTUsMzcgKzE1LDQxIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuc3BlYzsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gaW52YWxpZCBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiBpcworICogZW5jb3VudGVyZWQuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24gZXh0ZW5kcyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24geworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogVGhlIHNlcmlhbCB2ZXJzaW9uIGlkZW50aWZpZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTk3MDQ2ODc2OTU5MzM5OTM0Mkw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbigpIHsKICAgICB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9LZXlTcGVjLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9LZXlTcGVjLmphdmEKaW5kZXggOTA4ZTE1NC4uMzUwYTdlYiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvS2V5U3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0tleVNwZWMuamF2YQpAQCAtMTUsMTYgKzE1LDEzIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuc3BlYzsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIG1hcmtlciBpbnRlcmZhY2UgZm9yIGtleSBzcGVjaWZpY2F0aW9ucy4gVGhlIHB1cnBvc2UgaXMKKyAqIHRvIGdyb3VwIGtleSBzcGVjaWZpY2F0aW9ucyBmb3IgY3J5cHRvZ3JhcGhpYyBrZXlzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBLZXlTcGVjIHsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9NR0YxUGFyYW1ldGVyU3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvTUdGMVBhcmFtZXRlclNwZWMuamF2YQppbmRleCAzYmYyYTBiLi5hNDBmMGIzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9NR0YxUGFyYW1ldGVyU3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL01HRjFQYXJhbWV0ZXJTcGVjLmphdmEKQEAgLTE1LDM3ICsxNSw1NSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uIGZvciB0aGUgTWFzayBHZW5lcmF0aW9uIEZ1bmN0aW9uIChNR0YxKSBpbgorICogdGhlIFJTQS1QU1MgU2lnbmF0dXJlIGFuZCBPQUVQIFBhZGRpbmcgc2NoZW1lLgorICogPHA+CisgKiBEZWZpbmVkIGluIHRoZSA8YQorICogaHJlZj0iaHR0cDovL3d3dy5yc2EuY29tL3JzYWxhYnMvcHVicy9QS0NTL2h0bWwvcGtjcy0xLmh0bWwiPlBLQ1MgIzEgdjIuMTwvYT4KKyAqIHN0YW5kYXJkCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTUdGMVBhcmFtZXRlclNwZWMgaW1wbGVtZW50cyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHByZWRlZmluZWQgTUdGMSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiB3aXRoIGFuICJTSEEtMSIgbWVzc2FnZQorICAgICAqIGRpZ2VzdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1HRjFQYXJhbWV0ZXJTcGVjIFNIQTEgPQogICAgICAgICBuZXcgTUdGMVBhcmFtZXRlclNwZWMoIlNIQS0xIik7IC8vJE5PTi1OTFMtMSQKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHByZWRlZmluZWQgTUdGMSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiB3aXRoIGFuICJTSEEtMjU2IiBtZXNzYWdlCisgICAgICogZGlnZXN0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTUdGMVBhcmFtZXRlclNwZWMgU0hBMjU2ID0KICAgICAgICAgbmV3IE1HRjFQYXJhbWV0ZXJTcGVjKCJTSEEtMjU2Iik7IC8vJE5PTi1OTFMtMSQKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHByZWRlZmluZWQgTUdGMSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiB3aXRoIGFuICJTSEEtMzg0IiBtZXNzYWdlCisgICAgICogZGlnZXN0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTUdGMVBhcmFtZXRlclNwZWMgU0hBMzg0ID0KICAgICAgICAgbmV3IE1HRjFQYXJhbWV0ZXJTcGVjKCJTSEEtMzg0Iik7IC8vJE5PTi1OTFMtMSQKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHByZWRlZmluZWQgTUdGMSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiB3aXRoIGFuICJTSEEtNTEyIiBtZXNzYWdlCisgICAgICogZGlnZXN0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTUdGMVBhcmFtZXRlclNwZWMgU0hBNTEyID0KICAgICAgICAgbmV3IE1HRjFQYXJhbWV0ZXJTcGVjKCJTSEEtNTEyIik7IC8vJE5PTi1OTFMtMSQKQEAgLTU0LDcgKzcyLDEyIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWROYW1lOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBNR0YxUGFyYW1ldGVyU3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgZGlnZXN0CisgICAgICogYWxnb3JpdGhtIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG1kTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTUdGMVBhcmFtZXRlclNwZWMoU3RyaW5nIG1kTmFtZSkgewogICAgICAgICB0aGlzLm1kTmFtZSA9IG1kTmFtZTsKQEAgLTY0LDcgKzg3LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlnZXN0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gbWROYW1lOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUEtDUzhFbmNvZGVkS2V5U3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUEtDUzhFbmNvZGVkS2V5U3BlYy5qYXZhCmluZGV4IDA3MDU1MmYuLjVjYjY3YjggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1BLQ1M4RW5jb2RlZEtleVNwZWMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9QS0NTOEVuY29kZWRLZXlTcGVjLmphdmEKQEAgLTE1LDIwICsxNSwyMyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUga2V5IHNwZWNpZmljYXRpb24gZm9yIGFuIGVuY29kZWQgcHJpdmF0ZSBrZXkgaW4gQVNOLjEgZm9ybWF0IGFzIGRlZmluZWQKKyAqIGluIHRoZSBQS0NTIzggc3RhbmRhcmQuICAKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQS0NTOEVuY29kZWRLZXlTcGVjIGV4dGVuZHMgRW5jb2RlZEtleVNwZWMgeyAgICAKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUEtDUzhFbmNvZGVkS2V5U3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIGVuY29kZWQga2V5CisgICAgICogYnl0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGVuY29kZWRLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIGtleSBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUEtDUzhFbmNvZGVkS2V5U3BlYyhieXRlW10gZW5jb2RlZEtleSkgewogICAgICAgICAvLyBTdXBlciBjbGFzcycgY3RvciBtYWtlcyBkZWZlbnNpdmUgcGFyYW1ldGVyIGNvcHkKQEAgLTM2LDcgKzM5LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgZW5jb2RlZCBrZXkgYnl0ZXMuCisgICAgICogCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGVuY29kZWQga2V5IGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKICAgICAgICAgLy8gU3VwZXIgY2xhc3MnIGdldEVuY29kZWQoKSBhbHdheXMgcmV0dXJucyBhIG5ldyBhcnJheQpAQCAtNDQsNyArNTAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIGZvcm1hdCBvZiB0aGlzIGVuY29kZWQga2V5CisgICAgICogc3BlY2lmaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgIlBLQ1MjOCIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtYXQoKSB7CiAgICAgICAgIHJldHVybiAiUEtDUyM4IjsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUFNTUGFyYW1ldGVyU3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUFNTUGFyYW1ldGVyU3BlYy5qYXZhCmluZGV4IDQxNDI4ZDEuLmM2YTViYzUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1BTU1BhcmFtZXRlclNwZWMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9QU1NQYXJhbWV0ZXJTcGVjLmphdmEKQEAgLTE1LDIyICsxNSwzMyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uIGZvciB0aGUgUlNBLVBTUyBTaWduYXR1cmUgc2NoZW1lLgorICogPHA+CisgKiBEZWZpbmVkIGluIHRoZSA8YQorICogaHJlZj0iaHR0cDovL3d3dy5yc2EuY29tL3JzYWxhYnMvcHVicy9QS0NTL2h0bWwvcGtjcy0xLmh0bWwiPlBLQ1MgIzEgdjIuMTwvYT4KKyAqIHN0YW5kYXJkLgorICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBTU1BhcmFtZXRlclNwZWMgaW1wbGVtZW50cyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHsgICAKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIGRlZmF1bHQgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uIEl0IHNwZWNpZmllcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisgICAgICogPHVsPgorICAgICAqIDxsaT5tZXNzYWdlIGRpZ2VzdDoge0Bjb2RlICJTSEEtMSJ9PC9saT4KKyAgICAgKiA8bGk+bWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uICg8aT5tZ2Y8L2k+KToge0Bjb2RlICJNR0YxIn08L2xpPgorICAgICAqIDxsaT5wYXJhbWV0ZXJzIGZvciB0aGUgPGk+bWdmPC9pPjoge0BsaW5rIE1HRjFQYXJhbWV0ZXJTcGVjI1NIQTF9PC9saT4KKyAgICAgKiA8bGk+c2FsdCBsZW5ndGg6IHtAY29kZSAyMH08L2xpPgorICAgICAqIDxsaT50cmFpbGVyIGZpZWxkOiB7QGNvZGUgLTF9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUFNTUGFyYW1ldGVyU3BlYyBERUZBVUxUID0gbmV3IFBTU1BhcmFtZXRlclNwZWMoMjApOwogCkBAIC00Niw3ICs1NywxNCBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IHNhbHRMZW47CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFBTU1BhcmFtZXRlclNwZWN9IHdpdGggdGhlIHNwZWNpZmllZCBzYWx0IGxlbmd0aCAKKyAgICAgKiBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzYWx0TGVuCisgICAgICogICAgICAgICAgICB0aGUgc2FsdCBsZW5ndGggKGluIGJpdHMpLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNhbHRMZW59IGlzIG5lZ2F0aXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQU1NQYXJhbWV0ZXJTcGVjKGludCBzYWx0TGVuKSB7CiAgICAgICAgIGlmIChzYWx0TGVuIDwgMCkgewpAQCAtNjAsNyArNzgsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZiAgICAgKiAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBQU1NQYXJhbWV0ZXJTcGVjfSB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBkaWdlc3QKKyAgICAgKiBuYW1lLCBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gbmFtZSwgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIHBhcmFtZXRlcnMsCisgICAgICogc2FsdCBsZW5ndGgsIGFuZCB0cmFpbGVyIGZpZWxkIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0uCisgICAgICogQHBhcmFtIG1nZk5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gYWxnb3JpdGhtLgorICAgICAqIEBwYXJhbSBtZ2ZTcGVjCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGZvciB0aGUgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gc2FsdExlbgorICAgICAqICAgICAgICAgICAgdGhlIHNhbHQgbGVuZ3RoIChpbiBiaXRzKS4KKyAgICAgKiBAcGFyYW0gdHJhaWxlckZpZWxkCisgICAgICogICAgICAgICAgICB0aGUgdHJhaWxlciBmaWVsZCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzYWx0TGVufSBvciB7QGNvZGUgdHJhaWxlckZpZWxkfSBpcyBuZWdhdGl2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUFNTUGFyYW1ldGVyU3BlYyhTdHJpbmcgbWROYW1lLCBTdHJpbmcgbWdmTmFtZSwKICAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgbWdmU3BlYywgaW50IHNhbHRMZW4sIGludCB0cmFpbGVyRmllbGQpIHsKQEAgLTg1LDM1ICsxMTksNTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc2FsdCAoaW4gYml0cykuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzYWx0IChpbiBiaXRzKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFNhbHRMZW5ndGgoKSB7CiAgICAgICAgIHJldHVybiBzYWx0TGVuOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERpZ2VzdEFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIG1kTmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1hc2sgZ2VuZXJhdGlvbiBmdW5jdGlvbiBhbGdvcml0aG0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE1HRkFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIG1nZk5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBmb3IgdGhlIG1hc2sgZ2VuZXJhdGlvbiBmdW5jdGlvbiBhbGdvcml0aG0sIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgbm9uZSBzcGVjaWZpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgZ2V0TUdGUGFyYW1ldGVycygpIHsKICAgICAgICAgcmV0dXJuIG1nZlNwZWM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB0cmFpbGVyIGZpZWxkIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHRyYWlsZXIgZmllbGQgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUcmFpbGVyRmllbGQoKSB7CiAgICAgICAgIHJldHVybiB0cmFpbGVyRmllbGQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FLZXlHZW5QYXJhbWV0ZXJTcGVjLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FLZXlHZW5QYXJhbWV0ZXJTcGVjLmphdmEKaW5kZXggOWIwM2ZjYy4uMDZmMzQ5OCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUlNBS2V5R2VuUGFyYW1ldGVyU3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1JTQUtleUdlblBhcmFtZXRlclNwZWMuamF2YQpAQCAtMTUsMjYgKzE1LDI4IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uIGZvciBnZW5lcmF0aW5nIGFuIFJTQSBrZXkgcGFpci4gCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyBpbXBsZW1lbnRzIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgeyAgICAKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIEYwfSA9IDMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEYwID0gQmlnSW50ZWdlci52YWx1ZU9mKDNMKTsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIEY0fSA9IDY1NTM3LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGNCA9IEJpZ0ludGVnZXIudmFsdWVPZig2NTUzN0wpOwogCkBAIC00NCw3ICs0NiwxNCBAQAogICAgIHByaXZhdGUgZmluYWwgQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUlNBS2V5R2VuUGFyYW1ldGVyU3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBzaXplCisgICAgICogYW5kIHB1YmxpYyBleHBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5c2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgKG51bWJlciBvZiBiaXRzKS4KKyAgICAgKiBAcGFyYW0gcHVibGljRXhwb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcHVibGljIGV4cG9uZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjKGludCBrZXlzaXplLCBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50KSB7CiAgICAgICAgIHRoaXMua2V5c2l6ZSA9IGtleXNpemU7CkBAIC01MiwxNCArNjEsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgKG51bWJlciBvZiBiaXRzKS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBtb2R1bHVzIChudW1iZXIgb2YgYml0cykuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRLZXlzaXplKCkgewogICAgICAgICByZXR1cm4ga2V5c2l6ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwdWJsaWMgZXhwb25lbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHB1YmxpYyBleHBvbmVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQdWJsaWNFeHBvbmVudCgpIHsKICAgICAgICAgcmV0dXJuIHB1YmxpY0V4cG9uZW50OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMuamF2YQppbmRleCA4ZGIyODc2Li45M2UzMTkzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuc3BlYzsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwpAQCAtMjcsOCArMjIsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUga2V5IHNwZWNpZmljYXRpb24gb2YgYSBSU0EgbXVsdGktcHJpbWUgcHJpdmF0ZSBrZXkgd2l0aCB0aGUgQ2hpbmVzZQorICogUmVtYWluZGVyIFRoZW9yZW0gKENSVCkgaW5mb3JtYXRpb24gdmFsdWVzIHVzZWQuCisgKiA8cD4KKyAqIERlZmluZWQgaW4gdGhlIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LnJzYS5jb20vcnNhbGFicy9wdWJzL1BLQ1MvaHRtbC9wa2NzLTEuaHRtbCI+UEtDUyAjMSB2Mi4xPC9hPgorICogc3RhbmRhcmQuCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIGV4dGVuZHMgUlNBUHJpdmF0ZUtleVNwZWMgewogICAgIC8vIFB1YmxpYyBFeHBvbmVudApAQCAtNDcsNyArNDksMzIgQEAKICAgICBwcml2YXRlIGZpbmFsIFJTQU90aGVyUHJpbWVJbmZvW10gb3RoZXJQcmltZUluZm87CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbW9kdWx1cywgcHVibGljIGV4cG9uZW50LCBwcml2YXRlIGV4cG9uZW50LCBwcmltZSBmYWN0b3JzLCBwcmltZQorICAgICAqIGV4cG9uZW50cywgY3J0IGNvZWZmaWNpZW50LCBhbmQgYWRkaXRpb25hbCBwcmltZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZHVsdXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb2R1bHVzIHtAY29kZSBufS4KKyAgICAgKiBAcGFyYW0gcHVibGljRXhwb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIGV9LgorICAgICAqIEBwYXJhbSBwcml2YXRlRXhwb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIGV4cG9uZW50IHtAY29kZSBkfS4KKyAgICAgKiBAcGFyYW0gcHJpbWVQCisgICAgICogICAgICAgICAgICB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfSBvZiB7QGNvZGUgbn0uCisgICAgICogQHBhcmFtIHByaW1lUQorICAgICAqICAgICAgICAgICAgdGhlIHByaW1lIGZhY3RvciB7QGNvZGUgcX0gb2Yge0Bjb2RlIG59LgorICAgICAqIEBwYXJhbSBwcmltZUV4cG9uZW50UAorICAgICAqICAgICAgICAgICAgdGhlIGV4cG9uZW50IG9mIHRoZSBwcmltZSB7QGNvZGUgcH0uCisgICAgICogQHBhcmFtIHByaW1lRXhwb25lbnRRCisgICAgICogICAgICAgICAgICB0aGUgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBxfS4KKyAgICAgKiBAcGFyYW0gY3J0Q29lZmZpY2llbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBDUlQgY29lZmZpY2llbnQge0Bjb2RlIHFeLTEgbW9kIHB9LgorICAgICAqIEBwYXJhbSBvdGhlclByaW1lSW5mbworICAgICAqICAgICAgICAgICAgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWRkaXRpb25hbCBwcmltZXMgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB0aGUgdHdvIHByaW1lcyAoe0Bjb2RlIHAsIHF9KS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvdGhlclByaW1lSW5mb30gaXMgbm90IG51bGwgYnV0IGVtcHR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoCiAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1vZHVsdXMsCkBAIC0xMDksMTQgKzEzNiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgQ1JUIGNvZWZmaWNpZW50LCB7QGNvZGUgcV4tMSBtb2QgcH0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgQ1JUIGNvZWZmaWNpZW50LCB7QGNvZGUgcV4tMSBtb2QgcH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3J0Q29lZmZpY2llbnQoKSB7CiAgICAgICAgIHJldHVybiBjcnRDb2VmZmljaWVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWRkaXRpb25hbCBwcmltZXMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBhZGRpdGlvbmFsIHByaW1lcywgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICB0aGVyZSBhcmUgb25seSB0aGUgdHdvIHByaW1lcyAoe0Bjb2RlIHAsIHF9KS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUlNBT3RoZXJQcmltZUluZm9bXSBnZXRPdGhlclByaW1lSW5mbygpIHsKICAgICAgICAgLy8gQ2xvbmUgYXJyYXkgKGlmIG5vdCBudWxsKSB0byBwcmV2ZW50IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uCkBAIC0xMzEsMzUgKzE2NSw1MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBwfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBleHBvbmVudCBvZiB0aGUgcHJpbWUge0Bjb2RlIHB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFByaW1lRXhwb25lbnRQKCkgewogICAgICAgICByZXR1cm4gcHJpbWVFeHBvbmVudFA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBleHBvbmVudCBvZiB0aGUgcHJpbWUge0Bjb2RlIHF9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGV4cG9uZW50IG9mIHRoZSBwcmltZSB7QGNvZGUgcX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpbWVFeHBvbmVudFEoKSB7CiAgICAgICAgIHJldHVybiBwcmltZUV4cG9uZW50UTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHByaW1lIGZhY3RvciB7QGNvZGUgcH0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmltZVAoKSB7CiAgICAgICAgIHJldHVybiBwcmltZVA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmltZSBmYWN0b3Ige0Bjb2RlIHF9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaW1lIGZhY3RvciB7QGNvZGUgcX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpbWVRKCkgewogICAgICAgICByZXR1cm4gcHJpbWVROwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHVibGljIGV4cG9uZW50IHtAY29kZSBlfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFB1YmxpY0V4cG9uZW50KCkgewogICAgICAgICByZXR1cm4gcHVibGljRXhwb25lbnQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FPdGhlclByaW1lSW5mby5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUlNBT3RoZXJQcmltZUluZm8uamF2YQppbmRleCAxNGNlMGY4Li45YjQ4MjhlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FPdGhlclByaW1lSW5mby5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1JTQU90aGVyUHJpbWVJbmZvLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKQEAgLTI3LDggKzIyLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGFkZGl0aW9uYWwgcHJpbWUgaW5mb3JtYXRpb24gc3BlY2lmaWVkIGFzIHRyaXBsZXQgb2YgcHJpbWVzLCBhIHByaW1lCisgKiBleHBvbmVudCwgYW5kIGEgQ2hpbmVzZSBSZW1haW5kZXIgVGhlb3JlbSAoQ1JUKSBjb2VmZmljaWVudC4KKyAqIDxwPgorICogRGVmaW5lZCBpbiB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cucnNhLmNvbS9yc2FsYWJzL3B1YnMvUEtDUy9odG1sL3BrY3MtMS5odG1sIj5QS0NTICMxIHYyLjE8L2E+CisgKiBzdGFuZGFyZC4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSU0FPdGhlclByaW1lSW5mbyB7CiAgICAgLy8gUHJpbWUKQEAgLTM5LDcgKzQxLDE2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBSU0FPdGhlclByaW1lSW5mb30gd2l0aCB0aGUgc3BlY2lmaWVkIHByaW1lLAorICAgICAqIGV4cG9uZW50LCBhbmQgQ1JUIGNvZWZmaWNpZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmltZQorICAgICAqICAgICAgICAgICAgdGhlIHByaW1lIGZhY3Rvci4KKyAgICAgKiBAcGFyYW0gcHJpbWVFeHBvbmVudAorICAgICAqICAgICAgICAgICAgdGhlIHByaW1lIGV4cG9uZW50LgorICAgICAqIEBwYXJhbSBjcnRDb2VmZmljaWVudAorICAgICAqICAgICAgICAgICAgdGhlIENSVCBjb2VmZmljaWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUlNBT3RoZXJQcmltZUluZm8oQmlnSW50ZWdlciBwcmltZSwKICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVFeHBvbmVudCwgQmlnSW50ZWdlciBjcnRDb2VmZmljaWVudCkgewpAQCAtNTgsMjEgKzY5LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBDUlQgY29lZmZpY2llbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgQ1JUIGNvZWZmaWNpZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBCaWdJbnRlZ2VyIGdldENydENvZWZmaWNpZW50KCkgewogICAgICAgICByZXR1cm4gY3J0Q29lZmZpY2llbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmltZSBmYWN0b3IuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUgZmFjdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBCaWdJbnRlZ2VyIGdldFByaW1lKCkgewogICAgICAgICByZXR1cm4gcHJpbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBleHBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBleHBvbmVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQmlnSW50ZWdlciBnZXRFeHBvbmVudCgpIHsKICAgICAgICAgcmV0dXJuIHByaW1lRXhwb25lbnQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FQcml2YXRlQ3J0S2V5U3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUlNBUHJpdmF0ZUNydEtleVNwZWMuamF2YQppbmRleCA1YzBlYWU3Li4xMTU3MDk5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FQcml2YXRlQ3J0S2V5U3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1JTQVByaXZhdGVDcnRLZXlTcGVjLmphdmEKQEAgLTE1LDE4ICsxNSwyMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBrZXkgc3BlY2lmaWNhdGlvbiBvZiBhIFJTQSBwcml2YXRlIGtleSB1c2luZyBDaGluZXNlIFJlbWFpbmRlciBUaGVvcmVtCisgKiAoQ1JUKSB2YWx1ZXMuCisgKiA8cD4KKyAqIERlZmluZWQgaW4gdGhlIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LnJzYS5jb20vcnNhbGFicy9wdWJzL1BLQ1MvaHRtbC9wa2NzLTEuaHRtbCI+UEtDUyAjMSB2Mi4xPC9hPgorICogc3RhbmRhcmQuCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUlNBUHJpdmF0ZUNydEtleVNwZWMgZXh0ZW5kcyBSU0FQcml2YXRlS2V5U3BlYyB7ICAgIAogICAgIC8vIFB1YmxpYyBFeHBvbmVudApAQCAtNDMsNyArNDUsMjcgQEAKICAgICBwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgY3J0Q29lZmZpY2llbnQ7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbW9kdWx1cywgcHVibGljIGV4cG9uZW50LCBwcml2YXRlIGV4cG9uZW50LCBwcmltZSBmYWN0b3JzLCBwcmltZQorICAgICAqIGV4cG9uZW50cywgY3J0IGNvZWZmaWNpZW50LCBhbmQgYWRkaXRpb25hbCBwcmltZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZHVsdXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb2R1bHVzIHtAY29kZSBufS4KKyAgICAgKiBAcGFyYW0gcHVibGljRXhwb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIGV9LgorICAgICAqIEBwYXJhbSBwcml2YXRlRXhwb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIGV4cG9uZW50IHtAY29kZSBkfS4KKyAgICAgKiBAcGFyYW0gcHJpbWVQCisgICAgICogICAgICAgICAgICB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfSBvZiB7QGNvZGUgbn0uCisgICAgICogQHBhcmFtIHByaW1lUQorICAgICAqICAgICAgICAgICAgdGhlIHByaW1lIGZhY3RvciB7QGNvZGUgcX0gb2Yge0Bjb2RlIG59LgorICAgICAqIEBwYXJhbSBwcmltZUV4cG9uZW50UAorICAgICAqICAgICAgICAgICAgdGhlIGV4cG9uZW50IG9mIHRoZSBwcmltZSB7QGNvZGUgcH0uCisgICAgICogQHBhcmFtIHByaW1lRXhwb25lbnRRCisgICAgICogICAgICAgICAgICB0aGUgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBxfS4KKyAgICAgKiBAcGFyYW0gY3J0Q29lZmZpY2llbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBDUlQgY29lZmZpY2llbnQge0Bjb2RlIHFeLTEgbW9kIHB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSU0FQcml2YXRlQ3J0S2V5U3BlYyhCaWdJbnRlZ2VyIG1vZHVsdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHVibGljRXhwb25lbnQsCkBAIC02NSw0MiArODcsNjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIENSVCBjb2VmZmljaWVudCwge0Bjb2RlIHFeLTEgbW9kIHB9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIENSVCBjb2VmZmljaWVudCwge0Bjb2RlIHFeLTEgbW9kIHB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldENydENvZWZmaWNpZW50KCkgewogICAgICAgICByZXR1cm4gY3J0Q29lZmZpY2llbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBleHBvbmVudCBvZiB0aGUgcHJpbWUge0Bjb2RlIHB9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGV4cG9uZW50IG9mIHRoZSBwcmltZSB7QGNvZGUgcH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpbWVFeHBvbmVudFAoKSB7CiAgICAgICAgIHJldHVybiBwcmltZUV4cG9uZW50UDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGV4cG9uZW50IG9mIHRoZSBwcmltZSB7QGNvZGUgcX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZXhwb25lbnQgb2YgdGhlIHByaW1lIHtAY29kZSBxfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50USgpIHsKICAgICAgICAgcmV0dXJuIHByaW1lRXhwb25lbnRROwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBwfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmltZSBmYWN0b3Ige0Bjb2RlIHB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFByaW1lUCgpIHsKICAgICAgICAgcmV0dXJuIHByaW1lUDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHByaW1lIGZhY3RvciB7QGNvZGUgcX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpbWUgZmFjdG9yIHtAY29kZSBxfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmltZVEoKSB7CiAgICAgICAgIHJldHVybiBwcmltZVE7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIGV9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBleHBvbmVudCB7QGNvZGUgZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHVibGljRXhwb25lbnQoKSB7CiAgICAgICAgIHJldHVybiBwdWJsaWNFeHBvbmVudDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1JTQVByaXZhdGVLZXlTcGVjLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FQcml2YXRlS2V5U3BlYy5qYXZhCmluZGV4IDM1NWYyYmEuLmJkN2Q0ZTggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1JTQVByaXZhdGVLZXlTcGVjLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUlNBUHJpdmF0ZUtleVNwZWMuamF2YQpAQCAtMTUsMTggKzE1LDE5IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZhLnNlY3VyaXR5LnNwZWM7CiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGtleSBzcGVjaWZpY2F0aW9uIG9mIGEgUlNBIHByaXZhdGUga2V5LgorICogPHA+CisgKiBEZWZpbmVkIGluIHRoZSA8YQorICogaHJlZj0iaHR0cDovL3d3dy5yc2EuY29tL3JzYWxhYnMvcHVicy9QS0NTL2h0bWwvcGtjcy0xLmh0bWwiPlBLQ1MgIzEgdjIuMTwvYT4KKyAqIHN0YW5kYXJkCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUlNBUHJpdmF0ZUtleVNwZWMgaW1wbGVtZW50cyBLZXlTcGVjIHsgICAgCiAgICAgLy8gTW9kdWx1cwpAQCAtMzUsNyArMzYsMTQgQEAKICAgICBwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgcHJpdmF0ZUV4cG9uZW50OwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBSU0FQcml2YXRlS2V5U3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIG1vZHVsdXMgYW5kCisgICAgICogcHJpdmF0ZSBleHBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kdWx1cworICAgICAqICAgICAgICAgICAgdGhlIG1vZHVsdXMge0Bjb2RlIG59LgorICAgICAqIEBwYXJhbSBwcml2YXRlRXhwb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcml2YXRlIGV4cG9uZW50IHtAY29kZSBlfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSU0FQcml2YXRlS2V5U3BlYyhCaWdJbnRlZ2VyIG1vZHVsdXMsIEJpZ0ludGVnZXIgcHJpdmF0ZUV4cG9uZW50KSB7CiAgICAgICAgIHRoaXMubW9kdWx1cyA9IG1vZHVsdXM7CkBAIC00MywxNCArNTEsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG1vZHVsdXMge0Bjb2RlIG59LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG1vZHVsdXMge0Bjb2RlIG59LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1vZHVsdXMoKSB7CiAgICAgICAgIHJldHVybiBtb2R1bHVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHJpdmF0ZSBleHBvbmVudCB7QGNvZGUgZX0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBleHBvbmVudCB7QGNvZGUgZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpdmF0ZUV4cG9uZW50KCkgewogICAgICAgICByZXR1cm4gcHJpdmF0ZUV4cG9uZW50OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUlNBUHVibGljS2V5U3BlYy5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvUlNBUHVibGljS2V5U3BlYy5qYXZhCmluZGV4IDdiZDY0ZTYuLmJkNGM1YjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1JTQVB1YmxpY0tleVNwZWMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9SU0FQdWJsaWNLZXlTcGVjLmphdmEKQEAgLTE1LDE3ICsxNSwxOCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YS5zZWN1cml0eS5zcGVjOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBrZXkgc3BlY2lmaWNhdGlvbiBvZiBhIFJTQSBwdWJsaWMga2V5LgorICogPHA+CisgKiBEZWZpbmVkIGluIHRoZSA8YQorICogaHJlZj0iaHR0cDovL3d3dy5yc2EuY29tL3JzYWxhYnMvcHVicy9QS0NTL2h0bWwvcGtjcy0xLmh0bWwiPlBLQ1MgIzEgdjIuMTwvYT4KKyAqIHN0YW5kYXJkLgorICogPC9wPgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSU0FQdWJsaWNLZXlTcGVjIGltcGxlbWVudHMgS2V5U3BlYyB7CiAgICAgLy8gTW9kdWx1cwpAQCAtMzQsNyArMzUsMTQgQEAKICAgICBwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgcHVibGljRXhwb25lbnQ7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFJTQVB1YmxpY0tleVNwZWN9IHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bHVzIGFuZAorICAgICAqIHB1YmxpYyBleHBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kdWx1cworICAgICAqICAgICAgICAgICAgdGhlIG1vZHVsdXMge0Bjb2RlIG59LgorICAgICAqIEBwYXJhbSBwdWJsaWNFeHBvbmVudAorICAgICAqICAgICAgICAgICAgdGhlIHB1YmxpYyBleHBvbmVudCB7QGNvZGUgZH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJTQVB1YmxpY0tleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLCBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50KSB7CiAgICAgICAgIHRoaXMubW9kdWx1cyA9IG1vZHVsdXM7CkBAIC00MiwxNCArNTAsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG1vZHVsdXMge0Bjb2RlIG59LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG1vZHVsdXMge0Bjb2RlIG59LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1vZHVsdXMoKSB7CiAgICAgICAgIHJldHVybiBtb2R1bHVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcHVibGljIGV4cG9uZW50IHtAY29kZSBkfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgZXhwb25lbnQge0Bjb2RlIGR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFB1YmxpY0V4cG9uZW50KCkgewogICAgICAgICByZXR1cm4gcHVibGljRXhwb25lbnQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9YNTA5RW5jb2RlZEtleVNwZWMuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1g1MDlFbmNvZGVkS2V5U3BlYy5qYXZhCmluZGV4IDQ2ZTgzM2UuLjZjYzYxMDQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1g1MDlFbmNvZGVkS2V5U3BlYy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL1g1MDlFbmNvZGVkS2V5U3BlYy5qYXZhCkBAIC0xNSwyMCArMTUsMjIgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmEuc2VjdXJpdHkuc3BlYzsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGtleSBzcGVjaWZpY2F0aW9uIG9mIGFuIFguNTA5IGVuY29kZWQga2V5IGluIEFTTi4xIGZvcm1hdC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBYNTA5RW5jb2RlZEtleVNwZWMgZXh0ZW5kcyBFbmNvZGVkS2V5U3BlYyB7CisKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFg1MDlFbmNvZGVkS2V5U3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIGVuY29kZWQga2V5CisgICAgICogYnl0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGVuY29kZWRLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIGtleSBieXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgWDUwOUVuY29kZWRLZXlTcGVjKGJ5dGVbXSBlbmNvZGVkS2V5KSB7CiAgICAgICAgIC8vIFN1cGVyIGNsYXNzJyBjdG9yIG1ha2VzIGRlZmVuc2l2ZSBwYXJhbWV0ZXIgY29weQpAQCAtMzYsNyArMzgsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGVuY29kZWQga2V5IGJ5dGVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQga2V5IGJ5dGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKICAgICAgICAgLy8gU3VwZXIgY2xhc3MnIGdldEVuY29kZWQoKSBhbHdheXMgcmV0dXJucyBhIG5ldyBhcnJheQpAQCAtNDQsNyArNDksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIGZvcm1hdCBvZiB0aGlzIGVuY29kZWQga2V5CisgICAgICogc3BlY2lmaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgIlguNTA5Ii4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEZvcm1hdCgpIHsKICAgICAgICAgcmV0dXJuICJYLjUwOSI7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL3BhY2thZ2UuaHRtbCBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL3BhY2thZ2UuaHRtbAppbmRleCAwZDRiOTYzLi4xYTFhOGUwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9wYWNrYWdlLmh0bWwKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvcGFja2FnZS5odG1sCkBAIC01LDE0ICs1LDE1IEBACiA8aHRtbD4KIDxib2R5PgogPHA+Ci1UaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgbmVlZGVkIHRvIHNwZWNpZnkga2V5cyBhbmQgcGFyYW1ldGVyIGZvcgotZW5jcnlwdGlvbiBhbmQgc2lnbmluZyBhbGdvcml0aG1zLiBGb2xsb3dpbmcgc3RhbmRhcmRzIGFyZSBzdXBwb3J0ZWQ6CitUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgbmVlZGVkIHRvIHNwZWNpZnkga2V5cyBhbmQgcGFyYW1ldGVycyBmb3IKK2VuY3J5cHRpb24gYW5kIHNpZ25pbmcgYWxnb3JpdGhtcy4gVGhlIGZvbGxvd2luZyBzdGFuZGFyZHMgYXJlIHN1cHBvcnRlZDoKICgxKSBQS0NTIzEgUlNBIGVuY3J5cHRpb24gc3RhbmRhcmQ7CiAoMikgRklQUy0xODYgRFNBIChzaWduYXR1cmUpIHN0YW5kYXJkOwogKDMpIFBLQ1MjOCBwcml2YXRlIGtleSBpbmZvcm1hdGlvbiBzdGFuZGFyZC4KIEtleXMgbWF5IGJlIHNwZWNpZmllZCB2aWEgYWxnb3JpdGhtIG9yIGluIGEgbW9yZSBhYnN0cmFjdCBhbmQgZ2VuZXJhbCB3YXkgd2l0aCBBU04uMS4KLVRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgRWxsaXB0aWMgQ3VydmUgKEVDKSAgZW5jcnlwdGlvbiBhbGdvcml0aG0gYXJlIG9ubHkgc3BlY2lmaWVkIGFzCitUaGUgcGFyYW1ldGVycyBmb3IgdGhlIEVsbGlwdGljIEN1cnZlIChFQykgZW5jcnlwdGlvbiBhbGdvcml0aG0gYXJlIG9ubHkgc3BlY2lmaWVkIGFzCiBpbnB1dCBwYXJhbWV0ZXJzIHRvIHRoZSByZWxldmFudCBFQy1nZW5lcmF0b3IuCiA8L3A+CitAc2luY2UgQW5kcm9pZCAxLjAKIDwvYm9keT4KIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGUuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZS5qYXZhCmluZGV4IGQ5NDQyN2QuLmZiMDA3ODkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwpAQCAtMzIsMTcgKzI3LDM2IEBACiBpbXBvcnQgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogQWJzdHJhY3QgY2xhc3MgdG8gcmVwcmVzZW50IGlkZW50aXR5IGNlcnRpZmljYXRlcy4gSXQgcmVwcmVzZW50cyBhIHdheSB0bworICogdmVyaWZ5IHRoZSBiaW5kaW5nIG9mIGEgUHJpbmNpcGFsIGFuZCBpdHMgcHVibGljIGtleS4gRXhhbXBsZXMgYXJlIFguNTA5LAorICogUEdQLCBhbmQgU0RTSS4gCisgKiA8cD4KKyAqIE5vdGU6IFRoaXMgcGFja2FnZSBpcyBwcm92aWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgKiBJdCBjb250YWlucyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgamF2YS5zZWN1cml0eS5jZXJ0IHBhY2thZ2UgdGhhdCB3YXMKKyAqIHByZXZpb3VzbHkgdXNlZCBieSBKU1NFIChKYXZhIFNTTCBwYWNrYWdlKS4gQWxsIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCBoYXZlCisgKiB0byBiZSBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgSlNTRSAodGhhdCBpcyBiZWZvcmUgSmF2YSBTREsgMS41KQorICogc2hvdWxkIG9ubHkgdXNlIGphdmEuc2VjdXJpdHkuY2VydC4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2VydGlmaWNhdGUgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlKCkge30KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoaXMgQ2VydGlmaWNhdGUuIElmIGJvdGggaGF2ZSB0aGUgc2FtZSBieXRlcworICAgICAqIHRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgZXF1YWwuCisgICAgICogCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDZXJ0aWZpY2F0ZX0gdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0CisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB7QGNvZGUgb2JqfSBpcyB0aGUgc2FtZSBhcyB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgQ2VydGlmaWNhdGV9LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKQEAgLTYwLDcgKzc0LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gb2JqZWN0cyB3aGljaAorICAgICAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QgYW5zd2VyCisgICAgICogdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAorICAgICAqIEBzZWUgI2VxdWFscworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCByZXMgPSAwOwpAQCAtNzUsMTMgKzk1LDMyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgY2VydGlmaWNhdGUuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZW5jb2RpbmcgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRFbmNvZGVkKCkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBWZXJpZmllcyB0aGF0IHRoaXMgY2VydGlmaWNhdGUgd2FzIHNpZ25lZCB3aXRoIHRoZSBnaXZlbiBwdWJsaWMga2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHB1YmxpYyBrZXkgZm9yIHdoaWNoIHZlcmlmaWNhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlbmNvZGluZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBhbGdvcml0aG0gaXMgZGV0ZWN0ZWQKKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBpbnZhbGlkIGtleSBpcyBkZXRlY3RlZAorICAgICAqIEB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb3ZpZGVyCisgICAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBzaWduYXR1cmUgZXJyb3JzIGFyZSBkZXRlY3RlZAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5KQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCkBAIC04OSw3ICsxMjgsMjQgQEAKICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhpcyBjZXJ0aWZpY2F0ZSB3YXMgc2lnbmVkIHdpdGggdGhlIGdpdmVuIHB1YmxpYyBrZXkuIFVzZXMKKyAgICAgKiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBnaXZlbiBieSB0aGUgcHJvdmlkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgcHVibGljIGtleSBmb3Igd2hpY2ggdmVyaWZpY2F0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgICAgICogQHBhcmFtIHNpZ1Byb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgc2lnbmF0dXJlIHByb3ZpZGVyLgorICAgICAqIEBleGNlcHRpb24gQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgICAgICogQGV4Y2VwdGlvbiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBhbGdvcml0aG0gaXMgZGV0ZWN0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBpbnZhbGlkIGtleSBpcyBkZXRlY3RlZAorICAgICAqIEBleGNlcHRpb24gTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGRvZXMgbm90IGV4aXN0cy4KKyAgICAgKiBAZXhjZXB0aW9uIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHNpZ25hdHVyZSBlcnJvcnMgYXJlIGRldGVjdGVkCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXksIFN0cmluZyBzaWdQcm92aWRlcikKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCAKQEAgLTk3LDEyICsxNTMsMTkgQEAKICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgICAqIHJlY2VpdmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSByZWNlaXZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHB1YmxpYyBrZXkgY29ycmVzcG9uZGluZyB0byB0aGlzIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBrZXkgY29ycmVzcG9uZGluZyB0byB0aGlzIGNlcnRpZmljYXRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQdWJsaWNLZXkgZ2V0UHVibGljS2V5KCk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24uamF2YQppbmRleCBhNTY3Zjc1Li40MDkxNjk1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uLmphdmEKQEAgLTE1LDM2ICsxNSw0MSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KIAogcGFja2FnZSBqYXZheC5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKKyAqIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYSB7QGNvZGUgQ2VydGlmaWNhdGV9CisgKiBpcyBiZWluZyBlbmNvZGVkLgorICogPHA+CisgKiBOb3RlOiBUaGlzIHBhY2thZ2UgaXMgcHJvdmlkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiBJdCBjb250YWlucyBhCisgKiBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIGphdmEuc2VjdXJpdHkuY2VydCBwYWNrYWdlIHRoYXQgd2FzIHByZXZpb3VzbHkgdXNlZAorICogYnkgSlNTRSAoSmF2YSBTU0wgcGFja2FnZSkuIEFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSB0byBiZQorICogY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEpTU0UgKHRoYXQgaXMgYmVmb3JlIEphdmEgU0RLIDEuNSkgc2hvdWxkCisgKiBvbmx5IHVzZSBqYXZhLnNlY3VyaXR5LmNlcnQuCisgKiA8L3A+CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotCiBwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKIAotICAgIC8qKgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODE4NzY0MjcyMzA0ODQwMzQ3MEw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb24uamF2YQppbmRleCBhZWRiMjg1Li5mMTg2ZTUxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb24uamF2YQpAQCAtMTUsMzUgKzE1LDM5IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwogCiBwYWNrYWdlIGphdmF4LnNlY3VyaXR5LmNlcnQ7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAqIAorICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCB7QGNvZGUgQ2VydGlmaWNhdGV9IHJlbGF0ZWQgZXhjZXB0aW9ucy4KKyAqIDxwPgorICogTm90ZTogVGhpcyBwYWNrYWdlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gSXQgY29udGFpbnMgYQorICogc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBqYXZhLnNlY3VyaXR5LmNlcnQgcGFja2FnZSB0aGF0IHdhcyBwcmV2aW91c2x5IHVzZWQKKyAqIGJ5IEpTU0UgKEphdmEgU1NMIHBhY2thZ2UpLiBBbGwgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IGhhdmUgdG8gYmUKKyAqIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBKU1NFICh0aGF0IGlzIGJlZm9yZSBKYXZhIFNESyAxLjUpIHNob3VsZAorICogb25seSB1c2UgamF2YS5zZWN1cml0eS5jZXJ0LgorICogPC9wPgorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAKLSAgICAvKioKLSAgICAgKiBAc2VyaWFsCi0gICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU3NTcyMTMzNzQwMzA3ODUyOTBMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVFeGNlcHRpb24oU3RyaW5nIG1zZykgewogICAgICAgICBzdXBlcihtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDg3MzY2YWUuLjYyODcwYTYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uLmphdmEKQEAgLTE1LDM1ICsxNSwzOSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKKyAqIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBhIHtAY29kZSBDZXJ0aWZpY2F0ZX0gaGFzIGV4cGlyZWQuCisgKiA8cD4KKyAqIE5vdGU6IFRoaXMgcGFja2FnZSBpcyBwcm92aWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIEl0IGNvbnRhaW5zIGEKKyAqIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgamF2YS5zZWN1cml0eS5jZXJ0IHBhY2thZ2UgdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkCisgKiBieSBKU1NFIChKYXZhIFNTTCBwYWNrYWdlKS4gQWxsIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIHRvIGJlCisgKiBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgSlNTRSAodGhhdCBpcyBiZWZvcmUgSmF2YSBTREsgMS41KSBzaG91bGQKKyAqIG9ubHkgdXNlIGphdmEuc2VjdXJpdHkuY2VydC4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIGV4dGVuZHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQHNlcmlhbAotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwOTE2MDEyMTIxNzcyNjE4ODNMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb259LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uLmphdmEKaW5kZXggY2RhY2NjZS4uNmYzMjk0NSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbi5qYXZhCkBAIC0xNSwzNSArMTUsMzkgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXguc2VjdXJpdHkuY2VydDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICogCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYSB7QGNvZGUgQ2VydGlmaWNhdGV9IGlzIG5vdCB5ZXQgdmFsaWQuCisgKiA8cD4KKyAqIE5vdGU6IFRoaXMgcGFja2FnZSBpcyBwcm92aWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIEl0IGNvbnRhaW5zIGEKKyAqIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgamF2YS5zZWN1cml0eS5jZXJ0IHBhY2thZ2UgdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkCisgKiBieSBKU1NFIChKYXZhIFNTTCBwYWNrYWdlKS4gQWxsIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIHRvIGJlCisgKiBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgSlNTRSAodGhhdCBpcyBiZWZvcmUgSmF2YSBTREsgMS41KSBzaG91bGQKKyAqIG9ubHkgdXNlIGphdmEuc2VjdXJpdHkuY2VydC4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiBleHRlbmRzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKIAotICAgIC8qKgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODk3NjE3MjQ3NDI2NjgyMjgxOEw7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24oKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbi5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IDYwYzRiYTAuLjliMjA4ZTYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uLmphdmEKQEAgLTE1LDM1ICsxNSwzOSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5zZWN1cml0eS5jZXJ0OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKKyAqIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBhIHtAY29kZSBDZXJ0aWZpY2F0ZX0gY2FuIG5vdCBiZSBwYXJzZWQuCisgKiA8cD4KKyAqIE5vdGU6IFRoaXMgcGFja2FnZSBpcyBwcm92aWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIEl0IGNvbnRhaW5zIGEKKyAqIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgamF2YS5zZWN1cml0eS5jZXJ0IHBhY2thZ2UgdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkCisgKiBieSBKU1NFIChKYXZhIFNTTCBwYWNrYWdlKS4gQWxsIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIHRvIGJlCisgKiBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgSlNTRSAodGhhdCBpcyBiZWZvcmUgSmF2YSBTREsgMS41KSBzaG91bGQKKyAqIG9ubHkgdXNlIGphdmEuc2VjdXJpdHkuY2VydC4KKyAqIDwvcD4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIGV4dGVuZHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gewogCi0gICAgLyoqCi0gICAgICogQHNlcmlhbAotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NDQ5MzUyNDIyOTUxMTM2MjI5TDsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbn0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9ufS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCkgewogICAgIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGUuamF2YSBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGUuamF2YQppbmRleCAxZWFkNGFjLi43N2JmZmFlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5zZWN1cml0eS5jZXJ0OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKQEAgLTQ1LDcgKzQwLDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgWC41MDkgY2VydGlmaWNhdGVzLgorICogPHA+CisgKiBUaGlzIHJlcHJlc2VudHMgYSBzdGFuZGFyZCB3YXkgZm9yIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlcyBvZiBYLjUwOSB2MQorICogY2VydGlmaWNhdGVzLgorICogPC9wPgorICogPHA+CisgKiBOb3RlOiBUaGlzIHBhY2thZ2UgaXMgcHJvdmlkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgorICogSXQgY29udGFpbnMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIGphdmEuc2VjdXJpdHkuY2VydCBwYWNrYWdlIHRoYXQgd2FzCisgKiBwcmV2aW91c2x5IHVzZWQgYnkgSlNTRSAoSmF2YSBTU0wgcGFja2FnZSkuIEFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgaGF2ZQorICogdG8gYmUgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEpTU0UgKHRoYXQgaXMgYmVmb3JlIEphdmEgU0RLIDEuNSkKKyAqIHNob3VsZCBvbmx5IHVzZSBqYXZhLnNlY3VyaXR5LmNlcnQuCisgKiA8L3A+CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFg1MDlDZXJ0aWZpY2F0ZSBleHRlbmRzIENlcnRpZmljYXRlIHsKIApAQCAtNjgsMTQgKzc1LDI0IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgWDUwOUNlcnRpZmljYXRlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgWDUwOUNlcnRpZmljYXRlfSBhbmQgaW5pdGlhbGl6ZXMgaXQgZnJvbSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpblN0cmVhbQorICAgICAqICAgICAgICAgICAgaW5wdXQgc3RyZWFtIGNvbnRhaW5pbmcgZGF0YSB0byBpbml0aWFsaXplIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSBpbml0aWFsaXplZCBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgY3JlYXRlZCBvciBpbml0aWFsaXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZSBnZXRJbnN0YW5jZShJbnB1dFN0cmVhbSBpblN0cmVhbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CkBAIC0yMDEsNyArMjE4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBYNTA5Q2VydGlmaWNhdGV9IGFuZCBpbml0aWFsaXplcyBpdCBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBieXRlIGFycmF5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjZXJ0RGF0YQorICAgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSBjb250YWluaW5nIGRhdGEgdG8gaW5pdGlhbGl6ZSB0aGUgY2VydGlmaWNhdGUuCisgICAgICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXkKKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGNhbm5vdCBiZSBjcmVhdGVkIG9yIGluaXRpYWxpemVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgWDUwOUNlcnRpZmljYXRlIGdldEluc3RhbmNlKGJ5dGVbXSBjZXJ0RGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CkBAIC0yMTMsNjAgKzIzOCwxODYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjZXJ0aWZpY2F0ZSBpcyBjdXJyZW50bHkgdmFsaWQuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbGlkaXR5IGRlZmluZWQgaW4gQVNOLjE6CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiB2YWxpZGl0eSAgICAgICAgICAgICBWYWxpZGl0eQorICAgICAqIAorICAgICAqIFZhbGlkaXR5IDo6PSBTRVFVRU5DRSB7IAorICAgICAqICAgICAgbm90QmVmb3JlICAgICAgIENlcnRpZmljYXRlVmFsaWRpdHlEYXRlLCAKKyAgICAgKiAgICAgIG5vdEFmdGVyICAgICAgICBDZXJ0aWZpY2F0ZVZhbGlkaXR5RGF0ZSB9CisgICAgICogCisgICAgICogQ2VydGlmaWNhdGVWYWxpZGl0eURhdGUgOjo9IENIT0lDRSB7IAorICAgICAqICAgICAgdXRjVGltZSAgICAgICAgIFVUQ1RpbWUsIAorICAgICAqICAgICAgZ2VuZXJhbFRpbWUgICAgIEdlbmVyYWxpemVkVGltZSB9CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGhhcyBleHBpcmVkLgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgeWV0IHZhbGlkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoZWNrVmFsaWRpdHkoKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiwgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsKIAogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2VydGlmaWNhdGUgaXMgdmFsaWQgYXQgdGhlIHNwZWNpZmllZCBkYXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgZGF0ZSB0byBjaGVjayB0aGUgdmFsaWRpdHkgYWdhaW5zdC4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZC4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHlldCB2YWxpZC4KKyAgICAgKiBAc2VlICNjaGVja1ZhbGlkaXR5KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGVja1ZhbGlkaXR5KERhdGUgZGF0ZSkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24sIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRlcyB7QGNvZGUgdmVyc2lvbn0gKHZlcnNpb24gbnVtYmVyKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmVyc2lvbiBkZWZpbmVkIGlzIEFTTi4xOgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogVmVyc2lvbiA6Oj0gIElOVEVHRVIgIHsgIHYxKDApLCB2MigxKSwgdjMoMikgIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRWZXJzaW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBzZXJpYWxOdW1iZXJ9IG9mIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQVNOLjEgZGVmaW5pdGlvbiBvZiB7QGNvZGUgc2VyaWFsTnVtYmVyfToKKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqIENlcnRpZmljYXRlU2VyaWFsTnVtYmVyICA6Oj0gIElOVEVHRVIKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2VyaWFsIG51bWJlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQmlnSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIGlzc3Vlcn0gKGlzc3VlciBkaXN0aW5ndWlzaGVkIG5hbWUpIGFzIGFuCisgICAgICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMge0Bjb2RlIFByaW5jaXBhbH0gb2JqZWN0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBBU04uMSBkZWZpbml0aW9uIG9mIHtAY29kZSBpc3N1ZXJ9OgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogIGlzc3VlciAgICAgIE5hbWUKKyAgICAgKiAKKyAgICAgKiAgTmFtZSA6Oj0gQ0hPSUNFIHsKKyAgICAgKiAgICAgIFJETlNlcXVlbmNlIH0KKyAgICAgKiAKKyAgICAgKiAgICBSRE5TZXF1ZW5jZSA6Oj0gU0VRVUVOQ0UgT0YgUmVsYXRpdmVEaXN0aW5ndWlzaGVkTmFtZQorICAgICAqIAorICAgICAqICAgIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUgOjo9IFNFVCBPRiBBdHRyaWJ1dGVUeXBlQW5kVmFsdWUKKyAgICAgKiAKKyAgICAgKiAgICBBdHRyaWJ1dGVUeXBlQW5kVmFsdWUgOjo9IFNFUVVFTkNFIHsKKyAgICAgKiAgICAgIHR5cGUgICAgIEF0dHJpYnV0ZVR5cGUsCisgICAgICogICAgICB2YWx1ZSAgICBBdHRyaWJ1dGVWYWx1ZSB9CisgICAgICogCisgICAgICogICAgQXR0cmlidXRlVHlwZSA6Oj0gT0JKRUNUIElERU5USUZJRVIKKyAgICAgKiAKKyAgICAgKiAgICBBdHRyaWJ1dGVWYWx1ZSA6Oj0gQU5ZIERFRklORUQgQlkgQXR0cmlidXRlVHlwZQorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgaXNzdWVyfSBhcyBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB7QGNvZGUKKyAgICAgKiAgICAgICAgIFByaW5jaXBhbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFByaW5jaXBhbCBnZXRJc3N1ZXJETigpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgc3ViamVjdH0gKHN1YmplY3QgZGlzdGluZ3Vpc2hlZCBuYW1lKSBhcyBhbgorICAgICAqIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHtAY29kZSBQcmluY2lwYWx9IG9iamVjdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQVNOLjEgZGVmaW5pdGlvbiBvZiB7QGNvZGUgc3ViamVjdH06CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiBzdWJqZWN0ICAgICAgTmFtZQorICAgICAqIAorICAgICAqICBOYW1lIDo6PSBDSE9JQ0UgeworICAgICAqICAgICAgUkROU2VxdWVuY2UgfQorICAgICAqIAorICAgICAqICAgIFJETlNlcXVlbmNlIDo6PSBTRVFVRU5DRSBPRiBSZWxhdGl2ZURpc3Rpbmd1aXNoZWROYW1lCisgICAgICogCisgICAgICogICAgUmVsYXRpdmVEaXN0aW5ndWlzaGVkTmFtZSA6Oj0gU0VUIE9GIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQorICAgICAqIAorICAgICAqICAgIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSA6Oj0gU0VRVUVOQ0UgeworICAgICAqICAgICAgdHlwZSAgICAgQXR0cmlidXRlVHlwZSwKKyAgICAgKiAgICAgIHZhbHVlICAgIEF0dHJpYnV0ZVZhbHVlIH0KKyAgICAgKiAKKyAgICAgKiAgICBBdHRyaWJ1dGVUeXBlIDo6PSBPQkpFQ1QgSURFTlRJRklFUgorICAgICAqIAorICAgICAqICAgIEF0dHJpYnV0ZVZhbHVlIDo6PSBBTlkgREVGSU5FRCBCWSBBdHRyaWJ1dGVUeXBlCisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBzdWJqZWN0fSAoc3ViamVjdCBkaXN0aW5ndWlzaGVkIG5hbWUpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQcmluY2lwYWwgZ2V0U3ViamVjdEROKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBub3RCZWZvcmV9IGRhdGUgZnJvbSB0aGUgdmFsaWRpdHkgcGVyaW9kIG9mIHRoZQorICAgICAqIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSB2YWxpZGl0eSBwZXJpb2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERhdGUgZ2V0Tm90QmVmb3JlKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBub3RBZnRlcn0gZGF0ZSBvZiB0aGUgdmFsaWRpdHkgcGVyaW9kIG9mIHRoZQorICAgICAqIGNlcnRpZmljYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVuZCBvZiB0aGUgdmFsaWRpdHkgcGVyaW9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBEYXRlIGdldE5vdEFmdGVyKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobSBmb3IgdGhlIGNlcnRpZmljYXRlIHNpZ25hdHVyZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaWdBbGdOYW1lKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIE9JRCBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBmcm9tIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBPSUQgb2YgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaWdBbGdPSUQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBpbiBERVItZW5jb2RlZCBmb3JtYXQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSwgb3IgbnVsbCBpZiBub25lIGFyZQorICAgICAqICAgICAgICAgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L3BhY2thZ2UuaHRtbCBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXgvc2VjdXJpdHkvY2VydC9wYWNrYWdlLmh0bWwKaW5kZXggNjBiOTA5NS4uYTU4ZjFkZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9qYXZheC9zZWN1cml0eS9jZXJ0L3BhY2thZ2UuaHRtbAorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmF4L3NlY3VyaXR5L2NlcnQvcGFja2FnZS5odG1sCkBAIC0xMCw1ICsxMCw2IEBACiBBbGwgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IGhhdmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEpTU0UgKHRoYXQgaXMKIGJlZm9yZSBKYXZhIFNESyAxLjUpIHNob3VsZCBvbmx5IHVzZSBqYXZhLnNlY3VyaXR5LmNlcnQuCiA8L3A+CitAc2luY2UgQW5kcm9pZCAxLjAKIDwvYm9keT4KIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9EZWZhdWx0UG9saWN5LmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9EZWZhdWx0UG9saWN5LmphdmEKaW5kZXggOGMyNmY2Mi4uMmFhNDc0ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvRGVmYXVsdFBvbGljeS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL0RlZmF1bHRQb2xpY3kuamF2YQpAQCAtMTMzLDggKzEzMyw4IEBACiAgKiBXZWFrSGFzaE1hcDsgdGhlIGNhY2hlIGlzIGNsZWFuZWQgZWl0aGVyIGV4cGxpY2l0bHkgZHVyaW5nIHJlZnJlc2goKQogICogaW52b2NhdGlvbiwgb3IgbmF0dXJhbGx5IGJ5IGdhcmJhZ2UtY29sbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBvYmplY3RzLgogICogCi0gKiBAc2VlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyNnZXRQb2xpY3lVUkxzKFByb3BlcnRpZXMsIFN0cmluZywKLSAqICAgICAgU3RyaW5nKQorICogQHNlZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuUG9saWN5VXRpbHMjZ2V0UG9saWN5VVJMcygKKyAqICAgICAgUHJvcGVydGllcywgU3RyaW5nLCBTdHJpbmcpCiAgKi8KIAogcHVibGljIGNsYXNzIERlZmF1bHRQb2xpY3kgZXh0ZW5kcyBQb2xpY3kgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvRGVmYXVsdFBvbGljeVBhcnNlci5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvRGVmYXVsdFBvbGljeVBhcnNlci5qYXZhCmluZGV4IDQxZDYwNTYuLmZhZmE2NmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL0RlZmF1bHRQb2xpY3lQYXJzZXIuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9EZWZhdWx0UG9saWN5UGFyc2VyLmphdmEKQEAgLTYyLDcgKzYyLDggQEAKICAqIGEgcGx1Z2dhYmxlIHNjYW5uZXIgYW5kIGNvbnZlcnRzIHJlY2VpdmVkIHRva2VucyB0byBhIHNldCBvZiAKICAqIHtAbGluayBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuUG9saWN5RW50cnkgUG9saWN5RW50cmllc30uIAogICogRm9yIGRldGFpbHMgb2YgcG9saWN5IGZvcm1hdCwgc2VlIHRoZSAKLSAqIHtAbGluayBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRGVmYXVsdFBvbGljeSBkZWZhdWx0IHBvbGljeSBkZXNjcmlwdGlvbn0uCisgKiB7QGxpbmsgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkRlZmF1bHRQb2xpY3kgZGVmYXVsdCBwb2xpY3kKKyAqIGRlc2NyaXB0aW9ufS4KICAqIDxicj4KICAqIEZvciBvcmRpbmFyeSB1c2VzLCB0aGlzIGNsYXNzIGhhcyBqdXN0IG9uZSBwdWJsaWMgbWV0aG9kIDxjb2RlPnBhcnNlKCk8L2NvZGU+LCAKICAqIHdoaWNoIHBlcmZvcm1zIHRoZSBtYWluIHRhc2suCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9TZWN1cml0eVV0aWxzLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9TZWN1cml0eVV0aWxzLmphdmEKaW5kZXggYzJlOGYzMy4uNjRjNzcwMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvU2VjdXJpdHlVdGlscy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL1NlY3VyaXR5VXRpbHMuamF2YQpAQCAtNDUsOCArNDUsNyBAQAogICAgIC8vIEEgbWFwIHVzZWQgdG8gc3RvcmUgaW5oZXJpdGVkIGNvbnRleHRzLjxicj4KICAgICAvLyBBIHRocmVhZCBpcyB1c2VkIGFzIGEga2V5IGZvciB0aGUgbWFwIGFuZCBBY2Nlc3NDb250cm9sQ29udGV4dCAKICAgICAvLyBwYXNzZWQgdG8gdGhlIHB1dENvbnRleHQgaXMgdXNlZCBhcyBhIHZhbHVlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdlYWtIYXNoTWFwPFRocmVhZCwgQWNjZXNzQ29udHJvbENvbnRleHQ+IEFDQ19DQUNIRSA9IAotICAgICAgICAgICAgbmV3IFdlYWtIYXNoTWFwPFRocmVhZCwgQWNjZXNzQ29udHJvbENvbnRleHQ+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2Vha0hhc2hNYXA8VGhyZWFkLCBBY2Nlc3NDb250cm9sQ29udGV4dD4gQUNDX0NBQ0hFID0gbmV3IFdlYWtIYXNoTWFwPFRocmVhZCwgQWNjZXNzQ29udHJvbENvbnRleHQ+KCk7CiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCB0byBiZSBpbnZva2VkIGluIHRoZSBUaHJlYWQncyBjb25zdHJ1Y3Rvci4gVGhlIGZpcnN0IGFyZ3VtZW50CkBAIC0xMTIsNCArMTExLDQgQEAKICAgICAgICAgICAgIHJldHVybiBBQ0NfQ0FDSEUuZ2V0KHRocmVhZCk7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQppbmRleCAwYzMyZmJhLi5kNzhkMGRmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQpAQCAtMjMsNyArMjMsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuaW50ZXJuYWwubmxzOwogCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKICAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHN0cmluZ3MgZnJvbSBhIHJlc291cmNlIGJ1bmRsZSBhbmQgcmV0dXJucyB0aGVtLApAQCAtNDEsOCArNTAsMTAgQEAKICAqLwogcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzUmVzb3VyY2UgPQogICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmludGVybmFsLm5scy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdoaWNoIGhhcyBubyBhcmd1bWVudHMuCkBAIC01Miw3ICs2Myw5IEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKQEAgLTExOSw2ICsxMzIsMTIgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnLCBhcmdzKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KKworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIER1cGxpY2F0ZSBjb2RlIHdhcyBkcm9wcGVkIGluIGZhdm9yIG9mIHVzaW5nIE1zZ0hlbHAuCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczcvU2lnbmVySW5mby5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczcvU2lnbmVySW5mby5qYXZhCmluZGV4IGVhNDkzMmQuLjA1YTBjN2EgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3BrY3M3L1NpZ25lckluZm8uamF2YQorKysgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wa2NzNy9TaWduZXJJbmZvLmphdmEKQEAgLTgwLDkgKzgwLDkgQEAKICAgICAgICAgICAgICkgewogICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwogICAgICAgICB0aGlzLmlzc3VlciA9ICgoTmFtZSlpc3N1ZXJBbmRTZXJpYWxOdW1iZXJbMF0pLmdldFg1MDBQcmluY2lwYWwoKTsKLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgdGhpcy5zZXJpYWxOdW1iZXIgPSBBU04xSW50ZWdlci50b0JpZ0ludGVnZXJWYWx1ZShpc3N1ZXJBbmRTZXJpYWxOdW1iZXJbMV0pOwotLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHRoaXMuZGlnZXN0QWxnb3JpdGhtID0gZGlnZXN0QWxnb3JpdGhtOwogICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzID0gYXV0aGVudGljYXRlZEF0dHJpYnV0ZXM7CiAgICAgICAgIHRoaXMuZGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobSA9IGRpZ2VzdEVuY3J5cHRpb25BbGdvcml0aG07CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L0NhY2hlLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L0NhY2hlLmphdmEKaW5kZXggYjc2YWQ2My4uYTRiNTcwMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY2VydC9DYWNoZS5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvQ2FjaGUuamF2YQpAQCAtMTM4LDI1ICsxMzgsMjUgQEAKICAgICAgICAgY2FjaGUgPSBuZXcgT2JqZWN0W2NhY2hlX3NpemVdOwogICAgIH0KIAotLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0vLyAgICAvKioKLS8vICAgICAqIENyZWF0ZXMgdGhlIENhY2hlIG9iamVjdCBvZiBzaXplIG9mIDkwMC4KLS8vICAgICAqIEBwYXJhbSBwcmVmX3NpemUgc3BlY2lmaWVzIGhvdyBtYW55IGxlYWRpbmcvdHJhaWxpbmcgYnl0ZXMgb2Ygb2JqZWN0J3MKLS8vICAgICAqIGVuY29kZWQgZm9ybSB3aWxsIGJlIHVzZWQgZm9yIGhhc2ggY29tcHV0YXRpb24KLS8vICAgICAqLwotLy8gICAgcHVibGljIENhY2hlKGludCBwcmVmX3NpemUpIHsKLS8vICAgICAgICB0aGlzKHByZWZfc2l6ZSwgOTAwKTsKLS8vICAgIH0KLS8vCi0vLyAgICAvKioKLS8vICAgICAqIENyZWF0ZXMgdGhlIENhY2hlIG9iamVjdCBvZiBzaXplIG9mIDkwMC4KLS8vICAgICAqLwotLy8gICAgcHVibGljIENhY2hlKCkgewotLy8gICAgICAgIHRoaXMoMjgsIDkwMCk7Ci0vLyAgICB9Ci0vLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgLy8gLyoqCisgICAgLy8gICogQ3JlYXRlcyB0aGUgQ2FjaGUgb2JqZWN0IG9mIHNpemUgb2YgOTAwLgorICAgIC8vICAqIEBwYXJhbSBwcmVmX3NpemUgc3BlY2lmaWVzIGhvdyBtYW55IGxlYWRpbmcvdHJhaWxpbmcgYnl0ZXMgb2Ygb2JqZWN0J3MKKyAgICAvLyAgKiBlbmNvZGVkIGZvcm0gd2lsbCBiZSB1c2VkIGZvciBoYXNoIGNvbXB1dGF0aW9uCisgICAgLy8gICovCisgICAgLy8gcHVibGljIENhY2hlKGludCBwcmVmX3NpemUpIHsKKyAgICAvLyAgICAgdGhpcyhwcmVmX3NpemUsIDkwMCk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gLyoqCisgICAgLy8gICogQ3JlYXRlcyB0aGUgQ2FjaGUgb2JqZWN0IG9mIHNpemUgb2YgOTAwLgorICAgIC8vICAqLworICAgIC8vIHB1YmxpYyBDYWNoZSgpIHsKKyAgICAvLyAgICAgdGhpcygyOCwgOTAwKTsKKyAgICAvLyB9CisgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogCi0vLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgQ2FjaGUgb2JqZWN0IG9mIHNpemUgb2YgOS4KICAgICAgKiBAcGFyYW0gcHJlZl9zaXplIHNwZWNpZmllcyBob3cgbWFueSBsZWFkaW5nL3RyYWlsaW5nIGJ5dGVzIG9mIG9iamVjdCdzCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICBwdWJsaWMgQ2FjaGUoKSB7CiAgICAgICAgIHRoaXMoMjgsIDkpOwogICAgIH0KLS8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBhcnJheS4gVGhpcyBjb2RlIGlzIHVzZWQgdG8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRJbXBsLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L1g1MDlDZXJ0SW1wbC5qYXZhCmluZGV4IDA5YjQzN2MuLjIwZTczYmQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRJbXBsLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY2VydC9YNTA5Q2VydEltcGwuamF2YQpAQCAtMzgsNyArMzgsNiBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHVibGljS2V5OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNTIsNyArNTEsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0aWZpY2F0ZTsKKworLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAoraW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbDsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBYNTA5Q2VydGlmaWNhdGUuIEl0IHdyYXBzCkBAIC0xNzUsMTIgKzE3OCwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGxvbmcgdGltZSA9IGRhdGUuZ2V0VGltZSgpOwogICAgICAgICBpZiAodGltZSA8IG5vdEJlZm9yZSkgeworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbigiY3VycmVudCB0aW1lOiAiICsgZGF0ZQogICAgICAgICAgICAgICAgICsgIiwgdmFsaWRhdGlvbiB0aW1lOiAiICsgbmV3IERhdGUobm90QmVmb3JlKSk7CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIH0KICAgICAgICAgaWYgKHRpbWUgPiBub3RBZnRlcikgeworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKCJjdXJyZW50IHRpbWU6ICIgKyBkYXRlCiAgICAgICAgICAgICAgICAgKyAiLCBleHBpcmF0aW9uIHRpbWU6ICIgKyBuZXcgRGF0ZShub3RBZnRlcikpOworICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUJsb2NrQ2lwaGVyLmphdmEgYi9zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUJsb2NrQ2lwaGVyLmphdmEKaW5kZXggODViOTRlMC4uZDJiNTBlZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlci5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXIuamF2YQpAQCAtNjY2LDEwICs2NjYsMjEgQEAKICAgICAgICAgaW50ICAgICBpbnB1dExlbiwKICAgICAgICAgYnl0ZVtdICBvdXRwdXQsCiAgICAgICAgIGludCAgICAgb3V0cHV0T2Zmc2V0KSAKLSAgICAgICAgdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24KKyAgICAgICAgdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24sIFNob3J0QnVmZmVyRXhjZXB0aW9uCiAgICAgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gYWRkZWQgU2hvcnRCdWZmZXJFeGNlcHRpb24gdG8gdGhlIHRocm93cyBzdGF0ZW1lbnQKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICBpbnQgICAgIGxlbiA9IDA7CiAKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICBpbnQgb3V0cHV0TGVuID0gY2lwaGVyLmdldE91dHB1dFNpemUoaW5wdXRMZW4pOworCisgICAgICAgIGlmIChvdXRwdXRMZW4gKyBvdXRwdXRPZmZzZXQgPiBvdXRwdXQubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2hvcnRCdWZmZXJFeGNlcHRpb24oIm5lZWQgYXQgbGVhc3QgIiArIG91dHB1dExlbiArICIgYnl0ZXMiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisKICAgICAgICAgaWYgKGlucHV0TGVuICE9IDApCiAgICAgICAgIHsKICAgICAgICAgICAgICAgICBsZW4gPSBjaXBoZXIucHJvY2Vzc0J5dGVzKGlucHV0LCBpbnB1dE9mZnNldCwgaW5wdXRMZW4sIG91dHB1dCwgb3V0cHV0T2Zmc2V0KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvV3JhcENpcGhlclNwaS5qYXZhIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9XcmFwQ2lwaGVyU3BpLmphdmEKaW5kZXggNGYxNGI4NS4uNWFjODkzOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9XcmFwQ2lwaGVyU3BpLmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9XcmFwQ2lwaGVyU3BpLmphdmEKQEAgLTI1MCwxNiArMjUwLDE5IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgIC8vIGFkZGVkIFNob3J0QnVmZmVyRXhjZXB0aW9uIHRvIHRocm93cyBzdGF0ZW1lbnQKICAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZURvRmluYWwoCiAgICAgICAgIGJ5dGVbXSAgaW5wdXQsCiAgICAgICAgIGludCAgICAgaW5wdXRPZmZzZXQsCiAgICAgICAgIGludCAgICAgaW5wdXRMZW4sCiAgICAgICAgIGJ5dGVbXSAgb3V0cHV0LAogICAgICAgICBpbnQgICAgIG91dHB1dE9mZnNldCkKLSAgICAgICAgdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24KKyAgICAgICAgdGhyb3dzIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24sIFNob3J0QnVmZmVyRXhjZXB0aW9uCiAgICAgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVXcmFwKAogICAgICAgICBLZXkgICAgIGtleSkKQEAgLTI5Miw4ICsyOTUsMTEgQEAKICAgICAgICAgYnl0ZVtdICB3cmFwcGVkS2V5LAogICAgICAgICBTdHJpbmcgIHdyYXBwZWRLZXlBbGdvcml0aG0sCiAgICAgICAgIGludCAgICAgd3JhcHBlZEtleVR5cGUpCi0gICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24KKyAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCiAgICAgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gYWRkZWQgU2hvcnRCdWZmZXJFeGNlcHRpb24gdG8gdGhyb3dzIHN0YXRlbWVudAorICAgICAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiAgICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gbnVsbDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKQEAgLTM5NSwxMCArNDAxLDEyIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlVua25vd24ga2V5IHR5cGUgIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiVW5rbm93biBrZXkgdHlwZSAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgICAgICAvLyBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAvLyB7CisgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlVua25vd24ga2V5IHR5cGUgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlMikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiVW5rbm93biBrZXkgdHlwZSAiICsgZTIuZ2V0TWVzc2FnZSgpKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xFeGNlcHRpb24yVGVzdC5qYXZhCmluZGV4IGU5MDg4ZGUuLjU1MmMxYjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sRXhjZXB0aW9uMlRlc3QuamF2YQpAQCAtMTcsOSArMTcsMTUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZVBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBGaWxlUGVybWlzc2lvbiBmaWxlUGVybWlzc2lvbjsKIApAQCAtMzAsNiArMzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uI0FjY2Vzc0NvbnRyb2xFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICBtZXRob2ROYW1lID0gIkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24iLAorICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCkBAIC00Myw2ICs1OCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24jQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3NlY3VyaXR5X1Blcm1pc3Npb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZywKQEAgLTU3LDYgKzgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiNnZXRQZXJtaXNzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVybWlzc2lvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbgogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24uZ2V0UGVybWlzc2lvbigpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggY2Y1OGU5Ny4uYjMxNjJlOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwpAQCAtMzIsNyArMzcsNyBAQAogLyoqCiAgKiBVbml0IHRlc3QgZm9yIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24uCiAgKi8KLQorQFRlc3RUYXJnZXRDbGFzcyhBY2Nlc3NDb250cm9sRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCkBAIC00Niw2ICs1MSwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvbnRyb2xFeGNlcHRpb25TdHJpbmcoKSB7CiAgICAgICAgIG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKG51bGwpOwogICAgICAgICBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiRmFpbHVyZSIpOwpAQCAtNTQsNiArNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKFN0cmluZywgUGVybWlzc2lvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtZXRob2Qgd2l0aCBwb3NpdGl2ZSBhcmd1bWVudHMgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQ29udHJvbEV4Y2VwdGlvblN0cmluZ1Blcm1pc3Npb24oKSB7CiAgICAgICAgIFBlcm1pc3Npb24gcGVybSA9IG5ldyBBbGxQZXJtaXNzaW9uKCk7CiAgICAgICAgIG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCIwMDEiLCBwZXJtKTsKQEAgLTYzLDYgKzg2LDE1IEBACiAgICAgICogCiAgICAgICogVGVzdHMgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbi5nZXRQZXJtaXNzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQZXJtaXNzaW9uKCkgewogICAgICAgICBQZXJtaXNzaW9uIHBlcm0gPSBuZXcgVW5yZXNvbHZlZFBlcm1pc3Npb24oInVucmVzb2x2ZWRUeXBlIiwKICAgICAgICAgICAgICAgICAidW5yZXNvbHZlZE5hbWUiLCAidW5yZXNvbHZlZEFjdGlvbnMiLCBudWxsKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlcjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIyVGVzdC5qYXZhCmluZGV4IDZlYmI3MzUuLmExMmQwMWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlcjJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyMlRlc3QuamF2YQpAQCAtMTcsMTggKzE3LDM0IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEFjY2Vzc0NvbnRyb2xsZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQWNjZXNzQ29udHJvbGxlcjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbiwKICAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiMS4gTmVlZCByZW1vdmUgY29udmVyc2lvbiAoQm9vbGVhbikgYmVmb3JlIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkIG1ldGhvZCBpbiB0aGUgdGVzdC4iICsKKyAgICAgICAgICAgICAgICAgICIyLiBFeGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGFjdGlvbiBpcyBudWxsIGlzIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvUHJpdmlsZWdlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcml2aWxlZ2VkQWN0aW9uLmNsYXNzLCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Qcml2aWxlZ2VkTGphdmFfc2VjdXJpdHlfUHJpdmlsZWdlZEFjdGlvbkxqYXZhX3NlY3VyaXR5X0FjY2Vzc0NvbnRyb2xDb250ZXh0KCkgewogICAgICAgICBCb29sZWFuIHBhc3M7CiAKQEAgLTY2LDYgKzgyLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWQoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIxLiBOZWVkIHJlbW92ZSBjb252ZXJzaW9uIChCb29sZWFuKSBiZWZvcmUgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQgbWV0aG9kIGluIHRoZSB0ZXN0LiIgKworICAgICAgICAgICAgICAgICIyLiBFeGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGFjdGlvbiBpcyBudWxsIGlzIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvUHJpdmlsZWdlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcml2aWxlZ2VkQWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Qcml2aWxlZ2VkTGphdmFfc2VjdXJpdHlfUHJpdmlsZWdlZEFjdGlvbigpIHsKICAgICAgICAgQm9vbGVhbiBwYXNzOwogCkBAIC05MCw2ICsxMTYsMTcgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24sCiAgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQpKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIjEuIE5lZWQgcmVtb3ZlIGNvbnZlcnNpb24gKEJvb2xlYW4pIGJlZm9yZSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCBtZXRob2QgaW4gdGhlIHRlc3QuIiArCisgICAgICAgICAgICAgICAgIjIuIEV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgYWN0aW9uIGlzIG51bGwgaXMgbm90IGNoZWNrZWQuIiArCisgICAgICAgICAgICAgICAgIjMuIEV4Y2VwdGlvbiBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGlzIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvUHJpdmlsZWdlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmNsYXNzLCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Qcml2aWxlZ2VkTGphdmFfc2VjdXJpdHlfUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbkxqYXZhX3NlY3VyaXR5X0FjY2Vzc0NvbnRyb2xDb250ZXh0KCkgewogICAgICAgICBCb29sZWFuIHBhc3M7CiAgICAgICAgIHRyeSB7CkBAIC0xMzAsNiArMTY3LDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWQoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIxLiBOZWVkIHJlbW92ZSBjb252ZXJzaW9uIChCb29sZWFuKSBiZWZvcmUgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQgbWV0aG9kIGluIHRoZSB0ZXN0LiIgKworICAgICAgICAgICAgICAgICIyLiBFeGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGFjdGlvbiBpcyBudWxsIGlzIG5vdCBjaGVja2VkLiIgKworICAgICAgICAgICAgICAgICIzLiBFeGNlcHRpb24gUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBpcyBub3QgY2hlY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkb1ByaXZpbGVnZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERvUHJpdmlsZWdlZExqYXZhX3NlY3VyaXR5X1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CiAgICAgICAgIEJvb2xlYW4gcGFzczsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMVRlc3QuamF2YQppbmRleCBhMDdhNTJhLi5jYmQ1NTI5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjFUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IxVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSwxMiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKQEAgLTM1LDggKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCitAVGVzdFRhcmdldENsYXNzKEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZAogICogbWV0aG9kcy4KQEAgLTEwMSw2ICsxMDYsMTUgQEAKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGlmIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMDEoKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CkBAIC0xMjMsNiArMTM3LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciBpbnN0YW5jZSAKICAgICAgKiB3aGVuIGFsZ29yaXRobSBpcyBEU0EKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IwMigpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFEU0FTdXBwb3J0ZWQpIHsKQEAgLTE0Miw2ICsxNjUsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IAogICAgICAqIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMDMoKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewpAQCAtMTY5LDYgKzIwMSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGlmIHByb3ZpZGVyIGlzIG5vdAogICAgICAqIGF2YWlsYWJsZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMDQoKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CkBAIC0xOTUsNiArMjM2LDE1IEBACiAgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGlzIG51bGwKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGlmIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IwNSgpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewpAQCAtMjIzLDYgKzI3MywxNSBAQAogICAgICAqIG1ldGhvZCAKICAgICAgKiBBc3NlcnRpb246IHJldHVybiBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjA2KCkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFEU0FTdXBwb3J0ZWQpIHsKQEAgLTI0NCw2ICszMDMsMTUgQEAKICAgICAgKiBtZXRob2QgCiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IwNygpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFEU0FTdXBwb3J0ZWQpIHsKQEAgLTI2Nyw2ICszMzUsMTUgQEAKICAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gaXMgbnVsbAogICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gaWYgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMDgoKSB7CiAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICBmYWlsKHZhbGlkQWxnTmFtZSArICIgYWxnb3JpdGhtIGlzIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTI5NCw2ICszNzEsMTUgQEAKICAgICAgKiBtZXRob2QgCiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMDkoKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CkBAIC0zMTIsNyArMzk4LDE2IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2VuZXJhdGVQYXJhbWV0ZXJzKCk8L2NvZGU+IG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBBbGdvcml0aG1QYXJhbWV0ZXJzIG9iamVjdAotICAgICAqLyAgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IxMCgpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFEU0FTdXBwb3J0ZWQpIHsKQEAgLTMzMyw2ICs0MjgsMTkgQEAKICAgICAgKiBtZXRob2RzCiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuIHBhcmFtIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2FzZSB3YXMgdmVyaWZpZWQgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7QWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0FsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3MsIFNlY3VyZVJhbmRvbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjEyKCkgewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbCh2YWxpZEFsZ05hbWUgKyAiIGFsZ29yaXRobSBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC0zNDUsOSArNDUzLDE3IEBACiAgICAgICAgICAgICAgICAgYXBncyk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXBncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhcGdzW2ldLmluaXQoYXBzKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3dzIHdoZW4gcGFyYW0gaXMgbnVsbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7ICAgICAgCisgICAgICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGFwZ3NbaV0uaW5pdChhcHMsIHJhbmRvbSk7CiAgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93cyB3aGVuIHBhcmFtIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsgICAgCisgICAgICAgICAgICAgICAgLy9leHBlY3RlZAogICAgICAgICAgICAgfQogICAgICAgICB9ICAgICAgICAKICAgICB9CkBAIC0zNTYsNiArNDcyLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yPC9jb2RlPiBjb25zdHJ1Y3RvciAKICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yIG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkNvbnN0cnVjdG9yIHdhcyB1c2VkIHdpdGhvdXQgaW52YWxpZCBwYXJhbWV0ZXJzIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaS5jbGFzcywgUHJvdmlkZXIuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvckNvbnN0cigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbCh2YWxpZEFsZ05hbWUgKyAiIGFsZ29yaXRobSBpcyBub3Qgc3VwcG9ydGVkIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjJUZXN0LmphdmEKaW5kZXggN2ZjMjE3MS4uZjNkY2VlYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IyVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yMlRlc3QuamF2YQpAQCAtMjEsNiArMjEsMTIgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwpAQCAtMzQsOCArNDAsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlNwaUVuZ1V0aWxzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCiAgKiBtZXRob2RzLgpAQCAtMTI0LDYgKzEyOSwxNSBAQAogICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gaWYgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUKICAgICAgKiByZXR1cm5zIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2UwMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKQEAgLTE2MCw2ICsxNzQsMTUgQEAKICAgICAgKiB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBhdmFpbGFibGU7CiAgICAgICogcmV0dXJucyBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3Igb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2UwMigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAogICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC0yMjAsNiArMjQzLDE1IEBACiAgICAgICogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGw7CiAgICAgICogcmV0dXJucyBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3Igb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZTAzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IzVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IzVGVzdC5qYXZhCmluZGV4IDBiMGRkY2QuLjViMDliNTkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yM1Rlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjNUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnM7CkBAIC0yNywxMSArMzIsMjEgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjOwogCitAVGVzdFRhcmdldENsYXNzKEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5jbGFzcykKIHB1YmxpYyBjbGFzcyBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IzVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IjZ2VuZXJhdGVQYXJhbWV0ZXJzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmF0ZVBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICAvL2ZhaWwoIlRha2VzIGFnZXMuIFByb2JsZW0gd2l0aCBTZWN1cmVSYW5kb20gYW5kIHN0dWIgbWF0aCA/Iik7CkBAIC01MCw2ICs2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciNnZXRBbGdvcml0aG0oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGdvcml0aG0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsZ29yaXRobSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5nZXRBbGdvcml0aG0oKQpAQCAtNjEsNiArODUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRJbnN0YW5jZSB3aXRoIHBhcmFtZXRlciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcgogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5nZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nKQpAQCAtNzEsNiArMTA0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yI2dldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gaXMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcgogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5nZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLApAQCAtMTE1LDYgKzE1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciNnZXRQcm92aWRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHByb3ZpZGVyIHdpdGggbnVsbCBwYXJhbWV0ZXIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IuZ2V0UHJvdmlkZXIoKQpAQCAtMTI3LDYgKzE3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciNpbml0KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJCb3VuZGFyeS9pbnZhbGlkL25lZ2F0aXZlIHBhcmFtZXRlcnMgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdEkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IuaW5pdChpbnQpCkBAIC0xNDAsNiArMjAwLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yI2luaXQoaW50LAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJCb3VuZGFyeS9pbnZhbGlkL25lZ2F0aXZlIHBhcmFtZXRlcnMgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIFNlY3VyZVJhbmRvbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0SUxqYXZhX3NlY3VyaXR5X1NlY3VyZVJhbmRvbSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5pbml0KGludCwKQEAgLTE1Myw2ICsyMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IjaW5pdChqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGV4Y2VwdGlvbiBvbmx5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0TGphdmFfc2VjdXJpdHlfc3BlY19BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yLmluaXQoamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCkBAIC0xNzMsNiArMjUxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yI2luaXQoamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMsCiAgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZXhjZXB0aW9uIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdExqYXZhX3NlY3VyaXR5X3NwZWNfQWxnb3JpdGhtUGFyYW1ldGVyU3BlY0xqYXZhX3NlY3VyaXR5X1NlY3VyZVJhbmRvbSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvci5pbml0KGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJzVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJzVGVzdC5qYXZhCmluZGV4IDcwYTlmNDUuLjM3Yzg1OTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyc1Rlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlcnNUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKQEAgLTM0LDcgKzM5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEFsZ29yaXRobVBhcmFtZXRlcnMuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5BbGdvcml0aG1QYXJhbWV0ZXJzPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCiAgKiBtZXRob2RzLgpAQCAtNjcsNiArNzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzI2dldEFsZ29yaXRobSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxnb3JpdGhtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gdGVzdDogbnVsbCB2YWx1ZQpAQCAtODEsNiArOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzI2dldEVuY29kZWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgZmluYWwgYnl0ZVtdIGVuYyA9IG5ldyBieXRlW10geyAweDAyLCAweDAxLCAweDAzIH07CkBAIC0xMTQsNiArMTM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyNnZXRFbmNvZGVkKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVuY29kZWRMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIGJ5dGVbXSBlbmMgPSBuZXcgYnl0ZVtdIHsgMHgwMiwgMHgwMSwgMHgwMyB9OwpAQCAtMTY1LDYgKzE5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMjZ2V0SW5zdGFuY2UoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2Fzbid0IGNoZWNrZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJzIGFwID0gQWxnb3JpdGhtUGFyYW1ldGVycy5nZXRJbnN0YW5jZSgiQUJDIik7CkBAIC0xNzksNiArMjIwLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyNnZXRJbnN0YW5jZShTdHJpbmcsIFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIiArCisgICAgICAgICAgICAgICAgICAiIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3ZXJlbid0IGNoZWNrZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKQEAgLTE5NSw2ICsyNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzI2dldFBhcmFtZXRlclNwZWMoQ2xhc3MpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkNsYXNzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmFtZXRlclNwZWNMamF2YV9sYW5nX0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgZmluYWwgTXlBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIG15UGFyYW1TcGVjID0gbmV3IE15QWxnb3JpdGhtUGFyYW1ldGVyU3BlYygpOwpAQCAtMjUzLDYgKzMxMywxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMjZ2V0SW5zdGFuY2UoU3RyaW5nLCBQcm92aWRlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb25zIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiArCisgICAgICAgICAgICAgICAgICAiIHdlcmVuJ3QgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3NlY3VyaXR5X1Byb3ZpZGVyKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogCkBAIC0yNjgsNiArMzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyNnZXRQcm92aWRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyB0ZXN0OiBudWxsIHZhbHVlCiAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnMgYXAgPSBuZXcgRHVtbXlBbGdvcml0aG1QYXJhbWV0ZXJzKG51bGwsIG51bGwsICJBQUEiKTsKQEAgLTI4MSw2ICszNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzI2luaXQoamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7QWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0TGphdmFfc2VjdXJpdHlfc3BlY19BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogCkBAIC0zNTEsNiArNDM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyNpbml0KGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdCRCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8KQEAgLTQxOCw2ICs1MTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzI2luaXQoYnl0ZVtdLFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0JEJMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8vCkBAIC00OTUsNiArNjAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSAiQWxnb3JpdGhtUGFyYW1ldGVycyI7CkBAIC01MTgsNiArNjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgRFNBIEFsZ29yaXRobVBhcmFtZXRlcnMgcHJvdmlkZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJKdXN0IERTQSBwYXJhbWV0ZXIgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REU0FQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJzIHBhcmFtcyA9IEFsZ29yaXRobVBhcmFtZXRlcnMuZ2V0SW5zdGFuY2UoIkRTQSIpOwogCkBAIC01NjYsNiArNjkwLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgT0FFUCBBbGdvcml0aG1QYXJhbWV0ZXJzIHByb3ZpZGVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSnVzdCBPQUVQIHBhcmFtZXRlciB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RPQUVQUHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMgPSBBbGdvcml0aG1QYXJhbWV0ZXJzLmdldEluc3RhbmNlKCJPQUVQIik7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxsUGVybWlzc2lvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb24yVGVzdC5qYXZhCmluZGV4IGU2NTEyMjEuLjY4MDI4NmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxsUGVybWlzc2lvbjJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGxQZXJtaXNzaW9uMlRlc3QuamF2YQpAQCAtMTcsMTcgKzE3LDMyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb247CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEFsbFBlcm1pc3Npb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgQWxsUGVybWlzc2lvbjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24jQWxsUGVybWlzc2lvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFsbFBlcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKCkKICAgICAgICAgQWxsUGVybWlzc2lvbiBhcCA9IG5ldyBBbGxQZXJtaXNzaW9uKCk7CkBAIC0zOSw2ICs1NCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24jQWxsUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwvZW1wdHkgcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBbGxQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcpCkBAIC01NCw2ICs3OCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24jZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlVwZGF0ZSBjb21tZW50IGZvciBmaXJzdCBhc3NlcnRUcnVlIG1ldGhvZC4iICsKKyAgICAgICAgICAgICAgICAgICJCZWNhdXNlOiBUd28gQWxsUGVybWlzc2lvbiBvYmplY3RzIGFyZSBhbHdheXMgZXF1YWwiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNjYsNiArMTAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbiNnZXRBY3Rpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWN0aW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWN0aW9ucygpIHsKICAgICAgICAgQWxsUGVybWlzc2lvbiBhcCA9IG5ldyBBbGxQZXJtaXNzaW9uKCk7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCkBAIC03Nyw2ICsxMjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBmaW5hbCBpbnQgQUxMUEVSTUlTU0lPTl9IQVNIID0gMTsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24uaGFzaENvZGUoKQpAQCAtOTAsNiArMTQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbiNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbXBsaWVzTGphdmFfc2VjdXJpdHlfUGVybWlzc2lvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uLmltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQpAQCAtMTA0LDYgKzE2NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24jbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CiAgICAgICAgIEFsbFBlcm1pc3Npb24gYXAxID0gbmV3IEFsbFBlcm1pc3Npb24oKTsKICAgICAgICAgQWxsUGVybWlzc2lvbiBhcDIgPSBuZXcgQWxsUGVybWlzc2lvbigiRG9uJ3QgcmVtZW1iZXIgdGhpcyBzdHVwaWQgbmFtZSIsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsbFRlc3RzLmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsbFRlc3RzLmphdmEKaW5kZXggMTBmYjE4YS4uZDc2NDAwZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BbGxUZXN0cy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxsVGVzdHMuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogCiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBY2Nlc3NDb250cm9sRXhjZXB0aW9uMlRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQWNjZXNzQ29udHJvbEV4Y2VwdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQWNjZXNzQ29udHJvbGxlcjJUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQWNjZXNzQ29udHJvbGxlcjJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjFUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjNUZXN0LmNsYXNzKTsKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvdmlkZXJTZXJ2aWNlVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcm92aWRlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHVibGljS2V5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWN1cmVDbGFzc0xvYWRlcjJUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VjdXJlQ2xhc3NMb2FkZXIyVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWN1cmVSYW5kb20yVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWN1cml0eTJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlY3VyaXR5UGVybWlzc2lvbjJUZXN0LmNsYXNzKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQXV0aFByb3ZpZGVyVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BdXRoUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggN2U1MTFiMy4uOWRhMWQ0NiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BdXRoUHJvdmlkZXJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9BdXRoUHJvdmlkZXJUZXN0LmphdmEKQEAgLTE2LDEzICsxNiwxOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5BdXRoUHJvdmlkZXI7CiAKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Q7CiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoQXV0aFByb3ZpZGVyLmNsYXNzKQogcHVibGljIGNsYXNzIEF1dGhQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzYsNyArNDEsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BdXRoUHJvdmlkZXIjQXV0aFByb3ZpZGVyKFN0cmluZywgZG91YmxlLCBTdHJpbmcpCiAgICAgICovCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYWxsIG5lZ2F0aXZlIHZhcmlhbnRzIGluIHRoZSBvbmUgdGVzdCBjYXNlIGluc3RlYWQgb2YiICsKKyAgICAgICAgICAgICAgICAgICIgdGhyZWUgdGVzdHMgZm9yIGVhY2ggY2FzZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkF1dGhQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBkb3VibGUuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKICAgICAgICAgQXV0aFByb3ZpZGVyU3R1YiBhcCA9IG5ldyBBdXRoUHJvdmlkZXJTdHViKCJuYW1lIiwgMS4wLCAiaW5mbyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBhcC5nZXROYW1lKCkpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9CYXNpY1Blcm1pc3Npb24yVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9CYXNpY1Blcm1pc3Npb24yVGVzdC5qYXZhCmluZGV4IGRlOTlhMGIuLjcyOWUzY2UgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQmFzaWNQZXJtaXNzaW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0Jhc2ljUGVybWlzc2lvbjJUZXN0LmphdmEKQEAgLTE3LDkgKzE3LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEJhc2ljUGVybWlzc2lvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBCYXNpY1Blcm1pc3Npb24yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2ljUGVybWlzc2lvblN1YmNsYXNzIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIHsKQEAgLTQ1LDYgKzUxLDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uI0Jhc2ljUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRlc3QgY2FzZXMsIHdoZXJlIHBhcmFtZXRlciBuYW1lIGlzIG51bGwgKGV4cGVjdCBOdWxsUG9pbnRlckV4Y2VwdGlvbikiICsKKyAgICAgICAgICAgICAgICAgICIgYW5kIHBhcmFtZXRlciBuYW1lIGlzIGVtcHR5IChleHBlY3QgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSIgKworICAgICAgICAgICAgICAgICAgIiBhcmUgYWJzZW50IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmFzaWNQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUgcmV0dXJuZWQiLCAiYU5hbWUiLCBicC5nZXROYW1lKCkpOwpAQCAtNTQsNiArNzEsMTcgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb24jQmFzaWNQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBjYXNlcywgd2hlcmUgcGFyYW1ldGVyIG5hbWUgaXMgbnVsbCAoZXhwZWN0IE51bGxQb2ludGVyRXhjZXB0aW9uKSIgKworICAgICAgICAgICAgICAgICIgYW5kIHBhcmFtZXRlciBuYW1lIGlzIGVtcHR5IChleHBlY3QgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSIgKworICAgICAgICAgICAgICAgICIgYXJlIGFic2VudCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJhc2ljUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcpCkBAIC02Myw2ICs5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbiNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNzUsNiArMTEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uI2dldEFjdGlvbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3Rpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBY3Rpb25zKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbi5nZXRBY3Rpb25zKCkKQEAgLTg3LDYgKzEzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbiNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbi5oYXNoQ29kZSgpCiAgICAgICAgIGFzc2VydFRydWUoIkVxdWFsIG9iamVjdHMgc2hvdWxkIHJldHVybiBzYW1lIGhhc2giLApAQCAtOTYsNiArMTUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uI2ltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbXBsaWVzTGphdmFfc2VjdXJpdHlfUGVybWlzc2lvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb24uaW1wbGllcyhqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCkBAIC0xMTAsNiArMTc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uI25ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3UGVybWlzc2lvbkNvbGxlY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbgogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbi5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0NvZGVTaWduZXJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0NvZGVTaWduZXJUZXN0LmphdmEKaW5kZXggMTA2MWQ5MS4uNjc3YzY4ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Db2RlU2lnbmVyVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQ29kZVNpZ25lclRlc3QuamF2YQpAQCAtMjEsNiArMjEsMTIgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTaWduZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5UaW1lc3RhbXA7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoOwpAQCAtMjksOCArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlRlc3RDZXJ0VXRpbHM7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhDb2RlU2lnbmVyLmNsYXNzKQogLyoqCiAgKiBVbml0IHRlc3QgZm9yIENvZGVTaWduZXIuIAogICovCkBAIC01Myw2ICs1OCwxNSBAQAogICAgIC8qKgogICAgICAqIG11c3QgdGhyb3cgTlBFIGlmIHNpZ25lckNlcnRQYXRoIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJUZXN0IGNhc2Ugd2hlcmUgcGFyYW1ldGVycyBhcmUgbm90IG51bGwgaXMgYWJzZW50IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ29kZVNpZ25lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDZXJ0UGF0aC5jbGFzcywgVGltZXN0YW1wLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29kZVNpZ25lcl8wMCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBDb2RlU2lnbmVyKG51bGwsIHRzKTsKQEAgLTY1LDYgKzc5LDE1IEBACiAgICAgLyoqCiAgICAgICogdGltZXN0YW1wIGNhbiBiZSBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVGVzdCBjYXNlIHdoZXJlIHRpbWVzdGFtcCBpcyBub3QgbnVsbCBpcyBhYnNlbnQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb2RlU2lnbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NlcnRQYXRoLmNsYXNzLCBUaW1lc3RhbXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb2RlU2lnbmVyXzAxKCkgewogICAgICAgICBuZXcgQ29kZVNpZ25lcihjcGF0aCwgbnVsbCk7CiAgICAgfQpAQCAtNzIsNiArOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0IHZhcmlvdXMgYXNzZXJ0aW9ucyBhYm91dCBlcXVhbHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpIHsKICAgICAgICAgCiAgICAgICAgIENvZGVTaWduZXIgb25lID0gbmV3IENvZGVTaWduZXIoY3BhdGgsIHRzKTsKQEAgLTk3LDYgKzEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIENvZGVTaWduZXIuZ2V0U2lnbmVyQ2VydFBhdGgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTaWduZXJDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaWduZXJDZXJ0UGF0aCgpIHsKICAgICAgICAgYXNzZXJ0U2FtZShuZXcgQ29kZVNpZ25lcihjcGF0aCwgbnVsbCkuZ2V0U2lnbmVyQ2VydFBhdGgoKSwgY3BhdGgpOwogICAgIH0KQEAgLTEwNCw2ICsxNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBDb2RlU2lnbmVyLmdldFRpbWVTdGFtcCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRpbWVzdGFtcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUaW1lc3RhbXAoKSB7CiAgICAgICAgIGFzc2VydE51bGwobmV3IENvZGVTaWduZXIoY3BhdGgsIG51bGwpLmdldFRpbWVzdGFtcCgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShuZXcgQ29kZVNpZ25lcihjcGF0aCwgdHMpLmdldFRpbWVzdGFtcCgpLCB0cyk7CkBAIC0xMTIsNiArMTYyLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgQ29kZVNpZ25lci50b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTmVlZCB1c2UgbWV0aG9kIGVxdWFscyBmb3IgcmV0dXJuZWQgc3RyaW5nIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydFRydWUobmV3IENvZGVTaWduZXIoY3BhdGgsIG51bGwpLnRvU3RyaW5nKCkuY29udGFpbnMoIiIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgQ29kZVNpZ25lcihjcGF0aCwgdHMpLnRvU3RyaW5nKCkuY29udGFpbnMoIiIpKTsKQEAgLTEyMCw2ICsxNzksMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBDb2RlU2lnbmVyLmhhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7CiAgICAgICAgIENvZGVTaWduZXIgY3MxID0gbmV3IENvZGVTaWduZXIoY3BhdGgsIHRzKTsKICAgICAgICAgQ29kZVNpZ25lciBjczIgPSBuZXcgQ29kZVNpZ25lcihjcGF0aCwgdHMpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Db2RlU291cmNlMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQ29kZVNvdXJjZTJUZXN0LmphdmEKaW5kZXggNmZlMDFhMC4uZTI3MDYwNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Db2RlU291cmNlMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0NvZGVTb3VyY2UyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNpZ25lcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CkBAIC0yOSw3ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuVGVzdENlcnRVdGlsczsKIAogCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoQ29kZVNvdXJjZS5jbGFzcykKIHB1YmxpYyBjbGFzcyBDb2RlU291cmNlMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCkBAIC0zNyw2ICs0MiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UjQ29kZVNvdXJjZShqYXZhLm5ldC5VUkwsCiAgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggdmFsaWQgVVJMIGFuZCBudWxsIGNlcnRpZmljYXRlIGFycmF5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ29kZVNvdXJjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtVUkwuY2xhc3MsIENlcnRpZmljYXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9uZXRfVVJMJExqYXZhX3NlY3VyaXR5X2NlcnRfQ2VydGlmaWNhdGUoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UoamF2YS5uZXQuVVJMLApAQCAtNDksNiArNjMsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Db2RlU291cmNlI0NvZGVTb3VyY2UoamF2YS5uZXQuVVJMLAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LkNvZGVTaWduZXJbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ29kZVNvdXJjZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtVUkwuY2xhc3MsIENvZGVTaWduZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX25ldF9VUkwkTGphdmFfc2VjdXJpdHlfQ29kZVNpZ25lcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZShqYXZhLm5ldC5VUkwsCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuY2VydC5Db2RlU2lnbmVyIFtdKQpAQCAtODMsNiArMTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDb2RlU291cmNlIG9iamVjdCB3YXMgY3JlYXRlZCB3aXRoIENvZGVTb3VyY2UoVVJMIHVybCwgQ2VydGlmaWNhdGVbXSBjZXJ0cykgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5Db2RlU291cmNlLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtOTYsNiArMTI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUkwgdXJsID0gbmV3IGphdmEubmV0LlVSTCgiZmlsZTovLy90ZXN0Iik7CiAgICAgICAgIENvZGVTb3VyY2UgY3MgPSBuZXcgQ29kZVNvdXJjZSh1cmwsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKQEAgLTEwNiw2ICsxNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Db2RlU291cmNlI2dldENlcnRpZmljYXRlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2FzZSBmb3IgbnVsbCBjZXJ0aWZpY2F0ZXMgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENlcnRpZmljYXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2VydGlmaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENvZGVTb3VyY2UgY3MgPSBuZXcgQ29kZVNvdXJjZShuZXcgamF2YS5uZXQuVVJMKCJmaWxlOi8vL3Rlc3QiKSwKICAgICAgICAgICAgICAgICAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CkBAIC0xMTYsNiArMTY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSNnZXRMb2NhdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2F0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5uZXQuVVJMIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZS5nZXRMb2NhdGlvbigpCiAgICAgICAgIENvZGVTb3VyY2UgY3MgPSBuZXcgQ29kZVNvdXJjZShuZXcgamF2YS5uZXQuVVJMKCJmaWxlOi8vL3Rlc3QiKSwKQEAgLTEyNyw2ICsxODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Db2RlU291cmNlI2ltcGxpZXMoamF2YS5zZWN1cml0eS5Db2RlU291cmNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW1wbGllc0xqYXZhX3NlY3VyaXR5X0NvZGVTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5Db2RlU291cmNlLmltcGxpZXMoamF2YS5zZWN1cml0eS5Db2RlU291cmNlKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Db2RlU291cmNlVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Db2RlU291cmNlVGVzdC5qYXZhCmluZGV4IDAxMGY2ODcuLjU0NTdjNTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvQ29kZVNvdXJjZVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0NvZGVTb3VyY2VUZXN0LmphdmEKQEAgLTIxLDYgKzIxLDEyIEBACiAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKQEAgLTM0LDggKzQwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5UZXN0Q2VydFV0aWxzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoQ29kZVNvdXJjZS5jbGFzcykKIC8qKgogICogVW5pdCB0ZXN0IGZvciBDb2RlU291cmNlLgogICogCkBAIC0xMjQsNiArMTI5LDE1IEBACiAgICAgICogVGVzdHMgaGFzaENvZGUoKS48YnI+CiAgICAgICogamF2YWRvYyBzYXlzIG5vdGhpbmcsIHNvIHRlc3QgRFJMLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7CiAgICAgICAgIC8vIHdoZW4gbm90aGluZyBpcyBzcGVjaWZpZWQsIHRoZW4gaGFzaENvZGUgb2J2aW91c2x5IG11c3QgYmUgMC4gCiAgICAgICAgIGFzc2VydFRydWUobmV3IENvZGVTb3VyY2UobnVsbCwgKENlcnRpZmljYXRlW10pIG51bGwpLmhhc2hDb2RlKCkgPT0gMCk7CkBAIC0xMzgsNiArMTUyLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgQ29kZVNvdXJjZShVUkwsIENlcnRpZmljYXRlW10pLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb2RlU291cmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1VSTC5jbGFzcywgQ2VydGlmaWNhdGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvZGVTb3VyY2VVUkxDZXJ0aWZpY2F0ZUFycmF5KCkgewogICAgICAgICBuZXcgQ29kZVNvdXJjZShudWxsLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CiAgICAgICAgIG5ldyBDb2RlU291cmNlKHVybFNpdGUsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKQEAgLTE0OCw2ICsxNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBDb2RlU291cmNlKFVSTCwgQ29kZVNpZ25lcltdKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtZXRob2Qgd2l0aCBudWxsIHBhcmFtZXRlcnMgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvZGVTb3VyY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VVJMLmNsYXNzLCBDb2RlU2lnbmVyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb2RlU291cmNlVVJMQ29kZVNpZ25lckFycmF5KCkgewogICAgICAgICBpZiAoIWhhc18xNV9mZWF0dXJlcygpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTksNiArMTkxLDE1IEBACiAgICAgLyoqCiAgICAgICogZXF1YWxzKE9iamVjdCkgbXVzdCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBwYXJhbWV0ZXIgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3RfMDAoKSB7CiAgICAgICAgIENvZGVTb3VyY2UgdGhpeiA9IG5ldyBDb2RlU291cmNlKHVybFNpdGUsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKICAgICAgICAgYXNzZXJ0RmFsc2UodGhpei5lcXVhbHMobnVsbCkpOwpAQCAtMTY4LDYgKzIwOSwxNSBAQAogICAgIC8qKgogICAgICAqIGVxdWFscyhPYmplY3QpIG11c3QgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciB0aGUgc2FtZSBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJTYW1lIG9iamVjdHMgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3RfMDEoKSB7CiAgICAgICAgIENvZGVTb3VyY2UgdGhpeiA9IG5ldyBDb2RlU291cmNlKHVybFNpdGUsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0aGl6LmVxdWFscyh0aGl6KSk7CkBAIC0xNzgsNiArMjI4LDE1IEBACiAgICAgICogVGhlIHNpZ25lciBjZXJ0aWZpY2F0ZSBjaGFpbiBtdXN0IGNvbnRhaW4gdGhlIHNhbWUgc2V0IG9mIGNlcnRpZmljYXRlcywgYnV0IAogICAgICAqIHRoZSBvcmRlciBvZiB0aGUgY2VydGlmaWNhdGVzIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdF8wMigpIHsKICAgICAgICAgQ2VydGlmaWNhdGUgY2VydDAgPSBuZXcgVGVzdENlcnRVdGlscy5UZXN0Q2VydGlmaWNhdGUoKTsKICAgICAgICAgQ2VydGlmaWNhdGUgY2VydDEgPSBuZXcgVGVzdENlcnRVdGlscy5UZXN0Q2VydGlmaWNhdGUoKTsKQEAgLTE5Miw2ICsyNTEsMTUgQEAKICAgICAgKiBUZXN0IGZvciBlcXVhbHMoT2JqZWN0KTxicj4KICAgICAgKiBDaGVja3MgdGhhdCBib3RoICdudWxsJyBhbmQgbm90LW51bGwgVVJMcyBhcmUgdGFrZW4gaW50byBhY2NvdW50IC0gcHJvcGVybHkuIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3RfMDQoKSB7CiAgICAgICAgIENvZGVTb3VyY2UgdGhpeiA9IG5ldyBDb2RlU291cmNlKHVybFNpdGUsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKICAgICAgICAgQ29kZVNvdXJjZSB0aGF0ID0gbmV3IENvZGVTb3VyY2UobnVsbCwgKENlcnRpZmljYXRlW10pIG51bGwpOwpAQCAtMjA2LDYgKzI3NCwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIENvZGVTb3VyY2UuZ2V0Q2VydGlmaWNhdGVzKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENlcnRpZmljYXRlc18wMCgpIHsKICAgICAgICAgYXNzZXJ0TnVsbChuZXcgQ29kZVNvdXJjZShudWxsLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCkuZ2V0Q2VydGlmaWNhdGVzKCkpOwogICAgICAgICBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnb3QgPSBuZXcgQ29kZVNvdXJjZShudWxsLCBjaGFpbikKQEAgLTIyMCw2ICsyOTcsMTUgQEAKICAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBnZXRDZXJ0aWZpY2F0ZXMoKSByZXR1cm5zIGNlcnRpZmljYXRlcyBvYnRhaW5lZCBmcm9tIAogICAgICAqIHRoZSBzaWduZXJzLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENlcnRpZmljYXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDZXJ0aWZpY2F0ZXNfMDEoKSB7CiAgICAgICAgIGlmICghaGFzXzE1X2ZlYXR1cmVzKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTMxOCw2ICs0MDQsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBDb2RlU291cmNlLmdldENvZGVTaWduZXJzKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29kZVNpZ25lcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29kZVNpZ25lcnNfMDAoKSB7CiAgICAgICAgIGlmICghaGFzXzE1X2ZlYXR1cmVzKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM0Miw2ICs0MzcsMTggQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0cyBDb2RlU291cmNlLmdldENvZGVTaWduZXJzKCkgZm9yIG51bGwuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29kZVNpZ25lcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29kZXJTaWduZXJzTnVsbCgpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgIGFzc2VydE51bGwobmV3IENvZGVTb3VyY2UobmV3IFVSTCgiaHR0cDovL3VybCIpLCAoQ2VydGlmaWNhdGVbXSludWxsKS5nZXRDb2RlU2lnbmVycygpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KQEAgLTM0OSw2ICs0NTYsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBDb2RlU291cmNlLmdldExvY2F0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9jYXRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYXRpb24oKSB7CiAgICAgICAgIGFzc2VydFRydWUobmV3IENvZGVTb3VyY2UodXJsU2l0ZSwgKENlcnRpZmljYXRlW10pIG51bGwpLmdldExvY2F0aW9uKCkgPT0gdXJsU2l0ZSk7CiAgICAgICAgIGFzc2VydFRydWUobmV3IENvZGVTb3VyY2UodXJsU2l0ZSwgY2hhaW4pLmdldExvY2F0aW9uKCkgPT0gdXJsU2l0ZSk7CkBAIC0zNTksNiArNDc1LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgQ29kZVNvdXJjZS50b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewogICAgICAgICAvLyBKYXZhZG9jIGtlZXBzIHNpbGVuY2UgYWJvdXQgU3RyaW5nJ3MgZm9ybWF0LCAKICAgICAgICAgLy8ganVzdCBtYWtlIHN1cmUgaXQgY2FuIGJlIGludm9rZWQuCkBAIC0zODksNiArNTE0LDE1IEBACiAgICAgLyoqCiAgICAgICogbXVzdCBub3QgaW1wbHkgbnVsbCBDb2RlU291cmNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wMCgpIHsKICAgICAgICAgQ29kZVNvdXJjZSBjczAgPSBuZXcgQ29kZVNvdXJjZShudWxsLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGNzMC5pbXBsaWVzKG51bGwpKTsKQEAgLTM5OCw2ICs1MzIsMTUgQEAKICAgICAgKiBDb2RlU291cmNlIHdpdGggbG9jYXRpb249bnVsbCAmJiBDZXJ0aWZpY2F0ZVtdID09IG51bGwgaW1wbGllcyBhbnkgb3RoZXIKICAgICAgKiBDb2RlU291cmNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2RlU291cmNlIHRoaXpDUyA9IG5ldyBDb2RlU291cmNlKHVybFNpdGUsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKICAgICAgICAgQ29kZVNvdXJjZSB0aGF0Q1MgPSBuZXcgQ29kZVNvdXJjZShudWxsLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CkBAIC00MTAsNiArNTUzLDE1IEBACiAgICAgLyoqCiAgICAgICogSWYgdGhpcyBvYmplY3QncyBsb2NhdGlvbiBlcXVhbHMgY29kZXNvdXJjZSdzIGxvY2F0aW9uLCB0aGVuIHJldHVybiB0cnVlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Q29kZVNvdXJjZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcGxpZXNfMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ29kZVNvdXJjZSB0aGl6Q1MgPSBuZXcgQ29kZVNvdXJjZSh1cmxTaXRlLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CiAgICAgICAgIENvZGVTb3VyY2UgdGhhdENTID0gbmV3IENvZGVTb3VyY2UodGhpekNTLmdldExvY2F0aW9uKCksCkBAIC00MzQsNyArNTg2LDE1IEBACiAgICAgIGFzc2VydEZhbHNlKHRoYXRDUy5pbXBsaWVzKHRoaXpDUykpOwogICAgICB9CiAgICAgICovCi0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWVzXzAzX3RtcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2RlU291cmNlIHRoaXpDUyA9IG5ldyBDb2RlU291cmNlKHVybERpciwgKENlcnRpZmljYXRlW10pIG51bGwpOwogICAgICAgICBDb2RlU291cmNlIHRoYXRDUyA9IG5ldyBDb2RlU291cmNlKHVybERpcl9GaWxlUHJvdG9jb2wsCkBAIC00NDgsNiArNjA4LDE1IEBACiAgICAgICogU29ja2V0UGVybWlzc2lvbiBjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgb2JqZWN0J3MgaG9zdCBtdXN0IGltcGx5IHRoZQogICAgICAqIFNvY2tldFBlcm1pc3Npb24gY29uc3RydWN0ZWQgd2l0aCBjb2Rlc291cmNlJ3MgaG9zdC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWVzXzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENvZGVTb3VyY2UgdGhpekNTID0gbmV3IENvZGVTb3VyY2UodXJsRGlyLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CiAgICAgICAgIENvZGVTb3VyY2UgdGhhdENTID0gbmV3IENvZGVTb3VyY2UodXJsRGlySVAsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKQEAgLTQ3Nyw2ICs2NDYsMTUgQEAKICAgICAgKiBJZiB0aGlzIG9iamVjdCdzIHBvcnQgKGdldExvY2F0aW9uKCkuZ2V0UG9ydCgpKSBpcyBub3QgZXF1YWwgdG8gLTEgKHRoYXQKICAgICAgKiBpcywgaWYgYSBwb3J0IGlzIHNwZWNpZmllZCksIGl0IG11c3QgZXF1YWwgY29kZXNvdXJjZSdzIHBvcnQuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wNSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2RlU291cmNlIHRoaXpDUyA9IG5ldyBDb2RlU291cmNlKHVybERpcl9wb3J0ODAsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKICAgICAgICAgQ29kZVNvdXJjZSB0aGF0Q1MgPSBuZXcgQ29kZVNvdXJjZSh1cmxEaXIsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKQEAgLTUwMiw2ICs2ODAsMTUgQEAKICAgICAgKiBJZiB0aGlzIG9iamVjdCdzIGZpbGUgKGdldExvY2F0aW9uKCkuZ2V0RmlsZSgpKSBkb2Vzbid0IGVxdWFsCiAgICAgICogY29kZXNvdXJjZSdzIGZpbGUsIHRoZW4gdGhlIGZvbGxvd2luZyBjaGVja3MgYXJlIG1hZGU6IC4uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Q29kZVNvdXJjZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcGxpZXNfMDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ29kZVNvdXJjZSB0aGl6Q1MgPSBuZXcgQ29kZVNvdXJjZSh1cmxGaWxlLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CiAgICAgICAgIENvZGVTb3VyY2UgdGhhdENTID0gbmV3IENvZGVTb3VyY2UodXJsRmlsZSwgKENlcnRpZmljYXRlW10pIG51bGwpOwpAQCAtNTEyLDYgKzY5OSwxNSBAQAogICAgICAqIC4uLiBJZiB0aGlzIG9iamVjdCdzIGZpbGUgZW5kcyB3aXRoICIvLSIsIHRoZW4gY29kZXNvdXJjZSdzIGZpbGUgbXVzdAogICAgICAqIHN0YXJ0IHdpdGggdGhpcyBvYmplY3QncyBmaWxlIChleGNsdXNpdmUgdGhlIHRyYWlsaW5nICItIikuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wNygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2RlU291cmNlIHRoaXogPSBuZXcgQ29kZVNvdXJjZSh1cmxGaWxlRGlyTWludXMsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKICAgICAgICAgQ29kZVNvdXJjZSB0aGF0ID0gbmV3IENvZGVTb3VyY2UodXJsRmlsZSwgKENlcnRpZmljYXRlW10pIG51bGwpOwpAQCAtNTI5LDYgKzcyNSwxNSBAQAogICAgICAqIHN0YXJ0IHdpdGggdGhpcyBvYmplY3QncyBmaWxlIGFuZCBtdXN0IG5vdCBoYXZlIGFueSBmdXJ0aGVyICIvIgogICAgICAqIHNlcGFyYXRvcnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wOCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2RlU291cmNlIHRoaXogPSBuZXcgQ29kZVNvdXJjZSh1cmxGaWxlRGlyU3RhciwgKENlcnRpZmljYXRlW10pIG51bGwpOwogICAgICAgICBDb2RlU291cmNlIHRoYXQgPSBuZXcgQ29kZVNvdXJjZSh1cmxGaWxlLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CkBAIC01NDgsNiArNzUzLDE1IEBACiAgICAgICogLi4uIElmIHRoaXMgb2JqZWN0J3MgZmlsZSBkb2Vzbid0IGVuZCB3aXRoIGEgIi8iLCB0aGVuIGNvZGVzb3VyY2UncyBmaWxlCiAgICAgICogbXVzdCBtYXRjaCB0aGlzIG9iamVjdCdzIGZpbGUgd2l0aCBhICcvJyBhcHBlbmRlZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWVzXzA5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENvZGVTb3VyY2UgdGhpekNTID0gbmV3IENvZGVTb3VyY2UodXJsRGlyLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CiAgICAgICAgIENvZGVTb3VyY2UgdGhhdENTID0gbmV3IENvZGVTb3VyY2UodXJsRGlyV2l0aFNsYXNoLApAQCAtNTYwLDYgKzc3NCwxNSBAQAogICAgICAqIElmIHRoaXMgb2JqZWN0J3MgcmVmZXJlbmNlIChnZXRMb2NhdGlvbigpLmdldFJlZigpKSBpcyBub3QgbnVsbCwgaXQgbXVzdAogICAgICAqIGVxdWFsIGNvZGVzb3VyY2UncyByZWZlcmVuY2UuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wQSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2RlU291cmNlIHRoaXpDUyA9IG5ldyBDb2RlU291cmNlKHVybFJlZjEsIChDZXJ0aWZpY2F0ZVtdKSBudWxsKTsKICAgICAgICAgQ29kZVNvdXJjZSB0aGF0Q1MgPSBuZXcgQ29kZVNvdXJjZSh1cmxSZWYxLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CkBAIC01NzUsNiArNzk4LDE1IEBACiAgICAgICogSWYgdGhpcyBjZXJ0aWZpY2F0ZXMgYXJlIG5vdCBudWxsLCB0aGVuIGFsbCBvZiB0aGlzIGNlcnRpZmljYXRlcyBzaG91bGQKICAgICAgKiBiZSBwcmVzZW50ZWQgaW4gY2VydGlmaWNhdGVzIG9mIHRoYXQgY29kZXNvdXJjZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWVzXzBCKCkgewogCiAgICAgICAgIENlcnRpZmljYXRlIGMwID0gbmV3IFRlc3RDZXJ0VXRpbHMuVGVzdENlcnRpZmljYXRlKCIwMCIpOwpAQCAtNjAxLDYgKzgzMywxNSBAQAogICAgICAqIFRoZXNlIHNwZWNpYWwgVVJMcyBoYXZlIGEgc3BlY2lhbCBwcm9jZXNzaW5nIGluIGltcGxpZXMoKSwgCiAgICAgICogc28gdGhleSBuZWVkIHRvIGJlIGNvdmVyZWQgYW5kIHBlcmZvcm1hbmNlIG5lZWQgdG8gYmUgY2hlY2tlZCAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWVzXzBDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSTCB1cmwwID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9zb21lRGlyIik7CiAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9zb21lT3RoZXJEaXIiKTsKQEAgLTYxNiw2ICs4NTcsMTUgQEAKICAgICAgKiBUaGVzZSBzcGVjaWFsIFVSTHMgaGF2ZSBhIHNwZWNpYWwgcHJvY2Vzc2luZyBpbiBpbXBsaWVzKCksIAogICAgICAqIHNvIHRoZXkgbmVlZCB0byBiZSBjb3ZlcmVkIGFuZCBwZXJmb3JtYW5jZSBuZWVkIHRvIGJlIGNoZWNrZWQgCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wRCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUkwgdXJsMCA9IG5ldyBVUkwoImZpbGU6Ly8vIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikKICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInNvbWVEaXIiKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvRGlnZXN0RXhjZXB0aW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvRGlnZXN0RXhjZXB0aW9uMlRlc3QuamF2YQppbmRleCBjZmFkYWVkLi5iZjg3OTAxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0RpZ2VzdEV4Y2VwdGlvbjJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9EaWdlc3RFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0RXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKERpZ2VzdEV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaWdlc3RFeGNlcHRpb24yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5EaWdlc3RFeGNlcHRpb24jRGlnZXN0RXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGlnZXN0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuRGlnZXN0RXhjZXB0aW9uKCkKICAgICAgICAgRGlnZXN0RXhjZXB0aW9uIGRlID0gbmV3IERpZ2VzdEV4Y2VwdGlvbigpOwpAQCAtMzQsNiArNDksMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5EaWdlc3RFeGNlcHRpb24jRGlnZXN0RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRGlmZmVyZW50IHZhcmlhbnRzIG9mIHN0cmluZyBwYXJhbWV0ZXIgKGVtcHR5LCBudWxsLCBldGMuKSAiICsKKyAgICAgICAgICAgICAgICAgICJ3ZXJlbid0IGNoZWNrZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEaWdlc3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LkRpZ2VzdEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBEaWdlc3RFeGNlcHRpb24gZGUgPSBuZXcgRGlnZXN0RXhjZXB0aW9uKCJUZXN0IG1lc3NhZ2UiKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvRGlnZXN0RXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9EaWdlc3RFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggNWNlZmJlMC4uMjZiOGJjMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9EaWdlc3RFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9EaWdlc3RFeGNlcHRpb25UZXN0LmphdmEKQEAgLTIxLDExICsyMSwxNiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0RXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoRGlnZXN0RXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCiAgKiAKQEAgLTU1LDYgKzYwLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKICAgICAgKiBjb25zdHJ1Y3RzIERpZ2VzdEV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRpZ2VzdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RFeGNlcHRpb24wMSgpIHsKICAgICAgICAgRGlnZXN0RXhjZXB0aW9uIHRFID0gbmV3IERpZ2VzdEV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtNjYsNiArODAsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RzIERpZ2VzdEV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4gUGFyYW1ldGVyCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjYXNlIHdpdGggZGlmZmVyZW50cyBwYXJhbWV0ZXJzIChwYXJhbWV0ZXIgaXMgbm90IG51bGwpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGlnZXN0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpZ2VzdEV4Y2VwdGlvbjAyKCkgewogICAgICAgICBEaWdlc3RFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtODAsNiArMTAzLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKICAgICAgKiBjb25zdHJ1Y3RzIERpZ2VzdEV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNhc2Ugd2l0aCBudWxsIHBhcmFtZXRlciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRpZ2VzdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RFeGNlcHRpb24wMygpIHsKICAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CiAgICAgICAgIERpZ2VzdEV4Y2VwdGlvbiB0RSA9IG5ldyBEaWdlc3RFeGNlcHRpb24obXNnKTsKQEAgLTkxLDYgKzEyMywxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPkRpZ2VzdEV4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CiAgICAgICogY29uc3RydWN0cyBEaWdlc3RFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNhc2Ugd2l0aCBudWxsIHBhcmFtZXRlciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRpZ2VzdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RFeGNlcHRpb24wNCgpIHsKICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKICAgICAgICAgRGlnZXN0RXhjZXB0aW9uIHRFID0gbmV3IERpZ2VzdEV4Y2VwdGlvbihjYXVzZSk7CkBAIC0xMDIsNiArMTQzLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKICAgICAgKiBjb25zdHJ1Y3RzIERpZ2VzdEV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNhc2Ugd2l0aCBub3QgbnVsbCBwYXJhbWV0ZXIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEaWdlc3RFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0RXhjZXB0aW9uMDUoKSB7CiAgICAgICAgIERpZ2VzdEV4Y2VwdGlvbiB0RSA9IG5ldyBEaWdlc3RFeGNlcHRpb24odENhdXNlKTsKICAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CkBAIC0xMjAsNiArMTcwLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIERpZ2VzdEV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGlnZXN0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0RXhjZXB0aW9uMDYoKSB7CiAgICAgICAgIERpZ2VzdEV4Y2VwdGlvbiB0RSA9IG5ldyBEaWdlc3RFeGNlcHRpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTEzMSw2ICsxOTAsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgRGlnZXN0RXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwKICAgICAgKiA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGlnZXN0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0RXhjZXB0aW9uMDcoKSB7CiAgICAgICAgIERpZ2VzdEV4Y2VwdGlvbiB0RTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CkBAIC0xNDYsNiArMjE0LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIERpZ2VzdEV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QKICAgICAgKiBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRpZ2VzdEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERpZ2VzdEV4Y2VwdGlvbjA4KCkgewogICAgICAgICBEaWdlc3RFeGNlcHRpb24gdEUgPSBuZXcgRGlnZXN0RXhjZXB0aW9uKG51bGwsIHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTY0LDYgKzI0MSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBEaWdlc3RFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90CiAgICAgICogbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGlnZXN0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0RXhjZXB0aW9uMDkoKSB7CiAgICAgICAgIERpZ2VzdEV4Y2VwdGlvbiB0RTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0RpZ2VzdElucHV0U3RyZWFtMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvRGlnZXN0SW5wdXRTdHJlYW0yVGVzdC5qYXZhCmluZGV4IDVmN2EzYTguLjhlZTg3YTggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvRGlnZXN0SW5wdXRTdHJlYW0yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvRGlnZXN0SW5wdXRTdHJlYW0yVGVzdC5qYXZhCkBAIC0xNywxMiArMTcsMTggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhEaWdlc3RJbnB1dFN0cmVhbS5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaWdlc3RJbnB1dFN0cmVhbTJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluU3RyZWFtOwpAQCAtMzUsNiArNDEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbSNEaWdlc3RJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtLAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY2FzZSB3aXRoIG5vbiBudWxsIHBhcmFtZXRlcnMgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRpZ2VzdElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIE1lc3NhZ2VEaWdlc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbUxqYXZhX3NlY3VyaXR5X01lc3NhZ2VEaWdlc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0sCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCkKQEAgLTQ1LDYgKzYwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW0jZ2V0TWVzc2FnZURpZ2VzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2VEaWdlc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEaWdlc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbS5nZXRNZXNzYWdlRGlnZXN0KCkKQEAgLTU2LDYgKzgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW0jb24oYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vblooKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbS5vbihib29sZWFuKQogICAgICAgICBNZXNzYWdlRGlnZXN0IG9yaWdpbmFsRGlnZXN0ID0gKE1lc3NhZ2VEaWdlc3QpIChkaWdlc3QuY2xvbmUoKSk7CkBAIC04OCw2ICsxMjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbSNyZWFkKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBqdXN0IG9uZSBwb3NpdGl2ZSBjYXNlIGZvciBtZXRob2QgcmVhZCgpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbS5yZWFkKCkKICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gZGlzID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKGluU3RyZWFtLCBkaWdlc3QpOwpAQCAtMTAzLDYgKzE0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBqdXN0IG9uZSBwb3NpdGl2ZSBjYXNlIGZvciBtZXRob2QgcmVhZChieXRlW10sIGludCwgaW50KSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZWFkJEJJSSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbS5yZWFkKGJ5dGUgW10sCiAgICAgICAgIC8vIGludCwgaW50KQpAQCAtMTMyLDYgKzE4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtI3NldE1lc3NhZ2VEaWdlc3QoamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNZXNzYWdlRGlnZXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge01lc3NhZ2VEaWdlc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVzc2FnZURpZ2VzdExqYXZhX3NlY3VyaXR5X01lc3NhZ2VEaWdlc3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW0uc2V0TWVzc2FnZURpZ2VzdChqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0RpZ2VzdElucHV0U3RyZWFtVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9EaWdlc3RJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCBhZjkyZTBiLi4wYzY1MWFjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0RpZ2VzdElucHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvRGlnZXN0SW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTMzLDcgKzM4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5NREdvbGRlbkRhdGE7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoRGlnZXN0SW5wdXRTdHJlYW0uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgY2xhc3MgPGNvZGU+RGlnZXN0SW5wdXRTdHJlYW08L2NvZGU+CiAgKiAKQEAgLTg1LDYgKzkwLDE1IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGJvdGggbm9uIG51bGwgcGFyYW1ldGVycyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRpZ2VzdElucHV0U3RyZWFtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzLCBNZXNzYWdlRGlnZXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RGlnZXN0SW5wdXRTdHJlYW0wMSgpICB7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhbGdvcml0aG1OYW1lLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTA2LDYgKzEyMCwxNiBAQAogICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyBuZXcgPGNvZGU+RGlnZXN0SW5wdXRTdHJlYW08L2NvZGU+IGluc3RhbmNlCiAgICAgICogdXNpbmcgdmFsaWQgcGFyYW1ldGVycyAoYm90aCA8Y29kZT5udWxsPC9jb2RlPikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBib3RoIG51bGwgcGFyYW1ldGVycy4gIiArCisgICAgICAgICAgICAgICAgIk5lZWQgY2FzZXMgd2hlcmUganVzdCBvbmUgcGFyYW1ldGVyIG51bGwiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEaWdlc3RJbnB1dFN0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtJbnB1dFN0cmVhbS5jbGFzcywgTWVzc2FnZURpZ2VzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdERpZ2VzdElucHV0U3RyZWFtMDIoKSB7CiAgICAgICAgIElucHV0U3RyZWFtIGRpcyA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShkaXMgaW5zdGFuY2VvZiBEaWdlc3RJbnB1dFN0cmVhbSk7CkBAIC0xMTcsNiArMTQxLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBieXRlIHJlYWQ8YnI+CiAgICAgICogQXNzZXJ0aW9uOiB1cGRhdGVzIGFzc29jaWF0ZWQgZGlnZXN0PGJyPgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVhZDAxKCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgaWk9MDsgaWk8YWxnb3JpdGhtTmFtZS5sZW5ndGg7IGlpKyspIHsKQEAgLTE1MCw2ICsxODMsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IG11c3Qgbm90IHVwZGF0ZSBkaWdlc3QgaWYgRU9TIGhhZCBiZWVuCiAgICAgICogcmVhY2hlZCBidXQgbm90IHJlYWQgYmVmb3JlIG1ldGhvZCBjYWxsPGJyPgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVhZDAyKCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgaWk9MDsgaWk8YWxnb3JpdGhtTmFtZS5sZW5ndGg7IGlpKyspIHsKQEAgLTE4NSw2ICsyMjcsMTUgQEAKICAgICAgKiAoaWYgPGNvZGU+dHJ1ZTwvY29kZT4gcGFzc2VkIGFzIGEgcGFyYW1ldGVyKSBvciBvZmYgKGlmIDxjb2RlPmZhbHNlPC9jb2RlPgogICAgICAqICBwYXNzZWQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkMDMoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCBpaT0wOyBpaTxhbGdvcml0aG1OYW1lLmxlbmd0aDsgaWkrKykgewpAQCAtMjE4LDYgKzI2OSwxNSBAQAogICAgICAqIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBub3Qgc2V0LiA8Y29kZT5yZWFkKCk8L2NvZGU+IG11c3QKICAgICAgKiBub3Qgd29yawogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGlzIG5vdCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJlYWQwNCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoaW50IGlpPTA7IGlpPGFsZ29yaXRobU5hbWUubGVuZ3RoOyBpaSsrKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMjQ5LDYgKzMwOSwxNSBAQAogICAgICAqIDxjb2RlPnJlYWQoKTwvY29kZT4gbXVzdCBub3Qgd29yayB3aGVuIGRpZ2VzdAogICAgICAqIGZ1bmN0aW9uYWxpdHkgaXMgb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBpcyBub3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkMDUoKSB7CiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG15TWVzc2FnZSk7CiAgICAgICAgIERpZ2VzdElucHV0U3RyZWFtIGRpcyA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShpcywgbnVsbCk7CkBAIC0yNzIsNiArMzQxLDE1IEBACiAgICAgICogPGNvZGU+cmVhZCgpPC9jb2RlPiBtdXN0IHdvcmsgd2hlbiBkaWdlc3QKICAgICAgKiBmdW5jdGlvbmFsaXR5IGlzIG9mZgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVhZDA2KCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXlNZXNzYWdlKTsKQEAgLTI5NCw2ICszNzIsMTYgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHVwZGF0ZXMgYXNzb2NpYXRlZCBkaWdlc3Q8YnI+CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXMgbm90IHRlc3RlZCIgKworICAgICAgICAgICAgICAgICAgIkNhc2Ugd2hlbiBsZW4+b2ZmIGlzbid0IHRlc3RlZCAoYW5kIG90aGVyIGJvdW5kYXJ5IGNhc2VzKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJlYWRieXRlQXJyYXlpbnRpbnQwMSgpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7ICAgICAgICAKICAgICAgICAgZm9yIChpbnQgaWk9MDsgaWk8YWxnb3JpdGhtTmFtZS5sZW5ndGg7IGlpKyspIHsKQEAgLTMyOCw2ICs0MTYsMTYgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHVwZGF0ZXMgYXNzb2NpYXRlZCBkaWdlc3Q8YnI+CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXMgbm90IHRlc3RlZCIgKworICAgICAgICAgICAgICAgICJDYXNlIHdoZW4gbGVuPm9mZiBpc24ndCB0ZXN0ZWQgKGFuZCBvdGhlciBib3VuZGFyeSBjYXNlcykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkYnl0ZUFycmF5aW50aW50MDIoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBjaGVjayBwcmVjb25kaXRpb24KQEAgLTM2OCw2ICs0NjYsMTYgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHVwZGF0ZXMgYXNzb2NpYXRlZCBkaWdlc3Q8YnI+CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXMgbm90IHRlc3RlZCIgKworICAgICAgICAgICAgICAgICJDYXNlIHdoZW4gbGVuPm9mZiBpc24ndCB0ZXN0ZWQgKGFuZCBvdGhlciBib3VuZGFyeSBjYXNlcykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkYnl0ZUFycmF5aW50aW50MDMoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBjaGVjayBwcmVjb25kaXRpb24KQEAgLTQxNSw2ICs1MjMsMTYgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHVwZGF0ZXMgYXNzb2NpYXRlZCBkaWdlc3Q8YnI+CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXMgbm90IHRlc3RlZCIgKworICAgICAgICAgICAgICAgICJDYXNlIHdoZW4gbGVuPm9mZiBpc24ndCB0ZXN0ZWQgKGFuZCBvdGhlciBib3VuZGFyeSBjYXNlcykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkYnl0ZUFycmF5aW50aW50MDQoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geyAgICAgICAgCiAgICAgICAgIGZvciAoaW50IGlpPTA7IGlpPGFsZ29yaXRobU5hbWUubGVuZ3RoOyBpaSsrKSB7CkBAIC00NTEsNiArNTY5LDE2IEBACiAgICAgICogQXNzZXJ0aW9uOiBkb2VzIG5vdCB1cGRhdGUgYXNzb2NpYXRlZCBkaWdlc3QgaWYKICAgICAgKiBkaWdlc3QgZnVuY3Rpb25hbGl0eSBpcyBvZmY8YnI+CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXMgbm90IHRlc3RlZCIgKworICAgICAgICAgICAgICAgICJDYXNlIHdoZW4gbGVuPm9mZiBpc24ndCB0ZXN0ZWQgKGFuZCBvdGhlciBib3VuZGFyeSBjYXNlcykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkYnl0ZUFycmF5aW50aW50MDUoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBjaGVjayBwcmVjb25kaXRpb24KQEAgLTQ4NSw2ICs2MTMsMTUgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgYXNzb2NpYXRlZCBtZXNzYWdlIGRpZ2VzdDxicj4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWVzc2FnZURpZ2VzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRNZXNzYWdlRGlnZXN0KCkgewogICAgICAgICBmb3IgKGludCBpaT0wOyBpaTxhbGdvcml0aG1OYW1lLmxlbmd0aDsgaWkrKykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTUwNiw2ICs2NDMsMTUgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHNldCBhc3NvY2lhdGVkIG1lc3NhZ2UgZGlnZXN0PGJyPgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk1ldGhvZCBzZXRNZXNzYWdlRGlnZXN0IGlzIG5vdCB0ZXN0ZWQgd2l0aCBudWxsIHBhcmFtZXRlciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1lc3NhZ2VEaWdlc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TWVzc2FnZURpZ2VzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldE1lc3NhZ2VEaWdlc3QoKSB7CiAgICAgICAgIGZvciAoaW50IGlpPTA7IGlpPGFsZ29yaXRobU5hbWUubGVuZ3RoOyBpaSsrKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtNTI2LDYgKzY3MiwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPm9uKCk8L2NvZGU+IG1ldGhvZDxicj4KICAgICAgKiBBc3NlcnRpb246IHR1cm5zIGRpZ2VzdCBmdW5jdGlvbmFsaXR5IG9uIG9yIG9mZgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0T24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCBpaT0wOyBpaTxhbGdvcml0aG1OYW1lLmxlbmd0aDsgaWkrKykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTU2NSw2ICs3MjAsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2Q8YnI+CiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIGZvciAoaW50IGlpPTA7IGlpPGFsZ29yaXRobU5hbWUubGVuZ3RoOyBpaSsrKSB7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9EaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0RpZ2VzdE91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCBiZmY5MWE5Li5iMzdlMWFlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0RpZ2VzdE91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0RpZ2VzdE91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMjEsNiArMjEsMTIgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtMzMsOCArMzksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0Lk15TWVzc2FnZURpZ2VzdDE7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhEaWdlc3RPdXRwdXRTdHJlYW0uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgY2xhc3MgPGNvZGU+RGlnZXN0SW5wdXRTdHJlYW08L2NvZGU+CiAgKiAKQEAgLTgyLDYgKzg3LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuRGlnZXN0T3V0cHV0U3RyZWFtI0RpZ2VzdE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSwKICAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGJvdGggbnVsbCBhbmQgbm9uIG51bGwgcGFyYW1ldGVycy4gIiArCisgICAgICAgICAgICAgICAgIk5lZWQgY2FzZXMgd2hlcmUganVzdCBvbmUgcGFyYW1ldGVyIG51bGwiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEaWdlc3RPdXRwdXRTdHJlYW0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T3V0cHV0U3RyZWFtLmNsYXNzLCBNZXNzYWdlRGlnZXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0N0b3JMamF2YV9pb19PdXRwdXRTdHJlYW1MamF2YV9zZWN1cml0eV9NZXNzYWdlRGlnZXN0KCkgewogCiAgICAgICAgIC8vIG5vbi1udWxsIHBhcmFtZXRlcnMKQEAgLTEwMSw2ICsxMTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5EaWdlc3RPdXRwdXRTdHJlYW0jZ2V0TWVzc2FnZURpZ2VzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2VEaWdlc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEaWdlc3QoKSB7CiAKICAgICAgICAgTWVzc2FnZURpZ2VzdCBkaWdlc3QgPSBuZXcgTXlNZXNzYWdlRGlnZXN0MSgpOwpAQCAtMTE5LDYgKzE0MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkRpZ2VzdE91dHB1dFN0cmVhbSNzZXRNZXNzYWdlRGlnZXN0KE1lc3NhZ2VEaWdlc3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1lc3NhZ2VEaWdlc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TWVzc2FnZURpZ2VzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNZXNzYWdlRGlnZXN0TGphdmFfc2VjdXJpdHlfTWVzc2FnZURpZ2VzdCgpIHsKIAogICAgICAgICBNZXNzYWdlRGlnZXN0IGRpZ2VzdCA9IG5ldyBNeU1lc3NhZ2VEaWdlc3QxKCk7CkBAIC0xNDMsNiArMTc2LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiB3cml0ZXMgdGhlIGJ5dGUgdG8gdGhlIG91dHB1dCBzdHJlYW08YnI+CiAgICAgICogQXNzZXJ0aW9uOiB1cGRhdGVzIGFzc29jaWF0ZWQgZGlnZXN0PGJyPgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFdyaXRlaW50MDEoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCBrPTA7IGs8YWxnb3JpdGhtTmFtZS5sZW5ndGg7IGsrKykgewpAQCAtMTc2LDYgKzIxOCwxNSBAQAogICAgICAqIGlmIDxjb2RlPnRydWU8L2NvZGU+IHBhc3NlZCBhcyBhIHBhcmFtZXRlciBvciBvZmYgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+CiAgICAgICogcGFzc2VkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0V3JpdGVpbnQwMigpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoaW50IGs9MDsgazxhbGdvcml0aG1OYW1lLmxlbmd0aDsgaysrKSB7CkBAIC0yMTIsNiArMjYzLDE1IEBACiAgICAgICogPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiBub3Qgc2V0LiA8Y29kZT53cml0ZShpbnQpPC9jb2RlPiBtdXN0CiAgICAgICogbm90IHdvcmsKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBpc24ndCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RXcml0ZWludDAzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgaz0wOyBrPGFsZ29yaXRobU5hbWUubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0yNDEsNiArMzAxLDE1IEBACiAgICAgICogPGNvZGU+d3JpdGUoaW50KTwvY29kZT4gbXVzdCBub3Qgd29yayB3aGVuIGRpZ2VzdAogICAgICAqIGZ1bmN0aW9uYWxpdHkgaXMgb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBpc24ndCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RXcml0ZWludDA0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShNWV9NRVNTQUdFX0xFTik7CiAgICAgICAgIERpZ2VzdE91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGlnZXN0T3V0cHV0U3RyZWFtKG9zLCBudWxsKTsKQEAgLTI2NSw2ICszMzQsMTUgQEAKICAgICAgKiA8Y29kZT53cml0ZShpbnQpPC9jb2RlPiBtdXN0IHdvcmsgd2hlbiBkaWdlc3QKICAgICAgKiBmdW5jdGlvbmFsaXR5IGlzIG9mZgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFdyaXRlaW50MDUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShNWV9NRVNTQUdFX0xFTik7CiAgICAgICAgIERpZ2VzdE91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGlnZXN0T3V0cHV0U3RyZWFtKGJvcywgbnVsbCk7CkBAIC0yODYsNiArMzY0LDE1IEBACiAgICAgICogCiAgICAgICogQXNzZXJ0aW9uOiB1cGRhdGVzIGFzc29jaWF0ZWQgZGlnZXN0PGJyPgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGlzbid0IHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RXcml0ZWJ5dGVBcnJheWludGludDAxKCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgaz0wOyBrPGFsZ29yaXRobU5hbWUubGVuZ3RoOyBrKyspIHsKQEAgLTMxNyw2ICs0MDQsMTUgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHVwZGF0ZXMgYXNzb2NpYXRlZCBkaWdlc3Q8YnI+CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXNuJ3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFdyaXRlYnl0ZUFycmF5aW50aW50MDIoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBjaGVjayBwcmVjb25kaXRpb24KQEAgLTM1Myw2ICs0NDksMTUgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHVwZGF0ZXMgYXNzb2NpYXRlZCBkaWdlc3Q8YnI+CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXNuJ3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFdyaXRlYnl0ZUFycmF5aW50aW50MDMoKQogICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgSU9FeGNlcHRpb24gewpAQCAtMzk0LDYgKzQ5OSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogZG9lcyBub3QgdXBkYXRlIGFzc29jaWF0ZWQgZGlnZXN0IGlmIGRpZ2VzdAogICAgICAqIGZ1bmN0aW9uYWxpdHkgaXMgb2ZmPGJyPgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklPRXhjZXB0aW9uIGlzbid0IHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyaXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RXcml0ZWJ5dGVBcnJheWludGludDA0KCkKICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKQEAgLTQzMCw2ICs1NDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5EaWdlc3RPdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBpc24ndCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyaXRlTEIkTElMSSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9ybSBIQVJNT05ZLTEwOTEuCkBAIC00NjcsNiArNTkwLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+b24oKTwvY29kZT4gbWV0aG9kPGJyPgogICAgICAqIEFzc2VydGlvbjogdHVybnMgZGlnZXN0IGZ1bmN0aW9uYWxpdHkgb24gb3Igb2ZmCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RPbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoaW50IGs9MDsgazxhbGdvcml0aG1OYW1lLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtNTA2LDYgKzYzOCwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZDxicj4KICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUb1N0cmluZygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCBrPTA7IGs8YWxnb3JpdGhtTmFtZS5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTUyNSw2ICs2NjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5EaWdlc3RPdXRwdXRTdHJlYW0jb24oYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vblooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuc2VjdXJpdHkuRGlnZXN0T3V0cHV0U3RyZWFtLm9uKGJvb2xlYW4pCiAgICAgICAgIHRyeSB7CkBAIC01NTYsNiArNzA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuRGlnZXN0T3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gaXNuJ3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cml0ZSRCSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5zZWN1cml0eS5EaWdlc3RPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZSBbXSwKICAgICAgICAgLy8gaW50LCBpbnQpCkBAIC01NzQsNiArNzMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuRGlnZXN0T3V0cHV0U3RyZWFtI3dyaXRlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JpdGVJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuc2VjdXJpdHkuRGlnZXN0T3V0cHV0U3RyZWFtLndyaXRlKGludCkKICAgICAgICAgICAgIERpZ2VzdE91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGlnZXN0T3V0cHV0U3RyZWFtKApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24yVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24yVGVzdC5qYXZhCmluZGV4IDBhZjI3ZTkuLmI1OTU1M2EgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0dlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjJUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiNHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oKQogICAgICAgICBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSA9IG5ldyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oKTsKQEAgLTM1LDYgKzUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uI0dlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG5vbiBudWxsIHBhcmFtZXRlciBvbmx5IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggMDEzODhlNC4uZGExOTg5YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb25UZXN0LmphdmEKQEAgLTIxLDExICsyMSwxNiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+R2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCiAgKiBtZXRob2RzLgpAQCAtNTYsNiArNjEsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgogICAgICAqIGNvbnN0cnVjdHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjAxKCkgewogICAgICAgICBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gdEUgPSBuZXcgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CkBAIC02Nyw2ICs4MSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuCiAgICAgICogUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjAyKCkgewogICAgICAgICBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtODIsNiArMTA1LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMKICAgICAgKiBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjAzKCkgewogICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKICAgICAgICAgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHRFID0gbmV3IEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbihtc2cpOwpAQCAtOTQsNiArMTI2LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPgogICAgICAqIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uMDQoKSB7CiAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CiAgICAgICAgIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB0RSA9IG5ldyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24oY2F1c2UpOwpAQCAtMTA2LDYgKzE0NywxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4KICAgICAgKiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24wNSgpIHsKICAgICAgICAgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHRFID0gbmV3IEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbih0Q2F1c2UpOwogICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKQEAgLTEyNCw2ICsxNzQsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24wNigpIHsKICAgICAgICAgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHRFID0gbmV3IEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtMTM1LDYgKzE5NCwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gd2hlbgogICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24wNygpIHsKICAgICAgICAgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKQEAgLTE1MCw2ICsyMTgsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uMDgoKSB7CiAgICAgICAgIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB0RSA9IG5ldyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24obnVsbCwgdENhdXNlKTsKICAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CkBAIC0xNjgsNiArMjQ1LDE1IEBACiAgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB3aGVuCiAgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdCBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24wOSgpIHsKICAgICAgICAgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvR3VhcmRlZE9iamVjdFRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvR3VhcmRlZE9iamVjdFRlc3QuamF2YQppbmRleCAwMDcwNTE5Li5mZTZmMTY1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0d1YXJkZWRPYmplY3RUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9HdWFyZGVkT2JqZWN0VGVzdC5qYXZhCkBAIC0yMiwxMSArMjIsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuR3VhcmQ7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5HdWFyZGVkT2JqZWN0OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEd1YXJkZWRPYmplY3QuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5HdWFyZGVkT2JqZWN0PC9jb2RlPgogICogCkBAIC0zOSw2ICs0NCwxNSBAQAogICAgIH0KIAogICAgIC8qKiBOdWxsIGd1YXJkIGltcG9zZXMgbm8gcmVzdHJpY3Rpb24uICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSGF2ZW4ndCBzZXBhcmF0ZSBjYXNlIGZvciBnZXRPYmplY3QoKSBtZXRob2QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJHdWFyZGVkT2JqZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzcywgR3VhcmQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb0d1YXJkKCkgewogICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKICAgICAgICAgR3VhcmRlZE9iamVjdCBnbyA9IG5ldyBHdWFyZGVkT2JqZWN0KG9iaiwgbnVsbCk7CkBAIC01MCw2ICs2NCwxNSBAQAogICAgIH0KIAogICAgIC8qKiBUZXN0IHJlYWwgZ3VhcmQgY2FuIGJvdGggYWxsb3cgYW5kIGRlbnkgYWNjZXNzLiAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkhhdmVuJ3Qgc2VwYXJhdGUgY2FzZSBmb3IgZ2V0T2JqZWN0KCkgbWV0aG9kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiR3VhcmRlZE9iamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIEd1YXJkLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3VhcmQoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gInRlc3QgbWVzc2FnZSI7CiAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBvYmpCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCIyMzUzNDUgdCIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JZGVudGl0eTJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0lkZW50aXR5MlRlc3QuamF2YQppbmRleCBkMjBjZGZhLi4xNDRlMmFiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0lkZW50aXR5MlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0lkZW50aXR5MlRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTMxLDcgKzM2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlMlRlc3QuSWRlbnRpdHlTY29wZVN1YmNsYXNzOzsKIAogQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQorQFRlc3RUYXJnZXRDbGFzcyhJZGVudGl0eS5jbGFzcykKIHB1YmxpYyBjbGFzcyBJZGVudGl0eTJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIHN0YXRpYyBQdWJsaWNLZXkgcHViS2V5OwpAQCAtMTQwLDYgKzE0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I0lkZW50aXR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWRlbnRpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBuZXcgSWRlbnRpdHlTdWJjbGFzcygpOwogICAgIH0KQEAgLTE0Nyw2ICsxNjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eSNJZGVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk90aGVyIHN0cmluZyBwYXJhbWV0ZXJzIChudWxsLCBlbXB0eSkgYXJlIG5vdCBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWRlbnRpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIG5ldyBJZGVudGl0eVN1YmNsYXNzKCJ0ZXN0Iik7CiAgICAgfQpAQCAtMTU1LDcgKzE3OCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I0lkZW50aXR5KGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZSkKICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJPdGhlciBwYXJhbWV0ZXJzIChudWxsLCBlbXB0eSkgYXJlIG5vdCBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWRlbnRpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBJZGVudGl0eVNjb3BlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9JZGVudGl0eVNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTdWJjbGFzcygidGVzdCIsIG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoKSk7CiAgICAgfQpAQCAtMTYzLDYgKzE5NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I2dldFNjb3BlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2NvcGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBJZGVudGl0eVNjb3BlIHNjb3BlID0gbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygpOwogICAgICAgICAgICAgICAgSWRlbnRpdHlTdWJjbGFzcyBzdWIgPSBuZXcgSWRlbnRpdHlTdWJjbGFzcygidGVzdCIsIHNjb3BlKTsKQEAgLTE3Myw2ICsyMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eSNnZXRQdWJsaWNLZXkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFB1YmxpY0tleSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAgICAgICAgSWRlbnRpdHlTdWJjbGFzcyBzdWIgPSBuZXcgSWRlbnRpdHlTdWJjbGFzcygidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoKSk7CkBAIC0xODQsNiArMjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHkjZ2V0TmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gInRlc3QiOwogICAgICAgICAgICAgICAgSWRlbnRpdHlTdWJjbGFzcyBzdWIgPSBuZXcgSWRlbnRpdHlTdWJjbGFzcyhuYW1lLApAQCAtMTk0LDYgKzI1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I2dldEluZm8oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgaW5mbyA9ICJUaGlzIGlzIHRoZSBnZW5lcmFsIGluZm9ybWF0aW9uLiI7CiAgICAgICAgICAgICAgICBJZGVudGl0eVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVN1YmNsYXNzKCJ0ZXN0IiwKQEAgLTIwNSw2ICsyNzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eSNjZXJ0aWZpY2F0ZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjZXJ0aWZpY2F0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NlcnRpZmljYXRlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAgICAgICAgSWRlbnRpdHlTdWJjbGFzcyBzdWIgPSBuZXcgSWRlbnRpdHlTdWJjbGFzcygidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoKSk7CkBAIC0yMjIsNiArMjk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHkjYWRkQ2VydGlmaWNhdGUoamF2YS5zZWN1cml0eS5DZXJ0aWZpY2F0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkIGFuZCBudWxsIGNlcnRpZmljYXRlcyBhcmUgbm90IGNoZWNrZWQsIGV4Y2VwdGlvbnMgYXJlIG5vdCBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQ2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5DZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRDZXJ0aWZpY2F0ZUxqYXZhX3NlY3VyaXR5X0NlcnRpZmljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBJZGVudGl0eVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVN1YmNsYXNzKCJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygpKTsKQEAgLTIzNiw2ICszMjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eSNyZW1vdmVDZXJ0aWZpY2F0ZShqYXZhLnNlY3VyaXR5LkNlcnRpZmljYXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWQgYW5kIG51bGwgY2VydGlmaWNhdGVzIGFyZSBub3QgY2hlY2tlZCwgZXhjZXB0aW9ucyBhcmUgbm90IGNoZWNrZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVDZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LkNlcnRpZmljYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNlcnRpZmljYXRlTGphdmFfc2VjdXJpdHlfQ2VydGlmaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgIElkZW50aXR5U3ViY2xhc3Mgc3ViID0gbmV3IElkZW50aXR5U3ViY2xhc3MoInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCkpOwpAQCAtMjUzLDYgKzM0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk1ldGhvZCBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkgaXMgbm90IHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgIElkZW50aXR5U3ViY2xhc3Mgc3ViID0gbmV3IElkZW50aXR5U3ViY2xhc3MoInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCkpOwpAQCAtMjcwLDYgKzM3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I2lkZW50aXR5RXF1YWxzKGphdmEuc2VjdXJpdHkuSWRlbnRpdHkpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTWV0aG9kIGlkZW50aXR5RXF1YWxzKGphdmEuc2VjdXJpdHkuSWRlbnRpdHkpIGlzIG5vdCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpZGVudGl0eUVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtJZGVudGl0eS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pZGVudGl0eUVxdWFsc0xqYXZhX3NlY3VyaXR5X0lkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBJZGVudGl0eVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVN1YmNsYXNzKCJ0ZXN0IiwgbnVsbCk7CiAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2YgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7CkBAIC0yODcsNiArMzk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHkjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgIElkZW50aXR5U3ViY2xhc3Mgc3ViID0gbmV3IElkZW50aXR5U3ViY2xhc3MoInRlc3QiLCBudWxsKTsKICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ViLnRvU3RyaW5nKCkpOwpAQCAtMjk5LDYgKzQyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I3RvU3RyaW5nKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmdaKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBJZGVudGl0eVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVN1YmNsYXNzKCJ0ZXN0IiwgbnVsbCk7CiAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN1Yi50b1N0cmluZyh0cnVlKSk7CkBAIC0zMDksNiArNDM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHkjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgIElkZW50aXR5U3ViY2xhc3Mgc3ViID0gbmV3IElkZW50aXR5U3ViY2xhc3MoInRlc3QiLCBudWxsKTsKICAgICAgICAgICAgICAgIElkZW50aXR5U3ViY2xhc3Mgc3ViMiA9IG5ldyBJZGVudGl0eVN1YmNsYXNzKCJ0ZXN0IiwgbnVsbCk7CkBAIC0zMTksNiArNDU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHkjc2V0SW5mbyhTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiT3RoZXIgcGFyYW1ldGVycyAoZW1wdHksIG51bGwpIGFyZSBub3QgdGVzdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEluZm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0SW5mbygpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgIFN0cmluZyBpbmZvID0gIlRoaXMgaXMgdGhlIGdlbmVyYWwgaW5mb3JtYXRpb24uIjsKICAgICAgICAgICAgSWRlbnRpdHlTdWJjbGFzcyBzdWIgPSBuZXcgSWRlbnRpdHlTdWJjbGFzcygidGVzdCIsCkBAIC0zMjgsOCArNDc2LDE3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5I2hhc2hDb2RlKCkKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eSNzZXRQdWJsaWNLZXkoUHVibGljS2V5IGtleSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJPdGhlciBwYXJhbWV0ZXJzIChudWxsLCBpbnZhbGlkKSBhcmUgbm90IHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFB1YmxpY0tleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQdWJsaWNLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQdWJsaWNLZXkoKSB0aHJvd3MgRXhjZXB0aW9uewogICAgICAgICBJZGVudGl0eVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVN1YmNsYXNzKCJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCkpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JZGVudGl0eVNjb3BlMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSWRlbnRpdHlTY29wZTJUZXN0LmphdmEKaW5kZXggZThiZjQzNy4uOGZkYTk1OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JZGVudGl0eVNjb3BlMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0lkZW50aXR5U2NvcGUyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JZGVudGl0eTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOwpAQCAtMjcsNiArMzIsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHkuSWRlbnRpdHkyVGVzdC5JZGVudGl0eVN1YmNsYXNzOwogQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKK0BUZXN0VGFyZ2V0Q2xhc3MoSWRlbnRpdHlTY29wZS5jbGFzcykKIHB1YmxpYyBjbGFzcyBJZGVudGl0eVNjb3BlMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgc3RhdGljIFB1YmxpY0tleSBwdWJLZXk7CkBAIC0xMTUsNiArMTIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZSNJZGVudGl0eVNjb3BlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWRlbnRpdHlTY29wZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoKTsKICAgICB9CkBAIC0xMjIsNiArMTM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZSNJZGVudGl0eVNjb3BlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiT3RoZXIgdmFyaWFudHMgKG51bGwsIGVtcHR5KSBmb3IgcGFyYW1ldGVyIGFyZSBub3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWRlbnRpdHlTY29wZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygidGVzdCIpOwogICAgIH0KQEAgLTEzMCw2ICsxNTQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlI0lkZW50aXR5U2NvcGUoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk90aGVyIHZhcmlhbnRzIGZvciBwYXJhbWV0ZXIgYXJlIG5vdCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJZGVudGl0eVNjb3BlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgSWRlbnRpdHlTY29wZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfSWRlbnRpdHlTY29wZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCJ0ZXN0IiwgbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygpKTsKICAgICB9CkBAIC0xMzcsNiArMTcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZSNhZGRJZGVudGl0eShqYXZhLnNlY3VyaXR5LklkZW50aXR5KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRJZGVudGl0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtJZGVudGl0eS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRJZGVudGl0eUxqYXZhX3NlY3VyaXR5X0lkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBJZGVudGl0eVNjb3BlU3ViY2xhc3Mgc3ViID0gbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoKSk7CkBAIC0xNTYsNiArMTk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZSNyZW1vdmVJZGVudGl0eShqYXZhLnNlY3VyaXR5LklkZW50aXR5KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVJZGVudGl0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtJZGVudGl0eS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJZGVudGl0eUxqYXZhX3NlY3VyaXR5X0lkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICBJZGVudGl0eVNjb3BlU3ViY2xhc3Mgc3ViID0gbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoKSk7CkBAIC0xNzQsNiArMjI1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZSNpZGVudGl0aWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaWRlbnRpdGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaWRlbnRpdGllcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAgICAgICAgSWRlbnRpdHlTY29wZVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCkpOwpAQCAtMTg5LDYgKzI0OSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUjZ2V0SWRlbnRpdHkoamF2YS5zZWN1cml0eS5QcmluY2lwYWwpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTWV0aG9kIHdpdGggbnVsbCAoaWYgdGhlcmUgYXJlIG5vIGlkZW50aXRpZXMgb2YgdGhlIHNhbWUgbmFtZSAiICsKKyAgICAgICAgICAgICAgICAgICJpbiB0aGlzIHNjb3BlKSBpcyBub3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SWRlbnRpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QcmluY2lwYWwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SWRlbnRpdHlMamF2YV9zZWN1cml0eV9QcmluY2lwYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgIElkZW50aXR5IGlkID0gbmV3IElkZW50aXR5U3ViY2xhc3MoInByaW5jaXBhbCBuYW1lIik7CiAgICAgICAgICAgICAgICBpZC5zZXRQdWJsaWNLZXkocHViS2V5KTsKQEAgLTIwMyw2ICsyNzMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlI2dldElkZW50aXR5KGphdmEuc2VjdXJpdHkuUHVibGljS2V5KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk1ldGhvZCB3aXRoIG51bGwgKGlmIHRoZXJlIGFyZSBubyBpZGVudGl0aWVzIGluICIgKworICAgICAgICAgICAgICAgICAgInRoaXMgc2NvcGUgd2l0aCB0aGF0IGtleSkgaXMgbm90IHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElkZW50aXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1B1YmxpY0tleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJZGVudGl0eUxqYXZhX3NlY3VyaXR5X1B1YmxpY0tleSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAgICAgICAgSWRlbnRpdHlTY29wZVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCkpOwpAQCAtMjE3LDYgKzI5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUjZ2V0SWRlbnRpdHkoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJZGVudGl0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SWRlbnRpdHlMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAgICAgICAgSWRlbnRpdHlTY29wZVN1YmNsYXNzIHN1YiA9IG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCkpOwpAQCAtMjMxLDYgKzMyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUjc2l6ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgIElkZW50aXR5U2NvcGVTdWJjbGFzcyBzdWIgPSBuZXcgSWRlbnRpdHlTY29wZVN1YmNsYXNzKCJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygpKTsKQEAgLTI0Myw2ICszNDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBJZGVudGl0eVNjb3BlU3ViY2xhc3Mgc3ViID0gbmV3IElkZW50aXR5U2NvcGVTdWJjbGFzcygidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgIG5ldyBJZGVudGl0eVNjb3BlU3ViY2xhc3MoKSk7CkBAIC0yNTIsNyArMzU5LDE2IEBACiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJ0b1N0cmluZyByZXR1cm5lZCBhIG51bGwiLCBzdWIudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJOb3QgYSB2YWxpZCBTdHJpbmcgIiwgc3ViLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKICAgICB9Ci0KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJZGVudGl0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTExNzMKICAgICAgICAgSWRlbnRpdHlTY29wZSBzY29wZSA9IElkZW50aXR5U2NvcGUuZ2V0U3lzdGVtU2NvcGUoKTsgCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0lkZW50aXR5U2NvcGVUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0lkZW50aXR5U2NvcGVUZXN0LmphdmEKaW5kZXggOTYzODdjYS4uYjIzOTAzMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JZGVudGl0eVNjb3BlVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSWRlbnRpdHlTY29wZVRlc3QuamF2YQpAQCAtMjEsNiArMjEsMTIgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnM7CkBAIC0zMCw4ICszNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuSWRlbnRpdHlTY29wZVN0dWI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhJZGVudGl0eVNjb3BlLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+SWRlbnRpdHlTY29wZTwvY29kZT4KICAqIApAQCAtNjMsNiArNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBTdHJpbmcgdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUb1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgSWRlbnRpdHlTY29wZVN0dWIoIkFsZWtzZWkgU2VtZW5vdiIpLnRvU3RyaW5nKCkpOwogICAgIH0KQEAgLTcwLDYgKzg0LDE1IEBACiAgICAgLyoqCiAgICAgICogdGVzdCBkZWZhdWx0IGNvbnN0cnVjdG9yIHZvaWQgSWRlbnRpdHlTY29wZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklkZW50aXR5U2NvcGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SWRlbnRpdHlTY29wZSgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgSWRlbnRpdHlTY29wZVN0dWIoKSk7CiAgICAgfQpAQCAtNzcsNiArMTAwLDE1IEBACiAgICAgLyoqCiAgICAgICogY2hlY2sgdGhhdCB2b2lkIElkZW50aXR5U2NvcGUoU3RyaW5nKSBjcmVhdGVzIGluc3RhbmNlIHdpdGggZ2l2ZW4gbmFtZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGp1c3QgcG9zaXRpdmUgY2FzZSB3aXRoIG5vbiBudWxsIHBhcmFtZXRlciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklkZW50aXR5U2NvcGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SWRlbnRpdHlTY29wZVN0cmluZygpIHsKICAgICAgICAgaXMgPSBuZXcgSWRlbnRpdHlTY29wZVN0dWIoIkFsZWtzZWkgU2VtZW5vdiIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGlzKTsKQEAgLTg2LDYgKzExOCwxNSBAQAogICAgIC8qKgogICAgICAqIGNoZWNrIHRoYXQgdm9pZCBJZGVudGl0eVNjb3BlKFN0cmluZywgSWRlbnRpdHlTY29wZSkgY3JlYXRlcyBpbnN0YW5jZSB3aXRoIGdpdmVuIG5hbWUgYW5kIHdpdGhpbiBnaXZlbiBzY29wZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGp1c3QgcG9zaXRpdmUgdGVzdCB3aXRoIGJvdGggbm9uIG51bGwgcGFyYW1ldGVycyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklkZW50aXR5U2NvcGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBJZGVudGl0eVNjb3BlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SWRlbnRpdHlTY29wZVN0cmluZ0lkZW50aXR5U2NvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSWRlbnRpdHlTY29wZSBzY29wZSA9IG5ldyBJZGVudGl0eVNjb3BlU3R1YigibXkgc2NvcGUiKTsKICAgICAgICAgaXMgPSBuZXcgSWRlbnRpdHlTY29wZVN0dWIoIkFsZWtzZWkgU2VtZW5vdiIsIHNjb3BlKTsKQEAgLTk3LDYgKzEzOCwxNSBAQAogICAgIC8qKgogICAgICAqIGp1c3QgY2FsbCBJZGVudGl0eVNjb3BlLmdldFN5c3RlbVNjb3BlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3lzdGVtU2NvcGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0U3lzdGVtU2NvcGUoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoInN5c3RlbS5zY29wZSIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOwpAQCAtMTEwLDcgKzE2MCwyMCBAQAogICAgICAqIGlmIHBlcm1pc3Npb24gaXMgZGVuaWVkIHRoYW4gU2VjdXJpdHlFeGNlcHRpb24gaXMgdGhyb3duCiAgICAgICoKICAgICAgKi8KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3lzdGVtU2NvcGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7SWRlbnRpdHlTY29wZS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTeXN0ZW1TY29wZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKworICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldFN5c3RlbVNjb3BlKCkgewogLy8gICAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHNwZWNpZmllZCBieSBzZWN1cml0eSBwcm9wZXJ0eSBzeXN0ZW0uc2NvcGUKICAgICAgICAgSWRlbnRpdHlTY29wZSBzeXN0ZW1TY29wZSA9IElkZW50aXR5U2NvcGUuZ2V0U3lzdGVtU2NvcGUoKTsKQEAgLTE0OSw2ICsyMTIsMTUgQEAKICAgICAvKioKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJZGVudGl0eSBnZXRJZGVudGl0eShQcmluY2lwYWwpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElkZW50aXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUHJpbmNpcGFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0SWRlbnRpdHlQcmluY2lwYWwoKSB7CiAgICAgICAgIGlzID0gbmV3IElkZW50aXR5U2NvcGVTdHViKCJBbGVrc2VpIFNlbWVub3YiKTsKICAgICAgICAgSWRlbnRpdHlTY29wZSBzYzIgPSBuZXcgSWRlbnRpdHlTY29wZVN0dWIoImFhYSIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjJUZXN0LmphdmEKaW5kZXggZjY0OGRlMC4uOTM4ZGU0NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0xNywxNCArMTcsMjkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24yVGVzdCBleHRlbmRzCiAgICAgICAgIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uI0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigpCiAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSA9IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKCk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24jSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggb25lIHN0cmluZyBwYXJhbWV0ZXIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggODAyYjk0MC4uYmFkY2M1NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMjIsMTEgKzIyLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+SW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjwvY29kZT4gY2xhc3MKICAqIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KQEAgLTU4LDYgKzYyLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwKICAgICAgKiBtZXNzYWdlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjAxKCkgewogICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTY5LDYgKzgyLDE1IEBACiAgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gd2l0aAogICAgICAqIGRldGFpbCBtZXNzYWdlIG1zZy4gUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uMDIoKSB7CiAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtODQsNiArMTA2LDE1IEBACiAgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gd2hlbgogICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjAzKCkgewogICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB0RSA9IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKApAQCAtOTcsNiArMTI4LDE1IEBACiAgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gd2hlbgogICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uMDQoKSB7CiAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CiAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gdEUgPSBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigKQEAgLTExMCw2ICsxNTAsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuCiAgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdCBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uMDUoKSB7CiAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gdEUgPSBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICB0Q2F1c2UpOwpAQCAtMTMwLDYgKzE3OSwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjA2KCkgewogICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CkBAIC0xNDMsNiArMjAxLDE1IEBACiAgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gd2hlbgogICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjA3KCkgewogICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKQEAgLTE1OSw2ICsyMjYsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuCiAgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdCBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uMDgoKSB7CiAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gdEUgPSBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICBudWxsLCB0Q2F1c2UpOwpAQCAtMTc5LDYgKzI1NSwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uMDkoKSB7CiAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjJUZXN0LmphdmEKaW5kZXggYjU0YzBjMi4uNWU0MDNjZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkS2V5RXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIEludmFsaWRLZXlFeGNlcHRpb24yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uI0ludmFsaWRLZXlFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbigpCiAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24gZSA9IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCk7CkBAIC0zNSw2ICs1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb24jSW52YWxpZEtleUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggb25lIHN0cmluZyBwYXJhbWV0ZXIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24gZSA9IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJ0ZXN0IG1lc3NhZ2UiKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA2MjI2ODJmLi5jY2RkOTNkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTYgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkS2V5RXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+SW52YWxpZEtleUV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgogICogCkBAIC01NSw2ICs2MCwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPkludmFsaWRLZXlFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgogICAgICAqIGNvbnN0cnVjdHMgSW52YWxpZEtleUV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEtleUV4Y2VwdGlvbjAxKCkgewogICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTY2LDYgKzgwLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRLZXlFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuCiAgICAgICogUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkS2V5RXhjZXB0aW9uMDIoKSB7CiAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtODAsNiArMTAzLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+SW52YWxpZEtleUV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkS2V5RXhjZXB0aW9uMDMoKSB7CiAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwogICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlFeGNlcHRpb24obXNnKTsKQEAgLTkyLDYgKzEyNCwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzCiAgICAgICogbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEtleUV4Y2VwdGlvbjA0KCkgewogICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOwogICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlFeGNlcHRpb24oY2F1c2UpOwpAQCAtMTA0LDYgKzE0NSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzCiAgICAgICogbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Rocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRLZXlFeGNlcHRpb24wNSgpIHsKICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiB0RSA9IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTIyLDYgKzE3MiwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEtleUV4Y2VwdGlvbjA2KCkgewogICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlFeGNlcHRpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTEzMyw2ICsxOTIsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZEtleUV4Y2VwdGlvbiB3aGVuCiAgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkS2V5RXhjZXB0aW9uMDcoKSB7CiAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtMTQ4LDYgKzIxNiwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRLZXlFeGNlcHRpb24wOCgpIHsKICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiB0RSA9IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKG51bGwsIHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTY2LDYgKzI0MywxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkS2V5RXhjZXB0aW9uMDkoKSB7CiAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjJUZXN0LmphdmEKaW5kZXggMmQ3MjFhMi4uOTdmMDhjYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0ludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uI0ludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigpCiAgICAgICAgIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZSA9IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKCk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24jSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggb25lIHZhcmlhbnQgb2Ygc3RyaW5nIHBhcmFtZXRlciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA1MTcwN2NjLi5iZjUwN2NkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0ludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTYgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+SW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZAogICogbWV0aG9kcy4KQEAgLTU2LDYgKzYxLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+SW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvcgogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uMDEoKSB7CiAgICAgICAgIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gdEUgPSBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtNjcsNiArODEsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KICAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24wMigpIHsKICAgICAgICAgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiB0RTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CkBAIC04Miw2ICsxMDUsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4KICAgICAgKiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uMDMoKSB7CiAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwogICAgICAgICBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24obXNnKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS1NDYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU0NhbGxiYWNrSGFuZGxlclByb3RlY3Rpb25UZXN0LmphdmEKaW5kZXggMTJjMzUyNC4uNGQ0ZmYwMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU0NhbGxiYWNrSGFuZGxlclByb3RlY3Rpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU0NhbGxiYWNrSGFuZGxlclByb3RlY3Rpb25UZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CkBAIC0yOSw3ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQudG1wQ2FsbGJhY2tIYW5kbGVyOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEtleVN0b3JlLkNhbGxiYWNrSGFuZGxlclByb3RlY3Rpb24uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5LZXlTdG9yZS5DYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uPiBjbGFzcyBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcwogICogCkBAIC01MCw2ICs1NSwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yCiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBoYW5kbGVyIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NhbGxiYWNrSGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENhbGxiYWNrSGFuZGxlclByb3RlY3Rpb24oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgS2V5U3RvcmUuQ2FsbGJhY2tIYW5kbGVyUHJvdGVjdGlvbihudWxsKTsKQEAgLTYyLDYgKzc2LDE5IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0Q2FsbGJhY2tIYW5kbGVyKCk8L2NvZGU+IG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBDYWxsYmFja0hhbmRsZXIgCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2FsbGJhY2tIYW5kbGVyUHJvdGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDYWxsYmFja0hhbmRsZXIuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2FsbGJhY2tIYW5kbGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENhbGxCYWNrSGFuZGxlcigpIHsKICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyIGNiaCA9IG5ldyB0bXBDYWxsYmFja0hhbmRsZXIoKTsKICAgICAgICAgS2V5U3RvcmUuQ2FsbGJhY2tIYW5kbGVyUHJvdGVjdGlvbiBrc0NCSCA9IG5ldyBLZXlTdG9yZS5DYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uKGNiaCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tTUGFzc3dvcmRQcm90ZWN0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU1Bhc3N3b3JkUHJvdGVjdGlvblRlc3QuamF2YQppbmRleCBhM2VhMGVkLi44MGJmNjZjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tTUGFzc3dvcmRQcm90ZWN0aW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS1NQYXNzd29yZFByb3RlY3Rpb25UZXN0LmphdmEKQEAgLTIyLDEyICsyMiwxNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKIAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguRGVzdHJveUZhaWxlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhLZXlTdG9yZS5QYXNzd29yZFByb3RlY3Rpb24uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5LZXlTdG9yZS5QYXNzd29yZFByb3RlY3Rpb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9yIGFuZCBtZXRob2RzCiAgKiAKQEAgLTUzLDYgKzU4LDI4IEBACiAgICAgICogZ2V0UGFzc3dvcmQoKSByZXR1cm5zIHBhc3N3b3JkIG9yIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiBpZiBQYXNzd29yZFByb3RlY3Rpb24gaXMgZGVzdHJveWVkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiMS4gUGFzc3dvcmRQcm90ZWN0aW9uIC0gdmVyaWZpY2F0aW9uIHdpdGggbnVsbCBwYXJhbWV0ZXIgbWlzc2VkIiArCisgICAgICAgICAgICAgICAgICAiMi4gZGVzdHJveSAtIERlc3Ryb3lGYWlsZWRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUGFzc3dvcmRQcm90ZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXNzd29yZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNEZXN0cm95ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRlc3Ryb3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFzc3dvcmQoKSB0aHJvd3MgRGVzdHJveUZhaWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoYXIgW10gcGFzcyA9IHsnYScsICdiJywgJ2MnfTsKICAgICAgICAgS2V5U3RvcmUuUGFzc3dvcmRQcm90ZWN0aW9uIGtzUFdQID0gbmV3IEtleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbihwYXNzKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS1NQcml2YXRlS2V5RW50cnlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tTUHJpdmF0ZUtleUVudHJ5VGVzdC5qYXZhCmluZGV4IDYzODJjZjcuLmU1YTdhNjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS1NQcml2YXRlS2V5RW50cnlUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU1ByaXZhdGVLZXlFbnRyeVRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKQEAgLTMzLDYgKzM4LDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwogCitAVGVzdFRhcmdldENsYXNzKEtleVN0b3JlLlByaXZhdGVLZXlFbnRyeS5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPktleVN0b3JlLlByaXZhdGVLZXlFbnRyeTwvY29kZT4gIGNsYXNzIGNvbnN0cnVjdG9yIGFuZCBtZXRob2RzIAogICogCkBAIC02Nyw2ICs3MywxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yCiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBwcml2YXRlS2V5IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgcG9zaXRpdmUgY2FzZSB3aXRoIHZhbGlkIHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpdmF0ZUtleUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1ByaXZhdGVLZXkuY2xhc3MsIENlcnRpZmljYXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2YXRlS2V5RW50cnkwMSgpIHsKICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0cyA9IG5ldyBNeUNlcnRpZmljYXRlWzFdOy8vbmV3IENlcnRpZmljYXRlWzFdOwogICAgICAgICBQcml2YXRlS2V5IHBrID0gbnVsbDsKQEAgLTgzLDYgKzk4LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBjaGFpbiBpcyBudWxsCiAgICAgICogYW5kIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBjaGFpbiBsZW5ndGggaXMgMAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBwb3NpdGl2ZSBjYXNlIHdpdGggdmFsaWQgcGFyYW1ldGVycyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcml2YXRlS2V5RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJpdmF0ZUtleS5jbGFzcywgQ2VydGlmaWNhdGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByaXZhdGVLZXlFbnRyeTAyKCkgewogICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNoYWluID0gbnVsbDsKICAgICAgICAgUHJpdmF0ZUtleSBwayA9IG5ldyB0bXBQcml2YXRlS2V5KCk7CkBAIC0xMDQsNiArMTI4LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gY2hhaW4gY29udGFpbnMgY2VydGlmaWNhdGVzIAogICAgICAqIG9mIGRpZmZlcmVudCB0eXBlcwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBwb3NpdGl2ZSBjYXNlIHdpdGggdmFsaWQgcGFyYW1ldGVycyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcml2YXRlS2V5RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJpdmF0ZUtleS5jbGFzcywgQ2VydGlmaWNhdGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByaXZhdGVLZXlFbnRyeTAzKCkgewogICAgICAgICBjcmVhdGVQYXJhbXModHJ1ZSwgZmFsc2UpOwogICAgICAgICB0cnkgewpAQCAtMTE5LDYgKzE1MiwxNSBAQAogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBvZiBwcml2YXRlS2V5IAogICAgICAqIGRvZXMgbm90IG1hdGNoIHRoZSBhbGdvcml0aG0gb2YgUHVibGljS2V5IGluIHRoZSBlbmQgY2VydGlmaWNhdGUgKHdpdGggMCBpbmRleCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgcG9zaXRpdmUgY2FzZSB3aXRoIHZhbGlkIHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJpdmF0ZUtleUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1ByaXZhdGVLZXkuY2xhc3MsIENlcnRpZmljYXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2YXRlS2V5RW50cnkwNCgpIHsKICAgICAgICAgY3JlYXRlUGFyYW1zKGZhbHNlLCB0cnVlKTsgICAgICAgICAgICAgICAKICAgICAgICAgdHJ5IHsKQEAgLTEzMiw2ICsxNzQsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQcml2YXRlS2V5KCk8L2NvZGU+IG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBQcml2YXRlS2V5IG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcml2YXRlS2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFByaXZhdGVLZXkoKSB7CiAgICAgICAgIGNyZWF0ZVBhcmFtcyhmYWxzZSwgZmFsc2UpOwogICAgICAgICBLZXlTdG9yZS5Qcml2YXRlS2V5RW50cnkga3NQS0UgPSBuZXcgS2V5U3RvcmUuUHJpdmF0ZUtleUVudHJ5KApAQCAtMTQ0LDYgKzE5NSwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldENlcnRpZmljYXRlQ2hhaW4oKTwvY29kZT4gbWV0aG9kIEFzc2VydGlvbjogcmV0dXJucwogICAgICAqIGFycmF5IG9mIHRoZSBDZXJ0aWZpY2F0ZXMgY29ycmVzcG9uZGluZyB0byBjaGFpbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDZXJ0aWZpY2F0ZUNoYWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENlcnRpZmljYXRlQ2hhaW4oKSB7CiAgICAgICAgIGNyZWF0ZVBhcmFtcyhmYWxzZSwgZmFsc2UpOwogICAgICAgICBLZXlTdG9yZS5Qcml2YXRlS2V5RW50cnkga3NQS0UgPSBuZXcgS2V5U3RvcmUuUHJpdmF0ZUtleUVudHJ5KApAQCAtMTYwLDYgKzIyMCwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldENlcnRpZmljYXRlKCk8L2NvZGU+IG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBlbmQgQ2VydGlmaWNhdGUgKHdpdGggMCBpbmRleCBpbiBjaGFpbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2VydGlmaWNhdGUoKSB7CiAgICAgICAgIGNyZWF0ZVBhcmFtcyhmYWxzZSwgZmFsc2UpOwogICAgICAgICBLZXlTdG9yZS5Qcml2YXRlS2V5RW50cnkga3NQS0UgPSBuZXcgS2V5U3RvcmUuUHJpdmF0ZUtleUVudHJ5KApAQCAtMTcyLDYgKzI0MSwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBub24gbnVsbCBTdHJpbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIGNyZWF0ZVBhcmFtcyhmYWxzZSwgZmFsc2UpOwogICAgICAgICBLZXlTdG9yZS5Qcml2YXRlS2V5RW50cnkga3NQS0UgPSBuZXcgS2V5U3RvcmUuUHJpdmF0ZUtleUVudHJ5KApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU1NlY3JldEtleUVudHJ5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU1NlY3JldEtleUVudHJ5VGVzdC5qYXZhCmluZGV4IGNiMWFkMjUuLjQwYTJkZWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS1NTZWNyZXRLZXlFbnRyeVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tTU2VjcmV0S2V5RW50cnlUZXN0LmphdmEKQEAgLTIyLDEyICsyMiwxNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKIAogaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5U3RvcmUuU2VjcmV0S2V5RW50cnkuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5LZXlTdG9yZS5TZWNyZXRLZXlFbnRyeTwvY29kZT4gY2xhc3MgY29uc3RydWN0b3IgYW5kIG1ldGhvZHMgCiAgKiAKQEAgLTQ2LDYgKzUxLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+U2VjcmV0S2V5RW50cnkoU2VjcmV0S2V5IHNlY3JldEtleSk8L2NvZGU+IGNvbnN0cnVjdG9yCiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBzZWNyZXRLZXkgaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBwb3NpdGl2ZSBjYXNlIHdpdGggbm9uIG51bGwgcGFyYW1ldGVyIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3JldEtleUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NlY3JldEtleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlY3JldEtleUVudHJ5KCkgewogICAgICAgICBTZWNyZXRLZXkgc2sgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtNTksNiArNzMsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRTZWNyZXRLZXkoKTwvY29kZT4gbWV0aG9kCiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIFNlY3JldEtleSBmcm9tIHRoZSBnaXZlbiBlbnRyeQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZWNyZXRLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2VjcmV0S2V5KCkgewogICAgICAgICBTZWNyZXRLZXkgc2sgPSBuZXcgdG1wU2VjcmV0S2V5KCk7CiAgICAgICAgIEtleVN0b3JlLlNlY3JldEtleUVudHJ5IHNrZSA9IG5ldyBLZXlTdG9yZS5TZWNyZXRLZXlFbnRyeShzayk7CkBAIC02OSw2ICs5MiwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBub24gbnVsbCBzdHJpbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIFNlY3JldEtleSBzayA9IG5ldyB0bXBTZWNyZXRLZXkoKTsKICAgICAgICAgS2V5U3RvcmUuU2VjcmV0S2V5RW50cnkgc2tlID0gbmV3IEtleVN0b3JlLlNlY3JldEtleUVudHJ5KHNrKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS1NUcnVzdGVkQ2VydGlmaWNhdGVFbnRyeVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS1NUcnVzdGVkQ2VydGlmaWNhdGVFbnRyeVRlc3QuamF2YQppbmRleCBhNGExNWQzLi40ZTM3ZmVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tTVHJ1c3RlZENlcnRpZmljYXRlRW50cnlUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LU1RydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5VGVzdC5qYXZhCkBAIC0yMSw2ICsyMSwxMiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogCkBAIC0yOCw3ICszNCw3IEBACiAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhLZXlTdG9yZS5UcnVzdGVkQ2VydGlmaWNhdGVFbnRyeS5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPktleVN0b3JlLlRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5PC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcyAKICAqIApAQCAtNDEsNiArNDcsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvcgogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdHJ1c3RDZXJ0IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgcG9zaXRpdmUgY2FzZSB3aXRoIG5vbiBudWxsIHBhcmFtZXRlciBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdGVkQ2VydGlmaWNhdGVFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5KCkgewogICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTU0LDYgKzY5LDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGZlPmdldFRydXN0ZWRDZXJ0aWZpY2F0ZSgpPC9jb2RlPiBtZXRob2QKICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdHJ1c3RlZCBDZXJ0aWZpY2F0ZSBmcm9tIGdvdmVuIGVudHJ5IAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUcnVzdGVkQ2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHJ1c3RlZENlcnRpZmljYXRlKCkgewogICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0ID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1QiLCBuZXcgYnl0ZVsxMF0pOwogICAgICAgICBLZXlTdG9yZS5UcnVzdGVkQ2VydGlmaWNhdGVFbnRyeSBrc1RDRSA9IApAQCAtNjUsNiArODksMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZmU+dG9TdHJpbmcoKTwvY29kZT4gbWV0aG9kCiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIG5vbiBudWxsIHN0cmluZyAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIENlcnRpZmljYXRlIGNlcnQgPSBuZXcgTXlDZXJ0aWZpY2F0ZSgiVEVTVCIsIG5ldyBieXRlWzEwXSk7CiAgICAgICAgIEtleVN0b3JlLlRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5IGtzVENFID0gCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleUV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleUV4Y2VwdGlvbjJUZXN0LmphdmEKaW5kZXggNGI0Y2FmNC4uMzgwOTBmNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlFeGNlcHRpb24yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5RXhjZXB0aW9uMlRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleUV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhLZXlFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgS2V5RXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5RXhjZXB0aW9uI0tleUV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LktleUV4Y2VwdGlvbigpCiAgICAgICAgIEtleUV4Y2VwdGlvbiBlID0gbmV3IEtleUV4Y2VwdGlvbigpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlFeGNlcHRpb24jS2V5RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCBvbmUgdmFyaWFudCBvZiBzdHJpbmcgcGFyYW1ldGVyIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXlFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgS2V5RXhjZXB0aW9uIGUgPSBuZXcgS2V5RXhjZXB0aW9uKCJ0ZXN0IG1lc3NhZ2UiKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5RXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggYjY5NGZhYi4uYjFlYjU4YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlFeGNlcHRpb25UZXN0LmphdmEKQEAgLTIxLDExICsyMSwxNiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5RXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+S2V5RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCiAgKiAKQEAgLTU1LDYgKzYwLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+S2V5RXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cwogICAgICAqIEtleUV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlFeGNlcHRpb24wMSgpIHsKICAgICAgICAgS2V5RXhjZXB0aW9uIHRFID0gbmV3IEtleUV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtNjYsNiArODAsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RzIEtleUV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4gUGFyYW1ldGVyCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5RXhjZXB0aW9uMDIoKSB7CiAgICAgICAgIEtleUV4Y2VwdGlvbiB0RTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CkBAIC04MCw2ICsxMDMsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5LZXlFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgogICAgICAqIGNvbnN0cnVjdHMgS2V5RXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleUV4Y2VwdGlvbjAzKCkgewogICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKICAgICAgICAgS2V5RXhjZXB0aW9uIHRFID0gbmV3IEtleUV4Y2VwdGlvbihtc2cpOwpAQCAtOTEsNiArMTIzLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+S2V5RXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKICAgICAgKiBjb25zdHJ1Y3RzIEtleUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Rocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleUV4Y2VwdGlvbjA0KCkgewogICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOwogICAgICAgICBLZXlFeGNlcHRpb24gdEUgPSBuZXcgS2V5RXhjZXB0aW9uKGNhdXNlKTsKQEAgLTEwMiw2ICsxNDMsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5LZXlFeGNlcHRpb24oVGhyb3dhYmxlKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgogICAgICAqIGNvbnN0cnVjdHMgS2V5RXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdCBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Rocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleUV4Y2VwdGlvbjA1KCkgewogICAgICAgICBLZXlFeGNlcHRpb24gdEUgPSBuZXcgS2V5RXhjZXB0aW9uKHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTIwLDYgKzE3MCwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAogICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleUV4Y2VwdGlvbjA2KCkgewogICAgICAgICBLZXlFeGNlcHRpb24gdEUgPSBuZXcgS2V5RXhjZXB0aW9uKG51bGwsIG51bGwpOwogICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldE1lc3NhZ2UoKSk7CkBAIC0xMzEsNiArMTkwLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEtleUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleUV4Y2VwdGlvbjA3KCkgewogICAgICAgICBLZXlFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtMTQ2LDYgKzIxNCwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKiA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlFeGNlcHRpb24wOCgpIHsKICAgICAgICAgS2V5RXhjZXB0aW9uIHRFID0gbmV3IEtleUV4Y2VwdGlvbihudWxsLCB0Q2F1c2UpOwogICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKQEAgLTE2NCw2ICsyNDEsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5RXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdCBudWxsCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleUV4Y2VwdGlvbjA5KCkgewogICAgICAgICBLZXlFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlGYWN0b3J5MlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5RmFjdG9yeTJUZXN0LmphdmEKaW5kZXggNGE1OTYyMy4uM2VmMTBmYiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlGYWN0b3J5MlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleUZhY3RvcnkyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKQEAgLTM4LDYgKzQzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhLZXlGYWN0b3J5LmNsYXNzKQogcHVibGljIGNsYXNzIEtleUZhY3RvcnkyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZRkFDVE9SWV9JRCA9ICJLZXlGYWN0b3J5LiI7CkBAIC05MSw2ICs5NywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkjS2V5RmFjdG9yeShqYXZhLnNlY3VyaXR5LktleUZhY3RvcnlTcGksCiAgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleUZhY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7S2V5RmFjdG9yeVNwaS5jbGFzcywgUHJvdmlkZXIuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25zdHJ1Y3RvcigpIHsKICAgICAgICAgS2V5RmFjdG9yeVNwaSBrZnMgPSBuZXcgS2V5RmFjdG9yeVNwaVN0dWIoKTsKIApAQCAtMTE2LDYgKzEzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkjZ2VuZXJhdGVQcml2YXRlKGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlUHJpdmF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtLZXlTcGVjLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dlbmVyYXRlUHJpdmF0ZUxqYXZhX3NlY3VyaXR5X3NwZWNfS2V5U3BlYygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkuZ2VuZXJhdGVQcml2YXRlKGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQpAQCAtMTU3LDYgKzE4MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkjZ2VuZXJhdGVQdWJsaWMoamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVQdWJsaWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7S2V5U3BlYy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmF0ZVB1YmxpY0xqYXZhX3NlY3VyaXR5X3NwZWNfS2V5U3BlYygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUHVibGljS2V5CiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeS5nZW5lcmF0ZVB1YmxpYyhqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKQEAgLTE5NSw2ICsyMjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5I2dldEFsZ29yaXRobSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkuZ2V0QWxnb3JpdGhtKCkKQEAgLTIxNSw2ICsyNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5I2dldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5CiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMjMxLDYgKzI4MiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKIAogICAgICAgICAvLyBUZXN0MTogVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeQpAQCAtMjYzLDkgKzMyMywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5I2dldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcsIFByb3ZpZGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9Qcm92aWRlcigpIHsKIAogICAgICAgICAvLyBUZXN0MTogVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeQpAQCAtMzAxLDYgKzM2OSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkjZ2V0S2V5U3BlYyhqYXZhLnNlY3VyaXR5LktleSwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLkNsYXNzKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7S2V5LmNsYXNzLCBDbGFzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRLZXlTcGVjTGphdmFfc2VjdXJpdHlfS2V5TGphdmFfbGFuZ19DbGFzcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeS5nZXRLZXlTcGVjKGphdmEuc2VjdXJpdHkuS2V5LApAQCAtMzU4LDYgKzQzNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkjZ2V0UHJvdmlkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeS5nZXRQcm92aWRlcigpCkBAIC0zNzYsNiArNDYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeSN0cmFuc2xhdGVLZXkoamF2YS5zZWN1cml0eS5LZXkpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0cmFuc2xhdGVLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7S2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zbGF0ZUtleUxqYXZhX3NlY3VyaXR5X0tleSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuS2V5CiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeS50cmFuc2xhdGVLZXkoamF2YS5zZWN1cml0eS5LZXkpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb24yVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uMlRlc3QuamF2YQppbmRleCA0ZjBkZGE2Li45M2Y4NWQzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb24yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjJUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEtleU1hbmFnZW1lbnRFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb24jS2V5TWFuYWdlbWVudEV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleU1hbmFnZW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uKCkKICAgICAgICAgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiBlID0gbmV3IEtleU1hbmFnZW1lbnRFeGNlcHRpb24oKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiNLZXlNYW5hZ2VtZW50RXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tpbmcgd2l0aCBudWxsIGFuZCBlbXB0eSBzdHJpbmcgcGFyYW1ldGVyIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleU1hbmFnZW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA3Y2EzMzIyLi45ZDVkNTljIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTYgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhLZXlNYW5hZ2VtZW50RXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+S2V5TWFuYWdlbWVudEV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZAogICogbWV0aG9kcy4KQEAgLTU2LDYgKzYxLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+S2V5TWFuYWdlbWVudEV4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CiAgICAgICogY29uc3RydWN0cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlNYW5hZ2VtZW50RXhjZXB0aW9uMDEoKSB7CiAgICAgICAgIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gdEUgPSBuZXcgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtNjcsNiArODEsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KICAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleU1hbmFnZW1lbnRFeGNlcHRpb24wMigpIHsKICAgICAgICAgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB0RTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CkBAIC04Miw2ICsxMDUsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMKICAgICAgKiBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlNYW5hZ2VtZW50RXhjZXB0aW9uMDMoKSB7CiAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwogICAgICAgICBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHRFID0gbmV3IEtleU1hbmFnZW1lbnRFeGNlcHRpb24obXNnKTsKQEAgLTk0LDYgKzEyNiwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzCiAgICAgICogbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleU1hbmFnZW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5TWFuYWdlbWVudEV4Y2VwdGlvbjA0KCkgewogICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOwogICAgICAgICBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHRFID0gbmV3IEtleU1hbmFnZW1lbnRFeGNlcHRpb24oY2F1c2UpOwpAQCAtMTA2LDYgKzE0NywxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzCiAgICAgICogbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Rocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleU1hbmFnZW1lbnRFeGNlcHRpb24wNSgpIHsKICAgICAgICAgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB0RSA9IG5ldyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uKHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTI0LDYgKzE3NCwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5TWFuYWdlbWVudEV4Y2VwdGlvbjA2KCkgewogICAgICAgICBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHRFID0gbmV3IEtleU1hbmFnZW1lbnRFeGNlcHRpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTEzNSw2ICsxOTQsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB3aGVuCiAgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleU1hbmFnZW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlNYW5hZ2VtZW50RXhjZXB0aW9uMDcoKSB7CiAgICAgICAgIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtMTUwLDYgKzIxOCwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleU1hbmFnZW1lbnRFeGNlcHRpb24wOCgpIHsKICAgICAgICAgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB0RSA9IG5ldyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uKG51bGwsIHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTY4LDYgKzI0NSwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleU1hbmFnZW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlNYW5hZ2VtZW50RXhjZXB0aW9uMDkoKSB7CiAgICAgICAgIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yMVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvcjFUZXN0LmphdmEKaW5kZXggYzJhOTQ0MS4uMGE4OTEzZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yMVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3IxVGVzdC5qYXZhCkBAIC0yMiw2ICsyMiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKQEAgLTM4LDcgKzQzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhLZXlQYWlyR2VuZXJhdG9yLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+S2V5UGFpckdlbmVyYXRvcjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgogICogCkBAIC0xMDYsNiArMTExLDE1IEBACiAgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICB3aGVuIGFsZ29yaXRobSBpcyBudWxsCiAgICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBpbmNvcnJlY3Q7IAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVBhaXJHZW5lcmF0b3IwMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZShudWxsKTsKQEAgLTEyNyw2ICsxNDEsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKTwvY29kZT4gbWV0aG9kIAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBLZXlQYWlyR2VuZXJhdG9yIG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVBhaXJHZW5lcmF0b3IwMigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKQEAgLTE0NSw2ICsxNjgsMTUgQEAKICAgICAgKiBtZXRob2QgCiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5UGFpckdlbmVyYXRvcjAzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFEU0FTdXBwb3J0ZWQpIHsKQEAgLTE3MCw5ICsyMDIsMTcgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPgogICAgICAqIG1ldGhvZCAKICAgICAgKiBBc3NlcnRpb246Ci0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICB3aGVuIGFsZ29yaXRobSBpcyBudWxsCi0gICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBpbmNvcnJlY3Q7IAorICAgICAqIHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG5vdCBhdmFpbGFibGUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVBhaXJHZW5lcmF0b3IwNCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewpAQCAtMTk2LDggKzIzNiwxOSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcik8L2NvZGU+CiAgICAgICogbWV0aG9kIAogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBub3QKLSAgICAgKiBhdmFpbGFibGUgb2UgbnVsbAorICAgICAqIGF2YWlsYWJsZQorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgd2hlbiBhbGdvcml0aG0gaXMgbnVsbAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgaW5jb3JyZWN0OwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5UGFpckdlbmVyYXRvcjA1KCkgdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAogICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFEU0FTdXBwb3J0ZWQpIHsKQEAgLTIyNyw2ICsyNzgsMTUgQEAKICAgICAgKiBtZXRob2QgCiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIEtleVBhaXJHZW5lcmF0b3Igb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlQYWlyR2VuZXJhdG9yMDYoKSB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CkBAIC0yNDgsNiArMzA4LDE1IEBACiAgICAgICogbWV0aG9kIAogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5UGFpckdlbmVyYXRvcjA3KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOwpAQCAtMjcwLDYgKzMzOSwxNSBAQAogICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgd2hlbiBhbGdvcml0aG0gaXMgbnVsbAogICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgaW5jb3JyZWN0OyAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5UGFpckdlbmVyYXRvcjA4KCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOwpAQCAtMjk3LDYgKzM3NSwxNSBAQAogICAgICAqIG1ldGhvZCAKICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgS2V5UGFpckdlbmVyYXRvciBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5UGFpckdlbmVyYXRvcjA5KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CkBAIC0zMTgsNiArNDA1LDIwIEBACiAgICAgICogQXNzZXJ0aW9uOiBLZXlQYWlyR2VuZXJhdG9yIHdhcyBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGludm9jYXRpb24gCiAgICAgICogb2YgdGhlc2UgbWV0aG9kcwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUtleVBhaXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuS2V5UGFpciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKworICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVBhaXJHZW5lcmF0b3IxMCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmICghRFNBU3VwcG9ydGVkKSB7CkBAIC0zNDgsNyArNDQ5LDI4IEBACiAgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBvcgogICAgICAqIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gd2hlbiBwYXJhbWV0ZXJzIGtleXNpemUgb3IgcGFyYW0gYXJlCiAgICAgICogaW5jb3JyZWN0Ci0gICAgICovICAgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdGlhbGl6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtBbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7QWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlQYWlyR2VuZXJhdG9yMTEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewpAQCAtMzkxLDYgKzUxMywyNyBAQAogICAgICAqIGluY29ycmVjdCBBc3NlcnRpb246IGdlbmVyYXRlS2V5UGFpcigpIGFuZCBnZW5LZXlQYWlyKCkgcmV0dXJuIG51bGwKICAgICAgKiBLZXlQYWlyIEFkZGl0aW9uYWwgY2xhc3MgTXlLZXlQYWlyR2VuZXJhdG9yMSBpcyB1c2VkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdGlhbGl6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtBbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7QWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlQYWlyR2VuZXJhdG9yMTIoKSB7CiAgICAgICAgIGludFtdIGtleXMgPSB7IC0xLCAtMjUwLCAxLCA2NCwgNTEyLCAxMDI0IH07CiAgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7CkBAIC00NjcsNiArNjEwLDI3IEBACiAgICAgICogZ2VuS2V5UGFpcigpIHJldHVybiBub3QgbnVsbCBLZXlQYWlyIEFkZGl0aW9uYWwgY2xhc3MgTXlLZXlQYWlyR2VuZXJhdG9yMgogICAgICAqIGlzIHVzZWQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0aWFsaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0FsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdGlhbGl6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtBbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdGlhbGl6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdGlhbGl6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIFNlY3VyZVJhbmRvbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVBhaXJHZW5lcmF0b3IxMygpIHsKICAgICAgICAgaW50W10ga2V5cyA9IHsgLTEsIC0yNTAsIDEsIDYzLCAtNTEyLCAtMTAyNCB9OwogICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvcjJUZXN0LmphdmEKaW5kZXggODgxYTQ2OC4uMTM2ZDE1OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3IyVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSwxMiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOwpAQCAtMzYsOCArNDIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlNwaUVuZ1V0aWxzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5UGFpckdlbmVyYXRvci5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPktleVBhaXJHZW5lcmF0b3I8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KICAqIApAQCAtMTkxLDYgKzE5NiwxNSBAQAogICAgICAqIEtleVBhaXJHZW5lcmF0b3Igb2JqZWN0CiAgICAgICogIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHByaXZhdGUgdm9pZCBHZXRJbnN0YW5jZTAxKGludCBtb2RlKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CkBAIC0yMjksNiArMjQzLDE1IEBACiAgICAgICogcmV0dXJucwogICAgICAqIEtleVBhaXJHZW5lcmF0b3Igb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCBHZXRJbnN0YW5jZTAyKGludCBtb2RlKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpAQCAtMjg5LDYgKzMxMiwxNSBAQAogICAgICAqIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsOwogICAgICAqIHJldHVybnMgS2V5UGFpckdlbmVyYXRvciBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHJpdmF0ZSB2b2lkIEdldEluc3RhbmNlMDMoaW50IG1vZGUpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewogICAgICAgICB0cnkgewpAQCAtMzI1LDcgKzM1NywxNiBAQAogICAgICAgICAgICAgY2hlY2tSZXN1bHQoa3BHLCBtb2RlKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlMDEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CiAgICAgICAgIEtleVBhaXJHZW5lcmF0b3JQcm92aWRlckNsYXNzID0gS2V5UGFpckdlbmVyYXRvclByb3ZpZGVyQ2xhc3MxOwpAQCAtMzM0LDcgKzM3NSwxNiBAQAogICAgICAgICBzZXRQcm92KCk7CiAgICAgICAgIEdldEluc3RhbmNlMDEoMSk7CiAgICAgfQotCisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZTAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCiAgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKQEAgLTM0NCw3ICszOTQsMTYgQEAKICAgICAgICAgc2V0UHJvdigpOwogICAgICAgICBHZXRJbnN0YW5jZTAyKDEpOwogICAgIH0KLQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZTAzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CiAgICAgICAgIEtleVBhaXJHZW5lcmF0b3JQcm92aWRlckNsYXNzID0gS2V5UGFpckdlbmVyYXRvclByb3ZpZGVyQ2xhc3MxOwpAQCAtMzUzLDcgKzQxMiwxNiBAQAogICAgICAgICBzZXRQcm92KCk7CiAgICAgICAgIEdldEluc3RhbmNlMDMoMSk7CiAgICAgfQotCisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2UwNCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKICAgICAgICAgS2V5UGFpckdlbmVyYXRvclByb3ZpZGVyQ2xhc3MgPSBLZXlQYWlyR2VuZXJhdG9yUHJvdmlkZXJDbGFzczI7CkBAIC0zNjIsNyArNDMwLDE2IEBACiAgICAgICAgIHNldFByb3YoKTsKICAgICAgICAgR2V0SW5zdGFuY2UwMSgyKTsKICAgICB9Ci0KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlMDUoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpAQCAtMzcyLDcgKzQ0OSwxNiBAQAogICAgICAgICBzZXRQcm92KCk7CiAgICAgICAgIEdldEluc3RhbmNlMDIoMik7CiAgICAgfQotCisgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlMDYoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKICAgICAgICAgS2V5UGFpckdlbmVyYXRvclByb3ZpZGVyQ2xhc3MgPSBLZXlQYWlyR2VuZXJhdG9yUHJvdmlkZXJDbGFzczI7CkBAIC0zODEsNyArNDY3LDE2IEBACiAgICAgICAgIHNldFByb3YoKTsKICAgICAgICAgR2V0SW5zdGFuY2UwMygyKTsKICAgICB9Ci0KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZTA3KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewogICAgICAgICBLZXlQYWlyR2VuZXJhdG9yUHJvdmlkZXJDbGFzcyA9IEtleVBhaXJHZW5lcmF0b3JQcm92aWRlckNsYXNzMzsKQEAgLTM5MCw3ICs0ODUsMTYgQEAKICAgICAgICAgc2V0UHJvdigpOwogICAgICAgICBHZXRJbnN0YW5jZTAxKDMpOwogICAgIH0KLQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2UwOCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAogICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CkBAIC00MDAsNyArNTA0LDE2IEBACiAgICAgICAgIHNldFByb3YoKTsKICAgICAgICAgR2V0SW5zdGFuY2UwMigzKTsKICAgICB9Ci0KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2UwOSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewogICAgICAgICBLZXlQYWlyR2VuZXJhdG9yUHJvdmlkZXJDbGFzcyA9IEtleVBhaXJHZW5lcmF0b3JQcm92aWRlckNsYXNzMzsKQEAgLTQxMCw2ICs1MjMsMTUgQEAKICAgICAgICAgR2V0SW5zdGFuY2UwMygzKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZTEwKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewogICAgICAgICBLZXlQYWlyR2VuZXJhdG9yUHJvdmlkZXJDbGFzcyA9IEtleVBhaXJHZW5lcmF0b3JQcm92aWRlckNsYXNzNDsKQEAgLTQxOSw2ICs1NDEsMTUgQEAKICAgICAgICAgR2V0SW5zdGFuY2UwMSg0KTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlMTEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpAQCAtNDI5LDYgKzU2MCwxNSBAQAogICAgICAgICBHZXRJbnN0YW5jZTAyKDQpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZTEyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CiAgICAgICAgIEtleVBhaXJHZW5lcmF0b3JQcm92aWRlckNsYXNzID0gS2V5UGFpckdlbmVyYXRvclByb3ZpZGVyQ2xhc3M0OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yM1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvcjNUZXN0LmphdmEKaW5kZXggYzg5ODIwNy4uYjBhNWE0NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yM1Rlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3IzVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSwxMiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3I7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CkBAIC0zMSw4ICszNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3BpRW5nVXRpbHM7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhLZXlQYWlyR2VuZXJhdG9yLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgS2V5UGFpckdlbmVyYXRvciBjbGFzcwogICogCkBAIC05Myw2ICs5OCwxOSBAQAogICAgICAqIEFzc2VydGlvbjogS2V5UGFpckdlbmVyYXRvciB3YXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBpbnZvY2F0aW9uIAogICAgICAqIG9mIHRoZXNlIG1ldGhvZHMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUtleVBhaXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbktleVBhaXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuS2V5UGFpcjAxKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBpZiAoIURTQVN1cHBvcnRlZCkgewpAQCAtMTE5LDYgKzEzNywxOSBAQAogICAgICAqIG1ldGhvZHMKICAgICAgKiBBc3NlcnRpb246IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQgd2l0aG91dCBwcmV2aW91c2x5IGluaXRpYWxpemF0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVLZXlQYWlyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5LZXlQYWlyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdlbktleVBhaXIwMigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFEU0FTdXBwb3J0ZWQpIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvcjRUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3I0VGVzdC5qYXZhCmluZGV4IDdhYjQ1NjQuLmY2NDE3ZmIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvcjRUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yNFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwpAQCAtMjUsMTEgKzMwLDIxIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVB1YmxpY0tleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUGFyYW1zOwogCitAVGVzdFRhcmdldENsYXNzKEtleVBhaXJHZW5lcmF0b3IuY2xhc3MpCiBwdWJsaWMgY2xhc3MgS2V5UGFpckdlbmVyYXRvcjRUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IjZ2VuS2V5UGFpcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbktleVBhaXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dlbktleVBhaXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBnZW4gPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJEU0EiKTsKICAgICAgICAgZ2VuLmluaXRpYWxpemUoMTAyNCk7CkBAIC0zOSw2ICs1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IjZ2V0QWxnb3JpdGhtKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBbGdvcml0aG0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGFsZyA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkRTQSIpLmdldEFsZ29yaXRobSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImdldEFsZ29yaXRobSByZXR1cm5lZCB1bmV4cGVjdGVkIHZhbHVlIiwgIkRTQSIsIGFsZyk7CkBAIC00Nyw2ICs3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2Ygb3RoZXIgc3RyaW5nIHBhcmFtZXRlcnMgYW5kIGV4Y2VwdGlvbiBjYXNlcyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJEU0EiKTsKICAgICB9CkBAIC01NSw2ICs4OCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKIApAQCAtNzgsNiArMTIwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvciNnZXRQcm92aWRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm92aWRlciBwID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZSgiRFNBIikuZ2V0UHJvdmlkZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgicHJvdmlkZXIgaXMgbnVsbCIsIHApOwpAQCAtODYsNiArMTM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvciNpbml0aWFsaXplKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRpYWxpemVJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga2V5UGFpciA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkRTQSIpOwogICAgICAgICBrZXlQYWlyLmluaXRpYWxpemUoMTAyNCk7CkBAIC05NSw2ICsxNTUsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yI2luaXRpYWxpemUoaW50LAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdGlhbGl6ZUlMamF2YV9zZWN1cml0eV9TZWN1cmVSYW5kb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlQYWlyID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZSgiRFNBIik7CiAgICAgICAgIGtleVBhaXIuaW5pdGlhbGl6ZSgxMDI0LCBuZXcgU2VjdXJlUmFuZG9tKCkpOwpAQCAtMTA0LDYgKzE3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IjaW5pdGlhbGl6ZShqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdGlhbGl6ZUxqYXZhX3NlY3VyaXR5X3NwZWNfQWxnb3JpdGhtUGFyYW1ldGVyU3BlYygpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY3JlYXRlIERTQVBhcmFtcwpAQCAtMTIyLDYgKzIwMCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IjaW5pdGlhbGl6ZShqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYywKICAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0aWFsaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdGlhbGl6ZUxqYXZhX3NlY3VyaXR5X3NwZWNfQWxnb3JpdGhtUGFyYW1ldGVyU3BlY0xqYXZhX3NlY3VyaXR5X1NlY3VyZVJhbmRvbSgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY3JlYXRlIERTQVBhcmFtcwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yU3BpVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yU3BpVGVzdC5qYXZhCmluZGV4IGJjN2I5YjUuLjNjNzJhMGIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvclNwaVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3JTcGlUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKQEAgLTMyLDcgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5NeUtleVBhaXJHZW5lcmF0b3JTcGk7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5UGFpckdlbmVyYXRvclNwaS5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPktleVBhaXJHZW5lcmF0b3JTcGk8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KICAqIApAQCAtNTMsNiArNTgsMjggQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5LZXlQYWlyR2VuZXJhdG9yU3BpPC9jb2RlPiBjb25zdHJ1Y3RvciAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5UGFpckdlbmVyYXRvclNwaQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gYW5kIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gIiArCisgICAgICAgICAgICAgICAgICAiY2hlY2tpbmcgbWlzc2VkIGZvciBpbml0aWFsaXplIG1ldGhvZHMiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlQYWlyR2VuZXJhdG9yU3BpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUtleVBhaXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7QWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRpYWxpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlQYWlyR2VuZXJhdG9yU3BpMDEoKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCiAgICAgICAgICAgICBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpclRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UGFpclRlc3QuamF2YQppbmRleCA4ODY0ODM1Li4wMDcwZjEyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVBhaXJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlQYWlyVGVzdC5qYXZhCkBAIC0yMSwxNCArMjEsMTkgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCitAVGVzdFRhcmdldENsYXNzKCBLZXlQYWlyLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgZmllbGRzIGFuZCBtZXRob2RzIG9mIGNsYXNzIDxjb2RlPktleVBhaXI8L2NvZGU+CiAgKiAKQEAgLTc3LDYgKzgyLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIG5ldyA8Y29kZT5LZXlQYWlyPC9jb2RlPiBpbnN0YW5jZSB1c2luZyB2YWxpZAogICAgICAqIHBhcmFtZXRlcnMgKGJvdGggPGNvZGU+bnVsbDwvY29kZT4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdoZW4ganVzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5UGFpciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQdWJsaWNLZXkuY2xhc3MsIFByaXZhdGVLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RLZXlQYWlyMDEoKSB7CiAgICAgICAgIE9iamVjdCBrcCA9IG5ldyBLZXlQYWlyKG51bGwsIG51bGwpOwogICAgICAgICBhc3NlcnRUcnVlKGtwIGluc3RhbmNlb2YgS2V5UGFpcik7CkBAIC04OCw2ICsxMDIsMTUgQEAKICAgICAgKiBwYXJhbWV0ZXJzIChib3RoIHZhbGlkIGtleXMpCiAgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiB3aGVuIGp1c3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleVBhaXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHVibGljS2V5LmNsYXNzLCBQcml2YXRlS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0S2V5UGFpcjAyKCkgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0IGtwID0gbmV3IEtleVBhaXIoVGVzdEtleVBhaXIuZ2V0UHVibGljKCksIFRlc3RLZXlQYWlyLmdldFByaXZhdGUoKSk7CiAgICAgICAgIGFzc2VydFRydWUoa3AgaW5zdGFuY2VvZiBLZXlQYWlyKTsKQEAgLTk3LDYgKzEyMCwxNSBAQAogICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldFByaXZhdGUoKTwvY29kZT4gbWV0aG9kPGJyPgogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBwcml2YXRlIGtleSAoPGNvZGU+bnVsbDwvY29kZT4gaW4gdGhpcyBjYXNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaXZhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHJpdmF0ZTAxKCkgewogICAgICAgICBLZXlQYWlyIGtwID0gbmV3IEtleVBhaXIobnVsbCwgbnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoa3AuZ2V0UHJpdmF0ZSgpKTsKQEAgLTEwNyw2ICsxMzksMTUgQEAKICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgcHJpdmF0ZSBrZXkgKHZhbGlkIHByaXZhdGUga2V5IGluIHRoaXMgY2FzZSkKICAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpdmF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQcml2YXRlMDIoKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gewogICAgICAgICBQcml2YXRlS2V5IHBrID0gVGVzdEtleVBhaXIuZ2V0UHJpdmF0ZSgpOwogICAgICAgICBLZXlQYWlyIGtwID0gbmV3IEtleVBhaXIobnVsbCwgcGspOwpAQCAtMTE3LDYgKzE1OCwxNSBAQAogICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldFB1YmxpYygpPC9jb2RlPiBtZXRob2Q8YnI+CiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHB1YmxpYyBrZXkgKDxjb2RlPm51bGw8L2NvZGU+IGluIHRoaXMgY2FzZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHVibGljMDEoKSB7CiAgICAgICAgIEtleVBhaXIga3AgPSBuZXcgS2V5UGFpcihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbChrcC5nZXRQdWJsaWMoKSk7CkBAIC0xMjcsNiArMTc3LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHB1YmxpYyBrZXkgKHZhbGlkIHB1YmxpYyBrZXkgaW4gdGhpcyBjYXNlKQogICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHVibGljMDIoKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gewogICAgICAgICBQdWJsaWNLZXkgcGsgPSBUZXN0S2V5UGFpci5nZXRQdWJsaWMoKTsKICAgICAgICAgS2V5UGFpciBrcCA9IG5ldyBLZXlQYWlyKHBrLCBudWxsKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UmVwVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlSZXBUZXN0LmphdmEKaW5kZXggZTkwODFhZC4uMWYwM2MyMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlSZXBUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlSZXBUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVJlcDsKQEAgLTMwLDcgKzM1LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEtleVJlcC5jbGFzcykKIC8qKgogICogCiAgKiAKQEAgLTQyLDYgKzQ3LDE1IEBACiAgICAgICAgIGtleUZhY3RvcnlBbGdvcml0aG0gPSBTZWN1cml0eS5nZXRBbGdvcml0aG1zKCJLZXlGYWN0b3J5Iik7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5UmVwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RLZXlSZXAwMSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmV3IEtleVJlcChLZXlSZXAuVHlwZS5TRUNSRVQsICIiLCAiIiwgbmV3IGJ5dGVbXSB7fSkpOwpAQCAtNjIsNiArNzYsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleVJlcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0S2V5UmVwMDIoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgS2V5UmVwKG51bGwsICIiLCAiIiwgbmV3IGJ5dGVbXSB7fSk7CkBAIC04OSw2ICsxMTIsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlYWRSZXNvbHZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJlYWRSZXNvbHZlMDEoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgS2V5UmVwQ2hpbGQga3IgPSBuZXcgS2V5UmVwQ2hpbGQoS2V5UmVwLlR5cGUuU0VDUkVULCAiIiwgIiIsCiAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7fSk7CkBAIC0xMTYsNiArMTQ4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkUmVzb2x2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkUmVzb2x2ZTAyKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIEtleVJlcENoaWxkIGtyID0gbmV3IEtleVJlcENoaWxkKEtleVJlcC5UeXBlLlBVQkxJQywgIiIsICIiLAogICAgICAgICAgICAgICAgIG5ldyBieXRlW10ge30pOwpAQCAtMTQ0LDYgKzE4NSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZFJlc29sdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVhZFJlc29sdmUwMygpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewogICAgICAgICBLZXlSZXBDaGlsZCBrciA9IG5ldyBLZXlSZXBDaGlsZChLZXlSZXAuVHlwZS5QUklWQVRFLCAiIiwgIiIsCiAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7fSk7CkBAIC0xNzIsNiArMjIyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkUmVzb2x2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkUmVzb2x2ZTA0KCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChrZXlGYWN0b3J5QWxnb3JpdGhtLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGdldE5hbWUoKQpAQCAtMTkzLDYgKzI1MiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZFJlc29sdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVhZFJlc29sdmUwNSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewogICAgICAgICBpZiAoa2V5RmFjdG9yeUFsZ29yaXRobS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihnZXROYW1lKCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UmVwVHlwZVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5UmVwVHlwZVRlc3QuamF2YQppbmRleCA0MjRkZDFmLi41MWU5OTdmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVJlcFR5cGVUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlSZXBUeXBlVGVzdC5qYXZhCkBAIC0xNiwxMSArMTYsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UmVwOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5UmVwLmNsYXNzKQogcHVibGljIGNsYXNzIEtleVJlcFR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM0LDYgKzM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUjdmFsdWVPZihTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEtleVJlcC5UeXBlLnZhbHVlT2YoInR5cGUiKTsKQEAgLTU4LDYgKzcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUjdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlcygpIHsKICAgICAgICAgS2V5UmVwLlR5cGVbXSB0eXBlcyA9IG5ldyBLZXlSZXAuVHlwZVtdIHsgS2V5UmVwLlR5cGUuU0VDUkVULAogICAgICAgICAgICAgICAgIEtleVJlcC5UeXBlLlBVQkxJQywgS2V5UmVwLlR5cGUuUFJJVkFURSB9OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZTJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlMlRlc3QuamF2YQppbmRleCBjZTg5MjM4Li5mNzE0YTBiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlMlRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CkBAIC01NSw2ICs2MCw3IEBACiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfVGVzdFByb3ZpZGVyOwogCitAVGVzdFRhcmdldENsYXNzKEtleVN0b3JlLmNsYXNzKQogcHVibGljIGNsYXNzIEtleVN0b3JlMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIHN0YXRpYyBQcml2YXRlS2V5IHByaXZhdGVLZXk7CiAgICAgc3RhdGljIHsKQEAgLTE2OSw2ICsxNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNhbGlhc2VzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhbGlhc2VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hbGlhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuRW51bWVyYXRpb24KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5LZXlTdG9yZS5hbGlhc2VzKCkKQEAgLTIwNyw2ICsyMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNjb250YWluc0FsaWFzKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiS2V5U3RvcmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29udGFpbnNBbGlhcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNBbGlhc0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUuY29udGFpbnNBbGlhcyhqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMjMxLDYgKzI1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlI2dldENlcnRpZmljYXRlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiS2V5U3RvcmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENlcnRpZmljYXRlTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleVN0b3JlLmdldENlcnRpZmljYXRlKGphdmEubGFuZy5TdHJpbmcpCkBAIC0yNjQsNiArMjk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZ2V0Q2VydGlmaWNhdGVBbGlhcyhqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiS2V5U3RvcmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGVBbGlhcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDZXJ0aWZpY2F0ZUFsaWFzTGphdmFfc2VjdXJpdHlfY2VydF9DZXJ0aWZpY2F0ZSgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcKQEAgLTI5OSw2ICszNDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNnZXRDZXJ0aWZpY2F0ZUNoYWluKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiS2V5U3RvcmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGVDaGFpbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2VydGlmaWNhdGVDaGFpbkxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgW10KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5LZXlTdG9yZS5nZXRDZXJ0aWZpY2F0ZUNoYWluKGphdmEubGFuZy5TdHJpbmcpCkBAIC0zMzMsNiArMzg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXlTdG9yZQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleVN0b3JlLmdldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcpCkBAIC0zNDYsNyArNDA2LDE3IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sICIgKworICAgICAgICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXlTdG9yZQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleVN0b3JlLmdldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcpCkBAIC0zNjksNyArNDM5LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5Qcm92aWRlcikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9Qcm92aWRlcigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LktleVN0b3JlCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUuZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5Qcm92aWRlcikKQEAgLTM5OSw2ICs0NzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNnZXRLZXkoamF2YS5sYW5nLlN0cmluZywgY2hhcltdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIktleVN0b3JlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgY2hhcltdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEtleUxqYXZhX2xhbmdfU3RyaW5nJEMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXkKQEAgLTQzOCw3ICs1MjYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNnZXRQcm92aWRlcigpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm92aWRlcigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRQcm92aWRlcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5LZXlTdG9yZS5nZXRQcm92aWRlcigpCiAgICAgICAgIHRyeSB7CkBAIC00NTcsNyArNTU0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZ2V0VHlwZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0VHlwZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgamF2YS5zZWN1cml0eS5LZXlTdG9yZS5nZXRUeXBlKCkKICAgICAgICAgdHJ5IHsKIApAQCAtNDc2LDYgKzU4MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlI2lzQ2VydGlmaWNhdGVFbnRyeShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIktleVN0b3JlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQ2VydGlmaWNhdGVFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNDZXJ0aWZpY2F0ZUVudHJ5TGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5LZXlTdG9yZS5pc0NlcnRpZmljYXRlRW50cnkoamF2YS5sYW5nLlN0cmluZykKQEAgLTUwMSw2ICs2MTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNpc0tleUVudHJ5KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiS2V5U3RvcmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNLZXlFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNLZXlFbnRyeUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUuaXNLZXlFbnRyeShqYXZhLmxhbmcuU3RyaW5nKQpAQCAtNTI1LDcgKzY0OSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlI2xvYWQoamF2YS5pby5JbnB1dFN0cmVhbSwgY2hhcltdKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtJEMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2FkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzLCBjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSRDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUubG9hZChqYXZhLmlvLklucHV0U3RyZWFtLAogICAgICAgICAvLyBjaGFyIFtdKQogICAgICAgICBieXRlW10ga2V5U3RvcmUgPSBjcmVhdENlcnRpZmljYXRlKCk7CkBAIC01NjUsNiArNjk4LDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjbG9hZChLZXlTdG9yZS5Mb2FkU3RvcmVQYXJhbWV0ZXIgcGFyYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIgKworICAgICAgICAgICAgICAgICAgIiBhbmQgbm9uIG51bGwgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXlTdG9yZS5Mb2FkU3RvcmVQYXJhbWV0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9hZExqYXZhX3NlY3VyaXR5X0tleVN0b3JlTG9hZFN0b3JlUGFyYW1ldGVyKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgS2V5U3RvcmUga2V5VGVzdCA9IEtleVN0b3JlLmdldEluc3RhbmNlKEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOwpAQCAtNTgwLDYgKzcyNCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlI3NldENlcnRpZmljYXRlRW50cnkoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIktleVN0b3JlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENlcnRpZmljYXRlRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBDZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRDZXJ0aWZpY2F0ZUVudHJ5TGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9jZXJ0X0NlcnRpZmljYXRlKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZApAQCAtNjA3LDYgKzc2MCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlI3NldEtleUVudHJ5KGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuS2V5LCBjaGFyW10sIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIktleVN0b3JlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEtleUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGNoYXJbXS5jbGFzcywgQ2VydGlmaWNhdGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRLZXlFbnRyeUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfS2V5JEMkTGphdmFfc2VjdXJpdHlfY2VydF9DZXJ0aWZpY2F0ZSgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKIApAQCAtNjI5LDYgKzc5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlI3NpemUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIktleVN0b3JlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnNlY3VyaXR5LktleVN0b3JlLnNpemUoKQogCkBAIC02NTMsNyArODI0LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZGVsZXRlRW50cnkoU3RyaW5nKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlRW50cnkoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiS2V5U3RvcmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVsZXRlRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9kZWxldGVFbnRyeSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEtleVN0b3JlIGtleVRlc3QgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKICAgICAgICAgICAgIGtleVRlc3QubG9hZChudWxsLCBudWxsKTsKQEAgLTcxMSw2ICs4OTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNnZXRDcmVhdGlvbkRhdGUoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIktleVN0b3JlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENyZWF0aW9uRGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3JlYXRpb25EYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyB0eXBlID0gIkRTQSI7CiAKQEAgLTc4MCw3ICs5NjksMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNnZXREZWZhdWx0VHlwZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0VHlwZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXREZWZhdWx0VHlwZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqa3MiLCBLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKICAgICB9CiAKQEAgLTc4OCw3ICs5ODYsMTcgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNnZXRFbnRyeShTdHJpbmcsCiAgICAgICogICAgICAgIEtleVN0b3JlLlByb3RlY3Rpb25QYXJhbWV0ZXIpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRyeSgpIHsKKyAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAiS2V5U3RvcmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LktleVN0b3JlLlByb3RlY3Rpb25QYXJhbWV0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEVudHJ5KCkgewogICAgICAgICBTdHJpbmcgdHlwZSA9ICJEU0EiOwogICAgICAgICBLZXlTdG9yZSBrZXlUZXN0ID0gbnVsbDsKICAgICAgICAgS2V5U3RvcmUuUGFzc3dvcmRQcm90ZWN0aW9uIHBwID0gbnVsbDsKQEAgLTg1Nyw3ICsxMDY1LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjc2V0RW50cnkoU3RyaW5nLCBLZXlTdG9yZS5FbnRyeSwKICAgICAgKiAgICAgICAgS2V5U3RvcmUuUHJvdGVjdGlvblBhcmFtZXRlcikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVudHJ5KCkgeworICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5LZXlTdG9yZS5FbnRyeS5jbGFzcywgamF2YS5zZWN1cml0eS5LZXlTdG9yZS5Qcm90ZWN0aW9uUGFyYW1ldGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zZXRFbnRyeSgpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSAiRFNBIjsKICAgICAgICAgS2V5U3RvcmUga2V5VGVzdCA9IG51bGw7CiAgICAgICAgIEtleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbiBwcCA9IG51bGw7CkBAIC05NTgsNiArMTE3NSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlLmVudHJ5SW5zdGFuY2VPZihTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcwogICAgICAqIEVudHJ5PikKICAgICAgKi8KKyAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uLCBLZXlTdG9yZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeUluc3RhbmNlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBDbGFzcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbnRyeUluc3RhbmNlT2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOwpAQCAtOTgzLDYgKzEyMDksMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSNzdG9yZShLZXlTdG9yZS5Mb2FkU3RvcmVQYXJhbWV0ZXIpCiAgICAgICovCisgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEtleVN0b3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdG9yZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleVN0b3JlLkxvYWRTdG9yZVBhcmFtZXRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdG9yZV9qYXZhX3NlY3VyaXR5S2V5U3RvcmVfTG9hZFN0b3JlUGFyYW1ldGVyKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOwpAQCAtOTk4LDEyICsxMjM0LDIyIEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjc3RvcmUoT3V0cHV0U3RyZWFtLCBjaGFyW10pCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9zdG9yZV9qYXZhX2lvX091dHB1dFN0cmVhbV9jaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sICIgKworICAgICAgICAgICAgICAgICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3N0b3JlX2phdmFfaW9fT3V0cHV0U3RyZWFtX2NoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKICAgICAgICAga2V5U3RvcmUubG9hZChudWxsLCAicHdkIi50b0NoYXJBcnJheSgpKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGtleVN0b3JlLnN0b3JlKG51bGwsICJwd2QiLnRvQ2hhckFycmF5KCkpOwotICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlM1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUzVGVzdC5qYXZhCmluZGV4IGI2Yzg3YjkuLjk4Njk0NDYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUzVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUzVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0zNyw3ICs0Miw3IEBACiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEtleVN0b3JlLmNsYXNzKQogcHVibGljIGNsYXNzIEtleVN0b3JlM1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgcHJpdmF0ZSBLZXlTdG9yZSBtb2NrS2V5U3RvcmU7CkBAIC03MiwxMSArNzcsMjkgQEAKICAgICAgICAgY2VydGlmaWNhdGUgPSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGNlcnRBcnJheSk7CiAgICAgfQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1ldGhvZCB3aXRoIG51bGwgcGFyYW1ldGVyIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9hZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleVN0b3JlLkxvYWRTdG9yZVBhcmFtZXRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIE5vIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIG91dC4KICAgICAgICAgbW9ja0tleVN0b3JlLmxvYWQobnVsbCk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWV0aG9kIHdpdGggbnVsbCBwYXJhbWV0ZXIgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5U3RvcmUuTG9hZFN0b3JlUGFyYW1ldGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtb2NrS2V5U3RvcmUuc3RvcmUobnVsbCk7CkBAIC05MCwxOCArMTEzLDQ1IEBACiAgICAgICAgIG1vY2tLZXlTdG9yZS5zdG9yZShudWxsKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtZXRob2Qgd2l0aCBhbGwgbnVsbCBwYXJhbWV0ZXJzIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRLZXlFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIEtleS5jbGFzcywgY2hhcltdLmNsYXNzLCBDZXJ0aWZpY2F0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEtleUVudHJ5X251bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0tleVN0b3JlLmxvYWQobnVsbCwgbnVsbCk7IAogICAgICAgICAvLyBObyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBvdXQuCiAgICAgICAgIG1vY2tLZXlTdG9yZS5zZXRLZXlFbnRyeShudWxsLCBudWxsLCBudWxsLCBudWxsKTsgICAgICAgIAogICAgIH0KICAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtZXRob2Qgd2l0aCBudWxsIHBhcmFtZXRlcnMgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEtleUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgS2V5LmNsYXNzLCBjaGFyW10uY2xhc3MsIENlcnRpZmljYXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0S2V5RW50cnlfa2V5X2lzX251bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0tleVN0b3JlLmxvYWQobnVsbCwgbnVsbCk7CiAgICAgICAgIC8vIE5vIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIG91dC4KICAgICAgICAgbW9ja0tleVN0b3JlLnNldEtleUVudHJ5KCJBbGlhcyIsIG51bGwsIG51bGwsIG5ldyBDZXJ0aWZpY2F0ZVtde2NlcnRpZmljYXRlfSk7ICAgICAgICAKICAgICB9CiAgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWV0aG9kIHdpdGggbnVsbCBwYXJhbWV0ZXJzIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0S2V5RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBLZXkuY2xhc3MsIGNoYXJbXS5jbGFzcywgQ2VydGlmaWNhdGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRLZXlFbnRyeV9rZXlfaXNfcHJpdmF0ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtb2NrS2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKICAgICAgICAgS2V5IGtleSA9IGtleVBhaXIuZ2V0UHJpdmF0ZSgpOwpAQCAtMTIzLDYgKzE3MywxNSBAQAogICAgICAgICBtb2NrS2V5U3RvcmUuc2V0S2V5RW50cnkoIkFsaWFzIiwga2V5LCBudWxsLCBuZXcgQ2VydGlmaWNhdGVbXXtjZXJ0aWZpY2F0ZX0pOyAgICAgICAgCiAgICAgfQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG1ldGhvZCB3aXRoIG51bGwgcGFyYW1ldGVycyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEtleUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgS2V5LmNsYXNzLCBjaGFyW10uY2xhc3MsIENlcnRpZmljYXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0S2V5RW50cnlfa2V5X2lzX3B1YmxpYygpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIG1vY2tLZXlTdG9yZS5sb2FkKG51bGwsIG51bGwpOwpAQCAtMTMzLDYgKzE5MiwxNSBAQAogICAgICAgICBtb2NrS2V5U3RvcmUuc2V0S2V5RW50cnkoIkFsaWFzMyIsIGtleSwgbnVsbCwgbmV3IENlcnRpZmljYXRlW117Y2VydGlmaWNhdGV9KTsKICAgICB9CiAgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWV0aG9kIHdpdGggbnVsbCBwYXJhbWV0ZXJzIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2VydGlmaWNhdGVFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIENlcnRpZmljYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENlcnRpZmljYXRlRW50cnlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtb2NrS2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKIApAQCAtMTQzLDcgKzIxMSwxNiBAQAogICAgICAgICBtb2NrS2V5U3RvcmUuc2V0Q2VydGlmaWNhdGVFbnRyeSgiQWxpYXMiLCBudWxsKTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zdG9yZV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbWV0aG9kIHdpdGggbnVsbCBwYXJhbWV0ZXJzIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdG9yZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPdXRwdXRTdHJlYW0uY2xhc3MsIGNoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3Rfc3RvcmVfbnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtb2NrS2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKICAgICAgICAgbW9ja0tleVN0b3JlLnN0b3JlKG51bGwsIG51bGwpOwogICAgIH0KQEAgLTIyNCwyMCArMzAxLDE5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgaW50IGVuZ2luZVNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcHVibGljIGludCBlbmdpbmVTaXplKCkgeyAKKyAgICAgICAgICAgIHJldHVybiAwOyAKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZ2luZVN0b3JlKEtleVN0b3JlLkxvYWRTdG9yZVBhcmFtZXRlciBwYXJhbSl7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIHB1YmxpYyB2b2lkIGVuZ2luZVN0b3JlKEtleVN0b3JlLkxvYWRTdG9yZVBhcmFtZXRlciBwYXJhbSl7IAorICAgICAgICAgICAgcmV0dXJuOyAKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZ2luZVN0b3JlKE91dHB1dFN0cmVhbSBhcmcwLCBjaGFyW10gYXJnMSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIHB1YmxpYyB2b2lkIGVuZ2luZVN0b3JlKE91dHB1dFN0cmVhbSBhcmcwLCBjaGFyW10gYXJnMSkgCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRXhjZXB0aW9uIHsgCisgICAgICAgICAgICByZXR1cm47IAogICAgICAgICB9ICAgICAgICAKICAgICB9ICAgIAogCiB9Ci0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVCdWlsZGVyVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZUJ1aWxkZXJUZXN0LmphdmEKaW5kZXggMTlmNjM5OC4uYmExNDY4ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZUJ1aWxkZXJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZUJ1aWxkZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zNCw3ICszOSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQudG1wQ2FsbGJhY2tIYW5kbGVyOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEtleVN0b3JlLmNsYXNzKQogcHVibGljIGNsYXNzIEtleVN0b3JlQnVpbGRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNzAsOCArNzUsMTcgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIHRlc3QgZm9yIG1ldGhvZCBuZXdJbnN0YW5jZShLZXlTdG9yZSwgS2V5U3RvcmUuUHJvdGVjdGlvblBhcmFtZXRlcikgCisgICAgICogdGVzdCBmb3IgY29uc3RydWN0b3IgS2V5U3RvcmVCdWlsZGVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleVN0b3JlQnVpbGRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBLZXlTdG9yZUJ1aWxkZXIoKTsKQEAgLTgzLDYgKzk3LDE1IEBACiAgICAgLyoKICAgICAgKiB0ZXN0IGZvciBtZXRob2QgbmV3SW5zdGFuY2UoS2V5U3RvcmUsIEtleVN0b3JlLlByb3RlY3Rpb25QYXJhbWV0ZXIpIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleVN0b3JlLmNsYXNzLCBqYXZhLnNlY3VyaXR5LktleVN0b3JlLlByb3RlY3Rpb25QYXJhbWV0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUtleVN0b3JlUHJvdGVjdGlvblBhcmFtZXRlcigpCiAgICAgICAgICAgICB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gewpAQCAtMTk5LDcgKzIyMiwxNiBAQAogICAgICAqIFByb3RlY3Rpb25QYXJhbWV0ZXIgd2hpY2ggaXMgdXNlZCBpbiBuZXdJbnN0YW5jZSguLi4pCiAgICAgICogCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlU3RyaW5nUHJvdmlkZXJGaWxlUHJvdGVjdGlvblBhcmFtZXRlcigpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld0luc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzcywgamF2YS5pby5GaWxlLmNsYXNzLCBqYXZhLnNlY3VyaXR5LktleVN0b3JlLlByb3RlY3Rpb25QYXJhbWV0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0TmV3SW5zdGFuY2VTdHJpbmdQcm92aWRlckZpbGVQcm90ZWN0aW9uUGFyYW1ldGVyKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAKICAgICAgICAgRmlsZSBmbCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIktTQnVpbGRlcl9JbXBsVGVzdCIsICJrZXlzdG9yZSIpOwpAQCAtMzUxLDYgKzM4MywxNSBAQAogICAgICAqIHdoZW4gYWxpYXMgaXMgbm90IGF2YWlsYWJsZQogICAgICAqIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdJbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3MsIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUuUHJvdGVjdGlvblBhcmFtZXRlci5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlU3RyaW5nUHJvdmlkZXJQcm90ZWN0aW9uUGFyYW1ldGVyKCkKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uMlRlc3QuamF2YQppbmRleCAxNWUwMzk5Li4zYzYyYTM4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uMlRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEtleVN0b3JlRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIEtleVN0b3JlRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb24jS2V5U3RvcmVFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uKCkKICAgICAgICAgS2V5U3RvcmVFeGNlcHRpb24gZSA9IG5ldyBLZXlTdG9yZUV4Y2VwdGlvbigpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbiNLZXlTdG9yZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggb25lIHZhcmlhbnQgb2Ygc3RyaW5nIHBhcmFtZXRlciIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleVN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBLZXlTdG9yZUV4Y2VwdGlvbiBlID0gbmV3IEtleVN0b3JlRXhjZXB0aW9uKCJ0ZXN0IG1lc3NhZ2UiKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDY3ZTdjNmMuLjcwNGIzMWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMjEsMTEgKzIxLDE2IEBACiAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCitAVGVzdFRhcmdldENsYXNzKEtleVN0b3JlRXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+S2V5U3RvcmVFeGNlcHRpb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KICAqIApAQCAtNTUsNiArNjAsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5LZXlTdG9yZUV4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CiAgICAgICogY29uc3RydWN0cyBLZXlTdG9yZUV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleVN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlRXhjZXB0aW9uMDEoKSB7CiAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uIHRFID0gbmV3IEtleVN0b3JlRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CkBAIC02Niw2ICs4MCwxNSBAQAogICAgICAqIGNvbnN0cnVjdHMgS2V5U3RvcmVFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuIFBhcmFtZXRlcgogICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiS2V5U3RvcmVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U3RvcmVFeGNlcHRpb24wMigpIHsKICAgICAgICAgS2V5U3RvcmVFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtODAsNiArMTAzLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+S2V5U3RvcmVFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgogICAgICAqIGNvbnN0cnVjdHMgS2V5U3RvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlTdG9yZUV4Y2VwdGlvbjAzKCkgewogICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKICAgICAgICAgS2V5U3RvcmVFeGNlcHRpb24gdEUgPSBuZXcgS2V5U3RvcmVFeGNlcHRpb24obXNnKTsKQEAgLTkxLDYgKzEyMywxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPktleVN0b3JlRXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yCiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEtleVN0b3JlRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlTdG9yZUV4Y2VwdGlvbjA0KCkgewogICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOwogICAgICAgICBLZXlTdG9yZUV4Y2VwdGlvbiB0RSA9IG5ldyBLZXlTdG9yZUV4Y2VwdGlvbihjYXVzZSk7CkBAIC0xMDMsNiArMTQ0LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEtleVN0b3JlRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdAogICAgICAqIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlTdG9yZUV4Y2VwdGlvbjA1KCkgewogICAgICAgICBLZXlTdG9yZUV4Y2VwdGlvbiB0RSA9IG5ldyBLZXlTdG9yZUV4Y2VwdGlvbih0Q2F1c2UpOwogICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKQEAgLTEyMSw2ICsxNzEsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5U3RvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAogICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleVN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U3RvcmVFeGNlcHRpb24wNigpIHsKICAgICAgICAgS2V5U3RvcmVFeGNlcHRpb24gdEUgPSBuZXcgS2V5U3RvcmVFeGNlcHRpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTEzMiw2ICsxOTEsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5U3RvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAogICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlRXhjZXB0aW9uMDcoKSB7CiAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKQEAgLTE0Nyw2ICsyMTUsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgS2V5U3RvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90CiAgICAgICogbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlRXhjZXB0aW9uMDgoKSB7CiAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uIHRFID0gbmV3IEtleVN0b3JlRXhjZXB0aW9uKG51bGwsIHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTY1LDYgKzI0MiwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBLZXlTdG9yZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QKICAgICAgKiBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlRXhjZXB0aW9uMDkoKSB7CiAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVTcGlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlU3BpVGVzdC5qYXZhCmluZGV4IDc2YjI5NjYuLmZiNjg4MjMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVTcGlUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZVNwaVRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CkBAIC00Myw3ICs0OCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuTXlMb2FkU3RvcmVQYXJhbXM7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5U3RvcmVTcGkuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5LZXlTdG9yZVNwaTwvY29kZT4gY29uc3RydWN0b3IgYW5kIG1ldGhvZHMKICAqIApAQCAtNjQsNyArNjksMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZS5lbmdpbmVFbnRyeUluc3RhbmNlT2YoU3RyaW5nLCBDbGFzczw/CiAgICAgICogZXh0ZW5kcyBFbnRyeT4pCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9lbmdpbmVFbnRyeUluc3RhbmNlT2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBudWxsIHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lRW50cnlJbnN0YW5jZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgQ2xhc3MuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2VuZ2luZUVudHJ5SW5zdGFuY2VPZigpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIEtleVN0b3JlU3BpIGtzU3BpID0gbmV3IE15S2V5U3RvcmVTcGkoKTsKIApAQCAtODksNiArMTAzLDI4IEBACiAgICAgICogbnVsbCBlbnRyeTsgZW5naW5lU3RvcmUoLi4pIHRocm93cyBVbmV4cGVjdGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogICAgICAqIGVuZ2luZVNldEVudHJ5KC4uKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gb3IgTnVsbFBvaW50ZXJFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICIxLiBWZXJpZmljYXRpb24gb2YgZXhjZXB0aW9uIGNhc2VzIG1pc3NlZCBmb3Igc29tZSBtZXRob2RzLiAiICsKKyAgICAgICAgICAgICAgICAgICIyLiBWZXJpZmljYXRpb24gZm9yIGFsbCBub24gbnVsbCBwYXJhbWV0ZXJzIG1pc3NlZCBmb3IgYWxsIG1ldGhvZHMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lTG9hZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtLZXlTdG9yZS5Mb2FkU3RvcmVQYXJhbWV0ZXIuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lU3RvcmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7S2V5U3RvcmUuTG9hZFN0b3JlUGFyYW1ldGVyLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZ2luZUdldEVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgS2V5U3RvcmUuUHJvdGVjdGlvblBhcmFtZXRlci5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVTZXRFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIEtleVN0b3JlLkVudHJ5LmNsYXNzLCBLZXlTdG9yZS5Qcm90ZWN0aW9uUGFyYW1ldGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U3RvdGVTcGkwMSgpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgQ2VydGlmaWNhdGVFeGNlcHRpb24sCiAgICAgICAgICAgICBVbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb24sIEtleVN0b3JlRXhjZXB0aW9uIHsKQEAgLTEzMCw2ICsxNjYsMzEgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5LZXlTdG9yZVNwaSgpPC9jb2RlPiBjb25zdHJ1Y3RvciBhbmQgYWJzdHJhY3QgZW5naW5lCiAgICAgICogbWV0aG9kcy4gQXNzZXJ0aW9uOiBjcmVhdGVzIG5ldyBLZXlTdG9yZVNwaSBvYmplY3QuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIHBvc2l0aXZlIGNhc2UgZm9yIGFsbCBtZXRob2RzIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZ2luZVNldEtleUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5LZXkuY2xhc3MsIGNoYXJbXS5jbGFzcywgQ2VydGlmaWNhdGVbXS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVTZXRLZXlFbnRyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGJ5dGVbXS5jbGFzcywgQ2VydGlmaWNhdGVbXS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVTZXRDZXJ0aWZpY2F0ZUVudHJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgQ2VydGlmaWNhdGUuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lRGVsZXRlRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZ2luZVN0b3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uT3V0cHV0U3RyZWFtLmNsYXNzLCBjaGFyW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlTdG90ZVNwaTAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKICAgICAgICAgS2V5U3RvcmVTcGkga3NTcGkgPSBuZXcgTXlLZXlTdG9yZVNwaSgpOwpAQCAtMTc1LDYgKzIzNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlU3BpI2VuZ2luZUxvYWQoS2V5U3RvcmUuTG9hZFN0b3JlUGFyYW1ldGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVMb2FkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0tleVN0b3JlLkxvYWRTdG9yZVBhcmFtZXRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbmdpbmVMb2FkTGphdmFfc2VjdXJpdHlfS2V5U3RvcmVfTG9hZFN0b3JlUGFyYW1ldGVyKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlTdG9yZVRlc3QuamF2YQppbmRleCBiZjcwNDc1Li5hYjk1Nzc1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVN0b3JlVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5U3RvcmVUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKQEAgLTQ4LDcgKzUzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhLZXlTdG9yZS5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPktleVN0b3JlPC9jb2RlPiBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcwogICogCkBAIC0xMDYsNiArMTExLDE1IEBACiAgICAgICogbWV0aG9kcyAKICAgICAgKiBBc3NlcnRpb25zOiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcGFyYW0gaXMgbnVsbDsKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxvYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5LZXlTdG9yZS5Mb2FkU3RvcmVQYXJhbWV0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkU3RvcmUwMigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKE5vdFN1cHBvcnRNc2csIEtTU3VwcG9ydGVkKTsKIApAQCAtMTQyLDYgKzE1NiwxNSBAQAogICAgICAqIG1ldGhvZCAKICAgICAgKiBBc3NlcnRpb246IHN0b3JlcyBLZXlFbnRyeS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0S2V5RW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3MsIENlcnRpZmljYXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRLZXlFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKE5vdFN1cHBvcnRNc2csIEtTU3VwcG9ydGVkKTsKICAgICAgICAgCkBAIC0xODIsNiArMjA1LDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0RGVmYXVsdFR5cGUoKTwvY29kZT4gbWV0aG9kIEFzc2VydGlvbjogcmV0dXJucwogICAgICAqIGRlZmF1bHQgc2VjdXJpdHkga2V5IHN0b3JlIHR5cGUgb3IgImprcyIgc3RyaW5nCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlMDEoKSB7CiAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9ICJrZXlzdG9yZS50eXBlIjsKICAgICAgICAgU3RyaW5nIGRlZktTVHlwZSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KHByb3BOYW1lKTsKQEAgLTIxMCw2ICsyNDIsMTUgQEAKICAgICAgKiB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gd2hlbiB0eXBlIGlzIG5vdCBhdmFpbGFibGUKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCB2YWxpZCBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U3RvcmUwMigpIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZ1tdIGludmFsaWRWYWx1ZXMgPSAgU3BpRW5nVXRpbHMuaW52YWxpZFZhbHVlczsKICAgICAgICAgdHJ5IHsKQEAgLTIzMCw3ICsyNzEsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNlY3VyaXR5LktleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbi5nZXRQYXNzd29yZCgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlUFBHZXRQYXNzd29yZCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUGFzc3dvcmRQcm90ZWN0aW9uLmdldFBhc3N3b3JkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RLZXlTdG9yZVBQR2V0UGFzc3dvcmQoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTUzOQogICAgICAgICAvLyBubyBleGNlcHRpb24gZXhwZWN0ZWQKICAgICAgICAgYXNzZXJ0TnVsbChuZXcgS2V5U3RvcmUuUGFzc3dvcmRQcm90ZWN0aW9uKG51bGwpLmdldFBhc3N3b3JkKCkpOwpAQCAtMjQxLDEyICsyOTEsMTggQEAKICAgICAgICAgCiAgICAgfQogCi0KLSAgICAKLQogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlLlRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5LnRvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5LnRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlVENUb1N0cmluZygpIHsKICAgICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xNTQyCiAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiBleHBlY3RlZApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVRlc3QuamF2YQppbmRleCA0ZjNmNThhLi4yMWE5YmI0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleVRlc3QuamF2YQpAQCAtMjEsMTEgKzIxLDE2IEBACiAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhLZXkuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5LZXk8L2NvZGU+IGNsYXNzIGZpZWxkCiAgKiAKQEAgLTQ1LDYgKzUwLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4gZmllbGQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRmllbGQgdGVzdGluZyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNlcmlhbFZlcnNpb25VSUQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGQoKSB7CiAgICAgICAgIGNoZWNrS2V5IG1rID0gbmV3IGNoZWNrS2V5KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNlcmlhbFZlcnNpb25VSUQiLCBtay5nZXRTZXJWZXJVSUQoKSwgLy9LZXkuc2VyaWFsVmVyc2lvblVJRCwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdDFUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QxVGVzdC5qYXZhCmluZGV4IDJjMTRhN2QuLmE0OWQwM2UgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdDFUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0MVRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwpAQCAtMjUsNiArMzAsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuTXlNZXNzYWdlRGlnZXN0MTsKIAorQFRlc3RUYXJnZXRDbGFzcyhNZXNzYWdlRGlnZXN0LmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+TWVzc2FnZURpZ2VzdDwvY29kZT4gY29uc3RydWN0b3IgYW5kIG1ldGhvZHMKICAqLwpAQCAtMzMsNiArMzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I3Jlc2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewogICAgICAgICBNeU1lc3NhZ2VEaWdlc3QxIG1kID0gbmV3IE15TWVzc2FnZURpZ2VzdDEoIkFCQyIpOwogICAgICAgICBtZC5yZXNldCgpOwpAQCAtNDIsNiArNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I3VwZGF0ZShieXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91cGRhdGVMQigpIHsKICAgICAgICAgTXlNZXNzYWdlRGlnZXN0MSBtZCA9IG5ldyBNeU1lc3NhZ2VEaWdlc3QxKCJBQkMiKTsKICAgICAgICAgbWQudXBkYXRlKChieXRlKSAxKTsKQEAgLTUxLDYgKzc1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCN1cGRhdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDYXNlIHdoZW4gbGVuIDwgb2Zmc2V0IG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZUxCJExJTEkoKSB7CiAgICAgICAgIE15TWVzc2FnZURpZ2VzdDEgbWQgPSBuZXcgTXlNZXNzYWdlRGlnZXN0MSgiQUJDIik7CiAgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IHsgMSwgMiwgMywgNCwgNSB9OwpAQCAtOTUsNiArMTI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCN1cGRhdGUoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZUxCJCgpIHsKICAgICAgICAgTXlNZXNzYWdlRGlnZXN0MSBtZCA9IG5ldyBNeU1lc3NhZ2VEaWdlc3QxKCJBQkMiKTsKICAgICAgICAgYnl0ZVtdIGIgPSB7IDEsIDIsIDMsIDQsIDUgfTsKQEAgLTEwNSw2ICsxNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I3VwZGF0ZShCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91cGRhdGVMamF2YV9uaW9fQnl0ZUJ1ZmZlcigpIHsKICAgICAgICAgTXlNZXNzYWdlRGlnZXN0MSBtZCA9IG5ldyBNeU1lc3NhZ2VEaWdlc3QxKCJBQkMiKTsKICAgICAgICAgYnl0ZVtdIGIgPSB7IDEsIDIsIDMsIDQsIDUgfTsKQEAgLTEyMCw2ICsxNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I2RpZ2VzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpZ2VzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGlnZXN0KCkgewogICAgICAgICBNeU1lc3NhZ2VEaWdlc3QxIG1kID0gbmV3IE15TWVzc2FnZURpZ2VzdDEoIkFCQyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImluY29ycmVjdCByZXN1bHQiLCAwLCBtZC5kaWdlc3QoKS5sZW5ndGgpOwpAQCAtMTI5LDYgKzE4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjZGlnZXN0KGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlnZXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kaWdlc3RMQiQoKSB7CiAgICAgICAgIE15TWVzc2FnZURpZ2VzdDEgbWQgPSBuZXcgTXlNZXNzYWdlRGlnZXN0MSgiQUJDIik7CiAgICAgICAgIGJ5dGVbXSBiID0geyAxLCAyLCAzLCA0LCA1IH07CkBAIC0xMzksNiArMjA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCNkaWdlc3QoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEaWdlc3RFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlnZXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGlnZXN0TEIkTElMSSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNeU1lc3NhZ2VEaWdlc3QxIG1kID0gbmV3IE15TWVzc2FnZURpZ2VzdDEoIkFCQyIpOwogICAgICAgICBieXRlW10gYiA9IHsgMSwgMiwgMywgNCwgNSB9OwpAQCAtMTg1LDYgKzI2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjaXNFcXVhbChieXRlW10sYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VxdWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1YWxMQiRMQiQoKSB7CiAgICAgICAgIGJ5dGVbXSBiMSA9IHsgMSwgMiwgMywgNCB9OwogICAgICAgICBieXRlW10gYjIgPSB7IDEsIDIsIDMsIDQsIDUgfTsKQEAgLTE5OSw2ICsyODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I2dldEFsZ29yaXRobSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICBNeU1lc3NhZ2VEaWdlc3QxIG1kID0gbmV3IE15TWVzc2FnZURpZ2VzdDEoIkFCQyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkFCQyIsIG1kLmdldEFsZ29yaXRobSgpKTsKQEAgLTIwNyw2ICszMDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I2dldFByb3ZpZGVyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3ZpZGVyKCkgewogICAgICAgICBNeU1lc3NhZ2VEaWdlc3QxIG1kID0gbmV3IE15TWVzc2FnZURpZ2VzdDEoIkFCQyIpOwogICAgICAgICBhc3NlcnROdWxsKG1kLmdldFByb3ZpZGVyKCkpOwpAQCAtMjE1LDYgKzMyMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjZ2V0RGlnZXN0TGVuZ3RoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGlnZXN0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREaWdlc3RMZW5ndGgoKSB7CiAgICAgICAgIE15TWVzc2FnZURpZ2VzdDEgbWQgPSBuZXcgTXlNZXNzYWdlRGlnZXN0MSgiQUJDIik7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBtZC5nZXREaWdlc3RMZW5ndGgoKSk7CkBAIC0yMjMsNiArMzM3LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgU0hBIE1lc3NhZ2VEaWdlc3QgcHJvdmlkZXIKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U0hBUHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTWVzc2FnZURpZ2VzdCBtZCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQSIpOwogICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtdIHsgMSwgMSwgMSwgMSwgMSB9OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0MlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdDJUZXN0LmphdmEKaW5kZXggN2UwNDNhYS4uNWYwYmM0NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0MlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMCw2ICszNSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTWVzc2FnZURpZ2VzdC5jbGFzcykKIHB1YmxpYyBjbGFzcyBNZXNzYWdlRGlnZXN0MlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VESUdFU1RfSUQgPSAiTWVzc2FnZURpZ2VzdC4iOwpAQCAtNjIsNiArNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I01lc3NhZ2VEaWdlc3QoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTWVzc2FnZURpZ2VzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3IoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0QWxncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgTWVzc2FnZURpZ2VzdFN0dWIgbWQgPSBuZXcgTWVzc2FnZURpZ2VzdFN0dWIoZGlnZXN0QWxnc1tpXSk7CkBAIC03NCw2ICs4OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0QWxncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTIyMSw2ICsyNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I2RpZ2VzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRpZ2VzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGlnZXN0KCkgewogICAgICAgICBNZXNzYWdlRGlnZXN0IHNoYSA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0yNjcsNiArMzAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCNkaWdlc3QoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkaWdlc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2RpZ2VzdCRCKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2VzdEFsZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0yODUsNiArMzI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCNkaWdlc3QoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgZGlmZmVyZW50IHZhcmlhbnRzIG9mIG9mZnNldCBhbmQgbGVuIHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGlnZXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZGlnZXN0JEJJSSgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdlc3RBbGdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzE4LDYgKzM2OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjdXBkYXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIGRpZmZlcmVudCB2YXJpYW50cyBvZiBvZmZzZXQgYW5kIGxlbiBwYXJhbWV0ZXJzIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZSRCSUkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEiKS51cGRhdGUobmV3IGJ5dGVbXSB7fSwKQEAgLTMzMiw2ICszOTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I2dldEFsZ29yaXRobSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2VzdEFsZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0zNDksNiArNDE4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCNnZXREaWdlc3RMZW5ndGgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREaWdlc3RMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERpZ2VzdExlbmd0aCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdlc3RBbGdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzY3LDYgKzQ0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0QWxncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTM4MSw2ICs0NjgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I2dldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdlc3RBbGdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzk3LDYgKzQ5MywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5zZWN1cml0eS5Qcm92aWRlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9Qcm92aWRlcigpIHsKICAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoIk1lc3NhZ2VEaWdlc3QuU0hBIik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0QWxncy5sZW5ndGg7IGkrKykgewpAQCAtNDE0LDYgKzUxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjZ2V0UHJvdmlkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0QWxncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTQzMSw2ICs1NDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0I2lzRXF1YWwoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiT3RoZXJ3aXNlIGNhc2UgaXMgbm90IGNoZWNrZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0VxdWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1YWwkQiRCKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJpc0VxdWFsIGlzIG5vdCBjb3JyZWN0IiwgTWVzc2FnZURpZ2VzdC5pc0VxdWFsKEFSMSwgQVIyKSk7CiAgICAgfQpAQCAtNDM4LDYgKzU2MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmcgc3RyID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIikudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdFNwaVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdFNwaVRlc3QuamF2YQppbmRleCA3NzdkM2UyLi4zYmI1YmRlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3RTcGlUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0U3BpVGVzdC5qYXZhCkBAIC0yMiwxMiArMjIsMTcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0U3BpOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKE1lc3NhZ2VEaWdlc3RTcGkuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5NZXNzYWdlRGlnZXN0U3BpPC9jb2RlPiBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcwogICovCkBAIC0zNiw2ICs0MSwxNSBAQAogICAgIC8qKgogICAgICogamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0U3BpI01lc3NhZ2VEaWdlc3RTcGkoKQogICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk1lc3NhZ2VEaWdlc3RTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTXlNZXNzYWdlRGlnZXN0KCk7CkBAIC00Nyw2ICs2MSwxNSBAQAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdFNwaSNlbmdpbmVEaWdlc3QoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2Ygb3RoZXIgdmFyaWFudHMgb2YgbGVuIGFuZCBvZmZzZXQgcGFyYW1ldGVycyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVEaWdlc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbmdpbmVEaWdlc3RMQiRMSUxJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgZmluYWwgaW50IERJR0VTVF9MRU5HSFQgPSAyOwpAQCAtOTIsNiArMTE1LDE1IEBACiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0U3BpI2VuZ2luZUdldERpZ2VzdExlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm90IHplcm8gZGlnZXN0IGxlbmd0aCBpbiBieXRlcyB3YXNuJ3QgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZ2luZUdldERpZ2VzdExlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZW5naW5lR2V0RGlnZXN0TGVuZ3RoKCkgewogICAgICAgICBNeU1lc3NhZ2VEaWdlc3QgbWQgPSBuZXcgTXlNZXNzYWdlRGlnZXN0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBtZC5lbmdpbmVHZXREaWdlc3RMZW5ndGgoKSk7CkBAIC0xMDAsNiArMTMyLDE1IEBACiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0U3BpI2VuZ2luZVVwZGF0ZShCeXRlQnVmZmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVVcGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbmdpbmVVcGRhdGVMamF2YV9uaW9fQnl0ZUJ1ZmZlcigpIHsKICAgICAgICAgTXlNZXNzYWdlRGlnZXN0IG1kID0gbmV3IE15TWVzc2FnZURpZ2VzdCgpOwogICAgICAgICBieXRlW10gYiA9IHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9OwpAQCAtMTIzLDYgKzE2NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3RTcGkjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogICAgICAgICBNeU1lc3NhZ2VEaWdlc3QgbWQgPSBuZXcgTXlNZXNzYWdlRGlnZXN0KCk7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjJUZXN0LmphdmEKaW5kZXggNTIxOTExNS4uZWQwNDc4YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb24yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uMlRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uI05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uKCk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiNOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCBmODM5YmE5Li5lMTU3NmVjOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb25UZXN0LmphdmEKQEAgLTIxLDExICsyMSwxNiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+Tm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCiAgKiBtZXRob2RzLgpAQCAtNTYsNiArNjEsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgogICAgICAqIGNvbnN0cnVjdHMgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjAxKCkgewogICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gdEUgPSBuZXcgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CkBAIC02Nyw2ICs4MSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuCiAgICAgICogUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjAyKCkgewogICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtODIsNiArMTA1LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMKICAgICAgKiBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjAzKCkgewogICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHRFID0gbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbihtc2cpOwpAQCAtOTQsNiArMTI2LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPgogICAgICAqIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uMDQoKSB7CiAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CiAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB0RSA9IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oY2F1c2UpOwpAQCAtMTA2LDYgKzE0NywxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4KICAgICAgKiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24wNSgpIHsKICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHRFID0gbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbih0Q2F1c2UpOwogICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKQEAgLTEyNCw2ICsxNzQsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24wNigpIHsKICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHRFID0gbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtMTM1LDYgKzE5NCwxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbgogICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24wNygpIHsKICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKQEAgLTE1MCw2ICsyMTgsMTUgQEAKICAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4KICAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uMDgoKSB7CiAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB0RSA9IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24obnVsbCwgdENhdXNlKTsKICAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CkBAIC0xNjgsNiArMjQ1LDE1IEBACiAgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuCiAgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdCBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24wOSgpIHsKICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24yVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjJUZXN0LmphdmEKaW5kZXggNjdkYzQ4OC4uOWQyODI2NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjJUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uI05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbigpCiAgICAgICAgIHRyeSB7CkBAIC0zOCw2ICs1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uI05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAyZGZhMjNkLi41MjE5ZjBmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb25UZXN0LmphdmEKQEAgLTIxLDExICsyMSwxNiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbi5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCiAgKiBtZXRob2RzLgpAQCAtNTYsNiArNjEsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CiAgICAgICogY29uc3RydWN0cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uMDEoKSB7CiAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHRFID0gbmV3IE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CkBAIC02Nyw2ICs4MSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KICAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hQcm92aWRlckV4Y2VwdGlvbjAyKCkgewogICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB0RTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CkBAIC04Miw2ICsxMDUsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5tc2c8L2NvZGU+IGlzCiAgICAgICogbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uMDMoKSB7CiAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwogICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB0RSA9IG5ldyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbihtc2cpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbjJUZXN0LmphdmEKaW5kZXggMGFlNjkzNi4uMzUwNzYxNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb24yVGVzdC5qYXZhCkBAIC0xNywxMCArMTcsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uOwogCitAVGVzdFRhcmdldENsYXNzKFBlcm1pc3Npb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgUGVybWlzc2lvbjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBzdGF0aWMgY2xhc3MgQ29uY3JldGVQZXJtaXNzaW9uIGV4dGVuZHMgUGVybWlzc2lvbiB7CiAgICAgICAgIHB1YmxpYyBDb25jcmV0ZVBlcm1pc3Npb24oKSB7CkBAIC00Nyw2ICs1MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24jUGVybWlzc2lvbihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiB3aGVuIHN0cmluZyBwYXJhbWV0ZXIgZW1wdHkvbnVsbCBpcyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBqYXZhLnNlY3VyaXR5LnBlcm1pc3Npb24uUGVybWlzc2lvbihzdHJpbmcpCiAgICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiBwZXJtaSA9IG5ldyBTZWN1cml0eVBlcm1pc3Npb24oCkBAIC01OSw2ICs3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24jY2hlY2tHdWFyZChqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrR3VhcmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NoZWNrR3VhcmRMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2QgamF2YS5zZWN1cml0eS5wZXJtaXNzaW9uLmNoZWNrR3VhcmQob2JqZWN0KQogICAgICAgICBTZWN1cml0eVBlcm1pc3Npb24gcGVybWkgPSBuZXcgU2VjdXJpdHlQZXJtaXNzaW9uKApAQCAtNzQsNiArOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uI2dldE5hbWUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBqYXZhLnNlY3VyaXR5LnBlcm1pc3Npb24uZ2V0TmFtZSgpCiAgICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiBwZXJtaSA9IG5ldyBTZWN1cml0eVBlcm1pc3Npb24oInRlc3RpbmcgZ2V0TmFtZSgpIik7CkBAIC04OSw2ICsxMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uI25ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDYXNlIHdoZW4gbnVsbCByZXR1cm5lZCBpZiBvbmUgaXMgbm90IGRlZmluZWQgaXMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3UGVybWlzc2lvbkNvbGxlY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBqYXZhLnNlY3VyaXR5LnBlcm1pc3Npb24ubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24KICAgICAgICAgUGVybWlzc2lvbiBwZXJtaSA9IG5ldyBDb25jcmV0ZVBlcm1pc3Npb24oKTsKQEAgLTEwMSw2ICsxNDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBqYXZhLnNlY3VyaXR5LnBlcm1pc3Npb24udG9TdHJpbmcKICAgICAgICAgLy8gdGVzdCBmb3IgcGVybWlzc2lvbiB3aXRoIG5vIGFjdGlvbgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbkNvbGxlY3Rpb25UZXN0LmphdmEKaW5kZXggMmZjYTMwNy4uODFjOTgxNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvblRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25Db2xsZWN0aW9uVGVzdC5qYXZhCkBAIC0yMSwxMyArMjEsMTggQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCitAVGVzdFRhcmdldENsYXNzKFBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+UGVybWlzc2lvbkNvbGxlY3Rpb248L2NvZGU+CiAgKiAKQEAgLTcwLDYgKzc1LDE5IEBACiAgICAgfQogICAgICAgICAKICAgICAvKiogVGVzdCByZWFkLW9ubHkgZmxhZy4gU2hvdWxkIGJlIGZhbHNlIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBzZXQgb25jZSBmb3JldmVyLiAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JlYWRPbmx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkT25seSgpCiAgICAgewogICAgICAgICBQZXJtaXNzaW9uQ29sbGVjdGlvbiBwYyA9IG5ldyBSZWFsUGVybWlzc2lvbkNvbGxlY3Rpb24obnVsbCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25UZXN0LmphdmEKaW5kZXggMDU0ZGIwZS4uMGM3ODIwNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMjEsMTAgKzIxLDE2IEBACiAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKFBlcm1pc3Npb24uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5QZXJtaXNzaW9uPC9jb2RlPgogICovCkBAIC03Miw2ICs3OCwxNSBAQAogICAgICAqIFRlc3QgdGhhdCBhIHBlcm1pc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGlzCiAgICAgICogcHJvcGVybHkgY29udmVydGVkIHRvIFN0cmluZwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vbiBudWxsIHN0cmluZyBwYXJhbWV0ZXIgdmVyaWZpZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEN0b3IoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gInRlc3RDdG9yMTIzXiUkIyZeICZeJCI7CiAgICAgICAgIFBlcm1pc3Npb24gdGVzdCA9IG5ldyBSZWFsUGVybWlzc2lvbihuYW1lKTsKQEAgLTg1LDYgKzEwMCwxNSBAQAogICAgICAqIGNoZWNrUGVybWlzc2lvbigpIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGlzIHBlcm1pc3Npb24sIG90aGVyd2lzZQogICAgICAqIG5vdGhpbmcgaGFwcGVucwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrR3VhcmQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tHdWFyZCgpIHsKICAgICAgICAgZmluYWwgUGVybWlzc2lvbiB0ZXN0ID0gbmV3IFJlYWxQZXJtaXNzaW9uKCIyMzQyMzQiKTsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZCA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKQEAgLTEwOCw2ICsxMzIsMTUgQEAKICAgICB9CiAKICAgICAvKiogbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSBzaG91bGQgcmV0dXJuIG51bGwgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZXR1cm5lZCBwYXJhbWV0ZXIgd2FzIHRlc3RlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uKCkgewogICAgICAgICBhc3NlcnROdWxsKG5ldyBSZWFsUGVybWlzc2lvbigiMTIzIikubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uczJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25zMlRlc3QuamF2YQppbmRleCBmZWE5OWI1Li5hYjczN2ViIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25zMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25zMlRlc3QuamF2YQpAQCAtMTcsMTEgKzE3LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhQZXJtaXNzaW9ucy5jbGFzcykKIHB1YmxpYyBjbGFzcyBQZXJtaXNzaW9uczJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICBGaWxlUGVybWlzc2lvbiByZWFkQWxsRmlsZXMgPSBuZXcgRmlsZVBlcm1pc3Npb24oIjw8QUxMIEZJTEVTPj4iLCAicmVhZCIpOwogCkBAIC0zOCw2ICs0NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zI1Blcm1pc3Npb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUGVybWlzc2lvbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucygpCiAgICAgICAgIG5ldyBQZXJtaXNzaW9ucygpOwpAQCAtNDYsNiArNjEsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucyNhZGQoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBtZXRob2Qgd2l0aCBudWxsIHBhcmFtZXRlciBpcyBtaXNzZWQuIiArCisgICAgICAgICAgICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9zZWN1cml0eV9QZXJtaXNzaW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zLmFkZChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCkBAIC03OSw2ICsxMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucyNlbGVtZW50cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2FzZSB3aGVuIG5vIGFkZGVkIGVsZW1lbnRzIGlzIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVsZW1lbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbGVtZW50cygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudXRpbC5FbnVtZXJhdGlvbgogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zLmVsZW1lbnRzKCkKQEAgLTExMiw2ICsxNDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucyNpbXBsaWVzKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgbWV0aG9kIHdpdGggbnVsbCBwYXJhbWV0ZXIgaXMgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2ltcGxpZXNMamF2YV9zZWN1cml0eV9QZXJtaXNzaW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zLmltcGxpZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uc1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbnNUZXN0LmphdmEKaW5kZXggNzQ1Y2M5NjYuLjJlOTM3ODggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbnNUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uc1Rlc3QuamF2YQpAQCAtMjEsNiArMjEsMTIgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwpAQCAtMzYsOCArNDIsNyBAQAogCiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhQZXJtaXNzaW9ucy5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlBlcm1pc3Npb25zPC9jb2RlPgogICogCkBAIC01Miw2ICs1NywxNSBAQAogICAgIC8qKgogICAgICAqIENhbiBhZGQgYW55IHR5cGUgb2YgcGVybWlzc2lvbnMuIENhbm5vdCBhZGQgaWYgY29sbGVjdGlvbiBpcyByZWFkLW9ubHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Blcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7CiAgICAgICAgIFBlcm1pc3Npb25zIHBzID0gbmV3IFBlcm1pc3Npb25zKCk7CiAgICAgICAgIFBlcm1pc3Npb24gYXAgPSBuZXcgQWxsUGVybWlzc2lvbigpOwpAQCAtODcsNiArMTAxLDE1IEBACiAgICAgICogbm9uLWVtcHR5IGNvbGxlY3Rpb24sIHNob3VsZCBhbHdheXMgcmV0dXJuIGVudW1lcmF0aW9uIG92ZXIgdW5pcXVlCiAgICAgICogZWxlbWVudHMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZWxlbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHMoKSB7CiAgICAgICAgIFBlcm1pc3Npb25zIHBzID0gbmV3IFBlcm1pc3Npb25zKCk7CiAgICAgICAgIFBlcm1pc3Npb24gYXAgPSBuZXcgQWxsUGVybWlzc2lvbigpOwpAQCAtMTM1LDYgKzE1OCwyMyBAQAogICAgIC8qKgogICAgICAqIGlucHV0IHBhcmFtZXRlciBpcyBudWxsIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gImltcGxpZXMgLSBub24gbnVsbCBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Blcm1pc3Npb24uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Blcm1pc3Npb24uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZWxlbWVudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbCgpewogICAgICAgICBQZXJtaXNzaW9ucyBwcyA9IG5ldyBQZXJtaXNzaW9ucygpOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qb2xpY3lUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1BvbGljeVRlc3QuamF2YQppbmRleCA3MWRmMmVhLi44YjRhYzM5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1BvbGljeVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1BvbGljeVRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKQEAgLTQyLDggKzQ3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHM7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhQb2xpY3kuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5Qb2xpY3k8L2NvZGU+CiAgKi8KQEAgLTU2LDggKzYwLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUG9saWN5I3NldFBvbGljeShqYXZhLnNlY3VyaXR5LlBvbGljeSkKKyAgICAgKiBAdGVzdHMgY29uc3RydWN0b3IgUG9saWN5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUG9saWN5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb25zdHJ1Y3RvcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBUZXN0UHJvdmlkZXIoKTsKQEAgLTY5LDYgKzgyLDE5IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUG9saWN5I3NldFBvbGljeShqYXZhLnNlY3VyaXR5LlBvbGljeSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQb2xpY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UG9saWN5LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBvbGljeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UG9saWN5TGphdmFfc2VjdXJpdHlfUG9saWN5KCkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBQb2xpY3kgb2xkUG9saWN5ID0gUG9saWN5LmdldFBvbGljeSgpOwpAQCAtOTcsNiArMTIzLDE5IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUG9saWN5I2dldFBvbGljeSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UG9saWN5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQb2xpY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UG9saWN5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBvbGljeSgpIHsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZCA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgUG9saWN5IG9sZFBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKQEAgLTEzNiw2ICsxNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IGdldFBlcm1pc3Npb25zKCkgZG9lcyBwcm9wZXIgcGVybWlzc2lvbiBldmFsdWF0aW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZXJtaXNzaW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm90ZWN0aW9uRG9tYWluLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGVybWlzc2lvbnMoKSB7CiAgICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiBzcCA9IG5ldyBTZWN1cml0eVBlcm1pc3Npb24oImFiYyIpOwogICAgICAgICBTZWN1cml0eVBlcm1pc3Npb24gc3AyID0gbmV3IFNlY3VyaXR5UGVybWlzc2lvbigiZmJkZiIpOwpAQCAtMTg0LDYgKzIzMiwxOSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlBvbGljeSNnZXRQb2xpY3koKQogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlBvbGljeSNzZXRQb2xpY3koKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFBvbGljeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQb2xpY3kuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UG9saWN5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0aW5nUG9saWN5VG9EZWZhdWx0KCkgewogCiAgICAgICAgIFBvbGljeSBvbGRQb2xpY3kgPSBQb2xpY3kuZ2V0UG9saWN5KCk7CkBAIC0yMDgsNyArMjY5LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUG9saWN5I2ltcGxpZXMoUHJvdGVjdGlvbkRvbWFpbiwgUGVybWlzc2lvbikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2ltcGxpZXMoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJvdGVjdGlvbkRvbWFpbi5jbGFzcywgUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfaW1wbGllcygpIHsKICAgICAgICAgUG9saWN5IHBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKICAgICAgICAgY2hhciBzID0gRmlsZS5zZXBhcmF0b3JDaGFyOwogCkBAIC0yODUsNyArMzU1LDIwIEBACiAgICAgLyoqCiAgICAgICogVGVzdCBwcm9wZXJ0eSBleHBhbnNpb24gaW4gcG9saWN5IGZpbGVzCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5RXhwYW5zaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UG9saWN5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1BvbGljeS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQb2xpY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFByb3BlcnR5RXhwYW5zaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xOTYzIGFuZCBIQVJNT05ZLTI5MTAKICAgICAgICAgU3RyaW5nIHBvbGljeUZpbGUgPSBuZXcgRmlsZShDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1ByaXZhdGVLZXlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1ByaXZhdGVLZXlUZXN0LmphdmEKaW5kZXggYzBiZDAxNi4uZDMwNGMwMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcml2YXRlS2V5VGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJpdmF0ZUtleVRlc3QuamF2YQpAQCAtMjEsMTEgKzIxLDE1IEBACiAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCitAVGVzdFRhcmdldENsYXNzKFByaXZhdGVLZXkuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5Qcml2YXRlS2V5PC9jb2RlPiBjbGFzcyBmaWVsZAogICogCkBAIC00NSw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3QgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+IGZpZWxkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkZpZWxkIHRlc3RpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXJpYWxWZXJzaW9uVUlEIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkKCkgewogICAgICAgICBjaGVja1ByaXZhdGVLZXkgY1ByS2V5ID0gbmV3IGNoZWNrUHJpdmF0ZUtleSgpOyAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2VyaWFsVmVyc2lvblVJRCIsIGNQcktleS5nZXRTZXJWZXJVSUQoKSwgLy9Qcml2YXRlS2V5LnNlcmlhbFZlcnNpb25VSUQsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24yVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uMlRlc3QuamF2YQppbmRleCAyNGNjMWExLi45YWJhNGEyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjJUZXN0LmphdmEKQEAgLTE3LDE0ICsxNywyOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiNQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKGphdmEubGFuZy5FeGNlcHRpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7RXhjZXB0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19FeGNlcHRpb24oKSB7CiAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigidGVzdCBleGNlcHRpb24iKTsKICAgICAgICAgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwZSA9IG5ldyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKGUpOwpAQCAtNDAsNiArNTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uI2dldEV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhjZXB0aW9uKCkgewogICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBJT0V4Y2VwdGlvbigidGVzdCBJT0V4Y2VwdGlvbiIpOwogICAgICAgICBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBlID0gbmV3IFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24oZSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb25UZXN0LmphdmEKaW5kZXggZWEzZWIxZi4uZTViZDNiMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbi5jbGFzcykKIC8qKgogICogVW5pdCB0ZXN0IGZvciBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24uCiAgKiAKQEAgLTQzLDYgKzQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbihFeGNlcHRpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7RXhjZXB0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbigpIHsKICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24obnVsbCk7CiAgICAgICAgIEV4Y2VwdGlvbiBleCA9IG5ldyBFeGNlcHRpb24oKTsKQEAgLTUyLDYgKzY2LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbi5nZXRFeGNlcHRpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uKCkgewogICAgICAgICBhc3NlcnROdWxsKG5ldyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKG51bGwpLmdldEV4Y2VwdGlvbigpKTsKICAgICAgICAgRXhjZXB0aW9uIGV4ID0gbmV3IEV4Y2VwdGlvbigpOwpAQCAtNjEsNiArODQsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uLnRvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIGFzc2VydE5vdE51bGwobmV3IFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24obnVsbCkudG9TdHJpbmcoKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobmV3IFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24obmV3IEV4Y2VwdGlvbigpKS50b1N0cmluZygpKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdGVjdGlvbkRvbWFpblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdGVjdGlvbkRvbWFpblRlc3QuamF2YQppbmRleCAxNzVhOTUzLi4wYzExYjA2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW5UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcm90ZWN0aW9uRG9tYWluVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSwxMiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CkBAIC0zNCw4ICs0MCw3IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvdGVjdGlvbkRvbWFpbi5jbGFzcykKIC8qKgogICogVW5pdCB0ZXN0cyBmb3IgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluLgogICogCkBAIC04Niw2ICs5MSwxNSBAQAogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgUHJvdGVjdGlvbkRvbWFpbihDb2RlU291cmNlLAogICAgICAqIFBlcm1pc3Npb25Db2xsZWN0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3RlY3Rpb25Eb21haW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Q29kZVNvdXJjZS5jbGFzcywgUGVybWlzc2lvbkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0aW9uRG9tYWluQ29kZVNvdXJjZVBlcm1pc3Npb25Db2xsZWN0aW9uXzAwKCkgewogICAgICAgICBuZXcgUHJvdGVjdGlvbkRvbWFpbihudWxsLCBudWxsKTsKICAgICAgICAgbmV3IFByb3RlY3Rpb25Eb21haW4oY3MsIG51bGwpOwpAQCAtOTYsNiArMTEwLDE1IEBACiAgICAgLyoqCiAgICAgICogdGhlIGN0b3IgbXVzdCBzZXQgdGhlIFBlcm1pc3Npb25Db2xsZWN0aW9uIHJlYWQtb25seQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3RlY3Rpb25Eb21haW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Q29kZVNvdXJjZS5jbGFzcywgUGVybWlzc2lvbkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0aW9uRG9tYWluQ29kZVNvdXJjZVBlcm1pc3Npb25Db2xsZWN0aW9uXzAxKCkgewogICAgICAgICBhc3NlcnRGYWxzZShwZXJtcy5pc1JlYWRPbmx5KCkpOwogICAgICAgICBuZXcgUHJvdGVjdGlvbkRvbWFpbihudWxsLCBwZXJtcyk7CkBAIC0xMDUsNiArMTI4LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgUHJvdGVjdGlvbkRvbWFpbihDb2RlU291cmNlLCBQZXJtaXNzaW9uQ29sbGVjdGlvbiwgQ2xhc3NMb2FkZXIsIFByaW5jaXBhbFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcm90ZWN0aW9uRG9tYWluIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3MsIFBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzLCBDbGFzc0xvYWRlci5jbGFzcywgUHJpbmNpcGFsW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0aW9uRG9tYWluQ29kZVNvdXJjZVBlcm1pc3Npb25Db2xsZWN0aW9uQ2xhc3NMb2FkZXJQcmluY2lwYWxBcnJheSgpIHsKICAgICAgICAgbmV3IFByb3RlY3Rpb25Eb21haW4obnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CiAKQEAgLTExOSw2ICsxNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBmb3IgUHJvdGVjdGlvbkRvbWFpbi5nZXRDbGFzc0xvYWRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENsYXNzTG9hZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENsYXNzTG9hZGVyKCkgewogICAgICAgICBhc3NlcnROdWxsKG5ldyBQcm90ZWN0aW9uRG9tYWluKG51bGwsIG51bGwpLmdldENsYXNzTG9hZGVyKCkpOwogICAgICAgICBhc3NlcnRTYW1lKG5ldyBQcm90ZWN0aW9uRG9tYWluKG51bGwsIG51bGwsIGNsYXNzbGRyLCBudWxsKQpAQCAtMTI4LDYgKzE2OSwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIGZvciBQcm90ZWN0aW9uRG9tYWluLmdldENvZGVTb3VyY2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2RlU291cmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENvZGVTb3VyY2UoKSB7CiAgICAgICAgIGFzc2VydE51bGwobmV3IFByb3RlY3Rpb25Eb21haW4obnVsbCwgbnVsbCkuZ2V0Q29kZVNvdXJjZSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShuZXcgUHJvdGVjdGlvbkRvbWFpbihjcywgbnVsbCkuZ2V0Q29kZVNvdXJjZSgpLCBjcyk7CkBAIC0xMzYsNiArMTg2LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgZm9yIFByb3RlY3Rpb25Eb21haW4uZ2V0UGVybWlzc2lvbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZXJtaXNzaW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQZXJtaXNzaW9ucygpIHsKICAgICAgICAgYXNzZXJ0TnVsbChuZXcgUHJvdGVjdGlvbkRvbWFpbihudWxsLCBudWxsKS5nZXRQZXJtaXNzaW9ucygpKTsKICAgICAgICAgYXNzZXJ0U2FtZShuZXcgUHJvdGVjdGlvbkRvbWFpbihudWxsLCBwZXJtcykuZ2V0UGVybWlzc2lvbnMoKSwgcGVybXMpOwpAQCAtMTQ0LDYgKzIwMywxNSBAQAogICAgIC8qKgogICAgICAqIGdldFByaW5jaXBhbHMoKSBhbHdheXMgcmV0dXJucyBub24gbnVsbCBhcnJheQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaW5jaXBhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpbmNpcGFsc18wMCgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgUHJvdGVjdGlvbkRvbWFpbihudWxsLCBudWxsKS5nZXRQcmluY2lwYWxzKCkpOwogICAgIH0KQEAgLTE1MSw2ICsyMTksMTUgQEAKICAgICAvKioKICAgICAgKiBnZXRQcmluY2lwYWxzKCkgcmV0dXJucyBuZXcgYXJyYXkgZWFjaCB0aW1lIGl0J3MgY2FsbGVkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbmNpcGFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcmluY2lwYWxzXzAxKCkgewogICAgICAgICBQcm90ZWN0aW9uRG9tYWluIHBkID0gbmV3IFByb3RlY3Rpb25Eb21haW4obnVsbCwgbnVsbCwgbnVsbCwgcHJpbmNpcGFscyk7CiAgICAgICAgIFByaW5jaXBhbFtdIGdvdCA9IHBkLmdldFByaW5jaXBhbHMoKTsKQEAgLTE2Myw2ICsyNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBQcm90ZWN0aW9uRG9tYWluIHdpdGggbnVsbCBQZXJtaXNzaW9ucyBtdXN0IG5vdCBpbXBseSgpIHBlcm1pc3Npb25zLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcGxpZXNfMDAoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBQcm90ZWN0aW9uRG9tYWluKG51bGwsIG51bGwpLmltcGxpZXMoYWxscGVybSkpOwogICAgIH0KQEAgLTE3MSw2ICsyNTcsMTUgQEAKICAgICAgKiBQcm90ZWN0aW9uRG9tYWluIHdpdGggUGVybWlzc2lvbkNvbGxlY3Rpb24gd2hpY2ggY29udGFpbnMgQWxsUGVybWlzc2lvbgogICAgICAqIG11c3QgaW1wbHkoKSBBbGxQZXJtaXNzaW9uLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcGxpZXNfMDEoKSB7CiAgICAgICAgIGFzc2VydFRydWUobmV3IFByb3RlY3Rpb25Eb21haW4obnVsbCwgcGVybXMpLmltcGxpZXMoYWxscGVybSkpOwogICAgIH0KQEAgLTE3OSw2ICsyNzQsMTUgQEAKICAgICAgKiBQcm90ZWN0aW9uRG9tYWluIGNyZWF0ZWQgd2l0aCBhIHN0YXRpYyBzZXQgb2YgcGVybWlzc2lvbnMgbXVzdCBub3QgcXVlcnkgCiAgICAgICogcG9saWN5LiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBsaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Blcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWVzXzAyKCkgewogICAgICAgICBUZXN0UG9saWN5IHBvbGljeSA9IG5ldyBUZXN0UG9saWN5KCk7CiAgICAgICAgIC8vIG51bGwgc2V0IG9mIHBlcm1pc3Npb25zIFttdXN0XSBmb3JjZSB0aGUgUEQgdG8gdXNlIFBvbGljeSAtIGZvciAKQEAgLTE5OCw2ICszMDIsMTUgQEAKICAgICAgKiBQcm90ZWN0aW9uRG9tYWluIGNyZWF0ZWQgd2l0aCBkeW5hbWljIHNldCBvZiBwZXJtaXNzaW9ucyBtdXN0IHF1ZXJ5IAogICAgICAqIHBvbGljeS4gCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllc18wMygpIHsKICAgICAgICAgVGVzdFBvbGljeSBwb2xpY3kgPSBuZXcgVGVzdFBvbGljeSgpOwogICAgICAgICBQcm90ZWN0aW9uRG9tYWluIHBkID0gbmV3IFByb3RlY3Rpb25Eb21haW4oY3MsIG51bGwsIENsYXNzTG9hZGVyCkBAIC0yMTUsNiArMzI4LDE1IEBACiAgICAgLyoqCiAgICAgICogU2ltcGx5IGNoZWNrcyB0aGF0IGl0J3Mgd29ya2luZyBzb21laG93CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVjZWl2aW5nIG9mIHRlc3QgcmVzdWx0IGlzIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewogICAgICAgICBuZXcgUHJvdGVjdGlvbkRvbWFpbihudWxsLCBudWxsKS50b1N0cmluZygpOwogICAgICAgICBuZXcgUHJvdGVjdGlvbkRvbWFpbihjcywgcGVybXMpLnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXIyVGVzdC5qYXZhCmluZGV4IGJiZDk1YTUuLmY0MmEzMjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXIyVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXIyVGVzdC5qYXZhCkBAIC0xNyw4ICsxNywxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKIAorQFRlc3RUYXJnZXRDbGFzcyhQcm92aWRlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBQcm92aWRlcjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIGNsYXNzIFRlc3RQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyIHsKQEAgLTQ4LDYgKzU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIjZW50cnlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHZlcmlmaWNhdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVudHJ5U2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lbnRyeVNldCgpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2Qgb2YgamF2YS5zZWN1cml0eS5wcm92aWRlci5lbnRyeVNldAogICAgICAgICBwcm92VGVzdC5wdXQoInRlc3QucHJvcCIsICJ0aGlzIGlzIGEgdGVzdCBwcm9wZXJ0eSIpOwpAQCAtNjMsNiArNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Qcm92aWRlciNnZXRJbmZvKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5mbygpIHsKICAgICAgICAgLy8gdGVzdCBtZXRob2Qgb2YgamF2YS5zZWN1cml0eS5wcm92aWRlci5nZXRJbmZvCiAgICAgICAgIGFzc2VydEVxdWFscygidGhlIGluZm9ybWF0aW9uIG9mIHRoZSBwcm92aWRlciBpcyBub3Qgc3RvcmVkIHByb3Blcmx5IiwKQEAgLTczLDYgKzk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIjZ2V0TmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEuc2VjdXJpdHkucHJvdmlkZXIuZ2V0TmFtZQogICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciBpcyBub3Qgc3RvcmVkIHByb3Blcmx5IiwKQEAgLTgyLDYgKzExNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyI2dldFZlcnNpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRWZXJzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uKCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBvZiBqYXZhLnNlY3VyaXR5LnByb3ZpZGVyLmdldFZlcnNpb24KICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZXIgaXMgbm90IHN0b3JlZCBwcm9wZXJseSIsCkBAIC05MSw2ICsxMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Qcm92aWRlciNrZXlTZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHZlcmlmaWNhdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfa2V5U2V0KCkgewogICAgICAgICAvLyB0ZXN0IG1ldGhvZCBvZiBqYXZhLnNlY3VyaXR5LnByb3ZpZGVyLmtleVNldAogICAgICAgICBwcm92VGVzdC5wdXQoInRlc3QucHJvcCIsICJ0aGlzIGlzIGEgdGVzdCBwcm9wZXJ0eSIpOwpAQCAtMTA1LDYgKzE1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyI3ZhbHVlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdmVyaWZpY2F0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92YWx1ZXMoKSB7CiAgICAgICAgIC8vIHRlc3QgbWV0aG9kIG9mIGphdmEuc2VjdXJpdHkucHJvdmlkZXIudmFsdWVzCiAgICAgICAgIHByb3ZUZXN0LnB1dCgidGVzdC5wcm9wIiwgInRoaXMgaXMgYSB0ZXN0IHByb3BlcnR5Iik7CkBAIC0xMjAsNiArMTgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzczNAogICAgICAgICBhc3NlcnRFcXVhbHMoInByb3ZUZXN0IHZlcnNpb24gMS4yIiwgcHJvdlRlc3QudG9TdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyRXhjZXB0aW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJFeGNlcHRpb24yVGVzdC5qYXZhCmluZGV4IGRkZTUyNTkuLjViNDc2YWUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJFeGNlcHRpb24yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvdmlkZXJFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgUHJvdmlkZXJFeGNlcHRpb24yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Qcm92aWRlckV4Y2VwdGlvbiNQcm92aWRlckV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb24oKQogICAgICAgICBQcm92aWRlckV4Y2VwdGlvbiBlID0gbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCk7CkBAIC0zNCw2ICs0OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyRXhjZXB0aW9uI1Byb3ZpZGVyRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggbnVsbC9lbXB0eSBwYXJhbWV0ZXIgaXMgYWJzZW50IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvdmlkZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIFByb3ZpZGVyRXhjZXB0aW9uIGUgPSBuZXcgUHJvdmlkZXJFeGNlcHRpb24oInRlc3QgbWVzc2FnZSIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcm92aWRlckV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggOWNhZTJiNi4uYmE1ZjNlNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcm92aWRlckV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTYgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyRXhjZXB0aW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvdmlkZXJFeGNlcHRpb24uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5Qcm92aWRlckV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgogICogCkBAIC01NSw2ICs2MCwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPlByb3ZpZGVyRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKICAgICAgKiBjb25zdHJ1Y3RzIFByb3ZpZGVyRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvdmlkZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJFeGNlcHRpb24wMSgpIHsKICAgICAgICAgUHJvdmlkZXJFeGNlcHRpb24gdEUgPSBuZXcgUHJvdmlkZXJFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTY2LDYgKzgwLDE1IEBACiAgICAgICogY29uc3RydWN0cyBQcm92aWRlckV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4gUGFyYW1ldGVyCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcm92aWRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlckV4Y2VwdGlvbjAyKCkgewogICAgICAgICBQcm92aWRlckV4Y2VwdGlvbiB0RTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CkBAIC04MCw2ICsxMDMsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5Qcm92aWRlckV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CiAgICAgICogY29uc3RydWN0cyBQcm92aWRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyRXhjZXB0aW9uMDMoKSB7CiAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwogICAgICAgICBQcm92aWRlckV4Y2VwdGlvbiB0RSA9IG5ldyBQcm92aWRlckV4Y2VwdGlvbihtc2cpOwpAQCAtOTEsNiArMTIzLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+UHJvdmlkZXJFeGNlcHRpb24oVGhyb3dhYmxlKTwvY29kZT4gY29uc3RydWN0b3IKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgUHJvdmlkZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Rocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyRXhjZXB0aW9uMDQoKSB7CiAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CiAgICAgICAgIFByb3ZpZGVyRXhjZXB0aW9uIHRFID0gbmV3IFByb3ZpZGVyRXhjZXB0aW9uKGNhdXNlKTsKQEAgLTEwMyw2ICsxNDQsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgUHJvdmlkZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90CiAgICAgICogbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Rocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyRXhjZXB0aW9uMDUoKSB7CiAgICAgICAgIFByb3ZpZGVyRXhjZXB0aW9uIHRFID0gbmV3IFByb3ZpZGVyRXhjZXB0aW9uKHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTIxLDYgKzE3MSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBQcm92aWRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvdmlkZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlckV4Y2VwdGlvbjA2KCkgewogICAgICAgICBQcm92aWRlckV4Y2VwdGlvbiB0RSA9IG5ldyBQcm92aWRlckV4Y2VwdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtMTMyLDYgKzE5MSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBQcm92aWRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCiAgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJFeGNlcHRpb24wNygpIHsKICAgICAgICAgUHJvdmlkZXJFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtMTQ3LDYgKzIxNSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBQcm92aWRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QKICAgICAgKiBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJFeGNlcHRpb24wOCgpIHsKICAgICAgICAgUHJvdmlkZXJFeGNlcHRpb24gdEUgPSBuZXcgUHJvdmlkZXJFeGNlcHRpb24obnVsbCwgdENhdXNlKTsKICAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CkBAIC0xNjUsNiArMjQyLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIFByb3ZpZGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdAogICAgICAqIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJFeGNlcHRpb24wOSgpIHsKICAgICAgICAgUHJvdmlkZXJFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcm92aWRlclNlcnZpY2VUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyU2VydmljZVRlc3QuamF2YQppbmRleCA0ZWM5YzMwLi5hNzcyZWU3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyU2VydmljZVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyU2VydmljZVRlc3QuamF2YQpAQCAtMjIsMjAgKzIyLDM1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuU2VydmljZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlJhbmRvbUltcGw7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VydmljZS5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlByb3ZpZGVyLlNlcnZpY2U8L2NvZGU+IGNvbnN0cnVjdG9yIGFuZCBtZXRob2RzCiAgKiAKICAqLwogcHVibGljIGNsYXNzIFByb3ZpZGVyU2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VydmljZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm92aWRlci5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgamF2YS51dGlsLkxpc3QuY2xhc3MsIGphdmEudXRpbC5NYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlKCkgewogICAgICAgICBQcm92aWRlciBwID0gbmV3IE15UHJvdmlkZXIoKTsKICAgICAgICAgdHJ5IHsKQEAgLTgwLDYgKzk1LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXR0cmlidXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZSgpIHsKICAgICAgICAgUHJvdmlkZXIgcCA9IG5ldyBNeVByb3ZpZGVyKCk7CiAgICAgICAgIFByb3ZpZGVyLlNlcnZpY2UgcyA9IG5ldyBQcm92aWRlci5TZXJ2aWNlKHAsICJ0eXBlIiwgImFsZ29yaXRobSIsCkBAIC0xMTEsNiArMTM1LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld0luc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlKCkgewogICAgICAgICBQcm92aWRlciBwID0gbmV3IE15UHJvdmlkZXIoKTsKICAgICAgICAgUHJvdmlkZXIuU2VydmljZSBzID0gbmV3IFByb3ZpZGVyLlNlcnZpY2UocCwgIlNlY3VyZVJhbmRvbSIsCkBAIC0xMzQsNiArMTY3LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFsZ29yaXRobSgpIHsKICAgICAgICAgUHJvdmlkZXIgcCA9IG5ldyBNeVByb3ZpZGVyKCk7CiAgICAgICAgIFByb3ZpZGVyLlNlcnZpY2UgczEgPSBuZXcgUHJvdmlkZXIuU2VydmljZShwLCAidHlwZSIsICJhbGdvcml0aG0iLApAQCAtMTQ2LDYgKzE4OCwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKHMyLmdldEFsZ29yaXRobSgpLmVxdWFscygiYWxnb3JpdGhtIikpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDbGFzc05hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2xhc3NOYW1lKCkgewogICAgICAgICBQcm92aWRlciBwID0gbmV3IE15UHJvdmlkZXIoKTsKICAgICAgICAgUHJvdmlkZXIuU2VydmljZSBzMSA9IG5ldyBQcm92aWRlci5TZXJ2aWNlKHAsICJ0eXBlIiwgImFsZ29yaXRobSIsCkBAIC0xNTgsNiArMjA5LDE1IEBACiAgICAgICAgIGFzc2VydFRydWUoczIuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKCJ0ZXN0cy5qYXZhLnNlY3VyaXR5LnN1cHBvcnQuUmFuZG9tSW1wbCIpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIFByb3ZpZGVyIHAgPSBuZXcgTXlQcm92aWRlcigpOwogICAgICAgICBQcm92aWRlci5TZXJ2aWNlIHMxID0gbmV3IFByb3ZpZGVyLlNlcnZpY2UocCwgInR5cGUiLCAiYWxnb3JpdGhtIiwKQEAgLTE3MCw2ICsyMzAsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShzMi5nZXRQcm92aWRlcigpID09IHApOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB7CiAgICAgICAgIFByb3ZpZGVyIHAgPSBuZXcgTXlQcm92aWRlcigpOwogICAgICAgICBQcm92aWRlci5TZXJ2aWNlIHMxID0gbmV3IFByb3ZpZGVyLlNlcnZpY2UocCwgInR5cGUiLCAiYWxnb3JpdGhtIiwKQEAgLTE4Miw2ICsyNTEsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShzMi5nZXRUeXBlKCkuZXF1YWxzKCJTZWN1cmVSYW5kb20iKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c1BhcmFtZXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwb3J0c1BhcmFtZXRlcigpIHsKICAgICAgICAgUHJvdmlkZXIgcCA9IG5ldyBNeVByb3ZpZGVyKCk7CiAgICAgICAgIFByb3ZpZGVyLlNlcnZpY2UgczEgPSBuZXcgUHJvdmlkZXIuU2VydmljZShwLCAidHlwZSIsICJhbGdvcml0aG0iLApAQCAtMTkwLDcgKzI2OCwxNiBAQAogICAgICAgICBhc3NlcnRUcnVlKHMxLnN1cHBvcnRzUGFyYW1ldGVyKG5ldyBPYmplY3QoKSkpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFRvU3RyaW5nKCkgewogICAgICAgICBQcm92aWRlciBwID0gbmV3IE15UHJvdmlkZXIoKTsKICAgICAgICAgUHJvdmlkZXIuU2VydmljZSBzMSA9IG5ldyBQcm92aWRlci5TZXJ2aWNlKHAsICJ0eXBlIiwgImFsZ29yaXRobSIsCiAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIsIG51bGwsIG51bGwpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcm92aWRlclRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggODI3ZDJiYS4uZjRiYWZlOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9Qcm92aWRlclRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0yMiw2ICsyMiwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzksNyArNDQsNyBAQAogCiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvdmlkZXIuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5Qcm92aWRlcjwvY29kZT4gY29uc3RydWN0b3IgYW5kIG1ldGhvZHMKICAqIApAQCAtNTksNiArNjQsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgUHJvdmlkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHByb3ZpZGVyIG9iamVjdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQcm92aWRlcigpIHsKICAgICAgICAgaWYgKCFwLmdldFByb3BlcnR5KCJQcm92aWRlci5pZCBuYW1lIikuZXF1YWxzKAogICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHAuZ2V0TmFtZSgpKSkpIHsKQEAgLTc4LDYgKzkyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDbGVhcigpIHsKICAgICAgICAgcC5jbGVhcigpOwogICAgICAgICBpZiAocC5nZXRQcm9wZXJ0eSgiTWVzc2FnZURpZ2VzdC5TSEEtMSIpICE9IG51bGwpIHsKQEAgLTg4LDYgKzExMSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBQcm92aWRlcihTdHJpbmcsIGRvdWJsZSwgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggbm9uIG51bGwgcGFyYW1ldGVycyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQcm92aWRlclN0cmluZ2RvdWJsZVN0cmluZygpIHsKICAgICAgICAgUHJvdmlkZXIgcCA9IG5ldyBNeVByb3ZpZGVyKCJQcm92aWRlciBuYW1lIiwgMTIzLjQ1NiwgIlByb3ZpZGVyIGluZm8iKTsKICAgICAgICAgaWYgKCFwLmdldE5hbWUoKS5lcXVhbHMoIlByb3ZpZGVyIG5hbWUiKSB8fCBwLmdldFZlcnNpb24oKSAhPSAxMjMuNDU2CkBAIC05NiwxOCArMTI4LDQ1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXROYW1lKCkgewogICAgICAgICBpZiAoIXAuZ2V0TmFtZSgpLmVxdWFscygiTXlQcm92aWRlciIpKSB7CiAgICAgICAgICAgICBmYWlsKCJJbmNvcnJlY3QgcHJvdmlkZXIgbmFtZSIpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VmVyc2lvbigpIHsKICAgICAgICAgaWYgKHAuZ2V0VmVyc2lvbigpICE9IDEuMCkgewogICAgICAgICAgICAgZmFpbCgiSW5jb3JyZWN0IHByb3ZpZGVyIHZlcnNpb24iKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEluZm8oKSB7CiAgICAgICAgIGlmICghcC5nZXRJbmZvKCkuZXF1YWxzKCJQcm92aWRlciBmb3IgdGVzdGluZyIpKSB7CiAgICAgICAgICAgICBmYWlsKCJJbmNvcnJlY3QgcHJvdmlkZXIgaW5mbyIpOwpAQCAtMTE3LDYgKzE3NiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBwdXRBbGwoTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFB1dEFsbE1hcCgpIHsKICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgaG0ucHV0KCJNZXNzYWdlRGlnZXN0LlNIQS0xIiwgImFhYS5iYmIuY2NjLmRkZCIpOwpAQCAtMTM4LDYgKzIwNiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU2V0IGVudHJ5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbnRyeVNldCgpIHsKICAgICAgICAgcC5wdXQoIk1lc3NhZ2VEaWdlc3QuU0hBLTI1NiIsICJhYWEuYmJiLmNjYy5kZGQiKTsKIApAQCAtMTkwLDYgKzI2NywxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU2V0IGtleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RLZXlTZXQoKSB7CiAgICAgICAgIHAucHV0KCJNZXNzYWdlRGlnZXN0LlNIQS0yNTYiLCAiYWFhLmJiYi5jY2MuZGRkIik7CiAKQEAgLTIyMCw2ICszMDYsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIENvbGxlY3Rpb24gdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VmFsdWVzKCkgewogICAgICAgICBwLnB1dCgiTWVzc2FnZURpZ2VzdC5TSEEtMjU2IiwgImFhYS5iYmIuY2NjLmRkZCIpOwogCkBAIC0yNDYsNiArMzQxLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBPYmplY3QgcHV0KE9iamVjdCwgT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFB1dE9iamVjdE9iamVjdCgpIHsKICAgICAgICAgcC5wdXQoIk1lc3NhZ2VEaWdlc3QuU0hBLTEiLCAiYWFhLmJiYi5jY2MuZGRkIik7CiAgICAgICAgIHAucHV0KCJUeXBlLkFsZ29yaXRobSIsICJjbGFzc05hbWUiKTsKQEAgLTI4Miw2ICszODYsMTYgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIE9iamVjdCByZW1vdmUoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iICsKKyAgICAgICAgICAgICAgICAgICJWZXJpZmljYXRpb24gd2l0aCBudWxsIHBhcmFtZXRlciBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVtb3ZlT2JqZWN0KCkgewogICAgICAgICBPYmplY3QgbyA9IHAucmVtb3ZlKCJNZXNzYWdlRGlnZXN0LlNIQS0xIik7CiAgICAgICAgIGlmICghIlNvbWVDbGFzc05hbWUiLmVxdWFscyhvKSkgewpAQCAtMjk1LDYgKzQwOSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VydmljZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNlcnZpY2UxKCkgewogICAgICAgICBwLnB1dCgiTWVzc2FnZURpZ2VzdC5TSEEtMSIsICJBbm90aGVyQ2xhc3NOYW1lIik7CiAgICAgICAgIFByb3ZpZGVyLlNlcnZpY2UgcyA9IHAuZ2V0U2VydmljZSgiTWVzc2FnZURpZ2VzdCIsICJTSEEtMSIpOwpAQCAtMzI3LDYgKzQ1MCwxNSBAQAogICAgIC8vIH0KIAogICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjc2MC4KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3Q6IHZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggdHdvIG51bGwgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGRvdWJsZS5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIE15UHJvdmlkZXIgbXlQcm92aWRlciA9IG5ldyBNeVByb3ZpZGVyKG51bGwsIDEsIG51bGwpOwogICAgICAgICBhc3NlcnROdWxsKG15UHJvdmlkZXIuZ2V0TmFtZSgpKTsKQEAgLTMzNSw2ICs0NjcsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgbXlQcm92aWRlci5nZXRQcm9wZXJ0eSgiUHJvdmlkZXIuaWQgaW5mbyIpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3Q6IG1ldGhvZCB3YXMgdXNlZCBmb3Igc3BlY2lhbCBwcm92aWRlciBvYmplY3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZXJ2aWNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRTZXJ2aWNlcygpIHsKICAgICAgICAgTXlQcm92aWRlciBteVByb3ZpZGVyID0gbmV3IE15UHJvdmlkZXIobnVsbCwgMSwgbnVsbCk7CiAgICAgICAgIFNldDxQcm92aWRlci5TZXJ2aWNlPiBzZXJ2aWNlcyA9IG15UHJvdmlkZXIuZ2V0U2VydmljZXMoKTsKQEAgLTM3Myw2ICs1MTQsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShhY3R1YWwuY29udGFpbnMoc1syXSkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdDogbWV0aG9kIHdhcyB1c2VkIGZvciBzcGVjaWFsIHByb3ZpZGVyIG9iamVjdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dFNlcnZpY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJvdmlkZXIuU2VydmljZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFB1dFNlcnZpY2UoKSB7CiAgICAgICAgIE15UHJvdmlkZXIgbXlQcm92aWRlciA9IG5ldyBNeVByb3ZpZGVyKG51bGwsIDEsIG51bGwpOwogICAgICAgICBQcm92aWRlci5TZXJ2aWNlIHNbXSA9IG5ldyBQcm92aWRlci5TZXJ2aWNlWzNdOwpAQCAtNDIyLDYgKzU3MiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0OiBtZXRob2Qgd2FzIHVzZWQgZm9yIHNwZWNpYWwgcHJvdmlkZXIgb2JqZWN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlU2VydmljZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm92aWRlci5TZXJ2aWNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVtb3ZlU2VydmljZSgpIHsKICAgICAgICAgTXlQcm92aWRlciBteVByb3ZpZGVyID0gbmV3IE15UHJvdmlkZXIobnVsbCwgMSwgbnVsbCk7CiAgICAgICAgIHRyeSB7CkBAIC00OTEsNiArNjUwLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGxvYWQoSW5wdXRTdHJlYW0pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibG9hZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtJbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdExvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh3cml0ZVByb3BlcnRpZXMoKSk7CiAgICAgICAgIE15UHJvdmlkZXIgbXlQcm92aWRlciA9IG5ldyBNeVByb3ZpZGVyKCJuYW1lIiwgMSwgImluZm8iKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvUHVibGljS2V5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QdWJsaWNLZXlUZXN0LmphdmEKaW5kZXggOGZjMjM0Mi4uMTZhNjBjZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QdWJsaWNLZXlUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9QdWJsaWNLZXlUZXN0LmphdmEKQEAgLTIxLDExICsyMSwxNiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoUHVibGljS2V5LmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+UHVibGljS2V5PC9jb2RlPiBjbGFzcyBmaWVsZAogICogCkBAIC00Niw2ICs1MSwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3QgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+IGZpZWxkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkZpZWxkIHRlc3RpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXJpYWxWZXJzaW9uVUlEIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkKCkgewogICAgICAgICBjaGVja1B1YmxpY0tleSBjUEsgPSBuZXcgY2hlY2tQdWJsaWNLZXkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2VyaWFsVmVyc2lvblVJRCIsIGNQSy5nZXRTZXJWZXJVSUQoKSwgLy9QdWJsaWNLZXkuc2VyaWFsVmVyc2lvblVJRCwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJlQ2xhc3NMb2FkZXIyVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cmVDbGFzc0xvYWRlcjJUZXN0LmphdmEKaW5kZXggMGZiNDZjOS4uNmNjNDQ5YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cmVDbGFzc0xvYWRlcjJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cmVDbGFzc0xvYWRlcjJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMjgsMTIgKzMzLDIyIEBACiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhTZWN1cmVDbGFzc0xvYWRlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBTZWN1cmVDbGFzc0xvYWRlcjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyZUNsYXNzTG9hZGVyI2dldFBlcm1pc3Npb25zKGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBlcm1pc3Npb25zTGphdmFfc2VjdXJpdHlfQ29kZVNvdXJjZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBudWxsIHBhcmFtZXRlciBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZXJtaXNzaW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRQZXJtaXNzaW9uc0xqYXZhX3NlY3VyaXR5X0NvZGVTb3VyY2UoKSB7CiAgICAgICAgIGNsYXNzIE15Q2xhc3NMb2FkZXIgZXh0ZW5kcyBTZWN1cmVDbGFzc0xvYWRlciB7CiAgICAgICAgICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybXMoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBlcm1pc3Npb25zKG5ldyBDb2RlU291cmNlKG51bGwsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbTJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbTJUZXN0LmphdmEKaW5kZXggY2FjZTQ5NC4uN2IzNTg3MiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb20yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tMlRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKQEAgLTI1LDcgKzMwLDcgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKFNlY3VyZVJhbmRvbS5jbGFzcykKIHB1YmxpYyBjbGFzcyBTZWN1cmVSYW5kb20yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTRUVEX0JZVEVTID0geyAoYnl0ZSkgMzMsIChieXRlKSAxNSwgKGJ5dGUpIC0zLApAQCAtMzUsNiArNDAsMTUgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0VFRF9WQUxVRSA9IDUzMzU0ODY3NTlMOwogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFByb3ZpZGVyKCkgewogICAgICAgICBTZWN1cmVSYW5kb20gc3IxID0gbmV3IFNlY3VyZVJhbmRvbSgpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHNyMS5nZXRQcm92aWRlcigpKTsKQEAgLTU3LDYgKzcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tI1NlY3VyZVJhbmRvbSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3VyZVJhbmRvbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSgpCiAgICAgICAgIHRyeSB7CkBAIC02OSw2ICs5MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSNTZWN1cmVSYW5kb20oYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgYXJyYXkgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VjdXJlUmFuZG9tIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRCKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20oYnl0ZSBbXSkKICAgICAgICAgdHJ5IHsKQEAgLTgyLDYgKzExNCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSNTZWN1cmVSYW5kb20oamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb21TcGksCiAgICAgICogICAgICAgIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdoZW4ganVzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2VjdXJlUmFuZG9tIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NlY3VyZVJhbmRvbVNwaS5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9zZWN1cml0eV9TZWN1cmVSYW5kb21TcGlfamF2YV9zZWN1cml0eV9Qcm92aWRlcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBNeVNlY3VyZVJhbmRvbShudWxsLCBudWxsKTsKQEAgLTEwMyw2ICsxNDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20jZ2VuZXJhdGVTZWVkKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBuZWdhdGl2ZSBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVTZWVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmF0ZVNlZWRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBbXSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbS5nZW5lcmF0ZVNlZWQoaW50KQogICAgICAgICBieXRlW10gc2VlZCA9IG5ldyBTZWN1cmVSYW5kb20oKS5nZW5lcmF0ZVNlZWQoU0VFRF9TSVpFKTsKQEAgLTExMiw2ICsxNjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20jZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMTI2LDYgKzE4NSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSNnZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLApAQCAtMTUxLDYgKzIxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSNnZXRTZWVkKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgbmVnYXRpdmUgcGFyYW1ldGVyIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlZWRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBbXSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbS5nZXRTZWVkKGludCkKICAgICAgICAgYnl0ZVtdIHNlZWQgPSBTZWN1cmVSYW5kb20uZ2V0U2VlZChTRUVEX1NJWkUpOwpAQCAtMTYwLDYgKzIzNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSNuZXh0Qnl0ZXMoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgYXJyYXkgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dEJ5dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0Qnl0ZXMkQigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20ubmV4dEJ5dGVzKGJ5dGUgW10pCiAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzMxM107CkBAIC0xNzMsNiArMjU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tI3NldFNlZWQoYnl0ZVtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgYXJyYXkgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2VlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VlZCRCKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbS5zZXRTZWVkKGJ5dGUgW10pCiAgICAgICAgIHRyeSB7CkBAIC0xODUsNiArMjgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tI3NldFNlZWQobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgbmVnYXRpdmUgYW5kIGJvdW5kYXJ5IHZhbHVlcyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTZWVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VlZEooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tLnNldFNlZWQobG9uZykKICAgICAgICAgdHJ5IHsKQEAgLTE5Nyw2ICszMDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20jZ2V0QWxnb3JpdGhtKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJKdXN0IHZlcmlmaWNhdGlvbiBvZiBjYXNlIHdoZW4gYWxnb3JpdGhtIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGdvcml0aG0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsZ29yaXRobSgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03NTAKIApAQCAtMjIwLDYgKzMzMywxNSBAQAogICAgIH0KIAogICAgIC8vIFJlZ3Jlc3Npb24gVGVzdCBmb3IgSEFSTU9OWS0zNTUyLgorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBib3VuZGFyeSB2YWx1ZXMgKE1BWCBhbmQgTUlOIHZhbHVlcykgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV4dEooKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTXlTZWN1cmVSYW5kb20gbXlTZWN1cmVSYW5kb20gPSBuZXcgTXlTZWN1cmVSYW5kb20oCiAgICAgICAgICAgICAgICAgbmV3IE15U2VjdXJlUmFuZG9tU3BpKCksIG51bGwpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cml0eTJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5MlRlc3QuamF2YQppbmRleCA5NTRmZjZlLi5kNjA4M2E2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5MlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5MlRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CkBAIC0yOCwxMiArMzMsMjEgQEAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfUHJvdmlkZXJUcnVzdDsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfVGVzdFByb3ZpZGVyOwogCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHkuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2VjdXJpdHkyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cml0eSNnZXRQcm92aWRlcnMoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm92aWRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3ZpZGVyc0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5LmdldFByb3ZpZGVycyhqYXZhLmxhbmcuU3RyaW5nKQpAQCAtMjA5LDYgKzIyMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5I2dldFByb3ZpZGVycyhqYXZhLnV0aWwuTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtNYXAuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXJzTGphdmFfdXRpbF9NYXAoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKGphdmEudXRpbC5NYXApCkBAIC0yOTQsNiArMzE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2VjdXJpdHkjcmVtb3ZlUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUHJvdmlkZXJMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5TZWN1cml0eS5yZW1vdmVQcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb24yVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb24yVGVzdC5qYXZhCmluZGV4IGRlZmM0ZGMuLmQ0NTcwMWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJpdHlQZXJtaXNzaW9uMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5UGVybWlzc2lvbjJUZXN0LmphdmEKQEAgLTE3LDEzICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzKQogcHVibGljIGNsYXNzIFNlY3VyaXR5UGVybWlzc2lvbjJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiNTZWN1cml0eVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCB2YWxpZCBwYXJhbWV0ZXIgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3VyaXR5UGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIGFzc2VydEVxdWFscygiY3JlYXRlIHNlY3VyaXR5UGVybWlzc2lvbiBjb25zdHJ1Y3RvcihzdHJpbmcpIGZhaWxlZCIsCkBAIC0zNiw2ICs1MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiNTZWN1cml0eVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCB2YWxpZCBwYXJhbWV0ZXJzIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZWN1cml0eVBlcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJpdHlQZXJtaXNzaW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggMmM5YjJiZi4uMGQ1MjY4NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb25UZXN0LmphdmEKQEAgLTIyLDEwICsyMiwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+U2VjdXJpdHlQZXJtaXNzaW9uPC9jb2RlPgogICogCkBAIC01MCw2ICs1NSwxOSBAQAogICAgICAqIElmICBuYW1lIGlzIGVtcHR5IHRoZW4gSUFFIHNob3VsZCBiZSB0aHJvd24uIAogICAgICAqIEFjdGlvbiBpcyBpZ25vcmVkLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZWN1cml0eVBlcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3VyaXR5UGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEN0b3IoKQogICAgIHsKICAgICAgICAgU3RyaW5nIG5hbWUgPSAiYmFzaWMxMjMqJCUjIjsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJpdHlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5VGVzdC5qYXZhCmluZGV4IGM1NmI5ZWMuLjU3OWFkZGUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJpdHlUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cml0eVRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwpAQCAtMzgsMTIgKzQzLDIxIEBACiAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eS5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlNlY3VyaXR5PC9jb2RlPiBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcwogICovCiBwdWJsaWMgY2xhc3MgU2VjdXJpdHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiTWV0aG9kcyBmcm9tIGphdmEuc2VjdXJpdHkuU2VjdXJpdHkgY2xhc3MgYXJlIG5vdCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TWl4ZWQoKSB7CiAKICAgICAgICAgVGVzdEtleVBhaXIgdGtwID0gbnVsbDsKQEAgLTY5LDYgKzgzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2VjdXJpdHkjaW5zZXJ0UHJvdmlkZXJBdChQcm92aWRlciwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydFByb3ZpZGVyQXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJvdmlkZXIuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9pbnNlcnRQcm92aWRlckF0TGphdmFfc2VjdXJpdHlfUHJvdmlkZXJMSSgpIHsKIAogICAgICAgICB0cnkgewpAQCAtMTEzLDcgKzEzNiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5I2FkZFByb3ZpZGVyKFByb3ZpZGVyKQogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfYWRkUHJvdmlkZXJMamF2YV9zZWN1cml0eV9Qcm92aWRlcigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgX3Rlc3RfYWRkUHJvdmlkZXJMamF2YV9zZWN1cml0eV9Qcm92aWRlcigpIHsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgU2VjdXJpdHkuYWRkUHJvdmlkZXIobnVsbCk7CkBAIC0xNDEsOCArMTczLDE3IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2VjdXJpdHkjZ2V0QWxnb3JpdGhtUHJvcGVydHkoU3RyaW5nIGFsZ05hbWUsCiAgICAgICogICAgICAgIFN0cmluZyBwcm9wTmFtZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBudWxsIHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnb3JpdGhtUHJvcGVydHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEFsZ29yaXRobVByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmdfamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBfdGVzdEdldEFsZ29yaXRobVByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmdfamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gbnVsbDsKICAgICAgICAgCiAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IE15UHJvdmlkZXIoKTsKQEAgLTE2Myw3ICsyMDQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cml0eSNnZXRBbGdvcml0aG1zKFN0cmluZyBzZXJ2aWNlTmFtZSkKICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QWxnb3JpdGhtc0xqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vdCBzdXBwb3J0ZWQgc2VydmljZU5hbWUgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnb3JpdGhtcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIF90ZXN0R2V0QWxnb3JpdGhtc0xqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdbXSBzZXJ2aWNlc05hbWVzID0geyAiU2lnbmF0dXJlIiwgIk1lc3NhZ2VEaWdlc3QiLCAiQ2lwaGVyIiwKICAgICAgICAgICAgICAgICAiTWFjIiwgIktleVN0b3JlIiB9OwogCkBAIC0xODcsNiArMjM3LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbmNvcnJlY3QgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZVByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJlbW92ZVByb3ZpZGVyKCkgewogICAgICAgICBQcm92aWRlcltdIHByb3ZpZGVyczsKICAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMxOwpAQCAtMjE2LDYgKzI3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5I2dldFByb3ZpZGVyKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2dldFByb3ZpZGVyTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAKICAgICAgICAgLy8gUmV0dXJucyBudWxsIGlmIG5vIHByb3ZpZGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlzIGluc3RhbGxlZApAQCAtMjQ3LDYgKzMxNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5I2dldFByb3ZpZGVycyhTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXJzTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAKICAgICAgICAgdHJ5IHsKQEAgLTMwMSw2ICszNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cml0eSNnZXRQcm92aWRlcnMoamF2YS51dGlsLk1hcCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvdmlkZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge01hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm92aWRlcnNMamF2YV91dGlsX01hcCgpIHsKIAogICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKQEAgLTM3Myw2ICs0NTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cml0eSNnZXRQcm9wZXJ0eShTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIG51bGwgcGFyYW1ldGVyIG9ubHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvcGVydHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmcoKSB7CiAKICAgICAgICAgdHJ5IHsKQEAgLTM4NSw2ICs0ODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TZWN1cml0eSNzZXRQcm9wZXJ0eShTdHJpbmcsU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFByb3BlcnR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFByb3BlcnR5TGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKIAogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmUyVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmUyVGVzdC5qYXZhCmluZGV4IDM4ODcyNTcuLmE4NTAwNTkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlMlRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZTJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKQEAgLTMxLDcgKzM2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoU2lnbmF0dXJlLmNsYXNzKQogcHVibGljIGNsYXNzIFNpZ25hdHVyZTJUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gImFiYyI7CkBAIC01MCw2ICs1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2hlY2tpbmcgd2FzIHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduYXR1cmUgcyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiRFNBIik7CiAgICAgICAgIHRyeSB7CkBAIC02Myw2ICs3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSNnZXRBbGdvcml0aG0oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGdvcml0aG0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsZ29yaXRobSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgYWxnID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJEU0EiKS5nZXRBbGdvcml0aG0oKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0QWxnb3JpdGhtIGRpZCBub3QgZ2V0IERTQSAoIiArIGFsZyArICIpIiwgYWxnCkBAIC03Miw2ICs5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSNnZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoIkRTQSIpOwogICAgIH0KQEAgLTgwLDYgKzExMiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSNnZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ19qYXZhX3NlY3VyaXR5X1Byb3ZpZGVyKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm92aWRlcltdIHByb3ZpZGVycyA9IFNlY3VyaXR5LmdldFByb3ZpZGVycygiU2lnbmF0dXJlLkRTQSIpOwpAQCAtMTE2LDYgKzE1NywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSNnZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCJTaWduYXR1cmUuRFNBIik7CkBAIC0xMjgsNiArMTc4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlI2dldFBhcmFtZXRlcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkp1c3QgZXhjZXB0aW9uIGNhc2Ugd2FzIHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2lnbmF0dXJlIHNpZyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiRFNBIik7CiAgICAgICAgIHRyeSB7CkBAIC0xNDAsNiArMTk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlI2dldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkp1c3QgZXhjZXB0aW9uIGNhc2Ugd2FzIHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhcmFtZXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQYXJhbWV0ZXJMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduYXR1cmUgc2lnID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJEU0EiKTsKQEAgLTE1NCw2ICsyMjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUjZ2V0UHJvdmlkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvdmlkZXIgcCA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiRFNBIikuZ2V0UHJvdmlkZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgicHJvdmlkZXIgaXMgbnVsbCIsIHApOwpAQCAtMTYyLDYgKzIzOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSNpbml0U2lnbihqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0U2lnbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdFNpZ25MamF2YV9zZWN1cml0eV9Qcml2YXRlS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiRFNBIikuaW5pdFNpZ24oa2V5cy5nZXRQcml2YXRlKCkpOwogICAgIH0KQEAgLTE2OSw2ICsyNTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUjaW5pdFZlcmlmeShqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkS2V5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRTaWduIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUHJpdmF0ZUtleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0VmVyaWZ5TGphdmFfc2VjdXJpdHlfUHVibGljS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiRFNBIikuaW5pdFZlcmlmeShrZXlzLmdldFB1YmxpYygpKTsKICAgICB9CkBAIC0xNzYsNiArMjcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlI2luaXRWZXJpZnkoamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRLZXlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdFZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0VmVyaWZ5TGphdmFfc2VjdXJpdHlfQ2VydGlmaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUHJvdmlkZXIgcCA9IG5ldyBNeVByb3ZpZGVyKCk7CiAgICAgICAgIHAucHV0KCJEU0EiLCAidGVzdHMuamF2YS5zZWN1cml0eS5zdXBwb3J0LmNlcnQuTXlDZXJ0aWZpY2F0ZSQxIik7CkBAIC0yMDAsNiArMzA0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlI3NldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkp1c3QgZXhjZXB0aW9uIGNhc2Ugd2FzIHRlc3RlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFBhcmFtZXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFBhcmFtZXRlckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yMTgsNiArMzMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlI3NldFBhcmFtZXRlcihqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJKdXN0IGV4Y2VwdGlvbiBjYXNlIHdhcyB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQYXJhbWV0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFyYW1ldGVyTGphdmFfc2VjdXJpdHlfc3BlY19BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduYXR1cmUgc2lnID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJEU0EiKTsKQEAgLTIzNiw2ICszNTgsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUjc2lnbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIHJldHVybmVkIHZhbHVlIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgICAiU2lnbmF0dXJlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaWduIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNpZ25hdHVyZSBzaWcgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoIkRTQSIpOwogICAgICAgICBzaWcuaW5pdFNpZ24oa2V5cy5nZXRQcml2YXRlKCkpOwpAQCAtMjQ2LDYgKzM3OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSN0b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc3RyID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJEU0EiKS50b1N0cmluZygpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJ0b1N0cmluZyBpcyBudWxsIiwgc3RyKTsKQEAgLTI1NCw2ICszOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUjdXBkYXRlKGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTaWduYXR1cmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91cGRhdGUkQigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduYXR1cmUgc2lnID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJEU0EiKTsKICAgICAgICAgc2lnLmluaXRTaWduKGtleXMuZ2V0UHJpdmF0ZSgpKTsKQEAgLTI2NSw2ICs0MTUsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUjdXBkYXRlKGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2lnbmF0dXJlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIG9mIGRpZmZlcmVudCB2YWx1ZXMgb2ZmIGFuZCBsZW4gbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZSRCSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2lnbmF0dXJlIHNpZyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiRFNBIik7CiAgICAgICAgIHNpZy5pbml0U2lnbihrZXlzLmdldFByaXZhdGUoKSk7CkBAIC0yNzYsNiArNDM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlI3VwZGF0ZShieXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91cGRhdGVCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNpZ25hdHVyZSBzaWcgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoIkRTQSIpOwogICAgICAgICBzaWcuaW5pdFNpZ24oa2V5cy5nZXRQcml2YXRlKCkpOwpAQCAtMjg2LDYgKzQ1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSN1cGRhdGUoQnl0ZUJ1ZmZlciBkYXRhKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91cGRhdGVMamF2YV9uaW9fQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduYXR1cmUgc2lnID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJEU0EiKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwKTsKQEAgLTMwOCw2ICs0ODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUjdmVyaWZ5KGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTaWduYXR1cmVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmVyaWZ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF92ZXJpZnkkQigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduYXR1cmUgc2lnID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJEU0EiKTsKICAgICAgICAgc2lnLmluaXRTaWduKGtleXMuZ2V0UHJpdmF0ZSgpKTsKQEAgLTMyMiw2ICs1MDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUjdmVyaWZ5KGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIGRpZmZlcmVudCB2YWx1ZXMgb2Zmc2V0IGFuZCBsZW5ndGggbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZlcmlmeSRCSUkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2lnbmF0dXJlIHNpZyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiRFNBIik7CiAgICAgICAgIHNpZy5pbml0U2lnbihrZXlzLmdldFByaXZhdGUoKSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjJUZXN0LmphdmEKaW5kZXggNGRmMWFmMC4uY2EwNzc5ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb24yVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uMlRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhTaWduYXR1cmVFeGNlcHRpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2lnbmF0dXJlRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlRXhjZXB0aW9uI1NpZ25hdHVyZUV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbigpCiAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiBlID0gbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbigpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb24jU2lnbmF0dXJlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggbnVsbCBzdHJpbmcgcGFyYW1ldGVyIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiBlID0gbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbigidGVzdCBtZXNzYWdlIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDcwYjI3NTQuLmRlNjVjMjcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTYgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCitAVGVzdFRhcmdldENsYXNzKFNpZ25hdHVyZUV4Y2VwdGlvbi5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlNpZ25hdHVyZUV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgogICogCkBAIC01NSw2ICs2MCwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPlNpZ25hdHVyZUV4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CiAgICAgICogY29uc3RydWN0cyBTaWduYXR1cmVFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaWduYXR1cmVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbmF0dXJlRXhjZXB0aW9uMDEoKSB7CiAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiB0RSA9IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKQEAgLTY2LDYgKzgwLDE1IEBACiAgICAgICogY29uc3RydWN0cyBTaWduYXR1cmVFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuIFBhcmFtZXRlcgogICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2lnbmF0dXJlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZUV4Y2VwdGlvbjAyKCkgewogICAgICAgICBTaWduYXR1cmVFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtODAsNiArMTAzLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+U2lnbmF0dXJlRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKICAgICAgKiBjb25zdHJ1Y3RzIFNpZ25hdHVyZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYXR1cmVFeGNlcHRpb24wMygpIHsKICAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CiAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiB0RSA9IG5ldyBTaWduYXR1cmVFeGNlcHRpb24obXNnKTsKQEAgLTkyLDYgKzEyNCwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBTaWduYXR1cmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMKICAgICAgKiBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYXR1cmVFeGNlcHRpb24wNCgpIHsKICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKICAgICAgICAgU2lnbmF0dXJlRXhjZXB0aW9uIHRFID0gbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihjYXVzZSk7CkBAIC0xMDQsNiArMTQ1LDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIFNpZ25hdHVyZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QKICAgICAgKiBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2lnbmF0dXJlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Rocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZUV4Y2VwdGlvbjA1KCkgewogICAgICAgICBTaWduYXR1cmVFeGNlcHRpb24gdEUgPSBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKHRDYXVzZSk7CiAgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewpAQCAtMTIyLDYgKzE3MiwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBTaWduYXR1cmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMKICAgICAgKiBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZUV4Y2VwdGlvbjA2KCkgewogICAgICAgICBTaWduYXR1cmVFeGNlcHRpb24gdEUgPSBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKG51bGwsIG51bGwpOwogICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldE1lc3NhZ2UoKSk7CkBAIC0xMzMsNiArMTkyLDE1IEBACiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIFNpZ25hdHVyZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcwogICAgICAqIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZUV4Y2VwdGlvbjA3KCkgewogICAgICAgICBTaWduYXR1cmVFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpAQCAtMTQ4LDYgKzIxNiwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBTaWduYXR1cmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90CiAgICAgICogbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaWduYXR1cmVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYXR1cmVFeGNlcHRpb24wOCgpIHsKICAgICAgICAgU2lnbmF0dXJlRXhjZXB0aW9uIHRFID0gbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihudWxsLCB0Q2F1c2UpOwogICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKQEAgLTE2Niw2ICsyNDMsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgU2lnbmF0dXJlRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdAogICAgICAqIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25hdHVyZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZUV4Y2VwdGlvbjA5KCkgewogICAgICAgICBTaWduYXR1cmVFeGNlcHRpb24gdEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmVTcGlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZVNwaVRlc3QuamF2YQppbmRleCA0MThmNWQxLi5jYWRjNTA4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZVNwaVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZVNwaVRlc3QuamF2YQpAQCAtMSwxMSArMSwxNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZVNwaTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhTaWduYXR1cmVTcGkuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2lnbmF0dXJlU3BpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNiw2ICsyMSwxNSBAQAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKICAgICAgICAgTXlTaWduYXR1cmVTcGkxIHNzMSA9IG5ldyBNeVNpZ25hdHVyZVNwaTEoKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmVUZXN0LmphdmEKaW5kZXggYzFlYWJmNC4uNWI5YWY5MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmVUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmVUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OwpAQCAtMzMsNyArMzksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0Lk15U2lnbmF0dXJlMTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhTaWduYXR1cmUuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5TaWduYXR1cmU8L2NvZGU+IGNvbnN0cnVjdG9yIGFuZCBtZXRob2RzCiAgKiAKQEAgLTQzLDYgKzQ5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBTaWduYXR1cmUoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaWduYXR1cmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIFN0cmluZyBbXSBhbGdvcml0aG1zID0geyAiU0hBMjU2V0lUSFJTQSIsICJOT05FV0lUSERTQSIsICJTSEEzODRXSVRIUlNBIiwKICAgICAgICAgICAgICJNRDJXSVRIUlNBIiwgIk1ENUFORFNIQTFXSVRIUlNBIiwgIlNIQTUxMldJVEhSU0EiLApAQCAtNjgsNiArODMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIE9iamVjdCBjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSnVzdCBleGNlcHRpb24gY2FzZSB3YXMgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIHRyeSB7CkBAIC03Nyw2ICsxMDEsMTUgQEAKICAgICAgICAgfSAgICAKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIApAQCAtODQsNiArMTE3LDE1IEBACiAgICAgICAgIGFzc2VydE51bGwoInByb3ZpZGVyIiwgcy5nZXRQcm92aWRlcigpKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFsZ29yaXRobSgpIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKIApAQCAtOTQsNiArMTM2LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGluaXRWZXJpZnkoUHVibGljS2V5KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRLZXlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdFZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQdWJsaWNLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0VmVyaWZ5UHVibGljS2V5KCkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogCkBAIC0xMDUsNiArMTU2LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGluaXRWZXJpZnkoQ2VydGlmaWNhdGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0VmVyaWZ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluaXRWZXJpZnlDZXJ0aWZpY2F0ZSgpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKIApAQCAtMTE2LDYgKzE3NiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBpbml0U2lnbihQcml2YXRlS2V5KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRLZXlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdFNpZ24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJpdmF0ZUtleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluaXRTaWduUHJpdmF0ZUtleSgpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKIApAQCAtMTI3LDYgKzE5NiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBpbml0U2lnbihQcml2YXRlS2V5LCBTZWN1cmVSYW5kb20pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0U2lnbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcml2YXRlS2V5LmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0U2lnblByaXZhdGVLZXlTZWN1cmVSYW5kb20oKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAKQEAgLTEzOCw2ICsyMTYsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJ5dGVbXSBzaWduKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgcmV0dXJuZWQgdmFsdWUgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2lnbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIHRyeSB7CkBAIC0xNjMsNiArMjUwLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBzaWduKGJ5dGVbXSwgb2Zmc2V0LCBsZW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggZGlmZmVyZW50IHZhbHVlcyBvZiBvZmZzZXQgYW5kIGxlbiBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzaWduIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYnl0ZWludGludCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogICAgICAgICBieXRlW10gb3V0YnVmID0gbmV3IGJ5dGUgWzEwXTsKQEAgLTE5MCw2ICsyODYsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJvb2xlYW4gdmVyaWZ5KGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgcmV0dXJuZWQgdmFsdWUgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmVyaWZ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeWJ5dGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogICAgICAgICBieXRlW10gYiA9IHsxLCAyLCAzLCA0fTsKQEAgLTIxNSw2ICszMjAsMTYgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJvb2xlYW4gdmVyaWZ5KGJ5dGVbXSwgaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIHJldHVybmVkIHZhbHVlIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIG9mIGRpZmZlcmVudCBwYXJhbWV0ZXJzIG9mZnNldCBhbmQgbGVuZ3RoIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2ZXJpZnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeWJ5dGVBcnJheWludGludCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogICAgICAgICBieXRlW10gYiA9IHsxLCAyLCAzLCA0fTsKQEAgLTI0OCw2ICszNjMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgdXBkYXRlKGJ5dGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQm91bmRhcnkgdGVzdGluZyBtaXNzZWQuIFNpZ25hdHVyZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVieXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIHRyeSB7CkBAIC0yNjgsNiArMzkyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIHVwZGF0ZShieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBhcnJheS9leGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVieXRlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKICAgICAgICAgYnl0ZVtdIGIgPSB7MSwgMiwgMywgNH07CkBAIC0yODksNiArNDIyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIHVwZGF0ZShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBkaWZmZXJlbnQgdmFsdWVzIG9mZiBhbmQgbGVuIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlYnl0ZUFycmF5aW50aW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIGJ5dGVbXSBiID0gezEsIDIsIDMsIDR9OwpAQCAtMzEwLDYgKzQ1MiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBzZXRQYXJhbWV0ZXIoU3RyaW5nLCBPYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQYXJhbWV0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFBhcmFtZXRlclN0cmluZ09iamVjdCgpIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKQEAgLTMxOSw2ICs0NzAsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgc2V0UGFyYW1ldGVyKEFsZ29yaXRobVBhcmFtZXRlclNwZWMpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggdmFsaWQgcGFyYW1ldGVyIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFBhcmFtZXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFBhcmFtZXRlckFsZ29yaXRobVBhcmFtZXRlclNwZWMoKSB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25lZE9iamVjdFRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmVkT2JqZWN0VGVzdC5qYXZhCmluZGV4IDc0ZGY4NzEuLmMyYzczNTEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmVkT2JqZWN0VGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmVkT2JqZWN0VGVzdC5qYXZhCkBAIC0yMSw2ICsyMSwxMiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwpAQCAtMzMsMTQgKzM5LDIyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuVGVzdEtleVBhaXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQorQFRlc3RUYXJnZXRDbGFzcyhTaWduZWRPYmplY3QuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5TaWduZWRPYmplY3Q8L2NvZGU+IGNvbnN0cnVjdG9yIGFuZCBtZXRob2RzCiAgKiAKICAqLwogcHVibGljIGNsYXNzIFNpZ25lZE9iamVjdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiwgU2lnbmF0dXJlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25lZE9iamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLlNlcmlhbGl6YWJsZS5jbGFzcywgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5LmNsYXNzLCBTaWduYXR1cmUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduZWRPYmplY3QoKSB7CiAgICAgICAgIFNpZ25hdHVyZSBzaWcgPSBudWxsOwogICAgICAgICBUZXN0S2V5UGFpciB0a3AgPSBudWxsOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduZXJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25lclRlc3QuamF2YQppbmRleCA2ODVkZDc4Li5hN2Q3OWM3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25lclRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25lclRlc3QuamF2YQpAQCAtMjEsNiArMjEsMTIgQEAKICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKQEAgLTM1LDEzICs0MSwxMiBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCi0KLQogLyoqCiAgKiB0ZXN0cyBmb3IgY2xhc3MgU2lnbmVyCiAgKiAKICAqLwogQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKK0BUZXN0VGFyZ2V0Q2xhc3MoU2lnbmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFNpZ25lclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKQEAgLTY2LDYgKzcxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmVyI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNpZ25lciBzMSA9IG5ldyBTaWduZXJTdHViKCJ0ZXN0VG9TdHJpbmcxIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiW1NpZ25lcl10ZXN0VG9TdHJpbmcxIiwgczEudG9TdHJpbmcoKSk7CkBAIC04NCw2ICs5OCwxNSBAQAogICAgIC8qKgogICAgICAqIHZlcmlmeSBTaWduZXIoKSBjcmVhdGVzIGluc3RhbmNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpZ25lciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduZXIoKSB7CiAgICAgICAgIFNpZ25lciBzID0gbmV3IFNpZ25lclN0dWIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsKQEAgLTk0LDYgKzExNywxNSBAQAogICAgIC8qKgogICAgICAqIHZlcmlmeSBTaWduZXIoU3RyaW5nKSBjcmVhdGVzIGluc3RhbmNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggbnVsbC9lbXB0eSBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2lnbmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNpZ25lclN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduZXIgcyA9IG5ldyBTaWduZXJTdHViKCJzc3MzIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwocyk7CkBAIC0xMDQsNiArMTM2LDE2IEBACiAgICAgLyoqCiAgICAgICogdmVyaWZ5ICBTaWduZXIoU3RyaW5nLCBJZGVudGl0eVNjb3BlKSBjcmVhdGVzIGluc3RhbmNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiMS4gVmVyaWZpY2F0aW9uIHdpdGggbnVsbC9lbXB0eSBwYXJhbWV0ZXIgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAgICIyLiBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaWduZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBJZGVudGl0eVNjb3BlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbmVyU3RyaW5nSWRlbnRpdHlTY29wZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTaWduZXIgcyA9IG5ldyBTaWduZXJTdHViKCJzc3M0IiwgSWRlbnRpdHlTY29wZS5nZXRTeXN0ZW1TY29wZSgpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsKQEAgLTExNSw2ICsxNTcsMTUgQEAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgU2lnbmVyLmdldFByaXZhdGVLZXkoKSByZXR1cm5zIG51bGwgb3IgcHJpdmF0ZSBrZXkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcml2YXRlS2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFByaXZhdGVLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZSBbXSBwcml2YXRlS2V5RGF0YSA9IHsgMSwgMiwgMywgNCwgNX07ICAKICAgICAgICAgUHJpdmF0ZUtleVN0dWIgcHJpdmF0ZUtleSA9IG5ldyBQcml2YXRlS2V5U3R1YigicHJpdmF0ZSIsICJmZmYiLCBwcml2YXRlS2V5RGF0YSk7CkBAIC0xMzIsNiArMTgzLDE1IEBACiAgICAgLyoqCiAgICAgICogdmVyaWZ5IFNpZ25lci5nZXRQcml2YXRlS2V5KCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHBlcm1pc3Npb24gaXMgZGVuaWVkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpdmF0ZUtleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcml2YXRlS2V5X2RlbmllZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNeVNlY3VyaXR5TWFuYWdlciBzbSA9IG5ldyBNeVNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBzbS5kZW5pZWQuYWRkKG5ldyBTZWN1cml0eVBlcm1pc3Npb24oImdldFNpZ25lclByaXZhdGVLZXkiKSk7CkBAIC0xNTIsNiArMjEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuU2lnbmVyI3NldEtleVBhaXIoamF2YS5zZWN1cml0eS5LZXlQYWlyKSAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uLCBLZXlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0S2V5UGFpciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtLZXlQYWlyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEtleVBhaXJMamF2YV9zZWN1cml0eV9LZXlQYWlyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIAogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTI0MDgKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvVGltZXN0YW1wVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9UaW1lc3RhbXBUZXN0LmphdmEKaW5kZXggYzNkNjg0ZS4uOGFhN2VkNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9UaW1lc3RhbXBUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9UaW1lc3RhbXBUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlRpbWVzdGFtcDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGg7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CkBAIC0yOSw3ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKFRpbWVzdGFtcC5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlRpbWVzdGFtcDwvY29kZT4gY2xhc3MgZmllbGRzIGFuZCBtZXRob2RzCiAgKiAKQEAgLTQ3LDYgKzUyLDE1IEBACiAKICAgICBwcml2YXRlIENlcnRQYXRoIGNwYXRoID0gbmV3IE15Q2VydFBhdGgoZW5jb2RpbmcpOwogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm9uIG51bGwgcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUaW1lc3RhbXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7RGF0ZS5jbGFzcywgQ2VydFBhdGguY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lc3RhbXAoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgVGltZXN0YW1wKG51bGwsIGNwYXRoKTsKQEAgLTY1LDYgKzc5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBib29sZWFuIGVxdWFscyhPYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKSB7CiAgICAgICAgIFRpbWVzdGFtcCBvbmUgPSBuZXcgVGltZXN0YW1wKG5vdywgY3BhdGgpOwogICAgICAgICBUaW1lc3RhbXAgdHdvID0gbmV3IFRpbWVzdGFtcChub3csIGNwYXRoKTsKQEAgLTgwLDEwICsxMDMsMjggQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSh0d28xLmVxdWFscyh0d28xKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNpZ25lckNlcnRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ25lckNlcnRQYXRoKCkgewogICAgICAgICBhc3NlcnRTYW1lKG5ldyBUaW1lc3RhbXAobm93LCBjcGF0aCkuZ2V0U2lnbmVyQ2VydFBhdGgoKSwgY3BhdGgpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUaW1lc3RhbXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGltZXN0YW1wKCkgewogICAgICAgICBUaW1lc3RhbXAgdCA9IG5ldyBUaW1lc3RhbXAobm93LCBjcGF0aCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhub3csIHQuZ2V0VGltZXN0YW1wKCkpOwpAQCAtOTMsNiArMTM0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBTdHJpbmcgdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlRlc3QgcmVzdWx0IGlzIG5vdCB2ZXJpdmllZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewogICAgICAgICBuZXcgVGltZXN0YW1wKG5vdywgY3BhdGgpLnRvU3RyaW5nKCk7CiAgICAgfQpAQCAtMTAwLDYgKzE1MCwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU3RyaW5nIGhhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7CiAgICAgICAgIFRpbWVzdGFtcCBvbmUgPSBuZXcgVGltZXN0YW1wKG5vdywgY3BhdGgpOwogICAgICAgICBUaW1lc3RhbXAgdHdvID0gbmV3IFRpbWVzdGFtcChub3csIGNwYXRoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb25UZXN0LmphdmEKaW5kZXggYzE4Yzk2NC4uOTc5OGIyNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb25UZXN0LmphdmEKQEAgLTIyLDEwICsyMiwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbi5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbjwvY29kZT4gY2xhc3MKICAqIApAQCAtNTIsNiArNTcsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbigpIHsKICAgICAgICAgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uIHRFID0gbmV3IFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOwpAQCAtNjEsNiArNzUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBudWxsIHN0cmluZyBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvblN0cmluZygpIHsKICAgICAgICAgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1VucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24yVGVzdC5qYXZhCmluZGV4IDM2Y2ZiYmQuLjdjYWNmY2QgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uMlRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDI4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb247CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiNVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24oKQogICAgICAgICBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIGUgPSBuZXcgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbigpOwpAQCAtMzQsNiArNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uI1VucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBudWxsIHN0cmluZyBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDY2YTA3N2MuLmY3MTVkM2IgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L1VucmVjb3ZlcmFibGVLZXlFeGNlcHRpb25UZXN0LmphdmEKQEAgLTIxLDExICsyMSwxNiBAQAogKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCitAVGVzdFRhcmdldENsYXNzKFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCiAgKiBtZXRob2RzLgpAQCAtNTYsNiArNjEsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yCiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24wMSgpIHsKICAgICAgICAgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiB0RSA9IG5ldyBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CkBAIC02Nyw2ICs4MSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UgbXNnLgogICAgICAqIFBhcmFtZXRlciA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjAyKCkgewogICAgICAgICBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHRFOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKQEAgLTgyLDYgKzEwNSwxNSBAQAogICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPgogICAgICAqIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24wMygpIHsKICAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CiAgICAgICAgIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24gdEUgPSBuZXcgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbihtc2cpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlc29sdmVkUGVybWlzc2lvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvVW5yZXNvbHZlZFBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggYWU4ZjUwYi4uZjA5ZWFhMDIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvVW5yZXNvbHZlZFBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9VbnJlc29sdmVkUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CkBAIC0zMyw3ICszOCw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKLQorQFRlc3RUYXJnZXRDbGFzcyhVbnJlc29sdmVkUGVybWlzc2lvbi5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlVucmVzb2x2ZWRQZXJtaXNzaW9uPC9jb2RlPiBjbGFzcyBmaWVsZHMgYW5kIG1ldGhvZHMKICAqIApAQCAtNDUsNiArNTAsMTUgQEAKICAgICAgKiBDcmVhdGVzIGFuIE9iamVjdCB3aXRoIGdpdmVuIG5hbWUsIHR5cGUsIGFjdGlvbiwgY2VydGlmaWNhdGVzLiBFbXB0eSBvcgogICAgICAqIG51bGwgdHlwZSBpcyBub3QgYWxsb3dlZCAtIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlVucmVzb2x2ZWRQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIENlcnRpZmljYXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDdG9yKCkgewogICAgICAgICBTdHJpbmcgdHlwZSA9ICJsYXNramhsc2RrIDIzNDUzNDYiOwogICAgICAgICBTdHJpbmcgbmFtZSA9ICJeJSNVSFZLVV4lViAgODg3eSI7CkBAIC04MSw2ICs5NSwxNSBAQAogICAgIC8qKgogICAgICAqIFVucmVzb2x2ZWRQZXJtaXNzaW9uIG5ldmVyIGltcGxpZXMgYW55IG90aGVyIHBlcm1pc3Npb24uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcGxpZXMoKSB7CiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9uIHVwID0gbmV3IFVucmVzb2x2ZWRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICJqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiIsICJhLmIuYyIsIG51bGwsIG51bGwpOwpAQCAtODksNiArMTEyLDE1IEBACiAgICAgICAgIGFzc2VydEZhbHNlKHVwLmltcGxpZXMobmV3IFNlY3VyaXR5UGVybWlzc2lvbigiYS5iLmMiKSkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVbnJlc29sdmVkUGVybWlzc2lvbiB1cCA9IG5ldyBVbnJlc29sdmVkUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAiamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24iLCAiYS5iLmMiLCAiYWN0aW9ucyIsIG51bGwpOwpAQCAtMTA2LDcgKzEzOCwxNiBAQAogICAgICAgICBhc3NlcnROdWxsKGRlc2VyaWFsaXplZFVwLmdldFVucmVzb2x2ZWRDZXJ0cygpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbl9Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RTZXJpYWxpemF0aW9uX0NvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVW5yZXNvbHZlZFBlcm1pc3Npb24gdXAgPSBuZXcgVW5yZXNvbHZlZFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgImphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uIiwgImEuYi5jIiwgImFjdGlvbnMiLCBudWxsKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiIsIHVwLmdldFVucmVzb2x2ZWRUeXBlKCkpOwpAQCAtMTI2LDYgKzE2NywxNSBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKICAgICAgICAgVW5yZXNvbHZlZFBlcm1pc3Npb24gdXAxID0gbmV3IFVucmVzb2x2ZWRQZXJtaXNzaW9uKCJ0eXBlMSIsICJuYW1lMSIsCiAgICAgICAgICAgICAgICAgImFjdGlvbjEiLCBudWxsKTsKQEAgLTE2Miw2ICsyMTIsMTUgQEAKIAogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBY3Rpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGlvbnMoKSB7CiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9uIHVwMSA9IG5ldyBVbnJlc29sdmVkUGVybWlzc2lvbigidHlwZTEiLCAibmFtZTEiLAogICAgICAgICAgICAgICAgICJhY3Rpb24xIiwgbnVsbCk7CkBAIC0xNzYsNiArMjM1LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VW5yZXNvbHZlZEFjdGlvbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VW5yZXNvbHZlZEFjdGlvbnMoKSB7CiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9uIHVwMSA9IG5ldyBVbnJlc29sdmVkUGVybWlzc2lvbigidHlwZTEiLCAibmFtZTEiLAogICAgICAgICAgICAgICAgICJhY3Rpb24xIEAjJCVeJioiLCBudWxsKTsKQEAgLTE5MCw3ICsyNTgsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVbnJlc29sdmVkQ2VydHMoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFVucmVzb2x2ZWRDZXJ0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0VW5yZXNvbHZlZENlcnRzKCkgewogICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlID0gbmV3IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVswXTsKICAgICAgICAgVW5yZXNvbHZlZFBlcm1pc3Npb24gdXAxID0gbmV3IFVucmVzb2x2ZWRQZXJtaXNzaW9uKCJ0eXBlMSIsICJuYW1lMSIsCiAgICAgICAgICAgICAgICAgImFjdGlvbjEgQCMkJV4mKiIsIG51bGwpOwpAQCAtMjA5LDYgKzI4NiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFVucmVzb2x2ZWROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFVucmVzb2x2ZWROYW1lKCkgewogICAgICAgICBVbnJlc29sdmVkUGVybWlzc2lvbiB1cDEgPSBuZXcgVW5yZXNvbHZlZFBlcm1pc3Npb24oInR5cGUxIiwgIm5hbWUxIUAjJCVeJiYqICkoIiwKICAgICAgICAgICAgICAgICAiYWN0aW9uMSBAIyQlXiYqIiwgbnVsbCk7CkBAIC0yMjMsNiArMzA5LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VW5yZXNvbHZlZFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VW5yZXNvbHZlZFR5cGUoKSB7CiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9uIHVwMSA9IG5ldyBVbnJlc29sdmVkUGVybWlzc2lvbigidHlwZTFAIyQlXiYqICkoIiwgIm5hbWUxIiwKICAgICAgICAgICAgICAgICAiYWN0aW9uMSIsIG51bGwpOwpAQCAtMjM3LDYgKzMzMiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewogICAgICAgICBVbnJlc29sdmVkUGVybWlzc2lvbiB1cDEgPSBuZXcgVW5yZXNvbHZlZFBlcm1pc3Npb24oInR5cGUxIiwgIm5hbWUxIiwKICAgICAgICAgICAgICAgICAiYWN0aW9uMSIsIG51bGwpOwpAQCAtMjU5LDYgKzM2MywxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgewogICAgICAgICBVbnJlc29sdmVkUGVybWlzc2lvbiB1cDEgPSBuZXcgVW5yZXNvbHZlZFBlcm1pc3Npb24oInR5cGUxIiwgIm5hbWUxIiwKICAgICAgICAgICAgICAgICAiYWN0aW9uMSIsIG51bGwpOwpAQCAtMjg1LDYgKzM5OCwxNSBAQAogICAgICAgICAKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIFVucmVzb2x2ZWRQZXJtaXNzaW9uIHVwMSA9IG5ldyBVbnJlc29sdmVkUGVybWlzc2lvbigidHlwZTEiLCAibmFtZTEiLAogICAgICAgICAgICAgICAgICJhY3Rpb24xIiwgbnVsbCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sQ29udGV4dFRlc3QuamF2YQppbmRleCA5MDQxYjA3Li4wY2Q1MDJjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0VGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbENvbnRleHRUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0OwpAQCAtMzAsMTEgKzM1LDIxIEBACiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdERvbWFpbkNvbWJpbmVyOwogCitAVGVzdFRhcmdldENsYXNzKEFjY2Vzc0NvbnRyb2xDb250ZXh0LmNsYXNzKQogcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xDb250ZXh0VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCNBY2Nlc3NDb250cm9sQ29udGV4dChqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW5bXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBY2Nlc3NDb250cm9sQ29udGV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm90ZWN0aW9uRG9tYWluW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkTGphdmFfc2VjdXJpdHlfUHJvdGVjdGlvbkRvbWFpbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kCiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQoamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluIFtdKQpAQCAtNzgsNiArOTMsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCNBY2Nlc3NDb250cm9sQ29udGV4dChqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0LAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LkRvbWFpbkNvbWJpbmVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFjY2Vzc0NvbnRyb2xDb250ZXh0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0FjY2Vzc0NvbnRyb2xDb250ZXh0LmNsYXNzLCBqYXZhLnNlY3VyaXR5LkRvbWFpbkNvbWJpbmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfc2VjdXJpdHlfQWNjZXNzQ29udHJvbENvbnRleHRMamF2YV9zZWN1cml0eV9Eb21haW5Db21iaW5lcigpIHsKICAgICAgICAgQWNjZXNzQ29udHJvbENvbnRleHQgY29udGV4dCA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwogICAgICAgICB0cnkgewpAQCAtOTcsNiArMTIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiNjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJBY2Nlc3NDb250cm9sRXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Blcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jaGVja1Blcm1pc3Npb24oKSB7CiAgICAgICAgIGNoYXIgcyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKICAgICAgICAgRmlsZVBlcm1pc3Npb24gcGVybVtdID0gbmV3IEZpbGVQZXJtaXNzaW9uWzddOwpAQCAtMTU5LDcgKzE5MiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24jZXF1YWxzKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFscygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZXF1YWxzKCkgewogICAgICAgICBmaW5hbCBQZXJtaXNzaW9uIHBlcm0xID0gbmV3IFByb3BlcnR5UGVybWlzc2lvbigiamF2YS5jbGFzcy5wYXRoIiwKICAgICAgICAgICAgICAgICAicmVhZCIpOwogICAgICAgICBmaW5hbCBQZXJtaXNzaW9uIHBlcm0yID0gbmV3IFByb3BlcnR5UGVybWlzc2lvbigiamF2YS5wYXRoIiwgIndyaXRlIik7CkBAIC0yMTAsNiArMjUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiNnZXREb21haW5Db21iaW5lcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RG9tYWluQ29tYmluZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERvbWFpbkNvbWJpbmVyKCkgewogICAgICAgICBBY2Nlc3NDb250cm9sQ29udGV4dCBjb250ZXh0ID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7CiAKQEAgLTIzNSw2ICsyODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBmaW5hbCBQZXJtaXNzaW9uIHBlcm0xID0gbmV3IFByb3BlcnR5UGVybWlzc2lvbigiamF2YS5jbGFzcy5wYXRoIiwKICAgICAgICAgICAgICAgICAicmVhZCIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9zZWN1cml0eS9Eb21haW5Db21iaW5lclRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvc2VjdXJpdHkvRG9tYWluQ29tYmluZXJUZXN0LmphdmEKaW5kZXggYWMyN2IwMC4uYzEyNDVjMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9zZWN1cml0eS9Eb21haW5Db21iaW5lclRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3NlY3VyaXR5L0RvbWFpbkNvbWJpbmVyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOwpAQCAtMzEsMTIgKzM2LDIyIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogCitAVGVzdFRhcmdldENsYXNzKERvbWFpbkNvbWJpbmVyLmNsYXNzKQogcHVibGljIGNsYXNzIERvbWFpbkNvbWJpbmVyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5Eb21haW5Db21iaW5lciNjb21iaW5lKGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbltdLAogICAgICAqICAgICAgICBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW5bXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJNZXRob2QgY29tYmluZSBpcyBub3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tYmluZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcm90ZWN0aW9uRG9tYWluW10uY2xhc3MsIFByb3RlY3Rpb25Eb21haW5bXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21iaW5lJExqYXZhX3NlY3VyaXR5X1Byb3RlY3Rpb25Eb21haW4kTGphdmFfc2VjdXJpdHlfUHJvdGVjdGlvbkRvbWFpbigpIHsKICAgICAgICAgZmluYWwgYm9vbGVhbltdIGNhbGxlZERvbWFpbkNvbWJpbmVyID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlLCBmYWxzZSB9OwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25Db2xsZWN0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvblRlc3QuamF2YQppbmRleCA3MGE2MTRiLi41OGFjYzYxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25Db2xsZWN0aW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvc2VjdXJpdHkvUGVybWlzc2lvbkNvbGxlY3Rpb25UZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0yOSw2ICszNCw3IEBACiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0dldExvY2FsOwogaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUGVybWlzc2lvbkNvbGxlY3Rpb24uY2xhc3MpCiBwdWJsaWMgY2xhc3MgUGVybWlzc2lvbkNvbGxlY3Rpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8vIFRoZSBiZWxvdyB0ZXN0IGlzIGtub3duIHRvIGZhaWwuIEhhdmVuJ3QgZ290IHRvIHRoZSBib3R0b20gb2YKQEAgLTUzLDcgKzU5LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24jaW1wbGllcyhqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9pbXBsaWVzTGphdmFfc2VjdXJpdHlfUGVybWlzc2lvbigpIHRocm93cyBFeGNlcHRpb257CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiTWV0aG9kIGltcGxpZXMgaXMgbm90IGNhbGwgaW4gdGhpcyB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2ltcGxpZXNMamF2YV9zZWN1cml0eV9QZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKIAogICAgICAgICAvLyBMb29rIGZvciB0aGUgdGVzdHMgY2xhc3NwYXRoCiAgICAgICAgIFVSTCBjbGFzc1VSTCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRQcm90ZWN0aW9uRG9tYWluKCkuZ2V0Q29kZVNvdXJjZSgpCkBAIC0xNzQsNiArMTg5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24jUGVybWlzc2lvbkNvbGxlY3Rpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQZXJtaXNzaW9uQ29sbGVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIHRlc3QgamF2YS5zZWN1cml0eS5wZXJtaXNzaW9uQ29sbGVjdGlvbi5QZXJtaXNzaW9uQ29sbGVjdGlvbigpCiAgICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiBwZXJtaSA9IG5ldyBTZWN1cml0eVBlcm1pc3Npb24oCkBAIC0xODYsNiArMjEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24jaXNSZWFkT25seSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmVhZE9ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUmVhZE9ubHkoKSB7CiAgICAgICAgIC8vIHRlc3QgamF2YS5zZWN1cml0eS5wZXJtaXNzaW9uQ29sbGVjdGlvbi5pc1JlYWRPbmx5KCkKICAgICAgICAgU2VjdXJpdHlQZXJtaXNzaW9uIHBlcm1pID0gbmV3IFNlY3VyaXR5UGVybWlzc2lvbigKQEAgLTIwMSw2ICsyMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiNzZXRSZWFkT25seSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFJlYWRPbmx5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWFkT25seSgpIHsKICAgICAgICAgLy8gdGVzdCBqYXZhLnNlY3VyaXR5LnBlcm1pc3Npb25Db2xsZWN0aW9uLnNldFJlYWRPbmx5KCkKICAgICAgICAgU2VjdXJpdHlQZXJtaXNzaW9uIHBlcm1pID0gbmV3IFNlY3VyaXR5UGVybWlzc2lvbigKQEAgLTIxNiw3ICsyNTgsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiN0b1N0cmluZygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF90b1N0cmluZygpIHsKICAgICAgICAgLy8gdGVzdCBqYXZhLnNlY3VyaXR5LnBlcm1pc3Npb25Db2xsZWN0aW9uLnRvU3RyaW5nKCkKICAgICAgICAgU2VjdXJpdHlQZXJtaXNzaW9uIHBlcm1pID0gbmV3IFNlY3VyaXR5UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAidGVzdGluZyBwZXJtaXNzaW9uQ29sbGVjdGlvbi1pc1JFYWRPbmx5Iik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9zZWN1cml0eS9jZXJ0L0FsbFRlc3RzLmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9zZWN1cml0eS9jZXJ0L0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjYWFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3NlY3VyaXR5L2NlcnQvQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5zZWN1cml0eS5jZXJ0OworICovCisKK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihBbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YXguc2VjdXJpdHkuY2VydDsiKTsKKyAgICAgICAgLy8gJEpVbml0LUJFR0lOJAorCisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZUV4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRpZmljYXRlVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShYNTA5Q2VydGlmaWNhdGVUZXN0LmNsYXNzKTsKKworICAgICAgICAvLyAkSlVuaXQtRU5EJAorICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYWNiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YXguc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvblRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UiIH07CisKKyAgICBzdGF0aWMgVGhyb3dhYmxlIHRDYXVzZSA9IG5ldyBUaHJvd2FibGUoIlRocm93YWJsZSBmb3IgZXhjZXB0aW9uIik7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24wMSgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlCisgICAgICogbXNnLiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdpdGggdmFsaWQgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uMDIoKSB7CisgICAgICAgIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24obXNnKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjNjFiYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YXguc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CisKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUV4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRpZmljYXRlRXhjZXB0aW9uVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIiB9OworCisgICAgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgorICAgICAqIGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUV4Y2VwdGlvbjAxKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KKyAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb25zdHJ1Y3RvciB3aXRoIHZhbGlkIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24wMigpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4gaXMKKyAgICAgKiBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24wMygpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIENlcnRpZmljYXRlRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1Y2ViMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmF4LnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5EaWdlc3RFeGNlcHRpb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb25UZXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIiB9OworCisgICAgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24wMSgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UKKyAgICAgKiBtc2cuIFBhcmFtZXRlciA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggdmFsaWQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uMDIoKSB7CisgICAgICAgIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPgorICAgICAqIGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb25zdHJ1Y3RvciB3aXRoIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24wMygpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTQ3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YXguc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5EaWdlc3RFeGNlcHRpb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb25UZXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSIgfTsKKworICAgIHN0YXRpYyBUaHJvd2FibGUgdENhdXNlID0gbmV3IFRocm93YWJsZSgiVGhyb3dhYmxlIGZvciBleGNlcHRpb24iKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbAorICAgICAqIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uMDEoKSB7CisgICAgICAgIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gd2l0aAorICAgICAqIGRldGFpbCBtZXNzYWdlIG1zZy4gUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciB3aXRoICIgKworICAgICAgICAgICAgInZhbGlkIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjAyKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzICBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIHdpdGggIiArCisgICAgICAgICAgICAibnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbXNnKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTU5ZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5hcGkuamF2YXguc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOworCisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkRpZ2VzdEV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvblRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UiIH07CisKKyAgICBzdGF0aWMgVGhyb3dhYmxlIHRDYXVzZSA9IG5ldyBUaHJvd2FibGUoIlRocm93YWJsZSBmb3IgZXhjZXB0aW9uIik7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjAxKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZQorICAgICAqIG1zZy4gUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIGNvYnN0cnVjdG9yIHdpdGggIiArCisgICAgICAgICAgICAidmFsaWQgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjAyKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm46ICIuY29uY2F0KG1zZ3NbaV0pLCB0RQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIGNvbnN0cnVjdG9yIHdpdGggbnVsbCAiICsKKyAgICAgICAgICAgICJhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjAzKCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihtc2cpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU0YjUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBAYXV0aG9yIEFsZXhhbmRlciBZLiBLbGV5bWVub3YKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CisKKy8qKgorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRpZmljYXRlLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRpZmljYXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHViIGNsYXNzIHVzZWQgZm9yIHRlc3Rpbmcgb2Ygbm9uIGFic3RyYWN0IG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBUQlRDZXJ0IGV4dGVuZHMgQ2VydGlmaWNhdGUgeworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5KSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBTaWduYXR1cmVFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXksIFN0cmluZyBzaWdQcm92aWRlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBTaWduYXR1cmVFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiVEJUQ2VydCI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHVibGljS2V5IGdldFB1YmxpY0tleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGUoKTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENlcnRpZmljYXRlKCkgeworICAgICAgICBUQlRDZXJ0IHRidF9jZXJ0ID0gbmV3IFRCVENlcnQoKTsKKworICAgICAgICBhc3NlcnROdWxsKCJQdWJsaWMga2V5IHNob3VsZCBiZSBudWxsIiwgdGJ0X2NlcnQuZ2V0UHVibGljS2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgQ2VydGlmaWNhdGUiLCAiVEJUQ2VydCIsIHRidF9jZXJ0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVxdWFscyhPYmplY3Qgb2JqKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhlIGNvcnJlY3RuZXNzIG9mIGVxdWFsCisgICAgICogb3BlcmF0aW9uOiBpdCBzaG91bGQgYmUgcmVmbGV4aXZlLCBzeW1tZXRyaWMsIHRyYW5zaXRpdmUsIGNvbnNpc3RlbnQgYW5kCisgICAgICogc2hvdWxkIGJlIGZhbHNlIG9uIG51bGwgb2JqZWN0LgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKKyAgICAgICAgVEJUQ2VydCB0YnRfY2VydCA9IG5ldyBUQlRDZXJ0KCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIFRCVENlcnQgdGJ0X2NlcnRfMSA9IG5ldyBUQlRDZXJ0KCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIFRCVENlcnQgdGJ0X2NlcnRfMiA9IG5ldyBUQlRDZXJ0KCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIFRCVENlcnQgdGJ0X2NlcnRfMyA9IG5ldyBUQlRDZXJ0KCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsgMywgMiwgMSB9OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGNoZWNraW5nIGZvciByZWZsZXhpdmUgbGF3OgorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4iLCB0YnRfY2VydAorICAgICAgICAgICAgICAgIC5lcXVhbHModGJ0X2NlcnQpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIlRoZSBDZXJ0aWZpY2F0ZXMgd2l0aCBlcXVhbCBlbmNvZGVkIGZvcm0gc2hvdWxkIGJlIGVxdWFsIiwKKyAgICAgICAgICAgICAgICB0YnRfY2VydCwgdGJ0X2NlcnRfMSk7CisgICAgICAgIC8vIGNoZWNraW5nIGZvciBzeW1tZXRyaWMgbGF3OgorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gc2hvdWxkIGJlIHN5bW1ldHJpYy4iLCB0YnRfY2VydF8xCisgICAgICAgICAgICAgICAgLmVxdWFscyh0YnRfY2VydCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiVGhlIENlcnRpZmljYXRlcyB3aXRoIGVxdWFsIGVuY29kZWQgZm9ybSBzaG91bGQgYmUgZXF1YWwiLAorICAgICAgICAgICAgICAgIHRidF9jZXJ0XzEsIHRidF9jZXJ0XzIpOworICAgICAgICAvLyBjaGVja2luZyBmb3IgdHJhbnNpdGl2ZSBsYXc6CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4iLCB0YnRfY2VydAorICAgICAgICAgICAgICAgIC5lcXVhbHModGJ0X2NlcnRfMikpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJTaG91bGQgbm90IGJlIGVxdWFsIHRvIG51bGwgb2JqZWN0LiIsIHRidF9jZXJ0CisgICAgICAgICAgICAgICAgLmVxdWFscyhudWxsKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBDZXJ0aWZpY2F0ZXMgd2l0aCBkaWZmZXJpbmcgZW5jb2RlZCBmb3JtICIKKyAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IGJlIGVxdWFsIiwgdGJ0X2NlcnQuZXF1YWxzKHRidF9jZXJ0XzMpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBDZXJ0aWZpY2F0ZXMgc2hvdWxkIG5vdCBiZSBlcXVhbHMgdG8gdGhlIG9iamVjdCAiCisgICAgICAgICAgICAgICAgKyAid2hpY2ggaXMgbm90IGFuIGluc3RhbmNlIG9mIENlcnRpZmljYXRlIiwgdGJ0X2NlcnQKKyAgICAgICAgICAgICAgICAuZXF1YWxzKG5ldyBPYmplY3QoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhc2hDb2RlKCkgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgeworICAgICAgICBUQlRDZXJ0IHRidF9jZXJ0ID0gbmV3IFRCVENlcnQoKSB7CisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10geyAxLCAyLCAzIH07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFRCVENlcnQgdGJ0X2NlcnRfMSA9IG5ldyBUQlRDZXJ0KCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFzc2VydFRydWUoIkVxdWFsIG9iamVjdHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2Rlcy4iLCB0YnRfY2VydAorICAgICAgICAgICAgICAgIC5oYXNoQ29kZSgpID09IHRidF9jZXJ0XzEuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhNTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3BhY2thZ2UgdGVzdHMuYXBpLmphdmF4LnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCisvKioKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhYNTA5Q2VydGlmaWNhdGUuY2xhc3MpCitwdWJsaWMgY2xhc3MgWDUwOUNlcnRpZmljYXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8vIFRlc3RpbmcgZGF0YSB3YXMgZ2VuZXJhdGVkIGJ5IHVzaW5nIG9mIGNsYXNzZXMKKyAgICAvLyBmcm9tIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xIHBhY2thZ2UgZW5jb2RlZAorICAgIC8vIGJ5IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkJhc2U2NCBjbGFzcy4KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlNjRjZXJ0ID0gIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICAgKyAiTUlJQytqQ0NBcmFnQXdJQkFnSUNBaXN3REFZSEtvWkl6amdFQXdFQkFEQWRNUnN3R1FZRFZRUUtFeEpEWlhKMGEiCisgICAgICAgICAgICArICJXWnBZMkYwWlNCSmMzTjFaWEl3SWhnUE1UazNNREF4TVRJeE16UTJOREJhR0E4eE9UY3dNREV5TkRBek16TXlNRiIKKyAgICAgICAgICAgICsgIm93SHpFZE1Cc0dBMVVFQ2hNVVUzVmlhbVZqZENCUGNtZGhibWw2WVhScGIyNHdHVEFNQmdjcWhrak9PQVFEQVFFIgorICAgICAgICAgICAgKyAiQUF3a0FBUUlEQkFVR0J3aUJBZ0NxZ2dJQVZhT0NBaFF3Z2dJUU1BOEdBMVVkRHdFQi93UUZBd01CcW9Bd0VnWUQiCisgICAgICAgICAgICArICJWUjBUQVFIL0JBZ3dCZ0VCL3dJQkJUQVVCZ05WSFNBQkFmOEVDakFJTUFZR0JGVWRJQUF3WndZRFZSMFJBUUgvQiIKKyAgICAgICAgICAgICsgIkYwd1c0RU1jbVpqUURneU1pNU9ZVzFsZ2dka1RsTk9ZVzFscEJjeEZUQVRCZ05WQkFvVERFOXlaMkZ1YVhwaGRHIgorICAgICAgICAgICAgKyAibHZib1lhYUhSMGNEb3ZMM1Z1YVdadmNtMHVVbVZ6YjNWeVkyVXVTV1NIQlAvLy93Q0lCeW9Eb2x5RHNnTXdEQVkiCisgICAgICAgICAgICArICJEVlIwZUFRSC9CQUl3QURBTUJnTlZIU1FCQWY4RUFqQUFNSUdaQmdOVkhTVUJBZjhFZ1k0d2dZc0dCRlVkSlFBRyIKKyAgICAgICAgICAgICsgIkNDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFRWUlLd1lCQlFVSEF3SUdDQ3NHQVFVRkJ3TURCZ2dyQmdFRkJRY0RCIgorICAgICAgICAgICAgKyAiQVlJS3dZQkJRVUhBd1VHQ0NzR0FRVUZCd01HQmdnckJnRUZCUWNEQndZSUt3WUJCUVVIQXdnR0NDc0dBUVVGQnciCisgICAgICAgICAgICArICJNSkJnZ3JCZ0VGQlFnQ0FnWUtLd1lCQkFHQ053b0RBd1lKWUlaSUFZYjRRZ1FCTUEwR0ExVWROZ0VCL3dRREFnRSIKKyAgICAgICAgICAgICsgIkJNQTRHQkNwTmhna0JBZjhFQXdFQkFUQmtCZ05WSFJJRVhUQmJnUXh5Wm1OQU9ESXlMazVoYldXQ0IyUk9VMDVoIgorICAgICAgICAgICAgKyAiYldXa0Z6RVZNQk1HQTFVRUNoTU1UM0puWVc1cGVtRjBhVzl1aGhwb2RIUndPaTh2ZFc1cFptOXliUzVTWlhOdmQiCisgICAgICAgICAgICArICJYSmpaUzVKWkljRS8vLy9BSWdIS2dPaVhJT3lBekFKQmdOVkhSOEVBakFBTUFvR0ExVWRJd1FEQVFFQk1Bb0dBMSIKKyAgICAgICAgICAgICsgIlVkRGdRREFRRUJNQW9HQTFVZElRUURBUUVCTUF3R0J5cUdTTTQ0QkFNQkFRQURNQUF3TFFJVUFMNFF2b2F6TldQIgorICAgICAgICAgICAgKyAiN2pyajg0L0dabGhtMDlEc0NGUUNCS0dLQ0diclA2NFZ0VXQ0SlBtTGpXMVZ4UUE9PVxuIgorICAgICAgICAgICAgKyAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSI7CisKKyAgICBwcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgY2VydDsKKworICAgIHByaXZhdGUgamF2YXguc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgdGJ0X2NlcnQ7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYXNlNjRjZXJ0CisgICAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKKworICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworICAgICAgICAgICAgdGhpcy5jZXJ0ID0gKGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpIGNmCisgICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKGJhaXMpOworICAgICAgICAgICAgdGhpcy50YnRfY2VydCA9IFg1MDlDZXJ0aWZpY2F0ZS5nZXRJbnN0YW5jZShjZXJ0LmdldEVuY29kZWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAgIC8vIFRlc3QgcGFzcy4uCisgICAgICAgICAgICB0aGlzLmNlcnQgPSBudWxsOworICAgICAgICB9IGNhdGNoIChqYXZheC5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgY2VydGlmaWNhdGUgdHlwZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgLy8gVGVzdCBwYXNzLi4KKyAgICAgICAgICAgIHRoaXMuY2VydCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBYNTA5Q2VydGlmaWNhdGUoKSBjb25zdHJ1Y3RvciB0ZXN0aW5nLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlg1MDlDZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBuZXcgTXlDZXJ0aWZpY2F0ZSgpOworICAgICAgICBhc3NlcnROdWxsKCJQcmluY2lwYWwgc2hvdWxkIGJlIG51bGwiLCBjZXJ0LmdldElzc3VlckROKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGVuZCBkYXRlIiwgbmV3IERhdGUoKSwgY2VydC5nZXROb3RBZnRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGFydCBkYXRlIiwgbmV3IERhdGUoKSwgY2VydC5nZXROb3RCZWZvcmUoKSk7CisgICAgICAgIGFzc2VydE51bGwoIlB1YmxpYyBrZXkgc2hvdWxkIGJlIG51bGwiLCBjZXJ0LmdldFB1YmxpY0tleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXJpYWwgbnVtYmVyIHNob3VsZCBiZSAwIiwgQmlnSW50ZWdlci52YWx1ZU9mKDApLCBjZXJ0LmdldFNlcmlhbE51bWJlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhbGdvcml0aG0gbmFtZSIsICJhbGdOYW1lIiwgY2VydC5nZXRTaWdBbGdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGFsZ29yaXRobSBPSUQiLCAiYWxnT0lEIiwgY2VydC5nZXRTaWdBbGdPSUQoKSk7CisgICAgICAgIGFzc2VydE51bGwoIlNpZ25hdHVyZSBhbGdvcml0aG0gcGFyYW1ldGVycyBzaG91bGQgYmUgbnVsbCIsIGNlcnQuZ2V0U2lnQWxnUGFyYW1zKCkpOworICAgICAgICBhc3NlcnROdWxsKCJTdWJqZWN0IHNob3VsZCBiZSBudWxsIiwgY2VydC5nZXRTdWJqZWN0RE4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVmVyc2lvbiBzaG91bGQgYmUgMCIsIDAsIGNlcnQuZ2V0VmVyc2lvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRJbnN0YW5jZShJbnB1dFN0cmVhbSBpblN0cmVhbSkgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2VydGlmaWNhdGVFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlMSgpIHsKKyAgICAgICAgaWYgKHRoaXMuY2VydCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAgIC8vIFRlc3QgY2FuIG5vdCBiZSBhcHBsaWVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnQKKyAgICAgICAgICAgICAgICAgICAgLmdldEVuY29kZWQoKSk7CisKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZS5nZXRJbnN0YW5jZShiYWlzKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgY2VydGlmaWNhdGUgdHlwZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgLy8gVGVzdCBwYXNzLi4KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNzU2CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUuZ2V0SW5zdGFuY2UoKElucHV0U3RyZWFtKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4cGVjdGVkIENlcnRpZmljYXRlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0SW5zdGFuY2UoYnl0ZVtdIGNlcnREYXRhKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZTIoKSB7CisgICAgICAgIGlmICh0aGlzLmNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLyBUZXN0IGNhbiBub3QgYmUgYXBwbGllZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlLmdldEluc3RhbmNlKGNlcnQuZ2V0RW5jb2RlZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgY2VydGlmaWNhdGUgdHlwZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgLy8gVGVzdCBwYXNzLi4KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNzU2CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUuZ2V0SW5zdGFuY2UoKGJ5dGVbXSkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJObyBleHBlY3RlZCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrVmFsaWRpdHkoKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrVmFsaWRpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tWYWxpZGl0eTEoKSB7CisgICAgICAgIGlmICh0aGlzLmNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLyBUZXN0IGNhbiBub3QgYmUgYXBwbGllZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICBEYXRlIG5iX2RhdGUgPSB0YnRfY2VydC5nZXROb3RCZWZvcmUoKTsKKyAgICAgICAgRGF0ZSBuYV9kYXRlID0gdGJ0X2NlcnQuZ2V0Tm90QWZ0ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRidF9jZXJ0LmNoZWNrVmFsaWRpdHkoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24gZXhwZWN0ZWQiLCBkYXRlCisgICAgICAgICAgICAgICAgICAgIC5jb21wYXJlVG8obmFfZGF0ZSkgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIGV4cGVjdGVkIiwgZGF0ZQorICAgICAgICAgICAgICAgICAgICAuY29tcGFyZVRvKG5iX2RhdGUpIDwgMCk7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB3YXMgdGhyb3duIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0ZS5jb21wYXJlVG8obmFfZGF0ZSkgPiAwKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gd2FzIHRocm93biIsCisgICAgICAgICAgICAgICAgICAgIGRhdGUuY29tcGFyZVRvKG5iX2RhdGUpIDwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVja1ZhbGlkaXR5KERhdGUgZGF0ZSkgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1ZhbGlkaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5EYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tWYWxpZGl0eTIoKSB7CisgICAgICAgIGlmICh0aGlzLmNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLyBUZXN0IGNhbiBub3QgYmUgYXBwbGllZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBEYXRlW10gZGF0ZSA9IG5ldyBEYXRlWzRdOworICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0ZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2FsZW5kYXIuc2V0KGkgKiA1MCwgQ2FsZW5kYXIuSkFOVUFSWSwgMSk7CisgICAgICAgICAgICBkYXRlW2ldID0gY2FsZW5kYXIuZ2V0VGltZSgpOworICAgICAgICB9CisgICAgICAgIERhdGUgbmJfZGF0ZSA9IHRidF9jZXJ0LmdldE5vdEJlZm9yZSgpOworICAgICAgICBEYXRlIG5hX2RhdGUgPSB0YnRfY2VydC5nZXROb3RBZnRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGJ0X2NlcnQuY2hlY2tWYWxpZGl0eShkYXRlW2ldKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIGV4cGVjdGVkIiwgZGF0ZVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhcmVUbyhuYV9kYXRlKSA+IDApOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKCJDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIGV4cGVjdGVkIiwgZGF0ZVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhcmVUbyhuYl9kYXRlKSA8IDApOworICAgICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB3YXMgdGhyb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVbaV0uY29tcGFyZVRvKG5hX2RhdGUpID4gMCk7CisgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAid2FzIHRocm93biIsIGRhdGVbaV0uY29tcGFyZVRvKG5iX2RhdGUpIDwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRWZXJzaW9uKCkgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmVyc2lvbigpIHsKKyAgICAgICAgaWYgKHRoaXMuY2VydCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAgIC8vIFRlc3QgY2FuIG5vdCBiZSBhcHBsaWVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZlcnNpb24gaXMgbm90IGNvcnJlY3QuIiwgdGJ0X2NlcnQuZ2V0VmVyc2lvbigpLCAyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRTZXJpYWxOdW1iZXIoKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VyaWFsTnVtYmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgaWYgKHRoaXMuY2VydCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAgIC8vIFRlc3QgY2FuIG5vdCBiZSBhcHBsaWVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHNlcmlhbCBudW1iZXIgaXMgbm90IGNvcnJlY3QuIiwgdGJ0X2NlcnQKKyAgICAgICAgICAgICAgICAuZ2V0U2VyaWFsTnVtYmVyKCksIGNlcnQuZ2V0U2VyaWFsTnVtYmVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldElzc3VlckROKCkgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElzc3VlckROIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldElzc3VlckROKCkgeworICAgICAgICBpZiAodGhpcy5jZXJ0ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgY2VydGlmaWNhdGUgdHlwZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgLy8gVGVzdCBjYW4gbm90IGJlIGFwcGxpZWQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgaXNzdWVyIEROIGlzIG5vdCBjb3JyZWN0LiIsIHRidF9jZXJ0LmdldElzc3VlckROKCksCisgICAgICAgICAgICAgICAgY2VydC5nZXRJc3N1ZXJETigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRTdWJqZWN0RE4oKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3ViamVjdEROIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1YmplY3RETigpIHsKKyAgICAgICAgaWYgKHRoaXMuY2VydCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAgIC8vIFRlc3QgY2FuIG5vdCBiZSBhcHBsaWVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHN1YmplY3QgRE4gaXMgbm90IGNvcnJlY3QuIiwgdGJ0X2NlcnQuZ2V0U3ViamVjdEROKCksCisgICAgICAgICAgICAgICAgY2VydC5nZXRTdWJqZWN0RE4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0Tm90QmVmb3JlKCkgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5vdEJlZm9yZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb3RCZWZvcmUoKSB7CisgICAgICAgIGlmICh0aGlzLmNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLyBUZXN0IGNhbiBub3QgYmUgYXBwbGllZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBOb3RCZWZvcmUgZGF0ZSBpcyBub3QgY29ycmVjdC4iLCB0YnRfY2VydAorICAgICAgICAgICAgICAgIC5nZXROb3RCZWZvcmUoKSwgY2VydC5nZXROb3RCZWZvcmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0Tm90QWZ0ZXIoKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Tm90QWZ0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm90QWZ0ZXIoKSB7CisgICAgICAgIGlmICh0aGlzLmNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLyBUZXN0IGNhbiBub3QgYmUgYXBwbGllZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBOb3RBZnRlciBkYXRlIGlzIG5vdCBjb3JyZWN0LiIsIHRidF9jZXJ0CisgICAgICAgICAgICAgICAgLmdldE5vdEFmdGVyKCksIGNlcnQuZ2V0Tm90QWZ0ZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0U2lnQWxnTmFtZSgpIG1ldGhvZCB0ZXN0aW5nLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTaWdBbGdOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ0FsZ05hbWUoKSB7CisgICAgICAgIGlmICh0aGlzLmNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLyBUZXN0IGNhbiBub3QgYmUgYXBwbGllZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIG9mIHNpZ25hdHVyZSBhbGdvcml0aG0gaXMgbm90IGNvcnJlY3QuIiwKKyAgICAgICAgICAgICAgICB0YnRfY2VydC5nZXRTaWdBbGdOYW1lKCksIGNlcnQuZ2V0U2lnQWxnTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRTaWdBbGdPSUQoKSBtZXRob2QgdGVzdGluZy4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2lnQWxnT0lEIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ0FsZ09JRCgpIHsKKyAgICAgICAgaWYgKHRoaXMuY2VydCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHR5cGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAgIC8vIFRlc3QgY2FuIG5vdCBiZSBhcHBsaWVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIG5hbWUgb2YgT0lEIG9mIHNpZ25hdHVyZSBhbGdvcml0aG0gaXMgbm90IGNvcnJlY3QuIiwKKyAgICAgICAgICAgICAgICB0YnRfY2VydC5nZXRTaWdBbGdPSUQoKSwgY2VydC5nZXRTaWdBbGdPSUQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0U2lnQWxnUGFyYW1zKCkgbWV0aG9kIHRlc3RpbmcuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNpZ0FsZ1BhcmFtcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaWdBbGdQYXJhbXMoKSB7CisgICAgICAgIGlmICh0aGlzLmNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjZXJ0aWZpY2F0ZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLyBUZXN0IGNhbiBub3QgYmUgYXBwbGllZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgYnl0ZSBhcnJheSB3aXRoIGVuY29kZWQgYWxnb3JpdGhtIHBhcmFtZXRlcnMgIgorICAgICAgICAgICAgICAgICsgImlzIG5vdCBjb3JyZWN0LiIsIEFycmF5cy5lcXVhbHModGJ0X2NlcnQuZ2V0U2lnQWxnUGFyYW1zKCksCisgICAgICAgICAgICAgICAgY2VydC5nZXRTaWdBbGdQYXJhbXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHViIGNsYXNzIHVzZWQgZm9yIHRlc3Rpbmcgb2Ygbm9uIGFic3RyYWN0IG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBNeUNlcnRpZmljYXRlIGV4dGVuZHMgWDUwOUNlcnRpZmljYXRlIHsKKworICAgICAgICBwdWJsaWMgTXlDZXJ0aWZpY2F0ZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1ZhbGlkaXR5KCkgdGhyb3dzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1ZhbGlkaXR5KERhdGUgYXJnMCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0SXNzdWVyRE4oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGF0ZSBnZXROb3RBZnRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEYXRlIGdldE5vdEJlZm9yZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YoMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaWdBbGdOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJhbGdOYW1lIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpZ0FsZ09JRCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiYWxnT0lEIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0U3ViamVjdEROKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJjZXJ0aWZpY2F0ZSI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXkpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXksIFN0cmluZyBzaWdQcm92aWRlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBTaWduYXR1cmVFeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShYNTA5Q2VydGlmaWNhdGVUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaVRlc3QuamF2YQppbmRleCAxNjExODNjLi4wNzRiNGNiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGlUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2UgdGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CkBAIC0zNiw3ICs0MSw3IEBACiAgKiBhbmQgbWV0aG9kcy4KICAqIAogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGkuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgpAQCAtNTIsNiArNTcsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGk8L2NvZGU+IGNvbnN0cnVjdG9yCiAgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpMDEoKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewogICAgICAgICBNeUFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaSBhbGdQYXJHZW4gPSBuZXcgTXlBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGkoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9BbGxQZXJtaXNzaW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggMGQyZDczOC4uNTY1NGJjMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb25UZXN0LmphdmEKQEAgLTIyLDEzICsyMiwxOCBAQAogCiBwYWNrYWdlIHRlc3RzLmphdmEuc2VjdXJpdHk7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlVucmVzb2x2ZWRQZXJtaXNzaW9uOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEFsbFBlcm1pc3Npb24uY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5BbGxQZXJtaXNzaW9uPC9jb2RlPgogICogCkBAIC01MCw2ICs1NSwyMCBAQAogICAgIC8qKgogICAgICAqIFRlc3QgYWxsIGNvbnN0cnVjdG9yczogYW4gb2JqZWN0IGlzIGNyZWF0ZWQsIG5hbWUgYW5kIGFjdGlvbnMgYXJlIGlnbm9yZWQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQWxsUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQWxsUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3RvcigpCiAgICAgewogICAgICAgICBBbGxQZXJtaXNzaW9uIGExID0gbmV3IEFsbFBlcm1pc3Npb24oKTsKQEAgLTY2LDYgKzg1LDE1IEBACiAgICAgfQogCiAgICAgLyoqIEFueSBvZiBBbGxQZXJtaXNzaW9uIGluc3RhbmNlcyBhcmUgZXF1YWwgYW5kIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKQogICAgIHsKICAgICAgICAgQWxsUGVybWlzc2lvbiBhMSA9IG5ldyBBbGxQZXJtaXNzaW9uKCk7CkBAIC03Nyw2ICsxMDUsMTUgQEAKICAgICB9CiAgICAgCiAgICAgLyoqIEFsbFBlcm1pc3Npb24gaW1wbGllcyBhbnkgb3RoZXIgcGVybWlzc2lvbiAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcGxpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGllcygpCiAgICAgewogICAgICAgICBBbGxQZXJtaXNzaW9uIGExID0gbmV3IEFsbFBlcm1pc3Npb24oKTsKQEAgLTg2LDYgKzEyMywxNSBAQAogICAgIH0KICAgICAKICAgICAvKiogbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSByZXR1cm5zIGEgbmV3IEFsbFBlcm1pc3Npb25Db2xsZWN0aW9uIG9uIGV2ZXJ5IGludm9jYXRpb24uICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb24oKQogICAgIHsKICAgICAgICAgQWxsUGVybWlzc2lvbiBhMSA9IG5ldyBBbGxQZXJtaXNzaW9uKCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvQmFzaWNQZXJtaXNzaW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L0Jhc2ljUGVybWlzc2lvblRlc3QuamF2YQppbmRleCBjMDQ4NWZlLi41NDg2MGQ0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvQmFzaWNQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9CYXNpY1Blcm1pc3Npb25UZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2UgdGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb247CiAKQEAgLTMxLDcgKzM2LDcgQEAKICAqIFRlc3RzIGZvciA8Y29kZT5CYXNpY1Blcm1pc3Npb248L2NvZGU+CiAgKiAKICAqLwotCitAVGVzdFRhcmdldENsYXNzKEJhc2ljUGVybWlzc2lvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBCYXNpY1Blcm1pc3Npb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewpAQCAtNTIsNiArNTcsMTkgQEAKICAgICAgKiBJZiAgbmFtZSBpcyBlbXB0eSB0aGVuIElBRSBzaG91bGQgYmUgdGhyb3duLiAKICAgICAgKiBBY3Rpb24gaXMgaWdub3JlZC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmFzaWNQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCYXNpY1Blcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDdG9yKCkKICAgICB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gImJhc2ljMTIzKiQlIyI7CkBAIC05Nyw2ICsxMTUsMTUgQEAKICAgICAgKiB0d28gQmFzaWNQZXJtaXNzaW9ucyBhcmUgZXF1YWwgaWYgbmFtZSBhbmQgY2xhc3MgYXJlIGVxdWFsOyAKICAgICAgKiBlcXVhbCBwZXJtaXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpCiAgICAgewogICAgICAgICBCYXNpY1Blcm1pc3Npb24gYjEgPSBuZXcgQmFzaWNQZXJtaXNzaW9uSW1wbCgiYWJjIik7CkBAIC0xMTUsNiArMTQyLDE1IEBACiAgICAgICogaW1wbGllcygpIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiBhIHBlcm1pc3Npb24gaXMgZXF1YWwgdG8gb3IgaXMgaW1wbGllZCAKICAgICAgKiBieSB3aWxkY2FyZGVkIHBlcm1pc3Npb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wbGllcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWVzKCkKICAgICB7CiAgICAgICAgIEJhc2ljUGVybWlzc2lvbiBiMSA9IG5ldyBCYXNpY1Blcm1pc3Npb25JbXBsKCJhLmIuYyIpOwpAQCAtMTM0LDYgKzE3MCwxNSBAQAogICAgIC8qKgogICAgICAqIG5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgc2hvdWxkIHJldHVybiBuZXcgQmFzaWNQZXJtaXNzaW9uQ29sbGVjdGlvbiBvbiBldmVyeSBpbnZvY2F0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb24oKQogICAgIHsKICAgICAgICAgQmFzaWNQZXJtaXNzaW9uIGIxID0gbmV3IEJhc2ljUGVybWlzc2lvbkltcGwoImEuYi5jIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvSWRlbnRpdHlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvSWRlbnRpdHlUZXN0LmphdmEKaW5kZXggODg1NGM0OC4uZGE5YWI3NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L0lkZW50aXR5VGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9JZGVudGl0eVRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTAgQEAKIAogcGFja2FnZSB0ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JZGVudGl0eTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGU7CkBAIC00Miw2ICs0Niw3IEBACiAgKiAKICAqLwogQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKK0BUZXN0VGFyZ2V0Q2xhc3MoSWRlbnRpdHkuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSWRlbnRpdHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CkBAIC02MywxMCArNjgsMjggQEAKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk1ldGhvZCdzIHJldHVybmVkIHZhcmlhYmxlIGlzIG5vdCBjaGVja2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7CiAgICAgICAgIG5ldyBJZGVudGl0eVN0dWIoInRlc3RIYXNoQ29kZSIpLmhhc2hDb2RlKCk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSWRlbnRpdHlTdHViIGkxID0gbmV3IElkZW50aXR5U3R1YigidGVzdEVxdWFscyIpOwogICAgICAgICBPYmplY3QgdmFsdWVbXSA9ICB7CkBAIC05MSw2ICsxMTQsMTUgQEAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgSWRlbnRpdHkudG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIGlzIHBlcm1pc3Npb24gaXMgZGVuaWVkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcxKCkgewogICAgICAgICBNeVNlY3VyaXR5TWFuYWdlciBzbSA9IG5ldyBNeVNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBzbS5kZW5pZWQuYWRkKG5ldyBTZWN1cml0eVBlcm1pc3Npb24oInByaW50SWRlbnRpdHkiKSk7CkBAIC0xMDYsNiArMTM4LDE1IEBACiAgICAgLyoqCiAgICAgICogdmVyaWZ5IElkZW50aXR5LnRvU3RyaW5nKCkgCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nMigpIHsgICAgCiAgICAgICAgIGFzc2VydE5vdE51bGwobmV3IElkZW50aXR5U3R1YigidGVzdFRvU3RyaW5nMiIpLnRvU3RyaW5nKCkpOwogICAgIH0KQEAgLTExMyw2ICsxNTQsMTUgQEAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgSWRlbnRpdHkoKSBjcmVhdGVzIGluc3RhbmNlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklkZW50aXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElkZW50aXR5KCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBJZGVudGl0eVN0dWIoKSk7CiAgICAgfQpAQCAtMTIwLDYgKzE3MCwxNSBAQAogICAgIC8qCiAgICAgICogdmVyaWZ5IElkZW50aXR5KFN0cmluZykgY3JlYXRlcyBpbnN0YW5jZSB3aXRoIGdpdmVuIG5hbWUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSBzdHJpbmcgZm9yIHBhcmFtZXRlciBpcyBub3QgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSWRlbnRpdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlTdHJpbmcoKSB7CiAgICAgICAgIElkZW50aXR5IGkgPSBuZXcgSWRlbnRpdHlTdHViKCJpaWkiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpKTsKQEAgLTEzMiw2ICsxOTEsMTYgQEAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgSWRlbnRpdHkoU3RyaW5nLCBJZGVudGl0eVNjb3BlKSBjcmVhdGVzIGluc3RhbmNlIHdpdGggZ2l2ZW4gbmFtZSBhbmQgaW4gZ2l2ZSBzY29wZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIktleU1hbmFnZW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAgICJOdWxsIHBhcmFtZXRlcnMgYXJlIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIklkZW50aXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgSWRlbnRpdHlTY29wZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElkZW50aXR5U3RyaW5nSWRlbnRpdHlTY29wZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJZGVudGl0eVNjb3BlIHMgPSBJZGVudGl0eVNjb3BlLmdldFN5c3RlbVNjb3BlKCk7ICAgICAgICAKICAgICAgICAgSWRlbnRpdHkgaSA9IG5ldyBJZGVudGl0eVN0dWIoImlpaTIiLCBzKTsKQEAgLTE0Niw2ICsyMTUsMTUgQEAKICAgICAgKiBJZiB0aGUgaWRlbnRpdHkgaGFzIGEgcHVibGljIGtleSwgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIGNlcnRpZmljYXRlIG11c3QgYmUgdGhlIHNhbWUKICAgICAgKiAgCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQ2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5DZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZENlcnRpZmljYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJZGVudGl0eSBpID0gbmV3IElkZW50aXR5U3R1YigiaWlpIik7CiAgICAgICAgIFB1YmxpY0tleVN0dWIgcGsxID0gbmV3IFB1YmxpY0tleVN0dWIoImtrayIsICJmZmYiLCBuZXcgYnl0ZVtdezEsMiwzLDQsNX0pOwpAQCAtMTY1LDcgKzI0MywxNSBAQAogICAgICAqIHZlcmlmeSBhZGRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgYWRkcyBhIGNlcnRpZmljYXRlIGZvciB0aGlzIGlkZW50aXR5LgogICAgICAqIGlmIHRoZSBpZGVudGl0eSBkb2VzIG5vdCBoYXZlIGEgcHVibGljIGtleSwgdGhlIGlkZW50aXR5J3MgcHVibGljIGtleSBpcyBzZXQgdG8gYmUgdGhhdCBzcGVjaWZpZWQgaW4gdGhlIGNlcnRpZmljYXRlLgogICAgICAqLwotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQ2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5DZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZENlcnRpZmljYXRlMigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJZGVudGl0eSBpID0gbmV3IElkZW50aXR5U3R1YigiaWlpIik7CiAgICAgICAgIFB1YmxpY0tleVN0dWIgcGsxID0gbmV3IFB1YmxpY0tleVN0dWIoImtrayIsICJmZmYiLCBudWxsKTsgICAgICAgIApAQCAtMTc5LDcgKzI2NSwxNSBAQAogICAgIC8qKgogICAgICAqIHZlcmlmeSBhZGRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlzIHBlcm1pc3Npb24gaXMgZGVuaWVkCiAgICAgICovCi0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRDZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LkNlcnRpZmljYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2VydGlmaWNhdGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2VjdXJpdHlNYW5hZ2VyIHNtID0gbmV3IE15U2VjdXJpdHlNYW5hZ2VyKCk7CiAgICAgICAgIHNtLmRlbmllZC5hZGQobmV3IFNlY3VyaXR5UGVybWlzc2lvbigiYWRkSWRlbnRpdHlDZXJ0aWZpY2F0ZSIpKTsKQEAgLTE5Niw2ICsyOTAsMTUgQEAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgYWRkQ2VydGlmaWNhdGUoQ2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIGlmIGNlcnRpZmljYXRlIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRDZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LkNlcnRpZmljYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2VydGlmaWNhdGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgSWRlbnRpdHlTdHViKCJhYWEiKS5hZGRDZXJ0aWZpY2F0ZShudWxsKTsKQEAgLTIzMyw2ICszMzYsMTUgQEAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgcmVtb3ZlQ2VydGlmaWNhdGUoQ2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBwZXJtaXNzaW9uIGlzIGRlbmllZAogICAgICAqLyAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZUNlcnRpZmljYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuQ2VydGlmaWNhdGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDZXJ0aWZpY2F0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uewogICAgICAgICBNeVNlY3VyaXR5TWFuYWdlciBzbSA9IG5ldyBNeVNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBzbS5kZW5pZWQuYWRkKG5ldyBTZWN1cml0eVBlcm1pc3Npb24oInJlbW92ZUlkZW50aXR5Q2VydGlmaWNhdGUiKSk7CkBAIC0yNTIsNiArMzY0LDE1IEBACiAgICAgLyoqCiAgICAgICogdmVyaWZ5IGNlcnRpZmljYXRlcygpIHJldHVybnMgYSBjb3B5IG9mIGFsbCBjZXJ0aWZpY2F0ZXMgZm9yIHRoaXMgaWRlbnRpdHkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJZGVudGl0eSBpID0gbmV3IElkZW50aXR5U3R1YigiaWlpIik7CiAgICAgICAgIFB1YmxpY0tleVN0dWIgcGsxID0gbmV3IFB1YmxpY0tleVN0dWIoImtrayIsICJmZmYiLCBudWxsKTsgICAgICAgIApAQCAtMjc1LDYgKzM5NiwxNSBAQAogICAgIC8qKgogICAgICAqIHZlcmlmeSBJZGVudGl0eS5pZGVudGl0eUVxdWFscyhJZGVudGl0eSkgcmV0dXJuIHRydWUsIG9ubHkgaWYgbmFtZXMgYW5kIHB1YmxpYyBrZXlzIGFyZSBlcXVhbCAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaWRlbnRpdHlFcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7SWRlbnRpdHkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgbmFtZSA9ICJubm4iOwogICAgICAgICBQdWJsaWNLZXkgcGsgPSBuZXcgUHVibGljS2V5U3R1YigiYWFhIiwgImZmZiIsIG5ldyBieXRlW117MSwyLDMsNCw1fSk7CkBAIC0zMDEsNiArNDMxLDE2IEBACiAgICAgLyoqCiAgICAgICogdmVyaWZ5IElkZW50aXR5LnRvU3RyaW5nKGJvb2xlYW4pIHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaWRlbnRpdHkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJNZXRob2QncyByZXR1cm5lZCB2YWx1ZSBpcyBub3QgY2hlY2tlZC4gIiArCisgICAgICAgICAgICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ2Jvb2xlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbmV3IElkZW50aXR5U3R1YigiYWFhIikudG9TdHJpbmcoZmFsc2UpOwogICAgICAgICBuZXcgSWRlbnRpdHlTdHViKCJhYWEyIiwgSWRlbnRpdHlTY29wZS5nZXRTeXN0ZW1TY29wZSgpKS50b1N0cmluZyhmYWxzZSk7CkBAIC0zMTEsNiArNDUxLDE1IEBACiAgICAgLyoqCiAgICAgICogdmVyaWZ5IElkZW50aXR5LmdldFNjb3BlKCkgcmV0dXJucyBpZGVudGl0eSdzIHNjb3BlCiAgICAgICovIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTY29wZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTY29wZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIElkZW50aXR5IGkgPSBuZXcgSWRlbnRpdHlTdHViKCJ0ZXN0R2V0U2NvcGUiKTsKICAgICAgICBhc3NlcnROdWxsKGkuZ2V0U2NvcGUoKSk7CkBAIC0zMjMsOCArNDcyLDE2IEBACiAgICAgLyoqCiAgICAgICogCiAgICAgICogdmVyaWZ5IElkZW50aXR5LnNldFB1YmxpY0tleSgpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBwZXJtaXNzaW9uIGlzIGRlbmllZAotICAgICAqCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UHVibGljS2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1B1YmxpY0tleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFB1YmxpY0tleTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTXlTZWN1cml0eU1hbmFnZXIgc20gPSBuZXcgTXlTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgc20uZGVuaWVkLmFkZChuZXcgU2VjdXJpdHlQZXJtaXNzaW9uKCJzZXRJZGVudGl0eVB1YmxpY0tleSIpKTsKQEAgLTM0Myw2ICs1MDAsMTUgQEAKICAgICAgKiB2ZXJpZnkgSWRlbnRpdHkuc2V0UHVibGljS2V5KCkgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gaWYga2V5IGlzIGludmFsaWQgCiAgICAgICoKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQdWJsaWNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHVibGljS2V5MigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJZGVudGl0eSBpMiA9IG5ldyBJZGVudGl0eVN0dWIoInRlc3RTZXRQdWJsaWNLZXkyXzIiLCBJZGVudGl0eVNjb3BlLmdldFN5c3RlbVNjb3BlKCkpOwogICAgICAgICBuZXcgUHVibGljS2V5U3R1Yigia2trIiwgInRlc3RTZXRQdWJsaWNLZXkyIiwgbmV3IGJ5dGVbXXsxLDIsMyw0LDV9KTsKQEAgLTM3NCw2ICs1NDAsMTUgQEAKICAgICAgKiB2ZXJpZnkgSWRlbnRpdHkuc2V0UHVibGljS2V5KCkgIHJlbW92ZXMgb2xkIGtleSBhbmQgYWxsIGlkZW50aXR5J3MgY2VydGlmaWNhdGVzCiAgICAgICoKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQdWJsaWNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHVibGljS2V5NCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJZGVudGl0eSBpID0gbmV3IElkZW50aXR5U3R1YigidGVzdFNldFB1YmxpY0tleTQiKTsKICAgICAgICAgUHVibGljS2V5U3R1YiBwazEgPSBuZXcgUHVibGljS2V5U3R1Yigia2trIiwgIklkZW50aXR5LnRlc3RTZXRQdWJsaWNLZXk0IiwgbnVsbCk7ICAgICAgICAKQEAgLTM5Myw2ICs1NjgsMTUgQEAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgSWRlbnRpdHkuZ2V0UHVibGljS2V5KCkgcmV0dXJucyBwdWJsaWMga2V5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFB1YmxpY0tleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQdWJsaWNLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSWRlbnRpdHkgaSA9IG5ldyBJZGVudGl0eVN0dWIoInRlc3RHZXRQdWJsaWNLZXkiKTsKICAgICAgICAgYXNzZXJ0TnVsbChpLmdldFB1YmxpY0tleSgpKTsKQEAgLTQwNyw2ICs1OTEsMTUgQEAKICAgICAgKgogICAgICAqCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiSnVzdCBTZWN1cml0eUV4Y2VwdGlvbiB2ZXJpZmljYXRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTXlTZWN1cml0eU1hbmFnZXIgc20gPSBuZXcgTXlTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgc20uZGVuaWVkLmFkZChuZXcgU2VjdXJpdHlQZXJtaXNzaW9uKCJzZXRJZGVudGl0eUluZm8iKSk7CkBAIC00MjAsNiArNjEzLDE5IEBACiAgICAgICAgIH0gICAgICAgIAogICAgIH0KICAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJCb3RoIG1ldGhvZCB3ZXJlIHZlcmlmaWVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbmZvKCkgewogICAgICAgICAKICAgICAgICAgSWRlbnRpdHkgaSA9IG5ldyBJZGVudGl0eVN0dWIoInRlc3RHZXRJbmZvIik7CkBAIC00MjcsNiArNjMzLDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygic29tZSBpbmZvIiwgaS5nZXRJbmZvKCkpOwogICAgIH0KICAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgewogICAgICAgICBJZGVudGl0eSBpID0gbmV3IElkZW50aXR5U3R1YigidGVzdEdldE5hbWUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzICgidGVzdEdldE5hbWUiLCBpLmdldE5hbWUoKSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggZmIzM2Q3OS4uZjMwZGRlMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L1Byb3ZpZGVyVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9Qcm92aWRlclRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDAsNyArNDUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoUHJvdmlkZXIuY2xhc3MpCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5Qcm92aWRlcjwvY29kZT4gY29uc3RydWN0b3IgYW5kIG1ldGhvZHMKICAqIApAQCAtNjAsNiArNjUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgUHJvdmlkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vdCBhbGwgdmFyaWFucyBvZiBwYXJhbWV0ZXJzIHdlcmUgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQcm92aWRlcigpIHsKICAgICAgICAgaWYgKCFwLmdldFByb3BlcnR5KCJQcm92aWRlci5pZCBuYW1lIikuZXF1YWxzKAogICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHAuZ2V0TmFtZSgpKSkpIHsKQEAgLTc5LDYgKzkzLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbGVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDbGVhcigpIHsKICAgICAgICAgcC5jbGVhcigpOwogICAgICAgICBpZiAocC5nZXRQcm9wZXJ0eSgiTWVzc2FnZURpZ2VzdC5TSEEtMSIpICE9IG51bGwpIHsKQEAgLTg5LDYgKzExMiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBQcm92aWRlcihTdHJpbmcsIGRvdWJsZSwgU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vdCBhbGwgdmFyaWFucyBvZiBwYXJhbWV0ZXJzIHdlcmUgY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgZG91YmxlLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQcm92aWRlclN0cmluZ2RvdWJsZVN0cmluZygpIHsKICAgICAgICAgUHJvdmlkZXIgcCA9IG5ldyBNeVByb3ZpZGVyKCJQcm92aWRlciBuYW1lIiwgMTIzLjQ1NiwgIlByb3ZpZGVyIGluZm8iKTsKICAgICAgICAgaWYgKCFwLmdldE5hbWUoKS5lcXVhbHMoIlByb3ZpZGVyIG5hbWUiKSB8fCBwLmdldFZlcnNpb24oKSAhPSAxMjMuNDU2CkBAIC05NywxOCArMTI5LDQ1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXROYW1lKCkgewogICAgICAgICBpZiAoIXAuZ2V0TmFtZSgpLmVxdWFscygiTXlQcm92aWRlciIpKSB7CiAgICAgICAgICAgICBmYWlsKCJJbmNvcnJlY3QgcHJvdmlkZXIgbmFtZSIpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VmVyc2lvbigpIHsKICAgICAgICAgaWYgKHAuZ2V0VmVyc2lvbigpICE9IDEuMCkgewogICAgICAgICAgICAgZmFpbCgiSW5jb3JyZWN0IHByb3ZpZGVyIHZlcnNpb24iKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEluZm8oKSB7CiAgICAgICAgIGlmICghcC5nZXRJbmZvKCkuZXF1YWxzKCJQcm92aWRlciBmb3IgdGVzdGluZyIpKSB7CiAgICAgICAgICAgICBmYWlsKCJJbmNvcnJlY3QgcHJvdmlkZXIgaW5mbyIpOwpAQCAtMTE4LDYgKzE3NywxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBwdXRBbGwoTWFwKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwdXRBbGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLk1hcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFB1dEFsbE1hcCgpIHsKICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgaG0ucHV0KCJNZXNzYWdlRGlnZXN0LlNIQS0xIiwgImFhYS5iYmIuY2NjLmRkZCIpOwpAQCAtMTM5LDYgKzIwNywxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU2V0IGVudHJ5U2V0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbnRyeVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbnRyeVNldCgpIHsKICAgICAgICAgcC5wdXQoIk1lc3NhZ2VEaWdlc3QuU0hBLTI1NiIsICJhYWEuYmJiLmNjYy5kZGQiKTsKIApAQCAtMTkxLDYgKzI2OCwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU2V0IGtleVNldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImtleVNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RLZXlTZXQoKSB7CiAgICAgICAgIHAucHV0KCJNZXNzYWdlRGlnZXN0LlNIQS0yNTYiLCAiYWFhLmJiYi5jY2MuZGRkIik7CiAKQEAgLTIyMSw2ICszMDcsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIENvbGxlY3Rpb24gdmFsdWVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VmFsdWVzKCkgewogICAgICAgICBwLnB1dCgiTWVzc2FnZURpZ2VzdC5TSEEtMjU2IiwgImFhYS5iYmIuY2NjLmRkZCIpOwogCkBAIC0yNDcsNiArMzQyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBPYmplY3QgcHV0KE9iamVjdCwgT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFB1dE9iamVjdE9iamVjdCgpIHsKICAgICAgICAgcC5wdXQoIk1lc3NhZ2VEaWdlc3QuU0hBLTEiLCAiYWFhLmJiYi5jY2MuZGRkIik7CiAgICAgICAgIHAucHV0KCJUeXBlLkFsZ29yaXRobSIsICJjbGFzc05hbWUiKTsKQEAgLTI4Myw2ICszODcsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIE9iamVjdCByZW1vdmUoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZW1vdmVPYmplY3QoKSB7CiAgICAgICAgIE9iamVjdCBvID0gcC5yZW1vdmUoIk1lc3NhZ2VEaWdlc3QuU0hBLTEiKTsKICAgICAgICAgaWYgKCEiU29tZUNsYXNzTmFtZSIuZXF1YWxzKG8pKSB7CkBAIC0yOTYsNiArNDA5LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZXJ2aWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2VydmljZTEoKSB7CiAgICAgICAgIHAucHV0KCJNZXNzYWdlRGlnZXN0LlNIQS0xIiwgIkFub3RoZXJDbGFzc05hbWUiKTsKICAgICAgICAgUHJvdmlkZXIuU2VydmljZSBzID0gcC5nZXRTZXJ2aWNlKCJNZXNzYWdlRGlnZXN0IiwgIlNIQS0xIik7CkBAIC0zMjgsNiArNDUwLDE1IEBACiAgICAgLy8gfQogCiAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0yNzYwLgorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdGluZzogbnVsbCBwYXJhbWV0ZXJzIGNoZWNraW5nIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBkb3VibGUuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICBNeVByb3ZpZGVyIG15UHJvdmlkZXIgPSBuZXcgTXlQcm92aWRlcihudWxsLCAxLCBudWxsKTsKICAgICAgICAgYXNzZXJ0TnVsbChteVByb3ZpZGVyLmdldE5hbWUoKSk7CkBAIC0zMzYsNiArNDY3LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygibnVsbCIsIG15UHJvdmlkZXIuZ2V0UHJvcGVydHkoIlByb3ZpZGVyLmlkIGluZm8iKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0aW5nIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VydmljZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0U2VydmljZXMoKSB7CiAgICAgICAgIE15UHJvdmlkZXIgbXlQcm92aWRlciA9IG5ldyBNeVByb3ZpZGVyKG51bGwsIDEsIG51bGwpOwogICAgICAgICBTZXQ8UHJvdmlkZXIuU2VydmljZT4gc2VydmljZXMgPSBteVByb3ZpZGVyLmdldFNlcnZpY2VzKCk7CkBAIC0zNzQsNiArNTE0LDE1IEBACiAgICAgICAgIGFzc2VydFRydWUoYWN0dWFsLmNvbnRhaW5zKHNbMl0pKTsKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3Rpbmc6IFNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInB1dFNlcnZpY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJvdmlkZXIuU2VydmljZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFB1dFNlcnZpY2UoKSB7CiAgICAgICAgIE15UHJvdmlkZXIgbXlQcm92aWRlciA9IG5ldyBNeVByb3ZpZGVyKG51bGwsIDEsIG51bGwpOwogICAgICAgICBQcm92aWRlci5TZXJ2aWNlIHNbXSA9IG5ldyBQcm92aWRlci5TZXJ2aWNlWzNdOwpAQCAtNDIzLDYgKzU3MiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0aW5nOiBTZWN1cml0eUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVTZXJ2aWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1Byb3ZpZGVyLlNlcnZpY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZW1vdmVTZXJ2aWNlKCkgewogICAgICAgICBNeVByb3ZpZGVyIG15UHJvdmlkZXIgPSBuZXcgTXlQcm92aWRlcihudWxsLCAxLCBudWxsKTsKICAgICAgICAgdHJ5IHsKQEAgLTQ5Miw2ICs2NTAsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgbG9hZChJbnB1dFN0cmVhbSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJT0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2FkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0lucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHdyaXRlUHJvcGVydGllcygpKTsKICAgICAgICAgTXlQcm92aWRlciBteVByb3ZpZGVyID0gbmV3IE15UHJvdmlkZXIoIm5hbWUiLCAxLCAiaW5mbyIpOwpAQCAtNTE2LDYgKzY4MywxNSBAQAogICAgIH0KIAogICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgQW5kcm9pZDogQ2hlY2sgZXhpc3RlbmNlIG9mIFJTQSBwcm92aWRlcgorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIk1ldGhvZHMgb2YgY2xhc3MgUHJvdmlkZXIgYXJlIG5vdCBjaGVja2VkIGluIHRoaXMgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfUlNBUHJvdmlkZXIoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBLZXlQYWlyR2VuZXJhdG9yIGtwZyA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIlJTQSIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyZUNsYXNzTG9hZGVyVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyZUNsYXNzTG9hZGVyVGVzdC5qYXZhCmluZGV4IDg3NTY4YzAuLjA1MTg2MTYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cmVDbGFzc0xvYWRlclRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJlQ2xhc3NMb2FkZXJUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2UgdGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwpAQCAtMzIsNyArMzcsNyBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhTZWN1cmVDbGFzc0xvYWRlci5jbGFzcykKIC8qKgogICogVW5pdCB0ZXN0IGZvciBTZWN1cmVDbGFzc0xvYWRlci4KICAqIApAQCAtMTc1LDYgKzE4MCwxNSBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIGRlZmF1bHQgY3RvcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlY3VyaXR5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3VyZUNsYXNzTG9hZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlY3VyZUNsYXNzTG9hZGVyKCkgewogICAgICAgICBuZXcgTXlDbGFzc0xvYWRlcigpOwogICAgIH0KQEAgLTE4Miw2ICsxOTYsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBTZWN1cmVDbGFzc0xvYWRlcihDbGFzc0xvYWRlcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBudWxsIHBhcmFtZXRlciBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZWN1cmVDbGFzc0xvYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtDbGFzc0xvYWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlY3VyZUNsYXNzTG9hZGVyQ2xhc3NMb2FkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbXSB7IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3QiKSB9OwogICAgICAgICBVUkxDbGFzc0xvYWRlciB1Y2wgPSBVUkxDbGFzc0xvYWRlci5uZXdJbnN0YW5jZSh1cmxzKTsKQEAgLTE5MSw2ICsyMTQsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBnZXRQZXJtaXNzaW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIHJldHVybmVkIHZhbHVlIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBlcm1pc3Npb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NvZGVTb3VyY2UuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQZXJtaXNzaW9ucygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdCIpOwogICAgICAgICBDb2RlU291cmNlIGNzID0gbmV3IENvZGVTb3VyY2UodXJsLCAoQ2VydGlmaWNhdGVbXSkgbnVsbCk7CkBAIC0yMDIsNyArMjM0LDE2IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgZGVmaW5lQ2xhc3MoU3RyaW5nLCBieXRlW10sIGludCwgaW50LCBDb2RlU291cmNlKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZpbmVDbGFzc1N0cmluZ2J5dGVBcnJheWludGludENvZGVTb3VyY2UoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2xhc3NGb3JtYXRFcnJvciwgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVmaW5lQ2xhc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdERlZmluZUNsYXNzU3RyaW5nYnl0ZUFycmF5aW50aW50Q29kZVNvdXJjZSgpIHsKICAgICAgICAgTXlDbGFzc0xvYWRlciBsZHIgPSBuZXcgTXlDbGFzc0xvYWRlcigpOwogICAgICAgICBDbGFzcyBrbGFzcyA9IGxkci5kZWZpbmUobnVsbCwga2xhc3NEYXRhLCAwLCBrbGFzc0RhdGEubGVuZ3RoLCBudWxsKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGtsYXNzLmdldE5hbWUoKSwga2xhc3NOYW1lKTsKQEAgLTIxMSw3ICsyNTIsMTYgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyBkZWZpbmVDbGFzcyhTdHJpbmcsIEJ5dGVCdWZmZXIsIENvZGVTb3VyY2UpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmluZUNsYXNzU3RyaW5nQnl0ZUJ1ZmZlckNvZGVTb3VyY2UoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiQ2xhc3NGb3JtYXRFcnJvciwgU2VjdXJpdHlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVmaW5lQ2xhc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBCeXRlQnVmZmVyLmNsYXNzLCBDb2RlU291cmNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdERlZmluZUNsYXNzU3RyaW5nQnl0ZUJ1ZmZlckNvZGVTb3VyY2UoKSB7CiAgICAgICAgIE15Q2xhc3NMb2FkZXIgbGRyID0gbmV3IE15Q2xhc3NMb2FkZXIoKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBiYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGtsYXNzRGF0YSk7CiAgICAgICAgIENsYXNzIGtsYXNzID0gbGRyLmRlZmluZShudWxsLCBiYnVmLCBudWxsKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb21UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tVGVzdC5qYXZhCmluZGV4IGJjMzM1OTQuLmI1ZWEwOTUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb21UZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbVRlc3QuamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKQEAgLTMwLDcgKzM1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5SYW5kb21JbXBsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKFNlY3VyZVJhbmRvbS5jbGFzcykKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlNlY3VyZVJhbmRvbTwvY29kZT4gY29uc3RydWN0b3IgYW5kIG1ldGhvZHMKICAqIApAQCAtNTksNiArNjQsMTUgQEAKICAgICAgICAgU2VjdXJpdHkucmVtb3ZlUHJvdmlkZXIocC5nZXROYW1lKCkpOwogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBuZWdhdGl2ZSBhbmQgYm91bmRhcnkgcGFyYW1ldGVycyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdE5leHQoKSB7CiAgICAgICAgIE15U2VjdXJlUmFuZG9tIHNyID0gbmV3IE15U2VjdXJlUmFuZG9tKCk7CiAgICAgICAgIGlmIChzci5uZXh0RWxlbWVudCgxKSAhPSAxIHx8IHNyLm5leHRFbGVtZW50KDIpICE9IDMgfHwgc3IubmV4dEVsZW1lbnQoMykgIT0gNykgewpAQCAtNjksNiArODMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgc2V0U2VlZChsb25nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiBvZiBib3VuZGFyeSBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2VlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0U2VlZGxvbmcoKSB7CiAgICAgICAgIFNlY3VyZVJhbmRvbSBzciA9IG5ldyBTZWN1cmVSYW5kb20oKTsKICAgICAgICAgc3Iuc2V0U2VlZCgxMjM0NSk7CkBAIC03Nyw2ICsxMDAsMTUgQEAKICAgICAgICAgfSAgICAKICAgICB9CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIHBhcmFtZXRlciB2ZXJpZmljYXRpb24gbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV4dEJ5dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdE5leHRCeXRlcygpIHsKICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVs1XTsKICAgICAgICAgU2VjdXJlUmFuZG9tIHNyID0gbmV3IFNlY3VyZVJhbmRvbSgpOwpAQCAtOTEsNiArMTIzLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIFNlY3VyZVJhbmRvbSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNlY3VyZVJhbmRvbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZWN1cmVSYW5kb20oKSB7CiAgICAgICAgIFNlY3VyZVJhbmRvbSBzciA9IG5ldyBTZWN1cmVSYW5kb20oKTsKICAgICAgICAgaWYgKCFzci5nZXRBbGdvcml0aG0oKS5lcXVhbHMoInNvbWVSYW5kb20iKSAgfHwKQEAgLTEwMiw2ICsxNDMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgU2VjdXJlUmFuZG9tKGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZWN1cmVSYW5kb20iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2VjdXJlUmFuZG9tYnl0ZUFycmF5KCkgewogICAgICAgICBieXRlW10gYiA9IHsxLDIsM307CiAgICAgICAgIG5ldyBTZWN1cmVSYW5kb20oYik7CkBAIC0xMTQsNiArMTY0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBTZWN1cmVSYW5kb20gZ2V0SW5zdGFuY2UoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZygpIHsKICAgICAgICAgU2VjdXJlUmFuZG9tIHNyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTEyOSw2ICsxODgsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFNlY3VyZVJhbmRvbSBnZXRJbnN0YW5jZShTdHJpbmcsIFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZ1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZWN1cmVSYW5kb20gc3IgPSBTZWN1cmVSYW5kb20uZ2V0SW5zdGFuY2UoInNvbWVSYW5kb20iLCAiU1JQcm92aWRlciIpOyAgICAKICAgICAgICAgaWYgKHNyLmdldFByb3ZpZGVyKCkgIT0gcCB8fCAhInNvbWVSYW5kb20iLmVxdWFscyhzci5nZXRBbGdvcml0aG0oKSkpIHsKQEAgLTEzOSw2ICsyMDcsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFNlY3VyZVJhbmRvbSBnZXRJbnN0YW5jZShTdHJpbmcsIFByb3ZpZGVyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRJbnN0YW5jZVN0cmluZ1Byb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3ZpZGVyIHAgPSBuZXcgU1JQcm92aWRlcigpOwogICAgICAgICBTZWN1cmVSYW5kb20gc3IgPSBTZWN1cmVSYW5kb20uZ2V0SW5zdGFuY2UoInNvbWVSYW5kb20iLCBwKTsKQEAgLTE1MCw2ICsyMjcsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgc2V0U2VlZChieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggbnVsbCBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2VlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRTZWVkYnl0ZUFycmF5KCkgewogICAgICAgICBieXRlW10gYiA9IHsxLDIsM307CiAgICAgICAgIFNlY3VyZVJhbmRvbSBzciA9IG5ldyBTZWN1cmVSYW5kb20oKTsKQEAgLTE1OSw2ICsyNDUsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVyIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0U2VlZCgpIHsKICAgICAgICAgYnl0ZVtdIGIgPSBTZWN1cmVSYW5kb20uZ2V0U2VlZCg0KTsKICAgICAgICAgaWYoIGIubGVuZ3RoICE9IDQpIHsKQEAgLTE2Niw2ICsyNjEsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVyIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlU2VlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZW5lcmF0ZVNlZWQoKSB7CiAgICAgICAgIFNlY3VyZVJhbmRvbSBzciA9IG5ldyBTZWN1cmVSYW5kb20oKTsKICAgICAgICAgYnl0ZVtdIGIgPSBzci5nZW5lcmF0ZVNlZWQoNCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZVRlc3QuamF2YQppbmRleCAwNzE5ZTQ5Li44MTBmYWRkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zZWN1cml0eS9TaWduYXR1cmVUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2UgdGVzdHMuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CkBAIC0zMyw3ICszOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuTXlTaWduYXR1cmUxOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlLmNsYXNzKQogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+U2lnbmF0dXJlPC9jb2RlPiBjb25zdHJ1Y3RvciBhbmQgbWV0aG9kcwogICogCkBAIC00Myw2ICs0OCwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgU2lnbmF0dXJlKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2lnbmF0dXJlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICBTdHJpbmcgW10gYWxnb3JpdGhtcyA9IHsgIlNIQTI1NldJVEhSU0EiLCAiTk9ORVdJVEhEU0EiLCAiU0hBMzg0V0lUSFJTQSIsCiAgICAgICAgICAgICAiTUQyV0lUSFJTQSIsICJNRDVBTkRTSEExV0lUSFJTQSIsICJTSEE1MTJXSVRIUlNBIiwKQEAgLTY4LDYgKzgyLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBPYmplY3QgY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkp1c3QgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2hlY2tlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENsb25lKCkgewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogICAgICAgICB0cnkgewpAQCAtNzcsNiArMTAwLDE1IEBACiAgICAgICAgIH0gICAgCiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFByb3ZpZGVyKCkgewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogICAgICAgICAKQEAgLTg0LDYgKzExNiwxNSBAQAogICAgICAgICBhc3NlcnROdWxsKCJwcm92aWRlciIsIHMuZ2V0UHJvdmlkZXIoKSk7CiAgICAgfQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGdvcml0aG0oKSB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAKQEAgLTk0LDYgKzEzNSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBpbml0VmVyaWZ5KFB1YmxpY0tleSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkS2V5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRWZXJpZnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdFZlcmlmeVB1YmxpY0tleSgpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKIApAQCAtMTA1LDYgKzE1NSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBpbml0VmVyaWZ5KENlcnRpZmljYXRlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRLZXlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdFZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0VmVyaWZ5Q2VydGlmaWNhdGUoKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAKQEAgLTExNiw2ICsxNzUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgaW5pdFNpZ24oUHJpdmF0ZUtleSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkS2V5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXRTaWduIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1ByaXZhdGVLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0U2lnblByaXZhdGVLZXkoKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAKQEAgLTEyNyw2ICsxOTUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgaW5pdFNpZ24oUHJpdmF0ZUtleSwgU2VjdXJlUmFuZG9tKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRLZXlFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdFNpZ24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJpdmF0ZUtleS5jbGFzcywgU2VjdXJlUmFuZG9tLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdFNpZ25Qcml2YXRlS2V5U2VjdXJlUmFuZG9tKCkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogCkBAIC0xMzgsNiArMjE1LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBieXRlW10gc2lnbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIHJldHVybmVkIGJ5dGUgYXJyYXkgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2lnbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIHRyeSB7CkBAIC0xNjMsNiArMjQ5LDE2IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBzaWduKGJ5dGVbXSwgb2Zmc2V0LCBsZW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIG9mIHJldHVybmVkIG51bWJlciBvZiBieXRlcyBtaXNzZWQuICIgKworICAgICAgICAgICAgICAgICAgIkRpZmZlcmVudCB2YWx1ZXMgb2YgcGFyYW1ldGVycyBvZmZzZXQgYW5kIGxlbiB3ZXJlIG5vdCB0ZXN0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2lnbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbmJ5dGVpbnRpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKICAgICAgICAgYnl0ZVtdIG91dGJ1ZiA9IG5ldyBieXRlIFsxMF07CkBAIC0xOTAsNiArMjg2LDE2IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBib29sZWFuIHZlcmlmeShieXRlW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBhcnJheSBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAgICJNZXRob2QncyByZXR1cm5lZCB2YWx1ZSBjaGVja2luZyBtaXNzZWQuICIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlieXRlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKICAgICAgICAgYnl0ZVtdIGIgPSB7MSwgMiwgMywgNH07CkBAIC0yMTUsNiArMzIxLDE3IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBib29sZWFuIHZlcmlmeShieXRlW10sIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgYXJyYXkgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgIk1ldGhvZCdzIHJldHVybmVkIHZhbHVlIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgIkJvdW5kYXJ5L2ludmFsaWQgdmFsdWVzIG9mIHBhcmFtZXRlcnMgb2Zmc2V0IGFuZCBsZW5ndGggYXJlIG5vdCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Ynl0ZUFycmF5aW50aW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIGJ5dGVbXSBiID0gezEsIDIsIDMsIDR9OwpAQCAtMjQ4LDYgKzM2NSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCB1cGRhdGUoYnl0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJCb3VuZGFyeSB0ZXN0aW5nIG1pc3NlZC4gU2lnbmF0dXJlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZWJ5dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKICAgICAgICAgdHJ5IHsKQEAgLTI2OCw2ICszOTQsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgdXBkYXRlKGJ5dGVbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIGFycmF5IGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlYnl0ZUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CiAgICAgICAgIGJ5dGVbXSBiID0gezEsIDIsIDMsIDR9OwpAQCAtMjg5LDYgKzQyNCwxNyBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCB1cGRhdGUoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIGFycmF5IHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQuICIgKworICAgICAgICAgICAgICAgICJNZXRob2QncyByZXR1cm5lZCB2YWx1ZSBjaGVja2luZyBtaXNzZWQuICIgKworICAgICAgICAgICAgICAgICJCb3VuZGFyeS9pbnZhbGlkIHZhbHVlcyBvZiBwYXJhbWV0ZXJzIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBub3QgY2hlY2tlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZWJ5dGVBcnJheWludGludCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwogICAgICAgICBieXRlW10gYiA9IHsxLCAyLCAzLCA0fTsKQEAgLTMxMCw2ICs0NTYsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgc2V0UGFyYW1ldGVyKFN0cmluZywgT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UGFyYW1ldGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQYXJhbWV0ZXJTdHJpbmdPYmplY3QoKSB7CiAgICAgICAgIE15U2lnbmF0dXJlMSBzID0gbmV3IE15U2lnbmF0dXJlMSgiQUJDIik7CkBAIC0zMTksNiArNDc0LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIHNldFBhcmFtZXRlcihBbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UGFyYW1ldGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGFyYW1ldGVyQWxnb3JpdGhtUGFyYW1ldGVyU3BlYygpIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKICAgICAgICAgTXlTaWduYXR1cmUxIHMgPSBuZXcgTXlTaWduYXR1cmUxKCJBQkMiKTsKICAgICAgICAgdHJ5IHsKQEAgLTMyNyw2ICs0OTEsMTYgQEAKICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSl7ICAgIAogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgY2hlY2sgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbi4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVyKCkgewogICAgICAgICBNeVNpZ25hdHVyZTEgcyA9IG5ldyBNeVNpZ25hdHVyZTEoIkFCQyIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDE4YmZmYzYuLjE3ZWQwOGIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSB0ZXN0cy5zZWN1cml0eTsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKQEAgLTI2LDcgKzI4LDcgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW47CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoQWNjZXNzQ29udHJvbGxlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByb3RlY3Rpb25Eb21haW4oQ2xhc3MgYywgUHJvdGVjdGlvbkRvbWFpbiBwZCl7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L0FsbFRlc3RzLmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L0FsbFRlc3RzLmphdmEKaW5kZXggMDVhMWEzNC4uN2RhYTQzZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9BbGxUZXN0cy5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvQWxsVGVzdHMuamF2YQpAQCAtMzQsOSArMzQsMTYgQEAKICAgICAgICAgc3VpdGUuYWRkVGVzdChvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eS5BbGxUZXN0cy5zdWl0ZSgpKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5hcGkuamF2YS5zZWN1cml0eS5BbGxUZXN0cy5zdWl0ZSgpKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5qYXZhLnNlY3VyaXR5LkFsbFRlc3RzLnN1aXRlKCkpOworICAgIAorICAgIHN1aXRlLmFkZFRlc3QodGVzdHMuc2VjdXJpdHkuYWNsLkFsbFRlc3RzLnN1aXRlKCkpOworICAgIHN1aXRlLmFkZFRlc3QodGVzdHMuc2VjdXJpdHkuY2VydC5BbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLnNlY3VyaXR5LmludGVyZmFjZXMuQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5zZWN1cml0eS5zcGVjLkFsbFRlc3RzLnN1aXRlKCkpOwogCi0gICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uc1Rlc3Quc3VpdGUoKSk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbnNUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXJUZXN0LmNsYXNzKTsKKyAgICAKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5hcGkuamF2YXguc2VjdXJpdHkuY2VydC5BbGxUZXN0cy5zdWl0ZSgpKTsKICAgICAgICAgLy8gJEpVbml0LUVORCQKICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvU2VjdXJpdHlQZXJtaXNzaW9uc1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvU2VjdXJpdHlQZXJtaXNzaW9uc1Rlc3QuamF2YQppbmRleCA5YTA2ZTI3Li45MThkYjhhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L1NlY3VyaXR5UGVybWlzc2lvbnNUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb25zVGVzdC5qYXZhCkBAIC0xNiwyNyArMTYsMTMgQEAKIAogcGFja2FnZSB0ZXN0cy5zZWN1cml0eTsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Ob3RBY3RpdmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGVQZXJtaXNzaW9uOwotaW1wb3J0IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zLmNsYXNzKQogLyoKICAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIHNlY3JpdHkgcGVybWlzc2lvbnMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4KICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL3NlY3VyaXR5L3Blcm1pc3Npb25zLmh0bWwjUGVybXNBbmRNZXRob2RzCkBAIC00NiwxMCArMzIsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3Qgc3VpdGUoKSB7CiAgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3RzIGZvciBzZWN1cml0eSBwZXJtaXNzaW9ucyIpOwogCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5zZWN1cml0eS5wZXJtaXNzaW9ucy5KYXZhSW9GaWxlU3RyZWFtVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0cy5zZWN1cml0eS5wZXJtaXNzaW9ucy5KYXZhSW9GaWxlSW5wdXRTdHJlYW1UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zLkphdmFJb0ZpbGVPdXRwdXRTdHJlYW1UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zLkphdmFJb1JhbmRvbUFjY2Vzc0ZpbGVUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zLkphdmFJb0ZpbGVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zLkphdmFJb09iamVjdFN0cmVhbVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUodGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnMuSmF2YUlvT2JqZWN0SW5wdXRTdHJlYW1UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zLkphdmFJb09iamVjdE91dHB1dFN0cmVhbVRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUodGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnMuSmF2YUxhbmdTeXN0ZW1UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zLkphdmFMYW5nQ2xhc3NUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zLkphdmFMYW5nQ2xhc3NMb2FkZXJUZXN0LmNsYXNzKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL0FjbE5vdEZvdW5kRXhjZXB0aW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL0FjbE5vdEZvdW5kRXhjZXB0aW9uMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBhODNlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9hY2wvQWNsTm90Rm91bmRFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmFjbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuYWNsLkFjbE5vdEZvdW5kRXhjZXB0aW9uOworCitAVGVzdFRhcmdldENsYXNzKEFjbE5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIEFjbE5vdEZvdW5kRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5hY2wuQWNsTm90Rm91bmRFeGNlcHRpb24jQWNsTm90Rm91bmRFeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBY2xOb3RGb3VuZEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LmFjbC5BY2xOb3RGb3VuZEV4Y2VwdGlvbigpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY2xOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIEFjbE5vdEZvdW5kRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEFjbE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWNsTm90Rm91bmRFeGNlcHRpb24udG9TdHJpbmcoKSBzaG91bGQgaGF2ZSBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgKyAiJ2phdmEuc2VjdXJpdHkuYWNsLkFjbE5vdEZvdW5kRXhjZXB0aW9uJyBidXQgd2FzICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICJqYXZhLnNlY3VyaXR5LmFjbC5BY2xOb3RGb3VuZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9BY2xOb3RGb3VuZEV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL0FjbE5vdEZvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzIzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9BY2xOb3RGb3VuZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBBbGVrc2VpIFkuIFNlbWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5hY2w7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmFjbC5BY2xOb3RGb3VuZEV4Y2VwdGlvbjsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIEFjbE5vdEZvdW5kRXhjZXB0aW9uLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQWNsTm90Rm91bmRFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgQWNsTm90Rm91bmRFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oQWNsTm90Rm91bmRFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVjayBkZWZhdWx0IGNvbnN0cnVjdG9yIAorICAgICAqLyAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFjbE5vdEZvdW5kRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEFjbE5vdEZvdW5kRXhjZXB0aW9uKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBBY2xOb3RGb3VuZEV4Y2VwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChuZXcgQWNsTm90Rm91bmRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKG5ldyBBY2xOb3RGb3VuZEV4Y2VwdGlvbigpLmdldENhdXNlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9hY2wvQWxsVGVzdHMuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyMDZjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5hY2w7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIFRoaXMgaXMgYXV0b2dlbmVyYXRlZCBzb3VyY2UgZmlsZS4gSW5jbHVkZXMgdGVzdHMgZm9yIHBhY2thZ2UgdGVzdHMuYXBpLmphdmEuc2VjdXJpdHkuYWNsOworICovCisKK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihBbGxUZXN0cy5zdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCB0ZXN0cyBmb3IgcGFja2FnZSB0ZXN0cy5hcGkuamF2YS5zZWN1cml0eS5hY2w7Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQWNsTm90Rm91bmRFeGNlcHRpb24yVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBY2xOb3RGb3VuZEV4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTGFzdE93bmVyRXhjZXB0aW9uMlRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTGFzdE93bmVyRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOb3RPd25lckV4Y2VwdGlvbjJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5vdE93bmVyRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisKKyAgICAgICAgLy8gJEpVbml0LUVORCQKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL0xhc3RPd25lckV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9MYXN0T3duZXJFeGNlcHRpb24yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTE4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9MYXN0T3duZXJFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmFjbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuYWNsLkxhc3RPd25lckV4Y2VwdGlvbjsKKworQFRlc3RUYXJnZXRDbGFzcyhMYXN0T3duZXJFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgTGFzdE93bmVyRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5hY2wuTGFzdE93bmVyRXhjZXB0aW9uI0xhc3RPd25lckV4Y2VwdGlvbigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxhc3RPd25lckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LmFjbC5MYXN0T3duZXJFeGNlcHRpb24oKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IExhc3RPd25lckV4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoIChMYXN0T3duZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXN0T3duZXJFeGNlcHRpb24udG9TdHJpbmcoKSBzaG91bGQgaGF2ZSBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgKyAiJ2phdmEuc2VjdXJpdHkuYWNsLkxhc3RPd25lckV4Y2VwdGlvbicgYnV0IHdhcyAiCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLCAiamF2YS5zZWN1cml0eS5hY2wuTGFzdE93bmVyRXhjZXB0aW9uIiwgZQorICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9MYXN0T3duZXJFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9MYXN0T3duZXJFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkNWE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL0xhc3RPd25lckV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBBbGVrc2VpIFkuIFNlbWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5hY2w7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmFjbC5MYXN0T3duZXJFeGNlcHRpb247CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBMYXN0T3duZXJFeGNlcHRpb24uCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhMYXN0T3duZXJFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgTGFzdE93bmVyRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKExhc3RPd25lckV4Y2VwdGlvblRlc3QuY2xhc3MpOworICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTGFzdE93bmVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdExhc3RPd25lckV4Y2VwdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgTGFzdE93bmVyRXhjZXB0aW9uKCkpOworICAgICAgICBhc3NlcnROdWxsKG5ldyBMYXN0T3duZXJFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKG5ldyBMYXN0T3duZXJFeGNlcHRpb24oKS5nZXRDYXVzZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL05vdE93bmVyRXhjZXB0aW9uMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL05vdE93bmVyRXhjZXB0aW9uMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWE1ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9hY2wvTm90T3duZXJFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmFjbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuYWNsLk5vdE93bmVyRXhjZXB0aW9uOworCitAVGVzdFRhcmdldENsYXNzKE5vdE93bmVyRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIE5vdE93bmVyRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5hY2wuTm90T3duZXJFeGNlcHRpb24jTm90T3duZXJFeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOb3RPd25lckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LmFjbC5Ob3RPd25lckV4Y2VwdGlvbigpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90T3duZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoTm90T3duZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb3RPd25lckV4Y2VwdGlvbi50b1N0cmluZygpIHNob3VsZCBoYXZlIGJlZW4gIgorICAgICAgICAgICAgICAgICAgICArICInamF2YS5zZWN1cml0eS5hY2wuTm90T3duZXJFeGNlcHRpb24nIGJ1dCB3YXMgIgorICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSwgImphdmEuc2VjdXJpdHkuYWNsLk5vdE93bmVyRXhjZXB0aW9uIiwgZQorICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9Ob3RPd25lckV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvYWNsL05vdE93bmVyRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGUyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2FjbC9Ob3RPd25lckV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBBbGVrc2VpIFkuIFNlbWVub3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5hY2w7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmFjbC5Ob3RPd25lckV4Y2VwdGlvbjsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIE5vdE93bmVyRXhjZXB0aW9uLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTm90T3duZXJFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgTm90T3duZXJFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oTm90T3duZXJFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk5vdE93bmVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdE5vdE93bmVyRXhjZXB0aW9uKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBOb3RPd25lckV4Y2VwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChuZXcgTm90T3duZXJFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKG5ldyBOb3RPd25lckV4Y2VwdGlvbigpLmdldENhdXNlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0FsbFRlc3RzLmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQwNzgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnNlY3VyaXR5LmNlcnQ7CisgKi8KKworcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKEFsbFRlc3RzLnN1aXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLmFwaS5qYXZhLnNlY3VyaXR5LmNlcnQ7Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ1JMRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDUkxUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRQYXRoQnVpbGRlcjFUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydFBhdGhCdWlsZGVyMlRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0UGF0aEJ1aWxkZXJTcGlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRQYXRoQ2VydFBhdGhSZXBUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRQYXRoVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0UGF0aFZhbGlkYXRvcjFUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydFBhdGhWYWxpZGF0b3IyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0UGF0aFZhbGlkYXRvcjNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0UGF0aFZhbGlkYXRvclNwaVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydFN0b3JlMVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydFN0b3JlRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0U3RvcmVTcGlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRpZmljYXRlQ2VydGlmaWNhdGVSZXBUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24yVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZUV4Y2VwdGlvbjJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRpZmljYXRlRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRpZmljYXRlRmFjdG9yeTFUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydGlmaWNhdGVGYWN0b3J5MlRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydGlmaWNhdGVGYWN0b3J5M1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydGlmaWNhdGVGYWN0b3J5NFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2VydGlmaWNhdGVGYWN0b3J5U3BpVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENlcnRpZmljYXRlVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyc1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTERBUENlcnRTdG9yZVBhcmFtZXRlcnNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBLSVhCdWlsZGVyUGFyYW1ldGVyc1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUEtJWENlcnRQYXRoQ2hlY2tlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQS0lYUGFyYW1ldGVyc1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUG9saWN5UXVhbGlmaWVySW5mb1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVHJ1c3RBbmNob3JUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoWDUwOUNSTDJUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoWDUwOUNSTEVudHJ5MlRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoWDUwOUNSTEVudHJ5VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShYNTA5Q1JMU2VsZWN0b3IyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShYNTA5Q1JMU2VsZWN0b3JUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFg1MDlDUkxUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFg1MDlDZXJ0U2VsZWN0b3JUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFg1MDlDZXJ0aWZpY2F0ZTJUZXN0LmNsYXNzKTsKKworICAgICAgICAvLyAkSlVuaXQtRU5EJAorICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYzcyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTEV4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q1JMRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDUkxFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgQ1JMRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ1JMRXhjZXB0aW9uVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ1JMRXhjZXB0aW9uVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIiB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyb3dhYmxlIHRDYXVzZSA9IG5ldyBUaHJvd2FibGUoIlRocm93YWJsZSBmb3IgZXhjZXB0aW9uIik7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DUkxFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzCisgICAgICogQ1JMRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ1JMRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENSTEV4Y2VwdGlvbjAxKCkgeworICAgICAgICBDUkxFeGNlcHRpb24gdEUgPSBuZXcgQ1JMRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNSTEV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBDUkxFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuIFBhcmFtZXRlcgorICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ1JMRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDUkxFeGNlcHRpb24wMigpIHsKKyAgICAgICAgQ1JMRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENSTEV4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNSTEV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBDUkxFeGNlcHRpb24gd2hlbiA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNSTEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q1JMRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBDUkxFeGNlcHRpb24gdEUgPSBuZXcgQ1JMRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNSTEV4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBDUkxFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ1JMRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDUkxFeGNlcHRpb24wNCgpIHsKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKKyAgICAgICAgQ1JMRXhjZXB0aW9uIHRFID0gbmV3IENSTEV4Y2VwdGlvbihjYXVzZSk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNSTEV4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBDUkxFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDUkxFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENSTEV4Y2VwdGlvbjA1KCkgeworICAgICAgICBDUkxFeGNlcHRpb24gdEUgPSBuZXcgQ1JMRXhjZXB0aW9uKHRDYXVzZSk7CisgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRvUyA9IHRDYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgc2hvdWxkIGNvbnRhaW4gIi5jb25jYXQodG9TKSwgKGdldE0KKyAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwgdEUKKyAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DUkxFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDUkxFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAorICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDUkxFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENSTEV4Y2VwdGlvbjA2KCkgeworICAgICAgICBDUkxFeGNlcHRpb24gdEUgPSBuZXcgQ1JMRXhjZXB0aW9uKG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNSTEV4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENSTEV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCisgICAgICogPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ1JMRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDUkxFeGNlcHRpb24wNygpIHsKKyAgICAgICAgQ1JMRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENSTEV4Y2VwdGlvbihtc2dzW2ldLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNSTEV4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENSTEV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDUkxFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENSTEV4Y2VwdGlvbjA4KCkgeworICAgICAgICBDUkxFeGNlcHRpb24gdEUgPSBuZXcgQ1JMRXhjZXB0aW9uKG51bGwsIHRDYXVzZSk7CisgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRvUyA9IHRDYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgbXVzdCBzaG91bGQgIi5jb25jYXQodG9TKSwgKGdldE0KKyAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwgdEUKKyAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DUkxFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDUkxFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKiA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ1JMRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDUkxFeGNlcHRpb24wOSgpIHsKKyAgICAgICAgQ1JMRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENSTEV4Y2VwdGlvbihtc2dzW2ldLCB0Q2F1c2UpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAobXNnc1tpXS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgbXVzdCBjb250YWluICIuY29uY2F0KG1zZ3NbaV0pLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihtc2dzW2ldKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRNLmVxdWFscyhtc2dzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgc2hvdWxkIGNvbnRhaW4gIi5jb25jYXQodG9TKSwgZ2V0TQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIHRFLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ1JMVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NSTFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRhZTEzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NSTFRlc3QuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+amF2YS5zZWN1cml0eS5jZXJ0LkNSTDwvY29kZT4gZmllbGRzIGFuZCBtZXRob2RzCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDUkwuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ1JMVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdmFsaWRWYWx1ZXMgPSB7ICJYLjUwOSIsICJ4LjUwOSIgfTsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBpbnZhbGlkVmFsdWVzID0gU3BpRW5nVXRpbHMuaW52YWxpZFZhbHVlczsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ1JMVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBDUkxUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q1JMKFN0cmluZyB0eXBlKTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBwYXJhbWV0ZXIgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ1JMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDUkwgY3JsID0gbmV3IE15Q1JMKHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWxpZFZhbHVlc1tpXSwgY3JsLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDUkwgY3JsID0gbmV3IE15Q1JMKGludmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludmFsaWRWYWx1ZXNbaV0sIGNybC5nZXRUeXBlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0VHlwZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIDxjb2RlPkNSTDwvY29kZT4gdHlwZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VHlwZTAxKCkgeworICAgICAgICBDUkwgY3JsID0gbmV3IE15Q1JMKCJURVNUX1RZUEUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURVNUX1RZUEUiLCBjcmwuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5nZXRUeXBlKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgPGNvZGU+Q1JMPC9jb2RlPiB0eXBlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFR5cGUwMigpIHsKKyAgICAgICAgQ1JMIGNybCA9IG5ldyBNeUNSTChudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjcmwuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHRoZSBmb2xsb3dpbmcgdGVzdHMganVzdCBjYWxsIG1ldGhvZHMKKyAgICAvLyB0aGF0IGFyZSBhYnN0cmFjdCBpbiA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT4KKyAgICAvLyAoU28gdGhleSBqdXN0IGxpa2Ugc2lnbmF0dXJlIHRlc3RzKQorICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIENSTCBjcmwgPSBuZXcgTXlDUkwoIlRFU1RfVFlQRSIpOworICAgICAgICBjcmwudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5pc1Jldm9rZWQoKTwvY29kZT4gbWV0aG9kCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1Jldm9rZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SXNSZXZva2VkKCkgeworICAgICAgICBDUkwgY3JsID0gbmV3IE15Q1JMKCJURVNUX1RZUEUiKTsKKyAgICAgICAgY3JsLmlzUmV2b2tlZChudWxsKTsKKyAgICB9CisKKyAgICBjbGFzcyBNeUNSTCBleHRlbmRzIENSTCB7CisKKyAgICAgICAgcHJvdGVjdGVkIE15Q1JMKFN0cmluZyB0eXBlKSB7CisgICAgICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jldm9rZWQoQ2VydGlmaWNhdGUgY2VydCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyMVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXIxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjY2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyMVRlc3QuamF2YQpAQCAtMCwwICsxLDYxOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXJTcGk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoQnVpbGRlclNwaTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKK2ltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfRXhlYzsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCisgKiBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydFBhdGhCdWlsZGVyLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRQYXRoQnVpbGRlcjFUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRQYXRoQnVpbGRlclRlc3RzLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIENlcnRQYXRoQnVpbGRlcjFUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzcnZDZXJ0UGF0aEJ1aWxkZXIgPSAiQ2VydFBhdGhCdWlsZGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRUeXBlID0gIlBLSVgiOyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBbXSB2YWxpZFZhbHVlcyA9IHsKKyAgICAgICAgICAgICJQS0lYIiwgInBraXgiLCAiUGtpWCIsICJwS2lYIiB9OworICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgW10gaW52YWxpZFZhbHVlcyA9IFNwaUVuZ1V0aWxzLmludmFsaWRWYWx1ZXM7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBQS0lYU3VwcG9ydCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0UHJvdmlkZXJOYW1lOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBOb3RTdXBwb3J0TXNnID0gIiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiY2VydHBhdGhidWlsZGVyLnR5cGUiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gU3BpRW5nVXRpbHMuaXNTdXBwb3J0KGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgIHNydkNlcnRQYXRoQnVpbGRlcik7CisgICAgICAgIFBLSVhTdXBwb3J0ID0gKGRlZmF1bHRQcm92aWRlciAhPSBudWxsKTsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSA9IChQS0lYU3VwcG9ydCA/IGRlZmF1bHRQcm92aWRlci5nZXROYW1lKCkgOiBudWxsKTsKKyAgICAgICAgTm90U3VwcG9ydE1zZyA9IGRlZmF1bHRUeXBlLmNvbmNhdCgiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydFBhdGhCdWlsZGVyW10gY3JlYXRlQ1BCcygpIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXJbXSBjZXJ0UEJzID0gbmV3IENlcnRQYXRoQnVpbGRlclszXTsKKyAgICAgICAgICAgIGNlcnRQQnNbMF0gPSBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UoZGVmYXVsdFR5cGUpOworICAgICAgICAgICAgY2VydFBCc1sxXSA9IENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZShkZWZhdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICBjZXJ0UEJzWzJdID0gQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgcmV0dXJuIGNlcnRQQnM7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXIjZ2V0RGVmYXVsdFR5cGUoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWZhdWx0VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldERlZmF1bHRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0yNzg1CisKKyAgICAgICAgLy8gdGVzdDogZGVmYXVsdCB2YWx1ZSAgCisgICAgICAgIGFzc2VydE51bGwoU2VjdXJpdHkuZ2V0UHJvcGVydHkoREVGQVVMVF9UWVBFX1BST1BFUlRZKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUEtJWCIsIENlcnRQYXRoQnVpbGRlci5nZXREZWZhdWx0VHlwZSgpKTsKKworICAgICAgICAvLyB0ZXN0OiBzZWN1cml0eSBwcm9wZXJ0eS4gZm9yayBuZXcgVk0gdG8ga2VlcCB0ZXN0aW5nIGVudi4gY2xlYW4KKyAgICAgICAgU3VwcG9ydF9FeGVjLmV4ZWNKYXZhKG5ldyBTdHJpbmdbXSB7IERlZmF1bHRUeXBlLmNsYXNzLmdldE5hbWUoKSB9LAorICAgICAgICAgICAgICAgIG51bGwsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdFR5cGUgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKworICAgICAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkoREVGQVVMVF9UWVBFX1BST1BFUlRZLCAiTXlUeXBlIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk15VHlwZSIsIENlcnRQYXRoQnVpbGRlci5nZXREZWZhdWx0VHlwZSgpKTsKKworICAgICAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkoREVGQVVMVF9UWVBFX1BST1BFUlRZLCAiQW5vdGhlclR5cGUiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQW5vdGhlclR5cGUiLCBDZXJ0UGF0aEJ1aWxkZXIuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjoKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCAKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtICBpcyBub3QgY29ycmVjdAorICAgICAqIG9yIGl0IGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoQnVpbGRlcjAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJObyBleHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZShpbnZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBDZXJ0UGF0aEJ1aWxkZXIgb2JqZWN0CisgICAgICovIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoQnVpbGRlcjAzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiAgeworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlciBjcGIgPSBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgY3BiLmdldEFsZ29yaXRobSgpLCB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eQorICAgICAqIAorICAgICAqIEZJWE1FOiB2ZXJpZnkgd2hhdCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgcHJvdmlkZXIgaXMgZW1wdHkKKyAgICAgKi8gIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyMDQoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJvdmlkZXIgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7ICAgICAgICAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGhhcyBpbnZhbGlkIHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRJbnN0YW5jZSB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gIiArCisgICAgICAgICAgICAid2hlbiBwcm92aWRlciBoYXMgaW52YWxpZCB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyMDUoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiAgeworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIGludmFsaWRWYWx1ZXNbal0pOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBtdXN0IGJlIGhyb3duIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsIAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gIGlzIG5vdCBjb3JyZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbDsgIiArCisgICAgICAgICAgICAidmVyaWZpZXMgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtICBpcyBub3QgY29ycmVjdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyMDYoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKG51bGwsIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBDZXJ0UGF0aEJ1aWxkZXIgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyMDcoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIgY2VydFBCOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJ0UEIgPSBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgY2VydFBCLmdldEFsZ29yaXRobSgpLCB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciBuYW1lIiwgY2VydFBCLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLCBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRJbnN0YW5jZSBtZXRob2QgdGhyb3dzICIgKworICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGwgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXIwOCgpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uICB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUHJvdmlkZXIgcHJvdiA9IG51bGw7CisgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyB0KysgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1t0XSwgcHJvdik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogCisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwgCisgICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSAgaXMgbm90IGNvcnJlY3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldEluc3RhbmNlIG1ldGhvZCB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIiArCisgICAgICAgICAgICAid2hlbiBhbGdvcml0aG0gaXMgbnVsbCwgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuICIgKworICAgICAgICAgICAgImFsZ29yaXRobSAgaXMgbm90IGNvcnJlY3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoQnVpbGRlcjA5KCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZShudWxsLCBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG0gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBDZXJ0UGF0aEJ1aWxkZXIgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRJbnN0YW5jZSByZXR1cm5zIENlcnRQYXRoQnVpbGRlciBvYmplY3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoQnVpbGRlcjEwKCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyIGNlcnRQQjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJ0UEIgPSBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UEIuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIG5hbWUiLCBjZXJ0UEIuZ2V0UHJvdmlkZXIoKSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmJ1aWxkKENlcnRQYXRoUGFyYW1ldGVycyBwYXJhbXMpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHBhcmFtcyBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBidWlsZCBtZXRob2QgdGhyb3dzICIgKworICAgICAgICAgICAgIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gaWYgYSBwYXJhbWV0ZXIgaXMgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJidWlsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyMTEoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIAorICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIENlcnRQYXRoQnVpbGRlciBbXSBjZXJ0UEIgPSBjcmVhdGVDUEJzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNlcnRQYXRoQnVpbGRlciBvYmplY3RzIHdlcmUgbm90IGNyZWF0ZWQiLCBjZXJ0UEIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNlcnRQQi5sZW5ndGg7IGkrKyApeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZXJ0UEJbaV0uYnVpbGQobnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciAKKyAgICAgKiA8Y29kZT5DZXJ0UGF0aEJ1aWxkZXI8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENlcnRQYXRoQnVpbGRlciBvYmplY3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhCdWlsZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXJTcGkuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXIxMigpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCAKKyAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyU3BpIHNwaSA9IG5ldyBNeUNlcnRQYXRoQnVpbGRlclNwaSgpOworICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIgY2VydFBCID0gbmV3IG15Q2VydFBhdGhCdWlsZGVyKHNwaSwgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlciwgZGVmYXVsdFR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UEIuZ2V0QWxnb3JpdGhtKCksIGRlZmF1bHRUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJ0UEIuZ2V0UHJvdmlkZXIoKSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRQQi5idWlsZChudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biAiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIGUpIHsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBjZXJ0UEIgPSBuZXcgbXlDZXJ0UGF0aEJ1aWxkZXIobnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UEIuZ2V0QWxnb3JpdGhtKCkpOworICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJ0UEIuZ2V0UHJvdmlkZXIoKSk7ICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0UEIuYnVpbGQobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biAiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0QWxnb3JpdGhtKCk8L2NvZGU+IG1ldGhvZCBBc3NlcnRpb246IHJldHVybnMKKyAgICAgKiBDZXJ0UGF0aEJ1aWxkZXIgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXIxMygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyIGNwYiA9IENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjcGIuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY3BiID0gQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgY3BiLmdldEFsZ29yaXRobSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZXhlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY3BiID0gQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgY3BiLmdldEFsZ29yaXRobSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFByb3ZpZGVyKCk8L2NvZGU+IG1ldGhvZCBBc3NlcnRpb246IHJldHVybnMKKyAgICAgKiBDZXJ0UGF0aEJ1aWxkZXIgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoQnVpbGRlcjE0KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIgY3BiMiA9IENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY3BiMi5nZXRQcm92aWRlcigpLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlciBjcGIzID0gQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY3BiMy5nZXRQcm92aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKENlcnRQYXRoQnVpbGRlcjFUZXN0LmNsYXNzKTsKKyAgICB9ICAKKyAgICAKK30KKy8qKgorICogQWRkaXRpb25hbCBjbGFzcyB0byB2ZXJpZnkgQ2VydFBhdGhCdWlsZGVyIGNvbnN0cnVjdG9yCisgKi8KK2NsYXNzIG15Q2VydFBhdGhCdWlsZGVyIGV4dGVuZHMgQ2VydFBhdGhCdWlsZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3ZpZGVyIHByb3ZpZGVyOworCisgICAgcHVibGljIG15Q2VydFBhdGhCdWlsZGVyKENlcnRQYXRoQnVpbGRlclNwaSBzcGksIFByb3ZpZGVyIHByb3YsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIHN1cGVyKHNwaSwgcHJvdiwgdHlwZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDZXJ0UGF0aEJ1aWxkZXIgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBteUNlcnRQYXRoQnVpbGRlciBtY3BiID0gbmV3IG15Q2VydFBhdGhCdWlsZGVyKG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBwcm92aWRlciA9IG1jcGIubmV3IE15UHJvdmlkZXIoKTsKKyAgICAgICAgcmV0dXJuIENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgIH0KKworICAgIHB1YmxpYyBQcm92aWRlciBnZXRNeVByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gcHJvdmlkZXI7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15UHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY1Mzc0NDc5MDU2NTgxOTExODRMOworCisgICAgICAgIE15UHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigiTXlQcm92aWRlciIsIDEuMCwgIlByb3ZpZGVyIGZvciB0ZXN0aW5nIik7CisgICAgICAgIH0KKworICAgICAgICBNeVByb3ZpZGVyKFN0cmluZyBuYW1lLCBkb3VibGUgdmVyc2lvbiwgU3RyaW5nIGluZm8pIHsKKyAgICAgICAgICAgIHN1cGVyKG5hbWUsIHZlcnNpb24sIGluZm8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0U2VydmljZShQcm92aWRlci5TZXJ2aWNlIHMpIHsKKyAgICAgICAgICAgIHN1cGVyLnB1dFNlcnZpY2Uocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlKFByb3ZpZGVyLlNlcnZpY2UgcykgeworICAgICAgICAgICAgc3VwZXIucmVtb3ZlU2VydmljZShzKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlcjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdjM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlcjJUZXN0LmphdmEKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgdGVzdHMuc2VjdXJpdHkuY2VydC5teUNlcnRQYXRoQnVpbGRlci5NeVByb3ZpZGVyOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyUmVzdWx0OworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3BpRW5nVXRpbHM7CisvKioKKyAqIFRlc3RzIGZvciBDZXJ0UGF0aEJ1aWxkZXIgY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0UGF0aEJ1aWxkZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydFBhdGhCdWlsZGVyMlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRBbGcgPSAiQ2VydFBCIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ2VydFBhdGhCdWlsZGVyUHJvdmlkZXJDbGFzcyA9ICJ0ZXN0cy5zZWN1cml0eS5jZXJ0LnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoQnVpbGRlclNwaSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbnZhbGlkVmFsdWVzID0gU3BpRW5nVXRpbHMuaW52YWxpZFZhbHVlczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHZhbGlkVmFsdWVzOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdmFsaWRWYWx1ZXMgPSBuZXcgU3RyaW5nWzRdOworICAgICAgICB2YWxpZFZhbHVlc1swXSA9IGRlZmF1bHRBbGc7CisgICAgICAgIHZhbGlkVmFsdWVzWzFdID0gZGVmYXVsdEFsZy50b0xvd2VyQ2FzZSgpOworICAgICAgICB2YWxpZFZhbHVlc1syXSA9ICJDZVJ0UGIiOworICAgICAgICB2YWxpZFZhbHVlc1szXSA9ICJjRVJUcGIiOworICAgIH0KKworICAgIFByb3ZpZGVyIG1Qcm92OworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVByb3YgPSAobmV3IFNwaUVuZ1V0aWxzKCkpLm5ldyBNeVByb3ZpZGVyKCJNeUNlcnRQYXRoQnVpbGRlclByb3ZpZGVyIiwKKyAgICAgICAgICAgICAgICAiUHJvdmlkZXIgZm9yIHRlc3RpbmciLCBDZXJ0UGF0aEJ1aWxkZXIxVGVzdC5zcnZDZXJ0UGF0aEJ1aWxkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoIi4iKS5jb25jYXQoZGVmYXVsdEFsZyksCisgICAgICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyUHJvdmlkZXJDbGFzcyk7CisgICAgICAgIFNlY3VyaXR5Lmluc2VydFByb3ZpZGVyQXQobVByb3YsIDEpOworICAgIH0KKworICAgIC8qCisgICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgU2VjdXJpdHkucmVtb3ZlUHJvdmlkZXIobVByb3YuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydFBhdGhCdWlsZGVyMlRlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydFBhdGhCdWlsZGVyMlRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdWx0KENlcnRQYXRoQnVpbGRlciBjZXJ0QnVpbGQpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBkdCA9IENlcnRQYXRoQnVpbGRlci5nZXREZWZhdWx0VHlwZSgpOworICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBDZXJ0UGF0aEJ1aWxkZXIxVGVzdC5ERUZBVUxUX1RZUEVfUFJPUEVSVFk7CisgICAgICAgIFN0cmluZyBkdE47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDxpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eShwcm9wTmFtZSwgaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBkdE4gPSBDZXJ0UGF0aEJ1aWxkZXIuZ2V0RGVmYXVsdFR5cGUoKTsKKyAgICAgICAgICAgIGlmICghZHROLmVxdWFscyhpbnZhbGlkVmFsdWVzW2ldKSAmJiAhZHROLmVxdWFscyhkdCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbmNvcnJlY3QgZGVmYXVsdCB0eXBlOiAiLmNvbmNhdChkdE4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eShwcm9wTmFtZSwgZHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkZWZhdWx0IHR5cGUiLCBDZXJ0UGF0aEJ1aWxkZXIuZ2V0RGVmYXVsdFR5cGUoKSwKKyAgICAgICAgICAgICAgICBkdCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0QnVpbGQuYnVpbGQobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSAgICAKKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyUmVzdWx0IGNwYlJlc3VsdCA9IGNlcnRCdWlsZC5idWlsZChudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgQ2VydFBhdGhCdWlsZGVyUmVzdWx0IiwgY3BiUmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6CisgICAgICogdGhyb3dzIAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsIAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gIGlzIG5vdCBjb3JyZWN0CisgICAgICogcmV0dXJucyBDZXJ0UGF0aEJ1aWxkZXIgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0SW5zdGFuY2UwMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duICh0eXBlOiAiLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyIGNlclBCOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJQQiA9IENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VyUEIuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY2VyUEIuZ2V0UHJvdmlkZXIoKSwgbVByb3YpOworICAgICAgICAgICAgY2hlY2tSZXN1bHQoY2VyUEIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uczogCisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwgCisgICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSAgaXMgbm90IGNvcnJlY3QKKyAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eTsgCisgICAgICogdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgYXZhaWxhYmxlOyAKKyAgICAgKiByZXR1cm5zIENlcnRQYXRoQnVpbGRlciBvYmplY3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRJbnN0YW5jZTAyKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKG51bGwsIG1Qcm92LmdldE5hbWUoKSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZShpbnZhbGlkVmFsdWVzW2ldLCBtUHJvdgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duICh0eXBlOiAiLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByb3YgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgcHJvdik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCAodHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh2YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgZW1wdHkgKHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXNbal0pOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biAodHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiIHByb3ZpZGVyOiAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoaW52YWxpZFZhbHVlc1tqXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyIGNlclBCOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJQQiA9IENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgbVByb3YKKyAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VyUEIuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY2VyUEIuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG1Qcm92LmdldE5hbWUoKSk7CisgICAgICAgICAgICBjaGVja1Jlc3VsdChjZXJQQik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CisgICAgICogbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsIAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gIGlzIG5vdCBjb3JyZWN0CisgICAgICogcmV0dXJucyBDZXJ0UGF0aEJ1aWxkZXIgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0SW5zdGFuY2UwMygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKG51bGwsIG1Qcm92KTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIGFsZ29yaXRobSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFBhdGhCdWlsZGVyLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIG1Qcm92KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gKHR5cGU6ICIuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQcm92aWRlciBwcm92ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIHByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHByb3ZpZGVyIGlzIG51bGwgKHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyIGNlclBCOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJQQiA9IENlcnRQYXRoQnVpbGRlci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgbVByb3YpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNlclBCLmdldEFsZ29yaXRobSgpLCB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGNlclBCLmdldFByb3ZpZGVyKCksIG1Qcm92KTsKKyAgICAgICAgICAgIGNoZWNrUmVzdWx0KGNlclBCKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihDZXJ0UGF0aEJ1aWxkZXIyVGVzdC5jbGFzcyk7CisgICAgfSAgCisgICAgCisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OGE4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb247CisKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCisgKiBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvblRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSIgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKKyAgICAgKiBjb25zdHJ1Y3RzIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24wMSgpIHsKKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UgbXNnLgorICAgICAqIFBhcmFtZXRlciA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uMDIoKSB7CisgICAgICAgIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPiBpcworICAgICAqIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gdEUgPSBuZXcgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbjA0KCkgeworICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOworICAgICAgICBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gdEUgPSBuZXcgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPgorICAgICAqIGlzIG5vdCBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24wNSgpIHsKKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbih0Q2F1c2UpOworICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBnZXRNID0gdEUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWVzc2FnZSgpIHNob3VsZCBjb250YWluICIuY29uY2F0KHRvUyksIChnZXRNCisgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRDYXVzZSgpIG11c3Qgbm90IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksIHRFCisgICAgICAgICAgICAgICAgLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24wNigpIHsKKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbihudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uMDcoKSB7CisgICAgICAgIENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24obXNnc1tpXSwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24wOCgpIHsKKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbihudWxsLCB0Q2F1c2UpOworICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBnZXRNID0gdEUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWVzc2FnZSgpIG11c3Qgc2hvdWxkICIuY29uY2F0KHRvUyksIChnZXRNCisgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRDYXVzZSgpIG11c3Qgbm90IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksIHRFCisgICAgICAgICAgICAgICAgLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24wOSgpIHsKKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbihtc2dzW2ldLCB0Q2F1c2UpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAobXNnc1tpXS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgbXVzdCBjb250YWluICIuY29uY2F0KG1zZ3NbaV0pLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihtc2dzW2ldKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRNLmVxdWFscyhtc2dzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgc2hvdWxkIGNvbnRhaW4gIi5jb25jYXQodG9TKSwgZ2V0TQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIHRFLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyU3BpVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlclNwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDNkYjkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlclNwaVRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXJSZXN1bHQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlclNwaTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoQnVpbGRlclNwaTsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyU3BpPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0UGF0aEJ1aWxkZXJTcGkuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydFBhdGhCdWlsZGVyU3BpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0UGF0aEJ1aWxkZXJTcGlUZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIENlcnRQYXRoQnVpbGRlclNwaVRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhCdWlsZGVyU3BpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBDZXJ0UGF0aEJ1aWxkZXJTcGkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhCdWlsZGVyU3BpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVCdWlsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhCdWlsZGVyU3BpMDEoKSB0aHJvd3MgQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIENlcnRQYXRoQnVpbGRlclNwaSBjZXJ0UGF0aEJ1aWxkZXIgPSBuZXcgTXlDZXJ0UGF0aEJ1aWxkZXJTcGkoKTsKKyAgICAgICAgQ2VydFBhdGhQYXJhbWV0ZXJzIGNwcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0UGF0aEJ1aWxkZXIuZW5naW5lQnVpbGQoY3BwKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9ICAgIAorICAgICAgICBDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQgY3BiUmVzdWx0ID0gY2VydFBhdGhCdWlsZGVyLmVuZ2luZUJ1aWxkKGNwcCk7CisgICAgICAgIGFzc2VydE51bGwoIk5vdCBudWxsIENlcnRQYXRoQnVpbGRlclJlc3VsdCIsIGNwYlJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQ2VydFBhdGhSZXBUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhDZXJ0UGF0aFJlcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODJmYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQ2VydFBhdGhSZXBUZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0UGF0aC5NeUNlcnRQYXRoUmVwOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlclNwaTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0UGF0aC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0UGF0aENlcnRQYXRoUmVwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSB0ZXN0RW5jb2RpbmcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDEsIChieXRlKSAyLAorICAgICAgICAgICAgKGJ5dGUpIDMsIChieXRlKSA0LCAoYnl0ZSkgNSB9OworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoLkNlcnRQYXRoUmVwKFN0cmluZyB0eXBlLCBieXRlW10gZGF0YSk8L2NvZGU+CisgICAgICogbWV0aG9kPGJyPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwvaW52YWxpZCBwYXJhbWV0ZXJzIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDZXJ0UGF0aFJlcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGJ5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDZXJ0UGF0aENlcnRQYXRoUmVwKCkgeworICAgICAgICBNeUNlcnRQYXRoIGNwID0gbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKTsKKyAgICAgICAgTXlDZXJ0UGF0aFJlcCByZXAgPSBjcC5uZXcgTXlDZXJ0UGF0aFJlcCgiTXlFbmNvZGluZyIsIHRlc3RFbmNvZGluZyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0RW5jb2RpbmcsIHJlcC5nZXREYXRhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk15RW5jb2RpbmciLCByZXAuZ2V0VHlwZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3AubmV3IE15Q2VydFBhdGhSZXAobnVsbCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4ZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI2OTMyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGg7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0UGF0aDsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IGZpZWxkcyBhbmQgbWV0aG9kcworICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydFBhdGguY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydFBhdGhUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIC8qKgorICAgICAqIE1lYW5pbmdsZXNzIGNlcnQgcGF0aCBlbmNvZGluZyBqdXN0IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHRlc3RFbmNvZGluZyA9IG5ldyBieXRlW10geworICAgICAgICAgICAgKGJ5dGUpMSwgKGJ5dGUpMiwgKGJ5dGUpMywgKGJ5dGUpNCwgKGJ5dGUpNQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydFBhdGhUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIENlcnRQYXRoVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRlc3RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoKFN0cmluZyB0eXBlKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBoYXNoIG9mIHRoZSA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT4gaW5zdGFuY2UKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTdHJpbmcvbnVsbCBwYXJhbWV0ZXJzIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDZXJ0UGF0aCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRQYXRoIGNwMSA9IG5ldyBNeUNlcnRQYXRoKHRlc3RFbmNvZGluZyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk15RW5jb2RpbmciLCBjcDEuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0ZXN0RW5jb2RpbmcsIGNwMS5nZXRFbmNvZGVkKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmhhc2hDb2RlKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgaGFzaCBvZiB0aGUgPGNvZGU+Q2VydGlmaWNhdGU8L2NvZGU+IGluc3RhbmNlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgaGFzaCBjb2RlcyBvZiBub24gZXF1YWwgb2JqZWN0cy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKKyAgICAgICAgQ2VydFBhdGggY3AxID0gbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKTsKKyAgICAgICAgQ2VydFBhdGggY3AyID0gbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNwMS5oYXNoQ29kZSgpID09IGNwMi5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5oYXNoQ29kZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBoYXNoIGNvZGUgb2YgZXF1YWwgb2JqZWN0cyBzaG91bGQgYmUgdGhlIHNhbWUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBoYXNoIGNvZGVzIG9mIG5vbiBlcXVhbCBvYmplY3RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEhhc2hDb2RlRXF1YWxzT2JqZWN0KCkgeworICAgICAgICBDZXJ0UGF0aCBjcDEgPSBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpOworICAgICAgICBDZXJ0UGF0aCBjcDIgPSBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpOworICAgICAgICBhc3NlcnRUcnVlKChjcDEuaGFzaENvZGUoKSA9PSBjcDIuaGFzaENvZGUoKSkgJiYgY3AxLmVxdWFscyhjcDIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRUeXBlKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgY2VydCBwYXRoIHR5cGUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRUeXBlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIk15RW5jb2RpbmciLCBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+ZXF1YWxzKE9iamVjdCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IG9iamVjdCBlcXVhbHMgdG8gaXRzZWxmIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgb2JqZWN0IGVxdWFscyB0byBpdHNlbGYuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFcXVhbHNPYmplY3QwMSgpIHsKKyAgICAgICAgQ2VydFBhdGggY3AxID0gbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjcDEuZXF1YWxzKGNwMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBvYmplY3QgZXF1YWxzIHRvIG90aGVyIDxjb2RlPkNlcnRQYXRoPC9jb2RlPgorICAgICAqIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgc3RhdGUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IENlcnRQYXRoIG9iamVjdCBlcXVhbHMgdG8gb3RoZXIgQ2VydFBhdGggIiArCisgICAgICAgICAgICAid2l0aCB0aGUgc2FtZSBzdGF0ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDAyKCkgeworICAgICAgICBDZXJ0UGF0aCBjcDEgPSBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpOworICAgICAgICBDZXJ0UGF0aCBjcDIgPSBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpOworICAgICAgICBhc3NlcnRUcnVlKGNwMS5lcXVhbHMoY3AyKSAmJiBjcDIuZXF1YWxzKGNwMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBvYmplY3Qgbm90IGVxdWFscyB0byA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFcXVhbHNPYmplY3QwMygpIHsKKyAgICAgICAgQ2VydFBhdGggY3AxID0gbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY3AxLmVxdWFscyhudWxsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZXF1YWxzKE9iamVjdCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IG9iamVjdCBub3QgZXF1YWxzIHRvIG90aGVyIHdoaWNoIGlzIG5vdAorICAgICAqIGluc3RhbmNlIG9mIDxjb2RlPkNlcnRQYXRoPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG5vbiBlcXVhbCBvYmplY3RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0MDQoKSB7CisgICAgICAgIENlcnRQYXRoIGNwMSA9IG5ldyBNeUNlcnRQYXRoKHRlc3RFbmNvZGluZyk7CisgICAgICAgIGFzc2VydEZhbHNlKGNwMS5lcXVhbHMoIk15RW5jb2RpbmciKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiA8Y29kZT5DZXJ0UGF0aDwvY29kZT4gb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBDZXJ0UGF0aCBjcDEgPSBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNwMS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHRoZSBmb2xsb3dpbmcgdGVzdHMganVzdCBjYWxsIG1ldGhvZHMKKyAgICAvLyB0aGF0IGFyZSBhYnN0cmFjdCBpbiA8Y29kZT5DZXJ0UGF0aDwvY29kZT4KKyAgICAvLyAoU28gdGhleSBqdXN0IGxpa2Ugc2lnbmF0dXJlIHRlc3RzKQorICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QganVzdCBjYWxscyA8Y29kZT5nZXRDZXJ0aWZpY2F0ZXMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJBYnN0cmFjdCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENlcnRpZmljYXRlcygpIHsKKyAgICAgICAgQ2VydFBhdGggY3AxID0gbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKTsKKyAgICAgICAgY3AxLmdldENlcnRpZmljYXRlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBqdXN0IGNhbGxzIDxjb2RlPmdldEVuY29kZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkFic3RyYWN0IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEVuY29kZWQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIENlcnRQYXRoIGNwMSA9IG5ldyBNeUNlcnRQYXRoKHRlc3RFbmNvZGluZyk7CisgICAgICAgIGNwMS5nZXRFbmNvZGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGp1c3QgY2FsbHMgPGNvZGU+Z2V0RW5jb2RlZChTdHJpbmcpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQWJzdHJhY3QgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEVuY29kZWRTdHJpbmcoKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIENlcnRQYXRoIGNwMSA9IG5ldyBNeUNlcnRQYXRoKHRlc3RFbmNvZGluZyk7CisgICAgICAgIGNwMS5nZXRFbmNvZGVkKCJNeUVuY29kaW5nIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGp1c3QgY2FsbHMgPGNvZGU+Z2V0RW5jb2RpbmdzKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQWJzdHJhY3QgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kaW5ncyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRFbmNvZGluZ3MoKSB7CisgICAgICAgIENlcnRQYXRoIGNwMSA9IG5ldyBNeUNlcnRQYXRoKHRlc3RFbmNvZGluZyk7CisgICAgICAgIGNwMS5nZXRFbmNvZGluZ3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QganVzdCBjYWxscyA8Y29kZT53cml0ZVJlcGxhY2UoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE9iamVjdFN0cmVhbUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZVJlcGxhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0V3JpdGVSZXBsYWNlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTXlDZXJ0UGF0aCBjcDEgPSBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpOworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGNwMS53cml0ZVJlcGxhY2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUob2JqLnRvU3RyaW5nKCkuY29udGFpbnMoCisgICAgICAgICAgICAgICAgICAgICJqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGgkQ2VydFBhdGhSZXAiKSk7CisgICAgICAgIH0gY2F0Y2ggKE9iamVjdFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yMVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvcjFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwMmE5YwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvcjFUZXN0LmphdmEKQEAgLTAsMCArMSw2MTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JTcGk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0UGF0aFZhbGlkYXRvclNwaTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q2VydFBhdGhWYWxpZGF0b3I8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQKKyAqIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0UGF0aFZhbGlkYXRvci5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0UGF0aFZhbGlkYXRvcjFUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRQYXRoVmFsaWRhdG9yVGVzdHMuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydFBhdGhWYWxpZGF0b3IxVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3J2Q2VydFBhdGhWYWxpZGF0b3IgPSAiQ2VydFBhdGhWYWxpZGF0b3IiOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0VHlwZSA9ICJQS0lYIjsgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gdmFsaWRWYWx1ZXMgPSB7CisgICAgICAgICAgICAiUEtJWCIsICJwa2l4IiwgIlBraVgiLCAicEtpWCIgfTsKKyAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFtdIGludmFsaWRWYWx1ZXMgPSBTcGlFbmdVdGlscy5pbnZhbGlkVmFsdWVzOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gUEtJWFN1cHBvcnQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3ZpZGVyIGRlZmF1bHRQcm92aWRlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFByb3ZpZGVyTmFtZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTm90U3VwcG9ydE1zZyA9ICIiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gU3BpRW5nVXRpbHMuaXNTdXBwb3J0KGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgIHNydkNlcnRQYXRoVmFsaWRhdG9yKTsKKyAgICAgICAgUEtJWFN1cHBvcnQgPSAoZGVmYXVsdFByb3ZpZGVyICE9IG51bGwpOworICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lID0gKFBLSVhTdXBwb3J0ID8gZGVmYXVsdFByb3ZpZGVyLmdldE5hbWUoKSA6IG51bGwpOworICAgICAgICBOb3RTdXBwb3J0TXNnID0gZGVmYXVsdFR5cGUuY29uY2F0KCIgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0gICAgCisgICAgCisgICAgCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydFBhdGhWYWxpZGF0b3JbXSBjcmVhdGVDUFZzKCkgeworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yW10gY2VydFBWcyA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvclszXTsKKyAgICAgICAgICAgIGNlcnRQVnNbMF0gPSBDZXJ0UGF0aFZhbGlkYXRvci5nZXRJbnN0YW5jZShkZWZhdWx0VHlwZSk7CisgICAgICAgICAgICBjZXJ0UFZzWzFdID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoZGVmYXVsdFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgY2VydFBWc1syXSA9IENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgcmV0dXJuIGNlcnRQVnM7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0gICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0RGVmYXVsdFR5cGUoKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHNlY3VyaXR5IHByb3BlcnR5ICJjZXJ0cGF0aHZhbGlkYXRvci50eXBlIiBvciAiUEtJWCIKKyAgICAgKi8gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yMDEoKSB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gImNlcnRwYXRodmFsaWRhdG9yLnR5cGUiOworICAgICAgICBTdHJpbmcgZGVmQ1BWID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkocHJvcE5hbWUpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGR0ID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0RGVmYXVsdFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIHJlc1R5cGUgPSBkZWZDUFY7IAorICAgICAgICBpZiAocmVzVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXNUeXBlID0gZGVmYXVsdFR5cGU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRGVmYXVsdCB0eXBlIGhhdmUgbm90IGJlIG51bGwiLCBkdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRlZmF1bHQgdHlwZSIsIGR0LCByZXNUeXBlKTsKKyAgICAgICAgCisgICAgICAgIGlmIChkZWZDUFYgPT0gbnVsbCkgeworICAgICAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkocHJvcE5hbWUsIGRlZmF1bHRUeXBlKTsKKyAgICAgICAgICAgIGR0ID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0RGVmYXVsdFR5cGUoKTsKKyAgICAgICAgICAgIHJlc1R5cGUgPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJJbmNvcnJlY3QgZGVmYXVsdCB0eXBlIiwgcmVzVHlwZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJEZWZhdWx0IHR5cGUgaGF2ZSBub3QgYmUgbnVsbCIsIGR0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRlZmF1bHQgdHlwZSIsIGR0LCByZXNUeXBlKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiAKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCAKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtICBpcyBub3QgYXZhaWxhYmxlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvcjAyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENlcnRQYXRoVmFsaWRhdG9yIG9iamVjdAorICAgICAqLyAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvcjAzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiAgeworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yIGNlcnRQVjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2VydFBWID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgY2VydFBWLmdldEFsZ29yaXRobSgpLCB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eQorICAgICAqIAorICAgICAqIEZJWE1FOiB2ZXJpZnkgd2hhdCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgcHJvdmlkZXIgaXMgZW1wdHkKKyAgICAgKi8gIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0SW5zdGFuY2UgbWV0aG9kIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIiArCisgICAgICAgICAgICAid2hlbiBwcm92aWRlciBwYXJhbWV0ZXIgaXMgbnVsbCBvciBlbXB0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhWYWxpZGF0b3IwNCgpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiAgeworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwcm92aWRlciA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsgICAgICAgIAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGhhcyBpbnZhbGlkIHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRJbnN0YW5jZSBtZXRob2QgdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICIgKworICAgICAgICAgICAgIndoZW4gcHJvdmlkZXIgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvcjA1KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IHQrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiAKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCAKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtICBpcyBub3QgYXZhaWxhYmxlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRJbnN0YW5jZSBtZXRob2QgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICIgKworICAgICAgICAgICAgIndoZW4gYWxnb3JpdGhtIGlzIG51bGwsIGFuZCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gIiArCisgICAgICAgICAgICAid2hlbiBhbGdvcml0aG0gIGlzIG5vdCBhdmFpbGFibGUiLCAKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yMDYoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UobnVsbCwgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENlcnRQYXRoVmFsaWRhdG9yIG9iamVjdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0SW5zdGFuY2UgbXd0aG9kIHJldHVybnMgIiArCisgICAgICAgICAgICAiQ2VydFBhdGhWYWxpZGF0b3Igb2JqZWN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvcjA3KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvciBjZXJ0UFY7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlcnRQViA9IENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIGNlcnRQVi5nZXRBbGdvcml0aG0oKSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIgbmFtZSIsIGNlcnRQVi5nZXRQcm92aWRlcigpCisgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0SW5zdGFuY2UgbWV0aG9kIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIiArCisgICAgICAgICAgICAid2hlbiBwcm92aWRlciBwYXJhbWV0ZXIgaXMgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhWYWxpZGF0b3IwOCgpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uICB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUHJvdmlkZXIgcHJvdiA9IG51bGw7CisgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyB0KysgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW3RdLCBwcm92KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiAKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCAKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtICBpcyBub3QgYXZhaWxhYmxlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRJbnN0YW5jZSBtZXRob2QgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICIgKworICAgICAgICAgICAgIndoZW4gYWxnb3JpdGhtIGlzIG51bGwsIGFuZCAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gIiArCisgICAgICAgICAgICAiYWxnb3JpdGhtICBpcyBub3QgYXZhaWxhYmxlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvcjA5KCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKG51bGwsIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgQ2VydFBhdGhWYWxpZGF0b3Igb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRJbnN0YW5jZSBtZXRob2QgcmV0dXJucyBDZXJ0UGF0aFZhbGlkYXRvciAiICsKKyAgICAgICAgICAgICJvYmplY3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yMTAoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yIGNlcnRQVjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJ0UFYgPSBDZXJ0UGF0aFZhbGlkYXRvci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsIGNlcnRQVi5nZXRBbGdvcml0aG0oKSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIgbmFtZSIsIGNlcnRQVi5nZXRQcm92aWRlcigpLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+dmFsaWRhdGUoQ2VydFBhdGggY2VydHBhdGgsIENlcnRQYXRoUGFyYW1ldGVycyBwYXJhbXMpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHBhcmFtcyBpcyBub3QKKyAgICAgKiBpbnN0YW5jZSBvZiBQS0lYUGFyYW1ldGVycyBvciBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCB2YWxpZGF0ZSBtZXRob2QgdGhyb3dzICIgKworICAgICAgICAgICAgIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gaWYgcGFyYW0gaXMgbm90ICIgKyAKKyAgICAgICAgICAgICJpbnN0YW5jZSBvZiBQS0lYUGFyYW1ldGVycyBvciBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbGlkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aC5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoUGFyYW1ldGVycy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yMTEoKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvciBbXSBjZXJ0UFYgPSBjcmVhdGVDUFZzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNlcnRQYXRoVmFsaWRhdG9yIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRQVik7CisgICAgICAgIE15Q2VydFBhdGggbUNQID0gbmV3IE15Q2VydFBhdGgobmV3IGJ5dGVbMF0pOworICAgICAgICBpbnZhbGlkUGFyYW1zIG1QYXIgPSBuZXcgaW52YWxpZFBhcmFtcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNlcnRQVi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZXJ0UFZbaV0udmFsaWRhdGUobUNQLCBtUGFyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZXJ0UFZbaV0udmFsaWRhdGUobUNQLCBudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgICAvKioKKyAgICAgKiBUZXN0IGZvciAKKyAgICAgKiA8Y29kZT5DZXJ0UGF0aFZhbGlkYXRvcjwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgQ2VydFBhdGhWYWxpZGF0b3Igb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoVmFsaWRhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvclNwaS5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yMTIoKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIVBLSVhTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yU3BpIHNwaSA9IG5ldyBNeUNlcnRQYXRoVmFsaWRhdG9yU3BpKCk7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yIGNlcnRQViA9IG5ldyBteUNlcnRQYXRoVmFsaWRhdG9yKHNwaSwgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlciwgZGVmYXVsdFR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UFYuZ2V0QWxnb3JpdGhtKCksIGRlZmF1bHRUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJ0UFYuZ2V0UHJvdmlkZXIoKSwgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgY2VydFBWLnZhbGlkYXRlKG51bGwsIG51bGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydFBWLnZhbGlkYXRlKG51bGwsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gZSkgeworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgY2VydFBWID0gbmV3IG15Q2VydFBhdGhWYWxpZGF0b3IobnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UFYuZ2V0QWxnb3JpdGhtKCkpOworICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJ0UFYuZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0UFYudmFsaWRhdGUobnVsbCwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRBbGdvcml0aG0oKTwvY29kZT4gbWV0aG9kCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvcjEzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IgY2VydFBWOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJ0UFYgPSBDZXJ0UGF0aFZhbGlkYXRvci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UFYuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2VydFBWID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UFYuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2VydFBWID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0UFYuZ2V0QWxnb3JpdGhtKCksCisgICAgICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFByb3ZpZGVyKCk8L2NvZGU+IG1ldGhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvcjE0KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghUEtJWFN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yIGNlcnRQVjsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2VydFBWID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGNlcnRQVi5nZXRQcm92aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNlcnRQViA9IENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJ0UFYuZ2V0UHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKENlcnRQYXRoVmFsaWRhdG9yMVRlc3QuY2xhc3MpOworICAgIH0gIAorfQorLyoqCisgKiBBZGRpdGlvbmFsIGNsYXNzIHRvIHZlcmlmeSBDZXJ0UGF0aFZhbGlkYXRvciBjb25zdHJ1Y3RvcgorICovCitjbGFzcyBteUNlcnRQYXRoVmFsaWRhdG9yIGV4dGVuZHMgQ2VydFBhdGhWYWxpZGF0b3IgeworCisgICAgcHVibGljIG15Q2VydFBhdGhWYWxpZGF0b3IoQ2VydFBhdGhWYWxpZGF0b3JTcGkgc3BpLCBQcm92aWRlciBwcm92LCBTdHJpbmcgdHlwZSkgeworICAgICAgICBzdXBlcihzcGksIHByb3YsIHR5cGUpOworICAgIH0KK30KKy8qKgorICogQWRkaXRpb25hbCBjbGFzcyB0byB2ZXJpZnkgdmFsaWRhdGUgbWV0aG9kCisgKi8KK2NsYXNzIGludmFsaWRQYXJhbXMgaW1wbGVtZW50cyBDZXJ0UGF0aFBhcmFtZXRlcnMgeworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgaW52YWxpZFBhcmFtcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvcjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3IyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MWY2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3IyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IHRlc3RzLnNlY3VyaXR5LmNlcnQubXlDZXJ0UGF0aEJ1aWxkZXIuTXlQcm92aWRlcjsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3BpRW5nVXRpbHM7CisvKioKKyAqIFRlc3RzIGZvciBDZXJ0UGF0aFZhbGlkYXRvciBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMKKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRQYXRoVmFsaWRhdG9yLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRQYXRoVmFsaWRhdG9yMlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRBbGcgPSAiQ2VydFBCIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDZXJ0UGF0aFZhbGlkYXRvclByb3ZpZGVyQ2xhc3MgPSAidGVzdHMuc2VjdXJpdHkuY2VydC5zdXBwb3J0LmNlcnQuTXlDZXJ0UGF0aFZhbGlkYXRvclNwaSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbnZhbGlkVmFsdWVzID0gU3BpRW5nVXRpbHMuaW52YWxpZFZhbHVlczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHZhbGlkVmFsdWVzOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdmFsaWRWYWx1ZXMgPSBuZXcgU3RyaW5nWzRdOworICAgICAgICB2YWxpZFZhbHVlc1swXSA9IGRlZmF1bHRBbGc7CisgICAgICAgIHZhbGlkVmFsdWVzWzFdID0gZGVmYXVsdEFsZy50b0xvd2VyQ2FzZSgpOworICAgICAgICB2YWxpZFZhbHVlc1syXSA9ICJDZVJ0UGIiOworICAgICAgICB2YWxpZFZhbHVlc1szXSA9ICJjRVJUcGIiOworICAgIH0KKworICAgIFByb3ZpZGVyIG1Qcm92OworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVByb3YgPSAobmV3IFNwaUVuZ1V0aWxzKCkpLm5ldyBNeVByb3ZpZGVyKCJNeUNlcnRQYXRoVmFsaWRhdG9yUHJvdmlkZXIiLAorICAgICAgICAgICAgICAgICJQcm92aWRlciBmb3IgdGVzdGluZyIsIENlcnRQYXRoVmFsaWRhdG9yMVRlc3Quc3J2Q2VydFBhdGhWYWxpZGF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoIi4iKS5jb25jYXQoZGVmYXVsdEFsZyksCisgICAgICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3JQcm92aWRlckNsYXNzKTsKKyAgICAgICAgU2VjdXJpdHkuaW5zZXJ0UHJvdmlkZXJBdChtUHJvdiwgMSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBTZWN1cml0eS5yZW1vdmVQcm92aWRlcihtUHJvdi5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0UGF0aFZhbGlkYXRvcjJUZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIENlcnRQYXRoVmFsaWRhdG9yMlRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdWx0KENlcnRQYXRoVmFsaWRhdG9yIGNlcnRWKSAKKyAgICAgICAgICAgIHRocm93cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiwgCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGR0ID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0RGVmYXVsdFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gImNlcnRwYXRodmFsaWRhdG9yLnR5cGUiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8aW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkocHJvcE5hbWUsIGludmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZGVmYXVsdCB0eXBlIiwgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0RGVmYXVsdFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkocHJvcE5hbWUsIGR0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZGVmYXVsdCB0eXBlIiwgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0RGVmYXVsdFR5cGUoKSwKKyAgICAgICAgICAgICAgICBkdCk7ICAgICAgIGNlcnRWLnZhbGlkYXRlKG51bGwsIG51bGwpOworICAgICAgIHRyeSB7CisgICAgICAgICAgIGNlcnRWLnZhbGlkYXRlKG51bGwsIG51bGwpOyAgICAgICAgICAgCisgICAgICAgfSBjYXRjaCAoQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gZSkgeworICAgICAgIH0KKyAgICAgICB0cnkgeworICAgICAgICAgICBjZXJ0Vi52YWxpZGF0ZShudWxsLCBudWxsKTsgICAgICAgICAgIAorICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6CisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGwgCisgICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSAgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIHJldHVybnMgQ2VydFBhdGhWYWxpZGF0b3Igb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0SW5zdGFuY2UwMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvci5nZXRJbnN0YW5jZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIGFsZ29yaXRobSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duICh0eXBlOiAiLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IgY2VyUFY7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlclBWID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNlclBWLmdldEFsZ29yaXRobSgpLCB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGNlclBWLmdldFByb3ZpZGVyKCksIG1Qcm92KTsKKyAgICAgICAgICAgIGNoZWNrUmVzdWx0KGNlclBWKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbnM6IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsIAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eTsgCisgICAgICogdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgYXZhaWxhYmxlOyAKKyAgICAgKiByZXR1cm5zIENlcnRQYXRoVmFsaWRhdG9yIG9iamVjdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEdldEluc3RhbmNlMDIoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKG51bGwsIG1Qcm92LmdldE5hbWUoKSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIG1Qcm92CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gKHR5cGU6ICIuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJvdiA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIHByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHByb3ZpZGVyIGlzIG51bGwgKHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgZW1wdHkgKHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duICh0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh2YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIgcHJvdmlkZXI6ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChpbnZhbGlkVmFsdWVzW2pdKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvciBjZXJQVjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2VyUFYgPSBDZXJ0UGF0aFZhbGlkYXRvci5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgbVByb3YKKyAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VyUFYuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY2VyUFYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG1Qcm92LmdldE5hbWUoKSk7CisgICAgICAgICAgICBjaGVja1Jlc3VsdChjZXJQVik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CisgICAgICogbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsIAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbDsgCisgICAgICogcmV0dXJucyBDZXJ0UGF0aFZhbGlkYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRJbnN0YW5jZTAzKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKG51bGwsIG1Qcm92KTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIGFsZ29yaXRobSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgbVByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biAodHlwZTogIi5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFByb3ZpZGVyIHByb3YgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBwcm92KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiBwcm92aWRlciBpcyBudWxsICh0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yIGNlclBWOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJQViA9IENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBtUHJvdik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VyUFYuZ2V0QWxnb3JpdGhtKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY2VyUFYuZ2V0UHJvdmlkZXIoKSwgbVByb3YpOworICAgICAgICAgICAgY2hlY2tSZXN1bHQoY2VyUFYpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yM1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvcjNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjNmM1MQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvcjNUZXN0LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWFBhcmFtZXRlcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydFBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5UZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3BpRW5nVXRpbHM7CisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5DZXJ0UGF0aFZhbGlkYXRvcjwvY29kZT4gY2xhc3MgIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0UGF0aFZhbGlkYXRvci5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0UGF0aFZhbGlkYXRvcjNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRQYXRoVmFsaWRhdG9yVGVzdHMuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydFBhdGhWYWxpZGF0b3IzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRUeXBlID0gQ2VydFBhdGhCdWlsZGVyMVRlc3QuZGVmYXVsdFR5cGU7ICAgIAorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gUEtJWFN1cHBvcnQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3ZpZGVyIGRlZmF1bHRQcm92aWRlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFByb3ZpZGVyTmFtZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTm90U3VwcG9ydE1zZyA9ICIiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gU3BpRW5nVXRpbHMuaXNTdXBwb3J0KGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yMVRlc3Quc3J2Q2VydFBhdGhWYWxpZGF0b3IpOworICAgICAgICBQS0lYU3VwcG9ydCA9IChkZWZhdWx0UHJvdmlkZXIgIT0gbnVsbCk7CisgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUgPSAoUEtJWFN1cHBvcnQgPyBkZWZhdWx0UHJvdmlkZXIuZ2V0TmFtZSgpIDogbnVsbCk7CisgICAgICAgIE5vdFN1cHBvcnRNc2cgPSBkZWZhdWx0VHlwZS5jb25jYXQoIiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIENlcnRQYXRoVmFsaWRhdG9yW10gY3JlYXRlQ1BWcygpIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvcltdIGNlcnRQVnMgPSBuZXcgQ2VydFBhdGhWYWxpZGF0b3JbM107CisgICAgICAgICAgICBjZXJ0UFZzWzBdID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoZGVmYXVsdFR5cGUpOworICAgICAgICAgICAgY2VydFBWc1sxXSA9IENlcnRQYXRoVmFsaWRhdG9yLmdldEluc3RhbmNlKGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGNlcnRQVnNbMl0gPSBDZXJ0UGF0aFZhbGlkYXRvci5nZXRJbnN0YW5jZShkZWZhdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBjZXJ0UFZzOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9ICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnZhbGlkYXRlKENlcnRQYXRoIGNlcnRwYXRoLCBDZXJ0UGF0aFBhcmFtZXRlcnMgcGFyYW1zKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiAKKyAgICAgKiB3aGVuIHBhcmFtcyBpcyBpbnN0YW5jZSBvZiBQS0lYUGFyYW1ldGVycyBhbmQKKyAgICAgKiBjZXJ0cGF0aCBpcyBub3QgWC41MDkgdHlwZQorICAgICAqIAorICAgICAqIEZJWE1FOiBqcm9ja2l0LWoycmUxLjQuMl8wNCB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBjZXJ0UGF0aCBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWxpZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGguY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTAxKCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gIHsKKyAgICAgICAgaWYgKCFQS0lYU3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNeUNlcnRQYXRoIG1DUCA9IG5ldyBNeUNlcnRQYXRoKG5ldyBieXRlWzBdKTsKKyAgICAgICAgQ2VydFBhdGhQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQS0lYUGFyYW1ldGVycyhUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKSk7IAorICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvciBbXSBjZXJ0UFYgPSBjcmVhdGVDUFZzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNlcnRQYXRoVmFsaWRhdG9yIG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRQVik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2VydFBWLmxlbmd0aDsgaSsrKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRQVltpXS52YWxpZGF0ZShtQ1AsIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRQVltpXS52YWxpZGF0ZShudWxsLCBwYXJhbXMpOworICAgICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTgzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw2MzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZAorICogbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb25UZXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvblRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSIgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjAxKCkgeworICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlIG1zZy4KKyAgICAgKiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24wMigpIHsKKyAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24wMygpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+CisgICAgICogaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uMDQoKSB7CisgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oVGhyb3dhYmxlKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4KKyAgICAgKiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjA1KCkgeworICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbih0Q2F1c2UpOworICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBnZXRNID0gdEUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWVzc2FnZSgpIHNob3VsZCBjb250YWluICIuY29uY2F0KHRvUyksIChnZXRNCisgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRDYXVzZSgpIG11c3Qgbm90IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksIHRFCisgICAgICAgICAgICAgICAgLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB3aGVuCisgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjA2KCkgeworICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihudWxsLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjA3KCkgeworICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihtc2dzW2ldLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uMDgoKSB7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG51bGwsCisgICAgICAgICAgICAgICAgdENhdXNlKTsKKyAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IHNob3VsZCAiLmNvbmNhdCh0b1MpLCAoZ2V0TQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZih0b1MpICE9IC0xKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldENhdXNlKCkgbXVzdCByZXR1cm4gIi5jb25jYXQodENhdXNlLnRvU3RyaW5nKCkpLCB0RQorICAgICAgICAgICAgICAgIC5nZXRDYXVzZSgpLCB0Q2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uMDkoKSB7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChtc2dzW2ldLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IGNvbnRhaW4gIi5jb25jYXQobXNnc1tpXSksIGdldE0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKG1zZ3NbaV0pICE9IC0xKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdldE0uZXF1YWxzKG1zZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgdEUuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yCisgICAgICogPGNvZGU+Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUsIENlcnRQYXRoLCBpbnQpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB3aGVuCisgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCisgICAgICogPGNvZGU+Y2VydFBhdGg8L2NvZGU+IGlzIG51bGwgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIC0xCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24xMCgpIHsKKyAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gdEUgPSBuZXcgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24obnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCAtMSk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENlcnRQYXRoKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENlcnRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldEluZGV4KCkgbXVzdCBiZSAtMSIsIHRFLmdldEluZGV4KCksIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvcgorICAgICAqIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlLCBDZXJ0UGF0aCwgaW50KTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAorICAgICAqIDxjb2RlPmNlcnRQYXRoPC9jb2RlPiBpcyBudWxsIDxjb2RlPmluZGV4PC9jb2RlPiBub3QgLTEgdGhyb3dzOgorICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGguY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uMTEoKSB7CisgICAgICAgIGludFtdIGluZHggPSB7IDAsIDEsIDEwMCwgSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUlOX1ZBTFVFIH07CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5keC5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSwgbnVsbCwgaW5keFtqXSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkVycm9yLiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24gYXMgZXhwZWN0ZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbXNnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2dzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjZXJ0UGF0aCBpcyBudWxsIGFuZCBpbmRleCBpcyAiICsgaW5keFtqXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvcgorICAgICAqIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlLCBDZXJ0UGF0aCwgaW50KTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IG5vdCBudWxsCisgICAgICogPGNvZGU+Y2VydFBhdGg8L2NvZGU+IGlzIG51bGwgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIC0xCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGguY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uMTIoKSB7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHRFOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihtc2dzW2ldLCB0Q2F1c2UsIG51bGwsIC0xKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKG1zZ3NbaV0ubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IGNvbnRhaW4gIi5jb25jYXQobXNnc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TS5pbmRleE9mKG1zZ3NbaV0pICE9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRNLmVxdWFscyhtc2dzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWVzc2FnZSgpIHNob3VsZCBjb250YWluICIuY29uY2F0KHRvUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE0uaW5kZXhPZih0b1MpICE9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRDYXVzZSgpIG11c3Qgbm90IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodENhdXNlLnRvU3RyaW5nKCkpLCB0RS5nZXRDYXVzZSgpLCB0Q2F1c2UpOworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoImdldENlcnRQYXRoKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENlcnRQYXRoKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0SW5kZXgoKSBtdXN0IHJldHVybiAtMSIsIHRFLmdldEluZGV4KCksIC0xKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgUGFyYW1ldGVyczogbXNnOiAiICsgbXNnc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjZXJ0UGF0aCBpcyBudWxsIGFuZCBpbmRleCBpcyAtMSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IKKyAgICAgKiA8Y29kZT5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSwgQ2VydFBhdGgsIGludCk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBub3QgbnVsbAorICAgICAqIDxjb2RlPmNlcnRQYXRoPC9jb2RlPiBub3QgbnVsbCA8Y29kZT5pbmRleDwvY29kZT48IC0xIHx8ID49CisgICAgICogY2VydFBhdGguZ2V0Q2VydGlmaWNhdGVzKCkuc2l6ZSgpIHRocm93czogSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjEzKCkgeworICAgICAgICBteUNlcnRQYXRoIG1jcCA9IG5ldyBteUNlcnRQYXRoKCJYLjUwOSIsICIiKTsKKyAgICAgICAgQ2VydFBhdGggY3AgPSBtY3AuZ2V0KCJYLjUwOSIpOworICAgICAgICBpbnRbXSBpbmR4ID0geyAtMiwgLTEwMCwgMCwgMSwgMTAwLCBJbnRlZ2VyLk1BWF9WQUxVRSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSB9OworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGluZHgubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihtc2dzW2ldLCB0Q2F1c2UsIGNwLCBpbmR4W2pdKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3YXMgbm90IHRocm93biBhcyBleHBlY3RlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtc2c6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZ3NbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNlcnRQYXRoIGlzIG51bGwgYW5kIGluZGV4IGlzICIgKyBpbmR4W2pdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvcgorICAgICAqIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlLCBDZXJ0UGF0aCwgaW50KTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IG5vdCBudWxsCisgICAgICogPGNvZGU+Y2VydFBhdGg8L2NvZGU+IG5vdCBudWxsIDxjb2RlPmluZGV4PC9jb2RlPjwKKyAgICAgKiBjZXJ0UGF0aC5nZXRDZXJ0aWZpY2F0ZXMoKS5zaXplKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24xNCgpIHsKKyAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gdEU7CisgICAgICAgIG15Q2VydFBhdGggbWNwID0gbmV3IG15Q2VydFBhdGgoIlguNTA5IiwgIiIpOworICAgICAgICBDZXJ0UGF0aCBjcCA9IG1jcC5nZXQoIlguNTA5Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihtc2dzW2ldLCB0Q2F1c2UsIGNwLCAtMSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRvUyA9IHRDYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChtc2dzW2ldLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgbXVzdCBjb250YWluICIuY29uY2F0KG1zZ3NbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE0uaW5kZXhPZihtc2dzW2ldKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0TS5lcXVhbHMobXNnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNLmluZGV4T2YodG9TKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwgdEUuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRDZXJ0UGF0aCgpIG11c3Qgbm90IHJldHVybiBudWxsIiwgdEUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDZXJ0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0Q2VydFBhdGgoKSBtdXN0IHJldHVybiAiLmNvbmNhdChjcC50b1N0cmluZygpKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENlcnRQYXRoKCksIGNwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEluZGV4KCkgbXVzdCByZXR1cm4gLTEiLCB0RS5nZXRJbmRleCgpLCAtMSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3YXMgdGhyb3duLiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0Q2VydFBhdGgoKTwvY29kZT4uIFJldHVybnMgdGhlIGNlcnRpZmljYXRpb24gcGF0aAorICAgICAqIHRoYXQgd2FzIGJlaW5nIHZhbGlkYXRlZCB3aGVuIHRoZSBleGNlcHRpb24gd2FzIHRocm93bi4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRDZXJ0UGF0aCBtZXRob2QgcmV0dXJucyB0aGUgY2VydGlmaWNhdGlvbiBwYXRoIiArIAorICAgICAgICAgICAgInRoYXQgd2FzIGJlaW5nIHZhbGlkYXRlZCB3aGVuIHRoZSBleGNlcHRpb24gd2FzIHRocm93bi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjE1KCkgeworICAgICAgICBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDZXJ0UGF0aCgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0Q2VydFBhdGgoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENlcnRQYXRoKCkgbXVzdCByZXR1cm4gbnVsbCAiLCB0RS5nZXRDZXJ0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CisgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2VydFBhdGgoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldENlcnRQYXRoKCkpOworCisgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKHRDYXVzZSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENlcnRQYXRoKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRDZXJ0UGF0aCgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDZXJ0UGF0aCgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDZXJ0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG51bGwsIG51bGwsIG51bGwsIC0xKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2VydFBhdGgoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2VydFBhdGgoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSwgbnVsbCwgLTEpOworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoImdldENlcnRQYXRoKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENlcnRQYXRoKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBteUNlcnRQYXRoIG1jcCA9IG5ldyBteUNlcnRQYXRoKCJYLjUwOSIsICIiKTsKKyAgICAgICAgQ2VydFBhdGggY3AgPSBtY3AuZ2V0KCJYLjUwOSIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdEUgPSBuZXcgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24obXNnc1tpXSwgdENhdXNlLCBjcCwgLTEpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldENlcnRQYXRoKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENlcnRQYXRoKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRDZXJ0UGF0aCgpIG11c3QgcmV0dXJuICIuY29uY2F0KGNwLnRvU3RyaW5nKCkpLCB0RQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2VydFBhdGgoKSwgY3ApOworICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdhcyB0aHJvd24uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluZGV4KCk8L2NvZGU+LiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2VydGlmaWNhdGUKKyAgICAgKiBpbiB0aGUgY2VydGlmaWNhdGlvbiBwYXRoIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24gdG8gYmUgdGhyb3duLiBOb3RlCisgICAgICogdGhhdCB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgaW4gYSBDZXJ0UGF0aCBpcyB6ZXJvIGJhc2VkLiBJZiBubyBpbmRleAorICAgICAqIGhhcyBiZWVuIHNldCwgLTEgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uMTYoKSB7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0SW5kZXgoKSBtdXN0IGJlIGVxdWFscyAtMSIsIC0xLCB0RS5nZXRJbmRleCgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRJbmRleCgpIG11c3QgYmUgZXF1YWxzIC0xIiwgLTEsIHRFLmdldEluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKKyAgICAgICAgdEUgPSBuZXcgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24oY2F1c2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldEluZGV4KCkgbXVzdCBiZSBlcXVhbHMgLTEiLCAtMSwgdEUuZ2V0SW5kZXgoKSk7CisKKyAgICAgICAgdEUgPSBuZXcgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24odENhdXNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRJbmRleCgpIG11c3QgYmUgZXF1YWxzIC0xIiwgLTEsIHRFLmdldEluZGV4KCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24obXNnc1tpXSwgdENhdXNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0SW5kZXgoKSBtdXN0IGJlIGVxdWFscyAtMSIsIC0xLCB0RS5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRFID0gbmV3IENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uKG51bGwsIG51bGwsIG51bGwsIC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRJbmRleCgpIG11c3QgYmUgZXF1YWxzIC0xIiwgLTEsIHRFLmdldEluZGV4KCkpOworCisgICAgICAgIG15Q2VydFBhdGggbWNwID0gbmV3IG15Q2VydFBhdGgoIlguNTA5IiwgIiIpOworICAgICAgICBDZXJ0UGF0aCBjcCA9IG1jcC5nZXQoIlguNTA5Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbihtc2dzW2ldLCB0Q2F1c2UsIGNwLCAtMSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0SW5kZXgoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2VydFBhdGgoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgImdldEluZGV4KCkgbXVzdCByZXR1cm4gIi5jb25jYXQoY3AudG9TdHJpbmcoKSksIHRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDZXJ0UGF0aCgpLCBjcCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2FzIHRocm93bi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBteUNlcnRQYXRoIGV4dGVuZHMgQ2VydFBhdGggeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU4NzE2MDMwNDcyNDQ3MjI1MTFMOworCisgICAgICAgIHB1YmxpYyBMaXN0PENlcnRpZmljYXRlPiBnZXRDZXJ0aWZpY2F0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjxDZXJ0aWZpY2F0ZT4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZChTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0RW5jb2RpbmdzKCkgeworICAgICAgICAgICAgcmV0dXJuIChJdGVyYXRvcjxTdHJpbmc+KSAobmV3IFN0cmluZ1Rva2VuaXplcigic3Mgc3Mgc3Mgc3MiKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgbXlDZXJ0UGF0aChTdHJpbmcgcykgeworICAgICAgICAgICAgc3VwZXIocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2VydFBhdGggZ2V0KFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IG15Q2VydFBhdGgocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbXlDZXJ0UGF0aChTdHJpbmcgcywgU3RyaW5nIHMxKSB7CisgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgfQorCisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclNwaVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclNwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg3YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yU3BpVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yU3BpOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoVmFsaWRhdG9yU3BpOworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+Q2VydFBhdGhWYWxpZGF0b3JTcGk8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRQYXRoVmFsaWRhdG9yU3BpLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRQYXRoVmFsaWRhdG9yU3BpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0UGF0aFZhbGlkYXRvclNwaVRlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydFBhdGhWYWxpZGF0b3JTcGlUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRQYXRoVmFsaWRhdG9yU3BpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBDZXJ0UGF0aFZhbGlkYXRvclNwaQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkp1c3QgZXhjZXB0aW9uIGNhc2VzIHdlcmUgdGVzdGVkIGZvciBlbmdpbmVWYWxpZGF0ZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRQYXRoVmFsaWRhdG9yU3BpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVWYWxpZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGguY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnMuY2xhc3N9CisgICAgICAgICkKKworICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRQYXRoVmFsaWRhdG9yU3BpMDEoKSB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQ2VydFBhdGhWYWxpZGF0b3JTcGkgY2VydFBhdGhWYWxpZCA9IG5ldyBNeUNlcnRQYXRoVmFsaWRhdG9yU3BpKCk7CisgICAgICAgIENlcnRQYXRoUGFyYW1ldGVycyBwYXJhbXMgPSBudWxsOworICAgICAgICBDZXJ0UGF0aCBjZXJ0UGF0aCA9IG51bGw7CisgICAgICAgIENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IGNwdlJlc3VsdCA9IGNlcnRQYXRoVmFsaWQuZW5naW5lVmFsaWRhdGUoCisgICAgICAgICAgICAgICAgY2VydFBhdGgsIHBhcmFtcyk7CisgICAgICAgIGFzc2VydE51bGwoIk5vdCBudWxsIENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IiwgY3B2UmVzdWx0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRQYXRoVmFsaWQuZW5naW5lVmFsaWRhdGUoY2VydFBhdGgsIHBhcmFtcyk7CisgICAgICAgICAgICBmYWlsKCJDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiBlKSB7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRQYXRoVmFsaWQuZW5naW5lVmFsaWRhdGUoY2VydFBhdGgsIHBhcmFtcyk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZTFUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDM1ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZTFUZXN0LmphdmEKQEAgLTAsMCArMSw2NzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlU3BpOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuTERBUENlcnRTdG9yZVBhcmFtZXRlcnM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydFN0b3JlUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydFN0b3JlU3BpOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlNwaUVuZ1V0aWxzOworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5DZXJ0U3RvcmU8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQKKyAqIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0U3RvcmUuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydFN0b3JlMVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydFN0b3JlVGVzdHMuCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydFN0b3JlMVRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNydkNlcnRTdG9yZSA9ICJDZXJ0U3RvcmUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRUeXBlID0gIkxEQVAiOyAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gdmFsaWRWYWx1ZXMgPSAgeworICAgICAgICAgICAgIkxEQVAiLCAibGRhcCIsICJMZGFwIiwgImxEQVAiLCAibERhUCIgfTsKKyAgICBwdWJsaWMgc3RhdGljICBTdHJpbmcgW10gdmFsaWRWYWx1ZXNDID0gbnVsbDsKKyAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFtdIGludmFsaWRWYWx1ZXMgPSBTcGlFbmdVdGlscy5pbnZhbGlkVmFsdWVzOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gTERBUFN1cHBvcnQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ29sbGVjdGlvblR5cGUgPSAiQ29sbGVjdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBDb2xsZWN0aW9uU3VwcG9ydCA9IGZhbHNlOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIFByb3ZpZGVyIGRlZmF1bHRQcm92aWRlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFByb3ZpZGVyTmFtZTsKKyAgICBwcml2YXRlIHN0YXRpYyBQcm92aWRlciBkZWZhdWx0UHJvdmlkZXJDb2w7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRQcm92aWRlckNvbE5hbWU7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5vdFN1cHBvcnRNc2cgPSAiIjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGRlZmF1bHRQcm92aWRlciA9IFNwaUVuZ1V0aWxzLmlzU3VwcG9ydChkZWZhdWx0VHlwZSwKKyAgICAgICAgICAgICAgICBzcnZDZXJ0U3RvcmUpOworICAgICAgICBMREFQU3VwcG9ydCA9IChkZWZhdWx0UHJvdmlkZXIgIT0gbnVsbCk7CisgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUgPSAoTERBUFN1cHBvcnQgPyBkZWZhdWx0UHJvdmlkZXIuZ2V0TmFtZSgpIDogbnVsbCk7CisgICAgICAgIE5vdFN1cHBvcnRNc2cgPSAiTERBUCBhbmQgQ29sbGVjdGlvbiBhbGdvcml0aG0gYXJlIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyQ29sID0gU3BpRW5nVXRpbHMuaXNTdXBwb3J0KENvbGxlY3Rpb25UeXBlLAorICAgICAgICAgICAgICAgIHNydkNlcnRTdG9yZSk7CisgICAgICAgIENvbGxlY3Rpb25TdXBwb3J0ID0gKGRlZmF1bHRQcm92aWRlckNvbCAhPSBudWxsKTsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyQ29sTmFtZSA9IChDb2xsZWN0aW9uU3VwcG9ydCA/IGRlZmF1bHRQcm92aWRlckNvbC5nZXROYW1lKCkgOiBudWxsKTsKKyAgICAgICAgaWYgKENvbGxlY3Rpb25TdXBwb3J0KSB7CisgICAgICAgICAgICB2YWxpZFZhbHVlc0MgPSBuZXcgU3RyaW5nWzNdOworICAgICAgICAgICAgdmFsaWRWYWx1ZXNDWzBdID0gQ29sbGVjdGlvblR5cGU7CisgICAgICAgICAgICB2YWxpZFZhbHVlc0NbMV0gPSBDb2xsZWN0aW9uVHlwZS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgdmFsaWRWYWx1ZXNDWzJdID0gQ29sbGVjdGlvblR5cGUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFByb3ZpZGVyIGRQcm92ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBkTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZFR5cGUgPSBudWxsOworICAgIHByaXZhdGUgQ2VydFN0b3JlUGFyYW1ldGVycyBkUGFyYW1zID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZ1tdIGRWYWxpZDsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdFBhcmFtcygpIHsKKyAgICAgICAgaWYgKCFMREFQU3VwcG9ydCAmJiAhQ29sbGVjdGlvblN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gCisgICAgICAgIGRQYXJhbXMgPSAoQ29sbGVjdGlvblN1cHBvcnQgPyAoQ2VydFN0b3JlUGFyYW1ldGVycyluZXcgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMoKSA6CisgICAgICAgICAgICAoQ2VydFN0b3JlUGFyYW1ldGVycyluZXcgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMoKSk7CisgICAgICAgIGRUeXBlID0gKENvbGxlY3Rpb25TdXBwb3J0ID8gQ29sbGVjdGlvblR5cGUgOiBkZWZhdWx0VHlwZSApOworICAgICAgICBkUHJvdiA9IChDb2xsZWN0aW9uU3VwcG9ydCA/IGRlZmF1bHRQcm92aWRlckNvbCA6IGRlZmF1bHRQcm92aWRlciApOworICAgICAgICBkTmFtZSA9IChDb2xsZWN0aW9uU3VwcG9ydCA/IGRlZmF1bHRQcm92aWRlckNvbE5hbWUgOiBkZWZhdWx0UHJvdmlkZXJOYW1lICk7CisgICAgICAgIGRWYWxpZCA9IChDb2xsZWN0aW9uU3VwcG9ydCA/IHZhbGlkVmFsdWVzQyA6IHZhbGlkVmFsdWVzICk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwcml2YXRlIENlcnRTdG9yZSBbXSBjcmVhdGVDUygpIHsKKyAgICAgICAgaWYgKCFMREFQU3VwcG9ydCAmJiAhQ29sbGVjdGlvblN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFN0b3JlIFtdIHNzID0gbmV3IENlcnRTdG9yZVszXTsKKyAgICAgICAgICAgIHNzWzBdID0gQ2VydFN0b3JlLmdldEluc3RhbmNlKGRUeXBlLCBkUGFyYW1zKTsKKyAgICAgICAgICAgIHNzWzFdID0gQ2VydFN0b3JlLmdldEluc3RhbmNlKGRUeXBlLCBkUGFyYW1zLCBkUHJvdik7CisgICAgICAgICAgICBzc1syXSA9IENlcnRTdG9yZS5nZXRJbnN0YW5jZShkVHlwZSwgZFBhcmFtcywgZE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHNzOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXREZWZhdWx0VHlwZSgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgc2VjdXJpdHkgcHJvcGVydHkgImNlcnRzdG9yZS50eXBlIiBvciAiTERBUCIKKyAgICAgKi8gICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMDEoKSB7CisgICAgICAgIGlmICghTERBUFN1cHBvcnQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZHQgPSBDZXJ0U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIHNuID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoImNlcnRzdG9yZS50eXBlIik7CisgICAgICAgIFN0cmluZyBkZWYgPSAiUHJvYmEuY2VydC5zdG9yZS50eXBlIjsKKyAgICAgICAgaWYgKHNuID09IG51bGwpIHsKKyAgICAgICAgICAgIHNuID0gZGVmYXVsdFR5cGU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRGVmYXVsdCB0eXBlIGhhdmUgbm90IGJlIG51bGwiLCBkdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRlZmF1bHQgdHlwZSIsIGR0LCBzbik7CisgICAgICAgIAorICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgiY2VydHN0b3JlLnR5cGUiLCBkZWYpOworICAgICAgICBkdCA9IENlcnRTdG9yZS5nZXREZWZhdWx0VHlwZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkZWZhdWx0IHR5cGUiLCBkdCwgZGVmKTsKKyAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkoImNlcnRzdG9yZS50eXBlIiwgc24pOyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRlZmF1bHQgdHlwZSIsIFNlY3VyaXR5LmdldFByb3BlcnR5KCJjZXJ0c3RvcmUudHlwZSIpLCBzbiApOworICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciAKKyAgICAgKiA8Y29kZT5DZXJ0U3RvcmU8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENlcnRTdG9yZSBvYmplY3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFN0b3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVTcGkuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMDIoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwgQ2VydFN0b3JlRXhjZXB0aW9uIHsgICAgICAgIAorICAgICAgICBpZiAoIWluaXRQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE15Q2VydFN0b3JlUGFyYW1ldGVycyBwcCA9IG5ldyBNeUNlcnRTdG9yZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgQ2VydFN0b3JlU3BpIHNwaSA9IG5ldyBNeUNlcnRTdG9yZVNwaShwcCk7CisgICAgICAgIENlcnRTdG9yZSBjZXJ0UyA9IG5ldyBteUNlcnRTdG9yZShzcGksIGRQcm92LCBkVHlwZSwgcHApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLCBjZXJ0Uy5nZXRUeXBlKCksIGRUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJ0Uy5nZXRQcm92aWRlcigpLCBkUHJvdik7IAorICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgcGFyYW1ldGVycyIsIGNlcnRTLmdldENlcnRTdG9yZVBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgIGluc3RhbmNlb2YgTXlDZXJ0U3RvcmVQYXJhbWV0ZXJzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRTLmdldENlcnRpZmljYXRlcyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRTdG9yZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0U3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGNlcnRTID0gbmV3IG15Q2VydFN0b3JlKG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwgY2VydFMuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY2VydFMuZ2V0UHJvdmlkZXIoKSk7IAorICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgcGFyYW1ldGVycyIsIGNlcnRTLmdldENlcnRTdG9yZVBhcmFtZXRlcnMoKSk7ICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0Uy5nZXRDZXJ0aWZpY2F0ZXMobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsIENlcnRTdG9yZVBhcmFtZXRlcnMgcGFyYW1zKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiAKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiB0eXBlIGlzIG51bGwKKyAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gdHlwZSBpcyBpbmNvcnJlY3Q7IAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhbmQgTnVsbFBvaW50ZXJFeGNlcHRpb24uICIgKworICAgICAgICAgICAgICAgICAgIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVBhcmFtZXRlcnMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0U3RvcmUwMygpIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0UGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAKKyAgICAgICAgdHJ5IHsgICAgICAgICAgICAKKyAgICAgICAgICAgIENlcnRTdG9yZS5nZXRJbnN0YW5jZShudWxsLCBkUGFyYW1zKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHR5cGUgaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrICkgeyAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydFN0b3JlLmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIGRQYXJhbXMpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBDZXJ0U3RvcmVQYXJhbWV0ZXJzIHBhcmFtcyk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJuIENlcnRTdG9yZSBvYmplY3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMDUoKSAKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IAorICAgICAgICBDZXJ0U3RvcmUgY2VydFM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZFZhbGlkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJ0UyA9IENlcnRTdG9yZS5nZXRJbnN0YW5jZShkVmFsaWRbaV0sIGRQYXJhbXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNlcnRTLmdldFR5cGUoKSwgZFZhbGlkW2ldKTsKKyAgICAgICAgICAgIGNlcnRTLmdldENlcnRTdG9yZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBtZXRob2QKKyAgICAgKiA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgdHlwZSwgQ2VydFN0b3JlUGFyYW1ldGVycyBwYXJhbXMsIFN0cmluZyBwcm92aWRlcik8L2NvZGU+CisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eQorICAgICAqIAorICAgICAqIEZJWE1FOiB2ZXJpZnkgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgZW1wdHkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uICIgKworICAgICAgICAgICAgICAgICAgIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMDYoKSAKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IAorICAgICAgICBTdHJpbmcgcHJvdmlkZXIgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRWYWxpZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoZFZhbGlkW2ldLCBkUGFyYW1zLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoZFZhbGlkW2ldLCBkUGFyYW1zLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIG1ldGhvZAorICAgICAqIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBDZXJ0U3RvcmVQYXJhbWV0ZXJzIHBhcmFtcywgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGhhcyBpbnZhbGlkIHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24uICIgKworICAgICAgICAgICAgICAgICAgIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMDcoKSAKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRWYWxpZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaisrICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENlcnRTdG9yZS5nZXRJbnN0YW5jZShkVmFsaWRbaV0sIGRQYXJhbXMsIGludmFsaWRWYWx1ZXNbal0pOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdCBmb3IgbWV0aG9kIAorICAgICAqIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBDZXJ0U3RvcmVQYXJhbWV0ZXJzIHBhcmFtcywgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHR5cGUgaXMgbnVsbAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiB0eXBlIGlzIGluY29ycmVjdDsgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFuZCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gIiArCisgICAgICAgICAgICAgICAgICAiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVBhcmFtZXRlcnMuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0U3RvcmUwOCgpIAorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaW5pdFBhcmFtcygpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZFBhcmFtcywgZE5hbWUpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UobnVsbCwgZFBhcmFtcywgZE5hbWUpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gdHlwZSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBtZXRob2QKKyAgICAgKiA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgdHlwZSwgQ2VydFN0b3JlUGFyYW1ldGVycyBwYXJhbXMsIFN0cmluZyBwcm92aWRlcik8L2NvZGU+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm4gQ2VydFN0b3JlIG9iamVjdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuICIgKworICAgICAgICAgICAgICAgICAgIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMTAoKSAKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0UGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAKKyAgICAgICAgQ2VydFN0b3JlIGNlcnRTOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRWYWxpZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2VydFMgPSBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoZFZhbGlkW2ldLCBkUGFyYW1zLCBkTmFtZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VydFMuZ2V0VHlwZSgpLCBkVmFsaWRbaV0pOworICAgICAgICAgICAgY2VydFMuZ2V0Q2VydFN0b3JlUGFyYW1ldGVycygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgbWV0aG9kCisgICAgICogPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsIENlcnRTdG9yZVBhcmFtZXRlcnMgcGFyYW1zLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0SW5zdGFuY2UgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAiICsKKyAgICAgICAgICAgICJ3aGVuIHByb3ZpZGVyIGlzIG51bGwuIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMTEoKSAKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IAorICAgICAgICBQcm92aWRlciBwcm92aWRlciA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZFZhbGlkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgICAgICBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoZFZhbGlkW2ldLCBkUGFyYW1zLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBDZXJ0U3RvcmVQYXJhbWV0ZXJzIHBhcmFtcywgUHJvdmlkZXIgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHR5cGUgaXMgbnVsbAorICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiB0eXBlIGlzIGluY29ycmVjdDsgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24gYW5kIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbi4gIiArCisgICAgICAgICAgICAgICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVycy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRTdG9yZTEyKCkgCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IAorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFN0b3JlLmdldEluc3RhbmNlKG51bGwsIGRQYXJhbXMsIGRQcm92KTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHR5cGUgaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgZFBhcmFtcywgZFByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIG1ldGhvZCAKKyAgICAgKiA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgdHlwZSwgQ2VydFN0b3JlUGFyYW1ldGVycyBwYXJhbXMsIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybiBDZXJ0U3RvcmUgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZS4gIiArCisgICAgICAgICAgICAgICJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVycy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRTdG9yZTE0KCkgCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0UGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAKKyAgICAgICAgQ2VydFN0b3JlIGNlcnRTOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRWYWxpZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2VydFMgPSBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoZFZhbGlkW2ldLCBkUGFyYW1zLCBkUHJvdik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VydFMuZ2V0VHlwZSgpLCBkVmFsaWRbaV0pOworICAgICAgICAgICAgY2VydFMuZ2V0Q2VydFN0b3JlUGFyYW1ldGVycygpOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIG1ldGhvZHMgCisgICAgICogPGNvZGU+Z2V0Q2VydGlmaWNhdGVzKENlcnRTZWxlY3RvciBzZWxlY3Rvcik8L2NvZGU+IAorICAgICAqIDxjb2RlPmdldENSTHMoQ1JMU2VsZWN0b3Igc2VsZWN0b3IpPC9jb2RlPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBlbXB0eSBDb2xsZWN0aW9uIHdoZW4gc2VsZWN0b3IgaXMgbnVsbCAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHRoZXNlIG1ldGhvZHMgcmV0dXJuIGVtcHR5IENvbGxlY3Rpb24gIiArCisgICAgICAgICAgICAid2hlbiBzZWxlY3RvciBpcyBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENlcnRpZmljYXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENSTHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LkNSTFNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlMTUoKSAKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgIENlcnRTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaW5pdFBhcmFtcygpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gCisgICAgICAgIENlcnRTdG9yZSBbXSBjZXJ0UyA9IGNyZWF0ZUNTKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNlcnRTdG9yZSBvYmplY3Qgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRTKTsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNlcnRTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2xsID0gY2VydFNbaV0uZ2V0Q2VydGlmaWNhdGVzKG51bGwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGNvbGxlY3Rpb24gbm90IGVtcHR5Iixjb2xsLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBjb2xsID0gY2VydFNbaV0uZ2V0Q1JMcyhudWxsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBjb2xsZWN0aW9uIG5vdCBlbXB0eSIsY29sbC5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0VHlwZSgpPC9jb2RlPiBtZXRob2QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIGFuZCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RDZXJ0U3RvcmUxNigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0UGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENlcnRTdG9yZSBjZXJ0UzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkVmFsaWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlcnRTID0gQ2VydFN0b3JlLmdldEluc3RhbmNlKGRWYWxpZFtpXSwgZFBhcmFtcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VydFMuZ2V0VHlwZSgpLCBkVmFsaWRbaV0pOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRTID0gQ2VydFN0b3JlLmdldEluc3RhbmNlKGRWYWxpZFtpXSwgZFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNlcnRTLmdldFR5cGUoKSwgZFZhbGlkW2ldKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZXJ0UyA9IENlcnRTdG9yZS5nZXRJbnN0YW5jZShkVmFsaWRbaV0sIGRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlIiwgY2VydFMuZ2V0VHlwZSgpLCBkVmFsaWRbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQcm92aWRlcigpPC9jb2RlPiBtZXRob2QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIGFuZCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVycy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RDZXJ0U3RvcmUxNygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0UGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENlcnRTdG9yZSBjZXJ0UzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkVmFsaWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2VydFMgPSBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoZFZhbGlkW2ldLCBkUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGNlcnRTLmdldFByb3ZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRTID0gQ2VydFN0b3JlLmdldEluc3RhbmNlKGRWYWxpZFtpXSwgZFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwgY2VydFMuZ2V0UHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KK30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRDZXJ0U3RvcmVQYXJhbWV0ZXJzKCk8L2NvZGU+IG1ldGhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDZXJ0U3RvcmVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RDZXJ0U3RvcmUxOCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0UGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENlcnRTdG9yZSBjZXJ0UzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkVmFsaWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlcnRTID0gQ2VydFN0b3JlLmdldEluc3RhbmNlKGRWYWxpZFtpXSwgZFBhcmFtcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgKChDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycykgY2VydFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2VydFN0b3JlUGFyYW1ldGVycygpKS5nZXRDb2xsZWN0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICgoQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMpIGRQYXJhbXMpLmdldENvbGxlY3Rpb24oKSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2VydFMgPSBDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoZFZhbGlkW2ldLCBkUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMpIGNlcnRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDZXJ0U3RvcmVQYXJhbWV0ZXJzKCkpLmdldENvbGxlY3Rpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMpIGRQYXJhbXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2xsZWN0aW9uKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRTID0gQ2VydFN0b3JlLmdldEluc3RhbmNlKGRWYWxpZFtpXSwgZFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKChDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycykgY2VydFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENlcnRTdG9yZVBhcmFtZXRlcnMoKSkuZ2V0Q29sbGVjdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgKChDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycykgZFBhcmFtcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbGxlY3Rpb24oKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBBZGRpdGlvbmFsIGNsYXNzIHRvIHZlcmlmeSBDZXJ0U3RvcmUgY29uc3RydWN0b3IKKyAqLworY2xhc3MgbXlDZXJ0U3RvcmUgZXh0ZW5kcyBDZXJ0U3RvcmUgeworICAgIHB1YmxpYyBteUNlcnRTdG9yZShDZXJ0U3RvcmVTcGkgc3BpLCBQcm92aWRlciBwcm92LCBTdHJpbmcgdHlwZSwgQ2VydFN0b3JlUGFyYW1ldGVycyBwYXJhbXMpIHsKKyAgICAgICAgc3VwZXIoc3BpLCBwcm92LCB0eXBlLCBwYXJhbXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGUxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVFeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkNlcnRTdG9yZUV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydFN0b3JlRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRTdG9yZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRTdG9yZUV4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIENlcnRTdG9yZUV4Y2VwdGlvblRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSIgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFN0b3JlRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKKyAgICAgKiBjb25zdHJ1Y3RzIENlcnRTdG9yZUV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0U3RvcmVFeGNlcHRpb24wMSgpIHsKKyAgICAgICAgQ2VydFN0b3JlRXhjZXB0aW9uIHRFID0gbmV3IENlcnRTdG9yZUV4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0U3RvcmVFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgorICAgICAqIGNvbnN0cnVjdHMgQ2VydFN0b3JlRXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UgbXNnLiBQYXJhbWV0ZXIKKyAgICAgKiA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlRXhjZXB0aW9uMDIoKSB7CisgICAgICAgIENlcnRTdG9yZUV4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0U3RvcmVFeGNlcHRpb24obXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0U3RvcmVFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOgorICAgICAqIGNvbnN0cnVjdHMgQ2VydFN0b3JlRXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhc2EgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBDZXJ0U3RvcmVFeGNlcHRpb24gdEUgPSBuZXcgQ2VydFN0b3JlRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRTdG9yZUV4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0U3RvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMKKyAgICAgKiBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0U3RvcmVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRTdG9yZUV4Y2VwdGlvbjA0KCkgeworICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOworICAgICAgICBDZXJ0U3RvcmVFeGNlcHRpb24gdEUgPSBuZXcgQ2VydFN0b3JlRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFN0b3JlRXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRTdG9yZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QKKyAgICAgKiBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0U3RvcmVFeGNlcHRpb24wNSgpIHsKKyAgICAgICAgQ2VydFN0b3JlRXhjZXB0aW9uIHRFID0gbmV3IENlcnRTdG9yZUV4Y2VwdGlvbih0Q2F1c2UpOworICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBnZXRNID0gdEUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWVzc2FnZSgpIHNob3VsZCBjb250YWluICIuY29uY2F0KHRvUyksIChnZXRNCisgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRDYXVzZSgpIG11c3Qgbm90IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksIHRFCisgICAgICAgICAgICAgICAgLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFN0b3JlRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFN0b3JlRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzCisgICAgICogbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0U3RvcmVFeGNlcHRpb24wNigpIHsKKyAgICAgICAgQ2VydFN0b3JlRXhjZXB0aW9uIHRFID0gbmV3IENlcnRTdG9yZUV4Y2VwdGlvbihudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0U3RvcmVFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0U3RvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMKKyAgICAgKiBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydFN0b3JlRXhjZXB0aW9uMDcoKSB7CisgICAgICAgIENlcnRTdG9yZUV4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0U3RvcmVFeGNlcHRpb24obXNnc1tpXSwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0U3RvcmVFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0U3RvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90CisgICAgICogbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0U3RvcmVFeGNlcHRpb24wOCgpIHsKKyAgICAgICAgQ2VydFN0b3JlRXhjZXB0aW9uIHRFID0gbmV3IENlcnRTdG9yZUV4Y2VwdGlvbihudWxsLCB0Q2F1c2UpOworICAgICAgICBpZiAodEUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBnZXRNID0gdEUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWVzc2FnZSgpIG11c3Qgc2hvdWxkICIuY29uY2F0KHRvUyksIChnZXRNCisgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRDYXVzZSgpIG11c3Qgbm90IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksIHRFCisgICAgICAgICAgICAgICAgLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydFN0b3JlRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydFN0b3JlRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdAorICAgICAqIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFN0b3JlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0U3RvcmVFeGNlcHRpb24wOSgpIHsKKyAgICAgICAgQ2VydFN0b3JlRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRTdG9yZUV4Y2VwdGlvbihtc2dzW2ldLCB0Q2F1c2UpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAobXNnc1tpXS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgbXVzdCBjb250YWluICIuY29uY2F0KG1zZ3NbaV0pLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihtc2dzW2ldKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRNLmVxdWFscyhtc2dzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgc2hvdWxkIGNvbnRhaW4gIi5jb25jYXQodG9TKSwgZ2V0TQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHRvUykgIT0gLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiAiLmNvbmNhdCh0Q2F1c2UudG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIHRFLmdldENhdXNlKCksIHRDYXVzZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlU3BpVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZVNwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRkMDUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZVNwaVRlc3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTFNlbGVjdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlU3BpOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0U3RvcmVQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0U3RvcmVTcGk7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkNlcnRTdG9yZVNwaTwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydFN0b3JlU3BpLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRTdG9yZVNwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydFN0b3JlU3BpVGVzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBDZXJ0U3RvcmVTcGlUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRTdG9yZVNwaTwvY29kZT4gY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzCisgICAgICogQ2VydFN0b3JlU3BpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRTdG9yZVNwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVycy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVHZXRDZXJ0aWZpY2F0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTZWxlY3Rvci5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlbmdpbmVHZXRDUkxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DUkxTZWxlY3Rvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRTdG9yZVNwaTAxKCkgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCisgICAgICAgICAgICBDZXJ0U3RvcmVFeGNlcHRpb24geworICAgICAgICBDZXJ0U3RvcmVTcGkgY2VydFN0b3JlU3BpID0gbnVsbDsKKyAgICAgICAgQ2VydFNlbGVjdG9yIGNlcnRTZWxlY3RvciA9IG5ldyB0bXBDZXJ0U2VsZWN0b3IoKTsvL25ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFg1MDlDZXJ0U2VsZWN0b3IoKTsKKyAgICAgICAgQ1JMU2VsZWN0b3IgY3JsU2VsZWN0b3IgPSBuZXcgdG1wQ1JMU2VsZWN0b3IoKTsvL25ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRTdG9yZVNwaSA9IG5ldyBNeUNlcnRTdG9yZVNwaShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgY2VydFN0b3JlU3BpID0gbmV3IE15Q2VydFN0b3JlU3BpKG5ldyBNeUNlcnRTdG9yZVBhcmFtZXRlcnMoKSk7CisgICAgICAgIGFzc2VydE51bGwoIk5vdCBudWxsIGNvbGxlY3Rpb24iLCBjZXJ0U3RvcmVTcGkKKyAgICAgICAgICAgICAgICAuZW5naW5lR2V0Q2VydGlmaWNhdGVzKGNlcnRTZWxlY3RvcikpOworICAgICAgICBhc3NlcnROdWxsKCJOb3QgbnVsbCBjb2xsZWN0aW9uIiwgY2VydFN0b3JlU3BpCisgICAgICAgICAgICAgICAgLmVuZ2luZUdldENSTHMoY3JsU2VsZWN0b3IpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDZXJ0U3RvcmVTcGlUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIEFkZGl0aW9uYWwgY2xhc3NlcyBmb3IgdmVyaWZpY2F0aW9uIENlcnRTdG9yZVNwaSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgdG1wQ1JMU2VsZWN0b3IgaW1wbGVtZW50cyBDUkxTZWxlY3RvciB7CisgICAgICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaCAoQ1JMIGNybCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgdG1wQ2VydFNlbGVjdG9yIGltcGxlbWVudHMgQ2VydFNlbGVjdG9yIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoIChDZXJ0aWZpY2F0ZSBjcmwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlQ2VydGlmaWNhdGVSZXBUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVDZXJ0aWZpY2F0ZVJlcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWVkMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlQ2VydGlmaWNhdGVSZXBUZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuYWNsLkFjbE5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuYWNsLk5vdE93bmVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRpZmljYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuVGVzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0aWZpY2F0ZS5NeUNlcnRpZmljYXRlUmVwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitAVGVzdFRhcmdldENsYXNzKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZS5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUNlcnRpZmljYXRlUmVwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSB0ZXN0RW5jb2RpbmcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDEsIChieXRlKSAyLAorICAgICAgICAgICAgKGJ5dGUpIDMsIChieXRlKSA0LCAoYnl0ZSkgNSB9OworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yCisgICAgICogPGNvZGU+Q2VydGlmaWNhdGUuQ2VydGlmaWNhdGVSZXAoU3RyaW5nIHR5cGUsIGJ5dGVbXSBkYXRhKTwvY29kZT4KKyAgICAgKiBtZXRob2Q8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDZXJ0aWZpY2F0ZVJlcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGJ5dGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUNlcnRpZmljYXRlUmVwKCkgeworICAgICAgICBNeUNlcnRpZmljYXRlIGMxID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1RfVFlQRSIsIHRlc3RFbmNvZGluZyk7CisgICAgICAgIE15Q2VydGlmaWNhdGVSZXAgcmVwID0gYzEubmV3IE15Q2VydGlmaWNhdGVSZXAoIlRFU1RfVFlQRSIsIG5ldyBieXRlW10geworICAgICAgICAgICAgICAgIChieXRlKSAxLCAoYnl0ZSkgMiwgKGJ5dGUpIDMgfSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10geyAoYnl0ZSkgMSwgKGJ5dGUpIDIsIChieXRlKSAzIH0sCisgICAgICAgICAgICAgICAgcmVwLmdldERhdGEoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRFU1RfVFlQRSIsIHJlcC5nZXRUeXBlKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjMS5uZXcgTXlDZXJ0aWZpY2F0ZVJlcChudWxsLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNeUNlcnRpZmljYXRlLk15Q2VydGlmaWNhdGVSZXAgcmVwMSA9IGMxLm5ldyBNeUNlcnRpZmljYXRlUmVwKAorICAgICAgICAgICAgICAgICAgICAiWDUwOSIsIFRlc3RVdGlscy5nZXRYNTA5Q2VydGlmaWNhdGVfdjMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlg1MDkiLCByZXAxLmdldFR5cGUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoVGVzdFV0aWxzLmdldFg1MDlDZXJ0aWZpY2F0ZV92MygpLCByZXAxLmdldERhdGEoKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGVwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+cmVhZFJlc29sdmUoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZVJlcC5yZWFkUmVzb2x2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSZWFkUmVzb2x2ZSgpIHsKKyAgICAgICAgTXlDZXJ0aWZpY2F0ZSBjMSA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworICAgICAgICBNeUNlcnRpZmljYXRlUmVwIHJlcCA9IGMxLm5ldyBNeUNlcnRpZmljYXRlUmVwKCJURVNUX1RZUEUiLCBuZXcgYnl0ZVtdIHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMSwgKGJ5dGUpIDIsIChieXRlKSAzIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXAucmVhZFJlc29sdmUoKTsKKyAgICAgICAgICAgIGZhaWwoIk9iamVjdFN0cmVhbUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChPYmplY3RTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIE15Q2VydGlmaWNhdGVSZXAgcmVwMSA9IGMxLm5ldyBNeUNlcnRpZmljYXRlUmVwKCJYNTA5IiwgVGVzdFV0aWxzCisgICAgICAgICAgICAgICAgLmdldFg1MDlDZXJ0aWZpY2F0ZV92MygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlIG9iaiA9IChDZXJ0aWZpY2F0ZSkgcmVwMS5yZWFkUmVzb2x2ZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIwLjMuNSIsIG9iai5nZXRQdWJsaWNLZXkoKS5nZXRBbGdvcml0aG0oKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlguNTA5Iiwgb2JqLmdldFB1YmxpY0tleSgpLmdldEZvcm1hdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWC41MDkiLCBvYmouZ2V0VHlwZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoT2JqZWN0U3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgT2JqZWN0U3RyZWFtRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViNjNjYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uMlRlc3QuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKiAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uMlRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uI0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0cnVlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbml0aWFsaXplciBmYWlsZWQgOiAiICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAiamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gZHVyaW5nIHRlc3QgOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNGI4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKKworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCisgKiBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UiIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgdENhdXNlID0gbmV3IFRocm93YWJsZSgiVGhyb3dhYmxlIGZvciBleGNlcHRpb24iKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjAxKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UKKyAgICAgKiBtc2cuIFBhcmFtZXRlciA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24wMigpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm46ICIuY29uY2F0KG1zZ3NbaV0pLCB0RQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPgorICAgICAqIGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24wMygpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihtc2cpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uMDQoKSB7CisgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CisgICAgICAgIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBjYXVzZSk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB3aGVuCisgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG5vdCBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjA1KCkgeworICAgICAgICBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdENhdXNlKTsKKyAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCAoZ2V0TQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZih0b1MpICE9IC0xKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldENhdXNlKCkgbXVzdCByZXR1cm4gIi5jb25jYXQodENhdXNlLnRvU3RyaW5nKCkpLCB0RQorICAgICAgICAgICAgICAgIC5nZXRDYXVzZSgpLCB0Q2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjA2KCkgeworICAgICAgICBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24wNygpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKG1zZ3NbaV0sIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm46ICIuY29uY2F0KG1zZ3NbaV0pLCB0RQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjA4KCkgeworICAgICAgICBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbnVsbCwgdENhdXNlKTsKKyAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IHNob3VsZCAiLmNvbmNhdCh0b1MpLCAoZ2V0TQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZih0b1MpICE9IC0xKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldENhdXNlKCkgbXVzdCByZXR1cm4gIi5jb25jYXQodENhdXNlLnRvU3RyaW5nKCkpLCB0RQorICAgICAgICAgICAgICAgIC5nZXRDYXVzZSgpLCB0Q2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24wOSgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChtc2dzW2ldLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IGNvbnRhaW4gIi5jb25jYXQobXNnc1tpXSksIGdldE0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKG1zZ3NbaV0pICE9IC0xKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdldE0uZXF1YWxzKG1zZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgdEUuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb24yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWJhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb24yVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydGlmaWNhdGVFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVFeGNlcHRpb24yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uI0NlcnRpZmljYXRlRXhjZXB0aW9uKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0cnVlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gQ2VydGlmaWNhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbml0aWFsaXplciBmYWlsZWQgOiAiICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAiamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbiNDZXJ0aWZpY2F0ZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwvZW1wdHkvaW52YWxpZCBwYXJhbWV0ZXJzIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kCisgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIlNvbWUgZXJyb3IgbWVzc2FnZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIENlcnRpZmljYXRlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5pdGlhbGl6ZXIgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgIlNvbWUgZXJyb3IgbWVzc2FnZSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyB0ZXN0IDogIiArIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWU1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworCisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkNlcnRpZmljYXRlRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUV4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIENlcnRpZmljYXRlRXhjZXB0aW9uVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UiIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgdENhdXNlID0gbmV3IFRocm93YWJsZSgiVGhyb3dhYmxlIGZvciBleGNlcHRpb24iKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yIEFzc2VydGlvbjoKKyAgICAgKiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24wMSgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZSBtc2cuCisgICAgICogUGFyYW1ldGVyIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRXhjZXB0aW9uMDIoKSB7CisgICAgICAgIENlcnRpZmljYXRlRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm46ICIuY29uY2F0KG1zZ3NbaV0pLCB0RQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFeGNlcHRpb24oU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2hlbiA8Y29kZT5tc2c8L2NvZGU+IGlzCisgICAgICogbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRXhjZXB0aW9uMDMoKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOworICAgICAgICBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbihtc2cpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPiBpcworICAgICAqIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUV4Y2VwdGlvbjA0KCkgeworICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOworICAgICAgICBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbihjYXVzZSk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRXhjZXB0aW9uKFRocm93YWJsZSk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRXhjZXB0aW9uIHdoZW4gPGNvZGU+Y2F1c2U8L2NvZGU+IGlzCisgICAgICogbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24wNSgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24odENhdXNlKTsKKyAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCAoZ2V0TQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZih0b1MpICE9IC0xKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldENhdXNlKCkgbXVzdCByZXR1cm4gIi5jb25jYXQodENhdXNlLnRvU3RyaW5nKCkpLCB0RQorICAgICAgICAgICAgICAgIC5nZXRDYXVzZSgpLCB0Q2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24wNigpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24obnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuCisgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgVGhyb3dhYmxlIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24wNygpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24obXNnc1tpXSwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgYXMgU3RyaW5nIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24wOCgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24obnVsbCwgdENhdXNlKTsKKyAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IHNob3VsZCAiLmNvbmNhdCh0b1MpLCAoZ2V0TQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZih0b1MpICE9IC0xKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldENhdXNlKCkgbXVzdCByZXR1cm4gIi5jb25jYXQodENhdXNlLnRvU3RyaW5nKCkpLCB0RQorICAgICAgICAgICAgICAgIC5nZXRDYXVzZSgpLCB0Q2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRXhjZXB0aW9uMDkoKSB7CisgICAgICAgIENlcnRpZmljYXRlRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChtc2dzW2ldLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IGNvbnRhaW4gIi5jb25jYXQobXNnc1tpXSksIGdldE0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKG1zZ3NbaV0pICE9IC0xKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdldE0uZXF1YWxzKG1zZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgdEUuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZWZlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247CisKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nW10gbXNncyA9IHsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSBDaGVjayBuZXcgbWVzc2FnZSIgfTsKKworICAgIHN0YXRpYyBUaHJvd2FibGUgdENhdXNlID0gbmV3IFRocm93YWJsZSgiVGhyb3dhYmxlIGZvciBleGNlcHRpb24iKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uMDEoKSB7CisgICAgICAgIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24oKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlCisgICAgICogbXNnLiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjAyKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm46ICIuY29uY2F0KG1zZ3NbaV0pLCB0RQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjAzKCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbihtc2cpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5MVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDBmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5MVRlc3QuamF2YQpAQCAtMCwwICsxLDkyOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGg7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnlTcGk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydGlmaWNhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0UGF0aFZhbGlkYXRvclNwaTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydGlmaWNhdGVGYWN0b3J5U3BpOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlNwaUVuZ1V0aWxzOworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUZhY3Rvcnk8L2NvZGU+IGNsYXNzIG1ldGhvZHMgYW5kIGNvbnN0cnVjdG9yCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUZhY3RvcnkuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVGYWN0b3J5MVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydGlmaWNhdGVGYWN0b3J5VGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVGYWN0b3J5MVRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3J2Q2VydGlmaWNhdGVGYWN0b3J5ID0gIkNlcnRpZmljYXRlRmFjdG9yeSI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRQcm92aWRlck5hbWUgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gWDUwOVN1cHBvcnQgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRUeXBlID0gIlguNTA5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdmFsaWRWYWx1ZXMgPSB7IAorICAgICAgICAgICAgIlguNTA5IiwgInguNTA5IiB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gaW52YWxpZFZhbHVlcyA9IFNwaUVuZ1V0aWxzLmludmFsaWRWYWx1ZXM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTm90U3VwcG9ydE1zZyA9ICIiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gU3BpRW5nVXRpbHMuaXNTdXBwb3J0KGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgIHNydkNlcnRpZmljYXRlRmFjdG9yeSk7CisgICAgICAgIFg1MDlTdXBwb3J0ID0gKGRlZmF1bHRQcm92aWRlciAhPSBudWxsKTsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSA9IChYNTA5U3VwcG9ydCA/IGRlZmF1bHRQcm92aWRlci5nZXROYW1lKCkgOiBudWxsKTsKKyAgICAgICAgTm90U3VwcG9ydE1zZyA9IGRlZmF1bHRUeXBlLmNvbmNhdCgiIGlzIG5vdCBzdXBwb3J0ZWQiKTsgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGVGYWN0b3J5W10gaW5pdENlcnRGcygpIHsKKyAgICAgICAgaWYgKCFYNTA5U3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnlbXSBjZXJ0RnMgPSBuZXcgQ2VydGlmaWNhdGVGYWN0b3J5WzNdOworICAgICAgICAgICAgY2VydEZzWzBdID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKGRlZmF1bHRUeXBlKTsKKyAgICAgICAgICAgIGNlcnRGc1sxXSA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShkZWZhdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICBjZXJ0RnNbMl0gPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoZGVmYXVsdFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICByZXR1cm4gY2VydEZzOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNeUNlcnRpZmljYXRlIGNyZWF0ZU1DKCkgeworICAgICAgICBieXRlW10gZW5jID0geyAoYnl0ZSkgMCwgKGJ5dGUpIDIsIChieXRlKSAzLCAoYnl0ZSkgNCwgKGJ5dGUpIDUgfTsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUNlcnRpZmljYXRlKCJUZXN0X1Rlc3QiLCBlbmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBDZXJ0aWZpY2F0ZUZhY3RvcnkgaWYgdHlwZSBpcyBYLjUwOQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUZhY3RvcnkwMSgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghWDUwOVN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RiA9IENlcnRpZmljYXRlRmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZTogIiwgdmFsaWRWYWx1ZXNbaV0sIGNlcnRGLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgdHlwZSk8L2NvZGU+IG1ldGhvZCAKKyAgICAgKiBBc3NlcnRpb246CisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdHlwZSBpcyBudWxsIAorICAgICAqIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIHR5cGUgaXMgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUZhY3RvcnkwMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIENlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gdHlwZSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGludmFsaWRWYWx1ZXNbaV0pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsIG9yIGVtcHR5CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiAiICsKKyAgICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgY2hlY2tlZCBpbnN0ZWFkIG9mIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRmFjdG9yeTAzKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIVg1MDlTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwcm92aWRlciA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBtdXN0IGJlIHRocm93biB3aGVuIHByb3ZpZGVyIGlzIGVtcHR5Iik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogCisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdHlwZSBpcyBudWxsIAorICAgICAqIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIHR5cGUgaXMgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENlcnRpZmljYXRlRXhjZXB0aW9uIGFuZCBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5MDQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghWDUwOVN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShudWxsLCBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIENlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gdHlwZSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duICh0eXBlOiAiLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiIHByb3ZpZGVyOiAiKS5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgdHlwZSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENlcnRpZmljYXRlRmFjdG9yeSB3aGVuIHR5cGUgYW5kIHByb3ZpZGVyIGhhdmUgdmFsaWQKKyAgICAgKiB2YWx1ZXMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUZhY3RvcnkwNSgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFYNTA5U3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEY7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlcnRGID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHR5cGUiLCBjZXJ0Ri5nZXRUeXBlKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIG5hbWUiLCBjZXJ0Ri5nZXRQcm92aWRlcigpCisgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4KKyAgICAgKiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5MDYoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIVg1MDlTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CisgICAgICogbWV0aG9kIAorICAgICAqIEFzc2VydGlvbjogCisgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdHlwZSBpcyBudWxsIAorICAgICAqIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIHR5cGUgaXMgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUZhY3RvcnkwNygpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghWDUwOVN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShudWxsLCBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiB0eXBlIGlzIG51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShpbnZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBhcyBleHBlY3RlZCAodHlwZToiCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGludmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiIHByb3ZpZGVyOiAiKS5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlci5nZXROYW1lKCkpLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CisgICAgICogbWV0aG9kIAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBDZXJ0aWZpY2F0ZUZhY3Rvcnl0aHJvd3Mgd2hlbiB0eXBlIGFuZCBwcm92aWRlcgorICAgICAqIGhhdmUgdmFsaWQgdmFsdWVzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eSBvZiBnZXRJbnN0YW5jZSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRmFjdG9yeTA4KCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFYNTA5U3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEY7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlcnRGID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJ0Ri5nZXRQcm92aWRlcigpLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNlcnRGLmdldFR5cGUoKSwgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0Q2VydFBhdGhFbmNvZGluZ3MoKTwvY29kZT4gbWV0aG9kIAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBlbmNvZGluZ3MKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydFBhdGhFbmNvZGluZ3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5MDkoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghWDUwOVN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5W10gY2VydEZzID0gaW5pdENlcnRGcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgY2VydEZzKTsKKyAgICAgICAgSXRlcmF0b3IgaXQxID0gY2VydEZzWzBdLmdldENlcnRQYXRoRW5jb2RpbmdzKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0MiA9IGNlcnRGc1sxXS5nZXRDZXJ0UGF0aEVuY29kaW5ncygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBlbmNvZGluZ3MiLCBpdDEuaGFzTmV4dCgpLCBpdDIuaGFzTmV4dCgpKTsKKyAgICAgICAgd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGl0MiA9IGNlcnRGc1sxXS5nZXRDZXJ0UGF0aEVuY29kaW5ncygpOworICAgICAgICAgICAgU3RyaW5nIHMxID0gKFN0cmluZykgaXQxLm5leHQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4geWVzTm8gPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlIChpdDIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHMxLmVxdWFscyhpdDIubmV4dCgpKSkgeworICAgICAgICAgICAgICAgICAgICB5ZXNObyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkVuY29kaW5nOiAiLmNvbmNhdChzMSkuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGRlZmluZSBmb3IgY2VydEYyIENlcnRpZmljYXRlRmFjdG9yeSIpLCB5ZXNObyk7CisgICAgICAgIH0KKyAgICAgICAgaXQxID0gY2VydEZzWzBdLmdldENlcnRQYXRoRW5jb2RpbmdzKCk7CisgICAgICAgIGl0MiA9IGNlcnRGc1syXS5nZXRDZXJ0UGF0aEVuY29kaW5ncygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBlbmNvZGluZ3MiLCBpdDEuaGFzTmV4dCgpLCBpdDIuaGFzTmV4dCgpKTsKKyAgICAgICAgd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGl0MiA9IGNlcnRGc1syXS5nZXRDZXJ0UGF0aEVuY29kaW5ncygpOworICAgICAgICAgICAgU3RyaW5nIHMxID0gKFN0cmluZykgaXQxLm5leHQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4geWVzTm8gPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlIChpdDIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHMxLmVxdWFscyhpdDIubmV4dCgpKSkgeworICAgICAgICAgICAgICAgICAgICB5ZXNObyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkVuY29kaW5nOiAiLmNvbmNhdChzMSkuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGRlZmluZSBmb3IgY2VydEYzIENlcnRpZmljYXRlRmFjdG9yeSIpLCB5ZXNObyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZW5lcmF0ZUNlcnRpZmljYXRlKElucHV0U3RyZWFtIGluU3RyZWFtKTwvY29kZT4KKyAgICAgKiA8Y29kZT5nZW5lcmF0ZUNlcnRpZmljYXRlcyhJbnB1dFN0cmVhbSBpblN0cmVhbSk8L2NvZGU+CisgICAgICogPGNvZGU+Z2VuZXJhdGVDUkwoSW5wdXRTdHJlYW0gaW5TdHJlYW0pPC9jb2RlPgorICAgICAqIDxjb2RlPmdlbmVyYXRlQ1JMcyhJbnB1dFN0cmVhbSBpblN0cmVhbSk8L2NvZGU+CisgICAgICogbWV0aG9kcyAKKyAgICAgKiBBc3NlcnRpb246IHRocm93IENlcnRpZmljYXRlRXhjZXB0aW9uIGFuZCBDUkxFeGNlcHRpb24gd2hlbgorICAgICAqIGluU3RyZWFtIGlzIG51bGwgb3IgZW1wdHkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBtZXRob2RzIHdpdGggbnVsbCBhbmQgZW1wdHkgSW5wdXRTdHJlYW0uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDUkwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNSTHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRmFjdG9yeTEwKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIVg1MDlTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVtdIGNlcnRGcyA9IGluaXRDZXJ0RnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2VydGlmaWNhdGVGYWN0b3J5IG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRGcyk7CisgICAgICAgIGJ5dGUgW10gYmIgPSB7fTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmIpOworICAgICAgICBDb2xsZWN0aW9uIGNvbENlcjsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xDcmw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2VydEZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRpZmljYXRlKG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoImdlbmVyYXRlQ2VydGlmaWNhdGUgbXVzdCB0aHJvd24gQ2VydGlmaWNhdGVFeGNlcHRpb24gb3IgTnVsbFBvaW50ZXJFWGNlcHRpb24gd2hlbiBpbnB1dCBzdHJlYW0gaXMgbnVsbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZXJ0RnNbaV0uZ2VuZXJhdGVDZXJ0aWZpY2F0ZXMobnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiZ2VuZXJhdGVDZXJ0aWZpY2F0ZXMgbXVzdCB0aHJvdyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBvciBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGlucHV0IHN0cmVhbSBpcyBudWxsIik7CisgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRpZmljYXRlKGlzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29sQ2VyID0gY2VydEZzW2ldLmdlbmVyYXRlQ2VydGlmaWNhdGVzKGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sQ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IGVtcHR5IGNlcnRpZmljYXRlIGNvbGxlY3Rpb24iLCBjb2xDZXIuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZXJ0RnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2VydEZzW2ldLmdlbmVyYXRlQ1JMKG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29sQ3JsID0gY2VydEZzW2ldLmdlbmVyYXRlQ1JMcyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sQ3JsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IGVtcHR5IENSTCBjb2xsZWN0aW9uIHdhcyByZXR1cm5lZCBmcm9tIG51bGwgc3RyZWFtIiwgY29sQ3JsLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgIGNlcnRGc1tpXS5nZW5lcmF0ZUNSTChpcyk7CisgICAgICAgICAgICB9IGNhdGNoIChDUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZXJ0RnNbaV0uZ2VuZXJhdGVDUkxzKGlzKTsKKyAgICAgICAgICAgICAgICBjb2xDcmwgPSBjZXJ0RnNbaV0uZ2VuZXJhdGVDUkxzKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChjb2xDcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJOb3QgZW1wdHkgQ1JMIGNvbGxlY3Rpb24gd2FzIHJldHVybmVkIGZyb20gZW1wdHkgc3RyZWFtIiwgY29sQ3JsLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdCBmb3IgPGNvZGU+IGdlbmVyYXRlQ2VydGlmaWNhdGUoSW5wdXRTdHJlYW0gaW5TdHJlYW0pIDwvY29kZT48Y29kZT4KKyAgICAgKiBnZW5lcmF0ZUNlcnRpZmljYXRlcyhJbnB1dFN0cmVhbSBpblN0cmVhbSkgPC9jb2RlPjxjb2RlPgorICAgICAqIGdlbmVyYXRlQ1JMKElucHV0U3RyZWFtIGluU3RyZWFtKSA8L2NvZGU+PGNvZGU+IAorICAgICAqIGdlbmVyYXRlQ1JMcyhJbnB1dFN0cmVhbSBpblN0cmVhbSkgPC9jb2RlPiAKKyAgICAgKiBtZXRob2RzIAorICAgICAqIEFzc2VydGlvbjogdGhyb3cgQ2VydGlmaWNhdGVFeGNlcHRpb24gYW5kIENSTEV4Y2VwdGlvbiB3aGVuIGluU3RyZWFtIAorICAgICAqIGNvbnRhaW5zIGluY29tcGF0aWJsZSBkYXRhcworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkgb2YgbWV0aG9kcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNlcnRpZmljYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDZXJ0aWZpY2F0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNSTCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ1JMcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5MTEoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIVg1MDlTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVtdIGNlcnRGcyA9IGluaXRDZXJ0RnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2VydGlmaWNhdGVGYWN0b3J5IG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRGcyk7CisgICAgICAgIE15Q2VydGlmaWNhdGUgbWMgPSBjcmVhdGVNQygpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG9zKTsKKyAgICAgICAgb29zLndyaXRlT2JqZWN0KG1jKTsKKyAgICAgICAgb29zLmZsdXNoKCk7CisgICAgICAgIG9vcy5jbG9zZSgpOworCisgICAgICAgIENlcnRpZmljYXRlIGNlcjsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xDZXI7CisgICAgICAgIENSTCBjcmw7CisgICAgICAgIENvbGxlY3Rpb24gY29sQ3JsOworCisgICAgICAgIGJ5dGVbXSBhcnIgPSBvcy50b0J5dGVBcnJheSgpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZXJ0RnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGFycik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlciA9IGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRpZmljYXRlKGlzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJOb3QgbnVsbCBjZXJ0aWZpY2F0ZSB3YXMgY3JlYXRlZCIsIGNlcik7CisgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhcnIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb2xDZXIgPSBjZXJ0RnNbaV0uZ2VuZXJhdGVDZXJ0aWZpY2F0ZXMoaXMpOworICAgICAgICAgICAgICAgIGlmIChjb2xDZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJOb3QgZW1wdHkgY2VydGlmaWNhdGUgQ29sbGVjdGlvbiB3YXMgY3JlYXRlZCIsIGNvbENlci5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGFycik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNybCA9IGNlcnRGc1tpXS5nZW5lcmF0ZUNSTChpcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgQ1JMIHdhcyBjcmVhdGVkIiwgY3JsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhcnIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb2xDcmwgPSBjZXJ0RnNbaV0uZ2VuZXJhdGVDUkxzKGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sQ3JsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IGVtcHR5IENSTCBDb2xsZWN0aW9uIHdhcyBjcmVhdGVkIiwgY29sQ3JsLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdlbmVyYXRlQ2VydFBhdGgoSW5wdXRTdHJlYW0gaW5TdHJlYW0pPC9jb2RlPgorICAgICAqIDxjb2RlPmdlbmVyYXRlQ2VydFBhdGgoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBlbmNvZGluZyk8L2NvZGU+CisgICAgICogbWV0aG9kcyAKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIGluU3RyZWFtIGlzIG51bGwgb3IKKyAgICAgKiB3aGVuIGlzU3RyZWFtIGNvbnRhaW5zIGludmFsaWQgZGF0YXMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNlcnRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5MTIoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghWDUwOVN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5W10gY2VydEZzID0gaW5pdENlcnRGcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgY2VydEZzKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMxID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMyID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzEwXSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZXJ0RnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2VydEZzW2ldLmdlbmVyYXRlQ2VydFBhdGgoaXMxKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJnZW5lcmF0ZUNlcnRpZmljYXRlIG11c3QgdGhyb3duIENlcnRpZmljYXRlRXhjZXB0aW9uIG9yIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gaW5wdXQgc3RyZWFtIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2VydEZzW2ldLmdlbmVyYXRlQ2VydFBhdGgoaXMyKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJnZW5lcmF0ZUNlcnRpZmljYXRlIG11c3QgdGhyb3duIENlcnRpZmljYXRlRXhjZXB0aW9uIHdoZW4gaW5wdXQgc3RyZWFtIGNvbnRhaW5zIGludmFsaWQgZGF0YXMiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gY2VydEZzW2ldLmdldENlcnRQYXRoRW5jb2RpbmdzKCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuYyA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjZXJ0RnNbaV0uZ2VuZXJhdGVDZXJ0UGF0aChpczEsIGVuYyk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoImdlbmVyYXRlQ2VydGlmaWNhdGUgbXVzdCB0aHJvd24gQ2VydGlmaWNhdGVFeGNlcHRpb24gb3IgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBpbnB1dCBzdHJlYW0gaXMgbnVsbCBhbmQgZW5jb2RpbmdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGVuYykpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRQYXRoKGlzMiwgZW5jKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiZ2VuZXJhdGVDZXJ0aWZpY2F0ZSBtdXN0IHRocm93biBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIGlucHV0IHN0cmVhbSBjb250YWlucyBpbnZhbGlkIGRhdGFzICBhbmQgZW5jb2RpbmdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGVuYykpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZW5lcmF0ZUNlcnRQYXRoKElucHV0U3RyZWFtIGluU3RyZWFtKTwvY29kZT4KKyAgICAgKiA8Y29kZT5nZW5lcmF0ZUNlcnRQYXRoKElucHV0U3RyZWFtIGluU3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpPC9jb2RlPgorICAgICAqIG1ldGhvZHMgCisgICAgICogQXNzZXJ0aW9uOiB0aHJvdyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB3aGVuIGlzU3RyZWFtIGNvbnRhaW5zIGludmFsaWQgZGF0YXMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNlcnRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5MTMoKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIVg1MDlTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVtdIGNlcnRGcyA9IGluaXRDZXJ0RnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2VydGlmaWNhdGVGYWN0b3J5IG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRGcyk7CisgICAgICAgIGJ5dGVbXSBlbmMgPSB7IChieXRlKSAwLCAoYnl0ZSkgMiwgKGJ5dGUpIDMsIChieXRlKSA0LCAoYnl0ZSkgNSB9OworICAgICAgICBNeUNlcnRQYXRoIG1jID0gbmV3IE15Q2VydFBhdGgoZW5jKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG9zKTsKKyAgICAgICAgb29zLndyaXRlT2JqZWN0KG1jKTsKKyAgICAgICAgb29zLmZsdXNoKCk7CisgICAgICAgIG9vcy5jbG9zZSgpOworCisgICAgICAgIGJ5dGVbXSBhcnIgPSBvcy50b0J5dGVBcnJheSgpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhcnIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2VydEZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRQYXRoKGlzKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biBiZWNhdXNlIGlucHV0IHN0cmVhbSBjb250YWlucyBpbmNvcnJlY3QgZGF0YXMiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gY2VydEZzW2ldLmdldENlcnRQYXRoRW5jb2RpbmdzKCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsgCisgICAgICAgICAgICAgICAgICAgIGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRQYXRoKGlzLCAoU3RyaW5nKSBpdC5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biBiZWNhdXNlIGlucHV0IHN0cmVhbSBjb250YWlucyBpbmNvcnJlY3QgZGF0YXMiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2VuZXJhdGVDZXJ0UGF0aChMaXN0IGNlcnRpZmljYXRlcyk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24gY2VydGlmaWNhdGVzIGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gIiArCisgICAgICAgICAgICAgICJWYWxpZCBwYXJhbWV0ZXJzIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNlcnRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5MTQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghWDUwOVN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5W10gY2VydEZzID0gaW5pdENlcnRGcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgY2VydEZzKTsKKyAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gbGlzdCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2VydEZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRQYXRoKGxpc3QpOworICAgICAgICAgICAgICAgIGZhaWwoImdlbmVyYXRlQ2VydGlmaWNhdGUgbXVzdCB0aHJvd24gQ2VydGlmaWNhdGVFeGNlcHRpb24gd2hlbiBsaXN0IGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICBjZXJ0RnNbaV0uZ2VuZXJhdGVDZXJ0UGF0aChsaXN0KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJnZW5lcmF0ZUNlcnRpZmljYXRlcyBtdXN0IHRocm93IENlcnRpZmljYXRlRXhjZXB0aW9uIHdoZW4gbGlzdCBpcyBudWxsIik7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZW5lcmF0ZUNlcnRQYXRoKExpc3QgY2VydGlmaWNhdGVzKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGVtcHR5IENlcnRQYXRoIGlmIGNlcnRpZmljYXRlcyBpcyBlbXB0eQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2VuZXJhdGVDZXJ0UGF0aCBtZXRob2QgcmV0dXJucyBlbXB0eSBDZXJ0UGF0aCAiICsKKyAgICAgICAgICAgICJpZiBjZXJ0aWZpY2F0ZXMgaXMgZW1wdHkuIFZhbGlkIHBhcmFtZXRlcnMgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUZhY3RvcnkxNSgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFYNTA5U3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnlbXSBjZXJ0RnMgPSBpbml0Q2VydEZzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNlcnRpZmljYXRlRmFjdG9yeSBvYmplY3RzIHdlcmUgbm90IGNyZWF0ZWQiLCBjZXJ0RnMpOyAKKyAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gbGlzdCA9IG5ldyBWZWN0b3I8Q2VydGlmaWNhdGU+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2VydEZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDZXJ0UGF0aCBjcCA9IGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRQYXRoKGxpc3QpOworICAgICAgICAgICAgTGlzdCBsaXN0MSA9IGNwLmdldENlcnRpZmljYXRlcygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGlzdCBzaG91bGQgYmUgZW1wdHkiLCBsaXN0MS5pc0VtcHR5KCkpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZW5lcmF0ZUNlcnRQYXRoKExpc3QgY2VydGlmaWNhdGVzKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2hlbiBjZXJ0aWZpY2F0ZXMgY29udGFpbnMKKyAgICAgKiBpbmNvcnJlY3QgQ2VydGlmaWNhdGUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbi4gVmFsaWQgcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRmFjdG9yeTE2KCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIVg1MDlTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVtdIGNlcnRGcyA9IGluaXRDZXJ0RnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2VydGlmaWNhdGVGYWN0b3J5IG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRGcyk7CisgICAgICAgIE15Q2VydGlmaWNhdGUgbXMgPSBjcmVhdGVNQygpOworICAgICAgICBMaXN0PENlcnRpZmljYXRlPiBsaXN0ID0gbmV3IFZlY3RvcjxDZXJ0aWZpY2F0ZT4oKTsKKyAgICAgICAgbGlzdC5hZGQobXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNlcnRGcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZXJ0RnNbaV0uZ2VuZXJhdGVDZXJ0UGF0aChsaXN0KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVGYWN0b3J5PC9jb2RlPiBjb25zdHJ1Y3RvciAKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgQ2VydGlmaWNhdGVGYWN0b3J5IG9iamVjdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENSTEV4Y2VwdGlvbiBhbmQgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDUkxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUZhY3RvcnkxNygpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENSTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghWDUwOVN1cHBvcnQpIHsKKyAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5U3BpIHNwaSA9IG5ldyBNeUNlcnRpZmljYXRlRmFjdG9yeVNwaSgpOyAKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gbmV3IG15Q2VydGlmaWNhdGVGYWN0b3J5KHNwaSwgZGVmYXVsdFByb3ZpZGVyLAorICAgICAgICAgICAgICAgIGRlZmF1bHRUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNmLmdldFR5cGUoKSwgZGVmYXVsdFR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGNmLmdldFByb3ZpZGVyKCksIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZi5nZW5lcmF0ZUNSTHMobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJDUkxFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICBjZiA9IG5ldyBteUNlcnRpZmljYXRlRmFjdG9yeShudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiSW5jb3JyZWN0IHR5cGUiLCBjZi5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZi5nZXRQcm92aWRlcigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNmLmdlbmVyYXRlQ1JMcyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRUeXBlKCk8L2NvZGU+IG1ldGhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlRmFjdG9yeTE4KCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFYNTA5U3VwcG9ydCkgeworICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RiA9IENlcnRpZmljYXRlRmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0eXBlOiAiLCB2YWxpZFZhbHVlc1tpXSwgY2VydEYKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgIGNlcnRGID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNlcnRGLmdldFR5cGUoKSwgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNlcnRGID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGNlcnRGLmdldFByb3ZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHR5cGUiLCBjZXJ0Ri5nZXRUeXBlKCksIHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihDZXJ0aWZpY2F0ZUZhY3RvcnkxVGVzdC5jbGFzcyk7CisgICAgfQorfQorLyoqCisgKiBBZGRpdGlvbmFsIGNsYXNzIHRvIHZlcmlmeSBDZXJ0aWZpY2F0ZUZhY3RvcnkgY29uc3RydWN0b3IKKyAqLworCitjbGFzcyBteUNlcnRpZmljYXRlRmFjdG9yeSBleHRlbmRzIENlcnRpZmljYXRlRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgbXlDZXJ0aWZpY2F0ZUZhY3RvcnkoQ2VydGlmaWNhdGVGYWN0b3J5U3BpIHNwaSwgUHJvdmlkZXIgcHJvdiwKKyAgICAgICAgICAgIFN0cmluZyB0eXBlKSB7CisgICAgICAgIHN1cGVyKHNwaSwgcHJvdiwgdHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeTJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5MlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYwYjMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeTJUZXN0LmphdmEKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgdGVzdHMuc2VjdXJpdHkuY2VydC5teUNlcnRQYXRoQnVpbGRlci5NeVByb3ZpZGVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydGlmaWNhdGVGYWN0b3J5U3BpOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlNwaUVuZ1V0aWxzOworCisvKioKKyAqIFRlc3RzIGZvciBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUZhY3RvcnkuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVGYWN0b3J5MlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRBbGcgPSAiQ2VydEZhYyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENlcnRpZmljYXRlRmFjdG9yeVByb3ZpZGVyQ2xhc3MgPSAidGVzdHMuc2VjdXJpdHkuY2VydC5zdXBwb3J0LmNlcnQuTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkiOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGludmFsaWRWYWx1ZXMgPSBTcGlFbmdVdGlscy5pbnZhbGlkVmFsdWVzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gdmFsaWRWYWx1ZXM7CisKKyAgICBzdGF0aWMgeworICAgICAgICB2YWxpZFZhbHVlcyA9IG5ldyBTdHJpbmdbNF07CisgICAgICAgIHZhbGlkVmFsdWVzWzBdID0gZGVmYXVsdEFsZzsKKyAgICAgICAgdmFsaWRWYWx1ZXNbMV0gPSBkZWZhdWx0QWxnLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHZhbGlkVmFsdWVzWzJdID0gIkNlUnRGYUMiOworICAgICAgICB2YWxpZFZhbHVlc1szXSA9ICJjZXJURmFjIjsKKyAgICB9CisKKyAgICBQcm92aWRlciBtUHJvdjsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1Qcm92ID0gKG5ldyBTcGlFbmdVdGlscygpKS5uZXcgTXlQcm92aWRlcigiTXlDRlByb3ZpZGVyIiwKKyAgICAgICAgICAgICAgICAiUHJvdmlkZXIgZm9yIHRlc3RpbmciLCBDZXJ0aWZpY2F0ZUZhY3RvcnkxVGVzdC5zcnZDZXJ0aWZpY2F0ZUZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoIi4iKS5jb25jYXQoZGVmYXVsdEFsZyksCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5UHJvdmlkZXJDbGFzcyk7CisgICAgICAgIFNlY3VyaXR5Lmluc2VydFByb3ZpZGVyQXQobVByb3YsIDEpOworICAgIH0KKworICAgIC8qCisgICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgU2VjdXJpdHkucmVtb3ZlUHJvdmlkZXIobVByb3YuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydGlmaWNhdGVGYWN0b3J5MlRlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVGYWN0b3J5MlRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdWx0KENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdG9yeSwgYm9vbGVhbiBtb2RlKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLCBDUkxFeGNlcHRpb24geworICAgICAgICBNeUNlcnRpZmljYXRlRmFjdG9yeVNwaS5wdXRNb2RlKG1vZGUpOworCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShiYWlzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5LmdlbmVyYXRlQ2VydFBhdGgoYmFpcyk7CisgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5LmdlbmVyYXRlQ2VydFBhdGgoZGlzKTsKKyAgICAgICAgICAgIGlmICghbW9kZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGJlY2F1c2UgZW5jb2RpbmdzIGxpc3QgaXMgZW1wdHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlRmFjdG9yeUV4Y2VwdGlvbiB3YXMgdGhyb3duIik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRQYXRoKGJhaXMsICJhYSIpOworICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRQYXRoKGRpcywgIiIpOworICAgICAgICAgICAgaWYgKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICghbW9kZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyB0aHJvd24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRQYXRoKGRpcywgInNzIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5LmdlbmVyYXRlQ2VydGlmaWNhdGUoYmFpcyk7CisgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5LmdlbmVyYXRlQ2VydGlmaWNhdGVzKG51bGwpOworICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlIGNlcnQgPSBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlKGRpcyk7CisgICAgICAgIGFzc2VydE51bGwoIlJlc3VsdCBtdXN0IGJlIG51bGwiLCBjZXJ0KTsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2wgPSBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlcyhkaXMpOworICAgICAgICBhc3NlcnROdWxsKCJSZXN1bHQgbXVzdCBiZSBudWxsIiwgY29sKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnkuZ2VuZXJhdGVDUkwoYmFpcyk7CisgICAgICAgICAgICBmYWlsKCJDUkxFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnkuZ2VuZXJhdGVDUkxzKG51bGwpOworICAgICAgICAgICAgZmFpbCgiQ1JMRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgQ1JMIGNybCA9IGNlcnRGYWN0b3J5LmdlbmVyYXRlQ1JMKGRpcyk7CisgICAgICAgIGFzc2VydE51bGwoIlJlc3VsdCBtdXN0IGJlIG51bGwiLCBjcmwpOworICAgICAgICBjb2wgPSBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNSTHMoZGlzKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiUmVzdWx0IG11c3QgYmUgbnVsbCIsIGNvbCk7CisKKyAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gbGlzdCA9IG51bGw7CisgICAgICAgIENlcnRQYXRoIGNwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3AgPSBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRQYXRoKGxpc3QpOworICAgICAgICAgICAgaWYgKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJNdXN0IGJlIG51bGwiLCBjcCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoIW1vZGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBJdGVyYXRvciBpdCA9IGNlcnRGYWN0b3J5LmdldENlcnRQYXRoRW5jb2RpbmdzKCk7CisgICAgICAgIGlmIChtb2RlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGl0Lmhhc05leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUpPC9jb2RlPiBtZXRob2QgCisgICAgICogQXNzZXJ0aW9uczoKKyAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiB0eXBlIGlzIG51bGwgCisgICAgICogdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHdoZW4gdHlwZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICogcmV0dXJucyBDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgR2V0SW5zdGFuY2UwMShib29sZWFuIG1vZGUpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgQ1JMRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIENlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gdHlwZSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gKHR5cGU6ICIuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJGOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjZXJGID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHR5cGUiLCBjZXJGLmdldFR5cGUoKSwgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJGLmdldFByb3ZpZGVyKCksIG1Qcm92KTsKKyAgICAgICAgICAgIGNoZWNrUmVzdWx0KGNlckYsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsIFN0cmluZyBwcm92aWRlcik8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbnM6IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHR5cGUgaXMgbnVsbCAKKyAgICAgKiB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2hlbiB0eXBlIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCBvciBlbXB0eTsgCisgICAgICogdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgYXZhaWxhYmxlOyAKKyAgICAgKiByZXR1cm5zIENlcnRpZmljYXRlRmFjdG9yeSBvYmplY3QKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIEdldEluc3RhbmNlMDIoYm9vbGVhbiBtb2RlKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDUkxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKG51bGwsIG1Qcm92LmdldE5hbWUoKSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHR5cGUgaXMgbnVsbCIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKGludmFsaWRWYWx1ZXNbaV0sIG1Qcm92CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biAodHlwZTogIi5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzW2ldKS5jb25jYXQoIikiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByb3YgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSh2YWxpZFZhbHVlc1tpXSwgcHJvdik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgbnVsbCAodHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh2YWxpZFZhbHVlc1tpXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gcHJvdmlkZXIgaXMgZW1wdHkgKHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKHZhbGlkVmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXNbal0pOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biAodHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiIHByb3ZpZGVyOiAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoaW52YWxpZFZhbHVlc1tqXSkuY29uY2F0KCIpIikpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlckY7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlckYgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIG1Qcm92CisgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIGNlckYuZ2V0VHlwZSgpLCB2YWxpZFZhbHVlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsIGNlckYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG1Qcm92LmdldE5hbWUoKSk7CisgICAgICAgICAgICBjaGVja1Jlc3VsdChjZXJGLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEluc3RhbmNlKFN0cmluZyB0eXBlLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CisgICAgICogbWV0aG9kIAorICAgICAqIEFzc2VydGlvbnM6IAorICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHR5cGUgaXMgbnVsbCAKKyAgICAgKiB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gd2hlbiB0eXBlIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbDsgCisgICAgICogcmV0dXJucyBDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBHZXRJbnN0YW5jZTAzKGJvb2xlYW4gbW9kZSkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDUkxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKG51bGwsIG1Qcm92KTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG9yIENlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gdHlwZSBpcyBudWxsIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoaW52YWxpZFZhbHVlc1tpXSwgbVByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duICh0eXBlOiAiLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQcm92aWRlciBwcm92ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIHByb3YpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biB3aGVuIHByb3ZpZGVyIGlzIG51bGwgKHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodmFsaWRWYWx1ZXNbaV0pLmNvbmNhdCgiKSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlckY7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlckYgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UodmFsaWRWYWx1ZXNbaV0sIG1Qcm92KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHR5cGUiLCBjZXJGLmdldFR5cGUoKSwgdmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLCBjZXJGLmdldFByb3ZpZGVyKCksIG1Qcm92KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNoZWNrUmVzdWx0KGNlckYsICBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRJbnN0YW5jZTAxKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLCBDUkxFeGNlcHRpb24geworICAgICAgICBHZXRJbnN0YW5jZTAxKHRydWUpOyAgIAorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRJbnN0YW5jZTAyKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDUkxFeGNlcHRpb24geworICAgICAgICBHZXRJbnN0YW5jZTAyKHRydWUpOyAgIAorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm92aWRlci5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pICAgIAorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0SW5zdGFuY2UwMygpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDUkxFeGNlcHRpb24geworICAgICAgICBHZXRJbnN0YW5jZTAzKHRydWUpOyAgIAorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRJbnN0YW5jZTA0KCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLCBDUkxFeGNlcHRpb24geworICAgICAgICBHZXRJbnN0YW5jZTAxKGZhbHNlKTsgICAKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0SW5zdGFuY2UwNSgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQ1JMRXhjZXB0aW9uIHsKKyAgICAgICAgR2V0SW5zdGFuY2UwMihmYWxzZSk7ICAgCisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyLmNsYXNzfQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkgICAgCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRJbnN0YW5jZTA2KCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIENSTEV4Y2VwdGlvbiB7CisgICAgICAgIEdldEluc3RhbmNlMDMoZmFsc2UpOyAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkzVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeTNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyYWNiMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuVGVzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlNwaUVuZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LnJlc291cmNlLlN1cHBvcnRfUmVzb3VyY2VzOworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5DZXJ0aWZpY2F0ZUZhY3Rvcnk8L2NvZGU+IGNsYXNzIG1ldGhvZHMKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUZhY3RvcnkuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVGYWN0b3J5M1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFByb3ZpZGVyTmFtZSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRUeXBlID0gQ2VydGlmaWNhdGVGYWN0b3J5MVRlc3QuZGVmYXVsdFR5cGU7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlQ2VydFBhdGhQa2kgPSAiQ2VydFBhdGguUGtpUGF0aCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIFg1MDlTdXBwb3J0ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTm90U3VwcG9ydE1zZyA9ICIiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gU3BpRW5nVXRpbHMuaXNTdXBwb3J0KGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeTFUZXN0LnNydkNlcnRpZmljYXRlRmFjdG9yeSk7CisgICAgICAgIFg1MDlTdXBwb3J0ID0gZGVmYXVsdFByb3ZpZGVyICE9IG51bGw7CisgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUgPSBYNTA5U3VwcG9ydCA/IGRlZmF1bHRQcm92aWRlci5nZXROYW1lKCkgOiBudWxsOworCisgICAgICAgIE5vdFN1cHBvcnRNc2cgPSBkZWZhdWx0VHlwZS5jb25jYXQoIiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGVGYWN0b3J5W10gaW5pdENlcnRGcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIVg1MDlTdXBwb3J0KSB7CisgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOworICAgICAgICB9CisKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5W10gY2VydEZzID0gbmV3IENlcnRpZmljYXRlRmFjdG9yeVszXTsKKyAgICAgICAgY2VydEZzWzBdID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKGRlZmF1bHRUeXBlKTsKKyAgICAgICAgY2VydEZzWzFdID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKGRlZmF1bHRUeXBlLAorICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlck5hbWUpOworICAgICAgICBjZXJ0RnNbMl0gPSBDZXJ0aWZpY2F0ZUZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoZGVmYXVsdFR5cGUsIGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgIHJldHVybiBjZXJ0RnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2VuZXJhdGVDZXJ0aWZpY2F0ZShJbnB1dFN0cmVhbSBpblN0cmVhbSk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBDZXJ0aWZpY2F0ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlQ2VydGlmaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5W10gY2VydEZzID0gaW5pdENlcnRGcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgY2VydEZzKTsKKyAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0cyA9IG5ldyBDZXJ0aWZpY2F0ZVszXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZXJ0RnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNlcnRzW2ldID0gY2VydEZzW2ldLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuZ2V0RW5jb2RlZFg1MDlDZXJ0aWZpY2F0ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNlcnRzWzBdLCBjZXJ0c1sxXSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjZXJ0c1swXSwgY2VydHNbMl0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdlbmVyYXRlQ2VydGlmaWNhdGVzKElucHV0U3RyZWFtIGluU3RyZWFtKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENvbGxlY3Rpb24gd2hpY2ggY29uc2lzdHMgb2YgMSBDZXJ0aWZpY2F0ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RlR25lcmF0ZUNlcnRpZmljYXRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnlbXSBjZXJ0RnMgPSBpbml0Q2VydEZzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNlcnRpZmljYXRlRmFjdG9yeSBvYmplY3RzIHdlcmUgbm90IGNyZWF0ZWQiLCBjZXJ0RnMpOworICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0ID0gY2VydEZzWzBdCisgICAgICAgICAgICAgICAgLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRlc3RVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuY29kZWRYNTA5Q2VydGlmaWNhdGUoKSkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNlcnRGcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ29sbGVjdGlvbiBjb2wgPSBudWxsOworICAgICAgICAgICAgY29sID0gY2VydEZzW2ldLmdlbmVyYXRlQ2VydGlmaWNhdGVzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldEVuY29kZWRYNTA5Q2VydGlmaWNhdGUoKSkpOworICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBjb2wuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IENvbGxlY3Rpb24gc2l6ZSIsIGNvbC5zaXplKCksIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgQ2VydGlmaWNhdGUgaW4gQ29sbGVjdGlvbiIsIGNlcnQsIGl0Lm5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZW5lcmF0ZUNlcnRQYXRoKExpc3QgY2VydGlmaWNhdGVzKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENlcnRQYXRoIHdpdGggMSBDZXJ0aWZpY2F0ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2VuZXJhdGVDZXJ0UGF0aDAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVtdIGNlcnRGcyA9IGluaXRDZXJ0RnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2VydGlmaWNhdGVGYWN0b3J5IG9iamVjdHMgd2VyZSBub3QgY3JlYXRlZCIsIGNlcnRGcyk7CisgICAgICAgIC8vIGNyZWF0ZSBsaXN0IG9mIGNlcnRpZmljYXRlcyB3aXRoIG9uZSBjZXJ0aWZpY2F0ZQorICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0ID0gY2VydEZzWzBdCisgICAgICAgICAgICAgICAgLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRlc3RVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuY29kZWRYNTA5Q2VydGlmaWNhdGUoKSkpOworICAgICAgICBMaXN0PENlcnRpZmljYXRlPiBsaXN0ID0gbmV3IFZlY3RvcjxDZXJ0aWZpY2F0ZT4oKTsKKyAgICAgICAgbGlzdC5hZGQoY2VydCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2VydEZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDZXJ0UGF0aCBjZXJ0UGF0aCA9IG51bGw7CisgICAgICAgICAgICBjZXJ0UGF0aCA9IGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRQYXRoKGxpc3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNlcnQuZ2V0VHlwZSgpLCBjZXJ0UGF0aC5nZXRUeXBlKCkpOworICAgICAgICAgICAgTGlzdCBsaXN0MSA9IGNlcnRQYXRoLmdldENlcnRpZmljYXRlcygpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlJlc3VsdCBsaXN0IGlzIGVtcHR5IiwgbGlzdDEuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbGlzdDEuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IENlcnRpZmljYXRlIGluIENlcnRQYXRoIiwgY2VydCwgaXQubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yCisgICAgICogPGNvZGU+Z2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbSBpblN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKTwvY29kZT4KKyAgICAgKiBtZXRob2QgQXNzZXJ0aW9uOiByZXR1cm5zIENlcnRQYXRoIHdpdGggMSBDZXJ0aWZpY2F0ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZW5lcmF0ZUNlcnRQYXRoMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5W10gY2VydEZzID0gaW5pdENlcnRGcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgY2VydEZzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZXJ0RnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENlcnRQYXRoIGNlcnRQYXRoID0gbnVsbDsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGZpcyA9IFN1cHBvcnRfUmVzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmVhbShmaWxlQ2VydFBhdGhQa2kpOworICAgICAgICAgICAgY2VydFBhdGggPSBjZXJ0RnNbaV0uZ2VuZXJhdGVDZXJ0UGF0aChmaXMsICJQa2lQYXRoIik7CisgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkZWZhdWx0VHlwZSwgY2VydFBhdGguZ2V0VHlwZSgpKTsKKworICAgICAgICAgICAgTGlzdCBsaXN0MSA9IGNlcnRQYXRoLmdldENlcnRpZmljYXRlcygpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlJlc3VsdCBsaXN0IGlzIGVtcHR5IiwgbGlzdDEuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdlbmVyYXRlQ2VydFBhdGgoSW5wdXRTdHJlYW0gaW5TdHJlYW0pPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgQ2VydFBhdGggd2l0aCAxIENlcnRpZmljYXRlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2VydGlmaWNhdGVFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEdlbmVyYXRlQ2VydFBhdGgwMygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY2VydFBhdGhFbmNvZGluZyA9ICJQa2lQYXRoIjsKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5W10gY2VydEZzID0gaW5pdENlcnRGcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZUZhY3Rvcnkgb2JqZWN0cyB3ZXJlIG5vdCBjcmVhdGVkIiwgY2VydEZzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZXJ0RnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gY2VydEZzWzBdLmdldENlcnRQYXRoRW5jb2RpbmdzKCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIm5vIENlcnRQYXRoIGVuY29kaW5ncyIsIGl0Lmhhc05leHQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRlZmF1bHQgZW5jb2RpbmciLCBjZXJ0UGF0aEVuY29kaW5nLCBpdAorICAgICAgICAgICAgICAgICAgICAubmV4dCgpKTsKKworICAgICAgICAgICAgQ2VydFBhdGggY2VydFBhdGggPSBudWxsOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gZmlzID0gU3VwcG9ydF9SZXNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyZWFtKGZpbGVDZXJ0UGF0aFBraSk7CisgICAgICAgICAgICBjZXJ0UGF0aCA9IGNlcnRGc1tpXS5nZW5lcmF0ZUNlcnRQYXRoKGZpcyk7CisgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkZWZhdWx0VHlwZSwgY2VydFBhdGguZ2V0VHlwZSgpKTsKKworICAgICAgICAgICAgTGlzdCBsaXN0MSA9IGNlcnRQYXRoLmdldENlcnRpZmljYXRlcygpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlJlc3VsdCBsaXN0IGlzIGVtcHR5IiwgbGlzdDEuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3Rvcnk0VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeTRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNTgyMwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3Rvcnk0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzM2IEBACisvKiAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfR2V0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ2VydGlmaWNhdGVGYWN0b3J5LmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRpZmljYXRlRmFjdG9yeTRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfVVJMID0gU3VwcG9ydF9HZXRSZXNvdXJjZQorICAgICAgICAgICAgLmdldFJlc291cmNlVVJMKCIvLi4vaW50ZXJuYWxyZXMvIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDRVJUSUZJQ0FURV9VUkxTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJCdWc5Mzg5MS1QRU0uY2VyIiwgIkJ1ZzkzODkxLURFUi5jZXIiLCAiQnVnOTQ0MDQtUEtDUzcuY2VyIiB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ1JMX1VSTFMgPSBuZXcgU3RyaW5nW10geyAiQnVnOTM4OTMtMS5jcmwiLAorICAgICAgICAgICAgIkJ1ZzkzODkzLTIuY3JsIiwgIkJ1Zzk0NDA0LURFUi5jcmwiIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDUkxDT0xMRUNUSU9OX1VSTFMgPSBuZXcgU3RyaW5nW10geyAiQnVnOTQ0MDQtUEtDUzcuY3JsIiB9OworCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkjZ2VuZXJhdGVDZXJ0aWZpY2F0ZShqYXZhLmlvLklucHV0U3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNlcnRpZmljYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dlbmVyYXRlQ2VydGlmaWNhdGVMamF2YV9pb19JbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IDEKKyAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZQorICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5LmdlbmVyYXRlQ2VydGlmaWNhdGUoamF2YS5pby5JbnB1dFN0cmVhbSkKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ0VSVElGSUNBVEVTX0VOQ09ERURfWDUwOS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgQ0VSVElGSUNBVEVTX0VOQ09ERURfWDUwOVtpXS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGZhY3QuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShiYWlzKTsKKworICAgICAgICAgICAgLy8gdHJ5IGFnYWluIHdpdGggZ2VuZXJhdGVDZXJ0aWZpY2F0ZXMoKQorICAgICAgICAgICAgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShDRVJUSUZJQ0FURVNfRU5DT0RFRF9YNTA5W2ldCisgICAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGZhY3QuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShiYWlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3QgMgorICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFJlc291cmNlU3RyZWFtKCJoeXRzX2JhZHBlbS5jZXIiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZhY3QuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShpcyk7CisgICAgICAgICAgICBmYWlsKCJUZXN0MjogQ2VydGlmaWNhdGVFeGNlcHRpb24gbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7fSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5I2dlbmVyYXRlQ2VydGlmaWNhdGVzKGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDZXJ0aWZpY2F0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmF0ZUNlcnRpZmljYXRlc0xqYXZhX2lvX0lucHV0U3RyZWFtKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgZmFjdCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDRVJUSUZJQ0FURV9VUkxTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBVUkwgY2VydFVybCA9IG5ldyBVUkwoQkFTRV9VUkwgKyBDRVJUSUZJQ0FURV9VUkxTW2ldKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjZXJ0VXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNlcnRzID0gZmFjdC5nZW5lcmF0ZUNlcnRpZmljYXRlcyhpcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGNlcnRpZmljYXRlcyBpbiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2VydFVybC50b0V4dGVybmFsRm9ybSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiB3ZXJlIG5vdCBwYXJzZWQgY29ycmVjdGx5IiwgY2VydHMpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHRoZSBjZXJ0aWZpY2F0ZSBjb3VsZCBub3QgYmUgZm91bmQsIHNraXAgaXQKKyAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJBbiBleGNlcHRpb24gd2FzIHRocm93biB3aGlsZSBwYXJzaW5nIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjZXJ0VXJsLnRvRXh0ZXJuYWxGb3JtKCkgKyAiXCI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSNnZW5lcmF0ZUNSTChqYXZhLmlvLklucHV0U3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElPRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ1JMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2VuZXJhdGVDUkxMamF2YV9pb19JbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgZmFjdCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDUkxfVVJMUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgVVJMIGNlcnRVcmwgPSBuZXcgVVJMKEJBU0VfVVJMICsgQ1JMX1VSTFNbaV0pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGNlcnRVcmwub3BlblN0cmVhbSgpOworICAgICAgICAgICAgICAgIENSTCBjcmwgPSBmYWN0LmdlbmVyYXRlQ1JMKGlzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgQ1JMIGluIFwiIiArIGNlcnRVcmwudG9FeHRlcm5hbEZvcm0oKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgd2VyZSBub3QgcGFyc2VkIGNvcnJlY3RseSIsIGNybCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIGNlcnRpZmljYXRlIGNvdWxkIG5vdCBiZSBmb3VuZCwgc2tpcCBpdAorICAgICAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJBbiBleGNlcHRpb24gd2FzIHRocm93biB3aGlsZSBwYXJzaW5nIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjZXJ0VXJsLnRvRXh0ZXJuYWxGb3JtKCkgKyAiXCI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSNnZW5lcmF0ZUNSTHMoamF2YS5pby5JbnB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNSTHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmF0ZUNSTHNMamF2YV9pb19JbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgZmFjdCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDUkxDT0xMRUNUSU9OX1VSTFMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFVSTCBjZXJ0VXJsID0gbmV3IFVSTChCQVNFX1VSTCArIENSTENPTExFQ1RJT05fVVJMU1tpXSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gY2VydFVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjcmxzID0gZmFjdC5nZW5lcmF0ZUNSTHMoaXMpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBDUkxzIGluIFwiIiArIGNlcnRVcmwudG9FeHRlcm5hbEZvcm0oKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgd2VyZSBub3QgcGFyc2VkIGNvcnJlY3RseSIsIGNybHMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3Jscy5zaXplKCkgPiAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2VydGlmaWNhdGUgY291bGQgbm90IGJlIGZvdW5kLCBza2lwIGl0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSNnZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeQorICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBmYWN0ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworICAgICAgICBhc3NlcnRUcnVlKCJmYWN0b3J5IGlzIG51bGwiLCBmYWN0ICE9IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5I2dldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeQorICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKGphdmEubGFuZy5TdHJpbmcsCisgICAgICAgIC8vIGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvdmlkZXJzKCJDZXJ0aWZpY2F0ZUZhY3RvcnkuWC41MDkiKTsKKworICAgICAgICBpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAiWC41MDkiLCBwcm92aWRlcnNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJmYWN0b3J5IGlzIG51bGwiLCBmYWN0KTsKKyAgICAgICAgICAgIH0vLyBlbmQgZm9yCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJObyBwcm92aWRlcnMgc3VwcG9ydCBDZXJ0aWZpY2F0ZUZhY3RvcnkuWC41MDkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGV4Y2VwdGlvbiBjYXNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5IiwgIklIYXZlbnRCZWVuQ29uZmlndXJlZCIpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSNnZXRQcm92aWRlcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5Qcm92aWRlcgorICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5LmdldFByb3ZpZGVyKCkKKyAgICAgICAgUHJvdmlkZXIgcCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKS5nZXRQcm92aWRlcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJwcm92aWRlciBpcyBudWxsIiwgcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkjZ2VuZXJhdGVDUkxzKElucHV0U3RyZWFtCisgICAgICogICAgICAgIGluU3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2VuZXJhdGVDUkxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUNSTHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODE0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5IikuZ2VuZXJhdGVDUkwoCisgICAgICAgICAgICAgICAgICAgIChJbnB1dFN0cmVhbSkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJDUkxFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkjZ2VuZXJhdGVDZXJ0aWZpY2F0ZShJbnB1dFN0cmVhbQorICAgICAqICAgICAgICBpblN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLHMgYW5kIENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlQ2VydGlmaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS04MTQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKS5nZW5lcmF0ZUNlcnRpZmljYXRlKG51bGwpOworICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSNnZW5lcmF0ZUNlcnRpZmljYXRlcyhJbnB1dFN0cmVhbQorICAgICAqICAgICAgICBpblN0cmVhbSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUNlcnRpZmljYXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS04MTQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKS5nZW5lcmF0ZUNlcnRpZmljYXRlcyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkjZ2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbQorICAgICAqICAgICAgICBpblN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgSW5wdXRTdHJlYW0gcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlQ2VydFBhdGgxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODE0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5IikuZ2VuZXJhdGVDZXJ0UGF0aCgKKyAgICAgICAgICAgICAgICAgICAgKElucHV0U3RyZWFtKSBudWxsLCAiUGtpUGF0aCIpOworICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSNnZW5lcmF0ZUNlcnRQYXRoKExpc3Q8PworICAgICAqICAgICAgICBleHRlbmRzIENlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNlcnRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVDZXJ0UGF0aDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS04MTQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKS5nZW5lcmF0ZUNlcnRQYXRoKAorICAgICAgICAgICAgICAgICAgICAoTGlzdDxDZXJ0aWZpY2F0ZT4pIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSNnZW5lcmF0ZUNlcnRQYXRoKElucHV0U3RyZWFtCisgICAgICogICAgICAgIGluU3RyZWFtKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdlbmVyYXRlQ2VydFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlQ2VydFBhdGgzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODE0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5IikuZ2VuZXJhdGVDZXJ0UGF0aCgKKyAgICAgICAgICAgICAgICAgICAgKElucHV0U3RyZWFtKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkjZ2VuZXJhdGVDUkwoSW5wdXRTdHJlYW0KKyAgICAgKiAgICAgICAgaW5TdHJlYW0pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZW5lcmF0ZUNSTCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVDUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS04MTQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKS5nZW5lcmF0ZUNSTCgKKyAgICAgICAgICAgICAgICAgICAgKElucHV0U3RyZWFtKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNSTEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDUkxFeGNlcHRpb24gZSkge30KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDRVJUSUZJQ0FURVNfRU5DT0RFRF9YNTA5ID0geworICAgICAgICAgICAgLy8gQ0VSVElGSUNBVEVTX0VOQ09ERURfWDUwOVswXQorICAgICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICAgICAgICAgICArICJNSUlDWlRDQ0FkSUNCUUwzQUFDMk1BMEdDU3FHU0liM0RRRUJBZ1VBTUY4eEN6QUpCZ05WQkFZVEFsVlRNU0F3XG4iCisgICAgICAgICAgICAgICAgICAgICsgIkhnWURWUVFLRXhkU1UwRWdSR0YwWVNCVFpXTjFjbWwwZVN3Z1NXNWpMakV1TUN3R0ExVUVDeE1sVTJWamRYSmxcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSUZObGNuWmxjaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TnpBeU1qQXdNREF3TURCYVxuIgorICAgICAgICAgICAgICAgICAgICArICJGdzA1T0RBeU1qQXlNelU1TlRsYU1JR1dNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2XG4iCisgICAgICAgICAgICAgICAgICAgICsgImNtNXBZVEVTTUJBR0ExVUVCeE1KVUdGc2J5QkJiSFJ2TVI4d0hRWURWUVFLRXhaVGRXNGdUV2xqY205emVYTjBcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiWlcxekxDQkpibU11TVNFd0h3WURWUVFMRXhoVVpYTjBJR0Z1WkNCRmRtRnNkV0YwYVc5dUlFOXViSGt4R2pBWVxuIgorICAgICAgICAgICAgICAgICAgICArICJCZ05WQkFNVEVXRnlaMjl1TG1WdVp5NXpkVzR1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCXG4iCisgICAgICAgICAgICAgICAgICAgICsgImlRS0JnUUNvZm1kWStQaVVXTjAxRk96RWV3ZitHYUcrbEZmMTMyVXB6QVRtWUprQTRBRUEvanVXN2pTaStMSmtcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAid0pLaTVHTzRSeVpveWltQUwvNXlJV0RWNmwxS2x2eHlLc2xyMFJFaE1CYUQvM1ozRXNMVFRFZjVnVnJRUzZzVFxuIgorICAgICAgICAgICAgICAgICAgICArICJXTW9TWkF5ekIzOWtGZnNCNm9VWE50VjgrVUtLeFN4S2J4dmhRbjI2N1BlQ3o1VlgyUUlEQVFBQk1BMEdDU3FHXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlNJYjNEUUVCQWdVQUEzNEFYbDNhdDZsdWlWLzdJOU1ONUNYWW9QSllJOEJjZGMxaEJhZ0p2VE1jbWxxTDJ1T1pcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSDlUNWhOTUVMOVRrNmFJN3laUFhjdy94STJLNnBPUi9Gck1wMFV3Sm1keFg3bGpWNlp0VVpmN3BZNDkyVXF3Q1xuIgorICAgICAgICAgICAgICAgICAgICArICIxNzc3WFE5VUVaeXJLSnZGNW50bGVlTzBheUJxTEdWS0NXeldaWDlZc1hDcHY0N0ZOTFpidXBFPVxuIgorICAgICAgICAgICAgICAgICAgICArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLAorCisgICAgICAgICAgICAvLyBDRVJUSUZJQ0FURVNfRU5DT0RFRF9YNTA5WzFdCisgICAgICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1JSUNaekNDQWRDZ0F3SUJBZ0lCR3pBTkJna3Foa2lHOXcwQkFRVUZBREJoTVFzd0NRWURWUVFHRXdKVlV6RVlcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVFxuIgorICAgICAgICAgICAgICAgICAgICArICJBMUJMU1RFY01Cb0dBMVVFQXhNVFJHOUVJRkJMU1NCTlpXUWdVbTl2ZENCRFFUQWVGdzA1T0RBNE1ETXlNakF5XG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1qbGFGdzB3T0RBNE1EUXlNakF5TWpsYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJnd0ZnWURWUVFLRXc5VkxsTXVcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSUVkdmRtVnlibTFsYm5ReEREQUtCZ05WQkFzVEEwUnZSREVNTUFvR0ExVUVDeE1EVUV0Sk1Sd3dHZ1lEVlFRRFxuIgorICAgICAgICAgICAgICAgICAgICArICJFeE5FYjBRZ1VFdEpJRTFsWkNCU2IyOTBJRU5CTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCXG4iCisgICAgICAgICAgICAgICAgICAgICsgImdRRGJyTS9KOUZySlNYK3p4RlVic0k5Vnc1UWJndVZCSWE5NXJ3Vy8wTTgrc00wcjVnZCtEWTZpdWJtNnduWGtcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQ1N2YmZRbEZFRFNLcjRXWWVlR3ArZDlXbERuUWR0REZMZEE0NXRDaTVTSGpuVytoR0FtWm5sZDByejZ3UWVrRlxuIgorICAgICAgICAgICAgICAgICAgICArICI1eFFhYTVBNndqaE1sTE9qYmgyN3p5c2Nyb3JNSjFPNUZCT1duRUhjUnY2eHFRSURBUUFCb3k4d0xUQWRCZ05WXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkhRNEVGZ1FVVnJtWVI2bTk3MDFjSFEzcjVrWHlHN3pzQ04wd0RBWURWUjBUQkFVd0F3RUIvekFOQmdrcWhraUdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiOXcwQkFRVUZBQU9CZ1FEVlgxWTBZcUM3dmVrZVpqVnh0eXVDOE1ueGJyejZEMTA5QVgwN0xFSVJ6Tll6d1owd1xuIgorICAgICAgICAgICAgICAgICAgICArICJNVEltU3A5c0V6V1crM0Z1ZUJJVTdBeEd5czJPN1gwcW1OM3pnc3pQZlNpb2NCdVF1WElZUWN0SmhLakY1S1ZjXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlZHUVJZWWx0K215aGwydnk2eVB6RVZDamlLd01FYjFTcHUwaXJDZitsRlcyaHNkanZtU1FNdFp2T3c9PVxuIgorICAgICAgICAgICAgICAgICAgICArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLAorCisgICAgICAgICAgICAvLyBDRVJUSUZJQ0FURVNfRU5DT0RFRF9YNTA5WzJdCisgICAgICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1JSUQ2VENDQTFLZ0F3SUJBZ0lCR2pBTkJna3Foa2lHOXcwQkFRVUZBREJoTVFzd0NRWURWUVFHRXdKVlV6RVlcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVFxuIgorICAgICAgICAgICAgICAgICAgICArICJBMUJMU1RFY01Cb0dBMVVFQXhNVFJHOUVJRkJMU1NCTlpXUWdVbTl2ZENCRFFUQWVGdzA1T0RBNE1ESXhOalExXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk16aGFGdzB3TXpBNE1ESXhOalExTXpoYU1GWXhDekFKQmdOVkJBWVRBbFZUTVJnd0ZnWURWUVFLRXc5VkxsTXVcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSUVkdmRtVnlibTFsYm5ReEREQUtCZ05WQkFzVEEwUnZSREVNTUFvR0ExVUVDeE1EVUV0Sk1SRXdEd1lEVlFRRFxuIgorICAgICAgICAgICAgICAgICAgICArICJFd2hOWldRZ1EwRXRNVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBeVVjcncxazZRS2RCXG4iCisgICAgICAgICAgICAgICAgICAgICsgIldqZ3RHT2sxQVZhcUpOSThhY0RHZ2xocVFROTRRWWZxWkt1bzF3d2RuWWVocmdvNVFjR2t3OVhjakJZZWdMRnNcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAidjROQ0N3WjJwZ3NmWUpsdkhjU0dQaFQvd1JPVVlFcFhLZWxmWGlFZWFHaEZsOHpHY3F0ZUkyK0VCYk9abkZwalxuIgorICAgICAgICAgICAgICAgICAgICArICJZNHkrMjVkUWNqWW5yUkdNQVE5OHFHd1F0b2dEaURjQ0F3RUFBYU9DQWJvd2dnRzJNQllHQTFVZElBUVBNQTB3XG4iCisgICAgICAgICAgICAgICAgICAgICsgIkN3WUpZSVpJQVdVQ0FRc0RNQjhHQTFVZEl3UVlNQmFBRkZhNW1FZXB2ZTlOWEIwTjYrWkY4aHU4N0FqZE1Bd0dcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQTFVZEpBUUZNQU9BQVFBd0hRWURWUjBPQkJZRUZETTZGT2dKWjJHSVpTUWc3SGx3UXRlbWt4NzJNQTRHQTFVZFxuIgorICAgICAgICAgICAgICAgICAgICArICJEd0VCL3dRRUF3SUJoakIrQmdOVkhSSUVkekIxaG5Oc1pHRndPaTh2WkhNdE1TNWphR0Z0WWk1a2FYTmhMbTFwXG4iCisgICAgICAgICAgICAgICAgICAgICsgImJDOWpiaVV6WkVSdlJDVXlNRkJMU1NVeU1FMWxaQ1V5TUZKdmIzUWxNakJEUVNVeVkyOTFKVE5rVUV0SkpUSWdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiWTI5MUpUTmtSRzlFSlRKamJ5VXpaRlV1VXk0bE1qQkhiM1psY201dFpXNTBKVEpqWXlVelpGVlRNQThHQTFVZFxuIgorICAgICAgICAgICAgICAgICAgICArICJFd0VCL3dRRk1BTUJBZjh3Z2F3R0ExVWRId1NCcERDQm9UQ0JucUNCbTZDQm1JYUJsV3hrWVhBNkx5OWtjeTB4XG4iCisgICAgICAgICAgICAgICAgICAgICsgIkxtTm9ZVzFpTG1ScGMyRXViV2xzTDJOdUpUTmtSRzlFSlRJd1VFdEpKVEl3VFdWa0pUSXdVbTl2ZENVeU1FTkJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSlRKamIzVWxNMlJRUzBrbE1tTnZkU1V6WkVSdlJDVXlZMjhsTTJSVkxsTXVKVEl3UjI5MlpYSnViV1Z1ZENVeVxuIgorICAgICAgICAgICAgICAgICAgICArICJZMk1sTTJSVlV6OWpaWEowYVdacFkyRjBaVkpsZG05allYUnBiMjVNYVhOMEpUTmlZbWx1WVhKNU1BMEdDU3FHXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlNJYjNEUUVCQlFVQUE0R0JBRm81L1R1MGRzeTh0eWhKVnZ4YUtGTk1mUDNMTGFzcGwrT3I4b0NwbmNLZHBLeWpcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiN1pPNnVKMG43b3F2RWFVVGhtOGpnWFNOZ3l0dGxZUHdvTkJ4RXNUcS9sQkRWMyt5L2M2MXBzdzNxTTJib0IxSFxuIgorICAgICAgICAgICAgICAgICAgICArICJPaTN4WG5SWStldEczM1ROOXl5ZHpyWjUyWE0waG5KWmQ0eElmb0FncXM0VDJyZ3FnOGh4MHlkVTdvNG9cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIiwKKworICAgICAgICAgICAgLy8gQ0VSVElGSUNBVEVTX0VOQ09ERURfWDUwOVszXQorICAgICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICAgICAgICAgICArICJNSUlEVmpDQ0FyK2dBd0lCQWdJQlJUQU5CZ2txaGtpRzl3MEJBUVVGQURCV01Rc3dDUVlEVlFRR0V3SlZVekVZXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQTFCTFNURVJNQThHQTFVRUF4TUlUV1ZrSUVOQkxURXdIaGNOT1Rnd09EQXlNVGN4TXpJNVdoY05NREV3T0RBeVxuIgorICAgICAgICAgICAgICAgICAgICArICJNVGN4TXpJNVdqQndNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURU5NQXNHQTFVRUN4TUVWVk5CUmpFY01Cb0dcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQTFVRUF4TVRaSE10TVM1amFYTjBkeTV6WVdsakxtTnZiVENCblRBTkJna3Foa2lHOXcwQkFRRUZBQU9CaXdBd1xuIgorICAgICAgICAgICAgICAgICAgICArICJnWWNDZ1lFQTE5b0pzc3BTSG5XRGkxL05UdGhiTHJuaWNEb2dnM2M2M1pIUGVkVTFZRDkwTDFvZ2tZenhTQTJ0XG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1nc1ZacE5lakJnbEU5NzJtWEtQcUVHRG9qbkRnbHRSZ1JMdExxaXNJczBEU0ZRckpyaEE4ZWdNSC9wSEFvOUhcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZkgwbjlyUVVZQkkzZHNMeFFrR1ZVU2JCNFA4M1ZIaTBzUU8wZFdzcTVtRVpkOUcrTWZzQ0FRT2pnZ0VhTUlJQlxuIgorICAgICAgICAgICAgICAgICAgICArICJGakFXQmdOVkhTQUVEekFOTUFzR0NXQ0dTQUZsQWdFTEF6QWZCZ05WSFNNRUdEQVdnQlF6T2hUb0NXZGhpR1VrXG4iCisgICAgICAgICAgICAgICAgICAgICsgIklPeDVjRUxYcHBNZTlqQWRCZ05WSFE0RUZnUVVjUWFZTzhFRWpqZStWSTN2ZkJJbERDNkhOajB3RGdZRFZSMFBcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQVFIL0JBUURBZ1VnTUF3R0ExVWRFd0VCL3dRQ01BQXdnWjBHQTFVZEh3U0JsVENCa2pDQmo2Q0JqS0NCaVlhQlxuIgorICAgICAgICAgICAgICAgICAgICArICJobXhrWVhBNkx5OWtjeTB4TG1Ob1lXMWlMbVJwYzJFdWJXbHNMMk51SlROa1RXVmtKVEl3UTBFbE1tUXhKVEpqXG4iCisgICAgICAgICAgICAgICAgICAgICsgImIzVWxNMlJRUzBrbE1tTnZkU1V6WkVSdlJDVXlZMjhsTTJSVkxsTXVKVEl3UjI5MlpYSnViV1Z1ZENVeVkyTWxcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTTJSVlV6OWpaWEowYVdacFkyRjBaVkpsZG05allYUnBiMjVNYVhOMEpUTmlZbWx1WVhKNU1BMEdDU3FHU0liM1xuIgorICAgICAgICAgICAgICAgICAgICArICJEUUVCQlFVQUE0R0JBRWc3QUM5YmFkMktaenlYNGNxTFUvbXYyY2JWZzZ0RVMyUEllU1Q3bms4Q1FjdjlhOElPXG4iCisgICAgICAgICAgICAgICAgICAgICsgIjNLNHVocktvVHNRZnFzOXA2KzZzMFZiZ0gzUEt2T0FJRjREQXA1WXExenozZkIraHNhRmxlSHF0RE51bGRtMStcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiM1hBMk9xYTVhUkZrYjZLcnV0MEVFT1Y0Yy9HRUFQT3JSR1VUelltT3A0U0VjOFRFYUQvNzVBN1JcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIiwKKworICAgICAgICAgICAgLy8gQ0VSVElGSUNBVEVTX0VOQ09ERURfWDUwOVs0XQorICAgICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICAgICAgICAgICArICJNSUlEWERDQ0FzV2dBd0lCQWdJQlNqQU5CZ2txaGtpRzl3MEJBUVVGQURCV01Rc3dDUVlEVlFRR0V3SlZVekVZXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQTFCTFNURVJNQThHQTFVRUF4TUlUV1ZrSUVOQkxURXdIaGNOT1Rnd09EQXlNVGd3TWpRd1doY05NREV3T0RBeVxuIgorICAgICAgICAgICAgICAgICAgICArICJNVGd3TWpRd1dqQjBNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURU5NQXNHQTFVRUN4TUVWVk5CUmpFZ01CNEdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQTFVRUF4TVhSM1Z0WW5rdVNtOXpaWEJvTGpBd01EQXdNRFV3TkRRd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRFxuIgorICAgICAgICAgICAgICAgICAgICArICJnWTBBTUlHSkFvR0JBTFQvUjdiUHFzMWMxWXFYQWc1SE5wWkxnVzJIdUFjN1JDYVAwNmNFNFI0NEdCTHcvZlFjXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlZSTkxuNXBnYlRYc0RuamlaVmQ4cUVnWXFqS0ZRa2E0L3ROaGFGN05vMnRCWkIrb1lML2VQMElXdFAraC9XNkRcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiS1I1K1V2SUlkZ214N2szdDlqcDJRNTFKcEhoaEtFYjlXTjU0dHJDTzlZdTdQWVUrTEk4NWpFSUJBZ01CQUFHalxuIgorICAgICAgICAgICAgICAgICAgICArICJnZ0VhTUlJQkZqQVdCZ05WSFNBRUR6QU5NQXNHQ1dDR1NBRmxBZ0VMQXpBZkJnTlZIU01FR0RBV2dCUXpPaFRvXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkNXZGhpR1VrSU94NWNFTFhwcE1lOWpBZEJnTlZIUTRFRmdRVWtMQkpsK2F5S2d6T3Avd3dCWDlNMWxTa0NnNHdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRGdZRFZSMFBBUUgvQkFRREFnYkFNQXdHQTFVZEV3RUIvd1FDTUFBd2daMEdBMVVkSHdTQmxUQ0JrakNCajZDQlxuIgorICAgICAgICAgICAgICAgICAgICArICJqS0NCaVlhQmhteGtZWEE2THk5a2N5MHhMbU5vWVcxaUxtUnBjMkV1Yldsc0wyTnVKVE5rVFdWa0pUSXdRMEVsXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1tUXhKVEpqYjNVbE0yUlFTMGtsTW1OdmRTVXpaRVJ2UkNVeVkyOGxNMlJWTGxNdUpUSXdSMjkyWlhKdWJXVnVcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZENVeVkyTWxNMlJWVXo5alpYSjBhV1pwWTJGMFpWSmxkbTlqWVhScGIyNU1hWE4wSlROaVltbHVZWEo1TUEwR1xuIgorICAgICAgICAgICAgICAgICAgICArICJDU3FHU0liM0RRRUJCUVVBQTRHQkFGamFwdURITXZJZFVlWVJ5RVlkU2hCUjFKWkMyMHRKM01RbnlCUXZlZGR6XG4iCisgICAgICAgICAgICAgICAgICAgICsgIkxHRkRHcElrUkFRVTdULzUvbmU4bE1leHl4VmlDMjF4T2xLOUxkYkpDYlZ5eXd2Yjl1RW0vMWplOXdpZVFRdHJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAia2p5a3VCK1dCNnFUQ0lzbEFPL2VVbWd6ZnpJRU52bkg4TytmSDdRVHIyUGRrRmtpUElxQkpZSHZ3N0YzWERxeVxuIgorICAgICAgICAgICAgICAgICAgICArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLAorCisgICAgICAgICAgICAvLyBDRVJUSUZJQ0FURVNfRU5DT0RFRF9YNTA5WzVdCisgICAgICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1JSURsRENDQXYyZ0F3SUJBZ0lCR1RBTkJna3Foa2lHOXcwQkFRVUZBREJjTVFzd0NRWURWUVFHRXdKVlV6RVlcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVFxuIgorICAgICAgICAgICAgICAgICAgICArICJBMUJMU1RFWE1CVUdBMVVFQXhNT1RXVmtJRVZ0WVdsc0lFTkJMVEV3SGhjTk9UZ3dPREF5TVRnd05qTTBXaGNOXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1EQXdPREF5TVRnd05qTTBXakNCbVRFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTEV3TlFTMGt4RFRBTEJnTlZCQXNUQkZWVFxuIgorICAgICAgICAgICAgICAgICAgICArICJRVVl4SURBZUJnTlZCQU1URjBkMWJXSjVMa3B2YzJWd2FDNHdNREF3TURBMU1EUTBNU013SVFZSktvWklodmNOXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkFRa0JGaFJuZFcxaWVVQmphWE4wZHk1ellXbGpMbU52YlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZ1lrQ2dZRUF2VTRMTW9PbkY5Ym1oSHZ4Wno4d0NjOWVSSjBqNFJCMFNtVllvcTlpUHJTSkJ3Uk9ldXh1VThWU1xuIgorICAgICAgICAgICAgICAgICAgICArICJKQkwvdStSQjV0NlVKVk5qWEZtQjF3UzBmb3hwT0hGUUJGV3l2V211T2lSVU5hUnhUVkNyTzRlRytubU0vVTg5XG4iCisgICAgICAgICAgICAgICAgICAgICsgIkRLQWM5RlY0Ylo4ZFBFOVBsSzlvcTBKOFkyRElLejErZ0llTTFzVFBNbkR0RmdmR3lIOENBd0VBQWFPQ0FTWXdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZ2dFaU1CWUdBMVVkSUFRUE1BMHdDd1lKWUlaSUFXVUNBUXNETUI4R0ExVWRJd1FZTUJhQUZKY3JTSE4vYSthTlxuIgorICAgICAgICAgICAgICAgICAgICArICJMNURLMU5wSlVJdlgrYlZuTUIwR0ExVWREZ1FXQkJSNTBOOTdBeEswRzZVMTdFUDFpdTM4TGlMVEJ6QU9CZ05WXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkhROEJBZjhFQkFNQ0JhQXdEQVlEVlIwVEFRSC9CQUl3QURDQnFRWURWUjBmQklHaE1JR2VNSUdib0lHWW9JR1ZcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiaG9HU2JHUmhjRG92TDJSekxURXVZMmhoYldJdVpHbHpZUzV0YVd3Nk16a3dMMk51SlROa1RXVmtKVEl3UlcxaFxuIgorICAgICAgICAgICAgICAgICAgICArICJhV3dsTWpCRFFTVXlaREVsTW1OdmRTVXpaRkJMU1NVeVkyOTFKVE5rUkc5RUpUSmpieVV6WkZVdVV5NGxNakJIXG4iCisgICAgICAgICAgICAgICAgICAgICsgImIzWmxjbTV0Wlc1MEpUSmpZeVV6WkZWVFAyTmxjblJwWm1sallYUmxVbVYyYjJOaGRHbHZia3hwYzNRbE0ySmlcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiYVc1aGNua3dEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFBOXo4aDdLNHYwQ3VPeXZtQUxObDhUUXQwaW5mMHc1MlxuIgorICAgICAgICAgICAgICAgICAgICArICJKSlV2dy8zRkxBNjIySUhlL3ZDOVZIeUlGMGliU0VsaldlT0J1UmpvTUVMQVpHWEN3UnU0M28yTERScUhyNFBjXG4iCisgICAgICAgICAgICAgICAgICAgICsgIldsRzB1VXRnSFRQeGJacGFVd3VlSVpDQlpnNTdmN1pobHViN0FnK0FqZU95YkZqM0ZZcURCN1RZcVdKZ0FzLzdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZzVXZk5FVkFFd2M9XG4iICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIsCisKKyAgICAgICAgICAgIC8vIENFUlRJRklDQVRFU19FTkNPREVEX1g1MDlbNl0KKyAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlJRUVqQ0NBN3lnQXdJQkFnSUlFdDRyNGdBQUFsSXdEUVlKS29aSWh2Y05BUUVFQlFBd2daTXhDekFKQmdOVlxuIgorICAgICAgICAgICAgICAgICAgICArICJCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SlhRVEVRTUE0R0ExVUVCeE1IVW1Wa2JXOXVaREVUTUJFR0ExVUVDaE1LXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlYybHVaRzkzY3lCT1ZERWJNQmtHQTFVRUN4TVNSR2x6ZEhKcFluVjBaV1FnVTNsemRHVnRNVE13TVFZRFZRUURcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRXlwTmFXTnliM052Wm5RZ1EyVnlkR2xtYVdOaGRHVWdVMlZ5ZG1WeUlGUmxjM1FnUjNKdmRYQWdRMEV3SGhjTlxuIgorICAgICAgICAgICAgICAgICAgICArICJPVGN4TVRJMU1Ua3dOREl5V2hjTk9UZ3hNREUwTVRneE1USTRXakJ1TVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkExVUVDQk1DVjBFeEVEQU9CZ05WQkFjVEIxSmxaRzF2Ym1ReEhqQWNCZ05WQkFvVEZVMXBZM0p2YzI5bWRDQkRcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiYjNKd2IzSmhkR2x2YmpFTk1Bc0dBMVVFQ3hNRVJGTlpVekVSTUE4R0ExVUVBeE1JUTJWeWRGUmxjM1F3V3pBTlxuIgorICAgICAgICAgICAgICAgICAgICArICJCZ2txaGtpRzl3MEJBUUVGQUFOS0FEQkhBa0I2aEtnYlltZThndENmMVZ5NzRLVk5MZjJvL1Ixa1FWRFNaaU5tXG4iCisgICAgICAgICAgICAgICAgICAgICsgImxCU0VzSEFKU0xYdXVWZFlzS28vaHphcnI5Z0dtSS9nVXptYXJnWTF4SkdRWWJhekFnTUJBQUdqZ2dJWE1JSUNcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRXpDQnp3WURWUjBqQklISE1JSEVnQlMzaFRJUnVCWmFPaWJodDFEWmpuVFVnL0lpUmFHQm1hU0JsakNCa3pFTFxuIgorICAgICAgICAgICAgICAgICAgICArICJNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxkQk1SQXdEZ1lEVlFRSEV3ZFNaV1J0YjI1a01STXdFUVlEXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlZRUUtFd3BYYVc1a2IzZHpJRTVVTVJzd0dRWURWUVFMRXhKRWFYTjBjbWxpZFhSbFpDQlRlWE4wWlcweE16QXhcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQmdOVkJBTVRLazFwWTNKdmMyOW1kQ0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJaWElnVkdWemRDQkhjbTkxY0NCRFxuIgorICAgICAgICAgICAgICAgICAgICArICJRWUlRRVJOaEFLb0Evb1VSMFVTNTRpZ1VZekNCdlFZRFZSMGZCSUcxTUlHeU1GYWdWS0JTaGxCb2RIUndPaTh2XG4iCisgICAgICAgICAgICAgICAgICAgICsgIlEwVlNWRk5TVmk5RFpYSjBVM0oyTDBObGNuUkZibkp2Ykd3dlRXbGpjbTl6YjJaMElFTmxjblJwWm1sallYUmxcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSUZObGNuWmxjaUJVWlhOMElFZHliM1Z3SUVOQkxtTnliREJZb0ZhZ1ZJWlNabWxzWlRvdkwxeGNRMFZTVkZOU1xuIgorICAgICAgICAgICAgICAgICAgICArICJWbHhEWlhKMFUzSjJYRU5sY25SRmJuSnZiR3hjVFdsamNtOXpiMlowSUVObGNuUnBabWxqWVhSbElGTmxjblpsXG4iCisgICAgICAgICAgICAgICAgICAgICsgImNpQlVaWE4wSUVkeWIzVndJRU5CTG1OeWJEQUpCZ05WSFJNRUFqQUFNSFFHQ0NzR0FRVUZCd0VCQkdnd1pqQmtcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQmdnckJnRUZCUWN3QW9aWWFIUjBjRG92TDBORlVsUlRVbFl2UTJWeWRGTnlkaTlEWlhKMFJXNXliMnhzTDBORlxuIgorICAgICAgICAgICAgICAgICAgICArICJVbFJUVWxaZlRXbGpjbTl6YjJaMElFTmxjblJwWm1sallYUmxJRk5sY25abGNpQlVaWE4wSUVkeWIzVndJRU5CXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkxtTnlkREFOQmdrcWhraUc5dzBCQVFRRkFBTkJBRmJFajRqLzNOdjZXY0F2cTI0Qzd5dzhMMEZjeUU0ZHRMTFhcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiVSswNFAwUE9lL2RveVRUNlVuZ1hOWHA5UlhwcURTaUlIQlJUc2hwdlIrTjJ2d2VSNXFBPVxuIgorICAgICAgICAgICAgICAgICAgICArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLAorCisgICAgICAgICAgICAvLyBDRVJUSUZJQ0FURVNfRU5DT0RFRF9YNTA5WzddCisgICAgICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1JSUVZVENDQkF1Z0F3SUJBZ0lJRlZpV213QUFBbG93RFFZSktvWklodmNOQVFFRUJRQXdnWk14Q3pBSkJnTlZcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pYUVRFUU1BNEdBMVVFQnhNSFVtVmtiVzl1WkRFVE1CRUdBMVVFQ2hNS1xuIgorICAgICAgICAgICAgICAgICAgICArICJWMmx1Wkc5M2N5Qk9WREViTUJrR0ExVUVDeE1TUkdsemRISnBZblYwWldRZ1UzbHpkR1Z0TVRNd01RWURWUVFEXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkV5cE5hV055YjNOdlpuUWdRMlZ5ZEdsbWFXTmhkR1VnVTJWeWRtVnlJRlJsYzNRZ1IzSnZkWEFnUTBFd0hoY05cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiT1RjeE1USTJNRFl6TnpFNFdoY05PVGd4TURFME1UZ3hNVEk0V2pDQm1qRWpNQ0VHQ1NxR1NJYjNEUUVKQVJZVVxuIgorICAgICAgICAgICAgICAgICAgICArICJZV3hzWVc1alFHMXBZM0p2YzI5bWRDNWpiMjB4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SlhRVEVRXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1BNEdBMVVFQnhNSFVtVmtiVzl1WkRFZU1Cd0dBMVVFQ2hNVlRXbGpjbTl6YjJaMElFTnZjbkJ2Y21GMGFXOXVcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTVEwd0N3WURWUVFMRXdSRVUxbFRNUmd3RmdZRFZRUURFdzlCYkd4aGJpQktMaUJEYjI5d1pYSXdXekFOQmdrcVxuIgorICAgICAgICAgICAgICAgICAgICArICJoa2lHOXcwQkFRRUZBQU5LQURCSEFrQjE5NTF1Wkx5SlhqU1pUYzhaMVFudVh2S0JBcW0yV1Q0T0ZhRnlTRi9GXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlduTWJJbEFFMHB2c3pEa0taK043aEJ6Y2M1cFZJamV6UGZaOGNQaC8valZQQWdNQkFBR2pnZ0k1TUlJQ05UQUxcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQmdOVkhROEVCQU1DQURnd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3UXdnYzhHQTFVZEl3U0J4ekNCeElBVVxuIgorICAgICAgICAgICAgICAgICAgICArICJ0NFV5RWJnV1dqb200YmRRMlk1MDFJUHlJa1doZ1pta2daWXdnWk14Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlZRUUlFd0pYUVRFUU1BNEdBMVVFQnhNSFVtVmtiVzl1WkRFVE1CRUdBMVVFQ2hNS1YybHVaRzkzY3lCT1ZERWJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUJrR0ExVUVDeE1TUkdsemRISnBZblYwWldRZ1UzbHpkR1Z0TVRNd01RWURWUVFERXlwTmFXTnliM052Wm5RZ1xuIgorICAgICAgICAgICAgICAgICAgICArICJRMlZ5ZEdsbWFXTmhkR1VnVTJWeWRtVnlJRlJsYzNRZ1IzSnZkWEFnUTBHQ0VCRVRZUUNxQVA2RkVkRkV1ZUlvXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkZHTXdnYjBHQTFVZEh3U0J0VENCc2pCV29GU2dVb1pRYUhSMGNEb3ZMME5GVWxSVFVsWXZRMlZ5ZEZOeWRpOURcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiWlhKMFJXNXliMnhzTDAxcFkzSnZjMjltZENCRFpYSjBhV1pwWTJGMFpTQlRaWEoyWlhJZ1ZHVnpkQ0JIY205MVxuIgorICAgICAgICAgICAgICAgICAgICArICJjQ0JEUVM1amNtd3dXS0JXb0ZTR1VtWnBiR1U2THk5Y1hFTkZVbFJUVWxaY1EyVnlkRk55ZGx4RFpYSjBSVzV5XG4iCisgICAgICAgICAgICAgICAgICAgICsgImIyeHNYRTFwWTNKdmMyOW1kQ0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJaWElnVkdWemRDQkhjbTkxY0NCRFFTNWpcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiY213d0NRWURWUjBUQkFJd0FEQjBCZ2dyQmdFRkJRY0JBUVJvTUdZd1pBWUlLd1lCQlFVSE1BS0dXR2gwZEhBNlxuIgorICAgICAgICAgICAgICAgICAgICArICJMeTlEUlZKVVUxSldMME5sY25SVGNuWXZRMlZ5ZEVWdWNtOXNiQzlEUlZKVVUxSldYMDFwWTNKdmMyOW1kQ0JEXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlpYSjBhV1pwWTJGMFpTQlRaWEoyWlhJZ1ZHVnpkQ0JIY205MWNDQkRRUzVqY25Rd0RRWUpLb1pJaHZjTkFRRUVcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQlFBRFFRQTFUWXNrMDd0VzBkaFU2YkhQSzdOWEhVRkZpWjJmQXRDMGVwTFk5RzZ5dVliMWxvelB2NXNEbkNsMVxuIgorICAgICAgICAgICAgICAgICAgICArICJBMmZaUGdhd3ZBcUN2Szl4a3Y1TDRqMkYrdjRVXG4iCisgICAgICAgICAgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIsCisKKyAgICAgICAgICAgIC8vIENFUlRJRklDQVRFU19FTkNPREVEX1g1MDlbOF0KKyAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlJRVlqQ0NCQXlnQXdJQkFnSUlGVnNIYVFBQUFsd3dEUVlKS29aSWh2Y05BUUVFQlFBd2daTXhDekFKQmdOVlxuIgorICAgICAgICAgICAgICAgICAgICArICJCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SlhRVEVRTUE0R0ExVUVCeE1IVW1Wa2JXOXVaREVUTUJFR0ExVUVDaE1LXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlYybHVaRzkzY3lCT1ZERWJNQmtHQTFVRUN4TVNSR2x6ZEhKcFluVjBaV1FnVTNsemRHVnRNVE13TVFZRFZRUURcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRXlwTmFXTnliM052Wm5RZ1EyVnlkR2xtYVdOaGRHVWdVMlZ5ZG1WeUlGUmxjM1FnUjNKdmRYQWdRMEV3SGhjTlxuIgorICAgICAgICAgICAgICAgICAgICArICJPVGN4TVRJMk1EWXpPVFU0V2hjTk9UZ3hNREUwTVRneE1USTRXakNCbWpFak1DRUdDU3FHU0liM0RRRUpBUllVXG4iCisgICAgICAgICAgICAgICAgICAgICsgIllXeHNZVzVqUUcxcFkzSnZjMjltZEM1amIyMHhDekFKQmdOVkJBWVRBbFZUTVFzd0NRWURWUVFJRXdKWFFURVFcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUE0R0ExVUVCeE1IVW1Wa2JXOXVaREVlTUJ3R0ExVUVDaE1WVFdsamNtOXpiMlowSUVOdmNuQnZjbUYwYVc5dVxuIgorICAgICAgICAgICAgICAgICAgICArICJNUTB3Q3dZRFZRUUxFd1JFVTFsVE1SZ3dGZ1lEVlFRREV3OUJiR3hoYmlCS0xpQkRiMjl3WlhJd1hEQU5CZ2txXG4iCisgICAgICAgICAgICAgICAgICAgICsgImhraUc5dzBCQVFFRkFBTkxBREJJQWtFQTBUMXRkOGtmc0pnd204UWoranRycTI5dHFjL0RJa0liQVBjeXlnS0dcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiMVhFVXZ6UUVRdW1WUXg1bENEMkxPT0pzMGVPdXY0aDZuZ3ZMVytnb0RhaWROUUlEQVFBQm80SUNPVENDQWpVd1xuIgorICAgICAgICAgICAgICAgICAgICArICJDd1lEVlIwUEJBUURBZ0RBTUJNR0ExVWRKUVFNTUFvR0NDc0dBUVVGQndNSU1JSFBCZ05WSFNNRWdjY3dnY1NBXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkZMZUZNaEc0RmxvNkp1RzNVTm1PZE5TRDhpSkZvWUdacElHV01JR1RNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQTFVRUNCTUNWMEV4RURBT0JnTlZCQWNUQjFKbFpHMXZibVF4RXpBUkJnTlZCQW9UQ2xkcGJtUnZkM01nVGxReFxuIgorICAgICAgICAgICAgICAgICAgICArICJHekFaQmdOVkJBc1RFa1JwYzNSeWFXSjFkR1ZrSUZONWMzUmxiVEV6TURFR0ExVUVBeE1xVFdsamNtOXpiMlowXG4iCisgICAgICAgICAgICAgICAgICAgICsgIklFTmxjblJwWm1sallYUmxJRk5sY25abGNpQlVaWE4wSUVkeWIzVndJRU5CZ2hBUkUyRUFxZ0QraFJIUlJMbmlcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiS0JSak1JRzlCZ05WSFI4RWdiVXdnYkl3VnFCVW9GS0dVR2gwZEhBNkx5OURSVkpVVTFKV0wwTmxjblJUY25ZdlxuIgorICAgICAgICAgICAgICAgICAgICArICJRMlZ5ZEVWdWNtOXNiQzlOYVdOeWIzTnZablFnUTJWeWRHbG1hV05oZEdVZ1UyVnlkbVZ5SUZSbGMzUWdSM0p2XG4iCisgICAgICAgICAgICAgICAgICAgICsgImRYQWdRMEV1WTNKc01GaWdWcUJVaGxKbWFXeGxPaTh2WEZ4RFJWSlVVMUpXWEVObGNuUlRjblpjUTJWeWRFVnVcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiY205c2JGeE5hV055YjNOdlpuUWdRMlZ5ZEdsbWFXTmhkR1VnVTJWeWRtVnlJRlJsYzNRZ1IzSnZkWEFnUTBFdVxuIgorICAgICAgICAgICAgICAgICAgICArICJZM0pzTUFrR0ExVWRFd1FDTUFBd2RBWUlLd1lCQlFVSEFRRUVhREJtTUdRR0NDc0dBUVVGQnpBQ2hsaG9kSFJ3XG4iCisgICAgICAgICAgICAgICAgICAgICsgIk9pOHZRMFZTVkZOU1ZpOURaWEowVTNKMkwwTmxjblJGYm5KdmJHd3ZRMFZTVkZOU1ZsOU5hV055YjNOdlpuUWdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiUTJWeWRHbG1hV05oZEdVZ1UyVnlkbVZ5SUZSbGMzUWdSM0p2ZFhBZ1EwRXVZM0owTUEwR0NTcUdTSWIzRFFFQlxuIgorICAgICAgICAgICAgICAgICAgICArICJCQVVBQTBFQVVQWHQycE9ZM1l3UlVIekQ3RHRneXg1RzdLeEt0TGFuMXdGQkZqaHY0MDZ2MlV0YisyK3dUUWxTXG4iCisgICAgICAgICAgICAgICAgICAgICsgInVsV2VtY204ZU9kRzY0bnNwdjBvcVNKbkE4ZjR4Zz09XG4iCisgICAgICAgICAgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIsCisKKyAgICAgICAgICAgIC8vIENFUlRJRklDQVRFU19FTkNPREVEX1g1MDlbOV0KKyAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlJQ2lUQ0NBZklDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3Z1l3eEN6QUpCZ05WQkFZVEFsVlRNUlV3RXdZRFxuIgorICAgICAgICAgICAgICAgICAgICArICJWUVFJRXd4T2IzSjBhQ0JFWVd0dmRHRXhGREFTQmdOVkJBY1RDMGR5WVc1a0lFWnZjbXR6TVJZd0ZBWURWUVFLXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkV3MVZUa1FnUVdWeWIzTndZV05sTVJnd0ZnWURWUVFERkE5eWIyOTBRR056TG5WdVpDNWxaSFV4SGpBY0Jna3FcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiaGtpRzl3MEJDUUVXRDNKdmIzUkFZM011ZFc1a0xtVmtkVEFlRncwNU9UQXpNREl5TURVNE5EUmFGdzB3T1RBeVxuIgorICAgICAgICAgICAgICAgICAgICArICJNamN5TURVNE5EUmFNSUdNTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNCTU1UbTl5ZEdnZ1JHRnJiM1JoXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1SUXdFZ1lEVlFRSEV3dEhjbUZ1WkNCR2IzSnJjekVXTUJRR0ExVUVDaE1OVlU1RUlFRmxjbTl6Y0dGalpURVlcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUJZR0ExVUVBeFFQY205dmRFQmpjeTUxYm1RdVpXUjFNUjR3SEFZSktvWklodmNOQVFrQkZnOXliMjkwUUdOelxuIgorICAgICAgICAgICAgICAgICAgICArICJMblZ1WkM1bFpIVXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTG1sUUpnNU5sMlZzUVoxXG4iCisgICAgICAgICAgICAgICAgICAgICsgIi9COGZXNFlEZGswOVNsVmM3dnlXY2JjbWJXUkJKZWUwamNINDQ4WGRSUC9tL01YSVJzVkt5aExBNWYwMStWUHlcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRTJhRGt4MldpVTREcHFiTWJHR0F5dHVYQk51ZEpRbUJYaldFRmlBR2U3ZFlnRE5HS0s3WW8xazQ5UTZxR2c5cVxuIgorICAgICAgICAgICAgICAgICAgICArICI1ZGlkMytwcHN5ZnpiZWFpRENIMExPNWdlZ052QWdNQkFBRXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFKbm9rXG4iCisgICAgICAgICAgICAgICAgICAgICsgIjFndmo0S0M5SGVVWC9SNFEvZjV0YkoyakxlUUFUSUh0VXg5UVNLU3E3SXNkWTB6ejlFbktPc2M5cHI4SmZCVExcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiY0F3cnhxdmw1UXVvQ0ZWUjJ0UXE4RHRCUVk4dnA3YkVGMkNaVm94WkpYTUlLS2lEL0hqYjBveXBicTV3RjBTWVxuIgorICAgICAgICAgICAgICAgICAgICArICJ4TjVEVWZHNXNTaGkrdlBJQXdFNjJ0WjFQMUkxTjhEUXBEWWlYa3c9XG4iCisgICAgICAgICAgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIsCisKKyAgICAgICAgICAgIC8vIENFUlRJRklDQVRFU19FTkNPREVEX1g1MDlbMTBdCisgICAgICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1JSUNXRENDQWdJQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd2diWXhDekFKQmdOVkJBWVRBbHBCTVJVd0V3WURcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiVlFRSUV3eFhaWE4wWlhKdUlFTmhjR1V4RWpBUUJnTlZCQWNUQ1VOaGNHVWdWRzkzYmpFZE1Cc0dBMVVFQ2hNVVxuIgorICAgICAgICAgICAgICAgICAgICArICJWR2hoZDNSbElFTnZibk4xYkhScGJtY2dZMk14SHpBZEJnTlZCQXNURmtObGNuUnBabWxqWVhScGIyNGdVMlZ5XG4iCisgICAgICAgICAgICAgICAgICAgICsgImRtbGpaWE14RnpBVkJnTlZCQU1URG5kM2R5NTBhR0YzZEdVdVkyOXRNU013SVFZSktvWklodmNOQVFrQkZoUjNcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiWldKdFlYTjBaWEpBZEdoaGQzUmxMbU52YlRBZUZ3MDVOakV4TVRReE56RTFNalZhRncwNU5qRXlNVFF4TnpFMVxuIgorICAgICAgICAgICAgICAgICAgICArICJNalZhTUlHMk1Rc3dDUVlEVlFRR0V3SmFRVEVWTUJNR0ExVUVDQk1NVjJWemRHVnliaUJEWVhCbE1SSXdFQVlEXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlZRUUhFd2xEWVhCbElGUnZkMjR4SFRBYkJnTlZCQW9URkZSb1lYZDBaU0JEYjI1emRXeDBhVzVuSUdOak1SOHdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSFFZRFZRUUxFeFpEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWek1SY3dGUVlEVlFRREV3NTNkM2N1ZEdoaFxuIgorICAgICAgICAgICAgICAgICAgICArICJkM1JsTG1OdmJURWpNQ0VHQ1NxR1NJYjNEUUVKQVJZVWQyVmliV0Z6ZEdWeVFIUm9ZWGQwWlM1amIyMHdYREFOXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkJna3Foa2lHOXcwQkFRRUZBQU5MQURCSUFrRUFtcElsN2FSM2FTUFVVd1VySHpwVk1yc20zZ3BJMlB6SXdNaDNcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiOWwxaC9Sc3pJMC8wcUMyV1JNbGZ3bTVGYXBvaG95alRKNlp5R1VVZW5JQ2xsS3lLWndJREFRQUJNQTBHQ1NxR1xuIgorICAgICAgICAgICAgICAgICAgICArICJTSWIzRFFFQkJBVUFBMEVBZkk1N1dMa09LRXlRcXlDRFlaNnJlQ3VrVkRtQWU3blpTYk95S3Y2S1V2VENpUTVjXG4iCisgICAgICAgICAgICAgICAgICAgICsgImU1TDR5M2MvVmlLZGxvdTVCY1FZQWJ4QTdyd08vdno0bTUxdzR3PT1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIiwKKworICAgICAgICAgICAgLy8gQ0VSVElGSUNBVEVTX0VOQ09ERURfWDUwOVsxMV0KKyAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlJREdqQ0NBdGdDQkRhUlc0c3dDd1lIS29aSXpqZ0VBd1VBTUhNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RHYkc5eVxuIgorICAgICAgICAgICAgICAgICAgICArICJhV1JoTVJRd0VnWURWUVFIRXd0SFlXbHVaWE4yYVd4c1pURVFNQTRHQTFVRUNoTUhWVzVyYm05M2JqRVFNQTRHQTFVRUN4TUhWVzVyXG4iCisgICAgICAgICAgICAgICAgICAgICsgImJtOTNiakVZTUJZR0ExVUVBeE1QVW05aVpYSjBJRXg1WW1GeVoyVnlNQjRYRFRrNU1ERXdOVEF3TWpNek9Wb1hEVGs1TURRd05UQXdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTWpNek9Wb3djekVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVEIwWnNiM0pwWkdFeEZEQVNCZ05WQkFjVEMwZGhhVzVsYzNacFxuIgorICAgICAgICAgICAgICAgICAgICArICJiR3hsTVJBd0RnWURWUVFLRXdkVmJtdHViM2R1TVJBd0RnWURWUVFMRXdkVmJtdHViM2R1TVJnd0ZnWURWUVFERXc5U2IySmxjblFnXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlRIbGlZWEpuWlhJd2dnRzNNSUlCTEFZSEtvWkl6amdFQVRDQ0FSOENnWUVBL1g5VGdSMTFFaWxTMzBxY0x1ems1L1lSdDFJODcwUUFcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAid3g0L2dMWlJKbWxGWFVBaVVmdFpQWTFZK3IvRjlib3c5c3ViVld6WGdUdUFIVFJ2OG1aZ3QydVpVS1drbjUvb0JIc1FJc0pQdTZuWFxuIgorICAgICAgICAgICAgICAgICAgICArICIvcmZHRy9nN1YrZkdxS1lWRHdUN2cvYlR4UjdEQWpWVUUxb1drVEwyZGZPdUsySFhLdS95SWdNWm5kRklBY2NDRlFDWFlGQ1BGU01MXG4iCisgICAgICAgICAgICAgICAgICAgICsgInpMS1N1WUtpNjRRTDhGZ2M5UUtCZ1FEMzRhQ0YxcHM5M3N1OHExdzJ1RmU1ZVpTdnUvbzY2b0w1VjB3TFBRZUNaMUZaVjQ2NjFGbFBcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiNW5FSEVJR0F0RWtXY1NQb1RDZ1dFN2ZQQ1RLTXlLYmhQQlo2aTFSOGpTamdvNjRlSzdPbWRaRnVvMzhMK2lFMVl2SDdZbm9CSkR2TVxuIgorICAgICAgICAgICAgICAgICAgICArICJwUEcrcUZHUWlhaUQzK0ZhNVo4R2tvdG1Yb0I3VlNWa0FVdzcvczlKS2dPQmhBQUNnWUJNaHMvWGNGMExBamJ1aG9BWTRFT214ZDRVXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlUwdzRuU0pRMnZLY2dweUhVMVN2L3RiVXIzeEVtNll5eDQ5ajFlTnA5alZ3TTFhNk5ZWDhCTzhmQ1NISWlVVnZKVkZsQ2NvTzdRYjhcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiUHg3ZHJmYkZBRnQ4bUZFMW1qWUN1ajIxZVBIaHMxRGxaS0p3dTJFbEM2R2FSd3RCazMrb0NNREFuTHV5U2QwK2ZBb2hkREFMQmdjcVxuIgorICAgICAgICAgICAgICAgICAgICArICJoa2pPT0FRREJRQURMd0F3TEFJVWRkYnFDM3dvTWNBQmcvcjFHUFc5ZVZOU3RHd0NGQ0JHeVN2ZFhLMGk0YUxWQzRQdGJjM1BRRmpwXG4iCisgICAgICAgICAgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIsCisKKyAgICAgICAgICAgIC8vQ0VSVElGSUNBVEVTX0VOQ09ERURfWDUwOVsxMl0KKyAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlJQ3l6Q0NBalFDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3Z2EweEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFxuIgorICAgICAgICAgICAgICAgICAgICArICJWUVFJRXdoT1pYY2dXVzl5YXpFV01CUUdBMVVFQnhNTlRtVjNJRmx2Y21zZ1EybDBlVEVjTUJvR0ExVUVDaE1UXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlEyOXNkVzFpYVdFZ1ZXNXBkbVZ5YzJsMGVURU5NQXNHQTFVRUN4TUVRV05KVXpFZk1CMEdBMVVFQXhNV1EyOXNcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZFcxaWFXRWdWVzVwZG1WeWMybDBlU0JEUVRFbE1DTUdDU3FHU0liM0RRRUpBUllXWTJWeWRDMWhkWFJvUUdOdlxuIgorICAgICAgICAgICAgICAgICAgICArICJiSFZ0WW1saExtVmtkVEFlRncwNU56QTBNamd4TkRReE1ETmFGdzB3TURBME1qZ3hORFF4TUROYU1JR3RNUXN3XG4iCisgICAgICAgICAgICAgICAgICAgICsgIkNRWURWUVFHRXdKVlV6RVJNQThHQTFVRUNCTUlUbVYzSUZsdmNtc3hGakFVQmdOVkJBY1REVTVsZHlCWmIzSnJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSUVOcGRIa3hIREFhQmdOVkJBb1RFME52YkhWdFltbGhJRlZ1YVhabGNuTnBkSGt4RFRBTEJnTlZCQXNUQkVGalxuIgorICAgICAgICAgICAgICAgICAgICArICJTVk14SHpBZEJnTlZCQU1URmtOdmJIVnRZbWxoSUZWdWFYWmxjbk5wZEhrZ1EwRXhKVEFqQmdrcWhraUc5dzBCXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkNRRVdGbU5sY25RdFlYVjBhRUJqYjJ4MWJXSnBZUzVsWkhVd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlHSkFvR0JBTmlvZDZmbHpNNzJDYnNLLzNnekh6Y2RqcG9velJERC93Z3EzMWpFZURkZktZK2xqQXd4YVpTOVxuIgorICAgICAgICAgICAgICAgICAgICArICJtdDdTMWc3bEwrNTVmeDdGamZKeHZKUlh2UzlVYkRVNDZQRER5SmxvV1lvYmc4NGJLNVpjVjVVbklQWm1HSFcvXG4iCisgICAgICAgICAgICAgICAgICAgICsgIi94VkRVdElHaGM0VCtYbTVwNEYrNEFjZ2V3RjJzNFRiS1d4ZkM5OEZKZmVwYzMxS2prR2JBZ01CQUFFd0RRWUpcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiS29aSWh2Y05BUUVFQlFBRGdZRUFJL2U2eEMrb3NWTTRlTWtTVVVXZ2lodW9jUWxSTDlpeFRsR3FXOWZ2TmxJMVxuIgorICAgICAgICAgICAgICAgICAgICArICJxNThmRUxVNWJjRmtvN2QwMlM5RWdhYy85Y2trdC9zYkhNdjl6UWhmbnZwb2w4Qk4rTGl2R3UrMDlJaU9XNHlxXG4iCisgICAgICAgICAgICAgICAgICAgICsgImM5eFQ1OFB2OWd3Wi9FaTVWUytGWHZ6SElyOTF5V0lsd0xzbktmZ1lEcm1Rb3dHNUZrSFNHMVpvdFVkbDdPbz1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIiwKKworICAgICAgICAgICAgLy9DRVJUSUZJQ0FURVNfRU5DT0RFRF9YNTA5WzEzXQorICAgICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICAgICAgICAgICArICJNSUlDbmpDQ0FnY0NBUU13RFFZSktvWklodmNOQVFFRUJRQXdnYUF4Q3pBSkJnTlZCQVlUQWtsVU1SNHdIQVlEXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlZRUUtFeFZRYjJ4cGRHVmpibWxqYnlCa2FTQlViM0pwYm04eEl6QWhCZ05WQkFzVEdrbERSUzFVUlV3Z1NYUmhcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiYkdsaGJpQkRRU0JtYjNJZ1YxZFhNU0F3SGdZRFZRUURFeGREWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMFxuIgorICAgICAgICAgICAgICAgICAgICArICJlVEVxTUNnR0NTcUdTSWIzRFFFSkFSWWJkM2QzTFdOaExXbDBRR2xqWlMxMFpXd3VjRzlzYVhSdkxtbDBNQjRYXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkRUazJNVEF3TWpFeE5EUTBORm9YRFRrM01USXdNVEV4TkRRME5Gb3dnWTB4Q3pBSkJnTlZCQVlUQWtsVU1ROHdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRFFZRFZRUUhFd1pVYjNKcGJtOHhIakFjQmdOVkJBb1RGVkJ2YkdsMFpXTnVhV052SUdScElGUnZjbWx1YnpFT1xuIgorICAgICAgICAgICAgICAgICAgICArICJNQXdHQTFVRUN4TUZRMlZUU1ZReEdUQVhCZ05WQkFNVEVIVnNhWE56WlM1d2IyeHBkRzh1YVhReElqQWdCZ2txXG4iCisgICAgICAgICAgICAgICAgICAgICsgImhraUc5dzBCQ1FFV0UzZGxZbTFoYzNSbGNrQndiMnhwZEc4dWFYUXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZ1kwQU1JR0pBb0dCQU1VcS9GZHJ4YlNmR3RHWnEvRlRUZ0MxSnF4TzRpaUhpeXh0Z1JUMW9FdkpJVWphalZSTlxuIgorICAgICAgICAgICAgICAgICAgICArICJkdEJWVWhXNkptaEhqZS9xbk1vcDA5WGNGN2I4OWE5YWh0RzlqTTcwUzAzYmlYVm1nNjZwV09weTZQN3puQVFqXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlZGUG9DUlI3QnFVaUdxMDQxOWExMDFBY2Fxa3hpLzREZHFpVFBlZTRIN21jRFpZdStmRFBOUWFIQWdNQkFBRXdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRFFZSktvWklodmNOQVFFRUJRQURnWUVBdDE1YnprMFhPK1pNK1E2Mjc1VlRRSW9uNktRUUhudjlOZmxJRk9vV1xuIgorICAgICAgICAgICAgICAgICAgICArICJmZ0dSbW95aUpGcmpVMXNJUzhjdEYwM0RIMnhSMjBDdUtkOThmQnBLbm9PTGQ3ZVRLQUd6R0ZQbWwzNlRQVmorXG4iCisgICAgICAgICAgICAgICAgICAgICsgIllZV2RyV3FuSXpRbjZGME9LUi9VM1krb3Q1ZlVOdXFOMzZRMXdzVnZwUEpsT014OEQ4T1F5OGFpbkhnRzNZWUFcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiVEprPVxuIiArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLAorCisgICAgICAgICAgICAvL0NFUlRJRklDQVRFU19FTkNPREVEX1g1MDlbMTRdCisgICAgICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1JSUMxVENDQWo2Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRUUZBREJaTVFzd0NRWURWUVFHRXdKVlV6RWZcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUIwR0ExVUVDaE1XVlc1cGRtVnljMmwwZVNCdlppQkRiMnh2Y21Ga2J6RVdNQlFHQTFVRUN4TU5VM2x6ZEdWdFxuIgorICAgICAgICAgICAgICAgICAgICArICJJRTltWm1salpURVJNQThHQTFVRUF4TUlWVTFUSUVOQkxURXdIaGNOT1Rnd05URXhNakV3TWpVMFdoY05NRGd3XG4iCisgICAgICAgICAgICAgICAgICAgICsgIk5URXdNakV3TWpVMFdqQlpNUXN3Q1FZRFZRUUdFd0pWVXpFZk1CMEdBMVVFQ2hNV1ZXNXBkbVZ5YzJsMGVTQnZcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiWmlCRGIyeHZjbUZrYnpFV01CUUdBMVVFQ3hNTlUzbHpkR1Z0SUU5bVptbGpaVEVSTUE4R0ExVUVBeE1JVlUxVFxuIgorICAgICAgICAgICAgICAgICAgICArICJJRU5CTFRFd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFMR2Y4Tnkra0hsWHFMVGkzdUlmXG4iCisgICAgICAgICAgICAgICAgICAgICsgIm1reHh3REpkMTRzT2craHY4NXB4c3F6Q1JKRWdPeDVZRFV0MDVoSjdOMHM0ckovZ05VY0phS1I2dWwrcUxHYldcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiK1piNFMxWUZibkthTzE2emdndmdja3dwTEdZUkJibWVlOStFNDdXOFZFT1pXckpYVWtwSi9aVjhHQW5lc3J2blxuIgorICAgICAgICAgICAgICAgICAgICArICJYVEVLZm03Ylg5czZSN0ZRZkRvSE5uUWZBZ01CQUFHamdhd3dnYWt3RVFZSllJWklBWWI0UWdFQkJBUURBZ0QyXG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1COEdBMVVkSXdRWU1CYUFGT3FsSUQ5RXI2ZEkwOW45THZuYnkrRklTaTdvTUZRR0NXQ0dTQUdHK0VJQkRRUkhcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRmtWRmVIUmxibVJsWkNCRFFTQkRaWEowYVdacFkyRjBaU0JtY205dElESTBJRTF2Ym5Sb2N5QjBieUF4TWpBZ1xuIgorICAgICAgICAgICAgICAgICAgICArICJUVzl1ZEdoekxpQWdSRlJISUQwZ01EVXhNVEU1T1Rnd0hRWURWUjBPQkJZRUZPcWxJRDlFcjZkSTA5bjlMdm5iXG4iCisgICAgICAgICAgICAgICAgICAgICsgInkrRklTaTdvTUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUZORm8yN0plZUlnc01xUzdOYS8vNmdKUVJpbHh3VlNcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQmZ4Nko0M1lYNDdFZ05ETG40SjdCOVRzdCsyYkRaREFrMWxaeXU0eTJXQ0xybmZnL2U2QjFLWUJoQ3QvU3JzY1xuIgorICAgICAgICAgICAgICAgICAgICArICJyK1dvbUZjdzE5azFqQnRCYVl4VndoLzlONHBwWkdkS0lMQUNjaVhieGZvTGJiTmdTRHg1K0tiRTJjMm05aXM3XG4iCisgICAgICAgICAgICAgICAgICAgICsgIk1JWmdSZXhUdm5KYVxuIiArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iIH07Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5U3BpVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeVNwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjk3NTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeVNwaVRlc3QuamF2YQpAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeVNwaTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGk7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkNlcnRpZmljYXRlRmFjdG9yeVNwaTwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVGYWN0b3J5U3BpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ2VydFN0b3JlU3BpVGVzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZUZhY3RvcnlTcGlUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRmFjdG9yeVNwaTwvY29kZT4gY29uc3RydWN0b3IgCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRmFjdG9yeVNwaQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlRmFjdG9yeVNwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkwMSgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENSTEV4Y2VwdGlvbiB7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVNwaSBjZXJ0RmFjdG9yeVNwaSA9IG5ldyBleHRDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGJhaXMpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGJhaXMsICIiKTsKKyAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gbGlzdCA9IG51bGw7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGxpc3QpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZXRDZXJ0UGF0aEVuY29kaW5ncygpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlIGNjID0gY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZShiYWlzKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgQ2VyaWZpY2F0ZSIsIGNjKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydGlmaWNhdGUobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbiBjb2wgPSBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlcyhiYWlzKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTm90IG51bGwgQ29sbGVjdGlvbiIsIGNvbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlcyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIENSTCBjY0NSTCA9IGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ1JMKGJhaXMpOworICAgICAgICBhc3NlcnROdWxsKCJOb3QgbnVsbCBDUkwiLCBjY0NSTCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNSTChudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNSTEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDUkxFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xDUkwgPSBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNSTHMoYmFpcyk7CisgICAgICAgIGFzc2VydE51bGwoIk5vdCBudWxsIENSTCIsIGNvbENSTCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNSTHMobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJDUkxFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRmFjdG9yeVNwaTwvY29kZT4gY29uc3RydWN0b3IgCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRmFjdG9yeVNwaQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5U3BpMDIoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBDUkxFeGNlcHRpb24geworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkgY2VydEZhY3RvcnlTcGkgPSBuZXcgTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkoKTsKKyAgICAgICAgTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkucHV0TW9kZSh0cnVlKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGJhaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChiYWlzKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGRpcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGJhaXMsICJhYSIpOworICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGRpcywgIiIpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChkaXMsICJzcyIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlKGJhaXMpOworICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlcyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0ID0gY2VydEZhY3RvcnlTcGkKKyAgICAgICAgICAgICAgICAuZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZShkaXMpOworICAgICAgICBhc3NlcnROdWxsKCJSZXN1bHQgbXVzdCBiZSBudWxsIiwgY2VydCk7CisgICAgICAgIENvbGxlY3Rpb24gY29sID0gY2VydEZhY3RvcnlTcGkKKyAgICAgICAgICAgICAgICAuZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZXMoZGlzKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiUmVzdWx0IG11c3QgYmUgbnVsbCIsIGNvbCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ1JMKGJhaXMpOworICAgICAgICAgICAgZmFpbCgiQ1JMRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ1JMcyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNSTEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDUkxFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIENSTCBjcmwgPSBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNSTChkaXMpOworICAgICAgICBhc3NlcnROdWxsKCJSZXN1bHQgbXVzdCBiZSBudWxsIiwgY3JsKTsKKyAgICAgICAgY29sID0gY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDUkxzKGRpcyk7CisgICAgICAgIGFzc2VydE51bGwoIlJlc3VsdCBtdXN0IGJlIG51bGwiLCBjb2wpOworCisgICAgICAgIExpc3Q8Q2VydGlmaWNhdGU+IGxpc3QgPSBudWxsOworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgobGlzdCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgSXRlcmF0b3IgZW5jID0gY2VydEZhY3RvcnlTcGkuZW5naW5lR2V0Q2VydFBhdGhFbmNvZGluZ3MoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IEl0ZXJhdG9yIiwgZW5jLmhhc05leHQoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlRmFjdG9yeVNwaTwvY29kZT4gY29uc3RydWN0b3IgCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlRmFjdG9yeVNwaQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVGYWN0b3J5U3BpMDMoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBDUkxFeGNlcHRpb24geworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkgY2VydEZhY3RvcnlTcGkgPSBuZXcgTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkoKTsKKyAgICAgICAgTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkucHV0TW9kZShmYWxzZSk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShiYWlzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoYmFpcyk7CisgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoZGlzKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChiYWlzLCAiYWEiKTsKKyAgICAgICAgICAgIGZhaWwoIkNlcnRpZmljYXRlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGRpcywgIiIpOworICAgICAgICBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGRpcywgInNzIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydGlmaWNhdGUoYmFpcyk7CisgICAgICAgICAgICBmYWlsKCJDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydGlmaWNhdGVzKG51bGwpOworICAgICAgICAgICAgZmFpbCgiQ2VydGlmaWNhdGVFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIENlcnRpZmljYXRlIGNlcnQgPSBjZXJ0RmFjdG9yeVNwaQorICAgICAgICAgICAgICAgIC5lbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlKGRpcyk7CisgICAgICAgIGFzc2VydE51bGwoIlJlc3VsdCBtdXN0IGJlIG51bGwiLCBjZXJ0KTsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2wgPSBjZXJ0RmFjdG9yeVNwaQorICAgICAgICAgICAgICAgIC5lbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlcyhkaXMpOworICAgICAgICBhc3NlcnROdWxsKCJSZXN1bHQgbXVzdCBiZSBudWxsIiwgY29sKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDUkwoYmFpcyk7CisgICAgICAgICAgICBmYWlsKCJDUkxFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDUkxzKG51bGwpOworICAgICAgICAgICAgZmFpbCgiQ1JMRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKENSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgQ1JMIGNybCA9IGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ1JMKGRpcyk7CisgICAgICAgIGFzc2VydE51bGwoIlJlc3VsdCBtdXN0IGJlIG51bGwiLCBjcmwpOworICAgICAgICBjb2wgPSBjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNSTHMoZGlzKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiUmVzdWx0IG11c3QgYmUgbnVsbCIsIGNvbCk7CisKKyAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gbGlzdCA9IG51bGw7CisgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgobGlzdCk7CisgICAgICAgIEl0ZXJhdG9yIGVuYyA9IGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdldENlcnRQYXRoRW5jb2RpbmdzKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJJbmNvcnJlY3QgSXRlcmF0b3IiLCBlbmMuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKElucHV0U3RyZWFtKTwvY29kZT4gbWV0aG9kLgorICAgICAqIEFzc2VydGlvbjogR2VuZXJhdGVzIGEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IG9iamVjdCBhbmQgaW5pdGlhbGl6ZXMgaXQKKyAgICAgKiB3aXRoIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoIG1ldGhvZCByZXR1cm5zIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lR2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5naW5lR2VuZXJhdGVDZXJ0UGF0aExqYXZhX2lvX0lucHV0U3RyZWFtMDEoKSB7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVNwaSBjZXJ0RmFjdG9yeVNwaSA9IG5ldyBNeUNlcnRpZmljYXRlRmFjdG9yeVNwaSgpOworCisgICAgICAgIE15Q2VydGlmaWNhdGVGYWN0b3J5U3BpLnB1dE1vZGUodHJ1ZSk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShiYWlzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbChjZXJ0RmFjdG9yeVNwaS5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGRpcykpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKElucHV0U3RyZWFtKTwvY29kZT4gbWV0aG9kLgorICAgICAqIEFzc2VydGlvbjogR2VuZXJhdGVzIGEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IG9iamVjdCBhbmQgaW5pdGlhbGl6ZXMgaXQKKyAgICAgKiB3aXRoIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lR2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5naW5lR2VuZXJhdGVDZXJ0UGF0aExqYXZhX2lvX0lucHV0U3RyZWFtMDIoKSB7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVNwaSBjZXJ0RmFjdG9yeVNwaSA9IG5ldyBleHRDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkoKTsKKworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oYmFpcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoZGlzKTsKKyAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ2VydGlmaWNhdGVFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoSW5wdXRTdHJlYW0sIFN0cmluZyk8L2NvZGU+CisgICAgICogbWV0aG9kLiBBc3NlcnRpb246IGdlbmVyYXRlcyBhIDxjb2RlPkNlcnRQYXRoPC9jb2RlPiBvYmplY3QgYW5kCisgICAgICogaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgZGF0YSByZWFkIGZyb20gdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENlcnRpZmljYXRlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZ2luZUdlbmVyYXRlQ2VydFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEVuZ2luZUdlbmVyYXRlQ2VydFBhdGhMamF2YV9pb19JbnB1dFN0cmVhbV9MamF2YV9sYW5nX1N0cmluZzAxKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkgY2VydEZhY3RvcnlTcGkgPSBuZXcgTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkoKTsKKyAgICAgICAgTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkucHV0TW9kZSh0cnVlKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGJhaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChkaXMsICIiKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE51bGwoY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChkaXMsICJlbmNvZGluZyIpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbSwgU3RyaW5nKTwvY29kZT4KKyAgICAgKiBtZXRob2QuIEFzc2VydGlvbjogZ2VuZXJhdGVzIGEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IG9iamVjdCBhbmQKKyAgICAgKiBpbml0aWFsaXplcyBpdCB3aXRoIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lR2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5naW5lR2VuZXJhdGVDZXJ0UGF0aExqYXZhX2lvX0lucHV0U3RyZWFtX0xqYXZhX2xhbmdfU3RyaW5nMDIoKSB7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVNwaSBjZXJ0RmFjdG9yeVNwaSA9IG5ldyBleHRDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkoKTsKKworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oYmFpcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoZGlzLCAiZW5jb2RpbmciKTsKKyAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ2VydGlmaWNhdGVFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoTGlzdDw/IGV4dGVuZHMgQ2VydGlmaWNhdGU+KTwvY29kZT4KKyAgICAgKiBtZXRob2QgQXNzZXJ0aW9uOiBnZW5lcmF0ZXMgYSA8Y29kZT5DZXJ0UGF0aDwvY29kZT4gb2JqZWN0IGFuZAorICAgICAqIGluaXRpYWxpemVzIGl0IHdpdGggYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiA8Y29kZT5DZXJ0aWZpY2F0ZXM8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoIG1ldGhvZCByZXR1cm5zIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZW5naW5lR2VuZXJhdGVDZXJ0UGF0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEVuZ2luZUdlbmVyYXRlQ2VydFBhdGhMSmF2YV91dGlsX0xpc3QwMSgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5U3BpIGNlcnRGYWN0b3J5U3BpID0gbmV3IE15Q2VydGlmaWNhdGVGYWN0b3J5U3BpKCk7CisgICAgICAgIE15Q2VydGlmaWNhdGVGYWN0b3J5U3BpLnB1dE1vZGUodHJ1ZSk7CisgICAgICAgIExpc3Q8Q2VydGlmaWNhdGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENlcnRpZmljYXRlPigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKGNlcnRGYWN0b3J5U3BpLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgobGlzdCkpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENlcnRpZmljYXRlRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKExpc3Q8PyBleHRlbmRzIENlcnRpZmljYXRlPik8L2NvZGU+CisgICAgICogbWV0aG9kIEFzc2VydGlvbjogZ2VuZXJhdGVzIGEgPGNvZGU+Q2VydFBhdGg8L2NvZGU+IG9iamVjdCBhbmQKKyAgICAgKiBpbml0aWFsaXplcyBpdCB3aXRoIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgPGNvZGU+Q2VydGlmaWNhdGVzPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVuZ2luZUdlbmVyYXRlQ2VydFBhdGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmdpbmVHZW5lcmF0ZUNlcnRQYXRoTEphdmFfdXRpbF9MaXN0MDIoKSB7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeVNwaSBjZXJ0RmFjdG9yeVNwaSA9IG5ldyBleHRDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkoKTsKKworICAgICAgICBMaXN0PENlcnRpZmljYXRlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDZXJ0aWZpY2F0ZT4oKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2VydEZhY3RvcnlTcGkuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChsaXN0KTsKKyAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ2VydGlmaWNhdGVFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBleHRDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkgZXh0ZW5kcyBDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkgeworICAgICAgICBwdWJsaWMgQ2VydGlmaWNhdGUgZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZShJbnB1dFN0cmVhbSBpblN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGluU3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIklucHV0U3RyZWFtIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGVuZ2luZUdlbmVyYXRlQ2VydGlmaWNhdGVzKElucHV0U3RyZWFtIGluU3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoaW5TdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigiSW5wdXRTdHJlYW0gbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ1JMIGVuZ2luZUdlbmVyYXRlQ1JMKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgQ1JMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChpblN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENSTEV4Y2VwdGlvbigiSW5wdXRTdHJlYW0gbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZW5naW5lR2VuZXJhdGVDUkxzKElucHV0U3RyZWFtIGluU3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBDUkxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGluU3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ1JMRXhjZXB0aW9uKCJJbnB1dFN0cmVhbSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDZXJ0UGF0aCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKElucHV0U3RyZWFtIGluU3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChpblN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2VydFBhdGggZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbSBpblN0cmVhbSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChpblN0cmVhbSwgZW5jb2RpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENlcnRQYXRoIGVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoCisgICAgICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQ2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcykKKyAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoY2VydGlmaWNhdGVzKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTM2MzcxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb247CisKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RGlnZXN0RXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvblRlc3QoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UiIH07CisKKyAgICBzdGF0aWMgVGhyb3dhYmxlIHRDYXVzZSA9IG5ldyBUaHJvd2FibGUoIlRocm93YWJsZSBmb3IgZXhjZXB0aW9uIik7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uKCk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwKKyAgICAgKiBtZXNzYWdlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjAxKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24oKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHdpdGgKKyAgICAgKiBkZXRhaWwgbWVzc2FnZSBtc2cuIFBhcmFtZXRlciA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24wMigpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uKG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm46ICIuY29uY2F0KG1zZ3NbaV0pLCB0RQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbihTdHJpbmcpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24wMygpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gdEUgPSBuZXcgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBtc2cpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI3OWNjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOworCisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZAorICogbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb25UZXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG1zZ3MgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJDaGVjayBuZXcgbWVzc2FnZSIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UgQ2hlY2sgbmV3IG1lc3NhZ2UiIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgdENhdXNlID0gbmV3IFRocm93YWJsZSgiVGhyb3dhYmxlIGZvciBleGNlcHRpb24iKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uMDEoKSB7CisgICAgICAgIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB3aXRoIGRldGFpbCBtZXNzYWdlCisgICAgICogbXNnLiBQYXJhbWV0ZXIgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjAyKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm46ICIuY29uY2F0KG1zZ3NbaV0pLCB0RQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB3aGVuIDxjb2RlPm1zZzwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjAzKCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihtc2cpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24wNCgpIHsKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKKyAgICAgICAgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihjYXVzZSk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uMDUoKSB7CisgICAgICAgIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24odENhdXNlKTsKKyAgICAgICAgaWYgKHRFLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9TID0gdENhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCAoZ2V0TQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZih0b1MpICE9IC0xKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldENhdXNlKCkgbXVzdCByZXR1cm4gIi5jb25jYXQodENhdXNlLnRvU3RyaW5nKCkpLCB0RQorICAgICAgICAgICAgICAgIC5nZXRDYXVzZSgpLCB0Q2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB3aGVuCisgICAgICogPGNvZGU+Y2F1c2U8L2NvZGU+IGlzIG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uMDYoKSB7CisgICAgICAgIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB0RSA9IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24obnVsbCwKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uMDcoKSB7CisgICAgICAgIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24obXNnc1tpXSwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybjogIi5jb25jYXQobXNnc1tpXSksIHRFCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIG1zZ3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24wOCgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHRFID0gbmV3IENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbihudWxsLAorICAgICAgICAgICAgICAgIHRDYXVzZSk7CisgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRvUyA9IHRDYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgbXVzdCBzaG91bGQgIi5jb25jYXQodG9TKSwgKGdldE0KKyAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwgdEUKKyAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oU3RyaW5nLCBUaHJvd2FibGUpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yIEFzc2VydGlvbjogY29uc3RydWN0cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjA5KCkgeworICAgICAgICBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gdEU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdEUgPSBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChtc2dzW2ldLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IGNvbnRhaW4gIi5jb25jYXQobXNnc1tpXSksIGdldE0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKG1zZ3NbaV0pICE9IC0xKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdldE0uZXF1YWxzKG1zZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgdEUuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVhMDNiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydGlmaWNhdGU7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPiBmaWVsZHMgYW5kIG1ldGhvZHMKKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENlcnRpZmljYXRlLmNsYXNzKQorcHVibGljIGNsYXNzIENlcnRpZmljYXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBNZWFuaW5nbGVzcyBjZXJ0IGVuY29kaW5nIGp1c3QgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gdGVzdEVuY29kaW5nID0gbmV3IGJ5dGVbXSB7IChieXRlKSAxLCAoYnl0ZSkgMiwKKyAgICAgICAgICAgIChieXRlKSAzLCAoYnl0ZSkgNCwgKGJ5dGUpIDUgfTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDZXJ0aWZpY2F0ZVRlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Q2VydGlmaWNhdGUoU3RyaW5nIHR5cGUpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENlcnRpZmljYXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydGlmaWNhdGUgYzEgPSBuZXcgTXlDZXJ0aWZpY2F0ZSgiVEVTVF9UWVBFIiwgdGVzdEVuY29kaW5nKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0ZXN0RW5jb2RpbmcsIGMxLmdldEVuY29kZWQoKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURVNUIiwgYzEuZ2V0UHVibGljS2V5KCkuZ2V0QWxnb3JpdGhtKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDEsIChieXRlKSAyLCAoYnl0ZSkgMyB9LCBjMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQdWJsaWNLZXkoKS5nZXRFbmNvZGVkKCkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVEVTVF9GT1JNQVQiLCBjMS5nZXRQdWJsaWNLZXkoKS5nZXRGb3JtYXQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRFU1RfVFlQRSIsIGMxLmdldFR5cGUoKSk7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5oYXNoQ29kZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGhhc2ggb2YgdGhlIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPiBpbnN0YW5jZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGRpZmZlcmVudCBvYmplY3RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEhhc2hDb2RlKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZSBjMSA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworICAgICAgICBDZXJ0aWZpY2F0ZSBjMiA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworCisgICAgICAgIGFzc2VydFRydWUoYzEuaGFzaENvZGUoKSA9PSBjMi5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5oYXNoQ29kZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBoYXNoIGNvZGUgb2YgZXF1YWwgb2JqZWN0cyBzaG91bGQgYmUgdGhlIHNhbWUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBkaWZmZXJlbnQgb2JqZWN0cyAodGhlIHNhbWUgYXMgcHJldmlvdXMgdGVzdCkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFzaENvZGVFcXVhbHNPYmplY3QoKSB7CisgICAgICAgIENlcnRpZmljYXRlIGMxID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1RfVFlQRSIsIHRlc3RFbmNvZGluZyk7CisgICAgICAgIENlcnRpZmljYXRlIGMyID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1RfVFlQRSIsIHRlc3RFbmNvZGluZyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoYzEuaGFzaENvZGUoKSA9PSBjMi5oYXNoQ29kZSgpKSAmJiBjMS5lcXVhbHMoYzIpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFR5cGUoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGlzIGNlcnRpZmljYXRlIHR5cGUgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VHlwZSgpIHsKKyAgICAgICAgQ2VydGlmaWNhdGUgYzEgPSBuZXcgTXlDZXJ0aWZpY2F0ZSgiVEVTVF9UWVBFIiwgdGVzdEVuY29kaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURVNUX1RZUEUiLCBjMS5nZXRUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBvYmplY3QgZXF1YWxzIHRvIGl0c2VsZiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0MDEoKSB7CisgICAgICAgIENlcnRpZmljYXRlIGMxID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1RfVFlQRSIsIHRlc3RFbmNvZGluZyk7CisgICAgICAgIGFzc2VydFRydWUoYzEuZXF1YWxzKGMxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZXF1YWxzKE9iamVjdCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IG9iamVjdCBlcXVhbHMgdG8gb3RoZXIgPGNvZGU+Q2VydGlmaWNhdGU8L2NvZGU+CisgICAgICogaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBzdGF0ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICApCisgICAgfSkgICAgCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDAyKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZSBjMSA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworICAgICAgICBDZXJ0aWZpY2F0ZSBjMiA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworICAgICAgICBhc3NlcnRUcnVlKGMxLmVxdWFscyhjMikgJiYgYzIuZXF1YWxzKGMxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+ZXF1YWxzKE9iamVjdCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IG9iamVjdCBub3QgZXF1YWxzIHRvIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZXF1YWxzIG1ldGhvZCB3aXRoIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFcXVhbHNPYmplY3QwMygpIHsKKyAgICAgICAgQ2VydGlmaWNhdGUgYzEgPSBuZXcgTXlDZXJ0aWZpY2F0ZSgiVEVTVF9UWVBFIiwgdGVzdEVuY29kaW5nKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYzEuZXF1YWxzKG51bGwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5lcXVhbHMoT2JqZWN0KTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogb2JqZWN0IG5vdCBlcXVhbHMgdG8gb3RoZXIgd2hpY2ggaXMgbm90CisgICAgICogaW5zdGFuY2Ugb2YgPGNvZGU+Q2VydGlmaWNhdGU8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbmVnYXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDA0KCkgeworICAgICAgICBDZXJ0aWZpY2F0ZSBjMSA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworICAgICAgICBhc3NlcnRGYWxzZShjMS5lcXVhbHMoIlRFU1RfVFlQRSIpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHRoZSBmb2xsb3dpbmcgdGVzdHMganVzdCBjYWxsIG1ldGhvZHMKKyAgICAvLyB0aGF0IGFyZSBhYnN0cmFjdCBpbiA8Y29kZT5DZXJ0aWZpY2F0ZTwvY29kZT4KKyAgICAvLyAoU28gdGhleSBqdXN0IGxpa2Ugc2lnbmF0dXJlIHRlc3RzKQorICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QganVzdCBjYWxscyA8Y29kZT5nZXRFbmNvZGVkKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RW5jb2RlZCgpIHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQ2VydGlmaWNhdGUgYzEgPSBuZXcgTXlDZXJ0aWZpY2F0ZSgiVEVTVF9UWVBFIiwgdGVzdEVuY29kaW5nKTsKKyAgICAgICAgYzEuZ2V0RW5jb2RlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBqdXN0IGNhbGxzIDxjb2RlPnZlcmlmeShQdWJsaWNLZXkpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgb25seSBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlB1YmxpY0tleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFZlcmlmeVB1YmxpY0tleSgpCisgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLAorICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIENlcnRpZmljYXRlIGMxID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1RfVFlQRSIsIHRlc3RFbmNvZGluZyk7CisgICAgICAgIGMxLnZlcmlmeShudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QganVzdCBjYWxscyA8Y29kZT52ZXJpZnkoUHVibGljS2V5LFN0cmluZyk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG9ubHkgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZlcmlmeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlB1YmxpY0tleS5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFZlcmlmeVB1YmxpY0tleVN0cmluZygpCisgICAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLAorICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVFeGNlcHRpb24sCisgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIENlcnRpZmljYXRlIGMxID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1RfVFlQRSIsIHRlc3RFbmNvZGluZyk7CisgICAgICAgIGMxLnZlcmlmeShudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QganVzdCBjYWxscyA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBDZXJ0aWZpY2F0ZSBjMSA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworICAgICAgICBjMS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBqdXN0IGNhbGxzIDxjb2RlPnRlc3RHZXRQdWJsaWNLZXkoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHVibGljS2V5KCkgeworICAgICAgICBDZXJ0aWZpY2F0ZSBjMSA9IG5ldyBNeUNlcnRpZmljYXRlKCJURVNUX1RZUEUiLCB0ZXN0RW5jb2RpbmcpOworICAgICAgICBjMS5nZXRQdWJsaWNLZXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QganVzdCBjYWxscyA8Y29kZT53cml0ZVJlcGxhY2UoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRPZXNuJ3QgdmVyaWZ5IE9iamVjdFN0cmVhbUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cml0ZVJlcGxhY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0V3JpdGVSZXBsYWNlKCkgeworICAgICAgICBNeUNlcnRpZmljYXRlIGMxID0gbmV3IE15Q2VydGlmaWNhdGUoIlRFU1RfVFlQRSIsIHRlc3RFbmNvZGluZyk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGMxLndyaXRlUmVwbGFjZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvYmoudG9TdHJpbmcoKS5jb250YWlucygKKyAgICAgICAgICAgICAgICAgICAgImphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSRDZXJ0aWZpY2F0ZVJlcCIpKTsKKyAgICAgICAgfSBjYXRjaCAoT2JqZWN0U3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgT2JqZWN0U3RyZWFtRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyc1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIyMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0NvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0Lk15Q2VydGlmaWNhdGU7CisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyczwvY29kZT4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzLmNsYXNzKQorcHVibGljIGNsYXNzIENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyc1Rlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Q29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMoKTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzCisgICAgICogd2l0aCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIChhbiBlbXB0eSBhbmQgaW1tdXRhYmxlIENvbGxlY3Rpb24pIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzMDEoKSB7CisgICAgICAgIENlcnRTdG9yZVBhcmFtZXRlcnMgY3AgPSBuZXcgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaXNDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgY3AgaW5zdGFuY2VvZiBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Q29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnM8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycworICAgICAqIHdpdGggdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyAoYW4gZW1wdHkgYW5kIGltbXV0YWJsZSBDb2xsZWN0aW9uKSAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyczAyKCkgeworICAgICAgICBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9IG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycygpOworICAgICAgICBDb2xsZWN0aW9uIGMgPSBjcC5nZXRDb2xsZWN0aW9uKCk7CisgICAgICAgIGFzc2VydFRydWUoImlzRW1wdHkiLCBjLmlzRW1wdHkoKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBlbXB0eSBjb2xsZWN0aW9uIGlzIGltbXV0YWJsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdHJ5IHRvIG1vZGlmeSBpdAorICAgICAgICAgICAgYy5hZGQobmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIGZhaWwoImVtcHR5IGNvbGxlY3Rpb24gbXVzdCBiZSBpbW11dGFibGUiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPkNvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKENvbGxlY3Rpb24pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzQ29sbGVjdGlvbjAxKCkgeworICAgICAgICBWZWN0b3I8Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcyA9IG5ldyBWZWN0b3I8Q2VydGlmaWNhdGU+KCk7CisgICAgICAgIGNlcnRpZmljYXRlcy5hZGQobmV3IE15Q2VydGlmaWNhdGUoIlRFU1QiLCBuZXcgYnl0ZVtdIHt9KSk7CisgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyhjZXJ0aWZpY2F0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPkNvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKENvbGxlY3Rpb24pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogSWYgdGhlIHNwZWNpZmllZCA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBjb250YWlucyBhbiBvYmplY3QKKyAgICAgKiB0aGF0IGlzIG5vdCBhIDxjb2RlPkNlcnRpZmljYXRlPC9jb2RlPiBvciA8Y29kZT5DUkw8L2NvZGU+LCB0aGF0IG9iamVjdAorICAgICAqIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgQ29sbGVjdGlvbiA8Y29kZT5DZXJ0U3RvcmU8L2NvZGU+LiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzQ29sbGVjdGlvbjAyKCkgeworICAgICAgICAvLyBqdXN0IGNoZWNrIHRoYXQgd2UgYWJsZSB0byBjcmVhdGUgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMKKyAgICAgICAgLy8gb2JqZWN0IHBhc3NpbmcgQ29sbGVjdGlvbiBjb250YWluaW5nIE9iamVjdCB3aGljaCBpcyBub3QKKyAgICAgICAgLy8gYSBDZXJ0aWZpY2F0ZSBvciBDUkwKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gY2VydGlmaWNhdGVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGNlcnRpZmljYXRlcy5hZGQobmV3IFN0cmluZygiTm90IGEgQ2VydGlmaWNhdGUiKSk7CisgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyhjZXJ0aWZpY2F0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPkNvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKENvbGxlY3Rpb24pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogVGhlIENvbGxlY3Rpb24gaXMgbm90IGNvcGllZC4gSW5zdGVhZCwgYSByZWZlcmVuY2UgaXMgdXNlZC4KKyAgICAgKiBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIHN1YnNlcXVlbnRseSBhZGQgb3IgcmVtb3ZlIENlcnRpZmljYXRlcyBvcgorICAgICAqIENSTHMgZnJvbSB0aGUgQ29sbGVjdGlvbiwgdGh1cyBjaGFuZ2luZyB0aGUgc2V0IG9mIENlcnRpZmljYXRlcyBvciBDUkxzCisgICAgICogYXZhaWxhYmxlIHRvIHRoZSBDb2xsZWN0aW9uIENlcnRTdG9yZS4gVGhlIENvbGxlY3Rpb24gQ2VydFN0b3JlIHdpbGwKKyAgICAgKiBub3QgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgQ29sbGVjdGlvbiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzQ29sbGVjdGlvbjAzKCkgeworICAgICAgICBWZWN0b3I8Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcyA9IG5ldyBWZWN0b3I8Q2VydGlmaWNhdGU+KCk7CisgICAgICAgIC8vIGNyZWF0ZSB1c2luZyBlbXB0eSBjb2xsZWN0aW9uCisgICAgICAgIENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzIGNwID0KKyAgICAgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyhjZXJ0aWZpY2F0ZXMpOworICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSByZWZlcmVuY2UgaXMgdXNlZCAKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaXNSZWZVc2VkXzEiLCBjZXJ0aWZpY2F0ZXMgPT0gY3AuZ2V0Q29sbGVjdGlvbigpKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBjb2xsZWN0aW9uIHN0aWxsIGVtcHR5CisgICAgICAgIGFzc2VydFRydWUoImlzRW1wdHkiLCBjcC5nZXRDb2xsZWN0aW9uKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgLy8gbW9kaWZ5IG91ciBjb2xsZWN0aW9uCisgICAgICAgIGNlcnRpZmljYXRlcy5hZGQobmV3IE15Q2VydGlmaWNhdGUoIlRFU1QiLCBuZXcgYnl0ZVtdIHsoYnl0ZSkxfSkpOworICAgICAgICBjZXJ0aWZpY2F0ZXMuYWRkKG5ldyBNeUNlcnRpZmljYXRlKCJURVNUIiwgbmV3IGJ5dGVbXSB7KGJ5dGUpMn0pKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbnRlcm5hbCBzdGF0ZSBoYXMgYmVlbiBjaGFuZ2VkIGFjY29yZGluZ2x5CisgICAgICAgIGFzc2VydFRydWUoImlzUmVmVXNlZF8yIiwgY2VydGlmaWNhdGVzLmVxdWFscyhjcC5nZXRDb2xsZWN0aW9uKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyhDb2xsZWN0aW9uKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiAtIGlmCisgICAgICogPGNvZGU+Y29sbGVjdGlvbjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzQ29sbGVjdGlvbjA0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTlBFIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmNsb25lKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IFJldHVybnMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2xvbmUwMSgpIHsKKyAgICAgICAgVmVjdG9yPENlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMgPSBuZXcgVmVjdG9yPENlcnRpZmljYXRlPigpOworICAgICAgICBjZXJ0aWZpY2F0ZXMuYWRkKG5ldyBNeUNlcnRpZmljYXRlKCJURVNUIiwgbmV3IGJ5dGVbXSB7KGJ5dGUpNH0pKTsKKyAgICAgICAgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMgY3AxID0KKyAgICAgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyhjZXJ0aWZpY2F0ZXMpOworICAgICAgICBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBjcDIgPQorICAgICAgICAgICAgKENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKWNwMS5jbG9uZSgpOworICAgICAgICAvLyBjaGVjayB0aGF0IHRoYXQgd2UgaGF2ZSBuZXcgb2JqZWN0CisgICAgICAgIGFzc2VydFRydWUoY3AxICE9IGNwMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Y2xvbmUoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogLi4ub25seSBhIHJlZmVyZW5jZSB0byB0aGUgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4KKyAgICAgKiBpcyBjb3BpZWQsIGFuZCBub3QgdGhlIGNvbnRlbnRzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2xvbmUwMigpIHsKKyAgICAgICAgVmVjdG9yPENlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMgPSBuZXcgVmVjdG9yPENlcnRpZmljYXRlPigpOworICAgICAgICBjZXJ0aWZpY2F0ZXMuYWRkKG5ldyBNeUNlcnRpZmljYXRlKCJURVNUIiwgbmV3IGJ5dGVbXSB7KGJ5dGUpNH0pKTsKKyAgICAgICAgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMgY3AxID0KKyAgICAgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyhjZXJ0aWZpY2F0ZXMpOworICAgICAgICBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBjcDIgPQorICAgICAgICAgICAgKENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKWNwMS5jbG9uZSgpOworICAgICAgICAvLyBjaGVjayB0aGF0IGJvdGggb2JqZWN0cyBob2xkIHRoZSBzYW1lIHJlZmVyZW5jZQorICAgICAgICBhc3NlcnRUcnVlKGNwMS5nZXRDb2xsZWN0aW9uKCkgPT0gY3AyLmdldENvbGxlY3Rpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+Y2xvbmUoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogLi4ub25seSBhIHJlZmVyZW5jZSB0byB0aGUgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4KKyAgICAgKiBpcyBjb3BpZWQsIGFuZCBub3QgdGhlIGNvbnRlbnRzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2xvbmUwMygpIHsKKyAgICAgICAgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMgY3AxID0KKyAgICAgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycygpOworICAgICAgICBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBjcDIgPQorICAgICAgICAgICAgKENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKWNwMS5jbG9uZSgpOworICAgICAgICBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBjcDMgPQorICAgICAgICAgICAgKENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKWNwMi5jbG9uZSgpOworICAgICAgICAvLyBjaGVjayB0aGF0IGFsbCBvYmplY3RzIGhvbGQgdGhlIHNhbWUgcmVmZXJlbmNlCisgICAgICAgIGFzc2VydFRydWUoY3AxLmdldENvbGxlY3Rpb24oKSA9PSBjcDIuZ2V0Q29sbGVjdGlvbigpICYmCisgICAgICAgICAgICAgICAgICAgY3AzLmdldENvbGxlY3Rpb24oKSA9PSBjcDIuZ2V0Q29sbGVjdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGRlc2NyaWJpbmcgcGFyYW1ldGVycworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nMDEoKSB7CisgICAgICAgIENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzIGNwID0KKyAgICAgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycygpOworICAgICAgICBTdHJpbmcgcyA9IGNwLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZyBkZXNjcmliaW5nIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUb1N0cmluZzAyKCkgeworICAgICAgICBWZWN0b3I8Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcyA9IG5ldyBWZWN0b3I8Q2VydGlmaWNhdGU+KCk7CisgICAgICAgIGNlcnRpZmljYXRlcy5hZGQobmV3IE15Q2VydGlmaWNhdGUoIlRFU1QiLCBuZXcgYnl0ZVtdIHsoYnl0ZSk0fSkpOworICAgICAgICBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9CisgICAgICAgICAgICBuZXcgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMoY2VydGlmaWNhdGVzKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGNwLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldENvbGxlY3Rpb24oKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgQ29sbGVjdGlvbiAobmV2ZXIgbnVsbCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2xsZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENvbGxlY3Rpb24wMSgpIHsKKyAgICAgICAgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMgY3AgPSBuZXcgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjcC5nZXRDb2xsZWN0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmdldENvbGxlY3Rpb24oKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgQ29sbGVjdGlvbiAobmV2ZXIgbnVsbCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2xsZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENvbGxlY3Rpb24wMigpIHsKKyAgICAgICAgVmVjdG9yIGNlcnRpZmljYXRlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMgY3AgPQorICAgICAgICAgICAgbmV3IENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKGNlcnRpZmljYXRlcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY3AuZ2V0Q29sbGVjdGlvbigpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9MREFQQ2VydFN0b3JlUGFyYW1ldGVyc1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9MREFQQ2VydFN0b3JlUGFyYW1ldGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc1ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L0xEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuTERBUENlcnRTdG9yZVBhcmFtZXRlcnM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPmphdmEuc2VjdXJpdHkuY2VydC5MREFQQ2VydFN0b3JlUGFyYW1ldGVyczwvY29kZT4KKyAqIGZpZWxkcyBhbmQgbWV0aG9kcworICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTERBUENlcnRTdG9yZVBhcmFtZXRlcnMuY2xhc3MpCitwdWJsaWMgY2xhc3MgTERBUENlcnRTdG9yZVBhcmFtZXRlcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBMREFQQ2VydFN0b3JlUGFyYW1ldGVyc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUZXN0cworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5MREFQQ2VydFN0b3JlUGFyYW1ldGVycygpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+TERBUENlcnRTdG9yZVBhcmFtZXRlcnM8L2NvZGU+CisgICAgICogd2l0aCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIChzZXJ2ZXIgbmFtZSAibG9jYWxob3N0IiwgcG9ydCAzODkpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTERBUENlcnRTdG9yZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TERBUENlcnRTdG9yZVBhcmFtZXRlcnMwMSgpIHsKKyAgICAgICAgQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9IG5ldyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRUcnVlKCJpc0xEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICBjcCBpbnN0YW5jZW9mIExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5MREFQQ2VydFN0b3JlUGFyYW1ldGVycygpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+TERBUENlcnRTdG9yZVBhcmFtZXRlcnM8L2NvZGU+CisgICAgICogd2l0aCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIChzZXJ2ZXIgbmFtZSAibG9jYWxob3N0IiwgcG9ydCAzODkpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTERBUENlcnRTdG9yZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TERBUENlcnRTdG9yZVBhcmFtZXRlcnMwMigpIHsKKyAgICAgICAgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMgY3AgPSBuZXcgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJob3N0IiwgImxvY2FsaG9zdCIsIGNwLmdldFNlcnZlck5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9ydCIsIDM4OSwgY3AuZ2V0UG9ydCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5MREFQQ2VydFN0b3JlUGFyYW1ldGVycyhTdHJpbmcpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+TERBUENlcnRTdG9yZVBhcmFtZXRlcnM8L2NvZGU+CisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHNlcnZlciBuYW1lIGFuZCBhIGRlZmF1bHQgcG9ydCBvZiAzODkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJMREFQQ2VydFN0b3JlUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TERBUENlcnRTdG9yZVBhcmFtZXRlcnNTdHJpbmcwMSgpIHsKKyAgICAgICAgQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9IG5ldyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycygibXlob3N0Iik7CisgICAgICAgIGFzc2VydFRydWUoImlzTERBUENlcnRTdG9yZVBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgIGNwIGluc3RhbmNlb2YgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPkxEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5MREFQQ2VydFN0b3JlUGFyYW1ldGVyczwvY29kZT4KKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgc2VydmVyIG5hbWUgYW5kIGEgZGVmYXVsdCBwb3J0IG9mIDM4OQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RMREFQQ2VydFN0b3JlUGFyYW1ldGVyc1N0cmluZzAyKCkgeworICAgICAgICBTdHJpbmcgc2VydmVyTmFtZSA9ICJteWhvc3QiOworICAgICAgICBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9IG5ldyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyhzZXJ2ZXJOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaG9zdCIsIHNlcnZlck5hbWUuZXF1YWxzKGNwLmdldFNlcnZlck5hbWUoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvcnQiLCAzODksIGNwLmdldFBvcnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+TERBUENlcnRTdG9yZVBhcmFtZXRlcnMoU3RyaW5nKTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+IC0KKyAgICAgKiBpZiA8Y29kZT5zZXJ2ZXJOYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkxEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RMREFQQ2VydFN0b3JlUGFyYW1ldGVyc1N0cmluZzAzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTlBFIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPkxEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzKFN0cmluZywgaW50KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkxEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzPC9jb2RlPgorICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5jb3JyZWN0IGludCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTERBUENlcnRTdG9yZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TERBUENlcnRTdG9yZVBhcmFtZXRlcnNTdHJpbmdpbnQwMSgpIHsKKyAgICAgICAgQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9IG5ldyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycygibXlob3N0IiwgMTA5OCk7CisgICAgICAgIGFzc2VydFRydWUoImlzTERBUENlcnRTdG9yZVBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgIGNwIGluc3RhbmNlb2YgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPkxEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzKFN0cmluZywgaW50KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkxEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzPC9jb2RlPgorICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5jb3JyZWN0IGludCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTERBUENlcnRTdG9yZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TERBUENlcnRTdG9yZVBhcmFtZXRlcnNTdHJpbmdpbnQwMigpIHsKKyAgICAgICAgU3RyaW5nIHNlcnZlck5hbWUgPSAibXlob3N0IjsKKyAgICAgICAgaW50IHBvcnROdW1iZXIgPSAxMDk5OworICAgICAgICBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9CisgICAgICAgICAgICBuZXcgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMoc2VydmVyTmFtZSwgcG9ydE51bWJlcik7CisgICAgICAgIGFzc2VydFRydWUoImhvc3QiLCBzZXJ2ZXJOYW1lLmVxdWFscyhjcC5nZXRTZXJ2ZXJOYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicG9ydCIsIGNwLmdldFBvcnQoKSA9PSBwb3J0TnVtYmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5MREFQQ2VydFN0b3JlUGFyYW1ldGVycyhTdHJpbmcsIGludCk8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogdGhyb3dzIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiAtCisgICAgICogaWYgPGNvZGU+c2VydmVyTmFtZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gSW5jb3JyZWN0IGludCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiTERBUENlcnRTdG9yZVBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TERBUENlcnRTdG9yZVBhcmFtZXRlcnNTdHJpbmdpbnQwMygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyhudWxsLCAwKTsKKyAgICAgICAgICAgIGZhaWwoIk5QRSBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5jbG9uZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIG9iamVjdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDbG9uZSgpIHsKKyAgICAgICAgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMgY3AxID0KKyAgICAgICAgICAgIG5ldyBMREFQQ2VydFN0b3JlUGFyYW1ldGVycygibXlob3N0IiwgMTEwMCk7CisgICAgICAgIExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzIGNwMiA9IChMREFQQ2VydFN0b3JlUGFyYW1ldGVycyljcDEuY2xvbmUoKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGF0IHdlIGhhdmUgbmV3IG9iamVjdAorICAgICAgICBhc3NlcnRUcnVlKCJuZXdPYmplY3QiLCBjcDEgIT0gY3AyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaG9zdHNUaGVTYW1lIiwKKyAgICAgICAgICAgICAgICBjcDEuZ2V0U2VydmVyTmFtZSgpLmVxdWFscyhjcDIuZ2V0U2VydmVyTmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoInBvcnRzVGhlU2FtZSIsIGNwMS5nZXRQb3J0KCkgPT0gY3AyLmdldFBvcnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZyBkZXNjcmliaW5nIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzIGNwMSA9CisgICAgICAgICAgICBuZXcgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMoIm15aG9zdCIsIDExMDEpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoY3AxLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIHBvcnQgbnVtYmVyCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBvcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UG9ydCgpIHsKKyAgICAgICAgaW50IHBvcnROdW1iZXIgPSAtMTA5OTsKKyAgICAgICAgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMgY3AgPQorICAgICAgICAgICAgbmV3IExEQVBDZXJ0U3RvcmVQYXJhbWV0ZXJzKCJzZXJ2ZXJOYW1lIiwgcG9ydE51bWJlcik7CisgICAgICAgIGFzc2VydFRydWUoY3AuZ2V0UG9ydCgpID09IHBvcnROdW1iZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIHNlcnZlciBuYW1lIChuZXZlciA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VydmVyTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRTZXJ2ZXJOYW1lKCkgeworICAgICAgICBMREFQQ2VydFN0b3JlUGFyYW1ldGVycyBjcCA9CisgICAgICAgICAgICBuZXcgTERBUENlcnRTdG9yZVBhcmFtZXRlcnMoInNlcnZlck5hbWUiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjcC5nZXRTZXJ2ZXJOYW1lKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1BLSVhCdWlsZGVyUGFyYW1ldGVyc1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9QS0lYQnVpbGRlclBhcmFtZXRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxOTVkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9QS0lYQnVpbGRlclBhcmFtZXRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw1MTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5QS0lYUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5UZXN0VXRpbHM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVyczwvY29kZT4gZmllbGRzIGFuZCBtZXRob2RzCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhQS0lYQnVpbGRlclBhcmFtZXRlcnMuY2xhc3MpCitwdWJsaWMgY2xhc3MgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdHJpbmcgY2VydGlmaWNhdGUgPSAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICArICJNSUlDWlRDQ0FkSUNCUUwzQUFDMk1BMEdDU3FHU0liM0RRRUJBZ1VBTUY4eEN6QUpCZ05WQkFZVEFsVlRNU0F3XG4iCisgICAgICAgICAgICArICJIZ1lEVlFRS0V4ZFNVMEVnUkdGMFlTQlRaV04xY21sMGVTd2dTVzVqTGpFdU1Dd0dBMVVFQ3hNbFUyVmpkWEpsXG4iCisgICAgICAgICAgICArICJJRk5sY25abGNpQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDVOekF5TWpBd01EQXdNREJhXG4iCisgICAgICAgICAgICArICJGdzA1T0RBeU1qQXlNelU1TlRsYU1JR1dNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2XG4iCisgICAgICAgICAgICArICJjbTVwWVRFU01CQUdBMVVFQnhNSlVHRnNieUJCYkhSdk1SOHdIUVlEVlFRS0V4WlRkVzRnVFdsamNtOXplWE4wXG4iCisgICAgICAgICAgICArICJaVzF6TENCSmJtTXVNU0V3SHdZRFZRUUxFeGhVWlhOMElHRnVaQ0JGZG1Gc2RXRjBhVzl1SUU5dWJIa3hHakFZXG4iCisgICAgICAgICAgICArICJCZ05WQkFNVEVXRnlaMjl1TG1WdVp5NXpkVzR1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCXG4iCisgICAgICAgICAgICArICJpUUtCZ1FDb2ZtZFkrUGlVV04wMUZPekVld2YrR2FHK2xGZjEzMlVwekFUbVlKa0E0QUVBL2p1VzdqU2krTEprXG4iCisgICAgICAgICAgICArICJ3SktpNUdPNFJ5Wm95aW1BTC81eUlXRFY2bDFLbHZ4eUtzbHIwUkVoTUJhRC8zWjNFc0xUVEVmNWdWclFTNnNUXG4iCisgICAgICAgICAgICArICJXTW9TWkF5ekIzOWtGZnNCNm9VWE50VjgrVUtLeFN4S2J4dmhRbjI2N1BlQ3o1VlgyUUlEQVFBQk1BMEdDU3FHXG4iCisgICAgICAgICAgICArICJTSWIzRFFFQkFnVUFBMzRBWGwzYXQ2bHVpVi83STlNTjVDWFlvUEpZSThCY2RjMWhCYWdKdlRNY21scUwydU9aXG4iCisgICAgICAgICAgICArICJIOVQ1aE5NRUw5VGs2YUk3eVpQWGN3L3hJMks2cE9SL0ZyTXAwVXdKbWR4WDdsalY2WnRVWmY3cFk0OTJVcXdDXG4iCisgICAgICAgICAgICArICIxNzc3WFE5VUVaeXJLSnZGNW50bGVlTzBheUJxTEdWS0NXeldaWDlZc1hDcHY0N0ZOTFpidXBFPVxuIgorICAgICAgICAgICAgKyAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIjsKKworICAgIFN0cmluZyBjZXJ0aWZpY2F0ZTIgPSAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICArICJNSUlDWnpDQ0FkQ2dBd0lCQWdJQkd6QU5CZ2txaGtpRzl3MEJBUVVGQURCaE1Rc3dDUVlEVlFRR0V3SlZVekVZXG4iCisgICAgICAgICAgICArICJNQllHQTFVRUNoTVBWUzVUTGlCSGIzWmxjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUXG4iCisgICAgICAgICAgICArICJBMUJMU1RFY01Cb0dBMVVFQXhNVFJHOUVJRkJMU1NCTlpXUWdVbTl2ZENCRFFUQWVGdzA1T0RBNE1ETXlNakF5XG4iCisgICAgICAgICAgICArICJNamxhRncwd09EQTRNRFF5TWpBeU1qbGFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11XG4iCisgICAgICAgICAgICArICJJRWR2ZG1WeWJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJ3d0dnWURWUVFEXG4iCisgICAgICAgICAgICArICJFeE5FYjBRZ1VFdEpJRTFsWkNCU2IyOTBJRU5CTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCXG4iCisgICAgICAgICAgICArICJnUURick0vSjlGckpTWCt6eEZVYnNJOVZ3NVFiZ3VWQklhOTVyd1cvME04K3NNMHI1Z2QrRFk2aXVibTZ3blhrXG4iCisgICAgICAgICAgICArICJDU3ZiZlFsRkVEU0tyNFdZZWVHcCtkOVdsRG5RZHRERkxkQTQ1dENpNVNIam5XK2hHQW1abmxkMHJ6NndRZWtGXG4iCisgICAgICAgICAgICArICI1eFFhYTVBNndqaE1sTE9qYmgyN3p5c2Nyb3JNSjFPNUZCT1duRUhjUnY2eHFRSURBUUFCb3k4d0xUQWRCZ05WXG4iCisgICAgICAgICAgICArICJIUTRFRmdRVVZybVlSNm05NzAxY0hRM3I1a1h5Rzd6c0NOMHdEQVlEVlIwVEJBVXdBd0VCL3pBTkJna3Foa2lHXG4iCisgICAgICAgICAgICArICI5dzBCQVFVRkFBT0JnUURWWDFZMFlxQzd2ZWtlWmpWeHR5dUM4TW54YnJ6NkQxMDlBWDA3TEVJUnpOWXp3WjB3XG4iCisgICAgICAgICAgICArICJNVEltU3A5c0V6V1crM0Z1ZUJJVTdBeEd5czJPN1gwcW1OM3pnc3pQZlNpb2NCdVF1WElZUWN0SmhLakY1S1ZjXG4iCisgICAgICAgICAgICArICJWR1FSWVlsdCtteWhsMnZ5NnlQekVWQ2ppS3dNRWIxU3B1MGlyQ2YrbEZXMmhzZGp2bVNRTXRadk93PT1cbiIKKyAgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBQS0lYQnVpbGRlclBhcmFtZXRlcnNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVycyhTZXQsIENlcnRTZWxlY3Rvcik8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVyczwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhCdWlsZGVyUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWEJ1aWxkZXJQYXJhbWV0ZXJzU2V0Q2VydFNlbGVjdG9yMDEoKQorICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBib3RoIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGFuZCBub24tbnVsbAorICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0KKyAgICAgICAgICAgIG5ldyBQS0lYQnVpbGRlclBhcmFtZXRlcnModGFTZXQsIG5ldyBYNTA5Q2VydFNlbGVjdG9yKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJpbnN0YW5jZU9mIiwgcCBpbnN0YW5jZW9mIFBLSVhCdWlsZGVyUGFyYW1ldGVycyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoImNlcnRTZWxlY3RvciIsIHAuZ2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVycyhTZXQsIENlcnRTZWxlY3Rvcik8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVyczwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgQ2VydFNlbGVjdG9yIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQS0lYQnVpbGRlclBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTZWxlY3Rvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBLSVhCdWlsZGVyUGFyYW1ldGVyc1NldENlcnRTZWxlY3RvcjAyKCkKKyAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gYm90aCBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBidXQgQ2VydFNlbGVjdG9yIGlzIG51bGwKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYQnVpbGRlclBhcmFtZXRlcnModGFTZXQsIG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJpbnN0YW5jZU9mIiwgcCBpbnN0YW5jZW9mIFBLSVhCdWlsZGVyUGFyYW1ldGVycyk7CisgICAgICAgIGFzc2VydE51bGwoImNlcnRTZWxlY3RvciIsIHAuZ2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVycyhTZXQsIENlcnRTZWxlY3Rvcik8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiAuLi4gdGhlIDxjb2RlPlNldDwvY29kZT4gaXMgY29waWVkIHRvIHByb3RlY3QgYWdhaW5zdAorICAgICAqIHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9ucworICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBDZXJ0U2VsZWN0b3IgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhCdWlsZGVyUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWEJ1aWxkZXJQYXJhbWV0ZXJzU2V0Q2VydFNlbGVjdG9yMDMoKQorICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorICAgICAgICBIYXNoU2V0PFRydXN0QW5jaG9yPiBvcmlnaW5hbFNldCA9IChIYXNoU2V0PFRydXN0QW5jaG9yPikgdGFTZXQ7CisgICAgICAgIEhhc2hTZXQ8VHJ1c3RBbmNob3I+IG9yaWdpbmFsU2V0Q29weSA9IChIYXNoU2V0PFRydXN0QW5jaG9yPikgb3JpZ2luYWxTZXQKKyAgICAgICAgICAgICAgICAuY2xvbmUoKTsKKyAgICAgICAgLy8gY3JlYXRlIHRlc3Qgb2JqZWN0IHVzaW5nIG9yaWdpbmFsU2V0IAorICAgICAgICBQS0lYQnVpbGRlclBhcmFtZXRlcnMgcHAgPQorICAgICAgICAgICAgbmV3IFBLSVhCdWlsZGVyUGFyYW1ldGVycyhvcmlnaW5hbFNldENvcHksIG51bGwpOworICAgICAgICAvLyBtb2RpZnkgb3JpZ2luYWxTZXQKKyAgICAgICAgb3JpZ2luYWxTZXRDb3B5LmNsZWFyKCk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGVzdCBvYmplY3QncyBpbnRlcm5hbCBzdGF0ZQorICAgICAgICAvLyBoYXMgbm90IGJlZW4gYWZmZWN0ZWQgYnkgdGhlIGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICBTZXQgcmV0dXJuZWRTZXQgPSBwcC5nZXRUcnVzdEFuY2hvcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2V0LCByZXR1cm5lZFNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+UEtJWEJ1aWxkZXJQYXJhbWV0ZXJzKFNldCwgQ2VydFNlbGVjdG9yKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiAtCisgICAgICogaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXQ8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQnVpbGRlclBhcmFtZXRlcnNTZXRDZXJ0U2VsZWN0b3IwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcGFzcyBudWxsCisgICAgICAgICAgICBuZXcgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzKChTZXQ8VHJ1c3RBbmNob3I+KSBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk5QRSBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM1IGZvciA8Y29kZT5QS0lYQnVpbGRlclBhcmFtZXRlcnMoU2V0LCBDZXJ0U2VsZWN0b3IpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+SW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjwvY29kZT4gLQorICAgICAqIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+U2V0PC9jb2RlPiBpcyBlbXB0eQorICAgICAqICg8Y29kZT50cnVzdEFuY2hvcnMuaXNFbXB0eSgpID09IHRydWU8L2NvZGU+KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQnVpbGRlclBhcmFtZXRlcnNTZXRDZXJ0U2VsZWN0b3IwNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHVzZSBlbXB0eSBzZXQKKyAgICAgICAgICAgIG5ldyBQS0lYQnVpbGRlclBhcmFtZXRlcnMobmV3IEhhc2hTZXQ8VHJ1c3RBbmNob3I+KCksIG51bGwpOworICAgICAgICAgICAgZmFpbCgiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzYgZm9yIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVycyhTZXQsIENlcnRTZWxlY3Rvcik8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5DbGFzc0Nhc3RFeGNlcHRpb248L2NvZGU+IC0KKyAgICAgKiBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSA8Y29kZT5TZXQ8L2NvZGU+IGFyZSBub3Qgb2YgdHlwZQorICAgICAqIDxjb2RlPmphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvcjwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQnVpbGRlclBhcmFtZXRlcnNTZXRDZXJ0U2VsZWN0b3IwNigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgd3Jvbmcgb2JqZWN0IHRvIHZhbGlkIHNldAorICAgICAgICBhc3NlcnRUcnVlKHRhU2V0LmFkZChuZXcgT2JqZWN0KCkpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBLSVhCdWlsZGVyUGFyYW1ldGVycyh0YVNldCwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJDbGFzc0Nhc3RFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVycyhLZXlTdG9yZSwgQ2VydFNlbGVjdG9yKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiAtIGlmIHRoZQorICAgICAqIDxjb2RlPmtleXN0b3JlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlaXJpZmllcyBudWxsIGFzIGEgS2V5U3RvcmUgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhCdWlsZGVyUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleVN0b3JlLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWEJ1aWxkZXJQYXJhbWV0ZXJzS2V5U3RvcmVDZXJ0U2VsZWN0b3IwMSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBQS0lYQnVpbGRlclBhcmFtZXRlcnMoKEtleVN0b3JlKSBudWxsLCBuZXcgWDUwOUNlcnRTZWxlY3RvcigpKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5QS0lYQnVpbGRlclBhcmFtZXRlcnMoS2V5U3RvcmUsIENlcnRTZWxlY3Rvcik8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5LZXlTdG9yZUV4Y2VwdGlvbjwvY29kZT4gLSBpZiB0aGUKKyAgICAgKiA8Y29kZT5rZXlzdG9yZTwvY29kZT4gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVpcmlmaWVzIG51bGwgYXMgYSBDZXJ0U2VsZWN0b3IgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhCdWlsZGVyUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LktleVN0b3JlLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWEJ1aWxkZXJQYXJhbWV0ZXJzS2V5U3RvcmVDZXJ0U2VsZWN0b3IwMigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgS2V5U3RvcmUga2V5VGVzdCA9IEtleVN0b3JlLmdldEluc3RhbmNlKEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBLSVhCdWlsZGVyUGFyYW1ldGVycyhrZXlUZXN0LCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIktleVN0b3JlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5QS0lYQnVpbGRlclBhcmFtZXRlcnMoS2V5U3RvcmUsIENlcnRTZWxlY3Rvcik8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uPC9jb2RlPiAtIGlmIHRoZQorICAgICAqIDxjb2RlPmtleXN0b3JlPC9jb2RlPiBkb2VzIG5vdCBjb250YWluIGF0IGxlYXN0IG9uZSB0cnVzdGVkIGNlcnRpZmljYXRlCisgICAgICogZW50cnkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5U3RvcmUuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQnVpbGRlclBhcmFtZXRlcnNLZXlTdG9yZUNlcnRTZWxlY3RvcjAzKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBLZXlTdG9yZSBrZXlUZXN0ID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgICAgIGtleVRlc3QubG9hZChudWxsLCBudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBQS0lYQnVpbGRlclBhcmFtZXRlcnMoa2V5VGVzdCwgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKSk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzQgZm9yIDxjb2RlPlBLSVhCdWlsZGVyUGFyYW1ldGVycyhLZXlTdG9yZSwgQ2VydFNlbGVjdG9yKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiAtCisgICAgICogaWYgdGhlIDxjb2RlPmtleXN0b3JlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5U3RvcmUuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQnVpbGRlclBhcmFtZXRlcnNLZXlTdG9yZUNlcnRTZWxlY3RvcjA0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBLZXlTdG9yZSBrZXlUZXN0ID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgICAgIGtleVRlc3QubG9hZChudWxsLCBudWxsKTsKKworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBjZXJ0QXJyYXkgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY2VydGlmaWNhdGUKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2VydEFycmF5MiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0aWZpY2F0ZTIKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRbXSA9IG5ldyBYNTA5Q2VydGlmaWNhdGVbMl07CisgICAgICAgIGNlcnRbMF0gPSAoWDUwOUNlcnRpZmljYXRlKSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGNlcnRBcnJheSk7CisgICAgICAgIGNlcnRbMV0gPSAoWDUwOUNlcnRpZmljYXRlKSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGNlcnRBcnJheTIpOworCisgICAgICAgIGtleVRlc3Quc2V0Q2VydGlmaWNhdGVFbnRyeSgiYWxpYXMxIiwgY2VydFswXSk7CisgICAgICAgIGtleVRlc3Quc2V0Q2VydGlmaWNhdGVFbnRyeSgiYWxpYXMyIiwgY2VydFswXSk7CisgICAgICAgIGtleVRlc3Quc2V0Q2VydGlmaWNhdGVFbnRyeSgiYWxpYXMzIiwgY2VydFsxXSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBLSVhCdWlsZGVyUGFyYW1ldGVycyBwID0gbmV3IFBLSVhCdWlsZGVyUGFyYW1ldGVycyhrZXlUZXN0LAorICAgICAgICAgICAgICAgICAgICBuZXcgWDUwOUNlcnRTZWxlY3RvcigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBwLmdldFRydXN0QW5jaG9ycygpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcC5nZXRNYXhQYXRoTGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldE1heFBhdGhMZW5ndGgoKTwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4UGF0aExlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRNYXhQYXRoTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleVN0b3JlIGtleVRlc3QgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKKyAgICAgICAga2V5VGVzdC5sb2FkKG51bGwsIG51bGwpOworCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGNlcnRBcnJheSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0aWZpY2F0ZQorICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKKworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBjZXJ0QXJyYXkyID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnRpZmljYXRlMgorICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydFtdID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZVsyXTsKKyAgICAgICAgY2VydFswXSA9IChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoY2VydEFycmF5KTsKKyAgICAgICAgY2VydFsxXSA9IChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoY2VydEFycmF5Mik7CisKKyAgICAgICAga2V5VGVzdC5zZXRDZXJ0aWZpY2F0ZUVudHJ5KCJhbGlhczEiLCBjZXJ0WzBdKTsKKyAgICAgICAga2V5VGVzdC5zZXRDZXJ0aWZpY2F0ZUVudHJ5KCJhbGlhczIiLCBjZXJ0WzBdKTsKKyAgICAgICAga2V5VGVzdC5zZXRDZXJ0aWZpY2F0ZUVudHJ5KCJhbGlhczMiLCBjZXJ0WzFdKTsKKworICAgICAgICBQS0lYQnVpbGRlclBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYQnVpbGRlclBhcmFtZXRlcnMoa2V5VGVzdCwKKyAgICAgICAgICAgICAgICBuZXcgWDUwOUNlcnRTZWxlY3RvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHAuZ2V0TWF4UGF0aExlbmd0aCgpKTsKKyAgICAgICAgcC5zZXRNYXhQYXRoTGVuZ3RoKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBwLmdldE1heFBhdGhMZW5ndGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+c2V0TWF4UGF0aExlbmd0aCgpPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkJvdW5kYXJ5IGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1heFBhdGhMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0TWF4UGF0aExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBLZXlTdG9yZSBrZXlUZXN0ID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgICAgIGtleVRlc3QubG9hZChudWxsLCBudWxsKTsKKworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBjZXJ0QXJyYXkgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY2VydGlmaWNhdGUKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2VydEFycmF5MiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0aWZpY2F0ZTIKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRbXSA9IG5ldyBYNTA5Q2VydGlmaWNhdGVbMl07CisgICAgICAgIGNlcnRbMF0gPSAoWDUwOUNlcnRpZmljYXRlKSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGNlcnRBcnJheSk7CisgICAgICAgIGNlcnRbMV0gPSAoWDUwOUNlcnRpZmljYXRlKSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGNlcnRBcnJheTIpOworCisgICAgICAgIGtleVRlc3Quc2V0Q2VydGlmaWNhdGVFbnRyeSgiYWxpYXMxIiwgY2VydFswXSk7CisgICAgICAgIGtleVRlc3Quc2V0Q2VydGlmaWNhdGVFbnRyeSgiYWxpYXMyIiwgY2VydFswXSk7CisgICAgICAgIGtleVRlc3Quc2V0Q2VydGlmaWNhdGVFbnRyeSgiYWxpYXMzIiwgY2VydFsxXSk7CisKKyAgICAgICAgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzKGtleVRlc3QsCisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcC5nZXRNYXhQYXRoTGVuZ3RoKCkpOworICAgICAgICBwLnNldE1heFBhdGhMZW5ndGgoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHAuZ2V0TWF4UGF0aExlbmd0aCgpKTsKKyAgICAgICAgcC5zZXRNYXhQYXRoTGVuZ3RoKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcC5nZXRNYXhQYXRoTGVuZ3RoKCkpOworICAgICAgICBwLnNldE1heFBhdGhMZW5ndGgoLTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHAuZ2V0TWF4UGF0aExlbmd0aCgpKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnNldE1heFBhdGhMZW5ndGgoLTEwKTsKKyAgICAgICAgICAgIGZhaWwoIkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZXhwZWN0ZWQgIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleVN0b3JlIGtleVRlc3QgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKKyAgICAgICAga2V5VGVzdC5sb2FkKG51bGwsIG51bGwpOworCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGNlcnRBcnJheSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0aWZpY2F0ZQorICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKKworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBjZXJ0QXJyYXkyID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnRpZmljYXRlMgorICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydFtdID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZVsyXTsKKyAgICAgICAgY2VydFswXSA9IChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoY2VydEFycmF5KTsKKyAgICAgICAgY2VydFsxXSA9IChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoY2VydEFycmF5Mik7CisKKyAgICAgICAga2V5VGVzdC5zZXRDZXJ0aWZpY2F0ZUVudHJ5KCJhbGlhczEiLCBjZXJ0WzBdKTsKKyAgICAgICAga2V5VGVzdC5zZXRDZXJ0aWZpY2F0ZUVudHJ5KCJhbGlhczIiLCBjZXJ0WzBdKTsKKyAgICAgICAga2V5VGVzdC5zZXRDZXJ0aWZpY2F0ZUVudHJ5KCJhbGlhczMiLCBjZXJ0WzFdKTsKKworICAgICAgICBQS0lYQnVpbGRlclBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYQnVpbGRlclBhcmFtZXRlcnMoa2V5VGVzdCwKKyAgICAgICAgICAgICAgICBuZXcgWDUwOUNlcnRTZWxlY3RvcigpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHAudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocC50b1N0cmluZygpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1BLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNzFlYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGg7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlclJlc3VsdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNlcnRQYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuVGVzdFV0aWxzOworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5QS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0PC9jb2RlPgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBDZXJ0IHBhdGggZW5jb2Rpbmcgc3R1YgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSB0ZXN0RW5jb2RpbmcgPSBuZXcgYnl0ZVtdIHsKKyAgICAgICAgICAgIChieXRlKTEsIChieXRlKTIsIChieXRlKTMsIChieXRlKTQsIChieXRlKTUKKyAgICB9OworCisgICAgLyoqCisgICAgICogUHVibGljS2V5IHN0dWIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBQdWJsaWNLZXkgdGVzdFB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkoKSB7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTUyOTk1MDcwMzM5NDc1MTYzOEw7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgeworICAgICAgICAgICAgcmV0dXJuICJOZXZlck1pbmQiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0KCkgeworICAgICAgICAgICAgcmV0dXJuICJOZXZlck1pbmQiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHt9OworICAgICAgICB9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHRUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+UEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdChDZXJ0UGF0aCwgVHJ1c3RBbmNob3IsCisgICAgICogICBQb2xpY3lOb2RlLCBQdWJsaWNLZXkpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+UEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdDwvY29kZT4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGguY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvci5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeU5vZGUuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdDAxKCkKKyAgICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisgICAgICAgIENlcnRQYXRoQnVpbGRlclJlc3VsdCByID0KKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisgICAgICAgIGFzc2VydFRydWUociBpbnN0YW5jZW9mIFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPlBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQoQ2VydFBhdGgsIFRydXN0QW5jaG9yLAorICAgICAqICAgUG9saWN5Tm9kZSwgUHVibGljS2V5KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBwb2xpY3kgdHJlZSBwYXJhbWV0ZXIgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aC5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZS5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0MDIoKQorICAgICAgICB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24sCisgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBUcnVzdEFuY2hvciB0YSA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvcigpOworICAgICAgICBpZiAodGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3IpIik7CisgICAgICAgIH0KKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyUmVzdWx0IHIgPQorICAgICAgICAgICAgbmV3IFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBNeUNlcnRQYXRoKHRlc3RFbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgIHRhLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICB0ZXN0UHVibGljS2V5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyIGluc3RhbmNlb2YgUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+UEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdChDZXJ0UGF0aCwgVHJ1c3RBbmNob3IsCisgICAgICogICBQb2xpY3lOb2RlLCBQdWJsaWNLZXkpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPgorICAgICAqIGlmIGNlcnRQYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aC5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZS5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0MDMoKSB7CisgICAgICAgIFRydXN0QW5jaG9yIHRhID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yKCk7CisgICAgICAgIGlmICh0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvcikiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBwYXNzIG51bGwKKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisgICAgICAgICAgICBmYWlsKCJOUEUgZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+UEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdChDZXJ0UGF0aCwgVHJ1c3RBbmNob3IsCisgICAgICogICBQb2xpY3lOb2RlLCBQdWJsaWNLZXkpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPgorICAgICAqIGlmIHRydXN0QW5jaG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3IuY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5Qb2xpY3lOb2RlLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQwNCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHBhc3MgbnVsbAorICAgICAgICAgICAgbmV3IFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBNeUNlcnRQYXRoKHRlc3RFbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5nZXRQb2xpY3lUcmVlKCksCisgICAgICAgICAgICAgICAgICAgIHRlc3RQdWJsaWNLZXkpOworICAgICAgICAgICAgZmFpbCgiTlBFIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzUgZm9yIDxjb2RlPlBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQoQ2VydFBhdGgsIFRydXN0QW5jaG9yLAorICAgICAqICAgUG9saWN5Tm9kZSwgUHVibGljS2V5KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiBpZiBwdWJsaWNLZXkgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGguY2xhc3MsIGphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvci5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeU5vZGUuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdDA1KCkgeworICAgICAgICBUcnVzdEFuY2hvciB0YSA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvcigpOworICAgICAgICBpZiAodGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3IpIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcGFzcyBudWxsCisgICAgICAgICAgICBuZXcgUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgdGEsCisgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5nZXRQb2xpY3lUcmVlKCksCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTlBFIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2Nsb25lKCkgeworCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjc4Ni4KKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXROYW1lKCkKKyAgICAgICAgICAgICAgICArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvcikiLCB0YSk7CisKKyAgICAgICAgUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCBpbml0ID0gbmV3IFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQoCisgICAgICAgICAgICAgICAgbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKSwgdGEsIFRlc3RVdGlscy5nZXRQb2xpY3lUcmVlKCksCisgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisKKyAgICAgICAgUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCBjbG9uZSA9IChQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0KSBpbml0CisgICAgICAgICAgICAgICAgLmNsb25lKCk7CisgICAgICAgIGFzc2VydFNhbWUoaW5pdC5nZXRDZXJ0UGF0aCgpLCBjbG9uZS5nZXRDZXJ0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShpbml0LmdldFBvbGljeVRyZWUoKSwgY2xvbmUuZ2V0UG9saWN5VHJlZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShpbml0LmdldFB1YmxpY0tleSgpLCBjbG9uZS5nZXRQdWJsaWNLZXkoKSk7CisgICAgICAgIGFzc2VydFNhbWUoaW5pdC5nZXRUcnVzdEFuY2hvcigpLCBjbG9uZS5nZXRUcnVzdEFuY2hvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRDZXJ0UGF0aCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiB0aGUgYnVpbHQgYW5kIHZhbGlkYXRlZCA8Y29kZT5DZXJ0UGF0aDwvY29kZT4KKyAgICAgKiAobmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENlcnRQYXRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENlcnRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRydXN0QW5jaG9yIHRhID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yKCk7CisgICAgICAgIGlmICh0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvcikiKTsKKyAgICAgICAgfQorCisgICAgICAgIENlcnRQYXRoIGNwID0gbmV3IE15Q2VydFBhdGgodGVzdEVuY29kaW5nKTsKKyAgICAgICAgQ2VydFBhdGhCdWlsZGVyUmVzdWx0IHIgPQorICAgICAgICAgICAgbmV3IFBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIGNwLAorICAgICAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisKKyAgICAgICAgLy8gbXVzdCByZXR1cm4gdGhlIHNhbWUgcmVmZXJlbmNlCisgICAgICAgIC8vIGFzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgYXNzZXJ0U2FtZShjcCwgci5nZXRDZXJ0UGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiB0aGUgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0CisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nKCkKKyAgICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisgICAgICAgIENlcnRQYXRoQnVpbGRlclJlc3VsdCByID0KKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICBuZXcgTXlDZXJ0UGF0aCh0ZXN0RW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1BLSVhDZXJ0UGF0aENoZWNrZXJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoQ2hlY2tlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzg0NzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1BLSVhDZXJ0UGF0aENoZWNrZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LlBLSVhDZXJ0UGF0aENoZWNrZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0LlRlc3RVdGlsczsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+UEtJWENlcnRQYXRoQ2hlY2tlcjwvY29kZT4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKFBLSVhDZXJ0UGF0aENoZWNrZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgUEtJWENlcnRQYXRoQ2hlY2tlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUEtJWENlcnRQYXRoQ2hlY2tlclRlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUEtJWENlcnRQYXRoQ2hlY2tlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUZXN0cworICAgIC8vCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhDZXJ0UGF0aENoZWNrZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgTXlQS0lYQ2VydFBhdGhDaGVja2VyKCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENsb25lKCkgeworICAgICAgICBQS0lYQ2VydFBhdGhDaGVja2VyIHBjMSA9IFRlc3RVdGlscy5nZXRUZXN0Q2VydFBhdGhDaGVja2VyKCk7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgcGMyID0gKFBLSVhDZXJ0UGF0aENoZWNrZXIpIHBjMS5jbG9uZSgpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJub3RTYW1lIiwgcGMxLCBwYzIpOworICAgIH0KKworICAgIC8vCisgICAgLy8gdGhlIGZvbGxvd2luZyB0ZXN0cyBqdXN0IGNhbGwgbWV0aG9kcworICAgIC8vIHRoYXQgYXJlIGFic3RyYWN0IGluIDxjb2RlPlBLSVhDZXJ0UGF0aENoZWNrZXI8L2NvZGU+CisgICAgLy8gKFNvIHRoZXkganVzdCBsaWtlIHNpZ25hdHVyZSB0ZXN0cykKKyAgICAvLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0ZvcndhcmRDaGVja2luZ1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RJc0ZvcndhcmRDaGVja2luZ1N1cHBvcnRlZCgpIHsKKyAgICAgICAgUEtJWENlcnRQYXRoQ2hlY2tlciBwYyA9IFRlc3RVdGlscy5nZXRUZXN0Q2VydFBhdGhDaGVja2VyKCk7CisgICAgICAgIHBjLmlzRm9yd2FyZENoZWNraW5nU3VwcG9ydGVkKCk7CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RJbml0KCkKKyAgICAgICAgdGhyb3dzIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgUEtJWENlcnRQYXRoQ2hlY2tlciBwYyA9IFRlc3RVdGlscy5nZXRUZXN0Q2VydFBhdGhDaGVja2VyKCk7CisgICAgICAgIHBjLmluaXQodHJ1ZSk7CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdXBwb3J0ZWRFeHRlbnNpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFN1cHBvcnRlZEV4dGVuc2lvbnMoKSB7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgcGMgPSBUZXN0VXRpbHMuZ2V0VGVzdENlcnRQYXRoQ2hlY2tlcigpOworICAgICAgICBwYy5nZXRTdXBwb3J0ZWRFeHRlbnNpb25zKCk7CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVjayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUuY2xhc3MsIGphdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2hlY2soKSB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24geworICAgICAgICBQS0lYQ2VydFBhdGhDaGVja2VyIHBjID0gVGVzdFV0aWxzLmdldFRlc3RDZXJ0UGF0aENoZWNrZXIoKTsKKyAgICAgICAgcGMuY2hlY2sobmV3IE15Q2VydGlmaWNhdGUoIiIsIG51bGwpLCBuZXcgSGFzaFNldDxTdHJpbmc+KCkpOworICAgIH0KKworICAgIGNsYXNzIE15UEtJWENlcnRQYXRoQ2hlY2tlciBleHRlbmRzIFBLSVhDZXJ0UGF0aENoZWNrZXIgeworCisgICAgICAgIHB1YmxpYyBNeVBLSVhDZXJ0UGF0aENoZWNrZXIoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrKENlcnRpZmljYXRlIGNlcnQsCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHVucmVzb2x2ZWRDcml0RXh0cykKKyAgICAgICAgdGhyb3dzIENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3VwcG9ydGVkRXh0ZW5zaW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoYm9vbGVhbiBmb3J3YXJkKSB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9yd2FyZENoZWNraW5nU3VwcG9ydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHRUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDY5MjFiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1BLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LlBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5UZXN0VXRpbHM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPlBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdDwvY29kZT4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIC8qKgorICAgICAqIFB1YmxpY0tleSBzdHViCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUHVibGljS2V5IHRlc3RQdWJsaWNLZXkgPSBuZXcgUHVibGljS2V5KCkgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzM3NDU0NTIzNzM5NDg5MTkyTDsKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CisgICAgICAgICAgICByZXR1cm4gIk5ldmVyTWluZCI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIk5ldmVyTWluZCI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10ge307CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdFRlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRlc3RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPlBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdChUcnVzdEFuY2hvciwKKyAgICAgKiBQb2xpY3lOb2RlLCBQdWJsaWNLZXkpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiA8Y29kZT5QS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQ8L2NvZGU+CisgICAgICogCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvci5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeU5vZGUuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0MDEoKQorICAgICAgICB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24sCisgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBUcnVzdEFuY2hvciB0YSA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvcigpOworICAgICAgICBpZiAodGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3IpIik7CisgICAgICAgIH0KKyAgICAgICAgbmV3IFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCgKKyAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICBUZXN0VXRpbHMuZ2V0UG9saWN5VHJlZSgpLAorICAgICAgICAgICAgICAgIHRlc3RQdWJsaWNLZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPlBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdChUcnVzdEFuY2hvciwKKyAgICAgKiBQb2xpY3lOb2RlLCBQdWJsaWNLZXkpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiBpZgorICAgICAqIDxjb2RlPlRydXN0QW5jaG9yPC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZS5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQwMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHBhc3MgbnVsbAorICAgICAgICAgICAgbmV3IFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisgICAgICAgICAgICBmYWlsKCJOUEUgZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+UEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0KFRydXN0QW5jaG9yLAorICAgICAqIFBvbGljeU5vZGUsIFB1YmxpY0tleSk8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+IGlmCisgICAgICogPGNvZGU+UHVibGljS2V5PC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yLmNsYXNzLCBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZS5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQwMygpIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBwYXNzIG51bGwKKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIHRhLAorICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuZ2V0UG9saWN5VHJlZSgpLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk5QRSBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5QS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQoVHJ1c3RBbmNob3IsCisgICAgICogUG9saWN5Tm9kZSwgUHVibGljS2V5KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5Qb2xpY3lOb2RlPC9jb2RlPmNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvci5jbGFzcywgamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeU5vZGUuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0MDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisKKyAgICAgICAgbmV3IFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCgKKyAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIHRlc3RQdWJsaWNLZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFRydXN0QW5jaG9yKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgPGNvZGU+VHJ1c3RBbmNob3I8L2NvZGU+IChuZXZlciA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHJ1c3RBbmNob3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VHJ1c3RBbmNob3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IHZyID0KKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIHRhLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICB0ZXN0UHVibGljS2V5KTsKKworICAgICAgICAvLyBtdXN0IHJldHVybiB0aGUgc2FtZSByZWZlcmVuY2UgcGFzc2VkCisgICAgICAgIC8vIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICBhc3NlcnRTYW1lKHRhLCB2ci5nZXRUcnVzdEFuY2hvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQdWJsaWNLZXkoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgc3ViamVjdCdzIHB1YmxpYyBrZXkgKG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHVibGljS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRydXN0QW5jaG9yIHRhID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yKCk7CisgICAgICAgIGlmICh0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvcikiKTsKKyAgICAgICAgfQorCisgICAgICAgIFB1YmxpY0tleSBwayA9IHRlc3RQdWJsaWNLZXk7CisgICAgICAgIFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCB2ciA9CisgICAgICAgICAgICBuZXcgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgcGspOworCisgICAgICAgIC8vIG11c3QgcmV0dXJuIHRoZSBzYW1lIHJlZmVyZW5jZSBwYXNzZWQKKyAgICAgICAgLy8gYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yCisgICAgICAgIGFzc2VydFNhbWUocGssIHZyLmdldFB1YmxpY0tleSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQb2xpY3lUcmVlKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdmFsaWQKKyAgICAgKiBwb2xpY3kgdHJlZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUKKyAgICAgKiBubyB2YWxpZCBwb2xpY2llcworICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0UG9saWN5VHJlZSBtZXRob2QgcmV0dXJucyB0aGUgcm9vdCBub2RlIG9mICIgKworICAgICAgICAgICAgInRoZSB2YWxpZCBwb2xpY3kgdHJlZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQb2xpY3lUcmVlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFBvbGljeVRyZWUwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUcnVzdEFuY2hvciB0YSA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvcigpOworICAgICAgICBpZiAodGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3IpIik7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWxpZCBwb2xpY3kgdHJlZSBjYXNlOworICAgICAgICBQb2xpY3lOb2RlIHBuID0gVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKTsKKyAgICAgICAgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IHZyID0KKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIHRhLAorICAgICAgICAgICAgICAgICAgICBwbiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisKKyAgICAgICAgLy8gbXVzdCByZXR1cm4gdGhlIHNhbWUgcmVmZXJlbmNlIHBhc3NlZAorICAgICAgICAvLyBhcyBhIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgYXNzZXJ0U2FtZShwbiwgdnIuZ2V0UG9saWN5VHJlZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQb2xpY3lUcmVlKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdmFsaWQKKyAgICAgKiBwb2xpY3kgdHJlZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUKKyAgICAgKiBubyB2YWxpZCBwb2xpY2llcworICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0UG9saWN5VHJlZSBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSAiICsgCisgICAgICAgICAgICAibm8gdmFsaWQgcG9saWNpZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UG9saWN5VHJlZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQb2xpY3lUcmVlMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gdmFsaWQgcG9saWN5IHRyZWUgY2FzZSAobnVsbCkKKyAgICAgICAgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IHZyID0KKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIHRhLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICB0ZXN0UHVibGljS2V5KTsKKworICAgICAgICAvLyBtdXN0IHJldHVybiB0aGUgc2FtZSByZWZlcmVuY2UgcGFzc2VkCisgICAgICAgIC8vIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICBhc3NlcnROdWxsKHZyLmdldFBvbGljeVRyZWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Y2xvbmUoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBvYmplY3QKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IHZyMSA9CisgICAgICAgICAgICBuZXcgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICB0YSwKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFB1YmxpY0tleSk7CisKKyAgICAgICAgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IHZyMiA9CisgICAgICAgICAgICAoUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0KSB2cjEuY2xvbmUoKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IG1ldGhvZCBtYWtlcyBzaGFsbG93IGNvcHkKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSgibm90U2FtZSIsIHZyMSwgdnIyKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgidHJ1c3RBbmNvciIsIHZyMS5nZXRUcnVzdEFuY2hvcigpLCB2cjIuZ2V0VHJ1c3RBbmNob3IoKSk7CisgICAgICAgIGFzc2VydFNhbWUoInBvbGljeVRyZWUiLCB2cjEuZ2V0UG9saWN5VHJlZSgpLCB2cjIuZ2V0UG9saWN5VHJlZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgicHVibGljS2V5IiwgdnIxLmdldFB1YmxpY0tleSgpLCB2cjIuZ2V0UHVibGljS2V5KCkpOworCisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjc4Ni4KKyAgICAgICAgYnl0ZVtdIGVuY29kaW5nID0geyAweDAxIH07CisgICAgICAgIE15UEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCBteSA9IG5ldyBNeVBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQodGEsCisgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmdldFBvbGljeVRyZWUoKSwgdGVzdFB1YmxpY0tleSwgZW5jb2RpbmcpOworICAgICAgICBNeVBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQgbXlDbG9uZSA9IChNeVBLSVhDZXJ0UGF0aEJ1aWxkZXJSZXN1bHQpIG15CisgICAgICAgICAgICAgICAgLmNsb25lKCk7CisgICAgICAgIGFzc2VydFNhbWUobXkuZ2V0UG9saWN5VHJlZSgpLCBteUNsb25lLmdldFBvbGljeVRyZWUoKSk7CisgICAgICAgIGFzc2VydFNhbWUobXkuZ2V0UHVibGljS2V5KCksIG15Q2xvbmUuZ2V0UHVibGljS2V5KCkpOworICAgICAgICBhc3NlcnRTYW1lKG15LmdldFRydXN0QW5jaG9yKCksIG15Q2xvbmUuZ2V0VHJ1c3RBbmNob3IoKSk7CisgICAgICAgIGFzc2VydFNhbWUobXkuZW5jLCBteUNsb25lLmVuYyk7CisgICAgfQorCisgICAgY2xhc3MgTXlQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0IGV4dGVuZHMgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IHsKKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGVuYzsgLy8gYnl0ZSBhcnJheSBpcyBjbG9uZWFibGUKKworICAgICAgICBwdWJsaWMgTXlQS0lYQ2VydFBhdGhCdWlsZGVyUmVzdWx0KFRydXN0QW5jaG9yIHRydXN0QW5jaG9yLAorICAgICAgICAgICAgICAgIFBvbGljeU5vZGUgcG9saWN5VHJlZSwgUHVibGljS2V5IHN1YmplY3RQdWJsaWNLZXksIGJ5dGVbXSBlbmMpIHsKKyAgICAgICAgICAgIHN1cGVyKHRydXN0QW5jaG9yLCBwb2xpY3lUcmVlLCBzdWJqZWN0UHVibGljS2V5KTsKKworICAgICAgICAgICAgdGhpcy5lbmMgPSBlbmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3IoKTsKKyAgICAgICAgaWYgKHRhID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yKSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IHZyID0KKyAgICAgICAgICAgIG5ldyBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIHRhLAorICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuZ2V0UG9saWN5VHJlZSgpLAorICAgICAgICAgICAgICAgICAgICB0ZXN0UHVibGljS2V5KTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKHZyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBvYmplY3QKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VG9TdHJpbmcwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUcnVzdEFuY2hvciB0YSA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvcigpOworICAgICAgICBpZiAodGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3IpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQgdnIgPQorICAgICAgICAgICAgbmV3IFBLSVhDZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgdGEsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIHRlc3RQdWJsaWNLZXkpOworCisgICAgICAgIGFzc2VydE5vdE51bGwodnIudG9TdHJpbmcoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvUEtJWFBhcmFtZXRlcnNUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvUEtJWFBhcmFtZXRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0ODFkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9QS0lYUGFyYW1ldGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE4OTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWENlcnRQYXRoQ2hlY2tlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWFBhcmFtZXRlcnM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0LlRlc3RVdGlsczsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+UEtJWFBhcmFtZXRlcnM8L2NvZGU+IGZpZWxkcyBhbmQgbWV0aG9kcworICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUEtJWFBhcmFtZXRlcnMuY2xhc3MpCitwdWJsaWMgY2xhc3MgUEtJWFBhcmFtZXRlcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIC8qKgorICAgICAqIFNvbWUgdmFsaWQgaXNzdWVyIG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgdGVzdElzc3VlciA9CisgICAgICAgICJDTj1WTSxPVT1EUkwgU2VjdXJpdHksTz1JbnRlbCxMPU5vdm9zaWJpcnNrLFNUPU5TTyxDPVJVIjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBQS0lYUGFyYW1ldGVyc1Rlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUEtJWFBhcmFtZXRlcnNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+UEtJWFBhcmFtZXRlcnMoU2V0KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlBLSVhQYXJhbWV0ZXJzPC9jb2RlPiB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5TZXQ8L2NvZGU+IG9mIG1vc3QtdHJ1c3RlZCBDQXMuIEVhY2ggZWxlbWVudCBvZiB0aGUgc2V0CisgICAgICogaXMgYSA8Y29kZT5UcnVzdEFuY2hvcjwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYUGFyYW1ldGVyc1NldDAxKCkKKyAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXNlIHZhbGlkIHBhcmFtZXRlcgorICAgICAgICBDZXJ0UGF0aFBhcmFtZXRlcnMgY3BwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjcHAgaW5zdGFuY2VvZiBQS0lYUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+UEtJWFBhcmFtZXRlcnMoU2V0KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiAuLi4gdGhlIDxjb2RlPlNldDwvY29kZT4gaXMgY29waWVkIHRvIHByb3RlY3QgYWdhaW5zdAorICAgICAqIHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9ucworICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWFBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBLSVhQYXJhbWV0ZXJzU2V0MDIoKQorICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorICAgICAgICBIYXNoU2V0PFRydXN0QW5jaG9yPiBvcmlnaW5hbFNldCA9IChIYXNoU2V0PFRydXN0QW5jaG9yPil0YVNldDsKKyAgICAgICAgSGFzaFNldDxUcnVzdEFuY2hvcj4gb3JpZ2luYWxTZXRDb3B5ID0gKEhhc2hTZXQ8VHJ1c3RBbmNob3I+KSBvcmlnaW5hbFNldC5jbG9uZSgpOworICAgICAgICAvLyBjcmVhdGUgdGVzdCBvYmplY3QgdXNpbmcgb3JpZ2luYWxTZXQgCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKG9yaWdpbmFsU2V0Q29weSk7CisgICAgICAgIC8vIG1vZGlmeSBvcmlnaW5hbFNldAorICAgICAgICBvcmlnaW5hbFNldENvcHkuY2xlYXIoKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0ZXN0IG9iamVjdCdzIGludGVybmFsIHN0YXRlCisgICAgICAgIC8vIGhhcyBub3QgYmVlbiBhZmZlY3RlZCBieSB0aGUgYWJvdmUgbW9kaWZpY2F0aW9uCisgICAgICAgIFNldCByZXR1cm5lZFNldCA9IHBwLmdldFRydXN0QW5jaG9ycygpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxTZXQsIHJldHVybmVkU2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5QS0lYUGFyYW1ldGVycyhTZXQpPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiAtCisgICAgICogaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXQ8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQS0lYUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWFBhcmFtZXRlcnNTZXQwMygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcGFzcyBudWxsCisgICAgICAgICAgICBuZXcgUEtJWFBhcmFtZXRlcnMoKFNldDxUcnVzdEFuY2hvcj4pbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOUEUgZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+UEtJWFBhcmFtZXRlcnMoU2V0KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uPC9jb2RlPiAtCisgICAgICogaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXQ8L2NvZGU+IGlzIGVtcHR5CisgICAgICogKDxjb2RlPnRydXN0QW5jaG9ycy5pc0VtcHR5KCkgPT0gdHJ1ZTwvY29kZT4pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQS0lYUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtJWFBhcmFtZXRlcnNTZXQwNCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHVzZSBlbXB0eSBzZXQKKyAgICAgICAgICAgIG5ldyBQS0lYUGFyYW1ldGVycyhuZXcgSGFzaFNldDxUcnVzdEFuY2hvcj4oKSk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IgPGNvZGU+UEtJWFBhcmFtZXRlcnMoU2V0KTwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5DbGFzc0Nhc3RFeGNlcHRpb248L2NvZGU+IC0KKyAgICAgKiBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSA8Y29kZT5TZXQ8L2NvZGU+IGFyZSBub3Qgb2YgdHlwZQorICAgICAqIDxjb2RlPmphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvcjwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUEtJWFBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBLSVhQYXJhbWV0ZXJzU2V0MDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgd3Jvbmcgb2JqZWN0IHRvIHZhbGlkIHNldAorICAgICAgICBhc3NlcnRUcnVlKHRhU2V0LmFkZChuZXcgT2JqZWN0KCkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgICAgICBmYWlsKCJDbGFzc0Nhc3RFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5QS0lYUGFyYW1ldGVycyhLZXlTdG9yZSk8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+IC0KKyAgICAgKiBpZiB0aGUgPGNvZGU+a2V5c3RvcmU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLSVhQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuS2V5U3RvcmUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQS0lYUGFyYW1ldGVyc0tleVN0b3JlMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHBhc3MgbnVsbAorICAgICAgICAgICAgbmV3IFBLSVhQYXJhbWV0ZXJzKChLZXlTdG9yZSludWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk5QRSBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5jbG9uZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENsb25lKCkgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIGNwcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIGNwcGMgPSAoUEtJWFBhcmFtZXRlcnMpY3BwLmNsb25lKCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoY3BwLmdldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCgpLCBjcHBjLmdldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNwcC5nZXRDZXJ0UGF0aENoZWNrZXJzKCksIGNwcGMuZ2V0Q2VydFBhdGhDaGVja2VycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNwcC5nZXRDZXJ0U3RvcmVzKCksIGNwcGMuZ2V0Q2VydFN0b3JlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNwcC5nZXREYXRlKCksIGNwcGMuZ2V0RGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNwcC5nZXRJbml0aWFsUG9saWNpZXMoKSwgY3BwYy5nZXRJbml0aWFsUG9saWNpZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjcHAuZ2V0U2lnUHJvdmlkZXIoKSwgY3BwYy5nZXRTaWdQcm92aWRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNwcC5nZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoKSwgY3BwYy5nZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjcHAuZ2V0VHJ1c3RBbmNob3JzKCksIGNwcGMuZ2V0VHJ1c3RBbmNob3JzKCkpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNwcC5pc0FueVBvbGljeUluaGliaXRlZCgpLCBjcHBjLmlzQW55UG9saWN5SW5oaWJpdGVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY3BwLmlzRXhwbGljaXRQb2xpY3lSZXF1aXJlZCgpLCBjcHBjLmlzRXhwbGljaXRQb2xpY3lSZXF1aXJlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNwcC5pc1BvbGljeU1hcHBpbmdJbmhpYml0ZWQoKSwgY3BwYy5pc1BvbGljeU1hcHBpbmdJbmhpYml0ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjcHAuaXNSZXZvY2F0aW9uRW5hYmxlZCgpLCBjcHBjLmlzUmV2b2NhdGlvbkVuYWJsZWQoKSk7CisgICAgICAgIAorICAgICAgICBjcHAuc2V0RGF0ZShDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSk7CisgICAgICAgIGNwcC5zZXRQb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQoIWNwcGMuZ2V0UG9saWN5UXVhbGlmaWVyc1JlamVjdGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjcHAuZ2V0RGF0ZSgpLmVxdWFscyhjcHBjLmdldERhdGUoKSkpOworICAgICAgICBhc3NlcnRGYWxzZShjcHAuZ2V0UG9saWN5UXVhbGlmaWVyc1JlamVjdGVkKCkgPT0gY3BwYy5nZXRQb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQoKSk7CisKKyAgICAgICAgY3BwYy5zZXRFeHBsaWNpdFBvbGljeVJlcXVpcmVkKCFjcHAuaXNFeHBsaWNpdFBvbGljeVJlcXVpcmVkKCkpOworICAgICAgICBjcHBjLnNldFJldm9jYXRpb25FbmFibGVkKCFjcHAuaXNSZXZvY2F0aW9uRW5hYmxlZCgpKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEZhbHNlKGNwcC5pc0V4cGxpY2l0UG9saWN5UmVxdWlyZWQoKSA9PSBjcHBjLmlzRXhwbGljaXRQb2xpY3lSZXF1aXJlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY3BwLmlzUmV2b2NhdGlvbkVuYWJsZWQoKSA9PSBjcHBjLmlzUmV2b2NhdGlvbkVuYWJsZWQoKSk7CisgICAgICAgIAorICAgICAgICBQS0lYUGFyYW1ldGVycyBjcHAxID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNwcDEuY2xvbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAvLyBleHBlY3RlZCAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRQb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogV2hlbiBhIDxjb2RlPlBLSVhQYXJhbWV0ZXJzPC9jb2RlPiBvYmplY3QgaXMgY3JlYXRlZCwKKyAgICAgKiB0aGlzIGZsYWcgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+PGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgUG9saWN5UXVhbGlmaWVyc1JlamVjdGVkIGZsYWcKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UG9saWN5UXVhbGlmaWVyc1JlamVjdGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmdldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5zZXRQb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogc2V0IHRoZSBuZXcgdmFsdWUgb2YgdGhlCisgICAgICogPGNvZGU+UG9saWN5UXVhbGlmaWVyc1JlamVjdGVkPC9jb2RlPiBmbGFnCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0UG9saWN5UXVhbGlmaWVyc1JlamVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZChmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJzZXRGYWxzZSIscC5nZXRQb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQoKSk7CisgICAgICAgIHAuc2V0UG9saWN5UXVhbGlmaWVyc1JlamVjdGVkKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJzZXRUcnVlIixwLmdldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5pc0FueVBvbGljeUluaGliaXRlZCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbnkgcG9saWN5CisgICAgICogT0lEIGlzIGluaGliaXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZTxicj4KKyAgICAgKiBBc3NlcnRpb246IEJ5IGRlZmF1bHQsIHRoZSBhbnkgcG9saWN5IE9JRCBpcyBub3QgaW5oaWJpdGVkCisgICAgICogKDxjb2RlPmlzQW55UG9saWN5SW5oaWJpdGVkKCk8L2NvZGU+IHJldHVybnMgZmFsc2UpLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0FueVBvbGljeUluaGliaXRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RJc0FueVBvbGljeUluaGliaXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocC5pc0FueVBvbGljeUluaGliaXRlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5zZXRBbnlQb2xpY3lJbmhpYml0ZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogc2V0cyBzdGF0ZSB0byBkZXRlcm1pbmUgaWYgdGhlIGFueSBwb2xpY3kgT0lECisgICAgICogc2hvdWxkIGJlIHByb2Nlc3NlZCBpZiBpdCBpcyBpbmNsdWRlZCBpbiBhIGNlcnRpZmljYXRlCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEFueVBvbGljeUluaGliaXRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0QW55UG9saWN5SW5oaWJpdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldEFueVBvbGljeUluaGliaXRlZCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic2V0VHJ1ZSIsIHAuaXNBbnlQb2xpY3lJbmhpYml0ZWQoKSk7CisgICAgICAgIHAuc2V0QW55UG9saWN5SW5oaWJpdGVkKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInNldEZhbHNlIiwgcC5pc0FueVBvbGljeUluaGliaXRlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5pc0V4cGxpY2l0UG9saWN5UmVxdWlyZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBleHBsaWNpdCBwb2xpY3kgaXMgcmVxdWlyZWQsCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZTxicj4KKyAgICAgKiBBc3NlcnRpb246IGJ5IGRlZmF1bHQsIHRoZSBFeHBsaWNpdFBvbGljeVJlcXVpcmVkIGZsYWcgaXMgZmFsc2UKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNFeHBsaWNpdFBvbGljeVJlcXVpcmVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdElzRXhwbGljaXRQb2xpY3lSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocC5pc0V4cGxpY2l0UG9saWN5UmVxdWlyZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+c2V0RXhwbGljaXRQb2xpY3lSZXF1aXJlZCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBzZXRzIHRoZSBFeHBsaWNpdFBvbGljeVJlcXVpcmVkIGZsYWcKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RXhwbGljaXRQb2xpY3lSZXF1aXJlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0RXhwbGljaXRQb2xpY3lSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24geyAKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIHAuc2V0RXhwbGljaXRQb2xpY3lSZXF1aXJlZCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic2V0VHJ1ZSIsIHAuaXNFeHBsaWNpdFBvbGljeVJlcXVpcmVkKCkpOworICAgICAgICBwLnNldEV4cGxpY2l0UG9saWN5UmVxdWlyZWQoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZSgic2V0RmFsc2UiLCBwLmlzRXhwbGljaXRQb2xpY3lSZXF1aXJlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5pc1BvbGljeU1hcHBpbmdJbmhpYml0ZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0cnVlIGlmIHBvbGljeSBtYXBwaW5nIGlzIGluaGliaXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQXNzZXJ0aW9uOiBieSBkZWZhdWx0LCBwb2xpY3kgbWFwcGluZyBpcyBub3QgaW5oaWJpdGVkICh0aGUgZmxhZyBpcyBmYWxzZSkKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzUG9saWN5TWFwcGluZ0luaGliaXRlZCByZXR1cm5zIGZhbHNlICIgKworICAgICAgICAgICAgImlmIHBvbGljeSBtYXBwaW5nIGlzIG5vdCBpbmhpYml0ZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNQb2xpY3lNYXBwaW5nSW5oaWJpdGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdElzUG9saWN5TWFwcGluZ0luaGliaXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocC5pc1BvbGljeU1hcHBpbmdJbmhpYml0ZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+c2V0UG9saWN5TWFwcGluZ0luaGliaXRlZCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBzZXRzIHRoZSBQb2xpY3lNYXBwaW5nSW5oaWJpdGVkIGZsYWcKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UG9saWN5TWFwcGluZ0luaGliaXRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0UG9saWN5TWFwcGluZ0luaGliaXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgcC5zZXRQb2xpY3lNYXBwaW5nSW5oaWJpdGVkKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJzZXRUcnVlIiwgcC5pc1BvbGljeU1hcHBpbmdJbmhpYml0ZWQoKSk7CisgICAgICAgIHAuc2V0UG9saWN5TWFwcGluZ0luaGliaXRlZChmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJzZXRGYWxzZSIsIHAuaXNQb2xpY3lNYXBwaW5nSW5oaWJpdGVkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmlzUG9saWN5TWFwcGluZ0luaGliaXRlZCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBSZXZvY2F0aW9uRW5hYmxlZCBmbGFnCisgICAgICogQXNzZXJ0aW9uOiB3aGVuIGEgPGNvZGU+UEtJWFBhcmFtZXRlcnM8L2NvZGU+IG9iamVjdCBpcyBjcmVhdGVkLAorICAgICAqIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZQorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaXNSZXZvY2F0aW9uRW5hYmxlZCBtZXRob2QgcmV0dXJucyB0cnVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmV2b2NhdGlvbkVuYWJsZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SXNSZXZvY2F0aW9uRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmlzUmV2b2NhdGlvbkVuYWJsZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+aXNQb2xpY3lNYXBwaW5nSW5oaWJpdGVkKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHNldHMgdGhlIFJldm9jYXRpb25FbmFibGVkIGZsYWcKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UmV2b2NhdGlvbkVuYWJsZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldFJldm9jYXRpb25FbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldFJldm9jYXRpb25FbmFibGVkKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInNldEZhbHNlIiwgcC5pc1Jldm9jYXRpb25FbmFibGVkKCkpOworICAgICAgICBwLnNldFJldm9jYXRpb25FbmFibGVkKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJzZXRUcnVlIiwgcC5pc1Jldm9jYXRpb25FbmFibGVkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFNpZ1Byb3ZpZGVyKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgdGhlIHNpZ25hdHVyZSBwcm92aWRlcidzIG5hbWUsCisgICAgICogb3IgbnVsbCBpZiBub3Qgc2V0CisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNpZ1Byb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFNpZ1Byb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBhc3NlcnROdWxsKCJub3Qgc2V0IiwgcC5nZXRTaWdQcm92aWRlcigpKTsKKyAgICAgICAgcC5zZXRTaWdQcm92aWRlcigiU29tZSBQcm92aWRlciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJzZXQiLCBwLmdldFNpZ1Byb3ZpZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnNldFNpZ1Byb3ZpZGVyKFN0cmluZyk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHNldHMgdGhlIHNpZ25hdHVyZSBwcm92aWRlcidzIG5hbWUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2lnUHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldFNpZ1Byb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBTdHJpbmcgc2lnUHJvdmlkZXJOYW1lID0gIlNvbWUgUHJvdmlkZXIiOworICAgICAgICBwLnNldFNpZ1Byb3ZpZGVyKHNpZ1Byb3ZpZGVyTmFtZSk7CisgICAgICAgIGFzc2VydFRydWUoInNldCIsIHNpZ1Byb3ZpZGVyTmFtZS5lcXVhbHMocC5nZXRTaWdQcm92aWRlcigpKSk7CisgICAgICAgIHAuc2V0U2lnUHJvdmlkZXIobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoInVuc2V0IiwgcC5nZXRTaWdQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBhIDxjb2RlPkNlcnRTZWxlY3RvcjwvY29kZT4gc3BlY2lmeWluZworICAgICAqIHRoZSBjb25zdHJhaW50cyBvbiB0aGUgdGFyZ2V0IGNlcnRpZmljYXRlIChvciA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldFRhcmdldENlcnRDb25zdHJhaW50cyBtZXRob2QgcmV0dXJucyBudWxsLCAiICsKKyAgICAgICAgICAgICJpZiBubyBjb25zdHJhaW50cyBhcmUgZGVmaW5lZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIGFzc2VydE51bGwocC5nZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IG5vdGUgdGhhdCB0aGUgPGNvZGU+Q2VydFNlbGVjdG9yPC9jb2RlPiByZXR1cm5lZAorICAgICAqIGlzIGNsb25lZCB0byBwcm90ZWN0IGFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgcmV0dXJuZWQgQ2VydFNlbGVjdG9yIGlzIGNsb25lZCB0byBwcm90ZWN0ICIgKworICAgICAgICAgICAgImFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRhcmdldENlcnRDb25zdHJhaW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciB4NTA5Y3MgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgcC5zZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoeDUwOWNzKTsKKyAgICAgICAgLy8gZ2V0IGNlcnQgc2VsZWN0b3IKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBjczEgPSAoWDUwOUNlcnRTZWxlY3RvcilwLmdldFRhcmdldENlcnRDb25zdHJhaW50cygpOworICAgICAgICAvLyBtb2RpZnkgcmV0dXJuZWQgc2VsZWN0b3IKKyAgICAgICAgY3MxLnNldElzc3Vlcih0ZXN0SXNzdWVyKTsKKyAgICAgICAgLy8gZ2V0IGNlcnQgc2VsZWN0b3IgYWdhaW4KKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBjczIgPSAoWDUwOUNlcnRTZWxlY3RvcilwLmdldFRhcmdldENlcnRDb25zdHJhaW50cygpOworICAgICAgICAvLyBjaGVjayB0aGF0IHNlbGVjdG9yIGlzIG5vdCB0aGUgc2FtZQorICAgICAgICBhc3NlcnROb3RTYW1lKCJub3RUaGVTYW1lIiwgY3MxLCBjczIpOworICAgICAgICAvLyBjaGVjayB0aGF0IHNlbGVjdG9yJ3MgaW50ZXJuYWwgc3RhdGUgaGFzCisgICAgICAgIC8vIG5vdCBiZWVuIGNoYW5nZWQgYnkgYWJvdmUgbW9kaWZpY2F0aW9uCisgICAgICAgIGFzc2VydEZhbHNlKCJzdGF0ZU5vdENoYW5nZWQiLCB0ZXN0SXNzdWVyLmVxdWFscyhjczIuZ2V0SXNzdWVyQXNTdHJpbmcoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnNldFRhcmdldENlcnRDb25zdHJhaW50cyhDZXJ0U2VsZWN0b3IpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBzZXRzIHRoZSByZXF1aXJlZCBjb25zdHJhaW50cyBvbiB0aGUgdGFyZ2V0IGNlcnRpZmljYXRlLgorICAgICAqIFRoZSBjb25zdHJhaW50cyBhcmUgc3BlY2lmaWVkIGFzIGFuIGluc3RhbmNlIG9mIENlcnRTZWxlY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IC4uLiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgbm8gY29uc3RyYWludHMgYXJlIGRlZmluZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHg1MDljcyA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisgICAgICAgIHg1MDljcy5zZXRJc3N1ZXIodGVzdElzc3Vlcik7CisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldFRhcmdldENlcnRDb25zdHJhaW50cyh4NTA5Y3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNldCIsCisgICAgICAgICAgdGVzdElzc3VlciwKKyAgICAgICAgICAoKFg1MDlDZXJ0U2VsZWN0b3IpcC5nZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMoKSkuZ2V0SXNzdWVyQXNTdHJpbmcoKSk7CisgICAgICAgIHAuc2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKG51bGwpOworICAgICAgICBhc3NlcnROdWxsKCJ1bnNldCIsIHAuZ2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPnNldFRhcmdldENlcnRDb25zdHJhaW50cyhDZXJ0U2VsZWN0b3IpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiAuLi4gdGhlIENlcnRTZWxlY3RvciBzcGVjaWZpZWQgaXMgY2xvbmVkIHRvIHByb3RlY3QgYWdhaW5zdAorICAgICAqIHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9ucworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJBZGRpdGlvbmFsIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRUYXJnZXRDZXJ0Q29uc3RyYWludHMwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHg1MDljcyA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldFRhcmdldENlcnRDb25zdHJhaW50cyh4NTA5Y3MpOworICAgICAgICAvLyBtb2RpZnkgc2VsZWN0b3IKKyAgICAgICAgeDUwOWNzLnNldElzc3Vlcih0ZXN0SXNzdWVyKTsKKyAgICAgICAgLy8gZ2V0IHNlbGVjdG9yCisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3IgeDUwOWNzMSA9IChYNTA5Q2VydFNlbGVjdG9yKXAuZ2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKCk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgc2VsZWN0b3IncyBpbnRlcm5hbCBzdGF0ZSBoYXMKKyAgICAgICAgLy8gbm90IGJlZW4gY2hhbmdlZCBieSBhYm92ZSBtb2RpZmljYXRpb24KKyAgICAgICAgYXNzZXJ0RmFsc2UodGVzdElzc3Vlci5lcXVhbHMoeDUwOWNzMS5nZXRJc3N1ZXJBc1N0cmluZygpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0Q2VydFN0b3JlcygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBsaXN0IC4uLiAobWF5IGJlIGVtcHR5LCBidXQgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRDZXJ0U3RvcmVzIG1ldGhvZCByZXR1cm5zIGVtcHR5IGxpc3QsICIgKworICAgICAgICAgICAgImJ1dCBub3QgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDZXJ0U3RvcmVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENlcnRTdG9yZXMwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm90TnVsbCIsIHAuZ2V0Q2VydFN0b3JlcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaXNFbXB0eSIsIHAuZ2V0Q2VydFN0b3JlcygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0Q2VydFN0b3JlcygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGFuIGltbXV0YWJsZSA8Y29kZT5MaXN0PC9jb2RlPgorICAgICAqIG9mIDxjb2RlPkNlcnRTdG9yZXM8L2NvZGU+CisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRDZXJ0U3RvcmVzIG1ldGhvZCByZXR1cm5zIGFuIGltbXV0YWJsZSBMaXN0ICIgKworICAgICAgICAgICAgIm9mIENlcnRTdG9yZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydFN0b3JlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRDZXJ0U3RvcmVzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIExpc3Q8Q2VydFN0b3JlPiBjcyA9IHAuZ2V0Q2VydFN0b3JlcygpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB0cnkgdG8gbW9kaWZ5IHJldHVybmVkIGxpc3QKKyAgICAgICAgICAgIGNzLmFkZCgoQ2VydFN0b3JlKShuZXcgT2JqZWN0KCkpKTsKKyAgICAgICAgICAgIGZhaWwoIm11c3QgYmUgaW1tdXRhYmxlIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5zZXRDZXJ0U3RvcmVzKExpc3QpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBTZXRzIHRoZSBsaXN0IG9mIENlcnRTdG9yZXMgLi4uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2VydFN0b3JlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldENlcnRTdG9yZXMwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgcC5zZXRDZXJ0U3RvcmVzKFRlc3RVdGlscy5nZXRDb2xsZWN0aW9uQ2VydFN0b3Jlc0xpc3QoKSk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgbGlzdCBoYXMgYmVlbiBzZXQKKyAgICAgICAgYXNzZXJ0RmFsc2UocC5nZXRDZXJ0U3RvcmVzKCkuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5zZXRDZXJ0U3RvcmVzKExpc3QpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBsaXN0IC4uLiBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2VydFN0b3JlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldENlcnRTdG9yZXMwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgLy8gYWRkIG51bGwKKyAgICAgICAgcC5zZXRDZXJ0U3RvcmVzKG51bGwpOworICAgICAgICAvLyBjaGVjayB0aGF0IHdlIGhhdmUgbm9uIG51bGwgZW1wdHkgbGlzdCBub3cKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm90TnVsbDEiLCBwLmdldENlcnRTdG9yZXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoImlzRW1wdHkxIiwgcC5nZXRDZXJ0U3RvcmVzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgLy8gYWRkIGVtcHR5CisgICAgICAgIHAuc2V0Q2VydFN0b3JlcyhuZXcgQXJyYXlMaXN0PENlcnRTdG9yZT4oKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIm5vdE51bGwyIiwgcC5nZXRDZXJ0U3RvcmVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJpc0VtcHR5MiIsIHAuZ2V0Q2VydFN0b3JlcygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+c2V0Q2VydFN0b3JlcyhMaXN0KTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogbGlzdCBpcyBjb3BpZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9ucworICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCB0aGUgbGlzdCBpcyBjb3BpZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHN1YnNlcXVlbnQgIiArCisgICAgICAgICAgICAibW9kaWZpY2F0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDZXJ0U3RvcmVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0Q2VydFN0b3JlczAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBMaXN0PENlcnRTdG9yZT4gbCA9IFRlc3RVdGlscy5nZXRDb2xsZWN0aW9uQ2VydFN0b3Jlc0xpc3QoKTsKKyAgICAgICAgcC5zZXRDZXJ0U3RvcmVzKGwpOworICAgICAgICAvLyBtb2RpZnkgbGlzdCBqdXN0IHNldAorICAgICAgICBsLmNsZWFyKCk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgbGlzdCBtYWludGFpbmVkIGludGVybmFsbHkgaGFzCisgICAgICAgIC8vIG5vdCBiZWVuIGNoYW5nZWQgYnkgdGhlIGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICBhc3NlcnRGYWxzZShwLmdldENlcnRTdG9yZXMoKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzQgZm9yIDxjb2RlPnNldENlcnRTdG9yZXMoTGlzdCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPkNsYXNzQ2FzdEV4Y2VwdGlvbjwvY29kZT4gLQorICAgICAqIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QgYXJlIG5vdCBvZiB0eXBlCisgICAgICogPGNvZGU+amF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZTwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIENsYXNzQ2FzdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDZXJ0U3RvcmVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0Q2VydFN0b3JlczA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBMaXN0IGwgPSBUZXN0VXRpbHMuZ2V0Q29sbGVjdGlvbkNlcnRTdG9yZXNMaXN0KCk7CisgICAgICAgIC8vIGFkZCB3cm9uZyBvYmplY3QgdG8gdmFsaWQgc2V0CisgICAgICAgIGFzc2VydFRydWUobC5hZGQobmV3IE9iamVjdCgpKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuc2V0Q2VydFN0b3JlcyhsKTsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzQ2FzdEV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+YWRkQ2VydFN0b3JlKENlcnRTdG9yZSk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IGFkZHMgYSA8Y29kZT5DZXJ0U3RvcmU8L2NvZGU+IHRvIHRoZSBlbmQgb2YgdGhlCisgICAgICogbGlzdCBvZiA8Y29kZT5DZXJ0U3RvcmVzPC9jb2RlPiAKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENsYXNzQ2FzdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRDZXJ0U3RvcmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEFkZENlcnRTdG9yZTAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLmFkZENlcnRTdG9yZShDZXJ0U3RvcmUuZ2V0SW5zdGFuY2UoIkNvbGxlY3Rpb24iLAorICAgICAgICAgICAgICAgIG5ldyBDb2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycygpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHAuZ2V0Q2VydFN0b3JlcygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+YWRkQ2VydFN0b3JlKENlcnRTdG9yZSk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IGlmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgc3RvcmUgaXMgaWdub3JlZCAobm90IGFkZGVkIHRvIGxpc3QpIAorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQ2VydFN0b3JlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBZGRDZXJ0U3RvcmUwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgcC5hZGRDZXJ0U3RvcmUobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUocC5nZXRDZXJ0U3RvcmVzKCkuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRDZXJ0UGF0aENoZWNrZXJzKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IGxpc3QgLi4uIG1heSBiZSBlbXB0eSwgYnV0IG5vdCA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0Q2VydFBhdGhDaGVja2VycyBtZXRob2QgcmV0dXJucyBub3QgZW1wdHkgIiArCisgICAgICAgICAgICAibGlzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDZXJ0UGF0aENoZWNrZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENlcnRQYXRoQ2hlY2tlcnMwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgTGlzdCBsID0gcC5nZXRDZXJ0UGF0aENoZWNrZXJzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIm5vdE51bGwiLCBsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaXNFbXB0eSIsbC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmdldENlcnRQYXRoQ2hlY2tlcnMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBhbiBpbW11dGFibGUgPGNvZGU+TGlzdDwvY29kZT4KKyAgICAgKiBvZiA8Y29kZT5QS0lYQ2VydFBhdGhDaGVja2VyPC9jb2RlPnMKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldENlcnRQYXRoQ2hlY2tlcnMgbWV0aG9kIHJldHVybnMgYW4gaW1tdXRhYmxlICIgKworICAgICAgICAgICAgIkxpc3Qgb2YgUEtJWENlcnRQYXRoQ2hlY2tlciBvYmplY3RzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENlcnRQYXRoQ2hlY2tlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0Q2VydFBhdGhDaGVja2VyczAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBMaXN0PFBLSVhDZXJ0UGF0aENoZWNrZXI+IGwgPSBwLmdldENlcnRQYXRoQ2hlY2tlcnMoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdHJ5IHRvIG1vZGlmeSByZXR1cm5lZCBsaXN0CisgICAgICAgICAgICBsLmFkZCgoUEtJWENlcnRQYXRoQ2hlY2tlciluZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgZmFpbCgibXVzdCBiZSBpbW11dGFibGUiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPmdldENlcnRQYXRoQ2hlY2tlcnMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogVGhlIHJldHVybmVkIExpc3QgaXMgaW1tdXRhYmxlLCBhbmQgZWFjaAorICAgICAqIDxjb2RlPlBLSVhDZXJ0UGF0aENoZWNrZXI8L2NvZGU+IGluIHRoZSA8Y29kZT5MaXN0PC9jb2RlPgorICAgICAqIGlzIGNsb25lZCB0byBwcm90ZWN0IGFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIExpc3QgaXMgaW1tdXRhYmxlLCBhbmQgZWFjaCAiICsgCisgICAgICAgICAgICAiUEtJWENlcnRQYXRoQ2hlY2tlciBpbiB0aGUgTGlzdCAiICsgCisgICAgICAgICAgICAiaXMgY2xvbmVkIHRvIHByb3RlY3QgYWdhaW5zdCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydFBhdGhDaGVja2VycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRDZXJ0UGF0aENoZWNrZXJzMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgY3BjID0gVGVzdFV0aWxzLmdldFRlc3RDZXJ0UGF0aENoZWNrZXIoKTsKKyAgICAgICAgTGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPiBsID0gbmV3IEFycmF5TGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPigpOworICAgICAgICBhc3NlcnRUcnVlKCJhZGRlZE9rIiwgbC5hZGQoY3BjKSk7CisgICAgICAgIHAuc2V0Q2VydFBhdGhDaGVja2VycyhsKTsKKyAgICAgICAgLy8gcmV0cmlldmUgY2hlY2tlciBhbmQgbW9kaWZ5IGl0CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgY3BjMSA9IHAuZ2V0Q2VydFBhdGhDaGVja2VycygpLmdldCgwKTsKKyAgICAgICAgY3BjMS5pbml0KHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJtb2RpZmllZE9rIiwgY3BjMS5pc0ZvcndhcmRDaGVja2luZ1N1cHBvcnRlZCgpKTsKKyAgICAgICAgLy8gcmV0cmlldmUgY2hlY2tlciBhZ2FpbiBhbmQgY2hlY2sKKyAgICAgICAgLy8gdGhhdCBpdHMgc3RhdGUgaGFzIG5vdCBiZWVuIGNoYW5nZWQKKyAgICAgICAgLy8gYnkgdGhlIGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICBQS0lYQ2VydFBhdGhDaGVja2VyIGNwYzIgPSBwLmdldENlcnRQYXRoQ2hlY2tlcnMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJpc0Nsb25lZCIsIGNwYzIuaXNGb3J3YXJkQ2hlY2tpbmdTdXBwb3J0ZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+c2V0Q2VydFBhdGhDaGVja2VycyhMaXN0KTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogc2V0cyBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIGFkZGl0aW9uYWwKKyAgICAgKiBjZXJ0aWZpY2F0aW9uIHBhdGggY2hlY2tlcnMKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENlcnRQYXRoQ2hlY2tlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRDZXJ0UGF0aENoZWNrZXJzMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgY3BjID0gVGVzdFV0aWxzLmdldFRlc3RDZXJ0UGF0aENoZWNrZXIoKTsKKyAgICAgICAgTGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPiBsID0gbmV3IEFycmF5TGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPigpOworICAgICAgICBhc3NlcnRUcnVlKCJhZGRlZE9rIiwgbC5hZGQoY3BjKSk7CisgICAgICAgIHAuc2V0Q2VydFBhdGhDaGVja2VycyhsKTsKKyAgICAgICAgTGlzdCBsMSA9IHAuZ2V0Q2VydFBhdGhDaGVja2VycygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJub3ROdWxsIiwgbDEpOworICAgICAgICBhc3NlcnRGYWxzZSgiaXNOb3RFbXB0eSIsIGwxLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+c2V0Q2VydFBhdGhDaGVja2VycyhMaXN0KTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+TGlzdDwvY29kZT4gLi4uIG1heSBiZSBudWxsCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDZXJ0UGF0aENoZWNrZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5MaXN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0Q2VydFBhdGhDaGVja2VyczAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldENlcnRQYXRoQ2hlY2tlcnMobnVsbCk7CisgICAgICAgIExpc3Q8UEtJWENlcnRQYXRoQ2hlY2tlcj4gbDEgPSBwLmdldENlcnRQYXRoQ2hlY2tlcnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm90TnVsbDEiLCBsMSk7CisgICAgICAgIGFzc2VydFRydWUoImlzRW1wdHkxIiwgbDEuaXNFbXB0eSgpKTsKKyAgICAgICAgcC5zZXRDZXJ0UGF0aENoZWNrZXJzKG5ldyBBcnJheUxpc3Q8UEtJWENlcnRQYXRoQ2hlY2tlcj4oKSk7CisgICAgICAgIExpc3QgbDIgPSBwLmdldENlcnRQYXRoQ2hlY2tlcnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm90TnVsbDIiLCBsMik7CisgICAgICAgIGFzc2VydFRydWUoImlzRW1wdHkyIiwgbDIuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5zZXRDZXJ0UGF0aENoZWNrZXJzKExpc3QpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5MaXN0PC9jb2RlPiBzdXBwbGllZCBoZXJlIGlzIGNvcGllZCBhbmQgZWFjaAorICAgICAqIDxjb2RlPlBLSVhDZXJ0UGF0aENoZWNrZXI8L2NvZGU+IGluIHRoZSBsaXN0IGlzIGNsb25lZCB0byBwcm90ZWN0CisgICAgICogYWdhaW5zdCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbnMKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENlcnRQYXRoQ2hlY2tlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRDZXJ0UGF0aENoZWNrZXJzMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY2hlY2tzIHRoYXQgbGlzdCBjb3BpZWQKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgY3BjID0gVGVzdFV0aWxzLmdldFRlc3RDZXJ0UGF0aENoZWNrZXIoKTsKKyAgICAgICAgTGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPiBsID0gbmV3IEFycmF5TGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPigpOworICAgICAgICBhc3NlcnRUcnVlKCJhZGRlZE9rIiwgbC5hZGQoY3BjKSk7CisgICAgICAgIHAuc2V0Q2VydFBhdGhDaGVja2VycyhsKTsKKyAgICAgICAgLy8gbW9kaWZ5IGxpc3QKKyAgICAgICAgbC5jbGVhcigpOworICAgICAgICAvLyByZXRyaWV2ZSBsaXN0IGFuZCBjaGVjaworICAgICAgICAvLyB0aGF0IGl0cyBzdGF0ZSBoYXMgbm90IGJlZW4gY2hhbmdlZAorICAgICAgICAvLyBieSB0aGUgYWJvdmUgbW9kaWZpY2F0aW9uCisgICAgICAgIGFzc2VydEZhbHNlKCJpc0NvcGllZCIsIHAuZ2V0Q2VydFBhdGhDaGVja2VycygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+c2V0Q2VydFBhdGhDaGVja2VycyhMaXN0KTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+TGlzdDwvY29kZT4gc3VwcGxpZWQgaGVyZSBpcyBjb3BpZWQgYW5kIGVhY2gKKyAgICAgKiA8Y29kZT5QS0lYQ2VydFBhdGhDaGVja2VyPC9jb2RlPiBpbiB0aGUgbGlzdCBpcyBjbG9uZWQgdG8gcHJvdGVjdAorICAgICAqIGFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2VydFBhdGhDaGVja2VycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTGlzdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldENlcnRQYXRoQ2hlY2tlcnMwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjaGVja3MgdGhhdCBjaGVja2VycyBjbG9uZWQKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgY3BjID0gVGVzdFV0aWxzLmdldFRlc3RDZXJ0UGF0aENoZWNrZXIoKTsKKyAgICAgICAgTGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPiBsID0gbmV3IEFycmF5TGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPigpOworICAgICAgICBhc3NlcnRUcnVlKCJhZGRlZE9rIiwgbC5hZGQoY3BjKSk7CisgICAgICAgIHAuc2V0Q2VydFBhdGhDaGVja2VycyhsKTsKKyAgICAgICAgLy8gbW9kaWZ5IGNoZWNrZXIKKyAgICAgICAgY3BjLmluaXQodHJ1ZSk7CisgICAgICAgIC8vIHJldHJpZXZlIGxpc3QgYW5kIGNoZWNrIHRoYXQgQ2VydFBhdGhDaGVja2VyJ3MKKyAgICAgICAgLy8gc3RhdGUgaXQgY29udGFpbnMgaGFzIG5vdCBiZWVuIGNoYW5nZWQgYnkgdGhlCisgICAgICAgIC8vIGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICBQS0lYQ2VydFBhdGhDaGVja2VyIGNwYzEgPSBwLmdldENlcnRQYXRoQ2hlY2tlcnMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJpc0NvcGllZCIsIGNwYzEuaXNGb3J3YXJkQ2hlY2tpbmdTdXBwb3J0ZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IgPGNvZGU+c2V0Q2VydFBhdGhDaGVja2VycyhMaXN0KTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+Q2xhc3NDYXN0RXhjZXB0aW9uPC9jb2RlPiAtCisgICAgICogaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUgbm90IG9mIHR5cGUKKyAgICAgKiA8Y29kZT5qYXZhLnNlY3VyaXR5LmNlcnQuUEtJWENlcnRQYXRoQ2hlY2tlcjwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZnkgZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENlcnRQYXRoQ2hlY2tlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxpc3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRDZXJ0UGF0aENoZWNrZXJzMDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgY3BjID0gVGVzdFV0aWxzLmdldFRlc3RDZXJ0UGF0aENoZWNrZXIoKTsKKyAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdDxQS0lYQ2VydFBhdGhDaGVja2VyPigpOworICAgICAgICBhc3NlcnRUcnVlKCJhZGRlZE9rIiwgbC5hZGQoY3BjKSk7CisgICAgICAgIC8vIGFkZCB3cm9uZyBvYmplY3QgdG8gdGhlIGxpc3QKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYWRkZWRPayIsIGwuYWRkKG5ldyBPYmplY3QoKSkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnNldENlcnRQYXRoQ2hlY2tlcnMobCk7CisgICAgICAgICAgICBmYWlsKCJDbGFzc0Nhc3RFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmFkZENlcnRQYXRoQ2hlY2tlcihQS0lYQ2VydFBhdGhDaGVja2VyKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogYWRkcyBhIDxjb2RlPkNlcnRQYXRoQ2hlY2tlcjwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBsaXN0IG9mIDxjb2RlPkNlcnRQYXRoQ2hlY2tlcjwvY29kZT5zIAorICAgICAqIEB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRDZXJ0UGF0aENoZWNrZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LlBLSVhDZXJ0UGF0aENoZWNrZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBZGRDZXJ0UGF0aENoZWNrZXIwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgUEtJWENlcnRQYXRoQ2hlY2tlciBjcGMgPSBUZXN0VXRpbHMuZ2V0VGVzdENlcnRQYXRoQ2hlY2tlcigpOworICAgICAgICBMaXN0PFBLSVhDZXJ0UGF0aENoZWNrZXI+IGwgPSBuZXcgQXJyYXlMaXN0PFBLSVhDZXJ0UGF0aENoZWNrZXI+KCk7CisgICAgICAgIGFzc2VydFRydWUoImFkZGVkT2siLCBsLmFkZChjcGMpKTsKKyAgICAgICAgcC5zZXRDZXJ0UGF0aENoZWNrZXJzKGwpOworICAgICAgICAvLyBjcmVhdGUgb25lIG1vcmUgUEtJWENlcnRQYXRoQ2hlY2tlcgorICAgICAgICBQS0lYQ2VydFBhdGhDaGVja2VyIGNwYzEgPSBUZXN0VXRpbHMuZ2V0VGVzdENlcnRQYXRoQ2hlY2tlcigpOworICAgICAgICBjcGMxLmluaXQodHJ1ZSk7CisgICAgICAgIHAuYWRkQ2VydFBhdGhDaGVja2VyKGNwYzEpOworICAgICAgICAvLyBjaGVjayB0aGF0IHdlIGhhdmUgdHdvIFBLSVhDZXJ0UGF0aENoZWNrZXJzIGFuZAorICAgICAgICAvLyB0aGV5IGFyZSBpbiByaWdodCBvcmRlcgorICAgICAgICBMaXN0IGwxID0gcC5nZXRDZXJ0UGF0aENoZWNrZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygibGlzdFNpemUiLCAyLCBsMS5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgib3JkZXIxIiwKKyAgICAgICAgICAgICAgICAoKFBLSVhDZXJ0UGF0aENoZWNrZXIpbDEuZ2V0KDApKS5pc0ZvcndhcmRDaGVja2luZ1N1cHBvcnRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgib3JkZXIyIiwKKyAgICAgICAgICAgICAgICAoKFBLSVhDZXJ0UGF0aENoZWNrZXIpbDEuZ2V0KDEpKS5pc0ZvcndhcmRDaGVja2luZ1N1cHBvcnRlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5hZGRDZXJ0UGF0aENoZWNrZXIoUEtJWENlcnRQYXRoQ2hlY2tlcik8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IGlmIG51bGwsIHRoZSBjaGVja2VyIGlzIGlnbm9yZWQgKG5vdCBhZGRlZCB0byBsaXN0KS4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlmIFBLSVhDZXJ0UGF0aENoZWNrZXIgcGFyYW1ldGVyIGlzIG51bGwsICIgKworICAgICAgICAgICAgInRoZSBjaGVja2VyIGlzIGlnbm9yZWQgKG5vdCBhZGRlZCB0byBsaXN0KS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRDZXJ0UGF0aENoZWNrZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LlBLSVhDZXJ0UGF0aENoZWNrZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBZGRDZXJ0UGF0aENoZWNrZXIwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgUEtJWENlcnRQYXRoQ2hlY2tlciBjcGMgPSBUZXN0VXRpbHMuZ2V0VGVzdENlcnRQYXRoQ2hlY2tlcigpOworICAgICAgICBMaXN0PFBLSVhDZXJ0UGF0aENoZWNrZXI+IGwgPSBuZXcgQXJyYXlMaXN0PFBLSVhDZXJ0UGF0aENoZWNrZXI+KCk7CisgICAgICAgIGFzc2VydFRydWUoImFkZGVkT2siLCBsLmFkZChjcGMpKTsKKyAgICAgICAgcC5zZXRDZXJ0UGF0aENoZWNrZXJzKGwpOworICAgICAgICAvLyB0cnkgdG8gYWRkIG51bGwKKyAgICAgICAgcC5hZGRDZXJ0UGF0aENoZWNrZXIobnVsbCk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UgaGF2ZSBvbmUgUEtJWENlcnRQYXRoQ2hlY2tlcgorICAgICAgICBMaXN0IGwxID0gcC5nZXRDZXJ0UGF0aENoZWNrZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygibGlzdFNpemUiLCAxLCBsMS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPmFkZENlcnRQYXRoQ2hlY2tlcihQS0lYQ2VydFBhdGhDaGVja2VyKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+UEtJWENlcnRQYXRoQ2hlY2tlcjwvY29kZT4gaXMgY2xvbmVkIHRvIHByb3RlY3QKKyAgICAgKiBhZ2FpbnN0IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9ucworICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IFBLSVhDZXJ0UGF0aENoZWNrZXIgaXMgY2xvbmVkIHRvIHByb3RlY3QgIiArIAorICAgICAgICAgICAgImFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZENlcnRQYXRoQ2hlY2tlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWENlcnRQYXRoQ2hlY2tlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEFkZENlcnRQYXRoQ2hlY2tlcjAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrcyB0aGF0IGNoZWNrZXJzIGNsb25lZAorICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgUEtJWENlcnRQYXRoQ2hlY2tlciBjcGMgPSBUZXN0VXRpbHMuZ2V0VGVzdENlcnRQYXRoQ2hlY2tlcigpOworCisgICAgICAgIHAuYWRkQ2VydFBhdGhDaGVja2VyKGNwYyk7CisgICAgICAgIC8vIG1vZGlmeSBjaGVja2VyCisgICAgICAgIGNwYy5pbml0KHRydWUpOworICAgICAgICAvLyByZXRyaWV2ZSBsaXN0IGFuZCBjaGVjayB0aGF0IENlcnRQYXRoQ2hlY2tlcidzCisgICAgICAgIC8vIHN0YXRlIGl0IGNvbnRhaW5zIGhhcyBub3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZQorICAgICAgICAvLyBhYm92ZSBtb2RpZmljYXRpb24KKyAgICAgICAgTGlzdCBsID0gcC5nZXRDZXJ0UGF0aENoZWNrZXJzKCk7CisgICAgICAgIFBLSVhDZXJ0UGF0aENoZWNrZXIgY3BjMSA9IChQS0lYQ2VydFBhdGhDaGVja2VyKWwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpc3RTaXplIiwgMSwgbC5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiaXNDb3BpZWQiLCBjcGMxLmlzRm9yd2FyZENoZWNraW5nU3VwcG9ydGVkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldERhdGUoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogdGhlIDxjb2RlPkRhdGU8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0IAorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RGF0ZTAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICAvLyB0aGUgRGF0ZSBoYXMgbm90IGJlZW4gc2V0CisgICAgICAgIC8vIHRoZSBtZXRob2QgbXVzdCByZXR1cm4gbnVsbAorICAgICAgICBhc3NlcnROdWxsKCJudWxsIiwgcC5nZXREYXRlKCkpOworICAgICAgICBEYXRlIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgcC5zZXREYXRlKGN1cnJlbnREYXRlKTsKKyAgICAgICAgLy8gdGhlIERhdGUgcmV0dXJuZWQgbXVzdCBtYXRjaAorICAgICAgICBhc3NlcnRFcXVhbHMoIm5vdE51bGwiLCBjdXJyZW50RGF0ZSwgcC5nZXREYXRlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmdldERhdGUoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogPGNvZGU+RGF0ZTwvY29kZT4gcmV0dXJuZWQgaXMgY29waWVkIHRvIHByb3RlY3QKKyAgICAgKiBhZ2FpbnN0IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9ucyAKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHJldHVybmVkIERhdGUgaXMgY29waWVkIHRvIHByb3RlY3QiICsgCisgICAgICAgICAgICAiIGFnYWluc3Qgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RGF0ZTAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBEYXRlIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgcC5zZXREYXRlKChEYXRlKWN1cnJlbnREYXRlLmNsb25lKCkpOworICAgICAgICBEYXRlIHJldDEgPSBwLmdldERhdGUoKTsKKyAgICAgICAgLy8gbW9kaWZ5IERhdGUgcmV0dXJuZWQKKyAgICAgICAgcmV0MS5zZXRUaW1lKDBMKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbnRlcm5hbCBEYXRlIGhhcyBub3QgYmVlbgorICAgICAgICAvLyBjaGFuZ2VkIGJ5IHRoZSBhYm92ZSBtb2RpZmljYXRpb24KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGN1cnJlbnREYXRlLCBwLmdldERhdGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5QS0lYUGFyYW1ldGVycyNzZXREYXRlKERhdGUpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkRhdGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIF90ZXN0X3NldERhdGVMamF2YV91dGlsX0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0IiwgdGFTZXQpOworCisgICAgICAgIC8vIHRlc3Q6ICdkYXRlJyBpcyB1bnNldCBhbmQgcGFyYW0gaXMgbnVsbCAKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIHAuc2V0RGF0ZShudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwLmdldERhdGUoKSk7CisKKyAgICAgICAgLy8gdGVzdDogJ2RhdGUnIGlzIG5vdCBudWxsIAorICAgICAgICBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgRGF0ZSB0b0JlU2V0ID0gbmV3IERhdGUoNTU1TCk7CisgICAgICAgIHAuc2V0RGF0ZSh0b0JlU2V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDU1NUwsIHAuZ2V0RGF0ZSgpLmdldFRpbWUoKSk7CisgICAgICAgIC8vIG1vZGlmeSBpbml0aWFsICdkYXRlJyAtIGl0IHNob3VsZCBiZSBjb3BpZWQgYnkgY29uc3RydWN0b3IKKyAgICAgICAgdG9CZVNldC5zZXRUaW1lKDBMKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbnRlcm5hbCAnZGF0ZScgaGFzIG5vdCBiZWVuCisgICAgICAgIC8vIGNoYW5nZWQgYnkgdGhlIGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICBhc3NlcnRFcXVhbHMoNTU1TCwgcC5nZXREYXRlKCkuZ2V0VGltZSgpKTsKKyAgICAgICAgLy8gc2V0IGFub3RoZXIgJ2RhdGUnCisgICAgICAgIHAuc2V0RGF0ZShuZXcgRGF0ZSgzMzNMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMzNMLCBwLmdldERhdGUoKS5nZXRUaW1lKCkpOworICAgICAgICAKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0yODgyIChub24tYnVnIGRpZmZlcmVuY2UgZnJvbSBSSSkKKyAgICAgICAgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIHAuc2V0RGF0ZShuZXcgRGF0ZSg1NTVMKSk7CisgICAgICAgIHAuc2V0RGF0ZShudWxsKTsgLy8gcmVzZXQgJ2RhdGUnIGJhY2sgdG8gY3VycmVudCB0aW1lCisgICAgICAgIGFzc2VydE5vdE51bGwocC5nZXREYXRlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCksIHAuZ2V0RGF0ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRJbml0aWFsUG9saWNpZXMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogVGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlzIGFuIGVtcHR5IDxjb2RlPlNldDwvY29kZT4KKyAgICAgKiBBc3NlcnRpb246IE5ldmVyIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldEluaXRpYWxQb2xpY2llcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBTZXQgIiArCisgICAgICAgICAgICAiYW5kIG5ldmVyIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5pdGlhbFBvbGljaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEluaXRpYWxQb2xpY2llczAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJub3ROdWxsIiwgcC5nZXRJbml0aWFsUG9saWNpZXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoImlzRW1wdHkiLCBwLmdldEluaXRpYWxQb2xpY2llcygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0SW5pdGlhbFBvbGljaWVzKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgYW4gaW1tdXRhYmxlIDxjb2RlPlNldDwvY29kZT4gb2YgaW5pdGlhbAorICAgICAqIHBvbGljeSBPSURzIGluIDxjb2RlPlN0cmluZzwvY29kZT4gZm9ybWF0PGJyPgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0SW5pdGlhbFBvbGljaWVzIG1ldGhvZCByZXR1cm5zIGFuIGltbXV0YWJsZSAiICsKKyAgICAgICAgICAgICJTZXQgb2YgaW5pdGlhbCBwb2xpY3kgaW4gU3RyaW5nIGZvcm1hdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbml0aWFsUG9saWNpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0SW5pdGlhbFBvbGljaWVzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFNldDxTdHJpbmc+IHMgPSBwLmdldEluaXRpYWxQb2xpY2llcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdHJ5IHRvIG1vZGlmeSByZXR1cm5lZCBzZXQKKyAgICAgICAgICAgIHMuYWRkKChTdHJpbmcpbmV3IE9iamVjdCgpKTsKKyAgICAgICAgICAgIGZhaWwoIm11c3QgYmUgaW1tdXRhYmxlIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5zZXRJbml0aWFsUG9saWNpZXMoU2V0KTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogc2V0cyB0aGUgPGNvZGU+U2V0PC9jb2RlPiBvZiBpbml0aWFsIHBvbGljeQorICAgICAqIGlkZW50aWZpZXJzIChPSUQgc3RyaW5ncykKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW5pdGlhbFBvbGljaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRJbml0aWFsUG9saWNpZXMwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8U3RyaW5nPiBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBzLmFkZCgiMS4yLjMuNC41LjYuNyIpOworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgcC5zZXRJbml0aWFsUG9saWNpZXMocyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwLmdldEluaXRpYWxQb2xpY2llcygpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+c2V0SW5pdGlhbFBvbGljaWVzKFNldCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPlNldDwvY29kZT4gbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJbml0aWFsUG9saWNpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldEluaXRpYWxQb2xpY2llczAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldEluaXRpYWxQb2xpY2llcyhudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmdldEluaXRpYWxQb2xpY2llcygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+c2V0SW5pdGlhbFBvbGljaWVzKFNldCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPlNldDwvY29kZT4gbWF5IGJlIGVtcHR5CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEluaXRpYWxQb2xpY2llcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0SW5pdGlhbFBvbGljaWVzMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIHAuc2V0SW5pdGlhbFBvbGljaWVzKG5ldyBIYXNoU2V0PFN0cmluZz4oKSk7CisgICAgICAgIGFzc2VydFRydWUocC5nZXRJbml0aWFsUG9saWNpZXMoKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzQgZm9yIDxjb2RlPnNldEluaXRpYWxQb2xpY2llcyhTZXQpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5TZXQ8L2NvZGU+IGlzIGNvcGllZCB0byBwcm90ZWN0IGFnYWluc3QKKyAgICAgKiBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IFNldCBpcyBjb3BpZWQgdG8gcHJvdGVjdCBhZ2FpbnN0ICIgKyAKKyAgICAgICAgICAgICJzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW5pdGlhbFBvbGljaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRJbml0aWFsUG9saWNpZXMwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8U3RyaW5nPiBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBzLmFkZCgiMS4yLjMuNC41LjYuNyIpOworICAgICAgICBzLmFkZCgiMS4yLjMuNC41LjYuOCIpOworICAgICAgICBQS0lYUGFyYW1ldGVycyBwID0gbmV3IFBLSVhQYXJhbWV0ZXJzKHRhU2V0KTsKKyAgICAgICAgcC5zZXRJbml0aWFsUG9saWNpZXMocyk7CisgICAgICAgIC8vIG1vZGlmeSBvcmlnaW5hbCBzZXQKKyAgICAgICAgcy5jbGVhcigpOworICAgICAgICAvLyBjaGVjayB0aGF0IHNldCBtYWludGFpbmVkIGludGVybmFsbHkgaGFzCisgICAgICAgIC8vIG5vdCBiZWVuIGNoYW5nZWQgYnkgdGhlIGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcC5nZXRJbml0aWFsUG9saWNpZXMoKS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzUgZm9yIDxjb2RlPnNldEluaXRpYWxQb2xpY2llcyhTZXQpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5DbGFzc0Nhc3RFeGNlcHRpb248L2NvZGU+IC0KKyAgICAgKiBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzZXQgYXJlIG5vdCBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDbGFzc0Nhc3RFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW5pdGlhbFBvbGljaWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5TZXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRJbml0aWFsUG9saWNpZXMwNSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHRhU2V0ID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIGlmICh0YVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICI6IG5vdCBwZXJmb3JtZWQgKGNvdWxkIG5vdCBjcmVhdGUgdGVzdCBUcnVzdEFuY2hvciBzZXQpIik7CisgICAgICAgIH0KKworICAgICAgICBTZXQgcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIHMuYWRkKCIxLjIuMy40LjUuNi43Iik7CisgICAgICAgIHMuYWRkKG5ldyBPYmplY3QoKSk7CisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5zZXRJbml0aWFsUG9saWNpZXMocyk7CisgICAgICAgICAgICBmYWlsKCJDbGFzc0Nhc3RFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldFRydXN0QW5jaG9ycygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBhbiBpbW11dGFibGUgPGNvZGU+U2V0PC9jb2RlPiBvZiA8Y29kZT5UcnVzdEFuY2hvcnM8L2NvZGU+CisgICAgICogKG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+KSAKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldFRydXN0QW5jaG9ycyByZXR1cm5zIGFuIGltbXV0YWJsZSBTZXQgb2YgIiArCisgICAgICAgICAgICAiVHJ1c3RBbmNob3JzLCBhbmQgbmV2ZXIgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUcnVzdEFuY2hvcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VHJ1c3RBbmNob3JzMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIm5vdE51bGwiLCBwLmdldFRydXN0QW5jaG9ycygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5nZXRUcnVzdEFuY2hvcnMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogYW4gaW1tdXRhYmxlIDxjb2RlPlNldDwvY29kZT4gb2YgPGNvZGU+VHJ1c3RBbmNob3JzPC9jb2RlPgorICAgICAqIChuZXZlciA8Y29kZT5udWxsPC9jb2RlPikgCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRUcnVzdEFuY2hvcnMgcmV0dXJucyBhbiBpbW11dGFibGUgc2V0IG9mICIgKworICAgICAgICAgICAgIlRydXN0QW5jaG9ycywgYW5kIG5ldmVyIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHJ1c3RBbmNob3JzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFRydXN0QW5jaG9yczAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBTZXQ8VHJ1c3RBbmNob3I+IHMgPSBwLmdldFRydXN0QW5jaG9ycygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdHJ5IHRvIG1vZGlmeSByZXR1cm5lZCBzZXQKKyAgICAgICAgICAgIHMuYWRkKChUcnVzdEFuY2hvciluZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgZmFpbCgibXVzdCBiZSBpbW11dGFibGUiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPnNldFRydXN0QW5jaG9ycyhTZXQpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiBTZXRzIHRoZSA8Y29kZT5TZXQ8L2NvZGU+IG9mIG1vc3QtdHJ1c3RlZCBDQXMgCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUcnVzdEFuY2hvcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldFRydXN0QW5jaG9yczAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQxID0gVGVzdFV0aWxzLmdldFRydXN0QW5jaG9yU2V0KCk7CisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBwLnNldFRydXN0QW5jaG9ycyh0YVNldDEpOworICAgICAgICBhc3NlcnRGYWxzZShwLmdldFRydXN0QW5jaG9ycygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+c2V0VHJ1c3RBbmNob3JzKFNldCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb248L2NvZGU+IC0KKyAgICAgKiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPlNldDwvY29kZT4gaXMgZW1wdHkKKyAgICAgKiAoPGNvZGU+dHJ1c3RBbmNob3JzLmlzRW1wdHkoKSA9PSB0cnVlPC9jb2RlPikKKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRydXN0QW5jaG9ycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0VHJ1c3RBbmNob3JzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1c2UgZW1wdHkgc2V0CisgICAgICAgICAgICBwLnNldFRydXN0QW5jaG9ycyhuZXcgSGFzaFNldDxUcnVzdEFuY2hvcj4oKSk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+c2V0VHJ1c3RBbmNob3JzKFNldCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiAtCisgICAgICogaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRydXN0QW5jaG9ycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0VHJ1c3RBbmNob3JzMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1c2UgbnVsbAorICAgICAgICAgICAgcC5zZXRUcnVzdEFuY2hvcnMobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOUEUgZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+c2V0VHJ1c3RBbmNob3JzKFNldCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPkNsYXNzQ2FzdEV4Y2VwdGlvbjwvY29kZT4gLQorICAgICAqIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNldCBhcmUgbm90IG9mIHR5cGUKKyAgICAgKiA8Y29kZT5qYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3I8L2NvZGU+CisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ2xhc3NDYXN0RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRydXN0QW5jaG9ycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U2V0VHJ1c3RBbmNob3JzMDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFRydXN0QW5jaG9yPiB0YVNldCA9IFRlc3RVdGlscy5nZXRUcnVzdEFuY2hvclNldCgpOworICAgICAgICBpZiAodGFTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiOiBub3QgcGVyZm9ybWVkIChjb3VsZCBub3QgY3JlYXRlIHRlc3QgVHJ1c3RBbmNob3Igc2V0KSIpOworICAgICAgICB9CisKKyAgICAgICAgUEtJWFBhcmFtZXRlcnMgcCA9IG5ldyBQS0lYUGFyYW1ldGVycyh0YVNldCk7CisgICAgICAgIFNldCBzID0gbmV3IEhhc2hTZXQocC5nZXRUcnVzdEFuY2hvcnMoKSk7CisgICAgICAgIHMuYWRkKG5ldyBPYmplY3QoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnNldFRydXN0QW5jaG9ycyhzKTsKKyAgICAgICAgICAgIGZhaWwoIkNsYXNzQ2FzdEV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFTZXQgPSBUZXN0VXRpbHMuZ2V0VHJ1c3RBbmNob3JTZXQoKTsKKyAgICAgICAgaWYgKHRhU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsgIjogbm90IHBlcmZvcm1lZCAoY291bGQgbm90IGNyZWF0ZSB0ZXN0IFRydXN0QW5jaG9yIHNldCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHAgPSBuZXcgUEtJWFBhcmFtZXRlcnModGFTZXQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHAudG9TdHJpbmcoKSk7CisgICAgICAgIAorICAgICAgICBQS0lYUGFyYW1ldGVycyBwMSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwMS50b1N0cmluZygpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9Qb2xpY3lRdWFsaWZpZXJJbmZvVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1BvbGljeVF1YWxpZmllckluZm9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNWIxOQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9Qb2xpY3lRdWFsaWZpZXJJbmZvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5UXVhbGlmaWVySW5mbzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFBvbGljeVF1YWxpZmllckluZm8gdGVzdAorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUG9saWN5UXVhbGlmaWVySW5mby5jbGFzcykKK3B1YmxpYyBjbGFzcyBQb2xpY3lRdWFsaWZpZXJJbmZvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBQb2xpY3lRdWFsaWZpZXJJbmZvVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBQb2xpY3lRdWFsaWZpZXJJbmZvVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5Qb2xpY3lRdWFsaWZpZXJJbmZvPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IHRocm93cyA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4gaWYgYnl0ZSBhcnJheQorICAgICAqIHBhcmFtZXRlciBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBhbmQgcGFyc2FibGUgcG9saWN5CisgICAgICogcXVhbGlmaWVyIGluZm8KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBhbmQgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUG9saWN5UXVhbGlmaWVySW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfQ3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBwYXNzIG51bGwKKyAgICAgICAgICAgIG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHBhc3MgZW1wdHkgYXJyYXkKKyAgICAgICAgICAgIG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKG5ldyBieXRlWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIklPRSBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBwYXNzIGludmFsaWQgYXJyYXkKKyAgICAgICAgICAgIG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKAorICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsoYnl0ZSkweDA2LCAoYnl0ZSkweDAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKTB4ODEsIChieXRlKTB4MzQsIChieXRlKTB4MDN9KTsKKyAgICAgICAgICAgIGZhaWwoIklPRSBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5Qb2xpY3lRdWFsaWZpZXJJbmZvPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IHRocm93cyA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4gaWYgYnl0ZSBhcnJheQorICAgICAqIHBhcmFtZXRlciBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBhbmQgcGFyc2FibGUgcG9saWN5CisgICAgICogcXVhbGlmaWVyIGluZm8KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQb2xpY3lRdWFsaWZpZXJJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBvbGljeVF1YWxpZmllckluZm8wMigpIHsKKyAgICAgICAgLy8gZ2V0IHZhbGlkIGVuY29kaW5nCisgICAgICAgIGJ5dGVbXSBlbmNvZGluZyA9IGdldERlckVuY29kaW5nKCk7CisgICAgICAgIC8vIGNvcnJ1cHQgcm9vdCBzZXEgbGVuZ3RoCisgICAgICAgIGVuY29kaW5nWzFdID0gKGJ5dGUpMHgyNzsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcGFzcyBpbnZhbGlkIGFycmF5CisgICAgICAgICAgICBuZXcgUG9saWN5UXVhbGlmaWVySW5mbyhlbmNvZGluZyk7CisgICAgICAgICAgICBmYWlsKCJJT0UgZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKworICAgICAgICAvLyBnZXQgdmFsaWQgZW5jb2RpbmcKKyAgICAgICAgZW5jb2RpbmcgPSBnZXREZXJFbmNvZGluZygpOworICAgICAgICAvLyBjb3JydXB0IHBvbGljeSBxdWFsaWZpZXIgSUQ6CisgICAgICAgIC8vICAtIGNoYW5nZSBPSUQgdG8gdGhlIFJlbGF0aXZlIE9JRAorICAgICAgICBlbmNvZGluZ1syXSA9IChieXRlKTEzOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcGFzcyBpbnZhbGlkIGFycmF5CisgICAgICAgICAgICBuZXcgUG9saWN5UXVhbGlmaWVySW5mbyhlbmNvZGluZyk7CisgICAgICAgICAgICBmYWlsKCJJT0UgZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+UG9saWN5UXVhbGlmaWVySW5mbzwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlBvbGljeVF1YWxpZmllckluZm88L2NvZGU+CisgICAgICogZnJvbSB0aGUgZW5jb2RlZCBieXRlcworICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQb2xpY3lRdWFsaWZpZXJJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBvbGljeVF1YWxpZmllckluZm8wMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGdldCB2YWxpZCBlbmNvZGluZworICAgICAgICBieXRlW10gZW5jb2RpbmcgPSBnZXREZXJFbmNvZGluZygpOworICAgICAgICAvLyBwYXNzIHZhbGlkIGFycmF5CisgICAgICAgIG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKGVuY29kaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5Qb2xpY3lRdWFsaWZpZXJJbmZvPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IFRoZSBlbmNvZGVkIGJ5dGUgYXJyYXkgaXMgY29waWVkIG9uIGNvbnN0cnVjdGlvbgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb25zdHJ1Y3RvciB3aXRoIGVuY29kZWQgYnl0ZSBhcnJheSBjb3BpZWQgIiArCisgICAgICAgICAgICAib24gY29uc3RydWN0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBvbGljeVF1YWxpZmllckluZm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UG9saWN5UXVhbGlmaWVySW5mbzA0KCkgdGhyb3dzIElPRXhjZXB0aW9uICB7CisgICAgICAgIC8vIGdldCB2YWxpZCBlbmNvZGluZworICAgICAgICBieXRlW10gZW5jb2RpbmcgPSBnZXREZXJFbmNvZGluZygpOworICAgICAgICBieXRlW10gZW5jb2RpbmdDb3B5ID0gZW5jb2RpbmcuY2xvbmUoKTsKKyAgICAgICAgLy8gcGFzcyB2YWxpZCBhcnJheQorICAgICAgICBQb2xpY3lRdWFsaWZpZXJJbmZvIGkgPSBuZXcgUG9saWN5UXVhbGlmaWVySW5mbyhlbmNvZGluZ0NvcHkpOworICAgICAgICAvLyBnZXQgZW5jb2RpbmcKKyAgICAgICAgYnl0ZVtdIGVuY29kaW5nUmV0ID0gaS5nZXRFbmNvZGVkKCk7CisgICAgICAgIC8vIGNoZWNrIHJldHVybmVkIGFycmF5CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbmNvZGluZywgZW5jb2RpbmdSZXQpKTsKKyAgICAgICAgLy8gbW9kaWZ5IGlucHV0CisgICAgICAgIGVuY29kaW5nQ29weVswXSA9IChieXRlKTA7CisgICAgICAgIC8vIGdldCBlbmNvZGluZyBhZ2FpbgorICAgICAgICBieXRlW10gZW5jb2RpbmdSZXQxID0gaS5nZXRFbmNvZGVkKCk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgYWJvdmUgbW9kaWZpY2F0aW9uIGRpZCBub3QgY2hhbmdlCisgICAgICAgIC8vIGludGVybmFsIHN0YXRlIG9mIHRoZSBQb2xpY3lRdWFsaWZpZXJJbmZvIGluc3RhbmNlCisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbmNvZGluZywgZW5jb2RpbmdSZXQxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0RW5jb2RlZCgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IFJldHVybnMgdGhlIEFTTi4xIERFUiBlbmNvZGVkIGZvcm0gb2YKKyAgICAgKiB0aGlzIDxjb2RlPlBvbGljeVF1YWxpZmllckluZm88L2NvZGU+CisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEVuY29kZWQwMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGdldCB2YWxpZCBlbmNvZGluZworICAgICAgICBieXRlW10gZW5jb2RpbmcgPSBnZXREZXJFbmNvZGluZygpOworICAgICAgICAvLyBwYXNzIHZhbGlkIGFycmF5CisgICAgICAgIFBvbGljeVF1YWxpZmllckluZm8gaSA9IG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKGVuY29kaW5nKTsKKyAgICAgICAgLy8gZ2V0IGVuY29kaW5nCisgICAgICAgIGJ5dGVbXSBlbmNvZGluZ1JldCA9IGkuZ2V0RW5jb2RlZCgpOworICAgICAgICAvLyBjaGVjayByZXR1cm5lZCBhcnJheQorICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZW5jb2RpbmcsIGVuY29kaW5nUmV0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0RW5jb2RlZCgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IGEgY29weSBpcyByZXR1cm5lZCBlYWNoIHRpbWUKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RW5jb2RlZDAyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZ2V0IHZhbGlkIGVuY29kaW5nCisgICAgICAgIGJ5dGVbXSBlbmNvZGluZyA9IGdldERlckVuY29kaW5nKCk7CisgICAgICAgIGJ5dGVbXSBlbmNvZGluZ0NvcHkgPSBlbmNvZGluZy5jbG9uZSgpOworICAgICAgICAvLyBwYXNzIHZhbGlkIGFycmF5CisgICAgICAgIFBvbGljeVF1YWxpZmllckluZm8gaSA9IG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKGVuY29kaW5nQ29weSk7CisgICAgICAgIC8vIGdldCBlbmNvZGluZworICAgICAgICBieXRlW10gZW5jb2RpbmdSZXQgPSBpLmdldEVuY29kZWQoKTsKKyAgICAgICAgLy8gbW9kaWZ5IHJldHVybmVkIGFycmF5CisgICAgICAgIGVuY29kaW5nUmV0WzBdID0gKGJ5dGUpMDsKKyAgICAgICAgLy8gZ2V0IGVuY29kaW5nIGFnYWluCisgICAgICAgIGJ5dGVbXSBlbmNvZGluZ1JldDEgPSBpLmdldEVuY29kZWQoKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhYm92ZSBtb2RpZmljYXRpb24gZGlkIG5vdCBjaGFuZ2UKKyAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGUgb2YgdGhlIFBvbGljeVF1YWxpZmllckluZm8gaW5zdGFuY2UKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGVuY29kaW5nLCBlbmNvZGluZ1JldDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRQb2xpY3lRdWFsaWZpZXIoKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiBSZXR1cm5zIHRoZSBBU04uMSBERVIgZW5jb2RlZCBmb3JtIG9mCisgICAgICogdGhpcyA8Y29kZT5Qb2xpY3lRdWFsaWZpZXJJbmZvPC9jb2RlPgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UG9saWN5UXVhbGlmaWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFBvbGljeVF1YWxpZmllcjAxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZ2V0IHZhbGlkIGVuY29kaW5nCisgICAgICAgIGJ5dGVbXSBlbmNvZGluZyA9IGdldERlckVuY29kaW5nKCk7CisgICAgICAgIC8vIGdldCBwb2xpY3kgcXVhbGlmaWVyIGVuY29kaW5nCisgICAgICAgIGJ5dGVbXSBwcUVuY29kaW5nID0gbmV3IGJ5dGVbMjhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVuY29kaW5nLCAxMiwgcHFFbmNvZGluZywgMCwgcHFFbmNvZGluZy5sZW5ndGgpOworICAgICAgICAvLyBwYXNzIHZhbGlkIGFycmF5CisgICAgICAgIFBvbGljeVF1YWxpZmllckluZm8gaSA9IG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKGVuY29kaW5nKTsKKyAgICAgICAgLy8gZ2V0IGVuY29kaW5nCisgICAgICAgIGJ5dGVbXSBwcUVuY29kaW5nUmV0ID0gaS5nZXRQb2xpY3lRdWFsaWZpZXIoKTsKKyAgICAgICAgLy8gY2hlY2sgcmV0dXJuZWQgYXJyYXkKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHBxRW5jb2RpbmcsIHBxRW5jb2RpbmdSZXQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5nZXRQb2xpY3lRdWFsaWZpZXIoKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiBhIGNvcHkgaXMgcmV0dXJuZWQgZWFjaCB0aW1lCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQb2xpY3lRdWFsaWZpZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UG9saWN5UXVhbGlmaWVyMDIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBnZXQgdmFsaWQgZW5jb2RpbmcKKyAgICAgICAgYnl0ZVtdIGVuY29kaW5nID0gZ2V0RGVyRW5jb2RpbmcoKTsKKyAgICAgICAgLy8gZ2V0IHBvbGljeSBxdWFsaWZpZXIgZW5jb2RpbmcKKyAgICAgICAgYnl0ZVtdIHBxRW5jb2RpbmcgPSBuZXcgYnl0ZVsyOF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZW5jb2RpbmcsIDEyLCBwcUVuY29kaW5nLCAwLCBwcUVuY29kaW5nLmxlbmd0aCk7CisgICAgICAgIC8vIHBhc3MgdmFsaWQgYXJyYXkKKyAgICAgICAgUG9saWN5UXVhbGlmaWVySW5mbyBpID0gbmV3IFBvbGljeVF1YWxpZmllckluZm8oZW5jb2RpbmcpOworICAgICAgICAvLyBnZXQgZW5jb2RpbmcKKyAgICAgICAgYnl0ZVtdIHBxRW5jb2RpbmdSZXQgPSBpLmdldFBvbGljeVF1YWxpZmllcigpOworICAgICAgICAvLyBtb2RpZnkgcmV0dXJuZWQgYXJyYXkKKyAgICAgICAgcHFFbmNvZGluZ1JldFswXSA9IChieXRlKTA7CisgICAgICAgIC8vIGdldCBlbmNvZGluZyBhZ2FpbgorICAgICAgICBieXRlW10gcHFFbmNvZGluZ1JldDEgPSBpLmdldFBvbGljeVF1YWxpZmllcigpOworICAgICAgICAvLworICAgICAgICBhc3NlcnROb3RTYW1lKHBxRW5jb2RpbmdSZXQsIHBxRW5jb2RpbmdSZXQxKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhYm92ZSBtb2RpZmljYXRpb24gZGlkIG5vdCBjaGFuZ2UKKyAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGUgb2YgdGhlIFBvbGljeVF1YWxpZmllckluZm8gaW5zdGFuY2UKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHBxRW5jb2RpbmcsIHBxRW5jb2RpbmdSZXQxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UG9saWN5UXVhbGlmaWVySWQoKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiBSZXR1cm5zIHRoZSA8Y29kZT5wb2xpY3lRdWFsaWZpZXJJZDwvY29kZT4KKyAgICAgKiBmaWVsZCBvZiB0aGlzIDxjb2RlPlBvbGljeVF1YWxpZmllckluZm88L2NvZGU+LgorICAgICAqIFRoZSA8Y29kZT5wb2xpY3lRdWFsaWZpZXJJZDwvY29kZT4gaXMgYW4gT2JqZWN0IElkZW50aWZpZXIgKE9JRCkKKyAgICAgKiByZXByZXNlbnRlZCBieSBhIHNldCBvZiBub25uZWdhdGl2ZSBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcworICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UG9saWN5UXVhbGlmaWVySWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UG9saWN5UXVhbGlmaWVySWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBnZXQgdmFsaWQgZW5jb2RpbmcKKyAgICAgICAgYnl0ZVtdIGVuY29kaW5nID0gZ2V0RGVyRW5jb2RpbmcoKTsKKyAgICAgICAgLy8gcGFzcyB2YWxpZCBhcnJheQorICAgICAgICBQb2xpY3lRdWFsaWZpZXJJbmZvIGkgPSBuZXcgUG9saWN5UXVhbGlmaWVySW5mbyhlbmNvZGluZyk7CisgICAgICAgIC8vIGdldCBPSUQgYXMgU3RyaW5nIGFuZCBjaGVjayBpdAorICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMy42LjEuNS41LjcuMi4xIiwgaS5nZXRQb2xpY3lRdWFsaWZpZXJJZCgpKTsKKworICAgICAgICAvLyBnZXQgdmFsaWQgZW5jb2RpbmcKKyAgICAgICAgZW5jb2RpbmcgPSBnZXREZXJFbmNvZGluZygpOworICAgICAgICAvLyBjaGFuZ2UgT0lEIHRvIDEuMy45ODQzNy44MjgxOC4xCisgICAgICAgIGVuY29kaW5nWzVdID0gKGJ5dGUpMHg4NjsKKyAgICAgICAgZW5jb2RpbmdbNl0gPSAoYnl0ZSkweDgxOworICAgICAgICBlbmNvZGluZ1s4XSA9IChieXRlKTB4ODU7CisgICAgICAgIGVuY29kaW5nWzldID0gKGJ5dGUpMHg4NzsKKyAgICAgICAgaSA9IG5ldyBQb2xpY3lRdWFsaWZpZXJJbmZvKGVuY29kaW5nKTsKKyAgICAgICAgLy8gZ2V0IE9JRCBhcyBTdHJpbmcgYW5kIGNoZWNrIGl0CisgICAgICAgIGFzc2VydEVxdWFscygiMS4zLjk4NDM3LjgyODE4LjEiLCBpLmdldFBvbGljeVF1YWxpZmllcklkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcworICAgICAqIDxjb2RlPlBvbGljeVF1YWxpZmllckluZm88L2NvZGU+IGFzIHByaW50YWJsZSA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBnZXQgdmFsaWQgZW5jb2RpbmcKKyAgICAgICAgYnl0ZVtdIGVuY29kaW5nID0gZ2V0RGVyRW5jb2RpbmcoKTsKKyAgICAgICAgLy8gcGFzcyB2YWxpZCBhcnJheQorICAgICAgICBQb2xpY3lRdWFsaWZpZXJJbmZvIGkgPSBuZXcgUG9saWN5UXVhbGlmaWVySW5mbyhlbmNvZGluZyk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gUHJpdmF0ZSBzdHVmZgorICAgIC8vCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB2YWxpZCBERVIgZW5jb2RpbmcgZm9yIHRoZSBmb2xsb3dpbmcgQVNOLjEgZGVmaW5pdGlvbgorICAgICAqIChhcyBzcGVjaWZpZWQgaW4gUkZDIDMyODAgLQorICAgICAqICBJbnRlcm5ldCBYLjUwOSBQdWJsaWMgS2V5IEluZnJhc3RydWN0dXJlLgorICAgICAqICBDZXJ0aWZpY2F0ZSBhbmQgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IChDUkwpIFByb2ZpbGUuCisgICAgICogIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMyODAudHh0KToKKyAgICAgKiAKKyAgICAgKiAgIFBvbGljeVF1YWxpZmllckluZm8gOjo9IFNFUVVFTkNFIHsKKyAgICAgKiAgICAgIHBvbGljeVF1YWxpZmllcklkICAgICAgIFBvbGljeVF1YWxpZmllcklkLAorICAgICAqICAgICAgcXVhbGlmaWVyICAgICAgICAgICAgICAgQU5ZIERFRklORUQgQlkgcG9saWN5UXVhbGlmaWVySWQKKyAgICAgKiAgIH0KKyAgICAgKiAKKyAgICAgKiB3aGVyZSBwb2xpY3lRdWFsaWZpZXJJZCAoT0lEKSBpcworICAgICAqICAgICAgMS4zLjYuMS41LjUuNy4yLjEKKyAgICAgKiBhbmQgcXVhbGlmaWVyIChJQTVTdHJpbmcpIGlzCisgICAgICogICAgICAiaHR0cDovL3d3dy5xcS5jb20vc3RtdC50eHQiCisgICAgICogICAgICAKKyAgICAgKiAoZGF0YSBnZW5lcmF0ZWQgYnkgb3duIGVuY29kZXIgZHVyaW5nIHRlc3QgZGV2ZWxvcG1lbnQpCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGdldERlckVuY29kaW5nKCkgeworICAgICAgICAvLyBETyBOT1QgTU9ESUZZIQorICAgICAgICByZXR1cm4gIG5ldyBieXRlW10geworICAgICAgICAgICAgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgyNiwgLy8gdGFnIFNlcSwgbGVuZ3RoCisgICAgICAgICAgICAgIChieXRlKTB4MDYsIChieXRlKTB4MDgsIC8vIHRhZyBPSUQsIGxlbmd0aAorICAgICAgICAgICAgICAgIChieXRlKTB4MmIsIChieXRlKTB4MDYsIChieXRlKTB4MDEsIChieXRlKTB4MDUsIC8vIG9pZCB2YWx1ZSAKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDA1LCAoYnl0ZSkweDA3LCAoYnl0ZSkweDAyLCAoYnl0ZSkweDAxLCAvLyBvaWQgdmFsdWUKKyAgICAgICAgICAgICAgKGJ5dGUpMHgxNiwgKGJ5dGUpMHgxYSwgLy8gdGFnIElBNVN0cmluZywgbGVuZ3RoCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg3MCwgIC8vIElBNVN0cmluZyB2YWx1ZQorICAgICAgICAgICAgICAgIChieXRlKTB4M2EsIChieXRlKTB4MmYsIChieXRlKTB4MmYsIChieXRlKTB4NzcsICAvLyBJQTVTdHJpbmcgdmFsdWUKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc3LCAoYnl0ZSkweDc3LCAoYnl0ZSkweDJlLCAoYnl0ZSkweDcxLCAgLy8gSUE1U3RyaW5nIHZhbHVlCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3MSwgKGJ5dGUpMHgyZSwgKGJ5dGUpMHg2MywgKGJ5dGUpMHg2ZiwgIC8vIElBNVN0cmluZyB2YWx1ZQorICAgICAgICAgICAgICAgIChieXRlKTB4NmQsIChieXRlKTB4MmYsIChieXRlKTB4NzMsIChieXRlKTB4NzQsICAvLyBJQTVTdHJpbmcgdmFsdWUKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDZkLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDJlLCAoYnl0ZSkweDc0LCAgLy8gSUE1U3RyaW5nIHZhbHVlCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3OCwgKGJ5dGUpMHg3NCAgIC8vIElBNVN0cmluZyB2YWx1ZQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9UcnVzdEFuY2hvclRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9UcnVzdEFuY2hvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODlhYjhiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1RydXN0QW5jaG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0LlRlc3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5UZXN0S2V5UGFpcjsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciA8Y29kZT5UcnVzdEFuY2hvcjwvY29kZT4KKyAqLworQFRlc3RUYXJnZXRDbGFzcyhUcnVzdEFuY2hvci5jbGFzcykKK3B1YmxpYyBjbGFzcyBUcnVzdEFuY2hvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGtleUFsZyA9ICJEU0EiOworICAgIC8vIFNhbXBsZSBvZiBzb21lIHZhbGlkIENBIG5hbWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdmFsaWRDYU5hbWVSZmMyMjUzID0KKyAgICAgICAgIkNOPVRlc3QgQ0EsIisKKyAgICAgICAgIk9VPVRlc3RpbmcgRGl2aXNpb24sIisKKyAgICAgICAgIk89VGVzdCBJdCBBbGwsIisKKyAgICAgICAgIkw9VGVzdCBUb3duLCIrCisgICAgICAgICJTVD1UZXN0aWZvcm5pYSwiKworICAgICAgICAiQz1UZXN0bGFuZCI7CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5UcnVzdEFuY2hvcihTdHJpbmcsIFB1YmxpY0tleSwgYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3I8YnI+IAorICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyA8Y29kZT5UcnVzdEFuY2hvcjwvY29kZT4gaW5zdGFuY2U8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB2YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZDxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCBwYXNzIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMKKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVHJ1c3RBbmNob3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRydXN0QW5jaG9yU3RyaW5nUHVibGljS2V5Ynl0ZUFycmF5MDEoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHVibGljS2V5IHBrID0gbmV3IFRlc3RLZXlQYWlyKGtleUFsZykuZ2V0UHVibGljKCk7CisKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDEKKyAgICAgICAgbmV3IFRydXN0QW5jaG9yKHZhbGlkQ2FOYW1lUmZjMjI1MywgcGssIGdldEZ1bGxFbmNvZGluZygpKTsKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDIKKyAgICAgICAgbmV3IFRydXN0QW5jaG9yKHZhbGlkQ2FOYW1lUmZjMjI1MywgcGssIGdldEVuY29kaW5nUFNPbmx5KCkpOyAgICAgICAgCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAzCisgICAgICAgIG5ldyBUcnVzdEFuY2hvcih2YWxpZENhTmFtZVJmYzIyNTMsIHBrLCBnZXRFbmNvZGluZ0VTT25seSgpKTsgICAgICAgIAorICAgICAgICAvLyBzdWIgdGVzdGNhc2UgNAorICAgICAgICBuZXcgVHJ1c3RBbmNob3IodmFsaWRDYU5hbWVSZmMyMjUzLCBwaywgZ2V0RW5jb2RpbmdOb01pbk1heCgpKTsgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPlRydXN0QW5jaG9yKFN0cmluZywgUHVibGljS2V5LCBieXRlW10pPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4gCisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIDxjb2RlPlRydXN0QW5jaG9yPC9jb2RlPiBpbnN0YW5jZTxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IDxjb2RlPm51bGw8L2NvZGU+IGFzIG5hbWVDb25zdHJhaW50cyBwYXNzZWQ8YnI+CisgICAgICogRXhwZWN0ZWQ6IG11c3QgcGFzcyB3aXRob3V0IGFueSBleGNlcHRpb25zCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVHJ1c3RBbmNob3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRydXN0QW5jaG9yU3RyaW5nUHVibGljS2V5Ynl0ZUFycmF5MDIoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHVibGljS2V5IHBrID0gbmV3IFRlc3RLZXlQYWlyKGtleUFsZykuZ2V0UHVibGljKCk7CisKKyAgICAgICAgbmV3IFRydXN0QW5jaG9yKHZhbGlkQ2FOYW1lUmZjMjI1MywgcGssIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPlRydXN0QW5jaG9yKFN0cmluZywgUHVibGljS2V5LCBieXRlW10pPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4gCisgICAgICogQXNzZXJ0aW9uOiBuYW1lQ29uc3RyYWludHMgY2xvbmVkIGJ5IHRoZSBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IG1vZGlmeSBwYXNzZWQgbmFtZUNvbnN0cmFpbnRzPGJyPgorICAgICAqIEV4cGVjdGVkOiBtb2RpZmljYXRpb24gbXVzdCBub3QgY2hhbmdlIG9iamVjdCBpbnRlcm5hbCBzdGF0ZQorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRydXN0QW5jaG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUcnVzdEFuY2hvclN0cmluZ1B1YmxpY0tleWJ5dGVBcnJheTAzKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIGJ5dGVbXSBuYyA9IGdldEVuY29kaW5nUFNPbmx5KCk7CisgICAgICAgIGJ5dGVbXSBuY0NvcHkgPSBuYy5jbG9uZSgpOworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgNSAtIG5hbWVDb25zdHJhaW50cyBjYW4gYmUgbnVsbAorICAgICAgICBUcnVzdEFuY2hvciB0YSA9IG5ldyBUcnVzdEFuY2hvcih2YWxpZENhTmFtZVJmYzIyNTMsIHBrLCBuY0NvcHkpOworICAgICAgICAvLyBtb2RpZnkKKyAgICAgICAgbmNDb3B5WzBdPShieXRlKTA7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgYWJvdmUgbW9kaWZpY2F0aW9uIGRpZCBub3QgY2hhbmdlCisgICAgICAgIC8vIG9iamVjdCBpbnRlcm5hbCBzdGF0ZQorICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmMsIHRhLmdldE5hbWVDb25zdHJhaW50cygpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+VHJ1c3RBbmNob3IoU3RyaW5nLCBQdWJsaWNLZXksIGJ5dGVbXSk8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPiAKKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiBpZiA8Y29kZT5jYU5hbWU8L2NvZGU+CisgICAgICogb3IgPGNvZGU+Y2FQdWJsaWNLZXk8L2NvZGU+IHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHBhc3MgPGNvZGU+bnVsbDwvY29kZT4gYXMgbWVudGlvbmVkIHBhcmFtZXRlcjxicj4KKyAgICAgKiBFeHBlY3RlZDogTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRydXN0QW5jaG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUcnVzdEFuY2hvclN0cmluZ1B1YmxpY0tleWJ5dGVBcnJheTA0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAxOiAnY2FOYW1lJyBwYXJhbSBpcyBudWxsCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVHJ1c3RBbmNob3IoKFN0cmluZyludWxsLCBwaywgZ2V0RW5jb2RpbmdQU09ubHkoKSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgMjogJ2NhUHVibGljS2V5JyBwYXJhbSBpcyBudWxsCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVHJ1c3RBbmNob3IodmFsaWRDYU5hbWVSZmMyMjUzLCBudWxsLCBnZXRFbmNvZGluZ1BTT25seSgpKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAzOiAnY2FOYW1lJyBhbmQgJ2NhUHVibGljS2V5JyBwYXJhbXMgYXJlIG51bGwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUcnVzdEFuY2hvcigoU3RyaW5nKW51bGwsIG51bGwsIGdldEVuY29kaW5nUFNPbmx5KCkpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDQ6ICdjYU5hbWUnIHBhcmFtIGlzIGVtcHR5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVHJ1c3RBbmNob3IoIiIsIHBrLCBnZXRFbmNvZGluZ1BTT25seSgpKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDU6ICdjYU5hbWUnIHBhcmFtIGlzIGluY29ycmVjdCBkaXN0aW5ndWlzaGVkIG5hbWUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUcnVzdEFuY2hvcigiQUlELjExLjEyPUEiLCBwaywgZ2V0RW5jb2RpbmdQU09ubHkoKSk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPlRydXN0QW5jaG9yKFg1MDBQcmluY2lwYWwsIFB1YmxpY0tleSwgYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3I8YnI+IAorICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyA8Y29kZT5UcnVzdEFuY2hvcjwvY29kZT4gaW5zdGFuY2U8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB2YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZDxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCBwYXNzIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMKKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdEFuY2hvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbC5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRydXN0QW5jaG9yWDUwMFByaW5jaXBhbFB1YmxpY0tleWJ5dGVBcnJheTAxKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIFg1MDBQcmluY2lwYWwgeDUwMHAgPSBuZXcgWDUwMFByaW5jaXBhbCh2YWxpZENhTmFtZVJmYzIyNTMpOworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgMQorICAgICAgICBuZXcgVHJ1c3RBbmNob3IoeDUwMHAsIHBrLCBnZXRGdWxsRW5jb2RpbmcoKSk7CisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAyCisgICAgICAgIG5ldyBUcnVzdEFuY2hvcih4NTAwcCwgcGssIGdldEVuY29kaW5nUFNPbmx5KCkpOyAgICAgICAgCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAzCisgICAgICAgIG5ldyBUcnVzdEFuY2hvcih4NTAwcCwgcGssIGdldEVuY29kaW5nRVNPbmx5KCkpOyAgICAgICAgCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSA0CisgICAgICAgIG5ldyBUcnVzdEFuY2hvcih4NTAwcCwgcGssIGdldEVuY29kaW5nTm9NaW5NYXgoKSk7ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5UcnVzdEFuY2hvcihYNTAwUHJpbmNpcGFsLCBQdWJsaWNLZXksIGJ5dGVbXSk8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPiAKKyAgICAgKiBBc3NlcnRpb246IGNyZWF0ZXMgPGNvZGU+VHJ1c3RBbmNob3I8L2NvZGU+IGluc3RhbmNlPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogPGNvZGU+bnVsbDwvY29kZT4gYXMgbmFtZUNvbnN0cmFpbnRzIHBhc3NlZDxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCBwYXNzIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMKKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdEFuY2hvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbC5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRydXN0QW5jaG9yWDUwMFByaW5jaXBhbFB1YmxpY0tleWJ5dGVBcnJheTAyKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIFg1MDBQcmluY2lwYWwgeDUwMHAgPSBuZXcgWDUwMFByaW5jaXBhbCh2YWxpZENhTmFtZVJmYzIyNTMpOworCisgICAgICAgIG5ldyBUcnVzdEFuY2hvcih4NTAwcCwgcGssIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPlRydXN0QW5jaG9yKFg1MDBQcmluY2lwYWwsIFB1YmxpY0tleSwgYnl0ZVtdKTwvY29kZT4gY29uc3RydWN0b3I8YnI+IAorICAgICAqIEFzc2VydGlvbjogbmFtZUNvbnN0cmFpbnRzIGNsb25lZCBieSB0aGUgY29uc3RydWN0b3I8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBtb2RpZnkgcGFzc2VkIG5hbWVDb25zdHJhaW50czxicj4KKyAgICAgKiBFeHBlY3RlZDogbW9kaWZpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSBvYmplY3QgaW50ZXJuYWwgc3RhdGUKKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgVHJ1c3RBbmNob3Igd2l0aCBjb3BpZWQgYnl0ZSBhcnJheS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdEFuY2hvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbC5jbGFzcywgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRydXN0QW5jaG9yWDUwMFByaW5jaXBhbFB1YmxpY0tleWJ5dGVBcnJheTAzKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIGJ5dGVbXSBuYyA9IGdldEVuY29kaW5nUFNPbmx5KCk7CisgICAgICAgIGJ5dGVbXSBuY0NvcHkgPSBuYy5jbG9uZSgpOworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgNSAtIG5hbWVDb25zdHJhaW50cyBjYW4gYmUgbnVsbAorICAgICAgICBUcnVzdEFuY2hvciB0YSA9IG5ldyBUcnVzdEFuY2hvcihuZXcgWDUwMFByaW5jaXBhbCh2YWxpZENhTmFtZVJmYzIyNTMpLAorICAgICAgICAgICAgICAgIHBrLCBuY0NvcHkpOworICAgICAgICAvLyBtb2RpZnkKKyAgICAgICAgbmNDb3B5WzBdPShieXRlKTA7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgYWJvdmUgbW9kaWZpY2F0aW9uIGRpZCBub3QgY2hhbmdlCisgICAgICAgIC8vIG9iamVjdCBpbnRlcm5hbCBzdGF0ZQorICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmMsIHRhLmdldE5hbWVDb25zdHJhaW50cygpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+VHJ1c3RBbmNob3IoWDUwMFByaW5jaXBhbCwgUHVibGljS2V5LCBieXRlW10pPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4gCisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4gaWYgPGNvZGU+Y2FQcmluY2lwYWw8L2NvZGU+CisgICAgICogb3IgPGNvZGU+Y2FQdWJsaWNLZXk8L2NvZGU+IHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHBhc3MgPGNvZGU+bnVsbDwvY29kZT4gYXMgbWVudGlvbmVkIHBhcmFtZXRlcjxicj4KKyAgICAgKiBFeHBlY3RlZDogTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVHJ1c3RBbmNob3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwuY2xhc3MsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUcnVzdEFuY2hvclg1MDBQcmluY2lwYWxQdWJsaWNLZXlieXRlQXJyYXkwNCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBQdWJsaWNLZXkgcGsgPSBuZXcgVGVzdEtleVBhaXIoa2V5QWxnKS5nZXRQdWJsaWMoKTsKKworICAgICAgICBYNTAwUHJpbmNpcGFsIHg1MDBwID0gbmV3IFg1MDBQcmluY2lwYWwodmFsaWRDYU5hbWVSZmMyMjUzKTsKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBUcnVzdEFuY2hvcigoWDUwMFByaW5jaXBhbCludWxsLAorICAgICAgICAgICAgICAgICAgICBwaywgZ2V0RW5jb2RpbmdQU09ubHkoKSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgMgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRydXN0QW5jaG9yKHg1MDBwLCBudWxsLCBnZXRFbmNvZGluZ1BTT25seSgpKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVHJ1c3RBbmNob3IoKFg1MDBQcmluY2lwYWwpbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RW5jb2RpbmdQU09ubHkoKSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPlRydXN0QW5jaG9yKFg1MDlDZXJ0aWZpY2F0ZSwgYnl0ZVtdKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IGNyZWF0ZXMgPGNvZGU+VHJ1c3RBbmNob3I8L2NvZGU+IGluc3RhbmNlPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdmFsaWQgcGFyYW1ldGVycyBwYXNzZWQ8YnI+CisgICAgICogRXhwZWN0ZWQ6IG11c3QgcGFzcyB3aXRob3V0IGFueSBleGNlcHRpb25zCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdEFuY2hvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUcnVzdEFuY2hvclg1MDlDZXJ0aWZpY2F0ZWJ5dGVBcnJheTAxKCkKKyAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRGYWN0ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYNTA5Iik7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBwZW1DZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGVzdFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCkpKTsKKworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgMQorICAgICAgICBUcnVzdEFuY2hvciB0YTEgPSBuZXcgVHJ1c3RBbmNob3IocGVtQ2VydCwgZ2V0RnVsbEVuY29kaW5nKCkpOworICAgICAgICBhc3NlcnROdWxsKHRhMS5nZXRDQSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCh0YTEuZ2V0Q0FOYW1lKCkpOworICAgICAgICBhc3NlcnROdWxsKHRhMS5nZXRDQVB1YmxpY0tleSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGdldEZ1bGxFbmNvZGluZygpLCB0YTEuZ2V0TmFtZUNvbnN0cmFpbnRzKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBlbUNlcnQsIHRhMS5nZXRUcnVzdGVkQ2VydCgpKTsKKworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgMgorICAgICAgICBUcnVzdEFuY2hvciB0YTIgPSBuZXcgVHJ1c3RBbmNob3IocGVtQ2VydCwgZ2V0RW5jb2RpbmdQU09ubHkoKSk7CisgICAgICAgIGFzc2VydE51bGwodGEyLmdldENBKCkpOworICAgICAgICBhc3NlcnROdWxsKHRhMi5nZXRDQU5hbWUoKSk7CisgICAgICAgIGFzc2VydE51bGwodGEyLmdldENBUHVibGljS2V5KCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZ2V0RW5jb2RpbmdQU09ubHkoKSwgdGEyLmdldE5hbWVDb25zdHJhaW50cygpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwZW1DZXJ0LCB0YTIuZ2V0VHJ1c3RlZENlcnQoKSk7CisKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDMKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEzID0gbmV3IFRydXN0QW5jaG9yKHBlbUNlcnQsIGdldEVuY29kaW5nRVNPbmx5KCkpOworICAgICAgICBhc3NlcnROdWxsKHRhMy5nZXRDQSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCh0YTMuZ2V0Q0FOYW1lKCkpOworICAgICAgICBhc3NlcnROdWxsKHRhMy5nZXRDQVB1YmxpY0tleSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGdldEVuY29kaW5nRVNPbmx5KCksIHRhMy5nZXROYW1lQ29uc3RyYWludHMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMocGVtQ2VydCwgdGEzLmdldFRydXN0ZWRDZXJ0KCkpOworCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSA0CisgICAgICAgIFRydXN0QW5jaG9yIHRhNCA9IG5ldyBUcnVzdEFuY2hvcihwZW1DZXJ0LCBnZXRFbmNvZGluZ05vTWluTWF4KCkpOworICAgICAgICBhc3NlcnROdWxsKHRhNC5nZXRDQSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCh0YTQuZ2V0Q0FOYW1lKCkpOworICAgICAgICBhc3NlcnROdWxsKHRhNC5nZXRDQVB1YmxpY0tleSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGdldEVuY29kaW5nTm9NaW5NYXgoKSwgdGE0CisgICAgICAgICAgICAgICAgLmdldE5hbWVDb25zdHJhaW50cygpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwZW1DZXJ0LCB0YTQuZ2V0VHJ1c3RlZENlcnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+VHJ1c3RBbmNob3IoWDUwOUNlcnRpZmljYXRlLCBieXRlW10pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyA8Y29kZT5UcnVzdEFuY2hvcjwvY29kZT4gaW5zdGFuY2U8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiA8Y29kZT5udWxsPC9jb2RlPiBhcyBYNTA5Q2VydGlmaWNhdGUgcGFzc2VkPGJyPgorICAgICAqIEV4cGVjdGVkOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdEFuY2hvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUcnVzdEFuY2hvclg1MDlDZXJ0aWZpY2F0ZWJ5dGVBcnJheTAyKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVHJ1c3RBbmNob3IobnVsbCwgZ2V0RnVsbEVuY29kaW5nKCkpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPlRydXN0QW5jaG9yKFg1MDlDZXJ0aWZpY2F0ZSwgYnl0ZVtdKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IGNyZWF0ZXMgPGNvZGU+VHJ1c3RBbmNob3I8L2NvZGU+IGluc3RhbmNlPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogPGNvZGU+bnVsbDwvY29kZT4gYXMgbmFtZUNvbnN0cmFpbnRzIHBhc3NlZDxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCBwYXNzIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb25zdHJ1Y3RvciB3aXRoIG51bGwgYXMgbmFtZUNvbnN0cmFpbnRzIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdEFuY2hvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUcnVzdEFuY2hvclg1MDlDZXJ0aWZpY2F0ZWJ5dGVBcnJheTAzKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIHBlbUNlcnQgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdAorICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShUZXN0VXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRYNTA5Q2VydGlmaWNhdGVfdjMoKSkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVHJ1c3RBbmNob3IocGVtQ2VydCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4ZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5UcnVzdEFuY2hvcihYNTA5Q2VydGlmaWNhdGUsIGJ5dGVbXSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIDxjb2RlPlRydXN0QW5jaG9yPC9jb2RlPiBpbnN0YW5jZTxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHBhc3Mgbm90IHZhbGlkIG5hbWUgY29uc3RyYWludHMgYXJyYXkgRXhwZWN0ZWQ6CisgICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRydXN0QW5jaG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRydXN0QW5jaG9yWDUwOUNlcnRpZmljYXRlYnl0ZUFycmF5MDQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRGYWN0ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYNTA5Iik7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBwZW1DZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGVzdFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCkpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFRydXN0QW5jaG9yKHBlbUNlcnQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10geyAoYnl0ZSkgMSwgKGJ5dGUpIDIsIChieXRlKSAzIH0pOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IgPGNvZGU+VHJ1c3RBbmNob3IoWDUwOUNlcnRpZmljYXRlLCBieXRlW10pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyA8Y29kZT5UcnVzdEFuY2hvcjwvY29kZT4gaW5zdGFuY2U8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBib3RoIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCBhcyBudWxsPGJyPgorICAgICAqIEV4cGVjdGVkOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdEFuY2hvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUcnVzdEFuY2hvclg1MDlDZXJ0aWZpY2F0ZWJ5dGVBcnJheTA1KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgVHJ1c3RBbmNob3IobnVsbCwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0Q0FQdWJsaWNLZXkoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqICAKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgbW9zdCB0cnVzdGVkIENBIHB1YmxpYyBrZXk8L2NvZGU+PGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdmFsaWQgbmFtZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEV4cGVjdGVkOiB0aGUgc2FtZSBuYW1lIG11c3QgYmUgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZDxicj4KKyAgICAgKiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q0FQdWJsaWNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0Q0FQdWJsaWNLZXkwMSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAxCisgICAgICAgIFRydXN0QW5jaG9yIHRhID0KKyAgICAgICAgICAgIG5ldyBUcnVzdEFuY2hvcih2YWxpZENhTmFtZVJmYzIyNTMsIHBrLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcXVhbHMxIiwgcGssIHRhLmdldENBUHVibGljS2V5KCkpOworICAgICAgICAvLyBzdWIgdGVzdGNhc2UgMgorICAgICAgICBYNTAwUHJpbmNpcGFsIHg1MDBwID0gbmV3IFg1MDBQcmluY2lwYWwodmFsaWRDYU5hbWVSZmMyMjUzKTsKKyAgICAgICAgdGEgPSBuZXcgVHJ1c3RBbmNob3IoeDUwMHAsIHBrLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcXVhbHMyIiwgcGssIHRhLmdldENBUHVibGljS2V5KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0Q0FOYW1lKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiAgCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIG1vc3QgdHJ1c3RlZCBDQSBuYW1lIGFzIDxjb2RlPlN0cmluZzwvY29kZT48YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB2YWxpZCBuYW1lIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3I8YnI+CisgICAgICogRXhwZWN0ZWQ6IHRoZSBzYW1lIG5hbWUgbXVzdCBiZSByZXR1cm5lZCBieSB0aGUgbWV0aG9kPGJyPgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q0FOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENBTmFtZTAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHVibGljS2V5IHBrID0gbmV3IFRlc3RLZXlQYWlyKGtleUFsZykuZ2V0UHVibGljKCk7CisKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDEKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEgPQorICAgICAgICAgICAgbmV3IFRydXN0QW5jaG9yKHZhbGlkQ2FOYW1lUmZjMjI1MywgcGssIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVxdWFsczEiLCB2YWxpZENhTmFtZVJmYzIyNTMsIHRhLmdldENBTmFtZSgpKTsKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDIKKyAgICAgICAgWDUwMFByaW5jaXBhbCB4NTAwcCA9IG5ldyBYNTAwUHJpbmNpcGFsKHZhbGlkQ2FOYW1lUmZjMjI1Myk7CisgICAgICAgIHRhID0gbmV3IFRydXN0QW5jaG9yKHg1MDBwLCBwaywgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXF1YWxzMiIsIHZhbGlkQ2FOYW1lUmZjMjI1MywgdGEuZ2V0Q0FOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmdldENBTmFtZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogIAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyAuLi4gPGNvZGU+bnVsbDwvY29kZT4gaWYgPGNvZGU+VHJ1c3RBbmNob3I8L2NvZGU+CisgICAgICogd2FzIG5vdCBzcGVjaWZpZWQgYXMgdHJ1c3RlZCBjZXJ0aWZpY2F0ZTxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHRlc3Qgb2JqZWN0IGlzIG5vdCBzcGVjaWZpZWQgYXMgdHJ1c3RlZCBjZXJ0aWZpY2F0ZTxicj4KKyAgICAgKiBFeHBlY3RlZDogPGNvZGU+bnVsbDwvY29kZT4gYXMgcmV0dXJuIHZhbHVlPGJyPgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldFRydXN0ZWRDZXJ0IHJldHVybnMgbnVsbCBpZiBUcnVzdEFuY2hvciAiICsKKyAgICAgICAgICAgICJ3YXMgbm90IHNwZWNpZmllZCBhcyB0cnVzdGVkIGNlcnRpZmljYXRlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRydXN0ZWRDZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFRydXN0ZWRDZXIwMigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAxCisgICAgICAgIFRydXN0QW5jaG9yIHRhID0KKyAgICAgICAgICAgIG5ldyBUcnVzdEFuY2hvcih2YWxpZENhTmFtZVJmYzIyNTMsIHBrLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgibnVsbDEiLCB0YS5nZXRUcnVzdGVkQ2VydCgpKTsKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDIKKyAgICAgICAgWDUwMFByaW5jaXBhbCB4NTAwcCA9IG5ldyBYNTAwUHJpbmNpcGFsKHZhbGlkQ2FOYW1lUmZjMjI1Myk7CisgICAgICAgIHRhID0gbmV3IFRydXN0QW5jaG9yKHg1MDBwLCBwaywgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoIm51bGwyIiwgdGEuZ2V0VHJ1c3RlZENlcnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0TmFtZUNvbnN0cmFpbnRzKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiAKKyAgICAgKiBBc3NlcnRpb246IFJldHVybnMgdGhlIG5hbWUgY29uc3RyYWludHMgcGFyYW1ldGVyLjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHZhbGlkIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3JzPGJyPgorICAgICAqIEV4cGVjdGVkOiB0aGUgdmFsaWQgcGFyYW1ldGVycyBtdXN0IGJlIHJldHVybmVkIGJ5IHRoZSBtZXRob2Q8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lQ29uc3RyYWludHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TmFtZUNvbnN0cmFpbnRzMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHVibGljS2V5IHBrID0gbmV3IFRlc3RLZXlQYWlyKGtleUFsZykuZ2V0UHVibGljKCk7CisgICAgICAgIFRydXN0QW5jaG9yIHRhMSA9IG5ldyBUcnVzdEFuY2hvcih2YWxpZENhTmFtZVJmYzIyNTMsIHBrLAorICAgICAgICAgICAgICAgIGdldEZ1bGxFbmNvZGluZygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGdldEZ1bGxFbmNvZGluZygpLCB0YTEuZ2V0TmFtZUNvbnN0cmFpbnRzKCkpKTsKKworICAgICAgICBYNTAwUHJpbmNpcGFsIHg1MDBwID0gbmV3IFg1MDBQcmluY2lwYWwodmFsaWRDYU5hbWVSZmMyMjUzKTsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGEyID0gbmV3IFRydXN0QW5jaG9yKHg1MDBwLCBwaywgZ2V0RW5jb2RpbmdOb01pbk1heCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGdldEVuY29kaW5nTm9NaW5NYXgoKSwgdGEyCisgICAgICAgICAgICAgICAgLmdldE5hbWVDb25zdHJhaW50cygpKSk7CisKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRGYWN0ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYNTA5Iik7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBwZW1DZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGVzdFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCkpKTsKKworICAgICAgICBUcnVzdEFuY2hvciB0YTMgPSBuZXcgVHJ1c3RBbmNob3IocGVtQ2VydCwgZ2V0RW5jb2RpbmdQU09ubHkoKSk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhnZXRFbmNvZGluZ1BTT25seSgpLCB0YTMuZ2V0TmFtZUNvbnN0cmFpbnRzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5nZXROYW1lQ29uc3RyYWludHMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIAorICAgICAqIEFzc2VydGlvbjogUmV0dXJucyB0aGUgbmFtZSBjb25zdHJhaW50cyBwYXJhbWV0ZXIuPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogbnVsbCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yczxicj4KKyAgICAgKiBFeHBlY3RlZDogdGhlIG51bGwgcGFyYW1ldGVycyBtdXN0IGJlIHJldHVybmVkIGJ5IHRoZSBtZXRob2Q8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXROYW1lQ29uc3RyYWludHMgcmV0dXJucyBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWVDb25zdHJhaW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXROYW1lQ29uc3RyYWludHMwMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQdWJsaWNLZXkgcGsgPSBuZXcgVGVzdEtleVBhaXIoa2V5QWxnKS5nZXRQdWJsaWMoKTsKKyAgICAgICAgVHJ1c3RBbmNob3IgdGExID0gbmV3IFRydXN0QW5jaG9yKHZhbGlkQ2FOYW1lUmZjMjI1MywgcGssIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKHRhMS5nZXROYW1lQ29uc3RyYWludHMoKSk7CisKKyAgICAgICAgWDUwMFByaW5jaXBhbCB4NTAwcCA9IG5ldyBYNTAwUHJpbmNpcGFsKHZhbGlkQ2FOYW1lUmZjMjI1Myk7CisgICAgICAgIFRydXN0QW5jaG9yIHRhMiA9IG5ldyBUcnVzdEFuY2hvcih4NTAwcCwgcGssIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKHRhMi5nZXROYW1lQ29uc3RyYWludHMoKSk7CisKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRGYWN0ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYNTA5Iik7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBwZW1DZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGVzdFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCkpKTsKKworICAgICAgICBUcnVzdEFuY2hvciB0YTMgPSBuZXcgVHJ1c3RBbmNob3IocGVtQ2VydCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwodGEzLmdldE5hbWVDb25zdHJhaW50cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBUcnVzdEFuY2hvcjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHZhbGlkIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3JzPGJyPgorICAgICAqIEV4cGVjdGVkOiBub3QgbnVsbCBzdHJpbmc8YnI+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworICAgICAgICBUcnVzdEFuY2hvciB0YTEgPSBuZXcgVHJ1c3RBbmNob3IodmFsaWRDYU5hbWVSZmMyMjUzLCBwaywKKyAgICAgICAgICAgICAgICBnZXRGdWxsRW5jb2RpbmcoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodGExLnRvU3RyaW5nKCkpOworCisgICAgICAgIFg1MDBQcmluY2lwYWwgeDUwMHAgPSBuZXcgWDUwMFByaW5jaXBhbCh2YWxpZENhTmFtZVJmYzIyNTMpOworICAgICAgICBUcnVzdEFuY2hvciB0YTIgPSBuZXcgVHJ1c3RBbmNob3IoeDUwMHAsIHBrLCBnZXRFbmNvZGluZ05vTWluTWF4KCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRhMi50b1N0cmluZygpKTsKKworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIHBlbUNlcnQgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdAorICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShUZXN0VXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRYNTA5Q2VydGlmaWNhdGVfdjMoKSkpOworCisgICAgICAgIFRydXN0QW5jaG9yIHRhMyA9IG5ldyBUcnVzdEFuY2hvcihwZW1DZXJ0LCBnZXRFbmNvZGluZ1BTT25seSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0YTMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0Q0EoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqICAKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgbW9zdCB0cnVzdGVkIENBPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdmFsaWQgQ0Egb3IgQ0EgbmFtZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEV4cGVjdGVkOiB0aGUgc2FtZSBDQSBvdCB0aGUgQ0Egd2l0aCB0aGUgc2FtZSBuYW1lIG11c3QgYmUgcmV0dXJuZWQKKyAgICAgKiBieSB0aGUgbWV0aG9kPGJyPgorICAgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q0EiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0Q0EwMSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFB1YmxpY0tleSBwayA9IG5ldyBUZXN0S2V5UGFpcihrZXlBbGcpLmdldFB1YmxpYygpOworCisgICAgICAgIC8vIHN1YiB0ZXN0Y2FzZSAxCisgICAgICAgIFRydXN0QW5jaG9yIHRhID0KKyAgICAgICAgICAgIG5ldyBUcnVzdEFuY2hvcih2YWxpZENhTmFtZVJmYzIyNTMsIHBrLCBudWxsKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBjYSA9IHRhLmdldENBKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXF1YWxzMSIsIHZhbGlkQ2FOYW1lUmZjMjI1MywgY2EuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gc3ViIHRlc3RjYXNlIDIKKyAgICAgICAgWDUwMFByaW5jaXBhbCB4NTAwcCA9IG5ldyBYNTAwUHJpbmNpcGFsKHZhbGlkQ2FOYW1lUmZjMjI1Myk7CisgICAgICAgIHRhID0gbmV3IFRydXN0QW5jaG9yKHg1MDBwLCBwaywgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXF1YWxzMiIsIHg1MDBwLCB0YS5nZXRDQSgpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFByaXZhdGUgc3R1ZmYKKyAgICAvLworICAgIAorICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHJldHVybiB2YWxpZCBERVIgZW5jb2RpbmcKKyAgICAgKiBmb3IgdGhlIGZvbGxvd2luZyBBU04uMSBkZWZpbml0aW9uIChhcyBzcGVjaWZpZWQgaW4gUkZDIDMyODAgLQorICAgICAqICBJbnRlcm5ldCBYLjUwOSBQdWJsaWMgS2V5IEluZnJhc3RydWN0dXJlLgorICAgICAqICBDZXJ0aWZpY2F0ZSBhbmQgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IChDUkwpIFByb2ZpbGUuCisgICAgICogIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMyODAudHh0KToKKyAgICAgKiAKKyAgICAgKiAgTmFtZUNvbnN0cmFpbnRzIDo6PSBTRVFVRU5DRSB7CisgICAgICogICAgICAgICAgICAgcGVybWl0dGVkU3VidHJlZXMgICAgICAgWzBdICAgICBHZW5lcmFsU3VidHJlZXMgT1BUSU9OQUwsCisgICAgICogICAgICAgICAgICAgZXhjbHVkZWRTdWJ0cmVlcyAgICAgICAgWzFdICAgICBHZW5lcmFsU3VidHJlZXMgT1BUSU9OQUwgfQorICAgICAqCisgICAgICogICAgICAgIEdlbmVyYWxTdWJ0cmVlcyA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uTUFYKSBPRiBHZW5lcmFsU3VidHJlZQorICAgICAqCisgICAgICogICAgICAgIEdlbmVyYWxTdWJ0cmVlIDo6PSBTRVFVRU5DRSB7CisgICAgICogICAgICAgICAgICAgYmFzZSAgICAgICAgICAgICAgICAgICAgR2VuZXJhbE5hbWUsCisgICAgICogICAgICAgICAgICAgbWluaW11bSAgICAgICAgIFswXSAgICAgQmFzZURpc3RhbmNlIERFRkFVTFQgMCwKKyAgICAgKiAgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgWzFdICAgICBCYXNlRGlzdGFuY2UgT1BUSU9OQUwgfQorICAgICAqCisgICAgICogICAgICAgIEJhc2VEaXN0YW5jZSA6Oj0gSU5URUdFUiAoMC4uTUFYKQorICAgICAqCisgICAgICogICAgICAgIEdlbmVyYWxOYW1lIDo6PSBDSE9JQ0UgeworICAgICAqICAgICAgICAgICAgIG90aGVyTmFtZSAgICAgICAgICAgICAgICAgICAgICAgWzBdICAgICBPdGhlck5hbWUsCisgICAgICogICAgICAgICAgICAgcmZjODIyTmFtZSAgICAgICAgICAgICAgICAgICAgICBbMV0gICAgIElBNVN0cmluZywKKyAgICAgKiAgICAgICAgICAgICBkTlNOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIFsyXSAgICAgSUE1U3RyaW5nLAorICAgICAqICAgICAgICAgICAgIHg0MDBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgWzNdICAgICBPUkFkZHJlc3MsCisgICAgICogICAgICAgICAgICAgZGlyZWN0b3J5TmFtZSAgICAgICAgICAgICAgICAgICBbNF0gICAgIE5hbWUsCisgICAgICogICAgICAgICAgICAgZWRpUGFydHlOYW1lICAgICAgICAgICAgICAgICAgICBbNV0gICAgIEVESVBhcnR5TmFtZSwKKyAgICAgKiAgICAgICAgICAgICB1bmlmb3JtUmVzb3VyY2VJZGVudGlmaWVyICAgICAgIFs2XSAgICAgSUE1U3RyaW5nLAorICAgICAqICAgICAgICAgICAgIGlQQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgWzddICAgICBPQ1RFVCBTVFJJTkcsCisgICAgICogICAgICAgICAgICAgcmVnaXN0ZXJlZElEICAgICAgICAgICAgICAgICAgICBbOF0gICAgIE9CSkVDVCBJREVOVElGSUVSfQorICAgICAqLyAKKworICAgIC8vCisgICAgLy8gRnVsbCBOYW1lQ29uc3RyYWludHMgZW5jb2RpbmcKKyAgICAvLyAoZ2VuZXJhdGVkIGJ5IG93biBlbmNvZGVyIGNsYXNzIGNyZWF0ZWQgZHVyaW5nIHRlc3QgZGV2ZWxvcG1lbnQpCisgICAgLy8KKyAgICAvLyBAcmV0dXJuIEZ1bGwgTmFtZUNvbnN0cmFpbnRzIGVuY29kaW5nCisgICAgLy8gd2l0aCBhbGwgT1BUSU9OQUwgdmFsdWVzIHByZXNlbnRlZC4KKyAgICAvLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBnZXRGdWxsRW5jb2RpbmcoKSB7CisgICAgICAgIC8vIERPIE5PVCBNT0RJRlkhCisgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4ODEsKGJ5dGUpMHg4YywoYnl0ZSkweGEwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDQsKGJ5dGUpMHgzMCwoYnl0ZSkweDE2LChieXRlKTB4ODYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwZSwoYnl0ZSkweDY2LChieXRlKTB4NjksKGJ5dGUpMHg2YywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY1LChieXRlKTB4M2EsKGJ5dGUpMHgyZiwoYnl0ZSkweDJmLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjYsKGJ5dGUpMHg2ZiwoYnl0ZSkweDZmLChieXRlKTB4MmUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2MywoYnl0ZSkweDZmLChieXRlKTB4NmQsKGJ5dGUpMHg4MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLChieXRlKTB4MDAsKGJ5dGUpMHg4MSwoYnl0ZSkweDAxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDEsKGJ5dGUpMHgzMCwoYnl0ZSkweDE2LChieXRlKTB4ODYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwZSwoYnl0ZSkweDY2LChieXRlKTB4NjksKGJ5dGUpMHg2YywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY1LChieXRlKTB4M2EsKGJ5dGUpMHgyZiwoYnl0ZSkweDJmLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjIsKGJ5dGUpMHg2MSwoYnl0ZSkweDcyLChieXRlKTB4MmUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2MywoYnl0ZSkweDZmLChieXRlKTB4NmQsKGJ5dGUpMHg4MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLChieXRlKTB4MDAsKGJ5dGUpMHg4MSwoYnl0ZSkweDAxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDEsKGJ5dGUpMHgzMCwoYnl0ZSkweDEyLChieXRlKTB4ODYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwYSwoYnl0ZSkweDY2LChieXRlKTB4NjksKGJ5dGUpMHg2YywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY1LChieXRlKTB4M2EsKGJ5dGUpMHgyZiwoYnl0ZSkweDJmLAorICAgICAgICAgICAgICAgIChieXRlKTB4NmQsKGJ5dGUpMHg3NSwoYnl0ZSkweDc1LChieXRlKTB4ODAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwoYnl0ZSkweDAwLChieXRlKTB4ODEsKGJ5dGUpMHgwMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLChieXRlKTB4YTEsKGJ5dGUpMHg0NCwoYnl0ZSkweDMwLAorICAgICAgICAgICAgICAgIChieXRlKTB4MTYsKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwoYnl0ZSkweDc0LChieXRlKTB4NzAsKGJ5dGUpMHgzYSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2NiwoYnl0ZSkweDZmLAorICAgICAgICAgICAgICAgIChieXRlKTB4NmYsKGJ5dGUpMHgyZSwoYnl0ZSkweDYzLChieXRlKTB4NmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2ZCwoYnl0ZSkweDgwLChieXRlKTB4MDEsKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDgxLChieXRlKTB4MDEsKGJ5dGUpMHgwMSwoYnl0ZSkweDMwLAorICAgICAgICAgICAgICAgIChieXRlKTB4MTYsKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwoYnl0ZSkweDc0LChieXRlKTB4NzAsKGJ5dGUpMHgzYSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2MiwoYnl0ZSkweDYxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzIsKGJ5dGUpMHgyZSwoYnl0ZSkweDYzLChieXRlKTB4NmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2ZCwoYnl0ZSkweDgwLChieXRlKTB4MDEsKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDgxLChieXRlKTB4MDEsKGJ5dGUpMHgwMSwoYnl0ZSkweDMwLAorICAgICAgICAgICAgICAgIChieXRlKTB4MTIsKGJ5dGUpMHg4NiwoYnl0ZSkweDBhLChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwoYnl0ZSkweDc0LChieXRlKTB4NzAsKGJ5dGUpMHgzYSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2ZCwoYnl0ZSkweDc1LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzUsKGJ5dGUpMHg4MCwoYnl0ZSkweDAxLChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg4MSwoYnl0ZSkweDAxLChieXRlKTB4MDEKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE5hbWVDb25zdHJhaW50cyBlbmNvZGluZyB3aXRob3V0IGV4Y2x1ZGVkU3VidHJlZXMKKyAgICAvLyAoZ2VuZXJhdGVkIGJ5IG93biBlbmNvZGVyIGNsYXNzIGNyZWF0ZWQgZHVyaW5nIHRlc3QgZGV2ZWxvcG1lbnQpCisgICAgLy8KKyAgICAvLyBAcmV0dXJuIE5hbWVDb25zdHJhaW50cyBlbmNvZGluZyB3aXRoIAorICAgIC8vIHBlcm1pdHRlZFN1YnRyZWVzIG9ubHk7IGFsbCBPUFRJT05BTAorICAgIC8vIHZhbHVlcyBpbiBwZXJtaXR0ZWRTdWJ0cmVlcyBhcmUgcHJlc2VudGVkLgorICAgIC8vCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGdldEVuY29kaW5nUFNPbmx5KCkgeworICAgICAgICAvLyBETyBOT1QgTU9ESUZZIQorICAgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzMCwoYnl0ZSkweDQ2LChieXRlKTB4YTAsKGJ5dGUpMHg0NCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MTYsKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjYsKGJ5dGUpMHg2OSwoYnl0ZSkweDZjLChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDZmLChieXRlKTB4NmYsKGJ5dGUpMHgyZSwoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4NmYsKGJ5dGUpMHg2ZCwoYnl0ZSkweDgwLChieXRlKTB4MDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwoYnl0ZSkweDgxLChieXRlKTB4MDEsKGJ5dGUpMHgwMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MTYsKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjYsKGJ5dGUpMHg2OSwoYnl0ZSkweDZjLChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2MiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDYxLChieXRlKTB4NzIsKGJ5dGUpMHgyZSwoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4NmYsKGJ5dGUpMHg2ZCwoYnl0ZSkweDgwLChieXRlKTB4MDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwoYnl0ZSkweDgxLChieXRlKTB4MDEsKGJ5dGUpMHgwMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MTIsKGJ5dGUpMHg4NiwoYnl0ZSkweDBhLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjYsKGJ5dGUpMHg2OSwoYnl0ZSkweDZjLChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2ZCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LChieXRlKTB4NzUsKGJ5dGUpMHg4MCwoYnl0ZSkweDAxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsKGJ5dGUpMHg4MSwoYnl0ZSkweDAxLChieXRlKTB4MDEsCisgICAgICAgIH07CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOYW1lQ29uc3RyYWludHMgZW5jb2Rpbmcgd2l0aG91dCBwZXJtaXR0ZWRTdWJ0cmVlcworICAgIC8vIChnZW5lcmF0ZWQgYnkgb3duIGVuY29kZXIgY2xhc3MgY3JlYXRlZCBkdXJpbmcgdGVzdCBkZXZlbG9wbWVudCkKKyAgICAvLworICAgIC8vIEByZXR1cm4gTmFtZUNvbnN0cmFpbnRzIGVuY29kaW5nIHdpdGggCisgICAgLy8gZXhjbHVkZWRTdWJ0cmVlcyBvbmx5OyBhbGwgT1BUSU9OQUwKKyAgICAvLyB2YWx1ZXMgaW4gZXhjbHVkZWRTdWJ0cmVlcyBhcmUgcHJlc2VudGVkLgorICAgIC8vCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGdldEVuY29kaW5nRVNPbmx5KCkgeworICAgICAgICAvLyBETyBOT1QgTU9ESUZZIQorICAgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzMCwoYnl0ZSkweDQ2LChieXRlKTB4YTEsKGJ5dGUpMHg0NCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MTYsKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsKGJ5dGUpMHg3NCwoYnl0ZSkweDc0LChieXRlKTB4NzAsIC8vIGh0dHAKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDNhLChieXRlKTB4MmYsKGJ5dGUpMHgyZiwoYnl0ZSkweDY2LCAvLyA6Ly9mCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2ZiwoYnl0ZSkweDZmLChieXRlKTB4MmUsKGJ5dGUpMHg2MywgLy8gb28uYworICAgICAgICAgICAgICAgIChieXRlKTB4NmYsKGJ5dGUpMHg2ZCwoYnl0ZSkweDgwLChieXRlKTB4MDEsIC8vIG9tCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwoYnl0ZSkweDgxLChieXRlKTB4MDEsKGJ5dGUpMHgwMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MTYsKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsKGJ5dGUpMHg3NCwoYnl0ZSkweDc0LChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2MiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDYxLChieXRlKTB4NzIsKGJ5dGUpMHgyZSwoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4NmYsKGJ5dGUpMHg2ZCwoYnl0ZSkweDgwLChieXRlKTB4MDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwoYnl0ZSkweDgxLChieXRlKTB4MDEsKGJ5dGUpMHgwMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MTIsKGJ5dGUpMHg4NiwoYnl0ZSkweDBhLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsKGJ5dGUpMHg3NCwoYnl0ZSkweDc0LChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2ZCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LChieXRlKTB4NzUsKGJ5dGUpMHg4MCwoYnl0ZSkweDAxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsKGJ5dGUpMHg4MSwoYnl0ZSkweDAxLChieXRlKTB4MDEsCisgICAgICAgIH07CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOYW1lQ29uc3RyYWludHMgZnVsbCBlbmNvZGluZyB3aXRoIGFsbCAoT1BUSU9OQUwpCisgICAgLy8gbWluaW11bS9tYXhpbXVtIEdlbmVyYWxTdWJ0cmVlIGZpZWxkcyBPTUlUVEVECisgICAgLy8gKGdlbmVyYXRlZCBieSBvd24gZW5jb2RlciBjbGFzcyBjcmVhdGVkIGR1cmluZyB0ZXN0IGRldmVsb3BtZW50KQorICAgIC8vCisgICAgLy8gQHJldHVybiBGdWxsIE5hbWVDb25zdHJhaW50cyBlbmNvZGluZworICAgIC8vIHdpdGggYWxsIChPUFRJT05BTCkgbWluaW11bS9tYXhpbXVtCisgICAgLy8gR2VuZXJhbFN1YnRyZWUgZmllbGRzIE9NSVRURUQKKyAgICAvLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBnZXRFbmNvZGluZ05vTWluTWF4KCkgeworICAgICAgICAvLyBETyBOT1QgTU9ESUZZIQorICAgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzMCwoYnl0ZSkweDY4LChieXRlKTB4YTAsKGJ5dGUpMHgzMiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MTAsKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjYsKGJ5dGUpMHg2OSwoYnl0ZSkweDZjLChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDZmLChieXRlKTB4NmYsKGJ5dGUpMHgyZSwoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4NmYsKGJ5dGUpMHg2ZCwoYnl0ZSkweDMwLChieXRlKTB4MTAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg4NiwoYnl0ZSkweDBlLChieXRlKTB4NjYsKGJ5dGUpMHg2OSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDZjLChieXRlKTB4NjUsKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLAorICAgICAgICAgICAgICAgIChieXRlKTB4MmYsKGJ5dGUpMHg2MiwoYnl0ZSkweDYxLChieXRlKTB4NzIsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgyZSwoYnl0ZSkweDYzLChieXRlKTB4NmYsKGJ5dGUpMHg2ZCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLChieXRlKTB4MGMsKGJ5dGUpMHg4NiwoYnl0ZSkweDBhLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjYsKGJ5dGUpMHg2OSwoYnl0ZSkweDZjLChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzYSwoYnl0ZSkweDJmLChieXRlKTB4MmYsKGJ5dGUpMHg2ZCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LChieXRlKTB4NzUsKGJ5dGUpMHhhMSwoYnl0ZSkweDMyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MzAsKGJ5dGUpMHgxMCwoYnl0ZSkweDg2LChieXRlKTB4MGUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwoYnl0ZSkweDc0LChieXRlKTB4NzQsKGJ5dGUpMHg3MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDNhLChieXRlKTB4MmYsKGJ5dGUpMHgyZiwoYnl0ZSkweDY2LAorICAgICAgICAgICAgICAgIChieXRlKTB4NmYsKGJ5dGUpMHg2ZiwoYnl0ZSkweDJlLChieXRlKTB4NjMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2ZiwoYnl0ZSkweDZkLChieXRlKTB4MzAsKGJ5dGUpMHgxMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDg2LChieXRlKTB4MGUsKGJ5dGUpMHg2OCwoYnl0ZSkweDc0LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzQsKGJ5dGUpMHg3MCwoYnl0ZSkweDNhLChieXRlKTB4MmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgyZiwoYnl0ZSkweDYyLChieXRlKTB4NjEsKGJ5dGUpMHg3MiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJlLChieXRlKTB4NjMsKGJ5dGUpMHg2ZiwoYnl0ZSkweDZkLAorICAgICAgICAgICAgICAgIChieXRlKTB4MzAsKGJ5dGUpMHgwYywoYnl0ZSkweDg2LChieXRlKTB4MGEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwoYnl0ZSkweDc0LChieXRlKTB4NzQsKGJ5dGUpMHg3MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDNhLChieXRlKTB4MmYsKGJ5dGUpMHgyZiwoYnl0ZSkweDZkLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzUsKGJ5dGUpMHg3NSwKKyAgICAgICAgfTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q1JMMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q1JMMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMxMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDUkwyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKiAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMRW50cnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKKworQFRlc3RUYXJnZXRDbGFzcyhYNTA5Q1JMLmNsYXNzKQorcHVibGljIGNsYXNzIFg1MDlDUkwyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIHBlbUNlcnQgPSBudWxsOworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFN1cHBvcnRfUmVzb3VyY2VzCisgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyZWFtKCJoeXRzX2NlcnRpZmljYXRlX1BFTS50eHQiKTsKKworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKKyAgICAgICAgcGVtQ2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0LmdlbmVyYXRlQ2VydGlmaWNhdGUoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTCNnZXRFeHRlbnNpb25WYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFeHRlbnNpb25WYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEV4dGVuc2lvblZhbHVlTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIGlmIChwZW1DZXJ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc+IGV4dGVuc2lvbk9pZHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbk9pZHMuYWRkQWxsKHBlbUNlcnQuZ2V0Q3JpdGljYWxFeHRlbnNpb25PSURzKCkpOworICAgICAgICAgICAgZXh0ZW5zaW9uT2lkcy5hZGRBbGwocGVtQ2VydC5nZXROb25Dcml0aWNhbEV4dGVuc2lvbk9JRHMoKSk7CisgICAgICAgICAgICBJdGVyYXRvciBpID0gZXh0ZW5zaW9uT2lkcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG9pZCA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSB2YWx1ZSA9IHBlbUNlcnQuZ2V0RXh0ZW5zaW9uVmFsdWUob2lkKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgaXQgaXMgYW4gZW5jb2RlZCBhcyBhIE9DVEVUIFNUUklORworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXh0ZW5zaW9uIHZhbHVlIGZvciB0aGUgb2lkICIgKyBvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2FzIG5vdCBlbmNvZGVkIGFzIGFuIE9DVEVUIFNUUklORyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbMF0gPT0gMHgwNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vIGVuZCB3aGlsZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFpbCgiVW5hYmxlIHRvIG9idGFpbiBYNTA5Q2VydGlmaWNhdGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTCNYNTA5Q1JMKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWDUwOUNSTCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X1g1MDlDUkwoKSB7CisgICAgICAgIE15WDUwOUNSTCBjcmwgPSBuZXcgTXlYNTA5Q1JMKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiWC41MDkiLCBjcmwuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBjbGFzcyBNeVg1MDlDUkwgZXh0ZW5kcyBYNTA5Q1JMIHsKKworICAgICAgICBwdWJsaWMgTXlYNTA5Q1JMKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB0aHJvd3MgQ1JMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0SXNzdWVyRE4oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGF0ZSBnZXROZXh0VXBkYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFg1MDlDUkxFbnRyeSBnZXRSZXZva2VkQ2VydGlmaWNhdGUoQmlnSW50ZWdlciBzZXJpYWxOdW1iZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8PyBleHRlbmRzIFg1MDlDUkxFbnRyeT4gZ2V0UmV2b2tlZENlcnRpZmljYXRlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lnQWxnTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lnQWxnT0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRTaWdBbGdQYXJhbXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ25hdHVyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0VEJTQ2VydExpc3QoKSB0aHJvd3MgQ1JMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEYXRlIGdldFRoaXNVcGRhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoUHVibGljS2V5IGtleSkgdGhyb3dzIENSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXksIFN0cmluZyBzaWdQcm92aWRlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgQ1JMRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgU2lnbmF0dXJlRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jldm9rZWQoQ2VydGlmaWNhdGUgY2VydCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RXh0ZW5zaW9uVmFsdWUoU3RyaW5nIG9pZCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNSTEVudHJ5MlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q1JMRW50cnkyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OWYzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNSTEVudHJ5MlRlc3QuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKiAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMRW50cnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoWDUwOUNSTEVudHJ5LmNsYXNzKQorcHVibGljIGNsYXNzIFg1MDlDUkxFbnRyeTJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUgcGVtQ2VydCA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gU3VwcG9ydF9SZXNvdXJjZXMKKyAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJlYW0oImh5dHNfY2VydGlmaWNhdGVfUEVNLnR4dCIpOworCisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWDUwOSIpOworICAgICAgICBwZW1DZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMRW50cnkjZ2V0RXh0ZW5zaW9uVmFsdWUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RXh0ZW5zaW9uVmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRFeHRlbnNpb25WYWx1ZUxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICBpZiAocGVtQ2VydCAhPSBudWxsKSB7CisgICAgICAgICAgICBWZWN0b3I8U3RyaW5nPiBleHRlbnNpb25PaWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgICAgICBleHRlbnNpb25PaWRzLmFkZEFsbChwZW1DZXJ0LmdldENyaXRpY2FsRXh0ZW5zaW9uT0lEcygpKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbk9pZHMuYWRkQWxsKHBlbUNlcnQuZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkpOworICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGV4dGVuc2lvbk9pZHMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBvaWQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBieXRlW10gdmFsdWUgPSBwZW1DZXJ0LmdldEV4dGVuc2lvblZhbHVlKG9pZCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGl0IGlzIGFuIGVuY29kZWQgYXMgYSBPQ1RFVCBTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGV4dGVuc2lvbiB2YWx1ZSBmb3IgdGhlIG9pZCAiICsgb2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBub3QgZW5jb2RlZCBhcyBhbiBPQ1RFVCBTVFJJTkciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlWzBdID09IDB4MDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0vLyBlbmQgd2hpbGUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byBvYnRhaW4gWDUwOUNlcnRpZmljYXRlIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNSTEVudHJ5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDUkxFbnRyeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWY4NWMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDUkxFbnRyeVRlc3QuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgQWxleGFuZGVyIFkuIEtsZXltZW5vdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkxFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhYNTA5Q1JMRW50cnkuY2xhc3MpCitwdWJsaWMgY2xhc3MgWDUwOUNSTEVudHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIFg1MDlDUkxFbnRyeSB0YnRfY3JsZW50cnk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3R1YiBjbGFzcyB1c2VkIGZvciB0ZXN0aW5nIG9mIG5vbiBhYnN0cmFjdCBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgVEJUQ1JMRW50cnkgZXh0ZW5kcyBYNTA5Q1JMRW50cnkgeworICAgICAgICBwdWJsaWMgVEJUQ1JMRW50cnkoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldENyaXRpY2FsRXh0ZW5zaW9uT0lEcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFeHRlbnNpb25WYWx1ZShTdHJpbmcgb2lkKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB0aHJvd3MgQ1JMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGF0ZSBnZXRSZXZvY2F0aW9uRGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgWDUwOUNSTEVudHJ5VGVzdCgpIHsKKyAgICAgICAgdGJ0X2NybGVudHJ5ID0gbmV3IFRCVENSTEVudHJ5KCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgdGhyb3dzIENSTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10gezEsIDIsIDN9OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFg1MDlDUkxFbnRyeSgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBmb3IgY3JlYXRpbmcgb2JqZWN0LgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJYNTA5Q1JMRW50cnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WDUwOUNSTEVudHJ5KCkgeworICAgICAgICBUQlRDUkxFbnRyeSB0YnRfY3JsZW50cnkgPSBuZXcgVEJUQ1JMRW50cnkoKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydE51bGwodGJ0X2NybGVudHJ5LmdldENlcnRpZmljYXRlSXNzdWVyKCkpOworICAgICAgICBhc3NlcnROdWxsKHRidF9jcmxlbnRyeS5nZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKHRidF9jcmxlbnRyeS5nZXRFbmNvZGVkKCkpOworICAgICAgICB9IGNhdGNoIChDUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKHRidF9jcmxlbnRyeS5nZXROb25Dcml0aWNhbEV4dGVuc2lvbk9JRHMoKSk7CisgICAgICAgIGFzc2VydE51bGwodGJ0X2NybGVudHJ5LmdldFJldm9jYXRpb25EYXRlKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogZXF1YWxzKE9iamVjdCBvdGhlcikgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoZSBjb3JyZWN0bmVzcyBvZiBlcXVhbAorICAgICAqIG9wZXJhdGlvbjogaXQgc2hvdWxkIGJlIHJlZmxleGl2ZSwgc3ltbWV0cmljLCB0cmFuc2l0aXZlLCBjb25zaXN0ZW50CisgICAgICogYW5kIHNob3VsZCBiZSBmYWxzZSBvbiBudWxsIG9iamVjdC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgICAgIFRCVENSTEVudHJ5IHRidF9jcmxlbnRyeV8xID0gbmV3IFRCVENSTEVudHJ5KCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsxLCAyLCAzfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBUQlRDUkxFbnRyeSB0YnRfY3JsZW50cnlfMiA9IG5ldyBUQlRDUkxFbnRyeSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7MSwgMiwgM307CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgVEJUQ1JMRW50cnkgdGJ0X2NybGVudHJ5XzMgPSBuZXcgVEJUQ1JMRW50cnkoKSB7CisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10gezMsIDIsIDF9OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGNoZWNraW5nIGZvciByZWZsZXhpdmUgbGF3OgorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YnRfY3JsZW50cnkuZXF1YWxzKHRidF9jcmxlbnRyeSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIENSTCBFbnRyaWVzIHdpdGggZXF1YWxzIGVuY29kZWQgZm9ybSBzaG91bGQgYmUgZXF1YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YnRfY3JsZW50cnksIHRidF9jcmxlbnRyeV8xKTsKKyAgICAgICAgLy8gY2hlY2tpbmcgZm9yIHN5bW1ldHJpYyBsYXc6CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBzaG91bGQgYmUgc3ltbWV0cmljLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRidF9jcmxlbnRyeV8xLmVxdWFscyh0YnRfY3JsZW50cnkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBDUkwgRW50cmllcyB3aXRoIGVxdWFscyBlbmNvZGVkIGZvcm0gc2hvdWxkIGJlIGVxdWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJ0X2NybGVudHJ5XzEsIHRidF9jcmxlbnRyeV8yKTsKKyAgICAgICAgLy8gY2hlY2tpbmcgZm9yIHRyYW5zaXRpdmUgbGF3OgorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gc2hvdWxkIGJlIHRyYW5zaXRpdmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJ0X2NybGVudHJ5LmVxdWFscyh0YnRfY3JsZW50cnlfMikpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJTaG91bGQgbm90IGJlIGVxdWFsIHRvIG51bGwgb2JqZWN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRidF9jcmxlbnRyeS5lcXVhbHMobnVsbCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgQ1JMIEVudHJpZXMgd2l0aCBkaWZmZXJpbmcgZW5jb2RlZCBmb3JtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBiZSBlcXVhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YnRfY3JsZW50cnkuZXF1YWxzKHRidF9jcmxlbnRyeV8zKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgQ1JMIEVudHJpZXMgc2hvdWxkIG5vdCBiZSBlcXVhbHMgdG8gdGhlIG9iamVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoaWNoIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBYNTA5Q1JMRW50cnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJ0X2NybGVudHJ5LmVxdWFscyhuZXcgT2JqZWN0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoYXNoQ29kZSgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGF0IGZvciBlcXVhbCBvYmplY3RzIGhhc2ggY29kZXMKKyAgICAgKiBhcmUgZXF1YWwuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgeworICAgICAgICBUQlRDUkxFbnRyeSB0YnRfY3JsZW50cnlfMSA9IG5ldyBUQlRDUkxFbnRyeSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7MSwgMiwgM307CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydFRydWUoIkVxdWFsIG9iamVjdHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2Rlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdGJ0X2NybGVudHJ5Lmhhc2hDb2RlKCkgPT0gdGJ0X2NybGVudHJ5XzEuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0Q2VydGlmaWNhdGVJc3N1ZXIoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgdGhlIG1ldGhvZCB0aHJvd3MKKyAgICAgKiBhcHByb3ByaWF0ZSBleGNlcHRpb24uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENlcnRpZmljYXRlSXNzdWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldENlcnRpZmljYXRlSXNzdWVyKCkgeworICAgICAgICBhc3NlcnROdWxsKCJUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIG51bGwuIiwgCisgICAgICAgICAgICAgICAgdGJ0X2NybGVudHJ5LmdldENlcnRpZmljYXRlSXNzdWVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoWDUwOUNSTEVudHJ5VGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNSTFNlbGVjdG9yMlRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q1JMU2VsZWN0b3IyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNGRhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNSTFNlbGVjdG9yMlRlc3QuamF2YQpAQCAtMCwwICsxLDgwNSBAQAorcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkxFbnRyeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTFNlbGVjdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5UZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUludGVnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9jdGV0U3RyaW5nOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CitAVGVzdFRhcmdldENsYXNzKFg1MDlDUkxTZWxlY3Rvci5jbGFzcykKK3B1YmxpYyBjbGFzcyBYNTA5Q1JMU2VsZWN0b3IyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0ZXN0aW5nLgorICAgICAqIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJYNTA5Q1JMU2VsZWN0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WDUwOUNSTFNlbGVjdG9yKCkgeworICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNSTFNlbGVjdG9yKCk7CisgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0RGF0ZUFuZFRpbWUoKSk7CisgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVDaGVja2luZygpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzZWxlY3Rvci5nZXRJc3N1ZXJOYW1lcygpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzZWxlY3Rvci5nZXRJc3N1ZXJzKCkpOworICAgICAgICBhc3NlcnROdWxsKHNlbGVjdG9yLmdldE1heENSTCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzZWxlY3Rvci5nZXRNaW5DUkwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkSXNzdWVyKFg1MDBQcmluY2lwYWwgaXNzdWVyKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgQ1JMcyB3aXRoCisgICAgICogc3BlY2lmaWVkIGlzc3VlcnMgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQgaWYgbm90IHNwZWNpZmllZCBpc3N1ZXIgZG9lcworICAgICAqIG5vdCBtYXRjaCB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSXNzdWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSXNzdWVyTGphdmF4X3NlY3VyaXR5X2F1dGhfeDUwMF9YNTAwUHJpbmNpcGFsMDIoKSB7CisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MxID0gbmV3IFg1MDBQcmluY2lwYWwoIk89Rmlyc3QgT3JnLiIpOworICAgICAgICBYNTAwUHJpbmNpcGFsIGlzczIgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1TZWNvbmQgT3JnLiIpOworICAgICAgICBDUkwgY3JsMSA9IG5ldyBUZXN0Q1JMKGlzczEpOworICAgICAgICBDUkwgY3JsMiA9IG5ldyBUZXN0Q1JMKGlzczIpOworCisgICAgICAgIHNlbGVjdG9yLmFkZElzc3Vlcihpc3MxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIENSTCBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgIC5tYXRjaChjcmwxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgQ1JMIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNybDIpKTsKKyAgICAgICAgc2VsZWN0b3IuYWRkSXNzdWVyKGlzczIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQ1JMIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLm1hdGNoKGNybDIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRJc3N1ZXJOYW1lKFN0cmluZyBuYW1lKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgQ1JMcyB3aXRoIHNwZWNpZmllZAorICAgICAqIGlzc3VlcnMgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQgaWYgbm90IHNwZWNpZmllZCBpc3N1ZXIgZG9lcyBub3QgbWF0Y2gKKyAgICAgKiB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSXNzdWVyTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSXNzdWVyTmFtZUxqYXZhX2xhbmdfU3RyaW5nMDMoKSB7CisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKKyAgICAgICAgU3RyaW5nIGlzczEgPSAiTz1GaXJzdCBPcmcuIjsKKyAgICAgICAgU3RyaW5nIGlzczIgPSAiTz1TZWNvbmQgT3JnLiI7CisgICAgICAgIFRlc3RDUkwgY3JsMSA9IG5ldyBUZXN0Q1JMKG5ldyBYNTAwUHJpbmNpcGFsKGlzczEpKTsKKyAgICAgICAgVGVzdENSTCBjcmwyID0gbmV3IFRlc3RDUkwobmV3IFg1MDBQcmluY2lwYWwoaXNzMikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5hZGRJc3N1ZXJOYW1lKGlzczEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBDUkwgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goY3JsMSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIENSTCBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjcmwyKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5hZGRJc3N1ZXJOYW1lKGlzczIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBDUkwgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goY3JsMikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldElzc3Vlck5hbWVzKENvbGxlY3Rpb24gPD8+IG5hbWVzKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgQ1JMcyB3aXRoCisgICAgICogYW55IGlzc3VlcnMgbWF0Y2ggdGhlIHNlbGVjdG9yIGluIHRoZSBjYXNlIG9mIG51bGwgaXNzdWVyTmFtZXMgY3JpdGVyaWEsCisgICAgICogaWYgc3BlY2lmaWVkIGlzc3VlcnMgbWF0Y2ggdGhlIHNlbGVjdG9yLCBpZiBub3Qgc3BlY2lmaWVkIGlzc3VlciBkb2VzIG5vdAorICAgICAqIG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kIGlmIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uIG9mIGlzc3VlciBuYW1lcyBpcworICAgICAqIGNvcGllZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldElzc3Vlck5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0SXNzdWVyTmFtZXNMamF2YV91dGlsX0NvbGxlY3Rpb24wMigpIHsKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICBTdHJpbmcgaXNzMSA9ICJPPUZpcnN0IE9yZy4iOworICAgICAgICBieXRlW10gaXNzMiA9IG5ldyBieXRlW10KKyAgICAgICAgLy8gbWFudWFsbHkgb2J0YWluZWQgREVSIGVuY29kaW5nIG9mICJPPVNlY29uZCBPcmcuIiBpc3N1ZXIgbmFtZTsKKyAgICAgICAgeyA0OCwgMjIsIDQ5LCAyMCwgNDgsIDE4LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMSwgODMsIDEwMSwgOTksIDExMSwKKyAgICAgICAgICAgICAgICAxMTAsIDEwMCwgMzIsIDc5LCAxMTQsIDEwMywgNDYgfTsKKworICAgICAgICBTdHJpbmcgaXNzMyA9ICJPPVRoaXJkIE9yZy4iOworICAgICAgICBUZXN0Q1JMIGNybDEgPSBuZXcgVGVzdENSTChuZXcgWDUwMFByaW5jaXBhbChpc3MxKSk7CisgICAgICAgIFRlc3RDUkwgY3JsMiA9IG5ldyBUZXN0Q1JMKG5ldyBYNTAwUHJpbmNpcGFsKGlzczIpKTsKKyAgICAgICAgVGVzdENSTCBjcmwzID0gbmV3IFRlc3RDUkwobmV3IFg1MDBQcmluY2lwYWwoaXNzMykpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXJOYW1lcyhudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJBbnkgQ1JMIGlzc3VlcnMgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgaXNzdWVycy4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNybDEpICYmIHNlbGVjdG9yLm1hdGNoKGNybDIpKTsKKworICAgICAgICBBcnJheUxpc3QgaXNzdWVycyA9IG5ldyBBcnJheUxpc3QoMik7CisgICAgICAgIGlzc3VlcnMuYWRkKGlzczEpOworICAgICAgICBpc3N1ZXJzLmFkZChpc3MyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldElzc3Vlck5hbWVzKGlzc3VlcnMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBDUkwgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goY3JsMSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjcmwyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgQ1JMIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNybDMpKTsKKyAgICAgICAgaXNzdWVycy5hZGQoaXNzMyk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgaW50ZXJuYWwgaXNzdWVyIGNvbGxlY3Rpb24gaXMgbm90IHByb3RlY3RlZCAiCisgICAgICAgICAgICAgICAgKyAiYWdhaW5zdCB0aGUgbW9kaWZpY2F0aW9ucy4iLCBzZWxlY3Rvci5tYXRjaChjcmwzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0SXNzdWVycyhDb2xsZWN0aW9uIDxYNTAwUHJpbmNpcGFsPiBpc3N1ZXJzKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYKKyAgICAgKiBDUkxzIHdpdGggYW55IGlzc3VlcnMgbWF0Y2ggdGhlIHNlbGVjdG9yIGluIHRoZSBjYXNlIG9mIG51bGwgaXNzdWVyTmFtZXMKKyAgICAgKiBjcml0ZXJpYSwgaWYgc3BlY2lmaWVkIGlzc3VlcnMgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQgaWYgbm90IHNwZWNpZmllZAorICAgICAqIGlzc3VlciBkb2VzIG5vdCBtYXRjaCB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldElzc3VlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRJc3N1ZXJzTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgeworICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNSTFNlbGVjdG9yKCk7CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMSA9IG5ldyBYNTAwUHJpbmNpcGFsKCJPPUZpcnN0IE9yZy4iKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MyID0gbmV3IFg1MDBQcmluY2lwYWwoIk89U2Vjb25kIE9yZy4iKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MzID0gbmV3IFg1MDBQcmluY2lwYWwoIk89VGhpcmQgT3JnLiIpOworICAgICAgICBUZXN0Q1JMIGNybDEgPSBuZXcgVGVzdENSTChpc3MxKTsKKyAgICAgICAgVGVzdENSTCBjcmwyID0gbmV3IFRlc3RDUkwoaXNzMik7CisgICAgICAgIFRlc3RDUkwgY3JsMyA9IG5ldyBUZXN0Q1JMKGlzczMpOworCisgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcnMobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIkFueSBDUkwgaXNzdWVycyBzaG91bGQgbWF0Y2ggaW4gdGhlIGNhc2Ugb2YgbnVsbCBpc3N1ZXJzLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY3JsMSkgJiYgc2VsZWN0b3IubWF0Y2goY3JsMikpOworCisgICAgICAgIEFycmF5TGlzdDxYNTAwUHJpbmNpcGFsPiBpc3N1ZXJzID0gbmV3IEFycmF5TGlzdDxYNTAwUHJpbmNpcGFsPigyKTsKKyAgICAgICAgaXNzdWVycy5hZGQoaXNzMSk7CisgICAgICAgIGlzc3VlcnMuYWRkKGlzczIpOworICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXJzKGlzc3VlcnMpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQ1JMIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLm1hdGNoKGNybDEpCisgICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY3JsMikpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIENSTCBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjcmwzKSk7CisgICAgICAgIGlzc3VlcnMuYWRkKGlzczMpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGludGVybmFsIGlzc3VlciBjb2xsZWN0aW9uIGlzIG5vdCBwcm90ZWN0ZWQgIgorICAgICAgICAgICAgICAgICsgImFnYWluc3QgdGhlIG1vZGlmaWNhdGlvbnMuIiwgc2VsZWN0b3IubWF0Y2goY3JsMykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZElzc3Vlck5hbWUoYnl0ZVtdIG5hbWUpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiBDUkxzIHdpdGggc3BlY2lmaWVkCisgICAgICogaXNzdWVycyBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZCBpZiBub3Qgc3BlY2lmaWVkIGlzc3VlciBkb2VzIG5vdCBtYXRjaAorICAgICAqIHRoZSBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRJc3N1ZXJOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEFkZElzc3Vlck5hbWUkQigpIHsKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICBieXRlW10gaXNzMSA9IG5ldyBieXRlW10KKyAgICAgICAgLy8gbWFudWFsbHkgb2J0YWluZWQgREVSIGVuY29kaW5nIG9mICJPPUZpcnN0IE9yZy4iIGlzc3VlciBuYW1lOworICAgICAgICB7IDQ4LCAyMSwgNDksIDE5LCA0OCwgMTcsIDYsIDMsIDg1LCA0LCAxMCwgMTksIDEwLCA3MCwgMTA1LCAxMTQsIDExNSwKKyAgICAgICAgICAgICAgICAxMTYsIDMyLCA3OSwgMTE0LCAxMDMsIDQ2IH07CisgICAgICAgIGJ5dGVbXSBpc3MyID0gbmV3IGJ5dGVbXQorICAgICAgICAvLyBtYW51YWxseSBvYnRhaW5lZCBERVIgZW5jb2Rpbmcgb2YgIk89U2Vjb25kIE9yZy4iIGlzc3VlciBuYW1lOworICAgICAgICB7IDQ4LCAyMiwgNDksIDIwLCA0OCwgMTgsIDYsIDMsIDg1LCA0LCAxMCwgMTksIDExLCA4MywgMTAxLCA5OSwgMTExLAorICAgICAgICAgICAgICAgIDExMCwgMTAwLCAzMiwgNzksIDExNCwgMTAzLCA0NiB9OworICAgICAgICBUZXN0Q1JMIGNybDEgPSBuZXcgVGVzdENSTChuZXcgWDUwMFByaW5jaXBhbChpc3MxKSk7CisgICAgICAgIFRlc3RDUkwgY3JsMiA9IG5ldyBUZXN0Q1JMKG5ldyBYNTAwUHJpbmNpcGFsKGlzczIpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3IuYWRkSXNzdWVyTmFtZShpc3MxKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQ1JMIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLm1hdGNoKGNybDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBDUkwgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY3JsMikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3IuYWRkSXNzdWVyTmFtZShpc3MyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQ1JMIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLm1hdGNoKGNybDIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRNaW5DUkxOdW1iZXIoQmlnSW50ZWdlciBtaW5DUkwpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiBDUkxzIHdpdGggYW55CisgICAgICogY3JsIG51bWJlciB2YWx1ZSBtYXRjaCB0aGUgc2VsZWN0b3IgaW4gdGhlIGNhc2Ugb2YgbnVsbCBjcmxOdW1iZXIKKyAgICAgKiBjcml0ZXJpYSwgaWYgc3BlY2lmaWVkIG1pbkNSTCB2YWx1ZSBtYXRjaGVzIHRoZSBzZWxlY3RvciwgYW5kIGlmIENSTCB3aXRoCisgICAgICogaW5hcHByb3ByaWF0ZSBjcmxOdW1iZXIgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHNlbGVjdG9yLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNaW5DUkxOdW1iZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNaW5DUkxOdW1iZXJMamF2YV9tYXRoX0JpZ0ludGVnZXIoKSB7CisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKKyAgICAgICAgQmlnSW50ZWdlciBtaW5DUkwgPSBuZXcgQmlnSW50ZWdlcigiMTAwMDAiKTsKKyAgICAgICAgQ1JMIGNybCA9IG5ldyBUZXN0Q1JMKG1pbkNSTCk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0TWluQ1JMTnVtYmVyKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJBbnkgQ1JMIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsIG1pbkNSTE51bWJlci4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNybCkpOworICAgICAgICBzZWxlY3Rvci5zZXRNaW5DUkxOdW1iZXIobWluQ1JMKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIENSTCBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgIC5tYXRjaChjcmwpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0TWluQ1JMTnVtYmVyKG5ldyBCaWdJbnRlZ2VyKCIxMDAwMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBDUkwgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY3JsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0TWF4Q1JMTnVtYmVyKEJpZ0ludGVnZXIgbWF4Q1JMKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgQ1JMcyB3aXRoIGFueQorICAgICAqIGNybCBudW1iZXIgdmFsdWUgbWF0Y2ggdGhlIHNlbGVjdG9yIGluIHRoZSBjYXNlIG9mIG51bGwgY3JsTnVtYmVyCisgICAgICogY3JpdGVyaWEsIGlmIHNwZWNpZmllZCBtYXhDUkwgdmFsdWUgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIGFuZCBpZiBDUkwgd2l0aAorICAgICAqIGluYXBwcm9wcmlhdGUgY3JsTnVtYmVyIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWF4Q1JMTnVtYmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWF4Q1JMTnVtYmVyTGphdmFfbWF0aF9CaWdJbnRlZ2VyKCkgeworICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNSTFNlbGVjdG9yKCk7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4Q1JMID0gbmV3IEJpZ0ludGVnZXIoIjEwMDAwIik7CisgICAgICAgIFRlc3RDUkwgY3JsID0gbmV3IFRlc3RDUkwobWF4Q1JMKTsKKworICAgICAgICBzZWxlY3Rvci5zZXRNYXhDUkxOdW1iZXIobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIkFueSBDUkwgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgbWluQ1JMTnVtYmVyLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY3JsKSk7CisgICAgICAgIHNlbGVjdG9yLnNldE1heENSTE51bWJlcihtYXhDUkwpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQ1JMIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLm1hdGNoKGNybCkpOworICAgICAgICBzZWxlY3Rvci5zZXRNYXhDUkxOdW1iZXIobmV3IEJpZ0ludGVnZXIoIjk5OTkiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgQ1JMIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNybCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldERhdGVBbmRUaW1lKERhdGUgZGF0ZUFuZFRpbWUpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiBDUkxzIHdpdGggYW55CisgICAgICogdXBkYXRlIGRhdGVzIG1hdGNoIHRoZSBzZWxlY3RvciBpbiB0aGUgY2FzZSBvZiBudWxsIGRhdGVBbmRUaW1lIGNyaXRlcmlhLAorICAgICAqIGlmIGNvcnJlY3QgZGF0ZXMgbWF0Y2ggYW5kIGluY29ycmVjdCBkbyBub3QgbWF0Y2ggdGhlIHNlbGVjdG9yLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYXRlQW5kVGltZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuRGF0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFNldERhdGVBbmRUaW1lTGphdmFfdXRpbF9EYXRlKCkgeworICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNSTFNlbGVjdG9yKCk7CisgICAgICAgIFRlc3RDUkwgY3JsID0gbmV3IFRlc3RDUkwobmV3IERhdGUoMjAwKSwgbmV3IERhdGUoMzAwKSk7CisgICAgICAgIHNlbGVjdG9yLnNldERhdGVBbmRUaW1lKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJBbnkgQ1JMIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsIGRhdGVBbmRUaW1lLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY3JsKSk7CisgICAgICAgIHNlbGVjdG9yLnNldERhdGVBbmRUaW1lKG5ldyBEYXRlKDIwMCkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQ1JMIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLm1hdGNoKGNybCkpOworICAgICAgICBzZWxlY3Rvci5zZXREYXRlQW5kVGltZShuZXcgRGF0ZSgyNTApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIENSTCBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgIC5tYXRjaChjcmwpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0RGF0ZUFuZFRpbWUobmV3IERhdGUoMzAwKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBDUkwgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goY3JsKSk7CisgICAgICAgIHNlbGVjdG9yLnNldERhdGVBbmRUaW1lKG5ldyBEYXRlKDE1MCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIENSTCBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjcmwpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0RGF0ZUFuZFRpbWUobmV3IERhdGUoMzUwKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgQ1JMIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNybCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldENlcnRpZmljYXRlQ2hlY2tpbmcoWDUwOUNlcnRpZmljYXRlKSBtZXRob2QgdGVzdGluZy4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldENlcnRpZmljYXRlQ2hlY2tpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdFNldENlcnRpZmljYXRlQ2hlY2tpbmdMamF2YV9YNTA5Q2VydGlmaWNhdGUoKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworCisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWDUwOSIpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0CisgICAgICAgICAgICAgICAgLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRlc3RVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLmdldFg1MDlDZXJ0aWZpY2F0ZV92MygpKSk7CisKKyAgICAgICAgVGVzdENSTCBjcmwgPSBuZXcgVGVzdENSTCgpOworICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZUNoZWNraW5nKGNlcnQpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQ1JMIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLm1hdGNoKGNybCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2VydCwgc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVDaGVja2luZygpKTsKKyAgICAgICAgCisgICAgICAgIHNlbGVjdG9yLnNldENlcnRpZmljYXRlQ2hlY2tpbmcobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBDUkwgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goY3JsKSk7CisgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVDaGVja2luZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRJc3N1ZXJzKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIGlmIHRoZSBtZXRob2QgcmV0dXJuIG51bGwgaW4gdGhlIGNhc2UKKyAgICAgKiBvZiBub3Qgc3BlY2lmaWVkIGlzc3VlcnMsIGlmIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBpc3N1ZXJzIGFuZCB0aGlzIGNvbGxlY3Rpb24gaXMgdW5tb2RpZmlhYmxlLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJc3N1ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldElzc3VlcnMoKSB7CisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MxID0gbmV3IFg1MDBQcmluY2lwYWwoIk89Rmlyc3QgT3JnLiIpOworICAgICAgICBYNTAwUHJpbmNpcGFsIGlzczIgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1TZWNvbmQgT3JnLiIpOworICAgICAgICBYNTAwUHJpbmNpcGFsIGlzczMgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1UaGlyZCBPcmcuIik7CisgICAgICAgIGFzc2VydE51bGwoIlRoZSBjb2xsZWN0aW9uIHNob3VsZCBiZSBudWxsLiIsIHNlbGVjdG9yLmdldElzc3VlcnMoKSk7CisgICAgICAgIHNlbGVjdG9yLmFkZElzc3Vlcihpc3MxKTsKKyAgICAgICAgc2VsZWN0b3IuYWRkSXNzdWVyKGlzczIpOworICAgICAgICBDb2xsZWN0aW9uPFg1MDBQcmluY2lwYWw+IHJlc3VsdCA9IHNlbGVjdG9yLmdldElzc3VlcnMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoaXNzMyk7CisgICAgICAgICAgICBmYWlsKCJUaGUgcmV0dXJuZWQgY29sbGVjdGlvbiBzaG91bGQgYmUgdW5tb2RpZmlhYmxlLiIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbGxlY3Rpb24gc2hvdWxkIGNvbnRhaW4gdGhlIHNwZWNpZmllZCBETi4iLCByZXN1bHQKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoaXNzMikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldElzc3Vlck5hbWVzKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIGlmIHRoZSBtZXRob2QgcmV0dXJuIG51bGwgaW4gdGhlCisgICAgICogY2FzZSBvZiBub3Qgc3BlY2lmaWVkIGlzc3VlcnMsIGlmIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGNvcnJlc3BvbmRzIHRvCisgICAgICogdGhlIHNwZWNpZmllZCBpc3N1ZXJzLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJc3N1ZXJOYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJc3N1ZXJOYW1lcygpIHsKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICBieXRlW10gaXNzMSA9IG5ldyBieXRlW10KKyAgICAgICAgLy8gbWFudWFsbHkgb2J0YWluZWQgREVSIGVuY29kaW5nIG9mICJPPUZpcnN0IE9yZy4iIGlzc3VlciBuYW1lOworICAgICAgICB7IDQ4LCAyMSwgNDksIDE5LCA0OCwgMTcsIDYsIDMsIDg1LCA0LCAxMCwgMTksIDEwLCA3MCwgMTA1LCAxMTQsIDExNSwKKyAgICAgICAgICAgICAgICAxMTYsIDMyLCA3OSwgMTE0LCAxMDMsIDQ2IH07CisgICAgICAgIGJ5dGVbXSBpc3MyID0gbmV3IGJ5dGVbXQorICAgICAgICAvLyBtYW51YWxseSBvYnRhaW5lZCBERVIgZW5jb2Rpbmcgb2YgIk89U2Vjb25kIE9yZy4iIGlzc3VlciBuYW1lOworICAgICAgICB7IDQ4LCAyMiwgNDksIDIwLCA0OCwgMTgsIDYsIDMsIDg1LCA0LCAxMCwgMTksIDExLCA4MywgMTAxLCA5OSwgMTExLAorICAgICAgICAgICAgICAgIDExMCwgMTAwLCAzMiwgNzksIDExNCwgMTAzLCA0NiB9OworICAgICAgICBhc3NlcnROdWxsKCJUaGUgY29sbGVjdGlvbiBzaG91bGQgYmUgbnVsbC4iLCBzZWxlY3Rvci5nZXRJc3N1ZXJOYW1lcygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdG9yLmFkZElzc3Vlck5hbWUoaXNzMSk7CisgICAgICAgICAgICBzZWxlY3Rvci5hZGRJc3N1ZXJOYW1lKGlzczIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb248T2JqZWN0PiByZXN1bHQgPSBzZWxlY3Rvci5nZXRJc3N1ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBjb2xsZWN0aW9uIHNob3VsZCBjb250YWluIGFsbCBvZiB0aGUgc3BlY2lmaWVkIEROcy4iLAorICAgICAgICAgICAgICAgIDIsIHJlc3VsdC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldE1pbkNSTCgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiB0aGUgbWV0aG9kIHJldHVybiBudWxsIGluIHRoZSBjYXNlCisgICAgICogb2Ygbm90IHNwZWNpZmllZCBtaW5DUkwgY3JpdGVyaWEsIGFuZCBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgY29ycmVzcG9uZHMKKyAgICAgKiB0byB0aGUgc3BlY2lmaWVkIG9uZS4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWluQ1JMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1pbkNSTCgpIHsKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICBhc3NlcnROdWxsKCJJbml0aWFsbHkgdGhlIG1pbkNSTCBzaG91bGQgYmUgbnVsbC4iLCBzZWxlY3Rvci5nZXRNaW5DUkwoKSk7CisgICAgICAgIEJpZ0ludGVnZXIgbWluQ1JMID0gbmV3IEJpZ0ludGVnZXIoIjEwMDAwIik7CisgICAgICAgIHNlbGVjdG9yLnNldE1pbkNSTE51bWJlcihtaW5DUkwpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQuIiwgbWluQ1JMCisgICAgICAgICAgICAgICAgLmVxdWFscyhzZWxlY3Rvci5nZXRNaW5DUkwoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldE1heENSTCgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiB0aGUgbWV0aG9kIHJldHVybiBudWxsIGluIHRoZSBjYXNlCisgICAgICogb2Ygbm90IHNwZWNpZmllZCBtYXhDUkwgY3JpdGVyaWEsIGFuZCBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgY29ycmVzcG9uZHMKKyAgICAgKiB0byB0aGUgc3BlY2lmaWVkIG9uZS4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4Q1JMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1heENSTCgpIHsKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICBhc3NlcnROdWxsKCJJbml0aWFsbHkgdGhlIG1heENSTCBzaG91bGQgYmUgbnVsbC4iLCBzZWxlY3Rvci5nZXRNYXhDUkwoKSk7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4Q1JMID0gbmV3IEJpZ0ludGVnZXIoIjEwMDAwIik7CisgICAgICAgIHNlbGVjdG9yLnNldE1heENSTE51bWJlcihtYXhDUkwpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQuIiwgbWF4Q1JMCisgICAgICAgICAgICAgICAgLmVxdWFscyhzZWxlY3Rvci5nZXRNYXhDUkwoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldERhdGVBbmRUaW1lKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIGlmIHRoZSBtZXRob2QgcmV0dXJuIG51bGwgaW4gdGhlCisgICAgICogY2FzZSBvZiBub3Qgc3BlY2lmaWVkIGRhdGVBbmRUaW1lIGNyaXRlcmlhLCBhbmQgaWYgdGhlIHJldHVybmVkIHZhbHVlCisgICAgICogY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBvbmUuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGVBbmRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldERhdGVBbmRUaW1lKCkgeworICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNSTFNlbGVjdG9yKCk7CisgICAgICAgIGFzc2VydE51bGwoIkluaXRpYWxseSB0aGUgZGF0ZUFuZFRpbWUgY3JpdGVyaWEgc2hvdWxkIGJlIG51bGwuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5nZXREYXRlQW5kVGltZSgpKTsKKyAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoMjAwKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0RGF0ZUFuZFRpbWUoZGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXN1bHQgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZC4iLCBkYXRlCisgICAgICAgICAgICAgICAgLmVxdWFscyhzZWxlY3Rvci5nZXREYXRlQW5kVGltZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0Q2VydGlmaWNhdGVDaGVja2luZygpIG1ldGhvZCB0ZXN0aW5nLiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGVDaGVja2luZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDZXJ0aWZpY2F0ZUNoZWNraW5nTGphdmFfWDUwOUNlcnRpZmljYXRlKCkKKyAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKKworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdAorICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShUZXN0VXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRYNTA5Q2VydGlmaWNhdGVfdjMoKSkpOworCisgICAgICAgIHNlbGVjdG9yLnNldENlcnRpZmljYXRlQ2hlY2tpbmcoY2VydCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjZXJ0LCBzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZUNoZWNraW5nKCkpOworICAgICAgICAKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGVDaGVja2luZyhudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZUNoZWNraW5nKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBtYXRjaChDUkwgY3JsKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgaWYgdGhlIG51bGwgb2JqZWN0IG1hdGNoZXMgdG8gdGhlCisgICAgICogc2VsZWN0b3Igb3Igbm90LgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG5vdCBudWxsIHZhbHVlIGFzIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJtYXRjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hMamF2YV9zZWN1cml0eV9jZXJ0X1g1MDlDUkwoKSB7CisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q1JMU2VsZWN0b3IoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBudWxsIG9iamVjdCBzaG91bGQgbm90IG1hdGNoIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goKFg1MDlDUkwpIG51bGwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbG9uZSgpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyBpZiB0aGUgc2VsZWN0b3IgaXMgY2xvbmVkIGNvcnJlY3RseTogdGhlCisgICAgICogY3JsIHdoaWNoIG1hdGNoZSB0byB0aGUgaW5pdGlhbCBzZWxlY3RvciBzaG91bGQgbWF0Y2ggdG8gdGhlIGNsb25lIGFuZAorICAgICAqIHRoZSBjaGFuZ2Ugb2YgY2xvbmUgc2hvdWxkIG5vdCBjYXVzZSB0aGUgY2hhbmdlIG9mIGluaXRpYWwgc2VsZWN0b3IuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdENsb25lKCkgeworICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNSTFNlbGVjdG9yKCk7CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMSA9IG5ldyBYNTAwUHJpbmNpcGFsKCJPPUZpcnN0IE9yZy4iKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MyID0gbmV3IFg1MDBQcmluY2lwYWwoIk89U2Vjb25kIE9yZy4iKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MzID0gbmV3IFg1MDBQcmluY2lwYWwoIk89VGhpcmQgT3JnLiIpOworICAgICAgICBCaWdJbnRlZ2VyIG1pbkNSTCA9IG5ldyBCaWdJbnRlZ2VyKCIxMDAwMCIpOworICAgICAgICBCaWdJbnRlZ2VyIG1heENSTCA9IG5ldyBCaWdJbnRlZ2VyKCIxMDAwMCIpOworICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgyMDApOworCisgICAgICAgIHNlbGVjdG9yLmFkZElzc3Vlcihpc3MxKTsKKyAgICAgICAgc2VsZWN0b3IuYWRkSXNzdWVyKGlzczIpOworICAgICAgICBzZWxlY3Rvci5zZXRNaW5DUkxOdW1iZXIobWluQ1JMKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0TWF4Q1JMTnVtYmVyKG1heENSTCk7CisgICAgICAgIHNlbGVjdG9yLnNldERhdGVBbmRUaW1lKGRhdGUpOworCisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBjbG9uZSA9IChYNTA5Q1JMU2VsZWN0b3IpIHNlbGVjdG9yLmNsb25lKCk7CisgICAgICAgIFRlc3RDUkwgY3JsID0gbmV3IFRlc3RDUkwoaXNzMSk7CisgICAgICAgIGNybC5zZXRDcmxOdW1iZXIobWluQ1JMKTsKKyAgICAgICAgY3JsLnNldFVwZGF0ZURhdGVzKG5ldyBEYXRlKDIwMCksIG5ldyBEYXRlKDIwMCkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgc3BlY2lmaWVkIENSTCBzaG91bGQgbWF0Y2ggdGhlIGNsb25lIHNlbGVjdG9yLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY3JsKSk7CisKKyAgICAgICAgY2xvbmUuYWRkSXNzdWVyKGlzczMpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNoYW5nZXMgb2YgdGhlIGNsb25lIHNlbGVjdG9yIHNob3VsZCBub3QgY2F1c2UgIgorICAgICAgICAgICAgICAgICsgInRoZSBjaGFuZ2VzIG9mIGluaXRpYWwgb2JqZWN0Iiwgc2VsZWN0b3IuZ2V0SXNzdWVyTmFtZXMoKQorICAgICAgICAgICAgICAgIC5zaXplKCkgPT0gMyk7CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICBYNTAwUHJpbmNpcGFsIGlzczEgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1GaXJzdCBPcmcuIik7CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMiA9IG5ldyBYNTAwUHJpbmNpcGFsKCJPPVNlY29uZCBPcmcuIik7CisgICAgICAgIEJpZ0ludGVnZXIgbWluQ1JMID0gbmV3IEJpZ0ludGVnZXIoIjEwMDAwIik7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4Q1JMID0gbmV3IEJpZ0ludGVnZXIoIjEwMDAwIik7CisgICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKDIwMCk7CisKKyAgICAgICAgc2VsZWN0b3IuYWRkSXNzdWVyKGlzczEpOworICAgICAgICBzZWxlY3Rvci5hZGRJc3N1ZXIoaXNzMik7CisgICAgICAgIHNlbGVjdG9yLnNldE1pbkNSTE51bWJlcihtaW5DUkwpOworICAgICAgICBzZWxlY3Rvci5zZXRNYXhDUkxOdW1iZXIobWF4Q1JMKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0RGF0ZUFuZFRpbWUoZGF0ZSk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIHJlc3VsdCBzaG91bGQgbm90IGJlIG51bGwuIiwgc2VsZWN0b3IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFic3RyYWN0IGNsYXNzIHN0dWIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q1JMIGV4dGVuZHMgWDUwOUNSTCB7CisKKyAgICAgICAgcHJpdmF0ZSBYNTAwUHJpbmNpcGFsIHByaW5jaXBhbCA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGNybE51bWJlciA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSBEYXRlIHRoaXNVcGRhdGUgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgRGF0ZSBuZXh0VXBkYXRlID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVGVzdENSTCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q1JMKFg1MDBQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisgICAgICAgICAgICB0aGlzLnByaW5jaXBhbCA9IHByaW5jaXBhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q1JMKERhdGUgdGhpc1VwZGF0ZSwgRGF0ZSBuZXh0VXBkYXRlKSB7CisgICAgICAgICAgICBzZXRVcGRhdGVEYXRlcyh0aGlzVXBkYXRlLCBuZXh0VXBkYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q1JMKEJpZ0ludGVnZXIgY3JsTnVtYmVyKSB7CisgICAgICAgICAgICBzZXRDcmxOdW1iZXIoY3JsTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZURhdGVzKERhdGUgdGhpc1VwZGF0ZSwgRGF0ZSBuZXh0VXBkYXRlKSB7CisgICAgICAgICAgICB0aGlzLnRoaXNVcGRhdGUgPSB0aGlzVXBkYXRlOworICAgICAgICAgICAgdGhpcy5uZXh0VXBkYXRlID0gbmV4dFVwZGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENybE51bWJlcihCaWdJbnRlZ2VyIGNybE51bWJlcikgeworICAgICAgICAgICAgdGhpcy5jcmxOdW1iZXIgPSBjcmxOdW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWDUwMFByaW5jaXBhbCBnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgcmV0dXJuIHByaW5jaXBhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmV2b2tlZChDZXJ0aWZpY2F0ZSBjZXJ0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXROb25Dcml0aWNhbEV4dGVuc2lvbk9JRHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RXh0ZW5zaW9uVmFsdWUoU3RyaW5nIG9pZCkgeworICAgICAgICAgICAgaWYgKCIyLjUuMjkuMjAiLmVxdWFscyhvaWQpICYmIChjcmxOdW1iZXIgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVNOMU9jdGV0U3RyaW5nLmdldEluc3RhbmNlKCkuZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVNOMUludGVnZXIuZ2V0SW5zdGFuY2UoKS5lbmNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNybE51bWJlci50b0J5dGVBcnJheSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5KSB0aHJvd3MgQ1JMRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgU2lnbmF0dXJlRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5LCBTdHJpbmcgc2lnUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgdGhyb3dzIENSTEV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0SXNzdWVyRE4oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEYXRlIGdldFRoaXNVcGRhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpc1VwZGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEYXRlIGdldE5leHRVcGRhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dFVwZGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYNTA5Q1JMRW50cnkgZ2V0UmV2b2tlZENlcnRpZmljYXRlKEJpZ0ludGVnZXIgc2VyaWFsTnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXQ8WDUwOUNSTEVudHJ5PiBnZXRSZXZva2VkQ2VydGlmaWNhdGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFRCU0NlcnRMaXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ25hdHVyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaWdBbGdOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpZ0FsZ09JRCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRTaWdBbGdQYXJhbXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q1JMU2VsZWN0b3JUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNSTFNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjZkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNSTFNlbGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkxTZWxlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKKworQFRlc3RUYXJnZXRDbGFzcyhYNTA5Q1JMU2VsZWN0b3IuY2xhc3MpCitwdWJsaWMgY2xhc3MgWDUwOUNSTFNlbGVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTFNlbGVjdG9yI2FkZElzc3VlcihqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRJc3N1ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7WDUwMFByaW5jaXBhbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hZGRJc3N1ZXJMamF2YXhfc2VjdXJpdHlfYXV0aF94NTAwX1g1MDBQcmluY2lwYWwwMSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ2NQorICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igb2JqID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqLmFkZElzc3VlcigoWDUwMFByaW5jaXBhbCkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMU2VsZWN0b3IjYWRkSXNzdWVyTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElPRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZElzc3Vlck5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hZGRJc3N1ZXJOYW1lTGphdmFfbGFuZ19TdHJpbmcwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvL1JlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDY1CisgICAgICAgIFg1MDlDUkxTZWxlY3RvciBvYmogPSBuZXcgWDUwOUNSTFNlbGVjdG9yKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmouYWRkSXNzdWVyTmFtZSgiMjM0Iik7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0xMDc2CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgWDUwOUNSTFNlbGVjdG9yKCkuYWRkSXNzdWVyTmFtZSgidz15Iik7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMU2VsZWN0b3IjYWRkSXNzdWVyTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSXNzdWVyTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZElzc3Vlck5hbWVMamF2YV9sYW5nX1N0cmluZzAyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03MzYKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworCisgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiBmb3IgbnVsbAorICAgICAgICBzZWxlY3Rvci5hZGRJc3N1ZXJOYW1lKChTdHJpbmcpIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMU2VsZWN0b3IjYWRkSXNzdWVyTmFtZShieXRlW10pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSXNzdWVyTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkSXNzdWVyTmFtZSRCXzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ2NQorICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igb2JqID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqLmFkZElzc3Vlck5hbWUobmV3IGJ5dGVbXSB7IChieXRlKSAyLCAoYnl0ZSkgMywgKGJ5dGUpIDQgfSk7CisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMU2VsZWN0b3IjYWRkSXNzdWVyTmFtZShieXRlW10pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkSXNzdWVyTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkSXNzdWVyTmFtZSRCXzQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy9SZWdyZXNzaW9uIGZvciBIQVJNT05ZLTQ2NQorICAgICAgICBYNTA5Q1JMU2VsZWN0b3Igb2JqID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqLmFkZElzc3Vlck5hbWUoKGJ5dGVbXSkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHNldElzc3Vlck5hbWVzKENvbGxlY3Rpb24gPD8+IG5hbWVzKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJc3N1ZXJOYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJc3N1ZXJOYW1lc0xqYXZhX3V0aWxfQ29sbGVjdGlvbjAxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03MzcKKyAgICAgICAgWDUwOUNSTFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDUkxTZWxlY3RvcigpOworICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXJOYW1lcyhuZXcgVHJlZVNldDxDb21wYXJhYmxlPigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYwMDk1NDU1MDUzMjEwOTI0OThMOworCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8Q29tcGFyYWJsZT4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q1JMVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDUkxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyNGNiZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q1JMVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBBbGV4YW5kZXIgWS4gS2xleW1lbm92CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkxFbnRyeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuVGVzdFV0aWxzOworLyoqCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoWDUwOUNSTC5jbGFzcykKK3B1YmxpYyBjbGFzcyBYNTA5Q1JMVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgWDUwOUNSTCB0YnRfY3JsOworCisgICAgLyoqCisgICAgICogVGhlIHN0dWIgY2xhc3MgdXNlZCBmb3IgdGVzdGluZyBvZiBub24gYWJzdHJhY3QgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFRCVENSTCBleHRlbmRzIFg1MDlDUkwgeworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jldm9rZWQoQ2VydGlmaWNhdGUgY2VydCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q3JpdGljYWxFeHRlbnNpb25PSURzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEV4dGVuc2lvblZhbHVlKFN0cmluZyBvaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzVW5zdXBwb3J0ZWRDcml0aWNhbEV4dGVuc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXkpCisgICAgICAgICAgICAgICAgIHRocm93cyBDUkxFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5LCBTdHJpbmcgc2lnUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgIHRocm93cyBDUkxFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRJc3N1ZXJETigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERhdGUgZ2V0VGhpc1VwZGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERhdGUgZ2V0TmV4dFVwZGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFg1MDlDUkxFbnRyeSBnZXRSZXZva2VkQ2VydGlmaWNhdGUoQmlnSW50ZWdlciBzZXJpYWxOdW1iZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxYNTA5Q1JMRW50cnk+IGdldFJldm9rZWRDZXJ0aWZpY2F0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0VEJTQ2VydExpc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0U2lnbmF0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpZ0FsZ05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lnQWxnT0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgWDUwOUNSTFRlc3QoKSB7CisgICAgICAgIHRidF9jcmwgPSBuZXcgVEJUQ1JMKCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsxLCAyLCAzfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRUeXBlKCkgbWV0aG9kIHRlc3RpbmcuIFRlc3RzIHRoYXQgZ2V0VHlwZSgpIG1ldGhvZCByZXR1cm5zCisgICAgICogdGhlIHZhbHVlICJYLjUwOSIKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIFg1MDlDUkwgc2hvdWxkIGJlIFguNTA5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJ0X2NybC5nZXRUeXBlKCksICJYLjUwOSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVxdWFscyhPYmplY3Qgb3RoZXIpIG1ldGhvZCB0ZXN0aW5nLiBUZXN0cyB0aGUgY29ycmVjdG5lc3Mgb2YgZXF1YWwKKyAgICAgKiBvcGVyYXRpb246IGl0IHNob3VsZCBiZSByZWZsZXhpdmUsIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgY29uc2lzdGVudAorICAgICAqIGFuZCBzaG91bGQgYmUgZmFsc2Ugb24gbnVsbCBvYmplY3QuCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgeworICAgICAgICBUQlRDUkwgdGJ0X2NybF8xID0gbmV3IFRCVENSTCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7MSwgMiwgM307CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgVEJUQ1JMIHRidF9jcmxfMiA9IG5ldyBUQlRDUkwoKSB7CisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10gezEsIDIsIDN9OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIFRCVENSTCB0YnRfY3JsXzMgPSBuZXcgVEJUQ1JMKCkgeworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHszLCAyLCAxfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBjaGVja2luZyBmb3IgcmVmbGV4aXZlIGxhdzoKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIHNob3VsZCBiZSByZWZsZXhpdmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YnRfY3JsLmVxdWFscyh0YnRfY3JsKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgQ1JMcyB3aXRoIGVxdWFsIGVuY29kZWQgZm9ybSBzaG91bGQgYmUgZXF1YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRidF9jcmwsIHRidF9jcmxfMSk7CisgICAgICAgIC8vIGNoZWNraW5nIGZvciBzeW1tZXRyaWMgbGF3OgorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gc2hvdWxkIGJlIHN5bW1ldHJpYy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRidF9jcmxfMS5lcXVhbHModGJ0X2NybCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIENSTHMgd2l0aCBlcXVhbCBlbmNvZGVkIGZvcm0gc2hvdWxkIGJlIGVxdWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YnRfY3JsXzEsIHRidF9jcmxfMik7CisgICAgICAgIC8vIGNoZWNraW5nIGZvciB0cmFuc2l0aXZlIGxhdzoKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIHNob3VsZCBiZSB0cmFuc2l0aXZlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJ0X2NybC5lcXVhbHModGJ0X2NybF8yKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNob3VsZCBub3QgYmUgZXF1YWwgdG8gbnVsbCBvYmplY3QuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YnRfY3JsLmVxdWFscyhudWxsKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBDUkxzIHdpdGggZGlmZmVyaW5nIGVuY29kZWQgZm9ybSBzaG91bGQgbm90IGJlIGVxdWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YnRfY3JsLmVxdWFscyh0YnRfY3JsXzMpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBDUkwgc2hvdWxkIG5vdCBiZSBlcXVhbHMgdG8gdGhlIG9iamVjdCB3aGljaCBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICArICJhbiBpbnN0YW5jZSBvZiBYNTA5Q1JMIiwgdGJ0X2NybC5lcXVhbHMobmV3IE9iamVjdCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzaENvZGUoKSBtZXRob2QgdGVzdGluZy4gVGVzdHMgdGhhdCBmb3IgZXF1YWwgb2JqZWN0cyBoYXNoIGNvZGVzCisgICAgICogYXJlIGVxdWFsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKKyAgICAgICAgVEJUQ1JMIHRidF9jcmxfMSA9IG5ldyBUQlRDUkwoKSB7CisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10gezEsIDIsIDN9OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBhc3NlcnRUcnVlKCJFcXVhbCBvYmplY3RzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRidF9jcmwuaGFzaENvZGUoKSA9PSB0YnRfY3JsXzEuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMI2dldElzc3Vlclg1MDBQcmluY2lwYWwoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldElzc3Vlclg1MDBQcmluY2lwYWwoKSB7CisgICAgICAgIC8vIHJldHVybiB2YWxpZCBlbmNvZGluZworICAgICAgICBUQlRDUkwgY3JsID0gbmV3IFRCVENSTCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFV0aWxzLmdldFg1MDlDUkxfdjEoKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBYNTAwUHJpbmNpcGFsKCJDTj1aIiksIGNybC5nZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldFJldm9rZWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIG1ldGhvZCB0ZXN0aW5nLgorICAgICAqIENoZWNrIGlmIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqIG9uIG51bGwgaW5wdXQgZGF0YS4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJldm9rZWRDZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmV2b2tlZENlcnRpZmljYXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGJ0X2NybC5nZXRSZXZva2VkQ2VydGlmaWNhdGUoKFg1MDlDZXJ0aWZpY2F0ZSkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgaW5wdXQgZGF0YS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShYNTA5Q1JMVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRTZWxlY3RvclRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q2VydFNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZWEzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI0NzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CisKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuVGVzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlRlc3RLZXlQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFCb29sZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFJbnRlZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPY3RldFN0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xT2lkOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlUG9saWNpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5OYW1lQ29uc3RyYWludHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuT1JBZGRyZXNzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lk90aGVyTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qb2xpY3lJbmZvcm1hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qcml2YXRlS2V5VXNhZ2VQZXJpb2Q7CisKKy8qKgorICogWDUwOUNlcnRTZWxlY3RvclRlc3QKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhYNTA5Q2VydFNlbGVjdG9yLmNsYXNzKQorcHVibGljIGNsYXNzIFg1MDlDZXJ0U2VsZWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2FkZFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUoaW50LCBieXRlW10pCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkUGF0aFRvTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lTGludExieXRlX2FycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0yNDg3CisgICAgICAgIGludFtdIHR5cGVzID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKS5hZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lKHR5cGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGVbXSkgbnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gZm9yIHR5cGU6ICIgKyBpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNhZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lKGludCwgU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElPRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVMaW50TGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNzI3CisgICAgICAgIGludFtdIHR5cGVzID0geyAwLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKS5hZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lKHR5cGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgIjB4REZSRiIpOworICAgICAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjYWRkUGF0aFRvTmFtZShpbnQsIGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRQYXRoVG9OYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZFBhdGhUb05hbWVMaW50TGJ5dGVfYXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTI0ODcKKyAgICAgICAgaW50W10gdHlwZXMgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuZXcgWDUwOUNlcnRTZWxlY3RvcigpLmFkZFBhdGhUb05hbWUodHlwZXNbaV0sIChieXRlW10pIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIk5vIGV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIGZvciB0eXBlOiAiICsgaSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjYWRkUGF0aFRvTmFtZShpbnQsIFN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhZGRQYXRoVG9OYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9hZGRQYXRoVG9OYW1lTGludExqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTcyNAorICAgICAgICBmb3IgKGludCB0eXBlID0gMDsgdHlwZSA8PSA4OyB0eXBlKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKS5hZGRQYXRoVG9OYW1lKHR5cGUsIChTdHJpbmcpIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGV4cGVjdGVkISIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjWDUwOUNlcnRTZWxlY3RvcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlg1MDlDZXJ0U2VsZWN0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X1g1MDlDZXJ0U2VsZWN0b3IoKSB7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHNlbGVjdG9yLmdldEJhc2ljQ29uc3RyYWludHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2VsZWN0b3IuZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2Nsb25lKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yMSA9IChYNTA5Q2VydFNlbGVjdG9yKSBzZWxlY3Rvci5jbG9uZSgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygpLCBzZWxlY3RvcjEKKyAgICAgICAgICAgICAgICAuZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyKCksIHNlbGVjdG9yMQorICAgICAgICAgICAgICAgIC5nZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0QmFzaWNDb25zdHJhaW50cygpLCBzZWxlY3RvcjEKKyAgICAgICAgICAgICAgICAuZ2V0QmFzaWNDb25zdHJhaW50cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldENlcnRpZmljYXRlKCksIHNlbGVjdG9yMS5nZXRDZXJ0aWZpY2F0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldENlcnRpZmljYXRlVmFsaWQoKSwgc2VsZWN0b3IxCisgICAgICAgICAgICAgICAgLmdldENlcnRpZmljYXRlVmFsaWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRFeHRlbmRlZEtleVVzYWdlKCksIHNlbGVjdG9yMQorICAgICAgICAgICAgICAgIC5nZXRFeHRlbmRlZEtleVVzYWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0SXNzdWVyKCksIHNlbGVjdG9yMS5nZXRJc3N1ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRJc3N1ZXJBc0J5dGVzKCksIHNlbGVjdG9yMS5nZXRJc3N1ZXJBc0J5dGVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0SXNzdWVyQXNTdHJpbmcoKSwgc2VsZWN0b3IxCisgICAgICAgICAgICAgICAgLmdldElzc3VlckFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0S2V5VXNhZ2UoKSwgc2VsZWN0b3IxLmdldEtleVVzYWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0TmFtZUNvbnN0cmFpbnRzKCksIHNlbGVjdG9yMQorICAgICAgICAgICAgICAgIC5nZXROYW1lQ29uc3RyYWludHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRQYXRoVG9OYW1lcygpLCBzZWxlY3RvcjEuZ2V0UGF0aFRvTmFtZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRQb2xpY3koKSwgc2VsZWN0b3IxLmdldFBvbGljeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldFByaXZhdGVLZXlWYWxpZCgpLCBzZWxlY3RvcjEKKyAgICAgICAgICAgICAgICAuZ2V0UHJpdmF0ZUtleVZhbGlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U2VyaWFsTnVtYmVyKCksIHNlbGVjdG9yMS5nZXRTZXJpYWxOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0KCksIHNlbGVjdG9yMS5nZXRTdWJqZWN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSwgc2VsZWN0b3IxCisgICAgICAgICAgICAgICAgLmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdEFzQnl0ZXMoKSwgc2VsZWN0b3IxCisgICAgICAgICAgICAgICAgLmdldFN1YmplY3RBc0J5dGVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdEFzU3RyaW5nKCksIHNlbGVjdG9yMQorICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0QXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpLCBzZWxlY3RvcjEKKyAgICAgICAgICAgICAgICAuZ2V0U3ViamVjdEtleUlkZW50aWZpZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0UHVibGljS2V5KCksIHNlbGVjdG9yMQorICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0UHVibGljS2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCksIHNlbGVjdG9yMQorICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0UHVibGljS2V5QWxnSUQoKSk7CisKKyAgICAgICAgc2VsZWN0b3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3IuY2xvbmUoKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEF1dGhvcml0eUtleUlkZW50aWZpZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEF1dGhvcml0eUtleUlkZW50aWZpZXIoKSB7CisgICAgICAgIGJ5dGVbXSBha2lkMSA9IG5ldyBieXRlW10geyA0LCA1LCAxLCAyLCAzLCA0LCA1IH07IC8vIHJhbmRvbSB2YWx1ZQorICAgICAgICBieXRlW10gYWtpZDIgPSBuZXcgYnl0ZVtdIHsgNCwgNSwgNSwgNCwgMywgMiwgMSB9OyAvLyByYW5kb20gdmFsdWUKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcihha2lkMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCisgICAgICAgICAgICAgICAgLmVxdWFscyhha2lkMSwgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCisgICAgICAgICAgICAgICAgLmVxdWFscyhha2lkMSwgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQga2V5SUQgc2hvdWxkIGRpZmZlciIsIEFycmF5cy5lcXVhbHMoYWtpZDIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldEJhc2ljQ29uc3RyYWludHMoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCYXNpY0NvbnN0cmFpbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCYXNpY0NvbnN0cmFpbnRzKCkgeworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKyAgICAgICAgaW50W10gdmFsaWRWYWx1ZXMgPSB7IDIsIDEsIDAsIDEsIDIsIDMsIDEwLCAyMCB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRCYXNpY0NvbnN0cmFpbnRzKHZhbGlkVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWxpZFZhbHVlc1tpXSwgc2VsZWN0b3IuZ2V0QmFzaWNDb25zdHJhaW50cygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRDZXJ0aWZpY2F0ZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENlcnRpZmljYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDZXJ0aWZpY2F0ZSgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQxID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGVzdFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCkpKTsKKworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydDIgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdAorICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShUZXN0VXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRYNTA5Q2VydGlmaWNhdGVfdjEoKSkpOworCisgICAgICAgIHNlbGVjdG9yLnNldENlcnRpZmljYXRlKGNlcnQxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNlcnQxLCBzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZSgpKTsKKworICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShjZXJ0Mik7CisgICAgICAgIGFzc2VydEVxdWFscyhjZXJ0Miwgc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGUoKSk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGUobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldENlcnRpZmljYXRlVmFsaWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDZXJ0aWZpY2F0ZVZhbGlkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDZXJ0aWZpY2F0ZVZhbGlkKCkgeworICAgICAgICBEYXRlIGRhdGUxID0gbmV3IERhdGUoMTAwKTsKKyAgICAgICAgRGF0ZSBkYXRlMiA9IG5ldyBEYXRlKDIwMCk7CisgICAgICAgIERhdGUgZGF0ZTMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGVWYWxpZChkYXRlMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBkYXRlMQorICAgICAgICAgICAgICAgIC5lcXVhbHMoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKSk7CisgICAgICAgIHNlbGVjdG9yLmdldENlcnRpZmljYXRlVmFsaWQoKS5zZXRUaW1lKDIwMCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBkYXRlMQorICAgICAgICAgICAgICAgIC5lcXVhbHMoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgZGlmZmVyIiwgZGF0ZTIuZXF1YWxzKHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLmdldENlcnRpZmljYXRlVmFsaWQoKSkpOworICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZVZhbGlkKGRhdGUzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGRhdGUgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsIGRhdGUzCisgICAgICAgICAgICAgICAgLmVxdWFscyhzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZVZhbGlkKCkpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGVWYWxpZChudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZVZhbGlkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRFeHRlbmRlZEtleVVzYWdlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RXh0ZW5kZWRLZXlVc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpIHsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IGt1ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICIxLjMuNi4xLjUuNS43LjMuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjIiLCAiMS4zLjYuMS41LjUuNy4zLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy40IiwgIjEuMy42LjEuNS41LjcuMy44IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOSIsICIxLjMuNi4xLjUuNS43LjMuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjYiLCAiMS4zLjYuMS41LjUuNy4zLjciIH0pKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAuZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldEV4dGVuZGVkS2V5VXNhZ2Uoa3UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiVGhlIHJldHVybmVkIGV4dGVuZGVkS2V5VXNhZ2Ugc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAga3UuZXF1YWxzKHNlbGVjdG9yLmdldEV4dGVuZGVkS2V5VXNhZ2UoKSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3IuZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpLmFkZCgiS1JJQkxFR1JBQkxJIik7CisgICAgICAgICAgICBmYWlsKCJUaGUgcmV0dXJuZWQgU2V0IHNob3VsZCBiZSBpbW11dGFibGUuIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0SXNzdWVyKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SXNzdWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJc3N1ZXIoKSB7CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMSA9IG5ldyBYNTAwUHJpbmNpcGFsKCJPPUZpcnN0IE9yZy4iKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MyID0gbmV3IFg1MDBQcmluY2lwYWwoIk89U2Vjb25kIE9yZy4iKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IuZ2V0SXNzdWVyKCkpOworICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoaXNzMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIGlzc3VlciBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgaXNzMSwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5nZXRJc3N1ZXIoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBkaWZmZXIiLCBpc3MyLmVxdWFscyhzZWxlY3RvcgorICAgICAgICAgICAgICAgIC5nZXRJc3N1ZXIoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRJc3N1ZXJBc0J5dGVzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SXNzdWVyQXNCeXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SXNzdWVyQXNCeXRlcygpIHsKKyAgICAgICAgYnl0ZVtdIG5hbWUxID0gbmV3IGJ5dGVbXQorICAgICAgICAvLyBtYW51YWxseSBvYnRhaW5lZCBERVIgZW5jb2Rpbmcgb2YgIk89Rmlyc3QgT3JnLiIgaXNzdWVyIG5hbWU7CisgICAgICAgIHsgNDgsIDIxLCA0OSwgMTksIDQ4LCAxNywgNiwgMywgODUsIDQsIDEwLCAxOSwgMTAsIDcwLCAxMDUsIDExNCwgMTE1LAorICAgICAgICAgICAgICAgIDExNiwgMzIsIDc5LCAxMTQsIDEwMywgNDYgfTsKKworICAgICAgICBieXRlW10gbmFtZTIgPSBuZXcgYnl0ZVtdCisgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1TZWNvbmQgT3JnLiIgaXNzdWVyIG5hbWU7CisgICAgICAgIHsgNDgsIDIyLCA0OSwgMjAsIDQ4LCAxOCwgNiwgMywgODUsIDQsIDEwLCAxOSwgMTEsIDgzLCAxMDEsIDk5LCAxMTEsCisgICAgICAgICAgICAgICAgMTEwLCAxMDAsIDMyLCA3OSwgMTE0LCAxMDMsIDQ2IH07CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMSA9IG5ldyBYNTAwUHJpbmNpcGFsKG5hbWUxKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MyID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTIpOworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgLmdldElzc3VlckFzQnl0ZXMoKSk7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoaXNzMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKG5hbWUxLCBzZWxlY3Rvci5nZXRJc3N1ZXJBc0J5dGVzKCkpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBkaWZmZXIiLCBuYW1lMgorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldElzc3VlckFzQnl0ZXMoKSkpOworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKGlzczIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGlzc3VlciBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhuYW1lMiwgc2VsZWN0b3IuZ2V0SXNzdWVyQXNCeXRlcygpKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRJc3N1ZXJBc1N0cmluZygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldElzc3VlckFzU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJc3N1ZXJBc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUxID0gIk89Rmlyc3QgT3JnLiI7CisgICAgICAgIFN0cmluZyBuYW1lMiA9ICJPPVNlY29uZCBPcmcuIjsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MxID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTEpOworICAgICAgICBYNTAwUHJpbmNpcGFsIGlzczIgPSBuZXcgWDUwMFByaW5jaXBhbChuYW1lMik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yLmdldElzc3VlckFzU3RyaW5nKCkpOworICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoaXNzMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIGlzc3VlciBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgbmFtZTEsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0SXNzdWVyQXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBkaWZmZXIiLCBuYW1lMi5lcXVhbHMoc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAuZ2V0SXNzdWVyQXNTdHJpbmcoKSkpOworICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoaXNzMik7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIGlzc3VlciBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgbmFtZTIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0SXNzdWVyQXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldEtleVVzYWdlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0S2V5VXNhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEtleVVzYWdlKCkgeworICAgICAgICBib29sZWFuW10ga3UgPSBuZXcgYm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSwgdHJ1ZSB9OworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3Rvci5nZXRLZXlVc2FnZSgpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0S2V5VXNhZ2Uoa3UpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCisgICAgICAgICAgICAgICAgLmVxdWFscyhrdSwgc2VsZWN0b3IuZ2V0S2V5VXNhZ2UoKSkpOworICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gc2VsZWN0b3IuZ2V0S2V5VXNhZ2UoKTsKKyAgICAgICAgcmVzdWx0WzBdID0gIXJlc3VsdFswXTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGtleVVzYWdlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBBcnJheXMKKyAgICAgICAgICAgICAgICAuZXF1YWxzKGt1LCBzZWxlY3Rvci5nZXRLZXlVc2FnZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldE1hdGNoQWxsU3ViamVjdEFsdE5hbWVzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1hdGNoQWxsU3ViamVjdEFsdE5hbWVzKCkgeworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIG1hdGNoQWxsTmFtZXMgaW5pdGlhbGx5IHNob3VsZCBiZSB0cnVlIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAuZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoKSk7CisgICAgICAgIHNlbGVjdG9yLnNldE1hdGNoQWxsU3ViamVjdEFsdE5hbWVzKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSB2YWx1ZSBzaG91bGQgYmUgZmFsc2UiLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgIC5nZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0TmFtZUNvbnN0cmFpbnRzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZUNvbnN0cmFpbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXROYW1lQ29uc3RyYWludHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBHZW5lcmFsTmFtZVtdIG5hbWVfY29uc3RyYWludHMgPSBuZXcgR2VuZXJhbE5hbWVbXSB7CisgICAgICAgICAgICAgICAgbmV3IEdlbmVyYWxOYW1lKDEsICI4MjIuTmFtZSIpLAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmFsTmFtZSgxLCAicmZjQDgyMi5OYW1lIiksCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyYWxOYW1lKDIsICJOYW1lLm9yZyIpLAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmFsTmFtZSgyLCAiZE5TLk5hbWUub3JnIiksCisKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJhbE5hbWUoNiwgImh0dHA6Ly9SZXNvdXJjZS5JZCIpLAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmFsTmFtZSg2LCAiaHR0cDovL3VuaWZvcm0uUmVzb3VyY2UuSWQiKSwKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJhbE5hbWUoNywgIjEuMS4xLjEiKSwKKworICAgICAgICAgICAgICAgIG5ldyBHZW5lcmFsTmFtZShuZXcgYnl0ZVtdIHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsIDEgfSksIH07CisKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lX2NvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBHZW5lcmFsU3VidHJlZSBzdWJ0cmVlID0gbmV3IEdlbmVyYWxTdWJ0cmVlKG5hbWVfY29uc3RyYWludHNbaV0pOworICAgICAgICAgICAgR2VuZXJhbFN1YnRyZWVzIHN1YnRyZWVzID0gbmV3IEdlbmVyYWxTdWJ0cmVlcygpOworICAgICAgICAgICAgc3VidHJlZXMuYWRkU3VidHJlZShzdWJ0cmVlKTsKKyAgICAgICAgICAgIE5hbWVDb25zdHJhaW50cyBjb25zdHJhaW50cyA9IG5ldyBOYW1lQ29uc3RyYWludHMoc3VidHJlZXMsCisgICAgICAgICAgICAgICAgICAgIHN1YnRyZWVzKTsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldE5hbWVDb25zdHJhaW50cyhjb25zdHJhaW50cy5nZXRFbmNvZGVkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGNvbnN0cmFpbnRzLmdldEVuY29kZWQoKSwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgLmdldE5hbWVDb25zdHJhaW50cygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0UGF0aFRvTmFtZXMoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXRoVG9OYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGF0aFRvTmFtZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4wID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPdGhlck5hbWUoIjEuMi4zLjQuNSIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10geyAxLCAyLCAwLCAxIH0pKTsKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjEgPSBuZXcgR2VuZXJhbE5hbWUoMSwgInJmY0A4MjIuTmFtZSIpOworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMiA9IG5ldyBHZW5lcmFsTmFtZSgyLCAiZE5TTmFtZSIpOworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMyA9IG5ldyBHZW5lcmFsTmFtZShuZXcgT1JBZGRyZXNzKCkpOworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuNCA9IG5ldyBHZW5lcmFsTmFtZShuZXcgTmFtZSgiTz1Pcmdhbml6YXRpb24iKSk7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW42ID0gbmV3IEdlbmVyYWxOYW1lKDYsICJodHRwOi8vdW5pZm9ybS5SZXNvdXJjZS5JZCIpOworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuNyA9IG5ldyBHZW5lcmFsTmFtZSg3LCAiMS4xLjEuMSIpOworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuOCA9IG5ldyBHZW5lcmFsTmFtZSg4LCAiMS4yLjMuNDQ0NC41NTU1NSIpOworCisgICAgICAgICAgICBHZW5lcmFsTmFtZXMgc2FuczEgPSBuZXcgR2VuZXJhbE5hbWVzKCk7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjApOworICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4xKTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMik7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjMpOworICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW40KTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNik7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjcpOworICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW44KTsKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zMiA9IG5ldyBHZW5lcmFsTmFtZXMoKTsKKyAgICAgICAgICAgIHNhbnMyLmFkZE5hbWUoc2FuMCk7CisKKyAgICAgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KHNhbnMxKTsKKyAgICAgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KHNhbnMyKTsKKyAgICAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXModHJ1ZSk7CisKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldFBhdGhUb05hbWVzKG51bGwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKKyAgICAgICAgICAgICAgICAgICAgKyAic3ViamVjdEFsdGVybmF0aXZlTmFtZXMgY3JpdGVyaWEuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgLm1hdGNoKGNlcnQxKQorICAgICAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworCisgICAgICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IHNhbnMgPSBzYW5zMS5nZXRQYWlyc0xpc3QoKTsKKworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0UGF0aFRvTmFtZXMoc2Fucyk7CisKKyAgICAgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gY29sID0gc2VsZWN0b3IuZ2V0UGF0aFRvTmFtZXMoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yPExpc3Q8Pz4+IGkgPSBjb2wuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIExpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGEgTGlzdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldFBvbGljeSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBvbGljeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UG9saWN5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gcG9saWNpZXMxID0gbmV3IFN0cmluZ1tdIHsgIjEuMy42LjEuNS41LjcuMy4xIiwKKyAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjIiLCAiMS4zLjYuMS41LjUuNy4zLjMiLCAiMS4zLjYuMS41LjUuNy4zLjQiLAorICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOCIsICIxLjMuNi4xLjUuNS43LjMuOSIsICIxLjMuNi4xLjUuNS43LjMuNSIsCisgICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy42IiwgIjEuMy42LjEuNS41LjcuMy43IiB9OworCisgICAgICAgIFN0cmluZ1tdIHBvbGljaWVzMiA9IG5ldyBTdHJpbmdbXSB7ICIxLjMuNi43LjMuMSIgfTsKKworICAgICAgICBIYXNoU2V0PFN0cmluZz4gcDEgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QocG9saWNpZXMxKSk7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBwMiA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChwb2xpY2llczIpKTsKKworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICBzZWxlY3Rvci5zZXRQb2xpY3kobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0UG9saWN5KCkpOworCisgICAgICAgIHNlbGVjdG9yLnNldFBvbGljeShwMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIGRhdGUgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsIHAxLCBzZWxlY3Rvci5nZXRQb2xpY3koKSk7CisgICAgICAgIAorICAgICAgICBzZWxlY3Rvci5zZXRQb2xpY3kocDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBwMiwgc2VsZWN0b3IuZ2V0UG9saWN5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRQcml2YXRlS2V5VmFsaWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcml2YXRlS2V5VmFsaWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaXZhdGVLZXlWYWxpZCgpIHsKKyAgICAgICAgRGF0ZSBkYXRlMSA9IG5ldyBEYXRlKDEwMCk7CisgICAgICAgIERhdGUgZGF0ZTIgPSBuZXcgRGF0ZSgyMDApOworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3Rvci5nZXRQcml2YXRlS2V5VmFsaWQoKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFByaXZhdGVLZXlWYWxpZChkYXRlMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBkYXRlMQorICAgICAgICAgICAgICAgIC5lcXVhbHMoc2VsZWN0b3IuZ2V0UHJpdmF0ZUtleVZhbGlkKCkpKTsKKyAgICAgICAgc2VsZWN0b3IuZ2V0UHJpdmF0ZUtleVZhbGlkKCkuc2V0VGltZSgyMDApOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgZGF0ZTEKKyAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldFByaXZhdGVLZXlWYWxpZCgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgZGlmZmVyIiwgZGF0ZTIuZXF1YWxzKHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLmdldFByaXZhdGVLZXlWYWxpZCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldFNlcmlhbE51bWJlcigpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlcmlhbE51bWJlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VyaWFsTnVtYmVyKCkgeworICAgICAgICBCaWdJbnRlZ2VyIHNlcjEgPSBuZXcgQmlnSW50ZWdlcigiMTAwMDAiKTsKKyAgICAgICAgQmlnSW50ZWdlciBzZXIyID0gbmV3IEJpZ0ludGVnZXIoIjEwMDAxIik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yLmdldFNlcmlhbE51bWJlcigpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0U2VyaWFsTnVtYmVyKHNlcjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCBzZXJpYWwgbnVtYmVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgIHNlcjEsIHNlbGVjdG9yLmdldFNlcmlhbE51bWJlcigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBzZXJpYWwgbnVtYmVyIHNob3VsZCBkaWZmZXIiLCBzZXIyCisgICAgICAgICAgICAgICAgLmVxdWFscyhzZWxlY3Rvci5nZXRTZXJpYWxOdW1iZXIoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRTdWJqZWN0KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3ViamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3ViamVjdCgpIHsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBzdWIxID0gbmV3IFg1MDBQcmluY2lwYWwoIk89Rmlyc3QgT3JnLiIpOworICAgICAgICBYNTAwUHJpbmNpcGFsIHN1YjIgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1TZWNvbmQgT3JnLiIpOworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3Rvci5nZXRTdWJqZWN0KCkpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KHN1YjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCBzdWJqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBzdWIxLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldFN1YmplY3QoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgc3ViamVjdCBzaG91bGQgZGlmZmVyIiwgc3ViMi5lcXVhbHMoc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAuZ2V0U3ViamVjdCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMSA9IG5ldyBHZW5lcmFsTmFtZSgxLCAicmZjQDgyMi5OYW1lIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4yID0gbmV3IEdlbmVyYWxOYW1lKDIsICJkTlNOYW1lIik7CisKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zID0gbmV3IEdlbmVyYWxOYW1lcygpOworICAgICAgICAgICAgc2Fucy5hZGROYW1lKHNhbjEpOworICAgICAgICAgICAgc2Fucy5hZGROYW1lKHNhbjIpOworCisgICAgICAgICAgICBUZXN0Q2VydCBjZXJ0XzEgPSBuZXcgVGVzdENlcnQoc2Fucyk7CisgICAgICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgLmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkpOworCisgICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyhzYW5zLmdldFBhaXJzTGlzdCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0XzEpKTsKKyAgICAgICAgICAgIHNlbGVjdG9yLmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBtb2RpZmljYXRpb24gb2YgaW5pdGlhbGl6YXRpb24gb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBhZmZlY3QgdGhlIG1vZGlmaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICsgIm9mIGludGVybmFsIG9iamVjdC4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0XzEpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRTdWJqZWN0QXNCeXRlcygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN1YmplY3RBc0J5dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTdWJqZWN0QXNCeXRlcygpIHsKKyAgICAgICAgYnl0ZVtdIG5hbWUxID0gbmV3IGJ5dGVbXQorICAgICAgICAvLyBtYW51YWxseSBvYnRhaW5lZCBERVIgZW5jb2Rpbmcgb2YgIk89Rmlyc3QgT3JnLiIgaXNzdWVyIG5hbWU7CisgICAgICAgIHsgNDgsIDIxLCA0OSwgMTksIDQ4LCAxNywgNiwgMywgODUsIDQsIDEwLCAxOSwgMTAsIDcwLCAxMDUsIDExNCwgMTE1LAorICAgICAgICAgICAgICAgIDExNiwgMzIsIDc5LCAxMTQsIDEwMywgNDYgfTsKKyAgICAgICAgYnl0ZVtdIG5hbWUyID0gbmV3IGJ5dGVbXQorICAgICAgICAvLyBtYW51YWxseSBvYnRhaW5lZCBERVIgZW5jb2Rpbmcgb2YgIk89U2Vjb25kIE9yZy4iIGlzc3VlciBuYW1lOworICAgICAgICB7IDQ4LCAyMiwgNDksIDIwLCA0OCwgMTgsIDYsIDMsIDg1LCA0LCAxMCwgMTksIDExLCA4MywgMTAxLCA5OSwgMTExLAorICAgICAgICAgICAgICAgIDExMCwgMTAwLCAzMiwgNzksIDExNCwgMTAzLCA0NiB9OworCisgICAgICAgIFg1MDBQcmluY2lwYWwgc3ViMSA9IG5ldyBYNTAwUHJpbmNpcGFsKG5hbWUxKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBzdWIyID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTIpOworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgLmdldFN1YmplY3RBc0J5dGVzKCkpOworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChzdWIxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMobmFtZTEsIHNlbGVjdG9yLmdldFN1YmplY3RBc0J5dGVzKCkpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBkaWZmZXIiLCBuYW1lMgorICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldFN1YmplY3RBc0J5dGVzKCkpKTsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3Qoc3ViMik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKG5hbWUyLCBzZWxlY3Rvci5nZXRTdWJqZWN0QXNCeXRlcygpKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNnZXRTdWJqZWN0QXNTdHJpbmcoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdWJqZWN0QXNTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN1YmplY3RBc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUxID0gIk89Rmlyc3QgT3JnLiI7CisgICAgICAgIFN0cmluZyBuYW1lMiA9ICJPPVNlY29uZCBPcmcuIjsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBzdWIxID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTEpOworICAgICAgICBYNTAwUHJpbmNpcGFsIHN1YjIgPSBuZXcgWDUwMFByaW5jaXBhbChuYW1lMik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yLmdldFN1YmplY3RBc1N0cmluZygpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChzdWIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcmV0dXJuZWQgc3ViamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICBuYW1lMSwgc2VsZWN0b3IuZ2V0U3ViamVjdEFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIHJldHVybmVkIHN1YmplY3Qgc2hvdWxkIGRpZmZlciIsIG5hbWUyLmVxdWFscyhzZWxlY3RvcgorICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0QXNTdHJpbmcoKSkpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KHN1YjIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCBzdWJqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgIG5hbWUyLCBzZWxlY3Rvci5nZXRTdWJqZWN0QXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldFN1YmplY3RLZXlJZGVudGlmaWVyKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3ViamVjdEtleUlkZW50aWZpZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN1YmplY3RLZXlJZGVudGlmaWVyKCkgeworICAgICAgICBieXRlW10gc2tpZDEgPSBuZXcgYnl0ZVtdIHsgMSwgMiwgMywgNCwgNSB9OyAvLyByYW5kb20gdmFsdWUKKyAgICAgICAgYnl0ZVtdIHNraWQyID0gbmV3IGJ5dGVbXSB7IDQsIDUsIDUsIDQsIDMsIDIsIDEgfTsgLy8gcmFuZG9tIHZhbHVlCisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCkpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0S2V5SWRlbnRpZmllcihza2lkMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCisgICAgICAgICAgICAgICAgLmVxdWFscyhza2lkMSwgc2VsZWN0b3IuZ2V0U3ViamVjdEtleUlkZW50aWZpZXIoKSkpOworICAgICAgICBzZWxlY3Rvci5nZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpWzBdKys7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCisgICAgICAgICAgICAgICAgLmVxdWFscyhza2lkMSwgc2VsZWN0b3IuZ2V0U3ViamVjdEtleUlkZW50aWZpZXIoKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIHJldHVybmVkIGtleUlEIHNob3VsZCBkaWZmZXIiLCBBcnJheXMuZXF1YWxzKHNraWQyLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0U3ViamVjdFB1YmxpY0tleSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN1YmplY3RQdWJsaWNLZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN1YmplY3RQdWJsaWNLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTdWJqZWN0UHVibGljS2V5SW5mbyA6Oj0gU0VRVUVOQ0UgeworICAgICAgICAvLyBhbGdvcml0aG0gQWxnb3JpdGhtSWRlbnRpZmllciwKKyAgICAgICAgLy8gc3ViamVjdFB1YmxpY0tleSBCSVQgU1RSSU5HIH0KKyAgICAgICAgYnl0ZVtdIGVuYyA9IHsgMHgzMCwgMHgwRSwgLy8gU0VRVUVOQ0UKKyAgICAgICAgICAgICAgICAweDMwLCAweDA3LCAvLyBTRVFVRU5DRQorICAgICAgICAgICAgICAgIDB4MDYsIDB4MDIsIDB4MDMsIDB4MDUsLy8gT0lECisgICAgICAgICAgICAgICAgMHgwMSwgMHgwMSwgMHgwNywgLy8gQU5ZCisgICAgICAgICAgICAgICAgMHgwMywgMHgwMywgMHgwMSwgMHgwMSwgMHgwNiwgLy8gc3ViamVjdFB1YmxpY0tleQorICAgICAgICB9OworCisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXkoZW5jKTsKKyAgICAgICAgUHVibGljS2V5IGtleSA9IHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwLjMuNSIsIGtleS5nZXRBbGdvcml0aG0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWC41MDkiLCBrZXkuZ2V0Rm9ybWF0KCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZW5jLCBrZXkuZ2V0RW5jb2RlZCgpKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoa2V5LnRvU3RyaW5nKCkpOworCisgICAgICAgIGtleSA9IG5ldyBNeVB1YmxpY0tleSgpOworCisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXkoa2V5KTsKKyAgICAgICAgUHVibGljS2V5IGtleUFjdHVhbCA9IHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtleSwga2V5QWN0dWFsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtleS5nZXRBbGdvcml0aG0oKSwga2V5QWN0dWFsLmdldEFsZ29yaXRobSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkgeworCisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICBTdHJpbmdbXSB2YWxpZE9JRHMgPSB7ICIwLjIwIiwgIjEuMjUiLCAiMi4zOSIsICIwLjIuMTAiLCAiMS4zNS4xNSIsCisgICAgICAgICAgICAgICAgIjIuMTcuODkiIH07CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAuZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRPSURzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXlBbGdJRCh2YWxpZE9JRHNbaV0pOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWxpZE9JRHNbaV0sIHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBrYWlkMSA9ICIxLjIuODQwLjExMzU0OS4xLjEuMSI7IC8vIFJTQSBlbmNyeXB0aW9uIChzb3VyY2U6CisgICAgICAgIC8vIGh0dHA6Ly9hc24xLmVsaWJlbC50bS5mcikKKyAgICAgICAgU3RyaW5nIHBrYWlkMiA9ICIxLjIuODQwLjExMzU0OS4xLjEuMiI7IC8vIE1EMiB3aXRoIFJTQSBlbmNyeXB0aW9uCisgICAgICAgIC8vIChzb3VyY2U6CisgICAgICAgIC8vIGh0dHA6Ly9hc24xLmVsaWJlbC50bS5mcikKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKHBrYWlkMSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgb2lkIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBwa2FpZDEKKyAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgb2lkIHNob3VsZCBkaWZmZXIiLCBwa2FpZDIuZXF1YWxzKHNlbGVjdG9yCisgICAgICAgICAgICAgICAgLmdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI21hdGNoKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibWF0Y2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21hdGNoTGphdmFfc2VjdXJpdHlfY2VydF9DZXJ0aWZpY2F0ZSgpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VsZWN0b3IubWF0Y2gobnVsbCkpOworCisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWDUwOSIpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydDEgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdAorICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShUZXN0VXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRYNTA5Q2VydGlmaWNhdGVfdjMoKSkpOworCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0MiA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0CisgICAgICAgICAgICAgICAgLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRlc3RVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLmdldFg1MDlDZXJ0aWZpY2F0ZV92MSgpKSk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGUoY2VydDEpOworICAgICAgICBhc3NlcnRUcnVlKHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGUoY2VydDIpOworICAgICAgICBhc3NlcnRGYWxzZShzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRUcnVlKHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldEF1dGhvcml0eUtleUlkZW50aWZpZXIoYnl0ZVtdKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyTEIkKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgYnl0ZVtdIGFraWQxID0gbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQsIDUgfTsgLy8gcmFuZG9tIHZhbHVlCisgICAgICAgIGJ5dGVbXSBha2lkMiA9IG5ldyBieXRlW10geyA1LCA0LCAzLCAyLCAxIH07IC8vIHJhbmRvbSB2YWx1ZQorICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChha2lkMSk7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KGFraWQyKTsKKworICAgICAgICBzZWxlY3Rvci5zZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBhc3NlcnROdWxsKHNlbGVjdG9yLmdldEF1dGhvcml0eUtleUlkZW50aWZpZXIoKSk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcihha2lkMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldEF1dGhvcml0eUtleUlkZW50aWZpZXIoYWtpZDIpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworCisgICAgICAgIGFraWQyWzBdKys7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldEJhc2ljQ29uc3RyYWludHMoaW50KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCYXNpY0NvbnN0cmFpbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRCYXNpY0NvbnN0cmFpbnRzTGludCgpIHsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisgICAgICAgIGludFtdIGludmFsaWRWYWx1ZXMgPSB7IC0zLCAtNCwgLTUsIDEwMDAwMDAwMDAgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yLnNldEJhc2ljQ29uc3RyYWludHMoLTMpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50W10gdmFsaWRWYWx1ZXMgPSB7IC0yLCAtMSwgMCwgMSwgMiwgMywgMTAsIDIwIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldEJhc2ljQ29uc3RyYWludHModmFsaWRWYWx1ZXNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbGlkVmFsdWVzW2ldLCBzZWxlY3Rvci5nZXRCYXNpY0NvbnN0cmFpbnRzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldENlcnRpZmljYXRlKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2VydGlmaWNhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRDZXJ0aWZpY2F0ZUxqYXZhX3NlY3VyaXR5X2NlcnRfWDUwOUNlcnRpZmljYXRlKCkKKyAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoInNhbWUgY2VydGlmaWNhdGUiKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoIm90aGVyIGNlcnRpZmljYXRlIik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIHNlbGVjdG9yLnNldENlcnRpZmljYXRlKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGVzIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKKyAgICAgICAgICAgICAgICArICJjZXJ0aWZpY2F0ZUVxdWFscyBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShjZXJ0MSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGUoY2VydDIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0Q2VydGlmaWNhdGVWYWxpZChqYXZhLnV0aWwuRGF0ZSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2VydGlmaWNhdGVWYWxpZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2VydGlmaWNhdGVWYWxpZExqYXZhX3V0aWxfRGF0ZSgpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICBEYXRlIGRhdGUxID0gbmV3IERhdGUoMTAwKTsKKyAgICAgICAgRGF0ZSBkYXRlMiA9IG5ldyBEYXRlKDIwMCk7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KGRhdGUxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoZGF0ZTIpOworCisgICAgICAgIHNlbGVjdG9yLnNldENlcnRpZmljYXRlVmFsaWQobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGVWYWxpZChkYXRlMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGVWYWxpZChkYXRlMik7CisgICAgICAgIGRhdGUyLnNldFRpbWUoMzAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0RXh0ZW5kZWRLZXlVc2FnZShTZXQ8U3RyaW5nPikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RXh0ZW5kZWRLZXlVc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuU2V0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEV4dGVuZGVkS2V5VXNhZ2VMamF2YV91dGlsX1NldCgpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICBIYXNoU2V0PFN0cmluZz4ga3UxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICIxLjMuNi4xLjUuNS43LjMuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjIiLCAiMS4zLjYuMS41LjUuNy4zLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy40IiwgIjEuMy42LjEuNS41LjcuMy44IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOSIsICIxLjMuNi4xLjUuNS43LjMuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjYiLCAiMS4zLjYuMS41LjUuNy4zLjciIH0pKTsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IGt1MiA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuMSIsICIxLjMuNi4xLjUuNS43LjMuMiIsICIxLjMuNi4xLjUuNS43LjMuMyIsCisgICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy40IiwgIjEuMy42LjEuNS41LjcuMy44IiwgIjEuMy42LjEuNS41LjcuMy45IiwKKyAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjUiLCAiMS4zLjYuMS41LjUuNy4zLjYiIH0pKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoa3UxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoa3UyKTsKKworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0RXh0ZW5kZWRLZXlVc2FnZShudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggaW4gdGhlIGNhc2Ugb2YgbnVsbCAiCisgICAgICAgICAgICAgICAgKyAiZXh0ZW5kZWRLZXlVc2FnZSBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0RXh0ZW5kZWRLZXlVc2FnZShrdTEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGt1MSwgc2VsZWN0b3IuZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0RXh0ZW5kZWRLZXlVc2FnZShrdTIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGt1Miwgc2VsZWN0b3IuZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0SXNzdWVyKGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SXNzdWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJc3N1ZXJMQiQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICBieXRlW10gbmFtZTEgPSBuZXcgYnl0ZVtdCisgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1GaXJzdCBPcmcuIiBpc3N1ZXIgbmFtZTsKKyAgICAgICAgeyA0OCwgMjEsIDQ5LCAxOSwgNDgsIDE3LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMCwgNzAsIDEwNSwgMTE0LCAxMTUsCisgICAgICAgICAgICAgICAgMTE2LCAzMiwgNzksIDExNCwgMTAzLCA0NiB9OworICAgICAgICBieXRlW10gbmFtZTIgPSBuZXcgYnl0ZVtdCisgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1TZWNvbmQgT3JnLiIgaXNzdWVyIG5hbWU7CisgICAgICAgIHsgNDgsIDIyLCA0OSwgMjAsIDQ4LCAxOCwgNiwgMywgODUsIDQsIDEwLCAxOSwgMTEsIDgzLCAxMDEsIDk5LCAxMTEsCisgICAgICAgICAgICAgICAgMTEwLCAxMDAsIDMyLCA3OSwgMTE0LCAxMDMsIDQ2IH07CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMSA9IG5ldyBYNTAwUHJpbmNpcGFsKG5hbWUxKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MyID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTIpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChpc3MxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoaXNzMik7CisKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcigoYnl0ZVtdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZXMgc2hvdWxkIG1hdGNoICIKKyAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGlzc3VlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKG5hbWUxKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcihuYW1lMik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRJc3N1ZXIoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SXNzdWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SXNzdWVyTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBuYW1lMSA9ICJPPUZpcnN0IE9yZy4iOworICAgICAgICBTdHJpbmcgbmFtZTIgPSAiTz1TZWNvbmQgT3JnLiI7CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMSA9IG5ldyBYNTAwUHJpbmNpcGFsKG5hbWUxKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MyID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTIpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChpc3MxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoaXNzMik7CisKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcigoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZXMgc2hvdWxkIG1hdGNoICIKKyAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGlzc3VlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKG5hbWUxKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcihuYW1lMik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRJc3N1ZXIoamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldElzc3VlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJc3N1ZXJMamF2YXhfc2VjdXJpdHlfYXV0aF94NTAwX1g1MDBQcmluY2lwYWwoKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MxID0gbmV3IFg1MDBQcmluY2lwYWwoIk89Rmlyc3QgT3JnLiIpOworICAgICAgICBYNTAwUHJpbmNpcGFsIGlzczIgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1TZWNvbmQgT3JnLiIpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChpc3MxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoaXNzMik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcigoWDUwMFByaW5jaXBhbCkgbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZXMgc2hvdWxkIG1hdGNoICIKKyAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGlzc3VlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoaXNzMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKGlzczIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRLZXlVc2FnZShib29sZWFuKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRLZXlVc2FnZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0S2V5VXNhZ2VaKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbltdIGt1MSA9IG5ldyBib29sZWFuW10geyB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUgfTsKKyAgICAgICAgLy8gZGVjaXBoZXJPbmx5IGlzIGRpc2FsbG93ZWQKKyAgICAgICAgYm9vbGVhbltdIGt1MiA9IG5ldyBib29sZWFuW10geyB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIGZhbHNlIH07CisgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KGt1MSk7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KGt1Mik7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQzID0gbmV3IFRlc3RDZXJ0KChib29sZWFuW10pIG51bGwpOworCisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIHNlbGVjdG9yLnNldEtleVVzYWdlKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgorICAgICAgICAgICAgICAgICsgImtleVVzYWdlIGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQorICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldEtleVVzYWdlKGt1MSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBrZXlVc2FnZSBleHRlbnNpb24gIgorICAgICAgICAgICAgICAgICsgImltcGxpY2l0bHkgYWxsb3dzIGFsbCBrZXlVc2FnZSB2YWx1ZXMuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goY2VydDMpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0S2V5VXNhZ2Uoa3UyKTsKKyAgICAgICAga3UyWzBdID0gIWt1MlswXTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoYm9vbGVhbikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lc1ooKSB7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQgPSBuZXcgVGVzdENlcnQoKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZWxlY3Rvci5tYXRjaChjZXJ0KSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VsZWN0b3IubWF0Y2gobnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXROYW1lQ29uc3RyYWludHMoYnl0ZVtdCisgICAgICogICAgICAgIGJ5dGVzKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROYW1lQ29uc3RyYWludHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWVDb25zdHJhaW50c0xCJCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEdlbmVyYWxOYW1lW10gbmFtZV9jb25zdHJhaW50cyA9IG5ldyBHZW5lcmFsTmFtZVtdIHsKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJhbE5hbWUoMSwgIjgyMi5OYW1lIiksCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyYWxOYW1lKDEsICJyZmNAODIyLk5hbWUiKSwKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJhbE5hbWUoMiwgIk5hbWUub3JnIiksCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyYWxOYW1lKDIsICJkTlMuTmFtZS5vcmciKSwKKworICAgICAgICAgICAgICAgIG5ldyBHZW5lcmFsTmFtZSg2LCAiaHR0cDovL1Jlc291cmNlLklkIiksCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyYWxOYW1lKDYsICJodHRwOi8vdW5pZm9ybS5SZXNvdXJjZS5JZCIpLAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmFsTmFtZSg3LCAiMS4xLjEuMSIpLAorCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyYWxOYW1lKG5ldyBieXRlW10geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwgMSB9KSwgfTsKKworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVfY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEdlbmVyYWxTdWJ0cmVlIHN1YnRyZWUgPSBuZXcgR2VuZXJhbFN1YnRyZWUobmFtZV9jb25zdHJhaW50c1tpXSk7CisgICAgICAgICAgICBHZW5lcmFsU3VidHJlZXMgc3VidHJlZXMgPSBuZXcgR2VuZXJhbFN1YnRyZWVzKCk7CisgICAgICAgICAgICBzdWJ0cmVlcy5hZGRTdWJ0cmVlKHN1YnRyZWUpOworICAgICAgICAgICAgTmFtZUNvbnN0cmFpbnRzIGNvbnN0cmFpbnRzID0gbmV3IE5hbWVDb25zdHJhaW50cyhzdWJ0cmVlcywKKyAgICAgICAgICAgICAgICAgICAgc3VidHJlZXMpOworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0TmFtZUNvbnN0cmFpbnRzKGNvbnN0cmFpbnRzLmdldEVuY29kZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY29uc3RyYWludHMuZ2V0RW5jb2RlZCgpLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZUNvbnN0cmFpbnRzKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRQYXRoVG9OYW1lcyhDb2xsZWN0aW9uPExpc3Q8Pz4+KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQYXRoVG9OYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQYXRoVG9OYW1lc0xqYXZhX3V0aWxfQ29sbGVjdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjAgPSBuZXcgR2VuZXJhbE5hbWUobmV3IE90aGVyTmFtZSgiMS4yLjMuNC41IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDEsIDIsIDAsIDEgfSkpOworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMSA9IG5ldyBHZW5lcmFsTmFtZSgxLCAicmZjQDgyMi5OYW1lIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4yID0gbmV3IEdlbmVyYWxOYW1lKDIsICJkTlNOYW1lIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4zID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPUkFkZHJlc3MoKSk7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW40ID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBOYW1lKCJPPU9yZ2FuaXphdGlvbiIpKTsKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjYgPSBuZXcgR2VuZXJhbE5hbWUoNiwgImh0dHA6Ly91bmlmb3JtLlJlc291cmNlLklkIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW43ID0gbmV3IEdlbmVyYWxOYW1lKDcsICIxLjEuMS4xIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW44ID0gbmV3IEdlbmVyYWxOYW1lKDgsICIxLjIuMy40NDQ0LjU1NTU1Iik7CisKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zMSA9IG5ldyBHZW5lcmFsTmFtZXMoKTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMCk7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjEpOworICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4yKTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMyk7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjQpOworICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW42KTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNyk7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjgpOworICAgICAgICAgICAgR2VuZXJhbE5hbWVzIHNhbnMyID0gbmV3IEdlbmVyYWxOYW1lcygpOworICAgICAgICAgICAgc2FuczIuYWRkTmFtZShzYW4wKTsKKworICAgICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2FuczEpOworICAgICAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoc2FuczIpOworICAgICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcyh0cnVlKTsKKworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0UGF0aFRvTmFtZXMobnVsbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgorICAgICAgICAgICAgICAgICAgICArICJzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyBjcml0ZXJpYS4iLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgICAgICAubWF0Y2goY2VydDEpCisgICAgICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisKKyAgICAgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gc2FucyA9IHNhbnMxLmdldFBhaXJzTGlzdCgpOworCisgICAgICAgICAgICBzZWxlY3Rvci5zZXRQYXRoVG9OYW1lcyhzYW5zKTsKKworICAgICAgICAgICAgQ29sbGVjdGlvbjxMaXN0PD8+PiBjb2wgPSBzZWxlY3Rvci5nZXRQYXRoVG9OYW1lcygpOworICAgICAgICAgICAgSXRlcmF0b3I8TGlzdDw/Pj4gaSA9IGNvbC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgYSBMaXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0UG9saWN5KFNldDxTdHJpbmc+KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQb2xpY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQb2xpY3lMamF2YV91dGlsX1NldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBvbGljaWVzMSA9IG5ldyBTdHJpbmdbXSB7ICIxLjMuNi4xLjUuNS43LjMuMSIsCisgICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy4yIiwgIjEuMy42LjEuNS41LjcuMy4zIiwgIjEuMy42LjEuNS41LjcuMy40IiwKKyAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjgiLCAiMS4zLjYuMS41LjUuNy4zLjkiLCAiMS4zLjYuMS41LjUuNy4zLjUiLAorICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNiIsICIxLjMuNi4xLjUuNS43LjMuNyIgfTsKKworICAgICAgICBTdHJpbmdbXSBwb2xpY2llczIgPSBuZXcgU3RyaW5nW10geyAiMS4zLjYuNy4zLjEiIH07CisKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IHAxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KHBvbGljaWVzMSkpOworICAgICAgICBIYXNoU2V0PFN0cmluZz4gcDIgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QocG9saWNpZXMyKSk7CisKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQocG9saWNpZXMxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQocG9saWNpZXMyKTsKKworICAgICAgICBzZWxlY3Rvci5zZXRQb2xpY3kobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggaW4gdGhlIGNhc2Ugb2YgbnVsbCAiCisgICAgICAgICAgICAgICAgKyAicHJpdmF0ZUtleVZhbGlkIGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQorICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0UG9saWN5KHAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAKKyAgICAgICAgc2VsZWN0b3Iuc2V0UG9saWN5KHAyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRQcml2YXRlS2V5VmFsaWQoamF2YS51dGlsLkRhdGUpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFByaXZhdGVLZXlWYWxpZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuRGF0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcml2YXRlS2V5VmFsaWRMamF2YV91dGlsX0RhdGUoKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgRGF0ZSBkYXRlMSA9IG5ldyBEYXRlKDEwMDAwMDAwMCk7CisgICAgICAgIERhdGUgZGF0ZTIgPSBuZXcgRGF0ZSgyMDAwMDAwMDApOworICAgICAgICBEYXRlIGRhdGUzID0gbmV3IERhdGUoMzAwMDAwMDAwKTsKKyAgICAgICAgRGF0ZSBkYXRlNCA9IG5ldyBEYXRlKDE1MDAwMDAwMCk7CisgICAgICAgIERhdGUgZGF0ZTUgPSBuZXcgRGF0ZSgyNTAwMDAwMDApOworICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChkYXRlMSwgZGF0ZTIpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChkYXRlMiwgZGF0ZTMpOworCisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIHNlbGVjdG9yLnNldFByaXZhdGVLZXlWYWxpZChudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKKyAgICAgICAgICAgICAgICArICJwcml2YXRlS2V5VmFsaWQgY3JpdGVyaWEuIiwgc2VsZWN0b3IubWF0Y2goY2VydDEpCisgICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0UHJpdmF0ZUtleVZhbGlkKGRhdGU0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRQcml2YXRlS2V5VmFsaWQoZGF0ZTUpOworICAgICAgICBkYXRlNS5zZXRUaW1lKGRhdGU0LmdldFRpbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFNlcmlhbE51bWJlcihqYXZhLm1hdGguQmlnSW50ZWdlcikKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U2VyaWFsTnVtYmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlcmlhbE51bWJlckxqYXZhX21hdGhfQmlnSW50ZWdlcigpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICBCaWdJbnRlZ2VyIHNlcjEgPSBuZXcgQmlnSW50ZWdlcigiMTAwMDAiKTsKKyAgICAgICAgQmlnSW50ZWdlciBzZXIyID0gbmV3IEJpZ0ludGVnZXIoIjEwMDAxIik7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KHNlcjEpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChzZXIyKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0U2VyaWFsTnVtYmVyKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgorICAgICAgICAgICAgICAgICsgInNlcmlhbE51bWJlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRTZXJpYWxOdW1iZXIoc2VyMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0U2VyaWFsTnVtYmVyKHNlcjIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRTdWJqZWN0KGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3ViamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3ViamVjdExCJCgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBuYW1lMSA9IG5ldyBieXRlW10KKyAgICAgICAgLy8gbWFudWFsbHkgb2J0YWluZWQgREVSIGVuY29kaW5nIG9mICJPPUZpcnN0IE9yZy4iIGlzc3VlciBuYW1lOworICAgICAgICB7IDQ4LCAyMSwgNDksIDE5LCA0OCwgMTcsIDYsIDMsIDg1LCA0LCAxMCwgMTksIDEwLCA3MCwgMTA1LCAxMTQsIDExNSwKKyAgICAgICAgICAgICAgICAxMTYsIDMyLCA3OSwgMTE0LCAxMDMsIDQ2IH07CisgICAgICAgIGJ5dGVbXSBuYW1lMiA9IG5ldyBieXRlW10KKyAgICAgICAgLy8gbWFudWFsbHkgb2J0YWluZWQgREVSIGVuY29kaW5nIG9mICJPPVNlY29uZCBPcmcuIiBpc3N1ZXIgbmFtZTsKKyAgICAgICAgeyA0OCwgMjIsIDQ5LCAyMCwgNDgsIDE4LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMSwgODMsIDEwMSwgOTksIDExMSwKKyAgICAgICAgICAgICAgICAxMTAsIDEwMCwgMzIsIDc5LCAxMTQsIDEwMywgNDYgfTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBzdWIxID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTEpOworICAgICAgICBYNTAwUHJpbmNpcGFsIHN1YjIgPSBuZXcgWDUwMFByaW5jaXBhbChuYW1lMik7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KHN1YjEpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChzdWIyKTsKKworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdCgoYnl0ZVtdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZXMgc2hvdWxkIG1hdGNoICIKKyAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGlzc3VlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChuYW1lMSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KG5hbWUyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3QoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3ViamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lMSA9ICJPPUZpcnN0IE9yZy4iOworICAgICAgICBTdHJpbmcgbmFtZTIgPSAiTz1TZWNvbmQgT3JnLiI7CisgICAgICAgIFg1MDBQcmluY2lwYWwgc3ViMSA9IG5ldyBYNTAwUHJpbmNpcGFsKG5hbWUxKTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBzdWIyID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTIpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChzdWIxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoc3ViMik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KChTdHJpbmcpIG51bGwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlcyBzaG91bGQgbWF0Y2ggIgorICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgc3ViamVjdCBjcml0ZXJpYS4iLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgIC5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChuYW1lMSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KG5hbWUyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3QoamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFN1YmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3ViamVjdExqYXZheF9zZWN1cml0eV9hdXRoX3g1MDBfWDUwMFByaW5jaXBhbCgpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICBYNTAwUHJpbmNpcGFsIHN1YjEgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1GaXJzdCBPcmcuIik7CisgICAgICAgIFg1MDBQcmluY2lwYWwgc3ViMiA9IG5ldyBYNTAwUHJpbmNpcGFsKCJPPVNlY29uZCBPcmcuIik7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KHN1YjEpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChzdWIyKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdCgoWDUwMFByaW5jaXBhbCkgbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZXMgc2hvdWxkIG1hdGNoICIKKyAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIHN1YmpjZXQgY3JpdGVyaWEuIiwgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAubWF0Y2goY2VydDEpCisgICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChzdWIxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KHN1YjIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyhDb2xsZWN0aW9uPExpc3Q8Pz4+KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXNMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjAgPSBuZXcgR2VuZXJhbE5hbWUobmV3IE90aGVyTmFtZSgiMS4yLjMuNC41IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDEsIDIsIDAsIDEgfSkpOworICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMSA9IG5ldyBHZW5lcmFsTmFtZSgxLCAicmZjQDgyMi5OYW1lIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4yID0gbmV3IEdlbmVyYWxOYW1lKDIsICJkTlNOYW1lIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4zID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPUkFkZHJlc3MoKSk7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW40ID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBOYW1lKCJPPU9yZ2FuaXphdGlvbiIpKTsKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjYgPSBuZXcgR2VuZXJhbE5hbWUoNiwgImh0dHA6Ly91bmlmb3JtLlJlc291cmNlLklkIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW43ID0gbmV3IEdlbmVyYWxOYW1lKDcsICIxLjEuMS4xIik7CisgICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW44ID0gbmV3IEdlbmVyYWxOYW1lKDgsICIxLjIuMy40NDQ0LjU1NTU1Iik7CisKKyAgICAgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zMSA9IG5ldyBHZW5lcmFsTmFtZXMoKTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMCk7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjEpOworICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4yKTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMyk7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjQpOworICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW42KTsKKyAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNyk7CisgICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjgpOworICAgICAgICAgICAgR2VuZXJhbE5hbWVzIHNhbnMyID0gbmV3IEdlbmVyYWxOYW1lcygpOworICAgICAgICAgICAgc2FuczIuYWRkTmFtZShzYW4wKTsKKworICAgICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2FuczEpOworICAgICAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoc2FuczIpOworICAgICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcyh0cnVlKTsKKworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMobnVsbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgorICAgICAgICAgICAgICAgICAgICArICJzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyBjcml0ZXJpYS4iLCBzZWxlY3RvcgorICAgICAgICAgICAgICAgICAgICAubWF0Y2goY2VydDEpCisgICAgICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisKKyAgICAgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gc2FucyA9IHNhbnMxLmdldFBhaXJzTGlzdCgpOworCisgICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyhzYW5zKTsKKworICAgICAgICAgICAgQ29sbGVjdGlvbjxMaXN0PD8+PiBjb2wgPSBzZWxlY3Rvci5nZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpOworICAgICAgICAgICAgSXRlcmF0b3I8TGlzdDw/Pj4gaSA9IGNvbC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgYSBMaXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3RLZXlJZGVudGlmaWVyKGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3ViamVjdEtleUlkZW50aWZpZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RLZXlJZGVudGlmaWVyTEIkKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHNraWQxID0gbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQsIDUgfTsgLy8gcmFuZG9tIHZhbHVlCisgICAgICAgIGJ5dGVbXSBza2lkMiA9IG5ldyBieXRlW10geyA1LCA0LCAzLCAyLCAxIH07IC8vIHJhbmRvbSB2YWx1ZQorICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChza2lkMSk7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KHNraWQyKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdEtleUlkZW50aWZpZXIobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggaW4gdGhlIGNhc2Ugb2YgbnVsbCAiCisgICAgICAgICAgICAgICAgKyAic2VyaWFsTnVtYmVyIGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQorICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RLZXlJZGVudGlmaWVyKHNraWQxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0S2V5SWRlbnRpZmllcihza2lkMik7CisgICAgICAgIHNraWQyWzBdKys7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3RQdWJsaWNLZXkoYnl0ZVtdKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTdWJqZWN0UHVibGljS2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTdWJqZWN0UHVibGljS2V5TEIkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy9TdWJqZWN0UHVibGljS2V5SW5mbyAgOjo9ICBTRVFVRU5DRSAgeworICAgICAgICAvLyAgICBhbGdvcml0aG0gICAgICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVyLAorICAgICAgICAvLyAgICBzdWJqZWN0UHVibGljS2V5ICAgICBCSVQgU1RSSU5HICB9CisgICAgICAgIGJ5dGVbXSBlbmMgPSB7IDB4MzAsIDB4MEUsIC8vIFNFUVVFTkNFCisgICAgICAgICAgICAgICAgMHgzMCwgMHgwNywgLy8gU0VRVUVOQ0UKKyAgICAgICAgICAgICAgICAweDA2LCAweDAyLCAweDAzLCAweDA1LC8vT0lECisgICAgICAgICAgICAgICAgMHgwMSwgMHgwMSwgMHgwNywgLy9BTlkKKyAgICAgICAgICAgICAgICAweDAzLCAweDAzLCAweDAxLCAweDAxLCAweDA2LCAvLyBzdWJqZWN0UHVibGljS2V5CisgICAgICAgIH07CisKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleShlbmMpOworICAgICAgICBQdWJsaWNLZXkga2V5ID0gc2VsZWN0b3IuZ2V0U3ViamVjdFB1YmxpY0tleSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAuMy41Iiwga2V5LmdldEFsZ29yaXRobSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYLjUwOSIsIGtleS5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbmMsIGtleS5nZXRFbmNvZGVkKCkpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChrZXkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3RQdWJsaWNLZXkoamF2YS5zZWN1cml0eS5QdWJsaWNLZXkga2V5KQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTdWJqZWN0UHVibGljS2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUHVibGljS2V5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RQdWJsaWNLZXlMamF2YV9zZWN1cml0eV9QdWJsaWNLZXkoKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgUHVibGljS2V5IHBrZXkxID0gbnVsbDsKKyAgICAgICAgUHVibGljS2V5IHBrZXkyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBrZXkxID0gbmV3IFRlc3RLZXlQYWlyKCJSU0EiKS5nZXRQdWJsaWMoKTsKKyAgICAgICAgICAgIHBrZXkyID0gbmV3IFRlc3RLZXlQYWlyKCJEU0EiKS5nZXRQdWJsaWMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChwa2V5MSk7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KHBrZXkyKTsKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleSgoUHVibGljS2V5KSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKKyAgICAgICAgICAgICAgICArICJzdWJqZWN0UHVibGljS2V5IGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQorICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXkocGtleTEpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXkocGtleTIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRTdWJqZWN0UHVibGljS2V5QWxnSUQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3NldFN1YmplY3RQdWJsaWNLZXlBbGdJRExqYXZhX2xhbmdfU3RyaW5nKCkKKyAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CisgICAgICAgIFN0cmluZyBwa2FpZDEgPSAiMS4yLjg0MC4xMTM1NDkuMS4xLjEiOyAvLyBSU0EgKHNvdXJjZToKKyAgICAgICAgLy8gaHR0cDovL2FzbjEuZWxpYmVsLnRtLmZyKQorICAgICAgICBTdHJpbmcgcGthaWQyID0gIjEuMi44NDAuMTAwNDAuNC4xIjsgLy8gRFNBIChzb3VyY2U6CisgICAgICAgIC8vIGh0dHA6Ly9hc24xLmVsaWJlbC50bS5mcikKKyAgICAgICAgUHVibGljS2V5IHBrZXkxOworICAgICAgICBQdWJsaWNLZXkgcGtleTI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwa2V5MSA9IG5ldyBUZXN0S2V5UGFpcigiUlNBIikuZ2V0UHVibGljKCk7CisgICAgICAgICAgICBwa2V5MiA9IG5ldyBUZXN0S2V5UGFpcigiRFNBIikuZ2V0UHVibGljKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChwa2V5MSk7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KHBrZXkyKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKG51bGwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgorICAgICAgICAgICAgICAgICsgInN1YmplY3RQdWJsaWNLZXlBbGdJRCBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKKyAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworCisgICAgICAgIFN0cmluZ1tdIHZhbGlkT0lEcyA9IHsgIjAuMjAiLCAiMS4yNSIsICIyLjM5IiwgIjAuMi4xMCIsICIxLjM1LjE1IiwKKyAgICAgICAgICAgICAgICAiMi4xNy44OSIsICIyLjUuMjkuMTYiLCAiMi41LjI5LjE3IiwgIjIuNS4yOS4zMCIsICIyLjUuMjkuMzIiLAorICAgICAgICAgICAgICAgICIyLjUuMjkuMzciIH07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZE9JRHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKHZhbGlkT0lEc1tpXSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbGlkT0lEc1tpXSwgc2VsZWN0b3IuZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKHBrYWlkMSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0UHVibGljS2V5QWxnSUQocGthaWQyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3RvU3RyaW5nKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgeworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWxlY3Rvci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlQdWJsaWNLZXkgaW1wbGVtZW50cyBQdWJsaWNLZXkgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyODk5NTI4Mzc1MzU0NjQ1NzUyTDsKKworICAgICAgICBwdWJsaWMgTXlQdWJsaWNLZXkoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CisgICAgICAgICAgICByZXR1cm4gIlB1YmxpY0tleSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiRm9ybWF0IjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNlclZlclVJRCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJpYWxWZXJzaW9uVUlEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q2VydCBleHRlbmRzIFg1MDlDZXJ0aWZpY2F0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTc2Njc2MTE1MjU0MjYwNDA1TDsKKworICAgICAgICAvKiBTdHVmZiBmaWVsZHMgKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBlcXVhbENyaXRlcmlhID0gbnVsbDsgLy8gdG8gc2ltcGxpZnkgbWV0aG9kIGVxdWFscygpCisKKyAgICAgICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgc2VyaWFsTnVtYmVyID0gbnVsbDsKKworICAgICAgICBwcm90ZWN0ZWQgWDUwMFByaW5jaXBhbCBpc3N1ZXIgPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBYNTAwUHJpbmNpcGFsIHN1YmplY3QgPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBieXRlW10ga2V5SWRlbnRpZmllciA9IG51bGw7CisKKyAgICAgICAgcHJvdGVjdGVkIERhdGUgZGF0ZSA9IG51bGw7CisKKyAgICAgICAgcHJvdGVjdGVkIERhdGUgbm90QmVmb3JlID0gbnVsbDsKKworICAgICAgICBwcm90ZWN0ZWQgRGF0ZSBub3RBZnRlciA9IG51bGw7CisKKyAgICAgICAgcHJvdGVjdGVkIFB1YmxpY0tleSBrZXkgPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuW10ga2V5VXNhZ2UgPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gZXh0S2V5VXNhZ2UgPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBpbnQgcGF0aExlbiA9IDE7CisKKyAgICAgICAgcHJvdGVjdGVkIEdlbmVyYWxOYW1lcyBzYW5zID0gbnVsbDsKKworICAgICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuY29kaW5nID0gbnVsbDsKKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcG9saWNpZXMgPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbGxlY3Rpb24gPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBOYW1lQ29uc3RyYWludHMgbmFtZUNvbnN0cmFpbnRzID0gbnVsbDsKKworICAgICAgICAvKiBTdHVmZiBtZXRob2RzICovCisgICAgICAgIHB1YmxpYyBUZXN0Q2VydCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q2VydChHZW5lcmFsTmFtZXMgc2FucykgeworICAgICAgICAgICAgc2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoc2Fucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdENlcnQoTmFtZUNvbnN0cmFpbnRzIG5hbWVDb25zdHJhaW50cykgeworICAgICAgICAgICAgdGhpcy5uYW1lQ29uc3RyYWludHMgPSBuYW1lQ29uc3RyYWludHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdENlcnQoQ29sbGVjdGlvbjxMaXN0PD8+PiBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBzZXRDb2xsZWN0aW9uKGNvbGxlY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDZXJ0KFN0cmluZyBlcXVhbENyaXRlcmlhKSB7CisgICAgICAgICAgICBzZXRFcXVhbENyaXRlcmlhKGVxdWFsQ3JpdGVyaWEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDZXJ0KFN0cmluZ1tdIHBvbGljaWVzKSB7CisgICAgICAgICAgICBzZXRQb2xpY2llcyhwb2xpY2llcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdENlcnQoQmlnSW50ZWdlciBzZXJpYWwpIHsKKyAgICAgICAgICAgIHNldFNlcmlhbE51bWJlcihzZXJpYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDZXJ0KFg1MDBQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisgICAgICAgICAgICBzZXRJc3N1ZXIocHJpbmNpcGFsKTsKKyAgICAgICAgICAgIHNldFN1YmplY3QocHJpbmNpcGFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q2VydChieXRlW10gYXJyYXkpIHsKKyAgICAgICAgICAgIHNldEtleUlkZW50aWZpZXIoYXJyYXkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDZXJ0KERhdGUgZGF0ZSkgeworICAgICAgICAgICAgc2V0RGF0ZShkYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q2VydChEYXRlIG5vdEJlZm9yZSwgRGF0ZSBub3RBZnRlcikgeworICAgICAgICAgICAgc2V0UGVyaW9kKG5vdEJlZm9yZSwgbm90QWZ0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDZXJ0KFB1YmxpY0tleSBrZXkpIHsKKyAgICAgICAgICAgIHNldFB1YmxpY0tleShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDZXJ0KGJvb2xlYW5bXSBrZXlVc2FnZSkgeworICAgICAgICAgICAgc2V0S2V5VXNhZ2Uoa2V5VXNhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDZXJ0KFNldDxTdHJpbmc+IGV4dEtleVVzYWdlKSB7CisgICAgICAgICAgICBzZXRFeHRlbmRlZEtleVVzYWdlKGV4dEtleVVzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q2VydChpbnQgcGF0aExlbikgeworICAgICAgICAgICAgdGhpcy5wYXRoTGVuID0gcGF0aExlbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKEdlbmVyYWxOYW1lcyBzYW5zKSB7CisgICAgICAgICAgICB0aGlzLnNhbnMgPSBzYW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvbihDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2xpY2llcyhTdHJpbmdbXSBwb2xpY2llcykgeworICAgICAgICAgICAgdGhpcy5wb2xpY2llcyA9IHBvbGljaWVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRLZXlVc2FnZShTZXQ8U3RyaW5nPiBleHRLZXlVc2FnZSkgeworICAgICAgICAgICAgdGhpcy5leHRLZXlVc2FnZSA9IChleHRLZXlVc2FnZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oCisgICAgICAgICAgICAgICAgICAgIGV4dEtleVVzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEtleVVzYWdlKGJvb2xlYW5bXSBrZXlVc2FnZSkgeworICAgICAgICAgICAgdGhpcy5rZXlVc2FnZSA9IChrZXlVc2FnZSA9PSBudWxsKSA/IG51bGwgOiAoYm9vbGVhbltdKSBrZXlVc2FnZQorICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpY0tleShQdWJsaWNLZXkga2V5KSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBlcmlvZChEYXRlIG5vdEJlZm9yZSwgRGF0ZSBub3RBZnRlcikgeworICAgICAgICAgICAgdGhpcy5ub3RCZWZvcmUgPSBub3RCZWZvcmU7CisgICAgICAgICAgICB0aGlzLm5vdEFmdGVyID0gbm90QWZ0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXJpYWxOdW1iZXIoQmlnSW50ZWdlciBzZXJpYWwpIHsKKyAgICAgICAgICAgIHRoaXMuc2VyaWFsTnVtYmVyID0gc2VyaWFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXF1YWxDcml0ZXJpYShTdHJpbmcgZXF1YWxDcml0ZXJpYSkgeworICAgICAgICAgICAgdGhpcy5lcXVhbENyaXRlcmlhID0gZXF1YWxDcml0ZXJpYTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldElzc3VlcihYNTAwUHJpbmNpcGFsIGlzc3VlcikgeworICAgICAgICAgICAgdGhpcy5pc3N1ZXIgPSBpc3N1ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFg1MDBQcmluY2lwYWwgc3ViamVjdCkgeworICAgICAgICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEtleUlkZW50aWZpZXIoYnl0ZVtdIHN1YmplY3RLZXlJRCkgeworICAgICAgICAgICAgdGhpcy5rZXlJZGVudGlmaWVyID0gKGJ5dGVbXSkgc3ViamVjdEtleUlELmNsb25lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRlKERhdGUgZGF0ZSkgeworICAgICAgICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoYnl0ZVtdIGVuY29kaW5nKSB7CisgICAgICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgIH0KKworICAgICAgICAvKiBNZXRob2QgaW1wbGVtZW50YXRpb25zICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgY2VydCkgeworICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZXF1YWxDcml0ZXJpYSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB8fCAoKChUZXN0Q2VydCkgY2VydCkuZXF1YWxDcml0ZXJpYSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsQ3JpdGVyaWEuZXF1YWxzKCgoVGVzdENlcnQpIGNlcnQpLmVxdWFsQ3JpdGVyaWEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIGlmIChlcXVhbENyaXRlcmlhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXF1YWxDcml0ZXJpYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrVmFsaWRpdHkoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2hlY2tWYWxpZGl0eShEYXRlIGRhdGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmRhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByZXN1bHQgPSB0aGlzLmRhdGUuY29tcGFyZVRvKGRhdGUpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAoc2VyaWFsTnVtYmVyID09IG51bGwpID8gbmV3IEJpZ0ludGVnZXIoIjExMTEiKQorICAgICAgICAgICAgICAgICAgICA6IHNlcmlhbE51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0SXNzdWVyRE4oKSB7CisgICAgICAgICAgICByZXR1cm4gaXNzdWVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFg1MDBQcmluY2lwYWwgZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpc3N1ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFN1YmplY3RETigpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJqZWN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFg1MDBQcmluY2lwYWwgZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKSB7CisgICAgICAgICAgICByZXR1cm4gc3ViamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEYXRlIGdldE5vdEJlZm9yZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERhdGUgZ2V0Tm90QWZ0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0VEJTQ2VydGlmaWNhdGUoKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0U2lnbmF0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpZ0FsZ05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lnQWxnT0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW5bXSBnZXRJc3N1ZXJVbmlxdWVJRCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW5bXSBnZXRTdWJqZWN0VW5pcXVlSUQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuW10gZ2V0S2V5VXNhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5VXNhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEV4dGVuZGVkS2V5VXNhZ2UoKQorICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGV4dEtleVVzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCYXNpY0NvbnN0cmFpbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhMZW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoUHVibGljS2V5IGtleSkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwgU2lnbmF0dXJlRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeShQdWJsaWNLZXkga2V5LCBTdHJpbmcgc2lnUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgU2lnbmF0dXJlRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXROb25Dcml0aWNhbEV4dGVuc2lvbk9JRHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RXh0ZW5zaW9uVmFsdWUoU3RyaW5nIG9pZCkgeworCisgICAgICAgICAgICBpZiAoKCIyLjUuMjkuMTQiLmVxdWFscyhvaWQpKSB8fCAoIjIuNS4yOS4zNSIuZXF1YWxzKG9pZCkpKSB7CisgICAgICAgICAgICAgICAgLy8gRXh0ZW5zaW9uIHZhbHVlIGlzIHJlcHJlc2VudGVkIGFzIGFuIE9jdGV0U3RyaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIEFTTjFPY3RldFN0cmluZy5nZXRJbnN0YW5jZSgpLmVuY29kZShrZXlJZGVudGlmaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiMi41LjI5LjE2Ii5lcXVhbHMob2lkKSkgeworICAgICAgICAgICAgICAgIFByaXZhdGVLZXlVc2FnZVBlcmlvZCBwa3VwID0gbmV3IFByaXZhdGVLZXlVc2FnZVBlcmlvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdEJlZm9yZSwgbm90QWZ0ZXIpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gcGt1cC5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFTTjFPY3RldFN0cmluZy5nZXRJbnN0YW5jZSgpLmVuY29kZShlbmNvZGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoIjIuNS4yOS4zNyIuZXF1YWxzKG9pZCkpICYmIChleHRLZXlVc2FnZSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIEFTTjFPaWRbXSBvYSA9IG5ldyBBU04xT2lkW2V4dEtleVVzYWdlLnNpemUoKV07CisgICAgICAgICAgICAgICAgU3RyaW5nW10gdmFsID0gbmV3IFN0cmluZ1tleHRLZXlVc2FnZS5zaXplKCldOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gZXh0S2V5VXNhZ2UuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2FbaWRdID0gQVNOMU9pZC5nZXRJbnN0YW5jZUZvclN0cmluZygpOworICAgICAgICAgICAgICAgICAgICB2YWxbaWQrK10gPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBBU04xT2N0ZXRTdHJpbmcuZ2V0SW5zdGFuY2UoKS5lbmNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQVNOMVNlcXVlbmNlKG9hKS5lbmNvZGUodmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIjIuNS4yOS4xOSIuZXF1YWxzKG9pZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVNOMU9jdGV0U3RyaW5nLmdldEluc3RhbmNlKCkuZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFTTjFTZXF1ZW5jZShuZXcgQVNOMVR5cGVbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTjFCb29sZWFuLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTjFJbnRlZ2VyLmdldEluc3RhbmNlKCkgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kZShuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHBhdGhMZW4gIT0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKHBhdGhMZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9CeXRlQXJyYXkoKSB9KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIjIuNS4yOS4xNyIuZXF1YWxzKG9pZCkgJiYgKHNhbnMgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2Fucy5nZXROYW1lcygpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBBU04xT2N0ZXRTdHJpbmcuZ2V0SW5zdGFuY2UoKS5lbmNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsTmFtZXMuQVNOMS5lbmNvZGUoc2FucykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCIyLjUuMjkuMzIiLmVxdWFscyhvaWQpICYmIChwb2xpY2llcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiAocG9saWNpZXMubGVuZ3RoID4gMCkpIHsKKyAgICAgICAgICAgICAgICAvLyBDZXJ0aWZpY2F0ZSBQb2xpY2llcyBFeHRlbnNpb24gKGFzIHNwZWNpZmllZCBpbiByZmMgMzI4MCkKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZVBvbGljaWVzIGNlcnRpZmljYXRlUG9saWNpZXMgPSBuZXcgQ2VydGlmaWNhdGVQb2xpY2llcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9saWNpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgUG9saWN5SW5mb3JtYXRpb24gcG9saWN5SW5mb3JtYXRpb24gPSBuZXcgUG9saWN5SW5mb3JtYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZVBvbGljaWVzLmFkZFBvbGljeUluZm9ybWF0aW9uKHBvbGljeUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEFTTjFPY3RldFN0cmluZy5nZXRJbnN0YW5jZSgpLmVuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlUG9saWNpZXMuZ2V0RW5jb2RlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiMi41LjI5LjMwIi5lcXVhbHMob2lkKSAmJiAobmFtZUNvbnN0cmFpbnRzICE9IG51bGwpKSB7IC8vCisgICAgICAgICAgICAgICAgLy8gTmFtZQorICAgICAgICAgICAgICAgIC8vIENvbnN0cmFpbnRzCisgICAgICAgICAgICAgICAgLy8gRXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgLy8gKGFzCisgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgLy8gaW4KKyAgICAgICAgICAgICAgICAvLyByZmMKKyAgICAgICAgICAgICAgICAvLyAzMjgwKQorICAgICAgICAgICAgICAgIHJldHVybiBBU04xT2N0ZXRTdHJpbmcuZ2V0SW5zdGFuY2UoKS5lbmNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lQ29uc3RyYWludHMuZ2V0RW5jb2RlZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZTJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2IyYzhjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZTJUZXN0LmphdmEKQEAgLTAsMCArMSw0MDEgQEAKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmNlcnQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0LlRlc3RVdGlsczsKK2ltcG9ydCB0ZXN0cy5zdXBwb3J0LnJlc291cmNlLlN1cHBvcnRfUmVzb3VyY2VzOworCitAVGVzdFRhcmdldENsYXNzKFg1MDlDZXJ0aWZpY2F0ZS5jbGFzcykKK3B1YmxpYyBjbGFzcyBYNTA5Q2VydGlmaWNhdGUyVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSNnZXRFeHRlbnNpb25WYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFeHRlbnNpb25WYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEV4dGVuc2lvblZhbHVlTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFN1cHBvcnRfUmVzb3VyY2VzCisgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyZWFtKCJoeXRzX2NlcnRpZmljYXRlX1BFTS50eHQiKTsKKworICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIHBlbUNlcnQgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdAorICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKGlzKTsKKworICAgICAgICBWZWN0b3I8U3RyaW5nPiBleHRlbnNpb25PaWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGV4dGVuc2lvbk9pZHMuYWRkQWxsKHBlbUNlcnQuZ2V0Q3JpdGljYWxFeHRlbnNpb25PSURzKCkpOworICAgICAgICBleHRlbnNpb25PaWRzLmFkZEFsbChwZW1DZXJ0LmdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpKTsKKyAgICAgICAgSXRlcmF0b3IgaSA9IGV4dGVuc2lvbk9pZHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgb2lkID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICBieXRlW10gdmFsdWUgPSBwZW1DZXJ0LmdldEV4dGVuc2lvblZhbHVlKG9pZCk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBpdCBpcyBhbiBlbmNvZGVkIGFzIGEgT0NURVQgU1RSSU5HCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgZXh0ZW5zaW9uIHZhbHVlIGZvciB0aGUgb2lkICIgKyBvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGVuY29kZWQgYXMgYW4gT0NURVQgU1RSSU5HIiwgMHgwNCwgdmFsdWVbMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgWC41MDkgQ2VydGlmaWNhdGUgcHJvdmlkZXIKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS0zMzg0CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWDUwOSIpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcGVtQ2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0CisgICAgICAgICAgICAgICAgLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRlc3RVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLmdldFg1MDlDZXJ0aWZpY2F0ZV92MygpKSk7CisKKyAgICAgICAgLy8gZXh0ZW5zaW9uIHZhbHVlIGlzIGVtcHR5IHNlcXVlbmNlCisgICAgICAgIGJ5dGVbXSBleHRuVmFsdWUgPSBwZW1DZXJ0LmdldEV4dGVuc2lvblZhbHVlKCIyLjUuMjkuMzUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10geyAweDA0LCAweDAyLCAweDMwLCAweDAwIH0sCisgICAgICAgICAgICAgICAgZXh0blZhbHVlKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGVtQ2VydC50b1N0cmluZygpKTsKKyAgICAgICAgLy8gRW5kIHJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMzM4NAorICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI1g1MDlDZXJ0aWZpY2F0ZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlg1MDlDZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfWDUwOUNlcnRpZmljYXRlKCkgeworICAgICAgICBNeVg1MDlDZXJ0aWZpY2F0ZSBzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMgPSBuZXcgTXlYNTA5Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYLjUwOSIsIHMuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICAvLyBCYXNlNjQgZW5jb2RlZCBmb3JtIG9mIEFTTi4xIERFUiBlbmNvZGVkIFguNTA5IENlcnRpZmljYXRlCisgICAgLy8gKHNlZSBSRkMgMzI4MCBhdCBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMjgwLnR4dCkKKyAgICAvLyAoZ2VuZXJhdGVkIGJ5IHVzaW5nIG9mIGNsYXNzZXMgZnJvbQorICAgIC8vIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5IHBhY2thZ2UpCisgICAgc3RhdGljIFN0cmluZyBiYXNlNjRjZXJ0ID0gIk1JSUJ5ekNDQVRhZ0F3SUJBZ0lDQWlzd0N3WUpLb1pJaHZjTkFRRUZNQjB4R3pBWkJnTlZCQW9UIgorICAgICAgICAgICAgKyAiRWtObGNuUnBabWxqWVhSbElFbHpjM1ZsY2pBZUZ3MHdOakEwTWpZd05qSTRNakphRncwek16QXoiCisgICAgICAgICAgICArICJNREV4TmpRME1EbGFNQjB4R3pBWkJnTlZCQW9URWtObGNuUnBabWxqWVhSbElFbHpjM1ZsY2pDQiIKKyAgICAgICAgICAgICsgIm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQWtMR0xzUGRTUERNeVAxT1VPS3UiCisgICAgICAgICAgICArICJVM2N2Yk5LNVJHYVEzYlhjNWFEanZBcHg0M0JjYW9YZ3Q2WUQvNXlYejBPc0lvb2o1eUEzN2JZIgorICAgICAgICAgICAgKyAiSkdjVnJ2RkQ1Rk1QZERkM3ZqTlBRT2VwME16RzRDZGJrYVpkZTVTaWdQYWJPTVFZUzRvVXlMQngiCisgICAgICAgICAgICArICJXM0xHRzBtVU9EZTVBR0dxdHFYVTBHbEtnNEsyamU2Y0N0b29rQ1VDQXdFQUFhTWVNQnd3R2dZRCIKKyAgICAgICAgICAgICsgIlZSMFJBUUgvQkJBd0RvRU1jbVpqUURneU1pNU9ZVzFsTUFzR0NTcUdTSWIzRFFFQkJRT0JnUUJaIgorICAgICAgICAgICAgKyAicFZYajAxZE9wcW5aRXJVUWI1MGo4bEpEMWRJYXoxZUpUdkpDU2Fkajd6aVYxVnRubmFwSTA3YyIKKyAgICAgICAgICAgICsgIlhFYTdPTnpjSFFUWVRHMTBwb0hmT0svYTBCYVVMRjNHbGN0REVTaWx3UVliVzVCZGZwQWxacGJIIgorICAgICAgICAgICAgKyAiQUZMY1VEaDZFcTUwa2MwQS9hbmgvajNtZ0JOdXZiSU1vN2hITm5aQjZrL3Byc3dtMkJzenlMRCIKKyAgICAgICAgICAgICsgInl3PT0iOworCisgICAgLy8gQmFzZTY0IGVuY29kZWQgZm9ybSBvZiBBU04uMSBERVIgZW5jb2RlZCBYLjUwOSBDUkwKKyAgICAvLyAoc2VlIFJGQyAzMjgwIGF0IGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMyODAudHh0KQorICAgIC8vIChnZW5lcmF0ZWQgYnkgdXNpbmcgb2YgY2xhc3NlcyBmcm9tCisgICAgLy8gb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkgcGFja2FnZSkKKyAgICBzdGF0aWMgU3RyaW5nIGJhc2U2NGNybCA9ICJNSUhYTUlHWEFnRUJNQWtHQnlxR1NNNDRCQU13RlRFVE1CRUdBMVVFQ2hNS1ExSk1JRWx6YzNWbCIKKyAgICAgICAgICAgICsgImNoY05NRFl3TkRJM01EWXhNelExV2hjTk1EWXdOREkzTURZeE5USTFXakJCTUQ4Q0FnSXJGdzB3IgorICAgICAgICAgICAgKyAiTmpBME1qY3dOakV6TkRaYU1Db3dDZ1lEVlIwVkJBTUtBUUV3SEFZRFZSMFlCQlVZRXpJd01EWXciCisgICAgICAgICAgICArICJOREkzTURZeE16UTFMalEyT0ZxZ0R6QU5NQXNHQTFVZEZBUUVCQVFFQkRBSkJnY3Foa2pPT0FRRCIKKyAgICAgICAgICAgICsgIkF6QUFNQzBDRlFDazB0MERUeXU4MlFwYWpiQmx4WDl1WHZVRFNnSVVTQk40Zyt4VEVlZXhzLzBrIgorICAgICAgICAgICAgKyAiOUFrakJoakYwRXM9IjsKKworICAgIC8vIGhhcyBzdHViIGltcGxlbWVudGF0aW9uIGZvciBhYnN0cmFjdCBtZXRob2RzCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlYNTA5Q2VydGlmaWNhdGUgZXh0ZW5kcyBYNTA5Q2VydGlmaWNhdGUgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MTk2Njk0MDcyMjk2NjA3MDA3TDsKKworICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1ZhbGlkaXR5KCkgdGhyb3dzIENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrVmFsaWRpdHkoRGF0ZSBkYXRlKQorICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRJc3N1ZXJETigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRTdWJqZWN0RE4oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEYXRlIGdldE5vdEJlZm9yZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERhdGUgZ2V0Tm90QWZ0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0VEJTQ2VydGlmaWNhdGUoKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0U2lnbmF0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpZ0FsZ05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lnQWxnT0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW5bXSBnZXRJc3N1ZXJVbmlxdWVJRCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW5bXSBnZXRTdWJqZWN0VW5pcXVlSUQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuW10gZ2V0S2V5VXNhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QmFzaWNDb25zdHJhaW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KFB1YmxpY0tleSBrZXkpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoUHVibGljS2V5IGtleSwgU3RyaW5nIHNpZ1Byb3ZpZGVyKQorICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldENyaXRpY2FsRXh0ZW5zaW9uT0lEcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFeHRlbnNpb25WYWx1ZShTdHJpbmcgb2lkKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSNnZXRUeXBlKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlguNTA5IiwgbmV3IE15WDUwOUNlcnRpZmljYXRlKCkuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSNnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkgeworICAgICAgICAvLyByZXR1cm4gdmFsaWQgZW5jb2RpbmcKKyAgICAgICAgTXlYNTA5Q2VydGlmaWNhdGUgY2VydCA9IG5ldyBNeVg1MDlDZXJ0aWZpY2F0ZSgpIHsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzODY1OTkwODMyMzc0MTE2NUw7CisKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFV0aWxzLmdldFg1MDlDZXJ0aWZpY2F0ZV92MSgpOworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFg1MDBQcmluY2lwYWwoIkNOPVoiKSwgY2VydC5nZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI2dldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKSB7CisgICAgICAgIC8vIHJldHVybiB2YWxpZCBlbmNvZGluZworICAgICAgICBNeVg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gbmV3IE15WDUwOUNlcnRpZmljYXRlKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM2MjU5MTM2Mzc0MTM4NDA2OTRMOworCisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RVdGlscy5nZXRYNTA5Q2VydGlmaWNhdGVfdjEoKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBYNTAwUHJpbmNpcGFsKCJDTj1ZIiksIGNlcnQuZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUjZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEV4dGVuZGVkS2V5VXNhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXh0ZW5kZWRLZXlVc2FnZSgpIHRocm93cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKG5ldyBNeVg1MDlDZXJ0aWZpY2F0ZSgpLmdldEV4dGVuZGVkS2V5VXNhZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUjZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBhc3NlcnROdWxsKG5ldyBNeVg1MDlDZXJ0aWZpY2F0ZSgpLmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI2dldElzc3VlckFsdGVybmF0aXZlTmFtZXMoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJc3N1ZXJBbHRlcm5hdGl2ZU5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEdldElzc3VlckFsdGVybmF0aXZlTmFtZXMoKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgYXNzZXJ0TnVsbChuZXcgTXlYNTA5Q2VydGlmaWNhdGUoKS5nZXRJc3N1ZXJBbHRlcm5hdGl2ZU5hbWVzKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0FsbFRlc3RzLmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQ3NjVmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5pbnRlcmZhY2VzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmludGVyZmFjZXM7CisgKi8KKworcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKEFsbFRlc3RzLnN1aXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmludGVyZmFjZXM7Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRFNBS2V5VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShEU0FQYXJhbXNUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRFNBUHJpdmF0ZUtleVRlc3QuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShEU0FQdWJsaWNLZXlUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRUNLZXlUZXN0LmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRUNQcml2YXRlS2V5VGVzdC5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVDUHVibGljS2V5VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSU0FLZXlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJTQVByaXZhdGVDcnRLZXlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJTQVByaXZhdGVLZXlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJTQVB1YmxpY0tleVRlc3QuY2xhc3MpOworCisgICAgICAgIC8vICRKVW5pdC1FTkQkCisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBS2V5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQUtleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTY4MGU4YwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FLZXlUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5pbnRlcmZhY2VzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkRTQVBhcmFtZXRlclNwZWM7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRFNBS2V5LmNsYXNzKQorcHVibGljIGNsYXNzIERTQUtleVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FLZXkgCisgICAgICogI2dldFBhcmFtcygpCisgICAgICogdGVzdCBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlcworICAgICAqICAgQ2FzZSAxOiBjaGVjayBwcml2YXRlIGtleQorICAgICAqICAgQ2FzZSAyOiBjaGVjayBwdWJsaWMga2V5CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhcmFtcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERTQVBhcmFtcyBwYXJhbSA9IG5ldyBEU0FQYXJhbWV0ZXJTcGVjKFV0aWwuUCwgVXRpbC5RLCBVdGlsLkcpOworICAgICAgICAKKyAgICAgICAgS2V5UGFpckdlbmVyYXRvciBnZW4gPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJEU0EiLCBVdGlsLnByb3YpOworICAgICAgICBnZW4uaW5pdGlhbGl6ZSgoRFNBUGFyYW1ldGVyU3BlYykgcGFyYW0pOworICAgICAgICBEU0FLZXkga2V5ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIENhc2UgMTogY2hlY2sgcHJpdmF0ZSBrZXkKKyAgICAgICAga2V5ID0gKERTQUtleSkgZ2VuLmdlbmVyYXRlS2V5UGFpcigpLmdldFByaXZhdGUoKTsKKyAgICAgICAgYXNzZXJ0RFNBUGFyYW1zRXF1YWxzKHBhcmFtLCBrZXkuZ2V0UGFyYW1zKCkpOworICAgICAgICAKKyAgICAgICAgLy8gQ2FzZSAyOiBjaGVjayBwdWJsaWMga2V5CisgICAgICAgIGtleSA9IChEU0FLZXkpIGdlbi5nZW5lcmF0ZUtleVBhaXIoKS5nZXRQdWJsaWMoKTsgICAgICAgICAgICAgICAgCisgICAgICAgIGFzc2VydERTQVBhcmFtc0VxdWFscyhwYXJhbSwga2V5LmdldFBhcmFtcygpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERTQVBhcmFtc0VxdWFscyhEU0FQYXJhbXMgZXhwZWN0ZWQsIERTQVBhcmFtcyBhY3R1YWwpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQIGRpZmZlciIsIGV4cGVjdGVkLmdldFAoKSwgYWN0dWFsLmdldFAoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUSBkaWZmZXIiLCBleHBlY3RlZC5nZXRRKCksIGFjdHVhbC5nZXRRKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkcgZGlmZmVyIiwgZXhwZWN0ZWQuZ2V0RygpLCBhY3R1YWwuZ2V0RygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUGFyYW1zVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQVBhcmFtc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDZlODk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0RTQVBhcmFtc1Rlc3QuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5pbnRlcmZhY2VzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkRTQVBhcmFtZXRlclNwZWM7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRFNBUGFyYW1zLmNsYXNzKQorcHVibGljIGNsYXNzIERTQVBhcmFtc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBCaWdJbnRlZ2VyIHAgPSBuZXcgQmlnSW50ZWdlcigiNCIpOworICAgIHByaXZhdGUgZmluYWwgQmlnSW50ZWdlciBxID0gQmlnSW50ZWdlci5URU47CisgICAgcHJpdmF0ZSBmaW5hbCBCaWdJbnRlZ2VyIGcgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXMKKyAgICAgKiAjZ2V0RygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEcoKSB7CisgICAgICAgIERTQVBhcmFtcyBwYXJhbXMgPSBuZXcgRFNBUGFyYW1ldGVyU3BlYyhwLCBxLCBnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIEciLCBnLCBwYXJhbXMuZ2V0RygpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXMKKyAgICAgKiAjZ2V0UCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFAoKSB7CisgICAgICAgIERTQVBhcmFtcyBwYXJhbXMgPSBuZXcgRFNBUGFyYW1ldGVyU3BlYyhwLCBxLCBnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIFAiLCBwLCBwYXJhbXMuZ2V0UCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXMKKyAgICAgKiAjZ2V0USgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFEiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFEoKSB7CisgICAgICAgIERTQVBhcmFtcyBwYXJhbXMgPSBuZXcgRFNBUGFyYW1ldGVyU3BlYyhwLCBxLCBnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIFEiLCBxLCBwYXJhbXMuZ2V0USgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUHJpdmF0ZUtleVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQcml2YXRlS2V5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDQ2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUHJpdmF0ZUtleVRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5pbnRlcmZhY2VzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRFNBUGFyYW1ldGVyU3BlYzsKKworQFRlc3RUYXJnZXRDbGFzcyhEU0FQcml2YXRlS2V5LmNsYXNzKQorcHVibGljIGNsYXNzIERTQVByaXZhdGVLZXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHJpdmF0ZUtleSAKKyAgICAgKiAjZ2V0WCgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlHZW4gPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJEU0EiLCBVdGlsLnByb3YpOworICAgICAgICBrZXlHZW4uaW5pdGlhbGl6ZShuZXcgRFNBUGFyYW1ldGVyU3BlYyhVdGlsLlAsIFV0aWwuUSwgVXRpbC5HKSwKKyAgICAgICAgICAgICAgICBuZXcgU2VjdXJlUmFuZG9tKG5ldyBNeVNlY3VyZVJhbmRvbVNwaSgpLCBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgRFNBUHJpdmF0ZUtleSBrZXkgPSAoRFNBUHJpdmF0ZUtleSkga2V5R2VuLmdlbmVyYXRlS2V5UGFpcigpLmdldFByaXZhdGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIFggdmFsdWUiLCBVdGlsLlJORF9SRVQsIGtleS5nZXRYKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9EU0FQdWJsaWNLZXlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUHVibGljS2V5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzMxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRFNBUHVibGljS2V5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmludGVyZmFjZXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjOworCitAVGVzdFRhcmdldENsYXNzKERTQVB1YmxpY0tleS5jbGFzcykKK3B1YmxpYyBjbGFzcyBEU0FQdWJsaWNLZXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHVibGljS2V5IAorICAgICAqICNnZXRZKCkKKyAgICAgKiB0ZXN0IGNvdmVycyBmb2xsb3dpbmcgdXNlIGNhc2VzCisgICAgICogICBDYXNlIDE6IGNoZWNrIHdpdGggcHJlZGVmaW5lZCBwLCBxLCBnLCB4CisgICAgICogICBDYXNlIDI6IGNoZWNrIHdpdGggcmFuZG9tIHAsIHEsIGcsIHguIEl0IHRha2VzIHNvbWUgdGltZSAodXAgdG8gIAorICAgICAqICAgICAgICAgICBtaW51dGUpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlHZW4gPSBudWxsOworICAgICAgICBLZXlQYWlyIGtleXMgPSBudWxsOworICAgICAgICBEU0FQcml2YXRlS2V5IHByaXYgPSBudWxsOworICAgICAgICBEU0FQdWJsaWNLZXkgcHVibCA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBDYXNlIDE6IGNoZWNrIHdpdGggcHJlZGVmaW5lZCBwLCBxLCBnLCB4CisgICAgICAgIGtleUdlbiA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkRTQSIsIFV0aWwucHJvdik7CisgICAgICAgIGtleUdlbi5pbml0aWFsaXplKG5ldyBEU0FQYXJhbWV0ZXJTcGVjKFV0aWwuUCwgVXRpbC5RLCBVdGlsLkcpLAorICAgICAgICAgICAgICAgIG5ldyBTZWN1cmVSYW5kb20obmV3IE15U2VjdXJlUmFuZG9tU3BpKCksIG51bGwpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAga2V5cyA9IGtleUdlbi5nZW5lcmF0ZUtleVBhaXIoKTsKKyAgICAgICAgcHJpdiA9IChEU0FQcml2YXRlS2V5KSBrZXlzLmdldFByaXZhdGUoKTsKKyAgICAgICAgcHVibCA9IChEU0FQdWJsaWNLZXkpIGtleXMuZ2V0UHVibGljKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBZIHZhbHVlIiwgKFV0aWwuRy5tb2RQb3coVXRpbC5STkRfUkVULCBVdGlsLlApKSwKKyAgICAgICAgICAgICAgICBwdWJsLmdldFkoKSk7CisKKyAgICAgICAgLy8gQ2FzZSAyOiBjaGVjayB3aXRoIHJhbmRvbSBwLCBxLCBnLCB4LiBJdCB0YWtlcyBzb21lIHRpbWUgKHVwIHRvIAorICAgICAgICAvLyBtaW51dGUpCisgICAgICAgIGtleUdlbiA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkRTQSIsIFV0aWwucHJvdik7CisgICAgICAgIGtleXMgPSBrZXlHZW4uZ2VuZXJhdGVLZXlQYWlyKCk7CisgICAgICAgIHByaXYgPSAoRFNBUHJpdmF0ZUtleSkga2V5cy5nZXRQcml2YXRlKCk7CisgICAgICAgIHB1YmwgPSAoRFNBUHVibGljS2V5KSBrZXlzLmdldFB1YmxpYygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgWSB2YWx1ZSIsIChwcml2LmdldFBhcmFtcygpLmdldEcoKS5tb2RQb3coCisgICAgICAgICAgICAgICAgcHJpdi5nZXRYKCksIHByaXYuZ2V0UGFyYW1zKCkuZ2V0UCgpKSksIHB1YmwuZ2V0WSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNLZXlUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNLZXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4YTczMwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9FQ0tleVRlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5pbnRlcmZhY2VzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYzsKKworQFRlc3RUYXJnZXRDbGFzcyhFQ0tleS5jbGFzcykKK3B1YmxpYyBjbGFzcyBFQ0tleVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ0tleQorICAgICAqICNnZXRQYXJhbXMoKQorICAgICAqIHRlc3QgY292ZXJzIGZvbGxvd2luZyB1c2UgY2FzZXMKKyAgICAgKiAgIENhc2UgMTogY2hlY2sgcHJpdmF0ZSBrZXkKKyAgICAgKiAgIENhc2UgMjogY2hlY2sgcHVibGljIGtleQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJhbXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBLZXlQYWlyR2VuZXJhdG9yIGdlbiA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkVDIiwgVXRpbC5wcm92KTsgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBnZW4uaW5pdGlhbGl6ZShVdGlsLmVjUGFyYW0pOyAgICAgICAgCisgICAgICAgIEVDS2V5IGtleSA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBDYXNlIDE6IGNoZWNrIHByaXZhdGUga2V5CisgICAgICAgIGtleSA9IChFQ0tleSkgZ2VuLmdlbmVyYXRlS2V5UGFpcigpLmdldFByaXZhdGUoKTsKKyAgICAgICAgYXNzZXJ0RUNQYXJhbWV0ZXJTcGVjRXF1YWxzKFV0aWwuZWNQYXJhbSwga2V5LmdldFBhcmFtcygpKTsKKyAgICAgICAgCisgICAgICAgIC8vIENhc2UgMjogY2hlY2sgcHVibGljIGtleQorICAgICAgICBrZXkgPSAoRUNLZXkpIGdlbi5nZW5lcmF0ZUtleVBhaXIoKS5nZXRQdWJsaWMoKTsgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBhc3NlcnRFQ1BhcmFtZXRlclNwZWNFcXVhbHMoVXRpbC5lY1BhcmFtLCBrZXkuZ2V0UGFyYW1zKCkpOyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVDUGFyYW1ldGVyU3BlY0VxdWFscyhFQ1BhcmFtZXRlclNwZWMgZXhwZWN0ZWQsIEVDUGFyYW1ldGVyU3BlYyBhY3R1YWwpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb2ZhY3RvcnMgZG9uJ3QgbWF0Y2giLCBleHBlY3RlZC5nZXRDb2ZhY3RvcigpLCBhY3R1YWwuZ2V0Q29mYWN0b3IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3VydmVzIGRvbid0IG1hdGNoIiwgZXhwZWN0ZWQuZ2V0Q3VydmUoKSwgYWN0dWFsLmdldEN1cnZlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdlbmVyYXRvciBkb24ndCBtYXRjaCIsIGV4cGVjdGVkLmdldEdlbmVyYXRvcigpLCBhY3R1YWwuZ2V0R2VuZXJhdG9yKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZGVyIGRvbid0IG1hdGNoIiwgZXhwZWN0ZWQuZ2V0T3JkZXIoKSwgYWN0dWFsLmdldE9yZGVyKCkpOworICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvRUNQcml2YXRlS2V5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0VDUHJpdmF0ZUtleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0NzFiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0VDUHJpdmF0ZUtleVRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5pbnRlcmZhY2VzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5OworCitAVGVzdFRhcmdldENsYXNzKEVDUHJpdmF0ZUtleS5jbGFzcykKK3B1YmxpYyBjbGFzcyBFQ1ByaXZhdGVLZXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5CisgICAgICogI2dldFMoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleVBhaXJHZW5lcmF0b3IgZ2VuID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZSgiRUMiLCBVdGlsLnByb3YpOworICAgICAgICBnZW4uaW5pdGlhbGl6ZShVdGlsLmVjUGFyYW0sIG5ldyBTZWN1cmVSYW5kb20obmV3IE15U2VjdXJlUmFuZG9tU3BpKCksCisgICAgICAgICAgICAgICAgbnVsbCkgeworICAgICAgICB9KTsKKyAgICAgICAgRUNQcml2YXRlS2V5IGtleSA9IChFQ1ByaXZhdGVLZXkpIGdlbi5nZW5lcmF0ZUtleVBhaXIoKS5nZXRQcml2YXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBTIiwgVXRpbC5STkRfUkVULCBrZXkuZ2V0UygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9FQ1B1YmxpY0tleVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9FQ1B1YmxpY0tleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjExYmUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL0VDUHVibGljS2V5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmludGVyZmFjZXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1B1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludDsKKworQFRlc3RUYXJnZXRDbGFzcyhFQ1B1YmxpY0tleS5jbGFzcykKK3B1YmxpYyBjbGFzcyBFQ1B1YmxpY0tleVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1B1YmxpY0tleSAKKyAgICAgKiAjZ2V0VygpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgS2V5UGFpckdlbmVyYXRvciBnZW4gPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJFQyIsIFV0aWwucHJvdik7CisgICAgICAgIGdlbi5pbml0aWFsaXplKFV0aWwuZWNQYXJhbSwgbmV3IFNlY3VyZVJhbmRvbShuZXcgTXlTZWN1cmVSYW5kb21TcGkoKSwKKyAgICAgICAgICAgICAgICBudWxsKSB7CisgICAgICAgIH0pOworICAgICAgICBFQ1B1YmxpY0tleSBrZXkgPSAoRUNQdWJsaWNLZXkpIGdlbi5nZW5lcmF0ZUtleVBhaXIoKS5nZXRQdWJsaWMoKTsKKyAgICAgICAgYXNzZXJ0RUNQb2ludEVxdWFscyhuZXcgRUNQb2ludChCaWdJbnRlZ2VyLnZhbHVlT2YoNCksCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDE1KSksIGtleS5nZXRXKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFQ1BvaW50RXF1YWxzKEVDUG9pbnQgZXhwZWN0ZWQsIEVDUG9pbnQgYWN0dWFsKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiWCBjb29yZGlhdGVzIGFyZSBkaWZmZXJlbnQiLCBleHBlY3RlZC5nZXRBZmZpbmVYKCksCisgICAgICAgICAgICAgICAgYWN0dWFsLmdldEFmZmluZVgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWSBjb29yZGlhdGVzIGFyZSBkaWZmZXJlbnQiLCBleHBlY3RlZC5nZXRBZmZpbmVZKCksCisgICAgICAgICAgICAgICAgYWN0dWFsLmdldEFmZmluZVkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQUtleVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FLZXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZWJhZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FLZXlUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuaW50ZXJmYWNlczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHJpdmF0ZUtleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQVB1YmxpY0tleVNwZWM7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoUlNBS2V5LmNsYXNzKQorcHVibGljIGNsYXNzIFJTQUtleVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FLZXkKKyAgICAgKiAjZ2V0TW9kdWx1cygpCisgICAgICogdGVzdCBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlcworICAgICAqICAgQ2FzZSAxOiBjaGVjayBwcml2YXRlIGtleQorICAgICAqICAgQ2FzZSAyOiBjaGVjayBwdWJsaWMga2V5CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1vZHVsdXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZHVsdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgS2V5RmFjdG9yeSBnZW4gPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJSU0EiLCBVdGlsLnByb3YpOworICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIG4gPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMzIzMyk7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgZCA9IEJpZ0ludGVnZXIudmFsdWVPZigyNzUzKTsKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciBlID0gQmlnSW50ZWdlci52YWx1ZU9mKDE3KTsKKyAgICAgICAgUlNBS2V5IGtleSA9IG51bGw7IAorICAgICAgICAKKyAgICAgICAgLy8gQ2FzZSAxOiBjaGVjayBwcml2YXRlIGtleQorICAgICAgICBrZXkgPSAoUlNBS2V5KSBnZW4uZ2VuZXJhdGVQcml2YXRlKG5ldyBSU0FQcml2YXRlS2V5U3BlYyhuLCBkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW52YWxpZCBtb2R1bHVzIiwgbiwga2V5LmdldE1vZHVsdXMoKSk7CisgICAgICAgIAorICAgICAgICAvLyBDYXNlIDI6IGNoZWNrIHB1YmxpYyBrZXkKKyAgICAgICAga2V5ID0gKFJTQUtleSkgZ2VuLmdlbmVyYXRlUHVibGljKG5ldyBSU0FQdWJsaWNLZXlTcGVjKG4sIGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIG1vZHVsdXMiLCBuLCBrZXkuZ2V0TW9kdWx1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHJpdmF0ZUNydEtleVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FQcml2YXRlQ3J0S2V5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmYwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHJpdmF0ZUNydEtleVRlc3QuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuaW50ZXJmYWNlczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXk7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoUlNBUHJpdmF0ZUNydEtleS5jbGFzcykKK3B1YmxpYyBjbGFzcyBSU0FQcml2YXRlQ3J0S2V5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAKKyAgICBSU0FQcml2YXRlQ3J0S2V5IGtleSA9IG51bGw7CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgS2V5RmFjdG9yeSBnZW4gPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJSU0EiLCBVdGlsLnByb3YpOworICAgICAgICBrZXkgPSAoUlNBUHJpdmF0ZUNydEtleSkgZ2VuLmdlbmVyYXRlUHJpdmF0ZShVdGlsLnJzYUNydFBhcmFtKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlQ3J0S2V5CisgICAgICogI2dldENydENvZWZmaWNpZW50KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q3J0Q29lZmZpY2llbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENydENvZWZmaWNpZW50KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImludmFsaWQgQ1JUIGNvZWZmaWNpZW50IiwKKyAgICAgICAgICAgICAgICBVdGlsLnJzYUNydFBhcmFtLmdldENydENvZWZmaWNpZW50KCksIGtleS5nZXRDcnRDb2VmZmljaWVudCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlQ3J0S2V5CisgICAgICogI2dldFByaW1lRXhwb25lbnRQKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbWVFeHBvbmVudFAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1lRXhwb25lbnRQKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImludmFsaWQgcHJpbWUgZXhwb25lbnQgUCIsCisgICAgICAgICAgICAgICAgVXRpbC5yc2FDcnRQYXJhbS5nZXRQcmltZUV4cG9uZW50UCgpLCBrZXkuZ2V0UHJpbWVFeHBvbmVudFAoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHJpdmF0ZUNydEtleQorICAgICAqICNnZXRQcmltZUV4cG9uZW50USgpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaW1lRXhwb25lbnRRIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltZUV4cG9uZW50USgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIHByaW1lIGV4cG9uZW50IFEiLAorICAgICAgICAgICAgICAgIFV0aWwucnNhQ3J0UGFyYW0uZ2V0UHJpbWVFeHBvbmVudFEoKSwga2V5LmdldFByaW1lRXhwb25lbnRRKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXkKKyAgICAgKiAjZ2V0UHJpbWVQKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbWVQIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltZVAoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiaW52YWxpZCBwcmltZSBQIiwKKyAgICAgICAgICAgICAgICBVdGlsLnJzYUNydFBhcmFtLmdldFByaW1lUCgpLCBrZXkuZ2V0UHJpbWVQKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXkKKyAgICAgKiAjZ2V0UHJpbWVRKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbWVRIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltZVEoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiaW52YWxpZCBwcmltZSBRIiwKKyAgICAgICAgICAgICAgICBVdGlsLnJzYUNydFBhcmFtLmdldFByaW1lUSgpLCBrZXkuZ2V0UHJpbWVRKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXkKKyAgICAgKiAjZ2V0UHVibGljRXhwb25lbnQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWNFeHBvbmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHVibGljRXhwb25lbnQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiaW52YWxpZCBwdWJsaWMgZXhwb25lbnQiLAorICAgICAgICAgICAgICAgIFV0aWwucnNhQ3J0UGFyYW0uZ2V0UHVibGljRXhwb25lbnQoKSwga2V5LmdldFB1YmxpY0V4cG9uZW50KCkpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBrZXkgPSBudWxsOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FQcml2YXRlS2V5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQVByaXZhdGVLZXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiMjA5NgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvaW50ZXJmYWNlcy9SU0FQcml2YXRlS2V5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LmludGVyZmFjZXM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FQcml2YXRlS2V5U3BlYzsKKworQFRlc3RUYXJnZXRDbGFzcyhSU0FQcml2YXRlS2V5LmNsYXNzKQorcHVibGljIGNsYXNzIFJTQVByaXZhdGVLZXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHJpdmF0ZUtleQorICAgICAqICNnZXRQcml2YXRlRXhwb25lbnQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcml2YXRlRXhwb25lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaXZhdGVFeHBvbmVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBLZXlGYWN0b3J5IGdlbiA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlJTQSIsIFV0aWwucHJvdik7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgbiA9IEJpZ0ludGVnZXIudmFsdWVPZigzMjMzKTsKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciBkID0gQmlnSW50ZWdlci52YWx1ZU9mKDI3NTMpOworICAgICAgICBSU0FQcml2YXRlS2V5IGtleSA9IChSU0FQcml2YXRlS2V5KSBnZW4uZ2VuZXJhdGVQcml2YXRlKG5ldyBSU0FQcml2YXRlS2V5U3BlYygKKyAgICAgICAgICAgICAgICBuLCBkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW52YWxpZCBwcml2YXRlIGV4cG9uZW50IiwgZCwga2V5LmdldFByaXZhdGVFeHBvbmVudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvUlNBUHVibGljS2V5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQVB1YmxpY0tleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODdmOTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL1JTQVB1YmxpY0tleVRlc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5pbnRlcmZhY2VzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FQdWJsaWNLZXlTcGVjOworCitAVGVzdFRhcmdldENsYXNzKFJTQVB1YmxpY0tleS5jbGFzcykKK3B1YmxpYyBjbGFzcyBSU0FQdWJsaWNLZXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHVibGljS2V5CisgICAgICogI2dldFB1YmxpY0V4cG9uZW50KCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHVibGljRXhwb25lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFB1YmxpY0V4cG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleUZhY3RvcnkgZ2VuID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSgiUlNBIiwgVXRpbC5wcm92KTsKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciBuID0gQmlnSW50ZWdlci52YWx1ZU9mKDMyMzMpOworICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIGUgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTcpOworICAgICAgICBSU0FQdWJsaWNLZXkga2V5ID0gKFJTQVB1YmxpY0tleSkgZ2VuLmdlbmVyYXRlUHVibGljKG5ldyBSU0FQdWJsaWNLZXlTcGVjKAorICAgICAgICAgICAgICAgIG4sIGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIHB1YmxpYyBleHBvbmVudCIsIGUsIGtleS5nZXRQdWJsaWNFeHBvbmVudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2ludGVyZmFjZXMvVXRpbC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWYzYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9pbnRlcmZhY2VzL1V0aWwuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuaW50ZXJmYWNlczsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tU3BpOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkRnA7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRWxsaXB0aWNDdXJ2ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHJpdmF0ZUNydEtleVNwZWM7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBwcm92aWRlIHNvbWUgY29uc3RhbnRzIAorICovCitjbGFzcyBVdGlsIHsKKworICAgIC8qKgorICAgICAqIEJvdW5jeUNhc3RsZSBwcm92aWRlcgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBQcm92aWRlciBwcm92ID0gbmV3IG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJvdW5jeUNhc3RsZVByb3ZpZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBWYWxpZCBQIGZvciBEU0EgdGVzdHMKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQID0gbmV3IEJpZ0ludGVnZXIoCisgICAgICAgICAgICAiMTc4NDc5NTcyMjgxODk2NTUxNjQ2MDA0MzY0NDc5MTg2MjQzMjc0NTU0MjUzNDQyOTcxNjc1MjAyNzEyMDM3MTY4IgorICAgICAgICAgICAgICAgICAgICArICI4MjgwNTQzOTE3MTI4Njc1NzAxMjYyMjc0MjI3MzU2NjYyODk1MzkyOTc4NDM4NTY1NDg1OTg5OCIKKyAgICAgICAgICAgICAgICAgICAgKyAiMjgwMTk5NDMyNjY0OTg5NzA2OTU4NzgwMTQ2OTk0MjM1NjU3NzU1MDAyODEwMTM2NjE2MDQ1NzMiCisgICAgICAgICAgICAgICAgICAgICsgIjA5MzUxMzcwOTQyNDQxODc5ODg5NDc3NjQ3NjY5NjY0ODc2ODA1OTk5MTYxMzU4Njc1MTIxOTA5IgorICAgICAgICAgICAgICAgICAgICArICIwMjg3NTQ2MTg0MDU1MDkzMjYyNDY1MjQwMjczMjMwNzE4NDg2MjA1MTgxMjExOTgwOTUxMDQ2NyIKKyAgICAgICAgICAgICAgICAgICAgKyAiNjk5NzE0OTQ5OTUzMzQ2NjM2MSIpOworCisgICAgLyoqCisgICAgICogVmFsaWQgUSBmb3IgRFNBIHRlc3RzCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUSA9IG5ldyBCaWdJbnRlZ2VyKAorICAgICAgICAgICAgIjc2NDkwNTQwODEwMDU0NDQxNzQ1Mjk1NzA1NzQwNDgxNTg1Mjg5NDUzNDcwOTQyMyIpOworCisgICAgLyoqCisgICAgICogVmFsaWQgRyBmb3IgRFNBIHRlc3RzCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRyA9IG5ldyBCaWdJbnRlZ2VyKAorICAgICAgICAgICAgIjI1MDM0NjMwMzg3MDQ4MjgyODUzMDg0MjE3Njk4NjM5MzQxNTUxMzA3MTkxMjkzNzA0MTQyNTMyMjAxMjM2MTAxMiIKKyAgICAgICAgICAgICAgICAgICAgKyAiMTY1NzU3MjU2ODk3MDY4MjE4NTU5MjkyNjUwNzUyNjU0MjM4MTcwMDk0OTc3OTg5NDg5MTQ3OTMiCisgICAgICAgICAgICAgICAgICAgICsgIjM2MjcyNzY5NzIxNTY3ODc2ODI2OTQ5MDcwNTM4NjcxNDM4NjM2NjI2NzE1MzA4MjE2MDY0NjEwIgorICAgICAgICAgICAgICAgICAgICArICI5MTE2MTU3Mzg4NTk5MTA3MDk4NDU4MDYwNzY1MjU0MTg0NTEyNzM5OTg2NTY2MTUyMDE5MTcyNiIKKyAgICAgICAgICAgICAgICAgICAgKyAiNDc4MTg5MTMzODY2MTg5NjgyMjk4MzUxNzg0NDYxMDQ1NjY1NDM4MTQ1Nzc0MzYzMTI2ODUwMjEiCisgICAgICAgICAgICAgICAgICAgICsgIjcxMzk3OTQxNDE1MzU1NzUzNyIpOworICAgIAorICAgIC8qKgorICAgICAqIFZhbHVlIHJldHVybmVkIHVzaW5nIE15U2VjdXJlUmFuZG9tU3BpIAorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFJORF9SRVQgPSBuZXcgQmlnSW50ZWdlcigiMTAiKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZCBSU0EgcGFyYW1ldGVycworICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBSU0FQcml2YXRlQ3J0S2V5U3BlYyByc2FDcnRQYXJhbSA9IG5ldyBSU0FQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigzMjMzKSwgQmlnSW50ZWdlci52YWx1ZU9mKDE3KSwKKyAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigyNzUzKSwgQmlnSW50ZWdlci52YWx1ZU9mKDYxKSwKKyAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZig1MyksIEJpZ0ludGVnZXIudmFsdWVPZig1MyksCisgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoNDkpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoNTIpKTsKKworICAgIC8qKgorICAgICAqIFZhbGlkIEVDIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgRUNQYXJhbWV0ZXJTcGVjIGVjUGFyYW0gPSBuZXcgRUNQYXJhbWV0ZXJTcGVjKAorICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzKSksCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZig1KSwgQmlnSW50ZWdlci52YWx1ZU9mKDMpKSwgCisgICAgICAgICAgICBuZXcgRUNQb2ludChCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIEJpZ0ludGVnZXIudmFsdWVPZigzKSksCisgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMjMpLCAxKTsKKyAgICAKKyAgICBwcml2YXRlIFV0aWwoKSB7CisgICAgfQorfQorCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gcHJvdmlkZSAicmFuZG9tIiBkYXRhLgorICogUmV0dXJuZWQgdmFsdWUgaXMgYWx3YXlzIGNvbnN0YW50IDEwIGlmIGNvbnZlcnRlZCB0byBCaWdJbnRlZ2VyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorY2xhc3MgTXlTZWN1cmVSYW5kb21TcGkgZXh0ZW5kcyBTZWN1cmVSYW5kb21TcGkgeworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lR2VuZXJhdGVTZWVkKGludCBhcmcwKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZU5leHRCeXRlcyhieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKGJ5dGVzLCAoYnl0ZSkgMCk7CisgICAgICAgIGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdID0gKGJ5dGUpIDEwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVNldFNlZWQoYnl0ZVtdIGFyZzApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9GaWxlSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFJb0ZpbGVJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTMyMmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9GaWxlSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKgorICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgorICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKKyAqIGZvciBjbGFzcyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBhbmQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHlNYW5hZ2VyLmNsYXNzKQorcHVibGljIGNsYXNzIEphdmFJb0ZpbGVJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9sZCA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBGaWxlRGVzY3JpcHRvcigpIGNvbnN0cnVjdG9yIGNhbGxzIGNoZWNrUmVhZCAiICsKKyAgICAgICAgICAgICJtZXRob2Qgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1JlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1JlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9GaWxlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbGFzcyBUZXN0U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2FsbGVkOworICAgICAgICAgICAgU3RyaW5nIGZpbGU7CisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBmZDsKKyAgICAgICAgICAgIHZvaWQgcmVzZXQoKXsKKyAgICAgICAgICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaWxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrUmVhZChGaWxlRGVzY3JpcHRvciBmZCkgeworICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5mZCA9IGZkOworICAgICAgICAgICAgICAgIHN1cGVyLmNoZWNrUmVhZChmZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrUmVhZChTdHJpbmcgZmlsZSl7CisgICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICAgICAgICAgIHN1cGVyLmNoZWNrUmVhZChmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgaWQgPSBuZXcgamF2YS51dGlsLkRhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICJTZWN1cml0eVBlcm1pc3Npb25zVGVzdF8iK2lkOworICAgICAgICBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGZpbGVuYW1lLCBudWxsKTsKKyAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgZmlsZW5hbWUgPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKKworICAgICAgICBUZXN0U2VjdXJpdHlNYW5hZ2VyIHMgPSBuZXcgVGVzdFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKHMpOworICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IG5ldyBGaWxlRGVzY3JpcHRvcigpOworICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGZkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZURlc2NyaXB0b3IoKSBjdG9yIG11c3QgY2FsbCBjaGVja1JlYWQgb24gc2VjdXJpdHkgbWFuYWdlciIsIHMuY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcmd1bWVudCBvZiBjaGVja1JlYWQgaXMgbm90IGNvcnJlY3QiLCBmZCwgcy5mZCk7CisgICAgICAgIAorICAgICAgICBzLnJlc2V0KCk7CisgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlRGVzY3JpcHRvcigpIGN0b3IgbXVzdCBjYWxsIGNoZWNrUmVhZCBvbiBzZWN1cml0eSBtYW5hZ2VyIiwgcy5jYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFyZ3VtZW50IG9mIGNoZWNrUmVhZCBpcyBub3QgY29ycmVjdCIsIGZpbGVuYW1lLCBzLmZpbGUpOworICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlRGVzY3JpcHRvcigpIGN0b3IgbXVzdCBjYWxsIGNoZWNrUmVhZCBvbiBzZWN1cml0eSBtYW5hZ2VyIiwgcy5jYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFyZ3VtZW50IG9mIGNoZWNrUmVhZCBpcyBub3QgY29ycmVjdCIsIGZpbGVuYW1lLCBzLmZpbGUpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUlvRmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUlvRmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ0NTJkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9GaWxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qCisgKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBzZWNyaXR5IHBlcm1pc3Npb25zIHdoaWNoIGFyZSBkb2N1bWVudGVkIGluCisgKiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9zZWN1cml0eS9wZXJtaXNzaW9ucy5odG1sI1Blcm1zQW5kTWV0aG9kcworICogZm9yIGNsYXNzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtIGFuZCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0KKyAqLworQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eU1hbmFnZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmF2YUlvRmlsZU91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9sZCA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgRmlsZU91dHB1dFN0cmVhbSBjb25zdHJ1Y3RvciBjYWxscyBjaGVja1JlYWQgIiArCisgICAgICAgICAgICAibWV0aG9kIG9mIHNlY3VyaXR5IG1hbmFnZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tSZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tSZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0ZpbGVPdXRwdXRTdHJlYW0xKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CisgICAgICAgICAgICBib29sZWFuIGNhbGxlZDsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlOworICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQ7CisgICAgICAgICAgICB2b2lkIHJlc2V0KCl7CisgICAgICAgICAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmlsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZmQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1dyaXRlKEZpbGVEZXNjcmlwdG9yIGZkKSB7CisgICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmZkID0gZmQ7CisgICAgICAgICAgICAgICAgc3VwZXIuY2hlY2tXcml0ZShmZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrV3JpdGUoU3RyaW5nIGZpbGUpeworICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgICAgICAgICBzdXBlci5jaGVja1dyaXRlKGZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9uZyBpZCA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gIlNlY3VyaXR5UGVybWlzc2lvbnNUZXN0XyIraWQ7CisgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZmlsZW5hbWUsIG51bGwpOworICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICBmaWxlbmFtZSA9IGYuZ2V0Q2Fub25pY2FsUGF0aCgpOworCisgICAgICAgIFRlc3RTZWN1cml0eU1hbmFnZXIgcyA9IG5ldyBUZXN0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIocyk7CisgICAgICAgIAorICAgICAgICBzLnJlc2V0KCk7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gbmV3IEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZU91dHB1dFN0cmVhbShGaWxlRGVzY3JpcHRvcikgY3RvciBtdXN0IGNhbGwgY2hlY2tXcml0ZSBvbiBzZWN1cml0eSBtYW5hZ2VyIiwgcy5jYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFyZ3VtZW50IG9mIGNoZWNrV3JpdGUgaXMgbm90IGNvcnJlY3QiLCBmZCwgcy5mZCk7CisgICAgICAgIAorICAgICAgICBzLnJlc2V0KCk7CisgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlT3V0cHV0U3RyZWFtKEZpbGUpIGN0b3IgbXVzdCBjYWxsIGNoZWNrV3JpdGUgb24gc2VjdXJpdHkgbWFuYWdlciIsIHMuY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcmd1bWVudCBvZiBjaGVja1dyaXRlIGlzIG5vdCBjb3JyZWN0IiwgZmlsZW5hbWUsIHMuZmlsZSk7IAorICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGVPdXRwdXRTdHJlYW0oU3RyaW5nKSBjdG9yIG11c3QgY2FsbCBjaGVja1dyaXRlIG9uIHNlY3VyaXR5IG1hbmFnZXIiLCBzLmNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXJndW1lbnQgb2YgY2hlY2tXcml0ZSBpcyBub3QgY29ycmVjdCIsIGZpbGVuYW1lLCBzLmZpbGUpOworICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGVPdXRwdXRTdHJlYW0oU3RyaW5nLGJvb2xlYW4pIGN0b3IgbXVzdCBjYWxsIGNoZWNrV3JpdGUgb24gc2VjdXJpdHkgbWFuYWdlciIsIHMuY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcmd1bWVudCBvZiBjaGVja1dyaXRlIGlzIG5vdCBjb3JyZWN0IiwgZmlsZW5hbWUsIHMuZmlsZSk7IAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUlvRmlsZVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUlvRmlsZVRlc3QuamF2YQppbmRleCBkMGU0OTgyLi44NGI5OWI2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFJb0ZpbGVUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9GaWxlVGVzdC5qYXZhCkBAIC0xNiwxOCArMTYsMjQgQEAKIAogcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5wZXJtaXNzaW9uczsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiAvKgogICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgogICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKICAqIGZvciBjbGFzcyBqYXZhLmlvLkZpbGUuCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHlNYW5hZ2VyLmNsYXNzKQogcHVibGljIGNsYXNzIEphdmFJb0ZpbGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIAogICAgIFNlY3VyaXR5TWFuYWdlciBvbGQ7CkBAIC00NCw3ICs1MCwxNiBAQAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KICAgICAKLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgRmlsZS5kZWxldGUgYW5kIEZpbGUuZGVsZXRlT25FeGl0IG1ldGhvZHMgIiArCisgICAgICAgICAgICAiY2FsbCBjaGVja0RlbGV0ZSBtZXRob2Qgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja0RlbGV0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0ZpbGUxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZDsKQEAgLTgzLDcgKzk4LDE4IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiQXJndW1lbnQgb2YgY2hlY2tEZWxldGUgaXMgbm90IGNvcnJlY3QiLCBmaWxlbmFtZSwgcy5maWxlbmFtZSk7CiAgICAgfQogICAgIAotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgRmlsZS5leGlzdHMoKSwgRmlsZS5jYW5SZWFkKCksIEZpbGUuaXNGaWxlKCksICIgKworICAgICAgICAgICAgIkZpbGUuaXNEaXJlY3RvcnkoKSwgRmlsZS5pc0hpZGRlbigpLCBGaWxlLmxhc3RNb2RpZmllZCgpLCAiICsKKyAgICAgICAgICAgICJGaWxlLmxlbmd0aCgpLCBGaWxlLmxpc3QoLi4uKSwgRmlsZS5saXN0RmlsZXMoLi4uKSBtZXRob2RzICIgKworICAgICAgICAgICAgImNhbGwgIGNoZWNrUmVhZCBtZXRob2Qgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1JlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9GaWxlMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CkBAIC0xNzAsNyArMTk2LDE2IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiQXJndW1lbnQgb2YgY2hlY2tSZWFkIGlzIG5vdCBjb3JyZWN0IiwgZmlsZW5hbWUsIHMuZmlsZSk7CiAgICAgfQogCi0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHdyaXRlL2NyZWF0ZSBtZXRob2RzIG9mIEZpbGUgY2xhc3MgY2FsbCAiICsKKyAgICAgICAgICAgICJjaGVja1dyaXRlIG1ldGhvZCBvZiBzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrV3JpdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9GaWxlMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFJb09iamVjdElucHV0U3RyZWFtVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9PYmplY3RJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWU3NjliCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9PYmplY3RJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5wZXJtaXNzaW9uczsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5Ob3RBY3RpdmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZVBlcm1pc3Npb247CitpbXBvcnQgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworCisvKgorICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgorICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKKyAqIGZvciBjbGFzc2VzCisgKiAgICBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtCisgKiAgICBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbQorICovCitAVGVzdFRhcmdldENsYXNzKFNlY3VyaXR5TWFuYWdlci5jbGFzcykKK3B1YmxpYyBjbGFzcyBKYXZhSW9PYmplY3RJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9sZCA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgT2JqZWN0SW5wdXRTdHJlYW0uZW5hYmxlUmVzb2x2ZU9iamVjdCBtZXRob2QgIiArCisgICAgICAgICAgICAiY2FsbHMgY2hlY2tQZXJtaXNzaW9uIG9mIHNlY3VyaXR5IG1hbmFnZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9PYmplY3RJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgeworICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CisgICAgICAgICAgICBQZXJtaXNzaW9uIHBlcm1pc3Npb247CisgICAgICAgICAgICB2b2lkIHJlc2V0KCl7CisgICAgICAgICAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm1pc3Npb24peworICAgICAgICAgICAgICAgIGlmKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBTZXJpYWxpemFibGVQZXJtaXNzaW9uKXsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VwZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUZXN0T2JqZWN0SW5wdXRTdHJlYW0gaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGNhbGwgZW5hYmxlUmVzb2x2ZU9iamVjdAorICAgICAgICBjbGFzcyBUZXN0T2JqZWN0SW5wdXRTdHJlYW0gZXh0ZW5kcyBPYmplY3RJbnB1dFN0cmVhbSAgeworICAgICAgICAgICAgVGVzdE9iamVjdElucHV0U3RyZWFtKElucHV0U3RyZWFtIHMpIHRocm93cyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlUmVzb2x2ZU9iamVjdChib29sZWFuIGVuYWJsZSkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW5hYmxlUmVzb2x2ZU9iamVjdChlbmFibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9uZyBpZCA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lICA9ICJTZWN1cml0eVBlcm1pc3Npb25zVGVzdF8iK2lkOworICAgICAgICBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGZpbGVuYW1lLCBudWxsKTsKKyAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICBUZXN0T2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IFRlc3RPYmplY3RJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKworICAgICAgICBUZXN0U2VjdXJpdHlNYW5hZ2VyIHMgPSBuZXcgVGVzdFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKHMpOworICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBvaXMuZW5hYmxlUmVzb2x2ZU9iamVjdCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0SW5wdXRTdHJlYW0uZW5hYmxlUmVzb2x2ZU9iamVjdChib29sZWFuKSBtdXN0IGNhbGwgY2hlY2tQZXJtaXNzaW9uIG9uIHNlY3VyaXR5IG1hbmFnZXIiLCBzLmNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTmFtZSBvZiBTZXJpYWxpemFibGVQZXJtaXNzaW9uIGlzIG5vdCBjb3JyZWN0IiwgImVuYWJsZVN1YnN0aXR1dGlvbiIsIHMucGVybWlzc2lvbi5nZXROYW1lKCkpOworICAgIH0KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IE9iamVjdElucHV0U3RyZWFtIGNvbnN0cnVjdG9yIGNhbGxzICIgKworICAgICAgICAgICAgImNoZWNrUGVybWlzc2lvbiBtZXRob2Qgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Blcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X09iamVjdElucHV0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CisgICAgICAgICAgICBib29sZWFuIGNhbGxlZDsKKyAgICAgICAgICAgIFBlcm1pc3Npb24gcGVybWlzc2lvbjsKKyAgICAgICAgICAgIHZvaWQgcmVzZXQoKXsKKyAgICAgICAgICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFBlcm1pc3Npb24gcGVybWlzc2lvbil7CisgICAgICAgICAgICAgICAgaWYocGVybWlzc2lvbiBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZVBlcm1pc3Npb24peworICAgICAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb24gPSBwZXJtaXNzaW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBlci5jaGVja1Blcm1pc3Npb24ocGVybWlzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEJlZ2lubmluZyB3aXRoIEoyU0UgMS40LjAsIE9iamVjdE91dHB1dFN0cmVhbSdzIHB1YmxpYyBvbmUtYXJndW1lbnQgY29uc3RydWN0b3IKKyAgICAgICAgLy8gcmVxdWlyZXMgdGhlICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIiBTZXJpYWxpemFibGVQZXJtaXNzaW9uIHdoZW4gaW52b2tlZAorICAgICAgICAvLyAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGJ5IGEgc3ViY2xhc3Mgd2hpY2ggb3ZlcnJpZGVzIAorICAgICAgICAvLyBPYmplY3RPdXRwdXRTdHJlYW0ucHV0RmllbGRzIG9yIE9iamVjdE91dHB1dFN0cmVhbS53cml0ZVVuc2hhcmVkLgorICAgICAgICAvLworICAgICAgICAvLyBBbHNvIGJlZ2lubmluZyB3aXRoIEoyU0UgMS40LjAsIE9iamVjdElucHV0U3RyZWFtJ3MgcHVibGljIG9uZS1hcmd1bWVudCAKKyAgICAgICAgLy8gY29uc3RydWN0b3IgcmVxdWlyZXMgdGhlICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIiBTZXJpYWxpemFibGVQZXJtaXNzaW9uIAorICAgICAgICAvLyB3aGVuIGludm9rZWQgKGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBieSBhIHN1YmNsYXNzIHdoaWNoIG92ZXJyaWRlcyAKKyAgICAgICAgLy8gT2JqZWN0SW5wdXRTdHJlYW0ucmVhZEZpZWxkcyBvciBPYmplY3RJbnB1dFN0cmVhbS5yZWFkVW5zaGFyZWQuCisKKyAgICAgICAgCisgICAgICAgIGNsYXNzIFRlc3RPYmplY3RJbnB1dFN0cmVhbSBleHRlbmRzIE9iamVjdElucHV0U3RyZWFtICB7CisgICAgICAgICAgICBUZXN0T2JqZWN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gcykgdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjbGFzcyBUZXN0T2JqZWN0SW5wdXRTdHJlYW1fcmVhZEZpZWxkcyBleHRlbmRzIE9iamVjdElucHV0U3RyZWFtICB7CisgICAgICAgICAgICBUZXN0T2JqZWN0SW5wdXRTdHJlYW1fcmVhZEZpZWxkcyhJbnB1dFN0cmVhbSBzKSB0aHJvd3MgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc3VwZXIocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBHZXRGaWVsZCByZWFkRmllbGRzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb3RBY3RpdmVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZWFkRmllbGRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNsYXNzIFRlc3RPYmplY3RJbnB1dFN0cmVhbV9yZWFkVW5zaGFyZWQgZXh0ZW5kcyBPYmplY3RJbnB1dFN0cmVhbSAgeworICAgICAgICAgICAgVGVzdE9iamVjdElucHV0U3RyZWFtX3JlYWRVbnNoYXJlZChJbnB1dFN0cmVhbSBzKSB0aHJvd3MgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc3VwZXIocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcmVhZFVuc2hhcmVkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVhZFVuc2hhcmVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBsb25nIGlkID0gbmV3IGphdmEudXRpbC5EYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgID0gIlNlY3VyaXR5UGVybWlzc2lvbnNUZXN0XyIraWQ7CisgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZmlsZW5hbWUsIG51bGwpOworICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAKKyAgICAgICAgVGVzdFNlY3VyaXR5TWFuYWdlciBzID0gbmV3IFRlc3RTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzKTsKKyAgICAgICAgCisgICAgICAgIHMucmVzZXQoKTsKKyAgICAgICAgbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOworICAgICAgICBhc3NlcnRUcnVlKCJPYmplY3RJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSkgY3RvciBtdXN0IG5vdCBjYWxsIGNoZWNrUGVybWlzc2lvbiBvbiBzZWN1cml0eSBtYW5hZ2VyIG9uIGEgY2xhc3Mgd2hpY2ggbmVpdGhlciBvdmVyd3JpdGVzIG1ldGhvZHMgcmVhZEZpZWxkcyBub3IgcmVhZFVuc2hhcmVkIiwgIXMuY2FsbGVkKTsKKyAgICAgICAgCisgICAgICAgIHMucmVzZXQoKTsKKyAgICAgICAgbmV3IFRlc3RPYmplY3RJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0pIGN0b3IgbXVzdCBub3QgY2FsbCBjaGVja1Blcm1pc3Npb24gb24gc2VjdXJpdHkgbWFuYWdlciBvbiBhIGNsYXNzIHdoaWNoIG5laXRoZXIgb3ZlcndyaXRlcyBtZXRob2RzIHJlYWRGaWVsZHMgbm9yIHJlYWRVbnNoYXJlZCIsICFzLmNhbGxlZCk7CisgICAgICAgIAorICAgICAgICBzLnJlc2V0KCk7CisgICAgICAgIG5ldyBUZXN0T2JqZWN0SW5wdXRTdHJlYW1fcmVhZEZpZWxkcyhuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0pIGN0b3IgbXVzdCBjYWxsIGNoZWNrUGVybWlzc2lvbiBvbiBzZWN1cml0eSBtYW5hZ2VyIG9uIGEgY2xhc3Mgd2hpY2ggb3ZlcndyaXRlcyBtZXRob2QgcmVhZEZpZWxkcyIsIHMuY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOYW1lIG9mIFNlcmlhbGl6YWJsZVBlcm1pc3Npb24gaXMgbm90IGNvcnJlY3QiLCAiZW5hYmxlU3ViY2xhc3NJbXBsZW1lbnRhdGlvbiIsIHMucGVybWlzc2lvbi5nZXROYW1lKCkpOworICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBuZXcgVGVzdE9iamVjdElucHV0U3RyZWFtX3JlYWRVbnNoYXJlZChuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0pIGN0b3IgbXVzdCBjYWxsIGNoZWNrUGVybWlzc2lvbiBvbiBzZWN1cml0eSBtYW5hZ2VyIG9uIGEgY2xhc3Mgd2hpY2ggb3ZlcndyaXRlcyBtZXRob2QgcmVhZFVuc2hhcmVkIiwgcy5jYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5hbWUgb2YgU2VyaWFsaXphYmxlUGVybWlzc2lvbiBpcyBub3QgY29ycmVjdCIsICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIiwgcy5wZXJtaXNzaW9uLmdldE5hbWUoKSk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9PYmplY3RPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFJb09iamVjdE91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMyZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9PYmplY3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGVQZXJtaXNzaW9uOworaW1wb3J0IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKKworLyoKKyAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIHNlY3JpdHkgcGVybWlzc2lvbnMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4KKyAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL3NlY3VyaXR5L3Blcm1pc3Npb25zLmh0bWwjUGVybXNBbmRNZXRob2RzCisgKiBmb3IgY2xhc3NlcworICogICAgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbQorICogICAgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0KKyAqLworQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eU1hbmFnZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmF2YUlvT2JqZWN0T3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAKKyAgICBTZWN1cml0eU1hbmFnZXIgb2xkOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb2xkID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob2xkKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBlbmFibGVSZXBsYWNlT2JqZWN0KGJvb2xlYW4pIG1ldGhvZCBjYWxscyAiICsKKyAgICAgICAgICAgICJjaGVja1Blcm1pc3Npb24gb24gc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Blcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X09iamVjdE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgeworICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CisgICAgICAgICAgICBQZXJtaXNzaW9uIHBlcm1pc3Npb247CisgICAgICAgICAgICB2b2lkIHJlc2V0KCl7CisgICAgICAgICAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm1pc3Npb24peworICAgICAgICAgICAgICAgIGlmKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBTZXJpYWxpemFibGVQZXJtaXNzaW9uKXsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VwZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUZXN0T2JqZWN0T3V0cHV0U3RyZWFtIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBjYWxsIGVuYWJsZVJlcGxhY2VPYmplY3QKKyAgICAgICAgY2xhc3MgVGVzdE9iamVjdE91dHB1dFN0cmVhbSBleHRlbmRzIE9iamVjdE91dHB1dFN0cmVhbSAgeworICAgICAgICAgICAgVGVzdE9iamVjdE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcykgdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVSZXBsYWNlT2JqZWN0KGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5lbmFibGVSZXBsYWNlT2JqZWN0KGVuYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIGlkID0gbmV3IGphdmEudXRpbC5EYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgID0gIlNlY3VyaXR5UGVybWlzc2lvbnNUZXN0XyIraWQ7CisgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZmlsZW5hbWUsIG51bGwpOworICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOworCisgICAgICAgIFRlc3RPYmplY3RPdXRwdXRTdHJlYW0gb2lzID0gbmV3IFRlc3RPYmplY3RPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpOworCisgICAgICAgIFRlc3RTZWN1cml0eU1hbmFnZXIgcyA9IG5ldyBUZXN0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIocyk7CisgICAgICAgIAorICAgICAgICBzLnJlc2V0KCk7CisgICAgICAgIG9pcy5lbmFibGVSZXBsYWNlT2JqZWN0KHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJPYmplY3RPdXRwdXRTdHJlYW0uZW5hYmxlUmVwbGFjZU9iamVjdChib29sZWFuKSBtdXN0IGNhbGwgY2hlY2tQZXJtaXNzaW9uIG9uIHNlY3VyaXR5IG1hbmFnZXIiLCBzLmNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTmFtZSBvZiBTZXJpYWxpemFibGVQZXJtaXNzaW9uIGlzIG5vdCBjb3JyZWN0IiwgImVuYWJsZVN1YnN0aXR1dGlvbiIsIHMucGVybWlzc2lvbi5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgT2JqZWN0T3V0cHV0U3RyZWFtIGNvbnN0cnVjdG9yIGNhbGxzICIgKworICAgICAgICAgICAgImNoZWNrUGVybWlzc2lvbiBvZiBzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfT2JqZWN0SW5wdXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbGFzcyBUZXN0U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2FsbGVkOworICAgICAgICAgICAgUGVybWlzc2lvbiBwZXJtaXNzaW9uOworICAgICAgICAgICAgdm9pZCByZXNldCgpeworICAgICAgICAgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKXsKKyAgICAgICAgICAgICAgICBpZihwZXJtaXNzaW9uIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlUGVybWlzc2lvbil7CisgICAgICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbiA9IHBlcm1pc3Npb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cGVyLmNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQmVnaW5uaW5nIHdpdGggSjJTRSAxLjQuMCwgT2JqZWN0T3V0cHV0U3RyZWFtJ3MgcHVibGljIG9uZS1hcmd1bWVudCBjb25zdHJ1Y3RvcgorICAgICAgICAvLyByZXF1aXJlcyB0aGUgImVuYWJsZVN1YmNsYXNzSW1wbGVtZW50YXRpb24iIFNlcmlhbGl6YWJsZVBlcm1pc3Npb24gd2hlbiBpbnZva2VkCisgICAgICAgIC8vIChlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgYnkgYSBzdWJjbGFzcyB3aGljaCBvdmVycmlkZXMgCisgICAgICAgIC8vIE9iamVjdE91dHB1dFN0cmVhbS5wdXRGaWVsZHMgb3IgT2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlVW5zaGFyZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEFsc28gYmVnaW5uaW5nIHdpdGggSjJTRSAxLjQuMCwgT2JqZWN0SW5wdXRTdHJlYW0ncyBwdWJsaWMgb25lLWFyZ3VtZW50IAorICAgICAgICAvLyBjb25zdHJ1Y3RvciByZXF1aXJlcyB0aGUgImVuYWJsZVN1YmNsYXNzSW1wbGVtZW50YXRpb24iIFNlcmlhbGl6YWJsZVBlcm1pc3Npb24gCisgICAgICAgIC8vIHdoZW4gaW52b2tlZCAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGJ5IGEgc3ViY2xhc3Mgd2hpY2ggb3ZlcnJpZGVzIAorICAgICAgICAvLyBPYmplY3RJbnB1dFN0cmVhbS5yZWFkRmllbGRzIG9yIE9iamVjdElucHV0U3RyZWFtLnJlYWRVbnNoYXJlZC4KKworICAgICAgICBjbGFzcyBUZXN0T2JqZWN0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT2JqZWN0T3V0cHV0U3RyZWFtICB7CisgICAgICAgICAgICBUZXN0T2JqZWN0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc3VwZXIocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNsYXNzIFRlc3RPYmplY3RPdXRwdXRTdHJlYW1fcHV0RmllbGRzIGV4dGVuZHMgT2JqZWN0T3V0cHV0U3RyZWFtICB7CisgICAgICAgICAgICBUZXN0T2JqZWN0T3V0cHV0U3RyZWFtX3B1dEZpZWxkcyhPdXRwdXRTdHJlYW0gcykgdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlIAorICAgICAgICAgICAgcHVibGljIFB1dEZpZWxkIHB1dEZpZWxkcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnB1dEZpZWxkcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjbGFzcyBUZXN0T2JqZWN0T3V0cHV0U3RyZWFtX3dyaXRlVW5zaGFyZWQgZXh0ZW5kcyBPYmplY3RPdXRwdXRTdHJlYW0gIHsKKyAgICAgICAgICAgIFRlc3RPYmplY3RPdXRwdXRTdHJlYW1fd3JpdGVVbnNoYXJlZChPdXRwdXRTdHJlYW0gcykgdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlIAorICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGVVbnNoYXJlZChPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlVW5zaGFyZWQob2JqZWN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsb25nIGlkID0gbmV3IGphdmEudXRpbC5EYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgID0gIlNlY3VyaXR5UGVybWlzc2lvbnNUZXN0XyIraWQ7CisgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZmlsZW5hbWUsIG51bGwpOworICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAKKyAgICAgICAgVGVzdFNlY3VyaXR5TWFuYWdlciBzID0gbmV3IFRlc3RTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzKTsKKyAgICAgICAgCisgICAgICAgIHMucmVzZXQoKTsKKyAgICAgICAgbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmKSk7CisgICAgICAgIGFzc2VydFRydWUoIk9iamVjdE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0pIGN0b3IgbXVzdCBub3QgY2FsbCBjaGVja1Blcm1pc3Npb24gb24gc2VjdXJpdHkgbWFuYWdlciBvbiBhIGNsYXNzIHdoaWNoIG5laXRoZXIgb3ZlcndyaXRlcyB3cml0ZVVuc2hhcmVkIG5vciBwdXRGaWVsZHMiLCAhcy5jYWxsZWQpOworICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBuZXcgVGVzdE9iamVjdE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmKSk7CisgICAgICAgIGFzc2VydFRydWUoIk9iamVjdE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0pIGN0b3IgbXVzdCBub3QgY2FsbCBjaGVja1Blcm1pc3Npb24gb24gc2VjdXJpdHkgbWFuYWdlciBvbiBhIGNsYXNzIHdoaWNoIG5laXRoZXIgb3ZlcndyaXRlcyB3cml0ZVVuc2hhcmVkIG5vciBwdXRGaWVsZHMiLCAhcy5jYWxsZWQpOworICAgICAgICAKKyAgICAgICAgcy5yZXNldCgpOworICAgICAgICBuZXcgVGVzdE9iamVjdE91dHB1dFN0cmVhbV93cml0ZVVuc2hhcmVkKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2JqZWN0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSkgY3RvciBtdXN0IGNhbGwgY2hlY2tQZXJtaXNzaW9uIG9uIHNlY3VyaXR5IG1hbmFnZXIgb24gYSBjbGFzcyB3aGljaCBvdmVyd3JpdGVzIG1ldGhvZCB3cml0ZVVuc2hhcmVkIiwgcy5jYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5hbWUgb2YgU2VyaWFsaXphYmxlUGVybWlzc2lvbiBpcyBub3QgY29ycmVjdCIsICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIiwgcy5wZXJtaXNzaW9uLmdldE5hbWUoKSk7CisgICAgICAgIAorICAgICAgICBzLnJlc2V0KCk7CisgICAgICAgIG5ldyBUZXN0T2JqZWN0T3V0cHV0U3RyZWFtX3B1dEZpZWxkcyhuZXcgRmlsZU91dHB1dFN0cmVhbShmKSk7CisgICAgICAgIGFzc2VydFRydWUoIk9iamVjdE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0pIGN0b3IgbXVzdCBjYWxsIGNoZWNrUGVybWlzc2lvbiBvbiBzZWN1cml0eSBtYW5hZ2VyIG9uIGEgY2xhc3Mgd2hpY2ggb3ZlcndyaXRlcyBtZXRob2QgcHV0RmllbGRzIiwgcy5jYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5hbWUgb2YgU2VyaWFsaXphYmxlUGVybWlzc2lvbiBpcyBub3QgY29ycmVjdCIsICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIiwgcy5wZXJtaXNzaW9uLmdldE5hbWUoKSk7CisgICAgICAKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFJb1JhbmRvbUFjY2Vzc0ZpbGVUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFJb1JhbmRvbUFjY2Vzc0ZpbGVUZXN0LmphdmEKaW5kZXggZWFiNmNiMi4uNWQ1OTg2MiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhSW9SYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUlvUmFuZG9tQWNjZXNzRmlsZVRlc3QuamF2YQpAQCAtMTYsMTcgKzE2LDIyIEBACiAKIHBhY2thZ2UgdGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnM7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwogLyoKICAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIHNlY3JpdHkgcGVybWlzc2lvbnMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4KICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL3NlY3VyaXR5L3Blcm1pc3Npb25zLmh0bWwjUGVybXNBbmRNZXRob2RzCiAgKiBmb3IgY2xhc3MgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHlNYW5hZ2VyLmNsYXNzKQogcHVibGljIGNsYXNzIEphdmFJb1JhbmRvbUFjY2Vzc0ZpbGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIAogICAgIFNlY3VyaXR5TWFuYWdlciBvbGQ7CkBAIC00Myw2ICs0OCwxNiBAQAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KICAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IFJhbmRvbUFjY2Vzc0ZpbGUgY29uc3RydWN0b3IgY2FsbHMgY2hlY2tSZWFkICIgKworICAgICAgICAgICAgIm1ldGhvZCBvZiBzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUmVhZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1JhbmRvbUFjY2Vzc0ZpbGUxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZDsKQEAgLTc5LDcgKzk0LDIwIEBACiAgICAgICAgIGFzc2VydEVxdWFscygiQXJndW1lbnQgb2YgY2hlY2tSZWFkIGlzIG5vdCBjb3JyZWN0IiwgZmlsZW5hbWUsIHMuZmlsZSk7CiAgICAgfQogICAgIAotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgUmFuZG9tQWNjZXNzRmlsZSBjb25zdHJ1Y3RvciBjYWxscyAiICsKKyAgICAgICAgICAgICJjaGVja1JlYWRGaWxlLCBjaGVja1dyaXRlRmlsZSBtZXRob2RzIG9mIHNlY3VyaXR5IG1hbmFnZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tSZWFkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tXcml0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1JhbmRvbUFjY2Vzc0ZpbGUyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNoZWNrUmVhZENhbGxlZDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUxhbmdDbGFzc0xvYWRlclRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUxhbmdDbGFzc0xvYWRlclRlc3QuamF2YQppbmRleCA0Mjc0N2E2Li44YWIwYTI0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFMYW5nQ2xhc3NMb2FkZXJUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTGFuZ0NsYXNzTG9hZGVyVGVzdC5qYXZhCkBAIC0xNiwxNSArMTYsMjEgQEAKIAogcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5wZXJtaXNzaW9uczsKIAotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CisKIC8qCiAgKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBzZWNyaXR5IHBlcm1pc3Npb25zIHdoaWNoIGFyZSBkb2N1bWVudGVkIGluCiAgKiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9zZWN1cml0eS9wZXJtaXNzaW9ucy5odG1sI1Blcm1zQW5kTWV0aG9kcwogICogZm9yIGNsYXNzIGphdmEubGFuZy5DbGFzc0xvYWRlcgogICovCitAVGVzdFRhcmdldENsYXNzKFNlY3VyaXR5TWFuYWdlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBKYXZhTGFuZ0NsYXNzTG9hZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBTZWN1cml0eU1hbmFnZXIgb2xkOwpAQCAtNDEsNyArNDcsMTYgQEAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAgICAgCi0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBDbGFzc0xvYWRlciBjb25zdHJ1Y3RvciBjYWxscyAiICsKKyAgICAgICAgICAgICJjaGVja0NyZWF0ZUNsYXNzTG9hZGVyIG9mIHNlY3VyaXR5IG1hbmFnZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tDcmVhdGVDbGFzc0xvYWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ2xhc3NMb2FkZXJDdG9yICgpIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZDsKQEAgLTcyLDYgKzg3LDE2IEBACiAgICAgICAgIGFzc2VydFRydWUoIkNsYXNzTG9hZGVyIGN0b3IgbXVzdCBjYWxsIGNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIgb24gc2VjdXJpdHkgbWFuYWdlciIsIHMuY2FsbGVkKTsKICAgICB9CiAgICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpIGNoZWNrcyAiICsKKyAgICAgICAgICAgICJSdW50aW1lUGVybWlzc2lvbihnZXRDbGFzc0xvYWRlcikgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Blcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUNsYXNzTG9hZGVyICgpIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUxhbmdDbGFzc1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUxhbmdDbGFzc1Rlc3QuamF2YQppbmRleCBmYWRhMzhmLi43ZjY4NzEwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFMYW5nQ2xhc3NUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTGFuZ0NsYXNzVGVzdC5qYXZhCkBAIC0xNiwxNSArMTYsMjEgQEAKIAogcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5wZXJtaXNzaW9uczsKIAotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CisKIC8qCiAgKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBzZWNyaXR5IHBlcm1pc3Npb25zIHdoaWNoIGFyZSBkb2N1bWVudGVkIGluCiAgKiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9zZWN1cml0eS9wZXJtaXNzaW9ucy5odG1sI1Blcm1zQW5kTWV0aG9kcwogICogZm9yIGNsYXNzIGphdmEubGFuZy5DbGFzcwogICovCitAVGVzdFRhcmdldENsYXNzKGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSmF2YUxhbmdDbGFzc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZDsKQEAgLTQxLDcgKzQ3LDE2IEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogICAgIAotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgQ2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpIGNoZWNrcyAiICsKKyAgICAgICAgICAgICJSdW50aW1lUGVybWlzc2lvbiBvZiBzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdGVjdGlvbkRvbWFpbiAoKSB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CkBAIC02Nyw3ICs4MiwxNiBAQAogICAgICAgICBjLmdldFByb3RlY3Rpb25Eb21haW4oKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpIG11c3QgY2hlY2sgUnVudGltZVBlcm1pc3Npb24oXCJnZXRQcm90ZWN0aW9uRG9tYWluXCIpIG9uIHNlY3VyaXR5IG1hbmFnZXIiLCBzLmNhbGxlZCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBmb3JOYW1lKFN0cmluZyxib29sZWFuLENsYXNzbG9hZGVyKSBtZXRob2QgIiArCisgICAgICAgICAgICAiY2hlY2tzIFJ1bnRpbWVQZXJtaXNzaW9uKGdldENsYXNzTG9hZGVyKSBvZiBzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ2xhc3MoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFMYW5nU3lzdGVtVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTGFuZ1N5c3RlbVRlc3QuamF2YQppbmRleCA4YWMzYTMwLi5hMWI2ZGM0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFMYW5nU3lzdGVtVGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YUxhbmdTeXN0ZW1UZXN0LmphdmEKQEAgLTE2LDE5ICsxNiwyNCBAQAogCiBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiAvKgogICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgogICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKICAqIGZvciBjbGFzcyBqYXZhLmxhbmcuU3lzdGVtCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBKYXZhTGFuZ1N5c3RlbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZDsKQEAgLTQ0LDcgKzQ5LDE2IEBACiAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob2xkKTsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRQcm9wZXJ0aWVzIGNhbGxzIGNoZWNrUHJvcGVydGllc0FjY2VzcyAiICsKKyAgICAgICAgICAgICJtZXRob2Qgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Byb3BlcnRpZXNBY2Nlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1Byb3BlcnRpZXMoKSB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CkBAIC03MSw3ICs4NSwxNiBAQAogICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wcyk7CiAgICAgICAgIGFzc2VydFRydWUoIlN5c3RlbS5zZXRQcm9wZXJ0aWVzIG11c3QgY2FsbCBjaGVja1Byb3BlcnRpZXNBY2Nlc3Mgb24gc2VjdXJpdHkgbWFuYWdlciIsIHMuY2FsbGVkKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBTeXN0ZW0uZ2V0UHJvcGVydHkgY2FsbHMgY2hlY2tQcm9wZXJ0eUFjY2VzcyBvbiAiICsKKyAgICAgICAgICAgICJzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUHJvcGVydHlBY2Nlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eSgpIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZDsKQEAgLTEwMyw3ICsxMjYsMTYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtLmdldFByb3BlcnR5IG11c3QgY2FsbCBjaGVja1Byb3BlcnR5QWNjZXNzIG9uIHNlY3VyaXR5IG1hbmFnZXIiLCBzLmNhbGxlZCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQXJndW1lbnQgb2YgY2hlY2tQcm9wZXJ0eUFjY2VzcyBpcyBub3QgY29ycmVjdCIsICJrZXkiLCBzLmtleSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBTeXN0ZW0uc2V0UHJvcGVydHkgbWV0aG9kIGNhbGxzICIgKworICAgICAgICAgICAgImNoZWNrUGVybWlzc2lvbiBvZiBzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJvcGVydHkoKSB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQ7CkBAIC0xMzAsNyArMTYyLDE2IEBACiAgICAgICAgIGFzc2VydFRydWUoIlN5c3RlbS5zZXRQcm9wZXJ0eSBtdXN0IGNhbGwgY2hlY2tQZXJtaXNzaW9uIG9uIHNlY3VyaXR5IG1hbmFnZXIiLCBzLmNhbGxlZCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQXJndW1lbnQgb2YgY2hlY2tQZXJtaXNzaW9uIGlzIG5vdCBjb3JyZWN0IiwgbmV3IFByb3BlcnR5UGVybWlzc2lvbigia2V5IiwgIndyaXRlIiksIHMucCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyIG1ldGhvZCBjaGVja3MgIiArCisgICAgICAgICAgICAic2VjdXJpdHkgcGVybWlzc2lvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTZWN1cml0eU1hbmFnZXIoKSB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQgPSBmYWxzZTsKQEAgLTE0OSw3ICsxOTAsMTYgQEAKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlciBtdXN0IGNoZWNrIHNlY3VyaXR5IHBlcm1pc3Npb25zIiwgcy5jYWxsZWQpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHNldEluL091dC9FcnIgbWV0aG9kcyBjYWxsIGNoZWNrUGVybWlzc2lvbiAiICsKKyAgICAgICAgICAgICJtZXRob2Qgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1Blcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEluT3V0RXJyKCkgewogICAgICAgICBjbGFzcyBUZXN0U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKICAgICAgICAgICAgIGJvb2xlYW4gY2FsbGVkOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTmV0RGF0YWdyYW1Tb2NrZXRUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFOZXREYXRhZ3JhbVNvY2tldFRlc3QuamF2YQppbmRleCBiN2U0YTZjLi5mNGE4MTVhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFOZXREYXRhZ3JhbVNvY2tldFRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFOZXREYXRhZ3JhbVNvY2tldFRlc3QuamF2YQpAQCAtMTYsMTkgKzE2LDI1IEBACiAKIHBhY2thZ2UgdGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OwogaW1wb3J0IGphdmEubmV0LkRhdGFncmFtU29ja2V0OwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiAvKgogICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgogICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKICAqIGZvciBjbGFzcyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldAogICovCitAVGVzdFRhcmdldENsYXNzKFNlY3VyaXR5TWFuYWdlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBKYXZhTmV0RGF0YWdyYW1Tb2NrZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIAogICAgIFNlY3VyaXR5TWFuYWdlciBvbGQ7CkBAIC00NCw3ICs1MCwxNiBAQAogICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZCk7CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQgY29uc3RydWN0b3IgY2FsbHMgIiArCisgICAgICAgICAgICAiY2hlY2tMaXN0ZW4gb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja0xpc3RlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YU5ldE11bHRpY2FzdFNvY2tldFRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YU5ldE11bHRpY2FzdFNvY2tldFRlc3QuamF2YQppbmRleCBjYWI3YjA0Li5jYjViZTU5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFOZXRNdWx0aWNhc3RTb2NrZXRUZXN0LmphdmEKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTmV0TXVsdGljYXN0U29ja2V0VGVzdC5qYXZhCkBAIC0xNiwxNiArMTYsMjIgQEAKIAogcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5wZXJtaXNzaW9uczsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0OworCiAvKgogICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgogICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKICAqIGZvciBjbGFzcyBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQKICAqLworQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eU1hbmFnZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSmF2YU5ldE11bHRpY2FzdFNvY2tldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZDsKQEAgLTQxLDcgKzQ3LDE2IEBACiAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob2xkKTsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQoaW50KSBjb25zcnVjdG9yIGNhbGxzICIgKworICAgICAgICAgICAgImNoZWNrTGlzdGVuIG9mIHNlY3VyaXR5IHBlcm1pc3Npb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrTGlzdGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTmV0U2VydmVyU29ja2V0VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTmV0U2VydmVyU29ja2V0VGVzdC5qYXZhCmluZGV4IDJlNDMwMzguLmIzZDM5YTYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YU5ldFNlcnZlclNvY2tldFRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFOZXRTZXJ2ZXJTb2NrZXRUZXN0LmphdmEKQEAgLTE2LDE2ICsxNiwyMSBAQAogCiBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CiAvKgogICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgogICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKICAqIGZvciBjbGFzcyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQKICAqLworQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eU1hbmFnZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSmF2YU5ldFNlcnZlclNvY2tldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZDsKQEAgLTQxLDcgKzQ2LDE2IEBACiAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob2xkKTsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IgY2FsbHMgIiArCisgICAgICAgICAgICAiY2hlY2tMaXN0ZW4gb2Ygc2VjdXJpdHkgcGVybWlzc2lvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tMaXN0ZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2N0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjbGFzcyBUZXN0U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKICAgICAgICAgICAgIGJvb2xlYW4gY2FsbGVkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFOZXRTb2NrZXRUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFOZXRTb2NrZXRUZXN0LmphdmEKaW5kZXggOTdhNzUxOS4uOGJhOGYwNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhTmV0U29ja2V0VGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YU5ldFNvY2tldFRlc3QuamF2YQpAQCAtMTYsMTYgKzE2LDIxIEBACiAKIHBhY2thZ2UgdGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnM7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKIC8qCiAgKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBzZWNyaXR5IHBlcm1pc3Npb25zIHdoaWNoIGFyZSBkb2N1bWVudGVkIGluCiAgKiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9zZWN1cml0eS9wZXJtaXNzaW9ucy5odG1sI1Blcm1zQW5kTWV0aG9kcwogICogZm9yIGNsYXNzIGphdmEubmV0LlNvY2tldAogICovCitAVGVzdFRhcmdldENsYXNzKFNlY3VyaXR5TWFuYWdlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBKYXZhTmV0U29ja2V0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBTZWN1cml0eU1hbmFnZXIgb2xkOwpAQCAtNDEsNyArNDYsMTYgQEAKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvbGQpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGphdmEubmV0LlNlcnZlclNvY2tldCBjb25zdHJ1Y3RvciBjYWxscyAiICsKKyAgICAgICAgICAgICJjaGVja0Nvbm5lY3Qgb2Ygc2VjdXJpdHkgcGVybWlzc2lvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tDb25uZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhU2VjdXJpdHlQb2xpY3lUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFTZWN1cml0eVBvbGljeVRlc3QuamF2YQppbmRleCBmM2U5YmJkLi5hMjhjMzQwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFTZWN1cml0eVBvbGljeVRlc3QuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFTZWN1cml0eVBvbGljeVRlc3QuamF2YQpAQCAtMTYsMTcgKzE2LDIyIEBACiAKIHBhY2thZ2UgdGVzdHMuc2VjdXJpdHkucGVybWlzc2lvbnM7CiAKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qb2xpY3k7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb247CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUG9saWN5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uOwogLyoKICAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIHNlY3JpdHkgcGVybWlzc2lvbnMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4KICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL3NlY3VyaXR5L3Blcm1pc3Npb25zLmh0bWwjUGVybXNBbmRNZXRob2RzCiAgKiBmb3IgY2xhc3MgamF2YS5zZWN1cml0eS5Qb2xpY3kKICAqLworQFRlc3RUYXJnZXRDbGFzcyhTZWN1cml0eU1hbmFnZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSmF2YVNlY3VyaXR5UG9saWN5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBTZWN1cml0eU1hbmFnZXIgb2xkOwpAQCAtNDIsNyArNDcsMTYgQEAKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvbGQpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGphdmEuc2VjdXJpdHkuUG9saWN5LmdldFBvbGljeSgpIG1ldGhvZCBjYWxscyAiICsKKyAgICAgICAgICAgICJjaGVja1Blcm1pc3Npb24gb2Ygc2VjdXJpdHkgcGVybWlzc2lvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQb2xpY3koKSB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQgPSBmYWxzZTsKQEAgLTY1LDcgKzc5LDE2IEBACiAgICAgICAgIFBvbGljeS5nZXRQb2xpY3koKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiamF2YS5zZWN1cml0eS5Qb2xpY3kuZ2V0UG9saWN5KCkgbXVzdCBjYWxsIGNoZWNrUGVybWlzc2lvbiBvbiBzZWN1cml0eSBwZXJtaXNzaW9ucyIsIHMuY2FsbGVkKTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBqYXZhLnNlY3VyaXR5LlBvbGljeS5zZXRQb2xpY3koKSBtZXRob2QgY2FsbHMgIiArCisgICAgICAgICAgICAiY2hlY2tQZXJtaXNzaW9uIG9uIHNlY3VyaXR5IHBlcm1pc3Npb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UG9saWN5KCkgewogICAgICAgICBjbGFzcyBUZXN0U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKICAgICAgICAgICAgIGJvb2xlYW4gY2FsbGVkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFTZWN1cml0eVNlY3VyaXR5VGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhU2VjdXJpdHlTZWN1cml0eVRlc3QuamF2YQppbmRleCAzMGE3Nzc0Li5jNjU4ODZjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFTZWN1cml0eVNlY3VyaXR5VGVzdC5qYXZhCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YVNlY3VyaXR5U2VjdXJpdHlUZXN0LmphdmEKQEAgLTE2LDIwICsxNiwyNSBAQAogCiBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiAvKgogICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgc2Vjcml0eSBwZXJtaXNzaW9ucyB3aGljaCBhcmUgZG9jdW1lbnRlZCBpbgogICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvcGVybWlzc2lvbnMuaHRtbCNQZXJtc0FuZE1ldGhvZHMKICAqIGZvciBjbGFzcyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VjdXJpdHlNYW5hZ2VyLmNsYXNzKQogcHVibGljIGNsYXNzIEphdmFTZWN1cml0eVNlY3VyaXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBTZWN1cml0eU1hbmFnZXIgb2xkOwpAQCAtNDUsNyArNTAsMTYgQEAKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvbGQpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldFByb3BlcnR5KCkgbWV0aG9kIGNhbGxzIGNoZWNrUGVybWlzc2lvbiAiICsKKyAgICAgICAgICAgICJtZXRob2Qgb2Ygc2VjdXJpdHkgcGVybWlzc2lvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2hlY2tQZXJtaXNzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuUGVybWlzc2lvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eSgpIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZCA9IGZhbHNlOwpAQCAtNjksNiArODMsMTYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiamF2YS5zZWN1cml0eS5TZWN1cml0eS5nZXRQcm9wZXJ0eSgpIG11c3QgY2FsbCBjaGVja1Blcm1pc3Npb24gb24gc2VjdXJpdHkgcGVybWlzc2lvbnMiLCBzLmNhbGxlZCk7CiAgICAgfQogICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgc2V0UHJvcGVydHkoKSBtZXRob2QgY2FsbHMgY2hlY2tTZWN1cml0eUFjY2VzcyAiICsKKyAgICAgICAgICAgICJtZXRob2Qgb2Ygc2VjdXJpdHkgbWFuYWdlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjaGVja1NlY3VyaXR5QWNjZXNzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJvcGVydHkoKSB7CiAgICAgICAgIGNsYXNzIFRlc3RTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewogICAgICAgICAgICAgYm9vbGVhbiBjYWxsZWQgPSBmYWxzZTsKQEAgLTkzLDcgKzExNywxNiBAQAogICAgICAgICBhc3NlcnRUcnVlKCJqYXZhLnNlY3VyaXR5LlNlY3VyaXR5LnNldFByb3BlcnR5KCkgbXVzdCBjYWxsIGNoZWNrU2VjdXJpdHlBY2Nlc3Mgb24gc2VjdXJpdHkgbWFuYWdlciIsIHMuY2FsbGVkKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcmd1bWVudCBvZiBjaGVja1NlY3VyaXR5QWNjZXNzIGlzIG5vdCBjb3JyZWN0IiwgInNldFByb3BlcnR5LmtleSIsIHMudGFyZ2V0KTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBhZGRQcm92aWRlcigpLCByZW1vdmVQcm92aWRlcigpIG1ldGhvZHMgY2FsbCAiICsKKyAgICAgICAgICAgICJjaGVja1NlY3VyaXR5QWNjZXNzIG1ldGhvZCBvZiBzZWN1cml0eSBtYW5hZ2VyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrU2VjdXJpdHlBY2Nlc3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Qcm92aWRlcigpIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhVXRpbExvY2FsZS5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9wZXJtaXNzaW9ucy9KYXZhVXRpbExvY2FsZS5qYXZhCmluZGV4IGUwNTYyYjEuLjlmOTkyYzYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvcGVybWlzc2lvbnMvSmF2YVV0aWxMb2NhbGUuamF2YQorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3Blcm1pc3Npb25zL0phdmFVdGlsTG9jYWxlLmphdmEKQEAgLTE2LDE3ICsxNiwyMiBAQAogCiBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnBlcm1pc3Npb25zOwogCi1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uOwogLyoKICAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIHNlY3JpdHkgcGVybWlzc2lvbnMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4KICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL3NlY3VyaXR5L3Blcm1pc3Npb25zLmh0bWwjUGVybXNBbmRNZXRob2RzCiAgKiBmb3IgY2xhc3MgamF2YS51dGlsLkxvY2FsZQogICovCitAVGVzdFRhcmdldENsYXNzKFNlY3VyaXR5TWFuYWdlci5jbGFzcykKIHB1YmxpYyBjbGFzcyBKYXZhVXRpbExvY2FsZSBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKICAgICBTZWN1cml0eU1hbmFnZXIgb2xkOwpAQCAtNDIsNyArNDcsMTYgQEAKICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihvbGQpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLSAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGphdmEudXRpbC5Mb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUpIG1ldGhvZCAiICsKKyAgICAgICAgICAgICJjYWxscyBjaGVja1Blcm1pc3Npb24gbWV0aG9kIG9mIHNlY3VyaXR5IHBlcm1pc3Npb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNoZWNrUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdCgpIHsKICAgICAgICAgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CiAgICAgICAgICAgICBib29sZWFuIGNhbGxlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0FsbFRlc3RzLmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU5ODgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5zcGVjOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBUaGlzIGlzIGF1dG9nZW5lcmF0ZWQgc291cmNlIGZpbGUuIEluY2x1ZGVzIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisgKi8KKworcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKEFsbFRlc3RzLnN1aXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIHRlc3RzIGZvciBwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7Iik7CisgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKKworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRFNBUGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRFNBUHJpdmF0ZUtleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERTQVB1YmxpY0tleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVDRmllbGRGMm1UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVDRmllbGRGcFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRUNHZW5QYXJhbWV0ZXJTcGVjVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShFQ1BhcmFtZXRlclNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVDUG9pbnRUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVDUHJpdmF0ZUtleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVDUHVibGljS2V5U3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRWxsaXB0aWNDdXJ2ZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRW5jb2RlZEtleVNwZWMyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShFbmNvZGVkS2V5U3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW52YWxpZEtleVNwZWNFeGNlcHRpb25UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNR0YxUGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUEtDUzhFbmNvZGVkS2V5U3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUFNTUGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUlNBS2V5R2VuUGFyYW1ldGVyU3BlY1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSU0FPdGhlclByaW1lSW5mb1Rlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUlNBUHJpdmF0ZUNydEtleVNwZWNUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJTQVByaXZhdGVLZXlTcGVjVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSU0FQdWJsaWNLZXlTcGVjVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShYNTA5RW5jb2RlZEtleVNwZWNUZXN0LmNsYXNzKTsKKworICAgICAgICAvLyAkSlVuaXQtRU5EJAorICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0RTQVBhcmFtZXRlclNwZWNUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRFNBUGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTEzNWIxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0RTQVBhcmFtZXRlclNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjOworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5EU0FQYXJhbWV0ZXJTcGVjPC9jb2RlPgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRFNBUGFyYW1ldGVyU3BlYy5jbGFzcykKK3B1YmxpYyBjbGFzcyBEU0FQYXJhbWV0ZXJTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEU0FQYXJhbWV0ZXJTcGVjVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBEU0FQYXJhbWV0ZXJTcGVjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdG9yIHRlc3QgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRTQVBhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdERTQVBhcmFtZXRlclNwZWMoKSB7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgYXBzID0gbmV3IERTQVBhcmFtZXRlclNwZWMoCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjEiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMiIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIzIikpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZShhcHMgaW5zdGFuY2VvZiBEU0FQYXJhbWV0ZXJTcGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRHKCkgdGVzdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEcoKSB7CisgICAgICAgIERTQVBhcmFtZXRlclNwZWMgZHBzID0gbmV3IERTQVBhcmFtZXRlclNwZWMoCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjEiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMiIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIzIikpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGRwcy5nZXRHKCkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0UCgpIHRlc3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQKCkgeworICAgICAgICBEU0FQYXJhbWV0ZXJTcGVjIGRwcyA9IG5ldyBEU0FQYXJhbWV0ZXJTcGVjKAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxIiksCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjIiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMyIpKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygxLCBkcHMuZ2V0UCgpLmludFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldFEoKSB0ZXN0IAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRRIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFEoKSB7CisgICAgICAgIERTQVBhcmFtZXRlclNwZWMgZHBzID0gbmV3IERTQVBhcmFtZXRlclNwZWMoCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjEiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMiIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIzIikpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRwcy5nZXRRKCkuaW50VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0RTQVByaXZhdGVLZXlTcGVjVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0RTQVByaXZhdGVLZXlTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODBhNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRFNBUHJpdmF0ZUtleVNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQcml2YXRlS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYzsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RFNBUHJpdmF0ZUtleVNwZWM8L2NvZGU+CisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhEU0FQcml2YXRlS2V5U3BlYy5jbGFzcykKK3B1YmxpYyBjbGFzcyBEU0FQcml2YXRlS2V5U3BlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRFNBUHJpdmF0ZUtleVNwZWNUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIERTQVByaXZhdGVLZXlTcGVjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEU0FQcml2YXRlS2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdERTQVByaXZhdGVLZXlTcGVjKCkgeworICAgICAgICBLZXlTcGVjIGtzID0gbmV3IERTQVByaXZhdGVLZXlTcGVjKAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxIiksCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjIiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMyIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCI0IikpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZShrcyBpbnN0YW5jZW9mIERTQVByaXZhdGVLZXlTcGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRHKCkgdGVzdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEcoKSB7CisgICAgICAgIERTQVByaXZhdGVLZXlTcGVjIGRwa3MgPSBuZXcgRFNBUHJpdmF0ZUtleVNwZWMoCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjEiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMiIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIzIiksCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjQiKSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZHBrcy5nZXRHKCkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0UCgpIHRlc3QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQKCkgeworICAgICAgICBEU0FQcml2YXRlS2V5U3BlYyBkcGtzID0gbmV3IERTQVByaXZhdGVLZXlTcGVjKAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxIiksCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjIiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMyIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCI0IikpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRwa3MuZ2V0UCgpLmludFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldFEoKSB0ZXN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFEiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0USgpIHsKKyAgICAgICAgRFNBUHJpdmF0ZUtleVNwZWMgZHBrcyA9IG5ldyBEU0FQcml2YXRlS2V5U3BlYygKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMSIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIyIiksCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjMiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiNCIpKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygzLCBkcGtzLmdldFEoKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRYKCkgdGVzdAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRYIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFgoKSB7CisgICAgICAgIERTQVByaXZhdGVLZXlTcGVjIGRwa3MgPSBuZXcgRFNBUHJpdmF0ZUtleVNwZWMoCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjEiKSwKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMiIpLAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIzIiksCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjQiKSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZHBrcy5nZXRYKCkuaW50VmFsdWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRFNBUHVibGljS2V5U3BlY1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9EU0FQdWJsaWNLZXlTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NWQwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRFNBUHVibGljS2V5U3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkRTQVB1YmxpY0tleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkRTQVB1YmxpY0tleVNwZWM8L2NvZGU+CisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhEU0FQdWJsaWNLZXlTcGVjLmNsYXNzKQorcHVibGljIGNsYXNzIERTQVB1YmxpY0tleVNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERTQVB1YmxpY0tleVNwZWNUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIERTQVB1YmxpY0tleVNwZWNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkRTQVB1YmxpY0tleVNwZWM8L2NvZGU+IGN0b3IKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRFNBUHVibGljS2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdERTQVB1YmxpY0tleVNwZWMoKSB7CisgICAgICAgIEtleVNwZWMga3MgPSBuZXcgRFNBUHVibGljS2V5U3BlYygKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMSIpLCAvLyB5CisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjIiKSwgLy8gcAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIzIiksIC8vIHEKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiNCIpKTsvLyBnCisgICAgICAgIAorICAgICAgICBhc3NlcnRUcnVlKGtzIGluc3RhbmNlb2YgRFNBUHVibGljS2V5U3BlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0RzwvY29kZT4gbWV0aG9kIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEcoKSB7CisgICAgICAgIERTQVB1YmxpY0tleVNwZWMgZHBrcyA9IG5ldyBEU0FQdWJsaWNLZXlTcGVjKAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxIiksIC8vIHkKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMiIpLCAvLyBwCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjMiKSwgLy8gcQorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCI0IikpOy8vIGcKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBkcGtzLmdldEcoKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQPC9jb2RlPiBtZXRob2QgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UCgpIHsKKyAgICAgICAgRFNBUHVibGljS2V5U3BlYyBkcGtzID0gbmV3IERTQVB1YmxpY0tleVNwZWMoCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjEiKSwgLy8geQorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIyIiksIC8vIHAKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMyIpLCAvLyBxCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjQiKSk7Ly8gZworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRwa3MuZ2V0UCgpLmludFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFE8L2NvZGU+IG1ldGhvZCAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0USIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRRKCkgeworICAgICAgICBEU0FQdWJsaWNLZXlTcGVjIGRwa3MgPSBuZXcgRFNBUHVibGljS2V5U3BlYygKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMSIpLCAvLyB5CisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjIiKSwgLy8gcAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIzIiksIC8vIHEKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiNCIpKTsvLyBnCisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoMywgZHBrcy5nZXRRKCkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0WTwvY29kZT4gbWV0aG9kIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRZIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFkoKSB7CisgICAgICAgIERTQVB1YmxpY0tleVNwZWMgZHBrcyA9IG5ldyBEU0FQdWJsaWNLZXlTcGVjKAorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCIxIiksIC8vIHkKKyAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigiMiIpLCAvLyBwCisgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoIjMiKSwgLy8gcQorICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCI0IikpOy8vIGcKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygxLCBkcGtzLmdldFkoKS5pbnRWYWx1ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRUNGaWVsZEYybVRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FQ0ZpZWxkRjJtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDhlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRUNGaWVsZEYybVRlc3QuamF2YQpAQCAtMCwwICsxLDc2NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGRGMm07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RUNGaWVsZEYybTwvY29kZT4gY2xhc3MgZmllbGRzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRUNGaWVsZEYybS5jbGFzcykKK3B1YmxpYyBjbGFzcyBFQ0ZpZWxkRjJtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgY2xhc3MgZm9yIHRoaXMgdGVzdC4KKyAgICAgKiBFbmNhcHN1bGF0ZXMgPGNvZGU+RUNGaWVsZEYybTwvY29kZT4gdGVzdGluZworICAgICAqIGRvbWFpbiBwYXJhbWV0ZXJzLiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogPGNvZGU+TlBFPC9jb2RlPiByZWZlcmVuY2Ugb2JqZWN0IG9mIGNsYXNzIE51bGxQb2ludGVyRXhjZXB0aW9uLgorICAgICAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biBieSA8Y29kZT5FQ0ZpZWxkRjJtPC9jb2RlPgorICAgICAgICAgKiBjdG9ycyBpbiBzb21lIGNpcmN1bXN0YW5jZXMKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBOUEUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxjb2RlPklBcmdFPC9jb2RlPiByZWZlcmVuY2Ugb2JqZWN0IG9mIGNsYXNzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KKyAgICAgICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGJ5IDxjb2RlPkVDRmllbGRGMm08L2NvZGU+CisgICAgICAgICAqIGN0b3JzIGluIHNvbWUgY2lyY3Vtc3RhbmNlcworICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJQXJnRSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgPGNvZGU+bTwvY29kZT4gcGFyYW1ldGVyIGZvciA8Y29kZT5FQ0ZpZWxkRjJtPC9jb2RlPgorICAgICAgICAgKiBjdG9yIGZvciB0aGUgY3VycmVudCB0ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgaW50IG07CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgPGNvZGU+cnA8L2NvZGU+IHBhcmFtZXRlciBmb3IgPGNvZGU+RUNGaWVsZEYybTwvY29kZT4KKyAgICAgICAgICogY3RvciBmb3IgdGhlIGN1cnJlbnQgdGVzdC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgcnA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgPGNvZGU+a3M8L2NvZGU+IHBhcmFtZXRlciBmb3IgPGNvZGU+RUNGaWVsZEYybTwvY29kZT4KKyAgICAgICAgICogY3RvciBmb3IgdGhlIGN1cnJlbnQgdGVzdC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGludFtdIGtzOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNlcHRpb24gZXhwZWN0ZWQgd2l0aCB0aGlzIHBhcmFtZXRlcnMgc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICAgICAqIGlmIG5vIGV4Y2VwdGlvbiBleHBlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiB4OworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgRUNGaWVsZEYybURvbWFpblBhcmFtcworICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG0KKyAgICAgICAgICogQHBhcmFtIHJwCisgICAgICAgICAqIEBwYXJhbSBrcworICAgICAgICAgKiBAcGFyYW0gZXhwZWN0ZWRFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIEVDRmllbGRGMm1Eb21haW5QYXJhbXMoZmluYWwgaW50IG0sCisgICAgICAgICAgICAgICAgZmluYWwgQmlnSW50ZWdlciBycCwKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnRbXSBrcywKKyAgICAgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb24gZXhwZWN0ZWRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMubSA9IG07CisgICAgICAgICAgICB0aGlzLnJwID0gcnA7CisgICAgICAgICAgICB0aGlzLmtzID0ga3M7CisgICAgICAgICAgICB0aGlzLnggPSBleHBlY3RlZEV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBFQ0ZpZWxkRjJtVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBFQ0ZpZWxkRjJtVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRlc3RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFNldCBvZiBwYXJhbWV0ZXJzIHVzZWQgZm9yIDxjb2RlPkVDRmllbGRGMm0oaW50KTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciB0ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEVDRmllbGRGMm1Eb21haW5QYXJhbXNbXSBpbnRDdG9yVGVzdFBhcmFtZXRlcnMgPQorICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtc1tdIHsKKyAgICAgICAgICAgIC8vIHNldCAwOiB2YWxpZCBtCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygxLCBudWxsLCBudWxsLCBudWxsKSwKKyAgICAgICAgICAgIC8vIHNldCAxOiB2YWxpZCBtCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcyhJbnRlZ2VyLk1BWF9WQUxVRSwgbnVsbCwgbnVsbCwgbnVsbCksCisgICAgICAgICAgICAvLyBzZXQgMjogaW52YWxpZCBtCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygwLCBudWxsLCBudWxsLCBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zLklBcmdFKSwKKyAgICAgICAgICAgIC8vIHNldCAzOiBpbnZhbGlkIG0KKyAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zKC0xLCBudWxsLCBudWxsLCBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zLklBcmdFKQorICAgICAgICB9OworCisgICAgLyoqCisgICAgICogVGVzdHMgZm9yIGNvbnN0cnVjdG9yIDxjb2RlPkVDRmllbGRGMm0oaW50KTwvY29kZT48YnI+CisgICAgICogCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIG5ldyA8Y29kZT5FQ0ZpZWxkRjJtPC9jb2RlPiBvYmplY3QKKyAgICAgKiB1c2luZyB2YWxpZCBwYXJhbWV0ZXIgbS4KKyAgICAgKiAKKyAgICAgKiBBc3NlcnRpb246IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtIGlzIG5vdCBwb3NpdGl2ZS4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRUNGaWVsZEYybSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFQ0ZpZWxkRjJtaW50KCkgeworICAgICAgICBmb3IoaW50IGk9MDsgaTxpbnRDdG9yVGVzdFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEVDRmllbGRGMm1Eb21haW5QYXJhbXMgdHAgPSBpbnRDdG9yVGVzdFBhcmFtZXRlcnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gdGVzdAorICAgICAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRjJtKHRwLm0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh0cC54ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIGhhcyBiZWVuIGV4cGVjdGVkIAorICAgICAgICAgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICIsIHNldCAiICsgaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBGQUlMRUQ6IGV4cGVjdGVkIGV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIGlmICh0cC54ID09IG51bGwgfHwgIWUuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKHRwLngpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbjogZmFpbHVyZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBoYXMgbm90IGJlZW4gZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gb3Igd3Jvbmcgb25lIGhhcyBiZWVuIHRocm93bgorICAgICAgICAgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICIsIHNldCAiICsgaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBGQUlMRUQ6IHVuZXhwZWN0ZWQgIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBvZiBwYXJhbWV0ZXJzIHVzZWQgZm9yIDxjb2RlPkVDRmllbGRGMm0oaW50LCBCaWdJbnRlZ2VyKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciB0ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEVDRmllbGRGMm1Eb21haW5QYXJhbXNbXSBpbnRJbnRBcnJheUN0b3JUZXN0UGFyYW1ldGVycyA9CisgICAgICAgIG5ldyBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zW10geworICAgICAgICAgICAgLy8gc2V0IDA6IHZhbGlkIG0gYW5kIGtzIC0gdHJpbm9taWFsIGJhc2lzIHBhcmFtcworICAgICAgICAgICAgbmV3IEVDRmllbGRGMm1Eb21haW5QYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIDE5OTksCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7MzY3fSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCksCisgICAgICAgICAgICAvLyBzZXQgMTogdmFsaWQgbSBhbmQga3MgLSBwZW50YW5vbWlhbCBiYXNpcyBwYXJhbXMKKyAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAyMDAwLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10gezk4MSwyLDF9LAorICAgICAgICAgICAgICAgICAgICBudWxsKSwKKyAgICAgICAgICAgIC8vIHNldCAyOiB2YWxpZCBtLCBpbnZhbGlkIChudWxsKSBrcworICAgICAgICAgICAgbmV3IEVDRmllbGRGMm1Eb21haW5QYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIDE5NjMsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIEVDRmllbGRGMm1Eb21haW5QYXJhbXMuTlBFKSwKKyAgICAgICAgICAgIC8vIHNldCAzOiB2YWxpZCBtLCBpbnZhbGlkIGtzIC0gd3JvbmcgbGVuZ3RoCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgMTk2MywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHs5ODEsMn0sCisgICAgICAgICAgICAgICAgICAgIEVDRmllbGRGMm1Eb21haW5QYXJhbXMuSUFyZ0UpLAorICAgICAgICAgICAgLy8gc2V0IDQ6IHZhbGlkIG0sIGludmFsaWQga3MgLSB3cm9uZyBsZW5ndGgKKyAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAxOTYzLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10gezk4MSwxMjQsMiwxfSwKKyAgICAgICAgICAgICAgICAgICAgRUNGaWVsZEYybURvbWFpblBhcmFtcy5JQXJnRSksCisgICAgICAgICAgICAvLyBzZXQgNTogdmFsaWQgbSwgaW52YWxpZCBrcyAtIHdyb25nIHZhbHVlCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgMTk5OSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsxOTk5fSwKKyAgICAgICAgICAgICAgICAgICAgRUNGaWVsZEYybURvbWFpblBhcmFtcy5JQXJnRSksCisgICAgICAgICAgICAvLyBzZXQgNjogdmFsaWQgbSwgaW52YWxpZCBrcyAtIHdyb25nIHZhbHVlCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgMTk5OSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHswfSwKKyAgICAgICAgICAgICAgICAgICAgRUNGaWVsZEYybURvbWFpblBhcmFtcy5JQXJnRSksCisgICAgICAgICAgICAvLyBzZXQgNzogdmFsaWQgbSwgaW52YWxpZCBrcyAtIHdyb25nIHZhbHVlcworICAgICAgICAgICAgbmV3IEVDRmllbGRGMm1Eb21haW5QYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIDIwMDAsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7MjAwMCwyLDF9LAorICAgICAgICAgICAgICAgICAgICBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zLklBcmdFKSwKKyAgICAgICAgICAgIC8vIHNldCA4OiB2YWxpZCBtLCBpbnZhbGlkIGtzIC0gd3JvbmcgdmFsdWVzCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHs5ODEsMiwwfSwKKyAgICAgICAgICAgICAgICAgICAgRUNGaWVsZEYybURvbWFpblBhcmFtcy5JQXJnRSksCisgICAgICAgICAgICAvLyBzZXQgOTogaW52YWxpZCBtCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgLTUsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7OTgxLDIsMX0sCisgICAgICAgICAgICAgICAgICAgIEVDRmllbGRGMm1Eb21haW5QYXJhbXMuSUFyZ0UpLAorICAgICAgICAgICAgLy8gc2V0IDEwOiB2YWxpZCBtLCBpbnZhbGlkIGtzIC0gd3Jvbmcgb3JkZXIKKyAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAyMDAwLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10gezk4MSwxLDJ9LAorICAgICAgICAgICAgICAgICAgICBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zLklBcmdFKSwKKyAgICAgICAgICAgIC8vIHNldCAxMTogdmFsaWQgbSwgaW52YWxpZCBrcyAtIG5vIGNvbnRlbnQKKyAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAyMDAwLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBuZXcgaW50WzNdLAorICAgICAgICAgICAgICAgICAgICBFQ0ZpZWxkRjJtRG9tYWluUGFyYW1zLklBcmdFKSwKKyAgICAgICAgICAgIC8vIHNldCAxMjogdmFsaWQgbSwgaW52YWxpZCBrcyAtIGxlbmd0aCBpcyAwCisgICAgICAgICAgICBuZXcgRUNGaWVsZEYybURvbWFpblBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFswXSwKKyAgICAgICAgICAgICAgICAgICAgRUNGaWVsZEYybURvbWFpblBhcmFtcy5JQXJnRSksCisgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBmb3IgY29uc3RydWN0b3IgPGNvZGU+RUNGaWVsZEYybShpbnQgbSwgaW50W10ga3MpPC9jb2RlPjxicj4KKyAgICAgKiAKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgbmV3IDxjb2RlPkVDRmllbGRGMm08L2NvZGU+IG9iamVjdAorICAgICAqIHVzaW5nIHZhbGlkIHBhcmFtZXRlcnMgbSBhbmQgcnAuIGtzIHJlcHJlc2VudHMgdHJpbm9taWFsIGJhc2lzLgorICAgICAqIAorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBuZXcgPGNvZGU+RUNGaWVsZEYybTwvY29kZT4gb2JqZWN0CisgICAgICogdXNpbmcgdmFsaWQgcGFyYW1ldGVycyBtIGFuZCBrcy4ga3MgcmVwcmVzZW50cyBwZW50YW5vbWlhbCBiYXNpcy4KKyAgICAgKiAKKyAgICAgKiBBc3NlcnRpb246IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtIGlzIG5vdCBwb3NpdGl2ZS4KKyAgICAgKiAKKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGtzIGlzIG51bGwuCisgICAgICogCisgICAgICogQXNzZXJ0aW9uOiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYga3MgaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJFeGNlcHRpb24gY2FzZXMgd2VyZW4ndCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVDRmllbGRGMm0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVDRmllbGRGMm1pbnRpbnRBcnJheSgpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8aW50SW50QXJyYXlDdG9yVGVzdFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEVDRmllbGRGMm1Eb21haW5QYXJhbXMgdHAgPSBpbnRJbnRBcnJheUN0b3JUZXN0UGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybSB0ZXN0CisgICAgICAgICAgICAgICAgbmV3IEVDRmllbGRGMm0odHAubSwgdHAua3MpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh0cC54ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIGhhcyBiZWVuIGV4cGVjdGVkIAorICAgICAgICAgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICIsIHNldCAiICsgaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBGQUlMRUQ6IGV4cGVjdGVkIGV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIGlmICh0cC54ID09IG51bGwgfHwgIWUuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKHRwLngpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbjogZmFpbHVyZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBoYXMgbm90IGJlZW4gZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gb3Igd3Jvbmcgb25lIGhhcyBiZWVuIHRocm93bgorICAgICAgICAgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICIsIHNldCAiICsgaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBGQUlMRUQ6IHVuZXhwZWN0ZWQgIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmhhc2hDb2RlKCk8L2NvZGU+IG1ldGhvZC48YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGlmIGludm9rZWQKKyAgICAgKiByZXBlYXRlZGx5IG9uIHRoZSBzYW1lIG9iamVjdC4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFzaENvZGUwMSgpIHsKKyAgICAgICAgRUNGaWVsZEYybSBmID0gbmV3IEVDRmllbGRGMm0oMjAwMCk7CisgICAgICAgIGludCBoYyA9IGYuaGFzaENvZGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmhhc2hDb2RlKCk8L2NvZGU+IG1ldGhvZC48YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGlmIGludm9rZWQKKyAgICAgKiByZXBlYXRlZGx5IG9uIHRoZSBzYW1lIG9iamVjdC4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFzaENvZGUwMigpIHsKKyAgICAgICAgRUNGaWVsZEYybSBmID0gbmV3IEVDRmllbGRGMm0oMjAwMCwgbmV3IGludFtdIHs5ODEsIDIsIDF9KTsKKyAgICAgICAgaW50IGhjID0gZi5oYXNoQ29kZSgpOworICAgICAgICBhc3NlcnRUcnVlKGhjID09IGYuaGFzaENvZGUoKSAmJgorICAgICAgICAgICAgICAgICAgIGhjID09IGYuaGFzaENvZGUoKSAmJgorICAgICAgICAgICAgICAgICAgIGhjID09IGYuaGFzaENvZGUoKSAmJgorICAgICAgICAgICAgICAgICAgIGhjID09IGYuaGFzaENvZGUoKSAmJgorICAgICAgICAgICAgICAgICAgIGhjID09IGYuaGFzaENvZGUoKSAmJgorICAgICAgICAgICAgICAgICAgIGhjID09IGYuaGFzaENvZGUoKSAmJgorICAgICAgICAgICAgICAgICAgIGhjID09IGYuaGFzaENvZGUoKSAmJgorICAgICAgICAgICAgICAgICAgIGhjID09IGYuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+aGFzaENvZGUoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogbXVzdCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgaWYgaW52b2tlZAorICAgICAqIG9uIGVxdWFsIChhY2NvcmRpbmcgdG8gdGhlIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiBtZXRob2QpIG9iamVjdHMuIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEhhc2hDb2RlMDMoKSB7CisgICAgICAgIGFzc2VydFRydWUobmV3IEVDRmllbGRGMm0oMTExKS5oYXNoQ29kZSgpID09CisgICAgICAgICAgICAgICAgICAgbmV3IEVDRmllbGRGMm0oMTExKS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5oYXNoQ29kZSgpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiBtdXN0IHJldHVybiB0aGUgc2FtZSB2YWx1ZSBpZiBpbnZva2VkCisgICAgICogb24gZXF1YWwgKGFjY29yZGluZyB0byB0aGUgPGNvZGU+ZXF1YWxzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkgb2JqZWN0cy4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFzaENvZGUwNCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRUNGaWVsZEYybSgyMDAwLCBuZXcgaW50W10gezk4MSwgMiwgMX0pLmhhc2hDb2RlKCkgPT0KKyAgICAgICAgICAgICAgICAgICBuZXcgRUNGaWVsZEYybSgyMDAwLCBuZXcgaW50W10gezk4MSwgMiwgMX0pLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzUgZm9yIDxjb2RlPmhhc2hDb2RlKCk8L2NvZGU+IG1ldGhvZC48YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGlmIGludm9rZWQKKyAgICAgKiBvbiBlcXVhbCAoYWNjb3JkaW5nIHRvIHRoZSA8Y29kZT5lcXVhbHMoT2JqZWN0KTwvY29kZT4gbWV0aG9kKSBvYmplY3RzLiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RIYXNoQ29kZTA1KCkgeworICAgICAgICBhc3NlcnRUcnVlKG5ldyBFQ0ZpZWxkRjJtKDIwMDAsIG5ldyBpbnRbXSB7OTgxLCAyLCAxfSkuaGFzaENvZGUoKSA9PQorICAgICAgICAgICAgICAgICAgIG5ldyBFQ0ZpZWxkRjJtKDIwMDAsIEJpZ0ludGVnZXIudmFsdWVPZigwTCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qml0KDApLnNldEJpdCgxKS5zZXRCaXQoMikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qml0KDk4MSkuc2V0Qml0KDIwMDApKS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5lcXVhbHMoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogb2JqZWN0IGVxdWFscyB0byBpdHNlbGYuIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0MDEoKSB7CisgICAgICAgIEVDRmllbGRGMm0gb2JqID0gbmV3IEVDRmllbGRGMm0oMTk5OSwgbmV3IGludFtdIHszNjd9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouZXF1YWxzKG9iaikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmVxdWFscygpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiBub3JtYWwgYmFzaXMgLSBvYmplY3RzIGVxdWFsIGlmIHRoZWlyIG0gYXJlIGVxdWFsLiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJTaW1wbGUgdGVzdC4gRG9lc25cJ3QgdmVyaWZ5IG90aGVyIGNhc2VzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0MDIoKSB7CisgICAgICAgIGFzc2VydFRydWUobmV3IEVDRmllbGRGMm0oNDMpLmVxdWFscyhuZXcgRUNGaWVsZEYybSg0MykpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5lcXVhbHMoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogdHJpbm9taWFsIGJhc2lzIC0gb2JqZWN0cyBlcXVhbCBpZiB0aGVpciBtLCBhbmQgcnAKKyAgICAgKiBhcmUgbXV0dWFsbHkgZXF1YWwuIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0MDMoKSB7CisgICAgICAgIGFzc2VydFRydWUobmV3IEVDRmllbGRGMm0oMTk5OSwgbmV3IGludFtdIHszNjd9KS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgbmV3IEVDRmllbGRGMm0oMTk5OSwgQmlnSW50ZWdlci52YWx1ZU9mKDBMKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRCaXQoMCkuc2V0Qml0KDM2Nykuc2V0Qml0KDE5OTkpKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzQgZm9yIDxjb2RlPmVxdWFscygpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiBwZW50YW5vbWlhbCBiYXNpcyAtIG9iamVjdHMgZXF1YWwgaWYgdGhlaXIgbSwgYW5kIHJwCisgICAgICogYXJlIG11dHVhbGx5IGVxdWFsLiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDA0KCkgeworICAgICAgICBFQ0ZpZWxkRjJtIGYxID0gbmV3IEVDRmllbGRGMm0oMjAwMCwgbmV3IGludFtdIHs5ODEsIDIsIDF9KTsKKyAgICAgICAgRUNGaWVsZEYybSBmMiA9IG5ldyBFQ0ZpZWxkRjJtKDIwMDAsIEJpZ0ludGVnZXIudmFsdWVPZigwTCkuCisgICAgICAgICAgICAgICAgc2V0Qml0KDApLnNldEJpdCgxKS5zZXRCaXQoMikuCisgICAgICAgICAgICAgICAgc2V0Qml0KDk4MSkuc2V0Qml0KDIwMDApKTsgCisgICAgICAgIGFzc2VydFRydWUoZjEuZXF1YWxzKGYyKSAmJiBmMi5lcXVhbHMoZjEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM1IGZvciA8Y29kZT5lcXVhbHMoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogb2JqZWN0cyBlcXVhbCBpZiB0aGVpciBtLCBhbmQgcnAgYXJlIG11dHVhbGx5IGVxdWFsLiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDA1KCkgeworICAgICAgICBFQ0ZpZWxkRjJtIGYxID0gbmV3IEVDRmllbGRGMm0oMjAwMCk7CisgICAgICAgIEVDRmllbGRGMm0gZjIgPSBuZXcgRUNGaWVsZEYybSgyMDAwLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMEwpLgorICAgICAgICAgICAgICAgIHNldEJpdCgwKS5zZXRCaXQoMSkuc2V0Qml0KDIpLgorICAgICAgICAgICAgICAgIHNldEJpdCg5ODEpLnNldEJpdCgyMDAwKSk7IAorICAgICAgICBhc3NlcnRGYWxzZShmMS5lcXVhbHMoZjIpIHx8IGYyLmVxdWFscyhmMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzYgZm9yIDxjb2RlPmVxdWFscyhPYmplY3Qgb2JqKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBmYWxzZSBpZiBvYmogaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDA2KCkgeworICAgICAgICBhc3NlcnRGYWxzZShuZXcgRUNGaWVsZEYybSgyMDAwKS5lcXVhbHMobnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzcgZm9yIDxjb2RlPmVxdWFscyhPYmplY3Qgb2JqKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBmYWxzZSBpZiBvYmogaXMgbm90IGluc3RhbmNlIG9mIDxjb2RlPkVDRmllbGRGMm08L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFcXVhbHNPYmplY3QwNygpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEVDRmllbGRGMm0oMjAwMCkuZXF1YWxzKG5ldyBPYmplY3QoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEZpZWxkU2l6ZSgpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIG0gdmFsdWUgZm9yIDxjb2RlPkVDRmllbGRGMm08L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZpZWxkU2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRGaWVsZFNpemUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAwLCBuZXcgRUNGaWVsZEYybSgyMDAwKS5nZXRGaWVsZFNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0TSgpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIG0gdmFsdWUgZm9yIDxjb2RlPkVDRmllbGRGMm08L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMDAsIG5ldyBFQ0ZpZWxkRjJtKDIwMDApLmdldE0oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBtaWQgdGVybXMgb2YgcmVkdWN0aW9uIHBvbHlub21pYWwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldE1pZFRlcm1zT2ZSZWR1Y3Rpb25Qb2x5bm9taWFsIG1ldGhvZCAiICsKKyAgICAgICAgICAgICJyZXR1cm5zIG1pZCB0ZXJtcyBvZiByZWR1Y3Rpb24gcG9seW5vbWlhbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNaWRUZXJtc09mUmVkdWN0aW9uUG9seW5vbWlhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRNaWRUZXJtc09mUmVkdWN0aW9uUG9seW5vbWlhbDAxKCkgeworICAgICAgICBpbnRbXSBhID0gbmV3IGludFtdIHs5ODEsMiwxfTsKKyAgICAgICAgaW50W10gYiA9IG5ldyBFQ0ZpZWxkRjJtKDIwMDAsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDBMKS5zZXRCaXQoMCkuc2V0Qml0KDEpLgorICAgICAgICAgICAgICAgIHNldEJpdCgyKS5zZXRCaXQoOTgxKS5zZXRCaXQoMjAwMCkpLgorICAgICAgICAgICAgICAgIGdldE1pZFRlcm1zT2ZSZWR1Y3Rpb25Qb2x5bm9taWFsKCk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhLCBiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBudWxsIGZvciBub3JtYWwgYmFzaXMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldE1pZFRlcm1zT2ZSZWR1Y3Rpb25Qb2x5bm9taWFsIG1ldGhvZCAiICsKKyAgICAgICAgICAgICJyZXR1cm5zIG51bGwgZm9yIG5vcm1hbCBiYXNpcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNaWRUZXJtc09mUmVkdWN0aW9uUG9seW5vbWlhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRNaWRUZXJtc09mUmVkdWN0aW9uUG9seW5vbWlhbDAyKCkgeworICAgICAgICBhc3NlcnROdWxsKG5ldyBFQ0ZpZWxkRjJtKDIwMDApLmdldE1pZFRlcm1zT2ZSZWR1Y3Rpb25Qb2x5bm9taWFsKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPmdldE1pZFRlcm1zT2ZSZWR1Y3Rpb25Qb2x5bm9taWFsKCk8L2NvZGU+IG1ldGhvZC48YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgbWlkIHRlcm1zIG9mIHJlZHVjdGlvbiBwb2x5bm9taWFsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRNaWRUZXJtc09mUmVkdWN0aW9uUG9seW5vbWlhbCBtZXRob2QgIiArCisgICAgICAgICAgICAicmV0dXJucyBtaWQgdGVybXMgb2YgcmVkdWN0aW9uIHBvbHlub21pYWwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwwMygpIHsKKyAgICAgICAgaW50W10gYSA9IG5ldyBpbnRbXSB7MzY3fTsKKyAgICAgICAgaW50W10gYiA9IG5ldyBFQ0ZpZWxkRjJtKDE5OTksIGEpLmdldE1pZFRlcm1zT2ZSZWR1Y3Rpb25Qb2x5bm9taWFsKCk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhLCBiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+Z2V0UmVkdWN0aW9uUG9seW5vbWlhbCgpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHJlZHVjdGlvbiBwb2x5bm9taWFsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRSZWR1Y3Rpb25Qb2x5bm9taWFsIG1ldGhvZCByZXR1cm5zICIgKworICAgICAgICAgICAgInJlZHVjdGlvbiBwb2x5bm9taWFsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlZHVjdGlvblBvbHlub21pYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UmVkdWN0aW9uUG9seW5vbWlhbDAxKCkgeworICAgICAgICBCaWdJbnRlZ2VyIHJwID0gQmlnSW50ZWdlci52YWx1ZU9mKDBMKS5zZXRCaXQoMCkuc2V0Qml0KDEpLnNldEJpdCgyKS4KKyAgICAgICAgc2V0Qml0KDk4MSkuc2V0Qml0KDIwMDApOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBFQ0ZpZWxkRjJtKDIwMDAsIHJwKS5nZXRSZWR1Y3Rpb25Qb2x5bm9taWFsKCkuZXF1YWxzKHJwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0UmVkdWN0aW9uUG9seW5vbWlhbCgpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIG51bGwgZm9yIG5vcm1hbCBiYXNpcworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0UmVkdWN0aW9uUG9seW5vbWlhbCBtZXRob2QgcmV0dXJucyBudWxsICIgKworICAgICAgICAgICAgImZvciBub3JtYWwgYmFzaXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UmVkdWN0aW9uUG9seW5vbWlhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRSZWR1Y3Rpb25Qb2x5bm9taWFsMDIoKSB7CisgICAgICAgIGFzc2VydE51bGwobmV3IEVDRmllbGRGMm0oMjAwMCkuZ2V0UmVkdWN0aW9uUG9seW5vbWlhbCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IG9iamVjdCBzdGF0ZSBpcyBwcmVzZXJ2ZWQgYWdhaW5zdCBtb2RpZmljYXRpb25zCisgICAgICogdGhyb3VnaCBhcnJheSByZWZlcmVuY2UgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgb2JqZWN0IHN0YXRlIGlzIHByZXNlcnZlZCBhZ2FpbnN0ICIgKworICAgICAgICAgICAgICAgICJtb2RpZmljYXRpb25zIHRocm91Z2ggYXJyYXkgcmVmZXJlbmNlIHBhc3NlZCB0byAiICsKKyAgICAgICAgICAgICAgICAidGhlIGNvbnN0cnVjdG9yLiIsCisgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkVDRmllbGRGMm0iLAorICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50W10uY2xhc3N9CisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdElzU3RhdGVQcmVzZXJ2ZWQwMSgpIHsKKyAgICAgICAgLy8gcmVmZXJlbmNlIGFycmF5CisgICAgICAgIGludFtdIGEgPSBuZXcgaW50W10gezM2N307CisgICAgICAgIC8vIHJlZmVyZW5jZSBhcnJheSBjb3B5CisgICAgICAgIGludFtdIGFDb3B5ID0gYS5jbG9uZSgpOworICAgICAgICAvLyBjcmVhdGUgb2JqIHVzaW5nIGNvcHkKKyAgICAgICAgRUNGaWVsZEYybSBmID0gbmV3IEVDRmllbGRGMm0oMTk5OSwgYUNvcHkpOworICAgICAgICAvLyBtb2RpZnkgY29weQorICAgICAgICBhQ29weVswXSA9IDU7CisgICAgICAgIC8vIGNvbXBhcmUgcmVmZXJlbmNlIHdpdGggcmV0dXJuZWQgYXJyYXkKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGEsIGYuZ2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwoKSkpOyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBvYmplY3Qgc3RhdGUgaXMgcHJlc2VydmVkIGFnYWluc3QKKyAgICAgKiBtb2RpZmljYXRpb25zIHRocm91Z2ggYXJyYXkgcmVmZXJlbmNlIHJldHVybmVkIGJ5CisgICAgICogPGNvZGU+Z2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwoKTwvY29kZT4gbWV0aG9kLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgb2JqZWN0IHN0YXRlIGlzIHByZXNlcnZlZCBhZ2FpbnN0ICIgKyAKKyAgICAgICAgICAgICJtb2RpZmljYXRpb25zIHRocm91Z2ggYXJyYXkgcmVmZXJlbmNlIHJldHVybmVkIGJ5ICIgKyAKKyAgICAgICAgICAgICJnZXRNaWRUZXJtc09mUmVkdWN0aW9uUG9seW5vbWlhbCgpIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFQ0ZpZWxkRjJtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50W10uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SXNTdGF0ZVByZXNlcnZlZDAyKCkgeworICAgICAgICAvLyByZWZlcmVuY2UgYXJyYXkKKyAgICAgICAgaW50W10gYSA9IG5ldyBpbnRbXSB7OTgxLDIsMX07CisgICAgICAgIC8vIHJlZmVyZW5jZSBhcnJheSBjb3B5CisgICAgICAgIGludFtdIGFDb3B5ID0gYS5jbG9uZSgpOworICAgICAgICAvLyBjcmVhdGUgb2JqIHVzaW5nIGNvcHkKKyAgICAgICAgRUNGaWVsZEYybSBmID0gbmV3IEVDRmllbGRGMm0oMjAwMCwgYUNvcHkpOworICAgICAgICAvLyBnZXQgYXJyYXkgcmVmZXJlbmNlIGFuZCBtb2RpZnkgcmV0dXJuZWQgYXJyYXkKKyAgICAgICAgZi5nZXRNaWRUZXJtc09mUmVkdWN0aW9uUG9seW5vbWlhbCgpWzBdID0gMTUzMjsKKyAgICAgICAgLy8gY29tcGFyZSByZWZlcmVuY2Ugd2l0aCByZXR1cm5lZCBmb3IgdGhlIHNlY29uZCB0aW1lIGFycmF5CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhLCBmLmdldE1pZFRlcm1zT2ZSZWR1Y3Rpb25Qb2x5bm9taWFsKCkpKTsgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDRmllbGRGcFRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FQ0ZpZWxkRnBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNzY5YwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FQ0ZpZWxkRnBUZXN0LmphdmEKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkRnA7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkVDRmllbGRGcDwvY29kZT4gY2xhc3MgZmllbGRzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRUNGaWVsZEZwLmNsYXNzKQorcHVibGljIGNsYXNzIEVDRmllbGRGcFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRUNGaWVsZEZwVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBFQ0ZpZWxkRnBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+RUNGaWVsZEZwPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIG5ldyBvYmplY3Qgb2YgPGNvZGU+RUNGaWVsZEZwPC9jb2RlPiBjbGFzcworICAgICAqIHVzaW5nIHZhbGlkIDxjb2RlPnA8L2NvZGU+IChvZGQgcHJpbWUpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRUNGaWVsZEZwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RUNGaWVsZEZwMDEoKSB7CisgICAgICAgIG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPkVDRmllbGRGcDwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiAKKyAgICAgKiBBc3NlcnRpb246IGNyZWF0ZXMgbmV3IG9iamVjdCBvZiA8Y29kZT5FQ0ZpZWxkRnA8L2NvZGU+IGNsYXNzCisgICAgICogdXNpbmcgdmFsaWQgPGNvZGU+cDwvY29kZT4gKG9kZCBidXQgbm90IHByaW1lKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVDRmllbGRGcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVDRmllbGRGcDAyKCkgeworICAgICAgICBuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyMUwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5FQ0ZpZWxkRnA8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogCisgICAgICogQXNzZXJ0aW9uOiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+cDwvY29kZT4gaXMgbm90IHBvc2l0aXZlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRUNGaWVsZEZwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RUNGaWVsZEZwMDMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigtMUwpKTsgCisgICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICIgRkFJTEVEOiBleHBlY3RlZCBleGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+RUNGaWVsZEZwPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIAorICAgICAqIEFzc2VydGlvbjogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnA8L2NvZGU+IGlzIG5vdCBwb3NpdGl2ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVDRmllbGRGcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVDRmllbGRGcDA0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMEwpKTsKKyAgICAgICAgICAgIGZhaWwoZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgIiBGQUlMRUQ6IGV4cGVjdGVkIGV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5FQ0ZpZWxkRnA8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogCisgICAgICogQXNzZXJ0aW9uOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wPC9jb2RlPiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRUNGaWVsZEZwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RUNGaWVsZEZwMDUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRUNGaWVsZEZwKG51bGwpOworICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAiIEZBSUxFRDogZXhwZWN0ZWQgZXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+aGFzaENvZGUoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogbXVzdCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgaWYgaW52b2tlZAorICAgICAqIHJlcGVhdGVkbHkgb24gdGhlIHNhbWUgb2JqZWN0LiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RIYXNoQ29kZTAxKCkgeworICAgICAgICBFQ0ZpZWxkRnAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBpbnQgaGMgPSBmLmhhc2hDb2RlKCk7CisgICAgICAgIGFzc2VydFRydWUoaGMgPT0gZi5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gZi5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gZi5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gZi5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gZi5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gZi5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gZi5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gZi5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5oYXNoQ29kZSgpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiBtdXN0IHJldHVybiB0aGUgc2FtZSB2YWx1ZSBpZiBpbnZva2VkCisgICAgICogb24gZXF1YWwgKGFjY29yZGluZyB0byB0aGUgPGNvZGU+ZXF1YWxzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkgb2JqZWN0cy4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFzaENvZGUwMigpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKS5oYXNoQ29kZSgpID09CisgICAgICAgICAgICAgICAgICAgbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSkuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0RmllbGRTaXplKCkoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBmaWVsZCBzaXplIGluIGJpdHMgd2hpY2ggaXMgcHJpbWUgc2l6ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaWVsZFNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0RmllbGRTaXplKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSkuZ2V0RmllbGRTaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFAoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBwcmltZSAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQKCkgeworICAgICAgICBCaWdJbnRlZ2VyIHAgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmVxdWFscyhuZXcgRUNGaWVsZEZwKHApLmdldFAoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmVxdWFscygpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiBvYmplY3QgZXF1YWxzIHRvIGl0c2VsZi4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFcXVhbHNPYmplY3QwMSgpIHsKKyAgICAgICAgRUNGaWVsZEZwIG9iaiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhc3NlcnRUcnVlKG9iai5lcXVhbHMob2JqKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+ZXF1YWxzKE9iamVjdCBvYmopPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGZhbHNlIGlmIDxjb2RlPm9iajwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDAyKCkgeworICAgICAgICBhc3NlcnRGYWxzZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKS5lcXVhbHMobnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yIDxjb2RlPmVxdWFscyhPYmplY3Qgb2JqKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBmYWxzZSBpZiA8Y29kZT5vYmo8L2NvZGU+CisgICAgICogaXMgbm90IGluc3RhbmNlIG9mIDxjb2RlPkVDRmllbGRGcDwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDAzKCkgeworICAgICAgICBhc3NlcnRGYWxzZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKS5lcXVhbHMobmV3IE9iamVjdCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IgPGNvZGU+ZXF1YWxzKCk8L2NvZGU+IG1ldGhvZC48YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IHRydWUgaWYgcHJpbWUgdmFsdWVzIG1hdGNoLiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDA0KCkgeworICAgICAgICBhc3NlcnRUcnVlKG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICBuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDR2VuUGFyYW1ldGVyU3BlY1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FQ0dlblBhcmFtZXRlclNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwYzJlZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FQ0dlblBhcmFtZXRlclNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0dlblBhcmFtZXRlclNwZWM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkVDR2VuUGFyYW1ldGVyU3BlYzwvY29kZT4gY2xhc3MgZmllbGRzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRUNHZW5QYXJhbWV0ZXJTcGVjLmNsYXNzKQorcHVibGljIGNsYXNzIEVDR2VuUGFyYW1ldGVyU3BlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRUNHZW5QYXJhbWV0ZXJTcGVjVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBFQ0dlblBhcmFtZXRlclNwZWNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+RUNHZW5QYXJhbWV0ZXJTcGVjPC9jb2RlPiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyBuZXcgb2JqZWN0IG9mIDxjb2RlPkVDR2VuUGFyYW1ldGVyU3BlYzwvY29kZT4gY2xhc3MKKyAgICAgKiB1c2luZyB2YWxpZCA8Y29kZT5uYW1lPC9jb2RlPiAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFQ0dlblBhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVDR2VuUGFyYW1ldGVyU3BlYzAxKCkgeworICAgICAgICBuZXcgRUNHZW5QYXJhbWV0ZXJTcGVjKCJzb21lTmFtZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPkVDR2VuUGFyYW1ldGVyU3BlYzwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqIGlmIDxjb2RlPm5hbWU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+ICAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFQ0dlblBhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVDR2VuUGFyYW1ldGVyU3BlYzAyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVDR2VuUGFyYW1ldGVyU3BlYyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk5QRSBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXROYW1lKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgPGNvZGU+bmFtZTwvY29kZT4gIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldE5hbWUoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gInNvbWVOYW1lIjsKKyAgICAgICAgRUNHZW5QYXJhbWV0ZXJTcGVjIHBzID0gbmV3IEVDR2VuUGFyYW1ldGVyU3BlYyhuYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUsIHBzLmdldE5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRUNQYXJhbWV0ZXJTcGVjVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQxMmViCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGRGMm07CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRWxsaXB0aWNDdXJ2ZTsKKworQFRlc3RUYXJnZXRDbGFzcyhFQ1BhcmFtZXRlclNwZWMuY2xhc3MpCitwdWJsaWMgY2xhc3MgRUNQYXJhbWV0ZXJTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIEVsbGlwdGljQ3VydmUgY3VydmU7CisKKyAgICBFQ1BvaW50IGVjcG9pbnQ7CisKKyAgICBFQ1BhcmFtZXRlclNwZWMgZWNwczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBFQ1BhcmFtZXRlclNwZWNUZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIEVDUGFyYW1ldGVyU3BlY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgY3VydmUgPSBuZXcgRWxsaXB0aWNDdXJ2ZShuZXcgRUNGaWVsZEYybSgyKSwgQmlnSW50ZWdlci52YWx1ZU9mKDEpLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisgICAgICAgIGVjcG9pbnQgPSBuZXcgRUNQb2ludChCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisgICAgICAgIGVjcHMgPSBuZXcgRUNQYXJhbWV0ZXJTcGVjKGN1cnZlLCBlY3BvaW50LCBCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIDEpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGN1cnZlID0gbnVsbDsKKyAgICAgICAgZWNwb2ludCA9IG51bGw7CisgICAgICAgIGVjcHMgPSBudWxsOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgZm9yIEVDUGFyYW1ldGVyU3BlYyhFbGxpcHRpY0N1cnZlLCBFQ1BvaW50LCBCaWdJbnRlZ2VyLCBpbnQpIGNvbnN0cnVjdG9yCisgICAgICogdGVzdCBjb3ZlcnMgZm9sbG93aW5nIHVzZWNhc2VzOiAKKyAgICAgKiBjYXNlIDE6IGNyZWF0aW5nIG9iamVjdCB3aXRoIHZhbGlkIHBhcmFtZXRlcnMKKyAgICAgKiBjYXNlIDI6IE51bGxQb2ludGVyRXhjZXB0aW9uIC0gaWYgY3VydmUgaXMgbnVsbCAKKyAgICAgKiBjYXNlIDM6IE51bGxQb2ludGVyRXhjZXB0aW9uIC0gaWYgZyBpcyBudWxsCisgICAgICogY2FzZSA0OiBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIG4gaXMgbnVsbAorICAgICAqIGNhc2UgNTogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0gaWYgbiBpcyBub3QgcG9zaXRpdmUKKyAgICAgKiBjYXNlIDY6IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAtIGlmIGggaXMgbm90IHBvc2l0aXZlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVDUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LnNwZWMuRWxsaXB0aWNDdXJ2ZS5jbGFzcywgamF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3JMamF2YV9zZWN1cml0eV9zcGVjX0VsbGlwdGljQ3VydmVMamF2YV9zZWN1cml0eV9zcGVjX0VDUG9pbnRMamF2YV9tYXRoX0JpZ0ludGVnZXJJKCkgeworICAgICAgICAKKyAgICAgICAgLy8gY2FzZSAxOiBjcmVhdGluZyBvYmplY3Qgd2l0aCB2YWxpZCBwYXJhbWV0ZXJzCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY29mYWN0b3Igd2FzIHJldHVybmVkIiwgMSwgZWNwcy5nZXRDb2ZhY3RvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBlbGxpcHRpYyBjdXJ2ZSIsIGN1cnZlLCBlY3BzLmdldEN1cnZlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGdlbmVyYXRvciB3YXMgcmV0dXJuZWQiLCBlY3BvaW50LCBlY3BzCisgICAgICAgICAgICAgICAgLmdldEdlbmVyYXRvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBvcmRlciB3YXMgcmV0ZXVybmVkIiwgQmlnSW50ZWdlci52YWx1ZU9mKDEpLCBlY3BzCisgICAgICAgICAgICAgICAgLmdldE9yZGVyKCkpOworCisgICAgICAgIC8vIGNhc2UgMjogTnVsbFBvaW50ZXJFeGNlcHRpb24gLSBpZiBjdXJ2ZSBpcyBudWxsLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVDUGFyYW1ldGVyU3BlYyhudWxsLCBlY3BvaW50LCBCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIDEpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gY2FzZSAzOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIGcgaXMgbnVsbC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFQ1BhcmFtZXRlclNwZWMoY3VydmUsIG51bGwsIEJpZ0ludGVnZXIudmFsdWVPZigxKSwgMSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gY2FzZSA0OiBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIG4gaXMgbnVsbC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFQ1BhcmFtZXRlclNwZWMoY3VydmUsIGVjcG9pbnQsIG51bGwsIDEpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhc2UgNTogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0gaWYgbiBpcyBub3QgcG9zaXRpdmUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRUNQYXJhbWV0ZXJTcGVjKGN1cnZlLCBlY3BvaW50LCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCAxKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhc2UgNjogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0gaWYgaCBpcyBub3QgcG9zaXRpdmUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRUNQYXJhbWV0ZXJTcGVjKGN1cnZlLCBlY3BvaW50LCBCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIC0xKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgZm9yIGdldEN1cnZlKCkgbWV0aG9kCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEN1cnZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9HZXRDdXJ2ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBlbGxpcHRpYyBjdXJ2ZSIsIGN1cnZlLCBlY3BzLmdldEN1cnZlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgZm9yIGdldEdlbmVyYXRvcigpIG1ldGhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRHZW5lcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0dldEdlbmVyYXRvcigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBnZW5lcmF0b3Igd2FzIHJldHVybmVkIiwgZWNwb2ludCwgZWNwcworICAgICAgICAgICAgICAgIC5nZXRHZW5lcmF0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgZ2V0T3JkZXIoKSBtZXRob2QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0T3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0dldE9yZGVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG9yZGVyIHdhcyByZXRldXJuZWQiLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIGVjcHMKKyAgICAgICAgICAgICAgICAuZ2V0T3JkZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgZ2V0Q29mYWN0b3IoKSBtZXRob2QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29mYWN0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0dldENvZmFjdG9yKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGNvZmFjdG9yIHdhcyByZXR1cm5lZCIsIDEsIGVjcHMuZ2V0Q29mYWN0b3IoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUG9pbnRUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRUNQb2ludFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjMxYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUG9pbnRUZXN0LmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BvaW50OworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5FQ1BvaW50PC9jb2RlPiBjbGFzcyBmaWVsZHMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhFQ1BvaW50LmNsYXNzKQorcHVibGljIGNsYXNzIEVDUG9pbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEVDUG9pbnRUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIEVDUG9pbnRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+RUNQb2ludChCaWdJbnRlZ2VyLCBCaWdJbnRlZ2VyKTwvY29kZT4gY29uc3RydWN0b3I8YnI+IAorICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyA8Y29kZT5FQ1BvaW50PC9jb2RlPiBpbnN0YW5jZTxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHBhc3Mgd2l0aG91dCBhbnkgZXhjZXB0aW9ucworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2VzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVDUG9pbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RUNQb2ludDAxKCkgeworICAgICAgICBuZXcgRUNQb2ludChCaWdJbnRlZ2VyLlpFUk8sIEJpZ0ludGVnZXIuWkVSTyk7CisgICAgICAgIG5ldyBFQ1BvaW50KEJpZ0ludGVnZXIudmFsdWVPZigtMjM0NTZMKSwgQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpKTsKKyAgICAgICAgbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKDEyMzQ1NkwpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMTIzNDU2TCkpOworICAgICAgICBuZXcgRUNQb2ludChCaWdJbnRlZ2VyLnZhbHVlT2YoLTU2TCksIEJpZ0ludGVnZXIudmFsdWVPZigyMzRMKSk7CisgICAgICAgIG5ldyBFQ1BvaW50KEJpZ0ludGVnZXIudmFsdWVPZigzNDU2TCksIEJpZ0ludGVnZXIudmFsdWVPZigtMjM0NEwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5FQ1BvaW50KEJpZ0ludGVnZXIgeCwgQmlnSW50ZWdlciB5KTwvY29kZT4gY29uc3RydWN0b3I8YnI+IAorICAgICAqIEFzc2VydGlvbjogdGhyb3dzIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiBpZiA8Y29kZT54PC9jb2RlPm9yCisgICAgICogPGNvZGU+eTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBwYXNzIDxjb2RlPm51bGw8L2NvZGU+IGFzIG1lbnRpb25lZCBwYXJhbWV0ZXJzPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHRocm93IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRUNQb2ludCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFQ1BvaW50MDIoKSB7CisgICAgICAgIC8vIHRlc3QgY2FzZSAxOiB4IGlzIG51bGwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFQ1BvaW50KG51bGwsIEJpZ0ludGVnZXIuWkVSTyk7CisgICAgICAgICAgICBmYWlsKCIjMTogRXhwZWN0ZWQgTlBFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gb2spIHsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gdGVzdCBjYXNlIDI6IHkgaXMgbnVsbAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVDUG9pbnQoQmlnSW50ZWdlci5aRVJPLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIiMyOiBFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisKKworICAgICAgICAvLyB0ZXN0IGNhc2UgMzogYm90aCA6IHggYW5kIHkgYXJlIG51bGwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFQ1BvaW50KG51bGwsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiIzM6IEV4cGVjdGVkIE5QRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG9rKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRBZmZpbmVYKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgYWZmaW5lIDxjb2RlPng8L2NvZGU+IGNvb3JkaW5hdGU8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiA8Y29kZT5FQ1BvaW50PC9jb2RlPiBpbnN0YW5jZQorICAgICAqIGNyZWF0ZWQgdXNpbmcgdmFsaWQgcGFyYW1ldGVyczxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCByZXR1cm4gYWZmaW5lIDxjb2RlPng8L2NvZGU+IGNvb3JkaW5hdGUKKyAgICAgKiB3aGljaCBpcyBlcXVhbCB0byB0aGUgb25lIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3I7CisgICAgICogKGJvdGggbXVzdCByZWZlciB0aGUgc2FtZSBvYmplY3QpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBZmZpbmVYIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEFmZmluZVgwMSgpIHsKKyAgICAgICAgQmlnSW50ZWdlciB4ID0gQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpOworICAgICAgICBFQ1BvaW50IHAgPSBuZXcgRUNQb2ludCh4LCBCaWdJbnRlZ2VyLnZhbHVlT2YoMjM0NTZMKSk7CisgICAgICAgIEJpZ0ludGVnZXIgeFJldCA9IHAuZ2V0QWZmaW5lWCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoeCwgeFJldCk7CisgICAgICAgIGFzc2VydFNhbWUoeCwgeFJldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0QWZmaW5lWCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGZvciA8Y29kZT5FQ1BvaW50LlBPSU5UX0lORklOSVRZPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IG5vbmU8YnI+CisgICAgICogRXhwZWN0ZWQ6IG11c3QgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZvcgorICAgICAqIDxjb2RlPkVDUG9pbnQuUE9JTlRfSU5GSU5JVFk8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRBZmZpbmVYIHJldHVybnMgbnVsbCBmb3IgUE9JTlRfSU5GSU5JVFkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWZmaW5lWCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRBZmZpbmVYMDIoKSB7CisgICAgICAgIGFzc2VydE51bGwoRUNQb2ludC5QT0lOVF9JTkZJTklUWS5nZXRBZmZpbmVYKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldEFmZmluZVkoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBhZmZpbmUgPGNvZGU+eTwvY29kZT4gY29vcmRpbmF0ZTxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IDxjb2RlPkVDUG9pbnQ8L2NvZGU+IGluc3RhbmNlCisgICAgICogY3JlYXRlZCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHJldHVybiBhZmZpbmUgPGNvZGU+eTwvY29kZT4gY29vcmRpbmF0ZQorICAgICAqIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBvbmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcjsKKyAgICAgKiAoYm90aCBtdXN0IHJlZmVyIHRoZSBzYW1lIG9iamVjdCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEFmZmluZVkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QWZmaW5lWTAxKCkgeworICAgICAgICBCaWdJbnRlZ2VyIHkgPSAgQmlnSW50ZWdlci52YWx1ZU9mKDIzNDU2TCk7CisgICAgICAgIEVDUG9pbnQgcCA9IG5ldyBFQ1BvaW50KEJpZ0ludGVnZXIudmFsdWVPZigtMjM0NTZMKSwgeSk7CisgICAgICAgIEJpZ0ludGVnZXIgeVJldCA9IHAuZ2V0QWZmaW5lWSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoeSwgeVJldCk7CisgICAgICAgIGFzc2VydFNhbWUoeSwgeVJldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0QWZmaW5lWCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGZvciA8Y29kZT5FQ1BvaW50LlBPSU5UX0lORklOSVRZPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IG5vbmU8YnI+CisgICAgICogRXhwZWN0ZWQ6IG11c3QgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZvcgorICAgICAqIDxjb2RlPkVDUG9pbnQuUE9JTlRfSU5GSU5JVFk8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRBZmZpbmVZIHJ1dHVybnMgbnVsbCBmb3IgUE9JTlRfSU5GSU5JVFkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWZmaW5lWSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRBZmZpbmVZMDIoKSB7CisgICAgICAgIGFzc2VydE51bGwoRUNQb2ludC5QT0lOVF9JTkZJTklUWS5nZXRBZmZpbmVZKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmVxdWFscyhPYmplY3Qgb3RoZXIpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm4gdHJ1ZSBpZiB0aGlzIGFuZCBvdGhlciBvYmplY3RzIGFyZSBlcXVhbDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHNlZSB0ZXN0IGNvbW1lbnRzPGJyPgorICAgICAqIEV4cGVjdGVkOiBhbGwgb2JqZWN0cyBpbiB0aGlzIHRlc3QgbXVzdCBiZSBlcXVhbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2VzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0MDEoKSB7CisgICAgICAgIC8vIHRlc3QgY2FzZSAxOiBtdXN0IGJlIGVxdWFsIHRvIGl0c2VsZgorICAgICAgICBFQ1BvaW50IHAyPW51bGwsIHAxID0KKyAgICAgICAgICAgIG5ldyBFQ1BvaW50KEJpZ0ludGVnZXIudmFsdWVPZigtMjM0NTZMKSwgQmlnSW50ZWdlci5PTkUpOworICAgICAgICBhc3NlcnRUcnVlKHAxLmVxdWFscyhwMSkpOworCisgICAgICAgIC8vIHRlc3QgY2FzZSAyOiBlcXVhbCBvYmplY3RzCisgICAgICAgIHAxID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpLCBCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIHAyID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMUwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwMS5lcXVhbHMocDIpICYmIHAyLmVxdWFscyhwMSkpOworCisgICAgICAgIC8vIHRlc3QgY2FzZSAzOiBlcXVhbCBQT0lOVF9JTkZJTklUWSBvYmplY3QocykKKyAgICAgICAgcDEgPSBFQ1BvaW50LlBPSU5UX0lORklOSVRZOworICAgICAgICBwMiA9IEVDUG9pbnQuUE9JTlRfSU5GSU5JVFk7CisgICAgICAgIGFzc2VydFRydWUocDEuZXF1YWxzKHAyKSAmJiBwMi5lcXVhbHMocDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5lcXVhbHMoT2JqZWN0IG90aGVyKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJuIGZhbHNlIGlmIHRoaXMgYW5kIG90aGVyIG9iamVjdHMgYXJlIG5vdCBlcXVhbDxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHNlZSB0ZXN0IGNvbW1lbnRzPGJyPgorICAgICAqIEV4cGVjdGVkOiBhbGwgb2JqZWN0cyBpbiB0aGlzIHRlc3QgbXVzdCBiZSBub3QgZXF1YWwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBuZWdhdGl2ZSBjYXNlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVxdWFsc09iamVjdDAyKCkgeworICAgICAgICAvLyB0ZXN0IGNhc2UgMTogbXVzdCBiZSBub3QgZXF1YWwgdG8gbnVsbAorICAgICAgICBFQ1BvaW50IHAyPW51bGwsIHAxID0KKyAgICAgICAgICAgIG5ldyBFQ1BvaW50KEJpZ0ludGVnZXIudmFsdWVPZigtMjM0NTZMKSwgQmlnSW50ZWdlci5PTkUpOworICAgICAgICBhc3NlcnRGYWxzZShwMS5lcXVhbHMocDIpKTsKKworICAgICAgICAvLyB0ZXN0IGNhc2UgMjogbm90IGVxdWFsIG9iamVjdHMgLSB4CisgICAgICAgIHAxID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1N0wpLCBCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIHAyID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMUwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocDEuZXF1YWxzKHAyKSB8fCBwMi5lcXVhbHMocDEpKTsKKworICAgICAgICAvLyB0ZXN0IGNhc2UgMzogbm90IGVxdWFsIG9iamVjdHMgLSB5CisgICAgICAgIHAxID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1N0wpLCBCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIHAyID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpLCBCaWdJbnRlZ2VyLlpFUk8pOworICAgICAgICBhc3NlcnRGYWxzZShwMS5lcXVhbHMocDIpIHx8IHAyLmVxdWFscyhwMSkpOworCisgICAgICAgIC8vIHRlc3QgY2FzZSA0OiBub3QgZXF1YWwgLSBzb21lIHBvaW50IGFuZCBQT0lOVF9JTkZJTklUWQorICAgICAgICBwMSA9IEVDUG9pbnQuUE9JTlRfSU5GSU5JVFk7CisgICAgICAgIHAyID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpLCBCaWdJbnRlZ2VyLlpFUk8pOworICAgICAgICBhc3NlcnRGYWxzZShwMS5lcXVhbHMocDIpIHx8IHAyLmVxdWFscyhwMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmhhc2hDb2RlKCk8L2NvZGU+IG1ldGhvZC48YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGlmIGludm9rZWQKKyAgICAgKiByZXBlYXRlZGx5IG9uIHRoZSBzYW1lIG9iamVjdC4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFzaENvZGUwMSgpIHsKKyAgICAgICAgRUNQb2ludCBmID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1N0wpLCBCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIGludCBoYyA9IGYuaGFzaENvZGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICBoYyA9PSBmLmhhc2hDb2RlKCkpOworCisgICAgICAgIAorICAgICAgICAvLyB0aGUgc2FtZSBmb3IgUE9JTlRfSU5GSU5JVFkKKyAgICAgICAgaGMgPSBFQ1BvaW50LlBPSU5UX0lORklOSVRZLmhhc2hDb2RlKCk7CisgICAgICAgIGFzc2VydFRydWUoaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpICYmCisgICAgICAgICAgICAgICAgICAgaGMgPT0gRUNQb2ludC5QT0lOVF9JTkZJTklUWS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5oYXNoQ29kZSgpPC9jb2RlPiBtZXRob2QuPGJyPgorICAgICAqCisgICAgICogQXNzZXJ0aW9uOiBtdXN0IHJldHVybiB0aGUgc2FtZSB2YWx1ZSBpZiBpbnZva2VkCisgICAgICogb24gZXF1YWwgKGFjY29yZGluZyB0byB0aGUgPGNvZGU+ZXF1YWxzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkgb2JqZWN0cy4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SGFzaENvZGUwMigpIHsKKyAgICAgICAgRUNQb2ludCBwMSA9IG5ldyBFQ1BvaW50KEJpZ0ludGVnZXIudmFsdWVPZigtMjM0NTZMKSwgQmlnSW50ZWdlci5PTkUpOworICAgICAgICBFQ1BvaW50IHAyID0gbmV3IEVDUG9pbnQoQmlnSW50ZWdlci52YWx1ZU9mKC0yMzQ1NkwpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMUwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAxLmhhc2hDb2RlKCksIHAyLmhhc2hDb2RlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUHJpdmF0ZUtleVNwZWNUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRUNQcml2YXRlS2V5U3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTFlY2VjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUHJpdmF0ZUtleVNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkRjJtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUHJpdmF0ZUtleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVsbGlwdGljQ3VydmU7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoRUNQcml2YXRlS2V5U3BlYy5jbGFzcykKK3B1YmxpYyBjbGFzcyBFQ1ByaXZhdGVLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIEJpZ0ludGVnZXIgczsKKworICAgIEVDUGFyYW1ldGVyU3BlYyBlY3BhcmFtczsKKworICAgIEVDUHJpdmF0ZUtleVNwZWMgZWNwa3M7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRUNQcml2YXRlS2V5U3BlY1Rlc3QKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBFQ1ByaXZhdGVLZXlTcGVjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIEVDUG9pbnQgZWNwb2ludCA9IG5ldyBFQ1BvaW50KEJpZ0ludGVnZXIudmFsdWVPZigxKSwgQmlnSW50ZWdlcgorICAgICAgICAgICAgICAgIC52YWx1ZU9mKDEpKTsKKyAgICAgICAgRWxsaXB0aWNDdXJ2ZSBjdXJ2ZSA9IG5ldyBFbGxpcHRpY0N1cnZlKG5ldyBFQ0ZpZWxkRjJtKDIpLCBCaWdJbnRlZ2VyCisgICAgICAgICAgICAgICAgLnZhbHVlT2YoMSksIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisKKyAgICAgICAgcyA9IEJpZ0ludGVnZXIudmFsdWVPZigxKTsKKyAgICAgICAgZWNwYXJhbXMgPSBuZXcgRUNQYXJhbWV0ZXJTcGVjKGN1cnZlLCBlY3BvaW50LCBCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIDEpOworICAgICAgICBlY3BrcyA9IG5ldyBFQ1ByaXZhdGVLZXlTcGVjKHMsIGVjcGFyYW1zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzID0gbnVsbDsKKyAgICAgICAgZWNwYXJhbXMgPSBudWxsOworICAgICAgICBlY3BrcyA9IG51bGw7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgY29uc3RydWN0b3IgRUNQcml2YXRlS2V5U3BlYyhCaWdJbnRlZ2VyLCBFQ1BhcmFtZXRlclNwZWMpIAorICAgICAqIHRlc3QgY292ZXJzIGZvbGxvd2luZyB1c2VjYXNlczogCisgICAgICogY2FzZSAxOiBjcmVhdGluZyBvYmplY3Qgd2l0aCB2YWxpZCBwYXJhbWV0ZXJzCisgICAgICogY2FzZSAyOiBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIHMgaXMgbnVsbC4gCisgICAgICogY2FzZSAzOiBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIHBhcmFtcyBpcyBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFQ1ByaXZhdGVLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0cnVjdG9yTGphdmFfbWF0aF9CaWdJbnRlZ2VyTGphdmFfc2VjdXJpdHlfc3BlY19FQ1BhcmFtZXRlclNwZWMoKSB7CisKKyAgICAgICAgLy8gY2FzZSAxOiBjcmVhdGluZyBvYmplY3Qgd2l0aCB2YWxpZCBwYXJhbWV0ZXJzCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgcHJpdmF0ZSB2YWx1ZSIsIHMsIGVjcGtzLmdldFMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgcGFyYW1ldGVycyIsIGVjcGFyYW1zLCBlY3Brcy5nZXRQYXJhbXMoKSk7CisKKyAgICAgICAgLy8gY2FzZSAyOiBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIHMgaXMgbnVsbC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFQ1ByaXZhdGVLZXlTcGVjKG51bGwsIGVjcGFyYW1zKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhc2UgMzogY2F0Y2ggTnVsbFBvaW50ZXJFeGNlcHRpb24gLSBpZiBwYXJhbXMgaXMgbnVsbC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFQ1ByaXZhdGVLZXlTcGVjKHMsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgZ2V0UygpIG1ldGhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9HZXRTKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIHByaXZhdGUgdmFsdWUiLCBzLCBlY3Brcy5nZXRTKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgZm9yIGdldFBhcmFtcygpIG1ldGhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJhbXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0dldFBhcmFtcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwYXJhbWV0ZXJzIiwgZWNwYXJhbXMsIGVjcGtzLmdldFBhcmFtcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRUNQdWJsaWNLZXlTcGVjVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUHVibGljS2V5U3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjBmOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VDUHVibGljS2V5U3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGRGMm07CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQdWJsaWNLZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FbGxpcHRpY0N1cnZlOworCitAVGVzdFRhcmdldENsYXNzKEVDUHVibGljS2V5U3BlYy5jbGFzcykKK3B1YmxpYyBjbGFzcyBFQ1B1YmxpY0tleVNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIEVDUG9pbnQgdzsKKworICAgIEVDUGFyYW1ldGVyU3BlYyBwYXJhbXM7CisKKyAgICBFQ1B1YmxpY0tleVNwZWMgZWNwa3M7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRUNQdWJsaWNLZXlTcGVjCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRUNQdWJsaWNLZXlTcGVjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBFQ1BvaW50IGVjcG9pbnQgPSBuZXcgRUNQb2ludChCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIEJpZ0ludGVnZXIKKyAgICAgICAgICAgICAgICAudmFsdWVPZigxKSk7CisgICAgICAgIEVsbGlwdGljQ3VydmUgY3VydmUgPSBuZXcgRWxsaXB0aWNDdXJ2ZShuZXcgRUNGaWVsZEYybSgyKSwgQmlnSW50ZWdlcgorICAgICAgICAgICAgICAgIC52YWx1ZU9mKDEpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMSkpOworCisgICAgICAgIHcgPSBuZXcgRUNQb2ludChCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisgICAgICAgIHBhcmFtcyA9IG5ldyBFQ1BhcmFtZXRlclNwZWMoY3VydmUsIGVjcG9pbnQsIEJpZ0ludGVnZXIudmFsdWVPZigxKSwgMSk7CisgICAgICAgIGVjcGtzID0gbmV3IEVDUHVibGljS2V5U3BlYyh3LCBwYXJhbXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHcgPSBudWxsOworICAgICAgICBwYXJhbXMgPSBudWxsOworICAgICAgICBlY3BrcyA9IG51bGw7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgY29uc3RydWN0b3IgRUNQdWJsaWNLZXlTcGVjKEVDUG9pbnQsIEVDUGFyYW1ldGVyU3BlYykKKyAgICAgKiB0ZXN0IGNvdmVycyBmb2xsb3dpbmcgdXNlY2FzZXM6IAorICAgICAqIGNhc2UgMTogY3JlYXRpbmcgb2JqZWN0IHdpdGggdmFsaWQgcGFyYW1ldGVycworICAgICAqIGNhc2UgMjogY2F0Y2ggTnVsbFBvaW50ZXJFeGNlcHRpb24gLSBpZiB3IGlzIG51bGwuCisgICAgICogY2FzZSAzOiBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIHBhcmFtcyBpcyBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFQ1B1YmxpY0tleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQuY2xhc3MsIGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BhcmFtZXRlclNwZWMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfY29uc3RydWN0b3JMamF2YV9zZWN1cml0eV9zcGVjX0VDUG9pbnRMamF2YV9zZWN1cml0eV9zcGVjX0VDUGFyYW1ldGVyU3BlYygpIHsKKworICAgICAgICAvLyBjYXNlIDE6IGNyZWF0aW5nIG9iamVjdCB3aXRoIHZhbGlkIHBhcmFtZXRlcnMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwYXJhbXMgdmFsdWUiLCBwYXJhbXMsIGVjcGtzLmdldFBhcmFtcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyB3IHZhbHVlIiwgdywgZWNwa3MuZ2V0VygpKTsKKworICAgICAgICAvLyBjYXNlIDI6IGNhdGNoIE51bGxQb2ludGVyRXhjZXB0aW9uIC0gaWYgdyBpcyBudWxsLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVDUHVibGljS2V5U3BlYyhudWxsLCBwYXJhbXMpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gY2FzZSAzOiBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtIGlmIHBhcmFtcyBpcyBudWxsLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVDUHVibGljS2V5U3BlYyh3LCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgZm9yIGdldFcoKSBtZXRob2QKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRXKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIHcgdmFsdWUiLCB3LCBlY3Brcy5nZXRXKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgZm9yIGdldFBhcmFtcygpIG1leWhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJhbXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UGFyYW1zKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIHBhcmFtcyB2YWx1ZSIsIHBhcmFtcywgZWNwa3MuZ2V0UGFyYW1zKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FbGxpcHRpY0N1cnZlVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VsbGlwdGljQ3VydmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzNzY1MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FbGxpcHRpY0N1cnZlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODUwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNGaWVsZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNGaWVsZEYybTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNGaWVsZEZwOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FbGxpcHRpY0N1cnZlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkVsbGlwdGljQ3VydmU8L2NvZGU+IGNsYXNzIGZpZWxkcyBhbmQgbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKEVsbGlwdGljQ3VydmUuY2xhc3MpCitwdWJsaWMgY2xhc3MgRWxsaXB0aWNDdXJ2ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5FbGxpcHRpY0N1cnZlKEVDRmllbGQsIEJpZ0ludGVnZXIsIEJpZ0ludGVnZXIsIGJ5dGVbXSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVzIGluc3RhbmNlIG9mIEVsbGlwdGljQ3VydmU8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiB2YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZDxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCBwYXNzIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbGxpcHRpY0N1cnZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbGxpcHRpY0N1cnZlRUNGaWVsZEJpZ0ludGVnZXJCaWdJbnRlZ2VyYnl0ZUFycmF5MDEoKSB7CisgICAgICAgIC8vIHRlc3QgY2FzZSAxIHBhcmFtZXRlcnMgc2V0CisgICAgICAgIEVDRmllbGRGcCBmID0gbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSk7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIuT05FOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgYnl0ZVtdIHNlZWQgPSBuZXcgYnl0ZVsyNF07CisgICAgICAgIC8vIHBlcmZvcm0gdGVzdCBjYXNlIDEKKyAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYiwgc2VlZCk7CisKKyAgICAgICAgLy8gdGVzdCBjYXNlIDIgcGFyYW1ldGVycyBzZXQKKyAgICAgICAgRUNGaWVsZEYybSBmMSA9IG5ldyBFQ0ZpZWxkRjJtKDUpOworICAgICAgICBhID0gQmlnSW50ZWdlci5aRVJPOworICAgICAgICBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDIzTCk7CisgICAgICAgIC8vIHBlcmZvcm0gdGVzdCBjYXNlIDIKKyAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZjEsIGEsIGIsIHNlZWQpOworCisgICAgICAgIC8vIHRlc3QgY2FzZSAzIHBhcmFtZXRlcnMgc2V0LAorICAgICAgICAvLyB0aGUgc2VlZCBwYXJhbWV0ZXIgbWF5IGJlIG51bGwgCisgICAgICAgIGYgPSBuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKTsKKyAgICAgICAgYSA9IEJpZ0ludGVnZXIuT05FOworICAgICAgICBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIHNlZWQgPSBudWxsOworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAzCisgICAgICAgIG5ldyBFbGxpcHRpY0N1cnZlKGYsIGEsIGIsIHNlZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPkVsbGlwdGljQ3VydmUoRUNGaWVsZCwgQmlnSW50ZWdlciwgQmlnSW50ZWdlciwgYnl0ZVtdKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IHRocm93cyA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4gaWYgPGNvZGU+ZmllbGQ8L2NvZGU+LAorICAgICAqIDxjb2RlPmE8L2NvZGU+IG9yIDxjb2RlPmI8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+PGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogcGFzcyA8Y29kZT5udWxsPC9jb2RlPiBhcyBtZW50aW9uZWQgcGFyYW1ldGVyczxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCB0aHJvdyA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbGxpcHRpY0N1cnZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbGxpcHRpY0N1cnZlRUNGaWVsZEJpZ0ludGVnZXJCaWdJbnRlZ2VyYnl0ZUFycmF5MDIoKSB7CisgICAgICAgIC8vIHRlc3QgY2FzZSAxIHBhcmFtZXRlcnMgc2V0CisgICAgICAgIEVDRmllbGRGcCBmID0gbnVsbDsKKyAgICAgICAgQmlnSW50ZWdlciBhID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgIEJpZ0ludGVnZXIgYiA9IEJpZ0ludGVnZXIudmFsdWVPZigxOUwpOworICAgICAgICBieXRlW10gc2VlZCA9IG5ldyBieXRlWzI0XTsKKworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAxCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiLCBzZWVkKTsKKyAgICAgICAgICAgIGZhaWwoIiMxOiBFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykge30KKworICAgICAgICAvLyB0ZXN0IGNhc2UgMiBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gbnVsbDsKKyAgICAgICAgYiA9IEJpZ0ludGVnZXIudmFsdWVPZigxOUwpOworICAgICAgICBzZWVkID0gbmV3IGJ5dGVbMjRdOworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiLCBzZWVkKTsKKyAgICAgICAgICAgIGZhaWwoIiMyOiBFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykge30KKworICAgICAgICAvLyB0ZXN0IGNhc2UgMyBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgIGIgPSBudWxsOworICAgICAgICBzZWVkID0gbmV3IGJ5dGVbMjRdOworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiLCBzZWVkKTsKKyAgICAgICAgICAgIGZhaWwoIiMzOiBFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5FbGxpcHRpY0N1cnZlKEVDRmllbGQsIEJpZ0ludGVnZXIsIEJpZ0ludGVnZXIsIGJ5dGVbXSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiB0aHJvd3MgPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZgorICAgICAqIDxjb2RlPmE8L2NvZGU+IG9yIDxjb2RlPmI8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgbm90IGluCisgICAgICogdGhlIDxjb2RlPmZpZWxkPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IHBhc3MgPGNvZGU+YTwvY29kZT4sIDxjb2RlPmI8L2NvZGU+IHdoaWNoIGFyZQorICAgICAqIG5vdCBpbiB0aGUgPGNvZGU+ZmllbGQ8L2NvZGU+IG9mIHR5cGUgPGNvZGU+RUNGaWVsZEZwPC9jb2RlPjxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCB0aHJvdyA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVsbGlwdGljQ3VydmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVsbGlwdGljQ3VydmVFQ0ZpZWxkQmlnSW50ZWdlckJpZ0ludGVnZXJieXRlQXJyYXkwMygpIHsKKyAgICAgICAgLy8gdGVzdCBjYXNlIDEgcGFyYW1ldGVycyBzZXQsCisgICAgICAgIC8vIGEgaXMgbm90IGluIGZpZWxkCisgICAgICAgIEVDRmllbGRGcCBmID0gbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSk7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIudmFsdWVPZigyNEwpOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgYnl0ZVtdIHNlZWQgPSBuZXcgYnl0ZVsyNF07CisKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYiwgc2VlZCk7CisgICAgICAgICAgICBmYWlsKCIjMTogRXhwZWN0ZWQgSUFFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7fQorCisgICAgICAgIC8vIHRlc3QgY2FzZSAxLjEgcGFyYW1ldGVycyBzZXQsCisgICAgICAgIC8vIGIgaXMgbm90IGluIGZpZWxkCisgICAgICAgIGYgPSBuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKTsKKyAgICAgICAgYSA9IEJpZ0ludGVnZXIudmFsdWVPZigxTCk7CisgICAgICAgIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKTsKKyAgICAgICAgc2VlZCA9IG5ldyBieXRlWzI0XTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMS4xCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiLCBzZWVkKTsKKyAgICAgICAgICAgIGZhaWwoIiMxLjE6IEV4cGVjdGVkIElBRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvaykge30KKworICAgICAgICAvLyB0ZXN0IGNhc2UgMiBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgLy8gYiBpcyBub3QgaW4gZmllbGQKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjRMKTsKKyAgICAgICAgc2VlZCA9IG5ldyBieXRlWzI0XTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYiwgc2VlZCk7CisgICAgICAgICAgICBmYWlsKCIjMjogRXhwZWN0ZWQgSUFFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7fQorCisgICAgICAgIC8vIHRlc3QgY2FzZSAzIHBhcmFtZXRlcnMgc2V0LAorICAgICAgICAvLyBib3RoIGEgYW5kIGIgYXJlIG5vdCBpbiBmaWVsZAorICAgICAgICBmID0gbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSk7CisgICAgICAgIGEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjVMKTsKKyAgICAgICAgYiA9IEJpZ0ludGVnZXIudmFsdWVPZigyNDBMKTsKKyAgICAgICAgc2VlZCA9IG5ldyBieXRlWzI0XTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYiwgc2VlZCk7CisgICAgICAgICAgICBmYWlsKCIjMzogRXhwZWN0ZWQgSUFFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzQgZm9yIDxjb2RlPkVsbGlwdGljQ3VydmUoRUNGaWVsZCwgQmlnSW50ZWdlciwgQmlnSW50ZWdlciwgYnl0ZVtdKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IHRocm93cyA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlmCisgICAgICogPGNvZGU+YTwvY29kZT4gb3IgPGNvZGU+YjwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBub3QgaW4KKyAgICAgKiB0aGUgPGNvZGU+ZmllbGQ8L2NvZGU+PGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogcGFzcyA8Y29kZT5hPC9jb2RlPiwgPGNvZGU+YjwvY29kZT4gd2hpY2ggYXJlCisgICAgICogbm90IGluIHRoZSA8Y29kZT5maWVsZDwvY29kZT4gb2YgdHlwZSA8Y29kZT5FQ0ZpZWxkRjJtPC9jb2RlPjxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCB0aHJvdyA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVsbGlwdGljQ3VydmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGJ5dGVbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVsbGlwdGljQ3VydmVFQ0ZpZWxkQmlnSW50ZWdlckJpZ0ludGVnZXJieXRlQXJyYXkwNCgpIHsKKyAgICAgICAgLy8gdGVzdCBjYXNlIDEgcGFyYW1ldGVycyBzZXQsCisgICAgICAgIC8vIGEgaXMgbm90IGluIGZpZWxkCisgICAgICAgIEVDRmllbGRGMm0gZiA9IG5ldyBFQ0ZpZWxkRjJtKDUpOworICAgICAgICBCaWdJbnRlZ2VyIGEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMzJMKTsKKyAgICAgICAgQmlnSW50ZWdlciBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIGJ5dGVbXSBzZWVkID0gbmV3IGJ5dGVbMjRdOworCisgICAgICAgIC8vIHBlcmZvcm0gdGVzdCBjYXNlIDEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFbGxpcHRpY0N1cnZlKGYsIGEsIGIsIHNlZWQpOworICAgICAgICAgICAgZmFpbCgiIzE6IEV4cGVjdGVkIElBRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvaykge30KKworICAgICAgICAvLyB0ZXN0IGNhc2UgMiBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgLy8gYiBpcyBub3QgaW4gZmllbGQKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRjJtKDUpOworICAgICAgICBhID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMzJMKTsKKyAgICAgICAgc2VlZCA9IG5ldyBieXRlWzI0XTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYiwgc2VlZCk7CisgICAgICAgICAgICBmYWlsKCIjMjogRXhwZWN0ZWQgSUFFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7fQorCisgICAgICAgIC8vIHRlc3QgY2FzZSAzIHBhcmFtZXRlcnMgc2V0LAorICAgICAgICAvLyBib3RoIGEgYW5kIGIgYXJlIG5vdCBpbiBmaWVsZAorICAgICAgICBmID0gbmV3IEVDRmllbGRGMm0oNSk7CisgICAgICAgIGEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMzJMKTsKKyAgICAgICAgYiA9IEJpZ0ludGVnZXIudmFsdWVPZig0M0wpOworICAgICAgICBzZWVkID0gbmV3IGJ5dGVbMjRdOworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiLCBzZWVkKTsKKyAgICAgICAgICAgIGZhaWwoIiMzOiBFeHBlY3RlZCBJQUUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb2spIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IgPGNvZGU+RWxsaXB0aWNDdXJ2ZShFQ0ZpZWxkLCBCaWdJbnRlZ2VyLCBCaWdJbnRlZ2VyLCBieXRlW10pPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogYXJyYXkgPGNvZGU+c2VlZDwvY29kZT4gaXMgY29waWVkIHRvIHByZXZlbnQgc3Vic2VxdWVudCBtb2RpZmljYXRpb248YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBwYXNzIDxjb2RlPnNlZWQ8L2NvZGU+IHRvIHRoZSBjdG9yIHRoZW4gbW9kaWZ5IGl0PGJyPgorICAgICAqIEV4cGVjdGVkOiBnZXRTZWVkKCkgbXVzdCByZXR1cm4gdW5tb2RpZmllZCBhcnJheQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgYnl0ZSBhcnJheSBvZiBFbGxpcHRpY0N1cnZlIGNhbid0IGJlIG1vZGlmaWVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRWxsaXB0aWNDdXJ2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LnNwZWMuRUNGaWVsZC5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbGxpcHRpY0N1cnZlRUNGaWVsZEJpZ0ludGVnZXJCaWdJbnRlZ2VyYnl0ZUFycmF5MDUoKSB7CisgICAgICAgIEVDRmllbGRGMm0gZiA9IG5ldyBFQ0ZpZWxkRjJtKDUpOworICAgICAgICBCaWdJbnRlZ2VyIGEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMEwpOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgYnl0ZVtdIHNlZWQgPSBuZXcgYnl0ZVsyNF07CisgICAgICAgIGJ5dGVbXSBzZWVkQ29weSA9IHNlZWQuY2xvbmUoKTsKKyAgICAgICAgRWxsaXB0aWNDdXJ2ZSBjID0gbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYiwgc2VlZENvcHkpOworICAgICAgICAvLyBtb2RpZnkgYXJyYXkgcGFzc2VkCisgICAgICAgIHNlZWRDb3B5WzBdID0gKGJ5dGUpIDE7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgYWJvdmUgbW9kaWZpY2F0aW9uIGRpZCBub3QgY2hhbmdlZAorICAgICAgICAvLyBpbnRlcm5hbCBzdGF0ZSBvZiB0ZXN0IG9iamVjdAorICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoc2VlZCwgYy5nZXRTZWVkKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5FbGxpcHRpY0N1cnZlKEVDRmllbGQsIEJpZ0ludGVnZXIsIEJpZ0ludGVnZXIpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogY3JlYXRlcyBpbnN0YW5jZSBvZiBFbGxpcHRpY0N1cnZlPGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogdmFsaWQgcGFyYW1ldGVycyBwYXNzZWQsIGZpZWxkIHR5cGUgaXMgRUNGaWVsZEZwPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHBhc3Mgd2l0aG91dCBhbnkgZXhjZXB0aW9ucworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRWxsaXB0aWNDdXJ2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnNlY3VyaXR5LnNwZWMuRUNGaWVsZC5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbGxpcHRpY0N1cnZlRUNGaWVsZEJpZ0ludGVnZXJCaWdJbnRlZ2VyMDEoKSB7CisgICAgICAgIC8vIHRlc3QgY2FzZSAxIHBhcmFtZXRlcnMgc2V0CisgICAgICAgIEVDRmllbGRGcCBmID0gbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSk7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIuT05FOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMQorICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKworICAgICAgICAvLyB0ZXN0IGNhc2UgMiBwYXJhbWV0ZXJzIHNldAorICAgICAgICBFQ0ZpZWxkRjJtIGYxID0gbmV3IEVDRmllbGRGMm0oNSk7CisgICAgICAgIGEgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMgorICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmMSwgYSwgYik7CisKKyAgICAgICAgLy8gdGVzdCBjYXNlIDMgcGFyYW1ldGVycyBzZXQsCisgICAgICAgIC8vIHRoZSBzZWVkIHBhcmFtZXRlciBtYXkgYmUgbnVsbCAKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMworICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5FbGxpcHRpY0N1cnZlKEVDRmllbGQsIEJpZ0ludGVnZXIsIEJpZ0ludGVnZXIpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogdGhyb3dzIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiBpZiA8Y29kZT5maWVsZDwvY29kZT4sCisgICAgICogPGNvZGU+YTwvY29kZT4gb3IgPGNvZGU+YjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBwYXNzIDxjb2RlPm51bGw8L2NvZGU+IGFzIG1lbnRpb25lZCBwYXJhbWV0ZXJzPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHRocm93IDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVsbGlwdGljQ3VydmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RWxsaXB0aWNDdXJ2ZUVDRmllbGRCaWdJbnRlZ2VyQmlnSW50ZWdlcjAyKCkgeworICAgICAgICAvLyB0ZXN0IGNhc2UgMSBwYXJhbWV0ZXJzIHNldAorICAgICAgICBFQ0ZpZWxkRnAgZiA9IG51bGw7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIuT05FOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAxCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICAgICAgICAgIGZhaWwoIiMxOiBFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykge30KKworICAgICAgICAvLyB0ZXN0IGNhc2UgMiBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gbnVsbDsKKyAgICAgICAgYiA9IEJpZ0ludGVnZXIudmFsdWVPZigxOUwpOworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICAgICAgICAgIGZhaWwoIiMyOiBFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykge30KKworICAgICAgICAvLyB0ZXN0IGNhc2UgMyBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgIGIgPSBudWxsOworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICAgICAgICAgIGZhaWwoIiMzOiBFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5FbGxpcHRpY0N1cnZlKEVDRmllbGQsIEJpZ0ludGVnZXIsIEJpZ0ludGVnZXIpPC9jb2RlPgorICAgICAqIGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogdGhyb3dzIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaWYKKyAgICAgKiA8Y29kZT5hPC9jb2RlPiBvciA8Y29kZT5iPC9jb2RlPiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gYW5kIG5vdCBpbgorICAgICAqIHRoZSA8Y29kZT5maWVsZDwvY29kZT48YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBwYXNzIDxjb2RlPmE8L2NvZGU+LCA8Y29kZT5iPC9jb2RlPiB3aGljaCBhcmUKKyAgICAgKiBub3QgaW4gdGhlIDxjb2RlPmZpZWxkPC9jb2RlPiBvZiB0eXBlIDxjb2RlPkVDRmllbGRGcDwvY29kZT48YnI+CisgICAgICogRXhwZWN0ZWQ6IG11c3QgdGhyb3cgPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbGxpcHRpY0N1cnZlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVsbGlwdGljQ3VydmVFQ0ZpZWxkQmlnSW50ZWdlckJpZ0ludGVnZXIwMygpIHsKKyAgICAgICAgLy8gdGVzdCBjYXNlIDEgcGFyYW1ldGVycyBzZXQsCisgICAgICAgIC8vIGEgaXMgbm90IGluIGZpZWxkCisgICAgICAgIEVDRmllbGRGcCBmID0gbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSk7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIudmFsdWVPZigyNEwpOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAxCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICAgICAgICAgIGZhaWwoIiMxOiBFeHBlY3RlZCBJQUUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb2spIHt9CisKKyAgICAgICAgLy8gdGVzdCBjYXNlIDEuMSBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgLy8gYSBpcyBub3QgaW4gZmllbGQKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gQmlnSW50ZWdlci52YWx1ZU9mKDIzTCk7CisgICAgICAgIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMS4xCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICAgICAgICAgIGZhaWwoIiMxLjE6IEV4cGVjdGVkIElBRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvaykge30KKworICAgICAgICAvLyB0ZXN0IGNhc2UgMiBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgLy8gYiBpcyBub3QgaW4gZmllbGQKKyAgICAgICAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBhID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjRMKTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYik7CisgICAgICAgICAgICBmYWlsKCIjMjogRXhwZWN0ZWQgSUFFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7fQorCisgICAgICAgIC8vIHRlc3QgY2FzZSAzIHBhcmFtZXRlcnMgc2V0LAorICAgICAgICAvLyBib3RoIGEgYW5kIGIgYXJlIG5vdCBpbiBmaWVsZAorICAgICAgICBmID0gbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSk7CisgICAgICAgIGEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjVMKTsKKyAgICAgICAgYiA9IEJpZ0ludGVnZXIudmFsdWVPZigyNDBMKTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYik7CisgICAgICAgICAgICBmYWlsKCIjMzogRXhwZWN0ZWQgSUFFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7fQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzQgZm9yIDxjb2RlPkVsbGlwdGljQ3VydmUoRUNGaWVsZCwgQmlnSW50ZWdlciwgQmlnSW50ZWdlciwgYnl0ZVtdKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IHRocm93cyA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlmCisgICAgICogPGNvZGU+YTwvY29kZT4gb3IgPGNvZGU+YjwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBub3QgaW4KKyAgICAgKiB0aGUgPGNvZGU+ZmllbGQ8L2NvZGU+PGJyPgorICAgICAqIFRlc3QgcHJlY29uZGl0aW9uczogcGFzcyA8Y29kZT5hPC9jb2RlPiwgPGNvZGU+YjwvY29kZT4gd2hpY2ggYXJlCisgICAgICogbm90IGluIHRoZSA8Y29kZT5maWVsZDwvY29kZT4gb2YgdHlwZSA8Y29kZT5FQ0ZpZWxkRjJtPC9jb2RlPjxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCB0aHJvdyA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVsbGlwdGljQ3VydmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RWxsaXB0aWNDdXJ2ZUVDRmllbGRCaWdJbnRlZ2VyQmlnSW50ZWdlcjA0KCkgeworICAgICAgICAvLyB0ZXN0IGNhc2UgMSBwYXJhbWV0ZXJzIHNldCwKKyAgICAgICAgLy8gYSBpcyBub3QgaW4gZmllbGQKKyAgICAgICAgRUNGaWVsZEYybSBmID0gbmV3IEVDRmllbGRGMm0oNSk7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIudmFsdWVPZigzMkwpOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgLy8gcGVyZm9ybSB0ZXN0IGNhc2UgMQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYik7CisgICAgICAgICAgICBmYWlsKCIjMTogRXhwZWN0ZWQgSUFFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9rKSB7fQorCisgICAgICAgIC8vIHRlc3QgY2FzZSAyIHBhcmFtZXRlcnMgc2V0LAorICAgICAgICAvLyBiIGlzIG5vdCBpbiBmaWVsZAorICAgICAgICBmID0gbmV3IEVDRmllbGRGMm0oNSk7CisgICAgICAgIGEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgYiA9IEJpZ0ludGVnZXIudmFsdWVPZigzMkwpOworICAgICAgICAvLyBwZXJmb3JtIHRlc3QgY2FzZSAyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICAgICAgICAgIGZhaWwoIiMyOiBFeHBlY3RlZCBJQUUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb2spIHt9CisKKyAgICAgICAgLy8gdGVzdCBjYXNlIDMgcGFyYW1ldGVycyBzZXQsCisgICAgICAgIC8vIGJvdGggYSBhbmQgYiBhcmUgbm90IGluIGZpZWxkCisgICAgICAgIGYgPSBuZXcgRUNGaWVsZEYybSg1KTsKKyAgICAgICAgYSA9IEJpZ0ludGVnZXIudmFsdWVPZigzMkwpOworICAgICAgICBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDQzTCk7CisgICAgICAgIC8vIHBlcmZvcm0gdGVzdCBjYXNlIDMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBFbGxpcHRpY0N1cnZlKGYsIGEsIGIpOworICAgICAgICAgICAgZmFpbCgiIzM6IEV4cGVjdGVkIElBRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvaykge30KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRBKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgY29lZmZpY2llbnQgPGNvZGU+YTwvY29kZT48YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiA8Y29kZT5FQ0ZpZWxkRjJtPC9jb2RlPiBpbnN0YW5jZQorICAgICAqIGNyZWF0ZWQgdXNpbmcgdmFsaWQgcGFyYW1ldGVyczxicj4KKyAgICAgKiBFeHBlY3RlZDogbXVzdCByZXR1cm4gY29lZmZpY2llbnQgPGNvZGU+YTwvY29kZT4gd2hpY2ggaXMgZXF1YWwKKyAgICAgKiB0byB0aGUgb25lIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3I7IChib3RoIG11c3QgcmVmZXIKKyAgICAgKiB0aGUgc2FtZSBvYmplY3QpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEEiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0QSgpIHsKKyAgICAgICAgRUNGaWVsZEYybSBmID0gbmV3IEVDRmllbGRGMm0oNSk7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIudmFsdWVPZig1TCk7CisgICAgICAgIEJpZ0ludGVnZXIgYiA9IEJpZ0ludGVnZXIudmFsdWVPZigxOUwpOworICAgICAgICBFbGxpcHRpY0N1cnZlIGMgPSBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGMuZ2V0QSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShhLCBjLmdldEEoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmEvc2VjdXJpdHkvc3BlYy9FbGxpcHRpY0N1cnZlI0VsbGlwdGljQ3VydmUoRWNGaWVsZCxCaWdJbnRlZ2VyLEJpZ0ludGVnZXIpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVsbGlwdGljQ3VydmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RWxsaXB0aWNDdXJ2ZUVDRmllbGRCaWdJbnRlZ2VyQmlnSW50ZWdlcjA1KCkgeworICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIYXJtb255LTczMQorICAgICAgICBFbGxpcHRpY0N1cnZlIGVjID0gbmV3IEVsbGlwdGljQ3VydmUobmV3IHRlc3RFQ0ZpZWxkKCksIEJpZ0ludGVnZXIKKyAgICAgICAgICAgICAgICAudmFsdWVPZig0TCksIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgYSIsIGVjLmdldEEoKSwgQmlnSW50ZWdlci52YWx1ZU9mKDRMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW5jb3JyZWN0IGIiLCBlYy5nZXRCKCksIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3Qgc2l6ZSIsIGVjLmdldEZpZWxkKCkuZ2V0RmllbGRTaXplKCksIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldEIoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBjb2VmZmljaWVudCA8Y29kZT5iPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IDxjb2RlPkVDRmllbGRGMm08L2NvZGU+IGluc3RhbmNlCisgICAgICogY3JlYXRlZCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHJldHVybiBjb2VmZmljaWVudCA8Y29kZT5iPC9jb2RlPiB3aGljaCBpcyBlcXVhbAorICAgICAqIHRvIHRoZSBvbmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcjsgKGJvdGggbXVzdCByZWZlcgorICAgICAqIHRoZSBzYW1lIG9iamVjdCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRCKCkgeworICAgICAgICBFQ0ZpZWxkRjJtIGYgPSBuZXcgRUNGaWVsZEYybSg1KTsKKyAgICAgICAgQmlnSW50ZWdlciBhID0gQmlnSW50ZWdlci52YWx1ZU9mKDVMKTsKKyAgICAgICAgQmlnSW50ZWdlciBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIEVsbGlwdGljQ3VydmUgYyA9IG5ldyBFbGxpcHRpY0N1cnZlKGYsIGEsIGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYiwgYy5nZXRCKCkpOworICAgICAgICBhc3NlcnRTYW1lKGIsIGMuZ2V0QigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRGaWVsZCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIDxjb2RlPmZpZWxkPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IDxjb2RlPkVDRmllbGRGMm08L2NvZGU+IGluc3RhbmNlCisgICAgICogY3JlYXRlZCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHJldHVybiA8Y29kZT5maWVsZDwvY29kZT4gd2hpY2ggaXMgZXF1YWwKKyAgICAgKiB0byB0aGUgb25lIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3I7IChib3RoIG11c3QgcmVmZXIKKyAgICAgKiB0aGUgc2FtZSBvYmplY3QpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEZpZWxkKCkgeworICAgICAgICBFQ0ZpZWxkRjJtIGYgPSBuZXcgRUNGaWVsZEYybSg1KTsKKyAgICAgICAgQmlnSW50ZWdlciBhID0gQmlnSW50ZWdlci52YWx1ZU9mKDVMKTsKKyAgICAgICAgQmlnSW50ZWdlciBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIEVsbGlwdGljQ3VydmUgYyA9IG5ldyBFbGxpcHRpY0N1cnZlKGYsIGEsIGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZiwgYy5nZXRGaWVsZCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShmLCBjLmdldEZpZWxkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldFNlZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyA8Y29kZT5zZWVkPC9jb2RlPjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IDxjb2RlPkVDRmllbGRGMm08L2NvZGU+IGluc3RhbmNlCisgICAgICogY3JlYXRlZCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzPGJyPgorICAgICAqIEV4cGVjdGVkOiBtdXN0IHJldHVybiA8Y29kZT5zZWVkPC9jb2RlPiB3aGljaCBpcyBlcXVhbAorICAgICAqIHRvIHRoZSBvbmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRTZWVkMDEoKSB7CisgICAgICAgIEVDRmllbGRGcCBmID0gbmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSk7CisgICAgICAgIEJpZ0ludGVnZXIgYSA9IEJpZ0ludGVnZXIuT05FOworICAgICAgICBCaWdJbnRlZ2VyIGIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKTsKKyAgICAgICAgYnl0ZVtdIHNlZWQgPSBuZXcgYnl0ZVsyNF07CisgICAgICAgIEVsbGlwdGljQ3VydmUgYyA9IG5ldyBFbGxpcHRpY0N1cnZlKGYsIGEsIGIsIHNlZWQpOworICAgICAgICBieXRlW10gc2VlZFJldCA9IGMuZ2V0U2VlZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNlZWRSZXQpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoc2VlZCwgc2VlZFJldCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPmdldFNlZWQoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJuZWQgYXJyYXkgaXMgY29waWVkIHRvIHByZXZlbnQgc3Vic2VxdWVudCBtb2RpZmljYXRpb248YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiA8Y29kZT5FQ0ZpZWxkRjJtPC9jb2RlPiBpbnN0YW5jZQorICAgICAqIGNyZWF0ZWQgdXNpbmcgdmFsaWQgcGFyYW1ldGVyczsgPGNvZGU+Z2V0U2VlZCgpPC9jb2RlPgorICAgICAqIGNhbGxlZCBhbmQgdGhlbiByZXR1cm5lZCBhcnJheSBtb2RpZmllZDxicj4KKyAgICAgKiBFeHBlY3RlZDogaW50ZXJuYWwgc3RhdGUgbXVzdCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlIG1vZGlmaWNhdGlvbgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgbW9kaWZpY2F0aW9uIG9mIGJ5dGUgYXJyYXkgIGRvZXNuJ3QgY2hhbmdlICIgKworICAgICAgICAgICAgImludGVybmFsIHN0YXRlIG9mIHRlc3Qgb2JqZWN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0U2VlZDAyKCkgeworICAgICAgICBFQ0ZpZWxkRnAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBCaWdJbnRlZ2VyIGEgPSBCaWdJbnRlZ2VyLk9ORTsKKyAgICAgICAgQmlnSW50ZWdlciBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIGJ5dGVbXSBzZWVkID0gbmV3IGJ5dGVbMjRdOworICAgICAgICBFbGxpcHRpY0N1cnZlIGMgPSBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiLCBzZWVkLmNsb25lKCkpOworICAgICAgICBieXRlW10gc2VlZFJldCA9IGMuZ2V0U2VlZCgpOworICAgICAgICAvLyBtb2RpZnkgcmV0dXJuZWQgYXJyYXkKKyAgICAgICAgc2VlZFJldFswXSA9IChieXRlKSAxOworICAgICAgICAvLyBjaGVjayB0aGF0IGFib3ZlIG1vZGlmaWNhdGlvbiBkaWQgbm90IGNoYW5nZWQKKyAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGUgb2YgdGVzdCBvYmplY3QKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHNlZWQsIGMuZ2V0U2VlZCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+Z2V0U2VlZCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5lZCBhcnJheSBpcyBjb3BpZWQgdG8gcHJldmVudCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbjxicj4KKyAgICAgKiBUZXN0IHByZWNvbmRpdGlvbnM6IDxjb2RlPkVDRmllbGRGMm08L2NvZGU+IGluc3RhbmNlCisgICAgICogY3JlYXRlZCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzPGJyPgorICAgICAqIEV4cGVjdGVkOiByZXBlYXRlZCBtZXRob2QgY2FsbHMgbXVzdCByZXR1cm4gZGlmZmVyZW50IHJlZnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHJlcGVhdGVkIGNhbGxzIG9mIGdldFNlZWQgbWV0aG9kIG11c3QgIiArCisgICAgICAgICAgICAicmV0dXJuIGRpZmZlcmVudCByZWZzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0U2VlZDAzKCkgeworICAgICAgICBFQ0ZpZWxkRnAgZiA9IG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpOworICAgICAgICBCaWdJbnRlZ2VyIGEgPSBCaWdJbnRlZ2VyLk9ORTsKKyAgICAgICAgQmlnSW50ZWdlciBiID0gQmlnSW50ZWdlci52YWx1ZU9mKDE5TCk7CisgICAgICAgIGJ5dGVbXSBzZWVkID0gbmV3IGJ5dGVbMjRdOworICAgICAgICBFbGxpcHRpY0N1cnZlIGMgPSBuZXcgRWxsaXB0aWNDdXJ2ZShmLCBhLCBiLCBzZWVkKTsKKyAgICAgICAgYy5nZXRTZWVkKCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoYy5nZXRTZWVkKCksIGMuZ2V0U2VlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5zcGVjLkVsbGlwdGljQ3VydmUjZ2V0U2VlZCgpCisgICAgICogQXNzZXJ0aW9uOiBudWxsIGlmIG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRTZWVkMDQoKSB7CisgICAgICAgIC8vUmVncmVzc2lvbiBmb3IgSEFSTU9OWS03MzIKKyAgICAgICAgRUNGaWVsZEZwIGYgPSBuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKTsKKyAgICAgICAgQmlnSW50ZWdlciBhID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgIGFzc2VydE51bGwobmV3IEVsbGlwdGljQ3VydmUoZiwgYSwgYSkuZ2V0U2VlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5lcXVhbHMoT2JqZWN0IG90aGVyKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJuIHRydWUgaWYgdGhpcyBhbmQgb3RoZXIgb2JqZWN0cyBhcmUgZXF1YWw8YnI+CisgICAgICogVGVzdCBwcmVjb25kaXRpb25zOiBzZWUgdGVzdCBjb21tZW50czxicj4KKyAgICAgKiBFeHBlY3RlZDogYWxsIG9iamVjdHMgaW4gdGhpcyB0ZXN0IG11c3QgYmUgZXF1YWwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFcXVhbHNPYmplY3QwMSgpIHsKKyAgICAgICAgLy8gdGVzdCBjYXNlIDE6IG11c3QgYmUgZXF1YWwgdG8gaXRzZWxmCisgICAgICAgIEVsbGlwdGljQ3VydmUgYzIgPSBudWxsLCBjMSA9IG5ldyBFbGxpcHRpY0N1cnZlKG5ldyBFQ0ZpZWxkRnAoCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpLCBCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlcgorICAgICAgICAgICAgICAgIC52YWx1ZU9mKDE5TCkpOworICAgICAgICBhc3NlcnRUcnVlKGMxLmVxdWFscyhjMSkpOworCisgICAgICAgIC8vIHRlc3QgY2FzZSAyOiBlcXVhbCBvYmplY3RzCisgICAgICAgIGMxID0gbmV3IEVsbGlwdGljQ3VydmUobmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSksCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsIEJpZ0ludGVnZXIudmFsdWVPZigxOUwpKTsKKyAgICAgICAgYzIgPSBuZXcgRWxsaXB0aWNDdXJ2ZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMUwpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKSk7CisgICAgICAgIGFzc2VydFRydWUoYzEuZXF1YWxzKGMyKSAmJiBjMi5lcXVhbHMoYzEpKTsKKworICAgICAgICAvLyB0ZXN0IGNhc2UgMzogZXF1YWwgb2JqZWN0cyB3aXRoIHNlZWQgbm90IG51bGwKKyAgICAgICAgYzEgPSBuZXcgRWxsaXB0aWNDdXJ2ZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci52YWx1ZU9mKDE5TCksIG5ldyBieXRlWzI0XSk7CisgICAgICAgIGMyID0gbmV3IEVsbGlwdGljQ3VydmUobmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyLnZhbHVlT2YoMjNMKSksCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDFMKSwgQmlnSW50ZWdlci52YWx1ZU9mKDE5TCksIG5ldyBieXRlWzI0XSk7CisgICAgICAgIGFzc2VydFRydWUoYzEuZXF1YWxzKGMyKSAmJiBjMi5lcXVhbHMoYzEpKTsKKworICAgICAgICAvLyB0ZXN0IGNhc2UgNDogZXF1YWwgb2JqZWN0IGFuZCBzdWJjbGFzcyBvYmplY3QKKyAgICAgICAgYzEgPSBuZXcgRWxsaXB0aWNDdXJ2ZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci52YWx1ZU9mKDE5TCksIG5ldyBieXRlWzI0XSk7CisgICAgICAgIE15RWxsaXB0aWNDdXJ2ZSBjMyA9IG5ldyBNeUVsbGlwdGljQ3VydmUobmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyCisgICAgICAgICAgICAgICAgLnZhbHVlT2YoMjNMKSksIEJpZ0ludGVnZXIuT05FLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKSwKKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVsyNF0pOworICAgICAgICBhc3NlcnRUcnVlKGMxLmVxdWFscyhjMykgJiYgYzMuZXF1YWxzKGMxKSk7CisKKyAgICAgICAgLy8gdGVzdCBjYXNlIDU6IGVxdWFsIG9iamVjdHMKKyAgICAgICAgYzEgPSBuZXcgRWxsaXB0aWNDdXJ2ZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci52YWx1ZU9mKDE5TCkpOworICAgICAgICBjMiA9IG5ldyBFbGxpcHRpY0N1cnZlKG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlci52YWx1ZU9mKDIzTCkpLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxTCksIEJpZ0ludGVnZXIudmFsdWVPZigxOUwpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjMS5lcXVhbHMoYzIpICYmIGMyLmVxdWFscyhjMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmhhc2hDb2RlKCk8L2NvZGU+IG1ldGhvZC48YnI+CisgICAgICoKKyAgICAgKiBBc3NlcnRpb246IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGlmIGludm9rZWQKKyAgICAgKiByZXBlYXRlZGx5IG9uIHRoZSBzYW1lIG9iamVjdC4gCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBzZXZlcmFsIGNhbGxzIG9mIGhhc2hDb2RlIG1ldGhvZCBmb3IgIiArCisgICAgICAgICAgICAidGhlIHNhbWUgb2JqZWN0cyByZXR1cm4gdGhlIHNhbWUgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEhhc2hDb2RlMDEoKSB7CisgICAgICAgIGludCBoYyA9IDA7CisgICAgICAgIEVsbGlwdGljQ3VydmUgZiA9IG5ldyBFbGxpcHRpY0N1cnZlKG5ldyBFQ0ZpZWxkRnAoQmlnSW50ZWdlcgorICAgICAgICAgICAgICAgIC52YWx1ZU9mKDIzTCkpLCBCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci52YWx1ZU9mKDE5TCksCisgICAgICAgICAgICAgICAgbmV3IGJ5dGVbMjRdKTsKKyAgICAgICAgaGMgPSBmLmhhc2hDb2RlKCk7CisgICAgICAgIGFzc2VydFRydWUoaGMgPT0gZi5oYXNoQ29kZSgpICYmIGhjID09IGYuaGFzaENvZGUoKQorICAgICAgICAgICAgICAgICYmIGhjID09IGYuaGFzaENvZGUoKSAmJiBoYyA9PSBmLmhhc2hDb2RlKCkKKyAgICAgICAgICAgICAgICAmJiBoYyA9PSBmLmhhc2hDb2RlKCkgJiYgaGMgPT0gZi5oYXNoQ29kZSgpCisgICAgICAgICAgICAgICAgJiYgaGMgPT0gZi5oYXNoQ29kZSgpICYmIGhjID09IGYuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+aGFzaENvZGUoKTwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKgorICAgICAqIEFzc2VydGlvbjogbXVzdCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgaWYgaW52b2tlZAorICAgICAqIG9uIGVxdWFsIChhY2NvcmRpbmcgdG8gdGhlIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiBtZXRob2QpIG9iamVjdHMuIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEhhc2hDb2RlMDIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRWxsaXB0aWNDdXJ2ZShuZXcgRUNGaWVsZEZwKEJpZ0ludGVnZXIudmFsdWVPZigyM0wpKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci52YWx1ZU9mKDE5TCksIG5ldyBieXRlWzI0XSkKKyAgICAgICAgICAgICAgICAuaGFzaENvZGUoKSwgbmV3IEVsbGlwdGljQ3VydmUobmV3IEVDRmllbGRGcChCaWdJbnRlZ2VyCisgICAgICAgICAgICAgICAgLnZhbHVlT2YoMjNMKSksIEJpZ0ludGVnZXIuT05FLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMTlMKSwKKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVsyNF0pLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gUHJpdmF0ZSBzdHVmZgorICAgIC8vCisKKyAgICBjbGFzcyB0ZXN0RUNGaWVsZCBpbXBsZW1lbnRzIEVDRmllbGQgeworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RmllbGRTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbGxpcHRpY0N1cnZlIHN1YmNsYXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICogCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlFbGxpcHRpY0N1cnZlIGV4dGVuZHMgRWxsaXB0aWNDdXJ2ZSB7CisKKyAgICAgICAgTXlFbGxpcHRpY0N1cnZlKEVDRmllbGQgZiwgQmlnSW50ZWdlciBhLCBCaWdJbnRlZ2VyIGIsIGJ5dGVbXSBzZWVkKSB7CisgICAgICAgICAgICBzdXBlcihmLCBhLCBiLCBzZWVkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FbmNvZGVkS2V5U3BlYzJUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRW5jb2RlZEtleVNwZWMyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjkzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvRW5jb2RlZEtleVNwZWMyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuWDUwOUVuY29kZWRLZXlTcGVjOworCitAVGVzdFRhcmdldENsYXNzKEVuY29kZWRLZXlTcGVjLmNsYXNzKQorcHVibGljIGNsYXNzIEVuY29kZWRLZXlTcGVjMlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YS5zZWN1cml0eS5zcGVjLkVuY29kZWRLZXlTcGVjI2dldEVuY29kZWQoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlHZW4gPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJEU0EiKTsKKworICAgICAgICAgICAgICAga2V5R2VuLmluaXRpYWxpemUoMTAyNCk7CisgICAgICAgICAgICAgICBLZXlQYWlyIGtleXMgPSBrZXlHZW4uZ2VuZXJhdGVLZXlQYWlyKCk7CisKKworICAgICAgICAgICAgICAgS2V5RmFjdG9yeSBmYWN0ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSgiRFNBIik7CisKKworICAgICAgICAgICAgICAgLy8gY2hlY2sgcHVibGljIGtleSBlbmNvZGluZworICAgICAgICAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBrZXlzLmdldFB1YmxpYygpLmdldEVuY29kZWQoKTsKKyAgICAgICAgICAgICAgIEtleSBrZXkgPSBmYWN0LmdlbmVyYXRlUHVibGljKG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoZW5jb2RlZCkpOworCisgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJwdWJsaWMga2V5IGVuY29kaW5ncyB3ZXJlIGRpZmZlcmVudCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFcXVhbChrZXksIGtleXMuZ2V0UHVibGljKCkpKTsKKworICAgICAgICAgICAgICAgLy8gY2hlY2sgcHJpdmF0ZSBrZXkgZW5jb2RpbmcKKyAgICAgICAgICAgICAgIGVuY29kZWQgPSBrZXlzLmdldFByaXZhdGUoKS5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICAgICBrZXkgPSBmYWN0LmdlbmVyYXRlUHJpdmF0ZShuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhlbmNvZGVkKSk7CisKKyAgICAgICAgICAgICAgIGFzc2VydFRydWUoInByaXZhdGUga2V5IGVuY29kaW5ncyB3ZXJlIGRpZmZlcmVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VxdWFsKGtleSwga2V5cy5nZXRQcml2YXRlKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFcXVhbChLZXkga2V5MSwgS2V5IGtleTIpIHsKKyAgICAgICAgaWYgKGtleTEgaW5zdGFuY2VvZiBEU0FQdWJsaWNLZXkgJiYga2V5MiBpbnN0YW5jZW9mIERTQVB1YmxpY0tleSkgeworICAgICAgICAgICAgRFNBUHVibGljS2V5IGRzYTEgPSAoKERTQVB1YmxpY0tleSkga2V5MSk7CisgICAgICAgICAgICBEU0FQdWJsaWNLZXkgZHNhMiA9ICgoRFNBUHVibGljS2V5KSBrZXkyKTsKKyAgICAgICAgICAgIHJldHVybiBkc2ExLmdldFkoKS5lcXVhbHMoZHNhMi5nZXRZKCkpCisgICAgICAgICAgICAgICAgICAgICYmIGRzYTEuZ2V0UGFyYW1zKCkuZ2V0RygpLmVxdWFscyhkc2EyLmdldFBhcmFtcygpLmdldEcoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZHNhMS5nZXRQYXJhbXMoKS5nZXRQKCkuZXF1YWxzKGRzYTIuZ2V0UGFyYW1zKCkuZ2V0UCgpKQorICAgICAgICAgICAgICAgICAgICAmJiBkc2ExLmdldFBhcmFtcygpLmdldFEoKS5lcXVhbHMoZHNhMi5nZXRQYXJhbXMoKS5nZXRRKCkpOworCisgICAgICAgIH0gZWxzZSBpZiAoa2V5MSBpbnN0YW5jZW9mIERTQVByaXZhdGVLZXkKKyAgICAgICAgICAgICAgICAmJiBrZXkyIGluc3RhbmNlb2YgRFNBUHJpdmF0ZUtleSkgeworICAgICAgICAgICAgRFNBUHJpdmF0ZUtleSBkc2ExID0gKChEU0FQcml2YXRlS2V5KSBrZXkxKTsKKyAgICAgICAgICAgIERTQVByaXZhdGVLZXkgZHNhMiA9ICgoRFNBUHJpdmF0ZUtleSkga2V5Mik7CisgICAgICAgICAgICByZXR1cm4gZHNhMS5nZXRYKCkuZXF1YWxzKGRzYTIuZ2V0WCgpKQorICAgICAgICAgICAgICAgICAgICAmJiBkc2ExLmdldFBhcmFtcygpLmdldEcoKS5lcXVhbHMoZHNhMi5nZXRQYXJhbXMoKS5nZXRHKCkpCisgICAgICAgICAgICAgICAgICAgICYmIGRzYTEuZ2V0UGFyYW1zKCkuZ2V0UCgpLmVxdWFscyhkc2EyLmdldFBhcmFtcygpLmdldFAoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZHNhMS5nZXRQYXJhbXMoKS5nZXRRKCkuZXF1YWxzKGRzYTIuZ2V0UGFyYW1zKCkuZ2V0USgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FbmNvZGVkS2V5U3BlY1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9FbmNvZGVkS2V5U3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWUxOTIwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0VuY29kZWRLZXlTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5zcGVjLk15RW5jb2RlZEtleVNwZWM7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRW5jb2RlZEtleVNwZWM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+RW5jb2RlZEtleVNwZWM8L2NvZGU+IGNsYXNzIGZpZWxkcyBhbmQgbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKEVuY29kZWRLZXlTcGVjLmNsYXNzKQorcHVibGljIGNsYXNzIEVuY29kZWRLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBFbmNvZGVkS2V5U3BlY1Rlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRW5jb2RlZEtleVNwZWNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGZvciBjb25zdHJ1Y3RvciA8Y29kZT5FbmNvZGVkS2V5U3BlYyhieXRlW10pPC9jb2RlPjxicj4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsIHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJFbmNvZGVkS2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbmNvZGVkS2V5U3BlYygpIHsKKyAgICAgICAgYnl0ZVtdIGVuY29kZWRLZXkgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDEsIChieXRlKSAyLCAoYnl0ZSkgMywgKGJ5dGUpIDQgfTsKKyAgICAgICAgRW5jb2RlZEtleVNwZWMgZWtzID0gbmV3IE15RW5jb2RlZEtleVNwZWMoZW5jb2RlZEtleSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgid3JvbmcgZW5jb2RlZCBrZXkgd2FzIHJldHVybmVkIiwgQXJyYXlzLmVxdWFscyhlbmNvZGVkS2V5LAorICAgICAgICAgICAgICAgIGVrcy5nZXRFbmNvZGVkKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIG9mIGVuY29kaW5nIGZvcm1hdCIsICJNeSIsIGVrcy5nZXRGb3JtYXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCA8Y29kZT5nZXRFbmNvZGVkKCk8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHZhbGlkIGJ5dGUgYXJyYXkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRFbmNvZGVkKCkgeworCisgICAgICAgIGJ5dGVbXSBlbmNvZGVkS2V5ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAxLCAoYnl0ZSkgMiwgKGJ5dGUpIDMsIChieXRlKSA0IH07CisgICAgICAgIEVuY29kZWRLZXlTcGVjIG1la3MgPSBuZXcgTXlFbmNvZGVkS2V5U3BlYyhlbmNvZGVkS2V5KTsKKworICAgICAgICAvKiBHZXQgZW5jb2RlZCBrZXkgKi8KKyAgICAgICAgYnl0ZVtdIGVrID0gbWVrcy5nZXRFbmNvZGVkKCk7CisKKyAgICAgICAgLyogQ2hlY2sgcmV0dXJuZWQgYXJyYXkgKi8KKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWRLZXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkS2V5W2ldICE9IGVrW2ldKSB7CisgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHBhc3NlZCAqLworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgYnkgbW9kaWZ5aW5nCisgICAgICogaW5pdGlhbCBhcnJheSB2YWx1ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkICIgKworICAgICAgICAgICAgImJ5IG1vZGlmeWluZyBpbml0aWFsIGFycmF5IHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY29kZWRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdElzU3RhdGVQcmVzZXJ2ZWQxKCkgeworICAgICAgICAvKiBDcmVhdGUgaW5pdGlhbCBieXRlIGFycmF5ICovCisgICAgICAgIGJ5dGVbXSBlbmNvZGVkS2V5ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAxLCAoYnl0ZSkgMiwgKGJ5dGUpIDMsIChieXRlKSA0IH07CisKKyAgICAgICAgRW5jb2RlZEtleVNwZWMgbWVrcyA9IG5ldyBNeUVuY29kZWRLZXlTcGVjKGVuY29kZWRLZXkpOworCisgICAgICAgIC8qIE1vZGlmeSBpbml0aWFsIGFycmF5J3MgdmFsdWUgKi8KKyAgICAgICAgZW5jb2RlZEtleVszXSA9IChieXRlKSA1OworCisgICAgICAgIC8qIEdldCBlbmNvZGVkIGtleSAqLworICAgICAgICBieXRlW10gZWsgPSBtZWtzLmdldEVuY29kZWQoKTsKKworICAgICAgICAvKiBDaGVjayB0aGF0IGJ5dGUgdmFsdWUgaGFzIG5vdCBiZWVuIGNoYW5nZWQgKi8KKyAgICAgICAgYXNzZXJ0VHJ1ZShla1szXSA9PSAoYnl0ZSkgNCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgdXNpbmcKKyAgICAgKiByZXR1cm5lZCB2YWx1ZSBvZiA8Y29kZT5nZXRFbmNvZGVkKCk8L2NvZGU+IG1ldGhvZAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkICIgKworICAgICAgICAgICAgImJ5IG1vZGlmeWluZyBpbml0aWFsIGFycmF5IHZhbHVlLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gIkVuY29kZWRLZXlTcGVjIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdElzU3RhdGVQcmVzZXJ2ZWQyKCkgeworCisgICAgICAgIGJ5dGVbXSBlbmNvZGVkS2V5ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAxLCAoYnl0ZSkgMiwgKGJ5dGUpIDMsIChieXRlKSA0IH07CisgICAgICAgIEVuY29kZWRLZXlTcGVjIG1la3MgPSBuZXcgTXlFbmNvZGVkS2V5U3BlYyhlbmNvZGVkS2V5KTsKKworICAgICAgICAvKiBHZXQgZW5jb2RlZCBrZXkgKi8KKyAgICAgICAgYnl0ZVtdIGVrID0gbWVrcy5nZXRFbmNvZGVkKCk7CisgICAgICAgIC8qIE1vZGlmeSByZXR1cm5lZCB2YWx1ZSAqLworICAgICAgICBla1szXSA9IChieXRlKSA1OworICAgICAgICAvKiBHZXQgZW5jb2RlZCBrZXkgYWdhaW4gKi8KKyAgICAgICAgYnl0ZVtdIGVrMSA9IG1la3MuZ2V0RW5jb2RlZCgpOworCisgICAgICAgIC8qIENoZWNrIHRoYXQgYnl0ZSB2YWx1ZSBoYXMgbm90IGJlZW4gY2hhbmdlZCAqLworICAgICAgICBhc3NlcnRUcnVlKGVrMVszXSA9PSAoYnl0ZSkgNCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb25UZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjY2M2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPkludmFsaWRLZXlTcGVjRXhjZXB0aW9uPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kCisgKiBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoSW52YWxpZEtleVNwZWNFeGNlcHRpb24uY2xhc3MpCitwdWJsaWMgY2xhc3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvblRlc3RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uVGVzdChTdHJpbmcgYXJnMCkgeworICAgICAgICBzdXBlcihhcmcwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIiB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyb3dhYmxlIHRDYXVzZSA9IG5ldyBUaHJvd2FibGUoIlRocm93YWJsZSBmb3IgZXhjZXB0aW9uIik7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246CisgICAgICogY29uc3RydWN0cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlTcGVjRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRLZXlTcGVjRXhjZXB0aW9uMDEoKSB7CisgICAgICAgIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkludmFsaWRLZXlTcGVjRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UgbXNnLgorICAgICAqIFBhcmFtZXRlciA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlTcGVjRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjAyKCkgeworICAgICAgICBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkludmFsaWRLZXlTcGVjRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPiBpcworICAgICAqIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlTcGVjRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjAzKCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gdEUgPSBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24obXNnKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+SW52YWxpZEtleVNwZWNFeGNlcHRpb24oVGhyb3dhYmxlKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gd2hlbiA8Y29kZT5jYXVzZTwvY29kZT4KKyAgICAgKiBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuVGhyb3dhYmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEtleVNwZWNFeGNlcHRpb24wNCgpIHsKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKKyAgICAgICAgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gdEUgPSBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oY2F1c2UpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbC4iLCB0RS5nZXRNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihUaHJvd2FibGUpPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB3aGVuIDxjb2RlPmNhdXNlPC9jb2RlPgorICAgICAqIGlzIG5vdCBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZXMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRLZXlTcGVjRXhjZXB0aW9uMDUoKSB7CisgICAgICAgIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKHRDYXVzZSk7CisgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRvUyA9IHRDYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgc2hvdWxkIGNvbnRhaW4gIi5jb25jYXQodG9TKSwgKGdldE0KKyAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwgdEUKKyAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRLZXlTcGVjRXhjZXB0aW9uMDYoKSB7CisgICAgICAgIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKCJnZXRNZXNzYWdlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkludmFsaWRLZXlTcGVjRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBudWxsIDxjb2RlPm1zZzwvY29kZT4gaXMgbm90IG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgY2F1c2UgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRLZXlTcGVjRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5UaHJvd2FibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjA3KCkgeworICAgICAgICBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihtc2dzW2ldLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkludmFsaWRLZXlTcGVjRXhjZXB0aW9uKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4KKyAgICAgKiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gd2hlbgorICAgICAqIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyBub3QgbnVsbCA8Y29kZT5tc2c8L2NvZGU+IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgbWVzc2FnZSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRLZXlTcGVjRXhjZXB0aW9uMDgoKSB7CisgICAgICAgIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKG51bGwsIHRDYXVzZSk7CisgICAgICAgIGlmICh0RS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRvUyA9IHRDYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGdldE0gPSB0RS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRNZXNzYWdlKCkgbXVzdCBzaG91bGQgIi5jb25jYXQodG9TKSwgKGdldE0KKyAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoImdldENhdXNlKCkgbXVzdCBub3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwgdEUKKyAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+CisgICAgICogY29uc3RydWN0b3IgQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHdoZW4KKyAgICAgKiA8Y29kZT5jYXVzZTwvY29kZT4gaXMgbm90IG51bGwgPGNvZGU+bXNnPC9jb2RlPiBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSW52YWxpZEtleVNwZWNFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlRocm93YWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRLZXlTcGVjRXhjZXB0aW9uMDkoKSB7CisgICAgICAgIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHRFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRFID0gbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKG1zZ3NbaV0sIHRDYXVzZSk7CisgICAgICAgICAgICBTdHJpbmcgZ2V0TSA9IHRFLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB0b1MgPSB0Q2F1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChtc2dzW2ldLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBtdXN0IGNvbnRhaW4gIi5jb25jYXQobXNnc1tpXSksIGdldE0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKG1zZ3NbaV0pICE9IC0xKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdldE0uZXF1YWxzKG1zZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiAiLmNvbmNhdCh0b1MpLCBnZXRNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YodG9TKSAhPSAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IG5vdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuICIuY29uY2F0KHRDYXVzZS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgdEUuZ2V0Q2F1c2UoKSwgdENhdXNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDk1ZjYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+SW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQKKyAqIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uVGVzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb25UZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBtc2dzID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiQ2hlY2sgbmV3IG1lc3NhZ2UiLAorICAgICAgICAgICAgIkNoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIENoZWNrIG5ldyBtZXNzYWdlIiB9OworCisgICAgc3RhdGljIFRocm93YWJsZSB0Q2F1c2UgPSBuZXcgVGhyb3dhYmxlKCJUaHJvd2FibGUgZm9yIGV4Y2VwdGlvbiIpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+SW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24oKTwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwKKyAgICAgKiBtZXNzYWdlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uMDEoKSB7CisgICAgICAgIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIHRFID0gbmV3IEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydE51bGwoImdldE1lc3NhZ2UoKSBtdXN0IHJldHVybiBudWxsLiIsIHRFLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydE51bGwoImdldENhdXNlKCkgbXVzdCByZXR1cm4gbnVsbCIsIHRFLmdldENhdXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UKKyAgICAgKiBtc2cuIFBhcmFtZXRlciA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjAyKCkgeworICAgICAgICBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbiB0RTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0RSA9IG5ldyBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbihtc2dzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuOiAiLmNvbmNhdChtc2dzW2ldKSwgdEUKKyAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgbXNnc1tpXSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJnZXRDYXVzZSgpIG11c3QgcmV0dXJuIG51bGwiLCB0RS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIHdoZW4gPGNvZGU+bXNnPC9jb2RlPgorICAgICAqIGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjAzKCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24gdEUgPSBuZXcgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbXNnKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0TWVzc2FnZSgpIG11c3QgcmV0dXJuIG51bGwuIiwgdEUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ2V0Q2F1c2UoKSBtdXN0IHJldHVybiBudWxsIiwgdEUuZ2V0Q2F1c2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL01HRjFQYXJhbWV0ZXJTcGVjVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL01HRjFQYXJhbWV0ZXJTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDNlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvTUdGMVBhcmFtZXRlclNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5NR0YxUGFyYW1ldGVyU3BlYzsKKworLyoqCisgKiBUZXN0IGZvciBNR0YxUGFyYW1ldGVyU3BlYyBjbGFzcworICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTUdGMVBhcmFtZXRlclNwZWMuY2xhc3MpCitwdWJsaWMgY2xhc3MgTUdGMVBhcmFtZXRlclNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogTWVhbmluZ2xlc3MgYWxnb3JpdGhtIG5hbWUganVzdCBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0QWxnTmFtZSA9ICJURVNUIjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBNR0YxUGFyYW1ldGVyU3BlY1Rlc3QuCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgTUdGMVBhcmFtZXRlclNwZWNUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+TUdGMVBhcmFtZXRlclNwZWM8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBuZXcgPGNvZGU+TUdGMVBhcmFtZXRlclNwZWM8L2NvZGU+CisgICAgICogb2JqZWN0IHVzaW5nIHZhbGlkIHBhcmFtZXRlcgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIEVtcHR5L2ludmFsaWQgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNR0YxUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TUdGMVBhcmFtZXRlclNwZWMwMSgpIHsKKyAgICAgICAgbmV3IE1HRjFQYXJhbWV0ZXJTcGVjKHRlc3RBbGdOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMyIGZvciA8Y29kZT5NR0YxUGFyYW1ldGVyU3BlYzwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4gaWYgcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4gRW1wdHkvaW52YWxpZCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk1HRjFQYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RNR0YxUGFyYW1ldGVyU3BlYzAyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IE1HRjFQYXJhbWV0ZXJTcGVjKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBvaykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0RGlnZXN0QWxnb3JpdGhtPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRoZSBhbGdvcml0aG0gbmFtZSBvZiB0aGUgbWVzc2FnZQorICAgICAqIGRpZ2VzdCB1c2VkIGJ5IHRoZSBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGlnZXN0QWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldERpZ2VzdEFsZ29yaXRobSgpIHsKKyAgICAgICAgTUdGMVBhcmFtZXRlclNwZWMgYXBzID0gbmV3IE1HRjFQYXJhbWV0ZXJTcGVjKHRlc3RBbGdOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0QWxnTmFtZS5lcXVhbHMoYXBzLmdldERpZ2VzdEFsZ29yaXRobSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgcHVibGljIHN0YXRpYyBmaWVsZHMgYW5kIDxjb2RlPmdldERpZ2VzdEFsZ29yaXRobTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB0aGUgYWxnb3JpdGhtIG5hbWUgb2YgdGhlIG1lc3NhZ2UKKyAgICAgKiBkaWdlc3QgdXNlZCBieSB0aGUgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkZpZWxkIHRlc3RpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RmllbGRzR2V0RGlnZXN0QWxnb3JpdGhtKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlNIQS0xIiwgTUdGMVBhcmFtZXRlclNwZWMuU0hBMS5nZXREaWdlc3RBbGdvcml0aG0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU0hBLTI1NiIsIE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTI1Ni5nZXREaWdlc3RBbGdvcml0aG0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU0hBLTM4NCIsIE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTM4NC5nZXREaWdlc3RBbGdvcml0aG0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU0hBLTUxMiIsIE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTUxMi5nZXREaWdlc3RBbGdvcml0aG0oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1BLQ1M4RW5jb2RlZEtleVNwZWNUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvUEtDUzhFbmNvZGVkS2V5U3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDkyMzRhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1BLQ1M4RW5jb2RlZEtleVNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5QS0NTOEVuY29kZWRLZXlTcGVjPC9jb2RlPiBjbGFzcyBmaWVsZHMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhQS0NTOEVuY29kZWRLZXlTcGVjLmNsYXNzKQorcHVibGljIGNsYXNzIFBLQ1M4RW5jb2RlZEtleVNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFBLQ1M4RW5jb2RlZEtleVNwZWNUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIFBLQ1M4RW5jb2RlZEtleVNwZWNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMKKyAgICAvLworICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPlBLQ1M4RW5jb2RlZEtleVNwZWM8L2NvZGU+IGNvbnN0cnVjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyBuZXcgPGNvZGU+UEtDUzhFbmNvZGVkS2V5U3BlYzwvY29kZT4KKyAgICAgKiBvYmplY3QgdXNpbmcgdmFsaWQgcGFyYW1ldGVyCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLQ1M4RW5jb2RlZEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UEtDUzhFbmNvZGVkS2V5U3BlYygpIHsKKyAgICAgICAgYnl0ZVtdIGVuY29kZWRLZXkgPSBuZXcgYnl0ZVtdIHsoYnl0ZSkxLChieXRlKTIsKGJ5dGUpMywoYnl0ZSk0fTsKKyAgICAgICAgCisgICAgICAgIEVuY29kZWRLZXlTcGVjIGVrcyA9IG5ldyBQS0NTOEVuY29kZWRLZXlTcGVjKGVuY29kZWRLZXkpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZShla3MgaW5zdGFuY2VvZiBQS0NTOEVuY29kZWRLZXlTcGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRFbmNvZGVkKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgZW5jb2RlZCBrZXkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRFbmNvZGVkKCkgeworICAgICAgICBieXRlW10gZW5jb2RlZEtleSA9IG5ldyBieXRlW10geyhieXRlKTEsKGJ5dGUpMiwoYnl0ZSkzLChieXRlKTR9OworICAgICAgICAKKyAgICAgICAgUEtDUzhFbmNvZGVkS2V5U3BlYyBtZWtzID0gbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoZW5jb2RlZEtleSk7CisgICAgICAgIAorICAgICAgICBieXRlW10gZWsgPSBtZWtzLmdldEVuY29kZWQoKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbmNvZGVkS2V5LCBlaykpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRGb3JtYXQoKTwvY29kZT4gbWV0aG9kCisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGZvcm1hdCBuYW1lIChhbHdheXMgIlBLQ1MjOCIpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRGb3JtYXQoKSB7CisgICAgICAgIGJ5dGVbXSBlbmNvZGVkS2V5ID0gbmV3IGJ5dGVbXSB7KGJ5dGUpMSwoYnl0ZSkyLChieXRlKTMsKGJ5dGUpNH07CisgICAgICAgIAorICAgICAgICBQS0NTOEVuY29kZWRLZXlTcGVjIG1la3MgPSBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhlbmNvZGVkS2V5KTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygiUEtDUyM4IiwgbWVrcy5nZXRGb3JtYXQoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG9iamVjdAorICAgICAqIGNhbiBub3QgYmUgY2hhbmdlZCBieSBtb2RpZnlpbmcgaW5pdGlhbAorICAgICAqIGFycmF5IHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0ICIgKyAKKyAgICAgICAgICAgICJjYW4gbm90IGJlIGNoYW5nZWQgYnkgbW9kaWZ5aW5nIGluaXRpYWwgIiArIAorICAgICAgICAgICAgImFycmF5IHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLQ1M4RW5jb2RlZEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SXNTdGF0ZVByZXNlcnZlZDEoKSB7CisgICAgICAgIC8vIFJlZmVyZW5jZSBhcnJheQorICAgICAgICBieXRlW10gZW5jb2RlZEtleSA9IG5ldyBieXRlW10geyhieXRlKTEsKGJ5dGUpMiwoYnl0ZSkzLChieXRlKTR9OworICAgICAgICAvLyBSZWZlcmVuY2UgYXJyYXkncyBjb3B5IHdpbGwgYmUgdXNlZCBmb3IgdGVzdAorICAgICAgICBieXRlW10gZW5jb2RlZEtleUNvcHkgPSBlbmNvZGVkS2V5LmNsb25lKCk7CisgICAgICAgIAorICAgICAgICBQS0NTOEVuY29kZWRLZXlTcGVjIG1la3MgPSBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhlbmNvZGVkS2V5Q29weSk7CisgICAgICAgIAorICAgICAgICAvLyBNb2RpZnkgaW5pdGlhbCBhcnJheSdzIHZhbHVlCisgICAgICAgIGVuY29kZWRLZXlDb3B5WzNdID0gKGJ5dGUpNTsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCBlbmNvZGVkIGtleQorICAgICAgICBieXRlW10gZWsgPSBtZWtzLmdldEVuY29kZWQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrICB1c2luZyByZWZlcmVuY2UgYXJyYXkgdGhhdAorICAgICAgICAvLyBieXRlIHZhbHVlIGhhcyBub3QgYmVlbiBjaGFuZ2VkCisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbmNvZGVkS2V5LCBlaykpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGludGVybmFsIHN0YXRlIG9mIHRoZSBvYmplY3QKKyAgICAgKiBjYW4gbm90IGJlIG1vZGlmaWVkIHVzaW5nIHJldHVybmVkIHZhbHVlCisgICAgICogb2YgPGNvZGU+Z2V0RW5jb2RlZCgpPC9jb2RlPiBtZXRob2QgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0ICIgKyAKKyAgICAgICAgICAgICJjYW4gbm90IGJlIG1vZGlmaWVkIHVzaW5nIHJldHVybmVkIHZhbHVlICIgKyAKKyAgICAgICAgICAgICJvZiBnZXRFbmNvZGVkKCkgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBLQ1M4RW5jb2RlZEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuY29kZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SXNTdGF0ZVByZXNlcnZlZDIoKSB7CisgICAgICAgIC8vIFJlZmVyZW5jZSBhcnJheQorICAgICAgICBieXRlW10gZW5jb2RlZEtleSA9IG5ldyBieXRlW10geyhieXRlKTEsKGJ5dGUpMiwoYnl0ZSkzLChieXRlKTR9OworICAgICAgICAvLyBSZWZlcmVuY2UgYXJyYXkncyBjb3B5IHdpbGwgYmUgdXNlZCBmb3IgdGVzdAorICAgICAgICBieXRlW10gZW5jb2RlZEtleUNvcHkgPSBlbmNvZGVkS2V5LmNsb25lKCk7CisgICAgICAgIAorICAgICAgICBQS0NTOEVuY29kZWRLZXlTcGVjIG1la3MgPSBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhlbmNvZGVkS2V5Q29weSk7CisgICAgICAgIAorICAgICAgICBieXRlW10gZWsgPSBtZWtzLmdldEVuY29kZWQoKTsgICAgICAgIAorCisgICAgICAgIC8vIE1vZGlmeSByZXR1cm5lZCBhcnJheQorICAgICAgICBla1szXSA9IChieXRlKTU7CisgICAgICAgIAorICAgICAgICAvLyBHZXQgZW5jb2RlZCBrZXkgYWdhaW4KKyAgICAgICAgYnl0ZVtdIGVrMSA9IG1la3MuZ2V0RW5jb2RlZCgpOworICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgdXNpbmcgcmVmZXJlbmNlIGFycmF5IHRoYXQKKyAgICAgICAgLy8gYnl0ZSB2YWx1ZSBoYXMgbm90IGJlZW4gY2hhbmdlZAorICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZW5jb2RlZEtleSwgZWsxKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvUFNTUGFyYW1ldGVyU3BlY1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9QU1NQYXJhbWV0ZXJTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODc3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvUFNTUGFyYW1ldGVyU3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLk1HRjFQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5QU1NQYXJhbWV0ZXJTcGVjOworCisvKioKKyAqIFRlc3RzIGZvciA8Y29kZT5QU1NQYXJhbWV0ZXJTcGVjPC9jb2RlPiBjbGFzcyAoMS41KQorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUFNTUGFyYW1ldGVyU3BlYy5jbGFzcykKK3B1YmxpYyBjbGFzcyBQU1NQYXJhbWV0ZXJTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBQU1NQYXJhbWV0ZXJTcGVjVGVzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBQU1NQYXJhbWV0ZXJTcGVjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5QU1NQYXJhbWV0ZXJTcGVjKGludCk8L2NvZGU+IGN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIHVzaW5nIHZhbGlkIHBhcmFtZXRlcgorICAgICAqIDxjb2RlPlBTU1BhcmFtZXRlclNwZWM8Y29kZT4gb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCB2YWxpZCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUFNTUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQU1NQYXJhbWV0ZXJTcGVjMDEwMSgpIHsKKyAgICAgICAgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBhcHMgPSBuZXcgUFNTUGFyYW1ldGVyU3BlYygyMCk7CisgICAgICAgIGFzc2VydFRydWUoYXBzIGluc3RhbmNlb2YgUFNTUGFyYW1ldGVyU3BlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+UFNTUGFyYW1ldGVyU3BlYyhpbnQpPC9jb2RlPiBjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjoKKyAgICAgKiB0aHJvd3MgPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPgorICAgICAqIGlmIDxjb2RlPnNhbHRMZW48L2NvZGU+IGxlc3MgdGhhbiAwCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBTU1BhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UFNTUGFyYW1ldGVyU3BlYzAxMDIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUFNTUGFyYW1ldGVyU3BlYygtMSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJQUUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IKKyAgICAgKiA8Y29kZT4KKyAgICAgKiBQU1NQYXJhbWV0ZXJTcGVjKFN0cmluZyxTdHJpbmcsQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyxpbnQsaW50KQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgdXNpbmcgdmFsaWQgcGFyYW1ldGVycworICAgICAqIDxjb2RlPlBTU1BhcmFtZXRlclNwZWM8Y29kZT4gb2JqZWN0CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCB2YWxpZCBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBTU1BhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBTU1BhcmFtZXRlclNwZWMwMjAxKCkgeworICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGFwcyA9IG5ldyBQU1NQYXJhbWV0ZXJTcGVjKCJTSEEtMSIsICJNR0YxIiwKKyAgICAgICAgICAgICAgICBNR0YxUGFyYW1ldGVyU3BlYy5TSEExLCAyMCwgMSk7CisgICAgICAgIGFzc2VydFRydWUoYXBzIGluc3RhbmNlb2YgUFNTUGFyYW1ldGVyU3BlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IKKyAgICAgKiA8Y29kZT4KKyAgICAgKiBQU1NQYXJhbWV0ZXJTcGVjKFN0cmluZyxTdHJpbmcsQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyxpbnQsaW50KQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246CisgICAgICogdGhyb3dzIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPgorICAgICAqIGlmIDxjb2RlPm1kTmFtZTwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBTU1BhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBTU1BhcmFtZXRlclNwZWMwMjAyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBTU1BhcmFtZXRlclNwZWMobnVsbCwgIk1HRjEiLCBNR0YxUGFyYW1ldGVyU3BlYy5TSEExLCAyMCwgMSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvcgorICAgICAqIDxjb2RlPgorICAgICAqIFBTU1BhcmFtZXRlclNwZWMoU3RyaW5nLFN0cmluZyxBbGdvcml0aG1QYXJhbWV0ZXJTcGVjLGludCxpbnQpCisgICAgICogPC9jb2RlPiBjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjoKKyAgICAgKiB0aHJvd3MgPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgPGNvZGU+bWdmTmFtZTwvY29kZT4gaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBTU1BhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYy5jbGFzcywgCisgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFBTU1BhcmFtZXRlclNwZWMwMjAzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFBTU1BhcmFtZXRlclNwZWMoIlNIQS0xIiwgbnVsbCwgTUdGMVBhcmFtZXRlclNwZWMuU0hBMSwgMjAsIDEpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTlBFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IKKyAgICAgKiA8Y29kZT4KKyAgICAgKiBQU1NQYXJhbWV0ZXJTcGVjKFN0cmluZyxTdHJpbmcsQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyxpbnQsaW50KQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246CisgICAgICogdGhyb3dzIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjxjb2RlPgorICAgICAqIGlmIDxjb2RlPnNhbHRMZW48Y29kZT4gbGVzcyB0aGFuIDAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUFNTUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UFNTUGFyYW1ldGVyU3BlYzAyMDQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUFNTUGFyYW1ldGVyU3BlYygiU0hBLTEiLCAiTUdGMSIsCisgICAgICAgICAgICAgICAgICAgIE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTEsIC0yMCwgMSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJQUUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IKKyAgICAgKiA8Y29kZT4KKyAgICAgKiBQU1NQYXJhbWV0ZXJTcGVjKFN0cmluZyxTdHJpbmcsQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyxpbnQsaW50KQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246CisgICAgICogdGhyb3dzIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiBpZiA8Y29kZT50cmFpbGVyRmllbGQ8L2NvZGU+IGxlc3MgdGhhbiAwCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUFNTUGFyYW1ldGVyU3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UFNTUGFyYW1ldGVyU3BlYzAyMDUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUFNTUGFyYW1ldGVyU3BlYygiU0hBLTEiLCAiTUdGMSIsCisgICAgICAgICAgICAgICAgICAgIE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTEsIDIwLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJQUUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjNiBmb3IKKyAgICAgKiA8Y29kZT4KKyAgICAgKiBQU1NQYXJhbWV0ZXJTcGVjKFN0cmluZyxTdHJpbmcsQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyxpbnQsaW50KQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IDxjb2RlPkFsZ29yaXRobVBhcmFtZXRlclNwZWM8L2NvZGU+IGNhbiBiZSBudWxsCisgICAgICogCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJQU1NQYXJhbWV0ZXJTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQU1NQYXJhbWV0ZXJTcGVjMDIwNigpIHsKKyAgICAgICAgbmV3IFBTU1BhcmFtZXRlclNwZWMoIlNIQS0xIiwgIk1HRjEiLCBudWxsLCAyMCwgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0RGlnZXN0QWxnb3JpdGhtKCk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gbmFtZSAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERpZ2VzdEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXREaWdlc3RBbGdvcml0aG0oKSB7CisgICAgICAgIFBTU1BhcmFtZXRlclNwZWMgcHNzcHMgPSBuZXcgUFNTUGFyYW1ldGVyU3BlYygiU0hBLTEiLCAiTUdGMSIsCisgICAgICAgICAgICAgICAgTUdGMVBhcmFtZXRlclNwZWMuU0hBMSwgMjAsIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNIQS0xIiwgcHNzcHMuZ2V0RGlnZXN0QWxnb3JpdGhtKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldE1HRkFsZ29yaXRobSgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIGFsZ29yaXRobSBuYW1lIAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TUdGQWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldE1HRkFsZ29yaXRobSgpIHsKKyAgICAgICAgUFNTUGFyYW1ldGVyU3BlYyBwc3NwcyA9IG5ldyBQU1NQYXJhbWV0ZXJTcGVjKCJTSEEtMSIsICJNR0YxIiwKKyAgICAgICAgICAgICAgICBNR0YxUGFyYW1ldGVyU3BlYy5TSEExLCAyMCwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTUdGMSIsIHBzc3BzLmdldE1HRkFsZ29yaXRobSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxIGZvciA8Y29kZT5nZXRNR0ZQYXJhbWV0ZXJzKCk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gcGFyYW1ldGVycyAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1HRlBhcmFtZXRlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TUdGUGFyYW1ldGVyczAxKCkgeworICAgICAgICBQU1NQYXJhbWV0ZXJTcGVjIHBzc3BzID0gbmV3IFBTU1BhcmFtZXRlclNwZWMoIlNIQS0xIiwgIk1HRjEiLAorICAgICAgICAgICAgICAgIE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTEsIDIwLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShNR0YxUGFyYW1ldGVyU3BlYy5TSEExLmVxdWFscyhwc3Nwcy5nZXRNR0ZQYXJhbWV0ZXJzKCkpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0TUdGUGFyYW1ldGVycygpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBpZiA8Y29kZT5udWxsPC9jb2RlPiBoYWQgYmVlbiBwYXNzZWQgYXMKKyAgICAgKiBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtZXRlciB0byB0aGUgY3RvciAgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNR0ZQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldE1HRlBhcmFtZXRlcnMwMigpIHsKKyAgICAgICAgUFNTUGFyYW1ldGVyU3BlYyBwc3NwcyA9IG5ldyBQU1NQYXJhbWV0ZXJTcGVjKCJTSEEtMSIsICJNR0YxIiwKKyAgICAgICAgICAgICAgICBudWxsLCAyMCwgMSk7CisgICAgICAgIGFzc2VydE51bGwocHNzcHMuZ2V0TUdGUGFyYW1ldGVycygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFNhbHRMZW5ndGgoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBzYWx0IGxlbmd0aCB2YWx1ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNhbHRMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0U2FsdExlbmd0aCgpIHsKKyAgICAgICAgUFNTUGFyYW1ldGVyU3BlYyBwc3NwcyA9IG5ldyBQU1NQYXJhbWV0ZXJTcGVjKDIwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBwc3Nwcy5nZXRTYWx0TGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFRyYWlsZXJGaWVsZCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHRyYWlsZXIgZmllbGQgdmFsdWUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUcmFpbGVyRmllbGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0VHJhaWxlckZpZWxkKCkgeworICAgICAgICBQU1NQYXJhbWV0ZXJTcGVjIHBzc3BzID0gbmV3IFBTU1BhcmFtZXRlclNwZWMoIlNIQS0xIiwgIk1HRjEiLAorICAgICAgICAgICAgICAgIE1HRjFQYXJhbWV0ZXJTcGVjLlNIQTEsIDIwLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBzc3BzLmdldFRyYWlsZXJGaWVsZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5ERUZBVUxUPC9jb2RlPiBmaWVsZDxicj4KKyAgICAgKiBBc3NlcnRpb246IGRlZmF1bHQgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIG5hbWUgaXMgIlNIQS0xIgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBuYW1lIG9mIGRlZmF1bHQgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERpZ2VzdEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RERUZBVUxUbWROYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlNIQS0xIiwgUFNTUGFyYW1ldGVyU3BlYy5ERUZBVUxULmdldERpZ2VzdEFsZ29yaXRobSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5ERUZBVUxUPC9jb2RlPiBmaWVsZDxicj4KKyAgICAgKiBBc3NlcnRpb246IGRlZmF1bHQgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIGFsZ29yaXRobSBuYW1lIGlzICJNR0YxIgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoZSBuYW1lIG9mIGRlZmF1bHQgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uICIgKworICAgICAgICAgICAgImFsZ29yaXRobS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNR0ZBbGdvcml0aG0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0REVGQVVMVG1nZk5hbWUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiTUdGMSIsIFBTU1BhcmFtZXRlclNwZWMuREVGQVVMVC5nZXRNR0ZBbGdvcml0aG0oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+REVGQVVMVDwvY29kZT4gZmllbGQ8YnI+CisgICAgICogQXNzZXJ0aW9uOiBkZWZhdWx0IGFsZ29yaXRobSBwYXJhbWV0ZXJzIGZvciBtYXNrCisgICAgICogZ2VuZXJhdGlvbiBmdW5jdGlvbiBhcmUgPGNvZGU+TUdGMVBhcmFtZXRlclNwZWMuU0hBMTwvY29kZT4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBkZWZhdWx0IGFsZ29yaXRobSBwYXJhbWV0ZXJzIGZvciBtYXNrIGdlbmVyYXRpb24gIiArCisgICAgICAgICAgICAiZnVuY3Rpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TUdGUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RERUZBVUxUbWdmU3BlYygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShNR0YxUGFyYW1ldGVyU3BlYy5TSEExLmVxdWFscyhQU1NQYXJhbWV0ZXJTcGVjLkRFRkFVTFQuZ2V0TUdGUGFyYW1ldGVycygpKSk7ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5ERUZBVUxUPC9jb2RlPiBmaWVsZDxicj4KKyAgICAgKiBBc3NlcnRpb246IGRlZmF1bHQgc2FsdCBsZW5ndGggdmFsdWUgaXMgMjAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTYWx0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdERFRkFVTFRzYWx0TGVuKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIFBTU1BhcmFtZXRlclNwZWMuREVGQVVMVC5nZXRTYWx0TGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkRFRkFVTFQ8L2NvZGU+IGZpZWxkPGJyPgorICAgICAqIEFzc2VydGlvbjogZGVmYXVsdCB0cmFpbGVyIGZpZWxkIHZhbHVlIGlzIDEKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBkZWZhdWx0IHRyYWlsZXIgZmllbGQgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VHJhaWxlckZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdERFRkFVTFR0cmFpbGVyRmllbGQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBQU1NQYXJhbWV0ZXJTcGVjLkRFRkFVTFQuZ2V0VHJhaWxlckZpZWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FLZXlHZW5QYXJhbWV0ZXJTcGVjVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1JTQUtleUdlblBhcmFtZXRlclNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxNGFiNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FLZXlHZW5QYXJhbWV0ZXJTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBS2V5R2VuUGFyYW1ldGVyU3BlYzsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+UlNBS2V5R2VuUGFyYW1ldGVyU3BlYzwvY29kZT4gY2xhc3MgZmllbGRzIGFuZCBtZXRob2RzLgorICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUlNBS2V5R2VuUGFyYW1ldGVyU3BlYy5jbGFzcykKK3B1YmxpYyBjbGFzcyBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5SU0FLZXlHZW5QYXJhbWV0ZXJTcGVjKGludCxCaWdJbnRlZ2VyKTwvY29kZT4gY3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyA8Y29kZT5SU0FLZXlHZW5QYXJhbWV0ZXJTcGVjPC9jb2RlPgorICAgICAqIG9iamVjdCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJTQUtleUdlblBhcmFtZXRlclNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQUtleUdlblBhcmFtZXRlclNwZWMoKSB7CisgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgYXBzID0KKyAgICAgICAgICAgIG5ldyBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjKDUxMiwgQmlnSW50ZWdlci52YWx1ZU9mKDBMKSk7CisgICAgICAgIGFzc2VydFRydWUoYXBzIGluc3RhbmNlb2YgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0S2V5U2l6ZSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGtleSBzaXplIHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleXNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0S2V5c2l6ZSgpIHsKKyAgICAgICAgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyBya2dwcyA9CisgICAgICAgICAgICBuZXcgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyg1MTIsIEJpZ0ludGVnZXIudmFsdWVPZigwTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTEyLCBya2dwcy5nZXRLZXlzaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFB1YmxpY0V4cG9uZW50KCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgcHVibGljIGV4cG9uZW50IHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFB1YmxpY0V4cG9uZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFB1YmxpY0V4cG9uZW50KCkgeworICAgICAgICBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjIHJrZ3BzID0KKyAgICAgICAgICAgIG5ldyBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjKDUxMiwgQmlnSW50ZWdlci52YWx1ZU9mKDBMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBya2dwcy5nZXRQdWJsaWNFeHBvbmVudCgpLmludFZhbHVlKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5GMDwvY29kZT4gZmllbGQ8YnI+CisgICAgICogQXNzZXJ0aW9uOiB0aGUgcHVibGljIGV4cG9uZW50IHZhbHVlIEYwID0gMworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRlc3QgZm9yIEYwIGZpZWxkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RjBWYWx1ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIFJTQUtleUdlblBhcmFtZXRlclNwZWMuRjAuaW50VmFsdWUoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPkY0PC9jb2RlPiBmaWVsZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHRoZSBwdWJsaWMgZXhwb25lbnQgdmFsdWUgRjAgPSA2NTUzNworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlRlc3QgZm9yIEY0IGZpZWxkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RjRWYWx1ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDY1NTM3LCBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjLkY0LmludFZhbHVlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1JTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlY1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3OGM1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSw5OTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQU90aGVyUHJpbWVJbmZvOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FQcml2YXRlS2V5U3BlYzsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjPC9jb2RlPiBjbGFzcyBmaWVsZHMgYW5kIG1ldGhvZHMuCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMuY2xhc3MpCitwdWJsaWMgY2xhc3MgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2UgYXJyYXkgb2YgUlNBT3RoZXJQcmltZUluZm8uIERPIE5PVCBNT0RJRlkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSU0FPdGhlclByaW1lSW5mb1tdIG9waSA9IG5ldyBSU0FPdGhlclByaW1lSW5mb1tdIHsKKyAgICAgICAgICAgIG5ldyBSU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci5PTkUsIEJpZ0ludGVnZXIuT05FKSwKKyAgICAgICAgICAgIG5ldyBSU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci5PTkUsIEJpZ0ludGVnZXIuT05FKSwKKyAgICAgICAgICAgIG5ldyBSU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLk9ORSwgQmlnSW50ZWdlci5PTkUsIEJpZ0ludGVnZXIuT05FKQorICAgIH07CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlY1Rlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvLyBUZXN0LWNhc2VzOgorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgPGNvZGU+UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjPC9jb2RlPgorICAgICAqIG9iamVjdCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCB2YWxpZCBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5zZWN1cml0eS5zcGVjLlJTQU90aGVyUHJpbWVJbmZvW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMwMSgpIHsKKyAgICAgICAgS2V5U3BlYyBrcyA9IG5ldyBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgb3BpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShrcyBpbnN0YW5jZW9mIFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG1vZHVsdXMgaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5zZWN1cml0eS5zcGVjLlJTQU90aGVyUHJpbWVJbmZvW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMwMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBvcGkpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTlBFIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgIzMgZm9yCisgICAgICogPGNvZGU+UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKEJpZ0ludGVnZXIgbW9kdWx1cywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcml2YXRlRXhwb25lbnQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lUSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZUV4cG9uZW50UCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZUV4cG9uZW50USwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBjcnRDb2VmZmljaWVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBT3RoZXJQcmltZUluZm9bXSBvdGhlclByaW1lSW5mbykKKyAgICAgKiA8L2NvZGU+IGN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwdWJsaWNFeHBvbmVudCBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYzAzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG9waSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjNCBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByaXZhdGVFeHBvbmVudCBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYzA0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG9waSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjNSBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByaW1lUCBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYzA1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG9waSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjNiBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByaW1lUSBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYzA2KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG9waSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjNyBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByaW1lRXhwb25lbnRQIGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mb1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjMDcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgb3BpKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE5QRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0ICM4IGZvcgorICAgICAqIDxjb2RlPlJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyhCaWdJbnRlZ2VyIG1vZHVsdXMsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHVibGljRXhwb25lbnQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpdmF0ZUV4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lUCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVEsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVFeHBvbmVudFAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVFeHBvbmVudFEsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgY3J0Q29lZmZpY2llbnQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQU90aGVyUHJpbWVJbmZvW10gb3RoZXJQcmltZUluZm8pCisgICAgICogPC9jb2RlPiBjdG9yPGJyPgorICAgICAqIEFzc2VydGlvbjogTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcHJpbWVFeHBvbmVudFEgaXMgbnVsbAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIE51bGxQb2ludGVyRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYzA4KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG9waSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjOSBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGNydENvZWZmaWNpZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mb1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjMDkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgb3BpKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE5QRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxMCBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IG90aGVyUHJpbWVJbmZvIGNhbiBiZSBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBvdGhlclByaW1lSW5mby4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mb1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjMTAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaXMgdGhyb3duIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjMTEgZm9yCisgICAgICogPGNvZGU+UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKEJpZ0ludGVnZXIgbW9kdWx1cywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcml2YXRlRXhwb25lbnQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lUSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZUV4cG9uZW50UCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZUV4cG9uZW50USwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBjcnRDb2VmZmljaWVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBT3RoZXJQcmltZUluZm9bXSBvdGhlclByaW1lSW5mbykKKyAgICAgKiA8L2NvZGU+IGN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgb3RoZXJQcmltZUluZm8gbGVuZ3RoIGlzIDAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5zZWN1cml0eS5zcGVjLlJTQU90aGVyUHJpbWVJbmZvW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMxMSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJTQU90aGVyUHJpbWVJbmZvWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElBRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMxMiBmb3IKKyAgICAgKiA8Y29kZT5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoQmlnSW50ZWdlciBtb2R1bHVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcmltZVAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpbWVRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRQLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvKQorICAgICAqIDwvY29kZT4gY3Rvcjxicj4KKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgPGNvZGU+UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjPC9jb2RlPgorICAgICAqIG9iamVjdCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzLiBDb25zdHJ1Y3RlZCBvYmplY3QgbXVzdCBiZQorICAgICAqIGluc3RhbmNlIG9mIFJTQVByaXZhdGVLZXlTcGVjLgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHVzaW5nIHZhbGlkIHBhcmFtZXRlcnMuICIgKworICAgICAgICAgICAgIkNvbnN0cnVjdGVkIG9iamVjdCBtdXN0IGJlIGluc3RhbmNlIG9mIFJTQVByaXZhdGVLZXlTcGVjLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mb1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjMTIoKSB7CisgICAgICAgIEtleVNwZWMga3MgPSBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIG9waSk7CisgICAgICAgIGFzc2VydFRydWUoa3MgaW5zdGFuY2VvZiBSU0FQcml2YXRlS2V5U3BlYyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldENydENvZWZmaWNpZW50KCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgY3J0IGNvZWZmaWNpZW50CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENydENvZWZmaWNpZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENydENvZWZmaWNpZW50KCkgeworICAgICAgICBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMga3MgPQorICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBvcGkpOworICAgICAgICBhc3NlcnRUcnVlKEJpZ0ludGVnZXIuT05FLmVxdWFscyhrcy5nZXRDcnRDb2VmZmljaWVudCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UHJpbWVFeHBvbmVudFAoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBwcmltZSBleHBvbmVudCBQCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaW1lRXhwb25lbnRQIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaW1lRXhwb25lbnRQKCkgeworICAgICAgICBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMga3MgPQorICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBvcGkpOworICAgICAgICBhc3NlcnRUcnVlKEJpZ0ludGVnZXIuT05FLmVxdWFscyhrcy5nZXRQcmltZUV4cG9uZW50UCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UHJpbWVFeHBvbmVudFEoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBwcmltZSBleHBvbmVudCBRCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaW1lRXhwb25lbnRRIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaW1lRXhwb25lbnRRKCkgeworICAgICAgICBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMga3MgPQorICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBvcGkpOworICAgICAgICBhc3NlcnRUcnVlKEJpZ0ludGVnZXIuT05FLmVxdWFscyhrcy5nZXRQcmltZUV4cG9uZW50USgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UHJpbWVQKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgcHJpbWUgUAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcmltZVAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHJpbWVQKCkgeworICAgICAgICBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMga3MgPQorICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBvcGkpOworICAgICAgICBhc3NlcnRUcnVlKEJpZ0ludGVnZXIuT05FLmVxdWFscyhrcy5nZXRQcmltZVAoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFByaW1lUSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHByaW1lIFEKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbWVRIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaW1lUSgpIHsKKyAgICAgICAgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIGtzID0KKyAgICAgICAgICAgIG5ldyBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgb3BpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLk9ORS5lcXVhbHMoa3MuZ2V0UHJpbWVRKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQdWJsaWNFeHBvbmVudCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHB1YmxpYyBleHBvbmVudAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWNFeHBvbmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQdWJsaWNFeHBvbmVudCgpIHsKKyAgICAgICAgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIGtzID0KKyAgICAgICAgICAgIG5ldyBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgb3BpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLk9ORS5lcXVhbHMoa3MuZ2V0UHVibGljRXhwb25lbnQoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPmdldE90aGVyUHJpbWVJbmZvKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgYXJyYXkgb2YgUlNBT3RoZXJQcmltZUluZm8KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE90aGVyUHJpbWVJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldE90aGVyUHJpbWVJbmZvMDEoKSB7CisgICAgICAgIFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyBrcyA9CisgICAgICAgICAgICBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG9waSk7CisgICAgICAgIGFzc2VydFRydWUoY2hlY2tPdGhlclByaW1lSW5mbyhrcy5nZXRPdGhlclByaW1lSW5mbygpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+Z2V0T3RoZXJQcmltZUluZm8oKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBudWxsIGlmIG51bGwgaGFzIGJlZW4gcGFzc2VkIHRvIHRoZQorICAgICAqIGNvbnN0cnVjdG9yIGFzIG90aGVyUHJpbWVJbmZvIHBhcmFtZXRlcgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0T3RoZXJQcmltZUluZm8gcmV0dXJucyBudWxsIGlmICIgKworICAgICAgICAgICAgInRoZXJlIGFyZSBvbmx5IHR3byBwcmltZSBmYWN0b3JzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE90aGVyUHJpbWVJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldE90aGVyUHJpbWVJbmZvMDIoKSB7CisgICAgICAgIFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYyBrcyA9CisgICAgICAgICAgICBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKGtzLmdldE90aGVyUHJpbWVJbmZvKCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW1tdXRhYmlsaXR5IHRlc3RzCisgICAgLy8KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGludGVybmFsIHN0YXRlIG9mIHRoZSBvYmplY3QKKyAgICAgKiBjYW4gbm90IGJlIG1vZGlmaWVkIGJ5IG1vZGlmeWluZyBpbml0aWFsIGFycmF5CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgIiArCisgICAgICAgICAgICAiYnkgbW9kaWZ5aW5nIGluaXRpYWwgYXJyYXkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPdGhlclByaW1lSW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RJc1N0YXRlUHJlc2VydmVkMSgpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGluaXRpYWwgYXJyYXkKKyAgICAgICAgUlNBT3RoZXJQcmltZUluZm9bXSBvcGkxID0gb3BpLmNsb25lKCk7CisgICAgICAgIAorICAgICAgICBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMga3MgPSBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIG9waTEpOworICAgICAgICAKKyAgICAgICAgLy8gTW9kaWZ5IGluaXRpYWwgYXJyYXkKKyAgICAgICAgb3BpMVsyXSA9IG5ldyBSU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLlpFUk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5aRVJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuWkVSTyk7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGF0IGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICAvLyBkb2VzIG5vdCBhZmZlY3QgaW50ZXJuYWwgc3RhdGUKKyAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja090aGVyUHJpbWVJbmZvKGtzLmdldE90aGVyUHJpbWVJbmZvKCkpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0CisgICAgICogY2FuIG5vdCBiZSBtb2RpZmllZCB1c2luZyBhcnJheSByZWZlcmVuY2UKKyAgICAgKiByZXR1cm5lZCBieSA8Y29kZT5nZXRPdGhlclByaW1lSW5mbygpPC9jb2RlPgorICAgICAqIG1ldGhvZCAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGludGVybmFsIHN0YXRlIG9mIHRoZSBvYmplY3QgY2FuIG5vdCBiZSAiICsKKyAgICAgICAgICAgICJtb2RpZmllZCB1c2luZyBhcnJheSByZWZlcmVuY2UgcmV0dXJuZWQgYnkgZ2V0T3RoZXJQcmltZUluZm8oKSAiICsKKyAgICAgICAgICAgICJtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPdGhlclByaW1lSW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RJc1N0YXRlUHJlc2VydmVkMigpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGluaXRpYWwgYXJyYXkKKyAgICAgICAgUlNBT3RoZXJQcmltZUluZm9bXSBvcGkxID0gb3BpLmNsb25lKCk7CisgICAgICAgIAorICAgICAgICBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMga3MgPSBuZXcgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIG9waTEpOworICAgICAgICAKKyAgICAgICAgUlNBT3RoZXJQcmltZUluZm9bXSByZXQgPSBrcy5nZXRPdGhlclByaW1lSW5mbygpOworICAgICAgICAKKyAgICAgICAgLy8gTW9kaWZ5IHJldHVybmVkIGFycmF5CisgICAgICAgIHJldFsyXSA9IG5ldyBSU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLlpFUk8sCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5aRVJPLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuWkVSTyk7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGF0IGFib3ZlIG1vZGlmaWNhdGlvbgorICAgICAgICAvLyBkb2VzIG5vdCBhZmZlY3QgaW50ZXJuYWwgc3RhdGUKKyAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja090aGVyUHJpbWVJbmZvKGtzLmdldE90aGVyUHJpbWVJbmZvKCkpKTsKKyAgICB9CisgICAgCisgICAgLy8KKyAgICAvLyBUZXN0cyBmb3IgaW5oZXJpdGVkIG1ldGhvZHMKKyAgICAvLworICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldE1vZHVsdXMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBtb2R1bHVzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1vZHVsdXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TW9kdWx1cygpIHsKKyAgICAgICAgUlNBTXVsdGlQcmltZVByaXZhdGVDcnRLZXlTcGVjIGtzID0KKyAgICAgICAgICAgIG5ldyBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgb3BpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLk9ORS5lcXVhbHMoa3MuZ2V0TW9kdWx1cygpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UHJpdmF0ZUV4cG9uZW50KCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgcHJpdmF0ZSBleHBvbmVudAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcml2YXRlRXhwb25lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHJpdmF0ZUV4cG9uZW50KCkgeworICAgICAgICBSU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMga3MgPQorICAgICAgICAgICAgbmV3IFJTQU11bHRpUHJpbWVQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgICAgICBvcGkpOworICAgICAgICBhc3NlcnRUcnVlKEJpZ0ludGVnZXIuT05FLmVxdWFscyhrcy5nZXRQcml2YXRlRXhwb25lbnQoKSkpOworICAgIH0KKworLy8gcHJpdmF0ZSBzdHVmZgorLy8gICAgCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgYXJyYXkgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHdpdGggcmVmZXJlbmNlIG9uZTxicj4KKyAgICAgKiAKKyAgICAgKiAgPGNvZGU+cHJpdmF0ZSBzdGF0aWMgZmluYWwgUlNBT3RoZXJQcmltZUluZm9bXSBvcGk8L2NvZGU+CisgICAgICogCisgICAgICogQHBhcmFtIHRvQmVDaGVja2VkCisgICAgICogIEFycmF5IHRvIGJlIGNvbXBhcmVkCisgICAgICogQHJldHVybgorICAgICAqICB0cnVlIGlmIGFycmF5cyBhcmUgZXF1YWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tPdGhlclByaW1lSW5mbyhSU0FPdGhlclByaW1lSW5mb1tdIHRvQmVDaGVja2VkKSB7CisgICAgICAgIGlmICh0b0JlQ2hlY2tlZCA9PSBudWxsIHx8IHRvQmVDaGVja2VkLmxlbmd0aCAhPSBvcGkubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG9waS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG9waVtpXS5nZXRQcmltZSgpLmVxdWFscyh0b0JlQ2hlY2tlZFtpXS5nZXRQcmltZSgpKSAmJgorICAgICAgICAgICAgICAgIG9waVtpXS5nZXRFeHBvbmVudCgpLmVxdWFscyh0b0JlQ2hlY2tlZFtpXS5nZXRFeHBvbmVudCgpKSAmJgorICAgICAgICAgICAgICAgIG9waVtpXS5nZXRDcnRDb2VmZmljaWVudCgpLmVxdWFscyh0b0JlQ2hlY2tlZFtpXS5nZXRDcnRDb2VmZmljaWVudCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1JTQU90aGVyUHJpbWVJbmZvVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1JTQU90aGVyUHJpbWVJbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGViMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvUlNBT3RoZXJQcmltZUluZm9UZXN0LmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mbzsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+UlNBT3RoZXJQcmltZUluZm88L2NvZGU+IGNsYXNzIGZpZWxkcyBhbmQgbWV0aG9kcy4KKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKFJTQU90aGVyUHJpbWVJbmZvLmNsYXNzKQorcHVibGljIGNsYXNzIFJTQU90aGVyUHJpbWVJbmZvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBSU0FPdGhlclByaW1lSW5mb1Rlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUlNBT3RoZXJQcmltZUluZm9UZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzEgZm9yIDxjb2RlPlJTQU90aGVyUHJpbWVJbmZvKEJpZ0ludGVnZXIsQmlnSW50ZWdlcixCaWdJbnRlZ2VyKTwvY29kZT4gY3RvcgorICAgICAqIEFzc2VydGlvbjogY29uc3RydWN0cyA8Y29kZT5SU0FPdGhlclByaW1lSW5mbzwvY29kZT4KKyAgICAgKiBvYmplY3QgdXNpbmcgdmFsaWQgcGFyYW1ldGVyCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCB2YWxpZCBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJTQU90aGVyUHJpbWVJbmZvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQU90aGVyUHJpbWVJbmZvMDEoKSB7CisgICAgICAgIE9iamVjdCBvID0KKyAgICAgICAgICAgIG5ldyBSU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLnZhbHVlT2YoMUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDNMKSk7CisgICAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIFJTQU90aGVyUHJpbWVJbmZvKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+UlNBT3RoZXJQcmltZUluZm8oQmlnSW50ZWdlcixCaWdJbnRlZ2VyLEJpZ0ludGVnZXIpPC9jb2RlPiBjdG9yCisgICAgICogQXNzZXJ0aW9uOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwcmltZSBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBT3RoZXJQcmltZUluZm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBT3RoZXJQcmltZUluZm8wMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBSU0FPdGhlclByaW1lSW5mbyhudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDNMKSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCAjMyBmb3IgPGNvZGU+UlNBT3RoZXJQcmltZUluZm8oQmlnSW50ZWdlcixCaWdJbnRlZ2VyLEJpZ0ludGVnZXIpPC9jb2RlPiBjdG9yCisgICAgICogQXNzZXJ0aW9uOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwcmltZUV4cG9uZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FPdGhlclByaW1lSW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSU0FPdGhlclByaW1lSW5mbzAzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJTQU90aGVyUHJpbWVJbmZvKEJpZ0ludGVnZXIudmFsdWVPZigxTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoM0wpKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE5QRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0ICM0IGZvciA8Y29kZT5SU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLEJpZ0ludGVnZXIsQmlnSW50ZWdlcik8L2NvZGU+IGN0b3IKKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGNydENvZWZmaWNpZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FPdGhlclByaW1lSW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSU0FPdGhlclByaW1lSW5mbzA0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFJTQU90aGVyUHJpbWVJbmZvKEJpZ0ludGVnZXIudmFsdWVPZigxTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDJMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE5QRSBub3QgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0ICM1IGZvciA8Y29kZT5SU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLEJpZ0ludGVnZXIsQmlnSW50ZWdlcik8L2NvZGU+IGN0b3IKKyAgICAgKiBBc3NlcnRpb246IE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByaW1lIGFuZCBjcnRDb2VmZmljaWVudCBpcyBudWxsCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBT3RoZXJQcmltZUluZm8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBT3RoZXJQcmltZUluZm8wNSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBSU0FPdGhlclByaW1lSW5mbyhudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOUEUgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRDcnRDb2VmZmljaWVudCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIENSVCBjb2VmZmljaWVudCB2YWx1ZQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDcnRDb2VmZmljaWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRDcnRDb2VmZmljaWVudCgpIHsKKyAgICAgICAgUlNBT3RoZXJQcmltZUluZm8gcm9waSA9IAorICAgICAgICAgICAgbmV3IFJTQU90aGVyUHJpbWVJbmZvKEJpZ0ludGVnZXIudmFsdWVPZigxTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDJMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoM0wpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDNMLCByb3BpLmdldENydENvZWZmaWNpZW50KCkubG9uZ1ZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFByaW1lKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgcHJpbWUgdmFsdWUKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHJpbWUoKSB7CisgICAgICAgIFJTQU90aGVyUHJpbWVJbmZvIHJvcGkgPSAKKyAgICAgICAgICAgIG5ldyBSU0FPdGhlclByaW1lSW5mbyhCaWdJbnRlZ2VyLnZhbHVlT2YoMUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDNMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxTCwgcm9waS5nZXRQcmltZSgpLmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRFeHBvbmVudCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHByaW1lIGV4cG9uZW50IHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEV4cG9uZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldEV4cG9uZW50KCkgeworICAgICAgICBSU0FPdGhlclByaW1lSW5mbyByb3BpID0gCisgICAgICAgICAgICBuZXcgUlNBT3RoZXJQcmltZUluZm8oQmlnSW50ZWdlci52YWx1ZU9mKDFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMkwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigzTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIHJvcGkuZ2V0RXhwb25lbnQoKS5sb25nVmFsdWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvUlNBUHJpdmF0ZUNydEtleVNwZWNUZXN0LmphdmEgYi9zZWN1cml0eS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L3NwZWMvUlNBUHJpdmF0ZUNydEtleVNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZjUzNgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FQcml2YXRlQ3J0S2V5U3BlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisqIEBhdXRob3IgVmxhZGltaXIgTi4gTW9sb3Rrb3YKKyogQHZlcnNpb24gJFJldmlzaW9uJAorKi8KKworcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5zcGVjOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQVByaXZhdGVDcnRLZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FQcml2YXRlS2V5U3BlYzsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+UlNBUHJpdmF0ZUNydEtleVNwZWM8L2NvZGU+IGNsYXNzIGZpZWxkcyBhbmQgbWV0aG9kcworICogCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUlNBUHJpdmF0ZUNydEtleVNwZWMuY2xhc3MpCitwdWJsaWMgY2xhc3MgUlNBUHJpdmF0ZUNydEtleVNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFJTQVByaXZhdGVDcnRLZXlTcGVjVGVzdC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBSU0FQcml2YXRlQ3J0S2V5U3BlY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+UlNBUHJpdmF0ZUNydEtleVNwZWM8L2NvZGU+IGNvbnN0cnVjdG9yCisgICAgICogQXNzZXJ0aW9uOiBDb25zdHJ1Y3RzIDxjb2RlPlJTQVByaXZhdGVDcnRLZXlTcGVjPC9jb2RlPgorICAgICAqIG9iamVjdCB1c2luZyB2YWxpZCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY29uc3RydWN0b3Igd2l0aCB2YWxpZCBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlJTQVByaXZhdGVDcnRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQVByaXZhdGVDcnRLZXlTcGVjMDEoKSB7CisgICAgICAgIEtleVNwZWMga3MgPSBuZXcgUlNBUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUpOworICAgICAgICBhc3NlcnRUcnVlKGtzIGluc3RhbmNlb2YgUlNBUHJpdmF0ZUNydEtleVNwZWMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgIzIgZm9yIDxjb2RlPlJTQVByaXZhdGVDcnRLZXlTcGVjPC9jb2RlPiBjb25zdHJ1Y3RvcgorICAgICAqIEFzc2VydGlvbjogQ29uc3RydWN0cyA8Y29kZT5SU0FQcml2YXRlQ3J0S2V5U3BlYzwvY29kZT4KKyAgICAgKiBvYmplY3QgdXNpbmcgdmFsaWQgcGFyYW1ldGVycworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggdmFsaWQgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FQcml2YXRlQ3J0S2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RSU0FQcml2YXRlQ3J0S2V5U3BlYzAyKCkgeworICAgICAgICBLZXlTcGVjIGtzID0gbmV3IFJTQVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShrcyBpbnN0YW5jZW9mIFJTQVByaXZhdGVLZXlTcGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0ICMzIGZvciA8Y29kZT5SU0FQcml2YXRlQ3J0S2V5U3BlYzwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IENvbnN0cnVjdHMgPGNvZGU+UlNBUHJpdmF0ZUNydEtleVNwZWM8L2NvZGU+CisgICAgICogb2JqZWN0IHVzaW5nIHZhbGlkIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBUHJpdmF0ZUNydEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBUHJpdmF0ZUNydEtleVNwZWMwMygpIHsKKyAgICAgICAgbmV3IFJTQVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldENydENvZWZmaWNpZW50KCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgY3J0IGNvZWZmaWNpZW50CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENydENvZWZmaWNpZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENydENvZWZmaWNpZW50KCkgeworICAgICAgICBSU0FQcml2YXRlQ3J0S2V5U3BlYyBrcyA9IG5ldyBSU0FQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpLmVxdWFscyhrcy5nZXRDcnRDb2VmZmljaWVudCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UHJpbWVFeHBvbmVudFAoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBwcmltZSBleHBvbmVudCBQCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaW1lRXhwb25lbnRQIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaW1lRXhwb25lbnRQKCkgeworICAgICAgICBSU0FQcml2YXRlQ3J0S2V5U3BlYyBrcyA9IG5ldyBSU0FQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpLmVxdWFscyhrcy5nZXRQcmltZUV4cG9uZW50UCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UHJpbWVFeHBvbmVudFEoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBwcmltZSBleHBvbmVudCBRCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaW1lRXhwb25lbnRRIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaW1lRXhwb25lbnRRKCkgeworICAgICAgICBSU0FQcml2YXRlQ3J0S2V5U3BlYyBrcyA9IG5ldyBSU0FQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpLmVxdWFscyhrcy5nZXRQcmltZUV4cG9uZW50USgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0UHJpbWVQKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgcHJpbWUgUAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcmltZVAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0UHJpbWVQKCkgeworICAgICAgICBSU0FQcml2YXRlQ3J0S2V5U3BlYyBrcyA9IG5ldyBSU0FQcml2YXRlQ3J0S2V5U3BlYygKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLnZhbHVlT2YoNUwpLmVxdWFscyhrcy5nZXRQcmltZVAoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFByaW1lUSgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHByaW1lIFEKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpbWVRIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaW1lUSgpIHsKKyAgICAgICAgUlNBUHJpdmF0ZUNydEtleVNwZWMga3MgPSBuZXcgUlNBUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDVMKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIGFzc2VydFRydWUoQmlnSW50ZWdlci52YWx1ZU9mKDVMKS5lcXVhbHMoa3MuZ2V0UHJpbWVRKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRQdWJsaWNFeHBvbmVudCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHB1YmxpYyBleHBvbmVudAorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQdWJsaWNFeHBvbmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRQdWJsaWNFeHBvbmVudCgpIHsKKyAgICAgICAgUlNBUHJpdmF0ZUNydEtleVNwZWMga3MgPSBuZXcgUlNBUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDVMKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIGFzc2VydFRydWUoQmlnSW50ZWdlci52YWx1ZU9mKDVMKS5lcXVhbHMoa3MuZ2V0UHVibGljRXhwb25lbnQoKSkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMgZm9yIGluaGVyaXRlZCBtZXRob2RzCisgICAgLy8KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRNb2R1bHVzKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgbW9kdWx1cworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNb2R1bHVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldE1vZHVsdXMoKSB7CisgICAgICAgIFJTQVByaXZhdGVDcnRLZXlTcGVjIGtzID0gbmV3IFJTQVByaXZhdGVDcnRLZXlTcGVjKAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZig1TCksCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUpOworICAgICAgICBhc3NlcnRUcnVlKEJpZ0ludGVnZXIudmFsdWVPZig1TCkuZXF1YWxzKGtzLmdldE1vZHVsdXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFByaXZhdGVFeHBvbmVudCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHByaXZhdGUgZXhwb25lbnQKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpdmF0ZUV4cG9uZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaXZhdGVFeHBvbmVudCgpIHsKKyAgICAgICAgUlNBUHJpdmF0ZUNydEtleVNwZWMga3MgPSBuZXcgUlNBUHJpdmF0ZUNydEtleVNwZWMoCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5PTkUsCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDVMKSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSwKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIGFzc2VydFRydWUoQmlnSW50ZWdlci52YWx1ZU9mKDVMKS5lcXVhbHMoa3MuZ2V0UHJpdmF0ZUV4cG9uZW50KCkpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FQcml2YXRlS2V5U3BlY1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FQcml2YXRlS2V5U3BlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY1ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1JTQVByaXZhdGVLZXlTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHJpdmF0ZUtleVNwZWM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPlJTQVByaXZhdGVLZXlTcGVjPC9jb2RlPiBjbGFzcyBmaWVsZHMgYW5kIG1ldGhvZHMKKyAqIAorICovCitAVGVzdFRhcmdldENsYXNzKFJTQVByaXZhdGVLZXlTcGVjLmNsYXNzKQorcHVibGljIGNsYXNzIFJTQVByaXZhdGVLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBSU0FQcml2YXRlS2V5U3BlY1Rlc3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUlNBUHJpdmF0ZUtleVNwZWNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPlJTQVByaXZhdGVLZXlTcGVjKEJpZ0ludGVnZXIsQmlnSW50ZWdlcik8L2NvZGU+IGN0b3IKKyAgICAgKiBBc3NlcnRpb246IGNvbnN0cnVjdHMgPGNvZGU+UlNBUHJpdmF0ZUtleVNwZWM8L2NvZGU+CisgICAgICogb2JqZWN0IHVzaW5nIHZhbGlkIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUlNBUHJpdmF0ZUtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UlNBUHJpdmF0ZUtleVNwZWMoKSB7CisgICAgICAgIEtleVNwZWMga3MgPSBuZXcgUlNBUHJpdmF0ZUtleVNwZWMoQmlnSW50ZWdlci52YWx1ZU9mKDEyMzQ1Njc4OTBMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoM0wpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShrcyBpbnN0YW5jZW9mIFJTQVByaXZhdGVLZXlTcGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRNb2R1bHVzKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgbW9kdWx1cworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNb2R1bHVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldE1vZHVsdXMoKSB7CisgICAgICAgIFJTQVByaXZhdGVLZXlTcGVjIHJwa3MgPQorICAgICAgICAgICAgbmV3IFJTQVByaXZhdGVLZXlTcGVjKEJpZ0ludGVnZXIudmFsdWVPZigxMjM0NTY3ODkwTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDNMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMjM0NTY3ODkwTCwgcnBrcy5nZXRNb2R1bHVzKCkubG9uZ1ZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFByaXZhdGVFeHBvbmVudCgpPC9jb2RlPiBtZXRob2Q8YnI+CisgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHByaXZhdGUgZXhwb25lbnQKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJpdmF0ZUV4cG9uZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFByaXZhdGVFeHBvbmVudCgpIHsKKyAgICAgICAgUlNBUHJpdmF0ZUtleVNwZWMgcnBrcyA9CisgICAgICAgICAgICBuZXcgUlNBUHJpdmF0ZUtleVNwZWMoQmlnSW50ZWdlci52YWx1ZU9mKDEyMzQ1Njc4OTBMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoM0wpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDNMLCBycGtzLmdldFByaXZhdGVFeHBvbmVudCgpLmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FQdWJsaWNLZXlTcGVjVGVzdC5qYXZhIGIvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1JTQVB1YmxpY0tleVNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlOWMxYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9SU0FQdWJsaWNLZXlTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyogQGF1dGhvciBWbGFkaW1pciBOLiBNb2xvdGtvdgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwYWNrYWdlIHRlc3RzLnNlY3VyaXR5LnNwZWM7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHVibGljS2V5U3BlYzsKKworLyoqCisgKiBUZXN0cyBmb3IgPGNvZGU+UlNBUHVibGljS2V5U3BlYzwvY29kZT4gY2xhc3MgZmllbGRzIGFuZCBtZXRob2RzCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhSU0FQdWJsaWNLZXlTcGVjLmNsYXNzKQorcHVibGljIGNsYXNzIFJTQVB1YmxpY0tleVNwZWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFJTQVB1YmxpY0tleVNwZWNUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIFJTQVB1YmxpY0tleVNwZWNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCAjMSBmb3IgPGNvZGU+UlNBUHVibGljS2V5U3BlYzwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IENvbnN0cnVjdHMgPGNvZGU+UlNBUHVibGljS2V5U3BlYzwvY29kZT4KKyAgICAgKiBvYmplY3QgdXNpbmcgdmFsaWQgcGFyYW1ldGVycworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGNvbnN0cnVjdG9yIHdpdGggdmFsaWQgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FQdWJsaWNLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQVB1YmxpY0tleVNwZWMwMSgpIHsKKyAgICAgICAgS2V5U3BlYyBrcyA9CisgICAgICAgICAgICBuZXcgUlNBUHVibGljS2V5U3BlYyhCaWdJbnRlZ2VyLnZhbHVlT2YoMTIzNDU2Nzg5MEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDNMKSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRUcnVlKGtzIGluc3RhbmNlb2YgUlNBUHVibGljS2V5U3BlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAjMiBmb3IgPGNvZGU+UlNBUHVibGljS2V5U3BlYzwvY29kZT4gY29uc3RydWN0b3IKKyAgICAgKiBBc3NlcnRpb246IENvbnN0cnVjdHMgPGNvZGU+UlNBUHVibGljS2V5U3BlYzwvY29kZT4KKyAgICAgKiBvYmplY3QgdXNpbmcgdmFsaWQgcGFyYW1ldGVycworICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSU0FQdWJsaWNLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLCBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJTQVB1YmxpY0tleVNwZWMwMigpIHsKKyAgICAgICAgS2V5U3BlYyBrcyA9CisgICAgICAgICAgICBuZXcgUlNBUHVibGljS2V5U3BlYyhudWxsLCBudWxsKTsKKworICAgICAgICBhc3NlcnRUcnVlKGtzIGluc3RhbmNlb2YgUlNBUHVibGljS2V5U3BlYyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldE1vZHVsdXMoKTwvY29kZT4gbWV0aG9kPGJyPgorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBtb2R1bHVzCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1vZHVsdXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TW9kdWx1cygpIHsKKyAgICAgICAgUlNBUHVibGljS2V5U3BlYyBycGtzID0KKyAgICAgICAgICAgIG5ldyBSU0FQdWJsaWNLZXlTcGVjKEJpZ0ludGVnZXIudmFsdWVPZigxMjM0NTY3ODkwTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoM0wpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCaWdJbnRlZ2VyLnZhbHVlT2YoMTIzNDU2Nzg5MEwpLmVxdWFscyhycGtzLmdldE1vZHVsdXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFB1YmxpY0V4cG9uZW50KCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgcHVibGljIGV4cG9uZW50CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFB1YmxpY0V4cG9uZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldFB1YmxpY0V4cG9uZW50KCkgeworICAgICAgICBSU0FQdWJsaWNLZXlTcGVjIHJwa3MgPQorICAgICAgICAgICAgbmV3IFJTQVB1YmxpY0tleVNwZWMoQmlnSW50ZWdlci52YWx1ZU9mKDNMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxMjM0NTY3ODkwTCkpOworICAgICAgICBhc3NlcnRUcnVlKEJpZ0ludGVnZXIudmFsdWVPZigxMjM0NTY3ODkwTCkuZXF1YWxzKHJwa3MuZ2V0UHVibGljRXhwb25lbnQoKSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9zcGVjL1g1MDlFbmNvZGVkS2V5U3BlY1Rlc3QuamF2YSBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9YNTA5RW5jb2RlZEtleVNwZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyNzkyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvc3BlYy9YNTA5RW5jb2RlZEtleVNwZWNUZXN0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorKiBAYXV0aG9yIFZsYWRpbWlyIE4uIE1vbG90a292CisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3BhY2thZ2UgdGVzdHMuc2VjdXJpdHkuc3BlYzsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuWDUwOUVuY29kZWRLZXlTcGVjOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGVzdHMgZm9yIDxjb2RlPlg1MDlFbmNvZGVkS2V5U3BlYzwvY29kZT4gY2xhc3MgZmllbGRzIGFuZCBtZXRob2RzCisgKiAKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhYNTA5RW5jb2RlZEtleVNwZWMuY2xhc3MpCitwdWJsaWMgY2xhc3MgWDUwOUVuY29kZWRLZXlTcGVjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBYNTA5RW5jb2RlZEtleVNwZWNUZXN0LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIFg1MDlFbmNvZGVkS2V5U3BlY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUZXN0IGNhc2VzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIDxjb2RlPlg1MDlFbmNvZGVkS2V5U3BlYzwvY29kZT4gY29uc3RydWN0b3I8YnI+CisgICAgICogQXNzZXJ0aW9uOiBjb25zdHJ1Y3RzIG5ldyA8Y29kZT5YNTA5RW5jb2RlZEtleVNwZWM8L2NvZGU+CisgICAgICogb2JqZWN0IHVzaW5nIHZhbGlkIHBhcmFtZXRlcgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJYNTA5RW5jb2RlZEtleVNwZWMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0WDUwOUVuY29kZWRLZXlTcGVjKCkgeworICAgICAgICBieXRlW10gZW5jb2RlZEtleSA9IG5ldyBieXRlW10geyhieXRlKTEsKGJ5dGUpMiwoYnl0ZSkzLChieXRlKTR9OworICAgICAgICAKKyAgICAgICAgRW5jb2RlZEtleVNwZWMgZWtzID0gbmV3IFg1MDlFbmNvZGVkS2V5U3BlYyhlbmNvZGVkS2V5KTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydFRydWUoZWtzIGluc3RhbmNlb2YgWDUwOUVuY29kZWRLZXlTcGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRFbmNvZGVkKCk8L2NvZGU+IG1ldGhvZDxicj4KKyAgICAgKiBBc3NlcnRpb246IHJldHVybnMgZW5jb2RlZCBrZXkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRFbmNvZGVkKCkgeworICAgICAgICBieXRlW10gZW5jb2RlZEtleSA9IG5ldyBieXRlW10geyhieXRlKTEsKGJ5dGUpMiwoYnl0ZSkzLChieXRlKTR9OworICAgICAgICAKKyAgICAgICAgWDUwOUVuY29kZWRLZXlTcGVjIGVrcyA9IG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoZW5jb2RlZEtleSk7CisgICAgICAgIAorICAgICAgICBieXRlW10gZWsgPSBla3MuZ2V0RW5jb2RlZCgpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGVuY29kZWRLZXksIGVrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0Rm9ybWF0KCk8L2NvZGU+IG1ldGhvZAorICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBmb3JtYXQgbmFtZSAoYWx3YXlzICJYLjUwOSIpCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRGb3JtYXQoKSB7CisgICAgICAgIGJ5dGVbXSBlbmNvZGVkS2V5ID0gbmV3IGJ5dGVbXSB7KGJ5dGUpMSwoYnl0ZSkyLChieXRlKTMsKGJ5dGUpNH07CisgICAgICAgIAorICAgICAgICBYNTA5RW5jb2RlZEtleVNwZWMgbWVrcyA9IG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoZW5jb2RlZEtleSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoIlguNTA5IiwgbWVrcy5nZXRGb3JtYXQoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG9iamVjdAorICAgICAqIGNhbiBub3QgYmUgY2hhbmdlZCBieSBtb2RpZnlpbmcgaW5pdGlhbAorICAgICAqIGFycmF5IHZhbHVlCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0ICIgKyAKKyAgICAgICAgICAgICJjYW4gbm90IGJlIGNoYW5nZWQgYnkgbW9kaWZ5aW5nIGluaXRpYWwgIiArIAorICAgICAgICAgICAgImFycmF5IHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlg1MDlFbmNvZGVkS2V5U3BlYyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RW5jb2RlZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RJc1N0YXRlUHJlc2VydmVkMSgpIHsKKyAgICAgICAgLy8gUmVmZXJlbmNlIGFycmF5CisgICAgICAgIGJ5dGVbXSBlbmNvZGVkS2V5ID0gbmV3IGJ5dGVbXSB7KGJ5dGUpMSwoYnl0ZSkyLChieXRlKTMsKGJ5dGUpNH07CisgICAgICAgIC8vIFJlZmVyZW5jZSBhcnJheSdzIGNvcHkgd2lsbCBiZSB1c2VkIGZvciB0ZXN0CisgICAgICAgIGJ5dGVbXSBlbmNvZGVkS2V5Q29weSA9IGVuY29kZWRLZXkuY2xvbmUoKTsKKyAgICAgICAgCisgICAgICAgIFg1MDlFbmNvZGVkS2V5U3BlYyBtZWtzID0gbmV3IFg1MDlFbmNvZGVkS2V5U3BlYyhlbmNvZGVkS2V5Q29weSk7CisgICAgICAgIAorICAgICAgICAvLyBNb2RpZnkgaW5pdGlhbCBhcnJheSdzIHZhbHVlCisgICAgICAgIGVuY29kZWRLZXlDb3B5WzNdID0gKGJ5dGUpNTsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCBlbmNvZGVkIGtleQorICAgICAgICBieXRlW10gZWsgPSBtZWtzLmdldEVuY29kZWQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrICB1c2luZyByZWZlcmVuY2UgYXJyYXkgdGhhdAorICAgICAgICAvLyBieXRlIHZhbHVlIGhhcyBub3QgYmVlbiBjaGFuZ2VkCisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbmNvZGVkS2V5LCBlaykpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGludGVybmFsIHN0YXRlIG9mIHRoZSBvYmplY3QKKyAgICAgKiBjYW4gbm90IGJlIG1vZGlmaWVkIHVzaW5nIHJldHVybmVkIHZhbHVlCisgICAgICogb2YgPGNvZGU+Z2V0RW5jb2RlZCgpPC9jb2RlPiBtZXRob2QgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiWDUwOUVuY29kZWRLZXlTcGVjIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmNvZGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdElzU3RhdGVQcmVzZXJ2ZWQyKCkgeworICAgICAgICAvLyBSZWZlcmVuY2UgYXJyYXkKKyAgICAgICAgYnl0ZVtdIGVuY29kZWRLZXkgPSBuZXcgYnl0ZVtdIHsoYnl0ZSkxLChieXRlKTIsKGJ5dGUpMywoYnl0ZSk0fTsKKyAgICAgICAgLy8gUmVmZXJlbmNlIGFycmF5J3MgY29weSB3aWxsIGJlIHVzZWQgZm9yIHRlc3QKKyAgICAgICAgYnl0ZVtdIGVuY29kZWRLZXlDb3B5ID0gZW5jb2RlZEtleS5jbG9uZSgpOworICAgICAgICAKKyAgICAgICAgWDUwOUVuY29kZWRLZXlTcGVjIG1la3MgPSBuZXcgWDUwOUVuY29kZWRLZXlTcGVjKGVuY29kZWRLZXlDb3B5KTsKKyAgICAgICAgCisgICAgICAgIGJ5dGVbXSBlayA9IG1la3MuZ2V0RW5jb2RlZCgpOyAgICAgICAgCisKKyAgICAgICAgLy8gTW9kaWZ5IHJldHVybmVkIGFycmF5CisgICAgICAgIGVrWzNdID0gKGJ5dGUpNTsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCBlbmNvZGVkIGtleSBhZ2FpbgorICAgICAgICBieXRlW10gZWsxID0gbWVrcy5nZXRFbmNvZGVkKCk7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB1c2luZyByZWZlcmVuY2UgYXJyYXkgdGhhdAorICAgICAgICAvLyBieXRlIHZhbHVlIGhhcyBub3QgYmVlbiBjaGFuZ2VkCisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbmNvZGVkS2V5LCBlazEpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0FycmF5LmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9BcnJheS5qYXZhCmluZGV4IGUxZDkwM2UuLjYxMTNjNDYgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0FycmF5LmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvQXJyYXkuamF2YQpAQCAtMjAsMTEyICsyMCwxNTcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKLSAqIEEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgU1FMIEFSUkFZIHR5cGUuCisgKiBBIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNRTCB7QGNvZGUgQVJSQVl9IHR5cGUuCisgKiAgCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBBcnJheSB7CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBTUUwgQVJSQVkgdmFsdWUgYXMgYSBKYXZhIGFycmF5IG9iamVjdC4KKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBTUUwge0Bjb2RlIEFSUkFZfSB2YWx1ZSBhcyBhIEphdmEgYXJyYXkKKyAgICAgKiBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiBBIEphdmEgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcyBBcnJheQogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldEFycmF5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgcGFydCBvZiB0aGUgU1FMIEFSUkFZIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFycmF5LCBzdGFydGluZyBhdCBhCi0gICAgICogcGFydGljdWxhciBpbmRleCBhbmQgY29tcHJpc2luZyB1cCB0byBjb3VudCBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIHRoZQotICAgICAqIFNRTCBhcnJheS4KKyAgICAgKiBSZXR1cm5zIHBhcnQgb2YgdGhlIFNRTCB7QGNvZGUgQVJSQVl9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFycmF5LAorICAgICAqIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciB7QGNvZGUgaW5kZXh9IGFuZCBjb21wcmlzaW5nIHVwIHRvIHtAY29kZSBjb3VudH0KKyAgICAgKiBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIHRoZSBTUUwgYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGFycmF5IHdoZXJlIHRoZSB2YWx1ZXMgYXJlCisgICAgICogICAgICAgICAgICByZXRyaWV2ZWQuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogQHJldHVybiBBIEphdmEgYXJyYXkgY29udGFpbmluZyB0aGUgc3VicG9ydGlvbiBvZiBlbGVtZW50cyBvZiB0aGlzIEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHJpZXZlLgorICAgICAqIEByZXR1cm4gQSBKYXZhIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgc2V0IG9mIGVsZW1lbnRzIGZyb20gdGhpcyBBcnJheQogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldEFycmF5KGxvbmcgaW5kZXgsIGludCBjb3VudCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgcGFydCBvZiB0aGUgU1FMIEFSUkFZIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFycmF5LCBzdGFydGluZyBhdCBhCi0gICAgICogcGFydGljdWxhciBpbmRleCBhbmQgY29tcHJpc2luZyB1cCB0byBjb3VudCBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIHRoZQotICAgICAqIFNRTCBhcnJheS4KKyAgICAgKiBSZXR1cm5zIHBhcnQgb2YgdGhlIFNRTCB7QGNvZGUgQVJSQVl9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFycmF5LAorICAgICAqIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciB7QGNvZGUgaW5kZXh9IGFuZCBjb21wcmlzaW5nIHVwIHRvIHtAY29kZSBjb3VudH0KKyAgICAgKiBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIHRoZSBTUUwgYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGFycmF5IHdoZXJlIHRoZSB2YWx1ZXMgYXJlCisgICAgICogICAgICAgICAgICByZXRyaWV2ZWQuCiAgICAgICogQHBhcmFtIGNvdW50CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHJpZXZlLgogICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiBAcmV0dXJuIEEgSmF2YSBhcnJheSBjb250YWluaW5nIHRoZSBzdWJwb3J0aW9uIG9mIGVsZW1lbnRzIG9mIHRoaXMgQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgZGVmaW5pbmcgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gU1FMIHR5cGUgbmFtZXMgCisgICAgICogICAgICAgICAgICBhbmQgSmF2YSB0eXBlcy4KKyAgICAgKiBAcmV0dXJuIEEgSmF2YSBhcnJheSBjb250YWluaW5nIHRoZSBkZXNpcmVkIHNldCBvZiBlbGVtZW50cyBmcm9tIHRoaXMgQXJyYXkKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRBcnJheShsb25nIGluZGV4LCBpbnQgY291bnQsIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBtYXApCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU1FMIEFSUkFZIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFycmF5LgorICAgICAqIFJldHVybnMgdGhlIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBTUUwge0Bjb2RlIEFSUkFZfSBhcyBhIEphdmEgYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqIEByZXR1cm4gQSBKYXZhIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMgQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgZGVmaW5pbmcgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gU1FMIHR5cGUgbmFtZXMgCisgICAgICogICAgICAgICAgICBhbmQgSmF2YSB0eXBlcy4KKyAgICAgKiBAcmV0dXJuIEEgSmF2YSBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0QXJyYXkoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1hcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEpEQkMgdHlwZSBvZiB0aGUgZW50cmllcyBpbiB0aGlzIEFycmF5J3MgYXNzb2NpYXRlZCBhcnJheS4KKyAgICAgKiBSZXR1cm5zIHRoZSBKREJDIHR5cGUgb2YgdGhlIGVudHJpZXMgaW4gdGhpcyBhcnJheSdzIHVuZGVybHlpbmcgCisgICAgICogU1FMIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gaW50ZWdlciBjb25zdGFudCBmcm9tIHRoZSBqYXZhLnNxbC5UeXBlcyBjbGFzcworICAgICAqIEByZXR1cm4gQW4gaW50ZWdlciBjb25zdGFudCBmcm9tIHRoZSB7QGNvZGUgamF2YS5zcWwuVHlwZXN9IGNsYXNzCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZVR5cGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU1FMIHR5cGUgbmFtZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogdGhpcyBBcnJheS4KKyAgICAgKiBSZXR1cm5zIHRoZSBTUUwgdHlwZSBuYW1lIG9mIHRoZSBlbnRyaWVzIGluIHRoaXMgYXJyYXkncyB1bmRlcmx5aW5nIAorICAgICAqIFNRTCBhcnJheS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFRoZSBkYXRhYmFzZSBzcGVjaWZpYyBuYW1lIG9yIGEgZnVsbHktcXVhbGlmaWVkIFNRTCB0eXBlIG5hbWUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VUeXBlTmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUmVzdWx0U2V0IG9iamVjdCB3aGljaCBob2xkcyB0aGUgZW50cmllcyBvZiB0aGUgU1FMIEFSUkFZCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgQXJyYXkuCisgICAgICogUmV0dXJucyBhIFJlc3VsdFNldCBvYmplY3Qgd2hpY2ggaG9sZHMgdGhlIGVudHJpZXMgb2YgdGhlIFNRTCB7QGNvZGUKKyAgICAgKiBBUlJBWX0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmVzdWx0U2V0CisgICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IGFzIGEge0Bjb2RlIFJlc3VsdFNldH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0UmVzdWx0U2V0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBSZXN1bHRTZXQgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGVudHJpZXMgb2YgYSBzdWJhcnJheSwKLSAgICAgKiBiZWdpbm5pbmcgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IGFuZCBjb21wcmlzaW5nIHVwIHRvIGNvdW50IHN1Y2Nlc3NpdmUKLSAgICAgKiBlbnRyaWVzLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgUmVzdWx0U2V0fSBvYmplY3QgdGhhdCBob2xkcyB0aGUgZW50cmllcyBvZiBhIHN1YmFycmF5LAorICAgICAqIGJlZ2lubmluZyBhdCBhIHBhcnRpY3VsYXIgaW5kZXggYW5kIGNvbXByaXNpbmcgdXAgdG8ge0Bjb2RlIGNvdW50fSAKKyAgICAgKiBzdWNjZXNzaXZlIGVudHJpZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGFycmF5IHdoZXJlIHRoZSB2YWx1ZXMgYXJlCisgICAgICogICAgICAgICAgICByZXRyaWV2ZWQuCiAgICAgICogQHBhcmFtIGNvdW50Ci0gICAgICogQHJldHVybiB0aGUgUmVzdWx0U2V0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHJpZXZlLgorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBhcyBhIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFJlc3VsdFNldChsb25nIGluZGV4LCBpbnQgY291bnQpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUmVzdWx0U2V0IG9iamVjdCB0aGF0IGhvbGRzIHRoZSBlbnRyaWVzIG9mIGEgc3ViYXJyYXksCi0gICAgICogYmVnaW5uaW5nIGF0IGEgcGFydGljdWxhciBpbmRleCBhbmQgY29tcHJpc2luZyB1cCB0byBjb3VudCBzdWNjZXNzaXZlCi0gICAgICogZW50cmllcy4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIFJlc3VsdFNldH0gb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGVudHJpZXMgb2YgYSBzdWJhcnJheSwKKyAgICAgKiBiZWdpbm5pbmcgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IGFuZCBjb21wcmlzaW5nIHVwIHRvIHtAY29kZSBjb3VudH0gCisgICAgICogc3VjY2Vzc2l2ZSBlbnRyaWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheSB3aGVyZSB0aGUgdmFsdWVzIGFyZQorICAgICAqICAgICAgICAgICAgcmV0cmlldmVkLgogICAgICAqIEBwYXJhbSBjb3VudAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZXRyaWV2ZS4KICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogQHJldHVybiB0aGUgUmVzdWx0U2V0CisgICAgICogICAgICAgICAgICB0aGUgbWFwIGRlZmluaW5nIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIFNRTCB0eXBlIG5hbWVzIAorICAgICAqICAgICAgICAgICAgYW5kIEphdmEgdHlwZXMuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gdGhlIGFycmF5J3MgY3VzdG9tIHR5cGUgdmFsdWVzLiBpZiBhCisgICAgICogICAgICAgICBkYXRhYmFzZSBlcnJvciBoYXMgb2NjdXJyZWQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0UmVzdWx0U2V0KGxvbmcgaW5kZXgsIGludCBjb3VudCwKICAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBtYXApIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgUmVzdWx0U2V0IG9iamVjdCB3aGljaCBob2xkcyB0aGUgZW50cmllcyBvZiB0aGUgU1FMIEFSUkFZCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgQXJyYXkuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdCB3aGljaCBob2xkcyB0aGUgZW50cmllcyBvZiB0aGUgU1FMCisgICAgICoge0Bjb2RlIEFSUkFZfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcnJheS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogQHJldHVybiB0aGUgUmVzdWx0U2V0CisgICAgICogICAgICAgICAgICB0aGUgbWFwIGRlZmluaW5nIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIFNRTCB0eXBlIG5hbWVzIAorICAgICAqICAgICAgICAgICAgYW5kIEphdmEgdHlwZXMuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgYXMgYSB7QGNvZGUgUmVzdWx0U2V0fS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc3VsdFNldCBnZXRSZXN1bHRTZXQoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1hcCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9CYXRjaFVwZGF0ZUV4Y2VwdGlvbi5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvQmF0Y2hVcGRhdGVFeGNlcHRpb24uamF2YQppbmRleCBmMzlkYzVlLi4zNmE3ZWY5IDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9CYXRjaFVwZGF0ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0JhdGNoVXBkYXRlRXhjZXB0aW9uLmphdmEKQEAgLTIwLDIzICsyMCwyNiBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiAvKioKLSAqIEFuIGV4Y2VwdGlvbiB0aHJvd24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgYSBiYXRjaCB1cGRhdGUgb3BlcmF0aW9uLgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGEgYmF0Y2ggdXBkYXRlIG9wZXJhdGlvbi4KICAqIDxwPgotICogQSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbiBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ibGVtIHRoYXQKLSAqIG9jY3VycmVkLCBjb21wYXJlZCB3aXRoIGEgc3RhbmRhcmQgU1FMRXhjZXB0aW9uLiBJdCBzdXBwbGllcyB1cGRhdGUgY291bnRzCi0gKiBmb3Igc3VjY2Vzc2Z1bCBjb21tYW5kcyB0aGF0IGV4ZWN1dGVkIHdpdGhpbiB0aGUgYmF0Y2ggdXBkYXRlLCBidXQgYmVmb3JlIHRoZQorICogQSB7QGNvZGUgQmF0Y2hVcGRhdGVFeGNlcHRpb259IHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBwcm9ibGVtIHRoYXQgb2NjdXJyZWQsIGNvbXBhcmVkIHdpdGggYSBzdGFuZGFyZCB7QGNvZGUgU1FMRXhjZXB0aW9ufS4gSXQKKyAqIHN1cHBsaWVzIHVwZGF0ZSBjb3VudHMgZm9yIHN1Y2Nlc3NmdWwgY29tbWFuZHMgd2hpY2ggd2VyZSBleGVjdXRlZCBiZWZvcmUgdGhlCiAgKiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkLgotICogPHA+CisgKiA8L3A+CiAgKiBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgYXJyYXkgb2YgdXBkYXRlIGNvdW50cyBtYXRjaGVzIHRoZSBvcmRlciB0aGF0IHRoZQogICogY29tbWFuZHMgd2VyZSBhZGRlZCB0byB0aGUgYmF0Y2ggb3BlcmF0aW9uLgogICogPHA+Ci0gKiBPbmNlIGEgYmF0Y2ggdXBkYXRlIGNvbW1hbmQgZmFpbHMgYW5kIGEgQmF0Y2hVcGRhdGVFeGNlcHRpb24gaXMgdGhyb3duLCB0aGUKLSAqIEpEQkMgZHJpdmVyIG1heSBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSByZW1haW5pbmcgY29tbWFuZHMgaW4gdGhlIGJhdGNoLiBJZgotICogdGhlIGRyaXZlciBkb2VzIHByb2Nlc3MgbW9yZSBjb21tYW5kcyBhZnRlciB0aGUgcHJvYmxlbSBvY2N1cnMsIHRoZSBhcnJheQotICogcmV0dXJuZWQgYnkgQmF0Y2hVcGRhdGVFeGNlcHRpb24uZ2V0VXBkYXRlQ291bnRzIGhhcyBhbiBlbGVtZW50IGZvciBldmVyeQotICogY29tbWFuZCBpbiB0aGUgYmF0Y2gsIG5vdCBvbmx5IHRob3NlIHRoYXQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LiBJbiB0aGlzCi0gKiBjYXNlLCB0aGUgYXJyYXkgZWxlbWVudCBmb3IgYW55IGNvbW1hbmQgd2hpY2ggZW5jb3VudGVyZWQgYSBwcm9ibGVtIGlzIHNldCB0bwotICogU3RhdGVtZW50LkVYRUNVVEVfRkFJTEVELgorICogT25jZSBhIGJhdGNoIHVwZGF0ZSBjb21tYW5kIGZhaWxzIGFuZCBhIHtAY29kZSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbn0gaXMKKyAqIHRocm93biwgdGhlIEpEQkMgZHJpdmVyIG1heSBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSByZW1haW5pbmcgY29tbWFuZHMgaW4gdGhlCisgKiBiYXRjaC4gSWYgdGhlIGRyaXZlciBkb2VzIHByb2Nlc3MgbW9yZSBjb21tYW5kcyBhZnRlciB0aGUgcHJvYmxlbSBvY2N1cnMsIHRoZQorICogYXJyYXkgcmV0dXJuZWQgYnkge0Bjb2RlIEJhdGNoVXBkYXRlRXhjZXB0aW9uLmdldFVwZGF0ZUNvdW50c30gaGFzIGFuIGVsZW1lbnQKKyAqIGZvciBldmVyeSBjb21tYW5kIGluIHRoZSBiYXRjaCwgbm90IG9ubHkgdGhvc2UgdGhhdCBleGVjdXRlZCBzdWNjZXNzZnVsbHkuIEluCisgKiB0aGlzIGNhc2UsIHRoZSBhcnJheSBlbGVtZW50IGZvciBhbnkgY29tbWFuZCB3aGljaCBlbmNvdW50ZXJlZCBhIHByb2JsZW0gaXMKKyAqIHNldCB0byB7QGNvZGUgU3RhdGVtZW50LkVYRUNVVEVfRkFJTEVEfS4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCYXRjaFVwZGF0ZUV4Y2VwdGlvbiBleHRlbmRzIFNRTEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTQ1LDE5ICs0OCwyNiBAQAogICAgIHByaXZhdGUgaW50W10gdXBkYXRlQ291bnRzID0gbnVsbDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbiB3aXRoIHRoZSBSZWFzb24sIFNRTFN0YXRlLCBhbmQgVXBkYXRlCi0gICAgICogQ291bnRzIHNldCB0byBudWxsIGFuZCBhIFZlbmRvciBDb2RlIG9mIDAuCisgICAgICogQ3JlYXRlcyBhIGRlZmF1bHQge0Bjb2RlIEJhdGNoVXBkYXRlRXhjZXB0aW9ufSB3aXRoIHRoZSBwYXJhbWV0ZXJzCisgICAgICogPGk+cmVhc29uPC9pPiwgPGk+U1FMU3RhdGU8L2k+LCBhbmQgPGk+dXBkYXRlIGNvdW50czwvaT4gc2V0IHRvIHtAY29kZQorICAgICAqIG51bGx9IGFuZCB0aGUgPGk+dmVuZG9yIGNvZGU8L2k+IHNldCB0byAwLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCYXRjaFVwZGF0ZUV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQmF0Y2hVcGRhdGVFeGNlcHRpb24gd2l0aCB0aGUgVXBkYXRlIENvdW50cyBzZXQgdG8gdGhlIHN1cHBsaWVkCi0gICAgICogdmFsdWUgYW5kIHRoZSBSZWFzb24sIFNRTFN0YXRlIHNldCB0byBudWxsIGFuZCBhIFZlbmRvciBDb2RlIG9mIDAuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbn0gd2l0aCB0aGUge0Bjb2RlIHVwZGF0ZUNvdW50c30gc2V0CisgICAgICogdG8gdGhlIHN1cHBsaWVkIHZhbHVlLiBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgdG8gdGhlaXIKKyAgICAgKiBkZWZhdWx0IHZhbHVlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXBkYXRlQ291bnRzCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgVXBkYXRlIENvdW50cyB0byB1c2UgaW4gaW5pdGlhbGl6YXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiB7QGNvZGUgdXBkYXRlQ291bnRzfSBnaXZpbmcgdGhlIG51bWJlciBvZgorICAgICAqICAgICAgICAgICAgc3VjY2Vzc2Z1bCB1cGRhdGVzIChvciBhbm90aGVyIHN0YXR1cyBjb2RlKSBmb3IgZWFjaCBjb21tYW5kCisgICAgICogICAgICAgICAgICBpbiB0aGUgYmF0Y2ggdGhhdCB3YXMgYXR0ZW1wdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCYXRjaFVwZGF0ZUV4Y2VwdGlvbihpbnRbXSB1cGRhdGVDb3VudHMpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTY1LDE0ICs3NSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbiB3aXRoIHRoZSBVcGRhdGUgQ291bnRzIHNldCB0byB0aGUgc3VwcGxpZWQKLSAgICAgKiB2YWx1ZSwgdGhlIFJlYXNvbiBzZXQgdG8gdGhlIHN1cHBsaWVkIHZhbHVlIGFuZCBTUUxTdGF0ZSBzZXQgdG8gbnVsbCBhbmQKLSAgICAgKiBhIFZlbmRvciBDb2RlIG9mIDAuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbn0gd2l0aCB0aGUge0Bjb2RlIHVwZGF0ZUNvdW50c30gYW5kCisgICAgICoge0Bjb2RlIHJlYXNvbn0gc2V0IHRvIHRoZSBzdXBwbGllZCB2YWx1ZXMuIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCB0byB0aGVpcgorICAgICAqIGRlZmF1bHQgdmFsdWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSByZWFzb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZSBmb3IgUmVhc29uCisgICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiB0aGlzCisgICAgICogICAgICAgICAgICBleGNlcHRpb24uCiAgICAgICogQHBhcmFtIHVwZGF0ZUNvdW50cwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFVwZGF0ZSBDb3VudHMgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Yge0Bjb2RlIHVwZGF0ZUNvdW50c30gZ2l2aW5nIHRoZSBudW1iZXIgb2YKKyAgICAgKiAgICAgICAgICAgIHN1Y2Nlc3NmdWwgdXBkYXRlcyAob3IgYW5vdGhlciBzdGF0dXMgY29kZSkgZm9yIGVhY2ggY29tbWFuZAorICAgICAqICAgICAgICAgICAgaW4gdGhlIGJhdGNoIHRoYXQgd2FzIGF0dGVtcHRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmF0Y2hVcGRhdGVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgaW50W10gdXBkYXRlQ291bnRzKSB7CiAgICAgICAgIHN1cGVyKHJlYXNvbik7CkBAIC04MCwxNiArOTQsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQmF0Y2hVcGRhdGVFeGNlcHRpb24gd2l0aCB0aGUgVXBkYXRlIENvdW50cyBzZXQgdG8gdGhlIHN1cHBsaWVkCi0gICAgICogdmFsdWUsIHRoZSBSZWFzb24gc2V0IHRvIHRoZSBzdXBwbGllZCB2YWx1ZSwgdGhlIFNRTFN0YXRlIGluaXRpYWxpemVkIHRvCi0gICAgICogdGhlIHN1cHBsaWVkIHZhbHVlIGFuZCB0aGUgVmVuZG9yIENvZGUgaW5pdGlhbGl6ZWQgdG8gMC4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIEJhdGNoVXBkYXRlRXhjZXB0aW9ufSB3aXRoIHRoZSB7QGNvZGUgcmVhc29ufSwge0Bjb2RlCisgICAgICogU1FMU3RhdGV9IGFuZCB7QGNvZGUgdXBkYXRlQ291bnRzfSBzZXQgdG8gdGhlIHN1cHBsaWVkIHZhbHVlcy4gQWxsIG90aGVyCisgICAgICogZmllbGRzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYXNvbgotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIFJlYXNvbgorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcHJvdmlkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzb3VyY2Ugb2YgdGhpcworICAgICAqICAgICAgICAgICAgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSBTUUxTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIFgvT1BFTiB2YWx1ZSB0byB1c2UgZm9yIHRoZSBTUUxTdGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIFgvT1BFTiB2YWx1ZSB0byB1c2UgZm9yIHRoZSB7QGNvZGUgU1FMU3RhdGV9CiAgICAgICogQHBhcmFtIHVwZGF0ZUNvdW50cwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFVwZGF0ZSBDb3VudHMgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Yge0Bjb2RlIHVwZGF0ZUNvdW50c30gZ2l2aW5nIHRoZSBudW1iZXIgb2YKKyAgICAgKiAgICAgICAgICAgIHN1Y2Nlc3NmdWwgdXBkYXRlcyAob3IgYW5vdGhlciBzdGF0dXMgY29kZSkgZm9yIGVhY2ggY29tbWFuZAorICAgICAqICAgICAgICAgICAgaW4gdGhlIGJhdGNoIHRoYXQgd2FzIGF0dGVtcHRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmF0Y2hVcGRhdGVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIFNRTFN0YXRlLAogICAgICAgICAgICAgaW50W10gdXBkYXRlQ291bnRzKSB7CkBAIC05OCwxOCArMTE2LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEJhdGNoVXBkYXRlRXhjZXB0aW9uIHdpdGggdGhlIFVwZGF0ZSBDb3VudHMgc2V0IHRvIHRoZSBzdXBwbGllZAotICAgICAqIHZhbHVlLCB0aGUgUmVhc29uIHNldCB0byB0aGUgc3VwcGxpZWQgdmFsdWUsIHRoZSBTUUxTdGF0ZSBpbml0aWFsaXplZCB0bwotICAgICAqIHRoZSBzdXBwbGllZCB2YWx1ZSBhbmQgdGhlIFZlbmRvciBDb2RlIHNldCB0byB0aGUgc3VwcGxpZWQgdmFsdWUuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbn0gZm9yIHRoZSBjYXNlIHdoZXJlIGFsbCByZWxldmFudAorICAgICAqIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSByZWFzb24KLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBSZWFzb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGV4Y2VwdGlvbi4KICAgICAgKiBAcGFyYW0gU1FMU3RhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBYL09QRU4gdmFsdWUgdG8gdXNlIGZvciB0aGUgU1FMU3RhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBYL09QRU4gdmFsdWUgdG8gdXNlIGZvciB0aGUge0Bjb2RlIFNRTFN0YXRlfS4KICAgICAgKiBAcGFyYW0gdmVuZG9yQ29kZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIHZlbmRvciBlcnJvciBjb2RlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgdmVuZG9yIGVycm9yIGNvZGUuCiAgICAgICogQHBhcmFtIHVwZGF0ZUNvdW50cwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFVwZGF0ZSBDb3VudHMgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Yge0Bjb2RlIHVwZGF0ZUNvdW50c30gZ2l2aW5nIHRoZSBudW1iZXIgb2YKKyAgICAgKiAgICAgICAgICAgIHN1Y2Nlc3NmdWwgdXBkYXRlcyAob3IgYW5vdGhlciBzdGF0dXMgY29kZSkgZm9yIGVhY2ggY29tbWFuZAorICAgICAqICAgICAgICAgICAgaW4gdGhlIGJhdGNoIHRoYXQgd2FzIGF0dGVtcHRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmF0Y2hVcGRhdGVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIFNRTFN0YXRlLCBpbnQgdmVuZG9yQ29kZSwKICAgICAgICAgICAgIGludFtdIHVwZGF0ZUNvdW50cykgewpAQCAtMTE4LDI4ICsxMzksMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBVcGRhdGUgQ291bnRzIGFycmF5LgorICAgICAqIEdldHMgdGhlIDxpPnVwZGF0ZSBjb3VudDwvaT4gYXJyYXkgZ2l2aW5nIHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgZXZlcnkgCisgICAgICogY29tbWFuZCB0aGF0IHdhcyBhdHRlbXB0ZWQgaW4gdGhlIGJhdGNoLgogICAgICAqIDxwPgotICAgICAqIElmIGEgYmF0Y2ggdXBkYXRlIGNvbW1hbmQgZmFpbHMgYW5kIGEgQmF0Y2hVcGRhdGVFeGNlcHRpb24gaXMgdGhyb3duLCB0aGUKLSAgICAgKiBKREJDIGRyaXZlciBtYXkgY29udGludWUgcHJvY2Vzc2luZyB0aGUgcmVtYWluaW5nIGNvbW1hbmRzIGluIHRoZSBiYXRjaC4KLSAgICAgKiBJZiB0aGUgZHJpdmVyIGRvZXMgcHJvY2VzcyBtb3JlIGNvbW1hbmRzIGFmdGVyIHRoZSBwcm9ibGVtIG9jY3VycywgdGhlCi0gICAgICogYXJyYXkgcmV0dXJuZWQgYnkgPGNvZGU+QmF0Y2hVcGRhdGVFeGNlcHRpb24uZ2V0VXBkYXRlQ291bnRzPC9jb2RlPiBoYXMKLSAgICAgKiBhbiBlbGVtZW50IGZvciBldmVyeSBjb21tYW5kIGluIHRoZSBiYXRjaCwgbm90IG9ubHkgdGhvc2UgdGhhdCBleGVjdXRlZAotICAgICAqIHN1Y2Nlc3NmdWxseS4gSW4gdGhpcyBjYXNlLCB0aGUgYXJyYXkgZWxlbWVudCBmb3IgYW55IGNvbW1hbmQgd2hpY2gKLSAgICAgKiBlbmNvdW50ZXJlZCBhIHByb2JsZW0gaXMgc2V0IHRvIFN0YXRlbWVudC5FWEVDVVRFX0ZBSUxFRC4KKyAgICAgKiBJZiBhIGJhdGNoIHVwZGF0ZSBjb21tYW5kIGZhaWxzIGFuZCBhIHtAY29kZSBCYXRjaFVwZGF0ZUV4Y2VwdGlvbn0gaXMKKyAgICAgKiB0aHJvd24sIHRoZSBKREJDIGRyaXZlciBtYXkgY29udGludWUgcHJvY2Vzc2luZyB0aGUgcmVtYWluaW5nIGNvbW1hbmRzIGluCisgICAgICogdGhlIGJhdGNoLiBJZiB0aGUgZHJpdmVyIGRvZXMgc28sIHRoZSBhcnJheSByZXR1cm5lZCBieSB7QGNvZGUKKyAgICAgKiBCYXRjaFVwZGF0ZUV4Y2VwdGlvbi5nZXRVcGRhdGVDb3VudHN9IGhhcyBhbiBlbGVtZW50IGZvciBldmVyeSBjb21tYW5kIGluCisgICAgICogdGhlIGJhdGNoLCBub3Qgb25seSB0aG9zZSB0aGF0IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS4gSW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgKiBhcnJheSBlbGVtZW50IGZvciBhbnkgY29tbWFuZCB3aGljaCBlbmNvdW50ZXJlZCBhIHByb2JsZW0gaXMgc2V0IHRvCisgICAgICoge0Bjb2RlIFN0YXRlbWVudC5FWEVDVVRFX0ZBSUxFRH0uCiAgICAgICogCiAgICAgICogQHJldHVybiBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBzdWNjZXNzZnVsIHVwZGF0ZSBjb3VudHMsIGJlZm9yZSB0aGlzCi0gICAgICogICAgICAgICBleGNlcHRpb24uIEFsdGVybmF0aXZlbHksIGlmIHRoZSBkcml2ZXIgY29udGludWVzIHRvIHByb2Nlc3MKLSAgICAgKiAgICAgICAgIGNvbW1hbmRzIGZvbGxvd2luZyBhbiBlcnJvciwgb25lIG9mIHRoZXNlIGxpc3RlZCBpdGVtcyBmb3IgZXZlcnkKLSAgICAgKiAgICAgICAgIGNvbW1hbmQgdGhlIGJhdGNoIGNvbnRhaW5zOgorICAgICAqICAgICAgICAgZXhjZXB0aW9uIHdhcyB0aHJvd24uIEFsdGVybmF0aXZlbHksIGlmIHRoZSBkcml2ZXIgY29udGludWVzIHRvCisgICAgICogICAgICAgICBwcm9jZXNzIGNvbW1hbmRzIGZvbGxvd2luZyBhbiBlcnJvciwgZm9yIGVhY2ggc3VjY2Vzc2l2ZSBjb21tYW5kCisgICAgICogICAgICAgICB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiB0aGUgYXJyYXkgZ2l2aW5nIG9uZSBvZiB0aGUgCisgICAgICogICAgICAgICBmb2xsb3dpbmcgc3RhdHVzIHZhbHVlczoKICAgICAgKiAgICAgICAgIDxvbD4KLSAgICAgKiAgICAgICAgIDxsaT5hbiBjb3VudCBvZiB0aGUgdXBkYXRlczwvbGk+Ci0gICAgICogICAgICAgICA8bGk+PGNvZGU+U3RhdGVtZW50LlNVQ0NFU1NfTk9fSU5GTzwvY29kZT4gaW5kaWNhdGluZyB0aGF0IHRoZQotICAgICAqICAgICAgICAgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgdGhlIGFtb3VudCBvZiBhbHRlcmVkIHJvd3MgaXMKLSAgICAgKiAgICAgICAgIG5vdCBrbm93bi48L2xpPgotICAgICAqICAgICAgICAgPGxpPjxjb2RlPlN0YXRlbWVudC5FWEVDVVRFX0ZBSUxFRDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IHRoZQotICAgICAqICAgICAgICAgY29tbWFuZCB3YXMgdW5zdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgPGxpPnRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB1cGRhdGVzPC9saT4gPGxpPntAY29kZQorICAgICAqICAgICAgICAgU3RhdGVtZW50LlNVQ0NFU1NfTk9fSU5GT30gaW5kaWNhdGluZyB0aGF0IHRoZSBjb21tYW5kIGNvbXBsZXRlZAorICAgICAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LCBidXQgdGhlIGFtb3VudCBvZiBhbHRlcmVkIHJvd3MgaXMgdW5rbm93bi48L2xpPiAKKyAgICAgKiAgICAgICAgIDxsaT57QGNvZGUgU3RhdGVtZW50LkVYRUNVVEVfRkFJTEVEfSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbW1hbmQKKyAgICAgKiAgICAgICAgIHdhcyB1bnN1Y2Nlc3NmdWwuPC9saT4KICAgICAgKiAgICAgICAgIDwvb2w+CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldFVwZGF0ZUNvdW50cygpIHsKICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvdW50czsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0Jsb2IuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0Jsb2IuamF2YQppbmRleCAyYjNjZmY1Li5lNmQ5YjE5IDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9CbG9iLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvQmxvYi5qYXZhCkBAIC0yMSwxNDAgKzIxLDE2MiBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKIC8qKgotICogQSBKYXZhIGludGVyZmFjZSBtYXBwaW5nIGZvciB0aGUgU1FMIEJMT0IgdHlwZS4KKyAqIEEgSmF2YSBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIHRoZSBTUUwge0Bjb2RlIEJMT0J9IHR5cGUuCiAgKiA8cD4KLSAqIEFuIFNRTCBDTE9CIHR5cGUgc3RvcmVzIGEgbGFyZ2UgYXJyYXkgb2YgYnl0ZXMgKGJpbmFyeSBkYXRhKSBhcyB0aGUgdmFsdWUgaW4KLSAqIGEgY29sdW1uIG9mIGEgZGF0YWJhc2UuCi0gKiA8cD4KLSAqIFRoZSBqYXZhLnNxbC5CbG9iIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIGZvciBzZXR0aW5nIGFuZCByZXRyaWV2aW5nIGRhdGEKLSAqIGluIHRoZSBCbG9iLCBmb3IgcXVlcnlpbmcgQ2xvYiBkYXRhIGxlbmd0aCwgZm9yIHNlYXJjaGluZyBmb3IgZGF0YSB3aXRoaW4gdGhlCi0gKiBCbG9iLgorICogQW4gU1FMIHtAY29kZSBCTE9CfSB0eXBlIHN0b3JlcyBhIGxhcmdlIGFycmF5IG9mIGJpbmFyeSBkYXRhIChieXRlcykgYXMgdGhlCisgKiB2YWx1ZSBpbiBhIGNvbHVtbiBvZiBhIGRhdGFiYXNlLgorICogPC9wPgorICogVGhlIHtAY29kZSBqYXZhLnNxbC5CbG9ifSBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3Igc2V0dGluZyBhbmQKKyAqIHJldHJpZXZpbmcgZGF0YSBpbiB0aGUge0Bjb2RlIEJsb2J9LCBmb3IgcXVlcnlpbmcge0Bjb2RlIEJsb2J9IGRhdGEgbGVuZ3RoLAorICogYW5kIGZvciBzZWFyY2hpbmcgZm9yIGRhdGEgd2l0aGluIHRoZSB7QGNvZGUgQmxvYn0uCisgKiAgCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBCbG9iIHsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGlzIEJsb2Igb2JqZWN0IGFzIGEgYmluYXJ5IHN0cmVhbS4KKyAgICAgKiBSZXRyaWV2ZXMgdGhpcyB7QGNvZGUgQmxvYn0gb2JqZWN0IGFzIGEgYmluYXJ5IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgYmluYXJ5IElucHV0U3RyZWFtIGdpdmluZyBhY2Nlc3MgdG8gdGhlIEJsb2IgZGF0YQorICAgICAqIEByZXR1cm4gYSBiaW5hcnkge0Bjb2RlIElucHV0U3RyZWFtfSBnaXZpbmcgYWNjZXNzIHRvIHRoZSB7QGNvZGUgQmxvYn0KKyAgICAgKiAgICAgICAgIGRhdGEuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBCbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIEJsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW0oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIHBvcnRpb24gb2YgdGhlIHZhbHVlIG9mIHRoaXMgQmxvYiBhcyBhbiBhcnJheSBvZiBieXRlcy4KKyAgICAgKiBHZXRzIGEgcG9ydGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhpcyB7QGNvZGUgQmxvYn0gYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBvcwotICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIGluIHRoZSBCbG9iIHRvIGdldCwgd2hlcmUgdGhlCi0gICAgICogICAgICAgICAgICBmaXJzdCBieXRlIGluIHRoZSBCbG9iIGhhcyBwb3NpdGlvbiA9IDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUge0Bjb2RlIEJsb2J9IHRvIGdldCwKKyAgICAgKiAgICAgICAgICAgIHdoZXJlIHRoZSBmaXJzdCBieXRlIGluIHRoZSB7QGNvZGUgQmxvYn0gaGFzIHBvc2l0aW9uIDEuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlIEJsb2IsIHN0YXJ0aW5nIGF0IHBvcwotICAgICAqICAgICAgICAgYW5kIG9mIGxlbmd0aCB1cCB0byA8Y29kZT5sZW5ndGg8L2NvZGU+IGJ5dGVzIGxvbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LgorICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgZnJvbSB0aGUge0Bjb2RlIEJsb2J9LCBzdGFydGluZworICAgICAqICAgICAgICAgYXQge0Bjb2RlIHBvc30gYW5kIGlzIHVwIHRvIHtAY29kZSBsZW5ndGh9IGJ5dGVzIGxvbmcuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBCbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIEJsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMobG9uZyBwb3MsIGludCBsZW5ndGgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBCbG9iIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyB7QGNvZGUgQmxvYn0gb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gbG9uZyB2YWx1ZSB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIEJsb2IgaW4gYnl0ZXMKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGxvbmd9IHZhbHVlIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUge0Bjb2RlIEJsb2J9IGluCisgICAgICogICAgICAgICBieXRlcy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIEJsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQmxvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgbGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNlYXJjaCBmb3IgdGhlIHBvc2l0aW9uIGluIHRoaXMgQmxvYiBhdCB3aGljaCBhIHNwZWNpZmllZCBwYXR0ZXJuIGJlZ2lucywKLSAgICAgKiBzdGFydGluZyBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbiB3aXRoaW4gdGhlIEJsb2IuCisgICAgICogU2VhcmNoIGZvciB0aGUgcG9zaXRpb24gaW4gdGhpcyB7QGNvZGUgQmxvYn0gYXQgd2hpY2ggYSBzcGVjaWZpZWQgcGF0dGVybgorICAgICAqIGJlZ2lucywgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24gd2l0aGluIHRoZSB7QGNvZGUgQmxvYn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhdHRlcm4KLSAgICAgKiAgICAgICAgICAgIGEgQmxvYiBjb250YWluaW5nIHRoZSBwYXR0ZXJuIG9mIGRhdGEgdG8gc2VhcmNoIGZvciBpbiB0aGlzCi0gICAgICogICAgICAgICAgICBCbG9iCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBCbG9ifSBjb250YWluaW5nIHRoZSBwYXR0ZXJuIG9mIGRhdGEgdG8gc2VhcmNoIGZvciBpbgorICAgICAqICAgICAgICAgICAgdGhpcyB7QGNvZGUgQmxvYn0uCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gd2l0aGluIHRoaXMgQmxvYiB0byBzdGFydCB0aGUgc2VhcmNoLCB3aGVyZSB0aGUKLSAgICAgKiAgICAgICAgICAgIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBCbG9iIGlzIDEKLSAgICAgKiBAcmV0dXJuIGEgbG9uZyB2YWx1ZSB3aXRoIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgcGF0dGVybiBiZWdpbnMuIC0xIGlmCi0gICAgICogICAgICAgICB0aGUgcGF0dGVybiBpcyBub3QgZm91bmQgaW4gdGhpcyBCbG9iLgorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGlzIHtAY29kZSBCbG9ifSB0byBzdGFydCB0aGUgc2VhcmNoLAorICAgICAqICAgICAgICAgICAgd2hlcmUgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSB7QGNvZGUgQmxvYn0gaXMge0Bjb2RlIDF9LgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgbG9uZ30gdmFsdWUgd2l0aCB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHBhdHRlcm4KKyAgICAgKiAgICAgICAgIGJlZ2lucy4gUmV0dXJucyB7QGNvZGUgLTF9IGlmIHRoZSBwYXR0ZXJuIGlzIG5vdCBmb3VuZCBpbiB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgQmxvYn0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBCbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIEJsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHBvc2l0aW9uKEJsb2IgcGF0dGVybiwgbG9uZyBzdGFydCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNlYXJjaCBmb3IgdGhlIHBvc2l0aW9uIGluIHRoaXMgQmxvYiBhdCB3aGljaCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4KLSAgICAgKiBiZWdpbnMsIHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uIHdpdGhpbiB0aGUgQmxvYi4KKyAgICAgKiBTZWFyY2ggZm9yIHRoZSBwb3NpdGlvbiBpbiB0aGlzIHtAY29kZSBCbG9ifSBhdCB3aGljaCB0aGUgc3BlY2lmaWVkCisgICAgICogcGF0dGVybiBiZWdpbnMsIHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uIHdpdGhpbiB0aGUge0Bjb2RlIEJsb2J9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCiAgICAgICogICAgICAgICAgICBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgcGF0dGVybiBvZiBkYXRhIHRvIHNlYXJjaCBmb3IgaW4KLSAgICAgKiAgICAgICAgICAgIHRoaXMgQmxvYgorICAgICAqICAgICAgICAgICAgdGhpcyB7QGNvZGUgQmxvYn0uCiAgICAgICogQHBhcmFtIHN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gd2l0aGluIHRoaXMgQmxvYiB0byBzdGFydCB0aGUgc2VhcmNoLCB3aGVyZSB0aGUKLSAgICAgKiAgICAgICAgICAgIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBCbG9iIGlzIDEKLSAgICAgKiBAcmV0dXJuIGEgbG9uZyB2YWx1ZSB3aXRoIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgcGF0dGVybiBiZWdpbnMuIC0xIGlmCi0gICAgICogICAgICAgICB0aGUgcGF0dGVybiBpcyBub3QgZm91bmQgaW4gdGhpcyBCbG9iLgorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGlzIHtAY29kZSBCbG9ifSB0byBzdGFydCB0aGUgc2VhcmNoLAorICAgICAqICAgICAgICAgICAgd2hlcmUgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSB7QGNvZGUgQmxvYn0gaXMge0Bjb2RlIDF9LgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgbG9uZ30gdmFsdWUgd2l0aCB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHBhdHRlcm4KKyAgICAgKiAgICAgICAgIGJlZ2lucy4gUmV0dXJucyB7QGNvZGUgLTF9IGlmIHRoZSBwYXR0ZXJuIGlzIG5vdCBmb3VuZCBpbiB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgQmxvYn0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBCbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIEJsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHBvc2l0aW9uKGJ5dGVbXSBwYXR0ZXJuLCBsb25nIHN0YXJ0KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIHN0cmVhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIGJpbmFyeSBkYXRhIHRvIHRoaXMgQmxvYi4KKyAgICAgKiBHZXRzIGEgc3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYmluYXJ5IGRhdGEgdG8gdGhpcyB7QGNvZGUgQmxvYn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBvcwotICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGlzIEJsb2IgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZywgd2hlcmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgQmxvYiBpcyAxCi0gICAgICogQHJldHVybiBhIGJpbmFyeSBJbnB1dFN0cmVhbSB3aGljaCBjYW4gYmUgdXNlZCB0byB3cml0ZSBkYXRhIGludG8gdGhlCi0gICAgICogICAgICAgICBCbG9iIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gd2l0aGluIHRoaXMge0Bjb2RlIEJsb2J9IGF0IHdoaWNoIHRvIHN0YXJ0CisgICAgICogICAgICAgICAgICB3cml0aW5nLCB3aGVyZSB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIHtAY29kZSBCbG9ifSBpcworICAgICAqICAgICAgICAgICAge0Bjb2RlIDF9LgorICAgICAqIEByZXR1cm4gYSBiaW5hcnkge0Bjb2RlIElucHV0U3RyZWFtfSB3aGljaCBjYW4gYmUgdXNlZCB0byB3cml0ZSBkYXRhIGludG8KKyAgICAgKiAgICAgICAgIHRoZSB7QGNvZGUgQmxvYn0gc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIEJsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQmxvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE91dHB1dFN0cmVhbSBzZXRCaW5hcnlTdHJlYW0obG9uZyBwb3MpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzcGVjaWZpZWQgYXJyYXkgb2YgYnl0ZXMgdG8gdGhpcyBCbG9iLiBvYmplY3QsIHN0YXJ0aW5nIGF0IGEKLSAgICAgKiBzcGVjaWZpZWQgcG9zaXRpb24uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICAgICAqIFdyaXRlcyBhIHNwZWNpZmllZCBhcnJheSBvZiBieXRlcyB0byB0aGlzIHtAY29kZSBCbG9ifSBvYmplY3QsIHN0YXJ0aW5nCisgICAgICogYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhpcyBCbG9iIGF0IHdoaWNoIHRvIHN0YXJ0IHdyaXRpbmcsIHdoZXJlCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIEJsb2IgaXMgMQorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGlzIHtAY29kZSBCbG9ifSBhdCB3aGljaCB0byBzdGFydAorICAgICAqICAgICAgICAgICAgd3JpdGluZywgd2hlcmUgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSB7QGNvZGUgQmxvYn0gaXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSAxfS4KICAgICAgKiBAcGFyYW0gdGhlQnl0ZXMKLSAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlIGludG8gdGhlIEJsb2IKLSAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIEJsb2IKKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlIGludG8gdGhlIHtAY29kZSBCbG9ifS4KKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgQmxvYn0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBCbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIEJsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc2V0Qnl0ZXMobG9uZyBwb3MsIGJ5dGVbXSB0aGVCeXRlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHBvcnRpb24gb2YgYSBzcGVjaWZpZWQgYnl0ZSBhcnJheSB0byB0aGlzIEJsb2IuIFJldHVybnMgdGhlCi0gICAgICogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgICogV3JpdGVzIGEgcG9ydGlvbiBvZiBhIHNwZWNpZmllZCBieXRlIGFycmF5IHRvIHRoaXMge0Bjb2RlIEJsb2J9LiBSZXR1cm5zCisgICAgICogdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhpcyBCbG9iIGF0IHdoaWNoIHRvIHN0YXJ0IHdyaXRpbmcsIHdoZXJlCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIEJsb2IgaXMgMQorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGlzIHtAY29kZSBCbG9ifSBhdCB3aGljaCB0byBzdGFydAorICAgICAqICAgICAgICAgICAgd3JpdGluZywgd2hlcmUgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSB7QGNvZGUgQmxvYn0gaXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSAxfS4KICAgICAgKiBAcGFyYW0gdGhlQnl0ZXMKLSAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlIGludG8gdGhlIEJsb2IKKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlIGludG8gdGhlIHtAY29kZSBCbG9ifS4KICAgICAgKiBAcGFyYW0gb2Zmc2V0CiAgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGludG8gdGhlIGJ5dGUgYXJyYXkgZnJvbSB3aGljaCB0byBzdGFydCB3cml0aW5nCi0gICAgICogICAgICAgICAgICBkYXRhIC0gdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGFycmF5IGhhcyBvZmZzZXQgMC4KKyAgICAgKiAgICAgICAgICAgIGRhdGEgLSB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYXJyYXkgaGFzIG9mZnNldCB7QGNvZGUgMH0uCiAgICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiBkYXRhIHRvIHdyaXRlLCBhcyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICogQHJldHVybiBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSBCbG9iCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGRhdGEgdG8gd3JpdGUgaW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBCbG9ifS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIEJsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQmxvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRCeXRlcyhsb25nIHBvcywgYnl0ZVtdIHRoZUJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFRydW5jYXRlIHRoZSB2YWx1ZSBvZiB0aGlzIEJsb2Igb2JqZWN0IHRvIGEgc3BlY2lmaWVkIGxlbmd0aCBpbiBieXRlcy4KKyAgICAgKiBUcnVuY2F0ZSB0aGUgdmFsdWUgb2YgdGhpcyB7QGNvZGUgQmxvYn0gb2JqZWN0IHRvIGEgc3BlY2lmaWVkIGxlbmd0aCBpbgorICAgICAqIGJ5dGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgZGF0YSBpbiBieXRlcyB0byB0cnVuY2F0ZSB0aGUgdmFsdWUgb2YgdGhpcyBCbG9iCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGRhdGEgaW4gYnl0ZXMgYWZ0ZXIgd2hpY2ggdGhpcyB7QGNvZGUgQmxvYn0KKyAgICAgKiAgICAgICAgICAgIGlzIHRvIGJlIHRydW5jYXRlZC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIEJsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQmxvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJ1bmNhdGUobG9uZyBsZW4pIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9DYWxsYWJsZVN0YXRlbWVudC5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvQ2FsbGFibGVTdGF0ZW1lbnQuamF2YQppbmRleCAyMDk3Mjc3Li43YTkwMDQxIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9DYWxsYWJsZVN0YXRlbWVudC5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0NhbGxhYmxlU3RhdGVtZW50LmphdmEKQEAgLTI1LDEwOTkgKzI1LDEyNTQgQEAKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIAogLyoqCi0gKiBBbiBpbnRlcmZhY2UgdXNlZCB0byBjYWxsIFN0b3JlZCBQcm9jZWR1cmVzLgorICogQW4gaW50ZXJmYWNlIHVzZWQgdG8gY2FsbCA8aT5TdG9yZWQgUHJvY2VkdXJlczwvaT4uCiAgKiA8cD4KLSAqIFRoZSBKREJDIEFQSSBwcm92aWRlcyBhbiBTUUwgZXNjYXBlIHN5bnRheCBhbGxvd2luZyBTdG9yZWQgUHJvY2VkdXJlcyB0byBiZQotICogY2FsbGVkIGluIGEgc3RhbmRhcmQgd2F5IGZvciBhbGwgZGF0YWJhc2VzLiBUaGUgSkRCQyBlc2NhcGUgc3ludGF4IGhhcyB0d28KLSAqIGZvcm1zLiBPbmUgZm9ybSBpbmNsdWRlcyBhIHJlc3VsdCBwYXJhbWV0ZXIuIFRoZSBzZWNvbmQgZm9ybSBkb2VzIG5vdCBpbmNsdWRlCi0gKiBhIHJlc3VsdCBwYXJhbWV0ZXIuIFdoZXJlIHRoZSByZXN1bHQgcGFyYW1ldGVyIGlzIHVzZWQsIGl0IG11c3QgYmUgZGVjbGFyZWQKLSAqIGFzIGFuIE9VVCBwYXJhbWV0ZXIuIE90aGVyIHBhcmFtZXRlcnMgY2FuIGJlIGRlY2xhcmVkIGFzIElOLCBPVVQgb3IgSU5PVVQuCi0gKiBQYXJhbWV0ZXJzIGFyZSByZWZlcmVuY2VkIGVpdGhlciBieSBuYW1lIG9yIGJ5IGEgbnVtZXJpY2FsIGluZGV4LCB3aXRoIHRoZQotICogZmlyc3QgcGFyYW1ldGVyIGJlaW5nIDEsIHRoZSBzZWNvbmQgMSBhbmQgc28gb24uIEhlcmUgYXJlIGV4YW1wbGVzIG9mIHRoZSB0d28KLSAqIGZvcm1zIG9mIHRoZSBlc2NhcGUgc3ludGF4OiA8Y29kZT4KLSAqIAotICogeyA/PSBjYWxsICZsdC5wcm9jZWR1cmVuYW1lJmd0LlsoW3BhcmFtZXRlcjEscGFyYW1ldGVyMiwuLi5dKV19Ci0gKiAKLSAqIHtjYWxsICZsdC5wcm9jZWR1cmVuYW1lJmd0LlsoW3BhcmFtZXRlcjEscGFyYW1ldGVyMiwuLi5dKV19Ci0gKiA8L2NvZGU+CisgKiBUaGUgSkRCQyBBUEkgcHJvdmlkZXMgYW4gU1FMIGVzY2FwZSBzeW50YXggYWxsb3dpbmcgPGk+U3RvcmVkIFByb2NlZHVyZXM8L2k+CisgKiB0byBiZSBjYWxsZWQgaW4gYSBzdGFuZGFyZCB3YXkgZm9yIGFsbCBkYXRhYmFzZXMuIFRoZSBKREJDIGVzY2FwZSBzeW50YXggaGFzCisgKiB0d28gZm9ybXMuIE9uZSBmb3JtIGluY2x1ZGVzIGEgcmVzdWx0IHBhcmFtZXRlci4gVGhlIHNlY29uZCBmb3JtIGRvZXMgbm90CisgKiBpbmNsdWRlIGEgcmVzdWx0IHBhcmFtZXRlci4gV2hlcmUgdGhlIHJlc3VsdCBwYXJhbWV0ZXIgaXMgdXNlZCwgaXQgbXVzdCBiZQorICogZGVjbGFyZWQgYXMgYW4ge0Bjb2RlIE9VVH0gcGFyYW1ldGVyLiBPdGhlciBwYXJhbWV0ZXJzIGNhbiBiZSBkZWNsYXJlZCBhcworICoge0Bjb2RlIElOfSwge0Bjb2RlIE9VVH0sIG9yIHtAY29kZSBJTk9VVH0uIFBhcmFtZXRlcnMgYXJlIHJlZmVyZW5jZWQgZWl0aGVyIGJ5CisgKiBuYW1lIG9yIGJ5IGEgbnVtZXJpY2FsIGluZGV4IHN0YXJ0aW5nIGF0IDEuCiAgKiA8cD4KLSAqIElOIHBhcmFtZXRlcnMgYXJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGUgcHJvY2VkdXJlLCB1c2luZyB0aGUgc2V0dGVyIG1ldGhvZHMKLSAqIHdoaWNoIGFyZSBpbmhlcml0ZWQgZnJvbSA8Y29kZT5QcmVwYXJlZFN0YXRlbWVudDwvY29kZT4uIEZvciBPVVQKLSAqIHBhcmFtZXRlcnMsIHRoZWlyIFR5cGUgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBleGVjdXRpbmcgdGhlIHN0b3JlZAotICogcHJvY2VkdXJlLCBhbmQgdGhlIHZhbHVlIGlzIHJldHJpZXZlZCB1c2luZyB0aGUgZ2V0dGVyIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUKLSAqIENhbGxhYmxlU3RhdGVtZW50IGludGVyZmFjZS4KKyAqIFRoZSBjb3JyZWN0IHN5bnRheCBpczoKKyAqIDwvcD4KKyAqIDxkZD4KKyAqIDxkbD4KKyAqIHsgPz0gY2FsbCAmbHQ7cHJvY2VkdXJlbmFtZSZndDsgWyggW3BhcmFtZXRlcjEscGFyYW1ldGVyMiwuLi5dICldIH0KKyAqIDwvZGw+CisgKiA8ZGw+CisgKiB7IGNhbGwgJmx0O3Byb2NlZHVyZW5hbWUmZ3Q7IFsoIFtwYXJhbWV0ZXIxLHBhcmFtZXRlcjIsLi4uXSApXSB9CisgKiA8L2RsPgorICogPC9jb2RlPjwvZGQ+IDwvcD4ge0Bjb2RlIElOfSBwYXJhbWV0ZXJzIGFyZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhlIHByb2NlZHVyZSwKKyAqIHVzaW5nIHRoZSBzZXR0ZXIgbWV0aG9kcyB3aGljaCBhcmUgaW5oZXJpdGVkIGZyb20ge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fS4KKyAqIEZvciB7QGNvZGUgT1VUfSBwYXJhbWV0ZXJzLCB0aGVpciB0eXBlIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgZXhlY3V0aW5nCisgKiB0aGUgc3RvcmVkIHByb2NlZHVyZS4gVGhlIHZhbHVlcyBhcmUgcmV0cmlldmVkIHVzaW5nIHRoZSBnZXR0ZXIgbWV0aG9kcworICogZGVmaW5lZCBpbiB0aGUge0Bjb2RlIENhbGxhYmxlU3RhdGVtZW50fSBpbnRlcmZhY2UuCiAgKiA8cD4KLSAqIENhbGxhYmxlU3RhdGVtZW50cyBjYW4gcmV0dXJuIG9uZSBvciBtb3JlIFJlc3VsdFNldHMuIFdoZXJlIG11bHRpcGxlCi0gKiBSZXN1bHRTZXRzIGFyZSByZXR1cm5lZCB0aGV5IGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgbWV0aG9kcyBpbmhlcml0ZWQgZnJvbQotICogdGhlIDxjb2RlPlN0YXRlbWVudDwvY29kZT4gaW50ZXJmYWNlLgorICoge0Bjb2RlIENhbGxhYmxlU3RhdGVtZW50fXMgY2FuIHJldHVybiBvbmUgb3IgbW9yZSB7QGNvZGUgUmVzdWx0U2V0c30uIEluIHRoZQorICogZXZlbnQgdGhhdCBtdWx0aXBsZSB7QGNvZGUgUmVzdWx0U2V0c30gYXJlIHJldHVybmVkLCB0aGV5IGFyZSBhY2Nlc3NlZCB1c2luZworICogdGhlIG1ldGhvZHMgaW5oZXJpdGVkIGZyb20gdGhlIHtAY29kZSBTdGF0ZW1lbnR9IGludGVyZmFjZS4KKyAqIDwvcD4KKyAqICAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENhbGxhYmxlU3RhdGVtZW50IGV4dGVuZHMgUHJlcGFyZWRTdGF0ZW1lbnQgewogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyA8Y29kZT5BUlJBWTwvY29kZT4gcGFyYW1ldGVyIGFzIGEKLSAgICAgKiBqYXZhLnNxbC5BcnJheS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBBUlJBWX0gcGFyYW1ldGVyIGFzIGEKKyAgICAgKiB7QGNvZGUgamF2YS5zcWwuQXJyYXl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCi0gICAgICogQHJldHVybiBhIGphdmEuc3FsLkFycmF5IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogQHJldHVybiBhIHtAY29kZSBqYXZhLnNxbC5BcnJheX0gY29udGFpbmluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFycmF5IGdldEFycmF5KGludCBwYXJhbWV0ZXJJbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgQVJSQVkgcGFyYW1ldGVyIGFzIGEgamF2YS5zcWwuQXJyYXkuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgQVJSQVl9IHBhcmFtZXRlciBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLkFycmF5fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBvZiBpbnRlcmVzdCdzIG5hbWUKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+amF2YS5zcWwuQXJyYXk8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgcGFyYW1ldGVyJ3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLkFycmF5fSBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEFycmF5IGdldEFycmF5KFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQmlnRGVjaW1hbH0gcmVwcmVzZW50YXRpb24gb2YgdGhlIEpEQkMKLSAgICAgKiA8Y29kZT5OVU1FUklDPC9jb2RlPiBwYXJhbWV0ZXIgc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBpbmRleC4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBCaWdEZWNpbWFsfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgSkRCQyB7QGNvZGUKKyAgICAgKiBOVU1FUklDfSBwYXJhbWV0ZXIgc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBpbmRleC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4IChzdGFydHMgZnJvbSAxKQotICAgICAqIEByZXR1cm4gYSA8Y29kZT5qYXZhLm1hdGguQmlnRGVjaW1hbDwvY29kZT4gd2l0aCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogICAgICAgICBzcGVjaWZpZWQgcGFyYW1ldGVyLiBUaGUgdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgaWYKLSAgICAgKiAgICAgICAgIHRoZSBwYXJhbWV0ZXIgaW4gcXVlc3Rpb24gaXMgYW4gU1FMIDxjb2RlPk5VTEw8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcyBpbmRleAorICAgICAqICAgICAgICAgICAgMS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEubWF0aC5CaWdEZWNpbWFsfSByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBwYXJhbWV0ZXIuIFRoZSB2YWx1ZSB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaWYgCisgICAgICogICAgICAgICB0aGUgcGFyYW1ldGVyIGluIHF1ZXN0aW9uIGlzIGFuIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoaW50IHBhcmFtZXRlckluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQmlnRGVjaW1hbH0gcmVwcmVzZW50YXRpb24gb2YgdGhlIEpEQkMKLSAgICAgKiA8Y29kZT5OVU1FUklDPC9jb2RlPiBwYXJhbWV0ZXIgc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBpbmRleC4gVGhlIG51bWJlcgotICAgICAqIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBpcyBzcGVjaWZpZWQgYnkgPGNvZGU+c2NhbGU8L2NvZGU+LgorICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIEJpZ0RlY2ltYWx9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBKREJDIHtAY29kZQorICAgICAqIE5VTUVSSUN9IHBhcmFtZXRlciBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IGluZGV4LiBUaGUgbnVtYmVyIG9mIGRpZ2l0cworICAgICAqIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGlzIHNwZWNpZmllZCBieSB7QGNvZGUgc2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSBzY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgdG8gZ2V0Ci0gICAgICogQHJldHVybiBhIDxjb2RlPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jb2RlPiB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCBwYXJhbWV0ZXIuIFRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBpZgotICAgICAqICAgICAgICAgdGhlIHBhcmFtZXRlciBpbiBxdWVzdGlvbiBpcyBhbiBTUUwgPGNvZGU+TlVMTDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IHRvIGdldC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEubWF0aC5CaWdEZWNpbWFsfSByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBwYXJhbWV0ZXIuIFRoZSB2YWx1ZSB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaWYgCisgICAgICogICAgICAgICB0aGUgcGFyYW1ldGVyIGluIHF1ZXN0aW9uIGlzIGFuIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldEJpZ0RlY2ltYWwoaW50KX0gb3Ige0BsaW5rICNnZXRCaWdEZWNpbWFsKFN0cmluZyl9CisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0QmlnRGVjaW1hbChpbnQpfSBvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayAjZ2V0QmlnRGVjaW1hbChTdHJpbmcpfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChpbnQgcGFyYW1ldGVySW5kZXgsIGludCBzY2FsZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBCaWdEZWNpbWFsfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgSkRCQwotICAgICAqIDxjb2RlPk5VTUVSSUM8L2NvZGU+IHBhcmFtZXRlciBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IG5hbWUuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQmlnRGVjaW1hbH0gcmVwcmVzZW50YXRpb24gb2YgdGhlIEpEQkMge0Bjb2RlCisgICAgICogTlVNRVJJQ30gcGFyYW1ldGVyIHNwZWNpZmllZCBieSB0aGUgaW5wdXQgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gYSBqYXZhLm1hdGguQmlnRGVjaW1hbCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4KLSAgICAgKiAgICAgICAgIG51bGwgaWYgdGhlIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgcGFyYW1ldGVyJ3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEubWF0aC5CaWdEZWNpbWFsfSByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBwYXJhbWV0ZXIuIFRoZSB2YWx1ZSB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaWYgCisgICAgICogICAgICAgICB0aGUgcGFyYW1ldGVyIGluIHF1ZXN0aW9uIGlzIGFuIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyBCTE9CIHBhcmFtZXRlciBhcyBhIGphdmEuc3FsLkJsb2IKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBCTE9CfSBwYXJhbWV0ZXIgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5CbG9ifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQotICAgICAqIEByZXR1cm4gYSBqYXZhLnNxbC5CbG9iIHdpdGggdGhlIHZhbHVlLiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogQHJldHVybiBhIHtAY29kZSBqYXZhLnNxbC5CbG9ifSByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBwYXJhbWV0ZXIuIFRoZSB2YWx1ZSB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaWYgCisgICAgICogICAgICAgICB0aGUgcGFyYW1ldGVyIGluIHF1ZXN0aW9uIGlzIGFuIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmxvYiBnZXRCbG9iKGludCBwYXJhbWV0ZXJJbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgQkxPQiBwYXJhbWV0ZXIgYXMgYSBqYXZhLnNxbC5CbG9iCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgQkxPQn0gcGFyYW1ldGVyIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuQmxvYn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGEgamF2YS5zcWwuQmxvYiB3aXRoIHRoZSB2YWx1ZS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgZGVzaXJlZCBwYXJhbWV0ZXIncyBuYW1lLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgamF2YS5zcWwuQmxvYn0gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgCisgICAgICogICAgICAgICBzcGVjaWZpZWQgcGFyYW1ldGVyLiBUaGUgdmFsdWUge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkIGlmIAorICAgICAqICAgICAgICAgdGhlIHBhcmFtZXRlciBpbiBxdWVzdGlvbiBpcyBhbiBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJsb2IgZ2V0QmxvYihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgQklUIHBhcmFtZXRlciBhcyBhIGJvb2xlYW4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBCSVR9IHBhcmFtZXRlciBhcyBhIGJvb2xlYW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZS4gZmFsc2UgaWYgdGhlIHZhbHVlIGlzCi0gICAgICogICAgICAgICBTUUwgTlVMTAorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGJvb2xlYW59IHJlcHJlc2VudGluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLiB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oaW50IHBhcmFtZXRlckluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyA8Y29kZT5CSVQ8L2NvZGU+IHBhcmFtZXRlciBhcyBhCi0gICAgICogYm9vbGVhbgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMge0Bjb2RlIEJJVH0gcGFyYW1ldGVyIGFzIGEge0Bjb2RlCisgICAgICogYm9vbGVhbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgb2YgaW50ZXJlc3QncyBuYW1lCi0gICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgKiAgICAgICAgIHBhcmFtZXRlci4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkIGlmIHRoZSBTUUwgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIDxjb2RlPk5VTEw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgcGFyYW1ldGVyJ3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGJvb2xlYW59IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpcyByZXR1cm5lZCBpZiB0aGUgU1FMIHZhbHVlIGlzIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgVElOWUlOVCBwYXJhbWV0ZXIgYXMgYSBieXRlCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgVElOWUlOVH0gcGFyYW1ldGVyIGFzIGEge0Bjb2RlCisgICAgICogYnl0ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwKLSAgICAgKiAgICAgICAgIE5VTEwuCisgICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgYnl0ZX0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuIAorICAgICAqICAgICAgICAgICAge0Bjb2RlIDB9IGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZShpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIDxjb2RlPlRJTllJTlQ8L2NvZGU+IHBhcmFtZXRlciBhcyBhCi0gICAgICogSmF2YSA8Y29kZT5ieXRlPC9jb2RlPi4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBUSU5ZSU5UfSBwYXJhbWV0ZXIgYXMgYSBKYXZhCisgICAgICoge0Bjb2RlIGJ5dGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG9mIGludGVyZXN0J3MgbmFtZQotICAgICAqIEByZXR1cm4gYSA8Y29kZT5ieXRlPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogICAgICAgICBwYXJhbWV0ZXIuIDxjb2RlPjA8L2NvZGU+IGlzIHJldHVybmVkIGlmIHRoZSBTUUwgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIDxjb2RlPk5VTEw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgcGFyYW1ldGVyJ3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGJ5dGV9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqICAgICAgICAge0Bjb2RlIDB9IGlzIHJldHVybmVkIGlmIHRoZSBTUUwgdmFsdWUgaXMge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluZGV4ZWQgSkRCQwotICAgICAqIDxjb2RlPkJJTkFSWTwvY29kZT4gb3IgPGNvZGU+VkFSQklOQVJZPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogUmV0dXJucyBhIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluZGV4ZWQgSkRCQyB7QGNvZGUgQklOQVJZfSBvcgorICAgICAqIHtAY29kZSBWQVJCSU5BUll9IHBhcmFtZXRlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYnl0ZXMgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4gbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGJ5dGVzIGdpdmluZyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4ge0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmFtZWQgSkRCQyA8Y29kZT5CSU5BUlk8L2NvZGU+Ci0gICAgICogb3IgPGNvZGU+VkFSQklOQVJZPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogUmV0dXJucyBhIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5hbWVkIEpEQkMge0Bjb2RlIEJJTkFSWX0gb3IKKyAgICAgKiB7QGNvZGUgVkFSQklOQVJZfSBwYXJhbWV0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGJ5dGVzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBieXRlcyBnaXZpbmcgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIENMT0IgcGFyYW1ldGVyIGFzIGEgamF2YS5zcWwuQ2xvYgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMge0Bjb2RlIENMT0J9IHBhcmFtZXRlciBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLkNsb2J9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCi0gICAgICogQHJldHVybiBhIGphdmEuc3FsLkNsb2Igd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4gbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLkNsb2J9IHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIAorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyLiB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCAKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgQ2xvYgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDbG9iIGdldENsb2IoaW50IHBhcmFtZXRlckluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyBDTE9CIHBhcmFtZXRlciBhcyBhIGphdmEuc3FsLkNsb2IKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBDTE9CfSBwYXJhbWV0ZXIgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5DbG9ifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gYSBqYXZhLnNxbC5DbG9iIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiBhIHtAY29kZSBqYXZhLnNxbC5DbG9ifSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLiB7QGNvZGUKKyAgICAgKiAgICAgICAgIG51bGx9IGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBDbG9iCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENsb2IgZ2V0Q2xvYihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgREFURSBwYXJhbWV0ZXIgYXMgYSBqYXZhLnNxbC5EYXRlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgREFURX0gcGFyYW1ldGVyIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuRGF0ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBqYXZhLnNxbC5EYXRlIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgamF2YS5zcWwuRGF0ZX0gcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZS4gCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIERhdGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKGludCBwYXJhbWV0ZXJJbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgREFURSBwYXJhbWV0ZXIgYXMgYSBqYXZhLnNxbC5EYXRlLiwKLSAgICAgKiB1c2luZyBhIHNwZWNpZmllZCBDYWxlbmRhciB0byBjb25zdHJ1Y3QgdGhlIGRhdGUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBKREJDIHtAY29kZSBEQVRFfSBwYXJhbWV0ZXIgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5EYXRlfSwgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgQ2FsZW5kYXJ9IHRvIGNvbnN0cnVjdCB0aGUgZGF0ZS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgSkRCQyBkcml2ZXIgdXNlcyB0aGUgQ2FsZW5kYXIgdG8gY3JlYXRlIHRoZSBEYXRlIHVzaW5nIGEgcGFydGljdWxhcgotICAgICAqIHRpbWV6b25lIGFuZCBsb2NhbGUuIERlZmF1bHQgYmVoYXZpb3VyIG9mIHRoZSBkcml2ZXIgaXMgdG8gdXNlIHRoZSBKYXZhCisgICAgICogVGhlIEpEQkMgZHJpdmVyIHVzZXMgdGhlIGNhbGVuZGFyIHRvIGNyZWF0ZSB0aGUgRGF0ZSB1c2luZyBhIHBhcnRpY3VsYXIKKyAgICAgKiB0aW1lem9uZSBhbmQgbG9jYWxlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgZHJpdmVyIGlzIHRvIHVzZSB0aGUgSmF2YQogICAgICAqIHZpcnR1YWwgbWFjaGluZSBkZWZhdWx0IHNldHRpbmdzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgdG8gdXNlIHRvIGNvbnN0cnVjdCB0aGUgRGF0ZQotICAgICAqIEByZXR1cm4gdGhlIGphdmEuc3FsLkRhdGUgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLiBudWxsIGlmIHRoZSB2YWx1ZSBpcwotICAgICAqICAgICAgICAgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSB0byB1c2UgdG8gY29uc3RydWN0IHRoZSBkYXRlCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIGphdmEuc3FsLkRhdGV9IGdpdmluZyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUuIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIERhdGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKGludCBwYXJhbWV0ZXJJbmRleCwgQ2FsZW5kYXIgY2FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyBEQVRFIHBhcmFtZXRlciBhcyBhIGphdmEuc3FsLkRhdGUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBKREJDIHtAY29kZSBEQVRFfSBwYXJhbWV0ZXIgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5EYXRlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gdGhlIGphdmEuc3FsLkRhdGUgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLiBudWxsIGlmIHRoZSB2YWx1ZSBpcwotICAgICAqICAgICAgICAgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIGphdmEuc3FsLkRhdGV9IGdpdmluZyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUuIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIERhdGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyBEQVRFIHBhcmFtZXRlciBhcyBhIGphdmEuc3FsLkRhdGUuLAotICAgICAqIHVzaW5nIGEgc3BlY2lmaWVkIENhbGVuZGFyIHRvIGNvbnN0cnVjdCB0aGUgZGF0ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIEpEQkMge0Bjb2RlIERBVEV9IHBhcmFtZXRlciBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLkRhdGV9LCB1c2luZyB0aGUgc3BlY2lmaWVkIHtAY29kZSBDYWxlbmRhcn0gdG8gY29uc3RydWN0IHRoZSBkYXRlLgogICAgICAqIDxwPgotICAgICAqIFRoZSBKREJDIGRyaXZlciB1c2VzIHRoZSBDYWxlbmRhciB0byBjcmVhdGUgdGhlIERhdGUgdXNpbmcgYSBwYXJ0aWN1bGFyCi0gICAgICogdGltZXpvbmUgYW5kIGxvY2FsZS4gRGVmYXVsdCBiZWhhdmlvdXIgb2YgdGhlIGRyaXZlciBpcyB0byB1c2UgdGhlIEphdmEKKyAgICAgKiBUaGUgSkRCQyBkcml2ZXIgdXNlcyB0aGUgY2FsZW5kYXIgdG8gY3JlYXRlIHRoZSBkYXRlIHVzaW5nIGEgcGFydGljdWxhcgorICAgICAqIHRpbWV6b25lIGFuZCBsb2NhbGUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBkcml2ZXIgaXMgdG8gdXNlIHRoZSBKYXZhCiAgICAgICogdmlydHVhbCBtYWNoaW5lIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICB1c2VkIGZvciBjcmVhdGluZyB0aGUgcmV0dXJuZWQgPGNvZGU+RGF0ZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBqYXZhLnNxbC5EYXRlIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIHJldHVybmVkIHtAY29kZSBEYXRlfS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgamF2YS5zcWwuRGF0ZX0gZ2l2aW5nIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZS4ge0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgRGF0ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlIGdldERhdGUoU3RyaW5nIHBhcmFtZXRlck5hbWUsIENhbGVuZGFyIGNhbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgRE9VQkxFIHBhcmFtZXRlciBhcyBhIGRvdWJsZQorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgRE9VQkxFfSBwYXJhbWV0ZXIgYXMgYQorICAgICAqIHtAY29kZSBkb3VibGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCi0gICAgICogQHJldHVybiB0aGUgZG91YmxlIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gMC4wIGlmIHRoZSB2YWx1ZSBpcyBTUUwKLSAgICAgKiAgICAgICAgIE5VTEwuCisgICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEge0Bjb2RlIGRvdWJsZX0uIHtAY29kZSAwLjB9IAorICAgICAqICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIERPVUJMRSBwYXJhbWV0ZXIgYXMgYSBkb3VibGUKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIEpEQkMge0Bjb2RlIERPVUJMRX0gcGFyYW1ldGVyIGFzIGEKKyAgICAgKiB7QGNvZGUgZG91YmxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIHZhbHVlIGFzIHJlcHJlc2VudGVkIGluIGEgSmF2YSA8Y29kZT5kb3VibGU8L2NvZGU+LgotICAgICAqICAgICAgICAgQW4gU1FMIHZhbHVlIG9mIDxjb2RlPk5VTEw8L2NvZGU+IGdldHMgcmVwcmVzZW50ZWQgYXMKLSAgICAgKiAgICAgICAgIDxjb2RlPjA8L2NvZGU+ICh6ZXJvKS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBhIHtAY29kZSBkb3VibGV9LiB7QGNvZGUgMC4wfSAKKyAgICAgKiAgICAgICAgIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgcGFyYW1ldGVyTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgRkxPQVQgcGFyYW1ldGVyIGFzIGEgZmxvYXQKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIEpEQkMge0Bjb2RlIEZMT0FUfSBwYXJhbWV0ZXIgYXMgYSB7QGNvZGUKKyAgICAgKiBmbG9hdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIDAuMCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEge0Bjb2RlIGZsb2F0fS4ge0Bjb2RlIDAuMH0gCisgICAgICogICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIDxjb2RlPkZMT0FUPC9jb2RlPiBwYXJhbWV0ZXIgYXMgYQotICAgICAqIEphdmEgPGNvZGU+ZmxvYXQ8L2NvZGU+LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgRkxPQVR9IHBhcmFtZXRlciBhcyBhIEphdmEKKyAgICAgKiB7QGNvZGUgZmxvYXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdmFsdWUgYXMgcmVwcmVzZW50ZWQgaW4gYSBKYXZhIDxjb2RlPmZsb2F0PC9jb2RlPi4KLSAgICAgKiAgICAgICAgIEFuIFNRTCB2YWx1ZSBvZiA8Y29kZT5OVUxMPC9jb2RlPiBnZXRzIHJlcHJlc2VudGVkIGFzCi0gICAgICogICAgICAgICA8Y29kZT4wPC9jb2RlPiAoemVybykuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgYXMgYSB7QGNvZGUgZmxvYXR9LiB7QGNvZGUgMC4wfSAKKyAgICAgKiAgICAgICAgIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIElOVEVHRVIgcGFyYW1ldGVyIGFzIGFuIGludAorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgSU5URUdFUn0gcGFyYW1ldGVyIGFzIGFuCisgICAgICoge0Bjb2RlIGludH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIGludH0gZ2l2aW5nIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZS4ge0Bjb2RlIDB9IAorICAgICAqICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEludChpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIElOVEVHRVIgcGFyYW1ldGVyIGFzIGFuIGludAorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgSU5URUdFUn0gcGFyYW1ldGVyIGFzIGFuCisgICAgICoge0Bjb2RlIGludH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgaW50fSBnaXZpbmcgdGhlIHBhcmFtZXRlcidzIHZhbHVlLiB7QGNvZGUgMH0gCisgICAgICogICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyBCSUdJTlQgcGFyYW1ldGVyIGFzIGEgbG9uZworICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgQklHSU5UfSBwYXJhbWV0ZXIgYXMgYQorICAgICAqIHtAY29kZSBsb25nfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQotICAgICAqIEByZXR1cm4gdGhlIGxvbmcgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIGxvbmd9IGdpdmluZyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUuIHtAY29kZSAwfSAKKyAgICAgKiAgICAgICAgIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIEJJR0lOVCBwYXJhbWV0ZXIgYXMgYSBsb25nCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBKREJDIHtAY29kZSBCSUdJTlR9IHBhcmFtZXRlciBhcyBhCisgICAgICoge0Bjb2RlIGxvbmd9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogQHJldHVybiB0aGUgbG9uZyB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIDAgaWYgdGhlIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFyYW1ldGVyLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBsb25nfSBnaXZpbmcgdGhlIHBhcmFtZXRlcidzIHZhbHVlLiB7QGNvZGUgMH0gCisgICAgICogICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgYXMgYSBKYXZhIDxjb2RlPk9iamVjdDwvY29kZT4uCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgYXMgYSBKYXZhIHtAY29kZSBPYmplY3R9LgogICAgICAqIDxwPgogICAgICAqIFRoZSBvYmplY3QgdHlwZSByZXR1cm5lZCBpcyB0aGUgSkRCQyB0eXBlIHJlZ2lzdGVyZWQgZm9yIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiB3aXRoIGEgPGNvZGU+cmVnaXN0ZXJPdXRQYXJhbWV0ZXI8L2NvZGU+IGNhbGwuIElmIGEgcGFyYW1ldGVyIHdhcwotICAgICAqIHJlZ2lzdGVyZWQgYXMgYSA8Y29kZT5qYXZhLnNxbC5UeXBlcy5PVEhFUjwvY29kZT4gdGhlbiBpdCBtYXkgaG9sZAotICAgICAqIGFic3RyYWN0IHR5cGVzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlIGNvbm5lY3RlZCBkYXRhYmFzZS4KKyAgICAgKiB3aXRoIGEge0Bjb2RlIHJlZ2lzdGVyT3V0UGFyYW1ldGVyfSBjYWxsLiBJZiBhIHBhcmFtZXRlciB3YXMgcmVnaXN0ZXJlZAorICAgICAqIGFzIGEge0Bjb2RlIGphdmEuc3FsLlR5cGVzLk9USEVSfSB0aGVuIGl0IG1heSBob2xkIGFic3RyYWN0IHR5cGVzIHRoYXQKKyAgICAgKiBhcmUgcGFydGljdWxhciB0byB0aGUgY29ubmVjdGVkIGRhdGFiYXNlLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcmV0dXJuIGFuIE9iamVjdCBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgYXMgYW4gT2JqZWN0LiBBIE1hcCBpcyBzdXBwbGllZAotICAgICAqIHRvIHByb3ZpZGUgY3VzdG9tIG1hcHBpbmcgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBhcyBhbiB7QGNvZGUgT2JqZWN0fS4gVGhlCisgICAgICoge0Bjb2RlIE1hcH0gZ2l2ZXMgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gU1FMIHR5cGVzIGFuZCBKYXZhIGNsYXNzZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIE1hcCBob2xpbmcgdGhlIG1hcHBpbmcgZnJvbSBTUUwgdHlwZXMgdG8gSmF2YSBjbGFzc2VzCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE1hcH0gZ2l2aW5nIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIFNRTCAKKyAgICAgKiAgICAgICAgICAgIHR5cGVzIGFuZCBKYXZhIGNsYXNzZXMuCiAgICAgICogQHJldHVybiBhbiBPYmplY3QgaG9sZGluZyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KGludCBwYXJhbWV0ZXJJbmRleCwgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1hcCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgYXMgYW4gT2JqZWN0LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGFzIGFuIHtAY29kZSBPYmplY3R9LgogICAgICAqIDxwPgotICAgICAqIFRoZSBvYmplY3QgdHlwZSByZXR1cm5lZCBpcyB0aGUgSkRCQyB0eXBlIHJlZ2lzdGVyZWQgZm9yIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiB3aXRoIGEgPGNvZGU+cmVnaXN0ZXJPdXRQYXJhbWV0ZXI8L2NvZGU+IGNhbGwuIElmIGEgcGFyYW1ldGVyIHdhcwotICAgICAqIHJlZ2lzdGVyZWQgYXMgYSA8Y29kZT5qYXZhLnNxbC5UeXBlcy5PVEhFUjwvY29kZT4gdGhlbiBpdCBtYXkgaG9sZAotICAgICAqIGFic3RyYWN0IHR5cGVzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlIGNvbm5lY3RlZCBkYXRhYmFzZS4KKyAgICAgKiBUaGUgb2JqZWN0IHR5cGUgcmV0dXJuZWQgaXMgdGhlIEpEQkMgdHlwZSB0aGF0IHdhcyByZWdpc3RlcmVkIGZvcgorICAgICAqIHRoZSBwYXJhbWV0ZXIgYnkgYW4gZWFybGllciBjYWxsIHRvIHtAbGluayAjcmVnaXN0ZXJPdXRQYXJhbWV0ZXJ9LiAKKyAgICAgKiBJZiBhIHBhcmFtZXRlciB3YXMgcmVnaXN0ZXJlZCBhcyBhIHtAY29kZSBqYXZhLnNxbC5UeXBlcy5PVEhFUn0gCisgICAgICogdGhlbiBpdCBtYXkgaG9sZCBhYnN0cmFjdCB0eXBlcyB0aGF0IGFyZSBwYXJ0aWN1bGFyIHRvIHRoZSAKKyAgICAgKiBjb25uZWN0ZWQgZGF0YWJhc2UuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIDxjb2RlPk9iamVjdDwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIEphdmEge0Bjb2RlIE9iamVjdH0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIHRoZQogICAgICAqICAgICAgICAgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgcGFyYW1ldGVyTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciBhcyBhbiBPYmplY3QuIEEgTWFwIGlzIHN1cHBsaWVkCi0gICAgICogdG8gcHJvdmlkZSBjdXN0b20gbWFwcGluZyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciBhcyBhbiB7QGNvZGUgT2JqZWN0fS4gVGhlIAorICAgICAqIGFjdHVhbCByZXR1cm4gdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB7QGNvZGUgTWFwfSBwYXJhbWV0ZXIgd2hpY2gKKyAgICAgKiBnaXZlcyB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBTUUwgdHlwZXMgYW5kIEphdmEgY2xhc3Nlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPk1hcDwvY29kZT4gb2YgU1FMIHR5cGVzIHRvIHRoZWlyIEphdmEgY291bnRlcnBhcnRzCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE1hcH0gb2YgU1FMIHR5cGVzIHRvIHRoZWlyIEphdmEgY291bnRlcnBhcnRzCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgT2JqZWN0fSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1hcCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIFJFRig8c3RydWN0dXJlZCB0eXBlPikgcGFyYW1ldGVyIGFzIGEKLSAgICAgKiBqYXZhLnNxbC5SZWYKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBTUUwge0Bjb2RlIFJFRig8c3RydWN0dXJlZCB0eXBlPil9CisgICAgICogcGFyYW1ldGVyIGFzIGEge0Bjb2RlIGphdmEuc3FsLlJlZn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIGEgamF2YS5zcWwuUmVmIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgU1FMCi0gICAgICogICAgICAgICBOVUxMLgorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLlJlZn0gd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLiB7QGNvZGUgbnVsbH0gCisgICAgICogICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZWYgZ2V0UmVmKGludCBwYXJhbWV0ZXJJbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgUkVGKDxzdHJ1Y3R1cmVkIHR5cGU+KSBwYXJhbWV0ZXIgYXMgYQotICAgICAqIGphdmEuc3FsLlJlZgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIFNRTCB7QGNvZGUgUkVGKDxzdHJ1Y3R1cmVkIHR5cGU+KX0KKyAgICAgKiBwYXJhbWV0ZXIgYXMgYSB7QGNvZGUgamF2YS5zcWwuUmVmfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCi0gICAgICogQHJldHVybiB0aGUgdGFyZ2V0IHBhcmFtZXRlcidzIHZhbHVlIGluIHRoZSBmb3JtIG9mIGEKLSAgICAgKiAgICAgICAgIDxjb2RlPmphdmEuc3FsLlJlZjwvY29kZT4uIEEgPGNvZGU+bnVsbDwvY29kZT4gcmVmZXJlbmNlIGlzCi0gICAgICogICAgICAgICByZXR1cm5lZCBmb3IgYSBwYXJhbWV0ZXIgdmFsdWUgb2YgU1FMIDxjb2RlPk5VTEw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgcGFyYW1ldGVyJ3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpbiB0aGUgZm9ybSBvZiBhIHtAY29kZQorICAgICAqICAgICAgICAgamF2YS5zcWwuUmVmfS4gQSB7QGNvZGUgbnVsbH0gcmVmZXJlbmNlIGlzIHJldHVybmVkIGlmIHRoZQorICAgICAqICAgICAgICAgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNlZSBSZWYKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVmIGdldFJlZihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgU01BTExJTlQgcGFyYW1ldGVyIGFzIGEgc2hvcnQKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBTTUFMTElOVH0gcGFyYW1ldGVyIGFzIGEKKyAgICAgKiB7QGNvZGUgc2hvcnR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCi0gICAgICogQHJldHVybiBhIHNob3J0IHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gMCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEge0Bjb2RlIHNob3J0fS4gMCBpcyByZXR1cm5lZCAKKyAgICAgKiAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHNob3J0IGdldFNob3J0KGludCBwYXJhbWV0ZXJJbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgPGNvZGU+U01BTExJTlQ8L2NvZGU+IHBhcmFtZXRlciBhcyBhCi0gICAgICogc2hvcnQKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBTTUFMTElOVH0gcGFyYW1ldGVyIGFzIGEKKyAgICAgKiB7QGNvZGUgc2hvcnR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IHBhcmFtZXRlciBhcyBhIEphdmEgPGNvZGU+c2hvcnQ8L2NvZGU+LgotICAgICAqICAgICAgICAgSWYgdGhlIHZhbHVlIGlzIGFuIFNRTCA8Y29kZT5OVUxMPC9jb2RlPiB0aGVuIDxjb2RlPjA8L2NvZGU+Ci0gICAgICogICAgICAgICAoemVybykgaXMgcmV0dXJuZWQuCisgICAgICogICAgICAgICAgICB0aGUgZGVzaXJlZCBwYXJhbWV0ZXIncyBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEge0Bjb2RlIHNob3J0fS4gMCBpcyByZXR1cm5lZCAKKyAgICAgKiAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleGVkIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEgc3RyaW5nLiBUaGUgcGFyYW1ldGVyIHZhbHVlCi0gICAgICogbXVzdCBiZSBvbmUgb2YgdGhlIEpEQkMgdHlwZXMgPGNvZGU+Q0hBUjwvY29kZT4sIDxjb2RlPlZBUkNIQVI8L2NvZGU+Ci0gICAgICogb3IgPGNvZGU+TE9OR1ZBUkNIQVI8L2NvZGU+LgorICAgICAqIFJldHVybnMgdGhlIGluZGV4ZWQgcGFyYW1ldGVyJ3MgdmFsdWUgYXMgYSB7QGNvZGUgU3RyaW5nfS4gVGhlIAorICAgICAqIHBhcmFtZXRlciB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgSkRCQyB0eXBlcyB7QGNvZGUgQ0hBUn0sIAorICAgICAqIHtAY29kZSBWQVJDSEFSfSBvciB7QGNvZGUgTE9OR1ZBUkNIQVJ9LgogICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBhIDxjb2RlPkNIQVI8L2NvZGU+IG9mIGZpeGVkIGxlbmd0aCB3aWxsIGJlCi0gICAgICogb2YgaWRlbnRpY2FsIGxlbmd0aCB0byB0aGUgdmFsdWUgaW4gdGhlIGRhdGFiYXNlIGluY2x1c2l2ZSBvZiBwYWRkaW5nCi0gICAgICogY2hhcmFjdGVycy4KKyAgICAgKiBUaGUge0Bjb2RlIFN0cmluZ30gY29ycmVzcG9uZGluZyB0byBhIHtAY29kZSBDSEFSfSBvZiBmaXhlZCBsZW5ndGggCisgICAgICogd2lsbCBiZSBvZiBpZGVudGljYWwgbGVuZ3RoIHRvIHRoZSB2YWx1ZSBpbiB0aGUgZGF0YWJhc2UgaW5jbHVzaXZlIAorICAgICAqIG9mIHBhZGRpbmcgY2hhcmFjdGVycy4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEge0Bjb2RlIFN0cmluZ30uIHtAY29kZSBudWxsfSAKKyAgICAgKiAgICAgICAgIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBhIHN0cmluZy4gVGhlIHBhcmFtZXRlciB2YWx1ZSBtdXN0Ci0gICAgICogYmUgb25lIG9mIHRoZSBKREJDIHR5cGVzIDxjb2RlPkNIQVI8L2NvZGU+LCA8Y29kZT5WQVJDSEFSPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPkxPTkdWQVJDSEFSPC9jb2RlPi4KKyAgICAgKiBiZSBvbmUgb2YgdGhlIEpEQkMgdHlwZXMge0Bjb2RlIENIQVJ9LCB7QGNvZGUgVkFSQ0hBUn0gb3Ige0Bjb2RlCisgICAgICogTE9OR1ZBUkNIQVJ9LgogICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBhIDxjb2RlPkNIQVI8L2NvZGU+IG9mIGZpeGVkIGxlbmd0aCB3aWxsIGJlCi0gICAgICogb2YgaWRlbnRpY2FsIGxlbmd0aCB0byB0aGUgdmFsdWUgaW4gdGhlIGRhdGFiYXNlIGluY2x1c2l2ZSBvZiBwYWRkaW5nCisgICAgICogVGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIGEge0Bjb2RlIENIQVJ9IG9mIGZpeGVkIGxlbmd0aCB3aWxsIGJlIG9mCisgICAgICogaWRlbnRpY2FsIGxlbmd0aCB0byB0aGUgdmFsdWUgaW4gdGhlIGRhdGFiYXNlIGluY2x1c2l2ZSBvZiBwYWRkaW5nCiAgICAgICogY2hhcmFjdGVycy4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIHBhcmFtZXRlcidzIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgYXMgYSB7QGNvZGUgU3RyaW5nfS4ge0Bjb2RlIG51bGx9IAorICAgICAqICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyBUSU1FIHBhcmFtZXRlciBhcyBhIGphdmEuc3FsLlRpbWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgVElNRX0gcGFyYW1ldGVyIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuVGltZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIGEgamF2YS5zcWwuVGltZSB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIG51bGwgaWYgdGhlIHZhbHVlIGlzCi0gICAgICogICAgICAgICBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgYXMgYSB7QGNvZGUgamF2YS5zcWwuVGltZX0uIAorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUaW1lCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRpbWUgZ2V0VGltZShpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIFRJTUUgcGFyYW1ldGVyIGFzIGEgamF2YS5zcWwuVGltZSwKLSAgICAgKiB1c2luZyB0aGUgc3VwcGxpZWQgQ2FsZW5kYXIgdG8gY29uc3RydWN0IHRoZSB0aW1lLiBUaGUgSkRCQyBkcml2ZXIgdXNlcwotICAgICAqIHRoZSBDYWxlbmRhciB0byBoYW5kbGUgc3BlY2lmaWMgdGltZXpvbmVzIGFuZCBsb2NhbGVzIHdoZW4gY3JlYXRpbmcgdGhlCi0gICAgICogVGltZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBUSU1FfSBwYXJhbWV0ZXIgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lfSwgdXNpbmcgdGhlIHN1cHBsaWVkIHtAY29kZSBDYWxlbmRhcn0gdG8gY29uc3RydWN0IHRoZSAKKyAgICAgKiB0aW1lLiBUaGUgSkRCQyBkcml2ZXIgdXNlcyB0aGUgY2FsZW5kYXIgdG8gaGFuZGxlIHNwZWNpZmljIHRpbWV6b25lcyAKKyAgICAgKiBhbmQgbG9jYWxlcyBpbiBvcmRlciB0byBkZXRlcm1pbmUge0Bjb2RlIFRpbWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhciB0byB1c2UgaW4gY29uc3RydWN0aW5nIHRoZSBUaW1lLgotICAgICAqIEByZXR1cm4gYSBqYXZhLnNxbC5UaW1lIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIGNhbGVuZGFyIHRvIHVzZSBpbiBjb25zdHJ1Y3Rpbmcge0Bjb2RlIFRpbWV9LgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEge0Bjb2RlIGphdmEuc3FsLlRpbWV9LiAKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgVGltZQorICAgICAqIEBzZWUgamF2YS51dGlsLkNhbGVuZGFyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRpbWUgZ2V0VGltZShpbnQgcGFyYW1ldGVySW5kZXgsIENhbGVuZGFyIGNhbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMgPGNvZGU+VElNRTwvY29kZT4gcGFyYW1ldGVyIGFzIGEKLSAgICAgKiA8Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIEpEQkMge0Bjb2RlIFRJTUV9IHBhcmFtZXRlciBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPmphdmEuc3FsLlRpbWU8L2NvZGU+IHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4gQQotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gcmVmZXJlbmNlIGlzIHJldHVybmVkIGZvciBhbiBTUUwgdmFsdWUgb2YKLSAgICAgKiAgICAgICAgIDxjb2RlPk5VTEw8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiBhIG5ldyB7QGNvZGUgamF2YS5zcWwuVGltZX0gd2l0aCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUuIEEge0Bjb2RlCisgICAgICogICAgICAgICBudWxsfSByZWZlcmVuY2UgaXMgcmV0dXJuZWQgZm9yIGFuIFNRTCB2YWx1ZSBvZiB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIFRpbWUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZSBnZXRUaW1lKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyBUSU1FIHBhcmFtZXRlciBhcyBhIGphdmEuc3FsLlRpbWUsCi0gICAgICogdXNpbmcgdGhlIHN1cHBsaWVkIENhbGVuZGFyIHRvIGNvbnN0cnVjdCB0aGUgdGltZS4gVGhlIEpEQkMgZHJpdmVyIHVzZXMKLSAgICAgKiB0aGUgQ2FsZW5kYXIgdG8gaGFuZGxlIHNwZWNpZmljIHRpbWV6b25lcyBhbmQgbG9jYWxlcyB3aGVuIGNyZWF0aW5nIHRoZQotICAgICAqIFRpbWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgSkRCQyB7QGNvZGUgVElNRX0gcGFyYW1ldGVyIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuVGltZX0sIHVzaW5nIHRoZSBzdXBwbGllZCB7QGNvZGUgQ2FsZW5kYXJ9IHRvIGNvbnN0cnVjdCAKKyAgICAgKiB0aGUgdGltZS4gVGhlIEpEQkMgZHJpdmVyIHVzZXMgdGhlIGNhbGVuZGFyIHRvIGhhbmRsZSBzcGVjaWZpYyAKKyAgICAgKiB0aW1lem9uZXMgYW5kIGxvY2FsZXMgd2hlbiBjcmVhdGluZyB7QGNvZGUgVGltZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSByZXR1cm5lZCA8Y29kZT5UaW1lPC9jb2RlPgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPiB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIEEKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHJlZmVyZW5jZSBpcyByZXR1cm5lZCBmb3IgYW4gU1FMIHZhbHVlIG9mCi0gICAgICogICAgICAgICA8Y29kZT5OVUxMPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIHJldHVybmVkIHtAY29kZSBUaW1lfQorICAgICAqIEByZXR1cm4gYSBuZXcge0Bjb2RlIGphdmEuc3FsLlRpbWV9IHdpdGggdGhlIHBhcmFtZXRlcidzIHZhbHVlLiBBIHtAY29kZQorICAgICAqICAgICAgICAgbnVsbH0gcmVmZXJlbmNlIGlzIHJldHVybmVkIGZvciBhbiBTUUwgdmFsdWUgb2Yge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUaW1lCisgICAgICogQHNlZSBqYXZhLnV0aWwuQ2FsZW5kYXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZSBnZXRUaW1lKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBDYWxlbmRhciBjYWwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleGVkIHBhcmFtZXRlcidzIDxjb2RlPlRJTUVTVEFNUDwvY29kZT4gdmFsdWUgYXMgYQotICAgICAqIDxjb2RlPmphdmEuc3FsLlRpbWVzdGFtcDwvY29kZT4uCisgICAgICogUmV0dXJucyB0aGUgaW5kZXhlZCBwYXJhbWV0ZXIncyB7QGNvZGUgVElNRVNUQU1QfSB2YWx1ZSBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWVzdGFtcH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKICAgICAgKiAgICAgICAgICAgIGluZGV4IDEKLSAgICAgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPmphdmEuc3FsLlRpbWVzdGFtcDwvY29kZT4gd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLgotICAgICAqICAgICAgICAgQSA8Y29kZT5udWxsPC9jb2RlPiByZWZlcmVuY2UgaXMgcmV0dXJuZWQgZm9yIGFuIFNRTCB2YWx1ZSBvZgotICAgICAqICAgICAgICAgPGNvZGU+TlVMTDwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBhIHtAY29kZSBqYXZhLnNxbC5UaW1lc3RhbXB9LiBBCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gcmVmZXJlbmNlIGlzIHJldHVybmVkIGZvciBhbiBTUUwgdmFsdWUgb2Yge0Bjb2RlCisgICAgICogICAgICAgICBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgVGltZXN0YW1wCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoaW50IHBhcmFtZXRlckluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXhlZCBwYXJhbWV0ZXIncyA8Y29kZT5USU1FU1RBTVA8L2NvZGU+IHZhbHVlIGFzIGEKLSAgICAgKiA8Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+LiBUaGUgSkRCQyBkcml2ZXIgdXNlcyB0aGUgc3VwcGxpZWQKLSAgICAgKiA8Y29kZT5DYWxlbmRhcjwvY29kZT4gdG8gaGFuZGxlIHNwZWNpZmljIHRpbWV6b25lcyBhbmQgbG9jYWxlcyB3aGVuCi0gICAgICogY3JlYXRpbmcgdGhlIHJlc3VsdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleGVkIHBhcmFtZXRlcidzIHtAY29kZSBUSU1FU1RBTVB9IHZhbHVlIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuVGltZXN0YW1wfS4gVGhlIEpEQkMgZHJpdmVyIHVzZXMgdGhlIHN1cHBsaWVkIHtAY29kZSBDYWxlbmRhcn0KKyAgICAgKiB0byBoYW5kbGUgc3BlY2lmaWMgdGltZXpvbmVzIGFuZCBsb2NhbGVzIHdoZW4gY3JlYXRpbmcgdGhlIHJlc3VsdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwogICAgICAqICAgICAgICAgICAgaW5kZXggMQogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSByZXR1cm5lZCA8Y29kZT5UaW1lc3RhbXA8L2NvZGU+Ci0gICAgICogQHJldHVybiBhIG5ldyA8Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+IHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4KLSAgICAgKiAgICAgICAgIEEgPGNvZGU+bnVsbDwvY29kZT4gcmVmZXJlbmNlIGlzIHJldHVybmVkIGZvciBhbiBTUUwgdmFsdWUgb2YKLSAgICAgKiAgICAgICAgIDxjb2RlPk5VTEw8L2NvZGU+CisgICAgICogICAgICAgICAgICB1c2VkIGZvciBjcmVhdGluZyB0aGUgcmV0dXJuZWQge0Bjb2RlIFRpbWVzdGFtcH0KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBhIHtAY29kZSBqYXZhLnNxbC5UaW1lc3RhbXB9LiBBCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gcmVmZXJlbmNlIGlzIHJldHVybmVkIGZvciBhbiBTUUwgdmFsdWUgb2Yge0Bjb2RlCisgICAgICogICAgICAgICBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgVGltZXN0YW1wCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoaW50IHBhcmFtZXRlckluZGV4LCBDYWxlbmRhciBjYWwpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZWQgcGFyYW1ldGVyJ3MgPGNvZGU+VElNRVNUQU1QPC9jb2RlPiB2YWx1ZSBhcyBhCi0gICAgICogPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCBwYXJhbWV0ZXIncyB7QGNvZGUgVElNRVNUQU1QfSB2YWx1ZSBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWVzdGFtcH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQotICAgICAqIEByZXR1cm4gYSBuZXcgPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPiB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCi0gICAgICogICAgICAgICBBIDxjb2RlPm51bGw8L2NvZGU+IHJlZmVyZW5jZSBpcyByZXR1cm5lZCBmb3IgYW4gU1FMIHZhbHVlIG9mCi0gICAgICogICAgICAgICA8Y29kZT5OVUxMPC9jb2RlPgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFyYW1ldGVyLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEge0Bjb2RlIGphdmEuc3FsLlRpbWVzdGFtcH0uIEEKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSByZWZlcmVuY2UgaXMgcmV0dXJuZWQgZm9yIGFuIFNRTCB2YWx1ZSBvZiB7QGNvZGUKKyAgICAgKiAgICAgICAgIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUaW1lc3RhbXAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChTdHJpbmcgcGFyYW1ldGVyTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4ZWQgcGFyYW1ldGVyJ3MgPGNvZGU+VElNRVNUQU1QPC9jb2RlPiB2YWx1ZSBhcyBhCi0gICAgICogPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPi4gVGhlIEpEQkMgZHJpdmVyIHVzZXMgdGhlIHN1cHBsaWVkCi0gICAgICogPGNvZGU+Q2FsZW5kYXI8L2NvZGU+IHRvIGhhbmRsZSBzcGVjaWZpYyB0aW1lem9uZXMgYW5kIGxvY2FsZXMgd2hlbgotICAgICAqIGNyZWF0aW5nIHRoZSByZXN1bHQuCisgICAgICogUmV0dXJucyB0aGUgaW5kZXhlZCBwYXJhbWV0ZXIncyB7QGNvZGUgVElNRVNUQU1QfSB2YWx1ZSBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWVzdGFtcH0uIFRoZSBKREJDIGRyaXZlciB1c2VzIHRoZSBzdXBwbGllZCB7QGNvZGUgQ2FsZW5kYXJ9CisgICAgICogdG8gaGFuZGxlIHNwZWNpZmljIHRpbWV6b25lcyBhbmQgbG9jYWxlcyB3aGVuIGNyZWF0aW5nIHRoZSByZXN1bHQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSByZXR1cm5lZCA8Y29kZT5UaW1lc3RhbXA8L2NvZGU+Ci0gICAgICogQHJldHVybiBhIG5ldyA8Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+IHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4KLSAgICAgKiAgICAgICAgIEEgPGNvZGU+bnVsbDwvY29kZT4gcmVmZXJlbmNlIGlzIHJldHVybmVkIGZvciBhbiBTUUwgdmFsdWUgb2YKLSAgICAgKiAgICAgICAgIDxjb2RlPk5VTEw8L2NvZGU+CisgICAgICogICAgICAgICAgICB1c2VkIGZvciBjcmVhdGluZyB0aGUgcmV0dXJuZWQge0Bjb2RlIFRpbWVzdGFtcH0KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBhIHtAY29kZSBqYXZhLnNxbC5UaW1lc3RhbXB9LiBBCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gcmVmZXJlbmNlIGlzIHJldHVybmVkIGZvciBhbiBTUUwgdmFsdWUgb2Yge0Bjb2RlCisgICAgICogICAgICAgICBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgVGltZXN0YW1wCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoU3RyaW5nIHBhcmFtZXRlck5hbWUsIENhbGVuZGFyIGNhbCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIERBVEFMSU5LIHBhcmFtZXRlciBhcyBhIGphdmEubmV0LlVSTC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBKREJDIHtAY29kZSBEQVRBTElOS30gcGFyYW1ldGVyIGFzIGEKKyAgICAgKiB7QGNvZGUgamF2YS5uZXQuVVJMfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQotICAgICAqIEByZXR1cm4gYSBqYXZhLnNxbC5EYXRhbGluayB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIG51bGwgaWYgdGhlIHZhbHVlCi0gICAgICogICAgICAgICBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogQHJldHVybiBhIHtAY29kZSBVUkx9IGdpdmluZyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUuIHtAY29kZSBudWxsfSAKKyAgICAgKiAgICAgICAgIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBqYXZhLm5ldC5VUkwKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMIGdldFVSTChpbnQgcGFyYW1ldGVySW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCBwYXJhbWV0ZXIncyBKREJDIDxjb2RlPkRBVEFMSU5LPC9jb2RlPiB2YWx1ZSBpbiBhIG5ldwotICAgICAqIEphdmEgPGNvZGU+amF2YS5uZXQuVVJMPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lZCBwYXJhbWV0ZXIncyBKREJDIHtAY29kZSBEQVRBTElOS30gdmFsdWUgaW4gYSBuZXcgSmF2YQorICAgICAqIHtAY29kZSBqYXZhLm5ldC5VUkx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4gZW5jYXBzdWxhdGluZyB0aGUgcGFyYW1ldGVyCi0gICAgICogICAgICAgICB2YWx1ZS4gQSA8Y29kZT5udWxsPC9jb2RlPiByZWZlcmVuY2UgaXMgcmV0dXJuZWQgZm9yIGFuIFNRTAotICAgICAqICAgICAgICAgdmFsdWUgb2YgPGNvZGU+TlVMTDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHtAY29kZSBqYXZhLm5ldC5VUkx9IGVuY2Fwc3VsYXRpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZS4gQQorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IHJlZmVyZW5jZSBpcyByZXR1cm5lZCBmb3IgYW4gU1FMIHZhbHVlIG9mIHtAY29kZQorICAgICAqICAgICAgICAgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIGphdmEubmV0LlVSTAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBVUkwgZ2V0VVJMKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgVHlwZSBvZiBhIHNwZWNpZmllZCBPVVQgcGFyYW1ldGVyLiBBbGwgT1VUIHBhcmFtZXRlcnMgbXVzdAotICAgICAqIGhhdmUgdGhlaXIgVHlwZSBkZWZpbmVkIGJlZm9yZSBhIHN0b3JlZCBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQuCisgICAgICogRGVmaW5lcyB0aGUgdHlwZSBvZiBhIHNwZWNpZmllZCB7QGNvZGUgT1VUfSBwYXJhbWV0ZXIuIEFsbCB7QGNvZGUgT1VUfQorICAgICAqIHBhcmFtZXRlcnMgbXVzdCBoYXZlIHRoZWlyIHR5cGUgZGVmaW5lZCBiZWZvcmUgYSBzdG9yZWQgcHJvY2VkdXJlIGlzCisgICAgICogZXhlY3V0ZWQuCiAgICAgICogPHA+Ci0gICAgICogVGhlIFR5cGUgZGVmaW5lZCBieSB0aGlzIG1ldGhvZCBmaXhlcyB0aGUgSmF2YSB0eXBlIHRoYXQgbXVzdCBiZQotICAgICAqIHJldHJpZXZlZCB1c2luZyB0aGUgZ2V0dGVyIG1ldGhvZHMgb2YgQ2FsbGFibGVTdGF0ZW1lbnQuIElmIGEgZGF0YWJhc2UKLSAgICAgKiBzcGVjaWZpYyB0eXBlIGlzIGV4cGVjdGVkIGZvciBhIHBhcmFtZXRlciwgdGhlIFR5cGUgamF2YS5zcWwuVHlwZXMuT1RIRVIKLSAgICAgKiBzaG91bGQgYmUgdXNlZC4gTm90ZSB0aGF0IHRoZXJlIGlzIGFub3RoZXIgdmFyaWFudCBvZiB0aGlzIG1ldGhvZCBmb3IKLSAgICAgKiBVc2VyIERlZmluZWQgVHlwZXMgb3IgYSBSRUYgdHlwZS4KKyAgICAgKiBUaGUgdHlwZSBzdXBwbGllZCBpbiB0aGUge0Bjb2RlIHNxbFR5cGV9IHBhcmFtZXRlciBmaXhlcyB0aGUgIAorICAgICAqIHR5cGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBnZXR0ZXIgbWV0aG9kcyBvZiAKKyAgICAgKiB7QGNvZGUgQ2FsbGFibGVTdGF0ZW1lbnR9LiAKKyAgICAgKiBJZiBhIGRhdGFiYXNlIHNwZWNpZmljIHR5cGUgaXMgZXhwZWN0ZWQgZm9yIGEgcGFyYW1ldGVyLCB0aGUgVHlwZSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UeXBlcy5PVEhFUn0gc2hvdWxkIGJlIHVzZWQuIE5vdGUgdGhhdCB0aGVyZSBpcyBhbm90aGVyIHZhcmlhbnQKKyAgICAgKiBvZiB0aGlzIG1ldGhvZCBmb3IgVXNlciBEZWZpbmVkIFR5cGVzIG9yIGEge0Bjb2RlIFJFRn0gdHlwZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKICAgICAgKiAgICAgICAgICAgIGluZGV4IDEKICAgICAgKiBAcGFyYW0gc3FsVHlwZQotICAgICAqICAgICAgICAgICAgdGhlIEpEQkMgdHlwZSBhcyBkZWZpbmVkIGJ5IGphdmEuc3FsLlR5cGVzLiBUaGUgSkRCQyB0eXBlcwotICAgICAqICAgICAgICAgICAgTlVNRVJJQyBhbmQgREVDSU1BTCBzaG91bGQgYmUgZGVmaW5lZCB1c2luZyB0aGUgdmVyc2lvbiBvZgotICAgICAqICAgICAgICAgICAgPGNvZGU+cmVnaXN0ZXJPdXRQYXJhbWV0ZXI8L2NvZGU+IHRoYXQgdGFrZXMgYQotICAgICAqICAgICAgICAgICAgPGNvZGU+c2NhbGU8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSBKREJDIHR5cGUgYXMgZGVmaW5lZCBieSB7QGNvZGUgamF2YS5zcWwuVHlwZXN9LiBUaGUgSkRCQworICAgICAqICAgICAgICAgICAgdHlwZXMge0Bjb2RlIE5VTUVSSUN9IGFuZCB7QGNvZGUgREVDSU1BTH0gc2hvdWxkIGJlIGRlZmluZWQKKyAgICAgKiAgICAgICAgICAgIHVzaW5nIHtAbGluayAjcmVnaXN0ZXJPdXRQYXJhbWV0ZXIoaW50LCBpbnQsIGludCl9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUeXBlcworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKGludCBwYXJhbWV0ZXJJbmRleCwgaW50IHNxbFR5cGUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgVHlwZSBvZiBhIHNwZWNpZmllZCBPVVQgcGFyYW1ldGVyLiBBbGwgT1VUIHBhcmFtZXRlcnMgbXVzdAotICAgICAqIGhhdmUgdGhlaXIgVHlwZSBkZWZpbmVkIGJlZm9yZSBhIHN0b3JlZCBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQuIFRoaXMKLSAgICAgKiB2ZXJzaW9uIG9mIHRoZSByZWdpc3Rlck91dFBhcmFtZXRlciBtZXRob2QsIHdoaWNoIGhhcyBhIHNjYWxlIHBhcmFtZXRlciwKLSAgICAgKiBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIEpEQkMgdHlwZXMgTlVNRVJJQyBhbmQgREVDSU1BTCwgd2hlcmUgdGhlcmUgaXMgYQotICAgICAqIG5lZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBleHBlY3RlZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KKyAgICAgKiBEZWZpbmVzIHRoZSBUeXBlIG9mIGEgc3BlY2lmaWVkIHtAY29kZSBPVVR9IHBhcmFtZXRlci4gQWxsIHtAY29kZSBPVVR9CisgICAgICogcGFyYW1ldGVycyBtdXN0IGhhdmUgdGhlaXIgdHlwZSBkZWZpbmVkIGJlZm9yZSBhIHN0b3JlZCBwcm9jZWR1cmUgaXMKKyAgICAgKiBleGVjdXRlZC4gVGhpcyB2ZXJzaW9uIG9mIHRoZSB7QGNvZGUgcmVnaXN0ZXJPdXRQYXJhbWV0ZXJ9IG1ldGhvZCwgd2hpY2gKKyAgICAgKiBoYXMgYSBzY2FsZSBwYXJhbWV0ZXIsIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgSkRCQyB0eXBlcyB7QGNvZGUgTlVNRVJJQ30KKyAgICAgKiBhbmQge0Bjb2RlIERFQ0lNQUx9LCB3aGVyZSB0aGVyZSBpcyBhIG5lZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mCisgICAgICogZGlnaXRzIGV4cGVjdGVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICAqIDxwPgotICAgICAqIFRoZSBUeXBlIGRlZmluZWQgYnkgdGhpcyBtZXRob2QgZml4ZXMgdGhlIEphdmEgdHlwZSB0aGF0IG11c3QgYmUKLSAgICAgKiByZXRyaWV2ZWQgdXNpbmcgdGhlIGdldHRlciBtZXRob2RzIG9mIENhbGxhYmxlU3RhdGVtZW50LgorICAgICAqIFRoZSB0eXBlIHN1cHBsaWVkIGluIHRoZSB7QGNvZGUgc3FsVHlwZX0gcGFyYW1ldGVyIGZpeGVzIHRoZSAgCisgICAgICogdHlwZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlIGdldHRlciBtZXRob2RzIG9mIAorICAgICAqIHtAY29kZSBDYWxsYWJsZVN0YXRlbWVudH0uIAorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwogICAgICAqICAgICAgICAgICAgaW5kZXggMQogICAgICAqIEBwYXJhbSBzcWxUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgSkRCQyB0eXBlIGFzIGRlZmluZWQgYnkgamF2YS5zcWwuVHlwZXMuCisgICAgICogICAgICAgICAgICB0aGUgSkRCQyB0eXBlIGFzIGRlZmluZWQgYnkge0Bjb2RlIGphdmEuc3FsLlR5cGVzfS4KICAgICAgKiBAcGFyYW0gc2NhbGUKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiBNdXN0IGJlIGdyZWF0ZXIKICAgICAgKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgVHlwZXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck91dFBhcmFtZXRlcihpbnQgcGFyYW1ldGVySW5kZXgsIGludCBzcWxUeXBlLCBpbnQgc2NhbGUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgVHlwZSBvZiBhIHNwZWNpZmllZCBPVVQgcGFyYW1ldGVyLiBUaGlzIHZhcmlhbnQgb2YgdGhlIG1ldGhvZAotICAgICAqIGlzIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCBwYXJhbWV0ZXJzIHRoYXQgYXJlIFVzZXIgRGVmaW5lZCBUeXBlcyAoVURUKSBvcgotICAgICAqIGEgUkVGIHR5cGUsIGFsdGhvdWdoIGl0IGNhbiBiZSB1c2VkIGZvciBhbnkgdHlwZS4KKyAgICAgKiBEZWZpbmVzIHRoZSBUeXBlIG9mIGEgc3BlY2lmaWVkIHtAY29kZSBPVVR9IHBhcmFtZXRlci4gVGhpcyB2YXJpYW50IAorICAgICAqIG9mIHRoZSBtZXRob2QgaXMgZGVzaWduZWQgZm9yIHVzZSB3aXRoIHBhcmFtZXRlcnMgdGhhdCBhcmUgCisgICAgICogPGk+VXNlciBEZWZpbmVkIFR5cGVzPC9pPiAoVURUKSBvciBhIHtAY29kZSBSRUZ9IHR5cGUsIGFsdGhvdWdoIGl0IAorICAgICAqIGNhbiBiZSB1c2VkIGZvciBhbnkgdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1JbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSBzcWxUeXBlCi0gICAgICogICAgICAgICAgICBhIEpEQkMgdHlwZSBleHByZXNzZWQgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBUeXBlc30KKyAgICAgKiAgICAgICAgICAgIGEgSkRCQyB0eXBlIGV4cHJlc3NlZCBhcyBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFR5cGVzfS4KICAgICAgKiBAcGFyYW0gdHlwZU5hbWUKLSAgICAgKiAgICAgICAgICAgIGFuIFNRTCB0eXBlIG5hbWUuIEZvciBhIFJFRiB0eXBlLCB0aGlzIG5hbWUgc2hvdWxkIGJlIHRoZQotICAgICAqICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgdHlwZS4KKyAgICAgKiAgICAgICAgICAgIGFuIFNRTCB0eXBlIG5hbWUuIEZvciBhIHtAY29kZSBSRUZ9IHR5cGUsIHRoaXMgbmFtZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCB0eXBlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBSZWYKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck91dFBhcmFtZXRlcihpbnQgcGFyYW1JbmRleCwgaW50IHNxbFR5cGUsCiAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBUeXBlIG9mIGEgc3BlY2lmaWVkIE9VVCBwYXJhbWV0ZXIuIEFsbCBPVVQgcGFyYW1ldGVycyBtdXN0Ci0gICAgICogaGF2ZSB0aGVpciBUeXBlIGRlZmluZWQgYmVmb3JlIGEgc3RvcmVkIHByb2NlZHVyZSBpcyBleGVjdXRlZC4KKyAgICAgKiBEZWZpbmVzIHRoZSBUeXBlIG9mIGEgc3BlY2lmaWVkIHtAY29kZSBPVVR9IHBhcmFtZXRlci4gQWxsIE9VVCBwYXJhbWV0ZXJzCisgICAgICogbXVzdCBoYXZlIHRoZWlyIFR5cGUgZGVmaW5lZCBiZWZvcmUgYSBzdG9yZWQgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkLgogICAgICAqIDxwPgotICAgICAqIFRoZSBUeXBlIGRlZmluZWQgYnkgdGhpcyBtZXRob2QgZml4ZXMgdGhlIEphdmEgdHlwZSB0aGF0IG11c3QgYmUKLSAgICAgKiByZXRyaWV2ZWQgdXNpbmcgdGhlIGdldHRlciBtZXRob2RzIG9mIENhbGxhYmxlU3RhdGVtZW50LiBJZiBhIGRhdGFiYXNlCi0gICAgICogc3BlY2lmaWMgdHlwZSBpcyBleHBlY3RlZCBmb3IgYSBwYXJhbWV0ZXIsIHRoZSBUeXBlIGphdmEuc3FsLlR5cGVzLk9USEVSCi0gICAgICogc2hvdWxkIGJlIHVzZWQuIE5vdGUgdGhhdCB0aGVyZSBpcyBhbm90aGVyIHZhcmlhbnQgb2YgdGhpcyBtZXRob2QgZm9yCi0gICAgICogVXNlciBEZWZpbmVkIFR5cGVzIG9yIGEgUkVGIHR5cGUuCisgICAgICogVGhlIHR5cGUgc3VwcGxpZWQgaW4gdGhlIHtAY29kZSBzcWxUeXBlfSBwYXJhbWV0ZXIgZml4ZXMgdGhlICAKKyAgICAgKiB0eXBlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIG1ldGhvZHMgb2YgCisgICAgICoge0Bjb2RlIENhbGxhYmxlU3RhdGVtZW50fS4gCisgICAgICogSWYgYSBkYXRhYmFzZS1zcGVjaWZpYyB0eXBlIGlzIGV4cGVjdGVkIGZvciBhIHBhcmFtZXRlciwgdGhlIFR5cGUge0Bjb2RlCisgICAgICogamF2YS5zcWwuVHlwZXMuT1RIRVJ9IHNob3VsZCBiZSB1c2VkLiBOb3RlIHRoYXQgdGhlcmUgaXMgYW5vdGhlciB2YXJpYW50CisgICAgICogb2YgdGhpcyBtZXRob2QgZm9yIFVzZXIgRGVmaW5lZCBUeXBlcyBvciBhIHtAY29kZSBSRUZ9IHR5cGUuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgKiBAcGFyYW0gc3FsVHlwZQogICAgICAqICAgICAgICAgICAgYSBKREJDIHR5cGUgZXhwcmVzc2VkIGFzIGEgY29uc3RhbnQgZnJvbSB7QGxpbmsgVHlwZXN9LiBUeXBlcwotICAgICAqICAgICAgICAgICAgTlVNRVJJQyBhbmQgREVDSU1BTCBzaG91bGQgYmUgZGVmaW5lZCB1c2luZyB0aGUgdmFyaWFudCBvZgotICAgICAqICAgICAgICAgICAgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhIDxjb2RlPnNjYWxlPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogICAgICAgICAgICB7QGNvZGUgTlVNRVJJQ30gYW5kIHtAY29kZSBERUNJTUFMfSBzaG91bGQgYmUgZGVmaW5lZCB1c2luZworICAgICAqICAgICAgICAgICAgdGhlIHZhcmlhbnQgb2YgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhIHtAY29kZSBzY2FsZX0KKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBpbnQgc3FsVHlwZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBUeXBlIG9mIGEgc3BlY2lmaWVkIE9VVCBwYXJhbWV0ZXIuIEFsbCBPVVQgcGFyYW1ldGVycyBtdXN0Ci0gICAgICogaGF2ZSB0aGVpciBUeXBlIGRlZmluZWQgYmVmb3JlIGEgc3RvcmVkIHByb2NlZHVyZSBpcyBleGVjdXRlZC4gVGhpcwotICAgICAqIHZlcnNpb24gb2YgdGhlIHJlZ2lzdGVyT3V0UGFyYW1ldGVyIG1ldGhvZCwgd2hpY2ggaGFzIGEgc2NhbGUgcGFyYW1ldGVyLAotICAgICAqIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgSkRCQyB0eXBlcyBOVU1FUklDIGFuZCBERUNJTUFMLCB3aGVyZSB0aGVyZSBpcyBhCi0gICAgICogbmVlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgZGlnaXRzIGV4cGVjdGVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgorICAgICAqIERlZmluZXMgdGhlIFR5cGUgb2YgYSBzcGVjaWZpZWQge0Bjb2RlIE9VVH0gcGFyYW1ldGVyLiBBbGwge0Bjb2RlIE9VVH0KKyAgICAgKiBwYXJhbWV0ZXJzIG11c3QgaGF2ZSB0aGVpciBUeXBlIGRlZmluZWQgYmVmb3JlIGEgc3RvcmVkIHByb2NlZHVyZSBpcworICAgICAqIGV4ZWN1dGVkLiBUaGlzIHZlcnNpb24gb2YgdGhlIHtAY29kZSByZWdpc3Rlck91dFBhcmFtZXRlcn0gbWV0aG9kLCB3aGljaAorICAgICAqIGhhcyBhIHNjYWxlIHBhcmFtZXRlciwgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBKREJDIHR5cGVzIHtAY29kZSBOVU1FUklDfQorICAgICAqIGFuZCB7QGNvZGUgREVDSU1BTH0sIHdoZXJlIHRoZXJlIGlzIGEgbmVlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YKKyAgICAgKiBkaWdpdHMgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICogPHA+Ci0gICAgICogVGhlIFR5cGUgZGVmaW5lZCBieSB0aGlzIG1ldGhvZCBmaXhlcyB0aGUgSmF2YSB0eXBlIHRoYXQgbXVzdCBiZQotICAgICAqIHJldHJpZXZlZCB1c2luZyB0aGUgZ2V0dGVyIG1ldGhvZHMgb2YgQ2FsbGFibGVTdGF0ZW1lbnQuCisgICAgICogVGhlIHR5cGUgc3VwcGxpZWQgaW4gdGhlIHtAY29kZSBzcWxUeXBlfSBwYXJhbWV0ZXIgZml4ZXMgdGhlICAKKyAgICAgKiB0eXBlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIG1ldGhvZHMgb2YgCisgICAgICoge0Bjb2RlIENhbGxhYmxlU3RhdGVtZW50fS4gCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgKiBAcGFyYW0gc3FsVHlwZQotICAgICAqICAgICAgICAgICAgYSBKREJDIHR5cGUgZXhwcmVzc2VkIGFzIGEgY29uc3RhbnQgZnJvbSB7QGxpbmsgVHlwZXN9CisgICAgICogICAgICAgICAgICBhIEpEQkMgdHlwZSBleHByZXNzZWQgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBUeXBlc30uCiAgICAgICogQHBhcmFtIHNjYWxlCiAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gTXVzdCBiZSBncmVhdGVyCiAgICAgICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDAuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck91dFBhcmFtZXRlcihTdHJpbmcgcGFyYW1ldGVyTmFtZSwgaW50IHNxbFR5cGUsCiAgICAgICAgICAgICBpbnQgc2NhbGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBUeXBlIG9mIGEgc3BlY2lmaWVkIE9VVCBwYXJhbWV0ZXIuIFRoaXMgdmFyaWFudCBvZiB0aGUgbWV0aG9kCi0gICAgICogaXMgZGVzaWduZWQgZm9yIHVzZSB3aXRoIHBhcmFtZXRlcnMgdGhhdCBhcmUgVXNlciBEZWZpbmVkIFR5cGVzIChVRFQpIG9yCi0gICAgICogYSBSRUYgdHlwZSwgYWx0aG91Z2ggaXQgY2FuIGJlIHVzZWQgZm9yIGFueSB0eXBlLlJlZ2lzdGVycyB0aGUgZGVzaWduYXRlZAotICAgICAqIG91dHB1dCBwYXJhbWV0ZXIuCisgICAgICogRGVmaW5lcyB0aGUgVHlwZSBvZiBhIHNwZWNpZmllZCB7QGNvZGUgT1VUfSBwYXJhbWV0ZXIuIFRoaXMgdmFyaWFudCBvZgorICAgICAqIHRoZSBtZXRob2QgaXMgZGVzaWduZWQgZm9yIHVzZSB3aXRoIHBhcmFtZXRlcnMgdGhhdCBhcmUgPGk+VXNlciBEZWZpbmVkCisgICAgICogVHlwZXM8L2k+IChVRFQpIG9yIGEge0Bjb2RlIFJFRn0gdHlwZSwgYWx0aG91Z2ggaXQgY2FuIGJlIHVzZWQgZm9yIGFueQorICAgICAqIHR5cGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQogICAgICAqIEBwYXJhbSBzcWxUeXBlCiAgICAgICogICAgICAgICAgICBhIEpEQkMgdHlwZSBleHByZXNzZWQgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBUeXBlc30KICAgICAgKiBAcGFyYW0gdHlwZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBTUUwgc3RydWN0dXJlZCB0eXBlLiBGb3IgYSBSRUYKLSAgICAgKiAgICAgICAgICAgIHR5cGUsIHRoaXMgbmFtZSBzaG91bGQgYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotICAgICAqICAgICAgICAgICAgcmVmZXJlbmNlZCB0eXBlLgorICAgICAqICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIFNRTCBzdHJ1Y3R1cmVkIHR5cGUuIEZvciBhCisgICAgICogICAgICAgICAgICB7QGNvZGUgUkVGfSB0eXBlLCB0aGlzIG5hbWUgc2hvdWxkIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQorICAgICAqICAgICAgICAgICAgb2YgdGhlIHJlZmVyZW5jZWQgdHlwZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBpbnQgc3FsVHlwZSwKICAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0aGUgY29udGVudCBvZiBhIHN1cHBsaWVkCi0gICAgICogSW5wdXRTdHJlYW0sIHdoaWNoIGhhcyBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCisgICAgICoge0Bjb2RlIElucHV0U3RyZWFtfSwgd2hpY2ggaGFzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgZ29vZCBtZXRob2QgZm9yIHNldHRpbmcgYW4gU1FMIExPTlZBUkNIQVIgcGFyYW1ldGVyIHdoZXJlIHRoZQotICAgICAqIGxlbmd0aCBvZiB0aGUgZGF0YSBpcyBsYXJnZS4gRGF0YSBpcyByZWFkIGZyb20gdGhlIElucHV0U3RyZWFtIHVudGlsCi0gICAgICogZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCBvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBpcyBjb3BpZWQuCisgICAgICogVGhpcyBpcyBhIGdvb2QgbWV0aG9kIGZvciBzZXR0aW5nIGFuIFNRTCB7QGNvZGUgTE9OVkFSQ0hBUn0gcGFyYW1ldGVyCisgICAgICogd2hlcmUgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpcyBsYXJnZS4gRGF0YSBpcyByZWFkIGZyb20gdGhlIHtAY29kZQorICAgICAqIElucHV0U3RyZWFtfSB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkIG9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICogYnl0ZXMgaXMgY29waWVkLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCiAgICAgICogQHBhcmFtIHRoZUlucHV0U3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgQVNDSUkgSW5wdXRTdHJlYW0gY2FycnlpbmcgdGhlIGRhdGEgdG8gdXBkYXRlIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHdpdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBBU0NJSSBpbnB1dCBzdHJlYW0gY2FycnlpbmcgdGhlIGRhdGEgdG8gdXBkYXRlIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHdpdGguCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgSW5wdXRTdHJlYW0gdG8gY29weSB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUge0Bjb2RlIElucHV0U3RyZWFtfSB0byBjb3B5IHRvIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oU3RyaW5nIHBhcmFtZXRlck5hbWUsCiAgICAgICAgICAgICBJbnB1dFN0cmVhbSB0aGVJbnB1dFN0cmVhbSwgaW50IGxlbmd0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkCi0gICAgICogamF2YS5tYXRoLkJpZ0RlY2ltYWwgdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlCisgICAgICogamF2YS5tYXRoLkJpZ0RlY2ltYWx9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSB0aGVCaWdEZWNpbWFsCi0gICAgICogICAgICAgICAgICB0aGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgdmFsdWUgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGphdmEubWF0aC5CaWdJbnRlZ2VyfSB2YWx1ZSB0byBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBCaWdEZWNpbWFsIHRoZUJpZ0RlY2ltYWwpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIHRoZSBjb250ZW50IG9mIGEgc3VwcGxpZWQKLSAgICAgKiBiaW5hcnkgSW5wdXRTdHJlYW0sIHdoaWNoIGhhcyBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCisgICAgICogYmluYXJ5IHtAY29kZSBJbnB1dFN0cmVhbX0sIHdoaWNoIGhhcyBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCiAgICAgICogPHA+CiAgICAgICogVXNlIHRoaXMgbWV0aG9kIHdoZW4gYSBsYXJnZSBhbW91bnQgb2YgZGF0YSBuZWVkcyB0byBiZSBzZXQgaW50byBhCi0gICAgICogTE9OR1ZBUkJJTkFSWSBwYXJhbWV0ZXIuCisgICAgICoge0Bjb2RlIExPTkdWQVJCSU5BUll9IHBhcmFtZXRlci4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICogQHBhcmFtIHRoZUlucHV0U3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgYmluYXJ5IElucHV0U3RyZWFtIGNhcnJ5aW5nIHRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIGJpbmFyeSB7QGNvZGUgSW5wdXRTdHJlYW19IGNhcnJ5aW5nIHRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBJbnB1dFN0cmVhbSB0byBjb3B5IHRvIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIGNvcHkgdG8gdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCaW5hcnlTdHJlYW0oU3RyaW5nIHBhcmFtZXRlck5hbWUsCiAgICAgICAgICAgICBJbnB1dFN0cmVhbSB0aGVJbnB1dFN0cmVhbSwgaW50IGxlbmd0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIGJvb2xlYW4gdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlIGJvb2xlYW59CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVCb29sZWFuCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oU3RyaW5nIHBhcmFtZXRlck5hbWUsIGJvb2xlYW4gdGhlQm9vbGVhbikKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBieXRlIHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZSBieXRlfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICogQHBhcmFtIHRoZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Qnl0ZShTdHJpbmcgcGFyYW1ldGVyTmFtZSwgYnl0ZSB0aGVCeXRlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgYXJyYXkgb2YgYnl0ZXMuIFRoZQotICAgICAqIGFycmF5IGlzIG1hcHBlZCB0byA8Y29kZT5WQVJCSU5BUlk8L2NvZGU+IG9yIGVsc2UKLSAgICAgKiA8Y29kZT5MT05HVkFSQklOQVJZPC9jb2RlPiBpbiB0aGUgY29ubmVjdGVkIGRhdGFiYXNlLgorICAgICAqIGFycmF5IGlzIG1hcHBlZCB0byB7QGNvZGUgVkFSQklOQVJZfSBvciBlbHNlIHtAY29kZSBMT05HVkFSQklOQVJZfSBpbiB0aGUKKyAgICAgKiBjb25uZWN0ZWQgZGF0YWJhc2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVCeXRlcwotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCeXRlcyhTdHJpbmcgcGFyYW1ldGVyTmFtZSwgYnl0ZVtdIHRoZUJ5dGVzKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0aGUgY2hhcmFjdGVyIGNvbnRlbnQgb2YgYQotICAgICAqIFJlYWRlciBvYmplY3QsIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGggb2YgY2hhcmFjdGVyIGRhdGEuCisgICAgICoge0Bjb2RlIFJlYWRlcn0gb2JqZWN0LCB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIG9mIGNoYXJhY3RlciBkYXRhLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICBhIGNvdW50IG9mIHRoZSBjaGFyYWN0ZXJzIGNvbnRhaW5lZCBpbiA8Y29kZT5yZWFkZXI8L2NvZGU+CisgICAgICogICAgICAgICAgICBhIGNvdW50IG9mIHRoZSBjaGFyYWN0ZXJzIGNvbnRhaW5lZCBpbiB7QGNvZGUgcmVhZGVyfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlclN0cmVhbShTdHJpbmcgcGFyYW1ldGVyTmFtZSwgUmVhZGVyIHJlYWRlciwKICAgICAgICAgICAgIGludCBsZW5ndGgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBqYXZhLnNxbC5EYXRlCi0gICAgICogdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlCisgICAgICogamF2YS5zcWwuRGF0ZX0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVEYXRlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGUoU3RyaW5nIHBhcmFtZXRlck5hbWUsIERhdGUgdGhlRGF0ZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIGphdmEuc3FsLkRhdGUKLSAgICAgKiB2YWx1ZSwgdXNpbmcgYSBzdXBwbGllZCBDYWxlbmRhciB0byBtYXAgdGhlIERhdGUuIFRoZSBDYWxlbmRhciBhbGxvd3MgdGhlCi0gICAgICogYXBwbGljYXRpb24gdG8gY29udHJvbCB0aGUgdGltZXpvbmUgdXNlZCB0byBjb21wdXRlIHRoZSBTUUwgREFURSBpbiB0aGUKLSAgICAgKiBkYXRhYmFzZSAtIHdpdGhvdXQgdGhlIHN1cHBsaWVkIENhbGVuZGFyLCB0aGUgZHJpdmVyIHVzZXMgdGhlIGRlZmF1bHQKLSAgICAgKiB0aW1lem9uZSBvZiB0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlCisgICAgICogamF2YS5zcWwuRGF0ZX0gdmFsdWUsIHVzaW5nIGEgc3VwcGxpZWQgY2FsZW5kYXIgdG8gbWFwIHRoZSBkYXRlLiBUaGUKKyAgICAgKiBjYWxlbmRhciBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGNvbnRyb2wgdGhlIHRpbWV6b25lIHVzZWQgdG8gY29tcHV0ZQorICAgICAqIHRoZSBTUUwge0Bjb2RlIERBVEV9IGluIHRoZSBkYXRhYmFzZS4gSW4gY2FzZSB0aGF0IG5vIGNhbGVuZGFyIGlzCisgICAgICogc3VwcGxpZWQsIHRoZSBkcml2ZXIgdXNlcyB0aGUgZGVmYXVsdCB0aW1lem9uZSBvZiB0aGUgSmF2YSB2aXJ0dWFsCisgICAgICogbWFjaGluZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICogQHBhcmFtIHRoZURhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEgQ2FsZW5kYXIgdG8gdXNlIHRvIGNvbnN0cnVjdCB0aGUgU1FMIERBVEUgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIENhbGVuZGFyfSB0byB1c2UgdG8gY29uc3RydWN0IHRoZSBTUUwge0Bjb2RlIERBVEV9CisgICAgICogICAgICAgICAgICB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgamF2YS51dGlsLkNhbGVuZGFyCisgICAgICogQHNlZSBEYXRlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0ZShTdHJpbmcgcGFyYW1ldGVyTmFtZSwgRGF0ZSB0aGVEYXRlLCBDYWxlbmRhciBjYWwpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgZG91YmxlIHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZSBkb3VibGV9CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVEb3VibGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBkb3VibGUgdGhlRG91YmxlKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0byBhIHN1cHBsaWVkIGZsb2F0IHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0byBhIHN1cHBsaWVkIHtAY29kZSBmbG9hdH0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICogQHBhcmFtIHRoZUZsb2F0Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0KFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBmbG9hdCB0aGVGbG9hdCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBpbnQgdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlIGludH0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVJbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW50KFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBpbnQgdGhlSW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgbG9uZyB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUgbG9uZ30gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVMb25nCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqICAgICAgICAgICAgIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvbmcoU3RyaW5nIHBhcmFtZXRlck5hbWUsIGxvbmcgdGhlTG9uZykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBTUUwgTlVMTC4gRG9uJ3QgdXNlIHRoaXMKLSAgICAgKiB2ZXJzaW9uIG9mIHNldE51bGwgZm9yIFVzZXIgRGVmaW5lZCBUeXBlcyBvciBmb3IgUkVGIHR5cGUgcGFyYW1ldGVycy4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gU1FMIHtAY29kZSBOVUxMfS4gRG9uJ3QgdXNlCisgICAgICogdGhpcyB2ZXJzaW9uIG9mIHtAY29kZSBzZXROdWxsfSBmb3IgPGk+VXNlciBEZWZpbmVkIFR5cGVzPC9pPiAoVURUKSBvcgorICAgICAqIGZvciB7QGNvZGUgUkVGfSB0eXBlIHBhcmFtZXRlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSBzcWxUeXBlCi0gICAgICogICAgICAgICAgICBhIEpEQkMgdHlwZSBleHByZXNzZWQgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBUeXBlc30KKyAgICAgKiAgICAgICAgICAgIGEgSkRCQyB0eXBlIGV4cHJlc3NlZCBhcyBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFR5cGVzfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE51bGwoU3RyaW5nIHBhcmFtZXRlck5hbWUsIGludCBzcWxUeXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGJlIFNRTCBOVUxMIHdoZXJlIHRoZQotICAgICAqIHBhcmFtZXRlciB0eXBlIGlzIGVpdGhlciA8Y29kZT5SRUY8L2NvZGU+IG9yIHVzZXIgZGVmaW5lZCAoZS5nLgotICAgICAqIDxjb2RlPlNUUlVDVDwvY29kZT4sIDxjb2RlPkpBVkFfT0JKRUNUPC9jb2RlPiBldGMpLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBiZSBTUUwge0Bjb2RlIE5VTEx9IHdoZXJlIHRoZQorICAgICAqIHBhcmFtZXRlciB0eXBlIGlzIGVpdGhlciB7QGNvZGUgUkVGfSBvciB1c2VyIGRlZmluZWQgKGUuZy4ge0Bjb2RlIFNUUlVDVH0KKyAgICAgKiAsIHtAY29kZSBKQVZBX09CSkVDVH0gZXRjKS4KICAgICAgKiA8cD4KICAgICAgKiBGb3IgcmVhc29ucyBvZiBwb3J0YWJpbGl0eSwgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBzdXBwbHkgYm90aCB0aGUgU1FMCi0gICAgICogVHlwZSBjb2RlIGFuZCBUeXBlIG5hbWUgKHdoaWNoIGlzIGp1c3QgdGhlIHBhcmFtZXRlciBuYW1lIGlmIHRoZSB0eXBlIGlzCi0gICAgICogdXNlciBkZWZpbmVkLCBvciB0aGUgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyByZWZlcmVuY2VkIGlmIGEgUkVGKS4KKyAgICAgKiB0eXBlIGNvZGUgYW5kIHR5cGUgbmFtZSAod2hpY2ggaXMganVzdCB0aGUgcGFyYW1ldGVyIG5hbWUgaWYgdGhlIHR5cGUgaXMKKyAgICAgKiB1c2VyIGRlZmluZWQsIHJlZmVycmVkIHRvIGFzIGEge0Bjb2RlIFVEVH0sIG9yIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkCisgICAgICogdHlwZSBpbiBjYXNlIG9mIGEge0Bjb2RlIFJFRn0gdHlwZSkuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgKiBAcGFyYW0gc3FsVHlwZQotICAgICAqICAgICAgICAgICAgYSBKREJDIHR5cGUgZXhwcmVzc2VkIGFzIGEgY29uc3RhbnQgZnJvbSB7QGxpbmsgVHlwZXN9CisgICAgICogICAgICAgICAgICBhIEpEQkMgdHlwZSBleHByZXNzZWQgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBUeXBlc30uCiAgICAgICogQHBhcmFtIHR5cGVOYW1lCiAgICAgICogICAgICAgICAgICBpZiB0aGUgdGFyZ2V0IHBhcmFtZXRlciBpcyBhIHVzZXIgZGVmaW5lZCB0eXBlIHRoZW4gdGhpcwotICAgICAqICAgICAgICAgICAgc2hvdWxkIGNvbnRhaW4gdGhlIGZ1bGwgdHlwZSBuYW1lCi0gICAgICogCi0gICAgICogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgVURUIG9yIFJFRiB0eXBlIC0gaWdub3JlZCBpZiB0aGUgcGFyYW1ldGVyCi0gICAgICogaXMgbm90IGEgVURULgorICAgICAqICAgICAgICAgICAgc2hvdWxkIGNvbnRhaW4gdGhlIGZ1bGwgdHlwZSBuYW1lLiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIFVEVH0gb3Ige0Bjb2RlIFJFRn0gdHlwZSBpcyBpZ25vcmVkIGlmIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIGlzIG5vdCBhIHtAY29kZSBVRFR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUeXBlcworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE51bGwoU3RyaW5nIHBhcmFtZXRlck5hbWUsIGludCBzcWxUeXBlLCBTdHJpbmcgdHlwZU5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHVzaW5nIGEgc3VwcGxpZWQgb2JqZWN0LiBQcmlvciB0bwotICAgICAqIGlzc3VpbmcgdGhpcyByZXF1ZXN0IHRvIHRoZSBjb25uZWN0ZWQgZGF0YWJhc2UgPGNvZGU+dGhlT2JqZWN0PC9jb2RlPgotICAgICAqIGlzIHRyYW5zZm9ybWVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIFNRTCB0eXBlIGFjY29yZGluZyB0byB0aGUgbm9ybWFsIEphdmEKKyAgICAgKiBpc3N1aW5nIHRoaXMgcmVxdWVzdCB0byB0aGUgY29ubmVjdGVkIGRhdGFiYXNlIHtAY29kZSB0aGVPYmplY3R9IGlzCisgICAgICogdHJhbnNmb3JtZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgU1FMIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCBKYXZhCiAgICAgICogdG8gU1FMIG1hcHBpbmcgcnVsZXMuCiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIG9iamVjdCdzIGNsYXNzIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBTUUxEYXRhLCB0aGUgSkRCQyBkcml2ZXIKLSAgICAgKiBjYWxscyA8Y29kZT5TUUxEYXRhLndyaXRlU1FMPC9jb2RlPiB0byB3cml0ZSBpdCB0byB0aGUgU1FMIGRhdGEgc3RyZWFtLgotICAgICAqIElmIDxjb2RlPnRoZU9iamVjdDwvY29kZT4gaW1wbGVtZW50cyBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VzCi0gICAgICogdGhlbiBpdCBpcyB0aGUgcm9sZSBvZiB0aGUgZHJpdmVyIHRvIGZsb3cgdGhlIHZhbHVlIHRvIHRoZSBjb25uZWN0ZWQKLSAgICAgKiBkYXRhYmFzZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgU1FMIHR5cGUgOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rIFJlZn0KLSAgICAgKiA8bGk+e0BsaW5rIFN0cnVjdH0KLSAgICAgKiA8bGk+e0BsaW5rIEFycmF5fQotICAgICAqIDxsaT57QGxpbmsgQ2xvYn0KLSAgICAgKiA8bGk+e0BsaW5rIEJsb2J9Ci0gICAgICogPC91bD4KKyAgICAgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIHtAY29kZSBTUUxEYXRhfSwgdGhlIEpEQkMKKyAgICAgKiBkcml2ZXIgY2FsbHMge0Bjb2RlIFNRTERhdGEud3JpdGVTUUx9IHRvIHdyaXRlIGl0IHRvIHRoZSBTUUwgZGF0YSBzdHJlYW0uCisgICAgICogSWYge0Bjb2RlIHRoZU9iamVjdH0gaW1wbGVtZW50cyBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VzIHRoZW4gdGhlCisgICAgICogZHJpdmVyIGlzIGluIGNoYXJnZSBvZiBtYXBwaW5nIHRoZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgU1FMIHR5cGUuIAorICAgICAqIDx1bD48bGk+e0BsaW5rIFJlZn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgU3RydWN0fTwvbGk+CisgICAgICogPGxpPntAbGluayBBcnJheX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2xvYn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQmxvYn08L2xpPiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCiAgICAgICogQHBhcmFtIHRoZU9iamVjdAogICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIFNRTERhdGEKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoU3RyaW5nIHBhcmFtZXRlck5hbWUsIE9iamVjdCB0aGVPYmplY3QpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtMTEyNSwyOSArMTI4MCwzMyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB1c2luZyBhIHN1cHBsaWVkIG9iamVjdC4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgT2JqZWN0IGlzIGNvbnZlcnRlZCB0byB0aGUgZ2l2ZW4gdGFyZ2V0U3FsVHlwZSBiZWZvcmUgaXQgaXMgc2VudCB0bwotICAgICAqIHRoZSBkYXRhYmFzZS4gSWYgdGhlIG9iamVjdCBoYXMgYSBjdXN0b20gbWFwcGluZyAoaXRzIGNsYXNzIGltcGxlbWVudHMKLSAgICAgKiB0aGUgaW50ZXJmYWNlIFNRTERhdGEpLCB0aGUgSkRCQyBkcml2ZXIgd2lsbCBjYWxsIHRoZSBtZXRob2QKLSAgICAgKiBTUUxEYXRhLndyaXRlU1FMIHRvIHdyaXRlIGl0IHRvIHRoZSBTUUwgZGF0YSBzdHJlYW0uIElmCi0gICAgICogPGNvZGU+dGhlT2JqZWN0PC9jb2RlPiBpbXBsZW1lbnRzIGFueSBvZiB0aGUgZm9sbG93aW5nIGludGVyZmFjZXMgdGhlbgotICAgICAqIGl0IGlzIHRoZSByb2xlIG9mIHRoZSBkcml2ZXIgdG8gZmxvdyB0aGUgdmFsdWUgdG8gdGhlIGNvbm5lY3RlZCBkYXRhYmFzZQotICAgICAqIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBTUUwgdHlwZSA6CisgICAgICogVGhlIHBhcmFtZXRlciB7QGNvZGUgdGhlT2JqZWN0fSBpcyBjb252ZXJ0ZWQgdG8gdGhlIGdpdmVuIHtAY29kZQorICAgICAqIHRhcmdldFNxbFR5cGV9IGJlZm9yZSBpdCBpcyBzZW50IHRvIHRoZSBkYXRhYmFzZS4gSWYgdGhlIG9iamVjdCBoYXMgYQorICAgICAqIGN1c3RvbSBtYXBwaW5nIChpdHMgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIHtAY29kZSBTUUxEYXRhfSksIHRoZQorICAgICAqIEpEQkMgZHJpdmVyIGNhbGxzIHRoZSBtZXRob2Qge0Bjb2RlIFNRTERhdGEud3JpdGVTUUx9IHRvIHdyaXRlIGl0IHRvIHRoZQorICAgICAqIFNRTCBkYXRhIHN0cmVhbS4gSWYge0Bjb2RlIHRoZU9iamVjdH0gaXMgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSAKKyAgICAgKiBmb2xsb3dpbmcgdHlwZXMgICAgIAogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rIFJlZn0KLSAgICAgKiA8bGk+e0BsaW5rIFN0cnVjdH0KLSAgICAgKiA8bGk+e0BsaW5rIEFycmF5fQotICAgICAqIDxsaT57QGxpbmsgQ2xvYn0KLSAgICAgKiA8bGk+e0BsaW5rIEJsb2J9CisgICAgICogPGxpPntAbGluayBSZWZ9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFN0cnVjdH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQXJyYXl9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENsb2J9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEJsb2J9PC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIHRoZW4gdGhlIGRyaXZlciBpcyBpbiBjaGFyZ2Ugb2YgbWFwcGluZyB0aGUgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIAorICAgICAqIFNRTCB0eXBlIGFuZCBkZWxpdmVyIGl0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVPYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSB0YXJnZXRTcWxUeXBlCi0gICAgICogICAgICAgICAgICBhIEpEQkMgdHlwZSBleHByZXNzZWQgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBUeXBlc30KKyAgICAgKiAgICAgICAgICAgIGEgSkRCQyB0eXBlIGV4cHJlc3NlZCBhcyBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFR5cGVzfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgU1FMRGF0YQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgT2JqZWN0IHRoZU9iamVjdCwKICAgICAgICAgICAgIGludCB0YXJnZXRTcWxUeXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtMTE1NSwxNDggKzEzMTQsMTcwIEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHVzaW5nIGEgc3VwcGxpZWQgb2JqZWN0LgogICAgICAqIDxwPgotICAgICAqIFRoZSBPYmplY3QgaXMgY29udmVydGVkIHRvIHRoZSBnaXZlbiB0YXJnZXRTcWxUeXBlIGJlZm9yZSBpdCBpcyBzZW50IHRvCi0gICAgICogdGhlIGRhdGFiYXNlLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGN1c3RvbSBtYXBwaW5nIChpdHMgY2xhc3MgaW1wbGVtZW50cwotICAgICAqIHRoZSBpbnRlcmZhY2UgU1FMRGF0YSksIHRoZSBKREJDIGRyaXZlciB3aWxsIGNhbGwgdGhlIG1ldGhvZAotICAgICAqIFNRTERhdGEud3JpdGVTUUwgdG8gd3JpdGUgaXQgdG8gdGhlIFNRTCBkYXRhIHN0cmVhbS4gSWYKLSAgICAgKiA8Y29kZT50aGVPYmplY3Q8L2NvZGU+IGltcGxlbWVudHMgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlcyB0aGVuCi0gICAgICogaXQgaXMgdGhlIHJvbGUgb2YgdGhlIGRyaXZlciB0byBmbG93IHRoZSB2YWx1ZSB0byB0aGUgY29ubmVjdGVkIGRhdGFiYXNlCi0gICAgICogdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFNRTCB0eXBlIDoKKyAgICAgKiBUaGUgb2JqZWN0IGlzIGNvbnZlcnRlZCB0byB0aGUgZ2l2ZW4ge0Bjb2RlIHRhcmdldFNxbFR5cGV9IGJlZm9yZSBpdCBpcworICAgICAqIHNlbnQgdG8gdGhlIGRhdGFiYXNlLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGN1c3RvbSBtYXBwaW5nIChpdHMgY2xhc3MKKyAgICAgKiBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2Uge0Bjb2RlIFNRTERhdGF9KSwgdGhlIEpEQkMgZHJpdmVyIGNhbGxzIHRoZQorICAgICAqIG1ldGhvZCB7QGNvZGUgU1FMRGF0YS53cml0ZVNRTH0gdG8gd3JpdGUgaXQgdG8gdGhlIFNRTCBkYXRhIHN0cmVhbS4gSWYKKyAgICAgKiB7QGNvZGUgdGhlT2JqZWN0fSBpbXBsZW1lbnRzIGFueSBvZiB0aGUgZm9sbG93aW5nIGludGVyZmFjZXMKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayBSZWZ9Ci0gICAgICogPGxpPntAbGluayBTdHJ1Y3R9Ci0gICAgICogPGxpPntAbGluayBBcnJheX0KLSAgICAgKiA8bGk+e0BsaW5rIENsb2J9Ci0gICAgICogPGxpPntAbGluayBCbG9ifQorICAgICAqIDxsaT57QGxpbmsgUmVmfTwvbGk+CisgICAgICogPGxpPntAbGluayBTdHJ1Y3R9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFycmF5fTwvbGk+CisgICAgICogPGxpPntAbGluayBDbG9ifTwvbGk+CisgICAgICogPGxpPntAbGluayBCbG9ifTwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiB0aGVuIHRoZSBkcml2ZXIgaXMgY2hhcmdlIG9mIG1hcHBpbmcgdGhlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSAKKyAgICAgKiBTUUwgdHlwZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVPYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSB0YXJnZXRTcWxUeXBlCi0gICAgICogICAgICAgICAgICBhIEpEQkMgdHlwZSBleHByZXNzZWQgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBUeXBlc30KKyAgICAgKiAgICAgICAgICAgIGEgSkRCQyB0eXBlIGV4cHJlc3NlZCBhcyBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFR5cGVzfS4KICAgICAgKiBAcGFyYW0gc2NhbGUKLSAgICAgKiAgICAgICAgICAgIHdoZXJlIGFwcGxpY2FibGUsIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsCisgICAgICogICAgICAgICAgICB3aGVyZSBhcHBsaWNhYmxlLCB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4KICAgICAgKiAgICAgICAgICAgIHBvaW50LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBTUUxEYXRhCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBPYmplY3QgdGhlT2JqZWN0LAogICAgICAgICAgICAgaW50IHRhcmdldFNxbFR5cGUsIGludCBzY2FsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHNob3J0IHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZSBzaG9ydH0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gdGhlU2hvcnQKLSAgICAgKiAgICAgICAgICAgIGEgc2hvcnQgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIGEgc2hvcnQgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgc2hvcnQgdGhlU2hvcnQpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgU3RyaW5nLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZSBTdHJpbmd9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSB0aGVTdHJpbmcKLSAgICAgKiAgICAgICAgICAgIGEgU3RyaW5nIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBTdHJpbmd9IHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBTdHJpbmcgdGhlU3RyaW5nKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZWQgPGNvZGU+cGFyYW1ldGVyTmFtZTwvY29kZT4gdG8gdGhlCi0gICAgICogdmFsdWUgb2YgdGhlIHN1cHBsaWVkIDxjb2RlPmphdmEuc3FsLlRpbWU8L2NvZGU+LgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZWQge0Bjb2RlIHBhcmFtZXRlck5hbWV9IHRvIHRoZSB2YWx1ZQorICAgICAqIG9mIHRoZSBzdXBwbGllZCB7QGNvZGUgamF2YS5zcWwuVGltZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgVGltZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoU3RyaW5nIHBhcmFtZXRlck5hbWUsIFRpbWUgdGhlVGltZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZWQgPGNvZGU+cGFyYW1ldGVyTmFtZTwvY29kZT4gdG8gdGhlCi0gICAgICogdmFsdWUgb2YgdGhlIHN1cHBsaWVkIDxjb2RlPmphdmEuc3FsLlRpbWU8L2NvZGU+IHVzaW5nIHRoZSBzdXBwbGllZAotICAgICAqIENhbGVuZGFyLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZWQge0Bjb2RlIHBhcmFtZXRlck5hbWV9IHRvIHRoZSB2YWx1ZQorICAgICAqIG9mIHRoZSBzdXBwbGllZCB7QGNvZGUgamF2YS5zcWwuVGltZX0gdXNpbmcgdGhlIHN1cHBsaWVkIGNhbGVuZGFyLgogICAgICAqIDxwPgotICAgICAqIFRoZSBkcml2ZXIgdXNlcyB0aGUgc3VwcGxpZWQgQ2FsZW5kYXIgdG8gY3JlYXRlIHRoZSBTUUwgVElNRSB2YWx1ZSwgd2hpY2gKLSAgICAgKiBhbGxvd3MgaXQgdG8gdXNlIGEgY3VzdG9tIHRpbWV6b25lIC0gb3RoZXJ3aXNlIHRoZSBkcml2ZXIgdXNlcyB0aGUKLSAgICAgKiBkZWZhdWx0IHRpbWV6b25lIG9mIHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZS4KKyAgICAgKiBUaGUgZHJpdmVyIHVzZXMgdGhlIHN1cHBsaWVkIHtAY29kZSBDYWxlbmRhcn0gdG8gY3JlYXRlIHRoZSBTUUwgCisgICAgICoge0Bjb2RlIFRJTUV9IHZhbHVlLCB3aGljaCBhbGxvd3MgaXQgdG8gdXNlIGEgY3VzdG9tIHRpbWV6b25lIC0gCisgICAgICogb3RoZXJ3aXNlIHRoZSBkcml2ZXIgdXNlcyB0aGUgZGVmYXVsdCB0aW1lem9uZSBvZiB0aGUgSmF2YSAKKyAgICAgKiB2aXJ0dWFsIG1hY2hpbmUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICB1c2VkIGZvciBjcmVhdGluZyB0aGUgbmV3IFNRTCA8Y29kZT5USU1FPC9jb2RlPiB2YWx1ZQorICAgICAqICAgICAgICAgICAgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIG5ldyBTUUwge0Bjb2RlIFRJTUV9IHZhbHVlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUaW1lCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZShTdHJpbmcgcGFyYW1ldGVyTmFtZSwgVGltZSB0aGVUaW1lLCBDYWxlbmRhciBjYWwpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICogdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlCisgICAgICogamF2YS5zcWwuVGltZXN0YW1wfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICogQHBhcmFtIHRoZVRpbWVzdGFtcAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIFRpbWVzdGFtcAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgVGltZXN0YW1wIHRoZVRpbWVzdGFtcCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgKiB2YWx1ZSwgdXNpbmcgdGhlIHN1cHBsaWVkIENhbGVuZGFyLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWVzdGFtcH0gdmFsdWUsIHVzaW5nIHRoZSBzdXBwbGllZCBjYWxlbmRhci4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZHJpdmVyIHVzZXMgdGhlIHN1cHBsaWVkIENhbGVuZGFyIHRvIGNyZWF0ZSB0aGUgU1FMIFRJTUVTVEFNUCB2YWx1ZSwKLSAgICAgKiB3aGljaCBhbGxvd3MgaXQgdG8gdXNlIGEgY3VzdG9tIHRpbWV6b25lIC0gb3RoZXJ3aXNlIHRoZSBkcml2ZXIgdXNlcyB0aGUKLSAgICAgKiBkZWZhdWx0IHRpbWV6b25lIG9mIHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZS4KKyAgICAgKiBUaGUgZHJpdmVyIHVzZXMgdGhlIHN1cHBsaWVkIGNhbGVuZGFyIHRvIGNyZWF0ZSB0aGUgU1FMIHtAY29kZSBUSU1FU1RBTVB9CisgICAgICogdmFsdWUsIHdoaWNoIGFsbG93cyBpdCB0byB1c2UgYSBjdXN0b20gdGltZXpvbmUgLSBvdGhlcndpc2UgdGhlIGRyaXZlcgorICAgICAqIHVzZXMgdGhlIGRlZmF1bHQgdGltZXpvbmUgb2YgdGhlIEphdmEgdmlydHVhbCBtYWNoaW5lLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICogQHBhcmFtIHRoZVRpbWVzdGFtcAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIuCiAgICAgICogQHBhcmFtIGNhbAotICAgICAqICAgICAgICAgICAgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIG5ldyBTUUwgPGNvZGU+VElNRTwvY29kZT4gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBuZXcgU1FMIHtAY29kZSBUSU1FfSB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgVGltZXN0YW1wCisgICAgICogQHNlZSBqYXZhLnV0aWwuQ2FsZW5kYXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoU3RyaW5nIHBhcmFtZXRlck5hbWUsIFRpbWVzdGFtcCB0aGVUaW1lc3RhbXAsCiAgICAgICAgICAgICBDYWxlbmRhciBjYWwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIHN1cHBsaWVkIGphdmEubmV0LlVSTC4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIHN1cHBsaWVkIHtAY29kZQorICAgICAqIGphdmEubmV0LlVSTH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEBwYXJhbSB0aGVVUkwKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBqYXZhLm5ldC5VUkwKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHBhcmFtZXRlck5hbWUsIFVSTCB0aGVVUkwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IE9VVCBwYXJhbWV0ZXIgcmVhZCB3YXMgU1FMIE5VTEwuCisgICAgICogR2V0cyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCB7QGNvZGUgT1VUfSBwYXJhbWV0ZXIgcmVhZCB3YXMgU1FMCisgICAgICoge0Bjb2RlIE5VTEx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIgd2FzIFNRTCBOVUxMLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsYXN0IHBhcmFtZXRlciB3YXMgU1FMIHtAY29kZSBOVUxMfSwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gd2FzTnVsbCgpIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9DbG9iLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9DbG9iLmphdmEKaW5kZXggZTk3YjNiMS4uMzM5ZDRlNSAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvQ2xvYi5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0Nsb2IuamF2YQpAQCAtMjUsMTUwICsyNSwxNjggQEAKIC8qKgogICogQSBKYXZhIGludGVyZmFjZSBtYXBwaW5nIGZvciB0aGUgU1FMIENMT0IgdHlwZS4KICAqIDxwPgotICogQW4gU1FMIENMT0IgdHlwZSBzdG9yZXMgYSBsYXJnZSBhcnJheSBvZiBjaGFyYWN0ZXJzIGFzIHRoZSB2YWx1ZSBpbiBhIGNvbHVtbgotICogb2YgYSBkYXRhYmFzZS4KKyAqIEFuIFNRTCB7QGNvZGUgQ0xPQn0gdHlwZSBzdG9yZXMgYSBsYXJnZSBhcnJheSBvZiBjaGFyYWN0ZXJzIGFzIHRoZSB2YWx1ZSBpbiBhCisgKiBjb2x1bW4gb2YgYSBkYXRhYmFzZS4KICAqIDxwPgotICogVGhlIGphdmEuc3FsLkNsb2IgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHNldHRpbmcgYW5kIHJldHJpZXZpbmcgZGF0YQotICogaW4gdGhlIENsb2IsIGZvciBxdWVyeWluZyBDbG9iIGRhdGEgbGVuZ3RoLCBmb3Igc2VhcmNoaW5nIGZvciBkYXRhIHdpdGhpbiB0aGUKLSAqIENsb2IuCisgKiBUaGUge0Bjb2RlIGphdmEuc3FsLkNsb2J9IGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIGZvciBzZXR0aW5nIGFuZAorICogcmV0cmlldmluZyBkYXRhIGluIHRoZSB7QGNvZGUgQ2xvYn0sIGZvciBxdWVyeWluZyB7QGNvZGUgQ2xvYn0gZGF0YSBsZW5ndGgsCisgKiBmb3Igc2VhcmNoaW5nIGZvciBkYXRhIHdpdGhpbiB0aGUge0Bjb2RlIENsb2J9LgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ2xvYiB7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIENsb2Igb2JqZWN0IGFzIGFuIEFTQ0lJIHN0cmVhbS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHtAY29kZSBDbG9ifSBvYmplY3QgYXMgYW4gQVNDSUkgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gQVNDSUkgSW5wdXRTdHJlYW0gZ2l2aW5nIGFjY2VzcyB0byB0aGUgQ2xvYiBkYXRhCisgICAgICogQHJldHVybiBhbiBBU0NJSSB7QGNvZGUgSW5wdXRTdHJlYW19IGdpdmluZyBhY2Nlc3MgdG8gdGhlIAorICAgICAqICAgICAgICAgICAge0Bjb2RlIENsb2J9IGRhdGEuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBDbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIENsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIENsb2Igb2JqZWN0IGFzIGEgamF2YS5pby5SZWFkZXIuCisgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGlzIHtAY29kZSBDbG9ifSBvYmplY3QgaW4gYSB7QGNvZGUgamF2YS5pby5SZWFkZXJ9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjaGFyYWN0ZXIgc3RyZWFtIFJlYWRlciBvYmplY3QgZ2l2aW5nIGFjY2VzcyB0byB0aGUgQ2xvYiBkYXRhCisgICAgICogQHJldHVybiBhIGNoYXJhY3RlciBzdHJlYW0gUmVhZGVyIG9iamVjdCBnaXZpbmcgYWNjZXNzIHRvIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIENsb2J9IGRhdGEuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBDbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIENsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgYSBjb3B5IG9mIGEgc3BlY2lmaWVkIHN1YnN0cmluZyBpbiB0aGlzIENsb2IuCisgICAgICogR2V0cyBhIGNvcHkgb2YgYSBzcGVjaWZpZWQgc3Vic3RyaW5nIGluIHRoaXMge0Bjb2RlIENsb2J9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlIHN1YnN0cmluZyBpbiB0aGUgQ2xvYgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUgc3Vic3RyaW5nIGluIHRoZSB7QGNvZGUgQ2xvYn0uCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gQSBTdHJpbmcgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgZGF0YS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIENsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQ2xvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTdWJTdHJpbmcobG9uZyBwb3MsIGludCBsZW5ndGgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoaXMgQ2xvYiBvYmplY3QuCisgICAgICogUmV0cmlldmVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGlzIHtAY29kZSBDbG9ifSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGxvbmcgdmFsdWUgd2l0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciBpbiB0aGlzIENsb2IuCisgICAgICogQHJldHVybiBhIGxvbmcgdmFsdWUgd2l0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciBpbiB0aGlzIHtAY29kZSBDbG9ifS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIENsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQ2xvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgbGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGF0IHdoaWNoIGEgc3BlY2lmaWVkIENsb2Igb2JqZWN0IGFwcGVhcnMKLSAgICAgKiBpbiB0aGlzIENsb2Igb2JqZWN0LgorICAgICAqIFJldHJpZXZlcyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGF0IHdoaWNoIGEgc3BlY2lmaWVkIHtAY29kZSBDbG9ifSBvYmplY3QKKyAgICAgKiBhcHBlYXJzIGluIHRoaXMge0Bjb2RlIENsb2J9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2VhcmNoc3RyCi0gICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENsb2IgdG8gc2VhcmNoIGZvcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCB7QGNvZGUgQ2xvYn0gdG8gc2VhcmNoIGZvci4KICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhpcyBDbG9iIHRvIHN0YXJ0IHRoZSBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIGEgbG9uZyB2YWx1ZSB3aXRoIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgc3BlY2lmaWVkIENsb2Igb2NjdXJzCi0gICAgICogICAgICAgICB3aXRoaW4gdGhpcyBDbG9iLgorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGlzIHtAY29kZSBDbG9ifSB0byBzdGFydCB0aGUgc2VhcmNoCisgICAgICogQHJldHVybiBhIGxvbmcgdmFsdWUgd2l0aCB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiAgICAgICAgIENsb2J9IG9jY3VycyB3aXRoaW4gdGhpcyB7QGNvZGUgQ2xvYn0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBDbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIENsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHBvc2l0aW9uKENsb2Igc2VhcmNoc3RyLCBsb25nIHN0YXJ0KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gYXQgd2hpY2ggYSBzcGVjaWZpZWQgc3Vic3RyaW5nIGFwcGVhcnMKLSAgICAgKiBpbiB0aGlzIENsb2Igb2JqZWN0LgorICAgICAqIGluIHRoaXMge0Bjb2RlIENsb2J9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2VhcmNoc3RyCi0gICAgICogICAgICAgICAgICB0aCBTdHJpbmcgdG8gc2VhcmNoIGZvcgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBzZWFyY2ggd2l0aGluIHRoaXMgQ2xvYi4KLSAgICAgKiBAcmV0dXJuIGEgbG9uZyB2YWx1ZSB3aXRoIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgc3BlY2lmaWVkIFN0cmluZwotICAgICAqICAgICAgICAgb2NjdXJzIHdpdGhpbiB0aGlzIENsb2IuCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHNlYXJjaCB3aXRoaW4gdGhpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIENsb2J9LgorICAgICAqIEByZXR1cm4gYSBsb25nIHZhbHVlIHdpdGggdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RyaW5nCisgICAgICogICAgICAgICBvY2N1cnMgd2l0aGluIHRoaXMge0Bjb2RlIENsb2J9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgQ2xvYgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIHtAY29kZSBDbG9ifS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBwb3NpdGlvbihTdHJpbmcgc2VhcmNoc3RyLCBsb25nIHN0YXJ0KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIGEgc3RyZWFtIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdyaXRlIEFzY2lpIGNoYXJhY3RlcnMgdG8gdGhpcwotICAgICAqIENsb2Igb2JqZWN0LCBzdGFydGluZyBhdCBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgICoge0Bjb2RlIENsb2J9IG9iamVjdCwgc3RhcnRpbmcgYXQgc3BlY2lmaWVkIHBvc2l0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCB0aGUgd3JpdGluZworICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSB3cml0aW5nLgogICAgICAqIEByZXR1cm4gYW4gT3V0cHV0U3RyZWFtIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdyaXRlIEFTQ0lJIGNoYXJhY3RlcnMgdG8KLSAgICAgKiAgICAgICAgIHRoaXMgQ2xvYi4KKyAgICAgKiAgICAgICAgIHRoaXMge0Bjb2RlIENsb2J9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgQ2xvYgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIHtAY29kZSBDbG9ifS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHNldEFzY2lpU3RyZWFtKGxvbmcgcG9zKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0cmlldmVzIGEgc3RyZWFtIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgc3RyZWFtIG9mIFVuaWNvZGUKLSAgICAgKiBjaGFyYWN0ZXJzIHRvIHRoaXMgQ2xvYiBvYmplY3QsIGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uLgorICAgICAqIFJldHJpZXZlcyBhIHN0cmVhbSB3aGljaCBjYW4gYmUgdXNlZCB0byB3cml0ZSBhIHN0cmVhbSBvZiB1bmljb2RlCisgICAgICogY2hhcmFjdGVycyB0byB0aGlzIHtAY29kZSBDbG9ifSBvYmplY3QsIGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCB0aGUgd3JpdGluZwotICAgICAqIEByZXR1cm4gYSBXcml0ZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gd3JpdGUgVW5pY29kZSBjaGFyYWN0ZXJzIHRvIHRoaXMKLSAgICAgKiAgICAgICAgIENsb2IuCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHdyaXRpbmcuCisgICAgICogQHJldHVybiBhIFdyaXRlciB3aGljaCBjYW4gYmUgdXNlZCB0byB3cml0ZSB1bmljb2RlIGNoYXJhY3RlcnMgdG8gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIENsb2J9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgQ2xvYgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIHtAY29kZSBDbG9ifS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGVyIHNldENoYXJhY3RlclN0cmVhbShsb25nIHBvcykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGdpdmVuIEphdmEgU3RyaW5nIHRvIHRoaXMgQ2xvYiBvYmplY3QgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgICogV3JpdGVzIGEgZ2l2ZW4gSmF2YSBTdHJpbmcgdG8gdGhpcyB7QGNvZGUgQ2xvYn0gb2JqZWN0IGF0IGEgc3BlY2lmaWVkCisgICAgICogcG9zaXRpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBvcwotICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSB3cml0aW5nCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHdyaXRpbmcuCiAgICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byB3cml0ZQotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIENsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQ2xvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRTdHJpbmcobG9uZyBwb3MsIFN0cmluZyBzdHIpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgbGVuIGNoYXJhY3RlcnMgb2YgU3RyaW5nLCBzdGFydGluZyBhdCBhIHNwZWNpZmllZCBjaGFyYWN0ZXIKLSAgICAgKiBvZmZzZXQsIHRvIHRoaXMgQ2xvYi4KKyAgICAgKiBXcml0ZXMge0Bjb2RlIGxlbn0gY2hhcmFjdGVycyBvZiBhIHN0cmluZywgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQKKyAgICAgKiBjaGFyYWN0ZXIgb2Zmc2V0LCB0byB0aGlzIHtAY29kZSBDbG9ifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9zCi0gICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHdyaXRpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCB0aGUgd3JpdGluZy4KICAgICAgKiBAcGFyYW0gc3RyCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHdyaXRlCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHdyaXRlLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIHN0ciB0byBzdGFydCB3cml0aW5nIGZyb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIHtAY29kZSBzdHJ9IHRvIHN0YXJ0IHdyaXRpbmcgZnJvbS4KICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIENsb2IKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgQ2xvYn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRTdHJpbmcobG9uZyBwb3MsIFN0cmluZyBzdHIsIGludCBvZmZzZXQsIGludCBsZW4pCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVHJ1bmNhdGVzIHRoaXMgQ2xvYiB0byBoYXZlIGEgc3BlY2lmaWVkIGxlbmd0aCBvZiBjaGFyYWN0ZXJzLgorICAgICAqIFRydW5jYXRlcyB0aGlzIHtAY29kZSBDbG9ifSBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggaW4gY2hhcmFjdGVycyB0byB0cnVuY2F0ZSB0aGlzIENsb2IKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggaW4gY2hhcmFjdGVycyBnaXZpbmcgdGhlIHBsYWNlIHRvIAorICAgICAqICAgICAgICAgICAgdHJ1bmNhdGUgdGhpcyB7QGNvZGUgQ2xvYn0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBDbG9iCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUge0Bjb2RlIENsb2J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRydW5jYXRlKGxvbmcgbGVuKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvQ29ubmVjdGlvbi5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvQ29ubmVjdGlvbi5qYXZhCmluZGV4IDQ2ODMyOTkuLjUyMzA3MWMgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0Nvbm5lY3Rpb24uamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9Db25uZWN0aW9uLmphdmEKQEAgLTIwLDgzICsyMCwxMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKLSAqIEEgQ29ubmVjdGlvbiByZXByZXNlbnRzIGEgbGluayBmcm9tIGEgSmF2YSBhcHBsaWNhdGlvbiB0byBhIGRhdGFiYXNlLiBBbGwgU1FMCisgKiBBIGNvbm5lY3Rpb24gcmVwcmVzZW50cyBhIGxpbmsgZnJvbSBhIEphdmEgYXBwbGljYXRpb24gdG8gYSBkYXRhYmFzZS4gQWxsIFNRTAogICogc3RhdGVtZW50cyBhbmQgcmVzdWx0cyBhcmUgcmV0dXJuZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgY29ubmVjdGlvbi4KLSAqIAorICogRGF0YWJhc2Ugc3RhdGVtZW50cyB0aGF0IGFyZSBleGVjdXRlZCB3aXRoaW4gdGhpcyBjb250ZXh0IGZvcm0gYQorICogZGF0YWJhc2Ugc2Vzc2lvbiB3aGljaCBmb3JtcyBvbmUgb3IgbW9yZSBjbG9zZWQgdHJhbnNhY3Rpb25zLiBFc3BlY2lhbGx5IEluIGRpc3RyaWJ1dGVkIGFwcGxpY2F0aW9ucywgbXVsdGlwbGUgY29uY3VycmVudCBjb25uZWN0aW9ucyBtYXkgZXhpc3QgYWNjZXNzaW5nIHRoZSBzYW1lIHZhbHVlcyBvZiB0aGUgZGF0YWJhc2UuCisgKiB3aGljaCBtYXkgbGVhZCB0byB0aGUgZm9sbG93aW5nIHBoZW5vbWVuYSAocmVmZXJyZWQgdG8gYXMgPGk+dHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsczwvaT4pOgorICogPHVsPgorICogPGxpPjxpPmRpcnR5IHJlYWRzPC9pPjo8YnI+CisgKiByZWFkaW5nIHZhbHVlcyBmcm9tIHRhYmxlIHJvd3MgdGhhdCBhcmUgbm90IGNvbW1pdHRlZC48L2JyPjwvbGk+CisgKiA8bGk+PGk+bm9uLXJlcGVhdGFibGUgcmVhZHM8L2k+Ojxicj4KKyAqIHJlYWRpbmcgdGFibGUgcm93cyBtb3JlIHRoYW4gb25jZSBpbiBhIHRyYW5zYWN0aW9uIGJ1dCBnZXR0aW5nIGJhY2sgZGlmZmVyZW50CisgKiBkYXRhIGJlY2F1c2Ugb3RoZXIgdHJhbnNhY3Rpb25zIGhhdmUgYWx0ZXJlZCB0aGUgcm93cyBiZXR3ZWVuIHRoZSByZWFkcy48L2JyPjwvbGk+CisgKiA8bGk+PGk+cGhhbnRvbSByZWFkczwvaT46PGJyPgorICogcmV0cmlldmluZyBhZGRpdGlvbmFsICJwaGFudG9tIiByb3dzIGluIHRoZSBjb3Vyc2Ugb2YgcmVwZWF0ZWQgdGFibGUgcmVhZHMKKyAqIGJlY2F1c2Ugb3RoZXIgdHJhbnNhY3Rpb25zIGhhdmUgaW5zZXJ0ZWQgYWRkaXRpb25hbCByb3dzIHRoYXQgc2F0aXNmeSBhbgorICogU1FMIHtAY29kZSBXSEVSRX0gY2xhdXNlPC9icj48L2xpPgorICogPC91bD4KKyAqICAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb24gewogCiAgICAgLyoqCiAgICAgICogQSBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdHJhbnNhY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX05PTkUgPSAwOwogCiAgICAgLyoqCi0gICAgICogTm8gZGlydHkgcmVhZHMgYXJlIHBlcm1pdHRlZC4gVHJhbnNhY3Rpb25zIG1heSBub3QgcmVhZCBhIHJvdyBjb250YWluaW5nCi0gICAgICogY2hhbmdlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KKyAgICAgKiBObyA8aT5kaXJ0eSByZWFkczwvaT4gYXJlIHBlcm1pdHRlZCwgdGhlcmVmb3JlIHRyYW5zYWN0aW9ucyBtYXkgbm90IHJlYWQKKyAgICAgKiBhIHJvdyBjb250YWluaW5nIHVuY29tbWl0dGVkIHZhbHVlcyAtIGJ1dCBkb2VzIG5vdCBwcmV2ZW50IGFuIGFwcGxpY2F0aW9uCisgICAgICogZnJvbSA8aT5ub24tcmVwZWF0YWJsZSByZWFkczwvaT4gYW5kIDxpPnBoYW50b20gcmVhZHM8L2k+LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEID0gMjsKIAogICAgIC8qKgotICAgICAqIERpcnR5IHJlYWRzIChyZWFkaW5nIGZyb20gdGFibGUgcm93cyBjb250YWluaW5nIGNoYW5nZXMgdGhhdCBoYXZlIG5vdCB5ZXQKLSAgICAgKiBiZWVuIGNvbW1pdHRlZCksIG5vbi1yZXBlYXRhYmxlIHJlYWRzIChyZWFkaW5nIHRhYmxlIHJvd3MgbW9yZSB0aGFuIG9uY2UKLSAgICAgKiBpbiBhIHRyYW5zYWN0aW9uIGJ1dCBnZXR0aW5nIGJhY2sgZGlmZmVyZW50IGRhdGEgYmVjYXVzZSBvdGhlcgotICAgICAqIHRyYW5zYWN0aW9ucyBtYXkgaGF2ZSBhbHRlcmVkIHJvd3MgYmV0d2VlbiByZWFkcyksIGFuZCBwaGFudG9tIHJlYWRzCi0gICAgICogKHJldHJpZXZpbmcgYWRkaXRpb25hbCAicGhhbnRvbSIgcm93cyBpbiB0aGUgY291cnNlIG9mIHJlcGVhdGVkIHRhYmxlCi0gICAgICogcmVhZHMgYmVjYXVzZSBvdGhlciB0cmFuc2FjdGlvbnMgbWF5IGhhdmUgaW5zZXJ0ZWQgYWRkaXRpb25hbCByb3dzIHRoYXQKLSAgICAgKiBzYXRpc2Z5IGFuIFNRTCA8Y29kZT5XSEVSRTwvY29kZT4gY2xhdXNlKSBhcmUgPGI+YWxsIHBlcm1pdHRlZDwvYj4uCisgICAgICogSW4gdGhlIGNhc2UgdGhhdCByZWFkaW5nIHVuY29tbWl0dGVkIHZhbHVlcyBpcyBhbGxvd2VkLCB0aGUgZm9sbG93aW5nCisgICAgICogaW5jaWRlbnRzIG1heSBoYXBwZW4gd2hpY2ggbWF5IGxlYWQgdG8gYW4gaW52YWxpZCByZXN1bHRzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+ZGlydHkgcmVhZHM8L2k+PC9saT4KKyAgICAgKiA8bGk+PGk+bm9uLXJlcGVhdGFibGUgcmVhZHM8L2k+PC9saT4KKyAgICAgKiA8bGk+PGk+cGhhbnRvbSByZWFkczwvaT48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRCA9IDE7CiAKICAgICAvKioKLSAgICAgKiBBIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBkaXJ0eSByZWFkcyBhbmQgbm9uLXJlcGVhdGFibGUgcmVhZHMgYXJlCi0gICAgICogcHJldmVudGVkOyBwaGFudG9tIHJlYWRzIGNhbiBvY2N1ci4KKyAgICAgKiBBIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCA8aT5kaXJ0eSByZWFkczwvaT4gYW5kIDxpPm5vbi1yZXBlYXRhYmxlCisgICAgICogcmVhZHM8L2k+IGFyZSA8Yj5wcmV2ZW50ZWQ8L2I+IGJ1dCA8aT5waGFudG9tIHJlYWRzPC9pPiBjYW4gb2NjdXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEID0gNDsKIAogICAgIC8qKgotICAgICAqIERpcnR5IHJlYWRzIChyZWFkaW5nIGZyb20gdGFibGUgcm93cyBjb250YWluaW5nIGNoYW5nZXMgdGhhdCBoYXZlIG5vdCB5ZXQKLSAgICAgKiBiZWVuIGNvbW1pdHRlZCksIG5vbi1yZXBlYXRhYmxlIHJlYWRzIChyZWFkaW5nIHRhYmxlIHJvd3MgbW9yZSB0aGFuIG9uY2UKLSAgICAgKiBpbiBhIHRyYW5zYWN0aW9uIGJ1dCBnZXR0aW5nIGJhY2sgZGlmZmVyZW50IGRhdGEgYmVjYXVzZSBvdGhlcgotICAgICAqIHRyYW5zYWN0aW9ucyBtYXkgaGF2ZSBhbHRlcmVkIHJvd3MgYmV0d2VlbiByZWFkcyksIGFuZCBwaGFudG9tIHJlYWRzCi0gICAgICogKHJldHJpZXZpbmcgYWRkaXRpb25hbCAicGhhbnRvbSIgcm93cyBpbiB0aGUgY291cnNlIG9mIHJlcGVhdGVkIHRhYmxlCi0gICAgICogcmVhZHMgYmVjYXVzZSBvdGhlciB0cmFuc2FjdGlvbnMgbWF5IGhhdmUgaW5zZXJ0ZWQgYWRkaXRpb25hbCByb3dzIHRoYXQKLSAgICAgKiBzYXRpc2Z5IGFuIFNRTCA8Y29kZT5XSEVSRTwvY29kZT4gY2xhdXNlKSBhcmUgPGI+YWxsIHByZXZlbnRlZDwvYj4uCisgICAgICogVGhlIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBpbmNpZGVudHMgYXJlIDxiPmFsbAorICAgICAqIHByZXZlbnRlZDwvYj4gKHRoZSBvcHBvc2l0ZSBvZiB7QGxpbmsgI1RSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUR9KToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPmRpcnR5IHJlYWRzPC9pPjwvbGk+CisgICAgICogPGxpPjxpPm5vbi1yZXBlYXRhYmxlIHJlYWRzPC9pPjwvbGk+CisgICAgICogPGxpPjxpPnBoYW50b20gcmVhZHM8L2k+PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1NFUklBTElaQUJMRSA9IDg7CiAKICAgICAvKioKLSAgICAgKiBUaHJvd3MgYXdheSBhbnkgd2FybmluZ3MgdGhhdCBtYXkgaGF2ZSBhcmlzZW4gZm9yIHRoaXMgY29ubmVjdGlvbi4KLSAgICAgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIHtAbGluayAjZ2V0V2FybmluZ3MoKX0gd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiB1cCB1bnRpbCBhIGJyYW5kIG5ldyB3YXJuaW5nIGNvbmRpdGlvbiBvY2N1cnMuCisgICAgICogRGlzY2FyZHMgYWxsIHdhcm5pbmdzIHRoYXQgbWF5IGhhdmUgYXJpc2VuIGZvciB0aGlzIGNvbm5lY3Rpb24uCisgICAgICogU3Vic2VxdWVudCBjYWxscyB0byB7QGxpbmsgI2dldFdhcm5pbmdzKCl9IHdpbGwgcmV0dXJuIHtAY29kZSBudWxsfQorICAgICAqIHVwIHVudGlsIGEgbmV3IHdhcm5pbmcgY29uZGl0aW9uIG9jY3Vycy4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJXYXJuaW5ncygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBDYXVzZXMgdGhlIGluc3RhbnQgcmVsZWFzZSBvZiBhbGwgZGF0YWJhc2UgYW5kIGRyaXZlciBjb25uZWN0aW9uCiAgICAgICogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gQW55IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgdGhpcwotICAgICAqIG1ldGhvZCB3aWxsIGhhdmUgbm8gZWZmZWN0LgorICAgICAqIG1ldGhvZCBoYXZlIG5vIGVmZmVjdC4KICAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGFsbCBDb25uZWN0aW9ucyBhcmUgY2xvc2VkIGJlZm9yZSB0aGV5Ci0gICAgICogYXJlIGRlcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24gcmVhZHkgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gV2hpbGUKLSAgICAgKiB0aGUgZmluYWxpemUgbWV0aG9kIG9mIHRoZSBDb25uZWN0aW9uIHdpbGwgY2xvc2UgdGhlIENvbm5lY3Rpb24gYmVmb3JlCi0gICAgICogZ2FyYmFnZSBjb2xsZWN0aW9uIHRha2VzIHBsYWNlLCBpdCBpcyBub3QgYWR2aXNhYmxlIHRvIGxlYXZlIHRoZSBjbG9zZQotICAgICAqIG9wZXJhdGlvbiB0byB0YWtlIHBsYWNlIGluIHRoaXMgd2F5LiBVbnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlIG1heSByZXN1bHQKLSAgICAgKiBmcm9tIGNsb3NpbmcgQ29ubmVjdGlvbnMgaW4gdGhlIGZpbmFsaXplci4KKyAgICAgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkIGJlZm9yZSB0aGV5CisgICAgICogYXJlIGRlcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24gcmVhZHkgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICAgKiBBbHRob3VnaCB0aGUge0Bjb2RlIGZpbmFsaXplfSBtZXRob2Qgb2YgdGhlIGNvbm5lY3Rpb24gY2xvc2VzIHRoZQorICAgICAqIGNvbm5lY3Rpb24gYmVmb3JlIGdhcmJhZ2UgY29sbGVjdGlvbiB0YWtlcyBwbGFjZSwgaXQgaXMgbm90IGFkdmlzYWJsZSB0bworICAgICAqIGxlYXZlIHRoZSB7QGNvZGUgY2xvc2V9IG9wZXJhdGlvbiB0byB0YWtlIHBsYWNlIGluIHRoaXMgd2F5LiBNYWlubHkKKyAgICAgKiBiZWNhdXNlIHVuZGVzaXJlZCBzaWRlLWVmZmVjdHMgbWF5IGFwcGVhci4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENvbW1pdHMgYWxsIG9mIHRoZSBjaGFuZ2VzIG1hZGUgc3Vic2VxdWVudCB0byB0aGUgbGFzdCBjb21taXQgb3Igcm9sbGJhY2sKLSAgICAgKiBvZiB0aGUgYXNzb2NpYXRlZCB0cmFuc2FjdGlvbi4gQWxsIGxvY2tzIGluIHRoZSBkYXRhYmFzZSBoZWxkIGJ5IHRoaXMKLSAgICAgKiBjb25uZWN0aW9uIGFyZSBhbHNvIHJlbGlucXVpc2hlZC4gQ2FsbGluZyB0aGlzIG9wZXJhdGlvbiBvbiBjb25uZWN0aW9uCi0gICAgICogb2JqZWN0cyBpbiBhdXRvLWNvbW1pdCBtb2RlIGlzIGFuIGVycm9yLgorICAgICAqIENvbW1pdHMgYWxsIG9mIHRoZSBjaGFuZ2VzIG1hZGUgc2luY2UgdGhlIGxhc3Qge0Bjb2RlIGNvbW1pdH0gb3IKKyAgICAgKiB7QGNvZGUgcm9sbGJhY2t9IG9mIHRoZSBhc3NvY2lhdGVkIHRyYW5zYWN0aW9uLiBBbGwgbG9ja3MgaW4gdGhlIGRhdGFiYXNlCisgICAgICogaGVsZCBieSB0aGlzIGNvbm5lY3Rpb24gYXJlIGFsc28gcmVsaW5xdWlzaGVkLiBDYWxsaW5nIHRoaXMgb3BlcmF0aW9uIG9uCisgICAgICogY29ubmVjdGlvbiBvYmplY3RzIGluIHtAY29kZSBhdXRvLWNvbW1pdH0gbW9kZSBsZWFkcyB0byBhbiBlcnJvci4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIGlmIHRoZSB0YXJnZXQKQEAgLTEwNSw0MSArMTMyLDQxIEBACiAgICAgcHVibGljIHZvaWQgY29tbWl0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+U3RhdGVtZW50PC9jb2RlPiBmb3IgaXNzdWluZyBTUUwKLSAgICAgKiBjb21tYW5kcyB0byB0aGUgcmVtb3RlIGRhdGFiYXNlLgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFN0YXRlbWVudH0gZm9yIGlzc3VpbmcgU1FMIGNvbW1hbmRzIHRvCisgICAgICogdGhlIHJlbW90ZSBkYXRhYmFzZS4KICAgICAgKiA8cD4KLSAgICAgKiBSZXN1bHRTZXRzIGdlbmVyYXRlZCBieSB0aGUgcmV0dXJuZWQgU3RhdGVtZW50IHdpbGwgZGVmYXVsdCB0byB0eXBlCi0gICAgICogPGNvZGU+VFlQRV9GT1JXQVJEX09OTFk8L2NvZGU+IGFuZCBjb25jdXJyZW5jeSBsZXZlbAotICAgICAqIDxjb2RlPkNPTkNVUl9SRUFEX09OTFk8L2NvZGU+LgorICAgICAqIHtAY29kZSBSZXN1bHRTZXRzfSBnZW5lcmF0ZWQgYnkgdGhlIHJldHVybmVkIHN0YXRlbWVudCB3aWxsIGRlZmF1bHQgdG8KKyAgICAgKiB0eXBlIHtAY29kZSBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFl9IGFuZCBjb25jdXJyZW5jeSBsZXZlbCB7QGNvZGUKKyAgICAgKiBSZXN1bHRTZXQuQ09OQ1VSX1JFQURfT05MWX0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIDxjb2RlPlN0YXRlbWVudDwvY29kZT4gb2JqZWN0IHdpdGggZGVmYXVsdCBzZXR0aW5ncy4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFN0YXRlbWVudH0gb2JqZWN0IHdpdGggZGVmYXVsdCBzZXR0aW5ncy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNlZSBSZXN1bHRTZXQKICAgICAgKi8KICAgICBwdWJsaWMgU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPlN0YXRlbWVudDwvY29kZT4gd2hvc2UgYXNzb2NpYXRlZAotICAgICAqIDxjb2RlPlJlc3VsdFNldDwvY29kZT5zIHdpbGwgaGF2ZSB0aGUgY2hhcmFjdGVyaXN0aWNzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAgKiB0eXBlLCBjb25jdXJyZW5jeSBhbmQgaG9sZGFiaWxpdHkgYXJndW1lbnRzLgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFN0YXRlbWVudH0gd2hvc2UgYXNzb2NpYXRlZCB7QGNvZGUKKyAgICAgKiBSZXN1bHRTZXR9cyBoYXZlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgc3BlY2lmaWVkIGluIHRoZSB0eXBlIGFuZAorICAgICAqIGNvbmN1cnJlbmN5IGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0VHlwZQotICAgICAqICAgICAgICAgICAgb25lIG9mIDoKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUgc3BlY2lmaWVyczoKICAgICAgKiAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX1NFTlNJVElWRX0KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX1NDUk9MTF9TRU5TSVRJVkV9IDwvbGk+IDxsaT4KKyAgICAgKiAgICAgICAgICAgIHtAbGluayBSZXN1bHRTZXQjVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9IDwvbGk+IDxsaT4KKyAgICAgKiAgICAgICAgICAgIHtAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9PC9saT4KICAgICAgKiAgICAgICAgICAgIDwvdWw+CiAgICAgICogQHBhcmFtIHJlc3VsdFNldENvbmN1cnJlbmN5Ci0gICAgICogICAgICAgICAgICBvbmUgb2YgOgorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uY3VycmVuY3kgbW9kZSBzcGVjaWZpZXJzOgogICAgICAqICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1VQREFUQUJMRX0KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9SRUFEX09OTFl9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDT05DVVJfVVBEQVRBQkxFfTwvbGk+IDxsaT4KKyAgICAgKiAgICAgICAgICAgIHtAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1JFQURfT05MWX08L2xpPgogICAgICAqICAgICAgICAgICAgPC91bD4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPlN0YXRlbWVudDwvY29kZT4gY2FwYWJsZSBvZgotICAgICAqICAgICAgICAgbWFudWZhY3R1cmluZyA8Y29kZT5SZXN1bHRTZXQ8L2NvZGU+cyB0aGF0IHNhdGlzZnkgdGhlCi0gICAgICogICAgICAgICBzcGVjaWZpZWQgPGNvZGU+cmVzdWx0U2V0VHlwZTwvY29kZT4gYW5kCi0gICAgICogICAgICAgICA8Y29kZT5yZXN1bHRTZXRDb25jdXJyZW5jeTwvY29kZT4gdmFsdWVzLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFN0YXRlbWVudH0gY2FwYWJsZSBvZiBtYW51ZmFjdHVyaW5nCisgICAgICogICAgICAgICB7QGNvZGUgUmVzdWx0U2V0fXMgdGhhdCBzYXRpc2Z5IHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogICAgICAgICByZXN1bHRTZXRUeXBlfSBhbmQge0Bjb2RlIHJlc3VsdFNldENvbmN1cnJlbmN5fSB2YWx1ZXMuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQogICAgICAqLwpAQCAtMTQ3LDE1OCArMTc0LDE2NSBAQAogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+U3RhdGVtZW50PC9jb2RlPiB3aG9zZSBhc3NvY2lhdGVkCi0gICAgICogPGNvZGU+UmVzdWx0U2V0PC9jb2RlPnMgd2lsbCBoYXZlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFN0YXRlbWVudH0gd2hvc2UgYXNzb2NpYXRlZAorICAgICAqIHtAY29kZSBSZXN1bHRTZXR9cyB3aWxsIGhhdmUgdGhlIGNoYXJhY3RlcmlzdGljcyBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICogdHlwZSwgY29uY3VycmVuY3kgYW5kIGhvbGRhYmlsaXR5IGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0VHlwZQotICAgICAqICAgICAgICAgICAgb25lIG9mIDoKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUgc3BlY2lmaWVyczoKICAgICAgKiAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX1NFTlNJVElWRX0KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX1NDUk9MTF9TRU5TSVRJVkV9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfTwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX0ZPUldBUkRfT05MWX08L2xpPgogICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0Q29uY3VycmVuY3kKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiA6CisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25jdXJyZW5jeSBtb2RlIHNwZWNpZmllcnM6CiAgICAgICogICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDT05DVVJfVVBEQVRBQkxFfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1JFQURfT05MWX0KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9VUERBVEFCTEV9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9SRUFEX09OTFl9PC9saT4KICAgICAgKiAgICAgICAgICAgIDwvdWw+CiAgICAgICogQHBhcmFtIHJlc3VsdFNldEhvbGRhYmlsaXR5Ci0gICAgICogICAgICAgICAgICBvbmUgb2YgOgorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZGFiaWxpdHkgbW9kZSBzcGVjaWZpZXJzOgogICAgICAqICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjSE9MRF9DVVJTT1JTX09WRVJfQ09NTUlUfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ0xPU0VfQ1VSU09SU19BVF9DT01NSVR9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNIT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVR9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NMT1NFX0NVUlNPUlNfQVRfQ09NTUlUfTwvbGk+CiAgICAgICogICAgICAgICAgICA8L3VsPgotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+U3RhdGVtZW50PC9jb2RlPiBjYXBhYmxlIG9mCi0gICAgICogICAgICAgICBtYW51ZmFjdHVyaW5nIDxjb2RlPlJlc3VsdFNldDwvY29kZT5zIHRoYXQgc2F0aXNmeSB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCA8Y29kZT5yZXN1bHRTZXRUeXBlPC9jb2RlPiwKLSAgICAgKiAgICAgICAgIDxjb2RlPnJlc3VsdFNldENvbmN1cnJlbmN5PC9jb2RlPiBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPnJlc3VsdFNldEhvbGRhYmlsaXR5PC9jb2RlPiB2YWx1ZXMuCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgU3RhdGVtZW50fSBjYXBhYmxlIG9mCisgICAgICogICAgICAgICBtYW51ZmFjdHVyaW5nIHtAY29kZSBSZXN1bHRTZXR9cyB0aGF0IHNhdGlzZnkgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQge0Bjb2RlIHJlc3VsdFNldFR5cGV9LAorICAgICAqICAgICAgICAge0Bjb2RlIHJlc3VsdFNldENvbmN1cnJlbmN5fSBhbmQKKyAgICAgKiAgICAgICAgIHtAY29kZSByZXN1bHRTZXRIb2xkYWJpbGl0eX0gdmFsdWVzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudChpbnQgcmVzdWx0U2V0VHlwZSwKICAgICAgICAgICAgIGludCByZXN1bHRTZXRDb25jdXJyZW5jeSwgaW50IHJlc3VsdFNldEhvbGRhYmlsaXR5KQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpb24gb2Ygd2hldGhlciBvciBub3QgdGhpcyBjb25uZWN0aW9uIGlzIGluIHRoZQotICAgICAqIGF1dG8tY29tbWl0IG9wZXJhdGluZyBtb2RlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgYm9vbGVhbn0gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbm5lY3Rpb24gaXMgaW4KKyAgICAgKiB0aGUge0Bjb2RlIGF1dG8tY29tbWl0fSBvcGVyYXRpbmcgbW9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF1dG8tY29tbWl0IGlzIG9uLCBvdGhlcndpc2UKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBhdXRvLWNvbW1pdH0gaXMgb24sIG90aGVyd2lzZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0NvbW1pdCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoaXMgQ29ubmVjdGlvbiBvYmplY3QncyBjdXJyZW50IGNhdGFsb2cgbmFtZS4KKyAgICAgKiBHZXRzIHRoaXMge0Bjb2RlIENvbm5lY3Rpb259IG9iamVjdCdzIGN1cnJlbnQgY2F0YWxvZyBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNhdGFsb2cgbmFtZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY2F0YWxvZworICAgICAqIEByZXR1cm4gdGhlIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vIGNhdGFsb2cKICAgICAgKiAgICAgICAgIG5hbWUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGhvbGRhYmlsaXR5IHRoYXQgYW55IDxjb2RlPlJlc3VsdFNldDwvY29kZT5zIG1hZGUKLSAgICAgKiBmcm9tIHRoaXMgaW5zdGFuY2Ugd2lsbCBoYXZlLgorICAgICAqIFJldHVybnMgdGhlIGhvbGRhYmlsaXR5IHByb3BlcnR5IHRoYXQgYW55IHtAY29kZSBSZXN1bHRTZXR9IHByb2R1Y2VkIGJ5CisgICAgICogdGhpcyBpbnN0YW5jZSB3aWxsIGhhdmUuCiAgICAgICogCi0gICAgICogQHJldHVybiBvbmUgb2YgOgorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZGFiaWxpdHkgbW9kZSBzcGVjaWZpZXJzOgogICAgICAqICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjSE9MRF9DVVJTT1JTX09WRVJfQ09NTUlUfQotICAgICAqICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ0xPU0VfQ1VSU09SU19BVF9DT01NSVR9CisgICAgICogICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNIT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVR9PC9saT4gPGxpPgorICAgICAqICAgICAgICAge0BsaW5rIFJlc3VsdFNldCNDTE9TRV9DVVJTT1JTX0FUX0NPTU1JVH08L2xpPgogICAgICAqICAgICAgICAgPC91bD4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGEgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBhIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SG9sZGFiaWxpdHkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgYWJvdXQgdGhlIGRhdGFiYXNlIHJlZmVyZW5jZWQgYnkgdGhpcyBjb25uZWN0aW9uLiBUaGUKLSAgICAgKiByZXR1cm5lZCA8Y29kZT5EYXRhYmFzZU1ldGFEYXRhPC9jb2RlPiBkZXNjcmliZXMgdGhlIGRhdGFiYXNlCi0gICAgICogdG9wb2dyYXBoeSwgYXZhaWxhYmxlIHN0b3JlZCBwcm9jZWR1cmVzLCBTUUwgc3ludGF4IGFuZCBzbyBvbi4KKyAgICAgKiByZXR1cm5lZCB7QGNvZGUgRGF0YWJhc2VNZXRhRGF0YX0gZGVzY3JpYmVzIHRoZSBkYXRhYmFzZSB0b3BvZ3JhcGh5LAorICAgICAqIGF2YWlsYWJsZSBzdG9yZWQgcHJvY2VkdXJlcywgU1FMIHN5bnRheCBhbmQgc28gb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIDxjb2RlPkRhdGFiYXNlTWV0YURhdGE8L2NvZGU+IG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhYmFzZQotICAgICAqICAgICAgICAgZGVzY3JpcHRpb24KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIERhdGFiYXNlTWV0YURhdGF9IG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgZGVzY3JpcHRpb24uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBhIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgYSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YWJhc2VNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVzZW50IHZhbHVlIG9mIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBmb3IgdGhpcyBDb25uZWN0aW9uCi0gICAgICogaW5zdGFuY2UuCisgICAgICogUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsIGZvciB0aGlzIGNvbm5lY3Rpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIHZhbHVlCisgICAgICogQHJldHVybiB0aGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIHZhbHVlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAc2VlICNUUkFOU0FDVElPTl9OT05FCiAgICAgICogQHNlZSAjVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQKICAgICAgKiBAc2VlICNUUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVECiAgICAgICogQHNlZSAjVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFECiAgICAgICogQHNlZSAjVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBUeXBlIE1hcCBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb25uZWN0aW9uIG9iamVjdC4gVGhlIHR5cGUgbWFwCi0gICAgICogd2lsbCBiZSBlbXB0eSB1bmxlc3MgdGhlIGFwcGxpY2F0aW9uIGhhcyBhZGRlZCBhdCBsZWFzdCBvbmUgZW50cnkuCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBtYXBwaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBDb25uZWN0aW9ufSBvYmplY3QuCisgICAgICogVGhlIHR5cGUgbWFwcGluZyBtdXN0IGJlIHNldCBvbiB0aGUgYXBwbGljYXRpb24gbGV2ZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgVHlwZSBNYXAgYXMgYSA8Y29kZT5qYXZhLnV0aWwuTWFwPC9jb2RlPgorICAgICAqIEByZXR1cm4gdGhlIFR5cGUgTWFwIGFzIGEge0Bjb2RlIGphdmEudXRpbC5NYXB9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldFR5cGVNYXAoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IDxjb2RlPlNRTFdhcm5pbmc8L2NvZGU+IG9iamVjdHMgdGhhdCBtYXkKLSAgICAgKiBoYXZlIGJlZW4gY3JlYXRlZCBpbiB0aGUgdXNlIG9mIHRoaXMgY29ubmVjdGlvbi4gSWYgYXQgbGVhc3Qgb25lIHdhcm5pbmcKLSAgICAgKiBoYXMgb2NjdXJyZWQgdGhlbiB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBvbmUgcmVwb3J0ZWQuIEEKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCBubyB3YXJuaW5ncyBoYXZlIG9jY3VycmVkLgorICAgICAqIEdldHMgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSB7QGNvZGUgU1FMV2FybmluZ30gb2JqZWN0cyB0aGF0IG1heSBoYXZlCisgICAgICogYmVlbiBjcmVhdGVkIGluIHRoZSB1c2Ugb2YgdGhpcyBjb25uZWN0aW9uLiBJZiBhdCBsZWFzdCBvbmUgd2FybmluZyBoYXMKKyAgICAgKiBvY2N1cnJlZCB0aGVuIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgdGhlIGZpcnN0IG9uZSByZXBvcnRlZC4gQSB7QGNvZGUKKyAgICAgKiBudWxsfSBpbmRpY2F0ZXMgdGhhdCBubyB3YXJuaW5ncyBoYXZlIG9jY3VycmVkLgogICAgICAqIDxwPgogICAgICAqIEJ5IGludm9raW5nIHRoZSB7QGxpbmsgU1FMV2FybmluZyNnZXROZXh0V2FybmluZygpfSBtZXRob2Qgb2YgdGhlCi0gICAgICogcmV0dXJuZWQgPGNvZGU+U1FMV2FybmluZzwvY29kZT4gb2JqZWN0IGl0IGlzIHBvc3NpYmxlIHRvIG9idGFpbiBhbGwKLSAgICAgKiB3YXJuaW5nIG9iamVjdHMuCisgICAgICogcmV0dXJuZWQge0Bjb2RlIFNRTFdhcm5pbmd9IG9iamVjdCBpdCBpcyBwb3NzaWJsZSB0byBvYnRhaW4gYWxsIG9mCisgICAgICogdGhpcyBjb25uZWN0aW9uJ3Mgd2FybmluZyBvYmplY3RzLgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCB3YXJuaW5nIGFzIGFuIFNRTFdhcm5pbmcgb2JqZWN0IChtYXkgYmUKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHdhcm5pbmcgYXMgYW4gU1FMV2FybmluZyBvYmplY3QgKG1heSBiZSB7QGNvZGUgbnVsbH0pLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2Ugb3IgaWYgdGhlIGNhbGwKICAgICAgKiAgICAgICAgICAgICBoYXMgYmVlbiBtYWRlIG9uIGEgY29ubmVjdGlvbiB3aGljaCBoYXMgYmVlbiBwcmV2aW91c2x5CiAgICAgICogICAgICAgICAgICAgY2xvc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTUUxXYXJuaW5nIGdldFdhcm5pbmdzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpb24gb2Ygd2hldGhlciBvciBub3QgdGhpcyBjb25uZWN0aW9uIGlzIGluIHRoZQotICAgICAqIGNsb3NlZCBzdGF0ZS4gVGhlIGNsb3NlZCBzdGF0ZSBtYXkgYmUgZW50ZXJlZCBpbnRvIGFzIGEgY29uc2VxdWVuY2Ugb2YgYQotICAgICAqIHN1Y2Nlc3NmdWwgaW52b2NhdGlvbiBvZiB0aGUge0BsaW5rICNjbG9zZSgpfSBtZXRob2Qgb3IgZWxzZSBpZiBhbiBlcnJvcgotICAgICAqIGhhcyBvY2N1cnJlZCB0aGF0IHByZXZlbnRzIHRoZSBjb25uZWN0aW9uIGZyb20gZnVuY3Rpb25pbmcgbm9ybWFsbHkuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBib29sZWFufSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgY29ubmVjdGlvbiBpcyBpbgorICAgICAqIHRoZSB7QGNvZGUgY2xvc2VkfSBzdGF0ZS4gVGhlIHtAY29kZSBjbG9zZWR9IHN0YXRlIG1heSBiZSBlbnRlcmVkIGludG8gYXMKKyAgICAgKiBhIGNvbnNlcXVlbmNlIG9mIGEgc3VjY2Vzc2Z1bCBpbnZvY2F0aW9uIG9mIHRoZSB7QGxpbmsgI2Nsb3NlKCl9IG1ldGhvZAorICAgICAqIG9yIGVsc2UgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkIHRoYXQgcHJldmVudHMgdGhlIGNvbm5lY3Rpb24gZnJvbQorICAgICAqIGZ1bmN0aW9uaW5nIG5vcm1hbGx5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2xvc2VkLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY2xvc2VkLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbm5lY3Rpb24gaXMKLSAgICAgKiBjdXJyZW50bHkgaW4gcmVhZC1vbmx5IHN0YXRlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgYm9vbGVhbn0gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbm5lY3Rpb24gaXMKKyAgICAgKiBjdXJyZW50bHkgaW4gdGhlIHtAY29kZSByZWFkLW9ubHl9IHN0YXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW4gcmVhZC1vbmx5IHN0YXRlLCBvdGhlcndpc2UKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBpbiByZWFkLW9ubHkgc3RhdGUsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0IFNRTCBzdGF0ZW1lbnQKLSAgICAgKiA8Y29kZT5zcWw8L2NvZGU+IGV4cHJlc3NlZCBpbiB0aGUgdW5kZXJseWluZyBzeXN0ZW0ncyBuYXRpdmUgU1FMCisgICAgICoge0Bjb2RlIHNxbH0gZXhwcmVzc2VkIGluIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSdzIG5hdGl2ZSBTUUwKICAgICAgKiBzeW50YXguCiAgICAgICogCiAgICAgICogQHBhcmFtIHNxbApAQCAtMzEwLDM1NCArMzQ0LDM2NCBAQAogICAgIHB1YmxpYyBTdHJpbmcgbmF0aXZlU1FMKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkNhbGxhYmxlU3RhdGVtZW50PC9jb2RlPiB0aGF0IG1heSBiZQotICAgICAqIHVzZWQgZm9yIG1ha2luZyBzdG9yZWQgcHJvY2VkdXJlIGNhbGxzIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBDYWxsYWJsZVN0YXRlbWVudH0gdGhhdCBtYXkgYmUgdXNlZCBmb3IKKyAgICAgKiBtYWtpbmcgc3RvcmVkIHByb2NlZHVyZSBjYWxscyB0byB0aGUgZGF0YWJhc2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNxbAogICAgICAqICAgICAgICAgICAgdGhlIFNRTCBzdGF0ZW1lbnQgdGhhdCBjYWxscyB0aGUgc3RvcmVkIGZ1bmN0aW9uCi0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5DYWxsYWJsZVN0YXRlbWVudDwvY29kZT4gcmVwcmVzZW50aW5nCi0gICAgICogICAgICAgICB0aGUgU1FMIHN0YXRlbWVudC4gPGNvZGU+UmVzdWx0U2V0PC9jb2RlPnMgZW1pdHRlZCBmcm9tIHRoaXMKLSAgICAgKiAgICAgICAgIDxjb2RlPkNhbGxhYmxlU3RhdGVtZW50PC9jb2RlPiB3aWxsIGRlZmF1bHQgdG8gdHlwZQorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIENhbGxhYmxlU3RhdGVtZW50fSByZXByZXNlbnRpbmcgdGhlIFNRTAorICAgICAqICAgICAgICAgc3RhdGVtZW50LiB7QGNvZGUgUmVzdWx0U2V0fXMgZW1pdHRlZCBmcm9tIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBDYWxsYWJsZVN0YXRlbWVudH0gd2lsbCBkZWZhdWx0IHRvIHR5cGUKICAgICAgKiAgICAgICAgIHtAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9IGFuZCBjb25jdXJyZW5jeQogICAgICAqICAgICAgICAge0BsaW5rIFJlc3VsdFNldCNDT05DVVJfUkVBRF9PTkxZfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q2FsbGFibGVTdGF0ZW1lbnQ8L2NvZGU+IHRoYXQgbWF5IGJlCi0gICAgICogdXNlZCBmb3IgbWFraW5nIHN0b3JlZCBwcm9jZWR1cmUgY2FsbHMgdG8gdGhlIGRhdGFiYXNlLgotICAgICAqIDxjb2RlPlJlc3VsdFNldDwvY29kZT5zIGVtaXR0ZWQgZnJvbSB0aGlzCi0gICAgICogPGNvZGU+Q2FsbGFibGVTdGF0ZW1lbnQ8L2NvZGU+IHdpbGwgc2F0aXNmeSB0aGUgc3BlY2lmaWVkCi0gICAgICogPGNvZGU+cmVzdWx0U2V0VHlwZTwvY29kZT4gYW5kIDxjb2RlPnJlc3VsdFNldENvbmN1cnJlbmN5PC9jb2RlPgotICAgICAqIHZhbHVlcy4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBDYWxsYWJsZVN0YXRlbWVudH0gdGhhdCBtYXkgYmUgdXNlZCBmb3IKKyAgICAgKiBtYWtpbmcgc3RvcmVkIHByb2NlZHVyZSBjYWxscyB0byB0aGUgZGF0YWJhc2UuIHtAY29kZSBSZXN1bHRTZXR9cyBlbWl0dGVkCisgICAgICogZnJvbSB0aGlzIHtAY29kZSBDYWxsYWJsZVN0YXRlbWVudH0gd2lsbCBzYXRpc2Z5IHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogcmVzdWx0U2V0VHlwZX0gYW5kIHtAY29kZSByZXN1bHRTZXRDb25jdXJyZW5jeX0gdmFsdWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzcWwKICAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgc3RhdGVtZW50CiAgICAgICogQHBhcmFtIHJlc3VsdFNldFR5cGUKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiA6CisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlIHNwZWNpZmllcnM6CiAgICAgICogICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX1NDUk9MTF9TRU5TSVRJVkV9Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX1NDUk9MTF9JTlNFTlNJVElWRX0KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfRk9SV0FSRF9PTkxZfQorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9TQ1JPTExfU0VOU0lUSVZFfTwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX1NDUk9MTF9JTlNFTlNJVElWRX08L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9PC9saT4KICAgICAgKiAgICAgICAgICAgIDwvdWw+CiAgICAgICogQHBhcmFtIHJlc3VsdFNldENvbmN1cnJlbmN5Ci0gICAgICogICAgICAgICAgICBvbmUgb2YgOgorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uY3VycmVuY3kgbW9kZSBzcGVjaWZpZXJzOgogICAgICAqICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1JFQURfT05MWX0KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9VUERBVEFCTEV9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDT05DVVJfUkVBRF9PTkxZfTwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDT05DVVJfVVBEQVRBQkxFfTwvbGk+CiAgICAgICogICAgICAgICAgICA8L3VsPgotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q2FsbGFibGVTdGF0ZW1lbnQ8L2NvZGU+IHJlcHJlc2VudGluZwotICAgICAqICAgICAgICAgdGhlIHByZWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQuIDxjb2RlPlJlc3VsdFNldDwvY29kZT5zIGVtaXR0ZWQKLSAgICAgKiAgICAgICAgIGZyb20gdGhpcyA8Y29kZT5DYWxsYWJsZVN0YXRlbWVudDwvY29kZT4gd2lsbCBzYXRpc2Z5IHRoZQotICAgICAqICAgICAgICAgc3BlY2lmaWVkIDxjb2RlPnJlc3VsdFNldFR5cGU8L2NvZGU+IGFuZAotICAgICAqICAgICAgICAgPGNvZGU+cmVzdWx0U2V0Q29uY3VycmVuY3k8L2NvZGU+IHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBDYWxsYWJsZVN0YXRlbWVudH0gcmVwcmVzZW50aW5nIHRoZQorICAgICAqICAgICAgICAgcHJlY29tcGlsZWQgU1FMIHN0YXRlbWVudC4ge0Bjb2RlIFJlc3VsdFNldH1zIGVtaXR0ZWQgZnJvbSB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgQ2FsbGFibGVTdGF0ZW1lbnR9IHdpbGwgc2F0aXNmeSB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqICAgICAgICAgcmVzdWx0U2V0VHlwZX0gYW5kIHtAY29kZSByZXN1bHRTZXRDb25jdXJyZW5jeX0gdmFsdWVzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENhbGxhYmxlU3RhdGVtZW50IHByZXBhcmVDYWxsKFN0cmluZyBzcWwsIGludCByZXN1bHRTZXRUeXBlLAogICAgICAgICAgICAgaW50IHJlc3VsdFNldENvbmN1cnJlbmN5KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5DYWxsYWJsZVN0YXRlbWVudDwvY29kZT4gdGhhdCBtYXkgYmUKLSAgICAgKiB1c2VkIGZvciBtYWtpbmcgc3RvcmVkIHByb2NlZHVyZSBjYWxscyB0byB0aGUgZGF0YWJhc2UuIFJlc3VsdFNldHMKLSAgICAgKiBjcmVhdGVkIGZyb20gdGhpcyA8Y29kZT5DYWxsYWJsZVN0YXRlbWVudDwvY29kZT4gd2lsbCBoYXZlCi0gICAgICogY2hhcmFjdGVyaXN0aWNzIGRldGVybWluZWQgYnkgdGhlIHNwZWNpZmllZCB0eXBlLCBjb25jdXJyZW5jeSBhbmQKLSAgICAgKiBob2xkYWJpbGl0eSBhcmd1bWVudHMuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQ2FsbGFibGVTdGF0ZW1lbnR9IHRoYXQgbWF5IGJlIHVzZWQgZm9yCisgICAgICogbWFraW5nIHN0b3JlZCBwcm9jZWR1cmUgY2FsbHMgdG8gdGhlIGRhdGFiYXNlLiB7QGNvZGUgUmVzdWx0U2V0fXMgY3JlYXRlZAorICAgICAqIGZyb20gdGhpcyB7QGNvZGUgQ2FsbGFibGVTdGF0ZW1lbnR9IHdpbGwgaGF2ZSBjaGFyYWN0ZXJpc3RpY3MgZGV0ZXJtaW5lZAorICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgdHlwZSwgY29uY3VycmVuY3kgYW5kIGhvbGRhYmlsaXR5IGFyZ3VtZW50cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCiAgICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudAogICAgICAqIEBwYXJhbSByZXN1bHRTZXRUeXBlCi0gICAgICogICAgICAgICAgICBvbmUgb2YgOgorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZSBzcGVjaWZpZXJzOgogICAgICAqICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9TQ1JPTExfU0VOU0lUSVZFfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX0ZPUldBUkRfT05MWX0KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX1NFTlNJVElWRX08L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfRk9SV0FSRF9PTkxZfTwvbGk+CiAgICAgICogICAgICAgICAgICA8L3VsPgogICAgICAqIEBwYXJhbSByZXN1bHRTZXRDb25jdXJyZW5jeQotICAgICAqICAgICAgICAgICAgb25lIG9mIDoKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmN1cnJlbmN5IG1vZGUgc3BlY2lmaWVyczoKICAgICAgKiAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9SRUFEX09OTFl9Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDT05DVVJfVVBEQVRBQkxFfQorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1JFQURfT05MWX08L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1VQREFUQUJMRX08L2xpPgogICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0SG9sZGFiaWxpdHkKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiA6CisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkYWJpbGl0eSBtb2RlIHNwZWNpZmllcnM6CiAgICAgICogICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNIT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVR9Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDTE9TRV9DVVJTT1JTX0FUX0NPTU1JVH0KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0hPTERfQ1VSU09SU19PVkVSX0NPTU1JVH08L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ0xPU0VfQ1VSU09SU19BVF9DT01NSVR9PC9saT4KICAgICAgKiAgICAgICAgICAgIDwvdWw+Ci0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5DYWxsYWJsZVN0YXRlbWVudDwvY29kZT4gcmVwcmVzZW50aW5nCi0gICAgICogICAgICAgICB0aGUgcHJlY29tcGlsZWQgU1FMIHN0YXRlbWVudC4gPGNvZGU+UmVzdWx0U2V0PC9jb2RlPnMgZW1pdHRlZAotICAgICAqICAgICAgICAgZnJvbSB0aGlzIDxjb2RlPkNhbGxhYmxlU3RhdGVtZW50PC9jb2RlPiB3aWxsIHNhdGlzZnkgdGhlCi0gICAgICogICAgICAgICBzcGVjaWZpZWQgPGNvZGU+cmVzdWx0U2V0VHlwZTwvY29kZT4sCi0gICAgICogICAgICAgICA8Y29kZT5yZXN1bHRTZXRDb25jdXJyZW5jeTwvY29kZT4gYW5kCi0gICAgICogICAgICAgICA8Y29kZT5yZXN1bHRTZXRIb2xkYWJpbGl0eTwvY29kZT4gdmFsdWVzLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIENhbGxhYmxlU3RhdGVtZW50fSByZXByZXNlbnRpbmcgdGhlCisgICAgICogICAgICAgICBwcmVjb21waWxlZCBTUUwgc3RhdGVtZW50LiB7QGNvZGUgUmVzdWx0U2V0fXMgZW1pdHRlZCBmcm9tIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBDYWxsYWJsZVN0YXRlbWVudH0gd2lsbCBzYXRpc2Z5IHRoZSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogICAgICAgICByZXN1bHRTZXRUeXBlfSwge0Bjb2RlIHJlc3VsdFNldENvbmN1cnJlbmN5fSBhbmQge0Bjb2RlCisgICAgICogICAgICAgICByZXN1bHRTZXRIb2xkYWJpbGl0eX0gdmFsdWVzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDYWxsYWJsZVN0YXRlbWVudCBwcmVwYXJlQ2FsbChTdHJpbmcgc3FsLCBpbnQgcmVzdWx0U2V0VHlwZSwKICAgICAgICAgICAgIGludCByZXN1bHRTZXRDb25jdXJyZW5jeSwgaW50IHJlc3VsdFNldEhvbGRhYmlsaXR5KQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+UHJlcGFyZWRTdGF0ZW1lbnQ8L2NvZGU+IHRoYXQgbWF5IGJlCi0gICAgICogdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIHRvIGV4ZWN1dGUgcGFyYW1ldGVyaXplZCByZXF1ZXN0cyBvbiB0aGUKLSAgICAgKiBkYXRhYmFzZSBzZXJ2ZXIuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgUHJlcGFyZWRTdGF0ZW1lbnR9IHRoYXQgbWF5IGJlIHVzZWQgYW55CisgICAgICogbnVtYmVyIG9mIHRpbWVzIHRvIGV4ZWN1dGUgcGFyYW1ldGVyaXplZCByZXF1ZXN0cyBvbiB0aGUgZGF0YWJhc2Ugc2VydmVyLgogICAgICAqIDxwPgogICAgICAqIFN1YmplY3QgdG8gSkRCQyBkcml2ZXIgc3VwcG9ydCwgdGhpcyBvcGVyYXRpb24gd2lsbCBhdHRlbXB0IHRvIHNlbmQgdGhlCi0gICAgICogcHJlY29tcGlsZWQgdmVyc2lvbiBvZiB0aGUgc3RhdGVtZW50IHRvIHRoZSBkYXRhYmFzZS4gQWx0ZXJuYXRpdmVseSwgaWYKLSAgICAgKiB0aGUgZHJpdmVyIGlzIG5vdCBjYXBhYmxlIG9mIGZsb3dpbmcgcHJlY29tcGlsZWQgc3RhdGVtZW50cywgdGhlCi0gICAgICogc3RhdGVtZW50IHdpbGwgbm90IHJlYWNoIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgdW50aWwgaXQgaXMgZXhlY3V0ZWQuIFRoaXMKLSAgICAgKiB3aWxsIGhhdmUgYSBiZWFyaW5nIG9uIHByZWNpc2VseSB3aGVuIDxjb2RlPlNRTEV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKiBpbnN0YW5jZXMgZ2V0IHJhaXNlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBCeSBkZWZhdWx0LCBSZXN1bHRTZXRzIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlCisgICAgICogcHJlY29tcGlsZWQgdmVyc2lvbiBvZiB0aGUgc3RhdGVtZW50IHRvIHRoZSBkYXRhYmFzZS4gSWYKKyAgICAgKiB0aGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgcHJlY29tcGlsZWQgc3RhdGVtZW50cywgdGhlIHN0YXRlbWVudCB3aWxsCisgICAgICogbm90IHJlYWNoIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgdW50aWwgaXQgaXMgZXhlY3V0ZWQuIFRoaXMgZGlzdGluY3Rpb24KKyAgICAgKiBkZXRlcm1pbmVzIHRoZSBtb21lbnQgd2hlbiB7QGNvZGUgU1FMRXhjZXB0aW9ufXMgZ2V0IHJhaXNlZC4KKyAgICAgKiA8L3A+CisgICAgICogQnkgZGVmYXVsdCwge0Bjb2RlIFJlc3VsdFNldH1zIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlCiAgICAgICoge0BsaW5rIFJlc3VsdFNldCNUWVBFX0ZPUldBUkRfT05MWX0gdHlwZSB3aXRoIGEKICAgICAgKiB7QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9SRUFEX09OTFl9IG1vZGUgb2YgY29uY3VycmVuY3kuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNxbAogICAgICAqICAgICAgICAgICAgdGhlIFNRTCBzdGF0ZW1lbnQuCi0gICAgICogQHJldHVybiB0aGUgUHJlcGFyZWRTdGF0ZW1lbnQgY29udGFpbmluZyB0aGUgc3VwcGxpZWQgU1FMIHN0YXRlbWVudAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gY29udGFpbmluZyB0aGUgc3VwcGxpZWQgU1FMCisgICAgICogICAgICAgICBzdGF0ZW1lbnQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBQcmVwYXJlZFN0YXRlbWVudCB0aGF0IGNhbiByZXRyaWV2ZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogZ2VuZXJhdGVkIGtleXMuIFBhcmFtZXRlciA8Y29kZT5hdXRvR2VuZXJhdGVkS2V5czwvY29kZT4gbWF5IGJlIHVzZWQgdG8KLSAgICAgKiBzcGVjaWZ5IHRvIHRoZSBkcml2ZXIgaWYgc3VjaCBrZXlzIHNob3VsZCBiZSBtYWRlIGFjY2Vzc2libGUuIFRoaXMgaXMKLSAgICAgKiBvbmx5IHRoZSBjYXNlIHdoZW4gPGNvZGU+c3FsPC9jb2RlPiBpcyBhbiBpbnNlcnQgc3RhdGVtZW50LgorICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gdGhhdCBjYW4gcmV0cmlldmUKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBrZXlzLiBQYXJhbWV0ZXIge0Bjb2RlIGF1dG9HZW5lcmF0ZWRLZXlzfSBtYXkgYmUKKyAgICAgKiB1c2VkIHRvIHRlbGwgdGhlIGRyaXZlciB3aGV0aGVyIHN1Y2gga2V5cyBzaG91bGQgYmUgbWFkZSBhY2Nlc3NpYmxlLgorICAgICAqIFRoaXMgaXMgb25seSByZWxldmFudCB3aGVuIHRoZSB7QGNvZGUgc3FsfSBzdGF0ZW1lbnQgaXMgYW4ge0Bjb2RlIGluc2VydH0KKyAgICAgKiBzdGF0ZW1lbnQuCiAgICAgICogPHA+Ci0gICAgICogQW4gU1FMIHN0YXRlbWVudCB3aGljaCBtYXkgaGF2ZSBJTiBwYXJhbWV0ZXJzIGNhbiBiZSBzdG9yZWQgYW5kCi0gICAgICogcHJlY29tcGlsZWQgaW4gYSBQcmVwYXJlZFN0YXRlbWVudC4gVGhlIFByZXBhcmVkU3RhdGVtZW50IGNhbiB0aGVuIGJlCi0gICAgICogdXNlZCB0byBleGVjdXRlIHRoZSBzdGF0ZW1lbnQgbXVsdGlwbGUgdGltZXMgaW4gYW4gZWZmaWNpZW50IHdheS4KLSAgICAgKiA8cD4KKyAgICAgKiBBbiBTUUwgc3RhdGVtZW50IHdoaWNoIG1heSBoYXZlIHtAY29kZSBJTn0gcGFyYW1ldGVycyBjYW4gYmUgc3RvcmVkIGFuZAorICAgICAqIHByZWNvbXBpbGVkIGluIGEge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fS4gVGhlIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0KKyAgICAgKiBjYW4gdGhlbiBiZSB0aGVuIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgc3RhdGVtZW50IG11bHRpcGxlIHRpbWVzIGluIGFuCisgICAgICogZWZmaWNpZW50IHdheS4KKyAgICAgKiA8L3A+CiAgICAgICogU3ViamVjdCB0byBKREJDIGRyaXZlciBzdXBwb3J0LCB0aGlzIG9wZXJhdGlvbiB3aWxsIGF0dGVtcHQgdG8gc2VuZCB0aGUKLSAgICAgKiBwcmVjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBzdGF0ZW1lbnQgdG8gdGhlIGRhdGFiYXNlLiBBbHRlcm5hdGl2ZWx5LCBpZgotICAgICAqIHRoZSBkcml2ZXIgaXMgbm90IGNhcGFibGUgb2YgZmxvd2luZyBwcmVjb21waWxlZCBzdGF0ZW1lbnRzLCB0aGUKLSAgICAgKiBzdGF0ZW1lbnQgd2lsbCBub3QgcmVhY2ggdGhlIGRhdGFiYXNlIHNlcnZlciB1bnRpbCBpdCBpcyBleGVjdXRlZC4gVGhpcwotICAgICAqIHdpbGwgaGF2ZSBhIGJlYXJpbmcgb24gcHJlY2lzZWx5IHdoZW4gPGNvZGU+U1FMRXhjZXB0aW9uPC9jb2RlPgotICAgICAqIGluc3RhbmNlcyBnZXQgcmFpc2VkLgorICAgICAqIHByZWNvbXBpbGVkIHZlcnNpb24gb2YgdGhlIHN0YXRlbWVudCB0byB0aGUgZGF0YWJhc2UuIElmCisgICAgICogdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHByZWNvbXBpbGVkIHN0YXRlbWVudHMsIHRoZSBzdGF0ZW1lbnQgd2lsbAorICAgICAqIG5vdCByZWFjaCB0aGUgZGF0YWJhc2Ugc2VydmVyIHVudGlsIGl0IGlzIGV4ZWN1dGVkLiBUaGlzIGRpc3RpbmN0aW9uCisgICAgICogZGV0ZXJtaW5lcyB0aGUgbW9tZW50IHdoZW4ge0Bjb2RlIFNRTEV4Y2VwdGlvbn1zIGdldCByYWlzZWQuCiAgICAgICogPHA+Ci0gICAgICogQnkgZGVmYXVsdCwgUmVzdWx0U2V0cyBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZQorICAgICAqIEJ5IGRlZmF1bHQsIHtAY29kZSBSZXN1bHRTZXR9cyBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZQogICAgICAqIHtAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9IHR5cGUgd2l0aCBhCiAgICAgICoge0BsaW5rIFJlc3VsdFNldCNDT05DVVJfUkVBRF9PTkxZfSBtb2RlIG9mIGNvbmN1cnJlbmN5LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCiAgICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudC4KICAgICAgKiBAcGFyYW0gYXV0b0dlbmVyYXRlZEtleXMKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiA6CisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBnZW5lcmF0ZWQga2V5IG9wdGlvbnM6CiAgICAgICogICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFN0YXRlbWVudCNSRVRVUk5fR0VORVJBVEVEX0tFWVN9Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFN0YXRlbWVudCNOT19HRU5FUkFURURfS0VZU30KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgU3RhdGVtZW50I1JFVFVSTl9HRU5FUkFURURfS0VZU308L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBTdGF0ZW1lbnQjTk9fR0VORVJBVEVEX0tFWVN9PC9saT4KICAgICAgKiAgICAgICAgICAgIDwvdWw+Ci0gICAgICogQHJldHVybiBhIG5ldyA8Y29kZT5QcmVwYXJlZFN0YXRlbWVudDwvY29kZT4gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQotICAgICAqICAgICAgICAgaW5wdXQgU1FMIHN0YXRlbWVudC4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgU1FMIHN0YXRlbWVudC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgaW50IGF1dG9HZW5lcmF0ZWRLZXlzKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IFByZXBhcmVkU3RhdGVtZW50IHRoYXQgY2FuIHJldHJpZXZlIHRoZSBhdXRvLWdlbmVyYXRlZAotICAgICAqIGtleXMgZGVzaWduYXRlZCBieSBhIHN1cHBsaWVkIGFycmF5LiBJZiA8Y29kZT5zcWw8L2NvZGU+IGlzIGFuIFNRTAotICAgICAqIDxjb2RlPklOU0VSVDwvY29kZT4gc3RhdGVtZW50LCBwYXJhbWV0ZXIgPGNvZGU+Y29sdW1uSW5kZXhlczwvY29kZT4KLSAgICAgKiBpcyBleHBlY3RlZCB0byBob2xkIHRoZSBpbmRleCB2YWx1ZXMgZm9yIGVhY2ggY29sdW1uIGluIHRoZSBzdGF0ZW1lbnQncwotICAgICAqIGludGVuZGVkIGRhdGFiYXNlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGF1dG9nZW5lcmF0ZWQta2V5cyBvZiBpbnRlcmVzdC4KLSAgICAgKiBPdGhlcndpc2UgPGNvZGU+Y29sdW1uSW5kZXhlczwvY29kZT4gaXMgaWdub3JlZC4KKyAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCB7QGNvZGUgUHJlcGFyZWRTdGF0ZW1lbnR9IHRoYXQgY2FuIHJldHJpZXZlIHRoZQorICAgICAqIGF1dG8tZ2VuZXJhdGVkIGtleXMgZGVzaWduYXRlZCBieSBhIHN1cHBsaWVkIGFycmF5LiBJZiB7QGNvZGUgc3FsfSBpcyBhbgorICAgICAqIFNRTCB7QGNvZGUgSU5TRVJUfSBzdGF0ZW1lbnQsIHRoZSBwYXJhbWV0ZXIge0Bjb2RlIGNvbHVtbkluZGV4ZXN9IGlzIGV4cGVjdGVkCisgICAgICogdG8gaG9sZCB0aGUgaW5kZXggdmFsdWVzIGZvciBlYWNoIGNvbHVtbiBpbiB0aGUgc3RhdGVtZW50J3MgaW50ZW5kZWQKKyAgICAgKiBkYXRhYmFzZSB0YWJsZSBjb250YWluaW5nIHRoZSBhdXRvZ2VuZXJhdGVkLWtleXMgb2YgaW50ZXJlc3QuIE90aGVyd2lzZQorICAgICAqIHtAY29kZSBjb2x1bW5JbmRleGVzfSBpcyBpZ25vcmVkLgogICAgICAqIDxwPgogICAgICAqIFN1YmplY3QgdG8gSkRCQyBkcml2ZXIgc3VwcG9ydCwgdGhpcyBvcGVyYXRpb24gd2lsbCBhdHRlbXB0IHRvIHNlbmQgdGhlCi0gICAgICogcHJlY29tcGlsZWQgdmVyc2lvbiBvZiB0aGUgc3RhdGVtZW50IHRvIHRoZSBkYXRhYmFzZS4gQWx0ZXJuYXRpdmVseSwgaWYKLSAgICAgKiB0aGUgZHJpdmVyIGlzIG5vdCBjYXBhYmxlIG9mIGZsb3dpbmcgcHJlY29tcGlsZWQgc3RhdGVtZW50cywgdGhlCi0gICAgICogc3RhdGVtZW50IHdpbGwgbm90IHJlYWNoIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgdW50aWwgaXQgaXMgZXhlY3V0ZWQuIFRoaXMKLSAgICAgKiB3aWxsIGhhdmUgYSBiZWFyaW5nIG9uIHByZWNpc2VseSB3aGVuIDxjb2RlPlNRTEV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKiBpbnN0YW5jZXMgZ2V0IHJhaXNlZC4KKyAgICAgKiBwcmVjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBzdGF0ZW1lbnQgdG8gdGhlIGRhdGFiYXNlLiBJZgorICAgICAqIHRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBwcmVjb21waWxlZCBzdGF0ZW1lbnRzLCB0aGUgc3RhdGVtZW50IHdpbGwKKyAgICAgKiBub3QgcmVhY2ggdGhlIGRhdGFiYXNlIHNlcnZlciB1bnRpbCBpdCBpcyBleGVjdXRlZC4gVGhpcyBkaXN0aW5jdGlvbgorICAgICAqIGRldGVybWluZXMgdGhlIG1vbWVudCB3aGVuIHtAY29kZSBTUUxFeGNlcHRpb259cyBnZXQgcmFpc2VkLgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBCeSBkZWZhdWx0LCBSZXN1bHRTZXRzIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlCisgICAgICogQnkgZGVmYXVsdCwge0Bjb2RlIFJlc3VsdFNldH1zIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlCiAgICAgICoge0BsaW5rIFJlc3VsdFNldCNUWVBFX0ZPUldBUkRfT05MWX0gdHlwZSB3aXRoIGEKLSAgICAgKiB7QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9SRUFEX09OTFl9IG1vZGUgb2YgY29uY3VycmVuY3kuCisgICAgICoge0BsaW5rIFJlc3VsdFNldCNDT05DVVJfUkVBRF9PTkxZfSBjb25jdXJyZW5jeSBtb2RlLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCiAgICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudC4KICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXhlcwogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4ZXMgb2YgdGhlIGNvbHVtbnMgZm9yIHdoaWNoIGF1dG8tZ2VuZXJhdGVkIGtleXMKICAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBQcmVwYXJlZFN0YXRlbWVudCBjb250YWluaW5nIHRoZSBzdXBwbGllZCBTUUwgc3RhdGVtZW50CisgICAgICogQHJldHVybiB0aGUgUHJlcGFyZWRTdGF0ZW1lbnQgY29udGFpbmluZyB0aGUgc3VwcGxpZWQgU1FMIHN0YXRlbWVudC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3FsLCBpbnRbXSBjb2x1bW5JbmRleGVzKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBQcmVwYXJlZFN0YXRlbWVudCB0aGF0IGdlbmVyYXRlcyBSZXN1bHRTZXRzIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHZhbHVlcyBvZiA8Y29kZT5yZXN1bHRTZXRUeXBlPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5yZXN1bHRTZXRDb25jdXJyZW5jeTwvY29kZT4uCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gdGhhdCBnZW5lcmF0ZXMge0Bjb2RlIFJlc3VsdFNldH1zCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcyBvZiB7QGNvZGUgcmVzdWx0U2V0VHlwZX0gYW5kIHtAY29kZQorICAgICAqIHJlc3VsdFNldENvbmN1cnJlbmN5fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudC4gSXQgY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgJz8nIElOIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgcGxhY2Vob2xkZXJzCisgICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudC4gSXQgY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUge0Bjb2RlICc/J30KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBJTn0gcGFyYW1ldGVyIHBsYWNlaG9sZGVycy4KICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0VHlwZQotICAgICAqICAgICAgICAgICAgb25lIG9mIDoKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUgc3BlY2lmaWVyczoKICAgICAgKiAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX1NFTlNJVElWRX0KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX1NDUk9MTF9TRU5TSVRJVkV9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfTwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX0ZPUldBUkRfT05MWX08L2xpPgogICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0Q29uY3VycmVuY3kKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiA6CisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25jdXJyZW5jeSBtb2RlIHNwZWNpZmllcnM6CiAgICAgICogICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDT05DVVJfUkVBRF9PTkxZfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1VQREFUQUJMRX0KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9SRUFEX09OTFl9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9VUERBVEFCTEV9PC9saT4KICAgICAgKiAgICAgICAgICAgIDwvdWw+Ci0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5QcmVwYXJlZFN0YXRlbWVudDwvY29kZT4gY29udGFpbmluZyB0aGUKLSAgICAgKiAgICAgICAgIFNRTCBzdGF0ZW1lbnQgPGNvZGU+c3FsPC9jb2RlPi4gPGNvZGU+UmVzdWx0U2V0PC9jb2RlPnMKLSAgICAgKiAgICAgICAgIGVtaXR0ZWQgZnJvbSB0aGlzIDxjb2RlPlByZXBhcmVkU3RhdGVtZW50PC9jb2RlPiB3aWxsIHNhdGlzZnkKLSAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgPGNvZGU+cmVzdWx0U2V0VHlwZTwvY29kZT4gYW5kCi0gICAgICogICAgICAgICA8Y29kZT5yZXN1bHRTZXRDb25jdXJyZW5jeTwvY29kZT4gdmFsdWVzLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fSBjb250YWluaW5nIHRoZSBTUUwKKyAgICAgKiAgICAgICAgIHN0YXRlbWVudCB7QGNvZGUgc3FsfS4ge0Bjb2RlIFJlc3VsdFNldH1zIGVtaXR0ZWQgZnJvbSB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgUHJlcGFyZWRTdGF0ZW1lbnR9IHdpbGwgc2F0aXNmeSB0aGUgc3BlY2lmaWVkIHtAY29kZQorICAgICAqICAgICAgICAgcmVzdWx0U2V0VHlwZX0gYW5kIHtAY29kZSByZXN1bHRTZXRDb25jdXJyZW5jeX0gdmFsdWVzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsIGludCByZXN1bHRTZXRUeXBlLAogICAgICAgICAgICAgaW50IHJlc3VsdFNldENvbmN1cnJlbmN5KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFByZXBhcmVkU3RhdGVtZW50IHRoYXQgZ2VuZXJhdGVzIFJlc3VsdFNldHMgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogdHlwZSwgY29uY3VycmVuY3kgYW5kIGhvbGRhYmlsaXR5CisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gdGhhdCBnZW5lcmF0ZXMge0Bjb2RlIFJlc3VsdFNldH1zCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUsIGNvbmN1cnJlbmN5IGFuZCBob2xkYWJpbGl0eQogICAgICAqIAogICAgICAqIEBwYXJhbSBzcWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgc3RhdGVtZW50LiBJdCBjYW4gY29udGFpbiBvbmUgb3IgbW9yZSAnPycgSU4gcGFyYW1ldGVyCi0gICAgICogICAgICAgICAgICBwbGFjZWhvbGRlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgc3RhdGVtZW50LiBJdCBjYW4gY29udGFpbiBvbmUgb3IgbW9yZSB7QGNvZGUgJz8nIElOfQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHBsYWNlaG9sZGVycy4KICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0VHlwZQotICAgICAqICAgICAgICAgICAgb25lIG9mIDoKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUgc3BlY2lmaWVyczoKICAgICAgKiAgICAgICAgICAgIDx1bD4KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX1NFTlNJVElWRX0KLSAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX1NDUk9MTF9TRU5TSVRJVkV9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfTwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNUWVBFX0ZPUldBUkRfT05MWX08L2xpPgogICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiBAcGFyYW0gcmVzdWx0U2V0Q29uY3VycmVuY3kKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiA6CisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25jdXJyZW5jeSBtb2RlIHNwZWNpZmllcnM6CiAgICAgICogICAgICAgICAgICA8dWw+Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDT05DVVJfUkVBRF9PTkxZfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1VQREFUQUJMRX0KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9SRUFEX09OTFl9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NPTkNVUl9VUERBVEFCTEV9PC9saT4KICAgICAgKiAgICAgICAgICAgIDwvdWw+CiAgICAgICogQHBhcmFtIHJlc3VsdFNldEhvbGRhYmlsaXR5Ci0gICAgICogICAgICAgICAgICBvbmUgb2YgOgorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZGFiaWxpdHkgbW9kZSBzcGVjaWZpZXJzOgogICAgICAqICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjSE9MRF9DVVJTT1JTX09WRVJfQ09NTUlUfQotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ0xPU0VfQ1VSU09SU19BVF9DT01NSVR9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNIT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVR9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgUmVzdWx0U2V0I0NMT1NFX0NVUlNPUlNfQVRfQ09NTUlUfTwvbGk+CiAgICAgICogICAgICAgICAgICA8L3VsPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+UHJlcGFyZWRTdGF0ZW1lbnQ8L2NvZGU+IGNvbnRhaW5pbmcgdGhlCi0gICAgICogICAgICAgICBTUUwgc3RhdGVtZW50IDxjb2RlPnNxbDwvY29kZT4uIDxjb2RlPlJlc3VsdFNldDwvY29kZT5zCi0gICAgICogICAgICAgICBlbWl0dGVkIGZyb20gdGhpcyA8Y29kZT5QcmVwYXJlZFN0YXRlbWVudDwvY29kZT4gd2lsbCBzYXRpc2Z5Ci0gICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIDxjb2RlPnJlc3VsdFNldFR5cGU8L2NvZGU+LAotICAgICAqICAgICAgICAgPGNvZGU+cmVzdWx0U2V0Q29uY3VycmVuY3k8L2NvZGU+IGFuZAotICAgICAqICAgICAgICAgPGNvZGU+cmVzdWx0U2V0SG9sZGFiaWxpdHk8L2NvZGU+IHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gY29udGFpbmluZyB0aGUgU1FMCisgICAgICogICAgICAgICBzdGF0ZW1lbnQge0Bjb2RlIHNxbH0uIHtAY29kZSBSZXN1bHRTZXR9cyBlbWl0dGVkIGZyb20gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fSB3aWxsIHNhdGlzZnkgdGhlIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiAgICAgICAgIHJlc3VsdFNldFR5cGV9LCB7QGNvZGUgcmVzdWx0U2V0Q29uY3VycmVuY3l9IGFuZCB7QGNvZGUKKyAgICAgKiAgICAgICAgIHJlc3VsdFNldEhvbGRhYmlsaXR5fSB2YWx1ZXMuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgaW50IHJlc3VsdFNldFR5cGUsCiAgICAgICAgICAgICBpbnQgcmVzdWx0U2V0Q29uY3VycmVuY3ksIGludCByZXN1bHRTZXRIb2xkYWJpbGl0eSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBQcmVwYXJlZFN0YXRlbWVudCB0aGF0IGNhbiByZXRyaWV2ZSB0aGUgYXV0by1nZW5lcmF0ZWQKLSAgICAgKiBrZXlzIGRlc2lnbmF0ZWQgYnkgYSBzdXBwbGllZCBhcnJheS4gSWYgPGNvZGU+c3FsPC9jb2RlPiBpcyBhbiBTUUwKLSAgICAgKiA8Y29kZT5JTlNFUlQ8L2NvZGU+IHN0YXRlbWVudCwgPGNvZGU+Y29sdW1uTmFtZXM8L2NvZGU+IGlzIGV4cGVjdGVkCi0gICAgICogdG8gaG9sZCB0aGUgbmFtZXMgb2YgZWFjaCBjb2x1bW4gaW4gdGhlIHN0YXRlbWVudCdzIGFzc29jaWF0ZWQgZGF0YWJhc2UKLSAgICAgKiB0YWJsZSBjb250YWluaW5nIHRoZSBhdXRvZ2VuZXJhdGVkLWtleXMgb2YgaW50ZXJlc3QuIE90aGVyd2lzZQotICAgICAqIDxjb2RlPmNvbHVtbk5hbWVzPC9jb2RlPiBpcyBpZ25vcmVkLgorICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gdGhhdCBjYW4gcmV0cmlldmUgdGhlCisgICAgICogYXV0by1nZW5lcmF0ZWQga2V5cyBkZXNpZ25hdGVkIGJ5IGEgc3VwcGxpZWQgYXJyYXkuIElmIHtAY29kZSBzcWx9IGlzIGFuCisgICAgICogU1FMIHtAY29kZSBJTlNFUlR9IHN0YXRlbWVudCwge0Bjb2RlIGNvbHVtbk5hbWVzfSBpcyBleHBlY3RlZCB0byBob2xkIHRoZQorICAgICAqIG5hbWVzIG9mIGVhY2ggY29sdW1uIGluIHRoZSBzdGF0ZW1lbnQncyBhc3NvY2lhdGVkIGRhdGFiYXNlIHRhYmxlCisgICAgICogY29udGFpbmluZyB0aGUgYXV0b2dlbmVyYXRlZC1rZXlzIG9mIGludGVyZXN0LiBPdGhlcndpc2Uge0Bjb2RlCisgICAgICogY29sdW1uTmFtZXN9IGlzIGlnbm9yZWQuCiAgICAgICogPHA+CiAgICAgICogU3ViamVjdCB0byBKREJDIGRyaXZlciBzdXBwb3J0LCB0aGlzIG9wZXJhdGlvbiB3aWxsIGF0dGVtcHQgdG8gc2VuZCB0aGUKICAgICAgKiBwcmVjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBzdGF0ZW1lbnQgdG8gdGhlIGRhdGFiYXNlLiBBbHRlcm5hdGl2ZWx5LCBpZgotICAgICAqIHRoZSBkcml2ZXIgaXMgbm90IGNhcGFibGUgb2YgZmxvd2luZyBwcmVjb21waWxlZCBzdGF0ZW1lbnRzLCB0aGUKKyAgICAgKiB0aGUgZHJpdmVyIGlzIG5vdCBjYXBhYmxlIG9mIGhhbmRsaW5nIHByZWNvbXBpbGVkIHN0YXRlbWVudHMsIHRoZQogICAgICAqIHN0YXRlbWVudCB3aWxsIG5vdCByZWFjaCB0aGUgZGF0YWJhc2Ugc2VydmVyIHVudGlsIGl0IGlzIGV4ZWN1dGVkLiBUaGlzCi0gICAgICogd2lsbCBoYXZlIGEgYmVhcmluZyBvbiBwcmVjaXNlbHkgd2hlbiA8Y29kZT5TUUxFeGNlcHRpb248L2NvZGU+CisgICAgICogd2lsbCBoYXZlIGEgYmVhcmluZyBvbiBwcmVjaXNlbHkgPGk+d2hlbjwvaT4ge0Bjb2RlIFNRTEV4Y2VwdGlvbn0KICAgICAgKiBpbnN0YW5jZXMgZ2V0IHJhaXNlZC4KKyAgICAgKiA8L3A+CiAgICAgICogPHA+CiAgICAgICogQnkgZGVmYXVsdCwgUmVzdWx0U2V0cyBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZQogICAgICAqIHtAbGluayBSZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9IHR5cGUgd2l0aCBhCi0gICAgICoge0BsaW5rIFJlc3VsdFNldCNDT05DVVJfUkVBRF9PTkxZfSBtb2RlIG9mIGNvbmN1cnJlbmN5LgorICAgICAqIHtAbGluayBSZXN1bHRTZXQjQ09OQ1VSX1JFQURfT05MWX0gY29uY3VycmVuY3kgbW9kZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHNxbAogICAgICAqICAgICAgICAgICAgdGhlIFNRTCBzdGF0ZW1lbnQuCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWVzCiAgICAgICogICAgICAgICAgICB0aGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgZm9yIHdoaWNoIGF1dG8tZ2VuZXJhdGVkIGtleXMgc2hvdWxkCiAgICAgICogICAgICAgICAgICBiZSBtYWRlIGF2YWlsYWJsZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBQcmVwYXJlZFN0YXRlbWVudCBjb250YWluaW5nIHRoZSBzdXBwbGllZCBTUUwgc3RhdGVtZW50CisgICAgICogQHJldHVybiB0aGUgUHJlcGFyZWRTdGF0ZW1lbnQgY29udGFpbmluZyB0aGUgc3VwcGxpZWQgU1FMIHN0YXRlbWVudC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3FsLCBTdHJpbmdbXSBjb2x1bW5OYW1lcykKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWxlYXNlcyA8Y29kZT5zYXZlcG9pbnQ8L2NvZGU+IGZyb20gdGhlIHByZXNlbnQgdHJhbnNhY3Rpb24uIE9uY2UKLSAgICAgKiByZW1vdmVkLCB0aGUgPGNvZGU+U2F2ZXBvaW50PC9jb2RlPiBpcyBjb25zaWRlcmVkIGludmFsaWQgYW5kIHNob3VsZAotICAgICAqIG5vdCBiZSByZWZlcmVuY2VkIGZ1cnRoZXIuCisgICAgICogUmVsZWFzZXMgdGhlIHNwZWNpZmllZCB7QGNvZGUgc2F2ZXBvaW50fSBmcm9tIHRoZSBwcmVzZW50IHRyYW5zYWN0aW9uLiBPbmNlIHJlbW92ZWQsCisgICAgICogdGhlIHtAY29kZSBTYXZlcG9pbnR9IGlzIGNvbnNpZGVyZWQgaW52YWxpZCBhbmQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkCisgICAgICogZnVydGhlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2F2ZXBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRhcmdldGVkIGZvciByZW1vdmFsCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRhcmdldGVkIGZvciByZW1vdmFsLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciBpZgotICAgICAqICAgICAgICAgICAgIDxjb2RlPnNhdmVwb2ludDwvY29kZT4gaXMgY29uc2lkZXJlZCBub3QgdmFsaWQgaW4gdGhpcworICAgICAqICAgICAgICAgICAgIHtAY29kZSBzYXZlcG9pbnR9IGlzIGNvbnNpZGVyZWQgbm90IHZhbGlkIGluIHRoaXMKICAgICAgKiAgICAgICAgICAgICB0cmFuc2FjdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWxlYXNlU2F2ZXBvaW50KFNhdmVwb2ludCBzYXZlcG9pbnQpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSb2xscyBiYWNrIGFsbCB1cGRhdGVzIG1hZGUgc28gZmFyIGluIHRoaXMgdHJhbnNhY3Rpb24gYXMgd2VsbCBhcwotICAgICAqIHJlbGlucXVpc2hpbmcgYWxsIGFjcXVpcmVkIGRhdGFiYXNlIGxvY2tzLiBJdCBpcyBhbiBlcnJvciB0byBpbnZva2UgdGhpcworICAgICAqIFJvbGxzIGJhY2sgYWxsIHVwZGF0ZXMgbWFkZSBzbyBmYXIgaW4gdGhpcyB0cmFuc2FjdGlvbiBhbmQKKyAgICAgKiByZWxpbnF1aXNoZXMgYWxsIGFjcXVpcmVkIGRhdGFiYXNlIGxvY2tzLiBJdCBpcyBhbiBlcnJvciB0byBpbnZva2UgdGhpcwogICAgICAqIG9wZXJhdGlvbiB3aGVuIGluIGF1dG8tY29tbWl0IG1vZGUuCiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZGF0YWJhc2Ugb3IgaWYgdGhlIG1ldGhvZCBpcwogICAgICAqICAgICAgICAgICAgIGNhbGxlZCB3aGlsZSBpbiBhdXRvLWNvbW1pdCBtb2RlIG9mIG9wZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVbmRvZXMgYWxsIGNoYW5nZXMgbWFkZSBhZnRlciB0aGUgc3VwcGxpZWQgU2F2ZXBvaW50IG9iamVjdCB3YXMgc2V0LiBUaGlzCi0gICAgICogbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhdXRvLWNvbW1pdCBtb2RlIGlzIGRpc2FibGVkLgorICAgICAqIFVuZG9lcyBhbGwgY2hhbmdlcyBtYWRlIGFmdGVyIHRoZSBzdXBwbGllZCB7QGNvZGUgU2F2ZXBvaW50fSBvYmplY3Qgd2FzCisgICAgICogc2V0LiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYXV0by1jb21taXQgbW9kZSBpcyBkaXNhYmxlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2F2ZXBvaW50CiAgICAgICogICAgICAgICAgICB0aGUgU2F2ZXBvaW50IHRvIHJvbGwgYmFjayB0bwogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhTYXZlcG9pbnQgc2F2ZXBvaW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGlzIGNvbm5lY3Rpb24ncyBhdXRvLWNvbW1pdCBtb2RlIG9uIG9yIG9mZi4KKyAgICAgKiBTZXRzIHRoaXMgY29ubmVjdGlvbidzIGF1dG8tY29tbWl0IG1vZGUge0Bjb2RlIG9ufSBvciB7QGNvZGUgb2ZmfS4KICAgICAgKiA8cD4KICAgICAgKiBQdXR0aW5nIGEgQ29ubmVjdGlvbiBpbnRvIGF1dG8tY29tbWl0IG1vZGUgbWVhbnMgdGhhdCBhbGwgYXNzb2NpYXRlZCBTUUwKLSAgICAgKiBzdGF0ZW1lbnRzIHdpbGwgYmUgcnVuIGFuZCBjb21taXR0ZWQgaW4gdGhlaXIgb3duIHNlcGFyYXRlIHRyYW5zYWN0aW9ucy4KLSAgICAgKiBBbHRlcm5hdGl2ZWx5LCBhdXRvLWNvbW1pdCBzZXQgdG8gb2ZmIG1lYW5zIHRoYXQgYXNzb2NpYXRlZCBTUUwKKyAgICAgKiBzdGF0ZW1lbnRzIGFyZSBydW4gYW5kIGNvbW1pdHRlZCBhcyBzZXBhcmF0ZSB0cmFuc2FjdGlvbnMuCisgICAgICogQnkgY29udHJhc3QsIHNldHRpbmcgYXV0by1jb21taXQgdG8ge0Bjb2RlIG9mZn0gbWVhbnMgdGhhdCBhc3NvY2lhdGVkIFNRTAogICAgICAqIHN0YXRlbWVudHMgZ2V0IGdyb3VwZWQgaW50byB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBieQogICAgICAqIGV4cGxpY2l0IGNhbGxzIHRvIGVpdGhlciB0aGUge0BsaW5rICNjb21taXQoKX0gb3Ige0BsaW5rICNyb2xsYmFjaygpfQogICAgICAqIG1ldGhvZHMuCi0gICAgICogPHA+CisgICAgICogPC9wPgogICAgICAqIEF1dG8tY29tbWl0IGlzIHRoZSBkZWZhdWx0IG1vZGUgZm9yIG5ldyBjb25uZWN0aW9uIGluc3RhbmNlcy4KICAgICAgKiA8cD4KICAgICAgKiBXaGVuIGluIHRoaXMgbW9kZSwgY29tbWl0cyB3aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIgdXBvbiBzdWNjZXNzZnVsIFNRTAogICAgICAqIHN0YXRlbWVudCBjb21wbGV0aW9uIG9yIHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIGV4ZWN1dGUuCi0gICAgICogU3RhdGVtZW50cyBhcmUgbm90IGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlIHVudGlsIGFsbCBhc3NvY2lhdGVkCi0gICAgICogPGNvZGU+UmVzdWx0U2V0PC9jb2RlPnMgYW5kIG91dHB1dCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBvYnRhaW5lZCBvcgotICAgICAqIGNsb3NlZC4KKyAgICAgKiBTdGF0ZW1lbnRzIGFyZSBub3QgY29uc2lkZXJlZCBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHVudGlsIGFsbCBhc3NvY2lhdGVkCisgICAgICoge0Bjb2RlIFJlc3VsdFNldH1zIGFuZCBvdXRwdXQgcGFyYW1ldGVycyBoYXZlIGJlZW4gb2J0YWluZWQgb3IgY2xvc2VkLgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KICAgICAgKiBDYWxsaW5nIHRoaXMgb3BlcmF0aW9uIGR1cmluZyBhbiB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbiB3aWxsIHJlc3VsdCBpbgogICAgICAqIGl0IGJlaW5nIGNvbW1pdHRlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGF1dG9Db21taXQKLSAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRvIHB1dCB0aGUgdGFyZ2V0IGNvbm5lY3Rpb24KLSAgICAgKiAgICAgICAgICAgIGludG8gYXV0by1jb21taXQgbW9kZSAoPGNvZGU+dHJ1ZTwvY29kZT4pIG9yIG5vdCAoPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqIAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGJvb2xlYW59IGluZGljYXRpb24gb2Ygd2hldGhlciB0byBwdXQgdGhlIHRhcmdldAorICAgICAqICAgICAgICAgICAgY29ubmVjdGlvbiBpbnRvIGF1dG8tY29tbWl0IG1vZGUgKHtAY29kZSB0cnVlfSkgb3Igbm90ICgKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0pLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ29tbWl0KGJvb2xlYW4gYXV0b0NvbW1pdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtNjY5LDE4ICs3MTMsMTkgQEAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwogICAgICAqICAgICAgICAgICAgdGhlIGNhdGFsb2cgbmFtZSB0byB1c2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBob2xkYWJpbGl0eSBvZiBSZXN1bHRTZXRzIGNyZWF0ZWQgYnkgdGhpcyBDb25uZWN0aW9uLgorICAgICAqIFNldHMgdGhlIGhvbGRhYmlsaXR5IG9mIHRoZSB7QGNvZGUgUmVzdWx0U2V0fXMgY3JlYXRlZCBieSB0aGlzIENvbm5lY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIGhvbGRhYmlsaXR5Ci0gICAgICogICAgICAgICAgICBvbmUgb2YgOgorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZGFiaWxpdHkgbW9kZSBzcGVjaWZpZXJzOgogICAgICAqICAgICAgICAgICAgPHVsPgotICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjQ0xPU0VfQ1VSU09SU19BVF9DT01NSVR9Ci0gICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNIT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVR9CisgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rIFJlc3VsdFNldCNDTE9TRV9DVVJTT1JTX0FUX0NPTU1JVH08L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPntAbGluayBSZXN1bHRTZXQjSE9MRF9DVVJTT1JTX09WRVJfQ09NTUlUfTwvbGk+CiAgICAgICogICAgICAgICAgICA8bGk+CiAgICAgICogICAgICAgICAgICA8L3VsPgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCkBAIC02OTMsMzIgKzczOCwzNiBAQAogICAgICAqIDxwPgogICAgICAqIFRoaXMgc2VydmVzIGFzIGEgaGludCB0byB0aGUgZHJpdmVyLCB3aGljaCBjYW4gZW5hYmxlIGRhdGFiYXNlCiAgICAgICogb3B0aW1pemF0aW9ucy4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRPbmx5Ci0gICAgICogICAgICAgICAgICB0cnVlIHRvIHNldCB0aGUgQ29ubmVjdGlvbiB0byByZWFkIG9ubHkgbW9kZS4gZmFsc2UgZGlzYWJsZXMKLSAgICAgKiAgICAgICAgICAgIHJlYWQtb25seSBtb2RlCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gc2V0IHRoZSBDb25uZWN0aW9uIHRvIHJlYWQgb25seSBtb2RlLiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGZhbHNlfSBkaXNhYmxlcyByZWFkLW9ubHkgbW9kZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gdW5uYW1lZCBTYXZlcG9pbnQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgICAgICogQ3JlYXRlcyBhbiB1bm5hbWVkIHtAY29kZSBTYXZlcG9pbnR9IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTYXZlcG9pbnQgb2JqZWN0IGZvciB0aGlzIHNhdmVwb2ludC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNhdmVwb2ludH0gb2JqZWN0IGZvciB0aGlzIHNhdmVwb2ludC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNhdmVwb2ludCBzZXRTYXZlcG9pbnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIFNhdmVwb2ludCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKiBDcmVhdGVzIGEgbmFtZWQge0Bjb2RlIFNhdmVwb2ludH0gaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIG5ldyBTYXZlcG9pbnQuCi0gICAgICogQHJldHVybiBhIFNhdmVwb2ludCBvYmplY3QgZm9yIHRoaXMgc2F2ZXBvaW50LgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgbmV3IHtAY29kZSBTYXZlcG9pbnR9LgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgU2F2ZXBvaW50fSBvYmplY3QgZm9yIHRoaXMgc2F2ZXBvaW50LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2F2ZXBvaW50IHNldFNhdmVwb2ludChTdHJpbmcgbmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtNzI3LDEwICs3NzYsMTEgQEAKICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGEgdHJhbnNhY3Rpb24sIHRoZSByZXN1bHRzIGFyZQogICAgICAqIGltcGxlbWVudGF0aW9uIGRlZmluZWQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZXZlbAogICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgdG8gdXNlIGZyb20gdGhlIGZvbGxvd2luZwotICAgICAqICAgICAgICAgICAgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgOgorICAgICAqICAgICAgICAgICAgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXM6CiAgICAgICogICAgICAgICAgICA8dWw+CiAgICAgICogICAgICAgICAgICA8bGk+e0BsaW5rICNUUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRH0KICAgICAgKiAgICAgICAgICAgIDxsaT57QGxpbmsgI1RSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUR9CkBAIC03MzksMjEgKzc4OSwyMSBAQAogICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUgdmFsdWUgb2YKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5sZXZlbDwvY29kZT4gaXMgbm90IG9uZSBvZiB0aGUgZXhwZWN0ZWQgY29uc3RhbnQKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZXMuCisgICAgICogICAgICAgICAgICAge0Bjb2RlIGxldmVsfSBpcyBub3Qgb25lIG9mIHRoZSBleHBlY3RlZCBjb25zdGFudCB2YWx1ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oaW50IGxldmVsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgPGNvZGU+VHlwZU1hcDwvY29kZT4gZm9yIHRoaXMgY29ubmVjdGlvbi4gVGhlIGlucHV0Ci0gICAgICogPGNvZGU+bWFwPC9jb2RlPiBzaG91bGQgY29udGFpbiBtYXBwaW5ncyBiZXR3ZWVuIGNvbXBsZXggSmF2YSBhbmQgU1FMCi0gICAgICogdHlwZXMuCisgICAgICogU2V0cyB0aGUge0Bjb2RlIFR5cGVNYXB9IGZvciB0aGlzIGNvbm5lY3Rpb24uIFRoZSBpbnB1dCB7QGNvZGUgbWFwfQorICAgICAqIHNob3VsZCBjb250YWluIG1hcHBpbmdzIGJldHdlZW4gY29tcGxleCBKYXZhIGFuZCBTUUwgdHlwZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0eXBlIG1hcAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0eXBlIG1hcC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIGlmCi0gICAgICogICAgICAgICAgICAgPGNvZGU+bWFwPC9jb2RlPiBpcyBub3QgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1hcH0uCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2Ugb3IgaWYge0Bjb2RlCisgICAgICogICAgICAgICAgICAgbWFwfSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1hcH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHlwZU1hcChNYXA8U3RyaW5nLCBDbGFzczw/Pj4gbWFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRGF0YVRydW5jYXRpb24uamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RhdGFUcnVuY2F0aW9uLmphdmEKaW5kZXggNzE1MGVjNy4uYTQ3MmNjNSAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRGF0YVRydW5jYXRpb24uamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9EYXRhVHJ1bmNhdGlvbi5qYXZhCkBAIC0yMSw5ICsyMSwxMSBAQAogCiAvKioKICAqIEFuIGV4Y2VwdGlvbiB3aGljaCBpcyB0aHJvd24gd2hlbiBhIEpEQkMgZHJpdmVyIHVuZXhwZWN0ZWRseSB0cnVuY2F0ZXMgYSBkYXRhCi0gKiB2YWx1ZSBlaXRoZXIgd2hlbiByZWFkaW5nIG9yIHdoZW4gd3JpdGluZyBkYXRhLgotICogCi0gKiBUaGUgU1FMU3RhdGUgdmFsdWUgZm9yIGEgPGNvZGU+RGF0YVRydW5jYXRpb248L2NvZGU+IGlzIDxjb2RlPjAxMDA0PC9jb2RlPi4KKyAqIHZhbHVlIGVpdGhlciB3aGVuIHJlYWRpbmcgKHJlc3VsdGluZyBpbiB3YXJuaW5nKSwgb3Igd2hlbiB3cml0aW5nIGRhdGEKKyAqIChyZXN1bHRpbmcgaW4gYW4gZXJyb3IpLiBUaGUge0Bjb2RlIFNRTFN0YXRlfSBlcnJvciBjb2RlIGZvciB0cnVuY2F0ZWQgZGF0YQorICogaXMge0Bjb2RlIDAxMDA0fS4KKyAqICAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGF0YVRydW5jYXRpb24gZXh0ZW5kcyBTUUxXYXJuaW5nIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIApAQCAtNDYsMjMgKzQ4LDI1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIRV9FUlJPUl9DT0RFID0gMDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBEYXRhVHJ1bmNhdGlvbi4gVGhlIFJlYXNvbiBpcyBzZXQgdG8gIkRhdGEgdHJ1bmNhdGlvbiIsIHRoZQotICAgICAqIEVycm9yQ29kZSBpcyBzZXQgdG8gdGhlIFNRTEV4Y2VwdGlvbiBkZWZhdWx0IHZhbHVlIGFuZCBvdGhlciBmaWVsZHMgYXJlCi0gICAgICogc2V0IHRvIHRoZSB2YWx1ZXMgc3VwcGxpZWQgb24gdGhpcyBtZXRob2QuCisgICAgICogQ3JlYXRlcyB0aGUge0Bjb2RlIERhdGFUcnVuY2F0aW9ufSBvYmplY3QuIFRoZSByZWFzb24gaXMgc2V0IHRvIHtAY29kZQorICAgICAqICJEYXRhIHRydW5jYXRpb24ifSwgdGhlIHtAY29kZSBFcnJvckNvZGV9IGlzIHNldCB0byB0aGUge0Bjb2RlCisgICAgICogU1FMRXhjZXB0aW9ufSBkZWZhdWx0IHZhbHVlLCBhbmQgdGhlIG90aGVyIGZpZWxkcyBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMKKyAgICAgKiBzdXBwbGllZCBhcyBhcmd1bWVudHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgSW5kZXggdmFsdWUgb2YgdGhlIGNvbHVtbiB2YWx1ZSBvciBwYXJhbWV0ZXIgdGhhdCB3YXMKLSAgICAgKiAgICAgICAgICAgIHRydW5jYXRlZAorICAgICAqICAgICAgICAgICAgdHJ1bmNhdGVkLgogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgaXQgd2FzIGEgUGFyYW1ldGVyIHZhbHVlIHRoYXQgd2FzIHRydW5jYXRlZCwgZmFsc2UKLSAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIGl0IHdhcyBhIHBhcmFtZXRlciB2YWx1ZSB0aGF0IHdhcyB0cnVuY2F0ZWQsCisgICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAcGFyYW0gcmVhZAotICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgdHJ1bmNhdGlvbiBvY2N1cnJlZCBvbiBhIHJlYWQgb3BlcmF0aW9uLCBmYWxzZQotICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRydW5jYXRpb24gb2NjdXJyZWQgb24gYSByZWFkIG9wZXJhdGlvbiwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBwYXJhbSBkYXRhU2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIHRydW5jYXRlZCBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgdHJ1bmNhdGVkIGRhdGEuCiAgICAgICogQHBhcmFtIHRyYW5zZmVyU2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgYWZ0ZXIgdHJ1bmNhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgYWZ0ZXIgdHJ1bmNhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0YVRydW5jYXRpb24oaW50IGluZGV4LCBib29sZWFuIHBhcmFtZXRlciwgYm9vbGVhbiByZWFkLAogICAgICAgICAgICAgaW50IGRhdGFTaXplLCBpbnQgdHJhbnNmZXJTaXplKSB7CkBAIC03OCw3ICs4Miw4IEBACiAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlYWQvd3JpdHRlbi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlYWQgb3Igd3JpdHRlbi4gVGhlCi0gICAgICogICAgICAgICB2YWx1ZSBtYXkgYmUgc2V0IHRvIC0xIGlmIHRoZSBzaXplIGlzIHVua25vd24uCisgICAgICogICAgICAgICB2YWx1ZSBpcyBzZXQgdG8ge0Bjb2RlIC0xfSBpZiB0aGUgc2l6ZSBpcyB1bmtub3duLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGF0YVNpemUoKSB7CiAgICAgICAgIHJldHVybiBkYXRhU2l6ZTsKQEAgLTg4LDYgKzkzLDcgQEAKICAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIG9yIG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCB3YXMgdHJ1bmNhdGVkLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG51bWJlciBvZiB0aGUgY29sdW1uIG9yIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKICAgICAgICAgcmV0dXJuIGluZGV4OwpAQCAtOTYsOCArMTAyLDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHZhbHVlIHRydW5jYXRlZCB3YXMgYSBwYXJhbWV0ZXIgdmFsdWUgb3IgYSBjb2x1bW4gdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB0cnVuY2F0ZWQgd2FzIGEgUGFyYW1ldGVyIHZhbHVlLCBmYWxzZSBpZiBpdAotICAgICAqICAgICAgICAgd2FzIGEgY29sdW1uIHZhbHVlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHZhbHVlIHRydW5jYXRlZCB3YXMgYSBwYXJhbWV0ZXIgdmFsdWUsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIGl0IHdhcyBhIGNvbHVtbiB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYXJhbWV0ZXIoKSB7CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXI7CkBAIC0xMDcsMTggKzExNCwyMCBAQAogICAgICAqIEdldHMgd2hldGhlciB0aGUgdmFsdWUgd2FzIHRydW5jYXRlZCBvbiBhIHJlYWQgb3BlcmF0aW9uIG9yIGEgd3JpdGUKICAgICAgKiBvcGVyYXRpb24KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHdhcyB0cnVuY2F0ZWQgb24gYSByZWFkIG9wZXJhdGlvbiwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdmFsdWUgd2FzIHRydW5jYXRlZCBvbiBhIHJlYWQgb3BlcmF0aW9uLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVhZCgpIHsKICAgICAgICAgcmV0dXJuIHJlYWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdGhhdCB3YXMgYWN0dWFsbHkgcmVhZCBvciB3cml0dGVuCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdGhhdCB3YXMgYWN0dWFsbHkgcmVhZCBvciB3cml0dGVuLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkL3dyaXR0ZW4uIFRoZSB2YWx1ZSBtYXkgYmUgc2V0Ci0gICAgICogICAgICAgICB0byAtMSBpZiB0aGUgc2l6ZSBpcyB1bmtub3duLgorICAgICAqICAgICAgICAgdG8ge0Bjb2RlIC0xfSBpZiB0aGUgc2l6ZSBpcyB1bmtub3duLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNmZXJTaXplKCkgewogICAgICAgICByZXR1cm4gdHJhbnNmZXJTaXplOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRGF0YWJhc2VNZXRhRGF0YS5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRGF0YWJhc2VNZXRhRGF0YS5qYXZhCmluZGV4IDhjMGYxN2MuLjgyMjE5YzUgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RhdGFiYXNlTWV0YURhdGEuamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9EYXRhYmFzZU1ldGFEYXRhLmphdmEKQEAgLTE4LDI2MSArMTgsMzU5IEBACiBwYWNrYWdlIGphdmEuc3FsOwogCiAvKioKLSAqIEFuIGludGVyZmFjZSB3aGljaCBwcm92aWRlcyBjb21wcmVoZW5zaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhYmFzZS4KKyAqIEFuIGludGVyZmFjZSB3aGljaCBwcm92aWRlcyBjb21wcmVoZW5zaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhYmFzZQorICogbWFuYWdlbWVudCBzeXN0ZW0gYW5kIGl0cyBzdXBwb3J0ZWQgZmVhdHVyZXMuCiAgKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IEpEQkMgZHJpdmVyIHdyaXRlcnMgaW4gb3JkZXIgdG8gcHJvdmlkZQotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgRGF0YWJhc2UgY2FwYWJpbGl0aWVzIGFuZCB0aGUgSkRCQyBkcml2ZXIKLSAqIGNhcGFiaWxpdGllcyB0YWtlbiB0b2dldGhlci4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IEpEQkMgZHJpdmVyIHZlbmRvcnMgaW4gb3JkZXIgdG8gcHJvdmlkZQorICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UgY2FwYWJpbGl0aWVzIGluIGFzc29jaWF0aW9uIHdpdGgKKyAqIHRoZSBKREJDIGRyaXZlci4KKyAqIDwvcD4KICAqIDxwPgotICogU29tZSBvZiB0aGUgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZSB0YWtlIFN0cmluZyBwYXJhbWV0ZXJzIHdoaWNoIGFyZQotICogUGF0dGVybnMuIFdpdGhpbiB0aGVzZSBzdHJpbmcgUGF0dGVybnMsICclJyBhbmQgJ18nIGNoYXJhY3RlcnMgaGF2ZSBzcGVjaWFsCi0gKiBtZWFuaW5ncy4gJyUnIG1lYW5zICJtYXRjaCBhbnkgc3Vic3RyaW5nIG9mIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIi4gJ18nIG1lYW5zCi0gKiAibWF0Y2ggYW55IG9uZSBjaGFyYWN0ZXIiLiBPbmx5IG1ldGFkYXRhIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiBhcmUKLSAqIHJldHVybmVkLiBJZiBzdWNoIGEgc2VhcmNoIHBhdHRlcm4gc3RyaW5nIGlzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiwKLSAqIHRoYXQgYXJndW1lbnQncyBjcml0ZXJpYSBhcmUgZHJvcHBlZCBmcm9tIHRoZSBzZWFyY2guCi0gKiAKKyAqIFNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UgdGFrZSBzdHJpbmcgcGFyYW1ldGVycyB3aGljaCBhcmUKKyAqIHBhdHRlcm5zLiBXaXRoaW4gdGhlc2Ugc3RyaW5nIHBhdHRlcm5zLCB7QGNvZGUgJyUnfSBhbmQge0Bjb2RlICdfJ30KKyAqIGNoYXJhY3RlcnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzLiB7QGNvZGUgJyUnfSBtZWFucworICogIm1hdGNoIGFueSBzdWJzdHJpbmcgb2YgMCBvciBtb3JlIGNoYXJhY3RlcnMiLiB7QGNvZGUgJ18nfSBtZWFucworICogIm1hdGNoIGFueSBjaGFyYWN0ZXIiLiBPbmx5IG1ldGFkYXRhIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiBhcmUKKyAqIHJldHVybmVkLiBJZiBzdWNoIGEgc2VhcmNoIHBhdHRlcm4gc3RyaW5nIGlzIHNldCB0byB7QGNvZGUgbnVsbH0sIHRoYXQKKyAqIGFyZ3VtZW50J3MgY3JpdGVyaWEgYXJlIGRyb3BwZWQgZnJvbSB0aGUgc2VhcmNoLgorICogPC9wPgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VNZXRhRGF0YSB7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCBpdCBtYXkgbm90IGJlIHBlcm1pdHRlZCB0byBzdG9yZSA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMuCisgICAgICogU3RhdGVzIHRoYXQgaXQgbWF5IG5vdCBiZSBwZXJtaXR0ZWQgdG8gc3RvcmUge0Bjb2RlIE5VTEx9IHZhbHVlcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IGF0dHJpYnV0ZU5vTnVsbHMgPSAwOwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIHRoYXQgPGNvZGU+TlVMTDwvY29kZT4gdmFsdWVzIGFyZSBkZWZpbml0ZWx5IHBlcm1pdHRlZC4KKyAgICAgKiBTdGF0ZXMgdGhhdCB7QGNvZGUgTlVMTH0gdmFsdWVzIGFyZSBkZWZpbml0ZWx5IHBlcm1pdHRlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgYXR0cmlidXRlTnVsbGFibGUgPSAxOwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIHRoYXQgd2hldGhlciA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMgYXJlIHBlcm1pdHRlZCBpcyB1bmtub3duLgorICAgICAqIFN0YXRlcyB0aGF0IHdoZXRoZXIge0Bjb2RlIE5VTEx9IHZhbHVlcyBhcmUgcGVybWl0dGVkIGlzIHVua25vd24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBhdHRyaWJ1dGVOdWxsYWJsZVVua25vd24gPSAyOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoZSBiZXN0IHJvdyBpZGVudGlmaWVyIGlzIDxlbT5OT1Q8L2VtPiBhIHBzZXVkbyBjb2x1bW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmVzdFJvd05vdFBzZXVkbyA9IDE7CiAKICAgICAvKioKICAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgYmVzdCByb3cgaWRlbnRpZmllciBpcyBhIHBzZXVkbyBjb2x1bW4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmVzdFJvd1BzZXVkbyA9IDI7CiAKICAgICAvKioKICAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgdXNlZCBhcyB0aGUgc2NvcGUgZm9yCiAgICAgICogdGhlIGJlc3Qgcm93IGlkZW50aWZpZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmVzdFJvd1Nlc3Npb24gPSAyOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgYmVzdCByb3cgaWRlbnRpZmllciBzY29wZSBsYXN0cyBvbmx5IHdoaWxlIHRoZSByb3cgaXMgYmVpbmcKICAgICAgKiB1c2VkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJlc3RSb3dUZW1wb3JhcnkgPSAwOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyB1c2VkIGFzIHRoZSBzY29wZQogICAgICAqIGZvciB0aGUgYmVzdCByb3cgaWRlbnRpZmllci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBiZXN0Um93VHJhbnNhY3Rpb24gPSAxOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgdGhlIGJlc3Qgcm93IGlkZW50aWZpZXIgbWF5IG9yIG1heSBub3QgYmUgYSBwc2V1ZG8gY29sdW1uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJlc3RSb3dVbmtub3duID0gMDsKIAogICAgIC8qKgotICAgICAqIFN0YXRlcyB0aGF0IHRoZSBjb2x1bW4gbWlnaHQgbm90IGFsbG93IDxjb2RlPk5VTEw8L2NvZGU+IHZhbHVlcy4KKyAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgY29sdW1uIG11c3Qgbm90IGFsbG93IHtAY29kZSBOVUxMfSB2YWx1ZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uTm9OdWxscyA9IDA7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgY29sdW1uIGRlZmluaXRlbHkgYWxsb3dzIDxjb2RlPk5VTEw8L2NvZGU+IHZhbHVlcy4KKyAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgY29sdW1uIGRlZmluaXRlbHkgYWxsb3dzIHtAY29kZSBOVUxMfSB2YWx1ZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uTnVsbGFibGUgPSAxOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgaXQgaXMgdW5rbm93biB3aGV0aGVyIHRoZSBjb2x1bW5zIG1heSBiZSBudWxsZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uTnVsbGFibGVVbmtub3duID0gMjsKIAogICAgIC8qKgotICAgICAqIEZvciB0aGUgY29sdW1uIFVQREFURV9SVUxFLCBTdGF0ZXMgdGhhdCB3aGVuIHRoZSBwcmltYXJ5IGtleSBpcyB1cGRhdGVkLAotICAgICAqIHRoZSBmb3JlaWduIGtleSAoaW1wb3J0ZWQga2V5KSBpcyBjaGFuZ2VkIHRvIGFncmVlIHdpdGggaXQuCisgICAgICogRm9yIHRoZSBjb2x1bW4ge0Bjb2RlIFVQREFURV9SVUxFfSwgc3RhdGVzIHRoYXQgd2hlbiB0aGUgcHJpbWFyeSBrZXkgaXMKKyAgICAgKiB1cGRhdGVkLCB0aGUgZm9yZWlnbiBrZXkgKGltcG9ydGVkIGtleSkgaXMgY2hhbmdlZCBhY2NvcmRpbmdseS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbXBvcnRlZEtleUNhc2NhZGUgPSAwOwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIGRlZmVycmFiaWxpdHkuCisgICAgICogU3RhdGVzIHRoYXQgdGhlIGV2YWx1YXRpb24gb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgaXMgZGVmZXJyZWQgKGRlbGF5ZWQKKyAgICAgKiB1bnRpbCBjb21taXQpLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGltcG9ydGVkS2V5SW5pdGlhbGx5RGVmZXJyZWQgPSA1OwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIGRlZmVyLWFiaWxpdHkuCisgICAgICogU3RhdGVzIHRoYXQgdGhlIGV2YWx1YXRpb24gb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludCBpcyB7QGNvZGUgSU1NRURJQVRFfQorICAgICAqIC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbXBvcnRlZEtleUluaXRpYWxseUltbWVkaWF0ZSA9IDY7CiAKICAgICAvKioKLSAgICAgKiBGb3IgdGhlIGNvbHVtbnMgVVBEQVRFX1JVTEUgYW5kIERFTEVURV9SVUxFLCBTdGF0ZXMgdGhhdCBpZiB0aGUgcHJpbWFyeQotICAgICAqIGtleSBoYXMgYmVlbiBpbXBvcnRlZCwgaXQgY2Fubm90IGJlIHVwZGF0ZWQgb3IgZGVsZXRlZC4KKyAgICAgKiBGb3IgdGhlIGNvbHVtbnMge0Bjb2RlIFVQREFURV9SVUxFfSBhbmQge0Bjb2RlIERFTEVURV9SVUxFfSwgc3RhdGVzIHRoYXQKKyAgICAgKiBpZiB0aGUgcHJpbWFyeSBrZXkgaGFzIGJlZW4gaW1wb3J0ZWQsIGl0IGNhbm5vdCBiZSB1cGRhdGVkIG9yIGRlbGV0ZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1wb3J0ZWRLZXlOb0FjdGlvbiA9IDM7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgZGVmZXItYWJpbGl0eS4KKyAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgZXZhbHVhdGlvbiBvZiBmb3JlaWduIGtleSBjb25zdHJhaW50IG11c3Qgbm90IGJlIHtAY29kZQorICAgICAqIERFRkVSUkVEfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbXBvcnRlZEtleU5vdERlZmVycmFibGUgPSA3OwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgYSBwcmltYXJ5IGtleSBtdXN0IG5vdCBiZSB1cGRhdGVkIHdoZW4gaW1wb3J0ZWQgYXMgYSBmb3JlaWduCi0gICAgICoga2V5IGJ5IHNvbWUgb3RoZXIgdGFibGUuIFVzZWQgZm9yIHRoZSBjb2x1bW4gVVBEQVRFX1JVTEUuCisgICAgICoga2V5IGJ5IHNvbWUgb3RoZXIgdGFibGUuIFVzZWQgZm9yIHRoZSBjb2x1bW4ge0Bjb2RlIFVQREFURV9SVUxFfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbXBvcnRlZEtleVJlc3RyaWN0ID0gMTsKIAogICAgIC8qKgogICAgICAqIFN0YXRlcyB0aGF0IHdoZW4gdGhlIHByaW1hcnkga2V5IGlzIG1vZGlmaWVkICh1cGRhdGVkIG9yIGRlbGV0ZWQpIHRoZQogICAgICAqIGZvcmVpZ24gKGltcG9ydGVkKSBrZXkgaXMgY2hhbmdlZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gQXBwbGllcyB0byB0aGUKLSAgICAgKiBVUERBVEVfUlVMRSBhbmQgREVMRVRFX1JVTEUgY29sdW1ucy4KKyAgICAgKiB7QGNvZGUgVVBEQVRFX1JVTEV9IGFuZCB7QGNvZGUgREVMRVRFX1JVTEV9IGNvbHVtbnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1wb3J0ZWRLZXlTZXREZWZhdWx0ID0gNDsKIAogICAgIC8qKgogICAgICAqIFN0YXRlcyB0aGF0IHdoZW4gdGhlIHByaW1hcnkga2V5IGlzIG1vZGlmaWVkICh1cGRhdGVkIG9yIGRlbGV0ZWQpIHRoZQotICAgICAqIGZvcmVpZ24gKGltcG9ydGVkKSBrZXkgaXMgY2hhbmdlZCB0byA8Y29kZT5OVUxMPC9jb2RlPi4gQXBwbGllcyB0byB0aGUKLSAgICAgKiBVUERBVEVfUlVMRSBhbmQgREVMRVRFX1JVTEUgY29sdW1ucy4KKyAgICAgKiBmb3JlaWduIChpbXBvcnRlZCkga2V5IGlzIGNoYW5nZWQgdG8ge0Bjb2RlIE5VTEx9LiBBcHBsaWVzIHRvIHRoZSB7QGNvZGUKKyAgICAgKiBVUERBVEVfUlVMRX0gYW5kIHtAY29kZSBERUxFVEVfUlVMRX0gY29sdW1ucy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbXBvcnRlZEtleVNldE51bGwgPSAyOwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIHRoYXQgdGhpcyBjb2x1bW4gc3RvcmVzIElOIHR5cGUgcGFyYW1ldGVycy4KKyAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgY29sdW1uIHN0b3JlcyB7QGNvZGUgSU59IHR5cGUgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVDb2x1bW5JbiA9IDE7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCB0aGlzIGNvbHVtbiBzdG9yZXMgSU5PVVQgdHlwZSBwYXJhbWV0ZXJzLgorICAgICAqIFN0YXRlcyB0aGF0IHRoaXMgY29sdW1uIHN0b3JlcyB7QGNvZGUgSU5PVVR9IHR5cGUgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVDb2x1bW5Jbk91dCA9IDI7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCB0aGlzIGNvbHVtbiBzdG9yZXMgT1VUIHR5cGUgcGFyYW1ldGVycy4KKyAgICAgKiBTdGF0ZXMgdGhhdCB0aGlzIGNvbHVtbiBzdG9yZXMge0Bjb2RlIE9VVH0gdHlwZSBwYXJhbWV0ZXJzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2NlZHVyZUNvbHVtbk91dCA9IDQ7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgY29sdW1uIHN0b3JlcyByZXN1bHRzCisgICAgICogU3RhdGVzIHRoYXQgdGhlIGNvbHVtbiBzdG9yZXMgcmVzdWx0cy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVDb2x1bW5SZXN1bHQgPSAzOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgdGhlIGNvbHVtbiBzdG9yZXMgcmV0dXJuIHZhbHVlcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVDb2x1bW5SZXR1cm4gPSA1OwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgdHlwZSBvZiB0aGUgY29sdW1uIGlzIHVua25vd24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VkdXJlQ29sdW1uVW5rbm93biA9IDA7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMgYXJlIG5vdCBwZXJtaXR0ZWQuCisgICAgICogU3RhdGVzIHRoYXQge0Bjb2RlIE5VTEx9IHZhbHVlcyBhcmUgbm90IHBlcm1pdHRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVOb051bGxzID0gMDsKIAogICAgIC8qKgogICAgICAqIFN0YXRlcyB0aGF0IHRoZSBwcm9jZWR1cmUgZG9lcyBub3QgcmV0dXJuIGEgcmVzdWx0LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2NlZHVyZU5vUmVzdWx0ID0gMTsKIAogICAgIC8qKgotICAgICAqIFN0YXRlcyB0aGF0IDxjb2RlPk5VTEw8L2NvZGU+IHZhbHVlcyBhcmUgcGVybWl0dGVkLgorICAgICAqIFN0YXRlcyB0aGF0IHtAY29kZSBOVUxMfSB2YWx1ZXMgYXJlIHBlcm1pdHRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVOdWxsYWJsZSA9IDE7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCB3aGV0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IHZhbHVlcyBhcmUgcGVybWl0dGVkIGlzIHVua25vd24uCisgICAgICogU3RhdGVzIHRoYXQgaXQgaXMgdW5rbm93biB3aGV0aGVyIHtAY29kZSBOVUxMfSB2YWx1ZXMgYXJlIHBlcm1pdHRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVOdWxsYWJsZVVua25vd24gPSAyOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgaXQgaXMgdW5rbm93biB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2VkdXJlIHJldHVybnMgYSByZXN1bHQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VkdXJlUmVzdWx0VW5rbm93biA9IDA7CiAKICAgICAvKioKICAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgcHJvY2VkdXJlIHJldHVybnMgYSByZXN1bHQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VkdXJlUmV0dXJuc1Jlc3VsdCA9IDI7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgdmFsdWUgaXMgYW4gU1FMOTkgU1FMU1RBVEUgdmFsdWUuCisgICAgICogU3RhdGVzIHRoYXQgdGhlIHZhbHVlIGlzIGFuIFNRTDk5IHtAY29kZSBTUUxTVEFURX0gdmFsdWUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3FsU3RhdGVTUUw5OSA9IDI7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgdmFsdWUgaXMgYW4gU1FMIENMSSBTUUxTVEFURSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IFgvT3BlbgotICAgICAqICh3aG8gYXJlIG5vdyBrbm93IGFzIE9wZW4gR3JvdXApIC4KKyAgICAgKiBTdGF0ZXMgdGhhdCB0aGUgdmFsdWUgaXMgYW4gU1FMIHtAY29kZSBDTEkgU1FMU1RBVEV9IHZhbHVlIGFzIGRlZmluZWQgYnkKKyAgICAgKiB0aGUgWC9PcGVuIHN0YW5kYXJkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNxbFN0YXRlWE9wZW4gPSAxOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgdGhpcyB0YWJsZSBpbmRleCBpcyBhIGNsdXN0ZXJlZCBpbmRleC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IHRhYmxlSW5kZXhDbHVzdGVyZWQgPSAxOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoYXQgdGhpcyB0YWJsZSBpbmRleCBpcyBhIGhhc2hlZCBpbmRleC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IHRhYmxlSW5kZXhIYXNoZWQgPSAyOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoaXMgdGFibGUncyBpbmRleCBpcyBuZWl0aGVyIGEgY2x1c3RlcmVkIGluZGV4LCBub3QgYSBoYXNoZWQKICAgICAgKiBpbmRleCwgYW5kIG5vdCBhIHRhYmxlIHN0YXRpc3RpY3MgaW5kZXg7IGkuZS4gaXQgaXMgc29tZXRoaW5nIGVsc2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB0YWJsZUluZGV4T3RoZXIgPSAzOwogCiAgICAgLyoqCiAgICAgICogU3RhdGVzIHRoaXMgY29sdW1uIGhhcyB0aGUgdGFibGUncyBzdGF0aXN0aWNzLCBhbmQgdGhhdCBpdCBpcyByZXR1cm5lZCBpbgogICAgICAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRhYmxlJ3MgaW5kZXggZGVzY3JpcHRpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB0YWJsZUluZGV4U3RhdGlzdGljID0gMDsKIAogICAgIC8qKgotICAgICAqIFN0YXRlcyB0aGF0IGEgPGNvZGU+TlVMTDwvY29kZT4gdmFsdWUgaXMgPGVtPk5PVDwvZW0+IHBlcm1pdHRlZCBmb3IKKyAgICAgKiBTdGF0ZXMgdGhhdCBhIHtAY29kZSBOVUxMfSB2YWx1ZSBpcyA8ZW0+Tk9UPC9lbT4gcGVybWl0dGVkIGZvcgogICAgICAqIHRoaXMgZGF0YSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR5cGVOb051bGxzID0gMDsKIAogICAgIC8qKgotICAgICAqIFN0YXRlcyB0aGF0IGEgPGNvZGU+TlVMTDwvY29kZT4gdmFsdWUgaXMgcGVybWl0dGVkIGZvciB0aGlzIGRhdGEgdHlwZS4KKyAgICAgKiBTdGF0ZXMgdGhhdCBhIHtAY29kZSBOVUxMfSB2YWx1ZSBpcyBwZXJtaXR0ZWQgZm9yIHRoaXMgZGF0YSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR5cGVOdWxsYWJsZSA9IDE7CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhhdCBpdCBpcyB1bmtub3duIGlmIGEgPGNvZGU+TlVMTDwvY29kZT4gdmFsdWUgaXMgcGVybWl0dGVkIGZvcgorICAgICAqIFN0YXRlcyB0aGF0IGl0IGlzIHVua25vd24gaWYgYSB7QGNvZGUgTlVMTH0gdmFsdWUgaXMgcGVybWl0dGVkIGZvcgogICAgICAqIHRoaXMgZGF0YSB0eXBlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR5cGVOdWxsYWJsZVVua25vd24gPSAyOwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIHRoYXQgb25lIGNhbiBiYXNlIGFsbCBXSEVSRSBzZWFyY2ggY2xhdXNlcyBleGNlcHQgV0hFUkUgLgorICAgICAqIFN0YXRlcyB0aGF0IHRoaXMgY29sdW1uIHNoYWxsIG5vdCBiZSB1c2VkIGZvciB7QGNvZGUgV0hFUkV9IHN0YXRlbWVudHMKKyAgICAgKiB3aXRoIGEge0Bjb2RlIExJS0V9IGNsYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlUHJlZEJhc2ljID0gMjsKIAogICAgIC8qKgotICAgICAqIFN0YXRlcyB0aGF0IDxjb2RlPldIRVJFPC9jb2RlPiBpcyB0aGUgb25seSBXSEVSRSBzZWFyY2ggY2xhdXNlIHRoYXQgbWF5Ci0gICAgICogYmUgYmFzZWQgb24gdGhpcyB0eXBlLgorICAgICAqIFN0YXRlcyB0aGF0IHRoaXMgY29sdW1uIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSB7QGNvZGUgV0hFUkUuLi5MSUtFfQorICAgICAqIHN0YXRlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlUHJlZENoYXIgPSAxOwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIHRoYXQgdGhpcyB0eXBlIGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+V0hFUkU8L2NvZGU+IHNlYXJjaAotICAgICAqIGNsYXVzZXMuCisgICAgICogU3RhdGVzIHRoYXQgdGhpcyBjb2x1bW4gZG9lcyBub3Qgc3VwcG9ydCBzZWFyY2hlcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlUHJlZE5vbmUgPSAwOwogCiAgICAgLyoqCi0gICAgICogU3RhdGVzIHRoYXQgYWxsIFdIRVJFIHNlYXJjaCBjbGF1c2VzIG1heSBiZSBiYXNlZCBvbiB0aGlzIHR5cGUuCisgICAgICogU3RhdGVzIHRoYXQgdGhlIGNvbHVtbiBpcyBzZWFyY2hhYmxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR5cGVTZWFyY2hhYmxlID0gMzsKIApAQCAtMjkyLDM1ICszOTAsMzggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB2ZXJzaW9uQ29sdW1uVW5rbm93biA9IDA7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYWxsIHByb2NlZHVyZXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0UHJvY2VkdXJlczwvY29kZT4KLSAgICAgKiBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjdXJyZW50IHVzZXIuCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbCBwcm9jZWR1cmVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvY2VkdXJlc30gY2FuIGJlCisgICAgICogY2FsbGVkIGJ5IHRoZSBjdXJyZW50IHVzZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgcHJvY2VkdXJlcyBjYW4gYmUgY2FsbGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgY3VycmVudCB1c2VyLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFsbCBwcm9jZWR1cmVzIGNhbiBiZSBjYWxsZWQgYnkgdGhlIGN1cnJlbnQgdXNlciwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWxsUHJvY2VkdXJlc0FyZUNhbGxhYmxlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBhbGwgdGhlIHRhYmxlcyByZXR1cm5lZCBieSA8Y29kZT5nZXRUYWJsZXM8L2NvZGU+IGNhbgotICAgICAqIGJlIHVzZWQgYnkgdGhlIGN1cnJlbnQgdXNlciBpbiBhIFNFTEVDVCBzdGF0ZW1lbnQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbCB0aGUgdGFibGVzIHJldHVybmVkIGJ5IHtAY29kZSBnZXRUYWJsZXN9IGNhbiBiZSB1c2VkCisgICAgICogYnkgdGhlIGN1cnJlbnQgdXNlciBpbiBhIHtAY29kZSBTRUxFQ1R9IHN0YXRlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCB0aGUgdGFibGVzIGNhbiBiZSB1c2VkLDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsIHRoZSB0YWJsZXMgY2FuIGJlIHVzZWQse0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWxsVGFibGVzQXJlU2VsZWN0YWJsZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGEgZGF0YSBkZWZpbml0aW9uIHN0YXRlbWVudCBpbiBhIHRyYW5zYWN0aW9uIGZvcmNlcyBhIGNvbW1pdAotICAgICAqIG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBkYXRhIGRlZmluaXRpb24gc3RhdGVtZW50IGluIGEgdHJhbnNhY3Rpb24gZm9yY2VzIGEge0Bjb2RlCisgICAgICogY29tbWl0fSBvZiB0aGUgdHJhbnNhY3Rpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RhdGVtZW50IGZvcmNlcyBhIGNvbW1pdCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3RhdGVtZW50IGZvcmNlcyBhIGNvbW1pdCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGF0YURlZmluaXRpb25DYXVzZXNUcmFuc2FjdGlvbkNvbW1pdCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTMyOCwxMjYgKzQyOSwxMjkgQEAKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGlnbm9yZXMgZGF0YSBkZWZpbml0aW9uIHN0YXRlbWVudHMgd2l0aGluIGEKICAgICAgKiB0cmFuc2FjdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkYXRhYmFzZSBpZ25vcmVzIGEgZGF0YSBkZWZpbml0aW9uCi0gICAgICogICAgICAgICBzdGF0ZW1lbnQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGF0YWJhc2UgaWdub3JlcyBhIGRhdGEgZGVmaW5pdGlvbiBzdGF0ZW1lbnQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRhdGFEZWZpbml0aW9uSWdub3JlZEluVHJhbnNhY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgd2hldGhlciBhIHZpc2libGUgcm93IGRlbGV0ZSBjYW4gYmUgZGV0ZWN0ZWQgYnkgY2FsbGluZwotICAgICAqIDxjb2RlPlJlc3VsdFNldC5yb3dEZWxldGVkPC9jb2RlPi4KKyAgICAgKiB7QGxpbmsgUmVzdWx0U2V0I3Jvd0RlbGV0ZWR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgUmVzdWx0U2V0IGludm9sdmVkOgotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZPC9jb2RlPiwKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9JTlNFTlNJVElWRTwvY29kZT4sIG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFPC9jb2RlPgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZpc2libGUgcm93IGRlbGV0ZSBjYW4gYmUgZGV0ZWN0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gaW52b2x2ZWQ6IHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZfSwge0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9LCBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkV9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHZpc2libGUgcm93IGRlbGV0ZSBjYW4gYmUgZGV0ZWN0ZWQsIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZXNBcmVEZXRlY3RlZChpbnQgdHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmV0dXJuIHZhbHVlIG9mIDxjb2RlPmdldE1heFJvd1NpemU8L2NvZGU+IGluY2x1ZGVzCi0gICAgICogdGhlIFNRTCBkYXRhIHR5cGVzIDxjb2RlPkxPTkdWQVJDSEFSPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5MT05HVkFSQklOQVJZPC9jb2RlPi4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGNvZGUgZ2V0TWF4Um93U2l6ZX0gaW5jbHVkZXMgdGhlCisgICAgICogU1FMIGRhdGEgdHlwZXMge0Bjb2RlIExPTkdWQVJDSEFSfSBhbmQge0Bjb2RlIExPTkdWQVJCSU5BUll9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJldHVybiB2YWx1ZSBpbmNsdWRlcwotICAgICAqICAgICAgICAgPGNvZGU+TE9OR1ZBUkJJTkFSWTwvY29kZT4gYW5kIDxjb2RlPkxPTkdWQVJDSEFSPC9jb2RlPiwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJldHVybiB2YWx1ZSBpbmNsdWRlcyB7QGNvZGUgTE9OR1ZBUkJJTkFSWX0KKyAgICAgKiAgICAgICAgIGFuZCB7QGNvZGUgTE9OR1ZBUkNIQVJ9LCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRvZXNNYXhSb3dTaXplSW5jbHVkZUJsb2JzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKLSAgICAgKiBmb3IgYW4gU1FMIFVzZXIgRGVmaW5lZCBUeXBlIChVRFQpIGZvciBhIHNwZWNpZmllZCBzY2hlbWEgYW5kIGNhdGFsb2cuCi0gICAgICogVGhlIGRlc2NyaXB0aW9ucyByZXR1cm5lZCBhcmUgb3JkZXJlZCBieSA8Y29kZT5UWVBFX1NDSEVNPC9jb2RlPiwKLSAgICAgKiA8Y29kZT5UWVBFX05BTUU8L2NvZGU+IGFuZCBPUkRJTkFMX1BPU0lUSU9OLiBUaGUgZGVzY3JpcHRpb25zIGRvIG5vdAotICAgICAqIGNvbnRhaW4gaW5oZXJpdGVkIGF0dHJpYnV0ZXMuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBSZXN1bHRTZXR9IGRlc2NyaWJpbmcgYSBzdWJzZXQgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgYSAKKyAgICAgKiBzcGVjaWZpZWQgU1FMIFVzZXIgRGVmaW5lZCBUeXBlIChVRFQpIGZvciBhIHNwZWNpZmllZCBzY2hlbWEgYW5kIGNhdGFsb2cuCisgICAgICogVGhlIHN1YnNldCBpcyBkZXRlcm1pbmVkIGJ5IHJlc3RyaWN0aW5nIHRvIHRob3NlIGF0dHJpYnV0ZXMgd2hvc2UgCisgICAgICogbmFtZSBtYXRjaGVzIHRoZSB7QGNvZGUgYXR0cmlidXRlTmFtZVBhdHRlcm59IGFuZCB3aG9zZSB0eXBlIG5hbWUgCisgICAgICogbWF0Y2hlcyB0aGUge0Bjb2RlIHR5cGVOYW1lUGF0dGVybn0uIEVhY2ggcm93IG9mIHRoZSB7QGNvZGUgUmVzdWx0U2V0fQorICAgICAqIGRlc2NyaWJlcyBvbmUgYXR0cmlidXRlLCBhbmQgdGhlIHJvd3MgYXJlIG9yZGVyZWQgYnkgdGhlIGNvbHVtbnMge0Bjb2RlIFRZUEVfU0NIRU19LCAKKyAgICAgKiB7QGNvZGUgVFlQRV9OQU1FfSBhbmQge0Bjb2RlIE9SRElOQUxfUE9TSVRJT059LiBJbmhlcml0ZWQgYXR0cmlidXRlcworICAgICAqIGFyZSBub3QgaW5jbHVkZWQuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHJldHVybmVkIFJlc3VsdFNldCBvYmplY3QgaGFzIHJvd3Mgd2l0aCB0aGUgZm9sbG93aW5nIGNvbHVtbiBuYW1lcwotICAgICAqIGFuZCBtZWFuaW5nczoKKyAgICAgKiBUaGUgY29sdW1ucyBvZiB0aGUgcmV0dXJuZWQge0Bjb2RlIFJlc3VsdFNldH0gb2JqZWN0IGhhdmUgdGhlIGZvbGxvd2luZworICAgICAqIG5hbWVzIGFuZCBtZWFuaW5nczoKICAgICAgKiA8b2w+Ci0gICAgICogPGxpPjxjb2RlPlRZUEVfQ0FUPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBUeXBlIENhdGFsb2cgbmFtZSAocG9zc2libHkKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT48Y29kZT5UWVBFX1NDSEVNPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBUeXBlIFNjaGVtYSBuYW1lIChwb3NzaWJseQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlRZUEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSB0aGUgVHlwZSBuYW1lPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+QVRUUl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBBdHRyaWJ1dGUgbmFtZTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkRBVEFfVFlQRTwvY29kZT4gLSBpbnQgLSB0aGUgQXR0cmlidXRlIHR5cGUgYXMgZGVmaW5lZCBpbgotICAgICAqIDxjb2RlPmphdmEuc3FsLlR5cGVzPC9jb2RlPjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkFUVFJfVFlQRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBBdHRyaWJ1dGUgdHlwZSBuYW1lLgotICAgICAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgZGF0YSBzb3VyY2UuIEZvciBhIDxjb2RlPlVEVDwvY29kZT4gdGhlIG5hbWUgaXMKLSAgICAgKiBmdWxseSBxdWFsaWZpZWQuIEZvciBhIDxjb2RlPlJFRjwvY29kZT4gaXQgaXMgYm90aCBmdWxseSBxdWFsaWZpZWQgYW5kCi0gICAgICogcmVwcmVzZW50cyB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIHJlZmVyZW5jZS48L2xpPgotICAgICAqIDxsaT48Y29kZT5BVFRSX1NJWkU8L2NvZGU+IC0gaW50IC0gdGhlIENvbHVtbiBzaXplLiBXaGVuIHJlZmVycmluZyB0bwotICAgICAqIGNoYXIgYW5kIGRhdGUgdHlwZXMgdGhpcyB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycy4gV2hlbgotICAgICAqIHJlZmVycmluZyB0byBudW1lcmljIHR5cGVzIGlzIGlzIHRoZSBwcmVjaXNpb24uPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+REVDSU1BTF9ESUdJVFM8L2NvZGU+IC0gaW50IC0gaG93IG1hbnkgZnJhY3Rpb25hbCBkaWdpdHMgYXJlCisgICAgICogPGxpPntAY29kZSBUWVBFX0NBVH0gLSBTdHJpbmcgLSB0aGUgdHlwZSBjYXRhbG9nIG5hbWUgKHBvc3NpYmx5IHtAY29kZQorICAgICAqIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBUWVBFX1NDSEVNfSAtIFN0cmluZyAtIHRoZSB0eXBlIHNjaGVtYSBuYW1lIChwb3NzaWJseSB7QGNvZGUKKyAgICAgKiBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVFlQRV9OQU1FfSAtIFN0cmluZyAtIHRoZSB0eXBlIG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgQVRUUl9OQU1FfSAtIFN0cmluZyAtIHRoZSBhdHRyaWJ1dGUgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBEQVRBX1RZUEV9IC0gaW50IC0gdGhlIGF0dHJpYnV0ZSB0eXBlIGFzIGRlZmluZWQgaW4ge0Bjb2RlCisgICAgICogamF2YS5zcWwuVHlwZXN9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEFUVFJfVFlQRV9OQU1FfSAtIFN0cmluZyAtIHRoZSBhdHRyaWJ1dGUgdHlwZSBuYW1lLiBUaGlzCisgICAgICogZGVwZW5kcyBvbiB0aGUgZGF0YSBzb3VyY2UuIEZvciBhIHtAY29kZSBVRFR9IHRoZSBuYW1lIGlzIGZ1bGx5CisgICAgICogcXVhbGlmaWVkLiBGb3IgYSB7QGNvZGUgUkVGfSBpdCBpcyBib3RoIGZ1bGx5IHF1YWxpZmllZCBhbmQgcmVwcmVzZW50cworICAgICAqIHRoZSB0YXJnZXQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlLjwvbGk+CisgICAgICogPGxpPntAY29kZSBBVFRSX1NJWkV9IC0gaW50IC0gdGhlIGNvbHVtbiBzaXplLiBXaGVuIHJlZmVycmluZyB0byBjaGFyIGFuZAorICAgICAqIGRhdGUgdHlwZXMgdGhpcyB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycy4gV2hlbiByZWZlcnJpbmcKKyAgICAgKiB0byBudW1lcmljIHR5cGVzIGlzIGlzIHRoZSBwcmVjaXNpb24uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERFQ0lNQUxfRElHSVRTfSAtIGludCAtIGhvdyBtYW55IGZyYWN0aW9uYWwgZGlnaXRzIGFyZQogICAgICAqIHN1cHBvcnRlZDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPk5VTV9QUkVDX1JBRElYPC9jb2RlPiAtIGludCAtIG51bWVyaWMgdmFsdWVzIHJhZGl4PC9saT4KLSAgICAgKiA8bGk+PGNvZGU+TlVMTEFCTEU8L2NvZGU+IC0gaW50IC0gd2hldGhlciA8Y29kZT5OVUxMPC9jb2RlPiBpcwotICAgICAqIHBlcm1pdHRlZDoKKyAgICAgKiA8bGk+e0Bjb2RlIE5VTV9QUkVDX1JBRElYfSAtIGludCAtIG51bWVyaWMgdmFsdWVzIHJhZGl4PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIE5VTExBQkxFfSAtIGludCAtIHdoZXRoZXIge0Bjb2RlIE5VTEx9IGlzIHBlcm1pdHRlZDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuYXR0cmlidXRlTm9OdWxscyAtIG1pZ2h0IG5vdCBhbGxvdwotICAgICAqIDxjb2RlPk5VTEw8L2NvZGU+czwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuYXR0cmlidXRlTnVsbGFibGUgLSA8Y29kZT5OVUxMPC9jb2RlPnMKLSAgICAgKiBkZWZpbml0ZWx5IHBlcm1pdHRlZDwvbGk+CisgICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuYXR0cmlidXRlTm9OdWxscyAtIHtAY29kZSBOVUxMfSB2YWx1ZXMgbm90IHBlcm1pdHRlZDwvbGk+CisgICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuYXR0cmlidXRlTnVsbGFibGUgLSB7QGNvZGUgTlVMTH0gdmFsdWVzIGRlZmluaXRlbHkKKyAgICAgKiBwZXJtaXR0ZWQ8L2xpPgogICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmF0dHJpYnV0ZU51bGxhYmxlVW5rbm93biAtIHVua25vd248L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+UkVNQVJLUzwvY29kZT4gLSBTdHJpbmcgLSBBIGNvbW1lbnQgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlCi0gICAgICogKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPkFUVFJfREVGIC0gU3RyaW5nIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSAocG9zc2libHkKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT48Y29kZT5TUUxfREFUQV9UWVBFPC9jb2RlPiAtIGludCAtIG5vdCB1c2VkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFJFTUFSS1N9IC0gU3RyaW5nIC0gYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZQorICAgICAqIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+QVRUUl9ERUYgLSBTdHJpbmcgLSBEZWZhdWx0IHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIChwb3NzaWJseSB7QGNvZGUKKyAgICAgKiBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgU1FMX0RBVEFfVFlQRX0gLSBpbnQgLSBub3QgdXNlZDwvbGk+CiAgICAgICogPGxpPlNRTF9EQVRFVElNRV9TVUIgLSBpbnQgLSBub3QgdXNlZDwvbGk+Ci0gICAgICogPGxpPkNIQVJfT0NURVRfTEVOR1RIIC0gaW50IC0gRm9yIDxjb2RlPkNIQVI8L2NvZGU+IHR5cGVzLCB0aGUgbWF4Ci0gICAgICogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjb2x1bW48L2xpPgotICAgICAqIDxsaT5PUkRJTkFMX1BPU0lUSU9OIC0gaW50IC0gVGhlIEluZGV4IG9mIHRoZSBjb2x1bW4gaW4gdGhlIFRhYmxlIChiYXNlZAotICAgICAqIG9uIDEpPC9saT4KLSAgICAgKiA8bGk+SVNfTlVMTEFCTEUgLSBTdHJpbmcgLSAiTk8iID0gY29sdW1uIGRvZXMgbm90IGFsbG93Ci0gICAgICogPGNvZGU+TlVMTDwvY29kZT5zLCAiWUVTIiA9IGNvbHVtbiBhbGxvd3MgPGNvZGU+TlVMTDwvY29kZT5zICIiID0KLSAgICAgKiA8Y29kZT5OVUxMPC9jb2RlPiBzdGF0dXMgdW5rbm93bjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlNDT1BFX0NBVEFMT0c8L2NvZGU+IC0gU3RyaW5nIC0gQ2F0YWxvZyBmb3IgdGFibGUsCi0gICAgICogPGNvZGU+U0NPUEU8L2NvZGU+IG9mIFJlZmVyZW5jZSBhdHRyaWJ1dGUuIE5VTEwgaWYKLSAgICAgKiA8Y29kZT5EQVRBX1RZUEU8L2NvZGU+IGlzIG5vdCBSRUYuPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+U0NPUEVfU0NIRU1BPC9jb2RlPiAtIFN0cmluZyAtIFNjaGVtYSBmb3IgdGFibGUsCi0gICAgICogPGNvZGU+U0NPUEU8L2NvZGU+IG9mIFJlZmVyZW5jZSBhdHRyaWJ1dGUuIE5VTEwgaWYKLSAgICAgKiA8Y29kZT5EQVRBX1RZUEU8L2NvZGU+IGlzIG5vdCBSRUYuPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+U0NPUEVfVEFCTEU8L2NvZGU+IC0gU3RyaW5nIC0gVGFibGUgbmFtZSBmb3IKLSAgICAgKiA8Y29kZT5TQ09QRTwvY29kZT4gb2YgUmVmZXJlbmNlIGF0dHJpYnV0ZS4gPGNvZGU+TlVMTDwvY29kZT4gaWYKLSAgICAgKiA8Y29kZT5EQVRBX1RZUEU8L2NvZGU+IGlzIG5vdCBSRUYuPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+U09VUkNFX0RBVEFfVFlQRTwvY29kZT4gLSBTdHJpbmcgLSBUaGUgc291cmNlIHR5cGUgZm9yIHVzZXIKLSAgICAgKiBnZW5lcmF0ZWQgUkVGIHR5cGUgb3IgZm9yIGEgRGlzdGluY3QgdHlwZS4gKDxjb2RlPk5VTEw8L2NvZGU+IGlmCi0gICAgICogPGNvZGU+REFUQV9UWVBFPC9jb2RlPiBpcyBub3QgRElTVElOQ1Qgb3IgdXNlciBnZW5lcmF0ZWQgUkVGKTwvbGk+CisgICAgICogPGxpPkNIQVJfT0NURVRfTEVOR1RIIC0gaW50IC0gZm9yIHtAY29kZSBDSEFSfSB0eXBlcywgdGhlIG1heCBudW1iZXIgb2YKKyAgICAgKiBieXRlcyBpbiB0aGUgY29sdW1uPC9saT4KKyAgICAgKiA8bGk+T1JESU5BTF9QT1NJVElPTiAtIGludCAtIFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZSB0YWJsZSAod2hlcmUKKyAgICAgKiB0aGUgY291bnQgc3RhcnRzIGZyb20gMSwgbm90IDApPC9saT4KKyAgICAgKiA8bGk+SVNfTlVMTEFCTEUgLSBTdHJpbmcgLSB7QGNvZGUgIk5PIn0gPSB0aGUgY29sdW1uIGRvZXMgbm90IGFsbG93IHtAY29kZQorICAgICAqIE5VTEx9cywge0Bjb2RlICJZRVMifSA9IHRoZSBjb2x1bW4gYWxsb3dzIHtAY29kZSBOVUxMfXMsICIiID0gc3RhdHVzIHVua25vd248L2xpPgorICAgICAqIDxsaT57QGNvZGUgU0NPUEVfQ0FUQUxPR30gLSBTdHJpbmcgLSBpZiB0aGUge0Bjb2RlIERBVEFfVFlQRX0gaXMge0Bjb2RlIFJFRn0sIAorICAgICAqIHRoaXMgZ2l2ZXMgdGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSdzIHNjb3BlLiAKKyAgICAgKiBOVUxMIGlmIHRoZSB7QGNvZGUgREFUQV9UWVBFfSBpcyBub3QgUkVGLjwvbGk+CisgICAgICogPGxpPntAY29kZSBTQ09QRV9TQ0hFTUF9IC0gU3RyaW5nIC0gaWYgdGhlIHtAY29kZSBEQVRBX1RZUEV9IGlzIHtAY29kZSBSRUZ9LCAKKyAgICAgKiB0aGlzIGdpdmVzIHRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSdzIHNjb3BlLiAKKyAgICAgKiBOVUxMIGlmIHRoZSB7QGNvZGUgREFUQV9UWVBFfSBpcyBub3QgUkVGLjwvbGk+CisgICAgICogPGxpPntAY29kZSBTQ09QRV9UQUJMRX0gLSBTdHJpbmcgLSBpZiB0aGUge0Bjb2RlIERBVEFfVFlQRX0gaXMge0Bjb2RlIFJFRn0sIAorICAgICAqIHRoaXMgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSdzIHNjb3BlLiAKKyAgICAgKiBOVUxMIGlmIHRoZSB7QGNvZGUgREFUQV9UWVBFfSBpcyBub3QgUkVGLjwvbGk+CisgICAgICogPGxpPntAY29kZSBTT1VSQ0VfREFUQV9UWVBFfSAtIFN0cmluZyAtIFRoZSBzb3VyY2UgdHlwZSBmb3IgYSB1c2VyCisgICAgICogZ2VuZXJhdGVkIFJFRiB0eXBlIG9yIGZvciBhIERpc3RpbmN0IHR5cGUuICh7QGNvZGUgTlVMTH0gaWYge0Bjb2RlCisgICAgICogREFUQV9UWVBFfSBpcyBub3QgRElTVElOQ1Qgb3IgYSB1c2VyIGdlbmVyYXRlZCBSRUYpPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgdG8gaW1wbHkgbm8KLSAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIENhdGFsb2cgTmFtZS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgbXVzdCBtYXRjaCBhIENhdGFsb2cgTmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIgotICAgICAqICAgICAgICAgICAgdXNlZCB0byByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgQ2F0YWxvZyBOYW1lLgorICAgICAqICAgICAgICAgICAgYSBjYXRhbG9nIG5hbWUuIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vIG5hcnJvd2luZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBieSBjYXRhbG9nIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBjYXRhbG9nIG5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgICAgICAgdGhvc2Ugd2l0aG91dCBhIGNhdGFsb2cgbmFtZS4KICAgICAgKiBAcGFyYW0gc2NoZW1hUGF0dGVybgotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZSBQYXR0ZXJuLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBTY2hlbWEgTmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZQotICAgICAqICAgICAgICAgICAgbXVzdCBtYXRjaCBhIFNjaGVtYSBuYW1lIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvCi0gICAgICogICAgICAgICAgICByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgU2NoZW1hIG5hbWUuCisgICAgICogICAgICAgICAgICBhIHNjaGVtYSBuYW1lIHBhdHRlcm4uIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vCisgICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCBieSBhIHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gdHlwZU5hbWVQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFR5cGUgbmFtZS4gVGhpcyBwYXR0ZXJuIG11c3QgbWF0Y2ggdGhlIHR5cGUgbmFtZSBzdG9yZWQgaW4KKyAgICAgKiAgICAgICAgICAgIGEgdHlwZSBuYW1lLiBUaGlzIHBhdHRlcm4gbXVzdCBtYXRjaCB0aGUgdHlwZSBuYW1lIHN0b3JlZCBpbgogICAgICAqICAgICAgICAgICAgdGhlIGRhdGFiYXNlLgogICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lUGF0dGVybgotICAgICAqICAgICAgICAgICAgYW4gQXR0cmlidXRlIG5hbWUuIE11c3QgbWF0Y2ggdGhlIGF0dHJpYnV0ZSBuYW1lIGFzIHN0b3JlZCBpbgorICAgICAqICAgICAgICAgICAgYW4gQXR0cmlidXRlIG5hbWUuIFRoaXMgcGF0dGVybiBtdXN0IG1hdGNoIHRoZSBhdHRyaWJ1dGUgbmFtZSBhcyBzdG9yZWQgaW4KICAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhYmFzZS4KLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0LCB3aGVyZSBlYWNoIFJvdyBpcyBhbiBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0sIHdoZXJlIGVhY2ggcm93IGlzIGFuIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0QXR0cmlidXRlcyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYVBhdHRlcm4sCiAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWVQYXR0ZXJuLCBTdHJpbmcgYXR0cmlidXRlTmFtZVBhdHRlcm4pCkBAIC00NTUsNjYgKzU1OSw2NCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYSB0YWJsZSdzIG9wdGltYWwgc2V0IG9mIGNvbHVtbnMgdGhhdCB1bmlxdWVseQotICAgICAqIGlkZW50aWZpZXMgYSByb3cuIFRoZSByZXN1bHRzIGFyZSBvcmRlcmVkIGJ5IDxjb2RlPlNDT1BFPC9jb2RlPiAoc2VlCi0gICAgICogYmVsb3cpLgorICAgICAqIGlkZW50aWZ5IHRoZSByb3dzLiBUaGUgcmVzdWx0cyBhcmUgb3JkZXJlZCBieSB7QGNvZGUgU0NPUEV9IChzZWUgYmVsb3cpLgogICAgICAqIDxwPgogICAgICAqIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBhcyBhIHRhYmxlLCB3aXRoIG9uZSBlbnRyeSBmb3IgZWFjaCBjb2x1bW4sIGFzCiAgICAgICogZm9sbG93czoKICAgICAgKiA8b2w+Ci0gICAgICogPGxpPjxjb2RlPlNDT1BFPC9jb2RlPiAtIHNob3J0IC0gdGhlIDxjb2RlPlNDT1BFPC9jb2RlPiBvZiB0aGUKLSAgICAgKiByZXN1bHQsIGFzIGZvbGxvd3M6CisgICAgICogPGxpPntAY29kZSBTQ09QRX0gLSBzaG9ydCAtIHRoZSB7QGNvZGUgU0NPUEV9IG9mIHRoZSByZXN1bHQsIGFzIGZvbGxvd3M6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmJlc3RSb3dUZW1wb3JhcnkgLSB2ZXJ5IHRlbXBvcmFyeSwgd2hpbGUgdXNpbmcgcm93Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5iZXN0Um93VHJhbnNhY3Rpb24gLSBnb29kIGZvciByZW1haW5kZXIgb2YgY3VycmVudAotICAgICAqIHRyYW5zYWN0aW9uIDwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuYmVzdFJvd1Nlc3Npb24gLSBnb29kIGZvciByZW1haW5kZXIgb2YgZGF0YWJhc2UKLSAgICAgKiBzZXNzaW9uIDwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmJlc3RSb3dUZW1wb3Jhcnl9IC0gdGhlIHJlc3VsdCBpcyB2ZXJ5IHRlbXBvcmFyeSwgCisgICAgICogb25seSB2YWxpZCB3aGlsZSBvbiB0aGUgY3VycmVudCByb3c8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5iZXN0Um93VHJhbnNhY3Rpb259IC0gdGhlIHJlc3VsdCBpcyBnb29kIGZvciByZW1haW5kZXIgb2YKKyAgICAgKiBjdXJyZW50IHRyYW5zYWN0aW9uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuYmVzdFJvd1Nlc3Npb259IC0gdGhlIHJlc3VsdCBpcyBnb29kIGZvciByZW1haW5kZXIgb2YKKyAgICAgKiBkYXRhYmFzZSBzZXNzaW9uPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNPTFVNTl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBjb2x1bW4gbmFtZSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5EQVRBX1RZUEU8L2NvZGU+IC0gaW50IC0gdGhlIFR5cGUgb2YgdGhlIGRhdGEsIGFzIGRlZmluZWQgaW4KLSAgICAgKiA8Y29kZT5qYXZhLnNxbC5UeXBlczwvY29kZT4gPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VFlQRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIE5hbWUgb2YgdGhlIHR5cGUgLSBkYXRhYmFzZQotICAgICAqIGRlcGVuZGVudC4gRm9yIFVEVCB0eXBlcyB0aGUgbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+Q09MVU1OX1NJWkU8L2NvZGU+IC0gaW50IC0gVGhlIHByZWNpc2lvbiBvZiB0aGUgZGF0YSBpbiB0aGUKLSAgICAgKiBjb2x1bW4gPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+QlVGRkVSX0xFTkdUSDwvY29kZT4gLSBpbnQgLSBub3QgdXNlZCA8L2xpPgotICAgICAqIDxsaT48Y29kZT5ERUNJTUFMX0RJR0lUUzwvY29kZT4gLSBzaG9ydCAtIG51bWJlciBvZiBmcmFjdGlvbmFsIGRpZ2l0cwotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBTRVVET19DT0xVTU48L2NvZGU+IC0gc2hvcnQgLSB3aGV0aGVyIHRoaXMgaXMgYSBwc2V1ZG8KLSAgICAgKiBjb2x1bW4gZWcuIGFuZCBPcmFjbGUgUk9XSUQ6CisgICAgICogPGxpPntAY29kZSBDT0xVTU5fTkFNRX0gLSBTdHJpbmcgLSB0aGUgY29sdW1uIG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgREFUQV9UWVBFfSAtIGludCAtIHRoZSBUeXBlIG9mIHRoZSBkYXRhLCBhcyBkZWZpbmVkIGluIHtAY29kZQorICAgICAqIGphdmEuc3FsLlR5cGVzfTwvbGk+CisgICAgICogPGxpPntAY29kZSBUWVBFX05BTUV9IC0gU3RyaW5nIC0gdGhlIE5hbWUgb2YgdGhlIHR5cGUgLSBkYXRhYmFzZSBkZXBlbmRlbnQuCisgICAgICogRm9yIFVEVCB0eXBlcyB0aGUgbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgQ09MVU1OX1NJWkV9IC0gaW50IC0gdGhlIHByZWNpc2lvbiBvZiB0aGUgZGF0YSBpbiB0aGUgY29sdW1uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEJVRkZFUl9MRU5HVEh9IC0gaW50IC0gbm90IHVzZWQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgREVDSU1BTF9ESUdJVFN9IC0gc2hvcnQgLSBudW1iZXIgb2YgZnJhY3Rpb25hbCBkaWdpdHM8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUFNFVURPX0NPTFVNTn0gLSBzaG9ydCAtIHdoZXRoZXIgdGhpcyBpcyBhIHBzZXVkbyBjb2x1bW4gKGUuZy4KKyAgICAgKiBhbiBPcmFjbGUge0Bjb2RlIFJPV0lEfSk6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmJlc3RSb3dVbmtub3duIC0gZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMgYQotICAgICAqIHBzZXVkbyBjb2x1bW48L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmJlc3RSb3dOb3RQc2V1ZG8gLSBjb2x1bW4gaXMgbm90IHBzZXVkbzwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuYmVzdFJvd1BzZXVkbyAtIGNvbHVtbiBpcyBhIHBzZXVkbyBjb2x1bW48L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5iZXN0Um93VW5rbm93bn0gLSBpdCBpcyBub3Qga25vd24gd2hldGhlciB0aGlzIGlzCisgICAgICogYSBwc2V1ZG8gY29sdW1uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuYmVzdFJvd05vdFBzZXVkb30gLSB0aGUgY29sdW1uIGlzIG5vdCBwc2V1ZG88L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5iZXN0Um93UHNldWRvfSAtIHRoZSBjb2x1bW4gaXMgYSBwc2V1ZG8gY29sdW1uPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+CiAgICAgICogPC9vbD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNhdGFsb2cKLSAgICAgKiAgICAgICAgICAgIGEgQ2F0YWxvZyBOYW1lLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBDYXRhbG9nIE5hbWUuIE90aGVyd2lzZSwgdGhlCi0gICAgICogICAgICAgICAgICBuYW1lIG11c3QgbWF0Y2ggYSBDYXRhbG9nIE5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIKLSAgICAgKiAgICAgICAgICAgIHVzZWQgdG8gcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIENhdGFsb2cgTmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgY2F0YWxvZyBuYW1lLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggYnkgY2F0YWxvZyBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQorICAgICAqICAgICAgICAgICAgY2F0YWxvZyBuYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKKyAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBjYXRhbG9nIG5hbWUuCiAgICAgICogQHBhcmFtIHNjaGVtYQotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZSBQYXR0ZXJuLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBTY2hlbWEgTmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZQotICAgICAqICAgICAgICAgICAgbXVzdCBtYXRjaCBhIFNjaGVtYSBuYW1lIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvCi0gICAgICogICAgICAgICAgICByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgU2NoZW1hIG5hbWUuCisgICAgICogICAgICAgICAgICBhIHNjaGVtYSBuYW1lIHBhdHRlcm4uIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vCisgICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCBieSBzY2hlbWEgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZQorICAgICAqICAgICAgICAgICAgbXVzdCBtYXRjaCBhIHNjaGVtYSBuYW1lIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvCisgICAgICogICAgICAgICAgICByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgc2NoZW1hIG5hbWUuCiAgICAgICogQHBhcmFtIHRhYmxlCiAgICAgICogICAgICAgICAgICB0aGUgdGFibGUgbmFtZS4gVGhpcyBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBhcwogICAgICAqICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIGRhdGFiYXNlLgogICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPlNDT1BFPC9jb2RlPiBvZiBpbnRlcmVzdCwgdmFsdWVzIGFzIGRlZmluZWQgYWJvdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU0NPUEV9IG9mIGludGVyZXN0LCB2YWx1ZXMgYXMgZGVmaW5lZCBhYm92ZS4KICAgICAgKiBAcGFyYW0gbnVsbGFibGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+ID0gaW5jbHVkZSBjb2x1bW5zIHRoYXQgYXJlIG51bGxhYmxlLAotICAgICAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+ID0gZG8gbm90IGluY2x1ZGUKLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IHdoZXJlIGVhY2ggcm93IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBjb2x1bW4gYW5kIHRoZQotICAgICAqICAgICAgICAgY29tcGxldGUgc2V0IG9mIHJvd3MgaXMgdGhlIG9wdGltYWwgc2V0IGZvciB0aGlzIHRhYmxlLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9ID0gaW5jbHVkZSBjb2x1bW5zIHRoYXQgYXJlIG51bGxhYmxlLCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGZhbHNlfSA9IGRvIG5vdCBpbmNsdWRlIG51bGxhYmxlIGNvbHVtbnMuCisgICAgICogQHJldHVybiBhIHtAY29kZSBSZXN1bHRTZXR9IHdoZXJlIGVhY2ggcm93IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBjb2x1bW4KKyAgICAgKiAgICAgICAgIGFuZCB0aGUgY29tcGxldGUgc2V0IG9mIHJvd3MgaXMgdGhlIG9wdGltYWwgc2V0IGZvciB0aGlzIHRhYmxlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc3VsdFNldCBnZXRCZXN0Um93SWRlbnRpZmllcihTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYSwKICAgICAgICAgICAgIFN0cmluZyB0YWJsZSwgaW50IHNjb3BlLCBib29sZWFuIG51bGxhYmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtNTIzLDExICs2MjUsMTIgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgY2F0YWxvZyBuYW1lcyBhdmFpbGFibGUgaW4gdGhpcyBkYXRhYmFzZS4gVGhlIHNldCBpcwogICAgICAqIHJldHVybmVkIG9yZGVyZWQgYnkgY2F0YWxvZyBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgY29udGFpbmluZyB0aGUgQ2F0YWxvZyBuYW1lcywgd2l0aCBlYWNoIHJvdwotICAgICAqICAgICAgICAgY29udGFpbmluZyBvbmUgQ2F0YWxvZyBuYW1lIGNvbnRhaW5lZCBhcyBhIFN0cmluZyBpbiB0aGUgc2luZ2xlCi0gICAgICogICAgICAgICBjb2x1bW4gbmFtZWQgPGNvZGU+VEFCTEVfQ0FUPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0gY29udGFpbmluZyB0aGUgY2F0YWxvZyBuYW1lcywgd2l0aCBlYWNoIHJvdworICAgICAqICAgICAgICAgY29udGFpbmluZyBvbmUgY2F0YWxvZyBuYW1lIChhcyBhIHtAY29kZSBTdHJpbmd9KSBpbiB0aGUKKyAgICAgKiAgICAgICAgIHNpbmdsZSBjb2x1bW4gbmFtZWQge0Bjb2RlIFRBQkxFX0NBVH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldENhdGFsb2dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtNTM1LDE4ICs2MzgsMjAgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBzZXBhcmF0b3IgdGhhdCB0aGlzIGRhdGFiYXNlIHVzZXMgYmV0d2VlbiBhIGNhdGFsb2cgbmFtZSBhbmQKICAgICAgKiB0YWJsZSBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgc2VwYXJhdG9yCisgICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBzZXBhcmF0b3IuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dTZXBhcmF0b3IoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdGVybSB0aGF0IHRoZSBkYXRhYmFzZSB2ZW5kb3IgcHJlZmVycyB0ZXJtIGZvciAiY2F0YWxvZyIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB2ZW5kb3IncyB0ZXJtIGZvciAiY2F0YWxvZyIKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHZlbmRvcidzIHRlcm0gZm9yICJjYXRhbG9nIi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ1Rlcm0oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC01NTQsMTI4ICs2NTksMTI0IEBACiAgICAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGFjY2VzcyByaWdodHMgZm9yIGEgdGFibGUncyBjb2x1bW5zLiBPbmx5IGFjY2VzcwogICAgICAqIHJpZ2h0cyBtYXRjaGluZyB0aGUgY3JpdGVyaWEgZm9yIHRoZSBjb2x1bW4gbmFtZSBhcmUgcmV0dXJuZWQuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGRlc2NyaXB0aW9uIGlzIHJldHVybmVkIGFzIGEgUmVzdWx0U2V0IHdpdGggcm93cyBvZiBkYXRhIGZvciBlYWNoCi0gICAgICogYWNjZXNzIHJpZ2h0LCB3aXRoIGNvbHVtbnMgYXMgZm9sbG93czoKKyAgICAgKiBUaGUgZGVzY3JpcHRpb24gaXMgcmV0dXJuZWQgYXMgYSB7QGNvZGUgUmVzdWx0U2V0fSB3aXRoIHJvd3Mgb2YgZGF0YSBmb3IKKyAgICAgKiBlYWNoIGFjY2VzcyByaWdodCwgd2l0aCBjb2x1bW5zIGFzIGZvbGxvd3M6CiAgICAgICogPG9sPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gQ2F0YWxvZyBuYW1lIChwb3NzaWJseQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlRBQkxFX1NDSEVNPC9jb2RlPiAtIFN0cmluZyAtIFNjaGVtYSBuYW1lIChwb3NzaWJseQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+KSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBUYWJsZSBuYW1lIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNPTFVNTl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBDb2x1bW4gbmFtZTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkdSQU5UT1I8L2NvZGU+IC0gU3RyaW5nIC0gVGhlIGdyYW50b3Igb2YgYWNjZXNzIChwb3NzaWJseQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBSSVZJTEVHRTwvY29kZT4gLSBTdHJpbmcgLSBBY2Nlc3MgcmlnaHQgLSBvbmUgb2YgU0VMRUNULAotICAgICAqIElOU0VSVCwgVVBEQVRFLCBSRUZFUkVOQ0VTLC4uLjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPklTX0dSQU5UQUJMRTwvY29kZT4gLSBTdHJpbmcgLSAiWUVTIiBpbXBsaWVzIHRoYXQgdGhlCi0gICAgICogcmVjZWl2ZXIgY2FuIGdyYW50IGFjY2VzcyB0byBvdGhlcnMsICJOTyIgaWYgdGhlIHJlY2VpdmVyIGNhbm5vdCBncmFudAotICAgICAqIGFjY2VzcyB0byBvdGhlcnMsIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVua25vd24uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX0NBVH0gLSBTdHJpbmcgLSB0aGUgY2F0YWxvZyBuYW1lIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX1NDSEVNfSAtIFN0cmluZyAtIHRoZSBzY2hlbWEgbmFtZSAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9OQU1FfSAtIFN0cmluZyAtIHRoZSB0YWJsZSBuYW1lPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIENPTFVNTl9OQU1FfSAtIFN0cmluZyAtIHRoZSBDb2x1bW4gbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBHUkFOVE9SfSAtIFN0cmluZyAtIHRoZSBncmFudG9yIG9mIGFjY2VzcyAocG9zc2libHkge0Bjb2RlCisgICAgICogbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBSSVZJTEVHRX0gLSBTdHJpbmcgLSBBY2Nlc3MgcmlnaHQgLSBvbmUgb2YgU0VMRUNULCBJTlNFUlQsCisgICAgICogVVBEQVRFLCBSRUZFUkVOQ0VTLC4uLjwvbGk+CisgICAgICogPGxpPntAY29kZSBJU19HUkFOVEFCTEV9IC0gU3RyaW5nIC0ge0Bjb2RlICJZRVMifSBpbXBsaWVzIHRoYXQgdGhlCisgICAgICogcmVjZWl2ZXIgY2FuIGdyYW50IGFjY2VzcyB0byBvdGhlcnMsIHtAY29kZSAiTk8ifSBpZiB0aGUgcmVjZWl2ZXIgY2Fubm90CisgICAgICogZ3JhbnQgYWNjZXNzIHRvIG90aGVycywge0Bjb2RlIG51bGx9IGlmIHVua25vd24uPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgdG8gaW1wbHkgbm8KLSAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIENhdGFsb2cgTmFtZS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgbXVzdCBtYXRjaCBhIENhdGFsb2cgTmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIgotICAgICAqICAgICAgICAgICAgdXNlZCB0byByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgQ2F0YWxvZyBOYW1lLgorICAgICAqICAgICAgICAgICAgYSBjYXRhbG9nIG5hbWUuIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vIG5hcnJvd2luZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBieSBjYXRhbG9nIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBjYXRhbG9nIG5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgICAgICAgdGhvc2Ugd2l0aG91dCBhIGNhdGFsb2cgbmFtZS4KICAgICAgKiBAcGFyYW0gc2NoZW1hCi0gICAgICogICAgICAgICAgICBhIFNjaGVtYSBOYW1lIFBhdHRlcm4uIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgdG8gaW1wbHkgbm8KLSAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIFNjaGVtYSBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCi0gICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgU2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBTY2hlbWEgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgc2NoZW1hIG5hbWUgcGF0dGVybi4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8KKyAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIGJ5IHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gdGFibGUKICAgICAgKiAgICAgICAgICAgIHRoZSB0YWJsZSBuYW1lLiBUaGlzIG11c3QgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGFzCiAgICAgICogICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgZGF0YWJhc2UuCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWVQYXR0ZXJuCiAgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIG5hbWUuIFRoaXMgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiBhIGNvbHVtbiBpbiB0aGUKICAgICAgKiAgICAgICAgICAgIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IGNvbnRhaW5pbmcgdGhlIGFjY2VzcyByaWdodHMsIG9uZSByb3cgZm9yIGVhY2gKLSAgICAgKiAgICAgICAgIHByaXZpbGVnZSBkZXNjcmlwdGlvbgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSBjb250YWluaW5nIHRoZSBhY2Nlc3MgcmlnaHRzLCBvbmUgcm93IGZvcgorICAgICAqICAgICAgICAgZWFjaCBwcml2aWxlZ2UgZGVzY3JpcHRpb24uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldENvbHVtblByaXZpbGVnZXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWEsCiAgICAgICAgICAgICBTdHJpbmcgdGFibGUsIFN0cmluZyBjb2x1bW5OYW1lUGF0dGVybikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0YWJsZSBjb2x1bW5zIGF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBjYXRhbG9nLgotICAgICAqIE9ubHkgZGVzY3JpcHRpb25zIG1lZXRpbmcgdGhlIHNwZWNpZmllZCBDYXRhbG9nLCBTY2hlbWEsIFRhYmxlIGFuZCBDb2x1bW4KKyAgICAgKiBPbmx5IGRlc2NyaXB0aW9ucyBtZWV0aW5nIHRoZSBzcGVjaWZpZWQgY2F0YWxvZywgc2NoZW1hLCB0YWJsZSwgYW5kIGNvbHVtbgogICAgICAqIG5hbWVzIGFyZSByZXR1cm5lZC4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVzY3JpcHRpb25zIGFyZSByZXR1cm5lZCBhcyBhIFJlc3VsdFNldCBjb25mb3JtaW5nIHRvIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBkYXRhIGxheW91dCwgd2l0aCBvbmUgcm93IHBlciB0YWJsZSBjb2x1bW46CisgICAgICogVGhlIGRlc2NyaXB0aW9ucyBhcmUgcmV0dXJuZWQgYXMgYSB7QGNvZGUgUmVzdWx0U2V0fSBjb25mb3JtaW5nIHRvIHRoZQorICAgICAqIGZvbGxvd2luZyBkYXRhIGxheW91dCwgd2l0aCBvbmUgcm93IHBlciB0YWJsZSBjb2x1bW46CiAgICAgICogPG9sPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gQ2F0YWxvZyBuYW1lIChwb3NzaWJseQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlRBQkxFX1NDSEVNPC9jb2RlPiAtIFN0cmluZyAtIFNjaGVtYSBuYW1lIChwb3NzaWJseQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+KSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBUYWJsZSBuYW1lIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNPTFVNTl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBDb2x1bW4gbmFtZTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkRBVEFfVFlQRTwvY29kZT4gLSBpbnQgLSBUaGUgU1FMIHR5cGUgYXMgc3BlY2lmaWVkIGluCi0gICAgICogPGNvZGU+amF2YS5zcWwuVHlwZXM8L2NvZGU+PC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VFlQRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIE5hbWUgZm9yIHRoZSBkYXRhIHR5cGUsIGRlcGVuZHMKLSAgICAgKiBvbiBkYXRhYmFzZSwgVURUIG5hbWVzIGFyZSBmdWxseSBxdWFsaWZpZWQ8L2xpPgotICAgICAqIDxsaT48Y29kZT5DT0xVTU5fU0laRTwvY29kZT4gLSBpbnQgLSBDb2x1bW4gc2l6ZSAtIHRoZSBwcmVjaXNpb24gZm9yCi0gICAgICogbnVtZXJpYyB0eXBlcywgbWF4IGNoYXJhY3RlcnMgZm9yIGNoYXIgYW5kIGRhdGUgdHlwZXM8L2xpPgotICAgICAqIDxsaT48Y29kZT5CVUZGRVJfTEVOR1RIPC9jb2RlPiAtIGludCAtIE5vdCB1c2VkIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkRFQ0lNQUxfRElHSVRTPC9jb2RlPiAtIGludCAtIG1heGltdW0gbnVtYmVyIG9mIGZyYWN0aW9uYWwKLSAgICAgKiBkaWdpdHMgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+TlVNX1BSRUNfUkFESVg8L2NvZGU+IC0gaW50IC0gdGhlIFJhZGl4IDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPk5VTExBQkxFPC9jb2RlPiAtIGludCAtIGRvZXMgdGhlIGNvbHVtbiBhbGxvdwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+czoKKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX0NBVH0gLSBTdHJpbmcgLSB0aGUgY2F0YWxvZyBuYW1lIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX1NDSEVNfSAtIFN0cmluZyAtIHRoZSBzY2hlbWEgbmFtZSAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9OQU1FfSAtIFN0cmluZyAtIHRoZSB0YWJsZSBuYW1lPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIENPTFVNTl9OQU1FfSAtIFN0cmluZyAtIHRoZSBjb2x1bW4gbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBEQVRBX1RZUEV9IC0gaW50IC0gdGhlIFNRTCB0eXBlIGFzIHNwZWNpZmllZCBpbiB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UeXBlc308L2xpPgorICAgICAqIDxsaT57QGNvZGUgVFlQRV9OQU1FfSAtIFN0cmluZyAtIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHR5cGUsIChkYXRhYmFzZS1kZXBlbmRlbnQsIAorICAgICAqIFVEVCBuYW1lcyBhcmUgZnVsbHkgcXVhbGlmaWVkKTwvbGk+CisgICAgICogPGxpPntAY29kZSBDT0xVTU5fU0laRX0gLSBpbnQgLSB0aGUgY29sdW1uIHNpemUgKHRoZSBwcmVjaXNpb24gZm9yIG51bWVyaWMKKyAgICAgKiB0eXBlcywgbWF4IGNoYXJhY3RlcnMgZm9yIHtAY29kZSBjaGFyfSBhbmQge0Bjb2RlIGRhdGV9IHR5cGVzKTwvbGk+CisgICAgICogPGxpPntAY29kZSBCVUZGRVJfTEVOR1RIfSAtIGludCAtIE5vdCB1c2VkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERFQ0lNQUxfRElHSVRTfSAtIGludCAtIG1heGltdW0gbnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIE5VTV9QUkVDX1JBRElYfSAtIGludCAtIHRoZSByYWRpeCBmb3IgbnVtZXJpY2FsIHR5cGVzPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIE5VTExBQkxFfSAtIGludCAtIHdoZXRoZXIgdGhlIGNvbHVtbiBhbGxvd3Mge0Bjb2RlIG51bGx9czoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuY29sdW1uTm9OdWxscyA9IG1heSBub3QgYWxsb3cgPGNvZGU+TlVMTDwvY29kZT5zPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5jb2x1bW5OdWxsYWJsZSA9IGRvZXMgYWxsb3cgPGNvZGU+TlVMTDwvY29kZT5zPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5jb2x1bW5OdWxsYWJsZVVua25vd24gPSB1bmtub3duIDxjb2RlPk5VTEw8L2NvZGU+Ci0gICAgICogc3RhdHVzPC9saT4KKyAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5jb2x1bW5Ob051bGxzID0gbWF5IG5vdCBhbGxvdyB7QGNvZGUgTlVMTH1zPC9saT4KKyAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5jb2x1bW5OdWxsYWJsZSA9IGRvZXMgYWxsb3cge0Bjb2RlIE5VTEx9czwvbGk+CisgICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuY29sdW1uTnVsbGFibGVVbmtub3duID0gdW5rbm93biB7QGNvZGUgTlVMTH0gc3RhdHVzPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlJFTUFSS1M8L2NvZGU+IC0gU3RyaW5nIC0gQSBkZXNjcmlwdGlvbiBvZiB0aGUgY29sdW1uCi0gICAgICogKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5DT0xVTU5fREVGPC9jb2RlPiAtIFN0cmluZyAtIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4KLSAgICAgKiAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+U1FMX0RBVEFfVFlQRTwvY29kZT4gLSBpbnQgLSBub3QgdXNlZCA8L2xpPgotICAgICAqIDxsaT48Y29kZT5TUUxfREFURVRJTUVfU1VCPC9jb2RlPiAtIGludCAtIG5vdCB1c2VkIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNIQVJfT0NURVRfTEVOR1RIPC9jb2RlPiAtIGludCAtIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluCi0gICAgICogdGhlIGNoYXIgdHlwZSBjb2x1bW5zIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPk9SRElOQUxfUE9TSVRJT048L2NvZGU+IC0gaW50IC0gQ29sdW1uIGluZGV4IGluIHRoZSB0YWJsZSAoMQotICAgICAqIGJhc2VkKSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5JU19OVUxMQUJMRTwvY29kZT4gLSBTdHJpbmcgLSAiTk8iID0gY29sdW1uIGRvZXMgbm90IGFsbG93Ci0gICAgICogTlVMTHMsICJZRVMiID0gY29sdW1uIGFsbG93cyBOVUxMcyAiIiA9IDxjb2RlPk5VTEw8L2NvZGU+IHN0YXR1cworICAgICAqIDxsaT57QGNvZGUgUkVNQVJLU30gLSBTdHJpbmcgLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2x1bW4gKHBvc3NpYmx5CisgICAgICoge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBDT0xVTU5fREVGfSAtIFN0cmluZyAtIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4gKHBvc3NpYmx5CisgICAgICoge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBTUUxfREFUQV9UWVBFfSAtIGludCAtIG5vdCB1c2VkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFNRTF9EQVRFVElNRV9TVUJ9IC0gaW50IC0gbm90IHVzZWQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgQ0hBUl9PQ1RFVF9MRU5HVEh9IC0gaW50IC0gbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICAgICoge0Bjb2RlIGNoYXJ9IHR5cGUgY29sdW1uczwvbGk+CisgICAgICogPGxpPntAY29kZSBPUkRJTkFMX1BPU0lUSU9OfSAtIGludCAtIHRoZSBjb2x1bW4gaW5kZXggaW4gdGhlIHRhYmxlICgxIGJhc2VkKTwvbGk+CisgICAgICogPGxpPntAY29kZSBJU19OVUxMQUJMRX0gLSBTdHJpbmcgLSB7QGNvZGUgIk5PIn0gPSBjb2x1bW4gZG9lcyBub3QgYWxsb3cKKyAgICAgKiBOVUxMcywge0Bjb2RlICJZRVMifSA9IGNvbHVtbiBhbGxvd3MgTlVMTHMsICIiID0ge0Bjb2RlIE5VTEx9IHN0YXR1cwogICAgICAqIHVua25vd248L2xpPgotICAgICAqIDxsaT48Y29kZT5TQ09QRTwvY29kZT5fQ0FUQUxPRyAtIFN0cmluZyAtIENhdGFsb2cgZm9yIHRhYmxlLAotICAgICAqIDxjb2RlPlNDT1BFPC9jb2RlPiBvZiBSZWZlcmVuY2UgYXR0cmlidXRlLiBOVUxMIGlmCi0gICAgICogPGNvZGU+REFUQV9UWVBFPC9jb2RlPiBpcyBub3QgUkVGLjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlNDT1BFX1NDSEVNQTwvY29kZT4gLSBTdHJpbmcgLSBTY2hlbWEgZm9yIHRhYmxlLCBzY29wZSBvZgotICAgICAqIFJlZmVyZW5jZSBhdHRyaWJ1dGUuIDxjb2RlPk5VTEw8L2NvZGU+IGlmIDxjb2RlPkRBVEFfVFlQRTwvY29kZT4gaXMKLSAgICAgKiBub3QgUkVGLjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlNDT1BFX1RBQkxFPC9jb2RlPiAtIFN0cmluZyAtIFRhYmxlIG5hbWUgZm9yIHNjb3BlIG9mCi0gICAgICogUmVmZXJlbmNlIGF0dHJpYnV0ZS4gPGNvZGU+TlVMTDwvY29kZT4gaWYgPGNvZGU+REFUQV9UWVBFPC9jb2RlPiBpcwotICAgICAqIG5vdCBSRUYuPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+U09VUkNFX0RBVEFfVFlQRTwvY29kZT4gLSBTdHJpbmcgLSBUaGUgc291cmNlIHR5cGUgZm9yIHVzZXIKLSAgICAgKiBnZW5lcmF0ZWQgUkVGIHR5cGUgb3IgZm9yIGEgRGlzdGluY3QgdHlwZS4gKDxjb2RlPk5VTEw8L2NvZGU+IGlmCi0gICAgICogPGNvZGU+REFUQV9UWVBFPC9jb2RlPiBpcyBub3QgRElTVElOQ1Qgb3IgdXNlciBnZW5lcmF0ZWQgUkVGKTwvbGk+CisgICAgICogPGxpPntAY29kZSBTQ09QRV9DQVRBTE9HfSAtIFN0cmluZyAtIGlmIHRoZSB7QGNvZGUgREFUQV9UWVBFfSBpcyB7QGNvZGUgUkVGfSwgCisgICAgICogdGhpcyBnaXZlcyB0aGUgY2F0YWxvZyBvZiB0aGUgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgYXR0cmlidXRlJ3Mgc2NvcGUuIAorICAgICAqIE5VTEwgaWYgdGhlIHtAY29kZSBEQVRBX1RZUEV9IGlzIG5vdCBSRUYuPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFNDT1BFX1NDSEVNQX0gLSBTdHJpbmcgLSBpZiB0aGUge0Bjb2RlIERBVEFfVFlQRX0gaXMge0Bjb2RlIFJFRn0sIAorICAgICAqIHRoaXMgZ2l2ZXMgdGhlIHNjaGVtYSBvZiB0aGUgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgYXR0cmlidXRlJ3Mgc2NvcGUuIAorICAgICAqIE5VTEwgaWYgdGhlIHtAY29kZSBEQVRBX1RZUEV9IGlzIG5vdCBSRUYuPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFNDT1BFX1RBQkxFfSAtIFN0cmluZyAtIGlmIHRoZSB7QGNvZGUgREFUQV9UWVBFfSBpcyB7QGNvZGUgUkVGfSwgCisgICAgICogdGhpcyBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgYXR0cmlidXRlJ3Mgc2NvcGUuIAorICAgICAqIE5VTEwgaWYgdGhlIHtAY29kZSBEQVRBX1RZUEV9IGlzIG5vdCBSRUYuPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFNPVVJDRV9EQVRBX1RZUEV9IC0gU3RyaW5nIC0gVGhlIHNvdXJjZSB0eXBlIGZvciBhIHVzZXIKKyAgICAgKiBnZW5lcmF0ZWQgUkVGIHR5cGUgb3IgZm9yIGEgRGlzdGluY3QgdHlwZS4gKHtAY29kZSBOVUxMfSBpZiB7QGNvZGUKKyAgICAgKiBEQVRBX1RZUEV9IGlzIG5vdCBESVNUSU5DVCBvciBhIHVzZXIgZ2VuZXJhdGVkIFJFRik8L2xpPgogICAgICAqIDwvb2w+CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjYXRhbG9nCi0gICAgICogICAgICAgICAgICBhIENhdGFsb2cgTmFtZS4gPGNvZGU+bnVsbDwvY29kZT4gaXMgdXNlZCB0byBpbXBseSBubwotICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggdXNpbmcgQ2F0YWxvZyBOYW1lLiBPdGhlcndpc2UsIHRoZQotICAgICAqICAgICAgICAgICAgbmFtZSBtdXN0IG1hdGNoIGEgQ2F0YWxvZyBOYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiCi0gICAgICogICAgICAgICAgICB1c2VkIHRvIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBDYXRhbG9nIE5hbWUuCisgICAgICogICAgICAgICAgICBhIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IGNhdGFsb2cgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgbmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCisgICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgY2F0YWxvZyBuYW1lLgogICAgICAqIEBwYXJhbSBzY2hlbWFQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFNjaGVtYSBOYW1lIFBhdHRlcm4uIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgdG8gaW1wbHkgbm8KLSAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIFNjaGVtYSBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCi0gICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgU2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBTY2hlbWEgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgc2NoZW1hIG5hbWUgcGF0dGVybi4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8KKyAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIGJ5IHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gdGFibGVOYW1lUGF0dGVybgogICAgICAqICAgICAgICAgICAgdGhlIHRhYmxlIG5hbWUuIFRoaXMgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgdGFibGUgYXMKICAgICAgKiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZVBhdHRlcm4KICAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gbmFtZS4gVGhpcyBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIGEgY29sdW1uIGluIHRoZQogICAgICAqICAgICAgICAgICAgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9ucyBhcyBhIFJlc3VsdFNldCB3aXRoIHJvd3MgaW4gdGhlIGZvcm0gZGVmaW5lZAotICAgICAqICAgICAgICAgYWJvdmUKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbnMgYXMgYSB7QGNvZGUgUmVzdWx0U2V0fSB3aXRoIHJvd3MgaW4gdGhlIGZvcm0KKyAgICAgKiAgICAgICAgIGRlZmluZWQgYWJvdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldENvbHVtbnMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXJuLAogICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZVBhdHRlcm4sIFN0cmluZyBjb2x1bW5OYW1lUGF0dGVybikKQEAgLTY4NCw5ICs3ODUsMTAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgY3JlYXRlZCB0aGlzIG1ldGFkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC02OTYsOTYgKzc5OCw5OCBAQAogICAgICAqIGRlc2NyaWJlcyBob3cgb25lIHRhYmxlIGltcG9ydHMgdGhlIGtleSBvZiBhbm90aGVyIHRhYmxlLiBJdCB3b3VsZCBiZQogICAgICAqIGV4cGVjdGVkIHRvIHJldHVybiBhIHNpbmdsZSBmb3JlaWduIGtleSAtIHByaW1hcnkga2V5IHBhaXIgaW4gbW9zdCBjYXNlcy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVzY3JpcHRpb25zIGFyZSByZXR1cm5lZCBhcyBhIFJlc3VsdFNldCB3aXRoIG9uZSByb3cgZm9yIGVhY2gKLSAgICAgKiBGb3JlaWduIGtleSwgd2l0aCB0aGUgZm9sbG93aW5nIGxheW91dDoKKyAgICAgKiBUaGUgZGVzY3JpcHRpb25zIGFyZSByZXR1cm5lZCBhcyBhIHtAY29kZSBSZXN1bHRTZXR9IHdpdGggb25lIHJvdyBmb3IKKyAgICAgKiBlYWNoIGZvcmVpZ24ga2V5LCB3aXRoIHRoZSBmb2xsb3dpbmcgbGF5b3V0OgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+PGNvZGU+UEtUQUJMRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gZnJvbSB0aGUgcHJpbWFyeSBrZXkgdGFibGUgOgotICAgICAqIENhdGFsb2cgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBLVEFCTEVfU0NIRU08L2NvZGU+IC0gU3RyaW5nIC0gZnJvbSB0aGUgcHJpbWFyeSBrZXkgdGFibGUgOgotICAgICAqIFNjaGVtYSAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBLVEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBwcmltYXJ5IGtleSB0YWJsZSA6IG5hbWUKLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT48Y29kZT5QS0NPTFVNTl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHByaW1hcnkga2V5IGNvbHVtbiA6IG5hbWU8L2xpPgotICAgICAqIDxsaT48Y29kZT5GS1RBQkxFX0NBVDwvY29kZT4gLSBTdHJpbmcgLSBmcm9tIHRoZSBmb3JlaWduIGtleSB0YWJsZSA6Ci0gICAgICogdGhlIGNhdGFsb2cgbmFtZSBiZWluZyBleHBvcnRlZCAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+RktUQUJMRV9TQ0hFTTwvY29kZT4gLSBTdHJpbmcgLSBmb3JlaWduIGtleSB0YWJsZSA6IFNjaGVtYQotICAgICAqIG5hbWUgYmVpbmcgZXhwb3J0ZWQgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5GS1RBQkxFX05BTUU8L2NvZGU+IC0gU3RyaW5nIC0gZm9yZWlnbiBrZXkgdGFibGUgOiB0aGUgbmFtZQotICAgICAqIGJlaW5nIGV4cG9ydGVkPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+RktDT0xVTU5fTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBmb3JlaWduIGtleSBjb2x1bW4gOiB0aGUKLSAgICAgKiBuYW1lIGJlaW5nIGV4cG9ydGVkPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+S0VZX1NFUTwvY29kZT4gLSBzaG9ydCAtIHNlcXVlbmNlIG51bWJlciAoaW4gdGhlIGZvcmVpZ24KLSAgICAgKiBrZXkpPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VVBEQVRFX1JVTEU8L2NvZGU+IC0gc2hvcnQgLSBob3cgdG8gdHJlYXQgZm9yZWlnbiBrZXkgd2hlbgotICAgICAqIHByaW1hcnkga2V5IGlzIHVwZGF0ZWQ6CisgICAgICogPGxpPntAY29kZSBQS1RBQkxFX0NBVH0gLSBTdHJpbmcgLSBmcm9tIHRoZSBwcmltYXJ5IGtleSB0YWJsZSA6IENhdGFsb2cKKyAgICAgKiAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBQS1RBQkxFX1NDSEVNfSAtIFN0cmluZyAtIGZyb20gdGhlIHByaW1hcnkga2V5IHRhYmxlIDogU2NoZW1hCisgICAgICogKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUEtUQUJMRV9OQU1FfSAtIFN0cmluZyAtIGZyb20gdGhlIHByaW1hcnkga2V5IHRhYmxlIDogbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBQS0NPTFVNTl9OQU1FfSAtIFN0cmluZyAtIGZyb20gdGhlIHByaW1hcnkga2V5IGNvbHVtbiA6IG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRktUQUJMRV9DQVR9IC0gU3RyaW5nIC0gZnJvbSB0aGUgZm9yZWlnbiBrZXkgdGFibGUgOiB0aGUKKyAgICAgKiBjYXRhbG9nIG5hbWUgYmVpbmcgZXhwb3J0ZWQgKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRktUQUJMRV9TQ0hFTX0gLSBTdHJpbmcgLSBmcm9tIHRoZSBmb3JlaWduIGtleSB0YWJsZSA6IHRoZSBzY2hlbWEgbmFtZQorICAgICAqIGJlaW5nIGV4cG9ydGVkIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEZLVEFCTEVfTkFNRX0gLSBTdHJpbmcgLSBmcm9tIHRoZSBmb3JlaWduIGtleSB0YWJsZSA6IHRoZSBuYW1lIGJlaW5nCisgICAgICogZXhwb3J0ZWQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRktDT0xVTU5fTkFNRX0gLSBTdHJpbmcgLSBmcm9tIHRoZSBmb3JlaWduIGtleSBjb2x1bW4gOiB0aGUgbmFtZSBiZWluZworICAgICAqIGV4cG9ydGVkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEtFWV9TRVF9IC0gc2hvcnQgLSB0aGUgc2VxdWVuY2UgbnVtYmVyIChpbiB0aGUgZm9yZWlnbiBrZXkpPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFVQREFURV9SVUxFfSAtIHNob3J0IC0gYSB2YWx1ZSBnaXZpbmcgdGhlIHJ1bGUgZm9yIGhvdyB0byB0cmVhdCB0aGUgY29ycmVzcG9uZGluZyBmb3JlaWduIGtleSB3aGVuIGEgcHJpbWFyeQorICAgICAqIGtleSBpcyB1cGRhdGVkOgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleU5vQWN0aW9uIC0gZG9uJ3QgYWxsb3cgdXBkYXRlIG9mIHByaW1hcnkKLSAgICAgKiBrZXkgaWYgaW1wb3J0ZWQ8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Q2FzY2FkZSAtIGNoYW5nZSBpbXBvcnRlZCBrZXkgdG8gbWF0Y2gKLSAgICAgKiB0aGUgcHJpbWFyeSBrZXkgdXBkYXRlPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldE51bGwgLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldERlZmF1bHQgLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bwotICAgICAqIGRlZmF1bHQgdmFsdWVzPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVJlc3RyaWN0IC0gc2FtZSBhcyBpbXBvcnRlZEtleU5vQWN0aW9uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlOb0FjdGlvbn0gLSBkb24ndCBhbGxvdyB0aGUKKyAgICAgKiBwcmltYXJ5IGtleSB0byBiZSB1cGRhdGVkIGlmIGl0IGlzIGltcG9ydGVkIGFzIGEgZm9yZWlnbiBrZXk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUNhc2NhZGV9IC0gY2hhbmdlIHRoZSBpbXBvcnRlZCBrZXkgdG8KKyAgICAgKiBtYXRjaCB0aGUgdXBkYXRlZCBwcmltYXJ5IGtleTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0TnVsbH0gLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bworICAgICAqIHtAY29kZSBudWxsfTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0RGVmYXVsdH0gLSBzZXQgdGhlIGltcG9ydGVkIGtleQorICAgICAqIHRvIGl0cyBkZWZhdWx0IHZhbHVlPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlSZXN0cmljdH0gLSBzYW1lIGFzIHtAY29kZQorICAgICAqIGltcG9ydGVkS2V5Tm9BY3Rpb259PC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkRFTEVURV9SVUxFPC9jb2RlPiAtIHNob3J0IC0gaG93IHRvIHRyZWF0IGZvcmVpZ24ga2V5IHdoZW4KLSAgICAgKiBwcmltYXJ5IGtleSBpcyBkZWxldGVkOgorICAgICAqIDxsaT57QGNvZGUgREVMRVRFX1JVTEV9IC0gc2hvcnQgLSBhIHZhbHVlIGdpdmluZyB0aGUgcnVsZSBmb3IgaG93IHRvIHRyZWF0IHRoZSBmb3JlaWduIGtleSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHByaW1hcnkKKyAgICAgKiBrZXkgaXMgZGVsZXRlZDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlOb0FjdGlvbiAtIGRvbid0IGFsbG93IGRlbGV0ZSBvZiBwcmltYXJ5Ci0gICAgICoga2V5IGlmIGltcG9ydGVkPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUNhc2NhZGUgLSBkZWxldGUgdGhvc2Ugcm93cyB0aGF0IGltcG9ydAotICAgICAqIGEgZGVsZXRlZCBrZXk8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0TnVsbCAtIHNldCB0aGUgaW1wb3J0ZWQga2V5IHRvCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT48L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0RGVmYXVsdCAtIHNldCB0aGUgaW1wb3J0ZWQga2V5IHRvCi0gICAgICogZGVmYXVsdCB2YWx1ZXM8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5UmVzdHJpY3QgLSBzYW1lIGFzIGltcG9ydGVkS2V5Tm9BY3Rpb248L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleU5vQWN0aW9ufSAtIGRvbid0IGFsbG93IHRoZQorICAgICAqIHByaW1hcnkga2V5IHRvIGJlIGRlbGV0ZWQgaWYgaXQgaXMgaW1wb3J0ZWQgYXMgYSBmb3JlaWduIGtleTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Q2FzY2FkZX0gLSBkZWxldGUgdGhvc2Ugcm93cyB0aGF0CisgICAgICogaW1wb3J0IGEgZGVsZXRlZCBrZXk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldE51bGx9IC0gc2V0IHRoZSBpbXBvcnRlZCBrZXkgdG8KKyAgICAgKiB7QGNvZGUgbnVsbH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldERlZmF1bHR9IC0gc2V0IHRoZSBpbXBvcnRlZCBrZXkKKyAgICAgKiB0byBpdHMgZGVmYXVsdCB2YWx1ZTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5UmVzdHJpY3R9IC0gc2FtZSBhcworICAgICAqIGltcG9ydGVkS2V5Tm9BY3Rpb248L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KLSAgICAgKiA8bGk+RktfTkFNRSAtIFN0cmluZyAtIGZvcmVpZ24ga2V5IG5hbWUgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPlBLX05BTUUgLSBTdHJpbmcgLSBwcmltYXJ5IGtleSBuYW1lIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT5ERUZFUlJBQklMSVRZIC0gc2hvcnQgLSBjYW4gZm9yZWlnbiBrZXkgY29uc3RyYWludHMgYmUgZGVmZXJyZWQKLSAgICAgKiB1bnRpbCBjb21taXQgKHNlZSBTUUw5MiBzcGVjaWZpY2F0aW9uIGZvciBkZWZpbml0aW9ucyk/OgorICAgICAqIDxsaT57QGNvZGUgRktfTkFNRX0gLSBTdHJpbmcgLSB0aGUgZm9yZWlnbiBrZXkgbmFtZSAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBQS19OQU1FfSAtIFN0cmluZyAtIHRoZSBwcmltYXJ5IGtleSBuYW1lIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERFRkVSUkFCSUxJVFl9IC0gc2hvcnQgLSB3aGV0aGVyIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGNhbiBiZQorICAgICAqIGRlZmVycmVkIHVudGlsIGNvbW1pdCAoc2VlIHRoZSBTUUw5MiBzcGVjaWZpY2F0aW9uIGZvciBkZWZpbml0aW9ucyk6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5SW5pdGlhbGx5RGVmZXJyZWQ8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5SW5pdGlhbGx5SW1tZWRpYXRlPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleU5vdERlZmVycmFibGU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUluaXRpYWxseURlZmVycmVkfTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5SW5pdGlhbGx5SW1tZWRpYXRlfTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Tm90RGVmZXJyYWJsZX08L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcHJpbWFyeUNhdGFsb2cKLSAgICAgKiAgICAgICAgICAgIGEgQ2F0YWxvZyBOYW1lLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBDYXRhbG9nIE5hbWUuIE90aGVyd2lzZSwgdGhlCi0gICAgICogICAgICAgICAgICBuYW1lIG11c3QgbWF0Y2ggYSBDYXRhbG9nIE5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIKLSAgICAgKiAgICAgICAgICAgIHVzZWQgdG8gcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIENhdGFsb2cgTmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgY2F0YWxvZyBuYW1lIGZvciB0aGUgcHJpbWFyeSBrZXkgdGFibGUuIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vIG5hcnJvd2luZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBieSBjYXRhbG9nIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBjYXRhbG9nIG5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgICAgICAgdGhvc2Ugd2l0aG91dCBhIGNhdGFsb2cgbmFtZS4KICAgICAgKiBAcGFyYW0gcHJpbWFyeVNjaGVtYQotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZS4gPGNvZGU+bnVsbDwvY29kZT4gaXMgdXNlZCB0byBpbXBseSBubwotICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG11c3QgbWF0Y2ggYSBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0bwotICAgICAqICAgICAgICAgICAgcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIFNjaGVtYSBuYW1lLgorICAgICAqICAgICAgICAgICAgYSBzY2hlbWEgbmFtZSBmb3IgdGhlIHByaW1hcnkga2V5IHRhYmxlLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggYnkgc2NoZW1hIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZSB0aG9zZQorICAgICAqICAgICAgICAgICAgd2l0aG91dCBhIHNjaGVtYSBuYW1lLgogICAgICAqIEBwYXJhbSBwcmltYXJ5VGFibGUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGljaCBleHBvcnRzIHRoZSBrZXkuIEl0IG11c3QgbWF0Y2ggdGhlCi0gICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAcGFyYW0gZm9yZWlnbkNhdGFsb2cKLSAgICAgKiAgICAgICAgICAgIGEgQ2F0YWxvZyBOYW1lLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBDYXRhbG9nIE5hbWUuIE90aGVyd2lzZSwgdGhlCi0gICAgICogICAgICAgICAgICBuYW1lIG11c3QgbWF0Y2ggYSBDYXRhbG9nIE5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIKLSAgICAgKiAgICAgICAgICAgIHVzZWQgdG8gcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIENhdGFsb2cgTmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgY2F0YWxvZyBuYW1lIGZvciB0aGUgZm9yZWlnbiBrZXkgdGFibGUuIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vIG5hcnJvd2luZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBieSBjYXRhbG9nIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBjYXRhbG9nIG5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgICAgICAgdGhvc2Ugd2l0aG91dCBhIGNhdGFsb2cgbmFtZS4KICAgICAgKiBAcGFyYW0gZm9yZWlnblNjaGVtYQotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZS4gPGNvZGU+bnVsbDwvY29kZT4gaXMgdXNlZCB0byBpbXBseSBubwotICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG11c3QgbWF0Y2ggYSBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0bwotICAgICAqICAgICAgICAgICAgcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIFNjaGVtYSBuYW1lLgorICAgICAqICAgICAgICAgICAgYSBzY2hlbWEgbmFtZSBmb3IgdGhlIGZvcmVpZ24ga2V5IHRhYmxlLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggYnkgc2NoZW1hIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZSB0aG9zZQorICAgICAqICAgICAgICAgICAgd2l0aG91dCBhIHNjaGVtYSBuYW1lLgogICAgICAqIEBwYXJhbSBmb3JlaWduVGFibGUKICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbXBvcnRpbmcgdGhlIGtleS4gSXQgbXVzdCBtYXRjaCB0aGUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRhYmxlIGluIHRoZSBkYXRhYmFzZQotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgY29udGFpbmluZyByb3dzIHdpdGggdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgZm9yZWlnbgotICAgICAqICAgICAgICAga2V5cyBsYWlkIG91dCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBkZWZpbmVkIGFib3ZlLgorICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSBjb250YWluaW5nIHJvd3Mgd2l0aCB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZQorICAgICAqICAgICAgICAgZm9yZWlnbiBrZXlzIGxhaWQgb3V0IGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGRlZmluZWQgYWJvdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldENyb3NzUmVmZXJlbmNlKFN0cmluZyBwcmltYXJ5Q2F0YWxvZywKICAgICAgICAgICAgIFN0cmluZyBwcmltYXJ5U2NoZW1hLCBTdHJpbmcgcHJpbWFyeVRhYmxlLCBTdHJpbmcgZm9yZWlnbkNhdGFsb2csCkBAIC03OTQsODMgKzg5OCw5NSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkYXRhYmFzZSBzb2Z0d2FyZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBNYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGF0YWJhc2Ugc29mdHdhcmUuCisgICAgICogQHJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRhdGFiYXNlIHNvZnR3YXJlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREYXRhYmFzZU1ham9yVmVyc2lvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGF0YWJhc2Ugc29mdHdhcmUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgTWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRhdGFiYXNlIHNvZnR3YXJlLgorICAgICAqIEByZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkYXRhYmFzZSBzb2Z0d2FyZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGF0YWJhc2VNaW5vclZlcnNpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2Ugc29mdHdhcmUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBzb2Z0d2FyZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFN0cmluZ30gd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2Ugc29mdHdhcmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdE5hbWUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBkYXRhYmFzZSBzb2Z0d2FyZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkYXRhYmFzZSBzb2Z0d2FyZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFN0cmluZ30gd2l0aCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICBzb2Z0d2FyZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VQcm9kdWN0VmVyc2lvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCBmb3IgdGhpcyBkYXRhYmFzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbC4gT25lIG9mCi0gICAgICogICAgICAgICA8Y29kZT5UUkFOU0FDVElPTl9OT05FPC9jb2RlPiwKLSAgICAgKiAgICAgICAgIDxjb2RlPlRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEPC9jb2RlPiwKLSAgICAgKiAgICAgICAgIDxjb2RlPlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQ8L2NvZGU+LAotICAgICAqICAgICAgICAgPGNvZGU+VFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgPGNvZGU+VFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbC4gT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAqICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgPGxpPntAY29kZSBUUkFOU0FDVElPTl9OT05FfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0Bjb2RlIFRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0Bjb2RlIFRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUR9PC9saT4KKyAgICAgKiAgICAgICAgIDxsaT57QGNvZGUgVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0Bjb2RlIFRSQU5TQUNUSU9OX1NFUklBTElaQUJMRX08L2xpPgorICAgICAqICAgICAgICAgPC91bD4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIEpEQkMgZHJpdmVyJ3MgbWFqb3IgdmVyc2lvbiBudW1iZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZHJpdmVyJ3MgbWFqb3IgdmVyc2lvbiBudW1iZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBkcml2ZXIncyBtYWpvciB2ZXJzaW9uIG51bWJlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyaXZlck1ham9yVmVyc2lvbigpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgSkRCQyBkcml2ZXIncyBtaW5vciB2ZXJzaW9uIG51bWJlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkcml2ZXIncyBtaW5vciB2ZXJzaW9uIG51bWJlcgorICAgICAqIEByZXR1cm4gdGhlIGRyaXZlcidzIG1pbm9yIHZlcnNpb24gbnVtYmVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJpdmVyTWlub3JWZXJzaW9uKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgSkRCQyBkcml2ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBKREJDIGRyaXZlcgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgU3RyaW5nfSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBKREJDIGRyaXZlcgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgSkRCQyBkcml2ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBjb21wbGV0ZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgSkRCQwotICAgICAqICAgICAgICAgZHJpdmVyCisgICAgICogQHJldHVybiBhIHtAY29kZSBTdHJpbmd9IGNvbnRhaW5pbmcgdGhlIGNvbXBsZXRlIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorICAgICAqICAgICAgICAgSkRCQyBkcml2ZXIuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERyaXZlclZlcnNpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC04NzgsOTUgKzk5NCwxMDEgQEAKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZm9yZWlnbiBrZXkgY29sdW1ucyB0aGF0IHJlZmVyZW5jZSB0aGUgcHJpbWFyeSBrZXkKICAgICAgKiBjb2x1bW5zIG9mIGEgc3BlY2lmaWVkIHRhYmxlICh0aGUgZm9yZWlnbiBrZXlzIGV4cG9ydGVkIGJ5IGEgdGFibGUpLgogICAgICAqIDxwPgotICAgICAqIFRoZSBsaXN0IGlzIHJldHVybmVkIGFzIGEgUmVzdWx0U2V0IHdpdGggYSByb3cgZm9yIGVhY2ggb2YgdGhlIGZvcmVpZ24KLSAgICAgKiBrZXkgY29sdW1ucywgb3JkZXJlZCBieSA8Y29kZT5GS1RBQkxFX0NBVDwvY29kZT4sCi0gICAgICogPGNvZGU+RktUQUJMRV9TQ0hFTTwvY29kZT4sIDxjb2RlPkZLVEFCTEVfTkFNRTwvY29kZT4sIGFuZAotICAgICAqIDxjb2RlPktFWV9TRVE8L2NvZGU+LCB3aXRoIHRoZSBmb3JtYXQgZm9yIGVhY2ggcm93IGJlaW5nOgorICAgICAqIFRoZSBsaXN0IGlzIHJldHVybmVkIGFzIGEge0Bjb2RlIFJlc3VsdFNldH0gd2l0aCBhIHJvdyBmb3IgZWFjaCBvZiB0aGUKKyAgICAgKiBmb3JlaWduIGtleSBjb2x1bW5zLCBvcmRlcmVkIGJ5IHtAY29kZSBGS1RBQkxFX0NBVH0sIHtAY29kZQorICAgICAqIEZLVEFCTEVfU0NIRU19LCB7QGNvZGUgRktUQUJMRV9OQU1FfSwgYW5kIHtAY29kZSBLRVlfU0VRfSwgd2l0aCB0aGUKKyAgICAgKiBmb3JtYXQgZm9yIGVhY2ggcm93IGJlaW5nOgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+PGNvZGU+UEtUQUJMRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgdGFibGUgOiBDYXRhbG9nCi0gICAgICogKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBLVEFCTEVfU0NIRU08L2NvZGU+IC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgdGFibGUgOiBTY2hlbWEKLSAgICAgKiAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBLVEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBwcmltYXJ5IGtleSB0YWJsZSA6IG5hbWUKLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT48Y29kZT5QS0NPTFVNTl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHByaW1hcnkga2V5IGNvbHVtbiA6IG5hbWU8L2xpPgotICAgICAqIDxsaT48Y29kZT5GS1RBQkxFX0NBVDwvY29kZT4gLSBTdHJpbmcgLSBmb3JlaWduIGtleSB0YWJsZSA6IENhdGFsb2cKLSAgICAgKiBuYW1lIGJlaW5nIGV4cG9ydGVkIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT48Y29kZT5GS1RBQkxFX1NDSEVNPC9jb2RlPiAtIFN0cmluZyAtIGZvcmVpZ24ga2V5IHRhYmxlIDogU2NoZW1hCi0gICAgICogbmFtZSBiZWluZyBleHBvcnRlZCAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkZLVEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBmb3JlaWduIGtleSB0YWJsZSA6IG5hbWUKLSAgICAgKiBiZWluZyBleHBvcnRlZDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkZLQ09MVU1OX05BTUU8L2NvZGU+IC0gU3RyaW5nIC0gZm9yZWlnbiBrZXkgY29sdW1uIDogbmFtZQotICAgICAqIGJlaW5nIGV4cG9ydGVkPC9saT4KLSAgICAgKiA8bGk+S0VZX1NFUSAtIHNob3J0IC0gc2VxdWVuY2UgbnVtYmVyIGluIHRoZSBmb3JlaWduIGtleTwvbGk+Ci0gICAgICogPGxpPlVQREFURV9SVUxFIC0gc2hvcnQgLSBob3cgdG8gdHJlYXQgZm9yZWlnbiBrZXkgd2hlbiBwcmltYXJ5IGtleSBpcwotICAgICAqIHVwZGF0ZWQ6CisgICAgICogPGxpPntAY29kZSBQS1RBQkxFX0NBVH0gLSBTdHJpbmcgLSBmcm9tIHRoZSBwcmltYXJ5IGtleSB0YWJsZSA6IHRoZSBjYXRhbG9nIChwb3NzaWJseQorICAgICAqIHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUEtUQUJMRV9TQ0hFTX0gLSBTdHJpbmcgLSBmcm9tIHRoZSBwcmltYXJ5IGtleSB0YWJsZSA6IHRoZSBzY2hlbWEgKHBvc3NpYmx5CisgICAgICoge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBQS1RBQkxFX05BTUV9IC0gU3RyaW5nIC0gZnJvbSB0aGUgcHJpbWFyeSBrZXkgdGFibGUgOiB0aGUgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBQS0NPTFVNTl9OQU1FfSAtIFN0cmluZyAtIGZyb20gdGhlIHByaW1hcnkga2V5IGNvbHVtbiA6IHRoZSBuYW1lPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEZLVEFCTEVfQ0FUfSAtIFN0cmluZyAtIGZyb20gdGhlIGZvcmVpZ24ga2V5IHRhYmxlIDogdGhlIGNhdGFsb2cgbmFtZSBiZWluZworICAgICAqIGV4cG9ydGVkIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEZLVEFCTEVfU0NIRU19IC0gU3RyaW5nIC0gZnJvbSB0aGUgZm9yZWlnbiBrZXkgdGFibGUgOiB0aGUgc2NoZW1hIG5hbWUKKyAgICAgKiBiZWluZyBleHBvcnRlZCAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBGS1RBQkxFX05BTUV9IC0gU3RyaW5nIC0gZnJvbSB0aGUgZm9yZWlnbiBrZXkgdGFibGUgOiB0aGUgbmFtZSBiZWluZworICAgICAqIGV4cG9ydGVkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEZLQ09MVU1OX05BTUV9IC0gU3RyaW5nIC0gZnJvbSB0aGUgZm9yZWlnbiBrZXkgY29sdW1uIDogdGhlIG5hbWUgYmVpbmcKKyAgICAgKiBleHBvcnRlZDwvbGk+CisgICAgICogPGxpPntAY29kZSBLRVlfU0VRfSAtIHNob3J0IC0gdGhlIHNlcXVlbmNlIG51bWJlciAoaW4gdGhlIGZvcmVpZ24ga2V5KTwvbGk+CisgICAgICogPGxpPntAY29kZSBVUERBVEVfUlVMRX0gLSBzaG9ydCAtIGEgdmFsdWUgZ2l2aW5nIHRoZSBydWxlIGZvciBob3cgdG8gdHJlYXQgdGhlIGZvcmVpZ24ga2V5IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJpbWFyeQorICAgICAqIGtleSBpcyB1cGRhdGVkOgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleU5vQWN0aW9uIC0gZG9uJ3QgYWxsb3cgdXBkYXRlIG9mIHByaW1hcnkKLSAgICAgKiBrZXkgaWYgaW1wb3J0ZWQ8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Q2FzY2FkZSAtIGNoYW5nZSBpbXBvcnRlZCBrZXkgdG8gbWF0Y2gKLSAgICAgKiB0aGUgcHJpbWFyeSBrZXkgdXBkYXRlPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldE51bGwgLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldERlZmF1bHQgLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bwotICAgICAqIGRlZmF1bHQgdmFsdWVzPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVJlc3RyaWN0IC0gc2FtZSBhcyBpbXBvcnRlZEtleU5vQWN0aW9uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlOb0FjdGlvbn0gLSBkb24ndCBhbGxvdyB0aGUgCisgICAgICogcHJpbWFyeSBrZXkgdG8gYmUgdXBkYXRlZCBpZiBpdCBpcyBpbXBvcnRlZCBhcyBhIGZvcmVpZ24ga2V5PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlDYXNjYWRlfSAtIGNoYW5nZSB0aGUgaW1wb3J0ZWQga2V5IHRvCisgICAgICogbWF0Y2ggdGhlIHByaW1hcnkga2V5IHVwZGF0ZTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0TnVsbH0gLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bworICAgICAqIHtAY29kZSBudWxsfTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0RGVmYXVsdH0gLSBzZXQgdGhlIGltcG9ydGVkIGtleQorICAgICAqIHRvIGl0cyBkZWZhdWx0IHZhbHVlPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlSZXN0cmljdH0gLSBzYW1lIGFzCisgICAgICogaW1wb3J0ZWRLZXlOb0FjdGlvbjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8L2xpPgotICAgICAqIDxsaT5ERUxFVEVfUlVMRSAtIHNob3J0IC0gaG93IHRvIHRyZWF0IGZvcmVpZ24ga2V5IHdoZW4gcHJpbWFyeSBrZXkgaXMKLSAgICAgKiBkZWxldGVkOgorICAgICAqIDxsaT57QGNvZGUgREVMRVRFX1JVTEV9IC0gc2hvcnQgLSBob3cgdG8gdHJlYXQgdGhlIGZvcmVpZ24ga2V5IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJpbWFyeQorICAgICAqIGtleSBpcyBkZWxldGVkOgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleU5vQWN0aW9uIC0gZG9uJ3QgYWxsb3cgZGVsZXRlIG9mIHByaW1hcnkKLSAgICAgKiBrZXkgaWYgaW1wb3J0ZWQ8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Q2FzY2FkZSAtIHRoZSBkZWxldGlvbiBzaG91bGQgYWxzbwotICAgICAqIGRlbGV0ZSByb3dzIHRoYXQgaW1wb3J0IGEgZGVsZXRlZCBrZXk8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0TnVsbCAtIGl0IHNob3VsZCBzZXQgdGhlIGltcG9ydGVkIGtleQotICAgICAqIHRvIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldERlZmF1bHQgLSBkZWxldGlvbiBzZXRzIHRoZSBpbXBvcnRlZAotICAgICAqIGtleSB0byBkZWZhdWx0IHZhbHVlczwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlSZXN0cmljdCAtIHNhbWUgYXMgaW1wb3J0ZWRLZXlOb0FjdGlvbjwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Tm9BY3Rpb259IC0gZG9uJ3QgYWxsb3cgdGhlCisgICAgICogcHJpbWFyeSBrZXkgdG8gYmUgZGVsZXRlZCBpZiBpdCBpcyBpbXBvcnRlZCBhcyBhIGZvcmVpZ24ga2V5PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlDYXNjYWRlfSAtIHRoZSBkZWxldGlvbiBzaG91bGQKKyAgICAgKiBhbHNvIGRlbGV0ZSByb3dzIHRoYXQgaW1wb3J0IGEgZGVsZXRlZCBrZXk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldE51bGx9IC0gdGhlIGRlbGV0aW9uIHNldHMgdGhlCisgICAgICogaW1wb3J0ZWQga2V5IHRvIHtAY29kZSBudWxsfTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0RGVmYXVsdH0gLSB0aGUgZGVsZXRpb24gc2V0cyB0aGUKKyAgICAgKiBpbXBvcnRlZCBrZXkgdG8gaXRzIGRlZmF1bHQgdmFsdWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVJlc3RyaWN0fSAtIHNhbWUgYXMKKyAgICAgKiBpbXBvcnRlZEtleU5vQWN0aW9uPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+Ci0gICAgICogPGxpPkZLX05BTUUgLSBTdHJpbmcgLSBmb3JlaWduIGtleSBuYW1lIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT5QS19OQU1FIC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgbmFtZSAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pPC9saT4KLSAgICAgKiA8bGk+REVGRVJSQUJJTElUWSAtIHNob3J0IC0gZGVmaW5lcyB3aGV0aGVyIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGNhbgotICAgICAqIGJlIGRlZmVycmVkIHVudGlsIGNvbW1pdCAoc2VlIFNRTDkyIHNwZWNpZmljYXRpb24gZm9yIGRlZmluaXRpb25zKToKKyAgICAgKiA8bGk+e0Bjb2RlIEZLX05BTUV9IC0gU3RyaW5nIC0gdGhlIGZvcmVpZ24ga2V5IG5hbWUgKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUEtfTkFNRX0gLSBTdHJpbmcgLSB0aGUgcHJpbWFyeSBrZXkgbmFtZSAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBERUZFUlJBQklMSVRZfSAtIHNob3J0IC0gZGVmaW5lcyB3aGV0aGVyIHRoZSBmb3JlaWduIGtleQorICAgICAqIGNvbnN0cmFpbnRzIGNhbiBiZSBkZWZlcnJlZCB1bnRpbCBjb21taXQgKHNlZSB0aGUgU1FMOTIgc3BlY2lmaWNhdGlvbiBmb3IKKyAgICAgKiBkZWZpbml0aW9ucyk6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5SW5pdGlhbGx5RGVmZXJyZWQ8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5SW5pdGlhbGx5SW1tZWRpYXRlPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleU5vdERlZmVycmFibGU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUluaXRpYWxseURlZmVycmVkfTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5SW5pdGlhbGx5SW1tZWRpYXRlfTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Tm90RGVmZXJyYWJsZX08L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgdG8gaW1wbHkgbm8KLSAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIENhdGFsb2cgTmFtZS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgbXVzdCBtYXRjaCBhIENhdGFsb2cgTmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIgotICAgICAqICAgICAgICAgICAgdXNlZCB0byByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgQ2F0YWxvZyBOYW1lLgorICAgICAqICAgICAgICAgICAgYSBjYXRhbG9nIG5hbWUuIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vIG5hcnJvd2luZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBieSBjYXRhbG9nIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBjYXRhbG9nIG5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgICAgICAgdGhvc2Ugd2l0aG91dCBhIGNhdGFsb2cgbmFtZS4KICAgICAgKiBAcGFyYW0gc2NoZW1hCi0gICAgICogICAgICAgICAgICBhIFNjaGVtYSBOYW1lLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBTY2hlbWEgTmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZQotICAgICAqICAgICAgICAgICAgbXVzdCBtYXRjaCBhIFNjaGVtYSBuYW1lIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvCi0gICAgICogICAgICAgICAgICByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgU2NoZW1hIG5hbWUuCisgICAgICogICAgICAgICAgICBhIHNjaGVtYSBuYW1lLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggYnkgc2NoZW1hIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZSB0aG9zZQorICAgICAqICAgICAgICAgICAgd2l0aG91dCBhIHNjaGVtYSBuYW1lLgogICAgICAqIEBwYXJhbSB0YWJsZQogICAgICAqICAgICAgICAgICAgYSB0YWJsZSBuYW1lLCB3aGljaCBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIGEgdGFibGUgaW4gdGhlCiAgICAgICogICAgICAgICAgICBkYXRhYmFzZQotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgY29udGFpbmluZyBhIHJvdyBmb3IgZWFjaCBvZiB0aGUgZm9yZWlnbiBrZXkgY29sdW1ucywKLSAgICAgKiAgICAgICAgIGFzIGRlZmluZWQgYWJvdmUKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0gY29udGFpbmluZyBhIHJvdyBmb3IgZWFjaCBvZiB0aGUgZm9yZWlnbiBrZXkKKyAgICAgKiAgICAgICAgIGNvbHVtbnMsIGFzIGRlZmluZWQgYWJvdmUKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldEV4cG9ydGVkS2V5cyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYSwgU3RyaW5nIHRhYmxlKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IG1heSBiZSB1c2VkIGluIHVucXVvdGVkIGlkZW50aWZpZXIKLSAgICAgKiBuYW1lcy4gVGhlIGNoYXJhY3RlcnMgYS16LCBBLVosIDAtOSBhbmQgXyBhcmUgYWx3YXlzIHBlcm1pdHRlZC4KKyAgICAgKiBuYW1lcy4gVGhlIGNoYXJhY3RlcnMge0Bjb2RlIGEten0sIHtAY29kZSBBLVp9LCB7QGNvZGUgMC05fSBhbmQge0Bjb2RlIF99CisgICAgICogYXJlIGFsd2F5cyBwZXJtaXR0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgZXh0cmEgY2hhcmFjdGVycworICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIGFkZGl0aW9uYWwgcGVybWl0dGVkIGNoYXJhY3RlcnMuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhTmFtZUNoYXJhY3RlcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC05NzYsNyArMTA5OCw4IEBACiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgU3RyaW5nIHVzZWQgdG8gcXVvdGUgU1FMIGlkZW50aWZpZXJzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyUXVvdGVTdHJpbmcoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC05ODUsODMgKzExMDgsODcgQEAKICAgICAgKiByZWZlcmVuY2VkIGJ5IHRoZSB0YWJsZSdzIGZvcmVpZ24ga2V5IGNvbHVtbnMgKHRoYXQgaXMsIHRoZSBwcmltYXJ5IGtleXMKICAgICAgKiBpbXBvcnRlZCBieSBhIHRhYmxlKS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgbGlzdCByZXR1cm5lZCBpcyBhIDxjb2RlPlJlc3VsdFNldDwvY29kZT4gd2l0aCBhIHJvdyBlbnRyeSBmb3IgZWFjaAotICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiwgb3JkZXJlZCBieSA8Y29kZT5QS1RBQkxFX0NBVDwvY29kZT4sCi0gICAgICogPGNvZGU+UEtUQUJMRV9TQ0hFTTwvY29kZT4sIDxjb2RlPlBLVEFCTEVfTkFNRTwvY29kZT4sIGFuZAotICAgICAqIDxjb2RlPktFWV9TRVE8L2NvZGU+LCB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgICAqIFRoZSBsaXN0IHJldHVybmVkIGlzIGEge0Bjb2RlIFJlc3VsdFNldH0gd2l0aCBhIHJvdyBlbnRyeSBmb3IgZWFjaAorICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiwgb3JkZXJlZCBieSB7QGNvZGUgUEtUQUJMRV9DQVR9LCB7QGNvZGUgUEtUQUJMRV9TQ0hFTX0sIAorICAgICAqIHtAY29kZSBQS1RBQkxFX05BTUV9LCBhbmQge0Bjb2RlIEtFWV9TRVF9LCB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+PGNvZGU+UEtUQUJMRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgQ2F0YWxvZyBuYW1lIGJlaW5nCi0gICAgICogaW1wb3J0ZWQgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBLVEFCTEVfU0NIRU08L2NvZGU+IC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgU2NoZW1hIG5hbWUKLSAgICAgKiBiZWluZyBpbXBvcnRlZCAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBLVEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBwcmltYXJ5IGtleSBUYWJsZSBuYW1lIGJlaW5nCi0gICAgICogaW1wb3J0ZWQgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+UEtDT0xVTU5fTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZQotICAgICAqIGJlaW5nIGltcG9ydGVkPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+RktUQUJMRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gZm9yZWlnbiBrZXkgdGFibGUgY2F0YWxvZyBuYW1lCi0gICAgICogKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkZLVEFCTEVfU0NIRU08L2NvZGU+IC0gU3RyaW5nIC0gZm9yZWlnbiBrZXkgdGFibGUgU2NoZW1hCi0gICAgICogbmFtZSAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkZLVEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBmb3JlaWduIGtleSB0YWJsZSBuYW1lPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+RktDT0xVTU5fTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBmb3JlaWduIGtleSBjb2x1bW4gbmFtZTwvbGk+Ci0gICAgICogPGxpPktFWV9TRVEgLSBzaG9ydCAtIHNlcXVlbmNlIG51bWJlciBpbiB0aGUgZm9yZWlnbiBrZXk8L2xpPgotICAgICAqIDxsaT5VUERBVEVfUlVMRSAtIHNob3J0IC0gaG93IHRvIHRyZWF0IGZvcmVpZ24ga2V5IHdoZW4gcHJpbWFyeSBrZXkgaXMKLSAgICAgKiB1cGRhdGVkOgorICAgICAqIDxsaT57QGNvZGUgUEtUQUJMRV9DQVR9IC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgY2F0YWxvZyBuYW1lIGJlaW5nCisgICAgICogaW1wb3J0ZWQgKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUEtUQUJMRV9TQ0hFTX0gLSBTdHJpbmcgLSBwcmltYXJ5IGtleSBzY2hlbWEgbmFtZSBiZWluZworICAgICAqIGltcG9ydGVkIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBLVEFCTEVfTkFNRX0gLSBTdHJpbmcgLSBwcmltYXJ5IGtleSB0YWJsZSBuYW1lIGJlaW5nIGltcG9ydGVkCisgICAgICogPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBLQ09MVU1OX05BTUV9IC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUgYmVpbmcKKyAgICAgKiBpbXBvcnRlZDwvbGk+CisgICAgICogPGxpPntAY29kZSBGS1RBQkxFX0NBVH0gLSBTdHJpbmcgLSBmb3JlaWduIGtleSB0YWJsZSBjYXRhbG9nIG5hbWUKKyAgICAgKiAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBGS1RBQkxFX1NDSEVNfSAtIFN0cmluZyAtIGZvcmVpZ24ga2V5IHRhYmxlIHNjaGVtYSBuYW1lCisgICAgICogKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRktUQUJMRV9OQU1FfSAtIFN0cmluZyAtIGZvcmVpZ24ga2V5IHRhYmxlIG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRktDT0xVTU5fTkFNRX0gLSBTdHJpbmcgLSBmb3JlaWduIGtleSBjb2x1bW4gbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBLRVlfU0VRfSAtIHNob3J0IC0gc2VxdWVuY2UgbnVtYmVyIChpbiB0aGUgZm9yZWlnbiBrZXkpPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFVQREFURV9SVUxFfSAtIHNob3J0IC0gaG93IHRvIHRyZWF0IHRoZSBmb3JlaWduIGtleSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHByaW1hcnkKKyAgICAgKiBrZXkgaXMgdXBkYXRlZDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlOb0FjdGlvbiAtIGRvbid0IGFsbG93IHVwZGF0ZSBvZiBwcmltYXJ5Ci0gICAgICoga2V5IGlmIGltcG9ydGVkPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUNhc2NhZGUgLSBjaGFuZ2UgaW1wb3J0ZWQga2V5IHRvIG1hdGNoCi0gICAgICogdGhlIHByaW1hcnkga2V5IHVwZGF0ZTwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlTZXROdWxsIC0gc2V0IHRoZSBpbXBvcnRlZCBrZXkgdG8KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPjwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlTZXREZWZhdWx0IC0gc2V0IHRoZSBpbXBvcnRlZCBrZXkgdG8KLSAgICAgKiBkZWZhdWx0IHZhbHVlczwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlSZXN0cmljdCAtIHNhbWUgYXMgaW1wb3J0ZWRLZXlOb0FjdGlvbjwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Tm9BY3Rpb259IC0gZG9uJ3QgYWxsb3cgYW55IHVwZGF0ZSBvZgorICAgICAqIHRoZSBwcmltYXJ5IGtleSBpZiBpdCBpcyBpbXBvcnRlZCBhcyBhIGZvcmVpZ24ga2V5PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlDYXNjYWRlfSAtIGNoYW5nZSBpbXBvcnRlZCBrZXkgdG8KKyAgICAgKiBtYXRjaCB0aGUgcHJpbWFyeSBrZXkgdXBkYXRlPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlTZXROdWxsfSAtIHNldCB0aGUgaW1wb3J0ZWQga2V5IHRvCisgICAgICoge0Bjb2RlIG51bGx9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlTZXREZWZhdWx0fSAtIHNldCB0aGUgaW1wb3J0ZWQga2V5CisgICAgICogdG8gaXRzIGRlZmF1bHQgdmFsdWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVJlc3RyaWN0fSAtIHNhbWUgYXMKKyAgICAgKiBpbXBvcnRlZEtleU5vQWN0aW9uPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+Ci0gICAgICogPGxpPkRFTEVURV9SVUxFIC0gc2hvcnQgLSBob3cgdG8gdHJlYXQgZm9yZWlnbiBrZXkgd2hlbiBwcmltYXJ5IGtleSBpcwotICAgICAqIGRlbGV0ZWQ6CisgICAgICogPGxpPntAY29kZSBERUxFVEVfUlVMRX0gLSBzaG9ydCAtIGhvdyB0byB0cmVhdCB0aGUgZm9yZWlnbiBrZXkgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBwcmltYXJ5CisgICAgICoga2V5IGlzIGRlbGV0ZWQ6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5Tm9BY3Rpb24gLSBkb24ndCBhbGxvdyBkZWxldGUgb2YgcHJpbWFyeQotICAgICAqIGtleSBpZiBpbXBvcnRlZDwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlDYXNjYWRlIC0gZGVsZXRlIHRob3NlIHJvd3MgdGhhdCBpbXBvcnQKLSAgICAgKiBhIGRlbGV0ZWQga2V5PC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldE51bGwgLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVNldERlZmF1bHQgLSBzZXQgdGhlIGltcG9ydGVkIGtleSB0bwotICAgICAqIGRlZmF1bHQgdmFsdWVzPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVJlc3RyaWN0IC0gc2FtZSBhcyBpbXBvcnRlZEtleU5vQWN0aW9uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlOb0FjdGlvbn0gLSBkb24ndCBhbGxvdyB0aGUgcHJpbWFyeSBrZXkgdG8gYmUgZGVsZXRlZAorICAgICAqIGlmIGl0IGlzIGltcG9ydGVkIGFzIGEgZm9yZWlnbiBrZXk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUNhc2NhZGV9IC0gZGVsZXRlIHRob3NlIHJvd3MgdGhhdAorICAgICAqIGltcG9ydCBhIGRlbGV0ZWQga2V5PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlTZXROdWxsfSAtIHNldCB0aGUgaW1wb3J0ZWQga2V5IHRvCisgICAgICoge0Bjb2RlIG51bGx9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlTZXREZWZhdWx0fSAtIHNldCB0aGUgaW1wb3J0ZWQga2V5CisgICAgICogdG8gaXRzIGRlZmF1bHQgdmFsdWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleVJlc3RyaWN0fSAtIHNhbWUgYXMge0Bjb2RlCisgICAgICogaW1wb3J0ZWRLZXlOb0FjdGlvbn08L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KLSAgICAgKiA8bGk+RktfTkFNRSAtIFN0cmluZyAtIGZvcmVpZ24ga2V5IG5hbWUgKHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPlBLX05BTUUgLSBTdHJpbmcgLSBwcmltYXJ5IGtleSBuYW1lIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT5ERUZFUlJBQklMSVRZIC0gc2hvcnQgLSBkZWZpbmVzIHdoZXRoZXIgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgY2FuCi0gICAgICogYmUgZGVmZXJyZWQgdW50aWwgY29tbWl0IChzZWUgU1FMOTIgc3BlY2lmaWNhdGlvbiBmb3IgZGVmaW5pdGlvbnMpOgorICAgICAqIDxsaT57QGNvZGUgRktfTkFNRX0gLSBTdHJpbmcgLSBmb3JlaWduIGtleSBuYW1lIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBLX05BTUV9IC0gU3RyaW5nIC0gcHJpbWFyeSBrZXkgbmFtZSAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBERUZFUlJBQklMSVRZfSAtIHNob3J0IC0gZGVmaW5lcyB3aGV0aGVyIGZvcmVpZ24ga2V5CisgICAgICogY29uc3RyYWludHMgY2FuIGJlIGRlZmVycmVkIHVudGlsIGNvbW1pdCAoc2VlIFNRTDkyIHNwZWNpZmljYXRpb24gZm9yCisgICAgICogZGVmaW5pdGlvbnMpOgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUluaXRpYWxseURlZmVycmVkPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUluaXRpYWxseUltbWVkaWF0ZTwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlOb3REZWZlcnJhYmxlPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlJbml0aWFsbHlEZWZlcnJlZH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUluaXRpYWxseUltbWVkaWF0ZX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleU5vdERlZmVycmFibGV9PC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+CiAgICAgICogPC9vbD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNhdGFsb2cKLSAgICAgKiAgICAgICAgICAgIGEgQ2F0YWxvZyBOYW1lLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBDYXRhbG9nIE5hbWUuIE90aGVyd2lzZSwgdGhlCi0gICAgICogICAgICAgICAgICBuYW1lIG11c3QgbWF0Y2ggYSBDYXRhbG9nIE5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIKLSAgICAgKiAgICAgICAgICAgIHVzZWQgdG8gcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIENhdGFsb2cgTmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgY2F0YWxvZyBuYW1lLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggYnkgY2F0YWxvZyBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQorICAgICAqICAgICAgICAgICAgY2F0YWxvZyBuYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKKyAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBjYXRhbG9nIG5hbWUuCiAgICAgICogQHBhcmFtIHNjaGVtYQotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZS4gPGNvZGU+bnVsbDwvY29kZT4gaXMgdXNlZCB0byBpbXBseSBubwotICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG11c3QgbWF0Y2ggYSBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0bwotICAgICAqICAgICAgICAgICAgcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIFNjaGVtYSBuYW1lLgorICAgICAqICAgICAgICAgICAgYSBzY2hlbWEgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQorICAgICAqICAgICAgICAgICAgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUgdGhvc2UKKyAgICAgKiAgICAgICAgICAgIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gdGFibGUKICAgICAgKiAgICAgICAgICAgIGEgdGFibGUgbmFtZSwgd2hpY2ggbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiBhIHRhYmxlIGluIHRoZQotICAgICAqICAgICAgICAgICAgZGF0YWJhc2UKLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBhcyByb3dzIGluCi0gICAgICogICAgICAgICB0aGUgZm9ybWF0IGRlZmluZWQgYWJvdmUuCisgICAgICogICAgICAgICAgICBkYXRhYmFzZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0gY29udGFpbmluZyB0aGUgbGlzdCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGFzCisgICAgICogICAgICAgICByb3dzIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBhYm92ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0SW1wb3J0ZWRLZXlzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFibGUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtMTA2OSw3MCArMTE5Niw3MyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGluZGljZXMgYW5kIHN0YXRpc3RpY3MgZm9yIGEgc3BlY2lmaWVkIHRhYmxlLgogICAgICAqIDxwPgotICAgICAqIFRoZSBsaXN0IGlzIHJldHVybmVkIGFzIGEgUmVzdWx0U2V0LCB3aXRoIG9uZSByb3cgZm9yIGVhY2ggaW5kZXggb3IKLSAgICAgKiBzdGF0aXN0aWMuIFRoZSBsaXN0IGlzIG9yZGVyZWQgYnkgTk9OX1VOSVFVRSwgVFlQRSwgSU5ERVhfTkFNRSwgYW5kCi0gICAgICogT1JESU5BTF9QT1NJVElPTi4gRWFjaCByb3cgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgICAqIFRoZSBsaXN0IGlzIHJldHVybmVkIGFzIGEge0Bjb2RlIFJlc3VsdFNldH0sIHdpdGggb25lIHJvdyBmb3IgZWFjaCBpbmRleAorICAgICAqIG9yIHN0YXRpc3RpYy4gVGhlIGxpc3QgaXMgb3JkZXJlZCBieSB7QGNvZGUgTk9OX1VOSVFVRX0sIHtAY29kZSBUWVBFfSwKKyAgICAgKiB7QGNvZGUgSU5ERVhfTkFNRX0sIGFuZCB7QGNvZGUgT1JESU5BTF9QT1NJVElPTn0uIEVhY2ggcm93IGhhcyB0aGUKKyAgICAgKiBmb2xsb3dpbmcgZm9ybWF0OgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+PGNvZGU+VEFCTEVfQ0FUPC9jb2RlPiAtIFN0cmluZyAtIHRhYmxlIGNhdGFsb2cgbmFtZSAocG9zc2libHkKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9TQ0hFTTwvY29kZT4gLSBTdHJpbmcgLSBUYWJsZSBTY2hlbWEgbmFtZSAocG9zc2libHkKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPikgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBUaGUgVGFibGUgbmFtZSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5OT05fVU5JUVVFPC9jb2RlPiAtIGJvb2xlYW4gLSA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIGluZGV4Ci0gICAgICogdmFsdWVzIGNhbiBiZSBub24tdW5pcXVlLiBNdXN0IGJlIDxjb2RlPmZhbHNlPC9jb2RlPiB3aGVuIFRZUEUgaXMKLSAgICAgKiB0YWJsZUluZGV4U3RhdGlzdGljPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+SU5ERVhfUVVBTElGSUVSPC9jb2RlPiAtIFN0cmluZyA6IGluZGV4IGNhdGFsb2cgbmFtZS4KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIFRZUEUgaXMgJ3RhYmxlSW5kZXhTdGF0aXN0aWMnPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+SU5ERVhfTkFNRTwvY29kZT4gLSBTdHJpbmcgOiBpbmRleCBuYW1lLiA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIHdoZW4gVFlQRSBpcyAndGFibGVJbmRleFN0YXRpc3RpYyc8L2xpPgotICAgICAqIDxsaT5UWVBFIC0gc2hvcnQgLSB0aGUgaW5kZXggdHlwZS4gT25lIG9mOgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfQ0FUfSAtIFN0cmluZyAtIHRhYmxlIGNhdGFsb2cgbmFtZSAocG9zc2libHkge0Bjb2RlCisgICAgICogbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX1NDSEVNfSAtIFN0cmluZyAtIHRhYmxlIHNjaGVtYSBuYW1lIChwb3NzaWJseSB7QGNvZGUKKyAgICAgKiBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfTkFNRX0gLSBTdHJpbmcgLSBUaGUgdGFibGUgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBOT05fVU5JUVVFfSAtIGJvb2xlYW4gLSB7QGNvZGUgdHJ1ZX0gd2hlbiBpbmRleCB2YWx1ZXMgY2FuIGJlCisgICAgICogbm9uLXVuaXF1ZS4gTXVzdCBiZSB7QGNvZGUgZmFsc2V9IHdoZW4gdGhlIFRZUEUgaXMgdGFibGVJbmRleFN0YXRpc3RpYzwvbGk+CisgICAgICogPGxpPntAY29kZSBJTkRFWF9RVUFMSUZJRVJ9IC0gU3RyaW5nIDogaW5kZXggY2F0YWxvZyBuYW1lLiB7QGNvZGUgbnVsbH0KKyAgICAgKiB3aGVuIHRoZSBUWVBFIGlzICd0YWJsZUluZGV4U3RhdGlzdGljJzwvbGk+CisgICAgICogPGxpPntAY29kZSBJTkRFWF9OQU1FfSAtIFN0cmluZyA6IGluZGV4IG5hbWUuIHtAY29kZSBudWxsfSB3aGVuIFRZUEUgaXMKKyAgICAgKiAndGFibGVJbmRleFN0YXRpc3RpYyc8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVFlQRX0gLSBzaG9ydCAtIHRoZSBpbmRleCB0eXBlLiBPbmUgb2Y6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnRhYmxlSW5kZXhTdGF0aXN0aWMgLSB0YWJsZSBzdGF0aXN0aWNzIHJldHVybmVkCi0gICAgICogd2l0aCBJbmRleCBkZXNjcmlwdGlvbnM8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnRhYmxlSW5kZXhDbHVzdGVyZWQgLSBhIGNsdXN0ZXJlZCBJbmRleDwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEudGFibGVJbmRleEhhc2hlZCAtIGEgaGFzaGVkIEluZGV4PC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS50YWJsZUluZGV4T3RoZXIgLSBvdGhlciBzdHlsZSBvZiBJbmRleDwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnRhYmxlSW5kZXhTdGF0aXN0aWN9IC0gdGFibGUgc3RhdGlzdGljcworICAgICAqIHJldHVybmVkIHdpdGggSW5kZXggZGVzY3JpcHRpb25zPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEudGFibGVJbmRleENsdXN0ZXJlZH0gLSBhIGNsdXN0ZXJlZCBJbmRleDwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnRhYmxlSW5kZXhIYXNoZWR9IC0gYSBoYXNoZWQgSW5kZXg8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS50YWJsZUluZGV4T3RoZXJ9IC0gb3RoZXIgc3R5bGUgb2YgSW5kZXg8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KLSAgICAgKiA8bGk+T1JESU5BTF9QT1NJVElPTiAtIHNob3J0IC0gY29sdW1uIHNlcXVlbmNlIHdpdGhpbiBJbmRleC4gMCB3aGVuIFRZUEUKLSAgICAgKiBpcyB0YWJsZUluZGV4U3RhdGlzdGljIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNPTFVNTl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBjb2x1bW4gbmFtZS4KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIFRZUEUgaXMgdGFibGVJbmRleFN0YXRpc3RpYzwvbGk+Ci0gICAgICogPGxpPkFTQ19PUl9ERVNDIC0gU3RyaW5nIC0gY29sdW1uIHNvcnQgc2VxdWVuY2UuIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgICAgICogPGxpPntAY29kZSBPUkRJTkFMX1BPU0lUSU9OfSAtIHNob3J0IC0gY29sdW1uIHNlcXVlbmNlIHdpdGhpbiBJbmRleC4gMAorICAgICAqIHdoZW4gVFlQRSBpcyB0YWJsZUluZGV4U3RhdGlzdGljPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIENPTFVNTl9OQU1FfSAtIFN0cmluZyAtIHRoZSBjb2x1bW4gbmFtZS4ge0Bjb2RlIG51bGx9IHdoZW4KKyAgICAgKiBUWVBFIGlzIHRhYmxlSW5kZXhTdGF0aXN0aWM8L2xpPgorICAgICAqIDxsaT57QGNvZGUgQVNDX09SX0RFU0N9IC0gU3RyaW5nIC0gY29sdW1uIHNvcnQgc2VxdWVuY2UuIHtAY29kZSBudWxsfSBpZgogICAgICAqIHNlcXVlbmNpbmcgbm90IHN1cHBvcnRlZCBvciBUWVBFIGlzIHRhYmxlSW5kZXhTdGF0aXN0aWM7IG90aGVyd2lzZSAiQSIKLSAgICAgKiBtZWFucyBzb3J0IGFzY2VuZGluZyBhbmQgIkQiIG1lYW5zIHNvcnQgZGVzY2VuZGluZy4gPC9saT4KLSAgICAgKiA8bGk+Q0FSRElOQUxJVFkgLSBpbnQgLSBOdW1iZXIgb2YgdW5pcXVlIHZhbHVlcyBpbiB0aGUgSW5kZXguIElmIFRZUEUgaXMKLSAgICAgKiB0YWJsZUluZGV4U3RhdGlzdGljLCB0aGlzIGlzIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS48L2xpPgotICAgICAqIDxsaT5QQUdFUyAtIGludCAtIE51bWJlciBvZiBwYWdlcyBmb3IgY3VycmVudCBJbmRleC4gSWYgVFlQRSBpcworICAgICAqIG1lYW5zIHNvcnQgYXNjZW5kaW5nIGFuZCAiRCIgbWVhbnMgc29ydCBkZXNjZW5kaW5nLjwvbGk+CisgICAgICogPGxpPntAY29kZSBDQVJESU5BTElUWX0gLSBpbnQgLSBOdW1iZXIgb2YgdW5pcXVlIHZhbHVlcyBpbiB0aGUgSW5kZXguIElmCisgICAgICogVFlQRSBpcyB0YWJsZUluZGV4U3RhdGlzdGljLCB0aGlzIGlzIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS48L2xpPgorICAgICAqIDxsaT57QGNvZGUgUEFHRVN9IC0gaW50IC0gTnVtYmVyIG9mIHBhZ2VzIGZvciBjdXJyZW50IEluZGV4LiBJZiBUWVBFIGlzCiAgICAgICogdGFibGVJbmRleFN0YXRpc3RpYywgdGhpcyBpcyBudW1iZXIgb2YgcGFnZXMgdXNlZCBmb3IgdGhlIHRhYmxlLjwvbGk+Ci0gICAgICogPGxpPkZJTFRFUl9DT05ESVRJT04gLSBTdHJpbmcgLSBGaWx0ZXIgY29uZGl0aW9uLiAocG9zc2libHkgbnVsbCkgPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEZJTFRFUl9DT05ESVRJT059IC0gU3RyaW5nIC0gRmlsdGVyIGNvbmRpdGlvbi4gKHBvc3NpYmx5IG51bGwpCisgICAgICogPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzZWFyY2ggdXNpbmcgQ2F0YWxvZyBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQotICAgICAqICAgICAgICAgICAgQ2F0YWxvZyBOYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKLSAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBDYXRhbG9nIE5hbWUuCisgICAgICogICAgICAgICAgICBhIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IGNhdGFsb2cgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgbmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCisgICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgY2F0YWxvZyBuYW1lLgogICAgICAqIEBwYXJhbSBzY2hlbWEKLSAgICAgKiAgICAgICAgICAgIGEgU2NoZW1hIE5hbWUuIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCi0gICAgICogICAgICAgICAgICBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZSB0aG9zZQotICAgICAqICAgICAgICAgICAgd2l0aG91dCBhIFNjaGVtYSBuYW1lLgorICAgICAqICAgICAgICAgICAgYSBzY2hlbWEgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQorICAgICAqICAgICAgICAgICAgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUgdGhvc2UKKyAgICAgKiAgICAgICAgICAgIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gdGFibGUKICAgICAgKiAgICAgICAgICAgIGEgdGFibGUgbmFtZSwgd2hpY2ggbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiBhIHRhYmxlIGluIHRoZQotICAgICAqICAgICAgICAgICAgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIGRhdGFiYXNlLgogICAgICAqIEBwYXJhbSB1bmlxdWUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIG9ubHkgcmV0dXJuIGluZGljZXMgZm9yIHVuaXF1ZQotICAgICAqICAgICAgICAgICAgdmFsdWVzLCA8Y29kZT5mYWxzZTwvY29kZT4gaW1wbGllcyB0aGF0IHRoZXkgY2FuIGJlIHJldHVybmVkCi0gICAgICogICAgICAgICAgICBldmVuIGlmIG5vdCB1bmlxdWUuCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gbWVhbnMgb25seSByZXR1cm4gaW5kaWNlcyBmb3IgdW5pcXVlIHZhbHVlcywKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gaW1wbGllcyB0aGF0IHRoZXkgY2FuIGJlIHJldHVybmVkIGV2ZW4gaWYgbm90CisgICAgICogICAgICAgICAgICB1bmlxdWUuCiAgICAgICogQHBhcmFtIGFwcHJveGltYXRlCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpbXBsaWVzIHRoYXQgdGhlIGxpc3QgY2FuIGNvbnRhaW4KLSAgICAgKiAgICAgICAgICAgIGFwcHJveGltYXRlIG9yICJvdXQgb2YgZGF0YSIgdmFsdWVzLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgICAgIGltcGxpZXMgdGhhdCBhbGwgdmFsdWVzIG11c3QgYmUgcHJlY2lzZWx5IGFjY3VyYXRlCi0gICAgICogQHJldHVybiBhIFJlc3VsdFNldCBjb250YWluaW5nIHRoZSBsaXN0IG9mIGluZGljZXMgYW5kIHN0YXRpc3RpY3MgZm9yIHRoZQotICAgICAqICAgICAgICAgdGFibGUsIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBhYm92ZS4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpbXBsaWVzIHRoYXQgdGhlIGxpc3QgY2FuIGNvbnRhaW4gYXBwcm94aW1hdGUgb3IKKyAgICAgKiAgICAgICAgICAgICJvdXQgb2YgZGF0YSIgdmFsdWVzLCB7QGNvZGUgZmFsc2V9IGltcGxpZXMgdGhhdCBhbGwgdmFsdWVzCisgICAgICogICAgICAgICAgICBtdXN0IGJlIHByZWNpc2VseSBhY2N1cmF0ZQorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSBjb250YWluaW5nIHRoZSBsaXN0IG9mIGluZGljZXMgYW5kIHN0YXRpc3RpY3MKKyAgICAgKiAgICAgICAgIGZvciB0aGUgdGFibGUsIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBhYm92ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0SW5kZXhJbmZvKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFibGUsCiAgICAgICAgICAgICBib29sZWFuIHVuaXF1ZSwgYm9vbGVhbiBhcHByb3hpbWF0ZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKQEAgLTExNDAsMTggKzEyNzAsMjAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoaXMgZHJpdmVyJ3MgbWFqb3IgSkRCQyB2ZXJzaW9uIG51bWJlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYWpvciBKREJDIHZlcnNpb24gbnVtYmVyCisgICAgICogQHJldHVybiB0aGUgbWFqb3IgSkRCQyB2ZXJzaW9uIG51bWJlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SkRCQ01ham9yVmVyc2lvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtaW5vciBKREJDIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIGRyaXZlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBNaW5vciBKREJDIFZlcnNpb24gTnVtYmVyCisgICAgICogQHJldHVybiB0aGUgTWlub3IgSkRCQyBWZXJzaW9uIE51bWJlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SkRCQ01pbm9yVmVyc2lvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTExNjIsMTcgKzEyOTQsMTkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBoZXggY2hhcmFjdGVycyBpbiBhbiBpbi1saW5lIGJpbmFyeQogICAgICAqICAgICAgICAgbGl0ZXJhbC4gSWYgdGhlIG51bWJlciBpcyB1bmxpbWl0ZWQgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heEJpbmFyeUxpdGVyYWxMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIGEgQ2F0YWxvZyBuYW1lIGluIHRoaXMgZGF0YWJhc2UuCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIGEgY2F0YWxvZyBuYW1lIGluIHRoaXMgZGF0YWJhc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBzaXplIGluIGNoYXJhY3RlcnMgZm9yIGEgQ2F0YWxvZyBuYW1lLiBJZiB0aGUgbGltaXQKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgaW4gY2hhcmFjdGVycyBmb3IgYSBjYXRhbG9nIG5hbWUuIElmIHRoZSBsaW1pdAogICAgICAqICAgICAgICAgaXMgdW5rbm93biwgb3IgdGhlIHZhbHVlIGlzIHVubGltaXRlZCwgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heENhdGFsb2dOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMTE4Myw3ICsxMzE3LDggQEAKICAgICAgKiAgICAgICAgIGxpbWl0IGlzIHVua25vd24sIG9yIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWQsIHRoZW4gdGhlIHJlc3VsdCBpcwogICAgICAqICAgICAgICAgemVyby4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q2hhckxpdGVyYWxMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMTkzLDE3ICsxMzI4LDIxIEBACiAgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3IgYSBDb2x1bW4gbmFtZS4gSWYgdGhlIGxpbWl0CiAgICAgICogICAgICAgICBpcyB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQgaXMgemVyby4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29sdW1uTmFtZUxlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSBHUk9VUCBCWSBjbGF1c2UgZm9yIHRoaXMgZGF0YWJhc2UuCisgICAgICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGluIGEge0Bjb2RlIEdST1VQIEJZfSBjbGF1c2UgZm9yIHRoaXMKKyAgICAgKiBkYXRhYmFzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGluIGEgR1JPVVAgQlkgY2xhdXNlLiBJZiB0aGUgbGltaXQKLSAgICAgKiAgICAgICAgIGlzIHVua25vd24sIG9yIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWQsIHRoZW4gdGhlIHJlc3VsdCBpcyB6ZXJvLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSB7QGNvZGUgR1JPVVAgQll9IGNsYXVzZS4gSWYKKyAgICAgKiAgICAgICAgIHRoZSBsaW1pdCBpcyB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQKKyAgICAgKiAgICAgICAgIGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heENvbHVtbnNJbkdyb3VwQnkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMjEzLDI4ICsxMzUyLDM0IEBACiAgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiBhbiBJbmRleC4gSWYgdGhlIGxpbWl0IGlzCiAgICAgICogICAgICAgICB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQgaXMgemVyby4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29sdW1uc0luSW5kZXgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiBhbiBPUkRFUiBCWSBjbGF1c2UgZm9yIHRoaXMKLSAgICAgKiBkYXRhYmFzZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGluIGFuIHtAY29kZSBPUkRFUiBCWX0gY2xhdXNlIGZvcgorICAgICAqIHRoaXMgZGF0YWJhc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiBhbiBPUkRFUiBCWSBjbGF1c2UuIElmIHRoZSBsaW1pdAotICAgICAqICAgICAgICAgaXMgdW5rbm93biwgb3IgdGhlIHZhbHVlIGlzIHVubGltaXRlZCwgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiBhbiB7QGNvZGUgT1JERVIgQll9IGNsYXVzZS4gSWYKKyAgICAgKiAgICAgICAgIHRoZSBsaW1pdCBpcyB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQKKyAgICAgKiAgICAgICAgIGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heENvbHVtbnNJbk9yZGVyQnkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIFNFTEVDVCBsaXN0IGZvciB0aGlzIGRhdGFiYXNlLgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSB7QGNvZGUgU0VMRUNUfSBsaXN0IGZvciB0aGlzCisgICAgICogZGF0YWJhc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIFNFTEVDVCBsaXN0LiBJZiB0aGUgbGltaXQgaXMKLSAgICAgKiAgICAgICAgIHVua25vd24sIG9yIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWQsIHRoZW4gdGhlIHJlc3VsdCBpcyB6ZXJvLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSB7QGNvZGUgU0VMRUNUfSBsaXN0LiBJZiB0aGUKKyAgICAgKiAgICAgICAgIGxpbWl0IGlzIHVua25vd24sIG9yIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWQsIHRoZW4gdGhlIHJlc3VsdCBpcworICAgICAqICAgICAgICAgemVyby4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29sdW1uc0luU2VsZWN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMTI0NCw3ICsxMzg5LDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGluIGEgdGFibGUuIElmIHRoZSBsaW1pdCBpcwogICAgICAqICAgICAgICAgdW5rbm93biwgb3IgdGhlIHZhbHVlIGlzIHVubGltaXRlZCwgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heENvbHVtbnNJblRhYmxlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMTI1NCw3ICsxNDAwLDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy4gSWYgdGhlIGxpbWl0IGlzIHVua25vd24sIG9yCiAgICAgICogICAgICAgICB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQgaXMgemVyby4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29ubmVjdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMjY0LDcgKzE0MTEsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBjdXJzb3IgbmFtZS4gSWYgdGhlIGxpbWl0CiAgICAgICogICAgICAgICBpcyB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQgaXMgemVyby4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q3Vyc29yTmFtZUxlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTEyNzUsNyArMTQyMyw4IEBACiAgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggaW4gYnl0ZXMgZm9yIGFuIEluZGV4LiBJZiB0aGUgbGltaXQgaXMKICAgICAgKiAgICAgICAgIHVua25vd24sIG9yIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWQsIHRoZW4gdGhlIHJlc3VsdCBpcyB6ZXJvLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhJbmRleExlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTEyODcsNyArMTQzNiw4IEBACiAgICAgICogICAgICAgICBsaW1pdCBpcyB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQgaXMKICAgICAgKiAgICAgICAgIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heFByb2NlZHVyZU5hbWVMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMjk4LDcgKzE0NDgsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGZvciBhIHNpbmdsZSByb3cuIElmIHRoZSBsaW1pdCBpcwogICAgICAqICAgICAgICAgdW5rbm93biwgb3IgdGhlIHZhbHVlIGlzIHVubGltaXRlZCwgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heFJvd1NpemUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMzA2LDEwICsxNDU3LDExIEBACiAgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHNjaGVtYSBuYW1lIGZvciB0aGlzCiAgICAgICogZGF0YWJhc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIFNjaGVtYSBuYW1lLiBJZiB0aGUgbGltaXQKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc2NoZW1hIG5hbWUuIElmIHRoZSBsaW1pdAogICAgICAqICAgICAgICAgaXMgdW5rbm93biwgb3IgdGhlIHZhbHVlIGlzIHVubGltaXRlZCwgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heFNjaGVtYU5hbWVMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMzIxLDcgKzE0NzMsOCBAQAogICAgICAqICAgICAgICAgbGltaXQgaXMgdW5rbm93biwgb3IgdGhlIHZhbHVlIGlzIHVubGltaXRlZCwgdGhlbiB0aGUgcmVzdWx0IGlzCiAgICAgICogICAgICAgICB6ZXJvLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhTdGF0ZW1lbnRMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMzMyLDcgKzE0ODUsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZW4gYWN0aXZlIHN0YXRlbWVudHMuIElmIHRoZSBsaW1pdCBpcwogICAgICAqICAgICAgICAgdW5rbm93biwgb3IgdGhlIHZhbHVlIGlzIHVubGltaXRlZCwgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heFN0YXRlbWVudHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMzQyLDE5ICsxNDk2LDIxIEBACiAgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBzaXplIGluIGNoYXJhY3RlcnMgZm9yIGEgdGFibGUgbmFtZS4gSWYgdGhlIGxpbWl0IGlzCiAgICAgICogICAgICAgICB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQgaXMgemVyby4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4VGFibGVOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRhYmxlcyBwZXJtaXR0ZWQgaW4gYSBTRUxFQ1Qgc3RhdGVtZW50IGZvcgotICAgICAqIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0YWJsZXMgcGVybWl0dGVkIGluIGEge0Bjb2RlIFNFTEVDVH0KKyAgICAgKiBzdGF0ZW1lbnQgZm9yIHRoZSBkYXRhYmFzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0YWJsZXMgcGVybWl0dGVkIGluIGEgU0VMRUNUIHN0YXRlbWVudC4gSWYKLSAgICAgKiAgICAgICAgIHRoZSBsaW1pdCBpcyB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLCB0aGVuIHRoZSByZXN1bHQKLSAgICAgKiAgICAgICAgIGlzIHplcm8uCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGFibGVzIHBlcm1pdHRlZCBpbiBhIHtAY29kZSBTRUxFQ1R9CisgICAgICogICAgICAgICBzdGF0ZW1lbnQuIElmIHRoZSBsaW1pdCBpcyB1bmtub3duLCBvciB0aGUgdmFsdWUgaXMgdW5saW1pdGVkLAorICAgICAqICAgICAgICAgdGhlbiB0aGUgcmVzdWx0IGlzIHplcm8uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heFRhYmxlc0luU2VsZWN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMTM2NCw3ICsxNTIwLDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgdXNlciBuYW1lLiBJZiB0aGUgbGltaXQgaXMKICAgICAgKiAgICAgICAgIHVua25vd24sIG9yIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWQsIHRoZW4gdGhlIHJlc3VsdCBpcyB6ZXJvLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhVc2VyTmFtZUxlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTEzNzMsMTIyICsxNTMwLDEyOSBAQAogICAgICAqIGFyZSB1c2VkIGluIHRoZSBKREJDIGZ1bmN0aW9uIGVzY2FwZSBjbGF1c2UgYW5kIGFyZSB0aGUgT3BlbiBHcm91cCBDTEkKICAgICAgKiBtYXRoIGZ1bmN0aW9uIG5hbWVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgd2hpY2ggY29udGFpbnMgdGhlIGxpc3Qgb2YgTWF0aCBmdW5jdGlvbnMgYXMgYSBjb21tYQorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgd2hpY2ggY29udGFpbnMgdGhlIGxpc3Qgb2YgbWF0aCBmdW5jdGlvbnMgYXMgYSBjb21tYQogICAgICAqICAgICAgICAgc2VwYXJhdGVkIGxpc3QuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE51bWVyaWNGdW5jdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgb2YgYSBzcGVjaWZpZWQgdGFibGUuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGxpc3QgaXMgcmV0dXJuZWQgYXMgYSBSZXN1bHRTZXQgd2l0aCBvbmUgcm93IGZvciBlYWNoIHByaW1hcnkga2V5Ci0gICAgICogY29sdW1uLCBvcmRlcmVkIGJ5IDxjb2RlPkNPTFVNTl9OQU1FPC9jb2RlPiwgd2l0aCBlYWNoIHJvdyBoYXZpbmcgdGhlCisgICAgICogVGhlIGxpc3QgaXMgcmV0dXJuZWQgYXMgYSB7QGNvZGUgUmVzdWx0U2V0fSB3aXRoIG9uZSByb3cgZm9yIGVhY2ggcHJpbWFyeQorICAgICAqIGtleSBjb2x1bW4sIG9yZGVyZWQgYnkge0Bjb2RlIENPTFVNTl9OQU1FfSwgd2l0aCBlYWNoIHJvdyBoYXZpbmcgdGhlCiAgICAgICogc3RydWN0dXJlIGFzIGZvbGxvd3M6CiAgICAgICogPG9sPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gdGFibGUgY2F0YWxvZyBuYW1lIChwb3NzaWJseQotICAgICAqIG51bGwpPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VEFCTEVfU0NIRU08L2NvZGU+IC0gU3RyaW5nIC0gVGFibGUgU2NoZW1hIG5hbWUgKHBvc3NpYmx5Ci0gICAgICogbnVsbCkgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBUaGUgVGFibGUgbmFtZSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5DT0xVTU5fTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBUaGUgQ29sdW1uIG5hbWUgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+S0VZX1NFUTwvY29kZT4gLSBzaG9ydCAtIHRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoaXMgY29sdW1uCi0gICAgICogaW4gdGhlIHByaW1hcnkga2V5PC9saT4KLSAgICAgKiA8bGk+PGNvZGU+UEtfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSB0aGUgcHJpbWFyeSBrZXkgbmFtZSAocG9zc2libHkKLSAgICAgKiBudWxsKTwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9DQVR9IC0gU3RyaW5nIC0gdGFibGUgY2F0YWxvZyBuYW1lIChwb3NzaWJseSBudWxsKTwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9TQ0hFTX0gLSBTdHJpbmcgLSB0YWJsZSBzY2hlbWEgbmFtZSAocG9zc2libHkgbnVsbCk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfTkFNRX0gLSBTdHJpbmcgLSBUaGUgdGFibGUgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBDT0xVTU5fTkFNRX0gLSBTdHJpbmcgLSBUaGUgY29sdW1uIG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgS0VZX1NFUX0gLSBzaG9ydCAtIHRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoaXMgY29sdW1uIGluIHRoZQorICAgICAqIHByaW1hcnkga2V5PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBLX05BTUV9IC0gU3RyaW5nIC0gdGhlIHByaW1hcnkga2V5IG5hbWUgKHBvc3NpYmx5IG51bGwpPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgdG8gaW1wbHkgbm8KLSAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIENhdGFsb2cgTmFtZS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgbXVzdCBtYXRjaCBhIENhdGFsb2cgTmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCB0aGUKLSAgICAgKiAgICAgICAgICAgIGVtcHR5IHN0cmluZyB1c2VkIHRvIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBDYXRhbG9nIE5hbWUuCisgICAgICogICAgICAgICAgICBhIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IGNhdGFsb2cgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgbmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCB0aGUgZW1wdHkgc3RyaW5nIHVzZWQKKyAgICAgKiAgICAgICAgICAgIHRvIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBjYXRhbG9nIG5hbWUuCiAgICAgICogQHBhcmFtIHNjaGVtYQotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZS4gPGNvZGU+bnVsbDwvY29kZT4gaXMgdXNlZCB0byBpbXBseSBubwotICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG11c3QgbWF0Y2ggYSBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggdGhlIGVtcHR5Ci0gICAgICogICAgICAgICAgICBzdHJpbmcgdXNlZCB0byByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgU2NoZW1hIG5hbWUuCisgICAgICogICAgICAgICAgICBhIHNjaGVtYSBuYW1lLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggYnkgc2NoZW1hIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggdGhlIGVtcHR5IHN0cmluZyB1c2VkIHRvCisgICAgICogICAgICAgICAgICByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgc2NoZW1hIG5hbWUuCiAgICAgICogQHBhcmFtIHRhYmxlCiAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhIHRhYmxlLCB3aGljaCBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIGEgdGFibGUgaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhYmFzZQotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgY29udGFpbmluZyB0aGUgbGlzdCBvZiBrZXlzIGluIHRoZSBmb3JtYXQgZGVmaW5lZAotICAgICAqICAgICAgICAgYWJvdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0gY29udGFpbmluZyB0aGUgbGlzdCBvZiBrZXlzIGluIHRoZSBmb3JtYXQKKyAgICAgKiAgICAgICAgIGRlZmluZWQgYWJvdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFByaW1hcnlLZXlzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFibGUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgcGFyYW1ldGVyIGFuZCByZXN1bHQgY29sdW1ucyBmb3IgdGhlIHN0b3JlZCBwcm9jZWR1cmVzCi0gICAgICogYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIENhdGFsb2cuCisgICAgICogYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIGNhdGFsb2cuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGxpc3QgaXMgcmV0dXJuZWQgYXMgYSBSZXN1bHRTZXQgd2l0aCBvbmUgcm93IGZvciBlYWNoIHBhcmFtZXRlciBvcgotICAgICAqIHJlc3VsdCBjb2x1bW4uIFRoZSBkYXRhIGlzIG9yZGVyZWQgYnkgUFJPQ0VEVVJFX1NDSEVNIGFuZCBQUk9DRURVUkVfTkFNRSwKLSAgICAgKiB3aGlsZSBmb3IgZWFjaCBwcm9jZWR1cmUsIHRoZSByZXR1cm4gdmFsdWUgKGlmIGFueSkgaXMgZmlyc3QsIGZvbGxvd2VkIGJ5Ci0gICAgICogdGhlIHBhcmFtZXRlcnMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwsCi0gICAgICogZm9sbG93ZWQgYnkgUmVzdWx0U2V0IGNvbHVtbnMgaW4gY29sdW1uIG51bWJlciBvcmRlci4gRWFjaCByb3cgaGFzIHRoZQotICAgICAqIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgICAgICogVGhlIGxpc3QgaXMgcmV0dXJuZWQgYXMgYSB7QGNvZGUgUmVzdWx0U2V0fSB3aXRoIG9uZSByb3cgZm9yIGVhY2gKKyAgICAgKiBwYXJhbWV0ZXIgb3IgcmVzdWx0IGNvbHVtbi4gVGhlIGRhdGEgaXMgb3JkZXJlZCBieSB7QGNvZGUKKyAgICAgKiBQUk9DRURVUkVfU0NIRU19IGFuZCB7QGNvZGUgUFJPQ0VEVVJFX05BTUV9LCB3aGlsZSBmb3IgZWFjaCBwcm9jZWR1cmUsCisgICAgICogdGhlIHJldHVybiB2YWx1ZSAoaWYgYW55KSBpcyBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICogb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCwgZm9sbG93ZWQgYnkge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fSBjb2x1bW5zIGluIGNvbHVtbiBudW1iZXIgb3JkZXIuIEVhY2ggcm93IGhhcyB0aGUgZm9sbG93aW5nCisgICAgICogc3RydWN0dXJlOgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+UFJPQ0VEVVJFX0NBVCAtIFN0cmluZyAtIHRoZSBwcm9jZWR1cmUgY2F0YWxvZyBuYW1lPC9saT4KLSAgICAgKiA8bGk+UFJPQ0VEVVJFX1NDSEVNIC0gU3RyaW5nIC0gdGhlIHByb2NlZHVyZSBzY2hlbWEgbmFtZSAocG9zc2libHkgbnVsbCkKLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT5QUk9DRURVUkVfTkFNRSAtIFN0cmluZyAtIHRoZSBwcm9jZWR1cmUgbmFtZTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNPTFVNTl9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW48L2xpPgotICAgICAqIDxsaT5DT0xVTU5fVFlQRSAtIHNob3J0IC0gdGhlIGtpbmQgb2YgY29sdW1uIG9yIHBhcmFtZXRlciwgYXMgZm9sbG93czoKKyAgICAgKiA8bGk+e0Bjb2RlIFBST0NFRFVSRV9DQVR9IC0gU3RyaW5nIC0gdGhlIHByb2NlZHVyZSBjYXRhbG9nIG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUFJPQ0VEVVJFX1NDSEVNfSAtIFN0cmluZyAtIHRoZSBwcm9jZWR1cmUgc2NoZW1hIG5hbWUKKyAgICAgKiAocG9zc2libHkgbnVsbCk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUFJPQ0VEVVJFX05BTUV9IC0gU3RyaW5nIC0gdGhlIHByb2NlZHVyZSBuYW1lPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIENPTFVNTl9OQU1FfSAtIFN0cmluZyAtIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW48L2xpPgorICAgICAqIDxsaT57QGNvZGUgQ09MVU1OX1RZUEV9IC0gc2hvcnQgLSB0aGUga2luZCBvZiBjb2x1bW4gb3IgcGFyYW1ldGVyLCBhcworICAgICAqIGZvbGxvd3M6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZUNvbHVtblVua25vd24gLSB0eXBlIHVua25vd248L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZUNvbHVtbkluIC0gYW4gSU4gcGFyYW1ldGVyPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVDb2x1bW5Jbk91dCAtIGFuIElOT1VUIHBhcmFtZXRlcjwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEucHJvY2VkdXJlQ29sdW1uT3V0IC0gYW4gT1VUIHBhcmFtZXRlcjwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEucHJvY2VkdXJlQ29sdW1uUmV0dXJuIC0gYSByZXR1cm4gdmFsdWU8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZVJldHVybnNSZXN1bHQgLSBhIHJlc3VsdCBjb2x1bW4gaW4gYQotICAgICAqIHJlc3VsdCBzZXQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVDb2x1bW5Vbmtub3dufSAtIHR5cGUgdW5rbm93bjwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZUNvbHVtbklufSAtIGFuIHtAY29kZSBJTn0gcGFyYW1ldGVyPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEucHJvY2VkdXJlQ29sdW1uSW5PdXR9IC0gYW4ge0Bjb2RlIElOT1VUfQorICAgICAqIHBhcmFtZXRlcjwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZUNvbHVtbk91dH0gLSBhbiB7QGNvZGUgT1VUfQorICAgICAqIHBhcmFtZXRlcjwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZUNvbHVtblJldHVybn0gLSBhIHJldHVybiB2YWx1ZTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZVJldHVybnNSZXN1bHR9IC0gYSByZXN1bHQgY29sdW1uIGluCisgICAgICogYSByZXN1bHQgc2V0PC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkRBVEFfVFlQRTwvY29kZT4gLSBpbnQgLSB0aGUgU1FMIHR5cGUgb2YgdGhlIGRhdGEsIGFzIGluCi0gICAgICogPGNvZGU+amF2YS5zcWwuVHlwZXM8L2NvZGU+IDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlRZUEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSB0aGUgU1FMIHR5cGUgbmFtZSwgZm9yIGEgVURUIGl0Ci0gICAgICogaXMgZnVsbHkgcXVhbGlmaWVkPC9saT4KLSAgICAgKiA8bGk+UFJFQ0lTSU9OIC0gaW50IC0gdGhlIHByZWNpc2lvbjwvbGk+Ci0gICAgICogPGxpPkxFTkdUSCAtIGludCAtIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYnl0ZXMgPC9saT4KLSAgICAgKiA8bGk+U0NBTEUgLSBzaG9ydCAtIHRoZSBzY2FsZSBmb3IgbnVtZXJpYyB0eXBlczwvbGk+Ci0gICAgICogPGxpPlJBRElYIC0gc2hvcnQgLSB0aGUgUmFkaXggZm9yIG51bWVyaWMgZGF0YSAodHlwaWNhbGx5IDIgb3IgMTApIDwvbGk+Ci0gICAgICogPGxpPk5VTExBQkxFIC0gc2hvcnQgLSBjYW4gdGhlIGRhdGEgY29udGFpbiBudWxsOgorICAgICAqIDxsaT57QGNvZGUgREFUQV9UWVBFfSAtIGludCAtIHRoZSBTUUwgdHlwZSBvZiB0aGUgZGF0YSwgYXMgaW4ge0Bjb2RlCisgICAgICogamF2YS5zcWwuVHlwZXN9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRZUEVfTkFNRX0gLSBTdHJpbmcgLSB0aGUgU1FMIHR5cGUgbmFtZSwgZm9yIGEgVURUIGl0IGlzIGZ1bGx5CisgICAgICogcXVhbGlmaWVkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBSRUNJU0lPTn0gLSBpbnQgLSB0aGUgcHJlY2lzaW9uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIExFTkdUSH0gLSBpbnQgLSB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIGJ5dGVzPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFNDQUxFfSAtIHNob3J0IC0gdGhlIHNjYWxlIGZvciBudW1lcmljIHR5cGVzPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFJBRElYfSAtIHNob3J0IC0gdGhlIFJhZGl4IGZvciBudW1lcmljIGRhdGEgKHR5cGljYWxseSAyIG9yCisgICAgICogMTApPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIE5VTExBQkxFfSAtIHNob3J0IC0gY2FuIHRoZSBkYXRhIGNvbnRhaW4ge0Bjb2RlIG51bGx9OgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVOb051bGxzIC0gPGNvZGU+TlVMTDwvY29kZT5zIG5vdAorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVOb051bGxzfSAtIHtAY29kZSBOVUxMfXMgbm90CiAgICAgICogcGVybWl0dGVkPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVOdWxsYWJsZSAtIDxjb2RlPk5VTEw8L2NvZGU+cyBhcmUKLSAgICAgKiBwZXJtaXR0ZWQgPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVOdWxsYWJsZVVua25vd24gLSA8Y29kZT5OVUxMPC9jb2RlPgotICAgICAqIHN0YXR1cyB1bmtub3duIDwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZU51bGxhYmxlfSAtIHtAY29kZSBOVUxMfXMgYXJlCisgICAgICogcGVybWl0dGVkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEucHJvY2VkdXJlTnVsbGFibGVVbmtub3dufSAtIHtAY29kZSBOVUxMfQorICAgICAqIHN0YXR1cyB1bmtub3duPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlJFTUFSS1M8L2NvZGU+IC0gU3RyaW5nIC0gYW4gZXhwbGFuYXRvcnkgY29tbWVudCBhYm91dCB0aGUKLSAgICAgKiBkYXRhIGl0ZW0gPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFJFTUFSS1N9IC0gU3RyaW5nIC0gYW4gZXhwbGFuYXRvcnkgY29tbWVudCBhYm91dCB0aGUgZGF0YSBpdGVtCisgICAgICogPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzZWFyY2ggdXNpbmcgQ2F0YWxvZyBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQotICAgICAqICAgICAgICAgICAgQ2F0YWxvZyBOYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKLSAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBDYXRhbG9nIE5hbWUuCisgICAgICogICAgICAgICAgICBhIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IGNhdGFsb2cgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgbmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCisgICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgY2F0YWxvZyBuYW1lLgogICAgICAqIEBwYXJhbSBzY2hlbWFQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFNjaGVtYSBOYW1lIFBhdHRlcm4uIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCi0gICAgICogICAgICAgICAgICBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZSB0aG9zZQotICAgICAqICAgICAgICAgICAgd2l0aG91dCBhIFNjaGVtYSBuYW1lLgorICAgICAqICAgICAgICAgICAgYSBzY2hlbWEgbmFtZSBwYXR0ZXJuLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubworICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggYnkgc2NoZW1hIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUKKyAgICAgKiAgICAgICAgICAgIG11c3QgbWF0Y2ggYSBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0bworICAgICAqICAgICAgICAgICAgcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIHNjaGVtYSBuYW1lLgogICAgICAqIEBwYXJhbSBwcm9jZWR1cmVOYW1lUGF0dGVybgogICAgICAqICAgICAgICAgICAgYSBwYXR0ZXJuIHRoYXQgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgcHJvY2VkdXJlIHN0b3JlZCBpbgotICAgICAqICAgICAgICAgICAgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YWJhc2UuCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWVQYXR0ZXJuCiAgICAgICogICAgICAgICAgICBhIGNvbHVtbiBuYW1lIHBhdHRlcm4uIFRoZSBuYW1lIG11c3QgbWF0Y2ggdGhlIGNvbHVtbiBuYW1lCiAgICAgICogICAgICAgICAgICBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLgotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgd2l0aCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXIgYW5kIHJlc3VsdCBjb2x1bW5zIGluIHRoZQotICAgICAqICAgICAgICAgZm9ybWF0IGRlZmluZWQgYWJvdmUKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0gd2l0aCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXIgYW5kIHJlc3VsdCBjb2x1bW5zCisgICAgICogICAgICAgICBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYWJvdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFByb2NlZHVyZUNvbHVtbnMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXJuLAogICAgICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWVQYXR0ZXJuLCBTdHJpbmcgY29sdW1uTmFtZVBhdHRlcm4pCkBAIC0xNDk3LDQ3ICsxNjYxLDQ4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmVzIGF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBjYXRhbG9nLgogICAgICAqIDxwPgotICAgICAqIFRoZSBsaXN0IGlzIHJldHVybmVkIGFzIGEgUmVzdWx0U2V0IHdpdGggb25lIHJvdyBmb3IgZWFjaCBzdG9yZWQKLSAgICAgKiBwcm9jZWR1cmUsIG9yZGVyZWQgYnkgUFJPQ0VEVVJFX1NDSEVNRSBhbmQgUFJPQ0VEVVJFX05BTUUsIHdpdGggdGhlIGRhdGEKKyAgICAgKiBUaGUgbGlzdCBpcyByZXR1cm5lZCBhcyBhIHtAY29kZSBSZXN1bHRTZXR9IHdpdGggb25lIHJvdyBmb3IgZWFjaCBzdG9yZWQKKyAgICAgKiBwcm9jZWR1cmUsIG9yZGVyZWQgYnkgUFJPQ0VEVVJFX1NDSEVNIGFuZCBQUk9DRURVUkVfTkFNRSwgd2l0aCB0aGUgZGF0YQogICAgICAqIGluIGVhY2ggcm93IGFzIGZvbGxvd3M6CiAgICAgICogPG9sPgotICAgICAqIDxsaT48Y29kZT5QUk9DRURVUkVfQ0FUPC9jb2RlPiAtIFN0cmluZyA6IHRoZSBwcm9jZWR1cmUgY2F0YWxvZyBuYW1lPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+UFJPQ0VEVVJFX1NDSEVNPC9jb2RlPiAtIFN0cmluZyA6IHRoZSBwcm9jZWR1cmUgc2NoZW1hIG5hbWUKLSAgICAgKiAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBST0NFRFVSRV9OQU1FPC9jb2RlPiAtIFN0cmluZyA6IHRoZSBwcm9jZWR1cmUgbmFtZTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlJlc2VydmVkPC9jb2RlPjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlJlc2VydmVkPC9jb2RlPjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlJlc2VydmVkPC9jb2RlPjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlJFTUFSS1M8L2NvZGU+IC0gU3RyaW5nIC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2NlZHVyZTwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBST0NFRFVSRV9UWVBFPC9jb2RlPiAtIHNob3J0IDogb25lIG9mOgorICAgICAqIDxsaT57QGNvZGUgUFJPQ0VEVVJFX0NBVH0gLSBTdHJpbmcgOiB0aGUgcHJvY2VkdXJlIGNhdGFsb2cgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBQUk9DRURVUkVfU0NIRU19IC0gU3RyaW5nIDogdGhlIHByb2NlZHVyZSBzY2hlbWEgbmFtZQorICAgICAqIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBST0NFRFVSRV9OQU1FfSAtIFN0cmluZyA6IHRoZSBwcm9jZWR1cmUgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBSZXNlcnZlZH08L2xpPgorICAgICAqIDxsaT57QGNvZGUgUmVzZXJ2ZWR9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFJlc2VydmVkfTwvbGk+CisgICAgICogPGxpPntAY29kZSBSRU1BUktTfSAtIFN0cmluZyAtIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9jZWR1cmU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgUFJPQ0VEVVJFX1RZUEV9IC0gc2hvcnQgOiBvbmUgb2Y6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZVJlc3VsdFVua25vd24gLSBwcm9jZWR1cmUgbWF5IHJldHVybiBhCi0gICAgICogcmVzdWx0IDwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEucHJvY2VkdXJlTm9SZXN1bHQgLSBwcm9jZWR1cmUgZG9lcyBub3QgcmV0dXJuIGEKLSAgICAgKiByZXN1bHQ8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnByb2NlZHVyZVJldHVybnNSZXN1bHQgLSBwcm9jZWR1cmUgZGVmaW5pdGVseQotICAgICAqIHJldHVybnMgYSByZXN1bHQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVSZXN1bHRVbmtub3dufSAtIHByb2NlZHVyZSBtYXkKKyAgICAgKiByZXR1cm4gYSByZXN1bHQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVOb1Jlc3VsdH0gLSBwcm9jZWR1cmUgZG9lcyBub3QKKyAgICAgKiByZXR1cm4gYSByZXN1bHQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5wcm9jZWR1cmVSZXR1cm5zUmVzdWx0fSAtIHByb2NlZHVyZQorICAgICAqIGRlZmluaXRlbHkgcmV0dXJucyBhIHJlc3VsdDwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8L2xpPgogICAgICAqIDwvb2w+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNhdGFsb2cKLSAgICAgKiAgICAgICAgICAgIGEgQ2F0YWxvZyBOYW1lLiBudWxsIGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mIHRoZQotICAgICAqICAgICAgICAgICAgc2VhcmNoIHVzaW5nIENhdGFsb2cgTmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKLSAgICAgKiAgICAgICAgICAgIENhdGFsb2cgTmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCi0gICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgQ2F0YWxvZyBOYW1lLgorICAgICAqICAgICAgICAgICAgYSBjYXRhbG9nIG5hbWUuIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vIG5hcnJvd2luZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBieSBjYXRhbG9nIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBjYXRhbG9nIG5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgICAgICAgdGhvc2Ugd2l0aG91dCBhIGNhdGFsb2cgbmFtZS4KICAgICAgKiBAcGFyYW0gc2NoZW1hUGF0dGVybgotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZSBQYXR0ZXJuLiBudWxsIGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCi0gICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIHVzaW5nIFNjaGVtYSBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQotICAgICAqICAgICAgICAgICAgU2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUgdGhvc2UKLSAgICAgKiAgICAgICAgICAgIHdpdGhvdXQgYSBTY2hlbWEgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgc2NoZW1hIG5hbWUgcGF0dGVybi4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8KKyAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIGJ5IHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gcHJvY2VkdXJlTmFtZVBhdHRlcm4KICAgICAgKiAgICAgICAgICAgIGEgcHJvY2VkdXJlIG5hbWUgcGF0dGVybiwgd2hpY2ggbXVzdCBtYXRjaCB0aGUgcHJvY2VkdXJlIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UKLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IHdoZXJlIGVhY2ggcm93IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzdG9yZWQgcHJvY2VkdXJlCi0gICAgICogICAgICAgICBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYWJvdmUuCisgICAgICogICAgICAgICAgICBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSB3aGVyZSBlYWNoIHJvdyBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3RvcmVkCisgICAgICogICAgICAgICBwcm9jZWR1cmUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGFib3ZlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc3VsdFNldCBnZXRQcm9jZWR1cmVzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hUGF0dGVybiwKICAgICAgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lUGF0dGVybikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKQEAgLTE1NDUsNTggKzE3MTAsNjIgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSB2ZW5kb3IncyBwcmVmZXJyZWQgbmFtZSBmb3IgInByb2NlZHVyZSIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB2ZW5kb3IncyBwcmVmZXJyZWQgbmFtZSBmb3IgInByb2NlZHVyZSIKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHZlbmRvcidzIHByZWZlcnJlZCBuYW1lIGZvciAicHJvY2VkdXJlIi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2VkdXJlVGVybSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgc2V0J3MgZGVmYXVsdCBob2xkLWFiaWxpdHkuCisgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IHNldCdzIGRlZmF1bHQgaG9sZGFiaWxpdHkuCiAgICAgICogCi0gICAgICogQHJldHVybiBvbmUgb2YgPGNvZGU+UmVzdWx0U2V0LkhPTERfQ1VSU09SU19PVkVSX0NPTU1JVDwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5DTE9TRV9DVVJTT1JTX0FUX0NPTU1JVDwvY29kZT4KKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB7QGNvZGUgUmVzdWx0U2V0LkhPTERfQ1VSU09SU19PVkVSX0NPTU1JVH0gb3Ige0Bjb2RlCisgICAgICogICAgICAgICBSZXN1bHRTZXQuQ0xPU0VfQ1VSU09SU19BVF9DT01NSVR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSZXN1bHRTZXRIb2xkYWJpbGl0eSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgc2NoZW1hIG5hbWVzIGluIHRoZSBkYXRhYmFzZS4gVGhlIGxpc3QgaXMgcmV0dXJuZWQKLSAgICAgKiBhcyBhIFJlc3VsdFNldCwgb3JkZXJlZCBieSB0aGUgU2NoZW1hIG5hbWUsIHdpdGggb25lIHJvdyBwZXIgU2NoZW1hIGluCi0gICAgICogdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgICogYXMgYSB7QGNvZGUgUmVzdWx0U2V0fSwgb3JkZXJlZCBieSB0aGUgc2NoZW1hIG5hbWUsIHdpdGggb25lIHJvdyBwZXIKKyAgICAgKiBzY2hlbWEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CiAgICAgICogPG9sPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9TQ0hFTTwvY29kZT4gLSBTdHJpbmcgLSB0aGUgU2NoZW1hIG5hbWU8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9DQVQ8L2NvZGU+QUxPRyAtIFN0cmluZyAtIHRoZSBDYXRhbG9nIG5hbWUgKHBvc3NpYmx5Ci0gICAgICogbnVsbCkgPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX1NDSEVNfSAtIFN0cmluZyAtIHRoZSBzY2hlbWEgbmFtZTwvbGk+IDxsaT57QGNvZGUKKyAgICAgKiBUQUJMRV9DQVRBTE9HfSAtIFN0cmluZyAtIHRoZSBjYXRhbG9nIG5hbWUgKHBvc3NpYmx5IHtAY29kZSBudWxsfSkgPC9saT4KICAgICAgKiA8L29sPgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgd2l0aCBvbmUgcm93IGZvciBlYWNoIHNjaGVtYSBpbiB0aGUgZm9ybWF0IGRlZmluZWQKLSAgICAgKiAgICAgICAgIGFib3ZlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSB3aXRoIG9uZSByb3cgZm9yIGVhY2ggc2NoZW1hIGluIHRoZSBmb3JtYXQKKyAgICAgKiAgICAgICAgIGRlZmluZWQgYWJvdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFNjaGVtYXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZGF0YWJhc2UgdmVuZG9yJ3MgcHJlZmVycmVkIHRlcm0gZm9yICJzY2hlbWEiLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgd2hpY2ggaXMgdGhlIHZlbmRvcidzIHByZWZlcnJlZCB0ZXJtIGZvciBzY2hlbWEKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdoaWNoIGlzIHRoZSB2ZW5kb3IncyBwcmVmZXJyZWQgdGVybSBmb3Igc2NoZW1hLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFUZXJtKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB0aGF0IGlzIHVzZWQgdG8gZXNjYXBlIHdpbGRjYXJkIGNoYXJhY3RlcnMuIFRoaXMKLSAgICAgKiBzdHJpbmcgaXMgdXNlZCB0byBlc2NhcGUgdGhlICdfJyBhbmQgJyUnIHdpbGRjYXJkIGNoYXJhY3RlcnMgaW4gY2F0YWxvZwotICAgICAqIHNlYXJjaCBzdHJpbmdzIHdoaWNoIGFyZSBhIHBhdHRlcm4gYW5kIHNvIHdoaWNoIHVzZSB0aGUgd2lsZGNhcmQKLSAgICAgKiBjaGFyYWN0ZXJzLiAnXycgaXMgdXNlZCB0byByZXByZXNlbnQgYW55IHNpbmdsZSBjaGFyYWN0ZXIgd2lsZSAnJScgaXMKLSAgICAgKiB1c2VkIGZvciBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLgorICAgICAqIHN0cmluZyBpcyB1c2VkIHRvIGVzY2FwZSB0aGUge0Bjb2RlICdfJ30gYW5kIHtAY29kZSAnJSd9IHdpbGRjYXJkCisgICAgICogY2hhcmFjdGVycyBpbiBjYXRhbG9nIHNlYXJjaCBwYXR0ZXJuIHN0cmluZ3MuIHtAY29kZSAnXyd9IGlzIHVzZWQgdG8gcmVwcmVzZW50IGFueSBzaW5nbGUKKyAgICAgKiBjaGFyYWN0ZXIgd2hpbGUge0Bjb2RlICclJ30gaXMgdXNlZCBmb3IgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUKKyAgICAgKiBjaGFyYWN0ZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgdXNlZCB0byBlc2NhcGUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHVzZWQgdG8gZXNjYXBlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXJzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmdFc2NhcGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xNjA3LDE5ICsxNzc2LDIyIEBACiAgICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSBsaXN0IG9mIFNRTCBrZXl3b3JkcyBpbiBhIGNvbW1hIHNlcGFyYXRlZAogICAgICAqICAgICAgICAgZm9ybWF0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTUUxLZXl3b3JkcygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTdGF0ZXMgdGhlIHR5cGUgb2YgU1FMU3RhdGUgdmFsdWUgcmV0dXJuZWQgYnkgU1FMRXhjZXB0aW9uLmdldFNRTFN0YXRlLgotICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgWC9PcGVuIChub3cga25vd24gYXMgT3BlbiBHcm91cCkgU1FMIENMSSBmb3JtIG9yCi0gICAgICogdGhlIFNRTDk5IGZvcm0uCisgICAgICogU3RhdGVzIHRoZSB0eXBlIG9mIHtAY29kZSBTUUxTdGF0ZX0gdmFsdWUgcmV0dXJuZWQgYnkge0Bjb2RlCisgICAgICogU1FMRXhjZXB0aW9uLmdldFNRTFN0YXRlfS4gVGhpcyBjYW4gZWl0aGVyIGJlIHRoZSBYL09wZW4gKG5vdyBrbm93biBhcworICAgICAqIE9wZW4gR3JvdXApIFNRTCBDTEkgZm9ybSBvciB0aGUgU1FMOTkgZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIsIHdoaWNoIGlzIGVpdGhlciBEYXRhYmFzZU1ldGFEYXRhLnNxbFN0YXRlU1FMOTkgb3IKLSAgICAgKiAgICAgICAgIERhdGFiYXNlTWV0YURhdGEuc3FsU3RhdGVYT3Blbi4KKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIsIHdoaWNoIGlzIGVpdGhlciB7QGNvZGUKKyAgICAgKiAgICAgICAgIERhdGFiYXNlTWV0YURhdGEuc3FsU3RhdGVTUUw5OX0gb3Ige0Bjb2RlCisgICAgICogICAgICAgICBEYXRhYmFzZU1ldGFEYXRhLnNxbFN0YXRlWE9wZW59LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRTUUxTdGF0ZVR5cGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xNjMxLDcgKzE4MDMsOCBAQAogICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgbGlzdCBvZiBzdHJpbmcgZnVuY3Rpb25zIGluIGNvbW1hCiAgICAgICogICAgICAgICBzZXBhcmF0ZWQgZm9ybWF0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdGdW5jdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xNjQwLDM5ICsxODEzLDQwIEBACiAgICAgICogdGhlIGRhdGFiYXNlLgogICAgICAqIDxwPgogICAgICAqIFRoZSBsaXN0aW5nIG9ubHkgY29udGFpbnMgZW50cmllcyBmb3IgdGFibGVzIHRoYXQgaGF2ZSBhIHN1cGVyIHRhYmxlLgotICAgICAqIFN1cGVyIGFuZCBzdWIgdGFibGVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBDYXRhbG9nIGFuZCBTY2hlbWEuIFRoZQotICAgICAqIGxpc3QgaXMgcmV0dXJuZWQgYXMgYSBSZXN1bHRTZXQsIHdpdGggb25lIHJvdyBmb3IgZWFjaCB0YWJsZSB0aGF0IGhhcyBhCi0gICAgICogc3VwZXIgdGFibGUsIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgICAqIFN1cGVyIHRhYmxlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0YWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIGNhdGFsb2cgYW5kIHNjaGVtYS4gVGhlCisgICAgICogbGlzdCBpcyByZXR1cm5lZCBhcyBhIHtAY29kZSBSZXN1bHRTZXR9LCB3aXRoIG9uZSByb3cgZm9yIGVhY2ggdGFibGUgdGhhdAorICAgICAqIGhhcyBhIHN1cGVyIHRhYmxlLCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKICAgICAgKiA8b2w+Ci0gICAgICogPGxpPjxjb2RlPlRBQkxFX0NBVDwvY29kZT4gLSBTdHJpbmcgLSB0YWJsZSBjYXRhbG9nIG5hbWUgKHBvc3NpYmx5Ci0gICAgICogbnVsbCk8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9TQ0hFTTwvY29kZT4gLSBTdHJpbmcgLSBUYWJsZSBTY2hlbWEgbmFtZSAocG9zc2libHkKLSAgICAgKiBudWxsKSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBUYWJsZSBuYW1lIDwvbGk+Ci0gICAgICogPGxpPlNVUEVSPGNvZGU+VEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBUaGUgU3VwZXIgVGFibGUgbmFtZQotICAgICAqIDwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9DQVR9IC0gU3RyaW5nIC0gdGFibGUgY2F0YWxvZyBuYW1lIChwb3NzaWJseSB7QGNvZGUKKyAgICAgKiBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfU0NIRU19IC0gU3RyaW5nIC0gVGFibGUgc2NoZW1hIG5hbWUgKHBvc3NpYmx5IHtAY29kZQorICAgICAqIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9OQU1FfSAtIFN0cmluZyAtIFRoZSB0YWJsZSBuYW1lPC9saT4KKyAgICAgKiA8bGk+U1VQRVJ7QGNvZGUgVEFCTEVfTkFNRX0gLSBTdHJpbmcgLSBUaGUgc3VwZXIgdGFibGUgbmFtZTwvbGk+CiAgICAgICogPC9vbD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNhdGFsb2cKLSAgICAgKiAgICAgICAgICAgIGEgQ2F0YWxvZyBOYW1lLiBudWxsIGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mIHRoZQotICAgICAqICAgICAgICAgICAgc2VhcmNoIHVzaW5nIENhdGFsb2cgTmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKLSAgICAgKiAgICAgICAgICAgIENhdGFsb2cgTmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCi0gICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgQ2F0YWxvZyBOYW1lLgorICAgICAqICAgICAgICAgICAgYSBjYXRhbG9nIG5hbWUuIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vIG5hcnJvd2luZyBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCBieSBjYXRhbG9nIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCisgICAgICogICAgICAgICAgICBjYXRhbG9nIG5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgICAgICAgdGhvc2Ugd2l0aG91dCBhIGNhdGFsb2cgbmFtZS4KICAgICAgKiBAcGFyYW0gc2NoZW1hUGF0dGVybgotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZSBQYXR0ZXJuLiBudWxsIGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCi0gICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIHVzaW5nIFNjaGVtYSBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQotICAgICAqICAgICAgICAgICAgU2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUgdGhvc2UKLSAgICAgKiAgICAgICAgICAgIHdpdGhvdXQgYSBTY2hlbWEgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgc2NoZW1hIG5hbWUgcGF0dGVybi4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8KKyAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIGJ5IHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gdGFibGVOYW1lUGF0dGVybgotICAgICAqICAgICAgICAgICAgYSBUYWJsZSBOYW1lLCB3aGljaCBzaG91bGQgbWF0Y2ggdGhlIFRhYmxlIG5hbWUgYXMgc3RvcmVkIGluCisgICAgICogICAgICAgICAgICBhIHRhYmxlIG5hbWUsIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgdGFibGUgbmFtZSBhcyBzdG9yZWQgaW4KICAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhYmFzZS4gaXQgbWF5IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIElmIGl0IGlzIGZ1bGx5Ci0gICAgICogICAgICAgICAgICBxdWFsaWZpZWQgdGhlIENhdGFsb2cgTmFtZSBhbmQgU2NoZW1hIE5hbWUgcGFyYW1ldGVycyBhcmUKKyAgICAgKiAgICAgICAgICAgIHF1YWxpZmllZCB0aGUgY2F0YWxvZyBuYW1lIGFuZCBzY2hlbWEgbmFtZSBwYXJhbWV0ZXJzIGFyZQogICAgICAqICAgICAgICAgICAgaWdub3JlZC4KLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IHdpdGggb25lIHJvdyBmb3IgZWFjaCB0YWJsZSB3aGljaCBoYXMgYSBzdXBlciB0YWJsZSwKLSAgICAgKiAgICAgICAgIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBhYm92ZS4gQW4gZW1wdHkgUmVzdWx0U2V0IGlzIHJldHVybmVkIGlmCi0gICAgICogICAgICAgICB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCB0YWJsZSBoaWVyYXJjaGllcy4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0gd2l0aCBvbmUgcm93IGZvciBlYWNoIHRhYmxlIHdoaWNoIGhhcyBhIHN1cGVyCisgICAgICogICAgICAgICB0YWJsZSwgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGFib3ZlLiBBbiBlbXB0eSB7QGNvZGUgUmVzdWx0U2V0fSBpcworICAgICAqICAgICAgICAgcmV0dXJuZWQgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgdGFibGUgaGllcmFyY2hpZXMuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFN1cGVyVGFibGVzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hUGF0dGVybiwKICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWVQYXR0ZXJuKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtMTY4MiwzOCArMTg1Niw0MCBAQAogICAgICAqIHRoZSBpbW1lZGlhdGUgcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCBpcyBkZXNjcmliZWQuIElmIGEgVURUIGRvZXMgbm90CiAgICAgICogaGF2ZSBhIGRpcmVjdCBzdXBlcnR5cGUsIGl0IGlzIG5vdCBsaXN0ZWQuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGxpc3RpbmcgaXMgcmV0dXJuZWQgYXMgYSBSZXN1bHRTZXQgd2hlcmUgdGhlcmUgaXMgb25lIHJvdyBmb3IgYQotICAgICAqIHNwZWNpZmljIFVEVCB3aGljaCBkZXNjcmliZXMgaXRzIHN1cGVydHlwZSwgd2l0aCB0aGUgZGF0YSBvcmdhbml6ZWQgaW4KKyAgICAgKiBUaGUgbGlzdGluZyBpcyByZXR1cm5lZCBhcyBhIHtAY29kZSBSZXN1bHRTZXR9IHdoZXJlIHRoZXJlIGlzIG9uZSByb3cgZm9yCisgICAgICogYSBzcGVjaWZpYyBVRFQgd2hpY2ggZGVzY3JpYmVzIGl0cyBzdXBlcnR5cGUsIHdpdGggdGhlIGRhdGEgb3JnYW5pemVkIGluCiAgICAgICogY29sdW1ucyBhcyBmb2xsb3dzOgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+PGNvZGU+VFlQRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gdGhlIFVEVCBDYXRhbG9nIG5hbWUgKHBvc3NpYmx5Ci0gICAgICogbnVsbCk8L2xpPgotICAgICAqIDxsaT48Y29kZT5UWVBFX1NDSEVNPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBVRFQgU2NoZW1hIG5hbWUgKHBvc3NpYmx5Ci0gICAgICogbnVsbCkgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VFlQRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBVRFQgdHlwZSBuYW1lIDwvbGk+Ci0gICAgICogPGxpPlNVUEVSPGNvZGU+VFlQRV9DQVQ8L2NvZGU+IC0gU3RyaW5nIC0gZGlyZWN0IHN1cGVydHlwZSdzIENhdGFsb2cKLSAgICAgKiBuYW1lIChwb3NzaWJseSBudWxsKTwvbGk+Ci0gICAgICogPGxpPlNVUEVSPGNvZGU+VFlQRV9TQ0hFTTwvY29kZT4gLSBTdHJpbmcgLSBkaXJlY3Qgc3VwZXJ0eXBlJ3MgU2NoZW1hCi0gICAgICogbmFtZSAocG9zc2libHkgbnVsbCkgPC9saT4KLSAgICAgKiA8bGk+U1VQRVI8Y29kZT5UWVBFX05BTUU8L2NvZGU+IC0gU3RyaW5nIC0gZGlyZWN0IHN1cGVydHlwZSdzIG5hbWUKLSAgICAgKiA8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVFlQRV9DQVR9IC0gU3RyaW5nIC0gdGhlIFVEVCBjYXRhbG9nIG5hbWUgKHBvc3NpYmx5IHtAY29kZQorICAgICAqIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBUWVBFX1NDSEVNfSAtIFN0cmluZyAtIHRoZSBVRFQgc2NoZW1hIG5hbWUgKHBvc3NpYmx5IHtAY29kZQorICAgICAqIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBUWVBFX05BTUV9IC0gU3RyaW5nIC0gdGhlIFVEVCB0eXBlIG5hbWU8L2xpPgorICAgICAqIDxsaT5TVVBFUntAY29kZSBUWVBFX0NBVH0gLSBTdHJpbmcgLSBkaXJlY3Qgc3VwZXJ0eXBlJ3MgY2F0YWxvZyBuYW1lCisgICAgICogKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT5TVVBFUntAY29kZSBUWVBFX1NDSEVNfSAtIFN0cmluZyAtIGRpcmVjdCBzdXBlcnR5cGUncyBzY2hlbWEgbmFtZQorICAgICAqIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+U1VQRVJ7QGNvZGUgVFlQRV9OQU1FfSAtIFN0cmluZyAtIGRpcmVjdCBzdXBlcnR5cGUncyBuYW1lPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgdGhlIENhdGFsb2cgbmFtZS4gIiIgbWVhbnMgZ2V0IHRoZSBVRFRzIHdpdGhvdXQgYSBjYXRhbG9nLgotICAgICAqICAgICAgICAgICAgbnVsbCBtZWFucyBkb24ndCB1c2UgdGhlIGNhdGFsb2cgbmFtZSB0byByZXN0cmljdCB0aGUgc2VhcmNoLgorICAgICAqICAgICAgICAgICAgdGhlIGNhdGFsb2cgbmFtZS4gIiIgbWVhbnMgZ2V0IHRoZSBVRFRzIHdpdGhvdXQgYSBjYXRhbG9nLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIG51bGx9IG1lYW5zIGRvbid0IHVzZSB0aGUgY2F0YWxvZyBuYW1lIHRvIHJlc3RyaWN0IHRoZQorICAgICAqICAgICAgICAgICAgc2VhcmNoLgogICAgICAqIEBwYXJhbSBzY2hlbWFQYXR0ZXJuCiAgICAgICogICAgICAgICAgICB0aGUgU2NoZW1hIHBhdHRlcm4gbmFtZS4gIiIgbWVhbnMgZ2V0IHRoZSBVRFQncyB3aXRob3V0IGEKICAgICAgKiAgICAgICAgICAgIHNjaGVtYS4KICAgICAgKiBAcGFyYW0gdHlwZU5hbWVQYXR0ZXJuCiAgICAgICogICAgICAgICAgICB0aGUgVURUIG5hbWUgcGF0dGVybi4gVGhpcyBtYXkgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4gV2hlbgotICAgICAqICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpcyBzcGVjaWZpZWQsIHRoZSBDYXRhbG9nIG5hbWUgYW5kCi0gICAgICogICAgICAgICAgICBTY2hlbWEgbmFtZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgaW4gd2hpY2ggZWFjaCByb3cgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgYQorICAgICAqICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpcyBzcGVjaWZpZWQsIHRoZSBjYXRhbG9nIG5hbWUgYW5kCisgICAgICogICAgICAgICAgICBzY2hlbWEgbmFtZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSBpbiB3aGljaCBlYWNoIHJvdyBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCBhCiAgICAgICogICAgICAgICBwYXJ0aWN1bGFyIFVEVCBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYWJvdmUuIEFuIGVtcHR5IFJlc3VsdFNldCBpcwogICAgICAqICAgICAgICAgcmV0dXJuZWQgZm9yIGEgZGF0YWJhc2UgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHR5cGUgaGllcmFyY2hpZXMuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFN1cGVyVHlwZXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXJuLAogICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lUGF0dGVybikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKQEAgLTE3MjQsOSArMTkwMCwxMCBAQAogICAgICAqIGZ1bmN0aW9uIG5hbWVzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgbGlzdCBvZiBzeXN0ZW0gZnVuY3Rpb25zIGluIGEgY29tbWEKLSAgICAgKiAgICAgICAgIHNlcGFyYXRlZCBmb3JtYXQKKyAgICAgKiAgICAgICAgIHNlcGFyYXRlZCBmb3JtYXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUZ1bmN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTE3MzUsNDIgKzE5MTIsNDQgQEAKICAgICAgKiBjYXRhbG9nLiBUYWJsZSBwcml2aWxlZ2VzIGNhbiBhcHBseSB0byBvbmUgb3IgbW9yZSBjb2x1bW5zIGluIHRoZSB0YWJsZSAtCiAgICAgICogYnV0IGFyZSBub3QgZ3VhcmFudGVlZCB0byBhcHBseSB0byBhbGwgY29sdW1ucy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJpdmlsZWdlcyBhcmUgcmV0dXJuZWQgYXMgYSBSZXN1bHRTZXQsIHdpdGggb25lIHJvdyBmb3IgZWFjaAotICAgICAqIHByaXZpbGVnZSwgb3JkZXJlZCBieSA8Y29kZT5UQUJMRV9TQ0hFTTwvY29kZT4sCi0gICAgICogPGNvZGU+VEFCTEVfTkFNRTwvY29kZT4sIFBSSVZJTEVHRSwgYW5kIGVhY2ggcm93IGhhcyBkYXRhIGFzIGRlZmluZWQKLSAgICAgKiBpbiB0aGUgZm9sbG93aW5nIGNvbHVtbiBkZWZpbml0aW9uczoKKyAgICAgKiBUaGUgcHJpdmlsZWdlcyBhcmUgcmV0dXJuZWQgYXMgYSB7QGNvZGUgUmVzdWx0U2V0fSwgd2l0aCBvbmUgcm93IGZvciBlYWNoCisgICAgICogcHJpdmlsZWdlLCBvcmRlcmVkIGJ5IHtAY29kZSBUQUJMRV9TQ0hFTX0sIHtAY29kZSBUQUJMRV9OQU1FfSwge0Bjb2RlCisgICAgICogUFJJVklMRUdFfSwgYW5kIGVhY2ggcm93IGhhcyBkYXRhIGFzIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBjb2x1bW4KKyAgICAgKiBkZWZpbml0aW9uczoKICAgICAgKiA8b2w+Ci0gICAgICogPGxpPjxjb2RlPlRBQkxFX0NBVDwvY29kZT4gLSBTdHJpbmcgLSB0YWJsZSBjYXRhbG9nIG5hbWUgKHBvc3NpYmx5Ci0gICAgICogbnVsbCk8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9TQ0hFTTwvY29kZT4gLSBTdHJpbmcgLSBUYWJsZSBTY2hlbWEgbmFtZSAocG9zc2libHkKLSAgICAgKiBudWxsKSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBUYWJsZSBuYW1lIDwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9DQVR9IC0gU3RyaW5nIC0gdGFibGUgY2F0YWxvZyBuYW1lIChwb3NzaWJseSB7QGNvZGUKKyAgICAgKiBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfU0NIRU19IC0gU3RyaW5nIC0gVGFibGUgc2NoZW1hIG5hbWUgKHBvc3NpYmx5IHtAY29kZQorICAgICAqIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9OQU1FfSAtIFN0cmluZyAtIFRoZSB0YWJsZSBuYW1lPC9saT4KICAgICAgKiA8bGk+R1JBTlRPUiAtIFN0cmluZyAtIHdobyBncmFudGVkIHRoZSBhY2Nlc3M8L2xpPgotICAgICAqIDxsaT5HUkFOVEVFIC0gU3RyaW5nIC0gd2hvIHJlY2VpdmVkIHRoZSBhY2Nlc3MgZ3JhbnQgPC9saT4KKyAgICAgKiA8bGk+R1JBTlRFRSAtIFN0cmluZyAtIHdobyByZWNlaXZlZCB0aGUgYWNjZXNzIGdyYW50PC9saT4KICAgICAgKiA8bGk+UFJJVklMRUdFIC0gU3RyaW5nIC0gdGhlIHR5cGUgb2YgYWNjZXNzIGdyYW50ZWQgLSBvbmUgb2YgU0VMRUNULAotICAgICAqIElOU0VSVCwgVVBEQVRFLCBSRUZFUkVOQ0VTLC4uLiA8L2xpPgotICAgICAqIDxsaT5JU19HUkFOVEFCTEUgLSBTdHJpbmcgLSAiWUVTIiBpbXBsaWVzIHRoZSBncmFudGVlIGNhbiBncmFudCBhY2Nlc3MKLSAgICAgKiB0byBvdGhlcnMsICJOTyIgaW1wbGllcyBndWFyYW50ZWUgY2Fubm90IGdyYW50IGFjY2VzcyB0byBvdGhlcnMsIG51bGwKLSAgICAgKiBtZWFucyB0aGlzIHN0YXR1cyBpcyB1bmtub3duPC9saT4KKyAgICAgKiBJTlNFUlQsIFVQREFURSwgUkVGRVJFTkNFUywuLi48L2xpPgorICAgICAqIDxsaT5JU19HUkFOVEFCTEUgLSBTdHJpbmcgLSB7QGNvZGUgIllFUyJ9IGltcGxpZXMgdGhlIGdyYW50ZWUgY2FuIGdyYW50CisgICAgICogYWNjZXNzIHRvIG90aGVycywge0Bjb2RlICJOTyJ9IGltcGxpZXMgZ3VhcmFudGVlIGNhbm5vdCBncmFudCBhY2Nlc3MgdG8KKyAgICAgKiBvdGhlcnMsIHtAY29kZSBudWxsfSBtZWFucyB0aGlzIHN0YXR1cyBpcyB1bmtub3duPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzZWFyY2ggdXNpbmcgQ2F0YWxvZyBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQotICAgICAqICAgICAgICAgICAgQ2F0YWxvZyBOYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKLSAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBDYXRhbG9nIE5hbWUuCisgICAgICogICAgICAgICAgICBhIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IGNhdGFsb2cgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgbmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCisgICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgY2F0YWxvZyBuYW1lLgogICAgICAqIEBwYXJhbSBzY2hlbWFQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFNjaGVtYSBOYW1lIFBhdHRlcm4uIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCi0gICAgICogICAgICAgICAgICBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZSB0aG9zZQotICAgICAqICAgICAgICAgICAgd2l0aG91dCBhIFNjaGVtYSBuYW1lLgorICAgICAqICAgICAgICAgICAgYSBzY2hlbWEgbmFtZSBwYXR0ZXJuLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubworICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggYnkgc2NoZW1hIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUKKyAgICAgKiAgICAgICAgICAgIG11c3QgbWF0Y2ggYSBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0bworICAgICAqICAgICAgICAgICAgcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIHNjaGVtYSBuYW1lLgogICAgICAqIEBwYXJhbSB0YWJsZU5hbWVQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFRhYmxlIE5hbWUsIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgVGFibGUgbmFtZSBhcyBzdG9yZWQgaW4KKyAgICAgKiAgICAgICAgICAgIGEgVGFibGUgTmFtZSwgd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSB0YWJsZSBuYW1lIGFzIHN0b3JlZCBpbgogICAgICAqICAgICAgICAgICAgdGhlIGRhdGFiYXNlLgotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgY29udGFpbmluZyBhIGxpc3Qgd2l0aCBvbmUgcm93IGZvciBlYWNoIHRhYmxlIGluIHRoZQotICAgICAqICAgICAgICAgZm9ybWF0IGRlZmluZWQgYWJvdmUuCisgICAgICogQHJldHVybiBhIHtAY29kZSBSZXN1bHRTZXR9IGNvbnRhaW5pbmcgYSBsaXN0IHdpdGggb25lIHJvdyBmb3IgZWFjaCB0YWJsZQorICAgICAqICAgICAgICAgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGFib3ZlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc3VsdFNldCBnZXRUYWJsZVByaXZpbGVnZXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXJuLAogICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZVBhdHRlcm4pIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC0xNzc4LDUzICsxOTU3LDU0IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgaW4gYSBzcGVjaWZpZWQgY2F0YWxvZy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVzY3JpcHRpb25zIGFyZSByZXR1cm5lZCBhcyByb3dzIGluIGEgUmVzdWx0U2V0LCBvbmUgcm93IGZvciBlYWNoCi0gICAgICogVGFibGUuIFRoZSBSZXN1bHRTZXQgaXMgb3JkZXJlZCBieSA8Y29kZT5UQUJMRV9UWVBFPC9jb2RlPiwKLSAgICAgKiA8Y29kZT5UQUJMRV9TQ0hFTTwvY29kZT4gYW5kIDxjb2RlPlRBQkxFX05BTUU8L2NvZGU+LiBFYWNoIHJvdyBpbgotICAgICAqIHRoZSBSZXN1bHRTZXQgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YgY29sdW1ucyBhcyBmb2xsb3dzOgorICAgICAqIFRoZSBkZXNjcmlwdGlvbnMgYXJlIHJldHVybmVkIGFzIHJvd3MgaW4gYSB7QGNvZGUgUmVzdWx0U2V0fSwgb25lIHJvdyBmb3IKKyAgICAgKiBlYWNoIFRhYmxlLiBUaGUgUmVzdWx0U2V0IGlzIG9yZGVyZWQgYnkge0Bjb2RlIFRBQkxFX1RZUEV9LCB7QGNvZGUKKyAgICAgKiBUQUJMRV9TQ0hFTX0gYW5kIHtAY29kZSBUQUJMRV9OQU1FfS4gRWFjaCByb3cgaW4gdGhlIFJlc3VsdFNldCBjb25zaXN0cworICAgICAqIG9mIGEgc2VyaWVzIG9mIGNvbHVtbnMgYXMgZm9sbG93czoKICAgICAgKiA8b2w+Ci0gICAgICogPGxpPjxjb2RlPlRBQkxFX0NBVDwvY29kZT4gLSBTdHJpbmcgLSB0YWJsZSBjYXRhbG9nIG5hbWUgKHBvc3NpYmx5Ci0gICAgICogbnVsbCk8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9TQ0hFTTwvY29kZT4gLSBTdHJpbmcgLSBUYWJsZSBTY2hlbWEgbmFtZSAocG9zc2libHkKLSAgICAgKiBudWxsKSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBUYWJsZSBuYW1lIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlRBQkxFX1RZUEU8L2NvZGU+IC0gU3RyaW5nIC0gVHlwaWNhbCBuYW1lcyBpbmNsdWRlICJUQUJMRSIsCi0gICAgICogIlZJRVciLCAiU1lTVEVNIFRBQkxFIiwgIkFMSUFTIiwgIlNZTk9OWU0iLCAiR0xPQkFMIFRFTVBPUkFSWSI8L2xpPgotICAgICAqIDxsaT48Y29kZT5SRU1BUktTPC9jb2RlPiAtIFN0cmluZyAtIEEgY29tbWVudCBkZXNjcmliaW5nIHRoZSB0YWJsZQorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfQ0FUfSAtIFN0cmluZyAtIHRhYmxlIGNhdGFsb2cgbmFtZSAocG9zc2libHkge0Bjb2RlCisgICAgICogbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX1NDSEVNfSAtIFN0cmluZyAtIFRhYmxlIHNjaGVtYSBuYW1lIChwb3NzaWJseSB7QGNvZGUKKyAgICAgKiBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfTkFNRX0gLSBTdHJpbmcgLSBUaGUgdGFibGUgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9UWVBFfSAtIFN0cmluZyAtIFR5cGljYWwgbmFtZXMgaW5jbHVkZSAiVEFCTEUiLCAiVklFVyIsCisgICAgICogIlNZU1RFTSBUQUJMRSIsICJBTElBUyIsICJTWU5PTllNIiwgIkdMT0JBTCBURU1QT1JBUlkiPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFJFTUFSS1N9IC0gU3RyaW5nIC0gQSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIHRhYmxlPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRZUEVfQ0FUfSAtIFN0cmluZyAtIHRoZSAnVHlwZXMnIGNhdGFsb2cocG9zc2libHkge0Bjb2RlIG51bGx9CisgICAgICogKTwvbGk+CisgICAgICogPGxpPntAY29kZSBUWVBFX1NDSEVNfSAtIFN0cmluZyAtIHRoZSAnVHlwZXMnIHNjaGVtYShwb3NzaWJseSB7QGNvZGUKKyAgICAgKiBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVFlQRV9OQU1FfSAtIFN0cmluZyAtIHRoZSAnVHlwZXMnIG5hbWUgKHBvc3NpYmx5IHtAY29kZSBudWxsfSkKICAgICAgKiA8L2xpPgotICAgICAqIDxsaT48Y29kZT5UWVBFX0NBVDwvY29kZT4gLSBTdHJpbmcgLSB0aGUgJ1R5cGVzJyBjYXRhbG9nKHBvc3NpYmx5Ci0gICAgICogbnVsbCk8L2xpPgotICAgICAqIDxsaT48Y29kZT5UWVBFX1NDSEVNPC9jb2RlPiAtIFN0cmluZyAtIHRoZSAnVHlwZXMnIHNjaGVtYShwb3NzaWJseQotICAgICAqIG51bGwpIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlRZUEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSB0aGUgJ1R5cGVzJyBuYW1lIChwb3NzaWJseSBudWxsKQotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlNFTEZfUkVGRVJFTkNJTkdfQ09MX05BTUU8L2NvZGU+IC0gU3RyaW5nIC0gdGhlIG5hbWUgb2YgYQotICAgICAqIGRlc2lnbmF0ZWQgaWRlbnRpZmllciBjb2x1bW4gaW4gYSB0eXBlZCB0YWJsZSAocG9zc2libHkgbnVsbCkgPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFNFTEZfUkVGRVJFTkNJTkdfQ09MX05BTUV9IC0gU3RyaW5nIC0gdGhlIG5hbWUgb2YgYSBkZXNpZ25hdGVkCisgICAgICogaWRlbnRpZmllciBjb2x1bW4gaW4gYSB0eXBlZCB0YWJsZSAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CiAgICAgICogPGxpPlJFRl9HRU5FUkFUSU9OIC0gU3RyaW5nIC0gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIDogIlNZU1RFTSIgfAotICAgICAqICJVU0VSIiB8ICJERVJJVkVEIiAtIHNwZWNpZmllcyBob3cgdmFsdWVzIGluIHRoZQotICAgICAqIDxjb2RlPlNFTEZfUkVGRVJFTkNJTkdfQ09MX05BTUU8L2NvZGU+IGFyZSBjcmVhdGVkIChwb3NzaWJseSBudWxsKQotICAgICAqIDwvbGk+CisgICAgICogIlVTRVIiIHwgIkRFUklWRUQiIC0gc3BlY2lmaWVzIGhvdyB2YWx1ZXMgaW4gdGhlIHtAY29kZQorICAgICAqIFNFTEZfUkVGRVJFTkNJTkdfQ09MX05BTUV9IGFyZSBjcmVhdGVkIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzZWFyY2ggdXNpbmcgQ2F0YWxvZyBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQotICAgICAqICAgICAgICAgICAgQ2F0YWxvZyBOYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKLSAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBDYXRhbG9nIE5hbWUuCisgICAgICogICAgICAgICAgICBhIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IGNhdGFsb2cgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgbmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCisgICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgY2F0YWxvZyBuYW1lLgogICAgICAqIEBwYXJhbSBzY2hlbWFQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFNjaGVtYSBOYW1lIFBhdHRlcm4uIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggdXNpbmcgU2NoZW1hIE5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUgbXVzdCBtYXRjaCBhCi0gICAgICogICAgICAgICAgICBTY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0byByZXRyaWV2ZSB0aG9zZQotICAgICAqICAgICAgICAgICAgd2l0aG91dCBhIFNjaGVtYSBuYW1lLgorICAgICAqICAgICAgICAgICAgYSBzY2hlbWEgbmFtZSBwYXR0ZXJuLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubworICAgICAqICAgICAgICAgICAgbmFycm93aW5nIG9mIHRoZSBzZWFyY2ggYnkgc2NoZW1hIG5hbWUuIE90aGVyd2lzZSwgdGhlIG5hbWUKKyAgICAgKiAgICAgICAgICAgIG11c3QgbWF0Y2ggYSBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0bworICAgICAqICAgICAgICAgICAgcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIHNjaGVtYSBuYW1lLgogICAgICAqIEBwYXJhbSB0YWJsZU5hbWVQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFRhYmxlIE5hbWUsIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgVGFibGUgbmFtZSBhcyBzdG9yZWQgaW4KKyAgICAgKiAgICAgICAgICAgIGEgdGFibGUgbmFtZSwgd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSB0YWJsZSBuYW1lIGFzIHN0b3JlZCBpbgogICAgICAqICAgICAgICAgICAgdGhlIGRhdGFiYXNlLgogICAgICAqIEBwYXJhbSB0eXBlcwotICAgICAqICAgICAgICAgICAgYSBsaXN0IG9mIHRhYmxlIHR5cGVzIHRvIGluY2x1ZGUgaW4gdGhlIGxpc3QuIG51bGwgaW1wbGllcwotICAgICAqICAgICAgICAgICAgbGlzdCBhbGwgdHlwZXMuCi0gICAgICogQHJldHVybiBhIFJlc3VsdFNldCB3aXRoIG9uZSByb3cgcGVyIHRhYmxlIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBhYm92ZS4KKyAgICAgKiAgICAgICAgICAgIGEgbGlzdCBvZiB0YWJsZSB0eXBlcyB0byBpbmNsdWRlIGluIHRoZSBsaXN0LiB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgICAgIGltcGxpZXMgbGlzdCBhbGwgdHlwZXMuCisgICAgICogQHJldHVybiBhIHtAY29kZSBSZXN1bHRTZXR9IHdpdGggb25lIHJvdyBwZXIgdGFibGUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkCisgICAgICogICAgICAgICBhYm92ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0VGFibGVzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hUGF0dGVybiwKICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWVQYXR0ZXJuLCBTdHJpbmdbXSB0eXBlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKQEAgLTE4MzIsMTMxICsyMDEyLDE0MSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRhYmxlIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgZGF0YWJhc2UuCiAgICAgICogPHA+Ci0gICAgICogVGhlIGxpc3QgaXMgcmV0dXJuZWQgYXMgYSBSZXN1bHRTZXQgd2l0aCBvbmUgcm93IHBlciB0YWJsZSB0eXBlLCBvcmRlcmVkCi0gICAgICogYnkgdGhlIHRhYmxlIHR5cGUuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUmVzdWx0U2V0IGlzIHN0cnVjdHVyZWQgaW50byBhCi0gICAgICogc2luZ2xlIGNvbHVtbiBwZXIgcm93LCBhcyBmb2xsb3dzOgorICAgICAqIFRoZSBsaXN0IGlzIHJldHVybmVkIGFzIGEge0Bjb2RlIFJlc3VsdFNldH0gd2l0aCBvbmUgcm93IHBlciB0YWJsZSB0eXBlLAorICAgICAqIG9yZGVyZWQgYnkgdGhlIHRhYmxlIHR5cGUuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gaXMKKyAgICAgKiBzdHJ1Y3R1cmVkIGludG8gYSBzaW5nbGUgY29sdW1uIHBlciByb3csIGFzIGZvbGxvd3M6CiAgICAgICogPG9sPgotICAgICAqIDxsaT48Y29kZT5UQUJMRV9UWVBFPC9jb2RlPiAtIFN0cmluZyAtIHRoZSBUYWJsZSBUeXBlLiBUeXBpY2FsIG5hbWVzCi0gICAgICogaW5jbHVkZSAiVEFCTEUiLCAiVklFVyIsICJTWVNURU0gVEFCTEUiLCAiQUxJQVMiLCAiU1lOT05ZTSIsICJHTE9CQUwKLSAgICAgKiBURU1QT1JBUlkiIDwvbGk+CisgICAgICogPGxpPntAY29kZSBUQUJMRV9UWVBFfSAtIFN0cmluZyAtIHRoZSB0YWJsZSB0eXBlLiBUeXBpY2FsIG5hbWVzIGluY2x1ZGUKKyAgICAgKiB7QGNvZGUgIlRBQkxFIn0sIHtAY29kZSAiVklFVyJ9LCAie0Bjb2RlIFNZU1RFTSBUQUJMRSJ9LCB7QGNvZGUgIkFMSUFTIn0sCisgICAgICoge0Bjb2RlICJTWU5PTllNIn0sIHtAY29kZSAiR0xPQkFMIFRFTVBPUkFSWSJ9PC9saT4KICAgICAgKiA8L29sPgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IHdpdGggb25lIHJvdyBwZXIgdGFibGUgdHlwZSBpbiB0aGUgZm9ybWF0IGRlZmluZWQKLSAgICAgKiAgICAgICAgIGFib3ZlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSB3aXRoIG9uZSByb3cgcGVyIHRhYmxlIHR5cGUgaW4gdGhlIGZvcm1hdAorICAgICAqICAgICAgICAgZGVmaW5lZCBhYm92ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0VGFibGVUeXBlcygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aW1lIGFuZCBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSBkYXRhYmFzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGNvbnRhaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGltZSBhbmQgZGF0ZQorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aW1lIGFuZCBkYXRlCiAgICAgICogICAgICAgICBmdW5jdGlvbnMuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWVEYXRlRnVuY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldCBhIGxpc3Qgb2YgdGhlIHN0YW5kYXJkIFNRTCBUeXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkYXRhYmFzZS4gVGhlIGxpc3QKLSAgICAgKiBpcyByZXR1cm5lZCBhcyBhIFJlc3VsdFNldCwgd2l0aCBvbmUgcm93IGZvciBlYWNoIHR5cGUsIG9yZGVyZWQgYnkgdGhlCi0gICAgICogPGNvZGU+REFUQV9UWVBFPC9jb2RlPiB2YWx1ZSwgd2hlcmUgdGhlIGRhdGEgaW4gZWFjaCByb3cgaXMgc3RydWN0dXJlZAorICAgICAqIEdldCBhIGxpc3Qgb2YgdGhlIHN0YW5kYXJkIFNRTCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkYXRhYmFzZS4gVGhlIGxpc3QKKyAgICAgKiBpcyByZXR1cm5lZCBhcyBhIHtAY29kZSBSZXN1bHRTZXR9LCB3aXRoIG9uZSByb3cgZm9yIGVhY2ggdHlwZSwgb3JkZXJlZAorICAgICAqIGJ5IHRoZSB7QGNvZGUgREFUQV9UWVBFfSB2YWx1ZSwgd2hlcmUgdGhlIGRhdGEgaW4gZWFjaCByb3cgaXMgc3RydWN0dXJlZAogICAgICAqIGludG8gdGhlIGZvbGxvd2luZyBjb2x1bW5zOgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+PGNvZGU+VFlQRV9OQU1SPC9jb2RlPiAtIFN0cmluZyA6IHRoZSBUeXBlIG5hbWU8L2xpPgotICAgICAqIDxsaT48Y29kZT5EQVRBX1RZUEU8L2NvZGU+IC0gaW50IDogdGhlIFNRTCBkYXRhIHR5cGUgdmFsdWUgYXMgZGVmaW5lZAotICAgICAqIGluIDxjb2RlPmphdmEuc3FsLlR5cGVzPC9jb2RlPjwvbGk+Ci0gICAgICogPGxpPjxjb2RlPlBSRUNJU0lPTjwvY29kZT4gLSBpbnQgLSB0aGUgbWF4aW11bSBwcmVjaXNpb24gb2YgdGhlIHR5cGU8L2xpPgotICAgICAqIDxsaT48Y29kZT5MSVRFUkFMX1BSRUZJWDwvY29kZT4gLSBTdHJpbmcgOiB0aGUgcHJlZml4IHRvIGJlIHVzZWQgd2hlbgotICAgICAqIHF1b3RpbmcgYSBsaXRlcmFsIHZhbHVlIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT48Y29kZT5MSVRFUkFMX1NVRkZJWDwvY29kZT4gLSBTdHJpbmcgOiB0aGUgc3VmZml4IHRvIGJlIHVzZWQgd2hlbgotICAgICAqIHF1b3RpbmcgYSBsaXRlcmFsIHZhbHVlIChwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT48Y29kZT5DUkVBVEVfUEFSQU1TPC9jb2RlPiAtIFN0cmluZyA6IHBhcmFtcyB1c2VkIHdoZW4gY3JlYXRpbmcKLSAgICAgKiB0aGUgdHlwZSAocG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4pPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+TlVMTEFCTEU8L2NvZGU+IC0gc2hvcnQgOiBzaG93cyBpZiB0aGUgdmFsdWUgaXMgbnVsbC1hYmxlOgorICAgICAqIDxsaT57QGNvZGUgVFlQRV9OQU1FfSAtIFN0cmluZyA6IHRoZSB0eXBlIG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgREFUQV9UWVBFfSAtIGludCA6IHRoZSBTUUwgZGF0YSB0eXBlIHZhbHVlIGFzIGRlZmluZWQgaW4KKyAgICAgKiB7QGNvZGUgamF2YS5zcWwuVHlwZXN9PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBSRUNJU0lPTn0gLSBpbnQgLSB0aGUgbWF4aW11bSBwcmVjaXNpb24gb2YgdGhlIHR5cGU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgTElURVJBTF9QUkVGSVh9IC0gU3RyaW5nIDogdGhlIHByZWZpeCB0byBiZSB1c2VkIHdoZW4gcXVvdGluZworICAgICAqIGEgbGl0ZXJhbCB2YWx1ZSAocG9zc2libHkge0Bjb2RlIG51bGx9KTwvbGk+CisgICAgICogPGxpPntAY29kZSBMSVRFUkFMX1NVRkZJWH0gLSBTdHJpbmcgOiB0aGUgc3VmZml4IHRvIGJlIHVzZWQgd2hlbiBxdW90aW5nCisgICAgICogYSBsaXRlcmFsIHZhbHVlIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIENSRUFURV9QQVJBTVN9IC0gU3RyaW5nIDogcGFyYW1zIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgdHlwZQorICAgICAqIChwb3NzaWJseSB7QGNvZGUgbnVsbH0pPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIE5VTExBQkxFfSAtIHNob3J0IDogc2hvd3MgaWYgdGhlIHZhbHVlIGlzIG51bGxhYmxlOgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS50eXBlTm9OdWxscyA6IDxjb2RlPk5VTEw8L2NvZGU+cyBub3QgcGVybWl0dGVkPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS50eXBlTnVsbGFibGUgOiA8Y29kZT5OVUxMPC9jb2RlPnMgYXJlIHBlcm1pdHRlZAotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEudHlwZU51bGxhYmxlVW5rbm93biA6IDxjb2RlPk5VTEw8L2NvZGU+IHN0YXR1cwotICAgICAqIHVua25vd24gPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEudHlwZU5vTnVsbHN9IDoge0Bjb2RlIE5VTEx9cyBub3QgcGVybWl0dGVkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEudHlwZU51bGxhYmxlfSA6IHtAY29kZSBOVUxMfXMgYXJlIHBlcm1pdHRlZDwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnR5cGVOdWxsYWJsZVVua25vd259IDoge0Bjb2RlIE5VTEx9IHN0YXR1cworICAgICAqIHVua25vd248L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KLSAgICAgKiA8bGk+Q0FTRV9TRU5TSVRJVkUgLSBib29sZWFuIDogdHJ1ZSBpZiB0aGUgdHlwZSBpcyBjYXNlIHNlbnNpdGl2ZTwvbGk+Ci0gICAgICogPGxpPlNFQVJDSEFCTEUgLSBzaG9ydCA6IGhvdyB0aGlzIHR5cGUgY2FuIGJlIHVzZWQgd2l0aCBXSEVSRSBjbGF1c2VzOgorICAgICAqIDxsaT57QGNvZGUgQ0FTRV9TRU5TSVRJVkV9IC0gYm9vbGVhbiA6IHRydWUgaWYgdGhlIHR5cGUgaXMgY2FzZSBzZW5zaXRpdmUKKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT57QGNvZGUgU0VBUkNIQUJMRX0gLSBzaG9ydCA6IGhvdyB0aGlzIHR5cGUgY2FuIGJlIHVzZWQgd2l0aCB7QGNvZGUgV0hFUkV9CisgICAgICogY2xhdXNlczoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEudHlwZVByZWROb25lIC0gY2Fubm90IGJlIHVzZWQgPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS50eXBlUHJlZENoYXIgLSBzdXBwb3J0IGZvciBXSEVSRS4uLkxJS0Ugb25seTwvbGk+Ci0gICAgICogPGxpPkRhdGFiYXNlTWV0YURhdGEudHlwZVByZWRCYXNpYyAtIHN1cHBvcnQgZXhjZXB0IGZvciBXSEVSRS4uLkxJS0U8L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLnR5cGVTZWFyY2hhYmxlIC0gc3VwcG9ydCBmb3IgYWxsIFdIRVJFIGNsYXVzZXM8L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS50eXBlUHJlZE5vbmV9IC0ge0Bjb2RlIFdIRVJFfSBjbGF1c2VzIGNhbm5vdCBiZSB1c2VkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEudHlwZVByZWRDaGFyfSAtIHN1cHBvcnQgZm9yIHtAY29kZQorICAgICAqIFdIRVJFLi4uTElLRX0gb25seTwvbGk+CisgICAgICogPGxpPntAY29kZSBEYXRhYmFzZU1ldGFEYXRhLnR5cGVQcmVkQmFzaWN9IC0gc3VwcG9ydCBleGNlcHQgZm9yIHtAY29kZQorICAgICAqIFdIRVJFLi4uTElLRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS50eXBlU2VhcmNoYWJsZX0gLSBzdXBwb3J0IGZvciBhbGwge0Bjb2RlCisgICAgICogV0hFUkV9IGNsYXVzZXM8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KLSAgICAgKiA8bGk+VU5TSUdORURfQVRUUklCVVRFIC0gYm9vbGVhbiAtIHRoZSB0eXBlIGlzIHVuc2lnbmVkIG9yIG5vdCA8L2xpPgotICAgICAqIDxsaT5GSVhFRF9QUkVDX1NDQUxFIC0gYm9vbGVhbiAtIGZpeGVkIHByZWNpc2lvbiA9IGl0IGNhbiBiZSB1c2VkIGFzIGEKLSAgICAgKiBtb25leSB2YWx1ZSA8L2xpPgotICAgICAqIDxsaT5BVVRPX0lOQ1JFTUVOVCAtIGJvb2xlYW4gLSBjYW4gYmUgdXNlZCBhcyBhbiBhdXRvLWluY3JlbWVudCB2YWx1ZQotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPkxPQ0FMXzxjb2RlPlRZUEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBhIGxvY2FsaXplZCB2ZXJzaW9uIG9mCi0gICAgICogdGhlIHR5cGUgbmFtZSAocG9zc2libHkgbnVsbCk8L2xpPgotICAgICAqIDxsaT5NSU5JTVVNX1NDQUxFIC0gc2hvcnQgLSB0aGUgbWluaW11bSBzY2FsZSBzdXBwb3J0ZWQgPC9saT4KLSAgICAgKiA8bGk+TUFYSU1VTV9TQ0FMRSAtIHNob3J0IC0gdGhlIG1heGltdW0gc2NhbGUgc3VwcG9ydGVkIDwvbGk+Ci0gICAgICogPGxpPlNRTF88Y29kZT5EQVRBX1RZUEU8L2NvZGU+IC0gaW50IC0gbm90IHVzZWQgPC9saT4KLSAgICAgKiA8bGk+U1FMX0RBVEVUSU1FX1NVQiAtIGludCAtIG5vdCB1c2VkIDwvbGk+Ci0gICAgICogPGxpPk5VTV9QUkVDX1JBRElYIC0gaW50IC0gbnVtYmVyIHJhZGl4ICh0eXBpY2FsbHkgMiBvciAxMCkgPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFVOU0lHTkVEX0FUVFJJQlVURX0gLSBib29sZWFuIC0gdGhlIHR5cGUgaXMgdW5zaWduZWQgb3Igbm90PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEZJWEVEX1BSRUNfU0NBTEV9IC0gYm9vbGVhbiAtIGZpeGVkIHByZWNpc2lvbiA9IGl0IGNhbiBiZSB1c2VkCisgICAgICogYXMgYSBtb25leSB2YWx1ZTwvbGk+CisgICAgICogPGxpPntAY29kZSBBVVRPX0lOQ1JFTUVOVH0gLSBib29sZWFuIC0gY2FuIGJlIHVzZWQgYXMgYW4gYXV0by1pbmNyZW1lbnQKKyAgICAgKiB2YWx1ZTwvbGk+CisgICAgICogPGxpPntAY29kZSBMT0NBTF9UWVBFX05BTUV9IC0gU3RyaW5nIC0gYSBsb2NhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgdHlwZQorICAgICAqIG5hbWUgKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgTUlOSU1VTV9TQ0FMRX0gLSBzaG9ydCAtIHRoZSBtaW5pbXVtIHNjYWxlIHN1cHBvcnRlZDwvbGk+CisgICAgICogPGxpPntAY29kZSBNQVhJTVVNX1NDQUxFfSAtIHNob3J0IC0gdGhlIG1heGltdW0gc2NhbGUgc3VwcG9ydGVkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFNRTF9EQVRBX1RZUEV9IC0gaW50IC0gbm90IHVzZWQ8L2xpPgorICAgICAqIDxsaT57QGNvZGUgU1FMX0RBVEVUSU1FX1NVQn0gLSBpbnQgLSBub3QgdXNlZDwvbGk+CisgICAgICogPGxpPntAY29kZSBOVU1fUFJFQ19SQURJWH0gLSBpbnQgLSBudW1iZXIgcmFkaXggKHR5cGljYWxseSAyIG9yIDEwKTwvbGk+CiAgICAgICogPC9vbD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IHdoaWNoIGlzIHN0cnVjdHVyZWQgYXMgZGVzY3JpYmVkIGFib3ZlCisgICAgICogQHJldHVybiBhIHtAY29kZSBSZXN1bHRTZXR9IHdoaWNoIGlzIHN0cnVjdHVyZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc3VsdFNldCBnZXRUeXBlSW5mbygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIFVzZXIgRGVmaW5lZCBUeXBlcyAoVURUcykgZGVmaW5lZCBpbiBhIGdpdmVuCi0gICAgICogc2NoZW1hLCB3aGljaCBpbmNsdWRlcyB0aGUgdHlwZXMgRElTVElOQ1QsIFNUUlVDVCBhbmQgSkFWQV9PQkpFQ1QuCisgICAgICogc2NoZW1hLCB3aGljaCBpbmNsdWRlcyB0aGUgdHlwZXMge0Bjb2RlIERJU1RJTkNUfSwge0Bjb2RlIFNUUlVDVH0gYW5kCisgICAgICoge0Bjb2RlIEpBVkFfT0JKRUNUfS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgdHlwZXMgbWF0Y2hpbmcgdGhlIHN1cHBsaWVkIHRoZSBzcGVjaWZpZWQgQ2F0YWxvZywgU2NoZW1hLCBUeXBlIE5hbWUKLSAgICAgKiBhbmQgVHlwZSBhcmUgcmV0dXJuZWQgYXMgcm93cyBpbiBhIFJlc3VsdFNldCB3aXRoIGNvbHVtbnMgb2YgaW5mb3JtYXRpb24KLSAgICAgKiBhcyBmb2xsb3dzOgorICAgICAqIFRoZSB0eXBlcyBtYXRjaGluZyB0aGUgc3VwcGxpZWQgdGhlIHNwZWNpZmllZCBjYXRhbG9nLCBzY2hlbWEsIHR5cGUgbmFtZQorICAgICAqIGFuZCB0eXBlIGFyZSByZXR1cm5lZCBhcyByb3dzIGluIGEge0Bjb2RlIFJlc3VsdFNldH0gd2l0aCBjb2x1bW5zIG9mCisgICAgICogaW5mb3JtYXRpb24gYXMgZm9sbG93czoKICAgICAgKiA8b2w+Ci0gICAgICogPGxpPjxjb2RlPlRBQkxFX0NBVDwvY29kZT4gLSBTdHJpbmcgLSBDYXRhbG9nIG5hbWUgKHBvc3NpYmx5IG51bGwpPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VEFCTEVfU0NIRU08L2NvZGU+IC0gU3RyaW5nIC0gU2NoZW1hIG5hbWUgKHBvc3NpYmx5IG51bGwpCi0gICAgICogPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VEFCTEVfTkFNRTwvY29kZT4gLSBTdHJpbmcgLSBUaGUgVGFibGUgbmFtZSA8L2xpPgotICAgICAqIDxsaT48Y29kZT5DTEFTU19OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBKYXZhIGNsYXNzIG5hbWU8L2xpPgotICAgICAqIDxsaT48Y29kZT5EQVRBX1RZUEU8L2NvZGU+IC0gaW50IC0gVGhlIFNRTCB0eXBlIGFzIHNwZWNpZmllZCBpbgotICAgICAqIDxjb2RlPmphdmEuc3FsLlR5cGVzPC9jb2RlPi4gT25lIG9mIERJU1RJTkNULCBTVFJVQ1QgYW5kIEpBVkFfT0JKRUNUPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+UkVNQVJLUzwvY29kZT4gLSBTdHJpbmcgLSBBIGNvbW1lbnQgd2hpY2ggZGVzY3JpYmVzIHRoZSB0eXBlCi0gICAgICogPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+QkFTRV9UWVBFPC9jb2RlPiAtIHNob3J0IC0gQSB0eXBlIGNvZGUuIEZvciBhIERJU1RJTkNUIHR5cGUsCi0gICAgICogdGhlIHNvdXJjZSB0eXBlLiBGb3IgYSBzdHJ1Y3R1cmVkIHR5cGUgdGhpcyBpcyB0aGUgdHlwZSB0aGF0IGltcGxlbWVudHMKLSAgICAgKiB0aGUgdXNlciBnZW5lcmF0ZWQgcmVmZXJlbmNlIHR5cGUgb2YgdGhlCi0gICAgICogPGNvZGU+U0VMRl9SRUZFUkVOQ0lOR19DT0xVTU48L2NvZGU+LiBUaGlzIGlzIGRlZmluZWQgaW4KLSAgICAgKiA8Y29kZT5qYXZhLnNxbC5UeXBlczwvY29kZT4sIGFuZCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotICAgICAqIDxjb2RlPkRBVEFfVFlQRTwvY29kZT4gZG9lcyBub3QgbWF0Y2ggdGhlc2UgY3JpdGVyaWEuPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFRBQkxFX0NBVH0gLSBTdHJpbmcgLSBjYXRhbG9nIG5hbWUgKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfU0NIRU19IC0gU3RyaW5nIC0gc2NoZW1hIG5hbWUgKHBvc3NpYmx5IHtAY29kZSBudWxsfSk8L2xpPgorICAgICAqIDxsaT57QGNvZGUgVEFCTEVfTkFNRX0gLSBTdHJpbmcgLSBUaGUgdGFibGUgbmFtZTwvbGk+CisgICAgICogPGxpPntAY29kZSBDTEFTU19OQU1FfSAtIFN0cmluZyAtIFRoZSBKYXZhIGNsYXNzIG5hbWU8L2xpPgorICAgICAqIDxsaT57QGNvZGUgREFUQV9UWVBFfSAtIGludCAtIFRoZSBTUUwgdHlwZSBhcyBzcGVjaWZpZWQgaW4ge0Bjb2RlCisgICAgICogamF2YS5zcWwuVHlwZXN9LiBPbmUgb2YgRElTVElOQ1QsIFNUUlVDVCwgYW5kIEpBVkFfT0JKRUNUPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFJFTUFSS1N9IC0gU3RyaW5nIC0gQSBjb21tZW50IHdoaWNoIGRlc2NyaWJlcyB0aGUgdHlwZTwvbGk+CisgICAgICogPGxpPntAY29kZSBCQVNFX1RZUEV9IC0gc2hvcnQgLSBBIHR5cGUgY29kZS4gRm9yIGEgRElTVElOQ1QgdHlwZSwgdGhlCisgICAgICogc291cmNlIHR5cGUuIEZvciBhIHN0cnVjdHVyZWQgdHlwZSB0aGlzIGlzIHRoZSB0eXBlIHRoYXQgaW1wbGVtZW50cyB0aGUKKyAgICAgKiB1c2VyIGdlbmVyYXRlZCByZWZlcmVuY2UgdHlwZSBvZiB0aGUge0Bjb2RlIFNFTEZfUkVGRVJFTkNJTkdfQ09MVU1OfS4KKyAgICAgKiBUaGlzIGlzIGRlZmluZWQgaW4ge0Bjb2RlIGphdmEuc3FsLlR5cGVzfSwgYW5kIHdpbGwgYmUge0Bjb2RlIG51bGx9IGlmCisgICAgICogdGhlIHtAY29kZSBEQVRBX1RZUEV9IGRvZXMgbm90IG1hdGNoIHRoZXNlIGNyaXRlcmlhLjwvbGk+CiAgICAgICogPC9vbD4KLSAgICAgKiBJZiB0aGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgVURUcywgdGhlIFJlc3VsdFNldCB3aWxsIGJlIGVtcHR5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgVURUcywgdGhlIHtAY29kZSBSZXN1bHRTZXR9IGlzIGVtcHR5LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2F0YWxvZwotICAgICAqICAgICAgICAgICAgYSBDYXRhbG9nIE5hbWUuIG51bGwgaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzZWFyY2ggdXNpbmcgQ2F0YWxvZyBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2ggYQotICAgICAqICAgICAgICAgICAgQ2F0YWxvZyBOYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKLSAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBDYXRhbG9nIE5hbWUuCisgICAgICogICAgICAgICAgICBhIGNhdGFsb2cgbmFtZS4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8gbmFycm93aW5nIG9mCisgICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIGJ5IGNhdGFsb2cgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBtdXN0IG1hdGNoIGEKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgbmFtZSBoZWxkIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvIHJldHJpZXZlCisgICAgICogICAgICAgICAgICB0aG9zZSB3aXRob3V0IGEgY2F0YWxvZyBuYW1lLgogICAgICAqIEBwYXJhbSBzY2hlbWFQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFNjaGVtYSBOYW1lIFBhdHRlcm4uIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgdG8gaW1wbHkgbm8KLSAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIFNjaGVtYSBOYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCi0gICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgU2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBTY2hlbWEgbmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgc2NoZW1hIG5hbWUgcGF0dGVybi4ge0Bjb2RlIG51bGx9IGlzIHVzZWQgdG8gaW1wbHkgbm8KKyAgICAgKiAgICAgICAgICAgIG5hcnJvd2luZyBvZiB0aGUgc2VhcmNoIHVzaW5nIHNjaGVtYSBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICBtdXN0IG1hdGNoIGEgc2NoZW1hIG5hbWUgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIHRob3NlIHdpdGhvdXQgYSBzY2hlbWEgbmFtZS4KICAgICAgKiBAcGFyYW0gdHlwZU5hbWVQYXR0ZXJuCi0gICAgICogICAgICAgICAgICBhIFR5cGUgTmFtZSwgd2hpY2ggc2hvdWxkIG1hdGNoIGEgVHlwZSBuYW1lIGFzIHN0b3JlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGEgdHlwZSBuYW1lIHBhdHRlcm4sIHdoaWNoIHNob3VsZCBtYXRjaCBhIHR5cGUgbmFtZSBhcyBzdG9yZWQgaW4gdGhlCiAgICAgICogICAgICAgICAgICBkYXRhYmFzZS4gSXQgbWF5IGJlIGZ1bGx5IHF1YWxpZmllZC4KICAgICAgKiBAcGFyYW0gdHlwZXMKICAgICAgKiAgICAgICAgICAgIGEgbGlzdCBvZiB0aGUgVURUIHR5cGVzIHRvIGluY2x1ZGUgaW4gdGhlIGxpc3QgLSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgIERJU1RJTkNULCBTVFJVQ1Qgb3IgSkFWQV9PQkpFQ1QuCi0gICAgICogQHJldHVybiBhIFJlc3VsdFNldCBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIERJU1RJTkNUfSwge0Bjb2RlIFNUUlVDVH0gb3Ige0Bjb2RlIEpBVkFfT0JKRUNUfS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldH0gaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgYWJvdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFVEVHMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXJuLAogICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lUGF0dGVybiwgaW50W10gdHlwZXMpIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC0xOTY0LDE5ICsyMTU0LDIwIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgVVJMIGZvciB0aGlzIGRhdGFiYXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFVSTCBmb3IgdGhlIGRhdGFiYXNlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgIGdlbmVyYXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBVUkwgZm9yIHRoZSBkYXRhYmFzZS4ge0Bjb2RlIG51bGx9IGlmIGl0IGNhbm5vdCBiZSBnZW5lcmF0ZWQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmUgdGhlIHVzZXIgbmFtZSBhcyBrbm93biBieSB0aGUgZGF0YWJhc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXNlciBuYW1lCisgICAgICogQHJldHVybiB0aGUgdXNlciBuYW1lLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTE5ODYsNjIgKzIxNzcsNjUgQEAKICAgICAgKiA8cD4KICAgICAgKiBUaGUgcmVzdWx0IGlzIGxhaWQtb3V0IGluIHRoZSBmb2xsb3dpbmcgY29sdW1uczoKICAgICAgKiA8b2w+Ci0gICAgICogPGxpPjxjb2RlPlNDT1BFPC9jb2RlPiAtIHNob3J0IC0gbm90IHVzZWQgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+Q09MVU1OX05BTUU8L2NvZGU+IC0gU3RyaW5nIC0gQ29sdW1uIG5hbWU8L2xpPgotICAgICAqIDxsaT48Y29kZT5EQVRBX1RZUEU8L2NvZGU+IC0gaW50IC0gVGhlIFNRTCBkYXRhIHR5cGUsIGFzIGRlZmluZWQgaW4KLSAgICAgKiA8Y29kZT5qYXZhLnNxbC5UeXBlczwvY29kZT4gPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+VFlQRV9OQU1FPC9jb2RlPiAtIFN0cmluZyAtIFRoZSBTUUwgdHlwZSBuYW1lLCBkYXRhIHNvdXJjZQotICAgICAqIGRlcGVuZGVudCA8L2xpPgotICAgICAqIDxsaT48Y29kZT5DT0xVTU5fU0laRTwvY29kZT4gLSBpbnQgLSBQcmVjaXNpb24gZm9yIG51bWVyaWMgdHlwZXMgPC9saT4KLSAgICAgKiA8bGk+PGNvZGU+QlVGRkVSX0xFTkdUSDwvY29kZT4gLSBpbnQgLSBMZW5ndGggb2YgYSBjb2x1bW4gdmFsdWUgaW4KLSAgICAgKiBieXRlcyA8L2xpPgotICAgICAqIDxsaT48Y29kZT5ERUNJTUFMX0RJR0lUUzwvY29kZT4gLSBzaG9ydCAtIE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlCi0gICAgICogZGVjaW1hbCBwb2ludCA8L2xpPgotICAgICAqIDxsaT48Y29kZT5QU0VVRE9fQ09MVU1OPC9jb2RlPiAtIHNob3J0IC0gSWYgdGhpcyBpcyBhIHBzZXVkby1jb2x1bW4KLSAgICAgKiAoZm9yIGV4YW1wbGUsIGFuIE9yYWNsZSBST1dJRCk6CisgICAgICogPGxpPntAY29kZSBTQ09QRX0gLSBzaG9ydCAtIG5vdCB1c2VkPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIENPTFVNTl9OQU1FfSAtIFN0cmluZyAtIENvbHVtbiBuYW1lPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERBVEFfVFlQRX0gLSBpbnQgLSBUaGUgU1FMIGRhdGEgdHlwZSwgYXMgZGVmaW5lZCBpbiB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UeXBlc308L2xpPgorICAgICAqIDxsaT57QGNvZGUgVFlQRV9OQU1FfSAtIFN0cmluZyAtIFRoZSBTUUwgdHlwZSBuYW1lLCBkYXRhIHNvdXJjZSBkZXBlbmRlbnQKKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT57QGNvZGUgQ09MVU1OX1NJWkV9IC0gaW50IC0gUHJlY2lzaW9uIGZvciBudW1lcmljIHR5cGVzPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIEJVRkZFUl9MRU5HVEh9IC0gaW50IC0gTGVuZ3RoIG9mIGEgY29sdW1uIHZhbHVlIGluIGJ5dGVzPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERFQ0lNQUxfRElHSVRTfSAtIHNob3J0IC0gTnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbAorICAgICAqIHBvaW50PC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIFBTRVVET19DT0xVTU59IC0gc2hvcnQgLSBJZiB0aGlzIGlzIGEgcHNldWRvLWNvbHVtbiAoZm9yCisgICAgICogZXhhbXBsZSwgYW4gT3JhY2xlIHtAY29kZSBST1dJRH0pOgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5iZXN0Um93VW5rbm93biAtIGRvbid0IGtub3cgd2hldGhlciB0aGlzIGlzIGEKLSAgICAgKiBwc2V1ZG8gY29sdW1uPC9saT4KLSAgICAgKiA8bGk+RGF0YWJhc2VNZXRhRGF0YS5iZXN0Um93Tm90UHNldWRvIC0gY29sdW1uIGlzIG5vdCBwc2V1ZG88L2xpPgotICAgICAqIDxsaT5EYXRhYmFzZU1ldGFEYXRhLmJlc3RSb3dQc2V1ZG8gLSBjb2x1bW4gaXMgYSBwc2V1ZG8gY29sdW1uPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuYmVzdFJvd1Vua25vd259IC0gZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMKKyAgICAgKiBhIHBzZXVkbyBjb2x1bW48L2xpPgorICAgICAqIDxsaT57QGNvZGUgRGF0YWJhc2VNZXRhRGF0YS5iZXN0Um93Tm90UHNldWRvfSAtIGNvbHVtbiBpcyBub3QgcHNldWRvPC9saT4KKyAgICAgKiA8bGk+e0Bjb2RlIERhdGFiYXNlTWV0YURhdGEuYmVzdFJvd1BzZXVkb30gLSBjb2x1bW4gaXMgYSBwc2V1ZG8gY29sdW1uPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvbGk+CiAgICAgICogPC9vbD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNhdGFsb2cKLSAgICAgKiAgICAgICAgICAgIGEgQ2F0YWxvZyBOYW1lLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBDYXRhbG9nIE5hbWUuIE90aGVyd2lzZSwgdGhlCi0gICAgICogICAgICAgICAgICBuYW1lIG11c3QgbWF0Y2ggYSBDYXRhbG9nIE5hbWUgaGVsZCBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIKLSAgICAgKiAgICAgICAgICAgIHVzZWQgdG8gcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIENhdGFsb2cgTmFtZS4KKyAgICAgKiAgICAgICAgICAgIGEgY2F0YWxvZyBuYW1lLiB7QGNvZGUgbnVsbH0gaXMgdXNlZCB0byBpbXBseSBubyBuYXJyb3dpbmcgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggdXNpbmcgY2F0YWxvZyBuYW1lLiBPdGhlcndpc2UsIHRoZSBuYW1lIG11c3QgbWF0Y2gKKyAgICAgKiAgICAgICAgICAgIGEgY2F0YWxvZyBuYW1lIGhlbGQgaW4gdGhlIGRhdGFiYXNlLCB3aXRoICIiIHVzZWQgdG8gcmV0cmlldmUKKyAgICAgKiAgICAgICAgICAgIHRob3NlIHdpdGhvdXQgYSBjYXRhbG9nIG5hbWUuCiAgICAgICogQHBhcmFtIHNjaGVtYQotICAgICAqICAgICAgICAgICAgYSBTY2hlbWEgTmFtZSBQYXR0ZXJuLiA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIHRvIGltcGx5IG5vCi0gICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBTY2hlbWEgTmFtZS4gT3RoZXJ3aXNlLCB0aGUgbmFtZQotICAgICAqICAgICAgICAgICAgbXVzdCBtYXRjaCBhIFNjaGVtYSBuYW1lIGluIHRoZSBkYXRhYmFzZSwgd2l0aCAiIiB1c2VkIHRvCi0gICAgICogICAgICAgICAgICByZXRyaWV2ZSB0aG9zZSB3aXRob3V0IGEgU2NoZW1hIG5hbWUuCisgICAgICogICAgICAgICAgICBhIHNjaGVtYSBuYW1lIHBhdHRlcm4uIHtAY29kZSBudWxsfSBpcyB1c2VkIHRvIGltcGx5IG5vCisgICAgICogICAgICAgICAgICBuYXJyb3dpbmcgb2YgdGhlIHNlYXJjaCB1c2luZyBzY2hlbWEgbmFtZXMuIE90aGVyd2lzZSwgdGhlCisgICAgICogICAgICAgICAgICBuYW1lIG11c3QgbWF0Y2ggYSBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIHdpdGggIiIgdXNlZCB0bworICAgICAqICAgICAgICAgICAgcmV0cmlldmUgdGhvc2Ugd2l0aG91dCBhIHNjaGVtYSBuYW1lLgogICAgICAqIEBwYXJhbSB0YWJsZQogICAgICAqICAgICAgICAgICAgYSB0YWJsZSBuYW1lLiBJdCBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIGEgdGFibGUgaW4gdGhlCiAgICAgICogICAgICAgICAgICBkYXRhYmFzZS4KLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0aW9ucywgb25lIHJvdyBmb3IgZWFjaCBjb2x1bW4sCi0gICAgICogICAgICAgICBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYWJvdmUuCisgICAgICogQHJldHVybiBhIHtAY29kZSBSZXN1bHRTZXR9IGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0aW9ucywgb25lIHJvdyBmb3IgZWFjaAorICAgICAqICAgICAgICAgY29sdW1uLCBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYWJvdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFZlcnNpb25Db2x1bW5zKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLAogICAgICAgICAgICAgU3RyaW5nIHRhYmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIGEgdmlzaWJsZSByb3cgaW5zZXJ0IGNhbiBiZSBkZXRlY3RlZCBieSBjYWxsaW5nCi0gICAgICogUmVzdWx0U2V0LnJvd0luc2VydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhIHZpc2libGUgcm93IGluc2VydCBjYW4gYmUgZGV0ZWN0ZWQgYnkgY2FsbGluZyB7QGNvZGUKKyAgICAgKiBSZXN1bHRTZXQucm93SW5zZXJ0ZWR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgUmVzdWx0U2V0IHR5cGUuIFRoaXMgbWF5IGJlIG9uZSBvZgotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX1NFTlNJVElWRTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9JTlNFTlNJVElWRTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWTwvY29kZT4sCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBSZXN1bHRTZXQucm93SW5zZXJ0ZWQgZGV0ZWN0cyBhIHZpc2libGUKLSAgICAgKiAgICAgICAgIHJvdyBpbnNlcnQgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSB0eXBlLiBUaGlzIG1heSBiZSBvbmUgb2Yge0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFfSBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9JTlNFTlNJVElWRX0gb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFl9LAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBSZXN1bHRTZXQucm93SW5zZXJ0ZWR9IGRldGVjdHMgYSB2aXNpYmxlCisgICAgICogICAgICAgICByb3cgaW5zZXJ0IG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNlZSBSZXN1bHRTZXQjcm93SW5zZXJ0ZWQoKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGluc2VydHNBcmVEZXRlY3RlZChpbnQgdHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMjA0OSwxMDMzICsyMjQzLDExMTQgQEAKICAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGZ1bGx5IHF1YWxpZmllZCB0YWJsZSBuYW1lIGlzIHByZWZpeGVkIG9yIHN1ZmZpeGVkIHRvCiAgICAgICogYSBmdWxseSBxdWFsaWZpZWQgdGFibGUgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjYXRhbG9nIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIGEKLSAgICAgKiAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCB0YWJsZSBuYW1lLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjYXRhbG9nIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIGEgZnVsbHkKKyAgICAgKiAgICAgICAgIHF1YWxpZmllZCB0YWJsZSBuYW1lLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ2F0YWxvZ0F0U3RhcnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSBpcyBpbiByZWFkLW9ubHkgbW9kZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGlzIGluIHJlYWQtb25seSBtb2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIGlzIGluIHJlYWQtb25seSBtb2RlLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGF0YWJhc2UgaXMgaW4gcmVhZC1vbmx5IG1vZGUsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHVwZGF0ZXMgYXJlIG1hZGUgdG8gYSBjb3B5IG9mLCBvciBkaXJlY3RseSBvbiwgTGFyZ2UgT2JqZWN0cwotICAgICAqIChMT0JzKS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdXBkYXRlcyBhcmUgbWFkZSB0byBhIGNvcHkgb2YsIG9yIGRpcmVjdGx5IG9uLCBMYXJnZSBPYmplY3RzCisgICAgICogKHtAY29kZSBMT0J9cykuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB1cGRhdGVzIGFyZSBtYWRlIHRvIGEgY29weSBvZiB0aGUgTGFyZ2UKLSAgICAgKiAgICAgICAgIE9iamVjdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHVwZGF0ZXMgYXJlIG1hZGUgdG8gYSBjb3B5IG9mIHRoZSBMYXJnZSBPYmplY3QsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGxvY2F0b3JzVXBkYXRlQ29weSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIGhhbmRsZXMgY29uY2F0ZW5hdGlvbnMgYmV0d2VlbgotICAgICAqIDxjb2RlPk5VTEw8L2NvZGU+IGFuZCBub24tPGNvZGU+TlVMTDwvY29kZT4gdmFsdWVzIGJ5IHByb2R1Y2luZyBhCi0gICAgICogPGNvZGU+TlVMTDwvY29kZT4gb3V0cHV0LgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2UgaGFuZGxlcyBjb25jYXRlbmF0aW9ucyBiZXR3ZWVuIHtAY29kZSBOVUxMfSBhbmQKKyAgICAgKiBub24te0Bjb2RlIE5VTEx9IHZhbHVlcyBieSBwcm9kdWNpbmcgYSB7QGNvZGUgTlVMTH0gb3V0cHV0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+TlVMTDwvY29kZT4gdG8gbm9uLTxjb2RlPk5VTEw8L2NvZGU+Ci0gICAgICogICAgICAgICBjb25jYXRlbmF0aW9ucyBwcm9kdWNlIGEgPGNvZGU+TlVMTDwvY29kZT4gcmVzdWx0LAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgTlVMTH0gdG8gbm9uLXtAY29kZSBOVUxMfSBjb25jYXRlbmF0aW9ucworICAgICAqICAgICAgICAgcHJvZHVjZSBhIHtAY29kZSBOVUxMfSByZXN1bHQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbnVsbFBsdXNOb25OdWxsSXNOdWxsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMgYXJlIGFsd2F5cyBzb3J0ZWQgdG8gdGhlIGVuZCBvZgotICAgICAqIHNvcnRlZCByZXN1bHRzIHJlZ2FyZGxlc3Mgb2YgcmVxdWVzdGVkIHNvcnQgb3JkZXIuIFRoaXMgbWVhbnMgdGhhdCB0aGV5Ci0gICAgICogd2lsbCBhcHBlYXIgYXQgdGhlIGVuZCBvZiBzb3J0ZWQgbGlzdHMgd2hhdGV2ZXIgb3RoZXIgbm9uLTxjb2RlPk5VTEw8L2NvZGU+Ci0gICAgICogdmFsdWVzIG1heSBiZSBwcmVzZW50LgorICAgICAqIERldGVybWluZXMgd2hldGhlciB7QGNvZGUgTlVMTH0gdmFsdWVzIGFyZSBhbHdheXMgc29ydGVkIHRvIHRoZSBlbmQgb2Ygc29ydGVkCisgICAgICogcmVzdWx0cyByZWdhcmRsZXNzIG9mIHJlcXVlc3RlZCBzb3J0IG9yZGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhleSB3aWxsCisgICAgICogYXBwZWFyIGF0IHRoZSBlbmQgb2Ygc29ydGVkIGxpc3RzIHdoYXRldmVyIG90aGVyIG5vbi17QGNvZGUgTlVMTH0gdmFsdWVzCisgICAgICogbWF5IGJlIHByZXNlbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMgYXJlIHNvcnRlZCBhdAotICAgICAqICAgICAgICAgdGhlIGVuZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBOVUxMfSB2YWx1ZXMgYXJlIHNvcnRlZCBhdCB0aGUgZW5kLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBudWxsc0FyZVNvcnRlZEF0RW5kKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMgYXJlIGFsd2F5cyBzb3J0ZWQgYXQgdGhlIHN0YXJ0IG9mCi0gICAgICogdGhlIHNvcnRlZCBsaXN0LCBpcnJlc3BlY3RpdmUgb2YgdGhlIHNvcnQgb3JkZXIuIFRoaXMgbWVhbnMgdGhhdCB0aGV5Ci0gICAgICogYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBzb3J0ZWQgbGlzdHMsIHdoYXRldmVyIG90aGVyIHZhbHVlcyBtYXkgYmUKLSAgICAgKiBwcmVzZW50LgorICAgICAqIERldGVybWluZXMgd2hldGhlciB7QGNvZGUgTlVMTH0gdmFsdWVzIGFyZSBhbHdheXMgc29ydGVkIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICAgKiBzb3J0ZWQgbGlzdCwgaXJyZXNwZWN0aXZlIG9mIHRoZSBzb3J0IG9yZGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhleSBhcHBlYXIKKyAgICAgKiBhdCB0aGUgc3RhcnQgb2Ygc29ydGVkIGxpc3RzLCB3aGF0ZXZlciBvdGhlciB2YWx1ZXMgbWF5IGJlIHByZXNlbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMgYXJlIHNvcnRlZCBhdAotICAgICAqICAgICAgICAgdGhlIHN0YXJ0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIE5VTEx9IHZhbHVlcyBhcmUgc29ydGVkIGF0IHRoZSBzdGFydCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbnVsbHNBcmVTb3J0ZWRBdFN0YXJ0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiA8Y29kZT5OVUxMPC9jb2RlPiB2YWx1ZXMgYXJlIHNvcnRlZCBoaWdoIC0gaS5lLiB0aGV5IGFyZQotICAgICAqIHNvcnRlZCBhcyBpZiB0aGV5IGFyZSBoaWdoZXIgdGhhbiBhbnkgb3RoZXIgdmFsdWVzLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB7QGNvZGUgTlVMTH0gdmFsdWVzIGFyZSBzb3J0ZWQgaGlnaCAtIGkuZS4gdGhleSBhcmUgc29ydGVkCisgICAgICogYXMgaWYgdGhleSBhcmUgaGlnaGVyIHRoYW4gYW55IG90aGVyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPk5VTEw8L2NvZGU+IHZhbHVlcyBhcmUgc29ydGVkCi0gICAgICogICAgICAgICBoaWdoLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBOVUxMfSB2YWx1ZXMgYXJlIHNvcnRlZCBoaWdoLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBudWxsc0FyZVNvcnRlZEhpZ2goKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIDxjb2RlPk5VTEw8L2NvZGU+IHZhbHVlcyBhcmUgc29ydGVkIGxvdyAtIGllIHRoZXkgYXJlCi0gICAgICogc29ydGVkIGFzIGlmIHRoZXkgYXJlIGxvd2VyIHRoYW4gYW55IG90aGVyIHZhbHVlcy4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIge0Bjb2RlIE5VTEx9IHZhbHVlcyBhcmUgc29ydGVkIGxvdyAtIGkuZS4gdGhleSBhcmUgc29ydGVkIGFzCisgICAgICogaWYgdGhleSBhcmUgbG93ZXIgdGhhbiBhbnkgb3RoZXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+TlVMTDwvY29kZT4gdmFsdWVzIGFyZSBzb3J0ZWQgbG93LAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgTlVMTH0gdmFsdWVzIGFyZSBzb3J0ZWQgbG93LCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBudWxsc0FyZVNvcnRlZExvdygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgZGVsZXRlcyBtYWRlIGJ5IG90aGVycyBhcmUgdmlzaWJsZSwgZm9yIGEgc3BlY2lmaWVkCi0gICAgICogUmVzdWx0U2V0IHR5cGUuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGRlbGV0ZXMgbWFkZSBieSBvdGhlcnMgYXJlIHZpc2libGUsIGZvciBhIHNwZWNpZmllZCB7QGNvZGUKKyAgICAgKiBSZXN1bHRTZXR9IHR5cGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBSZXN1bHRTZXQuIEl0IG1heSBiZSBlaXRoZXIKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWTwvY29kZT4gb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9JTlNFTlNJVElWRTwvY29kZT4sIG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFPC9jb2RlPikKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG90aGVycycgZGVsZXRlcyBhcmUgdmlzaWJsZSwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0uIEl0IG1heSBiZSBlaXRoZXIge0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFl9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFfSwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFfSkKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvdGhlcnMnIGRlbGV0ZXMgYXJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG90aGVyc0RlbGV0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIGluc2VydHMgbWFkZSBieSBvdGhlcnMgYXJlIHZpc2libGUsIGZvciBhIHNwZWNpZmllZAotICAgICAqIFJlc3VsdFNldCB0eXBlLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBpbnNlcnRzIG1hZGUgYnkgb3RoZXJzIGFyZSB2aXNpYmxlLCBmb3IgYSBzcGVjaWZpZWQge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fSB0eXBlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgUmVzdWx0U2V0LiBNYXkgYmUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWTwvY29kZT4sIG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkU8L2NvZGU+LCBvcgotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX1NFTlNJVElWRTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG90aGVycycgaW5zZXJ0cyBhcmUgdmlzaWJsZSBvdGhlcndpc2UKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSB7QGNvZGUgUmVzdWx0U2V0fS4gTWF5IGJlIHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZfSwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9LCBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkV9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgb3RoZXJzJyBpbnNlcnRzIGFyZSB2aXNpYmxlLCBvdGhlcndpc2Uge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvdGhlcnNJbnNlcnRzQXJlVmlzaWJsZShpbnQgdHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB1cGRhdGVzIG1hZGUgYnkgb3RoZXJzIGFyZSB2aXNpYmxlLCBmb3IgYSBzcGVjaWZpZWQKLSAgICAgKiBSZXN1bHRTZXQgdHlwZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdXBkYXRlcyBtYWRlIGJ5IG90aGVycyBhcmUgdmlzaWJsZSwgZm9yIGEgc3BlY2lmaWVkIHtAY29kZQorICAgICAqIFJlc3VsdFNldH0gdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIFJlc3VsdFNldC4gTWF5IGJlCi0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFk8L2NvZGU+LCBvcgotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFPC9jb2RlPiwgb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkU8L2NvZGU+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvdGhlcnMnIGluc2VydHMgYXJlIHZpc2libGUgb3RoZXJ3aXNlCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0uIE1heSBiZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWX0sIG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFfSwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFfQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG90aGVycycgaW5zZXJ0cyBhcmUgdmlzaWJsZSwgb3RoZXJ3aXNlIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb3RoZXJzVXBkYXRlc0FyZVZpc2libGUoaW50IHR5cGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgYSBSZXN1bHRTZXQncyBvd24gZGVsZXRlcyBhcmUgdmlzaWJsZSwgZm9yIGEgc3BlY2lmaWVkCi0gICAgICogUmVzdWx0U2V0IHR5cGUuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEge0Bjb2RlIFJlc3VsdFNldH0gY2FuIHNlZSBpdHMgb3duIGRlbGV0ZXMsIGZvciBhCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBSZXN1bHRTZXR9IHR5cGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBSZXN1bHRTZXQ6Ci0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFk8L2NvZGU+LAotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFPC9jb2RlPiwgb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkU8L2NvZGU+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsZXRlJ3MgYXJlIHNlZW4gYnkgdGhlIG93biBSZXN1bHRTZXQKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUge0Bjb2RlIFJlc3VsdFNldH06IHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZfSwge0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9LCBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkV9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRlbGV0ZXMgYXJlIHNlZW4gYnkgdGhlIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0fSBpdHNlbGYsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb3duRGVsZXRlc0FyZVZpc2libGUoaW50IHR5cGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgaXRzIG93biBpbnNlcnRzIGFyZSB2aXNpYmxlIHRvIGEgZ2l2ZW4gUmVzdWx0U2V0IHR5cGUuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEge0Bjb2RlIFJlc3VsdFNldH0gY2FuIHNlZSBpdHMgb3duIGluc2VydHMsIGZvciBhCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBSZXN1bHRTZXR9IHR5cGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBSZXN1bHRTZXQ6Ci0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFk8L2NvZGU+LAotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFPC9jb2RlPiwgb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkU8L2NvZGU+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbnNlcnRzIGFyZSB2aXNpYmxlIGZvciB0aGlzIHR5cGUKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUge0Bjb2RlIFJlc3VsdFNldH06IHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZfSwge0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9LCBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkV9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluc2VydHMgYXJlIHNlZW4gYnkgdGhlIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0fSBpdHNlbGYsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb3duSW5zZXJ0c0FyZVZpc2libGUoaW50IHR5cGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgZm9yIGEgc3VwcGxpZWQgdHlwZSBvZiBSZXN1bHRTZXQsIHRoZSBSZXN1bHRTZXQncyBvd24KLSAgICAgKiB1cGRhdGVzIGFyZSB2aXNpYmxlLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhIHtAY29kZSBSZXN1bHRTZXR9IGNhbiBzZWUgaXRzIG93biB1cGRhdGVzLCBmb3IgYQorICAgICAqIHNwZWNpZmllZCB7QGNvZGUgUmVzdWx0U2V0fSB0eXBlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgUmVzdWx0U2V0OgotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZPC9jb2RlPiwKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9JTlNFTlNJVElWRTwvY29kZT4sIG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFPC9jb2RlPgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdXBkYXRlcyBhcmUgdmlzaWJsZSB0byBpbiB0aGlzIFJlc3VsdFNldAotICAgICAqICAgICAgICAgdHlwZSBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHtAY29kZSBSZXN1bHRTZXR9OiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWX0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFfSwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFfQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB1cGRhdGVzIGFyZSBzZWVuIGJ5IHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgIFJlc3VsdFNldH0gaXRzZWxmLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG93blVwZGF0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHRyZWF0cyBTUUwgaWRlbnRpZmllcnMgdGhhdCBhcmUgaW4gbWl4ZWQKLSAgICAgKiBjYXNlIChhbmQgdW5xdW90ZWQpIGFzIGNhc2UgaW5zZW5zaXRpdmUuIElmIHRydWUgdGhlbiB0aGUgZGF0YWJhc2Ugc3RvcmVzCi0gICAgICogdGhlbSBpbiBsb3dlciBjYXNlLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2UgdHJlYXRzIFNRTCBpZGVudGlmaWVycyB0aGF0IGFyZSBpbiBtaXhlZAorICAgICAqIGNhc2UgKGFuZCB1bnF1b3RlZCkgYXMgY2FzZSBpbnNlbnNpdGl2ZS4gSWYge0Bjb2RlIHRydWV9IHRoZW4gdGhlCisgICAgICogZGF0YWJhc2Ugc3RvcmVzIHRoZW0gaW4gbG93ZXIgY2FzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVucXVvdGVkIFNRTCBpZGVudGlmaWVycyBhcmUgc3RvcmVkIGluCi0gICAgICogICAgICAgICBsb3dlciBjYXNlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHVucXVvdGVkIFNRTCBpZGVudGlmaWVycyBhcmUgc3RvcmVkIGluIGxvd2VyCisgICAgICogICAgICAgICBjYXNlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN0b3Jlc0xvd2VyQ2FzZUlkZW50aWZpZXJzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBkYXRhYmFzZSBjb25zaWRlcnMgbWl4ZWQgY2FzZSBxdW90ZWQgU1FMCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBjb25zaWRlcnMgbWl4ZWQgY2FzZSBxdW90ZWQgU1FMCiAgICAgICogaWRlbnRpZmllcnMgYXMgY2FzZSBpbnNlbnNpdGl2ZSBhbmQgc3RvcmVzIHRoZW0gaW4gbG93ZXIgY2FzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHF1b3RlZCBTUUwgaWRlbnRpZmllcnMgYXJlIHN0b3JlZCBpbiBsb3dlcgotICAgICAqICAgICAgICAgY2FzZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBxdW90ZWQgU1FMIGlkZW50aWZpZXJzIGFyZSBzdG9yZWQgaW4gbG93ZXIgY2FzZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3RvcmVzTG93ZXJDYXNlUXVvdGVkSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGNvbnNpZGVycyBtaXhlZCBjYXNlIHVucXVvdGVkIFNRTAorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2UgY29uc2lkZXJzIG1peGVkIGNhc2UgdW5xdW90ZWQgU1FMCiAgICAgICogaWRlbnRpZmllcnMgYXMgY2FzZSBpbnNlbnNpdGl2ZSBhbmQgc3RvcmVzIHRoZW0gaW4gbWl4ZWQgY2FzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVucXVvdGVkIFNRTCBpZGVudGlmaWVycyBhcyBzdG9yZWQgaW4KLSAgICAgKiAgICAgICAgIG1peGVkIGNhc2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdW5xdW90ZWQgU1FMIGlkZW50aWZpZXJzIGFzIHN0b3JlZCBpbiBtaXhlZCBjYXNlLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdG9yZXNNaXhlZENhc2VJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YWJhc2UgY29uc2lkZXJzIGlkZW50aWZpZXJzIGFzIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGNvbnNpZGVycyBpZGVudGlmaWVycyBhcyBjYXNlIGluc2Vuc2l0aXZlCiAgICAgICogaWYgdGhleSBhcmUgbWl4ZWQgY2FzZSBxdW90ZWQgU1FMLiBUaGUgZGF0YWJhc2Ugc3RvcmVzIHRoZW0gaW4gbWl4ZWQKICAgICAgKiBjYXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcXVvdGVkIFNRTCBpZGVudGlmaWVycyBhcmUgc3RvcmVkIGluIG1peGVkCi0gICAgICogICAgICAgICBjYXNlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHF1b3RlZCBTUUwgaWRlbnRpZmllcnMgYXJlIHN0b3JlZCBpbiBtaXhlZCBjYXNlLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdG9yZXNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YWJhc2UgY29uc2lkZXJzIG1peGVkIGNhc2UgdW5xdW90ZWQgU1FMCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBjb25zaWRlcnMgbWl4ZWQgY2FzZSB1bnF1b3RlZCBTUUwKICAgICAgKiBpZGVudGlmaWVycyBhcyBjYXNlIGluc2Vuc2l0aXZlIGFuZCBzdG9yZXMgdGhlbSBpbiB1cHBlciBjYXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdW5xdW90ZWQgU1FMIGlkZW50aWZpZXJzIGFyZSBzdG9yZWQgaW4KLSAgICAgKiAgICAgICAgIHVwcGVyIGNhc2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdW5xdW90ZWQgU1FMIGlkZW50aWZpZXJzIGFyZSBzdG9yZWQgaW4gdXBwZXIKKyAgICAgKiAgICAgICAgIGNhc2UsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3RvcmVzVXBwZXJDYXNlSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGNvbnNpZGVycyBtaXhlZCBjYXNlIHF1b3RlZCBTUUwKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGNvbnNpZGVycyBtaXhlZCBjYXNlIHF1b3RlZCBTUUwKICAgICAgKiBpZGVudGlmaWVycyBhcyBjYXNlIGluc2Vuc2l0aXZlIGFuZCBzdG9yZXMgdGhlbSBpbiB1cHBlciBjYXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcXVvdGVkIFNRTCBpZGVudGlmaWVycyBhcmUgc3RvcmVkIGluIHVwcGVyCi0gICAgICogICAgICAgICBjYXNlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHF1b3RlZCBTUUwgaWRlbnRpZmllcnMgYXJlIHN0b3JlZCBpbiB1cHBlciBjYXNlLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIEFMVEVSIFRBQkxFIG9wZXJhdGlvbiB3aXRoIGFkZCBjb2x1bW4uCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyB7QGNvZGUgQUxURVIgVEFCTEV9IG9wZXJhdGlvbiB3aXRoCisgICAgICoge0Bjb2RlIEFERCBDT0xVTU59LgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgQUxURVIgVEFCTEUgd2l0aCBhZGQgY29sdW1uIGlzIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIEFMVEVSIFRBQkxFfSB3aXRoIHtAY29kZSBBREQgQ09MVU1OfSBpcworICAgICAqICAgICAgICAgc3VwcG9ydGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhBZGRDb2x1bW4oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBBTFRFUiBUQUJMRSBvcGVyYXRpb24gd2l0aCBkcm9wCi0gICAgICogY29sdW1uLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMge0Bjb2RlIEFMVEVSIFRBQkxFfSBvcGVyYXRpb24gd2l0aAorICAgICAqIHtAY29kZSBEUk9QIENPTFVNTn0uCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBBTFRFUiBUQUJMRSB3aXRoIGRyb3AgY29sdW1uIGlzIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIEFMVEVSIFRBQkxFfSB3aXRoIHtAY29kZSBEUk9QIENPTFVNTn0gaXMKKyAgICAgKiAgICAgICAgIHN1cHBvcnRlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHRoZSBBTlNJOTIgZW50cnkgbGV2ZWwgU1FMIGdyYW1tYXIuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyB0aGUgQU5TSTkyIGVudHJ5IGxldmVsIFNRTCBncmFtbWFyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEFOU0k5MiBlbnRyeSBsZXZlbCBTUUwgZ3JhbW1hciBpcwotICAgICAqICAgICAgICAgc3VwcG9ydGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBBTlNJOTIgZW50cnkgbGV2ZWwgU1FMIGdyYW1tYXIgaXMgc3VwcG9ydGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FOU0k5MkVudHJ5TGV2ZWxTUUwoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyB0aGUgQU5TSTkyIGZ1bGwgU1FMIGdyYW1tYXIuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyB0aGUgQU5TSTkyIGZ1bGwgU1FMIGdyYW1tYXIuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgQU5TSTkyIGZ1bGwgU1FMIGdyYW1tYXIgaXMgc3VwcG9ydGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgQU5TSTkyIGZ1bGwgU1FMIGdyYW1tYXIgaXMgc3VwcG9ydGVkLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FOU0k5MkZ1bGxTUUwoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyB0aGUgQU5TSTkyIGludGVybWVkaWF0ZSBTUUwgR3JhbW1hci4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHRoZSBBTlNJOTIgaW50ZXJtZWRpYXRlIFNRTCBHcmFtbWFyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEFOU0k5MiBpbnRlcm1lZGlhdGUgU1FMIGdyYW1tYXIgaXMKLSAgICAgKiAgICAgICAgIHN1cHBvcnRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgQU5TSTkyIGludGVybWVkaWF0ZSBTUUwgZ3JhbW1hciBpcyBzdXBwb3J0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQU5TSTkySW50ZXJtZWRpYXRlU1FMKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgQmF0Y2ggVXBkYXRlcy4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGJhdGNoIHVwZGF0ZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBiYXRjaCB1cGRhdGVzIGFyZSBzdXBwb3J0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJhdGNoIHVwZGF0ZXMgYXJlIHN1cHBvcnRlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNCYXRjaFVwZGF0ZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgY2F0YWxvZyBuYW1lcyBtYXkgYmUgdXNlZCBpbiBkYXRhIG1hbmlwdWxhdGlvbgorICAgICAqIERldGVybWluZXMgd2hldGhlciBjYXRhbG9nIG5hbWVzIG1heSBiZSB1c2VkIGluIGRhdGEgbWFuaXB1bGF0aW9uCiAgICAgICogc3RhdGVtZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNhdGFsb2cgbmFtZXMgY2FuIGJlIHVzZWQgaW4gZGF0YQotICAgICAqICAgICAgICAgbWFuaXB1bGF0aW9uIHN0YXRlbWVudHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY2F0YWxvZyBuYW1lcyBjYW4gYmUgdXNlZCBpbiBkYXRhIG1hbmlwdWxhdGlvbgorICAgICAqICAgICAgICAgc3RhdGVtZW50cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzSW5EYXRhTWFuaXB1bGF0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiBjYXRhbG9nIG5hbWVzIGNhbiBiZSB1c2VkIGluIEluZGV4IERlZmluaXRpb24gc3RhdGVtZW50cy4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgY2F0YWxvZyBuYW1lcyBjYW4gYmUgdXNlZCBpbiBpbmRleCBkZWZpbml0aW9uIHN0YXRlbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjYXRhbG9nIG5hbWVzIGNhbiBiZSB1c2VkIGluIEluZGV4Ci0gICAgICogICAgICAgICBEZWZpbml0aW9uIHN0YXRlbWVudHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY2F0YWxvZyBuYW1lcyBjYW4gYmUgdXNlZCBpbiBpbmRleCBkZWZpbml0aW9uCisgICAgICogICAgICAgICBzdGF0ZW1lbnRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJbkluZGV4RGVmaW5pdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIGNhdGFsb2cgbmFtZXMgY2FuIGJlIHVzZWQgaW4gcHJpdmlsZWdlIGRlZmluaXRpb24KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgY2F0YWxvZyBuYW1lcyBjYW4gYmUgdXNlZCBpbiBwcml2aWxlZ2UgZGVmaW5pdGlvbgogICAgICAqIHN0YXRlbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjYXRhbG9nIG5hbWVzIGNhbiBiZSB1c2VkIGluIHByaXZpbGVnZQotICAgICAqICAgICAgICAgZGVmaW5pdGlvbiBzdGF0ZW1lbnRzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNhdGFsb2cgbmFtZXMgY2FuIGJlIHVzZWQgaW4gcHJpdmlsZWdlIGRlZmluaXRpb24KKyAgICAgKiAgICAgICAgIHN0YXRlbWVudHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9nc0luUHJpdmlsZWdlRGVmaW5pdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIGNhdGFsb2cgbmFtZXMgY2FuIGJlIHVzZWQgaW4gcHJvY2VkdXJlIGNhbGwgc3RhdGVtZW50cy4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgY2F0YWxvZyBuYW1lcyBjYW4gYmUgdXNlZCBpbiBwcm9jZWR1cmUgY2FsbCBzdGF0ZW1lbnRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2F0YWxvZyBuYW1lcyBjYW4gYmUgdXNlZCBpbiBwcm9jZWR1cmUKLSAgICAgKiAgICAgICAgIGNhbGwgc3RhdGVtZW50cy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBjYXRhbG9nIG5hbWVzIGNhbiBiZSB1c2VkIGluIHByb2NlZHVyZSBjYWxsCisgICAgICogICAgICAgICBzdGF0ZW1lbnRzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9nc0luUHJvY2VkdXJlQ2FsbHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIGNhdGFsb2cgbmFtZXMgbWF5IGJlIHVzZWQgaW4gdGFibGUgZGVmaW5pdGlvbiBzdGF0ZW1lbnRzLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBjYXRhbG9nIG5hbWVzIG1heSBiZSB1c2VkIGluIHRhYmxlIGRlZmluaXRpb24gc3RhdGVtZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNhdGFsb2cgbmFtZXMgY2FuIGJlIHVzZWQgaW4gZGVmaW5pdGlvbgotICAgICAqICAgICAgICAgc3RhdGVtZW50cywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBjYXRhbG9nIG5hbWVzIGNhbiBiZSB1c2VkIGluIGRlZmluaXRpb24KKyAgICAgKiAgICAgICAgIHN0YXRlbWVudHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9nc0luVGFibGVEZWZpbml0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGNvbHVtbiBhbGlhc2luZy4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGNvbHVtbiBhbGlhc2luZy4KICAgICAgKiA8cD4KICAgICAgKiBJZiBhbGlhc2luZyBpcyBzdXBwb3J0ZWQsIHRoZW4gdGhlIFNRTCBBUyBjbGF1c2UgaXMgdXNlZCB0byBwcm92aWRlIG5hbWVzCiAgICAgICogZm9yIGNvbXB1dGVkIGNvbHVtbnMgYW5kIHByb3ZpZGUgYWxpYXMgbmFtZXMgZm9yIGNvbHVtbnMuCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29sdW1uIGFsaWFzaW5nIGlzIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY29sdW1uIGFsaWFzaW5nIGlzIHN1cHBvcnRlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb2x1bW5BbGlhc2luZygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHRoZSBDT05WRVJUIG9wZXJhdGlvbiBiZXR3ZWVuIFNRTAotICAgICAqIHR5cGVzLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgdGhlIHtAY29kZSBDT05WRVJUfSBvcGVyYXRpb24gYmV0d2VlbgorICAgICAqIFNRTCB0eXBlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBDT05WRVJUIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgQ09OVkVSVH0gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb252ZXJ0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgQ09OVkVSVCBvcGVyYXRpb24gZm9yIHR3byBzdXBwbGllZCBTUUwKLSAgICAgKiB0eXBlcy4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHtAY29kZSBDT05WRVJUfSBvcGVyYXRpb24gZm9yIHR3bworICAgICAqIHN1cHBsaWVkIFNRTCB0eXBlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZnJvbVR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBUeXBlIHRvIGNvbnZlcnQgZnJvbSwgYXMgZGVmaW5lZCBieQotICAgICAqICAgICAgICAgICAgPGNvZGU+amF2YS5zcWwuVHlwZXM8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUgVHlwZSB0byBjb252ZXJ0IGZyb20sIGFzIGRlZmluZWQgYnkge0Bjb2RlIGphdmEuc3FsLlR5cGVzfQogICAgICAqIEBwYXJhbSB0b1R5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBUeXBlIHRvIGNvbnZlcnQgdG8sIGFzIGRlZmluZWQgYnkKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmphdmEuc3FsLlR5cGVzPC9jb2RlPgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIENPTlZFUlQgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBmb3IKLSAgICAgKiAgICAgICAgIHRoZXNlIHR5cGVzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgICAgdGhlIFR5cGUgdG8gY29udmVydCB0bywgYXMgZGVmaW5lZCBieSB7QGNvZGUgamF2YS5zcWwuVHlwZXN9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBDT05WRVJUfSBvcGVyYXRpb24gaXMgc3VwcG9ydGVkIGZvcgorICAgICAqICAgICAgICAgdGhlc2UgdHlwZXMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb252ZXJ0KGludCBmcm9tVHlwZSwgaW50IHRvVHlwZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHRoZSBDb3JlIFNRTCBHcmFtbWFyIGZvciBPREJDLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgdGhlIENvcmUgU1FMIEdyYW1tYXIgZm9yIE9EQkMuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgQ29yZSBTUUwgR3JhbW1hciBpcyBzdXBwb3J0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBDb3JlIFNRTCBHcmFtbWFyIGlzIHN1cHBvcnRlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb3JlU1FMR3JhbW1hcigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGNvcnJlbGF0ZWQgc3ViLXF1ZXJpZXMuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBjb3JyZWxhdGVkIHN1Yi1xdWVyaWVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIGRvZXMgc3VwcG9ydCBjb3JyZWxhdGVkCi0gICAgICogICAgICAgICBzdWItcXVlcmllcyBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBzdXBwb3J0IGNvcnJlbGF0ZWQgc3ViLXF1ZXJpZXMKKyAgICAgKiAgICAgICAgIGFuZCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29ycmVsYXRlZFN1YnF1ZXJpZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSBhbGxvd3MgYm90aCBkYXRhIGRlZmluaXRpb24gYW5kIGRhdGEKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGFsbG93cyBib3RoIGRhdGEgZGVmaW5pdGlvbiBhbmQgZGF0YQogICAgICAqIG1hbmlwdWxhdGlvbiBzdGF0ZW1lbnRzIGluc2lkZSBhIHRyYW5zYWN0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYm90aCB0eXBlcyBvZiBzdGF0ZW1lbnQgYXJlIHBlcm1pdHRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYm90aCB0eXBlcyBvZiBzdGF0ZW1lbnQgYXJlIHBlcm1pdHRlZCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEYXRhRGVmaW5pdGlvbkFuZERhdGFNYW5pcHVsYXRpb25UcmFuc2FjdGlvbnMoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgZGF0YWJhc2Ugb25seSBhbGxvd3MgZGF0YSBtYW5pcHVsYXRpb24gc3RhdGVtZW50cyBpbnNpZGUKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIG9ubHkgYWxsb3dzIGRhdGEgbWFuaXB1bGF0aW9uIHN0YXRlbWVudHMgaW5zaWRlCiAgICAgICogYSB0cmFuc2FjdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9ubHkgZGF0YSBtYW5pcHVsYXRpb24gc3RhdGVtZW50cyBhcmUKLSAgICAgKiAgICAgICAgIHBlcm1pdHRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIG1hbmlwdWxhdGlvbiBzdGF0ZW1lbnRzIGFyZSBwZXJtaXR0ZWQgb25seSB3aXRoaW4gYSB0cmFuc2FjdGlvbiwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seSgpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRhYmxlIGNvcnJlbGF0aW9uIG5hbWVzIGFyZSByZXN0cmljdGVkIHRvIGJlIGRpZmZlcmVudCBmcm9tCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRhYmxlIGNvcnJlbGF0aW9uIG5hbWVzIGFyZSByZXF1aXJlZCB0byBiZSBkaWZmZXJlbnQgZnJvbQogICAgICAqIHRoZSBuYW1lcyBvZiB0aGUgdGFibGVzLCB3aGVuIHRoZXkgYXJlIHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvcnJlbGF0aW9uIG5hbWVzIG11c3QgYmUgZGlmZmVyZW50IHRvCi0gICAgICogICAgICAgICB0YWJsZSBuYW1lcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBjb3JyZWxhdGlvbiBuYW1lcyBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRhYmxlCisgICAgICogICAgICAgICBuYW1lcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RpZmZlcmVudFRhYmxlQ29ycmVsYXRpb25OYW1lcygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBleHByZXNzaW9ucyBpbiBPUkRFUiBCWSBsaXN0cyBhcmUgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBleHByZXNzaW9ucyBpbiB7QGNvZGUgT1JERVIgQll9IGxpc3RzIGFyZSBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBleHByZXNzaW9ucyBpbiBPUkRFUiBCWSBsaXN0cyBhcmUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBleHByZXNzaW9ucyBpbiB7QGNvZGUgT1JERVIgQll9IGxpc3RzIGFyZQogICAgICAqICAgICAgICAgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFeHByZXNzaW9uc0luT3JkZXJCeSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgRXh0ZW5kZWQgU1FMIEdyYW1tYXIgZm9yIE9EQkMgaXMgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgRXh0ZW5kZWQgU1FMIEdyYW1tYXIgZm9yIE9EQkMgaXMgc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEV4dGVuZGVkIFNRTCBHcmFtbWFyIGlzIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIEV4dGVuZGVkIFNRTCBHcmFtbWFyIGlzIHN1cHBvcnRlZCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFeHRlbmRlZFNRTEdyYW1tYXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBmdWxsIG5lc3RlZCBvdXRlciBqb2lucy4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGZ1bGwgbmVzdGVkIG91dGVyIGpvaW5zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZnVsbCBuZXN0ZWQgb3V0ZXIgam9pbnMgYXJlIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZnVsbCBuZXN0ZWQgb3V0ZXIgam9pbnMgYXJlIHN1cHBvcnRlZCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNGdWxsT3V0ZXJKb2lucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgYXV0byBnZW5lcmF0ZWQga2V5cyBjYW4gYmUgcmV0dXJuZWQgd2hlbiBhIHN0YXRlbWVudAorICAgICAqIERldGVybWluZXMgd2hldGhlciBhdXRvIGdlbmVyYXRlZCBrZXlzIGNhbiBiZSByZXR1cm5lZCB3aGVuIGEgc3RhdGVtZW50CiAgICAgICogZXhlY3V0ZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdXRvIGdlbmVyYXRlZCBrZXlzIGNhbiBiZSByZXR1cm5lZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYXV0byBnZW5lcmF0ZWQga2V5cyBjYW4gYmUgcmV0dXJuZWQsIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzR2V0R2VuZXJhdGVkS2V5cygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGEgZm9ybSBvZiBHUk9VUCBCWSBjbGF1c2UuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyB7QGNvZGUgR1JPVVAgQll9IGNsYXVzZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGZvcm0gb2YgR1JPVVAgQlkgY2xhdXNlIGlzIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBHUk9VUCBCWX0gY2xhdXNlIGlzIHN1cHBvcnRlZCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNHcm91cEJ5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgdXNpbmcgYSBjb2x1bW4gbmFtZSBpbiBhIEdST1VQIEJZCi0gICAgICogY2xhdXNlIG5vdCBpbmNsdWRlZCBpbiB0aGUgU0VMRUNUIHN0YXRlbWVudCBhcyBsb25nIGFzIGFsbCBvZiB0aGUgY29sdW1ucwotICAgICAqIGluIHRoZSBTRUxFQ1Qgc3RhdGVtZW50IGFyZSB1c2VkIGluIHRoZSBHUk9VUCBCWSBjbGF1c2UuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyB1c2luZyBhIGNvbHVtbiBuYW1lIGluIGEge0Bjb2RlIEdST1VQCisgICAgICogQll9IGNsYXVzZSBub3QgaW5jbHVkZWQgaW4gdGhlIHtAY29kZSBTRUxFQ1R9IHN0YXRlbWVudCBhcyBsb25nIGFzIGFsbCBvZgorICAgICAqIHRoZSBjb2x1bW5zIGluIHRoZSB7QGNvZGUgU0VMRUNUfSBzdGF0ZW1lbnQgYXJlIHVzZWQgaW4gdGhlIHtAY29kZSBHUk9VUAorICAgICAqIEJZfSBjbGF1c2UuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBHUk9VUCBCWSBjbGF1c2VzIGNhbiB1c2UgY29sdW1uIG5hbWVzIGluCi0gICAgICogICAgICAgICB0aGlzIHdheSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgR1JPVVAgQll9IGNsYXVzZXMgY2FuIHVzZSBjb2x1bW4gbmFtZXMgaW4KKyAgICAgKiAgICAgICAgIHRoaXMgd2F5LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzR3JvdXBCeUJleW9uZFNlbGVjdCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHVzaW5nIGEgY29sdW1uIG5hbWUgaW4gYSBHUk9VUCBCWQotICAgICAqIGNsYXVzZSB0aGF0IGlzIG5vdCBpbiB0aGUgU0VMRUNUIHN0YXRlbWVudC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHVzaW5nIGEgY29sdW1uIG5hbWUgaW4gYSB7QGNvZGUgR1JPVVAKKyAgICAgKiBCWX0gY2xhdXNlIHRoYXQgaXMgbm90IGluIHRoZSB7QGNvZGUgU0VMRUNUfSBzdGF0ZW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBHUk9VUCBCWSBjbGF1c2UgY2FuIHVzZSBhIGNvbHVtbiBuYW1lIG5vdAotICAgICAqICAgICAgICAgaW4gdGhlIFNFTEVDVCBzdGF0ZW1lbnQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIEdST1VQIEJZfSBjbGF1c2UgY2FuIHVzZSBhIGNvbHVtbiBuYW1lIG5vdAorICAgICAqICAgICAgICAgaW4gdGhlIHtAY29kZSBTRUxFQ1R9IHN0YXRlbWVudCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0dyb3VwQnlVbnJlbGF0ZWQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIFNRTCBJbnRlZ3JpdHkgRW5oYW5jZW1lbnQKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIFNRTCBJbnRlZ3JpdHkgRW5oYW5jZW1lbnQKICAgICAgKiBGYWNpbGl0eS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBJbnRlZ3JpdHkgRW5oYW5jZW1lbnQgRmFjaWxpdHkgaXMKLSAgICAgKiAgICAgICAgIHN1cHBvcnRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgSW50ZWdyaXR5IEVuaGFuY2VtZW50IEZhY2lsaXR5IGlzIHN1cHBvcnRlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNJbnRlZ3JpdHlFbmhhbmNlbWVudEZhY2lsaXR5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgdXNpbmcgYSBMSUtFIGVzY2FwZSBjbGF1c2UuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBhIHtAY29kZSBMSUtFfSBlc2NhcGUgY2xhdXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgTElLRSBlc2NhcGUgY2xhdXNlIGlzIHN1cHBvcnRlZCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBMSUtFIGVzY2FwZSBjbGF1c2UgaXMgc3VwcG9ydGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xpa2VFc2NhcGVDbGF1c2UoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnQgZm9yIG91dGVyIEpvaW4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHByb3ZpZGVzIGxpbWl0ZWQgc3VwcG9ydCBmb3Igb3V0ZXIgam9pbgogICAgICAqIG9wZXJhdGlvbnMuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQgZm9yIG91dGVyIEpvaW4KLSAgICAgKiAgICAgICAgIG9wZXJhdGlvbnMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIFRoaXMgd2lsbCBiZQotICAgICAqICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+c3VwcG9ydHNGdWxsT3V0ZXJKb2luczwvY29kZT4KLSAgICAgKiAgICAgICAgIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgaXMgbGltaXRlZCBzdXBwb3J0IGZvciBvdXRlciBqb2luCisgICAgICogICAgICAgICBvcGVyYXRpb25zLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4gVGhpcyB3aWxsIGJlIHtAY29kZSB0cnVlfSBpZgorICAgICAqICAgICAgICAge0Bjb2RlIHN1cHBvcnRzRnVsbE91dGVySm9pbnN9IHJldHVybnMge0Bjb2RlIHRydWV9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMaW1pdGVkT3V0ZXJKb2lucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIE1pbmltdW0gU1FMIEdyYW1tYXIgZm9yIE9EQkMuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBNaW5pbXVtIFNRTCBHcmFtbWFyIGZvciBPREJDLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIE1pbmltdW0gU1FMIEdyYW1tYXIgaXMgc3VwcG9ydGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgTWluaW11bSBTUUwgR3JhbW1hciBpcyBzdXBwb3J0ZWQsIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWluaW11bVNRTEdyYW1tYXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhYmFzZSB0cmVhdHMgbWl4ZWQgY2FzZSB1bnF1b3RlZCBTUUwgaWRlbnRpZmllcnMgYXMKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIHRyZWF0cyBtaXhlZCBjYXNlIHVucXVvdGVkIFNRTCBpZGVudGlmaWVycyBhcwogICAgICAqIGNhc2Ugc2Vuc2l0aXZlIHN0b3JpbmcgdGhlbSBpbiBtaXhlZCBjYXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdW5xdW90ZWQgU1FMIGlkZW50aWZpZXJzIGFyZSBzdG9yZWQgaW4KLSAgICAgKiAgICAgICAgIG1peGVkIGNhc2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdW5xdW90ZWQgU1FMIGlkZW50aWZpZXJzIGFyZSBzdG9yZWQgaW4gbWl4ZWQKKyAgICAgKiAgICAgICAgIGNhc2UsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNaXhlZENhc2VJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YWJhc2UgY29uc2lkZXJzIG1peGVkIGNhc2UgcXVvdGVkIFNRTAorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2UgY29uc2lkZXJzIG1peGVkIGNhc2UgcXVvdGVkIFNRTAogICAgICAqIGlkZW50aWZpZXJzIGFzIGNhc2Ugc2Vuc2l0aXZlLCBzdG9yaW5nIHRoZW0gaW4gbWl4ZWQgY2FzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHF1b3RlZCBTUUwgaWRlbnRpZmllcnMgYXJlIHN0b3JlZCBpbiBtaXhlZAotICAgICAqICAgICAgICAgY2FzZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBxdW90ZWQgU1FMIGlkZW50aWZpZXJzIGFyZSBzdG9yZWQgaW4gbWl4ZWQgY2FzZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgaXQgaXMgcG9zc2libGUgZm9yIGEgc2luZ2xlIENhbGxhYmxlU3RhdGVtZW50IHRvIHJldHVybgotICAgICAqIG11bHRpcGxlIFJlc3VsdFNldHMgc2ltdWx0YW5lb3VzbHkuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIGZvciBhIHNpbmdsZSB7QGNvZGUgQ2FsbGFibGVTdGF0ZW1lbnR9IHRvCisgICAgICogcmV0dXJuIG11bHRpcGxlIHtAY29kZSBSZXN1bHRTZXR9cyBzaW11bHRhbmVvdXNseS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgc2luZ2xlIENhbGxhYmxlU3RhdGVtZW50IGNhbiByZXR1cm4KLSAgICAgKiAgICAgICAgIG11bHRpcGxlIFJlc3VsdFNldHMgc2ltdWx0YW5lb3VzbHksIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgc2luZ2xlIHtAY29kZSBDYWxsYWJsZVN0YXRlbWVudH0gY2FuIHJldHVybgorICAgICAqICAgICAgICAgbXVsdGlwbGUge0Bjb2RlIFJlc3VsdFNldH1zIHNpbXVsdGFuZW91c2x5LCB7QGNvZGUgZmFsc2V9CiAgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpcGxlT3BlblJlc3VsdHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgcmV0cmlldmluZyBtdWx0aXBsZSBSZXN1bHRTZXRzIGZyb20gYSBzaW5nbGUgY2FsbCB0bwotICAgICAqIHRoZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBtZXRob2QgaXMgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciByZXRyaWV2aW5nIG11bHRpcGxlIHtAY29kZSBSZXN1bHRTZXR9cyBmcm9tIGEgc2luZ2xlCisgICAgICogY2FsbCB0byB0aGUge0Bjb2RlIGV4ZWN1dGV9IG1ldGhvZCBpcyBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBtdWx0aXBsZSBSZXN1bHRTZXRzIGNhbiBiZSByZXRyaWV2ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG11bHRpcGxlIHtAY29kZSBSZXN1bHRTZXR9cyBjYW4gYmUgcmV0cmlldmVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpcGxlUmVzdWx0U2V0cygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgaW4gcHJvZ3Jlc3MgYXQgYXQgdGltZSBvbgorICAgICAqIERldGVybWluZXMgd2hldGhlciBtdWx0aXBsZSBzaW11bHRhbmVvdXMgdHJhbnNhY3Rpb25zIG9uCiAgICAgICogZGlmZmVyZW50IGNvbm5lY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBtdWx0aXBsZSBvcGVuIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBtdWx0aXBsZSBvcGVuIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpcGxlVHJhbnNhY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGNhbGwtYWJsZSBzdGF0ZW1lbnRzIHdpdGggbmFtZWQgcGFyYW1ldGVycyBpcwotICAgICAqIHN1cHBvcnRlZC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgY2FsbGFibGUgc3RhdGVtZW50cyB3aXRoIG5hbWVkIHBhcmFtZXRlcnMgaXMgc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbmFtZWQgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB3aXRoCi0gICAgICogICAgICAgICBjYWxsLWFibGUgc3RhdGVtZW50cywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBuYW1lZCBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHdpdGggY2FsbGFibGUKKyAgICAgKiAgICAgICAgIHN0YXRlbWVudHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOYW1lZFBhcmFtZXRlcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIGNvbHVtbnMgaW4gdGhlIGRhdGFiYXNlIGNhbiBiZSBkZWZpbmVkIGFzIG5vbi1udWxsYWJsZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgY29sdW1ucyBpbiB0aGUgZGF0YWJhc2UgY2FuIGJlIGRlZmluZWQgYXMgbm9uLW51bGxhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgQ29sdW1ucyBjYW4gYmUgZGVmaW5lZCBub24tbnVsbGFibGUsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNvbHVtbnMgY2FuIGJlIGRlZmluZWQgbm9uLW51bGxhYmxlLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c05vbk51bGxhYmxlQ29sdW1ucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBrZWVwaW5nIEN1cnNvcnMgb3BlbiBhY3Jvc3MgQ29tbWl0IG9wZXJhdGlvbnMgaXMKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIga2VlcGluZyBjdXJzb3JzIG9wZW4gYWNyb3NzIGNvbW1pdCBvcGVyYXRpb25zIGlzCiAgICAgICogc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgQ3Vyc29ycyBjYW4gYmUga2VwdCBvcGVuIGFjcm9zcyBDb21taXQKLSAgICAgKiAgICAgICAgIG9wZXJhdGlvbnMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IG1pZ2h0IGdldCBjbG9zZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY3Vyc29ycyBjYW4gYmUga2VwdCBvcGVuIGFjcm9zcyBjb21taXQKKyAgICAgKiAgICAgICAgIG9wZXJhdGlvbnMsIHtAY29kZSBmYWxzZX0gaWYgdGhleSBtaWdodCBnZXQgY2xvc2VkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPcGVuQ3Vyc29yc0Fjcm9zc0NvbW1pdCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGFiYXNlIGNhbiBrZWVwIEN1cnNvcnMgb3BlbiBhY3Jvc3MgUm9sbGJhY2sKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGNhbiBrZWVwIGN1cnNvcnMgb3BlbiBhY3Jvc3Mgcm9sbGJhY2sKICAgICAgKiBvcGVyYXRpb25zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgQ3Vyc29ycyBjYW4gYmUga2VwdCBvcGVuIGFjcm9zcyBSb2xsYmFjawotICAgICAqICAgICAgICAgb3BlcmF0aW9ucywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgbWlnaHQgZ2V0IGNsb3NlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBjdXJzb3JzIGNhbiBiZSBrZXB0IG9wZW4gYWNyb3NzIHJvbGxiYWNrCisgICAgICogICAgICAgICBvcGVyYXRpb25zLCB7QGNvZGUgZmFsc2V9IGlmIHRoZXkgbWlnaHQgZ2V0IGNsb3NlZC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NSb2xsYmFjaygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBrZWVwaW5nIFN0YXRlbWVudHMgb3BlbiBhY3Jvc3MgQ29tbWl0IG9wZXJhdGlvbnMgaXMKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIga2VlcGluZyBzdGF0ZW1lbnRzIG9wZW4gYWNyb3NzIGNvbW1pdCBvcGVyYXRpb25zIGlzCiAgICAgICogc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgU3RhdGVtZW50cyBjYW4gYmUga2VwdCBvcGVuLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgbWlnaHQgbm90LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHN0YXRlbWVudHMgY2FuIGJlIGtlcHQgb3Blbiwge0Bjb2RlIGZhbHNlfSBpZgorICAgICAqICAgICAgICAgdGhleSBtaWdodCBub3QuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c09wZW5TdGF0ZW1lbnRzQWNyb3NzQ29tbWl0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGtlZXBpbmcgU3RhdGVtZW50cyBvcGVuIGFjcm9zcyBSb2xsYmFjayBvcGVyYXRpb25zIGlzCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGtlZXBpbmcgc3RhdGVtZW50cyBvcGVuIGFjcm9zcyByb2xsYmFjayBvcGVyYXRpb25zIGlzCiAgICAgICogc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgU3RhdGVtZW50cyBjYW4gYmUga2VwdCBvcGVuLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgbWlnaHQgbm90LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHN0YXRlbWVudHMgY2FuIGJlIGtlcHQgb3Blbiwge0Bjb2RlIGZhbHNlfSBpZgorICAgICAqICAgICAgICAgdGhleSBtaWdodCBub3QuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c09wZW5TdGF0ZW1lbnRzQWNyb3NzUm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdXNpbmcgYSBjb2x1bW4gaW4gYW4gT1JERVIgQlkgY2xhdXNlIHRoYXQgaXMgbm90IGluIHRoZQotICAgICAqIFNFTEVDVCBzdGF0ZW1lbnQgaXMgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB1c2luZyBhIGNvbHVtbiBpbiBhbiB7QGNvZGUgT1JERVIgQll9IGNsYXVzZSB0aGF0IGlzCisgICAgICogbm90IGluIHRoZSB7QGNvZGUgU0VMRUNUfSBzdGF0ZW1lbnQgaXMgc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgcG9zc2libGUgdG8gT1JERVIgdXNpbmcgYSBjb2x1bW4gbm90Ci0gICAgICogICAgICAgICBpbiB0aGUgU0VMRUNULCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGl0IGlzIHBvc3NpYmxlIHRvIHtAY29kZSBPUkRFUn0gdXNpbmcgYSBjb2x1bW4KKyAgICAgKiAgICAgICAgIG5vdCBpbiB0aGUge0Bjb2RlIFNFTEVDVH0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPcmRlckJ5VW5yZWxhdGVkKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIG91dGVyIGpvaW4gb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvdXRlciBqb2luIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG91dGVyIGpvaW4gb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvdXRlciBqb2luIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPdXRlckpvaW5zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHBvc2l0aW9uZWQgREVMRVRFIHN0YXRlbWVudHMgYXJlIHN1cHBvcnRlZC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgcG9zaXRpb25lZCB7QGNvZGUgREVMRVRFfSBzdGF0ZW1lbnRzIGFyZSBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgcG9zaXRpb25lZCBERUxFVEUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgcG9zaXRpb25lZCB7QGNvZGUgREVMRVRFfQogICAgICAqICAgICAgICAgc3RhdGVtZW50cy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUG9zaXRpb25lZERlbGV0ZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBwb3NpdGlvbmVkIFVQREFURSBzdGF0ZW1lbnRzIGFyZSBzdXBwb3J0ZWQuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHBvc2l0aW9uZWQge0Bjb2RlIFVQREFURX0gc3RhdGVtZW50cyBhcmUgc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHBvc2l0aW9uZWQgVVBEQVRFCi0gICAgICogICAgICAgICBzdGF0ZW1lbnRzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBwb3NpdGlvbmVkIHtAY29kZSBVUERBVEV9CisgICAgICogICAgICAgICBzdGF0ZW1lbnRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUG9zaXRpb25lZFVwZGF0ZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBzdXBwb3J0IGZvciBhIGdpdmVuIGNvbmN1cnJlbmN5IHN0eWxlIGZvciB0aGUKLSAgICAgKiBnaXZlbiBSZXN1bHRTZXQuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIHN1cHBvcnQgZm9yIGEgZ2l2ZW4gY29uY3VycmVuY3kgc3R5bGUgZm9yIHRoZQorICAgICAqIGdpdmVuIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgUmVzdWx0U2V0IHR5cGUsIGFzIGRlZmluZWQgaW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmphdmEuc3FsLlJlc3VsdFNldDwvY29kZT46Ci0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFk8L2NvZGU+LAotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFPC9jb2RlPiwgb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkU8L2NvZGU+CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFJlc3VsdFNldH0gdHlwZSwgYXMgZGVmaW5lZCBpbiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlJlc3VsdFNldH06CisgICAgICogICAgICAgICAgICA8dWw+CisgICAgICogICAgICAgICAgICA8bGk+e0Bjb2RlIFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWX08L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPntAY29kZSBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGNvZGUgUmVzdWx0U2V0LlRZUEVfU0NST0xMX1NFTlNJVElWRX08L2xpPgorICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiBAcGFyYW0gY29uY3VycmVuY3kKLSAgICAgKiAgICAgICAgICAgIGEgY29uY3VycmVuY3kgdHlwZSwgd2hpY2ggbWF5IGJlIG9uZSBvZgotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFk8L2NvZGU+IG9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuQ09OQ1VSX1VQREFUQUJMRTwvY29kZT4uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGF0IGNvbmN1cnJlbmN5IGFuZCBSZXN1bHRTZXQgdHlwZQotICAgICAqICAgICAgICAgcGFpcmluZyBpcyBzdXBwb3J0ZWQgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIGEgY29uY3VycmVuY3kgdHlwZSwgd2hpY2ggbWF5IGJlIG9uZSBvZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5DT05DVVJfUkVBRF9PTkxZfSBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5DT05DVVJfVVBEQVRBQkxFfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGF0IGNvbmN1cnJlbmN5IGFuZCB7QGNvZGUgUmVzdWx0U2V0fSB0eXBlCisgICAgICogICAgICAgICBwYWlyaW5nIGlzIHN1cHBvcnRlZCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVzdWx0U2V0Q29uY3VycmVuY3koaW50IHR5cGUsIGludCBjb25jdXJyZW5jeSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3VwcGxpZWQgUmVzdWx0U2V0IGhvbGRhYmlsaXR5IGlzIHN1cHBvcnRlZC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIHtAY29kZSBSZXN1bHRTZXR9IGhvbGRhYmlsaXR5IG1vZGUgaXMKKyAgICAgKiBzdXBwb3J0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGhvbGRhYmlsaXR5Ci0gICAgICogICAgICAgICAgICBhcyBzcGVjaWZpZWQgaW4gamF2YS5zcWwuUmVzdWx0U2V0OgotICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LkhPTERfQ1VSU09SU19PVkVSX0NPTU1JVCBvcgotICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LkNMT1NFX0NVUlNPUlNfQVRfQ09NTUlUCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gUmVzdWx0U2V0IGhvbGRhYmlsaXR5IGlzCi0gICAgICogICAgICAgICBzdXBwb3J0ZWQgYW5kIGlmIGl0IGlzbid0IHRoZW4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgYXMgc3BlY2lmaWVkIGluIHtAY29kZSBqYXZhLnNxbC5SZXN1bHRTZXR9OiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5IT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVR9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LkNMT1NFX0NVUlNPUlNfQVRfQ09NTUlUfQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBSZXN1bHRTZXQgaG9sZGFiaWxpdHkgaXMgc3VwcG9ydGVkIGFuZAorICAgICAqICAgICAgICAgaWYgaXQgaXNuJ3QgdGhlbiB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZXN1bHRTZXRIb2xkYWJpbGl0eShpbnQgaG9sZGFiaWxpdHkpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN1cHBsaWVkIFJlc3VsdFNldCB0eXBlIGlzIHN1cHBvcnRlZC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIHtAY29kZSBSZXN1bHRTZXR9IHR5cGUgaXMgc3VwcG9ydGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgUmVzdWx0U2V0IHR5cGUgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5SZXN1bHRTZXQ6Ci0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFk8L2NvZGU+LAotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFPC9jb2RlPiwgb3IKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkU8L2NvZGU+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgUmVzdWx0U2V0IHR5cGUgaXMgc3VwcG9ydGVkLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSB0eXBlIGFzIGRlZmluZWQgaW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLnNxbC5SZXN1bHRTZXR9OiB7QGNvZGUgUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZfSwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9LCBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkV9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBSZXN1bHRTZXR9IHR5cGUgaXMgc3VwcG9ydGVkLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Jlc3VsdFNldFR5cGUoaW50IHR5cGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBTYXZlcG9pbnRzIGZvciB0cmFuc2FjdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgc2F2ZXBvaW50cyBmb3IgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBTYXZlcG9pbnRzIGFyZSBzdXBwb3J0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHNhdmVwb2ludHMgYXJlIHN1cHBvcnRlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTYXZlcG9pbnRzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgc2NoZW1hIG5hbWUgbWF5IGJlIHVzZWQgaW4gYSBkYXRhIG1hbmlwdWxhdGlvbgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhIHNjaGVtYSBuYW1lIG1heSBiZSB1c2VkIGluIGEgZGF0YSBtYW5pcHVsYXRpb24KICAgICAgKiBzdGF0ZW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHNjaGVtYSBuYW1lIGNhbiBiZSB1c2VkIGluIGEgZGF0YQotICAgICAqICAgICAgICAgbWFuaXB1bGF0aW9uIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSBzY2hlbWEgbmFtZSBjYW4gYmUgdXNlZCBpbiBhIGRhdGEgbWFuaXB1bGF0aW9uLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYXNJbkRhdGFNYW5pcHVsYXRpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzY2hlbWEgbmFtZSBtYXkgYmUgdXNlZCBpbiBhbiBpbmRleCBkZWZpbml0aW9uCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc2NoZW1hIG5hbWUgbWF5IGJlIHVzZWQgaW4gYW4gaW5kZXggZGVmaW5pdGlvbgogICAgICAqIHN0YXRlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgc2NoZW1hIG5hbWUgY2FuIGJlIHVzZWQgaW4gYW4gaW5kZXgKLSAgICAgKiAgICAgICAgIGRlZmluaXRpb24gb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHNjaGVtYSBuYW1lIGNhbiBiZSB1c2VkIGluIGFuIGluZGV4IGRlZmluaXRpb24sCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NoZW1hc0luSW5kZXhEZWZpbml0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGRhdGFiYXNlIHNjaGVtYSBuYW1lIGNhbiBiZSB1c2VkIGluIGEgcHJpdmlsZWdlCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZGF0YWJhc2Ugc2NoZW1hIG5hbWUgY2FuIGJlIHVzZWQgaW4gYSBwcml2aWxlZ2UKICAgICAgKiBkZWZpbml0aW9uIHN0YXRlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgZGF0YWJhc2Ugc2NoZW1hIG5hbWUgbWF5IGJlIHVzZWQgaW4gYQotICAgICAqICAgICAgICAgcHJpdmlsZWdlIGRlZmluaXRpb24gb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgZGF0YWJhc2Ugc2NoZW1hIG5hbWUgbWF5IGJlIHVzZWQgaW4gYSBwcml2aWxlZ2UKKyAgICAgKiAgICAgICAgIGRlZmluaXRpb24sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYXNJblByaXZpbGVnZURlZmluaXRpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiBhIHByb2NlZHVyZSBjYWxsIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbiBpbiBhIHNjaGVtYSBuYW1lLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhIHByb2NlZHVyZSBjYWxsIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbiBpbiBhIHNjaGVtYSBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBzY2hlbWEgbmFtZSBjYW4gYmUgdXNlZCBpbiBhIHByb2NlZHVyZQotICAgICAqICAgICAgICAgY2FsbCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgc2NoZW1hIG5hbWUgY2FuIGJlIHVzZWQgaW4gYSBwcm9jZWR1cmUgY2FsbCwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTY2hlbWFzSW5Qcm9jZWR1cmVDYWxscygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgYSBzY2hlbWEgbmFtZSBjYW4gYmUgdXNlZCBpbiBhIHRhYmxlIGRlZmluaXRpb24gc3RhdGVtZW50LgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhIHNjaGVtYSBuYW1lIGNhbiBiZSB1c2VkIGluIGEgdGFibGUgZGVmaW5pdGlvbiBzdGF0ZW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHNjaGVtYSBuYW1lIGNhbiBiZSB1c2VkIGluIGEgdGFibGUKLSAgICAgKiAgICAgICAgIGRlZmluaXRpb24gb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHNjaGVtYSBuYW1lIGNhbiBiZSB1c2VkIGluIGEgdGFibGUgZGVmaW5pdGlvbiwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTY2hlbWFzSW5UYWJsZURlZmluaXRpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGlzIDxjb2RlPlNFTEVDVCBGT1IgVVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzIGFyCi0gICAgICogc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUge0Bjb2RlIFNFTEVDVCBGT1IgVVBEQVRFfSBzdGF0ZW1lbnQgaXMgc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+U0VMRUNUIEZPUiBVUERBVEU8L2NvZGU+Ci0gICAgICogICAgICAgICBzdGF0ZW1lbnRzIGFyZSBzdXBwb3J0ZWQgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgU0VMRUNUIEZPUiBVUERBVEV9IHN0YXRlbWVudHMgYXJlCisgICAgICogICAgICAgICBzdXBwb3J0ZWQsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgc3RhdGVtZW50IHBvb2xpbmcgaXMgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBzdGF0ZW1lbnQgcG9vbGluZyBpcyBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBvZiB0aGUgZGF0YWJhc2UgZG9lcyBzdXBwb3J0IHN0YXRlbWVudAotICAgICAqICAgICAgICAgcG9vbGluZyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9mIHRoZSBkYXRhYmFzZSBkb2VzIHN1cHBvcnQgc3RhdGVtZW50IHBvb2xpbmcsCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3RhdGVtZW50UG9vbGluZygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBzdG9yZWQgcHJvY2VkdXJlIGNhbGxzIHVzaW5nIHRoZSBzdG9yZWQgcHJvY2VkdXJlCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHN0b3JlZCBwcm9jZWR1cmUgY2FsbHMgdXNpbmcgdGhlIHN0b3JlZCBwcm9jZWR1cmUKICAgICAgKiBlc2NhcGUgc3ludGF4IGlzIHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN0b3JlZCBwcm9jZWR1cmUgY2FsbHMgdXNpbmcgdGhlIHN0b3JlZAotICAgICAqICAgICAgICAgcHJvY2VkdXJlIGVzY2FwZSBzeW50YXggYXJlIHN1cHBvcnRlZCBvdGhlcndpc2UKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBzdG9yZWQgcHJvY2VkdXJlIGNhbGxzIHVzaW5nIHRoZSBzdG9yZWQgcHJvY2VkdXJlCisgICAgICogICAgICAgICBlc2NhcGUgc3ludGF4IGFyZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdG9yZWRQcm9jZWR1cmVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHN1YnF1ZXJpZXMgaW4gY29tcGFyaXNvbiBleHByZXNzaW9ucyBhcmUgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBzdWJxdWVyaWVzIGluIGNvbXBhcmlzb24gZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1YnF1ZXJpZXMgYXJlIHN1cHBvcnRlZCBpbiBjb21wYXJpc29uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgc3VicXVlcmllcyBhcmUgc3VwcG9ydGVkIGluIGNvbXBhcmlzb24KICAgICAgKiAgICAgICAgIGV4cHJlc3Npb25zLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdWJxdWVyaWVzSW5Db21wYXJpc29ucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBzdWJxdWVyaWVzIGluIEVYSVNUUyBleHByZXNzaW9ucyBhcmUgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBzdWJxdWVyaWVzIGluIHtAY29kZSBFWElTVFN9IGV4cHJlc3Npb25zIGFyZSBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWJxdWVyaWVzIGFyZSBzdXBwb3J0ZWQgaW4gRVhJU1RTCi0gICAgICogICAgICAgICBleHByZXNzaW9ucyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHN1YnF1ZXJpZXMgYXJlIHN1cHBvcnRlZCBpbiB7QGNvZGUgRVhJU1RTfQorICAgICAqICAgICAgICAgZXhwcmVzc2lvbnMsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdWJxdWVyaWVzSW5FeGlzdHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgc3VicXVlcmllcyBpbiA8Y29kZT5JTjwvY29kZT4gc3RhdGVtZW50cyBhcmUKLSAgICAgKiBzdXBwb3J0ZWQuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHN1YnF1ZXJpZXMgaW4ge0Bjb2RlIElOfSBzdGF0ZW1lbnRzIGFyZSBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWJxdWVyaWVzIGFyZSBzdXBwb3J0ZWQgaW4gSU4gc3RhdGVtZW50cwotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBzdWJxdWVyaWVzIGFyZSBzdXBwb3J0ZWQgaW4ge0Bjb2RlIElOfSBzdGF0ZW1lbnRzLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1N1YnF1ZXJpZXNJbklucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBzdWJxdWVyaWVzIGluIHF1YW50aWZpZWQgZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgc3VicXVlcmllcyBpbiBxdWFudGlmaWVkIGV4cHJlc3Npb25zIGFyZSBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWJxdWVyaWVzIGFyZSBzdXBwb3J0ZWQgb3RoZXJ3aXNlCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgc3VicXVlcmllcyBhcmUgc3VwcG9ydGVkLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3VicXVlcmllc0luUXVhbnRpZmllZHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGhhcyB0YWJsZSBjb3JyZWxhdGlvbiBuYW1lcyBzdXBwb3J0LgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YWJhc2UgaGFzIHRhYmxlIGNvcnJlbGF0aW9uIG5hbWVzIHN1cHBvcnQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0YWJsZSBjb3JyZWxhdGlvbiBuYW1lcyBhcmUgc3VwcG9ydGVkCi0gICAgICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRhYmxlIGNvcnJlbGF0aW9uIG5hbWVzIGFyZSBzdXBwb3J0ZWQsIG90aGVyd2lzZQorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVGFibGVDb3JyZWxhdGlvbk5hbWVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgc3BlY2lmaWVkIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCBpcyBzdXBwb3J0ZWQuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3BlY2lmaWVkIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCBpcyBzdXBwb3J0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxldmVsCi0gICAgICogICAgICAgICAgICB0aGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsLCBhcyBzcGVjaWZpZWQgaW4KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmphdmEuc3FsLkNvbm5lY3Rpb248L2NvZGU+OgotICAgICAqICAgICAgICAgICAgPGNvZGU+VFJBTlNBQ1RJT05fTk9ORTwvY29kZT4sCi0gICAgICogICAgICAgICAgICA8Y29kZT5UUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRDwvY29kZT4sCi0gICAgICogICAgICAgICAgICA8Y29kZT5UUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVEPC9jb2RlPiwKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRDwvY29kZT4sCi0gICAgICogICAgICAgICAgICA8Y29kZT5UUkFOU0FDVElPTl9TRVJJQUxJWkFCTEU8L2NvZGU+Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWMgaXNvbGF0aW9uIGxldmVsIGlzIHN1cHBvcnRlZAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwsIGFzIHNwZWNpZmllZCBpbiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLkNvbm5lY3Rpb259OiB7QGNvZGUgVFJBTlNBQ1RJT05fTk9ORX0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUR9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUR9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRH0sIHtAY29kZSBUUkFOU0FDVElPTl9TRVJJQUxJWkFCTEV9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmljIGlzb2xhdGlvbiBsZXZlbCBpcyBzdXBwb3J0ZWQsCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHJhbnNhY3Rpb25Jc29sYXRpb25MZXZlbChpbnQgbGV2ZWwpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLgogICAgICAqIDxwPgotICAgICAqIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgdGhlbiB0aGUgPGNvZGU+Y29tbWl0PC9jb2RlPiBtZXRob2QKLSAgICAgKiBkb2VzIG5vdGhpbmcgYW5kIHRoZSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgaXMgYWx3YXlzCi0gICAgICogPGNvZGU+VFJBTlNBQ1RJT05fTk9ORTwvY29kZT4uCisgICAgICogSWYgdHJhbnNhY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSB7QGNvZGUgY29tbWl0fSBtZXRob2QgZG9lcworICAgICAqIG5vdGhpbmcgYW5kIHRoZSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgaXMgYWx3YXlzIHtAY29kZQorICAgICAqIFRSQU5TQUNUSU9OX05PTkV9LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkIG90aGVyd2lzZQotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLCBvdGhlcndpc2Uge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1RyYW5zYWN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgPGNvZGU+U1FMIFVOSU9OPC9jb2RlPiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUge0Bjb2RlIFNRTCBVTklPTn0gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IG9mIHRoZSBkYXRhYmFzZSBkb2VzIHN1cHBvcnQKLSAgICAgKiAgICAgICAgIDxjb2RlPlVOSU9OPC9jb2RlPiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9mIHRoZSBkYXRhYmFzZSBkb2VzIHN1cHBvcnQge0Bjb2RlIFVOSU9OfSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZAorICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVbmlvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgPGNvZGU+U1FMIFVOSU9OIEFMTDwvY29kZT4gb3BlcmF0aW9uIGlzCi0gICAgICogc3VwcG9ydGVkLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUge0Bjb2RlIFNRTCBVTklPTiBBTEx9IG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGF0YWJhc2UgZG9lcyBzdXBwb3J0IFVOSU9OIEFMTAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBzdXBwb3J0IHtAY29kZSBVTklPTiBBTEx9LAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VuaW9uQWxsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgbWV0aG9kIDxjb2RlPlJlc3VsdFNldC5yb3dVcGRhdGVkPC9jb2RlPiBjYW4gZGV0ZWN0IGEKLSAgICAgKiB2aXNpYmxlIHJvdyB1cGRhdGUuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtZXRob2Qge0Bjb2RlIFJlc3VsdFNldC5yb3dVcGRhdGVkfSBjYW4gZGV0ZWN0IGEgdmlzaWJsZQorICAgICAqIHJvdyB1cGRhdGUgZm9yIHRoZSBzcGVjaWZpZWQge0Bjb2RlIFJlc3VsdFNldH0gdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0IHR5cGU6IDxjb2RlPlJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWTwvY29kZT4sCi0gICAgICogICAgICAgICAgICA8Y29kZT5SZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkU8L2NvZGU+LCBvcgotICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzdWx0U2V0LlRZUEVfU0NST0xMX1NFTlNJVElWRTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGRldGVjdGluZyBjaGFuZ2VzIGlzIHBvc3NpYmxlIG90aGVyd2lzZQotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqICAgICAgICAgICAge0Bjb2RlIFJlc3VsdFNldH0gdHlwZToge0Bjb2RlIFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWX0sCisgICAgICogICAgICAgICAgICB7QGNvZGUgUmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFfSwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFfQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGRldGVjdGluZyBjaGFuZ2VzIGlzIHBvc3NpYmxlLCBvdGhlcndpc2Uge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVzQXJlRGV0ZWN0ZWQoaW50IHR5cGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBkYXRhYmFzZSB1c2VzIGEgZmlsZSBmb3IgZWFjaCB0YWJsZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBkYXRhYmFzZSB1c2VzIGEgZmlsZSBmb3IgZWFjaCB0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkYXRhYmFzZSB1c2VzIG9uZSBmaWxlIGZvciBlYWNoIHRhYmxlCi0gICAgICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBkYXRhYmFzZSB1c2VzIG9uZSBmaWxlIGZvciBlYWNoIHRhYmxlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkCisgICAgICogICAgICAgICAgICAgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzTG9jYWxGaWxlUGVyVGFibGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkYXRhYmFzZSB1c2VzIGEgbG9jYWwgZmlsZSB0byBzdG9yZSB0YWJsZXMuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZGF0YWJhc2UgdXNlcyBhIGxvY2FsIGZpbGUgdG8gc3RvcmUgdGFibGVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gb2YgdGhlIGRhdGFiYXNlIGRvZXMgc3RvcmUgdGFibGVzIGluIGEgbG9jYWwKLSAgICAgKiAgICAgICAgIGZpbGUgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGF0YWJhc2Ugc3RvcmVzIHRhYmxlcyBpbiBhIGxvY2FsIGZpbGUsCisgICAgICogICAgICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiAgICAgICAgICAgICBhIGRhdGFiYXNlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHVzZXNMb2NhbEZpbGVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RhdGUuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RhdGUuamF2YQppbmRleCBjZTMxYjAxLi5lNTA2YTQzIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9EYXRlLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRGF0ZS5qYXZhCkBAIC0yMCwzNSArMjAsNDEgQEAKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIAogLyoqCi0gKiBBIERhdGUgY2xhc3Mgd2hpY2ggY2FuIGNvbnN1bWUgYW5kIHByb2R1Y2UgZGF0ZXMgaW4gU1FMIERhdGUgZm9ybWF0LgorICogQSBjbGFzcyB3aGljaCBjYW4gY29uc3VtZSBhbmQgcHJvZHVjZSBkYXRlcyBpbiBTUUwge0Bjb2RlIERhdGV9IGZvcm1hdC4KICAqIDxwPgotICogVGhlIFNRTCBkYXRlIGZvcm1hdCByZXByZXNlbnRzIGEgZGF0ZSBhcyB5eXl5LW1tLWRkLiBOb3RlIHRoYXQgdGhpcyBkYXRlCisgKiBEYXRlcyBhcmUgcmVwcmVzZW50ZWQgaW4gU1FMIGFzIHtAY29kZSB5eXl5LW1tLWRkfS4gTm90ZSB0aGF0IHRoaXMgZGF0ZQogICogZm9ybWF0IG9ubHkgZGVhbHMgd2l0aCB5ZWFyLCBtb250aCBhbmQgZGF5IHZhbHVlcy4gVGhlcmUgYXJlIG5vIHZhbHVlcyBmb3IKICAqIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLgorICogPC9wPgorICogVGhpcyBpcyB1bmxpa2UgdGhlIGZhbWlsaWFyIHtAY29kZSBqYXZhLnV0aWwuRGF0ZX0gb2JqZWN0LCB3aGljaCBhbHNvIGluY2x1ZGVzIAorICogdmFsdWVzIGZvciBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG1pbGxpc2Vjb25kcy4KICAqIDxwPgotICogVGhpcyBjb250cmFzdHMgd2l0aCByZWd1bGFyIGphdmEudXRpbC5EYXRlIHZhbHVlcywgd2hpY2ggaW5jbHVkZSB0aW1lIHZhbHVlcwotICogZm9yIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMuCi0gKiA8cD4KLSAqIFRpbWUgcG9pbnRzIGFyZSBoYW5kbGVkIGFzIG1pbGxpc2Vjb25kIHZhbHVlcyAtIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gsCi0gKiBKYW51YXJ5IDFzdCAxOTcwLCAwMDowMDowMC4wMDAgR01ULiBUaW1lIHZhbHVlcyBwYXNzZWQgdG8gdGhlIGphdmEuc3FsLkRhdGUKLSAqIGNsYXNzIGFyZSAibm9ybWFsaXplZCIgdG8gdGhlIHRpbWUgMDA6MDA6MDAuMDAwIEdNVCBvbiB0aGUgZGF0ZSBpbXBsaWVkIGJ5Ci0gKiB0aGUgdGltZSB2YWx1ZS4KKyAqIFRpbWUgcG9pbnRzIGFyZSBoYW5kbGVkIGFzIG1pbGxpc2Vjb25kIHZhbHVlcyAtIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2gsCisgKiBKYW51YXJ5IDFzdCAxOTcwLCAwMDowMDowMC4wMDAgR01ULiBUaW1lIHZhbHVlcyBwYXNzZWQgdG8gdGhlIHtAY29kZQorICogamF2YS5zcWwuRGF0ZX0gY2xhc3MgYXJlICJub3JtYWxpemVkIiB0byB0aGUgdGltZSAwMDowMDowMC4wMDAgR01UIG9uIHRoZQorICogZGF0ZSBpbXBsaWVkIGJ5IHRoZSB0aW1lIHZhbHVlLgorICogPC9wPgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEYXRlIGV4dGVuZHMgamF2YS51dGlsLkRhdGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTUxMTU5ODAzODQ4NzIzMDEwM0w7CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSBjb25zdHJ1Y3RvciB7QGxpbmsgI0RhdGUobG9uZyl9IENvbnN0cnVjdHMgYSBEYXRlCi0gICAgICogICAgICAgICAgICAgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBsaWVkIFllYXIsIE1vbnRoIGFuZCBEYXkuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBEYXRlfSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3VwcGxpZWQgeWVhciwKKyAgICAgKiBtb250aCBhbmQgZGF5LgorICAgICAqIAorICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlIGNvbnN0cnVjdG9yIHtAbGluayAjRGF0ZShsb25nKX0uCiAgICAgICogQHBhcmFtIHRoZVllYXIKICAgICAgKiAgICAgICAgICAgIHRoZSB5ZWFyLCBzcGVjaWZpZWQgYXMgdGhlIHllYXIgbWludXMgMTkwMC4gTXVzdCBiZSBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgIHJhbmdlIDAgdG8gODA5OS4KKyAgICAgKiAgICAgICAgICAgIHJhbmdlIHtAY29kZSBbMCw4MDk5XX0uCiAgICAgICogQHBhcmFtIHRoZU1vbnRoCiAgICAgICogICAgICAgICAgICB0aGUgbW9udGgsIHNwZWNpZmllZCBhcyBhIG51bWJlciB3aXRoIDAgPSBKYW51YXJ5LiBNdXN0IGJlIGluCi0gICAgICogICAgICAgICAgICB0aGUgcmFuZ2UgMCB0byAxMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSByYW5nZSB7QGNvZGUgWzAsMTFdfS4KICAgICAgKiBAcGFyYW0gdGhlRGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IGluIHRoZSBtb250aC4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgMSB0byAzMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXkgaW4gdGhlIG1vbnRoLiBNdXN0IGJlIGluIHRoZSByYW5nZSB7QGNvZGUgWzEsMzFdfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC01NywyNiArNjMsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRGF0ZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZGF5IGltcGxpZWQgYnkgdGhlIHN1cHBsaWVkCi0gICAgICogdGhlRGF0ZSBtaWxsaXNlY29uZHMgdGltZSB2YWx1ZS4KKyAgICAgKiBDcmVhdGVzIGEgZGF0ZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZGF5IGRldGVybWluZWQgYnkgdGhlIHN1cHBsaWVkCisgICAgICogbWlsbGlzZWNvbmRzIHRpbWUgdmFsdWUge0Bjb2RlIHRoZURhdGV9LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aGVEYXRlIC0KKyAgICAgKiBAcGFyYW0gdGhlRGF0ZQogICAgICAqICAgICAgICAgICAgYSB0aW1lIHZhbHVlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggLSBKYW51YXJ5IDEgMTk3MAogICAgICAqICAgICAgICAgICAgMDA6MDA6MDAgR01ULiBUaGUgdGltZSB2YWx1ZSAoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsCi0gICAgICogICAgICAgICAgICBtaWxsaXNlY29uZHMpIHN0b3JlZCBpbiB0aGUgRGF0ZSBvYmplY3QgaXMgYWRqdXN0ZWQgdG8KLSAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gMDA6MDA6MDAgR01UIG9uIHRoZSBkYXkgaW1wbGllZCBieSB0aGUgc3VwcGxpZWQKKyAgICAgKiAgICAgICAgICAgIG1pbGxpc2Vjb25kcykgc3RvcmVkIGluIHRoZSB7QGNvZGUgRGF0ZX0gb2JqZWN0IGlzIGFkanVzdGVkIHRvCisgICAgICogICAgICAgICAgICBjb3JyZXNwb25kIHRvIDAwOjAwOjAwIEdNVCBvbiB0aGUgZGF5IGRldGVybWluZWQgYnkgdGhlIHN1cHBsaWVkCiAgICAgICogICAgICAgICAgICB0aW1lIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlKGxvbmcgdGhlRGF0ZSkgewogICAgICAgICBzdXBlcihub3JtYWxpemVUaW1lKHRoZURhdGUpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBTUUwgRGF0ZQotICAgICAqICAgICAgICAgICAgIHZhbHVlcyBkbyBub3QgaGF2ZSBhbiBob3VycyBjb21wb25lbnQuCi0gICAgICogQHJldHVybiBkb2VzIG5vdCByZXR1cm4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBTUUwge0Bjb2RlCisgICAgICogICAgICAgICAgICAgRGF0ZX0gdmFsdWVzIGRvIG5vdCBoYXZlIGFuIGhvdXJzIGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC04NiwxMSArOTQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBTUUwgRGF0ZQotICAgICAqICAgICAgICAgICAgIHZhbHVlcyBkbyBub3QgaGF2ZSBhIG1pbnV0ZXMgY29tcG9uZW50LgotICAgICAqIEByZXR1cm4gZG9lcyBub3QgcmV0dXJuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gU1FMIHtAY29kZQorICAgICAqICAgICAgICAgICAgIERhdGV9IHZhbHVlcyBkbyBub3QgaGF2ZSBhIG1pbnV0ZXMgY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKQEAgLTEwMCwxMSArMTA5LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gU1FMIERhdGUKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZXMgZG8gbm90IGhhdmUgYSBzZWNvbmRzIGNvbXBvbmVudC4KLSAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIFNRTCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBEYXRlfSB2YWx1ZXMgZG8gbm90IGhhdmUgYSBzZWNvbmRzIGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC0xMTQsMTIgKzEyNCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIFNRTCBEYXRlCi0gICAgICogICAgICAgICAgICAgdmFsdWVzIGRvIG5vdCBoYXZlIGFuIGhvdXJzIGNvbXBvbmVudC4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBTUUwge0Bjb2RlCisgICAgICogICAgICAgICAgICAgRGF0ZX0gdmFsdWVzIGRvIG5vdCBoYXZlIGFuIGhvdXJzIGNvbXBvbmVudC4KICAgICAgKiBAcGFyYW0gdGhlSG91cnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgaG91cnMgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGhvdXJzIHRvIHNldC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC0xMjksMTIgKzE0MCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIFNRTCBEYXRlCi0gICAgICogICAgICAgICAgICAgdmFsdWVzIGRvIG5vdCBoYXZlIGEgbWludXRlcyBjb21wb25lbnQuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gU1FMIHtAY29kZQorICAgICAqICAgICAgICAgICAgIERhdGV9IHZhbHVlcyBkbyBub3QgaGF2ZSBhIG1pbnV0ZXMgY29tcG9uZW50LgogICAgICAqIEBwYXJhbSB0aGVNaW51dGVzCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gc2V0LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKQEAgLTE0NCwxMiArMTU2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gU1FMIERhdGUKLSAgICAgKiAgICAgICAgICAgICB2YWx1ZXMgZG8gbm90IGhhdmUgYSBzZWNvbmRzIGNvbXBvbmVudC4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBTUUwge0Bjb2RlCisgICAgICogICAgICAgICAgICAgRGF0ZX0gdmFsdWVzIGRvIG5vdCBoYXZlIGEgc2Vjb25kcyBjb21wb25lbnQuCiAgICAgICogQHBhcmFtIHRoZVNlY29uZHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBzZXQuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBARGVwcmVjYXRlZApAQCAtMTYwLDExICsxNzMsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhpcyBkYXRlIHRvIGEgZGF0ZSBzdXBwbGllZCBhcyBhIG1pbGxpc2Vjb25kcyB2YWx1ZS4gVGhlIGRhdGUgaXMKLSAgICAgKiBzZXQgYmFzZWQgb24gdGhlIHN1cHBsaWVkIHRpbWUgdmFsdWUgYWZ0ZXIgcmVtb3ZpbmcgYW55IHRpbWUgZWxlbWVudHMKLSAgICAgKiBmaW5lciB0aGFuIGEgZGF5LCBiYXNlZCBvbiB6ZXJvIEdNVCBmb3IgdGhhdCBkYXkuCisgICAgICogc2V0IGJhc2VkIG9uIHRoZSBzdXBwbGllZCB0aW1lIHZhbHVlIGFuZCByb3VuZGVkIHRvIHplcm8gR01UIGZvciB0aGF0IGRheS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlVGltZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKGxvbmcgdGhlVGltZSkgewpAQCAtMTc2LDkgKzE4OSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBEYXRlIGluIFNRTCBmb3JtYXQKKyAgICAgKiBQcm9kdWNlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0ZSBpbiBTUUwgZm9ybWF0CiAgICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRGF0ZSBpbiBTUUwgZm9ybWF0IC0gInl5eXktbW0tZGQiLgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGUgaW4gU1FMIGZvcm1hdCAtIHtAY29kZQorICAgICAqICAgICAgICAgInl5eXktbW0tZGQifS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMTg3LDE1ICsyMDIsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRGF0ZSBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZGF0ZSBpbiBTUUwgZm9ybWF0LgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgRGF0ZX0gZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUgaW4gU1FMCisgICAgICogZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRlU3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZGF0ZSBpbiBTUUwgZm9ybWF0IC0KLSAgICAgKiAgICAgICAgICAgICJ5eXl5LW1tLWRkIi4KLSAgICAgKiBAcmV0dXJuIHRoZSBEYXRlIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUgaW4gU1FMIGZvcm1hdCAtICIge0Bjb2RlCisgICAgICogICAgICAgICAgICB5eXl5LW1tLWRkfSIuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGV9IG9iamVjdC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmb3JtYXQgb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgU1FMCiAgICAgICogICAgICAgICAgICAgZm9ybWF0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSB2YWx1ZU9mKFN0cmluZyBkYXRlU3RyaW5nKSB7CiAgICAgICAgIGlmIChkYXRlU3RyaW5nID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RyaXZlci5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyLmphdmEKaW5kZXggNzgzMzcyNC4uYzA0OTljYiAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyLmphdmEKQEAgLTIwLDE0ICsyMCwyMiBAQAogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCiAvKioKLSAqIEFuIEludGVyZmFjZSB0byBhIEpEQkMgRHJpdmVyLgorICogQW4gaW50ZXJmYWNlIHRvIGEgSkRCQyBkcml2ZXIuCiAgKiA8cD4KLSAqIFRoZSBKREJDIERyaXZlciB1c2VzIFVSTHMgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2Ygc3BlY2lmaWMgZGF0YS4gVVJMCi0gKiBmb3JtYXQgdHlwaWNhbGx5IHRha2VzIHRoZSBmb3JtICJ4eHh4Onl5eXk6U3BlY2lmaWNEYXRhIiwgd2hlcmUgInh4eHg6eXl5eSIKLSAqIGlzIHRlcm1lZCB0aGUgc3VicHJvdG9jb2wgYW5kIGlzIG5vcm1hbGx5IHRoZSBzYW1lIGZvciBhbGwgdXNlcyBvZiBhCi0gKiBwYXJ0aWN1bGFyIGRyaXZlci4gIlNwZWNpZmljRGF0YSIgaXMgYSBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgcGFydGljdWxhcgotICogZGF0YSBzb3VyY2UgdGhhdCB0aGUgZHJpdmVyIHNob3VsZCB1c2UuCi0gKiAKKyAqIFRoZSBKREJDIGRyaXZlciB1c2VzIFVSTHMgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2Ygc3BlY2lmaWMgZGF0YS4gVVJMCisgKiBmb3JtYXQgdHlwaWNhbGx5IHRha2VzIHRoZSBmb3JtICIge0Bjb2RlIHh4eHg6eXl5eTpTcGVjaWZpY0RhdGF9Iiwgd2hlcmUgIgorICoge0Bjb2RlIHh4eHg6eXl5eX0iIGlzIHJlZmVycmVkIHRvIGFzIHRoZSA8aT5zdWJwcm90b2NvbDwvaT4gYW5kIGlzIG5vcm1hbGx5CisgKiB0aGUgc2FtZSBmb3IgYWxsIG9mIGEgcGFydGljdWxhciBkcml2ZXIuICIge0Bjb2RlIFNwZWNpZmljRGF0YX0iIGlzIGEgc3RyaW5nCisgKiB3aGljaCBpZGVudGlmaWVzIHRoZSBwYXJ0aWN1bGFyIGRhdGEgc291cmNlIHRoYXQgdGhlIGRyaXZlciBzaG91bGQgdXNlLgorICogPC9wPgorICogPHA+CisgKiBBIGRyaXZlciBuZWVkcyB0byBiZSByZWdpc3RlcmVkIHdpdGggYSB7QGxpbmsgRHJpdmVyTWFuYWdlcn0uIEl0IGlzCisgKiByZWdpc3RlcmVkIGFuZCBpbnN0YW50aWF0ZWQgYnkgY2FsbGluZyB7QGNvZGUgQ2xhc3MuZm9yTmFtZSgiRHJpdmVyVVJMIil9CisgKiB3aXRoIHRoZSBVUkwgc3RyaW5nIGFzIGFyZ3VtZW50LgorICogPC9wPgorICogQHNlZSBEcml2ZXJNYW5hZ2VyCisgKiAgCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBEcml2ZXIgewogCkBAIC0zNyw0MyArNDUsNDggQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXJsCiAgICAgICogICAgICAgICAgICB0aGUgVVJMIHRvIGNvbm5lY3QgdG8uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcml2ZXIgdGhpbmtzIHRoYXQgaXMgY2FuIG9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZQotICAgICAqICAgICAgICAgc3VwcGxpZWQgVVJMLCBmYWxzZSBvdGhlcndpc2UuIFR5cGljYWxseSwgdGhlIGRyaXZlciB3aWxsIHJlc3BvbmQKLSAgICAgKiAgICAgICAgIHRydWUgaWYgaXQgdGhpbmtzIHRoYXQgaXQgY2FuIGhhbmRsZSB0aGUgc3VicHJvdG9jb2wgc3BlY2lmaWVkIGJ5Ci0gICAgICogICAgICAgICB0aGUgZHJpdmVyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBkcml2ZXIgdGhpbmtzIHRoYXQgaXMgY2FuIG9wZW4gYSBjb25uZWN0aW9uCisgICAgICogICAgICAgICB0byB0aGUgc3VwcGxpZWQgVVJMLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4gVHlwaWNhbGx5LCB0aGUKKyAgICAgKiAgICAgICAgIGRyaXZlciB3aWxsIHJlc3BvbmQge0Bjb2RlIHRydWV9IGlmIGl0IHRoaW5rcyB0aGF0IGl0IGNhbiBoYW5kbGUKKyAgICAgKiAgICAgICAgIHRoZSBzdWJwcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlIGRyaXZlci4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdHNVUkwoU3RyaW5nIHVybCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIG1ha2UgYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGEgZGF0YXNvdXJjZSBzcGVjaWZpZWQgYnkgYQorICAgICAqIEF0dGVtcHRzIHRvIG1ha2UgYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGEgZGF0YSBzb3VyY2Ugc3BlY2lmaWVkIGJ5IGEKICAgICAgKiBzdXBwbGllZCBVUkwuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgdGhlIHVybCB0byBjb25uZWN0LgorICAgICAqICAgICAgICAgICAgdGhlIFVSTCB0byBjb25uZWN0LgogICAgICAqIEBwYXJhbSBpbmZvCiAgICAgICogICAgICAgICAgICBzb21lIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBlc3RhYmxpc2hpbmcgdGhlCiAgICAgICogICAgICAgICAgICBjb25uZWN0aW9uLiBUaGUgcHJvcGVydGllcyBjb25zaXN0IG9mIG5hbWUvdmFsdWUgcGFpcnMgb2YKLSAgICAgKiAgICAgICAgICAgIFN0cmluZ3MuIE5vcm1hbGx5LCBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSByZXF1aXJlcyBhdAotICAgICAqICAgICAgICAgICAgbGVhc3QgdHdvIHByb3BlcnRpZXMgLSBmb3IgInVzZXIiIGFuZCAicGFzc3dvcmQiIGluIG9yZGVyIHRvCi0gICAgICogICAgICAgICAgICBwYXNzIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgKiBAcmV0dXJuIGEgQ29ubmVjdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKiAgICAgICAgICAgIHN0cmluZ3MuIE5vcm1hbGx5LCBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSByZXF1aXJlcyBhdAorICAgICAqICAgICAgICAgICAgbGVhc3QgdHdvIHByb3BlcnRpZXMgLSBmb3Ige0Bjb2RlICJ1c2VyIn0gYW5kIHtAY29kZQorICAgICAqICAgICAgICAgICAgInBhc3N3b3JkIn0gaW4gb3JkZXIgdG8gcGFzcyBhdXRoZW50aWNhdGlvbiB0byB0aGUgZGF0YWJhc2UuCisgICAgICogQHJldHVybiB0aGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb25uZWN0aW9uIGNvbm5lY3QoU3RyaW5nIHVybCwgUHJvcGVydGllcyBpbmZvKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZHJpdmVyJ3MgbWFqb3IgdmVyc2lvbiBudW1iZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIERyaXZlciAtIHR5cGljYWxseSBzdGFydHMgYXQgMS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZHJpdmVyIC0gdHlwaWNhbGx5IHN0YXJ0cyBhdCAxLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWFqb3JWZXJzaW9uKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkcml2ZXIncyBtaW5vciB2ZXJzaW9uIG51bWJlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgRHJpdmVyIC0gdHlwaWNhbGx5IHN0YXJ0cyBhdCAwLgorICAgICAqIEByZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkcml2ZXIgLSB0eXBpY2FsbHkgc3RhcnRzIGF0IDAuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNaW5vclZlcnNpb24oKTsKIApAQCAtODEsMzIgKzk0LDQyIEBACiAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBwcm9wZXJ0aWVzIGZvciB0aGlzIGRyaXZlci4KICAgICAgKiA8cD4KICAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgbGlzdGluZyBvZiBwb3NzaWJsZSBwcm9wZXJ0aWVzIHRoYXQKLSAgICAgKiB0aGUgdXNlciBvZiB0aGUgZHJpdmVyIG1heSBuZWVkIHRvIHN1cHBseSBpbiBvcmRlciB0byBjb3JyZWN0IGNvbm5lY3QgdG8KLSAgICAgKiBhIGRhdGFiYXNlLiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IG9mIFByb3BlcnRpZXMgbWF5IGNoYW5nZQorICAgICAqIHRoZSBjbGllbnQgb2YgdGhlIGRyaXZlciBtdXN0IHN1cHBseSBpbiBvcmRlciB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uCisgICAgICogdG8gYSBkYXRhYmFzZS4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBhcnJheSBvZiBwcm9wZXJ0aWVzIG1heSBjaGFuZ2UKICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHN1cHBsaWVkIGxpc3Qgb2YgcHJvcGVydHkgdmFsdWVzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICB0aGUgdXJsIG9mIHRoZSBkYXRhYmFzZS4gQSB1c2luZyBwcm9ncmFtIG1heSBjYWxsIHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICB0aGUgVVJMIG9mIHRoZSBkYXRhYmFzZS4gQW4gYXBwbGljYXRpb24gbWF5IGNhbGwgdGhpcyBtZXRob2QKICAgICAgKiAgICAgICAgICAgIGl0ZXJhdGl2ZWx5IGFzIHRoZSBwcm9wZXJ0eSBsaXN0IGlzIGJ1aWx0IHVwIC0gZm9yIGV4YW1wbGUsCiAgICAgICogICAgICAgICAgICB3aGVuIGRpc3BsYXlpbmcgYSBkaWFsb2cgdG8gYW4gZW5kLXVzZXIgYXMgcGFydCBvZiB0aGUKICAgICAgKiAgICAgICAgICAgIGRhdGFiYXNlIGxvZ2luIHByb2Nlc3MuCiAgICAgICogQHBhcmFtIGluZm8KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIERyaXZlclByb3BlcnR5SW5mbyByZWNvcmRzIHdoaWNoIHByb3ZpZGUgZGV0YWlsIG9uCi0gICAgICogICAgICAgICBlYWNoIHByb3BlcnR5IHRoYXQgdGhlIGRyaXZlciB3aWxsIGFjY2VwdC4KKyAgICAgKiAgICAgICAgICAgIGEgc2V0IG9mIHRhZy92YWx1ZSBwYWlycyBnaXZpbmcgZGF0YSB0aGF0IGEgdXNlciBtYXkgYmUgCisgICAgICogICAgICAgICAgICBwcm9tcHRlZCB0byBwcm92aWRlIGluIG9yZGVyIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0Bjb2RlIERyaXZlclByb3BlcnR5SW5mb30gcmVjb3JkcyB3aGljaCBwcm92aWRlCisgICAgICogICAgICAgICBkZXRhaWxzIG9uIHdoaWNoIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgcmVxdWlyZWQgKGluIGFkZGl0aW9uCisgICAgICogICAgICAgICB0byB0aG9zZSBzdXBwbGllZCBpbiB0aGUge0Bjb2RlIGluZm99IHBhcmFtZXRlcikgaW4gb3JkZXIgdG8gCisgICAgICogICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEcml2ZXJQcm9wZXJ0eUluZm9bXSBnZXRQcm9wZXJ0eUluZm8oU3RyaW5nIHVybCwgUHJvcGVydGllcyBpbmZvKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGlzIGRyaXZlciBpcyBhIGdlbnVpbmUgSkRCQyBDb21wbGlhbnRUTSBkcml2ZXIuIFRoZQotICAgICAqIGRyaXZlciBtYXkgb25seSByZXR1cm4gdHJ1ZSBmcm9tIHRoaXMgbWV0aG9kIGlmIGl0IHBhc3NlcyBhbGwgdGhlIEpEQkMKLSAgICAgKiBDb21wbGlhbmNlIHRlc3RzLgorICAgICAqIGRyaXZlciBtYXkgb25seSByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGl0IHBhc3NlcyBhbGwgdGhlIEpEQkMgY29tcGxpYW5jZQorICAgICAqIHRlc3RzLgogICAgICAqIDxwPgogICAgICAqIEEgZHJpdmVyIG1heSBub3QgYmUgZnVsbHkgY29tcGxpYW50IGlmIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIGhhcwogICAgICAqIGxpbWl0ZWQgZnVuY3Rpb25hbGl0eS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcml2ZXIgaXMgZnVsbHkgSkRCQyBjb21wbGlhbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZHJpdmVyIGlzIGZ1bGx5IEpEQkMgY29tcGxpYW50LCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gamRiY0NvbXBsaWFudCgpOwogCmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyLmphdmEKaW5kZXggNzhmMzYyYy4uYWZjZjJmNSAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyTWFuYWdlci5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RyaXZlck1hbmFnZXIuamF2YQpAQCAtMjYsMTMgKzI2LDE5IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc3FsLmludGVybmFsLm5scy5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNOworLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVN0YWNrOworLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAvKioKLSAqIFByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIG1hbmFnaW5nIEpEQkMgRHJpdmVycy4KKyAqIFByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIG1hbmFnaW5nIEpEQkMgZHJpdmVycy4KICAqIDxwPgotICogVGhlIERyaXZlck1hbmFnZXIgY2xhc3Mgd2lsbCBsb2FkIEpEQkMgZHJpdmVycyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uLAotICogZnJvbSB0aGUgbGlzdCBvZiBkcml2ZXJzIHJlZmVyZW5jZWQgYnkgdGhlIFN5c3RlbSBQcm9wZXJ0eSAiamRiYy5kcml2ZXJzIi4KKyAqIFRoZSB7QGNvZGUgRHJpdmVyTWFuYWdlcn0gY2xhc3MgbG9hZHMgSkRCQyBkcml2ZXJzIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24sCisgKiBmcm9tIHRoZSBsaXN0IG9mIGRyaXZlcnMgcmVmZXJlbmNlZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5IHtAY29kZQorICogImpkYmMuZHJpdmVycyJ9LgorICogPC9wPgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEcml2ZXJNYW5hZ2VyIHsKIApAQCAtOTksMjggKzEwNSwzNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBkcml2ZXIgZnJvbSB0aGUgRHJpdmVyTWFuYWdlcidzIHJlZ2lzdGVyZWQgZHJpdmVyIGxpc3QuIFRoaXMKLSAgICAgKiB3aWxsIG9ubHkgc3VjY2VlZCB3aGVyZSB0aGUgY2FsbGVyJ3MgY2xhc3Nsb2FkZXIgbG9hZGVkIHRoZSBkcml2ZXIgdGhhdAotICAgICAqIGlzIHRvIGJlIHJlbW92ZWQuIElmIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCBieSBhIGRpZmZlcmVudCBjbGFzc2xvYWRlciwKLSAgICAgKiB0aGUgcmVtb3ZhbCBvZiB0aGUgZHJpdmVyIHdpbGwgZmFpbCBzaWxlbnRseS4KKyAgICAgKiBSZW1vdmVzIGEgZHJpdmVyIGZyb20gdGhlIHtAY29kZSBEcml2ZXJNYW5hZ2VyfSdzIHJlZ2lzdGVyZWQgZHJpdmVyIGxpc3QuCisgICAgICogVGhpcyB3aWxsIG9ubHkgc3VjY2VlZCB3aGVuIHRoZSBjYWxsZXIncyBjbGFzcyBsb2FkZXIgbG9hZGVkIHRoZSBkcml2ZXIKKyAgICAgKiB0aGF0IGlzIHRvIGJlIHJlbW92ZWQuIElmIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCBieSBhIGRpZmZlcmVudCBjbGFzcworICAgICAqIGxvYWRlciwgdGhlIHJlbW92YWwgb2YgdGhlIGRyaXZlciBmYWlscyBzaWxlbnRseS4KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcmVtb3ZhbCBzdWNjZWVkcywgdGhlIERyaXZlck1hbmFnZXIgd2lsbCBub3QgaW4gZnV0dXJlIHVzZSB0aGlzCi0gICAgICogZHJpdmVyIHdoZW4gYXNrZWQgdG8gZ2V0IGEgQ29ubmVjdGlvbi4KKyAgICAgKiBJZiB0aGUgcmVtb3ZhbCBzdWNjZWVkcywgdGhlIHtAY29kZSBEcml2ZXJNYW5hZ2VyfSB3aWxsIG5vdCB1c2UgdGhpcworICAgICAqIGRyaXZlciBpbiB0aGUgZnV0dXJlIHdoZW4gYXNrZWQgdG8gZ2V0IGEge0Bjb2RlIENvbm5lY3Rpb259LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZHJpdmVyCisgICAgICogICAgICAgICAgICB0aGUgSkRCQyBkcml2ZXIgdG8gcmVtb3ZlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXhjZXB0aW9uIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGludGVyZmVyaW5nIHdpdGggYWNjZXNzaW5nIHRoZQorICAgICAqICAgICAgICAgICAgIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyRHJpdmVyKERyaXZlciBkcml2ZXIpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBpZiAoZHJpdmVyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotLy8gICAgICAgIENsYXNzTG9hZGVyIGNhbGxlckNsYXNzTG9hZGVyID0gVk0uY2FsbGVyQ2xhc3NMb2FkZXIoKTsgLy8/Pz9TUUwgVk0uY2FsbGVyQ2xhc3NMb2FkZXIgbm90IGltcGxlbWVudGVkIC0+IG51bGwKLS8vCi0vLyAgICAgICAgaWYgKCFEcml2ZXJNYW5hZ2VyLmlzQ2xhc3NGcm9tQ2xhc3NMb2FkZXIoZHJpdmVyLCBjYWxsZXJDbGFzc0xvYWRlcikpIHsgCi0vLyAgICAgICAgICAgIC8vIHNxbC4xPURyaXZlck1hbmFnZXI6IGNhbGxpbmcgY2xhc3Mgbm90IGF1dGhvcml6ZWQgdG8gZGVyZWdpc3RlciBKREJDIGRyaXZlcgotLy8gICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJzcWwuMSIpKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgIH0gLy8gZW5kIGlmCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBDbGFzc0xvYWRlciBjYWxsZXJDbGFzc0xvYWRlciA9IFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKKworICAgICAgICBpZiAoIURyaXZlck1hbmFnZXIuaXNDbGFzc0Zyb21DbGFzc0xvYWRlcihkcml2ZXIsIGNhbGxlckNsYXNzTG9hZGVyKSkgeworICAgICAgICAgICAgLy8gc3FsLjE9RHJpdmVyTWFuYWdlcjogY2FsbGluZyBjbGFzcyBub3QgYXV0aG9yaXplZCB0byBkZXJlZ2lzdGVyIEpEQkMgZHJpdmVyCisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJzcWwuMSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9IC8vIGVuZCBpZgogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoZURyaXZlclNldCkgewogICAgICAgICAgICAgdGhlRHJpdmVyU2V0LnJlbW92ZShkcml2ZXIpOwogICAgICAgICB9CkBAIC0xMzAsMTIgKzE0MiwxMyBAQAogICAgICAqIEF0dGVtcHRzIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIGRhdGFiYXNlIFVSTC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICBhIFVSTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSB0YXJnZXQgdG8gY29ubmVjdCB3aXRoCi0gICAgICogQHJldHVybiBhIENvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlIGlkZW50aWZpZWQgYnkgdGhlIFVSTC4gbnVsbCBpZiBubwotICAgICAqICAgICAgICAgY29ubmVjdGlvbiBjYW4gYmUgbWFkZS4KKyAgICAgKiAgICAgICAgICAgIGEgVVJMIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGFiYXNlIHRhcmdldCB0byBjb25uZWN0IHdpdGguCisgICAgICogQHJldHVybiBhIHtAY29kZSBDb25uZWN0aW9ufSB0byB0aGUgZGF0YWJhc2UgaWRlbnRpZmllZCBieSB0aGUgVVJMLgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIG5vIGNvbm5lY3Rpb24gY2FuIGJlIGVzdGFibGlzaGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIHRoZQotICAgICAqICAgICAgICAgICAgIGRhdGFiYXNlIGlkZW50aWZpZWQgYnkgdGhlIFVSTAorICAgICAqICAgICAgICAgICAgIGRhdGFiYXNlIGlkZW50aWZpZWQgYnkgdGhlIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihTdHJpbmcgdXJsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldENvbm5lY3Rpb24odXJsLCBuZXcgUHJvcGVydGllcygpKTsKQEAgLTE0NywxNyArMTYwLDE4IEBACiAgICAgICogQHBhcmFtIHVybAogICAgICAqICAgICAgICAgICAgYSBVUkwgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGF0YWJhc2UgdGFyZ2V0IHRvIGNvbm5lY3Qgd2l0aAogICAgICAqIEBwYXJhbSBpbmZvCi0gICAgICogICAgICAgICAgICBhIHNldCBvZiBQcm9wZXJ0aWVzIHRvIHVzZSBhcyBhcmd1bWVudHMgdG8gc2V0IHVwIHRoZQorICAgICAqICAgICAgICAgICAgYSBzZXQgb2YgcHJvcGVydGllcyB0byB1c2UgYXMgYXJndW1lbnRzIHRvIHNldCB1cCB0aGUKICAgICAgKiAgICAgICAgICAgIGNvbm5lY3Rpb24uIFByb3BlcnRpZXMgYXJlIGFyYml0cmFyeSBzdHJpbmcvdmFsdWUgcGFpcnMuCi0gICAgICogICAgICAgICAgICBOb3JtYWxseSwgYXQgbGVhc3QgdGhlIHByb3BlcnRpZXMgInVzZXIiIGFuZCAicGFzc3dvcmQiIHNob3VsZAotICAgICAqICAgICAgICAgICAgYmUgcGFzc2VkLCB3aXRoIGFwcHJvcHJpYXRlIHNldHRpbmdzIGZvciB0aGUgdXNlcmlkIGFuZCBpdHMKLSAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcGFzc3dvcmQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgZGF0YWJhc2UKLSAgICAgKiAgICAgICAgICAgIGNvbmNlcm5lZC4KLSAgICAgKiBAcmV0dXJuIGEgQ29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaWRlbnRpZmllZCBieSB0aGUgVVJMLiBudWxsIGlmIG5vCi0gICAgICogICAgICAgICBjb25uZWN0aW9uIGNhbiBiZSBtYWRlLgorICAgICAqICAgICAgICAgICAgTm9ybWFsbHksIGF0IGxlYXN0IHRoZSBwcm9wZXJ0aWVzIHtAY29kZSAidXNlciJ9IGFuZCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICJwYXNzd29yZCJ9IHNob3VsZCBiZSBwYXNzZWQsIHdpdGggYXBwcm9wcmlhdGUgc2V0dGluZ3MgZm9yCisgICAgICogICAgICAgICAgICB0aGUgdXNlciBJRCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgcGFzc3dvcmQgdG8gZ2V0IGFjY2VzcyB0bworICAgICAqICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBDb25uZWN0aW9ufSB0byB0aGUgZGF0YWJhc2UgaWRlbnRpZmllZCBieSB0aGUgVVJMLgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIG5vIGNvbm5lY3Rpb24gY2FuIGJlIGVzdGFibGlzaGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIHRoZQotICAgICAqICAgICAgICAgICAgIGRhdGFiYXNlIGlkZW50aWZpZWQgYnkgdGhlIFVSTAorICAgICAqICAgICAgICAgICAgIGRhdGFiYXNlIGlkZW50aWZpZWQgYnkgdGhlIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihTdHJpbmcgdXJsLCBQcm9wZXJ0aWVzIGluZm8pCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKQEAgLTE5MCwxNiArMjA0LDE3IEBACiAgICAgICogQXR0ZW1wdHMgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gZGF0YWJhc2UgVVJMLgogICAgICAqIAogICAgICAqIEBwYXJhbSB1cmwKLSAgICAgKiAgICAgICAgICAgIGEgVVJMIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGFiYXNlIHRhcmdldCB0byBjb25uZWN0IHdpdGgKKyAgICAgKiAgICAgICAgICAgIGEgVVJMIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGFiYXNlIHRhcmdldCB0byBjb25uZWN0IHdpdGguCiAgICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIGEgdXNlcmlkIHVzZWQgdG8gbG9naW4gdG8gdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBhIHVzZXIgSUQgdXNlZCB0byBsb2dpbiB0byB0aGUgZGF0YWJhc2UuCiAgICAgICogQHBhcmFtIHBhc3N3b3JkCi0gICAgICogICAgICAgICAgICBhIHBhc3N3b3JkIGZvciB0aGUgdXNlcmlkIHRvIGxvZ2luIHRvIHRoZSBkYXRhYmFzZQotICAgICAqIEByZXR1cm4gYSBDb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBpZGVudGlmaWVkIGJ5IHRoZSBVUkwuIG51bGwgaWYgbm8KLSAgICAgKiAgICAgICAgIGNvbm5lY3Rpb24gY2FuIGJlIG1hZGUuCisgICAgICogICAgICAgICAgICBhIHBhc3N3b3JkIGZvciB0aGUgdXNlciBJRCB0byBsb2dpbiB0byB0aGUgZGF0YWJhc2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBDb25uZWN0aW9ufSB0byB0aGUgZGF0YWJhc2UgaWRlbnRpZmllZCBieSB0aGUgVVJMLgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIG5vIGNvbm5lY3Rpb24gY2FuIGJlIGVzdGFibGlzaGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIHRoZQotICAgICAqICAgICAgICAgICAgIGRhdGFiYXNlIGlkZW50aWZpZWQgYnkgdGhlIFVSTAorICAgICAqICAgICAgICAgICAgIGRhdGFiYXNlIGlkZW50aWZpZWQgYnkgdGhlIFVSTC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihTdHJpbmcgdXJsLCBTdHJpbmcgdXNlciwKICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CkBAIC0yMTcsMTQgKzIzMiwxNiBAQAogICAgICAqIFRyaWVzIHRvIGZpbmQgYSBkcml2ZXIgdGhhdCBjYW4gaW50ZXJwcmV0IHRoZSBzdXBwbGllZCBVUkwuCiAgICAgICogCiAgICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgdGhlIFVSTCBvZiBhIGRhdGFiYXNlCi0gICAgICogQHJldHVybiBhIERyaXZlciB0aGF0IGNhbiB1bmRlcnN0YW5kIHRoZSBnaXZlbiBVUkwuIG51bGwgaWYgbm8gRHJpdmVyCi0gICAgICogICAgICAgICB1bmRlcnN0YW5kcyB0aGUgVVJMCisgICAgICogICAgICAgICAgICB0aGUgVVJMIG9mIGEgZGF0YWJhc2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBEcml2ZXJ9IHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgVVJMLiB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIG5vIHtAY29kZSBEcml2ZXJ9IHVuZGVyc3RhbmRzIHRoZSBVUkwKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFueSBraW5kIG9mIERhdGFiYXNlIEFjY2VzcyBwcm9ibGVtCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW55IGtpbmQgb2YgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRHJpdmVyIGdldERyaXZlcihTdHJpbmcgdXJsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLS8vICAgICAgICBDbGFzc0xvYWRlciBjYWxsZXJDbGFzc0xvYWRlciA9IFZNLmNhbGxlckNsYXNzTG9hZGVyKCk7IC8vPz8/U1FMIFZNLmNhbGxlckNsYXNzTG9hZGVyIG5vdCBpbXBsZW1lbnRlZCAtPiBudWxsCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICBDbGFzc0xvYWRlciBjYWxsZXJDbGFzc0xvYWRlciA9IFZNU3RhY2suZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyKCk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoZURyaXZlclNldCkgewogICAgICAgICAgICAgLyoKQEAgLTIzNiw5ICsyNTMsOCBAQAogICAgICAgICAgICAgd2hpbGUgKHRoZUl0ZXJhdG9yLmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgIERyaXZlciB0aGVEcml2ZXIgPSB0aGVJdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgaWYgKHRoZURyaXZlci5hY2NlcHRzVVJMKHVybCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgJiYgRHJpdmVyTWFuYWdlci5pc0NsYXNzRnJvbUNsYXNzTG9hZGVyKHRoZURyaXZlciwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJDbGFzc0xvYWRlcikpIHsgLy8/Pz9TUUwgVk0uY2FsbGVyQ2xhc3NMb2FkZXIgbm90IGltcGxlbWVudGVkIC0+IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICl7CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBEcml2ZXJNYW5hZ2VyLmlzQ2xhc3NGcm9tQ2xhc3NMb2FkZXIodGhlRHJpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJDbGFzc0xvYWRlcikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZURyaXZlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yNTEsMTMgKzI2NywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIGxvYWRlZCBKREJDIGRyaXZlcnMgdGhhdAotICAgICAqIHRoZSBjdXJyZW50IGNhbGxlciBjYW4gYWNjZXNzLgorICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIEVudW1lcmF0aW9ufSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgbG9hZGVkIEpEQkMKKyAgICAgKiBkcml2ZXJzIHRoYXQgdGhlIGN1cnJlbnQgY2FsbGVyIGNhbiBhY2Nlc3MuCiAgICAgICogCi0gICAgICogQHJldHVybiBBbiBFbnVtZXJhdGlvbiBjb250YWluaW5nIGFsbCB0aGUgY3VycmVudGx5IGxvYWRlZCBKREJDIERyaXZlcnMKKyAgICAgKiBAcmV0dXJuIEFuIHtAY29kZSBFbnVtZXJhdGlvbn0gY29udGFpbmluZyBhbGwgdGhlIGN1cnJlbnRseSBsb2FkZWQgSkRCQworICAgICAqICAgICAgICAge0Bjb2RlIERyaXZlcnN9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb248RHJpdmVyPiBnZXREcml2ZXJzKCkgewotLy8gICAgICAgIENsYXNzTG9hZGVyIGNhbGxlckNsYXNzTG9hZGVyID0gVk0uY2FsbGVyQ2xhc3NMb2FkZXIoKTsgLy8/Pz9TUUwgVk0uY2FsbGVyQ2xhc3NMb2FkZXIgbm90IGltcGxlbWVudGVkIC0+IG51bGwKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIENsYXNzTG9hZGVyIGNhbGxlckNsYXNzTG9hZGVyID0gVk1TdGFjay5nZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAvKgogICAgICAgICAgKiBTeW5jaHJvbml6ZSB0byBhdm9pZCBjbGFzaGVzIHdpdGggYWRkaXRpb25zIGFuZCByZW1vdmFscyBvZiBkcml2ZXJzCiAgICAgICAgICAqIGluIHRoZSBEcml2ZXJTZXQKQEAgLTI3MSwyOCArMjkxLDMyIEBACiAgICAgICAgICAgICBJdGVyYXRvcjxEcml2ZXI+IHRoZUl0ZXJhdG9yID0gdGhlRHJpdmVyU2V0Lml0ZXJhdG9yKCk7CiAgICAgICAgICAgICB3aGlsZSAodGhlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgRHJpdmVyIHRoZURyaXZlciA9IHRoZUl0ZXJhdG9yLm5leHQoKTsKLS8vICAgICAgICAgICAgICAgIGlmIChEcml2ZXJNYW5hZ2VyLmlzQ2xhc3NGcm9tQ2xhc3NMb2FkZXIodGhlRHJpdmVyLCAgLy8/Pz9TUUwgVk0uY2FsbGVyQ2xhc3NMb2FkZXIgbm90IGltcGxlbWVudGVkIC0+IG51bGwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyQ2xhc3NMb2FkZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKERyaXZlck1hbmFnZXIuaXNDbGFzc0Zyb21DbGFzc0xvYWRlcih0aGVEcml2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJDbGFzc0xvYWRlcikpIHsKICAgICAgICAgICAgICAgICAgICAgdGhlVmVjdG9yLmFkZCh0aGVEcml2ZXIpOwotLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0aGVWZWN0b3IuZWxlbWVudHMoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvZ2luIHRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIGEgZGF0YWJhc2UsIGluIHNlY29uZHMuCisgICAgICogUmV0dXJucyB0aGUgbG9naW4gdGltZW91dCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBkYXRhYmFzZSBpbiBzZWNvbmRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvZ2luIHRpbWVvdXQgaW4gc2Vjb25kcworICAgICAqIEByZXR1cm4gdGhlIGxvZ2luIHRpbWVvdXQgaW4gc2Vjb25kcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRMb2dpblRpbWVvdXQoKSB7CiAgICAgICAgIHJldHVybiBsb2dpblRpbWVvdXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgR2V0cyB0aGUgbG9nIFByaW50U3RyZWFtIHVzZWQgYnkgdGhlIERyaXZlck1hbmFnZXIgYW5kIGFsbAotICAgICAqICAgICAgICAgICAgIHRoZSBKREJDIERyaXZlcnMuCi0gICAgICogQHJldHVybiB0aGUgUHJpbnRTdHJlYW0gdXNlZCBmb3IgbG9nZ2luZyBhY3Rpdml0eQorICAgICAqIEdldHMgdGhlIGxvZyB7QGNvZGUgUHJpbnRTdHJlYW19IHVzZWQgYnkgdGhlIHtAY29kZSBEcml2ZXJNYW5hZ2VyfSBhbmQKKyAgICAgKiBhbGwgdGhlIEpEQkMgRHJpdmVycy4KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRMb2dXcml0ZXIoKX0gaW5zdGVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUHJpbnRTdHJlYW19IHVzZWQgZm9yIGxvZ2dpbmcgYWN0aXZpdGllcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgUHJpbnRTdHJlYW0gZ2V0TG9nU3RyZWFtKCkgewpAQCAtMzAyLDggKzMyNiw5IEBACiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIHRoZSBsb2cgd3JpdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQSBQcmludFdyaXRlciBvYmplY3QgdXNlZCBhcyB0aGUgbG9nIHdyaXRlci4gbnVsbCBpZiBubyBsb2cKLSAgICAgKiAgICAgICAgIHdyaXRlciBpcyBzZXQuCisgICAgICogQHJldHVybiBBIHtAY29kZSBQcmludFdyaXRlcn0gb2JqZWN0IHVzZWQgYXMgdGhlIGxvZyB3cml0ZXIuIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgbm8gbG9nIHdyaXRlciBpcyBzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQcmludFdyaXRlciBnZXRMb2dXcml0ZXIoKSB7CiAgICAgICAgIHJldHVybiB0aGVQcmludFdyaXRlcjsKQEAgLTMxMSwxMCArMzM2LDExIEBACiAKICAgICAvKioKICAgICAgKiBQcmludHMgYSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IEpEQkMgbG9nIHN0cmVhbS4gVGhpcyBpcyBlaXRoZXIgdGhlCi0gICAgICogUHJpbnRXcml0ZXIgb3IgKGRlcHJlY2F0ZWQpIHRoZSBQcmludFN0cmVhbSwgaWYgc2V0LgorICAgICAqIHtAY29kZSBQcmludFdyaXRlcn0gb3IgKGRlcHJlY2F0ZWQpIHRoZSB7QGNvZGUgUHJpbnRTdHJlYW19LCBpZiBzZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHByaW50IHRvIHRoZSBKREJDIGxvZyBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHByaW50IHRvIHRoZSBKREJDIGxvZyBzdHJlYW0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50bG4oU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgaWYgKHRoZVByaW50V3JpdGVyICE9IG51bGwpIHsKQEAgLTMzMiwxMyArMzU4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgZ2l2ZW4gSkRCQyBkcml2ZXIgd2l0aCB0aGUgRHJpdmVyTWFuYWdlci4KKyAgICAgKiBSZWdpc3RlcnMgYSBnaXZlbiBKREJDIGRyaXZlciB3aXRoIHRoZSB7QGNvZGUgRHJpdmVyTWFuYWdlcn0uCiAgICAgICogPHA+CiAgICAgICogQSBuZXdseSBsb2FkZWQgSkRCQyBkcml2ZXIgY2xhc3Mgc2hvdWxkIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZQotICAgICAqIERyaXZlck1hbmFnZXIgYnkgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiB7QGNvZGUgRHJpdmVyTWFuYWdlcn0gYnkgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGRyaXZlcgotICAgICAqICAgICAgICAgICAgdGhlIERyaXZlciB0byByZWdpc3RlciB3aXRoIHRoZSBEcml2ZXJNYW5hZ2VyCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIERyaXZlcn0gdG8gcmVnaXN0ZXIgd2l0aCB0aGUge0Bjb2RlIERyaXZlck1hbmFnZXJ9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBhY2Nlc3MgZXJyb3Igb2NjdXJzLgogICAgICAqLwpAQCAtMzUyLDEwICszNzksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvZ2luIHRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIGEgZGF0YWJhc2UsIGluIHNlY29uZHMuCisgICAgICogU2V0cyB0aGUgbG9naW4gdGltZW91dCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBkYXRhYmFzZSBpbiBzZWNvbmRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzZWNvbmRzCiAgICAgICogICAgICAgICAgICBzZWNvbmRzIHVudGlsIHRpbWVvdXQuIDAgaW5kaWNhdGVzIHdhaXQgZm9yZXZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9naW5UaW1lb3V0KGludCBzZWNvbmRzKSB7CiAgICAgICAgIGxvZ2luVGltZW91dCA9IHNlY29uZHM7CkBAIC0zNjMsMTIgKzM5MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFNldHMgdGhlIFByaW50IFN0cmVhbSB0byB1c2UgZm9yIGxvZ2dpbmcgZGF0YSBmcm9tIHRoZQotICAgICAqICAgICAgICAgICAgIERyaXZlck1hbmFnZXIgYW5kIHRoZSBKREJDIGRyaXZlcnMuCi0gICAgICogICAgICAgICAgICAgPHA+Ci0gICAgICogICAgICAgICAgICAgVXNlIHtAbGluayAjc2V0TG9nV3JpdGVyfSBpbnN0ZWFkLgorICAgICAqIFNldHMgdGhlIHByaW50IHN0cmVhbSB0byB1c2UgZm9yIGxvZ2dpbmcgZGF0YSBmcm9tIHRoZSB7QGNvZGUKKyAgICAgKiBEcml2ZXJNYW5hZ2VyfSBhbmQgdGhlIEpEQkMgZHJpdmVycy4KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRMb2dXcml0ZXJ9IGluc3RlYWQuCiAgICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgdGhlIFByaW50U3RyZWFtIHRvIHVzZSBmb3IgbG9nZ2luZy4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUHJpbnRTdHJlYW19IHRvIHVzZSBmb3IgbG9nZ2luZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2dTdHJlYW0oUHJpbnRTdHJlYW0gb3V0KSB7CkBAIC0zNzcsMTEgKzQwNiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFByaW50V3JpdGVyIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGFsbCBsb2FkZWQgZHJpdmVycywgYW5kIGFsc28KLSAgICAgKiB0aGUgRHJpdmVyTWFuYWdlci4KKyAgICAgKiBTZXRzIHRoZSB7QGNvZGUgUHJpbnRXcml0ZXJ9IHRoYXQgaXMgdXNlZCBieSBhbGwgbG9hZGVkIGRyaXZlcnMsIGFuZCBhbHNvCisgICAgICogdGhlIHtAY29kZSBEcml2ZXJNYW5hZ2VyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgUHJpbnRXcml0ZXIgdG8gYmUgdXNlZAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBQcmludFdyaXRlcn0gdG8gYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9nV3JpdGVyKFByaW50V3JpdGVyIG91dCkgewogICAgICAgICBjaGVja0xvZ1NlY3VyaXR5KCk7CkBAIC00MDEsMTQgKzQzMSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIGlmIGEgc3VwcGxpZWQgT2JqZWN0IGJlbG9uZ3MgdG8gdGhlIGdpdmVuIENsYXNzTG9hZGVyLgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3VwcGxpZWQgb2JqZWN0IHdhcyBsb2FkZWQgYnkgdGhlIGdpdmVuIHtAY29kZSBDbGFzc0xvYWRlcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZU9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjaGVjaworICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjaGVjay4KICAgICAgKiBAcGFyYW0gdGhlQ2xhc3NMb2FkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBDbGFzc0xvYWRlcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgT2JqZWN0IGRvZXMgYmVsb25nIHRvIHRoZSBDbGFzc0xvYWRlciwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDbGFzc0xvYWRlcn0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIE9iamVjdCBkb2VzIGJlbG9uZyB0byB0aGUge0Bjb2RlIENsYXNzTG9hZGVyfQorICAgICAqICAgICAgICAgLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbGFzc0Zyb21DbGFzc0xvYWRlcihPYmplY3QgdGhlT2JqZWN0LAogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGhlQ2xhc3NMb2FkZXIpIHsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RyaXZlclByb3BlcnR5SW5mby5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyUHJvcGVydHlJbmZvLmphdmEKaW5kZXggYmYyNjFkYi4uMzg3NWFiYiAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyUHJvcGVydHlJbmZvLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyUHJvcGVydHlJbmZvLmphdmEKQEAgLTE4LDQ5ICsxOCw2MyBAQAogcGFja2FnZSBqYXZhLnNxbDsKIAogLyoqCi0gKiBBIGNsYXNzIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgRHJpdmVyIFByb3BlcnRpZXMgZm9yIG1ha2luZyBhIENvbm5lY3Rpb24uCi0gKiBUaGlzIGNsYXNzIGlzIHJldHVybmVkIGZyb20gdGhlIDxjb2RlPkRyaXZlci5nZXREcml2ZXJQcm9wZXJ0aWVzPC9jb2RlPgotICogbWV0aG9kIGFuZCBpcyB1c2VmdWwgaW4gdXNpbmcgQ29ubmVjdGlvbnMgaW4gYW4gYWR2YW5jZWQgd2F5LgorICogQSBjbGFzcyBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBwcm9wZXJ0aWVzIG9mIGEgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAqIFRoaXMgY2xhc3MgaXMgcmV0dXJuZWQgYnkgdGhlCisgKiB7QGxpbmsgRHJpdmVyI2dldFByb3BlcnR5SW5mbyhTdHJpbmcsIGphdmEudXRpbC5Qcm9wZXJ0aWVzKX0gbWV0aG9kIGFuZAorICogYWxsb3dzIGZvciB0aGUgYWR2YW5jZWQgY29ubmVjdGlvbiBoYW5kbGluZy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEcml2ZXJQcm9wZXJ0eUluZm8gewogCiAgICAgLyoqCiAgICAgICogSWYgdGhlIHZhbHVlIG1lbWJlciBjYW4gYmUgY2hvc2VuIGZyb20gYSBzZXQgb2YgcG9zc2libGUgdmFsdWVzLCB0aGV5IGFyZQotICAgICAqIGNvbnRhaW5lZCBoZXJlLiBPdGhlcndpc2UgY2hvaWNlcyBpcyBudWxsLgorICAgICAqIGNvbnRhaW5lZCBoZXJlLiBPdGhlcndpc2UgY2hvaWNlcyBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGNob2ljZXM7CiAKICAgICAvKioKLSAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0eS4gTWF5IGJlIG51bGwuCisgICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CiAKICAgICAvKioKLSAgICAgKiBUcnVlIHdoZW4gdGhlIHZhbHVlIG1lbWJlciBtdXN0IGJlIHByb3ZpZGVkIGR1cmluZyBEcml2ZXIuY29ubmVjdC4gRmFsc2UKLSAgICAgKiBvdGhlcndpc2UuCisgICAgICoge0Bjb2RlIFRydWV9IHdoZW4gdGhlIHZhbHVlIG1lbWJlciBtdXN0IGJlIHByb3ZpZGVkIGR1cmluZyB7QGNvZGUKKyAgICAgKiBEcml2ZXIuY29ubmVjdH0uIHtAY29kZSBGYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVkOwogCiAgICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkuIFRoaXMgaXMgYmFzZWQgb24gdGhlCi0gICAgICogZGF0YSBnYXRoZXJlZCBieSB0aGUgZ2V0UHJvcGVydHlJbmZvIG1ldGhvZCwgdGhlIGdlbmVyYWwgSmF2YSBlbnZpcm9ubWVudAotICAgICAqIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBkcml2ZXIuCisgICAgICogVGhlIGN1cnJlbnQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkuIEl0IGlzIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBkYXRhIGdhdGhlcmVkIGJ5IHRoZSB7QGNvZGUgZ2V0UHJvcGVydHlJbmZvfSBtZXRob2QsIHRoZSBnZW5lcmFsIEphdmEKKyAgICAgKiBlbnZpcm9ubWVudCBhbmQgdGhlIGRyaXZlcidzIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRHJpdmVyUHJvcGVydHlJbmZvIGluc3RhbmNlIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIHZhbHVlLgotICAgICAqIE90aGVyIG1lbWJlcnMgdGFrZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIERyaXZlclByb3BlcnR5SW5mb30gaW5zdGFuY2Ugd2l0aCB0aGUgc3VwcGxpZWQgbmFtZSBhbmQKKyAgICAgKiB2YWx1ZS4gT3RoZXIgY2xhc3MgbWVtYmVycyB0YWtlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgcHJvcGVydHkgbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IG5hbWUuCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBUaGUgcHJvcGVydHkgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRHJpdmVyUHJvcGVydHlJbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1BhcmFtZXRlck1ldGFEYXRhLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9QYXJhbWV0ZXJNZXRhRGF0YS5qYXZhCmluZGV4IDdkNjQ0ZDMuLjk0OTAxYWUgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1BhcmFtZXRlck1ldGFEYXRhLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvUGFyYW1ldGVyTWV0YURhdGEuamF2YQpAQCAtMTksODMgKzE5LDEwNSBAQAogCiAvKioKICAqIEFuIGludGVyZmFjZSB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgYW5kIHByb3BlcnRpZXMgb2YKLSAqIHBhcmFtZXRlcnMgaW4gYSBQcmVwYXJlZFN0YXRlbWVudCBvYmplY3QuCisgKiBwYXJhbWV0ZXJzIGluIGEge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fS4KKyAqICAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFBhcmFtZXRlck1ldGFEYXRhIHsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgbW9kZSBpcyBJTi4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcGFyYW1ldGVyIG1vZGUgaXMge0Bjb2RlIElOfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJhbWV0ZXJNb2RlSW4gPSAxOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHBhcmFtZXRlciBtb2RlIGlzIElOT1VULgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgbW9kZSBpcyB7QGNvZGUgSU5PVVR9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcmFtZXRlck1vZGVJbk91dCA9IDI7CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcGFyYW1ldGVyIG1vZGUgaXMgT1VULgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgbW9kZSBpcyB7QGNvZGUgT1VUfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJhbWV0ZXJNb2RlT3V0ID0gNDsKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgbW9kZSBpcyBub3Qga25vd24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyYW1ldGVyTW9kZVVua25vd24gPSAwOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgYSBwYXJhbWV0ZXIgaXMgbm90IHBlcm1pdHRlZCB0byBiZSBOVUxMLgorICAgICAqIEluZGljYXRlcyB0aGF0IGEgcGFyYW1ldGVyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmUge0Bjb2RlIE5VTEx9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcmFtZXRlck5vTnVsbHMgPSAwOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgYSBwYXJhbWV0ZXIgaXMgcGVybWl0dGVkIHRvIGJlIE5VTEwuCisgICAgICogSW5kaWNhdGVzIHRoYXQgYSBwYXJhbWV0ZXIgaXMgcGVybWl0dGVkIHRvIGJlIHtAY29kZSBOVUxMfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJhbWV0ZXJOdWxsYWJsZSA9IDE7CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB3aGV0aGVyIGEgcGFyYW1ldGVyIGlzIGFsbG93ZWQgdG8gYmUgbnVsbCBvciBub3QgaXMgbm90Ci0gICAgICoga25vd24uCisgICAgICogSW5kaWNhdGVzIHRoYXQgd2hldGhlciBhIHBhcmFtZXRlciBpcyBhbGxvd2VkIHRvIGJlIHtAY29kZSBudWxsfSBvciBub3QKKyAgICAgKiBpcyBub3Qga25vd24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyYW1ldGVyTnVsbGFibGVVbmtub3duID0gMjsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHdoaWNoIHNob3VsZCBiZSBwYXNzZWQgYXMKLSAgICAgKiBhIHBhcmFtZXRlciB0byB0aGUgbWV0aG9kIDxjb2RlPlByZXBhcmVkU3RhdGVtZW50LnNldE9iamVjdDwvY29kZT4uCisgICAgICogYSBwYXJhbWV0ZXIgdG8gdGhlIG1ldGhvZCB7QGNvZGUgUHJlcGFyZWRTdGF0ZW1lbnQuc2V0T2JqZWN0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1JbmRleAogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBvZiB0aGUgcGFyYW1ldGVyLCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyCi0gICAgICogICAgICAgICAgICBoYXMgYW4gaW5kZXggb2YgMQotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUKLSAgICAgKiAgICAgICAgIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguIFRoaXMgY2xhc3MgbmFtZSBpcyB1c2VkIGZvcgotICAgICAqICAgICAgICAgY3VzdG9tIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICBoYXMgaW5kZXggMS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBpbmRleC4gVGhpcyBjbGFzcyBuYW1lIGlzIHVzZWQgZm9yIGN1c3RvbSBtYXBwaW5nCisgICAgICogICAgICAgICBiZXR3ZWVuIFNRTCB0eXBlcyBhbmQgSmF2YSBvYmplY3RzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyQ2xhc3NOYW1lKGludCBwYXJhbUluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIFByZXBhcmVkU3RhdGVtZW50IGZvciB3aGljaCB0aGlzCi0gICAgICogUGFyYW1ldGVyTWV0YURhdGEgY29udGFpbnMgaW5mb3JtYXRpb24uCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0gZm9yIHdoaWNoCisgICAgICogdGhpcyB7QGNvZGUgUGFyYW1ldGVyTWV0YURhdGF9IGNvbnRhaW5zIGluZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFzIGFuIGludAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbW9kZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4KKyAgICAgKiBHZXRzIHRoZSBtb2RlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyLiBDYW4gYmUgb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+UGFyYW1ldGVyTWV0YURhdGEucGFyYW1ldGVyTW9kZUluPC9saT4KKyAgICAgKiA8bGk+UGFyYW1ldGVyTWV0YURhdGEucGFyYW1ldGVyTW9kZU91dDwvbGk+CisgICAgICogPGxpPlBhcmFtZXRlck1ldGFEYXRhLnBhcmFtZXRlck1vZGVJbk91dDwvbGk+CisgICAgICogPGxpPlBhcmFtZXRlck1ldGFEYXRhLnBhcmFtZXRlck1vZGVVbmtub3duPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbUluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIG9mIHRoZSBwYXJhbWV0ZXIsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgICAgIGhhcyBhbiBpbmRleCBvZiAxCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycyBtb2RlLiBDYW4gYmU6IFBhcmFtZXRlck1ldGFEYXRhLnBhcmFtZXRlck1vZGVJbiwKLSAgICAgKiAgICAgICAgIFBhcmFtZXRlck1ldGFEYXRhLnBhcmFtZXRlck1vZGVPdXQsCi0gICAgICogICAgICAgICBQYXJhbWV0ZXJNZXRhRGF0YS5wYXJhbWV0ZXJNb2RlSW5PdXQgb3IKLSAgICAgKiAgICAgICAgIFBhcmFtZXRlck1ldGFEYXRhLnBhcmFtZXRlck1vZGVVbmtub3duLgorICAgICAqICAgICAgICAgICAgaGFzIGluZGV4IDEuCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyJ3MgbW9kZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlck1vZGUoaW50IHBhcmFtSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTEwNCwxMSArMTI2LDEyIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtSW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgb2YgdGhlIHBhcmFtZXRlciwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgaGFzIGFuIGluZGV4IG9mIDEKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgLSBhbiBTUUwgdHlwZSBhcyBkZWZpbmVkIGluCi0gICAgICogICAgICAgICBqYXZhLnNxbC5UeXBlcy4KKyAgICAgKiAgICAgICAgICAgIGhhcyBpbmRleCAxLgorICAgICAqIEByZXR1cm4gdGhlIFNRTCB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgYXMgZGVmaW5lZCBpbiB7QGNvZGUKKyAgICAgKiAgICAgICAgIGphdmEuc3FsLlR5cGVzfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlclR5cGUoaW50IHBhcmFtSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTExNywxMiArMTQwLDEzIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtSW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgb2YgdGhlIHBhcmFtZXRlciwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgaGFzIGFuIGluZGV4IG9mIDEKKyAgICAgKiAgICAgICAgICAgIGhhcyBpbmRleCAxLgogICAgICAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZSBmb3IgdGhlIHBhcmFtZXRlciBhcyB1c2VkIGJ5IHRoZSBkYXRhYmFzZS4gQQotICAgICAqICAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgaXMgcmV0dXJuZWQgaWYgdGhlIHBhcmFtZXRlciBpcyBhIFVzZXIKLSAgICAgKiAgICAgICAgIERlZmluZWQgVHlwZS4KKyAgICAgKiAgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGlzIHJldHVybmVkIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSA8aT5Vc2VyCisgICAgICogICAgICAgICBEZWZpbmVkIFR5cGU8L2k+IChVRFQpLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyVHlwZU5hbWUoaW50IHBhcmFtSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTEzMSwxMSArMTU1LDEyIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtSW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgb2YgdGhlIHBhcmFtZXRlciwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgaGFzIGFuIGluZGV4IG9mIDEKKyAgICAgKiAgICAgICAgICAgIGhhcyBpbmRleCAxLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyAoInRoZSBwcmVjaXNpb24iKSBmb3IgdGhlIHBhcmFtZXRlci4KLSAgICAgKiAgICAgICAgIDAgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYSBudW1lcmljIHR5cGUuCisgICAgICogICAgICAgICB7QGNvZGUgMH0gaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYSBudW1lcmljIHR5cGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQcmVjaXNpb24oaW50IHBhcmFtSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTE0NSwyNiArMTcwLDMxIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtSW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgb2YgdGhlIHBhcmFtZXRlciwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgaGFzIGFuIGluZGV4IG9mIDEKKyAgICAgKiAgICAgICAgICAgIGhhcyBpbmRleCAxLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgKCJ0aGUgc2NhbGUiKSBmb3IKLSAgICAgKiAgICAgICAgIHRoZSBwYXJhbWV0ZXIuIDAgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYSBudW1lcmljIHR5cGUuCisgICAgICogICAgICAgICB0aGUgcGFyYW1ldGVyLiB7QGNvZGUgMH0gaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYSBudW1lcmljIHR5cGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRTY2FsZShpbnQgcGFyYW1JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBudWxsIHZhbHVlcyBhcmUgYWxsb3dlZCBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIuCisgICAgICogR2V0cyB3aGV0aGVyIHtAY29kZSBudWxsfSB2YWx1ZXMgYXJlIGFsbG93ZWQgZm9yIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyLgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT5QYXJhbWV0ZXJNZXRhRGF0YS5wYXJhbWV0ZXJOb051bGxzPC9saT4KKyAgICAgKiA8bGk+UGFyYW1ldGVyTWV0YURhdGEucGFyYW1ldGVyTnVsbGFibGU8L2xpPgorICAgICAqIDxsaT5QYXJhbWV0ZXJNZXRhRGF0YS5wYXJhbWV0ZXJOdWxsYWJsZVVua25vd248L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtSW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgb2YgdGhlIHBhcmFtZXRlciwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgaGFzIGFuIGluZGV4IG9mIDEKLSAgICAgKiBAcmV0dXJuIGluZGljYXRvciBvZiBudWxsYWJpbGl0eSwgY2FuIGJlOgotICAgICAqICAgICAgICAgUGFyYW1ldGVyTWV0YURhdGEucGFyYW1ldGVyTm9OdWxscywKLSAgICAgKiAgICAgICAgIFBhcmFtZXRlck1ldGFEYXRhLnBhcmFtZXRlck51bGxhYmxlLCBvcgotICAgICAqICAgICAgICAgUGFyYW1ldGVyTWV0YURhdGEucGFyYW1ldGVyTnVsbGFibGVVbmtub3duCisgICAgICogICAgICAgICAgICBoYXMgaW5kZXggMS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQgY29kZSBpbmRpY2F0aW5nIHRoZSBudWxsYWJpbGl0eSBvZiB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBpcyBlbmNvdW50ZXJlZAorICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBpc051bGxhYmxlKGludCBwYXJhbUluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xNzMsMTEgKzIwMywxMiBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbUluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIG9mIHRoZSBwYXJhbWV0ZXIsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgICAgIGhhcyBhbiBpbmRleCBvZiAxCi0gICAgICogQHJldHVybiB0cnVlIGlmIHZhbHVlcyBjYW4gYmUgc2lnbmVkIG51bWJlcnMgZm9yIHRoaXMgcGFyYW1ldGVyLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgICAgaGFzIGluZGV4IDEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdmFsdWVzIGNhbiBiZSBzaWduZWQgbnVtYmVycyBmb3IgdGhpcyBwYXJhbWV0ZXIsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1NpZ25lZChpbnQgcGFyYW1JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1ByZXBhcmVkU3RhdGVtZW50LmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9QcmVwYXJlZFN0YXRlbWVudC5qYXZhCmluZGV4IDU5NDEyMDAuLmFiODE4NzEgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1ByZXBhcmVkU3RhdGVtZW50LmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvUHJlcGFyZWRTdGF0ZW1lbnQuamF2YQpAQCAtMjQsMjIgKzI0LDI3IEBACiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIFByZWNvbXBpbGVkIFNRTCBTdGF0ZW1lbnQuCisgKiBBbiBpbnRlcmZhY2UgZm9yIGEgcHJlY29tcGlsZWQgU1FMIFN0YXRlbWVudC4KICAqIDxwPgotICogQW4gU1FMIFN0YXRlbWVudCBpcyBwdXQgaW50byBhIFByZXBhcmVkU3RhdGVtZW50IGFuZCBpcyBwcmVjb21waWxlZCBzbyB0aGF0Ci0gKiBpdCBjYW4gYmUgZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXMgZWZmaWNpZW50bHkuCisgKiBBbiBTUUwgU3RhdGVtZW50IGlzIHB1dCBpbnRvIGEge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fSBhbmQgaXMgcHJlY29tcGlsZWQKKyAqIHNvIHRoYXQgaXQgY2FuIGJlIGV4ZWN1dGVkIGVmZmljaWVudGx5IG11bHRpcGxlIHRpbWVzLgorICogPC9wPgogICogPHA+Ci0gKiBTZXR0ZXIgbWV0aG9kcyBhcmUgc3VwcGxpZWQgaW4gdGhlIFByZXBhcmVkU3RhdGVtZW50IGludGVyZmFjZSBmb3IgdGhlCi0gKiBzZXR0aW5nIG9mIElOIHBhcmFtZXRlcnMgZm9yIHRoZSBTdGF0ZW1lbnQuIFRoZSBzZXR0ZXIgbWV0aG9kIHVzZWQgZm9yIGVhY2gKLSAqIElOIHBhcmFtZXRlciBtdXN0IG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBJTiBwYXJhbWV0ZXIgYmVpbmcgc2V0LgorICogU2V0dGVyIG1ldGhvZHMgYXJlIHN1cHBsaWVkIGluIHRoZSB7QGNvZGUgUHJlcGFyZWRTdGF0ZW1lbnR9IGludGVyZmFjZSBmb3IKKyAqIHRoZSBzZXR0aW5nIG9mIHtAY29kZSBJTn0gcGFyYW1ldGVycyBmb3IgdGhlIHN0YXRlbWVudC4gVGhlIHNldHRlciBtZXRob2QKKyAqIHVzZWQgZm9yIGVhY2gge0Bjb2RlIElOfSBwYXJhbWV0ZXIgbXVzdCBtYXRjaCB0aGUgcGFyYW1ldGVyJ3MgdHlwZS4KKyAqIDwvcD4KKyAqICAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFByZXBhcmVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKIAogICAgIC8qKgotICAgICAqIEFkZCBhIHNldCBvZiBwYXJhbWV0ZXJzIHRvIHRoZSBQcmVwYXJlZFN0YXRlbWVudCdzIGNvbW1hbmQgYmF0Y2guCisgICAgICogQWRkIGEgc2V0IG9mIHBhcmFtZXRlcnMgdG8gdGhlIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0ncyBjb21tYW5kIGJhdGNoLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEJhdGNoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtNDcsMzY1ICs1Miw0MzAgQEAKICAgICAgKiBDbGVhciB0aGUgY3VycmVudCBwYXJhbWV0ZXIgdmFsdWVzLgogICAgICAqIDxwPgogICAgICAqIFR5cGljYWxseSwgcGFyYW1ldGVyIHZhbHVlcyBhcmUgcmV0YWluZWQgZm9yIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlCi0gICAgICogU3RhdGVtZW50LiBTZXR0aW5nIGEgcGFyYW1ldGVyIHZhbHVlIHJlcGxhY2VzIHRoZSBwcmV2aW91cyB2YWx1ZS4gVGhpcworICAgICAqIHtAY29kZSBTdGF0ZW1lbnR9LiBTZXR0aW5nIGEgcGFyYW1ldGVyIHZhbHVlIHJlcGxhY2VzIHRoZSBwcmV2aW91cyB2YWx1ZS4gVGhpcwogICAgICAqIG1ldGhvZCBjbGVhcnMgdGhlIHZhbHVlcyBmb3IgYWxsIHBhcmFtZXRlcnMsIHJlbGVhc2luZyBhbGwgcmVzb3VyY2VzIHVzZWQKICAgICAgKiBieSB0aG9zZSBwYXJhbWV0ZXJzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhclBhcmFtZXRlcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIFNRTCBzdGF0ZW1lbnQgaW4gdGhpcyBQcmVwYXJlZFN0YXRlbWVudC4KKyAgICAgKiBFeGVjdXRlcyB0aGUgU1FMIHN0YXRlbWVudCBpbiB0aGlzIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0uCiAgICAgICogPHA+Ci0gICAgICogQSBQcmVwYXJlZFN0YXRlbWVudCBtYXkgcmV0dXJuIG11bHRpcGxlIHJlc3VsdHMuIFRoZSBleGVjdXRlIG1ldGhvZAotICAgICAqIHJldHVybnMgYSBmbGFnIGluZGljYXRpbmcgdGhlIGtpbmQgb2YgcmVzdWx0IHByb2R1Y2VkIGJ5Ci0gICAgICogUHJlcGFyZWRTdGF0ZW1lbnQuIFRoZSBtZXRob2RzIDxjb2RlPgotICAgICAqIGdldFJlc3VsdFNldDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5nZXRVcGRhdGVDb3VudDwvY29kZT4gYXJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGZpcnN0IHJlc3VsdCwKLSAgICAgKiB3aGlsZSA8Y29kZT5nZXRNb3JlUmVzdWx0czwvY29kZT4gbXVzdCBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBzZWNvbmQKLSAgICAgKiBhbmQgc3Vic2VxdWVudCByZXN1bHRzLgorICAgICAqIEEge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fSBtYXkgcmV0dXJuIG11bHRpcGxlIHJlc3VsdHMuIFRoZSBleGVjdXRlCisgICAgICogbWV0aG9kIGV4ZWN1dGVzIHRoZSB7QGNvZGUgUHJlcGFyZWRTdGF0ZW1lbnR9IGFuZCByZXR1cm5zIGEgZmxhZyAKKyAgICAgKiBpbmRpY2F0aW5nIHRoZSBraW5kIG9mIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgYWN0aW9uLiBUaGUgbWV0aG9kcyAKKyAgICAgKiB7QGNvZGUgZ2V0UmVzdWx0U2V0fSBvciB7QGNvZGUgZ2V0VXBkYXRlQ291bnR9IGFyZSB1c2VkIHRvIHJldHJpZXZlIAorICAgICAqIHRoZSBmaXJzdCByZXN1bHQsIGFuZCB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHJlc3VsdHMgYXJlIAorICAgICAqIHJldHJpZXZlZCB3aXRoIHtAY29kZSBnZXRNb3JlUmVzdWx0c30uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb24gaXMgYSBSZXN1bHRTZXQsIGZhbHNlIGlmCi0gICAgICogICAgICAgICB0aGVyZSBpcyBubyByZXN1bHQgb3IgaWYgdGhlIHJlc3VsdCBpcyBhbiB1cGRhdGUgY291bnQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uIGlzIGEge0Bjb2RlCisgICAgICogICAgICAgICBSZXN1bHRTZXR9LCB7QGNvZGUgZmFsc2V9IGlmIHRoZXJlIGlzIG5vIHJlc3VsdCBvciBpZiB0aGUgcmVzdWx0CisgICAgICogICAgICAgICBpcyBhbiB1cGRhdGUgY291bnQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBTUUwgcXVlcnkgaW4gdGhlIFByZXBhcmVkU3RhdGVtZW50IGFuZCByZXR1cm4gdGhlIFJlc3VsdFNldAotICAgICAqIGdlbmVyYXRlZCBieSB0aGUgcXVlcnkuCisgICAgICogRXhlY3V0ZXMgdGhlIFNRTCBxdWVyeSBpbiB0aGUge0Bjb2RlIFByZXBhcmVkU3RhdGVtZW50fSBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiB7QGNvZGUgUmVzdWx0U2V0fSBnZW5lcmF0ZWQgYnkgdGhlIHF1ZXJ5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFJlc3VsdFNldCBnZW5lcmF0ZWQgYnkgdGhlIHF1ZXJ5IC0gbmV2ZXIgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSBnZW5lcmF0ZWQgYnkgdGhlIHF1ZXJ5LCBuZXZlciB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMgb3IgaWYgdGhlIFNRTCBzdGF0ZW1lbnQgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICBwcm9kdWNlIGEgUmVzdWx0U2V0LgorICAgICAqICAgICAgICAgICAgIHByb2R1Y2UgYSB7QGNvZGUgUmVzdWx0U2V0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBJbnZva2UgdGhlIFNRTCBjb21tYW5kIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByZXBhcmVkIFN0YXRlbWVudC4gVGhpcyBtdXN0Ci0gICAgICogYmUgSU5TRVJULCBVUERBVEUsIERFTEVURSwgb3IgYSBjb21tYW5kIHRoYXQgcmV0dXJucyBub3RoaW5nLgorICAgICAqIEludm9rZXMgdGhlIFNRTCBjb21tYW5kIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHByZXBhcmVkIHN0YXRlbWVudC4gVGhpcworICAgICAqIG11c3QgYmUge0Bjb2RlIElOU0VSVH0sIHtAY29kZSBVUERBVEV9LCB7QGNvZGUgREVMRVRFfSwgb3IgYSBjb21tYW5kIHRoYXQKKyAgICAgKiByZXR1cm5zIG5vdGhpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY291bnQgb2Ygcm93cyBmb3IgSU5TRVJULCBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudHMsIDAgZm9yCi0gICAgICogICAgICAgICBzdGF0ZW1lbnRzIHRoYXQgcmV0dXJuIG5vdGhpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgcm93cyBmb3Ige0Bjb2RlIElOU0VSVH0sIHtAY29kZSBVUERBVEV9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgREVMRVRFfSBzdGF0ZW1lbnRzLCB7QGNvZGUgMH0gZm9yIHN0YXRlbWVudHMgdGhhdCByZXR1cm4gbm90aGluZy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucyBvciBpZiB0aGUgU1FMIHN0YXRlbWVudCByZXR1cm5zIGEKLSAgICAgKiAgICAgICAgICAgICBSZXN1bHRTZXQuCisgICAgICogICAgICAgICAgICAge0Bjb2RlIFJlc3VsdFNldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBSZXN1bHRTZXRNZXRhRGF0YSBjb250YWluaW5nIGRhdGEgZnJvbSB0aGUgUmVzdWx0U2V0IHRoYXQgaXMKLSAgICAgKiBwcm9kdWNlZCB3aGVuIHRoZSBQcmVwYXJlZFN0YXRlbWVudCBpcyBpbnZva2VkLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgUmVzdWx0U2V0TWV0YURhdGF9IGRlc2NyaWJpbmcgdGhlIHtAY29kZQorICAgICAqIFJlc3VsdFNldH0gdGhhdCB3b3VsZCBiZSBwcm9kdWNlZCBieSBleGVjdXRpb24gb2YgdGhlIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0uCiAgICAgICogPHA+Ci0gICAgICogSXQgaXMgcG9zc2libGUgdG8ga25vdyB0aGUgTWV0YWRhdGEgZm9yIHRoZSBSZXN1bHRTZXQgd2l0aG91dCBleGVjdXRpbmcKLSAgICAgKiB0aGUgUHJlcGFyZWRTdGF0ZW1lbnQsIGJlY2F1c2UgdGhlIFByZXBhcmVkU3RhdGVtZW50IGlzIHByZWNvbXBpbGVkLiBBcyBhCi0gICAgICogcmVzdWx0IHRoZSBNZXRhZGF0YSBjYW4gYmUgcXVlcmllZCBhaGVhZCBvZiB0aW1lIHdpdGhvdXQgYWN0dWFsbHkKLSAgICAgKiBleGVjdXRpbmcgdGhlIHN0YXRlbWVudC4KKyAgICAgKiBJdCBpcyBwb3NzaWJsZSB0byBrbm93IHRoZSBtZXRhZGF0YSBmb3IgdGhlIHtAY29kZSBSZXN1bHRTZXR9IHdpdGhvdXQKKyAgICAgKiBleGVjdXRpbmcgdGhlIHtAY29kZSBQcmVwYXJlZFN0YXRlbWVudH0sIGJlY2F1c2UgdGhlIHtAY29kZQorICAgICAqIFByZXBhcmVkU3RhdGVtZW50fSBpcyBwcmVjb21waWxlZC4gQXMgYSByZXN1bHQgdGhlIG1ldGFkYXRhIGNhbiBiZQorICAgICAqIHF1ZXJpZWQgYWhlYWQgb2YgdGltZSB3aXRob3V0IGFjdHVhbGx5IGV4ZWN1dGluZyB0aGUgc3RhdGVtZW50LgorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0TWV0YURhdGEgb2JqZWN0IHdpdGggdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2x1bW5zCi0gICAgICogICAgICAgICBvZiB0aGUgUmVzdWx0U2V0LCBpZiB0aGUgZHJpdmVyIGNhbiByZXR1cm4gYSBSZXN1bHRTZXRNZXRhRGF0YS4KLSAgICAgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0TWV0YURhdGF9IG9iamVjdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgKiAgICAgICAgIGNvbHVtbnMgb2YgdGhlIHtAY29kZSBSZXN1bHRTZXR9LCBpZiB0aGUgZHJpdmVyIGNhbiByZXR1cm4gYQorICAgICAqICAgICAgICAge0Bjb2RlIFJlc3VsdFNldE1ldGFEYXRhfS4ge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXRNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBQcmVwYXJlZFN0YXRlbWVudC4KKyAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB7QGNvZGUgUHJlcGFyZWRTdGF0ZW1lbnR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBQYXJhbWV0ZXJNZXRhRGF0YSBvYmplY3Qgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICAgICogICAgICAgICBudW1iZXIsIHR5cGUgYW5kIHByb3BlcnRpZXMgb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcwotICAgICAqICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQuCisgICAgICogQHJldHVybiBhIHtAY29kZSBQYXJhbWV0ZXJNZXRhRGF0YX0gb2JqZWN0IHdoaWNoIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0CisgICAgICogICAgICAgICB0aGUgbnVtYmVyLCB0eXBlLCBhbmQgcHJvcGVydGllcyBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJNZXRhRGF0YSBnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIHN1cHBsaWVkIEFycmF5IG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIHN1cHBsaWVkIHtAY29kZSBBcnJheX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZUFycmF5Ci0gICAgICogICAgICAgICAgICBhIGphdmEuc3FsLkFycmF5IGhvbGluZyB0aGUgZGF0YSB0byBzZXQuCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBqYXZhLnNxbC5BcnJheX0gZ2l2aW5nIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBhdCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlckluZGV4fS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2VlIEFycmF5CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QXJyYXkoaW50IHBhcmFtZXRlckluZGV4LCBBcnJheSB0aGVBcnJheSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnRlbnQgb2YgYSBzdXBwbGllZAotICAgICAqIElucHV0U3RyZWFtLCB3aGljaCBoYXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgorICAgICAqIHtAY29kZSBJbnB1dFN0cmVhbX0sIHdoaWNoIGhhcyBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBhIGdvb2QgbWV0aG9kIGZvciBzZXR0aW5nIGFuIFNRTCBMT05WQVJDSEFSIHBhcmFtZXRlciB3aGVyZSB0aGUKLSAgICAgKiBsZW5ndGggb2YgdGhlIGRhdGEgaXMgbGFyZ2UuIERhdGEgaXMgcmVhZCBmcm9tIHRoZSBJbnB1dFN0cmVhbSB1bnRpbAotICAgICAqIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgaXMgY29waWVkLgorICAgICAqIFRoaXMgaXMgYSBnb29kIG1ldGhvZCBmb3Igc2V0dGluZyBhbiBTUUwge0Bjb2RlIExPTlZBUkNIQVJ9IHBhcmFtZXRlcgorICAgICAqIHdoZXJlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaXMgbGFyZ2UuIERhdGEgaXMgcmVhZCBmcm9tIHRoZSB7QGNvZGUKKyAgICAgKiBJbnB1dFN0cmVhbX0gdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCBvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAqIGJ5dGVzIGlzIGNvcGllZC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZUlucHV0U3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgQVNDSUkgSW5wdXRTdHJlYW0gY2FycnlpbmcgdGhlIGRhdGEgdG8gdXBkYXRlIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgQVNDSUkge0Bjb2RlIElucHV0U3RyZWFtfSBjYXJyeWluZyB0aGUgZGF0YSB0byB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBhdCB7QGNvZGUgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBJbnB1dFN0cmVhbSB0byBjb3B5IHRvIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIGNvcHkgdG8gdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oaW50IHBhcmFtZXRlckluZGV4LCBJbnB1dFN0cmVhbSB0aGVJbnB1dFN0cmVhbSwKICAgICAgICAgICAgIGludCBsZW5ndGgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZAotICAgICAqIGphdmEubWF0aC5CaWdEZWNpbWFsIHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZQorICAgICAqIGphdmEubWF0aC5CaWdEZWNpbWFsfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlQmlnRGVjaW1hbAotICAgICAqICAgICAgICAgICAgdGhlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHZhbHVlIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQge0Bjb2RlIHBhcmFtZXRlckluZGV4fSBpcworICAgICAqICAgICAgICAgICAgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzZWUgamF2YS5tYXRoLkJpZ0RlY2ltYWwKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsKGludCBwYXJhbWV0ZXJJbmRleCwgQmlnRGVjaW1hbCB0aGVCaWdEZWNpbWFsKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0aGUgY29udGVudCBvZiBhIHN1cHBsaWVkCi0gICAgICogYmluYXJ5IElucHV0U3RyZWFtLCB3aGljaCBoYXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgorICAgICAqIGJpbmFyeSB7QGNvZGUgSW5wdXRTdHJlYW19LCB3aGljaCBoYXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgogICAgICAqIDxwPgogICAgICAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgbmVlZHMgdG8gYmUgc2V0IGludG8gYQotICAgICAqIExPTkdWQVJCSU5BUlkgcGFyYW1ldGVyLgorICAgICAqIHtAY29kZSBMT05HVkFSQklOQVJZfSBwYXJhbWV0ZXIuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVJbnB1dFN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGJpbmFyeSBJbnB1dFN0cmVhbSBjYXJyeWluZyB0aGUgZGF0YSB0byB1cGRhdGUgdGhlCi0gICAgICogICAgICAgICAgICBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaW5hcnkge0Bjb2RlIElucHV0U3RyZWFtfSBjYXJyeWluZyB0aGUgZGF0YSB0byB1cGRhdGUgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgSW5wdXRTdHJlYW0gdG8gY29weSB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUge0Bjb2RlIElucHV0U3RyZWFtfSB0byBjb3B5IHRvIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJpbmFyeVN0cmVhbShpbnQgcGFyYW1ldGVySW5kZXgsIElucHV0U3RyZWFtIHRoZUlucHV0U3RyZWFtLAogICAgICAgICAgICAgaW50IGxlbmd0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gQmxvYiBvYmplY3QuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiB7QGNvZGUgQmxvYn0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVCbG9iCi0gICAgICogICAgICAgICAgICBhIGphdmEuc3FsLkJsb2IgaG9sZGluZyB0aGUgZGF0YSB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBqYXZhLnNxbC5CbG9ifSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0IHtAY29kZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKiBAc2VlIEJsb2IKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCbG9iKGludCBwYXJhbWV0ZXJJbmRleCwgQmxvYiB0aGVCbG9iKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUgYm9vbGVhbn0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlQm9vbGVhbgotICAgICAqICAgICAgICAgICAgdGhlIGJvb2xlYW4gdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQge0Bjb2RlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oaW50IHBhcmFtZXRlckluZGV4LCBib29sZWFuIHRoZUJvb2xlYW4pCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgYnl0ZSB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUgYnl0ZX0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0IHtAY29kZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCeXRlKGludCBwYXJhbWV0ZXJJbmRleCwgYnl0ZSB0aGVCeXRlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgYXJyYXkgb2YgYnl0ZXMuIFRoZQotICAgICAqIGFycmF5IGlzIG1hcHBlZCB0byBhIFZBUkJJTkFSWSBvciBMT05HVkFSQklOQVJZIGluIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBhcnJheSBpcyBtYXBwZWQgdG8gYSB7QGNvZGUgVkFSQklOQVJZfSBvciB7QGNvZGUgTE9OR1ZBUkJJTkFSWX0gaW4gdGhlCisgICAgICogZGF0YWJhc2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZUJ5dGVzCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBieXRlcyB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0IHtAY29kZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCeXRlcyhpbnQgcGFyYW1ldGVySW5kZXgsIGJ5dGVbXSB0aGVCeXRlcykKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIGNoYXJhY3RlciBjb250ZW50IG9mIGEKLSAgICAgKiBSZWFkZXIgb2JqZWN0LCB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIG9mIGNoYXJhY3RlciBkYXRhLgorICAgICAqIHtAY29kZSBSZWFkZXJ9IG9iamVjdCwgd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aCBvZiBjaGFyYWN0ZXIgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBEYXRhIGlzIHJlYWQgZnJvbSB0aGUge0Bjb2RlCisgICAgICogUmVhZGVyfSB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkIG9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICogY2hhcmFjdGVycyBhcmUgY29waWVkLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwogICAgICAqICAgICAgICAgICAgaW5kZXggMQogICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLlJlYWRlciBlbmNvbXBhc3NpbmcgdGhlIGNoYXJhY3RlciBkYXRhCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGphdmEuaW8uUmVhZGVyfSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgZGF0YS4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgYW1vdW50IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyU3RyZWFtKGludCBwYXJhbWV0ZXJJbmRleCwgUmVhZGVyIHJlYWRlciwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIENsb2Igb2JqZWN0LgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4ge0Bjb2RlIENsb2J9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlQ2xvYgotICAgICAqICAgICAgICAgICAgYSBqYXZhLnNxbC5DbG9iIGhvbGRpbmcgdGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIGphdmEuc3FsLkNsb2J9IGhvbGRpbmcgdGhlIGRhdGEgdG8gd2hpY2ggdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgYXQge0Bjb2RlIHBhcmFtZXRlckluZGV4fSBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2xvYihpbnQgcGFyYW1ldGVySW5kZXgsIENsb2IgdGhlQ2xvYikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIGphdmEuc3FsLkRhdGUKLSAgICAgKiB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5EYXRlfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlRGF0ZQotICAgICAqICAgICAgICAgICAgYSBqYXZhLnNxbC5EYXRlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBqYXZhLnNxbC5EYXRlfSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0IHtAY29kZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREYXRlKGludCBwYXJhbWV0ZXJJbmRleCwgRGF0ZSB0aGVEYXRlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgamF2YS5zcWwuRGF0ZQotICAgICAqIHZhbHVlLCB1c2luZyBhIHN1cHBsaWVkIENhbGVuZGFyIHRvIG1hcCB0aGUgRGF0ZS4gVGhlIENhbGVuZGFyIGFsbG93cyB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiB0byBjb250cm9sIHRoZSB0aW1lem9uZSB1c2VkIHRvIGNvbXB1dGUgdGhlIFNRTCBEQVRFIGluIHRoZQotICAgICAqIGRhdGFiYXNlIC0gd2l0aG91dCB0aGUgc3VwcGxpZWQgQ2FsZW5kYXIsIHRoZSBkcml2ZXIgdXNlcyB0aGUgZGVmYXVsdAotICAgICAqIHRpbWV6b25lIG9mIHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5EYXRlfSB2YWx1ZSwgdXNpbmcgYSBzdXBwbGllZCB7QGNvZGUgQ2FsZW5kYXJ9IHRvIG1hcCB0aGUgRGF0ZS4KKyAgICAgKiBUaGUge0Bjb2RlIENhbGVuZGFyfSBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGNvbnRyb2wgdGhlIHRpbWV6b25lIHVzZWQKKyAgICAgKiB0byBjb21wdXRlIHRoZSBTUUwge0Bjb2RlIERBVEV9IGluIHRoZSBkYXRhYmFzZSAtIHdpdGhvdXQgdGhlIHN1cHBsaWVkCisgICAgICoge0Bjb2RlIENhbGVuZGFyfSwgdGhlIGRyaXZlciB1c2VzIHRoZSBkZWZhdWx0IHRpbWV6b25lIG9mIHRoZSBKYXZhCisgICAgICogdmlydHVhbCBtYWNoaW5lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVEYXRlCi0gICAgICogICAgICAgICAgICBhIGphdmEuc3FsLkRhdGUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIGphdmEuc3FsLkRhdGV9IHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQge0Bjb2RlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEgQ2FsZW5kYXIgdG8gdXNlIHRvIGNvbnN0cnVjdCB0aGUgU1FMIERBVEUgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIENhbGVuZGFyfSB0byB1c2UgdG8gY29uc3RydWN0IHRoZSBTUUwge0Bjb2RlIERBVEV9CisgICAgICogICAgICAgICAgICB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2VlIERhdGUKKyAgICAgKiBAc2VlIGphdmEudXRpbC5DYWxlbmRhcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGUoaW50IHBhcmFtZXRlckluZGV4LCBEYXRlIHRoZURhdGUsIENhbGVuZGFyIGNhbCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBkb3VibGUgdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlIGRvdWJsZX0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlRG91YmxlCi0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGRvdWJsZX0gdmFsdWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBhdCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlckluZGV4fSBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKGludCBwYXJhbWV0ZXJJbmRleCwgZG91YmxlIHRoZURvdWJsZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdG8gYSBzdXBwbGllZCBmbG9hdCB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdG8gYSBzdXBwbGllZCB7QGNvZGUgZmxvYXR9CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZUZsb2F0Ci0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgZmxvYXR9IHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0KGludCBwYXJhbWV0ZXJJbmRleCwgZmxvYXQgdGhlRmxvYXQpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgaW50IHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZSBpbnR9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVJbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgaW50fSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0IHtAY29kZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbnQoaW50IHBhcmFtZXRlckluZGV4LCBpbnQgdGhlSW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgbG9uZyB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUgbG9uZ30gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZUxvbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGxvbmd9IHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQge0Bjb2RlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvbmcoaW50IHBhcmFtZXRlckluZGV4LCBsb25nIHRoZUxvbmcpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gU1FMIE5VTEwuIERvbid0IHVzZSB0aGlzCi0gICAgICogdmVyc2lvbiBvZiBzZXROdWxsIGZvciBVc2VyIERlZmluZWQgVHlwZXMgb3IgZm9yIFJFRiB0eXBlIHBhcmFtZXRlcnMuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIFNRTCB7QGNvZGUgTlVMTH0uIERvbid0IHVzZQorICAgICAqIHRoaXMgdmVyc2lvbiBvZiB7QGNvZGUgc2V0TnVsbH0gZm9yIDxpPlVzZXIgRGVmaW5lZCBUeXBlczwvaT4gKFVEVCkgb3IKKyAgICAgKiBmb3IgUkVGIHR5cGUgcGFyYW1ldGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gc3FsVHlwZQotICAgICAqICAgICAgICAgICAgdGhlIFNRTCBUeXBlIG9mIHRoZSBwYXJhbWV0ZXIsIGFzIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLCBhcyBkZWZpbmVkIGluIHtAY29kZQorICAgICAqICAgICAgICAgICAgamF2YS5zcWwuVHlwZXN9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE51bGwoaW50IHBhcmFtZXRlckluZGV4LCBpbnQgc3FsVHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBTUUwgTlVMTC4gVGhpcyB2ZXJzaW9uIG9mCi0gICAgICogc2V0TnVsbCBzaG91bGQgYmUgdXNlZCBmb3IgVXNlciBEZWZpbmVkIFR5cGVzIChVRFRzKSBhbmQgYWxzbyBSRUYgdHlwZXMuCi0gICAgICogVURUcyBjYW4gYmUgU1RSVUNULCBESVNUSU5DVCwgSkFWQV9PQkpFQ1QgYW5kIG5hbWVkIGFycmF5IHR5cGVzLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBTUUwge0Bjb2RlIE5VTEx9LiBUaGlzIHZlcnNpb24KKyAgICAgKiBvZiB7QGNvZGUgc2V0TnVsbH0gc2hvdWxkIGJlIHVzZWQgZm9yIDxpPlVzZXIgRGVmaW5lZCBUeXBlczwvaT4gKFVEVHMpCisgICAgICogYW5kIGFsc28gUkVGIHR5cGVzLiBVRFRzIGNhbiBiZSB7QGNvZGUgU1RSVUNUfSwge0Bjb2RlIERJU1RJTkNUfSwge0Bjb2RlCisgICAgICogSkFWQV9PQkpFQ1R9IGFuZCBuYW1lZCBhcnJheSB0eXBlcy4KICAgICAgKiA8cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgbXVzdCBwcm92aWRlIHRoZSBTUUwgVHlwZSBjb2RlIGFuZCBhbHNvIGEgZnVsbHkgcXVhbGlmaWVkCi0gICAgICogU1FMIFR5cGUgbmFtZSB3aGVuIHN1cHBseWluZyBhIE5VTEwgVURUIG9yIFJFRi4gRm9yIGEgVURULCB0aGUgdHlwZSBuYW1lCi0gICAgICogaXMgdGhlIHR5cGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGl0c2VsZiwgYnV0IGZvciBhIFJFRiBwYXJhbWV0ZXIgdGhlCi0gICAgICogdHlwZSBuYW1lIGlzIHRoZSB0eXBlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgdHlwZS4KKyAgICAgKiBBcHBsaWNhdGlvbnMgbXVzdCBwcm92aWRlIHRoZSBTUUwgdHlwZSBjb2RlIGFuZCBhbHNvIGEgZnVsbHkgcXVhbGlmaWVkCisgICAgICogU1FMIHR5cGUgbmFtZSB3aGVuIHN1cHBseWluZyBhIHtAY29kZSBOVUxMfSBVRFQgb3IgUkVGLiBGb3IgYSBVRFQsIHRoZQorICAgICAqIHR5cGUgbmFtZSBpcyB0aGUgdHlwZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXRzZWxmLCBidXQgZm9yIGEgUkVGCisgICAgICogcGFyYW1ldGVyIHRoZSB0eXBlIG5hbWUgaXMgdGhlIHR5cGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCB0eXBlLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1JbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSBzcWxUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIFR5cGUgb2YgdGhlIHBhcmFtZXRlciwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcworICAgICAqICAgICAgICAgICAgdGhlIFNRTCB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIGFzIGRlZmluZWQgaW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLnNxbC5UeXBlc30uCiAgICAgICogQHBhcmFtIHR5cGVOYW1lCiAgICAgICogICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBVRFQgb3IgUkVGIHR5cGUgLSBpZ25vcmVkIGlmIHRoZQogICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCBhIFVEVC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2VlIFR5cGVzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TnVsbChpbnQgcGFyYW1JbmRleCwgaW50IHNxbFR5cGUsIFN0cmluZyB0eXBlTmFtZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC00MTUsMjEgKzQ4NSwyNSBAQAogICAgICAqIDxwPgogICAgICAqIFRoZXJlIGlzIGEgc3RhbmRhcmQgbWFwcGluZyBmcm9tIEphdmEgdHlwZXMgdG8gU1FMIHR5cGVzLCBkZWZpbmVkIGluIHRoZQogICAgICAqIEpEQkMgc3BlY2lmaWNhdGlvbi4gVGhlIHBhc3NlZCBvYmplY3QgaXMgdGhlbiB0cmFuc2Zvcm1lZCBpbnRvIHRoZQotICAgICAqIGFwcHJvcHJpYXRlIFNRTCB0eXBlLCBhbmQgdGhlbiB0cmFuc2ZlcnJlZCB0byB0aGUgZGF0YWJhc2UuIHNldE9iamVjdCBjYW4KLSAgICAgKiBiZSB1c2VkIHRvIHBhc3MgYWJzdHJhY3QgZGF0YSB0eXBlcyB1bmlxdWUgdG8gdGhlIGRhdGFiYXNlLCBieSB1c2luZyBhCi0gICAgICogSkRCQyBkcml2ZXIgc3BlY2lmaWMgSmF2YSB0eXBlLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgaW1wbGVtZW50cyB0aGUKLSAgICAgKiBpbnRlcmZhY2UgU1FMRGF0YSwgdGhlIEpEQkMgZHJpdmVyIGNhbGxzIDxjb2RlPlNRTERhdGEud3JpdGVTUUw8L2NvZGU+Ci0gICAgICogdG8gd3JpdGUgaXQgdG8gdGhlIFNRTCBkYXRhIHN0cmVhbS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGltcGxlbWVudHMgUmVmLAotICAgICAqIEJsb2IsIENsb2IsIFN0cnVjdCwgb3IgQXJyYXksIHRoZSBkcml2ZXIgcGFzc2VzIGl0IHRvIHRoZSBkYXRhYmFzZSBhcyBhCi0gICAgICogdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgU1FMIHR5cGUuCisgICAgICogYXBwcm9wcmlhdGUgU1FMIHR5cGUsIGFuZCB0aGVuIHRyYW5zZmVycmVkIHRvIHRoZSBkYXRhYmFzZS4ge0Bjb2RlCisgICAgICogc2V0T2JqZWN0fSBjYW4gYmUgdXNlZCB0byBwYXNzIGFic3RyYWN0IGRhdGEgdHlwZXMgdW5pcXVlIHRvIHRoZQorICAgICAqIGRhdGFiYXNlLCBieSB1c2luZyBhIEpEQkMgZHJpdmVyIHNwZWNpZmljIEphdmEgdHlwZS4gSWYgdGhlIG9iamVjdCdzCisgICAgICogY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIHtAY29kZSBTUUxEYXRhfSwgdGhlIEpEQkMgZHJpdmVyIGNhbGxzCisgICAgICoge0Bjb2RlIFNRTERhdGEud3JpdGVTUUx9IHRvIHdyaXRlIGl0IHRvIHRoZSBTUUwgZGF0YSBzdHJlYW0uIElmIHRoZQorICAgICAqIG9iamVjdCdzIGNsYXNzIGltcGxlbWVudHMge0Bjb2RlIFJlZn0sIHtAY29kZSBCbG9ifSwge0Bjb2RlIENsb2J9LAorICAgICAqIHtAY29kZSBTdHJ1Y3R9LCBvciB7QGNvZGUgQXJyYXl9LCB0aGUgZHJpdmVyIHBhc3NlcyBpdCB0byB0aGUgZGF0YWJhc2UgYXMKKyAgICAgKiBhIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIFNRTCB0eXBlLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlT2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChpbnQgcGFyYW1ldGVySW5kZXgsIE9iamVjdCB0aGVPYmplY3QpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtNDM3LDIyICs1MTEsMjYgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdXNpbmcgYSBzdXBwbGllZCBvYmplY3QuCiAgICAgICogPHA+Ci0gICAgICogVGhlIE9iamVjdCBpcyBjb252ZXJ0ZWQgdG8gdGhlIGdpdmVuIHRhcmdldFNxbFR5cGUgYmVmb3JlIGl0IGlzIHNlbnQgdG8KLSAgICAgKiB0aGUgZGF0YWJhc2UuIElmIHRoZSBvYmplY3QgaGFzIGEgY3VzdG9tIG1hcHBpbmcgKGl0cyBjbGFzcyBpbXBsZW1lbnRzCi0gICAgICogdGhlIGludGVyZmFjZSBTUUxEYXRhKSwgdGhlIEpEQkMgZHJpdmVyIHdpbGwgY2FsbCB0aGUgbWV0aG9kCi0gICAgICogU1FMRGF0YS53cml0ZVNRTCB0byB3cml0ZSBpdCB0byB0aGUgU1FMIGRhdGEgc3RyZWFtLiBJZiB0aGUgb2JqZWN0J3MKLSAgICAgKiBjbGFzcyBpbXBsZW1lbnRzIFJlZiwgQmxvYiwgQ2xvYiwgU3RydWN0LCBvciBBcnJheSwgdGhlIGRyaXZlciB3aWxsIHBhc3MKLSAgICAgKiBpdCB0byB0aGUgZGF0YWJhc2UgaW4gdGhlIGZvcm0gb2YgdGhlIHJlbGV2YW50IFNRTCB0eXBlLgorICAgICAqIFRoZSBvYmplY3QgaXMgY29udmVydGVkIHRvIHRoZSBnaXZlbiB7QGNvZGUgdGFyZ2V0U3FsVHlwZX0gYmVmb3JlIGl0IGlzCisgICAgICogc2VudCB0byB0aGUgZGF0YWJhc2UuIElmIHRoZSBvYmplY3QgaGFzIGEgY3VzdG9tIG1hcHBpbmcgKGl0cyBjbGFzcworICAgICAqIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSB7QGNvZGUgU1FMRGF0YX0pLCB0aGUgSkRCQyBkcml2ZXIgd2lsbCBjYWxsIHRoZSBtZXRob2QKKyAgICAgKiB7QGNvZGUgU1FMRGF0YS53cml0ZVNRTH0gdG8gd3JpdGUgaXQgdG8gdGhlIFNRTCBkYXRhIHN0cmVhbS4gSWYgdGhlCisgICAgICogb2JqZWN0J3MgY2xhc3MgaW1wbGVtZW50cyB7QGNvZGUgUmVmfSwge0Bjb2RlIEJsb2J9LCB7QGNvZGUgQ2xvYn0sCisgICAgICoge0Bjb2RlIFN0cnVjdH0sIG9yIHtAY29kZSBBcnJheX0sIHRoZSBkcml2ZXIgd2lsbCBwYXNzIGl0IHRvIHRoZSBkYXRhYmFzZQorICAgICAqIGluIHRoZSBmb3JtIG9mIHRoZSByZWxldmFudCBTUUwgdHlwZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcyBpbmRleCAxCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcyBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVPYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBhdAorICAgICAqICAgICAgICAgICAge0Bjb2RlIHBhcmFtZXRlckluZGV4fSBpcyBzZXQuCiAgICAgICogQHBhcmFtIHRhcmdldFNxbFR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgVHlwZSB0byBzZW5kIHRvIHRoZSBkYXRhYmFzZSwgYXMgZGVmaW5lZCBpbgotICAgICAqICAgICAgICAgICAgamF2YS5zcWwuVHlwZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgdHlwZSB0byBzZW5kIHRvIHRoZSBkYXRhYmFzZSwgYXMgZGVmaW5lZCBpbiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlR5cGVzfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoaW50IHBhcmFtZXRlckluZGV4LCBPYmplY3QgdGhlT2JqZWN0LAogICAgICAgICAgICAgaW50IHRhcmdldFNxbFR5cGUpIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC00NjAsMTAzICs1MzgsMTIzIEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHVzaW5nIGEgc3VwcGxpZWQgb2JqZWN0LgogICAgICAqIDxwPgotICAgICAqIFRoZSBPYmplY3QgaXMgY29udmVydGVkIHRvIHRoZSBnaXZlbiB0YXJnZXRTcWxUeXBlIGJlZm9yZSBpdCBpcyBzZW50IHRvCi0gICAgICogdGhlIGRhdGFiYXNlLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGN1c3RvbSBtYXBwaW5nIChpdHMgY2xhc3MgaW1wbGVtZW50cwotICAgICAqIHRoZSBpbnRlcmZhY2UgU1FMRGF0YSksIHRoZSBKREJDIGRyaXZlciB3aWxsIGNhbGwgdGhlIG1ldGhvZAotICAgICAqIFNRTERhdGEud3JpdGVTUUwgdG8gd3JpdGUgaXQgdG8gdGhlIFNRTCBkYXRhIHN0cmVhbS4gSWYgdGhlIG9iamVjdCdzCi0gICAgICogY2xhc3MgaW1wbGVtZW50cyBSZWYsIEJsb2IsIENsb2IsIFN0cnVjdCwgb3IgQXJyYXksIHRoZSBkcml2ZXIgd2lsbCBwYXNzCi0gICAgICogaXQgdG8gdGhlIGRhdGFiYXNlIGluIHRoZSBmb3JtIG9mIHRoZSByZWxldmFudCBTUUwgdHlwZS4KKyAgICAgKiBUaGUgb2JqZWN0IGlzIGNvbnZlcnRlZCB0byB0aGUgZ2l2ZW4ge0Bjb2RlIHRhcmdldFNxbFR5cGV9IGJlZm9yZSBpdCBpcworICAgICAqIHNlbnQgdG8gdGhlIGRhdGFiYXNlLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGN1c3RvbSBtYXBwaW5nIChpdHMgY2xhc3MKKyAgICAgKiBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2Uge0Bjb2RlIFNRTERhdGF9KSwgdGhlIEpEQkMgZHJpdmVyIHdpbGwgY2FsbCB0aGUgbWV0aG9kCisgICAgICoge0Bjb2RlIFNRTERhdGEud3JpdGVTUUx9IHRvIHdyaXRlIGl0IHRvIHRoZSBTUUwgZGF0YSBzdHJlYW0uIElmIHRoZQorICAgICAqIG9iamVjdCdzIGNsYXNzIGltcGxlbWVudHMge0Bjb2RlIFJlZn0sIHtAY29kZSBCbG9ifSwge0Bjb2RlIENsb2J9LAorICAgICAqIHtAY29kZSBTdHJ1Y3R9LCBvciB7QGNvZGUgQXJyYXl9LCB0aGUgZHJpdmVyIHdpbGwgcGFzcyBpdCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBpbiB0aGUgZm9ybSBvZiB0aGUgcmVsZXZhbnQgU1FMIHR5cGUuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgaW5kZXggMQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlT2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEBwYXJhbSB0YXJnZXRTcWxUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIFR5cGUgdG8gc2VuZCB0byB0aGUgZGF0YWJhc2UsIGFzIGRlZmluZWQgaW4KLSAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlR5cGVzCisgICAgICogICAgICAgICAgICB0aGUgU1FMIHR5cGUgdG8gc2VuZCB0byB0aGUgZGF0YWJhc2UsIGFzIGRlZmluZWQgaW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLnNxbC5UeXBlc30uCiAgICAgICogQHBhcmFtIHNjYWxlCiAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCAtIG9ubHkgYXBwbGllcyB0bwotICAgICAqICAgICAgICAgICAgdGhlIHR5cGVzIGphdmEuc3FsLlR5cGVzLkRFQ0lNQUwgYW5kIGphdmEuc3FsLlR5cGVzLk5VTUVSSUMgLQotICAgICAqICAgICAgICAgICAgaWdub3JlZCBmb3IgYWxsIG90aGVyIHR5cGVzLgorICAgICAqICAgICAgICAgICAgdGhlIHR5cGVzIHtAY29kZSBqYXZhLnNxbC5UeXBlcy5ERUNJTUFMfSBhbmQge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLnNxbC5UeXBlcy5OVU1FUklDfSAtIGlnbm9yZWQgZm9yIGFsbCBvdGhlciB0eXBlcy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoaW50IHBhcmFtZXRlckluZGV4LCBPYmplY3QgdGhlT2JqZWN0LAogICAgICAgICAgICAgaW50IHRhcmdldFNxbFR5cGUsIGludCBzY2FsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIFJFRig8c3RydWN0dXJlZC10eXBlPikKLSAgICAgKiB2YWx1ZS4gVGhpcyBpcyBzdG9yZWQgYXMgYW4gU1FMIFJFRi4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUKKyAgICAgKiBSRUYoPHN0cnVjdHVyZWQtdHlwZT4pfSB2YWx1ZS4gVGhpcyBpcyBzdG9yZWQgYXMgYW4gU1FMIHtAY29kZSBSRUZ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVSZWYKLSAgICAgKiAgICAgICAgICAgIGEgamF2YS5zcWwuUmVmIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBqYXZhLnNxbC5SZWZ9IHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQge0Bjb2RlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzZWUgUmVmCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVmKGludCBwYXJhbWV0ZXJJbmRleCwgUmVmIHRoZVJlZikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHNob3J0IHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZSBzaG9ydH0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlU2hvcnQKLSAgICAgKiAgICAgICAgICAgIGEgc2hvcnQgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIHNob3J0fSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0IHtAY29kZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChpbnQgcGFyYW1ldGVySW5kZXgsIHNob3J0IHRoZVNob3J0KQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIFN0cmluZy4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBzdHJpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZVN0cmluZwotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0IHtAY29kZSBwYXJhbWV0ZXJJbmRleH0gaXMKKyAgICAgKiAgICAgICAgICAgIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoaW50IHBhcmFtZXRlckluZGV4LCBTdHJpbmcgdGhlU3RyaW5nKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIGphdmEuc3FsLlRpbWUKLSAgICAgKiB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlVGltZQotICAgICAqICAgICAgICAgICAgYSBqYXZhLnNxbC5UaW1lIHZhbHVlIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBqYXZhLnNxbC5UaW1lfSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGF0CisgICAgICogICAgICAgICAgICB7QGNvZGUgcGFyYW1ldGVySW5kZXh9IGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKGludCBwYXJhbWV0ZXJJbmRleCwgVGltZSB0aGVUaW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQgamF2YS5zcWwuVGltZQotICAgICAqIHZhbHVlLCB1c2luZyBhIHN1cHBsaWVkIENhbGVuZGFyLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWV9IHZhbHVlLCB1c2luZyBhIHN1cHBsaWVkIHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICogPHA+Ci0gICAgICogVGhlIGRyaXZlciB1c2VzIHRoZSBzdXBwbGllZCBDYWxlbmRhciB0byBjcmVhdGUgdGhlIFNRTCBUSU1FIHZhbHVlLCB3aGljaAotICAgICAqIGFsbG93cyBpdCB0byB1c2UgYSBjdXN0b20gdGltZXpvbmUgLSBvdGhlcndpc2UgdGhlIGRyaXZlciB1c2VzIHRoZQotICAgICAqIGRlZmF1bHQgdGltZXpvbmUgb2YgdGhlIEphdmEgdmlydHVhbCBtYWNoaW5lLgorICAgICAqIFRoZSBkcml2ZXIgdXNlcyB0aGUgc3VwcGxpZWQge0Bjb2RlIENhbGVuZGFyfSB0byBjcmVhdGUgdGhlIFNRTCB7QGNvZGUKKyAgICAgKiBUSU1FfSB2YWx1ZSwgd2hpY2ggYWxsb3dzIGl0IHRvIHVzZSBhIGN1c3RvbSB0aW1lem9uZSAtIG90aGVyd2lzZSB0aGUKKyAgICAgKiBkcml2ZXIgdXNlcyB0aGUgZGVmYXVsdCB0aW1lem9uZSBvZiB0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVUaW1lCi0gICAgICogICAgICAgICAgICBhIGphdmEuc3FsLlRpbWUgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIGphdmEuc3FsLlRpbWV9IHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEgQ2FsZW5kYXIgdG8gdXNlIHRvIGNvbnN0cnVjdCB0aGUgU1FMIFRJTUUgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIENhbGVuZGFyfSB0byB1c2UgdG8gY29uc3RydWN0IHRoZSBTUUwge0Bjb2RlIFRJTUV9CisgICAgICogICAgICAgICAgICB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2VlIFRpbWUKKyAgICAgKiBAc2VlIGphdmEudXRpbC5DYWxlbmRhcgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoaW50IHBhcmFtZXRlckluZGV4LCBUaW1lIHRoZVRpbWUsIENhbGVuZGFyIGNhbCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC01NjcsNjUgKzY2NSw3OCBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVUaW1lc3RhbXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBqYXZhLnNxbC5UaW1lc3RhbXAgdmFsdWUgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBqYXZhLnNxbC5UaW1lc3RhbXAgdmFsdWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBhdCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlckluZGV4fSBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGludCBwYXJhbWV0ZXJJbmRleCwgVGltZXN0YW1wIHRoZVRpbWVzdGFtcCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgKiB2YWx1ZSwgdXNpbmcgdGhlIHN1cHBsaWVkIENhbGVuZGFyLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byBhIHN1cHBsaWVkIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWVzdGFtcH0gdmFsdWUsIHVzaW5nIHRoZSBzdXBwbGllZCB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqIDxwPgotICAgICAqIFRoZSBkcml2ZXIgdXNlcyB0aGUgc3VwcGxpZWQgQ2FsZW5kYXIgdG8gY3JlYXRlIHRoZSBTUUwgVElNRVNUQU1QIHZhbHVlLAotICAgICAqIHdoaWNoIGFsbG93cyBpdCB0byB1c2UgYSBjdXN0b20gdGltZXpvbmUgLSBvdGhlcndpc2UgdGhlIGRyaXZlciB1c2VzIHRoZQotICAgICAqIGRlZmF1bHQgdGltZXpvbmUgb2YgdGhlIEphdmEgdmlydHVhbCBtYWNoaW5lLgorICAgICAqIFRoZSBkcml2ZXIgdXNlcyB0aGUgc3VwcGxpZWQge0Bjb2RlIENhbGVuZGFyfSB0byBjcmVhdGUgdGhlIFNRTCB7QGNvZGUKKyAgICAgKiBUSU1FU1RBTVB9IHZhbHVlLCB3aGljaCBhbGxvd3MgaXQgdG8gdXNlIGEgY3VzdG9tIHRpbWV6b25lIC0gb3RoZXJ3aXNlCisgICAgICogdGhlIGRyaXZlciB1c2VzIHRoZSBkZWZhdWx0IHRpbWV6b25lIG9mIHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4CiAgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG51bWJlciBpbmRleCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEKKyAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCiAgICAgICogQHBhcmFtIHRoZVRpbWVzdGFtcAotICAgICAqICAgICAgICAgICAgdGhlIGphdmEuc3FsLlRpbWVzdGFtcCB2YWx1ZSB0byB1cGRhdGUgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBqYXZhLnNxbC5UaW1lc3RhbXB9IHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBwYXJhbWV0ZXJJbmRleH0gaXMgc2V0LgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEgQ2FsZW5kYXIgdG8gdXNlIHRvIGNvbnN0cnVjdCB0aGUgU1FMIFRJTUVTVEFNUCB2YWx1ZQorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgQ2FsZW5kYXJ9IHRvIHVzZSB0byBjb25zdHJ1Y3QgdGhlIFNRTCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFRJTUVTVEFNUH0gdmFsdWUKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2VlIFRpbWVzdGFtcAorICAgICAqIEBzZWUgamF2YS51dGlsLkNhbGVuZGFyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGludCBwYXJhbWV0ZXJJbmRleCwgVGltZXN0YW1wIHRoZVRpbWVzdGFtcCwKICAgICAgICAgICAgIENhbGVuZGFyIGNhbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlciB0byB0aGUgY2hhcmFjdGVycwotICAgICAqICAgICAgICAgICAgIGZyb20gYSBzdXBwbGllZCBJbnB1dFN0cmVhbSwgd2l0aCBhIHNwZWNpZmllZCBudW1iZXIgb2YKLSAgICAgKiAgICAgICAgICAgICBieXRlcy4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gdGhlIGNoYXJhY3RlcnMgZnJvbSBhIHN1cHBsaWVkCisgICAgICoge0Bjb2RlIElucHV0U3RyZWFtfSwgd2l0aCBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0Q2hhcmFjdGVyU3RyZWFtKGludCwgUmVhZGVyLCBpbnQpfQogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAogICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBudW1iZXIgaW5kZXgsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxCisgICAgICogICAgICAgICAgICBpbmRleCAxLgogICAgICAqIEBwYXJhbSB0aGVJbnB1dFN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIHdpdGggdGhlIGNoYXJhY3RlciBkYXRhIHRvIHVwZGF0ZSB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gd2l0aCB0aGUgY2hhcmFjdGVyIGRhdGEgdG8gd2hpY2ggdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgYXQge0Bjb2RlIHBhcmFtZXRlckluZGV4fSBpcyBzZXQuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIElucHV0U3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUge0Bjb2RlIElucHV0U3RyZWFtfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFVuaWNvZGVTdHJlYW0oaW50IHBhcmFtZXRlckluZGV4LAogICAgICAgICAgICAgSW5wdXRTdHJlYW0gdGhlSW5wdXRTdHJlYW0sIGludCBsZW5ndGgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gYSBzdXBwbGllZCBqYXZhLm5ldC5VUkwuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcGFyYW1ldGVyIHRvIGEgc3VwcGxpZWQge0Bjb2RlCisgICAgICogamF2YS5uZXQuVVJMfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIGluZGV4LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMQorICAgICAqICAgICAgICAgICAgaW5kZXggMS4KICAgICAgKiBAcGFyYW0gdGhlVVJMCi0gICAgICogICAgICAgICAgICB0aGUgVVJMIHRvIHVwZGF0ZSB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFVSTH0gdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBhdCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlckluZGV4fSBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNlZSBVUkwKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVUkwoaW50IHBhcmFtZXRlckluZGV4LCBVUkwgdGhlVVJMKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvUmVmLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9SZWYuamF2YQppbmRleCBjYzBhZGY0Li4yY2VhYzhiIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9SZWYuamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9SZWYuamF2YQpAQCAtMjAsMzUgKzIwLDQyIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCi0gKiBBIG1hbmlmZXN0YXRpb24gb2YgdGhlIFNRTCBSRUYgdHlwZSAtIGEgcmVmZXJlbmNlIHRvIGFuIFNRTCB0eXBlIGNvbnRhaW5lZCBpbgotICogdGhlIGRhdGFiYXNlLgorICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhbiBTUUwgUmVmIC0gYSBkYXRhIG9iamVjdCBjb250YWluaW5nIGEgY3Vyc29yCisgKiBvciBwb2ludGVyIHRvIGEgcmVzdWx0IHRhYmxlLgogICogPHA+Ci0gKiBUaGUgU1FMIFJFRidzIGFyZSBoZWxkIGluIGEgdGFibGUgYWxvbmcgd2l0aCBTUUwgc3RydWN0dXJlZCB0eXBlcy4gRXZlcnkgUkVGCi0gKiBoYXMgYW4gaW5kaXZpZHVhbCBpZGVudGlmaWVyIGZvciBlYWNoIHNpbmdsZSBpbnN0YW5jZS4gVGhlIFNRTCBSRUYgaXMgdXNlZAotICogaW5zdGVhZCBvZiB0aGUgc3RydWN0dXJlZCB0eXBlIGl0IHJlZmVyZW5jZXMuCi0gKiA8cD4KLSAqIEEgUmVmIG9iamVjdCBpcyBzdG9yZWQgaW50byB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlIFByZXBhcmVkU3RhdGVtZW50LnNldFJlZgotICogbWV0aG9kLgorICogVGhlIGRhdGEgc3RydWN0dXJlIGlkZW50aWZpZWQgYnkgYW4gaW5zdGFuY2Ugb2YgUmVmIGlzIGhlbGQgaW4gdGhlIAorICogZGF0YWJhc2UsIHNvIHRoZSBkYXRhIGlzIG5vdCBuZWNlc3NhcmlseSByZWFkIGFuZCBjb252ZXJ0ZWQKKyAqIGludG8gYSBKYXZhIG9iamVjdCB1bnRpbCB7QGNvZGUgZ2V0T2JqZWN0fSBpcyBjYWxsZWQuIEhvd2V2ZXIsIGlmIAorICogdGhlIGRhdGFiYXNlIHN1cHBvcnRzIHRoZSB7QGNvZGUgUmVmfSB0eXBlLCBpdCBpcyBub3QgdHlwaWNhbGx5IAorICogbmVjZXNzYXJ5IHRvIGdldCB0aGUgdW5kZXJseWluZyBvYmplY3QgYmVmb3JlIHVzaW5nIGl0IGluIGEgbWV0aG9kIGNhbGwgLQorICogdGhlIHtAY29kZSBSZWZ9IG9iamVjdCBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUuCisgKiA8L3A+CisgKiBBIHtAY29kZSBSZWZ9IG9iamVjdCBpcyBzdG9yZWQgaW50byB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlCisgKiB7QGxpbmsgUHJlcGFyZWRTdGF0ZW1lbnQjc2V0UmVmKGludCwgUmVmKX0gbWV0aG9kLgorICogIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVmIHsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGZ1bGx5LXF1YWxpZmllZCBTUUwgbmFtZSBvZiB0aGUgU1FMIHN0cnVjdHVyZWQgdHlwZSB0aGF0IHRoaXMKLSAgICAgKiBSZWYgcmVmZXJlbmNlcy4KKyAgICAgKiB7QGNvZGUgUmVmfSByZWZlcmVuY2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBTUUwgc3RydWN0dXJlZCB0eXBlCisgICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFNRTCBzdHJ1Y3R1cmVkIHR5cGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VUeXBlTmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTUUwgc3RydWN0dXJlZCB0eXBlIGluc3RhbmNlIHJlZmVyZW5jZWQgYnkgdGhpcyBSZWYuCisgICAgICogR2V0cyB0aGUgU1FMIHN0cnVjdHVyZWQgdHlwZSBpbnN0YW5jZSByZWZlcmVuY2VkIGJ5IHRoaXMge0Bjb2RlIFJlZn0uCiAgICAgICogCiAgICAgICogQHJldHVybiBhIEphdmEgb2JqZWN0IHdob3NlIHR5cGUgaXMgZGVmaW5lZCBieSB0aGUgbWFwcGluZyBmb3IgdGhlIFNRTAogICAgICAqICAgICAgICAgc3RydWN0dXJlZCB0eXBlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC01NywyMyArNjQsMjUgQEAKICAgICAgKiB0byBhIEphdmEgdHlwZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICBhIGphdmEudXRpbC5NYXAgd2hpY2ggY29udGFpbnMgdGhlIG1hcHBpbmcgdG8gdXNlCisgICAgICogICAgICAgICAgICB0aGUgbWFwcGluZyBmb3IgdHlwZSBjb252ZXJzaW9uLgogICAgICAqIEByZXR1cm4gYSBKYXZhIG9iamVjdCB3aG9zZSB0eXBlIGlzIGRlZmluZWQgYnkgdGhlIG1hcHBpbmcgZm9yIHRoZSBTUUwKICAgICAgKiAgICAgICAgIHN0cnVjdHVyZWQgdHlwZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KE1hcDxTdHJpbmcsIENsYXNzPD8+PiBtYXApIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3RydWN0dXJlZCB0eXBldGhhdCB0aGlzIFJlZiByZWZlcmVuY2VzIHRvIGEKLSAgICAgKiBzdXBwbGllZCBPYmplY3QuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZSB0aGF0IHRoaXMge0Bjb2RlIFJlZn0gcmVmZXJlbmNlcyB0bworICAgICAqIGEgc3VwcGxpZWQgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5ldyBTUUwgc3RydWN0dXJlZCB0eXBlIHRoYXQgdGhpcwotICAgICAqICAgICAgICAgICAgUmVmIHdpbGwgcmVmZXJlbmNlLgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBPYmplY3R9IHJlcHJlc2VudGluZyB0aGUgbmV3IFNRTCBzdHJ1Y3R1cmVkIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoYXQgdGhpcyB7QGNvZGUgUmVmfSByZWZlcmVuY2VzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCB2YWx1ZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1Jlc3VsdFNldC5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvUmVzdWx0U2V0LmphdmEKaW5kZXggZGQyMzM0ZS4uZjMzZjlkZSAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvUmVzdWx0U2V0LmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvUmVzdWx0U2V0LmphdmEKQEAgLTI1LDExODggKzI1LDEzNjMgQEAKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIHRvIGFuIE9iamVjdCB3aGljaCByZXByZXNlbnRzIGEgVGFibGUgb2YgRGF0YSwgdHlwaWNhbGx5Ci0gKiByZXR1cm5lZCBhcyB0aGUgcmVzdWx0IG9mIGEgUXVlcnkgdG8gYSBEYXRhYmFzZS4KKyAqIEFuIGludGVyZmFjZSBmb3IgYW4gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgYSBkYXRhYmFzZSB0YWJsZSBlbnRyeSwgcmV0dXJuZWQKKyAqIGFzIHRoZSByZXN1bHQgb2YgdGhlIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZS4KICAqIDxwPgotICogPGNvZGU+UmVzdWx0U2V0czwvY29kZT4gaGF2ZSBhIEN1cnNvciB3aGljaCBwb2ludHMgdG8gYSBjdXJyZW50IHJvdyBvZgotICogZGF0YS4gV2hlbiBhIFJlc3VsdFNldCBpcyBjcmVhdGVkLCB0aGUgQ3Vyc29yIGlzIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBmaXJzdAotICogcm93LiBUbyBtb3ZlIHRoZSBDdXJzb3IgdG8gdGhlIG5leHQgcm93IGluIHRoZSB0YWJsZSwgdXNlIHRoZQotICogPGNvZGU+bmV4dDwvY29kZT4gbWV0aG9kLiBUaGUgbmV4dCBtZXRob2QgcmV0dXJucyB0cnVlIHVudGlsIHRoZXJlIGFyZSBubwotICogbW9yZSByb3dzIGluIHRoZSBSZXN1bHRTZXQsIHdoZW4gaXQgcmV0dXJucyBmYWxzZS4KKyAqIHtAY29kZSBSZXN1bHRTZXR9cyBoYXZlIGEgY3Vyc29yIHdoaWNoIHBvaW50cyB0byB0aGUgY3VycmVudCBkYXRhIHRhYmxlIHJvdy4KKyAqIFdoZW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9IGlzIGNyZWF0ZWQsIHRoZSBjdXJzb3IncyBsb2NhdGlvbiBpcyBvbmUgcG9zaXRpb24KKyAqIGFoZWFkIG9mIHRoZSBmaXJzdCByb3cuIFRvIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgYW5kIGNvbnNlY3V0aXZlIHJvd3MsCisgKiB1c2UgdGhlIHtAY29kZSBuZXh0fSBtZXRob2QuIFRoZSB7QGNvZGUgbmV4dH0gbWV0aG9kIHJldHVybnMge0Bjb2RlIHRydWV9IGFzCisgKiBsb25nIGFzIHRoZXJlIGFyZSBtb3JlIHJvd3MgaW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9LCBvdGhlcndpc2UgaXQgcmV0dXJucworICoge0Bjb2RlIGZhbHNlfS4KKyAqIDwvcD4KICAqIDxwPgotICogVGhlIGRlZmF1bHQgdHlwZSBvZiBSZXN1bHRTZXQgY2Fubm90IGJlIHVwZGF0ZWQgYW5kIGl0cyBjdXJzb3IgY2FuIG9ubHkgbW92ZQotICogZm9yd2FyZCB0aHJvdWdoIHRoZSByb3dzIG9mIGRhdGEuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIHJlYWQKLSAqIHRocm91Z2ggaXQgb25jZS4gSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIHR5cGVzIG9mIFJlc3VsdFNldCB0aGF0Ci0gKiBjYW4gYmUgdXBkYXRlZCBhbmQgYWxzbyB0eXBlcyB3aGVyZSB0aGUgY3Vyc29yIGNhbiBiZSBzY3JvbGxlZCBmb3J3YXJkIGFuZAotICogYmFja3dhcmQgdGhyb3VnaCB0aGUgcm93cyBvZiBkYXRhLiBUaGlzIGlzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgY29kZQotICogZXhhbXBsZTogPGNvZGU+Ci0gKiAgICAgICAgIENvbm5lY3Rpb24gY29uOwotICogICAgICAgICBTdGF0ZW1lbnQgYVN0YXRlbWVudCA9IGNvbi5jcmVhdGVTdGF0ZW1lbnQoIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTZXQuQ09OQ1VSX1VQREFUQUJMRSApOwotICogICAgICAgICBSZXN1bHRTZXQgdGhlUmVzdWx0U2V0ID0gdGhlU3RhdGVtZW50LmV4ZWN1dGVRdWVyeSgiU0VMRUNUIHByaWNlLCBxdWFudGl0eSBGUk9NIFNUT0NLVEFCTEUiKTsKLSAqICAgICAgICAgLy8gdGhlUmVzdWx0U2V0IHdpbGwgYmUgYm90aCBzY3JvbGxhYmxlIGFuZCB1cGRhdGVhYmxlCi0gKiA8L2NvZGU+CisgKiBUaGUgZGVmYXVsdCB0eXBlIG9mIHtAY29kZSBSZXN1bHRTZXR9IGNhbiBub3QgYmUgdXBkYXRlZCBhbmQgaXRzIGN1cnNvciBjYW4KKyAqIG9ubHkgYWR2YW5jZSBmb3J3YXJkIHRocm91Z2ggdGhlIHJvd3Mgb2YgZGF0YS4gVGhpcyBtZWFucyB0aGF0IGl0IGlzIG9ubHkKKyAqIHBvc3NpYmxlIHRvIHJlYWQgdGhyb3VnaCBpdCBvbmNlLiBIb3dldmVyLCBvdGhlciBraW5kcyBvZiB7QGNvZGUgUmVzdWx0U2V0fQorICogYXJlIGltcGxlbWVudGVkOiBhbiA8aT51cGRhdGFibGU8L2k+IHR5cGUgYW5kIGFsc28gdHlwZXMgd2hlcmUgdGhlIGN1cnNvciBjYW4KKyAqIGJlIDxpPnNjcm9sbGVkPC9pPiBmb3J3YXJkIGFuZCBiYWNrd2FyZCB0aHJvdWdoIHRoZSByb3dzIG9mIGRhdGEuIEhvdyBzdWNoIGEKKyAqIHtAY29kZSBSZXN1bHRTZXR9IGlzIGNyZWF0ZWQgaXMgZGVtb25zdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxkZD4KKyAqICAgICAgICAge0Bjb2RlIENvbm5lY3Rpb24gY29uO308L2RkPgorICogPGRkPntAY29kZSBTdGF0ZW1lbnQgYVN0YXRlbWVudCA9IGNvbi5jcmVhdGVTdGF0ZW1lbnQoCisgKiBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFLH17QGNvZGUgUmVzdWx0U2V0LkNPTkNVUl9VUERBVEFCTEUgKTt9PC9kZD4KKyAqIDxkZD57QGNvZGUgUmVzdWx0U2V0IHRoZVJlc3VsdFNldCA9CisgKiB0aGVTdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KCJTRUxFQ1QgcHJpY2UsIHF1YW50aXR5IEZST00gU1RPQ0tUQUJMRSIpO308L2RkPgorICogPGRkPntAY29kZSAvLyB0aGVSZXN1bHRTZXQgaXMgYm90aCBzY3JvbGxhYmxlIGFuZCB1cGRhdGFibGV9PC9kZD4gPC91bD4KICAqIDxwPgotICogVGhlIFJlc3VsdFNldCBpbnRlcmZhY2UgcHJvdmlkZXMgYSBzZXJpZXMgb2YgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBkYXRhIGZyb20KLSAqIGNvbHVtbnMgaW4gdGhlIGN1cnJlbnQgcm93LCBzdWNoIGFzIGdldERhdGUsIGdldEZsb2F0LiBUaGUgY29sdW1ucyBhcmUKLSAqIGlkZW50aWZpZWQgZWl0aGVyIGJ5IHRoZWlyIGluZGV4IG51bWJlciAoc3RhcnRpbmcgYXQgMSkgb3IgYnkgdGhlaXIgbmFtZSAtCi0gKiB0aGVyZSBhcmUgc2VwYXJhdGUgbWV0aG9kcyBmb3IgYm90aCB0ZWNobmlxdWVzIG9mIGNvbHVtbiBhZGRyZXNzaW5nLiBUaGUKLSAqIGNvbHVtbiBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gSWYgc2V2ZXJhbCBjb2x1bW5zIGhhdmUgdGhlIHNhbWUgbmFtZSwKLSAqIHRoZW4gdGhlIGdldHRlciBtZXRob2RzIHVzZSB0aGUgZmlyc3QgbWF0Y2hpbmcgY29sdW1uLiBUaGlzIG1lYW5zIHRoYXQgaWYKLSAqIGNvbHVtbiBuYW1lcyBhcmUgdXNlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBuYW1lIHdpbGwKLSAqIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgaW50ZW5kZWQgY29sdW1uIC0gZm9yIGNlcnRhaW50eSBpdCBpcyBiZXR0ZXIgdG8gdXNlCi0gKiBjb2x1bW4gaW5kZXhlcy4gSWRlYWxseSB0aGUgY29sdW1ucyBzaG91bGQgYmUgcmVhZCBsZWZ0LXRvLXJpZ2h0IGFuZCByZWFkCi0gKiBvbmNlIG9ubHksIHNpbmNlIG5vdCBhbGwgKiBkYXRhYmFzZXMgYXJlIG9wdGltaXplZCB0byBoYW5kbGUgb3RoZXIgdGVjaG5pcXVlcwotICogb2YgcmVhZGluZyB0aGUgZGF0YS4KKyAqIFRoZSB7QGNvZGUgUmVzdWx0U2V0fSBpbnRlcmZhY2UgcHJvdmlkZXMgYSBzZXJpZXMgb2YgbWV0aG9kcyBmb3IgcmV0cmlldmluZworICogZGF0YSBmcm9tIGNvbHVtbnMgaW4gdGhlIGN1cnJlbnQgcm93LCBzdWNoIGFzIHtAY29kZSBnZXREYXRlfSBhbmQge0Bjb2RlCisgKiBnZXRGbG9hdH0uIFRoZSBjb2x1bW5zIGFyZSByZXRyaWV2ZWQgZWl0aGVyIGJ5IHRoZWlyIGluZGV4IG51bWJlciAoc3RhcnRpbmcKKyAqIGF0IDEpIG9yIGJ5IHRoZWlyIG5hbWUgLSB0aGVyZSBhcmUgc2VwYXJhdGUgbWV0aG9kcyBmb3IgYm90aCB0ZWNobmlxdWVzIG9mCisgKiBjb2x1bW4gYWRkcmVzc2luZy4gVGhlIGNvbHVtbiBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gSWYgc2V2ZXJhbCBjb2x1bW5zCisgKiBoYXZlIHRoZSBzYW1lIG5hbWUsIHRoZW4gdGhlIGdldHRlciBtZXRob2RzIHVzZSB0aGUgZmlyc3QgbWF0Y2hpbmcgY29sdW1uLgorICogVGhpcyBtZWFucyB0aGF0IGlmIGNvbHVtbiBuYW1lcyBhcmUgdXNlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZQorICogdGhhdCB0aGUgbmFtZSB3aWxsIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgaW50ZW5kZWQgY29sdW1uIC0gZm9yIGNlcnRhaW50eSBpdAorICogaXMgYmV0dGVyIHRvIHVzZSBjb2x1bW4gaW5kZXhlcy4gSWRlYWxseSB0aGUgY29sdW1ucyBzaG91bGQgYmUgcmVhZAorICogbGVmdC10by1yaWdodCBhbmQgcmVhZCBvbmNlIG9ubHksIHNpbmNlIG5vdCBhbGwgZGF0YWJhc2VzIGFyZSBvcHRpbWl6ZWQgdG8KKyAqIGhhbmRsZSBvdGhlciB0ZWNobmlxdWVzIG9mIHJlYWRpbmcgdGhlIGRhdGEuCisgKiA8L3A+CiAgKiA8cD4KLSAqIFdoZW4gcmVhZGluZyBkYXRhLCB0aGUgSkRCQyBkcml2ZXIgbWFwcyB0aGUgU1FMIGRhdGEgcmV0cmlldmVkIGZyb20gdGhlCi0gKiBkYXRhYmFzZSB0byB0aGUgSmF2YSB0eXBlIGltcGxpZWQgYnkgdGhlIG1ldGhvZCBpbnZva2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAqIFRoZSBKREJDIHNwZWNpZmljYXRpb24gaGFzIGEgdGFibGUgb2YgYWxsb3dhYmxlIG1hcHBpbmdzIGZyb20gU1FMIHR5cGVzIHRvCi0gKiBKYXZhIHR5cGVzLgorICogV2hlbiByZWFkaW5nIGRhdGEgdmlhIHRoZSBhcHByb3ByaWF0ZSBnZXR0ZXIgbWV0aG9kcywgdGhlIEpEQkMgZHJpdmVyIG1hcHMKKyAqIHRoZSBTUUwgZGF0YSByZXRyaWV2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgdG8gdGhlIEphdmEgdHlwZSBpbXBsaWVkIGJ5IHRoZQorICogbWV0aG9kIGludm9rZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGUgSkRCQyBzcGVjaWZpY2F0aW9uIGhhcyBhIHRhYmxlIGZvciB0aGUKKyAqIG1hcHBpbmdzIGZyb20gU1FMIHR5cGVzIHRvIEphdmEgdHlwZXMuCisgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZXJlIGFyZSBhbHNvIG1ldGhvZHMgZm9yIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBSZXN1bHRTZXQsIHN1Y2ggYXMKLSAqIHVwZGF0ZUludCwgdXBkYXRlU3RyaW5nLiBUaGUgdXBkYXRlIG1ldGhvZHMgY2FuIGJlIHVzZWQgZWl0aGVyIHRvIG1vZGlmeSB0aGUKLSAqIGRhdGEgb2YgYW4gZXhpc3Rpbmcgcm93IG9yIHRvIGluc2VydCBuZXcgZGF0YSByb3dzIGludG8gdGhlIFJlc3VsdFNldC4KLSAqIE1vZGlmaWNhdGlvbiBvZiBleGlzdGluZyBkYXRhIGludm9sdmVzIG1vdmluZyB0aGUgQ3Vyc29yIHRvIHRoZSByb3cgd2hpY2gKLSAqIG5lZWRzIG1vZGlmaWNhdGlvbiBhbmQgdGhlbiB1c2luZyB0aGUgdXBkYXRlIG1ldGhvZHMgdG8gbW9kaWZ5IHRoZSBkYXRhLAotICogZm9sbG93ZWQgYnkgY2FsbGluZyB0aGUgUmVzdWx0U2V0LnVwZGF0ZVJvdyBtZXRob2QuIEZvciBpbnNlcnRpb24gb2YgbmV3Ci0gKiByb3dzLCB0aGUgY3Vyc29yIGlzIGZpcnN0IG1vdmVkIHRvIGEgc3BlY2lhbCByb3cgY2FsbGVkIHRoZSBJbnNlcnQgUm93LCBkYXRhCi0gKiBpcyBhZGRlZCB1c2luZyB0aGUgdXBkYXRlIG1ldGhvZHMsIGZvbGxvd2VkIGJ5IGNhbGxpbmcgdGhlCi0gKiBSZXN1bHRTZXQuaW5zZXJ0Um93IG1ldGhvZC4KKyAqIFRoZXJlIGFyZSBhbHNvIG1ldGhvZHMgZm9yIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSwgc3VjaCBhcworICoge0Bjb2RlIHVwZGF0ZUludH0gYW5kIHtAY29kZSB1cGRhdGVTdHJpbmd9LiBUaGUgdXBkYXRlIG1ldGhvZHMgY2FuIGJlIHVzZWQKKyAqIGVpdGhlciB0byBtb2RpZnkgdGhlIGRhdGEgb2YgYW4gZXhpc3Rpbmcgcm93IG9yIHRvIGluc2VydCBuZXcgZGF0YSByb3dzIGludG8KKyAqIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSAuIE1vZGlmaWNhdGlvbiBvZiBleGlzdGluZyBkYXRhIGludm9sdmVzIG1vdmluZyB0aGUKKyAqIGN1cnNvciB0byB0aGUgcm93IHdoaWNoIG5lZWRzIG1vZGlmaWNhdGlvbiBhbmQgdGhlbiB1c2luZyB0aGUgdXBkYXRlIG1ldGhvZHMKKyAqIHRvIG1vZGlmeSB0aGUgZGF0YSwgZm9sbG93ZWQgYnkgY2FsbGluZyB0aGUge0Bjb2RlIFJlc3VsdFNldC51cGRhdGVSb3d9CisgKiBtZXRob2QuIEZvciBpbnNlcnRpb24gb2YgbmV3IHJvd3MsIHRoZSBjdXJzb3IgaXMgZmlyc3QgbW92ZWQgdG8gYSBzcGVjaWFsIHJvdworICogY2FsbGVkIHRoZSA8aT5JbnNlcnQgUm93PC9pPiwgZGF0YSBpcyBhZGRlZCB1c2luZyB0aGUgdXBkYXRlIG1ldGhvZHMsCisgKiBmb2xsb3dlZCBieSBjYWxsaW5nIHRoZSB7QGNvZGUgUmVzdWx0U2V0Lmluc2VydFJvd30gbWV0aG9kLgorICogPC9wPgogICogPHA+Ci0gKiBBIFJlc3VsdFNldCBpcyBjbG9zZWQgaWYgdGhlIFN0YXRlbWVudCBvYmplY3Qgd2hpY2ggZ2VuZXJhdGVkIGl0IGNsb3NlZCwKLSAqIGV4ZWN1dGVkIGFnYWluIG9yIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIG5leHQgcmVzdWx0IGZyb20gYSBzZXF1ZW5jZSBvZgotICogcmVzdWx0cy4KKyAqIEEge0Bjb2RlIFJlc3VsdFNldH0gaXMgY2xvc2VkIGlmIHRoZSBzdGF0ZW1lbnQgd2hpY2ggZ2VuZXJhdGVkIGl0IGNsb3NlcywgdGhlCisgKiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgYWdhaW4sIG9yIHRoZSBzYW1lIHN0YXRlbWVudCdzIG5leHQge0Bjb2RlIFJlc3VsdFNldH0gCisgKiBpcyByZXRyaWV2ZWQgKGlmIHRoZSBzdGF0ZW1lbnQgcmV0dXJuZWQgb2YgbXVsdGlwbGUgcmVzdWx0cykuCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJlc3VsdFNldCB7CiAKICAgICAvKioKLSAgICAgKiBBIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIFJlc3VsdFNldCBvYmplY3QgbXVzdCBiZSBjbG9zZWQgd2hlbgotICAgICAqIHRoZSBtZXRob2QgQ29ubmVjdGlvbi5jb21taXQgaXMgaW52b2tlZC4KKyAgICAgKiBBIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdCBtdXN0IGJlCisgICAgICogY2xvc2VkIHdoZW4gdGhlIG1ldGhvZCB7QGNvZGUgQ29ubmVjdGlvbi5jb21taXR9IGlzIGludm9rZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VfQ1VSU09SU19BVF9DT01NSVQgPSAyOwogCiAgICAgLyoqCi0gICAgICogQSBjb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBSZXN1bHRTZXQgb2JqZWN0IG11c3Qgbm90IGJlIGNsb3NlZAotICAgICAqIHdoZW4gdGhlIG1ldGhvZCBDb25uZWN0aW9uLmNvbW1pdCBpcyBpbnZva2VkLgorICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEge0Bjb2RlIFJlc3VsdFNldH0gb2JqZWN0IG11c3Qgbm90IGJlCisgICAgICogY2xvc2VkIHdoZW4gdGhlIG1ldGhvZCB7QGNvZGUgQ29ubmVjdGlvbi5jb21taXR9IGlzIGludm9rZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9MRF9DVVJTT1JTX09WRVJfQ09NTUlUID0gMTsKIAogICAgIC8qKgotICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGUgQ29uY3VycmVuY3kgTW9kZSBmb3IgYSBSZXN1bHRTZXQgb2JqZWN0Ci0gICAgICogdGhhdCBjYW5ub3QgYmUgdXBkYXRlZC4KKyAgICAgKiBBIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhlIGNvbmN1cnJlbmN5IG1vZGUgZm9yIGEge0Bjb2RlIFJlc3VsdFNldH0KKyAgICAgKiBvYmplY3QgdGhhdCBjYW5ub3QgYmUgdXBkYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05DVVJfUkVBRF9PTkxZID0gMTAwNzsKIAogICAgIC8qKgotICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGUgQ29uY3VycmVuY3kgTW9kZSBmb3IgYSBSZXN1bHRTZXQgb2JqZWN0Ci0gICAgICogdGhhdCBjYW4gYmUgdXBkYXRlZC4KKyAgICAgKiBBIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhlIGNvbmN1cnJlbmN5IG1vZGUgZm9yIGEge0Bjb2RlIFJlc3VsdFNldH0KKyAgICAgKiBvYmplY3QgdGhhdCBjYW4gYmUgdXBkYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05DVVJfVVBEQVRBQkxFID0gMTAwODsKIAogICAgIC8qKgotICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSBwcm9jZXNzaW5nIG9mIHRoZSByb3dzIG9mIGEgUmVzdWx0U2V0IGluIHRoZQotICAgICAqIGZvcndhcmQgZGlyZWN0aW9uLCBmaXJzdCB0byBsYXN0CisgICAgICogQSBjb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHByb2Nlc3Npbmcgb2YgdGhlIHJvd3Mgb2YgYSB7QGNvZGUgUmVzdWx0U2V0fQorICAgICAqIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiwgZmlyc3QgdG8gbGFzdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRVRDSF9GT1JXQVJEID0gMTAwMDsKIAogICAgIC8qKgotICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSBwcm9jZXNzaW5nIG9mIHRoZSByb3dzIG9mIGEgUmVzdWx0U2V0IGluIHRoZQotICAgICAqIHJldmVyc2UgZGlyZWN0aW9uLCBsYXN0IHRvIGZpcnN0CisgICAgICogQSBjb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHByb2Nlc3Npbmcgb2YgdGhlIHJvd3Mgb2YgYSB7QGNvZGUgUmVzdWx0U2V0fQorICAgICAqIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbiwgbGFzdCB0byBmaXJzdC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRVRDSF9SRVZFUlNFID0gMTAwMTsKIAogICAgIC8qKgogICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBvcmRlciBvZiBwcm9jZXNzaW5nIG9mIHRoZSByb3dzIG9mIGEKLSAgICAgKiBSZXN1bHRTZXQgaXMgdW5rbm93bi4KKyAgICAgKiB7QGNvZGUgUmVzdWx0U2V0fSBpcyB1bmtub3duLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFVENIX1VOS05PV04gPSAxMDAyOwogCiAgICAgLyoqCi0gICAgICogQSBjb25zdGFudCB1c2VkIHRvIGluZGljYXRlIGEgUmVzdWx0U2V0IG9iamVjdCB3aG9zZSBDdXJzb3IgY2FuIG9ubHkgbW92ZQotICAgICAqIGZvcndhcmQKKyAgICAgKiBBIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgYSB7QGNvZGUgUmVzdWx0U2V0fSBvYmplY3Qgd2hvc2UgY3Vyc29yIGNhbgorICAgICAqIG9ubHkgbW92ZSBmb3J3YXJkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRk9SV0FSRF9PTkxZID0gMTAwMzsKIAogICAgIC8qKgotICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSBhIFJlc3VsdFNldCBvYmplY3Qgd2hpY2ggaXMgU2Nyb2xsYWJsZSBidXQKLSAgICAgKiB3aGljaCBpcyBub3Qgc2Vuc2l0aXZlIHRvIGNoYW5nZXMgbWFkZSBieSBvdGhlcnMKKyAgICAgKiBBIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgYSB7QGNvZGUgUmVzdWx0U2V0fSBvYmplY3Qgd2hpY2ggaXMKKyAgICAgKiBzY3JvbGxhYmxlIGJ1dCBpcyBpbnNlbnNpdGl2ZSB0byBjaGFuZ2VzIG1hZGUgYnkgb3RoZXJzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0NST0xMX0lOU0VOU0lUSVZFID0gMTAwNDsKIAogICAgIC8qKgotICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSBhIFJlc3VsdFNldCBvYmplY3Qgd2hpY2ggaXMgU2Nyb2xsYWJsZSBidXQKLSAgICAgKiB3aGljaCBpcyBzZW5zaXRpdmUgdG8gY2hhbmdlcyBtYWRlIGJ5IG90aGVycworICAgICAqIEEgY29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSBhIHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdCB3aGljaCBpcworICAgICAqIHNjcm9sbGFibGUgYW5kIHNlbnNpdGl2ZSB0byBjaGFuZ2VzIG1hZGUgYnkgb3RoZXJzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0NST0xMX1NFTlNJVElWRSA9IDEwMDU7CiAKICAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgQ3Vyc29yIHRvIGEgc3BlY2lmaWVkIHJvdyBudW1iZXIgaW4gdGhlIFJlc3VsdFNldC4KKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIGEgc3BlY2lmaWVkIHJvdyBudW1iZXIgaW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSByb3cKLSAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgcm93IG51bWJlciBmb3IgdGhlIEN1cnNvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IEN1cnNvciBwb3NpdGlvbiBpcyBvbiB0aGUgUmVzdWx0U2V0LCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHJvdyBzdGFydGluZyBhdCBpbmRleCAxLiBJbmRleCB7QGNvZGUgLTF9CisgICAgICogICAgICAgICAgICByZXR1cm5zIHRoZSBsYXN0IHJvdy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbiBpcyBvbiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBSZXN1bHRTZXR9LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhYnNvbHV0ZShpbnQgcm93KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogTW92ZXMgdGhlIEN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBSZXN1bHRTZXQsIGFmdGVyIHRoZSBsYXN0IHJvdy4KKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIHtAY29kZSBSZXN1bHRTZXR9LCBhZnRlciB0aGUgbGFzdCByb3cuCiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWZ0ZXJMYXN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBDdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBSZXN1bHRTZXQsIGJlZm9yZSB0aGUgZmlyc3Qgcm93LgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSwgYmVmb3JlIHRoZSBmaXJzdAorICAgICAqIHJvdy4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWZvcmVGaXJzdCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFueSB1cGRhdGVzIG1hZGUgdG8gdGhlIGN1cnJlbnQgcm93IGluIHRoZSBSZXN1bHRTZXQuCisgICAgICogQ2FuY2VscyBhbnkgdXBkYXRlcyBtYWRlIHRvIHRoZSBjdXJyZW50IHJvdyBpbiB0aGUge0Bjb2RlIFJlc3VsdFNldH0uCiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2FuY2VsUm93VXBkYXRlcygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIHRoZSB3YXJuaW5ncyByZWxhdGVkIHRvIHRoaXMgUmVzdWx0U2V0LgorICAgICAqIENsZWFycyBhbGwgd2FybmluZ3MgcmVsYXRlZCB0byB0aGlzIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyV2FybmluZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVsZWFzZXMgdGhpcyBSZXN1bHRTZXQncyBkYXRhYmFzZSBhbmQgSkRCQyByZXNvdXJjZXMuIFlvdSBhcmUgc3Ryb25nbHkKLSAgICAgKiBhZHZpc2VkIHRvIHVzZSB0aGlzIG1ldGhvZCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIHRoZSByZWxlYXNlIGJlaW5nIGRvbmUKLSAgICAgKiB3aGVuIHRoZSBSZXN1bHRTZXQncyBmaW5hbGl6ZSBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgICAgKiBwcm9jZXNzLiBOb3RlIHRoYXQgdGhlIGNsb3NlKCkgbWV0aG9kIG1pZ2h0IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlCi0gICAgICogc2luY2UgaXQgaXMgZGVwZW5kZW50IG9uIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlCi0gICAgICogYW5kIHRoZSBkYXRhYmFzZSBpdHNlbGYuCisgICAgICogUmVsZWFzZXMgdGhpcyB7QGNvZGUgUmVzdWx0U2V0fSdzIGRhdGFiYXNlIGFuZCBKREJDIHJlc291cmNlcy4gWW91IGFyZQorICAgICAqIHN0cm9uZ2x5IGFkdmlzZWQgdG8gdXNlIHRoaXMgbWV0aG9kIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gdGhlIHJlbGVhc2UKKyAgICAgKiBiZWluZyBkb25lIHdoZW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9J3MgZmluYWxpemUgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcKKyAgICAgKiBnYXJiYWdlIGNvbGxlY3Rpb24gcHJvY2Vzcy4gTm90ZSB0aGF0IHRoZSB7QGNvZGUgY2xvc2UoKX0gbWV0aG9kIG1pZ2h0CisgICAgICogdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgc2luY2UgaXQgaXMgZGVwZW5kZW50IG9uIHRoZSBiZWhhdmlvciBvZiB0aGUKKyAgICAgKiBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBhbmQgdGhlIGRhdGFiYXNlIGl0c2VsZi4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoZSBjdXJyZW50IHJvdyBmcm9tIHRoZSBSZXN1bHRTZXQgYW5kIGZyb20gdGhlIHVuZGVybHlpbmcKLSAgICAgKiBkYXRhYmFzZS4KKyAgICAgKiBEZWxldGVzIHRoZSBjdXJyZW50IHJvdyBmcm9tIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSBhbmQgZnJvbSB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIGRhdGFiYXNlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVJvdygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbmRleCBudW1iZXIgZm9yIGEgY29sdW1uIGluIHRoZSBSZXN1bHRTZXQgZnJvbSB0aGUgcHJvdmlkZWQKLSAgICAgKiBDb2x1bW4gTmFtZS4KKyAgICAgKiBHZXRzIHRoZSBpbmRleCBudW1iZXIgZm9yIGEgY29sdW1uIGluIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSBmcm9tIHRoZQorICAgICAqIHByb3ZpZGVkIGNvbHVtbiBuYW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgY29sdW1uIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZSBSZXN1bHRTZXQgZm9yIHRoZSBjb2x1bW4gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbidzIGluZGV4IGluIHRoZSB7QGNvZGUgUmVzdWx0U2V0fSBpZGVudGlmaWVkIGJ5IGNvbHVtbgorICAgICAqICAgICAgICAgbmFtZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGZpbmRDb2x1bW4oU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTaGlmdHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byB0aGUgZmlyc3Qgcm93IGluIHRoZSBSZXN1bHRTZXQuCisgICAgICogU2hpZnRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIGZpcnN0IHJvdyBpbiB0aGUge0Bjb2RlIFJlc3VsdFNldH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwb3NpdGlvbiBpcyBpbiBhIGxlZ2l0aW1hdGUgcm93LCBmYWxzZSBpZiB0aGUKLSAgICAgKiAgICAgICAgIFJlc3VsdFNldCBjb250YWlucyBubyByb3dzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3NpdGlvbiBpcyBpbiBhIGxlZ2l0aW1hdGUgcm93LCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBpZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gY29udGFpbnMgbm8gcm93cy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBmaXJzdCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCBpbiB0aGUgY3VycmVudAotICAgICAqIHJvdyBvZiB0aGlzIFJlc3VsdFNldCBhcyBhIGphdmEuc3FsLkFycmF5LgorICAgICAqIEdldHMgdGhlIGNvbnRlbnQgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBpbmRleCBpbiB0aGUgY3VycmVudCByb3cKKyAgICAgKiBvZiB0aGlzIHtAY29kZSBSZXN1bHRTZXR9IGFzIGEge0Bjb2RlIGphdmEuc3FsLkFycmF5fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgamF2YS5zcWwuQXJyYXkgd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBjb2x1bW4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLkFycmF5fSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXkgZ2V0QXJyYXkoaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUgYXMgYQotICAgICAqIGphdmEuc3FsLkFycmF5LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLkFycmF5fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIGphdmEuc3FsLkFycmF5IHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIHtAY29kZSBqYXZhLnNxbC5BcnJheX0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBBcnJheSBnZXRBcnJheShTdHJpbmcgY29sTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCBhcyBhbiBBU0NJSQorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYW4gQVNDSUkKICAgICAgKiBjaGFyYWN0ZXIgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgSW5wdXRTdHJlYW19IHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbShpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSBhcyBhbiBBU0NJSQotICAgICAqIGNoYXJhY3RlciBzdHJlYW0uCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBuYW1lIGFzIGFuIEFTQ0lJIGNoYXJhY3RlcgorICAgICAqIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQogICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIGNvbHVtbgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QXNjaWlTdHJlYW0oU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYQotICAgICAqIGphdmEubWF0aC5CaWdEZWNpbWFsLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLm1hdGguQmlnRGVjaW1hbH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIEJpZ0RlY2ltYWwgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIEJpZ0RlY2ltYWx9IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYQotICAgICAqICAgICAgICAgICAgIGphdmEubWF0aC5CaWdEZWNpbWFsLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLm1hdGguQmlnRGVjaW1hbH0uCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0QmlnRGVjaW1hbChpbnQpfSBvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayAjZ2V0QmlnRGVjaW1hbChTdHJpbmcpfQogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KICAgICAgKiBAcGFyYW0gc2NhbGUKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50Ci0gICAgICogQHJldHVybiBhIEJpZ0RlY2ltYWwgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQmlnRGVjaW1hbH0gd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoaW50IGNvbHVtbkluZGV4LCBpbnQgc2NhbGUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUsIGFzIGEKLSAgICAgKiBqYXZhLm1hdGguQmlnRGVjaW1hbC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUsIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5tYXRoLkJpZ0RlY2ltYWx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgQmlnRGVjaW1hbCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIEJpZ0RlY2ltYWwgd2l0aCB2YWx1ZSBvZiB0aGUgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSwgYXMgYQotICAgICAqICAgICAgICAgICAgIGphdmEubWF0aC5CaWdEZWNpbWFsLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSwgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLm1hdGguQmlnRGVjaW1hbH0uCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0QmlnRGVjaW1hbChpbnQpfSBvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayAjZ2V0QmlnRGVjaW1hbChTdHJpbmcpfQogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KICAgICAgKiBAcGFyYW0gc2NhbGUKICAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50Ci0gICAgICogQHJldHVybiBhIEJpZ0RlY2ltYWwgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbgorICAgICAqIEByZXR1cm4gYSBCaWdEZWNpbWFsIHdpdGggdmFsdWUgb2YgdGhlIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoU3RyaW5nIGNvbHVtbk5hbWUsIGludCBzY2FsZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYSBiaW5hcnkKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIGluZGV4IGFzIGEgYmluYXJ5CiAgICAgICogc3RyZWFtLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHJlYWQgTE9OR1ZBUkJJTkFSWSB2YWx1ZXMuIEFsbCBvZiB0aGUgZGF0YSBpbgotICAgICAqIHRoZSBJbnB1dFN0cmVhbSBzaG91bGQgYmUgcmVhZCBiZWZvcmUgZ2V0dGluZyBkYXRhIGZyb20gYW55IG90aGVyIGNvbHVtbi4KLSAgICAgKiBBIGZ1cnRoZXIgY2FsbCB0byBhIGdldHRlciBtZXRob2Qgd2lsbCBpbXBsaWNpdGx5IGNsb3NlIHRoZSBJbnB1dFN0cmVhbS4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZWFkIHtAY29kZSBMT05HVkFSQklOQVJZfSB2YWx1ZXMuIEFsbCBvZiB0aGUKKyAgICAgKiBkYXRhIGluIHRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHNob3VsZCBiZSByZWFkIGJlZm9yZSBnZXR0aW5nIGRhdGEgZnJvbQorICAgICAqIGFueSBvdGhlciBjb2x1bW4uIEEgZnVydGhlciBjYWxsIHRvIGEgZ2V0dGVyIG1ldGhvZCB3aWxsIGltcGxpY2l0bHkgY2xvc2UKKyAgICAgKiB0aGUge0Bjb2RlIElucHV0U3RyZWFtfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIGNvbHVtbi4gSWYgdGhlIGNvbHVtbiB2YWx1ZQotICAgICAqICAgICAgICAgaXMgU1FMIE5VTEwsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIGNvbHVtbi4gSWYgdGhlCisgICAgICogICAgICAgICBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfSwge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW0oaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUgYXMgYSBiaW5hcnkgc3RyZWFtLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSBhcyBhIGJpbmFyeSBzdHJlYW0uCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVhZCBMT05HVkFSQklOQVJZIHZhbHVlcy4gQWxsIG9mIHRoZSBkYXRhIGluCi0gICAgICogdGhlIElucHV0U3RyZWFtIHNob3VsZCBiZSByZWFkIGJlZm9yZSBnZXR0aW5nIGRhdGEgZnJvbSBhbnkgb3RoZXIgY29sdW1uLgotICAgICAqIEEgZnVydGhlciBjYWxsIHRvIGEgZ2V0dGVyIG1ldGhvZCB3aWxsIGltcGxpY2l0bHkgY2xvc2UgdGhlIElucHV0U3RyZWFtLgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHJlYWQge0Bjb2RlIExPTkdWQVJCSU5BUll9IHZhbHVlcy4gQWxsIG9mIHRoZQorICAgICAqIGRhdGEgaW4gdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gc2hvdWxkIGJlIHJlYWQgYmVmb3JlIGdldHRpbmcgZGF0YSBmcm9tCisgICAgICogYW55IG90aGVyIGNvbHVtbi4gQSBmdXJ0aGVyIGNhbGwgdG8gYSBnZXR0ZXIgbWV0aG9kIHdpbGwgaW1wbGljaXRseSBjbG9zZQorICAgICAqIHRoZSB7QGNvZGUgSW5wdXRTdHJlYW19LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIGNvbHVtbiBJZiB0aGUgY29sdW1uIHZhbHVlCi0gICAgICogICAgICAgICBpcyBTUUwgTlVMTCwgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBjb2x1bW4gaWYgdGhlCisgICAgICogICAgICAgICBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfSwge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW0oU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYSBqYXZhLnNxbC5CbG9iCi0gICAgICogb2JqZWN0LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5CbG9ifSBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIGphdmEuc3FsLkJsb2Igd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLkJsb2J9IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJsb2IgZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSwgYXMgYSBqYXZhLnNxbC5CbG9iCi0gICAgICogb2JqZWN0LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSwgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5CbG9ifSBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBqYXZhLnNxbC5CbG9iIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLkJsb2J9IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJsb2IgZ2V0QmxvYihTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCBhcyBhIGJvb2xlYW4uCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBpbmRleCBhcyBhIHtAY29kZSBib29sZWFufQorICAgICAqIC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIElmIHRoZSBjb2x1bW4gaXMgU1FMIE5VTEwsIGZhbHNlCi0gICAgICogICAgICAgICBpcyByZXR1cm5lZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIHtAY29kZSBib29sZWFufSB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIElmIHRoZSBjb2x1bW4gaXMgU1FMCisgICAgICogICAgICAgICB7QGNvZGUgTlVMTH0sIHtAY29kZSBmYWxzZX0gaXMgcmV0dXJuZWQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSwgYXMgYSBib29sZWFuLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSwgYXMgYSB7QGNvZGUgYm9vbGVhbn0KKyAgICAgKiAuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBib29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbHVtbi4gSWYgdGhlIGNvbHVtbiBpcyBTUUwgTlVMTCwgZmFsc2UKLSAgICAgKiAgICAgICAgIGlzIHJldHVybmVkLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgYm9vbGVhbn0gdmFsdWUgZnJvbSB0aGUgY29sdW1uLiBJZiB0aGUgY29sdW1uIGlzIFNRTAorICAgICAqICAgICAgICAge0Bjb2RlIE5VTEx9LCB7QGNvZGUgZmFsc2V9IGlzIHJldHVybmVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYSBieXRlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUgYnl0ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIGJ5dGUgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4gMCBpZiB0aGUgdmFsdWUgaXMgU1FMCi0gICAgICogICAgICAgICBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGJ5dGV9IGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiAwIGlmIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBuYW1lIGFzIGEgYnl0ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUgYXMgYSB7QGNvZGUgYnl0ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBieXRlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIDAgaWYgdGhlIHZhbHVlIGlzIFNRTAotICAgICAqICAgICAgICAgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGJ5dGV9IGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiAwIGlmIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4IGFzIGEgYnl0ZSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIGluZGV4IGFzIGEgYnl0ZSBhcnJheS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgY29sdW1uIGNvbnRhaW5zIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoZSBjb2x1bW4gY29udGFpbnMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBuYW1lIGFzIGEgYnl0ZSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUgYXMgYSBieXRlIGFycmF5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgY29sdW1uIGNvbnRhaW5zIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIGNvbHVtbiBjb250YWlucyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYQotICAgICAqIGphdmEuaW8uUmVhZGVyIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIGluZGV4IGFzIGEge0Bjb2RlCisgICAgICogamF2YS5pby5SZWFkZXJ9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgUmVhZGVyIGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIG51bGwgaWYgdGhlIGNvbHVtbgotICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVhZGVyfSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoZSBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2VlIGphdmEuaW8uUmVhZGVyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW0oaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUgYXMgYSBqYXZhLmlvLlJlYWRlcgotICAgICAqIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLmlvLlJlYWRlcn0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgUmVhZGVyIGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIG51bGwgaWYgdGhlIGNvbHVtbgotICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIHtAY29kZSBSZWFkZXJ9IGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIGNvbHVtbiB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4IGFzIGEKLSAgICAgKiBqYXZhLnNxbC5DbG9iLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5DbG9ifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgQ2xvYiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBpbiB0aGUgY29sdW1uLiBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2xvYn0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdmFsdWUgaW4gdGhlIGNvbHVtbi4KKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xvYiBnZXRDbG9iKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBuYW1lIGFzIGEgamF2YS5zcWwuQ2xvYi4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5DbG9ifS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIENsb2Igb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdmFsdWUgaW4gdGhlIGNvbHVtbi4gbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2xvYn0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdmFsdWUgaW4gdGhlIGNvbHVtbi4KKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xvYiBnZXRDbG9iKFN0cmluZyBjb2xOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29uY3VycmVuY3kgbW9kZSBvZiB0aGlzIFJlc3VsdFNldC4KKyAgICAgKiBHZXRzIHRoZSBjb25jdXJyZW5jeSBtb2RlIG9mIHRoaXMge0Bjb2RlIFJlc3VsdFNldH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29uY3VycmVuY3kgbW9kZSAtIG9uZSBvZjogUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFksCi0gICAgICogICAgICAgICBSZXN1bHRTZXQuQ09OQ1VSX1VQREFUQUJMRQorICAgICAqIEByZXR1cm4gdGhlIGNvbmN1cnJlbmN5IG1vZGUgLSBvbmUgb2Y6IHtAY29kZSBSZXN1bHRTZXQuQ09OQ1VSX1JFQURfT05MWX0KKyAgICAgKiAgICAgICAgICwge0Bjb2RlIFJlc3VsdFNldC5DT05DVVJfVVBEQVRBQkxFfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldENvbmN1cnJlbmN5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIFNRTCBjdXJzb3Igb2YgdGhpcyBSZXN1bHRTZXQuCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgU1FMIGN1cnNvciBvZiB0aGlzIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgU1FMIGN1cnNvciBuYW1lCisgICAgICogQHJldHVybiB0aGUgU1FMIGN1cnNvciBuYW1lLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3Vyc29yTmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYQotICAgICAqIGphdmEuc3FsLkRhdGUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBpbmRleCBhcyBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLkRhdGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBqYXZhLnNxbC5EYXRlIG1hdGNoaW5nIHRoZSBjb2x1bW4gdmFsdWUuIG51bGwgaWYgdGhlIGNvbHVtbiBpcwotICAgICAqICAgICAgICAgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgamF2YS5zcWwuRGF0ZX0gbWF0Y2hpbmcgdGhlIGNvbHVtbiB2YWx1ZS4ge0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiB0aGUgY29sdW1uIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERhdGUgZ2V0RGF0ZShpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYQotICAgICAqIGphdmEuc3FsLkRhdGUuIFRoaXMgbWV0aG9kIHVzZXMgYSBzdXBwbGllZCBjYWxlbmRhciB0byBjb21wdXRlIHRoZSBEYXRlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5EYXRlfS4gVGhpcyBtZXRob2QgdXNlcyBhIHN1cHBsaWVkIGNhbGVuZGFyIHRvIGNvbXB1dGUgdGhlIERhdGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEgamF2YS51dGlsLkNhbGVuZGFyIHRvIHVzZSBpbiBjb25zdHJ1Y3RpbmcgdGhlIERhdGUuCi0gICAgICogQHJldHVybiBhIGphdmEuc3FsLkRhdGUgbWF0Y2hpbmcgdGhlIGNvbHVtbiB2YWx1ZS4gbnVsbCBpZiB0aGUgY29sdW1uIGlzCi0gICAgICogICAgICAgICBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIGphdmEudXRpbC5DYWxlbmRhcn0gdG8gdXNlIGluIGNvbnN0cnVjdGluZyB0aGUgRGF0ZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLkRhdGV9IG1hdGNoaW5nIHRoZSBjb2x1bW4gdmFsdWUuIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgdGhlIGNvbHVtbiBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlIGdldERhdGUoaW50IGNvbHVtbkluZGV4LCBDYWxlbmRhciBjYWwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSBhcyBhIGphdmEuc3FsLkRhdGUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBuYW1lIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuRGF0ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBqYXZhLnNxbC5EYXRlIG1hdGNoaW5nIHRoZSBjb2x1bW4gdmFsdWUuIG51bGwgaWYgdGhlIGNvbHVtbiBpcwotICAgICAqICAgICAgICAgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIHtAY29kZSBqYXZhLnNxbC5EYXRlfSBtYXRjaGluZyB0aGUgY29sdW1uIHZhbHVlLiB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSBjb2x1bW4gaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUsIGFzIGEgamF2YS5zcWwuRGF0ZQotICAgICAqIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUsIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuRGF0ZX0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KICAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICBqYXZhLnV0aWwuQ2FsZW5kYXIgdG8gdXNlIGluIGNvbnN0cnVjdGluZyB0aGUgRGF0ZS4KLSAgICAgKiBAcmV0dXJuIGEgamF2YS5zcWwuRGF0ZSBtYXRjaGluZyB0aGUgY29sdW1uIHZhbHVlLiBudWxsIGlmIHRoZSBjb2x1bW4gaXMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIGphdmEudXRpbC5DYWxlbmRhcn0gdG8gdXNlIGluIGNvbnN0cnVjdGluZyB0aGUgRGF0ZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGphdmEuc3FsLkRhdGV9IG1hdGNoaW5nIHRoZSBjb2x1bW4gdmFsdWUuIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgdGhlIGNvbHVtbiBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlIGdldERhdGUoU3RyaW5nIGNvbHVtbk5hbWUsIENhbGVuZGFyIGNhbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCBhcyBhIGRvdWJsZSB2YWx1ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIGluZGV4IGFzIGEge0Bjb2RlIGRvdWJsZX0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgZG91YmxlIGNvbnRhaW5pbmcgdGhlIGNvbHVtbiB2YWx1ZS4gMC4wIGlmIHRoZSBjb2x1bW4gaXMgU1FMCi0gICAgICogICAgICAgICBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGRvdWJsZX0gZXF1YWwgdG8gdGhlIGNvbHVtbiB2YWx1ZS4ge0Bjb2RlIDAuMH0gaWYgdGhlCisgICAgICogICAgICAgICBjb2x1bW4gaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSBhcyBhIGRvdWJsZSB2YWx1ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUgYXMgYSB7QGNvZGUgZG91YmxlfQorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgZG91YmxlIGNvbnRhaW5pbmcgdGhlIGNvbHVtbiB2YWx1ZS4gMC4wIGlmIHRoZSBjb2x1bW4gaXMgU1FMCi0gICAgICogICAgICAgICBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgZG91YmxlfSBlcXVhbCB0byB0aGUgY29sdW1uIHZhbHVlLiB7QGNvZGUgMC4wfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGNvbHVtbiBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIHJvd3MgYXJlIGZldGNoZWQgZm9yIHRoaXMgUmVzdWx0U2V0IG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggcm93cyBhcmUgZmV0Y2hlZCBmb3IgdGhpcyB7QGNvZGUgUmVzdWx0U2V0fQorICAgICAqIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmZXRjaCBkaXJlY3Rpb24uIFdpbGwgYmU6IFJlc3VsdFNldC5GRVRDSF9GT1JXQVJELAotICAgICAqICAgICAgICAgUmVzdWx0U2V0LkZFVENIX1JFVkVSU0Ugb3IgUmVzdWx0U2V0LkZFVENIX1VOS05PV04KKyAgICAgKiBAcmV0dXJuIHRoZSBmZXRjaCBkaXJlY3Rpb24uIFdpbGwgYmUgb25lIG9mOgorICAgICAqICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgPGxpPlJlc3VsdFNldC5GRVRDSF9GT1JXQVJEPC9saT48bGk+UmVzdWx0U2V0LkZFVENIX1JFVkVSU0U8L2xpPgorICAgICAqICAgICAgICAgPGxpPlJlc3VsdFNldC5GRVRDSF9VTktOT1dOPC9saT4KKyAgICAgKiAgICAgICAgIDwvdWw+CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRGZXRjaERpcmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmZXRjaCBzaXplIChpbiBudW1iZXIgb2Ygcm93cykgZm9yIHRoaXMgUmVzdWx0U2V0CisgICAgICogR2V0cyB0aGUgZmV0Y2ggc2l6ZSAoaW4gbnVtYmVyIG9mIHJvd3MpIGZvciB0aGlzIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGZldGNoIHNpemUgYXMgYW4gaW50CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRGZXRjaFNpemUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4IGFzIGEgZmxvYXQgdmFsdWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBpbmRleCBhcyBhIHtAY29kZSBmbG9hdH0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgZmxvYXQgY29udGFpbmluZyB0aGUgY29sdW1uIHZhbHVlLiAwLjAgaWYgdGhlIGNvbHVtbiBpcyBTUUwKLSAgICAgKiAgICAgICAgIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgZmxvYXR9IGVxdWFsIHRvIHRoZSBjb2x1bW4gdmFsdWUuIHtAY29kZSAwLjB9IGlmIHRoZQorICAgICAqICAgICAgICAgY29sdW1uIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBuYW1lIGFzIGEgZmxvYXQgdmFsdWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBuYW1lIGFzIGEge0Bjb2RlIGZsb2F0fQorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgZmxvYXQgY29udGFpbmluZyB0aGUgY29sdW1uIHZhbHVlLiAwLjAgaWYgdGhlIGNvbHVtbiBpcyBTUUwKLSAgICAgKiAgICAgICAgIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIHtAY29kZSBmbG9hdH0gZXF1YWwgdG8gdGhlIGNvbHVtbiB2YWx1ZS4ge0Bjb2RlIDAuMH0gaWYgdGhlCisgICAgICogICAgICAgICBjb2x1bW4gaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYW4gaW50IHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYW4ge0Bjb2RlIGludH0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGFuIGludCBjb250YWluaW5nIHRoZSBjb2x1bW4gdmFsdWUuIDAgaWYgdGhlIGNvbHVtbiBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgaW50fSBlcXVhbCB0byB0aGUgY29sdW1uIHZhbHVlLiB7QGNvZGUgMH0gaWYgdGhlCisgICAgICogICAgICAgICBjb2x1bW4gaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSwgYXMgYW4gaW50IHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSwgYXMgYW4ge0Bjb2RlIGludH0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhbiBpbnQgY29udGFpbmluZyB0aGUgY29sdW1uIHZhbHVlLiAwIGlmIHRoZSBjb2x1bW4gaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgaW50fSBlcXVhbCB0byB0aGUgY29sdW1uIHZhbHVlLiB7QGNvZGUgMH0gaWYgdGhlCisgICAgICogICAgICAgICBjb2x1bW4gaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCBhcyBhIGxvbmcgdmFsdWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBpbmRleCBhcyBhIHtAY29kZSBsb25nfQorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBsb25nIGNvbnRhaW5pbmcgdGhlIGNvbHVtbiB2YWx1ZS4gMCBpZiB0aGUgY29sdW1uIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIGxvbmd9IGVxdWFsIHRvIHRoZSBjb2x1bW4gdmFsdWUuIHtAY29kZSAwfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGNvbHVtbiBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUsIGFzIGEgbG9uZyB2YWx1ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUsIGFzIGEge0Bjb2RlIGxvbmd9CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBsb25nIGNvbnRhaW5pbmcgdGhlIGNvbHVtbiB2YWx1ZS4gMCBpZiB0aGUgY29sdW1uIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgbG9uZ30gZXF1YWwgdG8gdGhlIGNvbHVtbiB2YWx1ZS4ge0Bjb2RlIDB9IGlmIHRoZQorICAgICAqICAgICAgICAgY29sdW1uIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIE1ldGFkYXRhIGZvciB0aGlzIFJlc3VsdFNldC4gVGhpcyBkZWZpbmVzIHRoZSBudW1iZXIsIHR5cGVzIGFuZAotICAgICAqIHByb3BlcnRpZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIFJlc3VsdFNldC4KKyAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBmb3IgdGhpcyB7QGNvZGUgUmVzdWx0U2V0fS4gVGhpcyBkZWZpbmVzIHRoZSBudW1iZXIsCisgICAgICogdHlwZXMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXRNZXRhRGF0YSBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlc3VsdFNldC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFJlc3VsdFNldE1ldGFEYXRhfSBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgUmVzdWx0U2V0fS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0TWV0YURhdGEgZ2V0TWV0YURhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgY29sdW1uIGFzIGEgSmF2YSBPYmplY3QuIFRoZSB0eXBlIG9mIHRoZQotICAgICAqIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHRoZSBkZWZhdWx0IGFjY29yZGluZyB0byB0aGUgY29sdW1uJ3MgU1FMIHR5cGUsCi0gICAgICogZm9sbG93aW5nIHRoZSBKREJDIHNwZWNpZmljYXRpb24gZm9yIGJ1aWx0LWluIHR5cGVzLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIGNvbHVtbiBhcyBhIEphdmEge0Bjb2RlIE9iamVjdH0uIFRoZSB0eXBlCisgICAgICogb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHRoZSBkZWZhdWx0IGFjY29yZGluZyB0byB0aGUgY29sdW1uJ3MgU1FMCisgICAgICogdHlwZSwgZm9sbG93aW5nIHRoZSBKREJDIHNwZWNpZmljYXRpb24gZm9yIGJ1aWx0LWluIHR5cGVzLgogICAgICAqIDxwPgogICAgICAqIEZvciBTUUwgVXNlciBEZWZpbmVkIFR5cGVzLCBpZiBhIGNvbHVtbiB2YWx1ZSBpcyBTdHJ1Y3R1cmVkIG9yIERpc3RpbmN0LAotICAgICAqIHRoaXMgbWV0aG9kIGJlaGF2ZXMgdGhlIHNhbWUgYXMgYSBjYWxsIHRvOiBnZXRPYmplY3QoY29sdW1uSW5kZXgsCi0gICAgICogdGhpcy5nZXRTdGF0ZW1lbnQoKS5nZXRDb25uZWN0aW9uKCkuZ2V0VHlwZU1hcCgpKQorICAgICAqIHRoaXMgbWV0aG9kIGJlaGF2ZXMgdGhlIHNhbWUgYXMgYSBjYWxsIHRvOiB7QGNvZGUKKyAgICAgKiBnZXRPYmplY3QoY29sdW1uSW5kZXgsdGhpcy5nZXRTdGF0ZW1lbnQoKS5nZXRDb25uZWN0aW9uKCkuZ2V0VHlwZU1hcCgpKX0KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhbiBPYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4gbnVsbCBpZiB0aGUgY29sdW1uCi0gICAgICogICAgICAgICB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgT2JqZWN0fSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiB7QGNvZGUKKyAgICAgKiAgICAgICAgIG51bGx9IGlmIHRoZSBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYSBKYXZhIE9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIGluZGV4IGFzIGEgSmF2YSB7QGNvZGUKKyAgICAgKiBPYmplY3R9LgogICAgICAqIDxwPgogICAgICAqIFRoZSB0eXBlIG9mIHRoZSBKYXZhIG9iamVjdCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIHN1cHBsaWVkIE1hcCB0bwotICAgICAqIHBlcmZvcm0gdGhlIG1hcHBpbmcgb2YgU1FMIFN0cnVjdCBvciBEaXN0aW5jdCB0eXBlcyBpbnRvIEphdmEgb2JqZWN0cy4KKyAgICAgKiBwZXJmb3JtIHRoZSBtYXBwaW5nIG9mIFNRTCB7QGNvZGUgU3RydWN0fSBvciBEaXN0aW5jdCB0eXBlcyBpbnRvIEphdmEKKyAgICAgKiBvYmplY3RzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCiAgICAgICogQHBhcmFtIG1hcAotICAgICAqICAgICAgICAgICAgYSBqYXZhLnV0aWwuTWFwIGNvbnRhaW5pbmcgYSBtYXBwaW5nIGZyb20gU1FMIFR5cGUgbmFtZXMgdG8KLSAgICAgKiAgICAgICAgICAgIEphdmEgY2xhc3Nlcy4KLSAgICAgKiBAcmV0dXJuIGFuIE9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiBudWxsIGlmIHRoZSBjb2x1bW4KLSAgICAgKiAgICAgICAgIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgamF2YS51dGlsLk1hcH0gY29udGFpbmluZyBhIG1hcHBpbmcgZnJvbSBTUUwgVHlwZQorICAgICAqICAgICAgICAgICAgbmFtZXMgdG8gSmF2YSBjbGFzc2VzLgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIE9iamVjdH0gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4ge0Bjb2RlCisgICAgICogICAgICAgICBudWxsfSBpZiB0aGUgY29sdW1uIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoaW50IGNvbHVtbkluZGV4LCBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gbWFwKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIGNvbHVtbiBhcyBhIEphdmEgT2JqZWN0LiBUaGUgdHlwZSBvZiB0aGUKLSAgICAgKiByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSB0aGUgZGVmYXVsdCBhY2NvcmRpbmcgdG8gdGhlIGNvbHVtbidzIFNRTCB0eXBlLAotICAgICAqIGZvbGxvd2luZyB0aGUgSkRCQyBzcGVjaWZpY2F0aW9uIGZvciBidWlsdC1pbiB0eXBlcy4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBjb2x1bW4gYXMgYSBKYXZhIHtAY29kZSBPYmplY3R9LiBUaGUgdHlwZQorICAgICAqIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSB0aGUgZGVmYXVsdCBhY2NvcmRpbmcgdG8gdGhlIGNvbHVtbidzIFNRTAorICAgICAqIHR5cGUsIGZvbGxvd2luZyB0aGUgSkRCQyBzcGVjaWZpY2F0aW9uIGZvciBidWlsdC1pbiB0eXBlcy4KICAgICAgKiA8cD4KLSAgICAgKiBGb3IgU1FMIFVzZXIgRGVmaW5lZCBUeXBlcywgaWYgYSBjb2x1bW4gdmFsdWUgaXMgU3RydWN0dXJlZCBvciBEaXN0aW5jdCwKLSAgICAgKiB0aGlzIG1ldGhvZCBiZWhhdmVzIHRoZSBzYW1lIGFzIGEgY2FsbCB0bzogZ2V0T2JqZWN0KGNvbHVtbkluZGV4LAotICAgICAqIHRoaXMuZ2V0U3RhdGVtZW50KCkuZ2V0Q29ubmVjdGlvbigpLmdldFR5cGVNYXAoKSkKKyAgICAgKiBGb3IgU1FMIFVzZXIgRGVmaW5lZCBUeXBlcywgaWYgYSBjb2x1bW4gdmFsdWUgaXMgc3RydWN0dXJlZCBvciBkaXN0aW5jdCwKKyAgICAgKiB0aGlzIG1ldGhvZCBiZWhhdmVzIHRoZSBzYW1lIGFzIGEgY2FsbCB0bzoge0Bjb2RlCisgICAgICogZ2V0T2JqZWN0KGNvbHVtbkluZGV4LHRoaXMuZ2V0U3RhdGVtZW50KCkuZ2V0Q29ubmVjdGlvbigpLmdldFR5cGVNYXAoKSl9CisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGFuIE9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiBudWxsIGlmIHRoZSBjb2x1bW4KLSAgICAgKiAgICAgICAgIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIE9iamVjdH0gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4ge0Bjb2RlCisgICAgICogICAgICAgICBudWxsfSBpZiB0aGUgY29sdW1uIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSBhcyBhIEphdmEgT2JqZWN0LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSBhcyBhIEphdmEge0Bjb2RlCisgICAgICogT2JqZWN0fS4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgSmF2YSBvYmplY3Qgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBzdXBwbGllZCBNYXAgdG8KICAgICAgKiBwZXJmb3JtIHRoZSBtYXBwaW5nIG9mIFNRTCBTdHJ1Y3Qgb3IgRGlzdGluY3QgdHlwZXMgaW50byBKYXZhIG9iamVjdHMuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KICAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogICAgICAgICAgICBhIGphdmEudXRpbC5NYXAgY29udGFpbmluZyBhIG1hcHBpbmcgZnJvbSBTUUwgVHlwZSBuYW1lcyB0bworICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgamF2YS51dGlsLk1hcH0gY29udGFpbmluZyBhIG1hcHBpbmcgZnJvbSBTUUwgVHlwZSBuYW1lcyB0bwogICAgICAqICAgICAgICAgICAgSmF2YSBjbGFzc2VzLgotICAgICAqIEByZXR1cm4gYW4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIG51bGwgaWYgdGhlIGNvbHVtbgotICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgT2JqZWN0fSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiB7QGNvZGUKKyAgICAgKiAgICAgICAgIG51bGx9IGlmIHRoZSBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgY29sdW1uTmFtZSwgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1hcCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gaW5kZXggYXMgYSBKYXZhCi0gICAgICogamF2YS5zcWwuUmVmLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSBKYXZhIHtAY29kZQorICAgICAqIGphdmEuc3FsLlJlZn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgogICAgICAqIEByZXR1cm4gYSBSZWYgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgU1FMIFJFRiBpbiB0aGUgY29sdW1uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlZiBnZXRSZWYoaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUgYXMgYSBKYXZhCi0gICAgICogamF2YS5zcWwuUmVmLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSBhcyBhIEphdmEge0Bjb2RlCisgICAgICogamF2YS5zcWwuUmVmfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIFJlZiByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBTUUwgUkVGIGluIHRoZSBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEgUmVmIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIFNRTCB7QGNvZGUgUkVGfSBpbiB0aGUgY29sdW1uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlZiBnZXRSZWYoU3RyaW5nIGNvbE5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcm93IGluIHRoZSBSZXN1bHRTZXQuIFJvdyBudW1iZXJzIHN0YXJ0IGF0Ci0gICAgICogMSBmb3IgdGhlIGZpcnN0IHJvdy4KKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcm93IGluIHRoZSB7QGNvZGUgUmVzdWx0U2V0fS4gUm93IG51bWJlcnMKKyAgICAgKiBzdGFydCBhdCAxIGZvciB0aGUgZmlyc3Qgcm93LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG51bWJlciBvZiB0aGUgY3VycmVudCByb3cuIDAgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8KLSAgICAgKiAgICAgICAgIGN1cnJlbnQgcm93LgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG51bWJlciBvZiB0aGUgY3VycmVudCByb3cuIHtAY29kZSAwfSBpcyByZXR1cm5lZCBpZgorICAgICAqICAgICAgICAgdGhlcmUgaXMgbm8gY3VycmVudCByb3cuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4IGFzIGEgc2hvcnQgdmFsdWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBpbmRleCBhcyBhIHNob3J0IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBzaG9ydCB2YWx1ZSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiAwIGlmIHRoZSB2YWx1ZQotICAgICAqICAgICAgICAgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSBzaG9ydCB2YWx1ZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4ge0Bjb2RlIDB9IGlmCisgICAgICogICAgICAgICB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUsIGFzIGEgc2hvcnQgdmFsdWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBuYW1lLCBhcyBhIHNob3J0IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgc2hvcnQgdmFsdWUgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4gMCBpZiB0aGUgdmFsdWUKLSAgICAgKiAgICAgICAgIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSBzaG9ydCB2YWx1ZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbi4ge0Bjb2RlIDB9IGlmCisgICAgICogICAgICAgICB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTdGF0ZW1lbnQgdGhhdCBwcm9kdWNlZCB0aGlzIFJlc3VsdFNldC4gSWYgdGhlIFJlc3VsdFNldCB3YXMgbm90Ci0gICAgICogY3JlYXRlZCBieSBhIFN0YXRlbWVudCAoZWcgaXQgd2FzIHJldHVybmVkIGZyb20gb25lIG9mIHRoZQotICAgICAqIERhdGFiYXNlTWV0YURhdGEgbWV0aG9kcyksIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICogR2V0cyB0aGUgc3RhdGVtZW50IHRoYXQgcHJvZHVjZWQgdGhpcyB7QGNvZGUgUmVzdWx0U2V0fS4gSWYgdGhlIHtAY29kZQorICAgICAqIFJlc3VsdFNldH0gd2FzIG5vdCBjcmVhdGVkIGJ5IGEgc3RhdGVtZW50IChpLmUuIGJlY2F1c2UgaXQgd2FzIHJldHVybmVkCisgICAgICogZnJvbSBvbmUgb2YgdGhlIHtAbGluayBEYXRhYmFzZU1ldGFEYXRhfSBtZXRob2RzKSwge0Bjb2RlIG51bGx9IGlzCisgICAgICogcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgU3RhdGVtZW50IHdoaWNoIHByb2R1Y2VkIHRoaXMgUmVzdWx0U2V0LCBvciBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgUmVzdWx0U2V0IHdhcyBub3QgY3JlYXRlZCBieSBhIFN0YXRlbWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBTdGF0ZW1lbnQgd2hpY2ggcHJvZHVjZWQgdGhpcyB7QGNvZGUgUmVzdWx0U2V0fSwgb3Ige0Bjb2RlCisgICAgICogICAgICAgICBudWxsfSBpZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gd2FzIG5vdCBjcmVhdGVkIGJ5IGEgU3RhdGVtZW50LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0U3RhdGVtZW50KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCBhcyBhIFN0cmluZy4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIGluZGV4IGFzIGEgU3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4sIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICBjb2x1bW4gaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4sIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIGNvbHVtbiBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBuYW1lLCBhcyBhIFN0cmluZy4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUsIGFzIGEgU3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLCBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgY29sdW1uIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4sIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIGNvbHVtbiBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4IGFzIGEgamF2YS5zcWwuVGltZQotICAgICAqIHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgVGltZSByZXByZXNlbnRpbmcgdGhlIGNvbHVtbiB2YWx1ZSwgbnVsbCBpZiB0aGUgY29sdW1uIHZhbHVlIGlzCi0gICAgICogICAgICAgICBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIFRpbWUgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gdmFsdWUsIHtAY29kZSBudWxsfSBpZiB0aGUgY29sdW1uCisgICAgICogICAgICAgICB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lIGdldFRpbWUoaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4IGFzIGEgamF2YS5zcWwuVGltZQotICAgICAqIHZhbHVlLiBUaGUgc3VwcGxpZWQgQ2FsZW5kYXIgaXMgdXNlZCB0byBtYXAgYmV0d2VlbiB0aGUgU1FMIFRpbWUgdmFsdWUKLSAgICAgKiBhbmQgdGhlIEphdmEgVGltZSB2YWx1ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIGluZGV4IGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuVGltZX0gdmFsdWUuIFRoZSBzdXBwbGllZCB7QGNvZGUgQ2FsZW5kYXJ9IGlzIHVzZWQgdG8gCisgICAgICogbWFwIHRoZSBTUUwge0Bjb2RlIFRpbWV9IHZhbHVlIHRvIGEgSmF2YSBUaW1lIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZC4KICAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICBhIENhbGVuZGFyIHRvIHVzZSBpbiBjcmVhdGluZyB0aGUgSmF2YSBUaW1lIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBUaW1lIHJlcHJlc2VudGluZyB0aGUgY29sdW1uIHZhbHVlLCBudWxsIGlmIHRoZSBjb2x1bW4gdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgQ2FsZW5kYXJ9IHRvIHVzZSBpbiBjcmVhdGluZyB0aGUgSmF2YSBUaW1lIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBUaW1lIHJlcHJlc2VudGluZyB0aGUgY29sdW1uIHZhbHVlLCB7QGNvZGUgbnVsbH0gaWYgdGhlIGNvbHVtbgorICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZSBnZXRUaW1lKGludCBjb2x1bW5JbmRleCwgQ2FsZW5kYXIgY2FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUsIGFzIGEgamF2YS5zcWwuVGltZQotICAgICAqIHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSwgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIFRpbWUgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gdmFsdWUsIG51bGwgaWYgdGhlIGNvbHVtbiB2YWx1ZSBpcwotICAgICAqICAgICAgICAgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgY29sdW1uIHZhbHVlLCB7QGNvZGUgbnVsbH0gaWYgdGhlIGNvbHVtbiB2YWx1ZSBpcyBTUUwge0Bjb2RlCisgICAgICogICAgICAgICBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZSBnZXRUaW1lKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4LCBhcyBhCi0gICAgICogamF2YS5zcWwuVGltZSB2YWx1ZS4gVGhlIHN1cHBsaWVkIENhbGVuZGFyIGlzIHVzZWQgdG8gbWFwIGJldHdlZW4gdGhlIFNRTAotICAgICAqIFRpbWUgdmFsdWUgYW5kIHRoZSBKYXZhIFRpbWUgdmFsdWUuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBpbmRleCwgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lfSB2YWx1ZS4gVGhlIHN1cHBsaWVkIHtAY29kZSBDYWxlbmRhcn0gaXMgdXNlZCB0byAKKyAgICAgKiBtYXAgdGhlIFNRTCB7QGNvZGUgVGltZX0gdmFsdWUgdG8gYSBKYXZhIFRpbWUgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEgQ2FsZW5kYXIgdG8gdXNlIGluIGNyZWF0aW5nIHRoZSBKYXZhIFRpbWUgdmFsdWUuCi0gICAgICogQHJldHVybiBhIFRpbWUgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gdmFsdWUsIG51bGwgaWYgdGhlIGNvbHVtbiB2YWx1ZSBpcwotICAgICAqICAgICAgICAgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBDYWxlbmRhcn0gdG8gdXNlIGluIGNyZWF0aW5nIHRoZSBKYXZhIHRpbWUgdmFsdWUuCisgICAgICogQHJldHVybiBhIFRpbWUgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gdmFsdWUsIHtAY29kZSBudWxsfSBpZiB0aGUgY29sdW1uCisgICAgICogICAgICAgICB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lIGdldFRpbWUoU3RyaW5nIGNvbHVtbk5hbWUsIENhbGVuZGFyIGNhbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCBhcyBhCi0gICAgICogamF2YS5zcWwuVGltZXN0YW1wIHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lc3RhbXB9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBUaW1lc3RhbXAgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gdmFsdWUsIG51bGwgaWYgdGhlIGNvbHVtbgotICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB0aW1lc3RhbXAgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gdmFsdWUsIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGNvbHVtbiB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBpbmRleCwgYXMgYQotICAgICAqIGphdmEuc3FsLlRpbWVzdGFtcCB2YWx1ZS4gVGhlIHN1cHBsaWVkIENhbGVuZGFyIGlzIHVzZWQgdG8gbWFwIGJldHdlZW4KLSAgICAgKiB0aGUgU1FMIFRpbWVzdGFtcCB2YWx1ZSBhbmQgdGhlIEphdmEgVGltZXN0YW1wIHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXgsIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuVGltZXN0YW1wfSB2YWx1ZS4gVGhlIHN1cHBsaWVkIENhbGVuZGFyIGlzIHVzZWQgd2hlbiBtYXBwaW5nCisgICAgICogdGhlIFNRTCB7QGNvZGUgVGltZXN0YW1wfSB2YWx1ZSB0byBhIEphdmEge0Bjb2RlIFRpbWVzdGFtcH0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIENhbGVuZGFyIHRvIHVzZSBpbiBjcmVhdGluZyB0aGUgSmF2YSBUaW1lc3RhbXAgdmFsdWUuCi0gICAgICogQHJldHVybiBhIFRpbWVzdGFtcCByZXByZXNlbnRpbmcgdGhlIGNvbHVtbiB2YWx1ZSwgbnVsbCBpZiB0aGUgY29sdW1uCi0gICAgICogICAgICAgICB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIENhbGVuZGFyIHRvIHVzZSBpbiBjcmVhdGluZyB0aGUgSmF2YSB0aW1lc3RhbXAgdmFsdWUuCisgICAgICogQHJldHVybiBhIHRpbWVzdGFtcCByZXByZXNlbnRpbmcgdGhlIGNvbHVtbiB2YWx1ZSwge0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqICAgICAgICAgY29sdW1uIHZhbHVlIGlzIFNRTCBOVUxMLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKGludCBjb2x1bW5JbmRleCwgQ2FsZW5kYXIgY2FsKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBhcyBhIGNvbHVtbiBuYW1lLCBhcyBhCi0gICAgICogamF2YS5zcWwuVGltZXN0YW1wIHZhbHVlLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSwgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lc3RhbXB9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGEgVGltZXN0YW1wIHJlcHJlc2VudGluZyB0aGUgY29sdW1uIHZhbHVlLCBudWxsIGlmIHRoZSBjb2x1bW4KLSAgICAgKiAgICAgICAgIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYSB0aW1lc3RhbXAgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gdmFsdWUsIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGNvbHVtbiB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIG5hbWUsIGFzIGEKLSAgICAgKiBqYXZhLnNxbC5UaW1lc3RhbXAgdmFsdWUuIFRoZSBzdXBwbGllZCBDYWxlbmRhciBpcyB1c2VkIHRvIG1hcCBiZXR3ZWVuCi0gICAgICogdGhlIFNRTCBUaW1lc3RhbXAgdmFsdWUgYW5kIHRoZSBKYXZhIFRpbWVzdGFtcCB2YWx1ZS4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUsIGFzIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuVGltZXN0YW1wfSB2YWx1ZS4gVGhlIHN1cHBsaWVkIENhbGVuZGFyIGlzIHVzZWQgd2hlbiBtYXBwaW5nCisgICAgICogdGhlIFNRTCB7QGNvZGUgVGltZXN0YW1wfSB2YWx1ZSB0byBhIEphdmEge0Bjb2RlIFRpbWVzdGFtcH0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIENhbGVuZGFyIHRvIHVzZSBpbiBjcmVhdGluZyB0aGUgSmF2YSBUaW1lc3RhbXAgdmFsdWUuCi0gICAgICogQHJldHVybiBhIFRpbWVzdGFtcCByZXByZXNlbnRpbmcgdGhlIGNvbHVtbiB2YWx1ZSwgbnVsbCBpZiB0aGUgY29sdW1uCi0gICAgICogICAgICAgICB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIENhbGVuZGFyIHRvIHVzZSBpbiBjcmVhdGluZyB0aGUgSmF2YSB7QGNvZGUgVGltZXN0YW1wfSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgdGltZXN0YW1wIHJlcHJlc2VudGluZyB0aGUgY29sdW1uIHZhbHVlLCB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChTdHJpbmcgY29sdW1uTmFtZSwgQ2FsZW5kYXIgY2FsKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIFJlc3VsdFNldC4KKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSB7QGNvZGUgUmVzdWx0U2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBSZXN1bHRTZXQgdHlwZSwgb25lIG9mOiBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFksCi0gICAgICogICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUsIG9yCi0gICAgICogICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFCisgICAgICogQHJldHVybiBUaGUge0Bjb2RlIFJlc3VsdFNldH0gdHlwZSwgb25lIG9mOgorICAgICAqICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgPGxpPntAY29kZSBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFl9PC9saT4gPGxpPntAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFfTwvbGk+IDxsaT57QGNvZGUKKyAgICAgKiAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkV9PC9saT4KKyAgICAgKiAgICAgICAgIDwvdWw+CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBhcyBhbiB7QGNvZGUgSW5wdXRTdHJlYW19IG9mIHVuaWNvZGUKKyAgICAgKiBjaGFyYWN0ZXJzLgorICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldENoYXJhY3RlclN0cmVhbX0uCi0gICAgICogICAgICAgICAgICAgPHA+Ci0gICAgICogICAgICAgICAgICAgR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBhcyBhbiBJbnB1dFN0cmVhbSBvZiBVbmljb2RlCi0gICAgICogICAgICAgICAgICAgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQKLSAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4uIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICBjb2x1bW4gdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiB7QGNvZGUKKyAgICAgKiAgICAgICAgIG51bGx9IGlmIHRoZSBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gYXMgYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBvZiBVbmljb2RlCisgICAgICogY2hhcmFjdGVycy4KKyAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGFyYWN0ZXJTdHJlYW19Ci0gICAgICogICAgICAgICAgICAgPHA+Ci0gICAgICogICAgICAgICAgICAgR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBhcyBhbiBJbnB1dFN0cmVhbSBvZiBVbmljb2RlCi0gICAgICogICAgICAgICAgICAgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgY29sdW1uIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiB7QGNvZGUKKyAgICAgKiAgICAgICAgIG51bGx9IGlmIHRoZSBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjb2x1bW4gc3BlY2lmaWVkIGFzIGEgY29sdW1uIGluZGV4IGFzIGEgamF2YS5uZXQuVVJMLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gaW5kZXggYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLm5ldC5VUkx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmVhZAotICAgICAqIEByZXR1cm4gYSBVUkwuIG51bGwgaWYgdGhlIGNvbHVtbiB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBhIFVSTC4ge0Bjb2RlIG51bGx9IGlmIHRoZSBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMIGdldFVSTChpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYXMgYSBjb2x1bW4gbmFtZSBhcyBhIGphdmEubmV0LlVSTAotICAgICAqIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgY29sdW1uIG5hbWUgYXMgYSB7QGNvZGUKKyAgICAgKiBqYXZhLm5ldC5VUkx9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkCi0gICAgICogQHJldHVybiBhIFVSTC4gbnVsbCBpZiB0aGUgY29sdW1uIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiB2YXVsZSBhcyBhIFVSTC4ge0Bjb2RlIG51bGx9IGlmIHRoZSBjb2x1bW4gdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVVJMIGdldFVSTChTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IHdhcm5pbmcgZ2VuZXJhdGVkIGJ5IGNhbGxzIG9uIHRoaXMgUmVzdWx0U2V0LiBTdWJzZXF1ZW50Ci0gICAgICogd2FybmluZ3Mgb24gdGhpcyBSZXN1bHRTZXQgYXJlIGNoYWluZWQgdG8gdGhlIGZpcnN0IG9uZS4KKyAgICAgKiBHZXRzIHRoZSBmaXJzdCB3YXJuaW5nIGdlbmVyYXRlZCBieSBjYWxscyBvbiB0aGlzIHtAY29kZSBSZXN1bHRTZXR9LgorICAgICAqIFN1YnNlcXVlbnQgd2FybmluZ3Mgb24gdGhpcyB7QGNvZGUgUmVzdWx0U2V0fSBhcmUgY2hhaW5lZCB0byB0aGUgZmlyc3QKKyAgICAgKiBvbmUuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHdhcm5pbmdzIGFyZSBjbGVhcmVkIHdoZW4gYSBuZXcgUm93IGlzIHJlYWQgZnJvbSB0aGUgUmVzdWx0U2V0LiBUaGUKLSAgICAgKiB3YXJuaW5ncyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBhcmUgb25seSB0aGUgd2FybmluZ3MgZ2VuZXJhdGVkIGJ5Ci0gICAgICogUmVzdWx0U2V0IG1ldGhvZCBjYWxscyAtIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBTdGF0ZW1lbnQgbWV0aG9kcyBhcmUgaGVsZAotICAgICAqIGJ5IHRoZSBTdGF0ZW1lbnQuCisgICAgICogVGhlIHdhcm5pbmdzIGFyZSBjbGVhcmVkIHdoZW4gYSBuZXcgUm93IGlzIHJlYWQgZnJvbSB0aGUge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fS4gVGhlIHdhcm5pbmdzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGFyZSBvbmx5IHRoZSB3YXJuaW5ncworICAgICAqIGdlbmVyYXRlZCBieSB7QGNvZGUgUmVzdWx0U2V0fSBtZXRob2QgY2FsbHMgLSB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkKKyAgICAgKiBTdGF0ZW1lbnQgbWV0aG9kcyBhcmUgaGVsZCBieSB0aGUgU3RhdGVtZW50LgogICAgICAqIDxwPgotICAgICAqIEFuIFNRTEV4Y2VwdGlvbiBpcyBnZW5lcmF0ZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGEgY2xvc2VkCi0gICAgICogUmVzdWx0U2V0LgorICAgICAqIDwvcD4KKyAgICAgKiBBbiB7QGNvZGUgU1FMRXhjZXB0aW9ufSBpcyBnZW5lcmF0ZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGEgY2xvc2VkCisgICAgICoge0Bjb2RlIFJlc3VsdFNldH0uIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIFNRTFdhcm5pbmcgd2hpY2ggaXMgdGhlIGZpcnN0IHdhcm5pbmcgZm9yIHRoaXMgUmVzdWx0U2V0LiBudWxsCi0gICAgICogICAgICAgICBpZiB0aGVyZSBhcmUgbm8gd2FybmluZ3MuCisgICAgICogQHJldHVybiBhbiBTUUxXYXJuaW5nIHdoaWNoIGlzIHRoZSBmaXJzdCB3YXJuaW5nIGZvciB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0fS4ge0Bjb2RlIG51bGx9IGlmIHRoZXJlIGFyZSBubyB3YXJuaW5ncy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1FMV2FybmluZyBnZXRXYXJuaW5ncygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBJbnNlcnQgdGhlIGluc2VydCByb3cgaW50byB0aGUgUmVzdWx0U2V0IGFuZCBpbnRvIHRoZSB1bmRlcmx5aW5nCi0gICAgICogZGF0YWJhc2UuIFRoZSBDdXJzb3IgbXVzdCBiZSBzZXQgdG8gdGhlIEluc2VydCBSb3cgYmVmb3JlIHRoaXMgbWV0aG9kIGlzCisgICAgICogSW5zZXJ0IHRoZSBpbnNlcnQgcm93IGludG8gdGhlIHtAY29kZSBSZXN1bHRTZXR9IGFuZCBpbnRvIHRoZSB1bmRlcmx5aW5nCisgICAgICogZGF0YWJhc2UuIFRoZSBjdXJzb3IgbXVzdCBiZSBzZXQgdG8gdGhlIEluc2VydCBSb3cgYmVmb3JlIHRoaXMgbWV0aG9kIGlzCiAgICAgICogaW52b2tlZC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4gUGFydGljdWxhciBjYXNlcyBpbmNsdWRlIHRoZQotICAgICAqICAgICAgICAgICAgIEN1cnNvciBub3QgYmVpbmcgb24gdGhlIEluc2VydCBSb3cgb3IgaWYgYW55IENvbHVtbnMgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgUm93IGRvIG5vdCBoYXZlIGEgdmFsdWUgd2hlcmUgdGhlIGNvbHVtbiBpcyBkZWNsYXJlZCBhcworICAgICAqICAgICAgICAgICAgIGN1cnNvciBub3QgYmVpbmcgb24gdGhlIEluc2VydCBSb3cgb3IgaWYgYW55IGNvbHVtbnMgaW4gdGhlCisgICAgICogICAgICAgICAgICAgcm93IGRvIG5vdCBoYXZlIGEgdmFsdWUgd2hlcmUgdGhlIGNvbHVtbiBpcyBkZWNsYXJlZCBhcwogICAgICAqICAgICAgICAgICAgIG5vdC1udWxsYWJsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnNlcnRSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSBsYXN0IHJvdyBvZiB0aGUgUmVzdWx0U2V0LgorICAgICAqIEdldHMgaWYgdGhlIGN1cnNvciBpcyBhZnRlciB0aGUgbGFzdCByb3cgb2YgdGhlIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQ3Vyc29yIGlzIGFmdGVyIHRoZSBsYXN0IFJvdyBpbiB0aGUgUmVzdWx0U2V0LCBmYWxzZQotICAgICAqICAgICAgICAgaWYgdGhlIGN1cnNvciBpcyBhdCBhbnkgb3RoZXIgcG9zaXRpb24gaW4gdGhlIFJlc3VsdFNldC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSBsYXN0IHJvdyBpbiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBSZXN1bHRTZXR9LCB7QGNvZGUgZmFsc2V9IGlmIHRoZSBjdXJzb3IgaXMgYXQgYW55IG90aGVyIHBvc2l0aW9uCisgICAgICogICAgICAgICBpbiB0aGUge0Bjb2RlIFJlc3VsdFNldH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBpZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3Qgcm93IG9mIHRoZSBSZXN1bHRTZXQuCisgICAgICogR2V0cyBpZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3Qgcm93IG9mIHRoZSB7QGNvZGUgUmVzdWx0U2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEN1cnNvciBpcyBiZWZvcmUgdGhlIGxhc3QgUm93IGluIHRoZSBSZXN1bHRTZXQsIGZhbHNlCi0gICAgICogICAgICAgICBpZiB0aGUgY3Vyc29yIGlzIGF0IGFueSBvdGhlciBwb3NpdGlvbiBpbiB0aGUgUmVzdWx0U2V0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjdXJzb3IgaXMgYmVmb3JlIHRoZSBmaXJzdCByb3cgaW4gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0fSwge0Bjb2RlIGZhbHNlfSBpZiB0aGUgY3Vyc29yIGlzIGF0IGFueSBvdGhlciBwb3NpdGlvbgorICAgICAqICAgICAgICAgaW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlRmlyc3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBpZiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBmaXJzdCByb3cgb2YgdGhlIFJlc3VsdFNldC4KKyAgICAgKiBHZXRzIGlmIHRoZSBjdXJzb3IgaXMgb24gdGhlIGZpcnN0IHJvdyBvZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBDdXJzb3IgaXMgb24gdGhlIGZpcnN0IFJvdyBpbiB0aGUgUmVzdWx0U2V0LCBmYWxzZSBpZgotICAgICAqICAgICAgICAgdGhlIGN1cnNvciBpcyBhdCBhbnkgb3RoZXIgcG9zaXRpb24gaW4gdGhlIFJlc3VsdFNldC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBmaXJzdCByb3cgaW4gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0fSwge0Bjb2RlIGZhbHNlfSBpZiB0aGUgY3Vyc29yIGlzIGF0IGFueSBvdGhlciBwb3NpdGlvbgorICAgICAqICAgICAgICAgaW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlyc3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBpZiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBsYXN0IHJvdyBvZiB0aGUgUmVzdWx0U2V0CisgICAgICogR2V0cyBpZiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBsYXN0IHJvdyBvZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEN1cnNvciBpcyBvbiB0aGUgbGFzdCBSb3cgaW4gdGhlIFJlc3VsdFNldCwgZmFsc2UgaWYKLSAgICAgKiAgICAgICAgIHRoZSBjdXJzb3IgaXMgYXQgYW55IG90aGVyIHBvc2l0aW9uIGluIHRoZSBSZXN1bHRTZXQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGN1cnNvciBpcyBvbiB0aGUgbGFzdCByb3cgaW4gdGhlIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0fSwge0Bjb2RlIGZhbHNlfSBpZiB0aGUgY3Vyc29yIGlzIGF0IGFueSBvdGhlciBwb3NpdGlvbgorICAgICAqICAgICAgICAgaW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzTGFzdCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTaGlmdHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byB0aGUgbGFzdCByb3cgb2YgdGhlIFJlc3VsdFNldC4KKyAgICAgKiBTaGlmdHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byB0aGUgbGFzdCByb3cgb2YgdGhlIHtAY29kZSBSZXN1bHRTZXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGluIGEgbGVnaXRpbWF0ZSByb3csIGZhbHNlIGlmIHRoZQotICAgICAqICAgICAgICAgUmVzdWx0U2V0IGNvbnRhaW5zIG5vIHJvd3MuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBpbiBhIGxlZ2l0aW1hdGUgcm93LCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBpZiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gY29udGFpbnMgbm8gcm93cy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGxhc3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcmVtZW1iZXJlZCBwb3NpdGlvbiwgdXN1YWxseSB0aGUgY3VycmVudCByb3cuCi0gICAgICogVGhpcyBvbmx5IGFwcGxpZXMgaWYgdGhlIGN1cnNvciBpcyBvbiB0aGUgSW5zZXJ0IHJvdy4KKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSByZW1lbWJlcmVkIHBvc2l0aW9uLCBuYW1lbHkgdGhlIAorICAgICAqIHJvdyB0aGF0IHdhcyB0aGUgY3VycmVudCByb3cgYmVmb3JlIGEgY2FsbCB0byB7QGNvZGUgbW92ZVRvSW5zZXJ0Um93fS4KKyAgICAgKiBUaGlzIG9ubHkgYXBwbGllcyBpZiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBJbnNlcnQgUm93LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG1vdmVUb0N1cnJlbnRSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byB0aGUgSW5zZXJ0IHJvdy4gVGhlIGN1cnJlbnQgcG9zaXRpb24gaXMKLSAgICAgKiByZW1lbWJlcmVkIGFuZCB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgdGhlIEluc2VydCByb3cuIFRoZSBjb2x1bW5zIGluCi0gICAgICogdGhlIEluc2VydCByb3cgc2hvdWxkIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSB1cGRhdGUgbWV0aG9kcywKLSAgICAgKiBiZWZvcmUgY2FsbGluZyA8Y29kZT5pbnNlcnRSb3c8L2NvZGU+IHRvIGluc2VydCB0aGUgbmV3IHJvdyBpbnRvIHRoZQotICAgICAqIGRhdGFiYXNlLgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIEluc2VydCBSb3cuIFRoZSBjdXJyZW50IHBvc2l0aW9uIGlzCisgICAgICogcmVtZW1iZXJlZCBhbmQgdGhlIGN1cnNvciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBJbnNlcnQgUm93LiBUaGUgY29sdW1ucyBpbgorICAgICAqIHRoZSBJbnNlcnQgUm93IHNob3VsZCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgYXBwcm9wcmlhdGUgdXBkYXRlIG1ldGhvZHMsCisgICAgICogYmVmb3JlIGNhbGxpbmcge0Bjb2RlIGluc2VydFJvd30gdG8gaW5zZXJ0IHRoZSBuZXcgcm93IGludG8gdGhlIGRhdGFiYXNlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG1vdmVUb0luc2VydFJvdygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTaGlmdHMgdGhlIGN1cnNvciBwb3NpdGlvbiBkb3duIG9uZSByb3cgaW4gdGhpcyBSZXN1bHRTZXQgb2JqZWN0LgorICAgICAqIFNoaWZ0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIGRvd24gb25lIHJvdyBpbiB0aGlzIHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdC4KICAgICAgKiA8cD4KLSAgICAgKiBBbnkgSW5wdXRTdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCByb3cgYXJlIGNsb3NlZCBhbmQgYW55CisgICAgICogQW55IGlucHV0IHN0cmVhbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHJvdyBhcmUgY2xvc2VkIGFuZCBhbnkKICAgICAgKiB3YXJuaW5ncyBhcmUgY2xlYXJlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB1cGRhdGVkIGN1cnNvciBwb3NpdGlvbiBpcyBwb2ludGluZyB0byBhIHZhbGlkIHJvdywKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZSAoaWUgd2hlbiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSBsYXN0IHJvdyBpbiB0aGUKLSAgICAgKiAgICAgICAgIFJlc3VsdFNldCkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHVwZGF0ZWQgY3Vyc29yIHBvc2l0aW9uIGlzIHBvaW50aW5nIHRvIGEKKyAgICAgKiAgICAgICAgIHZhbGlkIHJvdywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UgKGkuZS4gd2hlbiB0aGUgY3Vyc29yIGlzIGFmdGVyCisgICAgICogICAgICAgICB0aGUgbGFzdCByb3cgaW4gdGhlIHtAY29kZSBSZXN1bHRTZXR9KS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlbG9jYXRlcyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSBwcmVjZWRpbmcgcm93IGluIHRoaXMgUmVzdWx0U2V0LgorICAgICAqIFJlbG9jYXRlcyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSBwcmVjZWRpbmcgcm93IGluIHRoaXMge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBpbiBhIGxlZ2l0aW1hdGUgcm93LCBmYWxzZSBpZiB0aGUKLSAgICAgKiAgICAgICAgIGN1cnNvciBpcyBub3cgYmVmb3JlIHRoZSBmaXJzdCByb3cuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBpbiBhIGxlZ2l0aW1hdGUgcm93LCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBpZiB0aGUgY3Vyc29yIGlzIG5vdyBiZWZvcmUgdGhlIGZpcnN0IHJvdy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwcmV2aW91cygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZWZyZXNoZXMgdGhlIGN1cnJlbnQgcm93IHdpdGggaXRzIG1vc3QgdXAgdG8gZGF0ZSB2YWx1ZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgICogTXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGN1cnNvciBpcyBvbiB0aGUgSW5zZXJ0IHJvdy4KKyAgICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBJbnNlcnQgUm93LgogICAgICAqIDxwPgotICAgICAqIElmIGFueSBjb2x1bW5zIGluIHRoZSBjdXJyZW50IHJvdyBoYXZlIGJlZW4gdXBkYXRlZCBidXQgdGhlCi0gICAgICogPGNvZGU+dXBkYXRlUm93PC9jb2RlPiBoYXMgbm90IGJlZW4gY2FsbGVkLCB0aGVuIHRoZSB1cGRhdGVzIGFyZSBsb3N0Ci0gICAgICogd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogSWYgYW55IGNvbHVtbnMgaW4gdGhlIGN1cnJlbnQgcm93IGhhdmUgYmVlbiB1cGRhdGVkIGJ1dCB0aGUge0Bjb2RlCisgICAgICogdXBkYXRlUm93fSBoYXMgbm90IGJlZW4gY2FsbGVkLCB0aGVuIHRoZSB1cGRhdGVzIGFyZSBsb3N0IHdoZW4gdGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLCBpbmNsdWRpbmcgaWYgdGhlIGN1cnJlbnQgcm93IGlzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLiwgaW5jbHVkaW5nIGlmIHRoZSBjdXJyZW50IHJvdyBpcwogICAgICAqICAgICAgICAgICAgIHRoZSBJbnNlcnQgcm93LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogTW92ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiB1cCBvciBkb3duIGJ5IGEgc3BlY2lmaWVkIG51bWJlciBvZiByb3dzLiBJZgotICAgICAqIHRoZSBuZXcgcG9zaXRpb24gaXMgYmV5b25kIHRoZSBzdGFydCBvciBlbmQgcm93cywgdGhlIGN1cnNvciBwb3NpdGlvbiBpcwotICAgICAqIHNldCBiZWZvcmUgdGhlIGZpcnN0IHJvdy9hZnRlciB0aGUgbGFzdCByb3cuCisgICAgICogdGhlIG5ldyBwb3NpdGlvbiBpcyBiZXlvbmQgdGhlIHN0YXJ0IHJvdyAob3IgZW5kIHJvdyksIHRoZSBjdXJzb3IgcG9zaXRpb24gaXMKKyAgICAgKiBzZXQgYmVmb3JlIHRoZSBmaXJzdCByb3cgKG9yLCByZXNwZWN0aXZlbHksIGFmdGVyIHRoZSBsYXN0IHJvdykuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJvd3MKICAgICAgKiAgICAgICAgICAgIGEgbnVtYmVyIG9mIHJvd3MgdG8gbW92ZSB0aGUgY3Vyc29yIC0gbWF5IGJlIHBvc2l0aXZlIG9yCiAgICAgICogICAgICAgICAgICBuZWdhdGl2ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbiBpcyBvbiBhIHJvdywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5ldyBjdXJzb3IgcG9zaXRpb24gaXMgb24gYSByb3csIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZQogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbGF0aXZlKGludCByb3dzKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xMjE0LDEwICsxMzg5LDExIEBACiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYSByb3cgaGFzIGJlZW4gZGVsZXRlZC4gVGhpcyBtZXRob2QgZGVwZW5kcyBvbiB3aGV0aGVyCiAgICAgICogdGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjYW4gZGV0ZWN0IGRlbGV0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSByb3cgaGFzIGJlZW4gZGVsZXRlZCBhbmQgaWYgZGVsZXRpb25zIGFyZSBkZXRlY3RlZCwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHJvdyBoYXMgYmVlbiBkZWxldGVkIGFuZCBpZiBkZWxldGlvbnMgYXJlCisgICAgICogICAgICAgICBkZXRlY3RlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcm93RGVsZXRlZCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTEyMjYsMTAgKzE0MDIsMTEgQEAKICAgICAgKiBtZXRob2QgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBKREJDIGRyaXZlciBhbmQgZGF0YWJhc2UgY2FuIGRldGVjdAogICAgICAqIGluc2VydGlvbnMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgcm93IGhhcyBiZWVuIGluc2VydGVkIGFuZCBpZiBpbnNlcnRpb25zIGFyZSBkZXRlY3RlZCwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHJvdyBoYXMgYmVlbiBpbnNlcnRlZCBhbmQgaWYgaW5zZXJ0aW9ucyBhcmUKKyAgICAgKiAgICAgICAgIGRldGVjdGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByb3dJbnNlcnRlZCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTEyMzcsNjEgKzE0MTQsNzAgQEAKICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCByb3cgaGFzIGJlZW4gdXBkYXRlZC4gVGhpcyBtZXRob2QgZGVwZW5kcwogICAgICAqIG9uIHdoZXRoZXIgdGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjYW4gZGV0ZWN0IHVwZGF0ZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHJvdyBoYXMgYmVlbiB1cGRhdGVkIGFuZCBpZiB1cGRhdGVzIGNhbiBiZQotICAgICAqICAgICAgICAgZGV0ZWN0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY3VycmVudCByb3cgaGFzIGJlZW4gdXBkYXRlZCBhbmQgaWYgdXBkYXRlcworICAgICAqICAgICAgICAgY2FuIGJlIGRldGVjdGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByb3dVcGRhdGVkKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGljaCBkaXJlY3Rpb24gKGZvcndhcmQvcmV2ZXJzZSkgd2lsbCBiZSB1c2VkIHRvIHByb2Nlc3MgdGhlCi0gICAgICogcm93cyBvZiB0aGlzIFJlc3VsdFNldCBvYmplY3QuIFRoaXMgaXMgdHJlYXRlZCBhcyBhIGhpbnQgYnkgdGhlIEpEQkMKLSAgICAgKiBkcml2ZXIuCisgICAgICogcm93cyBvZiB0aGlzIHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdC4gVGhpcyBpcyB0cmVhdGVkIGFzIGEgaGludCBieSB0aGUKKyAgICAgKiBKREJDIGRyaXZlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uCi0gICAgICogICAgICAgICAgICBjYW4gYmUgUmVzdWx0U2V0LkZFVENIX0ZPUldBUkQsIFJlc3VsdFNldC5GRVRDSF9SRVZFUlNFLCBvcgotICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LkZFVENIX1VOS05PV04KKyAgICAgKiAgICAgICAgICAgIGNhbiBiZSB7QGNvZGUgUmVzdWx0U2V0LkZFVENIX0ZPUldBUkR9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5GRVRDSF9SRVZFUlNFfSwgb3Ige0Bjb2RlIFJlc3VsdFNldC5GRVRDSF9VTktOT1dOfQogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oaW50IGRpcmVjdGlvbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgYW1vdW50IG9mIHJvd3MgdG8gZmV0Y2ggZnJvbSB0aGUgZGF0YWJhc2Ugd2hlbiBleHRyYSByb3dzCi0gICAgICogYXJlIHJlcXVpcmVkIGZvciB0aGlzIFJlc3VsdFNldC4gVGhpcyB1c2VkIGFzIGEgaGludCB0byB0aGUgSkRCQyBkcml2ZXIuCisgICAgICogSW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBmcm9tIHRoZSBkYXRhYmFzZSB3aGVuIGV4dHJhIHJvd3MKKyAgICAgKiBhcmUgcmVxdWlyZWQgZm9yIHRoaXMge0Bjb2RlIFJlc3VsdFNldH0uIFRoaXMgdXNlZCBhcyBhIGhpbnQgdG8gdGhlIEpEQkMKKyAgICAgKiBkcml2ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJvd3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaC4gMCBpbXBsaWVzIHRoYXQgdGhlIEpEQkMgZHJpdmVyCi0gICAgICogICAgICAgICAgICBjYW4gbWFrZSBpdHMgb3duIGRlY2lzaW9uIGFib3V0IHRoZSBmZXRjaCBzaXplLiBUaGUgbnVtYmVyCi0gICAgICogICAgICAgICAgICBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cwotICAgICAqICAgICAgICAgICAgZXN0YWJsaXNoZWQgYnkgdGhlIFN0YXRlbWVudCB0aGF0IGdlbmVyYXRlZCB0aGUgUmVzdWx0U2V0LgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoLiB7QGNvZGUgMH0gaW1wbGllcyB0aGF0IHRoZSBKREJDCisgICAgICogICAgICAgICAgICBkcml2ZXIgY2FuIG1ha2UgaXRzIG93biBkZWNpc2lvbiBhYm91dCB0aGUgZmV0Y2ggc2l6ZS4gVGhlCisgICAgICogICAgICAgICAgICBudW1iZXIgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MKKyAgICAgKiAgICAgICAgICAgIGVzdGFibGlzaGVkIGJ5IHRoZSBzdGF0ZW1lbnQgdGhhdCBnZW5lcmF0ZWQgdGhlIHtAY29kZQorICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0fS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGZXRjaFNpemUoaW50IHJvd3MpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEgamF2YS5zcWwuQXJyYXkgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLkFycmF5fSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlQXJyYXkoaW50IGNvbHVtbkluZGV4LCBBcnJheSB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEgamF2YS5zcWwuQXJyYXkgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEge0Bjb2RlIGphdmEuc3FsLkFycmF5fQorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBcnJheShTdHJpbmcgY29sdW1uTmFtZSwgQXJyYXkgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMTI5OSwxMyArMTQ4NSwxNCBAQAogICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYW4gQVNDSUkgc3RyZWFtIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCiAgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIHdyaXRlIGZyb20gdGhlIHN0cmVhbQogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFzY2lpU3RyZWFtKGludCBjb2x1bW5JbmRleCwgSW5wdXRTdHJlYW0geCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC0xMzE0LDQxICsxNTAxLDQ0IEBACiAgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGFuIEFzY2lpIHN0cmVhbSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHBhcmFtIGxlbmd0aAogICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byB3cml0ZSBmcm9tIHRoZSBzdHJlYW0KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBc2NpaVN0cmVhbShTdHJpbmcgY29sdW1uTmFtZSwgSW5wdXRTdHJlYW0geCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEgamF2YS5zcWwuQmlnRGVjaW1hbAotICAgICAqIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5CaWdEZWNpbWFsfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlQmlnRGVjaW1hbChpbnQgY29sdW1uSW5kZXgsIEJpZ0RlY2ltYWwgeCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSBqYXZhLnNxbC5CaWdEZWNpbWFsCi0gICAgICogdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuQmlnRGVjaW1hbH0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJpZ0RlY2ltYWwoU3RyaW5nIGNvbHVtbk5hbWUsIEJpZ0RlY2ltYWwgeCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC0xMzU3LDEyICsxNTQ3LDE0IEBACiAgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIGJpbmFyeSBzdHJlYW0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBmcm9tIHRoZSB0aGUgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJpbmFyeVN0cmVhbShpbnQgY29sdW1uSW5kZXgsIElucHV0U3RyZWFtIHgsIGludCBsZW5ndGgpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtMTM3MSw5NiArMTU2MywxMTAgQEAKICAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSBiaW5hcnkgc3RyZWFtIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICBoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBmcm9tIHRoZSB0aGUgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJpbmFyeVN0cmVhbShTdHJpbmcgY29sdW1uTmFtZSwgSW5wdXRTdHJlYW0geCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEgamF2YS5zcWwuQmxvYiB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEge0Bjb2RlIGphdmEuc3FsLkJsb2J9CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBCbG9iIHgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSBqYXZhLnNxbC5CbG9iIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIHtAY29kZSBqYXZhLnNxbC5CbG9ifQorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVCbG9iKFN0cmluZyBjb2x1bW5OYW1lLCBCbG9iIHgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEge0Bjb2RlIGJvb2xlYW59CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVCb29sZWFuKGludCBjb2x1bW5JbmRleCwgYm9vbGVhbiB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSB7QGNvZGUgYm9vbGVhbn0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJvb2xlYW4oU3RyaW5nIGNvbHVtbk5hbWUsIGJvb2xlYW4geCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSBieXRlIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSB7QGNvZGUgYnl0ZX0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJ5dGUoaW50IGNvbHVtbkluZGV4LCBieXRlIHgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSBieXRlIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIHtAY29kZSBieXRlfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlQnl0ZShTdHJpbmcgY29sdW1uTmFtZSwgYnl0ZSB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIGJ5dGUgYXJyYXkgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZSBieXRlfSBhcnJheQorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVCeXRlcyhpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xNDY4LDExICsxNjc0LDEyIEBACiAgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEgYnl0ZSBhcnJheSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlQnl0ZXMoU3RyaW5nIGNvbHVtbk5hbWUsIGJ5dGVbXSB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xNDgxLDEzICsxNjg4LDE0IEBACiAgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEBwYXJhbSBsZW5ndGgKICAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgZGF0YSB0byB3cml0ZSBmcm9tIHRoZSBzdHJlYW0KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVDaGFyYWN0ZXJTdHJlYW0oaW50IGNvbHVtbkluZGV4LCBSZWFkZXIgeCwgaW50IGxlbmd0aCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC0xNDk3LDM3NCArMTcwNSw0MTggQEAKICAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCiAgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGRhdGEgdG8gd3JpdGUgZnJvbSB0aGUgUmVhZGVyCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlQ2hhcmFjdGVyU3RyZWFtKFN0cmluZyBjb2x1bW5OYW1lLCBSZWFkZXIgcmVhZGVyLAogICAgICAgICAgICAgaW50IGxlbmd0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSBqYXZhLnNxbC5DbG9iIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSB7QGNvZGUgamF2YS5zcWwuQ2xvYn0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlQ2xvYihpbnQgY29sdW1uSW5kZXgsIENsb2IgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIGphdmEuc3FsLkNsb2IgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEge0Bjb2RlIGphdmEuc3FsLkNsb2J9CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNsb2IoU3RyaW5nIGNvbHVtbk5hbWUsIENsb2IgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSBqYXZhLnNxbC5EYXRlIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSB7QGNvZGUgamF2YS5zcWwuRGF0ZX0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlRGF0ZShpbnQgY29sdW1uSW5kZXgsIERhdGUgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIGphdmEuc3FsLkRhdGUgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEge0Bjb2RlIGphdmEuc3FsLkRhdGV9CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURhdGUoU3RyaW5nIGNvbHVtbk5hbWUsIERhdGUgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSBkb3VibGUgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZSBkb3VibGV9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiAgICAgICAgICAgICBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIGRvdWJsZSB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSB7QGNvZGUgZG91YmxlfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlRG91YmxlKFN0cmluZyBjb2x1bW5OYW1lLCBkb3VibGUgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSBmbG9hdCB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEge0Bjb2RlIGZsb2F0fSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEgZmxvYXQgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEge0Bjb2RlIGZsb2F0fSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlRmxvYXQoU3RyaW5nIGNvbHVtbk5hbWUsIGZsb2F0IHgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGFuIGludCB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGFuIHtAY29kZSBpbnR9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhbiBpbnQgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGFuIHtAY29kZSBpbnR9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVJbnQoU3RyaW5nIGNvbHVtbk5hbWUsIGludCB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIGxvbmcgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZSBsb25nfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSBsb25nIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIHtAY29kZSBsb25nfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlTG9uZyhTdHJpbmcgY29sdW1uTmFtZSwgbG9uZyB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIG51bGwgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZSBudWxsfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU51bGwoaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEgbnVsbCB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSB7QGNvZGUgbnVsbH0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVOdWxsKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhbiBPYmplY3QgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhbiB7QGNvZGUgT2JqZWN0fQorICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVPYmplY3QoaW50IGNvbHVtbkluZGV4LCBPYmplY3QgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYW4gT2JqZWN0IHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYW4ge0Bjb2RlIE9iamVjdH0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHBhcmFtIHNjYWxlCi0gICAgICogICAgICAgICAgICBmb3IgdGhlIHR5cGVzIGphdmEuc3FsLlR5cGVzLkRFQ0lNQUwgb3IKLSAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlR5cGVzLk5VTUVSSUMsIHRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGlnaXRzCisgICAgICogICAgICAgICAgICBmb3IgdGhlIHR5cGVzIHtAY29kZSBqYXZhLnNxbC5UeXBlcy5ERUNJTUFMfSBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlR5cGVzLk5VTUVSSUN9LCB0aGlzIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cwogICAgICAqICAgICAgICAgICAgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlT2JqZWN0KGludCBjb2x1bW5JbmRleCwgT2JqZWN0IHgsIGludCBzY2FsZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYW4gT2JqZWN0IHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhbiB7QGNvZGUgT2JqZWN0fSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlT2JqZWN0KFN0cmluZyBjb2x1bW5OYW1lLCBPYmplY3QgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhbiBPYmplY3QgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGFuIHtAY29kZSBPYmplY3R9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAcGFyYW0gc2NhbGUKLSAgICAgKiAgICAgICAgICAgIGZvciB0aGUgdHlwZXMgamF2YS5zcWwuVHlwZXMuREVDSU1BTCBvcgotICAgICAqICAgICAgICAgICAgamF2YS5zcWwuVHlwZXMuTlVNRVJJQywgdGhpcyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkaWdpdHMKKyAgICAgKiAgICAgICAgICAgIGZvciB0aGUgdHlwZXMge0Bjb2RlIGphdmEuc3FsLlR5cGVzLkRFQ0lNQUx9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgICAgamF2YS5zcWwuVHlwZXMuTlVNRVJJQ30sIHRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGlnaXRzCiAgICAgICogICAgICAgICAgICBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVPYmplY3QoU3RyaW5nIGNvbHVtbk5hbWUsIE9iamVjdCB4LCBpbnQgc2NhbGUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIGphdmEuc3FsLlJlZiB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEge0Bjb2RlIGphdmEuc3FsLlJlZn0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlUmVmKGludCBjb2x1bW5JbmRleCwgUmVmIHgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBuYW1lIHdpdGggYSBqYXZhLnNxbC5SZWYgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEge0Bjb2RlIGphdmEuc3FsLlJlZn0KKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlUmVmKFN0cmluZyBjb2x1bW5OYW1lLCBSZWYgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFVwZGF0ZXMgdGhlIGRhdGFiYXNlIHdpdGggdGhlIG5ldyBjb250ZW50cyBvZiB0aGUgY3VycmVudCByb3cgb2YgdGhpcwotICAgICAqIFJlc3VsdFNldCBvYmplY3QuCisgICAgICoge0Bjb2RlIFJlc3VsdFNldH0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVJvdygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEgc2hvcnQgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZSBzaG9ydH0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIHNob3J0IHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIHtAY29kZSBzaG9ydH0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVNob3J0KFN0cmluZyBjb2x1bW5OYW1lLCBzaG9ydCB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIFN0cmluZyB2YWx1ZS4KKyAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBhIGNvbHVtbiBpbmRleCB3aXRoIGEge0Bjb2RlIFN0cmluZ30gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEgU3RyaW5nIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIHtAY29kZSBTdHJpbmd9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuCiAgICAgICogQHBhcmFtIHgKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdHJpbmcoU3RyaW5nIGNvbHVtbk5hbWUsIFN0cmluZyB4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIFRpbWUgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZSBUaW1lfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlVGltZShpbnQgY29sdW1uSW5kZXgsIFRpbWUgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIG5hbWUgd2l0aCBhIFRpbWUgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gbmFtZSB3aXRoIGEge0Bjb2RlIFRpbWV9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRpbWUoU3RyaW5nIGNvbHVtbk5hbWUsIFRpbWUgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGEgY29sdW1uIGluZGV4IHdpdGggYSBUaW1lc3RhbXAgdmFsdWUuCisgICAgICogVXBkYXRlcyBhIGNvbHVtbiBzcGVjaWZpZWQgYnkgYSBjb2x1bW4gaW5kZXggd2l0aCBhIHtAY29kZSBUaW1lc3RhbXB9CisgICAgICogdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS4KICAgICAgKiBAcGFyYW0geAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdGltZXN0YW1wIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVUaW1lc3RhbXAoaW50IGNvbHVtbkluZGV4LCBUaW1lc3RhbXAgeCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgY29sdW1uIHNwZWNpZmllZCBieSBjb2x1bW4gbmFtZSB3aXRoIGEgVGltZXN0YW1wIHZhbHVlLgorICAgICAqIFVwZGF0ZXMgYSBjb2x1bW4gc3BlY2lmaWVkIGJ5IGNvbHVtbiBuYW1lIHdpdGggYSB7QGNvZGUgVGltZXN0YW1wfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLgogICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRpbWVzdGFtcCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIGhhcHBlbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlVGltZXN0YW1wKFN0cmluZyBjb2x1bW5OYW1lLCBUaW1lc3RhbXAgeCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBsYXN0IGNvbHVtbiByZWFkIGZyb20gdGhpcyBSZXN1bHRTZXQgY29udGFpbmVkIFNRTAotICAgICAqIE5VTEwuCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBsYXN0IGNvbHVtbiByZWFkIGZyb20gdGhpcyB7QGNvZGUgUmVzdWx0U2V0fQorICAgICAqIGNvbnRhaW5lZCBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGFzdCBjb2x1bW4gY29udGFpbmVkIFNRTCBOVUxMLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGxhc3QgY29sdW1uIGNvbnRhaW5lZCBTUUwge0Bjb2RlCisgICAgICogICAgICAgICBOVUxMfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3IgaGFwcGVucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB3YXNOdWxsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1Jlc3VsdFNldE1ldGFEYXRhLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9SZXN1bHRTZXRNZXRhRGF0YS5qYXZhCmluZGV4IGQ1MzBkMTEuLjk1YzUxNWQgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1Jlc3VsdFNldE1ldGFEYXRhLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGEuamF2YQpAQCAtMTgsNTQgKzE4LDY2IEBACiBwYWNrYWdlIGphdmEuc3FsOwogCiAvKioKLSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2x1bW5zIGluIGEgUmVzdWx0U2V0LgorICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbHVtbnMgcmV0dXJuZWQgaW4gYSB7QGNvZGUgUmVzdWx0U2V0fS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVzdWx0U2V0TWV0YURhdGEgewogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgYSBjb2x1bW4gY2Fubm90IGNvbnRhaW4gTlVMTCB2YWx1ZXMKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIGNvbHVtbiBjYW5ub3QgY29udGFpbiB7QGNvZGUgTlVMTH0gdmFsdWVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbHVtbk5vTnVsbHMgPSAwOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgYSBjb2x1bW4gY2FuIGNvbnRhaW4gTlVMTCB2YWx1ZXMKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIGNvbHVtbiBjYW4gY29udGFpbiB7QGNvZGUgTlVMTH0gdmFsdWVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbHVtbk51bGxhYmxlID0gMTsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IGl0IGlzIHVua25vd24gd2hldGhlciBhIGNvbHVtbiBjYW4gY29udGFpbiBOVUxMcyBvciBub3QKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBpdCBpcyB1bmtub3duIHdoZXRoZXIgYSBjb2x1bW4gY2FuIGNvbnRhaW4ge0Bjb2RlIE5VTEx9cyBvciBub3QuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uTnVsbGFibGVVbmtub3duID0gMjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpdGxlIG9mIGluZGV4ZWQgY29sdW1ucyBjYXRhbG9nCisgICAgICogUmV0dXJucyB0aGUgdGl0bGUgb2YgYW4gaW5kZXhlZCBjb2x1bW4ncyBjYXRhbG9nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBjYXRhbG9nIHRpdGxlCisgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxLgorICAgICAqIEByZXR1cm4gdGhlIGNhdGFsb2cgdGl0bGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dOYW1lKGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBvZiB0aGUgY2xhc3MgdGhhdCBpcyBwcm9kdWNlZCB3aGVuCi0gICAgICogaW52b2tpbmcgUmVzdWx0U2V0LmdldE9iamVjdCB0byByZWNvdmVyIHRoaXMgY29sdW1ucyB2YWx1ZS4KKyAgICAgKiBpbnZva2luZyB7QGNvZGUgUmVzdWx0U2V0LmdldE9iamVjdH0gdG8gcmVjb3ZlciB0aGlzIGNvbHVtbidzIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzZWUgUmVzdWx0U2V0I2dldE9iamVjdAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQ2xhc3NOYW1lKGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY291bnQgb2YgdGhlIGNvbHVtbnMgaW4gdGhpcyBzZXQgb2YgcmVzdWx0cy4KKyAgICAgKiBSZXR1cm5zIG51bWJlciBvZiBjb2x1bW5zIGNvbnRhaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCByZXN1bHQgc2V0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiBjb3VudAorICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiBjb3VudC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC03NCwxMCArODYsMTEgQEAKICAgICAgKiBvZiBjaGFyYWN0ZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4ncyBtYXggd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB0aGUgY29sdW1uJ3MgbWF4IHdpZHRoLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5EaXNwbGF5U2l6ZShpbnQgY29sdW1uKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC04Niw3NiArOTksODUgQEAKICAgICAgKiB0aXRsZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbgotICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMQotICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbidzIHRpdGxlCisgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxLgorICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbidzIHRpdGxlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5MYWJlbChpbnQgY29sdW1uKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIGluZGV4ZWQgY29sdW1uCisgICAgICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIGluZGV4ZWQgY29sdW1uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gdGl0bGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB0aGUgY29sdW1uIHRpdGxlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBpbmRleGVkIGNvbHVtbgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGluZGV4ZWQgY29sdW1uIGFzIFNRTCB0eXBlIGNvZGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbgotICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMQotICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxLgorICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiB0eXBlIGNvZGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2VlIFR5cGVzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5UeXBlKGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGluZGV4ZWQgY29sdW1uCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBuYW1lIG9mIHRoZSBpbmRleGVkIGNvbHVtbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxLgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVHlwZU5hbWUoaW50IGNvbHVtbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlY2ltYWwgcHJlY2lzaW9uIG9mIHRoZSBpbmRleGVkIGNvbHVtbgorICAgICAqIFJldHVybnMgdGhlIGRlY2ltYWwgcHJlY2lzaW9uIG9mIHRoZSBpbmRleGVkIGNvbHVtbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxCi0gICAgICogQHJldHVybiB0aGUgcHJlY2lzaW9uCisgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxLgorICAgICAqIEByZXR1cm4gdGhlIHByZWNpc2lvbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UHJlY2lzaW9uKGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgaW4gdGhlIGluZGV4ZWQgY29sdW1uLgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBkZWNpbWFsIHBvaW50IG9mIHRoZQorICAgICAqIGluZGV4ZWQgY29sdW1uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcworICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMS4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U2NhbGUoaW50IGNvbHVtbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGluZGV4ZWQgY29sdW1ucyBzY2hlbWEKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBpbmRleGVkIGNvbHVtbnMgc2NoZW1hLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW5zIHNjaGVtYQorICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW5zIHNjaGVtYS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTmFtZShpbnQgY29sdW1uKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xNjMsNTcgKzE4NSw2MyBAQAogICAgICAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBpbmRleGVkIGNvbHVtbnMgdGFibGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbgotICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMQotICAgICAqIEByZXR1cm4gdGhlIHRhYmxlIHRpdGxlCisgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxLgorICAgICAqIEByZXR1cm4gdGhlIHRhYmxlIHRpdGxlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoaW50IGNvbHVtbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW5kIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgaW5kZXhlZCBjb2x1bW4gaGFzIGF1dG9tYXRpYwotICAgICAqIG51bWJlcmluZyBhbmQgaXMgdGhlcmVmb3JlIHJlYWQtb25seQorICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBpbmRleGVkIGNvbHVtbiBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogaW5jcmVtZW50ZWQgYW5kIGlzIHRoZXJlZm9yZSByZWFkLW9ubHkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbgotICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhdXRvbWF0aWNhbGx5IG51bWJlcmVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgaXQgaXMgYXV0b21hdGljYWxseSBudW1iZXJlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvSW5jcmVtZW50KGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGluZGljYXRvciBvZiB3aGV0aGVyIHRoZSBjYXNlIG9mIHRoZSBpbmRleGVkIGNvbHVtbiBpcwotICAgICAqIGltcG9ydGFudAorICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBjYXNlIG9mIHRoZSBpbmRleGVkIGNvbHVtbiBpcworICAgICAqIGltcG9ydGFudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNhc2UgbWF0dGVycywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNhc2UgbWF0dGVycywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoaW50IGNvbHVtbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIGluZGV4ZWQgY29sdW1uIGNvbnRhaW5zIGEgbW9uZXRhcnkgYW1vdW50LgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaW5kZXhlZCBjb2x1bW4gY29udGFpbnMgYSBtb25ldGFyeSBhbW91bnQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbgotICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIG1vbmV0YXJ5IHZhbHVlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgaXQgaXMgYSBtb25ldGFyeSB2YWx1ZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbmN5KGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB3cml0aW5nIHRvIHRoZSBpbmRleGVkIGNvbHVtbiBpcwotICAgICAqIGd1YXJhbnRlZWQgdG8gYmUgc3VjY2Vzc2Z1bAorICAgICAqIGd1YXJhbnRlZWQgdG8gYmUgc3VjY2Vzc2Z1bC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB3cml0ZSBpcyBndWFyYW50ZWVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHdyaXRlIGlzIGd1YXJhbnRlZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZpbml0ZWx5V3JpdGFibGUoaW50IGNvbHVtbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMjIxLDIyICsyNDksMjQgQEAKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGluZGV4ZWQgY29sdW1uIGlzIG51bGxhYmxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQgaXMgbnVsbGFibGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBpdCBpcyBudWxsYWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGlzTnVsbGFibGUoaW50IGNvbHVtbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHdyaXRpbmcgdG8gdGhlIGluZGV4ZWQgY29sdW1uIGlzCi0gICAgICogZ3VhcmFudGVlZCB0byBiZSB1bnN1Y2Nlc3NmdWwKKyAgICAgKiBndWFyYW50ZWVkIHRvIGJlIHVuc3VjY2Vzc2Z1bC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2x1bW4gaXMgcmVhZC1vbmx5LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNvbHVtbiBpcyByZWFkLW9ubHksIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShpbnQgY29sdW1uKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0yNDQsMjIgKzI3NCwyNSBAQAogICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBpbmRleGVkIGNvbHVtbiBpcyBzZWFyY2hhYmxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGluZGV4ZWQgY29sdW1uIGlzIHNlYXJjaGFibGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluZGV4ZWQgY29sdW1uIGlzIHNlYXJjaGFibGUsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VhcmNoYWJsZShpbnQgY29sdW1uKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbmRpY2F0b3Igb2Ygd2hldGhlciB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgaW5kZXhlZAorICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBpbmRleGVkCiAgICAgICogY29sdW1uIGFyZSBzaWduZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbgotICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZSBzaWduZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbiBpbmRleCwgc3RhcnRpbmcgYXQgMS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGV5IGFyZSBzaWduZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTaWduZWQoaW50IGNvbHVtbikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMjY4LDEwICszMDEsMTEgQEAKICAgICAgKiBwb3NzaWJsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4LCBzdGFydGluZyBhdCAxCi0gICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW5kZXgsIHN0YXJ0aW5nIGF0IDEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZShpbnQgY29sdW1uKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMRGF0YS5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMRGF0YS5qYXZhCmluZGV4IDdiMDc4MzUuLmNhZTlkMTUgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTERhdGEuamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9TUUxEYXRhLmphdmEKQEAgLTE4LDg5ICsxOCwxMDYgQEAKIHBhY2thZ2UgamF2YS5zcWw7CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgY3VzdG9tIG1hcHBpbmcgb2YgYW4gU1FMIFVzZXIgRGVmaW5lZCBUeXBlIChVRFQpIHRvIGEKLSAqIEphdmEgQ2xhc3MuIFRoZSBKYXZhIENsYXNzIG9iamVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBDb25uZWN0aW9uJ3MgdHlwZSBtYXAKLSAqIHdpdGggdGhlIFNRTCBOYW1lIG9mIHRoZSBVRFQgd2hpY2ggaXQgbWFwcy4KKyAqIEFuIGludGVyZmFjZSBmb3IgdGhlIGN1c3RvbSBtYXBwaW5nIG9mIGFuIFNRTCA8aT5Vc2VyIERlZmluZWQgVHlwZTwvaT4gKFVEVCkKKyAqIHRvIGEgSmF2YSBjbGFzcy4gVGhlIEphdmEgY2xhc3Mgb2JqZWN0IGlzIGFkZGVkIHRvIHRoZSBjb25uZWN0aW9uJ3MgdHlwZSBtYXAKKyAqIHBhaXJlZCB3aXRoIHRoZSBTUUwgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBVRFQuCiAgKiA8cD4KLSAqIFVzdWFsbHkgd2l0aGluIGFuIGltcGxlbWVudGF0aW9uIG9mIFNRTERhdGEsIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBmaWVsZAotICogZm9yIGV2ZXJ5IGF0dHJpYnV0ZSBvZiBhbiBTUUwgdHlwZSwgb3Igb25seSBvbmUgZmllbGQgaWYgdGhlIHR5cGUgaXMgU1FMCi0gKiBESVNUSU5DVC4gV2hlbiB0aGUgVURUIGlzIHJldHVybmVkIHdpdGhpbiBhIFJlc3VsdFNldCwgaXQgaXMgYWNjZXNzZWQgd2l0aAotICogdGhlIFJlc3VsdFNldC5nZXRPYmplY3QgbWV0aG9kIGFuZCBpcyByZXR1cm5lZCBhcyBhbiBPYmplY3Qgd2hpY2ggaXMgYW4KLSAqIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBkZWZpbmVkIGJ5IHRoZSBTUUxEYXRhIG1hcHBpbmcuIFRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlCi0gKiB0aGlzIG9iamVjdCBqdXN0IGxpa2UgYW55IG90aGVyIEphdmEgb2JqZWN0IGFuZCBjYW4gc3RvcmUgY2hhbmdlcyBiYWNrIGludG8KLSAqIHRoZSBkYXRhYmFzZSB1c2luZyB0aGUgUHJlcGFyZWRTdGF0ZW1lbnQuc2V0T2JqZWN0IG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUKLSAqIHJldmVyc2UgbWFwcGluZyBpbnRvIHRoZSBTUUwgVURULgorICogVXN1YWxseSB3aXRoaW4gYW4gaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIFNRTERhdGF9LCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcKKyAqIGZpZWxkIGZvciBldmVyeSBhdHRyaWJ1dGUgb2YgYW4gU1FMIHR5cGUsIGJ1dCBvbmx5IG9uZSBmaWVsZCwgaWYgdGhlIHR5cGUgaXMKKyAqIFNRTCB7QGNvZGUgRElTVElOQ1R9LiBXaGVuIHRoZSBVRFQgaXMgcmV0dXJuZWQgd2l0aGluIGEge0Bjb2RlIFJlc3VsdFNldH0sIGl0CisgKiBpcyBhY2Nlc3NlZCB3aXRoIHRoZSB7QGxpbmsgUmVzdWx0U2V0I2dldE9iamVjdH0gbWV0aG9kIGFuZCBpcyByZXR1cm5lZCBhcyBhbgorICogb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBkZWZpbmVkIGJ5IHRoZSB7QGNvZGUgU1FMRGF0YX0KKyAqIG1hcHBpbmcuIFRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgb2JqZWN0IGp1c3QgbGlrZSBhbnkgb3RoZXIgSmF2YSBvYmplY3QKKyAqIGFuZCBjYW4gc3RvcmUgY2hhbmdlcyBiYWNrIGludG8gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZQorICoge0BsaW5rIFByZXBhcmVkU3RhdGVtZW50I3NldE9iamVjdH0gbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSByZXZlcnNlIG1hcHBpbmcKKyAqIGludG8gdGhlIFNRTCB7QGNvZGUgVURUfS4KKyAqIDwvcD4KKyAqIE5vcm1hbGx5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGN1c3RvbSBtYXBwaW5nIGlzIGdlbmVyYXRlZCBieQorICogYSB0b29sIHJlcXVpcmluZyB0aGUgbmFtZSBvZiB0aGUgU1FMIHtAY29kZSBVRFR9LCB0aGUgbmFtZQorICogb2YgdGhlIGNsYXNzIHdoaWNoIGl0IGlzIGdvaW5nIHRvIGJlIG1hcHBlZCB0bywgYW5kIHRoZSBmaWVsZCBuYW1lcyB0byB3aGljaAorICogdGhlIFVEVCBhdHRyaWJ1dGVzIGFyZSBtYXBwZWQuIFRoZSB0b29sIGNhbiB0aGVuIGltcGxlbWVudCB0aGUge0Bjb2RlCisgKiBTUUxEYXRhfSwge0Bjb2RlIHJlYWRTUUx9LCBhbmQge0Bjb2RlIHdyaXRlU1FMfSBtZXRob2RzLiB7QGNvZGUgcmVhZFNRTH0gcmVhZHMKKyAqIGF0dHJpYnV0ZXMgZnJvbSBhbiB7QGNvZGUgU1FMSW5wdXR9IG9iamVjdCwgYW5kIHtAY29kZSB3cml0ZVNRTH0gd3JpdGVzIHRoZW0uCisgKiBUaGlzIGlzIGRvbmUgdmlhIHtAY29kZSBTUUxJbnB1dH0gYW5kIHtAY29kZSBTUUxPdXRwdXR9IG1ldGhvZCBjYWxscworICogcmVzcGVjdGl2ZWx5LgogICogPHA+Ci0gKiBJdCBpcyBzdGFuZGFyZCBmb3IgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgY3VzdG9tIG1hcHBpbmcgdG8gYmUgZ2VuZXJhdGVkIGJ5Ci0gKiBhIHRvb2wuIFRoZSB0b29sIHVzdWFsbHkgcmVxdWlyZXMgdGhlIG5hbWUgb2YgdGhlIFNRTCBVRFQsIHRoZSBuYW1lIG9mIHRoZQotICogY2xhc3Mgd2hpY2ggaXQgaXMgZ29pbmcgdG8gYmUgbWFwcGVkIHRvLCBhbmQgdGhlIGZpZWxkIG5hbWVzIHRvIHdoaWNoIHRoZSBVRFQKLSAqIGF0dHJpYnV0ZXMgd2lsbCBiZSBtYXBwZWQuIFRoZSB0b29sIGNhbiB0aGVuIGltcGxlbWVudCB0aGUgU1FMRGF0YSByZWFkU1FMCi0gKiBhbmQgd3JpdGVTUUwgbWV0aG9kcy4gcmVhZFNRTCByZWFkcyBhdHRyaWJ1dGVzIGZyb20gYW4gU1FMSW5wdXQgb2JqZWN0LCBhbmQKLSAqIHdyaXRlU1FMIHdyaXRlcyB0aGVtLiBUaGlzIGlzIGRvbmUgdmlhIFNRTElucHV0IGFuZCBTUUxPdXRwdXQgbWV0aG9kIGNhbGxzCi0gKiByZXNwZWN0aXZlbHkKLSAqIDxwPgotICogT3JkaW5hcmlseSBhIHByb2dyYW1tZXIgd291bGQgbm90IGNhbGwgU1FMRGF0YSBtZXRob2RzIGRpcmVjdGx5LiBTaW1pbGFybHkKLSAqIFNRTElucHV0IGFuZCBTUUxPdXRwdXQgbWV0aG9kcyBhcmUgbm90IHVzdWFsbHkgY2FsbGVkIGRpcmVjdGx5LgorICogT3JkaW5hcmlseSBhbiBhcHBsaWNhdGlvbiB3b3VsZCBub3QgY2FsbCB7QGNvZGUgU1FMRGF0YX0gbWV0aG9kcyBkaXJlY3RseS4KKyAqIFNpbWlsYXJseSB7QGNvZGUgU1FMSW5wdXR9IGFuZCB7QGNvZGUgU1FMT3V0cHV0fSBtZXRob2RzIGFyZSBub3QgdXN1YWxseQorICogY2FsbGVkIGRpcmVjdGx5LgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTUUxEYXRhIHsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFNRTCBuYW1lIG9mIHRoZSBVc2VyIERlZmluZWQgVHlwZSAoVURUKSB0aGF0IHRoaXMgb2JqZWN0CisgICAgICogR2V0cyB0aGUgU1FMIG5hbWUgb2YgdGhlIDxpPlVzZXIgRGVmaW5lZCBUeXBlPC9pPiAoVURUKSB0aGF0IHRoaXMgb2JqZWN0CiAgICAgICogcmVwcmVzZW50cy4gVGhpcyBtZXRob2QsIHVzdWFsbHkgaW52b2tlZCBieSB0aGUgSkRCQyBkcml2ZXIsIHJldHJpZXZlcwotICAgICAqIHRoZSBuYW1lIG9mIHRoZSBVRFQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU1FMRGF0YSBvYmplY3QuCisgICAgICogdGhlIG5hbWUgb2YgdGhlIFVEVCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgU1FMRGF0YX0gb2JqZWN0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCBVRFQgdHlwZSBuYW1lIGZvciB0aGlzIG9iamVjdCBtYXBwaW5nLCBwYXNzZWQgdG8KLSAgICAgKiAgICAgICAgIHJlYWRTUUwgd2hlbiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkCisgICAgICogICAgICAgICB7QGNvZGUgcmVhZFNRTH0gd2hlbiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFNRTFR5cGVOYW1lKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UgaW50byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgZm9sbG93cyB0aGVzZQogICAgICAqIHN0ZXBzOgorICAgICAqIDxwPgogICAgICAqIDx1bD4KICAgICAgKiA8bGk+VXRpbGl6ZSB0aGUgcGFzc2VkIGlucHV0IHN0cmVhbSB0byByZWFkIHRoZSBhdHRyaWJ1dGVzIG9yIGVudHJpZXMgb2YKICAgICAgKiB0aGUgU1FMIHR5cGU8L2xpPgogICAgICAqIDxsaT5UaGlzIGlzIGNhcnJpZWQgb3V0IGJ5IHJlYWRpbmcgZWFjaCBlbnRyeSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sCi0gICAgICogb3JkZXJlZCBhcyB0aGUgYXJlIHRoZSBTUUwgZGVmaW5pdGlvbi48L2xpPgorICAgICAqIG9yZGVyZWQgYXMgdGhleSBhcmUgaW4gdGhlIFNRTCBkZWZpbml0aW9uLjwvbGk+CiAgICAgICogPGxpPkFzc2lnbiB0aGUgZGF0YSB0byB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIG9yIGVsZW1lbnRzLiBUaGlzIGlzIGRvbmUKLSAgICAgKiBieSBjYWxsaW5nIHRoZSByZWxldmFudCByZWFkZXIgbWV0aG9kIGZvciB0aGUgdHlwZSBpbnZvbHZlZCAoZWcuCi0gICAgICogU1FMSW5wdXQucmVhZFN0cmluZywgU1FMSW5wdXRyZWFkQmlnRGVjaW1hbCkuIElmIHRoZSB0eXBlIGlzIGRpc3RpbmN0LAotICAgICAqIHRoZW4gcmVhZCBpdHMgb25seSBkYXRhIGVudHJ5LiBGb3Igc3RydWN0dXJlZCB0eXBlcywgcmVhZCBldmVyeSBlbnRyeS48L2xpPgorICAgICAqIGJ5IGNhbGxpbmcgdGhlIHJlbGV2YW50IHJlYWRlciBtZXRob2QgZm9yIHRoZSB0eXBlIGludm9sdmVkIChlLmcuIHtAY29kZQorICAgICAqIFNRTElucHV0LnJlYWRTdHJpbmd9LCB7QGNvZGUgU1FMSW5wdXRyZWFkQmlnRGVjaW1hbH0pLiBJZiB0aGUgdHlwZSBpcworICAgICAqIGRpc3RpbmN0LCB0aGVuIHJlYWQgaXRzIG9ubHkgZGF0YSBlbnRyeS4gRm9yIHN0cnVjdHVyZWQgdHlwZXMsIHJlYWQgZXZlcnkKKyAgICAgKiBlbnRyeS48L2xpPgogICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgogICAgICAqIFRoZSBzdXBwbGllZCBpbnB1dCBzdHJlYW0gaXMgdHlwaWNhbGx5IGluaXRpYWxpemVkIGJ5IHRoZSBjYWxsaW5nIEpEQkMKLSAgICAgKiBkcml2ZXIgd2l0aCB0aGUgdHlwZSBtYXAgYmVmb3JlIHJlYWRTUUwgaXMgY2FsbGVkLgorICAgICAqIGRyaXZlciB3aXRoIHRoZSB0eXBlIG1hcCBiZWZvcmUge0Bjb2RlIHJlYWRTUUx9IGlzIGNhbGxlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIFNRTElucHV0IHN0cmVhbSBmcm9tIHdoaWNoIHRoZSB0eXBlIG1hcCBkYXRhIGlzIHJlYWQgZm9yCi0gICAgICogICAgICAgICAgICB0aGUgY3VzdG9tIG1hcHBpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgU1FMSW5wdXR9IHN0cmVhbSBmcm9tIHdoaWNoIHRoZSB0eXBlIG1hcCBkYXRhIGlzCisgICAgICogICAgICAgICAgICByZWFkIGZvciB0aGUgY3VzdG9tIG1hcHBpbmcuCiAgICAgICogQHBhcmFtIHR5cGVOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIFR5cGUgbmFtZSBmb3IgdGhlIHR5cGUgd2hpY2ggaXMgYmVpbmcgbWFwcGVkCisgICAgICogICAgICAgICAgICB0aGUgU1FMIHR5cGUgbmFtZSBmb3IgdGhlIHR5cGUgd2hpY2ggaXMgYmVpbmcgbWFwcGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIFNRTElucHV0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVhZFNRTChTUUxJbnB1dCBzdHJlYW0sIFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgb2JqZWN0IHRvIGEgc3VwcGxpZWQgU1FMT3V0cHV0IGRhdGEgc3RyZWFtLCB3cml0aW5nIGl0IG91dCBhcwotICAgICAqIGFuIFNRTCB2YWx1ZSB0byB0aGUgZGF0YSBzb3VyY2UuCisgICAgICogV3JpdGVzIHRoZSBvYmplY3QgdG8gYSBzdXBwbGllZCB7QGNvZGUgU1FMT3V0cHV0fSBkYXRhIHN0cmVhbSwgd3JpdGluZyBpdAorICAgICAqIG91dCBhcyBhbiBTUUwgdmFsdWUgdG8gdGhlIGRhdGEgc291cmNlLgogICAgICAqIDxwPgogICAgICAqIFRoaXMgbWV0aG9kIGZvbGxvd3MgdGhlIGZvbGxvd2luZyBzdGVwczoKICAgICAgKiA8dWw+CiAgICAgICogPGxpPldyaXRlIGVhY2ggYXR0cmlidXRlIG9mIHRoZSBTUUwgdHlwZSB0byB0aGUgb3V0cHV0IHN0cmVhbS48L2xpPgogICAgICAqIDxsaT5Xcml0ZSBlYWNoIGl0ZW0gYnkgY2FsbGluZyBhIG1ldGhvZCBvbiB0aGUgb3V0cHV0IHN0cmVhbSwgaW4gdGhlCiAgICAgICogb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFNRTCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLiBVc2UgdGhlIGFwcHJvcHJpYXRlCi0gICAgICogU1FMT3V0cHV0IG1ldGhvZHMgKGVnLiB3cml0ZUludCwgd3JpdGVTdHJpbmcpLiBXcml0ZSBhIHNpbmdsZSBkYXRhCi0gICAgICogZWxlbWVudCBmb3IgYSBEaXN0aW5jdCB0eXBlLiBGb3IgYSBTdHJ1Y3R1cmVkIHR5cGUsIHdyaXRlIGEgdmFsdWUgZm9yCi0gICAgICogZWFjaCBhdHRyaWJ1dGUgb2YgdGhlIHRoZSBTUUwgdHlwZS48L2xpPgorICAgICAqIHtAY29kZSBTUUxPdXRwdXR9IG1ldGhvZHMgKGUuZy4ge0Bjb2RlIHdyaXRlSW50fSwge0Bjb2RlIHdyaXRlU3RyaW5nfSkuCisgICAgICogV3JpdGUgYSBzaW5nbGUgZGF0YSBlbGVtZW50IGZvciBhIGRpc3RpbmN0IHR5cGUuIEZvciBhIHN0cnVjdHVyZWQgdHlwZSwKKyAgICAgKiB3cml0ZSBhIHZhbHVlIGZvciBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgdGhlIFNRTCB0eXBlLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIFNRTE91dHB1dCBzdHJlYW0gdG8gdXNlIHRvIHdyaXRlIG91dCB0aGUgZGF0YSBmb3IgdGhlCi0gICAgICogICAgICAgICAgICBjdXN0b20gbWFwcGluZworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBTUUxPdXRwdXR9IHN0cmVhbSB0byB1c2UgdG8gd3JpdGUgb3V0IHRoZSBkYXRhIGZvcgorICAgICAqICAgICAgICAgICAgdGhlIGN1c3RvbSBtYXBwaW5nLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIFNRTE91dHB1dAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlU1FMKFNRTE91dHB1dCBzdHJlYW0pIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9TUUxFeGNlcHRpb24uamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTEV4Y2VwdGlvbi5qYXZhCmluZGV4IDA3YTQ3NjMuLjJjZWExMzkgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTEV4Y2VwdGlvbi5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTEV4Y2VwdGlvbi5qYXZhCkBAIC0yMCwyNSArMjAsMjkgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBBbiBFeGNlcHRpb24gY2xhc3MgdGhhdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggSkRCQyBvcGVyYXRpb25zLiBJdAotICogcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgcHJvYmxlbXMgZW5jb3VudGVyZWQgd2l0aCBEYXRhYmFzZSBhY2Nlc3MgYW5kCisgKiBBbiB7QGNvZGUgRXhjZXB0aW9ufSBjbGFzcyB0aGF0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBKREJDIG9wZXJhdGlvbnMuCisgKiBJdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBwcm9ibGVtcyBlbmNvdW50ZXJlZCB3aXRoIGRhdGFiYXNlIGFjY2VzcyBhbmQKICAqIG90aGVyIHByb2JsZW1zIHJlbGF0ZWQgdG8gSkRCQwogICogPHA+Ci0gKiBUaGUgU1FMRXhjZXB0aW9uIGNsYXNzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgKiBUaGUge0Bjb2RlIFNRTEV4Y2VwdGlvbn0gY2xhc3MgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKICAqIDx1bD4KLSAqIDxsaT5BIHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uIG1lc3NhZ2UsIGFzIGEgU3RyaW5nCi0gKiA8bGk+QW4gU1FMU3RhdGUgc3RyaW5nLiBUaGlzIGlzIGFuIGVycm9yIGRlc2NyaXB0aW9uIHN0cmluZyB3aGljaCBmb2xsb3dzCi0gKiBlaXRoZXIgdGhlIFNRTCA5OSBjb252ZW50aW9ucyBvciB0aGUgWE9QRU4gU1FMc3RhdGUgY29udmVudGlvbnMuIFRoZQotICogcG90ZW50aWFsIHZhbHVlcyBvZiB0aGUgU1FMU3RhdGUgc3RyaW5nIGFyZSBkZXNjcmliZWQgaW4gZWFjaCBvZiB0aGUKLSAqIHNwZWNpZmljYXRpb25zLiBXaGljaCBvZiB0aGUgY29udmVudGlvbnMgaXMgYmVpbmcgdXNlZCBieSB0aGUgU1FMU3RhdGUgc3RyaW5nCi0gKiBjYW4gYmUgZGlzY292ZXJlZCBieSB1c2luZyB0aGUgZ2V0U1FMU3RhdGVUeXBlIG1ldGhvZCBvZiB0aGUgRGF0YWJhc2VNZXRhRGF0YQotICogaW50ZXJmYWNlLgotICogPGxpPkFuIEVycm9yIENvZGUsIGFuIGFuIGludGVnZXIuIFRoZSBlcnJvciBjb2RlIGlzIHNwZWNpZmljIHRvIGVhY2gKLSAqIGRhdGFiYXNlIHZlbmRvciBhbmQgaXMgdHlwaWNhbGx5IHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IHRoZSBkYXRhYmFzZQotICogaXRzZWxmLgotICogPGxpPkEgY2hhaW4gdG8gYSBuZXh0IEV4Y2VwdGlvbiwgaWYgcmVsZXZhbnQsIHdoaWNoIGNhbiBnaXZlIGFjY2VzcyB0bwotICogYWRkaXRpb25hbCBlcnJvciBpbmZvcm1hdGlvbi4KKyAqIDxsaT5BIHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uIG1lc3NhZ2UsIGFzIGEge0Bjb2RlIFN0cmluZ308L2xpPgorICogPGxpPkFuIHtAY29kZSBTUUxTdGF0ZX0gc3RyaW5nLiBUaGlzIGlzIGFuIGVycm9yIGRlc2NyaXB0aW9uIHN0cmluZyB3aGljaAorICogZm9sbG93cyBlaXRoZXIgdGhlIFNRTCA5OSBjb252ZW50aW9ucyBvciB0aGUgWC9PUEVOIHtAY29kZSBTUUxzdGF0ZX0KKyAqIGNvbnZlbnRpb25zLiBUaGUgcG90ZW50aWFsIHZhbHVlcyBvZiB0aGUge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcgYXJlCisgKiBkZXNjcmliZWQgaW4gZWFjaCBvZiB0aGUgc3BlY2lmaWNhdGlvbnMuIFdoaWNoIG9mIHRoZSBjb252ZW50aW9ucyBpcyBiZWluZworICogdXNlZCBieSB0aGUge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcgY2FuIGJlIGRpc2NvdmVyZWQgYnkgdXNpbmcgdGhlIHtAY29kZQorICogZ2V0U1FMU3RhdGVUeXBlfSBtZXRob2Qgb2YgdGhlIHtAY29kZSBEYXRhYmFzZU1ldGFEYXRhfSBpbnRlcmZhY2UuPC9saT4KKyAqIDxsaT5BbiBlcnJvciBjb2RlLCBhbiBhbiBpbnRlZ2VyLiBUaGUgZXJyb3IgY29kZSBpcyBzcGVjaWZpYyB0byBlYWNoIGRhdGFiYXNlCisgKiB2ZW5kb3IgYW5kIGlzIHR5cGljYWxseSB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgZGF0YWJhc2UgaXRzZWxmLjwvbGk+CisgKiA8bGk+QSBjaGFpbiB0byBhIG5leHQge0Bjb2RlIEV4Y2VwdGlvbn0sIGlmIHJlbGV2YW50LCB3aGljaCBjYW4gZ2l2ZSBhY2Nlc3MKKyAqIHRvIGFkZGl0aW9uYWwgZXJyb3IgaW5mb3JtYXRpb24uPC9saT4KICAqIDwvdWw+CisgKiA8L3A+CisgKiAKKyAqIEBzZWUgRGF0YWJhc2VNZXRhRGF0YQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNRTEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKQEAgLTUxLDE2ICs1NSwxNyBAQAogICAgIHByaXZhdGUgU1FMRXhjZXB0aW9uIG5leHQgPSBudWxsOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBTUUxFeGNlcHRpb24gb2JqZWN0LiBUaGUgUmVhc29uIHN0cmluZyBpcyBzZXQgdG8gbnVsbCwgdGhlCi0gICAgICogU1FMU3RhdGUgc3RyaW5nIGlzIHNldCB0byBudWxsIGFuZCB0aGUgRXJyb3IgQ29kZSBpcyBzZXQgdG8gMC4KKyAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBTUUxFeGNlcHRpb259IG9iamVjdC4gVGhlIHJlYXNvbiBzdHJpbmcgaXMgc2V0IHRvCisgICAgICoge0Bjb2RlIG51bGx9LCB0aGUge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcgaXMgc2V0IHRvIHtAY29kZSBudWxsfSBhbmQgdGhlCisgICAgICogZXJyb3IgY29kZSBpcyBzZXQgdG8gMC4KICAgICAgKi8KICAgICBwdWJsaWMgU1FMRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gU1FMRXhjZXB0aW9uIG9iamVjdC4gVGhlIFJlYXNvbiBzdHJpbmcgaXMgc2V0IHRvIHRoZSBnaXZlbgotICAgICAqIHJlYXNvbiBzdHJpbmcsIHRoZSBTUUxTdGF0ZSBzdHJpbmcgaXMgc2V0IHRvIG51bGwgYW5kIHRoZSBFcnJvciBDb2RlIGlzCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgU1FMRXhjZXB0aW9ufSBvYmplY3QuIFRoZSByZWFzb24gc3RyaW5nIGlzIHNldCB0byB0aGUgZ2l2ZW4KKyAgICAgKiByZWFzb24gc3RyaW5nLCB0aGUge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcgaXMgc2V0IHRvIHtAY29kZSBudWxsfSBhbmQgdGhlIGVycm9yIGNvZGUgaXMKICAgICAgKiBzZXQgdG8gMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlUmVhc29uCkBAIC03MSwzMCArNzYsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIFNRTEV4Y2VwdGlvbiBvYmplY3QuIFRoZSBSZWFzb24gc3RyaW5nIGlzIHNldCB0byB0aGUgZ2l2ZW4KLSAgICAgKiByZWFzb24gc3RyaW5nLCB0aGUgU1FMU3RhdGUgc3RyaW5nIGlzIHNldCB0byB0aGUgZ2l2ZW4gU1FMU3RhdGUgc3RyaW5nCi0gICAgICogYW5kIHRoZSBFcnJvciBDb2RlIGlzIHNldCB0byAwLgorICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIFNRTEV4Y2VwdGlvbn0gb2JqZWN0LiBUaGUgcmVhc29uIHN0cmluZyBpcyBzZXQgdG8gdGhlCisgICAgICogZ2l2ZW4gcmVhc29uIHN0cmluZywgdGhlIHtAY29kZSBTUUxTdGF0ZX0gc3RyaW5nIGlzIHNldCB0byB0aGUgZ2l2ZW4KKyAgICAgKiB7QGNvZGUgU1FMU3RhdGV9IHN0cmluZyBhbmQgdGhlIGVycm9yIGNvZGUgaXMgc2V0IHRvIDAuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVJlYXNvbgotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIFJlYXNvbiBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSByZWFzb24gc3RyaW5nLgogICAgICAqIEBwYXJhbSB0aGVTUUxTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIFNRTFN0YXRlIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHtAY29kZSBTUUxTdGF0ZX0gc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTUUxFeGNlcHRpb24oU3RyaW5nIHRoZVJlYXNvbiwgU3RyaW5nIHRoZVNRTFN0YXRlKSB7CiAgICAgICAgIHRoaXModGhlUmVhc29uLCB0aGVTUUxTdGF0ZSwgMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBTUUxFeGNlcHRpb24gb2JqZWN0LiBUaGUgUmVhc29uIHN0cmluZyBpcyBzZXQgdG8gdGhlIGdpdmVuCi0gICAgICogcmVhc29uIHN0cmluZywgdGhlIFNRTFN0YXRlIHN0cmluZyBpcyBzZXQgdG8gdGhlIGdpdmVuIFNRTFN0YXRlIHN0cmluZwotICAgICAqIGFuZCB0aGUgRXJyb3IgQ29kZSBpcyBzZXQgdG8gdGhlIGdpdmVuIGVycm9yIGNvZGUgdmFsdWUuCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgU1FMRXhjZXB0aW9ufSBvYmplY3QuIFRoZSByZWFzb24gc3RyaW5nIGlzIHNldCB0byB0aGUKKyAgICAgKiBnaXZlbiByZWFzb24gc3RyaW5nLCB0aGUge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcgaXMgc2V0IHRvIHRoZSBnaXZlbgorICAgICAqIHtAY29kZSBTUUxTdGF0ZX0gc3RyaW5nIGFuZCB0aGUgZXJyb3IgY29kZSBpcyBzZXQgdG8gdGhlIGdpdmVuIGVycm9yIGNvZGUKKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlUmVhc29uCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgUmVhc29uIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHJlYXNvbiBzdHJpbmcuCiAgICAgICogQHBhcmFtIHRoZVNRTFN0YXRlCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgU1FMU3RhdGUgc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcuCiAgICAgICogQHBhcmFtIHRoZUVycm9yQ29kZQotICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgZm9yIHRoZSBlcnJvciBjb2RlCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGVycm9yIGNvZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNRTEV4Y2VwdGlvbihTdHJpbmcgdGhlUmVhc29uLCBTdHJpbmcgdGhlU1FMU3RhdGUsIGludCB0aGVFcnJvckNvZGUpIHsKICAgICAgICAgc3VwZXIodGhlUmVhc29uKTsKQEAgLTEwMyw0NSArMTExLDUyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50ZWdlciBlcnJvciBjb2RlIGZvciB0aGlzIFNRTEV4Y2VwdGlvbgorICAgICAqIFJldHVybnMgdGhlIGludGVnZXIgZXJyb3IgY29kZSBmb3IgdGhpcyB7QGNvZGUgU1FMRXhjZXB0aW9ufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBpbnRlZ2VyIGVycm9yIGNvZGUgZm9yIHRoaXMgU1FMRXhjZXB0aW9uLiBUaGUgbWVhbmluZyBvZiB0aGUKLSAgICAgKiAgICAgICAgIGNvZGUgaXMgc3BlY2lmaWMgdG8gdGhlIHZlbmRvciBvZiB0aGUgZGF0YWJhc2UuCisgICAgICogQHJldHVybiBUaGUgaW50ZWdlciBlcnJvciBjb2RlIGZvciB0aGlzIHtAY29kZSBTUUxFeGNlcHRpb259LiBUaGUgbWVhbmluZworICAgICAqICAgICAgICAgb2YgdGhlIGNvZGUgaXMgc3BlY2lmaWMgdG8gdGhlIHZlbmRvciBvZiB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7CiAgICAgICAgIHJldHVybiB2ZW5kb3JDb2RlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgU1FMRXhjZXB0aW9uIGNoYWluZWQgdG8gdGhpcyBTUUxFeGNlcHRpb24sIGlmIGFueS4KKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHtAY29kZSBTUUxFeGNlcHRpb259IGNoYWluZWQgdG8gdGhpcyB7QGNvZGUgU1FMRXhjZXB0aW9ufSwKKyAgICAgKiBpZiBhbnkuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgU1FMRXhjZXB0aW9uIGNoYWluZWQgdG8gdGhpcyBTUUxFeGNlcHRpb24uIG51bGwgaWYgdGhlcmUgaXMKLSAgICAgKiAgICAgICAgIG5vIFNRTEV4Y2VwdGlvbiBjaGFpbmVkIHRvIHRoaXMgU1FMRXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gVGhlIHtAY29kZSBTUUxFeGNlcHRpb259IGNoYWluZWQgdG8gdGhpcyB7QGNvZGUgU1FMRXhjZXB0aW9ufS4KKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBubyB7QGNvZGUgU1FMRXhjZXB0aW9ufSBjaGFpbmVkIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBTUUxFeGNlcHRpb259LgogICAgICAqLwogICAgIHB1YmxpYyBTUUxFeGNlcHRpb24gZ2V0TmV4dEV4Y2VwdGlvbigpIHsKICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBTUUxTdGF0ZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIHRoaXMgU1FMRXhjZXB0aW9uIG9iamVjdAorICAgICAqIFJldHJpZXZlcyB0aGUge0Bjb2RlIFNRTFN0YXRlfSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIHRoaXMge0Bjb2RlCisgICAgICogU1FMRXhjZXB0aW9ufSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgU1FMU3RhdGUgc3RyaW5nIGZvciB0aGlzIFNRTEV4Y2VwdGlvbiBvYmplY3QuIFRoaXMgaXMgYW4KLSAgICAgKiAgICAgICAgIGVycm9yIGRlc2NyaXB0aW9uIHN0cmluZyB3aGljaCBmb2xsb3dzIGVpdGhlciB0aGUgU1FMIDk5Ci0gICAgICogICAgICAgICBjb252ZW50aW9ucyBvciB0aGUgWE9QRU4gU1FMc3RhdGUgY29udmVudGlvbnMuIFRoZSBwb3RlbnRpYWwKLSAgICAgKiAgICAgICAgIHZhbHVlcyBvZiB0aGUgU1FMU3RhdGUgc3RyaW5nIGFyZSBkZXNjcmliZWQgaW4gZWFjaCBvZiB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmljYXRpb25zLiBXaGljaCBvZiB0aGUgY29udmVudGlvbnMgaXMgYmVpbmcgdXNlZCBieSB0aGUKLSAgICAgKiAgICAgICAgIFNRTFN0YXRlIHN0cmluZyBjYW4gYmUgZGlzY292ZXJlZCBieSB1c2luZyB0aGUgZ2V0U1FMU3RhdGVUeXBlCi0gICAgICogICAgICAgICBtZXRob2Qgb2YgdGhlIERhdGFiYXNlTWV0YURhdGEgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gVGhlIHtAY29kZSBTUUxTdGF0ZX0gc3RyaW5nIGZvciB0aGlzIHtAY29kZSBTUUxFeGNlcHRpb259IG9iamVjdC4KKyAgICAgKiAgICAgICAgIFRoaXMgaXMgYW4gZXJyb3IgZGVzY3JpcHRpb24gc3RyaW5nIHdoaWNoIGZvbGxvd3MgZWl0aGVyIHRoZSBTUUwKKyAgICAgKiAgICAgICAgIDk5IGNvbnZlbnRpb25zIG9yIHRoZSBYL09QRU4ge0Bjb2RlIFNRTHN0YXRlfSBjb252ZW50aW9ucy4gVGhlCisgICAgICogICAgICAgICBwb3RlbnRpYWwgdmFsdWVzIG9mIHRoZSB7QGNvZGUgU1FMU3RhdGV9IHN0cmluZyBhcmUgZGVzY3JpYmVkIGluCisgICAgICogICAgICAgICBlYWNoIG9mIHRoZSBzcGVjaWZpY2F0aW9ucy4gV2hpY2ggb2YgdGhlIGNvbnZlbnRpb25zIGlzIGJlaW5nCisgICAgICogICAgICAgICB1c2VkIGJ5IHRoZSB7QGNvZGUgU1FMU3RhdGV9IHN0cmluZyBjYW4gYmUgZGlzY292ZXJlZCBieSB1c2luZworICAgICAqICAgICAgICAgdGhlIHtAY29kZSBnZXRTUUxTdGF0ZVR5cGV9IG1ldGhvZCBvZiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBEYXRhYmFzZU1ldGFEYXRhfSBpbnRlcmZhY2UuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTUUxTdGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIFNRTFN0YXRlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIFNRTEV4Y2VwdGlvbiB0byB0aGUgZW5kIG9mIHRoaXMgU1FMRXhjZXB0aW9uIGNoYWluLgorICAgICAqIEFkZHMgdGhlIFNRTEV4Y2VwdGlvbiB0byB0aGUgZW5kIG9mIHRoaXMge0Bjb2RlIFNRTEV4Y2VwdGlvbn0gY2hhaW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIGV4Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IFNRTEV4Y2VwdGlvbiB0byBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB7QGNvZGUgU1FMRXhjZXB0aW9ufSB0byBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgICAgY2hhaW4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmV4dEV4Y2VwdGlvbihTUUxFeGNlcHRpb24gZXgpIHsgICAgCiAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTElucHV0LmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9TUUxJbnB1dC5qYXZhCmluZGV4IGQzMGRhOWYuLmI3MmM4MzkgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTElucHV0LmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMSW5wdXQuamF2YQpAQCAtMjMsMjU4ICsyMywzMTkgQEAKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIC8qKgotICogVGhlIFNRTElucHV0IGludGVyZmFjZSBkZWZpbmVzIG9wZXJhdGlvbnMgd2hpY2ggYXBwbHkgdG8gYSB0eXBlIG9mIGlucHV0Ci0gKiBzdHJlYW0gd2hpY2ggY2FycmllcyBhIHNlcmllcyBvZiB2YWx1ZXMgd2hpY2ggcmVwcmVzZW50IGFuIGluc3RhbmNlIG9mIGFuIFNRTAotICogc3RydWN0dXJlZCB0eXBlIG9yIFNRTCBkaXN0aW5jdCB0eXBlLgorICogVGhlIHtAY29kZSBTUUxJbnB1dH0gaW50ZXJmYWNlIGRlZmluZXMgb3BlcmF0aW9ucyB3aGljaCBhcHBseSB0byBhIHR5cGUgb2YKKyAqIGlucHV0IHN0cmVhbSB3aGljaCBjYXJyaWVzIGEgc2VyaWVzIG9mIHZhbHVlcyByZXByZXNlbnRpbmcgYW4gaW5zdGFuY2Ugb2YKKyAqIGFuIFNRTCBzdHJ1Y3R1cmVkIHR5cGUgb3IgU1FMIGRpc3RpbmN0IHR5cGUuCiAgKiA8cD4KLSAqIFNRTElucHV0IGludGVyZmFjZSBpcyB1c2VkIGZvciBjdXN0b20gbWFwcGluZyBvZiBTUUwgVXNlciBEZWZpbmVkIFR5cGVzCi0gKiAoVURUcyl0byBKYXZhIGNsYXNzZXMuIEl0IGlzIHVzZWQgYnkgSkRCQyBkcml2ZXJzIGJlbG93IHRoZSBsZXZlbCBvZiB0aGUKLSAqIHB1YmxpYyBpbnRlcmZhY2VzIGFuZCBhcHBsaWNhdGlvbiBwcm9ncmFtcyBkbyBub3Qgbm9ybWFsbHkgdXNlIHRoZSBTUUxJbnB1dAotICogbWV0aG9kcyBkaXJlY3RseS4gUmVhZGVyIG1ldGhvZHMgc3VjaCBhcyByZWFkTG9uZyBhbmQgcmVhZEJ5dGVzIHByb3ZpZGUgbWVhbnMKLSAqIHRvIHJlYWQgdmFsdWVzIGZyb20gYW4gU1FMSW5wdXQgc3RyZWFtLgotICogPHA+Ci0gKiBXaGVuIHRoZSBnZXRPYmplY3QgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZQotICogU1FMRGF0YSBpbnRlcmZhY2UsIHRoZSBKREJDIGRyaXZlciBkZXRlcm1pbmVzIHRoZSBTUUwgdHlwZSBvZiB0aGUgVURUIGJlaW5nCi0gKiBtYXBwZWQgYnkgY2FsbGluZyB0aGUgU1FMRGF0YS5nZXRTUUxUeXBlIG1ldGhvZC4gVGhlIGRyaXZlciBjcmVhdGVzIGFuCi0gKiBpbnN0YW5jZSBvZiBhbiBTUUxJbnB1dCBzdHJlYW0sIGZpbGxpbmcgdGhlIHN0cmVhbSB3aXRoIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQotICogVURULiBUaGUgU1FMSW5wdXQgc3RyZWFtIGlzIHBhc3NlZCB0byB0aGUgU1FMRGF0YS5yZWFkU1FMIG1ldGhvZCB3aGljaCB0aGVuCi0gKiBjYWxscyB0aGUgU1FMSW5wdXQgcmVhZGVyIG1ldGhvZHMgdG8gcmVhZCB0aGUgYXR0cmlidXRlcy4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gZGVmaW5lIGN1c3RvbSBtYXBwaW5ncyBvZiBTUUwgPGk+VXNlciBEZWZpbmVkCisgKiBUeXBlczwvaT4gKFVEVHMpIHRvIEphdmEgY2xhc3Nlcy4gSXQgaXMgdXNlZCBieSBKREJDIGRyaXZlcnMsIHRoZXJlZm9yZQorICogYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgZG8gbm90IG5vcm1hbGx5IHVzZSB0aGUge0Bjb2RlIFNRTElucHV0fSBtZXRob2RzCisgKiBkaXJlY3RseS4gUmVhZGVyIG1ldGhvZHMgc3VjaCBhcyB7QGNvZGUgcmVhZExvbmd9IGFuZCB7QGNvZGUgcmVhZEJ5dGVzfQorICogcHJvdmlkZSBtZWFucyB0byByZWFkIHZhbHVlcyBmcm9tIGFuIHtAY29kZSBTUUxJbnB1dH0gc3RyZWFtLgorICogPC9wPjxwPgorICogV2hlbiB0aGUge0Bjb2RlIGdldE9iamVjdH0gbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzCisgKiB0aGUge0Bjb2RlIFNRTERhdGF9IGludGVyZmFjZSwgdGhlIEpEQkMgZHJpdmVyIGRldGVybWluZXMgdGhlIFNRTCB0eXBlIG9mIHRoZQorICogVURUIGJlaW5nIG1hcHBlZCBieSBjYWxsaW5nIHRoZSB7QGNvZGUgU1FMRGF0YS5nZXRTUUxUeXBlfSBtZXRob2QuIFRoZSBkcml2ZXIKKyAqIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYW4ge0Bjb2RlIFNRTElucHV0fSBzdHJlYW0sIGZpbGxpbmcgdGhlIHN0cmVhbSB3aXRoCisgKiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgVURULiBUaGUge0Bjb2RlIFNRTElucHV0fSBzdHJlYW0gaXMgcGFzc2VkIHRvIHRoZQorICoge0Bjb2RlIFNRTERhdGEucmVhZFNRTH0gbWV0aG9kIHdoaWNoIHRoZW4gY2FsbHMgdGhlIHtAY29kZSBTUUxJbnB1dH0gcmVhZGVyCisgKiBtZXRob2RzIHRvIHJlYWQgdGhlIGF0dHJpYnV0ZXMuCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgU1FMRGF0YQorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTUUxJbnB1dCB7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgU3RyaW5nLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSB7QGNvZGUgU3RyaW5nfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhIFN0cmluZy4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUuIHtAY29kZSBudWxsfSBpZiB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KKyAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgYm9vbGVhbi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEge0Bjb2RlIGJvb2xlYW59CisgICAgICogLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgYm9vbGVhbi4gZmFsc2UgaWYgdGhlIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEge0Bjb2RlIGJvb2xlYW59LiB7QGNvZGUgZmFsc2V9IGlmIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSBieXRlLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSB7QGNvZGUgYnl0ZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSBieXRlLiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhIHtAY29kZSBieXRlfS4gMCBpZiB0aGUgdmFsdWUgaXMgU1FMCisgICAgICogICAgICAgICB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgc2hvcnQuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhIHtAY29kZSBzaG9ydH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSBzaG9ydC4gMCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSB7QGNvZGUgc2hvcnR9LiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwKKyAgICAgKiAgICAgICAgIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhbiBpbnQuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhbiB7QGNvZGUgaW50fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhbiBpbnQuIDAgaWYgdGhlIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGFuIHtAY29kZSBpbnR9LiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwKKyAgICAgKiAgICAgICAgIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgbG9uZy4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEge0Bjb2RlIGxvbmd9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgbG9uZy4gMCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSB7QGNvZGUgbG9uZ30uIDAgaWYgdGhlIHZhbHVlIGlzIFNRTAorICAgICAqICAgICAgICAge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgcmVhZExvbmcoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhIGZsb2F0LgorICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSB7QGNvZGUgZmxvYXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgZmxvYXQuIDAgaWYgdGhlIHZhbHVlIGlzIFNRTCBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEge0Bjb2RlIGZsb2F0fS4gMCBpZiB0aGUgdmFsdWUgaXMgU1FMCisgICAgICogICAgICAgICB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSBkb3VibGUuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhIHtAY29kZSBkb3VibGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgZG91YmxlLiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhIHtAY29kZSBkb3VibGV9LiAwIGlmIHRoZSB2YWx1ZSBpcyBTUUwKKyAgICAgKiAgICAgICAgIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEKLSAgICAgKiBqYXZhLm1hdGguQmlnRGVjaW1hbC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEge0Bjb2RlCisgICAgICogamF2YS5tYXRoLkJpZ0RlY2ltYWx9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBhcyBhIGphdmEubWF0aC5CaWdEZWNpbWFsLiBudWxsIGlmIHRoZSByZWFkIHJldHVybnMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBhcyBhIHtAY29kZSBqYXZhLm1hdGguQmlnRGVjaW1hbH0uIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIHJlYWQgcmV0dXJucyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNlZSBqYXZhLm1hdGguQmlnRGVjaW1hbAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJlYWRCaWdEZWNpbWFsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSBieXRlIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBhcyBhIGJ5dGUgYXJyYXkuIG51bGwgaWYgdGhlIHJlYWQgcmV0dXJucyBTUUwgTlVMTC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgYXMgYSBieXRlIGFycmF5LiB7QGNvZGUgbnVsbH0gaWYgdGhlIHJlYWQgcmV0dXJucworICAgICAqICAgICAgICAgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gcmVhZEJ5dGVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSBqYXZhLnNxbC5EYXRlLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5EYXRlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhIGphdmEuc3FsLkRhdGUuIG51bGwgaWYgdGhlIHZhbHVlIGlzIFNRTAotICAgICAqICAgICAgICAgTlVMTC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhIHtAY29kZSBqYXZhLnNxbC5EYXRlfS4ge0Bjb2RlIG51bGx9IGlmCisgICAgICogICAgICAgICB0aGUgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzZWUgRGF0ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlIHJlYWREYXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSBqYXZhLnNxbC5UaW1lLgorICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSB7QGNvZGUKKyAgICAgKiBqYXZhLnNxbC5UaW1lfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgYXMgYSBqYXZhLnNxbC5UaW1lLiBudWxsIGlmIHRoZSByZWFkIHJldHVybnMgU1FMCi0gICAgICogICAgICAgICBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBhcyBhIHtAY29kZSBqYXZhLnNxbC5UaW1lfS4ge0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqICAgICAgICAgcmVhZCByZXR1cm5zIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2VlIFRpbWUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZSByZWFkVGltZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEKLSAgICAgKiBqYXZhLnNxbC5UaW1lc3RhbXAuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLlRpbWVzdGFtcH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlIGFzIGEgamF2YS5zcWwuVGltZXN0YW1wLiBudWxsIGlmIHRoZSByZWFkIHJldHVybnMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBhcyBhIHtAY29kZSBqYXZhLnNxbC5UaW1lc3RhbXB9LiB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoZSByZWFkIHJldHVybnMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzZWUgVGltZXN0YW1wCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFRpbWVzdGFtcCByZWFkVGltZXN0YW1wKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYSBVbmljb2RlCi0gICAgICogY2hhcmFjdGVyIHN0cmVhbSBlbWJvZGllZCBhcyBhIGphdmEuaW8uUmVhZGVyLgorICAgICAqIGNoYXJhY3RlciBzdHJlYW0gZW1ib2RpZWQgYXMgYSB7QGNvZGUgamF2YS5pby5SZWFkZXJ9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgamF2YS5pby5SZWFkZXIuIG51bGwgaWYgdGhlIHZhbHVlIGlzIFNRTAotICAgICAqICAgICAgICAgTlVMTC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhIHtAY29kZSBqYXZhLmlvLlJlYWRlcn0uIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2VlIGphdmEuaW8uUmVhZGVyCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlYWRlciByZWFkQ2hhcmFjdGVyU3RyZWFtKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm0gb2YgYW4gQVNDSUkKLSAgICAgKiBjaGFyYWN0ZXIgc3RyZWFtIGVtYm9kaWVkIGFzIGEgamF2YS5pby5JbnB1dFN0cmVhbS4KKyAgICAgKiBjaGFyYWN0ZXIgc3RyZWFtIGVtYm9kaWVkIGFzIGEge0Bjb2RlIGphdmEuaW8uSW5wdXRTdHJlYW19LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgamF2YS5pby5JbnB1dFN0cmVhbS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEge0Bjb2RlIGphdmEuaW8uSW5wdXRTdHJlYW19LiB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElucHV0U3RyZWFtIHJlYWRBc2NpaVN0cmVhbSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgc3RyZWFtIG9mIGJ5dGVzCi0gICAgICogZW1ib2RpZWQgYXMgYSBqYXZhLmlvLklucHV0U3RyZWFtLgorICAgICAqIGVtYm9kaWVkIGFzIGEge0Bjb2RlIGphdmEuaW8uSW5wdXRTdHJlYW19LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgamF2YS5pby5JbnB1dFN0cmVhbS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIFNRTCBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEge0Bjb2RlIGphdmEuaW8uSW5wdXRTdHJlYW19LiB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSB2YWx1ZSBpcyBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvcgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IuCisgICAgICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIElucHV0U3RyZWFtIHJlYWRCaW5hcnlTdHJlYW0oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhCi0gICAgICogamF2YS5sYW5nLk9iamVjdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEge0Bjb2RlCisgICAgICogamF2YS5sYW5nLk9iamVjdH0uCiAgICAgICogPHA+Ci0gICAgICogVGhlIHR5cGUgb2YgdGhlIE9iamVjdCByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB0eXBlIG1hcHBpbmcgZm9yCi0gICAgICogdGhpcyBKREJDIGRyaXZlciwgaW5jbHVkaW5nIGFueSBjdXN0b21pemVkIG1hcHBpbmdzIGluIGZvcmNlLiBBIHR5cGUgbWFwCi0gICAgICogaXMgZ2l2ZW4gdG8gdGhlIFNRTElucHV0IGJ5IHRoZSBKREJDIGRyaXZlciBiZWZvcmUgdGhlIFNRTElucHV0IGlzIGdpdmVuCi0gICAgICogdG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSB7QGNvZGUgT2JqZWN0fSByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB0eXBlIG1hcHBpbmcKKyAgICAgKiBmb3IgdGhpcyBKREJDIGRyaXZlciwgaW5jbHVkaW5nIGFueSBjdXN0b21pemVkIG1hcHBpbmdzLCBpZiBwcmVzZW50LiBBCisgICAgICogdHlwZSBtYXAgaXMgZ2l2ZW4gdG8gdGhlIHtAY29kZSBTUUxJbnB1dH0gYnkgdGhlIEpEQkMgZHJpdmVyIGJlZm9yZSB0aGUKKyAgICAgKiB7QGNvZGUgU1FMSW5wdXR9IGlzIGdpdmVuIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiA8L3A+CiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIGF0dHJpYnV0ZSBpcyBhbiBTUUwgc3RydWN0dXJlZCBvciBkaXN0aW5jdCB0eXBlLCBpdHMgU1FMIHR5cGUgaXMKLSAgICAgKiBkZXRlcm1pbmVkLiBJZiB0aGUgc3RyZWFtcyB0eXBlIG1hcCBjb250YWlucyBhbiBlbGVtZW50IGZvciB0aGF0IFNRTAotICAgICAqIHR5cGUsIHRoZSBkcml2ZXIgY3JlYXRlcyBhbiBvYmplY3Qgb2YgcmVsZXZhbnQgdHlwZSBhbmQgaW52b2tlcyB0aGUKLSAgICAgKiBtZXRob2QgU1FMRGF0YS5yZWFkU1FMIG9uIGl0LCB3aGljaCByZWFkcyBzdXBwbGVtZW50YXJ5IGRhdGEgZnJvbSB0aGUKLSAgICAgKiBzdHJlYW0gdXNpbmcgd2hpY2hldmVyIHByb3RvY29sIGlzIGRlZmluZWQgZm9yIHRoYXQgbWV0aG9kLgorICAgICAqIGRldGVybWluZWQuIElmIHRoZSBzdHJlYW0ncyB0eXBlIG1hcCBjb250YWlucyBhbiBlbGVtZW50IGZvciB0aGF0IFNRTAorICAgICAqIHR5cGUsIHRoZSBkcml2ZXIgY3JlYXRlcyBhbiBvYmplY3QgZm9yIHRoZSByZWxldmFudCB0eXBlIGFuZCBpbnZva2VzIHRoZQorICAgICAqIG1ldGhvZCB7QGNvZGUgU1FMRGF0YS5yZWFkU1FMfSBvbiBpdCwgd2hpY2ggcmVhZHMgc3VwcGxlbWVudGFyeSBkYXRhIGZyb20KKyAgICAgKiB0aGUgc3RyZWFtIHVzaW5nIHdoaWNoZXZlciBwcm90b2NvbCBpcyBkZWZpbmVkIGZvciB0aGF0IG1ldGhvZC4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYW4gT2JqZWN0LiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBTUUwgTlVMTC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhbiBPYmplY3QuIHtAY29kZSBudWxsfSBpZiB0aGUgdmFsdWUgaXMgU1FMCisgICAgICogICAgICAgICB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IHJlYWRPYmplY3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhIGphdmEuc3FsLlJlZi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuUmVmfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhIGphdmEuc3FsLlJlZi4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgU1FMCi0gICAgICogICAgICAgICBOVUxMLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEge0Bjb2RlIGphdmEuc3FsLlJlZn0uIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2VlIFJlZgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZWYgcmVhZFJlZigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgamF2YS5zcWwuQmxvYi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuQmxvYn0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSBqYXZhLnNxbC5CbG9iLiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBTUUwKLSAgICAgKiAgICAgICAgIE5VTEwuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSB7QGNvZGUgamF2YS5zcWwuQmxvYn0uIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmxvYiByZWFkQmxvYigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgamF2YS5zcWwuQ2xvYi4KKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEge0Bjb2RlCisgICAgICogamF2YS5zcWwuQ2xvYn0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSBqYXZhLnNxbC5DbG9iLiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBTUUwKLSAgICAgKiAgICAgICAgIE5VTEwuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSB7QGNvZGUgamF2YS5zcWwuQ2xvYn0uIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlIHZhbHVlIGlzIFNRTCB7QGNvZGUgTlVMTH0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2VlIENsb2IKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xvYiByZWFkQ2xvYigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIGluIHRoZSBmb3JtIG9mIGEgamF2YS5zcWwuQXJyYXkuCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybSBvZiBhIHtAY29kZQorICAgICAqIGphdmEuc3FsLkFycmF5fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF0dHJpYnV0ZSBhcyBhbiBBcnJheS4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgU1FMIE5VTEwuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYW4ge0Bjb2RlIEFycmF5fS4ge0Bjb2RlIG51bGx9IGlmIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzZWUgQXJyYXkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXkgcmVhZEFycmF5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgbGFzdCB2YWx1ZSByZWFkIHdhcyBTUUwgTlVMTC4KKyAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGxhc3QgdmFsdWUgcmVhZCB3YXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxhc3QgdmFsdWUgcmVhZCB3YXMgU1FMIE5VTEwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbGFzdCB2YWx1ZSByZWFkIHdhcyBTUUwge0Bjb2RlIE5VTEx9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB3YXNOdWxsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIChTUUwgREFUQUxJTksgdmFsdWUpIGFuZCByZXR1cm5zCi0gICAgICogaXQgYXMgYSBqYXZhLm5ldC5VUkwgb2JqZWN0LgorICAgICAqIGl0IGFzIGEge0Bjb2RlIGphdmEubmV0LlVSTH0gb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXR0cmlidXRlIGFzIGEgamF2YS5uZXQuVVJMLiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBTUUwKLSAgICAgKiAgICAgICAgIE5VTEwuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdHRyaWJ1dGUgYXMgYSB7QGNvZGUgamF2YS5uZXQuVVJMfS4ge0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgaXMgU1FMIHtAY29kZSBOVUxMfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGVycm9yLgorICAgICAqIEBzZWUgamF2YS5uZXQuVVJMCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFVSTCByZWFkVVJMKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTE91dHB1dC5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMT3V0cHV0LmphdmEKaW5kZXggMjg3YTVmNi4uOWZkZWQ1ZSAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMT3V0cHV0LmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMT3V0cHV0LmphdmEKQEAgLTIzLDEwOCArMjMsMTIyIEBACiBpbXBvcnQgamF2YS5uZXQuVVJMOwogCiAvKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIG91dHB1dCBzdHJlYW0gdXNlZCB0byB3cml0ZSBhdHRyaWJ1dGVzIG9mIGFuIFNRTCBVc2VyCi0gKiBEZWZpbmVkIFR5cGUgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBjdXN0b20gbWFwcGluZyBvZgotICogdHlwZXMgYW5kIGlzIGNhbGxlZCBieSB0aGUgSkRCQyBkcml2ZXIuIEl0IGlzIG5vdCBleHBlY3RlZCB0aGF0IHRoaXMKLSAqIGludGVyZmFjZSBpcyB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4KKyAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIG91dHB1dCBzdHJlYW0gdXNlZCB0byB3cml0ZSBhdHRyaWJ1dGVzIG9mIGFuIFNRTCA8aT5Vc2VyCisgKiBEZWZpbmVkIFR5cGU8L2k+IChVRFQpIHRvIHRoZSBkYXRhYmFzZS4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgY3VzdG9tCisgKiBtYXBwaW5nIG9mIHR5cGVzIGFuZCBpcyBjYWxsZWQgYnkgdGhlIEpEQkMgZHJpdmVyLiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKKyAqIHVzZWQgYnkgYXBwbGljYXRpb25zLgogICogPHA+Ci0gKiBXaGVuIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBTUUxEYXRhIGludGVyZmFjZSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50Ci0gKiB0byBhbiBTUUwgc3RhdGVtZW50LCB0aGUgSkRCQyBkcml2ZXIgY2FsbHMgdGhlIG1ldGhvZAotICogPGNvZGU+U1FMRGF0YS5nZXRTUUxUeXBlPC9jb2RlPiB0byBlc3RhYmxpc2ggdGhlIHR5cGUgb2YgdGhlIFNRTCBVRFQgdGhhdAotICogaXMgYmVpbmcgcGFzc2VkLiBUaGUgZHJpdmVyIHRoZW4gY3JlYXRlcyBhbiBTUUxPdXRwdXQgc3RyZWFtIGFuZCBwYXNzZXMgaXQgdG8KLSAqIHRoZSA8Y29kZT5TUUxEYXRhLndyaXRlU1FMPC9jb2RlPiBtZXRob2QsIHdoaWNoIGluIHR1cm4gdXNlcyB0aGUKLSAqIGFwcHJvcHJpYXRlIFNRTE91dHB1dCB3cml0ZXIgbWV0aG9kcyB0byB3cml0ZSB0aGUgZGF0YSBmcm9tIHRoZSBTUUxEYXRhCisgKiBXaGVuIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSB7QGNvZGUgU1FMRGF0YX0gaW50ZXJmYWNlIGlzIHVzZWQgYXMgYW4KKyAqIGFyZ3VtZW50IHRvIGFuIFNRTCBzdGF0ZW1lbnQsIHRoZSBKREJDIGRyaXZlciBjYWxscyB0aGUgbWV0aG9kIHtAY29kZQorICogU1FMRGF0YS5nZXRTUUxUeXBlfSB0byBlc3RhYmxpc2ggdGhlIHR5cGUgb2YgdGhlIFNRTCBVRFQgdGhhdCBpcyBiZWluZworICogcGFzc2VkLiBUaGUgZHJpdmVyIHRoZW4gY3JlYXRlcyBhbiB7QGNvZGUgU1FMT3V0cHV0fSBzdHJlYW0gYW5kIHBhc3NlcyBpdCB0bworICogdGhlIHtAY29kZSBTUUxEYXRhLndyaXRlU1FMfSBtZXRob2QsIHdoaWNoIGluIHR1cm4gdXNlcyB0aGUgYXBwcm9wcmlhdGUKKyAqIHtAY29kZSBTUUxPdXRwdXR9IHdyaXRlciBtZXRob2RzIHRvIHdyaXRlIHRoZSBkYXRhIGZyb20gdGhlIHtAY29kZSBTUUxEYXRhfQogICogb2JqZWN0IGludG8gdGhlIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIGRlZmluZWQgbWFwcGluZy4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBTUUxEYXRhCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFNRTE91dHB1dCB7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhIFN0cmluZyB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlIGEge0Bjb2RlIFN0cmluZ30gdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlU3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHdyaXRlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFN0cmluZ30gdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyB0aGVTdHJpbmcpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBXcml0ZSBhIHtAY29kZSBib29sZWFufSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVGbGFnCi0gICAgICogICAgICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBib29sZWFufSB2YWx1ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVCb29sZWFuKGJvb2xlYW4gdGhlRmxhZykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgYnl0ZSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlIGEge0Bjb2RlIGJ5dGV9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHZhbHVlIHRvIHdyaXRlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IHZhbHVlIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSB0aGVCeXRlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBzaG9ydCB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlIGEge0Bjb2RlIHNob3J0fSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVTaG9ydAotICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IHZhbHVlIHRvIHdyaXRlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIHNob3J0fSB2YWx1ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVTaG9ydChzaG9ydCB0aGVTaG9ydCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGFuIGludCB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlIGFuIHtAY29kZSBpbnR9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUludAotICAgICAqICAgICAgICAgICAgdGhlIGludCB2YWx1ZSB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBpbnR9IHZhbHVlIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUludChpbnQgdGhlSW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBsb25nIHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYSB7QGNvZGUgbG9uZ30gdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlTG9uZwotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdmFsdWUgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgbG9uZ30gdmFsdWUgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlTG9uZyhsb25nIHRoZUxvbmcpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhIGZsb2F0IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYSB7QGNvZGUgZmxvYXR9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUZsb2F0Ci0gICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdmFsdWUgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgZmxvYXR9IHZhbHVlIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUZsb2F0KGZsb2F0IHRoZUZsb2F0KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBkb3VibGUgdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBXcml0ZSBhIHtAY29kZSBkb3VibGV9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZURvdWJsZQotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB2YWx1ZSB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBkb3VibGV9IHZhbHVlIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgdGhlRG91YmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBqYXZhLm1hdGguQmlnRGVjaW1hbCB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlIGEge0Bjb2RlIGphdmEubWF0aC5CaWdEZWNpbWFsfSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVCaWdEZWNpbWFsCi0gICAgICogICAgICAgICAgICB0aGUgQmlnRGVjaW1hbCB2YWx1ZSB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBCaWdEZWNpbWFsfSB2YWx1ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVCaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdGhlQmlnRGVjaW1hbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApAQCAtMTMyLDUwICsxNDYsNTggQEAKICAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBieXRlcyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVCeXRlcwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIHRoZUJ5dGVzKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBqYXZhLnNxbC5EYXRlIHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYSB7QGNvZGUgamF2YS5zcWwuRGF0ZX0gdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlRGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIERhdGUgdmFsdWUgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgRGF0ZX0gdmFsdWUgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgRGF0ZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0ZShEYXRlIHRoZURhdGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhIGphdmEuc3FsLlRpbWUgdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBXcml0ZSBhIHtAY29kZSBqYXZhLnNxbC5UaW1lfSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgVGltZSB2YWx1ZSB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBUaW1lfSB2YWx1ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUaW1lCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUaW1lKFRpbWUgdGhlVGltZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGEgamF2YS5zcWwuVGltZXN0YW1wIHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYSB7QGNvZGUgamF2YS5zcWwuVGltZXN0YW1wfSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVUaW1lc3RhbXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBUaW1lc3RhbXAgdmFsdWUgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgVGltZXN0YW1wfSB2YWx1ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBUaW1lc3RhbXAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVRpbWVzdGFtcChUaW1lc3RhbXAgdGhlVGltZXN0YW1wKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYSBzdHJlYW0gb2YgVW5pY29kZSBjaGFyYWN0ZXJzIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYSBzdHJlYW0gb2YgdW5pY29kZSBjaGFyYWN0ZXJzIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBvZiBVbmljb2RlIGNoYXJhY3RlcnMgdG8gd3JpdGUsIGFzIGEgamF2YS5pby5SZWFkZXIKLSAgICAgKiAgICAgICAgICAgIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBvZiB1bmljb2RlIGNoYXJhY3RlcnMgdG8gd3JpdGUsIGFzIGEge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLmlvLlJlYWRlcn0gb2JqZWN0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlclN0cmVhbShSZWFkZXIgdGhlU3RyZWFtKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0xODMsMTAgKzIwNSwxMSBAQAogICAgICAqIFdyaXRlIGEgc3RyZWFtIG9mIEFTQ0lJIGNoYXJhY3RlcnMgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlU3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIG9mIEFTQ0lJIGNoYXJhY3RlcnMgdG8gd3JpdGUsIGFzIGEKLSAgICAgKiAgICAgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIG9mIEFTQ0lJIGNoYXJhY3RlcnMgdG8gd3JpdGUsIGFzIGEge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtfSBvYmplY3QKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVBc2NpaVN0cmVhbShJbnB1dFN0cmVhbSB0aGVTdHJlYW0pIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTE5NCw4NyArMjE3LDEwNSBAQAogICAgICAqIFdyaXRlIGEgc3RyZWFtIG9mIHVuaW50ZXJwcmV0ZWQgYnl0ZXMgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlU3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIG9mIGJ5dGVzIHRvIHdyaXRlLCBhcyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gb2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIG9mIGJ5dGVzIHRvIHdyaXRlLCBhcyBhIHtAY29kZSBqYXZhLmlvLklucHV0U3RyZWFtfQorICAgICAqICAgICAgICAgICAgb2JqZWN0CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5U3RyZWFtKElucHV0U3RyZWFtIHRoZVN0cmVhbSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGFuIFNRTERhdGEgb2JqZWN0IGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYW4ge0Bjb2RlIFNRTERhdGF9IG9iamVjdCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBTUUxEYXRhIG9iamVjdCBpcyBudWxsLCB3cml0ZXMgU1FMIE5VTEwgdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIFNRTERhdGF9IG9iamVjdCBpcyBudWxsLCB3cml0ZXMge0Bjb2RlIE5VTEx9IHRvIHRoZSBzdHJlYW0uCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIE90aGVyd2lzZSwgY2FsbHMgdGhlIDxjb2RlPlNRTERhdGEud3JpdGVTUUw8L2NvZGU+IG1ldGhvZCBvZiB0aGUKLSAgICAgKiBvYmplY3QsIHdoaWNoIHdyaXRlcyB0aGUgb2JqZWN0J3MgYXR0cmlidXRlcyB0byB0aGUgc3RyZWFtIGJ5IGNhbGxpbmcgdGhlCi0gICAgICogYXBwcm9wcmlhdGUgU1FMT3V0cHV0IHdyaXRlciBtZXRob2RzIGZvciBlYWNoIGF0dHJpYnV0ZSwgaW4gb3JkZXIuIFRoZQotICAgICAqIG9yZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIGlzIHRoZSBvcmRlciB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIFNRTAotICAgICAqIGRlZmluaXRpb24gb2YgdGhlIFVzZXIgRGVmaW5lZCBUeXBlLgorICAgICAqIE90aGVyd2lzZSwgY2FsbHMgdGhlIHtAY29kZSBTUUxEYXRhLndyaXRlU1FMfSBtZXRob2Qgb2YgdGhlIG9iamVjdCwgd2hpY2gKKyAgICAgKiB3cml0ZXMgdGhlIG9iamVjdCdzIGF0dHJpYnV0ZXMgdG8gdGhlIHN0cmVhbSBieSBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIFNRTE91dHB1dCB3cml0ZXIgbWV0aG9kcyBmb3IgZWFjaCBhdHRyaWJ1dGUsIGluIG9yZGVyLiBUaGUgb3JkZXIgb2YgdGhlCisgICAgICogYXR0cmlidXRlcyBpcyB0aGUgb3JkZXIgdGhleSBhcmUgbGlzdGVkIGluIHRoZSBTUUwgZGVmaW5pdGlvbiBvZiB0aGUgVXNlcgorICAgICAqIERlZmluZWQgVHlwZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZU9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIFNRTERhdGEgb2JqZWN0IHRvIHdyaXRlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFNRTERhdGF9IG9iamVjdCB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNlZSBTUUxEYXRhCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVPYmplY3QoU1FMRGF0YSB0aGVPYmplY3QpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhbiBTUUwgUmVmIHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYW4gU1FMIHtAY29kZSBSZWZ9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVJlZgotICAgICAqICAgICAgICAgICAgdGhlIGphdmEuc3FsLlJlZiBvYmplY3QgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgamF2YS5zcWwuUmVmfSBvYmplY3QgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgUmVmCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVSZWYoUmVmIHRoZVJlZikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGFuIFNRTCBCbG9iIHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYW4gU1FMIHtAY29kZSBCbG9ifSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVCbG9iCi0gICAgICogICAgICAgICAgICB0aGUgamF2YS5zcWwuQmxvYiBvYmplY3QgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgamF2YS5zcWwuQmxvYn0gb2JqZWN0IHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIEJsb2IKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUJsb2IoQmxvYiB0aGVCbG9iKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYW4gU1FMIENsb2IgdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBXcml0ZSBhbiBTUUwge0Bjb2RlIENsb2J9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUNsb2IKLSAgICAgKiAgICAgICAgICAgIHRoZSBqYXZhLnNxbC5DbG9iIG9iamVjdCB0byB3cml0ZQorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBqYXZhLnNxbC5DbG9ifSBvYmplY3QgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgQ2xvYgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2xvYihDbG9iIHRoZUNsb2IpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZSBhbiBTUUwgU3RydWN0IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYW4gU1FMIHtAY29kZSBTdHJ1Y3R9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVN0cnVjdAotICAgICAqICAgICAgICAgICAgdGhlIGphdmEuc3FsLlN0cnVjdCBvYmplY3QgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgamF2YS5zcWwuU3RydWN0fSBvYmplY3QgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgU3RydWN0CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3QoU3RydWN0IHRoZVN0cnVjdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlIGFuIFNRTCBBcnJheSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIFdyaXRlIGFuIFNRTCB7QGNvZGUgQXJyYXl9IHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgamF2YS5zcWwuQXJyYXkgb2JqZWN0IHRvIHdyaXRlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGphdmEuc3FsLkFycmF5fSBvYmplY3QgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzLgorICAgICAqIEBzZWUgQXJyYXkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUFycmF5KEFycmF5IHRoZUFycmF5KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGUgYW4gU1FMIERBVEFMSU5LIHZhbHVlIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogV3JpdGUgYW4gU1FMIHtAY29kZSBEQVRBTElOS30gdmFsdWUgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlVVJMCi0gICAgICogICAgICAgICAgICB0aGUgRGF0YWxpbmsgdmFsdWUgYXMgYSBqYXZhLm5ldC5VUkwgdG8gd3JpdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhbGluayB2YWx1ZSBhcyBhIHtAY29kZSBqYXZhLm5ldC5VUkx9IHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIGphdmEubmV0LlVSTAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlVVJMKFVSTCB0aGVVUkwpIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9TUUxQZXJtaXNzaW9uLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9TUUxQZXJtaXNzaW9uLmphdmEKaW5kZXggNzM0ZjFmMi4uYTlmODJkMSAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMUGVybWlzc2lvbi5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTFBlcm1pc3Npb24uamF2YQpAQCAtMjIsMTMgKzIyLDIwIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5HdWFyZDsKIAogLyoqCi0gKiBQZXJtaXNzaW9uIHJlbGF0aW5nIHRvIHNlY3VyaXR5IGFjY2VzcyBjb250cm9sIGluIHRoZSBqYXZhLnNxbCBwYWNrYWdlLgorICogQSBQZXJtaXNzaW9uIHJlbGF0aW5nIHRvIHNlY3VyaXR5IGFjY2VzcyBjb250cm9sIGluIHRoZSB7QGNvZGUgamF2YS5zcWx9CisgKiBwYWNrYWdlLgogICogPHA+Ci0gKiBDdXJyZW50bHksIHRoZSBvbmx5IHBlcm1pc3Npb24gc3VwcG9ydGVkIGhhcyB0aGUgbmFtZSAic2V0TG9nIi4gVGhlIHNldExvZwotICogcGVybWlzc2lvbiBjb250cm9scyB3aGV0aGVyIGEgSmF2YSBhcHBsaWNhdGlvbiBvciBhcHBsZXQgY2FuIG9wZW4gYSBsb2dnaW5nCi0gKiBzdHJlYW0gdXNpbmcgdGhlIERyaXZlck1hbmFnZXIuc2V0TG9nV3JpdGVyIG1ldGhvZCBvciB0aGUKLSAqIERyaXZlck1hbmFnZXIuc2V0TG9nU3RyZWFtIG1ldGhvZC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IGRhbmdlcm91cyBvcGVyYXRpb24KLSAqIHNpbmNlIHRoZSBsb2dnaW5nIHN0cmVhbSBjYW4gY29udGFpbiB1c2VybmFtZXMsIHBhc3N3b3JkcworICogQ3VycmVudGx5LCB0aGUgb25seSBwZXJtaXNzaW9uIHN1cHBvcnRlZCBoYXMgdGhlIG5hbWUgIiB7QGNvZGUgc2V0TG9nfSIuIFRoZQorICoge0Bjb2RlIHNldExvZ30gcGVybWlzc2lvbiBjb250cm9scyB3aGV0aGVyIGEgSmF2YSBhcHBsaWNhdGlvbiBvciBhcHBsZXQgY2FuCisgKiBvcGVuIGEgbG9nZ2luZyBzdHJlYW0gdXNpbmcgdGhlIHtAY29kZSBEcml2ZXJNYW5hZ2VyLnNldExvZ1dyaXRlcn0gbWV0aG9kIG9yCisgKiB0aGUge0Bjb2RlIERyaXZlck1hbmFnZXIuc2V0TG9nU3RyZWFtfSBtZXRob2QuIFRoaXMgaXMgYSBwb3RlbnRpYWxseQorICogZGFuZ2Vyb3VzIG9wZXJhdGlvbiBzaW5jZSB0aGUgbG9nZ2luZyBzdHJlYW0gY2FuIGNvbnRhaW4gc2Vuc2l0aXZlCisgKiBpbmZvcm1hdGlvbiBzdWNoIGFzIHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzLgorICogPC9wPgorICogCisgKiBAc2VlIERyaXZlck1hbmFnZXIKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTUUxQZXJtaXNzaW9uIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIGltcGxlbWVudHMgR3VhcmQsCiAgICAgICAgIFNlcmlhbGl6YWJsZSB7CkBAIC0zNiwyMyArNDMsMjMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTQzOTMyMzE4NzE5OTU2MzQ5NUw7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFNRTFBlcm1pc3Npb24gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNRTFBlcm1pc3Npb259IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gdXNlIGZvciB0aGlzIFNRTFBlcm1pc3Npb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhpcyB7QGNvZGUgU1FMUGVybWlzc2lvbn0uCiAgICAgICovCiAgICAgcHVibGljIFNRTFBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTUUxQZXJtaXNzaW9uIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTUUxQZXJtaXNzaW9ufSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIGlzIHRoZSBuYW1lIG9mIHRoZSBTUUxQZXJtaXNzaW9uLiBDdXJyZW50bHkgb25seSAic2V0TG9nIiBpcwotICAgICAqICAgICAgICAgICAgYWxsb3dlZC4KKyAgICAgKiAgICAgICAgICAgIGlzIHRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgU1FMUGVybWlzc2lvbn0uIEN1cnJlbnRseSBvbmx5CisgICAgICogICAgICAgICAgICB7QGNvZGUgInNldExvZyJ9IGlzIGFsbG93ZWQuCiAgICAgICogQHBhcmFtIGFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIGlzIGN1cnJlbnRseSB1bnVzZWQgYW5kIHNob3VsZCBiZSBzZXQgdG8gbnVsbAorICAgICAqICAgICAgICAgICAgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgc2hvdWxkIGJlIHNldCB0byB7QGNvZGUgbnVsbH0uCiAgICAgICovCiAgICAgcHVibGljIFNRTFBlcm1pc3Npb24oU3RyaW5nIG5hbWUsIFN0cmluZyBhY3Rpb25zKSB7CiAgICAgICAgIHN1cGVyKG5hbWUsIG51bGwpOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMV2FybmluZy5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU1FMV2FybmluZy5qYXZhCmluZGV4IGVmYWYyMTYuLmRlOTRkYTUgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NRTFdhcm5pbmcuamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9TUUxXYXJuaW5nLmphdmEKQEAgLTIzLDYyICsyMyw3NiBAQAogCiAvKioKICAqIEFuIGV4Y2VwdGlvbiBjbGFzcyB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IERhdGFiYXNlIGFjY2VzcyB3YXJuaW5ncy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTUUxXYXJuaW5nIGV4dGVuZHMgU1FMRXhjZXB0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5MTczMzY3NzQ2MDQ3ODQ4NTZMOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBTUUxXYXJuaW5nIG9iamVjdC4gVGhlIFJlYXNvbiBzdHJpbmcgaXMgc2V0IHRvIG51bGwsIHRoZQotICAgICAqIFNRTFN0YXRlIHN0cmluZyBpcyBzZXQgdG8gbnVsbCBhbmQgdGhlIEVycm9yIENvZGUgaXMgc2V0IHRvIDAuCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgU1FMV2FybmluZ30gb2JqZWN0LiBUaGUgcmVhc29uIHN0cmluZyBpcyBzZXQgdG8ge0Bjb2RlCisgICAgICogbnVsbH0sIHRoZSB7QGNvZGUgU1FMU3RhdGV9IHN0cmluZyBpcyBzZXQgdG8ge0Bjb2RlIG51bGx9IGFuZCB0aGUgZXJyb3IKKyAgICAgKiBjb2RlIGlzIHNldCB0byAwLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTUUxXYXJuaW5nKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gU1FMV2FybmluZyBvYmplY3QuIFRoZSBSZWFzb24gc3RyaW5nIGlzIHNldCB0byB0aGUgZ2l2ZW4KLSAgICAgKiByZWFzb24gc3RyaW5nLCB0aGUgU1FMU3RhdGUgc3RyaW5nIGlzIHNldCB0byBudWxsIGFuZCB0aGUgRXJyb3IgQ29kZSBpcwotICAgICAqIHNldCB0byAwLgorICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIFNRTFdhcm5pbmd9IG9iamVjdC4gVGhlIHJlYXNvbiBzdHJpbmcgaXMgc2V0IHRvIHRoZQorICAgICAqIGdpdmVuIHJlYXNvbiBzdHJpbmcsIHRoZSB7QGNvZGUgU1FMU3RhdGV9IHN0cmluZyBpcyBzZXQgdG8ge0Bjb2RlIG51bGx9CisgICAgICogYW5kIHRoZSBlcnJvciBjb2RlIGlzIHNldCB0byAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVSZWFzb24KKyAgICAgKiAgICAgICAgICAgIHRoZSByZWFzb24gd2h5IHRoaXMgd2FybmluZyBpcyBpc3N1ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNRTFdhcm5pbmcoU3RyaW5nIHRoZVJlYXNvbikgewogICAgICAgICBzdXBlcih0aGVSZWFzb24pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gU1FMV2FybmluZyBvYmplY3QuIFRoZSBSZWFzb24gc3RyaW5nIGlzIHNldCB0byB0aGUgZ2l2ZW4KLSAgICAgKiByZWFzb24gc3RyaW5nLCB0aGUgU1FMU3RhdGUgc3RyaW5nIGlzIHNldCB0byB0aGUgZ2l2ZW4gU1FMU3RhdGUgc3RyaW5nCi0gICAgICogYW5kIHRoZSBFcnJvciBDb2RlIGlzIHNldCB0byAwLgorICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIFNRTFdhcm5pbmd9IG9iamVjdC4gVGhlIHJlYXNvbiBzdHJpbmcgaXMgc2V0IHRvIHRoZQorICAgICAqIGdpdmVuIHJlYXNvbiBzdHJpbmcsIHRoZSB7QGNvZGUgU1FMU3RhdGV9IHN0cmluZyBpcyBzZXQgdG8gdGhlIGdpdmVuCisgICAgICoge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcgYW5kIHRoZSBlcnJvciBjb2RlIGlzIHNldCB0byAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVSZWFzb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBSZWFzb24gc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgcmVhc29uIHdoeSB0aGlzIHdhcm5pbmcgaXMgaXNzdWVkLgogICAgICAqIEBwYXJhbSB0aGVTUUxTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIFNRTFN0YXRlIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHtAY29kZSBTUUxTdGF0ZX0gc3RyaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxXYXJuaW5nKFN0cmluZyB0aGVSZWFzb24sIFN0cmluZyB0aGVTUUxTdGF0ZSkgewogICAgICAgICBzdXBlcih0aGVSZWFzb24sIHRoZVNRTFN0YXRlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIFNRTFdhcm5pbmcgb2JqZWN0LiBUaGUgUmVhc29uIHN0cmluZyBpcyBzZXQgdG8gdGhlIGdpdmVuCi0gICAgICogcmVhc29uIHN0cmluZywgdGhlIFNRTFN0YXRlIHN0cmluZyBpcyBzZXQgdG8gdGhlIGdpdmVuIFNRTFN0YXRlIHN0cmluZwotICAgICAqIGFuZCB0aGUgRXJyb3IgQ29kZSBpcyBzZXQgdG8gdGhlIGdpdmVuIEVycm9yQ29kZSB2YWx1ZS4KKyAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBTUUxXYXJuaW5nfSBvYmplY3QuIFRoZSByZWFzb24gc3RyaW5nIGlzIHNldCB0byB0aGUKKyAgICAgKiBnaXZlbiByZWFzb24gc3RyaW5nLCB0aGUge0Bjb2RlIFNRTFN0YXRlfSBzdHJpbmcgaXMgc2V0IHRvIHRoZSBnaXZlbgorICAgICAqIHtAY29kZSBTUUxTdGF0ZX0gc3RyaW5nIGFuZCB0aGUgZXJyb3IgY29kZSBpcyBzZXQgdG8gdGhlIGdpdmVuIGVycm9yIGNvZGUKKyAgICAgKiB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlUmVhc29uCisgICAgICogICAgICAgICAgICB0aGUgcmVhc29uIHdoeSB0aGlzIHdhcm5pbmcgaXMgaXNzdWVkLgogICAgICAqIEBwYXJhbSB0aGVTUUxTdGF0ZQorICAgICAqICAgICAgICAgICAgdGhlIFgvT3BlbiBzdGFuZGFyZCBzcGVjaWZjIGVycm9yIGNvZGUuCiAgICAgICogQHBhcmFtIHRoZUVycm9yQ29kZQorICAgICAqICAgICAgICAgICAgYSB2ZW5kb3Igc3BlY2lmaWMgZXJyb3IgY29kZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1FMV2FybmluZyhTdHJpbmcgdGhlUmVhc29uLCBTdHJpbmcgdGhlU1FMU3RhdGUsIGludCB0aGVFcnJvckNvZGUpIHsKICAgICAgICAgc3VwZXIodGhlUmVhc29uLCB0aGVTUUxTdGF0ZSwgdGhlRXJyb3JDb2RlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTUUxXYXJuaW5nIGNoYWluZWQgdG8gdGhpcyBTUUxXYXJuaW5nIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSBuZXh0IHtAY29kZSBTUUxXYXJuaW5nfSBjaGFpbmVkIHRvIHRoaXMge0Bjb2RlIFNRTFdhcm5pbmd9IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTUUxXYXJuaW5nIGNoYWluZWQgdG8gdGhpcyBTUUxXYXJuaW5nLiBudWxsIGlmIG5vIFNRTFdhcm5pbmcKLSAgICAgKiAgICAgICAgIGlzIGNoYWluZWQgdG8gdGhpcyBTUUxXYXJuaW5nLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBTUUxXYXJuaW5nfSBjaGFpbmVkIHRvIHRoaXMge0Bjb2RlIFNRTFdhcm5pbmd9LgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIG5vIHtAY29kZSBTUUxXYXJuaW5nfSBpcyBjaGFpbmVkIHRvIHRoaXMge0Bjb2RlCisgICAgICogICAgICAgICBTUUxXYXJuaW5nfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1FMV2FybmluZyBnZXROZXh0V2FybmluZygpIHsKICAgICAgICAgU1FMRXhjZXB0aW9uIG5leHQgPSBzdXBlci5nZXROZXh0RXhjZXB0aW9uKCk7CkBAIC05MiwxMCArMTA2LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hhaW5zIGEgc3VwcGxpZWQgU1FMV2FybmluZyB0byB0aGlzIFNRTFdhcm5pbmcuCisgICAgICogQ2hhaW5zIGEgc3VwcGxpZWQge0Bjb2RlIFNRTFdhcm5pbmd9IHRvIHRoaXMge0Bjb2RlIFNRTFdhcm5pbmd9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB3Ci0gICAgICogICAgICAgICAgICB0aGUgU1FMV2FybmluZyB0byBjaGFpbiB0byB0aGlzIFNRTFdhcm5pbmcuCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFNRTFdhcm5pbmd9IGxpbmtlZCB0byB0aGlzIHtAY29kZSBTUUxXYXJuaW5nfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROZXh0V2FybmluZyhTUUxXYXJuaW5nIHcpIHsKICAgICAgICAgc3VwZXIuc2V0TmV4dEV4Y2VwdGlvbih3KTsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1NhdmVwb2ludC5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU2F2ZXBvaW50LmphdmEKaW5kZXggZmQyNzg3Ny4uNDJiNGExNyAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU2F2ZXBvaW50LmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU2F2ZXBvaW50LmphdmEKQEAgLTE4LDI2ICsxOCwzMiBAQAogcGFja2FnZSBqYXZhLnNxbDsKIAogLyoqCi0gKiBBIFNhdmVwb2ludCBpcyBhbiBpbnN0YW50IGR1cmluZyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiB0aGF0IGNhbiBiZSB1dGlsaXplZAotICogYnkgYSBSb2xsYmFjayBmcm9tIHRoZSBDb25uZWN0aW9uLnJvbGxiYWNrIG1ldGhvZC4gUm9sbGluZyBiYWNrIHRvIGEKLSAqIHBhcnRpY3VsYXIgU2F2ZXBvaW50IG1lYW5zIHRoYXQgYWxsIGNoYW5nZXMgdGhhdCBvY2N1cnJlZCBhZnRlciB0aGF0Ci0gKiBTYXZlcG9pbnQgYXJlIHJlbW92ZWQuCisgKiBBIHNhdmVwb2ludCBpcyBhbiBpbnN0YW50IGR1cmluZyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiB0aGF0IGNhbiBiZSB1dGlsaXplZAorICogYnkgYSByb2xsYmFjayB2aWEgdGhlIHtAbGluayBDb25uZWN0aW9uI3JvbGxiYWNrfSBjb21tYW5kLiBSb2xsaW5nIGJhY2sgdG8gYQorICogcGFydGljdWxhciBzYXZlcG9pbnQgbWVhbnMgdGhhdCBhbGwgY2hhbmdlcyB0aGF0IG9jY3VycmVkIGFmdGVyIHRoYXQKKyAqIHNhdmVwb2ludCBhcmUgdW5kb25lLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTYXZlcG9pbnQgewogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0ZWQgSUQgZm9yIHRoaXMgU2F2ZXBvaW50LgorICAgICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdGVkIElEIGZvciB0aGlzIHNhdmVwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBJRCBmb3IgdGhpcyBTYXZlcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgSUQgZm9yIHRoaXMgc2F2ZXBvaW50LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U2F2ZXBvaW50SWQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhpcyBTYXZlcG9pbnQuCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhpcyBzYXZlcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIFNhdmVwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgc2F2ZXBvaW50LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2F2ZXBvaW50TmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9TdGF0ZW1lbnQuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1N0YXRlbWVudC5qYXZhCmluZGV4IDg4OTZkYmYuLjQ5ODVhOWUgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1N0YXRlbWVudC5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1N0YXRlbWVudC5qYXZhCkBAIC0xOCwxOTggKzE4LDI0MSBAQAogcGFja2FnZSBqYXZhLnNxbDsKIAogLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCBmb3IgZXhlY3V0aW5nIHN0YXRpYyBTUUwgc3RhdGVtZW50cyBhbmQgcmV0dXJuaW5nIHRoZWlyCi0gKiByZXN1bHRzLgotICogCi0gKiBCeSBkZWZhdWx0LCBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBTdGF0ZW1lbnQgaW50ZXJmYWNlIGNhbiByZXR1cm5zCi0gKiByZXN1bHRzIGFzIFJlc3VsdFNldHMuIEZvciBhbnkgZ2l2ZW4gU3RhdGVtZW50IG9iamVjdCwgb25seSBvbmUgUmVzdWx0U2V0IGNhbgotICogYmUgb3BlbiBhdCBvbmUgdGltZS4gQSBjYWxsIHRvIGFueSBvZiB0aGUgZXhlY3V0aW9uIG1ldGhvZHMgb2YgU3RhdGVtZW50IHdpbGwKLSAqIGNhdXNlIGFueSBwcmV2aW91c2x5IGNyZWF0ZWQgUmVzdWx0U2V0IG9iamVjdCBmb3IgdGhhdCBTdGF0ZW1lbnQgdG8gYmUgY2xvc2VkCi0gKiBpbXBsaWNpdGx5LgorICogSW50ZXJmYWNlIHVzZWQgZm9yIGV4ZWN1dGluZyBzdGF0aWMgU1FMIHN0YXRlbWVudHMgdG8gcmV0cmlldmUgcXVlcnkgcmVzdWx0cy4KKyAqIFRoZSByZXN1bHRpbmcgdGFibGUgcm93cyBhcmUgcmV0dXJuZWQgYXMge0Bjb2RlIFJlc3VsdFNldH1zLiBGb3IgYW55IGdpdmVuCisgKiB7QGNvZGUgU3RhdGVtZW50fSBvYmplY3QsIG9ubHkgb25lIHtAY29kZSBSZXN1bHRTZXR9IGNhbiBiZSBvcGVuZWQgYXQgb25lCisgKiB0aW1lLiBBIGNhbGwgdG8gYW55IG9mIHRoZSBleGVjdXRpb24gbWV0aG9kcyBvZiB7QGNvZGUgU3RhdGVtZW50fSB3aWxsIGNhdXNlCisgKiBhbnkgcHJldmlvdXNseSBjcmVhdGVkIHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdCBmb3IgdGhhdCB7QGNvZGUgU3RhdGVtZW50fSB0bworICogYmUgY2xvc2VkIGltcGxpY2l0bHkuCiAgKiA8cD4KLSAqIFRvIGhhdmUgbXVsdGlwbGUgUmVzdWx0U2V0IG9iamVjdHMgb3BlbiBjb25jdXJyZW50bHksIG11bHRpcGxlIFN0YXRlbWVudAotICogb2JqZWN0cyBtdXN0IGJlIHVzZWQuCisgKiBUbyBoYXZlIG11bHRpcGxlIHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdHMgb3BlbmVkIGNvbmN1cnJlbnRseSwgbXVsdGlwbGUKKyAqIHtAY29kZSBTdGF0ZW1lbnR9IG9iamVjdHMgbXVzdCBiZSBjcmVhdGVkIGFuZCB0aGVuIGV4ZWN1dGVkLgorICogPC9wPgorICogPHA+CisgKiBUbyBvYnRhaW4gc3VjaCBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCBvbmUgbmVlZHMgdG8gaW52b2tlIHtAY29kZQorICogQ29ubmVjdGlvbiNjcmVhdGVTdGF0ZW1lbnR9LgorICogPC9wPgorICogCisgKiBAc2VlIFJlc3VsdFNldAorICogQHNlZSBDb25uZWN0aW9uI2NyZWF0ZVN0YXRlbWVudAorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTdGF0ZW1lbnQgewogCiAgICAgLyoqCi0gICAgICogUGFzc2luZyB0aGlzIGNvbnN0YW50IHRvIGdldE1vcmVSZXN1bHRzIGltcGxpZXMgdGhhdCBhbGwgUmVzdWx0U2V0Ci0gICAgICogb2JqZWN0cyBwcmV2aW91c2x5IGtlcHQgb3BlbiBzaG91bGQgYmUgY2xvc2VkLgorICAgICAqIFBhc3NpbmcgdGhpcyBjb25zdGFudCB0byB7QGxpbmsgI2dldE1vcmVSZXN1bHRzfSBpbXBsaWVzIHRoYXQgYWxsIHtAY29kZQorICAgICAqIFJlc3VsdFNldH0gb2JqZWN0cyBwcmV2aW91c2x5IGtlcHQgb3BlbiBzaG91bGQgYmUgY2xvc2VkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT1NFX0FMTF9SRVNVTFRTID0gMzsKIAogICAgIC8qKgotICAgICAqIFBhc3NpbmcgdGhpcyBjb25zdGFudCB0byBnZXRNb3JlUmVzdWx0cyBpbXBsaWVzIHRoYXQgdGhlIGN1cnJlbnQKLSAgICAgKiBSZXN1bHRTZXQgb2JqZWN0IHNob3VsZCBiZSBjbG9zZWQKKyAgICAgKiBQYXNzaW5nIHRoaXMgY29uc3RhbnQgdG8ge0BsaW5rICNnZXRNb3JlUmVzdWx0c30gaW1wbGllcyB0aGF0IHRoZSBjdXJyZW50CisgICAgICoge0Bjb2RlIFJlc3VsdFNldH0gb2JqZWN0IHNob3VsZCBiZSBjbG9zZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VfQ1VSUkVOVF9SRVNVTFQgPSAxOwogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoYXQgYW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIGR1cmluZyBleGVjdXRpb24gb2YgYSBiYXRjaAogICAgICAqIHN0YXRlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRFX0ZBSUxFRCA9IC0zOwogCiAgICAgLyoqCi0gICAgICogUGFzc2luZyB0aGlzIGNvbnN0YW50IHRvIGdldE1vcmVSZXN1bHRzIGltcGxpZXMgdGhhdCB0aGUgY3VycmVudAotICAgICAqIFJlc3VsdFNldCBvYmplY3Qgc2hvdWxkIG5vdCBiZSBjbG9zZWQuCisgICAgICogUGFzc2luZyB0aGlzIGNvbnN0YW50IHRvIDxpPmdldE1vcmVSZXN1bHRzPC9pPiBpbXBsaWVzIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiB7QGNvZGUgUmVzdWx0U2V0fSBvYmplY3Qgc2hvdWxkIG5vdCBiZSBjbG9zZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VFUF9DVVJSRU5UX1JFU1VMVCA9IDI7CiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhhdCBnZW5lcmF0ZWQga2V5cyBzaG91bGQgbm90IGJlIGFjY2Vzc2libGUgZm9yIHJldHJpZXZhbC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19HRU5FUkFURURfS0VZUyA9IDI7CiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhhdCBnZW5lcmF0ZWQga2V5cyBzaG91bGQgYmUgYWNjZXNzaWJsZSBmb3IgcmV0cmlldmFsLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVFVSTl9HRU5FUkFURURfS0VZUyA9IDE7CiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIGJhdGNoIHN0YXRlbWVudCB3YXMgZXhlY3V0ZWQgd2l0aCBhIHN1Y2Nlc3NmdWwgcmVzdWx0LAogICAgICAqIGJ1dCBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygcm93cyBpdCBhZmZlY3RlZCBpcyB1bmF2YWlsYWJsZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTX05PX0lORk8gPSAtMjsKIAogICAgIC8qKgotICAgICAqIEFkZHMgYSBzcGVjaWZpZWQgU1FMIGNvbW1hbmRzIHRvIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGZvciB0aGlzIFN0YXRlbWVudC4KKyAgICAgKiBBZGRzIGEgc3BlY2lmaWVkIFNRTCBjb21tYW5kIHRvIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGZvciB0aGlzIHtAY29kZQorICAgICAqIFN0YXRlbWVudH0uCiAgICAgICogPHA+Ci0gICAgICogVGhlIGxpc3Qgb2YgY29tbWFuZHMgaXMgZXhlY3V0ZWQgYnkgaW52b2tpbmcgdGhlCi0gICAgICogPGNvZGU+ZXhlY3V0ZUJhdGNoPC9jb2RlPiBtZXRob2QuCisgICAgICogVGhlIGxpc3Qgb2YgY29tbWFuZHMgaXMgZXhlY3V0ZWQgYnkgaW52b2tpbmcgdGhlIHtAY29kZSBleGVjdXRlQmF0Y2h9CisgICAgICogbWV0aG9kLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIGNvbW1hbmQgYXMgYSBTdHJpbmcuIFR5cGljYWxseSBhbiBJTlNFUlQgb3IgVVBEQVRFCi0gICAgICogICAgICAgICAgICBzdGF0ZW1lbnQuCisgICAgICogICAgICAgICAgICB0aGUgU1FMIGNvbW1hbmQgYXMgYSBTdHJpbmcuIFR5cGljYWxseSBhbiB7QGNvZGUgSU5TRVJUfSBvcgorICAgICAqICAgICAgICAgICAge0Bjb2RlIFVQREFURX0gc3RhdGVtZW50LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2Ugb3IgdGhlIGRhdGFiYXNlCi0gICAgICogICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaCB1cGRhdGVzCisgICAgICogICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaCB1cGRhdGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEJhdGNoKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoaXMgU3RhdGVtZW50IGV4ZWN1dGlvbiBpZiBib3RoIHRoZSBkYXRhYmFzZSBhbmQgdGhlIEpEQkMgZHJpdmVyCi0gICAgICogc3VwcG9ydCBhYm9ydGluZyBhbiBTUUwgc3RhdGVtZW50IGluIGZsaWdodC4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgYnkKLSAgICAgKiBvbmUgdGhyZWFkIHRvIHN0b3AgYSBTdGF0ZW1lbnQgdGhhdCBpcyBiZWluZyBleGVjdXRlZCBvbiBhbm90aGVyIHRocmVhZC4KKyAgICAgKiBDYW5jZWxzIHRoaXMgc3RhdGVtZW50J3MgZXhlY3V0aW9uIGlmIGJvdGggdGhlIGRhdGFiYXNlIGFuZCB0aGUgSkRCQworICAgICAqIGRyaXZlciBzdXBwb3J0IGFib3J0aW5nIGFuIFNRTCBzdGF0ZW1lbnQgaW4gZmxpZ2h0LiBUaGlzIG1ldGhvZCBjYW4gYmUKKyAgICAgKiB1c2VkIGJ5IG9uZSB0aHJlYWQgdG8gc3RvcCBhIHN0YXRlbWVudCB0aGF0IGlzIGV4ZWN1dGVkIG9uIGFub3RoZXIKKyAgICAgKiB0aHJlYWQuCiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBTUUwgY29tbWFuZHMgZm9yIHRoaXMgU3RhdGVtZW50LgorICAgICAqIENsZWFycyB0aGUgY3VycmVudCBsaXN0IG9mIFNRTCBjb21tYW5kcyBmb3IgdGhpcyBzdGF0ZW1lbnQuCiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciB0aGUgZGF0YWJhc2UKLSAgICAgKiAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoIHVwZGF0ZXMKKyAgICAgKiAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoIHVwZGF0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIFNRTFdhcm5pbmdzIGZyb20gdGhpcyBTdGF0ZW1lbnQuCisgICAgICogQ2xlYXJzIGFsbCB7QGNvZGUgU1FMV2FybmluZ3N9IGZyb20gdGhpcyBzdGF0ZW1lbnQuCiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyV2FybmluZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVsZWFzZXMgdGhpcyBTdGF0ZW1lbnQncyBkYXRhYmFzZSBhbmQgSkRCQyBkcml2ZXIgcmVzb3VyY2VzLgorICAgICAqIFJlbGVhc2VzIHRoaXMgc3RhdGVtZW50J3MgZGF0YWJhc2UgYW5kIEpEQkMgZHJpdmVyIHJlc291cmNlcy4KICAgICAgKiA8cD4KICAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCB0byByZWxlYXNlIHRoZXNlIHJlc291cmNlcyBhcyBzb29uIGFzIHBvc3NpYmxlIGlzCi0gICAgICogc3Ryb25nbHkgcmVjb21tZW5kZWQuIEl0IGlzIG5vdCBhIGdvb2QgaWRlYSB0byByZWx5IG9uIHRoZXNlIHJlc291cmNlcwotICAgICAqIGJlaW5nIHJlbGVhc2VkIHdoZW4gdGhlIFN0YXRlbWVudCBvYmplY3QgaXMgZmluYWxpemVkIGR1cmluZyBnYXJiYWdlCi0gICAgICogY29sbGVjdGlvbi4gRG9pbmcgc28gY2FuIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlCi0gICAgICogY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgYXBwbGljYXRpb24uCisgICAgICogc3Ryb25nbHkgcmVjb21tZW5kZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE9uZSBzaG91bGQgbm90IHJlbHkgb24gdGhlIHJlc291cmNlcyBiZWluZyBhdXRvbWF0aWNhbGx5IHJlbGVhc2VkIHdoZW4KKyAgICAgKiBmaW5hbGl6ZWQgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gRG9pbmcgc28gY2FuIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlCisgICAgICogYmVoYXZpb3IgZm9yIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgc3VwcGxpZWQgU1FMIHN0YXRlbWVudC4gVGhpcyBtYXkgcmV0dXJuIG11bHRpcGxlIFJlc3VsdFNldHMuCisgICAgICogRXhlY3V0ZXMgYSBzdXBwbGllZCBTUUwgc3RhdGVtZW50LiBUaGlzIG1heSByZXR1cm4gbXVsdGlwbGUge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fXMuCiAgICAgICogPHA+Ci0gICAgICogVXNlIHRoZSA8Y29kZT5nZXRSZXN1bHRTZXQ8L2NvZGU+IG9yIDxjb2RlPmdldFVwZGF0ZUNvdW50PC9jb2RlPgotICAgICAqIG1ldGhvZHMgdG8gZ2V0IHRoZSBmaXJzdCByZXN1bHQgYW5kIDxjb2RlPmdldE1vcmVSZXN1bHRzPC9jb2RlPiB0byBnZXQKLSAgICAgKiBhbnkgc3Vic2VxdWVudCByZXN1bHRzLgorICAgICAqIFVzZSB0aGUge0Bjb2RlIGdldFJlc3VsdFNldH0gb3Ige0Bjb2RlIGdldFVwZGF0ZUNvdW50fSBtZXRob2RzIHRvIGdldCB0aGUKKyAgICAgKiBmaXJzdCByZXN1bHQgYW5kIHtAY29kZSBnZXRNb3JlUmVzdWx0c30gdG8gZ2V0IGFueSBzdWJzZXF1ZW50IHJlc3VsdHMuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzcWwKICAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIFJlc3VsdFNldCwgZmFsc2UgaWYgdGhlIGZpcnN0Ci0gICAgICogICAgICAgICByZXN1bHQgaXMgYW4gdXBkYXRlIGNvdW50IG9yIGlmIHRoZXJlIGlzIG5vIHJlc3VsdAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBmaXJzdCByZXN1bHQgaXMgYSB7QGNvZGUgUmVzdWx0U2V0fSwge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhbiB1cGRhdGUgY291bnQgb3IgaWYgdGhlcmUgaXMgbm8KKyAgICAgKiAgICAgICAgIHJlc3VsdC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZXMgYSBzdXBwbGllZCBTUUwgc3RhdGVtZW50LiBUaGlzIG1heSByZXR1cm4gbXVsdGlwbGUgUmVzdWx0U2V0cy4KLSAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgY29udHJvbCBvZiB3aGV0aGVyIGF1dG8tZ2VuZXJhdGVkIEtleXMgc2hvdWxkIGJlIG1hZGUKLSAgICAgKiBhdmFpbGFibGUgZm9yIHJldHJpZXZhbCwgaWYgdGhlIFNRTCBzdGF0ZW1lbnQgaXMgYW4gSU5TRVJUIHN0YXRlbWVudC4KKyAgICAgKiBFeGVjdXRlcyBhIHN1cHBsaWVkIFNRTCBzdGF0ZW1lbnQuIFRoaXMgbWF5IHJldHVybiBtdWx0aXBsZSB7QGNvZGUKKyAgICAgKiBSZXN1bHRTZXR9cy4gVGhpcyBtZXRob2QgYWxsb3dzIGNvbnRyb2wgb2Ygd2hldGhlciBhdXRvLWdlbmVyYXRlZCBLZXlzCisgICAgICogc2hvdWxkIGJlIG1hZGUgYXZhaWxhYmxlIGZvciByZXRyaWV2YWwsIGlmIHRoZSBTUUwgc3RhdGVtZW50IGlzIGFuCisgICAgICoge0Bjb2RlIElOU0VSVH0gc3RhdGVtZW50LgogICAgICAqIDxwPgotICAgICAqIFVzZSB0aGUgPGNvZGU+Z2V0UmVzdWx0U2V0PC9jb2RlPiBvciA8Y29kZT5nZXRVcGRhdGVDb3VudDwvY29kZT4KLSAgICAgKiBtZXRob2RzIHRvIGdldCB0aGUgZmlyc3QgcmVzdWx0IGFuZCA8Y29kZT5nZXRNb3JlUmVzdWx0czwvY29kZT4gdG8gZ2V0Ci0gICAgICogYW55IHN1YnNlcXVlbnQgcmVzdWx0cy4KKyAgICAgKiBVc2UgdGhlIHtAY29kZSBnZXRSZXN1bHRTZXR9IG9yIHtAY29kZSBnZXRVcGRhdGVDb3VudH0gbWV0aG9kcyB0byBnZXQgdGhlCisgICAgICogZmlyc3QgcmVzdWx0IGFuZCB7QGNvZGUgZ2V0TW9yZVJlc3VsdHN9IHRvIGdldCBhbnkgc3Vic2VxdWVudCByZXN1bHRzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudCB0byBleGVjdXRlCisgICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudCB0byBleGVjdXRlLgogICAgICAqIEBwYXJhbSBhdXRvR2VuZXJhdGVkS2V5cwogICAgICAqICAgICAgICAgICAgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBtYWtlIGF1dG8gZ2VuZXJhdGVkIGtleXMKLSAgICAgKiAgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG9uZSBvZgotICAgICAqICAgICAgICAgICAgU3RhdGVtZW50Lk5PX0dFTkVSQVRFRF9LRVlTIG9yIFN0YXRlbWVudC5SRVRVUk5fR0VORVJBVEVEX0tFWVMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVzdWx0cyBleGlzdHMgYW5kIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBSZXN1bHRTZXQsIGZhbHNlCi0gICAgICogICAgICAgICBpZiB0aGUgZmlyc3QgcmVzdWx0IGlzIGFuIHVwZGF0ZSBjb3VudCBvciBpZiB0aGVyZSBpcyBubyByZXN1bHQKKyAgICAgKiAgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG9uZSBvZiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFN0YXRlbWVudC5OT19HRU5FUkFURURfS0VZU30gb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBTdGF0ZW1lbnQuUkVUVVJOX0dFTkVSQVRFRF9LRVlTfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiByZXN1bHRzIGV4aXN0cyBhbmQgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0fSwge0Bjb2RlIGZhbHNlfSBpZiB0aGUgZmlyc3QgcmVzdWx0IGlzIGFuIHVwZGF0ZSBjb3VudAorICAgICAqICAgICAgICAgb3IgaWYgdGhlcmUgaXMgbm8gcmVzdWx0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyBzcWwsIGludCBhdXRvR2VuZXJhdGVkS2V5cykKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgc3VwcGxpZWQgU1FMIHN0YXRlbWVudC4gVGhpcyBtYXkgcmV0dXJuIG11bHRpcGxlIFJlc3VsdFNldHMuCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHJldHJpZXZhbCBvZiBhdXRvIGdlbmVyYXRlZCBrZXlzIHNwZWNpZmllZCBieSB0aGUKLSAgICAgKiBzdXBwbGllZCBhcnJheSBvZiBjb2x1bW4gaW5kZXhlcywgaWYgdGhlIFNRTCBzdGF0ZW1lbnQgaXMgYW4gSU5TRVJUCi0gICAgICogc3RhdGVtZW50LgorICAgICAqIEV4ZWN1dGVzIHRoZSBzdXBwbGllZCBTUUwgc3RhdGVtZW50LiBUaGlzIG1heSByZXR1cm4gbXVsdGlwbGUge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fXMuIFRoaXMgbWV0aG9kIGFsbG93cyByZXRyaWV2YWwgb2YgYXV0byBnZW5lcmF0ZWQga2V5cworICAgICAqIHNwZWNpZmllZCBieSB0aGUgc3VwcGxpZWQgYXJyYXkgb2YgY29sdW1uIGluZGV4ZXMsIGlmIHRoZSBTUUwgc3RhdGVtZW50CisgICAgICogaXMgYW4ge0Bjb2RlIElOU0VSVH0gc3RhdGVtZW50LgogICAgICAqIDxwPgotICAgICAqIFVzZSB0aGUgPGNvZGU+Z2V0UmVzdWx0U2V0PC9jb2RlPiBvciA8Y29kZT5nZXRVcGRhdGVDb3VudDwvY29kZT4KLSAgICAgKiBtZXRob2RzIHRvIGdldCB0aGUgZmlyc3QgcmVzdWx0IGFuZCA8Y29kZT5nZXRNb3JlUmVzdWx0czwvY29kZT4gdG8gZ2V0Ci0gICAgICogYW55IHN1YnNlcXVlbnQgcmVzdWx0cy4KKyAgICAgKiBVc2UgdGhlIHtAY29kZSBnZXRSZXN1bHRTZXR9IG9yIHtAY29kZSBnZXRVcGRhdGVDb3VudH0gbWV0aG9kcyB0byBnZXQgdGhlCisgICAgICogZmlyc3QgcmVzdWx0IGFuZCB7QGNvZGUgZ2V0TW9yZVJlc3VsdHN9IHRvIGdldCBhbnkgc3Vic2VxdWVudCByZXN1bHRzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudCB0byBleGVjdXRlCisgICAgICogICAgICAgICAgICB0aGUgU1FMIHN0YXRlbWVudCB0byBleGVjdXRlLgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleGVzCiAgICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiBpbmRleGVzIG9mIHRoZSBjb2x1bW5zIGluIHRoZSBpbnNlcnRlZCByb3cgd2hpY2gKLSAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsIHZpYSB0aGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmdldEdlbmVyYXRlZEtleXM8L2NvZGU+IG1ldGhvZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIFJlc3VsdFNldCwgZmFsc2UgaWYgdGhlIGZpcnN0Ci0gICAgICogICAgICAgICByZXN1bHQgaXMgYW4gdXBkYXRlIGNvdW50IG9yIGlmIHRoZXJlIGlzIG5vIHJlc3VsdAorICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIG1hZGUgYXZhaWxhYmxlIGZvciByZXRyaWV2YWwgdmlhIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGdldEdlbmVyYXRlZEtleXN9IG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZmlyc3QgcmVzdWx0IGlzIGEge0Bjb2RlIFJlc3VsdFNldH0sIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IGlmIHRoZSBmaXJzdCByZXN1bHQgaXMgYW4gdXBkYXRlIGNvdW50IG9yIGlmIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICByZXN1bHQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHNxbCwgaW50W10gY29sdW1uSW5kZXhlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzdXBwbGllZCBTUUwgc3RhdGVtZW50LiBUaGlzIG1heSByZXR1cm4gbXVsdGlwbGUgUmVzdWx0U2V0cy4KLSAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgcmV0cmlldmFsIG9mIGF1dG8gZ2VuZXJhdGVkIGtleXMgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIHN1cHBsaWVkIGFycmF5IG9mIGNvbHVtbiBpbmRleGVzLCBpZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBhbiBJTlNFUlQKLSAgICAgKiBzdGF0ZW1lbnQuCisgICAgICogRXhlY3V0ZXMgdGhlIHN1cHBsaWVkIFNRTCBzdGF0ZW1lbnQuIFRoaXMgbWF5IHJldHVybiBtdWx0aXBsZSB7QGNvZGUKKyAgICAgKiBSZXN1bHRTZXR9cy4gVGhpcyBtZXRob2QgYWxsb3dzIHJldHJpZXZhbCBvZiBhdXRvIGdlbmVyYXRlZCBrZXlzCisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBzdXBwbGllZCBhcnJheSBvZiBjb2x1bW4gaW5kZXhlcywgaWYgdGhlIFNRTCBzdGF0ZW1lbnQKKyAgICAgKiBpcyBhbiB7QGNvZGUgSU5TRVJUfSBzdGF0ZW1lbnQuCiAgICAgICogPHA+Ci0gICAgICogVXNlIHRoZSA8Y29kZT5nZXRSZXN1bHRTZXQ8L2NvZGU+IG9yIDxjb2RlPmdldFVwZGF0ZUNvdW50PC9jb2RlPgotICAgICAqIG1ldGhvZHMgdG8gZ2V0IHRoZSBmaXJzdCByZXN1bHQgYW5kIDxjb2RlPmdldE1vcmVSZXN1bHRzPC9jb2RlPiB0byBnZXQKLSAgICAgKiBhbnkgc3Vic2VxdWVudCByZXN1bHRzLgorICAgICAqIFVzZSB0aGUge0Bjb2RlIGdldFJlc3VsdFNldH0gb3Ige0Bjb2RlIGdldFVwZGF0ZUNvdW50fSBtZXRob2RzIHRvIGdldCB0aGUKKyAgICAgKiBmaXJzdCByZXN1bHQgYW5kIHtAY29kZSBnZXRNb3JlUmVzdWx0c30gdG8gZ2V0IGFueSBzdWJzZXF1ZW50IHJlc3VsdHMuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzcWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUuCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWVzCiAgICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMgaW4gdGhlIGluc2VydGVkIHJvdyB3aGljaCBzaG91bGQgYmUKLSAgICAgKiAgICAgICAgICAgIG1hZGUgYXZhaWxhYmxlIGZvciByZXRyaWV2YWwgdmlhIHRoZQotICAgICAqICAgICAgICAgICAgPGNvZGU+Z2V0R2VuZXJhdGVkS2V5czwvY29kZT4gbWV0aG9kLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlyc3QgcmVzdWx0IGlzIGEgUmVzdWx0U2V0LCBmYWxzZSBpZiB0aGUgZmlyc3QKLSAgICAgKiAgICAgICAgIHJlc3VsdCBpcyBhbiB1cGRhdGUgY291bnQgb3IgaWYgdGhlcmUgaXMgbm8gcmVzdWx0CisgICAgICogICAgICAgICAgICBtYWRlIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsIHZpYSB0aGUge0Bjb2RlIGdldEdlbmVyYXRlZEtleXN9CisgICAgICogICAgICAgICAgICBtZXRob2QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIHtAY29kZSBSZXN1bHRTZXR9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgIGZhbHNlfSBpZiB0aGUgZmlyc3QgcmVzdWx0IGlzIGFuIHVwZGF0ZSBjb3VudCBvciBpZiB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgcmVzdWx0CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHNxbCwgU3RyaW5nW10gY29sdW1uTmFtZXMpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwpAQCAtMjE5LDU3ICsyNjIsNjIgQEAKICAgICAgKiB1cGRhdGUgY291bnRzLCBpZiBhbGwgdGhlIGNvbW1hbmRzIGV4ZWN1dGUgc3VjY2Vzc2Z1bGx5LgogICAgICAqIDxwPgogICAgICAqIElmIG9uZSBvZiB0aGUgY29tbWFuZHMgaW4gdGhlIGJhdGNoIGZhaWxzLCB0aGlzIG1ldGhvZCBjYW4gdGhyb3cgYQotICAgICAqIEJhdGNoVXBkYXRlRXhjZXB0aW9uIGFuZCB0aGUgSkRCQyBkcml2ZXIgbWF5IG9yIG1heSBub3QgcHJvY2VzcyB0aGUKLSAgICAgKiByZW1haW5pbmcgY29tbWFuZHMuIFRoZSBKREJDIGRyaXZlciBtdXN0IGJlaGF2ZSBjb25zaXN0ZW50bHkgd2l0aCB0aGUKLSAgICAgKiB1bmRlcmx5aW5nIGRhdGFiYXNlLCBlaXRoZXIgYWx3YXlzIGNvbnRpbnVpbmcgb3IgbmV2ZXIgY29udGludWluZy4gSWYgdGhlCisgICAgICoge0BsaW5rIEJhdGNoVXBkYXRlRXhjZXB0aW9ufSBhbmQgdGhlIEpEQkMgZHJpdmVyIG1heSBvciBtYXkgbm90IHByb2Nlc3MKKyAgICAgKiB0aGUgcmVtYWluaW5nIGNvbW1hbmRzLiBUaGUgSkRCQyBkcml2ZXIgbXVzdCBiZWhhdmUgY29uc2lzdGVudGx5IHdpdGggdGhlCisgICAgICogdW5kZXJseWluZyBkYXRhYmFzZSwgZm9sbG93aW5nIHRoZSAiYWxsIG9yIG5vdGhpbmciIHByaW5jaXBsZS4gSWYgdGhlCiAgICAgICogZHJpdmVyIGNvbnRpbnVlcyBwcm9jZXNzaW5nLCB0aGUgYXJyYXkgb2YgcmVzdWx0cyByZXR1cm5lZCBjb250YWlucyB0aGUKICAgICAgKiBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyB0aGVyZSBhcmUgY29tbWFuZHMgaW4gdGhlIGJhdGNoLCB3aXRoIGEKLSAgICAgKiBtaW5pbXVtIG9mIG9uZSBvZiB0aGUgZWxlbWVudHMgaGF2aW5nIHRoZSBFWEVDVVRFX0ZBSUxFRCB2YWx1ZS4KKyAgICAgKiBtaW5pbXVtIG9mIG9uZSBvZiB0aGUgZWxlbWVudHMgaGF2aW5nIHRoZSB7QGNvZGUgRVhFQ1VURV9GQUlMRUR9IHZhbHVlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdXBkYXRlIGNvdW50cywgd2l0aCBvbmUgZW50cnkgZm9yIGVhY2ggY29tbWFuZCBpbiB0aGUKICAgICAgKiAgICAgICAgIGJhdGNoLiBUaGUgZWxlbWVudHMgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbiB3aGljaAogICAgICAqICAgICAgICAgdGhlIGNvbW1hbmRzIHdlcmUgYWRkZWQgdG8gdGhlIGJhdGNoLgogICAgICAqICAgICAgICAgPHA+CiAgICAgICogICAgICAgICA8b2w+Ci0gICAgICogICAgICAgICA8bGk+IElmIHRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IGlzID49MCwgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZAotICAgICAqICAgICAgICAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHZhbHVlIGlzIHRoZSB1cGRhdGUgY291bnQgZm9yIHRoYXQKLSAgICAgKiAgICAgICAgIGNvbW1hbmQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZGF0YWJhc2UgYWZmZWN0ZWQgYnkKLSAgICAgKiAgICAgICAgIHRoZSBjb21tYW5kLjwvbGk+Ci0gICAgICogICAgICAgICA8bGk+IElmIHRoZSB2YWx1ZSBpcyBTVUNDRVNTX05PX0lORk8sIHRoZSBjb21tYW5kIGNvbXBsZXRlZAotICAgICAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGJ1dCB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgaXMgdW5rbm93bi4KKyAgICAgKiAgICAgICAgIDxsaT5JZiB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCBpcyAmZ2U7IDAsIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICBjb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgPGk+dXBkYXRlCisgICAgICogICAgICAgICBjb3VudDwvaT4gKHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZGF0YWJhc2UgYWZmZWN0ZWQgYnkgdGhlCisgICAgICogICAgICAgICBjb21tYW5kKSBmb3IgdGhhdCBjb21tYW5kLjwvbGk+CisgICAgICogICAgICAgICA8bGk+SWYgdGhlIHZhbHVlIGlzIHtAY29kZSBTVUNDRVNTX05PX0lORk99LCB0aGUgY29tbWFuZAorICAgICAqICAgICAgICAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGlzCisgICAgICogICAgICAgICB1bmtub3duLgogICAgICAqICAgICAgICAgPGxpPgotICAgICAqICAgICAgICAgPGxpPiBJZiB0aGUgdmFsdWUgaXMgRVhFQ1VURV9GQUlMRUQsIHRoZSBjb21tYW5kIGZhaWxlZC4KKyAgICAgKiAgICAgICAgIDxsaT5JZiB0aGUgdmFsdWUgaXMge0Bjb2RlIEVYRUNVVEVfRkFJTEVEfSwgdGhlIGNvbW1hbmQgZmFpbGVkLgogICAgICAqICAgICAgICAgPC9vbD4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGV4ZWN1dGVCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlcyBhIHN1cHBsaWVkIFNRTCBzdGF0ZW1lbnQuIFJldHVybnMgYSBzaW5nbGUgUmVzdWx0U2V0LgorICAgICAqIEV4ZWN1dGVzIGEgc3VwcGxpZWQgU1FMIHN0YXRlbWVudC4gUmV0dXJucyBhIHNpbmdsZSB7QGNvZGUgUmVzdWx0U2V0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICBhbiBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUuIFR5cGljYWxseSBhIFNFTEVDVCBzdGF0ZW1lbnQKLSAgICAgKiBAcmV0dXJuIGEgUmVzdWx0U2V0IGNvbnRhaW5pbmcgdGhlIGRhdGEgcHJvZHVjZWQgYnkgdGhlIFNRTCBzdGF0ZW1lbnQuCi0gICAgICogICAgICAgICBOZXZlciBudWxsLgorICAgICAqICAgICAgICAgICAgYW4gU1FMIHN0YXRlbWVudCB0byBleGVjdXRlLiBUeXBpY2FsbHkgYSB7QGNvZGUgU0VMRUNUfQorICAgICAqICAgICAgICAgICAgc3RhdGVtZW50CisgICAgICogQHJldHVybiBhIHtAY29kZSBSZXN1bHRTZXR9IGNvbnRhaW5pbmcgdGhlIGRhdGEgcHJvZHVjZWQgYnkgdGhlIFNRTAorICAgICAqICAgICAgICAgc3RhdGVtZW50LiBOZXZlciBudWxsLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2Ugb3IgaWYgdGhlIHN0YXRlbWVudAotICAgICAqICAgICAgICAgICAgIHByb2R1Y2VzIGFueXRoaW5nIG90aGVyIHRoYW4gYSBzaW5nbGUgUmVzdWx0U2V0CisgICAgICogICAgICAgICAgICAgcHJvZHVjZXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNpbmdsZSB7QGNvZGUgUmVzdWx0U2V0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeShTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHN1cHBsaWVkIFNRTCBzdGF0ZW1lbnQuIFRoZSBzdGF0ZW1lbnQgbWF5IGJlIGFuIElOU0VSVCwKLSAgICAgKiBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudCBvciBhIHN0YXRlbWVudCB3aGljaCByZXR1cm5zIG5vdGhpbmcuCisgICAgICogRXhlY3V0ZXMgdGhlIHN1cHBsaWVkIFNRTCBzdGF0ZW1lbnQuIFRoZSBzdGF0ZW1lbnQgbWF5IGJlIGFuIHtAY29kZQorICAgICAqIElOU0VSVH0sIHtAY29kZSBVUERBVEV9IG9yIHtAY29kZSBERUxFVEV9IHN0YXRlbWVudCBvciBhIHN0YXRlbWVudCB3aGljaAorICAgICAqIHJldHVybnMgbm90aGluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICBhbiBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUgLSBhbiBTUUwgSU5TRVJULCBVUERBVEUsIERFTEVURSBvcgotICAgICAqICAgICAgICAgICAgYSBzdGF0ZW1lbnQgd2hpY2ggcmV0dXJucyBub3RoaW5nCisgICAgICogICAgICAgICAgICBhbiBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUgLSBhbiBTUUwge0Bjb2RlIElOU0VSVH0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgVVBEQVRFfSwge0Bjb2RlIERFTEVURX0gb3IgYSBzdGF0ZW1lbnQgd2hpY2ggcmV0dXJucyBub3RoaW5nCiAgICAgICogQHJldHVybiB0aGUgY291bnQgb2YgdXBkYXRlZCByb3dzLCBvciAwIGZvciBhIHN0YXRlbWVudCB0aGF0IHJldHVybnMKICAgICAgKiAgICAgICAgIG5vdGhpbmcuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUgc3RhdGVtZW50Ci0gICAgICogICAgICAgICAgICAgcHJvZHVjZXMgYSBSZXN1bHRTZXQKKyAgICAgKiAgICAgICAgICAgICBwcm9kdWNlcyBhIHtAY29kZSBSZXN1bHRTZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC0yNzgsMTcgKzMyNiwyMCBAQAogICAgICAqIHdoZXRoZXIgYXV0by1nZW5lcmF0ZWQgS2V5cyBzaG91bGQgYmUgbWFkZSBhdmFpbGFibGUgZm9yIHJldHJpZXZhbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICBhbiBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUgLSBhbiBTUUwgSU5TRVJULCBVUERBVEUsIERFTEVURSBvcgotICAgICAqICAgICAgICAgICAgYSBzdGF0ZW1lbnQgd2hpY2ggZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgorICAgICAqICAgICAgICAgICAgYW4gU1FMIHN0YXRlbWVudCB0byBleGVjdXRlIC0gYW4gU1FMIHtAY29kZSBJTlNFUlR9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFVQREFURX0sIHtAY29kZSBERUxFVEV9IG9yIGEgc3RhdGVtZW50IHdoaWNoIGRvZXMgbm90IHJldHVybgorICAgICAqICAgICAgICAgICAgYW55dGhpbmcuCiAgICAgICogQHBhcmFtIGF1dG9HZW5lcmF0ZWRLZXlzCiAgICAgICogICAgICAgICAgICBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0byBhbGxvdyByZXRyaWV2YWwgb2YgYXV0bwotICAgICAqICAgICAgICAgICAgZ2VuZXJhdGVkIGtleXMuIFBhcmFtZXRlciBtdXN0IGJlIG9uZSBvZgotICAgICAqICAgICAgICAgICAgU3RhdGVtZW50LlJFVFVSTl9HRU5FUkFURURfS0VZUyBvciBTdGF0ZW1lbnQuTk9fR0VORVJBVEVEX0tFWVMKKyAgICAgKiAgICAgICAgICAgIGdlbmVyYXRlZCBrZXlzLiBQYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2Yge0Bjb2RlCisgICAgICogICAgICAgICAgICBTdGF0ZW1lbnQuUkVUVVJOX0dFTkVSQVRFRF9LRVlTfSBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFN0YXRlbWVudC5OT19HRU5FUkFURURfS0VZU30KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdXBkYXRlZCByb3dzLCBvciAwIGlmIHRoZSBzdGF0ZW1lbnQgcmV0dXJucwogICAgICAqICAgICAgICAgbm90aGluZy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIGlmIHRoZSBzdGF0ZW1lbnQKLSAgICAgKiAgICAgICAgICAgICBwcm9kdWNlcyBhIFJlc3VsdFNldAorICAgICAqICAgICAgICAgICAgIHByb2R1Y2VzIGEge0Bjb2RlIFJlc3VsdFNldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwsIGludCBhdXRvR2VuZXJhdGVkS2V5cykKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CkBAIC0yOTgsMTcgKzM0OSwxOCBAQAogICAgICAqIGdlbmVyYXRlZCBrZXlzIHNwZWNpZmllZCBieSB0aGUgc3VwcGxpZWQgYXJyYXkgb2YgY29sdW1uIGluZGV4ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNxbAotICAgICAqICAgICAgICAgICAgYW4gU1FMIHN0YXRlbWVudCB0byBleGVjdXRlIC0gYW4gU1FMIElOU0VSVCwgVVBEQVRFLCBERUxFVEUgb3IKLSAgICAgKiAgICAgICAgICAgIGEgc3RhdGVtZW50IHdoaWNoIHJldHVybnMgbm90aGluZworICAgICAqICAgICAgICAgICAgYW4gU1FMIHN0YXRlbWVudCB0byBleGVjdXRlIC0gYW4gU1FMIHtAY29kZSBJTlNFUlR9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFVQREFURX0sIHtAY29kZSBERUxFVEV9IG9yIGEgc3RhdGVtZW50IHdoaWNoIHJldHVybnMgbm90aGluZwogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleGVzCiAgICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiBpbmRleGVzIG9mIHRoZSBjb2x1bW5zIGluIHRoZSBpbnNlcnRlZCByb3cgd2hpY2gKLSAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsIHZpYSB0aGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmdldEdlbmVyYXRlZEtleXM8L2NvZGU+IG1ldGhvZC4KKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsIHZpYSB0aGUge0Bjb2RlCisgICAgICogICAgICAgICAgICBnZXRHZW5lcmF0ZWRLZXlzfSBtZXRob2QuCiAgICAgICogQHJldHVybiB0aGUgY291bnQgb2YgdXBkYXRlZCByb3dzLCBvciAwIGZvciBhIHN0YXRlbWVudCB0aGF0IHJldHVybnMKICAgICAgKiAgICAgICAgIG5vdGhpbmcuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUgc3RhdGVtZW50Ci0gICAgICogICAgICAgICAgICAgcHJvZHVjZXMgYSBSZXN1bHRTZXQKKyAgICAgKiAgICAgICAgICAgICBwcm9kdWNlcyBhIHtAY29kZSBSZXN1bHRTZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgc3FsLCBpbnRbXSBjb2x1bW5JbmRleGVzKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKQEAgLTMxOCwyMTkgKzM3MCwyNTEgQEAKICAgICAgKiBnZW5lcmF0ZWQga2V5cyBzcGVjaWZpZWQgYnkgdGhlIHN1cHBsaWVkIGFycmF5IG9mIGNvbHVtbiBuYW1lcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3FsCi0gICAgICogICAgICAgICAgICBhbiBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUgLSBhbiBTUUwgSU5TRVJULCBVUERBVEUsIERFTEVURSBvcgotICAgICAqICAgICAgICAgICAgYSBzdGF0ZW1lbnQgd2hpY2ggcmV0dXJucyBub3RoaW5nCisgICAgICogICAgICAgICAgICBhbiBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUgLSBhbiBTUUwge0Bjb2RlIElOU0VSVH0sIHtAY29kZQorICAgICAqICAgICAgICAgICAgVVBEQVRFfSwge0Bjb2RlIERFTEVURX0gb3IgYSBzdGF0ZW1lbnQgd2hpY2ggcmV0dXJucyBub3RoaW5nCiAgICAgICogQHBhcmFtIGNvbHVtbk5hbWVzCiAgICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMgaW4gdGhlIGluc2VydGVkIHJvdyB3aGljaCBzaG91bGQgYmUKLSAgICAgKiAgICAgICAgICAgIG1hZGUgYXZhaWxhYmxlIGZvciByZXRyaWV2YWwgdmlhIHRoZQotICAgICAqICAgICAgICAgICAgPGNvZGU+Z2V0R2VuZXJhdGVkS2V5czwvY29kZT4gbWV0aG9kLgorICAgICAqICAgICAgICAgICAgbWFkZSBhdmFpbGFibGUgZm9yIHJldHJpZXZhbCB2aWEgdGhlIHtAY29kZSBnZXRHZW5lcmF0ZWRLZXlzfQorICAgICAqICAgICAgICAgICAgbWV0aG9kLgogICAgICAqIEByZXR1cm4gdGhlIGNvdW50IG9mIHVwZGF0ZWQgcm93cywgb3IgMCBmb3IgYSBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zCiAgICAgICogICAgICAgICBub3RoaW5nLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2Ugb3IgaWYgdGhlIHN0YXRlbWVudAotICAgICAqICAgICAgICAgICAgIHByb2R1Y2VzIGEgUmVzdWx0U2V0CisgICAgICogICAgICAgICAgICAgcHJvZHVjZXMgYSB7QGNvZGUgUmVzdWx0U2V0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHNxbCwgU3RyaW5nW10gY29sdW1uTmFtZXMpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgQ29ubmVjdGlvbiB0aGF0IHByb2R1Y2VkIHRoaXMgU3RhdGVtZW50LgorICAgICAqIEdldHMgdGhlIHtAY29kZSBDb25uZWN0aW9ufSBvYmplY3Qgd2hpY2ggY3JlYXRlZCB0aGlzIHN0YXRlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDb25uZWN0aW9uCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIENvbm5lY3Rpb259IHRocm91Z2ggd2hpY2ggdGhpcyBzdGF0ZW1lbnQgaXMKKyAgICAgKiAgICAgICAgIHRyYW5zbWl0dGVkIHRvIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGRpcmVjdGlvbiBmb3IgZmV0Y2hpbmcgcm93cyBmb3IgUmVzdWx0U2V0cyBnZW5lcmF0ZWQKLSAgICAgKiBmcm9tIHRoaXMgU3RhdGVtZW50LgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgZGlyZWN0aW9uIGZvciBmZXRjaGluZyByb3dzIGZvciB7QGNvZGUgUmVzdWx0U2V0fXMKKyAgICAgKiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0YXRlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgZGVzY3JpYmluZyB0aGUgZGVmYXVsdCBmZXRjaCBkaXJlY3Rpb24sIG9uZSBvZjoKLSAgICAgKiAgICAgICAgIFJlc3VsdFNldC5GRVRDSF9GT1JXQVJELCBSZXN1bHRTZXQuRkVUQ0hfUkVWRVJTRSwKLSAgICAgKiAgICAgICAgIFJlc3VsdFNldC5GRVRDSF9VTktOT1dOCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmZXRjaCBkaXJlY3Rpb24sIG9uZSBvZjoKKyAgICAgKiAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgIDxsaT5SZXN1bHRTZXQuRkVUQ0hfRk9SV0FSRDwvbGk+IDxsaT5SZXN1bHRTZXQuRkVUQ0hfUkVWRVJTRTwvbGk+CisgICAgICogICAgICAgICA8bGk+UmVzdWx0U2V0LkZFVENIX1VOS05PV048L2xpPgorICAgICAqICAgICAgICAgPC91bD4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRGZXRjaERpcmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IG51bWJlciBvZiByb3dzIGZvciBhIGZldGNoIGZvciB0aGUgUmVzdWx0U2V0IG9iamVjdHMKLSAgICAgKiByZXR1cm5lZCBmcm9tIHRoaXMgU3RhdGVtZW50LgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIHJvd3MgZm9yIGEgZmV0Y2ggZm9yIHRoZSB7QGNvZGUgUmVzdWx0U2V0fQorICAgICAqIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB0aGlzIHN0YXRlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGZldGNoIHNpemUgZm9yIFJlc3VsdFNldHMgcHJvZHVjZWQgYnkgdGhpcyBTdGF0ZW1lbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGZldGNoIHNpemUgZm9yIHtAY29kZSBSZXN1bHRTZXR9cyBwcm9kdWNlZCBieSB0aGlzCisgICAgICogICAgICAgICBzdGF0ZW1lbnQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hTaXplKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYXV0byBnZW5lcmF0ZWQga2V5cyBjcmVhdGVkIGJ5IGV4ZWN1dGluZyB0aGlzIFN0YXRlbWVudC4KKyAgICAgKiBSZXR1cm5zIGF1dG8gZ2VuZXJhdGVkIGtleXMgY3JlYXRlZCBieSBleGVjdXRpbmcgdGhpcyBzdGF0ZW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFJlc3VsdFNldCBjb250YWluaW5nIHRoZSBhdXRvIGdlbmVyYXRlZCBrZXlzIC0gZW1wdHkgaWYgbm8ga2V5cwotICAgICAqICAgICAgICAgd2VyZSBnZW5lcmF0ZWQgYnkgdGhlIFN0YXRlbWVudAorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUmVzdWx0U2V0fSBjb250YWluaW5nIHRoZSBhdXRvIGdlbmVyYXRlZCBrZXlzIC0gZW1wdHkgaWYKKyAgICAgKiAgICAgICAgIG5vIGtleXMgYXJlIGdlbmVyYXRlZCBieSB0aGlzIHN0YXRlbWVudC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFJlc3VsdFNldCBnZXRHZW5lcmF0ZWRLZXlzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBiZSByZXR1cm5lZCBmb3IgdmFsdWVzIGZyb20KLSAgICAgKiBDaGFyYWN0ZXIgYW5kIEJpbmFyeSB2YWx1ZXMgaW4gYSBSZXN1bHRTZXQgZGVyaXZlZCBmcm9tIHRoaXMgU3RhdGVtZW50LgotICAgICAqIFRoaXMgbGltaXQgYXBwbGllcyB0byBCSU5BUlksIFZBUkJJTkFSWSwgTE9OR1ZBUkJJTkFSWSwgQ0hBUiwgVkFSQ0hBUiwKLSAgICAgKiBhbmQgTE9OR1ZBUkNIQVIgdHlwZXMuIEFueSBkYXRhIGV4Y2VlZGluZyB0aGUgbWF4aW11bSBzaXplIGlzIGFiYW5kb25lZAorICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBiZSByZXR1cm5lZCBhcyB2YWx1ZXMgZnJvbQorICAgICAqIGNoYXJhY3RlciBhbmQgYmluYXJ5IHR5cGUgY29sdW1ucyBpbiBhIHtAY29kZSBSZXN1bHRTZXR9IGRlcml2ZWQgZnJvbSB0aGlzCisgICAgICogc3RhdGVtZW50LiBUaGlzIGxpbWl0IGFwcGxpZXMgdG8ge0Bjb2RlIEJJTkFSWX0sIHtAY29kZSBWQVJCSU5BUll9LAorICAgICAqIHtAY29kZSBMT05HVkFSQklOQVJZfSwge0Bjb2RlIENIQVJ9LCB7QGNvZGUgVkFSQ0hBUn0sIGFuZCB7QGNvZGUKKyAgICAgKiBMT05HVkFSQ0hBUn0gdHlwZXMuIEFueSBkYXRhIGV4Y2VlZGluZyB0aGUgbWF4aW11bSBzaXplIGlzIGFiYW5kb25lZAogICAgICAqIHdpdGhvdXQgYW5ub3VuY2VtZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2l6ZSBsaW1pdCwgd2hlcmUgMCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIGxpbWl0CisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBzaXplIGxpbWl0LCB3aGVyZSB7QGNvZGUgMH0gbWVhbnMgdGhhdCB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgbGltaXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4RmllbGRTaXplKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCBhIFJlc3VsdFNldCBjYW4gY29udGFpbiB3aGVuCi0gICAgICogcHJvZHVjZWQgZnJvbSB0aGlzIFN0YXRlbWVudC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCB0aGUgZXhjZXNzIHJvd3MKKyAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgYSB7QGNvZGUgUmVzdWx0U2V0fSBjYW4gY29udGFpbiB3aGVuCisgICAgICogcHJvZHVjZWQgZnJvbSB0aGlzIHN0YXRlbWVudC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCB0aGUgZXhjZXNzIHJvd3MKICAgICAgKiBhcmUgZGlzY2FyZGVkIHNpbGVudGx5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcm93IGxpbWl0LCB3aGVyZSAwIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gbGltaXQuCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCByb3cgbGltaXQsIHdoZXJlIHtAY29kZSAwfSBtZWFucyB0aGF0IHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICBsaW1pdC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhSb3dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIE1vdmVzIHRvIHRoaXMgU3RhdGVtZW50J3MgbmV4dCByZXN1bHQuIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIFJlc3VsdFNldC4KLSAgICAgKiBBbnkgY3VycmVudCBSZXN1bHRTZXQgb2JqZWN0cyBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGgKLSAgICAgKiA8Y29kZT5nZXRSZXN1bHRTZXQoKTwvY29kZT4gYXJlIGNsb3NlZCBpbXBsaWNpdGx5LgorICAgICAqIE1vdmVzIHRvIHRoaXMgc3RhdGVtZW50J3MgbmV4dCByZXN1bHQuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGl0IGlzIGEKKyAgICAgKiB7QGNvZGUgUmVzdWx0U2V0fS4gQW55IGN1cnJlbnQge0Bjb2RlIFJlc3VsdFNldH0gb2JqZWN0cyBwcmV2aW91c2x5CisgICAgICogb2J0YWluZWQgd2l0aCB7QGNvZGUgZ2V0UmVzdWx0U2V0KCl9IGFyZSBjbG9zZWQgaW1wbGljaXRseS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5leHQgcmVzdWx0IGlzIGEgUmVzdWx0U2V0LCBmYWxzZSBpZiB0aGUgbmV4dCByZXN1bHQKLSAgICAgKiAgICAgICAgIGlzIG5vdCBhIFJlc3VsdFNldCBvciBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZXN1bHRzLiBOb3RlIHRoYXQgaWYKLSAgICAgKiAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5nZXRVcGRhdGVDb3VudDwvY29kZT4gd2lsbCByZXR1cm4gLTEuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgcmVzdWx0IGlzIGEge0Bjb2RlIFJlc3VsdFNldH0sIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IGlmIHRoZSBuZXh0IHJlc3VsdCBpcyBub3QgYSB7QGNvZGUgUmVzdWx0U2V0fSBvciBpZiB0aGVyZQorICAgICAqICAgICAgICAgYXJlIG5vIG1vcmUgcmVzdWx0cy4gTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSwgdGhpcworICAgICAqICAgICAgICAgbWV0aG9kIHdpbGwgcmV0dXJuIHtAY29kZSBmYWxzZX0gYW5kIHtAY29kZSBnZXRVcGRhdGVDb3VudH0gd2lsbAorICAgICAqICAgICAgICAgcmV0dXJuIC0xLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRNb3JlUmVzdWx0cygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBNb3ZlcyB0byB0aGlzIFN0YXRlbWVudCdzIG5leHQgcmVzdWx0LiBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgcmVzdWx0IGlzCi0gICAgICogYSBSZXN1bHRTZXQuIEFueSBjdXJyZW50IFJlc3VsdFNldCBvYmplY3RzIHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aAotICAgICAqIDxjb2RlPmdldFJlc3VsdFNldCgpPC9jb2RlPiBhcmUgaGFuZGxlZCBhcyBpbmRpY2F0ZWQgYnkgYSBzdXBwbGllZCBGbGFnCi0gICAgICogcGFyYW1ldGVyLgorICAgICAqIE1vdmVzIHRvIHRoaXMgc3RhdGVtZW50J3MgbmV4dCByZXN1bHQuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0CisgICAgICogcmVzdWx0IGlzIGEge0Bjb2RlIFJlc3VsdFNldH0uIEFueSBjdXJyZW50IHtAY29kZSBSZXN1bHRTZXR9IG9iamVjdHMKKyAgICAgKiBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGgge0Bjb2RlIGdldFJlc3VsdFNldCgpfSBhcmUgaGFuZGxlZCBhcyBpbmRpY2F0ZWQKKyAgICAgKiBieSBhIHN1cHBsaWVkIEZsYWcgcGFyYW1ldGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjdXJyZW50Ci0gICAgICogICAgICAgICAgICBhIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGRvIHdpdGggZXhpc3RpbmcgUmVzdWx0U2V0cy4gVGhpcwotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIG11c3QgYmUgb25lIG9mIFN0YXRlbWVudC5DTE9TRV9BTExfUkVTVUxUUywKLSAgICAgKiAgICAgICAgICAgIFN0YXRlbWVudC5DTE9TRV9DVVJSRU5UX1JFU1VMVCBvcgotICAgICAqICAgICAgICAgICAgU3RhdGVtZW50LktFRVBfQ1VSUkVOVF9SRVNVTFQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHJlc3VsdCBleGlzdHMgYW5kIGlzIGEgUmVzdWx0U2V0LCBmYWxzZSBpZiB0aGUKLSAgICAgKiAgICAgICAgIG5leHQgcmVzdWx0IGlzIG5vdCBhIFJlc3VsdFNldCBvciBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZXN1bHRzLgotICAgICAqICAgICAgICAgTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UKLSAgICAgKiAgICAgICAgIGFuZCA8Y29kZT5nZXRVcGRhdGVDb3VudDwvY29kZT4gd2lsbCByZXR1cm4gLTEuCisgICAgICogICAgICAgICAgICBhIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGRvIHdpdGggZXhpc3Rpbmcge0Bjb2RlIFJlc3VsdFNldH1zLgorICAgICAqICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2Yge0Bjb2RlCisgICAgICogICAgICAgICAgICBTdGF0ZW1lbnQuQ0xPU0VfQUxMX1JFU1VMVFN9LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFN0YXRlbWVudC5DTE9TRV9DVVJSRU5UX1JFU1VMVH0gb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBTdGF0ZW1lbnQuS0VFUF9DVVJSRU5UX1JFU1VMVH0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgcmVzdWx0IGV4aXN0cyBhbmQgaXMgYSB7QGNvZGUgUmVzdWx0U2V0fQorICAgICAqICAgICAgICAgLCB7QGNvZGUgZmFsc2V9IGlmIHRoZSBuZXh0IHJlc3VsdCBpcyBub3QgYSB7QGNvZGUgUmVzdWx0U2V0fSBvcgorICAgICAqICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcmVzdWx0cy4gTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSwKKyAgICAgKiAgICAgICAgIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHtAY29kZSBmYWxzZX0gYW5kIHtAY29kZSBnZXRVcGRhdGVDb3VudH0KKyAgICAgKiAgICAgICAgIHdpbGwgcmV0dXJuIC0xLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRNb3JlUmVzdWx0cyhpbnQgY3VycmVudCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIFN0YXRlbWVudCBleGVjdXRpb24uIFRoZSBKREJDIGRyaXZlciB3aWxsIHdhaXQKLSAgICAgKiB1cCB0byB0aGlzIHZhbHVlIGZvciB0aGUgZXhlY3V0aW9uIHRvIGNvbXBsZXRlIC0gYWZ0ZXIgdGhlIGxpbWl0IGlzCi0gICAgICogZXhjZWVkZWQgYW4gU1FMIEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogR2V0cyB0aGUgdGltZW91dCB2YWx1ZSBmb3IgdGhlIHN0YXRlbWVudCdzIGV4ZWN1dGlvbiB0aW1lLiBUaGUgSkRCQworICAgICAqIGRyaXZlciB3aWxsIHdhaXQgdXAgdG8gdGhpcyB2YWx1ZSBmb3IgdGhlIGV4ZWN1dGlvbiB0byBjb21wbGV0ZSAtIGFmdGVyCisgICAgICogdGhlIGxpbWl0IGlzIGV4Y2VlZGVkIGFuIFNRTCB7QGNvZGUgRXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBRdWVyeSBUaW1lb3V0IHZhbHVlLCB3aGVyZSAwIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzCi0gICAgICogICAgICAgICBubyBjdXJyZW50IHRpbWVvdXQuCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBxdWVyeSB0aW1lb3V0IHZhbHVlLCB3aGVyZSB7QGNvZGUgMH0gaW5kaWNhdGVzIHRoYXQKKyAgICAgKiAgICAgICAgIHRoZXJlIGlzIG5vIGN1cnJlbnQgdGltZW91dC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRRdWVyeVRpbWVvdXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY3VycmVudCByZXN1bHQuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciByZXN1bHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmVzdWx0U2V0IGZvciB0aGUgY3VycmVudCByZXN1bHQuIG51bGwgaWYgdGhlIHJlc3VsdCBpcyBhbgotICAgICAqICAgICAgICAgdXBkYXRlIGNvdW50IG9yIGlmIHRoZXJlIGFyZSBubyBtb3JlIHJlc3VsdHMuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gZm9yIHRoZSBjdXJyZW50IHJlc3VsdC4ge0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqICAgICAgICAgcmVzdWx0IGlzIGFuIHVwZGF0ZSBjb3VudCBvciBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZXN1bHRzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFJlc3VsdFNldCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb25jdXJyZW5jeSBzZXR0aW5nIGZvciBSZXN1bHRTZXQgb2JqZWN0cyBnZW5lcmF0ZWQgYnkgdGhpcwotICAgICAqIFN0YXRlbWVudC4KKyAgICAgKiBHZXRzIHRoZSBjb25jdXJyZW5jeSBzZXR0aW5nIGZvciB7QGNvZGUgUmVzdWx0U2V0fSBvYmplY3RzIGdlbmVyYXRlZCBieQorICAgICAqIHRoaXMgc3RhdGVtZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFkgb3IgUmVzdWx0U2V0LkNPTkNVUl9VUERBVEFCTEUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBSZXN1bHRTZXQuQ09OQ1VSX1JFQURfT05MWX0gb3Ige0Bjb2RlCisgICAgICogICAgICAgICBSZXN1bHRTZXQuQ09OQ1VSX1VQREFUQUJMRX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UmVzdWx0U2V0Q29uY3VycmVuY3koKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3Vyc29yIGhvbGQgc2V0dGluZyBmb3IgUmVzdWx0U2V0IG9iamVjdHMgZ2VuZXJhdGVkIGJ5IHRoaXMKLSAgICAgKiBTdGF0ZW1lbnQuCisgICAgICogR2V0cyB0aGUgY3Vyc29yIGhvbGQgc2V0dGluZyBmb3Ige0Bjb2RlIFJlc3VsdFNldH0gb2JqZWN0cyBnZW5lcmF0ZWQgYnkKKyAgICAgKiB0aGlzIHN0YXRlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJlc3VsdFNldC5IT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVQgb3IKLSAgICAgKiAgICAgICAgIFJlc3VsdFNldC5DTE9TRV9DVVJTT1JTX0FUX0NPTU1JVAorICAgICAqIEByZXR1cm4ge0Bjb2RlIFJlc3VsdFNldC5IT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVR9IG9yIHtAY29kZQorICAgICAqICAgICAgICAgUmVzdWx0U2V0LkNMT1NFX0NVUlNPUlNfQVRfQ09NTUlUfQogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSZXN1bHRTZXRIb2xkYWJpbGl0eSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBSZXN1bHRTZXQgdHlwZSBzZXR0aW5nIGZvciBSZXN1bHRTZXRzIGRlcml2ZWQgZnJvbSB0aGlzCi0gICAgICogU3RhdGVtZW50LgorICAgICAqIEdldHMgdGhlIHtAY29kZSBSZXN1bHRTZXR9IHR5cGUgc2V0dGluZyBmb3Ige0Bjb2RlIFJlc3VsdFNldH1zIGRlcml2ZWQKKyAgICAgKiBmcm9tIHRoaXMgc3RhdGVtZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZIGZvciBhIFJlc3VsdFNldCB3aGVyZSB0aGUgY3Vyc29yIGNhbgotICAgICAqICAgICAgICAgb25seSBtb3ZlIGZvcndhcmQsIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9JTlNFTlNJVElWRSBmb3IgYQotICAgICAqICAgICAgICAgUmVzdWx0U2V0IHdoaWNoIGlzIFNjcm9sbGFibGUgYnV0IGlzIG5vdCBzZW5zaXRpdmUgdG8gY2hhbmdlcwotICAgICAqICAgICAgICAgbWFkZSBieSBvdGhlcnMsIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9TRU5TSVRJVkUgZm9yIGEgUmVzdWx0U2V0Ci0gICAgICogICAgICAgICB3aGljaCBpcyBTY3JvbGxhYmxlIGJ1dCBpcyBzZW5zaXRpdmUgdG8gY2hhbmdlcyBtYWRlIGJ5IG90aGVycworICAgICAqIEByZXR1cm4ge0Bjb2RlIFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWX0gZm9yIGEge0Bjb2RlIFJlc3VsdFNldH0gd2hlcmUKKyAgICAgKiAgICAgICAgIHRoZSBjdXJzb3IgY2FuIG9ubHkgbW92ZSBmb3J3YXJkcywge0Bjb2RlCisgICAgICogICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkV9IGZvciBhIHtAY29kZSBSZXN1bHRTZXR9IHdoaWNoCisgICAgICogICAgICAgICBpcyBzY3JvbGxhYmxlIGJ1dCBpcyBub3Qgc2Vuc2l0aXZlIHRvIGNoYW5nZXMgbWFkZSBieSBvdGhlcnMsCisgICAgICogICAgICAgICB7QGNvZGUgUmVzdWx0U2V0LlRZUEVfU0NST0xMX1NFTlNJVElWRX0gZm9yIGEge0Bjb2RlIFJlc3VsdFNldH0KKyAgICAgKiAgICAgICAgIHdoaWNoIGlzIHNjcm9sbGFibGUgYnV0IGlzIHNlbnNpdGl2ZSB0byBjaGFuZ2VzIG1hZGUgYnkgb3RoZXJzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSZXN1bHRTZXRUeXBlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gdXBkYXRlIGNvdW50IGZvciB0aGUgY3VycmVudCByZXN1bHQgaWYgaXQgaXMgbm90IGEgUmVzdWx0U2V0LgorICAgICAqIEdldHMgYW4gdXBkYXRlIGNvdW50IGZvciB0aGUgY3VycmVudCByZXN1bHQgaWYgaXQgaXMgbm90IGEge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJlc3VsdCBhcyBhbiB1cGRhdGUgY291bnQuIC0xIGlmIHRoZSBjdXJyZW50IHJlc3VsdAotICAgICAqICAgICAgICAgaXMgYSBSZXN1bHRTZXQgb3IgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcmVzdWx0cworICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcmVzdWx0IGFzIGFuIHVwZGF0ZSBjb3VudC4ge0Bjb2RlIC0xfSBpZiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgcmVzdWx0IGlzIGEge0Bjb2RlIFJlc3VsdFNldH0gb3IgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcmVzdWx0cy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRVcGRhdGVDb3VudCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IFNRTFdhcm5pbmcgcmVwb3J0ZWQgYnkgY2FsbHMgb24gdGhpcyBTdGF0ZW1lbnQuCisgICAgICogUmV0cmlldmVzIHRoZSBmaXJzdCB7QGNvZGUgU1FMV2FybmluZ30gcmVwb3J0ZWQgYnkgY2FsbHMgb24gdGhpcworICAgICAqIHN0YXRlbWVudC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHdhcm5pbmdzLCBzdWJzZXF1ZW50IHdhcm5pbmdzIGFyZQorICAgICAqIGNoYWluZWQgdG8gdGhlIGZpcnN0IG9uZS4gVGhlIGNoYWluIG9mIHdhcm5pbmdzIGlzIGNsZWFyZWQgZWFjaCB0aW1lIHRoZQorICAgICAqIHN0YXRlbWVudCBpcyBleGVjdXRlZC4KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgd2FybmluZ3MsIHN1YnNlcXVlbnQgd2FybmluZ3MgYXJlIGNoYWluZWQgdG8gdGhlCi0gICAgICogZmlyc3Qgb25lLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjaGFpbiBvciB3YXJuaW5ncyBpcyBjbGVhcmVkIGVhY2ggdGltZSB0aGUgU3RhdGVtZW50IGlzIGV4ZWN1dGVkLgotICAgICAqIDxwPgotICAgICAqIFdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCByZWFkcyBmcm9tIHRoZSBSZXN1bHRTZXQgcmV0dXJuZWQgZnJvbSBleGVjdXRpbmcKLSAgICAgKiBhIFN0YXRlbWVudCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBSZXN1bHRTZXQsIG5vdCB0aGUgU3RhdGVtZW50IG9iamVjdC4KKyAgICAgKiBXYXJuaW5ncyBhc3NvY2lhdGVkIHdpdGggcmVhZHMgZnJvbSB0aGUge0Bjb2RlIFJlc3VsdFNldH0gcmV0dXJuZWQgZnJvbQorICAgICAqIGV4ZWN1dGluZyB0aGUgc3RhdGVtZW50IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHtAY29kZSBSZXN1bHRTZXR9LCBub3QgdGhlCisgICAgICogc3RhdGVtZW50IG9iamVjdC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHJldHVybiBhbiBTUUxXYXJuaW5nLCBudWxsIGlmIHRoZXJlIGFyZSBubyB3YXJuaW5ncwogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1FMV2FybmluZyBnZXRXYXJuaW5ncygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTUUwgY3Vyc29yIG5hbWUuIFRoaXMgbmFtZSBpcyB1c2VkIGJ5IHN1YnNlcXVlbnQgU3RhdGVtZW50CisgICAgICogU2V0cyB0aGUgU1FMIGN1cnNvciBuYW1lLiBUaGlzIG5hbWUgaXMgdXNlZCBieSBzdWJzZXF1ZW50IHN0YXRlbWVudAogICAgICAqIGV4ZWN1dGUgbWV0aG9kcy4KICAgICAgKiA8cD4KICAgICAgKiBDdXJzb3IgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIG9uZSBDb25uZWN0aW9uLgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBXaXRoIHRoZSBDdXJzb3IgbmFtZSBzZXQsIGl0IGNhbiB0aGVuIGJlIHV0aWxpemVkIGluIFNRTCBwb3NpdGlvbmVkCi0gICAgICogdXBkYXRlIG9yIGRlbGV0ZSBzdGF0ZW1lbnRzIHRvIGRldGVybWluZSB0aGUgY3VycmVudCByb3cgaW4gYSBSZXN1bHRTZXQKLSAgICAgKiBnZW5lcmF0ZWQgZnJvbSB0aGlzIFN0YXRlbWVudC4gVGhlIHBvc2l0aW9uZWQgdXBkYXRlIG9yIGRlbGV0ZSBtdXN0IGJlCi0gICAgICogZG9uZSB3aXRoIGEgZGlmZmVyZW50IFN0YXRlbWVudCB0aGFuIHRoaXMgb25lLgorICAgICAqIFdpdGggdGhlIGN1cnNvciBuYW1lIHNldCwgaXQgY2FuIHRoZW4gYmUgdXNlZCBpbiBTUUwgcG9zaXRpb25lZAorICAgICAqIHVwZGF0ZSBvciBkZWxldGUgc3RhdGVtZW50cyB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgcm93IGluIGEge0Bjb2RlCisgICAgICogUmVzdWx0U2V0fSBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0YXRlbWVudC4gVGhlIHBvc2l0aW9uZWQgdXBkYXRlIG9yIGRlbGV0ZQorICAgICAqIG11c3QgYmUgZG9uZSB3aXRoIGEgZGlmZmVyZW50IHN0YXRlbWVudCB0aGFuIHRoaXMgb25lLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIEN1cnNvciBuYW1lIGFzIGEgU3RyaW5nLAorICAgICAqICAgICAgICAgICAgdGhlIEN1cnNvciBuYW1lIGFzIGEgc3RyaW5nLAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDdXJzb3JOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC01MzksMjggKzYyMywzNCBAQAogICAgICAqIDxwPgogICAgICAqIElmIEVzY2FwZSBQcm9jZXNzaW5nIGlzIG9uLCB0aGUgSkRCQyBkcml2ZXIgd2lsbCBkbyBlc2NhcGUgc3Vic3RpdHV0aW9uCiAgICAgICogb24gYW4gU1FMIHN0YXRlbWVudCBiZWZvcmUgc2VuZGluZyBpdCBmb3IgZXhlY3V0aW9uLiBUaGlzIGRvZXMgbm90IGFwcGx5Ci0gICAgICogdG8gUHJlcGFyZWRTdGF0ZW1lbnRzIHNpbmNlIHRoZXkgYXJlIHByb2Nlc3NlZCB3aGVuIGNyZWF0ZWQsIGJlZm9yZSB0aGlzCi0gICAgICogbWV0aG9kIGNhbiBiZSBjYWxsZWQuCisgICAgICogdG8ge0BsaW5rIFByZXBhcmVkU3RhdGVtZW50fXMgc2luY2UgdGhleSBhcmUgcHJvY2Vzc2VkIHdoZW4gY3JlYXRlZCwKKyAgICAgKiBiZWZvcmUgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGVuYWJsZQotICAgICAqICAgICAgICAgICAgdHJ1ZSB0byBzZXQgZXNjYXBlIHByb2Nlc3NpbmcgbW9kZSBvbiwgZmFsc2UgdG8gdHVybiBpdCBvZmYuCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gc2V0IGVzY2FwZSBwcm9jZXNzaW5nIG1vZGUgPGk+b248L2k+LCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGZhbHNlfSB0byB0dXJuIGl0IDxpPm9mZjwvaT4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVzY2FwZVByb2Nlc3NpbmcoYm9vbGVhbiBlbmFibGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmZXRjaCBkaXJlY3Rpb24gLSBhIGhpbnQgdG8gdGhlIEpEQkMgZHJpdmVyIGFib3V0IHRoZSBkaXJlY3Rpb24KLSAgICAgKiBvZiBwcm9jZXNzaW5nIG9mIHJvd3MgaW4gUmVzdWx0U2V0cyBjcmVhdGVkIGJ5IHRoaXMgU3RhdGVtZW50LiBUaGUKLSAgICAgKiBkZWZhdWx0IGZldGNoIGRpcmVjdGlvbiBpcyBGRVRDSF9GT1JXQVJELgorICAgICAqIG9mIHByb2Nlc3Npbmcgb2Ygcm93cyBpbiB7QGNvZGUgUmVzdWx0U2V0fXMgY3JlYXRlZCBieSB0aGlzIHN0YXRlbWVudC4KKyAgICAgKiBUaGUgZGVmYXVsdCBmZXRjaCBkaXJlY3Rpb24gaXMge0Bjb2RlIEZFVENIX0ZPUldBUkR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkaXJlY3Rpb24KICAgICAgKiAgICAgICAgICAgIHdoaWNoIGZldGNoIGRpcmVjdGlvbiB0byB1c2UuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldC5GRVRDSF9VTktOT1dOLCBSZXN1bHRTZXQuRkVUQ0hfRk9SV0FSRCBvcgotICAgICAqICAgICAgICAgICAgUmVzdWx0U2V0LkZFVENIX1JFVkVSU0UKKyAgICAgKiAgICAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGNvZGUgUmVzdWx0U2V0LkZFVENIX1VOS05PV059PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGNvZGUgUmVzdWx0U2V0LkZFVENIX0ZPUldBUkR9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGNvZGUgUmVzdWx0U2V0LkZFVENIX1JFVkVSU0V9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDwvdWw+CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIGlmIHRoZQotICAgICAqICAgICAgICAgICAgIGZldGNoIGRpcmVjdGlvbiBpcyB1bnJlY29nbml6ZWQKKyAgICAgKiAgICAgICAgICAgICBmZXRjaCBkaXJlY3Rpb24gaXMgdW5yZWNvZ25pemVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZldGNoRGlyZWN0aW9uKGludCBkaXJlY3Rpb24pIHRocm93cyBTUUxFeGNlcHRpb247CiAKQEAgLTU3MCw1MSArNjYwLDU3IEBACiAgICAgICogYXBwbGljYXRpb24gcHJvY2Vzc2luZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcm93cwotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByb3dzIHRoYXQgc2hvdWxkIGJlIGZldGNoZWQuIDAgdGVsbHMgdGhlIGRyaXZlcgotICAgICAqICAgICAgICAgICAgdG8gaWdub3JlIHRoZSBoaW50LiBTaG91bGQgYmUgbGVzcyB0aGFuCi0gICAgICogICAgICAgICAgICA8Y29kZT5nZXRNYXhSb3dzPC9jb2RlPiBmb3IgdGhpcyBzdGF0ZW1lbnQuIFNob3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgIG5lZ2F0aXZlLgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByb3dzIHRoYXQgc2hvdWxkIGJlIGZldGNoZWQuIHtAY29kZSAwfSB0ZWxscyB0aGUgZHJpdmVyCisgICAgICogICAgICAgICAgICB0byBpZ25vcmUgdGhlIGhpbnQuIFNob3VsZCBiZSBsZXNzIHRoYW4ge0Bjb2RlIGdldE1heFJvd3N9IGZvcgorICAgICAqICAgICAgICAgICAgdGhpcyBzdGF0ZW1lbnQuIFNob3VsZCBub3QgYmUgbmVnYXRpdmUuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSwgb3IgaWYgdGhlIHJvd3MKICAgICAgKiAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgb3V0IG9mIHJhbmdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZldGNoU2l6ZShpbnQgcm93cykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGZvciBSZXN1bHRTZXQgY29sdW1ucyB0aGF0IGNvbnRhaW4KLSAgICAgKiBjaGFyYWN0ZXIgb3IgYmluYXJ5IHZhbHVlcy4gVGhpcyBhcHBsaWVzIHRvIEJJTkFSWSwgVkFSQklOQVJZLAotICAgICAqIExPTkdWQVJCSU5BUlksIENIQVIsIFZBUkNIQVIsIGFuZCBMT05HVkFSQ0hBUiBmaWVsZHMuIEFueSBkYXRhIGV4Y2VlZGluZwotICAgICAqIHRoZSBtYXhpbXVtIHNpemUgaXMgYWJhbmRvbmVkIHdpdGhvdXQgYW5ub3VuY2VtZW50LgorICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGZvciB7QGNvZGUgUmVzdWx0U2V0fSBjb2x1bW5zIHRoYXQKKyAgICAgKiBjb250YWluIGNoYXJhY3RlciBvciBiaW5hcnkgdmFsdWVzLiBUaGlzIGFwcGxpZXMgdG8ge0Bjb2RlIEJJTkFSWX0sCisgICAgICoge0Bjb2RlIFZBUkJJTkFSWX0sIHtAY29kZSBMT05HVkFSQklOQVJZfSwge0Bjb2RlIENIQVJ9LCB7QGNvZGUgVkFSQ0hBUn0sCisgICAgICogYW5kIHtAY29kZSBMT05HVkFSQ0hBUn0gZmllbGRzLiBBbnkgZGF0YSBleGNlZWRpbmcgdGhlIG1heGltdW0gc2l6ZSBpcworICAgICAqIGFiYW5kb25lZCB3aXRob3V0IGFubm91bmNlbWVudC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWF4Ci0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBmaWVsZCBzaXplIGluIGJ5dGVzLiBPIG1lYW5zICJubyBsaW1pdCIuCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBmaWVsZCBzaXplIGluIGJ5dGVzLiB7QGNvZGUgMH0gbWVhbnMgIm5vIGxpbWl0Ii4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIHRoZSBtYXggdmFsdWUgaXMKLSAgICAgKiAgICAgICAgICAgICA8MC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciB0aGUge0Bjb2RlIG1heH0KKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBpcyAmbHQ7IHtAY29kZSAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNYXhGaWVsZFNpemUoaW50IG1heCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCBhbnkgUmVzdWx0U2V0IGNhbiBjb250YWluLiBJZiB0aGUKLSAgICAgKiBudW1iZXIgb2Ygcm93cyBleGNlZWRzIHRoaXMgdmFsdWUsIHRoZSBhZGRpdGlvbmFsIHJvd3MgYXJlIHNpbGVudGx5Ci0gICAgICogZGlzY2FyZGVkLgorICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCBhbnkge0Bjb2RlIFJlc3VsdFNldH0gY2FuIGNvbnRhaW4uCisgICAgICogSWYgdGhlIG51bWJlciBvZiByb3dzIGV4Y2VlZHMgdGhpcyB2YWx1ZSwgdGhlIGFkZGl0aW9uYWwgcm93cyBhcmUKKyAgICAgKiBzaWxlbnRseSBkaXNjYXJkZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1heAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MuIDAgbWVhbnMgIm5vIGxpbWl0Ii4KKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzLiB7QGNvZGUgMH0gbWVhbnMgIm5vIGxpbWl0Ii4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIGlmIG1heCA8MC4KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciBpZiBtYXggPCB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICAwfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNYXhSb3dzKGludCBtYXgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB0aW1lb3V0LCBpbiBzZWNvbmRzLCBmb3IgcXVlcmllcyAtIGhvdyBsb25nIHRoZSBkcml2ZXIgd2lsbAotICAgICAqIGFsbG93IGZvciBjb21wbGV0aW9uIG9mIGEgU3RhdGVtZW50IGV4ZWN1dGlvbi4gSWYgdGhlIHRpbWVvdXQgaXMKLSAgICAgKiBleGNlZWRlZCwgdGhlIHF1ZXJ5IHdpbGwgdGhyb3cgYW4gU1FMRXhjZXB0aW9uLgorICAgICAqIGFsbG93IGZvciBjb21wbGV0aW9uIG9mIGEgc3RhdGVtZW50IGV4ZWN1dGlvbi4gSWYgdGhlIHRpbWVvdXQgaXMKKyAgICAgKiBleGNlZWRlZCwgdGhlIHF1ZXJ5IHdpbGwgdGhyb3cgYW4ge0Bjb2RlIFNRTEV4Y2VwdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNlY29uZHMKICAgICAgKiAgICAgICAgICAgIHRpbWVvdXQgaW4gc2Vjb25kcy4gMCBtZWFucyBubyB0aW1lb3V0ICgid2FpdCBmb3JldmVyIikKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIGlmIHNlY29uZHMgPDAuCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2Ugb3IgaWYgc2Vjb25kcyA8CisgICAgICogICAgICAgICAgICAge0Bjb2RlIDB9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dChpbnQgc2Vjb25kcykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1N0cnVjdC5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU3RydWN0LmphdmEKaW5kZXggMDQwNGNiNy4uMTE2N2NkZiAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU3RydWN0LmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvU3RydWN0LmphdmEKQEAgLTIwLDQ2ICsyMCw1MyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIHdoaWNoIHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIG1hcHBpbmcgYW4gU1FMIHN0cnVjdHVyZWQgdHlwZSB0bwotICogSmF2YS4gVGhlIFN0cnVjdCBvYmplY3QgaGFzIGEgdmFsdWUgZm9yIGVhY2ggYXR0cmlidXRlIG9mIHRoZSBTUUwgc3RydWN0dXJlZAotICogdHlwZQorICogQW4gaW50ZXJmYWNlIHdoaWNoIHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBhbiBTUUwgc3RydWN0dXJlZCB0eXBlIAorICogYXMgYSBKYXZhIG9iamVjdC4gVGhlIHtAY29kZSBTdHJ1Y3R9IG9iamVjdCBoYXMgYSB2YWx1ZSBmb3IgZWFjaCBhdHRyaWJ1dGUgb2YgdGhlIFNRTCBzdHJ1Y3R1cmVkCisgKiB0eXBlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBTdHJ1Y3QgewogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgU1FMIFR5cGUgbmFtZSBvZiB0aGUgU1FMIHN0cnVjdHVyZWQgdHlwZSB0aGF0IHRoaXMgU3RydWN0Ci0gICAgICogcmVwcmVzZW50cworICAgICAqIEdldHMgdGhlIFNRTCBUeXBlIG5hbWUgb2YgdGhlIFNRTCBzdHJ1Y3R1cmVkIHR5cGUgdGhhdCB0aGlzIHtAY29kZQorICAgICAqIFN0cnVjdH0gcmVwcmVzZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBTUUwgc3RydWN0dXJlZCB0eXBlCisgICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgU1FMIHN0cnVjdHVyZWQgdHlwZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTUUxUeXBlTmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBTUUwgc3RydWN0dXJlZCB0eXBlLiBUaGlzCi0gICAgICogbWV0aG9kIHVzZXMgdGhlIHR5cGUgbWFwIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29ubmVjdGlvbiBmb3IgY3VzdG9taXplZAotICAgICAqIHR5cGUgbWFwcGluZ3MuIFdoZXJlIHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoZSBUeXBlIE1hcCB3aGljaCBtYXRjaGVzIHRoZQotICAgICAqIHRoaXMgc3RydWN0dXJlZCB0eXBlLCB0aGUgSkRCQyBkcml2ZXIgdXNlcyB0aGUgc3RhbmRhcmQgbWFwcGluZy4KKyAgICAgKiBtZXRob2QgdXNlcyB0aGUgdHlwZSBtYXAgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgQ29ubmVjdGlvbn0gZm9yCisgICAgICogY3VzdG9taXplZCB0eXBlIG1hcHBpbmdzLiBXaGVyZSB0aGVyZSBpcyBubyBlbnRyeSBpbiB0aGUgdHlwZSBtYXBwaW5nCisgICAgICogd2hpY2ggbWF0Y2hlcyB0aGlzIHN0cnVjdHVyZWQgdHlwZSwgdGhlIEpEQkMgZHJpdmVyIHVzZXMgdGhlIHN0YW5kYXJkCisgICAgICogbWFwcGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIE9iamVjdCBhcnJheSBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGVzLCBpbiBvcmRlcgorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIE9iamVjdH0gYXJyYXkgY29udGFpbmluZyB0aGUgb3JkZXJlZCBhdHRyaWJ1dGVzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXR0cmlidXRlcygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBTUUwgc3RydWN0dXJlZCB0eXBlLiBUaGlzCi0gICAgICogbWV0aG9kIHVzZXMgdGhlIHN1cHBsaWVkIHR5cGUgbWFwIGZvciBjdXN0b21pemVkIHR5cGUgbWFwcGluZ3MuIFdoZXJlCi0gICAgICogdGhlcmUgaXMgbm8gZW50cnkgaW4gdGhlIFR5cGUgTWFwIHdoaWNoIG1hdGNoZXMgdGhlIHRoaXMgc3RydWN0dXJlZCB0eXBlLAotICAgICAqIHRoZSBKREJDIGRyaXZlciB1c2VzIHRoZSBkZWZhdWx0IG1hcHBpbmcuIFRoZSBDb25uZWN0aW9uIHR5cGUgbWFwIGlzCi0gICAgICogbmV2ZXIgdXRpbGl6ZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogbWV0aG9kIHVzZXMgdGhlIHN1cHBsaWVkIHR5cGUgbWFwcGluZyB0byBkZXRlcm1pbmUgaG93IHRvIG1hcCBTUUwgdHlwZXMKKyAgICAgKiB0byB0aGVpciBjb3JyZXNwb25kaW5nIEphdmEgb2JqZWN0cy4gSW4gdGhlCisgICAgICogY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBlbnRyeSBpbiB0aGUgdHlwZSBtYXBwaW5nIHdoaWNoIG1hdGNoZXMgdGhpcworICAgICAqIHN0cnVjdHVyZWQgdHlwZSwgdGhlIEpEQkMgZHJpdmVyIHVzZXMgdGhlIGRlZmF1bHQgbWFwcGluZy4gVGhlIHtAY29kZQorICAgICAqIENvbm5lY3Rpb259IHR5cGUgbWFwIGlzIDxpPm5ldmVyPC9pPiB1dGlsaXplZCBieSB0aGlzIG1ldGhvZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlTWFwCiAgICAgICogICAgICAgICAgICBhIE1hcCBkZXNjcmliaW5nIGhvdyBTUUwgVHlwZSBuYW1lcyBhcmUgbWFwcGVkIHRvIGNsYXNzZXMuCi0gICAgICogQHJldHVybiBhbiBPYmplY3QgYXJyYXkgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcywgaW4gb3JkZXIKKyAgICAgKiBAcmV0dXJuIGFuIE9iamVjdCBhcnJheSBjb250YWluaW5nIHRoZSBvcmRlcmVkIGF0dHJpYnV0ZXMsLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXR0cmlidXRlcyhNYXA8U3RyaW5nLCBDbGFzczw/Pj4gdGhlTWFwKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1RpbWUuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1RpbWUuamF2YQppbmRleCAwNDgyNTlkLi43ZmIyOGUxIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9UaW1lLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvVGltZS5qYXZhCkBAIC0yMSwzMSArMjEsMzYgQEAKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIAogLyoqCi0gKiBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIGFuIFNRTCBUSU1FIHZhbHVlLiBQcm92aWRlcyBmdW5jdGlvbnMgdG8gYWlkCi0gKiBnZW5lcmF0aW9uIGFuZCBpbnRlcnByZXRhdGlvbiBvZiBKREJDIGVzY2FwZSBmb3JtYXQgZm9yIHRpbWUgdmFsdWVzLgorICogSmF2YSByZXByZXNlbnRhdGlvbiBvZiBhbiBTUUwge0Bjb2RlIFRJTUV9IHZhbHVlLiBQcm92aWRlcyB1dGlsaXRpZXMgdG8gCisgKiBmb3JtYXQgYW5kIHBhcnNlIHRoZSB0aW1lJ3MgcmVwcmVzZW50YXRpb24gYXMgYSBTdHJpbmcgaW4gSkRCQyBlc2NhcGUgZm9ybWF0LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFRpbWUgZXh0ZW5kcyBEYXRlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgzOTczMjQ0MDM1NDgwMTM2ODFMOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgY29uc3RydWN0b3Ige0BsaW5rICNUaW1lKGxvbmcpfSBDb25zdHJ1Y3RzIGEgVGltZQotICAgICAqICAgICAgICAgICAgIG9iamVjdCB1c2luZyB0aGUgc3VwcGxpZWQgdmFsdWVzIGZvciBIb3VyLCBNaW51dGUgYW5kIFNlY29uZC4KLSAgICAgKiAgICAgICAgICAgICBUaGUgWWVhciwgTW9udGggYW5kIERheSBlbGVtZW50cyBvZiB0aGUgVGltZSBvYmplY3QgYXJlIHNldAotICAgICAqICAgICAgICAgICAgIHRvIDE5NzAsIEphbnVhcnksIDEgcmVmbGVjdGluZyB0aGUgRXBvY2ggKFRpbWUgaW4KLSAgICAgKiAgICAgICAgICAgICBtaWxsaXNlY29uZHMgPSAwKS4KLSAgICAgKiAgICAgICAgICAgICA8cD4KLSAgICAgKiAgICAgICAgICAgICBBbnkgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIFllYXIsIE1vbnRoIG9yIERheSBlbGVtZW50cyBvZiBhCi0gICAgICogICAgICAgICAgICAgVGltZSBvYmplY3Qgd2lsbCByZXN1bHQgaW4gYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotICAgICAqICAgICAgICAgICAgIDxwPgotICAgICAqICAgICAgICAgICAgIFJlc3VsdCBpcyB1bmRlZmluZWQgaWYgYW55IGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBUaW1lfSBvYmplY3QgdXNpbmcgdGhlIHN1cHBsaWVkIHZhbHVlcyBmb3IgPGk+SG91cjwvaT4sCisgICAgICogPGk+TWludXRlPC9pPiBhbmQgPGk+U2Vjb25kPC9pPi4gVGhlIDxpPlllYXI8L2k+LCA8aT5Nb250aDwvaT4gYW5kCisgICAgICogPGk+RGF5PC9pPiBlbGVtZW50cyBvZiB0aGUge0Bjb2RlIFRpbWV9IG9iamVjdCBhcmUgc2V0IHRvIHRoZSBkYXRlIAorICAgICAqIG9mIHRoZSBFcG9jaCAoSmFudWFyeSAxLCAxOTcwKS4KKyAgICAgKiA8cD4KKyAgICAgKiBBbnkgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIDxpPlllYXI8L2k+LCA8aT5Nb250aDwvaT4gb3IgPGk+RGF5PC9pPgorICAgICAqIGVsZW1lbnRzIG9mIGEge0Bjb2RlIFRpbWV9IG9iamVjdCB3aWxsIHJlc3VsdCBpbiBhbiB7QGNvZGUKKyAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBhbnkgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgY29uc3RydWN0b3Ige0BsaW5rICNUaW1lKGxvbmcpfS4KICAgICAgKiBAcGFyYW0gdGhlSG91cgotICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBmcm9tIDAgLSAyMworICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBpbiB0aGUgcmFuZ2Uge0Bjb2RlIFswLDIzXX0uCiAgICAgICogQHBhcmFtIHRoZU1pbnV0ZQotICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBmcm9tIDAgLSA1OQorICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBpbiB0aGUgcmFuZ2Uge0Bjb2RlIFswLDU5XX0uCiAgICAgICogQHBhcmFtIHRoZVNlY29uZAotICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBmcm9tIDAgLSA1OQorICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBpbiB0aGUgcmFuZ2Uge0Bjb2RlIFswLDU5XX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBARGVwcmVjYXRlZApAQCAtNTQsMjIgKzU5LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFRpbWUgb2JqZWN0IHVzaW5nIGEgc3VwcGxpZWQgdGltZSBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBUaW1lfSBvYmplY3QgdXNpbmcgYSBzdXBwbGllZCB0aW1lIHNwZWNpZmllZCBpbgorICAgICAqIG1pbGxpc2Vjb25kcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlVGltZQotICAgICAqICAgICAgICAgICAgYSBUaW1lIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIEVwb2NoIChKYW51YXJ5IDFzdAotICAgICAqICAgICAgICAgICAgMTk3MCwgMDA6MDA6MDAuMDAwKQorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgVGltZX0gc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUKKyAgICAgKiAgICAgICAgICAgIDxpPkVwb2NoPC9pPiAoSmFudWFyeSAxc3QgMTk3MCwgMDA6MDA6MDAuMDAwKS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZShsb25nIHRoZVRpbWUpIHsKICAgICAgICAgc3VwZXIodGhlVGltZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gQW4gU1FMIFRpbWUKLSAgICAgKiAgICAgICAgICAgICBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIERhdGUgY29tcG9uZW50LgotICAgICAqIEByZXR1cm4gZG9lcyBub3QgcmV0dXJuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gQW4gU1FMCisgICAgICogICAgICAgICAgICAge0Bjb2RlIFRpbWV9IG9iamVjdCBkb2VzIG5vdCBoYXZlIGEge0Bjb2RlIERhdGV9IGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC03OSwxMSArODcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBBbiBTUUwgVGltZQotICAgICAqICAgICAgICAgICAgIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgRGF5IGNvbXBvbmVudC4KLSAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIEFuIFNRTAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBUaW1lfSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIDxpPkRheTwvaT4gY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKQEAgLTkzLDExICsxMDIsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBBbiBTUUwgVGltZQotICAgICAqICAgICAgICAgICAgIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgTW9udGggY29tcG9uZW50LgotICAgICAqIEByZXR1cm4gZG9lcyBub3QgcmV0dXJuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gQW4gU1FMCisgICAgICogICAgICAgICAgICAge0Bjb2RlIFRpbWV9IG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgPGk+TW9udGg8L2k+IGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC0xMDcsMTEgKzExNywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIEFuIFNRTCBUaW1lCi0gICAgICogICAgICAgICAgICAgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBZZWFyIGNvbXBvbmVudC4KLSAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIEFuIFNRTAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBUaW1lfSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIDxpPlllYXI8L2k+IGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC0xMjEsMTAgKzEzMiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIEFuIFNRTCBUaW1lCi0gICAgICogICAgICAgICAgICAgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBEYXRlIGNvbXBvbmVudC4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBBbiBTUUwKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgVGltZX0gb2JqZWN0IGRvZXMgbm90IGhhdmUgYSB7QGNvZGUgRGF0ZX0gY29tcG9uZW50LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKQEAgLTEzNCwxMCArMTQ2LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gQW4gU1FMIFRpbWUKLSAgICAgKiAgICAgICAgICAgICBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIE1vbnRoIGNvbXBvbmVudC4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLiBBbiBTUUwKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgVGltZX0gb2JqZWN0IGRvZXMgbm90IGhhdmUgYSA8aT5Nb250aDwvaT4gY29tcG9uZW50LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQERlcHJlY2F0ZWQKQEAgLTE0NywxMCArMTYwLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4gQW4gU1FMIFRpbWUKLSAgICAgKiAgICAgICAgICAgICBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIFllYXIgY29tcG9uZW50LgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuIEFuIFNRTAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBUaW1lfSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIDxpPlllYXI8L2k+IGNvbXBvbmVudC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBEZXByZWNhdGVkCkBAIC0xNjAsMTIgKzE3MywxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpbWUgZm9yIHRoaXMgVGltZSBvYmplY3QgdG8gdGhlIHN1cHBsaWVkIG1pbGxpc2Vjb25kcyB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB0aW1lIGZvciB0aGlzIHtAY29kZSBUaW1lfSBvYmplY3QgdG8gdGhlIHN1cHBsaWVkIG1pbGxpc2Vjb25kcworICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aW1lCi0gICAgICogICAgICAgICAgICBBIHRpbWUgdmFsdWUgZXhwcmVzc2VkIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2guCisgICAgICogICAgICAgICAgICBBIHRpbWUgdmFsdWUgZXhwcmVzc2VkIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgPGk+RXBvY2g8L2k+LgogICAgICAqICAgICAgICAgICAgTmVnYXRpdmUgdmFsdWVzIGFyZSBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBFcG9jaC4gVGhlIEVwb2NoCi0gICAgICogICAgICAgICAgICBpcyBKYW51YXJ5IDEgMTk3MCwgMDA6MDA6MDAuMDAwCisgICAgICogICAgICAgICAgICBpcyBKYW51YXJ5IDEgMTk3MCwgMDA6MDA6MDAuMDAwLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFRpbWUobG9uZyB0aW1lKSB7CkBAIC0xNzMsMTAgKzE4OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIFRpbWUgYXMgYSBTdHJpbmcgaW4gSkRCQyBlc2NhcGUgZm9ybWF0OiBoaDptbTpzcworICAgICAqIEZvcm1hdHMgdGhlIHtAY29kZSBUaW1lfSBhcyBhIFN0cmluZyBpbiBKREJDIGVzY2FwZSBmb3JtYXQ6IHtAY29kZQorICAgICAqIGhoOm1tOnNzfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVGltZSB2YWx1ZSBpbiBKREJDIGVzY2FwZSBmb3JtYXQ6Ci0gICAgICogICAgICAgICBISDptbTpzcworICAgICAqIEByZXR1cm4gQSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB7QGNvZGUgVGltZX0gdmFsdWUgaW4gSkRCQyBlc2NhcGUKKyAgICAgKiAgICAgICAgIGZvcm1hdDoge0Bjb2RlIEhIOm1tOnNzfQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0xODUsMTggKzIwMiwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBUaW1lIG9iamVjdCBmcm9tIGEgU3RyaW5nIGhvbGRpbmcgYSB0aW1lIHJlcHJlc2VudGVkIGluIEpEQkMKLSAgICAgKiBlc2NhcGUgZm9ybWF0OiBoaDptbTpzcy4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFRpbWV9IG9iamVjdCBmcm9tIGEgc3RyaW5nIGhvbGRpbmcgYSB0aW1lIHJlcHJlc2VudGVkIGluCisgICAgICogSkRCQyBlc2NhcGUgZm9ybWF0OiB7QGNvZGUgaGg6bW06c3N9LgogICAgICAqIDxwPgotICAgICAqIEFuIGV4Y2VwdGlvbiBvY2N1cnMgaWYgdGhlIGlucHV0IHN0cmluZyBpcyBub3QgaW4gdGhlIGZvcm0gb2YgYSB0aW1lIGluCi0gICAgICogSkRCQyBlc2NhcGUgZm9ybWF0LgorICAgICAqIEFuIGV4Y2VwdGlvbiBvY2N1cnMgaWYgdGhlIGlucHV0IHN0cmluZyBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGlzIGZvcm1hdC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHRpbWVTdHJpbmcKICAgICAgKiAgICAgICAgICAgIEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGltZSB2YWx1ZSBpbiBKREJDIGVzY2FwZSBmb3JtYXQ6Ci0gICAgICogICAgICAgICAgICBoaDptbTpzcwotICAgICAqIEByZXR1cm4gVGhlIFRpbWUgb2JqZWN0IHNldCB0byBhIHRpbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdGltZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIGhoOm1tOnNzfS4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGNvZGUgVGltZX0gb2JqZWN0IHNldCB0byBhIHRpbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgIHRpbWUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3VwcGxpZWQgdGltZSBzdHJpbmcgaXMgbm90IGluIEpEQkMgZXNjYXBlIGZvcm1hdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRpbWUgdmFsdWVPZihTdHJpbmcgdGltZVN0cmluZykgewogICAgICAgICBpZiAodGltZVN0cmluZyA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9UaW1lc3RhbXAuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1RpbWVzdGFtcC5qYXZhCmluZGV4IGRhOGZhN2EuLmI1MjZmYjMgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1RpbWVzdGFtcC5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1RpbWVzdGFtcC5qYXZhCkBAIC0yNSwyMCArMjUsMjUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc3FsLmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBBIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNRTCBUSU1FU1RBTVAgdHlwZS4gSXQgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkKLSAqIHRvIHJlcHJlc2VudCB0aGUgU1FMIFRJTUVTVEFNUCBuYW5vc2Vjb25kIHZhbHVlLCBpbiBhZGRpdGlvbiB0byB0aGUgcmVndWxhcgotICogZGF0ZS90aW1lIHZhbHVlIHdoaWNoIGhhcyBtaWxsaXNlY29uZCByZXNvbHV0aW9uLgorICogQSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTUUwge0Bjb2RlIFRJTUVTVEFNUH0gdHlwZS4gSXQgcHJvdmlkZXMgdGhlCisgKiBjYXBhYmlsaXR5IG9mIHJlcHJlc2VudGluZyB0aGUgU1FMIHtAY29kZSBUSU1FU1RBTVB9IG5hbm9zZWNvbmQgdmFsdWUsIGluCisgKiBhZGRpdGlvbiB0byB0aGUgcmVndWxhciBkYXRlL3RpbWUgdmFsdWUgd2hpY2ggaGFzIG1pbGxpc2Vjb25kIHJlc29sdXRpb24uCiAgKiA8cD4KLSAqIFRoZSBUaW1lc3RhbXAgY2xhc3MgY29uc2lzdHMgb2YgYSByZWd1bGFyIERhdGUvVGltZSB2YWx1ZSwgd2hlcmUgb25seSB0aGUKLSAqIGludGVncmFsIHNlY29uZHMgdmFsdWUgaXMgc3RvcmVkLCBwbHVzIGEgbmFub3NlY29uZHMgdmFsdWUgd2hlcmUgdGhlCisgKiBUaGUge0Bjb2RlIFRpbWVzdGFtcH0gY2xhc3MgY29uc2lzdHMgb2YgYSByZWd1bGFyIGRhdGUvdGltZSB2YWx1ZSwgd2hlcmUgb25seQorICogdGhlIGludGVncmFsIHNlY29uZHMgdmFsdWUgaXMgc3RvcmVkLCBwbHVzIGEgbmFub3NlY29uZHMgdmFsdWUgd2hlcmUgdGhlCiAgKiBmcmFjdGlvbmFsIHNlY29uZHMgYXJlIHN0b3JlZC4KLSAqIDxwPgotICogVGhlIGFkZGl0aW9uIG9mIHRoZSBuYW5vc2Vjb25kIHZhbHVlIGZpZWxkIHRvIHRoZSBUaW1lc3RhbXAgb2JqZWN0IG1ha2VzIGl0Ci0gKiBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIHRoZSBqYXZhLnV0aWwuRGF0ZSBvYmplY3Qgd2hpY2ggaXQgZXh0ZW5kcy4KLSAqIFVzZXJzIHNob3VsZCBiZSBjYXV0aW91cyBpbiB0aGVpciB1c2Ugb2YgVGltZXN0YW1wIG9iamVjdHMgYW5kIHNob3VsZCBub3QKLSAqIGFzc3VtZSB0aGF0IHRoZXkgYXJlIGludGVyY2hhbmdlYWJsZSB3aXRoIGphdmEudXRpbC5EYXRlIG9iamVjdHMgd2hlbiB1c2VkCi0gKiBvdXRzaWRlIHRoZSBjb25maW5lcyBvZiB0aGUgamF2YS5zcWwgcGFja2FnZS4KKyAqIDwvcD48cD4KKyAqIFRoZSBhZGRpdGlvbiBvZiB0aGUgbmFub3NlY29uZCB2YWx1ZSBmaWVsZCB0byB0aGUge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0CisgKiBtYWtlcyBpdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIHRoZSB7QGNvZGUgamF2YS51dGlsLkRhdGV9IG9iamVjdCB3aGljaAorICogaXQgZXh0ZW5kcy4gVXNlcnMgc2hvdWxkIGJlIGF3YXJlIHRoYXQge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0cyBhcmUgbm90CisgKiBpbnRlcmNoYW5nYWJsZSB3aXRoIHtAY29kZSBqYXZhLnV0aWwuRGF0ZX0gb2JqZWN0cyB3aGVuIHVzZWQgb3V0c2lkZSB0aGUKKyAqIGNvbmZpbmVzIG9mIHRoZSB7QGNvZGUgamF2YS5zcWx9IHBhY2thZ2UuCisgKiA8L3A+CiAgKiAKKyAqIEBzZWUgRGF0ZQorICogQHNlZSBUaW1lCisgKiBAc2VlIGphdmEudXRpbC5EYXRlCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFRpbWVzdGFtcCBleHRlbmRzIERhdGUgewogCkBAIC00OCwyNyArNTMsMjkgQEAKICAgICBwcml2YXRlIGludCBuYW5vczsKIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlIGNvbnN0cnVjdG9yIHtAbGluayAjVGltZXN0YW1wKGxvbmcpfSBSZXR1cm5zIGEKLSAgICAgKiAgICAgICAgICAgICBUaW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgdGltZSBzcGVjaWZpZWQgYnkgdGhlIHN1cHBsaWVkCi0gICAgICogICAgICAgICAgICAgdmFsdWVzIGZvciBZZWFyLCBNb250aCwgRGF0ZSwgSG91ciwgTWludXRlcywgU2Vjb25kcyBhbmQKLSAgICAgKiAgICAgICAgICAgICBOYW5vc2Vjb25kcworICAgICAqIFJldHVybnMgYSB7QGNvZGUgVGltZXN0YW1wfSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aW1lIHNwZWNpZmllZCBieSB0aGUKKyAgICAgKiBzdXBwbGllZCB2YWx1ZXMgZm9yIDxpPlllYXI8L2k+LCA8aT5Nb250aDwvaT4sIDxpPkRhdGU8L2k+LCA8aT5Ib3VyPC9pPiwKKyAgICAgKiA8aT5NaW51dGVzPC9pPiwgPGk+U2Vjb25kczwvaT4gYW5kIDxpPk5hbm9zZWNvbmRzPC9pPi4KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSBjb25zdHJ1Y3RvciB7QGxpbmsgI1RpbWVzdGFtcChsb25nKX0uCiAgICAgICogQHBhcmFtIHRoZVllYXIKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcyB0aGUgeWVhciBtaW51cyAxOTAwCisgICAgICogICAgICAgICAgICBzcGVjaWZpZWQgYXMgdGhlIHllYXIgbWludXMgMTkwMC4KICAgICAgKiBAcGFyYW0gdGhlTW9udGgKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAwIC0gMTEKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMCwxMV0uCiAgICAgICogQHBhcmFtIHRoZURhdGUKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAxIC0gMzEKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMSwzMV0uCiAgICAgICogQHBhcmFtIHRoZUhvdXIKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAwIC0gMjMKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMCwyM10uCiAgICAgICogQHBhcmFtIHRoZU1pbnV0ZQotICAgICAqICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDAgLSA1OQorICAgICAqICAgICAgICAgICAgc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFswLDU5XS4KICAgICAgKiBAcGFyYW0gdGhlU2Vjb25kCi0gICAgICogICAgICAgICAgICBzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCAtIDU5CisgICAgICogICAgICAgICAgICBzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzAsNTldLgogICAgICAqIEBwYXJhbSB0aGVOYW5vCiAgICAgICogICAgICAgICAgICB3aGljaCBkZWZpbmVzIHRoZSBuYW5vc2Vjb25kIHZhbHVlIG9mIHRoZSB0aW1lc3RhbXAgc3BlY2lmaWVkCi0gICAgICogICAgICAgICAgICBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAwIC0gOTk5LDk5OSw5OTkKKyAgICAgKiAgICAgICAgICAgIGFzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFswLDk5OSc5OTknOTk5XQogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlzIG91dCBvZiByYW5nZQorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgcGFyYW1ldGVycyBpcyBvdXQgb2YgcmFuZ2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBARGVwcmVjYXRlZApAQCAtODMsMTIgKzkwLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFRpbWVzdGFtcCBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgdGltZSByZXByZXNlbnRlZCBieSBhCi0gICAgICogc3VwcGxpZWQgdGltZSB2YWx1ZS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWUgcmVwcmVzZW50ZWQKKyAgICAgKiBieSBhIHN1cHBsaWVkIHRpbWUgdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVRpbWUKICAgICAgKiAgICAgICAgICAgIGEgdGltZSB2YWx1ZSBpbiB0aGUgZm9ybWF0IG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2gKLSAgICAgKiAgICAgICAgICAgIChKYW51YXJ5IDEgMTk3MCAwMDowMDowMC4wMDAgR01UKQorICAgICAqICAgICAgICAgICAgKEphbnVhcnkgMSAxOTcwIDAwOjAwOjAwLjAwMCBHTVQpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUaW1lc3RhbXAobG9uZyB0aGVUaW1lKSB7CiAgICAgICAgIHN1cGVyKHRoZVRpbWUpOwpAQCAtMTAwLDEzICsxMDgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0aW1lc3RhbXAgb2JqZWN0IGlzIGxhdGVyIHRoYW4gdGhlIHN1cHBsaWVkCi0gICAgICogdGltZXN0YW1wLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHRpbWVzdGFtcCBvYmplY3QgaXMgbGF0ZXIgdGhhbiB0aGUgc3VwcGxpZWQKKyAgICAgKiB0aW1lc3RhbXAsIG90aGVyd2lzZSByZXR1cm5zIHtAY29kZSBmYWxzZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVRpbWVzdGFtcAotICAgICAqICAgICAgICAgICAgdGhlIHRpbWVzdGFtcCB0byBjb21wYXJlIHdpdGggdGhpcyB0aW1lc3RhbXAgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdGltZXN0YW1wIG9iamVjdCBpcyBsYXRlciB0aGFuIHRoZSBzdXBwbGllZAotICAgICAqICAgICAgICAgdGltZXN0YW1wLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZSB3aXRoIHRoaXMgdGltZXN0YW1wIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdCBpcyBsYXRlciB0aGFuIHRoZQorICAgICAqICAgICAgICAgc3VwcGxpZWQgdGltZXN0YW1wLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlcihUaW1lc3RhbXAgdGhlVGltZXN0YW1wKSB7CiAgICAgICAgIGxvbmcgdGhpc1RpbWUgPSB0aGlzLmdldFRpbWUoKTsKQEAgLTEzMiwxMyArMTQxLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdGltZXN0YW1wIG9iamVjdCBpcyBlYXJsaWVyIHRoYW4gdGhlIHN1cHBsaWVkCi0gICAgICogdGltZXN0YW1wLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdCBpcyBlYXJsaWVyIHRoYW4gdGhlCisgICAgICogc3VwcGxpZWQgdGltZXN0YW1wLCBvdGhlcndpc2UgcmV0dXJucyB7QGNvZGUgZmFsc2V9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVUaW1lc3RhbXAKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZSB3aXRoIHRoaXMgdGltZXN0YW1wIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRpbWVzdGFtcCBvYmplY3QgaXMgZWFybGllciB0aGFuIHRoZSBzdXBwbGllZAotICAgICAqICAgICAgICAgdGltZXN0YW1wLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZSB3aXRoIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0IGlzIGVhcmxpZXIgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgIHN1cHBsaWVkIHRpbWVzdGFtcCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlKFRpbWVzdGFtcCB0aGVUaW1lc3RhbXApIHsKICAgICAgICAgbG9uZyB0aGlzVGltZSA9IHRoaXMuZ2V0VGltZSgpOwpAQCAtMTY0LDE2ICsxNzQsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIFRpbWVzdGFtcCBvYmplY3Qgd2l0aCBhIHN1cHBsaWVkIFRpbWVzdGFtcCBvYmplY3QKKyAgICAgKiBDb21wYXJlcyB0aGlzIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdCB3aXRoIGEgc3VwcGxpZWQge0Bjb2RlIFRpbWVzdGFtcH0KKyAgICAgKiBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZU9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIHRpbWVzdGFtcCB0byBjb21wYXJlIHdpdGggdGhpcyB0aW1lc3RhbXAgb2JqZWN0LCBwYXNzZWQgaW4KLSAgICAgKiAgICAgICAgICAgIGFzIGFuIE9iamVjdAotICAgICAqIEByZXR1cm4gMCBpZiB0aGUgdHdvIFRpbWVzdGFtcCBvYmplY3RzIGFyZSBlcXVhbCBpbiB0aW1lLCBhIHZhbHVlIDwwIGlmCi0gICAgICogICAgICAgICB0aGlzIFRpbWVzdGFtcCBvYmplY3QgaXMgYmVmb3JlIHRoZSBzdXBwbGllZCBUaW1lc3RhbXAgYW5kIGEKLSAgICAgKiAgICAgICAgIHZhbHVlID4wIGlmIHRoaXMgVGltZXN0YW1wIG9iamVjdCBpcyBhZnRlciB0aGUgc3VwcGxpZWQgVGltZXN0YW1wCisgICAgICogICAgICAgICAgICB0aGUgdGltZXN0YW1wIHRvIGNvbXBhcmUgd2l0aCB0aGlzIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdCwKKyAgICAgKiAgICAgICAgICAgIHBhc3NlZCBhcyBhbiB7QGNvZGUgT2JqZWN0fS4KKyAgICAgKiBAcmV0dXJuIDxkZD4KKyAgICAgKiAgICAgICAgIDxkbD4KKyAgICAgKiAgICAgICAgIHtAY29kZSAwfSBpZiB0aGUgdHdvIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdHMgYXJlIGVxdWFsIGluIHRpbWUKKyAgICAgKiAgICAgICAgIDwvZGw+CisgICAgICogICAgICAgICA8ZGw+CisgICAgICogICAgICAgICBhIHZhbHVlIHtAY29kZSA8IDB9IGlmIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0IGlzIGJlZm9yZQorICAgICAqICAgICAgICAgdGhlIHN1cHBsaWVkIHtAY29kZSBUaW1lc3RhbXB9IGFuZCBhIHZhbHVlCisgICAgICogICAgICAgICA8L2RsPgorICAgICAqICAgICAgICAgPGRsPgorICAgICAqICAgICAgICAge0Bjb2RlID4gMH0gaWYgdGhpcyB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3QgaXMgYWZ0ZXIgdGhlCisgICAgICogICAgICAgICBzdXBwbGllZCB7QGNvZGUgVGltZXN0YW1wfQorICAgICAqICAgICAgICAgPC9kbD4KKyAgICAgKiAgICAgICAgIDwvZGQ+CiAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3VwcGxpZWQgb2JqZWN0IGlzIG5vdCBhIFRpbWVzdGFtcCBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3VwcGxpZWQgb2JqZWN0IGlzIG5vdCBhIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhEYXRlIHRoZU9iamVjdCkgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7CkBAIC0xODEsMTQgKzIwMywyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgVGltZXN0YW1wIG9iamVjdCB3aXRoIGEgc3VwcGxpZWQgVGltZXN0YW1wIG9iamVjdAorICAgICAqIENvbXBhcmVzIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0IHdpdGggYSBzdXBwbGllZCB7QGNvZGUgVGltZXN0YW1wfQorICAgICAqIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlVGltZXN0YW1wCi0gICAgICogICAgICAgICAgICB0aGUgdGltZXN0YW1wIHRvIGNvbXBhcmUgd2l0aCB0aGlzIHRpbWVzdGFtcCBvYmplY3QsIHBhc3NlZCBpbgotICAgICAqICAgICAgICAgICAgYXMgYSBUaW1lc3RhbXAKLSAgICAgKiBAcmV0dXJuIDAgaWYgdGhlIHR3byBUaW1lc3RhbXAgb2JqZWN0cyBhcmUgZXF1YWwgaW4gdGltZSwgYSB2YWx1ZSA8MCBpZgotICAgICAqICAgICAgICAgdGhpcyBUaW1lc3RhbXAgb2JqZWN0IGlzIGJlZm9yZSB0aGUgc3VwcGxpZWQgVGltZXN0YW1wIGFuZCBhCi0gICAgICogICAgICAgICB2YWx1ZSA+MCBpZiB0aGlzIFRpbWVzdGFtcCBvYmplY3QgaXMgYWZ0ZXIgdGhlIHN1cHBsaWVkIFRpbWVzdGFtcAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWVzdGFtcCB0byBjb21wYXJlIHdpdGggdGhpcyB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3QsCisgICAgICogICAgICAgICAgICBwYXNzZWQgaW4gYXMgYSB7QGNvZGUgVGltZXN0YW1wfS4KKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgPGxpPntAY29kZSAwfSwgaWYgdGhlIHR3byB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3RzIGFyZQorICAgICAqICAgICAgICAgZXF1YWwgaW4gdGltZTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0Bjb2RlIDwgMH0sIGlmIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0IGlzIGJlZm9yZSB0aGUKKyAgICAgKiAgICAgICAgIHN1cHBsaWVkIHtAY29kZSBUaW1lc3RhbXB9PC9saT4KKyAgICAgKiAgICAgICAgIDxsaT4ge0Bjb2RlID4gMH0sIGlmIHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0IGlzIGFmdGVyIHRoZQorICAgICAqICAgICAgICAgc3VwcGxpZWQge0Bjb2RlIFRpbWVzdGFtcH08L2xpPgorICAgICAqICAgICAgICAgPC91bD4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUaW1lc3RhbXAgdGhlVGltZXN0YW1wKSB7CiAgICAgICAgIGludCByZXN1bHQgPSBzdXBlci5jb21wYXJlVG8odGhlVGltZXN0YW1wKTsKQEAgLTIxMCw5ICsyNDAsMTIgQEAKICAgICAgKiBUZXN0cyB0byBzZWUgaWYgdGhpcyB0aW1lc3RhbXAgaXMgZXF1YWwgdG8gYSBzdXBwbGllZCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZU9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFRpbWVzdGFtcCBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHN1cHBsaWVkIFRpbWVzdGFtcAotICAgICAqICAgICAgICAgb2JqZWN0IGZhbHNlIGlmIHRoZSBvYmplY3QgaXMgbm90IGEgVGltZXN0YW1wIG9iamVjdCBvciBpZiB0aGUKLSAgICAgKiAgICAgICAgIG9iamVjdCBpcyBhIFRpbWVzdGFtcCBidXQgcmVwcmVzZW50cyBhIGRpZmZlcmVudCBpbnN0YW50IGluIHRpbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhpcyB0aW1lc3RhbXAgaXMgY29tcGFyZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3QgaXMgZXF1YWwgdG8gdGhlCisgICAgICogICAgICAgICBzdXBwbGllZCB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3Q8YnI+e0Bjb2RlIGZhbHNlfSBpZiB0aGUgb2JqZWN0CisgICAgICogICAgICAgICBpcyBub3QgYSB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3Qgb3IgaWYgdGhlIG9iamVjdCBpcyBhIHtAY29kZQorICAgICAqICAgICAgICAgVGltZXN0YW1wfSBidXQgcmVwcmVzZW50cyBhIGRpZmZlcmVudCBpbnN0YW50IGluIHRpbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGVPYmplY3QpIHsKQEAgLTIyNiwxMCArMjU5LDExIEBACiAgICAgICogVGVzdHMgdG8gc2VlIGlmIHRoaXMgdGltZXN0YW1wIGlzIGVxdWFsIHRvIGEgc3VwcGxpZWQgdGltZXN0YW1wLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVUaW1lc3RhbXAKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZSB3aXRoIHRoaXMgdGltZXN0YW1wIG9iamVjdCwgcGFzc2VkIGluCi0gICAgICogICAgICAgICAgICBhcyBhbiBPYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBUaW1lc3RhbXAgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBzdXBwbGllZCBUaW1lc3RhbXAKLSAgICAgKiAgICAgICAgIG9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHRpbWVzdGFtcCB0byBjb21wYXJlIHdpdGggdGhpcyB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3QsCisgICAgICogICAgICAgICAgICBwYXNzZWQgYXMgYW4ge0Bjb2RlIE9iamVjdH0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3QgaXMgZXF1YWwgdG8gdGhlCisgICAgICogICAgICAgICBzdXBwbGllZCB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhUaW1lc3RhbXAgdGhlVGltZXN0YW1wKSB7CiAgICAgICAgIGlmICh0aGVUaW1lc3RhbXAgPT0gbnVsbCkgewpAQCAtMjQwLDE5ICsyNzQsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoaXMgVGltZXN0YW1wJ3MgbmFub3NlY29uZCB2YWx1ZQorICAgICAqIEdldHMgdGhpcyB7QGNvZGUgVGltZXN0YW1wfSdzIG5hbm9zZWNvbmQgdmFsdWUKICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFRoZSB0aW1lc3RhbXAncyBuYW5vc2Vjb25kIHZhbHVlLCBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQKLSAgICAgKiAgICAgICAgIDk5OSw5OTksOTk5CisgICAgICogICAgICAgICA5OTksOTk5LDk5OS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE5hbm9zKCkgewogICAgICAgICByZXR1cm4gbmFub3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSByZXByZXNlbnRlZCBieSB0aGlzIFRpbWVzdGFtcCBvYmplY3QsIGFzIGEgbG9uZyB2YWx1ZQotICAgICAqIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIEVwb2NoIChKYW51YXJ5IDEgMTk3MCwKLSAgICAgKiAwMDowMDowMC4wMDAgR01UKQorICAgICAqIFJldHVybnMgdGhlIHRpbWUgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgVGltZXN0YW1wfSBvYmplY3QsIGFzIGEgbG9uZworICAgICAqIHZhbHVlIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIEVwb2NoIChKYW51YXJ5IDEKKyAgICAgKiAxOTcwLCAwMDowMDowMC4wMDAgR01UKS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBwYXNzZWQgc2luY2UgSmFudWFyeSAxIDE5NzAsCisgICAgICogICAgICAgICAwMDowMDowMC4wMDAgR01ULgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGdldFRpbWUoKSB7CkBAIC0yNjIsMTAgKzMwMSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbm9zZWNvbmQgdmFsdWUgZm9yIHRoaXMgdGltZXN0YW1wCi0gICAgICogQHBhcmFtIG4gbnVtYmVyIG9mIG5hbm9zZWNvbmRzCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHNtYWxsZXIgdGhhbiAwIAotICAgICAqIG9yIGdyZWF0ZXIgdGhhbiA5OTk5OTk5OTkKKyAgICAgKiBTZXRzIHRoZSBuYW5vc2Vjb25kIHZhbHVlIGZvciB0aGlzIHtAY29kZSBUaW1lc3RhbXB9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgbmFub3NlY29uZHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBudW1iZXIgb2YgbmFub3NlY29uZHMgc21hbGxlciB0aGFuIDAgb3IgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICAgOTk5LDk5OSw5OTkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFub3MoaW50IG4pIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBpZiAoKG4gPCAwKSB8fCAobiA+IDk5OTk5OTk5OSkpIHsKQEAgLTI3Niw5ICszMTksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgVGltZXN0YW1wIG9iamVjdCB0byB0aGUgc3VwcGxpZWQgdGltZSwKLSAgICAgKiBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaCAoSmFudWFyeSAxIDE5NzAsCi0gICAgICogMDA6MDA6MDAuMDAwIEdNVCkKKyAgICAgKiBTZXRzIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIFRpbWVzdGFtcH0gb2JqZWN0IHRvIHRoZQorICAgICAqIHN1cHBsaWVkIHRpbWUsIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIEVwb2NoCisgICAgICogKEphbnVhcnkgMSAxOTcwLCAwMDowMDowMC4wMDAgR01UKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGhlVGltZQorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2ggKEphbnVhcnkgMSAxOTcwLAorICAgICAqICAgICAgICAgICAgMDA6MDA6MDAuMDAwIEdNVCkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGltZShsb25nIHRoZVRpbWUpIHsKQEAgLTMwNCwxMCArMzUyLDExIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgZm9ybWF0dGVkIGFzIGEgU3RyaW5nIGluIHRoZSBKREJDIFRpbWVzdGFtcCBFc2NhcGUKLSAgICAgKiBmb3JtYXQsIHdoaWNoIGlzIG9mIHRoZSBmb3JtICJ5eXl5LW1tLWRkIGhoOm1tOnNzLm5ubm5ubm5ubiIKKyAgICAgKiBmb3JtYXQsIHdoaWNoIGlzIHtAY29kZSAieXl5eS1tbS1kZCBoaDptbTpzcy5ubm5ubm5ubm4ifS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgaW5zdGFudCBkZWZpbmVkIGJ5IHRoZSBUaW1lc3RhbXAsIGluCi0gICAgICogICAgICAgICBKREJDIFRpbWVzdGFtcCBlc2NhcGUgZm9ybWF0CisgICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGluc3RhbnQgZGVmaW5lZCBieSB0aGUge0Bjb2RlCisgICAgICogICAgICAgICBUaW1lc3RhbXB9LCBpbiBKREJDIFRpbWVzdGFtcCBlc2NhcGUgZm9ybWF0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgQE92ZXJyaWRlCkBAIC0zNzEsMTUgKzQyMCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBUaW1lc3RhbXAgb2JqZWN0IHdpdGggYSB0aW1lIHZhbHVlIGVxdWFsIHRvIHRoZSB0aW1lIHNwZWNpZmllZAotICAgICAqIGJ5IGEgc3VwcGxpZWQgU3RyaW5nIGhvbGRpbmcgdGhlIHRpbWUgaW4gSkRCQyB0aW1lc3RhbXAgZXNjYXBlIGZvcm1hdCwKLSAgICAgKiB3aGljaCBpcyBvZiB0aGUgZm9ybSAieXl5eS1tbS1kZCBoaDptbTpzcy5ubm5ubm5ubm4iCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdCB3aXRoIGEgdGltZSB2YWx1ZSBlcXVhbCB0byB0aGUgdGltZQorICAgICAqIHNwZWNpZmllZCBieSBhIHN1cHBsaWVkIFN0cmluZyBob2xkaW5nIHRoZSB0aW1lIGluIEpEQkMgdGltZXN0YW1wIGVzY2FwZQorICAgICAqIGZvcm1hdCwgd2hpY2ggaXMge0Bjb2RlICJ5eXl5LW1tLWRkIGhoOm1tOnNzLm5ubm5ubm5ubn0iCiAgICAgICogCiAgICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgY29udGFpbmluZyBhIHRpbWUgaW4gSkRCQyB0aW1lc3RhbXAgZXNjYXBlIGZvcm1hdAotICAgICAqIEByZXR1cm4gQSB0aW1lc3RhbXAgb2JqZWN0IHdpdGggdGltZSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSBzdXBwbGllZAotICAgICAqICAgICAgICAgU3RyaW5nCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3ZpZGVkIFN0cmluZyBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFN0cmluZ30gY29udGFpbmluZyBhIHRpbWUgaW4gSkRCQyB0aW1lc3RhbXAgZXNjYXBlCisgICAgICogICAgICAgICAgICBmb3JtYXQuCisgICAgICogQHJldHVybiBBIHtAY29kZSBUaW1lc3RhbXB9IG9iamVjdCB3aXRoIHRpbWUgdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUKKyAgICAgKiAgICAgICAgIHN1cHBsaWVkIHtAY29kZSBTdHJpbmd9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3ZpZGVkIHN0cmluZyBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUaW1lc3RhbXAgdmFsdWVPZihTdHJpbmcgcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1R5cGVzLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9UeXBlcy5qYXZhCmluZGV4IDVlOWFhNGMuLjhjZTA0MjEgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1R5cGVzLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvVHlwZXMuamF2YQpAQCAtMTksNyArMTksMTAgQEAKIAogLyoqCiAgKiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgY29uc3RhbnRzIHVzZWQgdG8gaWRlbnRpZnkgZ2VuZXJpYyBTUUwgdHlwZXMsIGFsc28KLSAqIGNhbGxlZCBKREJDIHR5cGVzLiBUaGUgdHlwZSBjb25zdGFudCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQgdG8gdGhvc2UgaW4gWE9QRU4uCisgKiBjYWxsZWQgSkRCQyB0eXBlcy4gVGhlIHR5cGUgY29uc3RhbnQgdmFsdWVzIGFyZSBlcXVpdmFsZW50IHRvIHRob3NlIGRlZmluZWQKKyAqIGJ5IFgvT1BFTi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBUeXBlcyB7CiAKQEAgLTMxLDE1NCArMzQsMjE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIEFSUkFZLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgQVJSQVl9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZID0gMjAwMzsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBCSUdJTlQuCisgICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIHtAY29kZSBCSUdJTlR9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJR0lOVCA9IC01OwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIEJJTkFSWS4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIEJJTkFSWX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZID0gLTI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgQklULgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgQklUfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVQgPSAtNzsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBCTE9CLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgQkxPQn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQiA9IDIwMDQ7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgQk9PTEVBTi4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIEJPT0xFQU59LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSAxNjsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBDSEFSLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgQ0hBUn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUiA9IDE7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgQ0xPQi4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIENMT0J9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT0IgPSAyMDA1OwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIERBVEFMSU5LLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgREFUQUxJTkt9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFMSU5LID0gNzA7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgREFURS4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIERBVEV9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEUgPSA5MTsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBERUNJTUFMLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgREVDSU1BTH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTCA9IDM7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgRElTVElOQ1QuCisgICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIHtAY29kZSBESVNUSU5DVH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTVElOQ1QgPSAyMDAxOwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIERPVUJMRS4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIERPVUJMRX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFID0gODsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBGTE9BVC4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIEZMT0FUfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTE9BVCA9IDY7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgSU5URUdFUi4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIElOVEVHRVJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVIgPSA0OwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIEpBVkFfT0JKRUNULgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgSkFWQV9PQkpFQ1R9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfT0JKRUNUID0gMjAwMDsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBMT05HVkFSQklOQVJZLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgTE9OR1ZBUkJJTkFSWX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9OR1ZBUkJJTkFSWSA9IC00OwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIExPTkdWQVJDSEFSLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgTE9OR1ZBUkNIQVJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTkdWQVJDSEFSID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgTlVMTC4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIE5VTEx9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTEwgPSAwOwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIE5VTUVSSUMuCisgICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIHtAY29kZSBOVU1FUklDfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1FUklDID0gMjsKIAogICAgIC8qKgogICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoYXQgdGhlIFNRTCB0eXBlIGlzIGRhdGFiYXNlIHNwZWNpZmljIGFuZAogICAgICAqIGlzIG1hcHBlZCB0byBhIEphdmEgb2JqZWN0LCBhY2Nlc3NlZCB2aWEgdGhlIG1ldGhvZHMKLSAgICAgKiA8Y29kZT5nZXRPYmplY3Q8L2NvZGU+IGFuZCA8Y29kZT5zZXRPYmplY3Q8L2NvZGU+LgorICAgICAqIHtAY29kZSBnZXRPYmplY3R9IGFuZCB7QGNvZGUgc2V0T2JqZWN0fS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVEhFUiA9IDExMTE7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgUkVBTC4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIFJFQUx9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQUwgPSA3OwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIFJFRi4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIFJFRn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGID0gMjAwNjsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBTTUFMTElOVC4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIFNNQUxMSU5UfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTUFMTElOVCA9IDU7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgU1RSVUNULgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgU1RSVUNUfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJVQ1QgPSAyMDAyOwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIFRJTUUuCisgICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIHtAY29kZSBUSU1FfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FID0gOTI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgVElNRVNUQU1QLgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgVElNRVNUQU1QfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FU1RBTVAgPSA5MzsKIAogICAgIC8qKgotICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSBUSU5ZSU5ULgorICAgICAqIFRoZSB0eXBlIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBTUUwgdHlwZSB7QGNvZGUgVElOWUlOVH0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElOWUlOVCA9IC02OwogCiAgICAgLyoqCi0gICAgICogVGhlIHR5cGUgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIFNRTCB0eXBlIFZBUkJJTkFSWS4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIFZBUkJJTkFSWX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSQklOQVJZID0gLTM7CiAKICAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUgVkFSQ0hBUi4KKyAgICAgKiBUaGUgdHlwZSBjb2RlIHRoYXQgaWRlbnRpZmllcyB0aGUgU1FMIHR5cGUge0Bjb2RlIFZBUkNIQVJ9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBUkNIQVIgPSAxMjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL3BhY2thZ2UuaHRtbCBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL3BhY2thZ2UuaHRtbAppbmRleCBlNDZmMTcwLi45YWUyNDg4IDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZhL3NxbC9wYWNrYWdlLmh0bWwKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YS9zcWwvcGFja2FnZS5odG1sCkBAIC0yLDYgKzIsNyBAQAogICA8Ym9keT4KICAgICA8cD4KICAgICAgIFByb3ZpZGVzIGEgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgU1FMLWJhc2VkIGRhdGFiYXNlcy4KLSAgICA8cD4KKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvQ29ubmVjdGlvbkV2ZW50LmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvQ29ubmVjdGlvbkV2ZW50LmphdmEKaW5kZXggZThlYzdjMy4uZTA3ZTdjMSAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudC5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Db25uZWN0aW9uRXZlbnQuamF2YQpAQCAtMjIsOSArMjIsMTEgQEAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBBbiBFdmVudCBvYmplY3Qgd2hpY2ggaXMgc2VudCB3aGVuIHNwZWNpZmljIGV2ZW50cyBoYXBwZW4gb24gYQotICogUG9vbGVkQ29ubmVjdGlvbiBvYmplY3QuIFRoZSBldmVudHMgaW52b2x2ZWQgYXJlIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGNsb3NpbmcKLSAqIHRoZSBQb29sZWRDb25uZWN0aW9uIGFuZCB3aGVuIGFuIGVycm9yIG9jY3VycyBpbiB0aGUgUG9vbGVkQ29ubmVjdGlvbi4KKyAqIFNlbnQgd2hlbiBzcGVjaWZpYyBldmVudHMgaGFwcGVuIG9uIGEge0BsaW5rIFBvb2xlZENvbm5lY3Rpb259IG9iamVjdC4gVGhlc2UKKyAqIGV2ZW50cyBhcmUgYSBmYWNpbGl0eSB0byByZXBvcnQgd2hlbiBhbiBhcHBsaWNhdGlvbiBjbG9zZXMgdGhlIHBvb2xlZAorICogY29ubmVjdGlvbiBvciB3aGVuIGFuIGVycm9yIG9jY3VycyBpbiB0aGUgcG9vbGVkIGNvbm5lY3Rpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCkBAIC0zMywyNSArMzUsMjkgQEAKICAgICBwcml2YXRlIFNRTEV4Y2VwdGlvbiB0aGVTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiBldmVudCBpbml0aWFsaXplZCB3aXRoIGEgc3VwcGxpZWQgUG9vbGVkQ29ubmVjdGlvbi4KKyAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiBldmVudCBpbml0aWFsaXplZCB3aXRoIHRoZSBzdXBwbGllZCB7QGNvZGUKKyAgICAgKiBQb29sZWRDb25uZWN0aW9ufSByZXBvcnRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaGFzIGNsb3NlZCB0aGUKKyAgICAgKiBjb25uZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVDb25uZWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgUG9vbGVkQ29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGNvbm5lY3Rpb24gZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgY3JlYXRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29ubmVjdGlvbkV2ZW50KFBvb2xlZENvbm5lY3Rpb24gdGhlQ29ubmVjdGlvbikgewogICAgICAgICBzdXBlcih0aGVDb25uZWN0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQ29ubmVjdGlvbkV2ZW50IGluaXRpYWxpemVkIHdpdGggYSBzdXBwbGllZCBQb29sZWRDb25uZWN0aW9uCi0gICAgICogYW5kIHdpdGggYSBzdXBwbGllZCBTUUxFeGNlcHRpb24gaW5kaWNhdGluZyB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZAotICAgICAqIHdpdGhpbiB0aGUgUG9vbGVkQ29ubmVjdGlvbi4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIENvbm5lY3Rpb25FdmVudH0gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3VwcGxpZWQge0Bjb2RlCisgICAgICogUG9vbGVkQ29ubmVjdGlvbn0gYW5kIHdpdGggdGhlIHN1cHBsaWVkIHtAY29kZSBTUUxFeGNlcHRpb259IGluZGljYXRpbmcKKyAgICAgKiB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aXRoaW4gdGhlIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlQ29ubmVjdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIFBvb2xlZENvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIGNyZWF0ZWQuCiAgICAgICogQHBhcmFtIHRoZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIFNRTEV4Y2VwdGlvbiBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGhhcwotICAgICAqICAgICAgICAgICAgb2NjdXJyZWQsIHdoaWNoIGlzIGFib3V0IHRvIGJlIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiBlcnJvciB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNpZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbm5lY3Rpb25FdmVudChQb29sZWRDb25uZWN0aW9uIHRoZUNvbm5lY3Rpb24sCiAgICAgICAgICAgICBTUUxFeGNlcHRpb24gdGhlRXhjZXB0aW9uKSB7CkBAIC02MCwxMSArNjYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTUUxFeGNlcHRpb24gd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHdoaWNoCi0gICAgICogb2NjdXJyZWQgaW4gdGhlIFBvb2xlZENvbm5lY3Rpb24uCisgICAgICogR2V0cyB0aGUge0Bjb2RlIFNRTEV4Y2VwdGlvbn0gd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yCisgICAgICogd2hpY2ggb2NjdXJyZWQgaW4gdGhlIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIFNRTEV4Y2VwdGlvbiBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4gTWF5IGJlCi0gICAgICogICAgICAgICBudWxsIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNRTEV4Y2VwdGlvbn0gY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCisgICAgICogICAgICAgICBNYXkgYmUge0Bjb2RlIG51bGx9IGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1FMRXhjZXB0aW9uIGdldFNRTEV4Y2VwdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHRoZVNRTEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Db25uZWN0aW9uRXZlbnRMaXN0ZW5lci5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudExpc3RlbmVyLmphdmEKaW5kZXggNzE1NjU1OC4uMTMzMzgxNCAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudExpc3RlbmVyLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudExpc3RlbmVyLmphdmEKQEAgLTIwLDQwICsyMCw0NCBAQAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCiAvKioKLSAqIEFuIGludGVyZmFjZSB1c2VkIHRvIHJlY2VpdmUgZXZlbnRzIGdlbmVyYXRlZCBieSBhCi0gKiA8Y29kZT5Qb29sZWRDb25uZWN0aW9uPC9jb2RlPi4KKyAqIEFuIGludGVyZmFjZSB1c2VkIHRvIHJlY2VpdmUgZXZlbnRzIGdlbmVyYXRlZCBieSBhIHtAbGluayBQb29sZWRDb25uZWN0aW9ufS4KICAqIDxwPgotICogVGhpcyBpbnRlcmZhY2Ugd291bGQgdHlwaWNhbGx5IGJlIGltcGxlbWVudGVkIGJ5IGEgY29tcG9uZW50IHdoaWNoIGltcGxlbWVudHMKLSAqIENvbm5lY3Rpb24gUG9vbGluZyAoYSBDb25uZWN0aW9uIFBvb2wgTWFuYWdlcikuIEEgQ29ubmVjdGlvbiB3aWxsIHNpZ25hbAotICogZXZlbnRzIHRvIGEgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIgZWl0aGVyIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGNsb3NlcyBhCi0gKiBDb25uZWN0aW9uIGl0IGhhcyBiZWVuIHVzaW5nIG9yIHdoZW4gYSBzaWduaWZpY2FudCBlcnJvciBvY2N1cnMgd2hpbGUgdGhlCi0gKiBDb25uZWN0aW9uIGlzIGJlaW5nIHVzZWQsIHdoZXJlIHRoZSBDb25uZWN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBhZ2Fpbi4KKyAqIFRoaXMgaW50ZXJmYWNlIHdvdWxkIHR5cGljYWxseSBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbXBvbmVudCB3aGljaCBtYW5hZ2VzIGEKKyAqIGNvbm5lY3Rpb24gcG9vbCAoYSBjb25uZWN0aW9uIHBvb2wgbWFuYWdlcikuIEEgY29ubmVjdGlvbiB0cmlnZ2VycyBhbiBldmVudAorICogdG8gYSB7QGNvZGUgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXJ9IGVpdGhlciB3aGVuIHRoZSBhcHBsaWNhdGlvbiBjbG9zZXMgYQorICogY29ubmVjdGlvbiBpdCBoYXMgYmVlbiB1c2luZyBvciB3aGVuIGEgc2lnbmlmaWNhbnQgZXJyb3Igb2NjdXJzIHdoaWxlIHRoZQorICogY29ubmVjdGlvbiBpcyBiZWluZyB1c2VkLgorICogPC9wPgogICogPHA+Ci0gKiBUaGUgQ29ubmVjdGlvbiBQb29sIE1hbmFnZXIgY2FuIHJldHVybiBjbG9zZWQgQ29ubmVjdGlvbnMgdG8gdGhlIFBvb2wgZm9yCisgKiBUaGUgY29ubmVjdGlvbiBwb29sIG1hbmFnZXIgY2FuIHJldHVybiBjbG9zZWQgY29ubmVjdGlvbnMgdG8gdGhlIHBvb2wgZm9yCiAgKiBsYXRlciByZXVzZS4gQ29ubmVjdGlvbnMgZXhwZXJpZW5jaW5nIGFuIGVycm9yIHNob3VsZCBiZSBkaXNjYXJkZWQuCisgKiA8L3A+CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25FdmVudExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIgdGhhdCBhbiBhcHBsaWNhdGlvbiBoYXMgY2FsbGVkIHRoZQotICAgICAqIDxjb2RlPmNsb3NlPC9jb2RlPiBtZXRob2Qgb24gYSBwb29sZWQgQ29ubmVjdGlvbi4KKyAgICAgKiBOb3RpZmllcyB0aGUge0Bjb2RlIENvbm5lY3Rpb25FdmVudExpc3RlbmVyfSB0aGF0IGFuIGFwcGxpY2F0aW9uIGhhcworICAgICAqIGNhbGxlZCB0aGUge0Bjb2RlIGNsb3NlfSBtZXRob2Qgb24gYSBwb29sZWQgY29ubmVjdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlRXZlbnQKLSAgICAgKiAgICAgICAgICAgIGEgQ29ubmVjdGlvbkV2ZW50IGNvbnRhaW5pbmcgZGV0YWlsIGFib3V0IHRoZSBzb3VyY2Ugb2YgdGhlCi0gICAgICogICAgICAgICAgICBldmVudC4KKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIENvbm5lY3Rpb25FdmVudH0gY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSBldmVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25uZWN0aW9uQ2xvc2VkKENvbm5lY3Rpb25FdmVudCB0aGVFdmVudCk7CiAKICAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgYQotICAgICAqIFBvb2xlZENvbm5lY3Rpb24gd2FzIGJlaW5nIHVzZWQgYW5kIHRoYXQgdGhlIFBvb2xlZENvbm5lY3Rpb24gY2FuIG5vCi0gICAgICogbG9uZ2VyIGJlIHVzZWQgZm9yIHdvcmsuIFRoaXMgbm90aWZpY2F0aW9uIGlzIGRvbmUganVzdCBiZWZvcmUgdGhlCi0gICAgICogU1FMRXhjZXB0aW9uIHBhc3NlZCBpbiB0aGUgZXZlbnQgbWVzc2FnZSBpcyB0aHJvd24gdG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIE5vdGlmaWVzIHRoZSB7QGNvZGUgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXJ9IHRoYXQgYW4gZXJyb3IgaGFzIG9jY3VycmVkCisgICAgICogb24gYSB7QGNvZGUgUG9vbGVkQ29ubmVjdGlvbn0uIFRoaXMgbm90aWZpY2F0aW9uIGlzIHRyaWdnZXJlZCA8aT5iZWZvcmU8L2k+IHRoZQorICAgICAqIHtAY29kZSBTUUxFeGNlcHRpb259LCB3aGljaCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZXZlbnQgYXJndW1lbnQsIGlzCisgICAgICogdGhyb3duLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVFdmVudAotICAgICAqICAgICAgICAgICAgYSBDb25uZWN0aW9uRXZlbnQgY29udGFpbmluZyBkZXRhaWwgYWJvdXQgdGhlIHNvdXJjZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgIGV2ZW50IGFuZCB0aGUgU1FMRXhjZXB0aW9uIHRoYXQgaGFzIG9jY3VycmVkLgorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgQ29ubmVjdGlvbkV2ZW50fSBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIHNvdXJjZQorICAgICAqICAgICAgICAgICAgb2YgdGhlIGV2ZW50IGFuZCB0aGUge0Bjb2RlIFNRTEV4Y2VwdGlvbn0gdGhhdCBoYXMgb2NjdXJyZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29ubmVjdGlvbkVycm9yT2NjdXJyZWQoQ29ubmVjdGlvbkV2ZW50IHRoZUV2ZW50KTsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Db25uZWN0aW9uUG9vbERhdGFTb3VyY2UuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Db25uZWN0aW9uUG9vbERhdGFTb3VyY2UuamF2YQppbmRleCA1YmU3NWQ5Li5kNzMxMjhiIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvQ29ubmVjdGlvblBvb2xEYXRhU291cmNlLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL0Nvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZS5qYXZhCkBAIC0yMSwxMDMgKzIxLDExNyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgY3JlYXRpb24gb2YgUG9vbGVkQ29ubmVjdGlvbiBvYmplY3RzLiBVc2VkIGludGVybmFsbHkKLSAqIHdpdGhpbiB0aGUgcGFja2FnZS4KKyAqIEFuIGludGVyZmFjZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHtAY29kZSBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2V9IG9iamVjdHMuCisgKiBVc2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBwYWNrYWdlLgogICogPHA+Ci0gKiBBIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZSBpbnRlcmZhY2UgaXMgdHlwaWNhbGx5Ci0gKiByZWdpc3RlcmVkIHdpdGggYSBKTkRJIG5hbWluZyBzZXJ2aWNlIGRpcmVjdG9yeSBhbmQgaXMgcmV0cmlldmVkIGZyb20gdGhlcmUKLSAqIGJ5IG5hbWUuCisgKiBBIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIHtAY29kZSBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2V9IGludGVyZmFjZSBpcworICogdHlwaWNhbGx5IHJlZ2lzdGVyZWQgd2l0aCBhIEpOREkgbmFtaW5nIHNlcnZpY2UgZGlyZWN0b3J5IGFuZCBpcyByZXRyaWV2ZWQKKyAqIGZyb20gdGhlcmUgYnkgbmFtZS4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlIHsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIExvZ2luIFRpbWVvdXQgdmFsdWUgZm9yIHRoaXMgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlLiBUaGUgTG9naW4KLSAgICAgKiBUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoZSBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UKLSAgICAgKiB3aWxsIHdhaXQgd2hlbiBvcGVuaW5nIGEgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlLiBBIFRpbWVvdXQgdmFsdWUgb2YgMAotICAgICAqIGltcGxpZXMgZWl0aGVyIHRoZSBzeXN0ZW0gZGVmYXVsdCB0aW1lb3V0IHZhbHVlIChpZiB0aGVyZSBpcyBvbmUpIG9yIHRoYXQKLSAgICAgKiB0aGVyZSBpcyBubyB0aW1lb3V0LiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIExvZ2luIFRpbWVvdXQgaXMgMC4KKyAgICAgKiBHZXRzIHRoZSBsb2dpbiB0aW1lb3V0IHZhbHVlIGZvciB0aGlzIHtAY29kZSBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2V9LgorICAgICAqIFRoZSBsb2dpbiB0aW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoZSB7QGNvZGUKKyAgICAgKiBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2V9IHdpbGwgd2FpdCB3aGVuIG9wZW5pbmcgYSBjb25uZWN0aW9uIHRvIGEKKyAgICAgKiBkYXRhYmFzZS4gQSB0aW1lb3V0IHZhbHVlIG9mIDAgaW1wbGllcyBlaXRoZXIgdGhlIHN5c3RlbSBkZWZhdWx0IHRpbWVvdXQKKyAgICAgKiB2YWx1ZSAoaWYgdGhlcmUgaXMgb25lKSBvciB0aGF0IHRoZXJlIGlzIG5vIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogZm9yIHRoZSBsb2dpbiB0aW1lb3V0IGlzIHtAY29kZSAwfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBMb2dpbiBUaW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCisgICAgICogQHJldHVybiB0aGUgbG9naW4gdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMb2dpblRpbWVvdXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTG9nIFdyaXRlciBmb3IgdGhpcyBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UuCisgICAgICogR2V0cyB0aGUgbG9nIHdyaXRlciBmb3IgdGhpcyB7QGNvZGUgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlfS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgTG9nIFdyaXRlciBpcyBhIHN0cmVhbSB0byB3aGljaCBhbGwgbG9nIGFuZCB0cmFjZSBtZXNzYWdlcyBhcmUgc2VudAotICAgICAqIGZyb20gdGhpcyBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UuIFRoZSBMb2cgV3JpdGVyIGNhbiBiZSBudWxsLCBpbiB3aGljaAotICAgICAqIGNhc2UsIGxvZyBhbmQgdHJhY2UgY2FwdHVyZSBpcyBkaXNhYmxlZC4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBMb2cKLSAgICAgKiBXcml0ZXIgd2hlbiBhbiBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UgaXMgY3JlYXRlZCBpcyBudWxsLiBOb3RlIHRoYXQgdGhlCi0gICAgICogTG9nIFdyaXRlciBmb3IgYW4gQ29ubmVjdGlvblBvb2xEYXRhU291cmNlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgTG9nCi0gICAgICogV3JpdGVyIHVzZWQgYnkgYSA8Y29kZT5Ecml2ZXJNYW5hZ2VyPC9jb2RlPi4KKyAgICAgKiBUaGUgbG9nIHdyaXRlciBpcyBhIHN0cmVhbSB0byB3aGljaCBhbGwgbG9nIGFuZCB0cmFjZSBtZXNzYWdlcyBhcmUgc2VudAorICAgICAqIGZyb20gdGhpcyB7QGNvZGUgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlfS4gVGhlIGxvZyB3cml0ZXIgY2FuIGJlIHtAY29kZQorICAgICAqIG51bGx9LCBpbiB3aGljaCBjYXNlIHRoZSBsb2cgYW5kIHRyYWNlIGNhcHR1cmUgaXMgZGlzYWJsZWQuIFRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgZm9yIHRoZSBsb2cgd3JpdGVyIHdoZW4gYW4ge0Bjb2RlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZX0gaXMKKyAgICAgKiBjcmVhdGVkIGlzIHtAY29kZSBudWxsfS4gTm90ZSB0aGF0IHRoZSBsb2cgd3JpdGVyIGZvciBhbiB7QGNvZGUKKyAgICAgKiBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2V9IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbG9nIHdyaXRlciB1c2VkIGJ5IGEKKyAgICAgKiB7QGNvZGUgRHJpdmVyTWFuYWdlcn0uCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBQcmludFdyaXRlciB3aGljaCBpcyB0aGUgTG9nIFdyaXRlciBmb3IgdGhpcwotICAgICAqICAgICAgICAgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBsb2cgd3JpdGluZwotICAgICAqICAgICAgICAgaXMgZGlzYWJsZWQgZm9yIHRoaXMgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUHJpbnRXcml0ZXJ9IHdoaWNoIGlzIHRoZSBsb2cgd3JpdGVyIGZvciB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlfS4gQ2FuIGJlIHtAY29kZSBudWxsfSwgaW4gd2hpY2ggY2FzZSBsb2cKKyAgICAgKiAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMge0Bjb2RlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZX0uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0TG9nV3JpdGVyKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgcG9vbGVkCisgICAgICogQ3JlYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgcG9vbGVkCiAgICAgICogY29ubmVjdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgUG9vbGVkQ29ubmVjdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb25uZWN0aW9uIHRvIHRoZQotICAgICAqICAgICAgICAgZGF0YWJhc2UKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFBvb2xlZENvbm5lY3Rpb259IHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlCisgICAgICogICAgICAgICBkYXRhYmFzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQb29sZWRDb25uZWN0aW9uIGdldFBvb2xlZENvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlLCB1c2luZyBhIHN1cHBsaWVkIFVzZXJuYW1lIGFuZAotICAgICAqIFBhc3N3b3JkLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgcG9vbGVkIGNvbm5lY3Rpb24uCisgICAgICogQ3JlYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSwgdXNpbmcgdGhlIHN1cHBsaWVkIHVzZXIgbmFtZSBhbmQKKyAgICAgKiBwYXNzd29yZCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBhcyBhIHBvb2xlZCBjb25uZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVVc2VyCi0gICAgICogICAgICAgICAgICBhIFN0cmluZyBjb250YWluaW5nIGEgVXNlciBOYW1lIGZvciB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBhIHVzZXIgbmFtZSBmb3IgdGhlIGRhdGFiYXNlIGxvZ2luLgogICAgICAqIEBwYXJhbSB0aGVQYXNzd29yZAotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgUGFzc3dvcmQgZm9yIHRoZSB1c2VyIGlkZW50aWZpZWQgYnkKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRoZVVzZXI8L2NvZGU+Ci0gICAgICogQHJldHVybiBhIFBvb2xlZENvbm5lY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29ubmVjdGlvbiB0byB0aGUKLSAgICAgKiAgICAgICAgIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICB0aGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGlkZW50aWZpZWQgYnkge0Bjb2RlCisgICAgICogICAgICAgICAgICB0aGVVc2VyfS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFBvb2xlZENvbm5lY3Rpb259IG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICB0byB0aGUgZGF0YWJhc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUG9vbGVkQ29ubmVjdGlvbiBnZXRQb29sZWRDb25uZWN0aW9uKFN0cmluZyB0aGVVc2VyLAogICAgICAgICAgICAgU3RyaW5nIHRoZVBhc3N3b3JkKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgTG9naW4gVGltZW91dCB2YWx1ZSBmb3IgdGhpcyBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UuIFRoZSBMb2dpbgotICAgICAqIFRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgdGhlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZQotICAgICAqIHdpbGwgd2FpdCB3aGVuIG9wZW5pbmcgYSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UuIEEgVGltZW91dCB2YWx1ZSBvZiAwCi0gICAgICogaW1wbGllcyBlaXRoZXIgdGhlIHN5c3RlbSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgKGlmIHRoZXJlIGlzIG9uZSkgb3IgdGhhdAotICAgICAqIHRoZXJlIGlzIG5vIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgTG9naW4gVGltZW91dCBpcyAwLgorICAgICAqIFNldHMgdGhlIGxvZ2luIHRpbWVvdXQgdmFsdWUgZm9yIHRoaXMge0Bjb2RlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZX0uCisgICAgICogVGhlIGxvZ2luIHRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgdGhlIHtAY29kZQorICAgICAqIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZX0gd2lsbCB3YWl0IHdoZW4gb3BlbmluZyBhIGNvbm5lY3Rpb24gdG8gYQorICAgICAqIGRhdGFiYXNlLiBBIHRpbWVvdXQgdmFsdWUgb2YgMCBpbXBsaWVzIGVpdGhlciB0aGUgc3lzdGVtIGRlZmF1bHQgdGltZW91dAorICAgICAqIHZhbHVlIChpZiB0aGVyZSBpcyBvbmUpIG9yIHRoYXQgdGhlcmUgaXMgbm8gdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBmb3IgdGhlIGxvZ2luIHRpbWVvdXQgaXMgMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlVGltZW91dAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBMb2dpbiBUaW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGxvZ2luIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvZ2luVGltZW91dChpbnQgdGhlVGltZW91dCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIExvZyBXcml0ZXIgZm9yIHRoaXMgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlLgorICAgICAqIFNldHMgdGhlIGxvZyB3cml0ZXIgZm9yIHRoaXMge0Bjb2RlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZX0uCiAgICAgICogPHA+Ci0gICAgICogVGhlIExvZyBXcml0ZXIgaXMgYSBzdHJlYW0gdG8gd2hpY2ggYWxsIGxvZyBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQKLSAgICAgKiBmcm9tIHRoaXMgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlLiBUaGUgTG9nIFdyaXRlciBjYW4gYmUgbnVsbCwgaW4gd2hpY2gKLSAgICAgKiBjYXNlLCBsb2cgYW5kIHRyYWNlIGNhcHR1cmUgaXMgZGlzYWJsZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgTG9nCi0gICAgICogV3JpdGVyIHdoZW4gYW4gQ29ubmVjdGlvblBvb2xEYXRhU291cmNlIGlzIGNyZWF0ZWQgaXMgbnVsbC4gTm90ZSB0aGF0IHRoZQotICAgICAqIExvZyBXcml0ZXIgZm9yIGFuIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIExvZwotICAgICAqIFdyaXRlciB1c2VkIGJ5IGEgPGNvZGU+RHJpdmVyTWFuYWdlcjwvY29kZT4uCisgICAgICogVGhlIGxvZyB3cml0ZXIgaXMgYSBzdHJlYW0gdG8gd2hpY2ggYWxsIGxvZyBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQKKyAgICAgKiBmcm9tIHRoaXMge0Bjb2RlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZX0uIFRoZSBsb2cgd3JpdGVyIGNhbiBiZSB7QGNvZGUKKyAgICAgKiBudWxsfSwgaW4gd2hpY2ggY2FzZSBsb2cgYW5kIHRyYWNlIGNhcHR1cmUgaXMgZGlzYWJsZWQuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogZm9yIHRoZSBsb2cgd3JpdGVyLCB3aGVuIGEge0Bjb2RlIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZX0gaXMgY3JlYXRlZCwKKyAgICAgKiBpcyB7QGNvZGUgbnVsbH0uIE5vdGUgdGhhdCB0aGUgbG9nIHdyaXRlciBmb3IgYSB7QGNvZGUKKyAgICAgKiBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2V9IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbG9nIHdyaXRlciB1c2VkIGJ5IGEKKyAgICAgKiB7QGNvZGUgRHJpdmVyTWFuYWdlcn0uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVXcml0ZXIKLSAgICAgKiAgICAgICAgICAgIGEgUHJpbnRXcml0ZXIgdG8gdXNlIGFzIHRoZSBMb2cgV3JpdGVyIGZvciB0aGlzCi0gICAgICogICAgICAgICAgICBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UuCisgICAgICogICAgICAgICAgICBpcyB0aGUgbG9nIHdyaXRlciBmb3IgdGhpcyB7QGNvZGUgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvZ1dyaXRlcihQcmludFdyaXRlciB0aGVXcml0ZXIpIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvRGF0YVNvdXJjZS5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL0RhdGFTb3VyY2UuamF2YQppbmRleCBjZDNlMGEzLi45OGJlNzYxIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvRGF0YVNvdXJjZS5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9EYXRhU291cmNlLmphdmEKQEAgLTIyLDExNyArMjIsMTM3IEBACiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIAogLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBjcmVhdGlvbiBvZiBDb25uZWN0aW9uIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50IGEKLSAqIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZS4gVGhpcyBpbnRlcmZhY2UgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlCi0gKiA8Y29kZT5qYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyPC9jb2RlPi4KKyAqIEFuIGludGVyZmFjZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHtAY29kZSBDb25uZWN0aW9ufSBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCBhCisgKiBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UuIFRoaXMgaW50ZXJmYWNlIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSB7QGNvZGUKKyAqIGphdmEuc3FsLkRyaXZlck1hbmFnZXJ9LgogICogPHA+Ci0gKiBBIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIERhdGFTb3VyY2UgaW50ZXJmYWNlIGlzIHR5cGljYWxseSByZWdpc3RlcmVkCi0gKiB3aXRoIGEgSk5ESSBuYW1pbmcgc2VydmljZSBkaXJlY3RvcnkgYW5kIGlzIHJldHJpZXZlZCBmcm9tIHRoZXJlIGJ5IG5hbWUuCisgKiBBIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIHtAY29kZSBEYXRhU291cmNlfSBpbnRlcmZhY2UgaXMgdHlwaWNhbGx5CisgKiByZWdpc3RlcmVkIHdpdGggYSBKTkRJIG5hbWluZyBzZXJ2aWNlIGRpcmVjdG9yeSBhbmQgaXMgcmV0cmlldmVkIGZyb20gdGhlcmUKKyAqIGJ5IG5hbWUuCisgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSBEYXRhU291cmNlIGludGVyZmFjZSBpcyB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYnkgdGhlIHdyaXRlciBvZiBhIEpEQkMKLSAqIGRyaXZlci4gVGhlcmUgYXJlIHRocmVlIHZhcmlhbnRzIG9mIHRoZSBEYXRhU291cmNlIGludGVyZmFjZSwgd2hpY2ggcHJvZHVjZQotICogQ29ubmVjdGlvbnMgd2l0aCBkaWZmZXJpbmcgY2hhcmFjdGVyaXN0aWNzOgorICogVGhlIHtAY29kZSBEYXRhU291cmNlfSBpbnRlcmZhY2UgaXMgdHlwaWNhbGx5IGltcGxlbWVudGVkIGJ5IHRoZSB3cml0ZXIgb2YgYQorICogSkRCQyBkcml2ZXIuIFRoZXJlIGFyZSB0aHJlZSB2YXJpYW50cyBvZiB0aGUge0Bjb2RlIERhdGFTb3VyY2V9IGludGVyZmFjZSwKKyAqIHdoaWNoIHByb2R1Y2UgY29ubmVjdGlvbnMgd2l0aCBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzOgorICogPC9wPgogICogPG9sPgotICogPGxpPlN0YW5kYXJkIERhdGFTb3VyY2UsIHdoaWNoIHByb2R1Y2VzIHN0YW5kYXJkIENvbm5lY3Rpb24gb2JqZWN0cyB3aXRoIG5vCi0gKiBzcGVjaWFsIGZlYXR1cmVzLjwvbGk+Ci0gKiA8bGk+Q29ubmVjdGlvbiBQb29sIERhdGFTb3VyY2UsIHdoaWNoIHByb2R1Y2VzIFBvb2xlZENvbm5lY3Rpb24gb2JqZWN0cwotICogd2hpY2ggYXJlIGFibGUgdG8gcGFydGljaXBhdGUgaW4gY29ubmVjdGlvbiBwb29saW5nLCB0eXBpY2FsbHkgaW52b2x2aW5nIGEKLSAqIGNvbm5lY3Rpb24gcG9vbGluZyBtYW5hZ2VyIGFzIGFuIGludGVybWVkaWFyeSBiZXR3ZWVuIGFwcGxpY2F0aW9ucyBhbmQgdGhlCi0gKiBkYXRhYmFzZS48L2xpPgotICogPGxpPkRpc3RyaWJ1dGVkIHRyYW5zYWN0aW9uIERhdGFTb3VyY2UgKCJYQURhdGFTb3VyY2UiKSwgd2hpY2ggcHJvZHVjZXMKLSAqIFhBQ29ubmVjdGlvbiBvYmplY3RzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGhhbmRsZSBkaXN0cmlidXRlZCB0cmFuc2FjdGlvbnMgYW5kCi0gKiB3aGljaCB0eXBpY2FsbHkgaW52b2x2ZSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIgY29tcG9uZW50IGluIHRoZSBzeXN0ZW0uCi0gKiBYQUNvbm5lY3Rpb24gb2JqZWN0cyBhbHNvIHR5cGljYWxseSBwcm92aWRlIGNvbm5lY3Rpb24gcG9vbGluZyBjYXBhYmlsaXRpZXMKLSAqIGFzIHdlbGwgYXMgZGlzdHJpYnV0ZWQgdHJhbnNhY3Rpb24gY2FwYWJpbGl0aWVzLiA8L2xpPgorICogPGxpPjxpPlN0YW5kYXJkIHtAY29kZSBEYXRhU291cmNlfTwvaT46IHByb2R1Y2VzIHN0YW5kYXJkIHtAY29kZSBDb25uZWN0aW9ufQorICogb2JqZWN0cyB3aXRoIG5vIHNwZWNpYWwgZmVhdHVyZXMuPC9saT4KKyAqIDxsaT48aT5Db25uZWN0aW9uIFBvb2wge0Bjb2RlIERhdGFTb3VyY2V9PC9pPjogcHJvZHVjZXMge0Bjb2RlCisgKiBQb29sZWRDb25uZWN0aW9ufSBvYmplY3RzIHdoaWNoIHJlcXVpcmUgYSBjb25uZWN0aW9uIHBvb2wgbWFuYWdlciBhcyBhbgorICogaW50ZXJtZWRpYXJ5IGNvbXBvbmVudC48L2xpPgorICogPGxpPjxpPkRpc3RyaWJ1dGVkIHRyYW5zYWN0aW9uIHtAY29kZSBEYXRhU291cmNlfSAoIlhBRGF0YVNvdXJjZSIpPC9pPjoKKyAqIHByb2R1Y2VzIHtAY29kZSBYQUNvbm5lY3Rpb259IG9iamVjdHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaGFuZGxlIGRpc3RyaWJ1dGVkCisgKiB0cmFuc2FjdGlvbnMgd2hpY2ggdHlwaWNhbGx5IHJlcXVpcmUgYW4gaW50ZXJtZWRpYXJ5IHRyYW5zYWN0aW9uIG1hbmFnZXIKKyAqIGNvbXBvbmVudC4ge0Bjb2RlIFhBQ29ubmVjdGlvbn0gb2JqZWN0cyBhbHNvIHByb3ZpZGUgY29ubmVjdGlvbiBwb29saW5nCisgKiBjYXBhYmlsaXRpZXMgYXMgd2VsbCBhcyBkaXN0cmlidXRlZCB0cmFuc2FjdGlvbiBjYXBhYmlsaXRpZXMuPC9saT4KICAqIDwvb2w+CiAgKiA8cD4KLSAqIE5vdGUgdGhhdCBhIEpEQkMgZHJpdmVyIHdoaWNoIGlzIGFjY2Vzc2VkIHZpYSB0aGUgRGF0YVNvdXJjZSBpbnRlcmZhY2UgaXMKLSAqIGxvYWRlZCB2aWEgYSBKTkRJIGxvb2t1cCBwcm9jZXNzLiBBIGRyaXZlciBsb2FkZWQgaW4gdGhpcyB3YXkgZG9lcyBub3QKLSAqIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSA8Y29kZT5Ecml2ZXJNYW5hZ2VyPC9jb2RlPi4KKyAqIE5vdGUgdGhhdCBhIEpEQkMgZHJpdmVyIHdoaWNoIGlzIGFjY2Vzc2VkIHZpYSB0aGUge0Bjb2RlIERhdGFTb3VyY2V9CisgKiBpbnRlcmZhY2UgaXMgbG9hZGVkIHZpYSBhIEpOREkgbG9va3VwIHByb2Nlc3MuIEEgZHJpdmVyIGxvYWRlZCBpbiB0aGlzIHdheQorICogZG9lcyBub3QgcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIHtAY29kZSBEcml2ZXJNYW5hZ2VyfS4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRGF0YVNvdXJjZSB7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBEYXRhU291cmNlLgorICAgICAqIENyZWF0ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZQorICAgICAqIERhdGFTb3VyY2V9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBDb25uZWN0aW9uIG9iamVjdCB3aGljaCBpcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ29ubmVjdGlvbn0gb2JqZWN0IHdoaWNoIGlzIGEgY29ubmVjdGlvbiB0byB0aGUKKyAgICAgKiAgICAgICAgIGRhdGFiYXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBEYXRhU291cmNlLAotICAgICAqIHVzaW5nIGEgc3VwcGxpZWQgVXNlcm5hbWUgYW5kIFBhc3N3b3JkLC4KKyAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUKKyAgICAgKiBEYXRhU291cmNlfSwgdXNpbmcgdGhlIHN1cHBsaWVkIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVVzZXJuYW1lCi0gICAgICogICAgICAgICAgICBhIFN0cmluZyBjb250YWluaW5nIGEgVXNlciBOYW1lIGZvciB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBhIHVzZXIgbmFtZSBmb3IgdGhlIGRhdGFiYXNlIGxvZ2luLgogICAgICAqIEBwYXJhbSB0aGVQYXNzd29yZAotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgUGFzc3dvcmQgZm9yIHRoZSB1c2VyIGlkZW50aWZpZWQgYnkKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRoZVVzZXJuYW1lPC9jb2RlPgotICAgICAqIEByZXR1cm4gYSBDb25uZWN0aW9uIG9iamVjdCB3aGljaCBpcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgorICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBpZGVudGlmaWVkIGJ5IHtAY29kZQorICAgICAqICAgICAgICAgICAgdGhlVXNlcm5hbWV9LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDb25uZWN0aW9ufSBvYmplY3Qgd2hpY2ggaXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlCisgICAgICogICAgICAgICBkYXRhYmFzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nIHRoZVVzZXJuYW1lLCBTdHJpbmcgdGhlUGFzc3dvcmQpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTG9naW4gVGltZW91dCB2YWx1ZSBmb3IgdGhpcyBEYXRhU291cmNlLiBUaGUgTG9naW4gVGltZW91dCBpcwotICAgICAqIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoZSBEYXRhU291cmNlIHdpbGwgd2FpdCB3aGVuIG9wZW5pbmcgYQotICAgICAqIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZS4gQSBUaW1lb3V0IHZhbHVlIG9mIDAgaW1wbGllcyBlaXRoZXIgdGhlIHN5c3RlbQotICAgICAqIGRlZmF1bHQgdGltZW91dCB2YWx1ZSAoaWYgdGhlcmUgaXMgb25lKSBvciB0aGF0IHRoZXJlIGlzIG5vIHRpbWVvdXQuIFRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBMb2dpbiBUaW1lb3V0IGlzIDAuCisgICAgICogR2V0cyB0aGUgbG9naW4gdGltZW91dCB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgRGF0YVNvdXJjZX0uIFRoZSBsb2dpbgorICAgICAqIHRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgdGhlIHtAY29kZSBEYXRhU291cmNlfSB3aWxsCisgICAgICogd2FpdCB3aGVuIG9wZW5pbmcgYSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UuIEEgdGltZW91dCB2YWx1ZSBvZiAwCisgICAgICogaW1wbGllcyBlaXRoZXIgdGhlIHN5c3RlbSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgKGlmIHRoZXJlIGlzIG9uZSkgb3IgdGhhdAorICAgICAqIHRoZXJlIGlzIG5vIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9naW4gdGltZW91dCBpcyAwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIExvZ2luIFRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2dpbiB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExvZ2luVGltZW91dCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBMb2cgV3JpdGVyIGZvciB0aGlzIERhdGFTb3VyY2UuCisgICAgICogR2V0cyB0aGUgbG9nIHdyaXRlciBmb3IgdGhpcyB7QGNvZGUgRGF0YVNvdXJjZX0uCiAgICAgICogPHA+Ci0gICAgICogVGhlIExvZyBXcml0ZXIgaXMgYSBzdHJlYW0gdG8gd2hpY2ggYWxsIGxvZyBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQKLSAgICAgKiBmcm9tIHRoaXMgRGF0YVNvdXJjZS4gVGhlIExvZyBXcml0ZXIgY2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2UsIGxvZyBhbmQKLSAgICAgKiB0cmFjZSBjYXB0dXJlIGlzIGRpc2FibGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIExvZyBXcml0ZXIgd2hlbiBhbgotICAgICAqIERhdGFTb3VyY2UgaXMgY3JlYXRlZCBpcyBudWxsLiBOb3RlIHRoYXQgdGhlIExvZyBXcml0ZXIgZm9yIGFuIERhdGFTb3VyY2UKLSAgICAgKiBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIExvZyBXcml0ZXIgdXNlZCBieSBhIDxjb2RlPkRyaXZlck1hbmFnZXI8L2NvZGU+LgorICAgICAqIFRoZSBsb2cgd3JpdGVyIGlzIGEgc3RyZWFtIHRvIHdoaWNoIGFsbCBsb2cgYW5kIHRyYWNlIG1lc3NhZ2VzIGFyZSBzZW50CisgICAgICogZnJvbSB0aGlzIHtAY29kZSBEYXRhU291cmNlfS4gVGhlIGxvZyB3cml0ZXIgY2FuIGJlIHtAY29kZSBudWxsfSwgaW4KKyAgICAgKiB3aGljaCBjYXNlLCBsb2cgYW5kIHRyYWNlIGNhcHR1cmUgaXMgZGlzYWJsZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKKyAgICAgKiBsb2cgd3JpdGVyIHdoZW4gYW4ge0Bjb2RlIERhdGFTb3VyY2V9IGlzIGNyZWF0ZWQgaXMge0Bjb2RlIG51bGx9LiBOb3RlCisgICAgICogdGhhdCB0aGUgbG9nIHdyaXRlciBmb3IgYSB7QGNvZGUgRGF0YVNvdXJjZX0gaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBsb2cKKyAgICAgKiB3cml0ZXIgdXNlZCBieSBhIHtAY29kZSBEcml2ZXJNYW5hZ2VyfS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiBhIFByaW50V3JpdGVyIHdoaWNoIGlzIHRoZSBMb2cgV3JpdGVyIGZvciB0aGlzIERhdGFTb3VyY2UuIENhbiBiZQotICAgICAqICAgICAgICAgbnVsbCwgaW4gd2hpY2ggY2FzZSBsb2cgd3JpdGluZyBpcyBkaXNhYmxlZCBmb3IgdGhpcyBEYXRhU291cmNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgUHJpbnRXcml0ZXJ9IHdoaWNoIGlzIHRoZSBsb2cgd3JpdGVyIGZvciB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgRGF0YVNvdXJjZX0uIENhbiBiZSB7QGNvZGUgbnVsbH0sIGluIHdoaWNoIGNhc2UgbG9nIHdyaXRpbmcgaXMKKyAgICAgKiAgICAgICAgIGRpc2FibGVkIGZvciB0aGlzIHtAY29kZSBEYXRhU291cmNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRMb2dXcml0ZXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgTG9naW4gVGltZW91dCB2YWx1ZSBmb3IgdGhpcyBEYXRhU291cmNlLiBUaGUgTG9naW4gVGltZW91dCBpcwotICAgICAqIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoZSBEYXRhU291cmNlIHdpbGwgd2FpdCB3aGVuIG9wZW5pbmcgYQotICAgICAqIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZS4gQSBUaW1lb3V0IHZhbHVlIG9mIDAgaW1wbGllcyBlaXRoZXIgdGhlIHN5c3RlbQotICAgICAqIGRlZmF1bHQgdGltZW91dCB2YWx1ZSAoaWYgdGhlcmUgaXMgb25lKSBvciB0aGF0IHRoZXJlIGlzIG5vIHRpbWVvdXQuIFRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBMb2dpbiBUaW1lb3V0IGlzIDAuCisgICAgICogU2V0cyB0aGUgbG9naW4gdGltZW91dCB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgRGF0YVNvdXJjZX0uIFRoZSBsb2dpbgorICAgICAqIHRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgdGhlIHtAY29kZSBEYXRhU291cmNlfSB3aWxsCisgICAgICogd2FpdCB3aGVuIG9wZW5pbmcgYSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UuIEEgdGltZW91dCB2YWx1ZSBvZiAwCisgICAgICogaW1wbGllcyBlaXRoZXIgdGhlIHN5c3RlbSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgKGlmIHRoZXJlIGlzIG9uZSkgb3IgdGhhdAorICAgICAqIHRoZXJlIGlzIG5vIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9naW4gdGltZW91dCBpcyAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVUaW1lb3V0Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IExvZ2luIFRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbG9naW4gdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9naW5UaW1lb3V0KGludCB0aGVUaW1lb3V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgTG9nIFdyaXRlciBmb3IgdGhpcyBEYXRhU291cmNlLgorICAgICAqIFNldHMgdGhlIGxvZyB3cml0ZXIgZm9yIHRoaXMge0Bjb2RlIERhdGFTb3VyY2V9LgogICAgICAqIDxwPgotICAgICAqIFRoZSBMb2cgV3JpdGVyIGlzIGEgc3RyZWFtIHRvIHdoaWNoIGFsbCBsb2cgYW5kIHRyYWNlIG1lc3NhZ2VzIGFyZSBzZW50Ci0gICAgICogZnJvbSB0aGlzIERhdGFTb3VyY2UuIFRoZSBMb2cgV3JpdGVyIGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlLCBsb2cgYW5kCi0gICAgICogdHJhY2UgY2FwdHVyZSBpcyBkaXNhYmxlZC4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBMb2cgV3JpdGVyIHdoZW4gYW4KLSAgICAgKiBEYXRhU291cmNlIGlzIGNyZWF0ZWQgaXMgbnVsbC4gTm90ZSB0aGF0IHRoZSBMb2cgV3JpdGVyIGZvciBhbiBEYXRhU291cmNlCi0gICAgICogaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBMb2cgV3JpdGVyIHVzZWQgYnkgYSA8Y29kZT5Ecml2ZXJNYW5hZ2VyPC9jb2RlPi4KKyAgICAgKiBUaGUgbG9nIHdyaXRlciBpcyBhIHN0cmVhbSB0byB3aGljaCBhbGwgbG9nIGFuZCB0cmFjZSBtZXNzYWdlcyBhcmUgc2VudAorICAgICAqIGZyb20gdGhpcyB7QGNvZGUgRGF0YVNvdXJjZX0uIFRoZSBsb2cgd3JpdGVyIGNhbiBiZSB7QGNvZGUgbnVsbH0sIGluCisgICAgICogd2hpY2ggY2FzZSwgbG9nIGFuZCB0cmFjZSBjYXB0dXJlIGlzIGRpc2FibGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisgICAgICogbG9nIHdyaXRlciB3aGVuIGEge0Bjb2RlIERhdGFTb3VyY2V9IGlzIGNyZWF0ZWQgaXMge0Bjb2RlIG51bGx9LiBOb3RlCisgICAgICogdGhhdCB0aGUgbG9nIHdyaXRlciBmb3IgYSB7QGNvZGUgRGF0YVNvdXJjZX0gaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBsb2cKKyAgICAgKiB3cml0ZXIgdXNlZCBieSBhIHtAY29kZSBEcml2ZXJNYW5hZ2VyfS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVdyaXRlcgotICAgICAqICAgICAgICAgICAgYSBQcmludFdyaXRlciB0byB1c2UgYXMgdGhlIExvZyBXcml0ZXIgZm9yIHRoaXMgRGF0YVNvdXJjZS4KKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIFByaW50V3JpdGVyfSB0byB1c2UgYXMgdGhlIGxvZyB3cml0ZXIgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBEYXRhU291cmNlfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvZ1dyaXRlcihQcmludFdyaXRlciB0aGVXcml0ZXIpIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUG9vbGVkQ29ubmVjdGlvbi5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL1Bvb2xlZENvbm5lY3Rpb24uamF2YQppbmRleCA1MGY3YWU5Li5iNGM1NjE2IDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUG9vbGVkQ29ubmVjdGlvbi5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Qb29sZWRDb25uZWN0aW9uLmphdmEKQEAgLTI0LDg3ICsyNCw5OSBAQAogICogQW4gaW50ZXJmYWNlIHdoaWNoIHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIGhhbmRsaW5nIGNvbm5lY3Rpb25zIHRvIGEgZGF0YWJhc2UKICAqIHdoaWNoIGFyZSBwb29sZWQuCiAgKiA8cD4KLSAqIFR5cGljYWxseSwgYSBQb29sZWRDb25uZWN0aW9uIGlzIHJlY3ljbGVkIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGJ5IGFuCi0gKiBhcHBsaWNhdGlvbiwgcmF0aGVyIHRoYW4gYmVpbmcgY2xvc2VkIGFuZCBkaXNjYXJkZWQuIFRoZSByZWFzb24gZm9yIHRyZWF0aW5nCi0gKiBjb25uZWN0aW9ucyBpbiB0aGlzIHdheSBpcyB0aGF0IGl0IGNhbiBiZSBhbiBleHBlbnNpdmUgcHJvY2VzcyBib3RoIHRvCi0gKiBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UgYW5kIHRvIGRlc3Ryb3kgdGhlIGNvbm5lY3Rpb24uIFJldXNpbmcKLSAqIGNvbm5lY3Rpb25zIHRocm91Z2ggYSBwb29sIGlzIGEgd2F5IG9mIGltcHJvdmluZyBzeXN0ZW0gcGVyZm9ybWFuY2UgYW5kCi0gKiByZWR1Y2luZyBvdmVyaGVhZC4KKyAqIFR5cGljYWxseSwgYSB7QGNvZGUgUG9vbGVkQ29ubmVjdGlvbn0gaXMgcmVjeWNsZWQgd2hlbiBpdCBpcyBubyBsb25nZXIKKyAqIHJlcXVpcmVkIGJ5IGFuIGFwcGxpY2F0aW9uLCByYXRoZXIgdGhhbiBiZWluZyBjbG9zZWQgYW5kIGRpc2NhcmRlZC4gVGhlCisgKiByZWFzb24gZm9yIHRyZWF0aW5nIGNvbm5lY3Rpb25zIGluIHRoaXMgd2F5IGlzIHRoYXQgaXQgY2FuIGJlIGFuIGV4cGVuc2l2ZQorICogcHJvY2VzcyBib3RoIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSBhbmQgdG8gZGVzdHJveSB0aGUKKyAqIGNvbm5lY3Rpb24uIFJldXNpbmcgY29ubmVjdGlvbnMgdGhyb3VnaCBhIHBvb2wgaXMgYSB3YXkgb2YgaW1wcm92aW5nIHN5c3RlbQorICogcGVyZm9ybWFuY2UgYW5kIHJlZHVjaW5nIG92ZXJoZWFkLgorICogPC9wPgogICogPHA+Ci0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdGhhdCBhbiBhcHBsaWNhdGlvbiB1c2UgdGhlIFBvb2xlZENvbm5lY3Rpb24gaW50ZXJmYWNlCi0gKiBkaXJlY3RseS4gVGhlIFBvb2xlZENvbm5lY3Rpb24gaW50ZXJmYWNlIGlzIGludGVuZGVkIGZvciB1c2UgYnkgYSBjb21wb25lbnQKLSAqIGNhbGxlZCBhIENvbm5lY3Rpb24gUG9vbCBNYW5hZ2VyLCB0eXBpY2FsbHkgcGFydCBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAotICogc3VwcG9ydHMgdXNlIG9mIHRoZSBkYXRhYmFzZSBieSBhcHBsaWNhdGlvbnMuCisgKiBJdCBpcyBub3QgaW50ZW5kZWQgdGhhdCBhbiBhcHBsaWNhdGlvbiB1c2VzIHRoZSB7QGNvZGUgUG9vbGVkQ29ubmVjdGlvbn0KKyAqIGludGVyZmFjZSBkaXJlY3RseS4gVGhlIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufSBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgZm9yCisgKiB1c2UgYnkgYSBjb21wb25lbnQgY2FsbGVkIGEgY29ubmVjdGlvbiBwb29sIG1hbmFnZXIsIHR5cGljYWxseSBwYXJ0IG9mIHRoZQorICogaW5mcmFzdHJ1Y3R1cmUgdGhhdCBzdXBwb3J0cyB1c2Ugb2YgdGhlIGRhdGFiYXNlIGJ5IGFwcGxpY2F0aW9ucy4KKyAqIDwvcD4KICAqIDxwPgogICogQXBwbGljYXRpb25zIG9idGFpbiBjb25uZWN0aW9ucyB0byB0aGUgZGF0YWJhc2UgYnkgY2FsbGluZyB0aGUKLSAqIDxjb2RlPkRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbjwvY29kZT4gbWV0aG9kLiBVbmRlciB0aGUgY292ZXJzLCB0aGUKLSAqIENvbm5lY3Rpb24gUG9vbCBNYW5hZ2VyIHdpbGwgZ2V0IGEgUG9vbGVkQ29ubmVjdGlvbiBvYmplY3QgZnJvbSBpdHMKLSAqIGNvbm5lY3Rpb24gcG9vbCBhbmQgcGFzc2VzIGJhY2sgYSBDb25uZWN0aW9uIG9iamVjdCB0aGF0IHdyYXBzIG9yIHJlZmVyZW5jZXMKLSAqIHRoZSBQb29sZWRDb25uZWN0aW9uIG9iamVjdC4gQSBuZXcgUG9vbGVkQ29ubmVjdGlvbiBvYmplY3Qgd2lsbCBvbmx5IGJlCisgKiB7QGxpbmsgRGF0YVNvdXJjZSNnZXRDb25uZWN0aW9ufSBtZXRob2QuIEJlaGluZCB0aGUgc2NlbmVzLCB0aGUgY29ubmVjdGlvbgorICogcG9vbCBtYW5hZ2VyIHdpbGwgZ2V0IGEge0Bjb2RlIFBvb2xlZENvbm5lY3Rpb259IG9iamVjdCBmcm9tIGl0cyBjb25uZWN0aW9uCisgKiBwb29sIGFuZCBwYXNzZXMgYmFjayBhIGNvbm5lY3Rpb24gb2JqZWN0IHRoYXQgd3JhcHMgb3IgcmVmZXJlbmNlcyB0aGUge0Bjb2RlCisgKiBQb29sZWRDb25uZWN0aW9ufSBvYmplY3QuIEEgbmV3IHtAY29kZSBQb29sZWRDb25uZWN0aW9ufSBvYmplY3Qgd2lsbCBvbmx5IGJlCiAgKiBjcmVhdGVkIGlmIHRoZSBwb29sIGlzIGVtcHR5LgorICogPC9wPgogICogPHA+Ci0gKiBXaGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBmaW5pc2hlZCB1c2luZyBhIFBvb2xlZENvbm5lY3Rpb24sIHRoZSBhcHBsaWNhdGlvbgotICogY2FsbHMgdGhlIDxjb2RlPkNvbm5lY3Rpb24uY2xvc2U8L2NvZGU+IG1ldGhvZC4gVGhlIENvbm5lY3Rpb24gUG9vbCBNYW5hZ2VyCi0gKiBpcyBub3RpZmllZCB2aWEgYSBDb25uZWN0aW9uRXZlbnQgZnJvbSB0aGUgQ29ubmVjdGlvbiB0aGF0IHRoaXMgaGFzIGhhcHBlbmVkCi0gKiAodGhlIFBvb2wgTWFuYWdlciByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIENvbm5lY3Rpb24gYmVmb3JlIHRoZSBDb25uZWN0aW9uCi0gKiBpcyBnaXZlbiB0byB0aGUgYXBwbGljYXRpb24pLiBUaGUgUG9vbCBNYW5hZ2VyIHJlbW92ZXMgdGhlIHVuZGVybHlpbmcKLSAqIFBvb2xlZENvbm5lY3Rpb24gb2JqZWN0IGZyb20gdGhlIENvbm5lY3Rpb24gYW5kIHJldHVybnMgaXQgdG8gdGhlIHBvb2wgZm9yCi0gKiByZXVzZSAtIHRoZSBQb29sZWRDb25uZWN0aW9uIGlzIHRodXMgcmVjeWNsZWQgcmF0aGVyIHRoYW4gYmVpbmcgZGVzdHJveWVkLgorICogV2hlbiB0aGUgYXBwbGljYXRpb24gaXMgZmluaXNoZWQgdXNpbmcgYSB7QGNvZGUgUG9vbGVkQ29ubmVjdGlvbn0sIHRoZQorICogYXBwbGljYXRpb24gY2FsbHMgdGhlIHtAbGluayBDb25uZWN0aW9uI2Nsb3NlfSBtZXRob2QuIFRoZSBjb25uZWN0aW9uIHBvb2wKKyAqIG1hbmFnZXIgaXMgbm90aWZpZWQgdmlhIGEge0BsaW5rIENvbm5lY3Rpb25FdmVudH0gZnJvbSB0aGUgY29ubmVjdGlvbiB0aGF0CisgKiB0aGlzIGhhcyBoYXBwZW5lZCAodGhlIHBvb2wgbWFuYWdlciByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIGNvbm5lY3Rpb24KKyAqIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBnaXZlbiB0byB0aGUgYXBwbGljYXRpb24pLiBUaGUgcG9vbCBtYW5hZ2VyIHJlbW92ZXMKKyAqIHRoZSB1bmRlcmx5aW5nIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufSBvYmplY3QgZnJvbSB0aGUgY29ubmVjdGlvbiBhbmQKKyAqIHJldHVybnMgaXQgdG8gdGhlIHBvb2wgZm9yIHJldXNlIC0gdGhlIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufSBpcyB0aHVzCisgKiByZWN5Y2xlZCByYXRoZXIgdGhhbiBiZWluZyBkZXN0cm95ZWQuCisgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSByZXByZXNlbnRlZCBieSB0aGUgUG9vbGVkQ29ubmVjdGlvbiBpcyBrZXB0Ci0gKiBvcGVuIHVudGlsIHRoZSBQb29sZWRDb25uZWN0aW9uIG9iamVjdCBpdHNlbGYgaXMgZGVhY3RpdmF0ZWQgYnkgdGhlCi0gKiBDb25uZWN0aW9uIFBvb2wgTWFuYWdlciwgd2hpY2ggY2FsbHMgdGhlIDxjb2RlPlBvb2xlZENvbm5lY3Rpb24uY2xvc2U8L2NvZGU+Ci0gKiBtZXRob2QuIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGluYWN0aXZlIGNvbm5lY3Rpb25zIGluCi0gKiB0aGUgcG9vbCwgaWYgdGhlIFBvb2xlZENvbm5lY3Rpb24gZW5jb3VudGVycyBhIHByb2JsZW0gdGhhdCBtYWtlcyBpdCB1bnVzYWJsZQotICogb3IgaWYgdGhlIHdob2xlIHN5c3RlbSBpcyBiZWluZyBzaHV0IGRvd24uCisgKiBUaGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgcmVwcmVzZW50ZWQgYnkgdGhlIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufSBpcworICoga2VwdCBvcGVuIHVudGlsIHRoZSB7QGNvZGUgUG9vbGVkQ29ubmVjdGlvbn0gb2JqZWN0IGl0c2VsZiBpcyBkZWFjdGl2YXRlZCBieQorICogdGhlIGNvbm5lY3Rpb24gcG9vbCBtYW5hZ2VyLCB3aGljaCBjYWxscyB7QGNvZGUgUG9vbGVkQ29ubmVjdGlvbi5jbG9zZSgpfS4KKyAqIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGluYWN0aXZlIGNvbm5lY3Rpb25zIGluIHRoZQorICogcG9vbCwgaWYgdGhlIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufSBlbmNvdW50ZXJzIGEgcHJvYmxlbSB0aGF0IG1ha2VzIGl0CisgKiB1bnVzYWJsZSBvciBpZiB0aGUgd2hvbGUgc3lzdGVtIGlzIGJlaW5nIHNodXQgZG93bi4KKyAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUG9vbGVkQ29ubmVjdGlvbiB7CiAKICAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIHN1cHBsaWVkIENvbm5lY3Rpb25FdmVudExpc3RlbmVyIHdpdGggdGhpcwotICAgICAqIFBvb2xlZENvbm5lY3Rpb24uIE9uY2UgcmVnaXN0ZXJlZCwgdGhlIENvbm5lY3Rpb25FdmVudExpc3RlbmVyIHdpbGwKLSAgICAgKiByZWNlaXZlIENvbm5lY3Rpb25FdmVudCBldmVudHMgd2hlbiB0aGV5IG9jY3VyIGluIHRoZSBQb29sZWRDb25uZWN0aW9uLgorICAgICAqIFJlZ2lzdGVycyB0aGUgc3VwcGxpZWQge0Bjb2RlIENvbm5lY3Rpb25FdmVudExpc3RlbmVyfSB3aXRoIHRoaXMge0Bjb2RlCisgICAgICogUG9vbGVkQ29ubmVjdGlvbn0uIE9uY2UgcmVnaXN0ZXJlZCwgdGhlIHtAY29kZSBDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcn0KKyAgICAgKiB3aWxsIHJlY2VpdmUge0BsaW5rIENvbm5lY3Rpb25FdmVudH0gZXZlbnRzIHdoZW4gdGhleSBvY2N1ciBpbiB0aGUKKyAgICAgKiB7QGNvZGUgUG9vbGVkQ29ubmVjdGlvbn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUxpc3RlbmVyCi0gICAgICogICAgICAgICAgICBhbiBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSB7QGNvZGUgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXJ9CiAgICAgICogICAgICAgICAgICBpbnRlcmZhY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIoQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIgdGhlTGlzdGVuZXIpOwogCiAgICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBoZWxkIGJ5IHRoaXMgUG9vbGVkQ29ubmVjdGlvbi4gVGhpcwotICAgICAqIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBhcHBsaWNhdGlvbiBjb2RlIC0gaXQgaXMgaW50ZW5kZWQKLSAgICAgKiBmb3IgdXNlIGJ5IHRoZSBDb25uZWN0aW9uIFBvb2wgbWFuYWdlciBjb21wb25lbnQuCisgICAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBoZWxkIGJ5IHRoaXMge0Bjb2RlCisgICAgICogUG9vbGVkQ29ubmVjdGlvbn0uIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5CisgICAgICogYXBwbGljYXRpb24gY29kZSAtIGl0IGlzIGludGVuZGVkIG9ubHkgZm9yIHRoZSBjb25uZWN0aW9uIHBvb2wgbWFuYWdlcgorICAgICAqIGNvbXBvbmVudC4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZS4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCBieQotICAgICAqIHRoZSBDb25uZWN0aW9uIFBvb2wgbWFuYWdlciB3aGVuIGFuIGFwcGxpY2F0aW9uIGludm9rZXMgdGhlIG1ldGhvZAotICAgICAqIDxjb2RlPkRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbjwvY29kZT4gYW5kIHRoZXJlIGFyZSBubyBQb29sZWRDb25uZWN0aW9uCi0gICAgICogb2JqZWN0cyBhdmFpbGFibGUgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbC4KKyAgICAgKiB0aGUgY29ubmVjdGlvbiBwb29sIG1hbmFnZXIgd2hlbiBhbiBhcHBsaWNhdGlvbiBpbnZva2VzIHRoZSBtZXRob2QKKyAgICAgKiB7QGNvZGUgRGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCl9IGFuZCB0aGVyZSBhcmUgbm8ge0Bjb2RlCisgICAgICogUG9vbGVkQ29ubmVjdGlvbn0gb2JqZWN0cyBhdmFpbGFibGUgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgQ29ubmVjdGlvbiBvYmplY3QgdGhhdCBpcyBhIGhhbmRsZSB0byB0aGlzIFBvb2xlZENvbm5lY3Rpb24KLSAgICAgKiAgICAgICAgIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIENvbm5lY3Rpb259IG9iamVjdC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRGVyZWdpc3RlciB0aGUgc3VwcGxpZWQgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIgZnJvbSB0aGlzCi0gICAgICogUG9vbGVkQ29ubmVjdGlvbi4gT25jZSBkZXJlZ2lzdGVyZWQsIHRoZSBDb25uZWN0aW9uRXZlbnRMaXN0ZW5lciB3aWxsIG5vdAotICAgICAqIGxvbmdlciByZWNlaXZlIGV2ZW50cyBvY2N1cnJpbmcgaW4gdGhlIFBvb2xlZENvbm5lY3Rpb24uCisgICAgICogVW5yZWdpc3RlcnMgdGhlIHN1cHBsaWVkIHtAY29kZSBDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcn0gZnJvbSB0aGlzIHtAY29kZQorICAgICAqIFBvb2xlZENvbm5lY3Rpb259LiBPbmNlIHVucmVnaXN0ZXJlZCwgdGhlIHtAY29kZSBDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcn0KKyAgICAgKiB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGV2ZW50cyBvY2N1cnJpbmcgaW4gdGhlIHtAY29kZSBQb29sZWRDb25uZWN0aW9ufS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlTGlzdGVuZXIKLSAgICAgKiAgICAgICAgICAgIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlIHtAY29kZSBDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcn0KICAgICAgKiAgICAgICAgICAgIGludGVyZmFjZS4gVGhpcyBvYmplY3Qgc2hvdWxkIGhhdmUgcHJldmlvdXNseSBiZWVuIHJlZ2lzdGVyZWQKLSAgICAgKiAgICAgICAgICAgIHdpdGggdGhlIFBvb2xlZENvbm5lY3Rpb24gdXNpbmcgdGhlCi0gICAgICogICAgICAgICAgICA8Y29kZT5hZGRDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcjwvY29kZT4gbWV0aG9kLgorICAgICAqICAgICAgICAgICAgd2l0aCB0aGUge0Bjb2RlIFBvb2xlZENvbm5lY3Rpb259IHVzaW5nIHRoZSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGFkZENvbm5lY3Rpb25FdmVudExpc3RlbmVyfSBtZXRob2QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAgICBDb25uZWN0aW9uRXZlbnRMaXN0ZW5lciB0aGVMaXN0ZW5lcik7CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0LmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0LmphdmEKaW5kZXggMjc5NGZmMi4uNGVkYzNkMyAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL1Jvd1NldC5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXQuamF2YQpAQCAtMzMsODI0ICszMyw5NTMgQEAKIGltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKIAogLyoqCi0gKiBBIFJvd1NldCBpcyBhbiBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIGRhdGEgYmVpbmcgc2VudCBmcm9tL3RvIGEKLSAqIGRhdGFiYXNlIGFuZCB3aGljaCBleHRlbmRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFJlc3VsdFNldCBpbnRvIGEgZm9ybSB0aGF0Ci0gKiBjYW4gYmUgdXNlZCBhcyBhIEphdmFCZWFucyBjb21wb25lbnQsIHBlcmhhcHMgYmVpbmcgdXNlZCBpbiBhIHZpc3VhbAotICogcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQuCisgKiBBbiBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgbWVhbnMgdG8gYWNjZXNzIGRhdGEgd2hpY2gKKyAqIHBlcnNpc3RzIG9uIGEgZGF0YWJhc2UuIEl0IGV4dGVuZHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YKKyAqIHtAbGluayBqYXZhLnNxbC5SZXN1bHRTZXQgUmVzdWx0U2V0fSBpbnRvIGEgZm9ybSB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGEKKyAqIEphdmFCZWFuIGNvbXBvbmVudCwgc3VpdGVkIGZvciBhIHZpc3VhbCBwcm9ncmFtbWluZyBlbnZpcm9ubWVudC4KICAqIDxwPgotICogRmFjaWxpdGllcyBhcmUgcHJvdmlkZWQgZm9yIGdldC9zZXQgb2YgcHJvcGVydGllcyByZWxhdGluZyB0byB0aGUgRGF0YWJhc2UKLSAqIGFuZCB0aGUgU1FMIENvbW1hbmQgYW5kIGZvciBnZXR0aW5nL3NldHRpbmcgZGF0YSB3aXRoaW4gdGhlIFJvd3MgcmVwcmVzZW50ZWQKLSAqIGJ5IHRoZSBSb3dTZXQuIFRoZSBSb3dTZXQgc3VwcG9ydHMgSmF2YUJlYW5zIGV2ZW50cyBzbyB0aGF0IG90aGVyIGNvbXBvbmVudHMKLSAqIGluIGFuIGFwcGxpY2F0aW9uIGNhbiBiZSBpbmZvcm1lZCB3aGVuIHZhcmlvdXMgY2hhbmdlcyBoYXBwZW4gdG8gdGhlIFJvd1NldCwKLSAqIHN1Y2ggYXMgY2hhbmdlcyBpbiBkYXRhIHZhbHVlcy4KKyAqIHtAY29kZSBSb3dTZXR9IHByb3ZpZGVzIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIHByb3BlcnRpZXMgcmVsYXRpbmcgdG8gdGhlCisgKiBnZW5lcmFsIGRhdGFiYXNlIGVudmlyb25tZW50IHRvZ2V0aGVyIHdpdGggdGhlIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yCisgKiBkaXN0aW5jdCBkYXRhIHZhbHVlcyB3aGljaCBjb25zdGl0dXRlIHRoZSByb3cgc2V0LiBUaGUge0Bjb2RlIFJvd1NldH0gY2xhc3MKKyAqIHN1cHBvcnRzIEphdmFCZWFuIGV2ZW50cyBzbyB0aGF0IG90aGVyIGNvbXBvbmVudHMgaW4gYW4gYXBwbGljYXRpb24gY2FuIGJlCisgKiBpbmZvcm1lZCB3aGVuIGNoYW5nZXMgaGFwcGVuIHN1Y2ggYXMgY2hhbmdlcyBpbiBkYXRhIHZhbHVlcy4KKyAqIDwvcD4KICAqIDxwPgotICogUm93U2V0IGlzIGltcGxlbWVudGVkIGFzIGEgbGF5ZXIgb24gdG9wIG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIEpEQkMgQVBJLiBBCi0gKiBSb3dTZXQgbWF5IGJlIDxpPmNvbm5lY3RlZDwvaT4gd2hlcmUgaXQgbWFpbnRhaW5zIGEgY29ubmVjdGlvbiB0byB0aGUKLSAqIGRhdGFiYXNlIHRocm91Z2hvdXQgaXRzIGxpZmVjeWNsZS4gQSBSb3dTZXQgbWF5IGJlIDxpPmRpc2Nvbm5lY3RlZDwvaT4gd2hlcmUKLSAqIGl0IGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UsIGdldHMgZGF0YSBhbmQgdGhlbiBjbG9zZXMgdGhlCi0gKiBjb25uZWN0aW9uLiBVcGRhdGVzIHRvIGEgZGlzY29ubmVjdGVkIFJvd1NldCBjYW4gYmUgbWFkZSBhbmQgbGF0ZXIgc2VuZCBiYWNrCi0gKiB0aGUgY2hhbmdlcyB0byB0aGUgZGF0YWJhc2UsIGJ1dCB0aGlzIHJlcXVpcmVzIHRoZSBSb3dTZXQgdG8gZmlyc3QgcmVjb25uZWN0Ci0gKiB0byB0aGUgZGF0YWJhc2UgYmVmb3JlIHRoZSBjaGFuZ2VzIGFyZSBzZW50IGJhY2suCisgKiB7QGNvZGUgUm93U2V0fSBpcyBhIGZhY2lsaXR5IGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSBKREJDCisgKiBBUEkuIEl0IG1heSBiZSA8aT5jb25uZWN0ZWQ8L2k+LCBtYWludGFpbmluZyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlCisgKiB0aHJvdWdob3V0IGl0cyBsaWZlY3ljbGUuIFRoZSBjaGFuZ2VzIG1hZGUgb24gYSA8aT5kaXNjb25uZWN0ZWQ8L2k+IHtAY29kZQorICogUm93U2V0fSBvbiB0aGUgb3RoZXIgaGFuZCBjYW4gYmUgcGVyc2lzdGVkIG9ubHkgZXN0YWJsaXNoaW5nIGEgbmV3IGNvbm5lY3Rpb24KKyAqIHdpdGggdGhlIGRhdGFiYXNlIGVhY2ggdGltZS4KKyAqIDwvcD4KICAqIDxwPgotICogRGlzY29ubmVjdGVkIFJvd1NldHMgbWF5IG1ha2UgdXNlIG9mIFJvd1NldFJlYWRlcnMgdG8gcG9wdWxhdGUgdGhlIFJvd1NldAotICogd2l0aCBkYXRhLCBwb3NzaWJseSBmcm9tIGEgbm9uLXJlbGF0aW9uYWwgZGF0YWJhc2Ugc291cmNlLiBEaXNjb25uZWN0ZWQKLSAqIFJvd1NldHMgbWF5IGFsc28gdXNlIFJvd1NldFdyaXRlcnMgdG8gc2VuZCBkYXRhIGJhY2sgdG8gdGhlIHVuZGVybHlpbmcgZGF0YQotICogc3RvcmUuIFRoZXJlIGlzIGNvbnNpZGVyYWJsZSBmcmVlZG9tIGluIHRoZSB3YXkgdGhhdCBSb3dTZXRSZWFkZXJzIGFuZAotICogUm93U2V0V3JpdGVycyBhcmUgaW1wbGVtZW50ZWQgdG8gZ2V0IGFuZCBzdG9yZSBkYXRhLgorICogRGlzY29ubmVjdGVkIHtAY29kZSBSb3dTZXRzfSBtYWtlIHVzZSBvZiB7QGNvZGUgUm93U2V0UmVhZGVyc30gdG8gcG9wdWxhdGUKKyAqIHRoZSB7QGNvZGUgUm93U2V0fSB3aXRoIGRhdGEsIHBvc3NpYmx5IGZyb20gYSBub24tcmVsYXRpb25hbCBkYXRhYmFzZSBzb3VyY2UuCisgKiBUaGV5IG1heSBhbHNvIHVzZSB7QGNvZGUgUm93U2V0V3JpdGVyc30gdG8gc2VuZCBkYXRhIGJhY2sgdG8gdGhlIHVuZGVybHlpbmcKKyAqIGRhdGEgc3RvcmUuIFRoZXJlIGlzIGNvbnNpZGVyYWJsZSBmcmVlZG9tIGluIHRoZSB3YXkgdGhhdCB7QGNvZGUKKyAqIFJvd1NldFJlYWRlcnN9IGFuZCB7QGNvZGUgUm93U2V0V3JpdGVyc30gbWF5IGJlIGltcGxlbWVudGVkIHRvIHJldHJpZXZlIGFuZAorICogc3RvcmUgZGF0YS4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBSb3dTZXRSZWFkZXIKKyAqIEBzZWUgUm93U2V0V3JpdGVyCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSb3dTZXQgZXh0ZW5kcyBSZXN1bHRTZXQgewogCiAgICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgc3VwcGxpZWQgUm93U2V0TGlzdGVuZXIgd2l0aCB0aGlzIFJvd1NldC4gT25jZSByZWdpc3RlcmVkLAotICAgICAqIHRoZSBSb3dTZXRMaXN0ZW5lciBpcyBub3RpZmllZCBvZiBldmVudHMgZ2VuZXJhdGVkIGJ5IHRoZSBSb3dTZXQuCisgICAgICogUmVnaXN0ZXJzIHRoZSBzdXBwbGllZCB7QGxpbmsgUm93U2V0TGlzdGVuZXJ9IHdpdGggdGhpcyB7QGNvZGUgUm93U2V0fS4KKyAgICAgKiBPbmNlIHJlZ2lzdGVyZWQsIHRoZSB7QGxpbmsgUm93U2V0TGlzdGVuZXJ9IGlzIG5vdGlmaWVkIG9mIGV2ZW50cworICAgICAqIGdlbmVyYXRlZCBieSB0aGUge0Bjb2RlIFJvd1NldH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUxpc3RlbmVyCi0gICAgICogICAgICAgICAgICBhbiBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgPGNvZGU+cm93U2V0TGlzdGVuZXI8L2NvZGU+CisgICAgICogICAgICAgICAgICBhbiBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUge0Bjb2RlIHJvd1NldExpc3RlbmVyfQogICAgICAqICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFJvd1NldExpc3RlbmVyKFJvd1NldExpc3RlbmVyIHRoZUxpc3RlbmVyKTsKIAogICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgcGFyYW1ldGVycyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBSb3dTZXQuCisgICAgICogQ2xlYXJzIHRoZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkgc2V0IGZvciB0aGlzIHtAY29kZSBSb3dTZXR9LgogICAgICAqIDxwPgotICAgICAqIFBhcmFtZXRlciB2YWx1ZXMgYXBwbHkgdG8gcmVwZWF0ZWQgdXNlIG9mIGEgUm93U2V0IG9iamVjdC4gU2V0dGluZyBhIG5ldwotICAgICAqIHZhbHVlIGZvciBhIHBhcmFtZXRlciBjbGVhcnMgaXRzIHByZXZpb3VzIHZhbHVlLgotICAgICAqIDxjb2RlPmNsZWFyUGFyYW1ldGVyczwvY29kZT4gY2xlYXJzIHRoZSB2YWx1ZXMgZm9yIGFsbCBwYXJhbWV0ZXJzIHdpdGgKLSAgICAgKiBvbmUgbWV0aG9kIGNhbGwuCisgICAgICogVGhlIHtAY29kZSBSb3dTZXR9IG9iamVjdCByZXRhaW5zIGl0cyB2YWx1ZSB1bnRpbCBlaXRoZXIgYSBuZXcgdmFsdWUgZm9yCisgICAgICogYSBwYXJhbWV0ZXIgaXMgc2V0IG9yIGl0cyB2YWx1ZSBpcyBhY3RpdmVseSByZXNldC4ge0Bjb2RlCisgICAgICogY2xlYXJQYXJhbWV0ZXJzfSBwcm92aWRlcyBhIGZhY2lsaXR5IHRvIGNsZWFyIHRoZSB2YWx1ZXMgZm9yIGFsbAorICAgICAqIHBhcmFtZXRlcnMgd2l0aCBvbmUgbWV0aG9kIGNhbGwuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyUGFyYW1ldGVycygpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBGZXRjaGVzIGRhdGEgZm9yIHRoaXMgUm93U2V0LiBJZiBzdWNjZXNzZnVsLCBhbnkgZXhpc3RpbmcgZGF0YSBmb3IgdGhlCi0gICAgICogUm93U2V0IGlzIGRpc2NhcmRlZCBhbmQgdGhlIG1ldGFkYXRhIGZvciB0aGUgcm93c2V0IGlzIHNldC4KKyAgICAgKiBGZXRjaGVzIGRhdGEgZm9yIHRoaXMge0Bjb2RlIFJvd1NldH0gZnJvbSB0aGUgZGF0YWJhc2UuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogYW55IGV4aXN0aW5nIGRhdGEgZm9yIHRoZSB7QGNvZGUgUm93U2V0fSBpcyBkaXNjYXJkZWQgYW5kIGl0cyBtZXRhZGF0YSBpcworICAgICAqIG92ZXJ3cml0dGVuLgogICAgICAqIDxwPgotICAgICAqIERhdGEgaXMgcmV0cmlldmVkIGNvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBhbmQgZXhlY3V0ZXMgYSBDb21tYW5kLiBUaGlzCi0gICAgICogcmVxdWlyZXMgc29tZSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHRvIGJlIHNldDogdXJsLCBkYXRhCi0gICAgICogc291cmNlIG5hbWUsIHVzZXIgbmFtZSwgcGFzc3dvcmQsIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiwgdHlwZSBtYXAgOyBwbHVzCi0gICAgICogc29tZSBvciBhbGwgb2YgdGhlIHByb3BlcnRpZXM6IGNvbW1hbmQsIHJlYWQgb25seSwgbWF4aW11bSBmaWVsZCBzaXplLAotICAgICAqIG1heGltdW0gcm93cywgZXNjYXBlIHByb2Nlc3NpbmcsIGFuZCBxdWVyeSB0aW1lb3V0LgorICAgICAqIERhdGEgaXMgcmV0cmlldmVkIGNvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlIGFuZCBleGVjdXRpbmcgYW4KKyAgICAgKiBhY2NvcmRpbmcgU1FMIHN0YXRlbWVudC4gVGhpcyByZXF1aXJlcyBzb21lIG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nCisgICAgICogcHJvcGVydGllcyB0byBiZSBzZXQ6IFVSTCwgZGF0YWJhc2UgbmFtZSwgdXNlciBuYW1lLCBwYXNzd29yZCwKKyAgICAgKiB0cmFuc2FjdGlvbiBpc29sYXRpb24sIHR5cGUgbWFwOyBwbHVzIHNvbWUgb3IgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzOgorICAgICAqIGNvbW1hbmQsIHJlYWQgb25seSwgbWF4aW11bSBmaWVsZCBzaXplLCBtYXhpbXVtIHJvd3MsIGVzY2FwZSBwcm9jZXNzaW5nLAorICAgICAqIGFuZCBxdWVyeSB0aW1lb3V0LgorICAgICAqIDwvcD4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgUm93U2V0IG1heSB1c2UgYSBSb3dTZXRSZWFkZXIgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZSAtIGluIHRoaXMgY2FzZSBhCi0gICAgICogcmVhZGVyIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBSb3dTZXQgYW5kIHRoZSBSb3dTZXQgd2lsbCB0aGVuIGludm9rZQotICAgICAqIHRoZSA8Y29kZT5yZWFkRGF0YTwvY29kZT4gbWV0aG9kIG9uIHRoZSByZWFkZXIgdG8gZmV0Y2ggdGhlIGRhdGEuCisgICAgICogVGhlIHtAY29kZSBSb3dTZXR9IG1heSB1c2UgYSB7QGNvZGUgUm93U2V0UmVhZGVyfSB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlCisgICAgICogaXQgd2lsbCB0aGVuIGludm9rZSB0aGUge0BsaW5rIFJvd1NldFJlYWRlciNyZWFkRGF0YX0gbWV0aG9kIG9uIHRoZQorICAgICAqIHJlYWRlciB0byBmZXRjaCB0aGUgZGF0YS4gV2hlbiB0aGUgbmV3IGRhdGEgaXMgZmV0Y2hlZCBhbGwgdGhlIGxpc3RlbmVycworICAgICAqIGFyZSBub3RpZmllZCB0byB0YWtlIGFwcHJvcHJpYXRlIG1lYXN1cmVzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICBwcm9wZXJ0aWVzIG5lZWRlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIGhhdmUgbm90IGJlZW4gc2V0CisgICAgICogICAgICAgICAgICAgcHJvcGVydGllcyBuZWVkZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZSBoYXZlIG5vdCBiZWVuIHNldC4KKyAgICAgKiBAc2VlIFJvd1NldE1ldGFEYXRhCisgICAgICogQHNlZSBSb3dTZXRSZWFkZXIKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFJvd1NldCdzIENvbW1hbmQgcHJvcGVydHkuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIFJvd1NldH0ncyBjb21tYW5kIHByb3BlcnR5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgUm93U2V0J3MgQ29tbWFuZCBwcm9wZXJ0eSAtIHRoaXMgaXMgYW4KLSAgICAgKiAgICAgICAgIFNRTCBRdWVyeSB3aGljaCBjYW4gYmUgZXhlY3V0ZWQgdG8gZmV0Y2ggZGF0YSBpbnRvIHRoZSBSb3dTZXQuCisgICAgICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSB7QGNvZGUgUm93U2V0fSdzIGNvbW1hbmQgcHJvcGVydHkuIEEKKyAgICAgKiAgICAgICAgIGNvbW1hbmQgaXMgYSBTUUwgc3RhdGVtZW50IHdoaWNoIGlzIGV4ZWN1dGVkIHRvIGZldGNoIHJlcXVpcmVkCisgICAgICogICAgICAgICBkYXRhIGludG8gdGhlIHtAY29kZSBSb3dTZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZGF0YXNvdXJjZSBmb3IgdGhpcyBSb3dTZXQuCisgICAgICogR2V0cyB0aGUgT0RCQyBEYXRhIFNvdXJjZSBOYW1lIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZQorICAgICAqIFJvd1NldH0uIFRoZSBkYXRhYmFzZSBuYW1lIGNhbiBiZSB1c2VkIHRvIGZpbmQgYSB7QGxpbmsgRGF0YVNvdXJjZX0KKyAgICAgKiB3aGljaCBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggYSBuYW1pbmcgc2VydmljZSAtIHRoZSB7QGxpbmsgRGF0YVNvdXJjZX0KKyAgICAgKiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZGF0YXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFTb3VyY2VOYW1lKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXBvcnRzIGlmIGVzY2FwZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgUm93U2V0LgotICAgICAqIDxwPgotICAgICAqIElmIDxjb2RlPnRydWU8L2NvZGU+ICh0aGUgZGVmYXVsdCkgdGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkKLSAgICAgKiBwZXJmb3JtIGVzY2FwZSBjb2RlIHByb2Nlc3Npbmcgb24gU1FMIHN0YXRlbWVudHMgcHJpb3IgdG8gdGhlbSBiZWluZyBzZW50Ci0gICAgICogdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIFJlcG9ydHMgaWYgZXNjYXBlIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCBmb3IgdGhpcyB7QGNvZGUgUm93U2V0fS4gSWYKKyAgICAgKiBlc2NhcGUgcHJvY2Vzc2luZyBpcyBvbiwgdGhlIGRyaXZlciBwZXJmb3JtcyBhIHN1YnN0aXR1dGlvbiBvZiB0aGUgZXNjYXBlCisgICAgICogc3ludGF4IHdpdGggdGhlIGFwcGxpY2FibGUgY29kZSBiZWZvcmUgc2VuZGluZyBhbiBTUUwgY29tbWFuZCB0byB0aGUKKyAgICAgKiBkYXRhYmFzZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVzY2FwZSBwcm9jZXNzaW5nIGlzIHtAY29kZSB0cnVlfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXNjYXBlIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGVzY2FwZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIHtAY29kZQorICAgICAqICAgICAgICAgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRFc2NhcGVQcm9jZXNzaW5nKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJldHVybmVkIGZvciBjb2x1bW4gdmFsdWVzCi0gICAgICogd2hpY2ggYXJlIG9mIHR5cGVzIEJJTkFSWSwgVkFSQklOQVJZLCBMT05HVkFSQklOQVJZQklOQVJZLCBDSEFSLCBWQVJDSEFSLAotICAgICAqIG9yIExPTkdWQVJDSEFSLiBFeGNlc3MgZGF0YSBpcyBzaWxlbnRseSBkaXNjYXJkZWQgaWYgdGhlIG51bWJlciBpcworICAgICAqIHdoaWNoIGFyZSBvZiB0eXBlIHtAY29kZSBCSU5BUll9LCB7QGNvZGUgVkFSQklOQVJZfSwge0Bjb2RlCisgICAgICogTE9OR1ZBUkJJTkFSWUJJTkFSWX0sIHtAY29kZSBDSEFSfSwge0Bjb2RlIFZBUkNIQVJ9LCBvciB7QGNvZGUKKyAgICAgKiBMT05HVkFSQ0hBUn0uIEV4Y2VzcyBkYXRhIGlzIHNpbGVudGx5IGRpc2NhcmRlZCBpZiB0aGUgbnVtYmVyIGlzCiAgICAgICogZXhjZWVkZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBtYXhpbXVtIHNpemUgaW4gYnl0ZXMuIDAgbWVhbnMgbm8gbGltaXQKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG1heGltdW0gc2l6ZSBpbiBieXRlcy4gMCBpbXBsaWVzIG5vIHNpemUgbGltaXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhGaWVsZFNpemUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBmb3IgdGhpcyBSb3dTZXQuIEV4Y2VzcyByb3dzIGFyZQorICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgZm9yIHRoaXMge0Bjb2RlIFJvd1NldH0uIEV4Y2VzcyByb3dzIGFyZQogICAgICAqIGRpc2NhcmRlZCBzaWxlbnRseSBpZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgbWF4aW11bSBudW1iZXIgb2Ygcm93cy4gMCBpbXBsaWVzIG5vIGxpbWl0LgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIG1heGltdW0gbnVtYmVyIG9mIHJvd3MuIDAgaW1wbGllcyBubyByb3cgbGltaXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhSb3dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXNzd29yZCBwcm9wZXJ0eSBmb3IgdGhpcyBSb3dTZXQuIFRoaXMgcHJvcGVydHkKLSAgICAgKiBpcyB1c2VkIHdoZW4gbWFraW5nIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgYW5kIHNob3VsZCBiZSBzZXQgYmVmb3JlCi0gICAgICogaW52b2tpbmcgdGhlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZC4KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFzc3dvcmQgcHJvcGVydHkgZm9yIHRoaXMge0Bjb2RlIFJvd1NldH0uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBpcyB1c2VkIHdoZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBpcyBlc3RhYmxpc2hlZC4KKyAgICAgKiBUaGVyZWZvcmUgaXQgc2hvdWxkIGJlIHNldCBwcmlvciB0byBpbnZva2luZyB0aGUge0BsaW5rICNleGVjdXRlfSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcGFzc3dvcmQgcHJvcGVydHkuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHBhc3N3b3JkIHByb3BlcnR5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRpbWVvdXQgZm9yIHRoZSBkcml2ZXIgd2hlbiBleGVjdXRpbmcgYSBRdWVyeSBvcGVyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBRdWVyeSB0YWtlcyBsb25nZXIgdGhhbiB0aGUgVGltZW91dCwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiBHZXRzIHRoZSB0aW1lb3V0IGZvciB0aGUgZHJpdmVyIHdoZW4gYSBxdWVyeSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQuIElmIGEKKyAgICAgKiBxdWVyeSB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZW91dCB0aGVuIGEge0Bjb2RlIFNRTEV4Y2VwdGlvbn0gaXMKKyAgICAgKiB0aHJvd24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgVGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgorICAgICAqIEByZXR1cm4gdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UXVlcnlUaW1lb3V0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBwcm9wZXJ0eSBzZXR0aW5nIGZvciB0aGlzIFJvd1NldC4KKyAgICAgKiBHZXRzIHRoZSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgcHJvcGVydHkgc2V0IGZvciB0aGlzIAorICAgICAqIHtAY29kZSBSb3dTZXR9LiBUaGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsIGRlZmluZXMgdGhlIAorICAgICAqIHBvbGljeSBpbXBsZW1lbnRlZCBvbiB0aGUgZGF0YWJhc2UgZm9yIG1haW50YWluaW5nIHRoZSBkYXRhIAorICAgICAqIHZhbHVlcyBjb25zaXN0ZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciBob2xkaW5nIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBzZXR0aW5nLiBPbmUKLSAgICAgKiAgICAgICAgIG9mOiBvbmUgb2YgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVELAotICAgICAqICAgICAgICAgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRCwKLSAgICAgKiAgICAgICAgIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFELAotICAgICAqICAgICAgICAgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbC4gTXVzdCBiZSBvbmUgb2Y6CisgICAgICogICAgICAgICA8dWw+CisgICAgICogICAgICAgICA8bGk+e0Bjb2RlIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRH08L2xpPgorICAgICAqICAgICAgICAgPGxpPntAY29kZSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0Bjb2RlIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0Bjb2RlIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFfTwvbGk+CisgICAgICogICAgICAgICA8L3VsPgorICAgICAqIEBzZWUgamF2YS5zcWwuQ29ubmVjdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1c3RvbSBtYXBwaW5nIG9mIFNRTCB0eXBlcyBmb3IgdGhpcyBSb3dTZXQsIGlmIGFueS4KKyAgICAgKiBHZXRzIHRoZSBjdXN0b20gbWFwcGluZyBvZiBTUUwgVXNlci1EZWZpbmVkIFR5cGVzIChVRFRzKSBhbmQgSmF2YSBjbGFzc2VzCisgICAgICogZm9yIHRoaXMge0Bjb2RlIFJvd1NldH0sIGlmIGFwcGxpY2FibGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIE1hcCBob2xkaW5nIHRoZSBjdXN0b20gbWFwcGluZ3Mgb2YgU1FMIHR5cGVzIHRvIEphdmEgY2xhc3NlcyBmb3IKLSAgICAgKiAgICAgICAgIHRoaXMgUm93U2V0LiBCeSBkZWZhdWx0LCB0aGUgTWFwIGlzIGVtcHR5LgorICAgICAqIEByZXR1cm4gdGhlIGN1c3RvbSBtYXBwaW5ncyBvZiBTUUwgdHlwZXMgdG8gSmF2YSBjbGFzc2VzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBnZXRUeXBlTWFwKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFVSTCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhpcyBSb3dTZXQuIElmIHRoZXJlIGlzIG5vIERhdGFTb3VyY2UKLSAgICAgKiBvYmplY3Qgc3BlY2lmaWVkLCB0aGUgUm93U2V0IHVzZXMgdGhlIFVSTCB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvCi0gICAgICogdGhlIGRhdGFiYXNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIFVSTCBpcyBudWxsLgorICAgICAqIEdldHMgdGhlIFVSTCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgUm93U2V0fS4gSWYgdGhlcmUgaXMgbm8KKyAgICAgKiB7QGNvZGUgRGF0YVNvdXJjZX0gb2JqZWN0IHNwZWNpZmllZCwgdGhlIHtAY29kZSBSb3dTZXR9IHVzZXMgdGhlIFVSTCB0bworICAgICAqIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIFVSTCBpcworICAgICAqIHtAY29kZSBudWxsfS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBVUkwgcHJvcGVydHkuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgVXNlcm5hbWUgcHJvcGVydHkgZm9yIHRoaXMgUm93U2V0LiBUaGUgVXNlcm5hbWUgaXMKLSAgICAgKiB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgYW5kIHNob3VsZCBiZSBzZXQKLSAgICAgKiBiZWZvcmUgdGhlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZCBpcyBpbnZva2VkLgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUgdXNlcm5hbWV9IHByb3BlcnR5IGZvciB0aGlzIHtAY29kZSBSb3dTZXR9LgorICAgICAqIFRoZSB7QGNvZGUgdXNlcm5hbWV9IGlzIHVzZWQgd2hlbiBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIHRvIHRoZQorICAgICAqIGRhdGFiYXNlIGFuZCBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUge0Bjb2RlIGV4ZWN1dGV9IG1ldGhvZCBpcyBpbnZva2VkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgaG9saW5nIHRoZSB2YWx1ZSBvZiB0aGUgVXNlcm5hbWUgcHJvcGVydHkuCisgICAgICogQHJldHVybiBhIHtAY29kZSBTdHJpbmd9IGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUgdXNlcm5hbWV9CisgICAgICogICAgICAgICBwcm9wZXJ0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXBvcnRzIGlmIHRoaXMgUm93U2V0IGlzIHJlYWQgb25seS4KKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyB7QGNvZGUgUm93U2V0fSBpcyByZWFkLW9ubHkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgUm93U2V0IGlzIHJlYWQgb25seSwgZmFsc2UgaWYgaXQgaXMgdXBkYXRlYWJsZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBSb3dTZXR9IGlzIHJlYWQtb25seSwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgaWYgaXQgaXMgdXBkYXRhYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBzcGVjaWZpZWQgUm93U2V0TGlzdGVuZXIgb2JqZWN0IGZyb20gdGhlIHNldCBvZiBsaXN0ZW5lcnMgd2hpY2gKLSAgICAgKiB3aWxsIGJlIG5vdGlmaWVkIG9mIGV2ZW50cyBieSB0aGlzIFJvd1NldC4KKyAgICAgKiBSZW1vdmVzIGEgc3BlY2lmaWVkIHtAbGluayBSb3dTZXRMaXN0ZW5lcn0gb2JqZWN0IGZyb20gdGhlIHNldCBvZgorICAgICAqIGxpc3RlbmVycyB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIG9mIGV2ZW50cyBieSB0aGlzIHtAY29kZSBSb3dTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVMaXN0ZW5lcgotICAgICAqICAgICAgICAgICAgdGhlIFJvd1NldExpc3RlbmVyIHRvIHJlbW92ZSBmcm9tIHRoZSBzZXQgb2YgbGlzdGVuZXJzIGZvcgotICAgICAqICAgICAgICAgICAgdGhpcyBSb3dTZXQuCisgICAgICogICAgICAgICAgICB0aGUge0BsaW5rIFJvd1NldExpc3RlbmVyfSB0byByZW1vdmUgZnJvbSB0aGUgc2V0IG9mIGxpc3RlbmVycworICAgICAqICAgICAgICAgICAgZm9yIHRoaXMge0Bjb2RlIFJvd1NldH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlUm93U2V0TGlzdGVuZXIoUm93U2V0TGlzdGVuZXIgdGhlTGlzdGVuZXIpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIEFSUkFZIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0IGNvbW1hbmQgd2l0aCB0aGUKLSAgICAgKiBzdXBwbGllZCBqYXZhLnNxbC5BcnJheSB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQge0Bjb2RlIEFSUkFZfSBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCB7QGNvZGUgamF2YS5zcWwuQXJyYXl9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlQXJyYXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBqYXZhLnNxbC5BcnJheSB2YWx1ZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQXJyYXl9IGRhdGEgdmFsdWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShpbnQgcGFyYW1ldGVySW5kZXgsIEFycmF5IHRoZUFycmF5KQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB3aXRoIHRoZQotICAgICAqIEFTQ0lJIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGphdmEuaW8uSW5wdXRTdHJlYW0gdmFsdWUuIERhdGEgaXMgcmVhZCBmcm9tCi0gICAgICogdGhlIElucHV0U3RyZWFtIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB3aXRoIHRoZSBBU0NJSSBkYXRhIGluIHRoZSBzdXBwbGllZCB7QGNvZGUgamF2YS5pby5JbnB1dFN0cmVhbX0gdmFsdWUuCisgICAgICogRGF0YSBpcyByZWFkIGZyb20gdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggPSAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0OyB0aGUgZmlyc3QgcGFyYW1ldGVyJ3MgaW5kZXgKKyAgICAgKiAgICAgICAgICAgIGlzIDEuCiAgICAgICogQHBhcmFtIHRoZUlucHV0U3RyZWFtCi0gICAgICogICAgICAgICAgICBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIHRoZSBBU0NJSSBkYXRhIHRvIHNldCBpbnRvIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgQVNDSUkgZGF0YSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIGJ5dGVzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oaW50IHBhcmFtZXRlckluZGV4LCBJbnB1dFN0cmVhbSB0aGVJbnB1dFN0cmVhbSwKICAgICAgICAgICAgIGludCBsZW5ndGgpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFNRTCBOVU1FUklDIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0Ci0gICAgICogY29tbWFuZCB3aXRoIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBqYXZhLm1hdGguQmlnRGVjaW1hbCB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFNRTCB7QGNvZGUgTlVNRVJJQ30gcGFyYW1ldGVyIGluIHRoZQorICAgICAqIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQgd2l0aCB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQge0Bjb2RlCisgICAgICogamF2YS5tYXRoLkJpZ0RlY2ltYWx9IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlQmlnRGVjaW1hbAotICAgICAqICAgICAgICAgICAgdGhlIEJpZ0RlY2ltYWwgY29udGFpbmluZyB0aGUgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaWcgZGVjaW1hbCB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJpZ0RlY2ltYWwoaW50IHBhcmFtZXRlckluZGV4LCBCaWdEZWNpbWFsIHRoZUJpZ0RlY2ltYWwpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHdpdGggdGhlCi0gICAgICogYmluYXJ5IGRhdGEgaW4gdGhlIHN1cHBsaWVkIGphdmEuaW8uSW5wdXRTdHJlYW0gdmFsdWUuIERhdGEgaXMgcmVhZCBmcm9tCi0gICAgICogdGhlIElucHV0U3RyZWFtIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byB0aGUgYmluYXJ5IGRhdGEgaW4gdGhlIHN1cHBsaWVkIGlucHV0IHN0cmVhbS4gRGF0YSBpcyByZWFkIGZyb20gdGhlCisgICAgICogaW5wdXQgc3RyZWFtIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVJbnB1dFN0cmVhbQotICAgICAqICAgICAgICAgICAgYW4gSW5wdXRTdHJlYW0gY29udGFpbmluZyB0aGUgYmluYXJ5IGRhdGEgdG8gc2V0IGludG8gdGhlCi0gICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaW5hcnkgZGF0YSBzdHJlYW0gdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBpcyBzZXQuCiAgICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBieXRlcworICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBieXRlcy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJpbmFyeVN0cmVhbShpbnQgcGFyYW1ldGVySW5kZXgsIElucHV0U3RyZWFtIHRoZUlucHV0U3RyZWFtLAogICAgICAgICAgICAgaW50IGxlbmd0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB3aXRoIHRoZQotICAgICAqIHZhbHVlIG9mIGEgc3VwcGxpZWQgamF2YS5zcWwuQmxvYi4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIHRoZSBzdXBwbGllZCB7QGNvZGUgQmxvYn0gdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVCbG9iCi0gICAgICogICAgICAgICAgICB0aGUgQmxvYiB2YWx1ZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQmxvYn0gdmFsdWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCbG9iKGludCBwYXJhbWV0ZXJJbmRleCwgQmxvYiB0aGVCbG9iKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIHRoZQotICAgICAqIHN1cHBsaWVkIGJvb2xlYW4uCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byB0aGUgc3VwcGxpZWQgYm9vbGVhbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggPSAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0OyB0aGUgZmlyc3QgcGFyYW1ldGVyJ3MgaW5kZXgKKyAgICAgKiAgICAgICAgICAgIGlzIDEuCiAgICAgICogQHBhcmFtIHRoZUJvb2xlYW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHZhbHVlIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBib29sZWFufSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oaW50IHBhcmFtZXRlckluZGV4LCBib29sZWFuIHRoZUJvb2xlYW4pCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIHRoZQotICAgICAqIHN1cHBsaWVkIGJ5dGUgdmFsdWUuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byB0aGUgc3VwcGxpZWQgYnl0ZSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggPSAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0OyB0aGUgZmlyc3QgcGFyYW1ldGVyJ3MgaW5kZXgKKyAgICAgKiAgICAgICAgICAgIGlzIDEuCiAgICAgICogQHBhcmFtIHRoZUJ5dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHZhbHVlIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBieXRlfSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJ5dGUoaW50IHBhcmFtZXRlckluZGV4LCBieXRlIHRoZUJ5dGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0IGNvbW1hbmQgdG8gdGhlCi0gICAgICogc3VwcGxpZWQgYnl0ZSBhcnJheSB2YWx1ZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIHRoZSBzdXBwbGllZCBieXRlIGFycmF5IHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlQnl0ZUFycmF5Ci0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc2V0IGludG8gdGhlIHBhcmFtZXRlci4KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQXJyYXl9IG9mIHtAY29kZSBieXRlc30gdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCeXRlcyhpbnQgcGFyYW1ldGVySW5kZXgsIGJ5dGVbXSB0aGVCeXRlQXJyYXkpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIHRoZQotICAgICAqIHNlcXVlbmNlIG9mIFVuaWNvZGUgY2hhcmFjdGVycyBjYXJyaWVkIGJ5IHRoZSBzdXBwbGllZCBqYXZhLmlvLlJlYWRlci4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIHRoZSBzZXF1ZW5jZSBvZiBVbmljb2RlIGNoYXJhY3RlcnMgY2FycmllZCBieSB0aGUgc3VwcGxpZWQge0Bjb2RlCisgICAgICogamF2YS5pby5SZWFkZXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlUmVhZGVyCi0gICAgICogICAgICAgICAgICB0aGUgUmVhZGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBVbmljb2RlIGRhdGEgdG8gc2V0IGludG8gdGhlCi0gICAgICogICAgICAgICAgICBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgUmVhZGVyfSB3aGljaCBjb250YWlucyB0aGUgVW5pY29kZSBkYXRhIHRvIHNldCB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBSZWFkZXIgaW4gY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUge0Bjb2RlIFJlYWRlcn0gaW4gY2hhcmFjdGVycy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlclN0cmVhbShpbnQgcGFyYW1ldGVySW5kZXgsIFJlYWRlciB0aGVSZWFkZXIsCiAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHdpdGggdGhlCi0gICAgICogdmFsdWUgb2YgYSBzdXBwbGllZCBqYXZhLnNxbC5DbG9iLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSB7QGNvZGUgUm93U2V0fSBjb21tYW5kCisgICAgICogd2l0aCB0aGUgdmFsdWUgb2YgYSBzdXBwbGllZCB7QGNvZGUgamF2YS5zcWwuQ2xvYn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVDbG9iCi0gICAgICogICAgICAgICAgICB0aGUgQ2xvYiB2YWx1ZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2xvYn0gdmFsdWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBpcyBzZXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDbG9iKGludCBwYXJhbWV0ZXJJbmRleCwgQ2xvYiB0aGVDbG9iKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgQ29tbWFuZCBwcm9wZXJ0eSBmb3IgdGhpcyBSb3dTZXQgLSB0aGUgY29tbWFuZCBpcyBhbiBTUUwgUXVlcnkKLSAgICAgKiB3aGljaCBydW5zIHdoZW4gdGhlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzCi0gICAgICogcHJvcGVydHkgaXMgb3B0aW9uYWwgZm9yIGRhdGFzb3VyY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgY29tbWFuZHMuCisgICAgICogU2V0cyB0aGUgQ29tbWFuZCBwcm9wZXJ0eSBmb3IgdGhpcyB7QGNvZGUgUm93U2V0fSAtIHRoZSBjb21tYW5kIGlzIGFuIFNRTAorICAgICAqIHF1ZXJ5IHdoaWNoIHJ1bnMgd2hlbiB0aGUge0Bjb2RlIGV4ZWN1dGV9IG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzCisgICAgICogcHJvcGVydHkgaXMgb3B0aW9uYWwgZm9yIGRhdGFiYXNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNvbW1hbmRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjbWQKLSAgICAgKiAgICAgICAgICAgIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIFNRTCBRdWVyeS4gQ2FuIGJlIG51bGwuCisgICAgICogICAgICAgICAgICB0aGUgU1FMIHF1ZXJ5LiBDYW4gYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChTdHJpbmcgY21kKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29uY3VycmVuY3kgcHJvcGVydHkgb2YgdGhpcyBSb3dTZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFkuCisgICAgICogU2V0cyB0aGUgY29uY3VycmVuY3kgcHJvcGVydHkgb2YgdGhpcyB7QGNvZGUgUm93U2V0fS4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBpcyB7QGNvZGUgUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFl9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb25jdXJyZW5jeQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjb25jdXJyZW5jeSB2YWx1ZSAtIG9uZSBvZjogUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFkKLSAgICAgKiAgICAgICAgICAgIG9yIFJlc3VsdFNldC5DT05DVVJfVVBEQVRBQkxFCisgICAgICogICAgICAgICAgICB0aGUgY29uY3VycmVuY3kgdmFsdWUuIE9uZSBvZjoKKyAgICAgKiAgICAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGNvZGUgUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFl9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT57QGNvZGUgUmVzdWx0U2V0LkNPTkNVUl9VUERBVEFCTEV9PC9saT4KKyAgICAgKiAgICAgICAgICAgIDwvdWw+CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbmN1cnJlbmN5KGludCBjb25jdXJyZW5jeSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIERhdGEgU291cmNlIE5hbWUgcHJvcGVydHkgZm9yIHRoZSBSb3dTZXQuCisgICAgICogU2V0cyB0aGUgZGF0YWJhc2UgbmFtZSBwcm9wZXJ0eSBmb3IgdGhlIHtAY29kZSBSb3dTZXR9LgogICAgICAqIDxwPgotICAgICAqIFRoZSBEYXRhIFNvdXJjZSBOYW1lIGNhbiBiZSB1c2VkIHRvIGZpbmQgYSA8Y29kZT5EYXRhU291cmNlPC9jb2RlPgotICAgICAqIHdoaWNoIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBhIG5hbWluZyBzZXJ2aWNlIC0gdGhlIERhdGFTb3VyY2UgY2FuIHRoZW4KLSAgICAgKiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIFRoZSBkYXRhYmFzZSBuYW1lIGNhbiBiZSB1c2VkIHRvIGZpbmQgYSB7QGxpbmsgRGF0YVNvdXJjZX0gd2hpY2ggaGFzIGJlZW4KKyAgICAgKiByZWdpc3RlcmVkIHdpdGggYSBuYW1pbmcgc2VydmljZSAtIHRoZSB7QGxpbmsgRGF0YVNvdXJjZX0gY2FuIHRoZW4gYmUKKyAgICAgKiB1c2VkIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcgd2l0aCB0aGUgbmV3IERhdGEgU291cmNlIE5hbWUuCisgICAgICogICAgICAgICAgICB0aGUgZGF0YWJhc2UgbmFtZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2VOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHdpdGggdGhlCi0gICAgICogdmFsdWUgb2YgYSBzdXBwbGllZCBqYXZhLnNxbC5EYXRlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSB7QGNvZGUgUm93U2V0fSBjb21tYW5kCisgICAgICogd2l0aCB0aGUgdmFsdWUgb2YgYSBzdXBwbGllZCB7QGNvZGUgamF2YS5zcWwuRGF0ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVEYXRlCi0gICAgICogICAgICAgICAgICB0aGUgRGF0ZSB0byB1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRlIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0ZShpbnQgcGFyYW1ldGVySW5kZXgsIERhdGUgdGhlRGF0ZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB3aXRoIHRoZQotICAgICAqIHZhbHVlIG9mIGEgc3VwcGxpZWQgamF2YS5zcWwuRGF0ZSwgd2hlcmUgdGhlIGNvbnZlcnNpb24gb2YgdGhlIERhdGUgdG8gYW4KLSAgICAgKiBTUUwgREFURSB2YWx1ZSBpcyBjYWxjdWxhdGVkIHVzaW5nIGEgc3VwcGxpZWQgQ2FsZW5kYXIuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB3aXRoIHRoZSB2YWx1ZSBvZiBhIHN1cHBsaWVkIHtAY29kZSBqYXZhLnNxbC5EYXRlfSwgd2hlcmUgdGhlIGNvbnZlcnNpb24KKyAgICAgKiBvZiB0aGUgZGF0ZSB0byBhbiBTUUwge0Bjb2RlIERBVEV9IHZhbHVlIGlzIGNhbGN1bGF0ZWQgdXNpbmcgYSBzdXBwbGllZAorICAgICAqIHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVEYXRlCi0gICAgICogICAgICAgICAgICB0aGUgRGF0ZSB0byB1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEBwYXJhbSB0aGVDYWxlbmRhcgotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIHRvIHVzZSBpbiBjb252ZXJ0aW5nIHRoZSBEYXRlIHRvIGFuIFNRTCBEQVRFIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSB0byB1c2UgaW4gY29udmVydGluZyB0aGUgRGF0ZSB0byBhbiBTUUwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBEQVRFfSB2YWx1ZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGUoaW50IHBhcmFtZXRlckluZGV4LCBEYXRlIHRoZURhdGUsIENhbGVuZGFyIHRoZUNhbGVuZGFyKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB3aXRoIHRoZQotICAgICAqIHN1cHBsaWVkIGRvdWJsZS4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHdpdGggdGhlIHN1cHBsaWVkIHtAY29kZSBkb3VibGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlRG91YmxlCi0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHZhbHVlIHRvIHNldAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBkb3VibGV9IHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKGludCBwYXJhbWV0ZXJJbmRleCwgZG91YmxlIHRoZURvdWJsZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBFc2NhcGUgUHJvY2Vzc2luZyBzdGF0dXMgZm9yIHRoaXMgUm93U2V0LiBJZiBlc2NhcGUgcHJvY2Vzc2luZwotICAgICAqIGlzIG9uLCB0aGUgZHJpdmVyIHBlcmZvcm1zIGVzY2FwZSBzdWJzdGl0dXRpb24gYmVmb3JlIHNlbmRpbmcgYW4gU1FMCi0gICAgICogY29tbWFuZCB0byB0aGUgZGF0YWJhc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlc2NhcGUgcHJvY2Vzc2luZyBpcyBvbi4KKyAgICAgKiBTZXRzIHRoZSBlc2NhcGUgcHJvY2Vzc2luZyBzdGF0dXMgZm9yIHRoaXMge0Bjb2RlIFJvd1NldH0uIElmIGVzY2FwZQorICAgICAqIHByb2Nlc3NpbmcgaXMgb24sIHRoZSBkcml2ZXIgcGVyZm9ybXMgYSBzdWJzdGl0dXRpb24gb2YgdGhlIGVzY2FwZSBzeW50YXgKKyAgICAgKiB3aXRoIHRoZSBhcHBsaWNhYmxlIGNvZGUgYmVmb3JlIHNlbmRpbmcgYW4gU1FMIGNvbW1hbmQgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlc2NhcGUgcHJvY2Vzc2luZyBpcyB7QGNvZGUgdHJ1ZX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGVuYWJsZQotICAgICAqICAgICAgICAgICAgdHJ1ZSB0byBlbmFibGUgRXNjYXBlIFByb2Nlc3NpbmcsIGZhbHNlIHRvIHR1cm4gaXQgb2ZmLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIGVuYWJsZSBlc2NhcGUgcHJvY2Vzc2luZywge0Bjb2RlIGZhbHNlfSB0bworICAgICAqICAgICAgICAgICAgdHVybiBpdCBvZmYuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFc2NhcGVQcm9jZXNzaW5nKGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHdpdGggdGhlCi0gICAgICogc3VwcGxpZWQgZmxvYXQuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCB7QGNvZGUgZmxvYXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlRmxvYXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB2YWx1ZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgZmxvYXR9IHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmxvYXQoaW50IHBhcmFtZXRlckluZGV4LCBmbG9hdCB0aGVGbG9hdCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0IGNvbW1hbmQgd2l0aCB0aGUKLSAgICAgKiBzdXBwbGllZCBpbnRlZ2VyLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSB7QGNvZGUgUm93U2V0fSBjb21tYW5kCisgICAgICogd2l0aCB0aGUgc3VwcGxpZWQge0Bjb2RlIGludGVnZXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlSW50ZWdlcgotICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGludGVnZXJ9IHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW50KGludCBwYXJhbWV0ZXJJbmRleCwgaW50IHRoZUludGVnZXIpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0IGNvbW1hbmQgd2l0aCB0aGUKLSAgICAgKiBzdXBwbGllZCBsb25nLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSB7QGNvZGUgUm93U2V0fSBjb21tYW5kCisgICAgICogd2l0aCB0aGUgc3VwcGxpZWQge0Bjb2RlIGxvbmd9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlTG9uZwotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdmFsdWUgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGxvbmd9IHZhbHVlIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9uZyhpbnQgcGFyYW1ldGVySW5kZXgsIGxvbmcgdGhlTG9uZykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBiZSByZXR1cm5lZCBmb3IgYSBjb2x1bW4gdmFsdWUKLSAgICAgKiB3aGVyZSB0aGUgY29sdW1uIHR5cGUgQklOQVJZLCBWQVJCSU5BUlksIExPTkdWQVJCSU5BUllCSU5BUlksIENIQVIsCi0gICAgICogVkFSQ0hBUiwgb3IgTE9OR1ZBUkNIQVIuIERhdGEgd2hpY2ggZXhjZWVkcyB0aGlzIGxpbWl0IGlzIHNpbGVudGx5Ci0gICAgICogZGlzY2FyZGVkLiBGb3IgcG9ydGFiaWxpdHksIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDI1NiBpcyByZWNvbW1lbmRlZC4KKyAgICAgKiB3aGVyZSB0aGUgY29sdW1uIHR5cGUgaXMgb25lIG9mIHtAY29kZSBCSU5BUll9LCB7QGNvZGUgVkFSQklOQVJZfSwKKyAgICAgKiB7QGNvZGUgTE9OR1ZBUkJJTkFSWUJJTkFSWX0sIHtAY29kZSBDSEFSfSwge0Bjb2RlIFZBUkNIQVJ9LCBvciB7QGNvZGUKKyAgICAgKiBMT05HVkFSQ0hBUn0uIERhdGEgd2hpY2ggZXhjZWVkcyB0aGlzIGxpbWl0IGlzIHNpbGVudGx5IGRpc2NhcmRlZC4gRm9yCisgICAgICogcG9ydGFiaWxpdHksIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDI1NiBpcyByZWNvbW1lbmRlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbWF4CiAgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSByZXR1cm5lZCBjb2x1bW4gdmFsdWUgaW4gYnl0ZXMuIDAKLSAgICAgKiAgICAgICAgICAgIG1lYW5zIHVubGltaXRlZC4KKyAgICAgKiAgICAgICAgICAgIGltcGxpZXMgbm8gc2l6ZSBsaW1pdC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1heEZpZWxkU2l6ZShpbnQgbWF4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB3aGljaCBjYW4gYmUgaGVsZCBieSB0aGUgUm93U2V0LiBBbnkKLSAgICAgKiBhZGRpdGlvbmFsIHJvd3MgYXJlIHNpbGVudGx5IGRpc2NhcmRlZC4KKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHdoaWNoIGNhbiBiZSBoZWxkIGJ5IHRoZSB7QGNvZGUgUm93U2V0fS4KKyAgICAgKiBBbnkgYWRkaXRpb25hbCByb3dzIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1heAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3Mgd2hpY2ggY2FuIGJlIGhlbGQgaW4gdGhlIFJvd1NldC4gMAotICAgICAqICAgICAgICAgICAgbWVhbnMgbm8gbGltaXQuCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB3aGljaCBjYW4gYmUgaGVsZCBpbiB0aGUge0Bjb2RlCisgICAgICogICAgICAgICAgICBSb3dTZXR9LiAwIG1lYW5zIG5vIGxpbWl0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWF4Um93cyhpbnQgbWF4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIFNRTAotICAgICAqIE5VTEwuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byBTUUwge0Bjb2RlIE5VTEx9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gc3FsVHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciwgYXMgZGVmaW5lZCBieSBqYXZhLnNxbC5UeXBlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIGFzIGRlZmluZWQgYnkge0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLnNxbC5UeXBlc30uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROdWxsKGludCBwYXJhbWV0ZXJJbmRleCwgaW50IHNxbFR5cGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0IGNvbW1hbmQgdG8gU1FMCi0gICAgICogTlVMTC4gVGhpcyBmb3JtIG9mIHRoZSA8Y29kZT5zZXROdWxsPC9jb2RlPiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgZm9yCi0gICAgICogVXNlciBEZWZpbmVkIFR5cGVzIGFuZCBSRUYgcGFyYW1ldGVycy4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIFNRTCB7QGNvZGUgTlVMTH0uIFRoaXMgZm9ybSBvZiB0aGUge0Bjb2RlIHNldE51bGx9IG1ldGhvZCBzaG91bGQgYmUKKyAgICAgKiB1c2VkIGZvciBVc2VyIERlZmluZWQgVHlwZXMgYW5kIHtAY29kZSBSRUZ9IHBhcmFtZXRlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSBzcWxUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLCBhcyBkZWZpbmVkIGJ5IGphdmEuc3FsLlR5cGVzLgorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciwgYXMgZGVmaW5lZCBieSB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlR5cGVzfS4KICAgICAgKiBAcGFyYW0gdHlwZU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBTUUwgVXNlciBEZWZpbmVkIFR5cGUgb3IgdGhlCi0gICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSBTUUwgc3RydWN0dXJlZCB0eXBlIHJlZmVyZW5jZWQgYnkgYSBSRUYgdHlwZS4KLSAgICAgKiAgICAgICAgICAgIElnbm9yZWQgaWYgdGhlIHNxbFR5cGUgaXMgbm90IGEgVURUIG9yIFJFRiB0eXBlLgorICAgICAqICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIFNRTCB1c2VyIGRlZmluZWQgdHlwZSBvciB0aGUKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIFNRTCBzdHJ1Y3R1cmVkIHR5cGUgcmVmZXJlbmNlZCBieSBhIHtAY29kZSBSRUZ9CisgICAgICogICAgICAgICAgICB0eXBlLiBJZ25vcmVkIGlmIHRoZSBzcWxUeXBlIGlzIG5vdCBhIFVEVCBvciBSRUYgdHlwZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE51bGwoaW50IHBhcmFtZXRlckluZGV4LCBpbnQgc3FsVHlwZSwgU3RyaW5nIHR5cGVOYW1lKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB0byBhCi0gICAgICogc3VwcGxpZWQgSmF2YSBvYmplY3QuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byBhIHN1cHBsaWVkIEphdmEgb2JqZWN0LgogICAgICAqIDxwPgogICAgICAqIFRoZSBKREJDIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYSBzdGFuZGFyZCBtYXBwaW5nIGZvciBKYXZhIG9iamVjdHMgdG8KICAgICAgKiBTUUwgZGF0YSB0eXBlcy4gRGF0YWJhc2Ugc3BlY2lmaWMgdHlwZXMgY2FuIGJlIG1hcHBlZCBieSBKREJDIGRyaXZlcgogICAgICAqIHNwZWNpZmljIEphdmEgdHlwZXMuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlT2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgSmF2YSBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB2YWx1ZS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBKYXZhIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHZhbHVlIHRvIHdoaWNoIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChpbnQgcGFyYW1ldGVySW5kZXgsIE9iamVjdCB0aGVPYmplY3QpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIGEKLSAgICAgKiBzdXBwbGllZCBKYXZhIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIGEgc3VwcGxpZWQgSmF2YSBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVPYmplY3QKICAgICAgKiAgICAgICAgICAgIHRoZSBKYXZhIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHZhbHVlLgogICAgICAqIEBwYXJhbSB0YXJnZXRTcWxUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIHR5cGUgdG8gc2VuZCB0byB0aGUgZGF0YWJhc2UsIGFzIGRlZmluZWQgaW4KLSAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlR5cGVzLgorICAgICAqICAgICAgICAgICAgdGhlIFNRTCB0eXBlIHRvIHNlbmQgdG8gdGhlIGRhdGFiYXNlLCBhcyBkZWZpbmVkIGluIHtAY29kZQorICAgICAqICAgICAgICAgICAgamF2YS5zcWwuVHlwZXN9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KGludCBwYXJhbWV0ZXJJbmRleCwgT2JqZWN0IHRoZU9iamVjdCwKICAgICAgICAgICAgIGludCB0YXJnZXRTcWxUeXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIGEKLSAgICAgKiBzdXBwbGllZCBKYXZhIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIGEgc3VwcGxpZWQgSmF2YSBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVPYmplY3QKICAgICAgKiAgICAgICAgICAgIHRoZSBKYXZhIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHZhbHVlLgogICAgICAqIEBwYXJhbSB0YXJnZXRTcWxUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgU1FMIHR5cGUgdG8gc2VuZCB0byB0aGUgZGF0YWJhc2UsIGFzIGRlZmluZWQgaW4KLSAgICAgKiAgICAgICAgICAgIGphdmEuc3FsLlR5cGVzLgorICAgICAqICAgICAgICAgICAgdGhlIFNRTCB0eXBlIHRvIHNlbmQgdG8gdGhlIGRhdGFiYXNlLCBhcyBkZWZpbmVkIGluIHtAY29kZQorICAgICAqICAgICAgICAgICAgamF2YS5zcWwuVHlwZXN9LgogICAgICAqIEBwYXJhbSBzY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQsIGZvcgotICAgICAqICAgICAgICAgICAgamF2YS5zcWwuVHlwZXMuREVDSU1BTCBhbmQgamF2YS5zcWwuVHlwZXMuTlVNRVJJQyB0eXBlcy4KLSAgICAgKiAgICAgICAgICAgIElnbm9yZWQgZm9yIGFsbCBvdGhlciB0eXBlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LCBmb3Ige0Bjb2RlCisgICAgICogICAgICAgICAgICBqYXZhLnNxbC5UeXBlcy5ERUNJTUFMfSBhbmQge0Bjb2RlIGphdmEuc3FsLlR5cGVzLk5VTUVSSUN9CisgICAgICogICAgICAgICAgICB0eXBlcy4gSWdub3JlZCBmb3IgYWxsIG90aGVyIHR5cGVzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KGludCBwYXJhbWV0ZXJJbmRleCwgT2JqZWN0IHRoZU9iamVjdCwKICAgICAgICAgICAgIGludCB0YXJnZXRTcWxUeXBlLCBpbnQgc2NhbGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhYmFzZSBQYXNzd29yZCBmb3IgdGhpcyBSb3dTZXQuCisgICAgICogU2V0cyB0aGUgZGF0YWJhc2UgUGFzc3dvcmQgZm9yIHRoaXMge0Bjb2RlIFJvd1NldH0uIFRoaXMgcHJvcGVydHkgaXMgdXNlZAorICAgICAqIHdoZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBpcyBlc3RhYmxpc2hlZC4gVGhlcmVmb3JlIGl0IHNob3VsZCBiZQorICAgICAqIHNldCBwcmlvciB0byBpbnZva2luZyB0aGUge0BsaW5rICNleGVjdXRlfSBtZXRob2QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhc3N3b3JkCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyBob2xkaW5nIHRoZSBuZXcgcGFzc3dvcmQKKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIFN0cmluZ30gaG9sZGluZyB0aGUgcGFzc3dvcmQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBUaW1lb3V0IHZhbHVlIGZvciB0aGlzIFJvd1NldC4gVGhlIHRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZQotICAgICAqIHRoYXQgdGhlIGRyaXZlciB3aWxsIHdhaXQgd2hpbGUgZXhlY3V0aW5nIGEgY29tbWFuZCAtIGFmdGVyIHRoaXMgdGltZSwgYW4KLSAgICAgKiBTUUxFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIEdldHMgdGhlIHRpbWVvdXQgZm9yIHRoZSBkcml2ZXIgd2hlbiBhIHF1ZXJ5IG9wZXJhdGlvbiBpcyBleGVjdXRlZC4gSWYgYQorICAgICAqIHF1ZXJ5IHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lb3V0LCBhIHtAY29kZSBTUUxFeGNlcHRpb259IGlzIHRocm93bi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc2Vjb25kcwotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZvciB0aGUgVGltZW91dC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmb3IgdGhlIHRpbWVvdXQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVRpbWVvdXQoaW50IHNlY29uZHMpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIFJvd1NldCBpcyByZWFkIG9ubHkgb3IgaXMgdXBkYXRlYWJsZS4KKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHtAY29kZSBSb3dTZXR9IGlzIHJlYWQtb25seSBvciB1cGRhdGFibGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHJlYWRPbmx5Ci0gICAgICogICAgICAgICAgICB0cnVlIHRvIHNldCB0aGUgUm93U2V0IHRvIHJlYWRvbmx5IHN0YXRlLCBmYWxzZSB0byBhbGxvdwotICAgICAqICAgICAgICAgICAgdXBkYXRlcy4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBzZXQgdGhlIHtAY29kZSBSb3dTZXR9IHRvIHJlYWQtb25seSBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gdG8gYWxsb3cgdXBkYXRlcy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0IGNvbW1hbmQgdG8gYQotICAgICAqIHN1cHBsaWVkIGphdmEuc3FsLlJlZi4gVGhpcyBpcyBzZW50IHRvIHRoZSBkYXRhYmFzZSBhcyBhbiBTUUwgUkVGIHZhbHVlLgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSB7QGNvZGUgUm93U2V0fSBjb21tYW5kCisgICAgICogdG8gYSBzdXBwbGllZCB7QGNvZGUgamF2YS5zcWwuUmVmfS4gVGhpcyBpcyBzZW50IHRvIHRoZSBkYXRhYmFzZSBhcyBhbgorICAgICAqIFNRTCB7QGNvZGUgUkVGfSB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggPSAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0OyB0aGUgZmlyc3QgcGFyYW1ldGVyJ3MgaW5kZXgKKyAgICAgKiAgICAgICAgICAgIGlzIDEuCiAgICAgICogQHBhcmFtIHRoZVJlZgotICAgICAqICAgICAgICAgICAgdGhlIFJlZiB2YWx1ZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzZWUgamF2YS5zcWwuUmVmCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVmKGludCBwYXJhbWV0ZXJJbmRleCwgUmVmIHRoZVJlZikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB0byBhCi0gICAgICogc3VwcGxpZWQgc2hvcnQgaW50ZWdlci4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIGEgc3VwcGxpZWQge0Bjb2RlIHNob3J0IGludGVnZXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlU2hvcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydCB2YWx1ZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNob3J0KGludCBwYXJhbWV0ZXJJbmRleCwgc2hvcnQgdGhlU2hvcnQpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIGEKLSAgICAgKiBzdXBwbGllZCBTdHJpbmcuIFRoZSBTdHJpbmcgaXMgcGxhY2VkIGludG8gdGhlIGRhdGFiYXNlIGFzIGEgVkFSQ0hBUiBvcgotICAgICAqIExPTkdWQVJDSEFSIFNRTCB2YWx1ZSwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBsaW1pdHMgZm9yIHRoZSBsZW5ndGggb2YKLSAgICAgKiBWQVJDSEFSIHZhbHVlcy4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIGEgc3VwcGxpZWQge0Bjb2RlIFN0cmluZ30uIFRoZSBzdHJpbmcgaXMgcGxhY2VkIGludG8gdGhlIGRhdGFiYXNlIGFzIGEKKyAgICAgKiB7QGNvZGUgVkFSQ0hBUn0gb3Ige0Bjb2RlIExPTkdWQVJDSEFSfSBTUUwgdmFsdWUsIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBkYXRhYmFzZSBsaW1pdHMgZm9yIHRoZSBsZW5ndGggb2Yge0Bjb2RlIFZBUkNIQVJ9IHZhbHVlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggPSAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0OyB0aGUgZmlyc3QgcGFyYW1ldGVyJ3MgaW5kZXgKKyAgICAgKiAgICAgICAgICAgIGlzIDEuCiAgICAgICogQHBhcmFtIHRoZVN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nIHRoZVN0cmluZykKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUgUm93U2V0IGNvbW1hbmQgdG8gYQotICAgICAqIHN1cHBsaWVkIGphdmEuc3FsLlRpbWUsIGNvbnZlcnRpbmcgdG8gYW4gU1FMIFRJTUUgdmFsdWUgdXNpbmcgdGhlIHN5c3RlbQotICAgICAqIGRlZmF1bHQgQ2FsZW5kYXIuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byBhIHN1cHBsaWVkIHtAY29kZSBqYXZhLnNxbC5UaW1lfSwgY29udmVydGluZyBpdCB0byBhbiBTUUwge0Bjb2RlIFRJTUV9CisgICAgICogdmFsdWUgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVUaW1lCi0gICAgICogICAgICAgICAgICB0aGUgVGltZSB2YWx1ZSB0byBzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzZWUgamF2YS51dGlsLkNhbGVuZGFyCisgICAgICogQHNlZSBqYXZhLnNxbC5UaW1lCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZShpbnQgcGFyYW1ldGVySW5kZXgsIFRpbWUgdGhlVGltZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB0byBhCi0gICAgICogc3VwcGxpZWQgamF2YS5zcWwuVGltZSwgY29udmVydGluZyB0byBhbiBTUUwgVElNRSB2YWx1ZSB1c2luZyBhIHN1cHBsaWVkCi0gICAgICogQ2FsZW5kYXIuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byBhIHN1cHBsaWVkIHtAY29kZSBqYXZhLnNxbC5UaW1lfSwgY29udmVydGluZyBpdCB0byBhbiBTUUwge0Bjb2RlIFRJTUV9CisgICAgICogdmFsdWUgdXNpbmcgYSBzdXBwbGllZCB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQsIHdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCA9IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB0byBzZXQ7IHRoZSBmaXJzdCBwYXJhbWV0ZXIncyBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgMS4KICAgICAgKiBAcGFyYW0gdGhlVGltZQotICAgICAqICAgICAgICAgICAgdGhlIFRpbWUgdmFsdWUgdG8gc2V0CisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBpcyBzZXQuCiAgICAgICogQHBhcmFtIHRoZUNhbGVuZGFyCi0gICAgICogICAgICAgICAgICB0aGUgQ2FsZW5kYXIgdG8gdXNlIGluIHRoZSBjb252ZXJzaW9uIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBDYWxlbmRhcn0gdG8gdXNlIGluIHRoZSBjb252ZXJzaW9uIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzZWUgamF2YS51dGlsLkNhbGVuZGFyCisgICAgICogQHNlZSBqYXZhLnNxbC5UaW1lCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZShpbnQgcGFyYW1ldGVySW5kZXgsIFRpbWUgdGhlVGltZSwgQ2FsZW5kYXIgdGhlQ2FsZW5kYXIpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIFJvd1NldCBjb21tYW5kIHRvIGEKLSAgICAgKiBzdXBwbGllZCBqYXZhLnNxbC5UaW1lc3RhbXAsIGNvbnZlcnRpbmcgdG8gYW4gU1FMIFRJTUVTVEFNUCB2YWx1ZSB1c2luZwotICAgICAqIHRoZSBzeXN0ZW0gZGVmYXVsdCBDYWxlbmRhci4KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbiB0aGUge0Bjb2RlIFJvd1NldH0gY29tbWFuZAorICAgICAqIHRvIGEgc3VwcGxpZWQge0Bjb2RlIGphdmEuc3FsLlRpbWVzdGFtcH0sIGNvbnZlcnRpbmcgaXQgdG8gYW4gU1FMIHtAY29kZQorICAgICAqIFRJTUVTVEFNUH0gdmFsdWUgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldCwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4ID0gMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldDsgdGhlIGZpcnN0IHBhcmFtZXRlcidzIGluZGV4CisgICAgICogICAgICAgICAgICBpcyAxLgogICAgICAqIEBwYXJhbSB0aGVUaW1lc3RhbXAKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGlzIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzZWUgamF2YS51dGlsLkNhbGVuZGFyCisgICAgICogQHNlZSBqYXZhLnNxbC5UaW1lc3RhbXAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoaW50IHBhcmFtZXRlckluZGV4LCBUaW1lc3RhbXAgdGhlVGltZXN0YW1wKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluIHRoZSBSb3dTZXQgY29tbWFuZCB0byBhCi0gICAgICogc3VwcGxpZWQgamF2YS5zcWwuVGltZXN0YW1wIGNvbnZlcnRpbmcgdG8gYW4gU1FMIFRJTUVTVEFNUCB2YWx1ZSB1c2luZyBhCi0gICAgICogc3VwcGxpZWQgQ2FsZW5kYXIuCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gdGhlIHtAY29kZSBSb3dTZXR9IGNvbW1hbmQKKyAgICAgKiB0byBhIHN1cHBsaWVkIHtAY29kZSBqYXZhLnNxbC5UaW1lc3RhbXB9LCBjb252ZXJ0aW5nIGl0IHRvIGFuIFNRTCB7QGNvZGUKKyAgICAgKiBUSU1FU1RBTVB9IHZhbHVlIHVzaW5nIGEgc3VwcGxpZWQge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0LCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggPSAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0OyB0aGUgZmlyc3QgcGFyYW1ldGVyJ3MgaW5kZXgKKyAgICAgKiAgICAgICAgICAgIGlzIDEuCiAgICAgICogQHBhcmFtIHRoZVRpbWVzdGFtcAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LgogICAgICAqIEBwYXJhbSB0aGVDYWxlbmRhcgotICAgICAqICAgICAgICAgICAgdGhlIENhbGVuZGFyIHRvIHVzZSBpbiB0aGUgY29udmVyc2lvbiBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9IHRvIHVzZSBpbiB0aGUgY29udmVyc2lvbiBvcGVyYXRpb24KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzZWUgamF2YS51dGlsLkNhbGVuZGFyCisgICAgICogQHNlZSBqYXZhLnNxbC5UaW1lc3RhbXAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoaW50IHBhcmFtZXRlckluZGV4LCBUaW1lc3RhbXAgdGhlVGltZXN0YW1wLAogICAgICAgICAgICAgQ2FsZW5kYXIgdGhlQ2FsZW5kYXIpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB0YXJnZXQgaW5zdGFuY2UncyB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgdG8gb25lIG9mIGEKLSAgICAgKiBkaXNjcmV0ZSBzZXQgb2YgcG9zc2libGUgdmFsdWVzLgorICAgICAqIFNldHMgdGhlIHRhcmdldCBpbnN0YW5jZSdzIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCB0byBvbmUgb2YgYQorICAgICAqIGRpc2NyZXRlIHNldCBvZiBwb3NzaWJsZSB2YWx1ZXMuIFRoZSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgZGVmaW5lcworICAgICAqIHRoZSBwb2xpY3kgaW1wbGVtZW50ZWQgb24gdGhlIGRhdGFiYXNlIGZvciBtYWludGFpbmluZyB0aGUgZGF0YSB2YWx1ZXMKKyAgICAgKiBjb25zaXN0ZW50LgorICAgICAqIDxwPgorICAgICAqIEtlZXAgaW4gbWluZCB0aGF0IHNldHRpbmcgYSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgaGFzIG5vIGVmZmVjdAorICAgICAqIHVubGVzcyB5b3VyIGRyaXZlciBhbmQgREJNUyBzdXBwb3J0IGl0LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsLiBPbmUgb2Y6Ci0gICAgICogICAgICAgICAgICBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQsCi0gICAgICogICAgICAgICAgICBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVELAotICAgICAqICAgICAgICAgICAgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRVBFQVRBQkxFX1JFQUQsIG9yCi0gICAgICogICAgICAgICAgICBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1NFUklBTElaQUJMRQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbC4gT25lIG9mOgorICAgICAqICAgICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgPGxpPntAY29kZSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUR9PC9saT4gCisgICAgICogICAgICAgICAgICA8bGk+e0Bjb2RlIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUR9PC9saT4gCisgICAgICogICAgICAgICAgICA8bGk+e0Bjb2RlIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEfTwvbGk+IAorICAgICAqICAgICAgICAgICAgPGxpPntAY29kZSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1NFUklBTElaQUJMRX08L2xpPgorICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzZWUgamF2YS5zcWwuQ29ubmVjdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKGludCBsZXZlbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHR5cGUgb2YgdGhpcyBSb3dTZXQuIEJ5IGRlZmF1bHQsIHRoZSB0eXBlIGlzIG5vbi1zY3JvbGxhYmxlLgorICAgICAqIFNldHMgdGhlIHR5cGUgb2YgdGhpcyB7QGNvZGUgUm93U2V0fS4gQnkgZGVmYXVsdCwgdGhlIHR5cGUgaXMKKyAgICAgKiBub24tc2Nyb2xsYWJsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0eXBlIGZvciB0aGUgUm93U2V0LiBPbmUgb2Y6Ci0gICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFksCi0gICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUsIG9yCi0gICAgICogICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBmb3IgdGhlIHtAY29kZSBSb3dTZXR9LiBPbmUgb2Y6CisgICAgICogICAgICAgICAgICA8dWw+CisgICAgICogICAgICAgICAgICA8bGk+e0Bjb2RlIFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWX08L2xpPiAKKyAgICAgKiAgICAgICAgICAgIDxsaT57QGNvZGUgUmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFfTwvbGk+IAorICAgICAqICAgICAgICAgICAgPGxpPntAY29kZSBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFfTwvbGk+CisgICAgICogICAgICAgICAgICA8L3VsPgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIE1hcCB1c2VkIHRvIG1hcCBTUUwgVXNlciBEZWZpbmVkIFR5cGVzIHRvIEphdmEgY2xhc3Nlcy4KKyAgICAgKiBTZXRzIHRoZSBtYXBwaW5nIG9mIFNRTCBVc2VyIERlZmluZWQgVHlwZXMgKFVEVHMpIHRvIEphdmEgY2xhc3Nlcy4gVGhlCisgICAgICogSmF2YSBjbGFzc2VzIG11c3QgYWxsIGltcGxlbWVudCB0aGUge0BsaW5rIGphdmEuc3FsLlNRTERhdGEgU1FMRGF0YX0KKyAgICAgKiBpbnRlcmZhY2UuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVR5cGVNYXAKLSAgICAgKiAgICAgICAgICAgIGEgTWFwIHdoaWNoIGRlZmluZXMgdGhlIG5hbWVzIG9mIFNRTCBVRFRzIGFuZCB0aGUgSmF2YSBjbGFzc2VzCi0gICAgICogICAgICAgICAgICB0byB3aGljaCB0aGV5IGFyZSBtYXBwZWQuCisgICAgICogICAgICAgICAgICB0aGUgbmFtZXMgb2YgU1FMIFVEVHMgYW5kIHRoZSBKYXZhIGNsYXNzZXMgdG8gd2hpY2ggdGhleSBhcmUKKyAgICAgKiAgICAgICAgICAgIG1hcHBlZC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFR5cGVNYXAoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IHRoZVR5cGVNYXApCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgVVJMIHVzZWQgYnkgdGhpcyBSb3dTZXQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZSB2aWEgYQotICAgICAqIDxjb2RlPkRyaXZlck1hbmFnZXI8L2NvZGU+LiBUaGUgVVJMIGlzIG9wdGlvbmFsIC0gYW4gYWx0ZXJuYXRpdmUgaXMgdG8KLSAgICAgKiB1c2UgYSBEYXRhIFNvdXJjZSBOYW1lIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24uCisgICAgICogU2V0cyB0aGUgVVJMIHVzZWQgYnkgdGhpcyB7QGNvZGUgUm93U2V0fSB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIHZpYSBhCisgICAgICoge0Bjb2RlIERyaXZlck1hbmFnZXJ9LiBUaGUgVVJMIGlzIG9wdGlvbmFsIC0gYW4gYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIGEKKyAgICAgKiBkYXRhYmFzZSBuYW1lIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVVSTAotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIGZvciB0aGUgZGF0YWJhc2UuIENhbiBiZSBudWxsLgorICAgICAqICAgICAgICAgICAgdGhlIFVSTCBmb3IgdGhlIGRhdGFiYXNlLiBDYW4gYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB0aGVVUkwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVc2VybmFtZSBwcm9wZXJ0eSBmb3IgdGhlIFJvd1NldCwgdXNlZCB0byBhdXRoZW50aWNhdGUgYQotICAgICAqIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIFNldHMgdGhlIHtAY29kZSBVc2VybmFtZX0gcHJvcGVydHkgZm9yIHRoZSB7QGNvZGUgUm93U2V0fSwgdXNlZCB0bworICAgICAqIGF1dGhlbnRpY2F0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVVc2VybmFtZQotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgVXNlciBOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHVzZXIgbmFtZSBmb3IgdGhpcyByb3cgc2V0LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHRoZVVzZXJuYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL1Jvd1NldEV2ZW50LmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0RXZlbnQuamF2YQppbmRleCA4NjgyOTU3Li45ZDRjOThjIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0RXZlbnQuamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0RXZlbnQuamF2YQpAQCAtMjEsMzEgKzIxLDM2IEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogQW4gZXZlbnQgd2hpY2ggaXMgc2VudCB3aGVuIHNwZWNpZmljIGV2ZW50cyBoYXBwZW4gdG8gYSBSb3dTZXQgb2JqZWN0LiBUaGUKLSAqIGV2ZW50cyBhcmUgc2VudCB0byBpbmZvcm0gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgdGhhdCBjaGFuZ2VzIGhhdmUgb2NjdXJyZWQgdG8KLSAqIHRoZSBSb3dTZXQuIFRoZSBldmVudHMgY292ZXJlZCBhcmU6CisgKiBBbiBldmVudCB3aGljaCBpcyBzZW50IHdoZW4gc3BlY2lmaWMgZXZlbnRzIGhhcHBlbiB0byBhIHtAbGluayBSb3dTZXR9CisgKiBvYmplY3QuIFRoZSBldmVudHMgYXJlIHNlbnQgdG8gaW5mb3JtIHJlZ2lzdGVyZWQgbGlzdGVuZXJzIHRoYXQgY2hhbmdlcyBoYXZlCisgKiBvY2N1cnJlZCB0byB0aGUge0Bjb2RlIFJvd1NldH0uIFRoZSBldmVudHMgY292ZXJlZCBhcmU6CiAgKiA8b2w+Ci0gKiA8bGk+QSBzaW5nbGUgcm93IGluIHRoZSBSb3dTZXQgY2hhbmdlczwvbGk+Ci0gKiA8bGk+VGhlIHdob2xlIHNldCBvZiBkYXRhIGluIHRoZSBSb3dTZXQgY2hhbmdlczwvbGk+Ci0gKiA8bGk+VGhlIFJvd1NldCBjdXJzb3IgcG9zaXRpb24gY2hhbmdlczwvbGk+CisgKiA8bGk+QSBzaW5nbGUgcm93IGluIHRoZSB7QGNvZGUgUm93U2V0fSBjaGFuZ2VzLjwvbGk+CisgKiA8bGk+VGhlIHdob2xlIHNldCBvZiBkYXRhIGluIHRoZSB7QGNvZGUgUm93U2V0fSBjaGFuZ2VzLjwvbGk+CisgKiA8bGk+VGhlIHtAY29kZSBSb3dTZXR9IGN1cnNvciBwb3NpdGlvbiBjaGFuZ2VzLjwvbGk+CiAgKiA8L29sPgotICogVGhlIGV2ZW50IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBSb3dTZXQgb2JqZWN0IHdoaWNoIGdlbmVyYXRlZCB0aGUKLSAqIG1lc3NhZ2Ugc28gdGhhdCB0aGUgbGlzdGVuZXJzIGNhbiBleHRyYWN0IHdoYXRldmVyIGluZm9ybWF0aW9uIHRoZXkgbmVlZCBmcm9tCi0gKiB0aGF0IHJlZmVyZW5jZS4KKyAqIDxwPgorICogVGhlIGV2ZW50IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB7QGNvZGUgUm93U2V0fSBvYmplY3Qgd2hpY2ggZ2VuZXJhdGVkCisgKiB0aGUgbWVzc2FnZSBzbyB0aGF0IHRoZSBsaXN0ZW5lcnMgY2FuIGV4dHJhY3Qgd2hhdGV2ZXIgaW5mb3JtYXRpb24gdGhleSBuZWVkCisgKiBmcm9tIHRoYXQgcmVmZXJlbmNlLgorICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJvd1NldEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE4NzU0NTA4NzY1NDYzMzIwMDVMOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJvd1NldEV2ZW50IG9iamVjdCBjb250YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBSb3dTZXQgb2JqZWN0Ci0gICAgICogdGhhdCBnZW5lcmF0ZWQgdGhlIGV2ZW50LiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUKLSAgICAgKiBvY2N1cnJlZCB0byB0aGUgUm93U2V0IGNhbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgUm93U2V0IHVzaW5nIG9uZSBvciBtb3JlCi0gICAgICogb2YgdGhlIHF1ZXJ5IG1ldGhvZHMgYXZhaWxhYmxlIG9uIHRoZSBSb3dTZXQuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBSb3dTZXRFdmVudH0gb2JqZWN0IGNvbnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgICoge0BsaW5rIFJvd1NldH0gb2JqZWN0IHRoYXQgZ2VuZXJhdGVkIHRoZSBldmVudC4gSW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICogY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgdG8gdGhlIHtAY29kZSBSb3dTZXR9IGNhbiBiZSBleHRyYWN0ZWQgZnJvbQorICAgICAqIHRoZSB7QGNvZGUgUm93U2V0fSB1c2luZyBvbmUgb3IgbW9yZSBvZiB0aGUgcXVlcnkgbWV0aG9kcyBhdmFpbGFibGUgb24KKyAgICAgKiB0aGUge0Bjb2RlIFJvd1NldH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZVNvdXJjZQotICAgICAqICAgICAgICAgICAgdGhlIFJvd1NldCB3aGljaCBnZW5lcmF0ZWQgdGhlIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFJvd1NldH0gd2hpY2ggZ2VuZXJhdGVkIHRoZSBldmVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUm93U2V0RXZlbnQoUm93U2V0IHRoZVNvdXJjZSkgewogICAgICAgICBzdXBlcih0aGVTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL1Jvd1NldEludGVybmFsLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0SW50ZXJuYWwuamF2YQppbmRleCBmMjI0YTEzLi5iYWEyNjFkIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0SW50ZXJuYWwuamF2YQorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0SW50ZXJuYWwuamF2YQpAQCAtMjIsMzEgKzIyLDM1IEBACiBpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwogCiAvKioKLSAqIEFuIGludGVyZmFjZSBwcm92aWRlZCBieSBhIFJvd1NldCBvYmplY3QgdG8gZWl0aGVyIGEgUm93U2V0UmVhZGVyIG9yIGEKLSAqIFJvd1NldFdyaXRlciwgcHJvdmlkaW5nIGZhY2lsaXRpZXMgdG8gcmVhZCBhbmQgdXBkYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZgotICogdGhlIFJvd1NldC4KKyAqIEFuIGludGVyZmFjZSBwcm92aWRlZCBieSBhIHtAY29kZSBSb3dTZXR9IG9iamVjdCB0byBsZXQgZWl0aGVyIGEge0Bjb2RlIFJvd1NldFJlYWRlcn0gb3IgYQorICoge0Bjb2RlIFJvd1NldFdyaXRlcn0gYWNjZXNzIGl0cyBpbnRlcm5hbCBzdGF0ZSwgdGhlcmVieSBwcm92aWRpbmcgZmFjaWxpdGllcyB0byByZWFkIGFuZCB1cGRhdGUgdGhlIHN0YXRlIG9mCisgKiB0aGUge0Bjb2RlIFJvd1NldH0uCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUm93U2V0SW50ZXJuYWwgewogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgQ29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBSb3dTZXQgb2JqZWN0LgorICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIFJvd1NldH0gb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIENvbm5lY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25uZWN0aW9uIG9yIHtAY29kZSBudWxsfS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmVzdWx0U2V0IHRoYXQgd2FzIHRoZSBvcmlnaW5hbCAodW5tb2RpZmllZCkgY29udGVudCBvZiB0aGUKLSAgICAgKiBSb3dTZXQuCisgICAgICogR2V0cyB0aGUge0Bjb2RlIFJlc3VsdFNldH0gdGhhdCB3YXMgdGhlIG9yaWdpbmFsICh1bm1vZGlmaWVkKSBjb250ZW50IG9mCisgICAgICogdGhlIHtAY29kZSBSb3dTZXR9LgogICAgICAqIDxwPgotICAgICAqIFRoZSBSZXN1bHRTZXQgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBmaXJzdCByb3cgb2YgZGF0YQorICAgICAqIFRoZSB7QGNvZGUgUmVzdWx0U2V0fSdzIGN1cnNvciBpcyBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgZmlyc3Qgcm93IG9mCisgICAgICogZGF0YS4KKyAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmVzdWx0U2V0IHRoYXQgY29udGFpbmVkIHRoZSBvcmlnaW5hbCBkYXRhIHZhbHVlIG9mIHRoZQotICAgICAqICAgICAgICAgUm93U2V0CisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFJlc3VsdFNldH0gdGhhdCBjb250YWluZWQgdGhlIG9yaWdpbmFsIGRhdGEgdmFsdWUgb2YKKyAgICAgKiAgICAgICAgIHRoZSB7QGNvZGUgUm93U2V0fS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0T3JpZ2luYWwoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCkBAIC01NCwzMyArNTgsMzYgQEAKICAgICAgKiBHZXRzIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgY3VycmVudCByb3cgb25seS4gSWYgdGhlIGN1cnJlbnQgcm93IGRpZAogICAgICAqIG5vdCBoYXZlIGFuIG9yaWdpbmFsIHZhbHVlLCB0aGVuIGFuIGVtcHR5IHZhbHVlIGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBSZXN1bHRTZXQgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcm93IG9ubHkuCisgICAgICogQHJldHVybiBhIHtAY29kZSBSZXN1bHRTZXR9IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHJvdyBvbmx5LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UsIG9yIGlmIHRoZQotICAgICAqICAgICAgICAgICAgIGN1cnNvciBpcyBub3Qgb24gYSB2YWxpZCByb3cgKGJlZm9yZSBmaXJzdCwgYWZ0ZXIgbGFzdCBvcgotICAgICAqICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSBpbnNlcnQgcm93KS4KKyAgICAgKiAgICAgICAgICAgICBjdXJzb3IgaXMgbm90IG9uIGEgdmFsaWQgcm93IChiZWZvcmUgdGhlIGZpcnN0IHJvdywgYWZ0ZXIgdGhlCisgICAgICogICAgICAgICAgICAgbGFzdCBvbmUgb3IgcG9pbnRpbmcgdG8gdGhlIGluc2VydCByb3cpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0T3JpZ2luYWxSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGFyYW1ldGVyIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBzZXQgZm9yIHRoaXMgUm93U2V0J3MgY29tbWFuZC4KKyAgICAgKiBHZXRzIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmb3IgdGhpcyB7QGNvZGUgUm93U2V0fSdzCisgICAgICogY29tbWFuZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIE9iamVjdCBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgcGFyYW1ldGVycyB0aGF0IGhhdmUKLSAgICAgKiAgICAgICAgIGJlZW4gc2V0LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyBvZiBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuIHNldC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RbXSBnZXRQYXJhbXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyBSb3dTZXRNZXRhRGF0YSBmb3IgdGhpcyBSb3dTZXQuIFRoZSBSb3dTZXRNZXRhRGF0YSBpcyB1c2VkIGJ5IGEKLSAgICAgKiBSb3dTZXRSZWFkZXIgdG8gc2V0IHZhbHVlcyBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFJvd1NldCdzIGNvbHVtbnMuCisgICAgICogU2V0cyB7QGNvZGUgUm93U2V0TWV0YURhdGF9IGZvciB0aGlzIHtAY29kZSBSb3dTZXR9LiBUaGUge0Bjb2RlCisgICAgICogUm93U2V0TWV0YURhdGF9IGlzIHVzZWQgYnkgYSB7QGNvZGUgUm93U2V0UmVhZGVyfSB0byBzZXQgdmFsdWVzIGdpdmluZworICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGNvZGUgUm93U2V0fSdzIGNvbHVtbnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZU1ldGFEYXRhCi0gICAgICogICAgICAgICAgICBhIFJvd1NldE1ldGFEYXRhIGhvbGRpbmcgdGhlIG1ldGFkYXRhIGFib3V0IHRoZSBSb3dTZXQncwotICAgICAqICAgICAgICAgICAgY29sdW1ucy4KKyAgICAgKiAgICAgICAgICAgIGhvbGRzIHRoZSBtZXRhZGF0YSBhYm91dCB0aGUge0Bjb2RlIFJvd1NldH0ncyBjb2x1bW5zLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoUm93U2V0TWV0YURhdGEgdGhlTWV0YURhdGEpIHRocm93cyBTUUxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0TGlzdGVuZXIuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRMaXN0ZW5lci5qYXZhCmluZGV4IGE0ODJkMmIuLjA2YTcyNTMgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRMaXN0ZW5lci5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRMaXN0ZW5lci5qYXZhCkBAIC0yMCw0MyArMjAsNTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAogLyoqCi0gKiBBbiBpbnRlcmZhY2UgdXNlZCB0byBzZW5kIG5vdGlmaWNhdGlvbiBvZiBldmVudHMgb2NjdXJyaW5nIGluIGEgUm93U2V0LiBUbwotICogcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50cywgYW4gb2JqZWN0IG11c3QgaW1wbGVtZW50IHRoZSBSb3dTZXRMaXN0ZW5lcgotICogaW50ZXJmYWNlIGFuZCB0aGVuIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSBSb3dTZXQgb2YgaW50ZXJlc3QgdXNpbmcgdGhlCi0gKiA8Y29kZT5Sb3dTZXQuYWRkUm93U2V0TGlzdGVuZXI8L2NvZGU+IG1ldGhvZC4KKyAqIEFuIGludGVyZmFjZSB1c2VkIHRvIHNlbmQgbm90aWZpY2F0aW9uIG9mIGV2ZW50cyBvY2N1cnJpbmcgaW4gdGhlIGNvbnRleHQgb2YKKyAqIGEge0BsaW5rIFJvd1NldH0uIFRvIHJlY2VpdmUgdGhlIG5vdGlmaWNhdGlvbiBldmVudHMsIGFuIG9iamVjdCBtdXN0CisgKiBpbXBsZW1lbnQgdGhlIHtAY29kZSBSb3dTZXRMaXN0ZW5lcn0gaW50ZXJmYWNlIGFuZCB0aGVuIHJlZ2lzdGVyIGl0c2VsZiB3aXRoCisgKiB0aGUge0Bjb2RlIFJvd1NldH0gb2YgaW50ZXJlc3QgdXNpbmcgdGhlCisgKiB7QGxpbmsgUm93U2V0I2FkZFJvd1NldExpc3RlbmVyKFJvd1NldExpc3RlbmVyKX0gbWV0aG9kLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSb3dTZXRMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhlIGxpc3RlbmVyIHRoYXQgb25lIG9mIHRoZSBSb3dTZXQncyByb3dzIGhhcyBjaGFuZ2VkLgorICAgICAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSB7QGNvZGUgUm93U2V0fSdzIGN1cnNvciBpbiB7QGNvZGUKKyAgICAgKiB0aGVFdmVudC5nZXRTb3VyY2V9IGhhcyBtb3ZlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlRXZlbnQKLSAgICAgKiAgICAgICAgICAgIGEgUm93U2V0RXZlbnQgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUm93U2V0Ci0gICAgICogICAgICAgICAgICBpbnZvbHZlZC4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbgotICAgICAqICAgICAgICAgICAgYWJvdXQgdGhlIGNoYW5nZSwgc3VjaCBhcyB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbi4KKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIFJvd1NldEV2ZW50fSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIFJvd1NldH0gaW52b2x2ZWQuIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2UsIHN1Y2ggYXMgdGhlIHVwZGF0ZWQKKyAgICAgKiAgICAgICAgICAgIGRhdGEgdmFsdWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGN1cnNvck1vdmVkKFJvd1NldEV2ZW50IHRoZUV2ZW50KTsKIAogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBSb3dTZXQncyBjdXJzb3IgaGFzIG1vdmVkLgorICAgICAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IG9uZSBvZiB0aGUge0Bjb2RlIFJvd1NldH0ncyByb3dzIGluIHtAY29kZQorICAgICAqIHRoZUV2ZW50LmdldFNvdXJjZX0gaGFzIGNoYW5nZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZUV2ZW50Ci0gICAgICogICAgICAgICAgICB0aGVFdmVudCBhIFJvd1NldEV2ZW50IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICAgICogICAgICAgICAgICBSb3dTZXQgaW52b2x2ZWQuIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUKLSAgICAgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2UsIHN1Y2ggYXMgdGhlIHVwZGF0ZWQgZGF0YSB2YWx1ZXMuCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBSb3dTZXRFdmVudH0gdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBSb3dTZXR9IGludm9sdmVkLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvCisgICAgICogICAgICAgICAgICByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlLCBzdWNoIGFzIHRoZSBuZXcgY3Vyc29yCisgICAgICogICAgICAgICAgICBwb3NpdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByb3dDaGFuZ2VkKFJvd1NldEV2ZW50IHRoZUV2ZW50KTsKIAogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBSb3dTZXQncyBlbnRpcmUgY29udGVudHMgaGF2ZSBiZWVuIHVwZGF0ZWQKLSAgICAgKiAoYW4gZXhhbXBsZSBpcyB0aGUgZXhlY3V0aW9uIG9mIGEgY29tbWFuZCB3aGljaCByZXRyaWV2ZXMgbmV3IGRhdGEgZnJvbQotICAgICAqIHRoZSBkYXRhYmFzZSkuCisgICAgICogTm90aWZpZXMgdGhlIGxpc3RlbmVyIHRoYXQgdGhlIHtAY29kZSBSb3dTZXR9J3MgZW50aXJlIGNvbnRlbnRzIGluCisgICAgICoge0Bjb2RlIHRoZUV2ZW50LmdldFNvdXJjZX0gaGF2ZSBiZWVuIHVwZGF0ZWQgKGFuIGV4YW1wbGUgaXMgdGhlIGV4ZWN1dGlvbgorICAgICAqIG9mIGEgY29tbWFuZCB3aGljaCByZXRyaWV2ZXMgbmV3IGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UpLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVFdmVudAotICAgICAqICAgICAgICAgICAgdGhlRXZlbnQgYSBSb3dTZXRFdmVudCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAqICAgICAgICAgICAgUm93U2V0IGludm9sdmVkLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlCi0gICAgICogICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlLCBzdWNoIGFzIHRoZSB1cGRhdGVkIHJvd3Mgb2YKLSAgICAgKiAgICAgICAgICAgIGRhdGEuCisgICAgICogICAgICAgICAgICBhIHtAY29kZSBSb3dTZXRFdmVudH0gdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBSb3dTZXR9IGludm9sdmVkLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvCisgICAgICogICAgICAgICAgICByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlLCBzdWNoIGFzIHRoZSB1cGRhdGVkCisgICAgICogICAgICAgICAgICByb3dzIG9mIGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcm93U2V0Q2hhbmdlZChSb3dTZXRFdmVudCB0aGVFdmVudCk7CiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0TWV0YURhdGEuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRNZXRhRGF0YS5qYXZhCmluZGV4IDg5ZDZmN2YuLjMwNTE4NzYgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRNZXRhRGF0YS5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRNZXRhRGF0YS5qYXZhCkBAIC0yMiwyNjEgKzIyLDI5MiBAQAogCiAvKioKICAqIEFuIGludGVyZmFjZSB3aGljaCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICogY29sdW1ucyBpbiBhIFJvd1NldC4KKyAqIGNvbHVtbnMgaW4gYSB7QGNvZGUgUm93U2V0fS4KICAqIDxwPgotICogUm93U2V0TWV0YURhdGEgZXh0ZW5kcyBSZXN1bHRTZXRNZXRhRGF0YSwgYWRkaW5nIG5ldyBvcGVyYXRpb25zIGZvciBjYXJyeWluZwotICogb3V0IHZhbHVlIHNldHMuCisgKiB7QGNvZGUgUm93U2V0TWV0YURhdGF9IGV4dGVuZHMge0BsaW5rIGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhfSwgYWRkaW5nIG5ldworICogb3BlcmF0aW9ucyBmb3IgY2Fycnlpbmcgb3V0IHZhbHVlIHNldHMuCisgKiA8L3A+CiAgKiA8cD4KICAqIEFwcGxpY2F0aW9uIGNvZGUgd291bGQgbm90IG5vcm1hbGx5IGNhbGwgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuIEl0IHdvdWxkIGJlCi0gKiBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIDxjb2RlPlJvd1NldC5leGVjdXRlPC9jb2RlPiBpcyBjYWxsZWQuCisgKiBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIHtAY29kZSBSb3dTZXQuZXhlY3V0ZX0gaXMgY2FsbGVkLgorICogPC9wPgorICogCisgKiBAc2VlIFJvd1NldEludGVybmFsI3NldE1ldGFEYXRhKFJvd1NldE1ldGFEYXRhKQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUm93U2V0TWV0YURhdGEgZXh0ZW5kcyBSZXN1bHRTZXRNZXRhRGF0YSB7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGF1dG9tYXRpYyBudW1iZXJpbmcgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUgUm93U2V0LiBJZgotICAgICAqIGF1dG9tYXRpYyBudW1iZXJpbmcgaXMgb24sIHRoZSBjb2x1bW4gaXMgcmVhZCBvbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIHRvIGJlIG9mZi4KKyAgICAgKiBTZXRzIGF1dG9tYXRpYyBudW1iZXJpbmcgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUge0Bjb2RlIFJvd1NldH0uIElmCisgICAgICogYXV0b21hdGljIG51bWJlcmluZyBpcyBvbiwgdGhlIGNvbHVtbiBpcyByZWFkLW9ubHkuIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorICAgICAqIHRoZSBhdXRvIGluY3JlbWVudCBwYXJhbWV0ZXIgaXMge0Bjb2RlIGZhbHNlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW4sIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbjsgdGhlIGZpcnN0IGNvbHVtbidzIGluZGV4IGlzCisgICAgICogICAgICAgICAgICAxLgogICAgICAqIEBwYXJhbSBhdXRvSW5jcmVtZW50Ci0gICAgICogICAgICAgICAgICB0cnVlIHRvIHNldCBhdXRvbWF0aWMgbnVtYmVyaW5nIG9uLCBmYWxzZSB0byB0dXJuIGl0IG9mZi4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBzZXQgYXV0b21hdGljIG51bWJlcmluZyBvbiwge0Bjb2RlIGZhbHNlfSB0bworICAgICAqICAgICAgICAgICAgdHVybiBpdCBvZmYgKGRlZmF1bHQpLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEF1dG9JbmNyZW1lbnQoaW50IGNvbHVtbkluZGV4LCBib29sZWFuIGF1dG9JbmNyZW1lbnQpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2FzZSBzZW5zaXRpdmUgcHJvcGVydHkgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUgUm93U2V0LgotICAgICAqIFRoZSBkZWZhdWx0IGlzIHRoYXQgdGhlIGNvbHVtbiBpcyBub3QgY2FzZSBzZW5zaXRpdmUuCisgICAgICogU2V0cyB0aGUgY2FzZSBzZW5zaXRpdmUgcHJvcGVydHkgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUge0Bjb2RlCisgICAgICogUm93U2V0fS4gVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgY29sdW1uIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW4sIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbjsgdGhlIGZpcnN0IGNvbHVtbidzIGluZGV4IGlzCisgICAgICogICAgICAgICAgICAxLgogICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlCi0gICAgICogICAgICAgICAgICB0cnVlIHRvIG1ha2UgdGhlIGNvbHVtbiBjYXNlIHNlbnNpdGl2ZSwgZmFsc2UgdG8gbWFrZSBpdCBub3QKLSAgICAgKiAgICAgICAgICAgIGNhc2Ugc2Vuc2l0aXZlLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIG1ha2UgdGhlIGNvbHVtbiBjYXNlIHNlbnNpdGl2ZSwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgICAgdG8gbWFrZSBpdCBjYXNlIGluc2Vuc2l0aXZlIChkZWZhdWx0KS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGludCBjb2x1bW5JbmRleCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIENhdGFsb2cgTmFtZSBmb3IgYSBzcGVjaWZpZWQgY29sdW1uIGluIHRoZSBSb3dTZXQuCisgICAgICogU2V0cyB0aGUgY2F0YWxvZyBuYW1lIGZvciBhIHNwZWNpZmllZCBjb2x1bW4gaW4gdGhlIHtAY29kZSBSb3dTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbiwgd2hlcmUgdGhlIGZpcnN0IGNvbHVtbiBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uOyB0aGUgZmlyc3QgY29sdW1uJ3MgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIDEuCiAgICAgICogQHBhcmFtIGNhdGFsb2dOYW1lCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuZXcgQ2F0YWxvZyBOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGNhdGFsb2cncyBuYW1lLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dOYW1lKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIGNhdGFsb2dOYW1lKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBSb3cgU2V0LgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGNvbnRhaW5lZCBpbiB0aGUgcm93IHNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uQ291bnQKLSAgICAgKiAgICAgICAgICAgIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIFJvd1NldC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1ucyBjb250YWluZWQgaW4gdGhlIHtAY29kZSBSb3dTZXR9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkNvdW50KGludCBjb2x1bW5Db3VudCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5vcm1hbCBtYXhpbXVtIHdpZHRoIGluIGNoYXJhY3RlcnMgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUKLSAgICAgKiBSb3dTZXQuCisgICAgICoge0Bjb2RlIFJvd1NldH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uLCB3aGVyZSB0aGUgZmlyc3QgY29sdW1uIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW47IHRoZSBmaXJzdCBjb2x1bW4ncyBpbmRleCBpcworICAgICAqICAgICAgICAgICAgMS4KICAgICAgKiBAcGFyYW0gZGlzcGxheVNpemUKLSAgICAgKiAgICAgICAgICAgIGFuIGludGVnZXIgd2l0aCB0aGUgbm9ybWFsIG1heGltdW0gY29sdW1uIHdpZHRoIGluIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBub3JtYWwgbWF4aW11bSBjb2x1bW4gd2lkdGggaW4gY2hhcmFjdGVycy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5EaXNwbGF5U2l6ZShpbnQgY29sdW1uSW5kZXgsIGludCBkaXNwbGF5U2l6ZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdWdnZXN0ZWQgbmFtZSBhcyBsYWJlbCBmb3IgdGhlIGNvbHVtbiBjb250YWluZWQgaW4gdGhlIHtAY29kZQorICAgICAqIFJvd1NldH0uIFRoZSBsYWJlbCBpcyBhbiBhbGlhcyBmb3IgcHJpbnRpbmcgYW5kIGRpc3BsYXlpbmcgcHVycG9zZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uLCB3aGVyZSB0aGUgZmlyc3QgY29sdW1uIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW47IHRoZSBmaXJzdCBjb2x1bW4ncyBpbmRleCBpcworICAgICAqICAgICAgICAgICAgMS4KICAgICAgKiBAcGFyYW0gdGhlTGFiZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlhcyBuYW1lIGZvciB0aGUgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkxhYmVsKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHRoZUxhYmVsKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN1Z2dlc3RlZCBjb2x1bW4gbGFiZWwgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUgUm93U2V0LgotICAgICAqIFRoaXMgbGFiZWwgaXMgdHlwaWNhbGx5IHVzZWQgaW4gZGlzcGxheWluZyBvciBwcmludGluZyB0aGUgY29sdW1uLgorICAgICAqIFNldHMgdGhlIGNvbHVtbiBuYW1lIGZvciBhIHNwZWNpZmllZCBjb2x1bW4gaW4gdGhlIHtAY29kZSBSb3dTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbiwgd2hlcmUgdGhlIGZpcnN0IGNvbHVtbiBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uOyB0aGUgZmlyc3QgY29sdW1uJ3MgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIDEuCiAgICAgICogQHBhcmFtIHRoZUNvbHVtbk5hbWUKLSAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbHVtbiBsYWJlbAorICAgICAqICAgICAgICAgICAgdGhlIGNvbHVtbidzIGxhYmVsLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdGhlQ29sdW1uTmFtZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTUUwgdHlwZSBmb3IgYSBzcGVjaWZpZWQgY29sdW1uIGluIHRoZSBSb3dTZXQKKyAgICAgKiBTZXRzIHRoZSBTUUwgdHlwZSBmb3IgYSBzcGVjaWZpZWQgY29sdW1uIGluIHRoZSB7QGNvZGUgUm93U2V0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW4sIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbjsgdGhlIGZpcnN0IGNvbHVtbidzIGluZGV4IGlzCisgICAgICogICAgICAgICAgICAxLgogICAgICAqIEBwYXJhbSB0aGVTUUxUeXBlCi0gICAgICogICAgICAgICAgICBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIFNRTCBUeXBlLCBhcyBkZWZpbmVkIGJ5Ci0gICAgICogICAgICAgICAgICBqYXZhLnNxbC5UeXBlcy4KKyAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgVHlwZSwgYXMgZGVmaW5lZCBieSB7QGNvZGUgamF2YS5zcWwuVHlwZXN9LgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtblR5cGUoaW50IGNvbHVtbkluZGV4LCBpbnQgdGhlU1FMVHlwZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBUeXBlIE5hbWUgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUgUm93U2V0LCB3aGVyZSB0aGUgZGF0YQotICAgICAqIHR5cGUgaXMgc3BlY2lmaWMgdG8gdGhlIGRhdGFzb3VyY2UuCisgICAgICogU2V0cyB0aGUgdHlwZSBuYW1lIGZvciBhIHNwZWNpZmllZCBjb2x1bW4gaW4gdGhlIHtAY29kZSBSb3dTZXR9LCB3aGVyZQorICAgICAqIHRoZSBkYXRhIHR5cGUgaXMgc3BlY2lmaWMgdG8gdGhlIGRhdGEgc291cmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbiwgd2hlcmUgdGhlIGZpcnN0IGNvbHVtbiBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uOyB0aGUgZmlyc3QgY29sdW1uJ3MgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIDEuCiAgICAgICogQHBhcmFtIHRoZVR5cGVOYW1lCi0gICAgICogICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIHRoZSBUeXBlIE5hbWUgZm9yIHRoZSBjb2x1bW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBTUUwgdHlwZSBuYW1lIGZvciB0aGUgY29sdW1uLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtblR5cGVOYW1lKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHRoZVR5cGVOYW1lKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBhIHNwZWNpZmllZCBjb2x1bW4gaXMgYSBjdXJyZW5jeSB2YWx1ZS4KKyAgICAgKiBTZXRzIHdoZXRoZXIgYSBzcGVjaWZpZWQgY29sdW1uIGlzIGEgY3VycmVuY3kgdmFsdWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0Bjb2RlIGZhbHNlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW4sIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbjsgdGhlIGZpcnN0IGNvbHVtbidzIGluZGV4IGlzCisgICAgICogICAgICAgICAgICAxLgogICAgICAqIEBwYXJhbSBpc0N1cnJlbmN5Ci0gICAgICogICAgICAgICAgICB0cnVlIGlmIHRoZSBjb2x1bW4gc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBjdXJyZW5jeSB2YWx1ZSwKLSAgICAgKiAgICAgICAgICAgIGZhbHNlIGlmIGl0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBhIGN1cnJlbmN5IHZhbHVlLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBjb2x1bW4gc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBjdXJyZW5jeQorICAgICAqICAgICAgICAgICAgdmFsdWUsIHtAY29kZSBmYWxzZX0gaWYgaXQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIGEgY3VycmVuY3kKKyAgICAgKiAgICAgICAgICAgIHZhbHVlIChkZWZhdWx0KS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeShpbnQgY29sdW1uSW5kZXgsIGJvb2xlYW4gaXNDdXJyZW5jeSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgYSBzcGVjaWZpZWQgY29sdW1uIGNhbiBjb250YWluIFNRTCBOVUxMIHZhbHVlcy4KKyAgICAgKiBTZXRzIHdoZXRoZXIgYSBzcGVjaWZpZWQgY29sdW1uIGNhbiBjb250YWluIFNRTCB7QGNvZGUgTlVMTH0gdmFsdWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbiwgd2hlcmUgdGhlIGZpcnN0IGNvbHVtbiBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uOyB0aGUgZmlyc3QgY29sdW1uJ3MgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIDEuCiAgICAgICogQHBhcmFtIG51bGxhYmlsaXR5CiAgICAgICogICAgICAgICAgICBhbiBpbnRlZ2VyIHdoaWNoIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldE1ldGFEYXRhLmNvbHVtbk5vTnVsbHMsCi0gICAgICogICAgICAgICAgICBSZXN1bHRTZXRNZXRhRGF0YS5jb2x1bW5OdWxsYWJsZSwgb3IKLSAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldE1ldGFEYXRhLmNvbHVtbk51bGxhYmxlVW5rbm93bgorICAgICAqICAgICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgPGxpPntAY29kZSBSZXN1bHRTZXRNZXRhRGF0YS5jb2x1bW5Ob051bGxzfTwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+e0Bjb2RlIFJlc3VsdFNldE1ldGFEYXRhLmNvbHVtbk51bGxhYmxlfTwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+e0Bjb2RlIFJlc3VsdFNldE1ldGFEYXRhLmNvbHVtbk51bGxhYmxlVW5rbm93bn08L2xpPgorICAgICAqICAgICAgICAgICAgPC91bD4KICAgICAgKiAgICAgICAgICAgIDxwPgotICAgICAqICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgUmVzdWx0U2V0TWV0YURhdGEuY29sdW1uTnVsbGFibGVVbmtub3duCisgICAgICogICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIFJlc3VsdFNldE1ldGFEYXRhLmNvbHVtbk51bGxhYmxlVW5rbm93bn0uCisgICAgICogICAgICAgICAgICA8L3A+CiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TnVsbGFibGUoaW50IGNvbHVtbkluZGV4LCBpbnQgbnVsbGFiaWxpdHkpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGZvciBhIHNwZWNpZmllZCBjb2x1bW4gaW4gdGhlIFJvd1NldC4KKyAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgZm9yIGEgc3BlY2lmaWVkIGNvbHVtbiBpbiB0aGUge0Bjb2RlCisgICAgICogUm93U2V0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW4sIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbjsgdGhlIGZpcnN0IGNvbHVtbidzIGluZGV4IGlzCisgICAgICogICAgICAgICAgICAxLgogICAgICAqIEBwYXJhbSB0aGVQcmVjaXNpb24KLSAgICAgKiAgICAgICAgICAgIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihpbnQgY29sdW1uSW5kZXgsIGludCB0aGVQcmVjaXNpb24pCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRm9yIHRoZSBjb2x1bW4gc3BlY2lmaWVkIGJ5IDxjb2RlPmNvbHVtbkluZGV4PC9jb2RlPiBkZWNsYXJlcyBob3cgbWFueQotICAgICAqIGRpZ2l0cyB0aGVyZSBzaG91bGQgYmUgYWZ0ZXIgYSBkZWNpbWFsIHBvaW50LgorICAgICAqIERlY2xhcmVzIGhvdyBtYW55IGRlY2ltYWwgZGlnaXRzIHRoZXJlIHNob3VsZCBiZSBhZnRlciBhIGRlY2ltYWwgcG9pbnQKKyAgICAgKiBmb3IgdGhlIGNvbHVtbiBzcGVjaWZpZWQgYnkge0Bjb2RlIGNvbHVtbkluZGV4fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW4sIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbjsgdGhlIGZpcnN0IGNvbHVtbidzIGluZGV4IGlzCisgICAgICogICAgICAgICAgICAxLgogICAgICAqIEBwYXJhbSB0aGVTY2FsZQotICAgICAqICAgICAgICAgICAgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsCi0gICAgICogICAgICAgICAgICBwb2ludAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2NhbGUoaW50IGNvbHVtbkluZGV4LCBpbnQgdGhlU2NhbGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTY2hlbWEgTmFtZSBmb3IgYSBzcGVjaWZpZWQgY29sdW1uIGluIHRoZSBSb3dTZXQKKyAgICAgKiBTZXRzIHRoZSBzY2hlbWEgbmFtZSBmb3IgYSBzcGVjaWZpZWQgY29sdW1uIGluIHRoZSB7QGNvZGUgUm93U2V0fS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW4sIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaGFzCi0gICAgICogICAgICAgICAgICBpbmRleCAxLgorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbjsgdGhlIGZpcnN0IGNvbHVtbidzIGluZGV4IGlzCisgICAgICogICAgICAgICAgICAxLgogICAgICAqIEBwYXJhbSB0aGVTY2hlbWFOYW1lCi0gICAgICogICAgICAgICAgICBhIFN0cmluZyBjb250YWluaW5nIHRoZSBzY2hlbWEgbmFtZQorICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgU3RyaW5nfSBjb250YWluaW5nIHRoZSBzY2hlbWEgbmFtZS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFOYW1lKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHRoZVNjaGVtYU5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGEgc3BlY2lmaWVkIGNvbHVtbiBjYW4gYmUgdXNlZCBpbiBhIHNlYXJjaCBpbnZvbHZpbmcgYSBXSEVSRQotICAgICAqIGNsYXVzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICogU2V0cyB3aGV0aGVyIGEgc3BlY2lmaWVkIGNvbHVtbiBjYW4gYmUgdXNlZCBpbiBhIHNlYXJjaCBpbnZvbHZpbmcgYQorICAgICAqIHtAY29kZSBXSEVSRX0gY2xhdXNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbiwgd2hlcmUgdGhlIGZpcnN0IGNvbHVtbiBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uOyB0aGUgZmlyc3QgY29sdW1uJ3MgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIDEuCiAgICAgICogQHBhcmFtIGlzU2VhcmNoYWJsZQotICAgICAqICAgICAgICAgICAgdHJ1ZSBvZiB0aGUgY29sdW1uIGNhbiBiZSB1c2VkIGluIGEgV0hFUkUgY2xhdXNlIHNlYXJjaCwgZmFsc2UKLSAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBvZiB0aGUgY29sdW1uIGNhbiBiZSB1c2VkIGluIGEge0Bjb2RlIFdIRVJFfQorICAgICAqICAgICAgICAgICAgY2xhdXNlIHNlYXJjaCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoYWJsZShpbnQgY29sdW1uSW5kZXgsIGJvb2xlYW4gaXNTZWFyY2hhYmxlKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgaWYgYSBzcGVjaWZpZWQgY29sdW1uIGNhbiBjb250YWluIHNpZ25lZCBudW1iZXJzCisgICAgICogU2V0cyBpZiBhIHNwZWNpZmllZCBjb2x1bW4gY2FuIGNvbnRhaW4gc2lnbmVkIG51bWJlcnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uLCB3aGVyZSB0aGUgZmlyc3QgY29sdW1uIGhhcwotICAgICAqICAgICAgICAgICAgaW5kZXggMS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjb2x1bW47IHRoZSBmaXJzdCBjb2x1bW4ncyBpbmRleCBpcworICAgICAqICAgICAgICAgICAgMS4KICAgICAgKiBAcGFyYW0gaXNTaWduZWQKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbHVtbiBjYW4gY29udGFpbiBzaWduZWQgbnVtYmVycywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNvbHVtbiBjYW4gY29udGFpbiBzaWduZWQgbnVtYmVycywge0Bjb2RlCisgICAgICogICAgICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpZ25lZChpbnQgY29sdW1uSW5kZXgsIGJvb2xlYW4gaXNTaWduZWQpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgVGFibGUgTmFtZSBmb3IgYSBzcGVjaWZpZWQgY29sdW1uIGluIHRoZSBSb3dTZXQKKyAgICAgKiBTZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIHNwZWNpZmllZCBjb2x1bW4gaW4gdGhlIHtAY29kZSBSb3dTZXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIGNvbHVtbiwgd2hlcmUgdGhlIGZpcnN0IGNvbHVtbiBoYXMKLSAgICAgKiAgICAgICAgICAgIGluZGV4IDEuCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgY29sdW1uOyB0aGUgZmlyc3QgY29sdW1uJ3MgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIDEuCiAgICAgICogQHBhcmFtIHRoZVRhYmxlTmFtZQotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgVGFibGUgTmFtZSBmb3IgdGhlIGNvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIHRhYmxlIG5hbWUgZm9yIHRoZSBjb2x1bW4uCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGFibGVOYW1lKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHRoZVRhYmxlTmFtZSkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0UmVhZGVyLmphdmEgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0UmVhZGVyLmphdmEKaW5kZXggYmMxN2RlZC4uZDRhOTAyZiAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL1Jvd1NldFJlYWRlci5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRSZWFkZXIuamF2YQpAQCAtMjAsMzEgKzIwLDQwIEBACiBpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwogCiAvKioKLSAqIEFuIGludGVyZmFjZSB3aGljaCBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBhIGRpc2Nvbm5lY3RlZCBSb3dTZXQgdG8gZ2V0Ci0gKiBkYXRhIGZyb20gYSBkYXRhIHNvdXJjZSBpbnRvIGl0cyByb3dzLiBUaGUgUm93U2V0IGNhbGxzIHRoZSBSb3dTZXRSZWFkZXIKLSAqIGludGVyZmFjZSB3aGVuIHRoZSBSb3dTZXQncyBleGVjdXRlIG1ldGhvZCBpcyBpbnZva2VkIC0gYSBSb3dTZXRSZWFkZXIgbXVzdAotICogZmlyc3QgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBSb3dTZXQgZm9yIHRoaXMgdG8gd29yay4KKyAqIEFuIGludGVyZmFjZSB3aGljaCBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBhIGRpc2Nvbm5lY3RlZCB7QGNvZGUgUm93U2V0fQorICogdG8gZ2V0IGRhdGEgZnJvbSBhIGRhdGFiYXNlIGludG8gaXRzIHJvd3MuIFRoZSB7QGNvZGUgUm93U2V0fSBjYWxscyB0aGUKKyAqIHtAY29kZSBSb3dTZXRSZWFkZXJ9IGludGVyZmFjZSB3aGVuIHRoZSB7QGNvZGUgUm93U2V0fSdzIGV4ZWN1dGUgbWV0aG9kIGlzCisgKiBpbnZva2VkIC0gYSB7QGNvZGUgUm93U2V0UmVhZGVyfSBtdXN0IGZpcnN0IGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUge0Bjb2RlCisgKiBSb3dTZXR9IGZvciB0aGlzIHRvIHdvcmsuCisgKiAKKyAqIEBzZWUgUm93U2V0CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSb3dTZXRSZWFkZXIgewogCiAgICAgLyoqCi0gICAgICogUmVhZHMgbmV3IGRhdGEgaW50byB0aGUgUm93U2V0LiBUaGUgY2FsbGluZyBSb3dTZXQgb2JqZWN0IG11c3QgaXRzZWxmCi0gICAgICogaW1wbGVtZW50IHRoZSBSb3dTZXRJbnRlcm5hbCBpbnRlcmZhY2UgYW5kIHRoZSBSb3dTZXRSZWFkZXIgbXVzdCBiZQotICAgICAqIHJlZ2lzdGVyZWQgYXMgYSBSZWFkZXIgb24gdGhlIFJvd1NldC4KKyAgICAgKiBSZWFkcyBuZXcgZGF0YSBpbnRvIHRoZSB7QGNvZGUgUm93U2V0fS4gVGhlIGNhbGxpbmcge0Bjb2RlIFJvd1NldH0gb2JqZWN0CisgICAgICogbXVzdCBpdHNlbGYgaW1wbGVtZW50IHRoZSB7QGNvZGUgUm93U2V0SW50ZXJuYWx9IGludGVyZmFjZSBhbmQgdGhlCisgICAgICoge0Bjb2RlIFJvd1NldFJlYWRlcn0gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgcmVhZGVyIG9uIHRoZSAKKyAgICAgKiB7QGNvZGUgUm93U2V0fS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBhZGRzIHJvd3MgaW50byB0aGUgY2FsbGluZyBSb3dTZXQuIFRoZSBSZWFkZXIgbWF5IGludm9rZSBhbnkKLSAgICAgKiBvZiB0aGUgUm93U2V0J3MgbWV0aG9kcyBleGNlcHQgZm9yIHRoZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBtZXRob2QKLSAgICAgKiAoY2FsbGluZyBleGVjdXRlIHdpbGwgY2F1c2UgYW4gU1FMRXhjZXB0aW9uIHRvIGJlIHRocm93bikuIEhvd2V2ZXIsIHdoZW4KLSAgICAgKiB0aGUgUmVhZGVyIGNhbGxzIHRoZSBSb3dTZXQncyBtZXRob2RzLCBubyBldmVudHMgYXJlIHNlbnQgdG8gbGlzdGVuZXJzIC0KLSAgICAgKiBhbnkgbGlzdGVuZXJzIGFyZSBpbmZvcm1lZCBieSB0aGUgY2FsbGluZyBSb3dTZXQncyBleGVjdXRlIG1ldGhvZCBvbmNlCi0gICAgICogdGhlIFJlYWRlciByZXR1cm5zIGZyb20gdGhlIHJlYWREYXRhIG1ldGhvZC4KKyAgICAgKiBUaGlzIG1ldGhvZCBhZGRzIHJvd3MgaW50byB0aGUgY2FsbGluZyB7QGNvZGUgUm93U2V0fS4gVGhlIHJlYWRlciBtYXkKKyAgICAgKiBpbnZva2UgYW55IG9mIHRoZSB7QGNvZGUgUm93U2V0fSdzIG1ldGhvZHMgZXhjZXB0IGZvciB0aGUge0Bjb2RlIGV4ZWN1dGV9CisgICAgICogbWV0aG9kIChjYWxsaW5nIHtAY29kZSBleGVjdXRlfSB3aWxsIGNhdXNlIGFuIHtAY29kZSBTUUxFeGNlcHRpb259IHRvIGJlCisgICAgICogdGhyb3duKS4gSG93ZXZlciwgd2hlbiB0aGUgcmVhZGVyIGNhbGxzIHRoZSB7QGNvZGUgUm93U2V0fSdzIG1ldGhvZHMsIG5vCisgICAgICogZXZlbnRzIGFyZSBzZW50IHRvIGxpc3RlbmVycyAtIGFueSBsaXN0ZW5lcnMgYXJlIGluZm9ybWVkIGJ5IHRoZSBjYWxsaW5nCisgICAgICoge0Bjb2RlIFJvd1NldH0ncyB7QGNvZGUgZXhlY3V0ZX0gbWV0aG9kIG9uY2UgdGhlIHJlYWRlciByZXR1cm5zIGZyb20gdGhlCisgICAgICoge0Bjb2RlIHJlYWREYXRhfSBtZXRob2QuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGVDYWxsZXIKLSAgICAgKiAgICAgICAgICAgIG11c3QgYmUgdGhlIGNhbGxpbmcgUm93U2V0IG9iamVjdCwgd2hpY2ggbXVzdCBoYXZlIGltcGxlbWVudGVkCi0gICAgICogICAgICAgICAgICB0aGUgUm93U2V0SW50ZXJuYWwgaW50ZXJmYWNlLgorICAgICAqICAgICAgICAgICAgbXVzdCBiZSB0aGUgY2FsbGluZyB7QGNvZGUgUm93U2V0fSBvYmplY3QsIHdoaWNoIG11c3QgaGF2ZQorICAgICAqICAgICAgICAgICAgaW1wbGVtZW50ZWQgdGhlIHtAY29kZSBSb3dTZXRJbnRlcm5hbH0gaW50ZXJmYWNlLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIG9yIGlmIHRoZSBSZWFkZXIKLSAgICAgKiAgICAgICAgICAgICBjYWxscyB0aGUgUm93U2V0LmV4ZWN1dGUgbWV0aG9kLgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUgcmVhZGVyCisgICAgICogICAgICAgICAgICAgY2FsbHMgdGhlIHtAbGluayBSb3dTZXQjZXhlY3V0ZSgpfSBtZXRob2QuCisgICAgICogQHNlZSBSb3dTZXRJbnRlcm5hbAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlYWREYXRhKFJvd1NldEludGVybmFsIHRoZUNhbGxlcikgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRXcml0ZXIuamF2YSBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9Sb3dTZXRXcml0ZXIuamF2YQppbmRleCBiYTk1ZjU5Li4zNDQ3M2IyIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvUm93U2V0V3JpdGVyLmphdmEKKysrIGIvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL1Jvd1NldFdyaXRlci5qYXZhCkBAIC0yMCwzMyArMjAsNDMgQEAKIGltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIHdoaWNoIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIGEgZGlzY29ubmVjdGVkIFJvd1NldCB0byBwdXQKLSAqIGRhdGEgdXBkYXRlcyBiYWNrIHRvIHRoZSBkYXRhIHNvdXJjZSBmcm9tIHdoaWNoIHRoZSBSb3dTZXQgd2FzIG9yaWdpbmFsbHkKLSAqIHBvcHVsYXRlZC4gQW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBpcyBjYWxsZWQgYSBXcml0ZXIuCisgKiBBbiBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgYSBkaXNjb25uZWN0ZWQge0Bjb2RlIFJvd1NldH0KKyAqIHRvIHB1dCBkYXRhIHVwZGF0ZXMgYmFjayB0byB0aGUgZGF0YSBzb3VyY2UgZnJvbSB3aGljaCB0aGUge0Bjb2RlIFJvd1NldH0gd2FzCisgKiBvcmlnaW5hbGx5IHBvcHVsYXRlZC4gQW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBpcyBjYWxsZWQgYQorICogd3JpdGVyLgogICogPHA+Ci0gKiBUaGUgV3JpdGVyIG11c3QgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgUm93U2V0J3MgZGF0YSBzb3VyY2UgYmVmb3JlCi0gKiB3cml0aW5nIHRoZSBkYXRhLiBUaGUgUm93U2V0IGNhbGxpbmcgdGhpcyBpbnRlcmZhY2UgbXVzdCBpbXBsZW1lbnQgdGhlCi0gKiBSb3dTZXRJbnRlcm5hbCBpbnRlcmZhY2UuCisgKiBUaGUgd3JpdGVyIG11c3QgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUge0Bjb2RlIFJvd1NldH0ncyBkYXRhYmFzZQorICogYmVmb3JlIHdyaXRpbmcgdGhlIGRhdGEuIFRoZSB7QGNvZGUgUm93U2V0fSBjYWxsaW5nIHRoaXMgaW50ZXJmYWNlIG11c3QKKyAqIGltcGxlbWVudCB0aGUge0Bjb2RlIFJvd1NldEludGVybmFsfSBpbnRlcmZhY2UuCisgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSBXcml0ZXIgbWF5IGVuY291bnRlciBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgdXBkYXRlZCBkYXRhIGJlaW5nIHdyaXR0ZW4KLSAqIGJhY2sgdG8gdGhlIGRhdGEgc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZCBpbiB0aGUgZGF0YSBzb3VyY2UuIEhvdyBhCi0gKiBjb25mbGljdCBvZiB0aGlzIGtpbmQgaXMgaGFuZGxlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIFdyaXRlci4KKyAqIFRoZSB3cml0ZXIgbWF5IGVuY291bnRlciBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgdXBkYXRlZCBkYXRhIG5lZWRzIHRvIGJlCisgKiB3cml0dGVuIGJhY2sgdG8gdGhlIGRhdGFiYXNlLCBidXQgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIHRoZXJlIGluIHRoZSBtZWFuCisgKiB0aW1lLiBIb3cgYSBjb25mbGljdCBvZiB0aGlzIGtpbmQgaXMgaGFuZGxlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyB3cml0ZXIuCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgUm93U2V0SW50ZXJuYWwKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJvd1NldFdyaXRlciB7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgY2hhbmdlcyBpbiB0aGUgUm93U2V0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJvd1NldFdyaXRlciBiYWNrIHRvCi0gICAgICogaXRzIGRhdGEgc291cmNlLgorICAgICAqIFdyaXRlcyBjaGFuZ2VzIG1hZGUgaW4gdGhlIHtAY29kZSBSb3dTZXR9LCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIHtAY29kZSBSb3dTZXRXcml0ZXJ9LCBiYWNrIHRvIHRoZSBkYXRhYmFzZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlUm93U2V0Ci0gICAgICogICAgICAgICAgICB0aGUgUm93U2V0IG9iamVjdC4gVGhpcyBSb3dTZXQgbXVzdCBhKSBJbXBsZW1lbnQgdGhlCi0gICAgICogICAgICAgICAgICBSb3dTZXRJbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGIpIGhhdmUgaGF2ZSB0aGlzIFJvd1NldFdyaXRlcgotICAgICAqICAgICAgICAgICAgcmVnaXN0ZXJlZCB3aXRoIGl0IGFuZCBjKSBtdXN0IGNhbGwgdGhpcyBtZXRob2QgaW50ZXJuYWxseQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kaWZpZWQgZGF0YSB3YXMgd3JpdHRlbiwgZmFsc2Ugb3RoZXJ3aXNlICh3aGljaAotICAgICAqICAgICAgICAgdHlwaWNhbGx5IGltcGxpZXMgc29tZSBmb3JtIG9mIGNvbmZsaWN0KQorICAgICAqICAgICAgICAgICAgYSByb3cgc2V0IHRoYXQgZnVsZmlsbHMgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKKyAgICAgKiAgICAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgICAgIDxsaT5pdCBtdXN0IGltcGxlbWVudCB0aGUge0Bjb2RlIFJvd1NldEludGVybmFsfSBpbnRlcmZhY2UsPC9saT4KKyAgICAgKiAgICAgICAgICAgIDxsaT5oYXZlIHRoaXMge0Bjb2RlIFJvd1NldFdyaXRlcn0gcmVnaXN0ZXJlZCB3aXRoIGl0LDwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+bXVzdCBjYWxsIHRoaXMgbWV0aG9kIGludGVybmFsbHkuPC9saT4KKyAgICAgKiAgICAgICAgICAgIDwvdWw+CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1vZGlmaWVkIGRhdGEgd2FzIHdyaXR0ZW4sIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSAod2hpY2ggdHlwaWNhbGx5IGltcGxpZXMgc29tZSBmb3JtIG9mIGNvbmZsaWN0KS4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZURhdGEoUm93U2V0SW50ZXJuYWwgdGhlUm93U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL3BhY2thZ2UuaHRtbCBiL3NxbC9zcmMvbWFpbi9qYXZhL2phdmF4L3NxbC9wYWNrYWdlLmh0bWwKaW5kZXggYzVkNWFlZS4uNmM5NTAwZiAxMDA2NDQKLS0tIGEvc3FsL3NyYy9tYWluL2phdmEvamF2YXgvc3FsL3BhY2thZ2UuaHRtbAorKysgYi9zcWwvc3JjL21haW4vamF2YS9qYXZheC9zcWwvcGFja2FnZS5odG1sCkBAIC00LDUgKzQsNiBAQAogICAgICAgUHJvdmlkZXMgZXh0ZW5zaW9ucyB0byB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgU1FMLWJhc2VkCiAgICAgICBkYXRhYmFzZXMuCiAgICAgPHA+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhIGIvc3FsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQppbmRleCA3N2I2NjliLi5iM2RiZDMyIDEwMDY0NAotLS0gYS9zcWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCisrKyBiL3NxbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKQEAgLTIxLDkgKzIxLDIyIEBACiAgKiBpZiB0aGlzIHRvb2wgcnVucyBhZ2Fpbi4gQmV0dGVyIG1ha2UgY2hhbmdlcyBpbiB0aGUgdGVtcGxhdGUgZmlsZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFJlZHVuZGFudCBjb2RlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vdyBjYWxsZWQgZnJvbSBNc2dIZWxwLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwuaW50ZXJuYWwubmxzOwogCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgYW5kIHJldHVybnMgdGhlbSwKQEAgLTQxLDggKzU0LDEwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1Jlc291cmNlID0KICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5zcWwuaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogICAgIC8qKgogICAgICAqIFJldHJpZXZlcyBhIG1lc3NhZ2Ugd2hpY2ggaGFzIG5vIGFyZ3VtZW50cy4KQEAgLTUyLDcgKzY3LDkgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgpAQCAtMTE5LDYgKzEzNiwxMiBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2csIGFyZ3MpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gRHVwbGljYXRlIGNvZGUgd2FzIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgTXNnSGVscC4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiB9CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0JhdGNoVXBkYXRlRXhjZXB0aW9uVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9CYXRjaFVwZGF0ZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAyNDE4ODhhLi4xNzM5MWM2YSAxMDA2NDQKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9CYXRjaFVwZGF0ZUV4Y2VwdGlvblRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0JhdGNoVXBkYXRlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnNxbC5CYXRjaFVwZGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMjYsMTEgKzMxLDIxIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdGZyYW1ld29yay5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UZXN0LlNlcmlhbGl6YWJsZUFzc2VydDsKIAorQFRlc3RUYXJnZXRDbGFzcyhCYXRjaFVwZGF0ZUV4Y2VwdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBCYXRjaFVwZGF0ZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKgogICAgICAqIENvbnN0cnVjdG9yVGVzdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCYXRjaFVwZGF0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYXRjaFVwZGF0ZUV4Y2VwdGlvbigpIHsKIAogICAgICAgICBpbnRbXSB0aGVGaW5hbFN0YXRlczEgPSB7IDAgfTsgLy8gRXJyb3IgQ29kZSBzdGF0ZQpAQCAtNzUsNiArOTAsMTUgQEAKICAgICAvKgogICAgICAqIENvbnN0cnVjdG9yVGVzdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCYXRjaFVwZGF0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnRbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEJhdGNoVXBkYXRlRXhjZXB0aW9uaW50QXJyYXkoKSB7CiAKICAgICAgICAgaW50W11bXSBpbml0MSA9IHsgeyAxLCAyLCAzIH0sIG51bGwgfTsKQEAgLTEyMSw2ICsxNDUsMTUgQEAKICAgICAvKgogICAgICAqIENvbnN0cnVjdG9yVGVzdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCYXRjaFVwZGF0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIGludFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hVcGRhdGVFeGNlcHRpb25TdHJpbmdpbnRBcnJheSgpIHsKIAogICAgICAgICBTdHJpbmdbXSBpbml0MSA9IHsgImEiLCAiMSIsICJ2YWxpZDEiLCAiLS0tLSIsICImdmFsaWQqIiwgbnVsbCwgIiIsCkBAIC0xNzYsNiArMjA5LDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvclRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmF0Y2hVcGRhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGludFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hVcGRhdGVFeGNlcHRpb25TdHJpbmdTdHJpbmdpbnRBcnJheSgpIHsKIAogICAgICAgICBTdHJpbmdbXSBpbml0MSA9IHsgImEiLCAiMSIsICJ2YWxpZDEiLCAiLS0tLSIsICImdmFsaWQqIiwgbnVsbCwgIiIsCkBAIC0yMzMsNiArMjc1LDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvclRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmF0Y2hVcGRhdGVFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50W10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYXRjaFVwZGF0ZUV4Y2VwdGlvblN0cmluZ1N0cmluZ2ludGludEFycmF5KCkgewogCiAgICAgICAgIFN0cmluZ1tdIGluaXQxID0geyAiYSIsICIxIiwgInZhbGlkMSIsICItLS0tIiwgIiZ2YWxpZCoiLCBudWxsLCAiIiwKQEAgLTI5MSw2ICszNDIsMTUgQEAKICAgICAvKgogICAgICAqIE1ldGhvZCB0ZXN0IGZvciBnZXRVcGRhdGVDb3VudHMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VXBkYXRlQ291bnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFVwZGF0ZUNvdW50cygpIHsKIAogICAgICAgICBCYXRjaFVwZGF0ZUV4Y2VwdGlvbiBhQmF0Y2hVcGRhdGVFeGNlcHRpb247CkBAIC0zNDQsNiArNDA0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlNlcmlhbGl6YXRpb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBCYXRjaFVwZGF0ZUV4Y2VwdGlvbiBvYmplY3QgPSBuZXcgQmF0Y2hVcGRhdGVFeGNlcHRpb24oKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihvYmplY3QsIEJBVENIVVBEQVRFRVhDRVBUSU9OX0NPTVBBUkFUT1IpOwpAQCAtMzUyLDYgKzQyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIlNlcmlhbGl6YXRpb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCB2ZW5kb3JDb2RlID0gMTA7CiAgICAgICAgIGludFtdIHVwZGF0ZUNvdW50cyA9IHsgMSwgMiwgMywgNCB9OwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9Db25uZWN0aW9uVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9Db25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IDIyNDA5ZjcuLjFlNTU3M2EgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvQ29ubmVjdGlvblRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0Nvbm5lY3Rpb25UZXN0LmphdmEKQEAgLTE3LDE3ICsxNywzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnNxbC5Db25uZWN0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIENvbm5lY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoKICAgICAgKiBQdWJsaWMgc3RhdGljcyB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkZpZWxkIHRlc3RpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY1N0YXRpY3MoKSB7CiAKICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHRoZVB1YmxpY1N0YXRpY3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RhdGFUcnVuY2F0aW9uVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9EYXRhVHJ1bmNhdGlvblRlc3QuamF2YQppbmRleCA2MjRkYTQxLi41ZWFlZjUyIDEwMDY0NAotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RhdGFUcnVuY2F0aW9uVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvRGF0YVRydW5jYXRpb25UZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEuc3FsLkRhdGFUcnVuY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0ZnJhbWV3b3JrLnNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblRlc3Q7CkBAIC0yNCwxMSArMjksMjEgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhEYXRhVHJ1bmNhdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBEYXRhVHJ1bmNhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKgogICAgICAqIENvbnN0cnVjdG9yVGVzdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEYXRhVHJ1bmNhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3MsIGJvb2xlYW4uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVRydW5jYXRpb25pbnRib29sZWFuYm9vbGVhbmludGludCgpIHsKIAogICAgICAgICBpbnRbXSBpbml0MSA9IHsgLTIxNDc0ODM2NDgsIDIxNDc0ODM2NDcsIDAsIDMyOTc1MTUwMiwgMzE4NTg3NTU3LApAQCAtOTYsNiArMTExLDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0SW5kZXgKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXgoKSB7CiAKICAgICAgICAgRGF0YVRydW5jYXRpb24gYURhdGFUcnVuY2F0aW9uOwpAQCAtMTY4LDYgKzE5MiwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGdldFBhcmFtZXRlcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJhbWV0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVyKCkgewogCiAgICAgICAgIERhdGFUcnVuY2F0aW9uIGFEYXRhVHJ1bmNhdGlvbjsKQEAgLTI0MCw2ICsyNzMsMTUgQEAKICAgICAvKgogICAgICAqIE1ldGhvZCB0ZXN0IGZvciBnZXRSZWFkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlYWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVhZCgpIHsKIAogICAgICAgICBEYXRhVHJ1bmNhdGlvbiBhRGF0YVRydW5jYXRpb247CkBAIC0zMTIsNiArMzU0LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0RGF0YVNpemUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGF0YVNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVNpemUoKSB7CiAKICAgICAgICAgRGF0YVRydW5jYXRpb24gYURhdGFUcnVuY2F0aW9uOwpAQCAtMzg0LDYgKzQzNSwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGdldFRyYW5zZmVyU2l6ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUcmFuc2ZlclNpemUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHJhbnNmZXJTaXplKCkgewogCiAgICAgICAgIERhdGFUcnVuY2F0aW9uIGFEYXRhVHJ1bmNhdGlvbjsKQEAgLTQ1Niw2ICs1MTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZXJpYWxpemF0aW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRGF0YVRydW5jYXRpb24gb2JqZWN0ID0gbmV3IERhdGFUcnVuY2F0aW9uKDEwLCB0cnVlLCB0cnVlLCAxMCwgMTApOwogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG9iamVjdCwgREFUQVRSVU5DQVRJT05fQ09NUEFSQVRPUik7CkBAIC00NjQsNiArNTMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBSSS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTZXJpYWxpemF0aW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBEYXRhVHJ1bmNhdGlvbiBvYmplY3QgPSBuZXcgRGF0YVRydW5jYXRpb24oMTAsIHRydWUsIHRydWUsIDEwLCAxMCk7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBvYmplY3QsIERBVEFUUlVOQ0FUSU9OX0NPTVBBUkFUT1IpOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9EYXRhYmFzZU1ldGFEYXRhVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9EYXRhYmFzZU1ldGFEYXRhVGVzdC5qYXZhCmluZGV4IGM5NzBjNzAuLmQ2ZmE5MmQgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvRGF0YWJhc2VNZXRhRGF0YVRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RhdGFiYXNlTWV0YURhdGFUZXN0LmphdmEKQEAgLTE3LDE3ICsxNywzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhLmNsYXNzKQogcHVibGljIGNsYXNzIERhdGFiYXNlTWV0YURhdGFUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoKICAgICAgKiBQdWJsaWMgc3RhdGljcyB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkZpZWxkIHRlc3RpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY1N0YXRpY3MoKSB7CiAKICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE51bWJlcj4gdGhlUHVibGljU3RhdGljcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTnVtYmVyPigpOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9EYXRlVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9EYXRlVGVzdC5qYXZhCmluZGV4IDkwM2I3N2YuLjc5YmZjNmMgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvRGF0ZVRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RhdGVUZXN0LmphdmEKQEAgLTE3LDEyICsxNywxNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNxbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoRGF0ZS5jbGFzcykKIC8qKgogICogSlVuaXQgVGVzdGNhc2UgZm9yIHRoZSBqYXZhLnNxbC5EYXRlIGNsYXNzCiAgKiAKQEAgLTEyNCw2ICsxMjksMTUgQEAKICAgICAvKgogICAgICAqIFRlc3Qgb2YgdGhlIERhdGUoIGxvbmcgKSBjb25zdHJ1Y3RvcgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlbG9uZygpIHsKIAogICAgICAgICBsb25nIGluaXQxW10gPSB7IFRJTUVfVEVTVERBVEUxLCBUSU1FX1RFU1REQVRFMiwgVElNRV9URVNUREFURTMsCkBAIC0xNDEsNiArMTU1LDE1IEBACiAgICAgICogVGVzdCBvZiB0aGUgKGRlcHJlY2F0ZWQpIGludCBEYXRlLmdldEhvdXJzKCkgbWV0aG9kIC0gd2hpY2ggYWx3YXlzIHRocm93cwogICAgICAqIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRIb3VycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEhvdXJzKCkgewogICAgICAgICBEYXRlIHRoZURhdGUgPSBuZXcgRGF0ZShUSU1FX1RFU1REQVRFMSk7CkBAIC0xNTYsNiArMTc5LDE1IEBACiAgICAgICogVGVzdCBvZiB0aGUgKGRlcHJlY2F0ZWQpIGludCBEYXRlLmdldE1pbnV0ZXMoKSBtZXRob2QgLSB3aGljaCBhbHdheXMKICAgICAgKiB0aHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1pbnV0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNaW51dGVzKCkgewogICAgICAgICBEYXRlIHRoZURhdGUgPSBuZXcgRGF0ZShUSU1FX1RFU1REQVRFMSk7CkBAIC0xNzEsNiArMjAzLDE1IEBACiAgICAgICogVGVzdCBvZiB0aGUgKGRlcHJlY2F0ZWQpIGludCBEYXRlLmdldFNlY29uZHMoKSBtZXRob2QgLSB3aGljaCBhbHdheXMKICAgICAgKiB0aHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlY29uZHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZWNvbmRzKCkgewogICAgICAgICBEYXRlIHRoZURhdGUgPSBuZXcgRGF0ZShUSU1FX1RFU1REQVRFMSk7CkBAIC0xODYsNiArMjI3LDE1IEBACiAgICAgICogVGVzdCBvZiB0aGUgKGRlcHJlY2F0ZWQpIERhdGUuc2V0SG91cnMoIGludCApIG1ldGhvZCAtIHdoaWNoIGFsd2F5cwogICAgICAqIHRocm93cyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SG91cnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRIb3VycygpIHsKICAgICAgICAgRGF0ZSB0aGVEYXRlID0gbmV3IERhdGUoVElNRV9URVNUREFURTEpOwpAQCAtMjAxLDYgKzI1MSwxNSBAQAogICAgICAqIFRlc3Qgb2YgdGhlIChkZXByZWNhdGVkKSBEYXRlLnNldE1pbnV0ZXMoIGludCApIG1ldGhvZCAtIHdoaWNoIGFsd2F5cwogICAgICAqIHRocm93cyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWludXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFNldE1pbnV0ZXMoKSB7CiAgICAgICAgIERhdGUgdGhlRGF0ZSA9IG5ldyBEYXRlKFRJTUVfVEVTVERBVEUxKTsKQEAgLTIxNyw2ICsyNzYsMTUgQEAKICAgICAgKiBUZXN0IG9mIHRoZSAoZGVwcmVjYXRlZCkgRGF0ZS5zZXRTZWNvbmRzKCBpbnQgKSBtZXRob2QgLSB3aGljaCBhbHdheXMKICAgICAgKiB0aHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNlY29uZHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTZWNvbmRzKCkgewogICAgICAgICBEYXRlIHRoZURhdGUgPSBuZXcgRGF0ZShUSU1FX1RFU1REQVRFMSk7CkBAIC0yMzMsNiArMzAxLDE1IEBACiAgICAgICogdGltZSB6b25lIHNldHRpbmcgYW5kIHRoaXMgdGVzdCBzZXRzIHRoZSB0aW1lIHpvbmUgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICogdG9TdHJpbmcoKSBtZXRob2QuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewogICAgICAgICAvLyBUaGlzIHRlc3QgaXMgc2V0IHVwIGZvciBHTVQgdGltZSB6b25lLCBzbyBuZWVkIHRvIHNldCB0aGUgdGltZSB6b25lCiAgICAgICAgIC8vIHRvIEdNVCBmaXJzdApAQCAtMjUwLDYgKzMyNywxNSBAQAogICAgICAqIHNldHRpbmdzIGFuZCBzZXRzIHVwIHRoZSB0aW1lIHpvbmUgdG8gb25lIG9mIGEgZ3JvdXAgb2Ygc3BlY2lmaWMgdGltZQogICAgICAqIHpvbmVzIGFuZCB0ZXN0cyB0aGUgbWV0aG9kIHVzaW5nIGVhY2ggb2YgdGhlc2UgdGltZSB6b25lcyBpbiB0dXJuLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lbG9uZygpIHsKIAogICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGFycmF5IG9mIHRlc3QgdGltZXpvbmVzCkBAIC0yNjIsNiArMzQ4LDE1IEBACiAgICAgLyoKICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHRlc3RpbmcgRGF0ZS5zZXRUaW1lIHdpdGggYSBzcGVjaWZpYyB0aW1lIHpvbmUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGltZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwcml2YXRlIHZvaWQgdGVzdFNldFRpbWVsb25nKFN0cmluZyB0aW1lWm9uZU5hbWUsIFN0cmluZ1tdIGRhdGVBcnJheSkgewogCiAgICAgICAgIGlmICh0aW1lWm9uZU5hbWUgIT0gbnVsbCkgewpAQCAtMjgyLDYgKzM3NywxNSBAQAogICAgICAqIFRlc3Qgb2YgdGhlIERhdGUudmFsdWVPZiggU3RyaW5nICkgbWV0aG9kIFRoaXMgdGVzdCBpcyBub3QgZGVwZW5kZW50IG9uCiAgICAgICogdGhlIGRlZmF1bHQgVGltZSBab25lIHNldHRpbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mKCkgewogICAgICAgICBTdHJpbmcgU1FMX05PVFZBTElEMSA9ICJBQkNERUYiOyAvLyBJbnZhbGlkIGRhdGUgc3RyaW5nCiAgICAgICAgIFN0cmluZyBTUUxfTk9UVkFMSUQyID0gIjEyMzIxLjQzLjU2IjsgLy8gSW52YWxpZCBkYXRlIHN0cmluZwpAQCAtMzEwLDYgKzQxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRlI3ZhbHVlT2YoU3RyaW5nICkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdmFsdWVPZl9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CiAgICAgICAgIHRyeXsKICAgICAgICAgICAgIERhdGUudmFsdWVPZigiMTk5Ni0xMC0wNy0wMSIpOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDczYjQxNWIuLjJmMTQyOTAgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvRHJpdmVyTWFuYWdlclRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RyaXZlck1hbmFnZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKQEAgLTMxLDcgKzM2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhEcml2ZXJNYW5hZ2VyLmNsYXNzKQogLyoqCiAgKiBKVW5pdCBUZXN0Y2FzZSBmb3IgdGhlIGphdmEuc3FsLkRyaXZlck1hbmFnZXIgY2xhc3MKICAqIApAQCAtNzUsNiArODAsMTUgQEAKICAgICAgKiBUZXN0IGZvciB0aGUgbWV0aG9kIERyaXZlck1hbmFnZXIuZGVyZWdpc3RlckRyaXZlcgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZXJlZ2lzdGVyRHJpdmVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0RyaXZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlcmVnaXN0ZXJEcml2ZXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gRmlyc3QgZ2V0IG9uZSBvZiB0aGUgZHJpdmVycyBsb2FkZWQgYnkgdGhlIHRlc3QKICAgICAgICAgRHJpdmVyIGFEcml2ZXI7CkBAIC0xNTksNiArMTczLDE1IEBACiAgICAgc3RhdGljIFN0cmluZ1tdIGludmFsaWRDb25uZWN0aW9uVVJMcyA9IHsgaW52YWxpZENvbm5lY3Rpb25VUkwyLAogICAgICAgICAgICAgaW52YWxpZENvbm5lY3Rpb25VUkwzIH07CiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29ubmVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25uZWN0aW9uU3RyaW5nKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbm5lY3Rpb24gdGhlQ29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgIC8vIHZhbGlkQ29ubmVjdGlvbiAtIG5vIHVzZXIgJiBwYXNzd29yZCByZXF1aXJlZApAQCAtMTgwLDYgKzIwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyI2dldENvbm5lY3Rpb24oU3RyaW5nLCBQcm9wZXJ0aWVzKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb25uZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvcGVydGllcy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb25uZWN0aW9uX0xTdHJpbmdMUHJvcGVydGllcygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbigiZmZmIiwgLy8kTk9OLU5MUy0xJApAQCAtMjAxLDYgKzIzMywxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKFN0cmluZywgUHJvcGVydGllcykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29ubmVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3BlcnRpZXMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25uZWN0aW9uU3RyaW5nUHJvcGVydGllcygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgdmFsaWRVUkwxID0gImpkYmM6bWlrZXMxOmRhdGEyIjsKICAgICAgICAgU3RyaW5nIHZhbGlkdXNlcjEgPSAidGhldXNlciI7CkBAIC0yNDcsNiArMjg4LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nLCBTdHJpbmcsIFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29ubmVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubmVjdGlvblN0cmluZ1N0cmluZ1N0cmluZygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgdmFsaWRVUkwxID0gImpkYmM6bWlrZXMxOmRhdGEyIjsKICAgICAgICAgU3RyaW5nIHZhbGlkdXNlcjEgPSAidGhldXNlciI7CkBAIC0yOTgsNiArMzQ4LDE1IEBACiAKICAgICBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbk1zZzEgPSAiTm8gc3VpdGFibGUgZHJpdmVyIjsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREcml2ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RHJpdmVyKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiB2YWxpZFVSTHMpIHsKICAgICAgICAgICAgIERyaXZlciB2YWxpZERyaXZlciA9IERyaXZlck1hbmFnZXIuZ2V0RHJpdmVyKGVsZW1lbnQpOwpAQCAtMzE2LDYgKzM3NSwxNSBAQAogCiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3RHZXREcml2ZXIoKQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERyaXZlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RHJpdmVycygpIHsKICAgICAgICAgLy8gTG9hZCBhIGRyaXZlciBtYW5hZ2VyCiAgICAgICAgIEVudW1lcmF0aW9uPERyaXZlcj4gZHJpdmVyTGlzdCA9IERyaXZlck1hbmFnZXIuZ2V0RHJpdmVycygpOwpAQCAtMzMzLDExICs0MDEsMjkgQEAKIAogICAgIHN0YXRpYyBpbnQgdGltZW91dDEgPSAyNTsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2dpblRpbWVvdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9naW5UaW1lb3V0KCkgewogICAgICAgICBEcml2ZXJNYW5hZ2VyLnNldExvZ2luVGltZW91dCh0aW1lb3V0MSk7CiAgICAgICAgIGFzc2VydEVxdWFscyh0aW1lb3V0MSwgRHJpdmVyTWFuYWdlci5nZXRMb2dpblRpbWVvdXQoKSk7CiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3RHZXRMb2dpblRpbWVvdXQoKQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ1N0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvZ1N0cmVhbSgpIHsKICAgICAgICAgYXNzZXJ0TnVsbChEcml2ZXJNYW5hZ2VyLmdldExvZ1N0cmVhbSgpKTsKQEAgLTM0OCw2ICs0MzQsMTUgQEAKICAgICAgICAgRHJpdmVyTWFuYWdlci5zZXRMb2dTdHJlYW0obnVsbCk7CiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3RHZXRMb2dTdHJlYW0oKQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvZ1dyaXRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dXcml0ZXIoKSB7CiAgICAgICAgIGFzc2VydE51bGwoRHJpdmVyTWFuYWdlci5nZXRMb2dXcml0ZXIoKSk7CiAKQEAgLTM2MCw2ICs0NTUsMTUgQEAKIAogICAgIHN0YXRpYyBTdHJpbmcgdGVzdE1lc3NhZ2UgPSAiRHJpdmVyTWFuYWdlclRlc3Q6IHRlc3QgbWVzc2FnZSBmb3IgcHJpbnQgc3RyZWFtIjsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmludGxuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRsbigpIHsKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0UHJpbnRsbiIpOwpAQCAtMzg0LDYgKzQ4OCwxNSBAQAogICAgICAgICBEcml2ZXJNYW5hZ2VyLnNldExvZ1N0cmVhbShudWxsKTsKICAgICB9IC8vIGVuZCBtZXRob2QgdGVzdFByaW50bG4oKQogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uL0NsYXNzTm90Rm91bmRFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVnaXN0ZXJEcml2ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7RHJpdmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJEcml2ZXIoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKICAgICAgICAgICAgIFNRTEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBFWFRSQV9EUklWRVJfTkFNRSA9ICJvcmcuYXBhY2hlLmhhcm1vbnkuc3FsLnRlc3RzLmphdmEuc3FsLlRlc3RIZWxwZXJfRHJpdmVyMyI7CkBAIC00MTQsNiArNTI3LDE1IEBACiAKICAgICBzdGF0aWMgaW50IGludmFsaWRUaW1lb3V0MSA9IC0xMDsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMb2dpblRpbWVvdXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9naW5UaW1lb3V0KCkgewogICAgICAgICBmb3IgKGludCBlbGVtZW50IDogdmFsaWRUaW1lb3V0cykgewogICAgICAgICAgICAgRHJpdmVyTWFuYWdlci5zZXRMb2dpblRpbWVvdXQoZWxlbWVudCk7CkBAIC00MjksNiArNTUxLDE1IEBACiAKICAgICBzdGF0aWMgUHJpbnRTdHJlYW0gdGVzdFByaW50U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG91dHB1dFN0cmVhbTIpOwogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldExvZ1N0cmVhbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtQcmludFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9nU3RyZWFtKCkgewogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RTZXRMb2dTdHJlYW0iKTsKQEAgLTQ2OCw2ICs1OTksMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0IGZvciB0aGUgc2V0TG9nV3JpdGVyIG1ldGhvZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMb2dXcml0ZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJpbnRXcml0ZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMb2dXcml0ZXIoKSB7CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdFNldExvZ1dyaXRlciIpOwogICAgICAgICBEcml2ZXJNYW5hZ2VyLnNldExvZ1dyaXRlcih0ZXN0UHJpbnRXcml0ZXIpOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9Ecml2ZXJQcm9wZXJ0eUluZm9UZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RyaXZlclByb3BlcnR5SW5mb1Rlc3QuamF2YQppbmRleCBlYzM4OTg4Li44ZTkzY2JlIDEwMDY0NAotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RyaXZlclByb3BlcnR5SW5mb1Rlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL0RyaXZlclByb3BlcnR5SW5mb1Rlc3QuamF2YQpAQCAtMTcsMTEgKzE3LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc3FsLkRyaXZlclByb3BlcnR5SW5mbzsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKERyaXZlclByb3BlcnR5SW5mby5jbGFzcykKIC8qKgogICogSlVuaXQgVGVzdGNhc2UgZm9yIHRoZSBqYXZhLnNxbC5Ecml2ZXJQcm9wZXJ0eUluZm8gY2xhc3MKICAqIApAQCAtMzIsNiArMzcsMTUgQEAKICAgICAvKgogICAgICAqIFB1YmxpYyBzdGF0aWNzIHRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY1N0YXRpY3MoKSB7CiAKICAgICB9IC8vIGVuZCBtZXRob2QgdGVzdFB1YmxpY1N0YXRpY3MKQEAgLTM5LDYgKzUzLDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvciB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRyaXZlclByb3BlcnR5SW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERyaXZlclByb3BlcnR5SW5mb1N0cmluZ1N0cmluZygpIHsKIAogICAgICAgICBEcml2ZXJQcm9wZXJ0eUluZm8gYURyaXZlclByb3BlcnR5SW5mbyA9IG5ldyBEcml2ZXJQcm9wZXJ0eUluZm8oCkBAIC02Nyw2ICs5MCwxNSBAQAogCiAgICAgc3RhdGljIFN0cmluZyB1cGRhdGVOYW1lID0gInVwZGF0ZU5hbWUiOwogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkZpZWxkIHRlc3RpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY0ZpZWxkcygpIHsKIAogICAgICAgICAvLyBDb25zdHJ1Y3RvciBoZXJlLi4uCmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1BhcmFtZXRlck1ldGFEYXRhVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9QYXJhbWV0ZXJNZXRhRGF0YVRlc3QuamF2YQppbmRleCBkM2UwMDBkLi5hNDU1YWY0IDEwMDY0NAotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1BhcmFtZXRlck1ldGFEYXRhVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvUGFyYW1ldGVyTWV0YURhdGFUZXN0LmphdmEKQEAgLTE3LDE3ICsxNywzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnNxbC5QYXJhbWV0ZXJNZXRhRGF0YS5jbGFzcykKIHB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJNZXRhRGF0YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKgogICAgICAqIFB1YmxpYyBzdGF0aWNzIHRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRmllbGQgdGVzdGluZyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljU3RhdGljcygpIHsKIAogICAgICAgICBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gdGhlUHVibGljU3RhdGljcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGFUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1Jlc3VsdFNldE1ldGFEYXRhVGVzdC5qYXZhCmluZGV4IDA3YTI1YzIuLjMzODViYTMgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGFUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9SZXN1bHRTZXRNZXRhRGF0YVRlc3QuamF2YQpAQCAtMTcsMTcgKzE3LDMyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhLmNsYXNzKQogcHVibGljIGNsYXNzIFJlc3VsdFNldE1ldGFEYXRhVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qCiAgICAgICogUHVibGljIHN0YXRpY3MgdGVzdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJGaWVsZCB0ZXN0aW5nIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIUNvbnN0YW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaWNTdGF0aWNzKCkgewogCiAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiB0aGVQdWJsaWNTdGF0aWNzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9SZXN1bHRTZXRUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1Jlc3VsdFNldFRlc3QuamF2YQppbmRleCAyNmU2MWZlLi5jZjEzOTI5IDEwMDY0NAotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1Jlc3VsdFNldFRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1Jlc3VsdFNldFRlc3QuamF2YQpAQCAtMTcsMTcgKzE3LDMyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKGphdmEuc3FsLlJlc3VsdFNldC5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZXN1bHRTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoKICAgICAgKiBQdWJsaWMgc3RhdGljcyB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkZpZWxkIHRlc3RpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY1N0YXRpY3MoKSB7CiAKICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHRoZVB1YmxpY1N0YXRpY3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1NRTEV4Y2VwdGlvblRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU1FMRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IGJiNzMzNDMuLjljZTJlOTkgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU1FMRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU1FMRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CkBAIC0yNyw2ICszMiw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU1FMRXhjZXB0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIFNRTEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBzdGF0aWMgbG9uZyB0aGVGaXhlZFNVSUQgPSAyMTM1MjQ0MDk0Mzk2MzMxNDg0TDsKQEAgLTM0LDYgKzQwLDE1IEBACiAgICAgLyoKICAgICAgKiBTVUlEIHRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGaWVsZCB0ZXN0aW5nIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIUNvbnN0YW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTVUlEKCkgewogCiAgICAgICAgIHRyeSB7CkBAIC01Miw2ICs2NywxNSBAQAogICAgIC8qCiAgICAgICogQ29uc3RydWN0b3JUZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNRTEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U1FMRXhjZXB0aW9uU3RyaW5nU3RyaW5naW50KCkgewogCiAgICAgICAgIFN0cmluZ1tdIGluaXQxID0geyAiYSIsICIxIiwgInZhbGlkMSIsICItLS0tIiwgIiZ2YWxpZCoiLCAiMSIsICJhIiwKQEAgLTEwNCw2ICsxMjgsMTUgQEAKICAgICAvKgogICAgICAqIENvbnN0cnVjdG9yVGVzdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTUUxFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTUUxFeGNlcHRpb25TdHJpbmdTdHJpbmcoKSB7CiAKICAgICAgICAgU3RyaW5nW10gaW5pdDEgPSB7ICJhIiwgIjEiLCAidmFsaWQxIiwgIi0tLS0iLCAiJnZhbGlkKiIsIG51bGwsICIiLApAQCAtMTU0LDYgKzE4NywxNSBAQAogICAgIC8qCiAgICAgICogQ29uc3RydWN0b3JUZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNRTEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTUUxFeGNlcHRpb25TdHJpbmcoKSB7CiAKICAgICAgICAgU3RyaW5nW10gaW5pdDEgPSB7ICJhIiwgIjEiLCAidmFsaWQxIiwgIi0tLS0iLCAiJnZhbGlkKiIsIG51bGwsIApAQCAtMjAzLDYgKzI0NSwxNSBAQAogICAgIC8qCiAgICAgICogQ29uc3RydWN0b3JUZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNRTEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTUUxFeGNlcHRpb24oKSB7CiAKICAgICAgICAgU3RyaW5nW10gdGhlRmluYWxTdGF0ZXMxID0geyBudWxsIH07CkBAIC0yNDUsNiArMjk2LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0RXJyb3JDb2RlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVycm9yQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFcnJvckNvZGUoKSB7CiAKICAgICAgICAgU1FMRXhjZXB0aW9uIGFTUUxFeGNlcHRpb247CkBAIC0yOTgsNiArMzU4LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0TmV4dEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROZXh0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5leHRFeGNlcHRpb24oKSB7CiAKICAgICAgICAgU1FMRXhjZXB0aW9uIGFTUUxFeGNlcHRpb247CkBAIC0zNTQsNiArNDIzLDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0U1FMU3RhdGUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U1FMU3RhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U1FMU3RhdGUoKSB7CiAKICAgICAgICAgU1FMRXhjZXB0aW9uIGFTUUxFeGNlcHRpb247CkBAIC00MDcsNiArNDg1LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3Igc2V0TmV4dEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROZXh0RXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NRTEV4Y2VwdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldE5leHRFeGNlcHRpb25TUUxFeGNlcHRpb24oKSB7CiAKICAgICAgICAgU1FMRXhjZXB0aW9uW10gcGFybTEgPSB7IG5ldyBTUUxFeGNlcHRpb24oKSwgbnVsbCwgbmV3IFNRTEV4Y2VwdGlvbigpLApAQCAtNDYxLDYgKzU0OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJTZXJpYWxpemF0aW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU1FMRXhjZXB0aW9uIG9iamVjdCA9IG5ldyBTUUxFeGNlcHRpb24oKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihvYmplY3QsIFNRTEVYQ0VQVElPTl9DT01QQVJBVE9SKTsKQEAgLTQ2OSw2ICs1NjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJTZXJpYWxpemF0aW9uIHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvbkdvbGRlbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNRTEV4Y2VwdGlvbiBuZXh0U1FMRXhjZXB0aW9uID0gbmV3IFNRTEV4Y2VwdGlvbigibmV4dFJlYXNvbiIsCkBAIC01MTYsNiArNjIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLlNRTEV4Y2VwdGlvbiNzZXROZXh0RXhjZXB0aW9uKGphdmEuc3FsLlNRTEV4Y2VwdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmV4dEV4Y2VwdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTUUxFeGNlcHRpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmV4dEV4Y2VwdGlvbl9MU1FMRXhjZXB0aW9uKCkgewogICAgICAgICBTUUxFeGNlcHRpb24gc2UxID0gbmV3IFNRTEV4Y2VwdGlvbigicmVhc29uIiAsICJTUUxTdGF0ZSIgLCAxKTsKICAgICAgICAgU1FMRXhjZXB0aW9uIHNlMiA9IG5ldyBTUUxFeGNlcHRpb24oInJlYXNvbiIgLCAiU1FMU3RhdGUiICwgMik7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1NRTFBlcm1pc3Npb25UZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1NRTFBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggMGNmMWQ0NS4uMDBmMzNlOCAxMDA2NDQKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9TUUxQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU1FMUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMTcsMTAgKzE3LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc3FsLlNRTFBlcm1pc3Npb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoU1FMUGVybWlzc2lvbi5jbGFzcykKIC8qKgogICogSlVuaXQgVGVzdGNhc2UgZm9yIHRoZSBqYXZhLnNxbC5TUUxQZXJtaXNzaW9uIGNsYXNzCiAgKiAKQEAgLTM1LDYgKzQwLDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvciB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbC9pbnZhbGlkIHBhcmFtZXRlcnMgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU1FMUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNRTFBlcm1pc3Npb25TdHJpbmdTdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZyB2YWxpZE5hbWUgPSAic2V0TG9nIjsKICAgICAgICAgU3RyaW5nIHZhbGlkQWN0aW9ucyA9ICJ0aGVBY3Rpb25zIjsKQEAgLTUxLDYgKzY1LDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvciB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU1FMUGVybWlzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTUUxQZXJtaXNzaW9uU3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgdmFsaWROYW1lID0gInNldExvZyI7CiAKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU1FMV2FybmluZ1Rlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU1FMV2FybmluZ1Rlc3QuamF2YQppbmRleCBkMDk5OGNlLi5lYjM1MDYyIDEwMDY0NAotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1NRTFdhcm5pbmdUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9TUUxXYXJuaW5nVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKQEAgLTI2LDExICszMSwyMSBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFNRTFdhcm5pbmcuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU1FMV2FybmluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKgogICAgICAqIENvbnN0cnVjdG9yVGVzdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTUUxXYXJuaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNRTFdhcm5pbmcoKSB7CiAKICAgICAgICAgU3RyaW5nW10gdGhlRmluYWxTdGF0ZXMxID0geyBudWxsIH07CkBAIC03Myw2ICs4OCwxNSBAQAogICAgIC8qCiAgICAgICogQ29uc3RydWN0b3JUZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNRTFdhcm5pbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U1FMV2FybmluZ1N0cmluZygpIHsKIAogICAgICAgICBTdHJpbmdbXSBpbml0MSA9IHsgImEiLCAiMSIsICJ2YWxpZDEiLCAiLS0tLSIsICImdmFsaWQqIiwgbnVsbCwgCkBAIC0xMjEsNiArMTQ1LDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvclRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU1FMV2FybmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNRTFdhcm5pbmdTdHJpbmdTdHJpbmcoKSB7CiAKICAgICAgICAgU3RyaW5nW10gaW5pdDEgPSB7ICJhIiwgIjEiLCAidmFsaWQxIiwgIi0tLS0iLCAiJnZhbGlkKiIsIG51bGwsICIiLApAQCAtMTcwLDYgKzIwMywxNSBAQAogICAgIC8qCiAgICAgICogQ29uc3RydWN0b3JUZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNRTFdhcm5pbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNRTFdhcm5pbmdTdHJpbmdTdHJpbmdpbnQoKSB7CiAKICAgICAgICAgU3RyaW5nW10gaW5pdDEgPSB7ICJhIiwgIjEiLCAidmFsaWQxIiwgIi0tLS0iLCAiJnZhbGlkKiIsICItLS0tIiwKQEAgLTIyMiw2ICsyNjQsMTUgQEAKICAgICAvKgogICAgICAqIE1ldGhvZCB0ZXN0IGZvciBnZXROZXh0V2FybmluZwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5leHRXYXJuaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5leHRXYXJuaW5nKCkgewogCiAgICAgICAgIFNRTFdhcm5pbmcgYVNRTFdhcm5pbmc7CkBAIC0yNzEsNiArMzIyLDE5IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3Igc2V0TmV4dFdhcm5pbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROZXh0V2FybmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTUUxXYXJuaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5leHRXYXJuaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldE5leHRXYXJuaW5nU1FMV2FybmluZygpIHsKIAogICAgICAgICBTUUxXYXJuaW5nW10gcGFybTEgPSB7IG5ldyBTUUxXYXJuaW5nKCksIG51bGwgfTsKQEAgLTMxOCw2ICszODIsMTkgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuU1FMV2FybmluZyNzZXROZXh0V2FybmluZyhqYXZhLnNxbC5TUUxXYXJuaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5leHRXYXJuaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NRTFdhcm5pbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmV4dFdhcm5pbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5leHRXYXJuaW5nX1NRTFdhcm5pbmcoKSB7CiAgICAgICAgIFNRTFdhcm5pbmcgc3cgPSBuZXcgU1FMV2FybmluZygicmVhc29uIiwgIlNRTFN0YXRlIiwgMCk7CiAgICAgICAgIFNRTFdhcm5pbmcgc3cxID0gbmV3IFNRTFdhcm5pbmcoInJlYXNvbiIsICJTUUxTdGF0ZSIsIDEpOwpAQCAtMzUyLDYgKzQyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlcmlhbGl6YXRpb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNRTFdhcm5pbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU1FMV2FybmluZyBvYmplY3QgPSBuZXcgU1FMV2FybmluZygpOwogICAgICAgICBTZXJpYWxpemF0aW9uVGVzdC52ZXJpZnlTZWxmKG9iamVjdCwgU1FMV0FSTklOR19DT01QQVJBVE9SKTsKQEAgLTM2MCw2ICs0NDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFJJLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlcmlhbGl6YXRpb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNRTFdhcm5pbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25Db21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNRTFdhcm5pbmcgb2JqZWN0ID0gbmV3IFNRTFdhcm5pbmcoKTsKICAgICAgICAgCmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1N0YXRlbWVudFRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU3RhdGVtZW50VGVzdC5qYXZhCmluZGV4IGQwZmViZWIuLjVhY2E1ZTMgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU3RhdGVtZW50VGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvU3RhdGVtZW50VGVzdC5qYXZhCkBAIC0xNywxNyArMTcsMzIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc3FsLnRlc3RzLmphdmEuc3FsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoamF2YS5zcWwuU3RhdGVtZW50LmNsYXNzKQogcHVibGljIGNsYXNzIFN0YXRlbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKgogICAgICAqIFB1YmxpYyBzdGF0aWNzIHRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRmllbGQgdGVzdGluZyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljU3RhdGljcygpIHsKIAogICAgICAgICBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gdGhlUHVibGljU3RhdGljcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvVGVzdEhlbHBlcl9Ecml2ZXJNYW5hZ2VyLmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1Rlc3RIZWxwZXJfRHJpdmVyTWFuYWdlci5qYXZhCmluZGV4IDI5OWMzM2EuLmY4MjI3MWUgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvVGVzdEhlbHBlcl9Ecml2ZXJNYW5hZ2VyLmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9UZXN0SGVscGVyX0RyaXZlck1hbmFnZXIuamF2YQpAQCAtMTcsMTIgKzE3LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuc3FsLkRyaXZlcjsKIGltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOwogaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhEcml2ZXJNYW5hZ2VyLmNsYXNzKQogLyoqCiAgKiBIZWxwZXIgY2xhc3MgZm9yIHRoZSBEcml2ZXIgbWFuYWdlciB0ZXMgLSBpdCBhbGxvd3MgdGhlIHRlc3QgY29kZSB0byBiZQogICogbG9hZGVkIHVuZGVyIGEgZGlmZmVyZW50IGNsYXNzbG9hZGVyLCBuZWNlc3NhcnkgZm9yIHRlc3RpbmcgdGhlCmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1RpbWVUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1RpbWVUZXN0LmphdmEKaW5kZXggYTUyM2IzOS4uOTIwMTFlZSAxMDA2NDQKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9UaW1lVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvVGltZVRlc3QuamF2YQpAQCAtMTcsMTEgKzE3LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc3FsLlRpbWU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFRpbWUuY2xhc3MpCiAvKioKICAqIEpVbml0IFRlc3RjYXNlIGZvciB0aGUgamF2YS5zcWwuVGltZSBjbGFzcwogICogCkBAIC03Myw2ICs3OSwxNSBAQAogICAgICAgICAgICAgU1RSSU5HX0pQX0FSUkFZIH07CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRlcHJlY2F0ZWQgbWV0aG9kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGltZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZWludGludGludCgpIHsKICAgICAgICAgVGltZSB0aGVUaW1lID0gbmV3IFRpbWUoMTAsIDQ1LCAyMCk7CiAKQEAgLTgwLDYgKzk1LDE1IEBACiAgICAgICAgIGFzc2VydE5vdE51bGwodGhlVGltZSk7CiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3RUaW1laW50aW50aW50KCkKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkluY29ycmVjdCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiVGltZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtsb25nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZSgpIHsKICAgICAgICAgVGltZSB0aGVUaW1lID0gbmV3IFRpbWUoVElNRV9URVNUMSk7CiAKQEAgLTg3LDYgKzExMSwxNSBAQAogICAgICAgICBhc3NlcnROb3ROdWxsKHRoZVRpbWUpOwogICAgIH0gLy8gZW5kIG1ldGhvZCB0ZXN0VGltZSgpCiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdGltZXpvbmVzIHRlc3RpbmcgdGhlIFN0cmluZyBjb252ZXJzaW9uIGZvciBlYWNoCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9BUlJBWS5sZW5ndGg7IGkrKykgewpAQCAtOTUsNiArMTI4LDE1IEBACiAKICAgICB9IC8vIGVuZCBtZXRob2QgdGVzdAogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RUb1N0cmluZyhTdHJpbmcgdGltZVpvbmUsIGxvbmdbXSB0aGVUaW1lcywKICAgICAgICAgICAgIFN0cmluZ1tdIHRoZVRpbWVTdHJpbmdzKSB7CiAgICAgICAgIC8vIFNldCB0aGUgdGltZXpvbmUKQEAgLTExMyw2ICsxNTUsMTUgQEAKICAgICAvKgogICAgICAqIE1ldGhvZCB0ZXN0IGZvciB2YWx1ZU9mCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZlN0cmluZygpIHsKICAgICAgICAgVGltZVpvbmUuc2V0RGVmYXVsdChUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwogCkBAIC0xMzgsNiArMTg5LDE1IEBACiAKICAgICB9IC8vIGVuZCBtZXRob2QgdGVzdFZhbHVlT2ZTdHJpbmcKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lKCkgewogICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgdGltZXpvbmUgaXMgc2V0IHRvIEdNVAogICAgICAgICBUaW1lWm9uZS5zZXREZWZhdWx0KFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CkBAIC0xNDksNiArMjA5LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhTVFJJTkdfVEVTVDIsIHRoZVRpbWUudG9TdHJpbmcoKSk7CiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3RTZXRUaW1lKCkKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0ZSgpIHsKICAgICAgICAgVGltZSB0aGVUaW1lID0gbmV3IFRpbWUoVElNRV9URVNUMSk7CkBAIC0xNjIsNiArMjMxLDE1IEBACiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3RTZXREYXRlKCkKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1vbnRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldE1vbnRoKCkgewogICAgICAgICBUaW1lIHRoZVRpbWUgPSBuZXcgVGltZShUSU1FX1RFU1QxKTsKIApAQCAtMTc0LDYgKzI1MiwxNSBAQAogICAgIH0gLy8gZW5kIG1ldGhvZCB0ZXN0U2V0TW9udGgoKQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0WWVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRZZWFyKCkgewogICAgICAgICBUaW1lIHRoZVRpbWUgPSBuZXcgVGltZShUSU1FX1RFU1QxKTsKIApAQCAtMTg2LDYgKzI3MywxNSBAQAogICAgIH0gLy8gZW5kIG1ldGhvZCB0ZXN0U2V0WWVhcigpCiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldERhdGUoKSB7CiAgICAgICAgIFRpbWUgdGhlVGltZSA9IG5ldyBUaW1lKFRJTUVfVEVTVDEpOwogCkBAIC0xOTgsNiArMjk0LDE1IEBACiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3QKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERheSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREYXkoKSB7CiAgICAgICAgIFRpbWUgdGhlVGltZSA9IG5ldyBUaW1lKFRJTUVfVEVTVDEpOwogCkBAIC0yMTAsNiArMzE1LDE1IEBACiAgICAgfSAvLyBlbmQgbWV0aG9kIHRlc3QKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1vbnRoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1vbnRoKCkgewogICAgICAgICBUaW1lIHRoZVRpbWUgPSBuZXcgVGltZShUSU1FX1RFU1QxKTsKIApAQCAtMjIyLDYgKzMzNiwxNSBAQAogICAgIH0gLy8gZW5kIG1ldGhvZCB0ZXN0CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRZZWFyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFllYXIoKSB7CiAgICAgICAgIFRpbWUgdGhlVGltZSA9IG5ldyBUaW1lKFRJTUVfVEVTVDEpOwogCkBAIC0yMzYsNiArMzU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLlRpbWUjdmFsdWVPZihTdHJpbmcgKQogICAgICAqLworICAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVPZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhbHVlT2ZfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgewogICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgIFRpbWUudmFsdWVPZigiMTU6NDM6MTI6MzQiKTsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvVGltZXN0YW1wVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9UaW1lc3RhbXBUZXN0LmphdmEKaW5kZXggN2M1ZDdhYi4uODUwNDA3OCAxMDA2NDQKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9UaW1lc3RhbXBUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9UaW1lc3RhbXBUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CkBAIC0yNCw2ICsyOSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoVGltZXN0YW1wLmNsYXNzKQogLyoqCiAgKiBKVW5pdCBUZXN0Y2FzZSBmb3IgdGhlIGphdmEuc3FsLlRpbWVzdGFtcCBjbGFzcwogICogCkBAIC0xMDksNiArMTE1LDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvciB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW5jb3JyZWN0IHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUaW1lc3RhbXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRpbWVzdGFtcGxvbmcoKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aGVUaW1lc3RhbXAgPSBuZXcgVGltZXN0YW1wKFRJTUVfVEVTVDEpOwogCkBAIC0xMTksNiArMTM0LDE1IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3RvciB0ZXN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlRpbWVzdGFtcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFRpbWVzdGFtcGludGludGludGludGludGludGludCgpIHsKICAgICAgICAgaW50W11bXSB2YWxpZCA9IHsgeyA5OSwgMiwgMTQsIDE3LCA1MiwgMywgMjEzNTc3MjEyIH0sIC8vIDAgdmFsaWQKQEAgLTE3MSw2ICsxOTUsMTUgQEAKICAgICAvKgogICAgICAqIE1ldGhvZCB0ZXN0IGZvciBzZXRUaW1lCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRpbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7bG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFRpbWVsb25nKCkgewogICAgICAgICAvLyBGaXJzdCBzZXQgdGhlIHRpbWV6b25lIHRvIEdNVAogICAgICAgICBUaW1lWm9uZS5zZXREZWZhdWx0KFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CkBAIC0xODksNiArMjIyLDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0VGltZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUaW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFRpbWUoKSB7CiAgICAgICAgIC8vIEZpcnN0IHNldCB0aGUgdGltZXpvbmUgdG8gR01UCiAgICAgICAgIFRpbWVab25lLnNldERlZmF1bHQoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKQEAgLTIwMyw2ICsyNDUsMTUgQEAKICAgICAvKgogICAgICAqIE1ldGhvZCB0ZXN0IGZvciBnZXRZZWFyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkRlcHJlY2F0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0WWVhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFllYXIoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9BUlJBWS5sZW5ndGg7IGkrKykgewpAQCAtMjE1LDYgKzI2NiwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGdldE1vbnRoCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIkRlcHJlY2F0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TW9udGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNb250aCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSU1FX0FSUkFZLmxlbmd0aDsgaSsrKSB7CkBAIC0yMjcsNiArMjg3LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0RGF0ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJEZXByZWNhdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREYXRlKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRJTUVfQVJSQVkubGVuZ3RoOyBpKyspIHsKQEAgLTIzOSw2ICszMDgsMTUgQEAKICAgICAvKgogICAgICAqIE1ldGhvZCB0ZXN0IGZvciBnZXRIb3VycwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJEZXByZWNhdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEhvdXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SG91cnMoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9BUlJBWS5sZW5ndGg7IGkrKykgewpAQCAtMjUxLDYgKzMyOSwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGdldE1pbnV0ZXMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRGVwcmVjYXRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNaW51dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWludXRlcygpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSU1FX0FSUkFZLmxlbmd0aDsgaSsrKSB7CkBAIC0yNjMsNiArMzUwLDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0U2Vjb25kcwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJEZXByZWNhdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNlY29uZHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZWNvbmRzKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRJTUVfQVJSQVkubGVuZ3RoOyBpKyspIHsKQEAgLTI3Nyw2ICszNzMsMTUgQEAKICAgICAgKi8KICAgICBzdGF0aWMgU3RyaW5nIHRoZUV4Y2VwdGlvbk1lc3NhZ2UgPSAiVGltZXN0YW1wIGZvcm1hdCBtdXN0IGJlIHl5eXktbW0tZGQgaGg6bW06c3MuZmZmZmZmZmZmIjsKIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZTdHJpbmcoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9BUlJBWS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgVGltZXN0YW1wIHRoZVRpbWVzdGFtcCA9IG5ldyBUaW1lc3RhbXAoVElNRV9BUlJBWVtpXSk7CkBAIC0zMDgsNiArNDEzLDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgdmFsdWVPZgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2ZTdHJpbmcxKCkgewogCiAgICAgICAgIFRpbWVzdGFtcCB0aGVSZXR1cm47CkBAIC0zNTMsNiArNDY3LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgdG9TdHJpbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9BUlJBWS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgVGltZXN0YW1wIHRoZVRpbWVzdGFtcCA9IG5ldyBUaW1lc3RhbXAoVElNRV9BUlJBWVtpXSk7CkBAIC0zNjQsNiArNDg3LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3IgZ2V0TmFub3MKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFub3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmFub3MoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9BUlJBWS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgVGltZXN0YW1wIHRoZVRpbWVzdGFtcCA9IG5ldyBUaW1lc3RhbXAoVElNRV9BUlJBWVtpXSk7CkBAIC0zNzUsNiArNTA3LDE1IEBACiAgICAgLyoKICAgICAgKiBNZXRob2QgdGVzdCBmb3Igc2V0TmFub3MKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmFub3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmFub3NpbnQoKSB7CiAgICAgICAgIGludFtdIE5BTk9TX0lOVkFMSUQgPSB7IC0xMzc4OTE5OTAsIDE2MzU2NjUxOTgsIC0xIH07CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9BUlJBWS5sZW5ndGg7IGkrKykgewpAQCAtNDA3LDYgKzU0OCwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGVxdWFscwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGltZXN0YW1wLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzVGltZXN0YW1wKCkgewogICAgICAgICBmb3IgKGxvbmcgZWxlbWVudCA6IFRJTUVfQVJSQVkpIHsKICAgICAgICAgICAgIFRpbWVzdGFtcCB0aGVUaW1lc3RhbXAgPSBuZXcgVGltZXN0YW1wKGVsZW1lbnQpOwpAQCAtNDI5LDYgKzU3OSwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGVxdWFscwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkgewogICAgICAgICBmb3IgKGxvbmcgZWxlbWVudCA6IFRJTUVfQVJSQVkpIHsKICAgICAgICAgICAgIFRpbWVzdGFtcCB0aGVUaW1lc3RhbXAgPSBuZXcgVGltZXN0YW1wKGVsZW1lbnQpOwpAQCAtNDU3LDYgKzYxNiwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGJlZm9yZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiZWZvcmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGltZXN0YW1wLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmVmb3JlVGltZXN0YW1wKCkgewogICAgICAgICBUaW1lc3RhbXAgdGhlVGVzdCA9IG5ldyBUaW1lc3RhbXAoVElNRV9MQVRFKTsKIApAQCAtNDg4LDYgKzY1NiwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGFmdGVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFmdGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1RpbWVzdGFtcC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFmdGVyVGltZXN0YW1wKCkgewogICAgICAgICBUaW1lc3RhbXAgdGhlVGVzdCA9IG5ldyBUaW1lc3RhbXAoVElNRV9MQVRFKTsKIApAQCAtNTE5LDYgKzY5NiwxNSBAQAogICAgIC8qCiAgICAgICogTWV0aG9kIHRlc3QgZm9yIGNvbXBhcmVUbwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7VGltZXN0YW1wLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9UaW1lc3RhbXAoKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aGVUZXN0ID0gbmV3IFRpbWVzdGFtcChUSU1FX0VBUkxZKTsKQEAgLTU1Niw2ICs3NDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuVGltZXN0YW1wI2NvbXBhcmVUbyhqYXZhLnV0aWwuRGF0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0RhdGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9EYXRlKCkgewogICAgICAgICBEYXRlIHRoZVRlc3QgPSBuZXcgVGltZXN0YW1wKFRJTUVfRUFSTFkpOwogICAgICAgICBEYXRlIHRoZVRlc3QyID0gbmV3IFRpbWVzdGFtcChUSU1FX0xBVEUpOwpAQCAtNTkwLDYgKzc4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNlcmlhbGl6YXRpb24gdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uU2VsZigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBUaW1lc3RhbXAgb2JqZWN0ID0gbmV3IFRpbWVzdGFtcCgxMDBMKTsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihvYmplY3QpOwpAQCAtNTk4LDYgKzgwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU2VyaWFsaXphdGlvbiB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkNvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVGltZXN0YW1wIG9iamVjdCA9IG5ldyBUaW1lc3RhbXAoMTAwTCk7CiAgICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnZlcmlmeUdvbGRlbih0aGlzLCBvYmplY3QpOwpAQCAtNjA2LDYgKzgxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5UaW1lc3RhbXAjdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAKICAgICAgICAgVGltZXN0YW1wIHQxID0gbmV3IFRpbWVzdGFtcChMb25nLk1JTl9WQUxVRSk7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1R5cGVzVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZhL3NxbC9UeXBlc1Rlc3QuamF2YQppbmRleCA1ZWU4ODYwLi40OWI1ODNhIDEwMDY0NAotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmEvc3FsL1R5cGVzVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YS9zcWwvVHlwZXNUZXN0LmphdmEKQEAgLTE3LDE3ICsxNywzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YS5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnNxbC5UeXBlcy5jbGFzcykKIHB1YmxpYyBjbGFzcyBUeXBlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKgogICAgICAqIFB1YmxpYyBzdGF0aWNzIHRlc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiRmllbGQgdGVzdGluZyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFDb25zdGFudHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljU3RhdGljcygpIHsKIAogICAgICAgICBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gdGhlUHVibGljU3RhdGljcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudFRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudFRlc3QuamF2YQppbmRleCBhNWQ3NjE3Li4zNGQ4OTVjIDEwMDY0NAotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmF4L3NxbC9Db25uZWN0aW9uRXZlbnRUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NxbC90ZXN0cy9qYXZheC9zcWwvQ29ubmVjdGlvbkV2ZW50VGVzdC5qYXZhCkBAIC0xNywxMiArMTcsMzEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc3FsLnRlc3RzLmphdmF4LnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50OworaW1wb3J0IGphdmF4LnNxbC5Qb29sZWRDb25uZWN0aW9uOworaW1wb3J0IGphdmF4LnNxbC5Sb3dTZXQ7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ29ubmVjdGlvbkV2ZW50LmNsYXNzKQogcHVibGljIGNsYXNzIENvbm5lY3Rpb25FdmVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRFdmVudCNSb3dTZXRFdmVudChqYXZheC5zcWwuUm93U2V0KX0uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUm93U2V0RXZlbnQoKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJSb3dTZXRFdmVudCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtSb3dTZXQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckNvbm5lY3Rpb24oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgQ29ubmVjdGlvbkV2ZW50KG51bGwpOwpAQCAtMzYsNiArNTUsMTYgQEAKICAgICAgICAgYXNzZXJ0TnVsbChjZS5nZXRTUUxFeGNlcHRpb24oKSk7CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudCNDb25uZWN0aW9uRXZlbnQoUG9vbGVkQ29ubmVjdGlvbiwgU1FMRXhjZXB0aW9uKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDb25uZWN0aW9uRXZlbnQoKSBjb25zdHJ1Y3RvciBmb3IgdGhlIGFibm9ybWFsIGNhc2UgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhlIHBvb2xlZCBjb25uZWN0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInRlc3RDb25uZWN0aW9uRXZlbnRQb29sZWRDb25uZWN0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1Bvb2xlZENvbm5lY3Rpb24uY2xhc3MsU1FMRXhjZXB0aW9uLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yQ29ubmVjdGlvblNRTEV4Y2VwdGlvbigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBDb25uZWN0aW9uRXZlbnQobnVsbCwgbnVsbCk7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc3FsL3Rlc3RzL2phdmF4L3NxbC9Sb3dTZXRFdmVudFRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YXgvc3FsL1Jvd1NldEV2ZW50VGVzdC5qYXZhCmluZGV4IGU3ODI4MGIuLjBlYzkwODQgMTAwNjQ0Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YXgvc3FsL1Jvd1NldEV2ZW50VGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zcWwvdGVzdHMvamF2YXgvc3FsL1Jvd1NldEV2ZW50VGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMjggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc3FsLnRlc3RzLmphdmF4LnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGphdmF4LnNxbC5Sb3dTZXQ7CiBpbXBvcnQgamF2YXguc3FsLlJvd1NldEV2ZW50OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhSb3dTZXRFdmVudC5jbGFzcykKIHB1YmxpYyBjbGFzcyBSb3dTZXRFdmVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRFdmVudCNSb3dTZXRFdmVudChqYXZheC5zcWwuUm93U2V0KX0uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUm93U2V0RXZlbnQoKSBjb25zdHJ1Y3Rvci4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJSb3dTZXRFdmVudCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtSb3dTZXQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBSb3dTZXRFdmVudChudWxsKTsKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL0RhdGFiYXNlTWV0YURhdGFUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9EYXRhYmFzZU1ldGFEYXRhVGVzdC5qYXZhCmluZGV4IDQyYWUyNDkuLmJkNzJlNGUgMTAwNzU1Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL0RhdGFiYXNlTWV0YURhdGFUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvRGF0YWJhc2VNZXRhRGF0YVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CiBpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKIGltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CkBAIC0yNCw3ICsyOSw2IEBACiBpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwogaW1wb3J0IGphdmEuc3FsLlR5cGVzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LkRhdGFiYXNlQ3JlYXRvcjsKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfU1FMOwpAQCAtMzQsNiArMzgsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwogCitAVGVzdFRhcmdldENsYXNzKERhdGFiYXNlTWV0YURhdGEuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRGF0YWJhc2VNZXRhRGF0YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZJRVdfTkFNRSA9ICJteVZpZXciOwogCkBAIC0xMTYsNiArMTIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjYWxsUHJvY2VkdXJlc0FyZUNhbGxhYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWxsUHJvY2VkdXJlc0FyZUNhbGxhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hbGxQcm9jZWR1cmVzQXJlQ2FsbGFibGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTY4LDYgKzE4MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2RhdGFEZWZpbml0aW9uQ2F1c2VzVHJhbnNhY3Rpb25Db21taXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkYXRhRGVmaW5pdGlvbkNhdXNlc1RyYW5zYWN0aW9uQ29tbWl0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kYXRhRGVmaW5pdGlvbkNhdXNlc1RyYW5zYWN0aW9uQ29tbWl0KCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKQEAgLTE3Niw2ICsxOTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNkYXRhRGVmaW5pdGlvbklnbm9yZWRJblRyYW5zYWN0aW9ucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRhdGFEZWZpbml0aW9uSWdub3JlZEluVHJhbnNhY3Rpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kYXRhRGVmaW5pdGlvbklnbm9yZWRJblRyYW5zYWN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xODMsNiArMjE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZGVsZXRlc0FyZURldGVjdGVkKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZGVsZXRlc0FyZURldGVjdGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kZWxldGVzQXJlRGV0ZWN0ZWRJKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE5MCw2ICsyMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNkb2VzTWF4Um93U2l6ZUluY2x1ZGVCbG9icygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImRvZXNNYXhSb3dTaXplSW5jbHVkZUJsb2JzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9kb2VzTWF4Um93U2l6ZUluY2x1ZGVCbG9icygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xOTgsNiArMjQ4LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEgI2dldEF0dHJpYnV0ZXMoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXR0cmlidXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXR0cmlidXRlc0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKQEAgLTIwNyw2ICsyNjYsMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSAjZ2V0QmVzdFJvd0lkZW50aWZpZXIoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkFsbCB2YXJpYW50cyBvZiBwYXJhbWV0ZXJzIHdlcmUgbm90IHRlc3RlZC4gIiArCisgICAgICAgICAgICAgICAgICAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCZXN0Um93SWRlbnRpZmllciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QmVzdFJvd0lkZW50aWZpZXJMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJWigpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgUmVzdWx0U2V0IHJlc3VsdCA9IHN0YXRlbWVudEZvcndhcmQuZXhlY3V0ZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICIKQEAgLTI1MCw2ICszMTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9nU2VwYXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2F0YWxvZ1NlcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2F0YWxvZ1NlcGFyYXRvcigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgY2F0YWxvZyBzZXBhcmF0b3IiLCAiIi5lcXVhbHMobWV0YQogICAgICAgICAgICAgICAgIC5nZXRDYXRhbG9nU2VwYXJhdG9yKCkudHJpbSgpKSk7CkBAIC0yNTgsNiArMzM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q2F0YWxvZ1Rlcm0oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDYXRhbG9nVGVybSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2F0YWxvZ1Rlcm0oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGNhdGFsb2cgdGVybSIsICIiLmVxdWFscyhtZXRhCiAgICAgICAgICAgICAgICAgLmdldENhdGFsb2dTZXBhcmF0b3IoKS50cmltKCkpKTsKQEAgLTI2Niw2ICszNTMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgcmVzdWx0IHdhc24ndCBjaGVja2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENhdGFsb2dzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDYXRhbG9ncygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBSZXN1bHRTZXQgcnMgPSBtZXRhLmdldENhdGFsb2dzKCk7CiAgICAgICAgIC8vIFRPRE8gZ2V0Q2F0YWxvZyBpcyBub3Qgc3VwcG9ydGVkCkBAIC0zMzQsNiArNDMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q29ubmVjdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbm5lY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY29ubmVjdGlvbiB2YWx1ZSIsIGNvbm4sIG1ldGEuZ2V0Q29ubmVjdGlvbigpKTsKICAgICB9CkBAIC0zNDMsNiArNDQ5LDE2IEBACiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgICAiQWxsIHZhcmlhbnRzIG9mIHBhcmFtZXRlcnMgd2VyZSBub3QgdGVzdGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENyb3NzUmVmZXJlbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3Jvc3NSZWZlcmVuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIFJlc3VsdFNldCBycyA9IG1ldGEuZ2V0Q3Jvc3NSZWZlcmVuY2UoY29ubi5nZXRDYXRhbG9nKCksIG51bGwsCkBAIC0zOTgsNiArNTE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RGF0YWJhc2VNYWpvclZlcnNpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREYXRhYmFzZU1ham9yVmVyc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YWJhc2VNYWpvclZlcnNpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZGN0IGRhdGFiYXNlIG1ham9yIHZlcnNpb24iLCBtZXRhCiAgICAgICAgICAgICAgICAgLmdldERhdGFiYXNlTWFqb3JWZXJzaW9uKCkgPj0gMCk7CkBAIC00MDYsNiArNTMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RGF0YWJhc2VNaW5vclZlcnNpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREYXRhYmFzZU1pbm9yVmVyc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YWJhc2VNaW5vclZlcnNpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRhdGFiYXNlIG1pbm9yIHZlcnNpb24iLCBtZXRhCiAgICAgICAgICAgICAgICAgLmdldERhdGFiYXNlTWlub3JWZXJzaW9uKCkgPj0gMCk7CkBAIC00MTQsNiArNTQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RGF0YWJhc2VQcm9kdWN0TmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGFiYXNlUHJvZHVjdE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERhdGFiYXNlUHJvZHVjdE5hbWUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRhdGFiYXNlIHByb2R1Y3QgbmFtZSIsICEiIi5lcXVhbHMobWV0YQogICAgICAgICAgICAgICAgIC5nZXREYXRhYmFzZVByb2R1Y3ROYW1lKCkudHJpbSgpKSk7CkBAIC00MjIsNiArNTY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RGF0YWJhc2VQcm9kdWN0VmVyc2lvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRhdGFiYXNlIHByb2R1Y3QgdmVyc2lvbiIsICEiIi5lcXVhbHMobWV0YQogICAgICAgICAgICAgICAgIC5nZXREYXRhYmFzZVByb2R1Y3RWZXJzaW9uKCkudHJpbSgpKSk7CkBAIC00MzAsNiArNTgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0VHJhbnNhY3Rpb25Jc29sYXRpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGRlZmF1bHRMZXZlbCA9IG1ldGEuZ2V0RGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uKCk7CiAgICAgICAgIHN3aXRjaCAoZGVmYXVsdExldmVsKSB7CkBAIC00NDgsNiArNjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RHJpdmVyTWFqb3JWZXJzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RHJpdmVyTWFqb3JWZXJzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREcml2ZXJNYWpvclZlcnNpb24oKSB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBkcml2ZXIgbWFqb3IgdmVyc2lvbiIsIG1ldGEKICAgICAgICAgICAgICAgICAuZ2V0RHJpdmVyTWFqb3JWZXJzaW9uKCkgPj0gMCk7CkBAIC00NTYsNiArNjI2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RHJpdmVyTWlub3JWZXJzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RHJpdmVyTWlub3JWZXJzaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREcml2ZXJNaW5vclZlcnNpb24oKSB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBkcml2ZXIgbWlub3IgdmVyc2lvbiIsIG1ldGEKICAgICAgICAgICAgICAgICAuZ2V0RHJpdmVyTWlub3JWZXJzaW9uKCkgPj0gMCk7CkBAIC00NjQsNiArNjQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0RHJpdmVyTmFtZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERyaXZlck5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERyaXZlck5hbWUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRyaXZlciBuYW1lIiwgISIiLmVxdWFscyhtZXRhLmdldERyaXZlck5hbWUoKQogICAgICAgICAgICAgICAgIC50cmltKCkpKTsKQEAgLTQ3Miw2ICs2NjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXREcml2ZXJWZXJzaW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RHJpdmVyVmVyc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RHJpdmVyVmVyc2lvbigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZHJpdmVyIHZlcnNpb24iLCAhIiIuZXF1YWxzKG1ldGEKICAgICAgICAgICAgICAgICAuZ2V0RHJpdmVyVmVyc2lvbigpLnRyaW0oKSkpOwpAQCAtNTM3LDYgKzczNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldEV4dHJhTmFtZUNoYXJhY3RlcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFeHRyYU5hbWVDaGFyYWN0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFeHRyYU5hbWVDaGFyYWN0ZXJzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkluY29ycmVjdCBleHRyYSBuYW1lIGNoYXJhY3RlcnMiLCBtZXRhCiAgICAgICAgICAgICAgICAgLmdldEV4dHJhTmFtZUNoYXJhY3RlcnMoKSk7CkBAIC01NDUsNiArNzUxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0SWRlbnRpZmllclF1b3RlU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SWRlbnRpZmllclF1b3RlU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJZGVudGlmaWVyUXVvdGVTdHJpbmcoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGlkZW50aWZpZXIgb2YgcXVvdGVkIHN0cmluZyIsICEiIi5lcXVhbHMobWV0YQogICAgICAgICAgICAgICAgIC5nZXRJZGVudGlmaWVyUXVvdGVTdHJpbmcoKS50cmltKCkpKTsKQEAgLTU1NCw2ICs3NjksMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSAjZ2V0SW1wb3J0ZWRLZXlzKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEltcG9ydGVkS2V5cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEltcG9ydGVkS2V5c0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgUmVzdWx0U2V0IHJzID0gbWV0YS5nZXRJbXBvcnRlZEtleXMoY29ubi5nZXRDYXRhbG9nKCksIG51bGwsCkBAIC02NTgsNiArODgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0SkRCQ01ham9yVmVyc2lvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEpEQkNNYWpvclZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEpEQkNNYWpvclZlcnNpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IEpEQkMgbWFqb3IgdmVyc2lvbiIsCiAgICAgICAgICAgICAgICAgbWV0YS5nZXRKREJDTWFqb3JWZXJzaW9uKCkgPj0gMCk7CkBAIC02NjYsNiArODk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0SkRCQ01pbm9yVmVyc2lvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEpEQkNNaW5vclZlcnNpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEpEQkNNaW5vclZlcnNpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IEpEQkMgbWlub3IgdmVyc2lvbiIsCiAgICAgICAgICAgICAgICAgbWV0YS5nZXRKREJDTWlub3JWZXJzaW9uKCkgPj0gMCk7CkBAIC02NzQsNiArOTE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0TWF4QmluYXJ5TGl0ZXJhbExlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heEJpbmFyeUxpdGVyYWxMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heEJpbmFyeUxpdGVyYWxMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGJpbmFyeSBsaXRlcmFsIGxlbmd0aCIsIG1ldGEKICAgICAgICAgICAgICAgICAuZ2V0TWF4QmluYXJ5TGl0ZXJhbExlbmd0aCgpID49IDApOwpAQCAtNjgyLDYgKzkzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldE1heENhdGFsb2dOYW1lTGVuZ3RoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4Q2F0YWxvZ05hbWVMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heENhdGFsb2dOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBuYW1lIGxlbmd0aCIsIG1ldGEuZ2V0TWF4Q2F0YWxvZ05hbWVMZW5ndGgoKSA+PSAwKTsKICAgICB9CkBAIC02ODksNiArOTQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0TWF4Q2hhckxpdGVyYWxMZW5ndGgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhDaGFyTGl0ZXJhbExlbmd0aCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4Q2hhckxpdGVyYWxMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGNoYXIgbGl0ZXJhbCBsZW5ndGgiLCBtZXRhCiAgICAgICAgICAgICAgICAgLmdldE1heENoYXJMaXRlcmFsTGVuZ3RoKCkgPj0gMCk7CkBAIC02OTcsNiArOTY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0TWF4Q29sdW1uTmFtZUxlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heENvbHVtbk5hbWVMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heENvbHVtbk5hbWVMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGNvbHVtbiBuYW1lIGxlbmd0aCIsIG1ldGEKICAgICAgICAgICAgICAgICAuZ2V0TWF4Q29sdW1uTmFtZUxlbmd0aCgpID49IDApOwpAQCAtNzA1LDYgKzk4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldE1heENvbHVtbnNJbkdyb3VwQnkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhDb2x1bW5zSW5Hcm91cEJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhDb2x1bW5zSW5Hcm91cEJ5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgICAgICAgICAgbWV0YS5nZXRNYXhDb2x1bW5zSW5Hcm91cEJ5KCkgPj0gMCk7CkBAIC03MTMsNiArMTAwMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldE1heENvbHVtbnNJbkluZGV4KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4Q29sdW1uc0luSW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heENvbHVtbnNJbkluZGV4KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgICAgICAgICAgbWV0YS5nZXRNYXhDb2x1bW5zSW5JbmRleCgpID49IDApOwpAQCAtNzIxLDYgKzEwMTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhDb2x1bW5zSW5PcmRlckJ5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4Q29sdW1uc0luT3JkZXJCeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4Q29sdW1uc0luT3JkZXJCeSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgIG1ldGEuZ2V0TWF4Q29sdW1uc0luT3JkZXJCeSgpID49IDApOwpAQCAtNzI5LDYgKzEwMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhDb2x1bW5zSW5TZWxlY3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhDb2x1bW5zSW5TZWxlY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heENvbHVtbnNJblNlbGVjdCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgIG1ldGEuZ2V0TWF4Q29sdW1uc0luU2VsZWN0KCkgPj0gMCk7CkBAIC03MzcsNiArMTA1MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldE1heENvbHVtbnNJblRhYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4Q29sdW1uc0luVGFibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heENvbHVtbnNJblRhYmxlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgICAgICAgICAgbWV0YS5nZXRNYXhDb2x1bW5zSW5UYWJsZSgpID49IDApOwpAQCAtNzQ1LDYgKzEwNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhDb25uZWN0aW9ucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heENvbm5lY3Rpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhDb25uZWN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIiwKICAgICAgICAgICAgICAgICBtZXRhLmdldE1heENvbm5lY3Rpb25zKCkgPj0gMCk7CkBAIC03NTMsNiArMTA4NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldE1heEN1cnNvck5hbWVMZW5ndGgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhDdXJzb3JOYW1lTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhDdXJzb3JOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBuYW1lTGVuZ3RoID0gbWV0YS5nZXRNYXhDdXJzb3JOYW1lTGVuZ3RoKCk7CiAgICAgICAgIGlmIChuYW1lTGVuZ3RoID4gMCkgewpAQCAtNzcwLDYgKzExMTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhJbmRleExlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heEluZGV4TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhJbmRleExlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGVuZ3RoIG9mIGluZGV4IiwgbWV0YS5nZXRNYXhJbmRleExlbmd0aCgpID49IDApOwogICAgIH0KQEAgLTc3Nyw2ICsxMTI3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0TWF4UHJvY2VkdXJlTmFtZUxlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heFByb2NlZHVyZU5hbWVMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heFByb2NlZHVyZU5hbWVMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGxlbmd0aCBvZiBwcm9jZWR1cmUgbmFtZSIsIG1ldGEKICAgICAgICAgICAgICAgICAuZ2V0TWF4UHJvY2VkdXJlTmFtZUxlbmd0aCgpID49IDApOwpAQCAtNzg1LDYgKzExNDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhSb3dTaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4Um93U2l6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4Um93U2l6ZSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc2l6ZSBvZiByb3ciLCBtZXRhLmdldE1heFJvd1NpemUoKSA+PSAwKTsKICAgICB9CkBAIC03OTIsNiArMTE2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldE1heFNjaGVtYU5hbWVMZW5ndGgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhTY2hlbWFOYW1lTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhTY2hlbWFOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBsZW5ndGggb2Ygc2NoZW1hIG5hbWUiLCBtZXRhCiAgICAgICAgICAgICAgICAgLmdldE1heFNjaGVtYU5hbWVMZW5ndGgoKSA+PSAwKTsKQEAgLTgwMCw2ICsxMTc3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0TWF4U3RhdGVtZW50TGVuZ3RoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4U3RhdGVtZW50TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhTdGF0ZW1lbnRMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGxlbmd0aCBvZiBzdGF0ZW1lbnQiLCBtZXRhCiAgICAgICAgICAgICAgICAgLmdldE1heFN0YXRlbWVudExlbmd0aCgpID49IDApOwpAQCAtODA4LDYgKzExOTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhTdGF0ZW1lbnRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4U3RhdGVtZW50cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4U3RhdGVtZW50cygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHN0YXRlbWVudHMiLAogICAgICAgICAgICAgICAgIG1ldGEuZ2V0TWF4U3RhdGVtZW50cygpID49IDApOwpAQCAtODE2LDYgKzEyMTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhUYWJsZU5hbWVMZW5ndGgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNYXhUYWJsZU5hbWVMZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heFRhYmxlTmFtZUxlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGVuZ3RoIG9mIHRhYmxlIG5hbWUiLCBtZXRhCiAgICAgICAgICAgICAgICAgLmdldE1heFRhYmxlTmFtZUxlbmd0aCgpID49IDApOwpAQCAtODI0LDYgKzEyMjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhUYWJsZXNJblNlbGVjdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heFRhYmxlc0luU2VsZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhUYWJsZXNJblNlbGVjdCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHRhYmxlcyIsCiAgICAgICAgICAgICAgICAgbWV0YS5nZXRNYXhUYWJsZXNJblNlbGVjdCgpID49IDApOwpAQCAtODMyLDYgKzEyNDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRNYXhVc2VyTmFtZUxlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heFVzZXJOYW1lTGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhVc2VyTmFtZUxlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGVuZ3RoIG9mIHVzZXIgbmFtZSIsCiAgICAgICAgICAgICAgICAgbWV0YS5nZXRNYXhVc2VyTmFtZUxlbmd0aCgpID49IDApOwpAQCAtODQwLDYgKzEyNjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXROdW1lcmljRnVuY3Rpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TnVtZXJpY0Z1bmN0aW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TnVtZXJpY0Z1bmN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGlzdCBvZiBtYXRoIGZ1bmN0aW9ucyIsICIiLmVxdWFscyhtZXRhCiAgICAgICAgICAgICAgICAgLmdldE51bWVyaWNGdW5jdGlvbnMoKS50cmltKCkpKTsKQEAgLTg0OSw2ICsxMjgwLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEgI2dldFByaW1hcnlLZXlzKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByaW1hcnlLZXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeUtleXNMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIFJlc3VsdFNldCBycyA9IG1ldGEuZ2V0UHJpbWFyeUtleXMoY29ubi5nZXRDYXRhbG9nKCksIG51bGwsCkBAIC04ODEsNiArMTMyMSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhICNnZXRQcm9jZWR1cmVDb2x1bW5zKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb2NlZHVyZUNvbHVtbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb2NlZHVyZUNvbHVtbnNMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CkBAIC04ODksNiArMTMzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFByb2NlZHVyZVRlcm0oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm9jZWR1cmVUZXJtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm9jZWR1cmVUZXJtKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBwcm9jZWR1cmUgdGVybSIsICIiLmVxdWFscyhtZXRhCiAgICAgICAgICAgICAgICAgLmdldFByb2NlZHVyZVRlcm0oKS50cmltKCkpKTsKQEAgLTg5OCw2ICsxMzU2LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEgI2dldFByb2NlZHVyZXMoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvY2VkdXJlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb2NlZHVyZXNMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQpAQCAtOTA2LDYgKzEzNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRSZXN1bHRTZXRIb2xkYWJpbGl0eSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJlc3VsdFNldEhvbGRhYmlsaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZXN1bHRTZXRIb2xkYWJpbGl0eSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBpbnQgaGRiID0gbWV0YS5nZXRSZXN1bHRTZXRIb2xkYWJpbGl0eSgpOwogICAgICAgICBzd2l0Y2ggKGhkYikgewpAQCAtOTIzLDYgKzEzOTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRTUUxLZXl3b3JkcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNRTEtleXdvcmRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTUUxLZXl3b3JkcygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgU1FMIGtleXdvcmRzIiwgISIiLmVxdWFscyhtZXRhLmdldFNRTEtleXdvcmRzKCkKICAgICAgICAgICAgICAgICAudHJpbSgpKSk7CkBAIC05MzEsNiArMTQxNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFNRTFN0YXRlVHlwZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNRTFN0YXRlVHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U1FMU3RhdGVUeXBlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCB0eXBlID0gbWV0YS5nZXRTUUxTdGF0ZVR5cGUoKTsKICAgICAgICAgc3dpdGNoICh0eXBlKSB7CkBAIC05NDYsNiArMTQ0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFNjaGVtYVRlcm0oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTY2hlbWFUZXJtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTY2hlbWFUZXJtKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkluY29ycmVjdCBzY2hlbWEgdGVybSIsIG1ldGEuZ2V0U2NoZW1hVGVybSgpKTsKICAgICB9CkBAIC05NTMsNiArMTQ1NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFNjaGVtYXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTY2hlbWFzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTY2hlbWFzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIFJlc3VsdFNldCBycyA9IG1ldGEuZ2V0U2NoZW1hcygpOwogICAgICAgICBSZXN1bHRTZXRNZXRhRGF0YSByc21kID0gcnMuZ2V0TWV0YURhdGEoKTsKQEAgLTk3MCw2ICsxNDgyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0U2VhcmNoU3RyaW5nRXNjYXBlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VhcmNoU3RyaW5nRXNjYXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWFyY2hTdHJpbmdFc2NhcGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHNlYXJjaCBzdHJpbmcgZXNjYXBlIiwgISIiLmVxdWFscyhtZXRhCiAgICAgICAgICAgICAgICAgLmdldFNlYXJjaFN0cmluZ0VzY2FwZSgpLnRyaW0oKSkpOwpAQCAtOTc4LDYgKzE0OTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRTdHJpbmdGdW5jdGlvbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdHJpbmdGdW5jdGlvbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN0cmluZ0Z1bmN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RyaW5nIGZ1bmN0aW9ucyIsICIiLmVxdWFscyhtZXRhCiAgICAgICAgICAgICAgICAgLmdldFN0cmluZ0Z1bmN0aW9ucygpLnRyaW0oKSkpOwpAQCAtOTg3LDYgKzE1MTcsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSAjZ2V0U3VwZXJUYWJsZXMoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3VwZXJUYWJsZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTdXBlclRhYmxlc0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CkBAIC05OTYsNiArMTUzNSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhICNnZXRTdXBlclR5cGVzKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN1cGVyVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTdXBlclR5cGVzTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKQEAgLTEwMDQsNiArMTU1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFN5c3RlbUZ1bmN0aW9ucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN5c3RlbUZ1bmN0aW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtRnVuY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydFRydWUoIk5vIHN5c3RlbSBmdW5jdGlvbiBleGlzdCIsIG1ldGEuZ2V0U3lzdGVtRnVuY3Rpb25zKCkKICAgICAgICAgICAgICAgICAudHJpbSgpLmVxdWFscygiIikpOwpAQCAtMTExMyw2ICsxNjcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0VGFibGVUeXBlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRhYmxlVHlwZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRhYmxlVHlwZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nW10gdGFibGVUeXBlcyA9IHsgIkxPQ0FMIFRFTVBPUkFSWSIsICJUQUJMRSIsICJWSUVXIiB9OwogICAgICAgICBSZXN1bHRTZXQgcnMgPSBtZXRhLmdldFRhYmxlVHlwZXMoKTsKQEAgLTExMjgsNiArMTY5NCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhICNnZXRUYWJsZXMoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUYWJsZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFibGVzTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nJExqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmdbXSB0YWJsZXNOYW1lID0geyBWSUVXX05BTUUsIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFMSwKQEAgLTExODcsNiArMTc2MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFRpbWVEYXRlRnVuY3Rpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGltZURhdGVGdW5jdGlvbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRpbWVEYXRlRnVuY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKCJObyB0aW1lIGFuZCBkYXRhIGZ1bmN0aW9ucyBleGlzdCIsICFtZXRhCiAgICAgICAgICAgICAgICAgLmdldFRpbWVEYXRlRnVuY3Rpb25zKCkudHJpbSgpLmVxdWFscygiIikpOwpAQCAtMTE5NSw2ICsxNzc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0VHlwZUluZm8oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUeXBlSW5mbyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZUluZm8oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgaW5zZXJ0TmV3UmVjb3JkKCk7CiAKQEAgLTEyMzQsNiArMTgyNywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhICNnZXRVRFRzKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGludFtdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRVRFRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGludFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFVEVHNMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmckSSgpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CkBAIC0xMjQyLDYgKzE4NDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRVUkwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRVUkwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFVSTCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHVybCIsIFN1cHBvcnRfU1FMLnNxbFVybCwgbWV0YS5nZXRVUkwoKSk7CiAgICAgfQpAQCAtMTI4Niw2ICsxODk3LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjaW5zZXJ0c0FyZURldGVjdGVkKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAgICJWZXJpZmljYXRpb24gd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluc2VydHNBcmVEZXRlY3RlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0c0FyZURldGVjdGVkSSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSgKICAgICAgICAgICAgICAgICAidmlzaWJsZSByb3cgaW5zZXJ0IGNhbiBiZSBkZXRlY3RlZCBmb3IgVFlQRV9GT1JXQVJEX09OTFkgdHlwZSIsCkBAIC0xMzAxLDYgKzE5MjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNpc0NhdGFsb2dBdFN0YXJ0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNDYXRhbG9nQXRTdGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNDYXRhbG9nQXRTdGFydCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSgKICAgICAgICAgICAgICAgICAiY2F0YWxvZyBkb2Vzbid0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgYSBmdWxseSBxdWFsaWZpZWQgdGFibGUgbmFtZSIsCkBAIC0xMzEwLDYgKzE5NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNpc1JlYWRPbmx5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNSZWFkT25seSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSgiZGF0YWJhc2UgaXMgbm90IHJlYWQtb25seSIsIG1ldGEuaXNSZWFkT25seSgpKTsKICAgICB9CkBAIC0xMzE3LDYgKzE5NTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNsb2NhdG9yc1VwZGF0ZUNvcHkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsb2NhdG9yc1VwZGF0ZUNvcHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xvY2F0b3JzVXBkYXRlQ29weSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xMzI0LDYgKzE5NzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNudWxsUGx1c05vbk51bGxJc051bGwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJudWxsUGx1c05vbk51bGxJc051bGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X251bGxQbHVzTm9uTnVsbElzTnVsbCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xMzMxLDYgKzE5ODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNudWxsc0FyZVNvcnRlZEF0RW5kKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibnVsbHNBcmVTb3J0ZWRBdEVuZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbnVsbHNBcmVTb3J0ZWRBdEVuZCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xMzM4LDYgKzIwMDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNudWxsc0FyZVNvcnRlZEF0U3RhcnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJudWxsc0FyZVNvcnRlZEF0U3RhcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X251bGxzQXJlU29ydGVkQXRTdGFydCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xMzQ1LDYgKzIwMjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNudWxsc0FyZVNvcnRlZEhpZ2goKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJudWxsc0FyZVNvcnRlZEhpZ2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X251bGxzQXJlU29ydGVkSGlnaCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xMzUyLDYgKzIwMzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNudWxsc0FyZVNvcnRlZExvdygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm51bGxzQXJlU29ydGVkTG93IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9udWxsc0FyZVNvcnRlZExvdygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xMzU5LDYgKzIwNTIsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNvdGhlcnNEZWxldGVzQXJlVmlzaWJsZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvdGhlcnNEZWxldGVzQXJlVmlzaWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3RoZXJzRGVsZXRlc0FyZVZpc2libGVJKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKAogICAgICAgICAgICAgICAgICJkZWxldGVzIG1hZGUgYnkgb3RoZXJzIGFyZSB2aXNpYmxlIGZvciBUWVBFX0ZPUldBUkRfT05MWSB0eXBlIiwKQEAgLTEzNzYsNiArMjA3OSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI290aGVyc0luc2VydHNBcmVWaXNpYmxlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAgICJWZXJpZmljYXRpb24gd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm90aGVyc0luc2VydHNBcmVWaXNpYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vdGhlcnNJbnNlcnRzQXJlVmlzaWJsZUkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgICAgICAgImluc2VydHMgbWFkZSBieSBvdGhlcnMgYXJlIHZpc2libGUgZm9yIFRZUEVfRk9SV0FSRF9PTkxZIHR5cGUiLApAQCAtMTM5Myw2ICsyMTA2LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjb3RoZXJzVXBkYXRlc0FyZVZpc2libGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuICIgKworICAgICAgICAgICAgICAgICAgIlZlcmlmaWNhdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3RoZXJzVXBkYXRlc0FyZVZpc2libGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X290aGVyc1VwZGF0ZXNBcmVWaXNpYmxlSSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSgKICAgICAgICAgICAgICAgICAidXBkYXRlcyBtYWRlIGJ5IG90aGVycyBhcmUgdmlzaWJsZSBmb3IgVFlQRV9GT1JXQVJEX09OTFkgdHlwZSIsCkBAIC0xNDEwLDYgKzIxMzMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNvd25EZWxldGVzQXJlVmlzaWJsZShpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgIlZlcmlmaWNhdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib3duRGVsZXRlc0FyZVZpc2libGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X293bkRlbGV0ZXNBcmVWaXNpYmxlSSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPIG5vdCBzdXBwb3J0ZWQKIC8vICAgICAgICBhc3NlcnRGYWxzZSgKQEAgLTE0MjgsNiArMjE2MSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI293bkluc2VydHNBcmVWaXNpYmxlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvd25JbnNlcnRzQXJlVmlzaWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3duSW5zZXJ0c0FyZVZpc2libGVJKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAvLyAgICAgICAgYXNzZXJ0RmFsc2UoCiAvLyAgICAgICAgICAgICAgICAicmVzdWx0IHNldCdzIG93biBpbnNlcnRzIGFyZSB2aXNpYmxlIGZvciBUWVBFX0ZPUldBUkRfT05MWSB0eXBlIiwKQEAgLTE0NDUsNiArMjE4OCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI293blVwZGF0ZXNBcmVWaXNpYmxlKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJvd25VcGRhdGVzQXJlVmlzaWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfb3duVXBkYXRlc0FyZVZpc2libGVJKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE8gbm90IHN1cHBvcnRlZAogLy8gICAgICAgIGFzc2VydEZhbHNlKApAQCAtMTQ2Myw2ICsyMjE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdG9yZXNMb3dlckNhc2VJZGVudGlmaWVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTQ3MCw2ICsyMjMyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3RvcmVzTG93ZXJDYXNlUXVvdGVkSWRlbnRpZmllcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdG9yZXNMb3dlckNhc2VRdW90ZWRJZGVudGlmaWVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RvcmVzTG93ZXJDYXNlUXVvdGVkSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTQ3Nyw2ICsyMjQ4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3RvcmVzTWl4ZWRDYXNlSWRlbnRpZmllcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIk1ldGhvZCBzdG9yZXNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycyB3YXMgaW52b2tlZCBpbnN0ZWFkIG9mIHN0b3Jlc01peGVkQ2FzZUlkZW50aWZpZXJzIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3RvcmVzTWl4ZWRDYXNlSWRlbnRpZmllcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0b3Jlc01peGVkQ2FzZUlkZW50aWZpZXJzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGluc2VydE5ld1JlY29yZCgpOwogCkBAIC0xNDk4LDYgKzIyNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdG9yZXNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3Jlc01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdG9yZXNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgcXVvdGUgPSBtZXRhLmdldElkZW50aWZpZXJRdW90ZVN0cmluZygpOwogCkBAIC0xNTIxLDYgKzIzMTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdG9yZXNVcHBlckNhc2VJZGVudGlmaWVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3Jlc1VwcGVyQ2FzZUlkZW50aWZpZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdG9yZXNVcHBlckNhc2VJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTI4LDYgKzIzMjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN0b3Jlc1VwcGVyQ2FzZVF1b3RlZElkZW50aWZpZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTM1LDYgKzIzNDIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0FOU0k5MkVudHJ5TGV2ZWxTUUwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0FOU0k5MkVudHJ5TGV2ZWxTUUwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzQU5TSTkyRW50cnlMZXZlbFNRTCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTQyLDYgKzIzNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0FOU0k5MkZ1bGxTUUwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0FOU0k5MkZ1bGxTUUwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzQU5TSTkyRnVsbFNRTCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTQ5LDYgKzIzNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0FOU0k5MkludGVybWVkaWF0ZVNRTCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzQU5TSTkySW50ZXJtZWRpYXRlU1FMIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0FOU0k5MkludGVybWVkaWF0ZVNRTCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTU2LDYgKzIzOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0FsdGVyVGFibGVXaXRoQWRkQ29sdW1uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNBbHRlclRhYmxlV2l0aEFkZENvbHVtbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNBbHRlclRhYmxlV2l0aEFkZENvbHVtbigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTYzLDYgKzI0MDYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhEcm9wQ29sdW1uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTcwLDYgKzI0MjIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0JhdGNoVXBkYXRlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzQmF0Y2hVcGRhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0JhdGNoVXBkYXRlcygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTc3LDYgKzI0MzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0NhdGFsb2dzSW5EYXRhTWFuaXB1bGF0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNDYXRhbG9nc0luRGF0YU1hbmlwdWxhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNDYXRhbG9nc0luRGF0YU1hbmlwdWxhdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTg0LDYgKzI0NTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0NhdGFsb2dzSW5JbmRleERlZmluaXRpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNDYXRhbG9nc0luSW5kZXhEZWZpbml0aW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNDYXRhbG9nc0luSW5kZXhEZWZpbml0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNTkxLDYgKzI0NzAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0NhdGFsb2dzSW5Qcml2aWxlZ2VEZWZpbml0aW9ucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzQ2F0YWxvZ3NJblByaXZpbGVnZURlZmluaXRpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0NhdGFsb2dzSW5Qcml2aWxlZ2VEZWZpbml0aW9ucygpCiAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CkBAIC0xNTk5LDYgKzI0ODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0NhdGFsb2dzSW5Qcm9jZWR1cmVDYWxscygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzQ2F0YWxvZ3NJblByb2NlZHVyZUNhbGxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0NhdGFsb2dzSW5Qcm9jZWR1cmVDYWxscygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNjA2LDYgKzI1MDMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0NhdGFsb2dzSW5UYWJsZURlZmluaXRpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNDYXRhbG9nc0luVGFibGVEZWZpbml0aW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNDYXRhbG9nc0luVGFibGVEZWZpbml0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNjEzLDYgKzI1MTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0NvbHVtbkFsaWFzaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNDb2x1bW5BbGlhc2luZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNDb2x1bW5BbGlhc2luZygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBpbnNlcnROZXdSZWNvcmQoKTsKIApAQCAtMTYzNyw2ICsyNTUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNDb252ZXJ0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNDb252ZXJ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0NvbnZlcnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTY0NCw2ICsyNTY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNDb252ZXJ0KGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0NvbnZlcnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNDb252ZXJ0SUkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTY1MSw2ICsyNTg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNDb3JlU1FMR3JhbW1hcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzQ29yZVNRTEdyYW1tYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzQ29yZVNRTEdyYW1tYXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTY1OCw2ICsyNjAwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNDb3JyZWxhdGVkU3VicXVlcmllcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzQ29ycmVsYXRlZFN1YnF1ZXJpZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzQ29ycmVsYXRlZFN1YnF1ZXJpZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTY2NSw2ICsyNjE2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNEYXRhRGVmaW5pdGlvbkFuZERhdGFNYW5pcHVsYXRpb25UcmFuc2FjdGlvbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0RhdGFEZWZpbml0aW9uQW5kRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNEYXRhRGVmaW5pdGlvbkFuZERhdGFNYW5pcHVsYXRpb25UcmFuc2FjdGlvbnMoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQpAQCAtMTY3Myw2ICsyNjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9uc09ubHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9uc09ubHkoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQpAQCAtMTY4MSw2ICsyNjUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNEaWZmZXJlbnRUYWJsZUNvcnJlbGF0aW9uTmFtZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0RpZmZlcmVudFRhYmxlQ29ycmVsYXRpb25OYW1lcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNEaWZmZXJlbnRUYWJsZUNvcnJlbGF0aW9uTmFtZXMoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQpAQCAtMTY4OSw2ICsyNjY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNFeHByZXNzaW9uc0luT3JkZXJCeSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzRXhwcmVzc2lvbnNJbk9yZGVyQnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzRXhwcmVzc2lvbnNJbk9yZGVyQnkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgaW5zZXJ0TmV3UmVjb3JkKCk7CiAKQEAgLTE3MTAsNiArMjY5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzRXh0ZW5kZWRTUUxHcmFtbWFyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNFeHRlbmRlZFNRTEdyYW1tYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzRXh0ZW5kZWRTUUxHcmFtbWFyKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE3MTcsNiArMjcxMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzRnVsbE91dGVySm9pbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0Z1bGxPdXRlckpvaW5zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0Z1bGxPdXRlckpvaW5zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE3MjQsNiArMjcyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzR2V0R2VuZXJhdGVkS2V5cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzR2V0R2VuZXJhdGVkS2V5cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNHZXRHZW5lcmF0ZWRLZXlzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE3MzEsNiArMjc0NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzR3JvdXBCeSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzR3JvdXBCeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNHcm91cEJ5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGluc2VydE5ld1JlY29yZCgpOwogCkBAIC0xNzUyLDYgKzI3NzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0dyb3VwQnlCZXlvbmRTZWxlY3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0dyb3VwQnlCZXlvbmRTZWxlY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzR3JvdXBCeUJleW9uZFNlbGVjdCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xNzU5LDYgKzI3OTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c0dyb3VwQnlVbnJlbGF0ZWQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c0dyb3VwQnlVbnJlbGF0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzR3JvdXBCeVVucmVsYXRlZCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBpbnNlcnROZXdSZWNvcmQoKTsKIApAQCAtMTc4MCw2ICsyODIxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNJbnRlZ3JpdHlFbmhhbmNlbWVudEZhY2lsaXR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNJbnRlZ3JpdHlFbmhhbmNlbWVudEZhY2lsaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0ludGVncml0eUVuaGFuY2VtZW50RmFjaWxpdHkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTc4Nyw2ICsyODM3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNMaWtlRXNjYXBlQ2xhdXNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNMaWtlRXNjYXBlQ2xhdXNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c0xpa2VFc2NhcGVDbGF1c2UoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTc5NCw2ICsyODUzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNMaW1pdGVkT3V0ZXJKb2lucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzTGltaXRlZE91dGVySm9pbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzTGltaXRlZE91dGVySm9pbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTgwMSw2ICsyODY5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNNaW5pbXVtU1FMR3JhbW1hcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzTWluaW11bVNRTEdyYW1tYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzTWluaW11bVNRTEdyYW1tYXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTgwOCw2ICsyODg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNNaXhlZENhc2VJZGVudGlmaWVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzTWl4ZWRDYXNlSWRlbnRpZmllcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzTWl4ZWRDYXNlSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTgxNSw2ICsyOTAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTgyMiw2ICsyOTE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNNdWx0aXBsZU9wZW5SZXN1bHRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNNdWx0aXBsZU9wZW5SZXN1bHRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c011bHRpcGxlT3BlblJlc3VsdHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTgyOSw2ICsyOTMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNNdWx0aXBsZVJlc3VsdFNldHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c011bHRpcGxlUmVzdWx0U2V0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNNdWx0aXBsZVJlc3VsdFNldHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTgzNiw2ICsyOTQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNNdWx0aXBsZVRyYW5zYWN0aW9ucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzTXVsdGlwbGVUcmFuc2FjdGlvbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzTXVsdGlwbGVUcmFuc2FjdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTg0Myw2ICsyOTY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNOYW1lZFBhcmFtZXRlcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c05hbWVkUGFyYW1ldGVycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNOYW1lZFBhcmFtZXRlcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTg1MCw2ICsyOTgxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNOb25OdWxsYWJsZUNvbHVtbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c05vbk51bGxhYmxlQ29sdW1ucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNOb25OdWxsYWJsZUNvbHVtbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgICAgICAiY29sdW1ucyBpbiB0aGlzIGRhdGFiYXNlIG1heSBub3QgYmUgZGVmaW5lZCBhcyBub24tbnVsbGFibGUiLApAQCAtMTg1OSw2ICsyOTk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNPcGVuQ3Vyc29yc0Fjcm9zc0NvbW1pdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NDb21taXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NDb21taXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTg2Niw2ICszMDE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNPcGVuQ3Vyc29yc0Fjcm9zc1JvbGxiYWNrKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNPcGVuQ3Vyc29yc0Fjcm9zc1JvbGxiYWNrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzUm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTg3Myw2ICszMDMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc0NvbW1pdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NDb21taXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NDb21taXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTg4MCw2ICszMDQ3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc1JvbGxiYWNrKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc1JvbGxiYWNrIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c09wZW5TdGF0ZW1lbnRzQWNyb3NzUm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTg4Nyw2ICszMDYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNPcmRlckJ5VW5yZWxhdGVkKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNPcmRlckJ5VW5yZWxhdGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c09yZGVyQnlVbnJlbGF0ZWQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgaW5zZXJ0TmV3UmVjb3JkKCk7CiAKQEAgLTE5MDgsNiArMzA5MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzT3V0ZXJKb2lucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzT3V0ZXJKb2lucyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNPdXRlckpvaW5zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE5MTUsNiArMzEwOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzUG9zaXRpb25lZERlbGV0ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzUG9zaXRpb25lZERlbGV0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNQb3NpdGlvbmVkRGVsZXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE5MjIsNiArMzEyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzUG9zaXRpb25lZFVwZGF0ZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzUG9zaXRpb25lZFVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNQb3NpdGlvbmVkVXBkYXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE5MjksNiArMzE0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzUmVzdWx0U2V0Q29uY3VycmVuY3koaW50LCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzUmVzdWx0U2V0Q29uY3VycmVuY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNSZXN1bHRTZXRDb25jdXJyZW5jeUlJKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTE5MzYsNiArMzE1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzUmVzdWx0U2V0SG9sZGFiaWxpdHkoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c1Jlc3VsdFNldEhvbGRhYmlsaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1Jlc3VsdFNldEhvbGRhYmlsaXR5SSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0xOTQzLDYgKzMxNzMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c1Jlc3VsdFNldFR5cGUoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuICIgKworICAgICAgICAgICAgICAgICAgIlZlcmlmaWNhdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBtaXNzZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNSZXN1bHRTZXRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1Jlc3VsdFNldFR5cGVJKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE8gbm90IHN1cHBvcnRlZAogLy8gICAgICAgIGFzc2VydEZhbHNlKCJkYXRhYmFzZSBzdXBwb3J0cyBUWVBFX0ZPUldBUkRfT05MWSB0eXBlIiwgbWV0YQpAQCAtMTk1OCw2ICszMTk4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNTYXZlcG9pbnRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNTYXZlcG9pbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1NhdmVwb2ludHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTk2NSw2ICszMjE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNTY2hlbWFzSW5EYXRhTWFuaXB1bGF0aW9uKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNTY2hlbWFzSW5EYXRhTWFuaXB1bGF0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1NjaGVtYXNJbkRhdGFNYW5pcHVsYXRpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTk3Miw2ICszMjMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNTY2hlbWFzSW5JbmRleERlZmluaXRpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNTY2hlbWFzSW5JbmRleERlZmluaXRpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1NjaGVtYXNJbkluZGV4RGVmaW5pdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTk3OSw2ICszMjQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNTY2hlbWFzSW5Qcml2aWxlZ2VEZWZpbml0aW9ucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzU2NoZW1hc0luUHJpdmlsZWdlRGVmaW5pdGlvbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzU2NoZW1hc0luUHJpdmlsZWdlRGVmaW5pdGlvbnMoKQogICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQpAQCAtMTk4Nyw2ICszMjYzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNTY2hlbWFzSW5Qcm9jZWR1cmVDYWxscygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzU2NoZW1hc0luUHJvY2VkdXJlQ2FsbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzU2NoZW1hc0luUHJvY2VkdXJlQ2FsbHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMTk5NCw2ICszMjc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNTY2hlbWFzSW5UYWJsZURlZmluaXRpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNTY2hlbWFzSW5UYWJsZURlZmluaXRpb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1NjaGVtYXNJblRhYmxlRGVmaW5pdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMjAwMSw2ICszMjk1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c1NlbGVjdEZvclVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgaW5zZXJ0TmV3UmVjb3JkKCk7CiAKQEAgLTIwMjIsNiArMzMyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzU3RhdGVtZW50UG9vbGluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzU3RhdGVtZW50UG9vbGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNTdGF0ZW1lbnRQb29saW5nKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTIwMjksNiArMzM0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzU3RvcmVkUHJvY2VkdXJlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNTdG9yZWRQcm9jZWR1cmVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTIwMzYsNiArMzM1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzU3VicXVlcmllc0luQ29tcGFyaXNvbnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c1N1YnF1ZXJpZXNJbkNvbXBhcmlzb25zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1N1YnF1ZXJpZXNJbkNvbXBhcmlzb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTIwNDMsNiArMzM3MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzU3VicXVlcmllc0luRXhpc3RzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNTdWJxdWVyaWVzSW5FeGlzdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzU3VicXVlcmllc0luRXhpc3RzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGluc2VydE5ld1JlY29yZCgpOwogCkBAIC0yMDY2LDYgKzM0MDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c1N1YnF1ZXJpZXNJbklucygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzU3VicXVlcmllc0luSW5zIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1N1YnF1ZXJpZXNJbklucygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0yMDczLDYgKzM0MjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c1N1YnF1ZXJpZXNJblF1YW50aWZpZWRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNTdWJxdWVyaWVzSW5RdWFudGlmaWVkcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNTdWJxdWVyaWVzSW5RdWFudGlmaWVkcygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBKREJDIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICB9CkBAIC0yMDgwLDYgKzM0MzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNzdXBwb3J0c1RhYmxlQ29ycmVsYXRpb25OYW1lcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzVGFibGVDb3JyZWxhdGlvbk5hbWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1RhYmxlQ29ycmVsYXRpb25OYW1lcygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBpbnNlcnROZXdSZWNvcmQoKTsKIApAQCAtMjEwNSw2ICszNDcxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjc3VwcG9ydHNUcmFuc2FjdGlvbklzb2xhdGlvbkxldmVsKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkLiAiICsKKyAgICAgICAgICAgICAgICAgICJWZXJpZmljYXRpb24gd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInN1cHBvcnRzVHJhbnNhY3Rpb25Jc29sYXRpb25MZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3VwcG9ydHNUcmFuc2FjdGlvbklzb2xhdGlvbkxldmVsSSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSgiZGF0YWJhc2Ugc3VwcG9ydHMgVFJBTlNBQ1RJT05fTk9ORSBpc29sYXRpb24gbGV2ZWwiLCBtZXRhCiAgICAgICAgICAgICAgICAgLnN1cHBvcnRzVHJhbnNhY3Rpb25Jc29sYXRpb25MZXZlbChDb25uZWN0aW9uLlRSQU5TQUNUSU9OX05PTkUpKTsKQEAgLTIxMzIsNiArMzUwOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzVHJhbnNhY3Rpb25zKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic3VwcG9ydHNUcmFuc2FjdGlvbnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3N1cHBvcnRzVHJhbnNhY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTIxMzksNiArMzUyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzVW5pb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c1VuaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1VuaW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTIxNDYsNiArMzU0MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3N1cHBvcnRzVW5pb25BbGwoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzdXBwb3J0c1VuaW9uQWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdXBwb3J0c1VuaW9uQWxsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IEpEQkMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eQogICAgIH0KQEAgLTIxNTMsNiArMzU1NiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI3VwZGF0ZXNBcmVEZXRlY3RlZChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1cGRhdGVzQXJlRGV0ZWN0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZXNBcmVEZXRlY3RlZEkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgICAgICAgInZpc2libGUgcm93IHVwZGF0ZSBjYW4gYmUgZGV0ZWN0ZWQgZm9yIFRZUEVfRk9SV0FSRF9PTkxZIHR5cGUiLApAQCAtMjE3MCw2ICszNTgzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjdXNlc0xvY2FsRmlsZVBlclRhYmxlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidXNlc0xvY2FsRmlsZVBlclRhYmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91c2VzTG9jYWxGaWxlUGVyVGFibGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpAQCAtMjE3Nyw2ICszNTk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjdXNlc0xvY2FsRmlsZXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ1c2VzTG9jYWxGaWxlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdXNlc0xvY2FsRmlsZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogSkRCQyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvRGVsZXRlRnVuY3Rpb25hbGl0eVRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL0RlbGV0ZUZ1bmN0aW9uYWxpdHlUZXN0LmphdmEKaW5kZXggZjAwYTdjZi4uNjIxY2Y2MCAxMDA3NTUKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvRGVsZXRlRnVuY3Rpb25hbGl0eVRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9EZWxldGVGdW5jdGlvbmFsaXR5VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmphdmEuc3FsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOwogaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwpAQCAtMzAsNyArMzUsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCitAVGVzdFRhcmdldENsYXNzKFN0YXRlbWVudC5jbGFzcykKIHB1YmxpYyBjbGFzcyBEZWxldGVGdW5jdGlvbmFsaXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CkBAIC0xMjEsNiArMTI2LDE1IEBACiAgICAgICogQHRlc3RzIERlbGV0ZUZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3REZWxldGUxKCkuIERlbGV0ZXMgcm93IHdpdGggbm8KICAgICAgKiAgICAgICAgcmVmZXJlbmNpbmcgb25lcyBhbmQgUkVTVFJJQ1QgYWN0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBEZWxldGVzIHJvdyB3aXRoIG5vIHJlZmVyZW5jaW5nIG9uZXMgYW5kIFJFU1RSSUNUIGFjdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlMSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBEYXRhYmFzZUNyZWF0b3IuZmlsbEZLU3RyaWN0VGFibGUoY29ubik7CiAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCJERUxFVEUgRlJPTSAiICsgRGF0YWJhc2VDcmVhdG9yLlBBUkVOVF9UQUJMRQpAQCAtMTQ3LDYgKzE2MSwxNSBAQAogICAgICAqIEB0ZXN0cyBEZWxldGVGdW5jdGlvbmFsaXR5VGVzdCN0ZXN0RGVsZXRlMygpLiBEZWxldGVzIGFsbCByZWZlcmVuY2luZwogICAgICAqICAgICAgICByb3dzIGFuZCB0aGVuIGRlbGV0ZXMgcmVmZXJlbmNlZCBvbmUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IERlbGV0ZXMgYWxsIHJlZmVyZW5jaW5nIHJvd3MgYW5kIHRoZW4gZGVsZXRlcyByZWZlcmVuY2VkIG9uZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlMygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgiREVMRVRFIEZST00gIiArIERhdGFiYXNlQ3JlYXRvci5GS1NUUklDVF9UQUJMRQogICAgICAgICAgICAgICAgICsgIiBXSEVSRSBuYW1lX2lkID0gMTsiKTsKQEAgLTE1OCw2ICsxODEsMTUgQEAKICAgICAgKiBAdGVzdHMgRGVsZXRlRnVuY3Rpb25hbGl0eVRlc3QjdGVzdERlbGV0ZTQoKS4gRGVsZXRlcyByb3cgd2l0aCBubwogICAgICAqICAgICAgICByZWZlcmVuY2luZyBvbmVzIGFuZCBDQVNDQURFIGFjdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogRGVsZXRlcyByb3cgd2l0aCBubyByZWZlcmVuY2luZyBvbmVzIGFuZCBDQVNDQURFIGFjdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlNCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBEYXRhYmFzZUNyZWF0b3IuZmlsbEZLQ2FzY2FkZVRhYmxlKGNvbm4pOwogICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgiREVMRVRFIEZST00gIiArIERhdGFiYXNlQ3JlYXRvci5QQVJFTlRfVEFCTEUKQEAgLTE2OSw2ICsyMDEsMjEgQEAKICAgICAgKiAgICAgICAgcmVmZXJlbmNpbmcgb25lcyBhbmQgQ0FTQ0FERSBhY3Rpb24gLSBleHBlY3RpbmcgYWxsIHJlZmVyZW5jaW5nCiAgICAgICogICAgICAgIHJvd3Mgd2lsbCBhbHNvIGJlIGRlbGV0ZWQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IEF0dGVtcHRzIHRvIGRlbGV0ZSByb3cgd2l0aCByZWZlcmVuY2luZyAiICsKKyAgICAgICAgICAgICAgICAib25lcyBhbmQgQ0FTQ0FERSBhY3Rpb24gLSBleHBlY3RpbmcgYWxsIHJlZmVyZW5jaW5nIHJvd3MgIiArCisgICAgICAgICAgICAgICAgIndpbGwgYWxzbyBiZSBkZWxldGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZTUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoIkRFTEVURSBGUk9NICIgKyBEYXRhYmFzZUNyZWF0b3IuUEFSRU5UX1RBQkxFCiAgICAgICAgICAgICAgICAgKyAiIFdIRVJFIGlkID0gMTsiKTsKQEAgLTIwMSw2ICsyNDgsMTUgQEAKICAgICAgKiBAdGVzdHMgRGVsZXRlRnVuY3Rpb25hbGl0eVRlc3QjdGVzdERlbGV0ZTcoKS4gRGVsZXRlcyByb3dzIHVzaW5nCiAgICAgICogICAgICAgIFByZXBhcmVkU3RhdGVtZW50CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBEZWxldGVzIHJvd3MgdXNpbmcgUHJlcGFyZWRTdGF0ZW1lbnQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlNygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBEYXRhYmFzZUNyZWF0b3IuZmlsbFRlc3RUYWJsZTUoY29ubik7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0YXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIkRFTEVURSBGUk9NICIKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL0luc2VydEZ1bmN0aW9uYWxpdHlUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9JbnNlcnRGdW5jdGlvbmFsaXR5VGVzdC5qYXZhCmluZGV4IDdhZDJkM2UuLmRhOWUwNDUgMTAwNzU1Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL0luc2VydEZ1bmN0aW9uYWxpdHlUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvSW5zZXJ0RnVuY3Rpb25hbGl0eVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5qYXZhLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CiBpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKIGltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKQEAgLTMxLDYgKzM2LDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhTdGF0ZW1lbnQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgSW5zZXJ0RnVuY3Rpb25hbGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBDb25uZWN0aW9uIGNvbm4gPSBudWxsOwpAQCAtMTM3LDYgKzE0MywxNiBAQAogICAgICAqIEB0ZXN0cyBJbnNlcnRGdW5jdGlvbmFsaXR5VGVzdCN0ZXN0SW5zZXJ0MSgpLiBBdHRlbXB0cyB0byBpbnNlcnQgcm93IGludG8KICAgICAgKiAgICAgICAgdGFibGUgd2l0aCBpbnRlZ3JpdHkgY2hlY2tpbmcKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IEF0dGVtcHRzIHRvIGluc2VydCByb3cgaW50byAiICsgCisgICAgICAgICAgICAgICAgICAidGFibGUgd2l0aCBpbnRlZ3JpdHkgY2hlY2tpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluc2VydDEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgRGF0YWJhc2VDcmVhdG9yLmZpbGxQYXJlbnRUYWJsZShjb25uKTsKICAgICAgICAgRGF0YWJhc2VDcmVhdG9yLmZpbGxGS1N0cmljdFRhYmxlKGNvbm4pOwpAQCAtMTUyLDYgKzE2OCwxNiBAQAogICAgICAqICAgICAgICB0YWJsZSB3aXRoIGludGVncml0eSBjaGVja2luZyB3aGVuIHJvdyBoYXMgaW5jb3JyZWN0IGZvcmVpZ24ga2V5CiAgICAgICogICAgICAgIHZhbHVlIC0gZXhwZWN0aW5nIFNRTEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogQXR0ZW1wdHMgdG8gaW5zZXJ0IHJvdyBpbnRvIHRhYmxlIHdpdGggIiArCisgICAgICAgICAgICAgICAgImludGVncml0eSBjaGVja2luZyB3aGVuIHJvdyBoYXMgaW5jb3JyZWN0IGZvcmVpZ24ga2V5IHZhbHVlIC0gZXhwZWN0aW5nIFNRTEV4Y2VwdGlvbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0MigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBEYXRhYmFzZUNyZWF0b3IuZmlsbFBhcmVudFRhYmxlKGNvbm4pOwogICAgICAgICBEYXRhYmFzZUNyZWF0b3IuZmlsbEZLU3RyaWN0VGFibGUoY29ubik7CkBAIC0xNzgsNiArMjA0LDE5IEBACiAgICAgICogQHRlc3RzIEluc2VydEZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RJbnNlcnQzKCkuIFRlc3RzIElOU0VSVCAuLi4gU0VMRUNUCiAgICAgICogICAgICAgIGZ1bmN0aW9uYWxpdHkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFRlc3RzIElOU0VSVCAuLi4gU0VMRUNUIGZ1bmN0aW9uYWxpdHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0MygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBEYXRhYmFzZUNyZWF0b3IuZmlsbFBhcmVudFRhYmxlKGNvbm4pOwogICAgICAgICBEYXRhYmFzZUNyZWF0b3IuZmlsbEZLU3RyaWN0VGFibGUoY29ubik7CkBAIC0xOTUsNiArMjM0LDE5IEBACiAgICAgICogQHRlc3RzIEluc2VydEZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RJbnNlcnQ0KCkuIFRlc3RzIElOU0VSVCAuLi4gU0VMRUNUCiAgICAgICogICAgICAgIHdpdGggZXhwcmVzc2lvbnMgaW4gU0VMRUNUIHF1ZXJ5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBUZXN0cyBJTlNFUlQgLi4uIFNFTEVDVCB3aXRoIGV4cHJlc3Npb25zIGluIFNFTEVDVCBxdWVyeSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnQ0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIERhdGFiYXNlQ3JlYXRvci5maWxsU2ltcGxlVGFibGUxKGNvbm4pOwogICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgiSU5TRVJUIElOVE8gIiArIERhdGFiYXNlQ3JlYXRvci5TSU1QTEVfVEFCTEUyCkBAIC0yMTMsNiArMjY1LDE5IEBACiAgICAgICogQHRlc3RzIEluc2VydEZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RJbnNlcnQ1KCkuIEluc2VydHMgbXVsdGlwbGUgcm93cyB1c2luZwogICAgICAqICAgICAgICBVTklPTiBBTEwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IEluc2VydHMgbXVsdGlwbGUgcm93cyB1c2luZyBVTklPTiBBTEwiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0NSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgiSU5TRVJUIElOVE8gIiArIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFNQogICAgICAgICAgICAgICAgICsgIiBTRUxFQ1QgMSBhcyB0ZXN0SWQsIDIgYXMgdGVzdFZhbHVlICIKQEAgLTIyOSw2ICsyOTQsMTUgQEAKICAgICAgKiBAdGVzdHMgSW5zZXJ0RnVuY3Rpb25hbGl0eVRlc3QjdGVzdEluc2VydDYoKS4gVGVzdHMgSU5TRVJUIHdpdGgKICAgICAgKiAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFRlc3RzIElOU0VSVCB3aXRoIFByZXBhcmVkU3RhdGVtZW50IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluc2VydFByZXBhcmVkKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0YXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIklOU0VSVCBJTlRPICIKICAgICAgICAgICAgICAgICArIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFNSArICIgVkFMVUVTKD8sID8pIik7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9NdWx0aVRocmVhZEFjY2Vzc1Rlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL011bHRpVGhyZWFkQWNjZXNzVGVzdC5qYXZhCmluZGV4IGI4OGFhNGUuLjY3NzA2MjQgMTAwNzU1Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL011bHRpVGhyZWFkQWNjZXNzVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL011bHRpVGhyZWFkQWNjZXNzVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmphdmEuc3FsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CkBAIC0zMiw2ICszNyw3IEBACiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlRocmVhZFBvb2w7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU3RhdGVtZW50LmNsYXNzKQogcHVibGljIGNsYXNzIE11bHRpVGhyZWFkQWNjZXNzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIENvbm5lY3Rpb24gY29ubjsKQEAgLTEyNyw2ICsxMzMsMTYgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogQSBmZXcgdGhyZWFkcyBleGVjdXRlIHNlbGVjdCBvcGVyYXRpb24gIiArIAorICAgICAgICAgICAgICAgICJpbiB0aGUgc2FtZSB0aW1lIGZvciBvbmUgdGFibGUgaW4gdGhlIGRhdGFiYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfTXVsdGlwbGVBY2Nlc3NUb09uZVRhYmxlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgaSsrKSB7CiAgICAgICAgICAgICB0aHJlYWRQb29sLnJ1blRhc2soY3JlYXRlVGFzazEoaSkpOwpAQCAtMTQwLDYgKzE1NiwxNiBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBBIGZldyB0aHJlYWRzIGV4ZWN1dGUgc2VsZWN0IG9wZXJhdGlvbiAiICsKKyAgICAgICAgICAgICAgICAgICJpbiB0aGUgc2FtZSB0aW1lIGZvciBkaWZmZXJlbnQgdGFibGVzIGluIHRoZSBkYXRhYmFzZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfTXVsdGlwbGVBY2Nlc3NUb1NldmVyYWxUYWJsZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgdGhyZWFkUG9vbC5ydW5UYXNrKGNyZWF0ZVRhc2sxKDEpKTsKICAgICAgICAgdGhyZWFkUG9vbC5ydW5UYXNrKGNyZWF0ZVRhc2syKDIpKTsKQEAgLTE1Myw2ICsxNzksMTYgQEAKICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogQSBmZXcgdGhyZWFkcyBleGVjdXRlIHVwZGF0ZSwgaW5zZXJ0ICIgKyAKKyAgICAgICAgICAgICAgICAiYW5kIGRlbGV0ZSBvcGVyYXRpb25zIGluIHRoZSBzYW1lIHRpbWUgZm9yIG9uZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2UiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X011bHRpcGxlT3BlcmF0aW9uc0luU2V2ZXJhbFRhYmxlcygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBpbnQgaWQxID0gbnVtT2ZSZWNvcmRzIC0gMTsKICAgICAgICAgdGhyZWFkUG9vbC5ydW5UYXNrKGNyZWF0ZVRhc2s0KGlkMSkpOwpAQCAtMjA4LDYgKzI0NCwxNiBAQAogICAgICAqIAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbCB0ZXN0OiBBIGZldyB0aHJlYWRzIGV4ZWN1dGUgdXBkYXRlIG9wZXJhdGlvbiAiICsKKyAgICAgICAgICAgICAgICAiaW4gdGhlIHNhbWUgdGltZSBmb3Igb25lIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X011bHRpcGxlVXBkYXRlc0luT25lVGFibGVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBpZCA9IDE7CiAgICAgICAgIFN0cmluZyBmaWVsZCA9ICJmaWVsZDMiOwpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL1NlbGVjdEZ1bmN0aW9uYWxpdHlUZXN0LmphdmEKaW5kZXggYTBkZWQ2YS4uOWM2YmYyMCAxMDA3NTUKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9TZWxlY3RGdW5jdGlvbmFsaXR5VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmphdmEuc3FsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKQEAgLTM3LDYgKzQyLDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhTdGF0ZW1lbnQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBDb25uZWN0aW9uIGNvbm47CkBAIC0xMzcsNiArMTQzLDE1IEBACiAgICAgICogQHRlc3RzIFNlbGVjdEZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RfU2VsZWN0U2ltcGxlKCkuIFNlbGVjdHMgYWxsIHJlY29yZHMKICAgICAgKiAgICAgICAgZnJvbSB0aGUgdGFibGUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFNlbGVjdHMgYWxsIHJlY29yZHMgZnJvbSB0aGUgdGFibGUiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NlbGVjdFNpbXBsZSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCAqIEZST00gIiArIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFMjsKICAgICAgICAgUmVzdWx0U2V0IHJlc3VsdCA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoc3FsKTsKQEAgLTE4MCw2ICsxOTUsMTUgQEAKICAgICAgKiBAdGVzdHMgU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QjdGVzdF9TZWxlY3RQcmVwYXJlZCgpLiBTZWxlY3RzIGFsbCByZWNvcmRzCiAgICAgICogICAgICAgIGZyb20gdGhlIHRhYmxlIHVzaW5nIHBhcmFtZXRyaWMgcXVlcnkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFNlbGVjdHMgYWxsIHJlY29yZHMgZnJvbSB0aGUgdGFibGUgdXNpbmcgcGFyYW1ldHJpYyBxdWVyeSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VsZWN0UHJlcGFyZWQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgZmludGVnZXIsIGZ0ZXh0LCBmY2hhcmFjdGVyLCBmZGVjaW1hbCwgZm51bWVyaWMsIgogICAgICAgICAgICAgICAgICsgIiBmc21hbGxpbnQsIGZmbG9hdCwgZnJlYWwsIGZkb3VibGUsIGZkYXRlLCBmdGltZSIgKyAiIEZST00gIgpAQCAtMjQyLDYgKzI2NiwxNSBAQAogICAgICAqIEB0ZXN0cyBTZWxlY3RGdW5jdGlvbmFsaXR5VGVzdCN0ZXN0X1N1YlNlbGVjdCgpLiBTZWxlY3RzIHJlY29yZHMgZnJvbSB0aGUKICAgICAgKiAgICAgICAgdGFibGUgdXNpbmcgc3Vic2VsZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBTZWxlY3RzIHJlY29yZHMgZnJvbSB0aGUgdGFibGUgdXNpbmcgc3Vic2VsZWN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TdWJTZWxlY3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgZmludGVnZXIsIiArICIgKFNFTEVDVCBmdGV4dCBGUk9NICIKICAgICAgICAgICAgICAgICArIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFMiArICIgV0hFUkUgZmludGVnZXIgPSAxKSBhcyBmdGV4dCIKQEAgLTI3MSw2ICszMDQsMTUgQEAKICAgICAgKiBAdGVzdHMgU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QjdGVzdF9TZWxlY3RUaHJlZVRhYmxlcygpLiBTZWxlY3RzIHJlY29yZHMKICAgICAgKiAgICAgICAgZnJvbSBhIGZldyB0YWJsZXMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFNlbGVjdHMgcmVjb3JkcyBmcm9tIGEgZmV3IHRhYmxlcyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VsZWN0VGhyZWVUYWJsZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1Qgb251bSwgIiArIERhdGFiYXNlQ3JlYXRvci5PUkRFUlNfVEFCTEUgKyAiLmNudW0iCiAgICAgICAgICAgICAgICAgKyAiIEZST00gIiArIERhdGFiYXNlQ3JlYXRvci5TQUxFU1BFT1BMRV9UQUJMRSArICIsICIKQEAgLTMwOSw2ICszNTEsMTUgQEAKICAgICAgKiBAdGVzdHMgU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QjdGVzdF9TZWxlY3RUaHJlZVRhYmxlcygpLiBTZWxlY3RzIHJlY29yZHMKICAgICAgKiAgICAgICAgZnJvbSBhIHRhYmxlIHVzaW5nIHVuaW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBTZWxlY3RzIHJlY29yZHMgZnJvbSBhIHRhYmxlIHVzaW5nIHVuaW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TZWxlY3RVbmlvbkl0c2VsZigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBiLmNudW0sIGIuY25hbWUiICsgIiBGUk9NICIKICAgICAgICAgICAgICAgICArIERhdGFiYXNlQ3JlYXRvci5DVVNUT01FUlNfVEFCTEUgKyAiIGEsICIKQEAgLTMzNyw2ICszODgsMTUgQEAKICAgICAgKiBAdGVzdHMgU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QjdGVzdF9TZWxlY3RMZWZ0T3V0ZXJKb2luKCkuIFNlbGVjdHMKICAgICAgKiAgICAgICAgcmVjb3JkcyBmcm9tIGEgdGFibGUgdXNpbmcgbGVmdCBqb2luCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBTZWxlY3RzIHJlY29yZHMgZnJvbSBhIHRhYmxlIHVzaW5nIGxlZnQgam9pbiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VsZWN0TGVmdE91dGVySm9pbigpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBkaXN0aW5jdCBzLnNudW0gYXMgc3NudW0sIGMuc251bSBhcyBjY251bSBGUk9NICIKICAgICAgICAgICAgICAgICArIERhdGFiYXNlQ3JlYXRvci5DVVNUT01FUlNfVEFCTEUgKyAiIGMgbGVmdCBvdXRlciBqb2luICIKQEAgLTQwMCw2ICs0NjAsMTUgQEAKICAgICAgKiBAdGVzdHMgU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QjdGVzdF9TZWxlY3RHcm91cEJ5KCkuIFNlbGVjdHMgcmVjb3JkcyBmcm9tCiAgICAgICogICAgICAgIGEgdGFibGUgdXNpbmcgZ3JvdXAgYnkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFNlbGVjdHMgcmVjb3JkcyBmcm9tIGEgdGFibGUgdXNpbmcgZ3JvdXAgYnkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NlbGVjdEdyb3VwQnkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHNlbGVjdFF1ZXJ5ID0gIlNFTEVDVCByYXRpbmcsIFNVTShzbnVtKSBBUyBzdW0gRlJPTSAiCiAgICAgICAgICAgICAgICAgKyBEYXRhYmFzZUNyZWF0b3IuQ1VTVE9NRVJTX1RBQkxFICsgIiBHUk9VUCBCWSByYXRpbmciOwpAQCAtNDI3LDYgKzQ5NiwxNSBAQAogICAgICAqIEB0ZXN0cyBTZWxlY3RGdW5jdGlvbmFsaXR5VGVzdCN0ZXN0X1NlbGVjdE9yZGVyQnkoKS4gU2VsZWN0cyByZWNvcmRzIGZyb20KICAgICAgKiAgICAgICAgYSB0YWJsZSB1c2luZyBvcmRlciBieQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogU2VsZWN0cyByZWNvcmRzIGZyb20gYSB0YWJsZSB1c2luZyBvcmRlciBieSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU2VsZWN0T3JkZXJCeSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc2VsZWN0UXVlcnkgPSAiU0VMRUNUIG9udW0gRlJPTSAiICsgRGF0YWJhc2VDcmVhdG9yLk9SREVSU19UQUJMRQogICAgICAgICAgICAgICAgICsgIiBPUkRFUiBCWSBvbnVtIjsKQEAgLTQ2MCw2ICs1MzgsMTUgQEAKICAgICAgKiBAdGVzdHMgU2VsZWN0RnVuY3Rpb25hbGl0eVRlc3QjdGVzdF9TZWxlY3REaXN0aW5jdCgpLiBTZWxlY3RzIHJlY29yZHMKICAgICAgKiAgICAgICAgZnJvbSBhIHRhYmxlIHVzaW5nIGRpc3RpbmN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBTZWxlY3RzIHJlY29yZHMgZnJvbSBhIHRhYmxlIHVzaW5nIGRpc3RpbmN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TZWxlY3REaXN0aW5jdCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc2VsZWN0UXVlcnkgPSAiU0VMRUNUIERJU1RJTkNUIHJhdGluZyBGUk9NICIKICAgICAgICAgICAgICAgICArIERhdGFiYXNlQ3JlYXRvci5DVVNUT01FUlNfVEFCTEU7CkBAIC00ODQsNyArNTcxLDE2IEBACiAgICAgICogQHRlc3RzIFNlbGVjdEZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RfU2VsZWN0QWdyZWdhdGVGdW5jdGlvbnMoKS4gU2VsZWN0cwogICAgICAqICAgICAgICByZWNvcmRzIGZyb20gYSB0YWJsZSB1c2luZyBhZ3JlZ2F0ZSBmdW5jdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X1NlbGVjdEFncmVnYXRlRnVuY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBTZWxlY3RzIHJlY29yZHMgZnJvbSBhIHRhYmxlIHVzaW5nIGFncmVnYXRlIGZ1bmN0aW9ucyIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X1NlbGVjdEFncmVnYXRlRnVuY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBzZWxlY3RDb3VudCA9ICJTRUxFQ1QgY291bnQob251bSkgYXMgY291bnQgRlJPTSAiCiAgICAgICAgICAgICAgICAgKyBEYXRhYmFzZUNyZWF0b3IuT1JERVJTX1RBQkxFOwogICAgICAgICBTdHJpbmcgc2VsZWN0U3VtID0gIlNFTEVDVCBzdW0ob251bSkgYXMgc3VtIEZST00gIgpAQCAtNTIxLDYgKzYxNywxNSBAQAogICAgICAqIEB0ZXN0cyBTZWxlY3RGdW5jdGlvbmFsaXR5VGVzdCN0ZXN0X1NlbGVjdEhhdmluZygpLiBTZWxlY3RzIHJlY29yZHMgZnJvbQogICAgICAqICAgICAgICBhIHRhYmxlIHVzaW5nIGhhdmluZwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogU2VsZWN0cyByZWNvcmRzIGZyb20gYSB0YWJsZSB1c2luZyBoYXZpbmciLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NlbGVjdEhhdmluZygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc2VsZWN0UXVlcnkgPSAiU0VMRUNUIHNudW0sIG1heChhbXQpIEFTIG1heCBGUk9NICIKICAgICAgICAgICAgICAgICArIERhdGFiYXNlQ3JlYXRvci5PUkRFUlNfVEFCTEUKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL1N0cmVzc1Rlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL1N0cmVzc1Rlc3QuamF2YQppbmRleCBmYmFmZTgyLi5mYzg3NDg3IDEwMDc1NQotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9TdHJlc3NUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvU3RyZXNzVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiwxNCBAQAogCiBwYWNrYWdlIHRlc3RzLmphdmEuc3FsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLkRyaXZlck1hbmFnZXI7CiBpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CiBpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwogaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKQEAgLTMyLDYgKzM4LDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDb25uZWN0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIFN0cmVzc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgVmVjdG9yPENvbm5lY3Rpb24+IHZjID0gbmV3IFZlY3RvcjxDb25uZWN0aW9uPigpOwogCkBAIC0xMDgsNiArMTE1LDE1IEBACiAgICAgICogQHRlc3RzIFN0cmVzc1Rlc3QjdGVzdE1hbnlDb25uZWN0aW9uc1VzaW5nT25lVGhyZWFkKCkuIENyZWF0ZSBtYW55CiAgICAgICogICAgICAgIGNvbm5lY3Rpb25zIHRvIHRoZSBEYXRhQmFzZSB1c2luZyBvbmUgdGhyZWFkLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlN0cmVzcyB0ZXN0OiBDcmVhdGUgbWFueSBjb25uZWN0aW9ucyB0byB0aGUgRGF0YUJhc2UgdXNpbmcgb25lIHRocmVhZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1ldGFEYXRhIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnlDb25uZWN0aW9uc1VzaW5nT25lVGhyZWFkKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IG1heENvbm5lY3Rpb25zID0gZ2V0Q29ubmVjdGlvbk51bSgpOwpAQCAtMTIzLDYgKzEzOSwxNSBAQAogICAgICAqIEB0ZXN0cyBTdHJlc3NUZXN0I3Rlc3RNYW55Q29ubmVjdGlvbnNVc2luZ01hbnlUaHJlYWRzKCkuIENyZWF0ZSBtYW55CiAgICAgICogICAgICAgIGNvbm5lY3Rpb25zIHRvIHRoZSBEYXRhQmFzZSB1c2luZyBzb21lIHRocmVhZHMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU3RyZXNzIHRlc3Q6IENyZWF0ZSBtYW55IGNvbm5lY3Rpb25zIHRvIHRoZSBEYXRhQmFzZSB1c2luZyBzb21lIHRocmVhZHMiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnlDb25uZWN0aW9uc1VzaW5nTWFueVRocmVhZHMoKSB7CiAgICAgICAgIGludCBudW1UYXNrcyA9IGdldENvbm5lY3Rpb25OdW0oKTsKIApAQCAtMTUyLDYgKzE3NywxNSBAQAogICAgICAqIEB0ZXN0cyBTdHJlc3NUZXN0I3Rlc3RJbnNlcnRPZk1hbnlSb3dzVXNpbmdPbmVUaHJlYWQoKS4gSW5zZXJ0IGEgbG90IG9mCiAgICAgICogICAgICAgIHJlY29yZHMgdG8gdGhlIERhdGFCYXNlIHVzaW5nIGEgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRPZk1hbnlSb3dzVXNpbmdPbmVUaHJlYWQoKSB7CiAgICAgICAgIC8vIFRPRE8gQ3Jhc2hlcyBWTS4gRml4IGxhdGVyLgogICAgICAgICAvKgpAQCAtMTcyLDYgKzIwNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkVtcHR5IHRlc3QiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0T2ZNYW55Um93c1VzaW5nTWFueVRocmVhZHMoKSB7CiAgICAgICAgIC8vIFRPRE8gQ3Jhc2hlcyBWTS4gRml4IGxhdGVyLgogICAgICAgICAvKgpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvVXBkYXRlRnVuY3Rpb25hbGl0eVRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL1VwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0LmphdmEKaW5kZXggYjk3NjFjZC4uZTRlNmU0OSAxMDA3NTUKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YS9zcWwvVXBkYXRlRnVuY3Rpb25hbGl0eVRlc3QuamF2YQorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9VcGRhdGVGdW5jdGlvbmFsaXR5VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmphdmEuc3FsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOwpAQCAtMzEsNiArMzYsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwogCitAVGVzdFRhcmdldENsYXNzKFN0YXRlbWVudC5jbGFzcykKIHB1YmxpYyBjbGFzcyBVcGRhdGVGdW5jdGlvbmFsaXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1iZXJPZlJlY29yZHMgPSAyMDsKQEAgLTExOSw2ICsxMjUsMTkgQEAKICAgICAgKiBAdGVzdHMgVXBkYXRlRnVuY3Rpb25hbGl0eVRlc3QjdGVzdFVwZGF0ZTEoKS4gVXBkYXRlcyBhbGwgdmFsdWVzIGluIG9uZQogICAgICAqICAgICAgICBjb2x1bW4gaW4gdGhlIHRhYmxlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBVcGRhdGVzIGFsbCB2YWx1ZXMgaW4gb25lIGNvbHVtbiBpbiB0aGUgdGFibGUiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlVXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlMSgpIHsKICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gIm5ld1ZhbHVlIjsKICAgICAgICAgU3RyaW5nIHVwZGF0ZVF1ZXJ5ID0gIlVQREFURSAiICsgRGF0YWJhc2VDcmVhdG9yLlRFU1RfVEFCTEUxCkBAIC0xNDQsNiArMTYzLDE5IEBACiAgICAgICogQHRlc3RzIFVwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RVcGRhdGUyKCkuIFVwZGF0ZXMgdmFsdWVzIGluIG9uZQogICAgICAqICAgICAgICBjb2x1bW4gaW4gdGhlIHRhYmxlIHVzaW5nIHdoZXJlIGNvbmRpdGlvbiBpbiB1cGRhdGUgY29tbWFuZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogVXBkYXRlcyB2YWx1ZXMgaW4gb25lIGNvbHVtbiBpbiB0aGUgdGFibGUgdXNpbmcgd2hlcmUgY29uZGl0aW9uIGluIHVwZGF0ZSBjb21tYW5kIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZTIoKSB7CiAgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9ICJuZXdWYWx1ZSI7CiAgICAgICAgIFN0cmluZyB1cGRhdGVRdWVyeSA9ICJVUERBVEUgIiArIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFMQpAQCAtMTc2LDYgKzIwOCwxOSBAQAogICAgICAqIEB0ZXN0cyBVcGRhdGVGdW5jdGlvbmFsaXR5VGVzdCN0ZXN0VXBkYXRlMygpLiBVcGRhdGVzIHZhbHVlcyBpbiBhIHNldmVyYWwKICAgICAgKiAgICAgICAgY29sdW1ucyBpbiB0aGUgdGFibGUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFVwZGF0ZXMgdmFsdWVzIGluIGEgc2V2ZXJhbCBjb2x1bW5zIGluIHRoZSB0YWJsZSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVVcGRhdGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGUzKCkgewogICAgICAgICBpbnQgbmV3VmFsdWUxID0gLTE7CiAgICAgICAgIGludCBuZXdWYWx1ZTIgPSAtMjsKQEAgLTIwNSw2ICsyNTAsMjAgQEAKICAgICAgKiBAdGVzdHMgVXBkYXRlRnVuY3Rpb25hbGl0eVRlc3QjdGVzdFVwZGF0ZTQoKS4gVXBkYXRlcyB2YWx1ZXMgaW4gYSBzZXZlcmFsCiAgICAgICogICAgICAgIGNvbHVtbnMgaW4gdGhlIHRhYmxlIHVzaW5nIHdoZXJlIGNvbmRpdGlvbiBpbiB1cGRhdGUgY29tbWFuZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogVXBkYXRlcyB2YWx1ZXMgaW4gYSBzZXZlcmFsICIgKyAKKyAgICAgICAgICAgICAgICAgICJjb2x1bW5zIGluIHRoZSB0YWJsZSB1c2luZyB3aGVyZSBjb25kaXRpb24gaW4gdXBkYXRlIGNvbW1hbmQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlVXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlNCgpIHsKICAgICAgICAgaW50IG5ld1ZhbHVlMSA9IC0xOwogICAgICAgICBpbnQgbmV3VmFsdWUyID0gLTI7CkBAIC0yNDQsNiArMzAzLDE5IEBACiAgICAgICogQHRlc3RzIFVwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RVcGRhdGU1KCkuIFVwZGF0ZXMgdmFsdWVzIGluIG9uZQogICAgICAqICAgICAgICBjb2x1bW5zIGluIHRoZSB0YWJsZSB1c2luZyBjb25kaXRpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFVwZGF0ZXMgdmFsdWVzIGluIG9uZSBjb2x1bW5zIGluIHRoZSB0YWJsZSB1c2luZyBjb25kaXRpb24iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlVXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlNSgpIHsKICAgICAgICAgaW50IGZhY3RvciA9IDM7CiAgICAgICAgIFN0cmluZyB1cGRhdGVRdWVyeSA9ICJVUERBVEUgIiArIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFMQpAQCAtMjgyLDYgKzM1NCwxOSBAQAogICAgICAqIEB0ZXN0cyBVcGRhdGVGdW5jdGlvbmFsaXR5VGVzdCN0ZXN0VXBkYXRlNigpLiBTZXRzIHZhbHVlIG9mIGZpZWxkMiB0bwogICAgICAqICAgICAgICBkZWZhdWx0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBTZXRzIHZhbHVlIG9mIGZpZWxkMiB0byBkZWZhdWx0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVVwZGF0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZTYoKSB7CiAgICAgICAgIFN0cmluZyB1cGRhdGVRdWVyeSA9ICJVUERBVEUgIiArIERhdGFiYXNlQ3JlYXRvci5URVNUX1RBQkxFMQogICAgICAgICAgICAgICAgICsgIiBTRVQgZmllbGQyPScxJyI7CkBAIC0zMDksNiArMzk0LDE5IEBACiAgICAgICogQHRlc3RzIFVwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RVcGRhdGU3KCkuIFVwZGF0ZXMgcmVjb3JkcyBpbiB0aGUKICAgICAgKiAgICAgICAgdGFibGUgdXNpbmcgc3VicXVlcnkgaW4gdXBkYXRlIGNvbW1hbmQKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFVwZGF0ZXMgcmVjb3JkcyBpbiB0aGUgdGFibGUgdXNpbmcgc3VicXVlcnkgaW4gdXBkYXRlIGNvbW1hbmQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlVXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlNygpIHsKICAgICAgICAgU3RyaW5nIHVwZGF0ZVF1ZXJ5ID0gIlVQREFURSAiICsgRGF0YWJhc2VDcmVhdG9yLlRFU1RfVEFCTEUxCiAgICAgICAgICAgICAgICAgKyAiIFNFVCBmaWVsZDI9JzEnIFdIRVJFIGlkIDwgKCBTRUxFQ1QgQ09VTlQoKikgRlJPTSAiCkBAIC0zNDIsNiArNDQwLDE5IEBACiAgICAgICogQHRlc3RzIFVwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0I3Rlc3RVcGRhdGU4KCkuIFNldHMgdmFsdWUgb2YgZmllbGQyIHRvCiAgICAgICogICAgICAgIE5VTEwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFNldHMgdmFsdWUgb2YgZmllbGQyIHRvIE5VTEwiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlVXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlUXVlcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlOCgpIHsKICAgICAgICAgU3RyaW5nIHVwZGF0ZVF1ZXJ5ID0gIlVQREFURSAiICsgRGF0YWJhc2VDcmVhdG9yLlRFU1RfVEFCTEUxCiAgICAgICAgICAgICAgICAgKyAiIFNFVCBmaWVsZDI9TlVMTCI7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZhL3NxbC9VcGRhdGVGdW5jdGlvbmFsaXR5VGVzdDIuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL1VwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0Mi5qYXZhCmluZGV4IDdiY2JmZjYuLmU2NGVjYjIgMTAwNzU1Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL1VwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0Mi5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmEvc3FsL1VwZGF0ZUZ1bmN0aW9uYWxpdHlUZXN0Mi5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmphdmEuc3FsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOwogaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwpAQCAtMzEsNiArMzYsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwogCitAVGVzdFRhcmdldENsYXNzKFN0YXRlbWVudC5jbGFzcykKIHB1YmxpYyBjbGFzcyBVcGRhdGVGdW5jdGlvbmFsaXR5VGVzdDIgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBDb25uZWN0aW9uIGNvbm4gPSBudWxsOwpAQCAtMTM3LDYgKzE0MywxNSBAQAogICAgICAqIEB0ZXN0cyBVcGRhdGVGdW5jdGlvbmFsaXR5VGVzdDIjdGVzdFVwZGF0ZTEoKS4gVXBkYXRlcyByb3cgd2l0aCBubwogICAgICAqICAgICAgICByZWZlcmVuY2luZyBvbmVzIGFuZCBSRVNUUklDVCBhY3Rpb24KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJGdW5jdGlvbmFsaXR5IHRlc3Q6IFVwZGF0ZXMgcm93IHdpdGggbm8gcmVmZXJlbmNpbmcgb25lcyBhbmQgUkVTVFJJQ1QgYWN0aW9uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGUxKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIERhdGFiYXNlQ3JlYXRvci5maWxsRktTdHJpY3RUYWJsZShjb25uKTsKICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoIlVQREFURSAiICsgRGF0YWJhc2VDcmVhdG9yLlBBUkVOVF9UQUJMRQpAQCAtMTY1LDYgKzE4MCwxNSBAQAogICAgICAqIEB0ZXN0cyBVcGRhdGVGdW5jdGlvbmFsaXR5VGVzdDIjdGVzdFVwZGF0ZTMoKS4gRGVsZXRlcyBhbGwgcmVmZXJlbmNpbmcKICAgICAgKiAgICAgICAgcm93cyBhbmQgdGhlbiB1cGRhdGVzIHJlZmVyZW5jZWQgb25lCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBEZWxldGVzIGFsbCByZWZlcmVuY2luZyByb3dzIGFuZCB0aGVuIHVwZGF0ZXMgcmVmZXJlbmNlZCBvbmUiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZTMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgRGF0YWJhc2VDcmVhdG9yLmZpbGxGS1N0cmljdFRhYmxlKGNvbm4pOwogICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgiREVMRVRFIEZST00gIiArIERhdGFiYXNlQ3JlYXRvci5GS1NUUklDVF9UQUJMRQpAQCAtMTk1LDYgKzIxOSwyMCBAQAogICAgICAqICAgICAgICByZWZlcmVuY2luZyBvbmVzIGFuZCBDQVNDQURFIGFjdGlvbiAtIGV4cGVjdGluZyB0aGF0IGFsbAogICAgICAqICAgICAgICByZWZlcmVuY2luZyByb3dzIHdpbGwgYWxzbyBiZSB1cGRhdGVkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRnVuY3Rpb25hbGl0eSB0ZXN0OiBVcGRhdGVzIHJvdyB3aXRoIHJlZmVyZW5jaW5nIG9uZXMgYW5kICIgKworICAgICAgICAgICAgICAgICJDQVNDQURFIGFjdGlvbiAtIGV4cGVjdGluZyB0aGF0IGFsbCByZWZlcmVuY2luZyByb3dzIHdpbGwgYWxzbyBiZSB1cGRhdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGU1KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIERhdGFiYXNlQ3JlYXRvci5maWxsRktDYXNjYWRlVGFibGUoY29ubik7CiAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCJVUERBVEUgIiArIERhdGFiYXNlQ3JlYXRvci5QQVJFTlRfVEFCTEUKQEAgLTI1MSw2ICsyODksMTkgQEAKICAgICAgKiBAdGVzdHMgVXBkYXRlRnVuY3Rpb25hbGl0eVRlc3QyI3Rlc3RVcGRhdGU4KCkuIFVwZGF0ZXMgdGFibGUgdXNpbmcgc2NhbGFyCiAgICAgICogICAgICAgIHN1YnF1ZXJ5IGFzIG5ldyBmaWVsZCB2YWx1ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogVXBkYXRlcyB0YWJsZSB1c2luZyBzY2FsYXIgc3VicXVlcnkgYXMgbmV3IGZpZWxkIHZhbHVlIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZTgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoIlVQREFURSAiICsgRGF0YWJhc2VDcmVhdG9yLlNJTVBMRV9UQUJMRTMKICAgICAgICAgICAgICAgICArICIgU0VUIHNwZWVkID0gKFNFTEVDVCBNQVgoc3BlZWQpIEZST00gIgpAQCAtMjcyLDYgKzMyMywxNSBAQAogICAgICAqIEB0ZXN0cyBVcGRhdGVGdW5jdGlvbmFsaXR5VGVzdDIjdGVzdFVwZGF0ZTkoKS4gVXBkYXRlcyB0YWJsZSB1c2luZwogICAgICAqICAgICAgICBQcmVwYXJlZFN0YXRlbWVudAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkZ1bmN0aW9uYWxpdHkgdGVzdDogVXBkYXRlcyB0YWJsZSB1c2luZyBQcmVwYXJlZFN0YXRlbWVudCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVRdWVyeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGU5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIERhdGFiYXNlQ3JlYXRvci5maWxsVGVzdFRhYmxlNShjb25uKTsKICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RhdCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudCgiVVBEQVRFICIKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9Db25uZWN0aW9uRXZlbnRMaXN0ZW5lclRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9Db25uZWN0aW9uRXZlbnRMaXN0ZW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVhZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudExpc3RlbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgdGVzdHMuamF2YXguc3FsOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXI7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIjY29ubmVjdGlvbkNsb3NlZChqYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50KX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHRoZSBsaXN0ZW5lciBpcyBub3RpZmllZCB3aGVuIGEgY29ubmVjdGlvbiBjbG9zZWQgcmVndWxhcmx5LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInRlc3RDb25uZWN0aW9uRXZlbnRQb29sZWRDb25uZWN0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0Nvbm5lY3Rpb25FdmVudC5jbGFzc30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgCisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25DbG9zZWQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsgLy8gVE9ETworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0IHtAbGluayBqYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIjY29ubmVjdGlvbkVycm9yT2NjdXJyZWQoQ29ubmVjdGlvbkV2ZW50KX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHRoZSBsaXN0ZW5lciBpcyBub3RpZmllZCB3aGVuIGEgY29ubmVjdGlvbiBpcyB1bmF2YWlsYWJsZSBiZWNhdXNlIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ0ZXN0Q29ubmVjdGlvbkV2ZW50UG9vbGVkQ29ubmVjdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb25uZWN0aW9uRXZlbnQuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uRXJyb3JPY2N1cnJlZCgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvQ29ubmVjdGlvbkV2ZW50VGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTYyZWRmCi0tLSAvZGV2L251bGwKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL0Nvbm5lY3Rpb25FdmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIHRlc3RzLmphdmF4LnNxbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNxbC5Db25uZWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc3FsLlBvb2xlZENvbm5lY3Rpb247CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQ29ubmVjdGlvbkV2ZW50LmNsYXNzKQorcHVibGljIGNsYXNzIENvbm5lY3Rpb25FdmVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Db25uZWN0aW9uRXZlbnQjQ29ubmVjdGlvbkV2ZW50KFBvb2xlZENvbm5lY3Rpb24pfQorICAgICAqIEBzZWUge0BsaW5rIG9yZy5hcGFjaGUuaGFybW9ueS5zcWwudGVzdHMuamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudFRlc3R9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgQ29ubmVjdGlvbkV2ZW50KCkgY29uc3RydWN0b3IgZm9yIHRoZSBub3JtYWwgY2FzZS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ0ZXN0Q29ubmVjdGlvbkV2ZW50UG9vbGVkQ29ubmVjdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtQb29sZWRDb25uZWN0aW9uLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgCisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25FdmVudFBvb2xlZENvbm5lY3Rpb24oKSB7CisgICAgICAgIC8vIGRlbGVnYXRlIHRvIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZheC5zcWwuCisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsgLy8gVE9ETworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudCNDb25uZWN0aW9uRXZlbnQoUG9vbGVkQ29ubmVjdGlvbiwgU1FMRXhjZXB0aW9uKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBDb25uZWN0aW9uRXZlbnQoKSBjb25zdHJ1Y3RvciBmb3IgdGhlIGFibm9ybWFsIGNhc2UgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhlIHBvb2xlZCBjb25uZWN0aW9uLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInRlc3RDb25uZWN0aW9uRXZlbnRQb29sZWRDb25uZWN0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge1Bvb2xlZENvbm5lY3Rpb24uY2xhc3MsU1FMRXhjZXB0aW9uLmNsYXNzfSkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgKSAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkV2ZW50UG9vbGVkQ29ubmVjdGlvblNRTEV4Y2VwdGlvbigpIHsKKyAgICAgLy8gZGVsZWdhdGUgdG8gb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZheC5zcWwuCisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsgLy8gVE9ETworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudCNnZXRTUUxFeGNlcHRpb24oKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGEgU1FMRXhjZXB0aW9uIGlzIHRocm93biBhZnRlciBhbiBlcnJvciBoYXMgb2NjdXJyZWQgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbC4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsgQFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJ0ZXN0R2V0U1FMRXhjZXB0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEdldFNRTEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvQ29ubmVjdGlvblBvb2xEYXRhU291cmNlVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL0Nvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2I1ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL0Nvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSB0ZXN0cy5qYXZheC5zcWw7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgamF2YXguc3FsLkNvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZTsKKworCitAVGVzdFRhcmdldENsYXNzKENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZS5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uUG9vbERhdGFTb3VyY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuQ29ubmVjdGlvblBvb2xEYXRhU291cmNlI2dldExvZ2luVGltZW91dCgpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TG9naW5UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge0Nvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZS5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dpblRpbWVvdXQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsgLy8gVE9ETworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLkNvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZSNnZXRMb2dXcml0ZXIoKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldExvZ1dyaXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nV3JpdGVyKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7IC8vIFRPRE8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Db25uZWN0aW9uUG9vbERhdGFTb3VyY2UjZ2V0UG9vbGVkQ29ubmVjdGlvbigpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0UG9vbGVkQ29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9vbGVkQ29ubmVjdGlvbigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuQ29ubmVjdGlvblBvb2xEYXRhU291cmNlI2dldFBvb2xlZENvbm5lY3Rpb24oU3RyaW5nLCBTdHJpbmcpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0UG9vbGVkQ29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb25uZWN0aW9uUG9vbERhdGFTb3VyY2UuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9vbGVkQ29ubmVjdGlvblN0cmluZ1N0cmluZygpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuQ29ubmVjdGlvblBvb2xEYXRhU291cmNlI3NldExvZ2luVGltZW91dChpbnQpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0TG9naW5UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMb2dpblRpbWVvdXQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsgLy8gVE9ETworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLkNvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZSNzZXRMb2dXcml0ZXIoamF2YS5pby5QcmludFdyaXRlcil9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRMb2dXcml0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7UHJpbnRXcml0ZXIuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9nV3JpdGVyKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7IC8vIFRPRE8KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9EYXRhU291cmNlVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL0RhdGFTb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzNGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9EYXRhU291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACitwYWNrYWdlIHRlc3RzLmphdmF4LnNxbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCitAVGVzdFRhcmdldENsYXNzKERhdGFTb3VyY2UuY2xhc3MpCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5EYXRhU291cmNlI2dldENvbm5lY3Rpb24oKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldENvbm5ldGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5EYXRhU291cmNlI2dldENvbm5lY3Rpb24oU3RyaW5nLCBTdHJpbmcpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0Q29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsU3RyaW5nLmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbm5lY3Rpb25TdHJpbmdTdHJpbmcoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5EYXRhU291cmNlI2dldExvZ2luVGltZW91dCgpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TG9naW5UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dpblRpbWVvdXQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5EYXRhU291cmNlI2dldExvZ1dyaXRlcigpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0TG9nV3JpdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2dXcml0ZXIoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5EYXRhU291cmNlI3NldExvZ2luVGltZW91dChpbnQpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0TG9naW5UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMb2dpblRpbWVvdXQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5EYXRhU291cmNlI3NldExvZ1dyaXRlcihqYXZhLmlvLlByaW50V3JpdGVyKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldExvZ2luVGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9nV3JpdGVyKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUG9vbGVkQ29ubmVjdGlvblRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9Qb29sZWRDb25uZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDMyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUG9vbGVkQ29ubmVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACitwYWNrYWdlIHRlc3RzLmphdmF4LnNxbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNxbC5Db25uZWN0aW9uRXZlbnRMaXN0ZW5lcjsKKworQFRlc3RUYXJnZXRDbGFzcyhQb29sZWRDb25uZWN0aW9uVGVzdC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQb29sZWRDb25uZWN0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlBvb2xlZENvbm5lY3Rpb24jYWRkQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIoamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudExpc3RlbmVyKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImFkZENvbm5lY3Rpb25FdmVudExpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb25uZWN0aW9uRXZlbnRMaXN0ZW5lci5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlBvb2xlZENvbm5lY3Rpb24jY2xvc2UoKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsb3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Qb29sZWRDb25uZWN0aW9uI2dldENvbm5lY3Rpb24oKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldENvbm5lY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25uZWN0aW9uKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUG9vbGVkQ29ubmVjdGlvbiNyZW1vdmVDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcihDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcil9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRDb25uZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtDb25uZWN0aW9uRXZlbnRMaXN0ZW5lci5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL1Jvd1NldEludGVybmFsVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL1Jvd1NldEludGVybmFsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjE1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUm93U2V0SW50ZXJuYWxUZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSB0ZXN0cy5qYXZheC5zcWw7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZheC5zcWwuUm93U2V0SW50ZXJuYWw7CitpbXBvcnQgamF2YXguc3FsLlJvd1NldE1ldGFEYXRhOworCitAVGVzdFRhcmdldENsYXNzKFJvd1NldEludGVybmFsLmNsYXNzKQorcHVibGljIGNsYXNzIFJvd1NldEludGVybmFsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldEludGVybmFsI2dldENvbm5lY3Rpb24oKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldENvbm5lY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25uZWN0aW9uKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0SW50ZXJuYWwjZ2V0T3JpZ2luYWwoKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldE9yaWdpbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3JpZ2luYWwoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRJbnRlcm5hbCNnZXRPcmlnaW5hbFJvdygpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0T3JpZ2luYWxSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbFJvdygpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldEludGVybmFsI2dldE9yaWdpbmFsUm93KCl9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRPcmlnaW5hbFJvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmFtcygpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldEludGVybmFsI3NldE1ldGFEYXRhKGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSl9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJnZXRPcmlnaW5hbFJvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Um93U2V0TWV0YURhdGEuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0YURhdGEoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9Sb3dTZXRNZXRhRGF0YVRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9Sb3dTZXRNZXRhRGF0YVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FmZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL1Jvd1NldE1ldGFEYXRhVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACitwYWNrYWdlIHRlc3RzLmphdmF4LnNxbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YTsKKworLyoqCisgKiBAYXV0aG9yIEFHUgorICoKKyAqLworQFRlc3RUYXJnZXRDbGFzcyhSb3dTZXRNZXRhRGF0YS5jbGFzcykKK3B1YmxpYyBjbGFzcyBSb3dTZXRNZXRhRGF0YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSNzZXRBdXRvSW5jcmVtZW50KGludCwgYm9vbGVhbil9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJldEF1dG9JbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcyxib29sZWFuLmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFNldEF1dG9JbmNyZW1lbnQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSNzZXRDYXNlU2Vuc2l0aXZlKGludCwgYm9vbGVhbil9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRDYXNlU2Vuc2l0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsYm9vbGVhbi5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDYXNlU2Vuc2l0aXZlKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0TWV0YURhdGEjc2V0Q2F0YWxvZ05hbWUoaW50LCBTdHJpbmcpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0Q2F0YWxvZ05hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcyxTdHJpbmcuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ05hbWUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSNzZXRDb2x1bW5Db3VudChpbnQpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0Q29sdW1uQ291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5Db3VudCgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldE1ldGFEYXRhI3NldENvbHVtbkRpc3BsYXlTaXplKGludCwgaW50KX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldENvbHVtbkRpc3BsYXlTaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsaW50LmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRpc3BsYXlTaXplKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0TWV0YURhdGEjc2V0Q29sdW1uTGFiZWwoaW50LCBTdHJpbmcpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0Q2FzZVNlbnNpdGl2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLFN0cmluZy5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5MYWJlbCgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldE1ldGFEYXRhI3NldENvbHVtbk5hbWUoaW50LCBTdHJpbmcpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0Q29sdW1uTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLFN0cmluZy5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5OYW1lKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0TWV0YURhdGEjc2V0Q29sdW1uVHlwZShpbnQsIGludCl9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRDb2x1bW5OYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsaW50LmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFNldENvbHVtblR5cGUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSNzZXRDb2x1bW5UeXBlTmFtZShpbnQsIFN0cmluZyl9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRDb2x1bW5UeXBlTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLFN0cmluZy5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5UeXBlTmFtZSgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldE1ldGFEYXRhI3NldEN1cnJlbmN5KGludCwgYm9vbGVhbil9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRDdXJyZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLGJvb2xlYW4uY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VycmVuY3koKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSNzZXROdWxsYWJsZShpbnQsIGludCl9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXROdWxsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLGludC5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROdWxsYWJsZSgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldE1ldGFEYXRhI3NldFByZWNpc2lvbihpbnQsIGludCl9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRDb2x1bW5OYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsU3RyaW5nLmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFNldFByZWNpc2lvbigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0ZXN0cyB7QGxpbmsgamF2YXguc3FsLlJvd1NldE1ldGFEYXRhI3NldFNjYWxlKGludCwgaW50KX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFNjYWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsaW50LmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFNldFNjYWxlKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0TWV0YURhdGEjc2V0U2NoZW1hTmFtZShpbnQsIFN0cmluZyl9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRTY2hlbWFOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsU3RyaW5nLmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYU5hbWUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSNzZXRTZWFyY2hhYmxlKGludCwgYm9vbGVhbil9CisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7QFRlc3RUYXJnZXQobWV0aG9kTmFtZSA9ICJzZXRTZWFyY2hhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsU3RyaW5nLmNsYXNzfSkKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgcHVibGljIHZvaWQgdGVzdFNldFNlYXJjaGFibGUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRNZXRhRGF0YSNzZXRTaWduZWQoaW50LCBib29sZWFuKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFNpZ25lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLGJvb2xlYW4uY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2lnbmVkKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0TWV0YURhdGEjc2V0VGFibGVOYW1lKGludCwgU3RyaW5nKX0KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHtAVGVzdFRhcmdldChtZXRob2ROYW1lID0gInNldFRhYmxlTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLFN0cmluZy5jbGFzc30pCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZU5hbWUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9Sb3dTZXRSZWFkZXJUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUm93U2V0UmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTllYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUm93U2V0UmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgdGVzdHMuamF2YXguc3FsOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YXguc3FsLlJvd1NldEludGVybmFsOworaW1wb3J0IGphdmF4LnNxbC5Sb3dTZXRSZWFkZXI7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoUm93U2V0UmVhZGVyLmNsYXNzKQorcHVibGljIGNsYXNzIFJvd1NldFJlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXRSZWFkZXIjcmVhZERhdGEoUm93U2V0SW50ZXJuYWwpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0Q29sdW1uTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Um93U2V0SW50ZXJuYWwuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZERhdGEoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2phdmF4L3NxbC9Sb3dTZXRUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUm93U2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzFkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUm93U2V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjk1IEBACitwYWNrYWdlIHRlc3RzLmphdmF4LnNxbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNxbC5Sb3dTZXQ7CitpbXBvcnQgamF2YXguc3FsLlJvd1NldExpc3RlbmVyOworCisvKioKKyAqIEFubm90YXRpb24gY29udmVudGlvbnMgZm9yIHNldHRlcnMgYW5kIGdldHRlcnM/CisgKiBAYXV0aG9yIGFuZHJlYS5ncm9lc3NiYXVlckBub3Nlci5jb20KKyAqCisgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoUm93U2V0LmNsYXNzKQorcHVibGljIGNsYXNzIFJvd1NldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBtb2NrIFJvd1NldC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgLy8gUmV1c2Ugb3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZheC5zcWwuSW1wbF9Sb3dTZXQuamF2YQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXQjYWRkUm93U2V0TGlzdGVuZXIoamF2YXguc3FsLlJvd1NldExpc3RlbmVyKX0uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiYWRkUm93U2V0TGlzdGVuZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Um93U2V0TGlzdGVuZXIuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRSb3dTZXRMaXN0ZW5lcigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXQjY2xlYXJQYXJhbWV0ZXJzKCl9LgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImNsZWFyUGFyYW1ldGVycyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclBhcmFtZXRlcnMoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGVzdHMge0BsaW5rIGphdmF4LnNxbC5Sb3dTZXQjYWRkUm93U2V0TGlzdGVuZXIoamF2YXguc3FsLlJvd1NldExpc3RlbmVyKX0uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiYWRkUm93U2V0TGlzdGVuZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Um93U2V0TGlzdGVuZXIuY2xhc3N9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0I2dldENvbW1hbmQoKX0uCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7IEBUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAiZ2V0Q29tbWFuZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICApICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRDb21tYW5kKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0I2dldERhdGFTb3VyY2VOYW1lKCl9LgorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0geyBAVGVzdFRhcmdldChtZXRob2ROYW1lID0gImdldERhdGFTb3VyY2VOYW1lIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30pICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICkgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldERhdGFTb3VyY2VOYW1lKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldEVzY2FwZVByb2Nlc3NpbmcoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0TWF4RmllbGRTaXplKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldE1heFJvd3MoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0UGFzc3dvcmQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0UXVlcnlUaW1lb3V0KCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldFRyYW5zYWN0aW9uSXNvbGF0aW9uKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldFR5cGVNYXAoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0VXJsKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldFVzZXJuYW1lKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzUmVhZE9ubHkoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUm93U2V0TGlzdGVuZXIoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0QXJyYXkoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0QXNjaWlTdHJlYW0oKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0QmlnRGVjaW1hbCgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRCaW5hcnlTdHJlYW0oKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0QmxvYigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRCb29sZWFuKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldEJ5dGUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0Qnl0ZXMoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0Q2hhcmFjdGVyU3RyZWFtKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldENsb2IoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0Q29uY3VycmVuY3koKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0RGF0ZUludERhdGUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0ZUludERhdGVDYWxlbmRhcigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXREb3VibGUoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0RmxvYXQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0SW50KCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldExvbmcoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0R2V0TWF4RmllbGRTaXplKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldE51bGxJbnRJbnQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0TnVsbEludEludFN0cmluZygpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRPYmplY3RJbnRPYmplY3QoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0T2JqZWN0SW50T2JqZWN0SW50KCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldE9iamVjdEludE9iamVjdEludEludCgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQYXNzd29yZCgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeVRpbWVvdXQoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmVhZE9ubHkoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFNob3J0KCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFN0cmluZygpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lSW50VGltZSgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lSW50VGltZUNhbGVuZGFyKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFRpbWVzdGFtcEludFRpbWVzdGFtcCgpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lc3RhbXBJbnRUaW1lc3RhbXBDYWxlbmRhcigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpIHsKKyAgICAgICAgZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFR5cGVNYXAoKSB7CisgICAgICAgIGZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VXJsKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFVzZXJuYW1lKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9qYXZheC9zcWwvUm93U2V0V3JpdGVyVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL1Jvd1NldFdyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI1MWZmCi0tLSAvZGV2L251bGwKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvamF2YXgvc3FsL1Jvd1NldFdyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIHRlc3RzLmphdmF4LnNxbDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNxbC5Sb3dTZXRJbnRlcm5hbDsKK2ltcG9ydCBqYXZheC5zcWwuUm93U2V0V3JpdGVyOworCitAVGVzdFRhcmdldENsYXNzKFJvd1NldFdyaXRlci5jbGFzcykKK3B1YmxpYyBjbGFzcyBSb3dTZXRXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQHRlc3RzIHtAbGluayBqYXZheC5zcWwuUm93U2V0V3JpdGVyI3dyaXRlRGF0YShqYXZheC5zcWwuUm93U2V0SW50ZXJuYWwpfQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICAgICAgICBwdXJwb3NlID0gIiIsCisgICAgICAgICAgICB0YXJnZXRzID0ge0BUZXN0VGFyZ2V0KG1ldGhvZE5hbWUgPSAic2V0Q29sdW1uTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Um93U2V0SW50ZXJuYWwuY2xhc3N9KQorICAgICAgICAgICAgfQorICAgICkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVEYXRhKCkgeworICAgICAgICBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9zcWwvQ29ubmVjdGlvblRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9Db25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IGJhNmZmZjIuLjY0ZDc4ZDIgMTAwNzU1Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9Db25uZWN0aW9uVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9Db25uZWN0aW9uVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLnNxbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CiBpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKIGltcG9ydCBqYXZhLnNxbC5TUUxXYXJuaW5nOwpAQCAtMjksMTEgKzM0LDIxIEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhDb25uZWN0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIENvbm5lY3Rpb25UZXN0IGV4dGVuZHMgU1FMVGVzdCB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5Db25uZWN0aW9uI2NyZWF0ZVN0YXRlbWVudCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZVN0YXRlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTdGF0ZW1lbnQoKSB7CiAKICAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CkBAIC01Nyw2ICs3MiwxNSBAQAogICAgICAqIEB0ZXN0IGphdmEuc3FsLkNvbm5lY3Rpb24jY3JlYXRlU3RhdGVtZW50KGludCByZXN1bHRTZXRUeXBlLCBpbnQKICAgICAgKiAgICAgICByZXN1bHRTZXRDb25jdXJyZW5jeSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlU3RhdGVtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3RhdGVtZW50X2ludF9pbnQoKSB7CiAgICAgICAgIFN0YXRlbWVudCBzdCA9IG51bGw7CiAgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CkBAIC0xMzUsMTQgKzE1OSwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLQkgICAgLy8gZXhjZXB0aW9uIGlzIG5vdCBzcGVjaWZpZWQgZm9yIHRoaXMgY2FzZQorICAgICAgICAvLyBleGNlcHRpb24gaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICBjb25uLmNyZWF0ZVN0YXRlbWVudChSZXN1bHRTZXQuVFlQRV9TQ1JPTExfU0VOU0lUSVZFLCAtMSk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzcWxlKSB7CiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLQkgICAgLy8gZXhjZXB0aW9uIGlzIG5vdCBzcGVjaWZpZWQgZm9yIHRoaXMgY2FzZQorICAgICAgICAvLyBleGNlcHRpb24gaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICBjb25uLmNyZWF0ZVN0YXRlbWVudChJbnRlZ2VyLk1JTl9WQUxVRSwgUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFkpOwogICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc3FsZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKQEAgLTE1Myw2ICsxNzcsMTUgQEAKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5Db25uZWN0aW9uI2NyZWF0ZVN0YXRlbWVudChpbnQgcmVzdWx0U2V0VHlwZSwgaW50CiAgICAgICogICAgICAgcmVzdWx0U2V0Q29uY3VycmVuY3ksIGludCByZXN1bHRTZXRIb2xkYWJpbGl0eSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlU3RhdGVtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTdGF0ZW1lbnRfaW50X2ludF9pbnQoKSB7CiAgICAgICAgIFN0YXRlbWVudCBzdCA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0yMTMsNiArMjQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuQ29ubmVjdGlvbiNnZXRNZXRhRGF0YSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1ldGFEYXRhIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1ldGFEYXRhKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRGF0YWJhc2VNZXRhRGF0YSBtZCA9IGNvbm4uZ2V0TWV0YURhdGEoKTsKQEAgLTMyNSw2ICszNjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5Db25uZWN0aW9uI2dldEF1dG9Db21taXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdXRvQ29tbWl0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEF1dG9Db21taXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQodHJ1ZSk7CkBAIC0zNDIsNiArMzkzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuQ29ubmVjdGlvbiNzZXRBdXRvQ29tbWl0KGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF1dG9Db21taXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF1dG9Db21taXQoKSB7CiAgICAgICAgIFN0YXRlbWVudCBzdCA9IG51bGw7CiAgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CkBAIC0zOTAsNiArNDUwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuQ29ubmVjdGlvbiNpc1JlYWRPbmx5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlYWRPbmx5KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgY29ubi5zZXRSZWFkT25seSh0cnVlKTsKQEAgLTQwOCw3ICs0NzcsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5Db25uZWN0aW9uI3NldFJlYWRPbmx5KGJvb2xlYW4pCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFJlYWRPbmx5KCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRSZWFkT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFNldFJlYWRPbmx5KCkgewogICAgICAgICBTdGF0ZW1lbnQgc3QgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY29ubi5zZXRSZWFkT25seSh0cnVlKTsKQEAgLTQ0Myw2ICs1MjEsMTUgQEAKICAgICAgKiAKICAgICAgKiBUT0RPIFJlc3VsdFNldC5DTE9TRV9DVVJTT1JTX0FUX0NPTU1JVCBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEhvbGRhYmlsaXR5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEhvbGRhYmlsaXR5KCkgewogICAgICAgICB0cnkgewogIC8vICAgICAgICAgICBjb25uLnNldEhvbGRhYmlsaXR5KFJlc3VsdFNldC5DTE9TRV9DVVJTT1JTX0FUX0NPTU1JVCk7CkBAIC00NjEsNiArNTQ4LDE1IEBACiAgICAgICogCiAgICAgICogVE9ETyBSZXN1bHRTZXQuQ0xPU0VfQ1VSU09SU19BVF9DT01NSVQgaXMgbm90IHN1cHBvcnRlZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRIb2xkYWJpbGl0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRIb2xkYWJpbGl0eSgpIHsKICAgICAgICAgU3RhdGVtZW50IHN0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTUwMSw2ICs1OTcsMTUgQEAKICAgICAgKiAKICAgICAgKiBUT0RPIG9ubHkgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUgaXMgc3VwcG9ydGVkCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRyYW5zYWN0aW9uSXNvbGF0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFRyYW5zYWN0aW9uSXNvbGF0aW9uKCkgewogICAgICAgICB0cnkgewogLy8gICAgICAgICAgICBjb25uCkBAIC01MjcsNiArNjMyLDE1IEBACiAgICAgICogCiAgICAgICogVE9ETyBvbmx5IENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFIGlzIHN1cHBvcnRlZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUcmFuc2FjdGlvbklzb2xhdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpIHsKICAgICAgICAgdHJ5IHsKIC8vICAgICAgICAgICAgY29ubgpAQCAtMTA0NSw2ICsxMTU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuQ29ubmVjdGlvbiNjb21taXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21taXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0KCkgewogICAgICAgICBTdGF0ZW1lbnQgc3QgPSBudWxsOwogICAgICAgICBTdGF0ZW1lbnQgc3QxID0gbnVsbDsKQEAgLTExMjMsNiArMTI0NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLkNvbm5lY3Rpb24jcm9sbGJhY2soKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyb2xsYmFjayIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSb2xsYmFjaygpIHsKICAgICAgICAgU3RhdGVtZW50IHN0ID0gbnVsbDsKICAgICAgICAgU3RhdGVtZW50IHN0MSA9IG51bGw7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9zcWwvUHJlcGFyZWRTdGF0ZW1lbnRUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9zcWwvUHJlcGFyZWRTdGF0ZW1lbnRUZXN0LmphdmEKaW5kZXggMWU2YjEyNC4uODY1YTRjMyAxMDA3NTUKLS0tIGEvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvc3FsL1ByZXBhcmVkU3RhdGVtZW50VGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9QcmVwYXJlZFN0YXRlbWVudFRlc3QuamF2YQpAQCAtMTQsNyArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgdGVzdHMuc3FsOworcGFja2FnZSB0ZXN0cy5zcWw7IAorCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5zcWwuUGFyYW1ldGVyTWV0YURhdGE7CkBAIC0zMSw2ICszNiw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoUHJlcGFyZWRTdGF0ZW1lbnQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUHJlcGFyZWRTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgU1FMVGVzdCB7CiAKICAgICBTdHJpbmcgcXVlcnlBbGxTZWxlY3QgPSAic2VsZWN0ICogZnJvbSB0eXBlIjsKQEAgLTEwMyw2ICsxMDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCNhZGRCYXRjaCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFkZEJhdGNoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEJhdGNoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTM2NCw3ICszNzksMTYgQEAKICAgICAgKiBpdCBpcyBwb3NzaWJsZSB0byBpbnZva2UgdGhlIG1ldGhvZCBnZXRNZXRhRGF0YSBvbiBhIAogICAgICAqIFByZXBhcmVkU3RhdGVtZW50IG9iamVjdCByYXRoZXIgdGhhbiB3YWl0aW5nIHRvIGV4ZWN1dGUgaXQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE1ldGFEYXRhKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNZXRhRGF0YSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0TWV0YURhdGEoKSB7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJ1cGRhdGUgem9vIHNldCBuYW1lPSdNYXNoYScsIGZhbWlseT0nY2F0JyB3aGVyZSBpZD0/OyI7CkBAIC01MDcsNiArNTMxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQjc2V0SW50KGludCBwYXJhbWV0ZXJJbmRleCwgaW50IHgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAicHMuZXhlY3V0ZSgpIHNob3VsZCBiZSByZW1vdmVkIGluIGV4Y2VwdGlvbiBwYXJ0IChmb3IgZXhjZXB0aW9uIHRlc3RpbmcpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0SW50KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGNyZWF0ZVRhYmxlcygpOwogICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBwcyA9IG51bGw7CkBAIC01NzcsNiArNjEwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQjc2V0TG9uZyhpbnQgcGFyYW1ldGVySW5kZXgsIGxvbmcgeCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZXhjZXB0aW9uIHBhcnQgKGZvciBleGNlcHRpb24gdGVzdGluZykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMb25nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgbG9uZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldExvbmcoKSB7CiAgICAgICAgIGNyZWF0ZVRhYmxlcygpOwogICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBwcyA9IG51bGw7CkBAIC02NTAsNiArNjkyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQjc2V0RmxvYXQoaW50IHBhcmFtZXRlckluZGV4LCBmbG9hdCB4KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEZsb2F0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgZmxvYXQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGbG9hdCgpIHsKICAgICAgICAgZmxvYXQgdmFsdWUxID0gMTIzNDU2NzguMTIzNDU2ODlmOwogICAgICAgICBmbG9hdCB2YWx1ZTIgPSAtMTIzNDU2NzguMTIzNDU2ODlmOwpAQCAtNzIwLDYgKzc3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50I3NldERvdWJsZShpbnQgcGFyYW1ldGVySW5kZXgsIGRvdWJsZSB4KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERvdWJsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGRvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldERvdWJsZSgpIHsKICAgICAgICAgY3JlYXRlVGFibGVzKCk7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gbnVsbDsKQEAgLTc5MSw2ICs4NTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCNzZXRTdHJpbmcoaW50IHBhcmFtZXRlckluZGV4LCBTdHJpbmcgeCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZXhjZXB0aW9uIHBhcnQgKGZvciBleGNlcHRpb24gdGVzdGluZykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTdHJpbmdfY2hhckZpZWxkKCkgewogICAgICAgICBjcmVhdGVUYWJsZXMoKTsKICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBudWxsOwpAQCAtODkxLDYgKzk2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50I3NldFN0cmluZyhpbnQgcGFyYW1ldGVySW5kZXgsIFN0cmluZyB4KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFN0cmluZ190aW55VGV4dEZpZWxkKCkgewogICAgICAgICBjcmVhdGVUYWJsZXMoKTsKICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBudWxsOwpAQCAtOTkzLDYgKzEwNzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCNzZXRTdHJpbmcoaW50IHBhcmFtZXRlckluZGV4LCBTdHJpbmcgeCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZXhjZXB0aW9uIHBhcnQgKGZvciBleGNlcHRpb24gdGVzdGluZykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTdHJpbmdfdGV4dEZpZWxkKCkgewogICAgICAgICBjcmVhdGVUYWJsZXMoKTsKICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBudWxsOwpAQCAtMTA5OCw2ICsxMTg1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQjc2V0U3RyaW5nKGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nIHgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAicHMuZXhlY3V0ZSgpIHNob3VsZCBiZSByZW1vdmVkIGluIGV4Y2VwdGlvbiBwYXJ0IChmb3IgZXhjZXB0aW9uIHRlc3RpbmcpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U3RyaW5nX21lZGl1bVRleHRGaWVsZCgpIHsKICAgICAgICAgY3JlYXRlVGFibGVzKCk7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gbnVsbDsKQEAgLTExOTEsNiArMTI4NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50I3NldFN0cmluZyhpbnQgcGFyYW1ldGVySW5kZXgsIFN0cmluZyB4KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFN0cmluZ19sb25nVGV4dEZpZWxkKCkgewogICAgICAgICBjcmVhdGVUYWJsZXMoKTsKICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBudWxsOwpAQCAtMTI4NCw2ICsxMzg5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQjc2V0U2hvcnQoaW50IHBhcmFtZXRlckluZGV4LCBzaG9ydCB4KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgc2hvcnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTaG9ydCgpIHsKICAgICAgICAgY3JlYXRlVGFibGVzKCk7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gbnVsbDsKQEAgLTEzODIsNiArMTQ5NiwxNSBAQAogICAgICAqIEB0ZXN0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50I3NldEJvb2xlYW4oaW50IHBhcmFtZXRlckluZGV4LCBib29sZWFuCiAgICAgICogICAgICAgeCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZXhjZXB0aW9uIHBhcnQgKGZvciBleGNlcHRpb24gdGVzdGluZykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCb29sZWFuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEJvb2xlYW4oKSB7CiAgICAgICAgIGNyZWF0ZVRhYmxlcygpOwogICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBwcyA9IG51bGw7CkBAIC0xNDYyLDYgKzE1ODUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCNzZXRCeXRlKGludCBwYXJhbWV0ZXJJbmRleCwgYnl0ZSB4KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEJ5dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBieXRlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qnl0ZSgpIHsKICAgICAgICAgY3JlYXRlVGFibGVzKCk7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gbnVsbDsKQEAgLTE1NDIsNiArMTY3NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50I3NldEJ5dGVzKGludCBwYXJhbWV0ZXJJbmRleCwgYnl0ZVtdIHgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAicHMuZXhlY3V0ZSgpIHNob3VsZCBiZSByZW1vdmVkIGluIGV4Y2VwdGlvbiBwYXJ0IChmb3IgZXhjZXB0aW9uIHRlc3RpbmcpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Qnl0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBieXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCeXRlcygpIHsKIAogICAgICAgICBieXRlW10gYnl0ZXNBcnJheSA9IHsxLCAwfTsKQEAgLTE2MDksNiArMTc1MCwxNSBAQAogICAgICAqIEB0ZXN0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50I3NldEJpZ0RlY2ltYWwoaW50IHBhcmFtZXRlckluZGV4LAogICAgICAqICAgICAgIEJpZ0RlY2ltYWwgeCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZXhjZXB0aW9uIHBhcnQgKGZvciBleGNlcHRpb24gdGVzdGluZykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRCaWdEZWNpbWFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgQmlnRGVjaW1hbC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEJpZ0RlY2ltYWwoKSB7CiAKICAgICAgICAgQmlnRGVjaW1hbCBiZCA9IG5ldyBCaWdEZWNpbWFsKCI1MCIpOwpAQCAtMTY3NCw2ICsxODI0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQjc2V0RGF0ZShpbnQgcGFyYW1ldGVySW5kZXgsIERhdGUgeCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZXhjZXB0aW9uIHBhcnQgKGZvciBleGNlcHRpb24gdGVzdGluZykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgRGF0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldERhdGVfaW50X0RhdGUoKSB7CiAKICAgICAgICAgRGF0ZVtdIGRhdGVzID0geyBuZXcgRGF0ZSgxNzk5LCAwNSwgMjYpLCBuZXcgRGF0ZShJbnRlZ2VyLk1BWF9WQUxVRSksCkBAIC0xNzQ3LDYgKzE5MDYsMTUgQEAKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCNzZXREYXRlKGludCBwYXJhbWV0ZXJJbmRleCwgRGF0ZSB4LAogICAgICAqICAgICAgIENhbGVuZGFyIGNhbCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZXhjZXB0aW9uIHBhcnQgKGZvciBleGNlcHRpb24gdGVzdGluZykiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgRGF0ZS5jbGFzcywgQ2FsZW5kYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREYXRlX2ludF9EYXRlX0NhbGVuZGFyKCkgewogCiAgICAgICAgIENhbGVuZGFyW10gY2FscyA9IHsgQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKSwKQEAgLTE4MjUsNiArMTk5MywxNSBAQAogICAgICAqIAogICAgICAqIHRoaXMgdGVzdCBkb2Vzbid0IHBhc3NlZCBvbiBSSQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE51bGwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROdWxsX2ludF9pbnQoKSB7CiAgICAgICAgIGNyZWF0ZVRhYmxlcygpOwogICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBwcyA9IG51bGw7CkBAIC0xOTM4LDYgKzIxMTUsMTUgQEAKICAgICAgKiAKICAgICAgKiB0aGlzIHRlc3QgZG9lc24ndCBwYXNzIG9uIFJJCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNhc2UgaGFzIGluY29ycmVjdCBzdHJ1Y3R1cmUiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBPYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RfaW50X09iamVjdCgpIHsKICAgICAgICAgY3JlYXRlVGFibGVzKCk7CiAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gbnVsbDsKQEAgLTIwNDQsNiArMjIzMCwxNSBAQAogICAgICAqIAogICAgICAqIHRoaXMgdGVzdCBkb2Vzbid0IHBhc3Mgb24gUkkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0T2JqZWN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgT2JqZWN0LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RfaW50X09iamVjdF9pbnQoKSB7CiAgICAgICAgIGNyZWF0ZVRhYmxlcygpOwogICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBwcyA9IG51bGw7CkBAIC0yMTUwLDYgKzIzNDUsMTUgQEAKICAgICAgKiAKICAgICAgKiB0aGlzIHRlc3QgZG9lc24ndCBwYXNzIG9uIFJJCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE9iamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIE9iamVjdC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RfaW50X09iamVjdF9pbnRfaW50KCkgewogICAgICAgICBjcmVhdGVUYWJsZXMoKTsKICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBudWxsOwpAQCAtMjI1NSw2ICsyNDU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQjc2V0VGltZShpbnQgcGFyYW1ldGVySW5kZXgsIFRpbWUgeCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJwcy5leGVjdXRlKCkgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBleGNlcHRpb24gcGFydCAoZm9yIGV4Y2VwdGlvbiB0ZXN0aW5nKSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRpbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBUaW1lLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGltZWludF9UaW1lKCkgewogCiAgICAgICAgIFRpbWVbXSB0aW1lcyA9IHsgbmV3IFRpbWUoMjQsIDI1LCAyNiksIG5ldyBUaW1lKEludGVnZXIuTUFYX1ZBTFVFKSwKQEAgLTIzMjcsNiArMjU0MCwxNSBAQAogICAgICAqIEB0ZXN0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50I3NldFRpbWUoaW50IHBhcmFtZXRlckluZGV4LCBUaW1lIHgsCiAgICAgICogICAgICAgQ2FsZW5kYXIgY2FsKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIGV4Y2VwdGlvbiBwYXJ0IChmb3IgZXhjZXB0aW9uIHRlc3RpbmcpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGltZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIFRpbWUuY2xhc3MsIENhbGVuZGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGltZV9pbnRfVGltZV9DYWxlbmRhcigpIHsKIAogICAgICAgICBDYWxlbmRhcltdIGNhbHMgPSB7IENhbGVuZGFyLmdldEluc3RhbmNlKCksCkBAIC0yNDAzLDYgKzI2MjUsMTUgQEAKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCNzZXRUaW1lc3RhbXAoaW50IHBhcmFtZXRlckluZGV4LAogICAgICAqICAgICAgIFRpbWVzdGFtcCB4KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gInBzLmV4ZWN1dGUoKSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIGV4Y2VwdGlvbiBwYXJ0IChmb3IgZXhjZXB0aW9uIHRlc3RpbmcpIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGltZXN0YW1wIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgVGltZXN0YW1wLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGltZXN0YW1wX2ludF9UaW1lc3RhbXAoKSB7CiAKICAgICAgICAgVGltZXN0YW1wW10gdGltZXN0YW1wcyA9IHsgbmV3IFRpbWVzdGFtcCgyMDA3LCAxMCwgMTcsIDE5LCAwNiwgNTAsIDIzKSwKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9SZXN1bHRTZXRNZXRhRGF0YVRlc3QuamF2YSBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9SZXN1bHRTZXRNZXRhRGF0YVRlc3QuamF2YQppbmRleCAxZjk0ODNiLi40Y2QwOTBmIDEwMDc1NQotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9zcWwvUmVzdWx0U2V0TWV0YURhdGFUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvc3FsL1Jlc3VsdFNldE1ldGFEYXRhVGVzdC5qYXZhCkBAIC0xNiwxMiArMTYsMTggQEAKIAogcGFja2FnZSB0ZXN0cy5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CiBpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGE7CiBpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKIGltcG9ydCBqYXZhLnNxbC5UeXBlczsKIAorQFRlc3RUYXJnZXRDbGFzcyhSZXN1bHRTZXRNZXRhRGF0YS5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZXN1bHRTZXRNZXRhRGF0YVRlc3QgZXh0ZW5kcyBTUUxUZXN0IHsKIAogICAgIFJlc3VsdFNldE1ldGFEYXRhIHJzbWQgPSBudWxsOwpAQCAtNTQsNiArNjAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YSNnZXRDYXRhbG9nTmFtZShpbnQgY29sdW1uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIjEuIFNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQuICIgKworICAgICAgICAgICAgICAgICAgIjIuIE1BWC9NSU4vbmVnYXRpdmUvdmFsaWQgcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDYXRhbG9nTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nTmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0TnVsbChyc21kLmdldENhdGFsb2dOYW1lKDApKTsKQEAgLTY1LDYgKzgxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEjZ2V0Q29sdW1uQ2xhc3NOYW1lKGludCBjb2x1bW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiMS4gU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgIjIuIE1BWC9NSU4vemVybyBwYXJhbWV0ZXJzIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbHVtbkNsYXNzTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5DbGFzc05hbWUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJzbWQpOwpAQCAtOTMsNiArMTE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEjZ2V0Q29sdW1uQ291bnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2x1bW5Db3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5Db3VudCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByc21kLmdldENvbHVtbkNvdW50KCkpOwpAQCAtMTA0LDYgKzEzOSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhI2dldENvbHVtbkxhYmVsKGludCBjb2x1bW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiMS4gU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZC4gIiArCisgICAgICAgICAgICAgICAgIjIuIE1BWC9NSU4vbmVnYXRpdmUvemVybyBwYXJhbWV0ZXJzIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbHVtbkxhYmVsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkxhYmVsKCkgewogICAgICAgICBTdHJpbmdbXSBsYWJlbHMgPSB7ICJ6b28uaWQiLCAiem9vLm5hbWUiLCAiem9vLmZhbWlseSIgfTsKICAgICAgICAgdHJ5IHsKQEAgLTExOSw2ICsxNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YSNnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiZ2V0Q29sdW1uTGFibGUgd2FzIHRlc3RlZCBpbnN0ZWFkIG9mIGdldENvbHVtbk5hbWUiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2x1bW5OYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENvbHVtbk5hbWUoKSB7CiAgICAgICAgIFN0cmluZ1tdIGxhYmVscyA9IHsgInpvby5pZCIsICJ6b28ubmFtZSIsICJ6b28uZmFtaWx5IiB9OwogICAgICAgICB0cnkgewpAQCAtMTQ4LDYgKzIwMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhI2dldENvbHVtblR5cGUoaW50IGNvbHVtbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJNQVgvTUlOL3plcm8gcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2x1bW5UeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENvbHVtblR5cGUoKSB7CiAgICAgICAgIGludFtdIHR5cGVzID0geyBUeXBlcy5TTUFMTElOVCwgVHlwZXMuVkFSQ0hBUiwgVHlwZXMuVkFSQ0hBUn07CiAgICAgICAgIHRyeSB7CkBAIC0xNzYsNiArMjM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEjZ2V0Q29sdW1uVHlwZU5hbWUoaW50IGNvbHVtbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJNQVgvTUlOL3plcm8gcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2x1bW5UeXBlTmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5UeXBlTmFtZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygic21hbGxpbnQiLCByc21kLmdldENvbHVtblR5cGVOYW1lKDEpKTsKQEAgLTIwMiw2ICsyNzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YSNnZXRUYWJsZU5hbWUoaW50IGNvbHVtbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJNQVgvTUlOL3plcm8gcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRUYWJsZU5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVOYW1lKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ6b28iLCByc21kLmdldFRhYmxlTmFtZSgxKSk7CmRpZmYgLS1naXQgYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9zcWwvU1FMVGVzdC5qYXZhIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvc3FsL1NRTFRlc3QuamF2YQppbmRleCAwOGFlMzUwLi40YmM0YWY2IDEwMDc1NQotLS0gYS9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9zcWwvU1FMVGVzdC5qYXZhCisrKyBiL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9TUUxUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSB0ZXN0cy5zcWw7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOwpAQCAtMzAsNiArMzIsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwogCitAVGVzdFRhcmdldENsYXNzKFN0YXRlbWVudC5jbGFzcykKIHB1YmxpYyBjbGFzcyBTUUxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIHN0YXRpYyBDb25uZWN0aW9uIGNvbm47CiAKZGlmZiAtLWdpdCBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9TdGF0ZW1lbnRUZXN0LmphdmEgYi9zcWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9zcWwvU3RhdGVtZW50VGVzdC5qYXZhCmluZGV4IGZkMTAwMmUuLjU0NTYxZmEgMTAwNzU1Ci0tLSBhL3NxbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NxbC9TdGF0ZW1lbnRUZXN0LmphdmEKKysrIGIvc3FsL3NyYy90ZXN0L2phdmEvdGVzdHMvc3FsL1N0YXRlbWVudFRlc3QuamF2YQpAQCAtMTQsNyArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgdGVzdHMuc3FsOworcGFja2FnZSB0ZXN0cy5zcWw7ICAgICAKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKIAogaW1wb3J0IGphdmEuc3FsLkJhdGNoVXBkYXRlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKQEAgLTIzLDExICsyOCwyMSBAQAogaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCitAVGVzdFRhcmdldENsYXNzKFN0YXRlbWVudC5jbGFzcykKIHB1YmxpYyBjbGFzcyBTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgU1FMVGVzdCB7CiAgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3QgamF2YS5zcWwuU3RhdGVtZW50I2FkZEJhdGNoKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQmF0Y2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQmF0Y2goKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgCiAgICAgICAgIFN0YXRlbWVudCBzdCA9IG51bGw7CkBAIC04MSw2ICs5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlN0YXRlbWVudCNjbGVhcldhcm5pbmdzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xlYXJXYXJuaW5ncyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcldhcm5pbmdzKCkgewogICAgICAgICBTdGF0ZW1lbnQgc3QgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTU5LDYgKzE4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0IGphdmEuc3FsLlN0YXRlbWVudCNjbGVhckJhdGNoKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJhZGRCYXRjaCB0ZXN0ZWQgaW5zdGVhZCBvZiBjbGVhckJhdGNoIG1ldGhvZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsZWFyQmF0Y2giLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICAKICAgICAgICAgU3RhdGVtZW50IHN0ID0gbnVsbDsKQEAgLTIxNiw2ICsyNDksMTUgQEAKICAgICAgKiBUT0RPIG5vdCBwYXNzIG9uIFNRTGl0ZSBhbmQgUkkuCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU3RyaW5nW10gcXVlcmllcyA9IHsKQEAgLTMwNiw2ICszNDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjZ2V0Q29ubmVjdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiU1FMRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbm5lY3Rpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubmVjdGlvbigpIHsKICAgICAgICAgU3RhdGVtZW50IHN0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTMyNCw2ICszNzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjZ2V0RmV0Y2hEaXJlY3Rpb24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGZXRjaERpcmVjdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaERpcmVjdGlvbigpIHsKICAgICAgICAgU3RhdGVtZW50IHN0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTM4Nyw2ICs0NDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjZ2V0RmV0Y2hTaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmV0Y2hTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEZldGNoU2l6ZSgpIHsKICAgICAgICAgU3RhdGVtZW50IHN0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTU2MCw3ICs2MjksMTYgQEAKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjY2xvc2UoKQogICAgICAqIFRPRE8gbm90IHBhc3NlZCBidXQgYWNjb3JkaW5nIHRvIEphdmEgRG9jcwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdENsb3NlKCkgewogICAgICAgICBTdGF0ZW1lbnQgc3QgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nW10gcXVlcmllcyA9IHsKQEAgLTY1Nyw2ICs3MzUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjZXhlY3V0ZUJhdGNoKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJTUUxFeGNlcHRpb24sIEJhdGNoVXBkYXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImV4ZWN1dGVCYXRjaCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlQmF0Y2goKSB7CiAKICAgICAgICAgU3RyaW5nW10gcXVlcmllcyA9IHsKQEAgLTcwNiw3ICs3OTMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjZXhlY3V0ZVF1ZXJ5KFN0cmluZyBzcWwpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVRdWVyeV9TdHJpbmcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbC9lbXB0eSBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXhlY3V0ZVF1ZXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RFeGVjdXRlUXVlcnlfU3RyaW5nKCkgewogCiAgICAgICAgIFN0cmluZ1tdIHF1ZXJpZXMxID0geyAic2VsZWN0ICogZnJvbSB6b28iLAogICAgICAgICAgICAgICAgICJzZWxlY3QgbmFtZSwgZmFtaWx5IGZyb20gem9vIHdoZXJlIGlkID0gMSIgfTsKQEAgLTc2NSw3ICs4NjEsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjZXhlY3V0ZVVwZGF0ZShTdHJpbmcgc3FsKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlVXBkYXRlX1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsL2VtcHR5IHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJleGVjdXRlVXBkYXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RFeGVjdXRlVXBkYXRlX1N0cmluZygpIHsKIAogICAgICAgICBTdHJpbmdbXSBxdWVyaWVzMSA9IHsKICAgICAgICAgICAgICAgICAidXBkYXRlIHpvbyBzZXQgbmFtZT0nTWFzaGEnLCBmYW1pbHk9J2NhdCcgd2hlcmUgaWQ9MjsiLApAQCAtOTMyLDYgKzEwMzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdCBqYXZhLnNxbC5TdGF0ZW1lbnQjZ2V0VXBkYXRlQ291bnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlNRTEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRVcGRhdGVDb3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGVDb3VudCgpIHsKICAgICAgICAgU3RhdGVtZW50IHN0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9NeVNTTENvbnRleHRTcGkuamF2YSBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9NeVNTTENvbnRleHRTcGkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTAzNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L015U1NMQ29udGV4dFNwaS5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXI7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0U3BpOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25Db250ZXh0OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0RmFjdG9yeTsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXI7CisKKy8qKgorICogQWRkaXRpb25hbCBjbGFzcyBmb3IgdmVyaWZpY2F0aW9uIG9mIFNTTENvbnRleHRTcGkgYW5kIFNTTENvbnRleHQKKyAqIGZ1bmN0aW9uYWxpdHkKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBNeVNTTENvbnRleHRTcGkgZXh0ZW5kcyBTU0xDb250ZXh0U3BpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdCA9IGZhbHNlOworICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5TWFuYWdlcltdIGttLCBUcnVzdE1hbmFnZXJbXSB0bSwKKyAgICAgICAgICAgIFNlY3VyZVJhbmRvbSBzcikgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoc3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEtleU1hbmFnZW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZWN1cmVSYW5kb20gaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGluaXQgPSB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBTU0xTb2NrZXRGYWN0b3J5IGVuZ2luZUdldFNvY2tldEZhY3RvcnkoKSB7CisgICAgICAgIGlmICghaW5pdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbml0aWFsaWF6ZWQiKTsKKyAgICAgICAgfTsgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZW5naW5lR2V0U2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgICAgICAgaWYgKCFpbml0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGluaXRpYWxpYXplZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBTU0xTZXNzaW9uQ29udGV4dCBlbmdpbmVHZXRTZXJ2ZXJTZXNzaW9uQ29udGV4dCgpIHsKKyAgICAgICAgaWYgKCFpbml0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGluaXRpYWxpYXplZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBTU0xTZXNzaW9uQ29udGV4dCBlbmdpbmVHZXRDbGllbnRTZXNzaW9uQ29udGV4dCgpIHsKKyAgICAgICAgaWYgKCFpbml0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGluaXRpYWxpYXplZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICogRklYTUU6IGFkZCB0aGVzZSBtZXRob2RzCisgICAgICovICAgCisgICAgcHJvdGVjdGVkIFNTTEVuZ2luZSBlbmdpbmVDcmVhdGVTU0xFbmdpbmUoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7CisgICAgICAgIGlmICghaW5pdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbml0aWFsaWF6ZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IHRtcFNTTEVuZ2luZShob3N0LCBwb3J0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU1NMRW5naW5lIGVuZ2luZUNyZWF0ZVNTTEVuZ2luZSgpIHsKKyAgICAgICAgaWYgKCFpbml0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGluaXRpYWxpYXplZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgdG1wU1NMRW5naW5lKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBjbGFzcyB0bXBTU0xFbmdpbmUgZXh0ZW5kcyBTU0xFbmdpbmUgeworICAgICAgICBTdHJpbmcgdG1wSG9zdDsKKyAgICAgICAgaW50IHRtcFBvcnQ7CisgICAgICAgIHB1YmxpYyB0bXBTU0xFbmdpbmUoKSB7CisgICAgICAgICAgICB0bXBIb3N0ID0gbnVsbDsKKyAgICAgICAgICAgIHRtcFBvcnQgPSAwOyAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHRtcFNTTEVuZ2luZShTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKyAgICAgICAgICAgIHRtcEhvc3QgPSBob3N0OworICAgICAgICAgICAgdG1wUG9ydCA9IHBvcnQ7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBlZXJIb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRtcEhvc3Q7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldFBlZXJQb3J0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRtcFBvcnQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYmVnaW5IYW5kc2hha2UoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZUluYm91bmQoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZU91dGJvdW5kKCkge30KKyAgICAgICAgcHVibGljIFJ1bm5hYmxlIGdldERlbGVnYXRlZFRhc2soKSB7IHJldHVybiBudWxsOyB9CisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbmFibGVkQ2lwaGVyU3VpdGVzKCkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RW5hYmxlZFByb3RvY29scygpIHtyZXR1cm4gbnVsbDsgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oKSB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIHB1YmxpYyBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIGdldEhhbmRzaGFrZVN0YXR1cygpIHsgcmV0dXJuIG51bGw7IH07CisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldE5lZWRDbGllbnRBdXRoKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICBwdWJsaWMgU1NMU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCkgIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFByb3RvY29scygpICB7IHJldHVybiBudWxsOyB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUNsaWVudE1vZGUoKSAgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRXYW50Q2xpZW50QXV0aCgpICB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5ib3VuZERvbmUoKSAgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc091dGJvdW5kRG9uZSgpICB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoU3RyaW5nW10gc3VpdGVzKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZFByb3RvY29scyhTdHJpbmdbXSBwcm90b2NvbHMpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oYm9vbGVhbiBmbGFnKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmVlZENsaWVudEF1dGgoYm9vbGVhbiBuZWVkKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VXNlQ2xpZW50TW9kZShib29sZWFuIG1vZGUpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRXYW50Q2xpZW50QXV0aChib29sZWFuIHdhbnQpIHsgfSAgICAgICAgCisgICAgICAgIHB1YmxpYyBTU0xFbmdpbmVSZXN1bHQgdW53cmFwKEJ5dGVCdWZmZXIgc3JjLCBCeXRlQnVmZmVyW10gZHN0cywKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcHVibGljIFNTTEVuZ2luZVJlc3VsdCB3cmFwKEJ5dGVCdWZmZXJbXSBzcmNzLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIEJ5dGVCdWZmZXIgZHN0KSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsgCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9NeVRydXN0TWFuYWdlckZhY3RvcnlTcGkuamF2YSBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9NeVRydXN0TWFuYWdlckZhY3RvcnlTcGkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzJlYThlCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L015VHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5NYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnM7CitpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXI7CitpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5U3BpOworCisvKioKKyAqIENsYXNzIGZvciB2ZXJ0aWZ5aW5nIFRydXN0TWFuYWdlckZhY3RvcnlTcGkgYW5kIFRydXN0TWFuYWdlckZhY3RvcnkgCisgKiBmdW5jdGlvbmFsaXR5CisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgTXlUcnVzdE1hbmFnZXJGYWN0b3J5U3BpIGV4dGVuZHMgVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaSB7CisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChLZXlTdG9yZSBrcykgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGtzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBLZXlTdG9yZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBvcGVyYXRpb24gZm9yIG51bGwgS2V5U3RvcmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzIHNwZWMpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzcGVjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKCJOdWxsIHBhcmFtZXRlciIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcGVjIGluc3RhbmNlb2YgUGFyYW1ldGVycykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBlbmdpbmVJbml0KCgoUGFyYW1ldGVycylzcGVjKS5nZXRLZXlTdG9yZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFRydXN0TWFuYWdlcltdIGVuZ2luZUdldFRydXN0TWFuYWdlcnMoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcnMgaW1wbGVtZW50cyBNYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMgeworICAgICAgICBwcml2YXRlIEtleVN0b3JlIGtleVN0b3JlOworICAgICAgICBwdWJsaWMgUGFyYW1ldGVycyAoS2V5U3RvcmUga3MpIHsKKyAgICAgICAgICAgIHRoaXMua2V5U3RvcmUgPSBrczsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgS2V5U3RvcmUgZ2V0S2V5U3RvcmUoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5U3RvcmU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Db25maWd1cmF0aW9uLmphdmEgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Db25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYjg5MgotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9TdXBwb3J0X0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ3NSBAQAorLyogCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgdGhlIGR5bmFtaWMgbmFtZXMgYW5kIGFkZHJlc3NlcyBmb3IKKyAqIHRoZSBqYXZhLm5ldCBjbGFzc2VzLiBUaGVyZSBhcmUgdHdvIGRpcmVjdG9yaWVzIHdoaWNoIG5lZWQgdG8gYmUgcGxhY2VkIG9uIGFuCisgKiBmdHAgc2VydmVyIGFuZCBhbiBodHRwIHNlcnZlciB3aGljaCBzaG91bGQgYWNjb21wYW55IHRoaXMgc291cmNlLiBUaGUKKyAqIGZ0cC1maWxlcyBoYXZlIHRvIGJlIHBsYWNlZCBvbiBhbiBmdHAgc2VydmVyIGFuZCBoYXZlIHRvIGJlIHRoZSByb290IG9mIGEKKyAqIHVzZXIgamNsdGVzdCB3aXRoIHBhc3N3b3JkIGpjbHBhc3MuIFRoZSB0ZXN0cmVzIGZpbGVzIG11c3QgYmUgYXZhaWxhYmxlIG9uIGFuCisgKiBIVFRQIHNlcnZlciBhbmQgdGhlIG5hbWUgYW5kIGxvY2F0aW9uIGNhbiBiZSBjb25maWd1cmVkIGJlbG93LgorICovCitwdWJsaWMgY2xhc3MgU3VwcG9ydF9Db25maWd1cmF0aW9uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERvbWFpbkFkZHJlc3MgPSAiYXBhY2hlLm9yZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXZWJOYW1lID0gImpjbHRlc3QuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhvbWVBZGRyZXNzOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVGVzdFJlc291cmNlc0RpciA9ICIvdGVzdHJlczIzMSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUZXN0UmVzb3VyY2VzOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSG9tZUFkZHJlc3NSZXNwb25zZSA9ICJIVFRQLzEuMSAyMDAgT0siOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSG9tZUFkZHJlc3NTb2Z0d2FyZSA9ICJKZXR0eSg2LjAueCkiOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlTZXJ2ZXJUZXN0SG9zdCA9ICJqY2x0ZXN0LmFwYWNoZS5vcmciOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU29ja3NTZXJ2ZXJUZXN0SG9zdCA9ICJqY2x0ZXN0LmFwYWNoZS5vcmciOworCisgICAgcHVibGljIHN0YXRpYyBpbnQgU29ja3NTZXJ2ZXJUZXN0UG9ydCA9IDEwODA7CisKKyAgICAvLyBOZWVkIGFuIElQIGFkZHJlc3MgdGhhdCBkb2VzIG5vdCByZXNvbHZlIHRvIGEgaG9zdCBuYW1lCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVW5yZXNvbHZlZElQID0gIjE5Mi4xNjguOTkuOTkiOworCisgICAgLy8gdGhlIGJ5dGVzIGZvciBhbiBhZGRyZXNzIHdoaWNoIHJlcHJlc2VudHMgYW4gYWRkcmVzcyB3aGljaCBpcyBub3QKKyAgICAvLyBvbmUgb2YgdGhlIGFkZHJlc3NlcyBmb3IgYW55IG9mIG91ciBtYWNoaW5lcyBvbiB3aGljaCB0ZXN0cyB3aWxsIHJ1bgorICAgIC8vIGl0IGlzIHVzZWQgdG8gdmVyaWZ5IHdlIGdldCB0aGUgZXhwZWN0ZWQgZXJyb3Igd2hlbiB3ZSB0cnkgdG8gYmluZAorICAgIC8vIHRvIGFuIGFkZHJlc3MgdGhhdCBpcyBub3Qgb25lIG9mIHRoZSBtYWNoaW5lcyBsb2NhbCBhZGRyZXNzZXMKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGUgbm9uTG9jYWxBZGRyZXNzQnl0ZXNbXSA9IHsgMSwgMCwgMCwgMCB9OworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSW5ldFRlc3RBZGRyZXNzID0gImxvY2FsaG9zdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJbmV0VGVzdElQID0gIjEyNy4wLjAuMSI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJbmV0VGVzdEFkZHJlc3MyID0gImxvY2FsaG9zdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJbmV0VGVzdElQMiA9ICIxMjcuMC4wLjEiOworCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gSW5ldFRlc3RDYWRkciA9IHsgOSwgMjYsIC01NiwgLTExMSB9OworCisgICAgcHVibGljIHN0YXRpYyBpbnQgSW5ldFRlc3RIYXNoY29kZSA9IDIxMzA3MDY0MzM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIb21lQWRkcmVzczYgPSAiamNsdGVzdDYuYXBhY2hlLm9yZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJUHY2R2xvYmFsQWRkcmVzc0pjbDQgPSAiRkU4MDowMDAwOjAwMDA6MDAwMDowMjBEOjYwRkY6RkUwRjpBNzc2JTQiOyAvLyB0aGlzCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVNlcnZlclRlc3RIb3N0SVB2NiA9ICJqY2x0ZXN0Ni5hcGFjaGUub3JnIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZXRUZXN0SVA2ID0gImZlODA6OjIwZDo2MGZmOmZlMjQ6NzQxMCI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJbmV0VGVzdElQNkxPID0gIjo6MSI7CisKKyAgICAvLyBpcCBhZGRyZXNzIHRoYXQgcmVzb2x2ZXMgdG8gYSBob3N0IHRoYXQgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsCisgICAgLy8gbmV0d29yaworICAgIC8vIHRoaXMgYWxsb3dzIHVzIHRvIGNoZWNrIHRoZSB0aW1lb3V0cyBmb3IgY29ubmVjdAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc29sdmVkTm90RXhpc3RpbmdIb3N0ID0gIjkuMjYuMTk0LjcyIjsKKworICAgIC8qKgorICAgICAqIFlvdSBjYW4gY29tcHV0ZSB0aGUgaGFzaCBjb2RlIHdpdGggdGhlIGZvbGxvd2luZyBjb2RlOiB0cnkgeyBTdHJpbmcgbmFtZSA9CisgICAgICogIndoYXRldmVyLnh4eC5jb20iOworICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihJbmV0QWRkcmVzcy5nZXRCeU5hbWUobmFtZSkuaGFzaENvZGUoKSk7IH0gY2F0Y2gKKyAgICAgKiAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkge30KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEFuIGFkZHJlc3MgdGhhdCByZXNvbHZlcyB0byBtb3JlIHRoYW4gb25lIElQIGFkZHJlc3Mgc28gdGhhdCB0aGUKKyAgICAgKiBnZXRBbGxCeU5hbWUgdGVzdCBoYXMgc29tZXRoaW5nIHRvIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU3BlY2lhbEluZXRUZXN0QWRkcmVzcyA9ICJqY2x0ZXN0bXVsdGlwbGUuYXBhY2hlLm9yZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBTcGVjaWFsSW5ldFRlc3RBZGRyZXNzTnVtYmVyID0gNDsKKworICAgIC8qKgorICAgICAqIEluZXRBbGlhczEgYW5kIEluZXRBbGlhczIgbXVzdCBiZSBkaWZmZXJlbnQgaG9zdCBuYW1lcyB0aGF0IHJlc29sdmUgdG8KKyAgICAgKiB0aGUgc2FtZSBJUCBhZGRyZXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZXRBbGlhczEgPSAiYWxpYXMxLmFwYWNoZS5vcmciOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSW5ldEFsaWFzMiA9ICJhbGlhczIuYXBhY2hlLm9yZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGVFBUZXN0QWRkcmVzcyA9ICJqY2x0ZXN0OmpjbHBhc3NAbG9jYWxob3N0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTENvbm5lY3Rpb25MYXN0TW9kaWZpZWRTdHJpbmcgPSAiTW9uLCAxNCBKdW4gMTk5OSAyMTowNjoyMiBHTVQiOworCisgICAgcHVibGljIHN0YXRpYyBsb25nIFVSTENvbm5lY3Rpb25MYXN0TW9kaWZpZWQgPSA5MjkzOTQzODIwMDBMOworCisgICAgcHVibGljIHN0YXRpYyBsb25nIFVSTENvbm5lY3Rpb25EYXRlID0gOTI5MTA2ODcyMDAwTDsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBSdW5Db21tVGVzdHMgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBvcnQxID0gIkNPTTEiOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUG9ydDIgPSAiQ09NMiI7CisKKyAgICBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG51bGw7CisgICAgc3RhdGljIHsKKyAgICAgICAgbG9hZFByb3BlcnRpZXMoKTsKKyAgICAgICAgSG9tZUFkZHJlc3MgPSBXZWJOYW1lICsgRG9tYWluQWRkcmVzczsKKyAgICAgICAgVGVzdFJlc291cmNlcyA9IEhvbWVBZGRyZXNzICsgVGVzdFJlc291cmNlc0RpcjsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2FkUHJvcGVydGllcygpIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHByb3BzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICBTdHJpbmcgaW5pTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5pbmkuZmlsZSIsICJKQ0xBdXRvLmluaSIpOworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LmNvbW0iKSAhPSBudWxsKSB7CisgICAgICAgICAgICBSdW5Db21tVGVzdHMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbmlOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdXBwb3J0Q29uZmlndXJhdGlvbi5sb2FkUHJvcGVydGllcygpIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IGNsID0gQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JOYW1lKCJjb20uaWJtLnN1cHBvcnQuU3VwcG9ydF9Db25maWd1cmF0aW9uIik7CisgICAgICAgICAgICAgICAgaW4gPSBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKGluaU5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9hZChpbiwgcHJvcHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3BzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJEb21haW5BZGRyZXNzIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBEb21haW5BZGRyZXNzID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiV2ViTmFtZSIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgV2ViTmFtZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIlRlc3RSZXNvdXJjZXNEaXIiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRlc3RSZXNvdXJjZXNEaXIgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiSG9tZUFkZHJlc3NSZXNwb25zZSIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgSG9tZUFkZHJlc3NSZXNwb25zZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIkhvbWVBZGRyZXNzU29mdHdhcmUiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEhvbWVBZGRyZXNzU29mdHdhcmUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJQcm94eVNlcnZlclRlc3RIb3N0Iik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQcm94eVNlcnZlclRlc3RIb3N0ID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiU29ja3NTZXJ2ZXJUZXN0SG9zdCIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgU29ja3NTZXJ2ZXJUZXN0SG9zdCA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIlNvY2tzU2VydmVyVGVzdFBvcnQiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFNvY2tzU2VydmVyVGVzdFBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJVbnJlc29sdmVkSVAiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFVucmVzb2x2ZWRJUCA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIkluZXRUZXN0QWRkcmVzcyIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5ldFRlc3RBZGRyZXNzID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiSW5ldFRlc3RJUCIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5ldFRlc3RJUCA9IHZhbHVlOworICAgICAgICAgICAgYnl0ZVtdIGFkZHIgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGludCBsYXN0ID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRvdCA9IEluZXRUZXN0SVAuaW5kZXhPZignLicsIGxhc3QpOworICAgICAgICAgICAgICAgICAgICBhZGRyW2ldID0gKGJ5dGUpIEludGVnZXIucGFyc2VJbnQoSW5ldFRlc3RJUC5zdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCwgZG90KSk7CisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBkb3QgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyWzNdID0gKGJ5dGUpIEludGVnZXIucGFyc2VJbnQoSW5ldFRlc3RJUC5zdWJzdHJpbmcobGFzdCkpOworICAgICAgICAgICAgICAgIEluZXRUZXN0Q2FkZHIgPSBhZGRyOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBwYXJzaW5nIEluZXRUZXN0SVAgKCIgKyBJbmV0VGVzdElQCisgICAgICAgICAgICAgICAgICAgICAgICArICIpIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIk5vbkxvY2FsQWRkcmVzc0J5dGVzIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbm9uTG9jYWxBZGRyZXNzQnl0ZXNTdHJpbmcgPSB2YWx1ZTsKKyAgICAgICAgICAgIGJ5dGVbXSBhZGRyID0gbmV3IGJ5dGVbNF07CisgICAgICAgICAgICBpbnQgbGFzdCA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkb3QgPSBub25Mb2NhbEFkZHJlc3NCeXRlc1N0cmluZy5pbmRleE9mKCcuJywgbGFzdCk7CisgICAgICAgICAgICAgICAgICAgIGFkZHJbaV0gPSAoYnl0ZSkgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZUludChub25Mb2NhbEFkZHJlc3NCeXRlc1N0cmluZy5zdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0LCBkb3QpKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGRvdCArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZHJbM10gPSAoYnl0ZSkgSW50ZWdlci5wYXJzZUludChub25Mb2NhbEFkZHJlc3NCeXRlc1N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhsYXN0KSk7CisgICAgICAgICAgICAgICAgbm9uTG9jYWxBZGRyZXNzQnl0ZXMgPSBhZGRyOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBwYXJzaW5nIE5vbkxvY2FsQWRkcmVzc0J5dGVzICgiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5vbkxvY2FsQWRkcmVzc0J5dGVzU3RyaW5nICsgIikiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiSW5ldFRlc3RBZGRyZXNzMiIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5ldFRlc3RBZGRyZXNzMiA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIkluZXRUZXN0SVAyIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbmV0VGVzdElQMiA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIkluZXRUZXN0SGFzaGNvZGUiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEluZXRUZXN0SGFzaGNvZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJTcGVjaWFsSW5ldFRlc3RBZGRyZXNzIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTcGVjaWFsSW5ldFRlc3RBZGRyZXNzID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiU3BlY2lhbEluZXRUZXN0QWRkcmVzc051bWJlciIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgU3BlY2lhbEluZXRUZXN0QWRkcmVzc051bWJlciA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIkZUUFRlc3RBZGRyZXNzIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBGVFBUZXN0QWRkcmVzcyA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIlVSTENvbm5lY3Rpb25MYXN0TW9kaWZpZWRTdHJpbmciKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFVSTENvbm5lY3Rpb25MYXN0TW9kaWZpZWRTdHJpbmcgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJVUkxDb25uZWN0aW9uTGFzdE1vZGlmaWVkIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBVUkxDb25uZWN0aW9uTGFzdE1vZGlmaWVkID0gTG9uZy5wYXJzZUxvbmcodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIlVSTENvbm5lY3Rpb25EYXRlIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBVUkxDb25uZWN0aW9uRGF0ZSA9IExvbmcucGFyc2VMb25nKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJQb3J0MSIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgUG9ydDEgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJQb3J0MiIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgUG9ydDIgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJJbmV0VGVzdElQNiIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5ldFRlc3RJUDYgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJJbmV0VGVzdElQNkxPIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbmV0VGVzdElQNkxPID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiUHJveHlTZXJ2ZXJUZXN0SG9zdElQdjYiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFByb3h5U2VydmVyVGVzdEhvc3RJUHY2ID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiUmVzb2x2ZWROb3RFeGlzdGluZ0hvc3QiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlc29sdmVkTm90RXhpc3RpbmdIb3N0ID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHByb3BzLmdldCgiSW5ldEFsaWFzMSIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5ldEFsaWFzMSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBwcm9wcy5nZXQoIkluZXRBbGlhczIiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEluZXRBbGlhczIgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcHJvcHMuZ2V0KCJJUHY2R2xvYmFsQWRkcmVzc0pjbDQiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIElQdjZHbG9iYWxBZGRyZXNzSmNsNCA9IHZhbHVlOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGluLCBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IE5PTkUgPSAwLCBTTEFTSCA9IDEsIFVOSUNPREUgPSAyLCBDT05USU5VRSA9IDMsIERPTkUgPSA0LCBJR05PUkUgPSA1OworICAgICAgICBpbnQgbW9kZSA9IE5PTkUsIHVuaWNvZGUgPSAwLCBjb3VudCA9IDAsIG5leHRDaGFyOworICAgICAgICBTdHJpbmdCdWZmZXIga2V5ID0gbmV3IFN0cmluZ0J1ZmZlcigpLCB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKSwgYnVmZmVyID0ga2V5OworICAgICAgICBib29sZWFuIGZpcnN0Q2hhciA9IHRydWU7CisKKyAgICAgICAgd2hpbGUgKChuZXh0Q2hhciA9IGluLnJlYWQoKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09IFVOSUNPREUpIHsKKyAgICAgICAgICAgICAgICBpbnQgZGlnaXQgPSBDaGFyYWN0ZXIuZGlnaXQoKGNoYXIpIG5leHRDaGFyLCAxNik7CisgICAgICAgICAgICAgICAgaWYgKGRpZ2l0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pY29kZSA9ICh1bmljb2RlIDw8IDQpICsgZGlnaXQ7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50IDwgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbW9kZSA9IE5PTkU7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhcikgdW5pY29kZSk7CisgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGUgPT0gU0xBU0gpIHsKKyAgICAgICAgICAgICAgICBtb2RlID0gTk9ORTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5leHRDaGFyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBtb2RlID0gQ09OVElOVUU7IC8vIExvb2sgZm9yIGEgZm9sbG93aW5nIFxuCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IElHTk9SRTsgLy8gSWdub3JlIHdoaXRlc3BhY2Ugb24gdGhlIG5leHQgbGluZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSAnXGInOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSAnXGYnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSAnXG4nOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSAnXHInOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSAnXHQnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFVOSUNPREU7CisgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUgPSBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChuZXh0Q2hhcikgeworICAgICAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgIGNhc2UgJyEnOgorICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDaGFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHRDaGFyID0gaW4ucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnXHInIHx8IG5leHRDaGFyID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSBDT05USU5VRSkgeyAvLyBQYXJ0IG9mIGEgXHJcbiBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IElHTk9SRTsgLy8gSWdub3JlIHdoaXRlc3BhY2Ugb24gdGhlIG5leHQgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCBpbnRvIHRoZSBuZXh0IGNhc2UKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBOT05FOworICAgICAgICAgICAgICAgICAgICBmaXJzdENoYXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCgpID4gMCB8fCBidWZmZXIgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGtleS5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0ga2V5OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBTTEFTSDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgbmV4dENoYXI7CisgICAgICAgICAgICAgICAgaWYgKChjID49IDB4MWMgJiYgYyA8PSAweDIwKSB8fCAoYyA+PSAweDkgJiYgYyA8PSAweGQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09IENPTlRJTlVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSUdOT1JFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPT0gMCB8fCBtb2RlID09IElHTk9SRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBrZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBET05FOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gSUdOT1JFIHx8IG1vZGUgPT0gQ09OVElOVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IE5PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyc3RDaGFyID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobW9kZSA9PSBET05FKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gdmFsdWU7CisgICAgICAgICAgICAgICAgbW9kZSA9IE5PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSBuZXh0Q2hhcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtleS5sZW5ndGgoKSA+IDAgfHwgYnVmZmVyID09IHZhbHVlKSB7CisgICAgICAgICAgICByZXN1bHQucHV0KGtleS50b1N0cmluZygpLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L2NlcnQvTXlDZXJ0UGF0aC5qYXZhIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L2NlcnQvTXlDZXJ0UGF0aC5qYXZhCmluZGV4IGNjZGIyMTYuLjA2YzI3MTYyIDEwMDY0NAotLS0gYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvY2VydC9NeUNlcnRQYXRoLmphdmEKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L2NlcnQvTXlDZXJ0UGF0aC5qYXZhCkBAIC0yMiw4ICsyMiw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydDsKIAoraW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTM2LDEwICszNiwxMiBAQAogICogCiAgKi8KIHB1YmxpYyBjbGFzcyBNeUNlcnRQYXRoIGV4dGVuZHMgQ2VydFBhdGggeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc0NDQ4MzU1OTkxNjE4NzA4OTNMOwogICAgIC8qKgogICAgICAqIG15IGNlcnRpZmljYXRlcyBsaXN0CiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlczsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxNeUNlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXM7CisKICAgICAvKioKICAgICAgKiBMaXN0IG9mIGVuY29kaW5ncyBzdXBwb3J0ZWQKICAgICAgKi8KQEAgLTU4LDcgKzYwLDcgQEAKICAgICBwdWJsaWMgTXlDZXJ0UGF0aChieXRlW10gZW5jb2RpbmcpIHsKICAgICAgICAgc3VwZXIoIk15RW5jb2RpbmciKTsKICAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwotICAgICAgICBjZXJ0aWZpY2F0ZXMgPSBuZXcgVmVjdG9yPENlcnRpZmljYXRlPigpOworICAgICAgICBjZXJ0aWZpY2F0ZXMgPSBuZXcgVmVjdG9yPE15Q2VydGlmaWNhdGU+KCk7CiAgICAgICAgIGNlcnRpZmljYXRlcy5hZGQobmV3IE15Q2VydGlmaWNhdGUoIk15RW5jb2RpbmciLCBlbmNvZGluZykpOwogICAgICAgICBlbmNvZGluZ05hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CiAgICAgICAgIGVuY29kaW5nTmFtZXMuYWRkKCJNeUVuY29kaW5nIik7CkBAIC02OCw3ICs3MCw3IEBACiAgICAgICogQHJldHVybiBjZXJ0aWZpY2F0ZXMgbGlzdAogICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoI2dldENlcnRpZmljYXRlcygpCiAgICAgICovCi0gICAgcHVibGljIExpc3Q8Q2VydGlmaWNhdGU+IGdldENlcnRpZmljYXRlcygpIHsKKyAgICBwdWJsaWMgTGlzdDxNeUNlcnRpZmljYXRlPiBnZXRDZXJ0aWZpY2F0ZXMoKSB7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNlcnRpZmljYXRlcyk7CiAgICAgfQogCkBAIC04Myw4ICs4NSw4IEBACiAgICAgLyoqCiAgICAgICogQHJldHVybiBlbmNvZGVkIGZvcm0gb2YgdGhpcyBjZXJ0IHBhdGggYXMgc3BlY2lmaWVkIGJ5CiAgICAgICogPGNvZGU+ZW5jb2Rpbmc8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiBpZiA8Y29kZT5lbmNvZGluZzwvY29kZT4KLSAgICAgKiBub3QgZXF1YWxzICJNeUVuY29kaW5nIiAKKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5lbmNvZGluZzwvY29kZT4gbm90IGVxdWFscyAiTXlFbmNvZGluZyIKICAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCNnZXRFbmNvZGVkKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKFN0cmluZyBlbmNvZGluZykKQEAgLTEwNCw0ICsxMDYsMzcgQEAKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oZW5jb2RpbmdOYW1lcykuaXRlcmF0b3IoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBDZXJ0UGF0aFJlcCB0byBiZSBzZXJpYWxpemVkCisgICAgICogQHNlZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGgjd3JpdGVSZXBsYWNlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3VwZXIud3JpdGVSZXBsYWNlKCk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15Q2VydFBhdGhSZXAgZXh0ZW5kcyBDZXJ0UGF0aC5DZXJ0UGF0aFJlcCB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTYwOTAwMDA4NTQ1MDQ3OTE3M0w7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gZGF0YTsgCisgICAgICAgIAorICAgICAgICBwdWJsaWMgTXlDZXJ0UGF0aFJlcChTdHJpbmcgdHlwZSwgYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHN1cGVyKHR5cGUsIGRhdGEpOworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVhZFJlc29sdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9jZXJ0L015Q2VydFN0b3JlU3BpLmphdmEgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvY2VydC9NeUNlcnRTdG9yZVNwaS5qYXZhCmluZGV4IGZkNjUwNWMuLmZlMzAwMmUgMTAwNjQ0Ci0tLSBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9jZXJ0L015Q2VydFN0b3JlU3BpLmphdmEKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L2NlcnQvTXlDZXJ0U3RvcmVTcGkuamF2YQpAQCAtMjMsMTEgKzIzLDEzIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQ7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNSTDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMU2VsZWN0b3I7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTZWxlY3RvcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVTcGk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiAvKioKQEAgLTQ2LDcgKzQ4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGVuZ2luZUdldENlcnRpZmljYXRlcyhDZXJ0U2VsZWN0b3Igc2VsZWN0b3IpCisgICAgcHVibGljIENvbGxlY3Rpb248Q2VydGlmaWNhdGU+IGVuZ2luZUdldENlcnRpZmljYXRlcyhDZXJ0U2VsZWN0b3Igc2VsZWN0b3IpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydFN0b3JlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0U3RvcmVFeGNlcHRpb24oIlBhcmFtZXRlciBpcyBudWxsIik7CkBAIC01NCw3ICs1Niw3IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGVuZ2luZUdldENSTHMoQ1JMU2VsZWN0b3Igc2VsZWN0b3IpCisgICAgcHVibGljIENvbGxlY3Rpb248Q1JMPiBlbmdpbmVHZXRDUkxzKENSTFNlbGVjdG9yIHNlbGVjdG9yKQogICAgICAgICAgICAgdGhyb3dzIENlcnRTdG9yZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydFN0b3JlRXhjZXB0aW9uKCJQYXJhbWV0ZXIgaXMgbnVsbCIpOwpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L2NlcnQvTXlDZXJ0aWZpY2F0ZS5qYXZhIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L2NlcnQvTXlDZXJ0aWZpY2F0ZS5qYXZhCmluZGV4IGYwNmVkMWQuLmU2ZDYwMzQgMTAwNjQ0Ci0tLSBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9jZXJ0L015Q2VydGlmaWNhdGUuamF2YQorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvY2VydC9NeUNlcnRpZmljYXRlLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0OwogCitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CkBAIC0zNiw5ICszNywxMiBAQAogICovCiBwdWJsaWMgY2xhc3MgTXlDZXJ0aWZpY2F0ZSBleHRlbmRzIENlcnRpZmljYXRlIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xODM1MzAzMjgwNzI3MTkwMDY2TDsKICAgICAvLyBNeUNlcnRpZmljYXRlIGVuY29kaW5nCiAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gZW5jb2Rpbmc7CiAKKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVSZXAgcmVwOworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBuZXcgb2JqZWN0IG9mIGNsYXNzIDxjb2RlPk15Q2VydGlmaWNhdGU8L2NvZGU+CiAgICAgICogCkBAIC04MywxMSArODcsMTYgQEAKICAgICAgICAgcmV0dXJuICJbTXkgdGVzdCBDZXJ0aWZpY2F0ZSwgdHlwZTogIiArIGdldFR5cGUoKSArICJdIjsKICAgICB9CiAKKyAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3VwZXIud3JpdGVSZXBsYWNlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBwdWJsaWMga2V5IChzdHViKSBmcm9tIDxjb2RlPk15Q2VydGlmaWNhdGU8L2NvZGU+IG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBQdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkgewogICAgICAgICByZXR1cm4gbmV3IFB1YmxpY0tleSgpIHsKKyAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzg4MDc3OTI4MzM1NTg5ODE2TDsKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgewogICAgICAgICAgICAgICAgIHJldHVybiAiVEVTVCI7CiAgICAgICAgICAgICB9CkBAIC0xMDAsNCArMTA5LDM1IEBACiAgICAgICAgIH07CiAgICAgfQogCisgICAgcHVibGljIENlcnRpZmljYXRlLkNlcnRpZmljYXRlUmVwIGdldENlcnRpZmljYXRlUmVwKCkKKyAgICAgICAgICAgIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICBPYmplY3Qgb2JqID0gc3VwZXIud3JpdGVSZXBsYWNlKCk7CisgICAgICAgIHJldHVybiAoTXlDZXJ0aWZpY2F0ZVJlcCkgb2JqOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeUNlcnRpZmljYXRlUmVwIGV4dGVuZHMgQ2VydGlmaWNhdGUuQ2VydGlmaWNhdGVSZXAgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDc0Mjg0MDQzOTk0NjM1NTUzTDsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB0eXBlOworICAgICAgICBwcml2YXRlIGJ5dGVbXSBkYXRhOyAKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNeUNlcnRpZmljYXRlUmVwKFN0cmluZyB0eXBlLCBieXRlW10gZGF0YSkgeworICAgICAgICAgICAgc3VwZXIodHlwZSwgZGF0YSk7CisgICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5yZWFkUmVzb2x2ZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXREYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvY2VydC9NeUNlcnRpZmljYXRlRmFjdG9yeVNwaS5qYXZhIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L2NlcnQvTXlDZXJ0aWZpY2F0ZUZhY3RvcnlTcGkuamF2YQppbmRleCA4YTk0YTZjLi5lYTM4ZTcyIDEwMDY0NAotLS0gYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvY2VydC9NeUNlcnRpZmljYXRlRmFjdG9yeVNwaS5qYXZhCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvc3VwcG9ydC9jZXJ0L015Q2VydGlmaWNhdGVGYWN0b3J5U3BpLmphdmEKQEAgLTcxLDYgKzcxLDcgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIENvbGxlY3Rpb24gZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZXMoSW5wdXRTdHJlYW0gaW5TdHJlYW0pCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewogICAgICAgICBpZiAoIShpblN0cmVhbSBpbnN0YW5jZW9mIERhdGFJbnB1dFN0cmVhbSkpIHsKQEAgLTg2LDYgKzg3LDcgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIENvbGxlY3Rpb24gZW5naW5lR2VuZXJhdGVDUkxzKElucHV0U3RyZWFtIGluU3RyZWFtKQogICAgICAgICAgICAgdGhyb3dzIENSTEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghKGluU3RyZWFtIGluc3RhbmNlb2YgRGF0YUlucHV0U3RyZWFtKSkgewpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L3Jlc291cmNlL1N1cHBvcnRfUmVzb3VyY2VzLmphdmEgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL3N1cHBvcnQvcmVzb3VyY2UvU3VwcG9ydF9SZXNvdXJjZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTJiOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9zdXBwb3J0L3Jlc291cmNlL1N1cHBvcnRfUmVzb3VyY2VzLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlICBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3VwcG9ydF9Db25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgU3VwcG9ydF9SZXNvdXJjZXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfUEFDS0FHRSA9ICIvdGVzdHMvcmVzb3VyY2VzLyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9QQUNLQUdFX05BTUUgPSAidGVzdHMucmVzb3VyY2VzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBTdXBwb3J0X1Jlc291cmNlcy5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKFJFU09VUkNFX1BBQ0tBR0UKKyAgICAgICAgICAgICAgICArIG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSTChTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmcgZm9sZGVyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbmFtZTsKKyAgICAgICAgRmlsZSByZXNvdXJjZXMgPSBjcmVhdGVUZW1wRm9sZGVyKCk7CisgICAgICAgIGludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBmb2xkZXIgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgfQorICAgICAgICBjb3B5RmlsZShyZXNvdXJjZXMsIGZvbGRlciwgbmFtZSk7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICBTdHJpbmcgcmVzUGF0aCA9IHJlc291cmNlcy50b1N0cmluZygpOworICAgICAgICBpZiAocmVzUGF0aC5jaGFyQXQoMCkgPT0gJy8nIHx8IHJlc1BhdGguY2hhckF0KDApID09ICdcXCcpIHsKKyAgICAgICAgICAgIHJlc1BhdGggPSByZXNQYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovIiArIHJlc1BhdGggKyAiLyIgKyBmaWxlTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZvbGRlcigpIHsKKworICAgICAgICBGaWxlIGZvbGRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb2xkZXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJoeXRzX3Jlc291cmNlcyIsICIiLCBudWxsKTsKKyAgICAgICAgICAgIGZvbGRlci5kZWxldGUoKTsKKyAgICAgICAgICAgIGZvbGRlci5ta2RpcnMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBmb2xkZXIuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIHJldHVybiBmb2xkZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGaWxlKEZpbGUgcm9vdCwgU3RyaW5nIGZvbGRlciwgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgRmlsZSBmOworICAgICAgICBpZiAoZm9sZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGYgPSBuZXcgRmlsZShyb290LnRvU3RyaW5nKCkgKyAiLyIgKyBmb2xkZXIpOworICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZi5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZiA9IHJvb3Q7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZShmLnRvU3RyaW5nKCkgKyAiLyIgKyBmaWxlKTsKKworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbShmb2xkZXIgPT0gbnVsbCA/IGZpbGUKKyAgICAgICAgICAgICAgICA6IGZvbGRlciArICIvIiArIGZpbGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29weUxvY2FsRmlsZXRvKGRlc3QsIGluKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZpbGUuY3JlYXRlVGVtcEZpbGUoImh5dHNfIiwgc3VmZml4LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUxvY2FsRmlsZXRvKEZpbGUgZGVzdCwgSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZGVzdC5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKKyAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICB3aGlsZSAoKHJlc3VsdCA9IGluLnJlYWQoYnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgZGVzdC5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRFeHRlcm5hbExvY2FsRmlsZShTdHJpbmcgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICBGaWxlIHJlc291cmNlcyA9IGNyZWF0ZVRlbXBGb2xkZXIoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgVVJMKHVybCkub3BlblN0cmVhbSgpOworICAgICAgICBGaWxlIHRlbXAgPSBuZXcgRmlsZShyZXNvdXJjZXMudG9TdHJpbmcoKSArICIvbG9jYWwudG1wIik7CisgICAgICAgIGNvcHlMb2NhbEZpbGV0byh0ZW1wLCBpbik7CisgICAgICAgIHJldHVybiB0ZW1wOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlVVJMKFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gImh0dHA6Ly8iICsgU3VwcG9ydF9Db25maWd1cmF0aW9uLlRlc3RSZXNvdXJjZXMgKyByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsIG1ldGhvZCB0byBsb2FkIHJlc291cmNlIGZpbGVzCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgLSBuYW1lIG9mIHJlc291cmNlIGZpbGUKKyAgICAgKiBAcmV0dXJuIC0gcmVzb3VyY2UgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZVN0cmVhbShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworCisgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGlzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBVdGlsIG1ldGhvZCB0byBnZXQgYWJzb2x1dGUgcGF0aCB0byByZXNvdXJjZSBmaWxlCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgLSBuYW1lIG9mIHJlc291cmNlIGZpbGUKKyAgICAgKiBAcmV0dXJuIC0gcGF0aCB0byByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUmVzb3VyY2VQYXRoKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgVVJMIHVybCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UobmFtZSk7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIHJlc291cmNlOiAiICsgbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHVybC50b1VSSSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCByZXNvdXJjZTogIiArIG5hbWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0ZnJhbWV3b3JrL3NlcmlhbGl6YXRpb24vU2VyaWFsaXphdGlvblRlc3QuamF2YSBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGVzdGZyYW1ld29yay9zZXJpYWxpemF0aW9uL1NlcmlhbGl6YXRpb25UZXN0LmphdmEKaW5kZXggYzc4M2M2ZC4uN2U0Nzk3ZCAxMDA2NDQKLS0tIGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXN0ZnJhbWV3b3JrL3NlcmlhbGl6YXRpb24vU2VyaWFsaXphdGlvblRlc3QuamF2YQorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3Rlc3RmcmFtZXdvcmsvc2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uVGVzdC5qYXZhCkBAIC0yMiw2ICsyMiw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbjsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTYxLDYgKzYzLDcgQEAKICAqIDxiPiZxdW90O1JFU09VUkNFX0RJUiZxdW90OyA8L2I+IHN5c3RlbSBwcm9wZXJ0eS4KICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKFNlcmlhbGl6YWJsZS5jbGFzcykgCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VyaWFsaXphdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfQ29sbGVjdGlvblRlc3QuamF2YSBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfQ29sbGVjdGlvblRlc3QuamF2YQppbmRleCA3OTEyMjJkLi44MjQ3NjhhIDEwMDY0NAotLS0gYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvc3VwcG9ydC9TdXBwb3J0X0NvbGxlY3Rpb25UZXN0LmphdmEKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Db2xsZWN0aW9uVGVzdC5qYXZhCkBAIC0xNywxNCArMTcsMTYgQEAKIAogcGFja2FnZSB0ZXN0cy5zdXBwb3J0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiAKIC8qKgogICogQHRlc3RzIGphdmEudXRpbC5Db2xsZWN0aW9uCiAgKi8KLXB1YmxpYyBjbGFzcyBTdXBwb3J0X0NvbGxlY3Rpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKLQorQFRlc3RUYXJnZXRDbGFzcyhqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzcykKK3B1YmxpYyBjbGFzcyBTdXBwb3J0X0NvbGxlY3Rpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsgCiAgICAgQ29sbGVjdGlvbjxJbnRlZ2VyPiBjb2w7IC8vIG11c3QgY29udGFpbiB0aGUgSW50ZWdlcnMgMCB0byA5OQogCiAgICAgcHVibGljIFN1cHBvcnRfQ29sbGVjdGlvblRlc3QoU3RyaW5nIHAxKSB7CmRpZmYgLS1naXQgYS9sb2dnaW5nL3NyYy90ZXN0L2phdmEvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyRXh0ZW5zaW9uLmphdmEgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvc3VwcG9ydC9TdXBwb3J0X0dldFJlc291cmNlLmphdmEKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gbG9nZ2luZy9zcmMvdGVzdC9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlckV4dGVuc2lvbi5qYXZhCnJlbmFtZSB0byBzdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvc3VwcG9ydC9TdXBwb3J0X0dldFJlc291cmNlLmphdmEKaW5kZXggYzMxOTg0Yi4uY2VmNGY4ZSAxMDA2NDQKLS0tIGEvbG9nZ2luZy9zcmMvdGVzdC9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlckV4dGVuc2lvbi5qYXZhCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfR2V0UmVzb3VyY2UuamF2YQpAQCAtMTUsMTcgKzE1LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGphdmEudXRpbC5sb2dnaW5nOworcGFja2FnZSB0ZXN0cy5zdXBwb3J0OwogCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworcHVibGljIGNsYXNzIFN1cHBvcnRfR2V0UmVzb3VyY2UgewogCi0vKioKLSAqIEV4YW1wbGUgb2YgYSB0eXBlIGluamVjdGVkIGludG8gbG9nZ2luZyB0byBhY2Nlc3MgcGFja2FnZSBwcml2YXRlIG1lbWJlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXJFeHRlbnNpb24gewotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBsb2FkUmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkgewotICAgICAgICByZXR1cm4gTG9nZ2VyLmxvYWRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUpOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlVVJMKFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gImh0dHA6Ly8iICsgU3VwcG9ydF9Db25maWd1cmF0aW9uLlRlc3RSZXNvdXJjZXMgKyByZXNvdXJjZTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfTGlzdFRlc3QuamF2YSBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfTGlzdFRlc3QuamF2YQppbmRleCA2ZTkxNjBiLi42NDVhNTY0IDEwMDY0NAotLS0gYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvc3VwcG9ydC9TdXBwb3J0X0xpc3RUZXN0LmphdmEKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9MaXN0VGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMTQgQEAKIAogcGFja2FnZSB0ZXN0cy5zdXBwb3J0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIAorQFRlc3RUYXJnZXRDbGFzcyhMaXN0LmNsYXNzKQogcHVibGljIGNsYXNzIFN1cHBvcnRfTGlzdFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0OyAvLyBtdXN0IGNvbnRhaW4gdGhlIEludGVnZXJzIDAgdG8gOTkgaW4gb3JkZXIKZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfU2V0VGVzdC5qYXZhIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9TZXRUZXN0LmphdmEKaW5kZXggNTFhYzFjNC4uNDMyNWUxOSAxMDA2NDQKLS0tIGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9TZXRUZXN0LmphdmEKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9TZXRUZXN0LmphdmEKQEAgLTE3LDggKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuc3VwcG9ydDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU2V0LmNsYXNzKQogcHVibGljIGNsYXNzIFN1cHBvcnRfU2V0VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBTZXQ8SW50ZWdlcj4gc2V0OyAvLyBtdXN0IGNvbnRhaW4gb25seSB0aGUgSW50ZWdlcnMgMCB0byA5OQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Vbm1vZGlmaWFibGVDb2xsZWN0aW9uVGVzdC5qYXZhIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Vbm1vZGlmaWFibGVDb2xsZWN0aW9uVGVzdC5qYXZhCmluZGV4IDk2NjE5YmQuLjAxMDBjMDEgMTAwNjQ0Ci0tLSBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfVW5tb2RpZmlhYmxlQ29sbGVjdGlvblRlc3QuamF2YQorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvc3VwcG9ydC9TdXBwb3J0X1VubW9kaWZpYWJsZUNvbGxlY3Rpb25UZXN0LmphdmEKQEAgLTE3LDYgKzE3LDggQEAKIAogcGFja2FnZSB0ZXN0cy5zdXBwb3J0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpAQCAtMjQsNiArMjYsNyBAQAogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDb2xsZWN0aW9uLmNsYXNzKQogcHVibGljIGNsYXNzIFN1cHBvcnRfVW5tb2RpZmlhYmxlQ29sbGVjdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBDb2xsZWN0aW9uPEludGVnZXI+IGNvbDsKZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9zdXBwb3J0L1N1cHBvcnRfVW5tb2RpZmlhYmxlTWFwVGVzdC5qYXZhIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Vbm1vZGlmaWFibGVNYXBUZXN0LmphdmEKaW5kZXggOTY0ODA3NC4uNjQwNTcwMSAxMDA2NDQKLS0tIGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Vbm1vZGlmaWFibGVNYXBUZXN0LmphdmEKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3N1cHBvcnQvU3VwcG9ydF9Vbm1vZGlmaWFibGVNYXBUZXN0LmphdmEKQEAgLTE3LDEyICsxNywxNSBAQAogCiBwYWNrYWdlIHRlc3RzLnN1cHBvcnQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhNYXAuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU3VwcG9ydF9Vbm1vZGlmaWFibGVNYXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwOwpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Bbm5vdGF0aW9uLmphdmEgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Fubm90YXRpb24uamF2YQppbmRleCA5MjJjYmQwLi5hNDVjY2FhIDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Fubm90YXRpb24uamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Fubm90YXRpb24uamF2YQpAQCAtMTgsMjAgKzE4LDU3IEBACiBwYWNrYWdlIGphdmEudGV4dDsKIAogLyoqCi0gKiBBbm5vdGF0aW9uCisgKiBXcmFwcGVyIGZvciBhIHRleHQgYXR0cmlidXRlIHZhbHVlIHdoaWNoIHJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbi4gQW4KKyAqIGFubm90YXRpb24gaGFzIHR3byBzcGVjaWFsIGFzcGVjdHM6CisgKiA8b2w+CisgKiA8bGk+aXQgaXMgY29ubmVjdGVkIHRvIGEgcmFuZ2Ugb2YgbWFpbiB0ZXh0OyBpZiB0aGlzIHJhbmdlIG9yIHRoZSBtYWluIHRleHQKKyAqIGlzIGNoYW5nZWQgdGhlbiB0aGUgYW5ub3RhdGlvbiBiZWNvbWVzIGludmFsaWQsPC9saT4KKyAqIDxsaT5pdCBjYW4gbm90IGJlIGpvaW5lZCB3aXRoIGFkamFjZW50IGFubm90YXRpb25zIGV2ZW4gaWYgdGhlIHRleHQgYXR0cmlidXRlCisgKiB2YWx1ZSBpcyB0aGUgc2FtZS48L2xpPgorICogPC9vbD4KKyAqIDxwPgorICogQnkgd3JhcHBpbmcgdGV4dCBhdHRyaWJ1dGUgdmFsdWVzIGludG8gYW4ge0Bjb2RlIEFubm90YXRpb259LCB0aGVzZSBhc3BlY3RzCisgKiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGhhbmRsaW5nIGFubm90YXRpb24gdGV4dCBhbmQgdGhlCisgKiBjb3JyZXNwb25kaW5nIG1haW4gdGV4dC4KKyAqIDwvcD4KKyAqIDxwPgorICogTm90ZTogVGhlcmUgaXMgbm8gc2VtYW50aWMgY29ubmVjdGlvbiBiZXR3ZWVuIHRoaXMgYW5ub3RhdGlvbiBjbGFzcyBhbmQgdGhlCisgKiB7QGNvZGUgamF2YS5sYW5nLmFubm90YXRpb259IHBhY2thZ2UuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbiB7CiAKICAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFubm90YXRpb259LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSBhdHRhY2hlZCB0byB0aGlzIGFubm90YXRpb24uIFRoaXMgbWF5IGJlCisgICAgICogICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgQW5ub3RhdGlvbihPYmplY3QgYXR0cmlidXRlKSB7CiAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbi4gVGhlIHZhbHVlIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBhbm5vdGF0aW9uIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIGFubm90YXRpb24gaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFubm90YXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlt2YWx1ZT0iICsgdmFsdWUgKyAnXSc7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLmphdmEgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5qYXZhCmluZGV4IGM5NTA0ZTguLjA3YmJkZWMgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLmphdmEKKysrIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuamF2YQpAQCAtMjUsODMgKzI1LDIzOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IKKyAqIEV4dGVuZHMgdGhlCisgKiB7QGxpbmsgQ2hhcmFjdGVySXRlcmF0b3J9IGludGVyZmFjZSwgYWRkaW5nIHN1cHBvcnQgZm9yIGl0ZXJhdGluZyBvdmVyCisgKiBhdHRyaWJ1dGVzIGFuZCBub3Qgb25seSBjaGFyYWN0ZXJzLiBBbgorICoge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gZmluZCBydW5zIGFuZAorICogdGhlaXIgbGltaXRzLiBSdW5zIGFyZSBkZWZpbmVkIGFzIHJhbmdlcyBvZiBjaGFyYWN0ZXJzIHRoYXQgYWxsIGhhdmUgdGhlIHNhbWUKKyAqIGF0dHJpYnV0ZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBleHRlbmRzIENoYXJhY3Rlckl0ZXJhdG9yIHsKIAorICAgIC8qKgorICAgICAqIERlZmluZXMga2V5cyBmb3IgdGV4dCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTE0Mjc0MjQ4MzUxMzk2MDYxMkw7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgYXR0cmlidXRlIG1hcmtzIHNlZ21lbnRzIGZyb20gYW4gaW5wdXQgbWV0aG9kLiBNb3N0IGlucHV0CisgICAgICAgICAqIG1ldGhvZHMgY3JlYXRlIHRoZXNlIHNlZ21lbnRzIGZvciB3b3Jkcy4KKyAgICAgICAgICogCisgICAgICAgICAqIFRoZSB2YWx1ZSBvYmplY3RzIGFyZSBvZiB0aGUgdHlwZSB7QGNvZGUgQW5ub3RhdGlvbn0gd2hpY2ggY29udGFpbgorICAgICAgICAgKiB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlIElOUFVUX01FVEhPRF9TRUdNRU5UID0gbmV3IEF0dHJpYnV0ZSgKICAgICAgICAgICAgICAgICAiaW5wdXRfbWV0aG9kX3NlZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXR0cmlidXRlIGRlc2NyaWJpbmcgdGhlIGxhbmd1YWdlIG9mIGEgY2hhcmFjdGVyLiBUaGUgdmFsdWUKKyAgICAgICAgICogb2JqZWN0cyBhcmUgb2YgdHlwZSB7QGNvZGUgTG9jYWxlfSBvciBhIHN1YnR5cGUgb2YgaXQuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlIExBTkdVQUdFID0gbmV3IEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKTsgLy8kTk9OLU5MUy0xJAogCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgcmVhZGluZyBkaXJlY3Rpb25zIG9mIHRleHQgKGxpa2UKKyAgICAgICAgICogSmFwYW5lc2UpLCB0aGlzIGF0dHJpYnV0ZSBhbGxvd3MgdG8gZGVmaW5lIHdoaWNoIHJlYWRpbmcgc2hvdWxkIGJlCisgICAgICAgICAqIHVzZWQuIFRoZSB2YWx1ZSBvYmplY3RzIGFyZSBvZiB0eXBlIHtAY29kZSBBbm5vdGF0aW9ufSB3aGljaAorICAgICAgICAgKiBjb250YWluIGEge0Bjb2RlIFN0cmluZ30uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlIFJFQURJTkcgPSBuZXcgQXR0cmlidXRlKCJyZWFkaW5nIik7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29uc3RydWN0b3IgZm9yIGFuIHtAY29kZSBBdHRyaWJ1dGV9IHdpdGggdGhlIG5hbWUgcGFzc2VkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmV3IHtAY29kZSBBdHRyaWJ1dGV9LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGFyZXMgdGhpcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdC4gQ2hlY2tzIGlmIGJvdGgKKyAgICAgICAgICogb2JqZWN0cyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UuIEl0IGlzIGRlZmluZWQgZmluYWwgc28gYWxsIHN1YmNsYXNzZXMKKyAgICAgICAgICogaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBmb3IgdGhpcyBtZXRob2QuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvYmplY3QgcGFzc2VkIGlzIGVxdWFsIHRvIHRoaXMgaW5zdGFuY2U7CisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwgfHwgIShvYmplY3QuZ2V0Q2xhc3MoKS5lcXVhbHModGhpcy5nZXRDbGFzcygpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMoKChBdHRyaWJ1dGUpIG9iamVjdCkubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iamVjdCk7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsY3VsYXRlcyB0aGUgaGFzaCBjb2RlIGZvciBvYmplY3RzIG9mIHR5cGUge0Bjb2RlIEF0dHJpYnV0ZX0uIEl0CisgICAgICAgICAqIGlzIGRlZmluZWQgZmluYWwgc28gYWxsIHN1YiB0eXBlcyBjYWxjdWxhdGUgdGhlaXIgaGFzaCBjb2RlCisgICAgICAgICAqIGlkZW50aWNhbGx5LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIGluc3RhbmNlIG9mIHtAY29kZSBBdHRyaWJ1dGV9LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc29sdmVzIGEgZGVzZXJpYWxpemVkIGluc3RhbmNlIHRvIHRoZSBjb3JyZWN0IGNvbnN0YW50IGF0dHJpYnV0ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBBdHRyaWJ1dGV9IHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cy4KKyAgICAgICAgICogQHRocm93cyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgaW5zdGFuY2UgaXMgbm90IG9mIHR5cGUge0Bjb2RlIEF0dHJpYnV0ZS5jbGFzc30KKyAgICAgICAgICogICAgICAgICAgICAgb3IgaWYgaXQgaXMgbm90IGEga25vd24ge0Bjb2RlIEF0dHJpYnV0ZX0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmICh0aGlzLmdldENsYXNzKCkgIT0gQXR0cmlidXRlLmNsYXNzKSB7CiAgICAgICAgICAgICAgICAgLy8gdGV4dC4wQz1jYW5ub3QgcmVzb2x2ZSBzdWJjbGFzc2VzCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPYmplY3RFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJ0ZXh0LjBDIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5lcXVhbHMoSU5QVVRfTUVUSE9EX1NFR01FTlQpKSB7CisgICAgICAgICAgICBpZiAodGhpcy5uYW1lLmVxdWFscyhJTlBVVF9NRVRIT0RfU0VHTUVOVC5uYW1lKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBJTlBVVF9NRVRIT0RfU0VHTUVOVDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLmVxdWFscyhMQU5HVUFHRSkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLm5hbWUuZXF1YWxzKExBTkdVQUdFLm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIExBTkdVQUdFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMuZXF1YWxzKFJFQURJTkcpKSB7CisgICAgICAgICAgICBpZiAodGhpcy5uYW1lLmVxdWFscyhSRUFESU5HLm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFJFQURJTkc7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyB0ZXh0LjAyPVVua25vd24gYXR0cmlidXRlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9iamVjdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoInRleHQuMDIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBmb2xsb3dlZCBieSBhICIoIiwgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAqIGF0dHJpYnV0ZSwgYW5kIGEgIikiLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGluc3RhbmNlLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgJygnICsgZ2V0TmFtZSgpICsgJyknOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiBhdHRyaWJ1dGVzIHByZXNlbnQgaW4gdGhlIHtAY29kZQorICAgICAqIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0uIEFuIGVtcHR5IHNldCBpcyByZXR1cm5lZCBpZiBubyBhdHRyaWJ1dGVzCisgICAgICogd2VyZSBkZWZpbmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgYXR0cmlidXRlIGtleXM7IG1heSBiZSBlbXB0eS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgU2V0PEF0dHJpYnV0ZT4gZ2V0QWxsQXR0cmlidXRlS2V5cygpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBhdHRyaWJ1dGUgZm9yIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4gSWYKKyAgICAgKiB0aGUgYXR0cmlidXRlIHdhcyBub3QgZGVmaW5lZCB0aGVuIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgZm9yIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgZm9yIHRoZSBjdXJyZW50IGNoYXJhY3RlciBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIGl0IHdhcyBub3QgZGVmaW5lZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBtYXAgb2YgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLiBJZiBubworICAgICAqIGF0dHJpYnV0ZXMgd2VyZSBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBjaGFyYWN0ZXIgdGhlbiBhbiBlbXB0eSBtYXAgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCBjaGFyYWN0ZXIgb3IgYW4gZW1wdHkKKyAgICAgKiAgICAgICAgIG1hcC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgTWFwPEF0dHJpYnV0ZSwgT2JqZWN0PiBnZXRBdHRyaWJ1dGVzKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHJ1biBoYXZpbmcgdGhlIHNhbWUKKyAgICAgKiBhdHRyaWJ1dGVzIGFzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGN1cnJlbnQgcnVuLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UnVuTGltaXQoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgcnVuIHRoYXQgaGFzIHRoZSBzYW1lCisgICAgICogYXR0cmlidXRlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGFzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIHdoaWNoIHRoZSBydW4gaXMgYmFzZWQgb24uCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IHJ1bi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFJ1bkxpbWl0KEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBydW4gdGhhdCBoYXMgdGhlIHNhbWUKKyAgICAgKiBhdHRyaWJ1dGUgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlcyBpbiB0aGUgc2V0IGFzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcworICAgICAqICAgICAgICAgICAgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIHdoaWNoIHRoZSBydW4gaXMgYmFzZWQgb24uCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IHJ1bi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFJ1bkxpbWl0KFNldDw/IGV4dGVuZHMgQXR0cmlidXRlPiBhdHRyaWJ1dGVzKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHJ1biB0aGF0IGhhcyB0aGUgc2FtZQorICAgICAqIGF0dHJpYnV0ZXMgYXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgY3VycmVudCBydW4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGludCBnZXRSdW5TdGFydCgpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcnVuIHRoYXQgaGFzIHRoZSBzYW1lCisgICAgICogYXR0cmlidXRlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGFzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIHdoaWNoIHRoZSBydW4gaXMgYmFzZWQgb24uCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IHJ1bi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFJ1blN0YXJ0KEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcnVuIHRoYXQgaGFzIHRoZSBzYW1lCisgICAgICogYXR0cmlidXRlIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIHNldCBhcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgYXR0cmlidXRlcyB3aGljaCB0aGUgcnVuIGlzIGJhc2VkIG9uLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgY3VycmVudCBydW4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGludCBnZXRSdW5TdGFydChTZXQ8PyBleHRlbmRzIEF0dHJpYnV0ZT4gYXR0cmlidXRlcyk7CiB9CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0F0dHJpYnV0ZWRTdHJpbmcuamF2YSBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQXR0cmlidXRlZFN0cmluZy5qYXZhCmluZGV4IDZiY2Q4YTMuLjU0MGU2NzEgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQXR0cmlidXRlZFN0cmluZy5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQXR0cmlidXRlZFN0cmluZy5qYXZhCkBAIC0zMSw3ICszMSwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBBdHRyaWJ1dGVkU3RyaW5nCisgKiBIb2xkcyBhIHN0cmluZyB3aXRoIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgY2hhcmFjdGVycyBvZgorICogdGhpcyBzdHJpbmcuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQXR0cmlidXRlZFN0cmluZyB7CiAKQEAgLTg5LDExICs5MiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3Igd2l0aCB0aGUgc2FtZSBzb3VyY2UgU3RyaW5nLAotICAgICAgICAgKiBiZWdpbiwgZW5kLCBhbmQgY3VycmVudCBpbmRleCBhcyB0aGlzIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yLgorICAgICAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBBdHRyaWJ1dGVkSXRlcmF0b3J9IHdpdGggdGhlIHNhbWUgc291cmNlIHN0cmluZywKKyAgICAgICAgICogYmVnaW4sIGVuZCwgYW5kIGN1cnJlbnQgaW5kZXggYXMgdGhpcyBhdHRyaWJ1dGVkIGl0ZXJhdG9yLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yCi0gICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYXR0cmlidXRlZCBpdGVyYXRvci4KICAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKQEAgLTExMSwxMiArMTEzLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIHNvdXJjZSBTdHJpbmcuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNoYXJhY3Rlciwgb3IgRE9ORSBpZiB0aGUgY3VycmVudCBpbmRleCBpcyBwYXN0Ci0gICAgICAgICAqICAgICAgICAgdGhlIGVuZAotICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGNoYXIgY3VycmVudCgpIHsKICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gZW5kKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIERPTkU7CkBAIC0xMjQsMTIgKzEyMCw2IEBACiAgICAgICAgICAgICByZXR1cm4gYXR0clN0cmluZy50ZXh0LmNoYXJBdChvZmZzZXQpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGJlZ2luIGluZGV4IGFuZCByZXR1cm5zIHRoZQotICAgICAgICAgKiBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2luIGluZGV4LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbiBpbmRleAotICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGNoYXIgZmlyc3QoKSB7CiAgICAgICAgICAgICBpZiAoYmVnaW4gPT0gZW5kKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIERPTkU7CkBAIC0xMzksOSArMTI5LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBiZWdpbiBpbmRleCBpbiB0aGUgc291cmNlIFN0cmluZy4KKyAgICAgICAgICogUmV0dXJucyB0aGUgYmVnaW4gaW5kZXggaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGl0ZXJhdGUKKyAgICAgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0byBpdGVyYXRlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRCZWdpbkluZGV4KCkgewogICAgICAgICAgICAgcmV0dXJuIGJlZ2luOwpAQCAtMTUwLDcgKzE0MCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZXR1cm5zIHRoZSBlbmQgaW5kZXggaW4gdGhlIHNvdXJjZSBTdHJpbmcuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gaXRlcmF0ZQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gaXRlcmF0ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKSB7CiAgICAgICAgICAgICByZXR1cm4gZW5kOwpAQCAtMTU5LDcgKzE0OSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBzb3VyY2UgU3RyaW5nLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgY3VycmVudCBpbmRleAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGluZGV4LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CkBAIC0xODgsNiArMTc4LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHNldCBvZiBhdHRyaWJ1dGVzIHByZXNlbnQgaW4gdGhlIHtAY29kZSBBdHRyaWJ1dGVkU3RyaW5nfS4KKyAgICAgICAgICogQW4gZW1wdHkgc2V0IHJldHVybmVkIGluZGljYXRlcyB0aGF0IG5vIGF0dHJpYnV0ZXMgd2hlcmUgZGVmaW5lZAorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBhIHNldCBvZiBhdHRyaWJ1dGUga2V5cyB0aGF0IG1heSBiZSBlbXB0eS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTZXQ8QXR0cmlidXRlZEl0ZXJhdG9yLkF0dHJpYnV0ZT4gZ2V0QWxsQXR0cmlidXRlS2V5cygpIHsKICAgICAgICAgICAgIGlmIChiZWdpbiA9PSAwICYmIGVuZCA9PSBhdHRyU3RyaW5nLnRleHQubGVuZ3RoKCkKICAgICAgICAgICAgICAgICAgICAgJiYgYXR0cmlidXRlc0FsbG93ZWQgPT0gbnVsbCkgewpAQCAtMzUwLDEyICszNDYsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGVuZCBpbmRleCAtIDEgYW5kIHJldHVybnMgdGhlCi0gICAgICAgICAqIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGVuZCBpbmRleAotICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGNoYXIgbGFzdCgpIHsKICAgICAgICAgICAgIGlmIChiZWdpbiA9PSBlbmQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRE9ORTsKQEAgLTM2NCwxMyArMzU0LDYgQEAKICAgICAgICAgICAgIHJldHVybiBhdHRyU3RyaW5nLnRleHQuY2hhckF0KG9mZnNldCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogSW5jcmVtZW50cyB0aGUgY3VycmVudCBpbmRleCBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXcKLSAgICAgICAgICogaW5kZXguCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5leHQgaW5kZXgsIG9yIERPTkUgaWYgdGhlIG5leHQgaW5kZXggaXMKLSAgICAgICAgICogICAgICAgICBwYXN0IHRoZSBlbmQKLSAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBjaGFyIG5leHQoKSB7CiAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IChlbmQgLSAxKSkgewogICAgICAgICAgICAgICAgIG9mZnNldCA9IGVuZDsKQEAgLTM3OSwxMyArMzYyLDYgQEAKICAgICAgICAgICAgIHJldHVybiBhdHRyU3RyaW5nLnRleHQuY2hhckF0KCsrb2Zmc2V0KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZWNyZW1lbnRzIHRoZSBjdXJyZW50IGluZGV4IGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5ldwotICAgICAgICAgKiBpbmRleC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgcHJldmlvdXMgaW5kZXgsIG9yIERPTkUgaWYgdGhlIHByZXZpb3VzCi0gICAgICAgICAqICAgICAgICAgaW5kZXggaXMgcGFzdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAqLwogICAgICAgICBwdWJsaWMgY2hhciBwcmV2aW91cygpIHsKICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gYmVnaW4pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRE9ORTsKQEAgLTM5MywxNiArMzY5LDYgQEAKICAgICAgICAgICAgIHJldHVybiBhdHRyU3RyaW5nLnRleHQuY2hhckF0KC0tb2Zmc2V0KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBzb3VyY2UgU3RyaW5nLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXcgaW5kZXgsIG9yIERPTkUgaWYgdGhlIGluZGV4IGlzIHBhc3QKLSAgICAgICAgICogICAgICAgICB0aGUgZW5kCi0gICAgICAgICAqIAotICAgICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBuZXcgaW5kZXggaXMgbGVzcyB0aGFuIHRoZSBiZWdpbiBpbmRleCBvcgotICAgICAgICAgKiAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdGhlIGVuZCBpbmRleAotICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGNoYXIgc2V0SW5kZXgoaW50IGxvY2F0aW9uKSB7CiAgICAgICAgICAgICBpZiAobG9jYXRpb24gPCBiZWdpbiB8fCBsb2NhdGlvbiA+IGVuZCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTQxNSw2ICszODEsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIEF0dHJpYnV0ZWRTdHJpbmd9IGZyb20gYW4ge0Bjb2RlCisgICAgICogQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfSwgd2hpY2ggcmVwcmVzZW50cyBhdHRyaWJ1dGVkIHRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZXJhdG9yCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gdGhhdCBjb250YWlucyB0aGUgdGV4dAorICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgYXR0cmlidXRlZCBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIEF0dHJpYnV0ZWRTdHJpbmcoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdG9yKSB7CiAgICAgICAgIGlmIChpdGVyYXRvci5nZXRCZWdpbkluZGV4KCkgPiBpdGVyYXRvci5nZXRFbmRJbmRleCgpKSB7CiAgICAgICAgICAgICAvLyB0ZXh0LjBBPUludmFsaWQgc3Vic3RyaW5nIHJhbmdlCkBAIC00OTAsMTEgKzQ2NSw1MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiB7QGNvZGUgQXR0cmlidXRlZFN0cmluZ30gZnJvbSBhIHJhbmdlIG9mIHRoZSB0ZXh0IGNvbnRhaW5lZAorICAgICAqIGluIHRoZSBzcGVjaWZpZWQge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0sIHN0YXJ0aW5nIGF0IHtAY29kZQorICAgICAqIHN0YXJ0fSBhbmQgZW5kaW5nIGF0IHtAY29kZSBlbmR9LiBBbGwgYXR0cmlidXRlcyB3aWxsIGJlIGNvcGllZCB0byB0aGlzCisgICAgICogYXR0cmlidXRlZCBzdHJpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZXJhdG9yCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gdGhhdCBjb250YWlucyB0aGUgdGV4dAorICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgYXR0cmlidXRlZCBzdHJpbmcuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHJhbmdlIG9mIHRoZSBjb3BpZWQgdGV4dC4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgZW5kIGluZGV4IG9mIHRoZSByYW5nZSBvZiB0aGUgY29waWVkIHRleHQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhcnR9IGlzIGxlc3MgdGhhbiBmaXJzdCBpbmRleCBvZiAKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgaXRlcmF0b3J9LCB7QGNvZGUgZW5kfSBpcyBncmVhdGVyIHRoYW4gdGhlIGxhc3QKKyAgICAgKiAgICAgICAgICAgICBpbmRleCArIDEgaW4ge0Bjb2RlIGl0ZXJhdG9yfSBvciBpZiB7QGNvZGUgc3RhcnQgPiBlbmR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBBdHRyaWJ1dGVkU3RyaW5nKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciwgaW50IHN0YXJ0LAogICAgICAgICAgICAgaW50IGVuZCkgewogICAgICAgICB0aGlzKGl0ZXJhdG9yLCBzdGFydCwgZW5kLCBpdGVyYXRvci5nZXRBbGxBdHRyaWJ1dGVLZXlzKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4ge0Bjb2RlIEF0dHJpYnV0ZWRTdHJpbmd9IGZyb20gYSByYW5nZSBvZiB0aGUgdGV4dCBjb250YWluZWQKKyAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9LCBzdGFydGluZyBhdCB7QGNvZGUKKyAgICAgKiBzdGFydH0sIGVuZGluZyBhdCB7QGNvZGUgZW5kfSBhbmQgaXQgd2lsbCBjb3B5IHRoZSBhdHRyaWJ1dGVzIGRlZmluZWQgaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHNldC4gSWYgdGhlIHNldCBpcyB7QGNvZGUgbnVsbH0gdGhlbiBhbGwgYXR0cmlidXRlcyBhcmUKKyAgICAgKiBjb3BpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZXJhdG9yCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gdGhhdCBjb250YWlucyB0aGUgdGV4dAorICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgYXR0cmlidXRlZCBzdHJpbmcuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHJhbmdlIG9mIHRoZSBjb3BpZWQgdGV4dC4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgZW5kIGluZGV4IG9mIHRoZSByYW5nZSBvZiB0aGUgY29waWVkIHRleHQuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgY29waWVkLCBvciBhbGwgaWYgaXQgaXMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydH0gaXMgbGVzcyB0aGFuIGZpcnN0IGluZGV4IG9mIAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBpdGVyYXRvcn0sIHtAY29kZSBlbmR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGFzdCBpbmRleCArIAorICAgICAqICAgICAgICAgICAgIDEgaW4ge0Bjb2RlIGl0ZXJhdG9yfSBvciBpZiB7QGNvZGUgc3RhcnQgPiBlbmR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBBdHRyaWJ1dGVkU3RyaW5nKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciwgaW50IHN0YXJ0LAogICAgICAgICAgICAgaW50IGVuZCwgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCkBAIC01MDIsMTEgKzUxOSwxOSBAQAogICAgICAgICAvLyAgICAgICAgIC5hc0xpc3QoYXR0cmlidXRlcykpKTsKICAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCi0gICAgICAgIHRoaXMoaXRlcmF0b3IsIHN0YXJ0LCBlbmQsIChhdHRyaWJ1dGVzID09IG51bGw/IG51bGwgOiAKLSAgICAgICAgICAgIG5ldyBIYXNoU2V0PEF0dHJpYnV0ZT4oQXJyYXlzLmFzTGlzdChhdHRyaWJ1dGVzKSkpKTsKKyAgICAgICAgdGhpcyhpdGVyYXRvciwgc3RhcnQsIGVuZCwgKGF0dHJpYnV0ZXMgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gbmV3IEhhc2hTZXQ8QXR0cmlidXRlPigpCisgICAgICAgICAgICAgICAgOiBuZXcgSGFzaFNldDxBdHRyaWJ1dGU+KEFycmF5cy5hc0xpc3QoYXR0cmlidXRlcykpKSk7CiAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgQXR0cmlidXRlZFN0cmluZ30gZnJvbSB0aGUgZ2l2ZW4gdGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHRha2UgYXMgYmFzZSBmb3IgdGhpcyBhdHRyaWJ1dGVkIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgQXR0cmlidXRlZFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwpAQCAtNTE1LDYgKzU0MCwyMSBAQAogICAgICAgICBhdHRyaWJ1dGVNYXAgPSBuZXcgSGFzaE1hcDxBdHRyaWJ1dGUsIExpc3Q8UmFuZ2U+PigxMSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgQXR0cmlidXRlZFN0cmluZ30gZnJvbSB0aGUgZ2l2ZW4gdGV4dCBhbmQgdGhlCisgICAgICogYXR0cmlidXRlcy4gVGhlIHdob2xlIHRleHQgaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFwcGxpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdGV4dCB0byB0YWtlIGFzIGJhc2UgZm9yIHRoaXMgYXR0cmlidXRlZCBzdHJpbmcuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGVzIHRoYXQgdGhlIHRleHQgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGxlbmd0aCBvZiB7QGNvZGUgdmFsdWV9IGlzIDAgYnV0IHRoZSBzaXplIG9mIHtAY29kZQorICAgICAqICAgICAgICAgICAgIGF0dHJpYnV0ZXN9IGlzIGdyZWF0ZXIgdGhhbiAwLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsdWV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgQXR0cmlidXRlZFN0cmluZyhTdHJpbmcgdmFsdWUsCiAgICAgICAgICAgICBNYXA8PyBleHRlbmRzIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUsID8+IGF0dHJpYnV0ZXMpIHsKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKQEAgLTUzNyw2ICs1NzcsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBnaXZlbiBhdHRyaWJ1dGUgdG8gdGhpcyBzdHJpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGlzIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBsZW5ndGggb2YgdGhpcyBhdHRyaWJ1dGVkIHN0cmluZyBpcyAwLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYXR0cmlidXRlfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUgYXR0cmlidXRlLAogICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIGlmIChudWxsID09IGF0dHJpYnV0ZSkgewpAQCAtNTU2LDYgKzYxMCwyNSBAQAogICAgICAgICByYW5nZXMuYWRkKG5ldyBSYW5nZSgwLCB0ZXh0Lmxlbmd0aCgpLCB2YWx1ZSkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBnaXZlbiBhdHRyaWJ1dGUgdG8gdGhlIGdpdmVuIHJhbmdlIG9mIHRoaXMgc3RyaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhpcyBzdHJpbmcuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGlzCisgICAgICogICAgICAgICAgICBzdHJpbmcuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHdoZXJlIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBhcHBsaWVkLgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZXJlIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBhcHBsaWVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBlbmR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogICAgICAgICAgICAgb2YgdGhpcyBzdHJpbmcsIG9yIGlmIHtAY29kZSBzdGFydCA+PSBlbmR9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYXR0cmlidXRlfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUgYXR0cmlidXRlLAogICAgICAgICAgICAgT2JqZWN0IHZhbHVlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKG51bGwgPT0gYXR0cmlidXRlKSB7CkBAIC01NzcsMTQgKzY1MCwxNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIExpc3RJdGVyYXRvcjxSYW5nZT4gaXQgPSByYW5nZXMubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBjb3BpZWQgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgaGFybW9ueQorICAgICAgICAvLyB2YWx1ZSBjYW4ndCBiZSBudWxsCiAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIFJhbmdlIHJhbmdlID0gaXQubmV4dCgpOwogICAgICAgICAgICAgaWYgKGVuZCA8PSByYW5nZS5zdGFydCkgewogICAgICAgICAgICAgICAgIGl0LnByZXZpb3VzKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgcmFuZ2UuZW5kCi0gICAgICAgICAgICAgICAgICAgIHx8IChzdGFydCA9PSByYW5nZS5lbmQgJiYgKHZhbHVlID09IG51bGwgPyByYW5nZS52YWx1ZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5lcXVhbHMocmFuZ2UudmFsdWUpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXJ0ID09IHJhbmdlLmVuZCAmJiB2YWx1ZS5lcXVhbHMocmFuZ2UudmFsdWUpKSkgewogICAgICAgICAgICAgICAgIFJhbmdlIHIxID0gbnVsbCwgcjM7CiAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgcjEgPSBuZXcgUmFuZ2UocmFuZ2Uuc3RhcnQsIHN0YXJ0LCByYW5nZS52YWx1ZSk7CkBAIC01OTQsOCArNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBpdC5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPD0gcmFuZ2UuZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kID4gcmFuZ2Uuc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGVuZCA9PSByYW5nZS5zdGFydCAmJiAodmFsdWUgPT0gbnVsbCA/IHJhbmdlLnZhbHVlID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlLmVxdWFscyhyYW5nZS52YWx1ZSkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZW5kID09IHJhbmdlLnN0YXJ0ICYmIHZhbHVlLmVxdWFscyhyYW5nZS52YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSBuZXcgUmFuZ2UoZW5kLCByYW5nZS5lbmQsIHJhbmdlLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTYwNSw5ICs2NzksOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgPyByMS52YWx1ZSA9PSBudWxsIDogdmFsdWUuZXF1YWxzKHIxLnZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCA/IHIzLnZhbHVlID09IG51bGwgOiB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocjMudmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhyMS52YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhyMy52YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGl0LmFkZChuZXcgUmFuZ2UocjEuc3RhcnQgPCBzdGFydCA/IHIxLnN0YXJ0IDogc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIzLmVuZCA+IGVuZCA/IHIzLmVuZCA6IGVuZCwgcjEudmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTYxOCw4ICs2OTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgPyByMy52YWx1ZSA9PSBudWxsIDogdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHIzLnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHIzLnZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIxLnN0YXJ0IDwgcjEuZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuYWRkKHIxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYzOCw5ICs3MTAsMjQgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBpdC5hZGQobmV3IFJhbmdlKHN0YXJ0LCBlbmQsIHZhbHVlKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIGdpdmVuIHNldCBvZiBhdHRyaWJ1dGVzIHRvIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCisgICAgICogICAgICAgICAgICB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhpcyBzdHJpbmcuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHdoZXJlIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBhcHBsaWVkLgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZXJlIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBhcHBsaWVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBlbmR9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogICAgICAgICAgICAgb2YgdGhpcyBzdHJpbmcsIG9yIGlmIHtAY29kZSBzdGFydCA+PSBlbmR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZXMoCiAgICAgICAgICAgICBNYXA8PyBleHRlbmRzIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUsID8+IGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKQEAgLTY1MywxNSArNzQwLDUwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9IHRoYXQgZ2l2ZXMgYWNjZXNzIHRvIHRoZQorICAgICAqIGNvbXBsZXRlIGNvbnRlbnQgb2YgdGhpcyBhdHRyaWJ1dGVkIHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7CiAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlZEl0ZXJhdG9yKHRoaXMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gdGhhdCBnaXZlcyBhY2Nlc3MgdG8gdGhlCisgICAgICogY29tcGxldGUgY29udGVudCBvZiB0aGlzIGF0dHJpYnV0ZWQgc3RyaW5nLiBPbmx5IGF0dHJpYnV0ZXMgY29udGFpbmVkIGluCisgICAgICoge0Bjb2RlIGF0dHJpYnV0ZXN9IGFyZSBhdmFpbGFibGUgZnJvbSB0aGlzIGl0ZXJhdG9yIGlmIHRoZXkgYXJlIGRlZmluZWQKKyAgICAgKiBmb3IgdGhpcyB0ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgY29udGFpbmluZyBhdHRyaWJ1dGVzIHRoYXQgd2lsbCBiZSBpbiB0aGUgbmV3CisgICAgICogICAgICAgICAgICBpdGVyYXRvciBpZiB0aGV5IGFyZSBkZWZpbmVkIGZvciB0aGlzIHRleHQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB7QGNvZGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGdldEl0ZXJhdG9yKAogICAgICAgICAgICAgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVkSXRlcmF0b3IodGhpcywgYXR0cmlidXRlcywgMCwgdGV4dC5sZW5ndGgoKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiB7QGNvZGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfSB0aGF0IGdpdmVzIGFjY2VzcyB0byB0aGUKKyAgICAgKiBjb250ZW50cyBvZiB0aGlzIGF0dHJpYnV0ZWQgc3RyaW5nIHN0YXJ0aW5nIGF0IGluZGV4IHtAY29kZSBzdGFydH0gdXAgdG8KKyAgICAgKiBpbmRleCB7QGNvZGUgZW5kfS4gT25seSBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB7QGNvZGUgYXR0cmlidXRlc30gYXJlCisgICAgICogYXZhaWxhYmxlIGZyb20gdGhpcyBpdGVyYXRvciBpZiB0aGV5IGFyZSBkZWZpbmVkIGZvciB0aGlzIHRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBjb250YWluaW5nIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGluIHRoZSBuZXcKKyAgICAgKiAgICAgICAgICAgIGl0ZXJhdG9yIGlmIHRoZXkgYXJlIGRlZmluZWQgZm9yIHRoaXMgdGV4dC4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgaXRlcmF0b3Igb24gdGhlIHVuZGVybHlpbmcgdGV4dC4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgZW5kIGluZGV4IG9mIHRoZSBpdGVyYXRvciBvbiB0aGUgdW5kZXJseWluZyB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBnZXRJdGVyYXRvcigKICAgICAgICAgICAgIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzLCBpbnQgc3RhcnQsCiAgICAgICAgICAgICBpbnQgZW5kKSB7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0JpZGkuamF2YSBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQmlkaS5qYXZhCmluZGV4IDA0ZTdkZjguLjIyOGRhYjMgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQmlkaS5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQmlkaS5qYXZhCkBAIC0yNywxMSArMjcsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogQmlkaSBpcyB0aGUgY2xhc3MgcHJvdmlkaW5nIHRoZSBiaWRpcmVjdGlvbmFsIGFsZ29yaXRobS4gVGhlIGFsZ29yaXRobSBpcworICogUHJvdmlkZXMgdGhlIFVuaWNvZGUgQmlkaXJlY3Rpb25hbCBBbGdvcml0aG0uIFRoZSBhbGdvcml0aG0gaXMKICAqIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzksIHZlcnNpb24gMTMsIGFsc28gZGVzY3JpYmVkIGluIFRoZQogICogVW5pY29kZSBTdGFuZGFyZCwgVmVyc2lvbiA0LjAgLgogICogCi0gKiBVc2UgYSBCaWRpIG9iamVjdCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBwb3NpdGlvbiByZW9yZGVyaW5nIG9mIGEKKyAqIFVzZSBhIHtAY29kZSBCaWRpfSBvYmplY3QgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcG9zaXRpb24gcmVvcmRlcmluZyBvZiBhCiAgKiBiaWRpcmVjdGlvbmFsIHRleHQsIHN1Y2ggYXMgQXJhYmljIG9yIEhlYnJldy4gVGhlIG5hdHVyYWwgZGlzcGxheSBvcmRlcmluZyBvZgogICogaG9yaXpvbnRhbCB0ZXh0IGluIHRoZXNlIGxhbmd1YWdlcyBpcyBmcm9tIHJpZ2h0IHRvIGxlZnQsIHdoaWxlIHRoZXkgb3JkZXIKICAqIG51bWJlcnMgZnJvbSBsZWZ0IHRvIHJpZ2h0LgpAQCAtNDEsNTYgKzQxLDY0IEBACiAgKiBkaXJlY3Rpb24gb2YgdGhlIHRleHQgYXMgd2VsbCBhcyB0aGUgbmVzdGluZyBsZXZlbC4gTGVmdC10by1yaWdodCBydW5zIGhhdmUKICAqIGV2ZW4gbGV2ZWxzIHdoaWxlIHJpZ2h0LXRvLWxlZnQgcnVucyBoYXZlIG9kZCBsZXZlbHMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQmlkaSB7CiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgYmFzZSBsZXZlbC4gSWYgdGhlcmUgaXMgbm8gc3Ryb25nCiAgICAgICogY2hhcmFjdGVyLCB0aGVuIHNldCB0aGUgcGFyYWdyYXBoIGxldmVsIHRvIDAgKGxlZnQtdG8tcmlnaHQpLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9ERUZBVUxUX0xFRlRfVE9fUklHSFQgPSAtMjsKIAogICAgIC8qKgogICAgICAqIENvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGJhc2UgbGV2ZWwuIElmIHRoZXJlIGlzIG5vIHN0cm9uZwogICAgICAqIGNoYXJhY3RlciwgdGhlbiBzZXQgdGhlIHBhcmFncmFwaCBsZXZlbCB0byAxIChyaWdodC10by1sZWZ0KS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fREVGQVVMVF9SSUdIVF9UT19MRUZUID0gLTE7CiAKICAgICAvKioKICAgICAgKiBDb25zdGFudCB0aGF0IHNwZWNpZmllcyB0aGUgZGVmYXVsdCBiYXNlIGxldmVsIGFzIDAgKGxlZnQtdG8tcmlnaHQpLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MRUZUX1RPX1JJR0hUID0gMDsKIAogICAgIC8qKgogICAgICAqIENvbnN0YW50IHRoYXQgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IGJhc2UgbGV2ZWwgYXMgMSAocmlnaHQtdG8tbGVmdCkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQgPSAxOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmlkaSBvYmplY3QgZnJvbSB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIG9mIGEgcGFyYWdyYXBoCi0gICAgICogdGV4dC4KLSAgICAgKiAKLSAgICAgKiBUaGUgUlVOX0RJUkVDVElPTiBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB0aGUgYmFzZSBkaXJlY3Rpb24gb2YgdGhlCi0gICAgICogYmlkaXJlY3Rpb25hbCB0ZXh0LiBJZiBpdCdzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhlIGFsZ29yaXRobSB1c2VzCi0gICAgICogRElSRUNUSU9OX0RFRkFVTFRfTEVGVF9UT19SSUdIVCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIFRoZSBCSURJX0VNQkVERElORyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZiBlbWJlZGRpbmcgZm9yIGVhY2gKLSAgICAgKiBjaGFyYWN0ZXIuIFZhbHVlcyBiZXR3ZWVuIC0xIGFuZCAtNjIgZGVub3RlIG92ZXJyaWRlcyBhdCB0aGUgbGV2ZWwncwotICAgICAqIGFic29sdXRlIHZhbHVlLCB2YWx1ZXMgZnJvbSAxIHRvIDYyIGluZGljYXRlIGVtYmVkZGluZ3MsIGFuZCB0aGUgMCB2YWx1ZQotICAgICAqIGluZGljYXRlcyB0aGUgbGV2ZWwgaXMgY2FsY3VsYXRlZCBieSB0aGUgYWxnb3JpdGhtIGF1dG9tYXRpY2FsbHkuIEZvciB0aGUKLSAgICAgKiBjaGFyYWN0ZXIgd2l0aCBubyBCSURJX0VNQkVERElORyBhdHRyaWJ1dGUgb3Igd2l0aCBhIGltcHJvcGVyIGF0dHJpYnV0ZQotICAgICAqIHZhbHVlLCBzdWNoIGFzIGEgbnVsbCB2YWx1ZSwgdGhlIGFsZ29yaXRobSB0cmVhdHMgaXRzIGVtYmVkZGluZyBsZXZlbCBhcwotICAgICAqIDAuCi0gICAgICogCi0gICAgICogVGhlIE5VTUVSSUNfU0hBUElORyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBpbnN0YW5jZSBvZiBOdW1lcmljU2hhcGVyCi0gICAgICogdXNlZCB0byBjb252ZXJ0IEV1cm9wZWFuIGRpZ2l0cyB0byBvdGhlciBkZWNpbWFsIGRpZ2l0cyBiZWZvcmUgcGVyZm9ybWluZwotICAgICAqIHRoZSBiaWRpIGFsZ29yaXRobS4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIEJpZGl9IG9iamVjdCBmcm9tIHRoZSB7QGNvZGUKKyAgICAgKiBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9IG9mIGEgcGFyYWdyYXBoIHRleHQuIFRoZSBSVU5fRElSRUNUSU9OCisgICAgICogYXR0cmlidXRlIGRldGVybWluZXMgdGhlIGJhc2UgZGlyZWN0aW9uIG9mIHRoZSBiaWRpcmVjdGlvbmFsIHRleHQuIElmIGl0CisgICAgICogaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGUgYWxnb3JpdGhtIHVzZXMKKyAgICAgKiBESVJFQ1RJT05fREVGQVVMVF9MRUZUX1RPX1JJR0hUIGJ5IGRlZmF1bHQuIFRoZSBCSURJX0VNQkVERElORyBhdHRyaWJ1dGUKKyAgICAgKiBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIGVtYmVkZGluZyBmb3IgZWFjaCBjaGFyYWN0ZXIuIFZhbHVlcyBiZXR3ZWVuIC0xCisgICAgICogYW5kIC02MiBkZW5vdGUgb3ZlcnJpZGVzIGF0IHRoZSBsZXZlbCdzIGFic29sdXRlIHZhbHVlLCB2YWx1ZXMgZnJvbSAxIHRvCisgICAgICogNjIgaW5kaWNhdGUgZW1iZWRkaW5ncywgYW5kIHRoZSAwIHZhbHVlIGluZGljYXRlcyB0aGUgbGV2ZWwgaXMgY2FsY3VsYXRlZAorICAgICAqIGJ5IHRoZSBhbGdvcml0aG0gYXV0b21hdGljYWxseS4gRm9yIHRoZSBjaGFyYWN0ZXIgd2l0aCBubyBCSURJX0VNQkVERElORworICAgICAqIGF0dHJpYnV0ZSBvciB3aXRoIGEgaW1wcm9wZXIgYXR0cmlidXRlIHZhbHVlLCBzdWNoIGFzIGEge0Bjb2RlIG51bGx9CisgICAgICogdmFsdWUsIHRoZSBhbGdvcml0aG0gdHJlYXRzIGl0cyBlbWJlZGRpbmcgbGV2ZWwgYXMgMC4gVGhlIE5VTUVSSUNfU0hBUElORworICAgICAqIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGluc3RhbmNlIG9mIE51bWVyaWNTaGFwZXIgdXNlZCB0byBjb252ZXJ0CisgICAgICogRXVyb3BlYW4gZGlnaXRzIHRvIG90aGVyIGRlY2ltYWwgZGlnaXRzIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBiaWRpCisgICAgICogYWxnb3JpdGhtLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJhZ3JhcGgKLSAgICAgKgotICAgICAqIFRPRE8gTWFrZSB0aGVzZSBwcm9wZXIgbGlua3MgYWdhaW4gKHByb2JsZW0gd2l0aCBjb3JlIHZzLiBmcmFtZXdvcmspLgotICAgICAqIHNlZSBUZXh0QXR0cmlidXRlLkJJRElfRU1CRURESU5HCi0gICAgICogc2VlIFRleHRBdHRyaWJ1dGUuTlVNRVJJQ19TSEFQSU5HCi0gICAgICogc2VlIFRleHRBdHRyaWJ1dGUuUlVOX0RJUkVDVElPTgorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXJhZ3JhcGggdGV4dCB0byBwZXJmb3JtIHRoZQorICAgICAqICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBhcmFncmFwaH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzZWUgVGV4dEF0dHJpYnV0ZSNCSURJX0VNQkVERElORworICAgICAqIEBzZWUgVGV4dEF0dHJpYnV0ZSNOVU1FUklDX1NIQVBJTkcKKyAgICAgKiBAc2VlIFRleHRBdHRyaWJ1dGUjUlVOX0RJUkVDVElPTgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWRpKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBwYXJhZ3JhcGgpIHsKICAgICAgICAgaWYgKHBhcmFncmFwaCA9PSBudWxsKSB7CkBAIC0xMTIsNyArMTIwLDYgQEAKIAogICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgUlVOX0RJUkVDVElPTiBhdHRyaWJ1dGUuCiAgICAgICAgIGludCBmbGFncyA9IERJUkVDVElPTl9ERUZBVUxUX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgIAogICAgICAgICBPYmplY3QgZGlyZWN0aW9uID0gcGFyYWdyYXBoLmdldEF0dHJpYnV0ZShUZXh0QXR0cmlidXRlLlJVTl9ESVJFQ1RJT04pOwogICAgICAgICBpZiAoZGlyZWN0aW9uICE9IG51bGwgJiYgZGlyZWN0aW9uIGluc3RhbmNlb2YgQm9vbGVhbikgewogICAgICAgICAgICAgaWYgKGRpcmVjdGlvbi5lcXVhbHMoVGV4dEF0dHJpYnV0ZS5SVU5fRElSRUNUSU9OX0xUUikpIHsKQEAgLTE0NywxMiArMTU0LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBBcHBseSBOdW1lcmljU2hhcGVyIHRvIHRoZSB0ZXh0ICAKKyAgICAgICAgLy8gQXBwbHkgTnVtZXJpY1NoYXBlciB0byB0aGUgdGV4dAogICAgICAgICBPYmplY3QgbnVtZXJpY1NoYXBlciA9IHBhcmFncmFwaAogICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoVGV4dEF0dHJpYnV0ZS5OVU1FUklDX1NIQVBJTkcpOwogICAgICAgICBpZiAobnVtZXJpY1NoYXBlciAhPSBudWxsICYmIG51bWVyaWNTaGFwZXIgaW5zdGFuY2VvZiBOdW1lcmljU2hhcGVyKSB7CiAgICAgICAgICAgICAoKE51bWVyaWNTaGFwZXIpIG51bWVyaWNTaGFwZXIpLnNoYXBlKHRleHQsIDAsIGxlbmd0aCk7Ci0gICAgICAgIH0gICAgICAKKyAgICAgICAgfQogCiAgICAgICAgIGxvbmcgcEJpZGkgPSBjcmVhdGVVQmlEaSh0ZXh0LCAwLCBlbWJlZGRpbmdzLCAwLCBsZW5ndGgsIGZsYWdzKTsKICAgICAgICAgcmVhZEJpZGlJbmZvKHBCaWRpKTsKQEAgLTE2MCwzNiArMTY3LDM4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmlkaSBvYmplY3QuCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBCaWRpfSBvYmplY3QuCiAgICAgICogCiAgICAgICogQHBhcmFtIHRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IG9mIHRoZSBwYXJhZ3JhcGggdGV4dC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IG9mIHRoZSBwYXJhZ3JhcGggdGV4dCB0aGF0IGlzIHByb2Nlc3NlZC4KICAgICAgKiBAcGFyYW0gdGV4dFN0YXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0ZXh0IGFycmF5IHRvIHBlcmZvcm0gdGhlIGFsZ29yaXRobS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiB7QGNvZGUgdGV4dH0gb2YgdGhlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguCiAgICAgICogQHBhcmFtIGVtYmVkZGluZ3MKICAgICAgKiAgICAgICAgICAgIHRoZSBlbWJlZGRpbmcgbGV2ZWwgYXJyYXkgb2YgdGhlIHBhcmFncmFwaCB0ZXh0LCBzcGVjaWZ5aW5nCiAgICAgICogICAgICAgICAgICB0aGUgZW1iZWRkaW5nIGxldmVsIGluZm9ybWF0aW9uIGZvciBlYWNoIGNoYXJhY3Rlci4gVmFsdWVzCi0gICAgICogICAgICAgICAgICBiZXR3ZWVuIC0xIGFuZCAtNjIgZGVub3RlIG92ZXJyaWRlcyBhdCB0aGUgbGV2ZWwncyBhYnNvbHV0ZQotICAgICAqICAgICAgICAgICAgdmFsdWUsIHZhbHVlcyBmcm9tIDEgdG8gNjIgaW5kaWNhdGUgZW1iZWRkaW5ncywgYW5kIHRoZSAwCisgICAgICogICAgICAgICAgICBiZXR3ZWVuIC0xIGFuZCAtNjEgZGVub3RlIG92ZXJyaWRlcyBhdCB0aGUgbGV2ZWwncyBhYnNvbHV0ZQorICAgICAqICAgICAgICAgICAgdmFsdWUsIHZhbHVlcyBmcm9tIDEgdG8gNjEgaW5kaWNhdGUgZW1iZWRkaW5ncywgYW5kIHRoZSAwCiAgICAgICogICAgICAgICAgICB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxldmVsIGlzIGNhbGN1bGF0ZWQgYnkgdGhlIGFsZ29yaXRobQogICAgICAqICAgICAgICAgICAgYXV0b21hdGljYWxseS4KICAgICAgKiBAcGFyYW0gZW1iU3RhcnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGVtYmVkZGluZ3MgYXJyYXkgdG8gcGVyZm9ybSB0aGUKLSAgICAgKiAgICAgICAgICAgIGFsZ29yaXRobS4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiB7QGNvZGUgZW1iZWRkaW5nc30gb2YgdGhlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguCiAgICAgICogQHBhcmFtIHBhcmFncmFwaExlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0byBwZXJmb3JtIHRoZSBhbGdvcml0aG0uIEl0IG11c3QgYmUKLSAgICAgKiAgICAgICAgICAgIHRleHQubGVuZ3RoID49IHRleHRTdGFydCArIHBhcmFncmFwaExlbmd0aCwgYW5kCi0gICAgICogICAgICAgICAgICBlbWJlZGRpbmdzLmxlbmd0aCA+PSBlbWJTdGFydCArIHBhcmFncmFwaExlbmd0aC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdG8gcGVyZm9ybSB0aGUgYWxnb3JpdGhtLgogICAgICAqIEBwYXJhbSBmbGFncwogICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBiYXNlIGRpcmVjdGlvbiBvZiB0aGUgYmlkaXJlY3Rpb25hbCB0ZXh0LiBJdCBpcwogICAgICAqICAgICAgICAgICAgZXhwZWN0ZWQgdGhhdCB0aGlzIHdpbGwgYmUgb25lIG9mIHRoZSBkaXJlY3Rpb24gY29uc3RhbnQKICAgICAgKiAgICAgICAgICAgIHZhbHVlcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuIEFuIHVua25vd24gdmFsdWUgaXMgdHJlYXRlZCBhcwogICAgICAqICAgICAgICAgICAgRElSRUNUSU9OX0RFRkFVTFRfTEVGVF9UT19SSUdIVC4KLSAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0ZXh0U3RhcnR9LCB7QGNvZGUgZW1iU3RhcnR9LCBvciB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICBwYXJhZ3JhcGhMZW5ndGh9IGlzIG5lZ2F0aXZlOyBpZiAKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgdGV4dC5sZW5ndGggPCB0ZXh0U3RhcnQgKyBwYXJhZ3JhcGhMZW5ndGh9IG9yIAorICAgICAqICAgICAgICAgICAgIHtAY29kZSBlbWJlZGRpbmdzLmxlbmd0aCA8IGVtYlN0YXJ0ICsgcGFyYWdyYXBoTGVuZ3RofS4KICAgICAgKiBAc2VlICNESVJFQ1RJT05fTEVGVF9UT19SSUdIVAogICAgICAqIEBzZWUgI0RJUkVDVElPTl9SSUdIVF9UT19MRUZUCiAgICAgICogQHNlZSAjRElSRUNUSU9OX0RFRkFVTFRfUklHSFRfVE9fTEVGVAogICAgICAqIEBzZWUgI0RJUkVDVElPTl9ERUZBVUxUX0xFRlRfVE9fUklHSFQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQmlkaShjaGFyW10gdGV4dCwgaW50IHRleHRTdGFydCwgYnl0ZVtdIGVtYmVkZGluZ3MsIGludCBlbWJTdGFydCwKICAgICAgICAgICAgIGludCBwYXJhZ3JhcGhMZW5ndGgsIGludCBmbGFncykgewpAQCAtMjE1LDIxICsyMjQsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCaWRpIG9iamVjdC4KKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIEJpZGl9IG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyYWdyYXBoCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhcmFncmFwaCB0ZXh0IHRvIHBlcmZvcm0gdGhlCi0gICAgICogICAgICAgICAgICBhbGdvcml0aG0uCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhcmFncmFwaCB0ZXh0IHRvIHBlcmZvcm0gdGhlCisgICAgICogICAgICAgICAgICBhbGdvcml0aG0gb24uCiAgICAgICogQHBhcmFtIGZsYWdzCiAgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGJhc2UgZGlyZWN0aW9uIG9mIHRoZSBiaWRpcmVjdGlvbmFsIHRleHQuIEl0IGlzCiAgICAgICogICAgICAgICAgICBleHBlY3RlZCB0aGF0IHRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIGRpcmVjdGlvbiBjb25zdGFudAogICAgICAqICAgICAgICAgICAgdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4gQW4gdW5rbm93biB2YWx1ZSBpcyB0cmVhdGVkIGFzCiAgICAgICogICAgICAgICAgICBESVJFQ1RJT05fREVGQVVMVF9MRUZUX1RPX1JJR0hULgotICAgICAqIAogICAgICAqIEBzZWUgI0RJUkVDVElPTl9MRUZUX1RPX1JJR0hUCiAgICAgICogQHNlZSAjRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQKICAgICAgKiBAc2VlICNESVJFQ1RJT05fREVGQVVMVF9SSUdIVF9UT19MRUZUCiAgICAgICogQHNlZSAjRElSRUNUSU9OX0RFRkFVTFRfTEVGVF9UT19SSUdIVAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBCaWRpKFN0cmluZyBwYXJhZ3JhcGgsIGludCBmbGFncykgewogICAgICAgICB0aGlzKChwYXJhZ3JhcGggPT0gbnVsbCA/IG51bGwgOiBwYXJhZ3JhcGgudG9DaGFyQXJyYXkoKSksIDAsIG51bGwsIDAsCkBAIC0zMjgsMTcgKzMzNywxOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiB1bmlkaXJlY3Rpb25hbDsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBiYXNlIGxldmVsIGlzIGZyb20gbGVmdCB0byByaWdodC4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJhc2UgbGV2ZWwgaXMgZnJvbSBsZWZ0IHRvIHJpZ2h0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmFzZSBsZXZlbCBpcyBmcm9tIGxlZnQgdG8gcmlnaHQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYmFzZUlzTGVmdFRvUmlnaHQoKSB7CiAgICAgICAgIHJldHVybiBiYXNlTGV2ZWwgJSAyID09IDAgPyB0cnVlIDogZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEJpZGkgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIG9mIG9uZSBsaW5lIGZyb20gdGhpcwotICAgICAqIG9iamVjdC4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBCaWRpfSBvYmplY3QgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gb2Ygb25lIGxpbmUKKyAgICAgKiBmcm9tIHRoaXMgb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsaW5lU3RhcnQKICAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGxpbmUuCkBAIC0zNDYsNiArMzU2LDExIEBACiAgICAgICogICAgICAgICAgICB0aGUgbGltaXQgb2YgdGhlIGxpbmUuCiAgICAgICogQHJldHVybiB0aGUgbmV3IGxpbmUgQmlkaSBvYmplY3QuIEluIHRoaXMgbmV3IG9iamVjdCwgdGhlIGluZGljZXMgd2lsbAogICAgICAqICAgICAgICAgcmFuZ2UgZnJvbSAwIHRvIChsaW1pdCAtIHN0YXJ0IC0gMSkuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbGluZVN0YXJ0IDwgMH0sIHtAY29kZSBsaW5lTGltaXQgPCAwfSwge0Bjb2RlCisgICAgICogICAgICAgICAgICAgbGluZVN0YXJ0ID4gbGluZUxpbWl0fSBvciBpZiB7QGNvZGUgbGluZVN0YXJ0fSBpcyBncmVhdGVyCisgICAgICogICAgICAgICAgICAgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0J3MgcGFyYWdyYXBoIHRleHQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEJpZGkgY3JlYXRlTGluZUJpZGkoaW50IGxpbmVTdGFydCwgaW50IGxpbmVMaW1pdCkgewogICAgICAgICBpZiAobGluZVN0YXJ0IDwgMCB8fCBsaW5lTGltaXQgPCAwIHx8IGxpbmVMaW1pdCA+IGxlbmd0aApAQCAtMzc0LDI5ICszODksMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGJhc2UgbGV2ZWwuCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBsZXZlbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUgb2YgdGhlIGJhc2UgbGV2ZWwuCisgICAgICogQHJldHVybiB0aGUgYmFzZSBsZXZlbC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEJhc2VMZXZlbCgpIHsKICAgICAgICAgcmV0dXJuIGJhc2VMZXZlbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgQmlkaSBvYmplY3QuCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHRoZSB7QGNvZGUgQmlkaX0gb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgbGVuZ3RoLgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxldmVsIG9mIGEgc3BlY2lmaWVkIGNoYXJhY3Rlci4KKyAgICAgKiBSZXR1cm5zIHRoZSBsZXZlbCBvZiBhIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9mZnNldAogICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyLgotICAgICAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgbGV2ZWwuCisgICAgICogQHJldHVybiB0aGUgbGV2ZWwuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMZXZlbEF0KGludCBvZmZzZXQpIHsKICAgICAgICAgdHJ5IHsKQEAgLTQwNyw4MiArNDI1LDkyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcnVucyBpbiB0aGUgYmlkaXJlY3Rpb25hbCB0ZXh0LgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBydW5zIGluIHRoZSBiaWRpcmVjdGlvbmFsIHRleHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50IHZhbHVlIG9mIHJ1bnMsIGF0IGxlYXN0IDEuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJ1bnMsIGF0IGxlYXN0IDEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSdW5Db3VudCgpIHsKICAgICAgICAgcmV0dXJuIHVuaWRpcmVjdGlvbmFsID8gMSA6IHJ1bnMubGVuZ3RoOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbGV2ZWwgb2YgYSBzcGVjaWZpZWQgcnVuLgorICAgICAqIFJldHVybnMgdGhlIGxldmVsIG9mIHRoZSBzcGVjaWZpZWQgcnVuLgogICAgICAqIAogICAgICAqIEBwYXJhbSBydW4KICAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcnVuLgogICAgICAqIEByZXR1cm4gdGhlIGxldmVsIG9mIHRoZSBydW4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSdW5MZXZlbChpbnQgcnVuKSB7CiAgICAgICAgIHJldHVybiB1bmlkaXJlY3Rpb25hbCA/IGJhc2VMZXZlbCA6IHJ1bnNbcnVuXS5nZXRMZXZlbCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbGltaXQgb2Zmc2V0IG9mIGEgc3BlY2lmaWVkIHJ1bi4KKyAgICAgKiBSZXR1cm5zIHRoZSBsaW1pdCBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBydW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIHJ1bgogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBydW4uCiAgICAgICogQHJldHVybiB0aGUgbGltaXQgb2Zmc2V0IG9mIHRoZSBydW4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSdW5MaW1pdChpbnQgcnVuKSB7CiAgICAgICAgIHJldHVybiB1bmlkaXJlY3Rpb25hbCA/IGxlbmd0aCA6IHJ1bnNbcnVuXS5nZXRMaW1pdCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2Zmc2V0IG9mIGEgc3BlY2lmaWVkIHJ1bi4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBydW4uCiAgICAgICogCiAgICAgICogQHBhcmFtIHJ1bgogICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBydW4uCiAgICAgICogQHJldHVybiB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBydW4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSdW5TdGFydChpbnQgcnVuKSB7CiAgICAgICAgIHJldHVybiB1bmlkaXJlY3Rpb25hbCA/IDAgOiBydW5zW3J1bl0uZ2V0U3RhcnQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCBpcyBmcm9tIGxlZnQgdG8gcmlnaHQsIHRoYXQgaXMsIGJvdGggdGhlIGJhc2UKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGV4dCBpcyBmcm9tIGxlZnQgdG8gcmlnaHQsIHRoYXQgaXMsIGJvdGggdGhlIGJhc2UKICAgICAgKiBkaXJlY3Rpb24gYW5kIHRoZSB0ZXh0IGRpcmVjdGlvbiBpcyBmcm9tIGxlZnQgdG8gcmlnaHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0ZXh0IGlzIGZyb20gbGVmdCB0byByaWdodC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdGV4dCBpcyBmcm9tIGxlZnQgdG8gcmlnaHQ7IHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0xlZnRUb1JpZ2h0KCkgewogICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09IEJpZGlXcmFwcGVyLlVCaURpRGlyZWN0aW9uX1VCSURJX0xUUjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCBkaXJlY3Rpb24gaXMgbWl4ZWQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHQgZGlyZWN0aW9uIGlzIG1peGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGV4dCBkaXJlY3Rpb24gaXMgbWl4ZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRleHQgZGlyZWN0aW9uIGlzIG1peGVkOyB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNaXhlZCgpIHsKICAgICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBCaWRpV3JhcHBlci5VQmlEaURpcmVjdGlvbl9VQklESV9NSVhFRDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCBpcyBmcm9tIHJpZ2h0IHRvIGxlZnQsIHRoYXQgaXMsIGJvdGggdGhlIGJhc2UKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGV4dCBpcyBmcm9tIHJpZ2h0IHRvIGxlZnQsIHRoYXQgaXMsIGJvdGggdGhlIGJhc2UKICAgICAgKiBkaXJlY3Rpb24gYW5kIHRoZSB0ZXh0IGRpcmVjdGlvbiBpcyBmcm9tIHJpZ2h0IHRvIGxlZnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0ZXh0IGlzIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdGV4dCBpcyBmcm9tIHJpZ2h0IHRvIGxlZnQ7IHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JpZ2h0VG9MZWZ0KCkgewogICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09IEJpZGlXcmFwcGVyLlVCaURpRGlyZWN0aW9uX1VCSURJX1JUTDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW9yZGVyIGEgcmFuZ2Ugb2Ygb2JqZWN0cyBhY2NvcmRpbmcgdG8gdGhlaXIgc3BlY2lmaWVkIGxldmVscy4gVGhpcyBpcyBhCi0gICAgICogY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCB1c2UgYSBCaWRpIG9iamVjdC4gVGhlIHJhbmdlIG9mCi0gICAgICogb2JqZWN0cyBhdCBpbmRleCBmcm9tIG9iamVjdFN0YXJ0IHRvIG9iamVjdFN0YXJ0ICsgY291bnQgd2lsbCBiZQotICAgICAqIHJlb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIHJhbmdlIG9mIGxldmVscyBhdCBpbmRleCBmcm9tIGxldmVsU3RhcnQgdG8KLSAgICAgKiBsZXZlbFN0YXJ0ICsgY291bnQuCisgICAgICogUmVvcmRlcnMgYSByYW5nZSBvZiBvYmplY3RzIGFjY29yZGluZyB0byB0aGVpciBzcGVjaWZpZWQgbGV2ZWxzLiBUaGlzIGlzCisgICAgICogYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90IHVzZSBhIHtAY29kZSBCaWRpfSBvYmplY3QuIFRoZSByYW5nZQorICAgICAqIG9mIG9iamVjdHMgYXQge0Bjb2RlIGluZGV4fSBmcm9tIHtAY29kZSBvYmplY3RTdGFydH0gdG8ge0Bjb2RlCisgICAgICogb2JqZWN0U3RhcnQgKyBjb3VudH0gd2lsbCBiZSByZW9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSByYW5nZSBvZiBsZXZlbHMKKyAgICAgKiBhdCB7QGNvZGUgaW5kZXh9IGZyb20ge0Bjb2RlIGxldmVsU3RhcnR9IHRvIHtAY29kZSBsZXZlbFN0YXJ0ICsgY291bnR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsZXZlbHMKICAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBhcnJheSwgd2hpY2ggaXMgYWxyZWFkeSBkZXRlcm1pbmVkLgpAQCAtNDk0LDYgKzUyMiwxMSBAQAogICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2Ugb2Ygb2JqZWN0cy4KICAgICAgKiBAcGFyYW0gY291bnQKICAgICAgKiAgICAgICAgICAgIHRoZSBjb3VudCBvZiB0aGUgcmFuZ2Ugb2Ygb2JqZWN0cyB0byByZW9yZGVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNvdW50fSwge0Bjb2RlIGxldmVsU3RhcnR9IG9yIHtAY29kZSBvYmplY3RTdGFydH0KKyAgICAgKiAgICAgICAgICAgICBpcyBuZWdhdGl2ZTsgaWYge0Bjb2RlIGNvdW50ID4gbGV2ZWxzLmxlbmd0aCAtIGxldmVsU3RhcnR9IG9yCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNvdW50ID4gb2JqZWN0cy5sZW5ndGggLSBvYmplY3RTdGFydH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlb3JkZXJWaXN1YWxseShieXRlW10gbGV2ZWxzLCBpbnQgbGV2ZWxTdGFydCwKICAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMsIGludCBvYmplY3RTdGFydCwgaW50IGNvdW50KSB7CkBAIC01MjAsOCArNTUzLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgb2YgYSB0ZXh0IHJlcXVpcmVzIGEgQmlkaSBvYmplY3QgdG8KLSAgICAgKiBkaXNwbGF5IHByb3Blcmx5LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBvZiBhIHRleHQgcmVxdWlyZXMgYSB7QGNvZGUgQmlkaX0KKyAgICAgKiBvYmplY3QgdG8gZGlzcGxheSBwcm9wZXJseS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGV4dAogICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgb2YgdGhlIHRleHQuCkBAIC01MjksNyArNTYyLDEzIEBACiAgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZSBvZiBjaGFyYWN0ZXJzLgogICAgICAqIEBwYXJhbSBsaW1pdAogICAgICAqICAgICAgICAgICAgdGhlIGxpbWl0IG9mZnNldCBvZiB0aGUgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJhbmdlIG9mIGNoYXJhY3RlcnMgcmVxdWlyZXMgYSBCaWRpIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmFuZ2Ugb2YgY2hhcmFjdGVycyByZXF1aXJlcyBhIHtAY29kZSBCaWRpfQorICAgICAqICAgICAgICAgb2JqZWN0OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdGFydH0gb3Ige0Bjb2RlIGxpbWl0fSBpcyBuZWdhdGl2ZTsge0Bjb2RlIHN0YXJ0ID4KKyAgICAgKiAgICAgICAgICAgICBsaW1pdH0gb3Ige0Bjb2RlIGxpbWl0fSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgb2JqZWN0J3MgcGFyYWdyYXBoIHRleHQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlcXVpcmVzQmlkaShjaGFyW10gdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKICAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoOwpAQCAtNTQxLDkgKzU4MCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaW50ZXJuYWwgbWVzc2FnZSBvZiB0aGUgQmlkaSBvYmplY3QsIHVzZWQgaW4gZGVidWdnaW5nLgorICAgICAqIFJldHVybnMgdGhlIGludGVybmFsIG1lc3NhZ2Ugb2YgdGhlIHtAY29kZSBCaWRpfSBvYmplY3QsIHVzZWQgaW4KKyAgICAgKiBkZWJ1Z2dpbmcuCiAgICAgICogCiAgICAgICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBpbnRlcm5hbCBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3IuamF2YSBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQnJlYWtJdGVyYXRvci5qYXZhCmluZGV4IGYxZWIzMDMuLjc2Yjg0OGUgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQnJlYWtJdGVyYXRvci5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQnJlYWtJdGVyYXRvci5qYXZhCkBAIC0xNCwzOSArMTQsMjM1IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIFRoZSBpY3UgaW1wbGVtZW50YXRpb24gdXNlZCB3YXMgY2hhbmdlZCBmcm9tIGljdTRqIHRvIGljdTRqbmkuCisvLyBFTkQgYW5kcm9pZC1ub3RlCiAKIHBhY2thZ2UgamF2YS50ZXh0OwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbG9jYXRlIHRoZSBib3VuZGFyaWVzIG9mIHRleHQuIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLSAqIGNhbiBiZSBnb3QgYnkgc29tZSBmYWN0b3J5IG1ldGhvZHM6CisgKiBMb2NhdGVzIGJvdW5kYXJpZXMgaW4gdGV4dC4gVGhpcyBjbGFzcyBkZWZpbmVzIGEgcHJvdG9jb2wgZm9yIG9iamVjdHMgdGhhdAorICogYnJlYWsgdXAgYSBwaWVjZSBvZiBuYXR1cmFsLWxhbmd1YWdlIHRleHQgYWNjb3JkaW5nIHRvIGEgc2V0IG9mIGNyaXRlcmlhLgorICogSW5zdGFuY2VzIG9yIHN1YmNsYXNzZXMgb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IGNhbiBiZSBwcm92aWRlZCwgZm9yCisgKiBleGFtcGxlLCB0byBicmVhayBhIHBpZWNlIG9mIHRleHQgaW50byB3b3Jkcywgc2VudGVuY2VzLCBvciBsb2dpY2FsCisgKiBjaGFyYWN0ZXJzIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbnMgb2Ygc29tZSBsYW5ndWFnZSBvciBncm91cCBvZgorICogbGFuZ3VhZ2VzLiBXZSBwcm92aWRlIGZvdXIgYnVpbHQtaW4gdHlwZXMgb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9OgogICogPHVsPgotICogPGxpPgotICogPGNvZGU+Z2V0Q2hhcmFjdGVySW5zdGFuY2UoKTxjb2RlPiByZXR1cm5zIGEgQnJlYWtJdGVyYXRvciB0aGF0IGl0ZXJhdGUgdGhlIAotICogbG9naWNhbCBjaGFyYWN0ZXJzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgaG93IHRoZSBjaGFyYWN0ZXIgaXMgc3RvcmVkLiBGb3IgCi0gKiBleGFtcGxlLCBzb21lIGNoYXJhY3RlciBtYXkgYmUgc3RvcmVkIGluIG1vcmUgdGhhbiBvbmUgVW5pY29kZSBjb2RlIHBvaW50IAotICogYWNjb3JkaW5nIHRvIFVuaWNvZGUgc3BlY2lmaWNhdGlvbiwgdGhpcyBjaGFyYWN0ZXIgY2FuIGhhbmRsZSB0aGUgbG9naWNhbCAKLSAqIGNoYXJhY3RlcnMgd2l0aCBtdWx0aSBjb2RlIHBvaW50cy48L2xpPgotICogPGxpPgotICogPGNvZGU+Z2V0V29yZEluc3RhbmNlKCk8Y29kZT4gcmV0dXJucyBhIDxjb2RlPkJyZWFrSXRlcmF0b3I8L2NvZGU+IHRoYXQgCi0gKiBpdGVyYXRlIHRoZSB3b3JkLWJyZWFrcy4gVGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggd29yZChpbmNsdWRpbmcgbnVtYmVycykgCi0gKiBpcyB0cmVhdGVkIGFzIGJvdW5kYXJ5IHBvc2l0aW9uLiBXaGl0ZXNwYWNlIGFuZCBwdW5jdHVhdGlvbiBhcmUga2VwdCBzZXBhcmF0ZSAKLSAqIGZyb20gcmVhbCB3b3Jkcy48L2xpPgotICogPGxpPgotICogPGNvZGU+Z2V0U2VudGVuY2VJbnN0YW5jZSgpPC9jb2RlPiByZXR1cm5zIGEgQnJlYWtJdGVyYXRvciB0aGF0IGl0ZXJhdGUgdGhlIAotICogc2VudGVuY2UtYnJlYWtzLjwvbGk+Ci0gKiA8bGk+PGNvZGU+Z2V0TGluZUluc3RhbmNlKCk8L2NvZGU+IHJldHVybnMgYSBCcmVha0l0ZXJhdG9yIHRoYXQgaXRlcmF0ZSB0aGUgCi0gKiBsaW5lLWJyZWFrcyB3aGljaCBjYW4gYmUgdXNlZCB0byB3cmFwIGxpbmVzLiBUaGlzIGl0ZXJhdG9yIGNhbiBoYW5kbGUgd2hpdGVzcGFjZXMsIAotICogaHlwaGVucyBhbmQgcHVuY3R1YXRpb25zLiAgCisgKiA8bGk+e0BsaW5rICNnZXRTZW50ZW5jZUluc3RhbmNlKCl9IHJldHVybnMgYSB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdGhhdAorICogbG9jYXRlcyBib3VuZGFyaWVzIGJldHdlZW4gc2VudGVuY2VzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdHJpcGxlLWNsaWNrCisgKiBzZWxlY3Rpb24sIGZvciBleGFtcGxlLjwvbGk+CisgKiA8bGk+e0BsaW5rICNnZXRXb3JkSW5zdGFuY2UoKX0gcmV0dXJucyBhIHtAY29kZSBCcmVha0l0ZXJhdG9yfSB0aGF0IGxvY2F0ZXMKKyAqIGJvdW5kYXJpZXMgYmV0d2VlbiB3b3Jkcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGRvdWJsZS1jbGljayBzZWxlY3Rpb24gb3IgImZpbmQKKyAqIHdob2xlIHdvcmRzIiBzZWFyY2hlcy4gVGhpcyB0eXBlIG9mIHtAY29kZSBCcmVha0l0ZXJhdG9yfSBtYWtlcyBzdXJlIHRoZXJlIGlzCisgKiBhIGJvdW5kYXJ5IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBlYWNoIGxlZ2FsIHdvcmQgKG51bWJlcnMKKyAqIGNvdW50IGFzIHdvcmRzLCB0b28pLiBXaGl0ZXNwYWNlIGFuZCBwdW5jdHVhdGlvbiBhcmUga2VwdCBzZXBhcmF0ZSBmcm9tIHJlYWwKKyAqIHdvcmRzLjwvbGk+CisgKiA8bGk+e0Bjb2RlIGdldExpbmVJbnN0YW5jZSgpfSByZXR1cm5zIGEge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHRoYXQgbG9jYXRlcworICogcG9zaXRpb25zIHdoZXJlIGl0IGlzIGxlZ2FsIGZvciBhIHRleHQgZWRpdG9yIHRvIHdyYXAgbGluZXMuIFRoaXMgaXMgc2ltaWxhcgorICogdG8gd29yZCBicmVha2luZywgYnV0IG5vdCB0aGUgc2FtZTogcHVuY3R1YXRpb24gYW5kIHdoaXRlc3BhY2UgYXJlIGdlbmVyYWxseQorICoga2VwdCB3aXRoIHdvcmRzICh5b3UgZG9uJ3Qgd2FudCBhIGxpbmUgdG8gc3RhcnQgd2l0aCB3aGl0ZXNwYWNlLCBmb3IKKyAqIGV4YW1wbGUpLCBhbmQgc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMgY2FuIGZvcmNlIGEgcG9zaXRpb24gdG8gYmUgY29uc2lkZXJlZCBhCisgKiBsaW5lIGJyZWFrIHBvc2l0aW9uIG9yIHByZXZlbnQgYSBwb3NpdGlvbiBmcm9tIGJlaW5nIGEgbGluZSBicmVhayBwb3NpdGlvbi48L2xpPgorICogPGxpPntAY29kZSBnZXRDaGFyYWN0ZXJJbnN0YW5jZSgpfSByZXR1cm5zIGEge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHRoYXQKKyAqIGxvY2F0ZXMgYm91bmRhcmllcyBiZXR3ZWVuIGxvZ2ljYWwgY2hhcmFjdGVycy4gQmVjYXVzZSBvZiB0aGUgc3RydWN0dXJlIG9mCisgKiB0aGUgVW5pY29kZSBlbmNvZGluZywgYSBsb2dpY2FsIGNoYXJhY3RlciBtYXkgYmUgc3RvcmVkIGludGVybmFsbHkgYXMgbW9yZQorICogdGhhbiBvbmUgVW5pY29kZSBjb2RlIHBvaW50LiAoQSB3aXRoIGFuIHVtbGF1dCBtYXkgYmUgc3RvcmVkIGFzIGFuIGEgZm9sbG93ZWQKKyAqIGJ5IGEgc2VwYXJhdGUgY29tYmluaW5nIHVtbGF1dCBjaGFyYWN0ZXIsIGZvciBleGFtcGxlLCBidXQgdGhlIHVzZXIgc3RpbGwKKyAqIHRoaW5rcyBvZiBpdCBhcyBvbmUgY2hhcmFjdGVyLikgVGhpcyBpdGVyYXRvciBhbGxvd3MgdmFyaW91cyBwcm9jZXNzZXMKKyAqIChlc3BlY2lhbGx5IHRleHQgZWRpdG9ycykgdG8gdHJlYXQgYXMgY2hhcmFjdGVycyB0aGUgdW5pdHMgb2YgdGV4dCB0aGF0IGEKKyAqIHVzZXIgd291bGQgdGhpbmsgb2YgYXMgY2hhcmFjdGVycywgcmF0aGVyIHRoYW4gdGhlIHVuaXRzIG9mIHRleHQgdGhhdCB0aGUKKyAqIGNvbXB1dGVyIHNlZXMgYXMgImNoYXJhY3RlcnMiLjwvbGk+CisgKiA8L3VsPiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0ncyBpbnRlcmZhY2UgZm9sbG93cyBhbiAiaXRlcmF0b3IiIG1vZGVsIChoZW5jZQorICogdGhlIG5hbWUpLCBtZWFuaW5nIGl0IGhhcyBhIGNvbmNlcHQgb2YgYSAiY3VycmVudCBwb3NpdGlvbiIgYW5kIG1ldGhvZHMgbGlrZQorICoge0Bjb2RlIGZpcnN0KCl9LCB7QGNvZGUgbGFzdCgpfSwge0Bjb2RlIG5leHQoKX0sIGFuZCB7QGNvZGUgcHJldmlvdXMoKX0gdGhhdAorICogdXBkYXRlIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBBbGwge0Bjb2RlIEJyZWFrSXRlcmF0b3J9cyB1cGhvbGQgdGhlIGZvbGxvd2luZworICogaW52YXJpYW50czoKKyAqIDx1bD4KKyAqIDxsaT5UaGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHRleHQgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGJvdW5kYXJ5CisgKiBwb3NpdGlvbnMuPC9saT4KKyAqIDxsaT5UaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgaXRlcmF0b3IgaXMgYWx3YXlzIGEgYm91bmRhcnkgcG9zaXRpb24KKyAqIChyYW5kb20tIGFjY2VzcyBtZXRob2RzIG1vdmUgdGhlIGl0ZXJhdG9yIHRvIHRoZSBuZWFyZXN0IGJvdW5kYXJ5IHBvc2l0aW9uCisgKiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiwgbm90IDxpPnRvPC9pPiB0aGUgc3BlY2lmaWVkCisgKiBwb3NpdGlvbikuPC9saT4KKyAqIDxsaT57QGNvZGUgRE9ORX0gaXMgdXNlZCBhcyBhIGZsYWcgdG8gaW5kaWNhdGUgd2hlbiBpdGVyYXRpb24gaGFzIHN0b3BwZWQuCisgKiB7QGNvZGUgRE9ORX0gaXMgb25seSByZXR1cm5lZCB3aGVuIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHRoZSBlbmQgb2YgdGhlCisgKiB0ZXh0IGFuZCB0aGUgdXNlciBjYWxscyB7QGNvZGUgbmV4dCgpfSwgb3Igd2hlbiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyB0aGUKKyAqIGJlZ2lubmluZyBvZiB0aGUgdGV4dCBhbmQgdGhlIHVzZXIgY2FsbHMge0Bjb2RlIHByZXZpb3VzKCl9LjwvbGk+CisgKiA8bGk+QnJlYWsgcG9zaXRpb25zIGFyZSBudW1iZXJlZCBieSB0aGUgcG9zaXRpb25zIG9mIHRoZSBjaGFyYWN0ZXJzIHRoYXQKKyAqIGZvbGxvdyB0aGVtLiBUaHVzLCB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgZmlyc3QKKyAqIGNoYXJhY3RlciBpcyAwLCB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAxLCBhbmQgdGhlIHBvc2l0aW9uCisgKiBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgMSBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy48L2xpPgorICogPGxpPlRoZSBjbGllbnQgY2FuIGNoYW5nZSB0aGUgcG9zaXRpb24gb2YgYW4gaXRlcmF0b3IsIG9yIHRoZSB0ZXh0IGl0CisgKiBhbmFseXplcywgYXQgd2lsbCwgYnV0IGNhbm5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yLiBJZiB0aGUgdXNlciB3YW50cworICogZGlmZmVyZW50IGJlaGF2aW9yLCBoZSBtdXN0IGluc3RhbnRpYXRlIGEgbmV3IGl0ZXJhdG9yLjwvbGk+CiAgKiA8L3VsPgorICogPHA+CisgKiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gYWNjZXNzZXMgdGhlIHRleHQgaXQgYW5hbHl6ZXMgdGhyb3VnaCBhCisgKiB7QGxpbmsgQ2hhcmFjdGVySXRlcmF0b3J9LCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2Uge0Bjb2RlCisgKiBCcmVha0l0ZXJhdG9yfSB0byBhbmFseXplIHRleHQgaW4gYW55IHRleHQtc3RvcmFnZSB2ZWhpY2xlIHRoYXQgcHJvdmlkZXMgYQorICoge0Bjb2RlIENoYXJhY3Rlckl0ZXJhdG9yfSBpbnRlcmZhY2UuCisgKiA8L3A+CisgKiA8cD4KKyAqIDxlbT5Ob3RlOjwvZW0+IFNvbWUgdHlwZXMgb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IGNhbiB0YWtlIGEgbG9uZyB0aW1lIHRvCisgKiBjcmVhdGUsIGFuZCBpbnN0YW5jZXMgb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IGFyZSBub3QgY3VycmVudGx5IGNhY2hlZCBieQorICogdGhlIHN5c3RlbS4gRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UsIGtlZXAgaW5zdGFuY2VzIG9mIHtAY29kZSBCcmVha0l0ZXJhdG9yfQorICogYXJvdW5kIGFzIGxvbmcgYXMgaXQgbWFrZXMgc2Vuc2UuIEZvciBleGFtcGxlLCB3aGVuIHdvcmQtd3JhcHBpbmcgYSBkb2N1bWVudCwKKyAqIGRvbid0IGNyZWF0ZSBhbmQgZGVzdHJveSBhIG5ldyB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gZm9yIGVhY2ggbGluZS4gQ3JlYXRlCisgKiBvbmUgYnJlYWsgaXRlcmF0b3IgZm9yIHRoZSB3aG9sZSBkb2N1bWVudCAob3Igd2hhdGV2ZXIgc3RyZXRjaCBvZiB0ZXh0IHlvdSdyZQorICogd3JhcHBpbmcpIGFuZCB1c2UgaXQgdG8gZG8gdGhlIHdob2xlIGpvYiBvZiB3cmFwcGluZyB0aGUgdGV4dC4KKyAqIDxwPgorICogPGVtPkV4YW1wbGVzPC9lbT46CisgKiA8L3A+CisgKiA8cD4KKyAqIENyZWF0aW5nIGFuZCB1c2luZyB0ZXh0IGJvdW5kYXJpZXM6CisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KICAqIAotICogPGNvZGU+QnJlYWtJdGVyYXRvcjwvY29kZT4gdXNlcyA8Y29kZT5DaGFyYWN0ZXJJdGVyYXRvcjwvY29kZT4gdG8gcGVyZm9ybSB0aGUgCi0gKiBhbmFseXNpcywgc28gdGhhdCBhbnkgc3RvcmFnZSB3aGljaCBwcm92aWRlcyA8Y29kZT5DaGFyYWN0ZXJJdGVyYXRvcjwvY29kZT4gCi0gKiBpbnRlcmZhY2UuCisgKiA8cHJlPgorICogcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICogICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKSB7CisgKiAgICAgICAgIFN0cmluZyBzdHJpbmdUb0V4YW1pbmUgPSBhcmdzWzBdOworICogICAgICAgICAvL3ByaW50IGVhY2ggd29yZCBpbiBvcmRlcgorICogICAgICAgICBCcmVha0l0ZXJhdG9yIGJvdW5kYXJ5ID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsKKyAqICAgICAgICAgYm91bmRhcnkuc2V0VGV4dChzdHJpbmdUb0V4YW1pbmUpOworICogICAgICAgICBwcmludEVhY2hGb3J3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOworICogICAgICAgICAvL3ByaW50IGVhY2ggc2VudGVuY2UgaW4gcmV2ZXJzZSBvcmRlcgorICogICAgICAgICBib3VuZGFyeSA9IEJyZWFrSXRlcmF0b3IuZ2V0U2VudGVuY2VJbnN0YW5jZShMb2NhbGUuVVMpOworICogICAgICAgICBib3VuZGFyeS5zZXRUZXh0KHN0cmluZ1RvRXhhbWluZSk7CisgKiAgICAgICAgIHByaW50RWFjaEJhY2t3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOworICogICAgICAgICBwcmludEZpcnN0KGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOworICogICAgICAgICBwcmludExhc3QoYm91bmRhcnksIHN0cmluZ1RvRXhhbWluZSk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogUHJpbnQgZWFjaCBlbGVtZW50IGluIG9yZGVyOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFYWNoRm9yd2FyZChCcmVha0l0ZXJhdG9yIGJvdW5kYXJ5LCBTdHJpbmcgc291cmNlKSB7CisgKiAgICAgaW50IHN0YXJ0ID0gYm91bmRhcnkuZmlyc3QoKTsKKyAqICAgICBmb3IgKGludCBlbmQgPSBib3VuZGFyeS5uZXh0KCk7IGVuZCAhPSBCcmVha0l0ZXJhdG9yLkRPTkU7IHN0YXJ0ID0gZW5kLCBlbmQgPSBib3VuZGFyeS5uZXh0KCkpIHsKKyAqICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOworICogICAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIFByaW50IGVhY2ggZWxlbWVudCBpbiByZXZlcnNlIG9yZGVyOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFYWNoQmFja3dhcmQoQnJlYWtJdGVyYXRvciBib3VuZGFyeSwgU3RyaW5nIHNvdXJjZSkgeworICogICAgIGludCBlbmQgPSBib3VuZGFyeS5sYXN0KCk7CisgKiAgICAgZm9yIChpbnQgc3RhcnQgPSBib3VuZGFyeS5wcmV2aW91cygpOyBzdGFydCAhPSBCcmVha0l0ZXJhdG9yLkRPTkU7IGVuZCA9IHN0YXJ0LCBzdGFydCA9IGJvdW5kYXJ5CisgKiAgICAgICAgICAgICAucHJldmlvdXMoKSkgeworICogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogUHJpbnQgdGhlIGZpcnN0IGVsZW1lbnQ6CisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEZpcnN0KEJyZWFrSXRlcmF0b3IgYm91bmRhcnksIFN0cmluZyBzb3VyY2UpIHsKKyAqICAgICBpbnQgc3RhcnQgPSBib3VuZGFyeS5maXJzdCgpOworICogICAgIGludCBlbmQgPSBib3VuZGFyeS5uZXh0KCk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOworICogfQorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogUHJpbnQgdGhlIGxhc3QgZWxlbWVudDoKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogcHVibGljIHN0YXRpYyB2b2lkIHByaW50TGFzdChCcmVha0l0ZXJhdG9yIGJvdW5kYXJ5LCBTdHJpbmcgc291cmNlKSB7CisgKiAgICAgaW50IGVuZCA9IGJvdW5kYXJ5Lmxhc3QoKTsKKyAqICAgICBpbnQgc3RhcnQgPSBib3VuZGFyeS5wcmV2aW91cygpOworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKKyAqIH0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIFByaW50IHRoZSBlbGVtZW50IGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRBdChCcmVha0l0ZXJhdG9yIGJvdW5kYXJ5LCBpbnQgcG9zLCBTdHJpbmcgc291cmNlKSB7CisgKiAgICAgaW50IGVuZCA9IGJvdW5kYXJ5LmZvbGxvd2luZyhwb3MpOworICogICAgIGludCBzdGFydCA9IGJvdW5kYXJ5LnByZXZpb3VzKCk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOworICogfQorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogRmluZCB0aGUgbmV4dCB3b3JkOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBwdWJsaWMgc3RhdGljIGludCBuZXh0V29yZFN0YXJ0QWZ0ZXIoaW50IHBvcywgU3RyaW5nIHRleHQpIHsKKyAqICAgICBCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsKKyAqICAgICB3Yi5zZXRUZXh0KHRleHQpOworICogICAgIGludCBsYXN0ID0gd2IuZm9sbG93aW5nKHBvcyk7CisgKiAgICAgaW50IGN1cnJlbnQgPSB3Yi5uZXh0KCk7CisgKiAgICAgd2hpbGUgKGN1cnJlbnQgIT0gQnJlYWtJdGVyYXRvci5ET05FKSB7CisgKiAgICAgICAgIGZvciAoaW50IHAgPSBsYXN0OyBwICZsdDsgY3VycmVudDsgcCsrKSB7CisgKiAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKHRleHQuY2hhckF0KHApKSkKKyAqICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKKyAqICAgICAgICAgfQorICogICAgICAgICBsYXN0ID0gY3VycmVudDsKKyAqICAgICAgICAgY3VycmVudCA9IHdiLm5leHQoKTsKKyAqICAgICB9CisgKiAgICAgcmV0dXJuIEJyZWFrSXRlcmF0b3IuRE9ORTsKKyAqIH0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIFRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB7QGNvZGUgQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKX0gaXMgdW5pcXVlIGluCisgKiB0aGF0IHRoZSBicmVhayBwb3NpdGlvbnMgaXQgcmV0dXJucyBkb24ndCByZXByZXNlbnQgYm90aCB0aGUgc3RhcnQgYW5kIGVuZCBvZgorICogdGhlIHRoaW5nIGJlaW5nIGl0ZXJhdGVkIG92ZXIuIFRoYXQgaXMsIGEgc2VudGVuY2UtYnJlYWsgaXRlcmF0b3IgcmV0dXJucworICogYnJlYWtzIHRoYXQgZWFjaCByZXByZXNlbnQgdGhlIGVuZCBvZiBvbmUgc2VudGVuY2UgYW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBuZXh0LiBXaXRoIHRoZSB3b3JkLWJyZWFrIGl0ZXJhdG9yLCB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIHR3byBib3VuZGFyaWVzCisgKiBtaWdodCBiZSBhIHdvcmQsIG9yIHRoZXkgbWlnaHQgYmUgdGhlIHB1bmN0dWF0aW9uIG9yIHdoaXRlc3BhY2UgYmV0d2VlbiB0d28KKyAqIHdvcmRzLiBUaGUgYWJvdmUgY29kZSB1c2VzIGEgc2ltcGxlIGhldXJpc3RpYyB0byBkZXRlcm1pbmUgd2hpY2ggYm91bmRhcnkgaXMKKyAqIHRoZSBiZWdpbm5pbmcgb2YgYSB3b3JkOiBJZiB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIHRoaXMgYm91bmRhcnkgYW5kIHRoZSBuZXh0CisgKiBib3VuZGFyeSBpbmNsdWRlIGF0IGxlYXN0IG9uZSBsZXR0ZXIgKHRoaXMgY2FuIGJlIGFuIGFscGhhYmV0aWNhbCBsZXR0ZXIsIGEKKyAqIENKSyBpZGVvZ3JhcGgsIGEgSGFuZ3VsIHN5bGxhYmxlLCBhIEthbmEgY2hhcmFjdGVyLCBldGMuKSwgdGhlbiB0aGUgdGV4dAorICogYmV0d2VlbiB0aGlzIGJvdW5kYXJ5IGFuZCB0aGUgbmV4dCBpcyBhIHdvcmQ7IG90aGVyd2lzZSwgaXQncyB0aGUgbWF0ZXJpYWwKKyAqIGJldHdlZW4gd29yZHMuKQorICogPC9wPgogICogCiAgKiBAc2VlIENoYXJhY3Rlckl0ZXJhdG9yCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEJyZWFrSXRlcmF0b3IgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCkBAIC01Niw4ICsyNTIsMTAgQEAKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwogICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RhbnQgaXMgcmV0dXJuZWQgYnkgaXRlcmF0ZSBtZXRob2RzIGxpa2UgcHJldmlvdXMoKSBvciBuZXh0KCkgaWYKLSAgICAgKiB0aGV5IGhhdmUgcmV0dXJuZWQgYWxsIHZhbGlkIGJvdW5kYXJpZXMuCisgICAgICogVGhpcyBjb25zdGFudCBpcyByZXR1cm5lZCBieSBpdGVyYXRlIG1ldGhvZHMgbGlrZSB7QGNvZGUgcHJldmlvdXMoKX0gb3IKKyAgICAgKiB7QGNvZGUgbmV4dCgpfSBpZiB0aGV5IGhhdmUgcmV0dXJuZWQgYWxsIHZhbGlkIGJvdW5kYXJpZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9ORSA9IC0xOwogCkBAIC04MSw3ICsyNzksOSBAQAogICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwganVzdCBmb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcy4KKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBqdXN0IGZvciBpbnZvY2F0aW9uIGJ5IGEgc3ViY2xhc3MuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEJyZWFrSXRlcmF0b3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC0xMDAsMjAgKzMwMCwyMSBAQAogICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCBzdXBwb3J0ZWQgbG9jYWxlcy4KKyAgICAgKiBSZXR1cm5zIGFsbCBzdXBwb3J0ZWQgbG9jYWxlcyBpbiBhbiBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFsbCBzdXBwb3J0ZWQgbG9jYWxlcworICAgICAqIEByZXR1cm4gYWxsIHN1cHBvcnRlZCBsb2NhbGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxlW10gZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHsKICAgICAgICAgcmV0dXJuIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkJyZWFrSXRlcmF0b3IuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBCcmVha0l0ZXJhdG9yIHVzZWQgdG8gaXRlcmF0ZSBjaGFyYWN0ZXJzIHVzaW5nCi0gICAgICogZGVmYXVsdCBsb2NhbGUuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdG8gaXRlcmF0ZSBvdmVyCisgICAgICogY2hhcmFjdGVycyB1c2luZyB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBCcmVha0l0ZXJhdG9yIHVzZWQgdG8gaXRlcmF0ZSBjaGFyYWN0ZXJzIHVzaW5nCi0gICAgICogICAgICAgICBkZWZhdWx0IGxvY2FsZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBCcmVha0l0ZXJhdG9yfSB1c2luZyB0aGUgZGVmYXVsdCBsb2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCcmVha0l0ZXJhdG9yIGdldENoYXJhY3Rlckluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IoY29tLmlibS5pY3U0am5pLnRleHQuQnJlYWtJdGVyYXRvcgpAQCAtMTIxLDEzICszMjIsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgY2hhcmFjdGVycyB1c2luZwotICAgICAqIGdpdmVuIGxvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBCcmVha0l0ZXJhdG9yfSB0byBpdGVyYXRlIG92ZXIKKyAgICAgKiBjaGFyYWN0ZXJzIHVzaW5nIHRoZSBnaXZlbiBsb2NhbGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHdoZXJlCi0gICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9jYWxlCi0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBCcmVha0l0ZXJhdG9yIHVzZWQgdG8gaXRlcmF0ZSBjaGFyYWN0ZXJzIHVzaW5nCi0gICAgICogICAgICAgICBnaXZlbiBsb2NhbGUuCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHVzaW5nIHRoZSBnaXZlbiBsb2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCcmVha0l0ZXJhdG9yIGdldENoYXJhY3Rlckluc3RhbmNlKExvY2FsZSB3aGVyZSkgewogICAgICAgICBpZiAod2hlcmUgPT0gbnVsbCkgewpAQCAtMTM5LDExICszNDAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgbGluZS1icmVha3MgdXNpbmcKLSAgICAgKiBkZWZhdWx0IGxvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHt7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdG8gaXRlcmF0ZSBvdmVyCisgICAgICogbGluZSBicmVha3MgdXNpbmcgdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgbGluZS1icmVha3MgdXNpbmcKLSAgICAgKiAgICAgICAgIGRlZmF1bHQgbG9jYWxlLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHVzaW5nIHRoZSBkZWZhdWx0IGxvY2FsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJyZWFrSXRlcmF0b3IgZ2V0TGluZUluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IoY29tLmlibS5pY3U0am5pLnRleHQuQnJlYWtJdGVyYXRvcgpAQCAtMTUxLDEzICszNTIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgbGluZS1icmVha3MgdXNpbmcKLSAgICAgKiBnaXZlbiBsb2NhbGUuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdG8gaXRlcmF0ZSBvdmVyCisgICAgICogbGluZSBicmVha3MgdXNpbmcgdGhlIGdpdmVuIGxvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gd2hlcmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBsb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIEJyZWFrSXRlcmF0b3IgdXNlZCB0byBpdGVyYXRlIGxpbmUtYnJlYWtzIHVzaW5nCi0gICAgICogICAgICAgICBnaXZlbiBsb2NhbGUuCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHVzaW5nIHRoZSBnaXZlbiBsb2NhbGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgd2hlcmV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJyZWFrSXRlcmF0b3IgZ2V0TGluZUluc3RhbmNlKExvY2FsZSB3aGVyZSkgewogICAgICAgICBpZiAod2hlcmUgPT0gbnVsbCkgewpAQCAtMTY5LDExICszNzEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgc2VudGVuY2UtYnJlYWtzCi0gICAgICogdXNpbmcgZGVmYXVsdCBsb2NhbGUuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdG8gaXRlcmF0ZSBvdmVyCisgICAgICogc2VudGVuY2UtYnJlYWtzIHVzaW5nIHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIEJyZWFrSXRlcmF0b3IgdXNlZCB0byBpdGVyYXRlIHNlbnRlbmNlLWJyZWFrcwotICAgICAqICAgICAgICAgdXNpbmcgZGVmYXVsdCBsb2NhbGUuCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdXNpbmcgdGhlIGRlZmF1bHQgbG9jYWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnJlYWtJdGVyYXRvciBnZXRTZW50ZW5jZUluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IoY29tLmlibS5pY3U0am5pLnRleHQuQnJlYWtJdGVyYXRvcgpAQCAtMTgxLDEzICszODMsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgc2VudGVuY2UtYnJlYWtzCi0gICAgICogdXNpbmcgZ2l2ZW4gbG9jYWxlLgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHRvIGl0ZXJhdGUgb3ZlcgorICAgICAqIHNlbnRlbmNlLWJyZWFrcyB1c2luZyB0aGUgZ2l2ZW4gbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB3aGVyZQotICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIGxvY2FsZQotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgc2VudGVuY2UtYnJlYWtzCi0gICAgICogICAgICAgICB1c2luZyBnaXZlbiBsb2NhbGUuCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHVzaW5nIHRoZSBnaXZlbiBsb2NhbGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgd2hlcmV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJyZWFrSXRlcmF0b3IgZ2V0U2VudGVuY2VJbnN0YW5jZShMb2NhbGUgd2hlcmUpIHsKICAgICAgICAgaWYgKHdoZXJlID09IG51bGwpIHsKQEAgLTE5OSwxMSArNDAyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIEJyZWFrSXRlcmF0b3IgdXNlZCB0byBpdGVyYXRlIHdvcmQtYnJlYWtzIHVzaW5nCi0gICAgICogZGVmYXVsdCBsb2NhbGUuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdG8gaXRlcmF0ZSBvdmVyCisgICAgICogd29yZC1icmVha3MgdXNpbmcgdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgd29yZC1icmVha3MgdXNpbmcKLSAgICAgKiAgICAgICAgIGRlZmF1bHQgbG9jYWxlLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHVzaW5nIHRoZSBkZWZhdWx0IGxvY2FsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJyZWFrSXRlcmF0b3IgZ2V0V29yZEluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IoY29tLmlibS5pY3U0am5pLnRleHQuQnJlYWtJdGVyYXRvcgpAQCAtMjExLDEzICs0MTQsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQnJlYWtJdGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgd29yZC1icmVha3MgdXNpbmcKLSAgICAgKiBnaXZlbiBsb2NhbGUuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQnJlYWtJdGVyYXRvcn0gdG8gaXRlcmF0ZSBvdmVyCisgICAgICogd29yZC1icmVha3MgdXNpbmcgdGhlIGdpdmVuIGxvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gd2hlcmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBsb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIEJyZWFrSXRlcmF0b3IgdXNlZCB0byBpdGVyYXRlIHdvcmQtYnJlYWtzIHVzaW5nCi0gICAgICogICAgICAgICBnaXZlbiBsb2NhbGUuCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIEJyZWFrSXRlcmF0b3J9IHVzaW5nIHRoZSBnaXZlbiBsb2NhbGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgd2hlcmV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJyZWFrSXRlcmF0b3IgZ2V0V29yZEluc3RhbmNlKExvY2FsZSB3aGVyZSkgewogICAgICAgICBpZiAod2hlcmUgPT0gbnVsbCkgewpAQCAtMjI5LDQyICs0MzMsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGEgYm91bmRhcnkgcG9zaXRpb24uIElmIHRoaXMgbWV0aG9kCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIG9mZnNldCBpcyBhIGJvdW5kYXJ5IHBvc2l0aW9uLiBJZiB0aGlzIG1ldGhvZAogICAgICAqIHJldHVybnMgdHJ1ZSwgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIHBvc2l0aW9uIGlzIHNldCB0byB0aGUgZ2l2ZW4KICAgICAgKiBwb3NpdGlvbjsgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBwb3NpdGlvbgotICAgICAqIGlzIHNldCBhcyB0aG91Z2ggZm9sbG93aW5nKCkgaGFkIGJlZW4gY2FsbGVkLgorICAgICAqIGlzIHNldCBhcyB0aG91Z2gge0BsaW5rICNmb2xsb3dpbmcoaW50KX0gaGFkIGJlZW4gY2FsbGVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBvZmZzZXQgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG9mZnNldCBpcyBhIGJvdW5kYXJ5IHBvc2l0aW9uCisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBvZmZzZXQgaXMgYSBib3VuZGFyeSBwb3NpdGlvbjsge0Bjb2RlCisgICAgICogICAgICAgICBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQm91bmRhcnkoaW50IG9mZnNldCkgewogICAgICAgICByZXR1cm4gd3JhcHBlZC5pc0JvdW5kYXJ5KG9mZnNldCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBsYXN0IGJvdW5kYXJ5IHByZWNlZGUgdGhlIGdpdmVuIG9mZnNldCwgYW5kIHNldAotICAgICAqIGN1cnJlbnQgcG9zaXRpb24gdG8gcmV0dXJuZWQgdmFsdWUsIG9yIDxjb2RlPkRPTkU8L2NvZGU+IGlmIHRoZSBnaXZlbgotICAgICAqIG9mZnNldCBzcGVjaWZpZXMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24gaWYgZ2l2ZW4gb2Zmc2V0IGlzCi0gICAgICogaW52YWxpZC4KLSAgICAgKiA8L3A+CisgICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgbGFzdCBib3VuZGFyeSBwcmVjZWRpbmcgdGhlIGdpdmVuIG9mZnNldCwgYW5kCisgICAgICogc2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgcmV0dXJuZWQgdmFsdWUsIG9yIHtAY29kZSBET05FfSBpZiB0aGUKKyAgICAgKiBnaXZlbiBvZmZzZXQgc3BlY2lmaWVzIHRoZSBzdGFydGluZyBwb3NpdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gc3RhcnQgcG9zaXRpb24gdG8gYmUgc2VhcmNoZWQgZm9yCi0gICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgbGFzdCBib3VuZGFyeSBwcmVjZWRlIHRoZSBnaXZlbiBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBnaXZlbiBzdGFydCBwb3NpdGlvbiB0byBiZSBzZWFyY2hlZCBmb3IuCisgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgYm91bmRhcnkgcHJlY2VkaW5nIHRoZSBnaXZlbiBvZmZzZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBwcmVjZWRpbmcoaW50IG9mZnNldCkgewogICAgICAgICByZXR1cm4gd3JhcHBlZC5wcmVjZWRpbmcob2Zmc2V0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIG5ldyB0ZXh0IHN0cmluZyB0byBiZSBhbmFseXplZCwgdGhlIGN1cnJlbnQgcG9zaXRpb24gd2lsbCBiZQotICAgICAqIHJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGlzIG5ldyBzdHJpbmcsIGFuZCB0aGUgb2xkIHN0cmluZyB3aWxsIGxvc3QuCisgICAgICogU2V0cyB0aGUgbmV3IHRleHQgc3RyaW5nIHRvIGJlIGFuYWx5emVkLCB0aGUgY3VycmVudCBwb3NpdGlvbiB3aWxsIGJlCisgICAgICogcmVzZXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIG5ldyBzdHJpbmcsIGFuZCB0aGUgb2xkIHN0cmluZyB3aWxsIGJlCisgICAgICogbG9zdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3VGV4dAotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0ZXh0IHN0cmluZyB0byBiZSBhbmFseXplZAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0ZXh0IHN0cmluZyB0byBiZSBhbmFseXplZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7CiAgICAgICAgIHdyYXBwZWQuc2V0VGV4dChuZXdUZXh0KTsKQEAgLTI3Niw5MiArNDgxLDk3IEBACiAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhpcyBpdGVyYXRvcidzIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogUmV0dXJucyB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgaXRlcmF0b3IncyBjdXJyZW50IHBvc2l0aW9uCisgICAgICogQHJldHVybiB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGN1cnJlbnQoKTsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgZmlyc3QgYm91bmRhcnksIGFuZCByZXR1cm4KLSAgICAgKiB0aGlzIHBvc2l0aW9uLgorICAgICAqIFNldHMgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGZpcnN0IGJvdW5kYXJ5IGFuZCByZXR1cm5zCisgICAgICogdGhhdCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBmaXJzdCBib3VuZGFyeQorICAgICAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBib3VuZGFyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGZpcnN0KCk7CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBib3VuZGFyeSBmb2xsb3dpbmcgdGhlIGdpdmVuIG9mZnNldCwgYW5kCi0gICAgICogcmV0dXJuIHRoaXMgcG9zaXRpb24uIElmIHRoZXJlIGlzIG5vIGJvdW5kYXJ5IGFmdGVyIHRoZSBnaXZlbiBvZmZzZXQsCi0gICAgICogcmV0dXJuIERPTkUuCi0gICAgICogPHA+Ci0gICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93biBpZiBnaXZlbiBvZmZzZXQgaXMKLSAgICAgKiBpbnZhbGlkLgotICAgICAqIDwvcD4KKyAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYm91bmRhcnkgdG8gdGhlIG9uZSBmb2xsb3dpbmcgdGhlIGdpdmVuCisgICAgICogb2Zmc2V0IGFuZCByZXR1cm5zIHRoaXMgcG9zaXRpb24uIFJldHVybnMge0Bjb2RlIERPTkV9IGlmIHRoZXJlIGlzIG5vCisgICAgICogYm91bmRhcnkgYWZ0ZXIgdGhlIGdpdmVuIG9mZnNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gcG9zaXRpb24gdG8gYmUgc2VhcmNoZWQgZm9yCi0gICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJvdW5kYXJ5IGZvbGxvd2luZyB0aGUgZ2l2ZW4gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gcG9zaXRpb24gdG8gYmUgc2VhcmNoZWQgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBib3VuZGFyeSBmb2xsb3dpbmcgdGhlIGdpdmVuIG9mZnNldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGZvbGxvd2luZyhpbnQgb2Zmc2V0KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybiBhIDxjb2RlPkNoYXJhY3Rlckl0ZXJhdG9yPC9jb2RlPiB3aGljaCByZXByZXNlbnRzIHRoZSB0ZXh0IGJlaW5nCisgICAgICogUmV0dXJucyBhIHtAY29kZSBDaGFyYWN0ZXJJdGVyYXRvcn0gd2hpY2ggcmVwcmVzZW50cyB0aGUgdGV4dCBiZWluZwogICAgICAqIGFuYWx5emVkLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBwcm9iYWJseSB0aGUgaW50ZXJuYWwKLSAgICAgKiBpdGVyYXRvciB1c2VkIGJ5IHRoaXMgb2JqZWN0LCBzbyB0aGF0IGlmIHRoZSBpbnZva2VyIHdhbnQgdG8gbW9kaWZ5IHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgcmV0dXJuZWQgaXRlcmF0b3IsIGEgY2xvbmUgb3BlcmF0aW9uIGF0IGZpcnN0IGlzCi0gICAgICogcmVjb21tZW5kZWQuCisgICAgICogaXRlcmF0b3IgdXNlZCBieSB0aGlzIG9iamVjdC4gSWYgdGhlIGludm9rZXIgd2FudHMgdG8gbW9kaWZ5IHRoZSBzdGF0dXMKKyAgICAgKiBvZiB0aGUgcmV0dXJuZWQgaXRlcmF0b3IsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGZpcnN0IGNyZWF0ZSBhIGNsb25lIG9mCisgICAgICogdGhlIGl0ZXJhdG9yIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSA8Y29kZT5DaGFyYWN0ZXJJdGVyYXRvcjwvY29kZT4gd2hpY2ggcmVwcmVzZW50cyB0aGUgdGV4dAotICAgICAqICAgICAgICAgYmVpbmcgYW5hbHl6ZWQuCisgICAgICogQHJldHVybiBhIHtAY29kZSBDaGFyYWN0ZXJJdGVyYXRvcn0gd2hpY2ggcmVwcmVzZW50cyB0aGUgdGV4dCBiZWluZworICAgICAqICAgICAgICAgYW5hbHl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENoYXJhY3Rlckl0ZXJhdG9yIGdldFRleHQoKTsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbGFzdCBib3VuZGFyeSwgYW5kIHJldHVybgotICAgICAqIHRoaXMgcG9zaXRpb24uCisgICAgICogU2V0cyB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbGFzdCBib3VuZGFyeSBhbmQgcmV0dXJucworICAgICAqIHRoYXQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgbGFzdCBib3VuZGFyeQorICAgICAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIGxhc3QgYm91bmRhcnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBsYXN0KCk7CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgYm91bmRhcnkgYWZ0ZXIgY3VycmVudAotICAgICAqIHBvc2l0aW9uLCBhbmQgcmV0dXJuIHRoaXMgcG9zaXRpb24uIFJldHVybiA8Y29kZT5ET05FPC9jb2RlPiBpZiBubwotICAgICAqIGJvdW5kYXJ5IGZvdW5kIGFmdGVyIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogU2V0cyB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCBib3VuZGFyeSBhZnRlciB0aGUKKyAgICAgKiBjdXJyZW50IHBvc2l0aW9uLCBhbmQgcmV0dXJucyB0aGlzIHBvc2l0aW9uLiBSZXR1cm5zIHtAY29kZSBET05FfSBpZiBubworICAgICAqIGJvdW5kYXJ5IHdhcyBmb3VuZCBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBsYXN0IGJvdW5kYXJ5CisgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgbGFzdCBib3VuZGFyeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IG5leHQoKTsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCBib3VuZGFyeSBhZnRlciB0aGUgZ2l2ZW4KLSAgICAgKiBwb3NpdGlvbiwgYW5kIHJldHVybiB0aGlzIHBvc2l0aW9uLiBSZXR1cm4gPGNvZGU+RE9ORTwvY29kZT4gaWYgbm8KLSAgICAgKiBib3VuZGFyeSBmb3VuZCBhZnRlciB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgICAgICogU2V0cyB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCBib3VuZGFyeSBhZnRlciB0aGUKKyAgICAgKiBnaXZlbiBwb3NpdGlvbiwgYW5kIHJldHVybnMgdGhhdCBwb3NpdGlvbi4gUmV0dXJucyB7QGNvZGUgRE9ORX0gaWYgbm8KKyAgICAgKiBib3VuZGFyeSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGdpdmVuIHBvc2l0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBuCiAgICAgICogICAgICAgICAgICB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0gICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgbGFzdCBib3VuZGFyeQorICAgICAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIGxhc3QgYm91bmRhcnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBuZXh0KGludCBuKTsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgYm91bmRhcnkgYmVmb3JlCi0gICAgICogY3VycmVudCBwb3NpdGlvbiwgYW5kIHJldHVybiB0aGlzIHBvc2l0aW9uLiBSZXR1cm4gPGNvZGU+RE9ORTwvY29kZT4gaWYKLSAgICAgKiBubyBib3VuZGFyeSBmb3VuZCBiZWZvcmUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBTZXRzIHRoaXMgaXRlcmF0b3IncyBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyBib3VuZGFyeSBiZWZvcmUgdGhlCisgICAgICogY3VycmVudCBwb3NpdGlvbiBhbmQgcmV0dXJucyB0aGF0IHBvc2l0aW9uLiBSZXR1cm5zIHtAY29kZSBET05FfSBpZgorICAgICAqIG5vIGJvdW5kYXJ5IHdhcyBmb3VuZCBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgbGFzdCBib3VuZGFyeQorICAgICAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIGxhc3QgYm91bmRhcnkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBwcmV2aW91cygpOwogCiAgICAgLyoqCi0gICAgICogU2V0IG5ldyB0ZXh0IHRvIGJlIGFuYWx5emVkIGJ5IGdpdmVuIDxjb2RlPkNoYXJhY3Rlckl0ZXJhdG9yPC9jb2RlPi4KKyAgICAgKiBTZXRzIHRoZSBuZXcgdGV4dCB0byBiZSBhbmFseXplZCBieSB0aGUgZ2l2ZW4ge0Bjb2RlIENoYXJhY3Rlckl0ZXJhdG9yfS4KICAgICAgKiBUaGUgcG9zaXRpb24gd2lsbCBiZSByZXNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgdGV4dCwgYW5kIG90aGVyCi0gICAgICogc3RhdHVzIG9mIHRoaXMgaXRlcmF0b3Igd2lsbCBiZSBrZXB0LgorICAgICAqIHN0YXR1cyBpbmZvcm1hdGlvbiBvZiB0aGlzIGl0ZXJhdG9yIHdpbGwgYmUga2VwdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3VGV4dAotICAgICAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPkNoYXJhY3Rlckl0ZXJhdG9yPC9jb2RlPiByZWZlciB0byB0aGUgdGV4dAotICAgICAqICAgICAgICAgICAgdG8gYmUgYW5hbHl6ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgQ2hhcmFjdGVySXRlcmF0b3J9IHJlZmVycmluZyB0byB0aGUgdGV4dCB0byBiZQorICAgICAqICAgICAgICAgICAgYW5hbHl6ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciBuZXdUZXh0KTsKIApAQCAtMzcxLDEwICs1ODEsMTEgQEAKICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwogICAgIC8qKgotICAgICAqIENyZWF0ZSBjb3B5IG9mIHRoaXMgaXRlcmF0b3IsIGFsbCBzdGF0dXMgaW5jbHVkaW5nIGN1cnJlbnQgcG9zaXRpb24gaXMKLSAgICAgKiBrZXB0LgorICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgaXRlcmF0b3IsIGFsbCBzdGF0dXMgaW5mb3JtYXRpb24gaW5jbHVkaW5nIHRoZQorICAgICAqIGN1cnJlbnQgcG9zaXRpb24gYXJlIGtlcHQgdGhlIHNhbWUuCiAgICAgICogCi0gICAgICogQHJldHVybiBjb3B5IG9mIHRoaXMgaXRlcmF0b3IKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGl0ZXJhdG9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CkBAIC0zODgsMTMgKzU5OSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCBhIGxvbmcgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSwgc3RhcnQgZnJvbSBnaXZlbiBvZmZzZXQuCisgICAgICogR2V0cyBhIGxvbmcgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSwgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4KKyAgICAgKiBvZmZzZXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGJ1ZgotICAgICAqICAgICAgICAgICAgdGhlIGJ5dGVzIHRvIGJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGVzIHRvIGJlIGNvbnZlcnRlZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gb2YgY29udmVyc2lvbgotICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBsb25nIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvbnZlcnNpb24uCisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIGxvbmcgdmFsdWUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgb2Zmc2V0ICsgTE9OR19MRU5HVEh9IGlzCisgICAgICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIGJ1Zn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldExvbmcoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewogICAgICAgICBpZiAobnVsbCA9PSBidWYpIHsKQEAgLTQxMSwxMyArNjI5LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IGFuIGludCB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBieXRlIGFycmF5LCBzdGFydCBmcm9tIGdpdmVuIG9mZnNldC4KKyAgICAgKiBHZXRzIGFuIGludCB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBieXRlIGFycmF5LCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbgorICAgICAqIG9mZnNldC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gYnVmCi0gICAgICogICAgICAgICAgICB0aGUgYnl0ZXMgdG8gYmUgY29udmVydGVkCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZXMgdG8gYmUgY29udmVydGVkLgogICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBwb3NpdGlvbiBvZiBjb252ZXJzaW9uCi0gICAgICogQHJldHVybiB0aGUgY29udmVydGVkIGludCB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjb252ZXJzaW9uLgorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBpbnQgdmFsdWUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgb2Zmc2V0ICsgSU5UX0xFTkdUSH0gaXMKKyAgICAgKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB7QGNvZGUgYnVmfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRJbnQoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewogICAgICAgICBpZiAobnVsbCA9PSBidWYpIHsKQEAgLTQzNCwxMyArNjU5LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IGEgc2hvcnQgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSwgc3RhcnQgZnJvbSBnaXZlbiBvZmZzZXQuCisgICAgICogR2V0cyBhIHNob3J0IHZhbHVlIGZyb20gdGhlIGdpdmVuIGJ5dGUgYXJyYXksIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuCisgICAgICogb2Zmc2V0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBidWYKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlcyB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlcyB0byBiZSBjb252ZXJ0ZWQuCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGNvbnZlcnNpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgc2hvcnQgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgY29udmVyc2lvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgc2hvcnQgdmFsdWUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBidWZ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvZmZzZXQgPCAwfSBvciB7QGNvZGUgb2Zmc2V0ICsgU0hPUlRfTEVOR1RIfSBpcworICAgICAqICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBidWZ9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgc2hvcnQgZ2V0U2hvcnQoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewogICAgICAgICBpZiAobnVsbCA9PSBidWYpIHsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ2hhcmFjdGVySXRlcmF0b3IuamF2YSBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ2hhcmFjdGVySXRlcmF0b3IuamF2YQppbmRleCAxOTViZWViLi5kZmNkMjFkIDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0NoYXJhY3Rlckl0ZXJhdG9yLmphdmEKKysrIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9DaGFyYWN0ZXJJdGVyYXRvci5qYXZhCkBAIC0xOCw5OCArMTgsMTEzIEBACiBwYWNrYWdlIGphdmEudGV4dDsKIAogLyoqCi0gKiBDaGFyYWN0ZXJJdGVyYXRvciBpcyB1c2VkIHRvIHNlcXVlbmNlIG92ZXIgYSBncm91cCBvZiBjaGFyYWN0ZXJzLiBUaGUKLSAqIGl0ZXJhdGlvbiBzdGFydHMgYXQgdGhlIGJlZ2luIGluZGV4IGluIHRoZSBncm91cCBvZiBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlcworICogQW4gaW50ZXJmYWNlIGZvciB0aGUgYmlkaXJlY3Rpb25hbCBpdGVyYXRpb24gb3ZlciBhIGdyb3VwIG9mIGNoYXJhY3RlcnMuIFRoZQorICogaXRlcmF0aW9uIHN0YXJ0cyBhdCB0aGUgYmVnaW4gaW5kZXggaW4gdGhlIGdyb3VwIG9mIGNoYXJhY3RlcnMgYW5kIGNvbnRpbnVlcwogICogdG8gb25lIGluZGV4IGJlZm9yZSB0aGUgZW5kIGluZGV4LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDaGFyYWN0ZXJJdGVyYXRvciBleHRlbmRzIENsb25lYWJsZSB7CiAKICAgICAvKioKLSAgICAgKiBBIGNvbnN0YW50IHdoaWNoIGluZGljYXRlcyB0aGVyZSBpcyBubyBjaGFyYWN0ZXIuCisgICAgICogQSBjb25zdGFudCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBubyBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBpbmRleC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRE9ORSA9ICdcdWZmZmYnOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBDaGFyYWN0ZXJJdGVyYXRvciB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgQ2hhcmFjdGVySXRlcmF0b3J9IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgQ2hhcmFjdGVySXRlcmF0b3IKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgY2hhcmFjdGVyIGl0ZXJhdG9yLgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNoYXJhY3Rlciwgb3IgRE9ORSBpZiB0aGUgY3VycmVudCBpbmRleCBpcyBwYXN0IHRoZQotICAgICAqICAgICAgICAgZW5kCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBjaGFyYWN0ZXIsIG9yIHtAY29kZSBET05FfSBpZiB0aGUgY3VycmVudCBpbmRleCBpcworICAgICAqICAgICAgICAgcGFzdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiB0aGUgc2VxdWVuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgY3VycmVudCgpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgYmVnaW4gaW5kZXggYW5kIHJldHVybnMgdGhlIGNoYXJhY3RlciBhdAotICAgICAqIHRoZSBiZWdpbiBpbmRleC4KKyAgICAgKiB0aGUgbmV3IHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgYmVnaW4gaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2luIGluZGV4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGZpcnN0KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBiZWdpbiBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGl0ZXJhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBpdGVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRCZWdpbkluZGV4KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBlbmQgaW5kZXguCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb25lIHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIGl0ZXJhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGl0ZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEVuZEluZGV4KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGluZGV4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGluZGV4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGVuZCBpbmRleCAtIDEgYW5kIHJldHVybnMgdGhlIGNoYXJhY3RlcgotICAgICAqIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIGF0IHRoZSBuZXcgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgZW5kIGluZGV4CisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgZW5kIGluZGV4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGxhc3QoKTsKIAogICAgIC8qKgogICAgICAqIEluY3JlbWVudHMgdGhlIGN1cnJlbnQgaW5kZXggYW5kIHJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgbmV3IGluZGV4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgbmV4dCBpbmRleCwgb3IgRE9ORSBpZiB0aGUgbmV4dCBpbmRleCBpcwotICAgICAqICAgICAgICAgcGFzdCB0aGUgZW5kCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXh0IGluZGV4LCBvciB7QGNvZGUgRE9ORX0gaWYgdGhlIG5leHQKKyAgICAgKiAgICAgICAgIGluZGV4IHdvdWxkIGJlIHBhc3QgdGhlIGVuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBuZXh0KCk7CiAKICAgICAvKioKICAgICAgKiBEZWNyZW1lbnRzIHRoZSBjdXJyZW50IGluZGV4IGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5ldyBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHByZXZpb3VzIGluZGV4LCBvciBET05FIGlmIHRoZSBwcmV2aW91cwotICAgICAqICAgICAgICAgaW5kZXggaXMgcGFzdCB0aGUgYmVnaW5uaW5nCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBwcmV2aW91cyBpbmRleCwgb3Ige0Bjb2RlIERPTkV9IGlmIHRoZQorICAgICAqICAgICAgICAgcHJldmlvdXMgaW5kZXggd291bGQgYmUgcGFzdCB0aGUgYmVnaW5uaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIHByZXZpb3VzKCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGluZGV4LgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgaW5kZXggdG8gYSBuZXcgcG9zaXRpb24gYW5kIHJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUKKyAgICAgKiBuZXcgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBpbmRleCB0aGUgPGNvZGU+Q2hhcmFjdGVySXRlcmF0b3I8L2NvZGU+IGlzIHNldCB0by4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5ldyBpbmRleCwgb3IgRE9ORSBpZiB0aGUgaW5kZXggaXMgcGFzdCB0aGUKLSAgICAgKiAgICAgICAgIGVuZAotICAgICAqIAorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBpbmRleCB0aGF0IHRoaXMgY2hhcmFjdGVyIGl0ZXJhdG9yIGlzIHNldCB0by4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5ldyBpbmRleCwgb3Ige0Bjb2RlIERPTkV9IGlmIHRoZSBpbmRleCBpcworICAgICAqICAgICAgICAgcGFzdCB0aGUgZW5kLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgbmV3IGluZGV4IGlzIGxlc3MgdGhhbiB0aGUgYmVnaW4gaW5kZXggb3IgZ3JlYXRlcgotICAgICAqICAgICAgICAgICAgICAgIHRoYW4gdGhlIGVuZCBpbmRleAorICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBsb2NhdGlvbn0gaXMgbGVzcyB0aGFuIHRoZSBiZWdpbiBpbmRleCBvcgorICAgICAqICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIGluZGV4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIHNldEluZGV4KGludCBsb2NhdGlvbik7CiB9CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Nob2ljZUZvcm1hdC5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9DaG9pY2VGb3JtYXQuamF2YQppbmRleCA1YTZiYjY5Li40MWRhY2VkIDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Nob2ljZUZvcm1hdC5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ2hvaWNlRm9ybWF0LmphdmEKQEAgLTE0LDYgKzE0LDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGRlc2NyaXB0aW9uIGlzIGNvcGllZCBmcm9tIElDVSBVc2VyR3VpZGUuCisvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTIzLDExICszNSw1NiBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogQ2hvaWNlRm9ybWF0IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHN0cmluZ3Mgd2l0aCByYW5nZXMgb2YgZG91YmxlIHZhbHVlcy4gVGhlCi0gKiBzdHJpbmdzIGFuZCByYW5nZXMgYXJlIGVpdGhlciBzcGVjaWZpZWQgdXNpbmcgYXJyYXlzIG9yIHdpdGggYSBwYXR0ZXJuIHdoaWNoCi0gKiBpcyBwYXJzZWQgdG8gZGV0ZXJtaW5lIHRoZSBTdHJpbmdzIGFuZCByYW5nZXMuCisgKiBSZXR1cm5zIGEgZml4ZWQgc3RyaW5nIGJhc2VkIG9uIGEgbnVtZXJpYyB2YWx1ZS4gVGhlIGNsYXNzIGNhbiBiZSB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSB7QGxpbmsgTWVzc2FnZUZvcm1hdH0gY2xhc3MgdG8gaGFuZGxlIHBsdXJhbHMgaW4KKyAqIG1lc3NhZ2VzLiB7QGNvZGUgQ2hvaWNlRm9ybWF0fSBlbmFibGVzIHVzZXJzIHRvIGF0dGFjaCBhIGZvcm1hdCB0byBhIHJhbmdlIG9mCisgKiBudW1iZXJzLiBUaGUgY2hvaWNlIGlzIHNwZWNpZmllZCB3aXRoIGFuIGFzY2VuZGluZyBsaXN0IG9mIGRvdWJsZXMsIHdoZXJlCisgKiBlYWNoIGl0ZW0gc3BlY2lmaWVzIGEgaGFsZi1vcGVuIGludGVydmFsIHVwIHRvIHRoZSBuZXh0IGl0ZW0gYXMgaW4gdGhlCisgKiBmb2xsb3dpbmc6IFggbWF0Y2hlcyBqIGlmIGFuZCBvbmx5IGlmIHtAY29kZSBsaW1pdFtqXSA8PSBYIDwgbGltaXRbaisxXX0uCisgKiA8cD4KKyAqIElmIHRoZXJlIGlzIG5vIG1hdGNoLCB0aGVuIGVpdGhlciB0aGUgZmlyc3Qgb3IgbGFzdCBpbmRleCBpcyB1c2VkLiBUaGUgZmlyc3QKKyAqIG9yIGxhc3QgaW5kZXggaXMgdXNlZCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbnVtYmVyIGlzIHRvbyBsb3cgb3IgdG9vIGhpZ2guCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBmb3JtYXQgYXJyYXkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaW1pdHMKKyAqIGFycmF5LgorICogPC9wPgorICogPGg1PkV4YW1wbGVzOjwvaDU+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIGRvdWJsZVtdIGxpbWl0cyA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3fTsKKyAqIFN0cmluZ1tdIGZtdHMgPSB7IlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHVyIiwgIkZyaSIsICJTYXQifTsKKyAqIAorICogZG91YmxlW10gbGltaXRzMiA9IHswLCAxLCBDaG9pY2VGb3JtYXQubmV4dERvdWJsZSgxKX07CisgKiBTdHJpbmdbXSBmbXRzMiA9IHsibm8gZmlsZXMiLCAib25lIGZpbGUiLCAibWFueSBmaWxlcyJ9OworICogPC9wcmU+CisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4gCisgKiBDaG9pY2VGb3JtYXQubmV4dERvdWJsZShkb3VibGUpIGFsbG93cyB0byBnZXQgdGhlIGRvdWJsZSBmb2xsb3dpbmcgdGhlIG9uZQorICogcGFzc2VkIHRvIHRoZSBtZXRob2QuIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgaGFsZiBvcGVuIGludGVydmFscy4KKyAqIDwvcD4KKyAqIDxwPgorICoge0Bjb2RlIENob2ljZUZvcm1hdH0gb2JqZWN0cyBhbHNvIG1heSBiZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gcGF0dGVybnMuCisgKiBUaGUgY29udmVyc2lvbiBjYW4gYmUgZG9uZSBwcm9ncmFtbWF0aWNhbGx5LCBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgb3IKKyAqIGJ5IHVzaW5nIGEgcGF0dGVybiBsaWtlIHRoZSBmb2xsb3dpbmc6CisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqICIxI1N1bnwyI01vbnwzI1R1ZXw0I1dlZHw1I1RodXJ8NiNGcml8NyNTYXQiCisgKiAiMCNhcmUgbm8gZmlsZXN8MSNpcyBvbmUgZmlsZXwxJmx0O2FyZSBtYW55IGZpbGVzIgorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogd2hlcmU6CisgKiA8L3A+CisgKiA8dWw+CisgKiA8bGk+PG51bWJlcj4iIyI8L251bWJlcj4gc3BlY2lmaWVzIGFuIGluY2x1c2l2ZSBsaW1pdCB2YWx1ZTs8L2xpPgorICogPGxpPjxudW1iZXI+IjwiPC9udW1iZXI+IHNwZWNpZmllcyBhbiBleGNsdXNpdmUgbGltaXQgdmFsdWUuPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBDaG9pY2VGb3JtYXQgZXh0ZW5kcyBOdW1iZXJGb3JtYXQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTc5NTE4NDQ0OTY0NTAzMjk2NEw7CkBAIC0zNywzMSArOTQsMzkgQEAKICAgICBwcml2YXRlIFN0cmluZ1tdIGNob2ljZUZvcm1hdHM7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IENob2ljZUZvcm1hdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmFuZ2VzIGFuZCBhc3NvY2lhdGVkCi0gICAgICogc3RyaW5ncy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDaG9pY2VGb3JtYXR9IHdpdGggdGhlIHNwZWNpZmllZCBkb3VibGUgdmFsdWVzCisgICAgICogYW5kIGFzc29jaWF0ZWQgc3RyaW5ncy4gV2hlbiBjYWxsaW5nCisgICAgICoge0BsaW5rICNmb3JtYXQoZG91YmxlLCBTdHJpbmdCdWZmZXIsIEZpZWxkUG9zaXRpb24pIGZvcm1hdH0gd2l0aCBhIGRvdWJsZQorICAgICAqIHZhbHVlIHtAY29kZSBkfSwgdGhlbiB0aGUgZWxlbWVudCB7QGNvZGUgaX0gaW4ge0Bjb2RlIGZvcm1hdHN9IGlzCisgICAgICogc2VsZWN0ZWQgd2hlcmUge0Bjb2RlIGl9IGZ1bGZpbGxzIHtAY29kZSBsaW1pdHNbaV0gPD0gZCA8IGxpbWl0c1tpKzFdfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSB7QGNvZGUgbGltaXRzfSBhbmQge0Bjb2RlIGZvcm1hdHN9IGFycmF5cyBtdXN0IGJlIHRoZQorICAgICAqIHNhbWUuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBsaW1pdHMKLSAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGRvdWJsZSwgdGhlIHJhbmdlcyBhcmUgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIHZhbHVlIGluIGxvd2VyIGluZGV4IHVwIHRvIGxlc3MgdGhhbiB0aGUgdmFsdWUgaW4gdGhlIG5leHQKLSAgICAgKiAgICAgICAgICAgIGhpZ2hlciBpbmRleC4gVGhlIGJvdW5kcyBvZiB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IGluZGV4ZXMgYXJlCi0gICAgICogICAgICAgICAgICBuZWdhdGl2ZSBhbmQgcG9zaXRpdmUgaW5maW5pdHkuCisgICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiBkb3VibGVzIGluIGFzY2VuZGluZyBvcmRlci4gVGhlIGxvd2VzdCBhbmQgaGlnaGVzdAorICAgICAqICAgICAgICAgICAgcG9zc2libGUgdmFsdWVzIGFyZSBuZWdhdGl2ZSBhbmQgcG9zaXRpdmUgaW5maW5pdHkuCiAgICAgICogQHBhcmFtIGZvcm1hdHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmFuZ2VzLiBUaGUgbG93ZXIgYm91bmQgb2YgdGhlCi0gICAgICogICAgICAgICAgICBhc3NvY2lhdGVkIHJhbmdlIGlzIGF0IHRoZSBzYW1lIGluZGV4IGFzIHRoZSBzdHJpbmcuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIHJhbmdlcyBkZWZpbmVkIHRocm91Z2gge0Bjb2RlCisgICAgICogICAgICAgICAgICBsaW1pdHN9LiBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIGFzc29jaWF0ZWQgcmFuZ2UgaXMgYXQgdGhlCisgICAgICogICAgICAgICAgICBzYW1lIGluZGV4IGFzIHRoZSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIENob2ljZUZvcm1hdChkb3VibGVbXSBsaW1pdHMsIFN0cmluZ1tdIGZvcm1hdHMpIHsKICAgICAgICAgc2V0Q2hvaWNlcyhsaW1pdHMsIGZvcm1hdHMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQ2hvaWNlRm9ybWF0IHdpdGggdGhlIHN0cmluZ3MgYW5kIHJhbmdlcyBwYXJzZWQgZnJvbSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgcGF0dGVybi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDaG9pY2VGb3JtYXR9IHdpdGggdGhlIHN0cmluZ3MgYW5kIGxpbWl0cyBwYXJzZWQKKyAgICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgcGF0dGVybi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGVtcGxhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIG9mIHN0cmluZ3MgYW5kIHJhbmdlcworICAgICAqICAgICAgICAgICAgdGhlIHBhdHRlcm4gb2Ygc3RyaW5ncyBhbmQgcmFuZ2VzLgogICAgICAqIAogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgdGhlbiBhbiBlcnJvciBvY2N1cnMgcGFyc2luZyB0aGUgcGF0dGVybgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwYXJzaW5nIHRoZSBwYXR0ZXJuLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDaG9pY2VGb3JtYXQoU3RyaW5nIHRlbXBsYXRlKSB7CiAgICAgICAgIGFwcGx5UGF0dGVybih0ZW1wbGF0ZSk7CkBAIC02OSwxMyArMTM0LDE0IEBACiAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIHBhdHRlcm4gdG8gZGV0ZXJtaW5lIG5ldyBzdHJpbmdzIGFuZCByYW5nZXMgZm9yIHRoaXMKLSAgICAgKiBDaG9pY2VGb3JtYXQuCisgICAgICoge0Bjb2RlIENob2ljZUZvcm1hdH0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRlbXBsYXRlCi0gICAgICogICAgICAgICAgICB0aGUgcGF0dGVybiBvZiBzdHJpbmdzIGFuZCByYW5nZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIG9mIHN0cmluZ3MgYW5kIHJhbmdlcy4KICAgICAgKiAKICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHRoZW4gYW4gZXJyb3Igb2NjdXJzIHBhcnNpbmcgdGhlIHBhdHRlcm4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGFyc2luZyB0aGUgcGF0dGVybi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcHBseVBhdHRlcm4oU3RyaW5nIHRlbXBsYXRlKSB7CiAgICAgICAgIGRvdWJsZVtdIGxpbWl0cyA9IG5ldyBkb3VibGVbNV07CkBAIC0xNDAsMTIgKzIwNiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgQ2hvaWNlRm9ybWF0IHdpdGggdGhlIHNhbWUgcmFuZ2VzIGFuZCBzdHJpbmdzCi0gICAgICogYXMgdGhpcyBDaG9pY2VGb3JtYXQuCisgICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgQ2hvaWNlRm9ybWF0fSB3aXRoIHRoZSBzYW1lIHJhbmdlcyBhbmQKKyAgICAgKiBzdHJpbmdzIGFzIHRoaXMge0Bjb2RlIENob2ljZUZvcm1hdH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIENob2ljZUZvcm1hdAorICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyB7QGNvZGUgQ2hvaWNlRm9ybWF0fS4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMTU2LDE2ICsyMjMsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIENob2ljZUZvcm1hdCBhbmQgYW5zd2VyIGlmIHRoZXkgYXJlCi0gICAgICogZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBDaG9pY2VGb3JtYXQgYW5kIGhhdmUgdGhlIHNhbWUKLSAgICAgKiBsaW1pdHMgYW5kIGZvcm1hdHMuCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIHtAY29kZSBDaG9pY2VGb3JtYXR9LiBUaGUgb2JqZWN0CisgICAgICogbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgQ2hvaWNlRm9ybWF0fSBhbmQgaGF2ZSB0aGUgc2FtZSBsaW1pdHMgYW5kCisgICAgICogZm9ybWF0cyB0byBiZSBlcXVhbCB0byB0aGlzIGluc3RhbmNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgQ2hvaWNlRm9ybWF0LCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgaW5zdGFuY2U7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC0xODEsMTYgKzI0OCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGVuZHMgdG8gdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgdGhlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICogcmFuZ2UgaW4gd2hpY2ggdGhlIHNwZWNpZmllZCBkb3VibGUgdmFsdWUgZml0cy4KKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSByYW5nZSBpbiB3aGljaCB0aGUgc3BlY2lmaWVkCisgICAgICogZG91YmxlIHZhbHVlIGZpdHMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gZm9ybWF0LgogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCB2YWx1ZSB0by4KICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIGEgRmllbGRQb3NpdGlvbiB3aGljaCBpcyBpZ25vcmVkCi0gICAgICogQHJldHVybiB0aGUgU3RyaW5nQnVmZmVyIHBhcmFtZXRlciA8Y29kZT5idWZmZXI8L2NvZGU+CisgICAgICogICAgICAgICAgICBhIHtAY29kZSBGaWVsZFBvc2l0aW9ufSB3aGljaCBpcyBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoZG91YmxlIHZhbHVlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLApAQCAtMjA1LDE2ICsyNzMsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmRzIHRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyIHRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIHJhbmdlIGluIHdoaWNoIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZSBmaXRzLgorICAgICAqIEFwcGVuZHMgdGhlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHJhbmdlIGluIHdoaWNoIHRoZSBzcGVjaWZpZWQgbG9uZworICAgICAqIHZhbHVlIGZpdHMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gZm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBmb3JtYXQuCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIHZhbHVlIHRvLgogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgYSBGaWVsZFBvc2l0aW9uIHdoaWNoIGlzIGlnbm9yZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmdCdWZmZXIgcGFyYW1ldGVyIDxjb2RlPmJ1ZmZlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIEZpZWxkUG9zaXRpb259IHdoaWNoIGlzIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChsb25nIHZhbHVlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLApAQCAtMjIzLDIxICsyOTIsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmFuZ2VzIG9mIHRoaXMgQ2hvaWNlRm9ybWF0LgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByYW5nZXMgb2YgdGhpcyB7QGNvZGUKKyAgICAgKiBDaG9pY2VGb3JtYXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Rm9ybWF0cygpIHsKICAgICAgICAgcmV0dXJuIGNob2ljZUZvcm1hdHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmFuZ2VzIG9mIHRoaXMgQ2hvaWNlRm9ybWF0LgorICAgICAqIFJldHVybnMgdGhlIGxpbWl0cyBvZiB0aGlzIHtAY29kZSBDaG9pY2VGb3JtYXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZG91YmxlLCB0aGUgcmFuZ2VzIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZQotICAgICAqICAgICAgICAgaW4gbG93ZXIgaW5kZXggdXAgdG8gbGVzcyB0aGFuIHRoZSB2YWx1ZSBpbiB0aGUgbmV4dCBoaWdoZXIKLSAgICAgKiAgICAgICAgIGluZGV4LiBUaGUgYm91bmRzIG9mIHRoZSBsb3dlc3QgYW5kIGhpZ2hlc3QgaW5kZXhlcyBhcmUgbmVnYXRpdmUKLSAgICAgKiAgICAgICAgIGFuZCBwb3NpdGl2ZSBpbmZpbml0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBkb3VibGVzIHdoaWNoIG1ha2UgdXAgdGhlIGxpbWl0cyBvZiB0aGlzIHtAY29kZQorICAgICAqICAgICAgICAgQ2hvaWNlRm9ybWF0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlW10gZ2V0TGltaXRzKCkgewogICAgICAgICByZXR1cm4gY2hvaWNlTGltaXRzOwpAQCAtMjQ1LDExICszMTUsMTIgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorICAgICAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCisgICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoLgogICAgICAqIAogICAgICAqIEBzZWUgI2VxdWFscworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC0yNjYsOCArMzM3LDkgQEAKICAgICAgKiBsYXJnZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBhIGRvdWJsZSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIG5leHQgbGFyZ2VyIGRvdWJsZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgYSBkb3VibGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBsYXJnZXIgZG91YmxlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIG5leHREb3VibGUoZG91YmxlIHZhbHVlKSB7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpIHsKQEAgLTI4OCwzMCArMzYwLDQ0IEBACiAgICAgICogZWl0aGVyIGxhcmdlciBvciBzbWFsbGVyIGFzIHNwZWNpZmllZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIGEgZG91YmxlIHZhbHVlCisgICAgICogICAgICAgICAgICBhIGRvdWJsZSB2YWx1ZS4KICAgICAgKiBAcGFyYW0gaW5jcmVtZW50Ci0gICAgICogICAgICAgICAgICB0cnVlIHRvIGdldCBhIGxhcmdlciB2YWx1ZSwgZmFsc2UgdG8gZ2V0IGEgc21hbGxlciB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIG5leHQgbGFyZ2VyIG9yIHNtYWxsZXIgZG91YmxlIHZhbHVlCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gZ2V0IHRoZSBuZXh0IGxhcmdlciB2YWx1ZSwge0Bjb2RlIGZhbHNlfSB0bworICAgICAqICAgICAgICAgICAgZ2V0IHRoZSBwcmV2aW91cyBzbWFsbGVyIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgbGFyZ2VyIG9yIHNtYWxsZXIgZG91YmxlIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIG5leHREb3VibGUoZG91YmxlIHZhbHVlLCBib29sZWFuIGluY3JlbWVudCkgewogICAgICAgICByZXR1cm4gaW5jcmVtZW50ID8gbmV4dERvdWJsZSh2YWx1ZSkgOiBwcmV2aW91c0RvdWJsZSh2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2UgYSBEb3VibGUgZnJvbSB0aGUgc3BlY2lmaWVkIFN0cmluZyBzdGFydGluZyBhdCB0aGUgaW5kZXggc3BlY2lmaWVkCi0gICAgICogYnkgdGhlIFBhcnNlUG9zaXRpb24uIFRoZSBTdHJpbmcgaXMgY29tcGFyZWQgdG8gdGhlIHN0cmluZ3Mgb2YgdGhpcwotICAgICAqIENob2ljZUZvcm1hdCBhbmQgaWYgYSBtYXRjaCBvY2N1cnMsIHRoZSBhbnN3ZXIgaXMgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZQotICAgICAqIGNvcnJlc3BvbmRpbmcgcmFuZ2UuIElmIHRoZSBzdHJpbmcgaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlIGluZGV4IG9mCi0gICAgICogdGhlIFBhcnNlUG9zaXRpb24gaXMgdXBkYXRlZCB0byB0aGUgaW5kZXggZm9sbG93aW5nIHRoZSBwYXJzZWQgdGV4dC4KKyAgICAgKiBQYXJzZXMgYSBkb3VibGUgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydGluZyBhdCB0aGUgaW5kZXggc3BlY2lmaWVkCisgICAgICogYnkge0Bjb2RlIHBvc2l0aW9ufS4gVGhlIHN0cmluZyBpcyBjb21wYXJlZCB0byB0aGUgc3RyaW5ncyBvZiB0aGlzCisgICAgICoge0Bjb2RlIENob2ljZUZvcm1hdH0gYW5kIGlmIGEgbWF0Y2ggb2NjdXJzIHRoZW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgcmFuZ2UgaW4gdGhlIGxpbWl0cyBhcnJheSBpcyByZXR1cm5lZC4gSWYgdGhlIHN0cmluZyBpcworICAgICAqIHN1Y2Nlc3NmdWxseSBwYXJzZWQgdGhlbiB0aGUgaW5kZXggb2YgdGhlIHtAY29kZSBQYXJzZVBvc2l0aW9ufSBwYXNzZWQgdG8KKyAgICAgKiB0aGlzIG1ldGhvZCBpcyB1cGRhdGVkIHRvIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZCB0ZXh0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugc3RyaW5nIHRvIHBhcnNlLgogICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIFBhcnNlUG9zaXRpb24sIHVwZGF0ZWQgb24gcmV0dXJuIHdpdGggdGhlIGluZGV4IGZvbGxvd2luZwotICAgICAqICAgICAgICAgICAgdGhlIHBhcnNlZCB0ZXh0LCBvciBvbiBlcnJvciB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGluZGV4IGlzIHNldCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkCi0gICAgICogQHJldHVybiBhIERvdWJsZSByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIERvdWJsZS5OYU4gaWYgdGhlcmUgaXMgYW4KLSAgICAgKiAgICAgICAgIGVycm9yCisgICAgICogICAgICAgICAgICBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyLCBzcGVjaWZpZXMgdGhlIHN0YXJ0IGluZGV4IGluIHtAY29kZSBzdHJpbmd9CisgICAgICogICAgICAgICAgICBmcm9tIHdoZXJlIHRvIHN0YXJ0IHBhcnNpbmcuIFNlZSB0aGUgPGVtPlJldHVybnM8L2VtPiBzZWN0aW9uIGZvcgorICAgICAqICAgICAgICAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgb3V0cHV0IHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIGlmIG9uZSBvZiB0aGUgZm9ybWF0IHN0cmluZ3Mgb2YgdGhpcyB7QGNvZGUgQ2hvaWNlRm9ybWF0fSBpbnN0YW5jZQorICAgICAqIGlzIGZvdW5kIGluIHtAY29kZSBzdHJpbmd9IHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBzcGVjaWZpZWQgYnkge0Bjb2RlIHBvc2l0aW9uLmdldEluZGV4KCl9IHRoZW4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPnRoZSBpbmRleCBpbiB7QGNvZGUgcG9zaXRpb259IGlzIHNldCB0byB0aGUgaW5kZXggZm9sbG93aW5nIHRoZSBwYXJzZWQgdGV4dDsKKyAgICAgKiA8bGk+dGhlIHtAbGluayBqYXZhLmxhbmcuRG91YmxlIERvdWJsZX0gY29ycmVzcG9uZGluZyB0byB0aGUgZm9ybWF0IHN0cmluZyBpcyByZXR1cm5lZC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogSWYgbm9uZSBvZiB0aGUgZm9ybWF0IHN0cmluZ3MgaXMgZm91bmQgaW4ge0Bjb2RlIHN0cmluZ30gdGhlbgorICAgICAqIDx1bD4gCisgICAgICogPGxpPnRoZSBlcnJvciBpbmRleCBpbiB7QGNvZGUgcG9zaXRpb259IGlzIHNldCB0byB0aGUgY3VycmVudCBpbmRleCBpbiB7QGNvZGUgcG9zaXRpb259OzwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgamF2YS5sYW5nLkRvdWJsZSNOYU4gRG91YmxlLk5hTn0gaXMgcmV0dXJuZWQuCisgICAgICogPC91bD4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyBzdHJpbmcsIFBhcnNlUG9zaXRpb24gcG9zaXRpb24pIHsKQEAgLTMzMSw4ICs0MTcsOSBAQAogICAgICAqIHNtYWxsZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBhIGRvdWJsZSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIG5leHQgc21hbGxlciBkb3VibGUgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIGEgZG91YmxlIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgc21hbGxlciBkb3VibGUgdmFsdWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgcHJldmlvdXNEb3VibGUoZG91YmxlIHZhbHVlKSB7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpIHsKQEAgLTM0OSwxNiArNDM2LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmFuZ2VzIGFuZCBhc3NvY2lhdGVkIHN0cmluZ3Mgb2YgdGhpcyBDaG9pY2VGb3JtYXQuCisgICAgICogU2V0cyB0aGUgZG91YmxlIHZhbHVlcyBhbmQgYXNzb2NpYXRlZCBzdHJpbmdzIG9mIHRoaXMgQ2hvaWNlRm9ybWF0LiBXaGVuCisgICAgICogY2FsbGluZyB7QGxpbmsgI2Zvcm1hdChkb3VibGUsIFN0cmluZ0J1ZmZlciwgRmllbGRQb3NpdGlvbikgZm9ybWF0fSB3aXRoCisgICAgICogYSBkb3VibGUgdmFsdWUge0Bjb2RlIGR9LCB0aGVuIHRoZSBlbGVtZW50IHtAY29kZSBpfSBpbiB7QGNvZGUgZm9ybWF0c30KKyAgICAgKiBpcyBzZWxlY3RlZCB3aGVyZSB7QGNvZGUgaX0gZnVsZmlsbHMgCisgICAgICoge0Bjb2RlIGxpbWl0c1tpXSA8PSBkIDwgbGltaXRzW2krMV19LgorICAgICAqIDxwPgorICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIHtAY29kZSBsaW1pdHN9IGFuZCB7QGNvZGUgZm9ybWF0c30gYXJyYXlzIG11c3QgYmUgdGhlCisgICAgICogc2FtZS4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGxpbWl0cwotICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgZG91YmxlLCB0aGUgcmFuZ2VzIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZQotICAgICAqICAgICAgICAgICAgdmFsdWUgaW4gbG93ZXIgaW5kZXggdXAgdG8gbGVzcyB0aGFuIHRoZSB2YWx1ZSBpbiB0aGUgbmV4dAotICAgICAqICAgICAgICAgICAgaGlnaGVyIGluZGV4LiBUaGUgYm91bmRzIG9mIHRoZSBsb3dlc3QgYW5kIGhpZ2hlc3QgaW5kZXhlcyBhcmUKLSAgICAgKiAgICAgICAgICAgIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSBpbmZpbml0eS4KKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGRvdWJsZXMgaW4gYXNjZW5kaW5nIG9yZGVyLiBUaGUgbG93ZXN0IGFuZCBoaWdoZXN0CisgICAgICogICAgICAgICAgICBwb3NzaWJsZSB2YWx1ZXMgYXJlIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSBpbmZpbml0eS4KICAgICAgKiBAcGFyYW0gZm9ybWF0cwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByYW5nZXMuIFRoZSBsb3dlciBib3VuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgIHJhbmdlIGlzIGF0IHRoZSBzYW1lIGluZGV4IGFzIHRoZSBzdHJpbmcuCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIHJhbmdlcyBkZWZpbmVkIHRocm91Z2gge0Bjb2RlCisgICAgICogICAgICAgICAgICBsaW1pdHN9LiBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIGFzc29jaWF0ZWQgcmFuZ2UgaXMgYXQgdGhlCisgICAgICogICAgICAgICAgICBzYW1lIGluZGV4IGFzIHRoZSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlcyhkb3VibGVbXSBsaW1pdHMsIFN0cmluZ1tdIGZvcm1hdHMpIHsKICAgICAgICAgaWYgKGxpbWl0cy5sZW5ndGggIT0gZm9ybWF0cy5sZW5ndGgpIHsKQEAgLTM3NywxMCArNDcyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0dGVybiBvZiB0aGlzIENob2ljZUZvcm1hdCB3aGljaCBzcGVjaWZpZWQgdGhlIHJhbmdlcyBhbmQKLSAgICAgKiB0aGVpciBhc3NvY2lhdGVkIHN0cmluZ3MuCisgICAgICogUmV0dXJucyB0aGUgcGF0dGVybiBvZiB0aGlzIHtAY29kZSBDaG9pY2VGb3JtYXR9IHdoaWNoIHNwZWNpZmllcyB0aGUKKyAgICAgKiByYW5nZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgc3RyaW5ncy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXR0ZXJuCisgICAgICogQHJldHVybiB0aGUgcGF0dGVybi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvUGF0dGVybigpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yLmphdmEgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0NvbGxhdGlvbkVsZW1lbnRJdGVyYXRvci5qYXZhCmluZGV4IGEyNWY1NTQuLjY2YzAwNzkgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yLmphdmEKKysrIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IuamF2YQpAQCAtMTgsNjggKzE4LDUxIEBACiBwYWNrYWdlIGphdmEudGV4dDsKIAogLy8gQkVHSU4gYW5kcm9pZC1ub3RlCi0vLyBGaXhlZCBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgdG8gbWFrZSB0aGUgZmlsZSA3LWJpdCBjbGVhbi4KKy8vIFRoZSBpY3UgaW1wbGVtZW50YXRpb24gdXNlZCB3YXMgY2hhbmdlZCBmcm9tIGljdTRqIHRvIGljdTRqbmkuCiAvLyBFTkQgYW5kcm9pZC1ub3RlCiAKIC8qKgotICogPHA+Ci0gKiA8Y29kZT5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3I8L2NvZGU+IGlzIGNyZWF0ZWQgYnkgYQotICogPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+IHRvIGl0ZXJhdGUgdGhyb3VnaCBhIHN0cmluZy4gVGhlIHJldHVybgorICogQ3JlYXRlZCBieSBhIHtAY29kZSBSdWxlQmFzZWRDb2xsYXRvcn0gdG8gaXRlcmF0ZSB0aHJvdWdoIGEgc3RyaW5nLiBUaGUKICAqIHJlc3VsdCBvZiBlYWNoIGl0ZXJhdGlvbiBpcyBhIDMyLWJpdCBjb2xsYXRpb24gZWxlbWVudCB0aGF0IGRlZmluZXMgdGhlCiAgKiBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgb3Igc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUKICAqIHNvdXJjZSBzdHJpbmcuCi0gKiA8L3A+CiAgKiA8cD4KICAqIEZvciBpbGx1c3RyYXRpb24sIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgaW4gU3BhbmlzaDoKICAqIDwvcD4KLSAqIAogICogPHA+Ci0gKiA8Y29kZT4KLSAqICJjYSIgLT4gdGhlIGZpcnN0IGNvbGxhdGlvbiBlbGVtZW50IGlzIGNvbGxhdGlvbl9lbGVtZW50KCdjJykgYW5kIHNlY29uZAorICogImNhIjogdGhlIGZpcnN0IGNvbGxhdGlvbiBlbGVtZW50IGlzIGNvbGxhdGlvbl9lbGVtZW50KCdjJykgYW5kIHNlY29uZAogICogY29sbGF0aW9uIGVsZW1lbnQgaXMgY29sbGF0aW9uX2VsZW1lbnQoJ2EnKS4KLSAqIDwvY29kZT4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiA8Y29kZT4KLSAqIFNpbmNlICJjaCIgaW4gU3BhbmlzaCBzb3J0cyBhcyBvbmUgZW50aXR5LCB0aGUgYmVsb3cgZXhhbXBsZSByZXR1cm5zIG9uZQotICogY29sbGF0aW9uIGVsZW1lbnQgZm9yIHRoZSB0d28gY2hhcmFjdGVycyAnYycgYW5kICdoJwotICogPC9jb2RlPgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIDxjb2RlPgotICogImNoYSIgLT4gdGhlIGZpcnN0IGNvbGxhdGlvbiBlbGVtZW50IGlzIGNvbGxhdGlvbl9lbGVtZW50KCdjaCcpIGFuZCBzZWNvbmQKLSAqIGNvbGxhdGlvbiBlbGVtZW50IGlzIGNvbGxhdGlvbl9lbGVtZW50KCdhJykuCi0gKiA8L2NvZGU+CiAgKiA8L3A+CiAgKiA8cD4KLSAqIEFuZCBpbiBHZXJtYW4sCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogPGNvZGU+Ci0gKiBTaW5jZSB0aGUgY2hhcmFjdGVyICcmIzkyO3UwMDg2JyBpcyBhIGNvbXBvc2VkIGNoYXJhY3RlciBvZiAnYScgYW5kICdlJywgdGhlIGl0ZXJhdG9yCi0gKiByZXR1cm5zIHR3byBjb2xsYXRpb24gZWxlbWVudHMgZm9yIHRoZSBzaW5nbGUgY2hhcmFjdGVyICcmIzkyO3UwMDg2JwotICogPC9jb2RlPgorICogU2luY2UgImNoIiBpbiBTcGFuaXNoIHNvcnRzIGFzIG9uZSBlbnRpdHksIHRoZSBleGFtcGxlIGJlbG93IHJldHVybnMgb25lCisgKiBjb2xsYXRpb24gZWxlbWVudCBmb3IgdGhlIHR3byBjaGFyYWN0ZXJzICdjJyBhbmQgJ2gnOgogICogPC9wPgogICogPHA+Ci0gKiA8Y29kZT4KLSAqICImIzkyO3UwMDg2YiIgLT4gdGhlIGZpcnN0Ci0gKiBjb2xsYXRpb24gZWxlbWVudCBpcyBjb2xsYXRpb25fZWxlbWVudCgnYScpLCB0aGUgc2Vjb25kIGNvbGxhdGlvbiBlbGVtZW50IGlzCi0gKiBjb2xsYXRpb25fZWxlbWVudCgnZScpLCBhbmQgdGhlIHRoaXJkIGNvbGxhdGlvbiBlbGVtZW50IGlzCisgKiAiY2hhIjogdGhlIGZpcnN0IGNvbGxhdGlvbiBlbGVtZW50IGlzIGNvbGxhdGlvbl9lbGVtZW50KCdjaCcpIGFuZCB0aGUgc2Vjb25kCisgKiBvbmUgaXMgY29sbGF0aW9uX2VsZW1lbnQoJ2EnKS4KKyAqIDwvcD4KKyAqIDxwPgorICogSW4gR2VybWFuLCBzaW5jZSB0aGUgY2hhcmFjdGVyICcmIzkyO3UwMDg2JyBpcyBhIGNvbXBvc2VkIGNoYXJhY3RlciBvZiAnYScKKyAqIGFuZCAnZScsIHRoZSBpdGVyYXRvciByZXR1cm5zIHR3byBjb2xsYXRpb24gZWxlbWVudHMgZm9yIHRoZSBzaW5nbGUgY2hhcmFjdGVyCisgKiAnJiM5Mjt1MDA4Nic6CisgKiA8L3A+CisgKiA8cD4KKyAqICImIzkyO3UwMDg2YiI6IHRoZSBmaXJzdCBjb2xsYXRpb24gZWxlbWVudCBpcyBjb2xsYXRpb25fZWxlbWVudCgnYScpLCB0aGUKKyAqIHNlY29uZCBvbmUgaXMgY29sbGF0aW9uX2VsZW1lbnQoJ2UnKSwgYW5kIHRoZSB0aGlyZCBjb2xsYXRpb24gZWxlbWVudCBpcwogICogY29sbGF0aW9uX2VsZW1lbnQoJ2InKS4KLSAqIDwvY29kZT4KICAqIDwvcD4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgewogCiAgICAgLyoqCiAgICAgICogVGhpcyBjb25zdGFudCBpcyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IgaW4gdGhlIG1ldGhvZHMKLSAgICAgKiA8Y29kZT5uZXh0KCk8L2NvZGU+IGFuZCA8Y29kZT5wcmV2aW91cygpPC9jb2RlPiB3aGVuIHRoZSBlbmQgb3IgdGhlCisgICAgICoge0Bjb2RlIG5leHQoKX0gYW5kIHtAY29kZSBwcmV2aW91cygpfSB3aGVuIHRoZSBlbmQgb3IgdGhlCiAgICAgICogYmVnaW5uaW5nIG9mIHRoZSBzb3VyY2Ugc3RyaW5nIGhhcyBiZWVuIHJlYWNoZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZQogICAgICAqIHZhbGlkIGNvbGxhdGlvbiBlbGVtZW50cyB0byByZXR1cm4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTE9SREVSID0gLTE7CiAKQEAgLTkxLDggKzc0LDggQEAKIAogICAgIC8qKgogICAgICAqIE9idGFpbnMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFueSBleHBhbnNpb24gc2VxdWVuY2UgdGhhdCBlbmRzIHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIGNvbGxhdGlvbiBlbGVtZW50LiBJZiB0aGVyZSBpcyBubyBleHBhbnNpb24gd2l0aCB0aGlzIGNvbGxhdGlvbgotICAgICAqIGVsZW1lbnQgYXMgdGhlIGxhc3QgZWxlbWVudCwgcmV0dXJucyA8Y29kZT4xPC9jb2RlPi4KKyAgICAgKiBzcGVjaWZpZWQgY29sbGF0aW9uIGVsZW1lbnQuIFJldHVybnMge0Bjb2RlIDF9IGlmIHRoZXJlIGlzIG5vIGV4cGFuc2lvbgorICAgICAqIHdpdGggdGhpcyBjb2xsYXRpb24gZWxlbWVudCBhcyB0aGUgbGFzdCBlbGVtZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcmRlcgogICAgICAqICAgICAgICAgICAgYSBjb2xsYXRpb24gZWxlbWVudCB0aGF0IGhhcyBiZWVuIHByZXZpb3VzbHkgb2J0YWluZWQgZnJvbSBhCkBAIC0xMDAsNiArODMsNyBAQAogICAgICAqICAgICAgICAgICAgbWV0aG9kLgogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFueSBleHBhbnNpb24gc2VxdWVuY2UgZW5kaW5nIHdpdGggdGhlCiAgICAgICogICAgICAgICBzcGVjaWZpZWQgY29sbGF0aW9uIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhFeHBhbnNpb24oaW50IG9yZGVyKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmljdUl0ZXJhdG9yLmdldE1heEV4cGFuc2lvbihvcmRlcik7CkBAIC0xMDcsMjQgKzkxLDI3IEBACiAKICAgICAvKioKICAgICAgKiBPYnRhaW5zIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGluIHRoZSBzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogbmV4dCBjb2xsYXRpb24gZWxlbWVudC4gVGhpcyB2YWx1ZSBjb3VsZCBiZSBhbnkgb2Y6IDx1aT4KKyAgICAgKiBuZXh0IGNvbGxhdGlvbiBlbGVtZW50LiBUaGlzIHZhbHVlIGNvdWxkIGJlIGFueSBvZjoKKyAgICAgKiA8dWw+CiAgICAgICogPGxpPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzb3VyY2Ugc3RyaW5nIHRoYXQgbWF0Y2hlcwotICAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgbmV4dCBjb2xsYXRpb24gZWxlbWVudC4gKFRoaXMgbWVhbnMgdGhhdCBpZgotICAgICAqIHNldE9mZnNldChvZmZzZXQpIHNldHMgdGhlIGluZGV4IGluIHRoZSBtaWRkbGUgb2YgYSBjb250cmFjdGlvbiwKLSAgICAgKiBnZXRPZmZzZXQoKSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBjb250cmFjdGlvbiwKLSAgICAgKiB3aGljaCBtYXkgbm90IGJlIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBvZmZzZXQgdGhhdCB3YXMgc2V0LiBIZW5jZSBjYWxsaW5nCi0gICAgICogZ2V0T2Zmc2V0KCkgaW1tZWRpYXRlbHkgYWZ0ZXIgc2V0T2Zmc2V0KG9mZnNldCkgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQKLSAgICAgKiB0aGUgb3JpZ2luYWwgb2Zmc2V0IHNldCB3aWxsIGJlIHJldHVybmVkLik8L2xpPgorICAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgbmV4dCBjb2xsYXRpb24gZWxlbWVudC4gVGhpcyBtZWFucyB0aGF0IGlmCisgICAgICoge0Bjb2RlIHNldE9mZnNldChvZmZzZXQpfSBzZXRzIHRoZSBpbmRleCBpbiB0aGUgbWlkZGxlIG9mIGEgY29udHJhY3Rpb24sCisgICAgICoge0Bjb2RlIGdldE9mZnNldCgpfSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZQorICAgICAqIGNvbnRyYWN0aW9uLCB3aGljaCBtYXkgbm90IGJlIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBvZmZzZXQgdGhhdCB3YXMgc2V0LgorICAgICAqIEhlbmNlIGNhbGxpbmcge0Bjb2RlIGdldE9mZnNldCgpfSBpbW1lZGlhdGVseSBhZnRlcgorICAgICAqIHtAY29kZSBzZXRPZmZzZXQob2Zmc2V0KX0gZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIG9yaWdpbmFsIG9mZnNldCBzZXQKKyAgICAgKiB3aWxsIGJlIHJldHVybmVkLjwvbGk+CiAgICAgICogPGxpPklmIG5vcm1hbGl6YXRpb24gaXMgb24sIHRoZSBpbmRleCBvZiB0aGUgaW1tZWRpYXRlIHN1YnNlcXVlbnQKICAgICAgKiBjaGFyYWN0ZXIsIG9yIGNvbXBvc2l0ZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyLCBoYXZpbmcgYQogICAgICAqIGNvbWJpbmluZyBjbGFzcyBvZiAwLjwvbGk+CiAgICAgICogPGxpPlRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBzdHJpbmcsIGlmIGl0ZXJhdGlvbiBoYXMgcmVhY2hlZCB0aGUgZW5kLgogICAgICAqIDwvbGk+Ci0gICAgICogPHVpPgorICAgICAqIDwvdWw+CiAgICAgICogCiAgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGNvbGxhdGlvbiBlbGVtZW50IGluIHRoZSBzb3VyY2Ugc3RyaW5nIHRoYXQKLSAgICAgKiAgICAgICAgIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGUge0BsaW5rICNuZXh0KCl9CisgICAgICogICAgICAgICB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhlIHtAbGluayAjbmV4dCgpfQogICAgICAqICAgICAgICAgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewogICAgICAgICByZXR1cm4gdGhpcy5pY3VJdGVyYXRvci5nZXRPZmZzZXQoKTsKQEAgLTEzMyw4ICsxMjAsOSBAQAogICAgIC8qKgogICAgICAqIE9idGFpbnMgdGhlIG5leHQgY29sbGF0aW9uIGVsZW1lbnQgaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBjb2xsYXRpb24gZWxlbWVudCBvciA8Y29kZT5OVUxMT1JERVI8L2NvZGU+IGlmIHRoZSBlbmQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNvbGxhdGlvbiBlbGVtZW50IG9yIHtAY29kZSBOVUxMT1JERVJ9IGlmIHRoZSBlbmQKICAgICAgKiAgICAgICAgIG9mIHRoZSBpdGVyYXRpb24gaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IG5leHQoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmljdUl0ZXJhdG9yLm5leHQoKTsKQEAgLTE0Myw4ICsxMzEsOSBAQAogICAgIC8qKgogICAgICAqIE9idGFpbnMgdGhlIHByZXZpb3VzIGNvbGxhdGlvbiBlbGVtZW50IGluIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGNvbGxhdGlvbiBlbGVtZW50LCBvciA8Y29kZT5OVUxMT1JERVI8L2NvZGU+IHdoZW4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBjb2xsYXRpb24gZWxlbWVudCwgb3Ige0Bjb2RlIE5VTExPUkRFUn0gd2hlbgogICAgICAqICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBpdGVyYXRpb24gaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHByZXZpb3VzKCkgewogICAgICAgICByZXR1cm4gdGhpcy5pY3VJdGVyYXRvci5wcmV2aW91cygpOwpAQCAtMTU1LDcgKzE0NCw5IEBACiAgICAgICogZmlyc3QgMTYgYml0cy4gVGhpcyB2YWx1ZSBpcyB1bnNpZ25lZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb3JkZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50J3MgMTYgYml0cyBwcmltYXJ5IG9yZGVyLgorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgb2YgdGhlIGNvbGxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50J3MgMTYgYml0IHByaW1hcnkgb3JkZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpbWFyeU9yZGVyKGludCBvcmRlcikgewogICAgICAgICByZXR1cm4gY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yLnByaW1hcnlPcmRlcihvcmRlcik7CkBAIC0xNjMsMTQgKzE1NCwxNSBAQAogCiAgICAgLyoqCiAgICAgICogUmVwb3NpdGlvbnMgdGhlIGN1cnNvciB0byBwb2ludCBhdCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY3VycmVudAotICAgICAqIHN0cmluZy4gVGhlIG5leHQgY2FsbCB0byA8Y29kZT5uZXh0KCk8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzKCk8L2NvZGU+Ci0gICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGFuZCBsYXN0IGNvbGxhdGlvbiBlbGVtZW50IGluIHRoZSBzdHJpbmcsCi0gICAgICogcmVzcGVjdGl2ZWx5LgorICAgICAqIHN0cmluZy4gVGhlIG5leHQgY2FsbCB0byB7QGxpbmsgI25leHQoKX0gb3Ige0BsaW5rICNwcmV2aW91cygpfSB3aWxsCisgICAgICogcmV0dXJuIHRoZSBmaXJzdCBhbmQgbGFzdCBjb2xsYXRpb24gZWxlbWVudCBpbiB0aGUgc3RyaW5nLCByZXNwZWN0aXZlbHkuCiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIDxjb2RlPlJ1bGVCYXNlZENvbGxhdG9yPC9jb2RlPiB1c2VkIGJ5IHRoaXMgaXRlcmF0b3IgaGFzIGhhZCBpdHMKLSAgICAgKiBhdHRyaWJ1dGVzIGNoYW5nZWQsIGNhbGxpbmcgPGNvZGU+cmVzZXQoKTwvY29kZT4gd2lsbCByZWluaXRpYWxpemUgdGhlCi0gICAgICogaXRlcmF0b3IgdG8gdXNlIHRoZSBuZXcgYXR0cmlidXRlcy4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIFJ1bGVCYXNlZENvbGxhdG9yfSB1c2VkIGJ5IHRoaXMgaXRlcmF0b3IgaGFzIGhhZCBpdHMKKyAgICAgKiBhdHRyaWJ1dGVzIGNoYW5nZWQsIGNhbGxpbmcge0Bjb2RlIHJlc2V0KCl9IHJlaW5pdGlhbGl6ZXMgdGhlIGl0ZXJhdG9yIHRvCisgICAgICogdXNlIHRoZSBuZXcgYXR0cmlidXRlcy4KICAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIHRoaXMuaWN1SXRlcmF0b3IucmVzZXQoKTsKQEAgLTE4MSw3ICsxNzMsOSBAQAogICAgICAqIDE2dGggdG8gMjN0aCBiaXRzLCBpbmNsdXNpdmUuIFRoaXMgdmFsdWUgaXMgdW5zaWduZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9yZGVyCi0gICAgICogQHJldHVybiB0aGUgOCBiaXQgc2Vjb25kYXJ5IG9yZGVyIG9mIHRoZSBlbGVtZW50CisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBvZiB0aGUgY29sbGF0b3IuCisgICAgICogQHJldHVybiB0aGUgOCBiaXQgc2Vjb25kYXJ5IG9yZGVyIG9mIHRoZSBlbGVtZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgc2Vjb25kYXJ5T3JkZXIoaW50IG9yZGVyKSB7CiAgICAgICAgIHJldHVybiAoc2hvcnQpIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcgpAQCAtMTk0LDExICsxODgsMTEgQEAKICAgICAgKiBBZnRlciB0aGlzIGNhbGwgY29tcGxldGVzLCBhbiBpbnZvY2F0aW9uIG9mIHRoZSB7QGxpbmsgI25leHQoKX0gbWV0aG9kCiAgICAgICogd2lsbCByZXR1cm4gdGhpcyBjb2xsYXRpb24gZWxlbWVudC4KICAgICAgKiA8cD4KLSAgICAgKiBJZiA8Y29kZT5uZXdPZmZzZXQ8L2NvZGU+IGNvcnJlc3BvbmRzIHRvIGEgY2hhcmFjdGVyIHdoaWNoIGlzIHBhcnQgb2YgYQotICAgICAqIHNlcXVlbmNlIHRoYXQgbWFwcyB0byBhIHNpbmdsZSBjb2xsYXRpb24gZWxlbWVudCB0aGUgaXRlcmF0b3IgaXMgYWRqdXN0ZWQKLSAgICAgKiB0byB0aGUgc3RhcnQgb2YgdGhhdCBzZXF1ZW5jZS4gQXMgYSByZXN1bHQgb2YgdGhpcywgYW55IHN1YnNlcXVlbnQgY2FsbAotICAgICAqIG1hZGUgdG8gPGNvZGU+Z2V0T2Zmc2V0KCk8L2NvZGU+IG1heSBub3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIHNldCBieQotICAgICAqIHRoaXMgbWV0aG9kLgorICAgICAqIElmIHtAY29kZSBuZXdPZmZzZXR9IGNvcnJlc3BvbmRzIHRvIGEgY2hhcmFjdGVyIHdoaWNoIGlzIHBhcnQgb2YgYQorICAgICAqIHNlcXVlbmNlIHRoYXQgbWFwcyB0byBhIHNpbmdsZSBjb2xsYXRpb24gZWxlbWVudCB0aGVuIHRoZSBpdGVyYXRvciBpcworICAgICAqIGFkanVzdGVkIHRvIHRoZSBzdGFydCBvZiB0aGF0IHNlcXVlbmNlLiBBcyBhIHJlc3VsdCBvZiB0aGlzLCBhbnkKKyAgICAgKiBzdWJzZXF1ZW50IGNhbGwgbWFkZSB0byB7QGNvZGUgZ2V0T2Zmc2V0KCl9IG1heSBub3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlCisgICAgICogc2V0IGJ5IHRoaXMgbWV0aG9kLgogICAgICAqIDwvcD4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGUgZGVjb21wb3NpdGlvbiBtb2RlIGlzIG9uLCBhbmQgb2Zmc2V0IGlzIGluIHRoZSBtaWRkbGUgb2YgYQpAQCAtMjExLDI4ICsyMDUsMzEgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcgdG8gc2V0LgogICAgICAqICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IGFuIG9mZnNldCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICogICAgICAgICAgICBzZXF1ZW5jZSBvZiBjb2xsYXRpb24gZWxlbWVudHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBuZXdPZmZzZXQpIHsKICAgICAgICAgdGhpcy5pY3VJdGVyYXRvci5zZXRPZmZzZXQobmV3T2Zmc2V0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgbmV3IHNvdXJjZSBzdHJpbmcgaXRlcmF0b3IgZm9yIGl0ZXJhdGlvbiwgYW5kIHJlc2V0IHRoZSBvZmZzZXQgdG8KKyAgICAgKiBTZXRzIGEgbmV3IHNvdXJjZSBzdHJpbmcgaXRlcmF0b3IgZm9yIGl0ZXJhdGlvbiwgYW5kIHJlc2V0cyB0aGUgb2Zmc2V0IHRvCiAgICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHNvdXJjZSBzdHJpbmcgaXRlcmF0b3IgZm9yIGl0ZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJhY3Rlckl0ZXJhdG9yIHNvdXJjZSkgewogICAgICAgICB0aGlzLmljdUl0ZXJhdG9yLnNldFRleHQoc291cmNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgbmV3IHNvdXJjZSBzdHJpbmcgZm9yIGl0ZXJhdGlvbiwgYW5kIHJlc2V0IHRoZSBvZmZzZXQgdG8gdGhlCisgICAgICogU2V0cyBhIG5ldyBzb3VyY2Ugc3RyaW5nIGZvciBpdGVyYXRpb24sIGFuZCByZXNldHMgdGhlIG9mZnNldCB0byB0aGUKICAgICAgKiBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHNvdXJjZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzb3VyY2Ugc3RyaW5nIGZvciBpdGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc291cmNlIHN0cmluZyBmb3IgaXRlcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHNvdXJjZSkgewogICAgICAgICB0aGlzLmljdUl0ZXJhdG9yLnNldFRleHQoc291cmNlKTsKQEAgLTI0Myw3ICsyNDAsOSBAQAogICAgICAqIGxhc3QgOCBiaXRzLiBUaGlzIHZhbHVlIGlzIHVuc2lnbmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvcmRlcgotICAgICAqIEByZXR1cm4gdGhlIDggYml0cyB0ZXJ0aWFyeSBvcmRlciBvZiB0aGUgZWxlbWVudAorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgb2YgdGhlIGNvbGxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSA4IGJpdCB0ZXJ0aWFyeSBvcmRlciBvZiB0aGUgZWxlbWVudC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IHRlcnRpYXJ5T3JkZXIoaW50IG9yZGVyKSB7CiAgICAgICAgIHJldHVybiAoc2hvcnQpIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcgpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Db2xsYXRpb25LZXkuamF2YSBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ29sbGF0aW9uS2V5LmphdmEKaW5kZXggNDViNmFmYS4uZjQzYmZkMSAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Db2xsYXRpb25LZXkuamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0NvbGxhdGlvbktleS5qYXZhCkBAIC0xNCwxNCArMTQsODcgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8vIEJFR0lOIGFuZHJvaWQtbm90ZQorLy8gVGhlIGNsYXNzIGphdmFkb2MgYW5kIHNvbWUgb2YgdGhlIG1ldGhvZCBkZXNjcmlwdGlvbnMgYXJlIGNvcGllZCBmcm9tIElDVTRKCisvLyBzb3VyY2UgZmlsZXMuIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGNvcGllZCBkZXNjcmlwdGlvbnMuCisvLyBUaGUgaWN1IGxpY2Vuc2UgaGVhZGVyIHdhcyBhZGRlZCB0byB0aGlzIGZpbGUuIAorLy8gVGhlIGljdSBpbXBsZW1lbnRhdGlvbiB1c2VkIHdhcyBjaGFuZ2VkIGZyb20gaWN1NGogdG8gaWN1NGpuaS4KKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7Ci0KIC8qKgotICogQ29sbGF0aW9uS2V5IHJlcHJlc2VudHMgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiBhIHBhcnRpY3VsYXIgU3RyaW5nIGZvciBhCi0gKiBzcGVjaWZpYyBDb2xsYXRvci4gQ29sbGF0aW9uS2V5cyBjYW4gYmUgY29tcGFyZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWxhdGl2ZQotICogb3JkZXJpbmcgb2YgdGhlaXIgc291cmNlIFN0cmluZ3MuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIFN0cmluZ3MgbXVzdCBiZQotICogY29tcGFyZWQgbXVsdGlwbGUgdGltZXMsIGFzIGluIHNvcnRpbmcuCisgKiBSZXByZXNlbnRzIGEgc3RyaW5nIHVuZGVyIHRoZSBydWxlcyBvZiBhIHNwZWNpZmljIHtAY29kZSBDb2xsYXRvcn0gb2JqZWN0LgorICogQ29tcGFyaW5nIHR3byB7QGNvZGUgQ29sbGF0aW9uS2V5fSBpbnN0YW5jZXMgcmV0dXJucyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YKKyAqIHRoZSBzdHJpbmdzIHRoZXkgcmVwcmVzZW50LgorICogPHA+CisgKiBTaW5jZSB0aGUgcnVsZSBzZXQgb2YgY29sbGF0b3JzIGNhbiBkaWZmZXIsIHRoZSBzb3J0IG9yZGVycyBvZiB0aGUgc2FtZQorICogc3RyaW5nIHVuZGVyIHR3byBkaWZmZXJlbnQge0Bjb2RlIENvbGxhdG9yfSBpbnN0YW5jZXMgbWlnaHQgZGlmZmVyLiBIZW5jZQorICogY29tcGFyaW5nIGNvbGxhdGlvbiBrZXlzIGdlbmVyYXRlZCBmcm9tIGRpZmZlcmVudCB7QGNvZGUgQ29sbGF0b3J9IGluc3RhbmNlcworICogY2FuIGdpdmUgaW5jb3JyZWN0IHJlc3VsdHMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEJvdGggdGhlIG1ldGhvZCB7QGNvZGUgQ29sbGF0aW9uS2V5LmNvbXBhcmVUbyhDb2xsYXRpb25LZXkpfSBhbmQgdGhlIG1ldGhvZAorICoge0Bjb2RlIENvbGxhdG9yLmNvbXBhcmUoU3RyaW5nLCBTdHJpbmcpfSBjb21wYXJlcyB0d28gc3RyaW5ncyBhbmQgcmV0dXJucworICogdGhlaXIgcmVsYXRpdmUgb3JkZXIuIFRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlc2UgdHdvIGFwcHJvYWNoZXMKKyAqIGNhbiBkaWZmZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIER1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIGEge0Bjb2RlIENvbGxhdGlvbktleX0sIHRoZSBlbnRpcmUgc291cmNlIHN0cmluZworICogaXMgZXhhbWluZWQgYW5kIHByb2Nlc3NlZCBpbnRvIGEgc2VyaWVzIG9mIGJpdHMgdGVybWluYXRlZCBieSBhIG51bGwsIHRoYXQKKyAqIGFyZSBzdG9yZWQgaW4gdGhlIHtAY29kZSBDb2xsYXRpb25LZXl9LiBXaGVuCisgKiB7QGNvZGUgQ29sbGF0aW9uS2V5LmNvbXBhcmVUbyhDb2xsYXRpb25LZXkpfSBleGVjdXRlcywgaXQgcGVyZm9ybXMgYml0d2lzZQorICogY29tcGFyaXNvbiBvbiB0aGUgYml0IHNlcXVlbmNlcy4gVGhpcyBjYW4gaW5jdXIgc3RhcnR1cCBjb3N0IHdoZW4gY3JlYXRpbmcKKyAqIHRoZSB7QGNvZGUgQ29sbGF0aW9uS2V5fSwgYnV0IG9uY2UgdGhlIGtleSBpcyBjcmVhdGVkLCBiaW5hcnkgY29tcGFyaXNvbnMKKyAqIGFyZSBmYXN0LiBUaGlzIGFwcHJvYWNoIGlzIHJlY29tbWVuZGVkIHdoZW4gdGhlIHNhbWUgc3RyaW5ncyBhcmUgdG8gYmUKKyAqIGNvbXBhcmVkIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisgKiA8L3A+CisgKiA8cD4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBpbXBsZW1lbnRhdGlvbnMgb2YKKyAqIHtAY29kZSBDb2xsYXRvci5jb21wYXJlKFN0cmluZywgU3RyaW5nKX0gY2FuIGV4YW1pbmUgYW5kIHByb2Nlc3MgdGhlIHN0cmluZ3MKKyAqIG9ubHkgdW50aWwgdGhlIGZpcnN0IGNoYXJhY3RlcnMgZGlmZmVyIGluIG9yZGVyLiBUaGlzIGFwcHJvYWNoIGlzCisgKiByZWNvbW1lbmRlZCBpZiB0aGUgc3RyaW5ncyBhcmUgdG8gYmUgY29tcGFyZWQgb25seSBvbmNlLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IGNvbGxhdGlvbiBrZXlzIGNhbiBiZSB1c2VkIHRvIHNvcnQgYQorICogbGlzdCBvZiBzdHJpbmdzOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiAvLyBDcmVhdGUgYW4gYXJyYXkgb2YgQ29sbGF0aW9uS2V5cyBmb3IgdGhlIFN0cmluZ3MgdG8gYmUgc29ydGVkLgorICogQ29sbGF0b3IgbXlDb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CisgKiBDb2xsYXRpb25LZXlbXSBrZXlzID0gbmV3IENvbGxhdGlvbktleVszXTsKKyAqIGtleXNbMF0gPSBteUNvbGxhdG9yLmdldENvbGxhdGlvbktleSgmcXVvdDtUb20mcXVvdDspOworICoga2V5c1sxXSA9IG15Q29sbGF0b3IuZ2V0Q29sbGF0aW9uS2V5KCZxdW90O0RpY2smcXVvdDspOworICoga2V5c1syXSA9IG15Q29sbGF0b3IuZ2V0Q29sbGF0aW9uS2V5KCZxdW90O0hhcnJ5JnF1b3Q7KTsKKyAqIHNvcnQoa2V5cyk7CisgKiA8YnI+CisgKiAvLy4uLgorICogPGJyPgorICogLy8gSW5zaWRlIGJvZHkgb2Ygc29ydCByb3V0aW5lLCBjb21wYXJlIGtleXMgdGhpcyB3YXkKKyAqIGlmKCBrZXlzW2ldLmNvbXBhcmVUbygga2V5c1tqXSApICZndDsgMCApCisgKiAgICAvLyBzd2FwIGtleXNbaV0gYW5kIGtleXNbal0KKyAqIDxicj4KKyAqIC8vLi4uCisgKiA8YnI+CisgKiAvLyBGaW5hbGx5LCB3aGVuIHdlJ3ZlIHJldHVybmVkIGZyb20gc29ydC4KKyAqIFN5c3RlbS5vdXQucHJpbnRsbihrZXlzWzBdLmdldFNvdXJjZVN0cmluZygpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbihrZXlzWzFdLmdldFNvdXJjZVN0cmluZygpKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbihrZXlzWzJdLmdldFNvdXJjZVN0cmluZygpKTsKKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiAKKyAqIEBzZWUgQ29sbGF0b3IKKyAqIEBzZWUgUnVsZUJhc2VkQ29sbGF0b3IKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ29sbGF0aW9uS2V5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxDb2xsYXRpb25LZXk+IHsKIApAQCAtMzUsMzEgKzEwOCwzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmUgdGhlIHJlY2VpdmVyIHRvIHRoZSBzcGVjaWZpZWQgQ29sbGF0aW9uS2V5IHRvIGRldGVybWluZSB0aGUKLSAgICAgKiByZWxhdGl2ZSBvcmRlcmluZy4KKyAgICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGNvbGxhdGlvbiBrZXkgb2JqZWN0IHRvIGRldGVybWluZQorICAgICAqIHRoZWlyIHJlbGF0aXZlIG9yZGVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgYSBDb2xsYXRpb25LZXkKLSAgICAgKiBAcmV0dXJuIGFuIGludCA8IDAgaWYgdGhpcyBDb2xsYXRpb25LZXkgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgIENvbGxhdGlvbktleSwgMCBpZiB0aGV5IGFyZSBlcXVhbCwgYW5kID4gMCBpZiB0aGlzIENvbGxhdGlvbktleQotICAgICAqICAgICAgICAgaXMgZ3JlYXRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNvbGxhdGlvbiBrZXkgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBvYmplY3QgdG8uCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoaXMge0Bjb2RlIENvbGxhdGlvbktleX0gaXMgbGVzcyB0aGFuIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHtAY29kZSBDb2xsYXRpb25LZXl9LCAwIGlmIHRoZXkgYXJlIGVxdWFsIGFuZCBhCisgICAgICogICAgICAgICBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGlzIHtAY29kZSBDb2xsYXRpb25LZXl9IGlzIGdyZWF0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oQ29sbGF0aW9uS2V5IHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBpY3VLZXkuY29tcGFyZVRvKHZhbHVlLmljdUtleSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBDb2xsYXRpb25LZXkgYW5kIGFuc3dlciBpZiB0aGV5IGFyZQotICAgICAqIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgQ29sbGF0aW9uS2V5IGFuZCBoYXZlIHRoZSBzYW1lCi0gICAgICogc291cmNlIHN0cmluZyBhbmQgY29sbGF0aW9uIGtleS4gVGhlIGluc3RhbmNlcyBvZiBDb2xsYXRpb25LZXkgbXVzdCBoYXZlCi0gICAgICogYmVlbiBjcmVhdGVkIGJ5IHRoZSBzYW1lIENvbGxhdG9yLgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMge0Bjb2RlIENvbGxhdGlvbktleX0gYW5kIGluZGljYXRlcworICAgICAqIGlmIHRoZXkgYXJlIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIENvbGxhdGlvbktleX0KKyAgICAgKiBhbmQgaGF2ZSB0aGUgc2FtZSBzb3VyY2Ugc3RyaW5nIGFuZCBjb2xsYXRpb24ga2V5LiBCb3RoIGluc3RhbmNlcyBvZgorICAgICAqIHtAY29kZSBDb2xsYXRpb25LZXl9IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIHNhbWUge0Bjb2RlIENvbGxhdG9yfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIENvbGxhdGlvbktleSwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBvYmplY3R9IGlzIGVxdWFsIHRvIHRoaXMgY29sbGF0aW9uIGtleTsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTcxLDkgKzE0NSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgU3RyaW5nIGZyb20gd2hpY2ggdGhpcyBDb2xsYXRpb25LZXkgd2FzIGNyZWF0ZWQuCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gd2hpY2ggdGhpcyBjb2xsYXRpb24ga2V5IHdhcyBjcmVhdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugc3RyaW5nIG9mIHRoaXMgY29sbGF0aW9uIGtleS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZVN0cmluZygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlOwpAQCAtODEsMTEgKzE1NiwxMiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKKyAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2guCiAgICAgICogCiAgICAgICogQHNlZSAjZXF1YWxzCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTkzLDkgKzE2OSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgY29sbGF0aW9uIGtleSBhcyBhIGJ5dGUgYXJyYXkuCisgICAgICogUmV0dXJucyB0aGUgY29sbGF0aW9uIGtleSBhcyBhIGJ5dGUgYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBieXRlcworICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYnl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKICAgICAgICAgcmV0dXJuIGljdUtleS50b0J5dGVBcnJheSgpOwpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Db2xsYXRvci5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Db2xsYXRvci5qYXZhCmluZGV4IDQ1YzFlYjEuLmEzNGI0MTIgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ29sbGF0b3IuamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0NvbGxhdG9yLmphdmEKQEAgLTE0LDYgKzE0LDE5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLgorLy8gVGhlIGljdSBpbXBsZW1lbnRhdGlvbiB1c2VkIHdhcyBjaGFuZ2VkIGZyb20gaWN1NGogdG8gaWN1NGpuaS4KKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTI1LDkgKzM4LDk1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Qcml2aUFjdGlvbjsKIAogLyoqCi0gKiBDb2xsYXRvciBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBpcyB0aGUgcm9vdCBvZiBjbGFzc2VzIHdoaWNoIHByb3ZpZGUKLSAqIExvY2FsZSBzcGVjaWZpYyBTdHJpbmcgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgdGhlaXIgb3JkZXJpbmcgd2l0aCByZXNwZWN0IHRvCi0gKiBlYWNoIG90aGVyLgorICogUGVyZm9ybXMgbG9jYWxlLXNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyaXNvbi4gQSBjb25jcmV0ZSBzdWJjbGFzcywKKyAqIHtAbGluayBSdWxlQmFzZWRDb2xsYXRvcn0sIGFsbG93cyBjdXN0b21pemF0aW9uIG9mIHRoZSBjb2xsYXRpb24gb3JkZXJpbmcgYnkKKyAqIHRoZSB1c2Ugb2YgcnVsZSBzZXRzLgorICogPHA+CisgKiBGb2xsb3dpbmcgdGhlIDxhIGhyZWY9aHR0cDovL3d3dy51bmljb2RlLm9yZz5Vbmljb2RlIENvbnNvcnRpdW08L2E+J3MKKyAqIHNwZWNpZmljYXRpb25zIGZvciB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTAvIj4gVW5pY29kZSBDb2xsYXRpb24KKyAqIEFsZ29yaXRobSAoVUNBKTwvYT4sIHRoZXJlIGFyZSA0IGRpZmZlcmVudCBsZXZlbHMgb2Ygc3RyZW5ndGggdXNlZCBpbgorICogY29tcGFyaXNvbnM6CisgKiA8L3A+CisgKiA8dWw+CisgKiA8bGk+UFJJTUFSWSBzdHJlbmd0aDogVHlwaWNhbGx5LCB0aGlzIGlzIHVzZWQgdG8gZGVub3RlIGRpZmZlcmVuY2VzIGJldHdlZW4KKyAqIGJhc2UgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsICJhIiAmbHQ7ICJiIikuIEl0IGlzIHRoZSBzdHJvbmdlc3QgZGlmZmVyZW5jZS4KKyAqIEZvciBleGFtcGxlLCBkaWN0aW9uYXJpZXMgYXJlIGRpdmlkZWQgaW50byBkaWZmZXJlbnQgc2VjdGlvbnMgYnkgYmFzZQorICogY2hhcmFjdGVyLgorICogPGxpPlNFQ09OREFSWSBzdHJlbmd0aDogQWNjZW50cyBpbiB0aGUgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCBzZWNvbmRhcnkKKyAqIGRpZmZlcmVuY2VzIChmb3IgZXhhbXBsZSwgImFzIiAmbHQ7ICImYWdyYXZlO3MiICZsdDsgImF0IikuIE90aGVyIGRpZmZlcmVuY2VzCisgKiBiZXR3ZWVuIGxldHRlcnMgY2FuIGFsc28gYmUgY29uc2lkZXJlZCBzZWNvbmRhcnkgZGlmZmVyZW5jZXMsIGRlcGVuZGluZyBvbgorICogdGhlIGxhbmd1YWdlLiBBIHNlY29uZGFyeSBkaWZmZXJlbmNlIGlzIGlnbm9yZWQgd2hlbiB0aGVyZSBpcyBhIHByaW1hcnkKKyAqIGRpZmZlcmVuY2UgYW55d2hlcmUgaW4gdGhlIHN0cmluZ3MuCisgKiA8bGk+VEVSVElBUlkgc3RyZW5ndGg6IFVwcGVyIGFuZCBsb3dlciBjYXNlIGRpZmZlcmVuY2VzIGluIGNoYXJhY3RlcnMgYXJlCisgKiBkaXN0aW5ndWlzaGVkIGF0IHRlcnRpYXJ5IHN0cmVuZ3RoIChmb3IgZXhhbXBsZSwgImFvIiAmbHQ7ICJBbyIgJmx0OworICogImEmb2dyYXZlOyIpLiBJbiBhZGRpdGlvbiwgYSB2YXJpYW50IG9mIGEgbGV0dGVyIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSBmb3JtCisgKiBvbiB0aGUgdGVydGlhcnkgc3RyZW5ndGggKHN1Y2ggYXMgIkEiIGFuZCAiJiM5Mzk4OyIpLiBBbm90aGVyIGV4YW1wbGUgaXMgdGhlCisgKiBkaWZmZXJlbmNlIGJldHdlZW4gbGFyZ2UgYW5kIHNtYWxsIEthbmEuIEEgdGVydGlhcnkgZGlmZmVyZW5jZSBpcyBpZ25vcmVkCisgKiB3aGVuIHRoZXJlIGlzIGEgcHJpbWFyeSBvciBzZWNvbmRhcnkgZGlmZmVyZW5jZSBhbnl3aGVyZSBpbiB0aGUgc3RyaW5ncy4KKyAqIDxsaT5JREVOVElDQUwgc3RyZW5ndGg6IFdoZW4gYWxsIG90aGVyIHN0cmVuZ3RocyBhcmUgZXF1YWwsIHRoZSBJREVOVElDQUwKKyAqIHN0cmVuZ3RoIGlzIHVzZWQgYXMgYSB0aWVicmVha2VyLiBUaGUgVW5pY29kZSBjb2RlIHBvaW50IHZhbHVlcyBvZiB0aGUgTkZECisgKiBmb3JtIG9mIGVhY2ggc3RyaW5nIGFyZSBjb21wYXJlZCwganVzdCBpbiBjYXNlIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UuIEZvcgorICogZXhhbXBsZSwgSGVicmV3IGNhbnRlbGxhdGlvbiBtYXJrcyBhcmUgb25seSBkaXN0aW5ndWlzaGVkIGF0IHRoaXMgc3RyZW5ndGguCisgKiBUaGlzIHN0cmVuZ3RoIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseSwgYXMgb25seSBjb2RlIHBvaW50IHZhbHVlIGRpZmZlcmVuY2VzCisgKiBiZXR3ZWVuIHR3byBzdHJpbmdzIGFyZSBhbiBleHRyZW1lbHkgcmFyZSBvY2N1cnJlbmNlLiBVc2luZyB0aGlzIHN0cmVuZ3RoCisgKiBzdWJzdGFudGlhbGx5IGRlY3JlYXNlcyB0aGUgcGVyZm9ybWFuY2UgZm9yIGJvdGggY29tcGFyaXNvbiBhbmQgY29sbGF0aW9uIGtleQorICogZ2VuZXJhdGlvbiBBUElzLiBUaGlzIHN0cmVuZ3RoIGFsc28gaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBjb2xsYXRpb24ga2V5LgorICogPC91bD4KKyAqIDxwPgorICogVGhpcyB7QGNvZGUgQ29sbGF0b3J9IGRlYWxzIG9ubHkgd2l0aCB0d28gZGVjb21wb3NpdGlvbiBtb2RlcywgdGhlIGNhbm9uaWNhbAorICogZGVjb21wb3NpdGlvbiBtb2RlIGFuZCBvbmUgdGhhdCBkb2VzIG5vdCB1c2UgYW55IGRlY29tcG9zaXRpb24uIFRoZQorICogY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIG1vZGUKKyAqIHtAY29kZSBqYXZhLnRleHQuQ29sbGF0b3IuRlVMTF9ERUNPTVBPU0lUSU9OfSBpcyBub3Qgc3VwcG9ydGVkIGhlcmUuIElmIHRoZQorICogY2Fub25pY2FsIGRlY29tcG9zaXRpb24gbW9kZSBpcyBzZXQsIHtAY29kZSBDb2xsYXRvcn0gaGFuZGxlcyB1bi1ub3JtYWxpemVkCisgKiB0ZXh0IHByb3Blcmx5LCBwcm9kdWNpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyBpZiB0aGUgdGV4dCB3ZXJlIG5vcm1hbGl6ZWQgaW4KKyAqIE5GRC4gSWYgY2Fub25pY2FsIGRlY29tcG9zaXRpb24gaXMgdHVybmVkIG9mZiwgaXQgaXMgdGhlIHVzZXIncworICogcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYWxsIHRleHQgaXMgYWxyZWFkeSBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybQorICogYmVmb3JlIHBlcmZvcm1pbmcgYSBjb21wYXJpc29uIG9yIGJlZm9yZSBnZXR0aW5nIGEge0BsaW5rIENvbGxhdGlvbktleX0uCisgKiA8L3A+CisgKiA8cD4KKyAqIDxlbT5FeGFtcGxlczo8L2VtPgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiAvLyBHZXQgdGhlIENvbGxhdG9yIGZvciBVUyBFbmdsaXNoIGFuZCBzZXQgaXRzIHN0cmVuZ3RoIHRvIFBSSU1BUlkKKyAqIENvbGxhdG9yIHVzQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOworICogdXNDb2xsYXRvci5zZXRTdHJlbmd0aChDb2xsYXRvci5QUklNQVJZKTsKKyAqIGlmICh1c0NvbGxhdG9yLmNvbXBhcmUoJnF1b3Q7YWJjJnF1b3Q7LCAmcXVvdDtBQkMmcXVvdDspID09IDApIHsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7U3RyaW5ncyBhcmUgZXF1aXZhbGVudCZxdW90Oyk7CisgKiB9CisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNvbXBhcmUgdHdvIHN0cmluZ3MgdXNpbmcgdGhlIGNvbGxhdG9yIGZvcgorICogdGhlIGRlZmF1bHQgbG9jYWxlLgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiAvLyBDb21wYXJlIHR3byBzdHJpbmdzIGluIHRoZSBkZWZhdWx0IGxvY2FsZQorICogQ29sbGF0b3IgbXlDb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CisgKiBteUNvbGxhdG9yLnNldERlY29tcG9zaXRpb24oQ29sbGF0b3IuTk9fREVDT01QT1NJVElPTik7CisgKiBpZiAobXlDb2xsYXRvci5jb21wYXJlKCZxdW90O1x1MDBlMFx1MDMyNSZxdW90OywgJnF1b3Q7YVx1MDMyNVx1MDMwMCZxdW90OykgIT0gMCkgeworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbigmcXVvdDtcdTAwZTBcdTAzMjUgaXMgbm90IGVxdWFsIHRvIGFcdTAzMjVcdTAzMDAgd2l0aG91dCBkZWNvbXBvc2l0aW9uJnF1b3Q7KTsKKyAqICAgICBteUNvbGxhdG9yLnNldERlY29tcG9zaXRpb24oQ29sbGF0b3IuQ0FOT05JQ0FMX0RFQ09NUE9TSVRJT04pOworICogICAgIGlmIChteUNvbGxhdG9yLmNvbXBhcmUoJnF1b3Q7XHUwMGUwXHUwMzI1JnF1b3Q7LCAmcXVvdDthXHUwMzI1XHUwMzAwJnF1b3Q7KSAhPSAwKSB7CisgKiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigmcXVvdDtFcnJvcjogXHUwMGUwXHUwMzI1IHNob3VsZCBiZSBlcXVhbCB0byBhXHUwMzI1XHUwMzAwIHdpdGggZGVjb21wb3NpdGlvbiZxdW90Oyk7CisgKiAgICAgfSBlbHNlIHsKKyAqICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCZxdW90O1x1MDBlMFx1MDMyNSBpcyBlcXVhbCB0byBhXHUwMzI1XHUwMzAwIHdpdGggZGVjb21wb3NpdGlvbiZxdW90Oyk7CisgKiAgICAgfQorICogfSBlbHNlIHsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7RXJyb3I6IFx1MDBlMFx1MDMyNSBzaG91bGQgYmUgbm90IGVxdWFsIHRvIGFcdTAzMjVcdTAzMDAgd2l0aG91dCBkZWNvbXBvc2l0aW9uJnF1b3Q7KTsKKyAqIH0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiAKKyAqIEBzZWUgUnVsZUJhc2VkQ29sbGF0b3IKKyAqIEBzZWUgQ29sbGF0aW9uS2V5CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxPYmplY3Q+LCBDbG9uZWFibGUgewogCkBAIC0zOSwzNiArMTM4LDUxIEBACiAKICAgICAvKioKICAgICAgKiBDb25zdGFudCB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlY29tcG9zaXRpb24gcnVsZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19ERUNPTVBPU0lUSU9OID0gMDsKIAogICAgIC8qKgogICAgICAqIENvbnN0YW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVjb21wb3NpdGlvbiBydWxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk9OSUNBTF9ERUNPTVBPU0lUSU9OID0gMTsKIAogICAgIC8qKgotICAgICAqIENvbnN0YW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVjb21wb3NpdGlvbiBydWxlLgorICAgICAqIENvbnN0YW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVjb21wb3NpdGlvbiBydWxlLiBUaGlzIHZhbHVlIGZvcgorICAgICAqIGRlY29tcG9zaXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX0RFQ09NUE9TSVRJT04gPSAyOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb2xsYXRpb24gc3RyZW5ndGguCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDb25zdGFudCB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbGxhdGlvbiBzdHJlbmd0aC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUNPTkRBUlkgPSAxOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb2xsYXRpb24gc3RyZW5ndGguCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVSVElBUlkgPSAyOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb2xsYXRpb24gc3RyZW5ndGguCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURFTlRJQ0FMID0gMzsKIApAQCAtOTEsNyArMjA1LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIFZlY3RvcjxDb2xsYXRvcj4gY2FjaGUgPSBuZXcgVmVjdG9yPENvbGxhdG9yPihDQUNIRV9TSVpFKTsKIAotICAgIC8vIFdyYXBwZXIgY2xhc3Mgb2YgSUNVNEogQ29sbGF0b3IKKyAgICAvLyBXcmFwcGVyIGNsYXNzIG9mIElDVTRKTkkgQ29sbGF0b3IKICAgICBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRvciBpY3VDb2xsOwogCiAgICAgQ29sbGF0b3IoY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0b3Igd3JhcHBlcikgewpAQCAtOTksMTggKzIxMywyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBDb2xsYXRvci4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBDb2xsYXRvcn0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENvbGxhdG9yKCkgewogICAgICAgICBzdXBlcigpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgIGljdUNvbGwgPSBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IENvbGxhdG9yIHdpdGggdGhlIHNhbWUgZGVjb21wb3NpdGlvbiBydWxlIGFuZCBzdHJlbmd0aAotICAgICAqIHZhbHVlIGFzIHRoaXMgQ29sbGF0b3IuCisgICAgICogUmV0dXJucyBhIG5ldyBjb2xsYXRvciB3aXRoIHRoZSBzYW1lIGRlY29tcG9zaXRpb24gbW9kZSBhbmQKKyAgICAgKiBzdHJlbmd0aCB2YWx1ZSBhcyB0aGlzIGNvbGxhdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBDb2xsYXRvcgorICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBjb2xsYXRvci4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMTI0LDQ2ICsyNDQsNTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgdHdvIG9iamVjdHMgdG8gZGV0ZXJtaW5lIHRoZWlyIHJlbGF0aXZlIG9yZGVyaW5nLiBUaGUKLSAgICAgKiBvYmplY3RzIG11c3QgYmUgU3RyaW5ncy4KKyAgICAgKiBDb21wYXJlcyB0d28gb2JqZWN0cyB0byBkZXRlcm1pbmUgdGhlaXIgcmVsYXRpdmUgb3JkZXIuIFRoZSBvYmplY3RzIG11c3QKKyAgICAgKiBiZSBzdHJpbmdzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QxCi0gICAgICogICAgICAgICAgICB0aGUgZmlyc3QgU3RyaW5nIHRvIGNvbXBhcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4KICAgICAgKiBAcGFyYW0gb2JqZWN0MgotICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBTdHJpbmcgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gYW4gaW50IDwgMCBpZiBvYmplY3QxIGlzIGxlc3MgdGhhbiBvYmplY3QyLCAwIGlmIHRoZXkgYXJlIGVxdWFsLAotICAgICAqICAgICAgICAgYW5kID4gMCBpZiBvYmplY3QxIGlzIGdyZWF0ZXIgdGhhbiBvYmplY3QyCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB7QGNvZGUgb2JqZWN0MX0gaXMgbGVzcyB0aGFuIHtAY29kZSBvYmplY3QyfSwKKyAgICAgKiAgICAgICAgIDAgaWYgdGhleSBhcmUgZXF1YWwsIGFuZCBhIHBvc2l0aXZlIHZhbHVlIGlmIHtAY29kZSBvYmplY3QxfSBpcworICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBvYmplY3QyfS4KICAgICAgKiBAZXhjZXB0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdHMgYXJlIG5vdCBTdHJpbmdzCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIG9iamVjdDF9IG9yIHtAY29kZSBvYmplY3QyfSBpcyBub3QgYQorICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSBTdHJpbmd9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKICAgICAgICAgcmV0dXJuIGNvbXBhcmUoKFN0cmluZykgb2JqZWN0MSwgKFN0cmluZykgb2JqZWN0Mik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBTdHJpbmdzIHRvIGRldGVybWluZSB0aGVpciByZWxhdGl2ZSBvcmRlcmluZy4KKyAgICAgKiBDb21wYXJlcyB0d28gc3RyaW5ncyB0byBkZXRlcm1pbmUgdGhlaXIgcmVsYXRpdmUgb3JkZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZzEKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBTdHJpbmcgdG8gY29tcGFyZQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLgogICAgICAqIEBwYXJhbSBzdHJpbmcyCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIFN0cmluZyB0byBjb21wYXJlCi0gICAgICogQHJldHVybiBhbiBpbnQgPCAwIGlmIHN0cmluZzEgaXMgbGVzcyB0aGFuIHN0cmluZzIsIDAgaWYgdGhleSBhcmUgZXF1YWwsCi0gICAgICogICAgICAgICBhbmQgPiAwIGlmIHN0cmluZzEgaXMgZ3JlYXRlciB0aGFuIHN0cmluZzIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHtAY29kZSBzdHJpbmcxfSBpcyBsZXNzIHRoYW4ge0Bjb2RlIHN0cmluZzJ9LAorICAgICAqICAgICAgICAgMCBpZiB0aGV5IGFyZSBlcXVhbCBhbmQgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB7QGNvZGUgc3RyaW5nMX0gaXMKKyAgICAgKiAgICAgICAgIGdyZWF0ZXIgdGhhbiB7QGNvZGUgc3RyaW5nMn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBjb21wYXJlKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMik7CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIENvbGxhdG9yIGFuZCBhbnN3ZXIgaWYgdGhleSBhcmUKLSAgICAgKiBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIENvbGxhdG9yIGFuZCBoYXZlIHRoZSBzYW1lCi0gICAgICogc3RyZW5ndGggYW5kIGRlY29tcG9zaXRpb24gdmFsdWVzLgorICAgICAqIENvbXBhcmVzIHRoaXMgY29sbGF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgaW5kaWNhdGVzIGlmIHRoZXkKKyAgICAgKiBhcmUgZXF1YWwuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBDb2xsYXRvciwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIG9iamVjdH0gaXMgYSB7QGNvZGUgQ29sbGF0b3J9IG9iamVjdCBhbmQKKyAgICAgKiAgICAgICAgIGl0IGhhcyB0aGUgc2FtZSBzdHJlbmd0aCBhbmQgZGVjb21wb3NpdGlvbiB2YWx1ZXMgYXMgdGhpcworICAgICAqICAgICAgICAgY29sbGF0b3I7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTE3Niw2NSArMzAwLDc0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBTdHJpbmdzIHVzaW5nIHRoZSBjb2xsYXRpb24gcnVsZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkKLSAgICAgKiBhcmUgZXF1YWwuCisgICAgICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXNpbmcgdGhlIGNvbGxhdGlvbiBydWxlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUKKyAgICAgKiBlcXVhbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nMQotICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IFN0cmluZyB0byBjb21wYXJlCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qgc3RyaW5nIHRvIGNvbXBhcmUuCiAgICAgICogQHBhcmFtIHN0cmluZzIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgU3RyaW5nIHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZ3MgYXJlIGVxdWFsIHVzaW5nIHRoZSBjb2xsYXRpb24gcnVsZXMsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIHN0cmluZzF9IGFuZCB7QGNvZGUgc3RyaW5nMn0gYXJlIGVxdWFsCisgICAgICogICAgICAgICB1c2luZyB0aGUgY29sbGF0aW9uIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgewogICAgICAgICByZXR1cm4gY29tcGFyZShzdHJpbmcxLCBzdHJpbmcyKSA9PSAwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIExvY2FsZXMgd2hpY2ggc3VwcG9ydCBDb2xsYXRvci4KKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGluc3RhbGxlZCB7QGxpbmsgamF2YS51dGlsLkxvY2FsZX0gb2JqZWN0cyB3aGljaCBzdXBwb3J0CisgICAgICoge0Bjb2RlIENvbGxhdG9yfS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIExvY2FsZQorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0Bjb2RlIExvY2FsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2NhbGVbXSBnZXRBdmFpbGFibGVMb2NhbGVzKCkgewogICAgICAgICByZXR1cm4gY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0b3IuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDb2xsYXRpb25LZXkgZm9yIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGZvciB0aGlzIENvbGxhdG9yIHdpdGgKLSAgICAgKiB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIHJ1bGUgYW5kIHN0cmVuZ3RoIHZhbHVlLgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29sbGF0aW9uS2V5fSBmb3IgdGhlIHNwZWNpZmllZCBzdHJpbmcgZm9yIHRoaXMgY29sbGF0b3IKKyAgICAgKiB3aXRoIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gcnVsZSBhbmQgc3RyZW5ndGggdmFsdWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIGNvbGxhdGlvbiBrZXkuCi0gICAgICogQHJldHVybiBhIENvbGxhdGlvbktleQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBzdHJpbmcgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIGNvbGxhdGlvbiBrZXkuCisgICAgICogQHJldHVybiB0aGUgY29sbGF0aW9uIGtleSBmb3Ige0Bjb2RlIHN0cmluZ30uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IENvbGxhdGlvbktleSBnZXRDb2xsYXRpb25LZXkoU3RyaW5nIHN0cmluZyk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWNvbXBvc2l0aW9uIHJ1bGUgZm9yIHRoaXMgQ29sbGF0b3IuCisgICAgICogUmV0dXJucyB0aGUgZGVjb21wb3NpdGlvbiBydWxlIGZvciB0aGlzIGNvbGxhdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29tcG9zaXRpb24gcnVsZSwgZWl0aGVyIE5PX0RFQ09NUE9TSVRJT04sCi0gICAgICogICAgICAgICBDQU5PTklDQUxfREVDT01QT1NJVElPTiBvciBGVUxMX0RFQ09NUE9TSVRJT04KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvbXBvc2l0aW9uIHJ1bGUsIGVpdGhlciB7QGNvZGUgTk9fREVDT01QT1NJVElPTn0gb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBDQU5PTklDQUxfREVDT01QT1NJVElPTn0uIHtAY29kZSBGVUxMX0RFQ09NUE9TSVRJT059IGlzCisgICAgICogICAgICAgICBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGVjb21wb3NpdGlvbigpIHsKICAgICAgICAgcmV0dXJuIGRlY29tcG9zaXRpb25Nb2RlX0lDVV9KYXZhKHRoaXMuaWN1Q29sbC5nZXREZWNvbXBvc2l0aW9uKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDb2xsYXRvciBpbnN0YW5jZSB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgQ29sbGF0b3J9IGluc3RhbmNlIHdoaWNoIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgZGVmYXVsdAorICAgICAqIHtAY29kZSBMb2NhbGV9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBDb2xsYXRvcgorICAgICAqIEByZXR1cm4gdGhlIGNvbGxhdG9yIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xsYXRvciBnZXRJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDb2xsYXRvciBpbnN0YW5jZSB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHNwZWNpZmllZAotICAgICAqIExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIENvbGxhdG9yfSBpbnN0YW5jZSB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgQ29sbGF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCisgICAgICogQHJldHVybiB0aGUgY29sbGF0b3IgZm9yIHtAY29kZSBsb2NhbGV9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGF0b3IgZ2V0SW5zdGFuY2UoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBTdHJpbmcga2V5ID0gbG9jYWxlLnRvU3RyaW5nKCk7CkBAIC0yNDksNTAgKzM4Miw1NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmVuZ3RoIHZhbHVlIGZvciB0aGlzIENvbGxhdG9yLgorICAgICAqIFJldHVybnMgdGhlIHN0cmVuZ3RoIHZhbHVlIGZvciB0aGlzIGNvbGxhdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmVuZ3RoIHZhbHVlLCBlaXRoZXIgUFJJTUFSWSwgU0VDT05EQVJZLCBURVJUSUFSWSwgb3IKLSAgICAgKiAgICAgICAgIElERU5USUNBTAorICAgICAqIEByZXR1cm4gdGhlIHN0cmVuZ3RoIHZhbHVlLCBlaXRoZXIgUFJJTUFSWSwgU0VDT05EQVJZLCBURVJUSUFSWSBvcgorICAgICAqICAgICAgICAgSURFTlRJQ0FMLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U3RyZW5ndGgoKSB7CiAgICAgICAgIHJldHVybiBzdHJlbmd0aF9JQ1VfSmF2YSh0aGlzLmljdUNvbGwuZ2V0U3RyZW5ndGgoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCisgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhpcyBjb2xsYXRvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKKyAgICAgKiBAcmV0dXJuIHRoaXMgY29sbGF0b3IncyBoYXNoIGNvZGUuCiAgICAgICogCiAgICAgICogQHNlZSAjZXF1YWxzKE9iamVjdCkKICAgICAgKiBAc2VlICNlcXVhbHMoU3RyaW5nLCBTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGFic3RyYWN0IGludCBoYXNoQ29kZSgpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVjb21wb3NpdGlvbiBydWxlIGZvciB0aGlzIENvbGxhdG9yLgorICAgICAqIFNldHMgdGhlIGRlY29tcG9zaXRpb24gcnVsZSBmb3IgdGhpcyBjb2xsYXRvci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZWNvbXBvc2l0aW9uIHJ1bGUsIGVpdGhlciBOT19ERUNPTVBPU0lUSU9OLAotICAgICAqICAgICAgICAgICAgQ0FOT05JQ0FMX0RFQ09NUE9TSVRJT04gb3IgRlVMTF9ERUNPTVBPU0lUSU9OCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBydWxlLCBlaXRoZXIge0Bjb2RlIE5PX0RFQ09NUE9TSVRJT059IG9yCisgICAgICogICAgICAgICAgICB7QGNvZGUgQ0FOT05JQ0FMX0RFQ09NUE9TSVRJT059LiB7QGNvZGUgRlVMTF9ERUNPTVBPU0lUSU9OfQorICAgICAqICAgICAgICAgICAgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGRlY29tcG9zaXRpb24gcnVsZSBpcyBub3QgdmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZWQgZGVjb21wb3NpdGlvbiBydWxlIGlzIG5vdCB2YWxpZC4gVGhpcyAKKyAgICAgKiAgICAgICAgICAgICAgICBpbmNsdWRlcyB7QGNvZGUgRlVMTF9ERUNPTVBPU0lUSU9OfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREZWNvbXBvc2l0aW9uKGludCB2YWx1ZSkgewogICAgICAgICB0aGlzLmljdUNvbGwuc2V0RGVjb21wb3NpdGlvbihkZWNvbXBvc2l0aW9uTW9kZV9KYXZhX0lDVSh2YWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0cmVuZ3RoIHZhbHVlIGZvciB0aGlzIENvbGxhdG9yLgorICAgICAqIFNldHMgdGhlIHN0cmVuZ3RoIHZhbHVlIGZvciB0aGlzIGNvbGxhdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQogICAgICAqICAgICAgICAgICAgdGhlIHN0cmVuZ3RoIHZhbHVlLCBlaXRoZXIgUFJJTUFSWSwgU0VDT05EQVJZLCBURVJUSUFSWSwgb3IKLSAgICAgKiAgICAgICAgICAgIElERU5USUNBTAorICAgICAqICAgICAgICAgICAgSURFTlRJQ0FMLgogICAgICAqIAogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgc3RyZW5ndGggdmFsdWUgaXMgbm90IHZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHByb3ZpZGVkIHN0cmVuZ3RoIHZhbHVlIGlzIG5vdCB2YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdHJlbmd0aChpbnQgdmFsdWUpIHsKICAgICAgICAgdGhpcy5pY3VDb2xsLnNldFN0cmVuZ3RoKHN0cmVuZ3RoX0phdmFfSUNVKHZhbHVlKSk7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0RhdGVGb3JtYXQuamF2YSBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGF0ZUZvcm1hdC5qYXZhCmluZGV4IDZmY2E0ZjYuLjM4NzU5YWUgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGF0ZUZvcm1hdC5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGF0ZUZvcm1hdC5qYXZhCkBAIC0xNCw2ICsxNCwxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBUaGUgY2xhc3MgamF2YWRvYyBhbmQgc29tZSBvZiB0aGUgbWV0aG9kIGRlc2NyaXB0aW9ucyBhcmUgY29waWVkIGZyb20gSUNVNEoKKy8vIHNvdXJjZSBmaWxlcy4gQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgY29waWVkIGRlc2NyaXB0aW9ucy4KKy8vIFRoZSBpY3UgbGljZW5zZSBoZWFkZXIgd2FzIGFkZGVkIHRvIHRoaXMgZmlsZS4gCisvLyBFTkQgYW5kcm9pZC1ub3RlCiAKIHBhY2thZ2UgamF2YS50ZXh0OwogCkBAIC0yOCwxNTIgKzQwLDMzNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBEYXRlRm9ybWF0IGlzIHRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGZvcm1hdHMgd2hpY2ggZm9ybWF0IGFuZCBwYXJzZQotICogRGF0ZXMuCisgKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0ZS90aW1lIGZvcm1hdHRpbmcgc3ViY2xhc3NlcyB3aGljaCBmb3JtYXRzIGFuZAorICogcGFyc2VzIGRhdGVzIG9yIHRpbWUgaW4gYSBsYW5ndWFnZS1pbmRlcGVuZGVudCBtYW5uZXIuIFRoZSBkYXRlL3RpbWUKKyAqIGZvcm1hdHRpbmcgc3ViY2xhc3MsIHN1Y2ggYXMge0BsaW5rIFNpbXBsZURhdGVGb3JtYXR9LCBhbGxvd3MgZm9yIGZvcm1hdHRpbmcKKyAqIChpLmUuLCBkYXRlIC0+IHRleHQpLCBwYXJzaW5nICh0ZXh0IC0+IGRhdGUpLCBhbmQgbm9ybWFsaXphdGlvbi4gVGhlIGRhdGUgaXMKKyAqIHJlcHJlc2VudGVkIGFzIGEge0Bjb2RlIERhdGV9IG9iamVjdCBvciBhcyB0aGUgbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwKKyAqIDE5NzAsIDAwOjAwOjAwIEdNVC4KKyAqIDxwPgorICogRGF0ZUZvcm1hdCBwcm92aWRlcyBtYW55IGNsYXNzIG1ldGhvZHMgZm9yIG9idGFpbmluZyBkZWZhdWx0IGRhdGUvdGltZQorICogZm9ybWF0dGVycyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBvciBhIGdpdmVuIGxvY2FsZSBhbmQgYSBudW1iZXIgb2YgZm9ybWF0dGluZworICogc3R5bGVzLiBUaGUgZm9ybWF0dGluZyBzdHlsZXMgaW5jbHVkZSBGVUxMLCBMT05HLCBNRURJVU0sIGFuZCBTSE9SVC4gTW9yZQorICogZGV0YWlscyBhbmQgZXhhbXBsZXMgZm9yIHVzaW5nIHRoZXNlIHN0eWxlcyBhcmUgcHJvdmlkZWQgaW4gdGhlIG1ldGhvZAorICogZGVzY3JpcHRpb25zLgorICogPC9wPgorICogPHA+CisgKiB7QGNvZGUgRGF0ZUZvcm1hdH0gaGVscHMgeW91IHRvIGZvcm1hdCBhbmQgcGFyc2UgZGF0ZXMgZm9yIGFueSBsb2NhbGUuIFlvdXIKKyAqIGNvZGUgY2FuIGJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YgdGhlIGxvY2FsZSBjb252ZW50aW9ucyBmb3IgbW9udGhzLCBkYXlzCisgKiBvZiB0aGUgd2Vlaywgb3IgZXZlbiB0aGUgY2FsZW5kYXIgZm9ybWF0OiBsdW5hciB2cy4gc29sYXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRvIGZvcm1hdCBhIGRhdGUgZm9yIHRoZSBjdXJyZW50IExvY2FsZSwgdXNlIG9uZSBvZiB0aGUgc3RhdGljIGZhY3RvcnkKKyAqIG1ldGhvZHM6CisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIG15U3RyaW5nID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQobXlEYXRlKTsKKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIElmIHlvdSBhcmUgZm9ybWF0dGluZyBtdWx0aXBsZSBkYXRlcywgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gZ2V0IHRoZSBmb3JtYXQKKyAqIGFuZCB1c2UgaXQgbXVsdGlwbGUgdGltZXMgc28gdGhhdCB0aGUgc3lzdGVtIGRvZXNuJ3QgaGF2ZSB0byBmZXRjaCB0aGUKKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhbCBsYW5ndWFnZSBhbmQgY291bnRyeSBjb252ZW50aW9ucyBtdWx0aXBsZSB0aW1lcy4KKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7CisgKiBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGEubGVuZ3RoOyArK2kpIHsKKyAqICAgICBvdXRwdXQucHJpbnRsbihkZi5mb3JtYXQobXlEYXRlW2ldKSArICZxdW90OzsgJnF1b3Q7KTsKKyAqIH0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIFRvIGZvcm1hdCBhIG51bWJlciBmb3IgYSBkaWZmZXJlbnQgbG9jYWxlLCBzcGVjaWZ5IGl0IGluIHRoZSBjYWxsIHRvCisgKiB7QGNvZGUgZ2V0RGF0ZUluc3RhbmNlfToKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuTE9ORywgTG9jYWxlLkZSQU5DRSk7CisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiB7QGNvZGUgRGF0ZUZvcm1hdH0gY2FuIGFsc28gYmUgdXNlZCB0byBwYXJzZSBzdHJpbmdzOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBteURhdGUgPSBkZi5wYXJzZShteVN0cmluZyk7CisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBVc2Uge0Bjb2RlIGdldERhdGVJbnN0YW5jZX0gdG8gZ2V0IHRoZSBub3JtYWwgZGF0ZSBmb3JtYXQgZm9yIGEgY291bnRyeS4KKyAqIE90aGVyIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgYXJlIGF2YWlsYWJsZTogVXNlIHtAY29kZSBnZXRUaW1lSW5zdGFuY2V9IHRvCisgKiBnZXQgdGhlIHRpbWUgZm9ybWF0IGZvciBhIGNvdW50cnkuIFVzZSB7QGNvZGUgZ2V0RGF0ZVRpbWVJbnN0YW5jZX0gdG8gZ2V0IHRoZQorICogZGF0ZSBhbmQgdGltZSBmb3JtYXQuIFlvdSBjYW4gcGFzcyBpbiBkaWZmZXJlbnQgb3B0aW9ucyB0byB0aGVzZSBmYWN0b3J5CisgKiBtZXRob2RzIHRvIGNvbnRyb2wgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0OyBmcm9tIFNIT1JUIHRvIE1FRElVTSB0byBMT05HIHRvCisgKiBGVUxMLiBUaGUgZXhhY3QgcmVzdWx0IGRlcGVuZHMgb24gdGhlIGxvY2FsZSwgYnV0IGdlbmVyYWxseToKKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxsaT5TSE9SVCBpcyBjb21wbGV0ZWx5IG51bWVyaWMsIHN1Y2ggYXMgMTIuMTMuNTIgb3IgMzozMHBtCisgKiA8bGk+TUVESVVNIGlzIGxvbmdlciwgc3VjaCBhcyBKYW4gMTIsIDE5NTIKKyAqIDxsaT5MT05HIGlzIGxvbmdlciwgc3VjaCBhcyBKYW51YXJ5IDEyLCAxOTUyIG9yIDM6MzA6MzJwbQorICogPGxpPkZVTEwgaXMgcHJldHR5IGNvbXBsZXRlbHkgc3BlY2lmaWVkLCBzdWNoIGFzIFR1ZXNkYXksIEFwcmlsIDEyLCAxOTUyIEFECisgKiBvciAzOjMwOjQycG0gUFNULgorICogPC91bD4KKyAqIDxwPgorICogSWYgbmVlZGVkLCB0aGUgdGltZSB6b25lIGNhbiBiZSBzZXQgb24gdGhlIGZvcm1hdC4gRm9yIGV2ZW4gZ3JlYXRlciBjb250cm9sCisgKiBvdmVyIHRoZSBmb3JtYXR0aW5nIG9yIHBhcnNpbmcsIHRyeSBjYXN0aW5nIHRoZSB7QGNvZGUgRGF0ZUZvcm1hdH0geW91IGdldAorICogZnJvbSB0aGUgZmFjdG9yeSBtZXRob2RzIHRvIGEge0Bjb2RlIFNpbXBsZURhdGVGb3JtYXR9LiBUaGlzIHdpbGwgd29yayBmb3IKKyAqIHRoZSBtYWpvcml0eSBvZiBjb3VudHJpZXM7IGp1c3QgcmVtZW1iZXIgdG8gcHV0IGl0IGluIGEgdHJ5IGJsb2NrIGluIGNhc2UgeW91CisgKiBlbmNvdW50ZXIgYW4gdW51c3VhbCBvbmUuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZXJlIGFyZSB2ZXJzaW9ucyBvZiB0aGUgcGFyc2UgYW5kIGZvcm1hdCBtZXRob2RzIHdoaWNoIHVzZQorICoge0Bjb2RlIFBhcnNlUG9zaXRpb259IGFuZCB7QGNvZGUgRmllbGRQb3NpdGlvbn0gdG8gYWxsb3cgeW91IHRvCisgKiA8dWw+CisgKiA8bGk+cHJvZ3Jlc3NpdmVseSBwYXJzZSB0aHJvdWdoIHBpZWNlcyBvZiBhIHN0cmluZzsKKyAqIDxsaT5hbGlnbiBhbnkgcGFydGljdWxhciBmaWVsZC4KKyAqIDwvdWw+CisgKiA8aDQ+U3luY2hyb25pemF0aW9uPC9oND4KKyAqIDxwPgorICogRGF0ZSBmb3JtYXRzIGFyZSBub3Qgc3luY2hyb25pemVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjcmVhdGUgc2VwYXJhdGUKKyAqIGZvcm1hdCBpbnN0YW5jZXMgZm9yIGVhY2ggdGhyZWFkLiBJZiBtdWx0aXBsZSB0aHJlYWRzIGFjY2VzcyBhIGZvcm1hdAorICogY29uY3VycmVudGx5LCBpdCBtdXN0IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LgorICogPC9wPgorICogCisgKiBAc2VlIE51bWJlckZvcm1hdAorICogQHNlZSBTaW1wbGVEYXRlRm9ybWF0CisgKiBAc2VlIENhbGVuZGFyCisgKiBAc2VlIFRpbWVab25lCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGVGb3JtYXQgZXh0ZW5kcyBGb3JtYXQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzIxODMyMjMwNjY0OTk1Mzc4OEw7CiAKICAgICAvKioKLSAgICAgKiBUaGUgY2FsZW5kYXIgdGhhdCB0aGlzIDxjb2RlPkRhdGVGb3JtYXQ8L2NvZGU+IHVzZXMgdG8gZm9ybWF0IGEgbnVtYmVyIAorICAgICAqIFRoZSBjYWxlbmRhciB0aGF0IHRoaXMge0Bjb2RlIERhdGVGb3JtYXR9IHVzZXMgdG8gZm9ybWF0IGEgbnVtYmVyCiAgICAgICogcmVwcmVzZW50aW5nIGEgZGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2FsZW5kYXIgY2FsZW5kYXI7CiAKICAgICAvKioKICAgICAgKiBUaGUgbnVtYmVyIGZvcm1hdCB1c2VkIHRvIGZvcm1hdCBhIG51bWJlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgTnVtYmVyRm9ybWF0IG51bWJlckZvcm1hdDsKIAogICAgIC8qKgotICAgICAqIEZvcm1hdCBzdHlsZSBjb25zdGFudC4KKyAgICAgKiBUaGUgZm9ybWF0IHN0eWxlIGNvbnN0YW50IGRlZmluaW5nIHRoZSBkZWZhdWx0IGZvcm1hdCBzdHlsZS4gVGhlIGRlZmF1bHQKKyAgICAgKiBpcyBNRURJVU0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVCA9IDI7CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXQgc3R5bGUgY29uc3RhbnQuCisgICAgICogVGhlIGZvcm1hdCBzdHlsZSBjb25zdGFudCBkZWZpbmluZyB0aGUgZnVsbCBzdHlsZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBGVUxMID0gMDsKIAogICAgIC8qKgotICAgICAqIEZvcm1hdCBzdHlsZSBjb25zdGFudC4KKyAgICAgKiBUaGUgZm9ybWF0IHN0eWxlIGNvbnN0YW50IGRlZmluaW5nIHRoZSBsb25nIHN0eWxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IExPTkcgPSAxOwogCiAgICAgLyoqCi0gICAgICogRm9ybWF0IHN0eWxlIGNvbnN0YW50LgorICAgICAqIFRoZSBmb3JtYXQgc3R5bGUgY29uc3RhbnQgZGVmaW5pbmcgdGhlIG1lZGl1bSBzdHlsZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRURJVU0gPSAyOwogCiAgICAgLyoqCi0gICAgICogRm9ybWF0IHN0eWxlIGNvbnN0YW50LgorICAgICAqIFRoZSBmb3JtYXQgc3R5bGUgY29uc3RhbnQgZGVmaW5pbmcgdGhlIHNob3J0IHN0eWxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNIT1JUID0gMzsKIAogICAgIC8qKgotICAgICAqIEZpZWxkIGNvbnN0YW50LgorICAgICAqIFRoZSB7QGNvZGUgRmllbGRQb3NpdGlvbn0gc2VsZWN0b3IgZm9yICdHJyBmaWVsZCBhbGlnbm1lbnQsIGNvcnJlc3BvbmRzCisgICAgICogdG8gdGhlIHtAbGluayBDYWxlbmRhciNFUkF9IGZpZWxkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSQV9GSUVMRCA9IDA7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBUaGUge0Bjb2RlIEZpZWxkUG9zaXRpb259IHNlbGVjdG9yIGZvciAneScgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcworICAgICAqIHRvIHRoZSB7QGxpbmsgQ2FsZW5kYXIjWUVBUn0gZmllbGQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVBUl9GSUVMRCA9IDE7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBUaGUge0Bjb2RlIEZpZWxkUG9zaXRpb259IHNlbGVjdG9yIGZvciAnTScgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcworICAgICAqIHRvIHRoZSB7QGxpbmsgQ2FsZW5kYXIjTU9OVEh9IGZpZWxkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1PTlRIX0ZJRUxEID0gMjsKIAogICAgIC8qKgotICAgICAqIEZpZWxkIGNvbnN0YW50LgorICAgICAqIFRoZSB7QGNvZGUgRmllbGRQb3NpdGlvbn0gc2VsZWN0b3IgZm9yICdkJyBmaWVsZCBhbGlnbm1lbnQsIGNvcnJlc3BvbmRzCisgICAgICogdG8gdGhlIHtAbGluayBDYWxlbmRhciNEQVRFfSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBEQVRFX0ZJRUxEID0gMzsKIAogICAgIC8qKgotICAgICAqIEZpZWxkIGNvbnN0YW50LgorICAgICAqIFRoZSB7QGNvZGUgRmllbGRQb3NpdGlvbn0gc2VsZWN0b3IgZm9yICdrJyBmaWVsZCBhbGlnbm1lbnQsIGNvcnJlc3BvbmRzCisgICAgICogdG8gdGhlIHtAbGluayBDYWxlbmRhciNIT1VSX09GX0RBWX0gZmllbGQuIHtAY29kZSBIT1VSX09GX0RBWTFfRklFTER9IGlzCisgICAgICogdXNlZCBmb3IgdGhlIG9uZS1iYXNlZCAyNC1ob3VyIGNsb2NrLiBGb3IgZXhhbXBsZSwgMjM6NTkgKyAwMTowMCByZXN1bHRzCisgICAgICogaW4gMjQ6NTkuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSE9VUl9PRl9EQVkxX0ZJRUxEID0gNDsKIAogICAgIC8qKgotICAgICAqIEZpZWxkIGNvbnN0YW50LgorICAgICAqIFRoZSB7QGNvZGUgRmllbGRQb3NpdGlvbn0gc2VsZWN0b3IgZm9yICdIJyBmaWVsZCBhbGlnbm1lbnQsIGNvcnJlc3BvbmRzCisgICAgICogdG8gdGhlIHtAbGluayBDYWxlbmRhciNIT1VSX09GX0RBWX0gZmllbGQuIHtAY29kZSBIT1VSX09GX0RBWTBfRklFTER9IGlzCisgICAgICogdXNlZCBmb3IgdGhlIHplcm8tYmFzZWQgMjQtaG91ciBjbG9jay4gRm9yIGV4YW1wbGUsIDIzOjU5ICsgMDE6MDAgcmVzdWx0cworICAgICAqIGluIDAwOjU5LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhPVVJfT0ZfREFZMF9GSUVMRCA9IDU7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBGaWVsZFBvc2l0aW9uIHNlbGVjdG9yIGZvciAnbScgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiB7QGxpbmsgQ2FsZW5kYXIjTUlOVVRFfSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNSU5VVEVfRklFTEQgPSA2OwogCiAgICAgLyoqCi0gICAgICogRmllbGQgY29uc3RhbnQuCisgICAgICogRmllbGRQb3NpdGlvbiBzZWxlY3RvciBmb3IgJ3MnIGZpZWxkIGFsaWdubWVudCwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICoge0BsaW5rIENhbGVuZGFyI1NFQ09ORH0gZmllbGQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VDT05EX0ZJRUxEID0gNzsKIAogICAgIC8qKgotICAgICAqIEZpZWxkIGNvbnN0YW50LgorICAgICAqIEZpZWxkUG9zaXRpb24gc2VsZWN0b3IgZm9yICdTJyBmaWVsZCBhbGlnbm1lbnQsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqIHtAbGluayBDYWxlbmRhciNNSUxMSVNFQ09ORH0gZmllbGQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUlMTElTRUNPTkRfRklFTEQgPSA4OwogCiAgICAgLyoqCi0gICAgICogRmllbGQgY29uc3RhbnQuCisgICAgICogRmllbGRQb3NpdGlvbiBzZWxlY3RvciBmb3IgJ0UnIGZpZWxkIGFsaWdubWVudCwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICoge0BsaW5rIENhbGVuZGFyI0RBWV9PRl9XRUVLfSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBEQVlfT0ZfV0VFS19GSUVMRCA9IDk7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBGaWVsZFBvc2l0aW9uIHNlbGVjdG9yIGZvciAnRCcgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiB7QGxpbmsgQ2FsZW5kYXIjREFZX09GX1lFQVJ9IGZpZWxkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERBWV9PRl9ZRUFSX0ZJRUxEID0gMTA7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBGaWVsZFBvc2l0aW9uIHNlbGVjdG9yIGZvciAnRicgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiB7QGxpbmsgQ2FsZW5kYXIjREFZX09GX1dFRUtfSU5fTU9OVEh9IGZpZWxkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERBWV9PRl9XRUVLX0lOX01PTlRIX0ZJRUxEID0gMTE7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBGaWVsZFBvc2l0aW9uIHNlbGVjdG9yIGZvciAndycgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiB7QGxpbmsgQ2FsZW5kYXIjV0VFS19PRl9ZRUFSfSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXRUVLX09GX1lFQVJfRklFTEQgPSAxMjsKIAogICAgIC8qKgotICAgICAqIEZpZWxkIGNvbnN0YW50LgorICAgICAqIEZpZWxkUG9zaXRpb24gc2VsZWN0b3IgZm9yICdXJyBmaWVsZCBhbGlnbm1lbnQsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqIHtAbGluayBDYWxlbmRhciNXRUVLX09GX01PTlRIfSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXRUVLX09GX01PTlRIX0ZJRUxEID0gMTM7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBGaWVsZFBvc2l0aW9uIHNlbGVjdG9yIGZvciAnYScgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiB7QGxpbmsgQ2FsZW5kYXIjQU1fUE19IGZpZWxkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFNX1BNX0ZJRUxEID0gMTQ7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBGaWVsZFBvc2l0aW9uIHNlbGVjdG9yIGZvciAnaCcgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqIHtAbGluayBDYWxlbmRhciNIT1VSfSBmaWVsZC4ge0Bjb2RlIEhPVVIxX0ZJRUxEfSBpcyB1c2VkIGZvciB0aGUKKyAgICAgKiBvbmUtYmFzZWQgMTItaG91ciBjbG9jay4gRm9yIGV4YW1wbGUsIDExOjMwIFBNICsgMSBob3VyIHJlc3VsdHMgaW4gMTI6MzAKKyAgICAgKiBBTS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBIT1VSMV9GSUVMRCA9IDE1OwogCiAgICAgLyoqCi0gICAgICogRmllbGQgY29uc3RhbnQuCisgICAgICogVGhlIHtAY29kZSBGaWVsZFBvc2l0aW9ufSBzZWxlY3RvciBmb3IgJ3onIGZpZWxkIGFsaWdubWVudCwgY29ycmVzcG9uZHMKKyAgICAgKiB0byB0aGUge0BsaW5rIENhbGVuZGFyI1pPTkVfT0ZGU0VUfSBhbmQge0BsaW5rIENhbGVuZGFyI0RTVF9PRkZTRVR9CisgICAgICogZmllbGRzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhPVVIwX0ZJRUxEID0gMTY7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBUaGUge0Bjb2RlIEZpZWxkUG9zaXRpb259IHNlbGVjdG9yIGZvciAneicgZmllbGQgYWxpZ25tZW50LCBjb3JyZXNwb25kcworICAgICAqIHRvIHRoZSB7QGxpbmsgQ2FsZW5kYXIjWk9ORV9PRkZTRVR9IGFuZCB7QGxpbmsgQ2FsZW5kYXIjRFNUX09GRlNFVH0KKyAgICAgKiBmaWVsZHMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVElNRVpPTkVfRklFTEQgPSAxNzsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgRGF0ZUZvcm1hdC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBEYXRlRm9ybWF0fS4KICAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGF0ZUZvcm1hdCgpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIERhdGVGb3JtYXQgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzLgorICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIERhdGVGb3JtYXR9IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgRGF0ZUZvcm1hdAorICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyB7QGNvZGUgRGF0ZUZvcm1hdH0uCiAgICAgICogCiAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKQEAgLTE4NCwxNiArMzc5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBEYXRlRm9ybWF0IGFuZCBhbnN3ZXIgaWYgdGhleSBhcmUKLSAgICAgKiBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIERhdGVGb3JtYXQgd2l0aCB0aGUgc2FtZQotICAgICAqIHByb3BlcnRpZXMuCisgICAgICogQ29tcGFyZXMgdGhpcyBkYXRlIGZvcm1hdCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBpbmRpY2F0ZXMgaWYgdGhleQorICAgICAqIGFyZSBlcXVhbC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIERhdGVGb3JtYXQsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgZGF0ZSBmb3JtYXQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIG9iamVjdH0gaXMgYSB7QGNvZGUgRGF0ZUZvcm1hdH0gb2JqZWN0IGFuZAorICAgICAqICAgICAgICAgaXQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhpcyBkYXRlIGZvcm1hdDsge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTIxNSwyMyArNDEwLDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyIHVzaW5nIHRoZQotICAgICAqIHJ1bGVzIG9mIHRoaXMgRGF0ZUZvcm1hdC4gSWYgdGhlIGZpZWxkIHNwZWNpZmllZCBieSB0aGUgRmllbGRQb3NpdGlvbiBpcwotICAgICAqIGZvcm1hdHRlZCwgc2V0IHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4IG9mIHRoZSBmb3JtYXR0ZWQgZmllbGQgaW4gdGhlCi0gICAgICogRmllbGRQb3NpdGlvbi4KKyAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEgc3RyaW5nIHVzaW5nIHRoZSBwYXR0ZXJuIG9mIHRoaXMgZGF0ZQorICAgICAqIGZvcm1hdCBhbmQgYXBwZW5kcyB0aGUgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIGZpZWxkfSBtZW1iZXIgb2Yge0Bjb2RlIGZpZWxkfSBjb250YWlucyBhIHZhbHVlIHNwZWNpZnlpbmcKKyAgICAgKiBhIGZvcm1hdCBmaWVsZCwgdGhlbiBpdHMge0Bjb2RlIGJlZ2luSW5kZXh9IGFuZCB7QGNvZGUgZW5kSW5kZXh9IG1lbWJlcnMKKyAgICAgKiB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyBmaWVsZAorICAgICAqIGluIHRoZSBmb3JtYXR0ZWQgdGV4dC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmb3JtYXQsIG11c3QgYmUgYSBEYXRlIG9yIGEgTnVtYmVyLiBJZiB0aGUKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCBpcyBhIE51bWJlciwgYSBEYXRlIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bG9uZ1ZhbHVlKCk8L2NvZGU+IG9mIHRoZSBOdW1iZXIuCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9iamVjdCB0byBmb3JtYXQsIG11c3QgYmUgYSB7QGNvZGUgRGF0ZX0gb3IgYQorICAgICAqICAgICAgICAgICAge0Bjb2RlIE51bWJlcn0uIElmIHtAY29kZSBvYmplY3R9IGlzIGEgbnVtYmVyIHRoZW4gYSBkYXRlIGlzCisgICAgICogICAgICAgICAgICBjb25zdHJ1Y3RlZCB1c2luZyB0aGUge0Bjb2RlIGxvbmdWYWx1ZSgpfSBvZiB0aGUgbnVtYmVyLgogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgdG8uCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgRmllbGRQb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXIgPGNvZGU+YnVmZmVyPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgb24gaW5wdXQ6IGFuIG9wdGlvbmFsIGFsaWdubWVudCBmaWVsZDsgb24gb3V0cHV0OiB0aGUgb2Zmc2V0cworICAgICAqICAgICAgICAgICAgb2YgdGhlIGFsaWdubWVudCBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBub3QgYSBEYXRlIG9yIGEgTnVtYmVyCisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIG9iamVjdH0gaXMgbmVpdGhlciBhIHtAY29kZSBEYXRlfSBub3IgYQorICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSBOdW1iZXJ9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0KE9iamVjdCBvYmplY3QsIFN0cmluZ0J1ZmZlciBidWZmZXIsCkBAIC0yNDcsMTEgKzQ0OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBEYXRlIHVzaW5nIHRoZSBydWxlcyBvZiB0aGlzIERhdGVGb3JtYXQuCisgICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIGRhdGUgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgZGF0ZSBmb3JtYXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRlIHRvIGZvcm1hdAotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRlIHRvIGZvcm1hdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZm9ybWF0KERhdGUgZGF0ZSkgewogICAgICAgICByZXR1cm4gZm9ybWF0KGRhdGUsIG5ldyBTdHJpbmdCdWZmZXIoKSwgbmV3IEZpZWxkUG9zaXRpb24oMCkpCkBAIC0yNTksNTcgKzQ2MSw3MSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBEYXRlIGludG8gdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgdXNpbmcgdGhlCi0gICAgICogcnVsZXMgb2YgdGhpcyBEYXRlRm9ybWF0LiBJZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IHRoZSBGaWVsZFBvc2l0aW9uIGlzCi0gICAgICogZm9ybWF0dGVkLCBzZXQgdGhlIGJlZ2luIGFuZCBlbmQgaW5kZXggb2YgdGhlIGZvcm1hdHRlZCBmaWVsZCBpbiB0aGUKLSAgICAgKiBGaWVsZFBvc2l0aW9uLgorICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBkYXRlIGFzIGEgc3RyaW5nIHVzaW5nIHRoZSBwYXR0ZXJuIG9mIHRoaXMgZGF0ZQorICAgICAqIGZvcm1hdCBhbmQgYXBwZW5kcyB0aGUgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIGZpZWxkfSBtZW1iZXIgb2Yge0Bjb2RlIGZpZWxkfSBjb250YWlucyBhIHZhbHVlIHNwZWNpZnlpbmcKKyAgICAgKiBhIGZvcm1hdCBmaWVsZCwgdGhlbiBpdHMge0Bjb2RlIGJlZ2luSW5kZXh9IGFuZCB7QGNvZGUgZW5kSW5kZXh9IG1lbWJlcnMKKyAgICAgKiB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyBmaWVsZAorICAgICAqIGluIHRoZSBmb3JtYXR0ZWQgdGV4dC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRlIHRvIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGRhdGUgdG8gZm9ybWF0LgogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgdG8uCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgRmllbGRQb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXIgPGNvZGU+YnVmZmVyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgb24gaW5wdXQ6IGFuIG9wdGlvbmFsIGFsaWdubWVudCBmaWVsZDsgb24gb3V0cHV0OiB0aGUgb2Zmc2V0cworICAgICAqICAgICAgICAgICAgb2YgdGhlIGFsaWdubWVudCBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nQnVmZmVyIGZvcm1hdChEYXRlIGRhdGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsCiAgICAgICAgICAgICBGaWVsZFBvc2l0aW9uIGZpZWxkKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIExvY2FsZXMgd2hpY2ggc3VwcG9ydCBEYXRlRm9ybWF0LgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIGxvY2FsZXMgd2hpY2ggc3VwcG9ydCB7QGNvZGUgRGF0ZUZvcm1hdH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBMb2NhbGUKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGxvY2FsZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2NhbGVbXSBnZXRBdmFpbGFibGVMb2NhbGVzKCkgewogICAgICAgICByZXR1cm4gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDYWxlbmRhciB1c2VkIGJ5IHRoaXMgRGF0ZUZvcm1hdC4KKyAgICAgKiBSZXR1cm5zIHRoZSBjYWxlbmRhciB1c2VkIGJ5IHRoaXMge0Bjb2RlIERhdGVGb3JtYXR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBDYWxlbmRhcgorICAgICAqIEByZXR1cm4gdGhlIGNhbGVuZGFyIHVzZWQgYnkgdGhpcyBkYXRlIGZvcm1hdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXIoKSB7CiAgICAgICAgIHJldHVybiBjYWxlbmRhcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRGF0ZUZvcm1hdCBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBpbiB0aGUKLSAgICAgKiBERUZBVUxUIHN0eWxlIGZvciB0aGUgZGVmYXVsdCBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBEYXRlRm9ybWF0fSBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBpbgorICAgICAqIHRoZSBERUZBVUxUIHN0eWxlIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERhdGVGb3JtYXQKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgRGF0ZUZvcm1hdH0gaW5zdGFuY2UgZm9yIHRoZSBkZWZhdWx0IHN0eWxlIGFuZCBsb2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRlRm9ybWF0IGdldERhdGVJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGdldERhdGVJbnN0YW5jZShERUZBVUxUKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRGF0ZUZvcm1hdCBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBpbiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgc3R5bGUgZm9yIHRoZSBkZWZhdWx0IExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGRhdGVzIGluCisgICAgICogdGhlIHNwZWNpZmllZCBzdHlsZSBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQKLSAgICAgKiBAcmV0dXJuIGEgRGF0ZUZvcm1hdAorICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciB7QGNvZGUgc3R5bGV9IGFuZCB0aGUgZGVmYXVsdAorICAgICAqICAgICAgICAgbG9jYWxlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0eWxlfSBpcyBub3Qgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yCisgICAgICogICAgICAgICAgICAgREVGQVVMVC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIERhdGVGb3JtYXQgZ2V0RGF0ZUluc3RhbmNlKGludCBzdHlsZSkgewogICAgICAgICBjaGVja0RhdGVTdHlsZShzdHlsZSk7CkBAIC0zMTcsMTQgKzUzMywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBEYXRlRm9ybWF0IGluc3RhbmNlIGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGRhdGVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBzdHlsZSBmb3IgdGhlIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBEYXRlRm9ybWF0fSBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBpbgorICAgICAqIHRoZSBzcGVjaWZpZWQgc3R5bGUgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiBTSE9SVCwgTUVESVVNLCBMT05HLCBGVUxMLCBvciBERUZBVUxULgogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgRGF0ZUZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHlsZX0gaXMgbm90IG9uZSBvZiBTSE9SVCwgTUVESVVNLCBMT05HLCBGVUxMLCBvcgorICAgICAqICAgICAgICAgICAgIERFRkFVTFQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciB7QGNvZGUgc3R5bGV9IGFuZAorICAgICAqICAgICAgICAge0Bjb2RlIGxvY2FsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRlRm9ybWF0IGdldERhdGVJbnN0YW5jZShpbnQgc3R5bGUsIExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgY2hlY2tEYXRlU3R5bGUoc3R5bGUpOwpAQCAtMzM0LDI1ICs1NTUsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRGF0ZUZvcm1hdCBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBhbmQgdGltZXMKLSAgICAgKiBpbiB0aGUgREVGQVVMVCBzdHlsZSBmb3IgdGhlIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgRGF0ZUZvcm1hdH0gaW5zdGFuY2UgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgZGF0ZXMKKyAgICAgKiBhbmQgdGltZSB2YWx1ZXMgaW4gdGhlIERFRkFVTFQgc3R5bGUgZm9yIHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgRGF0ZUZvcm1hdAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBEYXRlRm9ybWF0fSBpbnN0YW5jZSBmb3IgdGhlIGRlZmF1bHQgc3R5bGUgYW5kIGxvY2FsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIERhdGVGb3JtYXQgZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGdldERhdGVUaW1lSW5zdGFuY2UoREVGQVVMVCwgREVGQVVMVCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPkRhdGVGb3JtYXQ8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgZm9ybWF0dGluZyBhbmQKLSAgICAgKiBwYXJzaW5nIG9mIGJvdGggZGF0ZXMgYW5kIHRpbWVzIGluIHRoZSBtYW5uZXIgYXBwcm9wcmlhdGUgdG8gdGhlIGRlZmF1bHQKLSAgICAgKiBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBEYXRlRm9ybWF0fSBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBvZiBib3RoCisgICAgICogZGF0ZXMgYW5kIHRpbWUgdmFsdWVzIGluIHRoZSBtYW5uZXIgYXBwcm9wcmlhdGUgZm9yIHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0ZVN0eWxlCi0gICAgICogICAgICAgICAgICBvbmUgb2YgU0hPUlQsIE1FRElVTSwgTE9ORywgRlVMTCwgb3IgREVGQVVMVAorICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQuCiAgICAgICogQHBhcmFtIHRpbWVTdHlsZQotICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQKLSAgICAgKiBAcmV0dXJuIGEgRGF0ZUZvcm1hdAorICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciB7QGNvZGUgZGF0ZVN0eWxlfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSB0aW1lU3R5bGV9IGFuZCB0aGUgZGVmYXVsdCBsb2NhbGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZGF0ZVN0eWxlfSBvciB7QGNvZGUgdGltZVN0eWxlfSBpcyBub3Qgb25lIG9mCisgICAgICogICAgICAgICAgICAgU0hPUlQsIE1FRElVTSwgTE9ORywgRlVMTCwgb3IgREVGQVVMVC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIERhdGVGb3JtYXQgZ2V0RGF0ZVRpbWVJbnN0YW5jZShpbnQgZGF0ZVN0eWxlLAogICAgICAgICAgICAgaW50IHRpbWVTdHlsZSkgewpAQCAtMzYyLDE2ICs1ODgsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRGF0ZUZvcm1hdCBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBhbmQgdGltZXMKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlcyBmb3IgdGhlIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBEYXRlRm9ybWF0fSBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcworICAgICAqIGFuZCB0aW1lIHZhbHVlcyBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlcyBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGVTdHlsZQotICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiBTSE9SVCwgTUVESVVNLCBMT05HLCBGVUxMLCBvciBERUZBVUxULgogICAgICAqIEBwYXJhbSB0aW1lU3R5bGUKLSAgICAgKiAgICAgICAgICAgIG9uZSBvZiBTSE9SVCwgTUVESVVNLCBMT05HLCBGVUxMLCBvciBERUZBVUxUCisgICAgICogICAgICAgICAgICBvbmUgb2YgU0hPUlQsIE1FRElVTSwgTE9ORywgRlVMTCwgb3IgREVGQVVMVC4KICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgTG9jYWxlCi0gICAgICogQHJldHVybiBhIERhdGVGb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciB7QGNvZGUgZGF0ZVN0eWxlfSwKKyAgICAgKiAgICAgICAgIHtAY29kZSB0aW1lU3R5bGV9IGFuZCB7QGNvZGUgbG9jYWxlfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBkYXRlU3R5bGV9IG9yIHtAY29kZSB0aW1lU3R5bGV9IGlzIG5vdCBvbmUgb2YKKyAgICAgKiAgICAgICAgICAgICBTSE9SVCwgTUVESVVNLCBMT05HLCBGVUxMLCBvciBERUZBVUxULgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRGF0ZUZvcm1hdCBnZXREYXRlVGltZUluc3RhbmNlKGludCBkYXRlU3R5bGUsCiAgICAgICAgICAgICBpbnQgdGltZVN0eWxlLCBMb2NhbGUgbG9jYWxlKSB7CkBAIC0zODQsMTkgKzYxNSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBEYXRlRm9ybWF0IGluc3RhbmNlIGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGRhdGVzIGFuZCB0aW1lcwotICAgICAqIGluIHRoZSBTSE9SVCBzdHlsZSBmb3IgdGhlIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgRGF0ZUZvcm1hdH0gaW5zdGFuY2UgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgZGF0ZXMKKyAgICAgKiBhbmQgdGltZXMgaW4gdGhlIFNIT1JUIHN0eWxlIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERhdGVGb3JtYXQKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgRGF0ZUZvcm1hdH0gaW5zdGFuY2UgZm9yIHRoZSBTSE9SVCBzdHlsZSBhbmQgZGVmYXVsdAorICAgICAqICAgICAgICAgbG9jYWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRGF0ZUZvcm1hdCBnZXRJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGdldERhdGVUaW1lSW5zdGFuY2UoU0hPUlQsIFNIT1JUKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBOdW1iZXJGb3JtYXQgdXNlZCBieSB0aGlzIERhdGVGb3JtYXQuCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIE51bWJlckZvcm1hdH0gdXNlZCBieSB0aGlzIHtAY29kZSBEYXRlRm9ybWF0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgTnVtYmVyRm9ybWF0CisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIE51bWJlckZvcm1hdH0gdXNlZCBieSB0aGlzIGRhdGUgZm9ybWF0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOdW1iZXJGb3JtYXQgZ2V0TnVtYmVyRm9ybWF0KCkgewogICAgICAgICByZXR1cm4gbnVtYmVyRm9ybWF0OwpAQCAtNDI0LDIyICs2NTgsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRGF0ZUZvcm1hdCBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyB0aW1lcyBpbiB0aGUKLSAgICAgKiBERUZBVUxUIHN0eWxlIGZvciB0aGUgZGVmYXVsdCBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBEYXRlRm9ybWF0fSBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyB0aW1lCisgICAgICogdmFsdWVzIGluIHRoZSBERUZBVUxUIHN0eWxlIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERhdGVGb3JtYXQKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgRGF0ZUZvcm1hdH0gaW5zdGFuY2UgZm9yIHRoZSBkZWZhdWx0IHN0eWxlIGFuZCBsb2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRlRm9ybWF0IGdldFRpbWVJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGdldFRpbWVJbnN0YW5jZShERUZBVUxUKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRGF0ZUZvcm1hdCBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyB0aW1lcyBpbiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgc3R5bGUgZm9yIHRoZSBkZWZhdWx0IExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIHRpbWUKKyAgICAgKiB2YWx1ZXMgaW4gdGhlIHNwZWNpZmllZCBzdHlsZSBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQKLSAgICAgKiBAcmV0dXJuIGEgRGF0ZUZvcm1hdAorICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciB7QGNvZGUgc3R5bGV9IGFuZCB0aGUgZGVmYXVsdAorICAgICAqICAgICAgICAgbG9jYWxlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHN0eWxlfSBpcyBub3Qgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yCisgICAgICogICAgICAgICAgICAgREVGQVVMVC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIERhdGVGb3JtYXQgZ2V0VGltZUluc3RhbmNlKGludCBzdHlsZSkgewogICAgICAgICBjaGVja1RpbWVTdHlsZShzdHlsZSk7CkBAIC00NDcsMTQgKzY4NywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBEYXRlRm9ybWF0IGluc3RhbmNlIGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIHRpbWVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBzdHlsZSBmb3IgdGhlIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBEYXRlRm9ybWF0fSBpbnN0YW5jZSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyB0aW1lCisgICAgICogdmFsdWVzIGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqICAgICAgICAgICAgb25lIG9mIFNIT1JULCBNRURJVU0sIExPTkcsIEZVTEwsIG9yIERFRkFVTFQKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiBTSE9SVCwgTUVESVVNLCBMT05HLCBGVUxMLCBvciBERUZBVUxULgogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgRGF0ZUZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzdHlsZX0gaXMgbm90IG9uZSBvZiBTSE9SVCwgTUVESVVNLCBMT05HLCBGVUxMLCBvcgorICAgICAqICAgICAgICAgICAgIERFRkFVTFQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXR9IGluc3RhbmNlIGZvciB7QGNvZGUgc3R5bGV9IGFuZAorICAgICAqICAgICAgICAge0Bjb2RlIGxvY2FsZX0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRlRm9ybWF0IGdldFRpbWVJbnN0YW5jZShpbnQgc3R5bGUsIExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgY2hlY2tUaW1lU3R5bGUoc3R5bGUpOwpAQCAtNDY0LDIyICs3MDksMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBUaW1lWm9uZSBvZiB0aGUgQ2FsZW5kYXIgdXNlZCBieSB0aGlzIERhdGVGb3JtYXQuCisgICAgICogUmV0dXJucyB0aGUgdGltZSB6b25lIG9mIHRoaXMgZGF0ZSBmb3JtYXQncyBjYWxlbmRhci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgVGltZVpvbmUKKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lIHpvbmUgb2YgdGhlIGNhbGVuZGFyIHVzZWQgYnkgdGhpcyBkYXRlIGZvcm1hdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgVGltZVpvbmUgZ2V0VGltZVpvbmUoKSB7CiAgICAgICAgIHJldHVybiBjYWxlbmRhci5nZXRUaW1lWm9uZSgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiBjYWxlbmRhci5nZXRGaXJzdERheU9mV2VlaygpCkBAIC00OTAsMjQgKzcyOCwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIENhbGVuZGFyIHVzZWQgYnkgdGhpcyBEYXRlRm9ybWF0IGlzIGxlbmllbnQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGVuZGFyIHVzZWQgYnkgdGhpcyBkYXRlIGZvcm1hdCBpcyBsZW5pZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBDYWxlbmRhciBpcyBsZW5pZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2FsZW5kYXIgaXMgbGVuaWVudDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMZW5pZW50KCkgewogICAgICAgICByZXR1cm4gY2FsZW5kYXIuaXNMZW5pZW50KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2UgYSBEYXRlIGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMKLSAgICAgKiBEYXRlRm9ybWF0LgorICAgICAqIFBhcnNlcyBhIGRhdGUgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyB1c2luZyB0aGUgcnVsZXMgb2YgdGhpcyBkYXRlCisgICAgICogZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UKLSAgICAgKiBAcmV0dXJuIHRoZSBEYXRlIHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgRGF0ZX0gcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNpbmcuCiAgICAgICogQGV4Y2VwdGlvbiBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJzaW5nCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJzaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlIHBhcnNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcnNlUG9zaXRpb24gcG9zaXRpb24gPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKQEAgLTUyMSwzMiArNzYwLDU2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2UgYSBEYXRlIGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgc3RhcnRpbmcgYXQgdGhlIGluZGV4IHNwZWNpZmllZCBieQotICAgICAqIHRoZSBQYXJzZVBvc2l0aW9uLiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgKiBQYXJzZVBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkIHRleHQuCisgICAgICogUGFyc2VzIGEgZGF0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBzcGVjaWZpZWQKKyAgICAgKiBieSB7QGNvZGUgcG9zaXRpb259LiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgdGhlbiB0aGUgaW5kZXgKKyAgICAgKiBvZiB0aGUge0Bjb2RlIFBhcnNlUG9zaXRpb259IGlzIHVwZGF0ZWQgdG8gdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkCisgICAgICogdGV4dC4gT24gZXJyb3IsIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZSBlcnJvciBpbmRleCBvZiB7QGNvZGUKKyAgICAgKiBQYXJzZVBvc2l0aW9ufSBpcyBzZXQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBCeSBkZWZhdWx0LCBwYXJzaW5nIGlzIGxlbmllbnQ6IElmIHRoZSBpbnB1dCBpcyBub3QgaW4gdGhlIGZvcm0gdXNlZCBieQorICAgICAqIHRoaXMgb2JqZWN0J3MgZm9ybWF0IG1ldGhvZCBidXQgY2FuIHN0aWxsIGJlIHBhcnNlZCBhcyBhIGRhdGUsIHRoZW4gdGhlCisgICAgICogcGFyc2Ugc3VjY2VlZHMuIENsaWVudHMgbWF5IGluc2lzdCBvbiBzdHJpY3QgYWRoZXJlbmNlIHRvIHRoZSBmb3JtYXQgYnkKKyAgICAgKiBjYWxsaW5nIHtAY29kZSBzZXRMZW5pZW50KGZhbHNlKX0uCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCiAgICAgICogQHBhcmFtIHBvc2l0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgUGFyc2VQb3NpdGlvbiwgdXBkYXRlZCBvbiByZXR1cm4gd2l0aCB0aGUgaW5kZXggZm9sbG93aW5nCi0gICAgICogICAgICAgICAgICB0aGUgcGFyc2VkIHRleHQsIG9yIG9uIGVycm9yIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgZXJyb3IgaW5kZXggaXMgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBEYXRlIHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgICAqICAgICAgICAgICAgaW5wdXQvb3V0cHV0IHBhcmFtZXRlciwgc3BlY2lmaWVzIHRoZSBzdGFydCBpbmRleCBpbiB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgIHN0cmluZ30gZnJvbSB3aGVyZSB0byBzdGFydCBwYXJzaW5nLiBJZiBwYXJzaW5nIGlzIHN1Y2Nlc3NmdWwsCisgICAgICogICAgICAgICAgICBpdCBpcyB1cGRhdGVkIHdpdGggdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkIHRleHQ7IG9uCisgICAgICogICAgICAgICAgICBlcnJvciwgdGhlIGluZGV4IGlzIHVuY2hhbmdlZCBhbmQgdGhlIGVycm9yIGluZGV4IGlzIHNldCB0bworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlIHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIGFuCisgICAgICogICAgICAgICBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRGF0ZSBwYXJzZShTdHJpbmcgc3RyaW5nLCBQYXJzZVBvc2l0aW9uIHBvc2l0aW9uKTsKIAogICAgIC8qKgotICAgICAqIFBhcnNlIGEgRGF0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBzcGVjaWZpZWQgYnkKLSAgICAgKiB0aGUgUGFyc2VQb3NpdGlvbi4gSWYgdGhlIHN0cmluZyBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCB0aGUgaW5kZXggb2YgdGhlCi0gICAgICogUGFyc2VQb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZCB0ZXh0LgorICAgICAqIFBhcnNlcyBhIGRhdGUgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydGluZyBhdCB0aGUgaW5kZXggc3BlY2lmaWVkCisgICAgICogYnkge0Bjb2RlIHBvc2l0aW9ufS4gSWYgdGhlIHN0cmluZyBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkIHRoZW4gdGhlIGluZGV4CisgICAgICogb2YgdGhlIHtAY29kZSBQYXJzZVBvc2l0aW9ufSBpcyB1cGRhdGVkIHRvIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZAorICAgICAqIHRleHQuIE9uIGVycm9yLCB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUgZXJyb3IgaW5kZXggb2YKKyAgICAgKiB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gaXMgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCwgcGFyc2luZyBpcyBsZW5pZW50OiBJZiB0aGUgaW5wdXQgaXMgbm90IGluIHRoZSBmb3JtIHVzZWQgYnkKKyAgICAgKiB0aGlzIG9iamVjdCdzIGZvcm1hdCBtZXRob2QgYnV0IGNhbiBzdGlsbCBiZSBwYXJzZWQgYXMgYSBkYXRlLCB0aGVuIHRoZQorICAgICAqIHBhcnNlIHN1Y2NlZWRzLiBDbGllbnRzIG1heSBpbnNpc3Qgb24gc3RyaWN0IGFkaGVyZW5jZSB0byB0aGUgZm9ybWF0IGJ5CisgICAgICogY2FsbGluZyB7QGNvZGUgc2V0TGVuaWVudChmYWxzZSl9LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHBhcnNlCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgogICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIFBhcnNlUG9zaXRpb24sIHVwZGF0ZWQgb24gcmV0dXJuIHdpdGggdGhlIGluZGV4IGZvbGxvd2luZwotICAgICAqICAgICAgICAgICAgdGhlIHBhcnNlZCB0ZXh0LCBvciBvbiBlcnJvciB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGluZGV4IGlzIHNldCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkCi0gICAgICogQHJldHVybiB0aGUgRGF0ZSByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIG51bGwgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAgKiAgICAgICAgICAgIGlucHV0L291dHB1dCBwYXJhbWV0ZXIsIHNwZWNpZmllcyB0aGUgc3RhcnQgaW5kZXggaW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBzdHJpbmd9IGZyb20gd2hlcmUgdG8gc3RhcnQgcGFyc2luZy4gSWYgcGFyc2luZyBpcworICAgICAqICAgICAgICAgICAgc3VjY2Vzc2Z1bCwgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZAorICAgICAqICAgICAgICAgICAgdGV4dDsgb24gZXJyb3IsIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZSBlcnJvciBpbmRleAorICAgICAqICAgICAgICAgICAgaXMgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgZGF0ZSByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2luZywgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzCisgICAgICogICAgICAgICBhbiBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IHBhcnNlT2JqZWN0KFN0cmluZyBzdHJpbmcsIFBhcnNlUG9zaXRpb24gcG9zaXRpb24pIHsKQEAgLTU1NCw0MCArODE3LDQ4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgQ2FsZW5kYXIgdXNlZCBieSB0aGlzIERhdGVGb3JtYXQuCisgICAgICogU2V0cyB0aGUgY2FsZW5kYXIgdXNlZCBieSB0aGlzIGRhdGUgZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBDYWxlbmRhcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjYWxlbmRhci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDYWxlbmRhcihDYWxlbmRhciBjYWwpIHsKICAgICAgICAgY2FsZW5kYXIgPSBjYWw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBpZiB0aGUgQ2FsZW5kYXIgdXNlZCBieSB0aGlzIERhdGVGb3JtYXQgaXMgbGVuaWVudC4KKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgZGF0ZS90aW1lIHBhcnNpbmcgc2hhbGwgYmUgbGVuaWVudC4gV2l0aCBsZW5pZW50CisgICAgICogcGFyc2luZywgdGhlIHBhcnNlciBtYXkgdXNlIGhldXJpc3RpY3MgdG8gaW50ZXJwcmV0IGlucHV0cyB0aGF0IGRvIG5vdAorICAgICAqIHByZWNpc2VseSBtYXRjaCB0aGlzIG9iamVjdCdzIGZvcm1hdC4gV2l0aCBzdHJpY3QgcGFyc2luZywgaW5wdXRzIG11c3QKKyAgICAgKiBtYXRjaCB0aGlzIG9iamVjdCdzIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRydWUgdG8gc2V0IHRoZSBDYWxlbmRhciB0byBiZSBsZW5pZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBzZXQgdGhlIGNhbGVuZGFyIHRvIGJlIGxlbmllbnQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMZW5pZW50KGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgY2FsZW5kYXIuc2V0TGVuaWVudCh2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgTnVtYmVyRm9ybWF0IHVzZWQgYnkgdGhpcyBEYXRlRm9ybWF0LgorICAgICAqIFNldHMgdGhlIHtAY29kZSBOdW1iZXJGb3JtYXR9IHVzZWQgYnkgdGhpcyBkYXRlIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICB0aGUgTnVtYmVyRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbmV3IG51bWJlciBmb3JtYXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TnVtYmVyRm9ybWF0KE51bWJlckZvcm1hdCBmb3JtYXQpIHsKICAgICAgICAgbnVtYmVyRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFRpbWVab25lIG9mIHRoZSBDYWxlbmRhciB1c2VkIGJ5IHRoaXMgRGF0ZUZvcm1hdC4KKyAgICAgKiBTZXRzIHRoZSB0aW1lIHpvbmUgb2YgdGhlIGNhbGVuZGFyIHVzZWQgYnkgdGhpcyBkYXRlIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGltZXpvbmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBUaW1lWm9uZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0aW1lIHpvbmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoVGltZVpvbmUgdGltZXpvbmUpIHsKICAgICAgICAgY2FsZW5kYXIuc2V0VGltZVpvbmUodGltZXpvbmUpOwpAQCAtNTk1LDEyICs4NjYsMTMgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBpbnN0YW5jZXMgb2YgdGhpcyBpbm5lciBjbGFzcyBhcmUgdXNlZCBhcyBhdHRyaWJ1dGUga2V5cyBhbmQgdmFsdWVzCi0gICAgICogaW4gQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRoYXQKLSAgICAgKiBTaW1wbGVEYXRlRm9ybWF0LmZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoKSBtZXRob2QgcmV0dXJucy4KKyAgICAgKiBpbiB7QGNvZGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfSB0aGF0IHRoZQorICAgICAqIHtAbGluayBTaW1wbGVEYXRlRm9ybWF0I2Zvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoT2JqZWN0KX0gbWV0aG9kIHJldHVybnMuCiAgICAgICogPHA+Ci0gICAgICogVGhlcmUgaXMgbm8gcHVibGljIGNvbnN0cnVjdG9yIHRvIHRoaXMgY2xhc3MsIHRoZSBvbmx5IGluc3RhbmNlcyBhcmUgdGhlCisgICAgICogVGhlcmUgaXMgbm8gcHVibGljIGNvbnN0cnVjdG9yIGluIHRoaXMgY2xhc3MsIHRoZSBvbmx5IGluc3RhbmNlcyBhcmUgdGhlCiAgICAgICogY29uc3RhbnRzIGRlZmluZWQgaGVyZS4KLSAgICAgKiA8cD4KKyAgICAgKiA8L3A+CisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZCBleHRlbmRzIEZvcm1hdC5GaWVsZCB7CiAKQEAgLTYxMCwxMTIgKzg4MiwxNTIgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogTWFya3MgdGhlIGVyYSBwYXJ0IG9mIGEgZGF0ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGaWVsZCBFUkEgPSBuZXcgRmllbGQoImVyYSIsIENhbGVuZGFyLkVSQSk7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICAvKioKICAgICAgICAgICogTWFya3MgdGhlIHllYXIgcGFydCBvZiBhIGRhdGUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRmllbGQgWUVBUiA9IG5ldyBGaWVsZCgieWVhciIsIENhbGVuZGFyLllFQVIpOyAvLyROT04tTkxTLTEkCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE1hcmtzIHRoZSBtb250aCBwYXJ0IG9mIGEgZGF0ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGaWVsZCBNT05USCA9IG5ldyBGaWVsZCgibW9udGgiLCBDYWxlbmRhci5NT05USCk7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICAvKioKICAgICAgICAgICogTWFya3MgdGhlIGhvdXIgb2YgdGhlIGRheSBwYXJ0IG9mIGEgZGF0ZSAoMC0xMSkuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRmllbGQgSE9VUl9PRl9EQVkwID0gbmV3IEZpZWxkKCJob3VyIG9mIGRheSIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICBDYWxlbmRhci5IT1VSX09GX0RBWSk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE1hcmtzIHRoZSBob3VyIG9mIHRoZSBkYXkgcGFydCBvZiBhIGRhdGUgKDEtMTIpLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIEhPVVJfT0ZfREFZMSA9IG5ldyBGaWVsZCgiaG91ciBvZiBkYXkgMSIsIC0xKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgbWludXRlIHBhcnQgb2YgYSB0aW1lLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIE1JTlVURSA9IG5ldyBGaWVsZCgibWludXRlIiwgQ2FsZW5kYXIuTUlOVVRFKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgc2Vjb25kIHBhcnQgb2YgYSB0aW1lLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIFNFQ09ORCA9IG5ldyBGaWVsZCgic2Vjb25kIiwgQ2FsZW5kYXIuU0VDT05EKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgbWlsbGlzZWNvbmQgcGFydCBvZiBhIHRpbWUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRmllbGQgTUlMTElTRUNPTkQgPSBuZXcgRmllbGQoIm1pbGxpc2Vjb25kIiwgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIENhbGVuZGFyLk1JTExJU0VDT05EKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogTWFya3MgdGhlIGRheSBvZiB0aGUgd2VlayBwYXJ0IG9mIGEgZGF0ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGaWVsZCBEQVlfT0ZfV0VFSyA9IG5ldyBGaWVsZCgiZGF5IG9mIHdlZWsiLCAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgQ2FsZW5kYXIuREFZX09GX1dFRUspOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgZGF5IG9mIHRoZSBtb250aCBwYXJ0IG9mIGEgZGF0ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGaWVsZCBEQVlfT0ZfTU9OVEggPSBuZXcgRmllbGQoImRheSBvZiBtb250aCIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICBDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgZGF5IG9mIHRoZSB5ZWFyIHBhcnQgb2YgYSBkYXRlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIERBWV9PRl9ZRUFSID0gbmV3IEZpZWxkKCJkYXkgb2YgeWVhciIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICBDYWxlbmRhci5EQVlfT0ZfWUVBUik7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE1hcmtzIHRoZSBkYXkgb2YgdGhlIHdlZWsgaW4gdGhlIG1vbnRoIHBhcnQgb2YgYSBkYXRlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIERBWV9PRl9XRUVLX0lOX01PTlRIID0gbmV3IEZpZWxkKAogICAgICAgICAgICAgICAgICJkYXkgb2Ygd2VlayBpbiBtb250aCIsIENhbGVuZGFyLkRBWV9PRl9XRUVLX0lOX01PTlRIKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgd2VlayBvZiB0aGUgeWVhciBwYXJ0IG9mIGEgZGF0ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGaWVsZCBXRUVLX09GX1lFQVIgPSBuZXcgRmllbGQoIndlZWsgb2YgeWVhciIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICBDYWxlbmRhci5XRUVLX09GX1lFQVIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgd2VlayBvZiB0aGUgbW9udGggcGFydCBvZiBhIGRhdGUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRmllbGQgV0VFS19PRl9NT05USCA9IG5ldyBGaWVsZCgid2VlayBvZiBtb250aCIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICBDYWxlbmRhci5XRUVLX09GX01PTlRIKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogTWFya3MgdGhlIHRpbWUgaW5kaWNhdG9yIHBhcnQgb2YgYSBkYXRlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIEFNX1BNID0gbmV3IEZpZWxkKCJhbSBwbSIsIENhbGVuZGFyLkFNX1BNKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgaG91ciBwYXJ0IG9mIGEgZGF0ZSAoMC0xMSkuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRmllbGQgSE9VUjAgPSBuZXcgRmllbGQoImhvdXIiLCBDYWxlbmRhci5IT1VSKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgaG91ciBwYXJ0IG9mIGEgZGF0ZSAoMS0xMikuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRmllbGQgSE9VUjEgPSBuZXcgRmllbGQoImhvdXIgMSIsIC0xKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYXJrcyB0aGUgdGltZSB6b25lIHBhcnQgb2YgYSBkYXRlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIFRJTUVfWk9ORSA9IG5ldyBGaWVsZCgidGltZSB6b25lIiwgLTEpOyAvLyROT04tTkxTLTEkCiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBDYWxlbmRhciBmaWVsZCB0aGF0IHRoaXMgRmllbGQgcmVwcmVzZW50cy4KKyAgICAgICAgICogVGhlIGNhbGVuZGFyIGZpZWxkIHRoYXQgdGhpcyBmaWVsZCByZXByZXNlbnRzLgogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBpbnQgY2FsZW5kYXJGaWVsZCA9IC0xOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIERhdGVGb3JtYXQuRmllbGQgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgRGF0ZUZvcm1hdC5GaWVsZH0gd2l0aCB0aGUgZ2l2ZW4KICAgICAgICAgICogZmllbGROYW1lIGFuZCBjYWxlbmRhciBmaWVsZC4KLSAgICAgICAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgZmllbGQgbmFtZS4KLSAgICAgICAgICogQHBhcmFtIGNhbGVuZGFyRmllbGQgdGhlIGNhbGVuZGVyIGZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGZpZWxkTmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gY2FsZW5kYXJGaWVsZAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBjYWxlbmRhciBmaWVsZCB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgRmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGVuZGFyRmllbGQpIHsKICAgICAgICAgICAgIHN1cGVyKGZpZWxkTmFtZSk7CkBAIC03MjcsMjAgKzEwMzksMjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBDYWxlbmRhciBmaWVsZCB0aGlzIEZpZWxkIHJlcHJlc2VudHMKKyAgICAgICAgICogUmV0dXJucyB0aGUgQ2FsZW5kYXIgZmllbGQgdGhhdCB0aGlzIGZpZWxkIHJlcHJlc2VudHMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIGludCBjYWxlbmRhciBmaWVsZAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjYWxlbmRhciBmaWVsZC4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGdldENhbGVuZGFyRmllbGQoKSB7CiAgICAgICAgICAgICByZXR1cm4gY2FsZW5kYXJGaWVsZDsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBEYXRlRm9ybWF0LkZpZWxkIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gY2FsZW5kYXIgZmllbGQKKyAgICAgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIERhdGVGb3JtYXQuRmllbGR9IGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gY2FsZW5kYXIKKyAgICAgICAgICogZmllbGQuCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcGFyYW0gY2FsZW5kYXJGaWVsZAotICAgICAgICAgKiAgICAgICAgICAgIGEgY2FsZW5kYXIgZmllbGQgY29uc3RhbnQKLSAgICAgICAgICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIEZpZWxkIGZvciB0aGlzIGNhbGVuZGFyIGZpZWxkCisgICAgICAgICAqICAgICAgICAgICAgYSBjYWxlbmRhciBmaWVsZCBjb25zdGFudC4KKyAgICAgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXQuRmllbGR9IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgICAgICogICAgICAgICB7QGNvZGUgY2FsZW5kYXJGaWVsZH0uCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjYWxlbmRhckZpZWxkfSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlCisgICAgICAgICAqICAgICAgICAgICAgIGZpZWxkIGNvdW50IG9mIHtAY29kZSBDYWxlbmRhcn0uCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZCBvZkNhbGVuZGFyRmllbGQoaW50IGNhbGVuZGFyRmllbGQpIHsKICAgICAgICAgICAgIGlmIChjYWxlbmRhckZpZWxkIDwgMCB8fCBjYWxlbmRhckZpZWxkID49IENhbGVuZGFyLkZJRUxEX0NPVU5UKSB7CkBAIC03NTEsOCArMTA3MCwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNlcmlhbGl6YXRpb24gbWV0aG9kIHJlc29sdmUgaW5zdGFuY2VzIHRvIHRoZSBjb25zdGFudAotICAgICAgICAgKiBEYXRlRm9ybWF0LkZpZWxkIHZhbHVlcworICAgICAgICAgKiBSZXNvbHZlcyBpbnN0YW5jZXMgdGhhdCBhcmUgZGVzZXJpYWxpemVkIHRvIHRoZSBjb25zdGFudAorICAgICAgICAgKiB7QGNvZGUgRGF0ZUZvcm1hdC5GaWVsZH0gdmFsdWVzLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZmllbGQgb2JqZWN0LgorICAgICAgICAgKiBAdGhyb3dzIEludmFsaWRPYmplY3RFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlc29sdmluZyB0aGUgZmllbGQgb2JqZWN0LgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIEludmFsaWRPYmplY3RFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EYXRlRm9ybWF0U3ltYm9scy5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EYXRlRm9ybWF0U3ltYm9scy5qYXZhCmluZGV4IGU4NDMzMzQuLjIyYzc0ZTkgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHMuamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0RhdGVGb3JtYXRTeW1ib2xzLmphdmEKQEAgLTE0LDYgKzE0LDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTI5LDEwICs0MSw0NyBAQAogLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogaW1wb3J0IGNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlczsKIC8vIEVORCBhbmRyb2lkLWFkZGVkCi0KIC8qKgotICogRGF0ZUZvcm1hdFN5bWJvbHMgaG9sZHMgdGhlIFN0cmluZ3MgdXNlZCBpbiB0aGUgZm9ybWF0aW5nIGFuZCBwYXJzaW5nIG9mCi0gKiBkYXRlcyBhbmQgdGltZXMuCisgKiBFbmNhcHN1bGF0ZXMgbG9jYWxpemFibGUgZGF0ZS10aW1lIGZvcm1hdHRpbmcgZGF0YSwgc3VjaCBhcyB0aGUgbmFtZXMgb2YgdGhlCisgKiBtb250aHMsIHRoZSBuYW1lcyBvZiB0aGUgZGF5cyBvZiB0aGUgd2VlaywgYW5kIHRoZSB0aW1lIHpvbmUgZGF0YS4KKyAqIHtAY29kZSBEYXRlRm9ybWF0fSBhbmQge0Bjb2RlIFNpbXBsZURhdGVGb3JtYXR9IGJvdGggdXNlCisgKiB7QGNvZGUgRGF0ZUZvcm1hdFN5bWJvbHN9IHRvIGVuY2Fwc3VsYXRlIHRoaXMgaW5mb3JtYXRpb24uCisgKiA8cD4KKyAqIFR5cGljYWxseSB5b3Ugc2hvdWxkbid0IHVzZSB7QGNvZGUgRGF0ZUZvcm1hdFN5bWJvbHN9IGRpcmVjdGx5LiBSYXRoZXIsIHlvdQorICogYXJlIGVuY291cmFnZWQgdG8gY3JlYXRlIGEgZGF0ZS90aW1lIGZvcm1hdHRlciB3aXRoIHRoZSB7QGNvZGUgRGF0ZUZvcm1hdH0KKyAqIGNsYXNzJ3MgZmFjdG9yeSBtZXRob2RzOiB7QGNvZGUgZ2V0VGltZUluc3RhbmNlfSwge0Bjb2RlIGdldERhdGVJbnN0YW5jZX0sCisgKiBvciB7QGNvZGUgZ2V0RGF0ZVRpbWVJbnN0YW5jZX0uIFRoZXNlIG1ldGhvZHMgYXV0b21hdGljYWxseSBjcmVhdGUgYQorICoge0Bjb2RlIERhdGVGb3JtYXRTeW1ib2xzfSBmb3IgdGhlIGZvcm1hdHRlciBzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvLiBBZnRlcgorICogdGhlIGZvcm1hdHRlciBpcyBjcmVhdGVkLCB5b3UgbWF5IG1vZGlmeSBpdHMgZm9ybWF0IHBhdHRlcm4gdXNpbmcgdGhlCisgKiB7QGNvZGUgc2V0UGF0dGVybn0gbWV0aG9kLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyBmb3JtYXR0ZXJzCisgKiB1c2luZyB7QGNvZGUgRGF0ZUZvcm1hdH0ncyBmYWN0b3J5IG1ldGhvZHMsIHNlZSB7QGxpbmsgRGF0ZUZvcm1hdH0uCisgKiA8L3A+CisgKiA8cD4KKyAqIElmIHlvdSBkZWNpZGUgdG8gY3JlYXRlIGEgZGF0ZS90aW1lIGZvcm1hdHRlciB3aXRoIGEgc3BlY2lmaWMgZm9ybWF0IHBhdHRlcm4KKyAqIGZvciBhIHNwZWNpZmljIGxvY2FsZSwgeW91IGNhbiBkbyBzbyB3aXRoOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBuZXcgU2ltcGxlRGF0ZUZvcm1hdChhUGF0dGVybiwgbmV3IERhdGVGb3JtYXRTeW1ib2xzKGFMb2NhbGUpKS4KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIHtAY29kZSBEYXRlRm9ybWF0U3ltYm9sc30gb2JqZWN0cyBjYW4gYmUgY2xvbmVkLiBXaGVuIHlvdSBvYnRhaW4gYQorICoge0Bjb2RlIERhdGVGb3JtYXRTeW1ib2xzfSBvYmplY3QsIGZlZWwgZnJlZSB0byBtb2RpZnkgdGhlIGRhdGUvdGltZQorICogZm9ybWF0dGluZyBkYXRhLiBGb3IgaW5zdGFuY2UsIHlvdSBjYW4gcmVwbGFjZSB0aGUgbG9jYWxpemVkIGRhdGUvdGltZSBmb3JtYXQKKyAqIHBhdHRlcm4gY2hhcmFjdGVycyB3aXRoIHRoZSBvbmVzIHRoYXQgeW91IGZlZWwgZWFzeSB0byByZW1lbWJlciBvciB5b3UgY2FuCisgKiBjaGFuZ2UgdGhlIHJlcHJlc2VudGF0aXZlIGNpdGllcyB0byB5b3VyIGZhdm9yaXRlIG9uZXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIE5ldyB7QGNvZGUgRGF0ZUZvcm1hdFN5bWJvbHN9IHN1YmNsYXNzZXMgbWF5IGJlIGFkZGVkIHRvIHN1cHBvcnQKKyAqIHtAY29kZSBTaW1wbGVEYXRlRm9ybWF0fSBmb3IgZGF0ZS90aW1lIGZvcm1hdHRpbmcgZm9yIGFkZGl0aW9uYWwgbG9jYWxlcy4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBEYXRlRm9ybWF0CisgKiBAc2VlIFNpbXBsZURhdGVGb3JtYXQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGF0ZUZvcm1hdFN5bWJvbHMgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CiAKQEAgLTY0LDIxICsxMTMsMjQgQEAKICAgICAgICAgcmV0dXJuIHpvbmVTdHJpbmdzOyAgICAgICAKICAgICB9CiAvLyBFTkQgYW5kcm9pZC1hZGRlZAotICAgIAorCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEYXRlRm9ybWF0U3ltYm9scyBjb250YWluaW5nIHRoZSBzeW1ib2xzIGZvciB0aGUgZGVmYXVsdAotICAgICAqIExvY2FsZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRlRm9ybWF0U3ltYm9sc30gaW5zdGFuY2UgY29udGFpbmluZyB0aGUKKyAgICAgKiBzeW1ib2xzIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERhdGVGb3JtYXRTeW1ib2xzKCkgewogICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRGF0ZUZvcm1hdFN5bWJvbHMgY29udGFpbmluZyB0aGUgc3ltYm9scyBmb3IgdGhlCi0gICAgICogc3BlY2lmaWVkIExvY2FsZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEYXRlRm9ybWF0U3ltYm9sc30gaW5zdGFuY2UgY29udGFpbmluZyB0aGUKKyAgICAgKiBzeW1ib2xzIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgTG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEYXRlRm9ybWF0U3ltYm9scyhMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEZvcm1hdC5nZXRCdW5kbGUobG9jYWxlKTsKQEAgLTg5LDMzICsxNDEsMzQgQEAKICAgICAgICAgc2hvcnRNb250aHMgPSBidW5kbGUuZ2V0U3RyaW5nQXJyYXkoInNob3J0TW9udGhzIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgc2hvcnRXZWVrZGF5cyA9IGJ1bmRsZS5nZXRTdHJpbmdBcnJheSgic2hvcnRXZWVrZGF5cyIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHdlZWtkYXlzID0gYnVuZGxlLmdldFN0cmluZ0FycmF5KCJ3ZWVrZGF5cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAvLyB6b25lU3RyaW5ncyA9IChTdHJpbmdbXVtdKSBidW5kbGUuZ2V0T2JqZWN0KCJ0aW1lem9uZXMiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CiAgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgICAgICB9CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9Ci0vLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIERhdGVGb3JtYXRTeW1ib2xzIGFuZCBhbnN3ZXIgaWYKLSAgICAgKiB0aGV5IGFyZSBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIERhdGVGb3JtYXRTeW1ib2xzIHdpdGgKLSAgICAgKiB0aGUgc2FtZSBzeW1ib2xzLgorICAgICAqIENvbXBhcmVzIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGluZGljYXRlcyBpZiB0aGV5IGFyZQorICAgICAqIGVxdWFsLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgRGF0ZUZvcm1hdFN5bWJvbHMsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBvYmplY3R9IGlzIGFuIGluc3RhbmNlIG9mCisgICAgICogICAgICAgICB7QGNvZGUgRGF0ZUZvcm1hdFN5bWJvbHN9IGFuZCBoYXMgdGhlIHNhbWUgc3ltYm9scyBhcyB0aGlzCisgICAgICogICAgICAgICBvYmplY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTE0NywxOSArMjAwLDE2IEBACiAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyh3ZWVrZGF5cywgb2JqLndlZWtkYXlzKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgLy8gUXVpY2sgY2hlY2sgdGhhdCBtYXkga2VlcCB1cyBmcm9tIGhhdmluZyB0byBsb2FkIHRoZSB6b25lIHN0cmluZ3MuCiAgICAgICAgIGlmICh6b25lU3RyaW5ncyA9PSBudWxsICYmIG9iai56b25lU3RyaW5ncyA9PSBudWxsCiAgICAgICAgICAgICAgICAgICAgICYmICFsb2NhbGUuZXF1YWxzKG9iai5sb2NhbGUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB6b25lIHN0cmluZ3MgYXJlIGxvYWRlZC4KICAgICAgICAgaW50ZXJuYWxab25lU3RyaW5ncygpOwogICAgICAgICBvYmouaW50ZXJuYWxab25lU3RyaW5ncygpOwotLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAotCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgaWYgKHpvbmVTdHJpbmdzLmxlbmd0aCAhPSBvYmouem9uZVN0cmluZ3MubGVuZ3RoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTE3OCw5MyArMjI4LDEwMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFN0cmluZ3Mgd2hpY2ggcmVwcmVzZW50IEFNIGFuZCBQTS4gVXNlIHRoZSBDYWxlbmRhcgotICAgICAqIGNvbnN0YW50cyBDYWxlbmRhci5BTSBhbmQgQ2FsZW5kYXIuUE0gdG8gaW5kZXggaW50byB0aGUgYXJyYXkuCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCByZXByZXNlbnQgQU0gYW5kIFBNLiBVc2UgdGhlCisgICAgICoge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29uc3RhbnRzIHtAY29kZSBDYWxlbmRhci5BTX0gYW5kCisgICAgICoge0Bjb2RlIENhbGVuZGFyLlBNfSBhcyBpbmRpY2VzIGZvciB0aGUgYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEFtUG1TdHJpbmdzKCkgewogICAgICAgICByZXR1cm4gYW1wbXMuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBTdHJpbmdzIHdoaWNoIHJlcHJlc2VudCBCQyBhbmQgQUQuIFVzZSB0aGUgQ2FsZW5kYXIKLSAgICAgKiBjb25zdGFudHMgR3JlZ29yaWFuQ2FsZW5kYXIuQkMgYW5kIEdyZWdvcmlhbkNhbGVuZGFyLkFEIHRvIGluZGV4IGludG8gdGhlCi0gICAgICogYXJyYXkuCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCByZXByZXNlbnQgQkMgYW5kIEFELiBVc2UgdGhlCisgICAgICoge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29uc3RhbnRzIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhci5CQ30gYW5kCisgICAgICoge0Bjb2RlIEdyZWdvcmlhbkNhbGVuZGFyLkFEfSBhcyBpbmRpY2VzIGZvciB0aGUgYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEVyYXMoKSB7CiAgICAgICAgIHJldHVybiBlcmFzLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0dGVybiBjaGFyYWN0ZXJzIHVzZWQgYnkgU2ltcGxlRGF0ZUZvcm1hdCB0byBzcGVjaWZ5IGRhdGUKLSAgICAgKiBhbmQgdGltZSBmaWVsZHMuCisgICAgICogUmV0dXJucyB0aGUgcGF0dGVybiBjaGFyYWN0ZXJzIHVzZWQgYnkge0BsaW5rIFNpbXBsZURhdGVGb3JtYXR9IHRvCisgICAgICogc3BlY2lmeSBkYXRlIGFuZCB0aW1lIGZpZWxkcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm4gY2hhcmFjdGVycworICAgICAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcGF0dGVybiBjaGFyYWN0ZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXR0ZXJuQ2hhcnMoKSB7CiAgICAgICAgIHJldHVybiBsb2NhbFBhdHRlcm5DaGFyczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBTdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGZ1bGwgbmFtZXMgb2YgdGhlIG1vbnRocy4gVXNlCi0gICAgICogdGhlIENhbGVuZGFyIGNvbnN0YW50cyBDYWxlbmRhci5KQU5VQVJZLCBldGMuIHRvIGluZGV4IGludG8gdGhlIGFycmF5LgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZnVsbCBuYW1lcyBvZiB0aGUgbW9udGhzLiBVc2UKKyAgICAgKiB0aGUge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29uc3RhbnRzIHtAY29kZSBDYWxlbmRhci5KQU5VQVJZfSBldGMuIGFzCisgICAgICogaW5kaWNlcyBmb3IgdGhlIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb250aHMoKSB7CiAgICAgICAgIHJldHVybiBtb250aHMuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBTdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGFiYnJldmlhdGVkIG5hbWVzIG9mIHRoZQotICAgICAqIG1vbnRocy4gVXNlIHRoZSBDYWxlbmRhciBjb25zdGFudHMgQ2FsZW5kYXIuSkFOVUFSWSwgZXRjLiB0byBpbmRleCBpbnRvCi0gICAgICogdGhlIGFycmF5LgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlCisgICAgICogbW9udGhzLiBVc2UgdGhlIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9IGNvbnN0YW50cworICAgICAqIHtAY29kZSBDYWxlbmRhci5KQU5VQVJZfSBldGMuIGFzIGluZGljZXMgZm9yIHRoZSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZworICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2hvcnRNb250aHMoKSB7CiAgICAgICAgIHJldHVybiBzaG9ydE1vbnRocy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFN0cmluZ3MgY29udGFpbmluZyB0aGUgYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIGRheXMKLSAgICAgKiBvZiB0aGUgd2Vlay4gVXNlIHRoZSBDYWxlbmRhciBjb25zdGFudHMgQ2FsZW5kYXIuU1VOREFZLCBldGMuIHRvIGluZGV4Ci0gICAgICogaW50byB0aGUgYXJyYXkuCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgZGF5cworICAgICAqIG9mIHRoZSB3ZWVrLiBVc2UgdGhlIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9IGNvbnN0YW50cworICAgICAqIHtAY29kZSBDYWxlbmRhci5TVU5EQVl9IGV0Yy4gYXMgaW5kaWNlcyBmb3IgdGhlIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTaG9ydFdlZWtkYXlzKCkgewogICAgICAgICByZXR1cm4gc2hvcnRXZWVrZGF5cy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFN0cmluZ3MgY29udGFpbmluZyB0aGUgZnVsbCBuYW1lcyBvZiB0aGUgZGF5cyBvZiB0aGUKLSAgICAgKiB3ZWVrLiBVc2UgdGhlIENhbGVuZGFyIGNvbnN0YW50cyBDYWxlbmRhci5TVU5EQVksIGV0Yy4gdG8gaW5kZXggaW50byB0aGUKLSAgICAgKiBhcnJheS4KKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGZ1bGwgbmFtZXMgb2YgdGhlIGRheXMgb2YgdGhlCisgICAgICogd2Vlay4gVXNlIHRoZSB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfSBjb25zdGFudHMKKyAgICAgKiB7QGNvZGUgQ2FsZW5kYXIuU1VOREFZfSBldGMuIGFzIGluZGljZXMgZm9yIHRoZSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZworICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0V2Vla2RheXMoKSB7CiAgICAgICAgIHJldHVybiB3ZWVrZGF5cy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBTdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZQotICAgICAqIHRpbWV6b25lcy4gRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBhbiBhcnJheSBvZiBmaXZlIFN0cmluZ3MsIHRoZQotICAgICAqIGZpcnN0IGlzIGEgVGltZVpvbmUgSUQsIGFuZCBzZWNvbmQgYW5kIHRoaXJkIGFyZSB0aGUgZnVsbCBhbmQgYWJicmV2aWF0ZWQKLSAgICAgKiB0aW1lem9uZSBuYW1lcyBmb3Igc3RhbmRhcmQgdGltZSwgYW5kIHRoZSBmb3VydGggYW5kIGZpZnRoIGFyZSB0aGUgZnVsbAorICAgICAqIFJldHVybnMgdGhlIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZQorICAgICAqIHRpbWUgem9uZXMuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgb2YgZml2ZSBzdHJpbmdzLCB0aGUKKyAgICAgKiBmaXJzdCBpcyBhIFRpbWVab25lIElELCB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmUgdGhlIGZ1bGwgYW5kIGFiYnJldmlhdGVkCisgICAgICogdGltZSB6b25lIG5hbWVzIGZvciBzdGFuZGFyZCB0aW1lLCBhbmQgdGhlIGZvdXJ0aCBhbmQgZmlmdGggYXJlIHRoZSBmdWxsCiAgICAgICogYW5kIGFiYnJldmlhdGVkIG5hbWVzIGZvciBkYXlsaWdodCB0aW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgb2YgU3RyaW5nCisgICAgICogQHJldHVybiBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXVtdIGdldFpvbmVTdHJpbmdzKCkgewotLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIFN0cmluZ1tdW10gem9uZVN0cmluZ3MgPSBpbnRlcm5hbFpvbmVTdHJpbmdzKCk7Ci0vLyBFTkQgYW5kcm9pZC1hZGRlZAotCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIFN0cmluZ1tdW10gY2xvbmUgPSBuZXcgU3RyaW5nW3pvbmVTdHJpbmdzLmxlbmd0aF1bXTsKICAgICAgICAgZm9yIChpbnQgaSA9IHpvbmVTdHJpbmdzLmxlbmd0aDsgLS1pID49IDA7KSB7CiAgICAgICAgICAgICBjbG9uZVtpXSA9IHpvbmVTdHJpbmdzW2ldLmNsb25lKCk7CkBAIC0yNzIsMTQgKzMzMSw2IEBACiAgICAgICAgIHJldHVybiBjbG9uZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBpbnQgaGFzaENvZGU7CkBAIC0zMDIsMTEgKzM1Myw5IEBACiAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiB3ZWVrZGF5cykgewogICAgICAgICAgICAgaGFzaENvZGUgKz0gZWxlbWVudC5oYXNoQ29kZSgpOwogICAgICAgICB9Ci0KLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICBTdHJpbmdbXVtdIHpvbmVTdHJpbmdzID0gaW50ZXJuYWxab25lU3RyaW5ncygpOwotLy8gRU5EIGFuZHJvaWQtYWRkZWQKLSAgICAgICAgCisgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGZvciAoU3RyaW5nW10gZWxlbWVudCA6IHpvbmVTdHJpbmdzKSB7CiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICBoYXNoQ29kZSArPSBlbGVtZW50W2pdLmhhc2hDb2RlKCk7CkBAIC0zMTYsMzcgKzM2NSwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFycmF5IG9mIFN0cmluZ3Mgd2hpY2ggcmVwcmVzZW50IEFNIGFuZCBQTS4gVXNlIHRoZSBDYWxlbmRhcgotICAgICAqIGNvbnN0YW50cyBDYWxlbmRhci5BTSBhbmQgQ2FsZW5kYXIuUE0gdG8gaW5kZXggaW50byB0aGUgYXJyYXkuCisgICAgICogU2V0cyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCByZXByZXNlbnQgQU0gYW5kIFBNLiBVc2UgdGhlCisgICAgICoge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29uc3RhbnRzIHtAY29kZSBDYWxlbmRhci5BTX0gYW5kCisgICAgICoge0Bjb2RlIENhbGVuZGFyLlBNfSBhcyBpbmRpY2VzIGZvciB0aGUgYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBTdHJpbmdzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBmb3IgQU0gYW5kIFBNLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFtUG1TdHJpbmdzKFN0cmluZ1tdIGRhdGEpIHsKICAgICAgICAgYW1wbXMgPSBkYXRhLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJyYXkgb2YgU3RyaW5ncyB3aGljaCByZXByZXNlbnQgQkMgYW5kIEFELiBVc2UgdGhlIENhbGVuZGFyCi0gICAgICogY29uc3RhbnRzIEdyZWdvcmlhbkNhbGVuZGFyLkJDIGFuZCBHcmVnb3JpYW5DYWxlbmRhci5BRCB0byBpbmRleCBpbnRvIHRoZQotICAgICAqIGFycmF5LgorICAgICAqIFNldHMgdGhlIGFycmF5IG9mIFN0cmluZ3Mgd2hpY2ggcmVwcmVzZW50IEJDIGFuZCBBRC4gVXNlIHRoZQorICAgICAqIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9IGNvbnN0YW50cyB7QGNvZGUgR3JlZ29yaWFuQ2FsZW5kYXIuQkN9IGFuZAorICAgICAqIHtAY29kZSBHcmVnb3JpYW5DYWxlbmRhci5BRH0gYXMgaW5kaWNlcyBmb3IgdGhlIGFycmF5LgogICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgU3RyaW5ncworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIEJDIGFuZCBBRC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFcmFzKFN0cmluZ1tdIGRhdGEpIHsKICAgICAgICAgZXJhcyA9IGRhdGEuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXR0ZXJuIGNoYXJhY3RlcnMgdXNlZCBieSBTaW1wbGVEYXRlRm9ybWF0IHRvIHNwZWNpZnkgZGF0ZSBhbmQKLSAgICAgKiB0aW1lIGZpZWxkcy4KKyAgICAgKiBTZXRzIHRoZSBwYXR0ZXJuIGNoYXJhY3RlcnMgdXNlZCBieSB7QGxpbmsgU2ltcGxlRGF0ZUZvcm1hdH0gdG8gc3BlY2lmeQorICAgICAqIGRhdGUgYW5kIHRpbWUgZmllbGRzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm4gY2hhcmFjdGVycwotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBkYXRhIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgcGF0dGVybiBjaGFyYWN0ZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2FsUGF0dGVybkNoYXJzKFN0cmluZyBkYXRhKSB7CiAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKQEAgLTM1Niw2OCArNDA2LDc0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJyYXkgb2YgU3RyaW5ncyBjb250YWluaW5nIHRoZSBmdWxsIG5hbWVzIG9mIHRoZSBtb250aHMuIFVzZQotICAgICAqIHRoZSBDYWxlbmRhciBjb25zdGFudHMgQ2FsZW5kYXIuSkFOVUFSWSwgZXRjLiB0byBpbmRleCBpbnRvIHRoZSBhcnJheS4KKyAgICAgKiBTZXRzIHRoZSBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGZ1bGwgbmFtZXMgb2YgdGhlIG1vbnRocy4gVXNlCisgICAgICogdGhlIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9IGNvbnN0YW50cyB7QGNvZGUgQ2FsZW5kYXIuSkFOVUFSWX0gZXRjLiBhcworICAgICAqIGluZGljZXMgZm9yIHRoZSBhcnJheS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFN0cmluZ3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1vbnRocyhTdHJpbmdbXSBkYXRhKSB7CiAgICAgICAgIG1vbnRocyA9IGRhdGEuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhcnJheSBvZiBTdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGFiYnJldmlhdGVkIG5hbWVzIG9mIHRoZSBtb250aHMuCi0gICAgICogVXNlIHRoZSBDYWxlbmRhciBjb25zdGFudHMgQ2FsZW5kYXIuSkFOVUFSWSwgZXRjLiB0byBpbmRleCBpbnRvIHRoZQotICAgICAqIGFycmF5LgorICAgICAqIFNldHMgdGhlIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIG1vbnRocy4KKyAgICAgKiBVc2UgdGhlIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9IGNvbnN0YW50cyB7QGNvZGUgQ2FsZW5kYXIuSkFOVUFSWX0KKyAgICAgKiBldGMuIGFzIGluZGljZXMgZm9yIHRoZSBhcnJheS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFN0cmluZ3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNob3J0TW9udGhzKFN0cmluZ1tdIGRhdGEpIHsKICAgICAgICAgc2hvcnRNb250aHMgPSBkYXRhLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJyYXkgb2YgU3RyaW5ncyBjb250YWluaW5nIHRoZSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgZGF5cyBvZgotICAgICAqIHRoZSB3ZWVrLiBVc2UgdGhlIENhbGVuZGFyIGNvbnN0YW50cyBDYWxlbmRhci5TVU5EQVksIGV0Yy4gdG8gaW5kZXggaW50bwotICAgICAqIHRoZSBhcnJheS4KKyAgICAgKiBTZXRzIHRoZSBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGFiYnJldmlhdGVkIG5hbWVzIG9mIHRoZSBkYXlzIG9mCisgICAgICogdGhlIHdlZWsuIFVzZSB0aGUge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29uc3RhbnRzCisgICAgICoge0Bjb2RlIENhbGVuZGFyLlNVTkRBWX0gZXRjLiBhcyBpbmRpY2VzIGZvciB0aGUgYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBTdHJpbmdzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFdlZWtkYXlzKFN0cmluZ1tdIGRhdGEpIHsKICAgICAgICAgc2hvcnRXZWVrZGF5cyA9IGRhdGEuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhcnJheSBvZiBTdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGZ1bGwgbmFtZXMgb2YgdGhlIGRheXMgb2YgdGhlCi0gICAgICogd2Vlay4gVXNlIHRoZSBDYWxlbmRhciBjb25zdGFudHMgQ2FsZW5kYXIuU1VOREFZLCBldGMuIHRvIGluZGV4IGludG8gdGhlCi0gICAgICogYXJyYXkuCisgICAgICogU2V0cyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBmdWxsIG5hbWVzIG9mIHRoZSBkYXlzIG9mIHRoZQorICAgICAqIHdlZWsuIFVzZSB0aGUge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29uc3RhbnRzCisgICAgICoge0Bjb2RlIENhbGVuZGFyLlNVTkRBWX0gZXRjLiBhcyBpbmRpY2VzIGZvciB0aGUgYXJyYXkuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBTdHJpbmdzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRXZWVrZGF5cyhTdHJpbmdbXSBkYXRhKSB7CiAgICAgICAgIHdlZWtkYXlzID0gZGF0YS5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBTdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZQotICAgICAqIHRpbWV6b25lcy4gRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBhbiBhcnJheSBvZiBmaXZlIFN0cmluZ3MsIHRoZQorICAgICAqIFNldHMgdGhlIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZQorICAgICAqIHRpbWUgem9uZXMuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgb2YgZml2ZSBzdHJpbmdzLCB0aGUKICAgICAgKiBmaXJzdCBpcyBhIFRpbWVab25lIElELCBhbmQgc2Vjb25kIGFuZCB0aGlyZCBhcmUgdGhlIGZ1bGwgYW5kIGFiYnJldmlhdGVkCi0gICAgICogdGltZXpvbmUgbmFtZXMgZm9yIHN0YW5kYXJkIHRpbWUsIGFuZCB0aGUgZm91cnRoIGFuZCBmaWZ0aCBhcmUgdGhlIGZ1bGwKKyAgICAgKiB0aW1lIHpvbmUgbmFtZXMgZm9yIHN0YW5kYXJkIHRpbWUsIGFuZCB0aGUgZm91cnRoIGFuZCBmaWZ0aCBhcmUgdGhlIGZ1bGwKICAgICAgKiBhbmQgYWJicmV2aWF0ZWQgbmFtZXMgZm9yIGRheWxpZ2h0IHRpbWUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHRoZSB0d28tZGltZW5zaW9uYWwgYXJyYXkgb2YgU3RyaW5ncworICAgICAqICAgICAgICAgICAgdGhlIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFpvbmVTdHJpbmdzKFN0cmluZ1tdW10gZGF0YSkgewogICAgICAgICB6b25lU3RyaW5ncyA9IGRhdGEuY2xvbmUoKTsKICAgICB9CiAKLS8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKLSAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEVuc3VyZSBpbnRlcm5hbCB6b25lIHN0cmluZ3MgYXJlIGluaXRpYWxpemVkIHRvIGVuc3VyZSBiYWNrd2FyZAogICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgpAQCAtNDI1LDUgKzQ4MSw1IEBACiAKICAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwogICAgIH0KLS8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKIH0KZGlmZiAtLWdpdCBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGVjaW1hbEZvcm1hdC5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0LmphdmEKaW5kZXggYjIyZjZhOS4uMzkzYTJlNSAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0LmphdmEKKysrIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0LmphdmEKQEAgLTE0LDYgKzE0LDE5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLgorLy8gVGhlIGljdSBpbXBsZW1lbnRhdGlvbiB1c2VkIHdhcyBjaGFuZ2VkIGZyb20gaWN1NGogdG8gaWN1NGpuaS4KKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTMyLDkgKzQ1LDUxOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBEZWNpbWFsRm9ybWF0IGlzIHVzZWQgdG8gZm9ybWF0IGFuZCBwYXJzZSBudW1iZXJzLCBib3RoIGludGVnZXJzIGFuZAotICogZnJhY3Rpb25zLCBiYXNlZCBvbiBhIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIGNoYXJhY3RlcnMgdXNlZCBjYW4gYmUgZWl0aGVyCi0gKiBsb2NhbGl6ZWQgb3Igbm9uLWxvY2FsaXplZC4KKyAqIEEgY29uY3JldGUgc3ViY2xhc3Mgb2Yge0BsaW5rIE51bWJlckZvcm1hdH0gdGhhdCBmb3JtYXRzIGRlY2ltYWwgbnVtYmVycy4gSXQKKyAqIGhhcyBhIHZhcmlldHkgb2YgZmVhdHVyZXMgZGVzaWduZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBwYXJzZSBhbmQgZm9ybWF0CisgKiBudW1iZXJzIGluIGFueSBsb2NhbGUsIGluY2x1ZGluZyBzdXBwb3J0IGZvciBXZXN0ZXJuLCBBcmFiaWMsIG9yIEluZGljCisgKiBkaWdpdHMuIEl0IGFsc28gc3VwcG9ydHMgZGlmZmVyZW50IGZsYXZvcnMgb2YgbnVtYmVycywgaW5jbHVkaW5nIGludGVnZXJzCisgKiAoIjEyMyIpLCBmaXhlZC1wb2ludCBudW1iZXJzICgiMTIzLjQiKSwgc2NpZW50aWZpYyBub3RhdGlvbiAoIjEuMjNFNCIpLAorICogcGVyY2VudGFnZXMgKCIxMiUiKSwgYW5kIGN1cnJlbmN5IGFtb3VudHMgKCIkMTIzIikuIEFsbCBvZiB0aGVzZSBmbGF2b3JzIGNhbgorICogYmUgZWFzaWx5IGxvY2FsaXplZC4KKyAqIDxwPgorICogPHN0cm9uZz5UaGlzIGlzIGFuIGVuaGFuY2VkIHZlcnNpb24gb2Yge0Bjb2RlIERlY2ltYWxGb3JtYXR9IHRoYXQgaXMgYmFzZWQgb24KKyAqIHRoZSBzdGFuZGFyZCB2ZXJzaW9uIGluIHRoZSBSSS4gTmV3IG9yIGNoYW5nZWQgZnVuY3Rpb25hbGl0eSBpcyBsYWJlbGVkCisgKiA8c3Ryb25nPjxmb250IGNvbG9yPSJyZWQiPk5FVzwvZm9udD48L3N0cm9uZz4uPC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIFRvIG9idGFpbiBhIHtAbGluayBOdW1iZXJGb3JtYXR9IGZvciBhIHNwZWNpZmljIGxvY2FsZSAoaW5jbHVkaW5nIHRoZSBkZWZhdWx0CisgKiBsb2NhbGUpLCBjYWxsIG9uZSBvZiB7QGNvZGUgTnVtYmVyRm9ybWF0fSdzIGZhY3RvcnkgbWV0aG9kcyBzdWNoIGFzCisgKiB7QGNvZGUgTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlfS4gRG8gbm90IGNhbGwgdGhlIHtAY29kZSBEZWNpbWFsRm9ybWF0fQorICogY29uc3RydWN0b3JzIGRpcmVjdGx5LCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBzaW5jZSB0aGUKKyAqIHtAbGluayBOdW1iZXJGb3JtYXR9IGZhY3RvcnkgbWV0aG9kcyBtYXkgcmV0dXJuIHN1YmNsYXNzZXMgb3RoZXIgdGhhbgorICoge0Bjb2RlIERlY2ltYWxGb3JtYXR9LiBJZiB5b3UgbmVlZCB0byBjdXN0b21pemUgdGhlIGZvcm1hdCBvYmplY3QsIGRvCisgKiBzb21ldGhpbmcgbGlrZSB0aGlzOiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIE51bWJlckZvcm1hdCBmID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKGxvYyk7CisgKiBpZiAoZiBpbnN0YW5jZW9mIERlY2ltYWxGb3JtYXQpIHsKKyAqICAgICAoKERlY2ltYWxGb3JtYXQpZikuc2V0RGVjaW1hbFNlcGFyYXRvckFsd2F5c1Nob3duKHRydWUpOworICogfQorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxoNT5FeGFtcGxlOjwvaDU+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIC8vIFByaW50IG91dCBhIG51bWJlciB1c2luZyB0aGUgbG9jYWxpemVkIG51bWJlciwgY3VycmVuY3ksCisgKiAvLyBhbmQgcGVyY2VudCBmb3JtYXQgZm9yIGVhY2ggbG9jYWxlCisgKiBMb2NhbGVbXSBsb2NhbGVzID0gTnVtYmVyRm9ybWF0LmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKKyAqIGRvdWJsZSBteU51bWJlciA9IC0xMjM0LjU2OworICogTnVtYmVyRm9ybWF0IGZvcm1hdDsKKyAqIGZvciAoaW50IGogPSAwOyBqICZsdDsgMzsgKytqKSB7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKCZxdW90O0ZPUk1BVCZxdW90Oyk7CisgKiAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBsb2NhbGVzLmxlbmd0aDsgKytpKSB7CisgKiAgICAgICAgIGlmIChsb2NhbGVzW2ldLmdldENvdW50cnkoKS5sZW5ndGgoKSA9PSAwKSB7CisgKiAgICAgICAgICAgICAvLyBTa2lwIGxhbmd1YWdlLW9ubHkgbG9jYWxlcworICogICAgICAgICAgICAgY29udGludWU7CisgKiAgICAgICAgIH0KKyAqICAgICAgICAgU3lzdGVtLm91dC5wcmludChsb2NhbGVzW2ldLmdldERpc3BsYXlOYW1lKCkpOworICogICAgICAgICBzd2l0Y2ggKGopIHsKKyAqICAgICAgICAgICAgIGNhc2UgMDoKKyAqICAgICAgICAgICAgICAgICBmb3JtYXQgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UobG9jYWxlc1tpXSk7CisgKiAgICAgICAgICAgICAgICAgYnJlYWs7CisgKiAgICAgICAgICAgICBjYXNlIDE6CisgKiAgICAgICAgICAgICAgICAgZm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldEN1cnJlbmN5SW5zdGFuY2UobG9jYWxlc1tpXSk7CisgKiAgICAgICAgICAgICAgICAgYnJlYWs7CisgKiAgICAgICAgICAgICBkZWZhdWx0OgorICogICAgICAgICAgICAgICAgIGZvcm1hdCA9IE51bWJlckZvcm1hdC5nZXRQZXJjZW50SW5zdGFuY2UobG9jYWxlc1tpXSk7CisgKiAgICAgICAgICAgICAgICAgYnJlYWs7CisgKiAgICAgICAgIH0KKyAqICAgICAgICAgdHJ5IHsKKyAqICAgICAgICAgICAgIC8vIEFzc3VtZSBmb3JtYXQgaXMgYSBEZWNpbWFsRm9ybWF0CisgKiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCZxdW90OzogJnF1b3Q7OyArICgoRGVjaW1hbEZvcm1hdClmb3JtYXQpLnRvUGF0dGVybigpICsgJnF1b3Q7IC0mZ3Q7ICZxdW90OworICogICAgICAgICAgICAgICAgICAgICArIGZvcm0uZm9ybWF0KG15TnVtYmVyKSk7CisgKiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgKiAgICAgICAgIH0KKyAqICAgICAgICAgdHJ5IHsKKyAqICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigmcXVvdDsgLSZndDsgJnF1b3Q7ICsgZm9ybWF0LnBhcnNlKGZvcm0uZm9ybWF0KG15TnVtYmVyKSkpOworICogICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgKiAgICAgICAgIH0KKyAqICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPGg0PlBhdHRlcm5zPC9oND4KKyAqIDxwPgorICogQSB7QGNvZGUgRGVjaW1hbEZvcm1hdH0gY29uc2lzdHMgb2YgYSA8ZW0+cGF0dGVybjwvZW0+IGFuZCBhIHNldCBvZgorICogPGVtPnN5bWJvbHM8L2VtPi4gVGhlIHBhdHRlcm4gbWF5IGJlIHNldCBkaXJlY3RseSB1c2luZworICoge0BsaW5rICNhcHBseVBhdHRlcm4oU3RyaW5nKX0sIG9yIGluZGlyZWN0bHkgdXNpbmcgb3RoZXIgQVBJIG1ldGhvZHMgd2hpY2gKKyAqIG1hbmlwdWxhdGUgYXNwZWN0cyBvZiB0aGUgcGF0dGVybiwgc3VjaCBhcyB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlcgorICogZGlnaXRzLiBUaGUgc3ltYm9scyBhcmUgc3RvcmVkIGluIGEge0BsaW5rIERlY2ltYWxGb3JtYXRTeW1ib2xzfSBvYmplY3QuIFdoZW4KKyAqIHVzaW5nIHRoZSB7QGxpbmsgTnVtYmVyRm9ybWF0fSBmYWN0b3J5IG1ldGhvZHMsIHRoZSBwYXR0ZXJuIGFuZCBzeW1ib2xzIGFyZQorICogcmVhZCBmcm9tIElDVSdzIGxvY2FsZSBkYXRhLgorICogPC9wPgorICogPGg0PlNwZWNpYWwgUGF0dGVybiBDaGFyYWN0ZXJzPC9oND4KKyAqIDxwPgorICogTWFueSBjaGFyYWN0ZXJzIGluIGEgcGF0dGVybiBhcmUgdGFrZW4gbGl0ZXJhbGx5OyB0aGV5IGFyZSBtYXRjaGVkIGR1cmluZworICogcGFyc2luZyBhbmQgYXJlIHdyaXR0ZW4gb3V0IHVuY2hhbmdlZCBkdXJpbmcgZm9ybWF0dGluZy4gT24gdGhlIG90aGVyIGhhbmQsCisgKiBzcGVjaWFsIGNoYXJhY3RlcnMgc3RhbmQgZm9yIG90aGVyIGNoYXJhY3RlcnMsIHN0cmluZ3MsIG9yIGNsYXNzZXMgb2YKKyAqIGNoYXJhY3RlcnMuIEZvciBleGFtcGxlLCB0aGUgJyMnIGNoYXJhY3RlciBpcyByZXBsYWNlZCBieSBhIGxvY2FsaXplZCBkaWdpdC4KKyAqIE9mdGVuIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIHBhdHRlcm4gY2hhcmFjdGVyOyBpbiB0aGUKKyAqIFUuUy4gbG9jYWxlLCB0aGUgJywnIGdyb3VwaW5nIGNoYXJhY3RlciBpcyByZXBsYWNlZCBieSAnLCcuIEhvd2V2ZXIsIHRoZQorICogcmVwbGFjZW1lbnQgaXMgc3RpbGwgaGFwcGVuaW5nLCBhbmQgaWYgdGhlIHN5bWJvbHMgYXJlIG1vZGlmaWVkLCB0aGUgZ3JvdXBpbmcKKyAqIGNoYXJhY3RlciBjaGFuZ2VzLiBTb21lIHNwZWNpYWwgY2hhcmFjdGVycyBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIHRoZQorICogZm9ybWF0dGVyIGJ5IHRoZWlyIHByZXNlbmNlOyBmb3IgZXhhbXBsZSwgaWYgdGhlIHBlcmNlbnQgY2hhcmFjdGVyIGlzIHNlZW4sCisgKiB0aGVuIHRoZSB2YWx1ZSBpcyBtdWx0aXBsaWVkIGJ5IDEwMCBiZWZvcmUgYmVpbmcgZGlzcGxheWVkLgorICogPC9wPgorICogPHA+CisgKiBUbyBpbnNlcnQgYSBzcGVjaWFsIGNoYXJhY3RlciBpbiBhIHBhdHRlcm4gYXMgYSBsaXRlcmFsLCB0aGF0IGlzLCB3aXRob3V0IGFueQorICogc3BlY2lhbCBtZWFuaW5nLCB0aGUgY2hhcmFjdGVyIG11c3QgYmUgcXVvdGVkLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zIHRvCisgKiB0aGlzIHdoaWNoIGFyZSBub3RlZCBiZWxvdy4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGNoYXJhY3RlcnMgbGlzdGVkIGhlcmUgYXJlIHVzZWQgaW4gbm9uLWxvY2FsaXplZCBwYXR0ZXJucy4gTG9jYWxpemVkCisgKiBwYXR0ZXJucyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycyB0YWtlbiBmcm9tIHRoaXMgZm9ybWF0dGVyJ3MKKyAqIHtAbGluayBEZWNpbWFsRm9ybWF0U3ltYm9sc30gb2JqZWN0IGluc3RlYWQsIGFuZCB0aGVzZSBjaGFyYWN0ZXJzIGxvc2UgdGhlaXIKKyAqIHNwZWNpYWwgc3RhdHVzLiBUd28gZXhjZXB0aW9ucyBhcmUgdGhlIGN1cnJlbmN5IHNpZ24gYW5kIHF1b3RlLCB3aGljaCBhcmUgbm90CisgKiBsb2NhbGl6ZWQuCisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4gPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiBzdW1tYXJ5PSJDaGFydAorICogc2hvd2luZyBzeW1ib2wsIGxvY2F0aW9uLCBsb2NhbGl6ZWQsIGFuZCBtZWFuaW5nLiI+CisgKiA8dHIgYmdjb2xvcj0iI2NjY2NmZiI+CisgKiA8dGggYWxpZ249ImxlZnQiPlN5bWJvbDwvdGg+CisgKiA8dGggYWxpZ249ImxlZnQiPkxvY2F0aW9uPC90aD4KKyAqIDx0aCBhbGlnbj0ibGVmdCI+TG9jYWxpemVkPzwvdGg+CisgKiA8dGggYWxpZ249ImxlZnQiPk1lYW5pbmc8L3RoPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249InRvcCI+CisgKiA8dGQ+e0Bjb2RlIDB9PC90ZD4KKyAqIDx0ZD5OdW1iZXI8L3RkPgorICogPHRkPlllczwvdGQ+CisgKiA8dGQ+RGlnaXQuPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiPgorICogPHRkPntAY29kZSBAfTwvdGQ+CisgKiA8dGQ+TnVtYmVyPC90ZD4KKyAqIDx0ZD5ObzwvdGQ+CisgKiA8dGQ+PHN0cm9uZz48Zm9udCBjb2xvcj0icmVkIj5ORVc8L2ZvbnQ+Jm5ic3A7PC9zdHJvbmc+IFNpZ25pZmljYW50CisgKiBkaWdpdC48L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2VlZWVmZiI+CisgKiA8dGQ+e0Bjb2RlICN9PC90ZD4KKyAqIDx0ZD5OdW1iZXI8L3RkPgorICogPHRkPlllczwvdGQ+CisgKiA8dGQ+RGlnaXQsIGxlYWRpbmcgemVyb2VzIGFyZSBub3Qgc2hvd24uPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiPgorICogPHRkPntAY29kZSAufTwvdGQ+CisgKiA8dGQ+TnVtYmVyPC90ZD4KKyAqIDx0ZD5ZZXM8L3RkPgorICogPHRkPkRlY2ltYWwgc2VwYXJhdG9yIG9yIG1vbmV0YXJ5IGRlY2ltYWwgc2VwYXJhdG9yLjwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD57QGNvZGUgLX08L3RkPgorICogPHRkPk51bWJlcjwvdGQ+CisgKiA8dGQ+WWVzPC90ZD4KKyAqIDx0ZD5NaW51cyBzaWduLjwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj0idG9wIj4KKyAqIDx0ZD57QGNvZGUgLH08L3RkPgorICogPHRkPk51bWJlcjwvdGQ+CisgKiA8dGQ+WWVzPC90ZD4KKyAqIDx0ZD5Hcm91cGluZyBzZXBhcmF0b3IuPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNlZWVlZmYiPgorICogPHRkPntAY29kZSBFfTwvdGQ+CisgKiA8dGQ+TnVtYmVyPC90ZD4KKyAqIDx0ZD5ZZXM8L3RkPgorICogPHRkPlNlcGFyYXRlcyBtYW50aXNzYSBhbmQgZXhwb25lbnQgaW4gc2NpZW50aWZpYyBub3RhdGlvbi4KKyAqIDxlbT5Eb2VzIG5vdCBuZWVkIHRvIGJlIHF1b3RlZCBpbiBwcmVmaXggb3Igc3VmZml4LjwvZW0+PC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiPgorICogPHRkPntAY29kZSArfTwvdGQ+CisgKiA8dGQ+RXhwb25lbnQ8L3RkPgorICogPHRkPlllczwvdGQ+CisgKiA8dGQ+PHN0cm9uZz48Zm9udCBjb2xvcj0icmVkIj5ORVc8L2ZvbnQ+Jm5ic3A7PC9zdHJvbmc+IFByZWZpeAorICogcG9zaXRpdmUgZXhwb25lbnRzIHdpdGggbG9jYWxpemVkIHBsdXMgc2lnbi4KKyAqIDxlbT5Eb2VzIG5vdCBuZWVkIHRvIGJlIHF1b3RlZCBpbiBwcmVmaXggb3Igc3VmZml4LjwvZW0+PC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNlZWVlZmYiPgorICogPHRkPntAY29kZSA7fTwvdGQ+CisgKiA8dGQ+U3VicGF0dGVybiBib3VuZGFyeTwvdGQ+CisgKiA8dGQ+WWVzPC90ZD4KKyAqIDx0ZD5TZXBhcmF0ZXMgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHN1YnBhdHRlcm5zLjwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj0idG9wIj4KKyAqIDx0ZD57QGNvZGUgJX08L3RkPgorICogPHRkPlByZWZpeCBvciBzdWZmaXg8L3RkPgorICogPHRkPlllczwvdGQ+CisgKiA8dGQ+TXVsdGlwbHkgYnkgMTAwIGFuZCBzaG93IGFzIHBlcmNlbnRhZ2UuPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNlZWVlZmYiPgorICogPHRkPntAY29kZSBcdTIwMzB9ICh7QGNvZGUgJiM5Mjt1MjAzMH0pPC90ZD4KKyAqIDx0ZD5QcmVmaXggb3Igc3VmZml4PC90ZD4KKyAqIDx0ZD5ZZXM8L3RkPgorICogPHRkPk11bHRpcGx5IGJ5IDEwMDAgYW5kIHNob3cgYXMgcGVyIG1pbGxlLjwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj0idG9wIj4KKyAqIDx0ZD57QGNvZGUgJiMxNjQ7fSAoe0Bjb2RlICYjOTI7dTAwQTR9KTwvdGQ+CisgKiA8dGQ+UHJlZml4IG9yIHN1ZmZpeDwvdGQ+CisgKiA8dGQ+Tm88L3RkPgorICogPHRkPkN1cnJlbmN5IHNpZ24sIHJlcGxhY2VkIGJ5IGN1cnJlbmN5IHN5bWJvbC4gSWYgZG91YmxlZCwgcmVwbGFjZWQgYnkKKyAqIGludGVybmF0aW9uYWwgY3VycmVuY3kgc3ltYm9sLiBJZiBwcmVzZW50IGluIGEgcGF0dGVybiwgdGhlIG1vbmV0YXJ5IGRlY2ltYWwKKyAqIHNlcGFyYXRvciBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGRlY2ltYWwgc2VwYXJhdG9yLjwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD57QGNvZGUgJ308L3RkPgorICogPHRkPlByZWZpeCBvciBzdWZmaXg8L3RkPgorICogPHRkPk5vPC90ZD4KKyAqIDx0ZD5Vc2VkIHRvIHF1b3RlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIHByZWZpeCBvciBzdWZmaXgsIGZvciBleGFtcGxlLAorICoge0Bjb2RlICInIycjIn0gZm9ybWF0cyAxMjMgdG8ge0Bjb2RlICIjMTIzIn0uIFRvIGNyZWF0ZSBhIHNpbmdsZSBxdW90ZQorICogaXRzZWxmLCB1c2UgdHdvIGluIGEgcm93OiB7QGNvZGUgIiMgbycnY2xvY2sifS48L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249InRvcCI+CisgKiA8dGQ+e0Bjb2RlICp9PC90ZD4KKyAqIDx0ZD5QcmVmaXggb3Igc3VmZml4IGJvdW5kYXJ5PC90ZD4KKyAqIDx0ZD5ZZXM8L3RkPgorICogPHRkPjxzdHJvbmc+PGZvbnQgY29sb3I9InJlZCI+TkVXPC9mb250PiZuYnNwOzwvc3Ryb25nPiBQYWQgZXNjYXBlLAorICogcHJlY2VkZXMgcGFkIGNoYXJhY3Rlci4gPC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIEEge0Bjb2RlIERlY2ltYWxGb3JtYXR9IHBhdHRlcm4gY29udGFpbnMgYSBwb3N0aXZlIGFuZCBuZWdhdGl2ZSBzdWJwYXR0ZXJuLAorICogZm9yIGV4YW1wbGUsICIjLCMjMC4wMDsoIywjIzAuMDApIi4gRWFjaCBzdWJwYXR0ZXJuIGhhcyBhIHByZWZpeCwgYSBudW1lcmljCisgKiBwYXJ0IGFuZCBhIHN1ZmZpeC4gSWYgdGhlcmUgaXMgbm8gZXhwbGljaXQgbmVnYXRpdmUgc3VicGF0dGVybiwgdGhlIG5lZ2F0aXZlCisgKiBzdWJwYXR0ZXJuIGlzIHRoZSBsb2NhbGl6ZWQgbWludXMgc2lnbiBwcmVmaXhlZCB0byB0aGUgcG9zaXRpdmUgc3VicGF0dGVybi4KKyAqIFRoYXQgaXMsICIwLjAwIiBhbG9uZSBpcyBlcXVpdmFsZW50IHRvICIwLjAwOy0wLjAwIi4gSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQKKyAqIG5lZ2F0aXZlIHN1YnBhdHRlcm4sIGl0IHNlcnZlcyBvbmx5IHRvIHNwZWNpZnkgdGhlIG5lZ2F0aXZlIHByZWZpeCBhbmQKKyAqIHN1ZmZpeDsgdGhlIG51bWJlciBvZiBkaWdpdHMsIG1pbmltYWwgZGlnaXRzLCBhbmQgb3RoZXIgY2hhcmFjdGVyaXN0aWNzIGFyZQorICogaWdub3JlZCBpbiB0aGUgbmVnYXRpdmUgc3VicGF0dGVybi4gVGhpcyBtZWFucyB0aGF0ICIjLCMjMC4wIzsoIykiIHByb2R1Y2VzCisgKiBwcmVjaXNlbHkgdGhlIHNhbWUgcmVzdWx0IGFzICIjLCMjMC4wIzsoIywjIzAuMCMpIi4KKyAqIDxwPgorICogVGhlIHByZWZpeGVzLCBzdWZmaXhlcywgYW5kIHZhcmlvdXMgc3ltYm9scyB1c2VkIGZvciBpbmZpbml0eSwgZGlnaXRzLAorICogdGhvdXNhbmRzIHNlcGFyYXRvcnMsIGRlY2ltYWwgc2VwYXJhdG9ycywgZXRjLiBtYXkgYmUgc2V0IHRvIGFyYml0cmFyeQorICogdmFsdWVzLCBhbmQgdGhleSB3aWxsIGFwcGVhciBwcm9wZXJseSBkdXJpbmcgZm9ybWF0dGluZy4gSG93ZXZlciwgY2FyZSBtdXN0CisgKiBiZSB0YWtlbiB0aGF0IHRoZSBzeW1ib2xzIGFuZCBzdHJpbmdzIGRvIG5vdCBjb25mbGljdCwgb3IgcGFyc2luZyB3aWxsIGJlCisgKiB1bnJlbGlhYmxlLiBGb3IgZXhhbXBsZSwgZWl0aGVyIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcHJlZml4ZXMgb3IgdGhlCisgKiBzdWZmaXhlcyBtdXN0IGJlIGRpc3RpbmN0IGZvciB7QGxpbmsgI3BhcnNlfSB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisgKiBwb3NpdGl2ZSBmcm9tIG5lZ2F0aXZlIHZhbHVlcy4gQW5vdGhlciBleGFtcGxlIGlzIHRoYXQgdGhlIGRlY2ltYWwgc2VwYXJhdG9yCisgKiBhbmQgdGhvdXNhbmRzIHNlcGFyYXRvciBzaG91bGQgYmUgZGlzdGluY3QgY2hhcmFjdGVycywgb3IgcGFyc2luZyB3aWxsIGJlCisgKiBpbXBvc3NpYmxlLgorICogPHA+CisgKiBUaGUgPGVtPmdyb3VwaW5nIHNlcGFyYXRvcjwvZW0+IGlzIGEgY2hhcmFjdGVyIHRoYXQgc2VwYXJhdGVzIGNsdXN0ZXJzIG9mCisgKiBpbnRlZ2VyIGRpZ2l0cyB0byBtYWtlIGxhcmdlIG51bWJlcnMgbW9yZSBsZWdpYmxlLiBJdCBpcyBjb21tb25seSB1c2VkIGZvcgorICogdGhvdXNhbmRzLCBidXQgaW4gc29tZSBsb2NhbGVzIGl0IHNlcGFyYXRlcyB0ZW4tdGhvdXNhbmRzLiBUaGUgPGVtPmdyb3VwaW5nCisgKiBzaXplPC9lbT4KKyAqIGlzIHRoZSBudW1iZXIgb2YgZGlnaXRzIGJldHdlZW4gdGhlIGdyb3VwaW5nIHNlcGFyYXRvcnMsIHN1Y2ggYXMgMyBmb3IKKyAqICIxMDAsMDAwLDAwMCIgb3IgNCBmb3IgIjEgMDAwMCAwMDAwIi4gVGhlcmUgYXJlIGFjdHVhbGx5IHR3byBkaWZmZXJlbnQKKyAqIGdyb3VwaW5nIHNpemVzOiBPbmUgdXNlZCBmb3IgdGhlIGxlYXN0IHNpZ25pZmljYW50IGludGVnZXIgZGlnaXRzLCB0aGUKKyAqIDxlbT5wcmltYXJ5IGdyb3VwaW5nIHNpemU8L2VtPiwgYW5kIG9uZSB1c2VkIGZvciBhbGwgb3RoZXJzLCB0aGUKKyAqIDxlbT5zZWNvbmRhcnkgZ3JvdXBpbmcgc2l6ZTwvZW0+LiBJbiBtb3N0IGxvY2FsZXMgdGhlc2UgYXJlIHRoZSBzYW1lLCBidXQKKyAqIHNvbWV0aW1lcyB0aGV5IGFyZSBkaWZmZXJlbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJpbWFyeSBncm91cGluZyBpbnRlcnZhbAorICogaXMgMywgYW5kIHRoZSBzZWNvbmRhcnkgaXMgMiwgdGhlbiB0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBwYXR0ZXJuCisgKiAiIywjIywjIzAiLCBhbmQgdGhlIG51bWJlciAxMjM0NTY3ODkgaXMgZm9ybWF0dGVkIGFzICIxMiwzNCw1Niw3ODkiLiBJZiBhCisgKiBwYXR0ZXJuIGNvbnRhaW5zIG11bHRpcGxlIGdyb3VwaW5nIHNlcGFyYXRvcnMsIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHRoZSBsYXN0CisgKiBvbmUgYW5kIHRoZSBlbmQgb2YgdGhlIGludGVnZXIgZGVmaW5lcyB0aGUgcHJpbWFyeSBncm91cGluZyBzaXplLCBhbmQgdGhlCisgKiBpbnRlcnZhbCBiZXR3ZWVuIHRoZSBsYXN0IHR3byBkZWZpbmVzIHRoZSBzZWNvbmRhcnkgZ3JvdXBpbmcgc2l6ZS4gQWxsIG90aGVycworICogYXJlIGlnbm9yZWQsIHNvICIjLCMjLCMjIywjIyMjIiwgIiMjIywjIyMsIyMjIyIgYW5kICIjIywjLCMjIywjIyMjIiBwcm9kdWNlCisgKiB0aGUgc2FtZSByZXN1bHQuCisgKiA8cD4KKyAqIElsbGVnYWwgcGF0dGVybnMsIHN1Y2ggYXMgIiMuIy4jIiBvciAiIy4jIyMsIyMjIiwgd2lsbCBjYXVzZQorICoge0Bjb2RlIERlY2ltYWxGb3JtYXR9IHRvIHRocm93IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IHdpdGggYQorICogbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvYmxlbS4KKyAqIDxoND5QYXR0ZXJuIEJORjwvaDQ+CisgKiAKKyAqIDxwcmU+CisgKiBwYXR0ZXJuICAgIDo9IHN1YnBhdHRlcm4gKCc7JyBzdWJwYXR0ZXJuKT8KKyAqIHN1YnBhdHRlcm4gOj0gcHJlZml4PyBudW1iZXIgZXhwb25lbnQ/IHN1ZmZpeD8KKyAqIG51bWJlciAgICAgOj0gKGludGVnZXIgKCcuJyBmcmFjdGlvbik/KSB8IHNpZ0RpZ2l0cworICogcHJlZml4ICAgICA6PSAnXFx1MDAwMCcuLidcXHVGRkZEJyAtIHNwZWNpYWxDaGFyYWN0ZXJzCisgKiBzdWZmaXggICAgIDo9ICdcXHUwMDAwJy4uJ1xcdUZGRkQnIC0gc3BlY2lhbENoYXJhY3RlcnMKKyAqIGludGVnZXIgICAgOj0gJyMnKiAnMCcqICcwJworICogZnJhY3Rpb24gICA6PSAnMCcqICcjJyoKKyAqIHNpZ0RpZ2l0cyAgOj0gJyMnKiAnQCcgJ0AnKiAnIycqCisgKiBleHBvbmVudCAgIDo9ICdFJyAnKyc/ICcwJyogJzAnCisgKiBwYWRTcGVjICAgIDo9ICcqJyBwYWRDaGFyCisgKiBwYWRDaGFyICAgIDo9ICdcXHUwMDAwJy4uJ1xcdUZGRkQnIC0gcXVvdGUKKyAqICAKKyAqIE5vdGF0aW9uOgorICogICBYKiAgICAgICAwIG9yIG1vcmUgaW5zdGFuY2VzIG9mIFgKKyAqICAgWD8gICAgICAgMCBvciAxIGluc3RhbmNlcyBvZiBYCisgKiAgIFh8WSAgICAgIGVpdGhlciBYIG9yIFkKKyAqICAgQy4uRCAgICAgYW55IGNoYXJhY3RlciBmcm9tIEMgdXAgdG8gRCwgaW5jbHVzaXZlCisgKiAgIFMtVCAgICAgIGNoYXJhY3RlcnMgaW4gUywgZXhjZXB0IHRob3NlIGluIFQKKyAqIDwvcHJlPgorICogCisgKiBUaGUgZmlyc3Qgc3VicGF0dGVybiBpcyBmb3IgcG9zaXRpdmUgbnVtYmVycy4gVGhlIHNlY29uZCAob3B0aW9uYWwpCisgKiBzdWJwYXR0ZXJuIGlzIGZvciBuZWdhdGl2ZSBudW1iZXJzLgorICogPHA+CisgKiBOb3QgaW5kaWNhdGVkIGluIHRoZSBCTkYgc3ludGF4IGFib3ZlOgorICogPHVsPgorICogPGxpPlRoZSBncm91cGluZyBzZXBhcmF0b3IgJywnIGNhbiBvY2N1ciBpbnNpZGUgdGhlIGludGVnZXIgYW5kIHNpZ0RpZ2l0cworICogZWxlbWVudHMsIGJldHdlZW4gYW55IHR3byBwYXR0ZXJuIGNoYXJhY3RlcnMgb2YgdGhhdCBlbGVtZW50LCBhcyBsb25nIGFzIHRoZQorICogaW50ZWdlciBvciBzaWdEaWdpdHMgZWxlbWVudCBpcyBub3QgZm9sbG93ZWQgYnkgdGhlIGV4cG9uZW50IGVsZW1lbnQuCisgKiA8bGk+PGZvbnQgY29sb3I9InJlZCI+PHN0cm9uZz5ORVc8L3N0cm9uZz4mbmJzcDs8L2ZvbnQ+IFR3bworICogZ3JvdXBpbmcgaW50ZXJ2YWxzIGFyZSByZWNvZ25pemVkOiBUaGUgb25lIGJldHdlZW4gdGhlIGRlY2ltYWwgcG9pbnQgYW5kIHRoZQorICogZmlyc3QgZ3JvdXBpbmcgc3ltYm9sIGFuZCB0aGUgb25lIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgZ3JvdXBpbmcKKyAqIHN5bWJvbHMuIFRoZXNlIGludGVydmFscyBhcmUgaWRlbnRpY2FsIGluIG1vc3QgbG9jYWxlcywgYnV0IGluIHNvbWUgbG9jYWxlcworICogdGhleSBkaWZmZXIuIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybiAmcXVvdDsjLCMjLCMjIyZxdW90OyBmb3JtYXRzIHRoZSBudW1iZXIKKyAqIDEyMzQ1Njc4OSBhcyAmcXVvdDsxMiwzNCw1Niw3ODkmcXVvdDsuPC9saT4KKyAqIDxsaT4gPHN0cm9uZz48Zm9udCBjb2xvcj0icmVkIj5ORVc8L2ZvbnQ+Jm5ic3A7PC9zdHJvbmc+IFRoZSBwYWQKKyAqIHNwZWNpZmllciB7QGNvZGUgcGFkU3BlY30gbWF5IGFwcGVhciBiZWZvcmUgdGhlIHByZWZpeCwgYWZ0ZXIgdGhlIHByZWZpeCwKKyAqIGJlZm9yZSB0aGUgc3VmZml4LCBhZnRlciB0aGUgc3VmZml4IG9yIG5vdCBhdCBhbGwuCisgKiA8L3VsPgorICogPGg0PlBhcnNpbmc8L2g0PgorICogPHA+CisgKiB7QGNvZGUgRGVjaW1hbEZvcm1hdH0gcGFyc2VzIGFsbCBVbmljb2RlIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnQgZGVjaW1hbAorICogZGlnaXRzLCBhcyBkZWZpbmVkIGJ5IHtAbGluayBDaGFyYWN0ZXIjZGlnaXQoaW50LCBpbnQpfS4gSW4gYWRkaXRpb24sCisgKiB7QGNvZGUgRGVjaW1hbEZvcm1hdH0gYWxzbyByZWNvZ25pemVzIGFzIGRpZ2l0cyB0aGUgdGVuIGNvbnNlY3V0aXZlCisgKiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIHdpdGggdGhlIGxvY2FsaXplZCB6ZXJvIGRpZ2l0IGRlZmluZWQgaW4gdGhlCisgKiB7QGxpbmsgRGVjaW1hbEZvcm1hdFN5bWJvbHN9IG9iamVjdC4gRHVyaW5nIGZvcm1hdHRpbmcsIHRoZQorICoge0BsaW5rIERlY2ltYWxGb3JtYXRTeW1ib2xzfS1iYXNlZCBkaWdpdHMgYXJlIHdyaXR0ZW4gb3V0LgorICogPHA+CisgKiBEdXJpbmcgcGFyc2luZywgZ3JvdXBpbmcgc2VwYXJhdG9ycyBhcmUgaWdub3JlZC4KKyAqIDxwPgorICogSWYge0BsaW5rICNwYXJzZShTdHJpbmcsIFBhcnNlUG9zaXRpb24pfSBmYWlscyB0byBwYXJzZSBhIHN0cmluZywgaXQgcmV0dXJucworICoge0Bjb2RlIG51bGx9IGFuZCBsZWF2ZXMgdGhlIHBhcnNlIHBvc2l0aW9uIHVuY2hhbmdlZC4KKyAqIDxoND5Gb3JtYXR0aW5nPC9oND4KKyAqIDxwPgorICogRm9ybWF0dGluZyBpcyBndWlkZWQgYnkgc2V2ZXJhbCBwYXJhbWV0ZXJzLCBhbGwgb2Ygd2hpY2ggY2FuIGJlIHNwZWNpZmllZAorICogZWl0aGVyIHVzaW5nIGEgcGF0dGVybiBvciB1c2luZyB0aGUgQVBJLiBUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGFwcGxpZXMgdG8KKyAqIGZvcm1hdHMgdGhhdCBkbyBub3QgdXNlIDxhIGhyZWY9IiNzY2kiPnNjaWVudGlmaWMgbm90YXRpb248L2E+IG9yIDxhCisgKiBocmVmPSIjc2lnZGlnIj5zaWduaWZpY2FudCBkaWdpdHM8L2E+LgorICogPHVsPgorICogPGxpPklmIHRoZSBudW1iZXIgb2YgYWN0dWFsIGludGVnZXIgZGlnaXRzIGV4Y2VlZHMgdGhlCisgKiA8ZW0+bWF4aW11bSBpbnRlZ2VyIGRpZ2l0czwvZW0+LCB0aGVuIG9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cworICogYXJlIHNob3duLiBGb3IgZXhhbXBsZSwgMTk5NyBpcyBmb3JtYXR0ZWQgYXMgIjk3IiBpZiBtYXhpbXVtIGludGVnZXIgZGlnaXRzCisgKiBpcyBzZXQgdG8gMi4KKyAqIDxsaT5JZiB0aGUgbnVtYmVyIG9mIGFjdHVhbCBpbnRlZ2VyIGRpZ2l0cyBpcyBsZXNzIHRoYW4gdGhlCisgKiA8ZW0+bWluaW11bSBpbnRlZ2VyIGRpZ2l0czwvZW0+LCB0aGVuIGxlYWRpbmcgemVyb3MgYXJlIGFkZGVkLiBGb3IKKyAqIGV4YW1wbGUsIDE5OTcgaXMgZm9ybWF0dGVkIGFzICIwMTk5NyIgaWYgbWluaW11bSBpbnRlZ2VyIGRpZ2l0cyBpcyBzZXQgdG8gNS4KKyAqIDxsaT5JZiB0aGUgbnVtYmVyIG9mIGFjdHVhbCBmcmFjdGlvbiBkaWdpdHMgZXhjZWVkcyB0aGUgPGVtPm1heGltdW0KKyAqIGZyYWN0aW9uIGRpZ2l0czwvZW0+LAorICogdGhlbiBoYWxmLWV2ZW4gcm91bmRpbmcgaXMgcGVyZm9ybWVkIHRvIHRoZSBtYXhpbXVtIGZyYWN0aW9uIGRpZ2l0cy4gRm9yCisgKiBleGFtcGxlLCAwLjEyNSBpcyBmb3JtYXR0ZWQgYXMgIjAuMTIiIGlmIHRoZSBtYXhpbXVtIGZyYWN0aW9uIGRpZ2l0cyBpcyAyLgorICogPGxpPklmIHRoZSBudW1iZXIgb2YgYWN0dWFsIGZyYWN0aW9uIGRpZ2l0cyBpcyBsZXNzIHRoYW4gdGhlCisgKiA8ZW0+bWluaW11bSBmcmFjdGlvbiBkaWdpdHM8L2VtPiwgdGhlbiB0cmFpbGluZyB6ZXJvcyBhcmUgYWRkZWQuIEZvcgorICogZXhhbXBsZSwgMC4xMjUgaXMgZm9ybWF0dGVkIGFzICIwLjEyNTAiIGlmIHRoZSBtaW1pbXVtIGZyYWN0aW9uIGRpZ2l0cyBpcyBzZXQKKyAqIHRvIDQuCisgKiA8bGk+VHJhaWxpbmcgZnJhY3Rpb25hbCB6ZXJvcyBhcmUgbm90IGRpc3BsYXllZCBpZiB0aGV5IG9jY3VyIDxlbT5qPC9lbT4KKyAqIHBvc2l0aW9ucyBhZnRlciB0aGUgZGVjaW1hbCwgd2hlcmUgPGVtPmo8L2VtPiBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0KKyAqIGZyYWN0aW9uIGRpZ2l0cy4gRm9yIGV4YW1wbGUsIDAuMTAwMDQgaXMgZm9ybWF0dGVkIGFzICIwLjEiIGlmIHRoZSBtYXhpbXVtCisgKiBmcmFjdGlvbiBkaWdpdHMgaXMgZm91ciBvciBsZXNzLgorICogPC91bD4KKyAqIDxwPgorICogPHN0cm9uZz5TcGVjaWFsIFZhbHVlczwvc3Ryb25nPgorICogPHA+CisgKiB7QGNvZGUgTmFOfSBpcyByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHR5cGljYWxseQorICoge0Bjb2RlICYjOTI7dUZGRkR9LiBUaGlzIGNoYXJhY3RlciBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorICoge0BsaW5rIERlY2ltYWxGb3JtYXRTeW1ib2xzfSBvYmplY3QuIFRoaXMgaXMgdGhlIG9ubHkgdmFsdWUgZm9yIHdoaWNoIHRoZQorICogcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIGFyZSBub3QgdXNlZC4KKyAqIDxwPgorICogSW5maW5pdHkgaXMgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGUgY2hhcmFjdGVyLCB0eXBpY2FsbHkge0Bjb2RlICYjOTI7dTIyMUV9LAorICogd2l0aCB0aGUgcG9zaXRpdmUgb3IgbmVnYXRpdmUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIGFwcGxpZWQuIFRoZSBpbmZpbml0eQorICogY2hhcmFjdGVyIGlzIGRldGVybWluZWQgYnkgdGhlIHtAbGluayBEZWNpbWFsRm9ybWF0U3ltYm9sc30gb2JqZWN0LiA8YQorICogbmFtZT0ic2NpIj4KKyAqIDxoND5TY2llbnRpZmljIE5vdGF0aW9uPC9oND4KKyAqIDwvYT4KKyAqIDxwPgorICogTnVtYmVycyBpbiBzY2llbnRpZmljIG5vdGF0aW9uIGFyZSBleHByZXNzZWQgYXMgdGhlIHByb2R1Y3Qgb2YgYSBtYW50aXNzYSBhbmQKKyAqIGEgcG93ZXIgb2YgdGVuLCBmb3IgZXhhbXBsZSwgMTIzNCBjYW4gYmUgZXhwcmVzc2VkIGFzIDEuMjM0IHggMTA8c3VwPjM8L3N1cD4uCisgKiBUaGUgbWFudGlzc2EgaXMgdHlwaWNhbGx5IGluIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgWzEuMCwgMTAuMCkgb3Igc29tZXRpbWVzCisgKiBbMC4wLCAxLjApLCBidXQgaXQgZG9lcyBub3QgbmVlZCB0byBiZS4ge0Bjb2RlIERlY2ltYWxGb3JtYXR9IHN1cHBvcnRzCisgKiBhcmJpdHJhcnkgbWFudGlzc2FzLiB7QGNvZGUgRGVjaW1hbEZvcm1hdH0gY2FuIGJlIGluc3RydWN0ZWQgdG8gdXNlCisgKiBzY2llbnRpZmljIG5vdGF0aW9uIHRocm91Z2ggdGhlIEFQSSBvciB0aHJvdWdoIHRoZSBwYXR0ZXJuLiBJbiBhIHBhdHRlcm4sIHRoZQorICogZXhwb25lbnQgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRpZ2l0IGNoYXJhY3RlcnMKKyAqIGluZGljYXRlcyBzY2llbnRpZmljIG5vdGF0aW9uLiBFeGFtcGxlOiAiMC4jIyNFMCIgZm9ybWF0cyB0aGUgbnVtYmVyIDEyMzQgYXMKKyAqICIxLjIzNEUzIi4KKyAqIDx1bD4KKyAqIDxsaT5UaGUgbnVtYmVyIG9mIGRpZ2l0IGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGV4cG9uZW50IGNoYXJhY3RlciBnaXZlcyB0aGUKKyAqIG1pbmltdW0gZXhwb25lbnQgZGlnaXQgY291bnQuIFRoZXJlIGlzIG5vIG1heGltdW0uIE5lZ2F0aXZlIGV4cG9uZW50cyBhcmUKKyAqIGZvcm1hdHRlZCB1c2luZyB0aGUgbG9jYWxpemVkIG1pbnVzIHNpZ24sIDxlbT5ub3Q8L2VtPiB0aGUgcHJlZml4IGFuZAorICogc3VmZml4IGZyb20gdGhlIHBhdHRlcm4uIFRoaXMgYWxsb3dzIHBhdHRlcm5zIHN1Y2ggYXMgIjAuIyMjRTAgbS9zIi4gVG8KKyAqIHByZWZpeCBwb3NpdGl2ZSBleHBvbmVudHMgd2l0aCBhIGxvY2FsaXplZCBwbHVzIHNpZ24sIHNwZWNpZnkgJysnIGJldHdlZW4gdGhlCisgKiBleHBvbmVudCBhbmQgdGhlIGRpZ2l0czogIjAuIyMjRSswIiB3aWxsIHByb2R1Y2UgZm9ybWF0cyAiMUUrMSIsICIxRSswIiwKKyAqICIxRS0xIiwgZXRjLiAoSW4gbG9jYWxpemVkIHBhdHRlcm5zLCB1c2UgdGhlIGxvY2FsaXplZCBwbHVzIHNpZ24gcmF0aGVyIHRoYW4KKyAqICcrJy4pCisgKiA8bGk+VGhlIG1pbmltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzIGlzIGFjaGlldmVkIGJ5IGFkanVzdGluZyB0aGUKKyAqIGV4cG9uZW50LiBFeGFtcGxlOiAwLjAwMTIzIGZvcm1hdHRlZCB3aXRoICIwMC4jIyNFMCIgeWllbGRzICIxMi4zRS00Ii4gVGhpcworICogb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzLiBJZiB0aGVyZSBpcyBhCisgKiBtYXhpbXVtLCB0aGVuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBpcyBmaXhlZCBhdCBvbmUuCisgKiA8bGk+VGhlIG1heGltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzLCBpZiBwcmVzZW50LCBzcGVjaWZpZXMgdGhlIGV4cG9uZW50CisgKiBncm91cGluZy4gVGhlIG1vc3QgY29tbW9uIHVzZSBvZiB0aGlzIGlzIHRvIGdlbmVyYXRlIDxlbT5lbmdpbmVlcmluZworICogbm90YXRpb248L2VtPiwKKyAqIGluIHdoaWNoIHRoZSBleHBvbmVudCBpcyBhIG11bHRpcGxlIG9mIHRocmVlLCBlLmcuLCAiIyMwLiMjI0UwIi4gVGhlIG51bWJlcgorICogMTIzNDUgaXMgZm9ybWF0dGVkIHVzaW5nICIjIzAuIyMjRTAiIGFzICIxMi4zNDVFMyIuCisgKiA8bGk+V2hlbiB1c2luZyBzY2llbnRpZmljIG5vdGF0aW9uLCB0aGUgZm9ybWF0dGVyIGNvbnRyb2xzIHRoZSBkaWdpdCBjb3VudHMKKyAqIHVzaW5nIHNpZ25pZmljYW50IGRpZ2l0cyBsb2dpYy4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cworICogbGltaXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgaW50ZWdlciBhbmQgZnJhY3Rpb24gZGlnaXRzIHRoYXQgd2lsbCBiZSBzaG93biBpbgorICogdGhlIG1hbnRpc3NhOyBpdCBkb2VzIG5vdCBhZmZlY3QgcGFyc2luZy4gRm9yIGV4YW1wbGUsIDEyMzQ1IGZvcm1hdHRlZCB3aXRoCisgKiAiIyMwLiMjRTAiIGlzICIxMi4zRTMiLiBTZWUgdGhlIHNlY3Rpb24gb24gc2lnbmlmaWNhbnQgZGlnaXRzIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICogPGxpPlRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIHNob3duIGlzIGRldGVybWluZWQgYXMgZm9sbG93czogSWYgbm8KKyAqIHNpZ25pZmljYW50IGRpZ2l0cyBhcmUgdXNlZCBpbiB0aGUgcGF0dGVybiB0aGVuIHRoZSBtaW5pbXVtIG51bWJlciBvZgorICogc2lnbmlmaWNhbnQgZGlnaXRzIHNob3duIGlzIG9uZSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cworICogc2hvd24gaXMgdGhlIHN1bSBvZiB0aGUgPGVtPm1pbmltdW0gaW50ZWdlcjwvZW0+IGFuZAorICogPGVtPm1heGltdW0gZnJhY3Rpb248L2VtPiBkaWdpdHMsIGFuZCBpdCBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBtYXhpbXVtCisgKiBpbnRlZ2VyIGRpZ2l0cy4gSWYgdGhpcyBzdW0gaXMgemVybywgdGhlbiBhbGwgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSBzaG93bi4KKyAqIElmIHNpZ25pZmljYW50IGRpZ2l0cyBhcmUgdXNlZCBpbiB0aGUgcGF0dGVybiB0aGVuIHRoZSBudW1iZXIgb2YgaW50ZWdlcgorICogZGlnaXRzIGlzIGZpeGVkIGF0IG9uZSBhbmQgdGhlcmUgaXMgbm8gZXhwb25lbnQgZ3JvdXBpbmcuCisgKiA8bGk+RXhwb25lbnRpYWwgcGF0dGVybnMgbWF5IG5vdCBjb250YWluIGdyb3VwaW5nIHNlcGFyYXRvcnMuCisgKiA8L3VsPgorICogPGEgbmFtZT0ic2lnZGlnIj4KKyAqIDxoND4gPHN0cm9uZz48Zm9udCBjb2xvcj0icmVkIj5ORVc8L2ZvbnQ+Jm5ic3A7PC9zdHJvbmc+IFNpZ25pZmljYW50CisgKiBEaWdpdHM8L2g0PgorICogPHA+CisgKiA8L2E+IHtAY29kZSBEZWNpbWFsRm9ybWF0fSBoYXMgdHdvIHdheXMgb2YgY29udHJvbGxpbmcgaG93IG1hbnkgZGlnaXRzIGFyZQorICogc2hvd246IChhKSBzaWduaWZpY2FudCBkaWdpdCBjb3VudHMgb3IgKGIpIGludGVnZXIgYW5kIGZyYWN0aW9uIGRpZ2l0IGNvdW50cy4KKyAqIEludGVnZXIgYW5kIGZyYWN0aW9uIGRpZ2l0IGNvdW50cyBhcmUgZGVzY3JpYmVkIGFib3ZlLiBXaGVuIGEgZm9ybWF0dGVyIHVzZXMKKyAqIHNpZ25pZmljYW50IGRpZ2l0cyBjb3VudHMsIHRoZSBudW1iZXIgb2YgaW50ZWdlciBhbmQgZnJhY3Rpb24gZGlnaXRzIGlzIG5vdAorICogc3BlY2lmaWVkIGRpcmVjdGx5LCBhbmQgdGhlIGZvcm1hdHRlciBzZXR0aW5ncyBmb3IgdGhlc2UgY291bnRzIGFyZSBpZ25vcmVkLgorICogSW5zdGVhZCwgdGhlIGZvcm1hdHRlciB1c2VzIGFzIG1hbnkgaW50ZWdlciBhbmQgZnJhY3Rpb24gZGlnaXRzIGFzIHJlcXVpcmVkCisgKiB0byBkaXNwbGF5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cy4KKyAqIDwvcD4KKyAqIDxoNT5FeGFtcGxlczo8L2g1PgorICogPGJsb2NrcXVvdGU+IDx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0zIGNlbGxwYWRkaW5nPTA+CisgKiA8dHIgYmdjb2xvcj0iI2NjY2NmZiI+CisgKiA8dGggYWxpZ249ImxlZnQiPlBhdHRlcm48L3RoPgorICogPHRoIGFsaWduPSJsZWZ0Ij5NaW5pbXVtIHNpZ25pZmljYW50IGRpZ2l0czwvdGg+CisgKiA8dGggYWxpZ249ImxlZnQiPk1heGltdW0gc2lnbmlmaWNhbnQgZGlnaXRzPC90aD4KKyAqIDx0aCBhbGlnbj0ibGVmdCI+TnVtYmVyPC90aD4KKyAqIDx0aCBhbGlnbj0ibGVmdCI+T3V0cHV0IG9mIGZvcm1hdCgpPC90aD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiPgorICogPHRkPntAY29kZSBAQEB9CisgKiA8dGQ+MzwvdGQ+CisgKiA8dGQ+MzwvdGQ+CisgKiA8dGQ+MTIzNDU8L3RkPgorICogPHRkPntAY29kZSAxMjMwMH08L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2VlZWVmZiI+CisgKiA8dGQ+e0Bjb2RlIEBAQH08L3RkPgorICogPHRkPjM8L3RkPgorICogPHRkPjM8L3RkPgorICogPHRkPjAuMTIzNDU8L3RkPgorICogPHRkPntAY29kZSAwLjEyM308L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249InRvcCI+CisgKiA8dGQ+e0Bjb2RlIEBAIyN9PC90ZD4KKyAqIDx0ZD4yPC90ZD4KKyAqIDx0ZD40PC90ZD4KKyAqIDx0ZD4zLjE0MTU5PC90ZD4KKyAqIDx0ZD57QGNvZGUgMy4xNDJ9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNlZWVlZmYiPgorICogPHRkPntAY29kZSBAQCMjfTwvdGQ+CisgKiA8dGQ+MjwvdGQ+CisgKiA8dGQ+NDwvdGQ+CisgKiA8dGQ+MS4yMzAwNDwvdGQ+CisgKiA8dGQ+e0Bjb2RlIDEuMjN9PC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPiA8L2Jsb2NrcXVvdGU+CisgKiA8dWw+CisgKiA8bGk+U2lnbmlmaWNhbnQgZGlnaXQgY291bnRzIG1heSBiZSBleHByZXNzZWQgdXNpbmcgcGF0dGVybnMgdGhhdCBzcGVjaWZ5IGEKKyAqIG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cy4gVGhlc2UgYXJlIGluZGljYXRlZCBieSB0aGUKKyAqIHtAY29kZSAnQCd9IGFuZCB7QGNvZGUgJyMnfSBjaGFyYWN0ZXJzLiBUaGUgbWluaW11bSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQKKyAqIGRpZ2l0cyBpcyB0aGUgbnVtYmVyIG9mIHtAY29kZSAnQCd9IGNoYXJhY3RlcnMuIFRoZSBtYXhpbXVtIG51bWJlciBvZgorICogc2lnbmlmaWNhbnQgZGlnaXRzIGlzIHRoZSBudW1iZXIgb2Yge0Bjb2RlICdAJ30gY2hhcmFjdGVycyBwbHVzIHRoZSBudW1iZXIgb2YKKyAqIHtAY29kZSAnIyd9IGNoYXJhY3RlcnMgZm9sbG93aW5nIG9uIHRoZSByaWdodC4gRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuCisgKiB7QGNvZGUgIkBAQCJ9IGluZGljYXRlcyBleGFjdGx5IDMgc2lnbmlmaWNhbnQgZGlnaXRzLiBUaGUgcGF0dGVybgorICoge0Bjb2RlICJAIyMifSBpbmRpY2F0ZXMgZnJvbSAxIHRvIDMgc2lnbmlmaWNhbnQgZGlnaXRzLiBUcmFpbGluZyB6ZXJvIGRpZ2l0cworICogdG8gdGhlIHJpZ2h0IG9mIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBhcmUgc3VwcHJlc3NlZCBhZnRlciB0aGUgbWluaW11bSBudW1iZXIKKyAqIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBoYXZlIGJlZW4gc2hvd24uIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybiB7QGNvZGUgIkAjIyJ9CisgKiBmb3JtYXRzIHRoZSBudW1iZXIgMC4xMjAzIGFzIHtAY29kZSAiMC4xMiJ9LgorICogPGxpPklmIGEgcGF0dGVybiB1c2VzIHNpZ25pZmljYW50IGRpZ2l0cywgaXQgbWF5IG5vdCBjb250YWluIGEgZGVjaW1hbAorICogc2VwYXJhdG9yLCBub3IgdGhlIHtAY29kZSAnMCd9IHBhdHRlcm4gY2hhcmFjdGVyLiBQYXR0ZXJucyBzdWNoIGFzCisgKiB7QGNvZGUgIkAwMCJ9IG9yIHtAY29kZSAiQC4jIyMifSBhcmUgZGlzYWxsb3dlZC4KKyAqIDxsaT5BbnkgbnVtYmVyIG9mIHtAY29kZSAnIyd9IGNoYXJhY3RlcnMgbWF5IGJlIHByZXBlbmRlZCB0byB0aGUgbGVmdCBvZiB0aGUKKyAqIGxlZnRtb3N0IHtAY29kZSAnQCd9IGNoYXJhY3Rlci4gVGhlc2UgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIG1pbmltdW0gYW5kCisgKiBtYXhpbXVtIHNpZ25pZmljYW50IGRpZ2l0IGNvdW50cywgYnV0IG1heSBiZSB1c2VkIHRvIHBvc2l0aW9uIGdyb3VwaW5nCisgKiBzZXBhcmF0b3JzLiBGb3IgZXhhbXBsZSwge0Bjb2RlICIjLCNAIyJ9IGluZGljYXRlcyBhIG1pbmltdW0gb2Ygb25lCisgKiBzaWduaWZpY2FudCBkaWdpdCwgYSBtYXhpbXVtIG9mIHR3byBzaWduaWZpY2FudCBkaWdpdHMsIGFuZCBhIGdyb3VwaW5nIHNpemUKKyAqIG9mIHRocmVlLgorICogPGxpPkluIG9yZGVyIHRvIGVuYWJsZSBzaWduaWZpY2FudCBkaWdpdHMgZm9ybWF0dGluZywgdXNlIGEgcGF0dGVybgorICogY29udGFpbmluZyB0aGUge0Bjb2RlICdAJ30gcGF0dGVybiBjaGFyYWN0ZXIuCisgKiA8bGk+SW4gb3JkZXIgdG8gZGlzYWJsZSBzaWduaWZpY2FudCBkaWdpdHMgZm9ybWF0dGluZywgdXNlIGEgcGF0dGVybiB0aGF0CisgKiBkb2VzIG5vdCBjb250YWluIHRoZSB7QGNvZGUgJ0AnfSBwYXR0ZXJuIGNoYXJhY3Rlci4KKyAqIDxsaT5UaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBoYXMgbm8gZWZmZWN0IG9uIHBhcnNpbmcuCisgKiA8bGk+U2lnbmlmaWNhbnQgZGlnaXRzIG1heSBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24uIFN1Y2gKKyAqIHBhdHRlcm5zIGFyZSBlcXVpdmFsZW50IHRvIGEgbm9ybWFsIGV4cG9uZW50aWFsIHBhdHRlcm4gd2l0aCBhIG1pbmltdW0gYW5kCisgKiBtYXhpbXVtIGludGVnZXIgZGlnaXQgY291bnQgb2Ygb25lLCBhIG1pbmltdW0gZnJhY3Rpb24gZGlnaXQgY291bnQgb2YgdGhlCisgKiBudW1iZXIgb2YgJ0AnIGNoYXJhY3RlcnMgaW4gdGhlIHBhdHRlcm4gLSAxLCBhbmQgYSBtYXhpbXVtIGZyYWN0aW9uIGRpZ2l0CisgKiBjb3VudCBvZiB0aGUgbnVtYmVyIG9mICdAJyBhbmQgJyMnIGNoYXJhY3RlcnMgaW4gdGhlIHBhdHRlcm4gLSAxLiBGb3IKKyAqIGV4YW1wbGUsIHRoZSBwYXR0ZXJuIHtAY29kZSAiQEAjIyNFMCJ9IGlzIGVxdWl2YWxlbnQgdG8ge0Bjb2RlICIwLjAjIyNFMCJ9LgorICogPGxpPklmIHNpZ25maWNhbnQgZGlnaXRzIGFyZSBpbiB1c2UgdGhlbiB0aGUgaW50ZWdlciBhbmQgZnJhY3Rpb24gZGlnaXQKKyAqIGNvdW50cywgYXMgc2V0IHZpYSB0aGUgQVBJLCBhcmUgaWdub3JlZC4KKyAqIDwvdWw+CisgKiA8aDQ+IDxzdHJvbmc+PGZvbnQgY29sb3I9InJlZCI+TkVXPC9mb250PiZuYnNwOzwvc3Ryb25nPiBQYWRkaW5nPC9oND4KKyAqIDxwPgorICoge0Bjb2RlIERlY2ltYWxGb3JtYXR9IHN1cHBvcnRzIHBhZGRpbmcgdGhlIHJlc3VsdCBvZiB7QGNvZGUgZm9ybWF0fSB0byBhCisgKiBzcGVjaWZpYyB3aWR0aC4gUGFkZGluZyBtYXkgYmUgc3BlY2lmaWVkIGVpdGhlciB0aHJvdWdoIHRoZSBBUEkgb3IgdGhyb3VnaAorICogdGhlIHBhdHRlcm4gc3ludGF4LiBJbiBhIHBhdHRlcm4sIHRoZSBwYWQgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSBhCisgKiBzaW5nbGUgcGFkIGNoYXJhY3RlciBjYXVzZXMgcGFkZGluZyB0byBiZSBwYXJzZWQgYW5kIGZvcm1hdHRlZC4gVGhlIHBhZAorICogZXNjYXBlIGNoYXJhY3RlciBpcyAnKicgaW4gdW5sb2NhbGl6ZWQgcGF0dGVybnMuIEZvciBleGFtcGxlLAorICoge0Bjb2RlICIkKngjLCMjMC4wMCJ9IGZvcm1hdHMgMTIzIHRvIHtAY29kZSAiJHh4MTIzLjAwIn0sIGFuZCAxMjM0IHRvCisgKiB7QGNvZGUgIiQxLDIzNC4wMCJ9LgorICogPHVsPgorICogPGxpPldoZW4gcGFkZGluZyBpcyBpbiBlZmZlY3QsIHRoZSB3aWR0aCBvZiB0aGUgcG9zaXRpdmUgc3VicGF0dGVybiwKKyAqIGluY2x1ZGluZyBwcmVmaXggYW5kIHN1ZmZpeCwgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IHdpZHRoLiBGb3IgZXhhbXBsZSwgaW4gdGhlCisgKiBwYXR0ZXJuIHtAY29kZSAiKiAjMCBvJydjbG9jayJ9LCB0aGUgZm9ybWF0IHdpZHRoIGlzIDEwLjwvbGk+CisgKiA8bGk+VGhlIHdpZHRoIGlzIGNvdW50ZWQgaW4gMTYtYml0IGNvZGUgdW5pdHMgKEphdmEge0Bjb2RlIGNoYXJ9cykuPC9saT4KKyAqIDxsaT5Tb21lIHBhcmFtZXRlcnMgd2hpY2ggdXN1YWxseSBkbyBub3QgbWF0dGVyIGhhdmUgbWVhbmluZyB3aGVuIHBhZGRpbmcgaXMKKyAqIHVzZWQsIGJlY2F1c2UgdGhlIHBhdHRlcm4gd2lkdGggaXMgc2lnbmlmaWNhbnQgd2l0aCBwYWRkaW5nLiBJbiB0aGUgcGF0dGVybiAiKgorICogIyMsIyMsIywjIzAuIyMiLCB0aGUgZm9ybWF0IHdpZHRoIGlzIDE0LiBUaGUgaW5pdGlhbCBjaGFyYWN0ZXJzICIjIywjIywiIGRvCisgKiBub3QgYWZmZWN0IHRoZSBncm91cGluZyBzaXplIG9yIG1heGltdW0gaW50ZWdlciBkaWdpdHMsIGJ1dCB0aGV5IGRvIGFmZmVjdAorICogdGhlIGZvcm1hdCB3aWR0aC48L2xpPgorICogPGxpPlBhZGRpbmcgbWF5IGJlIGluc2VydGVkIGF0IG9uZSBvZiBmb3VyIGxvY2F0aW9uczogYmVmb3JlIHRoZSBwcmVmaXgsCisgKiBhZnRlciB0aGUgcHJlZml4LCBiZWZvcmUgdGhlIHN1ZmZpeCBvciBhZnRlciB0aGUgc3VmZml4LiBJZiBwYWRkaW5nIGlzCisgKiBzcGVjaWZpZWQgaW4gYW55IG90aGVyIGxvY2F0aW9uLCB7QGxpbmsgI2FwcGx5UGF0dGVybn0gdGhyb3dzIGFuIHtAbGluaworICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufS4gSWYgdGhlcmUgaXMgbm8gcHJlZml4LCBiZWZvcmUgdGhlIHByZWZpeCBhbmQgYWZ0ZXIKKyAqIHRoZSBwcmVmaXggYXJlIGVxdWl2YWxlbnQsIGxpa2V3aXNlIGZvciB0aGUgc3VmZml4LjwvbGk+CisgKiA8bGk+V2hlbiBzcGVjaWZpZWQgaW4gYSBwYXR0ZXJuLCB0aGUgMTYtYml0IHtAY29kZSBjaGFyfSBpbW1lZGlhdGVseQorICogZm9sbG93aW5nIHRoZSBwYWQgZXNjYXBlIGlzIHRoZSBwYWQgY2hhcmFjdGVyLiBUaGlzIG1heSBiZSBhbnkgY2hhcmFjdGVyLAorICogaW5jbHVkaW5nIGEgc3BlY2lhbCBwYXR0ZXJuIGNoYXJhY3Rlci4gVGhhdCBpcywgdGhlIHBhZCBlc2NhcGUKKyAqIDxlbT5lc2NhcGVzPC9lbT4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIuIElmIHRoZXJlIGlzIG5vIGNoYXJhY3RlciBhZnRlcgorICogdGhlIHBhZCBlc2NhcGUsIHRoZW4gdGhlIHBhdHRlcm4gaXMgaWxsZWdhbC48L2xpPgorICogPC91bD4KKyAqIDxoND5TeW5jaHJvbml6YXRpb248L2g0PgorICogPHA+CisgKiB7QGNvZGUgRGVjaW1hbEZvcm1hdH0gb2JqZWN0cyBhcmUgbm90IHN5bmNocm9uaXplZC4gTXVsdGlwbGUgdGhyZWFkcyBzaG91bGQKKyAqIG5vdCBhY2Nlc3Mgb25lIGZvcm1hdHRlciBjb25jdXJyZW50bHkuCisgKiAKKyAqIEBzZWUgRm9ybWF0CisgKiBAc2VlIE51bWJlckZvcm1hdAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEZWNpbWFsRm9ybWF0IGV4dGVuZHMgTnVtYmVyRm9ybWF0IHsKIApAQCAtNTMsMzggKzU3Niw0MCBAQAogICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBzZXJpYWxWZXJzaW9uT25TdHJlYW0gPSAzOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBEZWNpbWFsRm9ybWF0IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIG51bWJlcnMgZm9yIHRoZQotICAgICAqIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERlY2ltYWxGb3JtYXR9IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIG51bWJlcnMKKyAgICAgKiBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEZWNpbWFsRm9ybWF0KCkgewogICAgICAgICB0aGlzKGdldFBhdHRlcm4oTG9jYWxlLmdldERlZmF1bHQoKSwgIk51bWJlciIpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRGVjaW1hbEZvcm1hdCB1c2luZyB0aGUgc3BlY2lmaWVkIG5vbi1sb2NhbGl6ZWQgcGF0dGVybgotICAgICAqIGFuZCB0aGUgRGVjaW1hbEZvcm1hdFN5bWJvbHMgZm9yIHRoZSBkZWZhdWx0IExvY2FsZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBEZWNpbWFsRm9ybWF0fSB1c2luZyB0aGUgc3BlY2lmaWVkIG5vbi1sb2NhbGl6ZWQKKyAgICAgKiBwYXR0ZXJuIGFuZCB0aGUge0Bjb2RlIERlY2ltYWxGb3JtYXRTeW1ib2xzfSBmb3IgdGhlIGRlZmF1bHQgTG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgbm9uLWxvY2FsaXplZCBwYXR0ZXJuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbm9uLWxvY2FsaXplZCBwYXR0ZXJuLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgcGF0dGVybiBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gY2Fubm90IGJlIHBhcnNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGVjaW1hbEZvcm1hdChTdHJpbmcgcGF0dGVybikgewogICAgICAgICB0aGlzKHBhdHRlcm4sIG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERlY2ltYWxGb3JtYXQgdXNpbmcgdGhlIHNwZWNpZmllZCBub24tbG9jYWxpemVkIHBhdHRlcm4KLSAgICAgKiBhbmQgRGVjaW1hbEZvcm1hdFN5bWJvbHMuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgRGVjaW1hbEZvcm1hdH0gdXNpbmcgdGhlIHNwZWNpZmllZCBub24tbG9jYWxpemVkCisgICAgICogcGF0dGVybiBhbmQge0Bjb2RlIERlY2ltYWxGb3JtYXRTeW1ib2xzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1sb2NhbGl6ZWQgcGF0dGVybgorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1sb2NhbGl6ZWQgcGF0dGVybi4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBEZWNpbWFsRm9ybWF0U3ltYm9scwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIERlY2ltYWxGb3JtYXRTeW1ib2xzLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgcGF0dGVybiBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gY2Fubm90IGJlIHBhcnNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGVjaW1hbEZvcm1hdChTdHJpbmcgcGF0dGVybiwgRGVjaW1hbEZvcm1hdFN5bWJvbHMgdmFsdWUpIHsKICAgICAgICAgc3ltYm9scyA9IChEZWNpbWFsRm9ybWF0U3ltYm9scykgdmFsdWUuY2xvbmUoKTsKQEAgLTEwMSwyOCArNjI2LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgcGF0dGVybiBvZiB0aGlzIERlY2ltYWxGb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBwYXR0ZXJuIHdoaWNoCisgICAgICogQ2hhbmdlcyB0aGUgcGF0dGVybiBvZiB0aGlzIGRlY2ltYWwgZm9ybWF0IHRvIHRoZSBzcGVjaWZpZWQgcGF0dGVybiB3aGljaAogICAgICAqIHVzZXMgbG9jYWxpemVkIHBhdHRlcm4gY2hhcmFjdGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBwYXR0ZXJuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIHBhdHRlcm4uCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBwYXR0ZXJuIGNhbm5vdCBiZSBwYXJzZWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcGF0dGVybiBjYW5ub3QgYmUgcGFyc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFwcGx5TG9jYWxpemVkUGF0dGVybihTdHJpbmcgcGF0dGVybikgewogICAgICAgICBkZm9ybS5hcHBseUxvY2FsaXplZFBhdHRlcm4ocGF0dGVybik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgcGF0dGVybiBvZiB0aGlzIFNpbXBsZURhdGVGb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBwYXR0ZXJuCi0gICAgICogd2hpY2ggdXNlcyBub24tbG9jYWxpemVkIHBhdHRlcm4gY2hhcmFjdGVycy4KKyAgICAgKiBDaGFuZ2VzIHRoZSBwYXR0ZXJuIG9mIHRoaXMgZGVjaW1hbCBmb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBwYXR0ZXJuIHdoaWNoCisgICAgICogdXNlcyBub24tbG9jYWxpemVkIHBhdHRlcm4gY2hhcmFjdGVycy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1sb2NhbGl6ZWQgcGF0dGVybgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5vbi1sb2NhbGl6ZWQgcGF0dGVybi4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHBhdHRlcm4gY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwYXR0ZXJuIGNhbm5vdCBiZSBwYXJzZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXBwbHlQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CiAKQEAgLTEzMCwxMiArNjU1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBEZWNpbWFsRm9ybWF0IHdpdGggdGhlIHNhbWUgcGF0dGVybiBhbmQKLSAgICAgKiBwcm9wZXJ0aWVzIGFzIHRoaXMgRGVjaW1hbEZvcm1hdC4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBEZWNpbWFsRm9ybWF0fSB3aXRoIHRoZSBzYW1lIHBhdHRlcm4gYW5kCisgICAgICogcHJvcGVydGllcyBhcyB0aGlzIGRlY2ltYWwgZm9ybWF0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBEZWNpbWFsRm9ybWF0Ci0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGRlY2ltYWwgZm9ybWF0LgogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CkBAIC0xNDYsMTYgKzY3MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMgRGVjaW1hbEZvcm1hdCBhbmQgYW5zd2VyIGlmIHRoZXkKLSAgICAgKiBhcmUgZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEZWNpbWFsRm9ybWF0IHdpdGggdGhlIHNhbWUKLSAgICAgKiBwYXR0ZXJuIGFuZCBwcm9wZXJ0aWVzLgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMgZGVjaW1hbCBmb3JtYXQgYW5kIGluZGljYXRlcyBpZgorICAgICAqIHRoZXkgYXJlIGVxdWFsLiBJbiBvcmRlciB0byBiZSBlcXVhbCwge0Bjb2RlIG9iamVjdH0gbXVzdCBiZSBhbiBpbnN0YW5jZQorICAgICAqIG9mIHtAY29kZSBEZWNpbWFsRm9ybWF0fSB3aXRoIHRoZSBzYW1lIHBhdHRlcm4gYW5kIHByb3BlcnRpZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBEZWNpbWFsRm9ybWF0LAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIGRlY2ltYWwKKyAgICAgKiAgICAgICAgIGZvcm1hdDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtMTcxLDE5ICs2OTYsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHVzaW5nIHRoZSBydWxlcyBvZiB0aGlzIERlY2ltYWxOdW1iZXJGb3JtYXQKLSAgICAgKiBhbmQgcmV0dXJucyBhbiBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igd2l0aCB0aGUgZm9ybWF0dGVkIG51bWJlciBhbmQKLSAgICAgKiBhdHRyaWJ1dGVzLgorICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBvYmplY3QgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgZGVjaW1hbCBmb3JtYXQgYW5kCisgICAgICogcmV0dXJucyBhbiB7QGNvZGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfSB3aXRoIHRoZSBmb3JtYXR0ZWQgbnVtYmVyCisgICAgICogYW5kIGF0dHJpYnV0ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZm9ybWF0LgogICAgICAqIEByZXR1cm4gYW4gQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHdpdGggdGhlIGZvcm1hdHRlZCBudW1iZXIgYW5kCi0gICAgICogICAgICAgICBhdHRyaWJ1dGVzCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBudWxsCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBvYmplY3QgY2Fubm90IGJlIGZvcm1hdHRlZCBieSB0aGlzIEZvcm1hdAorICAgICAqICAgICAgICAgYXR0cmlidXRlcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvYmplY3R9IGNhbm5vdCBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBmb3JtYXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvYmplY3R9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewpAQCAtMTk0LDE4ICs3MTksMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBkb3VibGUgdmFsdWUgaW50byB0aGUgc3BlY2lmaWVkIFN0cmluZ0J1ZmZlciB1c2luZyB0aGUKLSAgICAgKiBwYXR0ZXJuIG9mIHRoaXMgRGVjaW1hbEZvcm1hdC4gSWYgdGhlIGZpZWxkIHNwZWNpZmllZCBieSB0aGUKLSAgICAgKiBGaWVsZFBvc2l0aW9uIGlzIGZvcm1hdHRlZCwgc2V0IHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4IG9mIHRoZSBmb3JtYXR0ZWQKLSAgICAgKiBmaWVsZCBpbiB0aGUgRmllbGRQb3NpdGlvbi4KKyAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgZG91YmxlIHZhbHVlIGFzIGEgc3RyaW5nIHVzaW5nIHRoZSBwYXR0ZXJuIG9mIHRoaXMKKyAgICAgKiBkZWNpbWFsIGZvcm1hdCBhbmQgYXBwZW5kcyB0aGUgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIGZpZWxkfSBtZW1iZXIgb2Yge0Bjb2RlIHBvc2l0aW9ufSBjb250YWlucyBhIHZhbHVlCisgICAgICogc3BlY2lmeWluZyBhIGZvcm1hdCBmaWVsZCwgdGhlbiBpdHMge0Bjb2RlIGJlZ2luSW5kZXh9IGFuZAorICAgICAqIHtAY29kZSBlbmRJbmRleH0gbWVtYmVycyB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0CisgICAgICogb2NjdXJyZW5jZSBvZiB0aGlzIGZpZWxkIGluIHRoZSBmb3JtYXR0ZWQgdGV4dC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHRvIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBmb3JtYXQuCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIGRvdWJsZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdG8uCiAgICAgICogQHBhcmFtIHBvc2l0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgRmllbGRQb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXIgPGNvZGU+YnVmZmVyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgb24gaW5wdXQ6IGFuIG9wdGlvbmFsIGFsaWdubWVudCBmaWVsZDsgb24gb3V0cHV0OiB0aGUgb2Zmc2V0cworICAgICAqICAgICAgICAgICAgb2YgdGhlIGFsaWdubWVudCBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChkb3VibGUgdmFsdWUsIFN0cmluZ0J1ZmZlciBidWZmZXIsCkBAIC0yMTQsMTggKzc0NiwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIGxvbmcgdmFsdWUgaW50byB0aGUgc3BlY2lmaWVkIFN0cmluZ0J1ZmZlciB1c2luZyB0aGUgcGF0dGVybgotICAgICAqIG9mIHRoaXMgRGVjaW1hbEZvcm1hdC4gSWYgdGhlIGZpZWxkIHNwZWNpZmllZCBieSB0aGUgRmllbGRQb3NpdGlvbiBpcwotICAgICAqIGZvcm1hdHRlZCwgc2V0IHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4IG9mIHRoZSBmb3JtYXR0ZWQgZmllbGQgaW4gdGhlCi0gICAgICogRmllbGRQb3NpdGlvbi4KKyAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgbG9uZyB2YWx1ZSBhcyBhIHN0cmluZyB1c2luZyB0aGUgcGF0dGVybiBvZiB0aGlzCisgICAgICogZGVjaW1hbCBmb3JtYXQgYW5kIGFwcGVuZHMgdGhlIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHtAY29kZSBmaWVsZH0gbWVtYmVyIG9mIHtAY29kZSBwb3NpdGlvbn0gY29udGFpbnMgYSB2YWx1ZQorICAgICAqIHNwZWNpZnlpbmcgYSBmb3JtYXQgZmllbGQsIHRoZW4gaXRzIHtAY29kZSBiZWdpbkluZGV4fSBhbmQKKyAgICAgKiB7QGNvZGUgZW5kSW5kZXh9IG1lbWJlcnMgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdAorICAgICAqIG9jY3VycmVuY2Ugb2YgdGhpcyBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gZm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBmb3JtYXQuCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIGxvbmcgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRvLgogICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIEZpZWxkUG9zaXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmdCdWZmZXIgcGFyYW1ldGVyIDxjb2RlPmJ1ZmZlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIG9uIGlucHV0OiBhbiBvcHRpb25hbCBhbGlnbm1lbnQgZmllbGQ7IG9uIG91dHB1dDogdGhlIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSBhbGlnbm1lbnQgZmllbGQgaW4gdGhlIGZvcm1hdHRlZCB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQobG9uZyB2YWx1ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwKQEAgLTIzNCwyMCArNzczLDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgbnVtYmVyIGludG8gdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgdXNpbmcgdGhlIHBhdHRlcm4gb2YKLSAgICAgKiB0aGlzIERlY2ltYWxGb3JtYXQuIElmIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgdGhlIEZpZWxkUG9zaXRpb24gaXMKLSAgICAgKiBmb3JtYXR0ZWQsIHNldCB0aGUgYmVnaW4gYW5kIGVuZCBpbmRleCBvZiB0aGUgZm9ybWF0dGVkIGZpZWxkIGluIHRoZQotICAgICAqIEZpZWxkUG9zaXRpb24uCisgICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBhIHN0cmluZyB1c2luZyB0aGUgcGF0dGVybiBvZiB0aGlzCisgICAgICogZGVjaW1hbCBmb3JtYXQgYW5kIGFwcGVuZHMgdGhlIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHtAY29kZSBmaWVsZH0gbWVtYmVyIG9mIHtAY29kZSBwb3NpdGlvbn0gY29udGFpbnMgYSB2YWx1ZQorICAgICAqIHNwZWNpZnlpbmcgYSBmb3JtYXQgZmllbGQsIHRoZW4gaXRzIHtAY29kZSBiZWdpbkluZGV4fSBhbmQKKyAgICAgKiB7QGNvZGUgZW5kSW5kZXh9IG1lbWJlcnMgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdAorICAgICAqIG9jY3VycmVuY2Ugb2YgdGhpcyBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBudW1iZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdC4KICAgICAgKiBAcGFyYW0gdG9BcHBlbmRUbwotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIG51bWJlciB0by4KICAgICAgKiBAcGFyYW0gcG9zCi0gICAgICogICAgICAgICAgICB0aGUgRmllbGRQb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXIgPGNvZGU+YnVmZmVyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgb24gaW5wdXQ6IGFuIG9wdGlvbmFsIGFsaWdubWVudCBmaWVsZDsgb24gb3V0cHV0OiB0aGUgb2Zmc2V0cworICAgICAqICAgICAgICAgICAgb2YgdGhlIGFsaWdubWVudCBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBudW1iZXIgaXMgbm90IGluc3RhbmNlIG9mIDxjb2RlPk51bWJlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbnVtYmVyfSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIE51bWJlcn0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSB0b0FwcGVuZFRvfSBvciB7QGNvZGUgcG9zfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoT2JqZWN0IG51bWJlciwgU3RyaW5nQnVmZmVyIHRvQXBwZW5kVG8sCkBAIC0yNjUsOSArODEyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRGVjaW1hbEZvcm1hdFN5bWJvbHMgdXNlZCBieSB0aGlzIERlY2ltYWxGb3JtYXQuCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIERlY2ltYWxGb3JtYXRTeW1ib2xzfSB1c2VkIGJ5IHRoaXMgZGVjaW1hbCBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERlY2ltYWxGb3JtYXRTeW1ib2xzCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30gdXNlZCBieSB0aGlzIGRlY2ltYWwKKyAgICAgKiAgICAgICAgIGZvcm1hdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGVjaW1hbEZvcm1hdFN5bWJvbHMgZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKSB7CiAgICAgICAgIHJldHVybiAoRGVjaW1hbEZvcm1hdFN5bWJvbHMpIHN5bWJvbHMuY2xvbmUoKTsKQEAgLTI3Niw4ICs4MjUsOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbmN5IHVzZWQgYnkgdGhpcyBkZWNpbWFsIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGN1cnJlbmN5IG9mIERlY2ltYWxGb3JtYXRTeW1ib2xzIHVzZWQgYnkgdGhpcyBkZWNpbWFsIGZvcm1hdAorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbmN5IHVzZWQgYnkgdGhpcyBkZWNpbWFsIGZvcm1hdC4KICAgICAgKiBAc2VlIERlY2ltYWxGb3JtYXRTeW1ib2xzI2dldEN1cnJlbmN5KCkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ3VycmVuY3kgZ2V0Q3VycmVuY3koKSB7CkBAIC0yODksOCArODM5LDExIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlnaXRzIGdyb3VwZWQgdG9nZXRoZXIgYnkgdGhlIGdyb3VwaW5nIHNlcGFyYXRvci4KKyAgICAgKiBUaGlzIG9ubHkgYWxsb3dzIHRvIGdldCB0aGUgcHJpbWFyeSBncm91cGluZyBzaXplLiBUaGVyZSBpcyBubyBBUEkgdG8gZ2V0CisgICAgICogdGhlIHNlY29uZGFyeSBncm91cGluZyBzaXplLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkaWdpdHMgZ3JvdXBlZCB0b2dldGhlcgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkaWdpdHMgZ3JvdXBlZCB0b2dldGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEdyb3VwaW5nU2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLmdldEdyb3VwaW5nU2l6ZSgpOwpAQCAtMzAwLDcgKzg1Myw4IEBACiAgICAgICogUmV0dXJucyB0aGUgbXVsdGlwbGllciB3aGljaCBpcyBhcHBsaWVkIHRvIHRoZSBudW1iZXIgYmVmb3JlIGZvcm1hdHRpbmcKICAgICAgKiBvciBhZnRlciBwYXJzaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG11bHRpcGxpZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBtdWx0aXBsaWVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TXVsdGlwbGllcigpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLmdldE11bHRpcGxpZXIoKTsKQEAgLTMwOSw3ICs4NjMsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHByZWZpeCB3aGljaCBpcyBmb3JtYXR0ZWQgb3IgcGFyc2VkIGJlZm9yZSBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZWdhdGl2ZSBwcmVmaXgKKyAgICAgKiBAcmV0dXJuIHRoZSBuZWdhdGl2ZSBwcmVmaXguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROZWdhdGl2ZVByZWZpeCgpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLmdldE5lZ2F0aXZlUHJlZml4KCk7CkBAIC0zMTgsNyArODczLDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzdWZmaXggd2hpY2ggaXMgZm9ybWF0dGVkIG9yIHBhcnNlZCBhZnRlciBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZWdhdGl2ZSBzdWZmaXgKKyAgICAgKiBAcmV0dXJuIHRoZSBuZWdhdGl2ZSBzdWZmaXguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROZWdhdGl2ZVN1ZmZpeCgpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLmdldE5lZ2F0aXZlU3VmZml4KCk7CkBAIC0zMjcsNyArODgzLDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBwcmVmaXggd2hpY2ggaXMgZm9ybWF0dGVkIG9yIHBhcnNlZCBiZWZvcmUgYSBwb3NpdGl2ZSBudW1iZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcG9zaXRpdmUgcHJlZml4CisgICAgICogQHJldHVybiB0aGUgcG9zaXRpdmUgcHJlZml4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zaXRpdmVQcmVmaXgoKSB7CiAgICAgICAgIHJldHVybiBkZm9ybS5nZXRQb3NpdGl2ZVByZWZpeCgpOwpAQCAtMzM2LDYwICs4OTMsNTUgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzdWZmaXggd2hpY2ggaXMgZm9ybWF0dGVkIG9yIHBhcnNlZCBhZnRlciBhIHBvc2l0aXZlIG51bWJlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGl2ZSBzdWZmaXgKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGl2ZSBzdWZmaXguCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQb3NpdGl2ZVN1ZmZpeCgpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLmdldFBvc2l0aXZlU3VmZml4KCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLmhhc2hDb2RlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyBzaG93biB3aGVuIHRoZXJlIGFyZSBubworICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyBzaG93biB3aGVuIHRoZXJlIGFyZSBubwogICAgICAqIGZyYWN0aW9uYWwgZGlnaXRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVjaW1hbCBzZXBhcmF0b3Igc2hvdWxkIGFsd2F5cyBiZSBmb3JtYXR0ZWQsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGVjaW1hbCBzZXBhcmF0b3Igc2hvdWxkIGFsd2F5cyBiZSBmb3JtYXR0ZWQ7CisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY2ltYWxTZXBhcmF0b3JBbHdheXNTaG93bigpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLmlzRGVjaW1hbFNlcGFyYXRvckFsd2F5c1Nob3duKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmV0dXJuIG9iamVjdCBvZiB0aGUgcGFyc2Ugb3BlcmF0aW9uCi0gICAgICogd2lsbCBiZSBvZiB0eXBlIEJpZ0RlY2ltYWwuIFRoaXMgdmFsdWUgd2lsbCBkZWZhdWx0IHRvIGZhbHNlLgorICAgICAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJldHVybiBvYmplY3Qgb2YgdGhlIHBhcnNlIG9wZXJhdGlvbiBpcworICAgICAqIG9mIHR5cGUge0Bjb2RlIEJpZ0RlY2ltYWx9LiBUaGlzIHZhbHVlIGRlZmF1bHRzIHRvIHtAY29kZSBmYWxzZX0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGFuZCBwYXJzZSB3aWxsIGFsd2F5cyByZXR1cm4gQmlnRGVjaW1hbHMsIGZhbHNlIGFuZCB0aGUgdHlwZQotICAgICAqICAgICAgICAgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIExvbmcgb3IgRG91YmxlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHBhcnNlIGFsd2F5cyByZXR1cm5zIHtAY29kZSBCaWdEZWNpbWFsc30sCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgaXMge0Bjb2RlIExvbmd9IG9yCisgICAgICogICAgICAgICB7QGNvZGUgRG91YmxlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnNlQmlnRGVjaW1hbCgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCaWdEZWNpbWFsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdoZW4gRGVjaW1hbEZvcm1hdCBpcyB1c2VkIHRvIHBhcnNpbmcsIGFuZCB0aGlzIHZhbHVlIGlzIHNldCB0byB0cnVlLAotICAgICAqIHRoZW4gYWxsIHRoZSByZXN1bHRpbmcgbnVtYmVyIHdpbGwgYmUgb2YgdHlwZQotICAgICAqIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPi4gRXhjZXB0IHRoYXQsIE5hTiwgcG9zaXRpdmUgYW5kCi0gICAgICogbmVnYXRpdmUgaW5maW5pdHkgYXJlIHN0aWxsIHJldHVybmVkIGFzIDxjb2RlPmphdmEubGFuZy5Eb3VibGU8L2NvZGU+Ci0gICAgICogCi0gICAgICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgY29tLmlibS5pY3U0am5pLnRleHQuRGVjaW1hbEZvcm1hdCBpcyB3cmFwcGVkIHRvCi0gICAgICogZnVsZmlsbCBtb3N0IG9mIHRoZSBmb3JtYXQgYW5kIHBhcnNlIGZlYXR1cmUuIEFuZCB0aGlzIG1ldGhvZCBpcwotICAgICAqIGRlbGVnYXRlZCB0byB0aGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBjb20uaWJtLmljdTRqbmkudGV4dC5EZWNpbWFsRm9ybWF0LgorICAgICAqIFNldHMgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBudW1iZXJzIHdpbGwgYmUgcGFyc2VkIGFzIGludGVnZXJzLgorICAgICAqIFdoZW4gdGhpcyBkZWNpbWFsIGZvcm1hdCBpcyB1c2VkIGZvciBwYXJzaW5nIGFuZCB0aGlzIHZhbHVlIGlzIHNldCB0bworICAgICAqIHtAY29kZSB0cnVlfSwgdGhlbiB0aGUgcmVzdWx0aW5nIG51bWJlcnMgd2lsbCBiZSBvZiB0eXBlCisgICAgICoge0Bjb2RlIGphdmEubGFuZy5JbnRlZ2VyfS4gU3BlY2lhbCBjYXNlcyBhcmUgTmFOLCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUKKyAgICAgKiBpbmZpbml0eSwgd2hpY2ggYXJlIHN0aWxsIHJldHVybmVkIGFzIHtAY29kZSBqYXZhLmxhbmcuRG91YmxlfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIElmIHNldCB0byB0cnVlLCBhbGwgdGhlIHJlc3VsdGluZyBudW1iZXIgd2lsbCBiZSBvZiB0eXBlCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuSW50ZWdlciBleGNlcHQgc29tZSBzcGVjaWFsIGNhc2VzLgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRoYXQgdGhlIHJlc3VsdGluZyBudW1iZXJzIG9mIHBhcnNlIG9wZXJhdGlvbnMKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgb2YgdHlwZSB7QGNvZGUgamF2YS5sYW5nLkludGVnZXJ9IGV4Y2VwdCBmb3IgdGhlCisgICAgICogICAgICAgICAgICBzcGVjaWFsIGNhc2VzIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUludGVnZXJPbmx5KGJvb2xlYW4gdmFsdWUpIHsKQEAgLTM5NywxMSArOTQ5LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgPGNvZGU+RGVjaW1hbEZvcm1hdDwvY29kZT4ncyBhbGwgcmVzdWx0aW5nIG51bWJlcgotICAgICAqIHdpbGwgYmUgb2YgdHlwZSA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBwYXJzaW5nIHdpdGggdGhpcyBkZWNpbWFsIGZvcm1hdCB3aWxsIG9ubHkKKyAgICAgKiByZXR1cm4gbnVtYmVycyBvZiB0eXBlIHtAY29kZSBqYXZhLmxhbmcuSW50ZWdlcn0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgPGNvZGU+RGVjaW1hbEZvcm1hdDwvY29kZT4ncyBhbGwgcmVzdWx0aW5nIG51bWJlcgotICAgICAqICAgICAgICAgd2lsbCBiZSBvZiB0eXBlIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMge0Bjb2RlIERlY2ltYWxGb3JtYXR9J3MgcGFyc2UgbWV0aG9kIG9ubHkKKyAgICAgKiAgICAgICAgIHJldHVybnMge0Bjb2RlIGphdmEubGFuZy5JbnRlZ2VyfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNQYXJzZUludGVnZXJPbmx5KCkgewpAQCAtNDExLDIwICs5NjQsMjggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEb3VibGUgTkVHQVRJVkVfWkVST19ET1VCTEUgPSBuZXcgRG91YmxlKC0wLjApOwogCiAgICAgLyoqCi0gICAgICogUGFyc2UgYSBMb25nIG9yIERvdWJsZSBmcm9tIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHN0YXJ0aW5nIGF0IHRoZSBpbmRleAotICAgICAqIHNwZWNpZmllZCBieSB0aGUgUGFyc2VQb3NpdGlvbi4gSWYgdGhlIHN0cmluZyBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCB0aGUKLSAgICAgKiBpbmRleCBvZiB0aGUgUGFyc2VQb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZAotICAgICAqIHRleHQuCisgICAgICogUGFyc2VzIGEge0Bjb2RlIExvbmd9IG9yIHtAY29kZSBEb3VibGV9IGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcKKyAgICAgKiBzdGFydGluZyBhdCB0aGUgaW5kZXggc3BlY2lmaWVkIGJ5IHtAY29kZSBwb3NpdGlvbn0uIElmIHRoZSBzdHJpbmcgaXMKKyAgICAgKiBzdWNjZXNzZnVsbHkgcGFyc2VkIHRoZW4gdGhlIGluZGV4IG9mIHRoZSB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gaXMKKyAgICAgKiB1cGRhdGVkIHRvIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZCB0ZXh0LiBPbiBlcnJvciwgdGhlIGluZGV4IGlzCisgICAgICogdW5jaGFuZ2VkIGFuZCB0aGUgZXJyb3IgaW5kZXggb2Yge0Bjb2RlIFBhcnNlUG9zaXRpb259IGlzIHNldCB0byB0aGUKKyAgICAgKiBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBwYXJzZQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KICAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBQYXJzZVBvc2l0aW9uLCB1cGRhdGVkIG9uIHJldHVybiB3aXRoIHRoZSBpbmRleCBmb2xsb3dpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgdGV4dCwgb3Igb24gZXJyb3IgdGhlIGluZGV4IGlzIHVuY2hhbmdlZCBhbmQgdGhlCi0gICAgICogICAgICAgICAgICBlcnJvciBpbmRleCBpcyBzZXQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZAotICAgICAqIEByZXR1cm4gYSBMb25nIG9yIERvdWJsZSByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIG51bGwgaWYgdGhlcmUgaXMgYW4KLSAgICAgKiAgICAgICAgIGVycm9yLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBMb25nIGlmIHRoZSBwYXJzZWQgbnVtYmVyIGlzIGFuCi0gICAgICogICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiBhIGxvbmcsIG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGEgRG91YmxlLgorICAgICAqICAgICAgICAgICAgaW5wdXQvb3V0cHV0IHBhcmFtZXRlciwgc3BlY2lmaWVzIHRoZSBzdGFydCBpbmRleCBpbgorICAgICAqICAgICAgICAgICAge0Bjb2RlIHN0cmluZ30gZnJvbSB3aGVyZSB0byBzdGFydCBwYXJzaW5nLiBJZiBwYXJzaW5nIGlzCisgICAgICogICAgICAgICAgICBzdWNjZXNzZnVsLCBpdCBpcyB1cGRhdGVkIHdpdGggdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkCisgICAgICogICAgICAgICAgICB0ZXh0OyBvbiBlcnJvciwgdGhlIGluZGV4IGlzIHVuY2hhbmdlZCBhbmQgdGhlIGVycm9yIGluZGV4IGlzCisgICAgICogICAgICAgICAgICBzZXQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIExvbmd9IG9yIHtAY29kZSBEb3VibGV9IHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZSBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIGFuIGVycm9yLiBUaGUgcmVzdWx0IHdpbGwgYmUgYQorICAgICAqICAgICAgICAge0Bjb2RlIExvbmd9IGlmIHRoZSBwYXJzZWQgbnVtYmVyIGlzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIGEKKyAgICAgKiAgICAgICAgIGxvbmcsIG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGEge0Bjb2RlIERvdWJsZX0uIElmCisgICAgICogICAgICAgICB7QGNvZGUgaXNQYXJzZUJpZ0RlY2ltYWx9IGlzIHtAY29kZSB0cnVlfSB0aGVuIGl0IHJldHVybnMgdGhlCisgICAgICogICAgICAgICByZXN1bHQgYXMgYSB7QGNvZGUgQmlnRGVjaW1hbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE51bWJlciBwYXJzZShTdHJpbmcgc3RyaW5nLCBQYXJzZVBvc2l0aW9uIHBvc2l0aW9uKSB7CkBAIC00ODMsMTAgKzEwNDQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBEZWNpbWFsRm9ybWF0U3ltYm9scyB1c2VkIGJ5IHRoaXMgRGVjaW1hbEZvcm1hdC4KKyAgICAgKiBTZXRzIHRoZSB7QGNvZGUgRGVjaW1hbEZvcm1hdFN5bWJvbHN9IHVzZWQgYnkgdGhpcyBkZWNpbWFsIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBEZWNpbWFsRm9ybWF0U3ltYm9scworICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30gdG8gc2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlY2ltYWxGb3JtYXRTeW1ib2xzKERlY2ltYWxGb3JtYXRTeW1ib2xzIHZhbHVlKSB7CiAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CkBAIC01MDIsMTIgKzEwNjQsMTYgQEAKICAgICAgKiBkaWdpdHMgcmVtYWluIHRoZSBzYW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSBjdXJyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIGN1cnJlbmN5IHRoaXMge0Bjb2RlIERlY2ltYWxGb3JtYXR9IHNob3VsZCB1c2UuCiAgICAgICogQHNlZSBEZWNpbWFsRm9ybWF0U3ltYm9scyNzZXRDdXJyZW5jeShDdXJyZW5jeSkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeShDdXJyZW5jeSBjdXJyZW5jeSkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgZGZvcm0uc2V0Q3VycmVuY3koQ3VycmVuY3kuZ2V0SW5zdGFuY2UoY3VycmVuY3kKICAgICAgICAgICAgICAgICAuZ2V0Q3VycmVuY3lDb2RlKCkpKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBzeW1ib2xzLnNldEN1cnJlbmN5KGN1cnJlbmN5KTsKICAgICB9CiAKQEAgLTUxNiw4ICsxMDgyLDkgQEAKICAgICAgKiBkaWdpdHMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0cnVlIGlmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBzaG91bGQgYWx3YXlzIGJlIGZvcm1hdHRlZCwKLSAgICAgKiAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBzaG91bGQgYWx3YXlzIGJlCisgICAgICogICAgICAgICAgICBmb3JtYXR0ZWQ7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlY2ltYWxTZXBhcmF0b3JBbHdheXNTaG93bihib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGRmb3JtLnNldERlY2ltYWxTZXBhcmF0b3JBbHdheXNTaG93bih2YWx1ZSk7CkBAIC01MjUsOSArMTA5MiwxMiBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBncm91cGVkIHRvZ2V0aGVyIGJ5IHRoZSBncm91cGluZyBzZXBhcmF0b3IuCisgICAgICogVGhpcyBvbmx5IGFsbG93cyB0byBzZXQgdGhlIHByaW1hcnkgZ3JvdXBpbmcgc2l6ZTsgdGhlIHNlY29uZGFyeSBncm91cGluZworICAgICAqIHNpemUgY2FuIG9ubHkgYmUgc2V0IHdpdGggYSBwYXR0ZXJuLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkaWdpdHMgZ3JvdXBlZCB0b2dldGhlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkaWdpdHMgZ3JvdXBlZCB0b2dldGhlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRHcm91cGluZ1NpemUoaW50IHZhbHVlKSB7CiAgICAgICAgIGRmb3JtLnNldEdyb3VwaW5nU2l6ZSh2YWx1ZSk7CkBAIC01MzgsOCArMTEwOCw4IEBACiAgICAgICogYWZmZWN0cyBib3RoIHBhcnNpbmcgYW5kIGZvcm1hdHRpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0cnVlIGlmIHVzZXMgZ3JvdXBpbmcsZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIGdyb3VwaW5nIGlzIHVzZWQ7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwaW5nVXNlZChib29sZWFuIHZhbHVlKSB7CkBAIC01NDcsOSArMTExNywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgZ3JvdXBpbmcgd2lsbCBiZSB1c2VkIGluIHRoaXMgZm9ybWF0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGdyb3VwaW5nIHdpbGwgYmUgdXNlZCBpbiB0aGlzIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ3JvdXBpbmcgaXMgdXNlZCxmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ3JvdXBpbmcgaXMgdXNlZDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNHcm91cGluZ1VzZWQoKSB7CkBAIC01NTgsMTIgKzExMjksMTUgQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cyB0aGF0IGFyZSBwcmludGVkIHdoZW4KLSAgICAgKiBmb3JtYXR0aW5nLiBJZiB0aGUgbWF4aW11bSBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMsCi0gICAgICogdGhlIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cyBhcmUgdHJ1bmNhdGVkLiBMaW1pdCB0aGUgbWF4aW11bSB0bwotICAgICAqIERPVUJMRV9GUkFDVElPTl9ESUdJVFMuCisgICAgICogZm9ybWF0dGluZyBudW1iZXJzIG90aGVyIHRoYW4ge0Bjb2RlIEJpZ0RlY2ltYWx9IGFuZCB7QGNvZGUgQmlnSW50ZWdlcn0uCisgICAgICogSWYgdGhlIG1heGltdW0gaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzLCB0aGUgbGVhc3QKKyAgICAgKiBzaWduaWZpY2FudCBkaWdpdHMgYXJlIHRydW5jYXRlZC4gSWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBiaWdnZXIgdGhhbiAzNDAKKyAgICAgKiB0aGVuIGl0IGlzIHJlcGxhY2VkIGJ5IDM0MC4gSWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBuZWdhdGl2ZSB0aGVuIGl0IGlzCisgICAgICogcmVwbGFjZWQgYnkgMC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKGludCB2YWx1ZSkgewpAQCAtNTczLDEyICsxMTQ3LDE1IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyB0aGF0IGFyZSBwcmludGVkIHdoZW4KLSAgICAgKiBmb3JtYXR0aW5nLiBJZiB0aGUgbWF4aW11bSBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cywgdGhlCi0gICAgICogbW9zdCBzaWduaWZpY2FudCBkaWdpdHMgYXJlIHRydW5jYXRlZC4gTGltaXQgdGhlIG1heGltdW0gdG8KLSAgICAgKiBET1VCTEVfSU5URUdFUl9ESUdJVFMuCisgICAgICogZm9ybWF0dGluZyBudW1iZXJzIG90aGVyIHRoYW4ge0Bjb2RlIEJpZ0RlY2ltYWx9IGFuZCB7QGNvZGUgQmlnSW50ZWdlcn0uCisgICAgICogSWYgdGhlIG1heGltdW0gaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMsIHRoZSBtb3N0CisgICAgICogc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSB0cnVuY2F0ZWQuIElmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYmlnZ2VyIHRoYW4gMzA5CisgICAgICogdGhlbiBpdCBpcyByZXBsYWNlZCBieSAzMDkuIElmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgbmVnYXRpdmUgdGhlbiBpdCBpcworICAgICAqIHJlcGxhY2VkIGJ5IDAuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtSW50ZWdlckRpZ2l0cyhpbnQgdmFsdWUpIHsKQEAgLTU4OCwxMCArMTE2NSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRoYXQgYXJlIHByaW50ZWQgd2hlbgotICAgICAqIGZvcm1hdHRpbmcuIExpbWl0IHRoZSBtaW5pbXVtIHRvIERPVUJMRV9GUkFDVElPTl9ESUdJVFMuCisgICAgICogZm9ybWF0dGluZyBudW1iZXJzIG90aGVyIHRoYW4ge0Bjb2RlIEJpZ0RlY2ltYWx9IGFuZCB7QGNvZGUgQmlnSW50ZWdlcn0uCisgICAgICogSWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBiaWdnZXIgdGhhbiAzNDAgdGhlbiBpdCBpcyByZXBsYWNlZCBieSAzNDAuIElmIHRoZQorICAgICAqIHZhbHVlIHBhc3NlZCBpcyBuZWdhdGl2ZSB0aGVuIGl0IGlzIHJlcGxhY2VkIGJ5IDAuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1GcmFjdGlvbkRpZ2l0cyhpbnQgdmFsdWUpIHsKQEAgLTYwMSwxMCArMTE4MSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgdGhhdCBhcmUgcHJpbnRlZCB3aGVuCi0gICAgICogZm9ybWF0dGluZy4gTGltaXQgdGhlIG1pbmltdW0gdG8gRE9VQkxFX0lOVEVHRVJfRElHSVRTLgorICAgICAqIGZvcm1hdHRpbmcgbnVtYmVycyBvdGhlciB0aGFuIHtAY29kZSBCaWdEZWNpbWFsfSBhbmQge0Bjb2RlIEJpZ0ludGVnZXJ9LgorICAgICAqIElmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYmlnZ2VyIHRoYW4gMzA5IHRoZW4gaXQgaXMgcmVwbGFjZWQgYnkgMzA5LiBJZiB0aGUKKyAgICAgKiB2YWx1ZSBwYXNzZWQgaXMgbmVnYXRpdmUgdGhlbiBpdCBpcyByZXBsYWNlZCBieSAwLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0TWluaW11bUludGVnZXJEaWdpdHMoaW50IHZhbHVlKSB7CkBAIC02MTcsNyArMTIwMCw4IEBACiAgICAgICogYWZ0ZXIgcGFyc2luZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aXBsaWVyCisgICAgICogICAgICAgICAgICB0aGUgbXVsdGlwbGllci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aXBsaWVyKGludCB2YWx1ZSkgewogICAgICAgICBkZm9ybS5zZXRNdWx0aXBsaWVyKHZhbHVlKTsKQEAgLTYyNyw3ICsxMjExLDggQEAKICAgICAgKiBTZXRzIHRoZSBwcmVmaXggd2hpY2ggaXMgZm9ybWF0dGVkIG9yIHBhcnNlZCBiZWZvcmUgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmVnYXRpdmUgcHJlZml4CisgICAgICogICAgICAgICAgICB0aGUgbmVnYXRpdmUgcHJlZml4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE5lZ2F0aXZlUHJlZml4KFN0cmluZyB2YWx1ZSkgewogICAgICAgICBkZm9ybS5zZXROZWdhdGl2ZVByZWZpeCh2YWx1ZSk7CkBAIC02MzcsNyArMTIyMiw4IEBACiAgICAgICogU2V0cyB0aGUgc3VmZml4IHdoaWNoIGlzIGZvcm1hdHRlZCBvciBwYXJzZWQgYWZ0ZXIgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmVnYXRpdmUgc3VmZml4CisgICAgICogICAgICAgICAgICB0aGUgbmVnYXRpdmUgc3VmZml4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE5lZ2F0aXZlU3VmZml4KFN0cmluZyB2YWx1ZSkgewogICAgICAgICBkZm9ybS5zZXROZWdhdGl2ZVN1ZmZpeCh2YWx1ZSk7CkBAIC02NDcsNyArMTIzMyw4IEBACiAgICAgICogU2V0cyB0aGUgcHJlZml4IHdoaWNoIGlzIGZvcm1hdHRlZCBvciBwYXJzZWQgYmVmb3JlIGEgcG9zaXRpdmUgbnVtYmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aXZlIHByZWZpeAorICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aXZlIHByZWZpeC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGl2ZVByZWZpeChTdHJpbmcgdmFsdWUpIHsKICAgICAgICAgZGZvcm0uc2V0UG9zaXRpdmVQcmVmaXgodmFsdWUpOwpAQCAtNjU3LDM4ICsxMjQ0LDQzIEBACiAgICAgICogU2V0cyB0aGUgc3VmZml4IHdoaWNoIGlzIGZvcm1hdHRlZCBvciBwYXJzZWQgYWZ0ZXIgYSBwb3NpdGl2ZSBudW1iZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgcG9zaXRpdmUgc3VmZml4CisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpdmUgc3VmZml4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aXZlU3VmZml4KFN0cmluZyB2YWx1ZSkgewogICAgICAgICBkZm9ybS5zZXRQb3NpdGl2ZVN1ZmZpeCh2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTGV0IHVzZXJzIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgYSBEZWNpbWFsRm9ybWF0LCBJZiBzZXQgdG8gdHJ1ZSBhbGwgdGhlCi0gICAgICogcmV0dXJuZWQgb2JqZWN0cyB3aWxsIGJlIG9mIHR5cGUgQmlnRGVjaW1hbAorICAgICAqIFNldHMgdGhlIGJlaGF2aW91ciBvZiB0aGUgcGFyc2UgbWV0aG9kLiBJZiBzZXQgdG8ge0Bjb2RlIHRydWV9IHRoZW4gYWxsCisgICAgICogdGhlIHJldHVybmVkIG9iamVjdHMgd2lsbCBiZSBvZiB0eXBlIHtAY29kZSBCaWdEZWNpbWFsfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmV3VmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgYWxsIHRoZSByZXR1cm5lZCBvYmplY3RzIHNob3VsZCBiZSB0eXBlIG9mIEJpZ0RlY2ltYWwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBhbGwgdGhlIHJldHVybmVkIG9iamVjdHMgc2hvdWxkIGJlIG9mIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBCaWdEZWNpbWFsfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFyc2VCaWdEZWNpbWFsKGJvb2xlYW4gbmV3VmFsdWUpIHsKICAgICAgICAgdGhpcy5wYXJzZUJpZ0RlY2ltYWwgPSBuZXdWYWx1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXR0ZXJuIG9mIHRoaXMgRGVjaW1hbEZvcm1hdCB1c2luZyBsb2NhbGl6ZWQgcGF0dGVybgorICAgICAqIFJldHVybnMgdGhlIHBhdHRlcm4gb2YgdGhpcyBkZWNpbWFsIGZvcm1hdCB1c2luZyBsb2NhbGl6ZWQgcGF0dGVybgogICAgICAqIGNoYXJhY3RlcnMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYWxpemVkIHBhdHRlcm4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgcGF0dGVybi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvTG9jYWxpemVkUGF0dGVybigpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLnRvTG9jYWxpemVkUGF0dGVybigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdHRlcm4gb2YgdGhpcyBEZWNpbWFsRm9ybWF0IHVzaW5nIG5vbi1sb2NhbGl6ZWQgcGF0dGVybgorICAgICAqIFJldHVybnMgdGhlIHBhdHRlcm4gb2YgdGhpcyBkZWNpbWFsIGZvcm1hdCB1c2luZyBub24tbG9jYWxpemVkIHBhdHRlcm4KICAgICAgKiBjaGFyYWN0ZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5vbi1sb2NhbGl6ZWQgcGF0dGVybgorICAgICAqIEByZXR1cm4gdGhlIG5vbi1sb2NhbGl6ZWQgcGF0dGVybi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvUGF0dGVybigpIHsKICAgICAgICAgcmV0dXJuIGRmb3JtLnRvUGF0dGVybigpOwpAQCAtODQzLDcgKzE0MzUsOSBAQAogICAgICAgICBzZXRJbnRlcm5hbEZpZWxkKCJuZWdTdWZmaXhQYXR0ZXJuIiwgZGZvcm0sIG5lZ1N1ZmZpeFBhdHRlcm4pOyAvLyROT04tTkxTLTEkCiAgICAgICAgIGRmb3JtLnNldE11bHRpcGxpZXIobXVsdGlwbGllcik7CiAgICAgICAgIGRmb3JtLnNldEdyb3VwaW5nU2l6ZShncm91cGluZ1NpemUpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgICAgIGRmb3JtLnNldEdyb3VwaW5nVXNlZChncm91cGluZ1VzZWQpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICBkZm9ybS5zZXREZWNpbWFsU2VwYXJhdG9yQWx3YXlzU2hvd24oZGVjaW1hbFNlcGFyYXRvckFsd2F5c1Nob3duKTsKICAgICAgICAgZGZvcm0uc2V0TWluaW11bUludGVnZXJEaWdpdHMobWluaW11bUludGVnZXJEaWdpdHMpOwogICAgICAgICBkZm9ybS5zZXRNYXhpbXVtSW50ZWdlckRpZ2l0cyhtYXhpbXVtSW50ZWdlckRpZ2l0cyk7CkBAIC04NzksOCArMTQ3MywxMCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjb3B5U3ltYm9scyhmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyBpY3UsCiAgICAgICAgICAgICBmaW5hbCBEZWNpbWFsRm9ybWF0U3ltYm9scyBkZnMpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGljdS5zZXRDdXJyZW5jeShDdXJyZW5jeS5nZXRJbnN0YW5jZShkZnMuZ2V0Q3VycmVuY3koKQogICAgICAgICAgICAgICAgIC5nZXRDdXJyZW5jeUNvZGUoKSkpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGljdS5zZXRDdXJyZW5jeVN5bWJvbChkZnMuZ2V0Q3VycmVuY3lTeW1ib2woKSk7CiAgICAgICAgIGljdS5zZXREZWNpbWFsU2VwYXJhdG9yKGRmcy5nZXREZWNpbWFsU2VwYXJhdG9yKCkpOwogICAgICAgICBpY3Uuc2V0RGlnaXQoZGZzLmdldERpZ2l0KCkpOwpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0U3ltYm9scy5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0U3ltYm9scy5qYXZhCmluZGV4IDQ5MThhMWYuLjM0MTVlZTggMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGVjaW1hbEZvcm1hdFN5bWJvbHMuamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0RlY2ltYWxGb3JtYXRTeW1ib2xzLmphdmEKQEAgLTE0LDYgKzE0LDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTI4LDggKzQwLDE2IEBACiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogCiAvKioKLSAqIERlY2ltYWxGb3JtYXRTeW1ib2xzIGhvbGRzIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIGZvcm1hdGluZyBhbmQgcGFyc2luZyBvZgotICogbnVtYmVycy4KKyAqIEVuY2Fwc3VsYXRlcyB0aGUgc2V0IG9mIHN5bWJvbHMgKHN1Y2ggYXMgdGhlIGRlY2ltYWwgc2VwYXJhdG9yLCB0aGUgZ3JvdXBpbmcKKyAqIHNlcGFyYXRvciwgYW5kIHNvIG9uKSBuZWVkZWQgYnkge0Bjb2RlIERlY2ltYWxGb3JtYXR9IHRvIGZvcm1hdCBudW1iZXJzLgorICoge0Bjb2RlIERlY2ltYWxGb3JtYXR9IGludGVybmFsbHkgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZgorICoge0Bjb2RlIERlY2ltYWxGb3JtYXRTeW1ib2xzfSBmcm9tIGl0cyBsb2NhbGUgZGF0YS4gSWYgeW91IG5lZWQgdG8gY2hhbmdlIGFueQorICogb2YgdGhlc2Ugc3ltYm9scywgeW91IGNhbiBnZXQgdGhlIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30gb2JqZWN0IGZyb20KKyAqIHlvdXIge0Bjb2RlIERlY2ltYWxGb3JtYXR9IGFuZCBtb2RpZnkgaXQuCisgKiAKKyAqIEBzZWUgamF2YS51dGlsLkxvY2FsZQorICogQHNlZSBEZWNpbWFsRm9ybWF0CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERlY2ltYWxGb3JtYXRTeW1ib2xzIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewogCkBAIC00OSw4ICs2OSwxMiBAQAogICAgIHByaXZhdGUgU3RyaW5nIGluZmluaXR5LCBOYU4sIGN1cnJlbmN5U3ltYm9sLCBpbnRsQ3VycmVuY3lTeW1ib2w7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzIGNvbnRhaW5pbmcgdGhlIHN5bWJvbHMgZm9yIHRoZQotICAgICAqIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERlY2ltYWxGb3JtYXRTeW1ib2xzfSBjb250YWluaW5nIHRoZSBzeW1ib2xzIGZvcgorICAgICAqIHRoZSBkZWZhdWx0IGxvY2FsZS4gQmVzdCBwcmFjdGljZSBpcyB0byBjcmVhdGUgYSB7QGNvZGUgRGVjaW1hbEZvcm1hdH0KKyAgICAgKiBhbmQgdGhlbiB0byBnZXQgdGhlIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30gZnJvbSB0aGF0IG9iamVjdCBieQorICAgICAqIGNhbGxpbmcge0BsaW5rIERlY2ltYWxGb3JtYXQjZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERlY2ltYWxGb3JtYXRTeW1ib2xzKCkgewogICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkpOwpAQCAtNTgsMTAgKzgyLDEzIEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzIGNvbnRhaW5pbmcgdGhlIHN5bWJvbHMgZm9yIHRoZQotICAgICAqIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogc3BlY2lmaWVkIExvY2FsZS4gQmVzdCBwcmFjdGljZSBpcyB0byBjcmVhdGUgYSB7QGNvZGUgRGVjaW1hbEZvcm1hdH0KKyAgICAgKiBhbmQgdGhlbiB0byBnZXQgdGhlIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30gZnJvbSB0aGF0IG9iamVjdCBieQorICAgICAqIGNhbGxpbmcge0BsaW5rIERlY2ltYWxGb3JtYXQjZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRGVjaW1hbEZvcm1hdFN5bWJvbHMoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBGb3JtYXQuZ2V0QnVuZGxlKGxvY2FsZSk7CkBAIC04MSwxMiArMTA4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyB3aXRoIHRoZSBzYW1lIHN5bWJvbHMgYXMgdGhpcwotICAgICAqIERlY2ltYWxGb3JtYXRTeW1ib2xzLgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIERlY2ltYWxGb3JtYXRTeW1ib2xzfSB3aXRoIHRoZSBzYW1lIHN5bWJvbHMgYXMgdGhpcworICAgICAqIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIERlY2ltYWxGb3JtYXRTeW1ib2xzCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30uCiAgICAgICogCiAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKQEAgLTEwMCwxNiArMTI4LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBEZWNpbWFsRm9ybWF0U3ltYm9scyBhbmQgYW5zd2VyIGlmCi0gICAgICogdGhleSBhcmUgZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEZWNpbWFsRm9ybWF0U3ltYm9scwotICAgICAqIHdpdGggdGhlIHNhbWUgc3ltYm9scy4KKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30gYW5kCisgICAgICogaW5kaWNhdGVzIGlmIHRoZXkgYXJlIGVxdWFsLiBJbiBvcmRlciB0byBiZSBlcXVhbCwge0Bjb2RlIG9iamVjdH0gbXVzdCBiZQorICAgICAqIGFuIGluc3RhbmNlIG9mIHtAY29kZSBEZWNpbWFsRm9ybWF0U3ltYm9sc30gYW5kIGNvbnRhaW4gdGhlIHNhbWUgc3ltYm9scy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCi0gICAgICogICAgICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgRGVjaW1hbEZvcm1hdFN5bWJvbHN9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC0xMjksMTYgKzE1NywxNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbmN5LgogICAgICAqIDxwPgotICAgICAqIDxjb2RlPm51bGw8Y29kZT4gaXMgcmV0dXJuZWQKLSAgICAgKiBpZiA8Y29kZT5zZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2woKTwvY29kZT4gaGFzIGJlZW4gcHJldmlvdXNseSBjYWxsZWQKLSAgICAgKiB3aXRoIGEgdmFsdWUgdGhhdCBpcyBub3QgYSB2YWxpZCBJU08gNDIxNyBjdXJyZW5jeSBjb2RlLgorICAgICAqIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZCBpZiB7QGNvZGUgc2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKCl9IGhhcworICAgICAqIGJlZW4gcHJldmlvdXNseSBjYWxsZWQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgbm90IGEgdmFsaWQgSVNPIDQyMTcgY3VycmVuY3kKKyAgICAgKiBjb2RlLgogICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHJldHVybiAgICAgICAgdGhlIGN1cnJlbmN5IHRoYXQgd2FzIHNldCBpbiB0aGUgY29uc3RydWN0b3IsIDxjb2RlPnNldEN1cnJlbmN5KCk8L2NvZGU+LAotICAgICAqICAgICAgICAgICAgICAgICBvciA8Y29kZT5zZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2woKTwvY29kZT4sIG9yIDwvY29kZT5udWxsPC9jb2RlPgogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbmN5IHRoYXQgd2FzIHNldCBpbiB0aGUgY29uc3RydWN0b3Igb3IgYnkgY2FsbGluZworICAgICAqICAgICAgICAge0Bjb2RlIHNldEN1cnJlbmN5KCl9IG9yIHtAY29kZSBzZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2woKX0sCisgICAgICogICAgICAgICBvciB7QGNvZGUgbnVsbH0gaWYgYW4gaW52YWxpZCBjdXJyZW5jeSB3YXMgc2V0LgogICAgICAqIEBzZWUgI3NldEN1cnJlbmN5KEN1cnJlbmN5KQogICAgICAqIEBzZWUgI3NldEludGVybmF0aW9uYWxDdXJyZW5jeVN5bWJvbChTdHJpbmcpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEN1cnJlbmN5IGdldEN1cnJlbmN5KCkgewogICAgICAgICByZXR1cm4gY3VycmVuY3k7CkBAIC0xNDcsNyArMTc2LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcm5hdGlvbmFsIGN1cnJlbmN5IHN5bWJvbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgYXMgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKCkgewogICAgICAgICByZXR1cm4gaW50bEN1cnJlbmN5U3ltYm9sOwpAQCAtMTU2LDcgKzE4Niw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY3VycmVuY3kgc3ltYm9sLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW5jeSBzeW1ib2wgYXMgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woKSB7CiAgICAgICAgIHJldHVybiBjdXJyZW5jeVN5bWJvbDsKQEAgLTE2NSw3ICsxOTYsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciB3aGljaCByZXByZXNlbnRzIHRoZSBkZWNpbWFsIHBvaW50IGluIGEgbnVtYmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjaGFyCisgICAgICogQHJldHVybiB0aGUgZGVjaW1hbCBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGdldERlY2ltYWxTZXBhcmF0b3IoKSB7CiAgICAgICAgIHJldHVybiBwYXR0ZXJuQ2hhcnNbRGVjaW1hbFNlcGFyYXRvcl07CkBAIC0xNzUsNyArMjA3LDggQEAKICAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgd2hpY2ggcmVwcmVzZW50cyBhIHNpbmdsZSBkaWdpdCBpbiBhIGZvcm1hdAogICAgICAqIHBhdHRlcm4uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGNoYXIKKyAgICAgKiBAcmV0dXJuIHRoZSBkaWdpdCBwYXR0ZXJuIGNoYXJhY3Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBnZXREaWdpdCgpIHsKICAgICAgICAgcmV0dXJuIHBhdHRlcm5DaGFyc1tEaWdpdF07CkBAIC0xODQsMzAgKzIxNywyOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciB1c2VkIGFzIHRoZSB0aG91c2FuZHMgc2VwYXJhdG9yIGluIGEgbnVtYmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjaGFyCisgICAgICogQHJldHVybiB0aGUgdGhvdXNhbmRzIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgZ2V0R3JvdXBpbmdTZXBhcmF0b3IoKSB7CiAgICAgICAgIHJldHVybiBwYXR0ZXJuQ2hhcnNbR3JvdXBpbmdTZXBhcmF0b3JdOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFN0cmluZyB3aGljaCByZXByZXNlbnRzIGluZmluaXR5LgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB3aGljaCByZXByZXNlbnRzIGluZmluaXR5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmZpbml0eSBzeW1ib2wgYXMgYSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRJbmZpbml0eSgpIHsKICAgICAgICAgcmV0dXJuIGluZmluaXR5OwogICAgIH0KIAotICAgIFN0cmluZyBnZXRMb2NhbFBhdHRlcm5DaGFycygpIHsKLSAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgTW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yIG9yIHRoZSBNaW51c1NpZ24KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocGF0dGVybkNoYXJzLCAwLCBwYXR0ZXJuQ2hhcnMubGVuZ3RoIC0gMik7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWludXMgc2lnbiBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGNoYXIKKyAgICAgKiBAcmV0dXJuIHRoZSBtaW51cyBzaWduIGFzIGEgY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGdldE1pbnVzU2lnbigpIHsKICAgICAgICAgcmV0dXJuIHBhdHRlcm5DaGFyc1tNaW51c1NpZ25dOwpAQCAtMjE3LDE2ICsyNDgsMTggQEAKICAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGVjaW1hbCBwb2ludCBpbiBhIG1vbmV0YXJ5CiAgICAgICogdmFsdWUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGNoYXIKKyAgICAgKiBAcmV0dXJuIHRoZSBtb25ldGFyeSBkZWNpbWFsIHBvaW50IGFzIGEgY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGdldE1vbmV0YXJ5RGVjaW1hbFNlcGFyYXRvcigpIHsKICAgICAgICAgcmV0dXJuIHBhdHRlcm5DaGFyc1tNb25ldGFyeURlY2ltYWxTZXBhcmF0b3JdOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFN0cmluZyB3aGljaCByZXByZXNlbnRzIE5hTi4KKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBOYU4uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZworICAgICAqIEByZXR1cm4gdGhlIHN5bWJvbCBOYU4gYXMgYSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYU4oKSB7CiAgICAgICAgIHJldHVybiBOYU47CkBAIC0yMzYsNyArMjY5LDggQEAKICAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgd2hpY2ggc2VwYXJhdGVzIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGF0dGVybnMKICAgICAgKiBpbiBhIGZvcm1hdCBwYXR0ZXJuLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjaGFyCisgICAgICogQHJldHVybiB0aGUgcGF0dGVybiBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGdldFBhdHRlcm5TZXBhcmF0b3IoKSB7CiAgICAgICAgIHJldHVybiBwYXR0ZXJuQ2hhcnNbUGF0dGVyblNlcGFyYXRvcl07CkBAIC0yNDUsMTYgKzI3OSwxOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHBlcmNlbnQgY2hhcmFjdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjaGFyCisgICAgICogQHJldHVybiB0aGUgcGVyY2VudCBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgZ2V0UGVyY2VudCgpIHsKICAgICAgICAgcmV0dXJuIHBhdHRlcm5DaGFyc1tQZXJjZW50XTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtaWxsZSBwZXJjZW50IHNpZ24gY2hhcmFjdGVyLgorICAgICAqIFJldHVybnMgdGhlIHBlciBtaWxsIHNpZ24gY2hhcmFjdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjaGFyCisgICAgICogQHJldHVybiB0aGUgcGVyIG1pbGwgc2lnbiBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgZ2V0UGVyTWlsbCgpIHsKICAgICAgICAgcmV0dXJuIHBhdHRlcm5DaGFyc1tQZXJNaWxsXTsKQEAgLTI2MywyNCArMjk5LDIwIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIHdoaWNoIHJlcHJlc2VudHMgemVyby4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgY2hhcgorICAgICAqIEByZXR1cm4gdGhlIHplcm8gY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyIGdldFplcm9EaWdpdCgpIHsKICAgICAgICAgcmV0dXJuIHBhdHRlcm5DaGFyc1taZXJvRGlnaXRdOwogICAgIH0KIAorICAgIC8qCisgICAgICogUmV0dXJucyB0aGUgZXhwb25lbnQgYXMgYSBjaGFyYWN0ZXIuCisgICAgICovCiAgICAgY2hhciBnZXRFeHBvbmVudGlhbCgpIHsKICAgICAgICAgcmV0dXJuIHBhdHRlcm5DaGFyc1tFeHBvbmVudF07CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocGF0dGVybkNoYXJzKS5oYXNoQ29kZSgpICsgaW5maW5pdHkuaGFzaENvZGUoKQpAQCAtMjkxLDE1ICszMjMsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjdXJyZW5jeS4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgYW5kIGN1cnJlbmN5IHN5bWJvbCBhcmUgdXBkYXRlZCwgYnV0Ci0gICAgICogdGhlIG1pbiBhbmQgbWF4IG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgc3RheSB0aGUgc2FtZS4KKyAgICAgKiBUaGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgYW5kIHRoZSBjdXJyZW5jeSBzeW1ib2wgYXJlIHVwZGF0ZWQsCisgICAgICogYnV0IHRoZSBtaW4gYW5kIG1heCBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHN0YXlzIHRoZSBzYW1lLgogICAgICAqIDxwPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjdXJyZW5jeQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjdXJyZW5jeQotICAgICAqIAotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgY3VycmVuY3kgaXMgbnVsbAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjdXJyZW5jeS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGN1cnJlbmN5fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VycmVuY3koQ3VycmVuY3kgY3VycmVuY3kpIHsKICAgICAgICAgaWYgKGN1cnJlbmN5ID09IG51bGwpIHsKQEAgLTMxNiwxMyArMzQ4LDE0IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wuCiAgICAgICogPHA+Ci0gICAgICogY3VycmVuY3kgYW5kIGN1cnJlbmN5IHN5bWJvbCBhbHNvIGFyZSB1cGRhdGVkLCBpZiA8Y29kZT52YWx1ZTwvY29kZT4gaXMKLSAgICAgKiBhIHZhbGlkIElTTzQyMTcgY3VycmVuY3kgY29kZS4KKyAgICAgKiBUaGUgY3VycmVuY3kgYW5kIGN1cnJlbmN5IHN5bWJvbCBhcmUgYWxzbyB1cGRhdGVkIGlmIHtAY29kZSB2YWx1ZX0gaXMgYQorICAgICAqIHZhbGlkIElTTzQyMTcgY3VycmVuY3kgY29kZS4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgbWluIGFuZCBtYXggbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cyBzdGF5IHRoZSBzYW1lLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgY3VycmVuY3kgY29kZQorICAgICAqICAgICAgICAgICAgdGhlIGN1cnJlbmN5IGNvZGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKFN0cmluZyB2YWx1ZSkgewogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewpAQCAtMzQ4LDcgKzM4MSw4IEBACiAgICAgICogU2V0cyB0aGUgY3VycmVuY3kgc3ltYm9sLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgYSBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIGN1cnJlbmN5U3ltYm9sID0gdmFsdWU7CkBAIC0zNTgsNyArMzkyLDggQEAKICAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGVjaW1hbCBwb2ludCBpbiBhIG51bWJlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGVjaW1hbFNlcGFyYXRvcihjaGFyIHZhbHVlKSB7CiAgICAgICAgIHBhdHRlcm5DaGFyc1tEZWNpbWFsU2VwYXJhdG9yXSA9IHZhbHVlOwpAQCAtMzY4LDcgKzQwMyw4IEBACiAgICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIHdoaWNoIHJlcHJlc2VudHMgYSBzaW5nbGUgZGlnaXQgaW4gYSBmb3JtYXQgcGF0dGVybi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWdpdCBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaWdpdCBjaGFyYWN0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGlnaXQoY2hhciB2YWx1ZSkgewogICAgICAgICBwYXR0ZXJuQ2hhcnNbRGlnaXRdID0gdmFsdWU7CkBAIC0zNzgsMTcgKzQxNCwxOSBAQAogICAgICAqIFNldHMgdGhlIGNoYXJhY3RlciB1c2VkIGFzIHRoZSB0aG91c2FuZHMgc2VwYXJhdG9yIGluIGEgbnVtYmVyLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGdyb3VwaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBncm91cGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwaW5nU2VwYXJhdG9yKGNoYXIgdmFsdWUpIHsKICAgICAgICAgcGF0dGVybkNoYXJzW0dyb3VwaW5nU2VwYXJhdG9yXSA9IHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFN0cmluZyB3aGljaCByZXByZXNlbnRzIGluZmluaXR5LgorICAgICAqIFNldHMgdGhlIHN0cmluZyB3aGljaCByZXByZXNlbnRzIGluZmluaXR5LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgaW5maW5pdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5maW5pdHkoU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIGluZmluaXR5ID0gdmFsdWU7CkBAIC0zOTgsNyArNDM2LDggQEAKICAgICAgKiBTZXRzIHRoZSBtaW51cyBzaWduIGNoYXJhY3Rlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW51cyBzaWduIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgdGhlIG1pbnVzIHNpZ24gY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1pbnVzU2lnbihjaGFyIHZhbHVlKSB7CiAgICAgICAgIHBhdHRlcm5DaGFyc1tNaW51c1NpZ25dID0gdmFsdWU7CkBAIC00MDksMTcgKzQ0OCwxOSBAQAogICAgICAqIHZhbHVlLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG1vbmV0YXJ5IGRlY2ltYWwgc2VwYXJhdG9yIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgdGhlIG1vbmV0YXJ5IGRlY2ltYWwgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNb25ldGFyeURlY2ltYWxTZXBhcmF0b3IoY2hhciB2YWx1ZSkgewogICAgICAgICBwYXR0ZXJuQ2hhcnNbTW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yXSA9IHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFN0cmluZyB3aGljaCByZXByZXNlbnRzIE5hTi4KKyAgICAgKiBTZXRzIHRoZSBzdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBOYU4uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyBOYU4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFOKFN0cmluZyB2YWx1ZSkgewogICAgICAgICBOYU4gPSB2YWx1ZTsKQEAgLTQzMCw3ICs0NzEsOCBAQAogICAgICAqIGEgZm9ybWF0IHBhdHRlcm4uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgcGF0dGVybiBzZXBhcmF0b3IgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgICB0aGUgcGF0dGVybiBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5TZXBhcmF0b3IoY2hhciB2YWx1ZSkgewogICAgICAgICBwYXR0ZXJuQ2hhcnNbUGF0dGVyblNlcGFyYXRvcl0gPSB2YWx1ZTsKQEAgLTQ0MCwxNyArNDgyLDE5IEBACiAgICAgICogU2V0cyB0aGUgcGVyY2VudCBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgcGVyY2VudCBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50IGNoYXJhY3Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQZXJjZW50KGNoYXIgdmFsdWUpIHsKICAgICAgICAgcGF0dGVybkNoYXJzW1BlcmNlbnRdID0gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWlsbGUgcGVyY2VudCBzaWduIGNoYXJhY3Rlci4KKyAgICAgKiBTZXRzIHRoZSBwZXIgbWlsbCBzaWduIGNoYXJhY3Rlci4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaWxsZSBwZXJjZW50IGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgdGhlIHBlciBtaWxsIGNoYXJhY3Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQZXJNaWxsKGNoYXIgdmFsdWUpIHsKICAgICAgICAgcGF0dGVybkNoYXJzW1Blck1pbGxdID0gdmFsdWU7CkBAIC00NjAsMTIgKzUwNCwxNiBAQAogICAgICAqIFNldHMgdGhlIGNoYXJhY3RlciB3aGljaCByZXByZXNlbnRzIHplcm8uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgemVybyBkaWdpdCBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB6ZXJvIGRpZ2l0IGNoYXJhY3Rlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRaZXJvRGlnaXQoY2hhciB2YWx1ZSkgewogICAgICAgICBwYXR0ZXJuQ2hhcnNbWmVyb0RpZ2l0XSA9IHZhbHVlOwogICAgIH0KIAorICAgIC8qCisgICAgICogU2V0cyB0aGUgZXhwb25lbnQgY2hhcmFjdGVyLgorICAgICAqLwogICAgIHZvaWQgc2V0RXhwb25lbnRpYWwoY2hhciB2YWx1ZSkgewogICAgICAgICBwYXR0ZXJuQ2hhcnNbRXhwb25lbnRdID0gdmFsdWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9GaWVsZFBvc2l0aW9uLmphdmEgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0ZpZWxkUG9zaXRpb24uamF2YQppbmRleCAyMzE5YjhlLi40Y2Y5ODVkIDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0ZpZWxkUG9zaXRpb24uamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0ZpZWxkUG9zaXRpb24uamF2YQpAQCAtMTgsNyArMTgsMjAgQEAKIHBhY2thZ2UgamF2YS50ZXh0OwogCiAvKioKLSAqIEZpZWxkUG9zaXRpb24gaXMgdXNlZCB0byBpZGVudGlmeSBmaWVsZHMgaW4gZm9ybWF0dGVkIFN0cmluZ3MuCisgKiBJZGVudGlmaWVzIGZpZWxkcyBpbiBmb3JtYXR0ZWQgc3RyaW5ncy4gSWYgYSB7QGNvZGUgRmllbGRQb3NpdGlvbn0gaXMgcGFzc2VkCisgKiB0byB0aGUgZm9ybWF0IG1ldGhvZCB3aXRoIHN1Y2ggYSBwYXJhbWV0ZXIsIHRoZW4gdGhlIGluZGljZXMgd2lsbCBiZSBzZXQgdG8KKyAqIHRoZSBzdGFydCBhbmQgZW5kIGluZGljZXMgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgorICogPHA+CisgKiBBIHtAY29kZSBGaWVsZFBvc2l0aW9ufSBjYW4gYmUgY3JlYXRlZCBieSB1c2luZyB0aGUgaW50ZWdlciBjb25zdGFudHMgaW4gdGhlCisgKiB2YXJpb3VzIGZvcm1hdCBjbGFzc2VzIChmb3IgZXhhbXBsZSB7QGNvZGUgTnVtYmVyRm9ybWF0LklOVEVHRVJfRklFTER9KSBvcgorICogb25lIG9mIHRoZSBmaWVsZHMgb2YgdHlwZSB7QGNvZGUgRm9ybWF0LkZpZWxkfS4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgbW9yZSB0aGFuIG9uZSBmaWVsZCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQsIHRoZSBtZXRob2QKKyAqIHtAbGluayBOdW1iZXJGb3JtYXQjZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcihPYmplY3QpfSBzaG91bGQgYmUgdXNlZC4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWVsZFBvc2l0aW9uIHsKIApAQCAtMjcsMjAgKzQwLDIzIEBACiAgICAgcHJpdmF0ZSBGb3JtYXQuRmllbGQgbXlBdHRyaWJ1dGU7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpZWxkUG9zaXRpb24gb24gdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBGaWVsZFBvc2l0aW9ufSBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byBpZGVudGlmeQorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHRvIGlkZW50aWZ5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGaWVsZFBvc2l0aW9uKGludCBmaWVsZCkgewogICAgICAgICBteUZpZWxkID0gZmllbGQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWVsZFBvc2l0aW9uIG9uIHRoZSBzcGVjaWZpZWQgRmllbGQgYXR0cmlidXRlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZpZWxkUG9zaXRpb259IGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZSBGaWVsZH0KKyAgICAgKiBhdHRyaWJ1dGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGF0dHJpYnV0ZQotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIGF0dHJpYnV0ZSB0byBpZGVudGlmeQorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIGF0dHJpYnV0ZSB0byBpZGVudGlmeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmllbGRQb3NpdGlvbihGb3JtYXQuRmllbGQgYXR0cmlidXRlKSB7CiAgICAgICAgIG15QXR0cmlidXRlID0gYXR0cmlidXRlOwpAQCAtNDgsMTMgKzY0LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBGaWVsZFBvc2l0aW9uIG9uIHRoZSBzcGVjaWZpZWQgRmllbGQgYXR0cmlidXRlIGFuZCBmaWVsZAotICAgICAqIGlkLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZpZWxkUG9zaXRpb259IGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZSBGaWVsZH0KKyAgICAgKiBhdHRyaWJ1dGUgYW5kIGZpZWxkIGlkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBhdHRyaWJ1dGUgdG8gaWRlbnRpZnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBhdHRyaWJ1dGUgdG8gaWRlbnRpZnkuCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQgdG8gaWRlbnRpZnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB0byBpZGVudGlmeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmllbGRQb3NpdGlvbihGb3JtYXQuRmllbGQgYXR0cmlidXRlLCBpbnQgZmllbGQpIHsKICAgICAgICAgbXlBdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CkBAIC02NiwxNiArODMsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIEZpZWxkUG9zaXRpb24gYW5kIGFuc3dlciBpZiB0aGV5Ci0gICAgICogYXJlIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRmllbGRQb3NpdGlvbiB3aXRoIHRoZSBzYW1lCi0gICAgICogZmllbGQsIGJlZ2luIGluZGV4IGFuZCBlbmQgaW5kZXguCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBmaWVsZCBwb3NpdGlvbiBhbmQgaW5kaWNhdGVzIGlmCisgICAgICogdGhleSBhcmUgZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb2JqZWN0fSBtdXN0IGJlIGFuIGluc3RhbmNlCisgICAgICogb2Yge0Bjb2RlIEZpZWxkUG9zaXRpb259IHdpdGggdGhlIHNhbWUgZmllbGQsIGJlZ2luIGluZGV4IGFuZCBlbmQgaW5kZXguCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBmaWVsZFBvc2l0aW9uLAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIGZpZWxkCisgICAgICogICAgICAgICBwb3NpdGlvbjsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtOTAsNyArMTA3LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWVsZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgZmllbGQKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgZmllbGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRCZWdpbkluZGV4KCkgewogICAgICAgICByZXR1cm4gYmVnaW5JbmRleDsKQEAgLTk5LDcgKzExNyw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmllbGQuCiAgICAgICogCi0gICAgICogQHJldHVybiBvbmUgcGFzdCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBmaWVsZAorICAgICAqIEByZXR1cm4gb25lIHBhc3QgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgZmllbGQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKICAgICAgICAgcmV0dXJuIGVuZEluZGV4OwpAQCAtMTA4LDcgKzEyNyw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZmllbGQgd2hpY2ggaXMgYmVpbmcgaWRlbnRpZmllZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZAorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIGNvbnN0YW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RmllbGQoKSB7CiAgICAgICAgIHJldHVybiBteUZpZWxkOwpAQCAtMTE3LDIwICsxMzcsMTMgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgd2hpY2ggaXMgYmVpbmcgaWRlbnRpZmllZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZAorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXQuRmllbGQgZ2V0RmllbGRBdHRyaWJ1dGUoKSB7CiAgICAgICAgIHJldHVybiBteUF0dHJpYnV0ZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBpbnQgYXR0cmlidXRlSGFzaCA9IChteUF0dHJpYnV0ZSA9PSBudWxsKSA/IDAgOiBteUF0dHJpYnV0ZS5oYXNoQ29kZSgpOwpAQCAtMTQxLDcgKzE1NCw4IEBACiAgICAgICogU2V0cyB0aGUgaW5kZXggb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmllbGQuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgZmllbGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBmaWVsZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCZWdpbkluZGV4KGludCBpbmRleCkgewogICAgICAgICBiZWdpbkluZGV4ID0gaW5kZXg7CkBAIC0xNTEsMTYgKzE2NSwxOCBAQAogICAgICAqIFNldHMgdGhlIGluZGV4IG9mIHRoZSBlbmQgb2YgdGhlIGZpZWxkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgb25lIHBhc3QgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgZmllbGQKKyAgICAgKiAgICAgICAgICAgIG9uZSBwYXN0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGZpZWxkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVuZEluZGV4KGludCBpbmRleCkgewogICAgICAgICBlbmRJbmRleCA9IGluZGV4OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEZpZWxkUG9zaXRpb24uCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmllbGQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRmllbGRQb3NpdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZpZWxkIHBvc2l0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Zvcm1hdC5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Gb3JtYXQuamF2YQppbmRleCAxYjkzODk4Li41ZTMxY2Q0IDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Zvcm1hdC5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRm9ybWF0LmphdmEKQEAgLTE0LDYgKzE0LDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTI2LDI2ICszOCw2NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBGb3JtYXQgaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgY2xhc3NlcyB3aGljaCBmb3JtYXQgYW5kIHBhcnNlIG9iamVjdHMKLSAqIGFjY29yZGluZyB0byBMb2NhbGUgc3BlY2lmaWMgcnVsZXMuCisgKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIGZvcm1hdHMuCisgKiA8cD4KKyAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB3aGljaCBzcGVjaWZpZXMgdGhlIHByb3RvY29sIGZvciBjbGFzc2VzIHdoaWNoCisgKiBjb252ZXJ0IG90aGVyIG9iamVjdHMgb3IgdmFsdWVzLCBzdWNoIGFzIG51bWVyaWMgdmFsdWVzIGFuZCBkYXRlcywgYW5kIHRoZWlyCisgKiBzdHJpbmcgcmVwcmVzZW50YXRpb25zLiBJbiBzb21lIGNhc2VzIHRoZXNlIHJlcHJlc2VudGF0aW9ucyBtYXkgYmUgbG9jYWxpemVkCisgKiBvciBjb250YWluIGxvY2FsaXplZCBjaGFyYWN0ZXJzIG9yIHN0cmluZ3MuIEZvciBleGFtcGxlLCBhIG51bWVyaWMgZm9ybWF0dGVyCisgKiBzdWNoIGFzIHtAY29kZSBEZWNpbWFsRm9ybWF0fSBtYXkgY29udmVydCBhIG51bWVyaWMgdmFsdWUgc3VjaCBhcyAxMjM0NSB0bworICogdGhlIHN0cmluZyAiJDEyLDM0NSIuIEl0IG1heSBhbHNvIHBhcnNlIHRoZSBzdHJpbmcgYmFjayBpbnRvIGEgbnVtZXJpYyB2YWx1ZS4KKyAqIEEgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZXIgbGlrZSB7QGNvZGUgU2ltcGxlRGF0ZUZvcm1hdH0gbWF5IHJlcHJlc2VudCBhCisgKiBzcGVjaWZpYyBkYXRlLCBlbmNvZGVkIG51bWVyaWNhbGx5LCBhcyBhIHN0cmluZyBzdWNoIGFzICJXZWRuZXNkYXksIEZlYnJ1YXJ5CisgKiAyNiwgMTk5NyBBRCIuCisgKiA8L3A+CisgKiA8cD4KKyAqIE1hbnkgb2YgdGhlIGNvbmNyZXRlIHN1YmNsYXNzZXMgb2Yge0Bjb2RlIEZvcm1hdH0gZW1wbG95IHRoZSBub3Rpb24gb2YgYQorICogcGF0dGVybi4gQSBwYXR0ZXJuIGlzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBydWxlcyB3aGljaCBnb3Zlcm4gdGhlCisgKiBjb252ZXJzaW9uIGJldHdlZW4gdmFsdWVzIGFuZCBzdHJpbmdzLiBGb3IgZXhhbXBsZSwgYSB7QGNvZGUgRGVjaW1hbEZvcm1hdH0KKyAqIG9iamVjdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXR0ZXJuICIkIywjIzAuMDA7KCQjLCMjMC4wMCkiLCB3aGljaCBpcyBhCisgKiBjb21tb24gVVMgRW5nbGlzaCBmb3JtYXQgZm9yIGN1cnJlbmN5IHZhbHVlcywgeWllbGRpbmcgc3RyaW5ncyBzdWNoIGFzCisgKiAiJDEsMjM0LjQ1IiBmb3IgMTIzNC40NSwgYW5kICIoJDk4Ny42NSkiIGZvciAtOTg3LjY1NDMuIFRoZSBzcGVjaWZpYyBzeW50YXgKKyAqIG9mIGEgcGF0dGVybiBpcyBkZWZpbmVkIGJ5IGVhY2ggc3ViY2xhc3MuIEV2ZW4gdGhvdWdoIG1hbnkgc3ViY2xhc3NlcyB1c2UKKyAqIHBhdHRlcm5zLCB0aGUgbm90aW9uIG9mIGEgcGF0dGVybiBpcyBub3QgaW5oZXJlbnQgdG8ge0Bjb2RlIEZvcm1hdH0gY2xhc3NlcworICogaW4gZ2VuZXJhbCwgYW5kIGlzIG5vdCBwYXJ0IG9mIHRoZSBleHBsaWNpdCBiYXNlIGNsYXNzIHByb3RvY29sLgorICogPC9wPgorICogPHA+CisgKiBUd28gY29tcGxleCBmb3JtYXR0aW5nIGNsYXNzZXMgYXJlIHdvcnRoIG1lbnRpb25pbmc6IHtAY29kZSBNZXNzYWdlRm9ybWF0fQorICogYW5kIHtAY29kZSBDaG9pY2VGb3JtYXR9LiB7QGNvZGUgQ2hvaWNlRm9ybWF0fSBpcyBhIHN1YmNsYXNzIG9mCisgKiB7QGNvZGUgTnVtYmVyRm9ybWF0fSB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gZm9ybWF0IGRpZmZlcmVudCBudW1iZXIgcmFuZ2VzCisgKiBhcyBzdHJpbmdzLiBGb3IgaW5zdGFuY2UsIDAgbWF5IGJlIHJlcHJlc2VudGVkIGFzICJubyBmaWxlcyIsIDEgYXMgIm9uZQorICogZmlsZSIsIGFuZCBhbnkgbnVtYmVyIGdyZWF0ZXIgdGhhbiAxIGFzICJtYW55IGZpbGVzIi4ge0Bjb2RlIE1lc3NhZ2VGb3JtYXR9CisgKiBpcyBhIGZvcm1hdHRlciB3aGljaCB1dGlsaXplcyBvdGhlciB7QGNvZGUgRm9ybWF0fSBvYmplY3RzIHRvIGZvcm1hdCBhIHN0cmluZworICogY29udGFpbmluZyBtdWx0aXBsZSB2YWx1ZXMuIEZvciBpbnN0YW5jZSwgYSB7QGNvZGUgTWVzc2FnZUZvcm1hdH0gb2JqZWN0CisgKiBtaWdodCBwcm9kdWNlIHRoZSBzdHJpbmcgIlRoZXJlIGFyZSBubyBmaWxlcyBvbiB0aGUgZGlzayBNeURpc2sgb24gRmVicnVhcnkKKyAqIDI3LCAxOTk3LiIgZ2l2ZW4gdGhlIGFyZ3VtZW50cyAwLCAiTXlEaXNrIiwgYW5kIHRoZSBkYXRlIHZhbHVlIG9mIDIvMjcvOTcuCisgKiBTZWUgdGhlIHtAbGluayBDaG9pY2VGb3JtYXR9IGFuZCB7QGxpbmsgTWVzc2FnZUZvcm1hdH0gZGVzY3JpcHRpb25zIGZvcgorICogZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtYXQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjk5MjgyNTg1ODE0NjI0MTg5TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgRm9ybWF0LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEZvcm1hdH0gaW5zdGFuY2UuCiAgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZvcm1hdCgpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIEZvcm1hdC4KKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHtAY29kZSBGb3JtYXR9IGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBGb3JtYXQKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgZm9ybWF0LgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CkBAIC0xMDEsMTUgKzE1MSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBvYmplY3QgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgRm9ybWF0LgotICAgICAqIAorICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBvYmplY3QgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZm9ybWF0Ci0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIFN0cmluZwotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmb3JtYXQuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZy4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgZm9ybWF0dGVkIGJ5IHRoaXMgRm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgZm9ybWF0dGVkIGJ5IHRoaXMgZm9ybWF0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZm9ybWF0KE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgcmV0dXJuIGZvcm1hdChvYmplY3QsIG5ldyBTdHJpbmdCdWZmZXIoKSwgbmV3IEZpZWxkUG9zaXRpb24oMCkpCkBAIC0xMTcsNTQgKzE2Niw2MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byB0aGUgc3BlY2lmaWVkIFN0cmluZ0J1ZmZlciB1c2luZyB0aGUKLSAgICAgKiBydWxlcyBvZiB0aGlzIEZvcm1hdC4gSWYgdGhlIGZpZWxkIHNwZWNpZmllZCBieSB0aGUgRmllbGRQb3NpdGlvbiBpcwotICAgICAqIGZvcm1hdHRlZCwgc2V0IHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4IG9mIHRoZSBmb3JtYXR0ZWQgZmllbGQgaW4gdGhlCi0gICAgICogRmllbGRQb3NpdGlvbi4KKyAgICAgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB1c2luZyB0aGUKKyAgICAgKiBydWxlcyBvZiB0aGlzIGZvcm1hdC4KKyAgICAgKiA8cD4KKyAgICAgKiB7QGNvZGUgZmllbGR9IGlzIGFuIGlucHV0L291dHB1dCBwYXJhbWV0ZXIuIElmIGl0cyB7QGNvZGUgZmllbGR9CisgICAgICogbWVtYmVyIGNvbnRhaW5zIGFuIGVudW0gdmFsdWUgc3BlY2lmeWluZyBhIGZpZWxkIG9uIGlucHV0LCB0aGVuIGl0cworICAgICAqIHtAY29kZSBiZWdpbkluZGV4fSBhbmQge0Bjb2RlIGVuZEluZGV4fSBtZW1iZXJzIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZQorICAgICAqIHRleHQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgZmllbGQgaW4gdGhlIGZvcm1hdHRlZCB0ZXh0LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmb3JtYXQuCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBidWZmZXIgd2hlcmUgdGhlIGZvcm1hdHRlZCBzdHJpbmcgaXMgYXBwZW5kZWQgdG8uCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgRmllbGRQb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXIgPGNvZGU+YnVmZmVyPC9jb2RlPgotICAgICAqIAorICAgICAqICAgICAgICAgICAgb24gaW5wdXQ6IGFuIG9wdGlvbmFsIGFsaWdubWVudCBmaWVsZDsgb24gb3V0cHV0OiB0aGUgb2Zmc2V0cworICAgICAqICAgICAgICAgICAgb2YgdGhlIGFsaWdubWVudCBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgZm9ybWF0dGVkIGJ5IHRoaXMgRm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgZm9ybWF0dGVkIGJ5IHRoaXMgZm9ybWF0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdCdWZmZXIgZm9ybWF0KE9iamVjdCBvYmplY3QsIFN0cmluZ0J1ZmZlciBidWZmZXIsCiAgICAgICAgICAgICBGaWVsZFBvc2l0aW9uIGZpZWxkKTsKIAogICAgIC8qKgogICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBvYmplY3QgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgZm9ybWF0IGFuZCByZXR1cm5zCi0gICAgICogYW4gQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHdpdGggdGhlIGZvcm1hdHRlZCBTdHJpbmcgYW5kIG5vCisgICAgICogYW4ge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gd2l0aCB0aGUgZm9ybWF0dGVkIHN0cmluZyBhbmQgbm8KICAgICAgKiBhdHRyaWJ1dGVzLgogICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIHJldHVybiBhbiBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igd2l0aCB0aGUKKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCByZXR1cm4gYW4ge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gd2l0aCB0aGUKICAgICAgKiBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzLgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdAotICAgICAqIEByZXR1cm4gYW4gQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHdpdGggdGhlIGZvcm1hdHRlZCBvYmplY3QgYW5kCi0gICAgICogICAgICAgICBhdHRyaWJ1dGVzCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdC4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9IHdpdGggdGhlIGZvcm1hdHRlZCBvYmplY3QKKyAgICAgKiAgICAgICAgIGFuZCBhdHRyaWJ1dGVzLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBGb3JtYXQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBmb3JtYXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBmb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9yKE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVkU3RyaW5nKGZvcm1hdChvYmplY3QpKS5nZXRJdGVyYXRvcigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHVzaW5nIHRoZSBydWxlcyBvZiB0aGlzIEZvcm1hdC4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UuCiAgICAgICogQGV4Y2VwdGlvbiBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJzaW5nCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJzaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgcGFyc2VPYmplY3QoU3RyaW5nIHN0cmluZykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyc2VQb3NpdGlvbiBwb3NpdGlvbiA9IG5ldyBQYXJzZVBvc2l0aW9uKDApOwpAQCAtMTc2LDE3ICsyMzEsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgc3BlY2lmaWVkIFN0cmluZyBzdGFydGluZyBhdCB0aGUgaW5kZXggc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIFBhcnNlUG9zaXRpb24uIElmIHRoZSBzdHJpbmcgaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlIGluZGV4IG9mIHRoZQotICAgICAqIFBhcnNlUG9zaXRpb24gaXMgdXBkYXRlZCB0byB0aGUgaW5kZXggZm9sbG93aW5nIHRoZSBwYXJzZWQgdGV4dC4KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRpbmcgYXQgdGhlIGluZGV4IHNwZWNpZmllZCBieQorICAgICAqIHtAY29kZSBwb3NpdGlvbn0uIElmIHRoZSBzdHJpbmcgaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCB0aGVuIHRoZSBpbmRleCBvZgorICAgICAqIHRoZSB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gaXMgdXBkYXRlZCB0byB0aGUgaW5kZXggZm9sbG93aW5nIHRoZSBwYXJzZWQKKyAgICAgKiB0ZXh0LiBPbiBlcnJvciwgdGhlIGluZGV4IGlzIHVuY2hhbmdlZCBhbmQgdGhlIGVycm9yIGluZGV4IG9mCisgICAgICoge0Bjb2RlIFBhcnNlUG9zaXRpb259IGlzIHNldCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCiAgICAgICogQHBhcmFtIHBvc2l0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgUGFyc2VQb3NpdGlvbiwgdXBkYXRlZCBvbiByZXR1cm4gd2l0aCB0aGUgaW5kZXggZm9sbG93aW5nCi0gICAgICogICAgICAgICAgICB0aGUgcGFyc2VkIHRleHQsIG9yIG9uIGVycm9yIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgZXJyb3IgaW5kZXggaXMgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNlLCBvciBudWxsIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICogICAgICAgICAgICBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyLCBzcGVjaWZpZXMgdGhlIHN0YXJ0IGluZGV4IGluCisgICAgICogICAgICAgICAgICB7QGNvZGUgc3RyaW5nfSBmcm9tIHdoZXJlIHRvIHN0YXJ0IHBhcnNpbmcuIElmIHBhcnNpbmcgaXMKKyAgICAgKiAgICAgICAgICAgIHN1Y2Nlc3NmdWwsIGl0IGlzIHVwZGF0ZWQgd2l0aCB0aGUgaW5kZXggZm9sbG93aW5nIHRoZSBwYXJzZWQKKyAgICAgKiAgICAgICAgICAgIHRleHQ7IG9uIGVycm9yLCB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUgZXJyb3IgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIHNldCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2Ugb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzCisgICAgICogICAgICAgICBhbiBlcnJvci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHBhcnNlT2JqZWN0KFN0cmluZyBzdHJpbmcsIFBhcnNlUG9zaXRpb24gcG9zaXRpb24pOwogCkBAIC0yNDIsMTggKzMwMywyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgRm9ybWF0IGF0dHJpYnV0ZXMgaW4gdGhlCi0gICAgICogQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRoYXQgZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcigpIG1ldGhvZAotICAgICAqIHJldHVybnMgaW4gdGhlIEZvcm1hdCBzdWJjbGFzc2VzLgorICAgICAqIElubmVyIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50IHtAY29kZSBGb3JtYXR9IGF0dHJpYnV0ZXMgaW4gdGhlCisgICAgICoge0Bjb2RlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcn0gdGhhdCB0aGUKKyAgICAgKiB7QGNvZGUgZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcigpfSBtZXRob2QgcmV0dXJucyBpbiB7QGNvZGUgRm9ybWF0fQorICAgICAqIHN1YmNsYXNzZXMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZCBleHRlbmRzIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUgewogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3Njk2NjY5MjIxNzM2MDI4M0w7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgRmllbGQgd2l0aCB0aGUgZ2l2ZW4gZmllbGROYW1lLgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBGaWVsZH0gd2l0aCB0aGUgZ2l2ZW4gZmllbGQgbmFtZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIGZpZWxkIG5hbWUuCisgICAgICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZmllbGQgbmFtZS4KKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgRmllbGQoU3RyaW5nIGZpZWxkTmFtZSkgewogICAgICAgICAgICAgc3VwZXIoZmllbGROYW1lKTsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvTWVzc2FnZUZvcm1hdC5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0LmphdmEKaW5kZXggNDBmZDkwYy4uNjQwNWI2YyAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0LmphdmEKKysrIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0LmphdmEKQEAgLTE0LDYgKzE0LDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTMxLDkgKzQzLDMxNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBNZXNzYWdlRm9ybWF0IGlzIHVzZWQgdG8gZm9ybWF0IGFuZCBwYXJzZSBhcmd1bWVudHMgYmFzZWQgb24gYSBwYXR0ZXJuLiBUaGUKLSAqIHBhdHRlcm4gc3BlY2lmaWVzIGhvdyBlYWNoIGFyZ3VtZW50IHdpbGwgYmUgZm9ybWF0dGVkIGFuZCBjb25jYXRlbmF0ZWQgd2l0aAotICogb3RoZXIgdGV4dCB0byBwcm9kdWNlIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LgorICogUHJvZHVjZXMgY29uY2F0ZW5hdGVkCisgKiBtZXNzYWdlcyBpbiBsYW5ndWFnZS1uZXV0cmFsIHdheS4gVXNlIHRoaXMgY2xhc3MgdG8gY29uc3RydWN0IG1lc3NhZ2VzIAorICogZGlzcGxheWVkIGZvciBlbmQgdXNlcnMuCisgKiA8cD4KKyAqIHtAY29kZSBNZXNzYWdlRm9ybWF0fSB0YWtlcyBhIHNldCBvZiBvYmplY3RzLCBmb3JtYXRzIHRoZW0gYW5kIHRoZW4KKyAqIGluc2VydHMgdGhlIGZvcm1hdHRlZCBzdHJpbmdzIGludG8gdGhlIHBhdHRlcm4gYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlcy4KKyAqIDwvcD4KKyAqIDxwPgorICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB7QGNvZGUgTWVzc2FnZUZvcm1hdH0gZGlmZmVycyBmcm9tIHRoZSBvdGhlcgorICoge0Bjb2RlIEZvcm1hdH0gY2xhc3NlcyBpbiB0aGF0IHlvdSBjcmVhdGUgYSB7QGNvZGUgTWVzc2FnZUZvcm1hdH0KKyAqIG9iamVjdCB3aXRoIG9uZSBvZiBpdHMgY29uc3RydWN0b3JzIChub3Qgd2l0aCBhIHtAY29kZSBnZXRJbnN0YW5jZX0KKyAqIHN0eWxlIGZhY3RvcnkgbWV0aG9kKS4gVGhlIGZhY3RvcnkgbWV0aG9kcyBhcmVuJ3QgbmVjZXNzYXJ5IGJlY2F1c2UKKyAqIHtAY29kZSBNZXNzYWdlRm9ybWF0fSBpdHNlbGYgZG9lc24ndCBpbXBsZW1lbnQgbG9jYWxlIHNwZWNpZmljCisgKiBiZWhhdmlvci4gQW55IGxvY2FsZSBzcGVjaWZpYyBiZWhhdmlvciBpcyBkZWZpbmVkIGJ5IHRoZSBwYXR0ZXJuIHRoYXQgeW91CisgKiBwcm92aWRlIGFzIHdlbGwgYXMgdGhlIHN1YmZvcm1hdHMgdXNlZCBmb3IgaW5zZXJ0ZWQgYXJndW1lbnRzLgorICogCisgKiA8aDQ+PGEgbmFtZT0icGF0dGVybnMiPlBhdHRlcm5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbjwvYT48L2g0PgorICogCisgKiB7QGNvZGUgTWVzc2FnZUZvcm1hdH0gdXNlcyBwYXR0ZXJucyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIDxpPk1lc3NhZ2VGb3JtYXRQYXR0ZXJuOjwvaT4KKyAqICAgICAgICAgPGk+U3RyaW5nPC9pPgorICogICAgICAgICA8aT5NZXNzYWdlRm9ybWF0UGF0dGVybjwvaT4gPGk+Rm9ybWF0RWxlbWVudDwvaT4gPGk+U3RyaW5nPC9pPgorICogPGk+Rm9ybWF0RWxlbWVudDo8L2k+CisgKiAgICAgICAgIHsgPGk+QXJndW1lbnRJbmRleDwvaT4gfQorICogICAgICAgICB7IDxpPkFyZ3VtZW50SW5kZXg8L2k+ICwgPGk+Rm9ybWF0VHlwZTwvaT4gfQorICogICAgICAgICB7IDxpPkFyZ3VtZW50SW5kZXg8L2k+ICwgPGk+Rm9ybWF0VHlwZTwvaT4gLCA8aT5Gb3JtYXRTdHlsZTwvaT4gfQorICogPGk+Rm9ybWF0VHlwZTogb25lIG9mIDwvaT4KKyAqICAgICAgICAgbnVtYmVyIGRhdGUgdGltZSBjaG9pY2UKKyAqIDxpPkZvcm1hdFN0eWxlOjwvaT4KKyAqICAgICAgICAgc2hvcnQKKyAqICAgICAgICAgbWVkaXVtCisgKiAgICAgICAgIGxvbmcKKyAqICAgICAgICAgZnVsbAorICogICAgICAgICBpbnRlZ2VyCisgKiAgICAgICAgIGN1cnJlbmN5CisgKiAgICAgICAgIHBlcmNlbnQKKyAqICAgICAgICAgPGk+U3ViZm9ybWF0UGF0dGVybjwvaT4KKyAqIDxpPlN0cmluZzo8L2k+CisgKiAgICAgICAgIDxpPlN0cmluZ1BhcnQmbHQ7c3ViJmd0O29wdCZsdDsvc3ViJmd0OzwvaT4KKyAqICAgICAgICAgPGk+U3RyaW5nPC9pPiA8aT5TdHJpbmdQYXJ0PC9pPgorICogPGk+U3RyaW5nUGFydDo8L2k+CisgKiAgICAgICAgICcnCisgKiAgICAgICAgICcgPGk+UXVvdGVkU3RyaW5nPC9pPiAnCisgKiAgICAgICAgIDxpPlVucXVvdGVkU3RyaW5nPC9pPgorICogPGk+U3ViZm9ybWF0UGF0dGVybjo8L2k+CisgKiAgICAgICAgIDxpPlN1YmZvcm1hdFBhdHRlcm5QYXJ0Jmx0O3N1YiZndDtvcHQmbHQ7L3N1YiZndDs8L2k+CisgKiAgICAgICAgIDxpPlN1YmZvcm1hdFBhdHRlcm48L2k+IDxpPlN1YmZvcm1hdFBhdHRlcm5QYXJ0PC9pPgorICogPGk+U3ViRm9ybWF0UGF0dGVyblBhcnQ6PC9pPgorICogICAgICAgICAnIDxpPlF1b3RlZFBhdHRlcm48L2k+ICcKKyAqICAgICAgICAgPGk+VW5xdW90ZWRQYXR0ZXJuPC9pPgorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIAorICogPHA+CisgKiBXaXRoaW4gYSA8aT5TdHJpbmc8L2k+LCB7QGNvZGUgIicnIn0gcmVwcmVzZW50cyBhIHNpbmdsZSBxdW90ZS4gQQorICogPGk+UXVvdGVkU3RyaW5nPC9pPiBjYW4gY29udGFpbiBhcmJpdHJhcnkgY2hhcmFjdGVycyBleGNlcHQgc2luZ2xlIHF1b3RlczsKKyAqIHRoZSBzdXJyb3VuZGluZyBzaW5nbGUgcXVvdGVzIGFyZSByZW1vdmVkLiBBbiA8aT5VbnF1b3RlZFN0cmluZzwvaT4gY2FuCisgKiBjb250YWluIGFyYml0cmFyeSBjaGFyYWN0ZXJzIGV4Y2VwdCBzaW5nbGUgcXVvdGVzIGFuZCBsZWZ0IGN1cmx5IGJyYWNrZXRzLgorICogVGh1cywgYSBzdHJpbmcgdGhhdCBzaG91bGQgcmVzdWx0IGluIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSAiJ3swfSciIGNhbiBiZQorICogd3JpdHRlbiBhcyB7QGNvZGUgIicnJ3snMH0nJyJ9IG9yIHtAY29kZSAiJycnezB9JycnIn0uCisgKiA8cD4KKyAqIFdpdGhpbiBhIDxpPlN1YmZvcm1hdFBhdHRlcm48L2k+LCBkaWZmZXJlbnQgcnVsZXMgYXBwbHkuIEEgPGk+UXVvdGVkUGF0dGVybjwvaT4KKyAqIGNhbiBjb250YWluIGFyYml0cmFyeSBjaGFyYWN0ZXJzIGV4Y2VwdCBzaW5nbGUgcXVvdGVzLCBidXQgdGhlIHN1cnJvdW5kaW5nCisgKiBzaW5nbGUgcXVvdGVzIGFyZSA8c3Ryb25nPm5vdDwvc3Ryb25nPiByZW1vdmVkLCBzbyB0aGV5IG1heSBiZSBpbnRlcnByZXRlZAorICogYnkgdGhlIHN1YmZvcm1hdC4gRm9yIGV4YW1wbGUsIHtAY29kZSAiezEsbnVtYmVyLCQnIycsIyN9In0gd2lsbAorICogcHJvZHVjZSBhIG51bWJlciBmb3JtYXQgd2l0aCB0aGUgaGFzaC1zaWduIHF1b3RlZCwgd2l0aCBhIHJlc3VsdCBzdWNoIGFzOgorICogIiQjMzEsNDUiLiBBbiA8aT5VbnF1b3RlZFBhdHRlcm48L2k+IGNhbiBjb250YWluIGFyYml0cmFyeSBjaGFyYWN0ZXJzIGV4Y2VwdAorICogc2luZ2xlIHF1b3RlcywgYnV0IGN1cmx5IGJyYWNlcyB3aXRoaW4gaXQgbXVzdCBiZSBiYWxhbmNlZC4gRm9yIGV4YW1wbGUsCisgKiB7QGNvZGUgImFiIHswfSBkZSJ9IGFuZCB7QGNvZGUgImFiICd9JyBkZSJ9IGFyZSB2YWxpZCBzdWJmb3JtYXQKKyAqIHBhdHRlcm5zLCBidXQge0Bjb2RlICJhYiB7MCd9JyBkZSJ9IGFuZCB7QGNvZGUgImFiIH0gZGUifSBhcmUKKyAqIG5vdC4KKyAqIDwvcD4KKyAqIDxkbD4KKyAqIDxkdD48Yj5XYXJuaW5nOjwvYj48L2R0PgorICogPGRkPlRoZSBydWxlcyBmb3IgdXNpbmcgcXVvdGVzIHdpdGhpbiBtZXNzYWdlIGZvcm1hdCBwYXR0ZXJucyB1bmZvcnR1bmF0ZWx5CisgKiBoYXZlIHNob3duIHRvIGJlIHNvbWV3aGF0IGNvbmZ1c2luZy4gSW4gcGFydGljdWxhciwgaXQgaXNuJ3QgYWx3YXlzIG9idmlvdXMKKyAqIHRvIGxvY2FsaXplcnMgd2hldGhlciBzaW5nbGUgcXVvdGVzIG5lZWQgdG8gYmUgZG91YmxlZCBvciBub3QuIE1ha2Ugc3VyZSB0bworICogaW5mb3JtIGxvY2FsaXplcnMgYWJvdXQgdGhlIHJ1bGVzLCBhbmQgdGVsbCB0aGVtIChmb3IgZXhhbXBsZSwgYnkgdXNpbmcKKyAqIGNvbW1lbnRzIGluIHJlc291cmNlIGJ1bmRsZSBzb3VyY2UgZmlsZXMpIHdoaWNoIHN0cmluZ3Mgd2lsbCBiZSBwcm9jZXNzZWQgYnkKKyAqIHtAY29kZSBNZXNzYWdlRm9ybWF0fS4gTm90ZSB0aGF0IGxvY2FsaXplcnMgbWF5IG5lZWQgdG8gdXNlIHNpbmdsZSBxdW90ZXMgaW4KKyAqIHRyYW5zbGF0ZWQgc3RyaW5ncyB3aGVyZSB0aGUgb3JpZ2luYWwgdmVyc2lvbiBkb2Vzbid0IGhhdmUgdGhlbS4gPGJyPgorICogTm90ZSBhbHNvIHRoYXQgdGhlIHNpbXBsZXN0IHdheSB0byBhdm9pZCB0aGUgcHJvYmxlbSBpcyB0byB1c2UgdGhlIHJlYWwKKyAqIGFwb3N0cm9waGUgKHNpbmdsZSBxdW90ZSkgY2hhcmFjdGVyIFx1MjAxOSAoJykgZm9yIGh1bWFuLXJlYWRhYmxlIHRleHQsIGFuZAorICogdG8gdXNlIHRoZSBBU0NJSSBhcG9zdHJvcGhlIChcdTAwMjcgJyApIG9ubHkgaW4gcHJvZ3JhbSBzeW50YXgsIGxpa2UgcXVvdGluZworICogaW4ge0Bjb2RlIE1lc3NhZ2VGb3JtYXR9LiBTZWUgdGhlIGFubm90YXRpb25zIGZvciBVKzAwMjcgQXBvc3Ryb3BoZSBpbiBUaGUgVW5pY29kZQorICogU3RhbmRhcmQuCisgKiA8L2RsPgorICogPHA+CisgKiBUaGUgPGk+QXJndW1lbnRJbmRleDwvaT4gdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciB3cml0dGVuIHVzaW5nIHRoZQorICogZGlnaXRzICcwJyB0aHJvdWdoICc5JywgYW5kIHJlcHJlc2VudHMgYW4gaW5kZXggaW50byB0aGUKKyAqIHtAY29kZSBhcmd1bWVudHN9IGFycmF5IHBhc3NlZCB0byB0aGUge0Bjb2RlIGZvcm1hdH0gbWV0aG9kcyBvcgorICogdGhlIHJlc3VsdCBhcnJheSByZXR1cm5lZCBieSB0aGUge0Bjb2RlIHBhcnNlfSBtZXRob2RzLgorICogPHA+CisgKiBUaGUgPGk+Rm9ybWF0VHlwZTwvaT4gYW5kIDxpPkZvcm1hdFN0eWxlPC9pPiB2YWx1ZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGEKKyAqIHtAY29kZSBGb3JtYXR9IGluc3RhbmNlIGZvciB0aGUgZm9ybWF0IGVsZW1lbnQuIFRoZSBmb2xsb3dpbmcgdGFibGUKKyAqIHNob3dzIGhvdyB0aGUgdmFsdWVzIG1hcCB0byB7QGNvZGUgRm9ybWF0fSBpbnN0YW5jZXMuIENvbWJpbmF0aW9ucyBub3Qgc2hvd24gaW4gdGhlCisgKiB0YWJsZSBhcmUgaWxsZWdhbC4gQSA8aT5TdWJmb3JtYXRQYXR0ZXJuPC9pPiBtdXN0IGJlIGEgdmFsaWQgcGF0dGVybiBzdHJpbmcKKyAqIGZvciB0aGUge0Bjb2RlIEZvcm1hdH0gc3ViY2xhc3MgdXNlZC4KKyAqIDxwPgorICogPHRhYmxlIGJvcmRlcj0xPgorICogPHRyPgorICogPHRoPkZvcm1hdCBUeXBlPC90aD4KKyAqIDx0aD5Gb3JtYXQgU3R5bGU8L3RoPgorICogPHRoPlN1YmZvcm1hdCBDcmVhdGVkPC90aD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQgY29sc3Bhbj0iMiI+PGk+KG5vbmUpPC9pPjwvdGQ+CisgKiA8dGQ+e0Bjb2RlIG51bGx9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQgcm93c3Bhbj0iNSI+e0Bjb2RlIG51bWJlcn08L3RkPgorICogPHRkPjxpPihub25lKTwvaT48L3RkPgorICogPHRkPntAY29kZSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoZ2V0TG9jYWxlKCkpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSBpbnRlZ2VyfTwvdGQ+CisgKiA8dGQ+e0Bjb2RlIE51bWJlckZvcm1hdC5nZXRJbnRlZ2VySW5zdGFuY2UoZ2V0TG9jYWxlKCkpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSBjdXJyZW5jeX08L3RkPgorICogPHRkPntAY29kZSBOdW1iZXJGb3JtYXQuZ2V0Q3VycmVuY3lJbnN0YW5jZShnZXRMb2NhbGUoKSl9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQ+e0Bjb2RlIHBlcmNlbnR9PC90ZD4KKyAqIDx0ZD57QGNvZGUgTnVtYmVyRm9ybWF0LmdldFBlcmNlbnRJbnN0YW5jZShnZXRMb2NhbGUoKSl9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQ+PGk+U3ViZm9ybWF0UGF0dGVybjwvaT48L3RkPgorICogPHRkPntAY29kZSBuZXcgRGVjaW1hbEZvcm1hdChzdWJmb3JtYXRQYXR0ZXJuLCBuZXcgRGVjaW1hbEZvcm1hdFN5bWJvbHMoZ2V0TG9jYWxlKCkpKX08L3RkPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZCByb3dzcGFuPSI2Ij57QGNvZGUgZGF0ZX08L3RkPgorICogPHRkPjxpPihub25lKTwvaT48L3RkPgorICogPHRkPntAY29kZSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkRFRkFVTFQsIGdldExvY2FsZSgpKX08L3RkPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZD57QGNvZGUgc2hvcnR9PC90ZD4KKyAqIDx0ZD57QGNvZGUgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCwgZ2V0TG9jYWxlKCkpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSBtZWRpdW19PC90ZD4KKyAqIDx0ZD57QGNvZGUgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5ERUZBVUxULCBnZXRMb2NhbGUoKSl9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQ+e0Bjb2RlIGxvbmd9PC90ZD4KKyAqIDx0ZD57QGNvZGUgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5MT05HLCBnZXRMb2NhbGUoKSl9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQ+e0Bjb2RlIGZ1bGx9PC90ZD4KKyAqIDx0ZD57QGNvZGUgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMLCBnZXRMb2NhbGUoKSl9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQ+PGk+U3ViZm9ybWF0UGF0dGVybjwvaT48L3RkPgorICogPHRkPntAY29kZSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChzdWJmb3JtYXRQYXR0ZXJuLCBnZXRMb2NhbGUoKSl9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQgcm93c3Bhbj0iNiI+e0Bjb2RlIHRpbWV9PC90ZD4KKyAqIDx0ZD48aT4obm9uZSk8L2k+PC90ZD4KKyAqIDx0ZD57QGNvZGUgRGF0ZUZvcm1hdC5nZXRUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5ERUZBVUxULCBnZXRMb2NhbGUoKSl9PC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiA8dGQ+e0Bjb2RlIHNob3J0fTwvdGQ+CisgKiA8dGQ+e0Bjb2RlIERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQsIGdldExvY2FsZSgpKX08L3RkPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZD57QGNvZGUgbWVkaXVtfTwvdGQ+CisgKiA8dGQ+e0Bjb2RlIERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuREVGQVVMVCwgZ2V0TG9jYWxlKCkpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSBsb25nfTwvdGQ+CisgKiA8dGQ+e0Bjb2RlIERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuTE9ORywgZ2V0TG9jYWxlKCkpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSBmdWxsfTwvdGQ+CisgKiA8dGQ+e0Bjb2RlIERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCwgZ2V0TG9jYWxlKCkpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPjxpPlN1YmZvcm1hdFBhdHRlcm48L2k+PC90ZD4KKyAqIDx0ZD57QGNvZGUgbmV3IFNpbXBsZURhdGVGb3JtYXQoc3ViZm9ybWF0UGF0dGVybiwgZ2V0TG9jYWxlKCkpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSBjaG9pY2V9PC90ZD4KKyAqIDx0ZD48aT5TdWJmb3JtYXRQYXR0ZXJuPC9pPjwvdGQ+CisgKiA8dGQ+e0Bjb2RlIG5ldyBDaG9pY2VGb3JtYXQoc3ViZm9ybWF0UGF0dGVybil9PC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPgorICogCisgKiA8aDQ+VXNhZ2UgSW5mb3JtYXRpb248L2g0PgorICogPHA+CisgKiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHVzYWdlOiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIE9iamVjdFtdIGFyZ3VtZW50cyA9IHsKKyAqICAgICAgICAgbmV3IEludGVnZXIoNyksIG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSwKKyAqICAgICAgICAgImEgZGlzdHVyYmFuY2UgaW4gdGhlIEZvcmNlIn07CisgKiBTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisgKiAgICAgICAgICJBdCB7MSx0aW1lfSBvbiB7MSxkYXRlfSwgdGhlcmUgd2FzIHsyfSBvbiBwbGFuZXQgezAsbnVtYmVyLGludGVnZXJ9LiIsCisgKiAgICAgICAgIGFyZ3VtZW50cyk7CisgKiA8ZW0+CisgKiBPdXRwdXQ6CisgKiA8L2VtPgorICogQXQgMTI6MzAgUE0gb24gSnVsIDMsIDIwNTMsIHRoZXJlIHdhcyBhIGRpc3R1cmJhbmNlIGluIHRoZSBGb3JjZSBvbiBwbGFuZXQgNy4KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+IAorICogPHA+CisgKiBUeXBpY2FsbHksIHRoZSBtZXNzYWdlIGZvcm1hdCB3aWxsIGNvbWUgZnJvbSByZXNvdXJjZXMsIGFuZCB0aGUKKyAqIGFyZ3VtZW50cyB3aWxsIGJlIGR5bmFtaWNhbGx5IHNldCBhdCBydW50aW1lLgorICogPC9wPgorICogPHA+CisgKiBFeGFtcGxlIDI6IDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogT2JqZWN0W10gdGVzdEFyZ3MgPSB7bmV3IExvbmcoMyksICJNeURpc2sifTsKKyAqIE1lc3NhZ2VGb3JtYXQgZm9ybSA9IG5ldyBNZXNzYWdlRm9ybWF0KCJUaGUgZGlzayBcInsxfVwiIGNvbnRhaW5zIHswfSBmaWxlKHMpLiIpOworICogU3lzdGVtLm91dC5wcmludGxuKGZvcm0uZm9ybWF0KHRlc3RBcmdzKSk7CisgKiA8ZW0+CisgKiBPdXRwdXQgd2l0aCBkaWZmZXJlbnQgdGVzdEFyZ3M6CisgKiA8L2VtPgorICogVGhlIGRpc2sgIk15RGlzayIgY29udGFpbnMgMCBmaWxlKHMpLgorICogVGhlIGRpc2sgIk15RGlzayIgY29udGFpbnMgMSBmaWxlKHMpLgorICogVGhlIGRpc2sgIk15RGlzayIgY29udGFpbnMgMSwyNzMgZmlsZShzKS4KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiAKKyAqIDxwPgorICogRm9yIG1vcmUgc29waGlzdGljYXRlZCBwYXR0ZXJucywgeW91IGNhbiB1c2UgYSB7QGNvZGUgQ2hvaWNlRm9ybWF0fSB0bworICogZ2V0IG91dHB1dCBzdWNoIGFzOiAKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogTWVzc2FnZUZvcm1hdCBmb3JtID0gbmV3IE1lc3NhZ2VGb3JtYXQoIlRoZSBkaXNrIFwiezF9XCIgY29udGFpbnMgezB9LiIpOworICogZG91YmxlW10gZmlsZWxpbWl0cyA9IHswLDEsMn07CisgKiBTdHJpbmdbXSBmaWxlcGFydCA9IHsibm8gZmlsZXMiLCJvbmUgZmlsZSIsInswLG51bWJlcn0gZmlsZXMifTsKKyAqIENob2ljZUZvcm1hdCBmaWxlZm9ybSA9IG5ldyBDaG9pY2VGb3JtYXQoZmlsZWxpbWl0cywgZmlsZXBhcnQpOworICogZm9ybS5zZXRGb3JtYXRCeUFyZ3VtZW50SW5kZXgoMCwgZmlsZWZvcm0pOworICogT2JqZWN0W10gdGVzdEFyZ3MgPSB7bmV3IExvbmcoMTIzNzMpLCAiTXlEaXNrIn07CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oZm9ybS5mb3JtYXQodGVzdEFyZ3MpKTsKKyAqIDxlbT4KKyAqIE91dHB1dCAod2l0aCBkaWZmZXJlbnQgdGVzdEFyZ3MpOgorICogPC9lbT4KKyAqIFRoZSBkaXNrICJNeURpc2siIGNvbnRhaW5zIG5vIGZpbGVzLgorICogVGhlIGRpc2sgIk15RGlzayIgY29udGFpbnMgb25lIGZpbGUuCisgKiBUaGUgZGlzayAiTXlEaXNrIiBjb250YWlucyAxLDI3MyBmaWxlcy4KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+IFlvdSBjYW4gZWl0aGVyIGRvIHRoaXMgcHJvZ3JhbW1hdGljYWxseSwgYXMgaW4gdGhlIGFib3ZlCisgKiBleGFtcGxlLCBvciBieSB1c2luZyBhIHBhdHRlcm4gKHNlZSB7QGxpbmsgQ2hvaWNlRm9ybWF0fSBmb3IgbW9yZQorICogaW5mb3JtYXRpb24pIGFzIGluOiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIGZvcm0uYXBwbHlQYXR0ZXJuKCJUaGVyZSB7MCxjaG9pY2UsMCNhcmUgbm8gZmlsZXN8MSNpcyBvbmUgZmlsZXwxJmx0O2FyZSB7MCxudW1iZXIsaW50ZWdlcn0gZmlsZXN9LiIpOworICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBBcyB3ZSBzZWUgYWJvdmUsIHRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgYQorICoge0Bjb2RlIENob2ljZUZvcm1hdH0gaW4ge0Bjb2RlIE1lc3NhZ2VGb3JtYXR9IGlzIHRyZWF0ZWQKKyAqIHNwZWNpYWxseTsgb2NjdXJhbmNlcyBvZiAneycgYXJlIHVzZWQgdG8gaW5kaWNhdGVkIHN1YmZvcm1hdHMsIGFuZCBjYXVzZQorICogcmVjdXJzaW9uLiBJZiB5b3UgY3JlYXRlIGJvdGggYSB7QGNvZGUgTWVzc2FnZUZvcm1hdH0gYW5kCisgKiB7QGNvZGUgQ2hvaWNlRm9ybWF0fSBwcm9ncmFtbWF0aWNhbGx5IChpbnN0ZWFkIG9mIHVzaW5nIHRoZSBzdHJpbmcKKyAqIHBhdHRlcm5zKSwgdGhlbiBiZSBjYXJlZnVsIG5vdCB0byBwcm9kdWNlIGEgZm9ybWF0IHRoYXQgcmVjdXJzZXMgb24gaXRzZWxmLAorICogd2hpY2ggd2lsbCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLgorICogPC9wPgorICogPHA+CisgKiBXaGVuIGEgc2luZ2xlIGFyZ3VtZW50IGlzIHBhcnNlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc3RyaW5nLCB0aGUgbGFzdCBtYXRjaAorICogd2lsbCBiZSB0aGUgZmluYWwgcmVzdWx0IG9mIHRoZSBwYXJzaW5nLiBGb3IgZXhhbXBsZToKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogPHByZT4KKyAqIE1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgiezAsbnVtYmVyLCMuIyN9LCB7MCxudW1iZXIsIy4jfSIpOworICogT2JqZWN0W10gb2JqcyA9IHtuZXcgRG91YmxlKDMuMTQxNSl9OworICogU3RyaW5nIHJlc3VsdCA9IG1mLmZvcm1hdChvYmpzKTsKKyAqIC8vIHJlc3VsdCBub3cgZXF1YWxzICIzLjE0LCAzLjEiCisgKiBvYmpzID0gbnVsbDsKKyAqIG9ianMgPSBtZi5wYXJzZShyZXN1bHQsIG5ldyBQYXJzZVBvc2l0aW9uKDApKTsKKyAqIC8vIG9ianMgbm93IGVxdWFscyB7bmV3IERvdWJsZSgzLjEpfQorICogPC9wcmU+CisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIExpa2V3aXNlLCBwYXJzaW5nIHdpdGggYSB7QGNvZGUgTWVzc2FnZUZvcm1hdH0gb2JqZWN0IHVzaW5nIHBhdHRlcm5zIAorICogY29udGFpbmluZyBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBhcmd1bWVudCB3b3VsZCByZXR1cm4gdGhlIGxhc3QgCisgKiBtYXRjaC4gRm9yIGV4YW1wbGU6CisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KKyAqIDxwcmU+CisgKiBNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoInswfSwgezB9LCB7MH0iKTsKKyAqIFN0cmluZyBmb3JQYXJzaW5nID0gIngsIHksIHoiOworICogT2JqZWN0W10gb2JqcyA9IG1mLnBhcnNlKGZvclBhcnNpbmcsIG5ldyBQYXJzZVBvc2l0aW9uKDApKTsKKyAqIC8vIHJlc3VsdCBub3cgZXF1YWxzIHtuZXcgU3RyaW5nKCJ6Iil9CisgKiA8L3ByZT4KKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxoND48YSBuYW1lPSJzeW5jaHJvbml6YXRpb24iPlN5bmNocm9uaXphdGlvbjwvYT48L2g0PgorICogPHA+CisgKiBNZXNzYWdlIGZvcm1hdHMgYXJlIG5vdCBzeW5jaHJvbml6ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGNyZWF0ZSBzZXBhcmF0ZQorICogZm9ybWF0IGluc3RhbmNlcyBmb3IgZWFjaCB0aHJlYWQuIElmIG11bHRpcGxlIHRocmVhZHMgYWNjZXNzIGEgZm9ybWF0CisgKiBjb25jdXJyZW50bHksIGl0IG11c3QgYmUgc3luY2hyb25pemVkIGV4dGVybmFsbHkuCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgamF2YS51dGlsLkxvY2FsZQorICogQHNlZSBGb3JtYXQKKyAqIEBzZWUgTnVtYmVyRm9ybWF0CisgKiBAc2VlIERlY2ltYWxGb3JtYXQKKyAqIEBzZWUgQ2hvaWNlRm9ybWF0CisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE1lc3NhZ2VGb3JtYXQgZXh0ZW5kcyBGb3JtYXQgewogCkBAIC01MiwxNiArMzcyLDE2IEBACiAgICAgdHJhbnNpZW50IHByaXZhdGUgaW50IG1heEFyZ3VtZW50SW5kZXg7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1lc3NhZ2VGb3JtYXQgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGFuZCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgTG9jYWxlIGZvciBGb3JtYXRzLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIE1lc3NhZ2VGb3JtYXR9IHVzaW5nIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGxvY2FsZSBmb3IgZm9ybWF0cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGVtcGxhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuCisgICAgICogICAgICAgICAgICB0aGUgcGF0dGVybi4KICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYWxlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgcGF0dGVybiBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gY2Fubm90IGJlIHBhcnNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTWVzc2FnZUZvcm1hdChTdHJpbmcgdGVtcGxhdGUsIExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CkBAIC02OSwyNyArMzg5LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBNZXNzYWdlRm9ybWF0IHVzaW5nIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBhbmQgdGhlCi0gICAgICogZGVmYXVsdCBMb2NhbGUgZm9yIEZvcm1hdHMuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTWVzc2FnZUZvcm1hdH0gdXNpbmcgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGFuZAorICAgICAqIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgZm9ybWF0cy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGVtcGxhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgcGF0dGVybi4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHBhdHRlcm4gY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwYXR0ZXJuIGNhbm5vdCBiZSBwYXJzZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE1lc3NhZ2VGb3JtYXQoU3RyaW5nIHRlbXBsYXRlKSB7CiAgICAgICAgIGFwcGx5UGF0dGVybih0ZW1wbGF0ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGlzIE1lc3NhZ2VGb3JtYXQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgcGF0dGVybi4KKyAgICAgKiBDaGFuZ2VzIHRoaXMge0Bjb2RlIE1lc3NhZ2VGb3JtYXR9IHRvIHVzZSB0aGUgc3BlY2lmaWVkIHBhdHRlcm4uCiAgICAgICogCiAgICAgICogQHBhcmFtIHRlbXBsYXRlCi0gICAgICogICAgICAgICAgICB0aGUgcGF0dGVybgotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwYXR0ZXJuLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgcGF0dGVybiBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gY2Fubm90IGJlIHBhcnNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcHBseVBhdHRlcm4oU3RyaW5nIHRlbXBsYXRlKSB7CiAgICAgICAgIGludCBsZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGgoKTsKQEAgLTE0MCwxMiArNDYwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBNZXNzYWdlRm9ybWF0IHdpdGggdGhlIHNhbWUgcGF0dGVybiBhbmQgRm9ybWF0cwotICAgICAqIGFzIHRoaXMgTWVzc2FnZUZvcm1hdC4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBNZXNzYWdlRm9ybWF0fSB3aXRoIHRoZSBzYW1lIHBhdHRlcm4gYW5kCisgICAgICogZm9ybWF0cyBhcyB0aGlzIHtAY29kZSBNZXNzYWdlRm9ybWF0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgTWVzc2FnZUZvcm1hdAotICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyB7QGNvZGUgTWVzc2FnZUZvcm1hdH0uCiAgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKQEAgLTE2MSwxNiArNDgxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBNZXNzYWdlRm9ybWF0IGFuZCBhbnN3ZXIgaWYgdGhleQotICAgICAqIGFyZSBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VGb3JtYXQgYW5kIGhhdmUgdGhlCi0gICAgICogc2FtZSBwYXR0ZXJuLgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMge0Bjb2RlIE1lc3NhZ2VGb3JtYXR9IGFuZCBpbmRpY2F0ZXMKKyAgICAgKiBpZiB0aGV5IGFyZSBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvYmplY3R9IG11c3QgYmUgYW4KKyAgICAgKiBpbnN0YW5jZSBvZiB7QGNvZGUgTWVzc2FnZUZvcm1hdH0gYW5kIGhhdmUgdGhlIHNhbWUgcGF0dGVybi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIE1lc3NhZ2VGb3JtYXQsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBNZXNzYWdlRm9ybWF0fTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtMTk3LDE5ICs1MTcsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHVzaW5nIHRoZSBydWxlcyBvZiB0aGlzIE1lc3NhZ2VGb3JtYXQgYW5kCi0gICAgICogcmV0dXJucyBhbiBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgYW5kCi0gICAgICogYXR0cmlidXRlcy4gVGhlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciByZXR1cm5lZCBhbHNvIGluY2x1ZGVzIHRoZQotICAgICAqIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZm9ybWF0cyBvZiB0aGlzIE1lc3NhZ2VGb3JtYXQuCisgICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCB1c2luZyB0aGUgcnVsZXMgb2YgdGhpcyBtZXNzYWdlIGZvcm1hdCBhbmQKKyAgICAgKiByZXR1cm5zIGFuIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9IHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGFuZAorICAgICAqIGF0dHJpYnV0ZXMuIFRoZSB7QGNvZGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfSByZXR1cm5lZCBhbHNvIGluY2x1ZGVzIHRoZQorICAgICAqIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZm9ybWF0cyBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZm9ybWF0Ci0gICAgICogQHJldHVybiBhbiBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgYW5kCi0gICAgICogICAgICAgICBhdHRyaWJ1dGVzCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdC4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9IHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGFuZAorICAgICAqICAgICAgICAgYXR0cmlidXRlcy4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGFyZ3VtZW50cyBpbiB0aGUgb2JqZWN0IGFycmF5IGNhbm5vdCBiZSBmb3JtYXR0ZWQKLSAgICAgKiAgICAgICAgICAgICAgICBieSB0aGlzIEZvcm1hdAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudHMgaW4gdGhlIG9iamVjdCBhcnJheSBjYW5ub3QgYmUgZm9ybWF0dGVkCisgICAgICogICAgICAgICAgICAgICAgYnkgdGhpcyBtZXNzYWdlIGZvcm1hdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewpAQCAtMjM3LDIzICs1NTcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBPYmplY3QgYXJndW1lbnRzIGludG8gdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgdXNpbmcgdGhlCi0gICAgICogcGF0dGVybiBvZiB0aGlzIE1lc3NhZ2VGb3JtYXQuCisgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBvYmplY3RzIGludG8gYSBzdHJpbmcgd2hpY2ggaXQgYXBwZW5kcyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB1c2luZyB0aGUgcGF0dGVybiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0LgogICAgICAqIDxwPgotICAgICAqIElmIEZpZWxkIEF0dHJpYnV0ZSBvZiB0aGUgRmllbGRQb3NpdGlvbiBzdXBwbGllZCBpcwotICAgICAqIE1lc3NhZ2VGb3JtYXQuRmllbGQuQVJHVU1FTlQsIHRoZW4gYmVnaW4gYW5kIGVuZCBpbmRleCBvZiB0aGlzIGZpZWxkCi0gICAgICogcG9zaXRpb24gaXMgc2V0IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIG1lc3NhZ2UKLSAgICAgKiBmb3JtYXQgYXJndW1lbnQuIE90aGVyd2lzZSB0aGUgRmllbGRQb3NpdGlvbiBpcyBpZ25vcmVkCi0gICAgICogPHA+CisgICAgICogSWYgdGhlIHtAY29kZSBmaWVsZH0gbWVtYmVyIG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIEZpZWxkUG9zaXRpb259IGlzCisgICAgICoge0Bjb2RlIE1lc3NhZ2VGb3JtYXQuRmllbGQuQVJHVU1FTlR9LCB0aGVuIHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4IG9mCisgICAgICogdGhpcyBmaWVsZCBwb3NpdGlvbiBpcyBzZXQgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEKKyAgICAgKiBtZXNzYWdlIGZvcm1hdCBhcmd1bWVudC4gT3RoZXJ3aXNlLCB0aGUge0Bjb2RlIEZpZWxkUG9zaXRpb259IGlzIGlnbm9yZWQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3RzCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgT2JqZWN0cyB0byBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBvYmplY3RzIHRvIGZvcm1hdC4KICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHN0cmluZyBidWZmZXIgdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSB0by4KICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIGEgRmllbGRQb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmdCdWZmZXIgcGFyYW1ldGVyIDxjb2RlPmJ1ZmZlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIG9uIGlucHV0OiBhbiBvcHRpb25hbCBhbGlnbm1lbnQgZmllbGQ7IG9uIG91dHB1dDogdGhlIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSBhbGlnbm1lbnQgZmllbGQgaW4gdGhlIGZvcm1hdHRlZCB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoT2JqZWN0W10gb2JqZWN0cywgU3RyaW5nQnVmZmVyIGJ1ZmZlciwKICAgICAgICAgICAgIEZpZWxkUG9zaXRpb24gZmllbGQpIHsKQEAgLTM5NSwxOSArNzE2LDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyIHVzaW5nIHRoZQotICAgICAqIHBhdHRlcm4gb2YgdGhpcyBNZXNzYWdlRm9ybWF0LgorICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBpbnRvIGEgc3RyaW5nIHdoaWNoIGl0IGFwcGVuZHMgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgdXNpbmcgdGhlIHBhdHRlcm4gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIGZpZWxkfSBtZW1iZXIgb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgRmllbGRQb3NpdGlvbn0gaXMKKyAgICAgKiB7QGNvZGUgTWVzc2FnZUZvcm1hdC5GaWVsZC5BUkdVTUVOVH0sIHRoZW4gdGhlIGJlZ2luIGFuZCBlbmQgaW5kZXggb2YKKyAgICAgKiB0aGlzIGZpZWxkIHBvc2l0aW9uIGlzIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYQorICAgICAqIG1lc3NhZ2UgZm9ybWF0IGFyZ3VtZW50LiBPdGhlcndpc2UsIHRoZSB7QGNvZGUgRmllbGRQb3NpdGlvbn0gaXMgaWdub3JlZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiA8L3A+CisgICAgICogPGJsb2NrcXVvdGU+CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiBmb3JtYXQoKE9iamVjdFtdKW9iamVjdCwgYnVmZmVyLCBmaWVsZCkKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L2Jsb2NrcXVvdGU+CiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmb3JtYXQsIG11c3QgYmUgYW4gYXJyYXkgb2YgT2JqZWN0CisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdCwgbXVzdCBiZSBhbiBhcnJheSBvZiB7QGNvZGUgT2JqZWN0fS4KICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHN0cmluZyBidWZmZXIgdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSB0by4KICAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIGEgRmllbGRQb3NpdGlvbiB3aGljaCBpcyBpZ25vcmVkCi0gICAgICogQHJldHVybiB0aGUgU3RyaW5nQnVmZmVyIHBhcmFtZXRlciA8Y29kZT5idWZmZXI8L2NvZGU+Ci0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgbm90IGFuIGFycmF5IG9mIE9iamVjdAorICAgICAqICAgICAgICAgICAgb24gaW5wdXQ6IGFuIG9wdGlvbmFsIGFsaWdubWVudCBmaWVsZDsgb24gb3V0cHV0OiB0aGUgb2Zmc2V0cworICAgICAqICAgICAgICAgICAgb2YgdGhlIGFsaWdubWVudCBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBvYmplY3R9IGlzIG5vdCBhbiBhcnJheSBvZiB7QGNvZGUgT2JqZWN0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdChPYmplY3Qgb2JqZWN0LCBTdHJpbmdCdWZmZXIgYnVmZmVyLApAQCAtNDE2LDI1ICs3NTQsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBPYmplY3QgYXJndW1lbnRzIHVzaW5nIHRoZSBzcGVjaWZpZWQgTWVzc2FnZUZvcm1hdCBwYXR0ZXJuLgorICAgICAqIEZvcm1hdHMgdGhlIHN1cHBsaWVkIG9iamVjdHMgdXNpbmcgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGZvcm1hdCBwYXR0ZXJuLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIHBhdHRlcm4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHRvIHVzZSBmb3IgZm9ybWF0dGluZy4KICAgICAgKiBAcGFyYW0gb2JqZWN0cwotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIE9iamVjdHMgdG8gZm9ybWF0Ci0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHJlc3VsdAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIG9iamVjdHMgdG8gZm9ybWF0LgorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCByZXN1bHQuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBwYXR0ZXJuIGNhbm5vdCBiZSBwYXJzZWQKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcGF0dGVybiBjYW5ub3QgYmUgcGFyc2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgdGVtcGxhdGUsIE9iamVjdC4uLiBvYmplY3RzKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgICAgICAvLyBjaGFuZ2VkIHBhcmFtZXRlciB0eXBlIGZyb20gYXJyYXkgdG8gdmFyYXJncy4KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQodGVtcGxhdGUpLmZvcm1hdChvYmplY3RzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBGb3JtYXRzIG9mIHRoaXMgTWVzc2FnZUZvcm1hdC4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgRm9ybWF0fSBpbnN0YW5jZXMgdXNlZCBieSB0aGlzIG1lc3NhZ2UgZm9ybWF0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgRm9ybWF0CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGNvZGUgRm9ybWF0fSBpbnN0YW5jZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZvcm1hdFtdIGdldEZvcm1hdHMoKSB7CiAgICAgICAgIHJldHVybiBmb3JtYXRzLmNsb25lKCk7CkBAIC00NDIsMTAgKzc4NCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZm9ybWF0cyB1c2VkIGZvciBlYWNoIGFyZ3VtZW50IGluZGV4LiBJZiBhbiBhcmd1bWVudCBpcwotICAgICAqIHBsYWNlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgcGF0dGVybiBzdHJpbmcsIHRoYW4gcmV0dXJucyB0aGUgZm9ybWF0IG9mCi0gICAgICogdGhlIGxhc3Qgb25lLgorICAgICAqIHBsYWNlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgcGF0dGVybiBzdHJpbmcsIHRoZW4gdGhpcyByZXR1cm5zIHRoZSBmb3JtYXQKKyAgICAgKiBvZiB0aGUgbGFzdCBvbmUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmb3JtYXRzLCBvcmRlcmVkIGJ5IGFyZ3VtZW50IGluZGV4CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmb3JtYXRzLCBvcmRlcmVkIGJ5IGFyZ3VtZW50IGluZGV4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGb3JtYXRbXSBnZXRGb3JtYXRzQnlBcmd1bWVudEluZGV4KCkgewogICAgICAgICBGb3JtYXRbXSBhbnN3ZXIgPSBuZXcgRm9ybWF0W21heEFyZ3VtZW50SW5kZXggKyAxXTsKQEAgLTQ1NiwxMSArNzk5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9ybWF0IHVzZWQgZm9yIGFyZ3VtZW50IGF0IGluZGV4IDxjb2RlPmFyZ0luZGV4PC9jb2RlPnRvCi0gICAgICogPGNvZGU+Zm9ybWF0PC9jb2RlPgorICAgICAqIFNldHMgdGhlIGZvcm1hdCB1c2VkIGZvciB0aGUgYXJndW1lbnQgYXQgaW5kZXgge0Bjb2RlIGFyZ0luZGV4fSB0bworICAgICAqIHtAY29kZSBmb3JtYXR9LgogICAgICAqIAogICAgICAqIEBwYXJhbSBhcmdJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmb3JtYXQgdG8gc2V0LgogICAgICAqIEBwYXJhbSBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgdGhhdCB3aWxsIGJlIHNldCBhdCBpbmRleCB7QGNvZGUgYXJnSW5kZXh9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdEJ5QXJndW1lbnRJbmRleChpbnQgYXJnSW5kZXgsIEZvcm1hdCBmb3JtYXQpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhPZmZzZXQgKyAxOyBpKyspIHsKQEAgLTQ3MSwxMCArODE3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9ybWF0cyB1c2VkIGZvciBlYWNoIGFyZ3VtZW50IDxjb2RlPlRoZSBmb3JtYXRzPC9jb2RlPiBhcnJheQorICAgICAqIFNldHMgdGhlIGZvcm1hdHMgdXNlZCBmb3IgZWFjaCBhcmd1bWVudC4gVGhlIHtAY29kZSBmb3JtYXRzfSBhcnJheQogICAgICAqIGVsZW1lbnRzIHNob3VsZCBiZSBpbiB0aGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IGluZGljZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZvcm1hdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXRzIGluIGFuIGFycmF5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdHNCeUFyZ3VtZW50SW5kZXgoRm9ybWF0W10gZm9ybWF0cykgewogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZvcm1hdHMubGVuZ3RoOyBqKyspIHsKQEAgLTQ4NywyMiArODM1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgTG9jYWxlIHVzZWQgd2hlbiBjcmVhdGluZyBGb3JtYXRzLgorICAgICAqIFJldHVybnMgdGhlIGxvY2FsZSB1c2VkIHdoZW4gY3JlYXRpbmcgZm9ybWF0cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBMb2NhbGUgdXNlZCB0byBjcmVhdGUgRm9ybWF0cworICAgICAqIEByZXR1cm4gdGhlIGxvY2FsZSB1c2VkIHRvIGNyZWF0ZSBmb3JtYXRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgewogICAgICAgICByZXR1cm4gbG9jYWxlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gT2JqZWN0cyB3aGljaCBhcmUgZXF1YWwKLSAgICAgKiBhbnN3ZXIgdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICAgICAqIAotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBoYXNoQ29kZSA9IDA7CkBAIC01MjIsMTUgKzg2MywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBtZXNzYWdlIGFyZ3VtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHVzaW5nIHRoZSBydWxlcyBvZgotICAgICAqIHRoaXMgTWVzc2FnZUZvcm1hdC4KKyAgICAgKiBQYXJzZXMgdGhlIG1lc3NhZ2UgYXJndW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgdXNpbmcgdGhlIHJ1bGVzIG9mCisgICAgICogdGhpcyBtZXNzYWdlIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHBhcnNlCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgT2JqZWN0IGFyZ3VtZW50cyByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UKLSAgICAgKiAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Yge0Bjb2RlIE9iamVjdH0gYXJndW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZS4KICAgICAgKiBAZXhjZXB0aW9uIFBhcnNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHBhcnNpbmcKKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHBhcnNpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdFtdIHBhcnNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcnNlUG9zaXRpb24gcG9zaXRpb24gPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKQEAgLTU0MiwxOSArODgzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2UgdGhlIG1lc3NhZ2UgYXJndW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIFN0cmluZyBzdGFydGluZyBhdCB0aGUKLSAgICAgKiBpbmRleCBzcGVjaWZpZWQgYnkgdGhlIFBhcnNlUG9zaXRpb24uIElmIHRoZSBzdHJpbmcgaXMgc3VjY2Vzc2Z1bGx5Ci0gICAgICogcGFyc2VkLCB0aGUgaW5kZXggb2YgdGhlIFBhcnNlUG9zaXRpb24gaXMgdXBkYXRlZCB0byB0aGUgaW5kZXggZm9sbG93aW5nCi0gICAgICogdGhlIHBhcnNlZCB0ZXh0LgorICAgICAqIFBhcnNlcyB0aGUgbWVzc2FnZSBhcmd1bWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0aW5nIGF0IHRoZQorICAgICAqIGluZGV4IHNwZWNpZmllZCBieSB7QGNvZGUgcG9zaXRpb259LiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqIHBhcnNlZCB0aGVuIHRoZSBpbmRleCBvZiB0aGUge0Bjb2RlIFBhcnNlUG9zaXRpb259IGlzIHVwZGF0ZWQgdG8gdGhlCisgICAgICogaW5kZXggZm9sbG93aW5nIHRoZSBwYXJzZWQgdGV4dC4gT24gZXJyb3IsIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZQorICAgICAqIGVycm9yIGluZGV4IG9mIHtAY29kZSBQYXJzZVBvc2l0aW9ufSBpcyBzZXQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvcgorICAgICAqIG9jY3VycmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCiAgICAgICogQHBhcmFtIHBvc2l0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgUGFyc2VQb3NpdGlvbiwgdXBkYXRlZCBvbiByZXR1cm4gd2l0aCB0aGUgaW5kZXggZm9sbG93aW5nCi0gICAgICogICAgICAgICAgICB0aGUgcGFyc2VkIHRleHQsIG9yIG9uIGVycm9yIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgZXJyb3IgaW5kZXggaXMgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBPYmplY3QgYXJndW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZSwgb3IgbnVsbAotICAgICAqICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAgKiAgICAgICAgICAgIGlucHV0L291dHB1dCBwYXJhbWV0ZXIsIHNwZWNpZmllcyB0aGUgc3RhcnQgaW5kZXggaW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBzdHJpbmd9IGZyb20gd2hlcmUgdG8gc3RhcnQgcGFyc2luZy4gSWYgcGFyc2luZyBpcworICAgICAqICAgICAgICAgICAgc3VjY2Vzc2Z1bCwgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZAorICAgICAqICAgICAgICAgICAgdGV4dDsgb24gZXJyb3IsIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZSBlcnJvciBpbmRleCBpcworICAgICAqICAgICAgICAgICAgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygb2JqZWN0cyByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdFtdIHBhcnNlKFN0cmluZyBzdHJpbmcsIFBhcnNlUG9zaXRpb24gcG9zaXRpb24pIHsKICAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSB7CkBAIC02MDksMTkgKzk1NSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBtZXNzYWdlIGFyZ3VtZW50IGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgc3RhcnRpbmcgYXQgdGhlCi0gICAgICogaW5kZXggc3BlY2lmaWVkIGJ5IHRoZSBQYXJzZVBvc2l0aW9uLiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseQotICAgICAqIHBhcnNlZCwgdGhlIGluZGV4IG9mIHRoZSBQYXJzZVBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIGluZGV4IGZvbGxvd2luZwotICAgICAqIHRoZSBwYXJzZWQgdGV4dC4KKyAgICAgKiBQYXJzZXMgdGhlIG1lc3NhZ2UgYXJndW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydGluZyBhdCB0aGUKKyAgICAgKiBpbmRleCBzcGVjaWZpZWQgYnkge0Bjb2RlIHBvc2l0aW9ufS4gSWYgdGhlIHN0cmluZyBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiBwYXJzZWQgdGhlbiB0aGUgaW5kZXggb2YgdGhlIHtAY29kZSBQYXJzZVBvc2l0aW9ufSBpcyB1cGRhdGVkIHRvIHRoZQorICAgICAqIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkIHRleHQuIE9uIGVycm9yLCB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUKKyAgICAgKiBlcnJvciBpbmRleCBvZiB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gaXMgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3IKKyAgICAgKiBvY2N1cnJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHBhcnNlCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgogICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIFBhcnNlUG9zaXRpb24sIHVwZGF0ZWQgb24gcmV0dXJuIHdpdGggdGhlIGluZGV4IGZvbGxvd2luZwotICAgICAqICAgICAgICAgICAgdGhlIHBhcnNlZCB0ZXh0LCBvciBvbiBlcnJvciB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGluZGV4IGlzIHNldCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgT2JqZWN0IGFyZ3VtZW50cyByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIG51bGwKLSAgICAgKiAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICogICAgICAgICAgICBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyLCBzcGVjaWZpZXMgdGhlIHN0YXJ0IGluZGV4IGluCisgICAgICogICAgICAgICAgICB7QGNvZGUgc3RyaW5nfSBmcm9tIHdoZXJlIHRvIHN0YXJ0IHBhcnNpbmcuIElmIHBhcnNpbmcgaXMKKyAgICAgKiAgICAgICAgICAgIHN1Y2Nlc3NmdWwsIGl0IGlzIHVwZGF0ZWQgd2l0aCB0aGUgaW5kZXggZm9sbG93aW5nIHRoZSBwYXJzZWQKKyAgICAgKiAgICAgICAgICAgIHRleHQ7IG9uIGVycm9yLCB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUgZXJyb3IgaW5kZXggaXMKKyAgICAgKiAgICAgICAgICAgIHNldCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIG9iamVjdHMgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNlLCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgcGFyc2VPYmplY3QoU3RyaW5nIHN0cmluZywgUGFyc2VQb3NpdGlvbiBwb3NpdGlvbikgewpAQCAtNzEwLDcgKzEwNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRpbWVJbnN0YW5jZShkYXRlU3R5bGUsIGxvY2FsZSk7CiAgICAgICAgICAgICBjYXNlIDI6IC8vIG51bWJlcgogICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnfScpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZShsb2NhbGUpOworICAgICAgICAgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludCBudW1iZXJTdHlsZSA9IG1hdGNoKHN0cmluZywgcG9zaXRpb24sIHRydWUsIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVuY3kiLCAicGVyY2VudCIsICJpbnRlZ2VyIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKQEAgLTczNywyMiArMTA5MCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBGb3JtYXQgdXNlZCBieSB0aGlzIE1lc3NhZ2VGb3JtYXQuCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIGZvcm1hdCB1c2VkIGJ5IHRoaXMgbWVzc2FnZSBmb3JtYXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCB0byBjaGFuZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZm9ybWF0IHRvIGNoYW5nZS4KICAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogICAgICAgICAgICB0aGUgRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIEZvcm1hdH0gdGhhdCByZXBsYWNlcyB0aGUgb2xkIGZvcm1hdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXQoaW50IG9mZnNldCwgRm9ybWF0IGZvcm1hdCkgewogICAgICAgICBmb3JtYXRzW29mZnNldF0gPSBmb3JtYXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgRm9ybWF0cyB1c2VkIGJ5IHRoaXMgTWVzc2FnZUZvcm1hdC4KKyAgICAgKiBTZXRzIHRoZSBmb3JtYXRzIHVzZWQgYnkgdGhpcyBtZXNzYWdlIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gZm9ybWF0cwotICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgRm9ybWF0CisgICAgICogICAgICAgICAgICBhbiBhcnJheSBvZiB7QGNvZGUgRm9ybWF0fS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXRzKEZvcm1hdFtdIGZvcm1hdHMpIHsKICAgICAgICAgaW50IG1pbiA9IHRoaXMuZm9ybWF0cy5sZW5ndGg7CkBAIC03NjUsMTAgKzExMjAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBMb2NhbGUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgRm9ybWF0cy4KKyAgICAgKiBTZXRzIHRoZSBsb2NhbGUgdG8gdXNlIHdoZW4gY3JlYXRpbmcge0Bjb2RlIEZvcm1hdH0gaW5zdGFuY2VzLiBDaGFuZ2luZworICAgICAqIHRoZSBsb2NhbGUgbWF5IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2Yge0Bjb2RlIGFwcGx5UGF0dGVybn0sCisgICAgICoge0Bjb2RlIHRvUGF0dGVybn0sIHtAY29kZSBmb3JtYXR9IGFuZCB7QGNvZGUgZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcn0uCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBsb2NhbGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CkBAIC04NTUsOSArMTIxMywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdHRlcm4gb2YgdGhpcyBNZXNzYWdlRm9ybWF0LgorICAgICAqIFJldHVybnMgdGhlIHBhdHRlcm4gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXR0ZXJuCisgICAgICogQHJldHVybiB0aGUgcGF0dGVybi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvUGF0dGVybigpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTk4NywzMyArMTM0Niw0OSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIGluc3RhbmNlcyBvZiB0aGlzIGlubmVyIGNsYXNzIGFyZSB1c2VkIGFzIGF0dHJpYnV0ZSBrZXlzIGluCi0gICAgICogQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRoYXQKLSAgICAgKiBNZXNzYWdlRm9ybWF0LmZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoKSBtZXRob2QgcmV0dXJucy4KKyAgICAgKiB7QGNvZGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfSB0aGF0IHRoZQorICAgICAqIHtAbGluayBNZXNzYWdlRm9ybWF0I2Zvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoT2JqZWN0KX0gbWV0aG9kIHJldHVybnMuCiAgICAgICogPHA+Ci0gICAgICogVGhlcmUgaXMgbm8gcHVibGljIGNvbnN0cnVjdG9yIHRvIHRoaXMgY2xhc3MsIHRoZSBvbmx5IGluc3RhbmNlcyBhcmUgdGhlCisgICAgICogVGhlcmUgaXMgbm8gcHVibGljIGNvbnN0cnVjdG9yIGluIHRoaXMgY2xhc3MsIHRoZSBvbmx5IGluc3RhbmNlcyBhcmUgdGhlCiAgICAgICogY29uc3RhbnRzIGRlZmluZWQgaGVyZS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZCBleHRlbmRzIEZvcm1hdC5GaWVsZCB7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzg5OTk0Mzk1NzYxNzM2MDgxMEw7CiAKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCisgICAgICAgIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgRmllbGQgQVJHVU1FTlQgPSBuZXcgRmllbGQoIm1lc3NhZ2UgYXJndW1lbnQgZmllbGQiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoaXMgY29uc3RhbnQgc3RhbmRzIGZvciB0aGUgbWVzc2FnZSBhcmd1bWVudC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWVsZCBBUkdVTUVOVCA9IG5ldyBGaWVsZCgibWVzc2FnZSBhcmd1bWVudCBmaWVsZCIpOyAvLyROT04tTkxTLTEkCiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTWVzc2FnZUZvcm1hdC5GaWVsZCB3aXRoIHRoZSBnaXZlbiBmaWVsZAotICAgICAgICAgKiBuYW1lLgotICAgICAgICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBmaWVsZCBuYW1lLgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBNZXNzYWdlRm9ybWF0LkZpZWxkfSB3aXRoIHRoZQorICAgICAgICAgKiBnaXZlbiBmaWVsZCBuYW1lLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGZpZWxkTmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBuYW1lLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBGaWVsZChTdHJpbmcgZmllbGROYW1lKSB7CiAgICAgICAgICAgICBzdXBlcihmaWVsZE5hbWUpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIHNlcmlhbGl6YXRpb24gbWV0aG9kIHJlc29sdmUgaW5zdGFuY2VzIHRvIHRoZSBjb25zdGFudAotICAgICAgICAgKiBNZXNzYWdlRm9ybWF0LkZpZWxkIHZhbHVlcworICAgICAgICAgKiBSZXNvbHZlcyBpbnN0YW5jZXMgdGhhdCBhcmUgZGVzZXJpYWxpemVkIHRvIHRoZSBjb25zdGFudAorICAgICAgICAgKiB7QGNvZGUgTWVzc2FnZUZvcm1hdC5GaWVsZH0gdmFsdWVzLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZmllbGQgb2JqZWN0LgorICAgICAgICAgKiBAdGhyb3dzIEludmFsaWRPYmplY3RFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlc29sdmluZyB0aGUgZmllbGQgb2JqZWN0LgogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgSW52YWxpZE9iamVjdEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L051bWJlckZvcm1hdC5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9OdW1iZXJGb3JtYXQuamF2YQppbmRleCA1Mjg5YjY5Li43MzU1YmM3IDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L051bWJlckZvcm1hdC5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvTnVtYmVyRm9ybWF0LmphdmEKQEAgLTE0LDYgKzE0LDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIEVORCBhbmRyb2lkLW5vdGUKIAogcGFja2FnZSBqYXZhLnRleHQ7CiAKQEAgLTI5LDIwICs0MSwxNDEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogTnVtYmVyRm9ybWF0IGlzIHRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIEZvcm1hdHMgd2hpY2ggZm9ybWF0IGFuZCBwYXJzZQotICogTnVtYmVycy4KKyAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgbnVtYmVyIGZvcm1hdHMuIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlCisgKiBpbnRlcmZhY2UgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgbnVtYmVycy4ge0Bjb2RlIE51bWJlckZvcm1hdH0gYWxzbworICogcHJvdmlkZXMgbWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggbG9jYWxlcyBoYXZlIG51bWJlciBmb3JtYXRzLCBhbmQgd2hhdAorICogdGhlaXIgbmFtZXMgYXJlLgorICogPHA+CisgKiB7QGNvZGUgTnVtYmVyRm9ybWF0fSBoZWxwcyB5b3UgdG8gZm9ybWF0IGFuZCBwYXJzZSBudW1iZXJzIGZvciBhbnkgbG9jYWxlLgorICogWW91ciBjb2RlIGNhbiBiZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoZSBsb2NhbGUgY29udmVudGlvbnMgZm9yIGRlY2ltYWwKKyAqIHBvaW50cywgdGhvdXNhbmRzLXNlcGFyYXRvcnMsIG9yIGV2ZW4gdGhlIHBhcnRpY3VsYXIgZGVjaW1hbCBkaWdpdHMgdXNlZCwgb3IKKyAqIHdoZXRoZXIgdGhlIG51bWJlciBmb3JtYXQgaXMgZXZlbiBkZWNpbWFsLgorICogPC9wPgorICogPHA+CisgKiBUbyBmb3JtYXQgYSBudW1iZXIgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSwgdXNlIG9uZSBvZiB0aGUgZmFjdG9yeSBjbGFzcworICogbWV0aG9kczoKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogbXlTdHJpbmcgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKS5mb3JtYXQobXlOdW1iZXIpOworICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogSWYgeW91IGFyZSBmb3JtYXR0aW5nIG11bHRpcGxlIG51bWJlcnMsIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGdldCB0aGUKKyAqIGZvcm1hdCBhbmQgdXNlIGl0IG11bHRpcGxlIHRpbWVzIHNvIHRoYXQgdGhlIHN5c3RlbSBkb2Vzbid0IGhhdmUgdG8gZmV0Y2ggdGhlCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29udmVudGlvbnMgbXVsdGlwbGUgdGltZXMuCisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOworICogZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBhLmxlbmd0aDsgKytpKSB7CisgKiAgICAgb3V0cHV0LnByaW50bG4obmYuZm9ybWF0KG15TnVtYmVyW2ldKSArICZxdW90OzsgJnF1b3Q7KTsKKyAqIH0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIFRvIGZvcm1hdCBhIG51bWJlciBmb3IgYSBkaWZmZXJlbnQgbG9jYWxlLCBzcGVjaWZ5IGl0IGluIHRoZSBjYWxsIHRvCisgKiB7QGNvZGUgZ2V0SW5zdGFuY2V9LgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiBOdW1iZXJGb3JtYXQgbmYgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLkZSRU5DSCk7CisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBZb3UgY2FuIGFsc28gdXNlIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gdG8gcGFyc2UgbnVtYmVyczoKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogbXlOdW1iZXIgPSBuZi5wYXJzZShteVN0cmluZyk7CisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBVc2Uge0Bjb2RlIGdldEluc3RhbmNlfSBvciB7QGNvZGUgZ2V0TnVtYmVySW5zdGFuY2V9IHRvIGdldCB0aGUgbm9ybWFsIG51bWJlcgorICogZm9ybWF0LiBVc2Uge0Bjb2RlIGdldEludGVnZXJJbnN0YW5jZX0gdG8gZ2V0IGFuIGludGVnZXIgbnVtYmVyIGZvcm1hdC4gVXNlCisgKiB7QGNvZGUgZ2V0Q3VycmVuY3lJbnN0YW5jZX0gdG8gZ2V0IHRoZSBjdXJyZW5jeSBudW1iZXIgZm9ybWF0IGFuZCB1c2UKKyAqIHtAY29kZSBnZXRQZXJjZW50SW5zdGFuY2V9IHRvIGdldCBhIGZvcm1hdCBmb3IgZGlzcGxheWluZyBwZXJjZW50YWdlcy4gV2l0aAorICogdGhpcyBmb3JtYXQsIGEgZnJhY3Rpb24gbGlrZSAwLjUzIGlzIGRpc3BsYXllZCBhcyA1MyUuCisgKiA8L3A+CisgKiA8cD4KKyAqIFlvdSBjYW4gYWxzbyBjb250cm9sIHRoZSBkaXNwbGF5IG9mIG51bWJlcnMgd2l0aCBtZXRob2RzIHN1Y2ggYXMKKyAqIHtAY29kZSBzZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHN9LiBJZiB5b3Ugd2FudCBldmVuIG1vcmUgY29udHJvbCBvdmVyIHRoZQorICogZm9ybWF0IG9yIHBhcnNpbmcsIG9yIHdhbnQgdG8gZ2l2ZSB5b3VyIHVzZXJzIG1vcmUgY29udHJvbCwgeW91IGNhbiB0cnkKKyAqIGNhc3RpbmcgdGhlIHtAY29kZSBOdW1iZXJGb3JtYXR9IHlvdSBnZXQgZnJvbSB0aGUgZmFjdG9yeSBtZXRob2RzIHRvIGEKKyAqIHtAY29kZSBEZWNpbWFsRm9ybWF0fS4gVGhpcyB3aWxsIHdvcmsgZm9yIHRoZSB2YXN0IG1ham9yaXR5IG9mIGxvY2FsZXM7IGp1c3QKKyAqIHJlbWVtYmVyIHRvIHB1dCBpdCBpbiBhIHtAY29kZSB0cnl9IGJsb2NrIGluIGNhc2UgeW91IGVuY291bnRlciBhbiB1bnVzdWFsCisgKiBvbmUuCisgKiA8L3A+CisgKiA8cD4KKyAqIHtAY29kZSBOdW1iZXJGb3JtYXR9IGlzIGRlc2lnbmVkIHN1Y2ggdGhhdCBzb21lIGNvbnRyb2xzIHdvcmsgZm9yIGZvcm1hdHRpbmcKKyAqIGFuZCBvdGhlcnMgd29yayBmb3IgcGFyc2luZy4gRm9yIGV4YW1wbGUsIHtAY29kZSBzZXRQYXJzZUludGVnZXJPbmx5fSBvbmx5CisgKiBhZmZlY3RzIHBhcnNpbmc6IElmIHNldCB0byB7QGNvZGUgdHJ1ZX0sICIzNDU2Ljc4IiBpcyBwYXJzZWQgYXMgMzQ1NiAoYW5kCisgKiBsZWF2ZXMgdGhlIHBhcnNlIHBvc2l0aW9uIGp1c3QgYWZ0ZXIgJzYnKTsgaWYgc2V0IHRvIHtAY29kZSBmYWxzZX0sCisgKiAiMzQ1Ni43OCIgaXMgcGFyc2VkIGFzIDM0NTYuNzggKGFuZCBsZWF2ZXMgdGhlIHBhcnNlIHBvc2l0aW9uIGp1c3QgYWZ0ZXIKKyAqICc4JykuIFRoaXMgaXMgaW5kZXBlbmRlbnQgb2YgZm9ybWF0dGluZy4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IGNhbiBhbHNvIHVzZSBmb3JtcyBvZiB0aGUge0Bjb2RlIHBhcnNlfSBhbmQge0Bjb2RlIGZvcm1hdH0gbWV0aG9kcyB3aXRoCisgKiB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gYW5kIHtAY29kZSBGaWVsZFBvc2l0aW9ufSB0byBhbGxvdyB5b3UgdG86CisgKiA8dWw+CisgKiA8bGk+cHJvZ3Jlc3NpdmVseSBwYXJzZSB0aHJvdWdoIHBpZWNlcyBvZiBhIHN0cmluZzs8L2xpPgorICogPGxpPmFsaWduIHRoZSBkZWNpbWFsIHBvaW50IGFuZCBvdGhlciBhcmVhcy48L2xpPgorICogPC91bD4KKyAqIEZvciBleGFtcGxlLCB5b3UgY2FuIGFsaWduIG51bWJlcnMgaW4gdHdvIHdheXM6CisgKiA8b2w+CisgKiA8bGk+IElmIHlvdSBhcmUgdXNpbmcgYSBtb25vc3BhY2VkIGZvbnQgd2l0aCBzcGFjaW5nIGZvciBhbGlnbm1lbnQsIHlvdSBjYW4KKyAqIHBhc3MgdGhlIHtAY29kZSBGaWVsZFBvc2l0aW9ufSBpbiB5b3VyIGZvcm1hdCBjYWxsLCB3aXRoIHtAY29kZSBmaWVsZH0gPQorICoge0Bjb2RlIElOVEVHRVJfRklFTER9LiBPbiBvdXRwdXQsIHtAY29kZSBnZXRFbmRJbmRleH0gd2lsbCBiZSBzZXQgdG8gdGhlCisgKiBvZmZzZXQgYmV0d2VlbiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGludGVnZXIgYW5kIHRoZSBkZWNpbWFsLiBBZGQKKyAqIChkZXNpcmVkU3BhY2VDb3VudCAtIGdldEVuZEluZGV4KSBzcGFjZXMgdG8gdGhlIGZyb250IG9mIHRoZSBzdHJpbmcuPC9saT4KKyAqIDxsaT4gSWYgeW91IGFyZSB1c2luZyBwcm9wb3J0aW9uYWwgZm9udHMsIGluc3RlYWQgb2YgcGFkZGluZyB3aXRoIHNwYWNlcywKKyAqIG1lYXN1cmUgdGhlIHdpZHRoIG9mIHRoZSBzdHJpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIHN0YXJ0IHRvCisgKiB7QGNvZGUgZ2V0RW5kSW5kZXh9LiBUaGVuIG1vdmUgdGhlIHBlbiBieSAoZGVzaXJlZFBpeGVsV2lkdGggLQorICogd2lkdGhUb0FsaWdubWVudFBvaW50KSBiZWZvcmUgZHJhd2luZyB0aGUgdGV4dC4gVGhpcyBhbHNvIHdvcmtzIHdoZXJlIHRoZXJlCisgKiBpcyBubyBkZWNpbWFsIGJ1dCBwb3NzaWJseSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYmVmb3JlIG9yIGFmdGVyIHRoZSBudW1iZXIsCisgKiBmb3IgZXhhbXBsZSB3aXRoIHBhcmVudGhlc2VzIGluIG5lZ2F0aXZlIG51bWJlcnM6ICIoMTIpIiBmb3IgLTEyLjwvbGk+CisgKiA8L29sPgorICogPGg0PlN5bmNocm9uaXphdGlvbjwvaDQ+CisgKiA8cD4KKyAqIE51bWJlciBmb3JtYXRzIGFyZSBnZW5lcmFsbHkgbm90IHN5bmNocm9uaXplZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gY3JlYXRlCisgKiBzZXBhcmF0ZSBmb3JtYXQgaW5zdGFuY2VzIGZvciBlYWNoIHRocmVhZC4gSWYgbXVsdGlwbGUgdGhyZWFkcyBhY2Nlc3MgYQorICogZm9ybWF0IGNvbmN1cnJlbnRseSwgaXQgbXVzdCBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4KKyAqIDxwPgorICogPGg0PkRlY2ltYWxGb3JtYXQ8L2g0PgorICogPHA+CisgKiB7QGNvZGUgRGVjaW1hbEZvcm1hdH0gaXMgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAY29kZSBOdW1iZXJGb3JtYXR9LAorICogYW5kIHRoZSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBBUEkgaXMgZXNzZW50aWFsbHkgYW4gYWJzdHJhY3Rpb24gb2YKKyAqIHtAY29kZSBEZWNpbWFsRm9ybWF0J3N9IEFQSS4gUmVmZXIgdG8ge0Bjb2RlIERlY2ltYWxGb3JtYXR9IGZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIEFQSS4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBEZWNpbWFsRm9ybWF0CisgKiBAc2VlIGphdmEudGV4dC5DaG9pY2VGb3JtYXQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVtYmVyRm9ybWF0IGV4dGVuZHMgRm9ybWF0IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMzA4NDYwMTI1NzMzNzEzOTQ0TDsKIAogICAgIC8qKgotICAgICAqIEZpZWxkIGNvbnN0YW50LgorICAgICAqIEZpZWxkIGNvbnN0YW50IGlkZW50aWZ5aW5nIHRoZSBpbnRlZ2VyIHBhcnQgb2YgYSBudW1iZXIuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUl9GSUVMRCA9IDA7CiAKICAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdGFudC4KKyAgICAgKiBGaWVsZCBjb25zdGFudCBpZGVudGlmeWluZyB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIGEgbnVtYmVyLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSQUNUSU9OX0ZJRUxEID0gMTsKIApAQCAtNTIsMTcgKzE4NSwyMCBAQAogICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzID0gMywgbWluaW11bUZyYWN0aW9uRGlnaXRzID0gMDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgRGF0ZUZvcm1hdC4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHtAY29kZSBOdW1iZXJGb3JtYXR9LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBOdW1iZXJGb3JtYXQoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBOdW1iZXJGb3JtYXQgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoaXMgTnVtYmVyRm9ybWF0LgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIE51bWJlckZvcm1hdH0gd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoaXMKKyAgICAgKiB7QGNvZGUgTnVtYmVyRm9ybWF0fS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgTnVtYmVyRm9ybWF0Ci0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBOdW1iZXJGb3JtYXR9LgogICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CkBAIC03MCwxNiArMjA2LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBOdW1iZXJGb3JtYXQgYW5kIGFuc3dlciBpZiB0aGV5IGFyZQotICAgICAqIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTnVtYmVyRm9ybWF0IGFuZCBoYXZlIHRoZSBzYW1lCi0gICAgICogcHJvcGVydGllcy4KKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIG51bWJlciBmb3JtYXQgYW5kIGluZGljYXRlcyBpZgorICAgICAqIHRoZXkgYXJlIGVxdWFsLiBJbiBvcmRlciB0byBiZSBlcXVhbCwge0Bjb2RlIG9iamVjdH0gbXVzdCBiZSBhbiBpbnN0YW5jZQorICAgICAqIG9mIHtAY29kZSBOdW1iZXJGb3JtYXR9IHdpdGggdGhlIHNhbWUgcGF0dGVybiBhbmQgcHJvcGVydGllcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIE51bWJlckZvcm1hdCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBudW1iZXIKKyAgICAgKiAgICAgICAgIGZvcm1hdDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewpAQCAtOTksMTEgKzIzNSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBkb3VibGUgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgTnVtYmVyRm9ybWF0LgorICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBkb3VibGUgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMgbnVtYmVyIGZvcm1hdC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdG8gZm9ybWF0Ci0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIFN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBmb3JtYXQuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hdChkb3VibGUgdmFsdWUpIHsKICAgICAgICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkKQEAgLTExMSwyOCArMjQ4LDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgZG91YmxlIHZhbHVlIGludG8gdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgdXNpbmcgdGhlIHJ1bGVzCi0gICAgICogb2YgdGhpcyBOdW1iZXJGb3JtYXQuIElmIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgdGhlIEZpZWxkUG9zaXRpb24gaXMKLSAgICAgKiBmb3JtYXR0ZWQsIHNldCB0aGUgYmVnaW4gYW5kIGVuZCBpbmRleCBvZiB0aGUgZm9ybWF0dGVkIGZpZWxkIGluIHRoZQotICAgICAqIEZpZWxkUG9zaXRpb24uCisgICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIGRvdWJsZSB2YWx1ZSBhcyBhIHN0cmluZyB1c2luZyB0aGUgcGF0dGVybiBvZiB0aGlzCisgICAgICogbnVtYmVyIGZvcm1hdCBhbmQgYXBwZW5kcyB0aGUgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIGZpZWxkfSBtZW1iZXIgb2Yge0Bjb2RlIHBvc2l0aW9ufSBjb250YWlucyBhIHZhbHVlCisgICAgICogc3BlY2lmeWluZyBhIGZvcm1hdCBmaWVsZCwgdGhlbiBpdHMge0Bjb2RlIGJlZ2luSW5kZXh9IGFuZAorICAgICAqIHtAY29kZSBlbmRJbmRleH0gbWVtYmVycyB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0CisgICAgICogb2NjdXJyZW5jZSBvZiB0aGlzIGZpZWxkIGluIHRoZSBmb3JtYXR0ZWQgdGV4dC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHRvIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB0byBmb3JtYXQuCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIGRvdWJsZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdG8uCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgRmllbGRQb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXIgPGNvZGU+YnVmZmVyPC9jb2RlPgorICAgICAqICAgICAgICAgICAgb24gaW5wdXQ6IGFuIG9wdGlvbmFsIGFsaWdubWVudCBmaWVsZDsgb24gb3V0cHV0OiB0aGUgb2Zmc2V0cworICAgICAqICAgICAgICAgICAgb2YgdGhlIGFsaWdubWVudCBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nQnVmZmVyIGZvcm1hdChkb3VibGUgdmFsdWUsIFN0cmluZ0J1ZmZlciBidWZmZXIsCiAgICAgICAgICAgICBGaWVsZFBvc2l0aW9uIGZpZWxkKTsKIAogICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBsb25nIHVzaW5nIHRoZSBydWxlcyBvZiB0aGlzIE51bWJlckZvcm1hdC4KKyAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgbG9uZyB1c2luZyB0aGUgcnVsZXMgb2YgdGhpcyBudW1iZXIgZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gZm9ybWF0Ci0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIFN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gZm9ybWF0LgorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBmb3JtYXQobG9uZyB2YWx1ZSkgewogICAgICAgICByZXR1cm4gZm9ybWF0KHZhbHVlLCBuZXcgU3RyaW5nQnVmZmVyKCksIG5ldyBGaWVsZFBvc2l0aW9uKDApKQpAQCAtMTQwLDM4ICsyODUsNTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBsb25nIHZhbHVlIGludG8gdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgdXNpbmcgdGhlIHJ1bGVzIG9mCi0gICAgICogdGhpcyBOdW1iZXJGb3JtYXQuIElmIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgdGhlIEZpZWxkUG9zaXRpb24gaXMKLSAgICAgKiBmb3JtYXR0ZWQsIHNldCB0aGUgYmVnaW4gYW5kIGVuZCBpbmRleCBvZiB0aGUgZm9ybWF0dGVkIGZpZWxkIGluIHRoZQotICAgICAqIEZpZWxkUG9zaXRpb24uCisgICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIGxvbmcgdmFsdWUgYXMgYSBzdHJpbmcgdXNpbmcgdGhlIHBhdHRlcm4gb2YgdGhpcworICAgICAqIG51bWJlciBmb3JtYXQgYW5kIGFwcGVuZHMgdGhlIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHtAY29kZSBmaWVsZH0gbWVtYmVyIG9mIHtAY29kZSBwb3NpdGlvbn0gY29udGFpbnMgYSB2YWx1ZQorICAgICAqIHNwZWNpZnlpbmcgYSBmb3JtYXQgZmllbGQsIHRoZW4gaXRzIHtAY29kZSBiZWdpbkluZGV4fSBhbmQKKyAgICAgKiB7QGNvZGUgZW5kSW5kZXh9IG1lbWJlcnMgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdAorICAgICAqIG9jY3VycmVuY2Ugb2YgdGhpcyBmaWVsZCBpbiB0aGUgZm9ybWF0dGVkIHRleHQuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdG8gZm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB0byBmb3JtYXQuCiAgICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZ0J1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIGxvbmcgdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRvLgogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIEZpZWxkUG9zaXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmdCdWZmZXIgcGFyYW1ldGVyIDxjb2RlPmJ1ZmZlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIG9uIGlucHV0OiBhbiBvcHRpb25hbCBhbGlnbm1lbnQgZmllbGQ7IG9uIG91dHB1dDogdGhlIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSBhbGlnbm1lbnQgZmllbGQgaW4gdGhlIGZvcm1hdHRlZCB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBidWZmZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ0J1ZmZlciBmb3JtYXQobG9uZyB2YWx1ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwKICAgICAgICAgICAgIEZpZWxkUG9zaXRpb24gZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyIHVzaW5nIHRoZQotICAgICAqIHJ1bGVzIG9mIHRoaXMgRGF0ZUZvcm1hdC4gSWYgdGhlIGZpZWxkIHNwZWNpZmllZCBieSB0aGUgRmllbGRQb3NpdGlvbiBpcwotICAgICAqIGZvcm1hdHRlZCwgc2V0IHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4IG9mIHRoZSBmb3JtYXR0ZWQgZmllbGQgaW4gdGhlCi0gICAgICogRmllbGRQb3NpdGlvbi4KKyAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFzIGEgc3RyaW5nIHVzaW5nIHRoZSBwYXR0ZXJuIG9mIHRoaXMgbnVtYmVyCisgICAgICogZm9ybWF0IGFuZCBhcHBlbmRzIHRoZSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSB7QGNvZGUgZmllbGR9IG1lbWJlciBvZiB7QGNvZGUgZmllbGR9IGNvbnRhaW5zIGEgdmFsdWUgc3BlY2lmeWluZworICAgICAqIGEgZm9ybWF0IGZpZWxkLCB0aGVuIGl0cyB7QGNvZGUgYmVnaW5JbmRleH0gYW5kIHtAY29kZSBlbmRJbmRleH0gbWVtYmVycworICAgICAqIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIGZpZWxkCisgICAgICogaW4gdGhlIGZvcm1hdHRlZCB0ZXh0LgorICAgICAqIDwvcD4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdCwgbXVzdCBiZSBhIE51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmb3JtYXQsIG11c3QgYmUgYSB7QGNvZGUgTnVtYmVyfS4KICAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IHN0cmluZyBidWZmZXIgdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIHRvLgogICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIEZpZWxkUG9zaXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmdCdWZmZXIgcGFyYW1ldGVyIDxjb2RlPmJ1ZmZlcjwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBub3QgYSBOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIG9uIGlucHV0OiBhbiBvcHRpb25hbCBhbGlnbm1lbnQgZmllbGQ7IG9uIG91dHB1dDogdGhlIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSBhbGlnbm1lbnQgZmllbGQgaW4gdGhlIGZvcm1hdHRlZCB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBidWZmZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgb2JqZWN0fSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIE51bWJlcn0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwKQEAgLTE4OCw2OCArMzQ1LDc1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgTG9jYWxlcyB3aGljaCBzdXBwb3J0IE51bWJlckZvcm1hdC4KKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBsb2NhbGVzIHdoaWNoIHN1cHBvcnQge0Bjb2RlIE51bWJlckZvcm1hdH0uCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBMb2NhbGUKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGxvY2FsZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBMb2NhbGVbXSBnZXRBdmFpbGFibGVMb2NhbGVzKCkgewogICAgICAgICByZXR1cm4gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW5jeSB1c2VkIGJ5IHRoaXMgbnVtYmVyIGZvcm1hdAorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbmN5IHVzZWQgYnkgdGhpcyBudW1iZXIgZm9ybWF0LgogICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCBjb25jcmV0ZSBzdWIKLSAgICAgKiBjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiB0aGV5IHN1cHBvcnQgY3VycmVuY3kgZm9ybWF0dGluZy4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHRocm93cyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LAorICAgICAqIGNvbmNyZXRlIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgc3VwcG9ydCBjdXJyZW5jeQorICAgICAqIGZvcm1hdHRpbmcuCiAgICAgICogPHA+CiAgICAgICogCi0gICAgICogQHJldHVybiBjdXJyZW5jeSBjdXJyZW5jeSB0aGF0IHdhcyBzZXQgaW4gZ2V0SW5zdGFuY2UoKSBvciBpbgotICAgICAqICAgICAgICAgc2V0Q3VycmVuY3koKSwgb3IgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbmN5IHRoYXQgd2FzIHNldCBpbiBnZXRJbnN0YW5jZSgpIG9yIGluIHNldEN1cnJlbmN5KCksCisgICAgICogICAgICAgICBvciB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ3VycmVuY3kgZ2V0Q3VycmVuY3koKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBOdW1iZXJGb3JtYXQgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgY3VycmVuY3kgZm9yIHRoZQotICAgICAqIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBjdXJyZW5jeSB2YWx1ZXMKKyAgICAgKiBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBOdW1iZXJGb3JtYXQKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gZm9yIGhhbmRsaW5nIGN1cnJlbmN5IHZhbHVlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE51bWJlckZvcm1hdCBnZXRDdXJyZW5jeUluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gZ2V0Q3VycmVuY3lJbnN0YW5jZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTnVtYmVyRm9ybWF0IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGN1cnJlbmN5IGZvciB0aGUKLSAgICAgKiBzcGVjaWZpZWQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBjdXJyZW5jeSB2YWx1ZXMKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGUuCiAgICAgICogCiAgICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZQotICAgICAqIEByZXR1cm4gYSBOdW1iZXJGb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUgdG8gdXNlLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgaGFuZGxpbmcgY3VycmVuY3kgdmFsdWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRm9ybWF0IGdldEN1cnJlbmN5SW5zdGFuY2UoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UobG9jYWxlLCAiQ3VycmVuY3kiKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBOdW1iZXJGb3JtYXQgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgaW50ZWdlcnMgZm9yIHRoZQotICAgICAqIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBpbnRlZ2VycyBmb3IgdGhlCisgICAgICogZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIE51bWJlckZvcm1hdAorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgaGFuZGxpbmcgaW50ZWdlcnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBOdW1iZXJGb3JtYXQgZ2V0SW50ZWdlckluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gZ2V0SW50ZWdlckluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBOdW1iZXJGb3JtYXQgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgaW50ZWdlcnMgZm9yIHRoZQotICAgICAqIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBOdW1iZXJGb3JtYXR9IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGludGVnZXJzIGZvcgorICAgICAqIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgTnVtYmVyRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gZm9yIGhhbmRsaW5nIGludGVnZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRm9ybWF0IGdldEludGVnZXJJbnN0YW5jZShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBmb3JtYXQgPSBnZXRJbnN0YW5jZShsb2NhbGUsICJJbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKQEAgLTI1OCwyMiArNDIyLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIE51bWJlckZvcm1hdCBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBudW1iZXJzIGZvciB0aGUgZGVmYXVsdAotICAgICAqIExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgbnVtYmVycyBmb3IgdGhlCisgICAgICogZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIE51bWJlckZvcm1hdAorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgaGFuZGxpbmcge0Bjb2RlIE51bWJlcn0gb2JqZWN0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE51bWJlckZvcm1hdCBnZXRJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGdldE51bWJlckluc3RhbmNlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIE51bWJlckZvcm1hdCBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBudW1iZXJzIGZvciB0aGUKLSAgICAgKiBzcGVjaWZpZWQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBudW1iZXJzIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgTnVtYmVyRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gZm9yIGhhbmRsaW5nIHtAY29kZSBOdW1iZXJ9IG9iamVjdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBOdW1iZXJGb3JtYXQgZ2V0SW5zdGFuY2UoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICByZXR1cm4gZ2V0TnVtYmVySW5zdGFuY2UobG9jYWxlKTsKQEAgLTI4OSw3ICs0NTUsOCBAQAogICAgICAqIGZvcm1hdHRpbmcuIElmIHRoZSBtYXhpbXVtIGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cywKICAgICAgKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSB0cnVuY2F0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKCkgewogICAgICAgICByZXR1cm4gbWF4aW11bUZyYWN0aW9uRGlnaXRzOwpAQCAtMzAwLDcgKzQ2Nyw4IEBACiAgICAgICogZm9ybWF0dGluZy4gSWYgdGhlIG1heGltdW0gaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMsIHRoZQogICAgICAqIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSB0cnVuY2F0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heGltdW1JbnRlZ2VyRGlnaXRzKCkgewogICAgICAgICByZXR1cm4gbWF4aW11bUludGVnZXJEaWdpdHM7CkBAIC0zMTAsNyArNDc4LDggQEAKICAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgdGhhdCBhcmUgcHJpbnRlZCB3aGVuCiAgICAgICogZm9ybWF0dGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMKKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoKSB7CiAgICAgICAgIHJldHVybiBtaW5pbXVtRnJhY3Rpb25EaWdpdHM7CkBAIC0zMjAsMjkgKzQ4OSwzMiBAQAogICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzIHRoYXQgYXJlIHByaW50ZWQgd2hlbgogICAgICAqIGZvcm1hdHRpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMKKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1pbmltdW1JbnRlZ2VyRGlnaXRzKCkgewogICAgICAgICByZXR1cm4gbWluaW11bUludGVnZXJEaWdpdHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIE51bWJlckZvcm1hdCBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBudW1iZXJzIGZvciB0aGUgZGVmYXVsdAotICAgICAqIExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgbnVtYmVycyBmb3IgdGhlCisgICAgICogZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIE51bWJlckZvcm1hdAorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgaGFuZGxpbmcge0Bjb2RlIE51bWJlcn0gb2JqZWN0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE51bWJlckZvcm1hdCBnZXROdW1iZXJJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGdldE51bWJlckluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBOdW1iZXJGb3JtYXQgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgbnVtYmVycyBmb3IgdGhlCi0gICAgICogc3BlY2lmaWVkIExvY2FsZS4KKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgbnVtYmVycyBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgTG9jYWxlCi0gICAgICogQHJldHVybiBhIE51bWJlckZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZSB0byB1c2UuCisgICAgICogQHJldHVybiBhIHtAY29kZSBOdW1iZXJGb3JtYXR9IGZvciBoYW5kbGluZyB7QGNvZGUgTnVtYmVyfSBvYmplY3RzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRm9ybWF0IGdldE51bWJlckluc3RhbmNlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKGxvY2FsZSwgIk51bWJlciIpOyAvLyROT04tTkxTLTEkCkBAIC0zNTQsMzUgKzUyNiwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBOdW1iZXJGb3JtYXQgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgcGVyY2VudGFnZXMgZm9yIHRoZQotICAgICAqIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBwZXJjZW50YWdlCisgICAgICogdmFsdWVzIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIE51bWJlckZvcm1hdAorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTnVtYmVyRm9ybWF0fSBmb3IgaGFuZGxpbmcgcGVyY2VudGFnZSB2YWx1ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBOdW1iZXJGb3JtYXQgZ2V0UGVyY2VudEluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gZ2V0UGVyY2VudEluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBOdW1iZXJGb3JtYXQgZm9yIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgcGVyY2VudGFnZXMgZm9yIHRoZQotICAgICAqIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogUmV0dXJucyBhIHtAY29kZSBOdW1iZXJGb3JtYXR9IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIHBlcmNlbnRhZ2UKKyAgICAgKiB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUKLSAgICAgKiBAcmV0dXJuIGEgTnVtYmVyRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIE51bWJlckZvcm1hdH0gZm9yIGhhbmRsaW5nIHBlcmNlbnRhZ2UgdmFsdWVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRm9ybWF0IGdldFBlcmNlbnRJbnN0YW5jZShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZShsb2NhbGUsICJQZXJjZW50Iik7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gKGdyb3VwaW5nVXNlZCA/IDEyMzEgOiAxMjM3KSArIChwYXJzZUludGVnZXJPbmx5ID8gMTIzMSA6IDEyMzcpCkBAIC0zOTEsMzYgKzU1NywzOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIE51bWJlckZvcm1hdCBmb3JtYXRzIGFuZCBwYXJzZXMgbnVtYmVycyB1c2luZyBhCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBudW1iZXIgZm9ybWF0IGZvcm1hdHMgYW5kIHBhcnNlcyBudW1iZXJzIHVzaW5nIGEKICAgICAgKiBncm91cGluZyBzZXBhcmF0b3IuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gYSBncm91cGluZyBzZXBhcmF0b3IgaXMgdXNlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSBncm91cGluZyBzZXBhcmF0b3IgaXMgdXNlZDsge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBpbmdVc2VkKCkgewogICAgICAgICByZXR1cm4gZ3JvdXBpbmdVc2VkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIE51bWJlckZvcm1hdCBvbmx5IHBhcnNlcyBpbnRlZ2VyIG51bWJlcnMuIFBhcnNpbmcKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG51bWJlciBmb3JtYXQgb25seSBwYXJzZXMgaW50ZWdlciBudW1iZXJzLiBQYXJzaW5nCiAgICAgICogc3RvcHMgaWYgYSBkZWNpbWFsIHNlcGFyYXRvciBpcyBlbmNvdW50ZXJlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBOdW1iZXJGb3JtYXQgb25seSBwYXJzZXMgaW50ZWdlcnMsIGZhbHNlIGZvciBwYXJzaW5nCi0gICAgICogICAgICAgICBpbnRlZ2VycyBvciBmcmFjdGlvbnMKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG51bWJlciBmb3JtYXQgb25seSBwYXJzZXMgaW50ZWdlcnMsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIGlmIHBhcnNlc2UgaW50ZWdlcnMgYXMgd2VsbCBhcyBmcmFjdGlvbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNQYXJzZUludGVnZXJPbmx5KCkgewogICAgICAgICByZXR1cm4gcGFyc2VJbnRlZ2VyT25seTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZSBhIE51bWJlciBmcm9tIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHVzaW5nIHRoZSBydWxlcyBvZiB0aGlzCi0gICAgICogTnVtYmVyRm9ybWF0LgorICAgICAqIFBhcnNlcyBhIHtAY29kZSBOdW1iZXJ9IGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoaXMKKyAgICAgKiBudW1iZXIgZm9ybWF0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gcGFyc2UKLSAgICAgKiBAcmV0dXJuIHRoZSBOdW1iZXIgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBOdW1iZXJ9IHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzaW5nLgogICAgICAqIEBleGNlcHRpb24gUGFyc2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgcGFyc2luZworICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgcGFyc2luZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7CkBAIC00MzIsMzMgKzYwMSwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhcnNlIGEgTnVtYmVyIGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgc3RhcnRpbmcgYXQgdGhlIGluZGV4IHNwZWNpZmllZAotICAgICAqIGJ5IHRoZSBQYXJzZVBvc2l0aW9uLiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZSBpbmRleCBvZgotICAgICAqIHRoZSBQYXJzZVBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkIHRleHQuCisgICAgICogUGFyc2VzIGEge0Bjb2RlIE51bWJlcn0gZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydGluZyBhdCB0aGUgaW5kZXgKKyAgICAgKiBzcGVjaWZpZWQgYnkge0Bjb2RlIHBvc2l0aW9ufS4gSWYgdGhlIHN0cmluZyBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkIHRoZW4KKyAgICAgKiB0aGUgaW5kZXggb2YgdGhlIHtAY29kZSBQYXJzZVBvc2l0aW9ufSBpcyB1cGRhdGVkIHRvIHRoZSBpbmRleCBmb2xsb3dpbmcKKyAgICAgKiB0aGUgcGFyc2VkIHRleHQuIE9uIGVycm9yLCB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUgZXJyb3IgaW5kZXggb2YKKyAgICAgKiB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gaXMgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBwYXJzZQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KICAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBQYXJzZVBvc2l0aW9uLCB1cGRhdGVkIG9uIHJldHVybiB3aXRoIHRoZSBpbmRleCBmb2xsb3dpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgdGV4dCwgb3Igb24gZXJyb3IgdGhlIGluZGV4IGlzIHVuY2hhbmdlZCBhbmQgdGhlCi0gICAgICogICAgICAgICAgICBlcnJvciBpbmRleCBpcyBzZXQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZAotICAgICAqIEByZXR1cm4gdGhlIE51bWJlciByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIG51bGwgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAgKiAgICAgICAgICAgIGlucHV0L291dHB1dCBwYXJhbWV0ZXIsIHNwZWNpZmllcyB0aGUgc3RhcnQgaW5kZXggaW4KKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBzdHJpbmd9IGZyb20gd2hlcmUgdG8gc3RhcnQgcGFyc2luZy4gSWYgcGFyc2luZyBpcworICAgICAqICAgICAgICAgICAgc3VjY2Vzc2Z1bCwgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZAorICAgICAqICAgICAgICAgICAgdGV4dDsgb24gZXJyb3IsIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZSBlcnJvciBpbmRleCBpcworICAgICAqICAgICAgICAgICAgc2V0IHRvIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIE51bWJlcn0gcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNlIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IE51bWJlciBwYXJzZShTdHJpbmcgc3RyaW5nLCBQYXJzZVBvc2l0aW9uIHBvc2l0aW9uKTsKIAotICAgIC8qKgotICAgICAqIFBhcnNlIGEgTnVtYmVyIGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgc3RhcnRpbmcgYXQgdGhlIGluZGV4IHNwZWNpZmllZAotICAgICAqIGJ5IHRoZSBQYXJzZVBvc2l0aW9uLiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZSBpbmRleCBvZgotICAgICAqIHRoZSBQYXJzZVBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkIHRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBwYXJzZQotICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIFBhcnNlUG9zaXRpb24sIHVwZGF0ZWQgb24gcmV0dXJuIHdpdGggdGhlIGluZGV4IGZvbGxvd2luZwotICAgICAqICAgICAgICAgICAgdGhlIHBhcnNlZCB0ZXh0LCBvciBvbiBlcnJvciB0aGUgaW5kZXggaXMgdW5jaGFuZ2VkIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGluZGV4IGlzIHNldCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkCi0gICAgICogQHJldHVybiB0aGUgTnVtYmVyIHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgcGFyc2VPYmplY3QoU3RyaW5nIHN0cmluZywgUGFyc2VQb3NpdGlvbiBwb3NpdGlvbikgewogICAgICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgewpAQCAtNDc1LDI4ICs2MzcsMzAgQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGN1cnJlbmN5IHVzZWQgYnkgdGhpcyBudW1iZXIgZm9ybWF0IHdoZW4gZm9ybWF0dGluZyBjdXJyZW5jeQotICAgICAqIHZhbHVlcy4KKyAgICAgKiB2YWx1ZXMuIFRoZSBtaW4gYW5kIG1heCBmcmFjdGlvbiBkaWdpdHMgcmVtYWluIHRoZSBzYW1lLgogICAgICAqIDxwPgotICAgICAqIFRoZSBtaW4gYW5kIG1heCBmcmFjdGlvbiBkaWdpdHMgcmVtYWluIHRoZSBzYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCBjb25jcmV0ZSBzdWIKLSAgICAgKiBjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiB0aGV5IHN1cHBvcnQgY3VycmVuY3kgZm9ybWF0dGluZy4KLSAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHRocm93cyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LAorICAgICAqIGNvbmNyZXRlIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgc3VwcG9ydCBjdXJyZW5jeQorICAgICAqIGZvcm1hdHRpbmcuCisgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBjdXJyZW5jeQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBDdXJyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjdXJyZW5jeS4KICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbmN5KEN1cnJlbmN5IGN1cnJlbmN5KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGlzIE51bWJlckZvcm1hdCBmb3JtYXRzIGFuZCBwYXJzZXMgbnVtYmVycyB1c2luZyBhCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgbnVtYmVyIGZvcm1hdCBmb3JtYXRzIGFuZCBwYXJzZXMgbnVtYmVycyB1c2luZyBhCiAgICAgICogZ3JvdXBpbmcgc2VwYXJhdG9yLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdHJ1ZSB3aGVuIGEgZ3JvdXBpbmcgc2VwYXJhdG9yIGlzIHVzZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIGEgZ3JvdXBpbmcgc2VwYXJhdG9yIGlzIHVzZWQ7IHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRHcm91cGluZ1VzZWQoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBncm91cGluZ1VzZWQgPSB2YWx1ZTsKQEAgLTUwOCw3ICs2NzIsOCBAQAogICAgICAqIHRoZSBsZWFzdCBzaWduaWZpY2FudCBkaWdpdHMgYXJlIHRydW5jYXRlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKGludCB2YWx1ZSkgewogICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSB2YWx1ZSA8IDAgPyAwIDogdmFsdWU7CkBAIC01MTgsMTIgKzY4MywxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFVzZWQgdG8gc3BlY2lmeSB0aGUgbmV3IG1heGltdW0gY291bnQgb2YgaW50ZWdlciBkaWdpdHMgdGhhdCBhcmUgcHJpbnRlZAotICAgICAqIHdoZW4gZm9ybWF0dGluZy4gSWYgdGhlIG1heGltdW0gaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgaW50ZWdlcgotICAgICAqIGRpZ2l0cywgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSB0cnVuY2F0ZWQuCisgICAgICogU2V0cyB0aGUgbmV3IG1heGltdW0gY291bnQgb2YgaW50ZWdlciBkaWdpdHMgdGhhdCBhcmUgcHJpbnRlZCB3aGVuCisgICAgICogZm9ybWF0dGluZy4gSWYgdGhlIG1heGltdW0gaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMsIHRoZQorICAgICAqIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSB0cnVuY2F0ZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IG1heGltdW0gbnVtYmVyIG9mIGludGVnZXIgbnVtZXJhbHMgZm9yIGRpc3BsYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbWF4aW11bSBudW1iZXIgb2YgaW50ZWdlciBudW1lcmFscyBmb3IgZGlzcGxheS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtSW50ZWdlckRpZ2l0cyhpbnQgdmFsdWUpIHsKICAgICAgICAgbWF4aW11bUludGVnZXJEaWdpdHMgPSB2YWx1ZSA8IDAgPyAwIDogdmFsdWU7CkBAIC01MzcsNyArNzAzLDggQEAKICAgICAgKiBmb3JtYXR0aW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cworICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoaW50IHZhbHVlKSB7CiAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0cyA9IHZhbHVlIDwgMCA/IDAgOiB2YWx1ZTsKQEAgLTU1MSw3ICs3MTgsOCBAQAogICAgICAqIGZvcm1hdHRpbmcuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyhpbnQgdmFsdWUpIHsKICAgICAgICAgbWluaW11bUludGVnZXJEaWdpdHMgPSB2YWx1ZSA8IDAgPyAwIDogdmFsdWU7CkBAIC01NjEsMTQgKzcyOSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNwZWNpZmllcyBpZiB0aGlzIE51bWJlckZvcm1hdCBzaG91bGQgb25seSBwYXJzZSBudW1iZXJzIGFzIGludGVnZXJzIG9yCi0gICAgICogZWxzZSBhcyBhbnkga2luZCBvZiBudW1iZXIuIElmIHRoaXMgaXMgY2FsbGVkIHdpdGggYSA8Y29kZT50cnVlPC9jb2RlPgorICAgICAqIFNwZWNpZmllcyBpZiB0aGlzIG51bWJlciBmb3JtYXQgc2hvdWxkIHBhcnNlIG51bWJlcnMgb25seSBhcyBpbnRlZ2VycyBvcgorICAgICAqIGVsc2UgYXMgYW55IGtpbmQgb2YgbnVtYmVyLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIHtAY29kZSB0cnVlfQogICAgICAqIHZhbHVlIHRoZW4gc3Vic2VxdWVudCBwYXJzaW5nIGF0dGVtcHRzIHdpbGwgc3RvcCBpZiBhIGRlY2ltYWwgc2VwYXJhdG9yCiAgICAgICogaXMgZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBvbmx5IHBhcnNlIGludGVnZXJzLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgICAgIHRvIHBhcnNlIGludGVnZXJzIGFuZCBmcmFjdGlvbnMKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBvbmx5IHBhcnNlIGludGVnZXJzLCB7QGNvZGUgZmFsc2V9IHRvIHBhcnNlCisgICAgICogICAgICAgICAgICBpbnRlZ2VycyBhcyB3ZWxsIGFzIGZyYWN0aW9ucy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUludGVnZXJPbmx5KGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgcGFyc2VJbnRlZ2VyT25seSA9IHZhbHVlOwpAQCAtNjQ5LDEyICs4MTgsMTQgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBpbnN0YW5jZXMgb2YgdGhpcyBpbm5lciBjbGFzcyBhcmUgdXNlZCBhcyBhdHRyaWJ1dGUga2V5cyBhbmQgdmFsdWVzCi0gICAgICogaW4gQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRoYXQKLSAgICAgKiBOdW1iZXJGb3JtYXQuZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcigpIG1ldGhvZCByZXR1cm5zLgorICAgICAqIGluIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9IHRoYXQgdGhlCisgICAgICoge0BsaW5rIE51bWJlckZvcm1hdCNmb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9yKE9iamVjdCl9IG1ldGhvZCByZXR1cm5zLgogICAgICAqIDxwPgotICAgICAqIFRoZXJlIGlzIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciB0byB0aGlzIGNsYXNzLCB0aGUgb25seSBpbnN0YW5jZXMgYXJlIHRoZQorICAgICAqIFRoZXJlIGlzIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBpbiB0aGlzIGNsYXNzLCB0aGUgb25seSBpbnN0YW5jZXMgYXJlIHRoZQogICAgICAqIGNvbnN0YW50cyBkZWZpbmVkIGhlcmUuCiAgICAgICogPHA+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZCBleHRlbmRzIEZvcm1hdC5GaWVsZCB7CiAKQEAgLTY2Miw3NCArODMzLDEwMiBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIG51bWJlciBzaWduLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkIFNJR04gPSBuZXcgRmllbGQoInNpZ24iKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIGludGVnZXIgcGFydCBvZiB0aGUgbnVtYmVyLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkIElOVEVHRVIgPSBuZXcgRmllbGQoImludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIGZyYWN0aW9uIHBhcnQgb2YgdGhlIG51bWJlci4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWVsZCBGUkFDVElPTiA9IG5ldyBGaWVsZCgiZnJhY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIGV4cG9uZW50IHBhcnQgb2YgdGhlIG51bWJlci4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWVsZCBFWFBPTkVOVCA9IG5ldyBGaWVsZCgiZXhwb25lbnQiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIGV4cG9uZW50IHNpZ24gc3ltYm9sLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkIEVYUE9ORU5UX1NJR04gPSBuZXcgRmllbGQoImV4cG9uZW50IHNpZ24iKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIGV4cG9uZW50IHN5bWJvbC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWVsZCBFWFBPTkVOVF9TWU1CT0wgPSBuZXcgRmllbGQoImV4cG9uZW50IHN5bWJvbCIpOyAvLyROT04tTkxTLTEkCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoaXMgY29uc3RhbnQgc3RhbmRzIGZvciB0aGUgZGVjaW1hbCBzZXBhcmF0b3IuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmllbGQgREVDSU1BTF9TRVBBUkFUT1IgPSBuZXcgRmllbGQoCiAgICAgICAgICAgICAgICAgImRlY2ltYWwgc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhpcyBjb25zdGFudCBzdGFuZHMgZm9yIHRoZSBncm91cGluZyBzZXBhcmF0b3IuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmllbGQgR1JPVVBJTkdfU0VQQVJBVE9SID0gbmV3IEZpZWxkKAogICAgICAgICAgICAgICAgICJncm91cGluZyBzZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIHBlcmNlbnQgc3ltYm9sLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkIFBFUkNFTlQgPSBuZXcgRmllbGQoInBlcmNlbnQiKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGNvbnN0YW50IHN0YW5kcyBmb3IgdGhlIHBlcm1pbGxlIHN5bWJvbC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWVsZCBQRVJNSUxMRSA9IG5ldyBGaWVsZCgicGVyIG1pbGxlIik7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhpcyBjb25zdGFudCBzdGFuZHMgZm9yIHRoZSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmllbGQgQ1VSUkVOQ1kgPSBuZXcgRmllbGQoImN1cnJlbmN5Iik7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBOdW1iZXJGb3JtYXQuRmllbGQgd2l0aCB0aGUgZ2l2ZW4gZmllbGQKLSAgICAgICAgICogbmFtZS4KKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGNvZGUgTnVtYmVyRm9ybWF0LkZpZWxkfSB3aXRoIHRoZQorICAgICAgICAgKiBnaXZlbiBmaWVsZCBuYW1lLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgZmllbGQgbmFtZS4KKyAgICAgICAgICogQHBhcmFtIGZpZWxkTmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBuYW1lLgorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBGaWVsZChTdHJpbmcgZmllbGROYW1lKSB7CiAgICAgICAgICAgICBzdXBlcihmaWVsZE5hbWUpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIHNlcmlhbGl6YXRpb24gbWV0aG9kIHJlc29sdmUgaW5zdGFuY2VzIHRvIHRoZSBjb25zdGFudAotICAgICAgICAgKiBOdW1iZXJGb3JtYXQuRmllbGQgdmFsdWVzCisgICAgICAgICAqIFJlc29sdmVzIGluc3RhbmNlcyB0aGF0IGFyZSBkZXNlcmlhbGl6ZWQgdG8gdGhlIGNvbnN0YW50CisgICAgICAgICAqIHtAY29kZSBOdW1iZXJGb3JtYXQuRmllbGR9IHZhbHVlcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGZpZWxkIG9iamVjdC4KKyAgICAgICAgICogQHRocm93cyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZXNvbHZpbmcgdGhlIGZpZWxkIG9iamVjdC4KICAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIEludmFsaWRPYmplY3RFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9QYXJzZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGI4YjQyMjYuLjUyMTg0NjIgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvUGFyc2VFeGNlcHRpb24uamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTE4LDggKzE4LDkgQEAKIHBhY2thZ2UgamF2YS50ZXh0OwogCiAvKioKLSAqIEEgUGFyc2VFeGNlcHRpb24gaXMgdGhyb3duIHdoZW4gdGhlIFN0cmluZyBiZWluZyBwYXJzZWQgaXMgbm90IGluIHRoZSBjb3JyZWN0Ci0gKiBmb3JtLgorICogVGhyb3duIHdoZW4gdGhlIHN0cmluZyBiZWluZyBwYXJzZWQgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCkBAIC0yOCwxMyArMjksMTQgQEAKICAgICBwcml2YXRlIGludCBlcnJvck9mZnNldDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyB3YWxrYmFjaywgbWVzc2FnZSBhbmQKLSAgICAgKiB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yIGZpbGxlZCBpbi4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBpdHMgc3RhY2sgdHJhY2UsIGRldGFpbAorICAgICAqIG1lc3NhZ2UgYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgZmlsbGVkIGluLgogICAgICAqIAogICAgICAqIEBwYXJhbSBkZXRhaWxNZXNzYWdlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIGludCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIHBhcnNlIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGFyc2UgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsTWVzc2FnZSwgaW50IGxvY2F0aW9uKSB7CiAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOwpAQCAtNDIsOSArNDQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGFyc2UgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIHRoaXMgcGFyc2UgZXhjZXB0aW9uIG9jY3VycmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaW50IFRoZSBpbmRleCBvZiB0aGUgcGFyc2UgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMgZXhjZXB0aW9uIGluIHRoZSBwYXJzZWQgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RXJyb3JPZmZzZXQoKSB7CiAgICAgICAgIHJldHVybiBlcnJvck9mZnNldDsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvUGFyc2VQb3NpdGlvbi5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9QYXJzZVBvc2l0aW9uLmphdmEKaW5kZXggZTU5Yjg0MS4uYzNkMTAwMSAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9QYXJzZVBvc2l0aW9uLmphdmEKKysrIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9QYXJzZVBvc2l0aW9uLmphdmEKQEAgLTE4LDMzICsxOCwzOSBAQAogcGFja2FnZSBqYXZhLnRleHQ7CiAKIC8qKgotICogUGFyc2VQb3NpdGlvbiBpcyB1c2VkIHRvIHRyYWNrIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIGEgU3RyaW5nIGJlaW5nIHBhcnNlZC4KKyAqIFRyYWNrcyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBhIHBhcnNlZCBzdHJpbmcuIEluIGNhc2Ugb2YgYW4gZXJyb3IgdGhlIGVycm9yCisgKiBpbmRleCBjYW4gYmUgc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQgd2l0aG91dCBoYXZpbmcgdG8KKyAqIGNoYW5nZSB0aGUgcGFyc2UgcG9zaXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUGFyc2VQb3NpdGlvbiB7CiAKICAgICBwcml2YXRlIGludCBjdXJyZW50UG9zaXRpb24sIGVycm9ySW5kZXggPSAtMTsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUGFyc2VQb3NpdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFBhcnNlUG9zaXRpb259IHdpdGggdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0byBiZWdpbiBwYXJzaW5nCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggdG8gYmVnaW4gcGFyc2luZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUGFyc2VQb3NpdGlvbihpbnQgaW5kZXgpIHsKICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gaW5kZXg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBQYXJzZVBvc2l0aW9uIGFuZCBhbnN3ZXIgaWYgdGhleQotICAgICAqIGFyZSBlcXVhbC4gVGhlIG9iamVjdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFBhcnNlUG9zaXRpb24gYW5kIGhhdmUgdGhlCi0gICAgICogc2FtZSBpbmRleCBhbmQgZXJyb3IgaW5kZXguCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gYW5kIGluZGljYXRlcworICAgICAqIGlmIHRoZXkgYXJlIGVxdWFsLiBJbiBvcmRlciB0byBiZSBlcXVhbCwge0Bjb2RlIG9iamVjdH0gbXVzdCBiZSBhbgorICAgICAqIGluc3RhbmNlIG9mIHtAY29kZSBQYXJzZVBvc2l0aW9ufSBhbmQgaXQgbXVzdCBoYXZlIHRoZSBzYW1lIGluZGV4IGFuZAorICAgICAqIGVycm9yIGluZGV4LgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgUGFyc2VQb3NpdGlvbiwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIFBhcnNlUG9zaXRpb259OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC01OSw3ICs2NSw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIHBhcnNlIGNvdWxkIG5vdCBjb250aW51ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgcGFyc2UgZXJyb3IsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIGVycm9yCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHBhcnNlIGVycm9yIG9yIC0xIGlmIHRoZXJlIGlzIG5vIGVycm9yLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RXJyb3JJbmRleCgpIHsKICAgICAgICAgcmV0dXJuIGVycm9ySW5kZXg7CkBAIC02OCwyMCArNzUsMTMgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhcnNlIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CiAgICAgICAgIHJldHVybiBjdXJyZW50UG9zaXRpb247CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3NpdGlvbiArIGVycm9ySW5kZXg7CkBAIC05MSw3ICs5MSw4IEBACiAgICAgICogU2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIHBhcnNlIGNvdWxkIG5vdCBjb250aW51ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyc2UgZXJyb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGFyc2UgZXJyb3IuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RXJyb3JJbmRleChpbnQgaW5kZXgpIHsKICAgICAgICAgZXJyb3JJbmRleCA9IGluZGV4OwpAQCAtMTAxLDE2ICsxMDIsMTggQEAKICAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHBhcnNlIHBvc2l0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGFyc2UgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBhcnNlIHBvc2l0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgewogICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBpbmRleDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBGaWVsZFBvc2l0aW9uLgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBhcnNlIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEZpZWxkUG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwYXJzZSBwb3NpdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9SdWxlQmFzZWRCcmVha0l0ZXJhdG9yLmphdmEgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1J1bGVCYXNlZEJyZWFrSXRlcmF0b3IuamF2YQppbmRleCBhMDhmZDlmLi4yY2E2ZjliIDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1J1bGVCYXNlZEJyZWFrSXRlcmF0b3IuamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1J1bGVCYXNlZEJyZWFrSXRlcmF0b3IuamF2YQpAQCAtMTUsMTEgKzE1LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBpY3UgaW1wbGVtZW50YXRpb24gdXNlZCB3YXMgY2hhbmdlZCBmcm9tIGljdTRqIHRvIGljdTRqbmkuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS50ZXh0OwogCiAvKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBCcmVha0l0ZXJhdG9yLCB3cmFwCi0gKiBjb20uaWJtLmljdS50ZXh0LlJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IKKyAqIGNvbS5pYm0uaWN1NGpuaS50ZXh0LlJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IKICAqIAogICovCiBjbGFzcyBSdWxlQmFzZWRCcmVha0l0ZXJhdG9yIGV4dGVuZHMgQnJlYWtJdGVyYXRvciB7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1J1bGVCYXNlZENvbGxhdG9yLmphdmEgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1J1bGVCYXNlZENvbGxhdG9yLmphdmEKaW5kZXggYzNjZDUzMS4uNDFhNTFlMiAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9SdWxlQmFzZWRDb2xsYXRvci5qYXZhCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvUnVsZUJhc2VkQ29sbGF0b3IuamF2YQpAQCAtMTUsMzAgKzE1LDI4NSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFRoZSBjbGFzcyBqYXZhZG9jIGFuZCBzb21lIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRpb25zIGFyZSBjb3BpZWQgZnJvbSBJQ1U0SgorLy8gc291cmNlIGZpbGVzLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb3BpZWQgZGVzY3JpcHRpb25zLgorLy8gVGhlIGljdSBsaWNlbnNlIGhlYWRlciB3YXMgYWRkZWQgdG8gdGhpcyBmaWxlLiAKKy8vIFRoZSBpY3UgaW1wbGVtZW50YXRpb24gdXNlZCB3YXMgY2hhbmdlZCBmcm9tIGljdTRqIHRvIGljdTRqbmkuCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS50ZXh0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRleHQuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIDxjb2RlPlJ1bGVCYXNlZENvbGxhdG9yPC9jb2RlPiBpcyBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mCi0gKiA8Y29kZT5Db2xsYXRvcjwvY29kZT4uIEl0IGFsbG93cyBjdXN0b21pemF0aW9uIG9mIHRoZQotICogPGNvZGU+Q29sbGF0b3I8L2NvZGU+IHZpYSB1c2VyLXNwZWNpZmllZCBydWxlIHNldHMuCi0gKiA8Y29kZT5SdWxlQmFzZWRDb2xsYXRvcjwvY29kZT4gaXMgZGVzaWduZWQgdG8gYmUgZnVsbHkgY29tcGxpYW50IHRvIHRoZSA8YQotICogaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIxMC8iPiBVbmljb2RlIENvbGxhdGlvbgotICogQWxnb3JpdGhtIChVQ0EpIDwvYT4gYW5kIGNvbmZvcm1zIHRvIElTTyAxNDY1MS4KKyAqIEEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHtAY29kZSBDb2xsYXRpb259LgorICogPHA+CisgKiB7QGNvZGUgUnVsZUJhc2VkQ29sbGF0b3J9IGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBmb3IgZWZmaWNpZW5jeQorICogKG90aGVyIHN1YmNsYXNzZXMgbWF5IGJlIHVzZWQgZm9yIG1vcmUgY29tcGxleCBsYW5ndWFnZXMpOgorICogPC9wPgorICogPG9sPgorICogPGxpPiBJZiBhIEZyZW5jaCBzZWNvbmRhcnkgb3JkZXJpbmcgaXMgc3BlY2lmaWVkIGl0IGFwcGxpZXMgdG8gdGhlIHdob2xlCisgKiBjb2xsYXRvciBvYmplY3QuPC9saT4KKyAqIDxsaT4gQWxsIG5vbi1tZW50aW9uZWQgVW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb2xsYXRpb24KKyAqIG9yZGVyLjwvbGk+CisgKiA8bGk+IElmIGEgY2hhcmFjdGVyIGlzIG5vdCBsb2NhdGVkIGluIHRoZSB7QGNvZGUgUnVsZUJhc2VkQ29sbGF0b3J9LCB0aGUKKyAqIGRlZmF1bHQgVW5pY29kZSBDb2xsYXRpb24gQWxnb3JpdGhtIChVQ0EpIHJ1bGViYXNlZCB0YWJsZSBpcyBhdXRvbWF0aWNhbGx5CisgKiBzZWFyY2hlZCBhcyBhIGJhY2t1cC48L2xpPgorICogPC9vbD4KKyAqIDxwPgorICogVGhlIGNvbGxhdGlvbiB0YWJsZSBpcyBjb21wb3NlZCBvZiBhIGxpc3Qgb2YgY29sbGF0aW9uIHJ1bGVzLCB3aGVyZSBlYWNoIHJ1bGUKKyAqIGlzIG9mIHRocmVlIGZvcm1zOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiA8bW9kaWZpZXI+CisgKiA8cmVsYXRpb24+IDx0ZXh0LWFyZ3VtZW50PgorICogPHJlc2V0PiA8dGV4dC1hcmd1bWVudD4KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIFRoZSBydWxlIGVsZW1lbnRzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKiA8L3A+CisgKiA8dWwgdHlwZT0iZGlzYyI+CisgKiA8bGk+PHN0cm9uZz5UZXh0LUFyZ3VtZW50PC9zdHJvbmc+OiBBIHRleHQtYXJndW1lbnQgaXMgYW55IHNlcXVlbmNlIG9mCisgKiBjaGFyYWN0ZXJzLCBleGNsdWRpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzICh0aGF0IGlzLCBjb21tb24gd2hpdGVzcGFjZQorICogY2hhcmFjdGVycyBbMDAwOS0wMDBELCAwMDIwXSBhbmQgcnVsZSBzeW50YXggY2hhcmFjdGVycyBbMDAyMS0wMDJGLAorICogMDAzQS0wMDQwLCAwMDVCLTAwNjAsIDAwN0ItMDA3RV0pLiBJZiB0aG9zZSBjaGFyYWN0ZXJzIGFyZSBkZXNpcmVkLCB5b3UgY2FuCisgKiBwdXQgdGhlbSBpbiBzaW5nbGUgcXVvdGVzIChmb3IgZXhhbXBsZSwgdXNlICcmJyBmb3IgYW1wZXJzYW5kKS4gTm90ZSB0aGF0CisgKiB1bnF1b3RlZCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkOyBmb3IgZXhhbXBsZSwge0Bjb2RlIGIgY30gaXMKKyAqIHRyZWF0ZWQgYXMge0Bjb2RlIGJjfS48L2xpPgorICogPGxpPjxzdHJvbmc+TW9kaWZpZXI8L3N0cm9uZz46IFRoZXJlIGlzIGEgc2luZ2xlIG1vZGlmaWVyIHdoaWNoIGlzIHVzZWQgdG8KKyAqIHNwZWNpZnkgdGhhdCBhbGwgYWNjZW50cyAoc2Vjb25kYXJ5IGRpZmZlcmVuY2VzKSBhcmUgYmFja3dhcmRzLgorICogPHA+CisgKiAnQCcgOiBJbmRpY2F0ZXMgdGhhdCBhY2NlbnRzIGFyZSBzb3J0ZWQgYmFja3dhcmRzLCBhcyBpbiBGcmVuY2guCisgKiA8L3A+CisgKiA8L2xpPgorICogPGxpPjxzdHJvbmc+UmVsYXRpb248L3N0cm9uZz46IFRoZSByZWxhdGlvbnMgYXJlIHRoZSBmb2xsb3dpbmc6CisgKiA8dWwgdHlwZT1zcXVhcmU+CisgKiA8bGk+JzwnIDogR3JlYXRlciwgYXMgYSBsZXR0ZXIgZGlmZmVyZW5jZSAocHJpbWFyeSkKKyAqIDxsaT4nOycgOiBHcmVhdGVyLCBhcyBhbiBhY2NlbnQgZGlmZmVyZW5jZSAoc2Vjb25kYXJ5KQorICogPGxpPicsJyA6IEdyZWF0ZXIsIGFzIGEgY2FzZSBkaWZmZXJlbmNlICh0ZXJ0aWFyeSkKKyAqIDxsaT4nPScgOiBFcXVhbAorICogPC91bD4KKyAqIDwvbGk+CisgKiA8bGk+PHN0cm9uZz5SZXNldDwvc3Ryb25nPjogVGhlcmUgaXMgYSBzaW5nbGUgcmVzZXQgd2hpY2ggaXMgdXNlZCBwcmltYXJpbHkKKyAqIGZvciBjb250cmFjdGlvbnMgYW5kIGV4cGFuc2lvbnMsIGJ1dCB3aGljaCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFkZCBhCisgKiBtb2RpZmljYXRpb24gYXQgdGhlIGVuZCBvZiBhIHNldCBvZiBydWxlcy4KKyAqIDxwPgorICogJyYnIDogSW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgcnVsZSBmb2xsb3dzIHRoZSBwb3NpdGlvbiB0byB3aGVyZSB0aGUgcmVzZXQKKyAqIHRleHQtYXJndW1lbnQgd291bGQgYmUgc29ydGVkLgorICogPC9wPgorICogPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoaXMgc291bmRzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCBpcyBpbiBwcmFjdGljZS4gRm9yIGV4YW1wbGUsIHRoZQorICogZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50IHdheXMgb2YgZXhwcmVzc2luZyB0aGUgc2FtZSB0aGluZzoKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogYSA8IGIgPCBjCisgKiBhIDwgYiAmIGIgPCBjCisgKiBhIDwgYyAmIGEgPCBiCisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBOb3RpY2UgdGhhdCB0aGUgb3JkZXIgaXMgaW1wb3J0YW50LCBhcyB0aGUgc3Vic2VxdWVudCBpdGVtIGdvZXMgaW1tZWRpYXRlbHkKKyAqIGFmdGVyIHRoZSB0ZXh0LWFyZ3VtZW50LiBUaGUgZm9sbG93aW5nIGFyZSBub3QgZXF1aXZhbGVudDoKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogYSA8IGIgJiBhIDwgYworICogYSA8IGMgJiBhIDwgYgorICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogRWl0aGVyIHRoZSB0ZXh0LWFyZ3VtZW50IG11c3QgYWxyZWFkeSBiZSBwcmVzZW50IGluIHRoZSBzZXF1ZW5jZSwgb3Igc29tZQorICogaW5pdGlhbCBzdWJzdHJpbmcgb2YgdGhlIHRleHQtYXJndW1lbnQgbXVzdCBiZSBwcmVzZW50LiBGb3IgZXhhbXBsZQorICoge0Bjb2RlICJhIDwgYiAmIGFlIDwgZSJ9IGlzIHZhbGlkIHNpbmNlICJhIiBpcyBwcmVzZW50IGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUKKyAqICJhZSIgaXMgcmVzZXQuIEluIHRoaXMgbGF0dGVyIGNhc2UsICJhZSIgaXMgbm90IGVudGVyZWQgYW5kIHRyZWF0ZWQgYXMgYQorICogc2luZ2xlIGNoYXJhY3RlcjsgaW5zdGVhZCwgImUiIGlzIHNvcnRlZCBhcyBpZiBpdCB3ZXJlIGV4cGFuZGVkIHRvIHR3bworICogY2hhcmFjdGVyczogImEiIGZvbGxvd2VkIGJ5IGFuICJlIi4gVGhpcyBkaWZmZXJlbmNlIGFwcGVhcnMgaW4gbmF0dXJhbAorICogbGFuZ3VhZ2VzOiBpbiB0cmFkaXRpb25hbCBTcGFuaXNoICJjaCIgaXMgdHJlYXRlZCBhcyBpZiBpdCBjb250cmFjdHMgdG8gYQorICogc2luZ2xlIGNoYXJhY3RlciAoZXhwcmVzc2VkIGFzIHtAY29kZSAiYyA8IGNoIDwgZCJ9KSwgd2hpbGUgaW4gdHJhZGl0aW9uYWwKKyAqIEdlcm1hbiBhLXVtbGF1dCBpcyB0cmVhdGVkIGFzIGlmIGl0IGV4cGFuZHMgdG8gdHdvIGNoYXJhY3RlcnMgKGV4cHJlc3NlZCBhcworICoge0Bjb2RlICJhLEEgPCBiLEIgIC4uLiAmIGFlO1x1MDBlMyAmIEFFO1x1MDBjMyJ9LCB3aGVyZSBcdTAwZTMgYW5kIFx1MDBjMworICogYXJlIHRoZSBlc2NhcGUgc2VxdWVuY2VzIGZvciBhLXVtbGF1dCkuCisgKiA8L3A+CisgKiA8aDQ+SWdub3JhYmxlIENoYXJhY3RlcnM8L2g0PgorICogPHA+CisgKiBGb3IgaWdub3JhYmxlIGNoYXJhY3RlcnMsIHRoZSBmaXJzdCBydWxlIG11c3Qgc3RhcnQgd2l0aCBhIHJlbGF0aW9uICh0aGUKKyAqIGV4YW1wbGVzIHdlIGhhdmUgdXNlZCBhYm92ZSBhcmUgcmVhbGx5IGZyYWdtZW50czsge0Bjb2RlICJhIDwgYiJ9IHJlYWxseQorICogc2hvdWxkIGJlIHtAY29kZSAiPCBhIDwgYiJ9KS4gSWYsIGhvd2V2ZXIsIHRoZSBmaXJzdCByZWxhdGlvbiBpcyBub3QKKyAqIHtAY29kZSAiPCJ9LCB0aGVuIGFsbCB0ZXh0LWFyZ3VtZW50cyB1cCB0byB0aGUgZmlyc3Qge0Bjb2RlICI8In0gYXJlCisgKiBpZ25vcmFibGUuIEZvciBleGFtcGxlLCB7QGNvZGUgIiwgLSA8IGEgPCBiIn0gbWFrZXMge0Bjb2RlICItIn0gYW4gaWdub3JhYmxlCisgKiBjaGFyYWN0ZXIuCisgKiA8L3A+CisgKiA8aDQ+Tm9ybWFsaXphdGlvbiBhbmQgQWNjZW50czwvaDQ+CisgKiA8cD4KKyAqIHtAY29kZSBSdWxlQmFzZWRDb2xsYXRvcn0gYXV0b21hdGljYWxseSBwcm9jZXNzZXMgaXRzIHJ1bGUgdGFibGUgdG8gaW5jbHVkZQorICogYm90aCBwcmUtY29tcG9zZWQgYW5kIGNvbWJpbmluZy1jaGFyYWN0ZXIgdmVyc2lvbnMgb2YgYWNjZW50ZWQgY2hhcmFjdGVycy4KKyAqIEV2ZW4gaWYgdGhlIHByb3ZpZGVkIHJ1bGUgc3RyaW5nIGNvbnRhaW5zIG9ubHkgYmFzZSBjaGFyYWN0ZXJzIGFuZCBzZXBhcmF0ZQorICogY29tYmluaW5nIGFjY2VudCBjaGFyYWN0ZXJzLCB0aGUgcHJlLWNvbXBvc2VkIGFjY2VudGVkIGNoYXJhY3RlcnMgbWF0Y2hpbmcKKyAqIGFsbCBjYW5vbmljYWwgY29tYmluYXRpb25zIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcnVsZSBzdHJpbmcgd2lsbCBiZSBlbnRlcmVkCisgKiBpbiB0aGUgdGFibGUuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIENyZWF0ZSBhIDxjb2RlPlJ1bGVCYXNlZENvbGxhdG9yPC9jb2RlPiBmcm9tIGEgbG9jYWxlIGJ5IGNhbGxpbmcgdGhlCi0gKiA8Y29kZT5nZXRJbnN0YW5jZShMb2NhbGUpPC9jb2RlPiBmYWN0b3J5IG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcwotICogPGNvZGU+Q29sbGF0b3I8L2NvZGU+Ljxjb2RlPkNvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZSk8L2NvZGU+IGNyZWF0ZXMKLSAqIGEgPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+IG9iamVjdCBiYXNlZCBvbiB0aGUgY29sbGF0aW9uIHJ1bGVzCi0gKiBkZWZpbmVkIGJ5IHRoZSBhcmd1bWVudCBsb2NhbGUuIElmIGEgY3VzdG9taXplZCBjb2xsYXRpb24gaXMgcmVxdWlyZWQsIHVzZQotICogdGhlIDxjb2RlPlJ1bGVCYXNlZENvbGxhdG9yKFN0cmluZyk8L2NvZGU+IGNvbnN0cnVjdG9yIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0gKiBydWxlcy4gVGhlIGN1c3RvbWl6ZWQgPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+IHdpbGwgYmFzZSBpdHMgb3JkZXJpbmcKLSAqIG9uIFVDQSwgd2hpbGUgcmUtYWRqdXN0aW5nIHRoZSBhdHRyaWJ1dGVzIGFuZCBvcmRlcnMgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlCi0gKiBzcGVjaWZpZWQgcnVsZSBhY2NvcmRpbmdseS4KKyAqIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgYSBSdWxlQmFzZWRDb2xsYXRvciB0byBjb21wYXJlIGFjY2VudGVkIHN0cmluZ3MgZXZlbgorICogd2hlbiB0aGUgY29sbGF0b3IgaXMgc2V0IHRvIE5PX0RFQ09NUE9TSVRJT04uIEhvd2V2ZXIsIGlmIHRoZSBzdHJpbmdzIHRvIGJlCisgKiBjb2xsYXRlZCBjb250YWluIGNvbWJpbmluZyBzZXF1ZW5jZXMgdGhhdCBtYXkgbm90IGJlIGluIGNhbm9uaWNhbCBvcmRlciwgeW91CisgKiBzaG91bGQgc2V0IHRoZSBjb2xsYXRvciB0byBDQU5PTklDQUxfREVDT01QT1NJVElPTiB0byBlbmFibGUgc29ydGluZyBvZgorICogY29tYmluaW5nIHNlcXVlbmNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YQorICogaHJlZj0iaHR0cDovL3d3dy5hdy5jb20vZGV2cHJlc3MiPlRoZSBVbmljb2RlIFN0YW5kYXJkLCBWZXJzaW9uIDMuMDwvYT4uCiAgKiA8L3A+CisgKiA8aDQ+RXJyb3JzPC9oND4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBydWxlcyBhcmUgbm90IHZhbGlkOgorICogPC9wPgorICogPHVsIHR5cGU9ImRpc2MiPgorICogPGxpPkEgdGV4dC1hcmd1bWVudCBjb250YWlucyB1bnF1b3RlZCBwdW5jdHVhdGlvbiBzeW1ib2xzLCBmb3IgZXhhbXBsZQorICoge0Bjb2RlICJhIDwgYi1jIDwgZCJ9LjwvbGk+CisgKiA8bGk+QSByZWxhdGlvbiBvciByZXNldCBjaGFyYWN0ZXIgaXMgbm90IGZvbGxvd2VkIGJ5IGEgdGV4dC1hcmd1bWVudCwgZm9yCisgKiBleGFtcGxlIHtAY29kZSAiYSA8ICwgYiJ9LjwvbGk+CisgKiA8bGk+QSByZXNldCB3aGVyZSB0aGUgdGV4dC1hcmd1bWVudCAob3IgYW4gaW5pdGlhbCBzdWJzdHJpbmcgb2YgdGhlCisgKiB0ZXh0LWFyZ3VtZW50KSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgc2VxdWVuY2Ugb3IgYWxsb2NhdGVkIGluIHRoZSBkZWZhdWx0IFVDQQorICogdGFibGUsIGZvciBleGFtcGxlIHtAY29kZSAiYSA8IGIgJiBlIDwgZiJ9LjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBJZiB5b3UgcHJvZHVjZSBvbmUgb2YgdGhlc2UgZXJyb3JzLCB7QGNvZGUgUnVsZUJhc2VkQ29sbGF0b3J9IHRocm93cyBhCisgKiB7QGNvZGUgUGFyc2VFeGNlcHRpb259LgorICogPC9wPgorICogPGg0PkV4YW1wbGVzPC9oND4KKyAqIDxwPgorICogTm9ybWFsbHksIHRvIGNyZWF0ZSBhIHJ1bGUtYmFzZWQgY29sbGF0b3Igb2JqZWN0LCB5b3Ugd2lsbCB1c2UKKyAqIHtAY29kZSBDb2xsYXRvcn0ncyBmYWN0b3J5IG1ldGhvZCB7QGNvZGUgZ2V0SW5zdGFuY2V9LiBIb3dldmVyLCB0byBjcmVhdGUgYQorICogcnVsZS1iYXNlZCBjb2xsYXRvciBvYmplY3Qgd2l0aCBzcGVjaWFsaXplZCBydWxlcyB0YWlsb3JlZCB0byB5b3VyIG5lZWRzLCB5b3UKKyAqIGNvbnN0cnVjdCB0aGUge0Bjb2RlIFJ1bGVCYXNlZENvbGxhdG9yfSB3aXRoIHRoZSBydWxlcyBjb250YWluZWQgaW4gYQorICoge0Bjb2RlIFN0cmluZ30gb2JqZWN0LiBGb3IgZXhhbXBsZToKKyAqIDwvcD4KKyAqIDxibG9ja3F1b3RlPgogICogCisgKiA8cHJlPgorICogU3RyaW5nIFNpbXBsZSA9ICI8IGEgPCBiIDwgYyA8IGQiOworICogCisgKiBSdWxlQmFzZWRDb2xsYXRvciBteVNpbXBsZSA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihTaW1wbGUpOworICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogT3I6CisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIFN0cmluZyBOb3J3ZWdpYW4gPSAiPCBhLEE8IGIsQjwgYyxDPCBkLEQ8IGUsRTwgZixGPCBnLEc8IGgsSDwgaSxJIgorICogICAgICAgICArICI8IGosSjwgayxLPCBsLEw8IG0sTTwgbixOPCBvLE88IHAsUDwgcSxRPCByLFIiIAorICogICAgICAgICArICI8IHMsUzwgdCxUPCB1LFU8IHYsVjwgdyxXPCB4LFg8IHksWTwgeixaIgorICogICAgICAgICArICI8IFx1MDBFNT1hXHUwMzBBLFx1MDBDNT1BXHUwMzBBIiAKKyAqICAgICAgICAgKyAiO2FhLEFBPCBcdTAwRTYsXHUwMEM2PCBcdTAwRjgsXHUwMEQ4IjsKKyAqIAorICogUnVsZUJhc2VkQ29sbGF0b3IgbXlOb3J3ZWdpYW4gPSBuZXcgUnVsZUJhc2VkQ29sbGF0b3IoTm9yd2VnaWFuKTsKKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIENvbWJpbmluZyB7QGNvZGUgQ29sbGF0b3J9cyBpcyBhcyBzaW1wbGUgYXMgY29uY2F0ZW5hdGluZyBzdHJpbmdzLiBIZXJlIGlzCisgKiBhbiBleGFtcGxlIHRoYXQgY29tYmluZXMgdHdvIHtAY29kZSBDb2xsYXRvcn1zIGZyb20gdHdvIGRpZmZlcmVudCBsb2NhbGVzOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiAvLyBDcmVhdGUgYW4gZW5fVVMgQ29sbGF0b3Igb2JqZWN0CisgKiBSdWxlQmFzZWRDb2xsYXRvciBlbl9VU0NvbGxhdG9yID0gKFJ1bGVCYXNlZENvbGxhdG9yKUNvbGxhdG9yCisgKiAgICAgICAgIC5nZXRJbnN0YW5jZShuZXcgTG9jYWxlKCJlbiIsICJVUyIsICIiKSk7CisgKiAKKyAqIC8vIENyZWF0ZSBhIGRhX0RLIENvbGxhdG9yIG9iamVjdAorICogUnVsZUJhc2VkQ29sbGF0b3IgZGFfREtDb2xsYXRvciA9IChSdWxlQmFzZWRDb2xsYXRvcilDb2xsYXRvcgorICogICAgICAgICAuZ2V0SW5zdGFuY2UobmV3IExvY2FsZSgiZGEiLCAiREsiLCAiIikpOworICogCisgKiAvLyBDb21iaW5lIHRoZSB0d28gY29sbGF0b3JzCisgKiAvLyBGaXJzdCwgZ2V0IHRoZSBjb2xsYXRpb24gcnVsZXMgZnJvbSBlbl9VU0NvbGxhdG9yCisgKiBTdHJpbmcgZW5fVVNSdWxlcyA9IGVuX1VTQ29sbGF0b3IuZ2V0UnVsZXMoKTsKKyAqIAorICogLy8gU2Vjb25kLCBnZXQgdGhlIGNvbGxhdGlvbiBydWxlcyBmcm9tIGRhX0RLQ29sbGF0b3IKKyAqIFN0cmluZyBkYV9ES1J1bGVzID0gZGFfREtDb2xsYXRvci5nZXRSdWxlcygpOworICogCisgKiBSdWxlQmFzZWRDb2xsYXRvciBuZXdDb2xsYXRvciA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihlbl9VU1J1bGVzICsgZGFfREtSdWxlcyk7CisgKiAvLyBuZXdDb2xsYXRvciBoYXMgdGhlIGNvbWJpbmVkIHJ1bGVzCisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBUaGUgbmV4dCBleGFtcGxlIHNob3dzIHRvIG1ha2UgY2hhbmdlcyBvbiBhbiBleGlzdGluZyB0YWJsZSB0byBjcmVhdGUgYSBuZXcKKyAqIHtAY29kZSBDb2xsYXRvcn0gb2JqZWN0LiBGb3IgZXhhbXBsZSwgYWRkIHtAY29kZSAiJiBDIDwgY2gsIGNILCBDaCwgQ0gifSB0bworICogdGhlIHtAY29kZSBlbl9VU0NvbGxhdG9yfSBvYmplY3QgdG8gY3JlYXRlIHlvdXIgb3duOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiAvLyBDcmVhdGUgYSBuZXcgQ29sbGF0b3Igb2JqZWN0IHdpdGggYWRkaXRpb25hbCBydWxlcworICogU3RyaW5nIGFkZFJ1bGVzID0gIiYgQyA8IGNoLCBjSCwgQ2gsIENIIjsKKyAqIAorICogUnVsZUJhc2VkQ29sbGF0b3IgbXlDb2xsYXRvciA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihlbl9VU0NvbGxhdG9yICsgYWRkUnVsZXMpOworICogLy8gbXlDb2xsYXRvciBjb250YWlucyB0aGUgbmV3IHJ1bGVzCisgKiA8L3ByZT4KKyAqIAorICogPC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjaGFuZ2UgdGhlIG9yZGVyIG9mIG5vbi1zcGFjaW5nCisgKiBhY2NlbnRzOgorICogPC9wPgorICogPGJsb2NrcXVvdGU+CisgKiAKKyAqIDxwcmU+CisgKiAvLyBvbGQgcnVsZQorICogU3RyaW5nIG9sZFJ1bGVzID0gIj0gXHUwMGE4IDsgXHUwMGFmIDsgXHUwMGJmIiArICI8IGEgLCBBIDsgYWUsIEFFIDsgXHUwMGU2ICwgXHUwMGM2IgorICogICAgICAgICArICI8IGIgLCBCIDwgYywgQyA8IGUsIEUgJiBDIDwgZCwgRCI7CisgKiAKKyAqIC8vIGNoYW5nZSB0aGUgb3JkZXIgb2YgYWNjZW50IGNoYXJhY3RlcnMKKyAqIFN0cmluZyBhZGRPbiA9ICImIFx1MDBiZiA7IFx1MDBhZiA7IFx1MDBhODsiOworICogCisgKiBSdWxlQmFzZWRDb2xsYXRvciBteUNvbGxhdG9yID0gbmV3IFJ1bGVCYXNlZENvbGxhdG9yKG9sZFJ1bGVzICsgYWRkT24pOworICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogVGhlIGxhc3QgZXhhbXBsZSBzaG93cyBob3cgdG8gcHV0IG5ldyBwcmltYXJ5IG9yZGVyaW5nIGluIGJlZm9yZSB0aGUgZGVmYXVsdAorICogc2V0dGluZy4gRm9yIGV4YW1wbGUsIGluIHRoZSBKYXBhbmVzZSB7QGNvZGUgQ29sbGF0b3J9LCB5b3UgY2FuIGVpdGhlciBzb3J0CisgKiBFbmdsaXNoIGNoYXJhY3RlcnMgYmVmb3JlIG9yIGFmdGVyIEphcGFuZXNlIGNoYXJhY3RlcnM6CisgKiA8L3A+CisgKiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIC8vIGdldCBlbl9VUyBDb2xsYXRvciBydWxlcworICogUnVsZUJhc2VkQ29sbGF0b3IgZW5fVVNDb2xsYXRvciA9IChSdWxlQmFzZWRDb2xsYXRvcikKKyAqICAgICBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOworICogCisgKiAvLyBhZGQgYSBmZXcgSmFwYW5lc2UgY2hhcmFjdGVyIHRvIHNvcnQgYmVmb3JlIEVuZ2xpc2ggY2hhcmFjdGVycworICogLy8gc3VwcG9zZSB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBmaXJzdCBiYXNlIGxldHRlciAnYScgaW4KKyAqIC8vIHRoZSBFbmdsaXNoIGNvbGxhdGlvbiBydWxlIGlzIFx1MzBBMgorICogU3RyaW5nIGphU3RyaW5nID0gIiYgXHUzMEEyICwgXHUzMEZDIDwgXHUzMEM4IjsKKyAqIAorICogUnVsZUJhc2VkQ29sbGF0b3IgbXlKYXBhbmVzZUNvbGxhdG9yID0gCisgKiAgICAgbmV3IFJ1bGVCYXNlZENvbGxhdG9yKGVuX1VTQ29sbGF0b3IuZ2V0UnVsZXMoKSArIGphU3RyaW5nKTsKKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUnVsZUJhc2VkQ29sbGF0b3IgZXh0ZW5kcyBDb2xsYXRvciB7CiAKQEAgLTQ3LDI1ICszMDIsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPlJ1bGVCYXNlZENvbGxhdG9yPC9jb2RlPiB1c2luZyB0aGUKLSAgICAgKiBzcGVjaWZpZWQgPGNvZGU+cnVsZXM8L2NvZGU+LgotICAgICAqIAorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIFJ1bGVCYXNlZENvbGxhdG9yfSB1c2luZyB0aGUKKyAgICAgKiBzcGVjaWZpZWQge0Bjb2RlIHJ1bGVzfS4gVGhlIHtAY29kZSBydWxlc30gYXJlIHVzdWFsbHkgZWl0aGVyCisgICAgICogaGFuZC13cml0dGVuIGJhc2VkIG9uIHRoZSB7QGxpbmsgUnVsZUJhc2VkQ29sbGF0b3IgY2xhc3MgZGVzY3JpcHRpb259IG9yCisgICAgICogdGhlIHJlc3VsdCBvZiBhIGZvcm1lciB7QGxpbmsgI2dldFJ1bGVzKCl9IGNhbGwuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoZSB7QGNvZGUgcnVsZXN9IGFyZSBhY3R1YWxseSBpbnRlcnByZXRlZCBhcyBhIGRlbHRhIHRvIHRoZQorICAgICAqIHN0YW5kYXJkIFVuaWNvZGUgQ29sbGF0aW9uIEFsZ29yaXRobSAoVUNBKS4gSGVuY2UsIGFuIGVtcHR5IHtAY29kZSBydWxlc30KKyAgICAgKiBzdHJpbmcgcmVzdWx0cyBpbiB0aGUgZGVmYXVsdCBVQ0EgcnVsZXMgYmVpbmcgYXBwbGllZC4gVGhpcyBkaWZmZXJzCisgICAgICogc2xpZ2h0bHkgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggd29yayB3aXRoIGZ1bGwge0Bjb2RlIHJ1bGVzfQorICAgICAqIHNwZWNpZmljYXRpb25zIGFuZCBtYXkgcmVzdWx0IGluIGRpZmZlcmVudCBiZWhhdmlvci4KKyAgICAgKgogICAgICAqIEBwYXJhbSBydWxlcwogICAgICAqICAgICAgICAgICAgdGhlIGNvbGxhdGlvbiBydWxlcy4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHJ1bGVzfSBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHJ1bGVzIGNvbnRhaW5zIGFuIGludmFsaWQgY29sbGF0aW9uIHJ1bGUgc3ludGF4LgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBydWxlc30gY29udGFpbnMgcnVsZXMgd2l0aCBpbnZhbGlkIGNvbGxhdGlvbiBydWxlCisgICAgICogICAgICAgICAgICAgc3ludGF4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBSdWxlQmFzZWRDb2xsYXRvcihTdHJpbmcgcnVsZXMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChydWxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBpZiAocnVsZXMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gdGV4dC4wNj1CdWlsZCBydWxlcyBlbXB0eQotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygidGV4dC4wNiIpLCAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAorICAgICAgICAvLyBpZiAocnVsZXMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAvLyAgICAgLy8gdGV4dC4wNj1CdWlsZCBydWxlcyBlbXB0eQorICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygidGV4dC4wNiIpLCAwKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAvLyB9CisgICAgICAgIC8vIEVORCBhbmRyaW9kLXJlbW92ZWQKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgdGhpcy5pY3VDb2xsID0gbmV3IGNvbS5pYm0uaWN1NGpuaS50ZXh0LlJ1bGVCYXNlZENvbGxhdG9yKHJ1bGVzKTsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgICAgIHRoaXMuaWN1Q29sbC5zZXREZWNvbXBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRvci5DQU5PTklDQUxfREVDT01QT1NJVElPTik7CisgICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbikgZTsKQEAgLTc5LDEzICszNTIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPYnRhaW5zIGEgPGNvZGU+Q29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yPC9jb2RlPiBmb3IgdGhlIGdpdmVuCi0gICAgICogPGNvZGU+Q2hhcmFjdGVySXRlcmF0b3I8L2NvZGU+LiBUaGUgc291cmNlIGl0ZXJhdG9yJ3MgaW50ZWdyaXR5IHdpbGwKLSAgICAgKiBiZSBwcmVzZXJ2ZWQgc2luY2UgYSBuZXcgY29weSB3aWxsIGJlIGNyZWF0ZWQgZm9yIHVzZS4KKyAgICAgKiBPYnRhaW5zIGEge0Bjb2RlIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcn0gZm9yIHRoZSBnaXZlbgorICAgICAqIHtAY29kZSBDaGFyYWN0ZXJJdGVyYXRvcn0uIFRoZSBzb3VyY2UgaXRlcmF0b3IncyBpbnRlZ3JpdHkgd2lsbCBiZQorICAgICAqIHByZXNlcnZlZCBzaW5jZSBhIG5ldyBjb3B5IHdpbGwgYmUgY3JlYXRlZCBmb3IgdXNlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgc291cmNlCi0gICAgICogQHJldHVybiBhIDxjb2RlPkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjwvY29kZT4gZm9yIHRoZSBzb3VyY2UuCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGNoYXJhY3RlciBpdGVyYXRvci4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcn0gZm9yIHtAY29kZSBzb3VyY2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgZ2V0Q29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKAogICAgICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3Igc291cmNlKSB7CkBAIC05OCwxMSArMzcyLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT2J0YWlucyBhIDxjb2RlPkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBTdHJpbmcuCisgICAgICogT2J0YWlucyBhIHtAY29kZSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3J9IGZvciB0aGUgZ2l2ZW4gc3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgc291cmNlCi0gICAgICogQHJldHVybiBhIDxjb2RlPkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3J9IGZvciB7QGNvZGUgc291cmNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGdldENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcihTdHJpbmcgc291cmNlKSB7CiAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewpAQCAtMTE0LDE4ICszODksMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPYnRhaW5zIHRoZSBjb2xsYXRpb24gcnVsZXMgb2YgdGhlIDxjb2RlPlJ1bGVCYXNlZENvbGxhdG9yPC9jb2RlPi4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBjb2xsYXRpb24gcnVsZXMgb2YgdGhpcyBjb2xsYXRvci4gVGhlc2Uge0Bjb2RlIHJ1bGVzfSBjYW4gYmUKKyAgICAgKiBmZWQgaW50byB0aGUge0BsaW5rICNSdWxlQmFzZWRDb2xsYXRvcihTdHJpbmcpfSBjb25zdHJ1Y3Rvci4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHtAY29kZSBydWxlc30gYXJlIGFjdHVhbGx5IGludGVycHJldGVkIGFzIGEgZGVsdGEgdG8gdGhlCisgICAgICogc3RhbmRhcmQgVW5pY29kZSBDb2xsYXRpb24gQWxnb3JpdGhtIChVQ0EpLiBIZW5jZSwgYW4gZW1wdHkge0Bjb2RlIHJ1bGVzfQorICAgICAqIHN0cmluZyByZXN1bHRzIGluIHRoZSBkZWZhdWx0IFVDQSBydWxlcyBiZWluZyBhcHBsaWVkLiBUaGlzIGRpZmZlcnMKKyAgICAgKiBzbGlnaHRseSBmcm9tIG90aGVyIGltcGxlbWVudGF0aW9ucyB3aGljaCB3b3JrIHdpdGggZnVsbCB7QGNvZGUgcnVsZXN9CisgICAgICogc3BlY2lmaWNhdGlvbnMgYW5kIG1heSByZXN1bHQgaW4gZGlmZmVyZW50IGJlaGF2aW9yLgorICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29sbGF0aW9uIHJ1bGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UnVsZXMoKSB7CiAgICAgICAgIHJldHVybiAoKGNvbS5pYm0uaWN1NGpuaS50ZXh0LlJ1bGVCYXNlZENvbGxhdG9yKSB0aGlzLmljdUNvbGwpLmdldFJ1bGVzKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT2J0YWlucyB0aGUgY2xvbmVkIG9iamVjdCBvZiB0aGUgPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+CisgICAgICogUmV0dXJucyBhIG5ldyBjb2xsYXRvciB3aXRoIHRoZSBzYW1lIGNvbGxhdGlvbiBydWxlcywgZGVjb21wb3NpdGlvbiBtb2RlIGFuZAorICAgICAqIHN0cmVuZ3RoIHZhbHVlIGFzIHRoaXMgY29sbGF0b3IuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2xvbmVkIG9iamVjdCBvZiB0aGUgPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+CisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGNvbGxhdG9yLgorICAgICAqIEBzZWUgamF2YS5sYW5nLkNsb25lYWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CkBAIC0xMzQsMjcgKzQyMCwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSA8Y29kZT5zb3VyY2U8L2NvZGU+IHRleHQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB0aGUKLSAgICAgKiA8Y29kZT50YXJnZXQ8L2NvZGU+IHRleHQgPGNvZGU+U3RyaW5nPC9jb2RlPiBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICogY29sbGF0aW9uIHJ1bGVzLCBzdHJlbmd0aCBhbmQgZGVjb21wb3NpdGlvbiBtb2RlIGZvciB0aGlzCi0gICAgICogPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+LiBTZWUgdGhlIDxjb2RlPkNvbGxhdG9yPC9jb2RlPiBjbGFzcwotICAgICAqIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlIG9mIHVzZS4KKyAgICAgKiBDb21wYXJlcyB0aGUge0Bjb2RlIHNvdXJjZX0gdGV4dCB0byB0aGUge0Bjb2RlIHRhcmdldH0gdGV4dCBhY2NvcmRpbmcgdG8KKyAgICAgKiB0aGUgY29sbGF0aW9uIHJ1bGVzLCBzdHJlbmd0aCBhbmQgZGVjb21wb3NpdGlvbiBtb2RlIGZvciB0aGlzCisgICAgICoge0Bjb2RlIFJ1bGVCYXNlZENvbGxhdG9yfS4gU2VlIHRoZSB7QGNvZGUgQ29sbGF0b3J9IGNsYXNzIGRlc2NyaXB0aW9uCisgICAgICogZm9yIGFuIGV4YW1wbGUgb2YgdXNlLgogICAgICAqIDxwPgotICAgICAqIEdlbmVyYWwgcmVjb21tZW5kYXRpb246IElmIGNvbXBhcmlzb25zIGFyZSB0byBiZSBkb25lIHRvIHRoZSBzYW1lIFN0cmluZwotICAgICAqIG11bHRpcGxlIHRpbWVzLCBpdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB0byBnZW5lcmF0ZQotICAgICAqIDxjb2RlPkNvbGxhdGlvbktleXM8L2NvZGU+IGZvciB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBzIGFuZCB1c2UKLSAgICAgKiA8Y29kZT5Db2xsYXRpb25LZXkuY29tcGFyZVRvKENvbGxhdGlvbktleSk8L2NvZGU+IGZvciB0aGUgY29tcGFyaXNvbnMuCi0gICAgICogSWYgdGhlIGVhY2ggU3RyaW5ncyBhcmUgY29tcGFyZWQgdG8gb25seSBvbmNlLCB1c2luZyB0aGUgbWV0aG9kCi0gICAgICogUnVsZUJhc2VkQ29sbGF0b3IuY29tcGFyZShTdHJpbmcsIFN0cmluZykgd2lsbCBoYXZlIGEgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAqIEdlbmVyYWwgcmVjb21tZW5kYXRpb246IElmIGNvbXBhcmlzb25zIGFyZSB0byBiZSBkb25lIHdpdGggdGhlIHNhbWUgc3RyaW5ncworICAgICAqIG11bHRpcGxlIHRpbWVzLCBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBnZW5lcmF0ZSB7QGNvZGUgQ29sbGF0aW9uS2V5fQorICAgICAqIG9iamVjdHMgZm9yIHRoZSBzdHJpbmdzIGFuZCB1c2UKKyAgICAgKiB7QGNvZGUgQ29sbGF0aW9uS2V5LmNvbXBhcmVUbyhDb2xsYXRpb25LZXkpfSBmb3IgdGhlIGNvbXBhcmlzb25zLiBJZiBlYWNoCisgICAgICogc3RyaW5nIGlzIGNvbXBhcmVkIHRvIG9ubHkgb25jZSwgdXNpbmcKKyAgICAgKiB7QGNvZGUgUnVsZUJhc2VkQ29sbGF0b3IuY29tcGFyZShTdHJpbmcsIFN0cmluZyl9IGhhcyBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICogPC9wPgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgdGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSB0ZXh0LgogICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgdGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCB0ZXh0LgogICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciB3aGljaCBtYXkgYmUgYSBuZWdhdGl2ZSB2YWx1ZSwgemVybywgb3IgZWxzZSBhCi0gICAgICogICAgICAgICBwb3NpdGl2ZSB2YWx1ZSBkZXBlbmRpbmcgb24gd2hldGhlciA8Y29kZT5zb3VyY2U8L2NvZGU+IGlzIGxlc3MKLSAgICAgKiAgICAgICAgIHRoYW4sIGVxdWl2YWxlbnQgdG8sIG9yIGdyZWF0ZXIgdGhhbiA8Y29kZT50YXJnZXQ8L2NvZGU+LgorICAgICAqICAgICAgICAgcG9zaXRpdmUgdmFsdWUgZGVwZW5kaW5nIG9uIHdoZXRoZXIge0Bjb2RlIHNvdXJjZX0gaXMgbGVzcyB0aGFuLAorICAgICAqICAgICAgICAgZXF1aXZhbGVudCB0bywgb3IgZ3JlYXRlciB0aGFuIHtAY29kZSB0YXJnZXR9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KSB7CkBAIC0xNjYsMTEgKzQ1MiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9idGFpbnMgdGhlIDxjb2RlPkNvbGxhdGlvbktleTwvY29kZT4gZm9yIHRoZSBnaXZlbiBzb3VyY2UgdGV4dC4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgQ29sbGF0aW9uS2V5fSBmb3IgdGhlIGdpdmVuIHNvdXJjZSB0ZXh0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgc291cmNlIHRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5Db2xsYXRpb25LZXk8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gc291cmNlIHRleHQuCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHNvdXJjZSB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBDb2xsYXRpb25LZXl9IGZvciB0aGUgZ2l2ZW4gc291cmNlIHRleHQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbGxhdGlvbktleSBnZXRDb2xsYXRpb25LZXkoU3RyaW5nIHNvdXJjZSkgewpAQCAtMTgyLDExICs0NjksNiBAQAogICAgICAgICByZXR1cm4gbmV3IENvbGxhdGlvbktleShzb3VyY2UsIGljdUtleSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogT2J0YWlucyBhIHVuaXF1ZSBoYXNoIGNvZGUgZm9yIHRoZSA8Y29kZT5SdWxlQmFzZWRDb2xsYXRvcjwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSA8Y29kZT5SdWxlQmFzZWRDb2xsYXRvcjwvY29kZT4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gKChjb20uaWJtLmljdTRqbmkudGV4dC5SdWxlQmFzZWRDb2xsYXRvcikgdGhpcy5pY3VDb2xsKS5nZXRSdWxlcygpCkBAIC0xOTQsMTUgKzQ3NiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBlcXVhbGl0eSBvZiB0d28gPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+IG9iamVjdHMuCi0gICAgICogPGNvZGU+UnVsZUJhc2VkQ29sbGF0b3I8L2NvZGU+IG9iamVjdHMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZQotICAgICAqIGNvbGxhdGlvbiBydWxlcyBhbmQgdGhlIHNhbWUgYXR0cmlidXRlcy4KKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMge0Bjb2RlIFJ1bGVCYXNlZENvbGxhdG9yfSBhbmQKKyAgICAgKiBpbmRpY2F0ZXMgaWYgdGhleSBhcmUgZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb2JqZWN0fSBtdXN0IGJlCisgICAgICogYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIENvbGxhdG9yfSB3aXRoIHRoZSBzYW1lIGNvbGxhdGlvbiBydWxlcyBhbmQgdGhlCisgICAgICogc2FtZSBhdHRyaWJ1dGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiAgICAgICAgICAgIHRoZSBvdGhlciBvYmplY3QuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIDxjb2RlPlJ1bGVCYXNlZENvbGxhdG9yPC9jb2RlPiBoYXMKLSAgICAgKiAgICAgICAgIGV4YWN0bHkgdGhlIHNhbWUgY29sbGF0aW9uIGJlaGF2aW91ciBhcyBvYmosIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAge0Bjb2RlIFJ1bGVCYXNlZENvbGxhdG9yfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSAjaGFzaENvZGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0LmphdmEgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuamF2YQppbmRleCA3MGJkZjliLi5jNzhmMjllIDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuamF2YQpAQCAtMTUsNiArMTUsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBUaGUgY2xhc3MgamF2YWRvYyBhbmQgc29tZSBvZiB0aGUgbWV0aG9kIGRlc2NyaXB0aW9ucyBhcmUgY29waWVkIGZyb20gSUNVNEoKKy8vIHNvdXJjZSBmaWxlcy4gQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgY29waWVkIGRlc2NyaXB0aW9ucy4KKy8vIFRoZSBpY3UgbGljZW5zZSBoZWFkZXIgd2FzIGFkZGVkIHRvIHRoaXMgZmlsZS4gCisvLyBFTkQgYW5kcm9pZC1ub3RlCisKIHBhY2thZ2UgamF2YS50ZXh0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTMzLDEyICs0NiwyODkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogU2ltcGxlRGF0ZUZvcm1hdCBpcyB1c2VkIHRvIGZvcm1hdCBhbmQgcGFyc2UgR3JlZ29yaWFuIGNhbGVuZGFyIGRhdGVzIGFuZAotICogdGltZXMgYmFzZWQgb24gYSBwYXR0ZXJuIG9mIGRhdGUgYW5kIHRpbWUgZmllbGRzLiBFYWNoIGRhdGUgYW5kIHRpbWUgZmllbGQgaXMKLSAqIHNwZWNpZmllZCBpbiB0aGUgcGF0dGVybiBieSBhIHNwZWNpZmljIGNoYXJhY3Rlci4gVGhlIGNoYXJhY3RlcnMgdXNlZCBjYW4gYmUKLSAqIGVpdGhlciBsb2NhbGl6ZWQgb3Igbm9uLWxvY2FsaXplZC4gRm9yIHNvbWUgZmllbGRzLCB3aGljaCBoYXZlIGJvdGggbnVtZXJpYwotICogYW5kIHRleHQgcmVwcmVzZW50YXRpb25zIG9yIGFiYnJldmlhdGVkIGFzIHdlbGwgYXMgZnVsbCBuYW1lcywgdGhlIG51bWJlciBvZgotICogZ3JvdXBlZCBjaGFyYWN0ZXJzIHNwZWNpZmllcyBob3cgdGhlIGZpZWxkIGlzIGZvcm1hdHRlZCBvciBwYXJzZWQuCisgKiBBIGNvbmNyZXRlIGNsYXNzIGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGRhdGVzIGluIGEgbG9jYWxlLXNlbnNpdGl2ZQorICogbWFubmVyLiBJdCBhbGxvd3MgZm9yIGZvcm1hdHRpbmcgKGRhdGUgdG8gdGV4dCksIHBhcnNpbmcgKHRleHQgdG8gZGF0ZSkgYW5kCisgKiBub3JtYWxpemF0aW9uLgorICogPHA+CisgKiB7QGNvZGUgU2ltcGxlRGF0ZUZvcm1hdH0gYWxsb3dzIHlvdSB0byBzdGFydCBieSBjaG9vc2luZyBhbnkgdXNlci1kZWZpbmVkCisgKiBwYXR0ZXJucyBmb3IgZGF0ZS10aW1lIGZvcm1hdHRpbmcuIEhvd2V2ZXIsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byBjcmVhdGUgYQorICogZGF0ZS10aW1lIGZvcm1hdHRlciB3aXRoIGVpdGhlciB7QGNvZGUgZ2V0VGltZUluc3RhbmNlfSwge0Bjb2RlCisgKiBnZXREYXRlSW5zdGFuY2V9LCBvciB7QGNvZGUgZ2V0RGF0ZVRpbWVJbnN0YW5jZX0gaW4ge0Bjb2RlIERhdGVGb3JtYXR9LiBFYWNoCisgKiBvZiB0aGVzZSBjbGFzcyBtZXRob2RzIGNhbiByZXR1cm4gYSBkYXRlL3RpbWUgZm9ybWF0dGVyIGluaXRpYWxpemVkIHdpdGggYQorICogZGVmYXVsdCBmb3JtYXQgcGF0dGVybi4gWW91IG1heSBtb2RpZnkgdGhlIGZvcm1hdCBwYXR0ZXJuIHVzaW5nIHRoZSB7QGNvZGUKKyAqIGFwcGx5UGF0dGVybn0gbWV0aG9kcyBhcyBkZXNpcmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGVzZQorICogbWV0aG9kcywgc2VlIHtAbGluayBEYXRlRm9ybWF0fS4KKyAqIDwvcD4KKyAqIDxoND5UaW1lIEZvcm1hdCBTeW50YXg8L2g0PgorICogPHA+CisgKiBUbyBzcGVjaWZ5IHRoZSB0aW1lIGZvcm1hdCwgdXNlIGEgPGVtPnRpbWUgcGF0dGVybjwvZW0+IHN0cmluZy4gSW4gdGhpcworICogcGF0dGVybiwgYWxsIEFTQ0lJIGxldHRlcnMgYXJlIHJlc2VydmVkIGFzIHBhdHRlcm4gbGV0dGVycywgd2hpY2ggYXJlIGRlZmluZWQKKyAqIGFzIGZvbGxvd3M6CisgKiA8L3A+CisgKiA8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MyBjZWxscGFkZGluZz0wPgorICogPHRyIGJnY29sb3I9IiNjY2NjZmYiPgorICogPHRoPlN5bWJvbDwvdGg+CisgKiA8dGg+TWVhbmluZzwvdGg+CisgKiA8dGg+UHJlc2VudGF0aW9uPC90aD4KKyAqIDx0aD5FeGFtcGxlPC90aD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcD4KKyAqIDx0ZD5HPC90ZD4KKyAqIDx0ZD5lcmEgZGVzaWduYXRvcjwvdGQ+CisgKiA8dGQ+KFRleHQpPC90ZD4KKyAqIDx0ZD5BRDwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj10b3AgYmdjb2xvcj0iI2VlZWVmZiI+CisgKiA8dGQ+eTwvdGQ+CisgKiA8dGQ+eWVhcjwvdGQ+CisgKiA8dGQ+KE51bWJlcik8L3RkPgorICogPHRkPjE5OTY8L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249dG9wPgorICogPHRkPk08L3RkPgorICogPHRkPm1vbnRoIGluIHllYXI8L3RkPgorICogPHRkPihUZXh0ICZhbXA7IE51bWJlcik8L3RkPgorICogPHRkPkp1bHkgJmFtcDsgMDc8L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249dG9wIGJnY29sb3I9IiNlZWVlZmYiPgorICogPHRkPmQ8L3RkPgorICogPHRkPmRheSBpbiBtb250aDwvdGQ+CisgKiA8dGQ+KE51bWJlcik8L3RkPgorICogPHRkPjEwPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcD4KKyAqIDx0ZD5oPC90ZD4KKyAqIDx0ZD5ob3VyIGluIGFtL3BtICgxJnRpbGRlOzEyKTwvdGQ+CisgKiA8dGQ+KE51bWJlcik8L3RkPgorICogPHRkPjEyPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcCBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD5IPC90ZD4KKyAqIDx0ZD5ob3VyIGluIGRheSAoMCZ0aWxkZTsyMyk8L3RkPgorICogPHRkPihOdW1iZXIpPC90ZD4KKyAqIDx0ZD4wPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcD4KKyAqIDx0ZD5tPC90ZD4KKyAqIDx0ZD5taW51dGUgaW4gaG91cjwvdGQ+CisgKiA8dGQ+KE51bWJlcik8L3RkPgorICogPHRkPjMwPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcCBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD5zPC90ZD4KKyAqIDx0ZD5zZWNvbmQgaW4gbWludXRlPC90ZD4KKyAqIDx0ZD4oTnVtYmVyKTwvdGQ+CisgKiA8dGQ+NTU8L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249dG9wPgorICogPHRkPlM8L3RkPgorICogPHRkPmZyYWN0aW9uYWwgc2Vjb25kPC90ZD4KKyAqIDx0ZD4oTnVtYmVyKTwvdGQ+CisgKiA8dGQ+OTc4PC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcCBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD5FPC90ZD4KKyAqIDx0ZD5kYXkgb2Ygd2VlazwvdGQ+CisgKiA8dGQ+KFRleHQpPC90ZD4KKyAqIDx0ZD5UdWVzZGF5PC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcCBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD5EPC90ZD4KKyAqIDx0ZD5kYXkgaW4geWVhcjwvdGQ+CisgKiA8dGQ+KE51bWJlcik8L3RkPgorICogPHRkPjE4OTwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj10b3A+CisgKiA8dGQ+RjwvdGQ+CisgKiA8dGQ+ZGF5IG9mIHdlZWsgaW4gbW9udGg8L3RkPgorICogPHRkPihOdW1iZXIpPC90ZD4KKyAqIDx0ZD4yICgybmQgV2VkIGluIEp1bHkpPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcCBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD53PC90ZD4KKyAqIDx0ZD53ZWVrIGluIHllYXI8L3RkPgorICogPHRkPihOdW1iZXIpPC90ZD4KKyAqIDx0ZD4yNzwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj10b3A+CisgKiA8dGQ+VzwvdGQ+CisgKiA8dGQ+d2VlayBpbiBtb250aDwvdGQ+CisgKiA8dGQ+KE51bWJlcik8L3RkPgorICogPHRkPjI8L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249dG9wIGJnY29sb3I9IiNlZWVlZmYiPgorICogPHRkPmE8L3RkPgorICogPHRkPmFtL3BtIG1hcmtlcjwvdGQ+CisgKiA8dGQ+KFRleHQpPC90ZD4KKyAqIDx0ZD5QTTwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj10b3A+CisgKiA8dGQ+azwvdGQ+CisgKiA8dGQ+aG91ciBpbiBkYXkgKDEmdGlsZGU7MjQpPC90ZD4KKyAqIDx0ZD4oTnVtYmVyKTwvdGQ+CisgKiA8dGQ+MjQ8L3RkPgorICogPC90cj4KKyAqIDx0ciB2YWxpZ249dG9wIGJnY29sb3I9IiNlZWVlZmYiPgorICogPHRkPks8L3RkPgorICogPHRkPmhvdXIgaW4gYW0vcG0gKDAmdGlsZGU7MTEpPC90ZD4KKyAqIDx0ZD4oTnVtYmVyKTwvdGQ+CisgKiA8dGQ+MDwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj10b3A+CisgKiA8dGQ+ejwvdGQ+CisgKiA8dGQ+dGltZSB6b25lPC90ZD4KKyAqIDx0ZD4oVGV4dCk8L3RkPgorICogPHRkPlBhY2lmaWMgU3RhbmRhcmQgVGltZTwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj10b3AgYmdjb2xvcj0iI2VlZWVmZiI+CisgKiA8dGQ+WjwvdGQ+CisgKiA8dGQ+dGltZSB6b25lIChSRkMgODIyKTwvdGQ+CisgKiA8dGQ+KE51bWJlcik8L3RkPgorICogPHRkPi0wODAwPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcD4KKyAqIDx0ZD52PC90ZD4KKyAqIDx0ZD50aW1lIHpvbmUgKGdlbmVyaWMpPC90ZD4KKyAqIDx0ZD4oVGV4dCk8L3RkPgorICogPHRkPlBhY2lmaWMgVGltZTwvdGQ+CisgKiA8L3RyPgorICogPHRyIHZhbGlnbj10b3AgYmdjb2xvcj0iI2VlZWVmZiI+CisgKiA8dGQ+VjwvdGQ+CisgKiA8dGQ+dGltZSB6b25lIChsb2NhdGlvbik8L3RkPgorICogPHRkPihUZXh0KTwvdGQ+CisgKiA8dGQ+VW5pdGVkIFN0YXRlcyAoTG9zIEFuZ2VsZXMpPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcD4KKyAqIDx0ZD4nPC90ZD4KKyAqIDx0ZD5lc2NhcGUgZm9yIHRleHQ8L3RkPgorICogPHRkPihEZWxpbWl0ZXIpPC90ZD4KKyAqIDx0ZD4nRGF0ZT0nPC90ZD4KKyAqIDwvdHI+CisgKiA8dHIgdmFsaWduPXRvcCBiZ2NvbG9yPSIjZWVlZWZmIj4KKyAqIDx0ZD4nJzwvdGQ+CisgKiA8dGQ+c2luZ2xlIHF1b3RlPC90ZD4KKyAqIDx0ZD4oTGl0ZXJhbCk8L3RkPgorICogPHRkPidvJydjbG9jayc8L3RkPgorICogPC90cj4KKyAqIDwvdGFibGU+CisgKiA8cD4KKyAqIFRoZSBjb3VudCBvZiBwYXR0ZXJuIGxldHRlcnMgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0OgorICogPHA+CisgKiA8c3Ryb25nPihUZXh0KTwvc3Ryb25nPjogNCBvciBtb3JlIHBhdHRlcm4gbGV0dGVycyAmcmFycjsgdXNlIHRoZSBmdWxsIGZvcm0sCisgKiBsZXNzIHRoYW4gNCBwYXR0ZXJuIGxldHRlcnMgJnJhcnI7IHVzZSBhIHNob3J0IG9yIGFiYnJldmlhdGVkIGZvcm0gaWYgb25lCisgKiBleGlzdHMuCisgKiA8L3A+CisgKiA8cD4KKyAqIDxzdHJvbmc+KE51bWJlcik8L3N0cm9uZz46IHRoZSBtaW5pbXVtIG51bWJlciBvZiBkaWdpdHMuIFNob3J0ZXIgbnVtYmVycyBhcmUKKyAqIHplcm8tcGFkZGVkIHRvIHRoaXMgYW1vdW50LiBZZWFyIGlzIGhhbmRsZWQgc3BlY2lhbGx5OyB0aGF0IGlzLCBpZiB0aGUgY291bnQKKyAqIG9mICd5JyBpcyAyLCB0aGUgeWVhciB3aWxsIGJlIHRydW5jYXRlZCB0byAyIGRpZ2l0cy4gKGlmICJ5eXl5IiBwcm9kdWNlcworICogIjE5OTciLCAieXkiIHByb2R1Y2VzICI5NyIuKSBVbmxpa2Ugb3RoZXIgZmllbGRzLCBmcmFjdGlvbmFsIHNlY29uZHMgYXJlCisgKiBwYWRkZWQgb24gdGhlIHJpZ2h0IHdpdGggemVyby4KKyAqIDxwPgorICogPC9wPgorICogPHN0cm9uZz4oVGV4dCAmIE51bWJlcik8L3N0cm9uZz46IDMgb3Igb3ZlciwgdXNlIHRleHQsIG90aGVyd2lzZSB1c2UgbnVtYmVyLgorICogPHA+CisgKiBBbnkgY2hhcmFjdGVycyBpbiB0aGUgcGF0dGVybiB0aGF0IGFyZSBub3QgaW4gdGhlIHJhbmdlcyBvZiBbJ2EnLi4neiddIGFuZAorICogWydBJy4uJ1onXSB3aWxsIGJlIHRyZWF0ZWQgYXMgcXVvdGVkIHRleHQuIEZvciBpbnN0YW5jZSwgY2hhcmFjdGVycyBsaWtlICc6JywKKyAqICcuJywgJyAnLCAnIycgYW5kICdAJyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzdWx0aW5nIHRpbWUgdGV4dCBldmVuIHRoZXkgYXJlCisgKiBub3QgZW1icmFjZWQgd2l0aGluIHNpbmdsZSBxdW90ZXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEEgcGF0dGVybiBjb250YWluaW5nIGFueSBpbnZhbGlkIHBhdHRlcm4gbGV0dGVyIHdpbGwgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbgorICogdGhyb3duIGR1cmluZyBmb3JtYXR0aW5nIG9yIHBhcnNpbmcuCisgKiA8L3A+CisgKiA8aDQ+RXhhbXBsZXMgVXNpbmcgdGhlIFVTIExvY2FsZTwvaDQ+IDxibG9ja3F1b3RlPgorICogCisgKiA8cHJlPgorICogRm9ybWF0IFBhdHRlcm4gICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdAorICogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0KKyAqICJ5eXl5Lk1NLmRkIEcgJ2F0JyBISDptbTpzcyB2dnZ2IiAmcmFycjsgIDE5OTYuMDcuMTAgQUQgYXQgMTU6MDg6NTYgUGFjaWZpYyBUaW1lCisgKiAiRUVFLCBNTU0gZCwgJyd5eSIgICAgICAgICAgICAgICAgJnJhcnI7ICBXZWQsIEp1bHkgMTAsICc5NgorICogImg6bW0gYSIgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXJyOyAgMTI6MDggUE0KKyAqICJoaCAnbycnY2xvY2snIGEsIHp6enoiICAgICAgICAgICAmcmFycjsgIDEyIG8nY2xvY2sgUE0sIFBhY2lmaWMgRGF5bGlnaHQgVGltZQorICogIks6bW0gYSwgdnZ2IiAgICAgICAgICAgICAgICAgICAgICZyYXJyOyAgMDowMCBQTSwgUFQKKyAqICJ5eXl5eS5NTU1NTS5kZCBHR0cgaGg6bW0gYWFhIiAgICAmcmFycjsgIDAxOTk2Lkp1bHkuMTAgQUQgMTI6MDggUE0KKyAqIDwvcHJlPgorICogCisgKiA8L2Jsb2NrcXVvdGU+IDxoND5Db2RlIFNhbXBsZTo8L2g0PiA8YmxvY2txdW90ZT4KKyAqIAorICogPHByZT4KKyAqIFNpbXBsZVRpbWVab25lIHBkdCA9IG5ldyBTaW1wbGVUaW1lWm9uZSgtOCAqIDYwICogNjAgKiAxMDAwLCAiUFNUIik7CisgKiBwZHQuc2V0U3RhcnRSdWxlKENhbGVuZGFyLkFQUklMLCAxLCBDYWxlbmRhci5TVU5EQVksIDIgKiA2MCAqIDYwICogMTAwMCk7CisgKiBwZHQuc2V0RW5kUnVsZShDYWxlbmRhci5PQ1RPQkVSLCAtMSwgQ2FsZW5kYXIuU1VOREFZLCAyICogNjAgKiA2MCAqIDEwMDApOworICogCisgKiAvLyBGb3JtYXQgdGhlIGN1cnJlbnQgdGltZS4KKyAqIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCisgKiAgICAgICAgICJ5eXl5Lk1NLmRkIEcgJ2F0JyBoaDptbTpzcyBhIHp6eiIpOworICogRGF0ZSBjdXJyZW50VGltZV8xID0gbmV3IERhdGUoKTsKKyAqIFN0cmluZyBkYXRlU3RyaW5nID0gZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50VGltZV8xKTsKKyAqIAorICogLy8gUGFyc2UgdGhlIHByZXZpb3VzIHN0cmluZyBiYWNrIGludG8gYSBEYXRlLgorICogUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKKyAqIERhdGUgY3VycmVudFRpbWVfMiA9IGZvcm1hdHRlci5wYXJzZShkYXRlU3RyaW5nLCBwb3MpOworICogPC9wcmU+CisgKiAKKyAqIDwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogSW4gdGhlIGV4YW1wbGUsIHRoZSB0aW1lIHZhbHVlIHtAY29kZSBjdXJyZW50VGltZV8yfSBvYnRhaW5lZCBmcm9tIHBhcnNpbmcKKyAqIHdpbGwgYmUgZXF1YWwgdG8ge0Bjb2RlIGN1cnJlbnRUaW1lXzF9LiBIb3dldmVyLCB0aGV5IG1heSBub3QgYmUgZXF1YWwgaWYgdGhlCisgKiBhbS9wbSBtYXJrZXIgJ2EnIGlzIGxlZnQgb3V0IGZyb20gdGhlIGZvcm1hdCBwYXR0ZXJuIHdoaWxlIHRoZQorICogImhvdXIgaW4gYW0vcG0iIHBhdHRlcm4gc3ltYm9sIGlzIHVzZWQuIFRoaXMgaW5mb3JtYXRpb24gbG9zcyBjYW4gaGFwcGVuIHdoZW4KKyAqIGZvcm1hdHRpbmcgdGhlIHRpbWUgaW4gUE0uCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZW4gcGFyc2luZyBhIGRhdGUgc3RyaW5nIHVzaW5nIHRoZSBhYmJyZXZpYXRlZCB5ZWFyIHBhdHRlcm4gKCJ5eSIpLCB7QGNvZGUKKyAqIFNpbXBsZURhdGVGb3JtYXR9IG11c3QgaW50ZXJwcmV0IHRoZSBhYmJyZXZpYXRlZCB5ZWFyIHJlbGF0aXZlIHRvIHNvbWUKKyAqIGNlbnR1cnkuIEl0IGRvZXMgdGhpcyBieSBhZGp1c3RpbmcgZGF0ZXMgdG8gYmUgd2l0aGluIDgwIHllYXJzIGJlZm9yZSBhbmQgMjAKKyAqIHllYXJzIGFmdGVyIHRoZSB0aW1lIHRoZSB7QGNvZGUgU2ltcGxlRGF0ZUZvcm1hdH0gaW5zdGFuY2UgaXMgY3JlYXRlZC4gRm9yCisgKiBleGFtcGxlLCB1c2luZyBhIHBhdHRlcm4gb2YgIk1NL2RkL3l5IiBhbmQgYSB7QGNvZGUgU2ltcGxlRGF0ZUZvcm1hdH0KKyAqIGluc3RhbmNlIGNyZWF0ZWQgb24gSmFuIDEsIDE5OTcsIHRoZSBzdHJpbmcgIjAxLzExLzEyIiB3b3VsZCBiZSBpbnRlcnByZXRlZAorICogYXMgSmFuIDExLCAyMDEyIHdoaWxlIHRoZSBzdHJpbmcgIjA1LzA0LzY0IiB3b3VsZCBiZSBpbnRlcnByZXRlZCBhcyBNYXkgNCwKKyAqIDE5NjQuIER1cmluZyBwYXJzaW5nLCBvbmx5IHN0cmluZ3MgY29uc2lzdGluZyBvZiBleGFjdGx5IHR3byBkaWdpdHMsIGFzCisgKiBkZWZpbmVkIGJ5IHtAbGluayBqYXZhLmxhbmcuQ2hhcmFjdGVyI2lzRGlnaXQoY2hhcil9LCB3aWxsIGJlIHBhcnNlZCBpbnRvIHRoZQorICogZGVmYXVsdCBjZW50dXJ5LiBBbnkgb3RoZXIgbnVtZXJpYyBzdHJpbmcsIHN1Y2ggYXMgYSBvbmUgZGlnaXQgc3RyaW5nLCBhCisgKiB0aHJlZSBvciBtb3JlIGRpZ2l0IHN0cmluZywgb3IgYSB0d28gZGlnaXQgc3RyaW5nIHRoYXQgaXNuJ3QgYWxsIGRpZ2l0cyAoZm9yCisgKiBleGFtcGxlLCAiLTEiKSwgaXMgaW50ZXJwcmV0ZWQgbGl0ZXJhbGx5LiBTbyAiMDEvMDIvMyIgb3IgIjAxLzAyLzAwMyIgYXJlCisgKiBwYXJzZWQsIHVzaW5nIHRoZSBzYW1lIHBhdHRlcm4sIGFzIEphbiAyLCAzIEFELiBMaWtld2lzZSwgIjAxLzAyLy0zIiBpcworICogcGFyc2VkIGFzIEphbiAyLCA0IEJDLgorICogPC9wPgorICogPHA+CisgKiBJZiB0aGUgeWVhciBwYXR0ZXJuIGRvZXMgbm90IGhhdmUgZXhhY3RseSB0d28gJ3knIGNoYXJhY3RlcnMsIHRoZSB5ZWFyIGlzCisgKiBpbnRlcnByZXRlZCBsaXRlcmFsbHksIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBkaWdpdHMuIFNvIHVzaW5nIHRoZQorICogcGF0dGVybiAiTU0vZGQveXl5eSIsICIwMS8xMS8xMiIgcGFyc2VzIHRvIEphbiAxMSwgMTIgQS5ELgorICogPC9wPgorICogPHA+CisgKiBXaGVuIG51bWVyaWMgZmllbGRzIGFyZSBhZGphY2VudCBkaXJlY3RseSwgd2l0aCBubyBpbnRlcnZlbmluZyBkZWxpbWl0ZXIKKyAqIGNoYXJhY3RlcnMsIHRoZXkgY29uc3RpdHV0ZSBhIHJ1biBvZiBhZGphY2VudCBudW1lcmljIGZpZWxkcy4gU3VjaCBydW5zIGFyZQorICogcGFyc2VkIHNwZWNpYWxseS4gRm9yIGV4YW1wbGUsIHRoZSBmb3JtYXQgIkhIbW1zcyIgcGFyc2VzIHRoZSBpbnB1dCB0ZXh0CisgKiAiMTIzNDU2IiB0byAxMjozNDo1NiwgcGFyc2VzIHRoZSBpbnB1dCB0ZXh0ICIxMjM0NSIgdG8gMToyMzo0NSwgYW5kIGZhaWxzIHRvCisgKiBwYXJzZSAiMTIzNCIuIEluIG90aGVyIHdvcmRzLCB0aGUgbGVmdG1vc3QgZmllbGQgb2YgdGhlIHJ1biBpcyBmbGV4aWJsZSwKKyAqIHdoaWxlIHRoZSBvdGhlcnMga2VlcCBhIGZpeGVkIHdpZHRoLiBJZiB0aGUgcGFyc2UgZmFpbHMgYW55d2hlcmUgaW4gdGhlIHJ1biwKKyAqIHRoZW4gdGhlIGxlZnRtb3N0IGZpZWxkIGlzIHNob3J0ZW5lZCBieSBvbmUgY2hhcmFjdGVyLCBhbmQgdGhlIGVudGlyZSBydW4gaXMKKyAqIHBhcnNlZCBhZ2Fpbi4gVGhpcyBpcyByZXBlYXRlZCB1bnRpbCBlaXRoZXIgdGhlIHBhcnNlIHN1Y2NlZWRzIG9yIHRoZQorICogbGVmdG1vc3QgZmllbGQgaXMgb25lIGNoYXJhY3RlciBpbiBsZW5ndGguIElmIHRoZSBwYXJzZSBzdGlsbCBmYWlscyBhdCB0aGF0CisgKiBwb2ludCwgdGhlIHBhcnNlIG9mIHRoZSBydW4gZmFpbHMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEZvciB0aW1lIHpvbmVzIHRoYXQgaGF2ZSBubyBuYW1lcywgdXNlIHRoZSBzdHJpbmdzICJHTVQraG91cnM6bWludXRlcyIgb3IKKyAqICJHTVQtaG91cnM6bWludXRlcyIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBjYWxlbmRhciBkZWZpbmVzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLAorICogd2hldGhlciBob3VycyBhcmUgemVybyBiYXNlZCBvciBub3QgKDAgdnMuIDEyIG9yIDI0KSBhbmQgdGhlIHRpbWUgem9uZS4gVGhlcmUKKyAqIGlzIG9uZSBjb21tb24gZGVjaW1hbCBmb3JtYXQgdG8gaGFuZGxlIGFsbCB0aGUgbnVtYmVyczsgdGhlIGRpZ2l0IGNvdW50IGlzCisgKiBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgYWNjb3JkaW5nIHRvIHRoZSBwYXR0ZXJuLgorICogPGg0PlN5bmNocm9uaXphdGlvbjwvaDQ+IERhdGUgZm9ybWF0cyBhcmUgbm90IHN5bmNocm9uaXplZC4gSXQgaXMgcmVjb21tZW5kZWQKKyAqIHRvIGNyZWF0ZSBzZXBhcmF0ZSBmb3JtYXQgaW5zdGFuY2VzIGZvciBlYWNoIHRocmVhZC4gSWYgbXVsdGlwbGUgdGhyZWFkcworICogYWNjZXNzIGEgZm9ybWF0IGNvbmN1cnJlbnRseSwgaXQgbXVzdCBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4KKyAqIAorICogQHNlZSBDYWxlbmRhcgorICogQHNlZSBHcmVnb3JpYW5DYWxlbmRhcgorICogQHNlZSBUaW1lWm9uZQorICogQHNlZSBEYXRlRm9ybWF0CisgKiBAc2VlIERhdGVGb3JtYXRTeW1ib2xzCisgKiBAc2VlIERlY2ltYWxGb3JtYXQKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU2ltcGxlRGF0ZUZvcm1hdCBleHRlbmRzIERhdGVGb3JtYXQgewogCkBAIC01NSw4ICszNDUsMTAgQEAKICAgICBwcml2YXRlIERhdGUgZGVmYXVsdENlbnR1cnlTdGFydDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBhbmQKLSAgICAgKiB0aW1lcyBpbiB0aGUgU0hPUlQgc3R5bGUgZm9yIHRoZSBkZWZhdWx0IExvY2FsZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTaW1wbGVEYXRlRm9ybWF0fSBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZworICAgICAqIGRhdGVzIGFuZCB0aW1lcyBpbiB0aGUge0Bjb2RlIFNIT1JUfSBzdHlsZSBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTaW1wbGVEYXRlRm9ybWF0KCkgewogICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkpOwpAQCAtNjUsMzYgKzM1NywzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCB1c2luZyB0aGUgc3BlY2lmaWVkIG5vbi1sb2NhbGl6ZWQKLSAgICAgKiBwYXR0ZXJuIGFuZCB0aGUgRGF0ZUZvcm1hdFN5bWJvbHMgYW5kIENhbGVuZGFyIGZvciB0aGUgZGVmYXVsdCBMb2NhbGUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU2ltcGxlRGF0ZUZvcm1hdH0gdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIG5vbi1sb2NhbGl6ZWQgcGF0dGVybiBhbmQgdGhlIHtAY29kZSBEYXRlRm9ybWF0U3ltYm9sc30gYW5kIHtAY29kZQorICAgICAqIENhbGVuZGFyfSBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogICAgICAgICAgICB0aGUgcGF0dGVybgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIG9mIDxjb2RlPnBhdHRlcm48L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgaXMgc3VwcGxpZWQuCisgICAgICogICAgICAgICAgICB0aGUgcGF0dGVybi4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIDxjb2RlPnBhdHRlcm48L2NvZGU+IGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlIHVzZWFibGUKLSAgICAgKiAgICAgICAgICAgICAgICBieSB0aGlzIGZvcm1hdHRlci4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgcGF0dGVybn0gaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgdXNhYmxlIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNpbXBsZURhdGVGb3JtYXQoU3RyaW5nIHBhdHRlcm4pIHsKICAgICAgICAgdGhpcyhwYXR0ZXJuLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNpbXBsZURhdGVGb3JtYXQgdXNpbmcgdGhlIHNwZWNpZmllZCBub24tbG9jYWxpemVkCi0gICAgICogcGF0dGVybiBhbmQgRGF0ZUZvcm1hdFN5bWJvbHMgYW5kIHRoZSBDYWxlbmRhciBmb3IgdGhlIGRlZmF1bHQgTG9jYWxlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNpbXBsZURhdGVGb3JtYXR9IHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBub24tbG9jYWxpemVkIHBhdHRlcm4gYW5kIHtAY29kZSBEYXRlRm9ybWF0U3ltYm9sc30gYW5kIHRoZSB7QGNvZGUKKyAgICAgKiBDYWxlbmRhcn0gZm9yIHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGVtcGxhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuCisgICAgICogICAgICAgICAgICB0aGUgcGF0dGVybi4KICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRlRm9ybWF0U3ltYm9scwotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcGF0dGVybiBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgRGF0ZUZvcm1hdFN5bWJvbHMuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcGF0dGVybiBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2ltcGxlRGF0ZUZvcm1hdChTdHJpbmcgdGVtcGxhdGUsIERhdGVGb3JtYXRTeW1ib2xzIHZhbHVlKSB7CiAgICAgICAgIHRoaXMoTG9jYWxlLmdldERlZmF1bHQoKSk7CkBAIC0xMDQsMTggKzM5MywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCB1c2luZyB0aGUgc3BlY2lmaWVkIG5vbi1sb2NhbGl6ZWQKLSAgICAgKiBwYXR0ZXJuIGFuZCB0aGUgRGF0ZUZvcm1hdFN5bWJvbHMgYW5kIENhbGVuZGFyIGZvciB0aGUgc3BlY2lmaWVkIExvY2FsZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTaW1wbGVEYXRlRm9ybWF0fSB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogbm9uLWxvY2FsaXplZCBwYXR0ZXJuIGFuZCB0aGUge0Bjb2RlIERhdGVGb3JtYXRTeW1ib2xzfSBhbmQge0Bjb2RlCisgICAgICogQ2FsZW5kYXJ9IGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGVtcGxhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuCisgICAgICogICAgICAgICAgICB0aGUgcGF0dGVybi4KICAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgTG9jYWxlCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwYXR0ZXJuIGlzIG51bGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcGF0dGVybiBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU2ltcGxlRGF0ZUZvcm1hdChTdHJpbmcgdGVtcGxhdGUsIExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgdGhpcyhsb2NhbGUpOwpAQCAtMjcyLDkgKzU2MCw5IEBACiAKICAgICAgICAgaWYgKGdlbmVyYWxUaW1lem9uZSkgewogICAgICAgICAgICAgU3RyaW5nIGlkID0gY2FsZW5kYXIuZ2V0VGltZVpvbmUoKS5nZXRJRCgpOwotLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIFN0cmluZ1tdW10gem9uZXMgPSBmb3JtYXREYXRhLmludGVybmFsWm9uZVN0cmluZ3MoKTsKLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgICAgIFN0cmluZ1tdIHpvbmUgPSBudWxsOwogICAgICAgICAgICAgZm9yIChTdHJpbmdbXSBlbGVtZW50IDogem9uZXMpIHsKICAgICAgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKGVsZW1lbnRbMF0pKSB7CkBAIC0zMjUsMTEgKzYxMywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIHBhdHRlcm4gb2YgdGhpcyBTaW1wbGVEYXRlRm9ybWF0IHRvIHRoZSBzcGVjaWZpZWQgcGF0dGVybgorICAgICAqIENoYW5nZXMgdGhlIHBhdHRlcm4gb2YgdGhpcyBzaW1wbGUgZGF0ZSBmb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBwYXR0ZXJuCiAgICAgICogd2hpY2ggdXNlcyBsb2NhbGl6ZWQgcGF0dGVybiBjaGFyYWN0ZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBwYXR0ZXJuCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIHBhdHRlcm4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXBwbHlMb2NhbGl6ZWRQYXR0ZXJuKFN0cmluZyB0ZW1wbGF0ZSkgewogICAgICAgICBwYXR0ZXJuID0gY29udmVydFBhdHRlcm4odGVtcGxhdGUsIGZvcm1hdERhdGEuZ2V0TG9jYWxQYXR0ZXJuQ2hhcnMoKSwKQEAgLTMzNywxNiArNjI2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgcGF0dGVybiBvZiB0aGlzIFNpbXBsZURhdGVGb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBwYXR0ZXJuCisgICAgICogQ2hhbmdlcyB0aGUgcGF0dGVybiBvZiB0aGlzIHNpbXBsZSBkYXRlIGZvcm1hdCB0byB0aGUgc3BlY2lmaWVkIHBhdHRlcm4KICAgICAgKiB3aGljaCB1c2VzIG5vbi1sb2NhbGl6ZWQgcGF0dGVybiBjaGFyYWN0ZXJzLgogICAgICAqIAogICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIG5vbi1sb2NhbGl6ZWQgcGF0dGVybgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcGF0dGVybiBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgbm9uLWxvY2FsaXplZCBwYXR0ZXJuLgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHBhdHRlcm4gaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwYXR0ZXJuIGlzIGludmFsaWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXBwbHlQYXR0ZXJuKFN0cmluZyB0ZW1wbGF0ZSkgewogICAgICAgICB2YWxpZGF0ZVBhdHRlcm4odGVtcGxhdGUpOwpAQCAtMzU0LDEyICs2NDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFNpbXBsZURhdGVGb3JtYXQgd2l0aCB0aGUgc2FtZSBwYXR0ZXJuIGFuZCBwcm9wZXJ0aWVzIGFzCi0gICAgICogdGhpcyBTaW1wbGVEYXRlRm9ybWF0LgorICAgICAqIFJldHVybnMgYSBuZXcge0Bjb2RlIFNpbXBsZURhdGVGb3JtYXR9IHdpdGggdGhlIHNhbWUgcGF0dGVybiBhbmQKKyAgICAgKiBwcm9wZXJ0aWVzIGFzIHRoaXMgc2ltcGxlIGRhdGUgZm9ybWF0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBTaW1wbGVEYXRlRm9ybWF0Ci0gICAgICogCisgICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHNpbXBsZSBkYXRlIGZvcm1hdC4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMzc3LDE3ICs2NjQsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIFNpbXBsZURhdGVGb3JtYXQgYW5kIGFuc3dlciBpZiB0aGV5Ci0gICAgICogYXJlIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgU2ltcGxlRGF0ZUZvcm1hdCBhbmQgaGF2ZQotICAgICAqIHRoZSBzYW1lIERhdGVGb3JtYXQgcHJvcGVydGllcywgcGF0dGVybiwgRGF0ZUZvcm1hdFN5bWJvbHMsIGFuZCBjcmVhdGlvbgotICAgICAqIHllYXIuCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIHNpbXBsZSBkYXRlIGZvcm1hdCBhbmQgaW5kaWNhdGVzCisgICAgICogaWYgdGhleSBhcmUgZXF1YWwuIEluIG9yZGVyIHRvIGJlIGVxdWFsLCB7QGNvZGUgb2JqZWN0fSBtdXN0IGJlIGFuCisgICAgICogaW5zdGFuY2Ugb2Yge0Bjb2RlIFNpbXBsZURhdGVGb3JtYXR9IGFuZCBoYXZlIHRoZSBzYW1lIHtAY29kZSBEYXRlRm9ybWF0fQorICAgICAqIHByb3BlcnRpZXMsIHBhdHRlcm4sIHtAY29kZSBEYXRlRm9ybWF0U3ltYm9sc30gYW5kIGNyZWF0aW9uIHllYXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBTaW1wbGVEYXRlRm9ybWF0LAotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHNpbXBsZSBkYXRlCisgICAgICogICAgICAgICBmb3JtYXQ7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgI2hhc2hDb2RlCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKQEAgLTQwOSwxOSArNjk2LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCB1c2luZyB0aGUgcnVsZXMgb2YgdGhpcyBTaW1wbGVEYXRlRm9ybWF0IGFuZAotICAgICAqIHJldHVybnMgYW4gQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHdpdGggdGhlIGZvcm1hdHRlZCBEYXRlIGFuZAotICAgICAqIGF0dHJpYnV0ZXMuCisgICAgICogRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCB1c2luZyB0aGUgcnVsZXMgb2YgdGhpcyBzaW1wbGUgZGF0ZSBmb3JtYXQKKyAgICAgKiBhbmQgcmV0dXJucyBhbiB7QGNvZGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yfSB3aXRoIHRoZSBmb3JtYXR0ZWQKKyAgICAgKiBkYXRlIGFuZCBhdHRyaWJ1dGVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gZm9ybWF0Ci0gICAgICogQHJldHVybiBhbiBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igd2l0aCB0aGUgZm9ybWF0dGVkIGRhdGUgYW5kCi0gICAgICogICAgICAgICBhdHRyaWJ1dGVzCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBpcyBudWxsCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGZvcm1hdC4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3J9IHdpdGggdGhlIGZvcm1hdHRlZCBkYXRlCisgICAgICogICAgICAgICBhbmQgYXR0cmlidXRlcy4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG9iamVjdCBjYW5ub3QgYmUgZm9ybWF0dGVkIGJ5IHRoaXMgRm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzaW1wbGUgZGF0ZQorICAgICAqICAgICAgICAgICAgICAgIGZvcm1hdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewpAQCAtNDYxLDIxICs3NDcsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgRGF0ZSBpbnRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyIHVzaW5nIHRoZQotICAgICAqIHBhdHRlcm4gb2YgdGhpcyBTaW1wbGVEYXRlRm9ybWF0LiBJZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIEZpZWxkUG9zaXRpb24gaXMgZm9ybWF0dGVkLCBzZXQgdGhlIGJlZ2luIGFuZCBlbmQgaW5kZXggb2YgdGhlIGZvcm1hdHRlZAotICAgICAqIGZpZWxkIGluIHRoZSBGaWVsZFBvc2l0aW9uLgorICAgICAqIEZvcm1hdHMgdGhlIHNwZWNpZmllZCBkYXRlIGFzIGEgc3RyaW5nIHVzaW5nIHRoZSBwYXR0ZXJuIG9mIHRoaXMgZGF0ZQorICAgICAqIGZvcm1hdCBhbmQgYXBwZW5kcyB0aGUgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIGZpZWxkfSBtZW1iZXIgb2Yge0Bjb2RlIGZpZWxkfSBjb250YWlucyBhIHZhbHVlIHNwZWNpZnlpbmcKKyAgICAgKiBhIGZvcm1hdCBmaWVsZCwgdGhlbiBpdHMge0Bjb2RlIGJlZ2luSW5kZXh9IGFuZCB7QGNvZGUgZW5kSW5kZXh9IG1lbWJlcnMKKyAgICAgKiB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyBmaWVsZAorICAgICAqIGluIHRoZSBmb3JtYXR0ZWQgdGV4dC4KKyAgICAgKiA8L3A+CiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRlIHRvIGZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGRhdGUgdG8gZm9ybWF0LgogICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmdCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgdG8uCiAgICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgRmllbGRQb3NpdGlvbgotICAgICAqIEByZXR1cm4gdGhlIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXIgPGNvZGU+YnVmZmVyPC9jb2RlPgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgaW52YWxpZCBjaGFyYWN0ZXJzIGluIHRoZSBwYXR0ZXJuCisgICAgICogICAgICAgICAgICBvbiBpbnB1dDogYW4gb3B0aW9uYWwgYWxpZ25tZW50IGZpZWxkOyBvbiBvdXRwdXQ6IHRoZSBvZmZzZXRzCisgICAgICogICAgICAgICAgICBvZiB0aGUgYWxpZ25tZW50IGZpZWxkIGluIHRoZSBmb3JtYXR0ZWQgdGV4dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlcmUgYXJlIGludmFsaWQgY2hhcmFjdGVycyBpbiB0aGUgcGF0dGVybi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChEYXRlIGRhdGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsCkBAIC00ODQsNyArNzc1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGUgZm9ybWF0IGNoYXJhY3Rlci4KKyAgICAgKiBWYWxpZGF0ZXMgdGhlIGZvcm1hdCBjaGFyYWN0ZXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIGZvcm1hdAogICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBjaGFyYWN0ZXIKQEAgLTUwMiw3ICs3OTMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBwYXR0ZXJuLgorICAgICAqIFZhbGlkYXRlcyB0aGUgcGF0dGVybi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGVtcGxhdGUKICAgICAgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHRvIHZhbGlkYXRlLgpAQCAtNTY1LDExICs4NTYsMTEgQEAKICAgICAvKioKICAgICAgKiBGb3JtYXRzIHRoZSBkYXRlLgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBGaWVsZFBvc2l0aW9uIDxjb2RlPmZpZWxkPC9jb2RlPiBpcyBub3QgbnVsbCwgYW5kIHRoZSBmaWVsZAorICAgICAqIElmIHRoZSBGaWVsZFBvc2l0aW9uIHtAY29kZSBmaWVsZH0gaXMgbm90IG51bGwsIGFuZCB0aGUgZmllbGQKICAgICAgKiBzcGVjaWZpZWQgYnkgdGhpcyBGaWVsZFBvc2l0aW9uIGlzIGZvcm1hdHRlZCwgc2V0IHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4CiAgICAgICogb2YgdGhlIGZvcm1hdHRlZCBmaWVsZCBpbiB0aGUgRmllbGRQb3NpdGlvbi4KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgVmVjdG9yIDxjb2RlPmZpZWxkczwvY29kZT4gaXMgbm90IG51bGwsIGZpbmQgZmllbGRzIG9mIHRoaXMKKyAgICAgKiBJZiB0aGUgVmVjdG9yIHtAY29kZSBmaWVsZHN9IGlzIG5vdCBudWxsLCBmaW5kIGZpZWxkcyBvZiB0aGlzCiAgICAgICogZGF0ZSwgc2V0IEZpZWxkUG9zaXRpb25zIHdpdGggdGhlc2UgZmllbGRzLCBhbmQgYWRkIHRoZW0gdG8gdGhlIGZpZWxkcwogICAgICAqIHZlY3Rvci4KICAgICAgKiAKQEAgLTY0MywzMyArOTM0LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRGF0ZSB3aGljaCBpcyB0aGUgc3RhcnQgb2YgdGhlIG9uZSBodW5kcmVkIHllYXIgcGVyaW9kIGZvcgorICAgICAqIFJldHVybnMgdGhlIGRhdGUgd2hpY2ggaXMgdGhlIHN0YXJ0IG9mIHRoZSBvbmUgaHVuZHJlZCB5ZWFyIHBlcmlvZCBmb3IKICAgICAgKiB0d28gZGlnaXRzIHllYXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBEYXRlCisgICAgICogQHJldHVybiBhIGRhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERhdGUgZ2V0MkRpZ2l0WWVhclN0YXJ0KCkgewogICAgICAgICByZXR1cm4gZGVmYXVsdENlbnR1cnlTdGFydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBEYXRlRm9ybWF0U3ltYm9scyB1c2VkIGJ5IHRoaXMgU2ltcGxlRGF0ZUZvcm1hdC4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgRGF0ZUZvcm1hdFN5bWJvbHN9IHVzZWQgYnkgdGhpcyBzaW1wbGUgZGF0ZSBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERhdGVGb3JtYXRTeW1ib2xzCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERhdGVGb3JtYXRTeW1ib2xzfSBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERhdGVGb3JtYXRTeW1ib2xzIGdldERhdGVGb3JtYXRTeW1ib2xzKCkgewogICAgICAgICAvLyBSZXR1cm4gYSBjbG9uZSBzbyB0aGUgYXJyYXlzIGluIHRoZSBSZXNvdXJjZUJ1bmRsZSBhcmUgbm90IG1vZGlmaWVkCiAgICAgICAgIHJldHVybiAoRGF0ZUZvcm1hdFN5bWJvbHMpIGZvcm1hdERhdGEuY2xvbmUoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogYW5zd2VyIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAgICAgKiAKLSAgICAgKiBAc2VlICNlcXVhbHMKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArIHBhdHRlcm4uaGFzaENvZGUoKSArIGZvcm1hdERhdGEuaGFzaENvZGUoKQpAQCAtODAyLDIxICsxMDg3LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2UgYSBEYXRlIGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgc3RhcnRpbmcgYXQgdGhlIGluZGV4IHNwZWNpZmllZCBieQotICAgICAqIHRoZSBQYXJzZVBvc2l0aW9uLiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgKiBQYXJzZVBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkIHRleHQuCisgICAgICogUGFyc2VzIGEgZGF0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBzcGVjaWZpZWQKKyAgICAgKiBieSB7QGNvZGUgcG9zaXRpb259LiBJZiB0aGUgc3RyaW5nIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgdGhlbiB0aGUgaW5kZXgKKyAgICAgKiBvZiB0aGUge0Bjb2RlIFBhcnNlUG9zaXRpb259IGlzIHVwZGF0ZWQgdG8gdGhlIGluZGV4IGZvbGxvd2luZyB0aGUgcGFyc2VkCisgICAgICogdGV4dC4gT24gZXJyb3IsIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZSBlcnJvciBpbmRleCBvZiB7QGNvZGUKKyAgICAgKiBQYXJzZVBvc2l0aW9ufSBpcyBzZXQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHBhcnNlIGFjY29yZGluZyB0byB0aGUgcGF0dGVybiBvZiB0aGlzCi0gICAgICogICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHBhcnNlIHVzaW5nIHRoZSBwYXR0ZXJuIG9mIHRoaXMgc2ltcGxlIGRhdGUKKyAgICAgKiAgICAgICAgICAgIGZvcm1hdC4KICAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBQYXJzZVBvc2l0aW9uLCB1cGRhdGVkIG9uIHJldHVybiB3aXRoIHRoZSBpbmRleCBmb2xsb3dpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgdGV4dCwgb3Igb24gZXJyb3IgdGhlIGluZGV4IGlzIHVuY2hhbmdlZCBhbmQgdGhlCi0gICAgICogICAgICAgICAgICBlcnJvciBpbmRleCBpcyBzZXQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZAotICAgICAqIEByZXR1cm4gdGhlIERhdGUgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNlLCBvciBudWxsIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGFyZSBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gdGhlIHBhdHRlcm4KKyAgICAgKiAgICAgICAgICAgIGlucHV0L291dHB1dCBwYXJhbWV0ZXIsIHNwZWNpZmllcyB0aGUgc3RhcnQgaW5kZXggaW4ge0Bjb2RlCisgICAgICogICAgICAgICAgICBzdHJpbmd9IGZyb20gd2hlcmUgdG8gc3RhcnQgcGFyc2luZy4gSWYgcGFyc2luZyBpcyBzdWNjZXNzZnVsLAorICAgICAqICAgICAgICAgICAgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIHBhcnNlZCB0ZXh0OyBvbgorICAgICAqICAgICAgICAgICAgZXJyb3IsIHRoZSBpbmRleCBpcyB1bmNoYW5nZWQgYW5kIHRoZSBlcnJvciBpbmRleCBpcyBzZXQgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgZGF0ZSByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2UsIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBhbgorICAgICAqICAgICAgICAgZXJyb3IuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgaW52YWxpZCBjaGFyYWN0ZXJzIGluIHRoZSBwYXR0ZXJuLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEYXRlIHBhcnNlKFN0cmluZyBzdHJpbmcsIFBhcnNlUG9zaXRpb24gcG9zaXRpb24pIHsKQEAgLTk1MSw5ICsxMjQxLDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGludCBwYXJzZVRpbWVab25lKFN0cmluZyBzdHJpbmcsIGludCBvZmZzZXQpIHsKLS8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgU3RyaW5nW11bXSB6b25lcyA9IGZvcm1hdERhdGEuaW50ZXJuYWxab25lU3RyaW5ncygpOwotLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGJvb2xlYW4gZm91bmRHTVQgPSBzdHJpbmcucmVnaW9uTWF0Y2hlcyhvZmZzZXQsICJHTVQiLCAwLCAzKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICBpZiAoZm91bmRHTVQpIHsKICAgICAgICAgICAgIG9mZnNldCArPSAzOwpAQCAtMTAxMSwxMSArMTMwMSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIERhdGUgd2hpY2ggaXMgdGhlIHN0YXJ0IG9mIHRoZSBvbmUgaHVuZHJlZCB5ZWFyIHBlcmlvZCBmb3IgdHdvCisgICAgICogU2V0cyB0aGUgZGF0ZSB3aGljaCBpcyB0aGUgc3RhcnQgb2YgdGhlIG9uZSBodW5kcmVkIHllYXIgcGVyaW9kIGZvciB0d28KICAgICAgKiBkaWdpdHMgeWVhciB2YWx1ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGRhdGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0MkRpZ2l0WWVhclN0YXJ0KERhdGUgZGF0ZSkgewogICAgICAgICBkZWZhdWx0Q2VudHVyeVN0YXJ0ID0gZGF0ZTsKQEAgLTEwMjUsMjAgKzEzMTYsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBEYXRlRm9ybWF0U3ltYm9scyB1c2VkIGJ5IHRoaXMgU2ltcGxlRGF0ZUZvcm1hdC4KKyAgICAgKiBTZXRzIHRoZSB7QGNvZGUgRGF0ZUZvcm1hdFN5bWJvbHN9IHVzZWQgYnkgdGhpcyBzaW1wbGUgZGF0ZSBmb3JtYXQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgRGF0ZUZvcm1hdFN5bWJvbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcge0Bjb2RlIERhdGVGb3JtYXRTeW1ib2xzfSBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0ZUZvcm1hdFN5bWJvbHMoRGF0ZUZvcm1hdFN5bWJvbHMgdmFsdWUpIHsKICAgICAgICAgZm9ybWF0RGF0YSA9IChEYXRlRm9ybWF0U3ltYm9scykgdmFsdWUuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXR0ZXJuIG9mIHRoaXMgU2ltcGxlRGF0ZUZvcm1hdCB1c2luZyBsb2NhbGl6ZWQgcGF0dGVybgorICAgICAqIFJldHVybnMgdGhlIHBhdHRlcm4gb2YgdGhpcyBzaW1wbGUgZGF0ZSBmb3JtYXQgdXNpbmcgbG9jYWxpemVkIHBhdHRlcm4KICAgICAgKiBjaGFyYWN0ZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBwYXR0ZXJuCisgICAgICogQHJldHVybiB0aGUgbG9jYWxpemVkIHBhdHRlcm4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b0xvY2FsaXplZFBhdHRlcm4oKSB7CiAgICAgICAgIHJldHVybiBjb252ZXJ0UGF0dGVybihwYXR0ZXJuLCBwYXR0ZXJuQ2hhcnMsIGZvcm1hdERhdGEKQEAgLTEwNDYsMTAgKzEzMzksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXR0ZXJuIG9mIHRoaXMgU2ltcGxlRGF0ZUZvcm1hdCB1c2luZyBub24tbG9jYWxpemVkIHBhdHRlcm4KLSAgICAgKiBjaGFyYWN0ZXJzLgorICAgICAqIFJldHVybnMgdGhlIHBhdHRlcm4gb2YgdGhpcyBzaW1wbGUgZGF0ZSBmb3JtYXQgdXNpbmcgbm9uLWxvY2FsaXplZAorICAgICAqIHBhdHRlcm4gY2hhcmFjdGVycy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBub24tbG9jYWxpemVkIHBhdHRlcm4KKyAgICAgKiBAcmV0dXJuIHRoZSBub24tbG9jYWxpemVkIHBhdHRlcm4uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1BhdHRlcm4oKSB7CiAgICAgICAgIHJldHVybiBwYXR0ZXJuOwpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5qYXZhIGIvdGV4dC9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5qYXZhCmluZGV4IGE0ZDNiNjguLjVkMDJjZWIgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IuamF2YQorKysgYi90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1N0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yLmphdmEKQEAgLTE4LDggKzE4LDkgQEAKIHBhY2thZ2UgamF2YS50ZXh0OwogCiAvKioKLSAqIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIENoYXJhY3Rlckl0ZXJhdG9yIGZvcgotICogU3RyaW5ncy4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDaGFyYWN0ZXJJdGVyYXRvcn0gZm9yIHN0cmluZ3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgaW1wbGVtZW50cyBDaGFyYWN0ZXJJdGVyYXRvciB7CiAKQEAgLTI4LDEyICsyOSwxMyBAQAogICAgIGludCBzdGFydCwgZW5kLCBvZmZzZXQ7CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgU3RyaW5nLiBUaGUKLSAgICAgKiBiZWdpbiBhbmQgY3VycmVudCBpbmRleGVzIGFyZSBzZXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgU3RyaW5nLCB0aGUgZW5kCi0gICAgICogaW5kZXggaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIFN0cmluZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcn0gb24gdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogVGhlIGJlZ2luIGFuZCBjdXJyZW50IGluZGljZXMgYXJlIHNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIHRoZQorICAgICAqIGVuZCBpbmRleCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzb3VyY2UgU3RyaW5nIHRvIGl0ZXJhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugc3RyaW5nIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIHN0cmluZyA9IHZhbHVlOwpAQCAtNDIsMTggKzQ0LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIFN0cmluZyB3aXRoIHRoZQotICAgICAqIGN1cnJlbnQgaW5kZXggc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIFRoZSBiZWdpbiBpbmRleCBpcyBzZXQgdG8gdGhlCi0gICAgICogYmVnaW5uaW5nIG9mIHRoZSBTdHJpbmcsIHRoZSBlbmQgaW5kZXggaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIFN0cmluZy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcn0gb24gdGhlIHNwZWNpZmllZCBzdHJpbmcKKyAgICAgKiB3aXRoIHRoZSBjdXJyZW50IGluZGV4IHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBUaGUgYmVnaW4gaW5kZXggaXMgc2V0CisgICAgICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCB0aGUgZW5kIGluZGV4IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAgICAqIHN0cmluZy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc291cmNlIFN0cmluZyB0byBpdGVyYXRlCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIHN0cmluZyB0byBpdGVyYXRlIG92ZXIuCiAgICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgY3VycmVudCBpbmRleAotICAgICAqIAorICAgICAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgaW5kZXguCiAgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHRoZSBjdXJyZW50IGluZGV4IGlzIGxlc3MgdGhhbiB6ZXJvIG9yIGdyZWF0ZXIgdGhhbgotICAgICAqICAgICAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIFN0cmluZworICAgICAqICAgICAgICAgICAgICAgIGlmIHtAY29kZSBsb2NhdGlvbn0gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgICAgICBvZiB0aGUgc291cmNlIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoU3RyaW5nIHZhbHVlLCBpbnQgbG9jYXRpb24pIHsKICAgICAgICAgc3RyaW5nID0gdmFsdWU7CkBAIC02NiwyMyArNjksMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHdpdGggdGhlCi0gICAgICogYmVnaW4sIGVuZCBhbmQgY3VycmVudCBpbmRleCBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3J9IG9uIHRoZSBzcGVjaWZpZWQgc3RyaW5nCisgICAgICogd2l0aCB0aGUgYmVnaW4sIGVuZCBhbmQgY3VycmVudCBpbmRleCBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHNvdXJjZSBTdHJpbmcgdG8gaXRlcmF0ZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBzdHJpbmcgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAqIEBwYXJhbSBzdGFydAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gaXRlcmF0ZQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gaXRlcmF0ZS4KICAgICAgKiBAcGFyYW0gZW5kCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggb25lIHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIGl0ZXJhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gaXRlcmF0ZS4KICAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGluZGV4Ci0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgY3VycmVudCBpbmRleC4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIGJlZ2luIGluZGV4IGlzIGxlc3MgdGhhbiB6ZXJvLCB0aGUgZW5kIGluZGV4IGlzCi0gICAgICogICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHRoZSBTdHJpbmcgbGVuZ3RoLCB0aGUgYmVnaW4gaW5kZXggaXMgZ3JlYXRlcgotICAgICAqICAgICAgICAgICAgICAgIHRoYW4gdGhlIGVuZCBpbmRleCwgdGhlIGN1cnJlbnQgaW5kZXggaXMgbGVzcyB0aGFuIHRoZQotICAgICAqICAgICAgICAgICAgICAgIGJlZ2luIGluZGV4IG9yIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIGluZGV4CisgICAgICogICAgICAgICAgICAgICAgaWYge0Bjb2RlIHN0YXJ0IDwgMH0sIHtAY29kZSBzdGFydCA+IGVuZH0sCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIGxvY2F0aW9uIDwgc3RhcnR9LCB7QGNvZGUgbG9jYXRpb24gPiBlbmR9IG9yIGlmCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIGVuZH0gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2Yge0Bjb2RlIHZhbHVlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoU3RyaW5nIHZhbHVlLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgICAgICAgICBpbnQgbG9jYXRpb24pIHsKQEAgLTk3LDEyICs5OSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3Igd2l0aCB0aGUgc2FtZSBzb3VyY2UgU3RyaW5nLCBiZWdpbiwKLSAgICAgKiBlbmQsIGFuZCBjdXJyZW50IGluZGV4IGFzIHRoaXMgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IuCisgICAgICogUmV0dXJucyBhIG5ldyB7QGNvZGUgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3J9IHdpdGggdGhlIHNhbWUgc291cmNlCisgICAgICogc3RyaW5nLCBiZWdpbiwgZW5kLCBhbmQgY3VycmVudCBpbmRleCBhcyB0aGlzIGl0ZXJhdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcgotICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBpdGVyYXRvci4KICAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewpAQCAtMTE0LDEwICsxMTYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIHNvdXJjZSBTdHJpbmcuCisgICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyLCBvciBET05FIGlmIHRoZSBjdXJyZW50IGluZGV4IGlzIHBhc3QgdGhlCi0gICAgICogICAgICAgICBlbmQKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNoYXJhY3Rlciwgb3Ige0Bjb2RlIERPTkV9IGlmIHRoZSBjdXJyZW50IGluZGV4IGlzCisgICAgICogICAgICAgICBwYXN0IHRoZSBlbmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgY3VycmVudCgpIHsKICAgICAgICAgaWYgKG9mZnNldCA9PSBlbmQpIHsKQEAgLTEyNywxNiArMTMwLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBhbmQgYW5zd2VyCi0gICAgICogaWYgdGhleSBhcmUgZXF1YWwuIFRoZSBvYmplY3QgbXVzdCBiZSBhIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdGluZwotICAgICAqIG92ZXIgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB3aXRoIHRoZSBzYW1lIGluZGV4LgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyB7QGNvZGUgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3J9CisgICAgICogYW5kIGluZGljYXRlcyBpZiB0aGV5IGFyZSBlcXVhbC4gSW4gb3JkZXIgdG8gYmUgZXF1YWwsIHtAY29kZSBvYmplY3R9CisgICAgICogbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3J9IHRoYXQgaXRlcmF0ZXMgb3ZlcgorICAgICAqIHRoZSBzYW1lIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgd2l0aCB0aGUgc2FtZSBpbmRleC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCi0gICAgICogICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICB7QGNvZGUgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3J9OyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiBAc2VlICNoYXNoQ29kZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CkBAIC0xNTAsOSArMTU0LDExIEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBiZWdpbiBpbmRleCBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0Ci0gICAgICogdGhlIGJlZ2luIGluZGV4LgorICAgICAqIHRoZSBuZXcgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbiBpbmRleAorICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgYmVnaW4gaW5kZXggb3Ige0Bjb2RlIERPTkV9IGlmIHRoZSBiZWdpbgorICAgICAqICAgICAgICAgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGVuZCBpbmRleC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBmaXJzdCgpIHsKICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewpAQCAtMTYzLDQwICsxNjksMzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiZWdpbiBpbmRleCBpbiB0aGUgc291cmNlIFN0cmluZy4KKyAgICAgKiBSZXR1cm5zIHRoZSBiZWdpbiBpbmRleCBpbiB0aGUgc291cmNlIHN0cmluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGl0ZXJhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBpdGVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRCZWdpbkluZGV4KCkgewogICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW5kIGluZGV4IGluIHRoZSBzb3VyY2UgU3RyaW5nLgorICAgICAqIFJldHVybnMgdGhlIGVuZCBpbmRleCBpbiB0aGUgc291cmNlIHN0cmluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gaXRlcmF0ZQorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9uZSBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgaXRlcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKSB7CiAgICAgICAgIHJldHVybiBlbmQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgc291cmNlIFN0cmluZy4KKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGluZGV4LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CiAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBPYmplY3RzIHdoaWNoIGFyZSBlcXVhbAotICAgICAqIGFuc3dlciB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gICAgICogCi0gICAgICogQHNlZSAjZXF1YWxzCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIHN0cmluZy5oYXNoQ29kZSgpICsgc3RhcnQgKyBlbmQgKyBvZmZzZXQ7CkBAIC0yMDQsMTEgKzIwNSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgZW5kIGluZGV4IC0gMSBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyCi0gICAgICogYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogYXQgdGhlIG5ldyBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBlbmQgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBlbmQgaW5kZXggb3Ige0Bjb2RlIERPTkV9IGlmIHRoZSBiZWdpbgorICAgICAqICAgICAgICAgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGVuZCBpbmRleC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgY2hhciBsYXN0KCkgeworICAgcHVibGljIGNoYXIgbGFzdCgpIHsKICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICAgICAgICAgcmV0dXJuIERPTkU7CiAgICAgICAgIH0KQEAgLTIxNiwxMyArMjE5LDE0IEBACiAgICAgICAgIHJldHVybiBzdHJpbmcuY2hhckF0KG9mZnNldCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogSW5jcmVtZW50cyB0aGUgY3VycmVudCBpbmRleCBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXcgaW5kZXguCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXh0IGluZGV4LCBvciBET05FIGlmIHRoZSBuZXh0IGluZGV4IGlzCi0gICAgICogICAgICAgICBwYXN0IHRoZSBlbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgY2hhciBuZXh0KCkgeworICAgLyoqCisgICAgKiBJbmNyZW1lbnRzIHRoZSBjdXJyZW50IGluZGV4IGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5ldyBpbmRleC4KKyAgICAqIAorICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXh0IGluZGV4LCBvciB7QGNvZGUgRE9ORX0gaWYgdGhlIG5leHQKKyAgICAqICAgICAgICAgaW5kZXggd291bGQgYmUgcGFzdCB0aGUgZW5kLgorICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgKi8KKyAgIHB1YmxpYyBjaGFyIG5leHQoKSB7CiAgICAgICAgIGlmIChvZmZzZXQgPj0gKGVuZCAtIDEpKSB7CiAgICAgICAgICAgICBvZmZzZXQgPSBlbmQ7CiAgICAgICAgICAgICByZXR1cm4gRE9ORTsKQEAgLTIzMCwxMiArMjM0LDEzIEBACiAgICAgICAgIHJldHVybiBzdHJpbmcuY2hhckF0KCsrb2Zmc2V0KTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBEZWNyZW1lbnRzIHRoZSBjdXJyZW50IGluZGV4IGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5ldyBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHByZXZpb3VzIGluZGV4LCBvciBET05FIGlmIHRoZSBwcmV2aW91cwotICAgICAqICAgICAgICAgaW5kZXggaXMgcGFzdCB0aGUgYmVnaW5uaW5nCi0gICAgICovCisgICAvKioKKyAgICAqIERlY3JlbWVudHMgdGhlIGN1cnJlbnQgaW5kZXggYW5kIHJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgbmV3IGluZGV4LgorICAgICogCisgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHByZXZpb3VzIGluZGV4LCBvciB7QGNvZGUgRE9ORX0gaWYgdGhlCisgICAgKiAgICAgICAgIHByZXZpb3VzIGluZGV4IHdvdWxkIGJlIHBhc3QgdGhlIGJlZ2lubmluZy4KKyAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICovCiAgICAgcHVibGljIGNoYXIgcHJldmlvdXMoKSB7CiAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQpIHsKICAgICAgICAgICAgIHJldHVybiBET05FOwpAQCAtMjQ0LDE0ICsyNDksMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBzb3VyY2UgU3RyaW5nLgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXcgaW5kZXgsIG9yIERPTkUgaWYgdGhlIGluZGV4IGlzIHBhc3QgdGhlCi0gICAgICogICAgICAgICBlbmQKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBzZXQgdG8uCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBuZXcgaW5kZXgsIG9yIHtAY29kZSBET05FfSBpZgorICAgICAqICAgICAgICAge0Bjb2RlIGxvY2F0aW9ufSBpcyBzZXQgdG8gdGhlIGVuZCBpbmRleC4KICAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIHdoZW4gdGhlIG5ldyBpbmRleCBpcyBsZXNzIHRoYW4gdGhlIGJlZ2luIGluZGV4IG9yIGdyZWF0ZXIKLSAgICAgKiAgICAgICAgICAgICAgICB0aGFuIHRoZSBlbmQgaW5kZXgKKyAgICAgKiAgICAgICAgICAgICAgICBpZiB7QGNvZGUgbG9jYXRpb259IGlzIHNtYWxsZXIgdGhhbiB0aGUgYmVnaW4gaW5kZXggb3IKKyAgICAgKiAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdGhlIGVuZCBpbmRleC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBzZXRJbmRleChpbnQgbG9jYXRpb24pIHsKICAgICAgICAgaWYgKGxvY2F0aW9uIDwgc3RhcnQgfHwgbG9jYXRpb24gPiBlbmQpIHsKQEAgLTI2NSwxMSArMjcyLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc291cmNlIFN0cmluZyB0byBpdGVyYXRlLiBUaGUgYmVnaW4gYW5kIGVuZCBwb3NpdGlvbnMgYXJlIHNldCB0bwotICAgICAqIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoaXMgU3RyaW5nLgorICAgICAqIFNldHMgdGhlIHNvdXJjZSBzdHJpbmcgdG8gaXRlcmF0ZSBvdmVyLiBUaGUgYmVnaW4gYW5kIGVuZCBwb3NpdGlvbnMgYXJlCisgICAgICogc2V0IHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoaXMgc3RyaW5nLgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzb3VyY2UgU3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNvdXJjZSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpIHsKICAgICAgICAgc3RyaW5nID0gdmFsdWU7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy9tYWluL2phdmEvamF2YS90ZXh0L3BhY2thZ2UuaHRtbCBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvcGFja2FnZS5odG1sCmluZGV4IDI5MDlkNTIuLjJiY2Q4ZjkgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvcGFja2FnZS5odG1sCisrKyBiL3RleHQvc3JjL21haW4vamF2YS9qYXZhL3RleHQvcGFja2FnZS5odG1sCkBAIC0xLDE2ICsxLDE3IEBACiA8aHRtbD4KICAgPGJvZHk+CiAgIDxwPgotICAgIFRoZSBqYXZhLnRleHQgcGFja2FnZSBhbGxvd3MgdG8gdW5jb3VwbGUgdGhlIHRleHQgaW4gdGhlCi0gICAgYXBwbGljYXRpb24gZnJvbSBhIG5hdHVyYWwgbGFuZ3VhZ2UuCisgICAgVGhlIGphdmEudGV4dCBwYWNrYWdlIGFsbG93cyB0byB1bmNvdXBsZSB0aGUgdGV4dCBpbiBhbiBhcHBsaWNhdGlvbiAKKyAgICBmcm9tIG5hdHVyYWwgbGFuZ3VhZ2VzLgogICA8L3A+CiAgIDxwPgotICAgIFdpdGggdGhpcyBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSB0aGUgYXBwbGljYXRpb24gaW4gYW4KLSAgICB1bmxvY2FsaXplZCB3YXkuIExpa2UgdGhpcyBhIG5ldyBsb2NhbGl6YXRpb24gY2FuIGJlIHByb3ZpZGVkIGF0IGFueQotICAgIHRpbWUgd2l0aG91dCBoYXZpbmcgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoZSBjb2RlLiBTdXBwb3J0IGZvcgotICAgIGxvY2FsaXphdGlvbiBpcyBnaXZlbiBmb3IgbnVtYmVycywgbWVzc2FnZXMsIGRhdGVzIGFuZCBhbHNvCi0gICAgY2hhcmFjdGVyaXN0aWNzIG9mIGEgbGFuZ3VhZ2UgbGlrZSB0aGUgZGlyZWN0aW9uYWxpdHksIHNvcnRpbmcgb3JkZXIgb3IKLSAgICBlbnVtZXJhdGlvbiBvZiBjaGFyYWN0ZXJzLCB3b3JkcyBvciBsaW5lcy4KKyAgICBCeSB1c2luZyB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIHRoZQorICAgIGFwcGxpY2F0aW9uIGluIGFuIHVubG9jYWxpemVkIHdheS4gVGhlIGJlbmVmaXQgb2YgdGhpcyBpcyB0aGF0IGEgbmV3IAorICAgIGxvY2FsaXphdGlvbiBjYW4gYmUgcHJvdmlkZWQgYXQgYW55IHRpbWUgd2l0aG91dCBoYXZpbmcgdG8gY2hhbmdlIHRoZSAKKyAgICBjb2RlLiBTdXBwb3J0IGZvciBsb2NhbGl6YXRpb24gaXMgZ2l2ZW4gZm9yIG51bWJlcnMsIG1lc3NhZ2VzLCBkYXRlcyBhbmQgCisgICAgb3RoZXIgY2hhcmFjdGVyaXN0aWNzIG9mIGEgbGFuZ3VhZ2UgbGlrZSB0aGUgZGlyZWN0aW9uYWxpdHksIHNvcnRpbmcgb3JkZXIKKyAgICBvciBlbnVtZXJhdGlvbiBvZiBjaGFyYWN0ZXJzLCB3b3JkcyBvciBsaW5lcy4KICAgPC9wPgorICBAc2luY2UgQW5kcm9pZCAxLjAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL3RleHQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YSBiL3RleHQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQppbmRleCBlZDFmNTMyLi45NWE4YWQ2IDEwMDY0NAotLS0gYS90ZXh0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvdGV4dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCkBAIC0yMSw5ICsyMSwyMSBAQAogICogaWYgdGhpcyB0b29sIHJ1bnMgYWdhaW4uIEJldHRlciBtYWtlIGNoYW5nZXMgaW4gdGhlIHRlbXBsYXRlIGZpbGUuCiAgKi8KIAorLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisvLyBSZWR1bmRhbnQgY29kZSBoYXMgYmVlbiByZW1vdmVkIGFuZCBpcyBub3cgY2FsbGVkIGZyb20gTXNnSGVscC4KKy8vIEVORCBhbmRyb2lkLW5vdGUKKwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC5pbnRlcm5hbC5ubHM7CiAKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEVORCBhbmRyb2lkLWNoYW5nZWQKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgYW5kIHJldHVybnMgdGhlbSwKQEAgLTQxLDggKzUzLDEwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1Jlc291cmNlID0KICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKyAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdoaWNoIGhhcyBubyBhcmd1bWVudHMuCkBAIC01Miw3ICs2Niw5IEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKQEAgLTExOSw2ICsxMzUsMTIgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnLCBhcmdzKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KKworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIER1cGxpY2F0ZSBjb2RlIHdhcyBkcm9wcGVkIGluIGZhdm9yIG9mIHVzaW5nIE1zZ0hlbHAuCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogfQpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BbGxUZXN0cy5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BbGxUZXN0cy5qYXZhCmluZGV4IGNlZjYxOTEuLmViYzA5OTMgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQWxsVGVzdHMuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0FsbFRlc3RzLmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERhdGVGb3JtYXRUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERlY2ltYWxGb3JtYXRTeW1ib2xzVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShEZWNpbWFsRm9ybWF0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShEZWNpbWFsRm9ybWF0VGVzdElDVS5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGaWVsZFBvc2l0aW9uVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGb3JtYXRGaWVsZFRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRm9ybWF0VGVzdC5jbGFzcyk7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Fubm90YXRpb25UZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Fubm90YXRpb25UZXN0LmphdmEKaW5kZXggYzdkOGY4NC4uZGY3Nzg4NSAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Bbm5vdGF0aW9uVGVzdC5qYXZhCisrKyBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQW5ub3RhdGlvblRlc3QuamF2YQpAQCAtMTcsMTUgKzE3LDMwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCi1pbXBvcnQgamF2YS50ZXh0LkFubm90YXRpb247CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS50ZXh0LkFubm90YXRpb247CisKK0BUZXN0VGFyZ2V0Q2xhc3MoQW5ub3RhdGlvbi5jbGFzcykKIHB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQW5ub3RhdGlvbihPYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkFubm90YXRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24oKSB7CiAgICAgICAgIGFzc2VydE5vdE51bGwobmV3IEFubm90YXRpb24obnVsbCkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBBbm5vdGF0aW9uKCJ2YWx1ZSIpKTsKQEAgLTM0LDYgKzQ5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5Bbm5vdGF0aW9uLmdldFZhbHVlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VmFsdWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7CiAgICAgICAgIEFubm90YXRpb24gYSA9IG5ldyBBbm5vdGF0aW9uKG51bGwpOwogICAgICAgICBhc3NlcnROdWxsKGEuZ2V0VmFsdWUoKSk7CkBAIC00NCw2ICs2OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQW5ub3RhdGlvbi50b1N0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewogICAgICAgICBBbm5vdGF0aW9uIGFudCA9IG5ldyBBbm5vdGF0aW9uKCJIZWxsb1dvcmxkIik7CiAgICAgICAgIGFzc2VydEVxdWFscygidG9TdHJpbmcgZXJyb3IuIiwKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yQXR0cmlidXRlVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JBdHRyaWJ1dGVUZXN0LmphdmEKaW5kZXggOTY4ZGU0Yy4uMjMyNTdhNiAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JBdHRyaWJ1dGVUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JBdHRyaWJ1dGVUZXN0LmphdmEKQEAgLTE2LDExICsxNiwxNSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEuaW8uSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwotaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwogCitAVGVzdFRhcmdldENsYXNzKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUuY2xhc3MpIAogcHVibGljIGNsYXNzIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvckF0dHJpYnV0ZVRlc3QgZXh0ZW5kcwogICAgICAgICBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCkBAIC01OCw2ICs2MiwxNSBAQAogICAgICAqICAgICAgICBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZSNBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBdHRyaWJ1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBNb2NrQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yQXR0cmlidXRlKCJ0ZXN0Iik7CkBAIC03MSw2ICs4NCwxNSBAQAogICAgICAqICAgICAgICBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZSNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTW9ja0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvckF0dHJpYnV0ZSBtYWMxID0gbmV3IE1vY2tBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JBdHRyaWJ1dGUoCkBAIC05Nyw2ICsxMTksMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUjZ2V0TmFtZSgpIFRlc3Qgb2YKICAgICAgKiAgICAgICAgbWV0aG9kIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlI2dldE5hbWUoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE1vY2tBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JBdHRyaWJ1dGUgbWFjMSA9IG5ldyBNb2NrQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yQXR0cmlidXRlKApAQCAtMTEwLDYgKzE0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZSNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE1vY2tBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JBdHRyaWJ1dGUgbWFjMSA9IG5ldyBNb2NrQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yQXR0cmlidXRlKApAQCAtMTQwLDYgKzE4MCwxNSBAQAogICAgICAqICAgICAgICBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUjcmVhZFJlc29sdmUoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJDaGVja3MgSW52YWxpZE9iamVjdEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkUmVzb2x2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZFJlc29sdmUoKSB7CiAgICAgICAgIE1vY2tBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JBdHRyaWJ1dGUgbWFjMSA9IG5ldyBNb2NrQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yQXR0cmlidXRlKAogICAgICAgICAgICAgICAgICJ0ZXN0Iik7CkBAIC0xNTUsNiArMjA0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlI3RvU3RyaW5nKCkgVGVzdCBvZgogICAgICAqICAgICAgICBtZXRob2QgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUjdG9TdHJpbmcoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewogICAgICAgICBNb2NrQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yQXR0cmlidXRlIG1hYzEgPSBuZXcgTW9ja0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvckF0dHJpYnV0ZSgKICAgICAgICAgICAgICAgICBudWxsKTsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JUZXN0LmphdmEKaW5kZXggNzZhYjJhYS4uM2JlMWRhYSAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3JUZXN0LmphdmEKQEAgLTE3LDE1ICsxNywzMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7CiBpbXBvcnQgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmc7CiBpbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwogCitAVGVzdFRhcmdldENsYXNzKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciNjdXJyZW50KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3VycmVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3VycmVudCgpIHsKICAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGVzdCAyM3JpbmciOwogICAgICAgICBBdHRyaWJ1dGVkU3RyaW5nIGF0dHJTdHJpbmcgPSBuZXcgQXR0cmlidXRlZFN0cmluZyh0ZXN0KTsKQEAgLTQ2LDYgKzYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IjZmlyc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaXJzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlyc3QoKSB7CiAgICAgICAgIFN0cmluZyB0ZXN0ID0gIlRlc3QgMjNyaW5nIjsKICAgICAgICAgQXR0cmlidXRlZFN0cmluZyBhdHRyU3RyaW5nID0gbmV3IEF0dHJpYnV0ZWRTdHJpbmcodGVzdCk7CkBAIC02Miw2ICs4NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yI2dldEJlZ2luSW5kZXgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCZWdpbkluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCZWdpbkluZGV4KCkgewogICAgICAgICBTdHJpbmcgdGVzdCA9ICJUZXN0IDIzcmluZyI7CiAgICAgICAgIEF0dHJpYnV0ZWRTdHJpbmcgYXR0clN0cmluZyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRlc3QpOwpAQCAtNzIsNiArMTA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IjZ2V0RW5kSW5kZXgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbmRJbmRleCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5kSW5kZXgoKSB7CiAgICAgICAgIFN0cmluZyB0ZXN0ID0gIlRlc3QgMjNyaW5nIjsKICAgICAgICAgQXR0cmlidXRlZFN0cmluZyBhdHRyU3RyaW5nID0gbmV3IEF0dHJpYnV0ZWRTdHJpbmcodGVzdCk7CkBAIC04Miw2ICsxMjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciNnZXRJbmRleCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbmRleCgpIHsKICAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGVzdCAyM3JpbmciOwogICAgICAgICBBdHRyaWJ1dGVkU3RyaW5nIGF0dHJTdHJpbmcgPSBuZXcgQXR0cmlidXRlZFN0cmluZyh0ZXN0KTsKQEAgLTk5LDYgKzE1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yI2xhc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsYXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9sYXN0KCkgewogICAgICAgICBTdHJpbmcgdGVzdCA9ICJUZXN0IDIzcmluZyI7CiAgICAgICAgIEF0dHJpYnV0ZWRTdHJpbmcgYXR0clN0cmluZyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRlc3QpOwpAQCAtMTE1LDYgKzE3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yI25leHQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0KCkgewogICAgICAgICBTdHJpbmcgdGVzdCA9ICJUZXN0IDIzcmluZyI7CiAgICAgICAgIEF0dHJpYnV0ZWRTdHJpbmcgYXR0clN0cmluZyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRlc3QpOwpAQCAtMTMyLDYgKzIwMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yI3ByZXZpb3VzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJldmlvdXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByZXZpb3VzKCkgewogICAgICAgICBTdHJpbmcgdGVzdCA9ICJUZXN0IDIzcmluZyI7CiAgICAgICAgIEF0dHJpYnV0ZWRTdHJpbmcgYXR0clN0cmluZyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRlc3QpOwpAQCAtMTQzLDYgKzIyMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yI3NldEluZGV4KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEluZGV4SSgpIHsKICAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGVzdCAyM3JpbmciOwogICAgICAgICBBdHRyaWJ1dGVkU3RyaW5nIGF0dHJTdHJpbmcgPSBuZXcgQXR0cmlidXRlZFN0cmluZyh0ZXN0KTsKQEAgLTE1NCw2ICsyNDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciNnZXRSdW5MaW1pdChqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UnVuTGltaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLlNldC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRSdW5MaW1pdExqYXZhX3RleHRfQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZSgpIHsKICAgICAgICAgQXR0cmlidXRlZFN0cmluZyBhcyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKCJ0ZXN0Iik7CiAgICAgICAgIGFzLmFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLkxBTkdVQUdFLCAiYSIsIDIsCmRpZmYgLS1naXQgYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0F0dHJpYnV0ZWRTdHJpbmdUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0F0dHJpYnV0ZWRTdHJpbmdUZXN0LmphdmEKaW5kZXggOTFmNDMxMy4uYjg5NDg0NyAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nVGVzdC5qYXZhCisrKyBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQXR0cmlidXRlZFN0cmluZ1Rlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC50ZXN0cy5qYXZhLnRleHQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwogaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkU3RyaW5nOwogaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKQEAgLTI1LDEzICszMCwyMSBAQAogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCitAVGVzdFRhcmdldENsYXNzKEF0dHJpYnV0ZWRTdHJpbmcuY2xhc3MpIAogcHVibGljIGNsYXNzIEF0dHJpYnV0ZWRTdHJpbmdUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZFN0cmluZyNBdHRyaWJ1dGVkU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkF0dHJpYnV0ZWRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgdGVzdCA9ICJUZXN0IHN0cmluZyI7CiAgICAgICAgIEF0dHJpYnV0ZWRTdHJpbmcgYXR0clN0cmluZyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRlc3QpOwpAQCAtNDcsNiArNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmcjQXR0cmlidXRlZFN0cmluZyhBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkF0dHJpYnV0ZWRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTM1NAogICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBBdHRyaWJ1dGVkU3RyaW5nKApAQCAtNjEsNiArODMsMTUgQEAKICAgICAgKiAgICAgICAgdG8gY29uc3J1Y3QgQXR0cmlidXRlZFN0cmluZyB1c2luZyBpbmNvcnJlY3QgYmVnaW5JbmRleC4gQ2FzZSAzOgogICAgICAqICAgICAgICBUcnkgdG8gY29uc3J1Y3QgQXR0cmlidXRlZFN0cmluZyB1c2luZyBpbmNvcnJlY3QgZW5kSW5kZXguCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkF0dHJpYnV0ZWRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9ySUkoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTM1NQogCkBAIC05OCw2ICsxMjksMTUgQEAKICAgICAgKiAgICAgICAgY29uc3J1Y3QgQXR0cmlidXRlZFN0cmluZyB1c2luZyBpbmNvcnJlY3QgZW5kSW5kZXguIENhc2UgNDogVHJ5IHRvCiAgICAgICogICAgICAgIGNvbnNydWN0IEF0dHJpYnV0ZWRTdHJpbmcgdXNpbmcgc3BlY2lmaWVkIGF0dHJpYnV0ZXMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkF0dHJpYnV0ZWRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9ySUkkTGphdmFfdGV4dF9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlKCkgewogICAgICAgICAvLyBjYXNlIDE6IFRyeSB0byBjb25zcnVjdCBBdHRyaWJ1dGVkU3RyaW5nLgogICAgICAgICB0cnkgewpAQCAtMTQ3LDYgKzE4NywxNSBAQAogICAgICAqICAgICAgICBBdHRyaWJ1dGVkU3RyaW5nIHVzaW5nIDAtbGVuZ3RoIHRleHQgYW5kIG5vdCBhbiBlbXB0eSBNYXAKICAgICAgKiAgICAgICAgYXR0cmlidXRlcy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXR0cmlidXRlZFN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV91dGlsX01hcCgpIHsKICAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGVzdCBzdHJpbmciOwogCkBAIC0yNjYsNyArMzE1LDI1IEBACiAgICAgICAgICAgICByZXR1cm4gJ2EnOwogICAgICAgICB9CiAgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJBdHRyaWJ1dGVkU3RyaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQXR0cmlidXRlZFN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnV0aWwuTWFwLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkF0dHJpYnV0ZWRTdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlW10uY2xhc3N9CisgICAgICAgICkKIAorCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEF0dHJpYnV0ZUxqYXZhX3RleHRfQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZUxqYXZhX2xhbmdfT2JqZWN0SUkoKSB7CiAgICAgICAgIEF0dHJpYnV0ZWRTdHJpbmcgYXMgPSBuZXcgQXR0cmlidXRlZFN0cmluZygidGVzdCIpOwogICAgICAgICBhcy5hZGRBdHRyaWJ1dGUoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZS5MQU5HVUFHRSwgImEiLCAyLApAQCAtMzEyLDYgKzM3OSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQXR0cmlidXRlZFN0cmluZy5hZGRBdHRyaWJ1dGUoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLAogICAgICAqICAgICAgICBPYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgTnVsbFBvaW50ZXJFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQXR0cmlidXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLmNsYXNzLCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEF0dHJpYnV0ZUxqYXZhX3RleHRfQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZUxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyByZWdyZXNzaW9uIGZvciBIYXJtb255LTEyNDQKICAgICAgICAgQXR0cmlidXRlZFN0cmluZyBhcyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKCIxMjMiLCBuZXcgV2Vha0hhc2hNYXAoKSk7CkBAIC0zMzgsNiArNDE0LDE1IEBACiAgICAgICogICAgICAgIG51bGwtYXR0cmlidXRlcyB0byBBdHRyaWJ1dGVzU3RyaW5nLiBDYXNlIDM6IFRyeSB0byBhZGQgYXR0cmlidXRlcwogICAgICAqICAgICAgICB0byBBdHRyaWJ1dGVzU3RyaW5nIHVzaW5nIGluY29ycmVjdCBpbmRleC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYWRkQXR0cmlidXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTWFwLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hZGRBdHRyaWJ1dGVzTGphdmFfdXRpbF9NYXBJSSgpIHsKICAgICAgICAgQXR0cmlidXRlZFN0cmluZyBhcyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKCJ0ZXN0Iik7CiAgICAgICAgIE1hcDxBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLCBTdHJpbmc+IHdobSA9IG5ldyBXZWFrSGFzaE1hcDxBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlLCBTdHJpbmc+KCk7CkBAIC0zNzcsNiArNDYyLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5BdHRyaWJ1dGVkU3RyaW5nI2dldEl0ZXJhdG9yKCkgVGVzdCBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmcjZ2V0SXRlcmF0b3IoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZXJhdG9yKCkgewogICAgICAgICBTdHJpbmcgdGVzdCA9ICJUZXN0IHN0cmluZyI7CiAgICAgICAgIHRyeSB7CkBAIC0zOTQsNiArNDg4LDE1IEBACiAgICAgICogICAgICAgIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5BdHRyaWJ1dGVkU3RyaW5nI2dldEl0ZXJhdG9yKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGVbXSkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEl0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuQXR0cmlidXRlW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlcmF0b3IkTGphdmFfdGV4dF9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlKCkgewogICAgICAgICBTdHJpbmcgdGVzdCA9ICJUZXN0IHN0cmluZyI7CiAgICAgICAgIHRyeSB7CkBAIC00MjUsNiArNTI4LDE1IEBACiAgICAgICogICAgICAgIGphdmEudGV4dC5BdHRyaWJ1dGVkU3RyaW5nI2dldEl0ZXJhdG9yKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGVbXSwKICAgICAgKiAgICAgICAgaW50LCBpbnQpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGVbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlcmF0b3IkTGphdmFfdGV4dF9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlSUkoKSB7CiAgICAgICAgIFN0cmluZyB0ZXN0ID0gIlRlc3Qgc3RyaW5nIjsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQmlkaVRlc3QuamF2YSBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQmlkaVRlc3QuamF2YQppbmRleCBiYmUzZjFjLi41ZmM2MmE5IDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0JpZGlUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9CaWRpVGVzdC5qYXZhCkBAIC0xNywxMyArMTcsMTggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC50ZXN0cy5qYXZhLnRleHQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZFN0cmluZzsKIGltcG9ydCBqYXZhLnRleHQuQmlkaTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKEJpZGkuY2xhc3MpIAogcHVibGljIGNsYXNzIEJpZGlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgQmlkaSBiZDsKQEAgLTQ1LDcgKzUwLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICsgYnV0V2FzWzFdICsgIiBsZXZlbDogIiArIGJ1dFdhc1syXSk7CiAgICAgICAgIH0KICAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgcG9zaXRpdmUgY2FzZSBmb3IgIiArCisgICAgICAgICAgICAiQmlkaShBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgcGFyYWdyYXBoKS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWRpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIAorICAgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJCaWRpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuY2xhc3N9CisgICAgICAgICkKIAorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxQb2ludGVyQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiZCA9IG5ldyBCaWRpKG51bGwsIEJpZGkuRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQpOwpAQCAtNzEsNyArOTEsMTYgQEAKICAgICAgICAgYmQgPSBuZXcgQmlkaSgiYSIudG9DaGFyQXJyYXkoKSwgMCwgbnVsbCwgMCwgMSwKICAgICAgICAgICAgICAgICBCaWRpLkRJUkVDVElPTl9SSUdIVF9UT19MRUZUKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlkaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRMZW5ndGgoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiZCA9IG5ldyBCaWRpKCIxIi50b0NoYXJBcnJheSgpLCAwLCBuZXcgYnl0ZVtdIHsgMCB9LCAwLCAyMCwKQEAgLTE0Nyw3ICsxNzYsNDMgQEAKIAogICAgICAgICBiZCA9IG5ldyBCaWRpKG5ldyBjaGFyW10geyAnbycgfSwgMCwgbmV3IGJ5dGVbXSB7IDIsIDIgfSwgMiwgMCwgMik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIHBvc3NpYmxlIHJldHVybmVkIHZhbHVlcyBmb3IgaXNbTWV0aG9kc10uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmFzZUlzTGVmdFRvUmlnaHQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsQXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkNvdW50IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01peGVkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCYXNlTGV2ZWwiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExlbmd0aCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVBhcmFncmFwaCgpIHsKICAgICAgICAgYmQgPSBuZXcgQmlkaSgiIiwgQmlkaS5ESVJFQ1RJT05fREVGQVVMVF9MRUZUX1RPX1JJR0hUKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShiZC5iYXNlSXNMZWZ0VG9SaWdodCgpKTsKQEAgLTE5Nyw3ICsyNjIsNDMgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoYmQuaXNNaXhlZCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShiZC5pc1JpZ2h0VG9MZWZ0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGFsbCBwb3NzaWJsZSByZXR1cm5lZCB2YWx1ZXMgZm9yIGlzW01ldGhvZHNdLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJhc2VJc0xlZnRUb1JpZ2h0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZXZlbEF0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW5Db3VudCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNaXhlZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QmFzZUxldmVsIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZW5ndGgiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BhY2VQYXJhZ3JhcGgoKSB7CiAgICAgICAgIGJkID0gbmV3IEJpZGkoIiAiLCBCaWRpLkRJUkVDVElPTl9ERUZBVUxUX0xFRlRfVE9fUklHSFQpOwogICAgICAgICBhc3NlcnRUcnVlKGJkLmJhc2VJc0xlZnRUb1JpZ2h0KCkpOwpAQCAtMjQ3LDcgKzM0OCw0MyBAQAogICAgICAgICBhc3NlcnRGYWxzZShiZC5pc01peGVkKCkpOwogICAgICAgICBhc3NlcnRUcnVlKGJkLmlzUmlnaHRUb0xlZnQoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIHBvc3NpYmxlIHJldHVybmVkIHZhbHVlcyBmb3IgaXNbTWV0aG9kc10uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmFzZUlzTGVmdFRvUmlnaHQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsQXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkNvdW50IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01peGVkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCYXNlTGV2ZWwiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExlbmd0aCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQYXJhZ3JhcGgoKSB7CiAgICAgICAgIGJkID0gbmV3IEJpZGkoInQiLCBCaWRpLkRJUkVDVElPTl9ERUZBVUxUX0xFRlRfVE9fUklHSFQpOwogICAgICAgICBhc3NlcnRUcnVlKGJkLmJhc2VJc0xlZnRUb1JpZ2h0KCkpOwpAQCAtMjg5LDYgKzQyNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQmlkaSN0b1N0cmluZygpIFRlc3Qgb2YgbWV0aG9kIGphdmEudGV4dC5CaWRpI3RvU3RyaW5nKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidG9TdHJpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiZCA9IG5ldyBCaWRpKCJiaWRpIiwgMTczKTsKQEAgLTI5Nyw3ICs0NDMsMzkgQEAKICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgdGhhdCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gYWxsIHBvc3NpYmxlIGZsYWdzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJhc2VMZXZlbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZXZlbEF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW5Db3VudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNMZWZ0VG9SaWdodCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNaXhlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRGbGFncygpIHsKICAgICAgICAgYmQgPSBuZXcgQmlkaSgiIiwgMTczKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShiZC5iYXNlSXNMZWZ0VG9SaWdodCgpKTsKQEAgLTMxMSw3ICs0ODksMTUgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoYmQuaXNNaXhlZCgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoYmQuaXNSaWdodFRvTGVmdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlkaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRW1iZWRkaW5ncygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJkID0gbmV3IEJpZGkoIiIudG9DaGFyQXJyYXkoKSwgMCwgbmV3IGJ5dGVbXSB7fSwgMCwgMSwKQEAgLTMyMSw3ICs1MDcsNDMgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbGwgcG9zc2libGUgcmV0dXJuZWQgdmFsdWVzIGZvciBpc1tNZXRob2RzXS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiYXNlSXNMZWZ0VG9SaWdodCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWxBdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UnVuQ291bnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzTWl4ZWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJhc2VMZXZlbCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVuZ3RoIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlRW1iZWRkaW5ncygpIHsKICAgICAgICAgYmQgPSBuZXcgQmlkaShuZXcgY2hhcltdIHsgJ3MnLCAncycsICdzJyB9LCAwLCBuZXcgYnl0ZVtdIHsgKGJ5dGUpIC03LAogICAgICAgICAgICAgICAgIChieXRlKSAtMiwgKGJ5dGUpIC0zIH0sIDAsIDMsCkBAIC0zODksNyArNjExLDQzIEBACiAgICAgICAgIGFzc2VydFRydWUoYmQuaXNNaXhlZCgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoYmQuaXNSaWdodFRvTGVmdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbGwgcG9zc2libGUgcmV0dXJuZWQgdmFsdWVzIGZvciBpc1tNZXRob2RzXS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiYXNlSXNMZWZ0VG9SaWdodCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWxBdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UnVuQ291bnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzTWl4ZWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJhc2VMZXZlbCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVuZ3RoIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRpbmdzKCkgewogICAgICAgICBiZCA9IG5ldyBCaWRpKG5ldyBjaGFyW10geyAncycsICdzJywgJ3MnIH0sIDAsIG5ldyBieXRlW10geyAoYnl0ZSkgMCwKICAgICAgICAgICAgICAgICAoYnl0ZSkgMCwgKGJ5dGUpIDAgfSwgMCwgMywgQmlkaS5ESVJFQ1RJT05fUklHSFRfVE9fTEVGVCk7CkBAIC00MDYsNyArNjY0LDQzIEBACiAgICAgICAgIGFzc2VydFRydWUoYmQuaXNNaXhlZCgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoYmQuaXNSaWdodFRvTGVmdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbGwgcG9zc2libGUgcmV0dXJuZWQgdmFsdWVzIGZvciBpc1tNZXRob2RzXS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiYXNlSXNMZWZ0VG9SaWdodCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWxBdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UnVuQ291bnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzTWl4ZWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJhc2VMZXZlbCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVuZ3RoIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlRW1iZWRkaW5ncygpIHsKICAgICAgICAgYmQgPSBuZXcgQmlkaShuZXcgY2hhcltdIHsgJ3MnLCAncycsICdzJyB9LCAwLCBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDEsCiAgICAgICAgICAgICAgICAgKGJ5dGUpIDIsIChieXRlKSAzIH0sIDAsIDMsIEJpZGkuRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQpOwpAQCAtNDIzLDcgKzcxNyw0MyBAQAogICAgICAgICBhc3NlcnRUcnVlKGJkLmlzTWl4ZWQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGJkLmlzUmlnaHRUb0xlZnQoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIHBvc3NpYmxlIHJldHVybmVkIHZhbHVlcyBmb3IgaXNbTWV0aG9kc10uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmFzZUlzTGVmdFRvUmlnaHQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsQXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkNvdW50IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01peGVkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCYXNlTGV2ZWwiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExlbmd0aCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVIZWJyZXdQYXJhZ3JhcGgoKSB7CiAgICAgICAgIGJkID0gbmV3IEJpZGkoIlx1MDVEMCIsIEJpZGkuRElSRUNUSU9OX0RFRkFVTFRfTEVGVF9UT19SSUdIVCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGJkLmJhc2VJc0xlZnRUb1JpZ2h0KCkpOwpAQCAtNDYxLDcgKzc5MSw0MyBAQAogICAgICAgICBhc3NlcnRGYWxzZShiZC5pc01peGVkKCkpOwogICAgICAgICBhc3NlcnRUcnVlKGJkLmlzUmlnaHRUb0xlZnQoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIHBvc3NpYmxlIHJldHVybmVkIHZhbHVlcyBmb3IgaXNbTWV0aG9kc10uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmFzZUlzTGVmdFRvUmlnaHQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsQXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkNvdW50IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01peGVkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCYXNlTGV2ZWwiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExlbmd0aCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVCaWRpUGFyYWdyYXBoXzEoKSB7CiAgICAgICAgIGJkID0gbmV3IEJpZGkoIlx1MDVEMGEiLCBCaWRpLkRJUkVDVElPTl9ERUZBVUxUX0xFRlRfVE9fUklHSFQpOwogICAgICAgICBhc3NlcnRGYWxzZShiZC5iYXNlSXNMZWZ0VG9SaWdodCgpKTsKQEAgLTUxNSw3ICs4ODEsNDMgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShiZC5pc01peGVkKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShiZC5pc1JpZ2h0VG9MZWZ0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGFsbCBwb3NzaWJsZSByZXR1cm5lZCB2YWx1ZXMgZm9yIGlzW01ldGhvZHNdLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJhc2VJc0xlZnRUb1JpZ2h0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZXZlbEF0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW5Db3VudCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNaXhlZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QmFzZUxldmVsIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZW5ndGgiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQmlkaVBhcmFncmFwaF8yKCkgewogICAgICAgICBiZCA9IG5ldyBCaWRpKCJhXHUwNUQwIiwgQmlkaS5ESVJFQ1RJT05fREVGQVVMVF9MRUZUX1RPX1JJR0hUKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShiZC5iYXNlSXNMZWZ0VG9SaWdodCgpKTsKQEAgLTU3NSw2ICs5NzcsNDMgQEAKICAgICAgKiBpbmRpY2F0aW5nIGJhc2UgZGlyZWN0aW9uIGlzIHJpZ2h0LXRvLWxlZnQuIGFjY29yZGluZyB0byB0aGF0LCB0aGUgbWV0aG9kCiAgICAgICogYmFzZUlzTGVmdFRvUmlnaHQoKSBoZXJlIHNob3VsZCByZXR1cm4gZmFsc2UuIGhvd2V2ZXIsIFJJIGRvZXNuJ3QgYWN0IHNvLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGFsbCBwb3NzaWJsZSByZXR1cm5lZCB2YWx1ZXMgZm9yIGlzW01ldGhvZHNdLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJhc2VJc0xlZnRUb1JpZ2h0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZXZlbEF0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW5Db3VudCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNaXhlZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QmFzZUxldmVsIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZW5ndGgiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UklCdWdfMSgpIHsKICAgICAgICAgYmQgPSBuZXcgQmlkaSgidCIsIEJpZGkuRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQpOwogICAgICAgICBhc3NlcnRGYWxzZShiZC5iYXNlSXNMZWZ0VG9SaWdodCgpKTsKQEAgLTU4OSw3ICsxMDI4LDQzIEBACiAgICAgICAgIGFzc2VydFRydWUoYmQuaXNNaXhlZCgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoYmQuaXNSaWdodFRvTGVmdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbGwgcG9zc2libGUgcmV0dXJuZWQgdmFsdWVzIGZvciBpc1tNZXRob2RzXS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiYXNlSXNMZWZ0VG9SaWdodCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWxBdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UnVuQ291bnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzTWl4ZWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJhc2VMZXZlbCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVuZ3RoIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgLy8gdGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBidWcgYXMgQnVnXzEKICAgICBwdWJsaWMgdm9pZCB0ZXN0UklCdWdfMigpIHsKICAgICAgICAgYmQgPSBuZXcgQmlkaSgiXHUwNUQwIiwgQmlkaS5ESVJFQ1RJT05fTEVGVF9UT19SSUdIVCk7CkBAIC02MDQsNyArMTA3OSwzNSBAQAogICAgICAgICBhc3NlcnRUcnVlKGJkLmlzTWl4ZWQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGJkLmlzUmlnaHRUb0xlZnQoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIHBvc3NpYmxlIHJldHVybmVkIHZhbHVlcyBmb3IgaXNbTWV0aG9kc10uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmFzZUlzTGVmdFRvUmlnaHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsQXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkNvdW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01peGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBsaWNhdGVkQmlkaSgpIHsKICAgICAgICAgYmQgPSBuZXcgQmlkaSgiYVx1MDVEMGFcImFcdTA1RDBcIlx1MDVEMGEiLAogICAgICAgICAgICAgICAgIEJpZGkuRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQpOwpAQCAtNjI4LDcgKzExMzEsNDMgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShiZC5pc01peGVkKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShiZC5pc1JpZ2h0VG9MZWZ0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGFsbCBwb3NzaWJsZSByZXR1cm5lZCB2YWx1ZXMgZm9yIGlzW01ldGhvZHNdLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJhc2VJc0xlZnRUb1JpZ2h0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZXZlbEF0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW5Db3VudCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNaXhlZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QmFzZUxldmVsIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZW5ndGgiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxpY2F0ZWRPdmVycmlkZUJpZGkoKSB7CiAgICAgICAgIGJkID0gbmV3IEJpZGkoImFcdTA1RDBhXCJhXHUwNUQwXCJcdTA1RDBhIi50b0NoYXJBcnJheSgpLCAwLAogICAgICAgICAgICAgICAgIG5ldyBieXRlW10geyAwLCAwLCAwLCAtMywgLTMsIDIsIDIsIDAsIDMgfSwgMCwgOSwKQEAgLTY1NCw3ICsxMTkzLDE1IEBACiAgICAgICAgIGFzc2VydFRydWUoYmQuaXNNaXhlZCgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoYmQuaXNSaWdodFRvTGVmdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVxdWlyZXNCaWRpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXJbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlc0JpZGkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBCaWRpLnJlcXVpcmVzQmlkaShudWxsLCAwLCAwKTsKQEAgLTcyOCw3ICsxMjc1LDQzIEBACiAgICAgICAgIGFzc2VydEZhbHNlKEJpZGkucmVxdWlyZXNCaWRpKCJhYVx1MDVEMGEiLnRvQ2hhckFycmF5KCksIDAsIDIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShCaWRpLnJlcXVpcmVzQmlkaSgiYWFcdTA1RDBhIi50b0NoYXJBcnJheSgpLCAxLCAzKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYWxsIHBvc3NpYmxlIHJldHVybmVkIHZhbHVlcyBmb3IgaXNbTWV0aG9kc10uIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYmFzZUlzTGVmdFRvUmlnaHQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExldmVsQXQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkNvdW50IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1JpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc01peGVkIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCYXNlTGV2ZWwiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldExlbmd0aCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZWJyZXdPdmVycmlkZUVtYmVkZGluZ3MoKSB7CiAgICAgICAgIGJkID0gbmV3IEJpZGkobmV3IGNoYXJbXSB7ICdcdTA1RDAnLCAnXHUwNUQwJywgJ1x1MDVEMCcgfSwgMCwKICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsgKGJ5dGUpIC0xLCAoYnl0ZSkgLTIsIChieXRlKSAtMyB9LCAwLCAzLApAQCAtNzk4LDcgKzEzODEsNDMgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShiZC5pc01peGVkKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShiZC5pc1JpZ2h0VG9MZWZ0KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgICAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICAgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGFsbCBwb3NzaWJsZSByZXR1cm5lZCB2YWx1ZXMgZm9yIGlzW01ldGhvZHNdLiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImJhc2VJc0xlZnRUb1JpZ2h0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZXZlbEF0IiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW5Db3VudCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNSaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNNaXhlZCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QmFzZUxldmVsIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMZW5ndGgiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApCisgICAgICAgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTGluZUJpZGkoKSB7CiAgICAgICAgIGJkID0gbmV3IEJpZGkoImFcdTA1RDBhXG5hXHUwNUQwXCJcdTA1RDBhIi50b0NoYXJBcnJheSgpLCAwLAogICAgICAgICAgICAgICAgIG5ldyBieXRlW10geyAwLCAwLCAwLCAtMywgLTMsIDIsIDIsIDAsIDMgfSwgMCwgOSwKQEAgLTgyMCw4ICsxNDM5LDE2IEBACiAgICAgICAgIGFzc2VydFRydWUobGluZS5pc01peGVkKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShsaW5lLmlzUmlnaHRUb0xlZnQoKSk7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUxpbmVCaWRpSW52YWxpZCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlTGluZUJpZGkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0Q3JlYXRlTGluZUJpZGlJbnZhbGlkKCkgewogICAgICAgICAvLyByZWdyZXNzaW9uIGZvciBIQVJNT05ZLTEwNTAKICAgICAgICAgQmlkaSBiaWRpID0gbmV3IEJpZGkoInN0ciIsIDEpOwogICAgICAgICB0cnkgewpAQCAtODYxLDcgKzE0ODgsNDMgQEAKICAgICAgICAgICAgIC8vIEV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbGwgcG9zc2libGUgcmV0dXJuZWQgdmFsdWVzIGZvciBpc1tNZXRob2RzXS4iLAorICAgICAgICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJiYXNlSXNMZWZ0VG9SaWdodCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGV2ZWxBdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UnVuQ291bnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImlzTWl4ZWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJhc2VMZXZlbCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGVuZ3RoIiwKKyAgICAgICAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgICAgICAgKQorICAgICAgICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEluY29tcGF0aWJsZUxpbmVBbGdvcml0aG0oKSB7CiAgICAgICAgIC8vIElDVSB0cmVhdCBhIG5ldyBsaW5lIGFzIGluIHRoZSBzYW1lIHJ1biwgaG93ZXZlciBSSSBkb2VzIG5vdAogICAgICAgICBiZCA9IG5ldyBCaWRpKCJhYWFhYSIudG9DaGFyQXJyYXkoKSwgMCwKQEAgLTg4MSw3ICsxNTQ0LDE1IEBACiAgICAgICAgIGFzc2VydEZhbHNlKGxpbmUuaXNNaXhlZCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShsaW5lLmlzUmlnaHRUb0xlZnQoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlb3JkZXJWaXN1YWxseSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzcywgamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlb3JkZXJWaXN1YWxseSgpIHsKICAgICAgICAgU3RyaW5nW10gaW5pdCA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwogICAgICAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1s0XTsKQEAgLTkwNiw3ICsxNTc3LDE1IEBACiAgICAgICAgIEJpZGkucmVvcmRlclZpc3VhbGx5KG5ldyBieXRlW10geyAyLCAxLCAwLCAxIH0sIDEsIHMsIDAsIDMpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlthLCBiLCBjLCBkXSIsIEFycmF5cy5hc0xpc3QocykudG9TdHJpbmcoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW9yZGVyVmlzdWFsbHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRSZW9yZGVyVmlzdWFsbHkoKSB7CiAgICAgICAgIFN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKIApAQCAtOTUzLDcgKzE2MzIsMjMgQEAKICAgICAgICAgfQogCiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkxpbWl0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRSdW5TdGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UnVuQ291bnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UnVucygpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIYXJtb255LTEwMjgKIApAQCAtOTcxLDcgKzE2NjYsMTUgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJ1bnNbaV1bMV0sIGJpLmdldFJ1bkxpbWl0KGkpKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGFueSBpbnQgdmFsdWUgYmV0d2VlbiAwIGFuZCBnZXRSdW5Db3VudCgpLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bkxpbWl0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFJ1bkxpbWl0KCkgewogICAgICAgICBiZCA9IG5ldyBCaWRpKCJ0ZXh0IiwgQmlkaS5ESVJFQ1RJT05fTEVGVF9UT19SSUdIVCk7CiAgICAgICAgIHRyeSB7CkBAIC05ODAsNyArMTY4MywxNSBAQAogICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQmlkaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmlkaUNvbnN0cnVjdG9yX0l0ZXJhdG9yKCkgewogICAgICAgICBBdHRyaWJ1dGVkU3RyaW5nIHBhcmFncmFwaCA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKCJ0ZXh0Iik7CiAgICAgICAgIGJkID0gbmV3IEJpZGkocGFyYWdyYXBoLmdldEl0ZXJhdG9yKCkpOwpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9CcmVha0l0ZXJhdG9yVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9CcmVha0l0ZXJhdG9yVGVzdC5qYXZhCmluZGV4IDI5ZjJiMjkuLjQwMTc0NTkgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQnJlYWtJdGVyYXRvclRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3JUZXN0LmphdmEKQEAgLTE3LDE2ICsxNywxOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IGphdmEudGV4dC5CcmVha0l0ZXJhdG9yOwogaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoQnJlYWtJdGVyYXRvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQnJlYWtJdGVyYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJhXHUwMzA4YWJjIGRlZiwgZ2gtMTJpP2prbC5tbm8/IjsKQEAgLTQwLDExICs0Myw0MyBAQAogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBpdGVyYXRvciA9IEJyZWFrSXRlcmF0b3IuZ2V0Q2hhcmFjdGVySW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBjb25zdGFudC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhQ29uc3RhbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBCcmVha0l0ZXJhdG9yLkRPTkUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGFyYWN0ZXJJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2hhcmFjdGVySW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRXb3JkSW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExpbmVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VudGVuY2VJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYWNoZSgpIHsKICAgICAgICAgQnJlYWtJdGVyYXRvciBuZXdPbmUgPSBCcmVha0l0ZXJhdG9yLmdldENoYXJhY3Rlckluc3RhbmNlKExvY2FsZS5VUyk7CiAgICAgICAgIGFzc2VydE5vdFNhbWUobmV3T25lLCBpdGVyYXRvcik7CkBAIC02NSwxMyArMTAwLDI5IEBACiAgICAgICAgIEJyZWFrSXRlcmF0b3Igc2VudGVJdGVyYXRvciA9IEJyZWFrSXRlcmF0b3IuZ2V0U2VudGVuY2VJbnN0YW5jZSgpOwogICAgICAgICBhc3NlcnRGYWxzZShzZW50ZUl0ZXJhdG9yLmVxdWFscyhpdGVyYXRvcikpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKICAgICAgICAgQnJlYWtJdGVyYXRvciBjbG9uZWQgPSAoQnJlYWtJdGVyYXRvcikgaXRlcmF0b3IuY2xvbmUoKTsKICAgICAgICAgYXNzZXJ0Tm90U2FtZShjbG9uZWQsIGl0ZXJhdG9yKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsb25lZCwgaXRlcmF0b3IpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjdXJyZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEN1cnJlbnQoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBpdGVyYXRvci5jdXJyZW50KCkpOwogICAgICAgICBpdGVyYXRvci5zZXRUZXh0KFRFWFQpOwpAQCAtODIsNiArMTMzLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5CcmVha0l0ZXJhdG9yI0JyZWFrSXRlcmF0b3IoKSBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuQnJlYWtJdGVyYXRvciNCcmVha0l0ZXJhdG9yKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkJyZWFrSXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0JyZWFrSXRlcmF0b3IoKTsKQEAgLTg5LDEzICsxNDksMjkgQEAKICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZpcnN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZpcnN0KCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaXRlcmF0b3IuZmlyc3QoKSk7CiAgICAgICAgIGl0ZXJhdG9yLnNldFRleHQoVEVYVCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBpdGVyYXRvci5maXJzdCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9sbG93aW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEZvbGxvd2luZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGl0ZXJhdG9yLmZvbGxvd2luZygxKTsKQEAgLTExNSw3ICsxOTEsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0JvdW5kYXJ5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzQm91bmRhcnkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpdGVyYXRvci5pc0JvdW5kYXJ5KDIpOwpAQCAtMTM3LDcgKzIyMSwxNSBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLmxhc3QoKSk7CiAgICAgICAgIGl0ZXJhdG9yLnNldFRleHQoVEVYVCk7CkBAIC0xNDcsNiArMjM5LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgbmV4dChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dGludCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJyZWFrSXRlcmF0b3IuRE9ORSwgaXRlcmF0b3IubmV4dCgzKSk7CiAgICAgICAgIGl0ZXJhdG9yLnNldFRleHQoVEVYVCk7CkBAIC0xNTUsNyArMjU2LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygyMywgaXRlcmF0b3IubmV4dCgtMSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGl0ZXJhdG9yLm5leHQoVEVYVC5sZW5ndGgoKSkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwcmVjZWRpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY2VkaW5nKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaXRlcmF0b3IucHJlY2VkaW5nKDIpOwpAQCAtMTc5LDcgKzI4OCwxNSBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByZXZpb3VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGl0ZXJhdG9yLnByZXZpb3VzKCkpOwogICAgICAgICBpdGVyYXRvci5zZXRUZXh0KFRFWFQpOwpAQCAtMTkyLDYgKzMwOSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQnJlYWtJdGVyYXRvciNnZXRBdmFpbGFibGVMb2NhbGVzKCkuIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5CcmVha0l0ZXJhdG9yI2dldEF2YWlsYWJsZUxvY2FsZXMoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXZhaWxhYmxlTG9jYWxlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdmFpbGFibGVMb2NhbGVzKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTG9jYWxlW10gbG9jYWxlcyA9IEJyZWFrSXRlcmF0b3IuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwpAQCAtMjE1LDYgKzM0MSwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQnJlYWtJdGVyYXRvciBnZXRDaGFyYWN0ZXJJbnN0YW5jZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYXJhY3Rlckluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENoYXJhY3Rlckluc3RhbmNlKCkgewogICAgICAgICBCcmVha0l0ZXJhdG9yLmdldENoYXJhY3Rlckluc3RhbmNlKCk7CiAgICAgfQpAQCAtMjIyLDYgKzM1NywxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQnJlYWtJdGVyYXRvciBnZXRDaGFyYWN0ZXJJbnN0YW5jZShMb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENoYXJhY3Rlckluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXJJbnN0YW5jZUxvY2FsZSgpIHsKICAgICAgICAgQnJlYWtJdGVyYXRvciBpdCA9IEJyZWFrSXRlcmF0b3IuZ2V0Q2hhcmFjdGVySW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgQnJlYWtJdGVyYXRvciBpdDIgPSBCcmVha0l0ZXJhdG9yLmdldENoYXJhY3Rlckluc3RhbmNlKExvY2FsZS5DSElOQSk7CkBAIC0yMzEsNiArMzc1LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBCcmVha0l0ZXJhdG9yIGdldExpbmVJbnN0YW5jZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExpbmVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMaW5lSW5zdGFuY2UoKSB7CiAgICAgICAgIEJyZWFrSXRlcmF0b3IgaXQgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGl0KTsKQEAgLTI0MCw2ICszOTMsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IjZ2V0TGluZUluc3RhbmNlKExvY2FsZSkgQ2xhc3MgdW5kZXIgdGVzdAogICAgICAqIGZvciBCcmVha0l0ZXJhdG9yIGdldExpbmVJbnN0YW5jZShMb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExpbmVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGluZUluc3RhbmNlTG9jYWxlKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQnJlYWtJdGVyYXRvciBpdDEgPSBCcmVha0l0ZXJhdG9yCkBAIC0yNTgsNiArNDIwLDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBCcmVha0l0ZXJhdG9yIGdldFNlbnRlbmNlSW5zdGFuY2UoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZW50ZW5jZUluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFNlbnRlbmNlSW5zdGFuY2UoKSB7CiAgICAgICAgIEJyZWFrSXRlcmF0b3IgaXQgPSBCcmVha0l0ZXJhdG9yLmdldFNlbnRlbmNlSW5zdGFuY2UoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpdCk7CkBAIC0yNjYsMTEgKzQzNywyOCBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQnJlYWtJdGVyYXRvciBnZXRTZW50ZW5jZUluc3RhbmNlKExvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2VudGVuY2VJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2VudGVuY2VJbnN0YW5jZUxvY2FsZSgpIHsKICAgICAgICAgQnJlYWtJdGVyYXRvciBpdCA9IEJyZWFrSXRlcmF0b3IuZ2V0U2VudGVuY2VJbnN0YW5jZShMb2NhbGUuVVMpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGl0KTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0KCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKCIiKSwgaXRlcmF0b3IuZ2V0VGV4dCgpKTsKICAgICAgICAgaXRlcmF0b3Iuc2V0VGV4dChURVhUKTsKQEAgLTI4MCw2ICs0NjgsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIEJyZWFrSXRlcmF0b3IgZ2V0V29yZEluc3RhbmNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0V29yZEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmRJbnN0YW5jZSgpIHsKICAgICAgICAgQnJlYWtJdGVyYXRvciBpdCA9IEJyZWFrSXRlcmF0b3IuZ2V0V29yZEluc3RhbmNlKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoaXQpOwpAQCAtMjg5LDYgKzQ4NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQnJlYWtJdGVyYXRvciNnZXRXb3JkSW5zdGFuY2UoTG9jYWxlKSBDbGFzcyB1bmRlciB0ZXN0CiAgICAgICogZm9yIEJyZWFrSXRlcmF0b3IgZ2V0V29yZEluc3RhbmNlKExvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0V29yZEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JkSW5zdGFuY2VMb2NhbGUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBCcmVha0l0ZXJhdG9yIGl0MSA9IEJyZWFrSXRlcmF0b3IKQEAgLTMwNyw2ICs1MTMsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0Q2hhcmFjdGVySXRlcmF0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpdGVyYXRvci5zZXRUZXh0KChDaGFyYWN0ZXJJdGVyYXRvcikgbnVsbCk7CkBAIC0zMjEsNiArNTM2LDE1IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIHNldFRleHQoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUZXh0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0U3RyaW5nKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaXRlcmF0b3Iuc2V0VGV4dCgoU3RyaW5nKSBudWxsKTsKQEAgLTMzMSw3ICs1NTUsMTUgQEAKICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXQgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoImFiYyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoaXQsIGl0ZXJhdG9yLmdldFRleHQoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHQoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0zMAogICAgICAgICBCcmVha0l0ZXJhdG9yIGJpID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoTG9jYWxlLlVTKTsKQEAgLTM0OSw2ICs1ODEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IuZ2V0U2hvcnQoYnl0ZVtdLCBpbnQpCiAgICAgICogCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNob3J0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNob3J0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTW9ja0JyZWFrSXRlcmF0b3IucHVibGljR2V0U2hvcnQobnVsbCwgMCk7CkBAIC00MDcsNiArNjQ4LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5CcmVha0l0ZXJhdG9yLmdldEludChieXRlW10sIGludCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2J5dGVbXS5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE1vY2tCcmVha0l0ZXJhdG9yLnB1YmxpY0dldEludChudWxsLCAwKTsKQEAgLTQ1Nyw2ICs3MDcsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IuZ2V0TG9uZyhieXRlW10sIGludCkKICAgICAgKiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9uZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtieXRlW10uY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb25nKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTW9ja0JyZWFrSXRlcmF0b3IucHVibGljR2V0TG9uZyhudWxsLCAwKTsKQEAgLTUwOSw2ICs3NjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IjZ2V0Q2hhcmFjdGVySW5zdGFuY2UoTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDaGFyYWN0ZXJJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhcmFjdGVySW5zdGFuY2VMb2NhbGVfTlBFKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTI2NQogICAgICAgICB0cnkgewpAQCAtNTE3LDcgKzc4NSwxNSBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TGluZUluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMaW5lSW5zdGFuY2VMb2NhbGVfTlBFKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UobnVsbCk7CkBAIC01MjUsNyArODAxLDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZW50ZW5jZUluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZW50ZW5jZUluc3RhbmNlTG9jYWxlX05QRSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEJyZWFrSXRlcmF0b3IuZ2V0U2VudGVuY2VJbnN0YW5jZShudWxsKTsKQEAgLTUzMyw3ICs4MTcsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFdvcmRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29yZEluc3RhbmNlTG9jYWxlX05QRSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEJyZWFrSXRlcmF0b3IuZ2V0V29yZEluc3RhbmNlKG51bGwpOwpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9DaG9pY2VGb3JtYXRUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Nob2ljZUZvcm1hdFRlc3QuamF2YQppbmRleCAzODkxMTA5Li41ZDI5MGUxIDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Nob2ljZUZvcm1hdFRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Nob2ljZUZvcm1hdFRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDIwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS50ZXh0LkNob2ljZUZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhDaG9pY2VGb3JtYXQuY2xhc3MpIAogcHVibGljIGNsYXNzIENob2ljZUZvcm1hdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBkb3VibGVbXSBsaW1pdHMgPSBuZXcgZG91YmxlW10geyAwLCAxLCBDaG9pY2VGb3JtYXQubmV4dERvdWJsZSgxKSwKQEAgLTM3LDYgKzQ0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5DaG9pY2VGb3JtYXQjQ2hvaWNlRm9ybWF0KGRvdWJsZVtdLCBqYXZhLmxhbmcuU3RyaW5nW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkNob2ljZUZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGVbXS5jbGFzcywgamF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJEQkTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0KGRvdWJsZSBbXSwgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBbXSkKQEAgLTg3LDYgKzEwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0I0Nob2ljZUZvcm1hdChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJDaG9pY2VGb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0LkNob2ljZUZvcm1hdChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBTdHJpbmcgZm9ybWF0dGVkU3RyaW5nOwpAQCAtMTM1LDYgKzE2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0I2FwcGx5UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBseVBhdHRlcm4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9hcHBseVBhdHRlcm5MamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS50ZXh0LkNob2ljZUZvcm1hdC5hcHBseVBhdHRlcm4oamF2YS5sYW5nLlN0cmluZykKQEAgLTE5OCw2ICsyMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNob2ljZUZvcm1hdCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgamF2YS50ZXh0LkNob2ljZUZvcm1hdC5jbG9uZSgpCiAgICAgICAgIENob2ljZUZvcm1hdCBmID0gKENob2ljZUZvcm1hdCkgZjEuY2xvbmUoKTsKQEAgLTIwOSw2ICsyNTIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNob2ljZUZvcm1hdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudGV4dC5DaG9pY2VGb3JtYXQuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCkBAIC0yNDksNiArMzAxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5DaG9pY2VGb3JtYXQjZm9ybWF0KGRvdWJsZSwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciwKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdERMamF2YV9sYW5nX1N0cmluZ0J1ZmZlckxqYXZhX3RleHRfRmllbGRQb3NpdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS50ZXh0LkNob2ljZUZvcm1hdC5mb3JtYXQoZG91YmxlLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLApAQCAtMjgzLDYgKzM0NCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0I2Zvcm1hdChsb25nLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLAogICAgICAqICAgICAgICBqYXZhLnRleHQuRmllbGRQb3NpdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdEpMamF2YV9sYW5nX1N0cmluZ0J1ZmZlckxqYXZhX3RleHRfRmllbGRQb3NpdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS50ZXh0LkNob2ljZUZvcm1hdC5mb3JtYXQobG9uZywgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciwKQEAgLTMwMiw2ICszNzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNob2ljZUZvcm1hdCNnZXRGb3JtYXRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Rm9ybWF0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9ybWF0cygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5PYmplY3QgW10KICAgICAgICAgLy8gamF2YS50ZXh0LkNob2ljZUZvcm1hdC5nZXRGb3JtYXRzKCkKQEAgLTMxNSw2ICszOTQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNob2ljZUZvcm1hdCNnZXRMaW1pdHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMaW1pdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExpbWl0cygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBbXSBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0LmdldExpbWl0cygpCiAgICAgICAgIGRvdWJsZVtdIG9yZ0xpbWl0cyA9IChkb3VibGVbXSkgbGltaXRzLmNsb25lKCk7CkBAIC0zMjcsNiArNDE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5DaG9pY2VGb3JtYXQjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS50ZXh0LkNob2ljZUZvcm1hdC5oYXNoQ29kZSgpCiAgICAgICAgIENob2ljZUZvcm1hdCBmMiA9IG5ldyBDaG9pY2VGb3JtYXQoCkBAIC0zMzcsNiArNDM0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5DaG9pY2VGb3JtYXQjbmV4dERvdWJsZShkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHREb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHREb3VibGVEKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZG91YmxlIGphdmEudGV4dC5DaG9pY2VGb3JtYXQubmV4dERvdWJsZShkb3VibGUpCiAgICAgICAgIGFzc2VydFRydWUoIk5vdCBncmVhdGVyIDUiLCBDaG9pY2VGb3JtYXQubmV4dERvdWJsZSg1KSA+IDUpOwpAQCAtMzQ4LDYgKzQ1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0I25leHREb3VibGUoZG91YmxlLCBib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXh0RG91YmxlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXh0RG91YmxlRFooKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBkb3VibGUgamF2YS50ZXh0LkNob2ljZUZvcm1hdC5uZXh0RG91YmxlKGRvdWJsZSwKICAgICAgICAgLy8gYm9vbGVhbikKQEAgLTM1OSw2ICs0NzQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNob2ljZUZvcm1hdCNwYXJzZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3RleHRfUGFyc2VQb3NpdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5OdW1iZXIKICAgICAgICAgLy8gamF2YS50ZXh0LkNob2ljZUZvcm1hdC5wYXJzZShqYXZhLmxhbmcuU3RyaW5nLApAQCAtMzg3LDYgKzUxMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0I3ByZXZpb3VzRG91YmxlKGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJldmlvdXNEb3VibGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByZXZpb3VzRG91YmxlRCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGRvdWJsZSBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0LnByZXZpb3VzRG91YmxlKGRvdWJsZSkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IGxlc3MgNSIsIENob2ljZUZvcm1hdC5wcmV2aW91c0RvdWJsZSg1KSA8IDUpOwpAQCAtMzk5LDYgKzUzMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0I3NldENob2ljZXMoZG91YmxlW10sIGphdmEubGFuZy5TdHJpbmdbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2hvaWNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGVbXS5jbGFzcywgamF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENob2ljZXMkRCRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS50ZXh0LkNob2ljZUZvcm1hdC5zZXRDaG9pY2VzKGRvdWJsZSBbXSwKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZyBbXSkKQEAgLTQxMyw2ICs1NTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNob2ljZUZvcm1hdCN0b1BhdHRlcm4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1BhdHRlcm4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvUGF0dGVybigpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS01OQogICAgICAgICBDaG9pY2VGb3JtYXQgY2YgPSBuZXcgQ2hvaWNlRm9ybWF0KCIiKTsKQEAgLTQ0NSw2ICs1OTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNob2ljZUZvcm1hdCNmb3JtYXQobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TCgpIHsKICAgICAgICAgQ2hvaWNlRm9ybWF0IGZtdCA9IG5ldyBDaG9pY2VGb3JtYXQoCiAgICAgICAgICAgICAgICAgIi0xI05FR0FUSVZFX09ORXwwI1pFUk98MSNPTkV8MTxHUkVBVEVSX1RIQU5fT05FIik7CkBAIC00NTksNiArNjE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5DaG9pY2VGb3JtYXQjZm9ybWF0KGRvdWJsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXREKCkgewogICAgICAgICBDaG9pY2VGb3JtYXQgZm10ID0gbmV3IENob2ljZUZvcm1hdCgKICAgICAgICAgICAgICAgICAiLTEjTkVHQVRJVkVfT05FfDAjWkVST3wxI09ORXwxPEdSRUFURVJfVEhBTl9PTkUiKTsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Db2xsYXRpb25FbGVtZW50SXRlcmF0b3JUZXN0LmphdmEKaW5kZXggZmQ5NDViYi4uZDE0YTdiNyAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Db2xsYXRpb25FbGVtZW50SXRlcmF0b3JUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Db2xsYXRpb25FbGVtZW50SXRlcmF0b3JUZXN0LmphdmEKQEAgLTE3LDIwICsxNywyNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IGphdmEudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3I7CiBpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwogaW1wb3J0IGphdmEudGV4dC5SdWxlQmFzZWRDb2xsYXRvcjsKIGltcG9ydCBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQogLyoqCiAgKiBUZXN0IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcgogICogCiAgKiBPbmx5IHRlc3Qgbm9ybWFsIGNvbmRpdGlvbi4KICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgUnVsZUJhc2VkQ29sbGF0b3IgY29sbDsKQEAgLTM4LDcgKzQ0LDE1IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGNvbGwgPSAoUnVsZUJhc2VkQ29sbGF0b3IpIENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5VUyk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPZmZzZXQoKSB7CiAgICAgICAgIFN0cmluZyB0ZXh0ID0gImFiYyI7CiAgICAgICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBpdGVyYXRvciA9IGNvbGwKQEAgLTUzLDcgKzY3LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0c1tpKytdLCBvZmZzZXQpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKICAgICAgICAgU3RyaW5nIHRleHQgPSAiYWJjIjsKICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sbApAQCAtODIsNiArMTA0LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IjcHJldmlvdXMoKSBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yI3ByZXZpb3VzKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByZXZpb3VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewogICAgICAgICBTdHJpbmcgdGV4dCA9ICJhYmMiOwogICAgICAgICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsCkBAIC0xMDUsNyArMTM2LDE1IEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLmdldE9mZnNldCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB7CiAgICAgICAgIFN0cmluZyB0ZXh0ID0gImFiYyI7CiAgICAgICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBpdGVyYXRvciA9IGNvbGwKQEAgLTEyNCw3ICsxNjMsMTUgQEAKICAgICAgICAgaXRlcmF0b3IucmVzZXQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLmdldE9mZnNldCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4RXhwYW5zaW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1heEV4cGFuc2lvbigpIHsKICAgICAgICAgU3RyaW5nIHRleHQgPSAiY2hhIjsKICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgcmJDb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgpAQCAtMTM4LDcgKzE4NSwxNSBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicHJpbWFyeU9yZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFByaW1hcnlPcmRlcigpIHsKICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgcmJDb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgogICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShuZXcgTG9jYWxlKCJkZSIsICJERSIpKTsKQEAgLTE1Myw3ICsyMDgsMTUgQEAKICAgICAgICAgaW50IHBPcmRlcjIgPSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IucHJpbWFyeU9yZGVyKG9yZGVyMik7CiAgICAgICAgIGFzc2VydEVxdWFscyhwT3JkZXIsIHBPcmRlcjIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZWNvbmRhcnlPcmRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlPcmRlcigpIHsKICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgcmJDb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgogICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShuZXcgTG9jYWxlKCJmciIsICJGUiIpKTsKQEAgLTE2OCw3ICsyMzEsMTUgQEAKIAogICAgICAgICBhc3NlcnRFcXVhbHMoc09yZGVyMSwgc09yZGVyMik7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRlcnRpYXJ5T3JkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVydGlhcnlPcmRlcigpIHsKICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgcmJDb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgogICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShuZXcgTG9jYWxlKCJmciIsICJGUiIpKTsKQEAgLTE4Nyw3ICsyNTgsMTUgQEAKICAgICAgICAgdE9yZGVyMiA9IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvci50ZXJ0aWFyeU9yZGVyKG9yZGVyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRPcmRlcjEsIHRPcmRlcjIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRPZmZzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T2Zmc2V0KCkgewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciByYkNvbGwgPSAoUnVsZUJhc2VkQ29sbGF0b3IpIENvbGxhdG9yCiAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKG5ldyBMb2NhbGUoImVzIiwgIiIsICJUUkFESVRJT05BTCIpKTsKQEAgLTIwMSw2ICsyODAsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUZXh0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0U3RyaW5nKCkgewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciByYkNvbGwgPSAoUnVsZUJhc2VkQ29sbGF0b3IpIENvbGxhdG9yCiAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKG5ldyBMb2NhbGUoImVzIiwgIiIsICJUUkFESVRJT05BTCIpKTsKQEAgLTIxNyw2ICszMDUsMTUgQEAKICAgICAvKgogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgc2V0VGV4dChqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRleHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dENoYXJhY3Rlckl0ZXJhdG9yKCkgewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciByYkNvbGwgPSAoUnVsZUJhc2VkQ29sbGF0b3IpIENvbGxhdG9yCiAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKG5ldyBMb2NhbGUoImVzIiwgIiIsICJUUkFESVRJT05BTCIpKTsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQ29sbGF0aW9uS2V5VGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Db2xsYXRpb25LZXlUZXN0LmphdmEKaW5kZXggYjk3MzU4YS4uMDY5MTdmNyAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Db2xsYXRpb25LZXlUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Db2xsYXRpb25LZXlUZXN0LmphdmEKQEAgLTE2LDE3ICsxNiwzMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudGV4dC5Db2xsYXRpb25LZXk7CiBpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAorCitAVGVzdFRhcmdldENsYXNzKENvbGxhdGlvbktleS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ29sbGF0aW9uS2V5VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNvbGxhdGlvbktleSNjb21wYXJlVG8oamF2YS50ZXh0LkNvbGxhdGlvbktleSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZVRvIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudGV4dC5Db2xsYXRpb25LZXkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZVRvTGphdmFfdGV4dF9Db2xsYXRpb25LZXkoKSB7CiAgICAgICAgIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgY29sbGF0b3Iuc2V0U3RyZW5ndGgoQ29sbGF0b3IuUFJJTUFSWSk7CkBAIC0zOCw2ICs1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ29sbGF0aW9uS2V5I2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlVG8iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jb21wYXJlVG9MamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludAogICAgICAgICAvLyBqYXZhLnRleHQuQ29sbGF0aW9uS2V5LmNvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQpAQCAtNTEsNiArNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNvbGxhdGlvbktleSNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgY29sbGF0b3Iuc2V0U3RyZW5ndGgoQ29sbGF0b3IuUFJJTUFSWSk7CkBAIC02Miw2ICs5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ29sbGF0aW9uS2V5I2dldFNvdXJjZVN0cmluZygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNvdXJjZVN0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U291cmNlU3RyaW5nKCkgewogICAgICAgICBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CiAgICAgICAgIGNvbGxhdG9yLnNldFN0cmVuZ3RoKENvbGxhdG9yLlBSSU1BUlkpOwpAQCAtNzQsNiArMTE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5Db2xsYXRpb25LZXkjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgY29sbGF0b3Iuc2V0U3RyZW5ndGgoQ29sbGF0b3IuUFJJTUFSWSk7CkBAIC04NSw2ICsxMzcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNvbGxhdGlvbktleSN0b0J5dGVBcnJheSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiVGhpcyB0ZXN0IGZhaWxzIG9uIEhhcm1vbnkgQ2xhc3NMaWJyYXJ5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvQnl0ZUFycmF5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgLy8gRklYTUUgVGhpcyB0ZXN0IGZhaWxzIG9uIEhhcm1vbnkgQ2xhc3NMaWJyYXJ5CiAgICAgcHVibGljIHZvaWQgZmFpbGluZ190ZXN0X3RvQnl0ZUFycmF5KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYnl0ZSBbXSBqYXZhLnRleHQuQ29sbGF0aW9uS2V5LnRvQnl0ZUFycmF5KCkKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQ29sbGF0b3JUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0NvbGxhdG9yVGVzdC5qYXZhCmluZGV4IGQ0NTFjMzcuLjk4ZGI5MmIgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvQ29sbGF0b3JUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Db2xsYXRvclRlc3QuamF2YQpAQCAtMTYsMTcgKzE2LDMyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0LlJ1bGVCYXNlZENvbGxhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoQ29sbGF0b3IuY2xhc3MpIAogcHVibGljIGNsYXNzIENvbGxhdG9yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNvbGxhdG9yI2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICBDb2xsYXRvciBjID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoTG9jYWxlLkdFUk1BTik7CiAgICAgICAgIENvbGxhdG9yIGMyID0gKENvbGxhdG9yKSBjLmNsb25lKCk7CkBAIC0zNyw2ICs1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ29sbGF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjb21wYXJlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyZUxqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIENvbGxhdG9yIGMgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRlJFTkNIKTsKICAgICAgICAgT2JqZWN0IG8sIG8yOwpAQCAtMTIzLDYgKzE0NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ29sbGF0b3IjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBDb2xsYXRvciBjID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoTG9jYWxlLkVOR0xJU0gpOwogICAgICAgICBDb2xsYXRvciBjMiA9IChDb2xsYXRvcikgYy5jbG9uZSgpOwpAQCAtMTM0LDYgKzE2NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ29sbGF0b3IjZXF1YWxzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIENvbGxhdG9yIGMgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRlJFTkNIKTsKIApAQCAtMTcyLDggKzIxNCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ29sbGF0b3IjZ2V0QXZhaWxhYmxlTG9jYWxlcygpCiAgICAgICovCi0gICAgLy9GSVhNRSBUaGlzIHRlc3QgZmFpbHMgb24gSGFybW9ueSBDbGFzc0xpYnJhcnkKLSAgICBwdWJsaWMgdm9pZCBmYWlsaW5nX3Rlc3RfZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXZhaWxhYmxlTG9jYWxlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldEF2YWlsYWJsZUxvY2FsZXMoKSB7CiAgICAgICAgIExvY2FsZVtdIGxvY2FsZXMgPSBDb2xsYXRvci5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIk5vIGxvY2FsZXMiLCBsb2NhbGVzLmxlbmd0aCA+IDApOwogICAgICAgICBib29sZWFuIGVuZ2xpc2ggPSBmYWxzZSwgZ2VybWFuID0gZmFsc2U7CkBAIC0xODksMTEgKzIzOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBjMS5nZXREZWNvbXBvc2l0aW9uKCkgPT0gQ29sbGF0b3IuTk9fREVDT01QT1NJVElPTik7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBzdHJlbmd0aCIsIGMxLmdldFN0cmVuZ3RoKCkgPT0gQ29sbGF0b3IuVEVSVElBUlkpOwogICAgICAgICAgICAgaWYgKGMxIGluc3RhbmNlb2YgUnVsZUJhc2VkQ29sbGF0b3IpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBuZXcgUnVsZUJhc2VkQ29sbGF0b3IoKChSdWxlQmFzZWRDb2xsYXRvcikgYzEpLmdldFJ1bGVzKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiUGFyc2VFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHJ1bGUgPSAiIjsKKy8vICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bGUgPSAoKFJ1bGVCYXNlZENvbGxhdG9yKSBjMSkuZ2V0UnVsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbGU6ICIgKyBsb2NhbGVzW2ldICsgIiB3aXRoIHJ1bGU6ICIgKyBydWxlKTsKKyAgICAgICAgICAgICAgICAgICAgLy9uZXcgUnVsZUJhc2VkQ29sbGF0b3IocnVsZSk7CisvLyAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSArICIgZm9yIHJ1bGU6IFwiIiArIHJ1bGUgKyAiXCIiKTsKKy8vICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBhc3NlcnRUcnVlKCJDYW4ndCByZWNyZWF0ZTogIiArIGxvY2FsZXNbaV0sIHRlbXAuZXF1YWxzKGMxKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwMyw4ICsyNTYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNvbGxhdG9yI2dldERlY29tcG9zaXRpb24oKQogICAgICAqLwotICAgIC8vRklYTUUgVGhpcyB0ZXN0IGZhaWxzIG9uIEhhcm1vbnkgQ2xhc3NMaWJyYXJ5Ci0gICAgcHVibGljIHZvaWQgZmFpbGluZ190ZXN0X2dldERlY29tcG9zaXRpb24oKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgQ0FOT05JQ0FMX0RFQ09NUE9TSVRJT04sIEZVTExfREVDT01QT1NJVElPTiBtb2Rlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNvbXBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXREZWNvbXBvc2l0aW9uKCkgewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciBjb2xsYXRvcjsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGNvbGxhdG9yID0gbmV3IFJ1bGVCYXNlZENvbGxhdG9yKCI7IFx1MDMwMCA8IGEsIEEgPCBiIDwgYyA8IGQiKTsKQEAgLTIxMiwxMyArMjczLDI3IEBACiAgICAgICAgICAgICBmYWlsKCJQYXJzZUV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAvLyBEaWZmZXJlbmNlIHRvIHRoZSBSSS4gSGFybW9ueSB1c2VzIE5PX0RFQ09NUE9TSVRJT04gYXMgZGVmYXVsdC4KKyAgICAgICAgLy8gYXNzZXJ0VHJ1ZSgiV3JvbmcgZGVmYXVsdCIsCisgICAgICAgIC8vICAgICAgICAgY29sbGF0b3IuZ2V0RGVjb21wb3NpdGlvbigpID09IENvbGxhdG9yLkNBTk9OSUNBTF9ERUNPTVBPU0lUSU9OKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZGVmYXVsdCIsCi0gICAgICAgICAgICAgICAgY29sbGF0b3IuZ2V0RGVjb21wb3NpdGlvbigpID09IENvbGxhdG9yLkNBTk9OSUNBTF9ERUNPTVBPU0lUSU9OKTsKKyAgICAgICAgICAgICAgICAgY29sbGF0b3IuZ2V0RGVjb21wb3NpdGlvbigpID09IENvbGxhdG9yLk5PX0RFQ09NUE9TSVRJT04pOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5Db2xsYXRvciNnZXRJbnN0YW5jZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZSgpIHsKICAgICAgICAgQ29sbGF0b3IgYzEgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwogICAgICAgICBDb2xsYXRvciBjMiA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwpAQCAtMjI4LDYgKzMwMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuQ29sbGF0b3IjZ2V0SW5zdGFuY2UoamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJVc2VkIHRvIHRlc3QiLCB0cnVlKTsKICAgICB9CkBAIC0yMzUsNiArMzE5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5Db2xsYXRvciNnZXRTdHJlbmd0aCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN0cmVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTdHJlbmd0aCgpIHsKICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgY29sbGF0b3I7CiAgICAgICAgIHRyeSB7CkBAIC0yNDksOCArMzQyLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5Db2xsYXRvciNzZXREZWNvbXBvc2l0aW9uKGludCkKICAgICAgKi8KLSAgICAvL0ZJWE1FIFRoaXMgdGVzdCBmYWlscyBvbiBIYXJtb255IENsYXNzTGlicmFyeQotICAgIHB1YmxpYyB2b2lkIGZhaWxpbmdfdGVzdF9zZXREZWNvbXBvc2l0aW9uSSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVjb21wb3NpdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3NldERlY29tcG9zaXRpb25JKCkgewogICAgICAgICBDb2xsYXRvciBjID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoTG9jYWxlLkZSRU5DSCk7CiAgICAgICAgIGMuc2V0U3RyZW5ndGgoQ29sbGF0b3IuSURFTlRJQ0FMKTsKICAgICAgICAgYy5zZXREZWNvbXBvc2l0aW9uKENvbGxhdG9yLk5PX0RFQ09NUE9TSVRJT04pOwpAQCAtMjcxLDEyICszNzIsMzIgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkNvbGxhdG9yI3NldFN0cmVuZ3RoKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJFbXB0eSB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFN0cmVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTdHJlbmd0aEkoKSB7CiAgICAgICAgIGFzc2VydFRydWUoIlVzZWQgdG8gdGVzdCIsIHRydWUpOwogICAgIH0KLSAgICAKLQotICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgQW5kcm9pZCBidWcKKyAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEFuZHJvaWQgYnVnICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFN0cmVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2xsYXRpb25LZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zdGFja0NvcnJ1cHRpb24oKSB7CiAgICAgICAgIENvbGxhdG9yIG1Db2xsID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgbUNvbGwuc2V0U3RyZW5ndGgoQ29sbGF0b3IuUFJJTUFSWSk7CkBAIC0yODQsNiArNDA1LDE1IEBACiAgICAgfQogICAgIAogICAgIC8vIFRlc3QgdG8gdmVyaWZ5IHRoYXQgdmVyeSBsYXJnZSBjb2xsYXRpb24ga2V5cyBhcmUgbm90IHRydW5jYXRlZC4KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbGxhdGlvbktleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbGxhdGlvbktleVNpemUoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CkBAIC0zMTQsNCArNDQ0LDI0IEBACiAgICAgICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIik7CiAgICAgICAgIH0KICAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRlVMTF9ERUNPTVBPU0lUSU9OIG1vZGUsIGFuZCBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVjb21wb3NpdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZGVjb21wb3NpdGlvbkNvbXBhdGliaWxpdHkoKSB7CisgICAgICAgIENvbGxhdG9yIG15Q29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOworICAgICAgICBteUNvbGxhdG9yLnNldERlY29tcG9zaXRpb24oQ29sbGF0b3IuTk9fREVDT01QT1NJVElPTik7CisgICAgICAgIGFzc2VydEZhbHNlKCJFcnJvcjogXHUwMGUwXHUwMzI1IHNob3VsZCBub3QgZXF1YWwgdG8gYVx1MDMyNVx1MDMwMCAiICsKKyAgICAgICAgICAgICAgICAid2l0aG91dCBkZWNvbXBvc2l0aW9uIiwgCisgICAgICAgICAgICAgICAgbXlDb2xsYXRvci5jb21wYXJlKCJcdTAwZTBcdTAzMjUiLCAiYVx1MDMyNVx1MDMwMCIpID09IDApOworICAgICAgICBteUNvbGxhdG9yLnNldERlY29tcG9zaXRpb24oQ29sbGF0b3IuQ0FOT05JQ0FMX0RFQ09NUE9TSVRJT04pOworICAgICAgICBhc3NlcnRUcnVlKCJFcnJvcjogXHUwMGUwXHUwMzI1IHNob3VsZCBlcXVhbCB0byBhXHUwMzI1XHUwMzAwICIgKworICAgICAgICAgICAgICAgICJ3aXRoIGRlY29tcG9zaXRpb24iLCAKKyAgICAgICAgICAgICAgICBteUNvbGxhdG9yLmNvbXBhcmUoIlx1MDBlMFx1MDMyNSIsICJhXHUwMzI1XHUwMzAwIikgPT0gMCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EYXRhRm9ybWF0RmllbGRUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RhdGFGb3JtYXRGaWVsZFRlc3QuamF2YQppbmRleCA5YWJjOGI5Li42NGYzMmMyIDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RhdGFGb3JtYXRGaWVsZFRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RhdGFGb3JtYXRGaWVsZFRlc3QuamF2YQpAQCAtMTcsMjEgKzE3LDM1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkludmFsaWRPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkludmFsaWRPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLQogaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0LkZpZWxkOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQorQFRlc3RUYXJnZXRDbGFzcyhEYXRlRm9ybWF0LkZpZWxkLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBEYXRhRm9ybWF0RmllbGRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTc4CiAgICAgICAgIE15RmllbGQgZmllbGQgPSBuZXcgTXlGaWVsZCgiZGF5IG9mIG1vbnRoIiwgQ2FsZW5kYXIuRVJBKTsKQEAgLTY2LDYgKzgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkI0ZpZWxkKGphdmEubGFuZy5TdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmllbGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdJKCkgewogICAgICAgICBNeUZpZWxkIGZpZWxkID0gbmV3IE15RmllbGQoImEgZmllbGQiLCBDYWxlbmRhci5EQVlfT0ZfV0VFSyk7CiAKQEAgLTgyLDYgKzEwNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCRGaWVsZCNGaWVsZChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcjIoKSB7CiAgICAgICAgIE15RmllbGQgZmllbGQgPSBuZXcgTXlGaWVsZCgiZGF5IG9mIG1vbnRoIiwgQ2FsZW5kYXIuRVJBKTsKIApAQCAtMTAzLDYgKzEzNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCRGaWVsZCNnZXRDYWxlbmRhckZpZWxkKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q2FsZW5kYXJGaWVsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FsZW5kYXJGaWVsZCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBnZXRDYWxlbmRhckZpZWxkKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaWVsZC5BTV9QTS5nZXRDYWxlbmRhckZpZWxkKCkgcmV0dXJuZWQgdGhlIHdyb25nIHZhbHVlIiwKQEAgLTEyNyw2ICsxNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQjb2ZDYWxlbmRhckZpZWxkKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAib2ZDYWxlbmRhckZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9vZkNhbGVuZGFyRmllbGRJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgc3RhdGljIGphdmEudGV4dC5EYXRlRm9ybWF0LkZpZWxkCiAgICAgICAgIC8vIG9mQ2FsZW5kYXJGaWVsZChpbnQpCkBAIC0xNjUsNiArMjE1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkI3JlYWRSZXNvbHZlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZFJlc29sdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRSZXNvbHZlKCkgewogICAgICAgICAvLyB0ZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCiAKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHNUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RhdGVGb3JtYXRTeW1ib2xzVGVzdC5qYXZhCmluZGV4IDJiZjlkZDIuLmMyMjQyNGYgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHNUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EYXRlRm9ybWF0U3ltYm9sc1Rlc3QuamF2YQpAQCAtMTYsMTAgKzE2LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAorQFRlc3RUYXJnZXRDbGFzcyhEYXRlRm9ybWF0U3ltYm9scy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRGF0ZUZvcm1hdFN5bWJvbHNUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgRGF0ZUZvcm1hdFN5bWJvbHMgZGZzOwpAQCAtMjcsNiArMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzI0RhdGVGb3JtYXRTeW1ib2xzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGF0ZUZvcm1hdFN5bWJvbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzKCkKICAgICAgICAgLy8gVXNlZCBpbiB0ZXN0cwpAQCAtNDAsNiArNTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzI0RhdGVGb3JtYXRTeW1ib2xzKGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkRhdGVGb3JtYXRTeW1ib2xzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyhqYXZhLnV0aWwuTG9jYWxlKQogICAgICAgICB0cnkgewpAQCAtNTIsNiArNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzI2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuY2xvbmUoKQogICAgICAgICBEYXRlRm9ybWF0U3ltYm9scyBzeW1ib2xzID0gbmV3IERhdGVGb3JtYXRTeW1ib2xzKCk7CkBAIC02Miw2ICs5NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCkBAIC03NCw2ICsxMTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzI2dldEFtUG1TdHJpbmdzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QW1QbVN0cmluZ3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFtUG1TdHJpbmdzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBbXQogICAgICAgICAvLyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuZ2V0QW1QbVN0cmluZ3MoKQpAQCAtODgsNiArMTM5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNnZXRFcmFzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RXJhcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RXJhcygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10KICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLmdldEVyYXMoKQpAQCAtMTAyLDYgKzE2MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMjZ2V0TG9jYWxQYXR0ZXJuQ2hhcnMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbFBhdHRlcm5DaGFycyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxQYXR0ZXJuQ2hhcnMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCiAgICAgICAgIC8vIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scy5nZXRMb2NhbFBhdHRlcm5DaGFycygpCkBAIC0xMTUsNiArMTg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNnZXRNb250aHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNb250aHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vbnRocygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10KICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLmdldE1vbnRocygpCkBAIC0xMzEsNiArMjA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNnZXRTaG9ydE1vbnRocygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFNob3J0TW9udGhzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTaG9ydE1vbnRocygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10KICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLmdldFNob3J0TW9udGhzKCkKQEAgLTE0Niw2ICsyMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzI2dldFNob3J0V2Vla2RheXMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTaG9ydFdlZWtkYXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTaG9ydFdlZWtkYXlzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBbXQogICAgICAgICAvLyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuZ2V0U2hvcnRXZWVrZGF5cygpCkBAIC0xNjAsNiArMjU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNnZXRXZWVrZGF5cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFdlZWtkYXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRXZWVrZGF5cygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmcgW10KICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLmdldFdlZWtkYXlzKCkKQEAgLTE3NSw2ICsyODAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzI2dldFpvbmVTdHJpbmdzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Wm9uZVN0cmluZ3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFpvbmVTdHJpbmdzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBbXVtdCiAgICAgICAgIC8vIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scy5nZXRab25lU3RyaW5ncygpCkBAIC0xOTEsNiArMzA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNoYXNoQ29kZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuaGFzaENvZGUoKQogICAgICAgICBpbnQgaGMxID0gZGZzLmhhc2hDb2RlKCk7CkBAIC0yMDUsNiArMzI4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNzZXRBbVBtU3RyaW5ncyhqYXZhLmxhbmcuU3RyaW5nW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEFtUG1TdHJpbmdzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRBbVBtU3RyaW5ncyRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLnNldEFtUG1TdHJpbmdzKGphdmEubGFuZy5TdHJpbmcgW10pCkBAIC0yMjAsNiArMzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNzZXRFcmFzKGphdmEubGFuZy5TdHJpbmdbXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RXJhcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RXJhcyRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLnNldEVyYXMoamF2YS5sYW5nLlN0cmluZyBbXSkKQEAgLTIzNSw2ICszNzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzI3NldExvY2FsUGF0dGVybkNoYXJzKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldExvY2FsUGF0dGVybkNoYXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYWxQYXR0ZXJuQ2hhcnNMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLnNldExvY2FsUGF0dGVybkNoYXJzKGphdmEubGFuZy5TdHJpbmcpCkBAIC0yNTUsNiArNDA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNzZXRNb250aHMoamF2YS5sYW5nLlN0cmluZ1tdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNb250aHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1vbnRocyRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLnNldE1vbnRocyhqYXZhLmxhbmcuU3RyaW5nIFtdKQpAQCAtMjcxLDYgKzQzMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMjc2V0U2hvcnRNb250aHMoamF2YS5sYW5nLlN0cmluZ1tdKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRTaG9ydE1vbnRocyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2hvcnRNb250aHMkTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scy5zZXRTaG9ydE1vbnRocyhqYXZhLmxhbmcuU3RyaW5nIFtdKQpAQCAtMjg3LDYgKzQ1NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMjc2V0U2hvcnRXZWVrZGF5cyhqYXZhLmxhbmcuU3RyaW5nW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNob3J0V2Vla2RheXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNob3J0V2Vla2RheXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scy5zZXRTaG9ydFdlZWtkYXlzKGphdmEubGFuZy5TdHJpbmcgW10pCkBAIC0zMDMsNiArNDgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNzZXRXZWVrZGF5cyhqYXZhLmxhbmcuU3RyaW5nW10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFdlZWtkYXlzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmdbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRXZWVrZGF5cyRMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQKICAgICAgICAgLy8gamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzLnNldFdlZWtkYXlzKGphdmEubGFuZy5TdHJpbmcgW10pCkBAIC0zMTksNiArNTA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyNzZXRab25lU3RyaW5ncyhqYXZhLmxhbmcuU3RyaW5nW11bXSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Wm9uZVN0cmluZ3MiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZ1tdW10uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Wm9uZVN0cmluZ3MkJExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuc2V0Wm9uZVN0cmluZ3MoamF2YS5sYW5nLlN0cmluZyBbXVtdKQpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EYXRlRm9ybWF0VGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EYXRlRm9ybWF0VGVzdC5qYXZhCmluZGV4IDczMzgxMmYuLmEyYWI3YmIgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRGF0ZUZvcm1hdFRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RhdGVGb3JtYXRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzOwogaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwpAQCAtMjgsOCArMzMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoRGF0ZUZvcm1hdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRGF0ZUZvcm1hdFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBjbGFzcyBNb2NrRGF0ZUZvcm1hdCBleHRlbmRzIERhdGVGb3JtYXQgewpAQCAtNTgsNiArNjIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjRGF0ZUZvcm1hdCgpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EYXRlRm9ybWF0I0RhdGVGb3JtYXQoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGF0ZUZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0RhdGVGb3JtYXQoKTsKQEAgLTcwLDcgKzgzLDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0IG9iaikgVGVzdCBvZgogICAgICAqICAgICAgICBqYXZhLnRleHQuRGF0ZUZvcm1hdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvYmopLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgRGF0ZUZvcm1hdCBjbG9uZSA9IChEYXRlRm9ybWF0KSBmb3JtYXQuY2xvbmUoKTsKQEAgLTg4LDYgKzExMCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCNmb3JtYXQoamF2YS51dGlsLkRhdGUpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EYXRlRm9ybWF0I2Zvcm1hdChqYXZhLnV0aWwuRGF0ZSkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuRGF0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV91dGlsX0RhdGUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgKQEAgLTEwNiw2ICsxMzcsMTYgQEAKICAgICAgKiAgICAgICAgVGVzdCBvZiBtZXRob2QgamF2YS50ZXh0LkRhdGVGb3JtYXQjZm9ybWF0KE9iamVjdCwgU3RyaW5nQnVmZmVyLAogICAgICAqICAgICAgICBGaWVsZFBvc2l0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICBqYXZhLnRleHQuRmllbGRQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfU3RyaW5nQnVmZmVyTGphdmFfdGV4dF9GaWVsZFBvc2l0aW9uKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoCkBAIC0xMjksNyArMTcwLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2Nsb25lKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Nsb25lKCkgewogICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgRGF0ZUZvcm1hdCBjbG9uZSA9IChEYXRlRm9ybWF0KSBmb3JtYXQuY2xvbmUoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xvbmUgbm90IGVxdWFsIiwgZm9ybWF0LmVxdWFscyhjbG9uZSkpOwpAQCAtMTQwLDYgKzE5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCNnZXRBdmFpbGFibGVMb2NhbGVzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXZhaWxhYmxlTG9jYWxlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHsKICAgICAgICAgTG9jYWxlW10gbG9jYWxlcyA9IERhdGVGb3JtYXQuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJObyBsb2NhbGVzIiwgbG9jYWxlcy5sZW5ndGggPiAwKTsKQEAgLTE2MCw2ICsyMTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjZ2V0Q2FsZW5kYXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDYWxlbmRhciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FsZW5kYXIoKSB7CiAgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXRJbnN0YW5jZSgpOwogICAgICAgICBDYWxlbmRhciBjYWwxID0gZm9ybWF0LmdldENhbGVuZGFyKCk7CkBAIC0xNzAsNyArMjM4LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2dldERhdGVJbnN0YW5jZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREYXRlSW5zdGFuY2UoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERhdGVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldERhdGVJbnN0YW5jZSgpIHsKICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmMiA9IChTaW1wbGVEYXRlRm9ybWF0KSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOwogICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBjbGFzcyIsIGYyLmdldENsYXNzKCkgPT0gU2ltcGxlRGF0ZUZvcm1hdC5jbGFzcyk7CiAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGRlZmF1bHQiLCBmMi5lcXVhbHMoRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoCkBAIC0xODQsNyArMjYxLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2dldERhdGVJbnN0YW5jZShpbnQpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREYXRlSW5zdGFuY2VJKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREYXRlSW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXREYXRlSW5zdGFuY2VJKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJEZWZhdWx0IG5vdCBtZWRpdW0iLAogICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuREVGQVVMVCA9PSBEYXRlRm9ybWF0Lk1FRElVTSk7CiAKQEAgLTIzNyw2ICszMjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjZ2V0RGF0ZUluc3RhbmNlKGludCwgamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGF0ZUluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzcywgamF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREYXRlSW5zdGFuY2VJTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZjIgPSAoU2ltcGxlRGF0ZUZvcm1hdCkgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgRGF0ZUZvcm1hdC5TSE9SVCwgTG9jYWxlLkdFUk1BTik7CkBAIC0yODIsNyArMzc3LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2dldERhdGVUaW1lSW5zdGFuY2UoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGF0ZVRpbWVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldERhdGVUaW1lSW5zdGFuY2UoKSB7CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZjIgPSAoU2ltcGxlRGF0ZUZvcm1hdCkgRGF0ZUZvcm1hdAogICAgICAgICAgICAgICAgIC5nZXREYXRlVGltZUluc3RhbmNlKCk7CiAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGNsYXNzIiwgZjIuZ2V0Q2xhc3MoKSA9PSBTaW1wbGVEYXRlRm9ybWF0LmNsYXNzKTsKQEAgLTMxMyw2ICs0MTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjZ2V0RGF0ZVRpbWVJbnN0YW5jZShpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGF0ZVRpbWVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREYXRlVGltZUluc3RhbmNlSUkoKSB7CiAgICAgICAgIHRlc3REYXRlVGltZShEYXRlRm9ybWF0LlNIT1JULCBEYXRlRm9ybWF0LlNIT1JUKTsKICAgICAgICAgdGVzdERhdGVUaW1lKERhdGVGb3JtYXQuU0hPUlQsIERhdGVGb3JtYXQuTUVESVVNKTsKQEAgLTM2Myw2ICs0NzYsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjZ2V0RGF0ZVRpbWVJbnN0YW5jZShpbnQsIGludCwKICAgICAgKiAgICAgICAgamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGF0ZVRpbWVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGludC5jbGFzcywgamF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREYXRlVGltZUluc3RhbmNlSUlMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgdGVzdERhdGVUaW1lTG9jYWxlKERhdGVGb3JtYXQuU0hPUlQsIERhdGVGb3JtYXQuU0hPUlQpOwogICAgICAgICB0ZXN0RGF0ZVRpbWVMb2NhbGUoRGF0ZUZvcm1hdC5TSE9SVCwgRGF0ZUZvcm1hdC5NRURJVU0pOwpAQCAtMzk2LDcgKzUxOCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCNnZXRJbnN0YW5jZSgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRJbnN0YW5jZSgpIHsKICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmMiA9IChTaW1wbGVEYXRlRm9ybWF0KSBEYXRlRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGNsYXNzIiwgZjIuZ2V0Q2xhc3MoKSA9PSBTaW1wbGVEYXRlRm9ybWF0LmNsYXNzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZGVmYXVsdCIsIGYyLmVxdWFscyhEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoCkBAIC00MTAsNiArNTQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2dldE51bWJlckZvcm1hdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE51bWJlckZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TnVtYmVyRm9ybWF0KCkgewogICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgTnVtYmVyRm9ybWF0IG5mMSA9IGZvcm1hdC5nZXROdW1iZXJGb3JtYXQoKTsKQEAgLTQyMCw3ICs1NjAsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjZ2V0VGltZUluc3RhbmNlKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRpbWVJbnN0YW5jZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0VGltZUluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0VGltZUluc3RhbmNlKCkgewogICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGYyID0gKFNpbXBsZURhdGVGb3JtYXQpIERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKCk7CiAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGNsYXNzIiwgZjIuZ2V0Q2xhc3MoKSA9PSBTaW1wbGVEYXRlRm9ybWF0LmNsYXNzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZGVmYXVsdCIsIGYyLmVxdWFscyhEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgKQEAgLTQzNCw3ICs1ODMsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjZ2V0VGltZUluc3RhbmNlKGludCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRpbWVJbnN0YW5jZUkoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRpbWVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFRpbWVJbnN0YW5jZUkoKSB7CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZjIgPSAoU2ltcGxlRGF0ZUZvcm1hdCkgRGF0ZUZvcm1hdAogICAgICAgICAgICAgICAgIC5nZXRUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCk7CiAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGNsYXNzMSIsIGYyLmdldENsYXNzKCkgPT0gU2ltcGxlRGF0ZUZvcm1hdC5jbGFzcyk7CkBAIC00ODQsNiArNjQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2dldFRpbWVJbnN0YW5jZShpbnQsIGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRpbWVJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3MsIGphdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VGltZUluc3RhbmNlSUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGYyID0gKFNpbXBsZURhdGVGb3JtYXQpIERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKAogICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuU0hPUlQsIExvY2FsZS5HRVJNQU4pOwpAQCAtNTI5LDYgKzY5NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCNnZXRUaW1lWm9uZSgpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EYXRlRm9ybWF0I2dldFRpbWVab25lKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRpbWVab25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRUaW1lWm9uZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXRJbnN0YW5jZSgpOwpAQCAtNTQ5LDcgKzcyNSwxNiBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCNoYXNoQ29kZSgpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EYXRlRm9ybWF0I2hhc2hDb2RlKCkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9oYXNoQ29kZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIERhdGVGb3JtYXQgZGYxID0gRGF0ZUZvcm1hdC5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgRGF0ZUZvcm1hdCBkZjIgPSAoRGF0ZUZvcm1hdCkgZGYxLmNsb25lKCk7CkBAIC01NjYsNiArNzUxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I2lzTGVuaWVudCgpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EYXRlRm9ybWF0I2lzTGVuaWVudCgpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0xlbmllbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTGVuaWVudCgpIHsKICAgICAgICAgRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgQ2FsZW5kYXIgYyA9IGRmLmdldENhbGVuZGFyKCk7CkBAIC02MDksNiArODAzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I3NldENhbGVuZGFyKGphdmEudXRpbC5DYWxlbmRhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q2FsZW5kYXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkNhbGVuZGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENhbGVuZGFyTGphdmFfdXRpbF9DYWxlbmRhcigpIHsKICAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPSBEYXRlRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CkBAIC02MTksNiArODIyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EYXRlRm9ybWF0I3NldE51bWJlckZvcm1hdChqYXZhLnRleHQuTnVtYmVyRm9ybWF0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROdW1iZXJGb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0Lk51bWJlckZvcm1hdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXROdW1iZXJGb3JtYXRMamF2YV90ZXh0X051bWJlckZvcm1hdCgpIHsKICAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPSBEYXRlRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIE51bWJlckZvcm1hdCBmMSA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwpAQCAtNjI5LDYgKzg0MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCNwYXJzZShTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgUGFyc2VFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZV9MU3RyaW5nKCkgewogICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgdHJ5IHsKQEAgLTY0Niw2ICs4NjcsMTUgQEAKICAgICAgKiAgICAgICAgcGFydGlhbHkgY29ycmVjdCBkYXRhIHN0cmluZy4gQ2FzZSAzOiBUcnkgdG8gdXNlIGFyZ3VtZW50CiAgICAgICogICAgICAgIFBhcnNlUG9zaXRpb24gYXMgbnVsbC4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBpbmNvcnJlY3QgZGF0YSBzdHJpbmcgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VPYmplY3RMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3RleHRfUGFyc2VQb3NpdGlvbigpIHsKICAgICAgICAgRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgdHJ5IHsKQEAgLTY4NCw2ICs5MTQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRhdGVGb3JtYXQjc2V0TGVuaWVudChib29sZWFuKSBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuRGF0ZUZvcm1hdCNzZXRMZW5pZW50KGJvb2xlYW4pLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRMZW5pZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGVuaWVudFooKSB7CiAgICAgICAgIERhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIENhbGVuZGFyIGMgPSBkZi5nZXRDYWxlbmRhcigpOwpAQCAtNzE0LDYgKzk1MywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGF0ZUZvcm1hdCNzZXRUaW1lWm9uZShUaW1lWm9uZSkgVGVzdCBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkRhdGVGb3JtYXQjc2V0VGltZVpvbmUoVGltZVpvbmUpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUaW1lWm9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuVGltZVpvbmUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VGltZVpvbmVMamF2YV91dGlsX1RpbWVab25lKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPSBEYXRlRm9ybWF0LmdldEluc3RhbmNlKCk7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RlY2ltYWxGb3JtYXRTeW1ib2xzVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0U3ltYm9sc1Rlc3QuamF2YQppbmRleCA0MTA4MjkyLi5mZTU3ZDFmIDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RlY2ltYWxGb3JtYXRTeW1ib2xzVGVzdC5qYXZhCisrKyBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRGVjaW1hbEZvcm1hdFN5bWJvbHNUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDEzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwpAQCAtMjcsOSArMzQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5DdXJyZW5jeTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKERlY2ltYWxGb3JtYXRTeW1ib2xzLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBEZWNpbWFsRm9ybWF0U3ltYm9sc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBkZnM7CkBAIC00MCw2ICs0NSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjRGVjaW1hbEZvcm1hdFN5bWJvbHMoKSBUZXN0IG9mCiAgICAgICogICAgICAgIG1ldGhvZCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjRGVjaW1hbEZvcm1hdFN5bWJvbHMoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRGVjaW1hbEZvcm1hdFN5bWJvbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzKCkKICAgICAgICAgdHJ5IHsKQEAgLTUyLDYgKzY2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNEZWNpbWFsRm9ybWF0U3ltYm9scyhqYXZhLnV0aWwuTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIG5vdCB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWNpbWFsRm9ybWF0U3ltYm9scyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXRTeW1ib2xzIGRmcyA9IG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyhuZXcgTG9jYWxlKCJlbiIsCiAgICAgICAgICAgICAgICAgInVzIikpOwpAQCAtNjQsNiArODcsMTUgQEAKICAgICAgKiAgICAgICAgaW50ZXJuYWwgdmFyaWFibGVzIG9mIGNsb25lZCBvYmplY3RzLiBDYXNlIDI6IENvbXBhcmUgb2YgY2xvbmVzLgogICAgICAqICAgICAgICBDYXNlIDM6IENoYW5nZSB0aGUgY29udGVudCBvZiB0aGUgY2xvbmUuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGNhc2UgMTogQ29tcGFyZSBvZiBpbnRlcm5hbCB2YXJpYWJsZXMgb2YgY2xvbmVkIG9iamVjdHMKQEAgLTkyLDYgKzEyNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKCJFcXVhbCBvYmplY3RzIHJldHVybmVkIGZhbHNlIiwgZGZzLmVxdWFscyhkZnMuY2xvbmUoKSkpOwogICAgICAgICBkZnMuc2V0RGlnaXQoJ0InKTsKQEAgLTEwMyw2ICsxNDQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI2dldEN1cnJlbmN5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q3VycmVuY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnJlbmN5KCkgewogICAgICAgICBDdXJyZW5jeSBjdXJyZW5jeSA9IEN1cnJlbmN5LmdldEluc3RhbmNlKCJVU0QiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IGN1cnJlbmN5IiwKQEAgLTE2Myw2ICsyMTMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI2dldEN1cnJlbmN5U3ltYm9sKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q3VycmVuY3lTeW1ib2wiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnJlbmN5U3ltYm9sKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBjdXJyZW5jeVN5bWJvbCIsICIkIiwgZGZzVVMKICAgICAgICAgICAgICAgICAuZ2V0Q3VycmVuY3lTeW1ib2woKSk7CkBAIC0xNzEsNiArMjMwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNnZXREZWNpbWFsU2VwYXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVjaW1hbFNlcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjaW1hbFNlcGFyYXRvcigpIHsKICAgICAgICAgZGZzLnNldERlY2ltYWxTZXBhcmF0b3IoJyonKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgRGVjaW1hbFNlcGFyYXRvciBzeW1ib2wiLCAnKicsIGRmcwpAQCAtMTgwLDYgKzI0OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjZ2V0RGlnaXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREaWdpdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlnaXQoKSB7CiAgICAgICAgIGRmcy5zZXREaWdpdCgnKicpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBEaWdpdCBzeW1ib2wiLCAnKicsIGRmcy5nZXREaWdpdCgpKTsKQEAgLTE4OCw2ICsyNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI2dldEdyb3VwaW5nU2VwYXJhdG9yKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0R3JvdXBpbmdTZXBhcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEdyb3VwaW5nU2VwYXJhdG9yKCkgewogICAgICAgICBkZnMuc2V0R3JvdXBpbmdTZXBhcmF0b3IoJyonKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgR3JvdXBpbmdTZXBhcmF0b3Igc3ltYm9sIiwgJyonLCBkZnMKQEAgLTE5Nyw2ICsyODMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI2dldEluZmluaXR5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5maW5pdHkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluZmluaXR5KCkgewogICAgICAgICBkZnMuc2V0SW5maW5pdHkoIiYiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW5jb3JyZWN0IEluZmluaXR5IHN5bWJvbCIsCkBAIC0yMDYsNiArMzAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNnZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2woKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2wiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludGVybmF0aW9uYWxDdXJyZW5jeVN5bWJvbCgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sIiwgIlVTRCIsCiAgICAgICAgICAgICAgICAgZGZzVVMuZ2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKCkpOwpAQCAtMjE0LDYgKzMxOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjZ2V0TWludXNTaWduKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWludXNTaWduIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNaW51c1NpZ24oKSB7CiAgICAgICAgIGRmcy5zZXRNaW51c1NpZ24oJyYnKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgTWludXNTaWduIHN5bWJvbCIsICcmJywgZGZzCkBAIC0yMjUsNiArMzM4LDE1IEBACiAgICAgICogICAgICAgIG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjZ2V0TW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1vbmV0YXJ5RGVjaW1hbFNlcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgZGZzLnNldE1vbmV0YXJ5RGVjaW1hbFNlcGFyYXRvcignLCcpOwpAQCAtMjM4LDYgKzM2MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjZ2V0TmFOKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFOIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXROYU4oKSB7CiAgICAgICAgIGRmcy5zZXROYU4oIk5BTiEhIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IG5hbiBzeW1ib2wiLCAiTkFOISEiLCBkZnMuZ2V0TmFOKCkpOwpAQCAtMjQ2LDYgKzM3NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjZ2V0UGF0dGVyblNlcGFyYXRvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBhdHRlcm5TZXBhcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhdHRlcm5TZXBhcmF0b3IoKSB7CiAgICAgICAgIGRmcy5zZXRQYXR0ZXJuU2VwYXJhdG9yKCdYJyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IFBhdHRlcm5TZXBhcmF0b3Igc3ltYm9sIiwgJ1gnLCBkZnMKQEAgLTI1NSw2ICszOTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI2dldFBlcmNlbnQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZXJjZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQZXJjZW50KCkgewogICAgICAgICBkZnMuc2V0UGVyY2VudCgnKicpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBQZXJjZW50IHN5bWJvbCIsICcqJywgZGZzLmdldFBlcmNlbnQoKSk7CkBAIC0yNjMsNiArNDEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNnZXRQZXJNaWxsKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGVyTWlsbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVyTWlsbCgpIHsKICAgICAgICAgZGZzLnNldFBlck1pbGwoJyMnKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgUGVyTWlsbCBzeW1ib2wiLCAnIycsIGRmcy5nZXRQZXJNaWxsKCkpOwpAQCAtMjcxLDYgKzQyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjZ2V0WmVyb0RpZ2l0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0WmVyb0RpZ2l0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRaZXJvRGlnaXQoKSB7CiAgICAgICAgIGRmcy5zZXRaZXJvRGlnaXQoJyonKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgWmVyb0RpZ2l0IHN5bWJvbCIsICcqJywgZGZzCkBAIC0yODEsNiArNDQ4LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNoYXNoQ29kZSgpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNoYXNoQ29kZSgpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBkZnMxID0gbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzKCk7CkBAIC0zMDAsNiArNDc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNzZXRDdXJyZW5jeShqYXZhLnV0aWwuQ3VycmVuY3kpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEN1cnJlbmN5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5DdXJyZW5jeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRDdXJyZW5jeUxqYXZhX3V0aWxfQ3VycmVuY3koKSB7CiAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBMb2NhbGUuQ0FOQURBOwogICAgICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBkZnMgPSAoKERlY2ltYWxGb3JtYXQpIE51bWJlckZvcm1hdApAQCAtMzI2LDYgKzUxMSwxNSBAQAogICAgICAqICAgICAgICBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjc2V0Q3VycmVuY3lTeW1ib2woamF2YS5sYW5nLlN0cmluZykuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEN1cnJlbmN5U3ltYm9sIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3VycmVuY3lTeW1ib2xMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGRmcy5zZXRDdXJyZW5jeVN5bWJvbCgiJCIpOwpAQCAtMzM5LDYgKzUzMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjc2V0RGVjaW1hbFNlcGFyYXRvcihjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREZWNpbWFsU2VwYXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVjaW1hbFNlcGFyYXRvckMoKSB7CiAgICAgICAgIGRmcy5zZXREZWNpbWFsU2VwYXJhdG9yKCcqJyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IERlY2ltYWxTZXBhcmF0b3Igc3ltYm9sIiwgJyonLCBkZnMKQEAgLTM0OCw2ICs1NTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI3NldERpZ2l0KGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERpZ2l0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlnaXRDKCkgewogICAgICAgICBkZnMuc2V0RGlnaXQoJyonKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgRGlnaXQgc3ltYm9sIiwgJyonLCBkZnMuZ2V0RGlnaXQoKSk7CkBAIC0zNTYsNiArNTY4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNzZXRHcm91cGluZ1NlcGFyYXRvcihjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRHcm91cGluZ1NlcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEdyb3VwaW5nU2VwYXJhdG9yQygpIHsKICAgICAgICAgZGZzLnNldEdyb3VwaW5nU2VwYXJhdG9yKCcqJyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IEdyb3VwaW5nU2VwYXJhdG9yIHN5bWJvbCIsICcqJywgZGZzCkBAIC0zNjUsNiArNTg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNzZXRJbmZpbml0eShqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJbmZpbml0eSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEluZmluaXR5TGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIGRmcy5zZXRJbmZpbml0eSgiJiIpOwogICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBpbmNvcnJlY3QgSW5maW5pdHkgc3ltYm9sIiwKQEAgLTM3NCw3ICs2MDQsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI3NldEludGVybmF0aW9uYWxDdXJyZW5jeVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEludGVybmF0aW9uYWxDdXJyZW5jeVN5bWJvbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2xMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5DQU5BREE7CiAgICAgICAgIERlY2ltYWxGb3JtYXRTeW1ib2xzIGRmcyA9ICgoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0CiAgICAgICAgICAgICAgICAgLmdldEN1cnJlbmN5SW5zdGFuY2UobG9jYWxlKSkuZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKTsKQEAgLTQwMSw2ICs2NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI3NldE1pbnVzU2lnbihjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNaW51c1NpZ24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNaW51c1NpZ25DKCkgewogICAgICAgICBkZnMuc2V0TWludXNTaWduKCcmJyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IE1pbnVzU2lnbiBzeW1ib2wiLCAnJicsIGRmcwpAQCAtNDEyLDYgKzY2MCwxNSBAQAogICAgICAqICAgICAgICBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjc2V0TW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yKGNoYXIpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNb25ldGFyeURlY2ltYWxTZXBhcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNb25ldGFyeURlY2ltYWxTZXBhcmF0b3JDKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgZGZzLnNldE1vbmV0YXJ5RGVjaW1hbFNlcGFyYXRvcignIycpOwpAQCAtNDI1LDYgKzY4MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjc2V0TmFOKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hTiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hTkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBkZnMuc2V0TmFOKCJOQU4hISIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBuYW4gc3ltYm9sIiwgIk5BTiEhIiwgZGZzLmdldE5hTigpKTsKQEAgLTQzMyw2ICs2OTksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI3NldFBhdHRlcm5TZXBhcmF0b3IoY2hhcikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UGF0dGVyblNlcGFyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtjaGFyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFBhdHRlcm5TZXBhcmF0b3JDKCkgewogICAgICAgICBkZnMuc2V0UGF0dGVyblNlcGFyYXRvcignWCcpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIGluY29ycmVjdCBQYXR0ZXJuU2VwYXJhdG9yIHN5bWJvbCIsICdYJywgZGZzCkBAIC00NDIsNiArNzE3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyNzZXRQZXJjZW50KGNoYXIpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFBlcmNlbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQZXJjZW50QygpIHsKICAgICAgICAgZGZzLnNldFBlcmNlbnQoJyonKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBpbmNvcnJlY3QgUGVyY2VudCBzeW1ib2wiLCAnKicsIGRmcy5nZXRQZXJjZW50KCkpOwpAQCAtNDUwLDYgKzczNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMjc2V0UGVyTWlsbChjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQZXJNaWxsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2NoYXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UGVyTWlsbEMoKSB7CiAgICAgICAgIGRmcy5zZXRQZXJNaWxsKCcjJyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuZWQgaW5jb3JyZWN0IFBlck1pbGwgc3ltYm9sIiwgJyMnLCBkZnMuZ2V0UGVyTWlsbCgpKTsKQEAgLTQ1OCw2ICs3NTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzI3NldFplcm9EaWdpdChjaGFyKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRaZXJvRGlnaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Y2hhci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRaZXJvRGlnaXRDKCkgewogICAgICAgICBkZnMuc2V0WmVyb0RpZ2l0KCcqJyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiU2V0IGluY29ycmVjdCBaZXJvRGlnaXQgc3ltYm9sIiwgJyonLCBkZnMuZ2V0WmVyb0RpZ2l0KCkpOwpAQCAtNDgwLDYgKzc4MiwxNSBAQAogICAgIH0KIAogICAgIC8vIFRlc3Qgc2VyaWFsaXphdGlvbiBtZWNoYW5pc20gb2YgRGVjaW1hbEZvcm1hdFN5bWJvbHMKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiQ2hlY2tzIHNlcmlhbGl6YXRpb24gbWVjaGFuaXNtLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uU2VsZiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBzeW1ib2xzID0gbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzKExvY2FsZS5GUkFOQ0UpOwogICAgICAgICBDdXJyZW5jeSBjdXJyZW5jeSA9IHN5bWJvbHMuZ2V0Q3VycmVuY3koKTsKQEAgLTUwOCw3ICs4MTksMTYgQEAKICAgICAvLyBUaGlzIGFzc2VydGlvbiB3aWxsIG5vdCBjb21lIGludG8gZXhpc3RlbmNlIHRoZSBvdGhlciB3YXkgYXJvdW5kLiBUaGlzIGlzCiAgICAgLy8gcHJvYmFibHkgY2F1c2VkIGJ5IGRpZmZlcmVudCBzZXJpYWxpemF0aW9uIG1lY2hhbmlzbSB1c2VkIGJ5IFJJIGFuZAogICAgIC8vIEhhcm1vbnkuCi0gICAgcHVibGljIHZvaWQgdGVzdF9SSUhhcm1vbnlfY29tcGF0aWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk1ha2Ugc3VyZSBhbGwgZmllbGRzIGhhdmUgbm9uIGRlZmF1bHQgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIiFTZXJpYWxpemF0aW9uR29sZGVuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfUklIYXJtb255X2NvbXBhdGlibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaSA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBzeW1ib2xzID0gbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzKApkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0VGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0VGVzdC5qYXZhCmluZGV4IGY3NTg2NjIuLjFlNDcyNjUgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRGVjaW1hbEZvcm1hdFRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0RlY2ltYWxGb3JtYXRUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDEzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKQEAgLTI5LDE1ICszNiwyMyBAQAogaW1wb3J0IGphdmEudXRpbC5DdXJyZW5jeTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnRlc3RmcmFtZXdvcmsuc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVGVzdDsKIAogaW1wb3J0IHRlc3RzLnN1cHBvcnQuU3VwcG9ydF9CaXRTZXQ7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X0RlY2ltYWxGb3JtYXQ7CiAKLXB1YmxpYyBjbGFzcyBEZWNpbWFsRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAorQFRlc3RUYXJnZXRDbGFzcyhEZWNpbWFsRm9ybWF0LmNsYXNzKSAKK3B1YmxpYyBjbGFzcyBEZWNpbWFsRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QgZm9yIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0hBUk1PTlktMzMzCiAgICAgICAgIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBEZWNpbWFsRm9ybWF0KCkKQEAgLTUxLDYgKzY2LDE1IEBACiAgICAgICogVGVzdCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgb2YgcGFyc2VCaWdEZWNpbWFsIGFuZCBwYXJzZUludGVnZXJPbmx5IGFuZAogICAgICAqIHRlc3QgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlbS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNQYXJzZUJpZ0RlY2ltYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUGFyc2VCaWdEZWNpbWFsTGphdmFfbGFuZ19Cb29sZWFuX2lzUGFyc2VJbnRlZ2VyT25seUxqYXZhX2xhbmdfQm9vbGVhbigpIHsKIAogICAgICAgICAvLyBwYXJzZUJpZ0RlY2ltYWwgZGVmYXVsdCB0byBmYWxzZQpAQCAtNjcsOCArOTEsMTYgQEAKICAgICB9CiAKICAgICAvLyBUZXN0IHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBvYmplY3QKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZ19MamF2YV90ZXh0X1BhcnNlUG9zaXRpb24oKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9wYXJzZUxqYXZhX2xhbmdfU3RyaW5nX0xqYXZhX3RleHRfUGFyc2VQb3NpdGlvbigpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtID0gKERlY2ltYWxGb3JtYXQpIERlY2ltYWxGb3JtYXQKICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgTnVtYmVyIG51bWJlciA9IGZvcm0ucGFyc2UoIjIzLjEiLCBuZXcgUGFyc2VQb3NpdGlvbigwKSk7CkBAIC0zNDcsNyArMzc5LDE1IEBACiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IHRocm93IE5QRSIpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1heGltdW1GcmFjdGlvbkRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmZvcm0gPSBEZWNpbWFsRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZm9ybSA9IChEZWNpbWFsRm9ybWF0KSBuZm9ybTsKQEAgLTM3MSw3ICs0MTEsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgbmZvcm0uZ2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCBmb3JtLmdldE1heGltdW1GcmFjdGlvbkRpZ2l0cygpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWluaW11bUZyYWN0aW9uRGlnaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZm9ybSA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtID0gKERlY2ltYWxGb3JtYXQpIG5mb3JtOwpAQCAtMzkxLDkgKzQzOSwxNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBuZm9ybS5nZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGZvcm0uZ2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIC8vIEZJWE1FIFRoaXMgdGVzdCBmYWlscyBvbiBIYXJtb255IENsYXNzTGlicmFyeQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bUludGVnZXJEaWdpdHMoKSB7CisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0TWF4aW11bUludGVnZXJEaWdpdHMoKSB7CiAgICAgICAgIGZpbmFsIGludCBtYXhJbnREaWdpdCA9IDMwOTsKIAogICAgICAgICAvLyBXaGVuIHVzZSBkZWZhdWx0IGxvY2FsZSwgaW4gdGhpcyBjYXNlIHpoX0NOCkBAIC00NDAsNyArNDk2LDE1IEBACiAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS04NzgKICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRGVjaW1hbEZvcm1hdCgiMFx0MCIpLmdldE1heGltdW1JbnRlZ2VyRGlnaXRzKCkgPiAwKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWluaW11bUludGVnZXJEaWdpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW1JbnRlZ2VyRGlnaXRzKCkgewogICAgICAgICBmaW5hbCBpbnQgbWluSW50RGlnaXQgPSAxOwogICAgICAgICBOdW1iZXJGb3JtYXQgbmZvcm0gPSBEZWNpbWFsRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CkBAIC00NjIsNyArNTI2LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGZvcm0uZ2V0TWluaW11bUludGVnZXJEaWdpdHMoKSk7CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfT2JqX0xqYXZhX1N0cmluZ0J1ZmZlcl9MamF2YV90ZXh0X0ZpZWxkUG9zaXRpb24oKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZm9ybSA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtID0gKERlY2ltYWxGb3JtYXQpIG5mb3JtOwpAQCAtNjE3LDcgKzY4OSw0OSBAQAogICAgICAgICAgICAgICAgIEJERmxvYXRNaW4yKSk7CiAKICAgICB9CisgICAgQFRlc3RJbmZvKAorICAgICAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgICAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICAgICAgICB0YXJnZXRzID0geworICAgICAgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgICAgICAgbWV0aG9kQXJncyA9IHtPYmplY3QuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2lnRGlnaXRQYXR0ZXJucygpIHsKKyAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSAoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0CisgICAgICAgIC5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOwogCisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIkBAQCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpZ0RpZ2l0IGRvZXNuJ3Qgd29yayIsICIxMjMwMCIsIGZvcm1hdC5mb3JtYXQoMTIzNDUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaWdEaWdpdCBkb2Vzbid0IHdvcmsiLCAiMC4xMjMiLCBmb3JtYXQuZm9ybWF0KDAuMTIzNDUpKTsKKworICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCJAQCMjIik7CisgICAgICAgIGFzc2VydEVxdWFscygic2lnRGlnaXQgZG9lc24ndCB3b3JrIiwgIjMuMTQyIiwgZm9ybWF0LmZvcm1hdCgzLjE0MTU5KSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2lnRGlnaXQgZG9lc24ndCB3b3JrIiwgIjEuMjMiLCBmb3JtYXQuZm9ybWF0KDEuMjMwMDQpKTsKKworICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCIjIyMsIyMsIyMjLiMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMiwzNCw1NjcuOCIsIGZvcm1hdC5mb3JtYXQoMTIzNDU2Ny44KSk7CisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIiMjLCMsIyMsIyMjLiMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMiwzNCw1NjcuOCIsIGZvcm1hdC5mb3JtYXQoMTIzNDU2Ny44KSk7CisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIiMsIyMsIyMsIyMjLiMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMiwzNCw1NjcuOCIsIGZvcm1hdC5mb3JtYXQoMTIzNDU2Ny44KSk7CisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIiQqeCMsIyMwLjAwIik7CisgICAgICAgIGFzc2VydEVxdWFscygiJHh4MTIzLjAwIiwgZm9ybWF0LmZvcm1hdCgxMjMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIkMSwyMzQuMDAiLCBmb3JtYXQuZm9ybWF0KDEyMzQpKTsKKyAgICAgICAgZm9ybWF0LmFwcGx5UGF0dGVybigiIywjIzAuNjUiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJYWFggLSAiICsgZm9ybWF0LmZvcm1hdCgxLjIzNCkpOworICAgIH0KKyAgICAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHNMamF2YV9sYW5nX0ludGVnZXIoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZm9ybSA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtID0gKERlY2ltYWxGb3JtYXQpIG5mb3JtOwpAQCAtNjI4LDcgKzc0MiwxNSBAQAogICAgICAgICBmb3JtLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cygzNDEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMzQxLCBmb3JtLmdldE1heGltdW1GcmFjdGlvbkRpZ2l0cygpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWluaW11bUZyYWN0aW9uRGlnaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHNMamF2YV9sYW5nX0ludGVnZXIoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZm9ybSA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtID0gKERlY2ltYWxGb3JtYXQpIG5mb3JtOwpAQCAtNjM5LDcgKzc2MSwxNSBAQAogICAgICAgICBmb3JtLnNldE1pbmltdW1GcmFjdGlvbkRpZ2l0cygzMTApOwogICAgICAgICBhc3NlcnRFcXVhbHMoMzEwLCBmb3JtLmdldE1pbmltdW1GcmFjdGlvbkRpZ2l0cygpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWF4aW11bUludGVnZXJEaWdpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JbnRlZ2VyRGlnaXRzTGphdmFfbGFuZ19JbnRlZ2VyKCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmZvcm0gPSBEZWNpbWFsRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZm9ybSA9IChEZWNpbWFsRm9ybWF0KSBuZm9ybTsKQEAgLTY1MCw3ICs3ODAsMTUgQEAKICAgICAgICAgZm9ybS5zZXRNYXhpbXVtSW50ZWdlckRpZ2l0cygzMTApOwogICAgICAgICBhc3NlcnRFcXVhbHMoMzEwLCBmb3JtLmdldE1heGltdW1JbnRlZ2VyRGlnaXRzKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bUludGVnZXJEaWdpdHNMamF2YV9sYW5nX0ludGVnZXIoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZm9ybSA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtID0gKERlY2ltYWxGb3JtYXQpIG5mb3JtOwpAQCAtNjY0LDYgKzgwMiwxNSBAQAogCiAgICAgLy8gV2hlbiBNYXhGcmFjdGlvbkRpZ2l0cyBpcyBzZXQgZmlyc3QgYW5kIGxlc3MgdGhhbiBNaW5GcmFjdGlvbkRpZ2l0cywgbWF4CiAgICAgLy8gd2lsbCBiZSBjaGFuZ2VkIHRvIG1pbiB2YWx1ZQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1GYWN0aW9uRGlnaXRzTGphdmFfbGFuZ19JbnRlZ2VyX3NldE1heGltdW1GcmFjdGlvbkRpZ2l0c0xqYXZhX2xhbmdfSW50ZWdlcigpIHsKICAgICAgICAgTnVtYmVyRm9ybWF0IG5mb3JtID0gRGVjaW1hbEZvcm1hdC5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOwogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm0gPSAoRGVjaW1hbEZvcm1hdCkgbmZvcm07CkBAIC02ODMsNiArODMwLDIxIEBACiAKICAgICAvLyBXaGVuIE1pbkZyYWN0aW9uRGlnaXRzIGlzIHNldCBmaXJzdCBhbmQgbGVzcyB0aGFuIE1heEZyYWN0aW9uRGlnaXRzLCBtaW4KICAgICAvLyB3aWxsIGJlIGNoYW5nZWQgdG8gbWF4IHZhbHVlCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiV2hlbiBNaW5GcmFjdGlvbkRpZ2l0cyBpcyBzZXQgZmlyc3QgYW5kIGxlc3MgdGhhbiAiICsKKyAgICAgICAgICAgICJNYXhGcmFjdGlvbkRpZ2l0cywgbWluIHdpbGwgYmUgY2hhbmdlZCB0byBtYXggdmFsdWUiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1pbmltdW1GcmFjdGlvbkRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKworICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtRmFjdGlvbkRpZ2l0c0xqYXZhX2xhbmdfSW50ZWdlcl9zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHNMamF2YV9sYW5nX0ludGVnZXIoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZm9ybSA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtID0gKERlY2ltYWxGb3JtYXQpIG5mb3JtOwpAQCAtNjk5LDcgKzg2MSwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBmb3JtLmdldE1heGltdW1JbnRlZ2VyRGlnaXRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBmb3JtLmdldE1pbmltdW1JbnRlZ2VyRGlnaXRzKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSAoRGVjaW1hbEZvcm1hdCkgRGVjaW1hbEZvcm1hdAogICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOwpAQCAtNzEyLDIyICs4ODIsNTQgQEAKIAogICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0LCBjbG9uZWQpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gInNldFBvc2l0aXZlUHJlZml4IGlzIG5vdCBjYWxsZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UG9zaXRpdmVQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQb3NpdGl2ZVByZWZpeExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgZm9ybWF0LmdldFBvc2l0aXZlUHJlZml4KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gInNldFBvc2l0aXZlU3VmZml4IGlzIG5vdCBjYWxsZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UG9zaXRpdmVTdWZmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQb3NpdGl2ZVN1ZmZpeExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgZm9ybWF0LmdldFBvc2l0aXZlU3VmZml4KCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gInNldE5lZ2F0aXZlUHJlZml4IGlzIG5vdCBjYWxsZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmVnYXRpdmVQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXROZWdhdGl2ZVByZWZpeExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiLSIsIGZvcm1hdC5nZXROZWdhdGl2ZVByZWZpeCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJzZXROZWdhdGl2ZVN1ZmZpeCBpcyBub3QgY2FsbGVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5lZ2F0aXZlU3VmZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmVnYXRpdmVTdWZmaXhMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSBuZXcgRGVjaW1hbEZvcm1hdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGZvcm1hdC5nZXROZWdhdGl2ZVN1ZmZpeCgpKTsKQEAgLTczNyw3ICs5MzksMTYgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjdG9Mb2NhbGl6ZWRQYXR0ZXJuKCkgVGVzdCBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjdG9Mb2NhbGl6ZWRQYXR0ZXJuKCkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF90b0xvY2FsaXplZFBhdHRlcm4oKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvTG9jYWxpemVkUGF0dGVybiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3RvTG9jYWxpemVkUGF0dGVybigpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSBuZXcgRGVjaW1hbEZvcm1hdCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZm9ybWF0LmFwcGx5TG9jYWxpemVkUGF0dGVybigiIy4jIik7CkBAIC03NTcsNiArOTY4LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I3RvUGF0dGVybigpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I3RvUGF0dGVybigpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1BhdHRlcm4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvUGF0dGVybigpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSBuZXcgRGVjaW1hbEZvcm1hdCgpOwogICAgICAgICB0cnkgewpAQCAtNzcyLDcgKzk5MiwxNSBAQAogICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0cnVlIHZhbHVlIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEdyb3VwaW5nVXNlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEdyb3VwaW5nVXNlKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CkBAIC03ODYsNiArMTAxNCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNEZWNpbWFsRm9ybWF0KCkgVGVzdCBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjRGVjaW1hbEZvcm1hdCgpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWNpbWFsRm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0KCkKICAgICAgICAgLy8gdGhlIGNvbnN0cnVjdG9yIGZvcm0gdGhhdCBzcGVjaWZpZXMgYSBwYXR0ZXJuIGlzIGVxdWFsIHRvIHRoZSBmb3JtCkBAIC04MTUsNiArMTA1MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNEZWNpbWFsRm9ybWF0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWNpbWFsRm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICAgIC8vIHRoZSBjb25zdHJ1Y3RvciBmb3JtIHRoYXQgc3BlY2lmaWVzIGEgcGF0dGVybiBpcyBlcXVhbCB0byB0aGUgZm9ybQpAQCAtODM2LDYgKzEwODIsMTUgQEAKICAgICAgKiAgICAgICAgb2JqZWN0IHVzaW5nIG51bGwgYXJndW1lbnRzLiBDYXNlIDM6IFRyeSB0byBjb25zdHJ1Y3Qgb2JqZWN0IHVzaW5nCiAgICAgICogICAgICAgIGluY29ycmVjdCBwYXR0ZXJuLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEZWNpbWFsRm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfdGV4dF9EZWNpbWFsRm9ybWF0U3ltYm9scygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGNhc2UgMTogVHJ5IHRvIGNvbnN0cnVjdCBvYmplY3QgdXNpbmcgY29ycmVjdCBwYXR0ZXJuIGFuZCBmcm9tYXQKQEAgLTg5Miw3ICsxMTQ3LDE2IEBACiAgICAgICogICAgICAgIENhc2UgMTogVHJ5IHRvIGFwcGx5IGNvcnJlY3QgdmFyaWFudHMgb2YgcGF0dGVybi4gQ2FzZSAyOiBUcnkgdG8KICAgICAgKiAgICAgICAgYXBwbHkgbWFsZm9ybWVkIHBhdHRlbi4gQ2FzZSAzOiBUcnkgdG8gYXBwbHkgbnVsbCBwYXRlcm4uCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9hcHBseUxvY2FsaXplZFBhdHRlcm5MamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwbHlMb2NhbGl6ZWRQYXR0ZXJuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2FwcGx5TG9jYWxpemVkUGF0dGVybkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBjYXNlIDE6IFRyeSB0byBhcHBseSBjb3JyZWN0IHZhcmlhbnRzIG9mIHBhdHRlcm4uCkBAIC05MjgsNyArMTE5MiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNhcHBseVBhdHRlcm4oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGx5UGF0dGVybkxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwbHlQYXR0ZXJuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2FwcGx5UGF0dGVybkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjLiMiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBwYXR0ZXJuIDEiLCAiIzAuIyIsIGZvcm1hdC50b1BhdHRlcm4oKSk7CiAgICAgICAgIGZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjLiIpOwpAQCAtOTQyLDYgKzEyMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZm9ybWF0ID0gKERlY2ltYWxGb3JtYXQpIERlY2ltYWxGb3JtYXQKICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKQEAgLTk3Nyw4ICsxMjU5LDE3IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I2Zvcm1hdChkb3VibGUsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIsCiAgICAgICogICAgICAgIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7ZG91YmxlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzLCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgLy8gRklYTUUgVGhpcyB0ZXN0IGZhaWxzIG9uIEhhcm1vbnkgQ2xhc3NMaWJyYXJ5Ci0gICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRETGphdmFfbGFuZ19TdHJpbmdCdWZmZXJMamF2YV90ZXh0X0ZpZWxkUG9zaXRpb24oKSB7CisgICAgcHVibGljIHZvaWQgX3Rlc3RfZm9ybWF0RExqYXZhX2xhbmdfU3RyaW5nQnVmZmVyTGphdmFfdGV4dF9GaWVsZFBvc2l0aW9uKCkgewogICAgICAgICBuZXcgU3VwcG9ydF9EZWNpbWFsRm9ybWF0KAogICAgICAgICAgICAgICAgICJ0ZXN0X2Zvcm1hdERMamF2YV9sYW5nX1N0cmluZ0J1ZmZlckxqYXZhX3RleHRfRmllbGRQb3NpdGlvbiIpCiAgICAgICAgICAgICAgICAgLnRfZm9ybWF0X3dpdGhfRmllbGRQb3NpdGlvbigpOwpAQCAtMTIxMCw4ICsxNTAxLDE3IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I2Zvcm1hdChsb25nLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLAogICAgICAqICAgICAgICBqYXZhLnRleHQuRmllbGRQb3NpdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICAvLyBGSVhNRSBUaGlzIHRlc3QgZmFpbHMgb24gSGFybW9ueSBDbGFzc0xpYnJhcnkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdEpMamF2YV9sYW5nX1N0cmluZ0J1ZmZlckxqYXZhX3RleHRfRmllbGRQb3NpdGlvbigpIHsKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9mb3JtYXRKTGphdmFfbGFuZ19TdHJpbmdCdWZmZXJMamF2YV90ZXh0X0ZpZWxkUG9zaXRpb24oKSB7CiAgICAgICAgIGludCBmYWlsQ291bnQgPSAwOwogICAgICAgICBTdXBwb3J0X0JpdFNldCBmYWlsdXJlcyA9IG5ldyBTdXBwb3J0X0JpdFNldCgpOwogCkBAIC0xMjgzLDggKzE1ODMsMTcgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIC8vIEZJWE1FIFRoaXMgdGVzdCBmYWlscyBvbiBIYXJtb255IENsYXNzTGlicmFyeQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvckxqYXZhX2xhbmdfT2JqZWN0KCkgeworICAgIHB1YmxpYyB2b2lkIF90ZXN0X2Zvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS00NjYKQEAgLTEzMDIsNyArMTYxMSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNmb3JtYXQoZG91YmxlKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0RCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2RvdWJsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZm9ybWF0RCgpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSAoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0CiAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKICAgICAgICAgZm9ybWF0LnNldEdyb3VwaW5nVXNlZChmYWxzZSk7CkBAIC0xMzUxLDYgKzE2NjksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWNpbWFsRm9ybWF0U3ltYm9scyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZGYgPSAoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0CiAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKQEAgLTEzNjEsNiArMTY4OCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNnZXRDdXJyZW5jeSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEN1cnJlbmN5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgLy8gRklYTUUgVGhpcyB0ZXN0IGZhaWxzIG9uIEhhcm1vbnkgQ2xhc3NMaWJyYXJ5CiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDdXJyZW5jeSgpIHsKICAgICAgICAgQ3VycmVuY3kgY3VycksgPSBDdXJyZW5jeS5nZXRJbnN0YW5jZSgiS1JXIik7CkBAIC0xNDA0LDYgKzE3NDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjZ2V0R3JvdXBpbmdTaXplKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0R3JvdXBpbmdTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRHcm91cGluZ1NpemUoKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIyMjMC4jIyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHVuc2V0IHNpemUiLCAwLCBkZi5nZXRHcm91cGluZ1NpemUoKSk7CkBAIC0xNDE2LDYgKzE3NjEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjZ2V0TXVsdGlwbGllcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE11bHRpcGxpZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE11bHRpcGxpZXIoKSB7CiAgICAgICAgIGZpbmFsIGludCBkZWZhdWx0TXVsdGlwbGllciA9IDE7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZm9ybSA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKQEAgLTE0MzQsNiArMTc4OCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNnZXROZWdhdGl2ZVByZWZpeCgpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I2dldE5lZ2F0aXZlUHJlZml4KCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5lZ2F0aXZlUHJlZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXROZWdhdGl2ZVByZWZpeCgpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CiAgICAgICAgIHRyeSB7CkBAIC0xNDQ5LDYgKzE4MTIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjZ2V0TmVnYXRpdmVTdWZmaXgoKSBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNnZXROZWdhdGl2ZVN1ZmZpeCgpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROZWdhdGl2ZVN1ZmZpeCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmVnYXRpdmVTdWZmaXgoKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgpOwogICAgICAgICB0cnkgewpAQCAtMTQ2NCw2ICsxODM2LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I2dldFBvc2l0aXZlUHJlZml4KCkgVGVzdCBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjZ2V0UG9zaXRpdmVQcmVmaXgoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UG9zaXRpdmVQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBvc2l0aXZlUHJlZml4KCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGRmID0gbmV3IERlY2ltYWxGb3JtYXQoKTsKICAgICAgICAgdHJ5IHsKQEAgLTE0NzksNiArMTg2MCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNnZXRQb3NpdGl2ZVN1ZmZpeCgpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I2dldFBvc2l0aXZlU3VmZml4KCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBvc2l0aXZlU3VmZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQb3NpdGl2ZVN1ZmZpeCgpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CiAgICAgICAgIHRyeSB7CkBAIC0xNDk0LDYgKzE4ODQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjaGFzaENvZGUoKSBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNoYXNoQ29kZSgpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBEZWNpbWFsRm9ybWF0IGRmMSA9IG5ldyBEZWNpbWFsRm9ybWF0KCk7CkBAIC0xNTA4LDYgKzE5MDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjaXNEZWNpbWFsU2VwYXJhdG9yQWx3YXlzU2hvd24oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0RlY2ltYWxTZXBhcmF0b3JBbHdheXNTaG93biIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNEZWNpbWFsU2VwYXJhdG9yQWx3YXlzU2hvd24oKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIyMjMC4jIyIpOwogICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyB1bnNldCB2YWx1ZSIsICFkZi5pc0RlY2ltYWxTZXBhcmF0b3JBbHdheXNTaG93bigpKTsKQEAgLTE1MjEsOCArMTkyOSwxNyBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNwYXJzZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWcmlmaWVzIGJvdW5kYXJ5IHZhbHVlcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgLy8gRklYTUUgVGhpcyB0ZXN0IGZhaWxzIG9uIEhhcm1vbnkgQ2xhc3NMaWJyYXJ5Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfdGV4dF9QYXJzZVBvc2l0aW9uKCkgeworICAgIHB1YmxpYyB2b2lkIF90ZXN0X3BhcnNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV90ZXh0X1BhcnNlUG9zaXRpb24oKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZm9ybWF0ID0gKERlY2ltYWxGb3JtYXQpIE51bWJlckZvcm1hdAogICAgICAgICAgICAgICAgIC5nZXROdW1iZXJJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgIFBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7CkBAIC0xNjE3LDYgKzIwMzQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjc2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREZWNpbWFsRm9ybWF0U3ltYm9scyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVjaW1hbEZvcm1hdFN5bWJvbHNMamF2YV90ZXh0X0RlY2ltYWxGb3JtYXRTeW1ib2xzKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGRmID0gbmV3IERlY2ltYWxGb3JtYXQoIiMjIzAuIyMiKTsKICAgICAgICAgRGVjaW1hbEZvcm1hdFN5bWJvbHMgZGZzID0gbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzKCk7CkBAIC0xNjM4LDYgKzIwNjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjc2V0RGVjaW1hbFNlcGFyYXRvckFsd2F5c1Nob3duKGJvb2xlYW4pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZmFsc2UgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVjaW1hbFNlcGFyYXRvckFsd2F5c1Nob3duIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVjaW1hbFNlcGFyYXRvckFsd2F5c1Nob3duWigpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMwLiMjIiwKICAgICAgICAgICAgICAgICBuZXcgRGVjaW1hbEZvcm1hdFN5bWJvbHMoTG9jYWxlLlVTKSk7CkBAIC0xNjUwLDYgKzIwODUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjc2V0Q3VycmVuY3koamF2YS51dGlsLkN1cnJlbmN5KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDdXJyZW5jeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuQ3VycmVuY3kuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3VycmVuY3lMamF2YV91dGlsX0N1cnJlbmN5KCkgewogICAgICAgICBMb2NhbGUgbG9jYWxlID0gTG9jYWxlLkNBTkFEQTsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9ICgoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0CkBAIC0xNjc2LDYgKzIxMjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjc2V0R3JvdXBpbmdTaXplKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0R3JvdXBpbmdTaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRHcm91cGluZ1NpemVJKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGRmID0gbmV3IERlY2ltYWxGb3JtYXQoIiMjIzAuIyMiLAogICAgICAgICAgICAgICAgIG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyhMb2NhbGUuRU5HTElTSCkpOwpAQCAtMTY4OSw2ICsyMTQyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I3NldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzSSgpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMwLiMjIiwKICAgICAgICAgICAgICAgICBuZXcgRGVjaW1hbEZvcm1hdFN5bWJvbHMoTG9jYWxlLlVTKSk7CkBAIC0xNzAzLDYgKzIxNjUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjc2V0TWF4aW11bUludGVnZXJEaWdpdHMoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNYXhpbXVtSW50ZWdlckRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUludGVnZXJEaWdpdHNJKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGRmID0gbmV3IERlY2ltYWxGb3JtYXQoIiMjIzAuIyMiKTsKICAgICAgICAgZGYuc2V0TWF4aW11bUludGVnZXJEaWdpdHMoMik7CkBAIC0xNzE2LDYgKzIxODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQjc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWluaW11bUZyYWN0aW9uRGlnaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHNJKCkgewogICAgICAgICBEZWNpbWFsRm9ybWF0IGRmID0gbmV3IERlY2ltYWxGb3JtYXQoIiMjIzAuIyMiLAogICAgICAgICAgICAgICAgIG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyhMb2NhbGUuVVMpKTsKQEAgLTE3MzAsNiArMjIxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCNzZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1pbmltdW1JbnRlZ2VyRGlnaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSW50ZWdlckRpZ2l0c0koKSB7CiAgICAgICAgIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIyMjMC4jIyIsCiAgICAgICAgICAgICAgICAgbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzKExvY2FsZS5VUykpOwpAQCAtMTc0NCw2ICsyMjMzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0I3NldE11bHRpcGxpZXIoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNdWx0aXBsaWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgLy8gRklYTUUgVGhpcyB0ZXN0IGZhaWxzIG9uIEhhcm1vbnkgQ2xhc3NMaWJyYXJ5CiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRNdWx0aXBsaWVySSgpIHsKICAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMwLiMjIik7CkBAIC0xNzYyLDYgKzIyNjAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICIhU2VyaWFsaXphdGlvblNlbGYiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvblNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2VyaWFsaXphdGlvblRlc3QudmVyaWZ5U2VsZihuZXcgRGVjaW1hbEZvcm1hdCgpKTsKICAgICB9CkBAIC0xNzY5LDcgKzIyNzYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggUkkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlcmlhbGl6YXRpb25IYXJtb255UklDb21wYXRpYmxlKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIVNlcmlhbGl6YXRpb25Hb2xkZW4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9zZXJpYWxpemF0aW9uSGFybW9ueVJJQ29tcGF0aWJsZSgpIHsKICAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5GUkFOQ0UpOwogCiAgICAgICAgIERlY2ltYWxGb3JtYXQgZGYgPSBudWxsOwpAQCAtMTgzMCw2ICsyMzQ2LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB3aGV0aGVyIERlY2ltYWxGb3JtYXQgY2FuIHBhcnNlIFBvc2l0aXZlIGluZmluaXR5IGNvcnJlY3RseQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlSW5maW5pdHlCaWdEZWNpbWFsRmFsc2UoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0xMDYKICAgICAgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSAoRGVjaW1hbEZvcm1hdCkgRGVjaW1hbEZvcm1hdC5nZXRJbnN0YW5jZSgpOwpAQCAtMTg0Myw2ICsyMzY4LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB3aGV0aGVyIERlY2ltYWxGb3JtYXQgY2FuIHBhcnNlIE5lZ2F0aXZlIGluZmluaXR5IGNvcnJlY3RseQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlTWludXNJbmZpbml0eUJpZ0RlY2ltYWxGYWxzZSgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTEwNgogICAgICAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdCA9IChEZWNpbWFsRm9ybWF0KSBEZWNpbWFsRm9ybWF0LmdldEluc3RhbmNlKCk7CkBAIC0xODU3LDYgKzIzOTEsMTUgQEAKICAgICAgKiBUZXN0IGlmIHNldERlY2ltYWxGb3JtYXRTeW1ib2xzIG1ldGhvZCB3b250IHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uCiAgICAgICogd2hlbiBpdCBpcyBjYWxsZWQgd2l0aCBudWxsIHBhcmFtZXRlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERlY2ltYWxGb3JtYXRTeW1ib2xzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldERlY2ltYWxGb3JtYXRTeW1ib2xzQXNOdWxsKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTEwNzAKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRGVjaW1hbEZvcm1hdFRlc3RJQ1UuamF2YSBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRGVjaW1hbEZvcm1hdFRlc3RJQ1UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjY4ZTljCi0tLSAvZGV2L251bGwKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9EZWNpbWFsRm9ybWF0VGVzdElDVS5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC50ZXN0cy5qYXZhLnRleHQ7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworCisvKioKKyAqIFRlc3QgZm9yIGFkZGl0aW9uYWwgZmVhdHVyZXMgaW50cm9kdWNlZCBieSBpY3UuIFRoZXNlIHRlc3RzIGZhaWwgb24gdGhlIFJJCisgKiBidXQgc3VjY2VlZCBvbiBBbmRyb2lkIDEuMC4gVGhlIGZlYXR1cmVzIGFyZSBvbmx5IGFjY2Vzc2libGUgdGhyb3VnaCB0aGUKKyAqIHBhdHRlcm4uIEFwaSBtZXRob2RzIHdoZXJlIG5vdCBpbnRyb2R1Y2VkIHRvIGFsbG93IGRpcmVjdCBhY2Nlc3Mgb2YgdGhlc2UKKyAqIGZlYXR1cmVzLiBUaGlzIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgYXBpIHRvbyBtdWNoLgorICovCitAVGVzdFRhcmdldENsYXNzKERlY2ltYWxGb3JtYXQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRGVjaW1hbEZvcm1hdFRlc3RJQ1UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBEZWNpbWFsRm9ybWF0IGZvcm1hdDsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICBmb3JtYXQgPSAoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0LmdldE51bWJlckluc3RhbmNlKCk7CisgICAgfQorCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYXBwbHlQYXR0ZXJuIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2lnRGlnUGF0dGVybigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCJAQEAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjMwMCIsIGZvcm1hdC5mb3JtYXQoMTIzNDUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwLjEyMyIsIGZvcm1hdC5mb3JtYXQoMC4xMjM0NSkpOworCisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIkBAIyMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzLjE0MiIsIGZvcm1hdC5mb3JtYXQoMy4xNDE1OSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMjMiLCBmb3JtYXQuZm9ybWF0KDEuMjMwMDQpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9ybWF0LmFwcGx5UGF0dGVybigiQDAwIik7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24gZm9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAicGF0dGVybiBcIkAwMFwiLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCJALiMjIyIpOworICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgInBhdHRlcm4gXCJALiMjI1wiLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIkBAIyMjRTAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjIzRTEiLCBmb3JtYXQuZm9ybWF0KDEyLjMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLjNmLCBmb3JtYXQucGFyc2UoIjEuMjNFMSIpLmZsb2F0VmFsdWUoKSk7CisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIjAuMCMjI0UwIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMS4yM0UxIiwgZm9ybWF0LmZvcm1hdCgxMi4zKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMi4zZiwgZm9ybWF0LnBhcnNlKCIxLjIzRTEiKS5mbG9hdFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7T2JqZWN0LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFkZGluZ1BhdHRlcm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9ybWF0LmFwcGx5UGF0dGVybigiKngjIywjIywjLCMjMC4wIyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInh4eHh4eHh4eDEyMy4wIiwgZm9ybWF0LmZvcm1hdCgxMjMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgZm9ybWF0LnBhcnNlKCJ4eHh4eHh4eHgxMjMuMCIpLmludFZhbHVlKCkpOworCisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIipcdTAwZTcjMCBvJydjbG9jayIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDBlNzIgbydjbG9jayIsIGZvcm1hdC5mb3JtYXQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyIG8nY2xvY2siLCBmb3JtYXQuZm9ybWF0KDEyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBmb3JtYXQucGFyc2UoIlx1MDBlNzIgbydjbG9jayIpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIGZvcm1hdC5wYXJzZSgiMTIgbydjbG9jayIpLmludFZhbHVlKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCIjMC4jIyp4RTAiKTsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBmb3IiCisgICAgICAgICAgICAgICAgICAgICsgInBhdHRlcm4gXCIjMC4jIyp4RTBcIi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9ybWF0LmFwcGx5UGF0dGVybigiIyMwLiMjICoiKTsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biBmb3IgIgorICAgICAgICAgICAgICAgICAgICArICJwYXR0ZXJuIFwiIyMwLiMjICpcIi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3Bvc2l0aXZlRXhwb25lbnRTaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIjAuIyMjRSswIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMUUrMiIsIGZvcm1hdC5mb3JtYXQoMTAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMUUtMiIsIGZvcm1hdC5mb3JtYXQoMC4wMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBmb3JtYXQucGFyc2UoIjFFKzIiKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMDFmLCBmb3JtYXQucGFyc2UoIjFFLTIiKS5mbG9hdFZhbHVlKCkpOworCisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIjAuIyMjRTAgbS9zIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMUUyIG0vcyIsIGZvcm1hdC5mb3JtYXQoMTAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIGZvcm1hdC5wYXJzZSgiMUUyIG0vcyIpLmludFZhbHVlKCkpOworCisgICAgICAgIGZvcm1hdC5hcHBseVBhdHRlcm4oIjAwLiMjI0UwIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIuM0UtNCIsIGZvcm1hdC5mb3JtYXQoMC4wMDEyMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wMDEyM2YsIGZvcm1hdC5wYXJzZSgiMTIuM0UtNCIpLmZsb2F0VmFsdWUoKSk7CisKKyAgICAgICAgZm9ybWF0LmFwcGx5UGF0dGVybigiIyMwLiMjIyNFMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyLjM0NUUzIiwgZm9ybWF0LmZvcm1hdCgxMjM0NSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIzNDUsIGZvcm1hdC5wYXJzZSgiMTIuMzQ1RTMiKS5pbnRWYWx1ZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9ybWF0LmFwcGx5UGF0dGVybigiIywjIzAuIyNFMCIpOworICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgInBhdHRlcm4gXCIjLCMjMC4jI0UwXCIuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhlIGdyb3VwaW5nIHNpemUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge09iamVjdC5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NlY29uZGFyeUdyb3VwaW5nU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCIjLCMjLCMjIywjIyMjIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIzLDQ1Niw3ODkwIiwgZm9ybWF0LmZvcm1hdCgxMjM0NTY3ODkwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMjM0NTY3ODkwLCBmb3JtYXQucGFyc2UoIjEyMyw0NTYsNzg5MCIpLmludFZhbHVlKCkpOworICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCIjIywjLCMjIywjIyMjIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIzLDQ1Niw3ODkwIiwgZm9ybWF0LmZvcm1hdCgxMjM0NTY3ODkwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMjM0NTY3ODkwLCBmb3JtYXQucGFyc2UoIjEyMyw0NTYsNzg5MCIpLmludFZhbHVlKCkpOworICAgICAgICBmb3JtYXQuYXBwbHlQYXR0ZXJuKCIjIyMsIyMjLCMjIyMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjMsNDU2LDc4OTAiLCBmb3JtYXQuZm9ybWF0KDEyMzQ1Njc4OTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMzQ1Njc4OTAsIGZvcm1hdC5wYXJzZSgiMTIzLDQ1Niw3ODkwIikuaW50VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9GaWVsZFBvc2l0aW9uVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9GaWVsZFBvc2l0aW9uVGVzdC5qYXZhCmluZGV4IGExZmE4MWQuLmY3NDQ2NDYgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRmllbGRQb3NpdGlvblRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0ZpZWxkUG9zaXRpb25UZXN0LmphdmEKQEAgLTE2LDE0ICsxNiwyOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKEZpZWxkUG9zaXRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIEZpZWxkUG9zaXRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRmllbGRQb3NpdGlvbiNGaWVsZFBvc2l0aW9uKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmllbGRQb3NpdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBjb25zdHJ1Y3RvciBqYXZhLnRleHQuRmllbGRQb3NpdGlvbihpbnQpCiAgICAgICAgIEZpZWxkUG9zaXRpb24gZnBvcyA9IG5ldyBGaWVsZFBvc2l0aW9uKERhdGVGb3JtYXQuTU9OVEhfRklFTEQpOwpAQCAtMzYsNiArNTEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24jRmllbGRQb3NpdGlvbihqYXZhLnRleHQuRm9ybWF0JEZpZWxkKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWVsZFBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudGV4dC5Gb3JtYXQuRmllbGQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV90ZXh0X0Zvcm1hdCRGaWVsZCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgY29uc3RydWN0b3IgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24oRm9ybWF0LkZpZWxkKQogICAgICAgICBGaWVsZFBvc2l0aW9uIGZwb3MgPSBuZXcgRmllbGRQb3NpdGlvbihEYXRlRm9ybWF0LkZpZWxkLk1PTlRIKTsKQEAgLTQ4LDYgKzcyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uI0ZpZWxkUG9zaXRpb24oamF2YS50ZXh0LkZvcm1hdCRGaWVsZCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWVsZFBvc2l0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudGV4dC5Gb3JtYXQuRmllbGQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3RleHRfRm9ybWF0JEZpZWxkSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgY29uc3RydWN0b3IgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24oRm9ybWF0LkZpZWxkLCBpbnQpCiAgICAgICAgIEZpZWxkUG9zaXRpb24gZnBvcyA9IG5ldyBGaWVsZFBvc2l0aW9uKERhdGVGb3JtYXQuRmllbGQuTU9OVEgsCkBAIC03Niw2ICsxMDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24jZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnRleHQuRmllbGRQb3NpdGlvbi5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKQEAgLTEwNyw2ICsxNDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24jZ2V0QmVnaW5JbmRleCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEJlZ2luSW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJlZ2luSW5kZXgoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24uZ2V0QmVnaW5JbmRleCgpCiAgICAgICAgIEZpZWxkUG9zaXRpb24gZnBvcyA9IG5ldyBGaWVsZFBvc2l0aW9uKDEpOwpAQCAtMTE5LDYgKzE3MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRmllbGRQb3NpdGlvbiNnZXRFbmRJbmRleCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuZEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbmRJbmRleCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbi5nZXRFbmRJbmRleCgpCiAgICAgICAgIEZpZWxkUG9zaXRpb24gZnBvcyA9IG5ldyBGaWVsZFBvc2l0aW9uKDEpOwpAQCAtMTMxLDYgKzE5MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRmllbGRQb3NpdGlvbiNnZXRGaWVsZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGaWVsZCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGludCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbi5nZXRGaWVsZCgpCiAgICAgICAgIEZpZWxkUG9zaXRpb24gZnBvcyA9IG5ldyBGaWVsZFBvc2l0aW9uKDY1KTsKQEAgLTE0Niw2ICsyMTUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24jZ2V0RmllbGRBdHRyaWJ1dGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGaWVsZEF0dHJpYnV0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmllbGRBdHRyaWJ1dGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24uZ2V0RmllbGRBdHRyaWJ1dGUoKQogICAgICAgICBGaWVsZFBvc2l0aW9uIGZwb3MgPSBuZXcgRmllbGRQb3NpdGlvbihEYXRlRm9ybWF0LkZpZWxkLlRJTUVfWk9ORSk7CkBAIC0xNjIsNiArMjQwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmhhc2hDb2RlKCkKICAgICAgICAgRmllbGRQb3NpdGlvbiBmcG9zID0gbmV3IEZpZWxkUG9zaXRpb24oMSk7CkBAIC0xODAsNiArMjY3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uI3NldEJlZ2luSW5kZXgoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGJvdW5kYXJ5IHZhbHVlcyBmb3IgdGhlIGZpZWxkIHR5cGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QmVnaW5JbmRleCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0QmVnaW5JbmRleEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLnNldEJlZ2luSW5kZXgoaW50KQogICAgICAgICBGaWVsZFBvc2l0aW9uIGZwb3MgPSBuZXcgRmllbGRQb3NpdGlvbigxKTsKQEAgLTE5Miw2ICsyODgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24jc2V0RW5kSW5kZXgoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGJvdW5kYXJ5IHZhbHVlcyBmb3IgdGhlIGZpZWxkIHR5cGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RW5kSW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVuZEluZGV4SSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24uc2V0RW5kSW5kZXgoaW50KQogICAgICAgICBGaWVsZFBvc2l0aW9uIGZwb3MgPSBuZXcgRmllbGRQb3NpdGlvbigxKTsKQEAgLTIwNCw2ICszMDksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24jdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLnRvU3RyaW5nKCkKICAgICAgICAgRmllbGRQb3NpdGlvbiBmcG9zID0gbmV3IEZpZWxkUG9zaXRpb24oMSk7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Zvcm1hdEZpZWxkVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Gb3JtYXRGaWVsZFRlc3QuamF2YQppbmRleCAxYmM2YjM5Li5jMGFjNjhlIDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Zvcm1hdEZpZWxkVGVzdC5qYXZhCisrKyBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvRm9ybWF0RmllbGRUZXN0LmphdmEKQEAgLTE3LDExICsxNywxNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAotaW1wb3J0IGphdmEudGV4dC5Gb3JtYXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS50ZXh0LkZvcm1hdDsKKworCitAVGVzdFRhcmdldENsYXNzKEZvcm1hdC5GaWVsZC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRm9ybWF0RmllbGRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIHByaXZhdGUgY2xhc3MgTW9ja0Zvcm1hdEZpZWxkIGV4dGVuZHMgRm9ybWF0LkZpZWxkIHsKIApAQCAtMzYsNiArNDIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZvcm1hdC5GaWVsZCNGb3JtYXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKSBUZXN0IG9mCiAgICAgICogICAgICAgIG1ldGhvZCBqYXZhLnRleHQuRm9ybWF0LkZpZWxkI0Zvcm1hdEZpZWxkKGphdmEubGFuZy5TdHJpbmcpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJGaWVsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IE1vY2tGb3JtYXRGaWVsZCgidGVzdCIpOwpkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9Gb3JtYXRUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Zvcm1hdFRlc3QuamF2YQppbmRleCA4MzMzN2MwLi5jMDQ5M2NhIDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Zvcm1hdFRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L0Zvcm1hdFRlc3QuamF2YQpAQCAtMTcsMTYgKzE3LDE5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCi1pbXBvcnQgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHM7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247CiBpbXBvcnQgamF2YS50ZXh0LkZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEZvcm1hdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICBwcml2YXRlIGNsYXNzIE1vY2tGb3JtYXQgZXh0ZW5kcyBGb3JtYXQgewogCkBAIC00OCw2ICs1MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRm9ybWF0I2Zvcm1hdChPYmplY3QpIFRlc3Qgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5Gb3JtYXQjZm9ybWF0KE9iamVjdCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0Zvcm1hdCgpOwpAQCAtNjAsNiArNzIsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZvcm1hdCNjbG9uZSgpIFRlc3Qgb2YgbWV0aG9kIGphdmEudGV4dC5Gb3JtYXQjY2xvbmUoKS4KICAgICAgKiAgICAgICAgQ29tcGFyZSBvZiBpbnRlcm5hbCB2YXJpYWJsZXMgb2YgY2xvbmVkIG9iamVjdHMuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIENvbXBhcmUgb2YgaW50ZXJuYWwgdmFyaWFibGVzIG9mIGNsb25lZCBvYmplY3RzCkBAIC03NSw2ICs5NiwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuT2JqZWN0KSBUZXN0IG9mIG1ldGhvZAogICAgICAqICAgICAgICBqYXZhLnRleHQuRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuT2JqZWN0KS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBub3RoaW5nLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKCJJdCBjYWxscyBhbiBhYnN0cmFjdCBtZXRvZCBmb3JtYXQiLCB0cnVlKTsKICAgICB9CkBAIC04NCw2ICsxMTQsMTUgQEAKICAgICAgKiAgICAgICAgb2YgbWV0aG9kCiAgICAgICogICAgICAgIGphdmEudGV4dC5Gb3JtYXQjZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcihqYXZhLmxhbmcuT2JqZWN0KS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBhbnl0aGluZy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvckxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBhc3NlcnRUcnVlKCJJdCBjYWxscyBhbiBhYnN0cmFjdCBtZXRvZCBmb3JtYXQiLCB0cnVlKTsKICAgICB9CkBAIC05Miw2ICsxMzEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LkZvcm1hdCNwYXJzZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIHNvdXJjZSkgVGVzdCBvZgogICAgICAqICAgICAgICBtZXRob2QgamF2YS50ZXh0LkZvcm1hdCNwYXJzZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIHNvdXJjZSkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYW55dGhpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2VPYmplY3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZU9iamVjdExqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBhc3NlcnRUcnVlKCJJdCBjYWxscyBhbiBhYnN0cmFjdCBtZXRvZCBwYXJzZU9iamVjdCIsIHRydWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvTWVzc2FnZUZvcm1hdEZpZWxkVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0RmllbGRUZXN0LmphdmEKaW5kZXggM2I0MTYxZC4uOTUzODFmNiAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0RmllbGRUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0RmllbGRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDEzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjQsMTIgKzMxLDIwIEBACiBpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoTWVzc2FnZUZvcm1hdC5GaWVsZC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTWVzc2FnZUZvcm1hdEZpZWxkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQkRmllbGQjRmllbGQoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmllbGQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBwcm90ZWN0ZWQgY29uc3RydWN0b3IKICAgICAgICAgU3RyaW5nIG5hbWUgPSAibmV3IE1lc3NhZ2UgZm9ybWF0IjsKQEAgLTQzLDYgKzU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0JEZpZWxkI3JlYWRSZXNvbHZlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVhZFJlc29sdmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlYWRSZXNvbHZlKCkgewogICAgICAgICAvLyB0ZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCiAKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvTWVzc2FnZUZvcm1hdFRlc3QuamF2YSBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvTWVzc2FnZUZvcm1hdFRlc3QuamF2YQppbmRleCA2ZjMwMjJlLi44NTQwNTUxIDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L01lc3NhZ2VGb3JtYXRUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0VGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM3LDEwICs0NCw5IEBACiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgdGVzdHMuc3VwcG9ydC5TdXBwb3J0X01lc3NhZ2VGb3JtYXQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTWVzc2FnZUZvcm1hdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTWVzc2FnZUZvcm1hdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZm9ybWF0MSwgZm9ybWF0MiwgZm9ybWF0MzsKQEAgLTY5LDcgKzc1LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I01lc3NhZ2VGb3JtYXQoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV91dGlsX0xvY2FsZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgbm90IHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIk1lc3NhZ2VGb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQoamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gamF2YS51dGlsLkxvY2FsZSkKICAgICAgICAgTG9jYWxlIG1rID0gbmV3IExvY2FsZSgibWsiLCAiTUsiKTsKQEAgLTg5LDcgKzEwNCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNNZXNzYWdlRm9ybWF0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNZXNzYWdlRm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBNZXNzYWdlRm9ybWF0IGZvcm1hdCA9IG5ldyBNZXNzYWdlRm9ybWF0KAogICAgICAgICAgICAgICAgICJhYmMgezQsdGltZX0gZGVmIHszLGRhdGV9IGdoaSB7MixudW1iZXJ9IGprbCB7MSxjaG9pY2UsMCNsb3d8MSNoaWdofSBtbm9wIHswfSIpOwpAQCAtMTc1LDcgKzE5OSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNhcHBseVBhdHRlcm4oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGx5UGF0dGVybkxqYXZhX2xhbmdfU3RyaW5nKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJhcHBseVBhdHRlcm4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfYXBwbHlQYXR0ZXJuTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmFwcGx5UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAgICBNZXNzYWdlRm9ybWF0IGZvcm1hdCA9IG5ldyBNZXNzYWdlRm9ybWF0KCJ0ZXN0Iik7CkBAIC0zMTksNiArMzUyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Nsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5jbG9uZSgpCiAgICAgICAgIE1lc3NhZ2VGb3JtYXQgZm9ybWF0ID0gbmV3IE1lc3NhZ2VGb3JtYXQoIid7J2Nob2ljZSd9J3swfSIpOwpAQCAtMzM3LDcgKzM3OSwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuCiAgICAgICAgIC8vIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAgICBNZXNzYWdlRm9ybWF0IGZvcm1hdDEgPSBuZXcgTWVzc2FnZUZvcm1hdCgiezB9Iik7CkBAIC0zNTQsNiArNDA1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QKICAgICAgICAgLy8gaW50IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Lmhhc2hDb2RlKCkKQEAgLTM2NCw2ICs0MjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcihqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3ZlcmlmaWVzIGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICAvLyBGSVhNRSBUaGlzIHRlc3QgZmFpbHMgb24gSGFybW9ueSBDbGFzc0xpYnJhcnkKICAgICBwdWJsaWMgdm9pZCBmYWlsaW5nX3Rlc3RfZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvckxqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcihqYXZhLmxhbmcuT2JqZWN0KQpAQCAtMzc2LDYgKzQ0NSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLk9iamVjdFtdLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdCRMamF2YV9sYW5nX09iamVjdExqYXZhX2xhbmdfU3RyaW5nQnVmZmVyTGphdmFfdGV4dF9GaWVsZFBvc2l0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgogICAgICAgICAvLyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoamF2YS5sYW5nLk9iamVjdCBbXSwKQEAgLTQwMCw2ICs0NzgsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZm9ybWF0KGphdmEubGFuZy5PYmplY3QsCiAgICAgICogICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzcywgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5jbGFzcywgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGphdmFfbGFuZ19PYmplY3RMamF2YV9sYW5nX1N0cmluZ0J1ZmZlckxqYXZhX3RleHRfRmllbGRQb3NpdGlvbigpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKICAgICAgICAgLy8gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGphdmEubGFuZy5PYmplY3QsCkBAIC00MTUsNiArNTAyLDE1IEBACiAgICAgICogICAgICAgIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Li4uKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5PYmplY3RbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBpbnQgaUN1cnJlbmN5ID0gMTIzOwogICAgICAgICBpbnQgaUludGVnZXIgID0gSW50ZWdlci5NSU5fVkFMVUU7CkBAIC00ODAsNiArNTc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2dldEZvcm1hdHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRGb3JtYXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRGb3JtYXRzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0LkZvcm1hdCBbXQogICAgICAgICAvLyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5nZXRGb3JtYXRzKCkKQEAgLTUyMiw2ICs2MjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZ2V0Rm9ybWF0c0J5QXJndW1lbnRJbmRleCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEZvcm1hdHNCeUFyZ3VtZW50SW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEZvcm1hdHNCeUFyZ3VtZW50SW5kZXgoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuRm9ybWF0IFtdIHRlc3RfZ2V0Rm9ybWF0c0J5QXJndW1lbnRJbmRleCgpCiAKQEAgLTU2Miw2ICs2NzYsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZ2V0TG9jYWxlKCkgVGVzdCBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZ2V0TG9jYWxlKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxlKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTG9jYWxlW10gbCA9IHsKQEAgLTYwNCw2ICs3MjcsMTUgQEAKICAgICAgKiAgICAgICAgZ2V0Rm9ybWF0cygpIHJlc3VsdHMgYWZ0ZXIgY2FsbHMgdG8gc2V0Rm9ybWF0KCkuIENhc2UgMjogVHJ5IHRvCiAgICAgICogICAgICAgIGNhbGwgc2V0Rm9ybWF0KCkgdXNpbmcgaW5jb3JyZWN0IGluZGV4LgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLnRleHQuRm9ybWF0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvcm1hdElMamF2YV90ZXh0X0Zvcm1hdCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGNhc2UgMTogQ29tcGFyZSBnZXRGb3JtYXRzKCkgcmVzdWx0cyBhZnRlciBjYWxscyB0byBzZXRGb3JtYXQoKQpAQCAtNjUxLDYgKzc4MywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNzZXRGb3JtYXRCeUFyZ3VtZW50SW5kZXgoaW50LAogICAgICAqICAgICAgICBqYXZhLnRleHQuRm9ybWF0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGb3JtYXRCeUFyZ3VtZW50SW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzLCBqYXZhLnRleHQuRm9ybWF0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvcm1hdEJ5QXJndW1lbnRJbmRleElMamF2YV90ZXh0X0Zvcm1hdCgpIHsKICAgICAgICAgLy8gdGVzdCBmb3IgbWV0aG9kIHNldEZvcm1hdEJ5QXJndW1lbnRJbmRleChpbnQsIEZvcm1hdCkKICAgICAgICAgTWVzc2FnZUZvcm1hdCBmMSA9IChNZXNzYWdlRm9ybWF0KSBmb3JtYXQxLmNsb25lKCk7CkBAIC03MzUsNiArODc2LDE1IEBACiAgICAgICogICAgICAgIGdldEZvcm1hdHMoKSByZXN1bHRzIGFmdGVyIGNhbGxzIHRvIHNldEZvcm1hdHMoRm9ybWF0W10pIENhc2UgMjoKICAgICAgKiAgICAgICAgVHJ5IHRvIHBhc3MgbnVsbCBhcmd1bWVudCB0byBzZXRGb3JtYXRzKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEZvcm1hdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkZvcm1hdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvcm1hdHMkTGphdmFfdGV4dF9Gb3JtYXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0IGYxID0gKE1lc3NhZ2VGb3JtYXQpIGZvcm1hdDEuY2xvbmUoKTsKQEAgLTc3NCw2ICs5MjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjc2V0Rm9ybWF0c0J5QXJndW1lbnRJbmRleChqYXZhLnRleHQuRm9ybWF0W10pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEZvcm1hdHNCeUFyZ3VtZW50SW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkZvcm1hdFtdLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvcm1hdHNCeUFyZ3VtZW50SW5kZXgkTGphdmFfdGV4dF9Gb3JtYXQoKSB7CiAgICAgICAgIC8vIHRlc3QgZm9yIG1ldGhvZCBzZXRGb3JtYXRCeUFyZ3VtZW50SW5kZXgoRm9ybWF0W10pCiAgICAgICAgIE1lc3NhZ2VGb3JtYXQgZjEgPSAoTWVzc2FnZUZvcm1hdCkgZm9ybWF0MS5jbG9uZSgpOwpAQCAtODYyLDYgKzEwMjEsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjcGFyc2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfdGV4dF9QYXJzZVBvc2l0aW9uKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLk9iamVjdCBbXQogICAgICAgICAvLyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5wYXJzZShqYXZhLmxhbmcuU3RyaW5nLApAQCAtODg5LDYgKzEwNTcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjc2V0TG9jYWxlKGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldExvY2FsZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExvY2FsZUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5zZXRMb2NhbGUoamF2YS51dGlsLkxvY2FsZSkKQEAgLTkwMyw2ICsxMDgwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I3RvUGF0dGVybigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInRvUGF0dGVybiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9QYXR0ZXJuKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC50b1BhdHRlcm4oKQogICAgICAgICBTdHJpbmcgcGF0dGVybiA9ICJbezB9XSI7CkBAIC05NDUsNiArMTEzMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdChqYXZhLnV0aWwuTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJNZXNzYWdlRm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV91dGlsX0xvY2FsZSgpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiBmb3IgSEFSTU9OWS02NQogICAgICAgICB0cnkgewpAQCAtOTU5LDYgKzExNTQsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjcGFyc2UoamF2YS5sYW5nLlN0cmluZykgVGVzdCBvZiBtZXRob2QKICAgICAgKiAgICAgICAgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjcGFyc2UoamF2YS5sYW5nLlN0cmluZykuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gIkEgezMsIG51bWJlciwgY3VycmVuY3l9IEIgezIsIHRpbWV9IEMgezAsIG51bWJlciwgcGVyY2VudH0gRCB7NH0gIEUgezEsY2hvaWNlLDAjb2ZmfDEjb259IEYgezAsIGRhdGV9IjsKICAgICAgICAgTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KHBhdHRlcm4pOwpAQCAtMTAxOCw2ICsxMjIyLDE1IEBACiAgICAgICogICAgICAgIENhc2UgMjogUGFyc2luZyBvZiBwYXJ0aWFsIGNvcnJlY3QgZGF0YSBzdHJpbmcuIENhc2UgMzogVHJ5IHRvIHVzZQogICAgICAqICAgICAgICBhcmd1bWVudCBQYXJzZVBvc2l0aW9uIGFzIG51bGwuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlT2JqZWN0TGphdmFfbGFuZ19TdHJpbmdMamF2YWphdmFfdGV4dF9QYXJzZVBvc2l0aW9uKCkgewogICAgICAgICBNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoInswLG51bWJlciwjLiMjfSwgezAsbnVtYmVyLCMuI30iKTsKICAgICAgICAgdHJ5IHsKQEAgLTEwNTgsNyArMTI3MSwxNSBAQAogICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIERvZXNuJ3QgdmVyaWZpZXMgZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdF9PYmplY3QoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMTg3NQogICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuQ0FOQURBKTsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvTnVtYmVyRm9ybWF0RmllbGRUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L051bWJlckZvcm1hdEZpZWxkVGVzdC5qYXZhCmluZGV4IDhhOTVhMDEuLjQ3YzliNDQgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvTnVtYmVyRm9ybWF0RmllbGRUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9OdW1iZXJGb3JtYXRGaWVsZFRlc3QuamF2YQpAQCAtMTYsMTggKzE2LDMzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoTnVtYmVyRm9ybWF0LkZpZWxkLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBOdW1iZXJGb3JtYXRGaWVsZFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0JEZpZWxkI0ZpZWxkKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZpZWxkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gcHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgIFN0cmluZyBuYW1lID0gIm5ldyBudW1iZXIgZm9ybWF0IjsKQEAgLTQxLDYgKzU2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQkRmllbGQjcmVhZFJlc29sdmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZWFkUmVzb2x2ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVhZFJlc29sdmUoKSB7CiAgICAgICAgIC8vIHRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKIApkaWZmIC0tZ2l0IGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9OdW1iZXJGb3JtYXRUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L051bWJlckZvcm1hdFRlc3QuamF2YQppbmRleCA4ZGQ1NTI2Li5iNDg3ODg4IDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L051bWJlckZvcm1hdFRlc3QuamF2YQorKysgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L051bWJlckZvcm1hdFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC50ZXN0cy5qYXZhLnRleHQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0OwogaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwogaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwpAQCAtMjQsMTQgKzMxLDIzIEBACiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CiBpbXBvcnQgamF2YS51dGlsLkN1cnJlbmN5OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKE51bWJlckZvcm1hdC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgTnVtYmVyRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuT2JqZWN0LAogICAgICAqICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdExqYXZhX2xhbmdfT2JqZWN0TGphdmFfbGFuZ19TdHJpbmdCdWZmZXJMamF2YV90ZXh0X0ZpZWxkUG9zaXRpb24oKSB7CiAgICAgICAgIEZpZWxkUG9zaXRpb24gcG9zOwogICAgICAgICBTdHJpbmdCdWZmZXIgb3V0OwpAQCAtOTAsNiArMTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0SW50ZWdlckluc3RhbmNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW50ZWdlckluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnRlZ2VySW5zdGFuY2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBnZXRJbnRlZ2VySW5zdGFuY2UoKQogICAgICAgICBMb2NhbGUgb3JpZ0xvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CkBAIC0xMTYsNiArMTQxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0SW50ZWdlckluc3RhbmNlKGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludGVnZXJJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludGVnZXJJbnN0YW5jZUxqYXZhX3V0aWxfTG9jYWxlKCkKICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0CkBAIC0xOTgsNiArMjMyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0Q3VycmVuY3koKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDdXJyZW5jeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3VycmVuY3koKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuQ3VycmVuY3kgZ2V0Q3VycmVuY3koKQogCkBAIC0yMTksNiArMjYyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjc2V0TWF4aW11bUludGVnZXJEaWdpdHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNYXhpbXVtSW50ZWdlckRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUludGVnZXJEaWdpdHMoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBmb3JtYXQgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgZm9ybWF0LnNldE1heGltdW1JbnRlZ2VyRGlnaXRzKDIpOwpAQCAtMjMxLDYgKzI4MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I3NldEN1cnJlbmN5KGphdmEudXRpbC5DdXJyZW5jeSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBub3QgdmVyaWZpZWQuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0Q3VycmVuY3kiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkN1cnJlbmN5LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnJlbmN5TGphdmFfdXRpbF9DdXJyZW5jeSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgc2V0Q3VycmVuY3koamF2YS51dGlsLkN1cnJlbmN5KQogICAgICAgICAvLyBhIHN1YmNsYXNzIHRoYXQgc3VwcG9ydHMgY3VycmVuY3kgZm9ybWF0dGluZwpAQCAtMjUzLDYgKzMxNCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I3BhcnNlT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gRG9lc24ndCB2ZXJpZnkgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZU9iamVjdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZU9iamVjdExqYXZhX2xhbmdfU3RyaW5nTGphdmFfdGV4dF9QYXJzZVBvc2l0aW9uKCkgewogICAgICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEhBUk1PTlktMTAwMwogICAgICAgICBhc3NlcnROdWxsKE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpLnBhcnNlT2JqZWN0KCIwIiwKQEAgLTI3MCw2ICszNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCNjbG9uZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNsb25lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKIAogICAgICAgICBpbnQgbWF4X2RpZ2l0cyA9IDEwMDsKQEAgLTI5NCw2ICszNzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCNlcXVhbHMoT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHMoKSB7CiAKICAgICAgICAgTnVtYmVyRm9ybWF0IG5mMSA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwpAQCAtMzE4LDYgKzQwNiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2Zvcm1hdChkb3VibGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtkb3VibGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGRvdWJsZSgpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIE51bWJlckZvcm1hdCBuZjEgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKQEAgLTM1MSw2ICs0NDgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCNmb3JtYXQobG9uZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2xvbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZm9ybWF0TGxvbmcoKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CkBAIC0zODUsNiArNDkxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0QXZhaWxhYmxlTG9jYWxlcygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEF2YWlsYWJsZUxvY2FsZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEF2YWlsYWJsZUxvY2FsZXMoKSB7CiAKICAgICAgICAgTG9jYWxlW10gbCA9IE51bWJlckZvcm1hdC5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CkBAIC00MDUsNiArNTIwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0Q3VycmVuY3lJbnN0YW5jZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEN1cnJlbmN5SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnJlbmN5SW5zdGFuY2UoKSB7CiAKICAgICAgICAgTnVtYmVyRm9ybWF0IGZvcm1hdCA9IE51bWJlckZvcm1hdC5nZXRDdXJyZW5jeUluc3RhbmNlKCk7CkBAIC00MzAsNiArNTU0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0Q3VycmVuY3lJbnN0YW5jZShqYXZhLnV0aWwuTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDdXJyZW5jeUluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5Mb2NhbGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3VycmVuY3lJbnN0YW5jZUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgTG9jYWxlIHVzTG9jYWxlID0gTG9jYWxlLlVTOwpAQCAtNDk3LDYgKzYzMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2dldEluc3RhbmNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlKCkgewogICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuVVMpOwogICAgICAgICBOdW1iZXJGb3JtYXQgZm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7CkBAIC01MTksNiArNjYxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0SW5zdGFuY2UoTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuVVMpOwpAQCAtNTYxLDYgKzcxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2dldE51bWJlckluc3RhbmNlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TnVtYmVySW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE51bWJlckluc3RhbmNlKCkgewogICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuVVMpOwogICAgICAgICBOdW1iZXJGb3JtYXQgZm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldE51bWJlckluc3RhbmNlKCk7CkBAIC01ODMsNiArNzQzLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0TnVtYmVySW5zdGFuY2UoTG9jYWxlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROdW1iZXJJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE51bWJlckluc3RhbmNlTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuVVMpOwpAQCAtNjI3LDYgKzc5NiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2dldFBlcmNlbnRJbnN0YW5jZSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBlcmNlbnRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVyY2VudEluc3RhbmNlKCkgewogICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuVVMpOwogICAgICAgICBOdW1iZXJGb3JtYXQgZm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldFBlcmNlbnRJbnN0YW5jZSgpOwpAQCAtNjQ5LDYgKzgyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2dldFBlcmNlbnRJbnN0YW5jZShMb2NhbGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFBlcmNlbnRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuTG9jYWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBlcmNlbnRJbnN0YW5jZUxqYXZhX3V0aWxfTG9jYWxlKCkgewogICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuVVMpOwogICAgICAgICBOdW1iZXJGb3JtYXQgZm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldFBlcmNlbnRJbnN0YW5jZShuZXcgTG9jYWxlKCJhciIsCkBAIC02NzgsNiArODY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZjEgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKIApAQCAtNzAxLDYgKzg5NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2dldE1pbmltdW1GcmFjdGlvbkRpZ2l0cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1pbmltdW1GcmFjdGlvbkRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIG5mMS5zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoSW50ZWdlci5NQVhfVkFMVUUpOwpAQCAtNzIzLDYgKzkyOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2dldE1heGltdW1JbnRlZ2VyRGlnaXRzKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TWF4aW11bUludGVnZXJEaWdpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW1JbnRlZ2VyRGlnaXRzKCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIG5mMS5zZXRNYXhpbXVtSW50ZWdlckRpZ2l0cyhJbnRlZ2VyLk1BWF9WQUxVRSk7CkBAIC03NDUsNiArOTU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjZ2V0TWluaW11bUludGVnZXJEaWdpdHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bUludGVnZXJuRGlnaXRzKCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIG5mMS5zZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyhJbnRlZ2VyLk1BWF9WQUxVRSk7CkBAIC03NjcsNiArOTkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQjaGFzaENvZGUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNoQ29kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7CiAKICAgICAgICAgTnVtYmVyRm9ybWF0IG5mMSA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwpAQCAtNzk5LDYgKzEwMzEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCNpc0dyb3VwaW5nVXNlZCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzR3JvdXBpbmdVc2VkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0dyb3VwaW5nVXNlZCgpIHsKICAgICAgICAgTnVtYmVyRm9ybWF0IG5mMSA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwogICAgICAgICBhc3NlcnRUcnVlKCJncm91cGluZyBpcyBub3QgdXNlZCBmb3IgTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlIiwgbmYxCkBAIC04MTgsNiArMTA1OSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I3NldEdyb3VwaW5nVXNlZChib29sZWFuKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRHcm91cGluZ1VzZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Ym9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRHcm91cGluZ1VzZWQoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZjEgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgbmYxLnNldEdyb3VwaW5nVXNlZChmYWxzZSk7CkBAIC04NzksNiArMTEyOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I2lzUGFyc2VJbnRlZ2VyT25seSgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzUGFyc2VJbnRlZ2VyT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNQYXJzZUludGVnZXJPbmx5KCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlBhcnNlSW50ZWdlck9ubHkgaXMgbm90IHVzZWQgZm9yIE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSIsCkBAIC04OTgsNiArMTE1NywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I3NldFBhcnNlSW50ZWdlck9ubHkoYm9vbGVhbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UGFyc2VJbnRlZ2VyT25seSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFBhcnNlSW50ZWdlck9ubHkoKSB7CiAgICAgICAgIE51bWJlckZvcm1hdCBuZjEgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKICAgICAgICAgbmYxLnNldFBhcnNlSW50ZWdlck9ubHkodHJ1ZSk7CkBAIC05MjIsNiArMTE5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I3NldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CiAgICAgICAgIG5mMS5zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoSW50ZWdlci5NQVhfVkFMVUUpOwpAQCAtOTU2LDYgKzEyMzMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCNzZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1GcmFjdGlvbkRpZ2l0cygpIHsKIAogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CkBAIC05ODksNiArMTI3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I3NldE1pbmltdW1JbnRlZ2VyRGlnaXRzKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TWluaW11bUludGVnZXJEaWdpdHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JbnRlZ2VyRGlnaXRzKCkgewogCiAgICAgICAgIE51bWJlckZvcm1hdCBuZjEgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKQEAgLTEwMTksNiArMTMxNCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0I3BhcnNlKFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBOdW1iZXJGb3JtYXQgbmYxID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIHRyeSB7CkBAIC0xMDgzLDYgKzEzODcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCNOdW1iZXJGb3JtYXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJOdW1iZXJGb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0cnVjdG9yKCkgewogICAgICAgICBNeU51bWJlckZvcm1hdCBtZiA9IG5ldyBNeU51bWJlckZvcm1hdCgpOwogICAgICAgICBhc3NlcnRGYWxzZSgiR3JlYXRlZCBOdW1iZXJGb3JtYXQgb2JqZWN0IGlzIG51bGwiLCBtZiA9PSBudWxsKTsKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvUGFyc2VFeGNlcHRpb25UZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L1BhcnNlRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDVlMmZhODguLjg5ODc3ZTIgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvUGFyc2VFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9QYXJzZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMTYsMTQgKzE2LDI5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnRleHQudGVzdHMuamF2YS50ZXh0OwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFBhcnNlRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiNQYXJzZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBhcnNlRXhjZXB0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCiAgICAgICAgIC8vIFNNCkBAIC0zOSw2ICs1NCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24jZ2V0RXJyb3JPZmZzZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFcnJvck9mZnNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RXJyb3JPZmZzZXQoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBpbnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uLmdldEVycm9yT2Zmc2V0KCkKICAgICAgICAgLy8gU00KZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvUGFyc2VQb3NpdGlvblRlc3QuamF2YSBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvUGFyc2VQb3NpdGlvblRlc3QuamF2YQppbmRleCBiOGIyOTgzLi5iMGIwMzk4IDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L1BhcnNlUG9zaXRpb25UZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9QYXJzZVBvc2l0aW9uVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKwogaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwogCitAVGVzdFRhcmdldENsYXNzKFBhcnNlUG9zaXRpb24uY2xhc3MpIAogcHVibGljIGNsYXNzIFBhcnNlUG9zaXRpb25UZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAogICAgIFBhcnNlUG9zaXRpb24gcHA7CkBAIC0yNSw2ICszMSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbiNQYXJzZVBvc2l0aW9uKGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUGFyc2VQb3NpdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24oaW50KQogICAgICAgICB0cnkgewpAQCAtNDEsNiArNTYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24jZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbgogICAgICAgICAvLyBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbi5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKQEAgLTU1LDYgKzc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uI2dldEVycm9ySW5kZXgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRFcnJvckluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFcnJvckluZGV4KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLmdldEVycm9ySW5kZXgoKQogICAgICAgICBwcC5zZXRFcnJvckluZGV4KDU2KTsKQEAgLTY0LDYgKzk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uI2dldEluZGV4KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluZGV4KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLmdldEluZGV4KCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0SW5kZXggZmFpbGVkLiIsIHBwLmdldEluZGV4KCkgPT0gSW50ZWdlci5NQVhfVkFMVUUpOwpAQCAtNzIsNiArMTE0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgaW50IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLmhhc2hDb2RlKCkKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgaGFzaENvZGUgcmV0dXJuZWQiLCAocHAuaGFzaENvZGUoKSA9PSBwcC5nZXRJbmRleCgpCkBAIC04MSw2ICsxMzIsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24jc2V0RXJyb3JJbmRleChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYm91bmRhcnkgdmFsdWVzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEVycm9ySW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVycm9ySW5kZXhJKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbi5zZXRFcnJvckluZGV4KGludCkKICAgICAgICAgcHAuc2V0RXJyb3JJbmRleCg0NTY0KTsKQEAgLTkwLDYgKzE1MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbiNzZXRJbmRleChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJbmRleEkoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLnNldEluZGV4KGludCkKICAgICAgICAgcHAuc2V0SW5kZXgoNDU2NCk7CkBAIC05OSw2ICsxNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24jdG9TdHJpbmcoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLnRvU3RyaW5nKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0b1N0cmluZyBmYWlsZWQuIiwKZGlmZiAtLWdpdCBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvUnVsZUJhc2VkQ29sbGF0b3JUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L1J1bGVCYXNlZENvbGxhdG9yVGVzdC5qYXZhCmluZGV4IDE5NjA4OTIuLmRjMDEyNmUgMTAwNjQ0Ci0tLSBhL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvUnVsZUJhc2VkQ29sbGF0b3JUZXN0LmphdmEKKysrIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9SdWxlQmFzZWRDb2xsYXRvclRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC50ZXN0cy5qYXZhLnRleHQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CiBpbXBvcnQgamF2YS50ZXh0LkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjsKIGltcG9ydCBqYXZhLnRleHQuQ29sbGF0aW9uS2V5OwpAQCAtMjYsMTMgKzMzLDIxIEBACiBpbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KK0BUZXN0VGFyZ2V0Q2xhc3MoUnVsZUJhc2VkQ29sbGF0b3IuY2xhc3MpIAogcHVibGljIGNsYXNzIFJ1bGVCYXNlZENvbGxhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IjUnVsZUJhc2VkQ29sbGF0b3IoU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSdWxlQmFzZWRDb2xsYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0ckxSdWxlQmFzZWRDb2xsYXRvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciByYmM7CiAgICAgICAgIHRyeSB7CkBAIC03MCw3ICs4NSwxNSBAQAogICAgICAgICB9IGNhdGNoIChqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24gcGUpIHsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4gRG9lc24ndCB2ZXJpZnkgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2xsYXRpb25LZXkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb2xsYXRpb25LZXlMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBIQVJNT05ZLTI4CiAgICAgICAgIFN0cmluZyBzb3VyY2UgPSBudWxsOwpAQCAtODQsNyArMTA3LDE1IEBACiAgICAgICAgIENvbGxhdGlvbktleSBjayA9IHJiYy5nZXRDb2xsYXRpb25LZXkoc291cmNlKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiQXNzZXJ0IDE6IGdldENvbGxhdGlvbktleSAobnVsbCkgZG9lcyBub3QgcmV0dXJuIG51bGwiLCBjayk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc2hDb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIHJ1bGUgPSAiPCBhIDwgYiA8IGMgPCBkIjsKQEAgLTk5LDcgKzEzMCwxNSBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciBjb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgogICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOwpAQCAtMTEzLDYgKzE1MiwxNSBAQAogICAgIC8qCiAgICAgICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZXF1YWxzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5PYmplY3QuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgcnVsZSA9ICI8IGEgPCBiIDwgYyA8IGQgPCBlIjsKICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgY29sbCA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihydWxlKTsKQEAgLTEzMywxMiArMTgxLDI5IEBACiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBpbnQgY29tcGFyZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY29tcGFyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVN0cmluZ1N0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBydWxlID0gIjwgYyA8IGIgPCBhIjsKICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgY29sbCA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihydWxlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBjb2xsLmNvbXBhcmUoImMiLCAiYSIpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBudWxsIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbGxhdGlvbktleSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sbGF0aW9uS2V5KCkgewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciBjb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgogICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShMb2NhbGUuR0VSTUFOKTsKQEAgLTE1Miw3ICsyMTcsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsLmNvbXBhcmUoc291cmNlLCBzb3VyY2UyKSA+IDApOwogCiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFJ1bGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFJ1bGVzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHJ1bGUgPSAiPCBhID0gYiA8IGMiOwogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciBjb2xsID0gbmV3IFJ1bGVCYXNlZENvbGxhdG9yKHJ1bGUpOwpAQCAtMTYzLDcgKzIzNiwxNiBAQAogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IKICAgICAgKiBnZXRDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEdldENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvclN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB7CiAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlID0gbmV3IExvY2FsZSgiZXMiLCAiIiwgIlRSQURJVElPTkFMIik7CiAgICAgICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciBjb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgpAQCAtMjEyLDcgKzI5NCwxNiBAQAogICAgICAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGphdmEudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IKICAgICAgKiBnZXRDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb2xsYXRpb25FbGVtZW50SXRlcmF0b3JDaGFyYWN0ZXJJdGVyYXRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEdldENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvckNoYXJhY3Rlckl0ZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHsKICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBuZXcgTG9jYWxlKCJlcyIsICIiLCAiVFJBRElUSU9OQUwiKTsKICAgICAgICAgICAgIFJ1bGVCYXNlZENvbGxhdG9yIGNvbGwgPSAoUnVsZUJhc2VkQ29sbGF0b3IpIENvbGxhdG9yCkBAIC0yNTksNyArMzUwLDIxIEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgc2V0U3RyZW5ndGggbWV0aG9kIHdpdGggUFJJTUFSWSwgU0VDT05EQVJZLCAiICsKKyAgICAgICAgICAgICJURVJUSUFSWSBvciBJREVOVElDQUwgdmFsdWVzIGFzIGEgcGFyYW1ldGVyOyBkb2Vzbid0IHZlcmlmeSB0aGF0IiArCisgICAgICAgICAgICAic2V0U3RyZW5ndGggbWV0aG9kIGNhbiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0U3RyZW5ndGgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN0cmVuZ3RoIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKSAgICAgICAgCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZW5ndGgoKSB7CiAgICAgICAgIFJ1bGVCYXNlZENvbGxhdG9yIGNvbGwgPSAoUnVsZUJhc2VkQ29sbGF0b3IpIENvbGxhdG9yCiAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKExvY2FsZS5VUyk7CkBAIC0yNjksNyArMzc0LDIwIEBACiAgICAgICAgIH0KIAogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE5PX0RFQ09NUE9TSVRJT04sIENBTk9OSUNBTF9ERUNPTVBPU0lUSU9OLCAiICsKKyAgICAgICAgICAgICJGVUxMX0RFQ09NUE9TSVRJT04uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RGVjb21wb3NpdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtpbnQuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVjb21wb3NpdGlvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvbXBvc2l0aW9uKCkgewogICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciBjb2xsID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBDb2xsYXRvcgogICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOwpAQCAtMjc4LDcgKzM5NiwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGNvbGwuZ2V0RGVjb21wb3NpdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsYXRvcl9HZXRJbnN0YW5jZSgpIHsKICAgICAgICAgQ29sbGF0b3IgY29sbCA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CiAgICAgICAgIE9iamVjdCBvYmoxID0gImEiOwpAQCAtMjg4LDcgKzQxNCwxNSBAQAogICAgICAgICBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwogICAgICAgICBhc3NlcnRGYWxzZShjb2xsLmVxdWFscygiQSIsICJcdUZGMjEiKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRW1wdHkgdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdmFpbGFibGVMb2NhbGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEF2YWlhYmxlTG9jYWxlcygpIHsKICAgICAgICAgLy8gTG9jYWxlW10gbG9jYWxlcyA9IENvbGxhdG9yLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgICAgICAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGVzLmxlbmd0aDsgaSsrKSB7CkBAIC0yOTcsNiArNDMxLDE1IEBACiAgICAgfQogCiAgICAgLy8gVGVzdCBDb2xsYXRpb25LZXkKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Q29sbGF0aW9uS2V5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsYXRpb25LZXkoKSB7CiAgICAgICAgIENvbGxhdG9yIGNvbGwgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOwogICAgICAgICBTdHJpbmcgdGV4dCA9ICJhYmMiOwpAQCAtMzExLDYgKzQ1NCwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IuUnVsZUJhc2VkQ29sbGF0b3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBSdWxlQmFzZWRDb2xsYXRvcihqYXZhLmxhbmcuU3RyaW5nKSBjb25zdHJ1Y3RvciB3aXRoICIgKworICAgICAgICAgICAgIm51bGwgYXMgYSBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiUnVsZUJhc2VkQ29sbGF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxQb2ludGVyRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjQxCiAgICAgICAgIHRyeSB7CkBAIC0zMjMsNiArNDc2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5SdWxlQmFzZWRDb2xsYXRvci5jb21wYXJlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNvbXBhcmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktODM2CiAgICAgICAgIHRyeSB7CkBAIC0zMzUsNiArNDk3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5SdWxlQmFzZWRDb2xsYXRvci5SdWxlQmFzZWRDb2xsYXRvcihqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGVtcHR5IHN0cmluZyBhcyBhIHBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJSdWxlQmFzZWRDb2xsYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmdFeGNlcHRpb24oKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktMjQxCiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXRUZXN0LmphdmEgYi90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXRUZXN0LmphdmEKaW5kZXggYzVlOTRlMS4uNTlhYTJiOSAxMDA2NDQKLS0tIGEvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0VGVzdC5qYXZhCisrKyBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC50ZXN0cy5qYXZhLnRleHQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CiBpbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247CkBAIC0zMSw2ICszNiw3IEBACiAKIGltcG9ydCB0ZXN0cy5zdXBwb3J0LlN1cHBvcnRfU2ltcGxlRGF0ZUZvcm1hdDsKIAorQFRlc3RUYXJnZXRDbGFzcyhTaW1wbGVEYXRlRm9ybWF0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTaW1wbGVEYXRlRm9ybWF0VGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKICAgICBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiIiwgTG9jYWxlLkVOR0xJU0gpOwpAQCAtMTA3LDYgKzExMywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCNTaW1wbGVEYXRlRm9ybWF0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2ltcGxlRGF0ZUZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCgpCiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZjIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpOwpAQCAtMTIyLDYgKzEzNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCNTaW1wbGVEYXRlRm9ybWF0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpbXBsZURhdGVGb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQoamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmMiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5Iik7CkBAIC0xNjIsNiArMTg2LDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I1NpbXBsZURhdGVGb3JtYXQoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IE51bGxQb2ludGVyRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU2ltcGxlRGF0ZUZvcm1hdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3RleHRfRGF0ZUZvcm1hdFN5bWJvbHMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLAogICAgICAgICAvLyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMpCkBAIC0xNzksNiArMjEyLDE1IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I1NpbXBsZURhdGVGb3JtYXQoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS51dGlsLkxvY2FsZSkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNpbXBsZURhdGVGb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS51dGlsLkxvY2FsZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfdXRpbF9Mb2NhbGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLAogICAgICAgICAvLyBqYXZhLnV0aWwuTG9jYWxlKQpAQCAtMTk1LDYgKzIzNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCNhcHBseUxvY2FsaXplZFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGx5TG9jYWxpemVkUGF0dGVybiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGx5TG9jYWxpemVkUGF0dGVybkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdC5hcHBseUxvY2FsaXplZFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZykKQEAgLTI0OSw2ICszMDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQjYXBwbHlQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGx5UGF0dGVybiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGx5UGF0dGVybkxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdC5hcHBseVBhdHRlcm4oamF2YS5sYW5nLlN0cmluZykKQEAgLTI4Nyw2ICszNDcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQjY2xvbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjbG9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuT2JqZWN0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0LmNsb25lKCkKICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmMiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCk7CkBAIC0zMDUsNiArMzc0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJlcXVhbHMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLk9iamVjdC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4KICAgICAgICAgLy8gamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCkBAIC0zMTgsNiArMzk2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdCA9IChTaW1wbGVEYXRlRm9ybWF0KSBEYXRlRm9ybWF0LmdldEluc3RhbmNlKCk7CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgY2xvbmUgPSAoU2ltcGxlRGF0ZUZvcm1hdCkgZm9ybWF0LmNsb25lKCk7CkBAIC0zMzIsNyArNDE5LDE1IEBACiAgICAgICAgIGFzc2VydEZhbHNlKCJvYmplY3RzIGhhcyBlcXVhbCBoYXNoIGNvZGUiLCBmb3JtYXQyLmhhc2hDb2RlKCkgPT0gZm9ybWF0CiAgICAgICAgICAgICAgICAgLmhhc2hDb2RlKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlJlZ3Jlc3Npb24gdGVzdC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTaW1wbGVEYXRlRm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbHNfYWZ0ZXJGb3JtYXQoKSB7CiAgICAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSEFSTU9OWS0yMDkKICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCk7CkBAIC0zNDMsNyArNDM4LDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I2Zvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2Zvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9mb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFJlZ3Jlc3Npb24gZm9yIEhBUk1PTlktNDY2CkBAIC0zNjMsNyArNDY3LDE2IEBACiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I2Zvcm1hdChqYXZhLnV0aWwuRGF0ZSwKICAgICAgKiAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciwgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9mb3JtYXRMamF2YV91dGlsX0RhdGVMamF2YV9sYW5nX1N0cmluZ0J1ZmZlckxqYXZhX3RleHRfRmllbGRQb3NpdGlvbigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEudXRpbC5EYXRlLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzLCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZm9ybWF0TGphdmFfdXRpbF9EYXRlTGphdmFfbGFuZ19TdHJpbmdCdWZmZXJMamF2YV90ZXh0X0ZpZWxkUG9zaXRpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCiAgICAgICAgIC8vIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChqYXZhLnV0aWwuRGF0ZSwKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZ0J1ZmZlciwgamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCkBAIC01NDIsNyArNjU1LDI0IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I2Zvcm1hdChqYXZhLnV0aWwuRGF0ZSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3RpbWVab25lRm9ybWF0dGluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBmb3JtYXR0aW5nIG9mIHRpbWV6b25lcy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRUaW1lWm9uZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtUaW1lWm9uZS5jbGFzc30KKyAgICAgICAgKSwKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmb3JtYXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS51dGlsLkRhdGUuY2xhc3MsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MsIGphdmEudGV4dC5GaWVsZFBvc2l0aW9uLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImFwcGx5UGF0dGVybiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF90aW1lWm9uZUZvcm1hdHRpbmcoKSB7CiAgICAgICAgIC8vIHRlc3RzIHNwZWNpZmljIHRvIGZvcm1hdHRpbmcgb2YgdGltZXpvbmVzCiAgICAgICAgIERhdGUgc3VtbWVyRGF0ZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk5LCBDYWxlbmRhci5KVU5FLCAyLCAxNSwgMywKICAgICAgICAgICAgICAgICA2KS5nZXRUaW1lKCk7CkBAIC01ODIsNiArNzEyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I2dldDJEaWdpdFllYXJTdGFydCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldDJEaWdpdFllYXJTdGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0MkRpZ2l0WWVhclN0YXJ0KCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS51dGlsLkRhdGUKICAgICAgICAgLy8gamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQuZ2V0MkRpZ2l0WWVhclN0YXJ0KCkKQEAgLTU5Nyw2ICs3MzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQjZ2V0RGF0ZUZvcm1hdFN5bWJvbHMoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREYXRlRm9ybWF0U3ltYm9scyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0ZUZvcm1hdFN5bWJvbHMoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMKICAgICAgICAgLy8gamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQuZ2V0RGF0ZUZvcm1hdFN5bWJvbHMoKQpAQCAtNjA5LDYgKzc1NywxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCNwYXJzZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICAgICBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmaWVkIFBhcnNlRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV90ZXh0X1BhcnNlUG9zaXRpb24oKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnV0aWwuRGF0ZQogICAgICAgICAvLyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdC5wYXJzZShqYXZhLmxhbmcuU3RyaW5nLApAQCAtODE1LDYgKzk3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCNzZXQyRGlnaXRZZWFyU3RhcnQoamF2YS51dGlsLkRhdGUpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldDJEaWdpdFllYXJTdGFydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnV0aWwuRGF0ZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXQyRGlnaXRZZWFyU3RhcnRMamF2YV91dGlsX0RhdGUoKSB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkCiAgICAgICAgIC8vIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0LnNldDJEaWdpdFllYXJTdGFydChqYXZhLnV0aWwuRGF0ZSkKQEAgLTg0Miw2ICsxMDA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0I3NldERhdGVGb3JtYXRTeW1ib2xzKGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXREYXRlRm9ybWF0U3ltYm9scyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF0ZUZvcm1hdFN5bWJvbHNMamF2YV90ZXh0X0RhdGVGb3JtYXRTeW1ib2xzKCkgewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2Qgdm9pZAogICAgICAgICAvLyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdC5zZXREYXRlRm9ybWF0U3ltYm9scyhqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMpCkBAIC04NjMsNiArMTAzOCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCN0b0xvY2FsaXplZFBhdHRlcm4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b0xvY2FsaXplZFBhdHRlcm4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvTG9jYWxpemVkUGF0dGVybigpIHsKICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nCkBAIC04OTEsNiArMTA3NSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCN0b1BhdHRlcm4oKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1BhdHRlcm4iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3RvUGF0dGVybigpIHsKICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAieXl5eSBtbSBkZCI7CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KHBhdHRlcm4pOwpAQCAtOTEwLDYgKzExMDMsMTUgQEAKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQjcGFyc2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24pCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiUmVncmVzc2lvbiB0ZXN0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlX3dpdGhfc3BhY2VzKCkgewogICAgICAgICAvLyBSZWdyZXNzaW9uIGZvciBIQVJNT05ZLTUwMgogICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkhIOm1tOnNzIik7CmRpZmYgLS1naXQgYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L1N0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yVGVzdC5qYXZhIGIvdGV4dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS90ZXh0L3Rlc3RzL2phdmEvdGV4dC9TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvclRlc3QuamF2YQppbmRleCA2ODI5M2ZiLi4wN2VhOGZlIDEwMDY0NAotLS0gYS90ZXh0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3RleHQvdGVzdHMvamF2YS90ZXh0L1N0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yVGVzdC5qYXZhCisrKyBiL3RleHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvdGV4dC90ZXN0cy9qYXZhL3RleHQvU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3JUZXN0LmphdmEKQEAgLTE3LDE3ICsxNywzMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LnRlc3RzLmphdmEudGV4dDsKIAotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOworaW1wb3J0IGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcjsKKworQFRlc3RUYXJnZXRDbGFzcyhTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihTdHJpbmcsCiAgICAgICogICAgICAgIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoInZhbHVlIiwgMCkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigidmFsdWUiLCAidmFsdWUiLmxlbmd0aCgpKSk7CkBAIC01Nyw2ICs3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoU3RyaW5nLCBpbnQsIGludCwgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJKCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigidmFsdWUiLCAwLCAidmFsdWUiLmxlbmd0aCgpLAogICAgICAgICAgICAgICAgIDApKTsKQEAgLTExNyw2ICsxNDEsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yLmVxdWFscyhPYmplY3QpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImVxdWFscyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuT2JqZWN0LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewogICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBzY2kwID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhzY2kwLCBzY2kwKTsKQEAgLTE0NSw2ICsxNzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yLmNsb25lKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY2xvbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewogICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBzY2kwID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydFNhbWUoc2NpMCwgc2NpMCk7CkBAIC0xNjEsNiArMjAzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5jdXJyZW50KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0aGF0IGN1cnJlbnQoKSBtZXRob2QgcmV0dXJucyBET05FICIgKworICAgICAgICAgICAgImlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIG9mZiB0aGUgZW5kIG9mIHRoZSB0ZXh0LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImN1cnJlbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2N1cnJlbnQoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGZpeHR1cmUgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdmJywgZml4dHVyZS5jdXJyZW50KCkpOwpAQCAtMTc1LDYgKzIyNywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IuZmlyc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJmaXJzdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZmlyc3QoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGZpeHR1cmUgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdmJywgZml4dHVyZS5maXJzdCgpKTsKQEAgLTE5Nyw2ICsyNTgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yLmdldEJlZ2luSW5kZXgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRCZWdpbkluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRCZWdpbkluZGV4KCkgewogICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBmaXh0dXJlID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKCJmaXh0dXJlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBmaXh0dXJlLmdldEJlZ2luSW5kZXgoKSk7CkBAIC0yMTQsNiArMjg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5nZXRFbmRJbmRleCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVuZEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbmRJbmRleCgpIHsKICAgICAgICAgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgZml4dHVyZSA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpeHR1cmUiLmxlbmd0aCgpLCBmaXh0dXJlLmdldEVuZEluZGV4KCkpOwpAQCAtMjMzLDYgKzMxMiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IuZ2V0SW5kZXgoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbmRleCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbmRleCgpIHsKICAgICAgICAgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgZml4dHVyZSA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZml4dHVyZS5nZXRJbmRleCgpKTsKQEAgLTI0OCw2ICszMzYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yLmxhc3QoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJsYXN0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdExhc3QoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGZpeHR1cmUgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCdlJywgZml4dHVyZS5sYXN0KCkpOwpAQCAtMjY1LDYgKzM2MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IubmV4dCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5leHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X25leHQoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGZpeHR1cmUgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZpeHR1cmUuZ2V0SW5kZXgoKSk7CkBAIC0zMDMsNiArNDA5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5wcmV2aW91cygpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInByZXZpb3VzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9wcmV2aW91cygpIHsKICAgICAgICAgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgZml4dHVyZSA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigiZml4dHVyZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVySXRlcmF0b3IuRE9ORSwgZml4dHVyZS5wcmV2aW91cygpKTsKQEAgLTM0OCw2ICs0NjMsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yLnNldEluZGV4KGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0SW5kZXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7aW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEluZGV4KCkgewogICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBmaXh0dXJlID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKCJmaXh0dXJlIik7CiAgICAgICAgIHdoaWxlIChmaXh0dXJlLm5leHQoKSAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FKSB7CkBAIC0zNzcsNiArNTAxLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvci5zZXRUZXh0KFN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0VGV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFRleHQoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGZpeHR1cmUgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoImZpeHR1cmUiKTsKICAgICAgICAgZml4dHVyZS5zZXRUZXh0KCJmaXgiKTsKQEAgLTM5NCw2ICs1MjcsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yI1N0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoInZhbHVlIikpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigiIikpOwpAQCAtNDE2LDYgKzU1OCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IjU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgaW50KQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0koKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGl0ID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKCJ0ZXN0aW5nIiwgMyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYmVnaW4gaW5kZXgiLCAwLCBpdC5nZXRCZWdpbkluZGV4KCkpOwpAQCAtNDI5LDYgKzU4MCwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IjU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoamF2YS5sYW5nLlN0cmluZywKICAgICAgKiAgICAgICAgaW50LCBpbnQsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUlJKCkgewogICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBpdCA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigidGVzdGluZyIsIDIsCiAgICAgICAgICAgICAgICAgNiwgNCk7CkBAIC00NDIsNiArNjAyLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciNnZXRJbmRleCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbmRleCgpIHsKICAgICAgICAgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgaXQxID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKCJ0ZXN0aW5nIiwgMiwKICAgICAgICAgICAgICAgICA2LCA0KTsKQEAgLTQ1NSw2ICs2MjQsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yI2hhc2hDb2RlKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzaENvZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewogICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBpdDEgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoInRlc3RpbmciLCAyLAogICAgICAgICAgICAgICAgIDYsIDQpOwpAQCAtNDg1LDYgKzY2MywxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IjbGFzdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImxhc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xhc3QoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGl0MSA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigidGVzdGluZyIsIDIsCiAgICAgICAgICAgICAgICAgNiwgMyk7CkBAIC00OTcsNiArNjg0LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciNzZXRJbmRleChpbnQpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEluZGV4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2ludC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRJbmRleEkoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGl0MSA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigidGVzdGluZyIsIDIsCiAgICAgICAgICAgICAgICAgNiwgNCk7CkBAIC01MTAsNiArNzA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciNzZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFRleHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGl0MSA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigidGVzdGluZyIsIDIsCiAgICAgICAgICAgICAgICAgNiwgNCk7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9EZWZhdWx0U2VydmVyU29ja2V0RmFjdG9yeS5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvRGVmYXVsdFNlcnZlclNvY2tldEZhY3RvcnkuamF2YQppbmRleCAyYmYzYTIyLi4wYjMwOWRmIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9EZWZhdWx0U2VydmVyU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L0RlZmF1bHRTZXJ2ZXJTb2NrZXRGYWN0b3J5LmphdmEKQEAgLTI3LDcgKzI3LDkgQEAKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CiAKIC8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBqYXZheC5uZXQuU2VydmVyU29ja2V0RmFjdG9yeQorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBqYXZheC5uZXQuU2VydmVyU29ja2V0RmFjdG9yeS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKiAKICAqLwogY2xhc3MgRGVmYXVsdFNlcnZlclNvY2tldEZhY3RvcnkgZXh0ZW5kcyBTZXJ2ZXJTb2NrZXRGYWN0b3J5IHsKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L0RlZmF1bHRTb2NrZXRGYWN0b3J5LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9EZWZhdWx0U29ja2V0RmFjdG9yeS5qYXZhCmluZGV4IGVhZDk2NTEuLjhhYTgyZDkgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L0RlZmF1bHRTb2NrZXRGYWN0b3J5LmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvRGVmYXVsdFNvY2tldEZhY3RvcnkuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogLyoqCiAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBjbGFzcyBEZWZhdWx0U29ja2V0RmFjdG9yeSBleHRlbmRzIFNvY2tldEZhY3RvcnkgewogCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9TZXJ2ZXJTb2NrZXRGYWN0b3J5LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9TZXJ2ZXJTb2NrZXRGYWN0b3J5LmphdmEKaW5kZXggYzJiOGJmZC4uMjhhNzlmNiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvU2VydmVyU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L1NlcnZlclNvY2tldEZhY3RvcnkuamF2YQpAQCAtMjgsMTUgKzI4LDI5IEBACiBpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGRlZmluZXMgbWV0aG9kcyB0byBjcmVhdGUgc2VydmVyIHNvY2tldHMuIEl0IGNhbiBiZQorICogc3ViY2xhc3NlZCB0byBjcmVhdGUgc3BlY2lmaWMgc2VydmVyIHNvY2tldCB0eXBlcy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlclNvY2tldEZhY3RvcnkgewogICAgIHN0YXRpYyBTZXJ2ZXJTb2NrZXRGYWN0b3J5IGRlZmF1bHRGYWN0b3J5OworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNlcnZlclNvY2tldEZhY3Rvcnl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgewogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgc2VydmVyIHNvY2tldCBmYWN0b3J5IG9mIHRoZSBzeXN0ZW0gd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAgICAgKiBjcmVhdGUgbmV3IHNlcnZlciBzb2NrZXRzIHdpdGhvdXQgY3JlYXRpbmcgYSBzdWJjbGFzcyBvZiB0aGlzIGZhY3RvcnkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3lzdGVtIGRlZmF1bHQgc2VydmVyIHNvY2tldCBmYWN0b3J5LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFNlcnZlclNvY2tldEZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKICAgICAgICAgaWYgKGRlZmF1bHRGYWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBkZWZhdWx0RmFjdG9yeSA9IG5ldyBEZWZhdWx0U2VydmVyU29ja2V0RmFjdG9yeSgpOwpAQCAtNDQsMTcgKzU4LDY2IEBACiAgICAgICAgIHJldHVybiBkZWZhdWx0RmFjdG9yeTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcnZlciBzb2NrZXQgd2hpY2ggaXMgbm90IGJvdW5kIHRvIGFueSBsb2NhbCBhZGRyZXNzLiBUaGlzCisgICAgICogbWV0aG9kIGhhcyB0byBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3Mgb3RoZXJ3aXNlIGEge0Bjb2RlCisgICAgICogU29ja2V0RXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB1bmJvdW5kIHNlcnZlciBzb2NrZXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyBhIG5ldyBzZXJ2ZXIgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBTZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZm9sbG93IFJJJ3MgYmVoYXZpb3IgCiAgICAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oIlVuYm91bmQgc2VydmVyIHNvY2tldHMgbm90IGltcGxlbWVudGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgc29ja2V0IHdoaWNoIGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBwb3J0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB3aGljaCB0aGUgY3JlYXRlZCBzb2NrZXQgaGFzIHRvIGxpc3Rlbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGJvdW5kIHNlcnZlciBzb2NrZXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyBhIG5ldyBzZXJ2ZXIgc29ja2V0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KGludCBwb3J0KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgc29ja2V0IHdoaWNoIGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBwb3J0IGFuZAorICAgICAqIGNvbmZpZ3VyZXMgaXRzIG1heGltdW0gb2YgcXVldWVkIGNvbm5lY3Rpb25zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvbiB3aGljaCB0aGUgY3JlYXRlZCBzb2NrZXQgaGFzIHRvIGxpc3Rlbi4KKyAgICAgKiBAcGFyYW0gYmFja2xvZworICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gb2YgcXVldWVkIGNvbm5lY3Rpb25zLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgYm91bmQgc2VydmVyIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIGEgbmV3IHNlcnZlciBzb2NrZXQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNlcnZlclNvY2tldCBjcmVhdGVTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBiYWNrbG9nKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgc29ja2V0IHdoaWNoIGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBhZGRyZXNzIG9uIHRoZQorICAgICAqIHNwZWNpZmllZCBwb3J0IGFuZCBjb25maWd1cmVzIGl0cyBtYXhpbXVtIG9mIHF1ZXVlZCBjb25uZWN0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb24gd2hpY2ggdGhlIGNyZWF0ZWQgc29ja2V0IGhhcyB0byBsaXN0ZW4uCisgICAgICogQHBhcmFtIGJhY2tsb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG9mIHF1ZXVlZCBjb25uZWN0aW9ucy4KKyAgICAgKiBAcGFyYW0gaUFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSB3aGljaCBpcyB1c2VkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgY3JlYXRlZCBzb2NrZXQuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBib3VuZCBzZXJ2ZXIgc29ja2V0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgYSBuZXcgc2VydmVyIHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGJhY2tsb2csCiAgICAgICAgICAgICBJbmV0QWRkcmVzcyBpQWRkcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9Tb2NrZXRGYWN0b3J5LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9Tb2NrZXRGYWN0b3J5LmphdmEKaW5kZXggMWY4ZmE4Ny4uNmU1MDE3ZSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L1NvY2tldEZhY3RvcnkuamF2YQpAQCAtMjksMTYgKzI5LDMwIEBACiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgZGVmaW5lcyBtZXRob2RzIHRvIGNyZWF0ZSBzb2NrZXRzLiBJdCBjYW4gYmUgc3ViY2xhc3NlZAorICogdG8gY3JlYXRlIHNwZWNpZmljIHNvY2tldCB0eXBlcyB3aXRoIGFkZGl0aW9uYWwgc29ja2V0LWxldmVsIGZ1bmN0aW9uYWxpdHkuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ja2V0RmFjdG9yeSB7CiAKICAgICBzdGF0aWMgU29ja2V0RmFjdG9yeSBkZWZhdWx0RmFjdG9yeTsKICAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTb2NrZXRGYWN0b3J5fSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU29ja2V0RmFjdG9yeSgpIHsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHNvY2tldCBmYWN0b3J5IG9mIHRoZSBzeXN0ZW0gd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlCisgICAgICogbmV3IHNvY2tldHMgd2l0aG91dCBjcmVhdGluZyBhIHN1YmNsYXNzIG9mIHRoaXMgZmFjdG9yeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gZGVmYXVsdCBzb2NrZXQgZmFjdG9yeS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTb2NrZXRGYWN0b3J5IGdldERlZmF1bHQoKSB7CiAgICAgICAgIGlmIChkZWZhdWx0RmFjdG9yeSA9PSBudWxsKSB7CiAgICAgICAgICAgICBkZWZhdWx0RmFjdG9yeSA9IG5ldyBEZWZhdWx0U29ja2V0RmFjdG9yeSgpOwpAQCAtNDYsMjEgKzYwLDEwOSBAQAogICAgICAgICByZXR1cm4gZGVmYXVsdEZhY3Rvcnk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzb2NrZXQgd2hpY2ggaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgcmVtb3RlIGhvc3QuIFRoaXMKKyAgICAgKiBtZXRob2QgaGFzIHRvIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBvdGhlcndpc2UgYSB7QGNvZGUKKyAgICAgKiBTb2NrZXRFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHVuY29ubmVjdGVkIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIGEgbmV3IHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGZvbGxvdyBSSSdzIGJlaGF2aW9yIAogICAgICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJVbmNvbm5lY3RlZCBzb2NrZXRzIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc29ja2V0IHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0aGUgcmVtb3RlIGhvc3Qgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlIHBhcmFtZXRlcnMge0Bjb2RlIGhvc3R9IGFuZCB7QGNvZGUgcG9ydH0uIFRoZSBzb2NrZXQgaXMgYm91bmQgdG8gYW55CisgICAgICogYXZhaWxhYmxlIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQuCisgICAgICogCisgICAgICogQHBhcmFtIGhvc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW1vdGUgaG9zdCBhZGRyZXNzIHRoZSBzb2NrZXQgaGFzIHRvIGJlIGNvbm5lY3RlZCB0by4KKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSByZW1vdGUgaG9zdCBhdCB3aGljaCB0aGUgc29ja2V0IGlzCisgICAgICogICAgICAgICAgICBjb25uZWN0ZWQuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBjb25uZWN0ZWQgc29ja2V0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgYSBuZXcgc29ja2V0LgorICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGhvc3QgaXMgdW5rbm93biBvciB0aGUgSVAgYWRkcmVzcyBjb3VsZCBub3QKKyAgICAgKiAgICAgICAgICAgICBiZSByZXNvbHZlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU29ja2V0IGNyZWF0ZVNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFVua25vd25Ib3N0RXhjZXB0aW9uOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzb2NrZXQgd2hpY2ggaXMgY29ubmVjdGVkIHRvIHRoZSByZW1vdGUgaG9zdCBzcGVjaWZpZWQgYnkKKyAgICAgKiB0aGUgcGFyYW1ldGVycyB7QGNvZGUgaG9zdH0gYW5kIHtAY29kZSBwb3J0fS4gVGhlIHNvY2tldCBpcyBib3VuZCB0byB0aGUKKyAgICAgKiBsb2NhbCBuZXR3b3JrIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgdGhlIEluZXRBZGRyZXNzIHtAY29kZSBsb2NhbEhvc3R9IG9uCisgICAgICogcG9ydCB7QGNvZGUgbG9jYWxQb3J0fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBob3N0IGFkZHJlc3MgdGhlIHNvY2tldCBoYXMgdG8gYmUgY29ubmVjdGVkIHRvLgorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSBob3N0IGF0IHdoaWNoIHRoZSBzb2NrZXQgaXMKKyAgICAgKiAgICAgICAgICAgIGNvbm5lY3RlZC4KKyAgICAgKiBAcGFyYW0gbG9jYWxIb3N0CisgICAgICogICAgICAgICAgICB0aGUgbG9jYWwgaG9zdCBhZGRyZXNzIHRoZSBzb2NrZXQgaXMgYm91bmQgdG8uCisgICAgICogQHBhcmFtIGxvY2FsUG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBsb2NhbCBob3N0IGF0IHdoaWNoIHRoZSBzb2NrZXQgaXMKKyAgICAgKiAgICAgICAgICAgIGJvdW5kLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29ubmVjdGVkIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIGEgbmV3IHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBob3N0IGlzIHVua25vd24gb3IgdGhlIElQIGFkZHJlc3MgY291bGQgbm90CisgICAgICogICAgICAgICAgICAgYmUgcmVzb2x2ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNvY2tldCBjcmVhdGVTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LAogICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWxIb3N0LCBpbnQgbG9jYWxQb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBVbmtub3duSG9zdEV4Y2VwdGlvbjsKIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc29ja2V0IHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0aGUgcmVtb3RlIGhvc3Qgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlIEluZXRBZGRyZXNzIHtAY29kZSBob3N0fS4gVGhlIHNvY2tldCBpcyBib3VuZCB0byBhbnkgYXZhaWxhYmxlIGxvY2FsCisgICAgICogYWRkcmVzcyBhbmQgcG9ydC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIGhvc3QgYWRkcmVzcyB0aGUgc29ja2V0IGhhcyB0byBiZSBjb25uZWN0ZWQgdG8uCisgICAgICogQHBhcmFtIHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciBvZiB0aGUgcmVtb3RlIGhvc3QgYXQgd2hpY2ggdGhlIHNvY2tldCBpcworICAgICAqICAgICAgICAgICAgY29ubmVjdGVkLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29ubmVjdGVkIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIGEgbmV3IHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU29ja2V0IGNyZWF0ZVNvY2tldChJbmV0QWRkcmVzcyBob3N0LCBpbnQgcG9ydCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc29ja2V0IHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0aGUgcmVtb3RlIGhvc3Qgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlIEluZXRBZGRyZXNzIHtAY29kZSBhZGRyZXNzfS4gVGhlIHNvY2tldCBpcyBib3VuZCB0byB0aGUgbG9jYWwgbmV0d29yaworICAgICAqIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgdGhlIEluZXRBZGRyZXNzIHtAY29kZSBsb2NhbEhvc3R9IG9uIHBvcnQge0Bjb2RlCisgICAgICogbG9jYWxQb3J0fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRkcmVzcworICAgICAqICAgICAgICAgICAgdGhlIHJlbW90ZSBob3N0IGFkZHJlc3MgdGhlIHNvY2tldCBoYXMgdG8gYmUgY29ubmVjdGVkIHRvLgorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSBob3N0IGF0IHdoaWNoIHRoZSBzb2NrZXQgaXMKKyAgICAgKiAgICAgICAgICAgIGNvbm5lY3RlZC4KKyAgICAgKiBAcGFyYW0gbG9jYWxBZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWwgaG9zdCBhZGRyZXNzIHRoZSBzb2NrZXQgaXMgYm91bmQgdG8uCisgICAgICogQHBhcmFtIGxvY2FsUG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBsb2NhbCBob3N0IGF0IHdoaWNoIHRoZSBzb2NrZXQgaXMKKyAgICAgKiAgICAgICAgICAgIGJvdW5kLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29ubmVjdGVkIHNvY2tldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIGEgbmV3IHNvY2tldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU29ja2V0IGNyZWF0ZVNvY2tldChJbmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydCwKICAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsQWRkcmVzcywgaW50IGxvY2FsUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvcGFja2FnZS5odG1sIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmE3OTAKLS0tIC9kZXYvbnVsbAorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGZhY3RvcnkgY2xhc3NlcyB0byBjcmVhdGUgc29ja2V0cyBhbmQgc2VydmVyLXNvY2tldHMuIFRoaXMgY2xhc3NlcyBjYW4gYmUgc3ViY2xhc3NlZCB0byBjcmVhdGUgZmFjdG9yaWVzIGZvciBvdGhlciBraW5kcyBvZiBzb2NrZXQgZm9yIGV4YW1wbGUgdGhlIFNTTC1jYXBhYmxlIHNvY2tldHMgZnJvbSB0aGUgcGFja2FnZSBqYXZheC5uZXQuc3NsLgorICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGZhY3RvcnkgY2xhc3NlcyB0byBjcmVhdGUgc29ja2V0cyBhbmQgc2VydmVyLXNvY2tldHMuIFRoaXMgY2xhc3NlcyBjYW4gYmUgc3ViY2xhc3NlZCB0byBjcmVhdGUgZmFjdG9yaWVzIGZvciBvdGhlciBraW5kcyBvZiBzb2NrZXQgZm9yIGV4YW1wbGUgdGhlIFNTTC1jYXBhYmxlIHNvY2tldHMgZnJvbSB0aGUgcGFja2FnZSBqYXZheC5uZXQuc3NsLgorICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0NlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycy5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0NlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycy5qYXZhCmluZGV4IDlhMzcyNzAuLjU5MDM2NjMgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9DZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzLmphdmEKQEAgLTE1LDI3ICsxNSwzNyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKKyAqIENlcnRpZmljYXRpb24gcGF0aCBwYXJhbWV0ZXJzIHRvIHByb3ZpZGUgdG8gY2VydGlmaWNhdGlvbiBwYXRoCisgKiBiYXNlZCB7QGxpbmsgVHJ1c3RNYW5hZ2VyfS4KKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzIGltcGxlbWVudHMgTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzIHsKIAogICAgIHByaXZhdGUgQ2VydFBhdGhQYXJhbWV0ZXJzIHBhcmFtOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzfSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjZXJ0aWZpY2F0aW9uIHBhdGggcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRpb24gcGF0aCBwYXJhbWV0ZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMoQ2VydFBhdGhQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKICAgICAgICAgcGFyYW0gPSAoQ2VydFBhdGhQYXJhbWV0ZXJzKSBwYXJhbWV0ZXJzLmNsb25lKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGNlcnRpZmljYXRpb24gcGF0aCBwYXJhbWV0ZXJzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGggcGFyYW1ldGVycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgQ2VydFBhdGhQYXJhbWV0ZXJzIGdldFBhcmFtZXRlcnMoKSB7CiAgICAgICAgIHJldHVybiAoQ2VydFBhdGhQYXJhbWV0ZXJzKSBwYXJhbS5jbG9uZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9Db250ZXh0SW1wbC5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0NvbnRleHRJbXBsLmphdmEKaW5kZXggNTc4NzI2Ni4uMDk2Y2JiYSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0NvbnRleHRJbXBsLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0NvbnRleHRJbXBsLmphdmEKQEAgLTE1LDE4ICsxNSwxNCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotICogQGF1dGhvciBCb3JpcyBWLiBLdXpuZXRzb3YKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOwogCiAvKioKICAqIFN1cHBvcnQgY2xhc3MgZm9yIHRoaXMgcGFja2FnZS4KLSAqICAKKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIAogY2xhc3MgQ29udGV4dEltcGwgZXh0ZW5kcyBTU0xDb250ZXh0IHsKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9EZWZhdWx0SG9zdG5hbWVWZXJpZmllci5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0RlZmF1bHRIb3N0bmFtZVZlcmlmaWVyLmphdmEKaW5kZXggMzczZTc5Mi4uNjQ2OWM5MyAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0RlZmF1bHRIb3N0bmFtZVZlcmlmaWVyLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0RlZmF1bHRIb3N0bmFtZVZlcmlmaWVyLmphdmEKQEAgLTE1LDIxICsxNSwxNyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIC8qKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXIKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIGNsYXNzIERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyIGltcGxlbWVudHMgSG9zdG5hbWVWZXJpZmllciB7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0SG9zdG5hbWVWZXJpZmllciBhc3N1bWVzIHRoZSBjb25uZWN0aW9uIHNob3VsZCBub3QgYmUgcGVybWl0dGVkCisgICAgICogRGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIgYXNzdW1lcyB0aGUgY29ubmVjdGlvbiBzaG91bGQgbm90IGJlIHBlcm1pdHRlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gaG9zdG5hbWUKICAgICAgKiBAcGFyYW0gc2Vzc2lvbgpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0RlZmF1bHRTU0xDb250ZXh0LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdFNTTENvbnRleHQuamF2YQppbmRleCBjYzAyOWY0Li5kMmFiMmY0IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdFNTTENvbnRleHQuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdFNTTENvbnRleHQuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSAqIEBhdXRob3IgQm9yaXMgVi4gS3V6bmV0c292Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CkBAIC0zNSw3ICszMCw4IEBACiAKIC8qKgogICogU3VwcG9ydCBjbGFzcyBmb3IgdGhpcyBwYWNrYWdlLgotICogIAorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogCiBjbGFzcyBEZWZhdWx0U1NMQ29udGV4dCB7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdFNTTFNlcnZlclNvY2tldEZhY3RvcnkuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9EZWZhdWx0U1NMU2VydmVyU29ja2V0RmFjdG9yeS5qYXZhCmluZGV4IGYzODIwNzIuLmM0MWY2MWEgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9EZWZhdWx0U1NMU2VydmVyU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9EZWZhdWx0U1NMU2VydmVyU29ja2V0RmFjdG9yeS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzAsNiArMjUsNyBAQAogLyoqCiAgKiBEZWZhdWx0IGlub3BlcmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0RmFjdG9yeQogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogY2xhc3MgRGVmYXVsdFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZXh0ZW5kcyBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IHsKIApkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0RlZmF1bHRTU0xTb2NrZXRGYWN0b3J5LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdFNTTFNvY2tldEZhY3RvcnkuamF2YQppbmRleCBiZGE1NzVlLi5mYzRlMzQwIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdFNTTFNvY2tldEZhY3RvcnkuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdFNTTFNvY2tldEZhY3RvcnkuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBCb3JpcyBWLiBLdXpuZXRzb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTMxLDYgKzI2LDcgQEAKIC8qKgogICogRGVmYXVsdCBpbm9wZXJhdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIGNsYXNzIERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5IGV4dGVuZHMgU1NMU29ja2V0RmFjdG9yeSB7CiAgICAgCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRFdmVudC5qYXZhCmluZGV4IGE3ODNhMzAuLjVlYzU2NjYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRFdmVudC5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRFdmVudC5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKQEAgLTI5LDU2ICsyNCwxMzEgQEAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBldmVudCBvYmplY3QgZW5jYXBzdWxhdGluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21wbGV0ZWQgU1NMCisgKiBoYW5kc2hha2Ugb24gYSBTU0wgY29ubmVjdGlvbi4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBIYW5kc2hha2VDb21wbGV0ZWRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IGltcGxlbWVudHMKICAgICAgICAgU2VyaWFsaXphYmxlIHsKIAogICAgIC8qKgotICAgICAqIEBzZXJpYWwKLSAgICAgKiBUaGUgNS4wIHNwZWMuIGRvZXNuJ3QgZGVjbGFyZSB0aGlzIHNlcmlhbFZlcnNpb25VSUQgZmllbGQKLSAgICAgKiBJbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIGl0IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgaGVyZQorICAgICAqIFRoZSA1LjAgc3BlYy4gZG9lc24ndCBkZWNsYXJlIHRoaXMgc2VyaWFsVmVyc2lvblVJRCBmaWVsZCBJbiBvcmRlciB0byBiZQorICAgICAqIGNvbXBhdGlibGUgaXQgaXMgZXhwbGljaXRseSBkZWNsYXJlZCBoZXJlCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzkxNDk2Mzc0NDI1Nzc2OTc3OEw7CiAKICAgICBwcml2YXRlIHRyYW5zaWVudCBTU0xTZXNzaW9uIHNlc3Npb247CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBIYW5kc2hha2VDb21wbGV0ZWRFdmVudH0gd2l0aCB0aGUgc3BlY2lmaWVkIFNTTAorICAgICAqIHNvY2tldCBhbmQgU1NMIHNlc3Npb24uCisgICAgICogCisgICAgICogQHBhcmFtIHNvY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBTU0wgc29ja2V0LgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU1NMIHNlc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50KFNTTFNvY2tldCBzb2NrLCBTU0xTZXNzaW9uIHMpIHsKICAgICAgICAgc3VwZXIoc29jayk7CiAgICAgICAgIHNlc3Npb24gPSBzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNTTCBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFNTTCBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBTU0xTZXNzaW9uIGdldFNlc3Npb24oKSB7CiAgICAgICAgIHJldHVybiBzZXNzaW9uOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNpcGhlciBzdWl0ZSBuZWdvdGlhdGVkIGR1cmluZyB0aGlzIGhhbmRzaGFrZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaXBoZXIgc3VpdGUgbmVnb3RpYXRlZCBkdXJpbmcgdGhpcyBoYW5kc2hha2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDaXBoZXJTdWl0ZSgpIHsKICAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0Q2lwaGVyU3VpdGUoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGxvY2FsIGNlcnRpZmljYXRlcyB1c2VkIGR1cmluZyB0aGUgaGFuZHNoYWtlLiBUaGVzZQorICAgICAqIGNlcnRpZmljYXRlcyB3ZXJlIHNlbnQgdG8gdGhlIHBlZXIuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyB1c2VkIGR1cmluZyB0aGUgaGFuZHNoYWtlIHdpdGgKKyAgICAgKiAgICAgICAgIHRoZSBsb2NhbCBpZGVudGl0eSBjZXJ0aWZpY2F0ZSBmb2xsb3dlZCBieSBDQXMsIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgbm8gY2VydGlmaWNhdGVzIHdlcmUgdXNlZCBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpIHsKICAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0TG9jYWxDZXJ0aWZpY2F0ZXMoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGVzIGlkZW50aWZ5aW5nIHRoZSBwZWVyIGR1cmluZyB0aGUKKyAgICAgKiBoYW5kc2hha2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgaWRlbnRpZnlpbmcgdGhlIHBlZXIgd2l0aCB0aGUgcGVlcidzCisgICAgICogICAgICAgICBpZGVudGl0eSBjZXJ0aWZpY2F0ZSBmb2xsb3dlZCBieSBDQXMuCisgICAgICogQHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpZGVudGl0eSBvZiB0aGUgcGVlciBoYXMgbm90IGJlZW4gdmVyaWZpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIENlcnRpZmljYXRlW10gZ2V0UGVlckNlcnRpZmljYXRlcygpCiAgICAgICAgICAgICB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRQZWVyQ2VydGlmaWNhdGVzKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgaWRlbnRpZnlpbmcgdGhlIHBlZXIuIFRoZSBwZWVyJ3MKKyAgICAgKiBpZGVudGl0eSBjZXJ0aWZpY2F0ZSBpcyBmb2xsb3dlZCBieSB0aGUgdmFsaWRhdGVkIGNlcnRpZmljYXRlIGF1dGhvcml0eQorICAgICAqIGNlcnRpZmljYXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5SZXBsYWNlZCBieTo8L2I+IHtAbGluayAjZ2V0UGVlckNlcnRpZmljYXRlcygpfQorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyBpZGVudGlmeWluZyB0aGUgcGVlcgorICAgICAqIEB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaWRlbnRpdHkgb2YgdGhlIHBlZXIgaGFzIG5vdCBiZWVuIHZlcmlmaWVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBYNTA5Q2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVDaGFpbigpCiAgICAgICAgICAgICB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRQZWVyQ2VydGlmaWNhdGVDaGFpbigpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBQcmluY2lwYWx9IGlkZW50aWZ5aW5nIHRoZSBwZWVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBQcmluY2lwYWx9IGlkZW50aWZ5aW5nIHRoZSBwZWVyLgorICAgICAqIEB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaWRlbnRpdHkgb2YgdGhlIHBlZXIgaGFzIG5vdCBiZWVuIHZlcmlmaWVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFBlZXJQcmluY2lwYWwoKTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFByaW5jaXBhbH0gdXNlZCB0byBpZGVudGlmeSBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUHJpbmNpcGFsfSB1c2VkIHRvIGlkZW50aWZ5IGR1cmluZyB0aGUgaGFuZHNoYWtlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0TG9jYWxQcmluY2lwYWwoKSB7CiAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldExvY2FsUHJpbmNpcGFsKCk7CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNTTCBzb2NrZXQgdGhhdCBwcm9kdWNlZCB0aGlzIGV2ZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFNTTCBzb2NrZXQgdGhhdCBwcm9kdWNlZCB0aGlzIGV2ZW50LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBTU0xTb2NrZXQgZ2V0U29ja2V0KCkgewogICAgICAgICByZXR1cm4gKFNTTFNvY2tldCl0aGlzLnNvdXJjZTsKICAgICB9CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvSGFuZHNoYWtlQ29tcGxldGVkTGlzdGVuZXIuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRMaXN0ZW5lci5qYXZhCmluZGV4IDU1Yjg4OTQuLjlmZmNiYzEgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRMaXN0ZW5lci5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRMaXN0ZW5lci5qYXZhCkBAIC0xNSwyMiArMTUsMjQgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgbGlzdGVuZXIgdG8gYmUgaW1wbGVtZW50ZWQgdG8gcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIG9uIGNvbXBsZXRpb24KKyAqIG9mIFNTTCBoYW5kc2hha2Ugb24gYW4gU1NMIGNvbm5lY3Rpb24uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEhhbmRzaGFrZUNvbXBsZXRlZExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFRoZSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIHdoZW4gYSBTU0wgaGFuZHNoYWtlIGlzIGNvbXBsZXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgY29tcGxldGVkIFNTTCBoYW5kc2hha2UgZXZlbnQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFuZHNoYWtlQ29tcGxldGVkKEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50IGV2ZW50KTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvSG9zdG5hbWVWZXJpZmllci5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0hvc3RuYW1lVmVyaWZpZXIuamF2YQppbmRleCA2MDljODYxLi5mZTc2N2VmIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvSG9zdG5hbWVWZXJpZmllci5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9Ib3N0bmFtZVZlcmlmaWVyLmphdmEKQEAgLTE1LDIxICsxNSwzMSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgdG8gcHJvdmlkZSBob3N0bmFtZSB2ZXJpZmljYXRpb24gZnVuY3Rpb25hbGl0eS4KKyAqIDxwPgorICogVGhpcyBpcyBhbiBleHRlbmRlZCB2ZXJpZmljYXRpb24gb3B0aW9uIHRoYXQgaW1wbGVtZW50ZXJzIGNhbiBwcm92aWRlLiBJdCBpcyB0byBiZSB1c2VkCisgKiBkdXJpbmcgYSBoYW5kc2hha2UgaWYgdGhlIFVSTCdzIGhvc3RuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBwZWVyJ3MKKyAqIGlkZW50aWZpY2F0aW9uIGhvc3RuYW1lLgorICogPC9wPgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBIb3N0bmFtZVZlcmlmaWVyIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogVmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIGhvc3RuYW1lIGlzIGFsbG93ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgU1NMCisgICAgICogc2Vzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9zdG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0bmFtZS4KKyAgICAgKiBAcGFyYW0gc2Vzc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIFNTTCBzZXNzaW9uIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgaG9zdG5hbWUgaXMgYWxsb3dlZCwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShTdHJpbmcgaG9zdG5hbWUsIFNTTFNlc3Npb24gc2Vzc2lvbik7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0h0dHBzVVJMQ29ubmVjdGlvbi5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0h0dHBzVVJMQ29ubmVjdGlvbi5qYXZhCmluZGV4IDVkOTgzYjYuLjBhOTVmYjEgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IdHRwc1VSTENvbm5lY3Rpb24uamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvSHR0cHNVUkxDb25uZWN0aW9uLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQm9yaXMgVi4gS3V6bmV0c292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwpAQCAtMjksOCArMjQsMTAgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGlzIGFic3RyYWN0IHN1YmNsYXNzIG9mIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0gZGVmaW5lcyBtZXRob2RzIGZvcgorICogbWFuYWdpbmcgSFRUUFMgY29ubmVjdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBkZXNjcmlwdGlvbiBnaXZlbiBieSBSRkMgMjgxOC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIdHRwc1VSTENvbm5lY3Rpb24gZXh0ZW5kcyBIdHRwVVJMQ29ubmVjdGlvbiB7CiAKQEAgLTM5LDIzICszNiw3OSBAQAogICAgIHByaXZhdGUgc3RhdGljIFNTTFNvY2tldEZhY3RvcnkgZGVmYXVsdFNTTFNvY2tldEZhY3RvcnkgPSAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeQogICAgICAgICAgICAgLmdldERlZmF1bHQoKTsKIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IG5hbWUgdmVyaWZpZXIgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb24uIEl0IGlzIGluaXRpYWxpemVkIGZyb20KKyAgICAgKiB0aGUgZGVmYXVsdCBob3N0bmFtZSB2ZXJpZmllcgorICAgICAqIHtAbGluayAjc2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIoSG9zdG5hbWVWZXJpZmllcil9IG9yCisgICAgICoge0BsaW5rICNnZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllcigpfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSG9zdG5hbWVWZXJpZmllciBob3N0bmFtZVZlcmlmaWVyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU1NMU29ja2V0RmFjdG9yeSBzb2NrZXRGYWN0b3J5OwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgSHR0cHNVUkxDb25uZWN0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQge0Bjb2RlIFVSTH0uCisgICAgICogCisgICAgICogQHBhcmFtIHVybAorICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBVUkx9IHRvIGNvbm5lY3QgdG8uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIEh0dHBzVVJMQ29ubmVjdGlvbihVUkwgdXJsKSB7CiAgICAgICAgIHN1cGVyKHVybCk7CiAgICAgICAgIGhvc3RuYW1lVmVyaWZpZXIgPSBkZWZhdWx0SG9zdG5hbWVWZXJpZmllcjsKICAgICAgICAgc29ja2V0RmFjdG9yeSA9IGRlZmF1bHRTU0xTb2NrZXRGYWN0b3J5OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNpcGhlciBzdWl0ZSBuZWdvdGlhdGVkIGR1cmluZyB0aGUgU1NMIGhhbmRzaGFrZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaXBoZXIgc3VpdGUgbmVnb3RpYXRlZCBkdXJpbmcgdGhlIFNTTCBoYW5kc2hha2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIHlldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENpcGhlclN1aXRlKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGxvY2FsIGNlcnRpZmljYXRlcyB1c2VkIGR1cmluZyB0aGUgaGFuZHNoYWtlLiBUaGVzZQorICAgICAqIGNlcnRpZmljYXRlcyB3ZXJlIHNlbnQgdG8gdGhlIHBlZXIuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyB1c2VkIGR1cmluZyB0aGUgaGFuZHNoYWtlIHdpdGgKKyAgICAgKiAgICAgICAgIHRoZSBsb2NhbCBpZGVudGl0eSBjZXJ0aWZpY2F0ZSBmb2xsb3dlZCBieSBDQXMsIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgbm8gY2VydGlmaWNhdGVzIHdlcmUgdXNlZCBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgeWV0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgICAKICAgICBwdWJsaWMgYWJzdHJhY3QgQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpOwogCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyBpZGVudGlmeWluZyB0aGUgcGVlciBkdXJpbmcgdGhlCisgICAgICogaGFuZHNoYWtlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGVzIGlkZW50aWZ5aW5nIHRoZSBwZWVyIHdpdGggdGhlIHBlZXIncworICAgICAqICAgICAgICAgaWRlbnRpdHkgY2VydGlmaWNhdGUgZm9sbG93ZWQgYnkgQ0FzLgorICAgICAqIEB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaWRlbnRpdHkgb2YgdGhlIHBlZXIgaGFzIG5vdCBiZWVuIHZlcmlmaWVkLi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG5vIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgeWV0LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLyAgICAKICAgICBwdWJsaWMgYWJzdHJhY3QgQ2VydGlmaWNhdGVbXSBnZXRTZXJ2ZXJDZXJ0aWZpY2F0ZXMoKQogICAgICAgICAgICAgdGhyb3dzIFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFByaW5jaXBhbH0gaWRlbnRpZnlpbmcgdGhlIHBlZXIuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFByaW5jaXBhbH0gaWRlbnRpZnlpbmcgdGhlIHBlZXIuCisgICAgICogQHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpZGVudGl0eSBvZiB0aGUgcGVlciBoYXMgbm90IGJlZW4gdmVyaWZpZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIHlldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFBlZXJQcmluY2lwYWwoKSB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24gewogICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCk7CiAgICAgICAgIGlmIChjZXJ0cyA9PSBudWxsIHx8IGNlcnRzLmxlbmd0aCA9PSAwIHx8IApAQCAtNjYsNiArMTE5LDE1IEBACiAgICAgICAgIHJldHVybiAoKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydHNbMF0pLmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFByaW5jaXBhbH0gdXNlZCB0byBpZGVudGlmeSB0aGUgbG9jYWwgaG9zdCBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUHJpbmNpcGFsfSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBsb2NhbCBob3N0IGR1cmluZyB0aGUgaGFuZHNoYWtlLCBvcgorICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIG5vbmUgd2FzIHVzZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIHlldC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8gICAgCiAgICAgcHVibGljIFByaW5jaXBhbCBnZXRMb2NhbFByaW5jaXBhbCgpIHsKICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0cyA9IGdldExvY2FsQ2VydGlmaWNhdGVzKCk7CiAgICAgICAgIGlmIChjZXJ0cyA9PSBudWxsIHx8IGNlcnRzLmxlbmd0aCA9PSAwCkBAIC03NSw2ICsxMzcsMTUgQEAKICAgICAgICAgcmV0dXJuICgoWDUwOUNlcnRpZmljYXRlKSBjZXJ0c1swXSkuZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IGhvc3RuYW1lIHZlcmlmaWVyIHRvIGJlIHVzZWQgYnkgbmV3IGluc3RhbmNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBkZWZhdWx0IGhvc3RuYW1lIHZlcmlmaWVyCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHZlcmlmaWVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIoSG9zdG5hbWVWZXJpZmllciB2KSB7CiAgICAgICAgIGlmICh2ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhvc3RuYW1lVmVyaWZpZXIgaXMgbnVsbCIpOwpAQCAtODIsMTAgKzE1MywyNSBAQAogICAgICAgICBkZWZhdWx0SG9zdG5hbWVWZXJpZmllciA9IHY7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBob3N0bmFtZSB2ZXJpZmllci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGhvc3RuYW1lIHZlcmlmaWVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSG9zdG5hbWVWZXJpZmllciBnZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllcigpIHsKICAgICAgICAgcmV0dXJuIGRlZmF1bHRIb3N0bmFtZVZlcmlmaWVyOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhvc3RuYW1lIHZlcmlmaWVyIGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgaG9zdG5hbWUgdmVyaWZpZXIgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHZlcmlmaWVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKEhvc3RuYW1lVmVyaWZpZXIgdikgewogICAgICAgICBpZiAodiA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIb3N0bmFtZVZlcmlmaWVyIGlzIG51bGwiKTsKQEAgLTkzLDEwICsxNzksMjUgQEAKICAgICAgICAgaG9zdG5hbWVWZXJpZmllciA9IHY7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaG9zdG5hbWUgdmVyaWZpZXIgdXNlZCBieSB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGhvc3RuYW1lIHZlcmlmaWVyIHVzZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgSG9zdG5hbWVWZXJpZmllciBnZXRIb3N0bmFtZVZlcmlmaWVyKCkgewogICAgICAgICByZXR1cm4gaG9zdG5hbWVWZXJpZmllcjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IFNTTCBzb2NrZXQgZmFjdG9yeSB0byBiZSB1c2VkIGJ5IG5ldyBpbnN0YW5jZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHNmCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGRlZmF1bHQgU1NMIHNvY2tldCBmYWN0b3J5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBzb2NrZXQgZmFjdG9yeSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KFNTTFNvY2tldEZhY3Rvcnkgc2YpIHsKICAgICAgICAgaWYgKHNmID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNTTFNvY2tldEZhY3RvcnkgaXMgbnVsbCIpOwpAQCAtMTA0LDEwICsyMDUsMjUgQEAKICAgICAgICAgZGVmYXVsdFNTTFNvY2tldEZhY3RvcnkgPSBzZjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IFNTTCBzb2NrZXQgZmFjdG9yeSBmb3IgbmV3IGluc3RhbmNlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IFNTTCBzb2NrZXQgZmFjdG9yeSBmb3IgbmV3IGluc3RhbmNlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNTTFNvY2tldEZhY3RvcnkgZ2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkoKSB7CiAgICAgICAgIHJldHVybiBkZWZhdWx0U1NMU29ja2V0RmFjdG9yeTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBTU0wgc29ja2V0IGZhY3RvcnkgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHNmCisgICAgICogICAgICAgICAgICB0aGUgU1NMIHNvY2tldCBmYWN0b3J5IHRvIGJlIHVzZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgc29ja2V0IGZhY3RvcnkgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNTTFNvY2tldEZhY3RvcnkoU1NMU29ja2V0RmFjdG9yeSBzZikgewogICAgICAgICBpZiAoc2YgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU1NMU29ja2V0RmFjdG9yeSBpcyBudWxsIik7CkBAIC0xMTUsOCArMjMxLDE0IEBACiAgICAgICAgIHNvY2tldEZhY3RvcnkgPSBzZjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBTU0wgc29ja2V0IGZhY3RvcnkgdXNlZCBieSB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFNTTCBzb2NrZXQgZmFjdG9yeSB1c2VkIGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFNTTFNvY2tldEZhY3RvcnkgZ2V0U1NMU29ja2V0RmFjdG9yeSgpIHsKICAgICAgICAgcmV0dXJuIHNvY2tldEZhY3Rvcnk7CiAgICAgfQogCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXIuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyLmphdmEKaW5kZXggNmE4YmNhYi4uMDg5MzlmNyAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXIuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlci5qYXZhCkBAIC0xNSwxNiArMTUsMTUgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIGltcGxlbWVudCBpbiBvcmRlciB0byBtYXJrIGEgY2xhc3MgYXMgYSBKU1NFIGtleSBtYW5hZ2VycworICogc28gdGhhdCBrZXkgbWFuYWdlcnMgY2FuIGJlIGVhc2lseSBncm91cGVkLiAKKyAqIFRoZSBrZXkgbWFuYWdlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyB0aGUga2V5cyB1c2VkIHRvCisgKiBhdXRoZW50aWNhdGUgdGhlIGxvY2FsIHNpZGUgdG8gaXRzIHBlZXIsCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEtleU1hbmFnZXIgewogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyRmFjdG9yeS5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5LmphdmEKaW5kZXggOWMwZmRkZC4uYTQ3ZDczNiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5LmphdmEKQEAgLTE1LDEzICsxNSwxMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZTsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKQEAgLTMyLDE0ICsyOSwxMiBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZTsKLQogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgcHVibGljIEFQSSBmb3Ige0Bjb2RlIEtleU1hbmFnZXJGYWN0b3J5fSBpbXBsZW1lbnRhdGlvbnMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBLZXlNYW5hZ2VyRmFjdG9yeSB7CiAgICAgLy8gU3RvcmUgS2V5TWFuYWdlckZhY3Rvcnkgc2VydmljZSBuYW1lCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAiS2V5TWFuYWdlckZhY3RvcnkiOwpAQCAtNjAsOCArNTUsMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbGdvcml0aG07CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlNYW5hZ2VyRmFjdG9yeX0uCisgICAgICogCisgICAgICogQHBhcmFtIGZhY3RvcnlTcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUga2V5IG1hbmFnZW1lbnQgYWxnb3JpdGhtIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEtleU1hbmFnZXJGYWN0b3J5KEtleU1hbmFnZXJGYWN0b3J5U3BpIGZhY3RvcnlTcGksCiAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlciwgU3RyaW5nIGFsZ29yaXRobSkgewpAQCAtNzEsMTggKzczLDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUga2V5IG1hbmFnZW1lbnQgYWxnb3JpdGhtLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGtleSBtYW5hZ2VtZW50IGFsZ29yaXRobS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEtleU1hbmFnZXJGYWN0b3J5fSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkKKyAgICAgKiBtYW5hZ2VtZW50IGFsZ29yaXRobS4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYWxnb3JpdGhtIGlzIG51bGwgKGluc3RlYWQgb2YKLSAgICAgKiBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBrZXkgbWFuYWdlbWVudCBhbGdvcml0aG0uCisgICAgICogQHJldHVybiBhIGtleSBtYW5hZ2VyIGZhY3RvcnkgZm9yIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbm8gaW5zdGFsbGVkIHByb3ZpZGVyIGNhbiBwcm92aWRlIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0gKGluc3RlYWQgb2YKKyAgICAgKiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXlNYW5hZ2VyRmFjdG9yeSBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC05NywxMCArMTA5LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlNYW5hZ2VyRmFjdG9yeX0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQga2V5CisgICAgICogbWFuYWdlbWVudCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbGdvcml0aG0gaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGtleSBtYW5hZ2VtZW50IGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZAorICAgICAqICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gYSBrZXkgbWFuYWdlciBmYWN0b3J5IGZvciB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgdGhlIHJlcXVlc3RlZAorICAgICAqICAgICAgICAgICAgIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9IChpbnN0ZWFkIG9mCisgICAgICogICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5TWFuYWdlckZhY3RvcnkgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKQEAgLTExNiwxMCArMTQyLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBLZXlNYW5hZ2VyRmFjdG9yeX0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQga2V5CisgICAgICogbWFuYWdlbWVudCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbGdvcml0aG0gaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGtleSBtYW5hZ2VtZW50IGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHJldHVybiBhIGtleSBtYW5hZ2VyIGZhY3RvcnkgZm9yIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0gKGluc3RlYWQgb2YKKyAgICAgKiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXlNYW5hZ2VyRmFjdG9yeSBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMTM3LDE2ICsxNzQsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBmb3IgdGhpcyB7QGNvZGUgS2V5TWFuYWdlckZhY3Rvcnl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGZvciB0aGlzIHtAY29kZSBLZXlNYW5hZ2VyRmFjdG9yeX0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IHN0b3JlIGFuZCBwYXNzd29yZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgc3RvcmUgb3Ige0Bjb2RlIG51bGx9IHRvIHVzZSB0aGUgZGVmYXVsdCBrZXkgc3RvcmUuCisgICAgICogQHBhcmFtIHBhc3N3b3JkCisgICAgICogICAgICAgICAgICB0aGUgcGFzc3dvcmQgZm9yIHRoZSBzcGVjaWZpZWQga2V5IHN0b3JlIG9yIHtAY29kZSBudWxsfSBpZiBubworICAgICAqICAgICAgICAgICAga2V5IHN0b3JlIGlzIHByb3ZpZGVkLgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBpbml0aWFsaXppbmcgdGhpcyBrZXkgbWFuYWdlciBmYWN0b3J5IGZhaWxzLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSByZXF1aXJlZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGtleSBjYW5ub3QgYmUgcmVjb3ZlcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoS2V5U3RvcmUga3MsIGNoYXJbXSBwYXNzd29yZCkKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLApAQCAtMTU1LDggKzIwNiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZhY3RvcnkgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3BlYworICAgICAqICAgICAgICAgICAgdGhlIGZhY3RvcnkgcGFyYW1ldGVycy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChNYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMgc3BlYykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKQEAgLTE2NCwxNiArMjIwLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2Yga2V5IG1hbmFnZXJzLCBvbmUgaW5zdGFuY2UgZm9yIGVhY2ggdHlwZSBvZiBrZXkgaW4gdGhlCisgICAgICoga2V5IHN0b3JlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGtleSBtYW5hZ2Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgS2V5TWFuYWdlcltdIGdldEtleU1hbmFnZXJzKCkgewogICAgICAgICByZXR1cm4gc3BpSW1wbC5lbmdpbmVHZXRLZXlNYW5hZ2VycygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQga2V5IG1hbmFnZXIgZmFjdG9yeSBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBhbGdvcml0aG0gbmFtZSBpcyBzcGVjaWZpZWQgYnkgdGhlIHNlY3VyaXR5IHByb3BlcnR5OgorICAgICAqICB7QGNvZGUgJ3NzbC5LZXlNYW5hZ2VyRmFjdG9yeS5hbGdvcml0aG0nfS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlcgpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5U3BpLmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnlTcGkuamF2YQppbmRleCBhZTZhMTBjLi43Y2RjY2Y4IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnlTcGkuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnlTcGkuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKQEAgLTI5LDM2ICsyNCw1OSBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIDxpPlNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlPC9pPiAoU1BJKSBmb3IgdGhlCisgKiB7QGNvZGUgS2V5TWFuYWdlckZhY3Rvcnl9IGNsYXNzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgS2V5TWFuYWdlckZhY3RvcnlTcGkgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgS2V5TWFuYWdlckZhY3RvcnlTcGl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBLZXlNYW5hZ2VyRmFjdG9yeVNwaSgpIHsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgc3RvcmUgYW5kIHBhc3N3b3JkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrcworICAgICAqICAgICAgICAgICAgdGhlIGtleSBzdG9yZSBvciB7QGNvZGUgbnVsbH0gdG8gdXNlIHRoZSBkZWZhdWx0IGtleSBzdG9yZS4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgc3RvcmUgcGFzc3dvcmQuCisgICAgICogQHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGluaXRpYWxpemluZyB0aGlzIGluc3RhbmNlIGZhaWxzLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSByZXF1aXJlZCBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGtleSBjYW5ub3QgYmUgcmVjb3ZlcmVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoS2V5U3RvcmUga3MsIGNoYXJbXSBwYXNzd29yZCkKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZhY3RvcnkgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3BlYworICAgICAqICAgICAgICAgICAgdGhlIGZhY3RvcnkgcGFyYW1ldGVycy4KKyAgICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdChNYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMgc3BlYykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2Yga2V5IG1hbmFnZXJzLCBvbmUgaW5zdGFuY2UgZm9yIGVhY2ggdHlwZSBvZiBrZXkgaW4gdGhlCisgICAgICoga2V5IHN0b3JlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGtleSBtYW5hZ2Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgS2V5TWFuYWdlcltdIGVuZ2luZUdldEtleU1hbmFnZXJzKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleVN0b3JlQnVpbGRlclBhcmFtZXRlcnMuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9LZXlTdG9yZUJ1aWxkZXJQYXJhbWV0ZXJzLmphdmEKaW5kZXggZGM2ZDA1YS4uYjAwMGZkNSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleVN0b3JlQnVpbGRlclBhcmFtZXRlcnMuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvS2V5U3RvcmVCdWlsZGVyUGFyYW1ldGVycy5qYXZhCkBAIC0yMywxMyArMjMsMjMgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAgCisgKiBUaGUgcGFyYW1ldGVycyBmb3Ige0Bjb2RlIEtleU1hbmFnZXJ9cy4gVGhlIHBhcmFtZXRlcnMgYXJlIGEgbGlzdCBvZgorICoge0Bjb2RlIEtleVN0b3JlLkJ1aWxkZXJ9cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBLZXlTdG9yZUJ1aWxkZXJQYXJhbWV0ZXJzIGltcGxlbWVudHMgTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzIHsKIAogICAgIHByaXZhdGUgTGlzdCBrc2J1aWxkZXJzOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgS2V5U3RvcmVCdWlsZGVyUGFyYW1ldGVyc30gd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqIHN0b3JlIGJ1aWxkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1aWxkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgc3RvcmUgYnVpbGRlci4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgS2V5U3RvcmVCdWlsZGVyUGFyYW1ldGVycyhLZXlTdG9yZS5CdWlsZGVyIGJ1aWxkZXIpIHsKICAgICAgICAga3NidWlsZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewpAQCAtMzcsNiArNDcsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEtleVN0b3JlQnVpbGRlclBhcmFtZXRlcnN9IHdpdGggdGhlIHNwZWNpZmllZCBsaXN0CisgICAgICogb2Yge0Bjb2RlIEtleVN0b3JlLkJ1aWxkZXJ9cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2Yga2V5IHN0b3JlIGJ1aWxkZXJzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGxpc3QgaXMgZW1wdHkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIEtleVN0b3JlQnVpbGRlclBhcmFtZXRlcnMoTGlzdCBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQnVpbGRlcnMgbGlzdCBpcyBudWxsIik7CkBAIC00Nyw2ICs2NywxMyBAQAogICAgICAgICBrc2J1aWxkZXJzID0gbmV3IEFycmF5TGlzdChwYXJhbWV0ZXJzKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bm1vZGlmaWFibGUgbGlzdCBvZiB7QGNvZGUgS2V5U3RvcmUuQnVpbGRlcn1zIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgcGFyYW1ldGVycyBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB1bm1vZGlmaWFibGUgbGlzdCBvZiB7QGNvZGUgS2V5U3RvcmUuQnVpbGRlcn1zLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtZXRlcnMoKSB7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGtzYnVpbGRlcnMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9NYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9NYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMuamF2YQppbmRleCA2YzYxMjFhLi44OTA5ZTYyIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL01hbmFnZXJGYWN0b3J5UGFyYW1ldGVycy5qYXZhCkBAIC0xNSwxNiArMTUsMTMgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIG1hcmtlciBpbnRlcmZhY2UgZm9yIGtleSBtYW5hZ2VyIGZhY3RvcnkgcGFyYW1ldGVycy4gSXRzIHB1cnBvc2UgaXMgdG8KKyAqIGdyb3VwIGtleSBtYW5hZ2VyIGZhY3RvcnkgcGFyYW1ldGVycyBvYmplY3RzLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBNYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMgewogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xDb250ZXh0LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMQ29udGV4dC5qYXZhCmluZGV4IDJlZGNmYjAuLjEwZDNhNjAgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xDb250ZXh0LmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTENvbnRleHQuamF2YQpAQCAtMTUsMTEgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsKQEAgLTMzLDggKzI4LDEwIEBACiAKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIHB1YmxpYyBBUEkgZm9yIHNlY3VyZSBzb2NrZXQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLiBJdCBhY3RzIGFzIGZhY3RvcnkKKyAqIGZvciB7QGNvZGUgU1NMU29ja2V0RmFjdG9yeX0ncyBhbmQge0Bjb2RlIFNTTEVuZ2luZX1zLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogCiBwdWJsaWMgY2xhc3MgU1NMQ29udGV4dCB7CkBAIC01Myw5ICs1MCwxNiBAQAogICAgIC8vIFN0b3JldXNlZCBwcm90b2NvbAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb3RvY29sOwogCi0gICAgLyoKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xDb250ZXh0fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dFNwaQorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIGRlbGVnYXRlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwcm90b2NvbAorICAgICAqICAgICAgICAgICAgdGhlIHByb3RvY29sIG5hbWUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNTTENvbnRleHQoU1NMQ29udGV4dFNwaSBjb250ZXh0U3BpLCBQcm92aWRlciBwcm92aWRlciwKICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCkgewpAQCAtNjUsMTAgKzY5LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xDb250ZXh0fSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcHJvdG9jb2wgaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgdG8gY3JlYXRlIGEgY29udGV4dCBmb3IuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGNvZGUgU1NMQ29udGV4dH0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBpbnN0YWxsZWQgcHJvdmlkZXIgY2FuIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCBwcm90b2NvbAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcHJvdG9jb2x9IGlzIHtAY29kZSBudWxsfSAoaW5zdGVhZCBvZgorICAgICAqICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNTTENvbnRleHQgZ2V0SW5zdGFuY2UoU3RyaW5nIHByb3RvY29sKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC04MywxMCArOTQsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNTTENvbnRleHR9IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIHByb3RvY29sIGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwcm90b2NvbCBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIEBwYXJhbSBwcm90b2NvbAorICAgICAqICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCB0byBjcmVhdGUgYSBjb250ZXh0IGZvci4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciB0aGF0IHByb3ZpZGVzIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgU1NMQ29udGV4dH0gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGNhbm5vdCBwcm92aWRlciB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgcHJvdG9jb2wuCisgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgZG9lcyBub3QgZXhpdHMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBwcm90b2NvbH0gaXMge0Bjb2RlIG51bGx9IChpbnN0ZWFkIG9mCisgICAgICogICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1NMQ29udGV4dCBnZXRJbnN0YW5jZShTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBwcm92aWRlcikKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKQEAgLTEwNCwxMCArMTI4LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xDb250ZXh0fSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbCBmcm9tCisgICAgICogdGhlIHNwZWNpZmllZCBwcm92aWRlci4KICAgICAgKiAKLSAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcHJvdG9jb2wgaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgdG8gY3JlYXRlIGEgY29udGV4dCBmb3IKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciB0aGF0IHByb3ZpZGVzIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wuCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgU1NMQ29udGV4dH0gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wuCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGNhbm5vdCBwcm92aWRlIHRoZSByZXF1ZXN0ZWQKKyAgICAgKiAgICAgICAgICAgICBwcm90b2NvbC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHByb3RvY29sfSBpcyB7QGNvZGUgbnVsbH0gKGluc3RlYWQgb2YKKyAgICAgKiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTU0xDb250ZXh0IGdldEluc3RhbmNlKFN0cmluZyBwcm90b2NvbCwgUHJvdmlkZXIgcHJvdmlkZXIpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKQEAgLTEyNCwyNSArMTU5LDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VjdXJlIHNvY2tldCBwcm90b2NvbCBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlY3VyZSBzb2NrZXQgcHJvdG9jb2wgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3RvY29sKCkgewogICAgICAgICByZXR1cm4gcHJvdG9jb2w7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcHJvdmlkZXIgb2YgdGhpcyB7QGNvZGUgU1NMQ29udGV4dH0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgb2YgdGhpcyB7QGNvZGUgU1NMQ29udGV4dH0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIHtAY29kZSBTU0xDb250ZXh0fSBpbnN0YW5jZS4gQWxsIG9mIHRoZSBhcmd1bWVudHMgYXJlCisgICAgICogb3B0aW9uYWwsIGFuZCB0aGUgc2VjdXJpdHkgcHJvdmlkZXJzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIHRoZSByZXF1aXJlZAorICAgICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbmVlZGVkIGFsZ29yaXRobXMuCiAgICAgICogCi0gICAgICogRklYTUU6IGNoZWNrIHdoYXQgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIHdoZW4gcGFyYW1ldGVycyBhcmUgbnVsbAorICAgICAqIEBwYXJhbSBrbQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBzb3VyY2VzIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gdG0KKyAgICAgKiAgICAgICAgICAgIHRoZSB0cnVzdCBkZWNpc2lvbiBzb3VyY2VzIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gc3IKKyAgICAgKiAgICAgICAgICAgIHRoZSByYW5kb21uZXNzIHNvdXJjZSBvciB7QGNvZGUgbnVsbC59CisgICAgICogQHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaW5pdGlhbGl6aW5nIHRoaXMgaW5zdGFuY2UgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wIAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoS2V5TWFuYWdlcltdIGttLCBUcnVzdE1hbmFnZXJbXSB0bSwgU2VjdXJlUmFuZG9tIHNyKQogICAgICAgICAgICAgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gewpAQCAtMTUwLDQ4ICsxOTksNzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgc29ja2V0IGZhY3RvcnkgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBhIHNvY2tldCBmYWN0b3J5IGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTU0xTb2NrZXRGYWN0b3J5IGdldFNvY2tldEZhY3RvcnkoKSB7CiAgICAgICAgIHJldHVybiBzcGlJbXBsLmVuZ2luZUdldFNvY2tldEZhY3RvcnkoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgc2VydmVyIHNvY2tldCBmYWN0b3J5IGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzZXJ2ZXIgc29ja2V0IGZhY3RvcnkgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZ2V0U2VydmVyU29ja2V0RmFjdG9yeSgpIHsKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lR2V0U2VydmVyU29ja2V0RmFjdG9yeSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIFNTTEVuZ2luZX0gaW5zdGFuY2UgZnJvbSB0aGlzIGNvbnRleHQuCisgICAgICogCisgICAgICogQHJldHVybiBhbiB7QGNvZGUgU1NMRW5naW5lfSBpbnN0YW5jZSBmcm9tIHRoaXMgY29udGV4dC4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU1NMRW5naW5lIGNyZWF0ZVNTTEVuZ2luZSgpIHsKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lQ3JlYXRlU1NMRW5naW5lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgU1NMRW5naW5lfSBpbnN0YW5jZSBmcm9tIHRoaXMgY29udGV4dCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBob3N0bmFtZSBhbmQgcG9ydC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGVlckhvc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBob3N0CisgICAgICogQHBhcmFtIHBlZXJQb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydAorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIFNTTEVuZ2luZX0gaW5zdGFuY2UgZnJvbSB0aGlzIGNvbnRleHQuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFNTTEVuZ2luZSBjcmVhdGVTU0xFbmdpbmUoU3RyaW5nIHBlZXJIb3N0LCBpbnQgcGVlclBvcnQpIHsKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lQ3JlYXRlU1NMRW5naW5lKHBlZXJIb3N0LCBwZWVyUG9ydCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgU1NMIHNlc3Npb24gY29udGV4dCB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgc2V0IG9mIFNTTCBzZXNzaW9ucworICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGhhbmRzaGFrZSBvZiBzZXJ2ZXItc2lkZSBTU0wgc29ja2V0cy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBTU0wgc2VydmVyIHNlc3Npb24gY29udGV4dCBmb3IgdGhpcyBjb250ZXh0IG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgdGhlIHVuZGVybHlpbmcgcHJvdmlkZXIgZG9lcyBub3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqICAgICAgICAgdGhlIHtAY29kZSBTU0xTZXNzaW9uQ29udGV4dH0gaW50ZXJmYWNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBTU0xTZXNzaW9uQ29udGV4dCBnZXRTZXJ2ZXJTZXNzaW9uQ29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lR2V0U2VydmVyU2Vzc2lvbkNvbnRleHQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBTU0wgc2Vzc2lvbiBjb250ZXh0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBzZXQgb2YgU1NMIHNlc3Npb25zCisgICAgICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgaGFuZHNoYWtlIG9mIGNsaWVudC1zaWRlIFNTTCBzb2NrZXRzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFNTTCBjbGllbnQgc2Vzc2lvbiBjb250ZXh0IGZvciB0aGlzIGNvbnRleHQgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiB0aGUgdW5kZXJseWluZyBwcm92aWRlciBkb2VzIG5vdCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICogICAgICAgICB0aGUge0Bjb2RlIFNTTFNlc3Npb25Db250ZXh0fSBpbnRlcmZhY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFNTTFNlc3Npb25Db250ZXh0IGdldENsaWVudFNlc3Npb25Db250ZXh0KCkgewogICAgICAgICByZXR1cm4gc3BpSW1wbC5lbmdpbmVHZXRDbGllbnRTZXNzaW9uQ29udGV4dCgpOwpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTENvbnRleHRTcGkuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xDb250ZXh0U3BpLmphdmEKaW5kZXggZmRiZDMzNi4uNmIyYTYwZSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTENvbnRleHRTcGkuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMQ29udGV4dFNwaS5qYXZhCkBAIC0xNSw2OSArMTUsMTA2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CiAKKwogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIDxpPlNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlPC9pPiAoU1BJKSBmb3IgdGhlIHtAY29kZSBTU0xDb250ZXh0fSBjbGFzcy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFNTTENvbnRleHRTcGkgeworCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU1NMQ29udGV4dFNwaX0gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNTTENvbnRleHRTcGkoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCi0gICAgICovCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyB7QGNvZGUgU1NMQ29udGV4dH0gaW5zdGFuY2UuIEFsbCBvZiB0aGUgYXJndW1lbnRzIGFyZQorICAgICAqIG9wdGlvbmFsLCBhbmQgdGhlIHNlY3VyaXR5IHByb3ZpZGVycyB3aWxsIGJlIHNlYXJjaGVkIGZvciB0aGUgcmVxdWlyZWQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG5lZWRlZCBhbGdvcml0aG1zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrbQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBzb3VyY2VzIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gdG0KKyAgICAgKiAgICAgICAgICAgIHRoZSB0cnVzdCBkZWNpc2lvbiBzb3VyY2VzIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gc3IKKyAgICAgKiAgICAgICAgICAgIHRoZSByYW5kb21uZXNzIHNvdXJjZSBvciB7QGNvZGUgbnVsbC59CisgICAgICogQHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaW5pdGlhbGl6aW5nIHRoaXMgaW5zdGFuY2UgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wIAorICAgICAqLyAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KEtleU1hbmFnZXJbXSBrbSwgVHJ1c3RNYW5hZ2VyW10gdG0sCiAgICAgICAgICAgICBTZWN1cmVSYW5kb20gc3IpIHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyBhIHNvY2tldCBmYWN0b3J5IGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzb2NrZXQgZmFjdG9yeSBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU1NMU29ja2V0RmFjdG9yeSBlbmdpbmVHZXRTb2NrZXRGYWN0b3J5KCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgc2VydmVyIHNvY2tldCBmYWN0b3J5IGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBzZXJ2ZXIgc29ja2V0IGZhY3RvcnkgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZW5naW5lR2V0U2VydmVyU29ja2V0RmFjdG9yeSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgU1NMRW5naW5lfSBpbnN0YW5jZSBmcm9tIHRoaXMgY29udGV4dCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBob3N0bmFtZSBhbmQgcG9ydC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9zdAorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGhvc3QKKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQKKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBTU0xFbmdpbmV9IGluc3RhbmNlIGZyb20gdGhpcyBjb250ZXh0LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTU0xFbmdpbmUgZW5naW5lQ3JlYXRlU1NMRW5naW5lKFN0cmluZyBob3N0LCBpbnQgcG9ydCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBTU0xFbmdpbmV9IGluc3RhbmNlIGZyb20gdGhpcyBjb250ZXh0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4ge0Bjb2RlIFNTTEVuZ2luZX0gaW5zdGFuY2UgZnJvbSB0aGlzIGNvbnRleHQuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNTTEVuZ2luZSBlbmdpbmVDcmVhdGVTU0xFbmdpbmUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIFNTTCBzZXNzaW9uIGNvbnRleHQgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHNldCBvZiBTU0wgc2Vzc2lvbnMKKyAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIFNTTCBoYW5kc2hha2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgU1NMIHNlcnZlciBzZXNzaW9uIGNvbnRleHQgZm9yIHRoaXMgY29udGV4dCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSB1bmRlcmx5aW5nIHByb3ZpZGVyIGRvZXMgbm90IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiAgICAgICAgIHRoZSB7QGNvZGUgU1NMU2Vzc2lvbkNvbnRleHR9IGludGVyZmFjZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU1NMU2Vzc2lvbkNvbnRleHQgZW5naW5lR2V0U2VydmVyU2Vzc2lvbkNvbnRleHQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIFNTTCBzZXNzaW9uIGNvbnRleHQgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHNldCBvZiBTU0wgc2Vzc2lvbnMKKyAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIFNTTCBoYW5kc2hha2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgU1NMIGNsaWVudCBzZXNzaW9uIGNvbnRleHQgZm9yIHRoaXMgY29udGV4dCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSB1bmRlcmx5aW5nIHByb3ZpZGVyIGRvZXMgbm90IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiAgICAgICAgIHRoZSB7QGNvZGUgU1NMU2Vzc2lvbkNvbnRleHR9IGludGVyZmFjZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU1NMU2Vzc2lvbkNvbnRleHQgZW5naW5lR2V0Q2xpZW50U2Vzc2lvbkNvbnRleHQoKTsKIApkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEVuZ2luZS5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEVuZ2luZS5qYXZhCmluZGV4IGFmNjM1YzYuLmJlNWQyNjYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmUuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMRW5naW5lLmphdmEKQEAgLTE1LDIxICsxNSwxNyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQotcGFja2FnZSBqYXZheC5uZXQuc3NsOworIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uUmVhZE9ubHlCdWZmZXJFeGNlcHRpb247CiAKIC8qKgorICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHNlY3VyZSBjb21tdW5pY2F0aW9ucyB1c2luZyBTU0wsIFRMUywgb3Igb3RoZXIKKyAqIHByb3RvY29scy4gSXQgaW5jbHVkZXMgdGhlIHNldHVwLCBoYW5kc2hha2UsIGFuZCBlbmNyeXB0L2RlY3J5cHQgZnVuY3Rpb25hbGl0eQorICogbmVlZGVkIHRvIGNyZWF0ZSBhIHNlY3VyZSBjb25uZWN0aW9uLgogICogCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICogCi0gKiAgCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNTTEVuZ2luZSB7CiAgICAgLy8gU3RvcmUgaG9zdCB2YWx1ZQpAQCAtMzksOCArMzUsOSBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IHBvcnQ7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xFbmdpbmV9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTU0xFbmdpbmUoKSB7CiAgICAgICAgIGhvc3QgPSBudWxsOwpAQCAtNDgsOCArNDUsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xFbmdpbmV9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBob3N0IGFuZAorICAgICAqIHBvcnQuCisgICAgICogCisgICAgICogQHBhcmFtIGhvc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBob3N0LgorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBvZiB0aGUgaG9zdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU1NMRW5naW5lKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewogICAgICAgICB0aGlzLmhvc3QgPSBob3N0OwpAQCAtNTcsMTcyICs2MCwzNTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWF0ZXMgYSBoYW5kc2hha2Ugb24gdGhpcyBlbmdpbmUuCisgICAgICogPHA+CisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBub3QgbmVlZGVkIGZvciB0aGUgaW5pdGlhbCBoYW5kc2hha2U6IGl0IHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgYnkge0Bjb2RlIHdyYXB9IG9yIHtAY29kZSB1bndyYXB9IGlmIHRoZSBpbml0aWFsIGhhbmRzaGFrZSBoYXMgbm90CisgICAgICogYmVlbiBzdGFydGVkIHlldC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHRocm93cyBTU0xFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBzdGFydGluZyB0aGUgaGFuZHNoYWtlIGZhaWxzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZ2luZSBkb2VzIG5vdCBoYXZlIGFsbCB0aGUgbmVlZGVkIHNldHRpbmdzIChlLmcuCisgICAgICogICAgICAgICAgICAgY2xpZW50L3NlcnZlciBtb2RlIG5vdCBzZXQpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGJlZ2luSGFuZHNoYWtlKCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIE5vdGlmaWVzIHRoaXMgZW5naW5lIGluc3RhbmNlIHRoYXQgbm8gbW9yZSBpbmJvdW5kIG5ldHdvcmsgZGF0YSB3aWxsIGJlCisgICAgICogc2VudCB0byB0aGlzIGVuZ2luZS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgZW5naW5lIGRpZCBub3QgcmVjZWl2ZSBhIG5lZWRlZCBwcm90b2NvbCBzcGVjaWZpYworICAgICAqICAgICAgICAgICAgIGNsb3NlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGZyb20gdGhlIHBlZXIuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2VJbmJvdW5kKCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIE5vdGlmaWVzIHRoaXMgZW5naW5lIGluc3RhbmNlIHRoYXQgbm8gbW9yZSBvdXRib3VuZCBhcHBsaWNhdGlvbiBkYXRhIHdpbGwKKyAgICAgKiBiZSBzZW50IHRvIHRoaXMgZW5naW5lLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlT3V0Ym91bmQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgYSBkZWxlZ2F0ZSB0YXNrIGZvciB0aGlzIGVuZ2luZSBpbnN0YW5jZS4gU29tZSBlbmdpbmUgb3BlcmF0aW9ucworICAgICAqIG1heSByZXF1aXJlIHRoZSByZXN1bHRzIG9mIGJsb2NraW5nIG9yIGxvbmcgcnVubmluZyBvcGVyYXRpb25zLCBhbmQgdGhlCisgICAgICoge0Bjb2RlIFNTTEVuZ2luZVJlc3VsdH0gaW5zdGFuY2VzIHJldHVybmVkIGJ5IHRoaXMgZW5naW5lIG1heSBpbmRpY2F0ZQorICAgICAqIHRoYXQgYSBkZWxlZ2F0ZWQgdGFzayByZXN1bHQgaXMgbmVlZGVkLiBJbiB0aGlzIGNhc2UgdGhlCisgICAgICoge0BsaW5rIFJ1bm5hYmxlI3J1bigpIHJ1bn0gbWV0aG9kIG9mIHRoZSByZXR1cm5lZCB7QGNvZGUgUnVubmFibGV9CisgICAgICogZGVsZWdhdGVkIHRhc2sgbXVzdCBiZSBjYWxsZWQuCisgICAgICogCisgICAgICogQHJldHVybiBhIGRlbGVnYXRlIHRhc2ssIG9yIHtAY29kZSBudWxsfSBpZiBub25lIGFyZSBhdmFpbGFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFJ1bm5hYmxlIGdldERlbGVnYXRlZFRhc2soKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIFNTTCBjaXBoZXIgc3VpdGUgbmFtZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGlzIGVuZ2luZQorICAgICAqIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFNTTCBjaXBoZXIgc3VpdGUgbmFtZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGlzIGVuZ2luZQorICAgICAqICAgICAgICAgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEVuYWJsZWRDaXBoZXJTdWl0ZXMoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHByb3RvY29sIHZlcnNpb24gbmFtZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGlzIGVuZ2luZQorICAgICAqIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3RvY29sIHZlcnNpb24gbmFtZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGlzIGVuZ2luZQorICAgICAqICAgICAgICAgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEVuYWJsZWRQcm90b2NvbHMoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgd2hldGhlciBuZXcgU1NMIHNlc3Npb25zIG1heSBiZSBlc3RhYmxpc2hlZCBieSB0aGlzIGVuZ2luZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBuZXcgc2Vzc2lvbiBtYXkgYmUgZXN0YWJsaXNoZWQsIHtAY29kZSBmYWxzZX0gaWYKKyAgICAgKiAgICAgICAgIGV4aXN0aW5nIHNlc3Npb25zIG11c3QgYmUgcmV1c2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEVuYWJsZVNlc3Npb25DcmVhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBoYW5kc2hha2Ugb2YgdGhpcyBlbmdpbmUgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBoYW5kc2hha2Ugb2YgdGhpcyBlbmdpbmUgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgZ2V0SGFuZHNoYWtlU3RhdHVzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbmdpbmUgaW5zdGFuY2Ugd2lsbCByZXF1aXJlIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGVuZ2luZSB3aWxsIHJlcXVpcmUgY2xpZW50IGF1dGhlbnRpY2F0aW9uLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBubyBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgbmVlZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldE5lZWRDbGllbnRBdXRoKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwZWVyIGhvc3QuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGVlciBob3N0LCBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSBpcyBhdmFpbGFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQZWVySG9zdCgpIHsKICAgICAgICAgcmV0dXJuIGhvc3Q7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHBlZXIgaG9zdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IG51bWJlciBvZiB0aGUgcGVlciBob3N0LCBvciB7QGNvZGUgLTF9IGlzIG5vbmUgaXMKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBlZXJQb3J0KCkgewogICAgICAgICByZXR1cm4gcG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBTU0wgc2Vzc2lvbiBmb3IgdGhpcyBlbmdpbmUgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgU1NMIHNlc3Npb24gZm9yIHRoaXMgZW5naW5lIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTU0xTZXNzaW9uIGdldFNlc3Npb24oKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIFNTTCBjaXBoZXIgc3VpdGUgbmFtZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZW5naW5lLgorICAgICAqIFRoZXNlIGNpcGhlciBzdWl0ZXMgY2FuIGJlIGVuYWJsZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgI3NldEVuYWJsZWRDaXBoZXJTdWl0ZXMoU3RyaW5nW10pfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBTU0wgY2lwaGVyIHN1aXRlIG5hbWVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGVuZ2luZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCBuYW1lcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmdpbmUuIFRoZXNlCisgICAgICogcHJvdG9jb2xzIGNhbiBiZSBlbmFibGVzIHVzaW5nIHtAbGluayAjc2V0RW5hYmxlZFByb3RvY29scyhTdHJpbmdbXSl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByb3RvY29sIG5hbWVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGVuZ2luZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkUHJvdG9jb2xzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbmdpbmUgaXMgc2V0IHRvIGFjdCBpbiBjbGllbnQgbW9kZSB3aGVuCisgICAgICogaGFuZHNoYWtpbmcuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVuZ2luZSBpcyBzZXQgdG8gZG8gaGFuZHNoYWtpbmcgaW4gY2xpZW50CisgICAgICogICAgICAgICBtb2RlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFVzZUNsaWVudE1vZGUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGVuZ2luZSB3aWxsIHJlcXVlc3QgY2xpZW50IGF1dGhlbnRpY2F0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIHJlcXVlc3RlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFdhbnRDbGllbnRBdXRoKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgbm8gbW9yZSBpbmJvdW5kIGRhdGEgd2lsbCBiZSBhY2NlcHRlZCBieSB0aGlzIGVuZ2luZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBubyBtb3JlIGluYm91bmQgZGF0YSB3aWxsIGJlIGFjY2VwdGVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgIGVuZ2luZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNJbmJvdW5kRG9uZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB3aGV0aGVyIG5vIG1vcmUgb3V0Ym91bmQgZGF0YSB3aWxsIGJlIHByb2R1Y2VkIGJ5IHRoaXMgZW5naW5lLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5vIG1vcmUgb3V0Ym91bmQgZGF0YSB3aWxsIGJlIHByb2R1Y3RlZCBieSB0aGlzCisgICAgICogICAgICAgICBlbmdpbmUsIHtAY29kZSBvdGhlcndpc2V9IGZhbHNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzT3V0Ym91bmREb25lKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBTZXRzIHRoZSBTU0wgY2lwaGVyIHN1aXRlIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgaW4gdGhpcyBlbmdpbmUKKyAgICAgKiBpbnN0YW5jZS4gT25seSBjaXBoZXIgc3VpdGVzIGxpc3RlZCBieSB7QGNvZGUgZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCl9CisgICAgICogYXJlIGFsbG93ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHN1aXRlcworICAgICAqICAgICAgICAgICAgdGhlIFNTTCBjaXBoZXIgc3VpdGUgbmFtZXMgdG8gYmUgZW5hYmxlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNpcGhlciBzdWl0ZXMgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgc3VpdGVzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW5hYmxlZENpcGhlclN1aXRlcyhTdHJpbmdbXSBzdWl0ZXMpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogU2V0cyB0aGUgcHJvdG9jb2wgdmVyc2lvbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGluIHRoaXMgZW5naW5lCisgICAgICogaW5zdGFuY2UuIE9ubHkgcHJvdG9jb2xzIGxpc3RlZCBieSB7QGNvZGUgZ2V0U3VwcG9ydGVkUHJvdG9jb2xzKCl9IGFyZQorICAgICAqIGFsbG93ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3RvY29scworICAgICAqICAgICAgICAgICAgdGhlIHByb3RvY29sIHZlcnNpb24gbmFtZXMgdG8gYmUgZW5hYmxlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBuYW1lcyBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBwcm90b2NvbHN9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFbmFibGVkUHJvdG9jb2xzKFN0cmluZ1tdIHByb3RvY29scyk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBTZXRzIHdoZXRoZXIgbmV3IFNTTCBzZXNzaW9ucyBtYXkgYmUgZXN0YWJsaXNoZWQgYnkgdGhpcyBlbmdpbmUgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGZsYWcKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBuZXcgU1NMIHNlc3Npb25zIG1heSBiZSBlc3RhYmxpc2hlZCwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgZXhpc3RpbmcgU1NMIHNlc3Npb25zIG11c3QgYmUgcmV1c2VkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZVNlc3Npb25DcmVhdGlvbihib29sZWFuIGZsYWcpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgZW5naW5lIG11c3QgcmVxdWlyZSBjbGllbnQgYXV0aGVudGljYXRpb24uIFRoZSBjbGllbnQKKyAgICAgKiBhdXRoZW50aWNhdGlvbiBpcyBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT5hdXRoZW50aWNhdGlvbiByZXF1aXJlZDwvbGk+CisgICAgICogPGxpPmF1dGhlbnRpY2F0aW9uIHJlcXVlc3RlZDwvbGk+CisgICAgICogPGxpPm5vIGF1dGhlbnRpY2F0aW9uIG5lZWRlZDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHNldHRpbmcgb2Yge0BsaW5rICNzZXRXYW50Q2xpZW50QXV0aChib29sZWFuKX0uCisgICAgICogCisgICAgICogQHBhcmFtIG5lZWQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQsCisgICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIG5vIGF1dGhlbnRpY2F0aW9uIGlzIG5lZWRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXROZWVkQ2xpZW50QXV0aChib29sZWFuIG5lZWQpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgZW5naW5lIHNob3VsZCBhY3QgaW4gY2xpZW50IChvciBzZXJ2ZXIpIG1vZGUgd2hlbgorICAgICAqIGhhbmRzaGFraW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtb2RlCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBlbmdpbmUgc2hvdWxkIGFjdCBpbiBjbGllbnQgbW9kZSwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgbm90LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHN0YXJ0aW5nIHRoZSBpbml0aWFsCisgICAgICogICAgICAgICAgICAgaGFuZHNoYWtlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFVzZUNsaWVudE1vZGUoYm9vbGVhbiBtb2RlKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGVuZ2luZSBzaG91bGQgcmVxdWVzdCBjbGllbnQgYXV0aGVudGljYXRpb24uIFRoZSBjbGllbnQKKyAgICAgKiBhdXRoZW50aWNhdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkPC9saT4KKyAgICAgKiA8bGk+YXV0aGVudGljYXRpb24gcmVxdWVzdGVkPC9saT4KKyAgICAgKiA8bGk+bm8gYXV0aGVudGljYXRpb24gbmVlZGVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc2V0dGluZyBvZiB7QGxpbmsgI3NldE5lZWRDbGllbnRBdXRoKGJvb2xlYW4pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2FudAorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiBzaG91bGQgYmUgcmVxdWVzdGVkLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBubyBhdXRoZW50aWNhdGlvbiBpcyBuZWVkZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0V2FudENsaWVudEF1dGgoYm9vbGVhbiB3YW50KTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIERlY29kZXMgdGhlIGluY29taW5nIG5ldHdvcmsgZGF0YSBidWZmZXIgaW50byBhcHBsaWNhdGlvbiBkYXRhIGJ1ZmZlcnMuCisgICAgICogSWYgYSBoYW5kc2hha2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKKyAgICAgKiBzdGFydGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgd2l0aCBpbmNvbWluZyBuZXR3b3JrIGRhdGEKKyAgICAgKiBAcGFyYW0gZHN0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgZm9yIGluY29taW5nIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICAgICBkYXRhLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5IG9mIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgdG8gd2hpY2ggZGF0YQorICAgICAqICAgICAgICAgICAgaXMgdG8gYmUgdHJhbnNmZXJyZWQuCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgdG8gYmUgdXNlZC4gCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9iamVjdCBvZiB0aGlzIG9wZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkYXRhLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBsZW5ndGh9IGlzIGdyZWF0ZXIgdGhhbgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBkc3RzLmxlbmd0aCAtIG9mZnNldH0uCisgICAgICogQHRocm93cyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVycyBpcyByZWFkLW9ubHkuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3JjfSwge0Bjb2RlIGRzdHN9LCBvciBvbmUgb2YgdGhlIGVudHJpZXMgaW4KKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgZHN0c30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZ2luZSBkb2VzIG5vdCBoYXZlIGFsbCB0aGUgbmVlZGVkIHNldHRpbmdzIChlLmcuCisgICAgICogICAgICAgICAgICAgY2xpZW50L3NlcnZlciBtb2RlIG5vdCBzZXQpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTU0xFbmdpbmVSZXN1bHQgdW53cmFwKEJ5dGVCdWZmZXIgc3JjLCBCeXRlQnVmZmVyW10gZHN0cywKICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBTU0xFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBFbmNvZGVzIHRoZSBvdXRnb2luZyBhcHBsaWNhdGlvbiBkYXRhIGJ1ZmZlcnMgaW50byB0aGUgbmV0d29yayBkYXRhCisgICAgICogYnVmZmVyLiBJZiBhIGhhbmRzaGFrZSBoYXMgbm90IGJlZW4gc3RhcnRlZCB5ZXQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZQorICAgICAqIHN0YXJ0ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHNyY3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzb3VyY2UgYnVmZmVycyBvZiBvdXRnb2luZyBhcHBsaWNhdGlvbiBkYXRhLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5IG9mIHNvdXJjZSBidWZmZXJzIGZyb20gd2hpY2ggZGF0YSBpcworICAgICAqICAgICAgICAgICAgdG8gYmUgcmV0cmlldmVkLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzb3VyY2UgYnVmZmVycyB0byBiZSB1c2VkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgZm9yIG5ldHdvcmsgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2JqZWN0IG9mIHRoaXMgb3BlcmF0aW9uLgorICAgICAqIEB0aHJvd3MgU1NMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGRhdGEuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGxlbmd0aH0gaXMgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICAge0Bjb2RlIHNyY3MubGVuZ3RoIC0gb2Zmc2V0fS4KKyAgICAgKiBAdGhyb3dzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyByZWFkb25seS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzcmNzfSwge0Bjb2RlIGRzdH0sIG9yIG9uZSB0aGUgZW50cmllcyBpbgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBzcmNzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW5naW5lIGRvZXMgbm90IGhhdmUgYWxsIHRoZSBuZWVkZWQgc2V0dGluZ3MgKGUuZy4KKyAgICAgKiAgICAgICAgICAgICBjbGllbnQvc2VydmVyIG1vZGUgbm90IHNldCkuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNTTEVuZ2luZVJlc3VsdCB3cmFwKEJ5dGVCdWZmZXJbXSBzcmNzLCBpbnQgb2Zmc2V0LAogICAgICAgICAgICAgaW50IGxlbmd0aCwgQnl0ZUJ1ZmZlciBkc3QpIHRocm93cyBTU0xFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvciBmb2xsb3dzIFJJOgotICAgICAqIGpkayAxLjUgZG9lcyBub3QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcGFyYW1ldGVycyBhcmUgbnVsbAotICAgICAqIGFuZCBkb2VzIG5vdCB0aHJvdyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiBpZiBkc3QgaXMgcmVhZCBvbmx5IGJ5dGUgYnVmZmVyCi0gICAgICogIAorICAgICAqIERlY29kZXMgdGhlIGluY29taW5nIG5ldHdvcmsgZGF0YSBidWZmZXIgaW50byB0aGUgYXBwbGljYXRpb24gZGF0YQorICAgICAqIGJ1ZmZlci4gSWYgYSBoYW5kc2hha2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKKyAgICAgKiBzdGFydGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgd2l0aCBpbmNvbWluZyBuZXR3b3JrIGRhdGEKKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGZvciBpbmNvbWluZyBhcHBsaWNhdGlvbiBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvYmplY3Qgb2YgdGhpcyBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBTU0xFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXJzIGlzIHJlYWQtb25seS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzcmN9IG9yIHtAY29kZSBkc3R9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmdpbmUgZG9lcyBub3QgaGF2ZSBhbGwgdGhlIG5lZWRlZCBzZXR0aW5ncyAoZS5nLgorICAgICAqICAgICAgICAgICAgIGNsaWVudC9zZXJ2ZXIgbW9kZSBub3Qgc2V0KS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMRW5naW5lUmVzdWx0IHVud3JhcChCeXRlQnVmZmVyIHNyYywgQnl0ZUJ1ZmZlciBkc3QpCiAgICAgICAgICAgICB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKQEAgLTIzOSwxMCArNDI4LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogaW1wbGVtZW50YXRpb24gYmVoYXZpb3IgZm9sbG93cyBSSToKLSAgICAgKiBqZGsgMS41IGRvZXMgbm90IHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHNyYyBpcyBudWxsIG9yIGlmCi0gICAgICogZHN0cyBjb250YWlucyBudWxsIGVsZW1lbnRzCi0gICAgICogSXQgZG9lcyBub3QgdGhyb3cgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24gd2hlbiBkc3RzIGNvbnRhaW5zIHJlYWQgb25seSBlbGVtZW50cworICAgICAqIERlY29kZXMgdGhlIGluY29taW5nIG5ldHdvcmsgZGF0YSBidWZmZXIgaW50byB0aGUgYXBwbGljYXRpb24gZGF0YQorICAgICAqIGJ1ZmZlcnMuIElmIGEgaGFuZHNoYWtlIGhhcyBub3QgYmVlbiBzdGFydGVkIHlldCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICogYmUgc3RhcnRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHdpdGggaW5jb21pbmcgbmV0d29yayBkYXRhCisgICAgICogQHBhcmFtIGRzdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBkZXN0aW5hdGlvbiBidWZmZXJzIGZvciBpbmNvbWluZyBhcHBsaWNhdGlvbgorICAgICAqICAgICAgICAgICAgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2JqZWN0IG9mIHRoaXMgb3BlcmF0aW9uLgorICAgICAqIEB0aHJvd3MgU1NMRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGRhdGEuCisgICAgICogQHRocm93cyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVycyBpcyByZWFkLW9ubHkuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3JjfSBvciB7QGNvZGUgZHN0c30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGVuZ2luZSBkb2VzIG5vdCBoYXZlIGFsbCB0aGUgbmVlZGVkIHNldHRpbmdzIChlLmcuCisgICAgICogICAgICAgICAgICAgY2xpZW50L3NlcnZlciBtb2RlIG5vdCBzZXQpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTU0xFbmdpbmVSZXN1bHQgdW53cmFwKEJ5dGVCdWZmZXIgc3JjLCBCeXRlQnVmZmVyW10gZHN0cykKICAgICAgICAgICAgIHRocm93cyBTU0xFeGNlcHRpb24gewpAQCAtMjY1LDEwICs0NzAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvciBmb2xsb3dzIFJJOiBqZGsgMS41IGRvZXMgbm90IHRocm93Ci0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gZHN0IGlzIG51bGwgb3IgaWYgc3JjcyBjb250YWlucyBudWxsCi0gICAgICogZWxlbWVudHMgSXQgZG9lcyBub3QgdGhyb3cgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24gZm9yIHJlYWQgb25seSBkc3QKLSAgICAgKiAgCisgICAgICogRW5jb2RlcyB0aGUgb3V0Z29pbmcgYXBwbGljYXRpb24gZGF0YSBidWZmZXJzIGludG8gdGhlIG5ldHdvcmsgZGF0YQorICAgICAqIGJ1ZmZlci4gSWYgYSBoYW5kc2hha2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKKyAgICAgKiBzdGFydGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzcmNzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc291cmNlIGJ1ZmZlcnMgb2Ygb3V0Z29pbmcgYXBwbGljYXRpb24gZGF0YS4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGZvciBuZXR3b3JrIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9iamVjdCBvZiB0aGlzIG9wZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkYXRhLgorICAgICAqIEB0aHJvd3MgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIHJlYWRvbmx5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNyY3N9IG9yIHtAY29kZSBkc3R9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmdpbmUgZG9lcyBub3QgaGF2ZSBhbGwgdGhlIG5lZWRlZCBzZXR0aW5ncyAoZS5nLgorICAgICAqICAgICAgICAgICAgIGNsaWVudC9zZXJ2ZXIgbW9kZSBub3Qgc2V0KS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMRW5naW5lUmVzdWx0IHdyYXAoQnl0ZUJ1ZmZlcltdIHNyY3MsIEJ5dGVCdWZmZXIgZHN0KQogICAgICAgICAgICAgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CkBAIC0yOTEsMTAgKzUxMSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIGltcGxlbWVudGF0aW9uIGJlaGF2aW9yIGZvbGxvd3MgUkk6Ci0gICAgICogamRrIDEuNSBkb2VzIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwYXJhbWV0ZXJzIGFyZSBudWxsCi0gICAgICogYW5kIGRvZXMgbm90IHRocm93IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uIGlmIGRzdCBpcyByZWFkIG9ubHkgYnl0ZSBidWZmZXIKLSAgICAgKiAgCisgICAgICogRW5jb2RlcyB0aGUgb3V0Z29pbmcgYXBwbGljYXRpb24gZGF0YSBidWZmZXIgaW50byB0aGUgbmV0d29yayBkYXRhCisgICAgICogYnVmZmVyLiBJZiBhIGhhbmRzaGFrZSBoYXMgbm90IGJlZW4gc3RhcnRlZCB5ZXQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZQorICAgICAqIHN0YXJ0ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBidWZmZXJzIG9mIG91dGdvaW5nIGFwcGxpY2F0aW9uIGRhdGEuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgbmV0d29yayBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvYmplY3Qgb2YgdGhpcyBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBTU0xFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyByZWFkb25seS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzcmN9IG9yIHtAY29kZSBkc3R9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmdpbmUgZG9lcyBub3QgaGF2ZSBhbGwgdGhlIG5lZWRlZCBzZXR0aW5ncyAoZS5nLgorICAgICAqICAgICAgICAgICAgIGNsaWVudC9zZXJ2ZXIgbW9kZSBub3Qgc2V0KS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMRW5naW5lUmVzdWx0IHdyYXAoQnl0ZUJ1ZmZlciBzcmMsIEJ5dGVCdWZmZXIgZHN0KQogICAgICAgICAgICAgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CkBAIC0zMDksNCArNTQ0LDQgQEAKIC8vICAgICAgICB9CiAgICAgICAgIHJldHVybiB3cmFwKG5ldyBCeXRlQnVmZmVyW10geyBzcmMgfSwgMCwgMSwgZHN0KTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEVuZ2luZVJlc3VsdC5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEVuZ2luZVJlc3VsdC5qYXZhCmluZGV4IDVjZmJhMWUuLmRjNTU4MzYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVSZXN1bHQuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMRW5naW5lUmVzdWx0LmphdmEKQEAgLTE1LDE2ICsxNSwxMyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgcmVzdWx0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBzdGF0ZSBvZiB0aGUge0Bjb2RlIFNTTEVuZ2luZX0gcHJvZHVjZWQKKyAqIGJ5IHRoZSB7QGNvZGUgd3JhcCgpfSBhbmQge0Bjb2RlIHVud3JhcCgpfSBvcGVyYXRpb25zLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNTTEVuZ2luZVJlc3VsdCB7CiAgICAgCkBAIC00MSw3ICszOCwyMiBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IGJ5dGVzUHJvZHVjZWQ7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNTTEVuZ2luZVJlc3VsdH0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXRlCisgICAgICogdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdGF0dXMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHtAY29kZSBTU0xFbmdpbmV9IG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gaGFuZHNoYWtlU3RhdHVzCisgICAgICogICAgICAgICAgICB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IGhhbmRzaGFrZQorICAgICAqIEBwYXJhbSBieXRlc0NvbnN1bWVkCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJldHJpZXZlZCBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyKHMpLgorICAgICAqIEBwYXJhbSBieXRlc1Byb2R1Y2VkCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIocykuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3RhdHVzfSBvciB7QGNvZGUgaGFuZHNoYWtlU3RhdHVzfSBpcyB7QGNvZGUgbnVsbH0sCisgICAgICogICAgICAgICAgICAgb3IgaWYge0Bjb2RlIGJ5dGVzQ29uc3VtZWR9IG9yIHtAY29kZSBieXRlc1Byb2R1Y2VzfSBhcmUKKyAgICAgKiAgICAgICAgICAgICBuZWdhdGl2ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMRW5naW5lUmVzdWx0KFNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgc3RhdHVzLAogICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBoYW5kc2hha2VTdGF0dXMsIGludCBieXRlc0NvbnN1bWVkLApAQCAtNjUsMzUgKzc3LDUwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHtAY29kZSBTU0xFbmdpbmV9IG9wZXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHtAY29kZSBTU0xFbmdpbmV9IG9wZXJhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RhdHVzIGdldFN0YXR1cygpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgY3VycmVudCBoYW5kc2hha2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IGhhbmRzaGFrZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgSGFuZHNoYWtlU3RhdHVzIGdldEhhbmRzaGFrZVN0YXR1cygpIHsKICAgICAgICAgcmV0dXJuIGhhbmRzaGFrZVN0YXR1czsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlIGJ1ZmZlcihzKS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmV0cmlldmVkIGZyb20gdGhlIHNvdXJjZSBidWZmZXIocykuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBieXRlc0NvbnN1bWVkKCkgewogICAgICAgICByZXR1cm4gYnl0ZXNDb25zdW1lZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyKHMpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyKHMpLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgYnl0ZXNQcm9kdWNlZCgpIHsKICAgICAgICAgcmV0dXJuIGJ5dGVzUHJvZHVjZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNTTEVuZ2luZVJlcG9ydDogU3RhdHVzID0gIik7CkBAIC0xMDgsMjMgKzEzNSw3OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFRoZSB7QGNvZGUgZW51bX0gZGVzY3JpYmluZyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaGFuZHNoYWtlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBlbnVtIEhhbmRzaGFrZVN0YXR1cyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBObyBoYW5kc2hha2UgaW4gcHJvZ3Jlc3MuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIE5PVF9IQU5EU0hBS0lORywKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoYW5kc2hha2UgaXMgZmluaXNoZWQuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIEZJTklTSEVELAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlc3VsdHMgb2Ygb25lIChvciBtb3JlKSBkZWxlZ2F0ZWQgdGFza3MgYXJlIG5lZWRlZCB0byBjb250aW51ZQorICAgICAgICAgKiB0aGUgaGFuZHNoYWtlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBORUVEX1RBU0ssCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZW5naW5lIG11c3Qgc2VuZCBkYXRhIHRvIHRoZSByZW1vdGUgc2lkZSB0byBjb250aW51ZSB0aGUKKyAgICAgICAgICogaGFuZHNoYWtlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBORUVEX1dSQVAsCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZW5naW5lIG5lZWRzIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSByZW1vdGUgc2lkZSB0byBjb250aW51ZSB0aGUKKyAgICAgICAgICogaGFuZHNoYWtlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBORUVEX1VOV1JBUAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmIAorICAgICAqIFRoZSB7QGNvZGUgZW51bX0gZGVzY3JpYmluZyB0aGUgcmVzdWx0IG9mIHRoZSB7QGNvZGUgU1NMRW5naW5lfQorICAgICAqIG9wZXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGVudW0gU3RhdHVzIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIHJlc3VsdCBvZgorICAgICAgICAgKiB0aGUgY3VycmVudCBvcGVyYXRpb24uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgICAgICovCiAgICAgICAgIEJVRkZFUl9PVkVSRkxPVywKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZXJlIHdlcmUgbm90IGVub3VnaCBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHNvdXJjZSBidWZmZXIgdG8KKyAgICAgICAgICogY29tcGxldGUgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBCVUZGRVJfVU5ERVJGTE9XLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9wZXJhdGlvbiBjbG9zZWQgdGhpcyBzaWRlIG9mIHRoZSBjb21tdW5pY2F0aW9uIG9yIHdhcyBhbHJlYWR5CisgICAgICAgICAqIGNsb3NlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAgICAgKi8KICAgICAgICAgQ0xPU0VELAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICAgICAqLwogICAgICAgICBPSwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMRXhjZXB0aW9uLmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMRXhjZXB0aW9uLmphdmEKaW5kZXggODdmNWNhYS4uNDNiYTQ5MyAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbi5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb24uamF2YQpAQCAtMTUsMzcgKzE1LDM4IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFNTTCByZWxhdGVkIGV4Y2VwdGlvbnMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU1NMRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogQHNlcmlhbAotICAgICAqLworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDUxMTAwNjQ2MDY1MDcwODk2N0w7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCByZWFzb24uCisgICAgICogCisgICAgICogQHBhcmFtIHJlYXNvbgorICAgICAqICAgICAgICAgICAgdGhlIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMRXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc3VwZXIocmVhc29uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTU0xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlKTsKQEAgLTUzLDggKzU0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU1NMRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2UKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSA9PSBudWxsID8gbnVsbCA6IGNhdXNlLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEhhbmRzaGFrZUV4Y2VwdGlvbi5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEhhbmRzaGFrZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGExMzdlNDcuLjgxZTQ0ZGMgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xIYW5kc2hha2VFeGNlcHRpb24uamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMSGFuZHNoYWtlRXhjZXB0aW9uLmphdmEKQEAgLTE1LDI2ICsxNSwyNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYSBoYW5kc2hha2UgY291bGQgbm90IGJlIGNvbXBsZXRlZAorICogc3VjY2Vzc2Z1bGx5LgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBleHRlbmRzIFNTTEV4Y2VwdGlvbiB7CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwNDU4ODEzMTUwMTgzMjY4OTBMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU1NMSGFuZHNoYWtlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVhc29uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNTTEhhbmRzaGFrZUV4Y2VwdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHN1cGVyKHJlYXNvbik7CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xLZXlFeGNlcHRpb24uamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xLZXlFeGNlcHRpb24uamF2YQppbmRleCBlMDBhZTBhLi5jYzRiYzg0IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMS2V5RXhjZXB0aW9uLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTEtleUV4Y2VwdGlvbi5qYXZhCkBAIC0xNSwyNCArMTUsMjMgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGludmFsaWQgU1NMIGtleSBpcyBlbmNvdW50ZXJlZC4gIAogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNTTEtleUV4Y2VwdGlvbiBleHRlbmRzIFNTTEV4Y2VwdGlvbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODA3MTY2NDA4MTk0MTkzNzg3NEw7CiAgICAgCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU1NMS2V5RXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVhc29uCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNTTEtleUV4Y2VwdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHN1cGVyKHJlYXNvbik7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24uamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGMxMTI0NTQuLjZlNTczNGEgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbi5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbi5qYXZhCkBAIC0xNSwyNCArMTUsMjUgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIHRoZSBpZGVudGl0eSBvZiBhIHBlZXIgaGFzIG5vdCBiZWVkCisgKiB2ZXJpZmllZC4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBleHRlbmRzIFNTTEV4Y2VwdGlvbiB7CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg5MTk1MTI2NzUwMDA2MDA1NDdMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIHJlYXNvbgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHN1cGVyKHJlYXNvbik7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMUGVybWlzc2lvbi5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFBlcm1pc3Npb24uamF2YQppbmRleCBlZWVhNzFlLi5hZmMxYWJiIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMUGVybWlzc2lvbi5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQZXJtaXNzaW9uLmphdmEKQEAgLTE1LDI3ICsxNSw0OCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIG5ldHdvcmsgcGVybWlzc2lvbi4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyBhcmUgZGVmaW5lZCwgYWxsb3dpbmcgdGhlIHNwZWNpZmllZCBhY3Rpb246CisgKiA8L3A+CisgKiA8ZGw+CisgKiA8ZHQ+IHtAY29kZSAic2V0SG9zdG5hbWVWZXJpZmllciJ9IDwvZHQ+CisgKiA8ZGQ+IHNldHRpbmcgYSBjYWxsYmFjayBvYmplY3QgZm9yIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uIG9mIGEgaG9zdG5hbWUgbWlzbWF0Y2guPC9kZD4gCisgKiA8ZHQ+IHtAY29kZSAiZ2V0U1NMU2Vzc2lvbkNvbnRleHQifSA8L2R0PgorICogPGRkPiBnZXR0aW5nIHRoZSB7QGNvZGUgU1NMU2Vzc2lvbkNvbnRleHR9IG9mIGFuIHtAY29kZSBTU0xTZXNzaW9ufS48L2RkPgorICogPC9kbD4gCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU1NMUGVybWlzc2lvbiBleHRlbmRzIEJhc2ljUGVybWlzc2lvbiB7CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM0NTY4OTgwMjU1MDU4NzY3NzVMOwogICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNTTFBlcm1pc3Npb259IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBTU0xQZXJtaXNzaW9uKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNTTFBlcm1pc3Npb259IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGVybWlzc2lvbiBuYW1lLgorICAgICAqIEBwYXJhbSBhY3Rpb25zCisgICAgICogICAgICAgICAgICBpcyBpZ25vcmVkIGFuZCBzaG91bGQgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBTU0xQZXJtaXNzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgYWN0aW9ucykgewogICAgICAgICBzdXBlcihuYW1lLCBhY3Rpb25zKTsKICAgICB9CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMUHJvdG9jb2xFeGNlcHRpb24uamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDFlYzk4MjcuLmVmNDljZWQgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC0xNSwyNCArMTUsMjQgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGVycm9yIGluIHRoZSBvcGVyYXRpb24gb2YgdGhlIFNTTAorICogcHJvdG9jb2wgaXMgZW5jb3VudGVyZWQuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU1NMUHJvdG9jb2xFeGNlcHRpb24gZXh0ZW5kcyBTU0xFeGNlcHRpb24gewogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU0NDUwNjcwNjM3OTkxMzQ5MjhMOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU1NMUHJvdG9jb2xFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZWFzb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzdXBlcihyZWFzb24pOwpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlcnZlclNvY2tldC5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlcnZlclNvY2tldC5qYXZhCmluZGV4IGIxYjZmN2EuLmRjNDE1NTYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXJ2ZXJTb2NrZXQuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU2VydmVyU29ja2V0LmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQm9yaXMgVi4gS3V6bmV0c292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yNywzOSArMjIsMjM1IEBACiBpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgZXh0ZW5zaW9uIG9mIHtAY29kZSBTZXJ2ZXJTb2NrZXR9IHdoaWNoIHByb3ZpZGVzIHNlY3VyZSBzZXJ2ZXIgc29ja2V0cworICogYmFzZWQgb24gcHJvdG9jb2xzIGxpa2UgU1NMLCBUTFMsIG9yIG90aGVycy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU0xTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBTZXJ2ZXJTb2NrZXQgeworICAgIAorICAgIC8qKgorICAgICAqIE9ubHkgdG8gYmUgdXNlZCBieSBzdWJjbGFzc2VzLgorICAgICAqIDxwPgorICAgICAqIENyZWF0ZXMgYSBUQ1Agc2VydmVyIHNvY2tldCB3aXRoIHRoZSBkZWZhdWx0IGF1dGhlbnRpY2F0aW9uIGNvbnRleHQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBjcmVhdGluZyB0aGUgc29ja2V0IGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBTU0xTZXJ2ZXJTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE9ubHkgdG8gYmUgdXNlZCBieSBzdWJjbGFzc2VzLgorICAgICAqIDxwPgorICAgICAqIENyZWF0ZXMgYSBUQ1Agc2VydmVyIHNvY2tldCBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQuIFRoZSBjb25uZWN0aW9uJ3MgZGVmYXVsdCBiYWNrbG9nIHNpemUgaXMgNTAKKyAgICAgKiBjb25uZWN0aW9ucy4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IHRvIGxpc3RlbiBvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgY3JlYXRpbmcgdGhlIHNvY2tldCBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU1NMU2VydmVyU29ja2V0KGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihwb3J0KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBPbmx5IHRvIGJlIHVzZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBDcmVhdGVzIGEgVENQIHNlcnZlciBzb2NrZXQgb24gdGhlIHNwZWNpZmllZCBwb3J0IHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBiYWNrbG9nIGFuZCB0aGUgZGVmYXVsdCBhdXRoZW50aWNhdGlvbiBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCB0byBsaXN0ZW4gb24uCisgICAgICogQHBhcmFtIGJhY2tsb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9ucyB0byBxdWV1ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgY3JlYXRpbmcgdGhlIHNvY2tldCBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgYmFja2xvZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIocG9ydCwgYmFja2xvZyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogT25seSB0byBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMuCisgICAgICogPHA+CisgICAgICogQ3JlYXRlcyBhIFRDUCBzZXJ2ZXIgc29ja2V0IG9uIHRoZSBzcGVjaWZpZWQgcG9ydCwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGJhY2tsb2csIGxpc3RlbmluZyBvbiB0aGUgc3BlY2lmaWVkIGludGVyZmFjZSwgYW5kIHVzaW5nIHRoZSBkZWZhdWx0CisgICAgICogYXV0aGVudGljYXRpb24gY29udGV4dC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IHRoZSBsaXN0ZW4gb24uCisgICAgICogQHBhcmFtIGJhY2tsb2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9ucyB0byBxdWV1ZS4KKyAgICAgKiBAcGFyYW0gYWRkcmVzcworICAgICAqICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSB0byBhY2NlcHQgY29ubmVjdGlvbnMgb24uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGNyZWF0aW5nIHRoZSBzb2NrZXQgZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGJhY2tsb2csIEluZXRBZGRyZXNzIGFkZHJlc3MpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihwb3J0LCBiYWNrbG9nLCBhZGRyZXNzKTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVuYWJsZWQgY2lwaGVyIHN1aXRlcyB0byBiZSB1c2VkIGZvciBuZXcKKyAgICAgKiBjb25uZWN0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZW5hYmxlZCBjaXBoZXIgc3VpdGVzIHRvIGJlIHVzZWQgZm9yIG5ldworICAgICAqICAgICAgICAgY29ubmVjdGlvbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEVuYWJsZWRDaXBoZXJTdWl0ZXMoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWVzIG9mIHRoZSBjaXBoZXIgc3VpdGVzIHRvIGJlIGVuYWJsZWQgZm9yIG5ldyBjb25uZWN0aW9ucy4KKyAgICAgKiBPbmx5IGNpcGhlciBzdWl0ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKX0gYXJlCisgICAgICogYWxsb3dlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3VpdGVzCisgICAgICogICAgICAgICAgICB0aGUgbmFtZXMgb2YgdGhlIHRvIGJlIGVuYWJsZWQgY2lwaGVyIHN1aXRlcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgY2lwaGVyIHN1aXRlIG5hbWVzIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW5hYmxlZENpcGhlclN1aXRlcyhTdHJpbmdbXSBzdWl0ZXMpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHN1cHBvcnRlZCBjaXBoZXIgc3VpdGVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29scy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29scy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkUHJvdG9jb2xzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZW5hYmxlZCBwcm90b2NvbHMgdG8gYmUgdXNlZCBmb3IgbmV3CisgICAgICogY29ubmVjdGlvbnMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGVuYWJsZWQgcHJvdG9jb2xzIHRvIGJlIHVzZWQgZm9yIG5ldworICAgICAqICAgICAgICAgY29ubmVjdGlvbnMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEVuYWJsZWRQcm90b2NvbHMoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWVzIG9mIHRoZSBwcm90b2NvbHMgdG8gYmUgZW5hYmxlZCBmb3IgbmV3IGNvbm5lY3Rpb25zLiBPbmx5CisgICAgICogcHJvdG9jb2xzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3VwcG9ydGVkUHJvdG9jb2xzKCl9IGFyZSBhbGxvd2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm90b2NvbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lcyBvZiB0aGUgdG8gYmUgZW5hYmxlZCBwcm90b2NvbHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIHByb3RvY29scyBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMoU3RyaW5nW10gcHJvdG9jb2xzKTsKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBzZXJ2ZXItbW9kZSBjb25uZWN0aW9ucyB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gcmVxdWlyZSBjbGllbnQKKyAgICAgKiBhdXRoZW50aWNhdGlvbi4gVGhlIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkPC9saT4KKyAgICAgKiA8bGk+YXV0aGVudGljYXRpb24gcmVxdWVzdGVkPC9saT4KKyAgICAgKiA8bGk+bm8gYXV0aGVudGljYXRpb24gbmVlZGVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc2V0dGluZyBvZiB7QGxpbmsgI3NldFdhbnRDbGllbnRBdXRoKGJvb2xlYW4pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmVlZAorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgbm8gYXV0aGVudGljYXRpb24gaXMgbmVlZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5lZWRDbGllbnRBdXRoKGJvb2xlYW4gbmVlZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVyLW1vZGUgY29ubmVjdGlvbnMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHJlcXVpcmUKKyAgICAgKiBjbGllbnQgYXV0aGVudGljYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBpZiBubyBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgbmVlZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldE5lZWRDbGllbnRBdXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgc2VydmVyLW1vZGUgY29ubmVjdGlvbnMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHJlcXVlc3QgY2xpZW50CisgICAgICogYXV0aGVudGljYXRpb24uIFRoZSBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqIDxsaT5hdXRoZW50aWNhdGlvbiByZXF1aXJlZDwvbGk+CisgICAgICogPGxpPmF1dGhlbnRpY2F0aW9uIHJlcXVlc3RlZDwvbGk+CisgICAgICogPGxpPm5vIGF1dGhlbnRpY2F0aW9uIG5lZWRlZDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHNldHRpbmcgb2Yge0BsaW5rICNzZXROZWVkQ2xpZW50QXV0aChib29sZWFuKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHdhbnQKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBjbGllbnQgYXV0aGVudGljYXRpb24gc2hvdWxkIGJlIHJlcXVlc3RlZCwKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgbm8gYXV0aGVudGljYXRpb24gaXMgbmVlZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFdhbnRDbGllbnRBdXRoKGJvb2xlYW4gd2FudCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVyLW1vZGUgY29ubmVjdGlvbnMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHJlcXVlc3QKKyAgICAgKiBjbGllbnQgYXV0aGVudGljYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaXMgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHdpbGwgYmUgcmVxdWVzdGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBubyBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgbmVlZGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFdhbnRDbGllbnRBdXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgbmV3IGNvbm5lY3Rpb25zIHNob3VsZCBhY3QgaW4gY2xpZW50IG1vZGUgd2hlbiBoYW5kc2hha2luZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIG5ldyBjb25uZWN0aW9ucyBzaG91bGQgYWN0IGluIGNsaWVudCBtb2RlLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBub3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VXNlQ2xpZW50TW9kZShib29sZWFuIG1vZGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIG5ldyBjb25uZWN0aW9uIHdpbGwgYWN0IGluIGNsaWVudCBtb2RlIHdoZW4gaGFuZHNoYWtpbmcuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV3IGNvbm5lY3Rpb25zIHdpbGwgYWN0IGluIGNsaWVudCBtb2RlIHdoZW4KKyAgICAgKiAgICAgICAgIGhhbmRzaGFraW5nLCB7QGNvZGUgZmFsc2V9IGlmIG5vdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRVc2VDbGllbnRNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgbmV3IFNTTCBzZXNzaW9ucyBtYXkgYmUgZXN0YWJsaXNoZWQgZm9yIG5ldyBjb25uZWN0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmxhZworICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIG5ldyBTU0wgc2Vzc2lvbnMgbWF5IGJlIGVzdGFibGlzaGVkLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBleGlzdGluZyBTU0wgc2Vzc2lvbnMgbXVzdCBiZSByZXVzZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW5hYmxlU2Vzc2lvbkNyZWF0aW9uKGJvb2xlYW4gZmxhZyk7CisgCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIG5ldyBTU0wgc2Vzc2lvbnMgbWF5IGJlIGVzdGFibGlzaGVkIGZvciBuZXcgY29ubmVjdGlvbnMuCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV3IFNTTCBzZXNzaW9ucyBtYXkgYmUgZXN0YWJsaXNoZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIGV4aXN0aW5nIFNTTCBzZXNzaW9ucyBtdXN0IGJlIHJldXNlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU2VydmVyU29ja2V0RmFjdG9yeS5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlcnZlclNvY2tldEZhY3RvcnkuamF2YQppbmRleCAxNDQ1Nzk0Li4xNGY0NjdjIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU2VydmVyU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5LmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQm9yaXMgVi4gS3V6bmV0c292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKQEAgLTI4LDggKzIzLDkgQEAKIGltcG9ydCBqYXZheC5uZXQuU2VydmVyU29ja2V0RmFjdG9yeTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGZhY3RvcnkgZm9yIFNTTCBzZXJ2ZXIgc29ja2V0cy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IGV4dGVuZHMgU2VydmVyU29ja2V0RmFjdG9yeSB7CiAvLyBUT0RPIEVYUE9SVCBDT05UUk9MCkBAIC0zOSwxMCArMzUsMjMgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0TmFtZTsKICAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5fSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU1NMU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHtAY29kZSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5fSBpbnN0YW5jZS4gVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBpcyBkZWZpbmVkIGJ5IHRoZSBzZWN1cml0eSBwcm9wZXJ0eQorICAgICAqICJzc2wuU2VydmVyU29ja2V0RmFjdG9yeS5wcm92aWRlciIuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB7QGNvZGUgU1NMU2VydmVyU29ja2V0RmFjdG9yeX0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJTb2NrZXRGYWN0b3J5IGdldERlZmF1bHQoKSB7CiAgICAgICAgIGlmIChkZWZhdWx0U2VydmVyU29ja2V0RmFjdG9yeSAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNlcnZlclNvY2tldEZhY3Rvcnk7CkBAIC04Miw3ICs5MSwyMSBAQAogICAgICAgICByZXR1cm4gZGVmYXVsdFNlcnZlclNvY2tldEZhY3Rvcnk7CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBjaXBoZXIgc3VpdGVzIHRoYXQgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgY2lwaGVyIHN1aXRlcyB0aGF0IGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RGVmYXVsdENpcGhlclN1aXRlcygpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNpcGhlciBzdWl0ZXMgdGhhdCBjb3VsZCBiZSBlbmFibGVkIGZvciBhbgorICAgICAqIFNTTCBjb25uZWN0aW9uIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNpcGhlciBzdWl0ZXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCk7CiAKIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uLmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU2Vzc2lvbi5qYXZhCmluZGV4IDM2YTI1MjguLjU1M2Q3NGYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlc3Npb24uamF2YQpAQCAtMTUsMTAgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCiAKIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIApAQCAtMjcsMTM2ICsyMywyNDAgQEAKIGltcG9ydCBqYXZheC5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSByZXByZXNlbnRpbmcgYW4gU1NMIHNlc3Npb24uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFNTTFNlc3Npb24gewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIHRoYXQgYW4gYXBwbGljYXRpb24gYnVmZmVyIGNhbiBiZSBmb3IgdGhpcworICAgICAqIHNlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBhcHBsaWNhdGlvbiBidWZmZXIgc2l6ZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEFwcGxpY2F0aW9uQnVmZmVyU2l6ZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2lwaGVyIHN1aXRlIHVzZWQgaW4gdGhpcyBzZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNpcGhlciBzdWl0ZSB1c2VkIGluIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENpcGhlclN1aXRlKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRoaXMgc2Vzc2lvbiB3YXMgY3JlYXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0CisgICAgICogSmFudWFyeSAxc3QgMTk3MCBVVEMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdGltZSB0aGUgc2Vzc2lvbiB3YXMgY3JlYXRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhpcyBzZXNzaW9ucyBpZGVudGlmaWVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBzZXNzaW9ucyBpZGVudGlmaWVyLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0SWQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHRpbWUgdGhpcyBzZXNzaW9uIHdhcyBsYXN0IGFjY2Vzc2VkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiBtaWRuaWdodCBKYW51YXJ5IDFzdCAxOTcwIFVUQy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lIHRoaXMgc2Vzc2lvbiB3YXMgbGFzdCBhY2Nlc3NlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzZWRUaW1lKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyB0aGF0IHdlcmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbG9jYWwKKyAgICAgKiBzaWRlIHRvIHRoZSBwZWVyIGR1cmluZyB0aGUgaGFuZHNoYWtlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGVzLCBvcmRlcmVkIGZyb20gbG9jYWwgY2VydGlmaWNhdGUgdG8KKyAgICAgKiAgICAgICAgIENBJ3MgY2VydGlmaWNhdGVzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldExvY2FsQ2VydGlmaWNhdGVzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmluY2lwYWwgdXNlZCB0byBpZGVudGlmeSB0aGUgbG9jYWwgc2lkZSB0byB0aGUgcGVlciBkdXJpbmcKKyAgICAgKiB0aGUgaGFuZHNoYWtlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByaW5jaXBhbCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBsb2NhbCBzaWRlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0TG9jYWxQcmluY2lwYWwoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSB0aGF0IGEgbmV0d29yayBidWZmZXIgY2FuIGJlIGZvciB0aGlzIHNlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBuZXR3b3JrIGJ1ZmZlciBzaXplLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UGFja2V0QnVmZmVyU2l6ZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgdGhlIHBlZXIgdXNlZCB0byBpZGVudGlmeSBpdHNlbGYgZHVyaW5nCisgICAgICogdGhlIGhhbmRzaGFrZS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBleGlzdHMgZm9yIGNvbXBhdGlsaXR5IHJlYXNvbnMsIHVzZQorICAgICAqIHtAbGluayAjZ2V0UGVlckNlcnRpZmljYXRlcygpfSBpbnN0ZWFkLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcywgb3JkZXJlZCBmcm9tIHRoZSBpZGVudGl0eSBjZXJ0aWZpY2F0ZSB0bworICAgICAqICAgICAgICAgdGhlIENBJ3MgY2VydGlmaWNhdGVzCisgICAgICogQHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpZGVudGl0eSBvZiB0aGUgcGVlciBpcyBub3QgdmVyaWZpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFg1MDlDZXJ0aWZpY2F0ZVtdIGdldFBlZXJDZXJ0aWZpY2F0ZUNoYWluKCkKICAgICAgICAgICAgIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGVzIHRoZSBwZWVyIHVzZWQgdG8gaWRlbnRpZnkgaXRzZWxmIGR1cmluZworICAgICAqIHRoZSBoYW5kc2hha2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMsIG9yZGVyZWQgZnJvbSB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGUgdG8KKyAgICAgKiAgICAgICAgIHRoZSBDQSdzIGNlcnRpZmljYXRlcy4KKyAgICAgKiBAdGhyb3dzIFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGlkZW50aXR5IG9mIHRoZSBwZWVyIGlzIG5vdCB2ZXJpZmllZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVzKCkKICAgICAgICAgICAgIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGhvc3QgbmFtZSBvZiB0aGUgcGVlciBvZiB0aGlzIHNlc3Npb24uIFRoZSBob3N0IG5hbWUgaXMgbm90CisgICAgICogYXV0aGVudGljYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBob3N0IG5hbWUgb2YgdGhlIHBlZXIgb2YgdGhpcyBzZXNzaW9uLCBvciB7QGNvZGUgbnVsbH0gaWYgbm8KKyAgICAgKiAgICAgICAgIGhvc3QgbmFtZSBpcyBhdmFpbGFibGUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQZWVySG9zdCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHBlZXIgb2YgdGhpcyBzZXNzaW9uLiBUaGUgcG9ydCBudW1iZXIgaXMKKyAgICAgKiBub3QgYXV0aGVudGljYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IG51bWJlciBvZiB0aGUgcGVlciwgb2Yge0Bjb2RlIC0xfSBpcyBubyBwb3J0IG51bWJlciBpcworICAgICAqICAgICAgICAgYXZhaWxhYmxlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UGVlclBvcnQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHByaW5jaXBhbCBpZGVudGlmeWluZyB0aGUgcGVlciBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmluY2lwYWwgaWRlbnRpZnlpbmcgdGhlIHBlZXIuCisgICAgICogQHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpZGVudGl0eSBvZiB0aGUgcGVlciBoYXMgbm90IGJlZW4gdmVyaWZpZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFByaW5jaXBhbCBnZXRQZWVyUHJpbmNpcGFsKCkgdGhyb3dzIFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcHJvdG9jb2wgbmFtZSB0aGF0IGlzIHVzZWQgZm9yIGFsbCBjb25uZWN0aW9ucyBpbiB0aGlzCisgICAgICogc2Vzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm90b2NvbCBuYW1lIHRoYXQgaXMgdXNlZCBmb3IgYWxsIGNvbm5lY3Rpb25zIGluIHRoaXMKKyAgICAgKiAgICAgICAgIHNlc3Npb24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGlzIHNlc3Npb24uIElmIGEgY29udGV4dCBpcyBhdmFpbGFibGUgYW5kIGEKKyAgICAgKiBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZCwgdGhlCisgICAgICoge0Bjb2RlIFNTTFBlcm1pc3Npb24oImdldFNTTFNlc3Npb25Db250ZXh0In0gaXMgY2hlY2tlZCB3aXRoIHRoZSBzZWN1cml0eQorICAgICAqIG1hbmFnZXIuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgY29udGV4dCBvZiB0aGlzIHNlc3Npb24gb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGNvbnRleHQgaXMKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU1NMU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBzZXNzaW9uJ3MKKyAgICAgKiBhcHBsaWNhdGlvbiBsYXllciBkYXRhLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYm91bmQgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBuYW1lLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgbmFtZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgYWNjZXNzIGNvbnRyb2wgY29udGV4dC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuYW1lfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgbmFtZSk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHRoZSBvYmplY3QgbmFtZXMgYm91bmQgdG8gdGhpcyBzZXNzaW9uJ3MgYXBwbGljYXRpb24KKyAgICAgKiBsYXllciBkYXRhLi4KKyAgICAgKiA8cD4KKyAgICAgKiBEZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgYWNjZXNzIGNvbnRyb2wgY29udGV4dCwgdGhlIGxpc3Qgb2Ygb2JqZWN0IG5hbWVzCisgICAgICogbWF5IGJlIGRpZmZlcmVudC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB0aGUgb2JqZWN0IG5hbWVzIGJvdW5kIHRvIHRoaXMgc2Vzc2lvbidzIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICBsYXllciBkYXRhLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZU5hbWVzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbnZhbGlkYXRlcyB0aGlzIHNlc3Npb24uCisgICAgICogPHA+CisgICAgICogTm8gbmV3IGNvbm5lY3Rpb25zIGNhbiBiZSBjcmVhdGVkLCBidXQgYW55IGV4aXN0aW5nIGNvbm5lY3Rpb24gcmVtYWlucworICAgICAqIHZhbGlkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2Vzc2lvbiBpcyB2YWxpZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHNlc3Npb24gaXMgdmFsaWQsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEJpbmRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHVuZGVyIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGlzIHNlc3Npb24ncworICAgICAqIGFwcGxpY2F0aW9uIGxheWVyIGRhdGEuCisgICAgICogPHA+CisgICAgICogRm9yIGJpbmRpbmdzIChuZXcgb3IgZXhpc3RpbmcpIGltcGxlbWVudGluZyB0aGUKKyAgICAgKiB7QGNvZGUgU1NMU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcn0gaW50ZXJmYWNlIHRoZSBvYmplY3Qgd2lsbCBiZSBub3RpZmllZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIGJpbmQgdGhlIG9iamVjdCB0by4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYmluZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVpdGhlciB7QGNvZGUgbmFtZX0gb3Ige0Bjb2RlIHZhbHVlfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZW1vdmVzIHRoZSBiaW5kaW5nIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBzZXNzaW9uJ3MgYXBwbGljYXRpb24KKyAgICAgKiBsYXllciBkYXRhLiBJZiB0aGUgZXhpc3RpbmcgYmluZGluZyBpbXBsZW1lbnRzIHRoZQorICAgICAqIHtAY29kZSBTU0xTZXNzaW9uQmluZGluZ0xpc3RlbmVyfSBpbnRlcmZhY2UgdGhlIG9iamVjdCB3aWxsIGJlIG5vdGlmaWVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgYmluZGluZyB0byByZW1vdmUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbmFtZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKFN0cmluZyBuYW1lKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU2Vzc2lvbkJpbmRpbmdFdmVudC5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlc3Npb25CaW5kaW5nRXZlbnQuamF2YQppbmRleCA2ZDMwNTM0Li5kYmRhNzg3IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU2Vzc2lvbkJpbmRpbmdFdmVudC5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uQmluZGluZ0V2ZW50LmphdmEKQEAgLTE1LDM4ICsxNSw1NyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBldmVudCBzZW50IHRvIGFuIHtAY29kZSBTU0xTZXNzaW9uQmluZGluZ0xpc3RlbmVyfSB3aGVuIHRoZSBsaXN0ZW5lcgorICogb2JqZWN0IGlzIGJvdW5kICh7QGxpbmsgU1NMU2Vzc2lvbiNwdXRWYWx1ZShTdHJpbmcsIE9iamVjdCl9KSBvciB1bmJvdW5kIAorICogKHtAbGluayBTU0xTZXNzaW9uI3JlbW92ZVZhbHVlKFN0cmluZyl9KSB0byBhbiB7QGNvZGUgU1NMU2Vzc2lvbn0uCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAotICAgIC8qKgotICAgICAqIEBzZXJpYWwKLSAgICAgKiBUaGUgNS4wIHNwZWMuIGRvZXNuJ3QgZGVjbGFyZSB0aGlzIHNlcmlhbFZlcnNpb25VSUQgZmllbGQKLSAgICAgKiBJbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIGl0IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgaGVyZQotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5ODkxNzI2MzcxMDYzNDVMOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNTTFNlc3Npb25CaW5kaW5nRXZlbnR9IGZvciB0aGUgc3BlY2lmaWVkIHNlc3Npb24KKyAgICAgKiBpbmRpY2F0aW5nIGEgYmluZGluZyBldmVudCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZXNzaW9uCisgICAgICogICAgICAgICAgICB0aGUgc2Vzc2lvbiBmb3Igd2hpY2ggdGhlIGV2ZW50IG9jY3Vycy4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBiZWluZyAodW4pYm91bmQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFNTTFNlc3Npb25CaW5kaW5nRXZlbnQoU1NMU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBzdXBlcihzZXNzaW9uKTsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYmluZGluZyBiZWluZyBhZGRlZCBvciByZW1vdmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGJpbmRpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiB0byB3aGljaCB0aGUgYmluZGluZyBpcyBhZGRlZCBvciBmcm9tIHdoaWNoIGl0IGlzCisgICAgICogcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBiaW5kaW5nIGlzIGFkZGVkIG9yIGZyb20gd2hpY2ggaXQgaXMKKyAgICAgKiAgICAgICAgIHJlbW92ZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFNTTFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKICAgICAgICAgcmV0dXJuIChTU0xTZXNzaW9uKXRoaXMuc291cmNlOwogICAgIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uQmluZGluZ0xpc3RlbmVyLmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci5qYXZhCmluZGV4IDRlMzcyM2QuLjc3ODFjNTMgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uQmluZGluZ0xpc3RlbmVyLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlc3Npb25CaW5kaW5nTGlzdGVuZXIuamF2YQpAQCAtMTUsMzAgKzE1LDMzIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBhbnkgb2JqZWN0IHRoYXQgcmVxdWlyZXMgbm90aWZpY2F0aW9uIHdoZW4KKyAqIGRhdGEgb2JqZWN0cyBhcmUgYm91bmQgdG8gKG9yIHVuYm91bmQgZnJvbSkgYW4ge0Bjb2RlIFNTTFNlc3Npb259LiAKICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgU1NMU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB3aGVuIGEgdmFsdWUgaXMgYm91bmQgdG8gYW4ge0Bjb2RlIFNTTFNlc3Npb259LgorICAgICAqIAorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqICAgICAgICAgICAgdGhlIGV2ZW50IGRhdGEuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdmFsdWVCb3VuZChTU0xTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgd2hlbiBhIHZhbHVlIGlzIHVuYm91bmQgZnJvbSBhbiB7QGNvZGUgU1NMU2Vzc2lvbn0uCisgICAgICogCisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgZGF0YS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB2YWx1ZVVuYm91bmQoU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCk7CiAKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uQ29udGV4dC5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlc3Npb25Db250ZXh0LmphdmEKaW5kZXggZGQzMjQ4Ni4uOWQ4MzFmMyAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlc3Npb25Db250ZXh0LmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNlc3Npb25Db250ZXh0LmphdmEKQEAgLTE1LDUzICsxNSw3NiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBBIGNvbGxlY3Rpb24gb2Yge0Bjb2RlIFNTTFNlc3Npb259cy4gCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFNTTFNlc3Npb25Db250ZXh0IHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgYW4gaXRlcmFibGUgb2YgYWxsIHNlc3Npb24gaWRlbnRpZmllcnMgaW4gdGhpcyBzZXNzaW9uIGNvbnRleHQuCisgICAgICogCisgICAgICogQHJldHVybiBhbiBpdGVyYWJsZSBvZiBhbGwgc2Vzc2lvbiBpZGVudGlmaWVycyBpbiB0aGlzIHNlc3Npb24gY29udGV4dC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SWRzKCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIHNlc3Npb24gaWRlbnRpZmllci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkCisgICAgICogICAgICAgICAgICB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIG9mIHRoZSBzZXNzaW9uIHRvIGxvb2sgdXAuCisgICAgICogQHJldHVybiB0aGUgc2Vzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBzZXNzaW9uIGlkZW50aWZpZXIsIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBzZXNzaW9uIGlkZW50aWZpZXIgZG9lcyBub3QgcmVmZXIgdG8gYSBzZXNzaW9uCisgICAgICogICAgICAgICBpbiB0aGlzIGNvbnRleHQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFNTTFNlc3Npb24gZ2V0U2Vzc2lvbihieXRlW10gc2Vzc2lvbklkKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHNlc3Npb24gY2FjaGUgZm9yIHRoaXMgc2Vzc2lvbiBjb250ZXh0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNlc3Npb24gY2FjaGUgZm9yIHRoaXMgc2Vzc2lvbiBjb250ZXh0LCBvcgorICAgICAqICAgICAgICAge0Bjb2RlIHplcm99IGlmIHVubGltaXRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFNlc3Npb25DYWNoZVNpemUoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHRpbWVvdXQgZm9yIHNlc3Npb25zIGluIHRoaXMgc2Vzc2lvbiBjb250ZXh0LiBTZXNzaW9ucworICAgICAqIGV4Y2VlZGluZyB0aGUgdGltZW91dCBhcmUgaW52YWxpZGF0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdGltZW91dCBpbiBzZWNvbmRzLCBvciB7QGNvZGUgemVyb30gaWYgdW5saW1pdGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblRpbWVvdXQoKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHNlc3Npb24gY2FjaGUgZm9yIHRoaXMgc2Vzc2lvbiBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgc2Vzc2lvbiBjYWNoZSwgb3Ige0Bjb2RlIHplcm99IGZvciB1bmxpbWl0ZWQKKyAgICAgKiAgICAgICAgICAgIGNhY2hlIHNpemUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc2l6ZX0gaXMgbmVnYXRpdmUuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNhY2hlU2l6ZShpbnQgc2l6ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFNldHMgdGhlIHRpbWVvdXQgZm9yIHNlc3Npb25zIGluIHRoaXMgY29udGV4dC4gU2Vzc2lvbnMgZXhjZWVkaW5nIHRoZQorICAgICAqIHRpbWVvdXQgYXJlIGludmFsaWRhdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aGUgdGltZW91dCBpbiBzZWNvbmRzLCBvciB7QGNvZGUgemVyb30gaWYgdW5saW1pdGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNlY29uZHN9IGlzIG5lZ2F0aXZlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25UaW1lb3V0KGludCBzZWNvbmRzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwogCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU29ja2V0LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU29ja2V0LmphdmEKaW5kZXggZjExNDEwYy4uNzMyMDQxNiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNvY2tldC5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTb2NrZXQuamF2YQpAQCAtMTUsNjQgKzE1LDMxNyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIEJvcmlzIFYuIEt1em5ldHNvdgotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBleHRlbnNpb24gb2Yge0Bjb2RlIFNvY2tldH0gcHJvdmlkaW5nIHNlY3VyZSBwcm90b2NvbHMgbGlrZSBTU0wgKFNlY3VyZQorICogU29ja2V0IExheWVyIikgb3IgVExTIChUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkpLiAgCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NMU29ja2V0IGV4dGVuZHMgU29ja2V0IHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBPbmx5IHRvIGJlIHVzZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBDcmVhdGVzIGEgVENQIHNvY2tldC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIFNTTFNvY2tldCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBPbmx5IHRvIGJlIHVzZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBDcmVhdGVzIGEgVENQIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogcG9ydC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGhvc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3N0IG5hbWUgdG8gY29ubmVjdCB0by4KKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGNyZWF0aW5nIHRoZSBzb2NrZXQgZmFpbHMuCisgICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgaG9zdCBpcyBub3Qga25vd24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIFNTTFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIoaG9zdCwgcG9ydCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogT25seSB0byBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMuCisgICAgICogPHA+CisgICAgICogQ3JlYXRlcyBhIFRDUCBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYXQgdGhlIHNwZWNpZmllZAorICAgICAqIHBvcnQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgYWRkcmVzcyB0byBjb25uZWN0IHRvLgorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICB0aGUgcG9ydCBudW1iZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgY3JlYXRpbmcgdGhlIHNvY2tldCBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU1NMU29ja2V0KEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihhZGRyZXNzLCBwb3J0KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBPbmx5IHRvIGJlIHVzZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBDcmVhdGVzIGEgVENQIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogcG9ydCB3aXRoIHRoZSBjbGllbnQgc2lkZSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kIHBvcnQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBob3N0CisgICAgICogICAgICAgICAgICB0aGUgaG9zdCBuYW1lIHRvIGNvbm5lY3QgdG8uCisgICAgICogQHBhcmFtIHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBjb25uZWN0IHRvLgorICAgICAqIEBwYXJhbSBjbGllbnRBZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgY2xpZW50IGFkZHJlc3MgdG8gYmluZCB0bworICAgICAqIEBwYXJhbSBjbGllbnRQb3J0CisgICAgICogICAgICAgICAgICB0aGUgY2xpZW50IHBvcnQgbnVtYmVyIHRvIGJpbmQgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGNyZWF0aW5nIHRoZSBzb2NrZXQgZmFpbHMuCisgICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgaG9zdCBpcyBub3Qga25vd24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHJvdGVjdGVkIFNTTFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIEluZXRBZGRyZXNzIGNsaWVudEFkZHJlc3MsCiAgICAgICAgICAgICBpbnQgY2xpZW50UG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKGhvc3QsIHBvcnQsIGNsaWVudEFkZHJlc3MsIGNsaWVudFBvcnQpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE9ubHkgdG8gYmUgdXNlZCBieSBzdWJjbGFzc2VzLgorICAgICAqIDxwPgorICAgICAqIENyZWF0ZXMgYSBUQ1Agc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzIGF0IHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwb3J0IHdpdGggdGhlIGNsaWVudCBzaWRlIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQgcG9ydC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGFkZHJlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIHRvIGNvbm5lY3QgdG8uCisgICAgICogQHBhcmFtIHBvcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciB0byBjb25uZWN0IHRvLgorICAgICAqIEBwYXJhbSBjbGllbnRBZGRyZXNzCisgICAgICogICAgICAgICAgICB0aGUgY2xpZW50IGFkZHJlc3MgdG8gYmluZCB0by4KKyAgICAgKiBAcGFyYW0gY2xpZW50UG9ydAorICAgICAqICAgICAgICAgICAgdGhlIGNsaWVudCBwb3J0IG51bWJlciB0byBiaW5kIHRvLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBjcmVhdGluZyB0aGUgc29ja2V0IGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBTU0xTb2NrZXQoSW5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQsCiAgICAgICAgICAgICBJbmV0QWRkcmVzcyBjbGllbnRBZGRyZXNzLCBpbnQgY2xpZW50UG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIoYWRkcmVzcywgcG9ydCwgY2xpZW50QWRkcmVzcywgY2xpZW50UG9ydCk7CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgc3VwcG9ydGVkIGNpcGhlciBzdWl0ZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBlbmFibGVkIGNpcGhlciBzdWl0ZXMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGVuYWJsZWQgY2lwaGVyIHN1aXRlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RW5hYmxlZENpcGhlclN1aXRlcygpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWVzIG9mIHRoZSBjaXBoZXIgc3VpdGVzIHRvIGJlIGVuYWJsZWQuCisgICAgICogT25seSBjaXBoZXIgc3VpdGVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCl9IGFyZQorICAgICAqIGFsbG93ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHN1aXRlcworICAgICAqICAgICAgICAgICAgdGhlIG5hbWVzIG9mIHRoZSB0byBiZSBlbmFibGVkIGNpcGhlciBzdWl0ZXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIGNpcGhlciBzdWl0ZSBuYW1lcyBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoU3RyaW5nW10gc3VpdGVzKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29scy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29scy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkUHJvdG9jb2xzKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVuYWJsZWQgcHJvdG9jb2xzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBlbmFibGVkIHByb3RvY29scy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RW5hYmxlZFByb3RvY29scygpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWVzIG9mIHRoZSBwcm90b2NvbHMgdG8gYmUgZW5hYmxlZC4gT25seQorICAgICAqIHByb3RvY29scyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN1cHBvcnRlZFByb3RvY29scygpfSBhcmUgYWxsb3dlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2xzCisgICAgICogICAgICAgICAgICB0aGUgbmFtZXMgb2YgdGhlIHRvIGJlIGVuYWJsZWQgcHJvdG9jb2xzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSBwcm90b2NvbHMgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFbmFibGVkUHJvdG9jb2xzKFN0cmluZ1tdIHByb3RvY29scyk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFNTTFNlc3Npb259IGZvciB0aGlzIGNvbm5lY3Rpb24uIElmIG5lY2Vzc2FyeSwgYQorICAgICAqIGhhbmRzaGFrZSB3aWxsIGJlIGluaXRpYXRlZCwgaW4gd2hpY2ggY2FzZSB0aGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBoYW5kc2hha2UKKyAgICAgKiBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gSWYgdGhlIGhhbmRzaGFrZSBmYWlscywgYW4gaW52YWxpZCBzZXNzaW9uIG9iamVjdAorICAgICAqIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2Vzc2lvbiBvYmplY3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNTTFNlc3Npb24gZ2V0U2Vzc2lvbigpOworICAgIAorICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9uIGNvbXBsZXRpb24gb2YgYQorICAgICAqIGhhbmRzaGFrZSBvbiB0aGlzIGNvbm5lY3Rpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVnaXN0ZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbGlzdGVuZXJ9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRIYW5kc2hha2VDb21wbGV0ZWRMaXN0ZW5lcihIYW5kc2hha2VDb21wbGV0ZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGhhbmRzaGFrZSBjb21wbGV0aW9uIGxpc3RlbmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUhhbmRzaGFrZUNvbXBsZXRlZExpc3RlbmVyKEhhbmRzaGFrZUNvbXBsZXRlZExpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGFydHMgYSBuZXcgU1NMIGhhbmRzaGFrZSBvbiB0aGlzIGNvbm5lY3Rpb24uCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEhhbmRzaGFrZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIHNob3VsZCBhY3QgaW4gY2xpZW50IG1vZGUgd2hlbiBoYW5kc2hha2luZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29ubmVjdGlvbiBzaG91bGQgYWN0IGluIGNsaWVudCBtb2RlLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBub3QuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VXNlQ2xpZW50TW9kZShib29sZWFuIG1vZGUpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gd2lsbCBhY3QgaW4gY2xpZW50IG1vZGUgd2hlbiBoYW5kc2hha2luZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbm5lY3Rpb25zIHdpbGwgYWN0IGluIGNsaWVudCBtb2RlIHdoZW4KKyAgICAgKiAgICAgICAgIGhhbmRzaGFraW5nLCB7QGNvZGUgZmFsc2V9IGlmIG5vdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRVc2VDbGllbnRNb2RlKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgY29ubmVjdGlvbiBzaG91bGQgcmVxdWlyZSBjbGllbnQgYXV0aGVudGljYXRpb24uIFRoaXMKKyAgICAgKiBpcyBvbmx5IHVzZWZ1bCBmb3Igc29ja2V0cyBpbiBzZXJ2ZXIgbW9kZS4gVGhlIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcworICAgICAqIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YXV0aGVudGljYXRpb24gcmVxdWlyZWQ8L2xpPgorICAgICAqIDxsaT5hdXRoZW50aWNhdGlvbiByZXF1ZXN0ZWQ8L2xpPgorICAgICAqIDxsaT5ubyBhdXRoZW50aWNhdGlvbiBuZWVkZWQ8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzZXR0aW5nIG9mIHtAbGluayAjc2V0V2FudENsaWVudEF1dGgoYm9vbGVhbil9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuZWVkCisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLAorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBubyBhdXRoZW50aWNhdGlvbiBpcyBuZWVkZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmVlZENsaWVudEF1dGgoYm9vbGVhbiBuZWVkKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIHJlcXVpcmVzIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KKyAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBzb2NrZXRzIGluIHNlcnZlciBtb2RlLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgaWYgbm8gY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIG5lZWRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXROZWVkQ2xpZW50QXV0aCgpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGNvbm5lY3Rpb25zIHNob3VsZCByZXF1ZXN0IGNsaWVudCBhdXRoZW50aWNhdGlvbi4gVGhpcworICAgICAqIGlzIG9ubHkgdXNlZnVsIGZvciBzb2NrZXRzIGluIHNlcnZlciBtb2RlLiBUaGUgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzCisgICAgICogb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YXV0aGVudGljYXRpb24gcmVxdWlyZWQ8L2xpPgorICAgICAqIDxsaT5hdXRoZW50aWNhdGlvbiByZXF1ZXN0ZWQ8L2xpPgorICAgICAqIDxsaT5ubyBhdXRoZW50aWNhdGlvbiBuZWVkZWQ8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzZXR0aW5nIG9mIHtAbGluayAjc2V0TmVlZENsaWVudEF1dGgoYm9vbGVhbil9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3YW50CisgICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHNob3VsZCBiZSByZXF1ZXN0ZWQsCisgICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIG5vdCBhdXRoZW50aWNhdGlvbiBpcyBuZWVkZWQuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0V2FudENsaWVudEF1dGgoYm9vbGVhbiB3YW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9ucyB3aWxsIHJlcXVlc3QgY2xpZW50IGF1dGhlbnRpY2F0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlzIGNsaWVudCBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIHJlcXVlc3RlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgbm8gY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIG5lZWRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRXYW50Q2xpZW50QXV0aCgpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBuZXcgU1NMIHNlc3Npb25zIG1heSBiZSBjcmVhdGVkIGJ5IHRoaXMgc29ja2V0IG9yIGlmCisgICAgICogZXhpc3Rpbmcgc2Vzc2lvbnMgbXVzdCBiZSByZXVzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGZsYWcKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBuZXcgc2Vzc2lvbnMgbWF5IGJlIGNyZWF0ZWQsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oYm9vbGVhbiBmbGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgbmV3IFNTTCBzZXNzaW9ucyBtYXkgYmUgY3JlYXRlZCBieSB0aGlzIHNvY2tldCBvciBpZgorICAgICAqIGV4aXN0aW5nIHNlc3Npb25zIG11c3QgYmUgcmV1c2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5ldyBzZXNzaW9ucyBtYXkgYmUgY3JlYXRlZCwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEVuYWJsZVNlc3Npb25DcmVhdGlvbigpOwogICAgIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTb2NrZXRGYWN0b3J5LmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMU29ja2V0RmFjdG9yeS5qYXZhCmluZGV4IDM0YTIyMWUuLmNiODIxYzIgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xTb2NrZXRGYWN0b3J5LmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFNvY2tldEZhY3RvcnkuamF2YQpAQCAtMTUsNDAgKzE1LDUyIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgQm9yaXMgVi4gS3V6bmV0c292Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubmV0LlNvY2tldDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKKy8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisvLyBFTkQgYW5kcm9pZC1hZGRlZAogCiBpbXBvcnQgamF2YXgubmV0LlNvY2tldEZhY3Rvcnk7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBhYnN0cmFjdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZSB7QGNvZGUgU1NMU29ja2V0fXMuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NMU29ja2V0RmFjdG9yeSBleHRlbmRzIFNvY2tldEZhY3RvcnkgewotICAgIC8vIEZJWE1FIEVYUE9SVCBDT05UUk9MCiAKICAgICAvLyBUaGUgZGVmYXVsdCBTU0wgc29ja2V0IGZhY3RvcnkKICAgICBwcml2YXRlIHN0YXRpYyBTb2NrZXRGYWN0b3J5IGRlZmF1bHRTb2NrZXRGYWN0b3J5OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHROYW1lOwogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU1NMU29ja2V0RmFjdG9yeX0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIFNTTFNvY2tldEZhY3RvcnkoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB7QGNvZGUgU1NMU29ja2V0RmFjdG9yeX0gaW5zdGFuY2UuIFRoZSBkZWZhdWx0IGlzCisgICAgICogZGVmaW5lZCBieSB0aGUgc2VjdXJpdHkgcHJvcGVydHkge0Bjb2RlICdzc2wuU29ja2V0RmFjdG9yeS5wcm92aWRlcid9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3NsIHNvY2tldCBmYWN0b3J5IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU29ja2V0RmFjdG9yeSBnZXREZWZhdWx0KCkgewogICAgICAgICBpZiAoZGVmYXVsdFNvY2tldEZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICAgICAgbG9nKCJTU0xTb2NrZXRGYWN0b3J5IiwgIlVzaW5nIGZhY3RvcnkgIiArIGRlZmF1bHRTb2NrZXRGYWN0b3J5KTsKKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNvY2tldEZhY3Rvcnk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRlZmF1bHROYW1lID09IG51bGwpIHsKQEAgLTgwLDEzICs5MiwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChkZWZhdWx0U29ja2V0RmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBVc2UgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgIGRlZmF1bHRTb2NrZXRGYWN0b3J5ID0gbmV3IERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KCJObyBTU0xTb2NrZXRGYWN0b3J5IGluc3RhbGxlZCIpOwogICAgICAgICB9Ci0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICBsb2coIlNTTFNvY2tldEZhY3RvcnkiLCAiVXNpbmcgZmFjdG9yeSAiICsgZGVmYXVsdFNvY2tldEZhY3RvcnkpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICByZXR1cm4gZGVmYXVsdFNvY2tldEZhY3Rvcnk7CiAgICAgfQogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyB0YWcsIFN0cmluZyBtc2cpIHsKICAgICAgICAgdHJ5IHsKQEAgLTk3LDExICsxMTIsNDYgQEAKICAgICAgICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZS4KICAgICAgICAgfQogICAgIH0KLSAgICAKKyAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGNpcGhlciBzdWl0ZXMgdGhhdCBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBjaXBoZXIgc3VpdGVzIHRoYXQgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RGVmYXVsdENpcGhlclN1aXRlcygpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGNpcGhlciBzdWl0ZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGFuZCBjb3VsZCBiZQorICAgICAqIGVuYWJsZWQgZm9yIGFuIFNTTCBjb25uZWN0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBjaXBoZXIgc3VpdGVzIHRoYXQgYXJlIHN1cHBvcnRlZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCk7CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBTU0xTb2NrZXR9IG92ZXIgdGhlIHNwZWNpZmllZCBzb2NrZXQgdGhhdCBpcyBjb25uZWN0ZWQKKyAgICAgKiB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYXQgdGhlIHNwZWNpZmllZCBwb3J0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc29ja2V0LgorICAgICAqIEBwYXJhbSBob3N0CisgICAgICogICAgICAgICAgICB0aGUgaG9zdC4KKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgbnVtYmVyLgorICAgICAqIEBwYXJhbSBhdXRvQ2xvc2UKKyAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBzb2NrZXQge0Bjb2RlIHN9IHNob3VsZCBiZSBjbG9zZWQgd2hlbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGNyZWF0ZWQgc29ja2V0IGlzIGNsb3NlZCwge0Bjb2RlIGZhbHNlfSBpZiB0aGUgc29ja2V0CisgICAgICogICAgICAgICAgICB7QGNvZGUgc30gc2hvdWxkIGJlIGxlZnQgb3Blbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVzIHNzbCBzb2NrZXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGNyZWF0aW5nIHRoZSBzb2NrZXQgZmFpbHMuCisgICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBob3N0IGlzIHVua25vd24uCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNvY2tldCBjcmVhdGVTb2NrZXQoU29ja2V0IHMsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwKICAgICAgICAgICAgIGJvb2xlYW4gYXV0b0Nsb3NlKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXIuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXIuamF2YQppbmRleCAxNGI3NWU1Li41ZDhhZmNkIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlci5qYXZhCkBAIC0xNSwxNiArMTUsMTYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIG1hcmtlciBpbnRlcmZhY2UgZm9yIEpTU0UgdHJ1c3QgbWFuYWdlcnMuIFRoZSBwdXJwb3NlIGlzIHRvIGdyb3VwIHRydXN0CisgKiBtYW5hZ2Vycy4gVGhlIHJlc3BvbnNpYmlsaXR5IGEgdHJ1c3QgbWFuYWdlciBpcyB0byBoYW5kbGUgdGhlIHRydXN0IGRhdGEgdXNlZCB0bworICogbWFrZSB0cnVzdCBkZWNpc2lvbnMgZm9yIGRlY2lkaW5nIHdoZXRoZXIgY3JlZGVudGlhbHMgb2YgYSBwZWVyIHNob3VsZCBiZSAKKyAqIGFjY2VwdGVkLAorICogQHNlZSBUcnVzdE1hbmFnZXJGYWN0b3J5CiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFRydXN0TWFuYWdlciB7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnkuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5LmphdmEKaW5kZXggNDM5MTllYi4uNDgwZWIyNiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnkuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwpAQCAtMzQsMTEgKzI5LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZTsKIAogCi0vKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gKiAKLSAqLwogCisvKioKKyAqIFRoZSBmYWN0b3J5IGZvciB7QGNvZGUgVHJ1c3RNYW5hZ2VyfXMgYmFzZWQgb24ge0Bjb2RlIEtleVN0b3JlfSBvciBwcm92aWRlcgorICogc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB7CiAgICAgLy8gU3RvcmUgVHJ1c3RNYW5hZ2VyIHNlcnZpY2UgbmFtZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFID0gIlRydXN0TWFuYWdlckZhY3RvcnkiOwpAQCAtNTksOCArNTYsMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbGdvcml0aG07CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBUcnVzdE1hbmFnZXJGYWN0b3J5fSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmFjdG9yeVNwaQorICAgICAqICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIGRlbGVnYXRlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyCisgICAgICogQHBhcmFtIGFsZ29yaXRobQorICAgICAqICAgICAgICAgICAgdGhlIGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBUcnVzdE1hbmFnZXJGYWN0b3J5KFRydXN0TWFuYWdlckZhY3RvcnlTcGkgZmFjdG9yeVNwaSwKICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyLCBTdHJpbmcgYWxnb3JpdGhtKSB7CkBAIC03MCwxOCArNzQsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMge0Bjb2RlIFRydXN0TWFuYWdlckZhY3Rvcnl9IGFsZ29yaXRobQorICAgICAqIGltcGxlbWVudGF0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB7QGNvZGUgVHJ1c3RNYW5hZ2VyRmFjdG9yeX0gYWxnb3JpdGhtCisgICAgICogICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKICAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFRydXN0TWFuYWdlckZhY3Rvcnl9IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogdHJ1c3QgbWFuYWdlbWVudCBhbGdvcml0aG0uCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFsZ29yaXRobSBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgdHJ1c3QgbWFuYWdlbWVudCBhbGdvcml0aG0uCisgICAgICogQHJldHVybiBhIHRydXN0IG1hbmFnZXIgZmFjdG9yeSBmb3IgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBubyBpbnN0YWxsZWQgcHJvdmlkZXIgY2FuIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBhbGdvcml0aG19IGlzIHtAY29kZSBudWxsfSAoaW5zdGVhZCBvZgorICAgICAqICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRydXN0TWFuYWdlckZhY3RvcnkgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSkKICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtOTYsMTAgKzExMiwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgVHJ1c3RNYW5hZ2VyRmFjdG9yeX0gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB0cnVzdCBtYW5hZ2VtZW50IGFsZ29yaXRobSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFsZ29yaXRobSBpcyBudWxsIChpbnN0ZWFkIG9mCi0gICAgICogTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIEBwYXJhbSBhbGdvcml0aG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgdHJ1c3QgbWFuYWdlbWVudCBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciB0aGF0IHByb3ZpZGVzIHRoZSByZXF1ZXN0ZWQKKyAgICAgKiAgICAgICAgICAgIGFsZ29yaXRobS4KKyAgICAgKiBAcmV0dXJuIGEgdHJ1c3QgbWFuYWdlciBmYWN0b3J5IGZvciB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgdGhlIHJlcXVlc3RlZAorICAgICAqICAgICAgICAgICAgIGFsZ29yaXRobS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGFsZ29yaXRobX0gaXMge0Bjb2RlIG51bGx9IChpbnN0ZWFkIG9mCisgICAgICogICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGFzIGluIDEuNCByZWxlYXNlKQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHJ1c3RNYW5hZ2VyRmFjdG9yeSBnZXRJbnN0YW5jZShTdHJpbmcgYWxnb3JpdGhtLAogICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLApAQCAtMTE1LDEwICsxNDUsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFRydXN0TWFuYWdlckZhY3Rvcnl9IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogdHJ1c3QgbWFuYWdlbWVudCBhbGdvcml0aG0gZnJvbSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLgogICAgICAqIAotICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbGdvcml0aG0gaXMgbnVsbCAoaW5zdGVhZCBvZgotICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBhcyBpbiAxLjQgcmVsZWFzZSkKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGtleSBtYW5hZ2VtZW50IGFsZ29yaXRobSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgICAgICogQHJldHVybiBhIGtleSBtYW5hZ2VyIGZhY3RvcnkgZm9yIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSB0aGUgcmVxdWVzdGVkCisgICAgICogICAgICAgICAgICAgYWxnb3JpdGhtLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYWxnb3JpdGhtfSBpcyB7QGNvZGUgbnVsbH0gKGluc3RlYWQgb2YKKyAgICAgKiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gYXMgaW4gMS40IHJlbGVhc2UpCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUcnVzdE1hbmFnZXJGYWN0b3J5IGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sCiAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CkBAIC0xMzYsMjQgKzE3NywzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIGZvciB0aGlzIHtAY29kZSBUcnVzdE1hbmFnZXJGYWN0b3J5fSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBmb3IgdGhpcyB7QGNvZGUgVHJ1c3RNYW5hZ2VyRmFjdG9yeX0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gcHJvdmlkZXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBmYWN0b3J5IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBrZXlzdG9yZSBhcyBzb3VyY2UKKyAgICAgKiBvZiBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyBhbmQgdHJ1c3QgbWF0ZXJpYWwuCisgICAgICogCisgICAgICogQHBhcmFtIGtzCisgICAgICogICAgICAgICAgICB0aGUga2V5c3RvcmUgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChLZXlTdG9yZSBrcykgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKICAgICAgICAgc3BpSW1wbC5lbmdpbmVJbml0KGtzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIGZhY3RvcnkgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyLXNwZWNpZmljCisgICAgICogcGFyYW1ldGVycyBmb3IgYSBzb3VyY2Ugb2YgdHJ1c3QgbWF0ZXJpYWwuCisgICAgICogCisgICAgICogQHBhcmFtIHNwZWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlci1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgICAqIEB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbml0aWFsaXphdGlvbiBmYWlscy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KE1hbmFnZXJGYWN0b3J5UGFyYW1ldGVycyBzcGVjKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewpAQCAtMTYxLDE2ICsyMTYsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHtAY29kZSBUcnVzdE1hbmFnZXJ9cyB3aXRoIG9uZSBlbnRyeSBmb3IgZWFjaCB0eXBlCisgICAgICogb2YgdHJ1c3QgbWF0ZXJpYWwuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB7QGNvZGUgVHJ1c3RNYW5hZ2VyfXMKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgVHJ1c3RNYW5hZ2VyW10gZ2V0VHJ1c3RNYW5hZ2VycygpIHsKICAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lR2V0VHJ1c3RNYW5hZ2VycygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgYWxnb3JpdGhtIG5hbWUgZm9yIHRoZSB7QGNvZGUgVHJ1c3RNYW5hZ2VyRmFjdG9yeX0uIFRoZQorICAgICAqIGRlZmF1bHQgYWxnb3JpdGhtIG5hbWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWN1cml0eSBwcm9wZXJ0eQorICAgICAqIHtAY29kZSAnc3NsLlRydXN0TWFuYWdlckZhY3RvcnkuYWxnb3JpdGhtJ30uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0QWxnb3JpdGhtKCkgewogICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlcgpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnlTcGkuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5U3BpLmphdmEKaW5kZXggODRiOTg2ZC4uMDhlMjEzZSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnlTcGkuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaS5qYXZhCkBAIC0xNSwxMSArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qKgotKiBAYXV0aG9yIFZlcmEgWS4gUGV0cmFzaGtvdmEKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwpAQCAtMjcsMzQgKzIyLDUyIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKIAogLyoqCi0gKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgorICogVGhlIDxpPlNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlPC9pPiAoU1BJKSBmb3IgdGhlCisgKiB7QGNvZGUgVHJ1c3RNYW5hZ2VyRmFjdG9yeX0gY2xhc3MuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcnVzdE1hbmFnZXJGYWN0b3J5U3BpIHsKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFRydXN0TWFuYWdlckZhY3RvcnlTcGl9IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBUcnVzdE1hbmFnZXJGYWN0b3J5U3BpKCkgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMgZmFjdG9yeSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5c3RvcmUgYXMgc291cmNlCisgICAgICogb2YgY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMgYW5kIHRydXN0IG1hdGVyaWFsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrcworICAgICAqICAgICAgICAgICAgdGhlIGtleXN0b3JlIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluaXRpYWxpemF0aW9uIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoS2V5U3RvcmUga3MpIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIEluaXRpYWxpemVzIHRoaXMgZmFjdG9yeSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXItc3BlY2lmaWMKKyAgICAgKiBwYXJhbWV0ZXJzIGZvciBhIHNvdXJjZSBvZiB0cnVzdCBtYXRlcmlhbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3BlYworICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyLXNwZWNpZmljIHBhcmFtZXRlcnMuCisgICAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluaXRpYWxpemF0aW9uIGZhaWxzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzIHNwZWMpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Yge0Bjb2RlIFRydXN0TWFuYWdlcn1zIHdpdGggb25lIGVudHJ5IGZvciBlYWNoIHR5cGUKKyAgICAgKiBvZiB0cnVzdCBtYXRlcmlhbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHtAY29kZSBUcnVzdE1hbmFnZXJ9cworICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUcnVzdE1hbmFnZXJbXSBlbmdpbmVHZXRUcnVzdE1hbmFnZXJzKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1g1MDlFeHRlbmRlZEtleU1hbmFnZXIuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9YNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyLmphdmEKaW5kZXggNmM0N2ZhOS4uYmQ1NTcwZCAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1g1MDlFeHRlbmRlZEtleU1hbmFnZXIuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvWDUwOUV4dGVuZGVkS2V5TWFuYWdlci5qYXZhCkBAIC0xNSwyOSArMTUsNjYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBCb3JpcyBWLiBLdXpuZXRzb3YKLSogQHZlcnNpb24gJFJldmlzaW9uJAotKi8KLQogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CiAKIC8qKgotICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKKyAqIFRoZSBhYnN0cmFjdCBleHRlbnNpb24gZm9yIHRoZSB7QGNvZGUgWDUwOUtleU1hbmFnZXJ9IGludGVyZmFjZS4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyIGltcGxlbWVudHMgWDUwOUtleU1hbmFnZXIgeworICAgCisgICAgLyoqCisgICAgICogVG8gYmUgdXNlZCBieSBzdWJjbGFzc2VzIG9ubHkuCisgICAgICogPHA+CisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgWDUwOUV4dGVuZGVkS2V5TWFuYWdlcn0gaW5zdGFuY2UuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICAgICAqLwogICAgIHByb3RlY3RlZCBYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyKCkgewogICAgICAgICBzdXBlcigpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENob29zZXMgYSBhbGlhcyBmb3IgdGhlIGNsaWVudCBzaWRlIG9mIGFuIFNTTCBjb25uZWN0aW9uIHRvIGF1dGhlbnRpY2F0ZQorICAgICAqIGl0IHdpdGggdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5IHR5cGUgYW5kIGNlcnRpZmljYXRlIGlzc3VlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGtleVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIHB1YmxpYyBrZXkgYWxnb3JpdGhtIG5hbWVzLgorICAgICAqIEBwYXJhbSBpc3N1ZXJzCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZSBpc3N1ZXJzLCBvciB7QGNvZGUgbnVsbH0gaWYgYW55IGlzc3VlcgorICAgICAqICAgICAgICAgICAgd2lsbCBkby4KKyAgICAgKiBAcGFyYW0gZW5naW5lCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFNTTEVuZ2luZX0gZm9yIHRoZSBjb25uZWN0aW9uLCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgICAgIG5vIGVuZ2luZSBpcyBwcmVkZWZpbmVkLgorICAgICAqIEByZXR1cm4gdGhlIGFsaWFzIG5hbWUgb2YgYSBtYXRjaGluZyBrZXkgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGFyZSBubworICAgICAqICAgICAgICAgbWF0Y2hlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGNob29zZUVuZ2luZUNsaWVudEFsaWFzKFN0cmluZ1tdIGtleVR5cGUsCiAgICAgICAgICAgICBQcmluY2lwYWxbXSBpc3N1ZXJzLCBTU0xFbmdpbmUgZW5naW5lKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENob29zZXMgYSBhbGlhcyBmb3IgdGhlIHNlcnZlciBzaWRlIG9mIGFuIFNTTCBjb25uZWN0aW9uIHRvIGF1dGhlbnRpY2F0ZQorICAgICAqIGl0IHdpdGggdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5IHR5cGUgYW5kIGNlcnRpZmljYXRlIGlzc3VlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGtleVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIHB1YmxpYyBrZXkgYWxnb3JpdGhtIG5hbWVzLgorICAgICAqIEBwYXJhbSBpc3N1ZXJzCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZSBpc3N1ZXJzLCBvciB7QGNvZGUgbnVsbH0gaWYgYW55IGlzc3VlcgorICAgICAqICAgICAgICAgICAgd2lsbCBkby4KKyAgICAgKiBAcGFyYW0gZW5naW5lCisgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFNTTEVuZ2luZX0gZm9yIHRoZSBjb25uZWN0aW9uLCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiAgICAgICAgICAgIG5vIGVuZ2luZSBpcyBwcmVkZWZpbmVkLgorICAgICAqIEByZXR1cm4gdGhlIGFsaWFzIG5hbWUgb2YgYSBtYXRjaGluZyBrZXkgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGFyZSBubworICAgICAqICAgICAgICAgbWF0Y2hlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGNob29zZUVuZ2luZVNlcnZlckFsaWFzKFN0cmluZyBrZXlUeXBlLCBQcmluY2lwYWxbXSBpc3N1ZXJzLAogICAgICAgICAgICAgU1NMRW5naW5lIGVuZ2luZSkgewogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9YNTA5S2V5TWFuYWdlci5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1g1MDlLZXlNYW5hZ2VyLmphdmEKaW5kZXggMDc1ZTJmYy4uMDllNTU5ZCAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1g1MDlLZXlNYW5hZ2VyLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1g1MDlLZXlNYW5hZ2VyLmphdmEKQEAgLTE1LDExICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyoqCi0qIEBhdXRob3IgVmVyYSBZLiBQZXRyYXNoa292YQotKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0qLwotCiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CkBAIC0yOCw0NiArMjMsOTggQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBBIEtleSBNYW5hZ2VyIGZvciBYNTA5IGNlcnRpZmljYXRlLWJhc2VkIGtleSBwYWlycy4KICAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgWDUwOUtleU1hbmFnZXIgZXh0ZW5kcyBLZXlNYW5hZ2VyIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENob29zZXMgYW4gYWxpYXMgZm9yIHRoZSBjbGllbnQgc2lkZSBvZiBhbiBTU0wgY29ubmVjdGlvbiB0byBhdXRoZW50aWNhdGUKKyAgICAgKiBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleSB0eXBlIGFuZCBjZXJ0aWZpY2F0ZSBpc3N1ZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlUeXBlCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBwdWJsaWMga2V5IGFsZ29yaXRobSBuYW1lcy4KKyAgICAgKiBAcGFyYW0gaXNzdWVycworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGUgaXNzdWVycywgb3Ige0Bjb2RlIG51bGx9IGlmIGFueSBpc3N1ZXIKKyAgICAgKiAgICAgICAgICAgIHdpbGwgZG8uCisgICAgICogQHBhcmFtIHNvY2tldAorICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBmb3IgdGhlIGNvbm5lY3Rpb24sIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIHNlbGVjdGVkIGRvZXMgbm90IGRlcGVuZCBvbiBhIHNwZWNpZmljIHNvY2tldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhbGlhcyBuYW1lIG9mIGEgbWF0Y2hpbmcga2V5IG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBhcmUgbm8KKyAgICAgKiAgICAgICAgIG1hdGNoZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBjaG9vc2VDbGllbnRBbGlhcyhTdHJpbmdbXSBrZXlUeXBlLCBQcmluY2lwYWxbXSBpc3N1ZXJzLAogICAgICAgICAgICAgU29ja2V0IHNvY2tldCk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBDaG9vc2VzIGFuIGFsaWFzIGZvciB0aGUgc2VydmVyIHNpZGUgb2YgYW4gU1NMIGNvbm5lY3Rpb24gdG8gYXV0aGVudGljYXRlCisgICAgICogaXQgd2l0aCB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkgdHlwZSBhbmQgY2VydGlmaWNhdGUgaXNzdWVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5VHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgcHVibGljIGtleSBhbGdvcml0aG0gdHlwZSBuYW1lcy4KKyAgICAgKiBAcGFyYW0gaXNzdWVycworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGUgaXNzdWVycywgb3Ige0Bjb2RlIG51bGx9IGlmIGFueSBpc3N1ZXIKKyAgICAgKiAgICAgICAgICAgIHdpbGwgZG8uCisgICAgICogQHBhcmFtIHNvY2tldAorICAgICAqICAgICAgICAgICAgdGhlIHNvY2tldCBmb3IgdGhlIGNvbm5lY3Rpb24sIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqICAgICAgICAgICAgdGhlIGFsaWFzIHNlbGVjdGVkIGRvZXMgbm90IGRlcGVuZCBvbiBhIHNwZWNpZmljIHNvY2tldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhbGlhcyBuYW1lIG9mIGEgbWF0Y2hpbmcga2V5IG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBhcmUgbm8KKyAgICAgKiAgICAgICAgIG1hdGNoZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBjaG9vc2VTZXJ2ZXJBbGlhcyhTdHJpbmcga2V5VHlwZSwgUHJpbmNpcGFsW10gaXNzdWVycywKICAgICAgICAgICAgIFNvY2tldCBzb2NrZXQpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgY2hhaW4gZm9yIHRoZSBzcGVjaWZpZWQgYWxpYXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgdG8gZ2V0IHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBmb3IuCisgICAgICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUgY2hhaW4gZm9yIHRoZSBzcGVjaWZpZWQgYWxpYXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFg1MDlDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlQ2hhaW4oU3RyaW5nIGFsaWFzKTsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIFJldHVybnMgdGhlIGNsaWVudCBhbGlhc2VzIGZvciB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkgdHlwZSBhbmQgbGlzdCBvZgorICAgICAqIGNlcnRpZmljYXRlIGlzc3VlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGtleVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwdWJsaWMga2V5IGFsZ29yaXRobSB0eXBlIG5hbWUuCisgICAgICogQHBhcmFtIGlzc3VlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlIGlzc3VlcnMsIG9yIHtAY29kZSBudWxsfSBpcyBhbnkgaXNzdWVyCisgICAgICogICAgICAgICAgICB3aWxsIGRvLgorICAgICAqIEByZXR1cm4gdGhlIGNsaWVudCBhbGlhc2VzIGZvciB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkgdHlwZSwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgYWxpYXNlcy4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50QWxpYXNlcyhTdHJpbmcga2V5VHlwZSwgUHJpbmNpcGFsW10gaXNzdWVycyk7CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgYWxpYXNlcyBmb3IgdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5IHR5cGUgYW5kIGxpc3Qgb2YKKyAgICAgKiBjZXJ0aWZpY2F0ZSBpc3N1ZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlUeXBlCisgICAgICogICAgICAgICAgICB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gdHlwZSBuYW1lLgorICAgICAqIEBwYXJhbSBpc3N1ZXJzCisgICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZSBpc3N1ZXJzLCBvciB7QGNvZGUgbnVsbH0gaXMgYW55IGlzc3VlcgorICAgICAqICAgICAgICAgICAgd2lsbCBkby4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGllbnQgYWxpYXNlcyBmb3IgdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5IHR5cGUsIG9yCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgYXJlIG5vIG1hdGNoaW5nIGFsaWFzZXMuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckFsaWFzZXMoU3RyaW5nIGtleVR5cGUsIFByaW5jaXBhbFtdIGlzc3VlcnMpOwogCiAgICAgLyoqCi0gICAgICogQGNvbS5pbnRlbC5kcmwuc3BlY19yZWYKLSAgICAgKiAgCisgICAgICogUmV0dXJucyB0aGUgcHJpdmF0ZSBrZXkgZm9yIHRoZSBzcGVjaWZpZWQgYWxpYXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFsaWFzCisgICAgICogICAgICAgICAgICB0aGUgYWxpYXMgdG8gZ2V0IHRoZSBwcml2YXRlIGtleSBmb3IuCisgICAgICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkgZm9yIHRoZSBzcGVjaWZpZWQgYWxpYXMsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiAgICAgICAgIGFsaWFzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgUHJpdmF0ZUtleSBnZXRQcml2YXRlS2V5KFN0cmluZyBhbGlhcyk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1g1MDlUcnVzdE1hbmFnZXIuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9YNTA5VHJ1c3RNYW5hZ2VyLmphdmEKaW5kZXggZWQ1YTIyMS4uMTM1YzBlNyAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1g1MDlUcnVzdE1hbmFnZXIuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvWDUwOVRydXN0TWFuYWdlci5qYXZhCkBAIC0xNSwzOSArMTUsNjcgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSogQGF1dGhvciBWZXJhIFkuIFBldHJhc2hrb3ZhCi0qIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSovCi0KIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwogCiAvKioKLSAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCisgKiBUaGUgdHJ1c3QgbWFuYWdlciBmb3IgWDUwOSBjZXJ0aWZpY2F0ZXMgdG8gYmUgdXNlZCB0byBwZXJmb3JtIGF1dGhlbnRpY2F0aW9uCisgKiBmb3Igc2VjdXJlIHNvY2tldHMuIAogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBYNTA5VHJ1c3RNYW5hZ2VyIGV4dGVuZHMgVHJ1c3RNYW5hZ2VyIHsKIAogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgY2hhaW4gKHBhcnRpYWwgb3IgY29tcGxldGUpIGNhbgorICAgICAqIGJlIHZhbGlkYXRlZCBhbmQgaXMgdHJ1c3RlZCBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogYXV0aGVudGljYXRpb24gdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2hhaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcGFyYW0gYXV0aFR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBjYW4ndCBiZSB2YWxpZGF0ZWQgb3IgaXNuJ3QgdHJ1c3RlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgY2hhaW4gaXMgZW1wdHkgb3Ige0Bjb2RlIG51bGx9LAorICAgICAqICAgICAgICAgICAgIG9yIGlmIHRoZSBzcGVjaWZpZWQgYXV0aGVudGljYXRpb24gdHlwZSBpcyB7QGNvZGUgbnVsbH0gb3IgYW4KKyAgICAgKiAgICAgICAgICAgICBlbXB0eSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tDbGllbnRUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNoYWluLCBTdHJpbmcgYXV0aFR5cGUpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb247CiAKKwogICAgIC8qKgotICAgICAqIEBjb20uaW50ZWwuZHJsLnNwZWNfcmVmCi0gICAgICogIAorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgY2hhaW4gKHBhcnRpYWwgb3IgY29tcGxldGUpIGNhbgorICAgICAqIGJlIHZhbGlkYXRlZCBhbmQgaXMgdHJ1c3RlZCBmb3Igc2VydmVyIGF1dGhlbnRpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICoga2V5IGV4Y2hhbmdlIGFsZ29yaXRobS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2hhaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcGFyYW0gYXV0aFR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgZXhjaGFuZ2UgYWxnb3JpdGhtIG5hbWUuCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBjYW4ndCBiZSB2YWxpZGF0ZWQgb3IgaXNuJ3QgdHJ1c3RlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY2VydGlmaWNhdGUgY2hhaW4gaXMgZW1wdHkgb3Ige0Bjb2RlIG51bGx9LAorICAgICAqICAgICAgICAgICAgIG9yIGlmIHRoZSBzcGVjaWZpZWQgYXV0aGVudGljYXRpb24gdHlwZSBpcyB7QGNvZGUgbnVsbH0gb3IgYW4KKyAgICAgKiAgICAgICAgICAgICBlbXB0eSBzdHJpbmcuCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hlY2tTZXJ2ZXJUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNoYWluLCBTdHJpbmcgYXV0aFR5cGUpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBAY29tLmludGVsLmRybC5zcGVjX3JlZgotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlIGlzc3VlciBhdXRob3JpdGllcyB3aGljaCBhcmUgdHJ1c3RlZCBmb3IKKyAgICAgKiBhdXRoZW50aWNhdGlvbiBvZiBwZWVycy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlIGlzc3VlciBhdXRob3JpdGllcyB3aGljaCBhcmUgdHJ1c3RlZCBmb3IKKyAgICAgKiAgICAgICAgIGF1dGhlbnRpY2F0aW9uIG9mIHBlZXJzLgorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBYNTA5Q2VydGlmaWNhdGVbXSBnZXRBY2NlcHRlZElzc3VlcnMoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvcGFja2FnZS5odG1sIGIveC1uZXQvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL3BhY2thZ2UuaHRtbAppbmRleCA3MzJiMDVmLi4zZTY0NDhlIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvcGFja2FnZS5odG1sCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9wYWNrYWdlLmh0bWwKQEAgLTYsMTkgKzYsMjEgQEAKIDxib2R5PgogPHA+CiBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYWxsIHRoZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIG5lZWRlZCB0byBpbXBsZW1lbmV0IGFuZCBwcm9ncmFtIHRoZSBTZWN1cmUgU29ja2V0Ci1hYnN0cmFjdGlvbiBiYXNlZCBvbiB0aGUgU1NMIHByb3RvY29sIFNTU0x2My4wIG9yIFRMU3YxLjIKLUFsbCB0aGUgZGV0YWlscyBvZiB0aGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbCBhciBjYXJkIGZvciwgYW5kIHRoZSBjaXBoZXIgc2V0IHdpdGggd2hpY2gKLWEgY2xpZW50IG9yIGEgc2VydmVyIHdvcmsgY2FuIGJlIHNwZWNpZmllZC4KK2Fic3RyYWN0aW9uIGJhc2VkIG9uIHRoZSBTU0wgcHJvdG9jb2wgU1NTTHYzLjAgb3IgVExTdjEuMi4KK0FsbCB0aGUgZGV0YWlscyBvZiB0aGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbCBhcmUgYWNjb3VudGVkIGZvciwgYW5kIGEgY2xpZW50IG9yIGEgc2VydmVyIGNhbiBzcGVjaWZ5IHRoZSBjaXBoZXIgCitzZXQgdG8gdXNlLgogCi1YLjUwOSBjZXJ0aWZpY2F0ZXMgYXJlIHZlcmlmaWVkIGFuZCBpZiBkZXNpcmVkIGVpdGhlciB0aGUgY2xpZW50IG9yIHRoZSBzZXJ2ZXIgY2FuIHdhbGsgdGhyb3VnaAotdGhlIHdob2xlIGNlcnRpZmljYXRlcycgY2hhaW4gdW50aWwgdGhlIHJvb3QgQ0EgaXMgcmVhY2hlZC4KK1guNTA5IGNlcnRpZmljYXRlcyBhcmUgdmVyaWZpZWQsIGFuZCwgaWYgZGVzaXJlZCwgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBlYWNoIGhhdmUgdGhlIG9wdGlvbiBvZiB2ZXJpZnlpbmcKK3RoZSBlbnRpcmUgY2VydGlmaWNhdGUgY2hhaW4gdW50aWwgdGhlIHJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGlzIHJlYWNoZWQuCiAKIE5vdGljZSB0aGF0IHRoZSBBbmRyb2lkIGphdmF4Lm5ldC5zc2wgcGFja2FnZSB1c2VzIHRoZSBPcGVuU1NMIExpYnJhcnkgdG8gaW1wbGVtZW50IHRoZSBsb3cgbGV2ZWwKIFNTTCBmdW5jdGlvbmFsaXR5LiBBbGwgdGhlIHJlbGV2YW50IE9wZW5TU2wgd3JpdGUoLi4uKSBhbmQgcmVhZCguLi4pIGZ1bmN0aW9ucyBhcmUgaGlkZGVuIHdpdGhpbiB0d28KLUpOSSBmaWxlcy4gVGhlIHNpZ25hdHVyZXMgb2YgYWxsIHRoZSBKYXZhIFNTTCBtZXRob2RzIGFyZSBjb21wbGlhbnQgd2l0aCB0aGF0IG9mIHRoZSBKYXZhIDUuMAorSk5JIGZpbGVzLiBUaGUgc2lnbmF0dXJlcyBvZiBhbGwgdGhlIEphdmEgU1NMIG1ldGhvZHMgYXJlIGNvbXBsaWFudCB3aXRoIHRoZSBKYXZhIDUuMAogc3BlY2lmaWNhdGlvbi4KIAogVGhlIHByb3ZpZGVyIGZvciBhbGwgU1NMIGNyeXB0b2xvZ2ljYWwgdG9vbHMgaXMgVGhlIExlZ2lvbiBvZiBCb3VuY3kgQ2FzdGxlIChodHRwOi8vd3d3LmJvdW5jeWNhc3RsZS5vcmcpLgorCiA8L3A+CitAc2luY2UgQW5kcm9pZCAxLjAKIDwvYm9keT4KIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQppbmRleCBlZmFkODQ1Li5lOWYyYjBlIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKQEAgLTIxLDkgKzIxLDIyIEBACiAgKiBpZiB0aGlzIHRvb2wgcnVucyBhZ2Fpbi4gQmV0dGVyIG1ha2UgY2hhbmdlcyBpbiB0aGUgdGVtcGxhdGUgZmlsZS4KICAqLwogCisvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKy8vIFJlZHVuZGFudCBjb2RlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vdyBjYWxsZWQgZnJvbSBNc2dIZWxwLgorLy8gRU5EIGFuZHJvaWQtbm90ZQorCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LmludGVybmFsLm5sczsKIAorCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZ0hlbHA7CisvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAKIC8qKgogICogVGhpcyBjbGFzcyByZXRyaWV2ZXMgc3RyaW5ncyBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlIGFuZCByZXR1cm5zIHRoZW0sCkBAIC00MSw4ICs1NCwxMCBAQAogICovCiBwdWJsaWMgY2xhc3MgTWVzc2FnZXMgewogCisgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNSZXNvdXJjZSA9CiAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5pbnRlcm5hbC5ubHMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIGEgbWVzc2FnZSB3aGljaCBoYXMgbm8gYXJndW1lbnRzLgpAQCAtNTIsNyArNjcsOSBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2cpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTksNiArMTM2LDEyIEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2csIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhzUmVzb3VyY2UsIG1zZywgYXJncyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBEdXBsaWNhdGUgY29kZSB3YXMgZHJvcHBlZCBpbiBmYXZvciBvZiB1c2luZyBNc2dIZWxwLgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9DbGllbnRIYW5kc2hha2VJbXBsLmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ2xpZW50SGFuZHNoYWtlSW1wbC5qYXZhCmluZGV4IDkwYmEwYTkuLjg0MTkwOTYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9DbGllbnRIYW5kc2hha2VJbXBsLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0NsaWVudEhhbmRzaGFrZUltcGwuamF2YQpAQCAtMTI3LDEyICsxMjcsOSBAQAogICAgICAgICBpZiAoaXNSZXN1bWluZykgewogICAgICAgICAgICAgY2lwaGVyX3N1aXRlcyA9IG5ldyBDaXBoZXJTdWl0ZVtdIHsgc2Vzc2lvbi5jaXBoZXJTdWl0ZSB9OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0gICAgICAgICAgICAvLyBjaXBoZXJfc3VpdGVzID0gcGFyYW1ldGVycy5lbmFibGVkQ2lwaGVyU3VpdGVzOwotICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBjaXBoZXJfc3VpdGVzID0gcGFyYW1ldGVycy5nZXRFbmFibGVkQ2lwaGVyU3VpdGVzTWVtYmVyKCk7Ci0gICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB9CiAgICAgICAgIGNsaWVudEhlbGxvID0gbmV3IENsaWVudEhlbGxvKHBhcmFtZXRlcnMuZ2V0U2VjdXJlUmFuZG9tKCksCiAgICAgICAgICAgICAgICAgc2Vzc2lvbi5wcm90b2NvbC52ZXJzaW9uLCBzZXNzaW9uLmlkLCBjaXBoZXJfc3VpdGVzKTsKQEAgLTIxMywxMiArMjEwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBjaXBoZXJfc3VpdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0gICAgICAgICAgICAgICAgICAgIC8vIENpcGhlclN1aXRlW10gZW5hYmxlZFN1aXRlcyA9IHBhcmFtZXRlcnMuZW5hYmxlZENpcGhlclN1aXRlczsKLSAgICAgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCisgICAgICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICBDaXBoZXJTdWl0ZVtdIGVuYWJsZWRTdWl0ZXMgPSBwYXJhbWV0ZXJzLmdldEVuYWJsZWRDaXBoZXJTdWl0ZXNNZW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICBmaW5kOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuYWJsZWRTdWl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVySGVsbG8uY2lwaGVyX3N1aXRlCkBAIC02MTIsMjMgKzYwNiwxNCBAQAogCiAgICAgLy8gRmluZCBzZXNzaW9uIHRvIHJlc3VtZSBpbiBjbGllbnQgc2Vzc2lvbiBjb250ZXh0CiAgICAgcHJpdmF0ZSBTU0xTZXNzaW9uSW1wbCBmaW5kU2Vzc2lvblRvUmVzdW1lKCkgewotICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLSAgICAgICAgLy8gU3RyaW5nIGhvc3Q7Ci0gICAgICAgIC8vIGludCBwb3J0OwotICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCi0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIFN0cmluZyBob3N0ID0gbnVsbDsKICAgICAgICAgaW50IHBvcnQgPSAtMTsKLSAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgaWYgKGVuZ2luZU93bmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGhvc3QgPSBlbmdpbmVPd25lci5nZXRQZWVySG9zdCgpOwogICAgICAgICAgICAgcG9ydCA9IGVuZ2luZU93bmVyLmdldFBlZXJQb3J0KCk7Ci0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAvLyB9IGVsc2UgewotICAgICAgICAvLyAgICAgaG9zdCA9IHNvY2tldE93bmVyLmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdE5hbWUoKTsKLSAgICAgICAgLy8gICAgIHBvcnQgPSBzb2NrZXRPd25lci5nZXRQb3J0KCk7Ci0gICAgICAgIC8vIEVORCBhbmRyb2lkLXJlbW92ZWQKICAgICAgICAgfQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcG9ydCA9PSAtMSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHN0YXJ0cyBuZXcgc2Vzc2lvbgogICAgICAgICB9CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvSGFuZHNoYWtlUHJvdG9jb2wuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9IYW5kc2hha2VQcm90b2NvbC5qYXZhCmluZGV4IDE0YzhhZTUuLjYwNmU1YzcgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9IYW5kc2hha2VQcm90b2NvbC5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9IYW5kc2hha2VQcm90b2NvbC5qYXZhCkBAIC0xNzAsMTYgKzE3MCwxNCBAQAogICAgICAgICAgICAgZW5naW5lT3duZXIgPSAoU1NMRW5naW5lSW1wbCkgb3duZXI7CiAgICAgICAgICAgICBub25CbG9ja2luZyA9IHRydWU7CiAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSAoU1NMUGFyYW1ldGVycykgZW5naW5lT3duZXIuc3NsUGFyYW1ldGVyczsKKyAgICAgICAgfQogICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLSAgICAgICAgLy8gfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIFNTTFNvY2tldEltcGwpIHsKKyAgICAgICAgLy8gZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBTU0xTb2NrZXRJbXBsKSB7CiAgICAgICAgIC8vICAgICBzb2NrZXRPd25lciA9IChTU0xTb2NrZXRJbXBsKSBvd25lcjsKICAgICAgICAgLy8gICAgIG5vbkJsb2NraW5nID0gZmFsc2U7CiAgICAgICAgIC8vICAgICB0aGlzLnBhcmFtZXRlcnMgPSAoU1NMUGFyYW1ldGVycykgc29ja2V0T3duZXIuc3NsUGFyYW1ldGVyczsKICAgICAgICAgLy8gfQogICAgICAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCi0gICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKLSAgICAgICAgfQotICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1NTTENvbnRleHRJbXBsLmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU1NMQ29udGV4dEltcGwuamF2YQppbmRleCAwZDNhMDdjLi4zZjRhYjk2IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU1NMQ29udGV4dEltcGwuamF2YQorKysgYi94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU1NMQ29udGV4dEltcGwuamF2YQpAQCAtNzIsMTQgKzcyLDE4IEBACiAgICAgICAgIGlmIChzc2xQYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNTTENvbnRleHQgaXMgbm90IGluaXRpYWxsaXplZC4iKTsKICAgICAgICAgfQorICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIG5ldyBPcGVuU1NMU29ja2V0RmFjdG9yeUltcGwoc3NsUGFyYW1ldGVycyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICBwdWJsaWMgU1NMU2VydmVyU29ja2V0RmFjdG9yeSBlbmdpbmVHZXRTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgewogICAgICAgICBpZiAoc3NsUGFyYW1ldGVycyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTU0xDb250ZXh0IGlzIG5vdCBpbml0aWFsbGl6ZWQuIik7CiAgICAgICAgIH0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTFNlcnZlclNvY2tldEZhY3RvcnlJbXBsKHNzbFBhcmFtZXRlcnMpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgcHVibGljIFNTTEVuZ2luZSBlbmdpbmVDcmVhdGVTU0xFbmdpbmUoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU1NMUGFyYW1ldGVycy5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1NTTFBhcmFtZXRlcnMuamF2YQppbmRleCAwNjA3ZTE3Li45YTE0ZjQ2IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU1NMUGFyYW1ldGVycy5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9TU0xQYXJhbWV0ZXJzLmphdmEKQEAgLTcwLDEyICs3MCw5IEBACiAgICAgcHJpdmF0ZSBTZWN1cmVSYW5kb20gc2VjdXJlUmFuZG9tOwogCiAgICAgLy8gY2lwaGVyIHN1aXRlcyBhdmFpbGFibGUgZm9yIFNTTCBjb25uZWN0aW9uCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1yZW1vdmVkCi0gICAgLy8gcHJvdGVjdGVkIENpcGhlclN1aXRlW10gZW5hYmxlZENpcGhlclN1aXRlczsKLSAgICAvLyBFTkQgYW5kcm9pZC1yZW1vdmVkCi0gICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgIHByaXZhdGUgQ2lwaGVyU3VpdGVbXSBlbmFibGVkQ2lwaGVyU3VpdGVzOwotICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCisgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIC8vIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgYXZhaWxhYmxlIGNpcGhlciBzdWl0ZXMKICAgICBwcml2YXRlIFN0cmluZ1tdIGVuYWJsZWRDaXBoZXJTdWl0ZU5hbWVzID0gbnVsbDsKIApAQCAtMjI0LDcgKzIyMSw3IEBACiAgICAgICAgIC8vIFdlIHNpbXBseSB1c2UgdGhlIFNlY3VyZVJhbmRvbSBwYXNzZWQgaW4gYnkgdGhlIGNhbGxlci4gSWYgaXQncwogICAgICAgICAvLyBudWxsLCB3ZSBkb24ndCByZXBsYWNlIGl0IGJ5IGEgbmV3IGluc3RhbmNlLiBUaGUgbmF0aXZlIGNvZGUgYmVsb3cKICAgICAgICAgLy8gdGhlbiBkaXJlY3RseSBhY2Nlc3NlcyAvZGV2L3VyYW5kb20uIE5vdCB0aGUgbW9zdCBlbGVnYW50IHNvbHV0aW9uLAotICAgICAgICAvLyBidXQgZmFzdGVyIHRoYXQgZ29pbmcgdGhyb3VnaCB0aGUgU2VjdXJlUmFuZG9tIG9iamVjdC4gCisgICAgICAgIC8vIGJ1dCBmYXN0ZXIgdGhhbiBnb2luZyB0aHJvdWdoIHRoZSBTZWN1cmVSYW5kb20gb2JqZWN0LiAKICAgICAgICAgICAgIHNlY3VyZVJhbmRvbSA9IHNyOwogICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgIH0KQEAgLTI3OSw4ICsyNzYsOCBAQAogICAgICAgICAgICAgZGVmYXVsdFNlY3VyZVJhbmRvbSA9IG5ldyBTZWN1cmVSYW5kb20oKTsKICAgICAgICAgfQogICAgICAgICBzZWN1cmVSYW5kb20gPSBkZWZhdWx0U2VjdXJlUmFuZG9tOwotICAgICAgICByZXR1cm4gc2VjdXJlUmFuZG9tOwogICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgICAgICByZXR1cm4gc2VjdXJlUmFuZG9tOwogICAgIH0KIAogICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9TU0xTZXNzaW9uQ29udGV4dEltcGwuamF2YSBiL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9TU0xTZXNzaW9uQ29udGV4dEltcGwuamF2YQppbmRleCA3YWU0YzczLi4zYzZhM2I4IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU1NMU2Vzc2lvbkNvbnRleHRJbXBsLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1NTTFNlc3Npb25Db250ZXh0SW1wbC5qYXZhCkBAIC0xNCw2ICsxNCwyMSBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKIC8qKgogICogQGF1dGhvciBCb3JpcyBLdXpuZXRzb3YKQEAgLTIxLDcgKzM2LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOwogCi0vL0JFR0lOIGFuZHJvaWQtY2hhbmdlZAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CkBAIC0xNDMsNCArMTU3LDMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLS8vIEVORCBhbmRyb2lkLWNoYW5nZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU2VydmVySGFuZHNoYWtlSW1wbC5qYXZhIGIveC1uZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1NlcnZlckhhbmRzaGFrZUltcGwuamF2YQppbmRleCA4NGE2NjNjLi45M2RjOWM0IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvU2VydmVySGFuZHNoYWtlSW1wbC5qYXZhCisrKyBiL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9TZXJ2ZXJIYW5kc2hha2VJbXBsLmphdmEKQEAgLTY5MSwyMCArNjkxLDEzIEBACiAgICAgICAgICAgICBpZiAoIWNsaWVudF9zdWl0ZXNbaV0uc3VwcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLXJlbW92ZWQKLSAgICAgICAgICAgIC8vIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1ldGVycy5lbmFibGVkQ2lwaGVyU3VpdGVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAvLyAgICAgaWYgKGNsaWVudF9zdWl0ZXNbaV0uZXF1YWxzKHBhcmFtZXRlcnMuZW5hYmxlZENpcGhlclN1aXRlc1tqXSkpIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgcmV0dXJuIGNsaWVudF9zdWl0ZXNbaV07Ci0gICAgICAgICAgICAvLyAgICAgfQotICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtcmVtb3ZlZAotICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAorICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtZXRlcnMuZ2V0RW5hYmxlZENpcGhlclN1aXRlc01lbWJlcigpLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNsaWVudF9zdWl0ZXNbaV0uZXF1YWxzKHBhcmFtZXRlcnMuZ2V0RW5hYmxlZENpcGhlclN1aXRlc01lbWJlcigpW2pdKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50X3N1aXRlc1tpXTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAorICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9UcnVzdE1hbmFnZXJJbXBsLmphdmEgYi94LW5ldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvVHJ1c3RNYW5hZ2VySW1wbC5qYXZhCmluZGV4IDFjNDVmYjguLjMxZjczMTQgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9UcnVzdE1hbmFnZXJJbXBsLmphdmEKKysrIGIveC1uZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1RydXN0TWFuYWdlckltcGwuamF2YQpAQCAtMjIsMTMgKzIyLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZTsKIAotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGg7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWFBhcmFtZXRlcnM7CkBAIC00Miw2ICszOSwxMiBAQAogCiBpbXBvcnQgamF2YXgubmV0LnNzbC5YNTA5VHJ1c3RNYW5hZ2VyOwogCisvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKKy8vIEVORCBhbmRyb2lkLWFkZGVkCisKIC8qKgogICogCiAgKiBUcnVzdE1hbmFnZXIgaW1wbGVtZW50YXRpb24uIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBDZXJ0UGF0aFZhbGlkYXRvcgpAQCAtMTAwLDI2ICsxMDMsMjkgQEAKICAgICAgICAgaWYgKGVyciAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oZXJyKTsKICAgICAgICAgfQotCisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtYWRkZWQKICAgICAgICAgLy8gQ2F0ZXIgZm9yIGRlZ2VuZXJhdGUgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGNhbid0CiAgICAgICAgIC8vIGVzdGFibGlzaCBhbiBhY3R1YWwgY2VydGlmaWNhdGUgY2hhaW4gdGhlIHVzdWFsIHdheSwKICAgICAgICAgLy8gYnV0IGhhdmUgdGhlIHBlZXIgY2VydGlmaWNhdGUgaW4gb3VyIHRydXN0IHN0b3JlLgogICAgICAgICBpZiAoaXNEaXJlY3RseVRydXN0ZWRDZXJ0KGNoYWluKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtYWRkZWQKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBDZXJ0UGF0aCBjZXJ0UGF0aCA9IGZhY3RvcnkuZ2VuZXJhdGVDZXJ0UGF0aChBcnJheXMuYXNMaXN0KGNoYWluKSk7Ci0gICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGNoYWluWzBdLmdldEVuY29kZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYNTA5Q2VydGlmaWNhdGUpY2VydFBhdGguZ2V0Q2VydGlmaWNhdGVzKCkuZ2V0KDApKS5nZXRFbmNvZGVkKCkpKSB7Ci0gICAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZmFpbGVkIChzaG91bGRuJ3QgZXZlciBoYXBwZW4sIGJ1dCB3ZSBhcmUgdXNpbmcgcHJldHR5IHJlbW90ZSBjb2RlKQotICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBjaGFpbiBlcnJvciIpOwotICAgICAgICAgIH0KLSAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoY2VydFBhdGgsIHBhcmFtcyk7CisgICAgICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgICAgIENlcnRQYXRoIGNlcnRQYXRoID0gZmFjdG9yeS5nZW5lcmF0ZUNlcnRQYXRoKEFycmF5cy5hc0xpc3QoY2hhaW4pKTsKKyAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhjaGFpblswXS5nZXRFbmNvZGVkKCksCisgICAgICAgICAgICAgICAgICAgICgoWDUwOUNlcnRpZmljYXRlKWNlcnRQYXRoLmdldENlcnRpZmljYXRlcygpLmdldCgwKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldEVuY29kZWQoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZmFpbGVkIChzaG91bGRuJ3QgZXZlciBoYXBwZW4sIGJ1dCB3ZSBhcmUgdXNpbmcgcHJldHR5IHJlbW90ZSBjb2RlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigiQ2VydGlmaWNhdGUgY2hhaW4gZXJyb3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShjZXJ0UGF0aCwgcGFyYW1zKTsKKyAgICAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKGUpOwogICAgICAgICB9IGNhdGNoIChDZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzYsMjkgKzE0MiwzMyBAQAogICAgICAgICBpZiAoZXJyICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbihlcnIpOwogICAgICAgICB9Ci0KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1hZGRlZAogICAgICAgICAvLyBDYXRlciBmb3IgZGVnZW5lcmF0ZSBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgY2FuJ3QKICAgICAgICAgLy8gZXN0YWJsaXNoIGFuIGFjdHVhbCBjZXJ0aWZpY2F0ZSBjaGFpbiB0aGUgdXN1YWwgd2F5LAogICAgICAgICAvLyBidXQgaGF2ZSB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBpbiBvdXIgdHJ1c3Qgc3RvcmUuCiAgICAgICAgIGlmIChpc0RpcmVjdGx5VHJ1c3RlZENlcnQoY2hhaW4pKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQorICAgICAgICAvLyBFTkQgYW5kcm9pZC1hZGRlZAogICAgICAgICB0cnkgewotICAgICAgICAgIENlcnRQYXRoIGNlcnRQYXRoID0gZmFjdG9yeS5nZW5lcmF0ZUNlcnRQYXRoKEFycmF5cy5hc0xpc3QoY2hhaW4pKTsKLSAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoY2hhaW5bMF0uZ2V0RW5jb2RlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFg1MDlDZXJ0aWZpY2F0ZSljZXJ0UGF0aC5nZXRDZXJ0aWZpY2F0ZXMoKS5nZXQoMCkpLmdldEVuY29kZWQoKSkpIHsKLSAgICAgICAgICAgIC8vIHNhbml0eSBjaGVjayBmYWlsZWQgKHNob3VsZG4ndCBldmVyIGhhcHBlbiwgYnV0IHdlIGFyZSB1c2luZyBwcmV0dHkgcmVtb3RlIGNvZGUpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkNlcnRpZmljYXRlIGNoYWluIGVycm9yIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShjZXJ0UGF0aCwgcGFyYW1zKTsKKyAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAorICAgICAgICAgICAgQ2VydFBhdGggY2VydFBhdGggPSBmYWN0b3J5LmdlbmVyYXRlQ2VydFBhdGgoQXJyYXlzLmFzTGlzdChjaGFpbikpOworICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGNoYWluWzBdLmdldEVuY29kZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgKChYNTA5Q2VydGlmaWNhdGUpY2VydFBhdGguZ2V0Q2VydGlmaWNhdGVzKCkuZ2V0KDApKQorICAgICAgICAgICAgICAgICAgICAuZ2V0RW5jb2RlZCgpKSkgeworICAgICAgICAgICAgICAgIC8vIHNhbml0eSBjaGVjayBmYWlsZWQgKHNob3VsZG4ndCBldmVyIGhhcHBlbiwgYnV0IHdlIGFyZSB1c2luZyBwcmV0dHkgcmVtb3RlIGNvZGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBjaGFpbiBlcnJvciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKGNlcnRQYXRoLCBwYXJhbXMpOworICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICB9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0gY2F0Y2ggKENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBCRUdJTiBhbmRyb2lkLWFkZGVkCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGNoYWluIGlzIGp1c3QgYSBjZXJ0aWZpY2F0ZQogICAgICAqIHRoYXQgd2UgaGF2ZSBpbiBvdXIgdHJ1c3Qgc3RvcmUuCkBAIC0xODksNiArMTk5LDcgQEAKIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIC8vIEVORCBhbmRyb2lkLWFkZGVkCiAgICAgCiAgICAgLyoqCiAgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIjZ2V0QWNjZXB0ZWRJc3N1ZXJzKCkKQEAgLTIwNSw0ICsyMTYsNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjZXJ0czsKICAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9TZXJ2ZXJTb2NrZXRGYWN0b3J5VGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L1NlcnZlclNvY2tldEZhY3RvcnlUZXN0LmphdmEKaW5kZXggZDNhOGQzNy4uNWE1YzIwMSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L1NlcnZlclNvY2tldEZhY3RvcnlUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L1NlcnZlclNvY2tldEZhY3RvcnlUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwpAQCAtMzIsMjcgKzM3LDQ1IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKLQorIAogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+U2VydmVyU29ja2V0RmFjdG9yeTwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoU2VydmVyU29ja2V0RmFjdG9yeS5jbGFzcykKIHB1YmxpYyBjbGFzcyBTZXJ2ZXJTb2NrZXRGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZheC5uZXQuU29ja2V0RmFjdG9yeSNTb2NrZXRGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQl0cnkgewotCQkJbmV3IE15U2VydmVyU29ja2V0RmFjdG9yeSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5I1NvY2tldEZhY3RvcnkoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTZXJ2ZXJTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBNeVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCisgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5TZXJ2ZXJTb2NrZXRGYWN0b3J5I2NyZWF0ZVNlcnZlclNvY2tldCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSU9FeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlU2VydmVyU29ja2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9jcmVhdGVTZXJ2ZXJTb2NrZXQoKSB7CiAgICAgICAgIFNlcnZlclNvY2tldEZhY3Rvcnkgc2YgPSBuZXcgTXlTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CiAgICAgICAgIHRyeSB7CkBAIC02Nyw2ICs5MCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuU2VydmVyU29ja2V0RmFjdG9yeSNnZXREZWZhdWx0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfZ2V0RGVmYXVsdCgpIHsKICAgICAgICAgU2VydmVyU29ja2V0RmFjdG9yeSBzZiA9IFNlcnZlclNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOwogICAgICAgICBTZXJ2ZXJTb2NrZXQgczsKQEAgLTg5LDExICsxMjEsMTEgQEAKIH0KIAogY2xhc3MgTXlTZXJ2ZXJTb2NrZXRGYWN0b3J5IGV4dGVuZHMgU2VydmVyU29ja2V0RmFjdG9yeSB7Ci0JCi0JcHVibGljIE15U2VydmVyU29ja2V0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCisgICAgCisgICAgcHVibGljIE15U2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisgICAgCiAgICAgcHVibGljIFNlcnZlclNvY2tldCBjcmVhdGVTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvU29ja2V0RmFjdG9yeVRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9Tb2NrZXRGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDY0ZjgxOTMuLmU4OTRhNDYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9Tb2NrZXRGYWN0b3J5VGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9Tb2NrZXRGYWN0b3J5VGVzdC5qYXZhCkBAIC0yMiw2ICsyMiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQ7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlNvY2tldDsKQEAgLTM2LDIyICs0MSw0MSBAQAogLyoqCiAgKiBUZXN0cyBmb3IgPGNvZGU+U29ja2V0RmFjdG9yeTwvY29kZT4gY2xhc3MgbWV0aG9kcy4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhTb2NrZXRGYWN0b3J5LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTb2NrZXRGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZheC5uZXQuU29ja2V0RmFjdG9yeSNTb2NrZXRGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQl0cnkgewotCQkJbmV3IE15U29ja2V0RmFjdG9yeSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5I1NvY2tldEZhY3RvcnkoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBNeVNvY2tldEZhY3RvcnkoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuU29ja2V0RmFjdG9yeSNjcmVhdGVTb2NrZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbnMgY2FzZXMgYXJlIG5vdCB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVTb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2NyZWF0ZVNvY2tldCgpIHsKICAgICAgICAgU29ja2V0RmFjdG9yeSBzZiA9IG5ldyBNeVNvY2tldEZhY3RvcnkoKTsKICAgICAgICAgdHJ5IHsKQEAgLTY2LDYgKzkwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5I2dldERlZmF1bHQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWZhdWx0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9nZXREZWZhdWx0KCkgewogICAgICAgICBTb2NrZXRGYWN0b3J5IHNmID0gU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CiAgICAgICAgIFNvY2tldCBzOwpAQCAtOTMsMTEgKzEyNiwxMSBAQAogfQogCiBjbGFzcyBNeVNvY2tldEZhY3RvcnkgZXh0ZW5kcyBTb2NrZXRGYWN0b3J5IHsKLQkKLQlwdWJsaWMgTXlTb2NrZXRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKKyAgICAKKyAgICBwdWJsaWMgTXlTb2NrZXRGYWN0b3J5KCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0FsbFRlc3RzLmphdmEgYi94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0FsbFRlc3RzLmphdmEKaW5kZXggYjU3NTU0Ny4uODg0NmIwNiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9BbGxUZXN0cy5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvQWxsVGVzdHMuamF2YQpAQCAtMzQsOCArMzQsMTAgQEAKICAgICAgICAgLy8gJEpVbml0LUJFR0lOJAogCiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50VGVzdC5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50VGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShIdHRwc1VSTENvbm5lY3Rpb25UZXN0LmNsYXNzKTsKKy8vCSAgc3VpdGUuYWRkVGVzdFN1aXRlKEh0dHBzVVJMQ29ubmVjdGlvblRlc3QxLmNsYXNzKTsKKy8vCSAgc3VpdGUuYWRkVGVzdFN1aXRlKEh0dHBVUkxDb25uZWN0aW9uVGVzdC5jbGFzcyk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShLZXlNYW5hZ2VyRmFjdG9yeTFUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEtleU1hbmFnZXJGYWN0b3J5MlRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoS2V5TWFuYWdlckZhY3RvcnlTcGlUZXN0LmNsYXNzKTsKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9DZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnNUZXN0LmphdmEKaW5kZXggZmU3MDYyMS4uMjVhNWRmMiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9DZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnNUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9DZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnNUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzOwogCkBAIC0yNywzOCArMzIsNTcgQEAKICAqIGFuZCBtZXRob2RzLgogICogIAogICovCitAVGVzdFRhcmdldENsYXNzKENlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycy5jbGFzcykgCiBwdWJsaWMgY2xhc3MgQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkNlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyMKLQkgKiAgICAgQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnMpCi0JICogQ2FzZSAxOiBUcnkgdG8gY29uc3RydWN0IG9iamVjdC4KLQkgKiBDYXNlIDI6IENoZWNrIE51bGxQb2ludGVyRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9zZWN1cml0eV9jZXJ0X0NlcnRQYXRoUGFyYW1ldGVycygpIHsKLQkJLy8gY2FzZSAxOiBUcnkgdG8gY29uc3RydWN0IG9iamVjdC4KLQkJdHJ5IHsKLQkgICAgICAgIENlcnRQYXRoUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IE15Q2VydFBhdGhQYXJhbWV0ZXJzKCk7Ci0JICAgICAgICBDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMgcCA9Ci0JICAgICAgICAJbmV3IENlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKLQkgICAgICAgIGFzc2VydE5vdFNhbWUoIlBhcmFtZXRlcnMgd2VyZSBjbG9uZWQgaW5jb3JyZWN0bHkiLAotCSAgICAgICAgCQlwYXJhbWV0ZXJzLCBwLmdldFBhcmFtZXRlcnMoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKLQkJfQotCQkKLQkJLy8gY2FzZSAyOiBDaGVjayBOdWxsUG9pbnRlckV4Y2VwdGlvbi4KLQkJdHJ5IHsKLQkJCW5ldyBDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMobnVsbCk7Ci0JCQlmYWlsKCJFeHBlY3RlZCBDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMgd2FzIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkNlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyNnZXRQYXJhbWV0ZXJzKCkKLQkgKi8KKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5DZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMjCisgICAgICogICAgIENlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyhqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzKQorICAgICAqIENhc2UgMTogVHJ5IHRvIGNvbnN0cnVjdCBvYmplY3QuCisgICAgICogQ2FzZSAyOiBDaGVjayBOdWxsUG9pbnRlckV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0NlcnRQYXRoUGFyYW1ldGVycy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX3NlY3VyaXR5X2NlcnRfQ2VydFBhdGhQYXJhbWV0ZXJzKCkgeworICAgICAgICAvLyBjYXNlIDE6IFRyeSB0byBjb25zdHJ1Y3Qgb2JqZWN0LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydFBhdGhQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgTXlDZXJ0UGF0aFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIENlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyBwID0KKyAgICAgICAgICAgICAgICBuZXcgQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgiUGFyYW1ldGVycyB3ZXJlIGNsb25lZCBpbmNvcnJlY3RseSIsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIHAuZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBjYXNlIDI6IENoZWNrIE51bGxQb2ludGVyRXhjZXB0aW9uLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIENlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyB3YXMgbm90IHRocm93biIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzI2dldFBhcmFtZXRlcnMoKQorICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQYXJhbWV0ZXJzKCkgewogICAgICAgICBDZXJ0UGF0aFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBNeUNlcnRQYXRoUGFyYW1ldGVycygpOwogICAgICAgICBDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMgcCA9IG5ldyBDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMoCkBAIC02Nyw3ICs5MSw3IEBACiAgICAgICAgICAgICBmYWlsKCJpbmNvcnJlY3QgcGFyYW1ldGVycyIpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydE5vdFNhbWUoIlBhcmFtZXRlcnMgd2VyZSBjbG9uZWQgaW5jb3JyZWN0bHkiLAotICAgICAgICAJCXBhcmFtZXRlcnMsIHAuZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLCBwLmdldFBhcmFtZXRlcnMoKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0hhbmRzaGFrZUNvbXBsZXRlZEV2ZW50VGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRFdmVudFRlc3QuamF2YQppbmRleCA5YzQwNjlkLi42ZjMwMWRhIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0hhbmRzaGFrZUNvbXBsZXRlZEV2ZW50VGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvSGFuZHNoYWtlQ29tcGxldGVkRXZlbnRUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKQEAgLTM1LDYgKzQwLDcgQEAKICAqIFRlc3RzIGZvciA8Y29kZT5IYW5kc2hha2VDb21wbGV0ZWRFdmVudDwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQuY2xhc3MpIAogcHVibGljIGNsYXNzIEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIGludCBwb3J0OwpAQCAtODEsMTEgKzg3LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotICAgIAlpZiAobm9GcmVlUG9ydCB8fCBub1NvY2tldCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWNhdGlvbiB3aXRoIG51bGwvaW5jb3JyZWN0IHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U1NMU29ja2V0LmNsYXNzLCBTU0xTZXNzaW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBfdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgaWYgKG5vRnJlZVBvcnQgfHwgbm9Tb2NrZXQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgIAlTU0xTZXNzaW9uIHNlcyA9IG5ldyBNeVNTTFNlc3Npb24oKTsKKyAgICAgICAgU1NMU2Vzc2lvbiBzZXMgPSBuZXcgTXlTU0xTZXNzaW9uKCk7CiAgICAgICAgIEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50IGV2ZW50ID0gbmV3IEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50KHNvYywgc2VzKTsKICAgICAgICAgaWYgKCFzZXMuZXF1YWxzKGV2ZW50LmdldFNlc3Npb24oKSkpIHsKICAgICAgICAgICAgIGZhaWwoImluY29ycmVjdCBzZXNzaW9uIik7CkBAIC05NSw3ICsxMTAsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfZ2V0Q2lwaGVyU3VpdGUoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldENpcGhlclN1aXRlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgX3Rlc3RfZ2V0Q2lwaGVyU3VpdGUoKSB7CiAgICAgICAgIGlmIChub0ZyZWVQb3J0IHx8IG5vU29ja2V0KSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTExNSwyMSArMTM5LDM5IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQjZ2V0TG9jYWxQcmluY2lwYWwoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxQcmluY2lwYWwoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldExvY2FsUHJpbmNpcGFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0TG9jYWxQcmluY2lwYWwoKSB7CiAgICAgICAgIGlmIChub0ZyZWVQb3J0IHx8IG5vU29ja2V0KSByZXR1cm47CiAgICAgICAgIFNTTFNlc3Npb24gc2VzID0gbmV3IE15U1NMU2Vzc2lvbigpOwogICAgICAgICBIYW5kc2hha2VDb21wbGV0ZWRFdmVudCBldmVudCA9IG5ldyBIYW5kc2hha2VDb21wbGV0ZWRFdmVudChzb2MsIHNlcyk7CiAgICAgICAgIFByaW5jaXBhbCBscCAgICAgPSBldmVudC5nZXRMb2NhbFByaW5jaXBhbCgpOwogICAgICAgICBQcmluY2lwYWwgc2VzX2xwID0gc2VzLmdldExvY2FsUHJpbmNpcGFsKCk7IAogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB2YWx1ZSBvZiBsb2NhbCBwcmluY2lwYWwiLAotICAgICAgICAJCWxwLCBzZXNfbHApOworICAgICAgICAgICAgICAgIGxwLCBzZXNfbHApOwogICAgIH0KICAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2dldExvY2FsQ2VydGlmaWNhdGVzKCkgewotICAgIAlpZiAobm9GcmVlUG9ydCB8fCBub1NvY2tldCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbENlcnRpZmljYXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIF90ZXN0X2dldExvY2FsQ2VydGlmaWNhdGVzKCkgeworICAgICAgICBpZiAobm9GcmVlUG9ydCB8fCBub1NvY2tldCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgCVNTTFNlc3Npb24gc2VzID0gbmV3IE15U1NMU2Vzc2lvbigpOworICAgICAgICBTU0xTZXNzaW9uIHNlcyA9IG5ldyBNeVNTTFNlc3Npb24oKTsKICAgICAgICAgSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQgZXZlbnQgPSBuZXcgSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQoc29jLCBzZXMpOwogCiAgICAgICAgIENlcnRpZmljYXRlW10gY2VydHMgPSBldmVudC5nZXRMb2NhbENlcnRpZmljYXRlcygpOwpAQCAtMTQ3LDExICsxODksMjAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfZ2V0UGVlckNlcnRpZmljYXRlQ2hhaW4oKSB7Ci0gICAgCWlmIChub0ZyZWVQb3J0IHx8IG5vU29ja2V0KSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSnVzdCBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBjYXNlIHdhcyB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZWVyQ2VydGlmaWNhdGVDaGFpbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIF90ZXN0X2dldFBlZXJDZXJ0aWZpY2F0ZUNoYWluKCkgeworICAgICAgICBpZiAobm9GcmVlUG9ydCB8fCBub1NvY2tldCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgCVNTTFNlc3Npb24gc2VzID0gbmV3IE15U1NMU2Vzc2lvbigpOworICAgICAgICBTU0xTZXNzaW9uIHNlcyA9IG5ldyBNeVNTTFNlc3Npb24oKTsKICAgICAgICAgSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQgZXZlbnQgPSBuZXcgSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQoc29jLCBzZXMpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZXZlbnQuZ2V0UGVlckNlcnRpZmljYXRlQ2hhaW4oKTsKQEAgLTE2MCwxMSArMjExLDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2dldFBlZXJDZXJ0aWZpY2F0ZXMoKSB7Ci0gICAgCWlmIChub0ZyZWVQb3J0IHx8IG5vU29ja2V0KSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSnVzdCBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBjYXNlIHdhcyB0ZXN0ZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZWVyQ2VydGlmaWNhdGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgX3Rlc3RfZ2V0UGVlckNlcnRpZmljYXRlcygpIHsKKyAgICAgICAgaWYgKG5vRnJlZVBvcnQgfHwgbm9Tb2NrZXQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgIAlTU0xTZXNzaW9uIHNlcyA9IG5ldyBNeVNTTFNlc3Npb24oKTsKKyAgICAgICAgU1NMU2Vzc2lvbiBzZXMgPSBuZXcgTXlTU0xTZXNzaW9uKCk7CiAgICAgICAgIEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50IGV2ZW50ID0gbmV3IEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50KHNvYywgc2VzKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGV2ZW50LmdldFBlZXJDZXJ0aWZpY2F0ZXMoKTsKQEAgLTE3Niw3ICsyMzYsMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5IYW5kc2hha2VDb21wbGV0ZWRFdmVudCNnZXRQZWVyUHJpbmNpcGFsKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBlZXJQcmluY2lwYWwoKQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkp1c3QgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24gY2FzZSB3YXMgdGVzdGVkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGVlclByaW5jaXBhbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFBlZXJQcmluY2lwYWwoKQogICAgICAgICB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24gewogICAgICAgICBpZiAobm9GcmVlUG9ydCB8fCBub1NvY2tldCkgcmV0dXJuOwogICAgICAgICBTU0xTZXNzaW9uIHNlcyA9IG5ldyBNeVNTTFNlc3Npb24oKTsKQEAgLTE4NCwyNiArMjUzLDQ0IEBACiAgICAgICAgIFByaW5jaXBhbCBwcCAgICAgPSBldmVudC5nZXRQZWVyUHJpbmNpcGFsKCk7CiAgICAgICAgIFByaW5jaXBhbCBzZXNfcHAgPSBzZXMuZ2V0UGVlclByaW5jaXBhbCgpOyAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdmFsdWUgb2YgcGVlciBwcmluY2lwYWwiLAotICAgICAgICAJCXBwLCBzZXNfcHApOworICAgICAgICAgICAgICAgIHBwLCBzZXNfcHApOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50I2dldFNlc3Npb24oKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2Vzc2lvbigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2Vzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFNlc3Npb24oKSB7CiAgICAgICAgIGlmIChub0ZyZWVQb3J0IHx8IG5vU29ja2V0KSByZXR1cm47CiAgICAgICAgIFNTTFNlc3Npb24gc2VzID0gbmV3IE15U1NMU2Vzc2lvbigpOwogICAgICAgICBIYW5kc2hha2VDb21wbGV0ZWRFdmVudCBldmVudCA9IG5ldyBIYW5kc2hha2VDb21wbGV0ZWRFdmVudChzb2MsIHNlcyk7CiAgICAgICAgIFNTTFNlc3Npb24gcyA9IGV2ZW50LmdldFNlc3Npb24oKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdmFsdWUgb2Ygc2Vzc2lvbiIsIHMsIHNlcyk7CiAgICAgICAgIGFzc2VydE51bGwoIlNlc3Npb24gdmFsdWUgaXMgbm90IG51bGwiLAotICAgICAgICAJCW5ldyBIYW5kc2hha2VDb21wbGV0ZWRFdmVudChzb2MsIG51bGwpLmdldFNlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgbmV3IEhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50KHNvYywgbnVsbCkuZ2V0U2Vzc2lvbigpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5IYW5kc2hha2VDb21wbGV0ZWRFdmVudCNnZXRTb2NrZXQoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U29ja2V0KCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTb2NrZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRTb2NrZXQoKSB7CiAgICAgICAgIGlmIChub0ZyZWVQb3J0IHx8IG5vU29ja2V0KSByZXR1cm47CiAgICAgICAgIFNTTFNlc3Npb24gc2VzID0gbmV3IE15U1NMU2Vzc2lvbigpOwogICAgICAgICBIYW5kc2hha2VDb21wbGV0ZWRFdmVudCBldmVudCA9IG5ldyBIYW5kc2hha2VDb21wbGV0ZWRFdmVudChzb2MsIHNlcyk7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0h0dHBzVVJMQ29ubmVjdGlvblRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvSHR0cHNVUkxDb25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IDllYjliOTYuLjgzOTUzYTIgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvSHR0cHNVUkxDb25uZWN0aW9uVGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvSHR0cHNVUkxDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC0xOCw2ICsxOCwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKQEAgLTM2LDQwICs0MSw2OSBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogCisKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPkh0dHBzVVJMQ29ubmVjdGlvbjwvY29kZT4gY2xhc3MgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLgogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoSHR0cHNVUkxDb25uZWN0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBIdHRwc1VSTENvbm5lY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbiNIdHRwc1VSTENvbm5lY3Rpb24oamF2YV9uZXRfVVJMKSAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCQl0cnkgewotCQkJbmV3IE15SHR0cHNVUkxDb25uZWN0aW9uKG5ldyBVUkwoImh0dHBzOi8vcHMubm9zZXIuY29tIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW5ldyBNeUh0dHBzVVJMQ29ubmVjdGlvbihudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQorICAgIAorICAgIC8qKgorICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbiNIdHRwc1VSTENvbm5lY3Rpb24oamF2YV9uZXRfVVJMKSAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiSHR0cHNVUkxDb25uZWN0aW9uIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1VSTC5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBNeUh0dHBzVVJMQ29ubmVjdGlvbihuZXcgVVJMKCJodHRwczovL3d3dy5mb3J0aWZ5Lm5ldCIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgTXlIdHRwc1VSTENvbm5lY3Rpb24obnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbiNnZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllcigpIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfZ2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIoKSB7Ci0JCUhvc3RuYW1lVmVyaWZpZXIgdmVyaWZ5ZXIgPQotCQkJSHR0cHNVUkxDb25uZWN0aW9uLmdldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKCk7Ci0JCWFzc2VydE5vdE51bGwoIkRlZmF1bHQgaG9zdG5hbWUgdmVyaWZ5ZXIgaXMgbnVsbCIsIHZlcmlmeWVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uI2dldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KCkgCi0JICovCisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uI2dldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKCkgCisgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9nZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllcigpIHsKKyAgICAgICAgSG9zdG5hbWVWZXJpZmllciB2ZXJpZnllciA9CisgICAgICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24uZ2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRGVmYXVsdCBob3N0bmFtZSB2ZXJpZnllciBpcyBudWxsIiwgdmVyaWZ5ZXIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb24jZ2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkoKSAKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2dldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KCkgewogICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNmID0gSHR0cHNVUkxDb25uZWN0aW9uLmdldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KCk7CiAgICAgICAgIGlmICghc2YuZXF1YWxzKFNTTFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpKSkgewpAQCAtODAsMTkgKzExNCwzNyBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbiNnZXRIb3N0bmFtZVZlcmlmaWVyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SG9zdG5hbWVWZXJpZmllciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfZ2V0SG9zdG5hbWVWZXJpZmllcigpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24gY29uID0gbmV3IE15SHR0cHNVUkxDb25uZWN0aW9uKAotICAgICAgICAJCW5ldyBVUkwoImh0dHBzOi8vcHMubm9zZXIuY29tIikpOwotCQlIb3N0bmFtZVZlcmlmaWVyIHZlcmlmeWVyID0gY29uLmdldEhvc3RuYW1lVmVyaWZpZXIoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiSG9zdG5hbWUgdmVyaWZ5ZXIgaXMgbnVsbCIsIHZlcmlmeWVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdmFsdWUgb2YgaG9zdG5hbWUgdmVyaXJmeWVyIiwgCi0JCQkJSHR0cHNVUkxDb25uZWN0aW9uLmdldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKCksIHZlcmlmeWVyKTsKKyAgICAgICAgICAgICAgICBuZXcgVVJMKCJodHRwczovL3d3dy5mb3J0aWZ5Lm5ldCIpKTsKKyAgICAgICAgSG9zdG5hbWVWZXJpZmllciB2ZXJpZnllciA9IGNvbi5nZXRIb3N0bmFtZVZlcmlmaWVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkhvc3RuYW1lIHZlcmlmeWVyIGlzIG51bGwiLCB2ZXJpZnllcik7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHZhbHVlIG9mIGhvc3RuYW1lIHZlcmlyZnllciIsIAorICAgICAgICAgICAgICAgIEh0dHBzVVJMQ29ubmVjdGlvbi5nZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllcigpLCB2ZXJpZnllcik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uI2dldExvY2FsUHJpbmNpcGFsKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9jYWxQcmluY2lwYWwiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2dldExvY2FsUHJpbmNpcGFsKCkgewogICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24gY29uID0gbmV3IE15SHR0cHNVUkxDb25uZWN0aW9uKG51bGwpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJMb2NhbCBwcmluY2lwYWwgaXMgbnVsbCIsIGNvbi5nZXRMb2NhbFByaW5jaXBhbCgpKTsKQEAgLTEwMSwyMCArMTUzLDM4IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uI2dldFBlZXJQcmluY2lwYWwoKQogICAgICAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfZ2V0UGVlclByaW5jaXBhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZWVyUHJpbmNpcGFsIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9nZXRQZWVyUHJpbmNpcGFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEh0dHBzVVJMQ29ubmVjdGlvbiBjb24gPSBuZXcgTXlIdHRwc1VSTENvbm5lY3Rpb24oCi0gICAgICAgIAkJbmV3IFVSTCgiaHR0cHM6Ly9wcy5ub3Nlci5jb20iKSk7CisgICAgICAgICAgICAgICAgbmV3IFVSTCgiaHR0cHM6Ly93d3cuZm9ydGlmeS5uZXQiKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQcmluY2lwYWwgcCA9IGNvbi5nZXRQZWVyUHJpbmNpcGFsKCk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJQcmluY2lwYWwgaXMgbnVsbCIsIHApOwogICAgICAgICB9IGNhdGNoIChTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAlmYWlsKCJVbmV4cGVjdGVkIFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbiNnZXRTU0xTb2NrZXRGYWN0b3J5KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U1NMU29ja2V0RmFjdG9yeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfZ2V0U1NMU29ja2V0RmFjdG9yeSgpIHsKICAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uIGNvbiA9IG5ldyBNeUh0dHBzVVJMQ29ubmVjdGlvbihudWxsKTsKICAgICAgICAgU1NMU29ja2V0RmFjdG9yeSBzZiA9IGNvbi5nZXRTU0xTb2NrZXRGYWN0b3J5KCk7CkBAIC0xMjYsMTggKzE5NiwzNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbiNzZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTm90IG51bGwgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0hvc3RuYW1lVmVyaWZpZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3Rfc2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24uc2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIobnVsbCk7CiAgICAgICAgICAgICBmYWlsKCJObyBleHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCS8vIGV4cGVjdGVkCisgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uI3NldEhvc3RuYW1lVmVyaWZpZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vdCBudWxsIHBhcmFtZXRlciBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRIb3N0bmFtZVZlcmlmaWVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0hvc3RuYW1lVmVyaWZpZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3Rfc2V0SG9zdG5hbWVWZXJpZmllcigpIHsKICAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uIGNvbiA9IG5ldyBNeUh0dHBzVVJMQ29ubmVjdGlvbihudWxsKTsKICAgICAgICAgdHJ5IHsKQEAgLTE1MCw2ICsyMzgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb24jc2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vdCBudWxsIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NTTFNvY2tldEZhY3RvcnkuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3Rfc2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24uc2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkobnVsbCk7CkBAIC0xNjEsNiArMjU4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uI3NldFNTTFNvY2tldEZhY3RvcnkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk5vdCBudWxsIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFNTTFNvY2tldEZhY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U1NMU29ja2V0RmFjdG9yeS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9zZXRTU0xTb2NrZXRGYWN0b3J5KCkgewogICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24gY29uID0gbmV3IE15SHR0cHNVUkxDb25uZWN0aW9uKG51bGwpOwogICAgICAgICB0cnkgewpAQCAtMTg4LDE1ICsyOTQsMTUgQEAKICAgICAgKiBAc2VlIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uI2dldExvY2FsQ2VydGlmaWNhdGVzKCkKICAgICAgKi8KICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpIHsKLSAgICAJQ2VydGlmaWNhdGUgY2VydCA9IG51bGw7Ci0gICAgCXRyeSB7Ci0gICAgCQlDZXJ0aWZpY2F0ZUZhY3RvcnkgY2YgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7Ci0gICAgCQlieXRlW10gYmFyciA9IFRlc3RVdGlscy5nZXRYNTA5Q2VydGlmaWNhdGVfdjEoKTsKLSAgICAJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYXJyKTsKLSAgICAJCWNlcnQgPSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGJpcyk7Ci0gICAgCX0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIHNlKSB7Ci0gICAgCQljZXJ0ID0gbnVsbDsKLSAgICAJfQorICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgICAgIGJ5dGVbXSBiYXJyID0gVGVzdFV0aWxzLmdldFg1MDlDZXJ0aWZpY2F0ZV92MSgpOworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhcnIpOworICAgICAgICAgICAgY2VydCA9IGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoYmlzKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIGNlcnQgPSBudWxsOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBjZXJ0ID09IG51bGwgPyBudWxsIDogbmV3IENlcnRpZmljYXRlW117Y2VydH07CiAgICAgfQogCkBAIC0yMDUsMTUgKzMxMSwxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldFNlcnZlckNlcnRpZmljYXRlcygpCiAgICAgICAgICAgICB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24gewotICAgIAlDZXJ0aWZpY2F0ZSBjZXJ0ID0gbnVsbDsKLSAgICAJdHJ5IHsKLSAgICAJCUNlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKLSAgICAJCWJ5dGVbXSBiYXJyID0gVGVzdFV0aWxzLmdldFg1MDlDZXJ0aWZpY2F0ZV92MygpOwotICAgIAkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhcnIpOwotICAgIAkJY2VydCA9IGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoYmlzKTsKLSAgICAJfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gc2UpIHsKLSAgICAJCWNlcnQgPSBudWxsOwotICAgIAl9CisgICAgICAgIENlcnRpZmljYXRlIGNlcnQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworICAgICAgICAgICAgYnl0ZVtdIGJhcnIgPSBUZXN0VXRpbHMuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCk7CisgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFycik7CisgICAgICAgICAgICBjZXJ0ID0gY2YuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShiaXMpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgY2VydCA9IG51bGw7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNlcnQgPT0gbnVsbCA/IG51bGwgOiBuZXcgQ2VydGlmaWNhdGVbXXtjZXJ0fTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnkxVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyRmFjdG9yeTFUZXN0LmphdmEKaW5kZXggODIzMmMwOC4uNjJkMWM5MSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyRmFjdG9yeTFUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyRmFjdG9yeTFUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC00Myw3ICs0OCw3IEBACiAgKiBUZXN0cyBmb3IgPGNvZGU+S2V5TWFuYWdlckZhY3Rvcnk8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KICAqIAogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5TWFuYWdlckZhY3RvcnkuY2xhc3MpCiBwdWJsaWMgY2xhc3MgS2V5TWFuYWdlckZhY3RvcnkxVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzcnZLZXlNYW5hZ2VyRmFjdG9yeSA9ICJLZXlNYW5hZ2VyRmFjdG9yeSI7CkBAIC05OCwyOCArMTAzLDQ2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeSNnZXRBbGdvcml0aG0oKSAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRBbGdvcml0aG0oKQogICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsCi0gICAgICAgIAkJZGVmYXVsdEFsZ29yaXRobSwKLSAgICAgICAgCQlLZXlNYW5hZ2VyRmFjdG9yeQotICAgICAgICAJCS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKS5nZXRBbGdvcml0aG0oKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdEFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKS5nZXRBbGdvcml0aG0oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsCi0gICAgICAgIAkJZGVmYXVsdEFsZ29yaXRobSwKLSAgICAgICAgCQlLZXlNYW5hZ2VyRmFjdG9yeQotICAgICAgICAJCS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLCBkZWZhdWx0UHJvdmlkZXJOYW1lKQotICAgICAgICAJCS5nZXRBbGdvcml0aG0oKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdEFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLCBkZWZhdWx0UHJvdmlkZXJOYW1lKQorICAgICAgICAgICAgICAgIC5nZXRBbGdvcml0aG0oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsCi0gICAgICAgIAkJZGVmYXVsdEFsZ29yaXRobSwKLSAgICAgICAgCQlLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLCBkZWZhdWx0UHJvdmlkZXIpCi0gICAgICAgIAkJLmdldEFsZ29yaXRobSgpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtLAorICAgICAgICAgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0sIGRlZmF1bHRQcm92aWRlcikKKyAgICAgICAgICAgICAgICAuZ2V0QWxnb3JpdGhtKCkpOwogICAgIH0KIAotICAgCS8qKgorICAgICAgIC8qKgogICAgICAqICBUZXN0IGZvciA8Y29kZT5nZXREZWZhdWx0QWxnb3JpdGhtKCk8L2NvZGU+IG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyB2YWx1ZSB3aGljaCBpcyBzcGVjaWZvZWQgaW4gc2VjdXJpdHkgcHJvcGVydHkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdEFsZ29yaXRobSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdEFsZ29yaXRobSgpIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKQEAgLTE0OSw2ICsxNzIsMTUgQEAKICAgICAgKiByZXR1cm5zIHNlY3VyaXR5IHByb3BlcnR5ICJzc2wuS2V5TWFuYWdlckZhY3RvcnkuYWxnb3JpdGhtIjsKICAgICAgKiByZXR1cm5zIGluc3RhbmNlIG9mIEtleU1hbmFnZXJGYWN0b3J5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmcwMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOwpAQCAtMTcwLDYgKzIwMiwxNSBAQAogICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsOwogICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbm90IGNvcnJlY3Q7CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmcwMigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKG51bGwpOwpAQCAtMTkyLDYgKzIzMywxNSBAQAogICAgICAqIG1ldGhvZCAKICAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsIG9yIGVtcHR5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nMDEoKSB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewpAQCAtMjIwLDYgKzI3MCwxNSBAQAogICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsOwogICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbm90IGNvcnJlY3Q7CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nMDIoKSB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOwpAQCAtMjQ4LDYgKzMwNywxNSBAQAogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaGFzCiAgICAgICogaW52YWxpZCB2YWx1ZQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZzAzKCkKICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CkBAIC0yNzIsNiArMzQwLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgU3RyaW5nIHByb3ZpZGVyKTwvY29kZT4KICAgICAgKiBtZXRob2QgQXNzZXJ0aW9uOiByZXR1cm5zIGluc3RhbmNlIG9mIEtleU1hbmFnZXJGYWN0b3J5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nMDQoKQogICAgICAgICB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewpAQCAtMjk3LDYgKzM3NCwxNSBAQAogICAgICAqIG1ldGhvZCAKICAgICAgKiBBc3NlcnRpb246IHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIwMSgpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewpAQCAtMzIwLDYgKzQwNiwxNSBAQAogICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBudWxsOwogICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbm90IGNvcnJlY3Q7CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIwMigpIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKQEAgLTM0Niw2ICs0NDEsMTUgQEAKICAgICAgKiBtZXRob2QgCiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIGluc3RhbmNlIG9mIEtleU1hbmFnZXJGYWN0b3J5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIwMygpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewpAQCAtMzY3LDYgKzQ3MSwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPktleU1hbmFnZXJGYWN0b3J5PC9jb2RlPiBjb25zdHJ1Y3RvciAKICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgS2V5TWFuYWdlckZhY3Rvcnkgb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIktleU1hbmFnZXJGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0tleU1hbmFnZXJGYWN0b3J5U3BpLmNsYXNzLCBQcm92aWRlci5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CkBAIC00MDQsNDEgKzUxNyw1OSBAQAogICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gCiAgICAgICogQHRocm93cyBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRLZXlNYW5hZ2VycygpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEtleU1hbmFnZXJzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfZ2V0S2V5TWFuYWdlcnMoKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaWYgKCFERUZTdXBwb3J0ZWQpIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKLSAgICAJS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSk7Ci0gICAgCUtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0gICAgCUlucHV0U3RyZWFtIHYxaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKENsYXNzTG9hZGVyCi0gICAgCQkJLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImtleXN0b3JlLmprcyIpLmdldEZpbGUoKSk7Ci0gICAgCWNoYXJbXSBwYXNzID0gInBhc3N3b3JkIi50b0NoYXJBcnJheSgpOwotICAgIAlrZXlTdG9yZS5sb2FkKHYxaW4sIHBhc3MpOwotICAgIAl2MWluLmNsb3NlKCk7Ci0gICAgCWttZi5pbml0KGtleVN0b3JlLCBwYXNzKTsKLSAgICAJYXNzZXJ0Tm90TnVsbCgiS2V5IG1hbmFnZXIgYXJyYXkgaXMgbnVsbCIsIGttZi5nZXRLZXlNYW5hZ2VycygpKTsKLSAgICAJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2l6ZSBvZiBhcnJheSIsCi0gICAgCQkJMSwga21mLmdldEtleU1hbmFnZXJzKCkubGVuZ3RoKTsKKyAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKKyAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSk7CisgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgICAgIElucHV0U3RyZWFtIHYxaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKENsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImtleXN0b3JlLmprcyIpLmdldEZpbGUoKSk7CisgICAgICAgIGNoYXJbXSBwYXNzID0gInBhc3N3b3JkIi50b0NoYXJBcnJheSgpOworICAgICAgICBrZXlTdG9yZS5sb2FkKHYxaW4sIHBhc3MpOworICAgICAgICB2MWluLmNsb3NlKCk7CisgICAgICAgIGttZi5pbml0KGtleVN0b3JlLCBwYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiS2V5IG1hbmFnZXIgYXJyYXkgaXMgbnVsbCIsIGttZi5nZXRLZXlNYW5hZ2VycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2l6ZSBvZiBhcnJheSIsCisgICAgICAgICAgICAgICAgMSwga21mLmdldEtleU1hbmFnZXJzKCkubGVuZ3RoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeSNnZXRQcm92aWRlcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByb3ZpZGVyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcm92aWRlcigpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpZiAoIURFRlN1cHBvcnRlZCkgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOworICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsCi0gICAgICAgIAkJZGVmYXVsdFByb3ZpZGVyLAotICAgICAgICAJCUtleU1hbmFnZXJGYWN0b3J5Ci0gICAgICAgIAkJLmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0pLmdldFByb3ZpZGVyKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKS5nZXRQcm92aWRlcigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLAotICAgICAgICAJCWRlZmF1bHRQcm92aWRlciwKLSAgICAgICAgCQlLZXlNYW5hZ2VyRmFjdG9yeQotICAgICAgICAJCS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLCBkZWZhdWx0UHJvdmlkZXJOYW1lKQotICAgICAgICAJCS5nZXRQcm92aWRlcigpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgS2V5TWFuYWdlckZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyTmFtZSkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvdmlkZXIoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwKLSAgICAgICAgCQlkZWZhdWx0UHJvdmlkZXIsCi0gICAgICAgIAkJS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyKQotICAgICAgICAJCS5nZXRQcm92aWRlcigpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyKQorICAgICAgICAgICAgICAgIC5nZXRQcm92aWRlcigpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0Niw2ICs1NzcsMTUgQEAKICAgICAgKiA8Y29kZT5nZXRLZXlNYW5hZ2VycygpPC9jb2RlPiAKICAgICAgKiBBc3NlcnRpb246IHJldHVybnMgbm90IGVtcHR5IEtleU1hbmFnZXIgYXJyYXkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJLZXlTdG9yZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7S2V5U3RvcmUuY2xhc3MsIGNoYXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0TGphdmFfc2VjdXJpdHlfS2V5U3RvcmUkQygpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uLCBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHsKQEAgLTQ5Miw2ICs2MzIsMTUgQEAKICAgICAgKiBBc3NlcnRpb246CiAgICAgICogdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gd2hlbiBwYXJhbXMgaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkV4Y2VwdGlvbiBjYXNlIHdhcyBjaGVja2VkIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge01hbmFnZXJGYWN0b3J5UGFyYW1ldGVycy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0TGphdmF4X25ldF9zc2xfTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzKCkKICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5MlRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnkyVGVzdC5qYXZhCmluZGV4IGRhNTM0YjAuLmYxODY5MjMgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnkyVGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnkyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKQEAgLTM3LDcgKzQyLDcgQEAKICAqIFRlc3RzIGZvciBLZXlNYW5hZ2VyRmFjdG9yeSBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMKICAqIAogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoS2V5TWFuYWdlckZhY3RvcnkuY2xhc3MpIAogcHVibGljIGNsYXNzIEtleU1hbmFnZXJGYWN0b3J5MlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNydktleU1hbmFnZXJGYWN0b3J5ID0gIktleU1hbmFnZXJGYWN0b3J5IjsKICAgICAKQEAgLTEyNSw2ICsxMzAsMTUgQEAKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG5vdCBjb3JyZWN0OwogICAgICAqIHJldHVybnMgS2V5TWFuYWdlckZhY3Rvcnkgb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShudWxsKTsKQEAgLTE2Miw2ICsxNzYsMTUgQEAKICAgICAgKiB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBhdmFpbGFibGU7CiAgICAgICogcmV0dXJucyBLZXlNYW5hZ2VyRmFjdG9yeSBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKQEAgLTIzMCw2ICsyNTMsMTUgQEAKICAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbDsKICAgICAgKiByZXR1cm5zIEtleU1hbmFnZXJGYWN0b3J5IG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9Qcm92aWRlcigpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5U3BpVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyRmFjdG9yeVNwaVRlc3QuamF2YQppbmRleCAyMzliMzU0Li5mNmEyZTk2IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5U3BpVGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnlTcGlUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOwpAQCAtMjgsNiArMzMsNyBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKEtleU1hbmFnZXJGYWN0b3J5U3BpLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBLZXlNYW5hZ2VyRmFjdG9yeVNwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIGNsYXNzIE1vY2tLZXlNYW5hZ2VyRmFjdG9yeVNwaSBleHRlbmRzIEtleU1hbmFnZXJGYWN0b3J5U3BpIHsKQEAgLTY0LDYgKzcwLDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlckZhY3RvcnlTcGkjS2V5TWFuYWdlckZhY3RvcnlTcGkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJLZXlNYW5hZ2VyRmFjdG9yeVNwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja0tleU1hbmFnZXJGYWN0b3J5U3BpKCk7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTENvbnRleHQxVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xDb250ZXh0MVRlc3QuamF2YQppbmRleCBjOWZlYmIzLi5iZTNiNmQxIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTENvbnRleHQxVGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMQ29udGV4dDFUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtNDgsNyArNTMsNyBAQAogICogVGVzdHMgZm9yIDxjb2RlPlNTTENvbnRleHQ8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KICAqIAogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoU1NMQ29udGV4dC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU1NMQ29udGV4dDFUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNydlNTTENvbnRleHQgPSAiU1NMQ29udGV4dCI7CkBAIC05NSw2ICsxMDAsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5TU0xDb250ZXh0PC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IHJldHVybnMKICAgICAgKiBTU0xDb250ZXh0IG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTU0xDb250ZXh0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NTTENvbnRleHRTcGkuY2xhc3MsIFByb3ZpZGVyLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YXhfbmV0X3NzbF9TU0xDb250ZXh0U3BpTGphdmFfc2VjdXJpdHlfUHJvdmlkZXJMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHsKQEAgLTE0MSw2ICsxNTUsMTUgQEAKICAgICAgKiBAdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCNjcmVhdGVTU0xFbmdpbmUoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZVNTTEVuZ2luZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU1NMRW5naW5lKCkgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgZmFpbChOb3RTdXBwb3J0TXNnKTsKICAgICAgICAgU1NMQ29udGV4dFNwaSBzcGkgPSBuZXcgTXlTU0xDb250ZXh0U3BpKCk7CkBAIC0xNTUsNiArMTc4LDE1IEBACiAgICAgICogQHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIAogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQjY3JlYXRlU1NMRW5naW5lKGphdmEubGFuZy5TdHJpbmcsIGludCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVTU0xFbmdpbmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU1NMRW5naW5lTGphdmFfbGFuZ19TdHJpbmdJKCkKICAgICAgICAgdGhyb3dzIEtleU1hbmFnZW1lbnRFeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgZmFpbChOb3RTdXBwb3J0TXNnKTsKQEAgLTE2Miw3ICsxOTQsNyBAQAogICAgICAgICBTU0xDb250ZXh0IHNzbENvbnRleHQgPSBuZXcgbXlTU0xDb250ZXh0KHNwaSwgZGVmYXVsdFByb3ZpZGVyLAogICAgICAgICAgICAgICAgIGRlZmF1bHRQcm90b2NvbCk7CiAgICAgICAgIHNzbENvbnRleHQuaW5pdChudWxsLCBudWxsLCBuZXcgU2VjdXJlUmFuZG9tKCkpOyAgICAgICAgCi0gICAgICAgIFNTTEVuZ2luZSBzc2xFbmdpbmUgPSBzc2xDb250ZXh0LmNyZWF0ZVNTTEVuZ2luZSgicHMubm9zZXIuY29tIiwgODApOworICAgICAgICBTU0xFbmdpbmUgc3NsRW5naW5lID0gc3NsQ29udGV4dC5jcmVhdGVTU0xFbmdpbmUoInd3dy5mb3J0aWZ5Lm5ldCIsIDgwKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU1NMIGVuZ2luZSBpcyBudWxsIiwgc3NsRW5naW5lKTsKICAgICB9CiAKQEAgLTE3MSw2ICsyMDMsMTUgQEAKICAgICAgKiA8Y29kZT5nZXRTZXJ2aWNlU2Vzc2lvbkNvbnRleHQoKTwvY29kZT4KICAgICAgKiBtZXRob2RzIEFzc2VydGlvbjogcmV0dXJucyBjb3JyZXNwb25kZW50IG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRDbGllbnRTZXNzaW9uQ29udGV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50U2Vzc2lvbkNvbnRleHQoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CkBAIC0xODAsOSArMjIxLDkgQEAKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU1NMQ29udGV4dCBvYmplY3RzIHdlcmUgbm90IGNyZWF0ZWQiLCBzc2xDKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzc2xDLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDbGllbnQgc2Vzc2lvbiBpcyBpbmNvcnJlY3RseSBpbnN0YW50aWF0ZWQiLCAKLSAgICAgICAgICAgIAkJc3NsQ1tpXS5nZXRDbGllbnRTZXNzaW9uQ29udGV4dCgpIGluc3RhbmNlb2YgU1NMU2Vzc2lvbkNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBzc2xDW2ldLmdldENsaWVudFNlc3Npb25Db250ZXh0KCkgaW5zdGFuY2VvZiBTU0xTZXNzaW9uQ29udGV4dCk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJTZXJ2ZXIgc2Vzc2lvbiBpcyBpbmNvcnJlY3RseSBpbnN0YW50aWF0ZWQiLCAKLSAgICAgICAgICAgIAkJc3NsQ1tpXS5nZXRTZXJ2ZXJTZXNzaW9uQ29udGV4dCgpIGluc3RhbmNlb2YgU1NMU2Vzc2lvbkNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBzc2xDW2ldLmdldFNlcnZlclNlc3Npb25Db250ZXh0KCkgaW5zdGFuY2VvZiBTU0xTZXNzaW9uQ29udGV4dCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5MCw2ICsyMzEsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgcHJvdG9jb2wpPC9jb2RlPiBtZXRob2QgQXNzZXJ0aW9uOgogICAgICAqIHJldHVybnMgU1NMQ29udGV4dCBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZzAxKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRNc2cpOwpAQCAtMjEwLDYgKzI2MCwxNSBAQAogICAgICAqIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHByb3RvY29sIGlzIG51bGw7IHRocm93cwogICAgICAqIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIHByb3RvY29sIGlzIG5vdCBjb3JyZWN0OwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nMDIoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTU0xDb250ZXh0LmdldEluc3RhbmNlKG51bGwpOwpAQCAtMjMyLDYgKzI5MSwxNSBAQAogICAgICAqIG1ldGhvZCBBc3NlcnRpb246IHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBudWxsCiAgICAgICogb3IgZW1wdHkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcwMSgpIHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiwKICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CkBAIC0yNTgsNiArMzI2LDE1IEBACiAgICAgICogbWV0aG9kIEFzc2VydGlvbjogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcHJvdG9jb2wgaXMgbnVsbDsKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gcHJvdG9jb2wgaXMgbm90IGNvcnJlY3Q7CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nMDIoKSB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKQEAgLTI4NCw2ICszNjEsMTUgQEAKICAgICAgKiBtZXRob2QgQXNzZXJ0aW9uOiB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gd2hlbiBwcm92aWRlciBoYXMKICAgICAgKiBpbnZhbGlkIHZhbHVlCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nMDMoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CkBAIC0zMDYsNiArMzkyLDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgcHJvdmlkZXIpPC9jb2RlPgogICAgICAqIG1ldGhvZCBBc3NlcnRpb246IHJldHVybnMgaW5zdGFuY2Ugb2YgU1NMQ29udGV4dAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZzA0KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKQEAgLTMyOSw2ICs0MjQsMTUgQEAKICAgICAgKiBUZXN0IGZvciA8Y29kZT5nZXRJbnN0YW5jZShTdHJpbmcgcHJvdG9jb2wsIFByb3ZpZGVyIHByb3ZpZGVyKTwvY29kZT4KICAgICAgKiBtZXRob2QgQXNzZXJ0aW9uOiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3NlY3VyaXR5X1Byb3ZpZGVyMDEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CkBAIC0zNDksNiArNDUzLDE1IEBACiAgICAgICogbWV0aG9kIEFzc2VydGlvbjogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcHJvdG9jb2wgaXMgbnVsbDsKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gcHJvdG9jb2wgaXMgbm90IGNvcnJlY3Q7CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIwMigpIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydE1zZyk7CkBAIC0zNzMsNiArNDg2LDE1IEBACiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoU3RyaW5nIHByb3RvY29sLCBQcm92aWRlciBwcm92aWRlcik8L2NvZGU+CiAgICAgICogbWV0aG9kIEFzc2VydGlvbjogcmV0dXJucyBpbnN0YW5jZSBvZiBTU0xDb250ZXh0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIwMygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0TXNnKTsKQEAgLTM5Niw2ICs1MTgsMTUgQEAKICAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIAogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQjZ2V0UHJvdG9jb2woKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm90b2NvbCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdG9jb2woKQogICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSBmYWlsKE5vdFN1cHBvcnRNc2cpOwpAQCAtNDAzLDE5ICs1MzQsMTkgQEAKICAgICAgICAgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gbmV3IG15U1NMQ29udGV4dChzcGksIGRlZmF1bHRQcm92aWRlciwKICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdG9jb2wpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm90b2NvbCIsCi0gICAgICAgIAkJZGVmYXVsdFByb3RvY29sLCBzc2xDb250ZXh0LmdldFByb3RvY29sKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHRQcm90b2NvbCwgc3NsQ29udGV4dC5nZXRQcm90b2NvbCgpKTsKICAgICAgICAgc3NsQ29udGV4dCA9IG5ldyBteVNTTENvbnRleHQoc3BpLCBkZWZhdWx0UHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCBwcm90b2NvbCIsIHNzbENvbnRleHQuZ2V0UHJvdG9jb2woKSk7CiAgICAgICAgIHNzbENvbnRleHQgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKGRlZmF1bHRQcm90b2NvbCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3RvY29sIiwKLSAgICAgICAgCQlkZWZhdWx0UHJvdG9jb2wsIHNzbENvbnRleHQuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb3RvY29sLCBzc2xDb250ZXh0LmdldFByb3RvY29sKCkpOwogICAgICAgICBzc2xDb250ZXh0ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShkZWZhdWx0UHJvdG9jb2wsIGRlZmF1bHRQcm92aWRlcik7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3RvY29sIiwKLSAgICAgICAgCQlkZWZhdWx0UHJvdG9jb2wsIHNzbENvbnRleHQuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb3RvY29sLCBzc2xDb250ZXh0LmdldFByb3RvY29sKCkpOwogICAgICAgICBzc2xDb250ZXh0ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShkZWZhdWx0UHJvdG9jb2wsIGRlZmF1bHRQcm92aWRlck5hbWUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm90b2NvbCIsCi0gICAgICAgIAkJZGVmYXVsdFByb3RvY29sLCBzc2xDb250ZXh0LmdldFByb3RvY29sKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHRQcm90b2NvbCwgc3NsQ29udGV4dC5nZXRQcm90b2NvbCgpKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC00MjMsNiArNTU0LDE1IEBACiAgICAgICogQHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiAKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0I2dldFByb3ZpZGVyKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJvdmlkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3ZpZGVyKCkgCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIGZhaWwoTm90U3VwcG9ydE1zZyk7CkBAIC00MzAsMTkgKzU3MCwyOCBAQAogICAgICAgICBTU0xDb250ZXh0IHNzbENvbnRleHQgPSBuZXcgbXlTU0xDb250ZXh0KHNwaSwgZGVmYXVsdFByb3ZpZGVyLAogICAgICAgICAgICAgICAgIGRlZmF1bHRQcm90b2NvbCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwKLSAgICAgICAgCQlkZWZhdWx0UHJvdmlkZXIsIHNzbENvbnRleHQuZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyLCBzc2xDb250ZXh0LmdldFByb3ZpZGVyKCkpOwogICAgICAgICBzc2xDb250ZXh0ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShkZWZhdWx0UHJvdG9jb2wsIGRlZmF1bHRQcm92aWRlcik7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwKLSAgICAgICAgCQlkZWZhdWx0UHJvdmlkZXIsIHNzbENvbnRleHQuZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyLCBzc2xDb250ZXh0LmdldFByb3ZpZGVyKCkpOwogICAgICAgICBzc2xDb250ZXh0ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShkZWZhdWx0UHJvdG9jb2wsIGRlZmF1bHRQcm92aWRlck5hbWUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsCi0gICAgICAgIAkJZGVmYXVsdFByb3ZpZGVyLCBzc2xDb250ZXh0LmdldFByb3ZpZGVyKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlciwgc3NsQ29udGV4dC5nZXRQcm92aWRlcigpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0I2dldFNlcnZsZXRTZXNzaW9uQ29udGV4dCgpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXJ2bGV0U2Vzc2lvbkNvbnRleHQoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZXJ2ZXJTZXNzaW9uQ29udGV4dCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFNlcnZsZXRTZXNzaW9uQ29udGV4dCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgIEtleU1hbmFnZW1lbnRFeGNlcHRpb24sIEtleVN0b3JlRXhjZXB0aW9uLAogICAgICAgICBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIGZhaWwoTm90U3VwcG9ydE1zZyk7CkBAIC00NjIsNyArNjExLDcgQEAKICAgICAgICAgZm9yIChTU0xDb250ZXh0IHNzbENpIDogc3NsQykgewogICAgICAgICAgICAgc3NsQ2kuaW5pdChrbWYuZ2V0S2V5TWFuYWdlcnMoKSwgdG1zLCBuZXcgU2VjdXJlUmFuZG9tKCkpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VydmVyIGNvbnRleHQgaXMgaW5jb3JyZWN0bHkgaW5zdGFudGlhdGVkIiwKLSAgICAgICAgICAgIAkJc3NsQ2kuZ2V0U2VydmVyU2Vzc2lvbkNvbnRleHQoKSBpbnN0YW5jZW9mIFNTTFNlc3Npb25Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgc3NsQ2kuZ2V0U2VydmVyU2Vzc2lvbkNvbnRleHQoKSBpbnN0YW5jZW9mIFNTTFNlc3Npb25Db250ZXh0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDczLDggKzYyMiwxNiBAQAogICAgICAqIG1ldGhvZHMgQXNzZXJ0aW9uOiByZXR1cm5zIGNvcnJlc3BvbmRlbnQgb2JqZWN0CiAgICAgICogCiAgICAgICovCi0gICAgCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VydmVyU29ja2V0RmFjdG9yeSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCisgICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTZXJ2ZXJTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFNlcnZlclNvY2tldEZhY3RvcnkoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiwgS2V5U3RvcmVFeGNlcHRpb24sCiAgICAgICAgICAgICBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKQEAgLTUxMCw3ICs2NjcsMTYgQEAKICAgICAgLyoqCiAgICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQjZ2V0U29ja2V0RmFjdG9yeSgpCiAgICAgICAqLwotICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNvY2tldEZhY3RvcnkoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAorICAgICBAVGVzdEluZm8oCisgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICApCisgICAgIH0pCisgICAgIHB1YmxpYyB2b2lkIF90ZXN0X2dldFNvY2tldEZhY3RvcnkoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiwgS2V5U3RvcmVFeGNlcHRpb24sCiAgICAgICAgICBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHsKICAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSBmYWlsKE5vdFN1cHBvcnRNc2cpOwpAQCAtNTMwLDcgKzY5Niw3IEBACiAgICAgICAgICBmb3IgKFNTTENvbnRleHQgc3NsQ2kgOiBzc2xDKSB7CiAgICAgICAgICAgICAgc3NsQ2kuaW5pdChrbWYuZ2V0S2V5TWFuYWdlcnMoKSwgdG1zLCBuZXcgU2VjdXJlUmFuZG9tKCkpOwogICAgICAgICAgICAgIGFzc2VydFRydWUoIlNvY2tldCBmYWN0b3J5IGlzIGluY29ycmVjdGx5IGluc3RhbnRpYXRlZCIsCi0gICAgICAgICAgICAJCSBzc2xDaS5nZXRTb2NrZXRGYWN0b3J5KCkgaW5zdGFuY2VvZiBTU0xTb2NrZXRGYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgIHNzbENpLmdldFNvY2tldEZhY3RvcnkoKSBpbnN0YW5jZW9mIFNTTFNvY2tldEZhY3RvcnkpOwogICAgICAgICAgfQogICAgICB9CiAKQEAgLTU0Myw3ICs3MDksMTYgQEAKICAgICAgICogICAgIGluaXQoamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyW10sIGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyW10sCiAgICAgICAqICAgICBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKICAgICAgICovCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdCRMamF2YXhfbmV0X3NzbF9LZXlNYW5hZ2VyJExqYXZheF9uZXRfc3NsX1RydXN0TWFuYWdlckxqYXZhX3NlY3VyaXR5X1NlY3VyZVJhbmRvbSgpCisgICAgIEBUZXN0SW5mbygKKyAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgIHB1cnBvc2UgPSAiS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbml0IiwKKyAgICAgICAgICAgbWV0aG9kQXJncyA9IHtLZXlNYW5hZ2VyW10uY2xhc3MsIFRydXN0TWFuYWdlcltdLmNsYXNzLCBTZWN1cmVSYW5kb20uY2xhc3N9CisgICAgICAgICApCisgICAgIH0pCisgICAgIHB1YmxpYyB2b2lkIF90ZXN0X2luaXQkTGphdmF4X25ldF9zc2xfS2V5TWFuYWdlciRMamF2YXhfbmV0X3NzbF9UcnVzdE1hbmFnZXJMamF2YV9zZWN1cml0eV9TZWN1cmVSYW5kb20oKQogICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgZmFpbChOb3RTdXBwb3J0TXNnKTsKICAgICAgICAgIFNTTENvbnRleHRTcGkgc3BpID0gbmV3IE15U1NMQ29udGV4dFNwaSgpOwpAQCAtNTUzLDMxICs3MjgsMzEgQEAKICAgICAgICAgICAgICBzc2xDb250ZXh0LmNyZWF0ZVNTTEVuZ2luZSgpOwogICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFJ1bnRpbWVFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcnRlKSB7Ci0gICAgICAgIAkgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB0cnkgewotICAgICAgICAJIHNzbENvbnRleHQuaW5pdChudWxsLCBudWxsLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgIHNzbENvbnRleHQuaW5pdChudWxsLCBudWxsLCBuZXcgU2VjdXJlUmFuZG9tKCkpOwogCi0gICAgICAgIAkgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoCi0gICAgICAgIAkJCSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOwotICAgICAgICAJIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0gICAgICAgIAkgSW5wdXRTdHJlYW0gdjFpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSk7CisgICAgICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKKyAgICAgICAgICAgICBJbnB1dFN0cmVhbSB2MWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShDbGFzc0xvYWRlcgogICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImtleXN0b3JlLmprcyIpLmdldEZpbGUoKSk7CiAgICAgICAgICAgICAgY2hhcltdIHBhc3N3b3JkID0gInBhc3N3b3JkIi50b0NoYXJBcnJheSgpOwogICAgICAgICAgICAgIGtzLmxvYWQodjFpbiwgcGFzc3dvcmQpOwogICAgICAgICAgICAgIHYxaW4uY2xvc2UoKTsKICAgICAgICAgICAgICBrbWYuaW5pdChrcywgcGFzc3dvcmQpOwotICAgICAgICAJIEtleU1hbmFnZXJbXSBrbSA9IGttZi5nZXRLZXlNYW5hZ2VycygpOwotICAgICAgICAJIHNzbENvbnRleHQuaW5pdChrbSwgbnVsbCwgbmV3IFNlY3VyZVJhbmRvbSgpKTsKLSAgICAgICAgCSAKLSAgICAgICAgCSBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoCi0gICAgICAgIAkJCSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSk7Ci0gICAgICAgIAkgdG1mLmluaXQoa3MpOwotICAgICAgICAJIFRydXN0TWFuYWdlcltdIHRtID0gdG1mLmdldFRydXN0TWFuYWdlcnMoKTsKLSAgICAgICAgCSBzc2xDb250ZXh0LmluaXQobnVsbCwgdG0sIG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgICAgICAgICAgS2V5TWFuYWdlcltdIGttID0ga21mLmdldEtleU1hbmFnZXJzKCk7CisgICAgICAgICAgICAgc3NsQ29udGV4dC5pbml0KGttLCBudWxsLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgIAorICAgICAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpKTsKKyAgICAgICAgICAgICB0bWYuaW5pdChrcyk7CisgICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyW10gdG0gPSB0bWYuZ2V0VHJ1c3RNYW5hZ2VycygpOworICAgICAgICAgICAgIHNzbENvbnRleHQuaW5pdChudWxsLCB0bSwgbmV3IFNlY3VyZVJhbmRvbSgpKTsKICAgICAgICAgIH0gY2F0Y2ggKEtleU1hbmFnZW1lbnRFeGNlcHRpb24ga21lKSB7Ci0gICAgICAgIAkgZmFpbCgiVW5leHBlY3RlZCBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uICIgKyBrbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uICIgKyBrbWUudG9TdHJpbmcoKSk7CiAgICAgICAgICB9CiAgICAgIH0KIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMQ29udGV4dDJUZXN0LmphdmEgYi94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTENvbnRleHQyVGVzdC5qYXZhCmluZGV4IDEyNzdhNDMuLjhkZDRjMjUgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMQ29udGV4dDJUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xDb250ZXh0MlRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YXgubmV0LnNzbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKKwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOwpAQCAtMzAsMTMgKzM1LDE0IEBACiBpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5TcGlFbmdVdGlsczsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogLyoqCiAgKiBUZXN0cyBmb3IgU1NMQ29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMKICAqIAogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoU1NMQ29udGV4dC5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU1NMQ29udGV4dDJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzcnZTU0xDb250ZXh0ID0gIlNTTENvbnRleHQiOwpAQCAtMTQ5LDYgKzE1NSwxNSBAQAogICAgICAqIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gd2hlbiBwcm90b2NvbCBpcyBub3QgY29ycmVjdDsKICAgICAgKiByZXR1cm5zIFNTTENvbnRleHQgb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgCiAgICAgICAgICAgICBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKQEAgLTE4Nyw2ICsyMDIsMTUgQEAKICAgICAgKiB0aHJvd3MgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gd2hlbiBwcm92aWRlciBpcyBhdmFpbGFibGU7CiAgICAgICogcmV0dXJucyBTU0xDb250ZXh0IG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgCiAgICAgICAgICAgICBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHsKQEAgLTI1Miw2ICsyNzYsMTUgQEAKICAgICAgKiB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgbnVsbDsKICAgICAgKiByZXR1cm5zIFNTTENvbnRleHQgb2JqZWN0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJvdmlkZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3NlY3VyaXR5X1Byb3ZpZGVyKCkKICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMQ29udGV4dFNwaVRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMQ29udGV4dFNwaVRlc3QuamF2YQppbmRleCAyMWMyZTc2Li5iYzA4ZTY0IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTENvbnRleHRTcGlUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xDb250ZXh0U3BpVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwogCkBAIC0yOSw2ICszNCw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU1NMQ29udGV4dFNwaS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU1NMQ29udGV4dFNwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIGNsYXNzIE1vY2tTU0xDb250ZXh0U3BpIGV4dGVuZHMgU1NMQ29udGV4dFNwaSB7CkBAIC0xMDIsNiArMTA4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dFNwaSNTU0xDb250ZXh0U3BpKCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU1NMQ29udGV4dFNwaSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja1NTTENvbnRleHRTcGkoKTsKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMRW5naW5lUmVzdWx0VGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVSZXN1bHRUZXN0LmphdmEKaW5kZXggZjljYzk1ZC4uZGJmZmVkNiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVSZXN1bHRUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVSZXN1bHRUZXN0LmphdmEKQEAgLTE3LDE0ICsxNywyMCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCi1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OwogCitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQ7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCisKIC8qKgogICogVGVzdHMgZm9yIFNTTEVuZ2luZVJlc3VsdCBjbGFzcwogICogCiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoU1NMRW5naW5lUmVzdWx0LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTU0xFbmdpbmVSZXN1bHRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCkBAIC00NCw2ICs1MCwxNSBAQAogICAgICAqIGlzIG51bGwgIAogICAgICAqCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRXhjZXB0aW9uIGNhc2VzIHdlcmUgdGVzdGVkIG9ubHkiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTU0xFbmdpbmVSZXN1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U1NMRW5naW5lUmVzdWx0LlN0YXR1cy5jbGFzcywgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YXhfbmV0X3NzbF9TU0xFbmdpbmVSZXN1bHRfU3RhdHVzTGphdmF4X25ldF9zc2xfU1NMRW5naW5lUmVzdWx0X0hhbmRzaGFrZVN0YXR1c0lJKCkgewogICAgIAogICAgICAgICBpbnRbXSBuZWcgPSB7IC0xLCAtMTAsIC0xMDAwLCBJbnRlZ2VyLk1JTl9WQUxVRSwKQEAgLTgxLDEyMiArOTYsMTc1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgPGNvZGU+Ynl0ZXNDb25zdW1lZCgpPC9jb2RlPiBtZXRob2QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiYnl0ZXNDb25zdW1lZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfYnl0ZXNDb25zdW1lZCgpIHsKICAgICAgICAgaW50W10gcG9zID0geyAwLCAxLCAxMDAwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgKEludGVnZXIuTUFYX1ZBTFVFIC0gMSkgfTsKICAgICAgICAgU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBbXSBlblMgPQotICAgICAgICAJU1NMRW5naW5lUmVzdWx0LlN0YXR1cy52YWx1ZXMoKTsKKyAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5TdGF0dXMudmFsdWVzKCk7CiAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgW10gZW5IUyA9Ci0gICAgICAgIAlTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLnZhbHVlcygpOworICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy52YWx1ZXMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlblMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCWZvciAoaW50IGogPSAwOyBqIDwgZW5IUy5sZW5ndGg7IGorKykgewotICAgICAgICAJCWZvciAoaW50IG4gPSAwOyBuIDwgcG9zLmxlbmd0aDsgbisrKSB7Ci0gICAgICAgIAkJCWZvciAoaW50IGwgPSAwOyBsIDwgcG9zLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgIAkJCQlTU0xFbmdpbmVSZXN1bHQgcmVzID0gbmV3IFNTTEVuZ2luZVJlc3VsdChlblNbaV0sCi0gICAgICAgIAkJCQkJCWVuSFNbal0sIHBvc1tuXSwgcG9zW2xdKTsKLSAgICAgICAgCQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGJ5dGVzQ29uc3VtZWQiLCBwb3Nbbl0sCi0gICAgICAgIAkJCQkJCXJlcy5ieXRlc0NvbnN1bWVkKCkpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbkhTLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBwb3MubGVuZ3RoOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBwb3MubGVuZ3RoOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdCByZXMgPSBuZXcgU1NMRW5naW5lUmVzdWx0KGVuU1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5IU1tqXSwgcG9zW25dLCBwb3NbbF0pOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZXNDb25zdW1lZCIsIHBvc1tuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmJ5dGVzQ29uc3VtZWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0IGZvciA8Y29kZT5ieXRlc1Byb2R1Y2VkKCk8L2NvZGU+IG1ldGhvZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJieXRlc1Byb2R1Y2VkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9ieXRlc1Byb2R1Y2VkKCkgewogICAgICAgICBpbnRbXSBwb3MgPSB7IDAsIDEsIDEwMDAsIEludGVnZXIuTUFYX1ZBTFVFLCAoSW50ZWdlci5NQVhfVkFMVUUgLSAxKSB9OwogICAgICAgICBTU0xFbmdpbmVSZXN1bHQuU3RhdHVzIFtdIGVuUyA9Ci0gICAgICAgIAlTU0xFbmdpbmVSZXN1bHQuU3RhdHVzLnZhbHVlcygpOworICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0LlN0YXR1cy52YWx1ZXMoKTsKICAgICAgICAgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBbXSBlbkhTID0KLSAgICAgICAgCVNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMudmFsdWVzKCk7CisgICAgICAgICAgICBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLnZhbHVlcygpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuUy5sZW5ndGg7IGkrKykgewotICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCBlbkhTLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIAkJZm9yIChpbnQgbiA9IDA7IG4gPCBwb3MubGVuZ3RoOyBuKyspIHsKLSAgICAgICAgCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBwb3MubGVuZ3RoOyArK2wpIHsKLSAgICAgICAgCQkJCVNTTEVuZ2luZVJlc3VsdCByZXMgPSBuZXcgU1NMRW5naW5lUmVzdWx0KGVuU1tpXSwKLSAgICAgICAgCQkJCQkJZW5IU1tqXSwgcG9zW25dLCBwb3NbbF0pOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbkhTLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBwb3MubGVuZ3RoOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBwb3MubGVuZ3RoOyArK2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdCByZXMgPSBuZXcgU1NMRW5naW5lUmVzdWx0KGVuU1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5IU1tqXSwgcG9zW25dLCBwb3NbbF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYnl0ZXNQcm9kdWNlZCIsIHBvc1tsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVzLmJ5dGVzUHJvZHVjZWQoKSk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5ieXRlc1Byb2R1Y2VkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0SGFuZHNoYWtlU3RhdHVzKCk8L2NvZGU+IG1ldGhvZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRIYW5kc2hha2VTdGF0dXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEhhbmRzaGFrZVN0YXR1cygpIHsKICAgICAgICAgaW50W10gcG9zID0geyAwLCAxLCAxMDAwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgKEludGVnZXIuTUFYX1ZBTFVFIC0gMSkgfTsKICAgICAgICAgU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBbXSBlblMgPQotICAgICAgICAJU1NMRW5naW5lUmVzdWx0LlN0YXR1cy52YWx1ZXMoKTsKKyAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5TdGF0dXMudmFsdWVzKCk7CiAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgW10gZW5IUyA9Ci0gICAgICAgIAlTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLnZhbHVlcygpOworICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy52YWx1ZXMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlblMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCWZvciAoaW50IGogPSAwOyBqIDwgZW5IUy5sZW5ndGg7IGorKykgewotICAgICAgICAJCWZvciAoaW50IG4gPSAwOyBuIDwgcG9zLmxlbmd0aDsgbisrKSB7Ci0gICAgICAgIAkJCWZvciAoaW50IGwgPSAwOyBsIDwgcG9zLmxlbmd0aDsgKytsKSB7Ci0gICAgICAgIAkJCQlTU0xFbmdpbmVSZXN1bHQgcmVzID0gbmV3IFNTTEVuZ2luZVJlc3VsdChlblNbaV0sCi0gICAgICAgIAkJCQkJCWVuSFNbal0sIHBvc1tuXSwgcG9zW2xdKTsKLSAgICAgICAgCQkgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IEhhbmRzaGFrZVN0YXR1cyIsIGVuSFNbal0sCi0gICAgICAgIAkJICAgICAgICAJCXJlcy5nZXRIYW5kc2hha2VTdGF0dXMoKSk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAl9CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVuSFMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHBvcy5sZW5ndGg7IG4rKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IHBvcy5sZW5ndGg7ICsrbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0IHJlcyA9IG5ldyBTU0xFbmdpbmVSZXN1bHQoZW5TW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbkhTW2pdLCBwb3Nbbl0sIHBvc1tsXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBIYW5kc2hha2VTdGF0dXMiLCBlbkhTW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZ2V0SGFuZHNoYWtlU3RhdHVzKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgPGNvZGU+Z2V0U3RhdHVzKCk8L2NvZGU+IG1ldGhvZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRTdGF0dXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN0YXR1cygpIHsKICAgICAgICAgaW50W10gcG9zID0geyAwLCAxLCAxMDAwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgKEludGVnZXIuTUFYX1ZBTFVFIC0gMSkgfTsKICAgICAgICAgU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBbXSBlblMgPQotICAgICAgICAJU1NMRW5naW5lUmVzdWx0LlN0YXR1cy52YWx1ZXMoKTsKKyAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5TdGF0dXMudmFsdWVzKCk7CiAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgW10gZW5IUyA9Ci0gICAgICAgIAlTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLnZhbHVlcygpOworICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy52YWx1ZXMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlblMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCWZvciAoaW50IGogPSAwOyBqIDwgZW5IUy5sZW5ndGg7IGorKykgewotICAgICAgICAJCWZvciAoaW50IG4gPSAwOyBuIDwgcG9zLmxlbmd0aDsgbisrKSB7Ci0gICAgICAgIAkJCWZvciAoaW50IGwgPSAwOyBsIDwgcG9zLmxlbmd0aDsgKytsKSB7Ci0gICAgICAgIAkJCQlTU0xFbmdpbmVSZXN1bHQgcmVzID0gbmV3IFNTTEVuZ2luZVJlc3VsdChlblNbaV0sCi0gICAgICAgIAkJCQkJCWVuSFNbal0sIHBvc1tuXSwgcG9zW2xdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZW5IUy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgcG9zLmxlbmd0aDsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgcG9zLmxlbmd0aDsgKytsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTU0xFbmdpbmVSZXN1bHQgcmVzID0gbmV3IFNTTEVuZ2luZVJlc3VsdChlblNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuSFNbal0sIHBvc1tuXSwgcG9zW2xdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IFN0YXR1cyIsIGVuU1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVzLmdldFN0YXR1cygpKTsKLSAgICAgICAgCQkJfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlc3QgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ0b1N0cmluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7CiAgICAgICAgIGludFtdIHBvcyA9IHsgMCwgMSwgMTAwMCwgSW50ZWdlci5NQVhfVkFMVUUsIChJbnRlZ2VyLk1BWF9WQUxVRSAtIDEpIH07CiAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgW10gZW5TID0KLSAgICAgICAgCVNTTEVuZ2luZVJlc3VsdC5TdGF0dXMudmFsdWVzKCk7CisgICAgICAgICAgICBTU0xFbmdpbmVSZXN1bHQuU3RhdHVzLnZhbHVlcygpOwogICAgICAgICBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIFtdIGVuSFMgPQotICAgICAgICAJU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy52YWx1ZXMoKTsKKyAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMudmFsdWVzKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5TLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAlmb3IgKGludCBqID0gMDsgaiA8IGVuSFMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgCQlmb3IgKGludCBuID0gMDsgbiA8IHBvcy5sZW5ndGg7IG4rKykgewotICAgICAgICAJCQlmb3IgKGludCBsID0gMDsgbCA8IHBvcy5sZW5ndGg7ICsrbCkgewotICAgICAgICAJCQkJU1NMRW5naW5lUmVzdWx0IHJlcyA9IG5ldyBTU0xFbmdpbmVSZXN1bHQoZW5TW2ldLAotICAgICAgICAJCQkJCQllbkhTW2pdLCBwb3Nbbl0sIHBvc1tsXSk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVuSFMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHBvcy5sZW5ndGg7IG4rKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IHBvcy5sZW5ndGg7ICsrbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0IHJlcyA9IG5ldyBTU0xFbmdpbmVSZXN1bHQoZW5TW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbkhTW2pdLCBwb3Nbbl0sIHBvc1tsXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXN1bHQgb2YgdG9TcmluZygpIG1ldGhvZCBpcyBudWxsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVzLnRvU3RyaW5nKCkpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0IGZvciA8Y29kZT5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzLnZhbHVlcygpPC9jb2RlPiBtZXRob2QKICAgICAgKi8KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIlN0YXR1cyBjbGFzcyBpbmNsdWRlcyB2YWx1ZXMoKSBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidmFsdWVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TU0xFbmdpbmVSZXN1bHRfU3RhdHVzMDEoKSB7CiAgICAgICAgIFNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgW10gZW5TID0gU1NMRW5naW5lUmVzdWx0LlN0YXR1cy52YWx1ZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGFycmF5IG9mIFN0YXR1cyBvYmplY3RzIiwgZW5TLmxlbmd0aCA+IDApOwpAQCAtMjE2LDcgKzI4NCwxNSBAQAogICAgICAqIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiB0aGVyZSBpcyBubyBjb25zdGFuIHdpdGggc3BlY2lmaWVkCiAgICAgICogbmFtZSAKICAgICAgKi8KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIlN0YXR1cyBjbGFzcyBpbmNsdWRlcyB2YWx1ZU9mIG1ldGhvZC4gTnVsbCBwYXJhbWV0ZXIgY2hlY2tpbmcgbWlzc2VkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlT2YiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NTTEVuZ2luZVJlc3VsdF9TdGF0dXMwMigpIHsKICAgICAgICAgU3RyaW5nIFtdIGludmFsaWQgPSB7IiIsICJPSzEiLCAiQlVGRkVSX292ZXJmbG93IiwgIkJVRkZFUl9VTkQiLAogICAgICAgICAgICAgICAgICJDTE9TRURfQ0xPU0VEIiwgIkJhZCBzdHJpbmcgZm9yIHZlcmlmaWNhdGlvbiB2YWx1ZU9mIG1ldGhvZCIKQEAgLTI0MSw3ICszMTcsMTUgQEAKICAgICAvKioKICAgICAgKiBUZXN0IGZvciA8Y29kZT5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLnZhbHVlcygpPC9jb2RlPiBtZXRob2QKICAgICAgKi8KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlRPRE8sCisgICAgICBwdXJwb3NlID0gIkhhbmRzaGFrZVN0YXR1cyBjbGFzcyBpbmNsdWRlcyB2YWx1ZXMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInZhbHVlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMRW5naW5lUmVzdWx0X0hhbmRzaGFrZVN0YXR1czAxKCkgewogICAgICAgICBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIFtdIGVuSFMgPSBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzCiAgICAgICAgICAgICAgICAgLnZhbHVlcygpOwpAQCAtMjY2LDYgKzM1MCwxNSBAQAogICAgICAqIG5hbWUgCiAgICAgICovCiAKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5UT0RPLAorICAgICAgcHVycG9zZSA9ICJIYW5kc2hha2VTdGF0dXMgY2xhc3MgaW5jbHVkZXMgdmFsdWVPZiBtZXRob2QuIE51bGwgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ2YWx1ZU9mIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9TU0xFbmdpbmVSZXN1bHRfSGFuZHNoYWtlU3RhdHVzMDIoKSB7CiAgICAgICAgIFN0cmluZyBbXSBpbnZhbGlkID0geyIiLCAiRklOSVNIRUQxIiwgIk5FRURfdGFzayIsICJORUVEX1VOIiwKICAgICAgICAgICAgICAgICAiTkVFRF9XUkFQX1dSQVAiLCAibm90X0hBTkRTSEFLSU5HIiwgIkJhZCBzdHJpbmcgZm9yIHZlcmlmaWNhdGlvbiB2YWx1ZU9mIG1ldGhvZCIKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMRW5naW5lVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVUZXN0LmphdmEKaW5kZXggNzNlOWU4Yi4uODM2ODM5MSAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFbmdpbmU7CkBAIC0yNiwxMSArMzEsMTMgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAorCisKIC8qKgogICogVGVzdHMgZm9yIFNTTEVuZ2luZSBjbGFzcwogICogCiAgKi8KLQorQFRlc3RUYXJnZXRDbGFzcyhTU0xFbmdpbmUuY2xhc3MpIAogcHVibGljIGNsYXNzIFNTTEVuZ2luZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CkBAIC00MSw2ICs0OCwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPlNTTEVuZ2luZSgpPC9jb2RlPiBjb25zdHJ1Y3RvciBBc3NlcnRpb246IGNyZWF0ZXMKICAgICAgKiBTU0xFbmdpbmUgb2JqZWN0IHdpdGggbnVsbCBob3N0IGFuZCAtMSBwb3J0CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNTTEVuZ2luZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIFNTTEVuZ2luZSBlID0gbmV3IG15U1NMRW5naW5lKCk7CiAgICAgICAgIGFzc2VydE51bGwoZS5nZXRQZWVySG9zdCgpKTsKQEAgLTUzLDYgKzY5LDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgPGNvZGU+U1NMRW5naW5lKFN0cmluZyBob3N0LCBpbnQgcG9ydCk8L2NvZGU+IGNvbnN0cnVjdG9yCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU1NMRW5naW5lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdJMDEoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKICAgICAgICAgaW50IHBvcnQgPSAxMDEwOwogICAgICAgICBTU0xFbmdpbmUgZSA9IG5ldyBteVNTTEVuZ2luZShudWxsLCBwb3J0KTsKQEAgLTY3LDYgKzkyLDE1IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBmb3IgPGNvZGU+U1NMRW5naW5lKFN0cmluZyBob3N0LCBpbnQgcG9ydCk8L2NvZGU+IGNvbnN0cnVjdG9yCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpY2F0aW9uIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU1NMRW5naW5lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgaW50LmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdJMDIoKSB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gIm5ldyBob3N0IjsKICAgICAgICAgaW50IHBvcnQgPSA4MDgwOwpAQCAtODMsMjEgKzExNywzOSBAQAogICAgIC8qKgogICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFBlZXJIb3N0KCk8L2NvZGU+IG1ldGhvZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgcmVhbCBob3N0IG5hbWUgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UGVlckhvc3QiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFBlZXJIb3N0KCkgewogICAgICAgICBTU0xFbmdpbmUgZSA9IG5ldyBteVNTTEVuZ2luZSgpOwogICAgICAgICBhc3NlcnROdWxsKGUuZ2V0UGVlckhvc3QoKSk7Ci0gICAgICAgIGUgPSBuZXcgbXlTU0xFbmdpbmUoInBzLm5vc2VyLmNvbSIsIDgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgaG9zdCBuYW1lIiwJInBzLm5vc2VyLmNvbSIsIGUuZ2V0UGVlckhvc3QoKSk7CisgICAgICAgIGUgPSBuZXcgbXlTU0xFbmdpbmUoInd3dy5mb3J0aWZ5Lm5ldCIsIDgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgaG9zdCBuYW1lIiwgICAgInd3dy5mb3J0aWZ5Lm5ldCIsIGUuZ2V0UGVlckhvc3QoKSk7CiAgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIFRlc3QgZm9yIDxjb2RlPmdldFBlZXJQb3J0KCk8L2NvZGU+IG1ldGhvZAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gb2YgcmVhbCBwb3J0IG51bWJlciBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQZWVyUG9ydCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVlclBvcnQoKSB7CiAgICAgICAgIFNTTEVuZ2luZSBlID0gbmV3IG15U1NMRW5naW5lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRlZmF1bHQgdmFsdWUgb2YgcGVlciBwb3J0IiwKLSAgICAgICAgCQktMSAsZS5nZXRQZWVyUG9ydCgpKTsKLSAgICAgICAgZSA9IG5ldyBteVNTTEVuZ2luZSgicHMubm9zZXIuY29tIiwgODApOworICAgICAgICAgICAgICAgIC0xICxlLmdldFBlZXJQb3J0KCkpOworICAgICAgICBlID0gbmV3IG15U1NMRW5naW5lKCJ3d3cuZm9ydGlmeS5uZXQiLCA4MCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBlZXIgcG9ydCIsIDgwLCBlLmdldFBlZXJQb3J0KCkpOwogICAgIH0KIApAQCAtMTExLDYgKzE2MywxNSBAQAogICAgICAqIGpkayAxLjUgZG9lcyBub3QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcGFyYW1ldGVycyBhcmUgbnVsbAogICAgICAqIGFuZCBkb2VzIG5vdCB0aHJvdyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiBpZiBkc3QgaXMgcmVhZCBvbmx5IGJ5dGUgYnVmZmVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIndyYXAiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7Qnl0ZUJ1ZmZlci5jbGFzcywgQnl0ZUJ1ZmZlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cmFwTGphdmFfbmlvX0J5dGVCdWZmZXJMamF2YV9uaW9fQnl0ZUJ1ZmZlcjAxKCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gIm5ldyBob3N0IjsKICAgICAgICAgaW50IHBvcnQgPSA4MDgwOwpAQCAtMTMzLDYgKzE5NCwxNSBAQAogICAgICAqIEFzc2VydGlvbjogZW5jb2RlcyBhIGJ1ZmZlciBkYXRhIGludG8gbmV0d29yayBkYXRhLgogICAgICAqICAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyLmNsYXNzLCBCeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3dyYXBMamF2YV9uaW9fQnl0ZUJ1ZmZlckxqYXZhX25pb19CeXRlQnVmZmVyMDIoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGhvc3QgPSAibmV3IGhvc3QiOwogICAgICAgICBpbnQgcG9ydCA9IDgwODA7CkBAIC0xNTYsNiArMjI2LDE1IEBACiAgICAgICogaWYgc3JjcyBjb250YWlucyBudWxsIGVsZW1lbnRzIEl0IGRvZXMgbm90IHRocm93IFJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uCiAgICAgICogZm9yIHJlYWQgb25seSBkc3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIEJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JhcCRMamF2YV9uaW9fQnl0ZUJ1ZmZlckxqYXZhX25pb19CeXRlQnVmZmVyMDEoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGhvc3QgPSAibmV3IGhvc3QiOwogICAgICAgICBpbnQgcG9ydCA9IDgwODA7CkBAIC0xODgsNiArMjY3LDE1IEBACiAgICAgICogCiAgICAgICogQXNzZXJ0aW9uOiBlbmNvZGVzIGRhdGFzIGZyb20gYnVmZmVycyBpbnRvIG5ldHdvcmsgZGF0YS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIEJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfd3JhcCRMamF2YV9uaW9fQnl0ZUJ1ZmZlckxqYXZhX25pb19CeXRlQnVmZmVyMDIoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGhvc3QgPSAibmV3IGhvc3QiOwogICAgICAgICBpbnQgcG9ydCA9IDgwODA7CkBAIC0yMDgsNiArMjk2LDIwIEBACiAgICAgICogCiAgICAgICogQXNzZXJ0aW9uOiB0aGVzZSBtZXRob2RzIHRocm93IFNTTEV4Y2VwdGlvbgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJ3cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXIuY2xhc3MsIEJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAid3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyW10uY2xhc3MsIEJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKworICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF93cmFwKCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gIm5ldyBob3N0IjsKICAgICAgICAgaW50IHBvcnQgPSA4MDgwOwpAQCAtMjQ0LDYgKzM0NiwxNSBAQAogICAgICAqIGpkayAxLjUgZG9lcyBub3QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gcGFyYW1ldGVycyBhcmUgbnVsbAogICAgICAqIGFuZCBkb2VzIG5vdCB0aHJvdyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiBpZiBkc3QgaXMgcmVhZCBvbmx5IGJ5dGUgYnVmZmVyCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVud3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyLmNsYXNzLCBCeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vud3JhcExqYXZhX25pb19CeXRlQnVmZmVyTGphdmFfbmlvX0J5dGVCdWZmZXIwMSgpIHRocm93cyBTU0xFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgaG9zdCA9ICJuZXcgaG9zdCI7CiAgICAgICAgIGludCBwb3J0ID0gODA4MDsKQEAgLTI2Niw2ICszNzcsMjAgQEAKICAgICAgKiAKICAgICAgKiBBc3NlcnRpb246IHRoZXNlIG1ldGhvZHMgdGhyb3cgU1NMRXhjZXB0aW9uCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVud3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyLmNsYXNzLCBCeXRlQnVmZmVyLmNsYXNzfQorICAgICAgICApLAorICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInVud3JhcCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtCeXRlQnVmZmVyLmNsYXNzLCBCeXRlQnVmZmVyW10uY2xhc3N9CisgICAgICAgICkKKworICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bndyYXBMamF2YV9uaW9fQnl0ZUJ1ZmZlckxqYXZhX25pb19CeXRlQnVmZmVyMDIoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBiYnMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYmJkID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMCk7CkBAIC0yOTQsNiArNDE5LDE1IEBACiAgICAgICogCiAgICAgICogQXNzZXJ0aW9uOiBkZWNvZGVzICBuZXR3b3JrIGRhdGEgaW50byBhIGRhdGEgYnVmZmVyLiAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW53cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXIuY2xhc3MsIEJ5dGVCdWZmZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfdW53cmFwTGphdmFfbmlvX0J5dGVCdWZmZXJMamF2YV9uaW9fQnl0ZUJ1ZmZlcjAzKCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gIm5ldyBob3N0IjsKICAgICAgICAgaW50IHBvcnQgPSA4MDgwOwpAQCAtMzE3LDYgKzQ1MSwxNSBAQAogICAgICAqIGlmIGRzdHMgY29udGFpbnMgbnVsbCBlbGVtZW50cyBJdCBkb2VzIG5vdCB0aHJvdyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbgogICAgICAqIHdoZW4gZHN0cyBjb250YWlucyByZWFkIG9ubHkgZWxlbWVudHMKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW53cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXIuY2xhc3MsIEJ5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bndyYXBMamF2YV9uaW9fQnl0ZUJ1ZmZlciRMamF2YV9uaW9fQnl0ZUJ1ZmZlcjAxKCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gIm5ldyBob3N0IjsKICAgICAgICAgaW50IHBvcnQgPSA4MDgwOwpAQCAtMzUxLDYgKzQ5NCwxNSBAQAogICAgICAqIEFzc2VydGlvbjogCiAgICAgICogZGVjb2RlIG5ldHdvcmsgZGF0YSBpbnRvIGRhdGEgYnVmZmVycy4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gY2hlY2tpbmcgbWlzc2VkIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAidW53cmFwIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge0J5dGVCdWZmZXIuY2xhc3MsIEJ5dGVCdWZmZXJbXS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF91bndyYXBMamF2YV9uaW9fQnl0ZUJ1ZmZlciRMamF2YV9uaW9fQnl0ZUJ1ZmZlcjAyKCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gIm5ldyBob3N0IjsKICAgICAgICAgaW50IHBvcnQgPSA4MDgwOwpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xQZXJtaXNzaW9uVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IDU5Mjk3NDAuLjc5ZWNhOTYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMUGVybWlzc2lvblRlc3QuamF2YQorKysgYi94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTFBlcm1pc3Npb25UZXN0LmphdmEKQEAgLTE3LDM5ICsxNyw2MyBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCi1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZXJtaXNzaW9uOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKIAoraW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMUGVybWlzc2lvbjsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKKyAKIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlNTTFBlcm1pc3Npb248L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycy4KICAqICAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhTU0xQZXJtaXNzaW9uLmNsYXNzKQogcHVibGljIGNsYXNzIFNTTFBlcm1pc3Npb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIFNTTFBlcm1pc3Npb24oU3RyaW5nKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgcGFyYW1ldGVyIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNTTFBlcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0gICAgCXRyeSB7Ci0gICAgCQlTU0xQZXJtaXNzaW9uIHAgPSBuZXcgU1NMUGVybWlzc2lvbigibmFtZSIpOwotICAgIAkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcGVybWlzc2lvbiBuYW1lIiwgIm5hbWUiLCBwLmdldE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTU0xQZXJtaXNzaW9uIHAgPSBuZXcgU1NMUGVybWlzc2lvbigibmFtZSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcGVybWlzc2lvbiBuYW1lIiwgIm5hbWUiLCBwLmdldE5hbWUoKSk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIFNTTFBlcm1pc3Npb24oU3RyaW5nLCBTdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiTnVsbCBwYXJhbWV0ZXJzIGNoZWNraW5nIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNTTFBlcm1pc3Npb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewotICAgIAl0cnkgewotICAgIAkJU1NMUGVybWlzc2lvbiBwID0gbmV3IFNTTFBlcm1pc3Npb24oIm5hbWUiLCAidmFsdWUiKTsKLSAgICAJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBlcm1pc3Npb24gbmFtZSIsICJuYW1lIiwgcC5nZXROYW1lKCkpOwotICAgIAkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZGVmYXVsdCBwZXJtaXNzaW9uIGFjdGlvbnMiLAotICAgIAkJCQkiIiwgcC5nZXRBY3Rpb25zKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU1NMUGVybWlzc2lvbiBwID0gbmV3IFNTTFBlcm1pc3Npb24oIm5hbWUiLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBlcm1pc3Npb24gbmFtZSIsICJuYW1lIiwgcC5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZGVmYXVsdCBwZXJtaXNzaW9uIGFjdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAiIiwgcC5nZXRBY3Rpb25zKCkpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMU2VydmVyU29ja2V0RmFjdG9yeVRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMU2VydmVyU29ja2V0RmFjdG9yeVRlc3QuamF2YQppbmRleCBmMzdjMWI2Li5lODIzNDEwIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTFNlcnZlclNvY2tldEZhY3RvcnlUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CkBAIC0yNCw2ICsyOSw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU1NMU2VydmVyU29ja2V0RmFjdG9yeS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU1NMU2VydmVyU29ja2V0RmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCiAgICAgcHJpdmF0ZSBjbGFzcyBNb2NrU1NMU2VydmVyU29ja2V0RmFjdG9yeSBleHRlbmRzIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgewpAQCAtODAsNiArODYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5I1NTTFNlcnZlclNvY2tldEZhY3RvcnkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBNb2NrU1NMU2VydmVyU29ja2V0RmFjdG9yeSgpOwpAQCAtOTEsNiArMTA2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0RmFjdG9yeSNnZXREZWZhdWx0KCkKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RGVmYXVsdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdCgpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSW5jb3JyZWN0IGRlZmF1bHQgc29ja2V0IGZhY3RvcnkiLAogICAgICAgICAgICAgICAgIFNTTFNlcnZlclNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpKTsKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMU2Vzc2lvbkJpbmRpbmdFdmVudFRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMU2Vzc2lvbkJpbmRpbmdFdmVudFRlc3QuamF2YQppbmRleCBiMGYxMzRjLi45ZGM2NGNjIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTFNlc3Npb25CaW5kaW5nRXZlbnRUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uQmluZGluZ0V2ZW50VGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogCkBAIC0yOCwxOTIgKzMzLDIxOSBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCi0KIC8qKgogICogVGVzdHMgZm9yIDxjb2RlPlNTTFNlc3Npb25CaW5kaW5nRXZlbnQ8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KICAqIAogICovCitAVGVzdFRhcmdldENsYXNzKFNTTFNlc3Npb25CaW5kaW5nRXZlbnQuY2xhc3MpIAogcHVibGljIGNsYXNzIFNTTFNlc3Npb25CaW5kaW5nRXZlbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZheF9uZXRfc3NsX1NTTFNlc3Npb25MamF2YV9sYW5nX1N0cmluZygpIHsKLQkJU1NMU2Vzc2lvbiBzZXMgPSBuZXcgTXlTU0xTZXNzaW9uKCk7Ci0JCVNTTFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQgPSBuZXcgU1NMU2Vzc2lvbkJpbmRpbmdFdmVudChzZXMsICJ0ZXN0Iik7Ci0JCWlmICghInRlc3QiLmVxdWFscyhldmVudC5nZXROYW1lKCkpKSB7Ci0JCQlmYWlsKCJpbmNvcnJlY3QgbmFtZSIpOwotCQl9Ci0JCWlmICghZXZlbnQuZ2V0U2Vzc2lvbigpLmVxdWFscyhzZXMpKSB7Ci0JCQlmYWlsKCJpbmNvcnJlY3Qgc2Vzc2lvbiIpOwotCQl9Ci0JfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIk51bGwgcGFyYW1ldGVycyBjaGVja2luZyBtaXNzZWQiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTU0xTZXNzaW9uQmluZGluZ0V2ZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1NTTFNlc3Npb24uY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZheF9uZXRfc3NsX1NTTFNlc3Npb25MamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICAgICAgU1NMU2Vzc2lvbiBzZXMgPSBuZXcgTXlTU0xTZXNzaW9uKCk7CisgICAgICAgIFNTTFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQgPSBuZXcgU1NMU2Vzc2lvbkJpbmRpbmdFdmVudChzZXMsICJ0ZXN0Iik7CisgICAgICAgIGlmICghInRlc3QiLmVxdWFscyhldmVudC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBmYWlsKCJpbmNvcnJlY3QgbmFtZSIpOworICAgICAgICB9CisgICAgICAgIGlmICghZXZlbnQuZ2V0U2Vzc2lvbigpLmVxdWFscyhzZXMpKSB7CisgICAgICAgICAgICBmYWlsKCJpbmNvcnJlY3Qgc2Vzc2lvbiIpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0JCVNTTFNlc3Npb24gc2VzID0gbmV3IE15U1NMU2Vzc2lvbigpOwotCQlTU0xTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50ID0gbmV3IFNTTFNlc3Npb25CaW5kaW5nRXZlbnQoc2VzLCAidGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXNzaW9uIG5hbWUiLCAidGVzdCIsIGV2ZW50LmdldE5hbWUoKSk7Ci0JCWV2ZW50ID0gbmV3IFNTTFNlc3Npb25CaW5kaW5nRXZlbnQoc2VzLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2Vzc2lvbiBuYW1lIiwgbnVsbCwgZXZlbnQuZ2V0TmFtZSgpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCNnZXROYW1lKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKKyAgICAgICAgU1NMU2Vzc2lvbiBzZXMgPSBuZXcgTXlTU0xTZXNzaW9uKCk7CisgICAgICAgIFNTTFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQgPSBuZXcgU1NMU2Vzc2lvbkJpbmRpbmdFdmVudChzZXMsICJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNlc3Npb24gbmFtZSIsICJ0ZXN0IiwgZXZlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgZXZlbnQgPSBuZXcgU1NMU2Vzc2lvbkJpbmRpbmdFdmVudChzZXMsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXNzaW9uIG5hbWUiLCBudWxsLCBldmVudC5nZXROYW1lKCkpOworICAgIH0KIAotCS8qKgotCSAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25CaW5kaW5nRXZlbnQjZ2V0U2Vzc2lvbigpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9nZXRTZXNzaW9uKCkgewotCQlTU0xTZXNzaW9uIHNlcyA9IG5ldyBNeVNTTFNlc3Npb24oKTsKLQkJU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCA9IG5ldyBTU0xTZXNzaW9uQmluZGluZ0V2ZW50KHNlcywgInRlc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2Vzc2lvbiIsIHNlcywgZXZlbnQuZ2V0U2Vzc2lvbigpKTsKLQl9CisgICAgLyoqCisgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCNnZXRTZXNzaW9uKCkKKyAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U2Vzc2lvbiIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2Vzc2lvbigpIHsKKyAgICAgICAgU1NMU2Vzc2lvbiBzZXMgPSBuZXcgTXlTU0xTZXNzaW9uKCk7CisgICAgICAgIFNTTFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQgPSBuZXcgU1NMU2Vzc2lvbkJpbmRpbmdFdmVudChzZXMsICJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNlc3Npb24iLCBzZXMsIGV2ZW50LmdldFNlc3Npb24oKSk7CisgICAgfQogfQogCiBjbGFzcyBNeVNTTFNlc3Npb24gaW1wbGVtZW50cyBTU0xTZXNzaW9uIHsKLQkvKgotCSAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldEFwcGxpY2F0aW9uQnVmZmVyU2l6ZSgpCi0JICovCi0JcHVibGljIGludCBnZXRBcHBsaWNhdGlvbkJ1ZmZlclNpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldEFwcGxpY2F0aW9uQnVmZmVyU2l6ZSgpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBcHBsaWNhdGlvbkJ1ZmZlclNpemUoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0Q2lwaGVyU3VpdGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2lwaGVyU3VpdGUoKSB7Ci0JCXJldHVybiAiTXlUZXN0Q2lwaGVyU3VpdGUiOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldENpcGhlclN1aXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENpcGhlclN1aXRlKCkgeworICAgICAgICByZXR1cm4gIk15VGVzdENpcGhlclN1aXRlIjsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldENyZWF0aW9uVGltZSgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgewotCQlyZXR1cm4gMDsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRDcmVhdGlvblRpbWUoKQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRJZCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRJZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0SWQoKQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0TGFzdEFjY2Vzc2VkVGltZSgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0TGFzdEFjY2Vzc2VkVGltZSgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRMb2NhbENlcnRpZmljYXRlcygpCi0JICovCi0JcHVibGljIENlcnRpZmljYXRlW10gZ2V0TG9jYWxDZXJ0aWZpY2F0ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldExvY2FsQ2VydGlmaWNhdGVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRMb2NhbFByaW5jaXBhbCgpCi0JICovCi0JcHVibGljIFByaW5jaXBhbCBnZXRMb2NhbFByaW5jaXBhbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0TG9jYWxQcmluY2lwYWwoKQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0TG9jYWxQcmluY2lwYWwoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0UGFja2V0QnVmZmVyU2l6ZSgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWNrZXRCdWZmZXJTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRQYWNrZXRCdWZmZXJTaXplKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhY2tldEJ1ZmZlclNpemUoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0UGVlckNlcnRpZmljYXRlQ2hhaW4oKQotCSAqLwotCXB1YmxpYyBYNTA5Q2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVDaGFpbigpCi0JdGhyb3dzIFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uKCJ0ZXN0IGV4Y2VwdGlvbiIpOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFBlZXJDZXJ0aWZpY2F0ZUNoYWluKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlW10gZ2V0UGVlckNlcnRpZmljYXRlQ2hhaW4oKQorICAgIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbigidGVzdCBleGNlcHRpb24iKTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFBlZXJDZXJ0aWZpY2F0ZXMoKQotCSAqLwotCXB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldFBlZXJDZXJ0aWZpY2F0ZXMoKQotCXRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbigidGVzdCBleGNlcHRpb24iKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRQZWVyQ2VydGlmaWNhdGVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVzKCkKKyAgICB0aHJvd3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24oInRlc3QgZXhjZXB0aW9uIik7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRQZWVySG9zdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQZWVySG9zdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0UGVlckhvc3QoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGVlckhvc3QoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0UGVlclBvcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UGVlclBvcnQoKSB7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFBlZXJQb3J0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBlZXJQb3J0KCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFBlZXJQcmluY2lwYWwoKQotCSAqLwotCXB1YmxpYyBQcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFBlZXJQcmluY2lwYWwoKQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0UHJvdG9jb2woKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFByb3RvY29sKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFNlc3Npb25Db250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgU1NMU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFNlc3Npb25Db250ZXh0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU1NMU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jZ2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFZhbHVlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2dldFZhbHVlTmFtZXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZU5hbWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNnZXRWYWx1ZU5hbWVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNpbnZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgewotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI2ludmFsaWRhdGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNpc1ZhbGlkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jaXNWYWxpZCgpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCS8qCi0JICogQHNlZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24jcHV0VmFsdWUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCX0KKyAgICAvKgorICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI3B1dFZhbHVlKGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uI3JlbW92ZVZhbHVlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiNyZW1vdmVWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKFN0cmluZyBuYW1lKSB7CisgICAgfQogCiB9CiAKZGlmZiAtLWdpdCBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMU29ja2V0RmFjdG9yeVRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvU1NMU29ja2V0RmFjdG9yeVRlc3QuamF2YQppbmRleCA3NGM4ZjYxLi5kOTg0NmE4IDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1NTTFNvY2tldEZhY3RvcnlUZXN0LmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9TU0xTb2NrZXRGYWN0b3J5VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CkBAIC0yNSw2ICszMCw3IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoU1NMU29ja2V0RmFjdG9yeS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU1NMU29ja2V0RmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIGNsYXNzIE1vY2tTU0xTb2NrZXRGYWN0b3J5IGV4dGVuZHMgU1NMU29ja2V0RmFjdG9yeSB7CkBAIC05OSw2ICsxMDUsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5I1NTTFNvY2tldEZhY3RvcnkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJTU0xTb2NrZXRGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBNb2NrU1NMU29ja2V0RmFjdG9yeSgpOwpAQCAtMTEwLDYgKzEyNSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkjZ2V0RGVmYXVsdCgpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldERlZmF1bHQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHQoKSB7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkluY29ycmVjdCBkZWZhdWx0IHNvY2tldCBmYWN0b3J5IiwKICAgICAgICAgICAgICAgICBTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKSk7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnkxVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5MVRlc3QuamF2YQppbmRleCBkYzkzNjdiLi4yZGQyNTIzIDEwMDY0NAotLS0gYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnkxVGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeTFUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwpAQCAtNDAsNyArNDUsNyBAQAogICogVGVzdHMgZm9yIDxjb2RlPlRydXN0TWFuYWdlckZhY3Rvcnk8L2NvZGU+IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4KICAqIAogICovCi0KK0BUZXN0VGFyZ2V0Q2xhc3MoVHJ1c3RNYW5hZ2VyRmFjdG9yeS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgVHJ1c3RNYW5hZ2VyRmFjdG9yeTFUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3J2VHJ1c3RNYW5hZ2VyRmFjdG9yeSA9ICJUcnVzdE1hbmFnZXJGYWN0b3J5IjsKQEAgLTk4LDYgKzEwMywxNSBAQAogICAgICAqIGNvbnN0cnVjdG9yCiAgICAgICogQXNzZXJ0aW9uOiBjcmVhdGVkIG5ldyBUcnVzdE1hbmFnZXJGYWN0b3J5IG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdE1hbmFnZXJGYWN0b3J5IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1RydXN0TWFuYWdlckZhY3RvcnlTcGkuY2xhc3MsIFByb3ZpZGVyLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YXhfbmV0X3NzbF9UcnVzdE1hbmFnZXJGYWN0b3J5U3BpTGphdmFfc2VjdXJpdHlfUHJvdmlkZXJMamF2YV9sYW5nX1N0cmluZygpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewpAQCAtMTMwLDI4ICsxNDQsNDYgQEAKICAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiAKICAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBbGdvcml0aG0iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsZ29yaXRobSgpCiAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWxnb3JpdGhtIiwKLSAgICAgICAgCQlkZWZhdWx0QWxnb3JpdGhtLAotICAgICAgICAJCVRydXN0TWFuYWdlckZhY3RvcnkKLSAgICAgICAgCQkuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSkuZ2V0QWxnb3JpdGhtKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHRBbGdvcml0aG0sCisgICAgICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKS5nZXRBbGdvcml0aG0oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGFsZ29yaXRobSIsCi0gICAgICAgIAkJZGVmYXVsdEFsZ29yaXRobSwKLSAgICAgICAgCQlUcnVzdE1hbmFnZXJGYWN0b3J5Ci0gICAgICAgIAkJLmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0sIGRlZmF1bHRQcm92aWRlck5hbWUpCi0gICAgICAgIAkJLmdldEFsZ29yaXRobSgpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtLAorICAgICAgICAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyTmFtZSkKKyAgICAgICAgICAgICAgICAuZ2V0QWxnb3JpdGhtKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhbGdvcml0aG0iLAotICAgICAgICAJCWRlZmF1bHRBbGdvcml0aG0sCi0gICAgICAgIAkJVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLCBkZWZhdWx0UHJvdmlkZXIpCi0gICAgICAgIAkJLmdldEFsZ29yaXRobSgpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtLAorICAgICAgICAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyKQorICAgICAgICAgICAgICAgIC5nZXRBbGdvcml0aG0oKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogIFRlc3QgZm9yIDxjb2RlPmdldERlZmF1bHRBbGdvcml0aG0oKTwvY29kZT4gbWV0aG9kCiAgICAgICogQXNzZXJ0aW9uOiByZXR1cm5zIHZhbHVlIHdoaWNoIGlzIHNwZWNpZm9lZCBpbiBzZWN1cml0eSBwcm9wZXJ0eQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXREZWZhdWx0QWxnb3JpdGhtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0QWxnb3JpdGhtKCkgewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOwpAQCAtMTgwLDYgKzIxMiwxNSBAQAogICAgICAqIEFzc2VydGlvbnM6IHJldHVybnMgc2VjdXJpdHkgcHJvcGVydHkgInNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5LmFsZ29yaXRobSI7IAogICAgICAqIHJldHVybnMgaW5zdGFuY2Ugb2YgVHJ1c3RNYW5hZ2VyRmFjdG9yeQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nMDEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKQEAgLTIwMSw2ICsyNDIsMTUgQEAKICAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbDsKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG5vdCBjb3JyZWN0OwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nMDIoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKG51bGwpOwpAQCAtMjI0LDYgKzI3NCwxNSBAQAogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGwKICAgICAgKiBvciBlbXB0eQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZzAxKCkgdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKQEAgLTI1Miw2ICszMTEsMTUgQEAKICAgICAgKiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbGdvcml0aG0gaXMgbnVsbDsKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG5vdCBjb3JyZWN0OwogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEluc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZzAyKCkgdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFERUZTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIGZhaWwoTm90U3VwcG9ydGVkTXNnKTsKQEAgLTI4MCw2ICszNDgsMTUgQEAKICAgICAgKiBBc3NlcnRpb246IHRocm93cyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGhhcwogICAgICAqIGludmFsaWQgdmFsdWUKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcwMygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOwpAQCAtMzA0LDYgKzM4MSwxNSBAQAogICAgICAqIG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBpbnN0YW5jZSBvZiBUcnVzdE1hbmFnZXJGYWN0b3J5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nMDQoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewpAQCAtMzI4LDYgKzQxNCwxNSBAQAogICAgICAqIG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9Qcm92aWRlcjAxKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CkBAIC0zNTAsNiArNDQ1LDE1IEBACiAgICAgICogdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG51bGw7CiAgICAgICogdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB3aGVuIGFsZ29yaXRobSBpcyBub3QgY29ycmVjdDsKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9Qcm92aWRlcjAyKCkgewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOwpAQCAtMzc3LDYgKzQ4MSwxNSBAQAogICAgICAqIG1ldGhvZAogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBpbnN0YW5jZSBvZiBUcnVzdE1hbmFnZXJGYWN0b3J5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBQcm92aWRlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfc2VjdXJpdHlfUHJvdmlkZXIwMygpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewogICAgICAgICAgICAgZmFpbChOb3RTdXBwb3J0ZWRNc2cpOwpAQCAtNDAwLDIyICs1MTMsMzEgQEAKICAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiAKICAgICAgKiBAdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcm92aWRlciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXIoKQogICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiB7Ci0gICAgCWlmICghREVGU3VwcG9ydGVkKSBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CisgICAgICAgIGlmICghREVGU3VwcG9ydGVkKSBmYWlsKE5vdFN1cHBvcnRlZE1zZyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHByb3ZpZGVyIiwKLSAgICAgICAgCQlkZWZhdWx0UHJvdmlkZXIsCi0gICAgICAgIAkJVHJ1c3RNYW5hZ2VyRmFjdG9yeQotICAgICAgICAJCS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKS5nZXRQcm92aWRlcigpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtKS5nZXRQcm92aWRlcigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcHJvdmlkZXIiLAotICAgICAgICAJCWRlZmF1bHRQcm92aWRlciwKLSAgICAgICAgCQlUcnVzdE1hbmFnZXJGYWN0b3J5Ci0gICAgICAgIAkJLmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0sIGRlZmF1bHRQcm92aWRlck5hbWUpCi0gICAgICAgIAkJLmdldFByb3ZpZGVyKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKGRlZmF1bHRBbGdvcml0aG0sIGRlZmF1bHRQcm92aWRlck5hbWUpCisgICAgICAgICAgICAgICAgLmdldFByb3ZpZGVyKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwcm92aWRlciIsCi0gICAgICAgIAkJZGVmYXVsdFByb3ZpZGVyLAotICAgICAgICAJCVRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoZGVmYXVsdEFsZ29yaXRobSwgZGVmYXVsdFByb3ZpZGVyKQotICAgICAgICAJCS5nZXRQcm92aWRlcigpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShkZWZhdWx0QWxnb3JpdGhtLCBkZWZhdWx0UHJvdmlkZXIpCisgICAgICAgICAgICAgICAgLmdldFByb3ZpZGVyKCkpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTQyNSw3ICs1NDcsMTYgQEAKICAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIAogICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJ1c3RNYW5hZ2VycygpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFRydXN0TWFuYWdlcnMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9nZXRUcnVzdE1hbmFnZXJzKCkKICAgICAgICAgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CiAgICAgICAgIGtzLmxvYWQobnVsbCwgbnVsbCk7ICAgICAgICAgICAgCkBAIC00MzYsNyArNTY3LDcgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgdHJ1c3RNRltpXS5pbml0KChLZXlTdG9yZSludWxsKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRydXN0TUZbaV0uaW5pdChrcyk7CiAgICAgICAgICAgICB0bSA9IHRydXN0TUZbaV0uZ2V0VHJ1c3RNYW5hZ2VycygpOwpAQCAtNDUwLDYgKzU4MSwxNSBAQAogICAgICAqIFRlc3QgZm9yIDxjb2RlPmluaXQoS2V5U3RvcmUga2V5U3RvcmUpPC9jb2RlPgogICAgICAqIEFzc2VydGlvbjogcmV0dXJucyBub3QgZW1wdHkgVHJ1c3RNYW5hZ2VyIGFycmF5CiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiTWV0aG9kIGluaXQgd2Fzbid0IGludm9rZWQgaW4gdGhpcyB0ZXN0IiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW5pdCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtLZXlTdG9yZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pbml0TGphdmFfc2VjdXJpdHlfS2V5U3RvcmUoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICAgICAgS2V5U3RvcmVFeGNlcHRpb24gewogICAgICAgICBpZiAoIURFRlN1cHBvcnRlZCkgewpAQCAtNDc1LDYgKzYxNSwxNSBAQAogICAgICAqIEFzc2VydGlvbjoKICAgICAgKiB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuIHBhcmFtcyBpcyBudWxsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBjYXNlIHdhcyB0ZXN0ZWQgb25seSIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImluaXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7TWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRMamF2YXhfbmV0X3NzbF9NYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMoKQogICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAogICAgICAgICBLZXlTdG9yZUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiAgewpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5MlRlc3QuamF2YSBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeTJUZXN0LmphdmEKaW5kZXggYjQ1ODFjZi4uYmJhMGI3NyAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5MlRlc3QuamF2YQorKysgYi94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnkyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKQEAgLTM2LDcgKzQxLDcgQEAKICAqIFRlc3RzIGZvciBUcnVzdE1hbmFnZXJGYWN0b3J5IGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcwogICogCiAgKi8KLQorQFRlc3RUYXJnZXRDbGFzcyhUcnVzdE1hbmFnZXJGYWN0b3J5LmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBUcnVzdE1hbmFnZXJGYWN0b3J5MlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNydlRydXN0TWFuYWdlckZhY3RvcnkgPSAiVHJ1c3RNYW5hZ2VyRmFjdG9yeSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRBbGcgPSAiVE1GIjsKQEAgLTExNSw2ICsxMjAsMTUgQEAKICAgICAgKiB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHdoZW4gYWxnb3JpdGhtIGlzIG5vdCBjb3JyZWN0OwogICAgICAqIHJldHVybnMgVHJ1c3RNYW5hZ2VyRmFjdG9yeSBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UobnVsbCk7CkBAIC0xNTIsNiArMTY2LDE1IEBACiAgICAgICogdGhyb3dzIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHdoZW4gcHJvdmlkZXIgaXMgYXZhaWxhYmxlOwogICAgICAqIHJldHVybnMgVHJ1c3RNYW5hZ2VyRmFjdG9yeSBvYmplY3QKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0SW5zdGFuY2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKG51bGwsIG1Qcm92LmdldE5hbWUoKSk7CkBAIC0yMTgsNiArMjQxLDE1IEBACiAgICAgICogdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGlzIG51bGw7CiAgICAgICogcmV0dXJucyBUcnVzdE1hbmFnZXJGYWN0b3J5IG9iamVjdAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFByb3ZpZGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGphdmFfbGFuZ19TdHJpbmdMamF2YV9zZWN1cml0eV9Qcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShudWxsLCBtUHJvdik7CmRpZmYgLS1naXQgYS94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnlTcGlUZXN0LmphdmEgYi94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnlTcGlUZXN0LmphdmEKaW5kZXggZDgwMjQxYy4uMzYwY2FlNyAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5U3BpVGVzdC5qYXZhCisrKyBiL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YXgubmV0LnNzbDsKIAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOwpAQCAtMjYsNiArMzEsNyBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitAVGVzdFRhcmdldENsYXNzKFRydXN0TWFuYWdlckZhY3RvcnlTcGkuY2xhc3MpIAogcHVibGljIGNsYXNzIFRydXN0TWFuYWdlckZhY3RvcnlTcGlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBjbGFzcyBNb2NrVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaSBleHRlbmRzIFRydXN0TWFuYWdlckZhY3RvcnlTcGkgewpAQCAtNjIsNiArNjgsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5U3BpI1RydXN0TWFuYWdlckZhY3RvcnlTcGkoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJUcnVzdE1hbmFnZXJGYWN0b3J5U3BpIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBNb2NrVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaSgpOwpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9YNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyVGVzdC5qYXZhIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgvbmV0L3NzbC9YNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDhhZTQyYWUuLjY3NDhkNWYgMTAwNjQ0Ci0tLSBhL3gtbmV0L3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L25ldC9zc2wvWDUwOUV4dGVuZGVkS2V5TWFuYWdlclRlc3QuamF2YQorKysgYi94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC9uZXQvc3NsL1g1MDlFeHRlbmRlZEtleU1hbmFnZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4Lm5ldC5zc2w7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAoraW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworCiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKQEAgLTI2LDgzICszMSwxMDEgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAotCiAvKioKICAqIFRlc3RzIGZvciA8Y29kZT5YNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyPC9jb2RlPiBjbGFzcyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCiAgKiAKICAqLworQFRlc3RUYXJnZXRDbGFzcyhYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGNsYXNzIE1vY2tYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyIGV4dGVuZHMgWDUwOUV4dGVuZGVkS2V5TWFuYWdlciB7Ci0JCXB1YmxpYyBNb2NrWDUwOUV4dGVuZGVkS2V5TWFuYWdlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KKyAgICBwcml2YXRlIGNsYXNzIE1vY2tYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyIGV4dGVuZHMgWDUwOUV4dGVuZGVkS2V5TWFuYWdlciB7CisgICAgICAgIHB1YmxpYyBNb2NrWDUwOUV4dGVuZGVkS2V5TWFuYWdlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyI2Nob29zZUNsaWVudEFsaWFzKGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSwgamF2YS5uZXQuU29ja2V0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBjaG9vc2VDbGllbnRBbGlhcyhTdHJpbmdbXSBhcmcwLCBQcmluY2lwYWxbXSBhcmcxLCBTb2NrZXQgYXJnMikgewotCQkJLy8gaXQgaXMgYSBmYWtlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyI2Nob29zZUNsaWVudEFsaWFzKGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSwgamF2YS5uZXQuU29ja2V0KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBjaG9vc2VDbGllbnRBbGlhcyhTdHJpbmdbXSBhcmcwLCBQcmluY2lwYWxbXSBhcmcxLCBTb2NrZXQgYXJnMikgeworICAgICAgICAgICAgLy8gaXQgaXMgYSBmYWtlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuWDUwOUtleU1hbmFnZXIjY2hvb3NlU2VydmVyQWxpYXMoamF2YS5sYW5nLlN0cmluZywgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSwgamF2YS5uZXQuU29ja2V0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBjaG9vc2VTZXJ2ZXJBbGlhcyhTdHJpbmcgYXJnMCwgUHJpbmNpcGFsW10gYXJnMSwgU29ja2V0IGFyZzIpIHsKLQkJCS8vIGl0IGlzIGEgZmFrZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5YNTA5S2V5TWFuYWdlciNjaG9vc2VTZXJ2ZXJBbGlhcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdLCBqYXZhLm5ldC5Tb2NrZXQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGNob29zZVNlcnZlckFsaWFzKFN0cmluZyBhcmcwLCBQcmluY2lwYWxbXSBhcmcxLCBTb2NrZXQgYXJnMikgeworICAgICAgICAgICAgLy8gaXQgaXMgYSBmYWtlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuWDUwOUtleU1hbmFnZXIjZ2V0Q2VydGlmaWNhdGVDaGFpbihqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFg1MDlDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlQ2hhaW4oU3RyaW5nIGFyZzApIHsKLQkJCS8vIGl0IGlzIGEgZmFrZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5YNTA5S2V5TWFuYWdlciNnZXRDZXJ0aWZpY2F0ZUNoYWluKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlW10gZ2V0Q2VydGlmaWNhdGVDaGFpbihTdHJpbmcgYXJnMCkgeworICAgICAgICAgICAgLy8gaXQgaXMgYSBmYWtlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuWDUwOUtleU1hbmFnZXIjZ2V0Q2xpZW50QWxpYXNlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdKQotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIGdldENsaWVudEFsaWFzZXMoU3RyaW5nIGFyZzAsIFByaW5jaXBhbFtdIGFyZzEpIHsKLQkJCS8vIGl0IGlzIGEgZmFrZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgamF2YXgubmV0LnNzbC5YNTA5S2V5TWFuYWdlciNnZXRDbGllbnRBbGlhc2VzKGphdmEubGFuZy5TdHJpbmcsIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50QWxpYXNlcyhTdHJpbmcgYXJnMCwgUHJpbmNpcGFsW10gYXJnMSkgeworICAgICAgICAgICAgLy8gaXQgaXMgYSBmYWtlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuWDUwOUtleU1hbmFnZXIjZ2V0UHJpdmF0ZUtleShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFByaXZhdGVLZXkgZ2V0UHJpdmF0ZUtleShTdHJpbmcgYXJnMCkgewotCQkJLy8gaXQgaXMgYSBmYWtlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyI2dldFByaXZhdGVLZXkoamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcml2YXRlS2V5IGdldFByaXZhdGVLZXkoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgICAgIC8vIGl0IGlzIGEgZmFrZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyI2dldFNlcnZlckFsaWFzZXMoamF2YS5sYW5nLlN0cmluZywgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJBbGlhc2VzKFN0cmluZyBhcmcwLCBQcmluY2lwYWxbXSBhcmcxKSB7Ci0JCQkvLyBpdCBpcyBhIGZha2UKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQorICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyI2dldFNlcnZlckFsaWFzZXMoamF2YS5sYW5nLlN0cmluZywgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJBbGlhc2VzKFN0cmluZyBhcmcwLCBQcmluY2lwYWxbXSBhcmcxKSB7CisgICAgICAgICAgICAvLyBpdCBpcyBhIGZha2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC5uZXQuc3NsLlg1MDlFeHRlbmRlZEtleU1hbmFnZXIjWDUwOUV4dGVuZGVkS2V5TWFuYWdlcigpIAogICAgICAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgTW9ja1g1MDlFeHRlbmRlZEtleU1hbmFnZXIoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBNb2NrWDUwOUV4dGVuZGVkS2V5TWFuYWdlcigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4Lm5ldC5zc2wuWDUwOUV4dGVuZGVkS2V5TWFuYWdlcgogICAgICAqICAgICAjY2hvb3NlRW5naW5lQ2xpZW50QWxpYXMoamF2YS5sYW5nLlN0cmluZ1tdLAogICAgICAqICAgICBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdLCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZSkgCiAgICAgICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdF9jaG9vc2VFbmdpbmVDbGllbnRBbGlhcygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBub3QgbnVsbCBwYXJhbWV0ZXJzIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNob29zZUVuZ2luZUNsaWVudEFsaWFzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZ1tdLmNsYXNzLCBQcmluY2lwYWxbXS5jbGFzcywgamF2YXgubmV0LnNzbC5TU0xFbmdpbmUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RfY2hvb3NlRW5naW5lQ2xpZW50QWxpYXMoKSB7CiAgICAgICAgIFg1MDlFeHRlbmRlZEtleU1hbmFnZXIga20gPSBuZXcgTXlYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyKCk7CiAgICAgICAgIGlmIChrbS5jaG9vc2VFbmdpbmVDbGllbnRBbGlhcyhudWxsLCBudWxsLCBudWxsKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBmYWlsKCJub24gbnVsbCByZXN1bHQiKTsKQEAgLTExNCw2ICsxMzcsMTUgQEAKICAgICAgKiAgICAgI2Nob29zZUVuZ2luZVNlcnZlckFsaWFzKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10sIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lKSAKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmljYXRpb24gd2l0aCBub3QgbnVsbCBwYXJhbWV0ZXJzIG1pc3NlZCIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNob29zZUVuZ2luZVNlcnZlckFsaWFzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgUHJpbmNpcGFsW10uY2xhc3MsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0X2Nob29zZUVuZ2luZVNlcnZlckFsaWFzKCkgewogICAgICAgICBYNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyIGttID0gbmV3IE15WDUwOUV4dGVuZGVkS2V5TWFuYWdlcigpOwogICAgICAgICBpZiAoa20uY2hvb3NlRW5naW5lU2VydmVyQWxpYXMobnVsbCwgbnVsbCwgbnVsbCkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9uZXQvc3NsL0FsbFRlc3RzLmphdmEgYi94LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3huZXQvQWxsVGVzdHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSB4LW5ldC9zcmMvdGVzdC9qYXZhL3Rlc3RzL25ldC9zc2wvQWxsVGVzdHMuamF2YQpyZW5hbWUgdG8geC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy94bmV0L0FsbFRlc3RzLmphdmEKaW5kZXggYjE0YjI4Mi4uYmU0OTk5ZiAxMDA2NDQKLS0tIGEveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy9uZXQvc3NsL0FsbFRlc3RzLmphdmEKKysrIGIveC1uZXQvc3JjL3Rlc3QvamF2YS90ZXN0cy94bmV0L0FsbFRlc3RzLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgdGVzdHMubmV0LnNzbDsKK3BhY2thZ2UgdGVzdHMueG5ldDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CkBAIC0yOSw3ICsyOSw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJBbGwgbmV0LnNzbCB0ZXN0IHN1aXRlcyIpOworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKAorICAgICAgICAgICAgICAgICJBbGwgamF2YXgubmV0IGFuZCBqYXZheC5uZXQuc3NsIHRlc3Qgc3VpdGVzIik7CiAgICAgICAgIC8vICRKVW5pdC1CRUdJTiQKICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0cy5hcGkuamF2YXgubmV0LkFsbFRlc3RzLnN1aXRlKCkpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzLmFwaS5qYXZheC5uZXQuc3NsLkFsbFRlc3RzLnN1aXRlKCkpOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhY2thZ2UuaHRtbCBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0NjIxZAotLS0gL2Rldi9udWxsCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBQcm92aWRlcyBhIHV0aWxpdHkgY2xhc3Mgd2l0aCB1c2VmdWwgWE1MIGNvbnN0YW50cy4KKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXIuamF2YSBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlci5qYXZhCmluZGV4IGFkMzUyNTYuLjZmZDY1NTAgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlci5qYXZhCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlci5qYXZhCkBAIC0zMSw4MSArMzEsMTA0IEBACiAKIC8qKgogICogRGVmaW5lcyBhIGJyaWRnZSBmcm9tIFhNTCBzb3VyY2VzIChmaWxlcywgc3RyZWFtIGV0Yy4pIHRvIERPTSB0cmVlcy4gQ2FuIGJlCi0gKiB1c2VkIGZvciBlYXNpbHkgb2J0YWluaW5nIGEgRG9jdW1lbnQgZm9yIHRoZSBpbnB1dC4gVGhlIGNsYXNzIGl0c2VsZiBpcwotICogYWJzdHJhY3QuIFRoZSBjbGFzcyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGlzIGFibGUgdG8gcHJvdmlkZSBpbnN0YW5jZXMgKG9mCi0gKiBjb25jcmV0ZSBzdWJjbGFzc2VzIGtub3duIHRvIHRoZSBzeXN0ZW0pLgorICogdXNlZCBmb3IgZWFzaWx5IG9idGFpbmluZyBhIHtAbGluayBvcmcudzNjLmRvbS5Eb2N1bWVudH0gZm9yIHRoZSBpbnB1dC4gVGhlCisgKiBjbGFzcyBpdHNlbGYgaXMgYWJzdHJhY3QuIFRoZSBjbGFzcyB7QGxpbmsgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeX0gaXMgYWJsZSB0bworICogcHJvdmlkZSBpbnN0YW5jZXMgKG9mIGNvbmNyZXRlIHN1YmNsYXNzZXMga25vd24gdG8gdGhlIHN5c3RlbSkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnRCdWlsZGVyIHsKIAogICAgIC8qKgogICAgICAqIERvLW5vdGhpbmcgY29uc3RydWN0b3IuIFByZXZlbnRzIGluc3RhbnRpYXRpb24uIFRvIGJlIG92ZXJyaWRkZW4gYnkKICAgICAgKiBjb25jcmV0ZSBzdWJjbGFzc2VzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBEb2N1bWVudEJ1aWxkZXIoKSB7CiAgICAgICAgIC8vIERvZXMgbm90aGluZy4KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSBET00gaW1wbGVtZW50YXRpb24gdGhpcyBEb2N1bWVudEJ1aWxkZXIgaXMgd29ya2luZyBvbi4KKyAgICAgKiBRdWVyaWVzIHRoZSBET00gaW1wbGVtZW50YXRpb24gdGhpcyB7QGNvZGUgRG9jdW1lbnRCdWlsZGVyfSBpcyB3b3JraW5nCisgICAgICogb24uCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgRE9NIGltcGxlbWVudGF0aW9uCisgICAgICogQHJldHVybiB0aGUgRE9NIGltcGxlbWVudGF0aW9uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERPTUltcGxlbWVudGF0aW9uIGdldERPTUltcGxlbWVudGF0aW9uKCk7CiAKKy8vIFRPRE8gTm8gWFNjaGVtYSBzdXBwb3J0IGluIEFuZHJvaWQgMS4wLiBNYXliZSBsYXRlci4KKy8vICAgIC8qKgorLy8gICAgICogUXVlcmllcyB0aGUgWE1MIHNjaGVtYSB1c2VkIGJ5IHRoZSBEb2N1bWVudEJ1aWxkZXIuCisvLyAgICAgKiAKKy8vICAgICAqIEByZXR1cm4gVGhlIFhNTCBzY2hlbWEKKy8vICAgICAqIAorLy8gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uCisvLyAgICAgKiAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBYTUwgc2NoZW1hcy4KKy8vICAgICAqLworLy8gICAgcHVibGljIGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYSBnZXRTY2hlbWEoKSB0aHJvd3MKKy8vICAgICAgICAgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworLy8gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworLy8gICAgfQorICAgICAKICAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSBYTUwgc2NoZW1hIHVzZWQgYnkgdGhlIERvY3VtZW50QnVpbGRlci4KKyAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHtAY29kZSBEb2N1bWVudEJ1aWxkZXJ9IGhhcyBuYW1lc3BhY2Ugc3VwcG9ydAorICAgICAqIGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgWE1MIHNjaGVtYQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5hbWVzcGFjZXMgYXJlIHR1cm5lZCBvbiwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgotICAgICAqICAgICAgICAgZG9lc24ndCBzdXBwb3J0IFhNTCBzY2hlbWFzLgotICAgICAqLwotICAgIC8vIFRPRE8gRG8gd2Ugd2FudCB0aGUgdmFsaWRhdGlvbiBwYWNrYWdlIGluPwotICAgIC8vIHB1YmxpYyBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWEgZ2V0U2NoZW1hKCkgdGhyb3dzCi0gICAgLy8gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotICAgIC8vIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIC8vIH0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIERvY3VtZW50QnVpbGRlciBoYXMgbmFtZXNwYWNlcyBlbmFibGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2VzIGFyZSB0dXJuZWQgb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKCk7CiAKICAgICAvKioKLSAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIERvY3VtZW50QnVpbGRlciBoYXMgdmFsaWRhdGluZyBlbmFibGVkLgorICAgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUge0Bjb2RlIERvY3VtZW50QnVpbGRlcn0gaGFzIHZhbGlkYXRpb24gc3VwcG9ydAorICAgICAqIGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHZhbGlkYXRpbmcgaXMgdHVybmVkIG9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdmFsaWRhdGlvbiBpcyB0dXJuZWQgb24sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmFsaWRhdGluZygpOwogCiAgICAgLyoqCi0gICAgICogUXVlcmllcyB3aGV0aGVyIHRoZSBEb2N1bWVudEJ1aWxkZXIgaGFzIFhJbmNsdWRlIHN1cHBvcnQgZW5hYmxlZC4KKyAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHtAY29kZSBEb2N1bWVudEJ1aWxkZXJ9IGhhcyBYSW5jbHVkZSBzdXBwb3J0IGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIFhJbmNsdWRlIHN1cHBvcnQgaXMgdHVybmVkIG9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgWEluY2x1ZGUgc3VwcG9ydCBpcyB0dXJuZWQgb24sIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHdoZW4gdGhlIHVuZGVybHlpbmcgaW1sZW1lbnRhdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24KICAgICAgKiAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBYSW5jbHVkZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1hJbmNsdWRlQXdhcmUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LCBzZXJ2aW5nIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgYSBET00gdHJlZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSBkb2N1bWVudCwgc2VydmluZyBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGEgRE9NCisgICAgICogdHJlZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkb2N1bWVudC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRG9jdW1lbnQgbmV3RG9jdW1lbnQoKTsKIAogICAgIC8qKgogICAgICAqIFBhcnNlcyBhIGdpdmVuIFhNTCBmaWxlIGFuZCBidWlsZHMgYSBET00gdHJlZSBmcm9tIGl0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGJlIHBhcnNlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgRE9NIHRyZWUuCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gYmUgcGFyc2VkLgorICAgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG9mIHRoZSBET00gdHJlZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiB0aGUgWE1MIHBhcnNpbmcgZmFpbHMuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBEb2N1bWVudCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewpAQCAtMTE4LDExICsxNDEsMTMgQEAKICAgICAvKioKICAgICAgKiBQYXJzZXMgYSBnaXZlbiBYTUwgaW5wdXQgc3RyZWFtIGFuZCBidWlsZHMgYSBET00gdHJlZSBmcm9tIGl0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIHN0cmVhbSB0byBiZSBwYXJzZWQuCi0gICAgICogQHJldHVybiBUaGUgZG9jdW1lbnQgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIERPTSB0cmVlLgorICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB0byBiZSBwYXJzZWQuCisgICAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIERPTSB0cmVlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIHRoZSBYTUwgcGFyc2luZyBmYWlscy4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIERvY3VtZW50IHBhcnNlKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKQEAgLTEzNSwxMiArMTYwLDE0IEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIGEgZ2l2ZW4gWE1MIGlucHV0IHN0cmVhbSBhbmQgYnVpbGRzIGEgRE9NIHRyZWUgZnJvbSBpdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0gdG8gYmUgcGFyc2VkLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgYmFzZSBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSSXMuCi0gICAgICogQHJldHVybiBUaGUgZG9jdW1lbnQgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIERPTSB0cmVlLgorICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB0byBiZSBwYXJzZWQuCisgICAgICogQHBhcmFtIHN5c3RlbUlkIHRoZSBiYXNlIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJJcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgRE9NIHRyZWUuCiAgICAgICogCiAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgdGhlIFhNTCBwYXJzaW5nIGZhaWxzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3Vycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgb3JnLnczYy5kb20uRG9jdW1lbnQgcGFyc2UoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgc3lzdGVtSWQpCiAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC0xNTcsMTEgKzE4NCwxMyBAQAogICAgICAqIFBhcnNlcyBhbiBYTUwgaW5wdXQgc3RyZWFtIGZyb20gYSBnaXZlbiBVUkkgYW5kIGJ1aWxkcyBhIERPTSB0cmVlIGZyb20KICAgICAgKiBpdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gZmV0Y2ggdGhlIFhNTCBzdHJlYW0gZnJvbS4KLSAgICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgRE9NIHRyZWUuCisgICAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIGZldGNoIHRoZSBYTUwgc3RyZWFtIGZyb20uCisgICAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIERPTSB0cmVlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIHRoZSBYTUwgcGFyc2luZyBmYWlscy4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIG9yZy53M2MuZG9tLkRvY3VtZW50IHBhcnNlKFN0cmluZyB1cmkpIHRocm93cyBTQVhFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CkBAIC0xNzUsMTEgKzIwNCwxMyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlcyBhbiBYTUwgaW5wdXQgc291cmNlIGFuZCBidWlsZHMgYSBET00gdHJlZSBmcm9tIGl0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIGlucHV0IHNvdXJjZSB0byBwYXJzZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgRE9NIHRyZWUuCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgaW5wdXQgc291cmNlIHRvIHBhcnNlLgorICAgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG9mIHRoZSBET00gdHJlZS4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiB0aGUgWE1MIHBhcnNpbmcgZmFpbHMuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Eb2N1bWVudCBwYXJzZShJbnB1dFNvdXJjZSBzb3VyY2UpCiAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKQEAgLTE4NywyNiArMjE4LDM0IEBACiAgICAgLyoqCiAgICAgICogUmVzZXRzIHRoZSBEb2N1bWVudEJ1aWxkZXIgdG8gdGhlIHNhbWUgc3RhdGUgaXMgd2FzIGluIGFmdGVyIGl0cwogICAgICAqIGNyZWF0aW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgICAgICAvLyBEbyBub3RoaW5nLgogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIEVudGl0eVJlc29sdmVyIHVzZWQgZm9yIHJlc29sdmluZyBlbnRpdGllcyBlbmNvdW50ZXJlZCBkdXJpbmcKLSAgICAgKiB0aGUgcGFyc2UgcHJvY2Vzcy4gUGFzc2luZyBudWxsIHJlc3VsdHMgaW4gdGhlIERvY3VtZW50QnVpbGRlcidzIG93bgotICAgICAqIEVudGl0eVJlc29sdmVyIGJlaW5nIHVzZWQuCisgICAgICogU2V0cyB0aGUge0BsaW5rIEVudGl0eVJlc29sdmVyfSB1c2VkIGZvciByZXNvbHZpbmcgZW50aXRpZXMgZW5jb3VudGVyZWQKKyAgICAgKiBkdXJpbmcgdGhlIHBhcnNlIHByb2Nlc3MuIFBhc3Npbmcge0Bjb2RlIG51bGx9IHJlc3VsdHMgaW4gdGhlCisgICAgICoge0Bjb2RlIERvY3VtZW50QnVpbGRlcn0ncyBvd24ge0Bjb2RlIEVudGl0eVJlc29sdmVyfSBiZWluZyB1c2VkLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvbHZlciBUaGUgRW50aXR5UmVzb2x2ZXIgdG8gdXNlLCBvciBudWxsIGZvciB0aGUgYnVpbHQtaW4gb25lLgorICAgICAqIEBwYXJhbSByZXNvbHZlciB0aGUge0Bjb2RlIEVudGl0eVJlc29sdmVyfSB0byB1c2UsIG9yIG51bGwgZm9yIHRoZQorICAgICAqICAgICAgICBidWlsdC1pbiBvbmUuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgRXJyb3JIYW5kbGVyIHVzZWQgZm9yIGRlYWxpbmcgd2l0aCBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZQotICAgICAqIHBhcnNlIHByb2Nlc3MuIFBhc3NpbmcgbnVsbCByZXN1bHRzIGluIHRoZSBEb2N1bWVudEJ1aWxkZXIncyBvd24KLSAgICAgKiBFcnJvckhhbmRsZXIgYmVpbmcgdXNlZC4KKyAgICAgKiBTZXRzIHRoZSB7QGxpbmsgRXJyb3JIYW5kbGVyfSB1c2VkIGZvciBkZWFsaW5nIHdpdGggZXJyb3JzIGVuY291bnRlcmVkCisgICAgICogZHVyaW5nIHRoZSBwYXJzZSBwcm9jZXNzLiBQYXNzaW5nIHtAY29kZSBudWxsfSByZXN1bHRzIGluIHRoZQorICAgICAqIHtAY29kZSBEb2N1bWVudEJ1aWxkZXJ9J3Mgb3duIHtAY29kZSBFcnJvckhhbmRsZXJ9IGJlaW5nIHVzZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIEVycm9ySGFuZGxlciB0byB1c2UsIG9yIG51bGwgZm9yIHRoZSBidWlsdC1pbiBvbmUuCisgICAgICogQHBhcmFtIGhhbmRsZXIgdGhlIHtAY29kZSBFcnJvckhhbmRsZXJ9IHRvIHVzZSwgb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUKKyAgICAgKiAgICAgICAgYnVpbHQtaW4gb25lLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIgaGFuZGxlcik7CiAKZGlmZiAtLWdpdCBhL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3RvcnkuamF2YSBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3RvcnkuamF2YQppbmRleCA1ZThkOGNkLi40ZTE4NmMxIDEwMDY0NAotLS0gYS94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5LmphdmEKKysrIGIveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5qYXZhCkBAIC0xOSwxMiArMTksMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGw7CiAKIC8qKgotICogUHJvdmlkZXMgYSBmYWN0b3J5IGZvciBEb2N1bWVudEJ1aWxkZXIgaW5zdGFuY2VzLiBUaGUgY2xhc3MgZmlyc3QgbmVlZHMgdG8gYmUKLSAqIGluc3RhbnRpYXRlZCB1c2luZyB0aGUgbmV3SW5zdGFuY2UoKSBtZXRob2QuIFRoZSBpbnN0YW5jZSBjYW4gYmUgY29uZmlndXJlZAotICogYXMgZGVzaXJlZC4gQSBjYWxsIHRvIG5ld0RvY3VtZW50QnVpbGRlciAoKSB0aGVuIHByb3ZpZGVzIGEgRG9jdW1lbnRCdWlsZGVyCisgKiBQcm92aWRlcyBhIGZhY3RvcnkgZm9yIHtAbGluayBEb2N1bWVudEJ1aWxkZXJ9IGluc3RhbmNlcy4gVGhlIGNsYXNzIGZpcnN0CisgKiBuZWVkcyB0byBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgdGhlIHtAbGluayAjbmV3SW5zdGFuY2UoKX0gbWV0aG9kLiBUaGUKKyAqIGluc3RhbmNlIGNhbiBiZSBjb25maWd1cmVkIGFzIGRlc2lyZWQuIEEgY2FsbCB0bworICoge0BsaW5rICNuZXdEb2N1bWVudEJ1aWxkZXIoKX0gdGhlbiBwcm92aWRlcyBhIHtAY29kZSBEb2N1bWVudEJ1aWxkZXJ9CiAgKiBpbnN0YW5jZSBtYXRjaGluZyB0aGlzIGNvbmZpZ3VyYXRpb24gKGlmIHBvc3NpYmxlKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBleHRlbmRzIE9iamVjdCB7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29hbGVzY2U7CiAKQEAgLTQwLDYgKzQzLDggQEAKIAogICAgIC8qKgogICAgICAqIERvLW5vdGhpbmcgY29uc3RydWN0b3IuIFRvIGJlIG92ZXJyaWRkZW4gYnkgY29uY3JldGUgZG9jdW1lbnQgYnVpbGRlcnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERvY3VtZW50QnVpbGRlckZhY3RvcnkoKSB7CiAgICAgICAgIC8vIERvZXMgbm90aGluZy4KQEAgLTQ4LDExICs1MywxMyBAQAogICAgIC8qKgogICAgICAqIFF1ZXJpZXMgYW4gYXR0cmlidXRlIGZyb20gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIHVua25vd24gdG8KLSAgICAgKiAgICAgICAgIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyB1bmtub3duIHRvIHRoZQorICAgICAqICAgICAgICAgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CkBAIC02MSw3ICs2OCw3IEBACiAgICAgICogUXVlcmllcyBhIGZlYXR1cmUgZnJvbSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4gVGhlIGRlZmF1bHQgQW5kcm9pZCBpbXBsZW1lbnRhdGlvbgotICAgICAqICAgICAgICAgICAgIG9mIERvY3VtZW50QnVpbGRlciBzdXBwb3J0cyBvbmx5IHRoZSBmb2xsb3dpbmcgdGhyZWUKKyAgICAgKiAgICAgICAgICAgICBvZiB7QGxpbmsgRG9jdW1lbnRCdWlsZGVyfSBzdXBwb3J0cyBvbmx5IHRoZSBmb2xsb3dpbmcgdGhyZWUKICAgICAgKiAgICAgICAgICAgICBmZWF0dXJlczoKICAgICAgKiAgICAgICAgICAgICAKICAgICAgKiAgICAgICAgICAgICA8ZGw+CkBAIC04NSwzMiArOTIsMzcgQEAKICAgICAgKiAgICAgICAgICAgICBuYW1lc3BhY2UgcHJlZml4ZXMgY2FuIGJlIGVuYWJsZWQsIGJ1dCBub3QgYm90aCBhdCB0aGUgc2FtZSAKICAgICAgKiAgICAgICAgICAgICB0aW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyBvZiB0aGUgZmVhdHVyZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIGZlYXR1cmUuCiAgICAgICogCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmZWF0dXJlIGlzIHVua25vd24gdG8KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmVhdHVyZSBpcyB1bmtub3duIHRvCiAgICAgICogICAgICAgICB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgdGhlIGZlYXR1cmUgaXMKKyAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgdGhlIGZlYXR1cmUgaXMKICAgICAgKiAgICAgICAgIGtub3duLCBidXQgbm90IHN1cHBvcnRlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBuYW1lKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisgICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIAotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgdGhlIGRlc2lyZWQgWE1MIFNjaGVtYSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgWE1MIFNjaGVtYSBvYmplY3QsIGlmIGl0IGhhcyBiZWVuIHNldCBieSBhIGNhbGwgdG8gc2V0U2NoZW1hLAotICAgICAqICAgICAgICAgb3IgbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgLy8gVE9ETyBEbyB3ZSB3YW50IHRoZSB2YWxpZGF0aW9uIHBhY2thZ2UgaW4/Ci0gICAgLy8gcHVibGljIGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0gICAgLy8gICAgIHJldHVybiBzY2hlbWE7Ci0gICAgLy8gfQorLy8gVE9ETyBObyBYU2NoZW1hIHN1cHBvcnQgaW4gQW5kcm9pZCAxLjAuIE1heWJlIGxhdGVyLgorLy8gICAgLyoqCisvLyAgICAgKiBRdWVyaWVzIHRoZSBkZXNpcmVkIFhNTCBTY2hlbWEgb2JqZWN0LgorLy8gICAgICogCisvLyAgICAgKiBAcmV0dXJuIFRoZSBYTUwgU2NoZW1hIG9iamVjdCwgaWYgaXQgaGFzIGJlZW4gc2V0IGJ5IGEgY2FsbCB0byBzZXRTY2hlbWEsCisvLyAgICAgKiAgICAgICAgIG9yIG51bGwgb3RoZXJ3aXNlLgorLy8gICAgICovCisvLyAgICBwdWJsaWMgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hIGdldFNjaGVtYSgpIHsKKy8vICAgICAgICByZXR1cm4gc2NoZW1hOworLy8gICAgfQogICAgIAogICAgIC8qKgogICAgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgZmFjdG9yeSBpcyBjb25maWd1cmVkIHRvIGRlbGl2ZXIgcGFyc2VycyB0aGF0IGNvbnZlcnQKLSAgICAgKiBDREFUQSBub2RlcyB0byB0ZXh0IG5vZGVzIGFuZCBtZWx0IHRoZW0gd2l0aCBuZWlnaGJvdXJpbmcgbm9kZXMuCisgICAgICogQ0RBVEEgbm9kZXMgdG8gdGV4dCBub2RlcyBhbmQgbWVsdCB0aGVtIHdpdGggbmVpZ2hib3Jpbmcgbm9kZXMuIFRoaXMgaXMKKyAgICAgKiBjYWxsZWQgImNvYWxlc2NpbmciLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb2FsZXNjaW5nIGlzIGRlc2lyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBjb2FsZXNjaW5nIGlzIGRlc2lyZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29hbGVzY2luZygpIHsKICAgICAgICAgcmV0dXJuIGNvYWxlc2NlOwpAQCAtMTIwLDcgKzEzMiwxMCBAQAogICAgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgZmFjdG9yeSBpcyBjb25maWd1cmVkIHRvIGRlbGl2ZXIgcGFyc2VycyB0aGF0IGV4cGFuZAogICAgICAqIGVudGl0eSByZWZlcmVuY2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlbnRpdHkgZXhwYW5zaW9uIGlzIGRlc2lyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBlbnRpdHkgZXhwYW5zaW9uIGlzIGRlc2lyZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewogICAgICAgICByZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKQEAgLTEzMCw3ICsxNDUsMTAgQEAKICAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBpZ25vcmUKICAgICAgKiBjb21tZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29tbWVudCBpZ25vcmFuY2UgaXMgZGVzaXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNvbW1lbnQgaWdub3JhbmNlIGlzIGRlc2lyZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmluZ0NvbW1lbnRzKCkgewogICAgICAgICByZXR1cm4gaWdub3JlQ29tbWVudHM7CkBAIC0xNDAsNyArMTU4LDEwIEBACiAgICAgICogUXVlcmllcyB3aGV0aGVyIHRoZSBmYWN0b3J5IGlzIGNvbmZpZ3VyZWQgdG8gZGVsaXZlciBwYXJzZXJzIHRoYXQgaWdub3JlCiAgICAgICogd2hpdGVzcGFjZSBpbiBlbGVtZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2hpdGVzcGFjZSBpZ25vcmFuY2UgaXMgZGVzaXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHdoaXRlc3BhY2UgaWdub3JhbmNlIGlzIGRlc2lyZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKICAgICAgICAgcmV0dXJuIGlnbm9yZUVsZW1lbnRDb250ZW50V2hpdGVzcGFjZTsKQEAgLTE1MCw3ICsxNzEsMTAgQEAKICAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBhcmUKICAgICAgKiBuYW1lc3BhY2UtYXdhcmUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZS1hd2FyZW5lc3MgaXMgZGVzaXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5hbWVzcGFjZS1hd2FyZW5lc3MgaXMgZGVzaXJlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKCkgewogICAgICAgICByZXR1cm4gbmFtZXNwYWNlQXdhcmU7CkBAIC0xNjAsNyArMTg0LDkgQEAKICAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBhcmUKICAgICAgKiB2YWxpZGF0aW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW5nIGlzIGRlc2lyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB2YWxpZGF0aW5nIGlzIGRlc2lyZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlOwpAQCAtMTcwLDMxICsxOTYsNDQgQEAKICAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBhcmUKICAgICAgKiBYSW5jbHVkZS1hd2FyZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgWEluY2x1ZGUtYXdhcmVuZXNzIGlzIGRlc2lyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBYSW5jbHVkZS1hd2FyZW5lc3MgaXMgZGVzaXJlZCwge0Bjb2RlIGZhbHNlfQorICAgICAqIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1hJbmNsdWRlQXdhcmUoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRCdWlsZGVyIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERvY3VtZW50QnVpbGRlcn0gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50CisgICAgICogY29uZmlndXJhdGlvbiBvZiB0aGUgZmFjdG9yeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBEb2N1bWVudEJ1aWxkZXIuCi0gICAgICogQHRocm93cyBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIG5vIG1hdGNoaW5nCi0gICAgICogICAgICAgICBEb2N1bWVudEJ1aWxkZXIgY291bGQgYmUgZm91bmQuCisgICAgICogQHJldHVybiB0aGUgRG9jdW1lbnRCdWlsZGVyLgorICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBubyBtYXRjaGluZworICAgICAqICAgICAgICAge0Bjb2RlIERvY3VtZW50QnVpbGRlcn0gY291bGQgYmUgZm91bmQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBuZXdEb2N1bWVudEJ1aWxkZXIoKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisgICAgcHVibGljIGFic3RyYWN0IERvY3VtZW50QnVpbGRlciBuZXdEb2N1bWVudEJ1aWxkZXIoKQorICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50QnVpbGRlckZhY3RvcnkgdGhhdCBjYW4gYmUgY29uZmlndXJlZCBhbmQgdGhlbiBiZQotICAgICAqIHVzZWQgZm9yIGNyZWF0aW5nIERvY3VtZW50QnVpbGRlciBvYmplY3RzLgorICAgICAqIHVzZWQgZm9yIGNyZWF0aW5nIERvY3VtZW50QnVpbGRlciBvYmplY3RzLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcyB0aGUKKyAgICAgKiB2YWx1ZSBvZiB0aGUge0Bjb2RlIERvY3VtZW50QnVpbGRlckZhY3Rvcnl9IHByb3BlcnR5LgorICAgICAqIElmIHRoaXMgaXMgbm9uLXtAY29kZSBudWxsfSwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgbmFtZSBvZiBhIGNsYXNzCisgICAgICogdGhhdCBzZXJ2ZXMgYXMgdGhlIGZhY3RvcnkuIFRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQsIGFuZCB0aGUgaW5zdGFuY2UKKyAgICAgKiBpcyByZXR1cm5lZC4gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHtAY29kZSBudWxsfSwgdGhlIHN5c3RlbSdzIGRlZmF1bHQKKyAgICAgKiBmYWN0b3J5IGltcGxlbWVudGF0aW9uIGlzIHJldHVybmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIERvY3VtZW50QnVpbGRlckZhY3RvcnkuCi0gICAgICogQHRocm93cyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIElmIG5vIERvY3VtZW50QnVpbGRlckZhY3RvcnkgY2FuIGJlCi0gICAgICogICAgICAgICBjcmVhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIERvY3VtZW50QnVpbGRlckZhY3RvcnkuCisgICAgICogQHRocm93cyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGlmIG5vIHtAY29kZSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5fQorICAgICAqICAgICAgICAgY2FuIGJlIGNyZWF0ZWQuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IG5ld0luc3RhbmNlKCkKKyAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgbmV3SW5zdGFuY2UoKQogICAgICAgICAgICAgdGhyb3dzIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewogICAgICAgICAvLyBUT0RPIFByb3BlcnRpZXMgZmlsZSBhbmQgTUVUQS1JTkYgY2FzZSBtaXNzaW5nIGhlcmUuIFNlZSBzcGVjLgogICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IFN5c3RlbQpAQCAtMjIxLDIwICsyNjAsMjUgQEAKICAgICAvKioKICAgICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBpbiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIHVua25vd24gdG8KLSAgICAgKiAgICAgICAgIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyB1bmtub3duIHRvIHRoZQorICAgICAqICAgICAgICAgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdAotICAgICAqIGNvbnZlcnQgQ0RBVEEgbm9kZXMgdG8gdGV4dCBub2RlcyBhbmQgbWVsdCB0aGVtIHdpdGggbmVpZ2hib3VyaW5nIG5vZGVzLgorICAgICAqIGNvbnZlcnQgQ0RBVEEgbm9kZXMgdG8gdGV4dCBub2RlcyBhbmQgbWVsdCB0aGVtIHdpdGggbmVpZ2hib3Jpbmcgbm9kZXMuCisgICAgICogVGhpcyBpcyBjYWxsZWQgImNvYWxlc2NpbmciLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUdXJucyBjb2FsZXNjaW5nIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgY29hbGVzY2luZyBvbiBvciBvZmYuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29hbGVzY2luZyhib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGNvYWxlc2NlID0gdmFsdWU7CkBAIC0yNDQsNyArMjg4LDkgQEAKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdAogICAgICAqIGV4cGFuZHMgZW50aXR5IHJlZmVyZW5jZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIFR1cm5zIGVudGl0eSByZWZlcmVuY2UgZXhwYW5zaW9uIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgZW50aXR5IHJlZmVyZW5jZSBleHBhbnNpb24gb24gb3Igb2ZmLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdmFsdWU7CkBAIC0yNTMsMzMgKzI5OSwzNSBAQAogICAgIC8qKgogICAgICAqIFNldHMgYSBmZWF0dXJlIGluIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiBUaGUgZGVmYXVsdCBBbmRyb2lkIGltcGxlbWVudGF0aW9uCi0gICAgICogICAgICAgICAgICAgb2YgRG9jdW1lbnRCdWlsZGVyIHN1cHBvcnRzIG9ubHkgdGhlIGZvbGxvd2luZyB0aHJlZQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiBUaGUgZGVmYXVsdCBBbmRyb2lkIGltcGxlbWVudGF0aW9uCisgICAgICogICAgICAgICAgICAgb2Yge0BsaW5rIERvY3VtZW50QnVpbGRlcn0gc3VwcG9ydHMgb25seSB0aGUgZm9sbG93aW5nIHRocmVlCiAgICAgICogICAgICAgICAgICAgZmVhdHVyZXM6CiAgICAgICogICAgICAgICAgICAgCiAgICAgICogICAgICAgICAgICAgPGRsPgogICAgICAqICAgICAgICAgICAgICAgPGR0PntAY29kZSBodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlc308L2R0PgotICAgICAqICAgICAgICAgICAgICAgPGRkPlF1ZXJpZXMgdGhlIHN0YXRlIG9mIG5hbWVzcGFjZS1hd2FyZW5lc3MuPC9kZD4KLSAgICAgKgorICAgICAqICAgICAgICAgICAgICAgPGRkPlNldHMgdGhlIHN0YXRlIG9mIG5hbWVzcGFjZS1hd2FyZW5lc3MuPC9kZD4KKyAgICAgKiAgICAgICAgICAgICAgIAogICAgICAqICAgICAgICAgICAgICAgPGR0PgogICAgICAqICAgICAgICAgICAgICAgICB7QGNvZGUgaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlc30KICAgICAgKiAgICAgICAgICAgICAgIDwvZHQ+Ci0gICAgICogICAgICAgICAgICAgICA8ZGQ+UXVlcmllcyB0aGUgc3RhdGUgb2YgbmFtZXNwYWNlIHByZWZpeCBwcm9jZXNzaW5nPC9kZD4KKyAgICAgKiAgICAgICAgICAgICAgIDxkZD5TZXRzIHRoZSBzdGF0ZSBvZiBuYW1lc3BhY2UgcHJlZml4IHByb2Nlc3Npbmc8L2RkPgogICAgICAqCiAgICAgICogICAgICAgICAgICAgICA8ZHQ+e0Bjb2RlIGh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9ufTwvZHQ+Ci0gICAgICogICAgICAgICAgICAgICA8ZGQ+UXVlcmllcyB0aGUgc3RhdGUgb2YgdmFsaWRhdGlvbi48L2RkPgorICAgICAqICAgICAgICAgICAgICAgPGRkPlNldHMgdGhlIHN0YXRlIG9mIHZhbGlkYXRpb24uPC9kZD4KICAgICAgKiAgICAgICAgICAgICA8L2RsPgogICAgICAqICAgICAgICAgICAgIAotICAgICAqICAgICAgICAgICAgIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBhYmlsaXR5IHRvIHF1ZXJ5IHRoZSB2YWxpZGF0aW9uCisgICAgICogICAgICAgICAgICAgTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGFiaWxpdHkgdG8gc2V0IHRoZSB2YWxpZGF0aW9uCiAgICAgICogICAgICAgICAgICAgZmVhdHVyZSwgdGhlcmUgaXMgY3VycmVudGx5IG5vIHZhbGlkYXRpbmcgcGFyc2VyIGF2YWlsYWJsZS4KICAgICAgKiAgICAgICAgICAgICBBbHNvIG5vdGUgdGhhdCBjdXJyZW50bHkgZWl0aGVyIG5hbWVzcGFjZXMgb3IKICAgICAgKiAgICAgICAgICAgICBuYW1lc3BhY2UgcHJlZml4ZXMgY2FuIGJlIGVuYWJsZWQsIGJ1dCBub3QgYm90aCBhdCB0aGUgc2FtZQogICAgICAqICAgICAgICAgICAgIHRpbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmVhdHVyZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmZWF0dXJlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgZmVhdHVyZSBpcyB1bmtub3duIHRvIHRoZQogICAgICAqICAgICAgICAgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKQogICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CkBAIC0yODgsNyArMzM2LDkgQEAKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdAogICAgICAqIGlnbm9yZSBjb21tZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgVHVybnMgY29tbWVudCBpZ25vcmFuY2Ugb24gb3Igb2ZmLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0dXJucyBjb21tZW50IGlnbm9yYW5jZSBvbiBvciBvZmYuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SWdub3JpbmdDb21tZW50cyhib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGlnbm9yZUNvbW1lbnRzID0gdmFsdWU7CkBAIC0yOTgsNyArMzQ4LDkgQEAKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdAogICAgICAqIGlnbm9yZXMgZWxlbWVudCB3aGl0ZXNwYWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUdXJucyBlbGVtZW50IHdoaXRlc3BhY2UgaWdub3JhbmNlIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgZWxlbWVudCB3aGl0ZXNwYWNlIGlnbm9yYW5jZSBvbiBvciBvZmYuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBpZ25vcmVFbGVtZW50Q29udGVudFdoaXRlc3BhY2UgPSB2YWx1ZTsKQEAgLTMwOCwyNyArMzYwLDMxIEBACiAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmYWN0b3J5IGlzIGNvbmZpZ3VyZWQgdG8gZGVsaXZlciBwYXJzZXJzIHRoYXQgYXJlCiAgICAgICogbmFtZXNwYWNlLWF3YXJlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUdXJucyBuYW1lc3BhY2UtYXdhcmVuZXNzIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgbmFtZXNwYWNlLWF3YXJlbmVzcyBvbiBvciBvZmYuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlQXdhcmUoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBuYW1lc3BhY2VBd2FyZSA9IHZhbHVlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lyZWQgWE1MIFNjaGVtYSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNjaGVtYSBUaGUgWE1MIFNjaGVtYSBvYmplY3QuCi0gICAgICovCi0gICAgLy8gVE9ETyBEbyB3ZSB3YW50IHRoZSB2YWxpZGF0aW9uIHBhY2thZ2UgaW4/Ci0gICAgLy8gcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYSBzY2hlbWEpIHsKLSAgICAvLyAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgLy8gfQorLy8gVE9ETyBObyBYU2NoZW1hIHN1cHBvcnQgaW4gQW5kcm9pZCAxLjAuIE1heWJlIGxhdGVyLgorLy8gICAgLyoqCisvLyAgICAgKiBTZXRzIHRoZSBkZXNpcmVkIFhNTCBTY2hlbWEgb2JqZWN0LgorLy8gICAgICogCisvLyAgICAgKiBAcGFyYW0gc2NoZW1hIFRoZSBYTUwgU2NoZW1hIG9iamVjdC4KKy8vICAgICAqLworLy8gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYSBzY2hlbWEpIHsKKy8vICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKKy8vICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBhcmUKICAgICAgKiB2YWxpZGF0aW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUdXJucyB2YWxpZGF0aW9uIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgdmFsaWRhdGlvbiBvbiBvciBvZmYuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIHZhbGlkYXRlID0gdmFsdWU7CkBAIC0zMzgsNyArMzk0LDkgQEAKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBhcmUKICAgICAgKiBYSW5jbHVkZS1hd2FyZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgVHVybnMgWEluY2x1ZGUtYXdhcmVuZXNzIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgWEluY2x1ZGUtYXdhcmVuZXNzIG9uIG9yIG9mZi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRYSW5jbHVkZUF3YXJlKGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLmphdmEgYi94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLmphdmEKaW5kZXggNTYwMjNlMS4uZjVlMGMwMyAxMDA2NDQKLS0tIGEveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvci5qYXZhCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL0ZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IuamF2YQpAQCAtMTcsMzYgKzE3LDQyIEBACiBwYWNrYWdlIGphdmF4LnhtbC5wYXJzZXJzOwogCiAvKioKLSAqIFJlcHJlc2VudHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIGR1cmluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBwYXJzZXIgZmFjdG9yeS4KKyAqIFJlcHJlc2VudHMgYW4gZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgcGFyc2VyIGZhY3RvcnkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKIAogICAgIC8qKgogICAgICAqIFRoZSBuZXN0ZWQgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLiBOb3RlIHRoYXQgdGhlIG5lc3RlZAotICAgICAqIGV4Y2VwdGlvbiB3aWxsIGJlIHN0b3JlZCBpbiBhIHNwZWNpYWwgYXR0cmlidXRlLCBhbmQgY2FuIGJlIHF1ZXJpZWQKLSAgICAgKiB1c2luZyB0aGUgZ2V0RXhjZXB0aW9uKCkgbWV0aG9kLiBJdCBkb2VzIG5vdCB1c2UgdGhlIGZhY2lsaXR5IHRoZQotICAgICAqIEV4Y2VwdGlvbiBjbGFzcyBwcm92aWRlcyBmb3Igc3RvcmluZyBuZXN0ZWQgZXhjZXB0aW9ucywgc2luY2UgdGhlIFhNTAotICAgICAqIEFQSSBwcmVkYXRlcyB0aGF0IGZhY2lsaXR5LgorICAgICAqIGV4Y2VwdGlvbiB3aWxsIGJlIHN0b3JlZCBpbiBhIHNwZWNpYWwgYXR0cmlidXRlLCBhbmQgY2FuIGJlIHF1ZXJpZWQgdXNpbmcKKyAgICAgKiB0aGUge0BsaW5rICNnZXRFeGNlcHRpb24oKX0gbWV0aG9kLiBJdCBkb2VzIG5vdCB1c2UgdGhlIGZhY2lsaXR5IHRoZQorICAgICAqIHtAbGluayBFeGNlcHRpb259IGNsYXNzIHByb3ZpZGVzIGZvciBzdG9yaW5nIG5lc3RlZCBleGNlcHRpb25zLCBzaW5jZSB0aGUKKyAgICAgKiBYTUwgQVBJIHByZWRhdGVzIHRoYXQgZmFjaWxpdHkuCiAgICAgICovCiAgICAgcHJpdmF0ZSBFeGNlcHRpb24gY2F1c2U7CiAgICAgCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHdpdGggbm8gZXJyb3IgbWVzc2FnZSBhbiBubwotICAgICAqIGNhdXNlLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3J9IHdpdGggbm8gZXJyb3IgbWVzc2FnZSBhbmQKKyAgICAgKiBubyBjYXVzZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3Igd2l0aCBubyBlcnJvciBtZXNzYWdlIGFuZCBhIGdpdmVuCi0gICAgICogY2F1c2UuCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcn0gd2l0aCBubyBlcnJvciBtZXNzYWdlIGFuZAorICAgICAqIGEgZ2l2ZW4gY2F1c2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuIE5vdGUgdGhhdCB0aGUgbmVzdGVkCi0gICAgICogICAgICAgICAgZXhjZXB0aW9uIHdpbGwgYmUgc3RvcmVkIGluIGEgc3BlY2lhbCBhdHRyaWJ1dGUsIGFuZCBjYW4gYmUKLSAgICAgKiAgICAgICAgICBxdWVyaWVkIHVzaW5nIHRoZSBnZXRFeGNlcHRpb24oKSBtZXRob2QuIEl0IGRvZXMgbm90IHVzZSB0aGUKLSAgICAgKiAgICAgICAgICBmYWNpbGl0eSB0aGUgRXhjZXB0aW9uIGNsYXNzIHByb3ZpZGVzIGZvciBzdG9yaW5nIG5lc3RlZAotICAgICAqICAgICAgICAgIGV4Y2VwdGlvbnMsIHNpbmNlIHRoZSBYTUwgQVBJIHByZWRhdGVzIHRoYXQgZmFjaWxpdHkuCisgICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuIE5vdGUgdGhhdCB0aGUgbmVzdGVkIGV4Y2VwdGlvbiB3aWxsCisgICAgICogICAgICAgIGJlIHN0b3JlZCBpbiBhIHNwZWNpYWwgYXR0cmlidXRlLCBhbmQgY2FuIGJlIHF1ZXJpZWQgdXNpbmcgdGhlCisgICAgICogICAgICAgIHtAbGluayAjZ2V0RXhjZXB0aW9uKCl9IG1ldGhvZC4gSXQgZG9lcyBub3QgdXNlIHRoZSBmYWNpbGl0eSB0aGUKKyAgICAgKiAgICAgICAgRXhjZXB0aW9uIGNsYXNzIHByb3ZpZGVzIGZvciBzdG9yaW5nIG5lc3RlZCBleGNlcHRpb25zLCBzaW5jZSB0aGUKKyAgICAgKiAgICAgICAgWE1MIEFQSSBwcmVkYXRlcyB0aGF0IGZhY2lsaXR5LgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcigpOwpAQCAtNTQsMTUgKzYwLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHdpdGggYSBnaXZlbiBlcnJvciBtZXNzYWdlIGFuZAotICAgICAqIGNhdXNlLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3J9IHdpdGggYSBnaXZlbiBlcnJvcgorICAgICAqIG1lc3NhZ2UgYW5kIGNhdXNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2Ugb2YgdGhlIGVycm9yLiBOb3RlIHRoYXQgdGhlIG5lc3RlZAotICAgICAqICAgICAgICAgIGV4Y2VwdGlvbiB3aWxsIGJlIHN0b3JlZCBpbiBhIHNwZWNpYWwgYXR0cmlidXRlLCBhbmQgY2FuIGJlCi0gICAgICogICAgICAgICAgcXVlcmllZCB1c2luZyB0aGUgZ2V0RXhjZXB0aW9uKCkgbWV0aG9kLiBJdCBkb2VzIG5vdCB1c2UgdGhlCi0gICAgICogICAgICAgICAgZmFjaWxpdHkgdGhlIEV4Y2VwdGlvbiBjbGFzcyBwcm92aWRlcyBmb3Igc3RvcmluZyBuZXN0ZWQKLSAgICAgKiAgICAgICAgICBleGNlcHRpb25zLCBzaW5jZSB0aGUgWE1MIEFQSSBwcmVkYXRlcyB0aGF0IGZhY2lsaXR5LgorICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLiBOb3RlIHRoYXQgdGhlIG5lc3RlZCBleGNlcHRpb24gd2lsbAorICAgICAqICAgICAgICBiZSBzdG9yZWQgaW4gYSBzcGVjaWFsIGF0dHJpYnV0ZSwgYW5kIGNhbiBiZSBxdWVyaWVkIHVzaW5nIHRoZQorICAgICAqICAgICAgICB7QGxpbmsgI2dldEV4Y2VwdGlvbigpfSBtZXRob2QuIEl0IGRvZXMgbm90IHVzZSB0aGUgZmFjaWxpdHkgdGhlCisgICAgICogICAgICAgIHtAbGluayBFeGNlcHRpb259IGNsYXNzIHByb3ZpZGVzIGZvciBzdG9yaW5nIG5lc3RlZCBleGNlcHRpb25zLAorICAgICAqICAgICAgICBzaW5jZSB0aGUgWE1MIEFQSSBwcmVkYXRlcyB0aGF0IGZhY2lsaXR5LgogICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yKEV4Y2VwdGlvbiBjYXVzZSwgU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSk7CkBAIC03MCwxMCArNzgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3Igd2l0aCBhIGdpdmVuIGVycm9yIG1lc3NhZ2UgYW5kIG5vCi0gICAgICogY2F1c2UuCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcn0gd2l0aCBhIGdpdmVuIGVycm9yCisgICAgICogbWVzc2FnZSBhbmQgbm8gY2F1c2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSk7CkBAIC04MiwyMSArOTIsMjcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IsIGluIGNhc2UgdGhlcmUgaXMgb25lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgZXJyb3IsIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQuCisgICAgICogQHJldHVybiB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBlcnJvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgaXMKKyAgICAgKiAgICAgICAgIHNldC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CisgICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CiAgICAgICAgIHJldHVybiBjYXVzZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvciwgaW4gY2FzZSB0aGVyZSBpcyBvbmUuCiAgICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZS4gSWYgYW4gZXhwbGljaXQgZXJyb3IgbWVzc2FnZSBoYXMgYmVlbiBhc3NpZ25lZCB0bworICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UuIElmIGFuIGV4cGxpY2l0IGVycm9yIG1lc3NhZ2UgaGFzIGJlZW4gYXNzaWduZWQgdG8KICAgICAgKiAgICAgICAgIHRoZSBleGNlcHRpb24sIHRoaXMgb25lIGlzIHJldHVybmVkLiBJZiBub3QsIGFuZCB0aGVyZSBpcyBhbgogICAgICAqICAgICAgICAgdW5kZXJseWluZyBleGNlcHRpb24gKHRoZSBjYXVzZSksIHRoZW4gdGhlIHJlc3VsdCBvZiBpbnZva2luZwotICAgICAqICAgICAgICAgdG9TdHJpbmcoKSBmb3IgdGhhdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCBudWxsIGlzIHJldHVybmVkLgorICAgICAqICAgICAgICAge0BsaW5rICN0b1N0cmluZygpfSBvbiB0aGF0IG9iamVjdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB7QGNvZGUKKyAgICAgKiAgICAgICAgIG51bGx9IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewogICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKIAogICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEgYi94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggMjAyOGQyYy4uNDk4NzVkNiAxMDA2NDQKLS0tIGEveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMTcsMjEgKzE3LDI4IEBACiBwYWNrYWdlIGphdmF4LnhtbC5wYXJzZXJzOwogCiAvKioKLSAqIFJlcHJlc2VudHMgYW4gZXhjZXB0aW9uIHRoYXQgb2NjdXJlZCBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgcGFyc2VyLgorICogUmVwcmVzZW50cyBhbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgcGFyc2VyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHdpdGggbm8gZXJyb3IgbWVzc2FnZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9ufSB3aXRoIG5vIGVycm9yIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHdpdGggYSBnaXZlbiBlcnJvciBtZXNzYWdlLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb259IHdpdGggYSBnaXZlbiBlcnJvcgorICAgICAqIG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1zZyBUaGUgZXJyb3IgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gbXNnIHRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL1NBWFBhcnNlci5qYXZhIGIveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyLmphdmEKaW5kZXggYmJlZTc1NC4uNzNjYzBlYiAxMDA2NDQKLS0tIGEveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyLmphdmEKKysrIGIveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyLmphdmEKQEAgLTI1LDg5ICsyNSwxMTAgQEAKIGltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKIAoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiAvKioKLSAqIFByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgYSBTQVggWE1MUmVhZGVyLiBUaGlzIGFic3RyYWN0IGNsYXNzIG9ubHkgZGVmaW5lcwotICogdGhlIGludGVyZmFjZSwgd2hlcmVhcyB0aGUgU0FYUGFyc2VyRmFjdG9yeSBjbGFzcyBpcyB1c2VkIHRvIG9idGFpbiBpbnN0YW5jZXMKLSAqIG9mIGNvbmNyZXRlIHN1YmNsYXNzZXMuCisgKiBQcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIGEgU0FYIHtAbGluayBYTUxSZWFkZXJ9LiBUaGlzIGFic3RyYWN0CisgKiBjbGFzcyBvbmx5IGRlZmluZXMgdGhlIGludGVyZmFjZSwgd2hlcmVhcyB0aGUge0BsaW5rIFNBWFBhcnNlckZhY3Rvcnl9IGNsYXNzCisgKiBpcyB1c2VkIHRvIG9idGFpbiBpbnN0YW5jZXMgb2YgY29uY3JldGUgc3ViY2xhc3Nlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTQVhQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IHsKIAogICAgIC8qKgogICAgICAqIERvLW5vdGhpbmcgY29uc3RydWN0b3IuIFByZXZlbnRzIGluc3RhbnRpYXRpb24uIFRvIGJlIG92ZXJyaWRkZW4gYnkKICAgICAgKiBjb25jcmV0ZSBzdWJjbGFzc2VzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTQVhQYXJzZXIoKSB7CiAgICAgICAgIC8vIERvZXMgbm90aGluZy4KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSB1bmRlcmx5aW5nIFNBWCBQYXJzZXIgb2JqZWN0LgorICAgICAqIFF1ZXJpZXMgdGhlIHVuZGVybHlpbmcgU0FYIHtAbGluayBQYXJzZXJ9IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBTQVggUGFyc2VyLgorICAgICAqIEByZXR1cm4gdGhlIFNBWCB7QGNvZGUgUGFyc2VyfS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzLgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IG9yZy54bWwuc2F4LlBhcnNlciBnZXRQYXJzZXIoKQotICAgICAgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3QgUGFyc2VyIGdldFBhcnNlcigpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUXVlcmllcyBhIHByb3BlcnR5IG9mIHRoZSB1bmRlcmx5aW5nIFNBWCBYTUxSZWFkZXIuCisgICAgICogUXVlcmllcyBhIHByb3BlcnR5IG9mIHRoZSB1bmRlcmx5aW5nIFNBWCB7QGxpbmsgWE1MUmVhZGVyfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qga25vd24gdG8gdGhlCi0gICAgICogICAgICAgICB1bmRlcmx5aW5nIFNBWCBYTUxSZWFkZXIuCi0gICAgICogQHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gSWYgdGhlIHByb3BlcnR5IGlzIGtub3duLCBidXQgbm90Ci0gICAgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgU0FYIFhNTFJlYWRlci4KKyAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBrbm93biB0byB0aGUKKyAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgU0FYIHtAY29kZSBYTUxSZWFkZXJ9LgorICAgICAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0eSBpcyBrbm93biwgYnV0IG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIFNBWCB7QGNvZGUgWE1MUmVhZGVyfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKQogICAgICAgICAgICAgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIAotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgdGhlIFhNTCBTY2hlbWEgdXNlZCBieSB0aGUgdW5kZXJseWluZyBYTUxSZWFkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgWE1MIFNjaGVtYS4KLSAgICAgKi8KLSAgICAvLyBUT0RPIERvIHdlIHdhbnQgdGhlIHZhbGlkYXRpb24gcGFja2FnZSBpbj8KLSAgICAvLyBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKLSAgICAvLyByZXR1cm4gc2NoZW1hOwotICAgIC8vIH0KKy8vIFRPRE8gTm8gWFNjaGVtYSBzdXBwb3J0IGluIEFuZHJvaWQgMS4wLiBNYXliZSBsYXRlci4KKy8vICAgIC8qKgorLy8gICAgICogUXVlcmllcyB0aGUgWE1MIFNjaGVtYSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIFhNTFJlYWRlci4KKy8vICAgICAqIAorLy8gICAgICogQHJldHVybiBUaGUgWE1MIFNjaGVtYS4KKy8vICAgICAqLworLy8gICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKSB7CisvLyAgICAgICAgcmV0dXJuIHNjaGVtYTsKKy8vICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBRdWVyaWVzIHRoZSB1bmRlcmx5aW5nIFNBWCBYTUxSZWFkZXIgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIFNBWCBYTUxSRWFkZXIuCisgICAgICogQHJldHVybiB0aGUgU0FYIFhNTFJFYWRlci4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzLgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFhNTFJlYWRlciBnZXRYTUxSZWFkZXIoKSB0aHJvd3MgU0FYRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVmbGVjdHMgd2hldGhlciB0aGlzIFNBWFBhcnNlciBpcyBuYW1lc3BhY2UtYXdhcmUuCisgICAgICogUmVmbGVjdHMgd2hldGhlciB0aGlzIHtAY29kZSBTQVhQYXJzZXJ9IGlzIG5hbWVzcGFjZS1hd2FyZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFNBWFBhcnNlciBpcyBuYW1lc3BhY2UtYXdhcmUsIG9yIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIFNBWFBhcnNlcn0gaXMgbmFtZXNwYWNlLWF3YXJlLCBvcgorICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUoKTsKIAogICAgIC8qKgotICAgICAqIFJlZmxlY3RzIHdoZXRoZXIgdGhpcyBTQVhQYXJzZXIgaXMgdmFsaWRhdGluZy4KKyAgICAgKiBSZWZsZWN0cyB3aGV0aGVyIHRoaXMge0Bjb2RlIFNBWFBhcnNlcn0gaXMgdmFsaWRhdGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFNBWFBhcnNlciBpcyB2YWxpZGF0aW5nLCBvciBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBTQVhQYXJzZXJ9IGlzIHZhbGlkYXRpbmcsIG9yIHtAY29kZQorICAgICAqIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWYWxpZGF0aW5nKCk7CiAKICAgICAvKioKLSAgICAgKiBSZWZsZWN0cyB3aGV0aGVyIHRoaXMgU0FYUGFyc2VyIGlzIFhJbmNsdWRlLWF3YXJlLgorICAgICAqIFJlZmxlY3RzIHdoZXRoZXIgdGhpcyB7QGNvZGUgU0FYUGFyc2VyfSBpcyBYSW5jbHVkZS1hd2FyZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFNBWFBhcnNlciBpcyBYSW5jbHVkZS1hd2FyZSwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgU0FYUGFyc2VyfSBpcyBYSW5jbHVkZS1hd2FyZSwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24KICAgICAgKiAgICAgICAgIGRvZXNuJ3Qga25vdyBhYm91dCBYSW5jbHVkZSBhdCBhbGwgKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1hJbmNsdWRlQXdhcmUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKQEAgLTExNiwxMSArMTM3LDEzIEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIHRoZSBnaXZlbiBYTUwgZmlsZSB1c2luZyB0aGUgZ2l2ZW4gU0FYIGV2ZW50IGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUuCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgU0FYIGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcGFyc2UoRmlsZSBmaWxlLCBIYW5kbGVyQmFzZSBoYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uLAogICAgICAgICAgICAgSU9FeGNlcHRpb24gewpAQCAtMTM3LDExICsxNjAsMTMgQEAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIFhNTCBmaWxlIHVzaW5nIHRoZSBnaXZlbiBTQVggZXZlbnQgaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZS4KLSAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgU0FYIGhhbmRsZXIuCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBTQVggaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwYXJzZShGaWxlIGZpbGUsIERlZmF1bHRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24sCiAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CkBAIC0xNTgsMTEgKzE4MywxMyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIElucHV0U3RyZWFtIHVzaW5nIHRoZSBnaXZlbiBTQVggZXZlbnQgaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBJbnB1dFN0cmVhbS4KLSAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgU0FYIGhhbmRsZXIuCisgICAgICogQHBhcmFtIHN0cmVhbSB0aGUgSW5wdXRTdHJlYW0gY29udGFpbmluZyB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBTQVggaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0sIEhhbmRsZXJCYXNlIGhhbmRsZXIpCiAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC0xNzYsMTIgKzIwMywxNCBAQAogICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIElucHV0U3RyZWFtIHVzaW5nIHRoZSBnaXZlbiBTQVggZXZlbnQgaGFuZGxlciBhbmQKICAgICAgKiBzeXN0ZW0gSUQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgSW5wdXRTdHJlYW0uCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBoYW5kbGVyLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgc3lzdGVtIElELgorICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgU0FYIGhhbmRsZXIuCisgICAgICogQHBhcmFtIHN5c3RlbUlkIHRoZSBzeXN0ZW0gSUQuCiAgICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gc3RyZWFtLCBIYW5kbGVyQmFzZSBoYW5kbGVyLCBTdHJpbmcgc3lzdGVtSWQpCiAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC0xOTgsMTEgKzIyNywxMyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIElucHV0U3RyZWFtIHVzaW5nIHRoZSBnaXZlbiBTQVggZXZlbnQgaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBJbnB1dFN0cmVhbS4KLSAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgU0FYIGhhbmRsZXIuCisgICAgICogQHBhcmFtIHN0cmVhbSB0aGUgSW5wdXRTdHJlYW0gY29udGFpbmluZyB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBTQVggaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0sIERlZmF1bHRIYW5kbGVyIGhhbmRsZXIpCiAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC0yMTMsMTIgKzI0NCwxNCBAQAogICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIElucHV0U3RyZWFtIHVzaW5nIHRoZSBnaXZlbiBTQVggZXZlbnQgaGFuZGxlciBhbmQKICAgICAgKiBzeXN0ZW0gSUQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgSW5wdXRTdHJlYW0uCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBoYW5kbGVyLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgc3lzdGVtIElELgorICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgU0FYIGhhbmRsZXIuCisgICAgICogQHBhcmFtIHN5c3RlbUlkIHRoZSBzeXN0ZW0gSUQuCiAgICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gc3RyZWFtLCBEZWZhdWx0SGFuZGxlciBoYW5kbGVyLAogICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC0yMzUsMTEgKzI2OCwxMyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFVSSSB1c2luZyB0aGUgZ2l2ZW4gU0FYIGV2ZW50IGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHVyaSBUaGUgVVJJLgotICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBTQVggaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgcG9pbnRpbmcgdG8gdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgU0FYIGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHVyaSwgSGFuZGxlckJhc2UgaGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwKICAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKQEAgLTI1MiwxMSArMjg3LDEzIEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gVVJJIHVzaW5nIHRoZSBnaXZlbiBTQVggZXZlbnQgaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkuCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBwb2ludGluZyB0byB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBTQVggaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBTQVggcGFyc2luZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgZ2VuZXJhbCBJTyBwcm9ibGVtIG9jY3Vycy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgdXJpLCBEZWZhdWx0SGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uLAogICAgICAgICAgICAgSU9FeGNlcHRpb24gewpAQCAtMjY3LDEzICszMDQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIFNBWCBJbnB1dFNvdXJjZSB1c2luZyB0aGUgZ2l2ZW4gU0FYIGV2ZW50IGhhbmRsZXIuCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBTQVgge0BsaW5rIElucHV0U291cmNlfSB1c2luZyB0aGUgZ2l2ZW4gU0FYIGV2ZW50CisgICAgICogaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBTQVggSW5wdXRTb3VyY2UuCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIFNBWCB7QGNvZGUgSW5wdXRTb3VyY2V9IGNvbnRhaW5pbmcgdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgU0FYIGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTb3VyY2Ugc291cmNlLCBIYW5kbGVyQmFzZSBoYW5kbGVyKQogICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtMjkzLDEzICszMzMsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIFNBWCBJbnB1dFNvdXJjZSB1c2luZyB0aGUgZ2l2ZW4gU0FYIGV2ZW50IGhhbmRsZXIuCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBTQVgge0BsaW5rIElucHV0U291cmNlfSB1c2luZyB0aGUgZ2l2ZW4gU0FYIGV2ZW50CisgICAgICogaGFuZGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBTQVggSGFuZGxlckJhc2UuCi0gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIFNBWCB7QGNvZGUgSW5wdXRTb3VyY2V9IGNvbnRhaW5pbmcgdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgU0FYIGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGdlbmVyYWwgSU8gcHJvYmxlbSBvY2N1cnMuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTb3VyY2Ugc291cmNlLCBEZWZhdWx0SGFuZGxlciBoYW5kbGVyKQogICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtMzE5LDIzICszNjIsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIERvY3VtZW50QnVpbGRlciB0byB0aGUgc2FtZSBzdGF0ZSBpcyB3YXMgaW4gYWZ0ZXIgaXRzCisgICAgICogUmVzZXRzIHRoZSB7QGNvZGUgU0FYUGFyc2VyfSB0byB0aGUgc2FtZSBzdGF0ZSBpcyB3YXMgaW4gYWZ0ZXIgaXRzCiAgICAgICogY3JlYXRpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHByb3BlcnR5IG9mIHRoZSB1bmRlcmx5aW5nIFNBWCBYTUxSZWFkZXIuCisgICAgICogU2V0cyBhIHByb3BlcnR5IG9mIHRoZSB1bmRlcmx5aW5nIFNBWCB7QGxpbmsgWE1MUmVhZGVyfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgogICAgICAqIAotICAgICAqIEB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGtub3duIHRvIHRoZQotICAgICAqICAgICAgICAgdW5kZXJseWluZyBTQVggWE1MUmVhZGVyLgotICAgICAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIElmIHRoZSBwcm9wZXJ0eSBpcyBrbm93biwgYnV0IG5vdAotICAgICAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIFNBWCBYTUxSZWFkZXIuCisgICAgICogQHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3Qga25vd24gdG8gdGhlCisgICAgICogICAgICAgICB1bmRlcmx5aW5nIFNBWCB7QGNvZGUgWE1MUmVhZGVyfS4KKyAgICAgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgaXMga25vd24sIGJ1dCBub3QKKyAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBTQVgge0Bjb2RlIFhNTFJlYWRlcn0uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKICAgICAgICAgICAgIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247CmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9TQVhQYXJzZXJGYWN0b3J5LmphdmEgYi94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9TQVhQYXJzZXJGYWN0b3J5LmphdmEKaW5kZXggNDM1Yjg5Yy4uZWJmMDUzMSAxMDA2NDQKLS0tIGEveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyRmFjdG9yeS5qYXZhCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL1NBWFBhcnNlckZhY3RvcnkuamF2YQpAQCAtMjMsMTAgKzIzLDEyIEBACiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogCiAvKioKLSAqIFByb3ZpZGVzIGEgZmFjdG9yeSBmb3IgU0FYUGFyc2VyIGluc3RhbmNlcy4gVGhlIGNsYXNzIGZpcnN0IG5lZWRzIHRvIGJlCi0gKiBpbnN0YW50aWF0ZWQgdXNpbmcgdGhlIG5ld0luc3RhbmNlKCkgbWV0aG9kLiBUaGUgaW5zdGFuY2UgY2FuIGJlCi0gKiBjb25maWd1cmVkIGFzIGRlc2lyZWQuIEEgY2FsbCB0byBuZXdTQVhQYXJzZXIoKSB0aGVuIHByb3ZpZGVzIGEgU0FYUGFyc2VyCi0gKiBpbnN0YW5jZSBtYXRjaGluZyB0aGlzIGNvbmZpZ3VyYXRpb24uIAorICogUHJvdmlkZXMgYSBmYWN0b3J5IGZvciB7QGxpbmsgU0FYUGFyc2VyfSBpbnN0YW5jZXMuIFRoZSBjbGFzcyBmaXJzdCBuZWVkcyB0bworICogYmUgaW5zdGFudGlhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI25ld0luc3RhbmNlKCl9IG1ldGhvZC4gVGhlIGluc3RhbmNlIGNhbiBiZQorICogY29uZmlndXJlZCBhcyBkZXNpcmVkLiBBIGNhbGwgdG8gaXRzIHtAbGluayAjbmV3U0FYUGFyc2VyKCl9IHRoZW4gcHJvdmlkZXMgYQorICoge0Bjb2RlIFNBWFBhcnNlcn0gaW5zdGFuY2UgbWF0Y2hpbmcgdGhpcyBjb25maWd1cmF0aW9uLCBpZiBwb3NzaWJsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTQVhQYXJzZXJGYWN0b3J5IHsKIApAQCAtMzksNiArNDEsOCBAQAogICAgIC8qKgogICAgICAqIERvLW5vdGhpbmcgY29uc3RydWN0b3IuIFByZXZlbnRzIGluc3RhbnRpYXRpb24uIFRvIGJlIG92ZXJyaWRkZW4gYnkKICAgICAgKiBjb25jcmV0ZSBzdWJjbGFzc2VzLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHByb3RlY3RlZCBTQVhQYXJzZXJGYWN0b3J5KCkgewogICAgICAgICAvLyBEb2VzIG5vdGhpbmcuCkBAIC00OCw3ICs1Miw4IEBACiAgICAgICogUXVlcmllcyBhIGZlYXR1cmUgZnJvbSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4gVGhlIGRlZmF1bHQgQW5kcm9pZCBpbXBsZW1lbnRhdGlvbgotICAgICAqICAgICAgICAgICAgIG9mIFNBWFBhcnNlciBzdXBwb3J0cyBvbmx5IHRoZSBmb2xsb3dpbmcgdGhyZWUgZmVhdHVyZXM6CisgICAgICogICAgICAgICAgICAgb2Yge0BsaW5rIFNBWFBhcnNlcn0gc3VwcG9ydHMgb25seSB0aGUgZm9sbG93aW5nIHRocmVlCisgICAgICogICAgICAgICAgICAgZmVhdHVyZXM6CiAgICAgICogICAgICAgICAgICAgCiAgICAgICogICAgICAgICAgICAgPGRsPgogICAgICAqICAgICAgICAgICAgICAgPGR0PntAY29kZSBodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlc308L2R0PgpAQCAtNjksMzUgKzc0LDQwIEBACiAgICAgICogICAgICAgICAgICAgbmFtZXNwYWNlIHByZWZpeGVzIGNhbiBiZSBlbmFibGVkLCBidXQgbm90IGJvdGggYXQgdGhlIHNhbWUgCiAgICAgICogICAgICAgICAgICAgdGltZS4KICAgICAgKiAgICAgICAgICAgICAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgb2YgdGhlIGZlYXR1cmUuCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBmZWF0dXJlLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBubyBTQVhQYXJzZXIgbWF0Y2hpbmcgdGhlIGdpdmVuCi0gICAgICogICAgICAgICBjcml0ZXJpYSBpcyBhdmFpbGFibGUuCi0gICAgICogQHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIElmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIG5vdCBrbm93biB0bworICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBubyB7QGNvZGUgU0FYUGFyc2VyfSBtYXRjaGluZyB0aGUKKyAgICAgKiAgICAgICAgIGdpdmVuIGNyaXRlcmlhIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGZlYXR1cmUgaXMgbm90IGtub3duIHRvCiAgICAgICogICAgICAgICB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4gZmVhdHVyZXMgaXMga25vd24sIGJ1dCBub3QKKyAgICAgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gZmVhdHVyZXMgaXMga25vd24sIGJ1dCBub3QKICAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIG5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwKICAgICAgICAgICAgIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIAotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgdGhlIGRlc2lyZWQgWE1MIFNjaGVtYSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgWE1MIFNjaGVtYSBvYmplY3QsIGlmIGl0IGhhcyBiZWVuIHNldCBieSBhIGNhbGwgdG8gc2V0U2NoZW1hLAotICAgICAqICAgICAgICAgb3IgbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgLy8gVE9ETyBEbyB3ZSB3YW50IHRoZSB2YWxpZGF0aW9uIHBhY2thZ2UgaW4/Ci0gICAgLy8gcHVibGljIGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0gICAgLy8gcmV0dXJuIHNjaGVtYTsKLSAgICAvLyB9CisvLyBUT0RPIE5vIFhTY2hlbWEgc3VwcG9ydCBpbiBBbmRyb2lkIDEuMC4gTWF5YmUgbGF0ZXIuCisvLyAgICAvKioKKy8vICAgICAqIFF1ZXJpZXMgdGhlIGRlc2lyZWQgWE1MIFNjaGVtYSBvYmplY3QuCisvLyAgICAgKiAKKy8vICAgICAqIEByZXR1cm4gVGhlIFhNTCBTY2hlbWEgb2JqZWN0LCBpZiBpdCBoYXMgYmVlbiBzZXQgYnkgYSBjYWxsIHRvIHNldFNjaGVtYSwKKy8vICAgICAqICAgICAgICAgb3IgbnVsbCBvdGhlcndpc2UuCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWEgZ2V0U2NoZW1hKCkgeworLy8gICAgICAgIHJldHVybiBzY2hlbWE7CisvLyAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogUXVlcmllcyB3aGV0aGVyIHRoZSBmYWN0b3J5IGlzIGNvbmZpZ3VyZWQgdG8gZGVsaXZlciBwYXJzZXJzIHRoYXQgYXJlCiAgICAgICogbmFtZXNwYWNlLWF3YXJlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UtYXdhcmVuZXNzIGlzIGRlc2lyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBuYW1lc3BhY2UtYXdhcmVuZXNzIGlzIGRlc2lyZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKCkgewogICAgICAgICByZXR1cm4gbmFtZXNwYWNlQXdhcmU7CkBAIC0xMDcsNyArMTE3LDkgQEAKICAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBhcmUKICAgICAgKiB2YWxpZGF0aW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW5nIGlzIGRlc2lyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB2YWxpZGF0aW5nIGlzIGRlc2lyZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKICAgICAgICAgcmV0dXJuIHZhbGlkYXRpbmc7CkBAIC0xMTcsMTkgKzEyOSwzMCBAQAogICAgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgZmFjdG9yeSBpcyBjb25maWd1cmVkIHRvIGRlbGl2ZXIgcGFyc2VycyB0aGF0IGFyZQogICAgICAqIFhJbmNsdWRlLWF3YXJlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBYSW5jbHVkZS1hd2FyZW5lc3MgaXMgZGVzaXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFhJbmNsdWRlLWF3YXJlbmVzcyBpcyBkZXNpcmVkLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNYSW5jbHVkZUF3YXJlKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFNBWFBhcnNlckZhY3RvcnkgdGhhdCBjYW4gYmUgY29uZmlndXJlZCBhbmQgdGhlbiBiZSB1c2VkCi0gICAgICogZm9yIGNyZWF0aW5nIFNBWFBBcnNlciBvYmplY3RzLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNBWFBhcnNlckZhY3Rvcnl9IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgYW5kIHRoZW4gYmUKKyAgICAgKiB1c2VkIGZvciBjcmVhdGluZyB7QGxpbmsgU0FYUGFyc2VyfSBvYmplY3RzLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcyB0aGUKKyAgICAgKiB2YWx1ZSBvZiB0aGUge0Bjb2RlIFNBWFBhcnNlckZhY3Rvcnl9IHByb3BlcnR5LiBJZiB0aGlzCisgICAgICogaXMgbm9uLXtAY29kZSBudWxsfSwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgc2VydmVzCisgICAgICogYXMgdGhlIGZhY3RvcnkuIFRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQsIGFuZCB0aGUgaW5zdGFuY2UgaXMgcmV0dXJuZWQuCisgICAgICogSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHtAY29kZSBudWxsfSwgdGhlIHN5c3RlbSdzIGRlZmF1bHQgZmFjdG9yeQorICAgICAqIGltcGxlbWVudGF0aW9uIGlzIHJldHVybmVkLiAKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBTQVhQYXJzZXJGYWN0b3J5LgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBTQVhQYXJzZXJGYWN0b3J5fS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgSWYgbm8gU0FYUGFyc2VyRmFjdG9yeSBjYW4gYmUgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgaWYgbm8ge0Bjb2RlIFNBWFBhcnNlckZhY3Rvcnl9IGNhbiBiZQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBuZXdJbnN0YW5jZSgpCiAgICAgICAgICAgICB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciB7CkBAIC0xNTQsMTMgKzE3NywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU0FYUGFyc2VyIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFNBWFBhcnNlcn0gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YKKyAgICAgKiB0aGUgZmFjdG9yeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBTQVhQYXJzZXIuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFNBWFBhcnNlcn0uCiAgICAgICogCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIG5vIG1hdGNoaW5nIFNBWFBhcnNlciBjb3VsZCBiZQotICAgICAqICAgICAgICAgZm91bmQuCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgU0FYIHBhcnNpbmcuCisgICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIG5vIG1hdGNoaW5nIHtAY29kZSBTQVhQYXJzZXJ9CisgICAgICogICAgICAgICBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBjcmVhdGluZyB0aGUge0Bjb2RlIFNBWFBhcnNlcn0gZmFpbGVkIGR1ZSB0byBzb21lCisgICAgICogICAgICAgICBvdGhlciByZWFzb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNBWFBhcnNlciBuZXdTQVhQYXJzZXIoKQogICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbjsKQEAgLTE2OCwyMCArMTk1LDIxIEBACiAgICAgLyoqCiAgICAgICogU2V0cyBhIGZlYXR1cmUgaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUuIFRoZSBkZWZhdWx0IEFuZHJvaWQgaW1wbGVtZW50YXRpb24KLSAgICAgKiAgICAgICAgICAgICBvZiBTQVhQYXJzZXIgc3VwcG9ydHMgb25seSB0aGUgZm9sbG93aW5nIHRocmVlIGZlYXR1cmVzOgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiBUaGUgZGVmYXVsdCBBbmRyb2lkIGltcGxlbWVudGF0aW9uCisgICAgICogICAgICAgICAgICAgb2Yge0BsaW5rIFNBWFBhcnNlcn0gc3VwcG9ydHMgb25seSB0aGUgZm9sbG93aW5nIHRocmVlCisgICAgICogICAgICAgICAgICAgZmVhdHVyZXM6CiAgICAgICogICAgICAgICAgICAgCiAgICAgICogICAgICAgICAgICAgPGRsPgogICAgICAqICAgICAgICAgICAgICAgPGR0PntAY29kZSBodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlc308L2R0PgotICAgICAqICAgICAgICAgICAgICAgPGRkPlF1ZXJpZXMgdGhlIHN0YXRlIG9mIG5hbWVzcGFjZS1hd2FyZW5lc3MuPC9kZD4KKyAgICAgKiAgICAgICAgICAgICAgIDxkZD5TZXRzIHRoZSBzdGF0ZSBvZiBuYW1lc3BhY2UtYXdhcmVuZXNzLjwvZGQ+CiAgICAgICoKICAgICAgKiAgICAgICAgICAgICAgIDxkdD4KICAgICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIGh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXN9CiAgICAgICogICAgICAgICAgICAgICA8L2R0PgotICAgICAqICAgICAgICAgICAgICAgPGRkPlF1ZXJpZXMgdGhlIHN0YXRlIG9mIG5hbWVzcGFjZSBwcmVmaXggcHJvY2Vzc2luZzwvZGQ+CisgICAgICogICAgICAgICAgICAgICA8ZGQ+U2V0cyB0aGUgc3RhdGUgb2YgbmFtZXNwYWNlIHByZWZpeCBwcm9jZXNzaW5nPC9kZD4KICAgICAgKgogICAgICAqICAgICAgICAgICAgICAgPGR0PntAY29kZSBodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbn08L2R0PgotICAgICAqICAgICAgICAgICAgICAgPGRkPlF1ZXJpZXMgdGhlIHN0YXRlIG9mIHZhbGlkYXRpb24uPC9kZD4KKyAgICAgKiAgICAgICAgICAgICAgIDxkZD5TZXRzIHRoZSBzdGF0ZSBvZiB2YWxpZGF0aW9uLjwvZGQ+CiAgICAgICogICAgICAgICAgICAgPC9kbD4KICAgICAgKiAgICAgICAgICAgICAKICAgICAgKiAgICAgICAgICAgICBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgYWJpbGl0eSB0byBxdWVyeSB0aGUgdmFsaWRhdGlvbgpAQCAtMTkwLDE0ICsyMTgsMTYgQEAKICAgICAgKiAgICAgICAgICAgICBuYW1lc3BhY2UgcHJlZml4ZXMgY2FuIGJlIGVuYWJsZWQsIGJ1dCBub3QgYm90aCBhdCB0aGUgc2FtZSAKICAgICAgKiAgICAgICAgICAgICB0aW1lLgogICAgICAqICAgICAgICAgICAgIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RhdHVzIG9mIHRoZSBmZWF0dXJlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgc3RhdHVzIG9mIHRoZSBmZWF0dXJlLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBubyBTQVhQYXJzZXIgbWF0Y2hpbmcgdGhlIGdpdmVuCi0gICAgICogICAgICAgICBjcml0ZXJpYSBpcyBhdmFpbGFibGUuCi0gICAgICogQHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIElmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIG5vdCBrbm93biB0bworICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBubyB7QGNvZGUgU0FYUGFyc2VyfSBtYXRjaGluZworICAgICAqICAgICAgICAgdGhlIGdpdmVuIGNyaXRlcmlhIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGZlYXR1cmUgaXMgbm90IGtub3duIHRvCiAgICAgICogICAgICAgICB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4gZmVhdHVyZXMgaXMga25vd24sIGJ1dCBub3QKKyAgICAgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gZmVhdHVyZXMgaXMga25vd24sIGJ1dCBub3QKICAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAgICAgICAgIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpCiAgICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwKQEAgLTIwNywyNiArMjM3LDMxIEBACiAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmYWN0b3J5IGlzIGNvbmZpZ3VyZWQgdG8gZGVsaXZlciBwYXJzZXJzIHRoYXQgYXJlCiAgICAgICogbmFtZXNwYWNlLWF3YXJlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUdXJucyBuYW1lc3BhY2UtYXdhcmVuZXNzIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgbmFtZXNwYWNlLWF3YXJlbmVzcyBvbiBvciBvZmYuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlQXdhcmUoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBuYW1lc3BhY2VBd2FyZSA9IHZhbHVlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lyZWQgWE1MIFNjaGVtYSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNjaGVtYSBUaGUgWE1MIFNjaGVtYSBvYmplY3QuCi0gICAgICovCi0gICAgLy8gVE9ETyBEbyB3ZSB3YW50IHRoZSB2YWxpZGF0aW9uIHBhY2thZ2UgaW4/Ci0gICAgLy8gcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYSBzY2hlbWEpIHsKLSAgICAvLyB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICAvLyB9CisvLyBUT0RPIE5vIFhTY2hlbWEgc3VwcG9ydCBpbiBBbmRyb2lkIDEuMC4gTWF5YmUgbGF0ZXIuCisvLyAgICAvKioKKy8vICAgICAqIFNldHMgdGhlIGRlc2lyZWQgWE1MIFNjaGVtYSBvYmplY3QuCisvLyAgICAgKiAKKy8vICAgICAqIEBwYXJhbSBzY2hlbWEgVGhlIFhNTCBTY2hlbWEgb2JqZWN0LgorLy8gICAgICovCisvLyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHNjaGVtYSkgeworLy8gICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisvLyAgICB9CisKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBkZWxpdmVyIHBhcnNlcnMgdGhhdCBhcmUKICAgICAgKiB2YWxpZGF0aW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUdXJucyB2YWxpZGF0aW9uIG9uIG9yIG9mZi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdHVybnMgdmFsaWRhdGlvbiBvbiBvciBvZmYuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIHZhbGlkYXRpbmcgPSB2YWx1ZTsKQEAgLTIzNiw3ICsyNzEsOSBAQAogICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmFjdG9yeSBpcyBjb25maWd1cmVkIHRvIGRlbGl2ZXIgcGFyc2VycyB0aGF0IGFyZQogICAgICAqIFhJbmNsdWRlLWF3YXJlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBUdXJucyBYSW5jbHVkZS1hd2FyZW5lc3Mgb24gb3Igb2ZmLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0dXJucyBYSW5jbHVkZS1hd2FyZW5lc3Mgb24gb3Igb2ZmLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFhJbmNsdWRlQXdhcmUoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL3BhY2thZ2UuaHRtbCBiL3htbC9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9wYXJzZXJzL3BhY2thZ2UuaHRtbAppbmRleCAxNTIyZTVhLi43ZTA5MjFkIDEwMDY0NAotLS0gYS94bWwvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9wYWNrYWdlLmh0bWwKKysrIGIveG1sL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvcGFja2FnZS5odG1sCkBAIC0xOSw1ICsxOSw2IEBACiAgICAgICB2YXJpb3VzIERPTSBjbGFzc2VzIG1pZ2h0IGRpZmZlciBmcm9tIG90aGVyIGltcGxlbWVudGF0aW9ucyBhbmQgKGIpCiAgICAgICByZXF1ZXN0aW5nIGEgdmFsaWRhdGluZyBwYXJzZXIgd2lsbCBhbHdheXMgZmFpbC4KICAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCiAgIDwvYm9keT4KIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvaW8vS1htbFBhcnNlci5qYXZhIGIveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL2lvL0tYbWxQYXJzZXIuamF2YQppbmRleCA4MTI1NzQ1Li4wNzI3YmM3IDEwMDY0NAotLS0gYS94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvaW8vS1htbFBhcnNlci5qYXZhCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi9pby9LWG1sUGFyc2VyLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTnNwOwogICAgIHByaXZhdGUgYm9vbGVhbiByZWxheGVkOwotICAgIHByaXZhdGUgSGFzaE1hcCBlbnRpdHlNYXA7CisgICAgcHJpdmF0ZSBIYXNodGFibGUgZW50aXR5TWFwOwogICAgIHByaXZhdGUgaW50IGRlcHRoOwogICAgIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudFN0YWNrID0gbmV3IFN0cmluZ1sxNl07CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBuc3BTdGFjayA9IG5ldyBTdHJpbmdbOF07CkBAIC05NSwxMCArOTUsMTIgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gdG9rZW47CiAKICAgICBwdWJsaWMgS1htbFBhcnNlcigpIHsKLS8vICAgICAgICBzcmNCdWYgPSBuZXcgY2hhcltSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkgPj0gMTA0ODU3NiA/IDgxOTIgOiAxMjhdOwotCi0gICAgICAgIC8vICBYWFg6IFdlIGRvbid0IGhhdmUgYSBSdW50aW1lIGNsYXNzIGF0IHRoaXMgdGltZS4KKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBSdW50aW1lIGNsYXNzIGF0IHRoaXMgdGltZS4KKyAgICAgICAgLy8gc3JjQnVmID0KKyAgICAgICAgLy8gICAgICAgICBuZXcgY2hhcltSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkgPj0gMTA0ODU3NiA/IDgxOTIgOiAxMjhdOwogICAgICAgICBzcmNCdWYgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1Byb3AoU3RyaW5nIG4xLCBib29sZWFuIHByb3AsIFN0cmluZyBuMikgewpAQCAtOTY0LDcgKzk2Niw3IEBACiAgICAgICAgIHBlZWtDb3VudCA9IDA7CiAgICAgICAgIGRlcHRoID0gMDsKIAotICAgICAgICBlbnRpdHlNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBlbnRpdHlNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CiAgICAgICAgIGVudGl0eU1hcC5wdXQoImFtcCIsICImIik7CiAgICAgICAgIGVudGl0eU1hcC5wdXQoImFwb3MiLCAiJyIpOwogICAgICAgICBlbnRpdHlNYXAucHV0KCJndCIsICI+Iik7CmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIva2RvbS9FbGVtZW50LmphdmEgYi94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIva2RvbS9FbGVtZW50LmphdmEKaW5kZXggNjFkNTExMS4uNmE1Nzc3YiAxMDA2NDQKLS0tIGEveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL2tkb20vRWxlbWVudC5qYXZhCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi9rZG9tL0VsZW1lbnQuamF2YQpAQCAtMzQsOSArMzQsOSBAQAogCiAgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgYXR0cmlidXRlczsKKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGF0dHJpYnV0ZXM7CiAgICAgcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgcHJlZml4ZXM7CisgICAgcHJvdGVjdGVkIFZlY3RvciBwcmVmaXhlczsKIAogICAgIHB1YmxpYyBFbGVtZW50KCkgewogICAgIH0KQEAgLTgxLDI0ICs4MSwyMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlIChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuICgoU3RyaW5nIFtdKSBhdHRyaWJ1dGVzLmdldChpbmRleCkpIFswXTsKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nIFtdKSBhdHRyaWJ1dGVzLmVsZW1lbnRBdCAoaW5kZXgpKSBbMF07CiAgICAgfQogCisvKiAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeCAoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiAoKFN0cmluZyBbXSkgYXR0cmlidXRlcy5lbGVtZW50QXQgKGluZGV4KSkgWzFdOworICAgIH0qLworCiAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lIChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuICgoU3RyaW5nIFtdKSBhdHRyaWJ1dGVzLmdldChpbmRleCkpIFsxXTsKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nIFtdKSBhdHRyaWJ1dGVzLmVsZW1lbnRBdCAoaW5kZXgpKSBbMV07CiAgICAgfQogICAgIAogCiAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSAoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiAoKFN0cmluZyBbXSkgYXR0cmlidXRlcy5nZXQoaW5kZXgpKSBbMl07CisgICAgICAgIHJldHVybiAoKFN0cmluZyBbXSkgYXR0cmlidXRlcy5lbGVtZW50QXQgKGluZGV4KSkgWzJdOwogICAgIH0KICAgICAKLQotICAgIHB1YmxpYyBTdHJpbmcKLSAgICBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBuYW1lKTsKLSAgICB9CiAgICAgCiAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSAoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRBdHRyaWJ1dGVDb3VudCAoKTsgaSsrKSB7CkBAIC0xNjUsMTEgKzE2MywxMSBAQAogCiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeCAoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuICgoU3RyaW5nIFtdKSBwcmVmaXhlcy5nZXQoaSkpIFswXTsKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nIFtdKSBwcmVmaXhlcy5lbGVtZW50QXQgKGkpKSBbMF07CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkgKGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoKFN0cmluZyBbXSkgcHJlZml4ZXMuZ2V0KGkpKSBbMV07CisgICAgICAgIHJldHVybiAoKFN0cmluZyBbXSkgcHJlZml4ZXMuZWxlbWVudEF0IChpKSkgWzFdOwogICAgIH0KIAogCkBAIC0yNDAsMTggKzIzOCwxOCBAQAogCiAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlIChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIAotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgVmVjdG9yICgpOwogCiAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgCiAgICAgICAgICAgICBuYW1lc3BhY2UgPSAiIjsKICAgICAgICAgCiAgICAgICAgIGZvciAoaW50IGkgPSBhdHRyaWJ1dGVzLnNpemUoKS0xOyBpID49MDsgaS0tKXsKLSAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ID0gKFN0cmluZ1tdKSBhdHRyaWJ1dGVzLmdldChpKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ID0gKFN0cmluZ1tdKSBhdHRyaWJ1dGVzLmVsZW1lbnRBdChpKTsKICAgICAgICAgICAgIGlmIChhdHRyaWJ1dFswXS5lcXVhbHMobmFtZXNwYWNlKSAmJgogICAgICAgICAgICAgICAgIGF0dHJpYnV0WzFdLmVxdWFscyhuYW1lKSl7CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnJlbW92ZUVsZW1lbnRBdChpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0WzJdID0gdmFsdWU7CkBAIC0yNjAsNyArMjU4LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBTdHJpbmdbXSB7bmFtZXNwYWNlLCBuYW1lLCB2YWx1ZX0pOworICAgICAgICBhdHRyaWJ1dGVzLmFkZEVsZW1lbnQgCisgICAgICAgICAgICAobmV3IFN0cmluZyBbXSB7bmFtZXNwYWNlLCBuYW1lLCB2YWx1ZX0pOwogICAgIH0KIAogCkBAIC0yNjksOCArMjY4LDggQEAKICAgICAgKiBwcmVmaXggKi8KIAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeCAoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBpZiAocHJlZml4ZXMgPT0gbnVsbCkgcHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByZWZpeGVzLmFkZChuZXcgU3RyaW5nIFtdIHtwcmVmaXgsIG5hbWVzcGFjZX0pOyAgICAgICAgCisgICAgICAgIGlmIChwcmVmaXhlcyA9PSBudWxsKSBwcmVmaXhlcyA9IG5ldyBWZWN0b3IgKCk7CisgICAgICAgIHByZWZpeGVzLmFkZEVsZW1lbnQgKG5ldyBTdHJpbmcgW10ge3ByZWZpeCwgbmFtZXNwYWNlfSk7ICAgICAgICAKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL2tkb20vTm9kZS5qYXZhIGIveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL2tkb20vTm9kZS5qYXZhCmluZGV4IDQ4NTU4OTMuLmEzY2M3OGQgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi9rZG9tL05vZGUuamF2YQorKysgYi94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIva2RvbS9Ob2RlLmphdmEKQEAgLTM4LDcgKzM4LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UID0gOTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET0NERUNMID0gMTA7CiAKLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOworICAgIHByb3RlY3RlZCBWZWN0b3IgY2hpbGRyZW47CiAgICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciB0eXBlczsKIAogICAgIC8qKiBpbnNlcnRzIHRoZSBnaXZlbiBjaGlsZCBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUgYXQgdGhlCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKIAogICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKICAgICAgICAgICAgIHR5cGVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICB9CiAKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgZWxzZSBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIFN0cmluZykpCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU3RyaW5nIGV4cGVjdGVkIik7CiAKLSAgICAgICAgY2hpbGRyZW4uYWRkKGluZGV4LCBjaGlsZCk7CisgICAgICAgIGNoaWxkcmVuLmluc2VydEVsZW1lbnRBdChjaGlsZCwgaW5kZXgpOwogICAgICAgICB0eXBlcy5pbnNlcnQoaW5kZXgsIChjaGFyKSB0eXBlKTsKICAgICB9CiAKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgICAgdHlwZXMsIGEgU3RyaW5nIGlzIHJldHVybmVkLiAqLwogCiAgICAgcHVibGljIE9iamVjdCBnZXRDaGlsZChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmdldChpbmRleCk7CisgICAgICAgIHJldHVybiBjaGlsZHJlbi5lbGVtZW50QXQoaW5kZXgpOwogICAgIH0KIAogICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hpbGQgb2JqZWN0cyAqLwpAQCAtMjcyLDcgKzI3Miw3IEBACiAgICAgLyoqIFJlbW92ZXMgdGhlIGNoaWxkIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXggKi8KIAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKGludCBpZHgpIHsKLSAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKGlkeCk7CisgICAgICAgIGNoaWxkcmVuLnJlbW92ZUVsZW1lbnRBdChpZHgpOwogCiAgICAgICAgIC8qKiogIE1vZGlmaWNhdGlvbiBieSBISFMgLSBzdGFydCAqKiovCiAgICAgICAgIC8vICAgICAgdHlwZXMuZGVsZXRlQ2hhckF0IChpbmRleCk7CkBAIC0zMjQsNyArMzI0LDcgQEAKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUoaSk7Ci0gICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIEVMRU1FTlQgOgogICAgICAgICAgICAgICAgICAgICAgKChFbGVtZW50KSBjaGlsZCkud3JpdGUod3JpdGVyKTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi93YXAvV2J4bWxQYXJzZXIuamF2YSBiL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi93YXAvV2J4bWxQYXJzZXIuamF2YQppbmRleCBjMzg1MmViLi42MTdlMWQ0IDEwMDY0NAotLS0gYS94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvd2FwL1dieG1sUGFyc2VyLmphdmEKKysrIGIveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL3dhcC9XYnhtbFBhcnNlci5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiAKIC8vIENvbnRyaWJ1dG9yczogQmpvcm4gQWFkbGFuZCwgQ2hyaXMgQmFydGxleSwgTmljb2xhIEZhbmtoYXVzZXIsCiAvLyAgICAgICAgICAgICAgIFZpY3RvciBIYXZpbiwgIENocmlzdGlhbiBLdXJ6a2UsIEJvZ2RhbiBPbm9pdSwKLS8vICAgICAgICAgICAgICAgSmFpbiBTYW5qYXksIERhdmlkIFNhbnRvcm8uCisvLyAgICAgICAgICAgICAgICBFbGlhcyBSb3NzLCBKYWluIFNhbmpheSwgRGF2aWQgU2FudG9yby4KIAogcGFja2FnZSBvcmcua3htbDIud2FwOwogCkBAIC0zMiw2ICszMiwxMSBAQAogCiAKIHB1YmxpYyBjbGFzcyBXYnhtbFBhcnNlciBpbXBsZW1lbnRzIFhtbFB1bGxQYXJzZXIgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIRVhfRElHSVRTID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICAgIAorICAgIC8qKiBQYXJzZXIgZXZlbnQgdHlwZSBmb3IgV2J4bWwtc3BlY2lmaWMgZXZlbnRzLiBUaGUgV2J4bWwgZXZlbnQgY29kZSBjYW4gYmUgCisgICAgICogYWNjZXNzZWQgd2l0aCBnZXRXYXBDb2RlKCkgKi8KICAgICAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVBfRVhURU5TSU9OID0gNjQ7CiAgICAgCkBAIC02NCw5ICs2OSw4IEBACiAgICAgCiAgICAgcHJpdmF0ZSBWZWN0b3IgdGFibGVzID0gbmV3IFZlY3RvcigpOwogICAgIAotICAgIGludCB2ZXJzaW9uOwotICAgIGludCBwdWJsaWNJZGVudGlmaWVySWQ7Ci0gICAgaW50IGNoYXJTZXQ7CisgICAgcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKyAgICBwcml2YXRlIGludCBwdWJsaWNJZGVudGlmaWVySWQ7CiAgICAgCiAgICAgLy8gICAgU3RhcnRUYWcgY3VycmVudDsKICAgICAvLyAgICBQYXJzZUV2ZW50IG5leHQ7CkBAIC03NSwxNiArNzksMTUgQEAKICAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKICAgICBwcml2YXRlIFN0cmluZyB0ZXh0OwotICAgIC8vICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOworCiAgICAgcHJpdmF0ZSBPYmplY3Qgd2FwRXh0ZW5zaW9uRGF0YTsKLSAgICBwcml2YXRlIGludCB3YXBFeHRlbnNpb25Db2RlOworICAgIHByaXZhdGUgaW50IHdhcENvZGU7CiAgICAgCiAgICAgcHJpdmF0ZSBpbnQgdHlwZTsKLSAgICBwcml2YXRlIGludCBjb2RlUGFnZTsKICAgICAKICAgICBwcml2YXRlIGJvb2xlYW4gZGVnZW5lcmF0ZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIGlzV2hpdGVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7CiAgICAgCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgewogICAgICAgICBpZiAoWG1sUHVsbFBhcnNlcgpAQCAtOTYsNyArOTksNiBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKSB7Ci0gICAgICAgIC8vIHNob3VsZCByZXR1cm4gc29tZXRpbmcgZGVwZW5kaW5nIG9uIGNoYXJTZXQgaGVyZSEhISEhCiAgICAgICAgIHJldHVybiBlbmNvZGluZzsKICAgICB9CiAgICAgCkBAIC0zMTUsNiArMzE3LDEwIEBACiAgICAgICAgIHJldHVybiB0eXBlOwogICAgIH0KICAgICAKKyAgICAKKyAgICAvLyBUT0RPOiBSZXVzZSByZXNvbHZlV2FwRXh0ZW5zaW9uIGhlcmU/IFJhdyBXYXAgZXh0ZW5zaW9ucyB3b3VsZCBzdGlsbCBiZSBhY2Nlc3NpYmxlCisgICAgLy8gdmlhIG5leHRUb2tlbigpOyAgLi4uLj8KKyAgICAKICAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICAKICAgICAgICAgaXNXaGl0ZXNwYWNlID0gdHJ1ZTsKQEAgLTMzOCw2ICszNDQsNyBAQAogICAgICAgICAgICAgICAgIHN3aXRjaChwZWVrSWQoKSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIFdieG1sLkVOVElUWToKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXYnhtbC5TVFJfSToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXYnhtbC5TVFJfVDoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXYnhtbC5MSVRFUkFMOgogICAgICAgICAgICAgICAgICAgICBjYXNlIFdieG1sLkxJVEVSQUxfQzoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXYnhtbC5MSVRFUkFMX0E6CkBAIC00MDgsNyArNDE1LDcgQEAKICAgICAgICAgfHwgKG5hbWVzcGFjZSAhPSBudWxsICYmICFuYW1lc3BhY2UuZXF1YWxzKGdldE5hbWVzcGFjZSgpKSkKICAgICAgICAgfHwgKG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoZ2V0TmFtZSgpKSkpCiAgICAgICAgICAgICBleGNlcHRpb24oCi0gICAgICAgICAgICAiZXhwZWN0ZWQ6ICIgKyBUWVBFU1t0eXBlXSArICIgeyIgKyBuYW1lc3BhY2UgKyAifSIgKyBuYW1lKTsKKyAgICAgICAgICAgICJleHBlY3RlZDogIiArICh0eXBlID09IFdBUF9FWFRFTlNJT04gPyAiV0FQIEV4dC4iIDogKFRZUEVTW3R5cGVdICsgIiB7IiArIG5hbWVzcGFjZSArICJ9IiArIG5hbWUpKSk7CiAgICAgfQogICAgIAogICAgIApAQCAtNjk4LDcgKzcwNSwxMCBAQAogICAgICAgICAgICAgY2FzZSBXYnhtbC5FWFRfMSA6CiAgICAgICAgICAgICBjYXNlIFdieG1sLkVYVF8yIDoKICAgICAgICAgICAgIGNhc2UgV2J4bWwuT1BBUVVFIDoKLSAgICAgICAgICAgICAgICBwYXJzZVdhcEV4dGVuc2lvbihpZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdHlwZSA9IFdBUF9FWFRFTlNJT047CisgICAgICAgICAgICAgICAgd2FwQ29kZSA9IGlkOworICAgICAgICAgICAgICAgIHdhcEV4dGVuc2lvbkRhdGEgPSBwYXJzZVdhcEV4dGVuc2lvbihpZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIFdieG1sLlBJIDoKQEAgLTcyMiw0OCArNzMyLDQyIEBACiAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV4dDsKICAgICB9CiAgICAgCisgICAgLyoqIE92ZXJ3cml0ZSB0aGlzIG1ldGhvZCB0byBpbnRlcmNlcHQgYWxsIHdhcCBldmVudHMgKi8KICAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwYXJzZVdhcEV4dGVuc2lvbihpbnQgaWQpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIHR5cGUgPSBXQVBfRVhURU5TSU9OOwotICAgICAgICB3YXBFeHRlbnNpb25Db2RlID0gaWQ7CisgICAgcHVibGljIE9iamVjdCBwYXJzZVdhcEV4dGVuc2lvbihpbnQgaWQpICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewogICAgICAgICAKICAgICAgICAgc3dpdGNoIChpZCkgewogICAgICAgICAgICAgY2FzZSBXYnhtbC5FWFRfSV8wIDoKICAgICAgICAgICAgIGNhc2UgV2J4bWwuRVhUX0lfMSA6CiAgICAgICAgICAgICBjYXNlIFdieG1sLkVYVF9JXzIgOgotICAgICAgICAgICAgICAgIHdhcEV4dGVuc2lvbkRhdGEgPSByZWFkU3RySSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJldHVybiByZWFkU3RySSgpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBXYnhtbC5FWFRfVF8wIDoKICAgICAgICAgICAgIGNhc2UgV2J4bWwuRVhUX1RfMSA6CiAgICAgICAgICAgICBjYXNlIFdieG1sLkVYVF9UXzIgOgotICAgICAgICAgICAgICAgIHdhcEV4dGVuc2lvbkRhdGEgPSBuZXcgSW50ZWdlcihyZWFkSW50KCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihyZWFkSW50KCkpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBXYnhtbC5FWFRfMCA6CiAgICAgICAgICAgICBjYXNlIFdieG1sLkVYVF8xIDoKICAgICAgICAgICAgIGNhc2UgV2J4bWwuRVhUXzIgOgotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBXYnhtbC5PUEFRVUUgOiAKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZEludCgpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbY291bnRdOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIGkgPCBsZW47Ci0gICAgICAgICAgICAgICAgaSsrKSAvLyBlbmhhbmNlIHdpdGggYmxvY2tyZWFkIQotICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAoYnl0ZSkgcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICB3aGlsZShjb3VudCA+IDApeworICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSBpbi5yZWFkKGJ1ZiwgYnVmLmxlbmd0aC1jb3VudCwgY291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3YXBFeHRlbnNpb25EYXRhID0gYnVmOworICAgICAgICAgICAgICAgIHJldHVybiBidWY7CiAgICAgICAgICAgICB9IC8vIGNhc2UgT1BBUVVFCi0gICAgICAgICAgICBicmVhazsKKyAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBleGNlcHRpb24oImlsbGVnYWwgaWQ6ICIraWQpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkZWFkIGNvZGUKICAgICAgICAgfSAvLyBTV0lUQ0gKICAgICB9CiAgICAgCkBAIC04MjQsMjAgKzgyOCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2J4bWwuRVhUXzEgOgogICAgICAgICAgICAgICAgICAgICBjYXNlIFdieG1sLkVYVF8yIDoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXYnhtbC5PUEFRVUUgOgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigid2FwIGV4dGVuc2lvbiBpbiBhdHRyIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUV2ZW50IGUgPSBwYXJzZVdhcEV4dGVuc2lvbihpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlLmdldFR5cGUoKSAhPSBYbWwuVEVYVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGUuZ2V0VHlwZSgpICE9IFhtbC5XSElURVNQQUNFKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicGFyc2UgV2FwRXh0ZW5zaW9uIG11c3QgcmV0dXJuIFRleHQgRXZlbnQgaW4gb3JkZXIgdG8gd29yayBpbnNpZGUgQXR0cmlidXRlcyEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbHVlLmFwcGVuZCAoaGFuZGxlRXh0ZW5zaW9uIChpZCkpOyAvLyBza2lwIEVYVCBpbiBBVFRSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQocmVzb2x2ZVdhcEV4dGVuc2lvbihpZCwgcGFyc2VXYXBFeHRlbnNpb24oaWQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBjYXNlIFdieG1sLlNUUl9UIDoKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChyZWFkU3RyVCgpKTsKQEAgLTg2OSwxOSArODYxLDM5IEBACiAgICAgICAgIHJldHVybiBuZXh0SWQ7CiAgICAgfQogICAgIAorICAgIC8qKiBvdmVyd3JpdGUgZm9yIG93biBXQVAgZXh0ZW5zaW9uIGhhbmRsaW5nIGluIGF0dHJpYnV0ZXMgYW5kIGhpZ2ggbGV2ZWwgcGFyc2luZyAKKyAgICAgKiAoYWJvdmUgbmV4dFRva2VuKCkgbGV2ZWwpICovCiAgICAgCi0gICAgCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlV2FwRXh0ZW5zaW9uKGludCBpZCwgT2JqZWN0IGRhdGEpeworICAgICAgICAKKyAgICAgICAgaWYoZGF0YSBpbnN0YW5jZW9mIGJ5dGVbXSl7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBieXRlW10gYiA9IChieXRlW10pIGRhdGE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChIRVhfRElHSVRTLmNoYXJBdCgoYltpXSA+PiA0KSAmIDB4MGYpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoSEVYX0RJR0lUUy5jaGFyQXQoYltpXSAmIDB4MGYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICIkKCIrZGF0YSsiKSI7CisgICAgfQogICAgIAogICAgIFN0cmluZyByZXNvbHZlSWQoU3RyaW5nW10gdGFiLCBpbnQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBpZHggPSAoaWQgJiAweDA3ZikgLSA1OwotICAgICAgICBpZiAoaWR4ID09IC0xKQorICAgICAgICBpZiAoaWR4ID09IC0xKXsKKyAgICAgICAgICAgIHdhcENvZGUgPSAtMTsKICAgICAgICAgICAgIHJldHVybiByZWFkU3RyVCgpOworICAgICAgICB9CiAgICAgICAgIGlmIChpZHggPCAwCiAgICAgICAgIHx8IHRhYiA9PSBudWxsCiAgICAgICAgIHx8IGlkeCA+PSB0YWIubGVuZ3RoCiAgICAgICAgIHx8IHRhYltpZHhdID09IG51bGwpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImlkICIgKyBpZCArICIgdW5kZWYuIik7CiAgICAgICAgIAorICAgICAgICB3YXBDb2RlID0gaWR4KzU7CisgICAgICAgIAogICAgICAgICByZXR1cm4gdGFiW2lkeF07CiAgICAgfQogICAgIApAQCAtMTAyMiw3ICsxMDM0LDcgQEAKICAgICB9CiAgICAgCiAgICAgLyoqIFNldHMgdGhlIGF0dHJpYnV0ZSBzdGFydCBUYWJsZSBmb3IgYSBnaXZlbiBwYWdlLgotICAgICAqICAgIFRoZSBmaXJzdCBzdHJpbmcgaW4gdGhlIGFycmF5IGRlZmluZXMgYXR0cmlidXRlCisgICAgICogIFRoZSBmaXJzdCBzdHJpbmcgaW4gdGhlIGFycmF5IGRlZmluZXMgYXR0cmlidXRlCiAgICAgICogIDUsIHRoZSBzZWNvbmQgYXR0cmlidXRlIDYgZXRjLiBQbGVhc2UgdXNlIHRoZQogICAgICAqICBjaGFyYWN0ZXIgJz0nICh3aXRob3V0IHF1b3RlISkgYXMgZGVsaW1pdGVyCiAgICAgICogIGJldHdlZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCB0aGUgKHN0YXJ0IG9mIHRoZSkgdmFsdWUKQEAgLTEwMzYsNyArMTA0OCw3IEBACiAgICAgfQogICAgIAogICAgIC8qKiBTZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgVGFibGUgZm9yIGEgZ2l2ZW4gcGFnZS4KLSAgICAgKiAgICBUaGUgZmlyc3Qgc3RyaW5nIGluIHRoZSBhcnJheSBkZWZpbmVzIGF0dHJpYnV0ZSB2YWx1ZSAweDg1LAorICAgICAqICBUaGUgZmlyc3Qgc3RyaW5nIGluIHRoZSBhcnJheSBkZWZpbmVzIGF0dHJpYnV0ZSB2YWx1ZSAweDg1LAogICAgICAqICB0aGUgc2Vjb25kIGF0dHJpYnV0ZSB2YWx1ZSAweDg2IGV0Yy4KICAgICAgKi8KICAgICAKQEAgLTEwNDcsNCArMTA1OSwxNyBAQAogICAgICAgICBzZXRUYWJsZShwYWdlLCBBVFRSX1ZBTFVFX1RBQkxFLCB0YWJsZSk7CiAgICAgfQogICAgIAorICAgIC8qKiBSZXR1cm5zIHRoZSB0b2tlbiBJRCBmb3Igc3RhcnQgdGFncyBvciB0aGUgZXZlbnQgdHlwZSBmb3Igd2FwIHByb3ByaWV0YXJ5IGV2ZW50cworICAgICAqIHN1Y2ggYXMgT1BBUVVFLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0V2FwQ29kZSgpeworICAgICAgICByZXR1cm4gd2FwQ29kZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCBnZXRXYXBFeHRlbnNpb25EYXRhKCl7CisgICAgICAgIHJldHVybiB3YXBFeHRlbnNpb25EYXRhOworICAgIH0KKyAgICAKKyAgICAKIH0KZGlmZiAtLWdpdCBhL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi93YXAvV2J4bWxTZXJpYWxpemVyLmphdmEgYi94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvd2FwL1dieG1sU2VyaWFsaXplci5qYXZhCmluZGV4IGU0NDQ3YjAuLjhjMWI1OTggMTAwNjQ0Ci0tLSBhL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi93YXAvV2J4bWxTZXJpYWxpemVyLmphdmEKKysrIGIveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL3dhcC9XYnhtbFNlcmlhbGl6ZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwogICogSU4gVEhFIFNPRlRXQVJFLiAqLwogCi0vL0NvbnRyaWJ1dG9yczogQm9nZGFuIE9ub2l1IChHZW5kZXJhbCBjaGFyYWN0ZXIgZW5jb2RpbmcgYWJzdHJhY3Rpb24gYW5kIFVURi04IFN1cHBvcnQpCisvL0NvbnRyaWJ1dG9yczogSm9uYXRoYW4gQ294LCBCb2dkYW4gT25vaXUsIEplcnJ5IFRpYW4KIAogcGFja2FnZSBvcmcua3htbDIud2FwOwogCkBAIC0zOCw2ICszOCw3IEBACiAKIHB1YmxpYyBjbGFzcyBXYnhtbFNlcmlhbGl6ZXIgaW1wbGVtZW50cyBYbWxTZXJpYWxpemVyIHsKICAgICAKKyAgICAKICAgICBIYXNodGFibGUgc3RyaW5nVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7CiAgICAgCiAgICAgT3V0cHV0U3RyZWFtIG91dDsKQEAgLTU4LDcgKzU5LDcgQEAKICAgICBwcml2YXRlIGludCBhdHRyUGFnZTsKICAgICBwcml2YXRlIGludCB0YWdQYWdlOwogICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKICAgICAKICAgICAKICAgICBwdWJsaWMgWG1sU2VyaWFsaXplciBhdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewpAQCAtMTM3LDcgKzEzOCw3IEBACiAgICAgCiAgICAgCiAgICAgLyoqIEFUVEVOVElPTjogZmx1c2ggY2Fubm90IHdvcmsgc2luY2UgV2J4bWwgZG9jdW1lbnRzIHJlcXVpcmUKLSAgICAgIG5lZWQgYnVmZmVyaW5nLiBUaHVzLCB0aGlzIGNhbGwgZG9lcyBub3RoaW5nLiAqLworICAgICAgYnVmZmVyaW5nLiBUaHVzLCB0aGlzIGNhbGwgZG9lcyBub3RoaW5nLiAqLwogICAgIAogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgewogICAgIH0KQEAgLTE1OCwxMiArMTU5LDEyIEBACiAgICAgICAgICAgICA/IChkZWdlbmVyYXRlZCA/IFdieG1sLkxJVEVSQUwgOiBXYnhtbC5MSVRFUkFMX0MpCiAgICAgICAgICAgICA6IChkZWdlbmVyYXRlZCA/IFdieG1sLkxJVEVSQUxfQSA6IFdieG1sLkxJVEVSQUxfQUMpKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgd3JpdGVTdHJUKHBlbmRpbmcpOworICAgICAgICAgICAgd3JpdGVTdHJUKHBlbmRpbmcsIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGlmKGlkeFswXSAhPSB0YWdQYWdlKXsKICAgICAgICAgICAgICAgICB0YWdQYWdlPWlkeFswXTsKLSAgICAgICAgICAgICAgICBidWYud3JpdGUoMCk7CisgICAgICAgICAgICAgICAgYnVmLndyaXRlKFdieG1sLlNXSVRDSF9QQUdFKTsKICAgICAgICAgICAgICAgICBidWYud3JpdGUodGFnUGFnZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKQEAgLTE4MSwxMSArMTgyLDExIEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChpZHggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShXYnhtbC5MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0clQoKFN0cmluZykgYXR0cmlidXRlcy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgICAgIHdyaXRlU3RyVCgoU3RyaW5nKSBhdHRyaWJ1dGVzLmVsZW1lbnRBdChpKSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYoaWR4WzBdICE9IGF0dHJQYWdlKXsKLSAgICAgICAgICAgICAgICAgICAgYXR0clBhZ2UgPSBpZHhbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyUGFnZSA9IGlkeFswXTsKICAgICAgICAgICAgICAgICAgICAgYnVmLndyaXRlKDApOwogICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUoYXR0clBhZ2UpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE5MywxMiArMTk0LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZHggPSAoaW50W10pIGF0dHJWYWx1ZVRhYmxlLmdldChhdHRyaWJ1dGVzLmVsZW1lbnRBdCgrK2kpKTsKICAgICAgICAgICAgIGlmIChpZHggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShXYnhtbC5TVFJfSSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJJKGJ1ZiwgKFN0cmluZykgYXR0cmlidXRlcy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgICAgIHdyaXRlU3RyKChTdHJpbmcpIGF0dHJpYnV0ZXMuZWxlbWVudEF0KGkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmKGlkeFswXSAhPSBhdHRyUGFnZSl7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJQYWdlID0gaWR4WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0clBhZ2UgPSBpZHhbMF07CiAgICAgICAgICAgICAgICAgICAgIGJ1Zi53cml0ZSgwKTsKICAgICAgICAgICAgICAgICAgICAgYnVmLndyaXRlKGF0dHJQYWdlKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIH0KQEAgLTIzMiw4ICsyMzIsNyBAQAogICAgIAogICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dCAoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKCJlbmNvZGluZyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgV0JYTUwiKTsKLSAgICAgICAgCisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyA9PSBudWxsID8gIlVURi04IiA6IGVuY29kaW5nOwogICAgICAgICB0aGlzLm91dCA9IG91dDsKICAgICAgICAgCiAgICAgICAgIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKQEAgLTI1OCwxMiArMjU3LDE0IEBACiAgICAgICAgIG91dC53cml0ZSgweDAxKTsgLy8gdW5rbm93biBvciBtaXNzaW5nIHB1YmxpYyBpZGVudGlmaWVyCiAKICAgICAgICAgLy8gZGVmYXVsdCBlbmNvZGluZyBpcyBVVEYtOAotICAgICAgICBTdHJpbmdbXSBlbmNvZGluZ3MgPSB7ICJVVEYtOCIsICJJU08tODg1OS0xIiB9OwotICAgICAgICBpZiAocyA9PSBudWxsIHx8IHMudG9VcHBlckNhc2UoKS5lcXVhbHMoZW5jb2RpbmdzWzBdKSl7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nc1swXTsKKyAgICAgICAgCisgICAgICAgIGlmKHMgIT0gbnVsbCl7CisgICAgICAgICAgICBlbmNvZGluZyA9IHM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChlbmNvZGluZy50b1VwcGVyQ2FzZSgpLmVxdWFscygiVVRGLTgiKSl7CiAgICAgICAgICAgICBvdXQud3JpdGUoMTA2KTsKLSAgICAgICAgfWVsc2UgaWYgKHRydWUgPT0gcy50b1VwcGVyQ2FzZSgpLmVxdWFscyhlbmNvZGluZ3NbMV0pKXsKLSAgICAgICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmdzWzFdOworICAgICAgICB9ZWxzZSBpZiAoZW5jb2RpbmcudG9VcHBlckNhc2UoKS5lcXVhbHMoIklTTy04ODU5LTEiKSl7CiAgICAgICAgICAgICBvdXQud3JpdGUoMHgwNCk7CiAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24ocyk7CkBAIC0yODYsMTEgKzI4NywxMCBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgWG1sU2VyaWFsaXplciB0ZXh0KGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAKKwogICAgICAgICBjaGVja1BlbmRpbmcoZmFsc2UpOwogICAgICAgICAKLSAgICAgICAgYnVmLndyaXRlKFdieG1sLlNUUl9JKTsKLSAgICAgICAgd3JpdGVTdHJJKGJ1ZiwgbmV3IFN0cmluZyhjaGFycywgc3RhcnQsIGxlbikpOworICAgICAgICB3cml0ZVN0cihuZXcgU3RyaW5nKGNoYXJzLCBzdGFydCwgbGVuKSk7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CkBAIC0yOTksMTMgKzI5OSw2MSBAQAogICAgICAgICAKICAgICAgICAgY2hlY2tQZW5kaW5nKGZhbHNlKTsKICAgICAgICAgCi0gICAgYnVmLndyaXRlKFdieG1sLlNUUl9JKTsKLSAgICB3cml0ZVN0ckkoYnVmLCB0ZXh0KTsKKyAgICAgICAgd3JpdGVTdHIodGV4dCk7CiAgICAgCiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KICAgICAKIAorICAgIC8qKiBVc2VkIGluIHRleHQoKSBhbmQgYXR0cmlidXRlKCkgdG8gd3JpdGUgdGV4dCAqLworICAgIAorICAgIHByaXZhdGUgdm9pZCB3cml0ZVN0cihTdHJpbmcgdGV4dCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICBpbnQgcDAgPSAwOworICAgICAgICBpbnQgbGFzdEN1dCA9IDA7CisgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAKKyAgICAgICAgd2hpbGUocDAgPCBsZW4peworICAgICAgICAgICAgd2hpbGUocDAgPCBsZW4gJiYgdGV4dC5jaGFyQXQocDApIDwgJ0EnICl7IC8vIHNraXAgaW50ZXJwdW5jdGF0aW9uCisgICAgICAgICAgICAgICAgcDArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwMSA9IHAwOworICAgICAgICAgICAgd2hpbGUocDEgPCBsZW4gJiYgdGV4dC5jaGFyQXQocDEpID49ICdBJyl7CisgICAgICAgICAgICAgICAgcDErKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYocDEgLSBwMCA+IDEwKSB7CisKKyAgICAgICAgICAgICAgICBpZihwMCA+IGxhc3RDdXQgJiYgdGV4dC5jaGFyQXQocDAtMSkgPT0gJyAnIAorICAgICAgICAgICAgICAgICAgICAmJiBzdHJpbmdUYWJsZS5nZXQodGV4dC5zdWJzdHJpbmcocDAsIHAxKSkgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUoV2J4bWwuU1RSX1QpOworICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0clQodGV4dC5zdWJzdHJpbmcobGFzdEN1dCwgcDEpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIGlmKHAwID4gbGFzdEN1dCAmJiB0ZXh0LmNoYXJBdChwMC0xKSA9PSAnICcpeworICAgICAgICAgICAgICAgICAgICAgICAgcDAtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKHAwID4gbGFzdEN1dCl7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUoV2J4bWwuU1RSX1QpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJUKHRleHQuc3Vic3RyaW5nKGxhc3RDdXQsIHAwKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShXYnhtbC5TVFJfVCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyVCh0ZXh0LnN1YnN0cmluZyhwMCwgcDEpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdEN1dCA9IHAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcDAgPSBwMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxhc3RDdXQgPCBsZW4peworICAgICAgICAgICAgYnVmLndyaXRlKFdieG1sLlNUUl9UKTsKKyAgICAgICAgICAgIHdyaXRlU3RyVCh0ZXh0LnN1YnN0cmluZyhsYXN0Q3V0LCBsZW4pLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCiAKICAgICBwdWJsaWMgWG1sU2VyaWFsaXplciBlbmRUYWcoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIApAQCAtMzIxLDkgKzM2OSwzOSBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAgICAgCi0gICAgLyoqIGN1cnJlbnRseSBpZ25vcmVkISAqLworICAgIC8qKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICovCiAgICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVMZWdhY3koaW50IHR5cGUsIFN0cmluZyBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgd3JpdGVXYXBFeHRlbnNpb24oaW50IHR5cGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja1BlbmRpbmcoZmFsc2UpOworICAgICAgICBidWYud3JpdGUodHlwZSk7CisgICAgICAgIHN3aXRjaCh0eXBlKXsKKyAgICAgICAgY2FzZSBXYnhtbC5FWFRfMDoKKyAgICAgICAgY2FzZSBXYnhtbC5FWFRfMToKKyAgICAgICAgY2FzZSBXYnhtbC5FWFRfMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBXYnhtbC5PUEFRVUU6CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSAoYnl0ZVtdKSBkYXRhOworICAgICAgICAgICAgd3JpdGVJbnQoYnVmLCBieXRlcy5sZW5ndGgpOworICAgICAgICAgICAgYnVmLndyaXRlKGJ5dGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgV2J4bWwuRVhUX0lfMDoKKyAgICAgICAgY2FzZSBXYnhtbC5FWFRfSV8xOgorICAgICAgICBjYXNlIFdieG1sLkVYVF9JXzI6CisgICAgICAgICAgICB3cml0ZVN0ckkoYnVmLCAoU3RyaW5nKSBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV2J4bWwuRVhUX1RfMDoKKyAgICAgICAgY2FzZSBXYnhtbC5FWFRfVF8xOgorICAgICAgICBjYXNlIFdieG1sLkVYVF9UXzI6CisgICAgICAgICAgICB3cml0ZVN0clQoKFN0cmluZykgZGF0YSwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDogCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLy8gLS0tLS0tLS0tLS0tLSBpbnRlcm5hbCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNDQsMjUgKzQyMiw0MyBAQAogICAgICAgICBvdXQud3JpdGUoYnVmWzBdKTsKICAgICB9CiAgICAgCi0gICAgc3RhdGljIHZvaWQgd3JpdGVTdHJJKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgb3V0LndyaXRlKChieXRlKSBzLmNoYXJBdChpKSk7Ci0gICAgICAgIH0KKyAgICB2b2lkIHdyaXRlU3RySShPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBzLmdldEJ5dGVzKGVuY29kaW5nKTsKKyAgICAgICAgb3V0LndyaXRlKGRhdGEpOwogICAgICAgICBvdXQud3JpdGUoMCk7CiAgICAgfQogICAgIAotICAgIHZvaWQgd3JpdGVTdHJUKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgZmluYWwgdm9pZCB3cml0ZVN0clQoU3RyaW5nIHMsIGJvb2xlYW4gbWF5UHJlcGVuZFNwYWNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAKICAgICAgICAgSW50ZWdlciBpZHggPSAoSW50ZWdlcikgc3RyaW5nVGFibGUuZ2V0KHMpOwogICAgICAgICAKLSAgICAgICAgaWYgKGlkeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZHggPSBuZXcgSW50ZWdlcihzdHJpbmdUYWJsZUJ1Zi5zaXplKCkpOwotICAgICAgICAgICAgc3RyaW5nVGFibGUucHV0KHMsIGlkeCk7CisgICAgICAgIGlmIChpZHggIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVJbnQoYnVmLCBpZHguaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGludCBpID0gc3RyaW5nVGFibGVCdWYuc2l6ZSgpOworICAgICAgICAgICAgaWYocy5jaGFyQXQoMCkgPj0gJzAnICYmIG1heVByZXBlbmRTcGFjZSl7CisgICAgICAgICAgICAgICAgcyA9ICcgJyArIHM7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQoYnVmLCBpKzEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICB3cml0ZUludChidWYsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICBzdHJpbmdUYWJsZS5wdXQocywgbmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgICAgaWYocy5jaGFyQXQoMCkgPT0gJyAnKXsKKyAgICAgICAgICAgICAgICAgICBzdHJpbmdUYWJsZS5wdXQocy5zdWJzdHJpbmcoMSksIG5ldyBJbnRlZ2VyKGkrMSkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaW50IGogPSBzLmxhc3RJbmRleE9mKCcgJyk7CisgICAgICAgICAgICAgICBpZihqID4gMSl7CisgICAgICAgICAgICAgICAgICAgc3RyaW5nVGFibGUucHV0KHMuc3Vic3RyaW5nKGopLCBuZXcgSW50ZWdlcihpK2opKTsKKyAgICAgICAgICAgICAgICAgICBzdHJpbmdUYWJsZS5wdXQocy5zdWJzdHJpbmcoaisxKSwgbmV3IEludGVnZXIoaStqKzEpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIHdyaXRlU3RySShzdHJpbmdUYWJsZUJ1Ziwgcyk7CiAgICAgICAgICAgICBzdHJpbmdUYWJsZUJ1Zi5mbHVzaCgpOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICB3cml0ZUludChidWYsIGlkeC5pbnRWYWx1ZSgpKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNzEsOSArNDY3LDcgQEAKICAgICAgKi8KICAgICAKICAgICBwdWJsaWMgdm9pZCBzZXRUYWdUYWJsZShpbnQgcGFnZSwgU3RyaW5nW10gdGFnVGFibGUpIHsKLSAgICAgICAgLy8gY2xlYXIgZW50cmllcyBpbiB0YWdUYWJsZSEKLSAgICAgICAgaWYgKHBhZ2UgIT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVE9ETzogY2xlYXIgZW50cmllcyBpbiB0YWdUYWJsZT8KICAgICAgICAgCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnVGFibGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGlmICh0YWdUYWJsZVtpXSAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV94bWxfRXhwYXRQYXJzZXIuY3BwIGIveG1sL3NyYy9tYWluL25hdGl2ZS9vcmdfYXBhY2hlX2hhcm1vbnlfeG1sX0V4cGF0UGFyc2VyLmNwcAppbmRleCBkNTUzNDQ5Li43MTQ5MjcyIDEwMDY0NAotLS0gYS94bWwvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV94bWxfRXhwYXRQYXJzZXIuY3BwCisrKyBiL3htbC9zcmMvbWFpbi9uYXRpdmUvb3JnX2FwYWNoZV9oYXJtb255X3htbF9FeHBhdFBhcnNlci5jcHAKQEAgLTEsNCArMSw0IEBACi0vKnBhcnNpbmdDb250ZXh0LT5lbnYKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwpAQCAtNDQxLDcgKzQ0MSw3IEBACiAgICAgc3RyY3B5bGVuOHRvMTYoKGNoYXIxNl90KikgbmF0aXZlQnVmZmVyLCBjaGFyYWN0ZXJzLCBsZW5ndGgsICZ1dGYxNmxlbmd0aCk7CiAKICAgICAvLyBSZWxlYXNlIG91ciBuYXRpdmUgcmVmZXJlbmNlLgotICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKGJ1ZmZlciwgbmF0aXZlQnVmZmVyLCBKTklfQUJPUlQpOworICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKGJ1ZmZlciwgbmF0aXZlQnVmZmVyLCAwKTsKIAogICAgIHJldHVybiB1dGYxNmxlbmd0aDsKIH0KZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC94bWwvcGFyc2Vycy9BbGxUZXN0cy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL0FsbFRlc3RzLmphdmEKaW5kZXggOGIwMjE4OC4uNGZlM2U0ZSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL0FsbFRlc3RzLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL0FsbFRlc3RzLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb25UZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNBWFBhcnNlckZhY3RvcnlUZXN0LmNsYXNzKTsKIC8vIEhhcyBhIGNvdXBsZSBvZiBmYWlsdXJlcyBkdWUgdG8gbGltaXRhdGlvbnMgb2YgdGhlIFhtbFB1bGwgU0FYIHdyYXBwZXIuICAgICAgICAgIAotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU0FYUGFyc2VyVGVzdC5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNBWFBhcnNlclRlc3QuY2xhc3MpOwogICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRXhwYXRQYXJzZXJUZXN0LmNsYXNzKTsKIAogICAgICAgICAvLyAkSlVuaXQtRU5EJApkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3RvcnlUZXN0LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeVRlc3QuamF2YQppbmRleCA3MzdiNzY3Li5lMWYzNzdhIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeVRlc3QuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeVRlc3QuamF2YQpAQCAtMTYsNiArMTYsMjAgQEAKIAogcGFja2FnZSB0ZXN0cy5hcGkuamF2YXgueG1sLnBhcnNlcnM7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTI3LDE1ICs0MSw3IEBACiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50QnVpbGRlckZhY3RvcnkuY2xhc3MpIAogcHVibGljIGNsYXNzIERvY3VtZW50QnVpbGRlckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmY7CkBAIC02Niw2ICs3MiwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5I0RvY3VtZW50QnVpbGRlckZhY3RvcnkoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUNoaWxkKCk7CkBAIC0xODQsNiArMTk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkjaXNDb2FsZXNjaW5nKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzQ29hbGVzY2luZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNDb2FsZXNjaW5nKCkgewogICAgICAgICBkYmYuc2V0Q29hbGVzY2luZyh0cnVlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShkYmYuaXNDb2FsZXNjaW5nKCkpOwpAQCAtMTk1LDYgKzIxOSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5I2lzRXhwYW5kRW50aXR5UmVmZXJlbmNlcygpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0V4cGFuZEVudGl0eVJlZmVyZW5jZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXhwYW5kRW50aXR5UmVmZXJlbmNlcygpIHsKICAgICAgICAgZGJmLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXModHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoZGJmLmlzRXhwYW5kRW50aXR5UmVmZXJlbmNlcygpKTsKQEAgLTIwNiw2ICsyMzksMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSNpc0lnbm9yaW5nQ29tbWVudHMoKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNJZ25vcmluZ0NvbW1lbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0lnbm9yaW5nQ29tbWVudHMoKSB7CiAgICAgICAgIGRiZi5zZXRJZ25vcmluZ0NvbW1lbnRzKHRydWUpOwogICAgICAgICBhc3NlcnRUcnVlKGRiZi5pc0lnbm9yaW5nQ29tbWVudHMoKSk7CkBAIC0yMTcsNiArMjU5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkjaXNJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc0lnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc0lnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewogICAgICAgICBkYmYuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoZGJmLmlzSWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSk7CkBAIC0yMjgsNiArMjc5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkjaXNOYW1lc3BhY2VBd2FyZSgpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc05hbWVzcGFjZUF3YXJlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9pc05hbWVzcGFjZUF3YXJlKCkgewogICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoZGJmLmlzTmFtZXNwYWNlQXdhcmUoKSk7CkBAIC0yMzksNiArMjk5LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkjaXNWYWxpZGF0aW5nKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVmFsaWRhdGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWYWxpZGF0aW5nKCkgewogICAgICAgICBkYmYuc2V0VmFsaWRhdGluZyh0cnVlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShkYmYuaXNWYWxpZGF0aW5nKCkpOwpAQCAtMjYxLDYgKzMzMCwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5I25ld0luc3RhbmNlKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5ld0luc3RhbmNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXdJbnN0YW5jZSgpIHsKICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0zNTUsNyArNDMzLDE2IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnkjc2V0Q29hbGVzY2luZyhib29sZWFuKS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENvYWxlc2NpbmdaKCkgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRDb2FsZXNjaW5nIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3NldENvYWxlc2NpbmdaKCkgewogICAgICAgICBkYmYuc2V0Q29hbGVzY2luZyh0cnVlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShkYmYuaXNDb2FsZXNjaW5nKCkpOwogCkBAIC00MjAsNiArNTA3LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnkjc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhib29sZWFuKS4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEV4cGFuZEVudGl0eVJlZmVyZW5jZXNaKCkgewogICAgICAgICBkYmYuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyh0cnVlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShkYmYuaXNFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkpOwpAQCAtNDc1LDYgKzU3MSwxNSBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5I3NldEZlYXR1cmUoamF2YS5sYW5nLlN0cmluZykuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEZlYXR1cmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRGZWF0dXJlTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ1tdIGZlYXR1cmVzID0geyAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLAogICAgICAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIgfTsKQEAgLTUyMSw2ICs2MjYsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSNzZXRJZ25vcmluZ0NvbW1lbnRzKGJvb2xlYW4pLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRJZ25vcmluZ0NvbW1lbnRzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SWdub3JpbmdDb21tZW50c1ooKSB7CiAgICAgICAgIGNvbW1lbnRFbGVtZW50cy5jbGVhcigpOwogCkBAIC01NzIsNiArNjg2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnkjc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoYm9vbGVhbikuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2VaKCkgewogICAgICAgICBkYmYuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoZGJmLmlzSWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSk7CkBAIC02MTUsNiArNzM4LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnkjc2V0TmFtZXNwYWNlQXdhcmUoYm9vbGVhbikuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVzcGFjZUF3YXJlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZXNwYWNlQXdhcmVaKCkgewogICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoZGJmLmlzTmFtZXNwYWNlQXdhcmUoKSk7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyVGVzdC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlclRlc3QuamF2YQppbmRleCA4NjMxNjQ3Li43MGZjMzM0IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyVGVzdC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDIwIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4LnhtbC5wYXJzZXJzOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjUsMTUgKzM5LDcgQEAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiAKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50QnVpbGRlci5jbGFzcykgCiBwdWJsaWMgY2xhc3MgRG9jdW1lbnRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgY2xhc3MgTW9ja0RvY3VtZW50QnVpbGRlciBleHRlbmRzIERvY3VtZW50QnVpbGRlciB7CkBAIC0xMzAsNiArMTM2LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciNEb2N1bWVudEJ1aWxkZXIoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJEb2N1bWVudEJ1aWxkZXIiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmV3IE1vY2tEb2N1bWVudEJ1aWxkZXIoKTsKQEAgLTE3OSw3ICsxOTQsMTYgQEAKICAgICAgKiBDYXNlIDM6IFRyeSB0byBwYXJzZSBhIG5vbi1leGlzdGVudCBmaWxlLgogICAgICAqIENhc2UgNDogVHJ5IHRvIHBhcnNlIGluY29ycmVjdCB4bWwgZmlsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfaW9fRmlsZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5GaWxlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9wYXJzZUxqYXZhX2lvX0ZpbGUoKSB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvdG1wL3htbF9zb3VyY2Uvc2ltcGxlLnhtbCIpOwogICAgICAgICAvLyBjYXNlIDE6IFRyaXZpYWwgdXNlLgogICAgICAgICB0cnkgewpAQCAtMjM5LDYgKzI2MywxNSBAQAogICAgICAqIENhc2UgMzogVHJ5IHRvIHBhcnNlIGEgbm9uLWV4aXN0ZW50IGZpbGUuCiAgICAgICogQ2FzZSA0OiBUcnkgdG8gcGFyc2UgaW5jb3JyZWN0IHhtbCBmaWxlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7CiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvc2ltcGxlLnhtbCIpOwogICAgICAgICAvLyBjYXNlIDE6IFRyaXZpYWwgdXNlLgpAQCAtMzAwLDYgKzMzMywxNSBAQAogICAgICAqIENhc2UgMzogVHJ5IHRvIHBhcnNlIGEgbm9uLWV4aXN0ZW50IGZpbGUuCiAgICAgICogQ2FzZSA0OiBUcnkgdG8gcGFyc2UgaW5jb3JyZWN0IHhtbCBmaWxlLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfaW9fSW5wdXRTdHJlYW1MamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi9zeXN0ZW1pZC54bWwiKTsKICAgICAgICAgLy8gY2FzZSAxOiBUcml2aWFsIHVzZS4KQEAgLTM2NSw3ICs0MDcsMTYgQEAKICAgICAgKiBDYXNlIDM6IFRyeSB0byBwYXJzZSBhIG5vbi1leGlzdGVudCB1cmkuCiAgICAgICogQ2FzZSA0OiBUcnkgdG8gcGFyc2UgaW5jb3JyZWN0IHhtbCBmaWxlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgLy8gY2FzZSAxOiBUcml2aWFsIHVzZS4KICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3NpbXBsZS54bWwiKS5nZXRGaWxlKCkpOwogICAgICAgICB0cnkgewpAQCAtNDIxLDYgKzQ3MiwxNiBAQAogICAgIC8qKgogICAgICAqIEB0ZXN0cyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIjcmVzZXQoKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IHRoYXQgcmVzZXQoKSBtZXRob2QgcmVzZXRzIHRoZSBEb2N1bWVudEJ1aWxkZXIgIiArCisgICAgICAgICAgICAidG8gaXRzIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVzZXQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X3Jlc2V0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL0ZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3JUZXN0LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvclRlc3QuamF2YQppbmRleCAwYTQ2MjZhLi40ZTcyYzU1IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvclRlc3QuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvclRlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDMwIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4LnhtbC5wYXJzZXJzOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOworCitAVGVzdFRhcmdldENsYXNzKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IuY2xhc3MpIAogcHVibGljIGNsYXNzIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IjRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGZjZSA9IG5ldyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yKCk7CiAgICAgICAgIGFzc2VydE51bGwoZmNlLmdldE1lc3NhZ2UoKSk7CkBAIC00MCw2ICs1NSwxNSBAQAogICAgICAqIENhc2UgMjogVHJ5IHRvIGNyZWF0ZSBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCiAgICAgICogd2hpY2ggaXMgYmFzZWQgb24gRXhjZXB0aW9uIHdpdGggU3RyaW5nIHBhcmFtZXRlci4KICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuRXhjZXB0aW9uLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19FeGNlcHRpb24oKSB7CiAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigpOwogICAgICAgICAvLyBjYXNlIDE6IFRyeSB0byBjcmVhdGUgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgpAQCAtNjYsNiArOTAsMTUgQEAKICAgICAgKiBDYXNlIDI6IFRyeSB0byBjcmVhdGUgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgogICAgICAqIHdoaWNoIGlzIGJhc2VkIG9uIEV4Y2VwdGlvbiB3aXRoIFN0cmluZyBwYXJhbWV0ZXIuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLkV4Y2VwdGlvbi5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfRXhjZXB0aW9uTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigpOwogICAgICAgICAvLyBjYXNlIDE6IFRyeSB0byBjcmVhdGUgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgpAQCAtODgsNiArMTIxLDE1IEBACiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IKICAgICAgKiAgICAgI0ZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7CiAgICAgICAgIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZmNlID0gbmV3IEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IoImZpeHR1cmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXh0dXJlIiwgZmNlLmdldE1lc3NhZ2UoKSk7CkBAIC05OCw2ICsxNDAsMTUgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yI2dldEV4Y2VwdGlvbigpLgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEV4Y2VwdGlvbigpIHsKICAgICAgICAgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBmY2UgPSBuZXcgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcigpOwogICAgICAgICBhc3NlcnROdWxsKGZjZS5nZXRFeGNlcHRpb24oKSk7CkBAIC0xMTQsNiArMTY1LDE1IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciNnZXRNZXNzYWdlKCkuCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE1lc3NhZ2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7CiAgICAgICAgIGFzc2VydE51bGwobmV3IEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IoKS5nZXRNZXNzYWdlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1zZzEiLApkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb25UZXN0LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA2OGQ2YzhkLi4zMjRmMDQ0NSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb25UZXN0LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb25UZXN0LmphdmEKQEAgLTE2LDE1ICsxNiwzMCBAQAogCiBwYWNrYWdlIHRlc3RzLmFwaS5qYXZheC54bWwucGFyc2VyczsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworQFRlc3RUYXJnZXRDbGFzcyhQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlewogCiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24jUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewogICAgICAgICBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSA9IG5ldyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwocGNlLmdldE1lc3NhZ2UoKSk7CkBAIC0zNiw2ICs1MSwxNSBAQAogICAgICAqIEB0ZXN0cyBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgICogICAgICNQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSA9CiAgICAgICAgICAgICBuZXcgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiZml4dHVyZSIpOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL1NBWFBhcnNlckZhY3RvcnlUZXN0LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyRmFjdG9yeVRlc3QuamF2YQppbmRleCAxZjgxZjVhLi5jMDUzZDA5IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyRmFjdG9yeVRlc3QuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyRmFjdG9yeVRlc3QuamF2YQpAQCAtMTYsMjEgKzE2LDMxIEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4LnhtbC5wYXJzZXJzOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKIAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK0BUZXN0VGFyZ2V0Q2xhc3MoU0FYUGFyc2VyRmFjdG9yeS5jbGFzcykgCiBwdWJsaWMgY2xhc3MgU0FYUGFyc2VyRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZjsKQEAgLTYxLDcgKzcxLDE2IEBACiAgICAgICogQHRlc3QgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSNTQVhQYXJzZXJGYWN0b3J5KCkKICAgICAgKgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIlNBWFBhcnNlckZhY3RvcnkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9Db25zdHJ1Y3RvcigpIHsKICAgICAgICAgTXlTQVhQYXJzZXJGYWN0b3J5IG1wZiA9IG5ldyBNeVNBWFBhcnNlckZhY3RvcnkoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtcGYgaW5zdGFuY2VvZiBTQVhQYXJzZXJGYWN0b3J5KTsKICAgICAgICAgYXNzZXJ0RmFsc2UobXBmLmlzVmFsaWRhdGluZygpKTsKQEAgLTcxLDYgKzkwLDE1IEBACiAgICAgICogQHRlc3QgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSNnZXRGZWF0dXJlKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICoKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RmVhdHVyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEZlYXR1cmVMamF2YV9sYW5nX1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nW10gZmVhdHVyZXMgPSB7CiAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwKQEAgLTEzOCw2ICsxNjYsMTUgQEAKICAgICAgKiBAdGVzdCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5I2lzTmFtZXNwYWNlQXdhcmUoKQogICAgICAqCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVzcGFjZUF3YXJlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNOYW1lc3BhY2VBd2FyZSgpIHsKICAgICAgICAgc3BmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwogICAgICAgICBhc3NlcnRUcnVlKHNwZi5pc05hbWVzcGFjZUF3YXJlKCkpOwpAQCAtMTUxLDYgKzE4OCwxNSBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkjaXNWYWxpZGF0aW5nKCkKICAgICAgKgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1ZhbGlkYXRpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmFsaWRhdGluZygpIHsKICAgICAgICAgc3BmLnNldFZhbGlkYXRpbmcodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoc3BmLmlzVmFsaWRhdGluZygpKTsKQEAgLTE3Niw2ICsyMjIsMTUgQEAKICAgICAgKiBAdGVzdCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5I25ld0luc3RhbmNlKCkKICAgICAgKgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJuZXdJbnN0YW5jZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RfbmV3SW5zdGFuY2UoKSB7CiAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMjIxLDYgKzI3NiwxNSBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkjbmV3U0FYUGFyc2VyKCkKICAgICAgKgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGV4Y2VwdGlvbnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibmV3U0FYUGFyc2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdF9uZXdTQVhQYXJzZXIoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTQVhQYXJzZXIgc3AgPSBzcGYubmV3U0FYUGFyc2VyKCk7CkBAIC0yMzYsNiArMzAwLDE1IEBACiAgICAgICogICAgICAgYm9vbGVhbikKICAgICAgKgogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRGZWF0dXJlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RmVhdHVyZUxqYXZhX2xhbmdfU3RyaW5nWigpIHsKICAgICAgICAgU3RyaW5nW10gZmVhdHVyZXMgPSB7CiAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwKQEAgLTMwMCw3ICszNzMsMTYgQEAKICAgICAgKiBAdGVzdCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5I3NldE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4pCiAgICAgICoKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWVzcGFjZUF3YXJlWigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVzcGFjZUF3YXJlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2Jvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3NldE5hbWVzcGFjZUF3YXJlWigpIHsKIAogICAgICAgICBzcGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CiAgICAgICAgIE15SGFuZGxlciBtaCA9IG5ldyBNeUhhbmRsZXIoKTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC94bWwvcGFyc2Vycy9TQVhQYXJzZXJUZXN0LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YXgveG1sL3BhcnNlcnMvU0FYUGFyc2VyVGVzdC5qYXZhCmluZGV4IDk0Yjk5NjMuLjgzZjcwMzEgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZheC94bWwvcGFyc2Vycy9TQVhQYXJzZXJUZXN0LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmF4L3htbC9wYXJzZXJzL1NBWFBhcnNlclRlc3QuamF2YQpAQCAtMTYsMzcgKzE2LDQ0IEBACiAKIHBhY2thZ2UgdGVzdHMuYXBpLmphdmF4LnhtbC5wYXJzZXJzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguSGFuZGxlckJhc2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogaW1wb3J0IG9yZy54bWwuc2F4LlBhcnNlcjsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguSGFuZGxlckJhc2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CiAKIGltcG9ydCB0ZXN0cy5hcGkuamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyVGVzdFN1cHBvcnQuTXlEZWZhdWx0SGFuZGxlcjsKIGltcG9ydCB0ZXN0cy5hcGkuamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyVGVzdFN1cHBvcnQuTXlIYW5kbGVyOwogCitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKK0BUZXN0VGFyZ2V0Q2xhc3MoU0FYUGFyc2VyLmNsYXNzKSAKIHB1YmxpYyBjbGFzcyBTQVhQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBjbGFzcyBNb2NrU0FYUGFyc2VyIGV4dGVuZHMgU0FYUGFyc2VyIHsKQEAgLTI1Miw3ICsyNTksMTYgQEAKICAgICAvKioKICAgICAgKiBAdGVzdHMgamF2YXgueG1sLnBhcnNlci5TQVhQYXJzZXIjU0FYUGFyc2VyKCkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiU0FYUGFyc2VyIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfQ29uc3RydWN0b3IoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgTW9ja1NBWFBhcnNlcigpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtMjg0LDcgKzMwMCwxNiBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNpc05hbWVzcGFjZUF3YXJlKCkKICAgICAgKgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNOYW1lc3BhY2VBd2FyZSgpIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNOYW1lc3BhY2VBd2FyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2lzTmFtZXNwYWNlQXdhcmUoKSB7CiAKICAgICAgICAgc3BmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwogICAgICAgICBhc3NlcnRUcnVlKHNwZi5pc05hbWVzcGFjZUF3YXJlKCkpOwpAQCAtMjk4LDcgKzMyMywxNiBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNpc1ZhbGlkYXRpbmcoKQogICAgICAqCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZhbGlkYXRpbmcoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzVmFsaWRhdGluZyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X2lzVmFsaWRhdGluZygpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UocGFyc2VyLmlzVmFsaWRhdGluZygpKTsKICAgICAgICAgc3BmLnNldFZhbGlkYXRpbmcodHJ1ZSk7CiAgICAgICAgIGFzc2VydEZhbHNlKHBhcnNlci5pc1ZhbGlkYXRpbmcoKSk7CkBAIC0zMjAsNyArMzU0LDE3IEBACiAgICAgICogQHRlc3QgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyI3BhcnNlKGphdmEuaW8uRmlsZSwKICAgICAgKiAgICAgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfaW9fRmlsZUxvcmdfeG1sX3NheF9oZWxwZXJzX0RlZmF1bHRIYW5kbGVyKCkKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5IHByb3Blcmx5OyAiICsKKyAgICAgICAgICAgICJub3QgYWxsIGV4Y2VwdGlvbnMgYXJlIHZlcmlmaWVkLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uRmlsZS5jbGFzcywgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfcGFyc2VMamF2YV9pb19GaWxlTG9yZ194bWxfc2F4X2hlbHBlcnNfRGVmYXVsdEhhbmRsZXIoKQogICAgIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsaXN0X3dmLmxlbmd0aDsgaSsrKSB7CkBAIC0zNjAsOCArNDA0LDE4IEBACiAgICAgICogQHRlc3QgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyI3BhcnNlKGphdmEuaW8uRmlsZSwKICAgICAgKiAgICAgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eSBwcm9wZXJseTsgIiArCisgICAgICAgICAgICAibm90IGFsbCBleGNlcHRpb25zIGFyZSB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLkZpbGUuY2xhc3MsIG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9pb19GaWxlTG9yZ194bWxfc2F4X0hhbmRsZXJCYXNlKCkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9wYXJzZUxqYXZhX2lvX0ZpbGVMb3JnX3htbF9zYXhfSGFuZGxlckJhc2UoKQogICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbGlzdF93Zi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaG0gPSBzcC5yZWFkRmlsZShsaXN0X291dF9oYltpXS5nZXRQYXRoKCkpOwpAQCAtMzk5LDcgKzQ1MywxNiBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNwYXJzZShvcmcueG1sLnNheC5JbnB1dFNvdXJjZSwKICAgICAgKiAgICAgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTG9yZ194bWxfc2F4X0lucHV0U291cmNlTG9yZ194bWxfc2F4X2hlbHBlcnNfRGVmYXVsdEhhbmRsZXIoKQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElPRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy54bWwuc2F4LklucHV0U291cmNlLmNsYXNzLCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9wYXJzZUxvcmdfeG1sX3NheF9JbnB1dFNvdXJjZUxvcmdfeG1sX3NheF9oZWxwZXJzX0RlZmF1bHRIYW5kbGVyKCkKICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbGlzdF93Zi5sZW5ndGg7IGkrKykgewpAQCAtNDQ0LDggKzUwNywxNyBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNwYXJzZShvcmcueG1sLnNheC5JbnB1dFNvdXJjZSwKICAgICAgKiAgICAgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnhtbC5zYXguSW5wdXRTb3VyY2UuY2xhc3MsIG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMb3JnX3htbF9zYXhfSW5wdXRTb3VyY2VMb3JnX3htbF9zYXhfSGFuZGxlckJhc2UoKQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3BhcnNlTG9yZ194bWxfc2F4X0lucHV0U291cmNlTG9yZ194bWxfc2F4X0hhbmRsZXJCYXNlKCkKICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGxpc3Rfd2YubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhtID0gc3AucmVhZEZpbGUobGlzdF9vdXRfaGJbaV0uZ2V0UGF0aCgpKTsKQEAgLTQ4Nyw3ICs1NTksMTYgQEAKICAgICAgKiBAdGVzdCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIjcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSwKICAgICAgKiAgICAgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfaW9fSW5wdXRTdHJlYW1Mb3JnX3htbF9zYXhfaGVscGVyc19EZWZhdWx0SGFuZGxlcigpCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgSU9FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RfcGFyc2VMamF2YV9pb19JbnB1dFN0cmVhbUxvcmdfeG1sX3NheF9oZWxwZXJzX0RlZmF1bHRIYW5kbGVyKCkKICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbGlzdF93Zi5sZW5ndGg7IGkrKykgewpAQCAtNTMxLDcgKzYxMiwxNiBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtLAogICAgICAqICAgICBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyLCBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9pb19JbnB1dFN0cmVhbUxvcmdfeG1sX3NheF9oZWxwZXJzX0RlZmF1bHRIYW5kbGVyTGphdmFfbGFuZ19TdHJpbmcoKQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5ICBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9wYXJzZUxqYXZhX2lvX0lucHV0U3RyZWFtTG9yZ194bWxfc2F4X2hlbHBlcnNfRGVmYXVsdEhhbmRsZXJMamF2YV9sYW5nX1N0cmluZygpCiAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsaXN0X3dmLmxlbmd0aDsgaSsrKSB7CiAKQEAgLTU4OCw4ICs2NzgsMTggQEAKICAgICAgKiBAdGVzdCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIjcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSwKICAgICAgKiAgICAgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UpCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eSBwcm9wZXJseTsgIiArCisgICAgICAgICAgICAibm90IGFsbCBleGNlcHRpb25zIGFyZSB2ZXJpZmllZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBvcmcueG1sLnNheC5IYW5kbGVyQmFzZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcnNlTGphdmFfaW9fSW5wdXRTdHJlYW1Mb3JnX3htbF9zYXhfSGFuZGxlckJhc2UoKQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3BhcnNlTGphdmFfaW9fSW5wdXRTdHJlYW1Mb3JnX3htbF9zYXhfSGFuZGxlckJhc2UoKQogICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbGlzdF93Zi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaG0gPSBzcC5yZWFkRmlsZShsaXN0X291dF9oYltpXS5nZXRQYXRoKCkpOwpAQCAtNjMwLDggKzczMCwxNyBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtLAogICAgICAqICAgICBvcmcueG1sLnNheC5IYW5kbGVyQmFzZSwgamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcywgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgdGVzdF9wYXJzZUxqYXZhX2lvX0lucHV0U3RyZWFtTG9yZ194bWxfc2F4X0hhbmRsZXJCYXNlTGphdmFfbGFuZ19TdHJpbmcoKSB7CisgICAgcHVibGljIHZvaWQgX3Rlc3RfcGFyc2VMamF2YV9pb19JbnB1dFN0cmVhbUxvcmdfeG1sX3NheF9IYW5kbGVyQmFzZUxqYXZhX2xhbmdfU3RyaW5nKCkgewogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbGlzdF93Zi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBobSA9IHNwLnJlYWRGaWxlKApAQCAtNzEwLDcgKzgxOSwxNiBAQAogICAgICAqIEB0ZXN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNwYXJzZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgICBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZ0xvcmdfeG1sX3NheF9oZWxwZXJzX0RlZmF1bHRIYW5kbGVyKCkKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBJT0V4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdF9wYXJzZUxqYXZhX2xhbmdfU3RyaW5nTG9yZ194bWxfc2F4X2hlbHBlcnNfRGVmYXVsdEhhbmRsZXIoKQogICAgIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsaXN0X3dmLmxlbmd0aDsgaSsrKSB7CkBAIC03NTEsOCArODY5LDE3IEBACiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNwYXJzZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAqICAgIG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlKQogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IElPRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZ0xvcmdfeG1sX3NheF9IYW5kbGVyQmFzZSgpCisgICAgcHVibGljIHZvaWQgX3Rlc3RfcGFyc2VMamF2YV9sYW5nX1N0cmluZ0xvcmdfeG1sX3NheF9IYW5kbGVyQmFzZSgpCiAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsaXN0X3dmLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBobSA9IHNwLnJlYWRGaWxlKGxpc3Rfb3V0X2hiW2ldLmdldFBhdGgoKSk7CkBAIC03ODksNyArOTE2LDE3IEBACiAgICAgLyoqCiAgICAgICogQHRlc3RzIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNyZXNldCgpLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVzZXQoKSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayB0aGF0IFNBWFBhcnNlciBpcyByZXNldCB0byB0aGUgc2FtZSBzdGF0ZSAiICsKKyAgICAgICAgICAgICJhcyBpdCB3YXMgY3JlYXRlZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZXNldCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0X3Jlc2V0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3BmID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgICAgICAgICAgcGFyc2VyID0gc3BmLm5ld1NBWFBhcnNlcigpOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vQWxsVGVzdHMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0FsbFRlc3RzLmphdmEKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vQWxsVGVzdHMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vQWxsVGVzdHMuamF2YQppbmRleCA4YTcwNWRkLi45M2FiNTY2IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9BbGxUZXN0cy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0FsbFRlc3RzLmphdmEKQEAgLTUsNyArNSw3IEBACiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9BdHRyR2V0T3duZXJFbGVtZW50LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9BdHRyR2V0T3duZXJFbGVtZW50LmphdmEKc2ltaWxhcml0eSBpbmRleCA3NSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vQXR0ckdldE93bmVyRWxlbWVudC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9BdHRyR2V0T3duZXJFbGVtZW50LmphdmEKaW5kZXggNzY3ZWY5Ni4uNmYwZTRlNCAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vQXR0ckdldE93bmVyRWxlbWVudC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0F0dHJHZXRPd25lckVsZW1lbnQuamF2YQpAQCAtMSwxNCArMSwyMCBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKIAoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKKworQFRlc3RUYXJnZXRDbGFzcyhBdHRyLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBBdHRyR2V0T3duZXJFbGVtZW50IGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNTUsNyArNjEsMTYgQEAKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoImF0dHJnZXRvd25lcmVsZW1lbnQwMSIsICJlbXA6ZW1wbG95ZWUiLCBvd25lckVsZW1lbnROYW1lKTsKIC8vCiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0aGF0IGdldE93bmVyRWxlbWVudCByZXR1cm5zIG51bGwgIiArCisgICAgICAgICAgICAiaWYgYW4gYXR0cmlidXRlIGlzIG5vdCBpbiB1c2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0T3duZXJFbGVtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE93bmVyRWxlbWVudDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC03MSw3ICs4NiwxNiBAQAogICAgICAgICBvd25lckVsZW1lbnROYW1lID0gb3duZXJFbGVtZW50LmdldE5vZGVOYW1lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiYXR0cmdldG93bmVyZWxlbWVudDAyIiwgInJvb3QiLCBvd25lckVsZW1lbnROYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldE93bmVyRWxlbWVudCByZXR1cm5zIG51bGwgIiArIAorICAgICAgICAgICAgImlmIGFuIGF0dHJpYnV0ZSBpcyBub3QgaW4gdXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE93bmVyRWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPd25lckVsZW1lbnQzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZSBvd25lckVsZW1lbnQ7CkBAIC04MSw3ICsxMDUsMTYgQEAKICAgICAgICAgb3duZXJFbGVtZW50ID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiYXR0cmdldG93bmVyZWxlbWVudDAzIiwgb3duZXJFbGVtZW50KTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldE93bmVyRWxlbWVudCByZXR1cm5zIG51bGwgIiArIAorICAgICAgICAgICAgImlmIGFuIGF0dHJpYnV0ZSBpcyBub3QgaW4gdXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE93bmVyRWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPd25lckVsZW1lbnQ0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgZG9jSW1wOwpAQCAtMTAzLDcgKzEzNiwxNiBAQAogICAgICAgICBvd25lckVsZW1lbnQgPSBhdHRySW1wLmdldE93bmVyRWxlbWVudCgpOwogICAgICAgICBhc3NlcnROdWxsKCJhdHRyZ2V0b3duZXJlbGVtZW50MDQiLCBvd25lckVsZW1lbnQpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IHRoYXQgZ2V0T3duZXJFbGVtZW50IHJldHVybnMgbnVsbCAiICsgCisgICAgICAgICAgICAiaWYgYW4gYXR0cmlidXRlIGlzIG5vdCBpbiB1c2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0T3duZXJFbGVtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE93bmVyRWxlbWVudDUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlIGVsZW1lbnQ7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9DcmVhdGVBdHRyaWJ1dGVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vQ3JlYXRlQXR0cmlidXRlTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9DcmVhdGVBdHRyaWJ1dGVOUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9DcmVhdGVBdHRyaWJ1dGVOUy5qYXZhCmluZGV4IGQyZTNiMGQuLmRiYmJhOTUgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0NyZWF0ZUF0dHJpYnV0ZU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vQ3JlYXRlQXR0cmlidXRlTlMuamF2YQpAQCAtMTksMTcgKzE5LDIzIEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKKwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50LmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBDcmVhdGVBdHRyaWJ1dGVOUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTU5LDYgKzY1LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBOQU1FU1BBQ0VfRVJSIGV4Y2VwdGlvbiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZUF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBdHRyaWJ1dGVOUzEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3LmVjb21tZXJjZS5vcmcvIjsKICAgICAgICAgU3RyaW5nIG1hbGZvcm1lZE5hbWUgPSAicHJlZml4Ojpsb2NhbCI7CkBAIC03Niw3ICs5MSwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTkFNRVNQQUNFX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgY3JlYXRlQXR0cmlidXRlTlMgbWV0aG9kIHdpdGggbnVsbCBhcyB0aGUgZmlzcnQgIiArCisgICAgICAgICAgICAicGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZUF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBdHRyaWJ1dGVOUzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7CiAKQEAgLTk1LDcgKzExOSwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTkFNRVNQQUNFX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBjcmVhdGVBdHRyaWJ1dGVOUyB0aHJvd3MgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZUF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBdHRyaWJ1dGVOUzMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3LndlZGRpbmcuY29tLyI7CiAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lOwpAQCAtMTQ0LDcgKzE3NiwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXR0cmlidXRlTlM0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlcyI7CiAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0gInhtbDphdHRyMSI7CkBAIC0xNjIsNyArMjAyLDE1IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OQU1FU1BBQ0VfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZUF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBdHRyaWJ1dGVOUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3LmVjb21tZXJjZS5vcmcvIjsKICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAiZWNvbm06bG9jYWwiOwpAQCAtMTc0LDcgKzIyMiwxNSBAQAogICAgICAgICBhdHRyTmFtZSA9IG5ld0F0dHIuZ2V0TmFtZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRocm93X0VxdWFscyIsIHF1YWxpZmllZE5hbWUsIGF0dHJOYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXR0cmlidXRlTlM2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iOwogICAgICAgICBEb2N1bWVudCBkb2M7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9DcmVhdGVEb2N1bWVudC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vQ3JlYXRlRG9jdW1lbnQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9DcmVhdGVEb2N1bWVudC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9DcmVhdGVEb2N1bWVudC5qYXZhCmluZGV4IGUxZGZhNTAuLjU2ZmZlZGMgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0NyZWF0ZURvY3VtZW50LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vQ3JlYXRlRG9jdW1lbnQuamF2YQpAQCAtMTksMTcgKzE5LDIyIEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CiBpbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgImNyZWF0ZURvY3VtZW50KG5hbWVzcGFjZVVSSSxxdWFsaWZpZWROYW1lLGRvY3R5cGUpIiBtZXRob2QgZm9yIGEKQEAgLTUxLDYgKzU2LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI3hwb2ludGVyKGlkKCdMZXZlbC0yLUNvcmUtRE9NLWNyZWF0ZURvY3VtZW50JykvcmFpc2VzL2V4Y2VwdGlvbltAbmFtZT0nRE9NRXhjZXB0aW9uJ10vZGVzY3IvcFtzdWJzdHJpbmctYmVmb3JlKC4sJzonKT0nTkFNRVNQQUNFX0VSUiddKSI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI3hwb2ludGVyKGlkKCdMZXZlbC0yLUNvcmUtRE9NLWNyZWF0ZURvY3VtZW50JykvcmFpc2VzL2V4Y2VwdGlvbltAbmFtZT0nRE9NRXhjZXB0aW9uJ10vZGVzY3IvcFtzdWJzdHJpbmctYmVmb3JlKC4sJzonKT0nTkFNRVNQQUNFX0VSUiddKTwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhET01JbXBsZW1lbnRhdGlvbi5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgQ3JlYXRlRG9jdW1lbnQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC04MCw2ICs4NiwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZURvY3VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvY3VtZW50MSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cuZWNvbW1lcmNlLm9yZy8iOwogICAgICAgICBTdHJpbmcgbWFsZm9ybWVkTmFtZSA9ICJwcmVmaXg6OmxvY2FsIjsKQEAgLTEwMCw3ICsxMTUsMTUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTkFNRVNQQUNFX0VSUiIsIHN1Y2Nlc3MpOwogCiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZURvY3VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvY3VtZW50MigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKIApAQCAtMTY2LDcgKzE4OSwxNSBAQAogLy8gICAgICAgIGFzc2VydFRydWUoInRocm93X1dST05HX0RPQ1VNRU5UX0VSUiIsIHN1Y2Nlc3MpOwogLy8KIC8vICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVEb2N1bWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudDUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3LmVjb21tZXJjZS5vcmcvc2NoZW1hIjsKICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWU7CkBAIC0yMTksNyArMjUwLDE1IEBACiAKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVEb2N1bWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudDYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vZWNvbW1lcmNlLm9yZy9zY2hlbWEiOwogICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9ICJ4bWw6bG9jYWwiOwpAQCAtMjQwLDcgKzI3OSwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OQU1FU1BBQ0VfRVJSIiwgc3VjY2Vzcyk7CiAKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBudWxsIGFzIHBhcmFtZXRlcnMuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRG9jdW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnQ3KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5lY29tbWVyY2Uub3JnL3NjaGVtYSI7CiAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0gInk6eCI7CkBAIC0yNTksNyArMzA2LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygibm9kZU5hbWUiLCAiI2RvY3VtZW50Iiwgbm9kZU5hbWUpOwogICAgICAgICBhc3NlcnROdWxsKCJub2RlVmFsdWUiLCBub2RlVmFsdWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVEb2N1bWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudDgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3NjaGVtYSI7CiAgICAgICAgIERvY3VtZW50VHlwZSBkb2NUeXBlID0gbnVsbDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0NyZWF0ZURvY3VtZW50VHlwZS5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vQ3JlYXRlRG9jdW1lbnRUeXBlLmphdmEKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vQ3JlYXRlRG9jdW1lbnRUeXBlLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0NyZWF0ZURvY3VtZW50VHlwZS5qYXZhCmluZGV4IGQ2MjE3OTAuLjNkNjkyMDAgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0NyZWF0ZURvY3VtZW50VHlwZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0NyZWF0ZURvY3VtZW50VHlwZS5qYXZhCkBAIC0xOSwxOCArMTksMjMgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwogCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworCiAvKioKICAqIFRoZSAiY3JlYXRlRG9jdW1lbnRUeXBlKHF1YWxpZmllZE5hbWUscHVibGljSWQsc3lzdGVtSWQpIiBtZXRob2QgZm9yIGEKICAqIERPTUltcGxlbWVudGF0aW9uIHNob3VsZCByYWlzZSBOQU1FU1BBQ0VfRVJSIERPTUV4Y2VwdGlvbiBpZiBxdWFsaWZpZWROYW1lIGlzCkBAIC01MSw2ICs1Niw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSN4cG9pbnRlcihpZCgnTGV2ZWwtMi1Db3JlLURPTS1jcmVhdGVEb2NUeXBlJykvcmFpc2VzL2V4Y2VwdGlvbltAbmFtZT0nRE9NRXhjZXB0aW9uJ10vZGVzY3IvcFtzdWJzdHJpbmctYmVmb3JlKC4sJzonKT0nTkFNRVNQQUNFX0VSUiddKSI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI3hwb2ludGVyKGlkKCdMZXZlbC0yLUNvcmUtRE9NLWNyZWF0ZURvY1R5cGUnKS9yYWlzZXMvZXhjZXB0aW9uW0BuYW1lPSdET01FeGNlcHRpb24nXS9kZXNjci9wW3N1YnN0cmluZy1iZWZvcmUoLiwnOicpPSdOQU1FU1BBQ0VfRVJSJ10pPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKERPTUltcGxlbWVudGF0aW9uLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBDcmVhdGVEb2N1bWVudFR5cGUgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC04MCw2ICs4NiwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZURvY3VtZW50VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnRUeXBlMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgcHVibGljSWQgPSAiU1RBRkYiOwogICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSAic3RhZmYueG1sIjsKQEAgLTEwMCw3ICsxMTUsMTUgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X05BTUVTUEFDRV9FUlIiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVEb2N1bWVudFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvY3VtZW50VHlwZTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIHB1YmxpY0lkID0gImh0dHA6Ly93d3cubG9jYWxob3N0LmNvbS8iOwogICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSAibXlEb2MuZHRkIjsKQEAgLTE1NCw3ICsxNzcsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVEb2N1bWVudFR5cGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvY3VtZW50VHlwZTMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgCiAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0gInByZWZpeDpteURvYyI7CkBAIC0xNzQsNyArMjA1LDE1IEBACiAgICAgICAgIG5vZGVWYWx1ZSA9IG5ld1R5cGUuZ2V0Tm9kZVZhbHVlKCk7CiAgICAgICAgIGFzc2VydE51bGwoIm5vZGVWYWx1ZSIsIG5vZGVWYWx1ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgbnVsbCBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZURvY3VtZW50VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnRUeXBlNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgcHVibGljSWQgPSAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iOwogICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSAibXlEb2MuZHRkIjsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0NyZWF0ZUVsZW1lbnROUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vQ3JlYXRlRWxlbWVudE5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vQ3JlYXRlRWxlbWVudE5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0NyZWF0ZUVsZW1lbnROUy5qYXZhCmluZGV4IDE5ZGYwZGUuLmFjYjc5YzMgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0NyZWF0ZUVsZW1lbnROUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0NyZWF0ZUVsZW1lbnROUy5qYXZhCkBAIC0xOSwxNyArMTksMjIgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIAoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKKwogLyoqCiAgKiBUaGUgImNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSkiIG1ldGhvZCBmb3IgYSBEb2N1bWVudAogICogc2hvdWxkIHJhaXNlIE5BTUVTUEFDRV9FUlIgRE9NRXhjZXB0aW9uIGlmIHF1YWxpZmllZE5hbWUgaXMgbWFsZm9ybWVkLgpAQCAtNDgsNiArNTMsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjeHBvaW50ZXIoaWQoJ0lELURvY0NyRWxOUycpL3JhaXNlcy9leGNlcHRpb25bQG5hbWU9J0RPTUV4Y2VwdGlvbiddL2Rlc2NyL3Bbc3Vic3RyaW5nLWJlZm9yZSguLCc6Jyk9J05BTUVTUEFDRV9FUlInXSkiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSN4cG9pbnRlcihpZCgnSUQtRG9jQ3JFbE5TJykvcmFpc2VzL2V4Y2VwdGlvbltAbmFtZT0nRE9NRXhjZXB0aW9uJ10vZGVzY3IvcFtzdWJzdHJpbmctYmVmb3JlKC4sJzonKT0nTkFNRVNQQUNFX0VSUiddKTwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgQ3JlYXRlRWxlbWVudE5TIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNzcsNiArODMsMTYgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgYSBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgdHlwZXMgb2YgIiArCisgICAgICAgICAgICAiRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZUVsZW1lbnROUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRWxlbWVudE5TMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cuZWNvbW1lcmNlLm9yZy8iOwogICAgICAgICBTdHJpbmcgbWFsZm9ybWVkTmFtZSA9ICJwcmVmaXg6OmxvY2FsIjsKQEAgLTk0LDcgKzExMCwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTkFNRVNQQUNFX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgbnVsbCBhcyBhIHBhcmFtZXRlcnMsIGFuZCBvdGhlciB0eXBlcyBvZiAiICsKKyAgICAgICAgICAgICJET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRWxlbWVudE5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbGVtZW50TlMyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwogCkBAIC0xMTMsNyArMTM4LDE2IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OQU1FU1BBQ0VfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBudWxsIGFzIGEgcGFyYW1ldGVycywgYW5kIG90aGVyIHR5cGVzIG9mICIgKyAKKyAgICAgICAgICAgICJET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRWxlbWVudE5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbGVtZW50TlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy53ZWRkaW5nLmNvbS8iOwogICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZTsKQEAgLTE2Myw3ICsxOTcsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgYSBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgdHlwZXMgb2YgIiArIAorICAgICAgICAgICAgIkRPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVFbGVtZW50TlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnROUzQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VzIjsKICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAieG1sOmVsZW1lbnQxIjsKQEAgLTE4MSw3ICsyMjQsMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X05BTUVTUEFDRV9FUlIiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IG51bGwgYXMgYSBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgdHlwZXMgb2YgIiArIAorICAgICAgICAgICAgIkRPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVFbGVtZW50TlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnROUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3Lm5pc3QuZ292IjsKICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAiZ292OmZhY3VsdHkiOwpAQCAtMTkzLDcgKzI0NSwxNiBAQAogICAgICAgICBlbGVtZW50TmFtZSA9IG5ld0VsZW1lbnQuZ2V0VGFnTmFtZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRocm93X0VxdWFscyIsIHF1YWxpZmllZE5hbWUsIGVsZW1lbnROYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBudWxsIGFzIGEgcGFyYW1ldGVycywgYW5kIG90aGVyIHR5cGVzIG9mICIgKyAKKyAgICAgICAgICAgIkRPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVFbGVtZW50TlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnROUzYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyI7CiAKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RPTURvY3VtZW50QnVpbGRlckZhY3RvcnkuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTURvY3VtZW50QnVpbGRlckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9ET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5LmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTURvY3VtZW50QnVpbGRlckZhY3RvcnkuamF2YQppbmRleCBmMWNlNWM3Li5kMjhiMmQ3IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9ET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5qYXZhCkBAIC0xLDQgKzEsNCBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgICAgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgCiAgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKSB7CkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEb2N1bWVudEJ1aWxkZXIgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkRvY3VtZW50QnVpbGRlciBtdXN0IG5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgfQpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25DcmVhdGVEb2N1bWVudC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25DcmVhdGVEb2N1bWVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uQ3JlYXRlRG9jdW1lbnQuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25DcmVhdGVEb2N1bWVudC5qYXZhCmluZGV4IGY0YmUzMmMuLmZlZDMyYjggMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uQ3JlYXRlRG9jdW1lbnQuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9ET01JbXBsZW1lbnRhdGlvbkNyZWF0ZURvY3VtZW50LmphdmEKQEAgLTEsMTQgKzEsMTkgQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIFRoZSBjcmVhdGVEb2N1bWVudCBtZXRob2Qgd2l0aCB2YWxpZCBhcmd1bWVudHMsIHNob3VsZCBjcmVhdGUgYSBET00gRG9jdW1lbnQKQEAgLTIzLDYgKzI4LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0xldmVsLTItQ29yZS1ET00tY3JlYXRlRG9jdW1lbnQiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNMZXZlbC0yLUNvcmUtRE9NLWNyZWF0ZURvY3VtZW50PC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKERPTUltcGxlbWVudGF0aW9uLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBET01JbXBsZW1lbnRhdGlvbkNyZWF0ZURvY3VtZW50IGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNTIsNiArNTgsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVEb2N1bWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudDMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsOwpAQCAtODEsNyArOTYsMTUgQEAKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImRvbWltcGxlbWVudGF0aW9uY3JlYXRlZG9jdW1lbnQwMyIsIG5ld0RvYyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBOQU1FU1BBQ0VfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRG9jdW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnQ0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbDsKQEAgLTEwNCw3ICsxMjcsMTUgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoImRvbWltcGxlbWVudGF0aW9uY3JlYXRlZG9jdW1lbnQwNCIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRE9NRXhjZXB0aW9uIHdpdGggTkFNRVNQQUNFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZURvY3VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvY3VtZW50NSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERPTUltcGxlbWVudGF0aW9uIGRvbUltcGw7CkBAIC0xMjYsNyArMTU3LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJkb21pbXBsZW1lbnRhdGlvbmNyZWF0ZWRvY3VtZW50MDUiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVEb2N1bWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudDcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25DcmVhdGVEb2N1bWVudFR5cGUuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uQ3JlYXRlRG9jdW1lbnRUeXBlLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25DcmVhdGVEb2N1bWVudFR5cGUuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25DcmVhdGVEb2N1bWVudFR5cGUuamF2YQppbmRleCBkYWMzYjdhLi42OTU3YjViIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9ET01JbXBsZW1lbnRhdGlvbkNyZWF0ZURvY3VtZW50VHlwZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uQ3JlYXRlRG9jdW1lbnRUeXBlLmphdmEKQEAgLTE5LDE3ICsxOSwyMiBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotCiBpbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwogCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworCiAvKioKICAqIFRoZSBtZXRob2QgY3JlYXRlRG9jdW1lbnRUeXBlIHdpdGggdmFsaWQgdmFsdWVzIGZvciBxdWFsaWZpZWROYW1lLCBwdWJsaWNJZAogICogYW5kIHN5c3RlbUlkIHNob3VsZCBjcmVhdGUgYW4gZW1wdHkgRG9jdW1lbnRUeXBlIG5vZGUuCkBAIC00Myw2ICs0OCw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNMZXZlbC0yLUNvcmUtRE9NLWNyZWF0ZURvY3VtZW50Ij5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjTGV2ZWwtMi1Db3JlLURPTS1jcmVhdGVEb2N1bWVudDwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhET01JbXBsZW1lbnRhdGlvbi5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRE9NSW1wbGVtZW50YXRpb25DcmVhdGVEb2N1bWVudFR5cGUgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC03Miw2ICs3OCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImNyZWF0ZURvY3VtZW50VHlwZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnRUeXBlMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERPTUltcGxlbWVudGF0aW9uIGRvbUltcGw7CkBAIC0xMDYsNyArMTIxLDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRG9jdW1lbnRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudFR5cGUyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbDsKQEAgLTE0NCw3ICsxNjcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgb3duZXJEb2N1bWVudCk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRG9jdW1lbnRUeXBlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudFR5cGU0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uSGFzRmVhdHVyZS5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25IYXNGZWF0dXJlLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRE9NSW1wbGVtZW50YXRpb25IYXNGZWF0dXJlLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uSGFzRmVhdHVyZS5qYXZhCmluZGV4IDk5YjEyZmIuLmI1MDc0YWQgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uSGFzRmVhdHVyZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTUltcGxlbWVudGF0aW9uSGFzRmVhdHVyZS5qYXZhCkBAIC0xLDEzICsxLDE4IEBACi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci0KIGltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIAoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKKwogLyoqCiAgKiBUaGUgImZlYXR1cmUiIHBhcmFtZXRlciBpbiB0aGUgImhhc0ZlYXR1cmUoZmVhdHVyZSx2ZXJzaW9uKSIgbWV0aG9kIGlzIHRoZQogICogcGFja2FnZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiBMZWdhbCB2YWx1ZXMgYXJlIFhNTCBhbmQgSFRNTCBhbmQgQ09SRS4gKFRlc3QKQEAgLTIzLDYgKzI4LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELTVDRUQ5NEQ3Ij5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtNUNFRDk0RDc8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRE9NSW1wbGVtZW50YXRpb24uY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIERPTUltcGxlbWVudGF0aW9uSGFzRmVhdHVyZSBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTUyLDYgKzU4LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0ZlYXR1cmUgcmV0dXJucyB0cnVlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0ZlYXR1cmUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0ZlYXR1cmVDb3JlKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbDsKQEAgLTYxLDcgKzc2LDE1IEBACiAgICAgICAgIHN0YXRlID0gZG9tSW1wbC5oYXNGZWF0dXJlKCJjb3JlIiwgIjIuMCIpOwogICAgICAgICBhc3NlcnRUcnVlKCJkb21pbXBsZW1lbnRhdGlvbkZlYXR1cmVjb3JlQXNzZXJ0Iiwgc3RhdGUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaGFzRmVhdHVyZSByZXR1cm5zIHRydWUgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzRmVhdHVyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzRmVhdHVyZVhtbCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERPTUltcGxlbWVudGF0aW9uIGRvbUltcGw7CkBAIC03MSw3ICs5NCwxNSBAQAogICAgICAgICBzdGF0ZSA9IGRvbUltcGwuaGFzRmVhdHVyZSgieG1sIiwgIjIuMCIpOwogICAgICAgICBhc3NlcnRUcnVlKCJkb21pbXBsZW1lbnRhdGlvbkZlYXR1cmV4bWxWZXJzaW9uMkFzc2VydCIsIHN0YXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0aGF0IGhhc0ZlYXR1cmUgbWV0aG9kIHJldHVybnMgZmFsc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzRmVhdHVyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzRmVhdHVyZTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsOwpAQCAtMTA3LDcgKzEzOCwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZG9taW1wbGVtZW50YXRpb25oYXNmZWF0dXJlMDFfQ29yZV8zIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0ZlYXR1cmUgbWV0aG9kIHJldHVybnMgZmFsc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzRmVhdHVyZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzRmVhdHVyZTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRE9NVGVzdENhc2UuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRE9NVGVzdENhc2UuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRE9NVGVzdENhc2UuamF2YQppbmRleCAyY2ExZDdiLi4wNDFiNjdiIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9ET01UZXN0Q2FzZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RPTVRlc3RDYXNlLmphdmEKQEAgLTEsNCArMSw2IEBACi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwpAQCAtMTEsMTEgKzEzLDExIEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK0BUZXN0VGFyZ2V0Q2xhc3MoRG9jdW1lbnQuY2xhc3MpIAogcHVibGljIGNsYXNzIERPTVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHVibGljIERvY3VtZW50IGxvYWQoU3RyaW5nIGRvY1VSSSwgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICAgICAgRG9jdW1lbnQgZG9jID0gbG9hZChyZXNvbHZlVVJJKGRvY1VSSSksIGJ1aWxkZXIpOwotCiAgICAgICAgIHJldHVybiBkb2M7CiAgICAgfQogCmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudEJ1aWxkZXJTZXR0aW5nLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudEJ1aWxkZXJTZXR0aW5nLmphdmEKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRCdWlsZGVyU2V0dGluZy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudEJ1aWxkZXJTZXR0aW5nLmphdmEKaW5kZXggOWQyMjlkYS4uYmJiNzE5MCAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRCdWlsZGVyU2V0dGluZy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50QnVpbGRlclNldHRpbmcuamF2YQpAQCAtOSw3ICs5LDcgQEAKICAqIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwogCmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudEJ1aWxkZXJTZXR0aW5nU3RyYXRlZ3kuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50QnVpbGRlclNldHRpbmdTdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RvY3VtZW50QnVpbGRlclNldHRpbmdTdHJhdGVneS5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudEJ1aWxkZXJTZXR0aW5nU3RyYXRlZ3kuamF2YQppbmRleCA5OTYxZWQ3Li43N2JiY2U4IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudEJ1aWxkZXJTZXR0aW5nU3RyYXRlZ3kuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudEJ1aWxkZXJTZXR0aW5nU3RyYXRlZ3kuamF2YQpAQCAtMSw0ICsxLDQgQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudENyZWF0ZUF0dHJpYnV0ZU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudENyZWF0ZUF0dHJpYnV0ZU5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRDcmVhdGVBdHRyaWJ1dGVOUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudENyZWF0ZUF0dHJpYnV0ZU5TLmphdmEKaW5kZXggNDkwZTcxOC4uNWI4MThlNiAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRDcmVhdGVBdHRyaWJ1dGVOUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50Q3JlYXRlQXR0cmlidXRlTlMuamF2YQpAQCAtMTksMTggKzE5LDIzIEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci0KK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwogaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogVGhlIG1ldGhvZCBjcmVhdGVBdHRyaWJ1dGVOUyBjcmVhdGVzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUKQEAgLTQ3LDYgKzUyLDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELURvY0NyQXR0ck5TIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRG9jQ3JBdHRyTlM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRG9jdW1lbnQuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIERvY3VtZW50Q3JlYXRlQXR0cmlidXRlTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC03Niw2ICs4MiwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXR0cmlidXRlTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgQXR0ciBhdHRyaWJ1dGU7CkBAIC05OCw2ICsxMTMsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlQXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUF0dHJpYnV0ZU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEF0dHIgYXR0cmlidXRlMTsKQEAgLTEzOCw3ICsxNjIsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGNyZWF0ZWF0dHJpYnV0ZU5TMDJfYXR0Ml9uYW1lc3BhY2VVUkkiLAogICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsIG5hbWVzcGFjZVVSSSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBjcmVhdGVBdHRyaWJ1dGVOUyB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiSU5WQUxJRF9DSEFSQUNURVJfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlQXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUF0dHJpYnV0ZU5TMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAKQEAgLTE3MCw3ICsyMDMsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgY3JlYXRlQXR0cmlidXRlTlMgdGhyb3dzIERPTUV4Y2VwdGlvbiB3aXRoICIgKyAKKyAgICAgICAgICAgICJOQU1FU1BBQ0VfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlQXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUF0dHJpYnV0ZU5TNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAKQEAgLTE5OCw3ICsyNDAsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgY3JlYXRlQXR0cmlidXRlTlMgdGhyb3dzIERPTUV4Y2VwdGlvbiB3aXRoICIgKyAKKyAgICAgICAgICAgICJOQU1FU1BBQ0VfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlQXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUF0dHJpYnV0ZU5TNSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IG5ld0RvYzsKQEAgLTIyNCw3ICsyNzUsMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoImRvY3VtZW50Y3JlYXRlYXR0cmlidXRlTlMwNSIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBjcmVhdGVBdHRyaWJ1dGVOUyB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArIAorICAgICAgICAgICAgIk5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVFbGVtZW50TlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUF0dHJpYnV0ZU5TNigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IG5ld0RvYzsKQEAgLTI0OSw3ICszMDksMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoImRvY3VtZW50Y3JlYXRlYXR0cmlidXRlTlMwNiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBjcmVhdGVBdHRyaWJ1dGVOUyB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArIAorICAgICAgICAgICAgIk5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXR0cmlidXRlTlM3KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKIApkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRDcmVhdGVFbGVtZW50TlMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50Q3JlYXRlRWxlbWVudE5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRDcmVhdGVFbGVtZW50TlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRDcmVhdGVFbGVtZW50TlMuamF2YQppbmRleCA5ZjNjOTZmLi5lNTNiZWIzIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudENyZWF0ZUVsZW1lbnROUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50Q3JlYXRlRWxlbWVudE5TLmphdmEKQEAgLTEsMTMgKzEsMTggQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCiAvKioKICAqIFRoZSBtZXRob2QgY3JlYXRlRWxlbWVudE5TIGNyZWF0ZXMgYW4gZWxlbWVudCBvZiB0aGUgZ2l2ZW4gdmFsaWQKICAqIHF1YWxpZmllZE5hbWUgYW5kIE5hbWVzcGFjZVVSSS4KQEAgLTIzLDYgKzI4LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELURvY0NyRWxOUyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELURvY0NyRWxOUzwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRDcmVhdGVFbGVtZW50TlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC01Miw2ICs1OCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVFbGVtZW50TlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnROUzEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC03Niw3ICs5MSwxNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImRvY3VtZW50Y3JlYXRlZWxlbWVudE5TMDFfcHJlZml4IiwgIlhNTCIsIHByZWZpeCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZG9jdW1lbnRjcmVhdGVlbGVtZW50TlMwMV90YWdOYW1lIiwgIlhNTDpYTUwiLCB0YWdOYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGNyZWF0ZUVsZW1lbnROUyB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiSU5WQUxJRF9DSEFSQUNURVJfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRWxlbWVudE5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbGVtZW50TlMyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgCkBAIC05NSw3ICsxMTksMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoImRvY3VtZW50Y3JlYXRlZWxlbWVudE5TMDIiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgY3JlYXRlRWxlbWVudE5TIHRocm93cyBET01FeGNlcHRpb24gd2l0aCAiICsKKyAgICAgICAgICAgIk5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJjcmVhdGVFbGVtZW50TlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnROUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICAKQEAgLTExNCw3ICsxNDcsMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoImRvY3VtZW50Y3JlYXRlZWxlbWVudE5TMDUiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgY3JlYXRlRWxlbWVudE5TIHRocm93cyBET01FeGNlcHRpb24gd2l0aCAiICsKKyAgICAgICAgICAgICJOQU1FU1BBQ0VfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiY3JlYXRlRWxlbWVudE5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbGVtZW50TlM2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgbmV3RG9jOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRHZXRFbGVtZW50c0J5VGFnbmFtZU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudEdldEVsZW1lbnRzQnlUYWduYW1lTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudEdldEVsZW1lbnRzQnlUYWduYW1lTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRHZXRFbGVtZW50c0J5VGFnbmFtZU5TLmphdmEKaW5kZXggZTUxYjU4Ni4uM2E3ZGZhMSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRHZXRFbGVtZW50c0J5VGFnbmFtZU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRHZXRFbGVtZW50c0J5VGFnbmFtZU5TLmphdmEKQEAgLTEsMTIgKzEsMTcgQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogVGhlIG1ldGhvZCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TIHJldHVybnMgYSBOb2RlTGlzdCBvZiBhbGwgdGhlIEVsZW1lbnRzIHdpdGgKQEAgLTI2LDYgKzMxLDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQnVncy9QdWJsaWMvc2hvd19idWcuY2dpP2lkPTI1OSI+aHR0cDovL3d3dy53My5vcmcvQnVncy9QdWJsaWMvc2hvd19idWcuY2dpP2lkPTI1OTwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRHZXRFbGVtZW50c0J5VGFnbmFtZU5TIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNTUsNiArNjEsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzICcqJyBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRzQnlUYWdOYW1lTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgbmV3RG9jOwpAQCAtNzEsNyArODYsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGdldGVsZW1lbnRzYnl0YWduYW1lTlMwMSIsIDEsIGNoaWxkTGlzdAogICAgICAgICAgICAgICAgIC5nZXRMZW5ndGgoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgJyonIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGRvY0VsZW07CkBAIC04Niw3ICsxMDksMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGdldGVsZW1lbnRzYnl0YWduYW1lTlMwMiIsIDYsIGNoaWxkTGlzdAogICAgICAgICAgICAgICAgIC5nZXRMZW5ndGgoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgd3JvbmcgbmFtZXNwYWNlVVJJIGFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRzQnlUYWdOYW1lTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lTlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgY2hpbGRMaXN0OwpAQCAtOTUsNyArMTI2LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiZG9jdW1lbnRnZXRlbGVtZW50c2J5dGFnbmFtZU5TMDMiLCAwLCBjaGlsZExpc3QKICAgICAgICAgICAgICAgICAuZ2V0TGVuZ3RoKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBjaGlsZExpc3Q7CkBAIC0xMDYsNyArMTQ1LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiZG9jdW1lbnRnZXRlbGVtZW50c2J5dGFnbmFtZU5TMDQiLCAwLCBjaGlsZExpc3QKICAgICAgICAgICAgICAgICAuZ2V0TGVuZ3RoKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBjaGlsZExpc3Q7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudEdldGVFZW1lbnRCeUlkLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudEdldGVFZW1lbnRCeUlkLmphdmEKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRHZXRlRWVtZW50QnlJZC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudEdldGVFZW1lbnRCeUlkLmphdmEKaW5kZXggZTM0NGRjNi4uOTcyZDJiYSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRHZXRlRWVtZW50QnlJZC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50R2V0ZUVlbWVudEJ5SWQuamF2YQpAQCAtMSwxMCArMSwxNSBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIAoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKKwogLyoqCiAgKiBUaGUgbWV0aG9kIGdldEVsZW1lbnRCeUlkIHJldHVybnMgdGhlIGVsZW1lbnQgd2hvc2UgSUQgaXMgZ2l2ZW4gYnkgZWxlbWVudElkLgogICogSWYgbm90IHN1Y2ggZWxlbWVudCBleGlzdHMsIHJldHVybnMgbnVsbC4KQEAgLTE5LDYgKzI0LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELWdldEVsQklkIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtZ2V0RWxCSWQ8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRG9jdW1lbnQuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIERvY3VtZW50R2V0ZUVlbWVudEJ5SWQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC00OCw2ICs1NCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZ2V0RWxlbWVudEJ5SWQgbWV0aG9kIGZvciBleGlzdGVudCBlbGVtZW50LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRCeUlkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50QnlJZCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RvY3VtZW50SW1wb3J0Tm9kZS5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRJbXBvcnROb2RlLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRJbXBvcnROb2RlLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50SW1wb3J0Tm9kZS5qYXZhCmluZGV4IDk4NTViODQuLjJhZjZkOGUgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RvY3VtZW50SW1wb3J0Tm9kZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50SW1wb3J0Tm9kZS5qYXZhCkBAIC0xLDIzICsxLDIzIEBACi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KIC8qKgogICogVGhlIGltcG9ydE5vZGUgbWV0aG9kIGltcG9ydHMgYSBub2RlIGZyb20gYW5vdGhlciBkb2N1bWVudCB0byB0aGlzIGRvY3VtZW50LgogICogVGhlIHJldHVybmVkIG5vZGUgaGFzIG5vIHBhcmVudDsgKHBhcmVudE5vZGUgaXMgbnVsbCkuIFRoZSBzb3VyY2Ugbm9kZSBpcyBub3QKQEAgLTM3LDYgKzM3LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0NvcmUtRG9jdW1lbnQtaW1wb3J0Tm9kZSI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0NvcmUtRG9jdW1lbnQtaW1wb3J0Tm9kZTwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRJbXBvcnROb2RlIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtODksNyArOTAsMTUgQEAKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoImRvY3VtZW50aW1wb3J0bm9kZTAxX25vZGVUeXBlIiwgMiwgbm9kZVR5cGUpOwogLy8gICAgICAgIGFzc2VydEVxdWFscygiZG9jdW1lbnRpbXBvcnRub2RlMDFfbm9kZVZhbHVlIiwgIlllcyIsIG5vZGVWYWx1ZSk7CiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24gZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgZG9jSW1wb3J0ZWQ7CkBAIC0xNzIsNyArMTgxLDE1IEBACiAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGltcG9ydG5vZGUwNF9ub2RlVHlwZSIsIDIsIG5vZGVUeXBlKTsKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoImRvY3VtZW50aW1wb3J0bm9kZTA0X25vZGVWYWx1ZSIsICJkZWZhdWx0VmFsIiwgbm9kZVZhbHVlKTsKIC8vICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbiBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9kZTUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudCBkb2NJbXBvcnRlZDsKQEAgLTE5Niw3ICsyMTMsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGltcG9ydG5vZGUwNV9uYW1lc3BhY2VVUkkiLAogICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9ET00vVGVzdCIsIG5hbWVzcGFjZVVSSSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpbXBvcnROb2RlIG1ldGhvZCB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiTk9UX1NVUFBPUlRFRF9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb2RlNigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIApAQCAtMjEyLDcgKzIzOCwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTk9UX1NVUFBPUlRFRF9FUlIiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaW1wb3J0Tm9kZSBtZXRob2QgdGhyb3dzIERPTUV4Y2VwdGlvbiB3aXRoICIgKworICAgICAgICAgICAgIk5PVF9TVVBQT1JURURfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9kZTcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICAKQEAgLTIzMCw3ICsyNjUsMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X05PVF9TVVBQT1JURURfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGltcG9ydE5vZGUgbWV0aG9kIHRocm93cyBET01FeGNlcHRpb24gd2l0aCAiICsKKyAgICAgICAgICAgICJOT1RfU1VQUE9SVEVEX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGU4KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgCkBAIC0yNTIsNyArMjk2LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OT1RfU1VQUE9SVEVEX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uIGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb2RlOSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgZG9jRnJhZ21lbnQ7CkBAIC0yNzAsNyArMzIyLDE2IEBACiAgICAgICAgIHN1Y2Nlc3MgPSBpbXBvcnRlZERvY0ZyYWcuaGFzQ2hpbGROb2RlcygpOwogICAgICAgICBhc3NlcnRGYWxzZSgiZG9jdW1lbnRpbXBvcnRub2RlMDkiLCBzdWNjZXNzKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5OyAiICsKKyAgICAgICAgICAgICJkb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24gZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb2RlMTAoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudEZyYWdtZW50IGRvY0ZyYWdtZW50OwpAQCAtMjg4LDcgKzM0OSwxNSBAQAogICAgICAgICBzdWNjZXNzID0gaW1wb3J0ZWREb2NGcmFnLmhhc0NoaWxkTm9kZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZG9jdW1lbnRpbXBvcnRub2RlMTAiLCBzdWNjZXNzKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24gZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUxMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZG9jRWxlbWVudDsKQEAgLTMwNiw3ICszNzUsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGltcG9ydG5vZGUxMV9Ob2RlTmFtZSIsIG5vZGVOYW1lSW1wb3J0ZWQsCiAgICAgICAgICAgICAgICAgbm9kZU5hbWVPcmlnKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24gZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUxMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGNoaWxkTGlzdDsKQEAgLTMyNiw3ICs0MDMsMTUgQEAKICAgICAgICAgaW1wb3J0ZWRMZW4gPSAoaW50KSBpbXBvcnRlZENoaWxkcmVuLmdldExlbmd0aCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImRvY3VtZW50aW1wb3J0bm9kZTEyIiwgaW1wb3J0ZWRMZW4sIGFkZHJlc3NFbGVtTGVuKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24gZXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUxMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGNoaWxkTGlzdDsKQEAgLTM3MCw3ICs0NTUsMTUgQEAKIC8vICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsICJlbXAiKTsKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoImV4cGxpY2l0QXR0ckltcG9ydGVkIiwgImh0dHA6Ly93d3cubmlzdC5nb3YiLCBhdHRyVmFsdWUpOwogLy8gICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgaW1wb3J0IG9mIFRFWFRfTk9ERS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb2RlMTUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICAKQEAgLTM4Niw3ICs0NzksMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGltcG9ydG5vZGUxNSIsCiAgICAgICAgICAgICAgICAgIkRvY3VtZW50LmltcG9ydE5vZGUgdGVzdCBmb3IgYSBURVhUX05PREUiLCBub2RlVmFsdWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGltcG9ydCBvZiBDT01NRU5UX05PREUiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb2RlMTcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICAKQEAgLTQwMiw3ICs1MDMsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb2N1bWVudGltcG9ydG5vZGUxNyIsCiAgICAgICAgICAgICAgICAgIkRvY3VtZW50LmltcG9ydE5vZGUgdGVzdCBmb3IgYSBDT01NRU5UX05PREUiLCBub2RlVmFsdWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbiBleGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9kZTE4KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgCmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudFR5cGVJbnRlcm5hbFN1YnNldC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRUeXBlSW50ZXJuYWxTdWJzZXQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudFR5cGVJbnRlcm5hbFN1YnNldC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudFR5cGVJbnRlcm5hbFN1YnNldC5qYXZhCmluZGV4IDQ4YjVjY2YuLjFjNDJiMmYgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RvY3VtZW50VHlwZUludGVybmFsU3Vic2V0LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRUeXBlSW50ZXJuYWxTdWJzZXQuamF2YQpAQCAtMSwxMSArMSwxNiBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KIC8qKgogICogVGhlIG1ldGhvZCBnZXRJbnRlcm5hbFN1YnNldCgpIHJldHVybnMgdGhlIGludGVybmFsIHN1YnNldCBhcyBhIHN0cmluZy4KICAqIApAQCAtMTksNiArMjQsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjU5Ij5odHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjU5PC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50VHlwZS5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRUeXBlSW50ZXJuYWxTdWJzZXQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC00OCw2ICs1NCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCBjaGVjayBwb3NpdGl2ZSBjYXNlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludGVybmFsU3Vic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEludGVybmFsU3Vic2V0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGU7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudFR5cGVQdWJsaWNJZC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRUeXBlUHVibGljSWQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudFR5cGVQdWJsaWNJZC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Eb2N1bWVudFR5cGVQdWJsaWNJZC5qYXZhCmluZGV4IGRlMmVjMWYuLjFmZmI0MjQgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0RvY3VtZW50VHlwZVB1YmxpY0lkLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRUeXBlUHVibGljSWQuamF2YQpAQCAtMjAsMTMgKzIwLDE4IEBACiAKICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogCiAKQEAgLTQwLDYgKzQ1LDcgQEAKICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtQ29yZS1Eb2NUeXBlLXB1YmxpY0lkIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtQ29yZS1Eb2NUeXBlLXB1YmxpY0lkPC9hPgogKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0J1Z3MvUHVibGljL3Nob3dfYnVnLmNnaT9pZD0yNTkiPmh0dHA6Ly93d3cudzMub3JnL0J1Z3MvUHVibGljL3Nob3dfYnVnLmNnaT9pZD0yNTk8L2E+CiAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudFR5cGUuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIERvY3VtZW50VHlwZVB1YmxpY0lkIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNjcsNiArNzMsMTUgQEAKICAgICAqIFJ1bnMgdGhlIHRlc3QgY2FzZS4KICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFB1YmxpY0lkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHVibGljSWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgIERvY3VtZW50VHlwZSBkb2NUeXBlOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRUeXBlU3lzdGVtSWQuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50VHlwZVN5c3RlbUlkLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRG9jdW1lbnRUeXBlU3lzdGVtSWQuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRG9jdW1lbnRUeXBlU3lzdGVtSWQuamF2YQppbmRleCA1NWQ4NzZjLi4xMGJlMjg4IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Eb2N1bWVudFR5cGVTeXN0ZW1JZC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0RvY3VtZW50VHlwZVN5c3RlbUlkLmphdmEKQEAgLTIwLDE0ICsyMCwxOSBAQAogCiAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQogLyoqCiAgKiAgICAgVGhlIG1ldGhvZCBnZXRJbnRlcm5hbFN1YnNldCgpIHJldHVybnMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCBzdWJzZXQuCiAgKiAgIApAQCAtMzcsNiArNDIsNyBAQAogKiBAYXV0aG9yIE5laWwgRGVsaW1hCiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUNvcmUtRG9jVHlwZS1zeXN0ZW1JZCI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUNvcmUtRG9jVHlwZS1zeXN0ZW1JZDwvYT4KICovCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50VHlwZS5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRUeXBlU3lzdGVtSWQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwogCkBAIC02NCw2ICs3MCwxNSBAQAogICAgICogUnVucyB0aGUgdGVzdCBjYXNlLgogICAgICogQHRocm93cyBUaHJvd2FibGUgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0U3lzdGVtSWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTeXN0ZW1JZCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGU7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50R2V0QXR0cmlidXRlTlMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRHZXRBdHRyaWJ1dGVOUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRHZXRBdHRyaWJ1dGVOUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9FbGVtZW50R2V0QXR0cmlidXRlTlMuamF2YQppbmRleCA3NDQzYjc4Li44NTA1NDU5IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50R2V0QXR0cmlidXRlTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9FbGVtZW50R2V0QXR0cmlidXRlTlMuamF2YQpAQCAtMjAsNyArMjAsOSBAQAogCiAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKQEAgLTM5LDYgKzQxLDcgQEAKICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxHZXRBdHRyTlMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1FbEdldEF0dHJOUzwvYT4KICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjU5Ij5odHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjU5PC9hPgogKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudEdldEF0dHJpYnV0ZU5TIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRWxlbWVudEdldEF0dHJpYnV0ZU5vZGVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudEdldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRHZXRBdHRyaWJ1dGVOb2RlTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudEdldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCmluZGV4IDA4MTgzZDEuLmNiM2IzOTUgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRHZXRBdHRyaWJ1dGVOb2RlTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9FbGVtZW50R2V0QXR0cmlidXRlTm9kZU5TLmphdmEKQEAgLTEsMTIgKzEsMTYgQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCiAvKioKICAqIFRoZSBtZXRob2QgZ2V0QXR0cmlidXRlTm9kZU5TIHJldHJpZXZlcyBhbiBBdHRyIG5vZGUgYnkgbG9jYWwgbmFtZSBhbmQKICAqIG5hbWVzcGFjZSBVUkkuIENyZWF0ZSBhIG5ldyBlbGVtZW50IG5vZGUgYW5kIGFkZCAyIG5ldyBhdHRyaWJ1dGUgbm9kZXMgdG8gaXQKQEAgLTE5LDYgKzIzLDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUVsR2V0QXROb2RlTlMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1FbEdldEF0Tm9kZU5TPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKEVsZW1lbnQuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEVsZW1lbnRHZXRBdHRyaWJ1dGVOb2RlTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC00OCw2ICs1MywxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEF0dHJpYnV0ZU5vZGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlTm9kZU5TMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTg1LDcgKzk5LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiZWxlbWVudGdldGF0dHJpYnV0ZW5vZGVuczAxX2F0dHJOcyIsCiAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0RPTS9MZXZlbDIiLCBhdHRyTlMpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdHRyaWJ1dGVOb2RlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZU5vZGVOUzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50R2V0RWxlbWVudHNCeVRhZ05hbWVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudEdldEVsZW1lbnRzQnlUYWdOYW1lTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50R2V0RWxlbWVudHNCeVRhZ05hbWVOUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9FbGVtZW50R2V0RWxlbWVudHNCeVRhZ05hbWVOUy5qYXZhCmluZGV4IGRlYTY3N2EuLjFiZDlmYjYgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRHZXRFbGVtZW50c0J5VGFnTmFtZU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudEdldEVsZW1lbnRzQnlUYWdOYW1lTlMuamF2YQpAQCAtMSwxMSArMSwxNiBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQogLyoqCiAgKiBUaGUgbWV0aG9kIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgcmV0dXJucyBhIE5vZGVMaXN0IG9mIGFsbCB0aGUgRWxlbWVudHMgd2l0aAogICogYSBnaXZlbiBsb2NhbCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZQpAQCAtMTgsNiArMjMsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtZ2V0RWxCVE5OUyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELWdldEVsQlROTlM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudEdldEVsZW1lbnRzQnlUYWdOYW1lTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC00Nyw2ICs1MywxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRzQnlUYWdOYW1lTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtNTcsNyArNzIsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbGVtZW50Z2V0ZWxlbWVudHNieXRhZ25hbWVuczAyIiwgMCwgZWxlbWVudExpc3QKICAgICAgICAgICAgICAgICAuZ2V0TGVuZ3RoKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbGVtZW50c0J5VGFnTmFtZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50c0J5VGFnTmFtZU5TNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTg1LDcgKzEwOCwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImVsZW1lbnRnZXRlbGVtZW50c2J5dGFnbmFtZW5zMDRfMiIsIDMsIGVsZW1lbnRMaXN0CiAgICAgICAgICAgICAgICAgLmdldExlbmd0aCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50SGFzQXR0cmlidXRlLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9FbGVtZW50SGFzQXR0cmlidXRlLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRWxlbWVudEhhc0F0dHJpYnV0ZS5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9FbGVtZW50SGFzQXR0cmlidXRlLmphdmEKaW5kZXggMWM4OTdmNC4uMGJlMWE5YSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRWxlbWVudEhhc0F0dHJpYnV0ZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRIYXNBdHRyaWJ1dGUuamF2YQpAQCAtMSwxMiArMSwxNiBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KIC8qKgogICogVGhlIG1ldGhvZCBoYXNBdHRyaWJ1dGUgcmV0dXJucyB0cnVlIHdoZW4gYW4gYXR0cmlidXRlIHdpdGggYSBnaXZlbiBuYW1lIGlzCiAgKiBzcGVjaWZpZWQgb24gdGhpcyBlbGVtZW50IG9yIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGZhbHNlIG90aGVyd2lzZSBJbnZva2UgdGhlCkBAIC0xNyw2ICsyMSw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlSGFzQXR0cnMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlSGFzQXR0cnM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudEhhc0F0dHJpYnV0ZSBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTQ2LDYgKzUxLDE2IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBoYXNBdHRyaWJ1dGUgbWV0aG9kIHdpdGggZW1wdHkgc3RyaW5nICIgKworICAgICAgICAgICAgImFzIGEgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTY5LDcgKzg0LDE1IEBACiAvLyAgICAgICAgc3RhdGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgiZGVmYXVsdEF0dHIiKTsKIC8vICAgICAgICBhc3NlcnRUcnVlKCJlbGVtZW50aGFzYXR0cmlidXRlMDIiLCBzdGF0ZSk7CiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTg1LDcgKzEwOCwxNSBAQAogICAgICAgICBzdGF0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCJkb21lc3RpYyIpOwogICAgICAgICBhc3NlcnRUcnVlKCJlbGVtZW50aGFzYXR0cmlidXRlMDNfVHJ1ZSIsIHN0YXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRIYXNBdHRyaWJ1dGVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudEhhc0F0dHJpYnV0ZU5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRWxlbWVudEhhc0F0dHJpYnV0ZU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRIYXNBdHRyaWJ1dGVOUy5qYXZhCmluZGV4IGNmNDcxZTUuLjE1ZDdjZmYgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRIYXNBdHRyaWJ1dGVOUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRIYXNBdHRyaWJ1dGVOUy5qYXZhCkBAIC0xOSwxNSArMTksMjAgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCiAvKioKICAqIFRoZSBtZXRob2QgaGFzQXR0cmlidXRlTlMgcmV0dXJucyB0cnVlIHdoZW4gYW4gYXR0cmlidXRlIHdpdGggYSBnaXZlbiBsb2NhbAogICogbmFtZSBhbmQgbmFtZXNwYWNlIFVSSSBpcyBzcGVjaWZpZWQgb24gdGhpcyBlbGVtZW50IG9yIGhhcyBhIGRlZmF1bHQgdmFsdWUsCkBAIC00Miw2ICs0Nyw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1FbEhhc0F0dHJOUyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUVsSGFzQXR0ck5TPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKEVsZW1lbnQuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEVsZW1lbnRIYXNBdHRyaWJ1dGVOUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTcxLDcgKzc3LDE2IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0SGFzQXR0cmlidXRlTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwogICAgICAgICBib29sZWFuIHN0YXRlOwpAQCAtODMsNyArOTgsMTUgQEAKICAgICAgICAgICAgICAgICAuaGFzQXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwgInhtbG5zIik7CiAgICAgICAgIGFzc2VydFRydWUoImVsZW1lbnRoYXNhdHRyaWJ1dGVuczAxIiwgc3RhdGUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlTlMyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtOTcsNyArMTIwLDE1IEBACiAgICAgICAgIHN0YXRlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvRE9NIiwgImRvbWVzdGljIik7CiAgICAgICAgIGFzc2VydFRydWUoImhhc0RvbWVzdGljQXR0ciIsIHN0YXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0F0dHJpYnV0ZU5TMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRSZW1vdmVBdHRyaWJ1dGVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudFJlbW92ZUF0dHJpYnV0ZU5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA4MSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRWxlbWVudFJlbW92ZUF0dHJpYnV0ZU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRSZW1vdmVBdHRyaWJ1dGVOUy5qYXZhCmluZGV4IDQ1MjhhNzIuLjVjMjViMmEgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRSZW1vdmVBdHRyaWJ1dGVOUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRSZW1vdmVBdHRyaWJ1dGVOUy5qYXZhCkBAIC0xLDEwICsxLDE1IEBACi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgbWV0aG9kIHJlbW92ZUF0dHJpYnV0ZU5TIHJlbW92ZXMgYW4gYXR0cmlidXRlIGJ5IGxvY2FsIG5hbWUgYW5kIG5hbWVzcGFjZQpAQCAtMTgsNiArMjMsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxSZW1BdE5TIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxSZW1BdE5TPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKEVsZW1lbnQuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEVsZW1lbnRSZW1vdmVBdHRyaWJ1dGVOUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTQ3LDYgKzUzLDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlQXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUF0dHJpYnV0ZU5TKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRWxlbWVudFNldEF0dHJpYnV0ZU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9FbGVtZW50U2V0QXR0cmlidXRlTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50U2V0QXR0cmlidXRlTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudFNldEF0dHJpYnV0ZU5TLmphdmEKaW5kZXggYjc3NTA0ZS4uZWExMWQ5ZCAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vRWxlbWVudFNldEF0dHJpYnV0ZU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudFNldEF0dHJpYnV0ZU5TLmphdmEKQEAgLTEsMTYgKzEsMjEgQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIFRoZSBtZXRob2Qgc2V0QXR0cmlidXRlTlMgYWRkcyBhIG5ldyBhdHRyaWJ1dGUuIENyZWF0ZSBhIG5ldyBlbGVtZW50IGFuZCBhZGQKQEAgLTIzLDYgKzI4LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUVsU2V0QXR0ck5TIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxTZXRBdHRyTlM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudFNldEF0dHJpYnV0ZU5TIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNTIsNiArNTgsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtNjksNyArODQsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbGVtZW50c2V0YXR0cmlidXRlbnMwMV9hdHRyTmFtZSIsICJhdHRyIiwgYXR0ck5hbWUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImVsZW1lbnRzZXRhdHRyaWJ1dGVuczAxX2F0dHJWYWx1ZSIsICJ2YWx1ZSIsIGF0dHJWYWx1ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyaWJ1dGVOUzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC05MSw3ICsxMTQsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbGVtZW50c2V0YXR0cmlidXRlbnMwMl9hdHRyVmFsdWUiLCAiU2lsdmVyIFN0cmVldCIsCiAgICAgICAgICAgICAgICAgYXR0clZhbHVlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5TMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTExNSw3ICsxNDYsMTUgQEAKICAgICAgICAgICAgICAgICBhdHRyTmFtZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZWxlbWVudHNldGF0dHJpYnV0ZW5zMDNfYXR0clZhbHVlIiwgImRlZmF1bHQxIiwgYXR0clZhbHVlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBJTlZBTElEX0NIQVJBQ1RFUl9FUlIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5TNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTE0OSw3ICsxODgsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTlM1KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtMTY5LDcgKzIxNiwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZWxlbWVudHNldGF0dHJpYnV0ZW5zMDUiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTlM4KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtMTk5LDYgKzI1NCwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZWxlbWVudHNldGF0dHJpYnV0ZW5zMDhfRXJyMiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTlNVUklOdWxsKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7CiAKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0VsZW1lbnRTZXRBdHRyaWJ1dGVOb2RlTlMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRTZXRBdHRyaWJ1dGVOb2RlTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50U2V0QXR0cmlidXRlTm9kZU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0VsZW1lbnRTZXRBdHRyaWJ1dGVOb2RlTlMuamF2YQppbmRleCA5YjdlMTgyLi4wYTI1M2RhIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9FbGVtZW50U2V0QXR0cmlidXRlTm9kZU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vRWxlbWVudFNldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCkBAIC0xOSwxNyArMTksMjIgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogVGVzdGluZyBFbGVtZW50LnNldEF0dHJpYnV0ZU5vZGVOUzogSWYgYW4gYXR0cmlidXRlIHdpdGggdGhhdCBsb2NhbCBuYW1lIGFuZApAQCAtNDQsNiArNDksNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxTZXRBdE5vZGVOUyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUVsU2V0QXROb2RlTlM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudFNldEF0dHJpYnV0ZU5vZGVOUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTczLDYgKzc5LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTm9kZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLkF0dHIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyaWJ1dGVOb2RlTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtMTA2LDcgKzEyMSwxNSBAQAogICAgICAgICBsZW5ndGggPSAoaW50KSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImxlbmd0aCIsIDEsIGxlbmd0aCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF0dHJpYnV0ZU5vZGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5BdHRyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTm9kZU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTEzMiw3ICsxNTUsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbGVtZW50c2V0YXR0cmlidXRlbm9kZW5zMDJfYXR0ck5hbWUiLCAic3RyZWV0IiwgYXR0ck5hbWUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImVsZW1lbnRzZXRhdHRyaWJ1dGVub2RlbnMwMl9hdHRyVmFsdWUiLCAiWWVzIiwgYXR0clZhbHVlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBJTlVTRV9BVFRSSUJVVEVfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTm9kZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLkF0dHIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyaWJ1dGVOb2RlTlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50MTsKQEAgLTE1OSw3ICsxOTAsMTUgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoImVsZW1lbnRzZXRhdHRyaWJ1dGVub2RlbnMwMyIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRE9NRXhjZXB0aW9uIHdpdGggSU5VU0VfQVRUUklCVVRFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF0dHJpYnV0ZU5vZGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5BdHRyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTm9kZU5TNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDE7CkBAIC0xODIsNyArMjIxLDE1IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJlbGVtZW50c2V0YXR0cmlidXRlbm9kZW5zMDQiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIFdST05HX0RPQ1VNRU5UX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF0dHJpYnV0ZU5vZGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5BdHRyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTm9kZU5TNSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IGRvY0FsdDsKQEAgLTIwNSw4ICsyNTIsMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X1dST05HX0RPQ1VNRU5UX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5vZGVOUzYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOb2RlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uQXR0ci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RTZXRBdHRyaWJ1dGVOb2RlTlM2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwogICAgICAgICBBdHRyIGF0dHJpYnV0ZTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0dldEF0dHJpYnV0ZU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9HZXRBdHRyaWJ1dGVOUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0dldEF0dHJpYnV0ZU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0dldEF0dHJpYnV0ZU5TLmphdmEKaW5kZXggNTQ5NzQzYi4uNmEzZWUxMSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vR2V0QXR0cmlidXRlTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9HZXRBdHRyaWJ1dGVOUy5qYXZhCkBAIC0xOSwxNSArMTksMjAgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAoraW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwogCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworCiAvKioKICAqIFRoZSAiZ2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLGxvY2FsTmFtZSkiIG1ldGhvZCByZXRyaWV2ZXMgYW4gYXR0cmlidXRlCiAgKiB2YWx1ZSBieSBsb2NhbCBuYW1lIGFuZCBOYW1lc3BhY2VVUkkuCkBAIC00Myw2ICs0OCw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0J1Z3MvUHVibGljL3Nob3dfYnVnLmNnaT9pZD0yMzgiPmh0dHA6Ly93d3cudzMub3JnL0J1Z3MvUHVibGljL3Nob3dfYnVnLmNnaT9pZD0yMzg8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgR2V0QXR0cmlidXRlTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC04Nyw3ICs5MywxNSBAQAogLy8gICAgICAgIGF0dHJWYWx1ZSA9IHRlc3RBZGRyLmdldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoImF0dHJWYWx1ZSIsICJESVNUUklDVCIsIGF0dHJWYWx1ZSk7CiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cubmlzdC5nb3YiOwogICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gImRpc3RyaWN0IjsKQEAgLTEwOSw3ICsxMjMsMTUgQEAKICAgICAgICAgYXR0clZhbHVlID0gdGVzdEFkZHIuZ2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRocm93X0VxdWFscyIsICIiLCBhdHRyVmFsdWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlTlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5uaXN0LmdvdiI7CiAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiZG9tZXN0aWMiOwpAQCAtMTI1LDcgKzE0NywxNSBAQAogICAgICAgICBhdHRyVmFsdWUgPSB0ZXN0QWRkci5nZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dfRXF1YWxzIiwgIiIsIGF0dHJWYWx1ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVOUzQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3Lm5pc3QuZ292IjsKICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJibGFuayI7CkBAIC0xNDUsNyArMTc1LDE1IEBACiAgICAgICAgIGF0dHJWYWx1ZSA9IHRlc3RBZGRyLmdldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJvd19FcXVhbHMiLCAiTmV3VmFsdWUiLCBhdHRyVmFsdWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlTlM1KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9HZXRBdHRyaWJ1dGVOb2RlTlMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0dldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0dldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9HZXRBdHRyaWJ1dGVOb2RlTlMuamF2YQppbmRleCAwY2VjZmFlLi43YjI0ODhhIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9HZXRBdHRyaWJ1dGVOb2RlTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9HZXRBdHRyaWJ1dGVOb2RlTlMuamF2YQpAQCAtMTksMTUgKzE5LDIwIEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQogLyoqCiAgKiBUaGUgImdldEF0dHJpYnV0ZU5vZGVOUyhuYW1lc3BhY2VVUkksbG9jYWxOYW1lKSIgbWV0aG9kIHJldHJpZXZlcyBhbgogICogYXR0cmlidXRlIG5vZGUgYnkgbG9jYWwgbmFtZSBhbmQgTmFtZXNwYWNlVVJJLgpAQCAtNDIsNiArNDcsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxHZXRBdE5vZGVOUyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUVsR2V0QXROb2RlTlM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgR2V0QXR0cmlidXRlTm9kZU5TIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNzEsNiArNzcsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRBdHRyaWJ1dGVOb2RlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZU5vZGVOUzEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3Lm5pc3QuZ292IjsKICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJpbnZhbGlkbG9jYWxuYW1lIjsKQEAgLTg1LDcgKzEwMCwxNSBAQAogICAgICAgICBhdHRyaWJ1dGUgPSB0ZXN0QWRkci5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwogICAgICAgICBhc3NlcnROdWxsKCJ0aHJvd19OdWxsIiwgYXR0cmlidXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0QXR0cmlidXRlTm9kZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVOb2RlTlMyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9HZXRFbGVtZW50QnlJZC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vR2V0RWxlbWVudEJ5SWQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9HZXRFbGVtZW50QnlJZC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9HZXRFbGVtZW50QnlJZC5qYXZhCmluZGV4IDEyN2Q0NzEuLjlmMzU0NDcgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0dldEVsZW1lbnRCeUlkLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vR2V0RWxlbWVudEJ5SWQuamF2YQpAQCAtMTksMTMgKzE5LDE4IEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworCiAvKioKICAqIFRoZSAiZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKSIgbWV0aG9kIGZvciBhIERvY3VtZW50IHNob3VsZCByZXR1cm4gYW4KICAqIGVsZW1lbnQgd2hvc2UgSUQgbWF0Y2hlcyBlbGVtZW50SWQuCkBAIC00MSw2ICs0Niw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0J1Z3MvUHVibGljL3Nob3dfYnVnLmNnaT9pZD0zODMiPmh0dHA6Ly93d3cudzMub3JnL0J1Z3MvUHVibGljL3Nob3dfYnVnLmNnaT9pZD0zODM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRG9jdW1lbnQuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEdldEVsZW1lbnRCeUlkIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtODAsNyArODYsMTUgQEAKIC8vICAgICAgICB0YWduYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7CiAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJvd19FcXVhbHMiLCAiZW1wOmFkZHJlc3MiLCB0YWduYW1lKTsKIC8vICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IGdldEVsZW1lbnRCeUlkIG1ldGhvZCBmb3IgZXhpc3RlbnQgZWxlbWVudC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbGVtZW50QnlJZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudEJ5SWQyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vR2V0RWxlbWVudHNCeVRhZ05hbWVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vR2V0RWxlbWVudHNCeVRhZ05hbWVOUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0dldEVsZW1lbnRzQnlUYWdOYW1lTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vR2V0RWxlbWVudHNCeVRhZ05hbWVOUy5qYXZhCmluZGV4IGE4YWM4NWUuLjdjODMxNzUgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0dldEVsZW1lbnRzQnlUYWdOYW1lTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9HZXRFbGVtZW50c0J5VGFnTmFtZU5TLmphdmEKQEAgLTE5LDE3ICsxOSwyMiBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotCiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIFRoZSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhuYW1lc3BhY2VVUkksbG9jYWxOYW1lKSIgbWV0aG9kIGZvciBhIERvY3VtZW50CkBAIC00NSw2ICs1MCw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1nZXRFbEJUTk5TIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtZ2V0RWxCVE5OUzwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgR2V0RWxlbWVudHNCeVRhZ05hbWVOUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CiAKQEAgLTY2LDcgKzcyLDE1IEBACiAgICAgICAgIGJ1aWxkZXIgPSBudWxsOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgbWV0aG9kIHdpdGggKiBhcyBwYXJhbWV0ZXJzLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRzQnlUYWdOYW1lTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiKiI7CiAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiKiI7CkBAIC03OCw3ICs5MiwxNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoInRocm93X1NpemUiLCAzNiwgbmV3TGlzdC5nZXRMZW5ndGgoKSk7CiAgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRFbGVtZW50c0J5VGFnTmFtZU5TIHdpdGggJyonICIgKworICAgICAgICAgICAgImFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBuZXdMaXN0OwpAQCAtOTQsNyArMTE3LDE2IEBACiAgICAgICAgIGxuYW1lID0gbmV3RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsbmFtZSIsICJlbXBsb3llZSIsIGxuYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRFbGVtZW50c0J5VGFnTmFtZU5TIHdpdGggJyonICIgKworICAgICAgImFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRzQnlUYWdOYW1lTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lTlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CkBAIC0xMjcsNyArMTU5LDE2IEBACiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0RXF1YWxzKCJub2RlTmFtZXMiLCBleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBnZXRFbGVtZW50c0J5VGFnTmFtZU5TIHdpdGggJyonICIgKworICAgICAgICAgICAgImFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKQEAgLTE1MSw3ICsxOTIsMTUgQEAKICAgICAgICAgfQogICAgICAgICBhc3NlcnRFcXVhbHMoIm5vZGVOYW1lcyIsIGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG5lZ2F0aXZlIGNhc2Ugb2YgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3Lm5pc3QuZ292IjsKICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJub21hdGNoIjsKQEAgLTE2MSw3ICsyMTAsMTUgQEAKICAgICAgICAgZWxlbWVudExpc3QgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dfU2l6ZSIsIDAsIGVsZW1lbnRMaXN0LmdldExlbmd0aCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBuZWdhdGl2ZSBjYXNlIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRzQnlUYWdOYW1lTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lTlM2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CkBAIC0xNzAsNyArMjI3LDE1IEBACiAgICAgICAgICAgICAgICAgImFkZHJlc3MiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXRjaFNpemUiLCAwLCBlbGVtZW50TGlzdC5nZXRMZW5ndGgoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgY2FzZSBvZiBnZXRFbGVtZW50c0J5VGFnTmFtZU5TIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbGVtZW50c0J5VGFnTmFtZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50c0J5VGFnTmFtZU5TNygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtMTc5LDcgKzI0NCwxNiBAQAogICAgICAgICAgICAgICAgICJhZGRyZXNzIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgMywgZWxlbWVudExpc3QuZ2V0TGVuZ3RoKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgbWV0aG9kIHdpdGggJyonICIgKworICAgICAgICAgICAgImFzIHBhcmFtZXRlcnM7IHBvc2l0aXZlIGNhc2UuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGRvY0VsZW07CkBAIC0xODksNyArMjYzLDE2IEBACiAgICAgICAgIG5ld0xpc3QgPSBkb2NFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCAiKiIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImxpc3RTaXplIiwgMzYsIG5ld0xpc3QuZ2V0TGVuZ3RoKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgbWV0aG9kIHdpdGggJyonICIgKworICAgICAgICAgICAgImFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBuZXdMaXN0OwpAQCAtMjA3LDcgKzI5MCwxNiBAQAogICAgICAgICBsbmFtZSA9IG5ld0VsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibG5hbWUiLCAiZW1wbG95ZWUiLCBsbmFtZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyBtZXRob2Qgd2l0aCAnKicgYXMgdGhlIHNlY29uZCAiICsKKyAgICAgICAgICAgICJwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUzEwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBkb2NFbGVtOwpAQCAtMjQzLDcgKzMzNSwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGFzc2VydEVxdWFscygibm9kZU5hbWVzIiwgZXhwZWN0ZWRSZXN1bHQsIHJlc3VsdCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyBtZXRob2Qgd2l0aCAnKicgYXMgdGhlIGZpcnN0ICIgKworICAgICAgICAgICAgInBhcmFtZXRlci4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbGVtZW50c0J5VGFnTmFtZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50c0J5VGFnTmFtZU5TMTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGRvY0VsZW07CkBAIC0yNjksNyArMzcwLDE1IEBACiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0RXF1YWxzKCJub2RlTmFtZXMiLCBleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBuZWdhdGl2ZSBjYXNlIGZvciBnZXRFbGVtZW50c0J5VGFnTmFtZU5TIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbGVtZW50c0J5VGFnTmFtZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50c0J5VGFnTmFtZU5TMTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGRvY0VsZW07CkBAIC0yODAsNyArMzg5LDE1IEBACiAgICAgICAgICAgICAgICAgIm5vbWF0Y2giKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIiwgMCwgZWxlbWVudExpc3QuZ2V0TGVuZ3RoKCkpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIG5lZ2F0aXZlIGNhc2UgZm9yIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgbWV0aG9kLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEVsZW1lbnRzQnlUYWdOYW1lTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lTlMxMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZG9jRWxlbTsKQEAgLTI5MSw3ICs0MDgsMTUgQEAKICAgICAgICAgICAgICAgICAiYWRkcmVzcyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1hdGNoU2l6ZSIsIDAsIGVsZW1lbnRMaXN0LmdldExlbmd0aCgpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBjYXNlIGZvciBnZXRFbGVtZW50c0J5VGFnTmFtZU5TIG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRFbGVtZW50c0J5VGFnTmFtZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50c0J5VGFnTmFtZU5TMTQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGRvY0VsZW07CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9HZXROYW1lZEl0ZW1OUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vR2V0TmFtZWRJdGVtTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9HZXROYW1lZEl0ZW1OUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9HZXROYW1lZEl0ZW1OUy5qYXZhCmluZGV4IGQ0NDJhMTcuLmEwNmE1ZTAgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0dldE5hbWVkSXRlbU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vR2V0TmFtZWRJdGVtTlMuamF2YQpAQCAtMSwxNSArMSwxNyBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwogaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogVGhlICJnZXROYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksbG9jYWxOYW1lKSIgbWV0aG9kIGZvciBhIE5hbWVkTm9kZU1hcCBzaG91bGQKQEAgLTI1LDYgKzI3LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUY2OEQwOTUiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1GNjhEMDk1PC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5hbWVkTm9kZU1hcC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgR2V0TmFtZWRJdGVtTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC01NCw2ICs1NywxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWVkSXRlbSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZWRJdGVtTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CkBAIC03MCw3ICs4MiwxNSBAQAogICAgICAgICBhdHRyTmFtZSA9IGRvbWVzdGljQXR0ci5nZXROb2RlTmFtZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImF0dHJOYW1lIiwgImRtc3RjOmRvbWVzdGljIiwgYXR0ck5hbWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWVkSXRlbU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cudXNhLmNvbSI7CiAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiZG9tZXN0IjsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDRW50aXRpZXNSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENFbnRpdGllc1JlbW92ZU5hbWVkSXRlbU5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vSENFbnRpdGllc1JlbW92ZU5hbWVkSXRlbU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hDRW50aXRpZXNSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCmluZGV4IDVmYWUzODguLjFjZGQyMGYgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDRW50aXRpZXNSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hDRW50aXRpZXNSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCkBAIC0xNiw3ICsxNiw5IEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsgCiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKQEAgLTM1LDYgKzM3LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELXJlbW92ZU5hbWVkSXRlbU5TIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtcmVtb3ZlTmFtZWRJdGVtTlM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTmFtZWROb2RlTWFwLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBIQ0VudGl0aWVzUmVtb3ZlTmFtZWRJdGVtTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IQ0VudGl0aWVzU2V0TmFtZWRJdGVtTlMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hDRW50aXRpZXNTZXROYW1lZEl0ZW1OUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDRW50aXRpZXNTZXROYW1lZEl0ZW1OUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IQ0VudGl0aWVzU2V0TmFtZWRJdGVtTlMuamF2YQppbmRleCBhOWJjYWU4Li43ZTI5MTdhIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IQ0VudGl0aWVzU2V0TmFtZWRJdGVtTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IQ0VudGl0aWVzU2V0TmFtZWRJdGVtTlMuamF2YQpAQCAtMSw0ICsxLDYgQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOyAKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIApAQCAtMTgsNiArMjAsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtc2V0TmFtZWRJdGVtTlMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1zZXROYW1lZEl0ZW1OUzwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhOYW1lZE5vZGVNYXAuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEhDRW50aXRpZXNTZXROYW1lZEl0ZW1OUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDTmFtZWROb2RlTWFwSW52YWxpZFR5cGUuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hDTmFtZWROb2RlTWFwSW52YWxpZFR5cGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IQ05hbWVkTm9kZU1hcEludmFsaWRUeXBlLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hDTmFtZWROb2RlTWFwSW52YWxpZFR5cGUuamF2YQppbmRleCBlY2ZiNjFiLi42NzUxNDBjIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IQ05hbWVkTm9kZU1hcEludmFsaWRUeXBlLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENOYW1lZE5vZGVNYXBJbnZhbGlkVHlwZS5qYXZhCkBAIC0xNiwxNCArMTYsMTkgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIEF0dGVtcHQgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byBhbiBhdHRyaWJ1dGUgbGlzdCwgc2hvdWxkIHJhaXNlIGEKQEAgLTM3LDYgKzQyLDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMS9ET00tTGV2ZWwtMi1lcnJhdGEjY29yZS00Ij5odHRwOi8vd3d3LnczLm9yZy8yMDAwLzExL0RPTS1MZXZlbC0yLWVycmF0YSNjb3JlLTQ8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTmFtZWROb2RlTWFwLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBIQ05hbWVkTm9kZU1hcEludmFsaWRUeXBlIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNjYsNiArNzIsMTYgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgc2V0TmFtZWRJdGVtIG1ldGhvZCB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiSElFUkFSQ0hZX1JFUVVFU1RfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmFtZWRJdGVtIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lZE5vZGVNYXBJbnZhbGlkVHlwZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vSENOb2RlRG9jdW1lbnRGcmFnbWVudE5vcm1hbGl6ZS5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENOb2RlRG9jdW1lbnRGcmFnbWVudE5vcm1hbGl6ZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDTm9kZURvY3VtZW50RnJhZ21lbnROb3JtYWxpemUuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENOb2RlRG9jdW1lbnRGcmFnbWVudE5vcm1hbGl6ZS5qYXZhCmluZGV4IGU3ZGEwYmMuLjg5YmU4YzYgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDTm9kZURvY3VtZW50RnJhZ21lbnROb3JtYWxpemUuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IQ05vZGVEb2N1bWVudEZyYWdtZW50Tm9ybWFsaXplLmphdmEKQEAgLTEsMTIgKzEsMTcgQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAoraW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CisKIC8qKgogICogQ3JlYXRlIGEgZG9jdW1lbnQgZnJhZ21lbnQgd2l0aCB0d28gYWRqYWNlbnQgdGV4dCBub2Rlcywgbm9ybWFsaXplIGFuZCBzZWUgaWYKICAqIHRoZSB0ZXh0IG5vZGVzIHdlcmUgY29tYmluZWQuCkBAIC0xNyw2ICsyMiw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1CNjNFRDFBMyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUI2M0VEMUEzPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5vZGUuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEhDTm9kZURvY3VtZW50RnJhZ21lbnROb3JtYWxpemUgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC00Niw2ICs1MiwyMSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eSBvZiBnZXROb2RlVmFsdWUgbWV0aG9kLCAiICsKKyAgICAgICAgICAgICJhbmQgdGhhdCBnZXROZXh0U2libGluZyBtZXRob2QgcmV0dXJucyBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5vZGVWYWx1ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICksCisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmV4dFNpYmxpbmciLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlRG9jdW1lbnRGcmFnbWVudE5vcm1hbGl6ZTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudEZyYWdtZW50IGRvY0ZyYWdtZW50OwpAQCAtNjYsNyArODcsMTUgQEAKICAgICAgICAgcmV0dmFsID0gdHh0Tm9kZS5nZXROZXh0U2libGluZygpOwogICAgICAgICBhc3NlcnROdWxsKCJzaW5nbGVDaGlsZCIsIHJldHZhbCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRGaXJzdENoaWxkIG1ldGhvZCByZXR1cm5zIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0Rmlyc3RDaGlsZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlRG9jdW1lbnRGcmFnbWVudE5vcm1hbGl6ZTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudEZyYWdtZW50IGRvY0ZyYWdtZW50OwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vSENOb3RhdGlvbnNSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENOb3RhdGlvbnNSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDTm90YXRpb25zUmVtb3ZlTmFtZWRJdGVtTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENOb3RhdGlvbnNSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCmluZGV4IDM2NzNjNzMuLjQzYzFiZGMgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDTm90YXRpb25zUmVtb3ZlTmFtZWRJdGVtTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IQ05vdGF0aW9uc1JlbW92ZU5hbWVkSXRlbU5TLmphdmEKQEAgLTE2LDE0ICsxNiwxOSBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBBbiBhdHRlbXB0IHRvIGFkZCByZW1vdmUgYW4gbm90YXRpb24gdXNpbmcgcmVtb3ZlTmFtZWRJdGVtTlMgc2hvdWxkIHJlc3VsdCBpbgpAQCAtMzUsNiArNDAsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtcmVtb3ZlTmFtZWRJdGVtTlMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1yZW1vdmVOYW1lZEl0ZW1OUzwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhOYW1lZE5vZGVNYXAuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEhDTm90YXRpb25zUmVtb3ZlTmFtZWRJdGVtTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC02NCw2ICs3MCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCByZW1vdmVOYW1lZEl0ZW1OUyBtZXRob2QgdGhyb3dzIERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRJdGVtTlMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOYW1lZE5vZGVNYXAgbm90YXRpb25zOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vSENOb3RhdGlvbnNTZXROYW1lZEl0ZW1OUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENOb3RhdGlvbnNTZXROYW1lZEl0ZW1OUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDTm90YXRpb25zU2V0TmFtZWRJdGVtTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSENOb3RhdGlvbnNTZXROYW1lZEl0ZW1OUy5qYXZhCmluZGV4IGM5MjhiN2YuLjZjNzJkOWQgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hDTm90YXRpb25zU2V0TmFtZWRJdGVtTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IQ05vdGF0aW9uc1NldE5hbWVkSXRlbU5TLmphdmEKQEAgLTE2LDE1ICsxNiwyMCBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIEFuIGF0dGVtcHQgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIG5hbWVkIG5vZGUgbWFwIHJldHVybmVkIGJ5IG5vdGF0aW9ucwpAQCAtMzYsNiArNDEsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtc2V0TmFtZWRJdGVtTlMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1zZXROYW1lZEl0ZW1OUzwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhOYW1lZE5vZGVNYXAuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEhDTm90YXRpb25zU2V0TmFtZWRJdGVtTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC02NSw2ICs3MSwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBzZXROYW1lZEl0ZW1OUyB0aHJvd3MgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RhdGlvbnNTZXROYW1lZEl0ZW1OUygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5hbWVkTm9kZU1hcCBub3RhdGlvbnM7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGUuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZS5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGUuamF2YQppbmRleCBhYmRmYWVjLi4xZjUxYzcwIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGUuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGUuamF2YQpAQCAtMSwxMSArMSwxNiBAQAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQogLyoqCiAgKiBUaGUgImhhc0F0dHJpYnV0ZSgpIiBtZXRob2QgZm9yIGFuIEVsZW1lbnQgc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50CiAgKiBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuIFJldHJpZXZlIHRoZSBmaXJzdCAiYWRkcmVzcyIgZWxlbWVudApAQCAtMTcsNiArMjIsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxIYXNBdHRyIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxIYXNBdHRyPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKEVsZW1lbnQuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEhhc0F0dHJpYnV0ZSBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTQ2LDYgKzUyLDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0F0dHJpYnV0ZSBtZXRob2QgcmV0dXJucyBmYWxzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0F0dHJpYnV0ZTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKQEAgLTcwLDcgKzg1LDE1IEBACiAvLyAgICAgICAgc3RhdGUgPSB0ZXN0Tm9kZS5oYXNBdHRyaWJ1dGUoInN0cmVldCIpOwogLy8gICAgICAgIGFzc2VydFRydWUoInRocm93X1RydWUiLCBzdGF0ZSk7CiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGhhc0F0dHJpYnV0ZSBtZXRob2QgcmV0dXJucyBmYWxzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0F0dHJpYnV0ZTMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKQEAgLTgyLDcgKzEwNSwxNSBAQAogICAgICAgICBzdGF0ZSA9IHRlc3ROb2RlLmhhc0F0dHJpYnV0ZSgibm9tYXRjaCIpOwogICAgICAgICBhc3NlcnRGYWxzZSgidGhyb3dfRmFsc2UiLCBzdGF0ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBoYXNBdHRyaWJ1dGUgbWV0aG9kIHJldHVybnMgdHJ1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0F0dHJpYnV0ZTQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGVOUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZU5TLmphdmEKaW5kZXggZWZhMjE0OC4uNjE0ODE4YiAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vSGFzQXR0cmlidXRlTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGVOUy5qYXZhCkBAIC0xOSwxNCArMTksMTkgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KIC8qKgogICogCiAgKiBUaGUgImhhc0F0dHJpYnV0ZU5TKCkiIG1ldGhvZCBmb3IgYW4gRWxlbWVudCBzaG91bGQgcmV0dXJuIGZhbHNlIGlmIHRoZQpAQCAtNDEsNiArNDYsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRWxIYXNBdHRyTlMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1FbEhhc0F0dHJOUzwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhFbGVtZW50LmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBIYXNBdHRyaWJ1dGVOUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTcwLDYgKzc2LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0F0dHJpYnV0ZU5TMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gIm5vbWF0Y2giOwogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cudXNhLmNvbSI7CkBAIC04Myw3ICs5OCwxNSBAQAogICAgICAgICBzdGF0ZSA9IHRlc3ROb2RlLmhhc0F0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoInRocm93X0ZhbHNlIiwgc3RhdGUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlTlMyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiZG9tZXN0aWMiOwogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cubm9tYXRjaC5jb20iOwpAQCAtOTcsNyArMTIwLDE1IEBACiAgICAgICAgIHN0YXRlID0gdGVzdE5vZGUuaGFzQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwogICAgICAgICBhc3NlcnRGYWxzZSgidGhyb3dfRmFsc2UiLCBzdGF0ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBdHRyaWJ1dGVOUzMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJibGFuayI7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5uaXN0LmdvdiI7CkBAIC0xMjgsNyArMTU5LDE1IEBACiAvLyAgICAgICAgc3RhdGUgPSB0ZXN0Tm9kZS5oYXNBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7CiAvLyAgICAgICAgYXNzZXJ0VHJ1ZSgiaGFzQXR0cmlidXRlIiwgc3RhdGUpOwogLy8gICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBdHRyaWJ1dGVOUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJkb21lc3RpYyI7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy51c2EuY29tIjsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZXMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGVzLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0hhc0F0dHJpYnV0ZXMuamF2YQppbmRleCBjNzc4NzllLi5hZjBmYTAzIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9IYXNBdHRyaWJ1dGVzLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSGFzQXR0cmlidXRlcy5qYXZhCkBAIC0xOSwxNCArMTksMTkgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KIC8qKgogICogVGhlICJoYXNBdHRyaWJ1dGVzKCkiIG1ldGhvZCBmb3IgYSBub2RlIHNob3VsZCByZXR1cm4gZmFsc2UgaWYgdGhlIG5vZGUgZG9lcwogICogbm90IGhhdmUgYW4gYXR0cmlidXRlLiBSZXRyaWV2ZSB0aGUgZmlyc3QgIm5hbWUiIG5vZGUgYW5kIGludm9rZSB0aGUKQEAgLTM4LDYgKzQzLDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELU5vZGVIYXNBdHRycyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELU5vZGVIYXNBdHRyczwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhOb2RlLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBIYXNBdHRyaWJ1dGVzIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNjcsNiArNzMsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaGFzQXR0cmlidXRlcyBtZXRob2QgcmV0dXJucyBmYWxzZSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0F0dHJpYnV0ZXMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgYWRkckxpc3Q7CkBAIC03OCw3ICs5MywxNSBAQAogICAgICAgICBzdGF0ZSA9IGFkZHJOb2RlLmhhc0F0dHJpYnV0ZXMoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoInRocm93X0ZhbHNlIiwgc3RhdGUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaGFzQXR0cmlidXRlcyBtZXRob2QgcmV0dXJucyB0cnVlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlczIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBhZGRyTGlzdDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0ltcG9ydE5vZGUuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0ltcG9ydE5vZGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9JbXBvcnROb2RlLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0ltcG9ydE5vZGUuamF2YQppbmRleCAxOTEzMGFkLi40NWNlNmQ2IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9JbXBvcnROb2RlLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSW1wb3J0Tm9kZS5qYXZhCkBAIC0xOSwyOSArMTksMzEgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQoraW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwogaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eTsKIGltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247CiBpbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIFRoZSAiaW1wb3J0Tm9kZShpbXBvcnRlZE5vZGUsZGVlcCkiIG1ldGhvZCBmb3IgYSBEb2N1bWVudCBzaG91bGQgaW1wb3J0IHRoZQpAQCAtNjIsNiArNjQsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjQ29yZS1Eb2N1bWVudC1pbXBvcnROb2RlIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjQ29yZS1Eb2N1bWVudC1pbXBvcnROb2RlPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50LmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBJbXBvcnROb2RlIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtOTEsNyArOTQsMTYgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb2RlMSgpIHRocm93cyBUaHJvd2FibGUgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0SW1wb3J0Tm9kZTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudCBhTmV3RG9jOwogICAgICAgICBBdHRyIG5ld0F0dHI7CkBAIC0xMzQsNyArMTQ2LDE1IEBACiAgICAgICAgIGNoaWxkVmFsdWUgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZFZhbHVlIiwgImltcG9ydGVkVGV4dCIsIGNoaWxkVmFsdWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpbXBvcnROb2RlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3MsIGJvb2xlYW4uY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb2RlMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IGFOZXdEb2M7CkBAIC0xNTcsNyArMTc3LDE1IEBACiAgICAgICAgIHZhbHVlID0gYU5vZGUuZ2V0Tm9kZVZhbHVlKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibm9kZVZhbHVlIiwgInRoaXMgaXMgQ0RBVEFTZWN0aW9uIGRhdGEiLCB2YWx1ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgYU5ld0RvYzsKQEAgLTE4MCw3ICsyMDgsMTUgQEAKICAgICAgICAgdmFsdWUgPSBhTm9kZS5nZXROb2RlVmFsdWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJub2RlVmFsdWUiLCAidGhpcyBpcyBhIGNvbW1lbnQiLCB2YWx1ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGU0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgYU5ld0RvYzsKQEAgLTIwMiw3ICsyMzgsMTUgQEAKICAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImRlc2NlbmRhbnQxIiwgImRlc2NlbmRhbnQxIiwgY2hpbGRWYWx1ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGU1KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgYU5ld0RvYzsKQEAgLTIzMCw3ICsyNzQsMTUgQEAKICAgICAgICAgbmFtZSA9IGFOb2RlLmdldE5vZGVOYW1lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibm9kZU5hbWUiLCAiZW1wOmFkZHJlc3MiLCBuYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9kZTYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudCBhTmV3RG9jOwpAQCAtMjgwLDcgKzMzMiwxNSBAQAogLy8gICAgICAgIGxuYW1lID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoImxuYW1lIiwgImRlZmF1bHRBdHRyIiwgbG5hbWUpOwogLy8gICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGU4KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgYU5ld0RvYzsKQEAgLTMzOSw3ICszOTksMTUgQEAKIC8vICAgICAgICBub3RhdGlvbk5hbWUgPSBlbnRpdHkxLmdldE5vdGF0aW9uTmFtZSgpOwogLy8gICAgICAgIGFzc2VydEVxdWFscygibm90YXRpb25OYW1lIiwgIm5vdGF0aW9uMiIsIG5vdGF0aW9uTmFtZSk7CiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9kZTEwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgYU5ld0RvYzsKQEAgLTQ0OSw3ICs1MTcsMTUgQEAKIC8vICAgICAgICBzeXN0ZW0gPSBhTm9kZS5nZXRTeXN0ZW1JZCgpOwogLy8gICAgICAgIGFzc2VydE51bGwoIm5vdGF0aW9uU3lzdGVtSWQiLCBzeXN0ZW0pOwogLy8gICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUxNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IGFOZXdEb2M7CkBAIC00NzYsNyArNTUyLDE1IEBACiAgICAgICAgIGRhdGEgPSBhTm9kZS5nZXREYXRhKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygicGlEYXRhIiwgImRhdGExIiwgZGF0YSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUxNSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IGFOZXdEb2M7CkBAIC00OTksNyArNTgzLDE2IEBACiAgICAgICAgIHZhbHVlID0gYU5vZGUuZ2V0Tm9kZVZhbHVlKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibm9kZVZhbHVlIiwgInRoaXMgaXMgdGV4dCBkYXRhIiwgdmFsdWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaW1wb3J0Tm9kZSBtZXRob2QgdGhyb3dzIERPTUV4Y2VwdGlvbiAiICsKKyAgICAgICAgICAgICJ3aXRoIE5PVF9TVVBQT1JURURfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaW1wb3J0Tm9kZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9kZTE2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnQgYW5vdGhlckRvYzsKQEAgLTUxOSw3ICs2MTIsMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X05PVF9TVVBQT1JURURfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGltcG9ydE5vZGUgbWV0aG9kIHRocm93cyBET01FeGNlcHRpb24gIiArCisgICAgICAgICAgICAid2l0aCBOT1RfU1VQUE9SVEVEX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImltcG9ydE5vZGUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzcywgYm9vbGVhbi5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vZGUxNygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IGFub3RoZXJEb2M7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9JbnRlcm5hbFN1YnNldC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSW50ZXJuYWxTdWJzZXQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9JbnRlcm5hbFN1YnNldC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9JbnRlcm5hbFN1YnNldC5qYXZhCmluZGV4IDYxYTY1MmMuLmQxNWNiMzcgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0ludGVybmFsU3Vic2V0LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSW50ZXJuYWxTdWJzZXQuamF2YQpAQCAtMjAsMTMgKzIwLDE4IEBACiAKICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCiAvKioKICAqICAgICBUaGUgImdldEludGVybmFsU3Vic2V0KCkiIG1ldGhvZCByZXR1cm5zIAogICogICAgdGhlIGludGVybmFsIHN1YnNldCBhcyBhIHN0cmluZyBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCkBAIC0zOSw2ICs0NCw3IEBACiAqIEBhdXRob3IgTWFyeSBCcmFkeQogKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Db3JlLURvY1R5cGUtaW50ZXJuYWxTdWJzZXQiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Db3JlLURvY1R5cGUtaW50ZXJuYWxTdWJzZXQ8L2E+CiAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudFR5cGUuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIEludGVybmFsU3Vic2V0IGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNjYsNiArNzIsMTYgQEAKICAgICAqIFJ1bnMgdGhlIHRlc3QgY2FzZS4KICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgdGhhdCBnZXRJbnRlcm5hbFN1YnNldCBtZXRob2QgcmV0dXJucyAiICsKKyAgICAgICAgICAgICJ0aGUgaW50ZXJuYWwgc3Vic2V0IGFzIGEgc3RyaW5nLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldEludGVybmFsU3Vic2V0IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZXJuYWxTdWJzZXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgIERvY3VtZW50VHlwZSBkb2NUeXBlOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vSXNTdXBwb3J0ZWQuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0lzU3VwcG9ydGVkLmphdmEKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vSXNTdXBwb3J0ZWQuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vSXNTdXBwb3J0ZWQuamF2YQppbmRleCBhZGQ2ZjI5Li5hOGZiYTUyIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Jc1N1cHBvcnRlZC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0lzU3VwcG9ydGVkLmphdmEKQEAgLTEsMTMgKzEsMTggQEAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CisKIC8qKgogICogVGhlICJmZWF0dXJlIiBwYXJhbWV0ZXIgaW4gdGhlIGlzU3VwcG9ydGVkKGZlYXR1cmUsdmVyc2lvbikiIG1ldGhvZCBpcyB0aGUKICAqIG5hbWUgb2YgdGhlIGZlYXR1cmUgYW5kIHRoZSB2ZXJzaW9uIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0bwpAQCAtMjUsNiArMzAsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjTGV2ZWwtMi1Db3JlLU5vZGUtc3VwcG9ydHMiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNMZXZlbC0yLUNvcmUtTm9kZS1zdXBwb3J0czwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgSXNTdXBwb3J0ZWQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC01NCw2ICs2MCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpc1N1cHBvcnRlZCBtZXRob2QgcmV0dXJucyBmYWxzZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGUgcm9vdE5vZGU7CkBAIC02Myw3ICs3OCwxNSBAQAogICAgICAgICBzdGF0ZSA9IHJvb3ROb2RlLmlzU3VwcG9ydGVkKCJYWFgiLCAiMS4wIik7CiAgICAgICAgIGFzc2VydEZhbHNlKCJ0aHJvd19GYWxzZSIsIHN0YXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzU3VwcG9ydGVkIG1ldGhvZCByZXR1cm5zIGZhbHNlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWQyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZSByb290Tm9kZTsKQEAgLTczLDcgKzk2LDE1IEBACiAgICAgICAgIHN0YXRlID0gcm9vdE5vZGUuaXNTdXBwb3J0ZWQoIlhNTCIsICI5LjAiKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoInRocm93X0ZhbHNlIiwgc3RhdGUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaXNTdXBwb3J0ZWQgbWV0aG9kIHJldHVybnMgdHJ1ZSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGUgcm9vdE5vZGU7CkBAIC04Myw3ICsxMTQsMTUgQEAKICAgICAgICAgc3RhdGUgPSByb290Tm9kZS5pc1N1cHBvcnRlZCgieG1sIiwgIjEuMCIpOwogICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19UcnVlIiwgc3RhdGUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaXNTdXBwb3J0ZWQgbWV0aG9kIHJldHVybnMgdHJ1ZSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkNSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGUgcm9vdE5vZGU7CkBAIC05Myw3ICsxMzIsMTUgQEAKICAgICAgICAgc3RhdGUgPSByb290Tm9kZS5pc1N1cHBvcnRlZCgiY29yZSIsICIyLjAiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfVHJ1ZSIsIHN0YXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzU3VwcG9ydGVkIG1ldGhvZCByZXR1cm5zIHRydWUgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwb3J0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZDYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlIHJvb3ROb2RlOwpAQCAtMTAzLDcgKzE1MCwxNSBAQAogICAgICAgICBzdGF0ZSA9IHJvb3ROb2RlLmlzU3VwcG9ydGVkKCJ4bWwiLCAiMi4wIik7CiAgICAgICAgIGFzc2VydFRydWUoInRocm93X1RydWUiLCBzdGF0ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpc1N1cHBvcnRlZCBtZXRob2QgcmV0dXJucyB0cnVlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWQ3KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZSByb290Tm9kZTsKQEAgLTExMyw3ICsxNjgsMTUgQEAKICAgICAgICAgc3RhdGUgPSByb290Tm9kZS5pc1N1cHBvcnRlZCgiWE1MIiwgIiIpOwogICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19UcnVlIiwgc3RhdGUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaXNTdXBwb3J0ZWQgbWV0aG9kIHJldHVybnMgdHJ1ZSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkOSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGUgcm9vdE5vZGU7CkBAIC0xMjMsNyArMTg2LDE1IEBACiAgICAgICAgIHN0YXRlID0gcm9vdE5vZGUuaXNTdXBwb3J0ZWQoIlhNTCIsICIxLjAiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfVHJ1ZSIsIHN0YXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzU3VwcG9ydGVkIG1ldGhvZCByZXR1cm5zIHRydWUuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICAgICAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZDEwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZSByb290Tm9kZTsKQEAgLTEzMyw3ICsyMDQsMTUgQEAKICAgICAgICAgc3RhdGUgPSByb290Tm9kZS5pc1N1cHBvcnRlZCgiQ09SRSIsICIyLjAiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfVHJ1ZSIsIHN0YXRlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICAgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzU3VwcG9ydGVkIG1ldGhvZCByZXR1cm5zIHRydWUuIiwKKyAgICAgICAgICAgIHRhcmdldHMgPSB7CisgICAgICAgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICAgICAgICkKKyAgICB9KSAgICAgICAgICAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkMTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlIHJvb3ROb2RlOwpAQCAtMTQzLDcgKzIyMiwxNiBAQAogICAgICAgICBzdGF0ZSA9IHJvb3ROb2RlLmlzU3VwcG9ydGVkKCJYTUwiLCAiMi4wIik7CiAgICAgICAgIGFzc2VydFRydWUoInRocm93X1RydWUiLCBzdGF0ZSk7CiAgICAgfQotCisgICAgICAgICAgICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgICB9KSAgICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWQxMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBMaXN0PFN0cmluZz4gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICAgZmVhdHVyZXMuYWRkKCJDb3JlIik7CkBAIC0xNzksNyArMjY3LDE2IEBACiAgICAgICAgICAgICBzdGF0ZSA9IHJvb3ROb2RlLmlzU3VwcG9ydGVkKGZlYXR1cmVFbGVtZW50LCAiMi4wIik7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzU3VwcG9ydGVkIG1ldGhvZCByZXR1cm5zIGNvcnJlY3QgdmFsdWUgIiArCisgICAgICAgICAgICAiaWYgaXQgaGFzIGVtcHR5IHN0cmluZyBhcyBhIHZlcnNpb24gcGFyYW1ldGVyLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWQxMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGUgcm9vdE5vZGU7CkBAIC0xODksNyArMjg2LDE2IEBACiAgICAgICAgIHN0YXRlID0gcm9vdE5vZGUuaXNTdXBwb3J0ZWQoIkNvcmUiLCAiIik7CiAgICAgICAgIGFzc2VydFRydWUoIkNvcmUiLCBzdGF0ZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpc1N1cHBvcnRlZCBtZXRob2QgcmV0dXJucyBjb3JyZWN0IHZhbHVlICIgKworICAgICAgICAgICAgImlmIGl0IGhhcyBudWxsIGFzIGEgdmVyc2lvbiBwYXJhbWV0ZXIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwb3J0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZDE0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZSByb290Tm9kZTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0xvY2FsTmFtZS5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTG9jYWxOYW1lLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTG9jYWxOYW1lLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0xvY2FsTmFtZS5qYXZhCmluZGV4IDlmNmZhMTQuLjlkMDAxYzAgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL0xvY2FsTmFtZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL0xvY2FsTmFtZS5qYXZhCkBAIC0xLDEzICsxLDE4IEBACi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKKworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KIC8qKgogICogVGhlICJnZXRMb2NhbE5hbWUoKSIgbWV0aG9kIGZvciBhIE5vZGUgcmV0dXJucyB0aGUgbG9jYWwgcGFydCBvZiB0aGUKICAqIHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgbm9kZSwgYW5kIGZvciBub2RlcyBvZiBhbnkgdHlwZSBvdGhlciB0aGFuCkBAIC0yMyw2ICsyOCw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlTlNMb2NhbE4iPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlTlNMb2NhbE48L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTm9kZS5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgTG9jYWxOYW1lIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNTIsNiArNTgsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TG9jYWxOYW1lIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldExvY2FsTmFtZTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKQEAgLTY2LDcgKzgxLDE1IEBACiAgICAgICAgIGxvY2FsTmFtZSA9IGFkZHJBdHRyLmdldExvY2FsTmFtZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImxvY2FsTmFtZSIsICJkb21lc3RpYyIsIGxvY2FsTmFtZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRMb2NhbE5hbWUgbWV0aG9kIHJldHVybnMgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYWxOYW1lMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGUgY3JlYXRlZE5vZGU7CkBAIC03Niw3ICs5OSwxNSBAQAogICAgICAgICBsb2NhbE5hbWUgPSBjcmVhdGVkTm9kZS5nZXRMb2NhbE5hbWUoKTsKICAgICAgICAgYXNzZXJ0TnVsbCgibG9jYWxOYW1lTnVsbCIsIGxvY2FsTmFtZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRMb2NhbE5hbWUgbWV0aG9kIHJldHVybnMgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYWxOYW1lMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtOTAsNyArMTIxLDE1IEBACiAgICAgICAgIGxvY2FsTmFtZSA9IHRleHROb2RlLmdldExvY2FsTmFtZSgpOwogICAgICAgICBhc3NlcnROdWxsKCJ0ZXh0Tm9kZUxvY2FsTmFtZSIsIGxvY2FsTmFtZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYWxOYW1lNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwR2V0TmFtZWRJdGVtTlMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05hbWVkTm9kZU1hcEdldE5hbWVkSXRlbU5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwR2V0TmFtZWRJdGVtTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwR2V0TmFtZWRJdGVtTlMuamF2YQppbmRleCAyZjE3OWJhLi5mNDMzOGUzIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXBHZXROYW1lZEl0ZW1OUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05hbWVkTm9kZU1hcEdldE5hbWVkSXRlbU5TLmphdmEKQEAgLTE5LDE5ICsxOSwyMSBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7CiBpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIFVzaW5nIHRoZSBtZXRob2QgZ2V0TmFtZWRJdGVtTlMsIHJldHJlaXZlIHRoZSBlbnRpdHkgImVudDEiIGFuZCBub3RhdGlvbgpAQCAtNDksNiArNTEsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vbGlzdHMudzMub3JnL0FyY2hpdmVzL01lbWJlci93M2MtZG9tLWlnLzIwMDNOb3YvMDAxNi5odG1sIj5odHRwOi8vbGlzdHMudzMub3JnL0FyY2hpdmVzL01lbWJlci93M2MtZG9tLWlnLzIwMDNOb3YvMDAxNi5odG1sPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5hbWVkTm9kZU1hcC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgTmFtZWROb2RlTWFwR2V0TmFtZWRJdGVtTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC0xMDAsNyArMTAzLDE1IEBACiAvLyAgICAgICAgbm90YXRpb24gPSAoTm90YXRpb24pIG5vdGF0aW9ucy5nZXROYW1lZEl0ZW1OUyhudWxsTlMsICJub3RhdGlvbjEiKTsKIC8vICAgICAgICBhc3NlcnROb3ROdWxsKCJub3RhdGlvbk51bGwiLCBub3RhdGlvbik7CiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWVkSXRlbU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwpAQCAtMTE4LDcgKzEyOSwxNSBAQAogICAgICAgICBhdHRyTmFtZSA9IGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWVkbm9kZW1hcGdldG5hbWVkaXRlbW5zMDIiLCAiZW1wOmRvbWVzdGljIiwgYXR0ck5hbWUpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZWRJdGVtTlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXM7CkBAIC0xNDAsNyArMTU5LDE1IEBACiAgICAgICAgIGF0dHJOYW1lID0gYXR0cmlidXRlLmdldE5vZGVOYW1lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibmFtZWRub2RlbWFwZ2V0bmFtZWRpdGVtbnMwMyIsICJMMjphdHQiLCBhdHRyTmFtZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lZEl0ZW1OUzQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczsKQEAgLTE2MCw3ICsxODcsMTUgQEAKICAgICAgICAgYXR0ck5hbWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lZG5vZGVtYXBnZXRuYW1lZGl0ZW1uczA0IiwgInN0cmVldCIsIGF0dHJOYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWVkSXRlbU5TNSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwUmVtb3ZlTmFtZWRJdGVtTlMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05hbWVkTm9kZU1hcFJlbW92ZU5hbWVkSXRlbU5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwUmVtb3ZlTmFtZWRJdGVtTlMuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwUmVtb3ZlTmFtZWRJdGVtTlMuamF2YQppbmRleCAzNzdkYjcxLi5hZjdmMDYxIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXBSZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05hbWVkTm9kZU1hcFJlbW92ZU5hbWVkSXRlbU5TLmphdmEKQEAgLTE5LDE4ICsxOSwyMiBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgbWV0aG9kIHJlbW92ZU5hbWVkSXRlbU5TIHJlbW92ZXMgYSBub2RlIHNwZWNpZmllZCBieSBsb2NhbCBuYW1lIGFuZApAQCAtNDQsNiArNDgsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRDU4QjE5MyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUQ1OEIxOTM8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTmFtZWROb2RlTWFwLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lZE5vZGVNYXBSZW1vdmVOYW1lZEl0ZW1OUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTczLDYgKzc4LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlTmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkSXRlbU5TMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwpAQCAtMTEzLDcgKzEyNywxNSBAQAogLy8gICAgICAgIGFzc2VydEVxdWFscygibmFtZWRub2RlbWFwcmVtb3ZlbmFtZWRpdGVtbnMwMl9hdHRyVmFsdWUiLCAiZGVmYXVsdFZhbCIsCiAvLyAgICAgICAgICAgICAgICBhdHRyVmFsdWUpOwogLy8gICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZEl0ZW1OUzMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczsKQEAgLTEzOSw4ICsxNjEsMTYgQEAKICAgICAgICAgbm9kZU5hbWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lZG5vZGVtYXByZW1vdmVuYW1lZGl0ZW1uczAyIiwgIkwyOmF0dCIsIG5vZGVOYW1lKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRJdGVtTlM0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVtb3ZlTmFtZWRJdGVtTlM0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXM7CiAgICAgICAgIE5vZGUgZWxlbWVudDsKQEAgLTIwNyw3ICsyMzcsMTYgQEAKIC8vICAgICAgICAgICAgfQogLy8gICAgICAgIH0KIC8vICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgcmVtb3ZlTmFtZWRJdGVtTlMgbWV0aG9kIHRocm93cyBET01FeGNlcHRpb24gIiArCisgICAgICAgICAgICAid2l0aCBOT1RfRk9VTkRfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlTmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkSXRlbU5TNigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwpAQCAtMjMwLDcgKzI2OSwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTk9UX0ZPVU5EX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCByZW1vdmVOYW1lZEl0ZW1OUyBtZXRob2QgdGhyb3dzIERPTUV4Y2VwdGlvbiAiICsKKyAgICAgICAgICAgICJ3aXRoIE5PVF9GT1VORF9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRJdGVtTlM3KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXM7CkBAIC0yNTMsNyArMzAxLDE2IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OT1RfRk9VTkRfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHJlbW92ZU5hbWVkSXRlbU5TIG1ldGhvZCB0aHJvd3MgRE9NRXhjZXB0aW9uICIgKworICAgICAgICAgICAgIndpdGggTk9UX0ZPVU5EX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInJlbW92ZU5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZEl0ZW1OUzgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczsKQEAgLTI3Nyw3ICszMzQsMTUgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X05PVF9GT1VORF9FUlIiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IERPTUV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRJdGVtTlM5KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXM7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXBTZXROYW1lZEl0ZW1OUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwU2V0TmFtZWRJdGVtTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXBTZXROYW1lZEl0ZW1OUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXBTZXROYW1lZEl0ZW1OUy5qYXZhCmluZGV4IDVmOWE2NzYuLjUwYzcwMjIgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05hbWVkTm9kZU1hcFNldE5hbWVkSXRlbU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTmFtZWROb2RlTWFwU2V0TmFtZWRJdGVtTlMuamF2YQpAQCAtMTksMjEgKzE5LDI0IEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7CiBpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob3RhdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogVGhlIG1ldGhvZCBzZXROYW1lZEl0ZW1OUyBhZGRzIGEgbm9kZSB1c2luZyBpdHMgbmFtZXNwYWNlVVJJIGFuZCBsb2NhbE5hbWUuCkBAIC01MCw2ICs1Myw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1nZXROYW1lZEl0ZW1OUyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELWdldE5hbWVkSXRlbU5TPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5hbWVkTm9kZU1hcC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgTmFtZWROb2RlTWFwU2V0TmFtZWRJdGVtTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC04Miw2ICs4NiwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROYW1lZEl0ZW1OUzEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczsKQEAgLTEwMyw3ICsxMTYsMTUgQEAKICAgICAgICAgYXR0ck5hbWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lZG5vZGVtYXBzZXRuYW1lZGl0ZW1uczAxIiwgInN0cmVldHMiLCBhdHRyTmFtZSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROYW1lZEl0ZW1OUzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczsKQEAgLTEyMyw3ICsxNDQsMTYgQEAKICAgICAgICAgYXR0ck5hbWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lZG5vZGVtYXBzZXRuYW1lZGl0ZW1uczAyIiwgIkwxOmF0dCIsIGF0dHJOYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHNldE5hbWVkSXRlbU5TIHRocm93cyBET01FeGNlcHRpb24gd2l0aCAiICsKKyAgICAgICAgICAgICJXUk9OR19ET0NVTUVOVF9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZWRJdGVtTlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAKICAgICAgICAgRG9jdW1lbnQgZG9jOwpAQCAtMTU5LDExICsxODksMjAgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X1dST05HX0RPQ1VNRU5UX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBzZXROYW1lZEl0ZW1OUyB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiV1JPTkdfRE9DVU1FTlRfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldE5hbWVkSXRlbU5TNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERPTUltcGxlbWVudGF0aW9uIGRvbUltcGw7Ci0gICAgICAgIERvY3VtZW50IGRvY0FsdDsKKyAgICAgICAgRG9jdW1lbnQgZG9jQWx0OyAKICAgICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBudWxsOwogCiAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwpAQCAtMjMwLDcgKzI2OSwxNiBAQAogLy8gICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlJfbm90YXRpb25zIiwgc3VjY2Vzcyk7CiAvLyAgICAgICAgfQogLy8gICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBzZXROYW1lZEl0ZW1OUyB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiSU5VU0VfQVRUUklCVVRFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROYW1lZEl0ZW1OUzYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczsKQEAgLTI1Nyw3ICszMDUsMTYgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoIm5hbWVkbm9kZW1hcHNldG5hbWVkaXRlbW5zMDYiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgc2V0TmFtZWRJdGVtTlMgdGhyb3dzIERPTUV4Y2VwdGlvbiB3aXRoICIgKworICAgICAgICAgICAgIklOVVNFX0FUVFJJQlVURV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZWRJdGVtTlM3KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXM7CkBAIC0yODQsNyArMzQxLDE2IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJuYW1lZG5vZGVtYXBzZXRuYW1lZGl0ZW1uczA3Iiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IHNldE5hbWVkSXRlbU5TIHRocm93cyBET01FeGNlcHRpb24gd2l0aCAiICsKKyAgICAgICAgICAgICJJTlVTRV9BVFRSSUJVVEVfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0TmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uTm9kZS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldE5hbWVkSXRlbU5TOCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTmFtZXNwYWNlVVJJLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9OYW1lc3BhY2VVUkkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9OYW1lc3BhY2VVUkkuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTmFtZXNwYWNlVVJJLmphdmEKaW5kZXggMmMwMGQ2Mi4uNzg4ZWY4YiAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTmFtZXNwYWNlVVJJLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTmFtZXNwYWNlVVJJLmphdmEKQEAgLTE5LDE1ICsxOSwyMCBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogVGhlICJnZXROYW1lc3BhY2VVUkkoKSIgbWV0aG9kIGZvciBhbiBBdHRyaWJ1dGUgcmV0dXJucyB0aGUgbmFtZXNwYWNlIFVSSSBvZgpAQCAtNDQsNiArNDksNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjM4Ij5odHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjM4PC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKEF0dHIuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIE5hbWVzcGFjZVVSSSBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTg4LDcgKzk0LDE1IEBACiAvLyAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGFkZHJBdHRyLmdldE5hbWVzcGFjZVVSSSgpOwogLy8gICAgICAgIGFzc2VydEVxdWFscygibmFtZXNwYWNlVVJJIiwgImh0dHA6Ly93d3cubmlzdC5nb3YiLCBhdHRyTmFtZXNwYWNlVVJJKTsKIC8vICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIkRvZXNuJ3QgdmVyaWZ5IHRoYXQgZ2V0TmFtZXNwYWNlVVJJIG1ldGhvZCByZXR1cm5zIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZXNwYWNlVVJJIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZVVSSTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKQEAgLTEwNCw3ICsxMTgsMTUgQEAKICAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGFkZHJBdHRyLmdldE5hbWVzcGFjZVVSSSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWVzcGFjZVVSSSIsICJodHRwOi8vd3d3Lm5pc3QuZ292IiwgYXR0ck5hbWVzcGFjZVVSSSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgdGhhdCBnZXROYW1lc3BhY2VVUkkgbWV0aG9kIHJldHVybnMgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lc3BhY2VVUkkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZXNwYWNlVVJJMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtMTE3LDcgKzEzOSwxNSBAQAogICAgICAgICBlbXBsb3llZU5hbWVzcGFjZSA9IHRlc3RFbXBsb3llZS5nZXROYW1lc3BhY2VVUkkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lc3BhY2VVUkkiLCAiaHR0cDovL3d3dy5uaXN0LmdvdiIsIGVtcGxveWVlTmFtZXNwYWNlKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldE5hbWVzcGFjZVVSSSBtZXRob2QgcmV0dXJucyBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE5hbWVzcGFjZVVSSSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2VVUkk0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlR2V0TG9jYWxOYW1lLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlR2V0TG9jYWxOYW1lLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTm9kZUdldExvY2FsTmFtZS5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlR2V0TG9jYWxOYW1lLmphdmEKaW5kZXggMzU0MjJjNi4uNjZjNWIyNSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTm9kZUdldExvY2FsTmFtZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVHZXRMb2NhbE5hbWUuamF2YQpAQCAtMjAsMTMgKzIwLDE5IEBACiAKICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogIFRoZSBtZXRob2QgZ2V0TG9jYWxOYW1lIHJldHVybnMgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgbm9kZS4KQEAgLTM4LDYgKzQ0LDcgQEAKICogQGF1dGhvciBOZWlsIERlbGltYQogKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlTlNMb2NhbE4iPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlTlNMb2NhbE48L2E+CiAqLworQFRlc3RUYXJnZXRDbGFzcyhOb2RlLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBOb2RlR2V0TG9jYWxOYW1lIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNjUsNiArNzIsMTUgQEAKICAgICAqIFJ1bnMgdGhlIHRlc3QgY2FzZS4KICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgdGhhdCBnZXRMb2NhbE5hbWUgbWV0aG9kIHJldHVybnMgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRMb2NhbE5hbWUiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2NhbE5hbWUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgIEVsZW1lbnQgZWxlbWVudDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05vZGVHZXROYW1lc3BhY2VVUkkuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVHZXROYW1lc3BhY2VVUkkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlR2V0TmFtZXNwYWNlVVJJLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVHZXROYW1lc3BhY2VVUkkuamF2YQppbmRleCA1OWE0ZGVhLi5lNTNkNmNiIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlR2V0TmFtZXNwYWNlVVJJLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTm9kZUdldE5hbWVzcGFjZVVSSS5qYXZhCkBAIC0yMCwxMyArMjAsMTkgQEAKIAogKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiAgVGhlIG1ldGhvZCBnZXROYW1lc3BhY2VVUkkgcmV0dXJucyB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGlzIG5vZGUsIG9yIG51bGwgaWYgaXQgaXMgdW5zcGVjaWZpZWQKQEAgLTQwLDYgKzQ2LDcgQEAKICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtTm9kZU5TbmFtZSI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELU5vZGVOU25hbWU8L2E+CiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQnVncy9QdWJsaWMvc2hvd19idWcuY2dpP2lkPTI1OSI+aHR0cDovL3d3dy53My5vcmcvQnVncy9QdWJsaWMvc2hvd19idWcuY2dpP2lkPTI1OTwvYT4KICovCitAVGVzdFRhcmdldENsYXNzKE5vZGUuY2xhc3MpCiBwdWJsaWMgZmluYWwgY2xhc3MgTm9kZUdldE5hbWVzcGFjZVVSSSBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTY3LDYgKzc0LDE1IEBACiAgICAgKiBSdW5zIHRoZSB0ZXN0IGNhc2UuCiAgICAgKiBAdGhyb3dzIFRocm93YWJsZSBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXROYW1lc3BhY2VVUkkiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2VVUkkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgIEVsZW1lbnQgZWxlbWVudDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05vZGVHZXRPd25lckRvY3VtZW50LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlR2V0T3duZXJEb2N1bWVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05vZGVHZXRPd25lckRvY3VtZW50LmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVHZXRPd25lckRvY3VtZW50LmphdmEKaW5kZXggNGQ0MDU5MS4uNzAzNGVhNCAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTm9kZUdldE93bmVyRG9jdW1lbnQuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlR2V0T3duZXJEb2N1bWVudC5qYXZhCkBAIC0xOSwxNSArMTksMjEgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CisKIC8qKgogICogVGhlIG1ldGhvZCBnZXRPd25lckRvY3VtZW50IHJldHVybnMgdGhlIERvY3VtZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcwogICogbm9kZQpAQCAtNDIsNiArNDgsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjU5Ij5odHRwOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MjU5PC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5vZGUuY2xhc3MpCiBwdWJsaWMgZmluYWwgY2xhc3MgTm9kZUdldE93bmVyRG9jdW1lbnQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC03MSw2ICs3OCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRPd25lckRvY3VtZW50IG1ldGhvZCByZXR1cm5zIG51bGwuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0T3duZXJEb2N1bWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPd25lckRvY3VtZW50MSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IG93bmVyRG9jOwpAQCAtODQsNyArMTAwLDE1IEBACiAgICAgICAgIG93bmVyRG9jID0gZG9jVHlwZS5nZXRPd25lckRvY3VtZW50KCk7CiAgICAgICAgIGFzc2VydE51bGwoIm5vZGVnZXRvd25lcmRvY3VtZW50MDEiLCBvd25lckRvYyk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE93bmVyRG9jdW1lbnQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3duZXJEb2N1bWVudDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudCBuZXdEb2M7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlR2V0UHJlZml4LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlR2V0UHJlZml4LmphdmEKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTm9kZUdldFByZWZpeC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlR2V0UHJlZml4LmphdmEKaW5kZXggNjBjZDI2OS4uZTljZmEyMSAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTm9kZUdldFByZWZpeC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVHZXRQcmVmaXguamF2YQpAQCAtMjAsMTMgKzIwLDE5IEBACiAKICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogICAgIFRoZSBtZXRob2QgZ2V0UHJlZml4IHJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXggb2YgdGhpcyBub2RlLCBvciBudWxsIGlmIGl0IGlzIHVuc3BlY2lmaWVkLgpAQCAtMzgsNiArNDQsNyBAQAogKiBAYXV0aG9yIE5laWwgRGVsaW1hCiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELU5vZGVOU1ByZWZpeCI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELU5vZGVOU1ByZWZpeDwvYT4KICovCitAVGVzdFRhcmdldENsYXNzKE5vZGUuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIE5vZGVHZXRQcmVmaXggZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC02Niw2ICs3MywxNSBAQAogICAgICogUnVucyB0aGUgdGVzdCBjYXNlLgogICAgICogQHRocm93cyBUaHJvd2FibGUgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJlZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZml4KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICBFbGVtZW50IGVsZW1lbnQ7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlSGFzQXR0cmlidXRlcy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTm9kZUhhc0F0dHJpYnV0ZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlSGFzQXR0cmlidXRlcy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlSGFzQXR0cmlidXRlcy5qYXZhCmluZGV4IDg5NGY2MWMuLmQ3YjBjZjYgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05vZGVIYXNBdHRyaWJ1dGVzLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTm9kZUhhc0F0dHJpYnV0ZXMuamF2YQpAQCAtMTksMTYgKzE5LDIyIEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogVGhlIG1ldGhvZCBoYXNBdHRyaWJ1dGVzIHJldHVybnMgd2hldGhlciB0aGlzIG5vZGUgKGlmIGl0IGlzIGFuIGVsZW1lbnQpIGhhcwpAQCAtNDEsNiArNDcsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtTm9kZUhhc0F0dHJzIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtTm9kZUhhc0F0dHJzPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5vZGUuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIE5vZGVIYXNBdHRyaWJ1dGVzIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNzAsNiArNzcsMTUgQEAKICAgICAgKiBAdGhyb3dzIFRocm93YWJsZQogICAgICAqICAgICAgICAgICAgIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAorICAgICAgcHVycG9zZSA9ICIiLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGVzIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc0F0dHJpYnV0ZXMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtODUsNyArMTAxLDE1IEBACiAgICAgICAgIGhhc0F0dHJpYnV0ZXMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgibm9kZWhhc2F0dHJpYnV0ZXMwMV8yIiwgaGFzQXR0cmlidXRlcyk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBoYXNBdHRyaWJ1dGVzIG1ldGhvZCByZXR1cm5zIGZhbHNlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImhhc0F0dHJpYnV0ZXMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlczIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudFR5cGUgZG9jVHlwZTsKQEAgLTk1LDcgKzExOSwxNSBAQAogICAgICAgICBoYXNBdHRyaWJ1dGVzID0gZG9jVHlwZS5oYXNBdHRyaWJ1dGVzKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJub2RlaGFzYXR0cmlidXRlczAyIiwgaGFzQXR0cmlidXRlcyk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBoYXNBdHRyaWJ1dGVzIG1ldGhvZCByZXR1cm5zIHRydWUgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaGFzQXR0cmlidXRlcyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBdHRyaWJ1dGVzMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTEwOCw3ICsxNDAsMTUgQEAKICAgICAgICAgaGFzQXR0cmlidXRlcyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJoYXNBdHRyaWJ1dGVzIiwgaGFzQXR0cmlidXRlcyk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBoYXNBdHRyaWJ1dGVzIG1ldGhvZCByZXR1cm5zIHRydWUgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgbWV0aG9kTmFtZSA9ICJoYXNBdHRyaWJ1dGVzIiwKKyAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXR0cmlidXRlczQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBEb2N1bWVudCBuZXdEb2M7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlSXNTdXBwb3J0ZWQuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVJc1N1cHBvcnRlZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05vZGVJc1N1cHBvcnRlZC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlSXNTdXBwb3J0ZWQuamF2YQppbmRleCBjOTg0ZTA3Li5mMGY5MTEwIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlSXNTdXBwb3J0ZWQuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlSXNTdXBwb3J0ZWQuamF2YQpAQCAtMTksMjAgKzE5LDI2IEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CiBpbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwogaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKIAoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKKwogLyoqCiAgKiBUaGUgbWV0aG9kICJpc1N1cHBvcnRlZChmZWF0dXJlLHZlcnNpb24pIiBUZXN0cyB3aGV0aGVyIHRoZSBET00KICAqIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYSBzcGVjaWZpYyBmZWF0dXJlIGFuZCB0aGF0IGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5CkBAIC00OSw2ICs1NSw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNMZXZlbC0yLUNvcmUtTm9kZS1zdXBwb3J0cyI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0xldmVsLTItQ29yZS1Ob2RlLXN1cHBvcnRzPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5vZGUuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIE5vZGVJc1N1cHBvcnRlZCBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTc4LDYgKzg1LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSB0aGF0IGlzU3VwcG9ydGVkIG1ldGhvZCBjYW4gcmV0dXJuIGZhbHNlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZDEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC0xMTMsNyArMTI5LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJub2RlaXNzdXBwb3J0ZWQwMV9Db3JlMyIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgdGhhdCBpc1N1cHBvcnRlZCBtZXRob2QgY2FuIHJldHVybiBmYWxzZSB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWQyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgQXR0ciBhdHRyaWJ1dGU7CkBAIC0xNDksNyArMTczLDE2IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJub2RlaXNzdXBwb3J0ZWQwMl9Db3JlMyIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBpc1N1cHBvcnRlZCBtZXRob2QgcmV0dXJucyBmYWxzZSB2YWx1ZSAiICsKKyAgICAgICAgICAgICJpZiBpdCdzIGNhbGxlZCB3aXRoIGVtcHR5IHN0cmluZ3MgYXMgcGFyYW1ldGVycy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJpc1N1cHBvcnRlZCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdXBwb3J0ZWQzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGU7CkBAIC0xNTksNyArMTkyLDE1IEBACiAgICAgICAgIHN1Y2Nlc3MgPSBkb2NUeXBlLmlzU3VwcG9ydGVkKCIiLCAiIik7CiAgICAgICAgIGFzc2VydEZhbHNlKCJub2RlaXNzdXBwb3J0ZWQwMyIsIHN1Y2Nlc3MpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgaXNTdXBwb3J0ZWQgbWV0aG9kIHJldHVybnMgZmFsc2UgdmFsdWUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiaXNTdXBwb3J0ZWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VwcG9ydGVkNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEVudGl0eVJlZmVyZW5jZSBlbnRSZWY7CkBAIC0xNzAsNyArMjExLDE1IEBACiAgICAgICAgIHN1Y2Nlc3MgPSBlbnRSZWYuaXNTdXBwb3J0ZWQoIlhNTCBDT1JFIiwgIiIpOwogICAgICAgICBhc3NlcnRGYWxzZSgibm9kZWlzc3VwcG9ydGVkMDQiLCBzdWNjZXNzKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGlzU3VwcG9ydGVkIG1ldGhvZCByZXR1cm5zIGZhbHNlIHZhbHVlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImlzU3VwcG9ydGVkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N1cHBvcnRlZDUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGk7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlTm9ybWFsaXplLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlTm9ybWFsaXplLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTm9kZU5vcm1hbGl6ZS5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob2RlTm9ybWFsaXplLmphdmEKaW5kZXggYzdkZTZkMC4uNjY0YWQyMiAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vTm9kZU5vcm1hbGl6ZS5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVOb3JtYWxpemUuamF2YQpAQCAtMTksMjAgKzE5LDI2IEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5UZXh0OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwogaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247CiBpbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CitpbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgbWV0aG9kICJub3JtYWxpemUiIHB1dHMgYWxsIFRleHQgbm9kZXMgaW4gdGhlIGZ1bGwgZGVwdGggb2YgdGhlIHN1Yi10cmVlCkBAIC01MSw2ICs1Nyw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1ub3JtYWxpemUiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1ub3JtYWxpemU8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTm9kZS5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgTm9kZU5vcm1hbGl6ZSBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTgwLDYgKzg3LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAibm9ybWFsaXplIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIERvY3VtZW50IG5ld0RvYzsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05vZGVTZXRQcmVmaXguamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVTZXRQcmVmaXguamF2YQpzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlU2V0UHJlZml4LmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vZGVTZXRQcmVmaXguamF2YQppbmRleCAxYWE3OGRjLi5jYTI4NDRmIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob2RlU2V0UHJlZml4LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vTm9kZVNldFByZWZpeC5qYXZhCkBAIC0xOSwyMCArMTksMjYgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOworCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwogCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworCiAvKioKICAqIFRoZSBtZXRob2Qgc2V0UHJlZml4IHNldHMgdGhlIG5hbWVzcGFjZSBwcmVmaXggb2YgdGhpcyBub2RlLiBOb3RlIHRoYXQKICAqIHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUsIHdoZW4gcGVybWl0dGVkLCBjaGFuZ2VzIHRoZSBub2RlTmFtZSBhdHRyaWJ1dGUsIHdoaWNoCkBAIC00OCw2ICs1NCw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlTlNQcmVmaXgiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1Ob2RlTlNQcmVmaXg8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTm9kZS5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgTm9kZVNldFByZWZpeCBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTc3LDYgKzg0LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UHJlZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcmVmaXgxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBkb2NGcmFnbWVudDsKQEAgLTEyMSw3ICsxMzcsMTUgQEAKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoIm5vZGVzZXRwcmVmaXgwMl9hdHRyTmFtZSIsICJkbXN0Yzpkb21lc3RpYyIsIGF0dHJOYW1lKTsKIC8vICAgICAgICBhc3NlcnRFcXVhbHMoIm5vZGVzZXRwcmVmaXgwMl9uZXdBdHRyTmFtZSIsICJkb206YWRkcmVzcyIsIG5ld0F0dHJOYW1lKTsKIC8vICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFByZWZpeDMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC0xNjMsNyArMTg3LDE1IEBACiAvLyAgICAgICAgICAgIGFzc2VydFRydWUoIm5vZGVzZXRwcmVmaXgwNCIsIHN1Y2Nlc3MpOwogLy8gICAgICAgIH0KIC8vICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFByZWZpeDUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC0xOTIsNyArMjI0LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBOQU1FU1BBQ0VfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0UHJlZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcmVmaXg2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtMjEwLDcgKzI1MCwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTkFNRVNQQUNFX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRE9NRXhjZXB0aW9uIHdpdGggTkFNRVNQQUNFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFByZWZpeCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJlZml4NygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIEF0dHIgYXR0cmlidXRlOwpAQCAtMjI4LDcgKzI3NiwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTkFNRVNQQUNFX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRE9NRXhjZXB0aW9uIHdpdGggTkFNRVNQQUNFX0VSUi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldFByZWZpeDgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC0yNDksOCArMzA1LDE2IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OQU1FU1BBQ0VfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJlZml4OSgpIHRocm93cyBUaHJvd2FibGUgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIElOVkFMSURfQ0hBUkFDVEVSX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldFByZWZpeCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFNldFByZWZpeDkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBTdHJpbmcgdmFsdWUgPSAiIyQlJicoKUAiOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob3JtYWxpemUuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL05vcm1hbGl6ZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL05vcm1hbGl6ZS5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob3JtYWxpemUuamF2YQppbmRleCBmY2ZiNDU5Li40MGI0YjI5IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Ob3JtYWxpemUuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Ob3JtYWxpemUuamF2YQpAQCAtMjAsMTUgKzIwLDIwIEBACiAKICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIC8qKgogICogICAgIFRoZSAibm9ybWFsaXplKCkiIG1ldGhvZCBwdXRzIGFsbCB0aGUgbm9kZXMgaW4gdGhlIGZ1bGwKQEAgLTQ1LDYgKzUwLDcgQEAKICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtbm9ybWFsaXplIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtbm9ybWFsaXplPC9hPgogKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC03MkFCODM1OSI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELTcyQUI4MzU5PC9hPgogKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgTm9ybWFsaXplIGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNzEsNiArNzcsMTUgQEAKICAgICAqIFJ1bnMgdGhlIHRlc3QgY2FzZS4KICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gIm5vcm1hbGl6ZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgRWxlbWVudCByb290OwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vT3duZXJEb2N1bWVudC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vT3duZXJEb2N1bWVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL093bmVyRG9jdW1lbnQuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vT3duZXJEb2N1bWVudC5qYXZhCmluZGV4IDFjMzgzMGIuLjNhMjUzN2IgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL093bmVyRG9jdW1lbnQuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Pd25lckRvY3VtZW50LmphdmEKQEAgLTIwLDEzICsyMCwxOCBAQAogCiAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CisKIC8qKgogICogICAgIFRoZSAiZ2V0T3duZXJEb2N1bWVudCgpIiBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoZSB0YXJnZXQKICAqICAgICBub2RlIGl0c2VsZiBpcyBhIERvY3VtZW50VHlwZSB3aGljaCBpcyBub3QgdXNlZCB3aXRoIGFueSBkb2N1bWVudCB5ZXQuCkBAIC0zNyw2ICs0Miw3IEBACiAqIEBhdXRob3IgTWFyeSBCcmFkeQogKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNub2RlLW93bmVyRG9jIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjbm9kZS1vd25lckRvYzwvYT4KICovCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50LmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBPd25lckRvY3VtZW50IGV4dGVuZHMgRE9NVGVzdENhc2UgewogCiAgICAgRE9NRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5OwpAQCAtNjQsNiArNzAsMTUgQEAKICAgICAqIFJ1bnMgdGhlIHRlc3QgY2FzZS4KICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIEFueSB1bmNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRlc3QgdG8gZmFpbAogICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9zbid0IHZlcmlmeSB0aGF0IGdldE93bmVyRG9jdW1lbnQgY2FuIHJldHVybiBub3QgbnVsbCB2YWx1ZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRPd25lckRvY3VtZW50IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3duZXJEb2N1bWVudCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgRG9jdW1lbnRUeXBlIG93bmVyRG9jdW1lbnQ7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Pd25lckVsZW1lbnQuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL093bmVyRWxlbWVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL093bmVyRWxlbWVudC5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Pd25lckVsZW1lbnQuamF2YQppbmRleCBjZjE4MzI2Li4yNjdkMzE0IDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9Pd25lckVsZW1lbnQuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9Pd25lckVsZW1lbnQuamF2YQpAQCAtMTksMTYgKzE5LDIxIEBACiAKICAqLwogCi1wYWNrYWdlIG9yZy53M2MuZG9tOworcGFja2FnZSB0ZXN0cy5vcmcudzNjLmRvbTsKIAotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CiAKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgImdldE93bmVyRWxlbWVudCgpIiB3aWxsIHJldHVybiB0aGUgRWxlbWVudCBub2RlIHRoaXMgYXR0cmlidXRlIGlzCkBAIC00Miw2ICs0Nyw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC1GNjhEMDk1Ij5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtRjY4RDA5NTwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhBdHRyLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBPd25lckVsZW1lbnQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC03MSw2ICs3NywxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25saXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE93bmVyRWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPd25lckVsZW1lbnQxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgYWRkcmVzc0xpc3Q7CkBAIC04OCw3ICsxMDMsMTUgQEAKICAgICAgICAgbmFtZSA9IGVsZW1lbnROb2RlLmdldE5vZGVOYW1lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dfRXF1YWxzIiwgImFkZHJlc3MiLCBuYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldE93bmVyRWxlbWVudCBtZXRob2QgcmV0dXJucyBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldE93bmVyRWxlbWVudCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPd25lckVsZW1lbnQyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgQXR0ciBuZXdBdHRyOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vUHJlZml4LmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9QcmVmaXguamF2YQpzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9QcmVmaXguamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vUHJlZml4LmphdmEKaW5kZXggMzRmZWEyYi4uNjBiZDNlNCAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vUHJlZml4LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vUHJlZml4LmphdmEKQEAgLTE5LDE2ICsxOSwyMSBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgImdldFByZWZpeCgpIiBtZXRob2QgZm9yIGEgTm9kZSByZXR1cm5zIHRoZSBuYW1lc3BhY2UgcHJlZml4IG9mIHRoZSBub2RlLApAQCAtNDQsNiArNDksNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtTm9kZU5TUHJlZml4Ij5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtTm9kZU5TUHJlZml4PC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5vZGUuY2xhc3MpIAogcHVibGljIGZpbmFsIGNsYXNzIFByZWZpeCBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTczLDYgKzc5LDE1IEBACiAgICAgICogQHRocm93cyBUaHJvd2FibGUKICAgICAgKiAgICAgICAgICAgICBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldFByZWZpeCBtZXRob2QgY2FuIHJldHVybiBudWxsLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByZWZpeCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcmVmaXgxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZSBjcmVhdGVkTm9kZTsKQEAgLTgyLDcgKzk3LDE1IEBACiAgICAgICAgIHByZWZpeCA9IGNyZWF0ZWROb2RlLmdldFByZWZpeCgpOwogICAgICAgICBhc3NlcnROdWxsKCJ0aHJvd19OdWxsIiwgcHJlZml4KTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5IG9mIGdldFByZWZpeCBtZXRob2QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJlZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFByZWZpeDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKQEAgLTk3LDcgKzEyMCwxNSBAQAogICAgICAgICBwcmVmaXggPSB0ZXh0Tm9kZS5nZXRQcmVmaXgoKTsKICAgICAgICAgYXNzZXJ0TnVsbCgidGV4dE5vZGVQcmVmaXgiLCBwcmVmaXgpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkgb2YgZ2V0UHJlZml4IG1ldGhvZC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZml4MygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtMTEwLDcgKzE0MSwxNSBAQAogICAgICAgICBwcmVmaXggPSB0ZXN0RW1wbG95ZWUuZ2V0UHJlZml4KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygicHJlZml4IiwgImVtcCIsIHByZWZpeCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRQcmVmaXggbWV0aG9kIHJldHVybnMgbnVsbC4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZml4NCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtMTIyLDcgKzE2MSwxNiBAQAogICAgICAgICBwcmVmaXggPSB0ZXN0RW1wbG95ZWUuZ2V0UHJlZml4KCk7CiAgICAgICAgIGFzc2VydE51bGwoInRocm93X051bGwiLCBwcmVmaXgpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0UHJlZml4IG1ldGhvZCB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiTkFNRVNQQUNFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByZWZpeCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcmVmaXg1KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CkBAIC0xNDQsOCArMTkyLDE3IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OQU1FU1BBQ0VfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZml4NigpIHRocm93cyBUaHJvd2FibGUgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0UHJlZml4IG1ldGhvZCB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiSU5WQUxJRF9DSEFSQUNURVJfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJlZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCisgICAgcHVibGljIHZvaWQgX3Rlc3RHZXRQcmVmaXg2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CiAgICAgICAgIE5vZGUgZW1wbG95ZWVOb2RlOwpAQCAtMTYzLDcgKzIyMCwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfSU5WQUxJRF9DSEFSQUNURVJfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldFByZWZpeCBtZXRob2QgdGhyb3dzIERPTUV4Y2VwdGlvbiB3aXRoICIgKworICAgICAgICAgICAgIk5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZml4NygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtMjE2LDggKzI4MiwxNyBAQAogLy8gICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIiLCBzdWNjZXNzKTsKIC8vICAgICAgICB9CiAvLyAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZml4OSgpIHRocm93cyBUaHJvd2FibGUgeworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHRoYXQgZ2V0UHJlZml4IG1ldGhvZCB0aHJvd3MgRE9NRXhjZXB0aW9uIHdpdGggIiArCisgICAgICAgICAgICAiTkFNRVNQQUNFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFByZWZpeCIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHt9CisgICAgICAgICkKKyAgICB9KQorICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0UHJlZml4OSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwogICAgICAgICBFbGVtZW50IGFkZHJOb2RlOwpAQCAtMjM3LDcgKzMxMiwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTkFNRVNQQUNFX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgICB9CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgdGhhdCBnZXRQcmVmaXggbWV0aG9kIHRocm93cyBET01FeGNlcHRpb24gd2l0aCAiICsKKyAgICAgICAgICAgICJOQU1FU1BBQ0VfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHJlZml4IiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFByZWZpeDEwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CkBAIC0yNTYsNyArMzQwLDE2IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OQU1FU1BBQ0VfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyB0aGF0IGdldFByZWZpeCBtZXRob2QgdGhyb3dzIERPTUV4Y2VwdGlvbiB3aXRoICIgKworICAgICAgICAgICAgIk5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJnZXRQcmVmaXgiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZml4MTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdDsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1B1YmxpY0lkLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9QdWJsaWNJZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1B1YmxpY0lkLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1B1YmxpY0lkLmphdmEKaW5kZXggNWUxYzFjMy4uYTM2NmUyZCAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vUHVibGljSWQuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9QdWJsaWNJZC5qYXZhCkBAIC0yMCwxMyArMjAsMTggQEAKIAogKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KIC8qKgogICogICAgIFRoZSAiZ2V0UHVibGljSWQoKSIgbWV0aG9kIG9mIGEgZG9jdW1lbnR0eXBlIG5vZGUgY29udGFpbnMKICAqICAgIHRoZSBwdWJsaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIHN1YnNldC4KQEAgLTM4LDYgKzQzLDcgQEAKICogQGF1dGhvciBNYXJ5IEJyYWR5CiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUNvcmUtRG9jVHlwZS1wdWJsaWNJZCI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELUNvcmUtRG9jVHlwZS1wdWJsaWNJZDwvYT4KICovCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50VHlwZS5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgUHVibGljSWQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC02NSw2ICs3MSwxNSBAQAogICAgICogUnVucyB0aGUgdGVzdCBjYXNlLgogICAgICogQHRocm93cyBUaHJvd2FibGUgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgKi8KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5DT01QTEVURSwKKyAgICAgIHB1cnBvc2UgPSAiIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0UHVibGljSWQiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7fQorICAgICAgICApCisgICAgfSkKICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQdWJsaWNJZCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgRG9jdW1lbnQgZG9jOwogICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGU7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9SZW1vdmVBdHRyaWJ1dGVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vUmVtb3ZlQXR0cmlidXRlTlMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSB4bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9SZW1vdmVBdHRyaWJ1dGVOUy5qYXZhCnJlbmFtZSB0byB4bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9SZW1vdmVBdHRyaWJ1dGVOUy5qYXZhCmluZGV4IGJhZGMwMDQuLjZhODRkMWIgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1JlbW92ZUF0dHJpYnV0ZU5TLmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vUmVtb3ZlQXR0cmlidXRlTlMuamF2YQpAQCAtMTksNyArMTksOSBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7IAogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCkBAIC00OSw2ICs1MSw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSN4cG9pbnRlcihpZCgnSUQtRWxSZW1BdE5TJykvcmFpc2VzL2V4Y2VwdGlvbltAbmFtZT0nRE9NRXhjZXB0aW9uJ10vZGVzY3IvcFtzdWJzdHJpbmctYmVmb3JlKC4sJzonKT0nTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSJ10pIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjeHBvaW50ZXIoaWQoJ0lELUVsUmVtQXROUycpL3JhaXNlcy9leGNlcHRpb25bQG5hbWU9J0RPTUV4Y2VwdGlvbiddL2Rlc2NyL3Bbc3Vic3RyaW5nLWJlZm9yZSguLCc6Jyk9J05PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiddKTwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhBdHRyLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBSZW1vdmVBdHRyaWJ1dGVOUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1JlbW92ZU5hbWVkSXRlbU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9SZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1JlbW92ZU5hbWVkSXRlbU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1JlbW92ZU5hbWVkSXRlbU5TLmphdmEKaW5kZXggYTNlMTFmYy4uZTRhNjY1NiAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vUmVtb3ZlTmFtZWRJdGVtTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9SZW1vdmVOYW1lZEl0ZW1OUy5qYXZhCkBAIC0xOSwxNiArMTksMjEgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiAvKioKICAqIFRoZSAicmVtb3ZlTmFtZWRJdGVtTlMobmFtZXNwYWNlVVJJLGxvY2FsTmFtZSkiIG1ldGhvZCBmb3IgYSBOYW1lZE5vZGVNYXAKQEAgLTQ1LDYgKzUwLDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELTEwNzQ1Nzc1NDkiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSNJRC0xMDc0NTc3NTQ5PC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKE5hbWVkTm9kZU1hcC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgUmVtb3ZlTmFtZWRJdGVtTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC03NCw2ICs4MCwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgRE9NRXhjZXB0aW9uIGV4Y2VwdGlvbi4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJyZW1vdmVOYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRJdGVtTlMxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CkBAIC05MSw3ICsxMDYsMTUgQEAKICAgICAgICAgbmV3QXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiZG1zdGM6ZG9tZXN0aWMiKTsKICAgICAgICAgYXNzZXJ0TnVsbCgibm9kZVJlbW92ZWQiLCBuZXdBdHRyKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBOT1RfRk9VTkRfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicmVtb3ZlTmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkSXRlbU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cudXNhLmNvbSI7CiAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiZG9tZXN0IjsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1NldEF0dHJpYnV0ZU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9TZXRBdHRyaWJ1dGVOUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1NldEF0dHJpYnV0ZU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1NldEF0dHJpYnV0ZU5TLmphdmEKaW5kZXggMDM4ZmFlZS4uNWVjZjA3MiAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vU2V0QXR0cmlidXRlTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9TZXRBdHRyaWJ1dGVOUy5qYXZhCkBAIC0xOSwxNiArMTksMjEgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgInNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSxxdWFsaWZpZWROYW1lLFZhbHVlKSIgbWV0aG9kIHJhaXNlcyBhCkBAIC00Nyw2ICs1Miw3IEBACiAgKiBAc2VlIDxhCiAgKiAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSN4cG9pbnRlcihpZCgnSUQtRWxTZXRBdHRyTlMnKS9yYWlzZXMvZXhjZXB0aW9uW0BuYW1lPSdET01FeGNlcHRpb24nXS9kZXNjci9wW3N1YnN0cmluZy1iZWZvcmUoLiwnOicpPSdJTlZBTElEX0NIQVJBQ1RFUl9FUlInXSkiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSN4cG9pbnRlcihpZCgnSUQtRWxTZXRBdHRyTlMnKS9yYWlzZXMvZXhjZXB0aW9uW0BuYW1lPSdET01FeGNlcHRpb24nXS9kZXNjci9wW3N1YnN0cmluZy1iZWZvcmUoLiwnOicpPSdJTlZBTElEX0NIQVJBQ1RFUl9FUlInXSk8L2E+CiAgKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoRWxlbWVudC5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgU2V0QXR0cmlidXRlTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC03Niw2ICs4MiwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRE9NRXhjZXB0aW9uIHdpdGggSU5WQUxJRF9DSEFSQUNURVJfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5TMSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cubmlzdC5nb3YiOwogICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9ICJlbXA6cXVhbD9uYW1lIjsKQEAgLTk3LDcgKzExMiwxNSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfSU5WQUxJRF9DSEFSQUNURVJfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBOQU1FU1BBQ0VfRVJSIGNvZGUuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cubmlzdC5nb3YiOwogICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9ICJlbXA6IjsKQEAgLTE1OCw3ICsxODEsMTUgQEAKIC8vICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSIiwgc3VjY2Vzcyk7CiAvLyAgICAgICAgfQogLy8gICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgcG9zaXRpdmUgZnVuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTlM0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3Q7CkBAIC0xODYsNyArMjE3LDE1IEBACiAgICAgICAgIHJlc3VsdFByZWZpeCA9IGFkZHJBdHRyLmdldFByZWZpeCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInByZWZpeCIsICJuZXdwcmVmaXgiLCByZXN1bHRQcmVmaXgpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZ1bmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5TNSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gIm5ld0F0dHIiOwogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cubmV3YXR0ci5jb20iOwpAQCAtMjA2LDcgKzI0NSwxNSBAQAogICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJvd19FcXVhbHMiLCAiPG5ld1ZhbHVlPiIsIHJlc3VsdEF0dHIpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTlM2KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5uaXN0LmdvdiI7CiAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0gInhtbDpxdWFsaWZpZWROYW1lIjsKQEAgLTIyOCw3ICsyNzUsMTUgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoInRocm93X05BTUVTUEFDRV9FUlIiLCBzdWNjZXNzKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIE5BTUVTUEFDRV9FUlIuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5TNygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cubmlzdC5nb3YiOwogICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9ICJ4bWxucyI7CkBAIC0yNTAsNyArMzA1LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OQU1FU1BBQ0VfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmdW5jdGlvbmFsaXR5LiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyaWJ1dGVOUzkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJuZXdBdHRyIjsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3Lm5ld2F0dHIuY29tIjsKQEAgLTI4MSw3ICszNDQsMTUgQEAKICAgICAgICAgcmVzdWx0UHJlZml4ID0gYWRkckF0dHIuZ2V0UHJlZml4KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygicHJlZml4IiwgImVtcCIsIHJlc3VsdFByZWZpeCk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRE9NRXhjZXB0aW9uIHdpdGggTkFNRVNQQUNFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF0dHJpYnV0ZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGphdmEubGFuZy5TdHJpbmcuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyaWJ1dGVOUzEwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5leGFtcGxlLmdvdiI7CiAgICAgICAgIERvY3VtZW50IGRvYzsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1NldEF0dHJpYnV0ZU5vZGVOUy5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vU2V0QXR0cmlidXRlTm9kZU5TLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vU2V0QXR0cmlidXRlTm9kZU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1NldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCmluZGV4IGUzYzhlMTkuLmMyNmJjNDcgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1NldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1NldEF0dHJpYnV0ZU5vZGVOUy5qYXZhCkBAIC0xOSwxNiArMTksMjEgQEAKIAogICovCiAKLXBhY2thZ2Ugb3JnLnczYy5kb207CitwYWNrYWdlIHRlc3RzLm9yZy53M2MuZG9tOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0OworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXRDbGFzczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiBUaGUgInNldEF0dHJpYnV0ZU5vZGUobmV3QXR0cikiIG1ldGhvZCByYWlzZXMgYW4gIklOVVNFX0FUVFJJQlVURV9FUlIKQEAgLTUwLDYgKzU1LDcgQEAKICAqIEBzZWUgPGEKICAqICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI3hwb2ludGVyKGlkKCdJRC1FbFNldEF0Tm9kZU5TJykvcmFpc2VzL2V4Y2VwdGlvbltAbmFtZT0nRE9NRXhjZXB0aW9uJ10vZGVzY3IvcFtzdWJzdHJpbmctYmVmb3JlKC4sJzonKT0nSU5VU0VfQVRUUklCVVRFX0VSUiddKSI+aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI3hwb2ludGVyKGlkKCdJRC1FbFNldEF0Tm9kZU5TJykvcmFpc2VzL2V4Y2VwdGlvbltAbmFtZT0nRE9NRXhjZXB0aW9uJ10vZGVzY3IvcFtzdWJzdHJpbmctYmVmb3JlKC4sJzonKT0nSU5VU0VfQVRUUklCVVRFX0VSUiddKTwvYT4KICAqLworQFRlc3RUYXJnZXRDbGFzcyhFbGVtZW50LmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBTZXRBdHRyaWJ1dGVOb2RlTlMgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC03OSw2ICs4NSwxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTF9PSywKKyAgICAgIHB1cnBvc2UgPSAiVmVyaWZpZXMgRE9NRXhjZXB0aW9uIHdpdGggSU5VU0VfQVRUUklCVVRFX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldEF0dHJpYnV0ZU5vZGVOUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5BdHRyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXR0cmlidXRlTm9kZTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3Lm5ld2F0dHIuY29tIjsKICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAiZW1wOm5ld0F0dHIiOwpAQCAtMTQ1LDcgKzE2MCwxNSBAQAogLy8gICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIiLCBzdWNjZXNzKTsKIC8vICAgICAgICB9CiAvLyAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTm9kZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLkF0dHIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyaWJ1dGVOb2RlMygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cubmV3YXR0ci5jb20iOwogICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9ICJlbXA6bmV3QXR0ciI7CkBAIC0xNjMsNyArMTg2LDE1IEBACiAgICAgICAgICAgICAgICAgLnNldEF0dHJpYnV0ZU5vZGVOUyhuZXdBdHRyKTsKICAgICAgICAgYXNzZXJ0TnVsbCgidGhyb3dfTnVsbCIsIG5ld0FkZHJBdHRyKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBET01FeGNlcHRpb24uIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAic2V0QXR0cmlidXRlTm9kZU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLkF0dHIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyaWJ1dGVOb2RlNCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBEb2N1bWVudCBkb2M7CiAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtMTgxLDcgKzIxMiwxNSBAQAogICAgICAgICBuZXdOYW1lID0gbmV3QWRkckF0dHIuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJub2RlTmFtZSIsICJlbXA6ZG9tZXN0aWMiLCBuZXdOYW1lKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBET01FeGNlcHRpb24gd2l0aCBXUk9OR19ET0NVTUVOVF9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXRBdHRyaWJ1dGVOb2RlTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7b3JnLnczYy5kb20uQXR0ci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEF0dHJpYnV0ZU5vZGU1KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5uZXdhdHRyLmNvbSI7CiAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0gImVtcDpuZXdBdHRyIjsKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1NldE5hbWVkSXRlbU5TLmphdmEgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9TZXROYW1lZEl0ZW1OUy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHhtbC9zcmMvdGVzdC9qYXZhL29yZy93M2MvZG9tL1NldE5hbWVkSXRlbU5TLmphdmEKcmVuYW1lIHRvIHhtbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1NldE5hbWVkSXRlbU5TLmphdmEKaW5kZXggNmMzNmRkOS4uMjIzN2VmZiAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vU2V0TmFtZWRJdGVtTlMuamF2YQorKysgYi94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy9vcmcvdzNjL2RvbS9TZXROYW1lZEl0ZW1OUy5qYXZhCkBAIC0yMCwxNSArMjAsMjAgQEAKIAogKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIAogLyoqCiAgKiAgICAgVGhlICJzZXROYW1lZEl0ZW1OUyhhcmcpIiBtZXRob2QgZm9yIGEgCkBAIC00Niw2ICs1MSw3IEBACiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI0lELXNldE5hbWVkSXRlbU5TIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtc2V0TmFtZWRJdGVtTlM8L2E+CiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlI3hwb2ludGVyKGlkKCdJRC1zZXROYW1lZEl0ZW1OUycpL3JhaXNlcy9leGNlcHRpb25bQG5hbWU9J0RPTUV4Y2VwdGlvbiddL2Rlc2NyL3Bbc3Vic3RyaW5nLWJlZm9yZSguLCc6Jyk9J0lOVVNFX0FUVFJJQlVURV9FUlInXSkiPmh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZSN4cG9pbnRlcihpZCgnSUQtc2V0TmFtZWRJdGVtTlMnKS9yYWlzZXMvZXhjZXB0aW9uW0BuYW1lPSdET01FeGNlcHRpb24nXS9kZXNjci9wW3N1YnN0cmluZy1iZWZvcmUoLiwnOicpPSdJTlVTRV9BVFRSSUJVVEVfRVJSJ10pPC9hPgogKi8KK0BUZXN0VGFyZ2V0Q2xhc3MoTmFtZWROb2RlTWFwLmNsYXNzKSAKIHB1YmxpYyBmaW5hbCBjbGFzcyBTZXROYW1lZEl0ZW1OUyBleHRlbmRzIERPTVRlc3RDYXNlIHsKIAogICAgIERPTURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsKQEAgLTczLDYgKzc5LDE1IEBACiAgICAgKiBSdW5zIHRoZSB0ZXN0IGNhc2UuCiAgICAgKiBAdGhyb3dzIFRocm93YWJsZSBBbnkgdW5jYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0ZXN0IHRvIGZhaWwKICAgICAqLworICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIElOVVNFX0FUVFJJQlVURV9FUlIgY29kZS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROYW1lZEl0ZW1OUzEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgIE5vZGVMaXN0IGVsZW1lbnRMaXN0OwpAQCAtMTAwLDYgKzExNSwxNSBAQAogICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfSU5VU0VfQVRUUklCVVRFX0VSUiIsIHN1Y2Nlc3MpOwogICAgICAgfQogfQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIERPTUV4Y2VwdGlvbiB3aXRoIFdST05HX0RPQ1VNRU5UX0VSUiBjb2RlLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInNldE5hbWVkSXRlbU5TIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge29yZy53M2MuZG9tLk5vZGUuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgcHVibGljIHZvaWQgdGVzdFNldE5hbWVkSXRlbU5TMigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy51c2EuY29tIjsKICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9ICJkbXN0Yzpkb21lc3RpYyI7CkBAIC0xMjgsNiArMTUyLDE1IEBACiAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGhyb3dfV1JPTkdfRE9DVU1FTlRfRVJSIiwgc3VjY2Vzcyk7CiAgICAgICAgICAgfQogICAgIH0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMX09LLAorICAgICAgcHVycG9zZSA9ICJWZXJpZmllcyBwb3NpdGl2ZSBmbmN0aW9uYWxpdHkuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAiZ2V0TmFtZWRJdGVtTlMiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZWRJdGVtTlMzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3d3Lm5pc3QuZ292IjsKICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9ICJwcmVmaXg6bmV3QXR0ciI7CkBAIC0xOTMsNyArMjI2LDE1IEBACiAvLyAgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aHJvd19OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIiLCBzdWNjZXNzKTsKIC8vICAgICAgICAgIH0KIC8vICAgIH0KLSAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUxfT0ssCisgICAgICBwdXJwb3NlID0gIlZlcmlmaWVzIHBvc2l0aXZlIGZuY3Rpb25hbGl0eS4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJzZXROYW1lZEl0ZW1OUyIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtvcmcudzNjLmRvbS5Ob2RlLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROYW1lZEl0ZW1OUzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cudXNhLmNvbSI7CiAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAiZG1zdGM6ZG9tZXN0aWMiOwpkaWZmIC0tZ2l0IGEveG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vU3lzdGVtSWQuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1N5c3RlbUlkLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20geG1sL3NyYy90ZXN0L2phdmEvb3JnL3czYy9kb20vU3lzdGVtSWQuamF2YQpyZW5hbWUgdG8geG1sL3NyYy90ZXN0L2phdmEvdGVzdHMvb3JnL3czYy9kb20vU3lzdGVtSWQuamF2YQppbmRleCA0MjUwNTgxLi5lM2JkZTQyIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS9vcmcvdzNjL2RvbS9TeXN0ZW1JZC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL29yZy93M2MvZG9tL1N5c3RlbUlkLmphdmEKQEAgLTE5LDEzICsxOSwxOCBAQAogCiAgKi8KIAotcGFja2FnZSBvcmcudzNjLmRvbTsKK3BhY2thZ2UgdGVzdHMub3JnLnczYy5kb207CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0SW5mbzsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldDsKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3M7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KIC8qKgogICogVGhlICJnZXRTeXN0ZW1JZCgpIiBtZXRob2Qgb2YgYSBkb2N1bWVudHR5cGUgbm9kZSBjb250YWlucyB0aGUgc3lzdGVtCiAgKiBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZXJuYWwgc3Vic2V0LgpAQCAtMzgsNiArNDMsNyBAQAogICogQHNlZSA8YQogICogICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtQ29yZS1Eb2NUeXBlLXN5c3RlbUlkIj5odHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUjSUQtQ29yZS1Eb2NUeXBlLXN5c3RlbUlkPC9hPgogICovCitAVGVzdFRhcmdldENsYXNzKERvY3VtZW50VHlwZS5jbGFzcykgCiBwdWJsaWMgZmluYWwgY2xhc3MgU3lzdGVtSWQgZXh0ZW5kcyBET01UZXN0Q2FzZSB7CiAKICAgICBET01Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3Rvcnk7CkBAIC02Nyw2ICs3MywxNSBAQAogICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCiAgICAgICogICAgICAgICAgICAgQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGVzdCB0byBmYWlsCiAgICAgICovCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gImdldFN5c3RlbUlkIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFN5c3RlbUlkKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERvY3VtZW50IGRvYzsKICAgICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGU7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy94bWwvQWxsVGVzdHMuamF2YSBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3htbC9BbGxUZXN0cy5qYXZhCmluZGV4IGYxODUxMGEuLjE0NmViNTcgMTAwNjQ0Ci0tLSBhL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3htbC9BbGxUZXN0cy5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3htbC9BbGxUZXN0cy5qYXZhCkBAIC0yNyw5ICsyNyw5IEBACiAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVQYXJzZXJUZXN0LmNsYXNzKTsKICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZUJ1aWxkZXJUZXN0LmNsYXNzKTsKICAgICAgICAgCi0gICAgICAgIHN1aXRlLmFkZFRlc3Qob3JnLnczYy5kb20uQWxsVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMub3JnLnczYy5kb20uQWxsVGVzdHMuc3VpdGUoKSk7CiAgICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdHMuYXBpLmphdmF4LnhtbC5wYXJzZXJzLkFsbFRlc3RzLnN1aXRlKCkpOwotCQorICAgIAogICAgICAgIHJldHVybiBzdWl0ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3htbC9TaW1wbGVCdWlsZGVyVGVzdC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMveG1sL1NpbXBsZUJ1aWxkZXJUZXN0LmphdmEKaW5kZXggNDEyYzlhNy4uYzI1Njk4YyAxMDA2NDQKLS0tIGEveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMveG1sL1NpbXBsZUJ1aWxkZXJUZXN0LmphdmEKKysrIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMveG1sL1NpbXBsZUJ1aWxkZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMueG1sOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiBpbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKQEAgLTMwLDYgKzM1LDcgQEAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKIAorQFRlc3RUYXJnZXRDbGFzcyhEb2N1bWVudEJ1aWxkZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFNpbXBsZUJ1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlcjsKQEAgLTU3LDcgKzYzLDE1IEBACiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJSZWdyZXNzaW9uIHRlc3QuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdvb2RGaWxlMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAogICAgICAgICAgICAgICAgICIvU2ltcGxlQnVpbGRlclRlc3QueG1sIikpOwpAQCAtMTEwLDcgKzEyNCwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuIiwgcHJvaW5zdCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIEZyYWdpbGUhICBIYW5kbGUgbWUgd2l0aCBjYXJlISAiLCBjb21tZW50KTsKICAgICB9Ci0gICAgCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuVE9ETywKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgYW55dGhpbmcuIiwKKyAgICAgIHRhcmdldHMgPSB7CisgICAgICAgIEBUZXN0VGFyZ2V0KAorICAgICAgICAgIG1ldGhvZE5hbWUgPSAicGFyc2UiLAorICAgICAgICAgIG1ldGhvZEFyZ3MgPSB7amF2YS5pby5JbnB1dFN0cmVhbS5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdEdvb2RGaWxlMigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAogICAgICAgICAgICAgICAgICIvc3RhZmZOUy54bWwiKSk7CmRpZmYgLS1naXQgYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy94bWwvU2ltcGxlUGFyc2VyVGVzdC5qYXZhIGIveG1sL3NyYy90ZXN0L2phdmEvdGVzdHMveG1sL1NpbXBsZVBhcnNlclRlc3QuamF2YQppbmRleCA1OTMyYzk1Li4wZDYzMjYyIDEwMDY0NAotLS0gYS94bWwvc3JjL3Rlc3QvamF2YS90ZXN0cy94bWwvU2ltcGxlUGFyc2VyVGVzdC5qYXZhCisrKyBiL3htbC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3htbC9TaW1wbGVQYXJzZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgdGVzdHMueG1sOwogCitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdEluZm87CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQ7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldENsYXNzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKQEAgLTM0LDYgKzM5LDcgQEAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKIAorQFRlc3RUYXJnZXRDbGFzcyhTQVhQYXJzZXIuY2xhc3MpIAogcHVibGljIGNsYXNzIFNpbXBsZVBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyIHsKIAogICAgIHByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKQEAgLTE2MCw3ICsxNjYsMTYgQEAKIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CiAgICAgfQotICAgIAorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlci5jbGFzc30KKyAgICAgICAgKQorICAgIH0pCiAgICAgcHVibGljIHZvaWQgdGVzdFdvcmtpbmdGaWxlMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7CkBAIC0xODUsNyArMjAwLDE1IEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd3d3LmZvb2Jhci5vcmciLCBuYW1lc3BhY2VzMS5nZXQoInN0dWZmIikpOwogICAgIH0KLQorICAgIEBUZXN0SW5mbygKKyAgICAgIGxldmVsID0gVGVzdExldmVsLlBBUlRJQUwsCisgICAgICBwdXJwb3NlID0gIiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JraW5nRmlsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogCkBAIC0yMTQsNyArMjM3LDE1IEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5hbWVzcGFjZXMyLnNpemUoKSk7CiAgICAgfQotCisgICAgQFRlc3RJbmZvKAorICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuUEFSVElBTCwKKyAgICAgIHB1cnBvc2UgPSAiRG9lc24ndCB2ZXJpZnkgZXhjZXB0aW9ucy4iLAorICAgICAgdGFyZ2V0cyA9IHsKKyAgICAgICAgQFRlc3RUYXJnZXQoCisgICAgICAgICAgbWV0aG9kTmFtZSA9ICJwYXJzZSIsCisgICAgICAgICAgbWV0aG9kQXJncyA9IHtqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzLCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyLmNsYXNzfQorICAgICAgICApCisgICAgfSkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5UmVzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgRGVmYXVsdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBEZWZhdWx0SGFuZGxlcigpIHsKQEAgLTI0NCw3ICsyNzUsMTUgQEAKICAgICAgICAgICAgICAgICAicmVzb2x2ZWQgZXh0ZXJuYWwgZW50aXR5IG11c3QgYmUgaW4gcGFyc2VyIGNoYXJhY3RlciBzdHJlYW0iLAogICAgICAgICAgICAgICAgIHRleHQudG9TdHJpbmcoKS5jb250YWlucygidGVzdCIpKTsKICAgICB9Ci0KKyAgICBAVGVzdEluZm8oCisgICAgICBsZXZlbCA9IFRlc3RMZXZlbC5QQVJUSUFMLAorICAgICAgcHVycG9zZSA9ICJEb2Vzbid0IHZlcmlmeSBleGNlcHRpb25zLiIsCisgICAgICB0YXJnZXRzID0geworICAgICAgICBAVGVzdFRhcmdldCgKKyAgICAgICAgICBtZXRob2ROYW1lID0gInBhcnNlIiwKKyAgICAgICAgICBtZXRob2RBcmdzID0ge2phdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MsIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIuY2xhc3N9CisgICAgICAgICkKKyAgICB9KQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgIHBhcnNlci5wYXJzZShnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi9zdGFmZk5TLnhtbCIpLCAKICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7Cg==